ZGlmZiAtLWdpdCBhLy5nbiBiLy5nbgppbmRleCBjZTUyNTI5Li40MTE4N2ZkIDEwMDY0NAotLS0gYS8uZ24KKysrIGIvLmduCkBAIC04LDggKzgsMTAgQEAKIGRlZmF1bHRfYXJncyA9IHsKICAgdjhfZXh0cmFfbGlicmFyeV9maWxlcyA9IFtdCiAgIHY4X2V4cGVyaW1lbnRhbF9leHRyYV9saWJyYXJ5X2ZpbGVzID0gW10KLSAgdjhfZW5hYmxlX2luc3BlY3RvciA9IGZhbHNlCiAKICAgIyBUdXJucyBvbiBjb21waWxlciBvcHRpbWl6YXRpb25zIGluIFY4IGluIERlYnVnIGJ1aWxkLgogICB2OF9vcHRpbWl6ZWRfZGVidWcgPSB0cnVlCisKKyAgIyBQREZpdW0gZG9lcyBub3Qgd2FudCB0byBzd2l0Y2ggdG8gQysrMTQgeWV0LgorICB1c2VfY3h4MTEgPSB0cnVlCiB9CmRpZmYgLS1naXQgYS9BVVRIT1JTIGIvQVVUSE9SUwppbmRleCA2YzJhMjk1Li5lZTZmYzkzIDEwMDY0NAotLS0gYS9BVVRIT1JTCisrKyBiL0FVVEhPUlMKQEAgLTEzLDggKzEzLDEwIEBACiBCcmV0dCBXaWxzb24gPGJyZXR0d0BjaHJvbWl1bS5vcmc+CiBCcnVjZSBEYXdzb24gPGJydWNlZGF3c29uQGNocm9taXVtLm9yZz4KIENoZXJ5IENoZXJpYW4gPGNoZXJ5Y2hlcmlhbkBnbWFpbC5jb20+CitDbGF1ZGlvIERlU291emEgPGNsYXVkaW9tZHNqckBnbWFpbC5jb20+CiBDaHJpcyBQYWxtZXIgPHBhbG1lckBjaHJvbWl1bS5vcmc+CiBEYW4gU2luY2xhaXIgPGRzaW5jbGFpckBjaHJvbWl1bS5vcmc+CitGZWxpeCBLYXVzZWxtYW5uIDxsaWNvcm5AZ21haWwuY29tPgogRmlubnVyIFRob3Jhcmluc3NvbiA8ZmlubnVyQGNocm9taXVtLm9yZz4KIEdpV2FuIEdvIDxnb2dpbEBzdGVhbGllbi5jb20+CiBKaWFuZyBKaWFuZyA8amlhbmdqQG9wZXJhLmNvbT4KQEAgLTI1LDYgKzI3LDcgQEAKIEtvc3R5YSBTZXJlYnJ5YW55IDxrY2NAY2hyb21pdW0ub3JnPgogTGVpIFpoYW5nIDx0aGVzdGlnQGNocm9taXVtLm9yZz4KIEx1Y2FzIE5paGxlbiA8bHVrZW5AY2hyb21pdW0ub3JnPgorTHXhuq10IE5ndXnhu4VuIDxtYW5obHVhdDkzLnBocEBnbWFpbC5jb20+CiBNYXR0IEdpdWNhIDxtZ2l1Y2FAY2hyb21pdW0ub3JnPgogTWljaGFlbCBEb3BwbGVyIDxtLmRvcHBsZXJAZ21haWwuY29tPgogTWlrbG9zIFZham5hIDx2bWlrbG9zQHZtaWtsb3MuaHU+CkBAIC0zMiwxMCArMzUsMTUgQEAKIFBldGVyIEthc3RpbmcgPHBrYXN0aW5nQGNocm9taXVtLm9yZz4KIFJheW1lcyBLaG91cnkgPHJheW1lc0BjaHJvbWl1bS5vcmc+CiBSZWlkIEtsZWNrbmVyIDxybmtAY2hyb21pdW0ub3JnPgorUnlhbiBXaWxleSA8d2lsZXlyckBnbWFpbC5jb20+CiBSb2JlcnQgU2VzZWsgPHJzZXNla0BjaHJvbWl1bS5vcmc+CiBTYW0gQ2xlZ2cgPHNiY0BjaHJvbWl1bS5vcmc+CiBUaG9tYXMgU2VwZXogPHRzZXBlekBjaHJvbWl1bS5vcmc+CitXYW5nIFFpbmcgPHdhbmdxaW5nLWhmQGxvb25nc29uLmNuPgogCitDb2xsYWJvcmEgTHRkLiA8KkBjb2xsYWJvcmEuY28udWs+CiBEb2NzQ29ycCBQdHkgTHRkLiA8KkBkb2NzY29ycC5jb20+CiBGb3hpdCBTb2Z0d2FyZSBJbmMgPCpAZm94aXRzb2Z0d2FyZS5jb20+CiBHb29nbGUgSW5jLiA8KkBnb29nbGUuY29tPgorTEcgRWxlY3Ryb25pY3MsIEluYy4gPCpAbGdlLmNvbT4KK0xvb25nc29uIFRlY2hub2xvZ3kgQ29ycG9yYXRpb24gTGltaXRlZC4gPCpAbG9vbmdzb24uY24+CmRpZmYgLS1naXQgYS9BbmRyb2lkLmJwIGIvQW5kcm9pZC5icAppbmRleCA3NjZlZTM5Li5kMTFiMzZlIDEwMDY0NAotLS0gYS9BbmRyb2lkLmJwCisrKyBiL0FuZHJvaWQuYnAKQEAgLTEsNSArMSw1IEBACiBjY19kZWZhdWx0cyB7Ci0gICAgbmFtZTogInBkZml1bS1kZWZhdWx0cyIsCisgICAgbmFtZTogInBkZml1bS1jb21tb24iLAogICAgIGNmbGFnczogWwogICAgICAgICAiLU8zIiwKICAgICAgICAgIi1mc3RyaWN0LWFsaWFzaW5nIiwKQEAgLTEwLDcgKzEwLDE0IEBACiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV25vLW5vbi12aXJ0dWFsLWR0b3IiLAogICAgICAgICAiLVduby1udWxsLXBvaW50ZXItYXJpdGhtZXRpYyIsCisgICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAorICAgICAgICAiLVduby1zaWduLWNvbXBhcmUiLAorICAgICAgICAiLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycyIsCiAgICAgICAgICItV2Vycm9yIiwKKworICAgICAgICAiLURPUEpfU1RBVElDIiwKKyAgICAgICAgIi1EUE5HX1BSRUZJWCIsCisgICAgICAgICItRFBOR19VU0VfUkVBRF9NQUNST1MiLAogICAgIF0sCiAKICAgICBhcmNoOiB7CkBAIC0xOSwxNCArMjYsMzQgQEAKICAgICAgICAgfSwKICAgICB9LAogCi0gICAgaGVhZGVyX2xpYnM6IFsicGRmaXVtLWhlYWRlcnMiXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAicGRmaXVtLWhlYWRlcnMiLAorICAgICAgICAicGRmaXVtLXRoaXJkLXBhcnR5LWhlYWRlcnMiCisgICAgXSwKIH0KIAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJwZGZpdW0tY29yZSIsCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRFY4X0RFUFJFQ0FUSU9OX1dBUk5JTkdTIiwKKyAgICBdLAorCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgInBkZml1bS1jb21tb24iCisgICAgXQorfQorCisKIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogInBkZml1bS1oZWFkZXJzIiwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKIH0KIAorY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAicGRmaXVtLXRoaXJkLXBhcnR5LWhlYWRlcnMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsidGhpcmRfcGFydHkiXSwKK30KKwogYnVpbGQgPSBbCiAgICAgInBkZml1bWZkcm0uYnAiLAogICAgICJwZGZpdW1mcGRmYXBpLmJwIiwKQEAgLTM1LDExICs2MiwxMCBAQAogICAgICJwZGZpdW1meGNvZGVjLmJwIiwKICAgICAicGRmaXVtZnhjcnQuYnAiLAogICAgICJwZGZpdW1meGdlLmJwIiwKLQotICAgICJwZGZpdW1qYXZhc2NyaXB0LmJwIiwKKyAgICAicGRmaXVtcHdsLmJwIiwKICAgICAicGRmaXVtZm9ybWZpbGxlci5icCIsCi0gICAgInBkZml1bWZ4ZWRpdC5icCIsCi0gICAgInBkZml1bXBkZndpbmRvdy5icCIsCisKKyAgICAicGRmaXVtZnhqcy5icCIsCiAgICAgInBkZml1bS5icCIsCiBdCiAKZGlmZiAtLWdpdCBhL0JVSUxELmduIGIvQlVJTEQuZ24KaW5kZXggZGU3ZjIxYi4uYzc3MWI4MSAxMDA2NDQKLS0tIGEvQlVJTEQuZ24KKysrIGIvQlVJTEQuZ24KQEAgLTIsMzEgKzIsMzAgQEAKICMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCitpbXBvcnQoIi8vYnVpbGQvY29uZmlnL2ZyZWV0eXBlL2ZyZWV0eXBlLmduaSIpCitpbXBvcnQoIi8vYnVpbGQvY29uZmlnL2p1bWJvLmduaSIpCiBpbXBvcnQoIi8vdGVzdGluZy90ZXN0LmduaSIpCiBpbXBvcnQoInBkZml1bS5nbmkiKQogCitncm91cCgiZnJlZXR5cGVfY29tbW9uIikgeworICBwdWJsaWNfZGVwcyA9IFtdCisgIGlmIChwZGZfYnVuZGxlX2ZyZWV0eXBlKSB7CisgICAgcHVibGljX2RlcHMgKz0gWyAidGhpcmRfcGFydHk6ZnhfZnJlZXR5cGUiIF0KKyAgfSBlbHNlIHsKKyAgICBwdWJsaWNfZGVwcyArPSBbICIvL2J1aWxkL2NvbmZpZy9mcmVldHlwZSIgXQorICB9Cit9CisKIGNvbmZpZygicGRmaXVtX2NvbW1vbl9jb25maWciKSB7CiAgIGNmbGFncyA9IFtdCiAgIGxkZmxhZ3MgPSBbXQotICBpbmNsdWRlX2RpcnMgPSBbCi0gICAgIi4iLAotICAgICJ0aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlIiwKLSAgICAidGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZSIsCi0gIF0KKyAgaW5jbHVkZV9kaXJzID0gWyAiLiIgXQogICBkZWZpbmVzID0gWwogICAgICJPUEpfU1RBVElDIiwKICAgICAiUE5HX1BSRUZJWCIsCiAgICAgIlBOR19VU0VfUkVBRF9NQUNST1MiLAogICBdCiAKLSAgaWYgKHBkZl91c2Vfc2tpYSkgewotICAgIGRlZmluZXMgKz0gWyAiX1NLSUFfU1VQUE9SVF8iIF0KLSAgfQotCi0gIGlmIChwZGZfdXNlX3NraWFfcGF0aHMpIHsKLSAgICBkZWZpbmVzICs9IFsgIl9TS0lBX1NVUFBPUlRfUEFUSFNfIiBdCi0gIH0KLQogICBpZiAocGRmX2VuYWJsZV92OCkgewogICAgIGRlZmluZXMgKz0gWyAiUERGX0VOQUJMRV9WOCIgXQogICB9CkBAIC00Nyw2ICs0NiwxNCBAQAogICAgIH0KICAgfQogCisgIGlmIChwZGZfdXNlX3NraWEpIHsKKyAgICBkZWZpbmVzICs9IFsgIl9TS0lBX1NVUFBPUlRfIiBdCisgIH0KKworICBpZiAocGRmX3VzZV9za2lhX3BhdGhzKSB7CisgICAgZGVmaW5lcyArPSBbICJfU0tJQV9TVVBQT1JUX1BBVEhTXyIgXQorICB9CisKICAgaWYgKHBkZl91c2Vfd2luMzJfZ2RpKSB7CiAgICAgZGVmaW5lcyArPSBbICJQREZJVU1fUFJJTlRfVEVYVF9XSVRIX0dESSIgXQogICB9CkBAIC01OSw2ICs2NiwxMSBAQAogICAgIF0KICAgICBsZGZsYWdzICs9IFsgIi0tY292ZXJhZ2UiIF0KICAgfQorCisgIGlmIChpc193aW4pIHsKKyAgICAjIEFzc3VtZSBVVEYtOCBieSBkZWZhdWx0IHRvIGF2b2lkIGNvZGUgcGFnZSBkZXBlbmRlbmNpZXMuCisgICAgY2ZsYWdzICs9IFsgIi91dGYtOCIgXQorICB9CiB9CiAKIGNvbmZpZygicGRmaXVtX2NvcmVfY29uZmlnIikgewpAQCAtNzQsNyArODYsMTEgQEAKICAgICB9CiAgIH0KICAgaWYgKGlzX3dpbikgewotICAgIGNmbGFncyArPSBbICIvd2Q0MjY3IiBdCisgICAgY2ZsYWdzICs9IFsKKyAgICAgICIvd2Q0MjY3IiwKKyAgICAgICIvd2Q0MzI0IiwKKyAgICAgICIvd2Q0NTc3IiwKKyAgICBdCiAgIH0KIH0KIApAQCAtODUsNyArMTAxLDcgQEAKICAgfQogfQogCi1zdGF0aWNfbGlicmFyeSgicGRmaXVtIikgeworanVtYm9fc3RhdGljX2xpYnJhcnkoInBkZml1bSIpIHsKICAgc291cmNlcyA9IFsKICAgICAiZnBkZnNkay9jYmFfYW5ub3RpdGVyYXRvci5jcHAiLAogICAgICJmcGRmc2RrL2NiYV9hbm5vdGl0ZXJhdG9yLmgiLApAQCAtMTIxLDYgKzEzNyw5IEBACiAgICAgImZwZGZzZGsvZnBkZl9zdHJ1Y3R0cmVlLmNwcCIsCiAgICAgImZwZGZzZGsvZnBkZl9zeXNmb250aW5mby5jcHAiLAogICAgICJmcGRmc2RrL2ZwZGZfdHJhbnNmb3JtcGFnZS5jcHAiLAorICAgICJmcGRmc2RrL2ZwZGZhbm5vdC5jcHAiLAorICAgICJmcGRmc2RrL2ZwZGZhdHRhY2htZW50LmNwcCIsCisgICAgImZwZGZzZGsvZnBkZmNhdGFsb2cuY3BwIiwKICAgICAiZnBkZnNkay9mcGRmZG9jLmNwcCIsCiAgICAgImZwZGZzZGsvZnBkZmVkaXRpbWcuY3BwIiwKICAgICAiZnBkZnNkay9mcGRmZWRpdHBhZ2UuY3BwIiwKQEAgLTEzMywxMCArMTUyLDE2IEBACiAgICAgImZwZGZzZGsvZnBkZnZpZXcuY3BwIiwKICAgICAiZnBkZnNkay9mc2RrX2FjdGlvbmhhbmRsZXIuY3BwIiwKICAgICAiZnBkZnNkay9mc2RrX2FjdGlvbmhhbmRsZXIuaCIsCisgICAgImZwZGZzZGsvZnNka19maWxld3JpdGVhZGFwdGVyLmNwcCIsCisgICAgImZwZGZzZGsvZnNka19maWxld3JpdGVhZGFwdGVyLmgiLAogICAgICJmcGRmc2RrL2ZzZGtfcGF1c2VhZGFwdGVyLmNwcCIsCiAgICAgImZwZGZzZGsvZnNka19wYXVzZWFkYXB0ZXIuaCIsCiAgICAgImZwZGZzZGsvcGRmc2RrX2ZpZWxkYWN0aW9uLmNwcCIsCiAgICAgImZwZGZzZGsvcGRmc2RrX2ZpZWxkYWN0aW9uLmgiLAorICAgICJwdWJsaWMvY3BwL2ZwZGZfZGVsZXRlcnMuaCIsCisgICAgInB1YmxpYy9mcGRmX2Fubm90LmgiLAorICAgICJwdWJsaWMvZnBkZl9hdHRhY2htZW50LmgiLAorICAgICJwdWJsaWMvZnBkZl9jYXRhbG9nLmgiLAogICAgICJwdWJsaWMvZnBkZl9kYXRhYXZhaWwuaCIsCiAgICAgInB1YmxpYy9mcGRmX2RvYy5oIiwKICAgICAicHVibGljL2ZwZGZfZWRpdC5oIiwKQEAgLTE2NiwxMCArMTkxLDkgQEAKICAgICAiOmZwZGZ0ZXh0IiwKICAgICAiOmZ4Y29kZWMiLAogICAgICI6ZnhjcnQiLAotICAgICI6ZnhlZGl0IiwKICAgICAiOmZ4Z2UiLAotICAgICI6amF2YXNjcmlwdCIsCi0gICAgIjpwZGZ3aW5kb3ciLAorICAgICI6ZnhqcyIsCisgICAgIjpwd2wiLAogICAgICJ0aGlyZF9wYXJ0eTpiaWdpbnQiLAogICAgICJ0aGlyZF9wYXJ0eTpwZGZpdW1fYmFzZSIsCiAgIF0KQEAgLTIwMywxNCArMjI3LDEyIEBACiAgICAgXQogICB9CiAKLSAgaWYgKHBkZml1bV9idW5kbGVfZnJlZXR5cGUpIHsKLSAgICBkZXBzICs9IFsgInRoaXJkX3BhcnR5OmZ4X2ZyZWV0eXBlIiBdCi0gIH0gZWxzZSB7Ci0gICAgbGlicyArPSBbICJmcmVldHlwZSIgXQorICBpZiAocGRmX2lzX2NvbXBsZXRlX2xpYikgeworICAgIGNvbXBsZXRlX3N0YXRpY19saWIgPSB0cnVlCiAgIH0KIH0KIAotc3RhdGljX2xpYnJhcnkoInRlc3Rfc3VwcG9ydCIpIHsKK2p1bWJvX3N0YXRpY19saWJyYXJ5KCJ0ZXN0X3N1cHBvcnQiKSB7CiAgIHRlc3Rvbmx5ID0gdHJ1ZQogICBzb3VyY2VzID0gWwogICAgICJ0ZXN0aW5nL2Z4X3N0cmluZ190ZXN0aGVscGVycy5jcHAiLApAQCAtMjQzLDYgKzI2NSwxOSBAQAogICBjb25maWdzICs9IFsgIjpwZGZpdW1fY29yZV9jb25maWciIF0KIH0KIAoranVtYm9fc3RhdGljX2xpYnJhcnkoImltYWdlX2RpZmYiKSB7CisgIHRlc3Rvbmx5ID0gdHJ1ZQorICBzb3VyY2VzID0gWworICAgICJ0ZXN0aW5nL2ltYWdlX2RpZmYvaW1hZ2VfZGlmZl9wbmcuY3BwIiwKKyAgICAidGVzdGluZy9pbWFnZV9kaWZmL2ltYWdlX2RpZmZfcG5nLmgiLAorICBdCisgIGNvbmZpZ3MgKz0gWyAiOnBkZml1bV9jb3JlX2NvbmZpZyIgXQorICBkZXBzID0gW10KKyAgaWYgKCFwZGZfZW5hYmxlX3hmYSkgeworICAgIGRlcHMgKz0gWyAidGhpcmRfcGFydHk6cG5nIiBdCisgIH0KK30KKwogIyBUYXJnZXRzIGJlbG93IHRoaXMgYXJlIG9ubHkgdmlzaWJsZSB3aXRoaW4gdGhpcyBmaWxlIChhbmQgdG8gdGhlCiAjIHRvcC1sZXZlbCBnbl92aXNpYmlsaXR5IHRhcmdldCB1c2VkIHRvIGhlbHAgZ25fYWxsIGJ1aWxkIGV2ZXJ5dGhpbmcpLgogdmlzaWJpbGl0eSA9IFsKQEAgLTI1MCw3ICsyODUsNyBAQAogICAiLy86Z25fdmlzaWJpbGl0eSIsCiBdCiAKLXN0YXRpY19saWJyYXJ5KCJmZHJtIikgeworanVtYm9fc3RhdGljX2xpYnJhcnkoImZkcm0iKSB7CiAgIHNvdXJjZXMgPSBbCiAgICAgImNvcmUvZmRybS9jcnlwdG8vZnhfY3J5cHQuY3BwIiwKICAgICAiY29yZS9mZHJtL2NyeXB0by9meF9jcnlwdC5oIiwKQEAgLTI2MywxMiArMjk4LDEwIEBACiAgIF0KIH0KIAotc3RhdGljX2xpYnJhcnkoImZwZGZkb2MiKSB7CitqdW1ib19zdGF0aWNfbGlicmFyeSgiZnBkZmRvYyIpIHsKICAgc291cmNlcyA9IFsKICAgICAiY29yZS9mcGRmZG9jL2NsaW5lLmNwcCIsCiAgICAgImNvcmUvZnBkZmRvYy9jbGluZS5oIiwKLSAgICAiY29yZS9mcGRmZG9jL2NsaW5lcy5jcHAiLAotICAgICJjb3JlL2ZwZGZkb2MvY2xpbmVzLmgiLAogICAgICJjb3JlL2ZwZGZkb2MvY3BkZl9hYWN0aW9uLmNwcCIsCiAgICAgImNvcmUvZnBkZmRvYy9jcGRmX2FhY3Rpb24uaCIsCiAgICAgImNvcmUvZnBkZmRvYy9jcGRmX2FjdGlvbi5jcHAiLApAQCAtMzE1LDE0ICszNDgsMTQgQEAKICAgICAiY29yZS9mcGRmZG9jL2NwZGZfb2Njb250ZXh0LmgiLAogICAgICJjb3JlL2ZwZGZkb2MvY3BkZl9wYWdlbGFiZWwuY3BwIiwKICAgICAiY29yZS9mcGRmZG9jL2NwZGZfcGFnZWxhYmVsLmgiLAorICAgICJjb3JlL2ZwZGZkb2MvY3BkZl9zdHJ1Y3RlbGVtZW50LmNwcCIsCisgICAgImNvcmUvZnBkZmRvYy9jcGRmX3N0cnVjdGVsZW1lbnQuaCIsCisgICAgImNvcmUvZnBkZmRvYy9jcGRmX3N0cnVjdHRyZWUuY3BwIiwKKyAgICAiY29yZS9mcGRmZG9jL2NwZGZfc3RydWN0dHJlZS5oIiwKICAgICAiY29yZS9mcGRmZG9jL2NwZGZfdmFyaWFibGV0ZXh0LmNwcCIsCiAgICAgImNvcmUvZnBkZmRvYy9jcGRmX3ZhcmlhYmxldGV4dC5oIiwKICAgICAiY29yZS9mcGRmZG9jL2NwZGZfdmlld2VycHJlZmVyZW5jZXMuY3BwIiwKICAgICAiY29yZS9mcGRmZG9jL2NwZGZfdmlld2VycHJlZmVyZW5jZXMuaCIsCi0gICAgImNvcmUvZnBkZmRvYy9jcHZ0X2FycmF5dGVtcGxhdGUuaCIsCi0gICAgImNvcmUvZnBkZmRvYy9jcHZ0X2NvbG9yLmNwcCIsCi0gICAgImNvcmUvZnBkZmRvYy9jcHZ0X2NvbG9yLmgiLAotICAgICJjb3JlL2ZwZGZkb2MvY3B2dF9kYXNoLmgiLAogICAgICJjb3JlL2ZwZGZkb2MvY3B2dF9mbG9hdHJlY3QuaCIsCiAgICAgImNvcmUvZnBkZmRvYy9jcHZ0X2ZvbnRtYXAuY3BwIiwKICAgICAiY29yZS9mcGRmZG9jL2NwdnRfZm9udG1hcC5oIiwKQEAgLTMzMCwyNSArMzYzLDE3IEBACiAgICAgImNvcmUvZnBkZmRvYy9jcHZ0X2dlbmVyYXRlYXAuaCIsCiAgICAgImNvcmUvZnBkZmRvYy9jcHZ0X2xpbmUuaCIsCiAgICAgImNvcmUvZnBkZmRvYy9jcHZ0X2xpbmVpbmZvLmgiLAotICAgICJjb3JlL2ZwZGZkb2MvY3B2dF9zZWNwcm9wcy5oIiwKLSAgICAiY29yZS9mcGRmZG9jL2NwdnRfc2VjdGlvbi5oIiwKLSAgICAiY29yZS9mcGRmZG9jL2NwdnRfc2VjdGlvbmluZm8uY3BwIiwKLSAgICAiY29yZS9mcGRmZG9jL2NwdnRfc2VjdGlvbmluZm8uaCIsCiAgICAgImNvcmUvZnBkZmRvYy9jcHZ0X3dvcmQuaCIsCiAgICAgImNvcmUvZnBkZmRvYy9jcHZ0X3dvcmRpbmZvLmNwcCIsCiAgICAgImNvcmUvZnBkZmRvYy9jcHZ0X3dvcmRpbmZvLmgiLAogICAgICJjb3JlL2ZwZGZkb2MvY3B2dF93b3JkcGxhY2UuaCIsCi0gICAgImNvcmUvZnBkZmRvYy9jcHZ0X3dvcmRwcm9wcy5oIiwKICAgICAiY29yZS9mcGRmZG9jL2NwdnRfd29yZHJhbmdlLmgiLAogICAgICJjb3JlL2ZwZGZkb2MvY3NlY3Rpb24uY3BwIiwKICAgICAiY29yZS9mcGRmZG9jL2NzZWN0aW9uLmgiLAogICAgICJjb3JlL2ZwZGZkb2MvY3R5cGVzZXQuY3BwIiwKICAgICAiY29yZS9mcGRmZG9jL2N0eXBlc2V0LmgiLAotICAgICJjb3JlL2ZwZGZkb2MvZG9jX3RhZ2dlZC5jcHAiLAotICAgICJjb3JlL2ZwZGZkb2MvZnBkZl90YWdnZWQuaCIsCiAgICAgImNvcmUvZnBkZmRvYy9pcGRmX2Zvcm1ub3RpZnkuaCIsCiAgICAgImNvcmUvZnBkZmRvYy9pcHZ0X2ZvbnRtYXAuaCIsCi0gICAgImNvcmUvZnBkZmRvYy90YWdnZWRfaW50LmgiLAogICBdCiAgIGNvbmZpZ3MgKz0gWyAiOnBkZml1bV9jb3JlX2NvbmZpZyIgXQogICBkZXBzID0gWwpAQCAtMzU2LDcgKzM4MSw3IEBACiAgIF0KIH0KIAotc3RhdGljX2xpYnJhcnkoImZwZGZhcGkiKSB7CitqdW1ib19zdGF0aWNfbGlicmFyeSgiZnBkZmFwaSIpIHsKICAgc291cmNlcyA9IFsKICAgICAiY29yZS9mcGRmYXBpL2NtYXBzL0NOUzEvQWRvYmUtQ05TMS1VQ1MyXzUuY3BwIiwKICAgICAiY29yZS9mcGRmYXBpL2NtYXBzL0NOUzEvQjVwYy1IXzAuY3BwIiwKQEAgLTQyNSwxOSArNDUwLDM4IEBACiAgICAgImNvcmUvZnBkZmFwaS9jcGRmX21vZHVsZW1nci5oIiwKICAgICAiY29yZS9mcGRmYXBpL2NwZGZfcGFnZXJlbmRlcmNvbnRleHQuY3BwIiwKICAgICAiY29yZS9mcGRmYXBpL2NwZGZfcGFnZXJlbmRlcmNvbnRleHQuaCIsCisgICAgImNvcmUvZnBkZmFwaS9lZGl0L2NwZGZfY3JlYXRvci5jcHAiLAogICAgICJjb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX2NyZWF0b3IuaCIsCisgICAgImNvcmUvZnBkZmFwaS9lZGl0L2NwZGZfZW5jcnlwdG9yLmNwcCIsCisgICAgImNvcmUvZnBkZmFwaS9lZGl0L2NwZGZfZW5jcnlwdG9yLmgiLAorICAgICJjb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX2ZsYXRlZW5jb2Rlci5jcHAiLAorICAgICJjb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX2ZsYXRlZW5jb2Rlci5oIiwKICAgICAiY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9wYWdlY29udGVudGdlbmVyYXRvci5jcHAiLAogICAgICJjb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX3BhZ2Vjb250ZW50Z2VuZXJhdG9yLmgiLAotICAgICJjb3JlL2ZwZGZhcGkvZWRpdC9lZGl0aW50LmgiLAotICAgICJjb3JlL2ZwZGZhcGkvZWRpdC9mcGRmX2VkaXRfY3JlYXRlLmNwcCIsCisgICAgImNvcmUvZnBkZmFwaS9mb250L2NmeF9jdHRnc3VidGFibGUuY3BwIiwKKyAgICAiY29yZS9mcGRmYXBpL2ZvbnQvY2Z4X2N0dGdzdWJ0YWJsZS5oIiwKKyAgICAiY29yZS9mcGRmYXBpL2ZvbnQvY2Z4X3N0b2NrZm9udGFycmF5LmNwcCIsCisgICAgImNvcmUvZnBkZmFwaS9mb250L2NmeF9zdG9ja2ZvbnRhcnJheS5oIiwKKyAgICAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jaWQydW5pY29kZW1hcC5jcHAiLAorICAgICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NpZDJ1bmljb2RlbWFwLmgiLAogICAgICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NpZGZvbnQuY3BwIiwKICAgICAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jaWRmb250LmgiLAorICAgICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NtYXAuY3BwIiwKKyAgICAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jbWFwLmgiLAorICAgICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NtYXBtYW5hZ2VyLmNwcCIsCisgICAgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfY21hcG1hbmFnZXIuaCIsCisgICAgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfY21hcHBhcnNlci5jcHAiLAorICAgICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NtYXBwYXJzZXIuaCIsCiAgICAgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udC5jcHAiLAogICAgICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2ZvbnQuaCIsCiAgICAgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udGVuY29kaW5nLmNwcCIsCiAgICAgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udGVuY29kaW5nLmgiLAorICAgICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2ZvbnRnbG9iYWxzLmNwcCIsCisgICAgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udGdsb2JhbHMuaCIsCiAgICAgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfc2ltcGxlZm9udC5jcHAiLAogICAgICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3NpbXBsZWZvbnQuaCIsCisgICAgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfdG91bmljb2RlbWFwLmNwcCIsCisgICAgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfdG91bmljb2RlbWFwLmgiLAogICAgICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3RydWV0eXBlZm9udC5jcHAiLAogICAgICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3RydWV0eXBlZm9udC5oIiwKICAgICAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl90eXBlMWZvbnQuY3BwIiwKQEAgLTQ0NiwxMSArNDkwLDYgQEAKICAgICAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl90eXBlM2NoYXIuaCIsCiAgICAgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfdHlwZTNmb250LmNwcCIsCiAgICAgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfdHlwZTNmb250LmgiLAotICAgICJjb3JlL2ZwZGZhcGkvZm9udC9mb250X2ludC5oIiwKLSAgICAiY29yZS9mcGRmYXBpL2ZvbnQvZnBkZl9mb250LmNwcCIsCi0gICAgImNvcmUvZnBkZmFwaS9mb250L2ZwZGZfZm9udF9jaWQuY3BwIiwKLSAgICAiY29yZS9mcGRmYXBpL2ZvbnQvdHRnc3VidGFibGUuY3BwIiwKLSAgICAiY29yZS9mcGRmYXBpL2ZvbnQvdHRnc3VidGFibGUuaCIsCiAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfYWxsc3RhdGVzLmNwcCIsCiAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfYWxsc3RhdGVzLmgiLAogICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NsaXBwYXRoLmNwcCIsCkBAIC00NjgsMTYgKzUwNywyNCBAQAogICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbnRlbnRwYXJzZXIuY3BwIiwKICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb250ZW50cGFyc2VyLmgiLAogICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvdW50ZWRvYmplY3QuaCIsCisgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZGV2aWNlY3MuY3BwIiwKKyAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9kZXZpY2Vjcy5oIiwKICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9kb2NwYWdlZGF0YS5jcHAiLAogICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2RvY3BhZ2VkYXRhLmgiLAorICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2V4cGludGZ1bmMuY3BwIiwKKyAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9leHBpbnRmdW5jLmgiLAogICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2Zvcm0uY3BwIiwKICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9mb3JtLmgiLAogICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2Zvcm1vYmplY3QuY3BwIiwKICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9mb3Jtb2JqZWN0LmgiLAorICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2Z1bmN0aW9uLmNwcCIsCisgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZnVuY3Rpb24uaCIsCiAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZ2VuZXJhbHN0YXRlLmNwcCIsCiAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZ2VuZXJhbHN0YXRlLmgiLAogICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2dyYXBoaWNzdGF0ZXMuY3BwIiwKICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9ncmFwaGljc3RhdGVzLmgiLAorICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2ljY3Byb2ZpbGUuY3BwIiwKKyAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9pY2Nwcm9maWxlLmgiLAogICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2ltYWdlLmNwcCIsCiAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfaW1hZ2UuaCIsCiAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfaW1hZ2VvYmplY3QuY3BwIiwKQEAgLTUwMCwxMCArNTQ3LDIwIEBACiAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0aG9iamVjdC5oIiwKICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYXR0ZXJuLmNwcCIsCiAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0dGVybi5oIiwKKyAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYXR0ZXJuY3MuY3BwIiwKKyAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYXR0ZXJuY3MuaCIsCisgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcHNlbmdpbmUuY3BwIiwKKyAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wc2VuZ2luZS5oIiwKKyAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wc2Z1bmMuY3BwIiwKKyAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wc2Z1bmMuaCIsCisgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc2FtcGxlZGZ1bmMuY3BwIiwKKyAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zYW1wbGVkZnVuYy5oIiwKICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zaGFkaW5nb2JqZWN0LmNwcCIsCiAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc2hhZGluZ29iamVjdC5oIiwKICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zaGFkaW5ncGF0dGVybi5jcHAiLAogICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3NoYWRpbmdwYXR0ZXJuLmgiLAorICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3N0aXRjaGZ1bmMuY3BwIiwKKyAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zdGl0Y2hmdW5jLmgiLAogICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3N0cmVhbWNvbnRlbnRwYXJzZXIuY3BwIiwKICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zdHJlYW1jb250ZW50cGFyc2VyLmgiLAogICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3N0cmVhbXBhcnNlci5jcHAiLApAQCAtNTE0LDE1ICs1NzEsMTQgQEAKICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl90ZXh0c3RhdGUuaCIsCiAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfdGlsaW5ncGF0dGVybi5jcHAiLAogICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3RpbGluZ3BhdHRlcm4uaCIsCi0gICAgImNvcmUvZnBkZmFwaS9wYWdlL2ZwZGZfcGFnZV9jb2xvcnMuY3BwIiwKLSAgICAiY29yZS9mcGRmYXBpL3BhZ2UvZnBkZl9wYWdlX2Z1bmMuY3BwIiwKLSAgICAiY29yZS9mcGRmYXBpL3BhZ2UvcGFnZWludC5oIiwKICAgICAiY29yZS9mcGRmYXBpL3BhcnNlci9jZmRmX2RvY3VtZW50LmNwcCIsCiAgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY2ZkZl9kb2N1bWVudC5oIiwKICAgICAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmNwcCIsCiAgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIiwKICAgICAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2Jvb2xlYW4uY3BwIiwKICAgICAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2Jvb2xlYW4uaCIsCisgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9jcm9zc19yZWZfYXZhaWwuY3BwIiwKKyAgICAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2Nyb3NzX3JlZl9hdmFpbC5oIiwKICAgICAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2NyeXB0b19oYW5kbGVyLmNwcCIsCiAgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9jcnlwdG9faGFuZGxlci5oIiwKICAgICAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RhdGFfYXZhaWwuY3BwIiwKQEAgLTU0NSw4ICs2MDEsMTYgQEAKICAgICAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bWJlci5oIiwKICAgICAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdC5jcHAiLAogICAgICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfb2JqZWN0LmgiLAorICAgICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfb2JqZWN0X2F2YWlsLmNwcCIsCisgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3RfYXZhaWwuaCIsCisgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3Rfd2Fsa2VyLmNwcCIsCisgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3Rfd2Fsa2VyLmgiLAorICAgICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFnZV9vYmplY3RfYXZhaWwuY3BwIiwKKyAgICAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3BhZ2Vfb2JqZWN0X2F2YWlsLmgiLAogICAgICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyLmNwcCIsCiAgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9wYXJzZXIuaCIsCisgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9yZWFkX3ZhbGlkYXRvci5jcHAiLAorICAgICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVhZF92YWxpZGF0b3IuaCIsCiAgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9yZWZlcmVuY2UuY3BwIiwKICAgICAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3JlZmVyZW5jZS5oIiwKICAgICAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3NlY3VyaXR5X2hhbmRsZXIuY3BwIiwKQEAgLTYwNSwxMCArNjY5LDExIEBACiAgIGNvbmZpZ3MgKz0gWyAiOnBkZml1bV9jb3JlX2NvbmZpZyIgXQogICBkZXBzID0gWwogICAgICI6ZnhjcnQiLAorICAgICJ0aGlyZF9wYXJ0eTpsY21zMiIsCiAgIF0KIH0KIAotc3RhdGljX2xpYnJhcnkoImZwZGZ0ZXh0IikgeworanVtYm9fc3RhdGljX2xpYnJhcnkoImZwZGZ0ZXh0IikgewogICBzb3VyY2VzID0gWwogICAgICJjb3JlL2ZwZGZ0ZXh0L2NwZGZfbGlua2V4dHJhY3QuY3BwIiwKICAgICAiY29yZS9mcGRmdGV4dC9jcGRmX2xpbmtleHRyYWN0LmgiLApAQCAtNjI1LDcgKzY5MCw3IEBACiAgIF0KIH0KIAotc3RhdGljX2xpYnJhcnkoImZ4Y29kZWMiKSB7CitqdW1ib19zdGF0aWNfbGlicmFyeSgiZnhjb2RlYyIpIHsKICAgc291cmNlcyA9IFsKICAgICAiY29yZS9meGNvZGVjL0pCaWcyX0RvY3VtZW50Q29udGV4dC5oIiwKICAgICAiY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19iYXNpY21vZHVsZS5oIiwKQEAgLTYzNSw3ICs3MDAsOSBAQAogICAgICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2piaWcybW9kdWxlLmgiLAogICAgICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2pwZWdtb2R1bGUuaCIsCiAgICAgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfanB4bW9kdWxlLmgiLAorICAgICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX3NjYW5saW5lZGVjb2Rlci5jcHAiLAogICAgICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX3NjYW5saW5lZGVjb2Rlci5oIiwKKyAgICAiY29yZS9meGNvZGVjL2NvZGVjL2NqcHhfZGVjb2Rlci5oIiwKICAgICAiY29yZS9meGNvZGVjL2NvZGVjL2NvZGVjX2ludC5oIiwKICAgICAiY29yZS9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjLmNwcCIsCiAgICAgImNvcmUvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19mYXguY3BwIiwKQEAgLTY1OSw4ICs3MjYsNiBAQAogICAgICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3JkUHJvYy5oIiwKICAgICAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0dycmRQcm9jLmNwcCIsCiAgICAgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9HcnJkUHJvYy5oIiwKLSAgICAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0dzaWRQcm9jLmNwcCIsCi0gICAgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9Hc2lkUHJvYy5oIiwKICAgICAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0h0cmRQcm9jLmNwcCIsCiAgICAgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdHJkUHJvYy5oIiwKICAgICAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5EZWNvZGVyLmNwcCIsCkBAIC02ODksMTEgKzc1NCw5IEBACiAgIGluY2x1ZGVfZGlycyA9IFtdCiAgIGRlcHMgPSBbCiAgICAgIjpmeGNydCIsCi0gICAgInRoaXJkX3BhcnR5OmZ4X2xjbXMyIiwKICAgICAidGhpcmRfcGFydHk6ZnhfbGlib3BlbmpwZWciLAotICAgICJ0aGlyZF9wYXJ0eTpmeF96bGliIiwKLQotICAgICMgVGhpcyBpcyBhIGdlbmVyaWMgSlBFRyBsaWJyYXJ5IGRlcGVuZGVuY3kuCisgICAgInRoaXJkX3BhcnR5OmxjbXMyIiwKKyAgICAidGhpcmRfcGFydHk6emxpYiIsCiAgICAgIi8vdGhpcmRfcGFydHk6anBlZyIsCiAgIF0KIApAQCAtNzA5LDE4ICs3NzIsMTggQEAKICAgICAgICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX3RpZmZtb2R1bGUuY3BwIiwKICAgICAgICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX3RpZmZtb2R1bGUuaCIsCiAgICAgICAiY29yZS9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3Byb2dyZXNzLmNwcCIsCi0gICAgICAiY29yZS9meGNvZGVjL2NvZGVjL2ljb2RlY19ibXBtb2R1bGUuaCIsCi0gICAgICAiY29yZS9meGNvZGVjL2NvZGVjL2ljb2RlY19naWZtb2R1bGUuaCIsCi0gICAgICAiY29yZS9meGNvZGVjL2NvZGVjL2ljb2RlY19wbmdtb2R1bGUuaCIsCi0gICAgICAiY29yZS9meGNvZGVjL2NvZGVjL2ljb2RlY190aWZmbW9kdWxlLmgiLAorICAgICAgImNvcmUvZnhjb2RlYy9naWYvY2Z4X2dpZi5jcHAiLAorICAgICAgImNvcmUvZnhjb2RlYy9naWYvY2Z4X2dpZi5oIiwKKyAgICAgICJjb3JlL2Z4Y29kZWMvZ2lmL2NmeF9naWZjb250ZXh0LmNwcCIsCisgICAgICAiY29yZS9meGNvZGVjL2dpZi9jZnhfZ2lmY29udGV4dC5oIiwKKyAgICAgICJjb3JlL2Z4Y29kZWMvZ2lmL2NmeF9sendkZWNvbXByZXNzb3IuY3BwIiwKKyAgICAgICJjb3JlL2Z4Y29kZWMvZ2lmL2NmeF9sendkZWNvbXByZXNzb3IuaCIsCiAgICAgICAiY29yZS9meGNvZGVjL2xibXAvZnhfYm1wLmNwcCIsCiAgICAgICAiY29yZS9meGNvZGVjL2xibXAvZnhfYm1wLmgiLAotICAgICAgImNvcmUvZnhjb2RlYy9sZ2lmL2Z4X2dpZi5jcHAiLAotICAgICAgImNvcmUvZnhjb2RlYy9sZ2lmL2Z4X2dpZi5oIiwKICAgICBdCiAgICAgZGVwcyArPSBbCi0gICAgICAidGhpcmRfcGFydHk6ZnhfbHBuZyIsCiAgICAgICAidGhpcmRfcGFydHk6ZnhfdGlmZiIsCisgICAgICAidGhpcmRfcGFydHk6cG5nIiwKICAgICBdCiAgIH0KICAgaWYgKGlzX3Bvc2l4KSB7CkBAIC03MzksNDkgKzgwMiw3NyBAQAogICB9CiB9CiAKLXN0YXRpY19saWJyYXJ5KCJmeGNydCIpIHsKK2p1bWJvX3N0YXRpY19saWJyYXJ5KCJmeGNydCIpIHsKICAgc291cmNlcyA9IFsKLSAgICAiY29yZS9meGNydC9jZnhfbWF5YmVfb3duZWQuaCIsCi0gICAgImNvcmUvZnhjcnQvY2Z4X29ic2VydmFibGUuaCIsCi0gICAgImNvcmUvZnhjcnQvY2Z4X3JldGFpbl9wdHIuaCIsCi0gICAgImNvcmUvZnhjcnQvY2Z4X3NoYXJlZF9jb3B5X29uX3dyaXRlLmgiLAotICAgICJjb3JlL2Z4Y3J0L2NmeF9zdHJpbmdfY190ZW1wbGF0ZS5oIiwKLSAgICAiY29yZS9meGNydC9jZnhfc3RyaW5nX2RhdGFfdGVtcGxhdGUuaCIsCi0gICAgImNvcmUvZnhjcnQvY2Z4X3N0cmluZ19wb29sX3RlbXBsYXRlLmgiLAotICAgICJjb3JlL2Z4Y3J0L2NmeF93ZWFrX3B0ci5oIiwKLSAgICAiY29yZS9meGNydC9leHRlbnNpb24uaCIsCi0gICAgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIsCi0gICAgImNvcmUvZnhjcnQvZnhfYmFzaWNfYXJyYXkuY3BwIiwKLSAgICAiY29yZS9meGNydC9meF9iYXNpY19ic3RyaW5nLmNwcCIsCi0gICAgImNvcmUvZnhjcnQvZnhfYmFzaWNfYnVmZmVyLmNwcCIsCi0gICAgImNvcmUvZnhjcnQvZnhfYmFzaWNfY29vcmRzLmNwcCIsCi0gICAgImNvcmUvZnhjcnQvZnhfYmFzaWNfZ2NjLmNwcCIsCi0gICAgImNvcmUvZnhjcnQvZnhfYmFzaWNfbWVtbWdyLmNwcCIsCi0gICAgImNvcmUvZnhjcnQvZnhfYmFzaWNfdXRmLmNwcCIsCi0gICAgImNvcmUvZnhjcnQvZnhfYmFzaWNfdXRpbC5jcHAiLAotICAgICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljX3dzdHJpbmcuY3BwIiwKKyAgICAiY29yZS9meGNydC9hdXRvcmVzdG9yZXIuaCIsCisgICAgImNvcmUvZnhjcnQvYnl0ZXN0cmluZy5jcHAiLAorICAgICJjb3JlL2Z4Y3J0L2J5dGVzdHJpbmcuaCIsCisgICAgImNvcmUvZnhjcnQvY2Z4X2JpbmFyeWJ1Zi5jcHAiLAorICAgICJjb3JlL2Z4Y3J0L2NmeF9iaW5hcnlidWYuaCIsCisgICAgImNvcmUvZnhjcnQvY2Z4X2JpdHN0cmVhbS5jcHAiLAorICAgICJjb3JlL2Z4Y3J0L2NmeF9iaXRzdHJlYW0uaCIsCisgICAgImNvcmUvZnhjcnQvY2Z4X2RhdGV0aW1lLmNwcCIsCisgICAgImNvcmUvZnhjcnQvY2Z4X2RhdGV0aW1lLmgiLAorICAgICJjb3JlL2Z4Y3J0L2NmeF9maWxlYWNjZXNzX3Bvc2l4LmNwcCIsCisgICAgImNvcmUvZnhjcnQvY2Z4X2ZpbGVhY2Nlc3NfcG9zaXguaCIsCisgICAgImNvcmUvZnhjcnQvY2Z4X2ZpbGVhY2Nlc3Nfd2luZG93cy5jcHAiLAorICAgICJjb3JlL2Z4Y3J0L2NmeF9maWxlYWNjZXNzX3dpbmRvd3MuaCIsCisgICAgImNvcmUvZnhjcnQvY2Z4X2ZpeGVkYnVmZ3Jvdy5oIiwKKyAgICAiY29yZS9meGNydC9jZnhfbWVtb3J5c3RyZWFtLmNwcCIsCisgICAgImNvcmUvZnhjcnQvY2Z4X21lbW9yeXN0cmVhbS5oIiwKKyAgICAiY29yZS9meGNydC9jZnhfc2Vla2FibGVtdWx0aXN0cmVhbS5jcHAiLAorICAgICJjb3JlL2Z4Y3J0L2NmeF9zZWVrYWJsZW11bHRpc3RyZWFtLmgiLAorICAgICJjb3JlL2Z4Y3J0L2NmeF91dGY4ZGVjb2Rlci5jcHAiLAorICAgICJjb3JlL2Z4Y3J0L2NmeF91dGY4ZGVjb2Rlci5oIiwKKyAgICAiY29yZS9meGNydC9jZnhfd2lkZXRleHRidWYuY3BwIiwKKyAgICAiY29yZS9meGNydC9jZnhfd2lkZXRleHRidWYuaCIsCiAgICAgImNvcmUvZnhjcnQvZnhfYmlkaS5jcHAiLAogICAgICJjb3JlL2Z4Y3J0L2Z4X2JpZGkuaCIsCisgICAgImNvcmUvZnhjcnQvZnhfY29kZXBhZ2UuaCIsCisgICAgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuY3BwIiwKICAgICAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIiwKLSAgICAiY29yZS9meGNydC9meF9leHQuaCIsCiAgICAgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmNwcCIsCisgICAgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiLAorICAgICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5jcHAiLAogICAgICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIiwKKyAgICAiY29yZS9meGNydC9meF9yYW5kb20uY3BwIiwKKyAgICAiY29yZS9meGNydC9meF9yYW5kb20uaCIsCiAgICAgImNvcmUvZnhjcnQvZnhfc2FmZV90eXBlcy5oIiwKKyAgICAiY29yZS9meGNydC9meF9zdHJlYW0uY3BwIiwKICAgICAiY29yZS9meGNydC9meF9zdHJlYW0uaCIsCisgICAgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmNwcCIsCiAgICAgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiLAorICAgICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5jcHAiLAogICAgICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIiwKLSAgICAiY29yZS9meGNydC9meF91Y2QuaCIsCiAgICAgImNvcmUvZnhjcnQvZnhfdWNkZGF0YS5jcHAiLAorICAgICJjb3JlL2Z4Y3J0L2Z4X3VjZGRhdGEuaCIsCiAgICAgImNvcmUvZnhjcnQvZnhfdW5pY29kZS5jcHAiLAotICAgICJjb3JlL2Z4Y3J0L2Z4X3htbC5oIiwKLSAgICAiY29yZS9meGNydC9meF94bWxfY29tcG9zZXIuY3BwIiwKLSAgICAiY29yZS9meGNydC9meF94bWxfcGFyc2VyLmNwcCIsCi0gICAgImNvcmUvZnhjcnQvZnhjcnRfcG9zaXguY3BwIiwKLSAgICAiY29yZS9meGNydC9meGNydF9wb3NpeC5oIiwKLSAgICAiY29yZS9meGNydC9meGNydF9zdHJlYW0uY3BwIiwKLSAgICAiY29yZS9meGNydC9meGNydF93aW5kb3dzLmNwcCIsCi0gICAgImNvcmUvZnhjcnQvZnhjcnRfd2luZG93cy5oIiwKLSAgICAiY29yZS9meGNydC94bWxfaW50LmgiLAorICAgICJjb3JlL2Z4Y3J0L2Z4X3VuaWNvZGUuaCIsCisgICAgImNvcmUvZnhjcnQvaWZ4X2ZpbGVhY2Nlc3MuaCIsCisgICAgImNvcmUvZnhjcnQvaWZ4X3BhdXNlaW5kaWNhdG9yLmgiLAorICAgICJjb3JlL2Z4Y3J0L21heWJlX293bmVkLmgiLAorICAgICJjb3JlL2Z4Y3J0L29ic2VydmFibGUuaCIsCisgICAgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIiwKKyAgICAiY29yZS9meGNydC9zaGFyZWRfY29weV9vbl93cml0ZS5oIiwKKyAgICAiY29yZS9meGNydC9zdHJpbmdfZGF0YV90ZW1wbGF0ZS5oIiwKKyAgICAiY29yZS9meGNydC9zdHJpbmdfcG9vbF90ZW1wbGF0ZS5oIiwKKyAgICAiY29yZS9meGNydC9zdHJpbmdfdmlld190ZW1wbGF0ZS5oIiwKKyAgICAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIiwKKyAgICAiY29yZS9meGNydC93ZWFrX3B0ci5oIiwKKyAgICAiY29yZS9meGNydC93aWRlc3RyaW5nLmNwcCIsCisgICAgImNvcmUvZnhjcnQvd2lkZXN0cmluZy5oIiwKKyAgICAiY29yZS9meGNydC94bWwvY3htbF9hdHRyaXRlbS5jcHAiLAorICAgICJjb3JlL2Z4Y3J0L3htbC9jeG1sX2F0dHJpdGVtLmgiLAorICAgICJjb3JlL2Z4Y3J0L3htbC9jeG1sX2NvbnRlbnQuY3BwIiwKKyAgICAiY29yZS9meGNydC94bWwvY3htbF9jb250ZW50LmgiLAorICAgICJjb3JlL2Z4Y3J0L3htbC9jeG1sX2RhdGFidWZhY2MuY3BwIiwKKyAgICAiY29yZS9meGNydC94bWwvY3htbF9kYXRhYnVmYWNjLmgiLAorICAgICJjb3JlL2Z4Y3J0L3htbC9jeG1sX2VsZW1lbnQuY3BwIiwKKyAgICAiY29yZS9meGNydC94bWwvY3htbF9lbGVtZW50LmgiLAorICAgICJjb3JlL2Z4Y3J0L3htbC9jeG1sX29iamVjdC5jcHAiLAorICAgICJjb3JlL2Z4Y3J0L3htbC9jeG1sX29iamVjdC5oIiwKKyAgICAiY29yZS9meGNydC94bWwvY3htbF9wYXJzZXIuY3BwIiwKKyAgICAiY29yZS9meGNydC94bWwvY3htbF9wYXJzZXIuaCIsCiAgIF0KICAgY29uZmlncyArPSBbICI6cGRmaXVtX2NvcmVfY29uZmlnIiBdCiAgIHZpc2liaWxpdHkgKz0gWyAidGhpcmRfcGFydHk6KiIgXQpAQCAtNzg5LDUyICs4ODAsMTcwIEBACiAgICAgInRoaXJkX3BhcnR5OnBkZml1bV9iYXNlIiwKICAgXQogICBwdWJsaWNfZGVwcyA9IFsKKyAgICAiOmZyZWV0eXBlX2NvbW1vbiIsCiAgICAgInRoaXJkX3BhcnR5OnBkZml1bV9iYXNlIiwKICAgXQogCiAgIGlmIChwZGZfZW5hYmxlX3hmYSkgewogICAgIHNvdXJjZXMgKz0gWworICAgICAgImNvcmUvZnhjcnQvY2Z4X2Jsb2NrYnVmZmVyLmNwcCIsCisgICAgICAiY29yZS9meGNydC9jZnhfYmxvY2tidWZmZXIuaCIsCisgICAgICAiY29yZS9meGNydC9jZnhfY2hhci5jcHAiLAorICAgICAgImNvcmUvZnhjcnQvY2Z4X2NoYXIuaCIsCisgICAgICAiY29yZS9meGNydC9jZnhfY2hlY2tzdW1jb250ZXh0LmNwcCIsCisgICAgICAiY29yZS9meGNydC9jZnhfY2hlY2tzdW1jb250ZXh0LmgiLAorICAgICAgImNvcmUvZnhjcnQvY2Z4X2RlY2ltYWwuY3BwIiwKKyAgICAgICJjb3JlL2Z4Y3J0L2NmeF9kZWNpbWFsLmgiLAorICAgICAgImNvcmUvZnhjcnQvY2Z4X3NlZWthYmxlc3RyZWFtcHJveHkuY3BwIiwKKyAgICAgICJjb3JlL2Z4Y3J0L2NmeF9zZWVrYWJsZXN0cmVhbXByb3h5LmgiLAorICAgICAgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3MuaCIsCisgICAgICAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc2NvbG9ydmFsdWUuY3BwIiwKKyAgICAgICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzY29sb3J2YWx1ZS5oIiwKKyAgICAgICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzY29tcHV0ZWRzdHlsZS5jcHAiLAorICAgICAgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3Njb21wdXRlZHN0eWxlLmgiLAorICAgICAgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NjdXN0b21wcm9wZXJ0eS5jcHAiLAorICAgICAgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NjdXN0b21wcm9wZXJ0eS5oIiwKKyAgICAgICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzZGF0YXRhYmxlLmNwcCIsCisgICAgICAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc2RhdGF0YWJsZS5oIiwKKyAgICAgICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzZGVjbGFyYXRpb24uY3BwIiwKKyAgICAgICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzZGVjbGFyYXRpb24uaCIsCisgICAgICAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc2VudW12YWx1ZS5jcHAiLAorICAgICAgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NlbnVtdmFsdWUuaCIsCisgICAgICAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc2V4dHRleHRidWYuY3BwIiwKKyAgICAgICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzZXh0dGV4dGJ1Zi5oIiwKKyAgICAgICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzbnVtYmVydmFsdWUuY3BwIiwKKyAgICAgICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzbnVtYmVydmFsdWUuaCIsCisgICAgICAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3Byb3BlcnR5aG9sZGVyLmNwcCIsCisgICAgICAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3Byb3BlcnR5aG9sZGVyLmgiLAorICAgICAgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NydWxlY29sbGVjdGlvbi5jcHAiLAorICAgICAgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NydWxlY29sbGVjdGlvbi5oIiwKKyAgICAgICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc2VsZWN0b3IuY3BwIiwKKyAgICAgICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc2VsZWN0b3IuaCIsCisgICAgICAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3N0cmluZ3ZhbHVlLmNwcCIsCisgICAgICAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3N0cmluZ3ZhbHVlLmgiLAorICAgICAgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHlsZXJ1bGUuY3BwIiwKKyAgICAgICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3R5bGVydWxlLmgiLAorICAgICAgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHlsZXNlbGVjdG9yLmNwcCIsCisgICAgICAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3N0eWxlc2VsZWN0b3IuaCIsCisgICAgICAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3N0eWxlc2hlZXQuY3BwIiwKKyAgICAgICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3R5bGVzaGVldC5oIiwKKyAgICAgICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3ludGF4cGFyc2VyLmNwcCIsCisgICAgICAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3N5bnRheHBhcnNlci5oIiwKKyAgICAgICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzdGV4dGJ1Zi5jcHAiLAorICAgICAgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3N0ZXh0YnVmLmgiLAorICAgICAgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3N2YWx1ZS5jcHAiLAorICAgICAgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3N2YWx1ZS5oIiwKKyAgICAgICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzdmFsdWVsaXN0LmNwcCIsCisgICAgICAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3ZhbHVlbGlzdC5oIiwKKyAgICAgICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzdmFsdWVsaXN0cGFyc2VyLmNwcCIsCisgICAgICAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3ZhbHVlbGlzdHBhcnNlci5oIiwKICAgICAgICJjb3JlL2Z4Y3J0L2Z4X2FyYWJpYy5jcHAiLAogICAgICAgImNvcmUvZnhjcnQvZnhfYXJhYmljLmgiLAotICAgICAgImNvcmUvZnhjcnQvZnhfYXJiLmgiLAorICAgICAgImNvcmUvZnhjcnQvaWZ4X2xvY2FsZS5oIiwKKyAgICAgICJjb3JlL2Z4Y3J0L3htbC9jZnhfc2F4Y29udGV4dC5jcHAiLAorICAgICAgImNvcmUvZnhjcnQveG1sL2NmeF9zYXhjb250ZXh0LmgiLAorICAgICAgImNvcmUvZnhjcnQveG1sL2NmeF9zYXhyZWFkZXIuY3BwIiwKKyAgICAgICJjb3JlL2Z4Y3J0L3htbC9jZnhfc2F4cmVhZGVyLmgiLAorICAgICAgImNvcmUvZnhjcnQveG1sL2NmeF9zYXhyZWFkZXJoYW5kbGVyLmNwcCIsCisgICAgICAiY29yZS9meGNydC94bWwvY2Z4X3NheHJlYWRlcmhhbmRsZXIuaCIsCisgICAgICAiY29yZS9meGNydC94bWwvY2Z4X3htbGF0dHJpYnV0ZW5vZGUuY3BwIiwKKyAgICAgICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sYXR0cmlidXRlbm9kZS5oIiwKKyAgICAgICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sY2hhcmRhdGEuY3BwIiwKKyAgICAgICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sY2hhcmRhdGEuaCIsCisgICAgICAiY29yZS9meGNydC94bWwvY2Z4X3htbGRvYy5jcHAiLAorICAgICAgImNvcmUvZnhjcnQveG1sL2NmeF94bWxkb2MuaCIsCisgICAgICAiY29yZS9meGNydC94bWwvY2Z4X3htbGVsZW1lbnQuY3BwIiwKKyAgICAgICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sZWxlbWVudC5oIiwKKyAgICAgICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1saW5zdHJ1Y3Rpb24uY3BwIiwKKyAgICAgICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1saW5zdHJ1Y3Rpb24uaCIsCisgICAgICAiY29yZS9meGNydC94bWwvY2Z4X3htbG5vZGUuY3BwIiwKKyAgICAgICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sbm9kZS5oIiwKKyAgICAgICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1scGFyc2VyLmNwcCIsCisgICAgICAiY29yZS9meGNydC94bWwvY2Z4X3htbHBhcnNlci5oIiwKKyAgICAgICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sc3ludGF4cGFyc2VyLmNwcCIsCisgICAgICAiY29yZS9meGNydC94bWwvY2Z4X3htbHN5bnRheHBhcnNlci5oIiwKKyAgICAgICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sdGV4dC5jcHAiLAorICAgICAgImNvcmUvZnhjcnQveG1sL2NmeF94bWx0ZXh0LmgiLAogICAgIF0KICAgfQogfQogCi1zdGF0aWNfbGlicmFyeSgiZnhnZSIpIHsKK2p1bWJvX3N0YXRpY19saWJyYXJ5KCJmeGdlIikgewogICBzb3VyY2VzID0gWworICAgICJjb3JlL2Z4Z2UvYW5kcm9pZC9jZnBmX3NraWFidWZmZXJmb250LmNwcCIsCiAgICAgImNvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWJ1ZmZlcmZvbnQuaCIsCiAgICAgImNvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWRldmljZW1vZHVsZS5jcHAiLAogICAgICJjb3JlL2Z4Z2UvYW5kcm9pZC9jZnBmX3NraWFkZXZpY2Vtb2R1bGUuaCIsCisgICAgImNvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWZpbGVmb250LmNwcCIsCiAgICAgImNvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWZpbGVmb250LmgiLAogICAgICJjb3JlL2Z4Z2UvYW5kcm9pZC9jZnBmX3NraWFmb250LmNwcCIsCiAgICAgImNvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWZvbnQuaCIsCisgICAgImNvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWZvbnRkZXNjcmlwdG9yLmNwcCIsCiAgICAgImNvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWZvbnRkZXNjcmlwdG9yLmgiLAogICAgICJjb3JlL2Z4Z2UvYW5kcm9pZC9jZnBmX3NraWFmb250bWdyLmNwcCIsCiAgICAgImNvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWZvbnRtZ3IuaCIsCisgICAgImNvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYXBhdGhmb250LmNwcCIsCiAgICAgImNvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYXBhdGhmb250LmgiLAogICAgICJjb3JlL2Z4Z2UvYW5kcm9pZC9jZnhfYW5kcm9pZGZvbnRpbmZvLmNwcCIsCiAgICAgImNvcmUvZnhnZS9hbmRyb2lkL2NmeF9hbmRyb2lkZm9udGluZm8uaCIsCiAgICAgImNvcmUvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfaW1wLmNwcCIsCisgICAgImNvcmUvZnhnZS9jZnhfY2xpcHJnbi5jcHAiLAorICAgICJjb3JlL2Z4Z2UvY2Z4X2NsaXByZ24uaCIsCisgICAgImNvcmUvZnhnZS9jZnhfY29sb3IuY3BwIiwKKyAgICAiY29yZS9meGdlL2NmeF9jb2xvci5oIiwKKyAgICAiY29yZS9meGdlL2NmeF9kZWZhdWx0cmVuZGVyZGV2aWNlLmgiLAorICAgICJjb3JlL2Z4Z2UvY2Z4X2ZhY2VjYWNoZS5jcHAiLAogICAgICJjb3JlL2Z4Z2UvY2Z4X2ZhY2VjYWNoZS5oIiwKKyAgICAiY29yZS9meGdlL2NmeF9mb2xkZXJmb250aW5mby5jcHAiLAorICAgICJjb3JlL2Z4Z2UvY2Z4X2ZvbGRlcmZvbnRpbmZvLmgiLAorICAgICJjb3JlL2Z4Z2UvY2Z4X2ZvbnQuY3BwIiwKKyAgICAiY29yZS9meGdlL2NmeF9mb250Y2FjaGUuY3BwIiwKICAgICAiY29yZS9meGdlL2NmeF9mb250Y2FjaGUuaCIsCisgICAgImNvcmUvZnhnZS9jZnhfZm9udG1hcHBlci5jcHAiLAogICAgICJjb3JlL2Z4Z2UvY2Z4X2ZvbnRtYXBwZXIuaCIsCisgICAgImNvcmUvZnhnZS9jZnhfZm9udG1nci5jcHAiLAogICAgICJjb3JlL2Z4Z2UvY2Z4X2ZvbnRtZ3IuaCIsCi0gICAgImNvcmUvZnhnZS9jZnhfZnhnZWRldmljZS5oIiwKKyAgICAiY29yZS9meGdlL2NmeF9nZW1vZHVsZS5jcHAiLAogICAgICJjb3JlL2Z4Z2UvY2Z4X2dlbW9kdWxlLmgiLAorICAgICJjb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGUuY3BwIiwKICAgICAiY29yZS9meGdlL2NmeF9ncmFwaHN0YXRlLmgiLAorICAgICJjb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGVkYXRhLmNwcCIsCiAgICAgImNvcmUvZnhnZS9jZnhfZ3JhcGhzdGF0ZWRhdGEuaCIsCisgICAgImNvcmUvZnhnZS9jZnhfcGF0aGRhdGEuY3BwIiwKICAgICAiY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oIiwKKyAgICAiY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuY3BwIiwKICAgICAiY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaCIsCisgICAgImNvcmUvZnhnZS9jZnhfc3Vic3Rmb250LmNwcCIsCiAgICAgImNvcmUvZnhnZS9jZnhfc3Vic3Rmb250LmgiLAorICAgICJjb3JlL2Z4Z2UvY2Z4X3VuaWNvZGVlbmNvZGluZy5jcHAiLAogICAgICJjb3JlL2Z4Z2UvY2Z4X3VuaWNvZGVlbmNvZGluZy5oIiwKLSAgICAiY29yZS9meGdlL2NmeF93aW5kb3dzZGV2aWNlLmgiLAotICAgICJjb3JlL2Z4Z2UvZGliL2RpYl9pbnQuaCIsCi0gICAgImNvcmUvZnhnZS9kaWIvZnhfZGliX2NvbXBvc2l0ZS5jcHAiLAotICAgICJjb3JlL2Z4Z2UvZGliL2Z4X2RpYl9jb252ZXJ0LmNwcCIsCi0gICAgImNvcmUvZnhnZS9kaWIvZnhfZGliX2VuZ2luZS5jcHAiLAorICAgICJjb3JlL2Z4Z2UvY2Z4X3dpbmRvd3NyZW5kZXJkZXZpY2UuaCIsCisgICAgImNvcmUvZnhnZS9jdHRmb250ZGVzYy5jcHAiLAorICAgICJjb3JlL2Z4Z2UvY3R0Zm9udGRlc2MuaCIsCisgICAgImNvcmUvZnhnZS9kaWIvY2Z4X2JpdG1hcGNvbXBvc2VyLmNwcCIsCisgICAgImNvcmUvZnhnZS9kaWIvY2Z4X2JpdG1hcGNvbXBvc2VyLmgiLAorICAgICJjb3JlL2Z4Z2UvZGliL2NmeF9iaXRtYXBzdG9yZXIuY3BwIiwKKyAgICAiY29yZS9meGdlL2RpYi9jZnhfYml0bWFwc3RvcmVyLmgiLAorICAgICJjb3JlL2Z4Z2UvZGliL2NmeF9kaWJleHRyYWN0b3IuY3BwIiwKKyAgICAiY29yZS9meGdlL2RpYi9jZnhfZGliZXh0cmFjdG9yLmgiLAorICAgICJjb3JlL2Z4Z2UvZGliL2NmeF9kaWJpdG1hcC5jcHAiLAorICAgICJjb3JlL2Z4Z2UvZGliL2NmeF9kaWJpdG1hcC5oIiwKKyAgICAiY29yZS9meGdlL2RpYi9jZnhfZGlic291cmNlLmNwcCIsCisgICAgImNvcmUvZnhnZS9kaWIvY2Z4X2RpYnNvdXJjZS5oIiwKKyAgICAiY29yZS9meGdlL2RpYi9jZnhfZmlsdGVyZWRkaWIuY3BwIiwKKyAgICAiY29yZS9meGdlL2RpYi9jZnhfZmlsdGVyZWRkaWIuaCIsCisgICAgImNvcmUvZnhnZS9kaWIvY2Z4X2ltYWdlcmVuZGVyZXIuY3BwIiwKKyAgICAiY29yZS9meGdlL2RpYi9jZnhfaW1hZ2VyZW5kZXJlci5oIiwKKyAgICAiY29yZS9meGdlL2RpYi9jZnhfaW1hZ2VzdHJldGNoZXIuY3BwIiwKKyAgICAiY29yZS9meGdlL2RpYi9jZnhfaW1hZ2VzdHJldGNoZXIuaCIsCisgICAgImNvcmUvZnhnZS9kaWIvY2Z4X2ltYWdldHJhbnNmb3JtZXIuY3BwIiwKKyAgICAiY29yZS9meGdlL2RpYi9jZnhfaW1hZ2V0cmFuc2Zvcm1lci5oIiwKKyAgICAiY29yZS9meGdlL2RpYi9jZnhfc2NhbmxpbmVjb21wb3NpdG9yLmNwcCIsCisgICAgImNvcmUvZnhnZS9kaWIvY2Z4X3NjYW5saW5lY29tcG9zaXRvci5oIiwKKyAgICAiY29yZS9meGdlL2RpYi9jc3RyZXRjaGVuZ2luZS5jcHAiLAorICAgICJjb3JlL2Z4Z2UvZGliL2NzdHJldGNoZW5naW5lLmgiLAogICAgICJjb3JlL2Z4Z2UvZGliL2Z4X2RpYl9tYWluLmNwcCIsCi0gICAgImNvcmUvZnhnZS9kaWIvZnhfZGliX3RyYW5zZm9ybS5jcHAiLAorICAgICJjb3JlL2Z4Z2UvZGliL2lmeF9zY2FubGluZWNvbXBvc2VyLmgiLAogICAgICJjb3JlL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXREaW5nYmF0cy5jcHAiLAogICAgICJjb3JlL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRGaXhlZC5jcHAiLAogICAgICJjb3JlL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRGaXhlZEJvbGQuY3BwIiwKQEAgLTg1NiwyOCArMTA2NSw5IEBACiAgICAgImNvcmUvZnhnZS9meF9kaWIuaCIsCiAgICAgImNvcmUvZnhnZS9meF9mb250LmgiLAogICAgICJjb3JlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIsCi0gICAgImNvcmUvZnhnZS9nZS9jZnhfY2xpcHJnbi5jcHAiLAotICAgICJjb3JlL2Z4Z2UvZ2UvY2Z4X2NsaXByZ24uaCIsCi0gICAgImNvcmUvZnhnZS9nZS9jZnhfZmFjZWNhY2hlLmNwcCIsCi0gICAgImNvcmUvZnhnZS9nZS9jZnhfZm9sZGVyZm9udGluZm8uY3BwIiwKLSAgICAiY29yZS9meGdlL2dlL2NmeF9mb2xkZXJmb250aW5mby5oIiwKLSAgICAiY29yZS9meGdlL2dlL2NmeF9mb250LmNwcCIsCi0gICAgImNvcmUvZnhnZS9nZS9jZnhfZm9udGNhY2hlLmNwcCIsCi0gICAgImNvcmUvZnhnZS9nZS9jZnhfZm9udG1hcHBlci5jcHAiLAotICAgICJjb3JlL2Z4Z2UvZ2UvY2Z4X2ZvbnRtZ3IuY3BwIiwKLSAgICAiY29yZS9meGdlL2dlL2NmeF9nZW1vZHVsZS5jcHAiLAotICAgICJjb3JlL2Z4Z2UvZ2UvY2Z4X2dyYXBoc3RhdGUuY3BwIiwKLSAgICAiY29yZS9meGdlL2dlL2NmeF9ncmFwaHN0YXRlZGF0YS5jcHAiLAotICAgICJjb3JlL2Z4Z2UvZ2UvY2Z4X3BhdGhkYXRhLmNwcCIsCi0gICAgImNvcmUvZnhnZS9nZS9jZnhfcmVuZGVyZGV2aWNlLmNwcCIsCi0gICAgImNvcmUvZnhnZS9nZS9jZnhfc3Vic3Rmb250LmNwcCIsCi0gICAgImNvcmUvZnhnZS9nZS9jZnhfdW5pY29kZWVuY29kaW5nLmNwcCIsCi0gICAgImNvcmUvZnhnZS9nZS9jdHRmb250ZGVzYy5jcHAiLAotICAgICJjb3JlL2Z4Z2UvZ2UvY3R0Zm9udGRlc2MuaCIsCi0gICAgImNvcmUvZnhnZS9nZS9meF9nZV9mb250bWFwLmNwcCIsCi0gICAgImNvcmUvZnhnZS9nZS9meF9nZV9saW51eC5jcHAiLAotICAgICJjb3JlL2Z4Z2UvZ2UvZnhfZ2VfdGV4dC5jcHAiLAotICAgICJjb3JlL2Z4Z2UvZ2UvZnhfdGV4dF9pbnQuaCIsCisgICAgImNvcmUvZnhnZS9meF9nZV9mb250bWFwLmNwcCIsCisgICAgImNvcmUvZnhnZS9meF9nZV9saW51eC5jcHAiLAorICAgICJjb3JlL2Z4Z2UvZnhfZ2VfdGV4dC5jcHAiLAogICAgICJjb3JlL2Z4Z2UvaWZ4X3JlbmRlcmRldmljZWRyaXZlci5jcHAiLAogICAgICJjb3JlL2Z4Z2UvaWZ4X3JlbmRlcmRldmljZWRyaXZlci5oIiwKICAgICAiY29yZS9meGdlL2lmeF9zeXN0ZW1mb250aW5mby5oIiwKQEAgLTg5MywxMCArMTA4MywxNyBAQAogICAgICI6ZnhjcnQiLAogICBdCiAKKyAgZGVmaW5lcyA9IFsgIkRFRklORV9QU19UQUJMRVMiIF0KKyAgaWYgKGlzX2NvbXBvbmVudF9idWlsZCB8fCB1c2Vfc3lzdGVtX2ZyZWV0eXBlKSB7CisgICAgIyBmdF9hZG9iZV9nbHlwaF9saXN0IGlzIG5vdCBleHBvcnRlZCBmcm9tIHRoZSBGcmVldHlwZSBzaGFyZWQgbGlicmFyeSBzbyB3ZQorICAgICMgbmVlZCBpdCBkZWZpbmVkIGluIGNvbXBvbmVudCBidWlsZHMgYW5kIGJ1aWxkcyB1c2luZyBzeXN0ZW0gZnJlZXR5cGUuCisgICAgZGVmaW5lcyArPSBbICJERUZJTkVfUFNfVEFCTEVTX0RBVEEiIF0KKyAgfQorCiAgIGlmIChwZGZfZW5hYmxlX3hmYSkgewogICAgIHNvdXJjZXMgKz0gWworICAgICAgImNvcmUvZnhnZS9jZnhfdW5pY29kZWVuY29kaW5nZXguY3BwIiwKICAgICAgICJjb3JlL2Z4Z2UvY2Z4X3VuaWNvZGVlbmNvZGluZ2V4LmgiLAotICAgICAgImNvcmUvZnhnZS9nZS9jZnhfdW5pY29kZWVuY29kaW5nZXguY3BwIiwKICAgICBdCiAgIH0KIApAQCAtOTA5LDEwICsxMTA2LDEwIEBACiAgICAgICAiY29yZS9meGdlL2FnZy9meF9hZ2dfZHJpdmVyLmgiLAogICAgIF0KICAgICBkZXBzICs9IFsgInRoaXJkX3BhcnR5OmZ4X2FnZyIgXQorICB9CiAKLSAgICBpZiAoaXNfbWFjKSB7Ci0gICAgICBzb3VyY2VzICs9IFsgImNvcmUvZnhnZS9hcHBsZS9meF9hcHBsZV9wbGF0Zm9ybS5jcHAiIF0KLSAgICB9CisgIGlmIChpc19tYWMpIHsKKyAgICBzb3VyY2VzICs9IFsgImNvcmUvZnhnZS9hcHBsZS9meF9hcHBsZV9wbGF0Zm9ybS5jcHAiIF0KICAgfQogCiAgIGlmIChpc193aW4pIHsKQEAgLTk0MSwxNCArMTEzOCw0MCBAQAogICB9CiB9CiAKLXN0YXRpY19saWJyYXJ5KCJmeGVkaXQiKSB7CitqdW1ib19zdGF0aWNfbGlicmFyeSgicHdsIikgewogICBzb3VyY2VzID0gWwotICAgICJmcGRmc2RrL2Z4ZWRpdC9meF9lZGl0LmgiLAotICAgICJmcGRmc2RrL2Z4ZWRpdC9meGV0X2FwLmNwcCIsCi0gICAgImZwZGZzZGsvZnhlZGl0L2Z4ZXRfZWRpdC5jcHAiLAotICAgICJmcGRmc2RrL2Z4ZWRpdC9meGV0X2VkaXQuaCIsCi0gICAgImZwZGZzZGsvZnhlZGl0L2Z4ZXRfbGlzdC5jcHAiLAotICAgICJmcGRmc2RrL2Z4ZWRpdC9meGV0X2xpc3QuaCIsCisgICAgImZwZGZzZGsvcHdsL2Nwd2xfYXBwc3RyZWFtLmNwcCIsCisgICAgImZwZGZzZGsvcHdsL2Nwd2xfYXBwc3RyZWFtLmgiLAorICAgICJmcGRmc2RrL3B3bC9jcHdsX2J1dHRvbi5jcHAiLAorICAgICJmcGRmc2RrL3B3bC9jcHdsX2J1dHRvbi5oIiwKKyAgICAiZnBkZnNkay9wd2wvY3B3bF9jYXJldC5jcHAiLAorICAgICJmcGRmc2RrL3B3bC9jcHdsX2NhcmV0LmgiLAorICAgICJmcGRmc2RrL3B3bC9jcHdsX2NvbWJvX2JveC5jcHAiLAorICAgICJmcGRmc2RrL3B3bC9jcHdsX2NvbWJvX2JveC5oIiwKKyAgICAiZnBkZnNkay9wd2wvY3B3bF9lZGl0LmNwcCIsCisgICAgImZwZGZzZGsvcHdsL2Nwd2xfZWRpdC5oIiwKKyAgICAiZnBkZnNkay9wd2wvY3B3bF9lZGl0X2N0cmwuY3BwIiwKKyAgICAiZnBkZnNkay9wd2wvY3B3bF9lZGl0X2N0cmwuaCIsCisgICAgImZwZGZzZGsvcHdsL2Nwd2xfZWRpdF9pbXBsLmNwcCIsCisgICAgImZwZGZzZGsvcHdsL2Nwd2xfZWRpdF9pbXBsLmgiLAorICAgICJmcGRmc2RrL3B3bC9jcHdsX2ZvbnRfbWFwLmNwcCIsCisgICAgImZwZGZzZGsvcHdsL2Nwd2xfZm9udF9tYXAuaCIsCisgICAgImZwZGZzZGsvcHdsL2Nwd2xfaWNvbi5jcHAiLAorICAgICJmcGRmc2RrL3B3bC9jcHdsX2ljb24uaCIsCisgICAgImZwZGZzZGsvcHdsL2Nwd2xfbGlzdF9ib3guY3BwIiwKKyAgICAiZnBkZnNkay9wd2wvY3B3bF9saXN0X2JveC5oIiwKKyAgICAiZnBkZnNkay9wd2wvY3B3bF9saXN0X2ltcGwuY3BwIiwKKyAgICAiZnBkZnNkay9wd2wvY3B3bF9saXN0X2ltcGwuaCIsCisgICAgImZwZGZzZGsvcHdsL2Nwd2xfc2Nyb2xsX2Jhci5jcHAiLAorICAgICJmcGRmc2RrL3B3bC9jcHdsX3Njcm9sbF9iYXIuaCIsCisgICAgImZwZGZzZGsvcHdsL2Nwd2xfc3BlY2lhbF9idXR0b24uY3BwIiwKKyAgICAiZnBkZnNkay9wd2wvY3B3bF9zcGVjaWFsX2J1dHRvbi5oIiwKKyAgICAiZnBkZnNkay9wd2wvY3B3bF90aW1lci5jcHAiLAorICAgICJmcGRmc2RrL3B3bC9jcHdsX3RpbWVyLmgiLAorICAgICJmcGRmc2RrL3B3bC9jcHdsX3RpbWVyX2hhbmRsZXIuY3BwIiwKKyAgICAiZnBkZnNkay9wd2wvY3B3bF90aW1lcl9oYW5kbGVyLmgiLAorICAgICJmcGRmc2RrL3B3bC9jcHdsX3duZC5jcHAiLAorICAgICJmcGRmc2RrL3B3bC9jcHdsX3duZC5oIiwKICAgXQogICBjb25maWdzICs9IFsgIjpwZGZpdW1fY29yZV9jb25maWciIF0KICAgZGVwcyA9IFsKQEAgLTk1Niw0NSArMTE3OSwxMCBAQAogICBdCiB9CiAKLXN0YXRpY19saWJyYXJ5KCJwZGZ3aW5kb3ciKSB7CitqdW1ib19zdGF0aWNfbGlicmFyeSgiZnhqcyIpIHsKICAgc291cmNlcyA9IFsKLSAgICAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0J1dHRvbi5jcHAiLAotICAgICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfQnV0dG9uLmgiLAotICAgICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfQ2FyZXQuY3BwIiwKLSAgICAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0NhcmV0LmgiLAotICAgICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guY3BwIiwKLSAgICAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmgiLAotICAgICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfRWRpdC5jcHAiLAotICAgICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfRWRpdC5oIiwKLSAgICAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmNwcCIsCi0gICAgImZwZGZzZGsvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5oIiwKLSAgICAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuY3BwIiwKLSAgICAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuaCIsCi0gICAgImZwZGZzZGsvcGRmd2luZG93L1BXTF9JY29uLmNwcCIsCi0gICAgImZwZGZzZGsvcGRmd2luZG93L1BXTF9JY29uLmgiLAotICAgICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfTGlzdEJveC5jcHAiLAotICAgICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfTGlzdEJveC5oIiwKLSAgICAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5jcHAiLAotICAgICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmgiLAotICAgICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5jcHAiLAotICAgICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5oIiwKLSAgICAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX1V0aWxzLmNwcCIsCi0gICAgImZwZGZzZGsvcGRmd2luZG93L1BXTF9VdGlscy5oIiwKLSAgICAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX1duZC5jcHAiLAotICAgICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfV25kLmgiLAotICAgICJmcGRmc2RrL3BkZndpbmRvdy9jcHdsX2NvbG9yLmNwcCIsCi0gICAgImZwZGZzZGsvcGRmd2luZG93L2Nwd2xfY29sb3IuaCIsCi0gIF0KLSAgY29uZmlncyArPSBbICI6cGRmaXVtX2NvcmVfY29uZmlnIiBdCi0gIGRlcHMgPSBbCi0gICAgIjpmeGNydCIsCi0gIF0KLX0KLQotc3RhdGljX2xpYnJhcnkoImphdmFzY3JpcHQiKSB7Ci0gIHNvdXJjZXMgPSBbCi0gICAgImZwZGZzZGsvamF2YXNjcmlwdC9panNfZXZlbnRfY29udGV4dC5oIiwKLSAgICAiZnBkZnNkay9qYXZhc2NyaXB0L2lqc19ydW50aW1lLmgiLAorICAgICJmeGpzL2lqc19ldmVudF9jb250ZXh0LmgiLAorICAgICJmeGpzL2lqc19ydW50aW1lLmgiLAogICBdCiAgIGNvbmZpZ3MgKz0gWyAiOnBkZml1bV9jb3JlX2NvbmZpZyIgXQogICBkZXBzID0gWwpAQCAtMTAwMyw5NiArMTE5MSw5NCBAQAogCiAgIGlmIChwZGZfZW5hYmxlX3Y4KSB7CiAgICAgc291cmNlcyArPSBbCi0gICAgICAiZnBkZnNkay9qYXZhc2NyaXB0L0Fubm90LmNwcCIsCi0gICAgICAiZnBkZnNkay9qYXZhc2NyaXB0L0Fubm90LmgiLAotICAgICAgImZwZGZzZGsvamF2YXNjcmlwdC9Db25zdHMuY3BwIiwKLSAgICAgICJmcGRmc2RrL2phdmFzY3JpcHQvQ29uc3RzLmgiLAotICAgICAgImZwZGZzZGsvamF2YXNjcmlwdC9Eb2N1bWVudC5jcHAiLAotICAgICAgImZwZGZzZGsvamF2YXNjcmlwdC9Eb2N1bWVudC5oIiwKLSAgICAgICJmcGRmc2RrL2phdmFzY3JpcHQvRmllbGQuY3BwIiwKLSAgICAgICJmcGRmc2RrL2phdmFzY3JpcHQvRmllbGQuaCIsCi0gICAgICAiZnBkZnNkay9qYXZhc2NyaXB0L0ljb24uY3BwIiwKLSAgICAgICJmcGRmc2RrL2phdmFzY3JpcHQvSWNvbi5oIiwKLSAgICAgICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgiLAotICAgICAgImZwZGZzZGsvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuY3BwIiwKLSAgICAgICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmgiLAotICAgICAgImZwZGZzZGsvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmNwcCIsCi0gICAgICAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuaCIsCi0gICAgICAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX0tleVZhbHVlLmNwcCIsCi0gICAgICAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX0tleVZhbHVlLmgiLAotICAgICAgImZwZGZzZGsvamF2YXNjcmlwdC9KU19PYmplY3QuY3BwIiwKLSAgICAgICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgiLAotICAgICAgImZwZGZzZGsvamF2YXNjcmlwdC9KU19WYWx1ZS5jcHAiLAotICAgICAgImZwZGZzZGsvamF2YXNjcmlwdC9KU19WYWx1ZS5oIiwKLSAgICAgICJmcGRmc2RrL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5jcHAiLAotICAgICAgImZwZGZzZGsvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmgiLAotICAgICAgImZwZGZzZGsvamF2YXNjcmlwdC9hcHAuY3BwIiwKLSAgICAgICJmcGRmc2RrL2phdmFzY3JpcHQvYXBwLmgiLAotICAgICAgImZwZGZzZGsvamF2YXNjcmlwdC9janNfZXZlbnRfY29udGV4dC5jcHAiLAotICAgICAgImZwZGZzZGsvamF2YXNjcmlwdC9janNfZXZlbnRfY29udGV4dC5oIiwKLSAgICAgICJmcGRmc2RrL2phdmFzY3JpcHQvY2pzX3J1bnRpbWUuY3BwIiwKLSAgICAgICJmcGRmc2RrL2phdmFzY3JpcHQvY2pzX3J1bnRpbWUuaCIsCi0gICAgICAiZnBkZnNkay9qYXZhc2NyaXB0L2NvbG9yLmNwcCIsCi0gICAgICAiZnBkZnNkay9qYXZhc2NyaXB0L2NvbG9yLmgiLAotICAgICAgImZwZGZzZGsvamF2YXNjcmlwdC9jb25zb2xlLmNwcCIsCi0gICAgICAiZnBkZnNkay9qYXZhc2NyaXB0L2NvbnNvbGUuaCIsCi0gICAgICAiZnBkZnNkay9qYXZhc2NyaXB0L2V2ZW50LmNwcCIsCi0gICAgICAiZnBkZnNkay9qYXZhc2NyaXB0L2V2ZW50LmgiLAotICAgICAgImZwZGZzZGsvamF2YXNjcmlwdC9nbG9iYWwuY3BwIiwKLSAgICAgICJmcGRmc2RrL2phdmFzY3JpcHQvZ2xvYmFsLmgiLAotICAgICAgImZwZGZzZGsvamF2YXNjcmlwdC9yZXBvcnQuY3BwIiwKLSAgICAgICJmcGRmc2RrL2phdmFzY3JpcHQvcmVwb3J0LmgiLAotICAgICAgImZwZGZzZGsvamF2YXNjcmlwdC9yZXNvdXJjZS5jcHAiLAotICAgICAgImZwZGZzZGsvamF2YXNjcmlwdC9yZXNvdXJjZS5oIiwKLSAgICAgICJmcGRmc2RrL2phdmFzY3JpcHQvdXRpbC5jcHAiLAotICAgICAgImZwZGZzZGsvamF2YXNjcmlwdC91dGlsLmgiLAotICAgIF0KLSAgICBkZXBzICs9IFsgIjpmeGpzIiBdCi0gICAgY29uZmlncyArPSBbICIvL3Y4OmV4dGVybmFsX3N0YXJ0dXBfZGF0YSIgXQotICB9IGVsc2UgewotICAgIHNvdXJjZXMgKz0gWyAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX1J1bnRpbWVfU3R1Yi5jcHAiIF0KLSAgfQotfQotCi1zdGF0aWNfbGlicmFyeSgiZm9ybWZpbGxlciIpIHsKLSAgc291cmNlcyA9IFsKLSAgICAiZnBkZnNkay9mb3JtZmlsbGVyL2NiYV9mb250bWFwLmNwcCIsCi0gICAgImZwZGZzZGsvZm9ybWZpbGxlci9jYmFfZm9udG1hcC5oIiwKLSAgICAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfY2hlY2tib3guY3BwIiwKLSAgICAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfY2hlY2tib3guaCIsCi0gICAgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2NvbWJvYm94LmNwcCIsCi0gICAgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2NvbWJvYm94LmgiLAotICAgICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9mb3JtZmlsbGVyLmNwcCIsCi0gICAgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2Zvcm1maWxsZXIuaCIsCi0gICAgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2ludGVyYWN0aXZlZm9ybWZpbGxlci5jcHAiLAotICAgICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9pbnRlcmFjdGl2ZWZvcm1maWxsZXIuaCIsCi0gICAgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2xpc3Rib3guY3BwIiwKLSAgICAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfbGlzdGJveC5oIiwKLSAgICAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfcHVzaGJ1dHRvbi5jcHAiLAotICAgICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9wdXNoYnV0dG9uLmgiLAotICAgICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9yYWRpb2J1dHRvbi5jcHAiLAotICAgICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9yYWRpb2J1dHRvbi5oIiwKLSAgICAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfdGV4dGZpZWxkLmNwcCIsCi0gICAgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX3RleHRmaWVsZC5oIiwKLSAgXQotICBjb25maWdzICs9IFsgIjpwZGZpdW1fY29yZV9jb25maWciIF0KLSAgZGVwcyA9IFsKLSAgICAiOmZ4Y3J0IiwKLSAgXQotfQotCi1pZiAocGRmX2VuYWJsZV92OCkgewotICBzdGF0aWNfbGlicmFyeSgiZnhqcyIpIHsKLSAgICBzb3VyY2VzID0gWworICAgICAgImZ4anMvQ0pYX0RlZmluZS5oIiwKKyAgICAgICJmeGpzL0pTX0RlZmluZS5jcHAiLAorICAgICAgImZ4anMvSlNfRGVmaW5lLmgiLAorICAgICAgImZ4anMvY2pzX2Fubm90LmNwcCIsCisgICAgICAiZnhqcy9janNfYW5ub3QuaCIsCisgICAgICAiZnhqcy9janNfYXBwLmNwcCIsCisgICAgICAiZnhqcy9janNfYXBwLmgiLAorICAgICAgImZ4anMvY2pzX2JvcmRlci5jcHAiLAorICAgICAgImZ4anMvY2pzX2JvcmRlci5oIiwKKyAgICAgICJmeGpzL2Nqc19jb2xvci5jcHAiLAorICAgICAgImZ4anMvY2pzX2NvbG9yLmgiLAorICAgICAgImZ4anMvY2pzX2NvbnNvbGUuY3BwIiwKKyAgICAgICJmeGpzL2Nqc19jb25zb2xlLmgiLAorICAgICAgImZ4anMvY2pzX2RlbGF5ZGF0YS5jcHAiLAorICAgICAgImZ4anMvY2pzX2RlbGF5ZGF0YS5oIiwKKyAgICAgICJmeGpzL2Nqc19kaXNwbGF5LmNwcCIsCisgICAgICAiZnhqcy9janNfZGlzcGxheS5oIiwKKyAgICAgICJmeGpzL2Nqc19kb2N1bWVudC5jcHAiLAorICAgICAgImZ4anMvY2pzX2RvY3VtZW50LmgiLAorICAgICAgImZ4anMvY2pzX2VtYmVkb2JqLmNwcCIsCisgICAgICAiZnhqcy9janNfZW1iZWRvYmouaCIsCisgICAgICAiZnhqcy9janNfZXZlbnQuY3BwIiwKKyAgICAgICJmeGpzL2Nqc19ldmVudC5oIiwKKyAgICAgICJmeGpzL2Nqc19ldmVudF9jb250ZXh0LmNwcCIsCisgICAgICAiZnhqcy9janNfZXZlbnRfY29udGV4dC5oIiwKKyAgICAgICJmeGpzL2Nqc19ldmVudGhhbmRsZXIuY3BwIiwKKyAgICAgICJmeGpzL2Nqc19ldmVudGhhbmRsZXIuaCIsCisgICAgICAiZnhqcy9janNfZmllbGQuY3BwIiwKKyAgICAgICJmeGpzL2Nqc19maWVsZC5oIiwKKyAgICAgICJmeGpzL2Nqc19mb250LmNwcCIsCisgICAgICAiZnhqcy9janNfZm9udC5oIiwKKyAgICAgICJmeGpzL2Nqc19nbG9iYWwuY3BwIiwKKyAgICAgICJmeGpzL2Nqc19nbG9iYWwuaCIsCisgICAgICAiZnhqcy9janNfZ2xvYmFsYXJyYXlzLmNwcCIsCisgICAgICAiZnhqcy9janNfZ2xvYmFsYXJyYXlzLmgiLAorICAgICAgImZ4anMvY2pzX2dsb2JhbGNvbnN0cy5jcHAiLAorICAgICAgImZ4anMvY2pzX2dsb2JhbGNvbnN0cy5oIiwKKyAgICAgICJmeGpzL2Nqc19nbG9iYWxkYXRhLmNwcCIsCisgICAgICAiZnhqcy9janNfZ2xvYmFsZGF0YS5oIiwKKyAgICAgICJmeGpzL2Nqc19nbG9iYWx2YXJpYWJsZWFycmF5LmNwcCIsCisgICAgICAiZnhqcy9janNfZ2xvYmFsdmFyaWFibGVhcnJheS5oIiwKKyAgICAgICJmeGpzL2Nqc19oaWdobGlnaHQuY3BwIiwKKyAgICAgICJmeGpzL2Nqc19oaWdobGlnaHQuaCIsCisgICAgICAiZnhqcy9janNfaWNvbi5jcHAiLAorICAgICAgImZ4anMvY2pzX2ljb24uaCIsCisgICAgICAiZnhqcy9janNfa2V5dmFsdWUuY3BwIiwKKyAgICAgICJmeGpzL2Nqc19rZXl2YWx1ZS5oIiwKKyAgICAgICJmeGpzL2Nqc19vYmplY3QuY3BwIiwKKyAgICAgICJmeGpzL2Nqc19vYmplY3QuaCIsCisgICAgICAiZnhqcy9janNfcG9zaXRpb24uY3BwIiwKKyAgICAgICJmeGpzL2Nqc19wb3NpdGlvbi5oIiwKKyAgICAgICJmeGpzL2Nqc19wcmludHBhcmFtc29iai5jcHAiLAorICAgICAgImZ4anMvY2pzX3ByaW50cGFyYW1zb2JqLmgiLAorICAgICAgImZ4anMvY2pzX3B1YmxpY21ldGhvZHMuY3BwIiwKKyAgICAgICJmeGpzL2Nqc19wdWJsaWNtZXRob2RzLmgiLAorICAgICAgImZ4anMvY2pzX3JlcG9ydC5jcHAiLAorICAgICAgImZ4anMvY2pzX3JlcG9ydC5oIiwKKyAgICAgICJmeGpzL2Nqc19yZXR1cm4uY3BwIiwKKyAgICAgICJmeGpzL2Nqc19yZXR1cm4uaCIsCisgICAgICAiZnhqcy9janNfcnVudGltZS5jcHAiLAorICAgICAgImZ4anMvY2pzX3J1bnRpbWUuaCIsCisgICAgICAiZnhqcy9janNfc2NhbGVob3cuY3BwIiwKKyAgICAgICJmeGpzL2Nqc19zY2FsZWhvdy5oIiwKKyAgICAgICJmeGpzL2Nqc19zY2FsZXdoZW4uY3BwIiwKKyAgICAgICJmeGpzL2Nqc19zY2FsZXdoZW4uaCIsCisgICAgICAiZnhqcy9janNfc3R5bGUuY3BwIiwKKyAgICAgICJmeGpzL2Nqc19zdHlsZS5oIiwKKyAgICAgICJmeGpzL2Nqc190aW1lcm9iai5jcHAiLAorICAgICAgImZ4anMvY2pzX3RpbWVyb2JqLmgiLAorICAgICAgImZ4anMvY2pzX3V0aWwuY3BwIiwKKyAgICAgICJmeGpzL2Nqc191dGlsLmgiLAorICAgICAgImZ4anMvY2pzX3Y4LmNwcCIsCisgICAgICAiZnhqcy9janNfdjguaCIsCisgICAgICAiZnhqcy9janNfem9vbXR5cGUuY3BwIiwKKyAgICAgICJmeGpzL2Nqc196b29tdHlwZS5oIiwKICAgICAgICJmeGpzL2Z4anNfdjguY3BwIiwKICAgICAgICJmeGpzL2Z4anNfdjguaCIsCisgICAgICAiZnhqcy9nbG9iYWxfdGltZXIuY3BwIiwKKyAgICAgICJmeGpzL2dsb2JhbF90aW1lci5oIiwKKyAgICAgICJmeGpzL2pzX3Jlc291cmNlcy5jcHAiLAorICAgICAgImZ4anMvanNfcmVzb3VyY2VzLmgiLAogICAgIF0KLSAgICBjb25maWdzICs9IFsgIjpwZGZpdW1fY29yZV9jb25maWciIF0KLSAgICBkZXBzID0gWworICAgIGRlcHMgKz0gWwogICAgICAgIjpmeGNydCIsCiAgICAgICAiLy92OCIsCiAgICAgICAiLy92ODp2OF9saWJwbGF0Zm9ybSIsCiAgICAgXQorICAgIGNvbmZpZ3MgKz0gWyAiLy92ODpleHRlcm5hbF9zdGFydHVwX2RhdGEiIF0KICAgICBpbmNsdWRlX2RpcnMgPSBbCiAgICAgICAiLy92OCIsCiAgICAgICAiLy92OC9pbmNsdWRlIiwKQEAgLTExMDksMjAgKzEyOTUsMzYyIEBACiAgICAgICAgICJmeGpzL2NmeGpzZV9jbGFzcy5oIiwKICAgICAgICAgImZ4anMvY2Z4anNlX2NvbnRleHQuY3BwIiwKICAgICAgICAgImZ4anMvY2Z4anNlX2NvbnRleHQuaCIsCi0gICAgICAgICJmeGpzL2NmeGpzZV9pc29sYXRldHJhY2tlci5jcHAiLAorICAgICAgICAiZnhqcy9jZnhqc2VfZW5naW5lLmNwcCIsCisgICAgICAgICJmeGpzL2NmeGpzZV9lbmdpbmUuaCIsCisgICAgICAgICJmeGpzL2NmeGpzZV9mb3JtY2FsY19jb250ZXh0LmNwcCIsCisgICAgICAgICJmeGpzL2NmeGpzZV9mb3JtY2FsY19jb250ZXh0LmgiLAogICAgICAgICAiZnhqcy9jZnhqc2VfaXNvbGF0ZXRyYWNrZXIuaCIsCisgICAgICAgICJmeGpzL2NmeGpzZV9yZXNvbHZlcHJvY2Vzc29yLmNwcCIsCisgICAgICAgICJmeGpzL2NmeGpzZV9yZXNvbHZlcHJvY2Vzc29yLmgiLAogICAgICAgICAiZnhqcy9jZnhqc2VfcnVudGltZWRhdGEuY3BwIiwKICAgICAgICAgImZ4anMvY2Z4anNlX3J1bnRpbWVkYXRhLmgiLAogICAgICAgICAiZnhqcy9jZnhqc2VfdmFsdWUuY3BwIiwKICAgICAgICAgImZ4anMvY2Z4anNlX3ZhbHVlLmgiLAogICAgICAgICAiZnhqcy9meGpzZS5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9hcmMuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9hcmMuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfYXJlYS5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2FyZWEuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfYXNzaXN0LmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfYXNzaXN0LmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2JhcmNvZGUuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9iYXJjb2RlLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2JpbmQuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9iaW5kLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2JpbmRpdGVtcy5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2JpbmRpdGVtcy5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9ib29rZW5kLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfYm9va2VuZC5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9ib29sZWFuLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfYm9vbGVhbi5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9ib3JkZXIuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9ib3JkZXIuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfYnJlYWsuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9icmVhay5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9icmVha2FmdGVyLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfYnJlYWthZnRlci5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9icmVha2JlZm9yZS5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2JyZWFrYmVmb3JlLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2J1dHRvbi5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2J1dHRvbi5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9jYWxjdWxhdGUuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9jYWxjdWxhdGUuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfY2FwdGlvbi5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2NhcHRpb24uaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfY2VydGlmaWNhdGUuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9jZXJ0aWZpY2F0ZS5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9jZXJ0aWZpY2F0ZXMuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9jZXJ0aWZpY2F0ZXMuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfY2hlY2tidXR0b24uY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9jaGVja2J1dHRvbi5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9jaG9pY2VsaXN0LmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfY2hvaWNlbGlzdC5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9jb2xvci5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2NvbG9yLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2NvbWIuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9jb21iLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2NvbW1hbmQuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9jb21tYW5kLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2Nvbm5lY3QuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9jb25uZWN0LmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2Nvbm5lY3RzdHJpbmcuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9jb25uZWN0c3RyaW5nLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2NvbnRhaW5lci5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2NvbnRhaW5lci5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9jb250ZW50LmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfY29udGVudC5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9jb250ZW50YXJlYS5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2NvbnRlbnRhcmVhLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2Nvcm5lci5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2Nvcm5lci5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9kYXRhdmFsdWUuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9kYXRhdmFsdWUuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZGF0YXdpbmRvdy5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2RhdGF3aW5kb3cuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZGF0ZS5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2RhdGUuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZGF0ZXRpbWUuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9kYXRldGltZS5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9kYXRldGltZWVkaXQuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9kYXRldGltZWVkaXQuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZGVjaW1hbC5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2RlY2ltYWwuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZGVmYXVsdHVpLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZGVmYXVsdHVpLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2RlbGV0ZS5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2RlbGV0ZS5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9kZWx0YS5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2RlbHRhLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2RlbHRhcy5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2RlbHRhcy5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9kZXNjLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZGVzYy5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9kaWdlc3RtZXRob2QuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9kaWdlc3RtZXRob2QuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZGlnZXN0bWV0aG9kcy5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2RpZ2VzdG1ldGhvZHMuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZHJhdy5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2RyYXcuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZWRnZS5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2VkZ2UuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZW5jb2RpbmcuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9lbmNvZGluZy5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9lbmNvZGluZ3MuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9lbmNvZGluZ3MuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZW5jcnlwdC5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2VuY3J5cHQuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZXZlbnQuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9ldmVudC5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9ldmVudHBzZXVkb21vZGVsLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZXZlbnRwc2V1ZG9tb2RlbC5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9leGNsZ3JvdXAuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9leGNsZ3JvdXAuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZXhkYXRhLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZXhkYXRhLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2V4ZWN1dGUuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9leGVjdXRlLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2V4b2JqZWN0LmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZXhvYmplY3QuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZXh0cmFzLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZXh0cmFzLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2ZpZWxkLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZmllbGQuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZmlsbC5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2ZpbGwuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZmlsdGVyLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZmlsdGVyLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2Zsb2F0LmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZmxvYXQuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZm9udC5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2ZvbnQuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZm9ybS5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2Zvcm0uaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZm9ybWF0LmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfZm9ybWF0LmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2hhbmRsZXIuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9oYW5kbGVyLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2hvc3Rwc2V1ZG9tb2RlbC5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2hvc3Rwc2V1ZG9tb2RlbC5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9pbWFnZS5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2ltYWdlLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2ltYWdlZWRpdC5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2ltYWdlZWRpdC5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9pbnNlcnQuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9pbnNlcnQuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfaW5zdGFuY2VtYW5hZ2VyLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfaW5zdGFuY2VtYW5hZ2VyLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2ludGVnZXIuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9pbnRlZ2VyLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2lzc3VlcnMuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9pc3N1ZXJzLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2l0ZW1zLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfaXRlbXMuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfa2VlcC5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2tlZXAuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfa2V5dXNhZ2UuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9rZXl1c2FnZS5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9sYXlvdXRwc2V1ZG9tb2RlbC5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2xheW91dHBzZXVkb21vZGVsLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2xpbmUuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9saW5lLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2xpbmVhci5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2xpbmVhci5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9saXN0LmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfbGlzdC5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9sb2dwc2V1ZG9tb2RlbC5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X2xvZ3BzZXVkb21vZGVsLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X21hbmlmZXN0LmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfbWFuaWZlc3QuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfbWFwLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfbWFwLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X21hcmdpbi5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X21hcmdpbi5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9tZHAuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9tZHAuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfbWVkaXVtLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfbWVkaXVtLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X21lc3NhZ2UuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9tZXNzYWdlLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X21vZGVsLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfbW9kZWwuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfbm9kZS5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X25vZGUuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfbnVtZXJpY2VkaXQuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9udW1lcmljZWRpdC5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9vYmplY3QuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9vYmplY3QuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfb2NjdXIuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9vY2N1ci5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9vaWQuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9vaWQuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfb2lkcy5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X29pZHMuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfb3BlcmF0aW9uLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfb3BlcmF0aW9uLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X292ZXJmbG93LmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfb3ZlcmZsb3cuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfcGFja2V0LmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfcGFja2V0LmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3BhZ2VhcmVhLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfcGFnZWFyZWEuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfcGFnZXNldC5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3BhZ2VzZXQuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfcGFyYS5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3BhcmEuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfcGFzc3dvcmQuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9wYXNzd29yZC5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9wYXNzd29yZGVkaXQuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9wYXNzd29yZGVkaXQuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfcGF0dGVybi5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3BhdHRlcm4uaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfcGljdHVyZS5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3BpY3R1cmUuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfcXVlcnkuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9xdWVyeS5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9yYWRpYWwuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9yYWRpYWwuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfcmVhc29uLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfcmVhc29uLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3JlYXNvbnMuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9yZWFzb25zLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3JlY29yZHNldC5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3JlY29yZHNldC5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9yZWN0YW5nbGUuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9yZWN0YW5nbGUuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfcmVmLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfcmVmLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3Jvb3RlbGVtZW50LmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfcm9vdGVsZW1lbnQuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfc2NyaXB0LmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfc2NyaXB0LmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3NlbGVjdC5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3NlbGVjdC5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9zZXRwcm9wZXJ0eS5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3NldHByb3BlcnR5LmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3NpZ25hdHVyZS5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3NpZ25hdHVyZS5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9zaWduYXR1cmVwcm9wZXJ0aWVzLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfc2lnbmF0dXJlcHJvcGVydGllcy5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3NpZ25hdHVyZXBzZXVkb21vZGVsLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3NpZ25kYXRhLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfc2lnbmRhdGEuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfc2lnbmluZy5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3NpZ25pbmcuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfc29hcGFjdGlvbi5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3NvYXBhY3Rpb24uaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfc29hcGFkZHJlc3MuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9zb2FwYWRkcmVzcy5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9zb2xpZC5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3NvbGlkLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3NvdXJjZS5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3NvdXJjZS5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9zb3VyY2VzZXQuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9zb3VyY2VzZXQuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfc3BlYWsuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9zcGVhay5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9zdGlwcGxlLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfc3RpcHBsZS5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9zdWJmb3JtLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfc3ViZm9ybS5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9zdWJmb3Jtc2V0LmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfc3ViZm9ybXNldC5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9zdWJqZWN0ZG4uY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF9zdWJqZWN0ZG4uaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfc3ViamVjdGRucy5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3N1YmplY3RkbnMuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfc3VibWl0LmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfc3VibWl0LmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3RlbXBsYXRlLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfdGVtcGxhdGUuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfdGV4dC5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3RleHQuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfdGV4dGVkaXQuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF90ZXh0ZWRpdC5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF90ZXh0bm9kZS5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3RleHRub2RlLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3RpbWUuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF90aW1lLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3RpbWVzdGFtcC5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3RpbWVzdGFtcC5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF90b29sdGlwLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfdG9vbHRpcC5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF90cmF2ZXJzYWwuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF90cmF2ZXJzYWwuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfdHJhdmVyc2UuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF90cmF2ZXJzZS5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF90cmVlLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfdHJlZS5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF90cmVlbGlzdC5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3RyZWVsaXN0LmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3VpLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfdWkuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfdXBkYXRlLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfdXBkYXRlLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3VyaS5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3VyaS5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF91c2VyLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfdXNlci5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF92YWxpZGF0ZS5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3ZhbGlkYXRlLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3ZhbHVlLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfdmFsdWUuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfdmFyaWFibGVzLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfdmFyaWFibGVzLmgiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3dzZGxhZGRyZXNzLmNwcCIsCisgICAgICAgICJmeGpzL3hmYS9janhfd3NkbGFkZHJlc3MuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfd3NkbGNvbm5lY3Rpb24uY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF93c2RsY29ubmVjdGlvbi5oIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF94ZmEuY3BwIiwKKyAgICAgICAgImZ4anMveGZhL2NqeF94ZmEuaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfeG1sY29ubmVjdGlvbi5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3htbGNvbm5lY3Rpb24uaCIsCisgICAgICAgICJmeGpzL3hmYS9janhfeHNkY29ubmVjdGlvbi5jcHAiLAorICAgICAgICAiZnhqcy94ZmEvY2p4X3hzZGNvbm5lY3Rpb24uaCIsCiAgICAgICBdCiAgICAgfQorICB9IGVsc2UgeworICAgIHNvdXJjZXMgKz0gWworICAgICAgImZ4anMvY2pzX2V2ZW50X2NvbnRleHRfc3R1Yi5jcHAiLAorICAgICAgImZ4anMvY2pzX2V2ZW50X2NvbnRleHRfc3R1Yi5oIiwKKyAgICAgICJmeGpzL2Nqc19ydW50aW1lc3R1Yi5jcHAiLAorICAgIF0KICAgfQogfQogCitqdW1ib19zdGF0aWNfbGlicmFyeSgiZm9ybWZpbGxlciIpIHsKKyAgc291cmNlcyA9IFsKKyAgICAiZnBkZnNkay9mb3JtZmlsbGVyL2NiYV9mb250bWFwLmNwcCIsCisgICAgImZwZGZzZGsvZm9ybWZpbGxlci9jYmFfZm9udG1hcC5oIiwKKyAgICAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfYnV0dG9uLmNwcCIsCisgICAgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2J1dHRvbi5oIiwKKyAgICAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfY2hlY2tib3guY3BwIiwKKyAgICAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfY2hlY2tib3guaCIsCisgICAgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2NvbWJvYm94LmNwcCIsCisgICAgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2NvbWJvYm94LmgiLAorICAgICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9mb3JtZmlsbGVyLmNwcCIsCisgICAgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2Zvcm1maWxsZXIuaCIsCisgICAgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2ludGVyYWN0aXZlZm9ybWZpbGxlci5jcHAiLAorICAgICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9pbnRlcmFjdGl2ZWZvcm1maWxsZXIuaCIsCisgICAgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2xpc3Rib3guY3BwIiwKKyAgICAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfbGlzdGJveC5oIiwKKyAgICAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfcHVzaGJ1dHRvbi5jcHAiLAorICAgICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9wdXNoYnV0dG9uLmgiLAorICAgICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9yYWRpb2J1dHRvbi5jcHAiLAorICAgICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9yYWRpb2J1dHRvbi5oIiwKKyAgICAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfdGV4dGZpZWxkLmNwcCIsCisgICAgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX3RleHRmaWVsZC5oIiwKKyAgICAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfdGV4dG9iamVjdC5jcHAiLAorICAgICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF90ZXh0b2JqZWN0LmgiLAorICBdCisgIGNvbmZpZ3MgKz0gWyAiOnBkZml1bV9jb3JlX2NvbmZpZyIgXQorICBkZXBzID0gWworICAgICI6ZnhjcnQiLAorICBdCit9CisKIGlmIChwZGZfZW5hYmxlX3hmYSkgewotICBzdGF0aWNfbGlicmFyeSgiZnBkZnhmYSIpIHsKKyAganVtYm9fc3RhdGljX2xpYnJhcnkoImZwZGZ4ZmEiKSB7CiAgICAgc291cmNlcyA9IFsKICAgICAgICJmcGRmc2RrL2ZwZGZ4ZmEvY3BkZnhmYV9jb250ZXh0LmNwcCIsCiAgICAgICAiZnBkZnNkay9mcGRmeGZhL2NwZGZ4ZmFfY29udGV4dC5oIiwKQEAgLTExNDEsMTA4ICsxNjY5LDE3NiBAQAogICAgIGNvbmZpZ3MgKz0gWyAiOnBkZml1bV9jb3JlX2NvbmZpZyIgXQogICB9CiAKKyAganVtYm9fc3RhdGljX2xpYnJhcnkoImZ4YmFyY29kZSIpIHsKKyAgICBzb3VyY2VzID0gWworICAgICAgImZ4YmFyY29kZS9CQ19MaWJyYXJ5LmNwcCIsCisgICAgICAiZnhiYXJjb2RlL0JDX0xpYnJhcnkuaCIsCisgICAgICAiZnhiYXJjb2RlL0JDX1R3b0RpbVdyaXRlci5jcHAiLAorICAgICAgImZ4YmFyY29kZS9CQ19Ud29EaW1Xcml0ZXIuaCIsCisgICAgICAiZnhiYXJjb2RlL0JDX1V0aWxDb2RpbmdDb252ZXJ0LmNwcCIsCisgICAgICAiZnhiYXJjb2RlL0JDX1V0aWxDb2RpbmdDb252ZXJ0LmgiLAorICAgICAgImZ4YmFyY29kZS9CQ19VdGlscy5jcHAiLAorICAgICAgImZ4YmFyY29kZS9CQ19Xcml0ZXIuY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvQkNfV3JpdGVyLmgiLAorICAgICAgImZ4YmFyY29kZS9jYmNfY29kYWJhci5jcHAiLAorICAgICAgImZ4YmFyY29kZS9jYmNfY29kYWJhci5oIiwKKyAgICAgICJmeGJhcmNvZGUvY2JjX2NvZGUxMjguY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvY2JjX2NvZGUxMjguaCIsCisgICAgICAiZnhiYXJjb2RlL2NiY19jb2RlMzkuY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvY2JjX2NvZGUzOS5oIiwKKyAgICAgICJmeGJhcmNvZGUvY2JjX2NvZGViYXNlLmNwcCIsCisgICAgICAiZnhiYXJjb2RlL2NiY19jb2RlYmFzZS5oIiwKKyAgICAgICJmeGJhcmNvZGUvY2JjX2RhdGFtYXRyaXguY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvY2JjX2RhdGFtYXRyaXguaCIsCisgICAgICAiZnhiYXJjb2RlL2NiY19lYW4xMy5jcHAiLAorICAgICAgImZ4YmFyY29kZS9jYmNfZWFuMTMuaCIsCisgICAgICAiZnhiYXJjb2RlL2NiY19lYW44LmNwcCIsCisgICAgICAiZnhiYXJjb2RlL2NiY19lYW44LmgiLAorICAgICAgImZ4YmFyY29kZS9jYmNfb25lY29kZS5jcHAiLAorICAgICAgImZ4YmFyY29kZS9jYmNfb25lY29kZS5oIiwKKyAgICAgICJmeGJhcmNvZGUvY2JjX3BkZjQxN2kuY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvY2JjX3BkZjQxN2kuaCIsCisgICAgICAiZnhiYXJjb2RlL2NiY19xcmNvZGUuY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvY2JjX3FyY29kZS5oIiwKKyAgICAgICJmeGJhcmNvZGUvY2JjX3VwY2EuY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvY2JjX3VwY2EuaCIsCisgICAgICAiZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRBcnJheS5jcHAiLAorICAgICAgImZ4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0QXJyYXkuaCIsCisgICAgICAiZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIiwKKyAgICAgICJmeGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVBcnJheS5jcHAiLAorICAgICAgImZ4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZUFycmF5LmgiLAorICAgICAgImZ4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5jcHAiLAorICAgICAgImZ4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5oIiwKKyAgICAgICJmeGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uLmNwcCIsCisgICAgICAiZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbi5oIiwKKyAgICAgICJmeGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTYuY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTYuaCIsCisgICAgICAiZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2UG9seS5jcHAiLAorICAgICAgImZ4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuaCIsCisgICAgICAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQVNDSUlFbmNvZGVyLmNwcCIsCisgICAgICAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQVNDSUlFbmNvZGVyLmgiLAorICAgICAgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Jhc2UyNTZFbmNvZGVyLmNwcCIsCisgICAgICAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQmFzZTI1NkVuY29kZXIuaCIsCisgICAgICAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQzQwRW5jb2Rlci5jcHAiLAorICAgICAgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0M0MEVuY29kZXIuaCIsCisgICAgICAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQuY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NC5oIiwKKyAgICAgICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4V3JpdGVyLmNwcCIsCisgICAgICAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFdyaXRlci5oIiwKKyAgICAgICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EZWZhdWx0UGxhY2VtZW50LmNwcCIsCisgICAgICAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGVmYXVsdFBsYWNlbWVudC5oIiwKKyAgICAgICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FZGlmYWN0RW5jb2Rlci5jcHAiLAorICAgICAgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VkaWZhY3RFbmNvZGVyLmgiLAorICAgICAgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmgiLAorICAgICAgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXJDb250ZXh0LmNwcCIsCisgICAgICAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2RlckNvbnRleHQuaCIsCisgICAgICAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRXJyb3JDb3JyZWN0aW9uLmNwcCIsCisgICAgICAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRXJyb3JDb3JyZWN0aW9uLmgiLAorICAgICAgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0hpZ2hMZXZlbEVuY29kZXIuY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19IaWdoTGV2ZWxFbmNvZGVyLmgiLAorICAgICAgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmgiLAorICAgICAgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX1RleHRFbmNvZGVyLmNwcCIsCisgICAgICAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfVGV4dEVuY29kZXIuaCIsCisgICAgICAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfWDEyRW5jb2Rlci5jcHAiLAorICAgICAgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX1gxMkVuY29kZXIuaCIsCisgICAgICAiZnhiYXJjb2RlL29uZWQvQkNfT25lRGltV3JpdGVyLmNwcCIsCisgICAgICAiZnhiYXJjb2RlL29uZWQvQkNfT25lRGltV3JpdGVyLmgiLAorICAgICAgImZ4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyV3JpdGVyLmNwcCIsCisgICAgICAiZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJXcml0ZXIuaCIsCisgICAgICAiZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhXcml0ZXIuY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTEyOFdyaXRlci5oIiwKKyAgICAgICJmeGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTM5V3JpdGVyLmNwcCIsCisgICAgICAiZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVdyaXRlci5oIiwKKyAgICAgICJmeGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNXcml0ZXIuY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNXcml0ZXIuaCIsCisgICAgICAiZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjhXcml0ZXIuY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFdyaXRlci5oIiwKKyAgICAgICJmeGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOQ2hlY2tzdW0uY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOQ2hlY2tzdW0uaCIsCisgICAgICAiZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FXcml0ZXIuY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvb25lZC9CQ19PbmVkVVBDQVdyaXRlci5oIiwKKyAgICAgICJmeGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxNy5jcHAiLAorICAgICAgImZ4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3LmgiLAorICAgICAgImZ4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZU1hdHJpeC5jcHAiLAorICAgICAgImZ4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZU1hdHJpeC5oIiwKKyAgICAgICJmeGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVSb3cuY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVSb3cuaCIsCisgICAgICAiZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21wYWN0aW9uLmNwcCIsCisgICAgICAiZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21wYWN0aW9uLmgiLAorICAgICAgImZ4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uLmNwcCIsCisgICAgICAiZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFcnJvckNvcnJlY3Rpb24uaCIsCisgICAgICAiZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyLmNwcCIsCisgICAgICAiZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyLmgiLAorICAgICAgImZ4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3V3JpdGVyLmNwcCIsCisgICAgICAiZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdXcml0ZXIuaCIsCisgICAgICAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVXcml0ZXIuY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZVdyaXRlci5oIiwKKyAgICAgICJmeGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXIuY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXIuaCIsCisgICAgICAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQml0VmVjdG9yLmNwcCIsCisgICAgICAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQml0VmVjdG9yLmgiLAorICAgICAgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJsb2NrUGFpci5jcHAiLAorICAgICAgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJsb2NrUGFpci5oIiwKKyAgICAgICJmeGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrcy5jcHAiLAorICAgICAgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQmxvY2tzLmgiLAorICAgICAgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQmxvY2tzRGF0YS5jcHAiLAorICAgICAgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQmxvY2tzRGF0YS5oIiwKKyAgICAgICJmeGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFbmNvZGVyLmNwcCIsCisgICAgICAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRW5jb2Rlci5oIiwKKyAgICAgICJmeGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbC5jcHAiLAorICAgICAgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmgiLAorICAgICAgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hc2tVdGlsLmNwcCIsCisgICAgICAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWFza1V0aWwuaCIsCisgICAgICAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWF0cml4VXRpbC5jcHAiLAorICAgICAgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hdHJpeFV0aWwuaCIsCisgICAgICAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTW9kZS5jcHAiLAorICAgICAgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1vZGUuaCIsCisgICAgICAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyVmVyc2lvbi5jcHAiLAorICAgICAgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlclZlcnNpb24uaCIsCisgICAgICAiZnhiYXJjb2RlL3V0aWxzLmgiLAorICAgIF0KKyAgICBkZXBzID0gWworICAgICAgIjpmeGNydCIsCisgICAgXQorICAgIGNvbmZpZ3MgKz0gWyAiOnBkZml1bV9jb3JlX2NvbmZpZyIgXQorICB9CisKKyAgIyBUT0RPKGNyYnVnLmNvbS9wZGZpdW0vOTY0KTogU3VwcG9ydCBqdW1ibyBidWlsZHMuCiAgIHN0YXRpY19saWJyYXJ5KCJ4ZmEiKSB7CiAgICAgc291cmNlcyA9IFsKLSAgICAgICJ4ZmEvZmRlL2NmZGVfcGF0aC5jcHAiLAotICAgICAgInhmYS9mZGUvY2ZkZV9wYXRoLmgiLAotICAgICAgInhmYS9mZGUvY2ZkZV90eHRlZHRidWYuY3BwIiwKLSAgICAgICJ4ZmEvZmRlL2NmZGVfdHh0ZWR0YnVmLmgiLAotICAgICAgInhmYS9mZGUvY2ZkZV90eHRlZHRkb3JlY29yZF9kZWxldGVyYW5nZS5jcHAiLAotICAgICAgInhmYS9mZGUvY2ZkZV90eHRlZHRkb3JlY29yZF9kZWxldGVyYW5nZS5oIiwKLSAgICAgICJ4ZmEvZmRlL2NmZGVfdHh0ZWR0ZG9yZWNvcmRfaW5zZXJ0LmNwcCIsCi0gICAgICAieGZhL2ZkZS9jZmRlX3R4dGVkdGRvcmVjb3JkX2luc2VydC5oIiwKLSAgICAgICJ4ZmEvZmRlL2NmZGVfdHh0ZWR0ZW5naW5lLmNwcCIsCi0gICAgICAieGZhL2ZkZS9jZmRlX3R4dGVkdGVuZ2luZS5oIiwKLSAgICAgICJ4ZmEvZmRlL2NmZGVfdHh0ZWR0cGFnZS5jcHAiLAotICAgICAgInhmYS9mZGUvY2ZkZV90eHRlZHRwYWdlLmgiLAotICAgICAgInhmYS9mZGUvY2ZkZV90eHRlZHRwYXJhZy5jcHAiLAotICAgICAgInhmYS9mZGUvY2ZkZV90eHRlZHRwYXJhZy5oIiwKLSAgICAgICJ4ZmEvZmRlL2NmZGVfdHh0ZWR0dGV4dHNldC5jcHAiLAotICAgICAgInhmYS9mZGUvY2ZkZV90eHRlZHR0ZXh0c2V0LmgiLAotICAgICAgInhmYS9mZGUvY2Z4X2NoYXJpdGVyLmNwcCIsCi0gICAgICAieGZhL2ZkZS9jZnhfY2hhcml0ZXIuaCIsCi0gICAgICAieGZhL2ZkZS9jZnhfd29yZGJyZWFrLmNwcCIsCi0gICAgICAieGZhL2ZkZS9jZnhfd29yZGJyZWFrLmgiLAotICAgICAgInhmYS9mZGUvY3NzL2NmZGVfY3NzY29sb3J2YWx1ZS5jcHAiLAotICAgICAgInhmYS9mZGUvY3NzL2NmZGVfY3NzY29sb3J2YWx1ZS5oIiwKLSAgICAgICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc2NvbXB1dGVkc3R5bGUuY3BwIiwKLSAgICAgICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc2NvbXB1dGVkc3R5bGUuaCIsCi0gICAgICAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NjdXN0b21wcm9wZXJ0eS5jcHAiLAotICAgICAgInhmYS9mZGUvY3NzL2NmZGVfY3NzY3VzdG9tcHJvcGVydHkuaCIsCi0gICAgICAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NkZWNsYXJhdGlvbi5jcHAiLAotICAgICAgInhmYS9mZGUvY3NzL2NmZGVfY3NzZGVjbGFyYXRpb24uaCIsCi0gICAgICAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NlbnVtdmFsdWUuY3BwIiwKLSAgICAgICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc2VudW12YWx1ZS5oIiwKLSAgICAgICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc251bWJlcnZhbHVlLmNwcCIsCi0gICAgICAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NudW1iZXJ2YWx1ZS5oIiwKLSAgICAgICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3Byb3BlcnR5aG9sZGVyLmNwcCIsCi0gICAgICAieGZhL2ZkZS9jc3MvY2ZkZV9jc3Nwcm9wZXJ0eWhvbGRlci5oIiwKLSAgICAgICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3J1bGVjb2xsZWN0aW9uLmNwcCIsCi0gICAgICAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NydWxlY29sbGVjdGlvbi5oIiwKLSAgICAgICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3NlbGVjdG9yLmNwcCIsCi0gICAgICAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NzZWxlY3Rvci5oIiwKLSAgICAgICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N0cmluZ3ZhbHVlLmNwcCIsCi0gICAgICAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NzdHJpbmd2YWx1ZS5oIiwKLSAgICAgICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N0eWxlcnVsZS5jcHAiLAotICAgICAgInhmYS9mZGUvY3NzL2NmZGVfY3Nzc3R5bGVydWxlLmgiLAotICAgICAgInhmYS9mZGUvY3NzL2NmZGVfY3Nzc3R5bGVzZWxlY3Rvci5jcHAiLAotICAgICAgInhmYS9mZGUvY3NzL2NmZGVfY3Nzc3R5bGVzZWxlY3Rvci5oIiwKLSAgICAgICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N0eWxlc2hlZXQuY3BwIiwKLSAgICAgICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N0eWxlc2hlZXQuaCIsCi0gICAgICAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NzeW50YXhwYXJzZXIuY3BwIiwKLSAgICAgICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N5bnRheHBhcnNlci5oIiwKLSAgICAgICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3RleHRidWYuY3BwIiwKLSAgICAgICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3RleHRidWYuaCIsCi0gICAgICAieGZhL2ZkZS9jc3MvY2ZkZV9jc3N2YWx1ZS5jcHAiLAotICAgICAgInhmYS9mZGUvY3NzL2NmZGVfY3NzdmFsdWUuaCIsCi0gICAgICAieGZhL2ZkZS9jc3MvY2ZkZV9jc3N2YWx1ZWxpc3QuY3BwIiwKLSAgICAgICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3ZhbHVlbGlzdC5oIiwKLSAgICAgICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3ZhbHVlbGlzdHBhcnNlci5jcHAiLAotICAgICAgInhmYS9mZGUvY3NzL2NmZGVfY3NzdmFsdWVsaXN0cGFyc2VyLmgiLAotICAgICAgInhmYS9mZGUvY3NzL2ZkZV9jc3MuaCIsCi0gICAgICAieGZhL2ZkZS9jc3MvZmRlX2Nzc2RhdGF0YWJsZS5jcHAiLAotICAgICAgInhmYS9mZGUvY3NzL2ZkZV9jc3NkYXRhdGFibGUuaCIsCi0gICAgICAieGZhL2ZkZS9mZGVfZ2VkZXZpY2UuY3BwIiwKLSAgICAgICJ4ZmEvZmRlL2ZkZV9pdGVyYXRvci5jcHAiLAotICAgICAgInhmYS9mZGUvZmRlX2l0ZXJhdG9yLmgiLAotICAgICAgInhmYS9mZGUvZmRlX29iamVjdC5oIiwKLSAgICAgICJ4ZmEvZmRlL2ZkZV9yZW5kZXIuY3BwIiwKLSAgICAgICJ4ZmEvZmRlL2ZkZV9yZW5kZXIuaCIsCi0gICAgICAieGZhL2ZkZS9pZmRlX3R4dGVkdGRvcmVjb3JkLmgiLAotICAgICAgInhmYS9mZGUvaWZkZV90eHRlZHRlbmdpbmUuaCIsCi0gICAgICAieGZhL2ZkZS9pZmRlX3R4dGVkdHBhZ2UuaCIsCi0gICAgICAieGZhL2ZkZS9pZnhfY2hhcml0ZXIuaCIsCi0gICAgICAieGZhL2ZkZS90dG8vZmRlX3RleHRvdXQuY3BwIiwKLSAgICAgICJ4ZmEvZmRlL3R0by9mZGVfdGV4dG91dC5oIiwKLSAgICAgICJ4ZmEvZmRlL3htbC9jZnhfc2F4cmVhZGVyLmNwcCIsCi0gICAgICAieGZhL2ZkZS94bWwvY2Z4X3NheHJlYWRlci5oIiwKLSAgICAgICJ4ZmEvZmRlL3htbC9mZGVfeG1sLmgiLAotICAgICAgInhmYS9mZGUveG1sL2ZkZV94bWxfaW1wLmNwcCIsCi0gICAgICAieGZhL2ZkZS94bWwvZmRlX3htbF9pbXAuaCIsCi0gICAgICAieGZhL2ZnYXMvY3J0L2ZnYXNfY29kZXBhZ2UuY3BwIiwKLSAgICAgICJ4ZmEvZmdhcy9jcnQvZmdhc19jb2RlcGFnZS5oIiwKLSAgICAgICJ4ZmEvZmdhcy9jcnQvZmdhc19sYW5ndWFnZS5oIiwKLSAgICAgICJ4ZmEvZmdhcy9jcnQvZmdhc19zdHJlYW0uY3BwIiwKLSAgICAgICJ4ZmEvZmdhcy9jcnQvZmdhc19zdHJlYW0uaCIsCi0gICAgICAieGZhL2ZnYXMvY3J0L2ZnYXNfdXRpbHMuY3BwIiwKLSAgICAgICJ4ZmEvZmdhcy9jcnQvZmdhc191dGlscy5oIiwKKyAgICAgICJ4ZmEvZmRlL2NmZGVfdGV4dGVkaXRlbmdpbmUuY3BwIiwKKyAgICAgICJ4ZmEvZmRlL2NmZGVfdGV4dGVkaXRlbmdpbmUuaCIsCisgICAgICAieGZhL2ZkZS9jZmRlX3RleHRvdXQuY3BwIiwKKyAgICAgICJ4ZmEvZmRlL2NmZGVfdGV4dG91dC5oIiwKKyAgICAgICJ4ZmEvZmRlL2NmZGVfd29yZGJyZWFrX2RhdGEuY3BwIiwKKyAgICAgICJ4ZmEvZmRlL2NmZGVfd29yZGJyZWFrX2RhdGEuaCIsCisgICAgICAieGZhL2ZnYXMvY3J0L2NmZ2FzX2Zvcm1hdHN0cmluZy5jcHAiLAorICAgICAgInhmYS9mZ2FzL2NydC9jZmdhc19mb3JtYXRzdHJpbmcuaCIsCisgICAgICAieGZhL2ZnYXMvZm9udC9jZmdhc19kZWZhdWx0Zm9udG1hbmFnZXIuY3BwIiwKKyAgICAgICJ4ZmEvZmdhcy9mb250L2NmZ2FzX2RlZmF1bHRmb250bWFuYWdlci5oIiwKICAgICAgICJ4ZmEvZmdhcy9mb250L2NmZ2FzX2ZvbnRtZ3IuY3BwIiwKICAgICAgICJ4ZmEvZmdhcy9mb250L2NmZ2FzX2ZvbnRtZ3IuaCIsCiAgICAgICAieGZhL2ZnYXMvZm9udC9jZmdhc19nZWZvbnQuY3BwIiwKICAgICAgICJ4ZmEvZmdhcy9mb250L2NmZ2FzX2dlZm9udC5oIiwKKyAgICAgICJ4ZmEvZmdhcy9mb250L2NmZ2FzX3BkZmZvbnRtZ3IuY3BwIiwKKyAgICAgICJ4ZmEvZmdhcy9mb250L2NmZ2FzX3BkZmZvbnRtZ3IuaCIsCiAgICAgICAieGZhL2ZnYXMvZm9udC9mZ2FzX2ZvbnR1dGlscy5jcHAiLAogICAgICAgInhmYS9mZ2FzL2ZvbnQvZmdhc19mb250dXRpbHMuaCIsCi0gICAgICAieGZhL2ZnYXMvbGF5b3V0L2ZnYXNfbGluZWJyZWFrLmNwcCIsCi0gICAgICAieGZhL2ZnYXMvbGF5b3V0L2ZnYXNfbGluZWJyZWFrLmgiLAotICAgICAgInhmYS9mZ2FzL2xheW91dC9mZ2FzX3J0ZmJyZWFrLmNwcCIsCi0gICAgICAieGZhL2ZnYXMvbGF5b3V0L2ZnYXNfcnRmYnJlYWsuaCIsCi0gICAgICAieGZhL2ZnYXMvbGF5b3V0L2ZnYXNfdGV4dGJyZWFrLmNwcCIsCi0gICAgICAieGZhL2ZnYXMvbGF5b3V0L2ZnYXNfdGV4dGJyZWFrLmgiLAotICAgICAgInhmYS9mZ2FzL2xvY2FsaXphdGlvbi9mZ2FzX2RhdGV0aW1lLmNwcCIsCi0gICAgICAieGZhL2ZnYXMvbG9jYWxpemF0aW9uL2ZnYXNfZGF0ZXRpbWUuaCIsCi0gICAgICAieGZhL2ZnYXMvbG9jYWxpemF0aW9uL2ZnYXNfbG9jYWxlLmNwcCIsCi0gICAgICAieGZhL2ZnYXMvbG9jYWxpemF0aW9uL2ZnYXNfbG9jYWxlLmgiLAotICAgICAgInhmYS9mZ2FzL2xvY2FsaXphdGlvbi9mZ2FzX2xvY2FsZWltcC5oIiwKKyAgICAgICJ4ZmEvZmdhcy9sYXlvdXQvY2Z4X2JyZWFrLmNwcCIsCisgICAgICAieGZhL2ZnYXMvbGF5b3V0L2NmeF9icmVhay5oIiwKKyAgICAgICJ4ZmEvZmdhcy9sYXlvdXQvY2Z4X2JyZWFrbGluZS5jcHAiLAorICAgICAgInhmYS9mZ2FzL2xheW91dC9jZnhfYnJlYWtsaW5lLmgiLAorICAgICAgInhmYS9mZ2FzL2xheW91dC9jZnhfYnJlYWtwaWVjZS5jcHAiLAorICAgICAgInhmYS9mZ2FzL2xheW91dC9jZnhfYnJlYWtwaWVjZS5oIiwKKyAgICAgICJ4ZmEvZmdhcy9sYXlvdXQvY2Z4X2xpbmVicmVhay5jcHAiLAorICAgICAgInhmYS9mZ2FzL2xheW91dC9jZnhfbGluZWJyZWFrLmgiLAorICAgICAgInhmYS9mZ2FzL2xheW91dC9jZnhfcnRmYnJlYWsuY3BwIiwKKyAgICAgICJ4ZmEvZmdhcy9sYXlvdXQvY2Z4X3J0ZmJyZWFrLmgiLAorICAgICAgInhmYS9mZ2FzL2xheW91dC9jZnhfdHh0YnJlYWsuY3BwIiwKKyAgICAgICJ4ZmEvZmdhcy9sYXlvdXQvY2Z4X3R4dGJyZWFrLmgiLAogICAgICAgInhmYS9md2wvY2Z3bF9hcHAuY3BwIiwKICAgICAgICJ4ZmEvZndsL2Nmd2xfYXBwLmgiLAogICAgICAgInhmYS9md2wvY2Z3bF9iYXJjb2RlLmNwcCIsCkBAIC0xMzEzLDggKzE5MDksNiBAQAogICAgICAgInhmYS9md2wvY2Z3bF9wdXNoYnV0dG9uLmgiLAogICAgICAgInhmYS9md2wvY2Z3bF9zY3JvbGxiYXIuY3BwIiwKICAgICAgICJ4ZmEvZndsL2Nmd2xfc2Nyb2xsYmFyLmgiLAotICAgICAgInhmYS9md2wvY2Z3bF9zcGluYnV0dG9uLmNwcCIsCi0gICAgICAieGZhL2Z3bC9jZndsX3NwaW5idXR0b24uaCIsCiAgICAgICAieGZhL2Z3bC9jZndsX3RoZW1lYmFja2dyb3VuZC5oIiwKICAgICAgICJ4ZmEvZndsL2Nmd2xfdGhlbWVwYXJ0LmNwcCIsCiAgICAgICAieGZhL2Z3bC9jZndsX3RoZW1lcGFydC5oIiwKQEAgLTEzMzYsNyArMTkzMCw2IEBACiAgICAgICAieGZhL2Z3bC9pZndsX2FkYXB0ZXJ0aW1lcm1nci5oIiwKICAgICAgICJ4ZmEvZndsL2lmd2xfdGhlbWVwcm92aWRlci5oIiwKICAgICAgICJ4ZmEvZndsL2lmd2xfd2lkZ2V0ZGVsZWdhdGUuaCIsCi0gICAgICAieGZhL2Z3bC9pZndsX3dpZGdldG1ncmRlbGVnYXRlLmgiLAogICAgICAgInhmYS9md2wvdGhlbWUvY2Z3bF9iYXJjb2RldHAuY3BwIiwKICAgICAgICJ4ZmEvZndsL3RoZW1lL2Nmd2xfYmFyY29kZXRwLmgiLAogICAgICAgInhmYS9md2wvdGhlbWUvY2Z3bF9jYXJldHRwLmNwcCIsCkBAIC0xMzYyLDIyMSArMTk1NSwxMDggQEAKICAgICAgICJ4ZmEvZndsL3RoZW1lL2Nmd2xfdXRpbHMuaCIsCiAgICAgICAieGZhL2Z3bC90aGVtZS9jZndsX3dpZGdldHRwLmNwcCIsCiAgICAgICAieGZhL2Z3bC90aGVtZS9jZndsX3dpZGdldHRwLmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvQkNfRGltZW5zaW9uLmNwcCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9CQ19EaW1lbnNpb24uaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9CQ19MaWJyYXJ5LmNwcCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9CQ19MaWJyYXJ5LmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvQkNfVHdvRGltV3JpdGVyLmNwcCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9CQ19Ud29EaW1Xcml0ZXIuaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9CQ19VdGlsQ29kaW5nQ29udmVydC5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9CQ19VdGlscy5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvQkNfV3JpdGVyLmNwcCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9CQ19Xcml0ZXIuaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9jYmNfY29kYWJhci5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvY2JjX2NvZGFiYXIuaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9jYmNfY29kZTEyOC5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvY2JjX2NvZGUxMjguaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9jYmNfY29kZTM5LmNwcCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9jYmNfY29kZTM5LmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvY2JjX2NvZGViYXNlLmNwcCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9jYmNfY29kZWJhc2UuaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9jYmNfZGF0YW1hdHJpeC5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvY2JjX2RhdGFtYXRyaXguaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9jYmNfZWFuMTMuY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2NiY19lYW4xMy5oIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2NiY19lYW44LmNwcCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9jYmNfZWFuOC5oIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2NiY19vbmVjb2RlLmNwcCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9jYmNfb25lY29kZS5oIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2NiY19wZGY0MTdpLmNwcCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9jYmNfcGRmNDE3aS5oIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2NiY19xcmNvZGUuY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2NiY19xcmNvZGUuaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9jYmNfdXBjYS5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvY2JjX3VwY2EuaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0QXJyYXkuY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRBcnJheS5oIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZUFycmF5LmNwcCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZUFycmF5LmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVNYXRyaXguY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlTWF0cml4LmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uLmNwcCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb24uaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1Ni5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTYuaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2UG9seS5oIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQVNDSUlFbmNvZGVyLmNwcCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0FTQ0lJRW5jb2Rlci5oIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQmFzZTI1NkVuY29kZXIuY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQmFzZTI1NkVuY29kZXIuaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0M0MEVuY29kZXIuY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQzQwRW5jb2Rlci5oIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQuY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQuaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhXcml0ZXIuY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFdyaXRlci5oIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGVmYXVsdFBsYWNlbWVudC5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EZWZhdWx0UGxhY2VtZW50LmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FZGlmYWN0RW5jb2Rlci5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FZGlmYWN0RW5jb2Rlci5oIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2Rlci5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyQ29udGV4dC5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyQ29udGV4dC5oIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRXJyb3JDb3JyZWN0aW9uLmNwcCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Vycm9yQ29ycmVjdGlvbi5oIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfSGlnaExldmVsRW5jb2Rlci5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19IaWdoTGV2ZWxFbmNvZGVyLmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmNwcCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbFNoYXBlSGludC5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xTaGFwZUhpbnQuaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1RleHRFbmNvZGVyLmNwcCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1RleHRFbmNvZGVyLmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19YMTJFbmNvZGVyLmNwcCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1gxMkVuY29kZXIuaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyV3JpdGVyLmNwcCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyV3JpdGVyLmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTEyOFdyaXRlci5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTEyOFdyaXRlci5oIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVdyaXRlci5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTM5V3JpdGVyLmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNXcml0ZXIuY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzV3JpdGVyLmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFdyaXRlci5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFdyaXRlci5oIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FXcml0ZXIuY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FXcml0ZXIuaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3LmNwcCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3LmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNYXRyaXguY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWF0cml4LmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVSb3cuY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlUm93LmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbXBhY3Rpb24uY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21wYWN0aW9uLmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbi5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbi5oIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyLmNwcCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5oIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdXcml0ZXIuY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdXcml0ZXIuaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlV3JpdGVyLmNwcCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlV3JpdGVyLmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXIuY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyLmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCaXRWZWN0b3IuY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQml0VmVjdG9yLmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCbG9ja1BhaXIuY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQmxvY2tQYWlyLmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0IuY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCLmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrcy5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrcy5oIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRW5jb2Rlci5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFbmNvZGVyLmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbC5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbC5oIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWFza1V0aWwuY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWFza1V0aWwuaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hdHJpeFV0aWwuY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWF0cml4VXRpbC5oIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTW9kZS5jcHAiLAotICAgICAgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNb2RlLmgiLAotICAgICAgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJWZXJzaW9uLmNwcCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlclZlcnNpb24uaCIsCi0gICAgICAieGZhL2Z4YmFyY29kZS91dGlscy5oIiwKLSAgICAgICJ4ZmEvZnhmYS9hcHAvY3hmYV9jc3N0YWdwcm92aWRlci5jcHAiLAotICAgICAgInhmYS9meGZhL2FwcC9jeGZhX2Nzc3RhZ3Byb3ZpZGVyLmgiLAotICAgICAgInhmYS9meGZhL2FwcC9jeGZhX2V2ZW50cGFyYW0uY3BwIiwKLSAgICAgICJ4ZmEvZnhmYS9hcHAvY3hmYV9saW5rdXNlcmRhdGEuY3BwIiwKLSAgICAgICJ4ZmEvZnhmYS9hcHAvY3hmYV9saW5rdXNlcmRhdGEuaCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL2N4ZmFfbG9hZGVyY29udGV4dC5jcHAiLAotICAgICAgInhmYS9meGZhL2FwcC9jeGZhX2xvYWRlcmNvbnRleHQuaCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL2N4ZmFfcGllY2VsaW5lLmNwcCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL2N4ZmFfcGllY2VsaW5lLmgiLAotICAgICAgInhmYS9meGZhL2FwcC9jeGZhX3RleHRsYXlvdXQuY3BwIiwKLSAgICAgICJ4ZmEvZnhmYS9hcHAvY3hmYV90ZXh0bGF5b3V0LmgiLAotICAgICAgInhmYS9meGZhL2FwcC9jeGZhX3RleHRwYXJzZWNvbnRleHQuY3BwIiwKLSAgICAgICJ4ZmEvZnhmYS9hcHAvY3hmYV90ZXh0cGFyc2Vjb250ZXh0LmgiLAotICAgICAgInhmYS9meGZhL2FwcC9jeGZhX3RleHRwYXJzZXIuY3BwIiwKLSAgICAgICJ4ZmEvZnhmYS9hcHAvY3hmYV90ZXh0cGFyc2VyLmgiLAotICAgICAgInhmYS9meGZhL2FwcC9jeGZhX3RleHR0YWJzdG9wc2NvbnRleHQuY3BwIiwKLSAgICAgICJ4ZmEvZnhmYS9hcHAvY3hmYV90ZXh0dGFic3RvcHNjb250ZXh0LmgiLAotICAgICAgInhmYS9meGZhL2FwcC9jeGZhX3RleHR1c2VyZGF0YS5jcHAiLAotICAgICAgInhmYS9meGZhL2FwcC9jeGZhX3RleHR1c2VyZGF0YS5oIiwKLSAgICAgICJ4ZmEvZnhmYS9hcHAveGZhX2NoZWNrc3VtLmNwcCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL3hmYV9mZmFwcC5jcHAiLAotICAgICAgInhmYS9meGZhL2FwcC94ZmFfZmZiYXJjb2RlLmNwcCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL3hmYV9mZmJhcmNvZGUuaCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL3hmYV9mZmNoZWNrYnV0dG9uLmNwcCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL3hmYV9mZmNoZWNrYnV0dG9uLmgiLAotICAgICAgInhmYS9meGZhL2FwcC94ZmFfZmZjaG9pY2VsaXN0LmNwcCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL3hmYV9mZmNob2ljZWxpc3QuaCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL3hmYV9mZmRvYy5jcHAiLAotICAgICAgInhmYS9meGZhL2FwcC94ZmFfZmZkb2NoYW5kbGVyLmNwcCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL3hmYV9mZmRvY3ZpZXcuY3BwIiwKLSAgICAgICJ4ZmEvZnhmYS9hcHAveGZhX2ZmZHJhdy5jcHAiLAotICAgICAgInhmYS9meGZhL2FwcC94ZmFfZmZkcmF3LmgiLAotICAgICAgInhmYS9meGZhL2FwcC94ZmFfZmZleGNsZ3JvdXAuY3BwIiwKLSAgICAgICJ4ZmEvZnhmYS9hcHAveGZhX2ZmZXhjbGdyb3VwLmgiLAotICAgICAgInhmYS9meGZhL2FwcC94ZmFfZmZmaWVsZC5jcHAiLAotICAgICAgInhmYS9meGZhL2FwcC94ZmFfZmZmaWVsZC5oIiwKLSAgICAgICJ4ZmEvZnhmYS9hcHAveGZhX2ZmaW1hZ2UuY3BwIiwKLSAgICAgICJ4ZmEvZnhmYS9hcHAveGZhX2ZmaW1hZ2UuaCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL3hmYV9mZmltYWdlZWRpdC5jcHAiLAotICAgICAgInhmYS9meGZhL2FwcC94ZmFfZmZpbWFnZWVkaXQuaCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL3hmYV9mZm5vdGlmeS5jcHAiLAotICAgICAgInhmYS9meGZhL2FwcC94ZmFfZmZub3RpZnkuaCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL3hmYV9mZnBhZ2V2aWV3LmNwcCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL3hmYV9mZnBhdGguY3BwIiwKLSAgICAgICJ4ZmEvZnhmYS9hcHAveGZhX2ZmcGF0aC5oIiwKLSAgICAgICJ4ZmEvZnhmYS9hcHAveGZhX2ZmcHVzaGJ1dHRvbi5jcHAiLAotICAgICAgInhmYS9meGZhL2FwcC94ZmFfZmZwdXNoYnV0dG9uLmgiLAotICAgICAgInhmYS9meGZhL2FwcC94ZmFfZmZzaWduYXR1cmUuY3BwIiwKLSAgICAgICJ4ZmEvZnhmYS9hcHAveGZhX2Zmc2lnbmF0dXJlLmgiLAotICAgICAgInhmYS9meGZhL2FwcC94ZmFfZmZzdWJmb3JtLmNwcCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL3hmYV9mZnN1YmZvcm0uaCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL3hmYV9mZnRleHQuY3BwIiwKLSAgICAgICJ4ZmEvZnhmYS9hcHAveGZhX2ZmdGV4dC5oIiwKLSAgICAgICJ4ZmEvZnhmYS9hcHAveGZhX2ZmdGV4dGVkaXQuY3BwIiwKLSAgICAgICJ4ZmEvZnhmYS9hcHAveGZhX2ZmdGV4dGVkaXQuaCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL3hmYV9mZndpZGdldC5jcHAiLAotICAgICAgInhmYS9meGZhL2FwcC94ZmFfZmZ3aWRnZXRhY2MuY3BwIiwKLSAgICAgICJ4ZmEvZnhmYS9hcHAveGZhX2Zmd2lkZ2V0YWNjLmgiLAotICAgICAgInhmYS9meGZhL2FwcC94ZmFfZmZ3aWRnZXRoYW5kbGVyLmNwcCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL3hmYV9mb250bWdyLmNwcCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL3hmYV9md2xhZGFwdGVyLmNwcCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL3hmYV9md2xhZGFwdGVyLmgiLAotICAgICAgInhmYS9meGZhL2FwcC94ZmFfZndsdGhlbWUuY3BwIiwKLSAgICAgICJ4ZmEvZnhmYS9hcHAveGZhX2Z3bHRoZW1lLmgiLAotICAgICAgInhmYS9meGZhL2FwcC94ZmFfcmVuZGVyY29udGV4dC5jcHAiLAotICAgICAgInhmYS9meGZhL2FwcC94ZmFfdGV4dHBpZWNlLmNwcCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL3hmYV90ZXh0cGllY2UuaCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV9ldmVudHBhcmFtLmNwcCIsCiAgICAgICAieGZhL2Z4ZmEvY3hmYV9ldmVudHBhcmFtLmgiLAotICAgICAgInhmYS9meGZhL2ZtMmpzL3hmYV9lcnJvci5jcHAiLAotICAgICAgInhmYS9meGZhL2ZtMmpzL3hmYV9lcnJvci5oIiwKLSAgICAgICJ4ZmEvZnhmYS9mbTJqcy94ZmFfZXhwcmVzc2lvbi5jcHAiLAotICAgICAgInhmYS9meGZhL2ZtMmpzL3hmYV9leHByZXNzaW9uLmgiLAotICAgICAgInhmYS9meGZhL2ZtMmpzL3hmYV9mbTJqc2NvbnRleHQuY3BwIiwKLSAgICAgICJ4ZmEvZnhmYS9mbTJqcy94ZmFfZm0yanNjb250ZXh0LmgiLAotICAgICAgInhmYS9meGZhL2ZtMmpzL3hmYV9mbXBhcnNlLmNwcCIsCi0gICAgICAieGZhL2Z4ZmEvZm0yanMveGZhX2ZtcGFyc2UuaCIsCi0gICAgICAieGZhL2Z4ZmEvZm0yanMveGZhX2xleGVyLmNwcCIsCi0gICAgICAieGZhL2Z4ZmEvZm0yanMveGZhX2xleGVyLmgiLAotICAgICAgInhmYS9meGZhL2ZtMmpzL3hmYV9wcm9ncmFtLmNwcCIsCi0gICAgICAieGZhL2Z4ZmEvZm0yanMveGZhX3Byb2dyYW0uaCIsCi0gICAgICAieGZhL2Z4ZmEvZm0yanMveGZhX3NpbXBsZWV4cHJlc3Npb24uY3BwIiwKLSAgICAgICJ4ZmEvZnhmYS9mbTJqcy94ZmFfc2ltcGxlZXhwcmVzc2lvbi5oIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2ZmYXBwLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV9mZmFwcC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2ZmYXJjLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV9mZmFyYy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2ZmYmFyY29kZS5jcHAiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZmZiYXJjb2RlLmgiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZmZjaGVja2J1dHRvbi5jcHAiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZmZjaGVja2J1dHRvbi5oIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2ZmY29tYm9ib3guY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2ZmY29tYm9ib3guaCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV9mZmRhdGV0aW1lZWRpdC5jcHAiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZmZkYXRldGltZWVkaXQuaCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV9mZmRvYy5jcHAiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZmZkb2MuaCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV9mZmRvY3ZpZXcuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2ZmZG9jdmlldy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2ZmZHJhdy5jcHAiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZmZkcmF3LmgiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZmZleGNsZ3JvdXAuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2ZmZXhjbGdyb3VwLmgiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZmZmaWVsZC5jcHAiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZmZmaWVsZC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2ZmaW1hZ2UuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2ZmaW1hZ2UuaCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV9mZmltYWdlZWRpdC5jcHAiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZmZpbWFnZWVkaXQuaCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV9mZmxpbmUuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2ZmbGluZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2ZmbGlzdGJveC5jcHAiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZmZsaXN0Ym94LmgiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZmZub3RpZnkuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2Zmbm90aWZ5LmgiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZmZudW1lcmljZWRpdC5jcHAiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZmZudW1lcmljZWRpdC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuaCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV9mZnBhc3N3b3JkZWRpdC5jcHAiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZmZwYXNzd29yZGVkaXQuaCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV9mZnB1c2hidXR0b24uY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2ZmcHVzaGJ1dHRvbi5oIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2ZmcmVjdGFuZ2xlLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV9mZnJlY3RhbmdsZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2Zmc2lnbmF0dXJlLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV9mZnNpZ25hdHVyZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2Zmc3ViZm9ybS5jcHAiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZmZzdWJmb3JtLmgiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZmZ0ZXh0LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV9mZnRleHQuaCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV9mZnRleHRlZGl0LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV9mZnRleHRlZGl0LmgiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZmZ3aWRnZXQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0LmgiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZmZ3aWRnZXRoYW5kbGVyLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV9mZndpZGdldGhhbmRsZXIuaCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV9mb250bWdyLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV9mb250bWdyLmgiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZndsYWRhcHRlcndpZGdldG1nci5jcHAiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZndsYWRhcHRlcndpZGdldG1nci5oIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2Z3bHRoZW1lLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV9md2x0aGVtZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2ltYWdlcmVuZGVyZXIuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2ltYWdlcmVuZGVyZXIuaCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV9saW5rdXNlcmRhdGEuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2xpbmt1c2VyZGF0YS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2xvYWRlcmNvbnRleHQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX2xvYWRlcmNvbnRleHQuaCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV9waWVjZWxpbmUuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX3BpZWNlbGluZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX3JlbmRlcmNvbnRleHQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX3JlbmRlcmNvbnRleHQuaCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV90ZXh0bGF5b3V0LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV90ZXh0bGF5b3V0LmgiLAorICAgICAgInhmYS9meGZhL2N4ZmFfdGV4dHBhcnNlY29udGV4dC5jcHAiLAorICAgICAgInhmYS9meGZhL2N4ZmFfdGV4dHBhcnNlY29udGV4dC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX3RleHRwYXJzZXIuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX3RleHRwYXJzZXIuaCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV90ZXh0cGllY2UuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX3RleHRwaWVjZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX3RleHRwcm92aWRlci5jcHAiLAorICAgICAgInhmYS9meGZhL2N4ZmFfdGV4dHByb3ZpZGVyLmgiLAorICAgICAgInhmYS9meGZhL2N4ZmFfdGV4dHRhYnN0b3BzY29udGV4dC5jcHAiLAorICAgICAgInhmYS9meGZhL2N4ZmFfdGV4dHRhYnN0b3BzY29udGV4dC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9jeGZhX3RleHR1c2VyZGF0YS5jcHAiLAorICAgICAgInhmYS9meGZhL2N4ZmFfdGV4dHVzZXJkYXRhLmgiLAorICAgICAgInhmYS9meGZhL2N4ZmFfd2lkZ2V0YWNjLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV93aWRnZXRhY2MuaCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV93aWRnZXRhY2NpdGVyYXRvci5jcHAiLAorICAgICAgInhmYS9meGZhL2N4ZmFfd2lkZ2V0YWNjaXRlcmF0b3IuaCIsCisgICAgICAieGZhL2Z4ZmEvZm0yanMvY3hmYV9mbWV4cHJlc3Npb24uY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9mbTJqcy9jeGZhX2ZtZXhwcmVzc2lvbi5oIiwKKyAgICAgICJ4ZmEvZnhmYS9mbTJqcy9jeGZhX2ZtbGV4ZXIuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9mbTJqcy9jeGZhX2ZtbGV4ZXIuaCIsCisgICAgICAieGZhL2Z4ZmEvZm0yanMvY3hmYV9mbXBhcnNlci5jcHAiLAorICAgICAgInhmYS9meGZhL2ZtMmpzL2N4ZmFfZm1wYXJzZXIuaCIsCisgICAgICAieGZhL2Z4ZmEvZm0yanMvY3hmYV9mbXNpbXBsZWV4cHJlc3Npb24uY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9mbTJqcy9jeGZhX2Ztc2ltcGxlZXhwcmVzc2lvbi5oIiwKKyAgICAgICJ4ZmEvZnhmYS9mbTJqcy9jeGZhX2ZtdG9qYXZhc2NyaXB0ZGVwdGguY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9mbTJqcy9jeGZhX2ZtdG9qYXZhc2NyaXB0ZGVwdGguaCIsCiAgICAgICAieGZhL2Z4ZmEvZnhmYS5oIiwKICAgICAgICJ4ZmEvZnhmYS9meGZhX2Jhc2ljLmgiLAotICAgICAgInhmYS9meGZhL2Z4ZmFfd2lkZ2V0LmgiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jc2NyaXB0X2RhdGF3aW5kb3cuY3BwIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9kYXRhd2luZG93LmgiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jc2NyaXB0X2V2ZW50cHNldWRvbW9kZWwuY3BwIiwKQEAgLTE1ODksMTQ3ICsyMDY5LDY5OCBAQAogICAgICAgInhmYS9meGZhL3BhcnNlci9jc2NyaXB0X2xvZ3BzZXVkb21vZGVsLmgiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jc2NyaXB0X3NpZ25hdHVyZXBzZXVkb21vZGVsLmNwcCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfc2lnbmF0dXJlcHNldWRvbW9kZWwuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWNjZXNzaWJsZWNvbnRlbnQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hY2Nlc3NpYmxlY29udGVudC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hY3JvYmF0LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWNyb2JhdC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hY3JvYmF0Ny5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2Fjcm9iYXQ3LmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2FkYmVfanNjb25zb2xlLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWRiZV9qc2NvbnNvbGUuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWRiZV9qc2RlYnVnZ2VyLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWRiZV9qc2RlYnVnZ2VyLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2FkZHNpbGVudHByaW50LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWRkc2lsZW50cHJpbnQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWRkdmlld2VycHJlZmVyZW5jZXMuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZGR2aWV3ZXJwcmVmZXJlbmNlcy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZGp1c3RkYXRhLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWRqdXN0ZGF0YS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZG9iZWV4dGVuc2lvbmxldmVsLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWRvYmVleHRlbnNpb25sZXZlbC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZ2VudC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2FnZW50LmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2Fsd2F5c2VtYmVkLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWx3YXlzZW1iZWQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYW1kLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYW1kLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2FwcGVhcmFuY2VmaWx0ZXIuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hcHBlYXJhbmNlZmlsdGVyLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2FyYy5jcHAiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2FyYy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hcmVhLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXJlYS5oIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hcnJheW5vZGVsaXN0LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXJyYXlub2RlbGlzdC5oIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hc3Npc3QuY3BwIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hc3Npc3QuaCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXR0YWNobm9kZWxpc3QuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hdHRhY2hub2RlbGlzdC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hdHRyaWJ1dGVzLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXR0cmlidXRlcy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hdXRvc2F2ZS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2F1dG9zYXZlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2JhcmNvZGUuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9iYXJjb2RlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2Jhc2UuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9iYXNlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2JhdGNob3V0cHV0LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmF0Y2hvdXRwdXQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmVoYXZpb3JvdmVycmlkZS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2JlaGF2aW9yb3ZlcnJpZGUuaCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmluZC5jcHAiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2JpbmQuaCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmluZGl0ZW1zLmNwcCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmluZGl0ZW1zLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2Jvb2tlbmQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib29rZW5kLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2Jvb2xlYW4uY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib29sZWFuLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2JvcmRlci5jcHAiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2JvcmRlci5oIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib3guY3BwIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib3guaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYnJlYWsuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9icmVhay5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9icmVha2FmdGVyLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYnJlYWthZnRlci5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9icmVha2JlZm9yZS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2JyZWFrYmVmb3JlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2J1dHRvbi5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2J1dHRvbi5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYWNoZS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2NhY2hlLmgiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2NhbGN1bGF0ZS5jcHAiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2NhbGN1bGF0ZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYWxlbmRhcnN5bWJvbHMuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYWxlbmRhcnN5bWJvbHMuaCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2FwdGlvbi5jcHAiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2NhcHRpb24uaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2VydGlmaWNhdGUuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jZXJ0aWZpY2F0ZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jZXJ0aWZpY2F0ZXMuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jZXJ0aWZpY2F0ZXMuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2hhbmdlLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2hhbmdlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2NoZWNrYnV0dG9uLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2hlY2tidXR0b24uaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2hvaWNlbGlzdC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2Nob2ljZWxpc3QuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29sb3IuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb2xvci5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21iLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tYi5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21tYW5kLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tbWFuZC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21tb24uY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21tb24uaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tcHJlc3MuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21wcmVzcy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21wcmVzc2lvbi5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbXByZXNzaW9uLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbXByZXNzbG9naWNhbHN0cnVjdHVyZS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbXByZXNzbG9naWNhbHN0cnVjdHVyZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21wcmVzc29iamVjdHN0cmVhbS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbXByZXNzb2JqZWN0c3RyZWFtLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbmZpZy5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbmZpZy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25mb3JtYW5jZS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbmZvcm1hbmNlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2Nvbm5lY3QuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25uZWN0LmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2Nvbm5lY3Rpb25zZXQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25uZWN0aW9uc2V0LmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2Nvbm5lY3RzdHJpbmcuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25uZWN0c3RyaW5nLmgiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbnRhaW5lcmxheW91dGl0ZW0uY3BwIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb250YWluZXJsYXlvdXRpdGVtLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbnRlbnRhcmVhLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29udGVudGFyZWEuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29udGVudGNvcHkuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb250ZW50Y29weS5oIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb250ZW50bGF5b3V0aXRlbS5jcHAiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbnRlbnRsYXlvdXRpdGVtLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvcGllcy5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvcGllcy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb3JuZXIuY3BwIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb3JuZXIuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY3JlYXRvci5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2NyZWF0b3IuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY3VycmVuY3lzeW1ib2wuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jdXJyZW5jeXN5bWJvbC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jdXJyZW5jeXN5bWJvbHMuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jdXJyZW5jeXN5bWJvbHMuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY3VycmVudHBhZ2UuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jdXJyZW50cGFnZS5oIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhLmNwcCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YS5oIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhZXhwb3J0ZXIuY3BwIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhZXhwb3J0ZXIuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YWdyb3VwLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YWdyb3VwLmgiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGFpbXBvcnRlci5jcHAiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGFpbXBvcnRlci5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhbW9kZWwuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhbW9kZWwuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YXZhbHVlLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YXZhbHVlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGUuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGVwYXR0ZXJuLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZXBhdHRlcm4uaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZXBhdHRlcm5zLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZXBhdHRlcm5zLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGV0aW1lLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZXRpbWUuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZXRpbWVlZGl0LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZXRpbWVlZGl0LmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGV0aW1lc3ltYm9scy5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGV0aW1lc3ltYm9scy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXkuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXkuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF5bmFtZXMuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXluYW1lcy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWJ1Zy5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2RlYnVnLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2RlY2ltYWwuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWNpbWFsLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2RlZmF1bHR0eXBlZmFjZS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2RlZmF1bHR0eXBlZmFjZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWZhdWx0dWkuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWZhdWx0dWkuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVsZXRlLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVsZXRlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2RlbHRhLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVsdGEuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVsdGFzLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVsdGFzLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2Rlc2MuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZXNjLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2Rlc3RpbmF0aW9uLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVzdGluYXRpb24uaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGlnZXN0bWV0aG9kLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGlnZXN0bWV0aG9kLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2RpZ2VzdG1ldGhvZHMuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kaWdlc3RtZXRob2RzLmgiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmNwcCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnQuaCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnRfcGFyc2VyLmNwcCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnRfcGFyc2VyLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50YXNzZW1ibHkuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudGFzc2VtYmx5LmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2RyYXcuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kcmF3LmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2RyaXZlci5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2RyaXZlci5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kc2lnZGF0YS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2RzaWdkYXRhLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2R1cGxleG9wdGlvbi5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2R1cGxleG9wdGlvbi5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9keW5hbWljcmVuZGVyLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZHluYW1pY3JlbmRlci5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lZGdlLmNwcCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZWRnZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lZmZlY3RpdmVpbnB1dHBvbGljeS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2VmZmVjdGl2ZWlucHV0cG9saWN5LmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2VmZmVjdGl2ZW91dHB1dHBvbGljeS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2VmZmVjdGl2ZW91dHB1dHBvbGljeS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbWJlZC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2VtYmVkLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2VuY29kaW5nLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jb2RpbmcuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jb2RpbmdzLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jb2RpbmdzLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2VuY3J5cHQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0LmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2VuY3J5cHRpb24uY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0aW9uLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2VuY3J5cHRpb25sZXZlbC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2VuY3J5cHRpb25sZXZlbC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0aW9ubWV0aG9kLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jcnlwdGlvbm1ldGhvZC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0aW9ubWV0aG9kcy5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2VuY3J5cHRpb25tZXRob2RzLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2VuZm9yY2UuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmZvcmNlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2VxdWF0ZS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2VxdWF0ZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lcXVhdGVyYW5nZS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2VxdWF0ZXJhbmdlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2VyYS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2VyYS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lcmFuYW1lcy5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2VyYW5hbWVzLmgiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2V2ZW50LmNwcCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXZlbnQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhjbGdyb3VwLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhjbGdyb3VwLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2V4Y2x1ZGUuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9leGNsdWRlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2V4Y2x1ZGVucy5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2V4Y2x1ZGVucy5oIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9leGRhdGEuY3BwIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9leGRhdGEuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhlY3V0ZS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2V4ZWN1dGUuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhvYmplY3QuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9leG9iamVjdC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9leHRyYXMuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9leHRyYXMuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmllbGQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9maWVsZC5oIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9maWxsLmNwcCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmlsbC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9maWx0ZXIuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9maWx0ZXIuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmxpcGxhYmVsLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmxpcGxhYmVsLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2Zsb2F0LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmxvYXQuaCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9udC5jcHAiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2ZvbnQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9udGluZm8uY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9mb250aW5mby5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9mb3JtLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9ybS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9mb3JtYXQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9mb3JtYXQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9ybWZpZWxkZmlsbGluZy5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2Zvcm1maWVsZGZpbGxpbmcuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZ3JvdXBwYXJlbnQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ncm91cHBhcmVudC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9oYW5kbGVyLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaGFuZGxlci5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9oeXBoZW5hdGlvbi5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2h5cGhlbmF0aW9uLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2lmZW1wdHkuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pZmVtcHR5LmgiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2ltYWdlLmNwcCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW1hZ2UuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW1hZ2VlZGl0LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW1hZ2VlZGl0LmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2luY2x1ZGV4ZHBjb250ZW50LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW5jbHVkZXhkcGNvbnRlbnQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW5jcmVtZW50YWxsb2FkLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW5jcmVtZW50YWxsb2FkLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2luY3JlbWVudGFsbWVyZ2UuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbmNyZW1lbnRhbG1lcmdlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2luc2VydC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2luc2VydC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbnN0YW5jZW1hbmFnZXIuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbnN0YW5jZW1hbmFnZXIuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW50ZWdlci5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2ludGVnZXIuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW50ZXJhY3RpdmUuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbnRlcmFjdGl2ZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pc3N1ZXJzLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaXNzdWVycy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pdGVtbGF5b3V0cHJvY2Vzc29yLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaXRlbWxheW91dHByb2Nlc3Nvci5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pdGVtcy5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2l0ZW1zLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2pvZy5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2pvZy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9rZWVwLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfa2VlcC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9rZXl1c2FnZS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2tleXVzYWdlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2xhYmVscHJpbnRlci5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2xhYmVscHJpbnRlci5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0Y29udGV4dC5oIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXRpdGVtLmNwcCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0aXRlbS5oIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXRwYWdlbWdyLmNwcCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0cGFnZW1nci5oIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXRwcm9jZXNzb3IuY3BwIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXRwcm9jZXNzb3IuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGV2ZWwuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sZXZlbC5oIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9saW5lLmNwcCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGluZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9saW5lYXIuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9saW5lYXIuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGluZWFyaXplZC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2xpbmVhcml6ZWQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGlzdC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2xpc3QuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxlLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2xvY2FsZW1nci5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX2xvY2FsZW1nci5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGVzZXQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGVzZXQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxldmFsdWUuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGV2YWx1ZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NrZG9jdW1lbnQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NrZG9jdW1lbnQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9nLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9nLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX21hbmlmZXN0LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWFuaWZlc3QuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWFwLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWFwLmgiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX21hcmdpbi5jcHAiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX21hcmdpbi5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZHAuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZHAuaCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVhc3VyZW1lbnQuY3BwIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWFzdXJlbWVudC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWRpdW0uY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWRpdW0uaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVkaXVtaW5mby5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX21lZGl1bWluZm8uaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVyaWRpZW0uY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZXJpZGllbS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZXJpZGllbW5hbWVzLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVyaWRpZW1uYW1lcy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZXNzYWdlLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVzc2FnZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZXNzYWdpbmcuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZXNzYWdpbmcuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbW9kZS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX21vZGUuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbW9kaWZ5YW5ub3RzLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbW9kaWZ5YW5ub3RzLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX21vbnRoLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbW9udGguaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbW9udGhuYW1lcy5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX21vbnRobmFtZXMuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbXNnaWQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tc2dpZC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9uYW1lYXR0ci5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX25hbWVhdHRyLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX25ldmVyZW1iZWQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9uZXZlcmVtYmVkLmgiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGVfc3RhdGljcy5jcHAiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGVoZWxwZXIuY3BwIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlaGVscGVyLmgiLAotICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGVsaXN0LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZWl0ZXJhdG9ydGVtcGxhdGUuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZWxvY2FsZS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGVsb2NhbGUuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtYmVyb2Zjb3BpZXMuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1iZXJvZmNvcGllcy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1iZXJwYXR0ZXJuLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtYmVycGF0dGVybi5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1iZXJwYXR0ZXJucy5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX251bWJlcnBhdHRlcm5zLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX251bWJlcnN5bWJvbC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX251bWJlcnN5bWJvbC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1iZXJzeW1ib2xzLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtYmVyc3ltYm9scy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1lcmljZWRpdC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX251bWVyaWNlZGl0LmgiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX29iamVjdC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX29iamVjdC5oIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vY2N1ci5jcHAiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX29jY3VyLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX29pZC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX29pZC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vaWRzLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb2lkcy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vcGVuYWN0aW9uLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3BlbmFjdGlvbi5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vcGVyYXRpb24uY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vcGVyYXRpb24uaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3V0cHV0LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3V0cHV0LmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX291dHB1dGJpbi5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX291dHB1dGJpbi5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vdXRwdXR4c2wuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vdXRwdXR4c2wuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3ZlcmZsb3cuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vdmVyZmxvdy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vdmVycHJpbnQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vdmVycHJpbnQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFja2V0LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFja2V0LmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhY2tldHMuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWNrZXRzLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2VhcmVhLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFnZWFyZWEuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFnZW9mZnNldC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2VvZmZzZXQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFnZXJhbmdlLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFnZXJhbmdlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2VzZXQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWdlc2V0LmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2luYXRpb24uY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWdpbmF0aW9uLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2luYXRpb25vdmVycmlkZS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2luYXRpb25vdmVycmlkZS5oIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYXJhLmNwcCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFyYS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYXJ0LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFydC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYXNzd29yZC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3Bhc3N3b3JkLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3Bhc3N3b3JkZWRpdC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3Bhc3N3b3JkZWRpdC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYXR0ZXJuLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGF0dGVybi5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wY2wuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wY2wuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGRmLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGRmLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3BkZmEuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wZGZhLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3Blcm1pc3Npb25zLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGVybWlzc2lvbnMuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGlja3RyYXlieXBkZnNpemUuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9waWNrdHJheWJ5cGRmc2l6ZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9waWN0dXJlLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGljdHVyZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wbGFpbnRleHRtZXRhZGF0YS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3BsYWludGV4dG1ldGFkYXRhLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3ByZXNlbmNlLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJlc2VuY2UuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJlc2VudC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3ByZXNlbnQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJpbnQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmludC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmludGVybmFtZS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3ByaW50ZXJuYW1lLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3ByaW50aGlnaHF1YWxpdHkuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmludGhpZ2hxdWFsaXR5LmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3ByaW50c2NhbGluZy5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3ByaW50c2NhbGluZy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcm9kdWNlci5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3Byb2R1Y2VyLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3Byb3RvLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJvdG8uaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHMuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wc21hcC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3BzbWFwLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3F1ZXJ5LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcXVlcnkuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmFkaWFsLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmFkaWFsLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3JhbmdlLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmFuZ2UuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVhc29uLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVhc29uLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3JlYXNvbnMuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWFzb25zLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3JlY29yZC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3JlY29yZC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWNvcmRzZXQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWNvcmRzZXQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVjdGFuZ2xlLmNwcCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVjdGFuZ2xlLmgiLAotICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3Jlc29sdmVwcm9jZXNzb3IuY3BwIiwKLSAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZXNvbHZlcHJvY2Vzc29yLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3JlZi5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3JlZi5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWxldmFudC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3JlbGV2YW50LmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3JlbmFtZS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3JlbmFtZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZW5kZXJwb2xpY3kuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZW5kZXJwb2xpY3kuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcm9vdGVsZW1lbnQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9yb290ZWxlbWVudC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ydW5zY3JpcHRzLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcnVuc2NyaXB0cy5oIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zY3JpcHQuY3BwIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zY3JpcHQuaCIsCi0gICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2NyaXB0Y29udGV4dC5jcHAiLAotICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3NjcmlwdGNvbnRleHQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2NyaXB0bW9kZWwuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zY3JpcHRtb2RlbC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zZWxlY3QuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zZWxlY3QuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2V0cHJvcGVydHkuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zZXRwcm9wZXJ0eS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zZXZlcml0eS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3NldmVyaXR5LmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3NoYXJwdGV4dC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3NoYXJwdGV4dC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaGFycHhodG1sLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2hhcnB4aHRtbC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaGFycHhtbC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3NoYXJweG1sLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3NpZ25hdHVyZS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3NpZ25hdHVyZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaWduYXR1cmVwcm9wZXJ0aWVzLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2lnbmF0dXJlcHJvcGVydGllcy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaWduZGF0YS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3NpZ25kYXRhLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3NpZ25pbmcuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaWduaW5nLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3NpbGVudHByaW50LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2lsZW50cHJpbnQuaCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2ltcGxlX3BhcnNlci5jcHAiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3NpbXBsZV9wYXJzZXIuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc29hcGFjdGlvbi5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3NvYXBhY3Rpb24uaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc29hcGFkZHJlc3MuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zb2FwYWRkcmVzcy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zb2xpZC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3NvbGlkLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3NvdXJjZS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3NvdXJjZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zb3VyY2VzZXQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zb3VyY2VzZXQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3BlYWsuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zcGVhay5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdGFwbGUuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdGFwbGUuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3RhcnRub2RlLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3RhcnRub2RlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3N0YXJ0cGFnZS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3N0YXJ0cGFnZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdGlwcGxlLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3RpcHBsZS5oIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdHJva2UuY3BwIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdHJva2UuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3ViZm9ybS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3N1YmZvcm0uaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3ViZm9ybXNldC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3N1YmZvcm1zZXQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3ViamVjdGRuLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3ViamVjdGRuLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3N1YmplY3RkbnMuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJqZWN0ZG5zLmgiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3N1Ym1pdC5jcHAiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3N1Ym1pdC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJtaXRmb3JtYXQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJtaXRmb3JtYXQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3VibWl0dXJsLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3VibWl0dXJsLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3N1YnNldGJlbG93LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3Vic2V0YmVsb3cuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3VwcHJlc3NiYW5uZXIuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdXBwcmVzc2Jhbm5lci5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90YWdnZWQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90YWdnZWQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGVtcGxhdGUuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZW1wbGF0ZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZW1wbGF0ZWNhY2hlLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGVtcGxhdGVjYWNoZS5oIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZXh0LmNwcCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGV4dC5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZXh0ZWRpdC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3RleHRlZGl0LmgiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3RoaXNwcm94eS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3RoaXNwcm94eS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90aHJlc2hvbGQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90aHJlc2hvbGQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGltZS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3RpbWUuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGltZXBhdHRlcm4uY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90aW1lcGF0dGVybi5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90aW1lcGF0dGVybnMuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90aW1lcGF0dGVybnMuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGltZXN0YW1wLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGltZXN0YW1wLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3RpbWV6b25lcHJvdmlkZXIuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90aW1lem9uZXByb3ZpZGVyLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3RvLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdG8uaCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdG9vbHRpcC5jcHAiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3Rvb2x0aXAuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhY2UuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmFjZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmFuc2Zvcm0uY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmFuc2Zvcm0uaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhdmVyc2FsLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhdmVyc2FsLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3RyYXZlcnNlLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhdmVyc2UuaCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhdmVyc2VzdHJhdGVneV9jb250ZW50YXJlYWNvbnRhaW5lcmxheW91dGl0ZW0uaCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhdmVyc2VzdHJhdGVneV9jb250ZW50bGF5b3V0aXRlbS5oIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmF2ZXJzZXN0cmF0ZWd5X2xheW91dGl0ZW0uaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhdmVyc2VzdHJhdGVneV94ZmFjb250YWluZXJub2RlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3RyYXZlcnNlc3RyYXRlZ3lfeGZhbm9kZS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmVlbGlzdC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3RyZWVsaXN0LmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3R5cGUuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90eXBlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3R5cGVmYWNlLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHlwZWZhY2UuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHlwZWZhY2VzLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHlwZWZhY2VzLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3VpLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdWkuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdXBkYXRlLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdXBkYXRlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3VyaS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3VyaS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV91c2VyLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdXNlci5oIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWxpZGF0ZS5jcHAiLAogICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZhbGlkYXRlLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZhbGlkYXRlYXBwcm92YWxzaWduYXR1cmVzLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsaWRhdGVhcHByb3ZhbHNpZ25hdHVyZXMuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsaWRhdGlvbm1lc3NhZ2luZy5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZhbGlkYXRpb25tZXNzYWdpbmcuaCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsdWUuY3BwIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWx1ZS5oIiwKLSAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWx1ZWFycmF5LmNwcCIsCi0gICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsdWVhcnJheS5oIiwKLSAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV93aWRldGV4dHJlYWQuY3BwIiwKLSAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV93aWRldGV4dHJlYWQuaCIsCi0gICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2lkZ2V0ZGF0YS5jcHAiLAotICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3dpZGdldGRhdGEuaCIsCi0gICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeG1sX3BhcnNlci5jcHAiLAotICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3htbF9wYXJzZXIuaCIsCi0gICAgICAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9iYXNpY19kYXRhLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFyaWFibGVzLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFyaWFibGVzLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZlcnNpb24uY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV92ZXJzaW9uLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZlcnNpb25jb250cm9sLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmVyc2lvbmNvbnRyb2wuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmlld2VycHJlZmVyZW5jZXMuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV92aWV3ZXJwcmVmZXJlbmNlcy5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV93ZWJjbGllbnQuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV93ZWJjbGllbnQuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2hpdGVzcGFjZS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3doaXRlc3BhY2UuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2luZG93LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2luZG93LmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3dzZGxhZGRyZXNzLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd3NkbGFkZHJlc3MuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd3NkbGNvbm5lY3Rpb24uY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV93c2RsY29ubmVjdGlvbi5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV94ZGMuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV94ZGMuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeGRwLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeGRwLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3hmYS5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3hmYS5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV94bWxjb25uZWN0aW9uLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeG1sY29ubmVjdGlvbi5oIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV94bWxsb2NhbGUuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV94bWxsb2NhbGUuaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeHNkY29ubmVjdGlvbi5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3hzZGNvbm5lY3Rpb24uaCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeHNsLmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeHNsLmgiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3pwbC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX3pwbC5oIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIveGZhX2Jhc2ljX2RhdGEuaCIsCi0gICAgICAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9iYXNpY19kYXRhX2F0dHJpYnV0ZXMuY3BwIiwKLSAgICAgICJ4ZmEvZnhmYS9wYXJzZXIveGZhX2Jhc2ljX2RhdGFfZWxlbWVudF9hdHRyaWJ1dGVzLmNwcCIsCi0gICAgICAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9iYXNpY19kYXRhX2VsZW1lbnRfcHJvcGVydGllcy5jcHAiLAogICAgICAgInhmYS9meGZhL3BhcnNlci94ZmFfYmFzaWNfZGF0YV9lbGVtZW50X3NjcmlwdC5jcHAiLAogICAgICAgInhmYS9meGZhL3BhcnNlci94ZmFfYmFzaWNfZGF0YV9lbnVtLmNwcCIsCi0gICAgICAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9iYXNpY19kYXRhX3BhY2tldHMuY3BwIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFtZXJnZXJfaW1wLmNwcCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9kb2N1bWVudF9kYXRhbWVyZ2VyX2ltcC5oIiwKLSAgICAgICJ4ZmEvZnhmYS9wYXJzZXIveGZhX2xheW91dF9pdGVtbGF5b3V0LmNwcCIsCi0gICAgICAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9sYXlvdXRfaXRlbWxheW91dC5oIiwKLSAgICAgICJ4ZmEvZnhmYS9wYXJzZXIveGZhX2xvY2FsZS5jcHAiLAotICAgICAgInhmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxlLmgiLAotICAgICAgInhmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxlbWdyLmNwcCIsCi0gICAgICAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9sb2NhbGVtZ3IuaCIsCi0gICAgICAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9sb2NhbGV2YWx1ZS5jcHAiLAotICAgICAgInhmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxldmFsdWUuaCIsCi0gICAgICAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9yZXNvbHZlbm9kZV9ycy5oIiwKICAgICAgICJ4ZmEvZnhmYS9wYXJzZXIveGZhX3V0aWxzLmNwcCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL3hmYV91dGlscy5oIiwKLSAgICAgICJ4ZmEvZnhmYS94ZmFfY2hlY2tzdW0uaCIsCi0gICAgICAieGZhL2Z4ZmEveGZhX2ZmYXBwLmgiLAotICAgICAgInhmYS9meGZhL3hmYV9mZmRvYy5oIiwKLSAgICAgICJ4ZmEvZnhmYS94ZmFfZmZkb2NoYW5kbGVyLmgiLAotICAgICAgInhmYS9meGZhL3hmYV9mZmRvY3ZpZXcuaCIsCi0gICAgICAieGZhL2Z4ZmEveGZhX2ZmcGFnZXZpZXcuaCIsCi0gICAgICAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0LmgiLAotICAgICAgInhmYS9meGZhL3hmYV9mZndpZGdldGhhbmRsZXIuaCIsCi0gICAgICAieGZhL2Z4ZmEveGZhX2ZvbnRtZ3IuaCIsCi0gICAgICAieGZhL2Z4ZmEveGZhX3JlbmRlcmNvbnRleHQuaCIsCi0gICAgICAieGZhL2Z4Z3JhcGhpY3MvY2Z4X2NvbG9yLmNwcCIsCi0gICAgICAieGZhL2Z4Z3JhcGhpY3MvY2Z4X2NvbG9yLmgiLAotICAgICAgInhmYS9meGdyYXBoaWNzL2NmeF9ncmFwaGljcy5jcHAiLAotICAgICAgInhmYS9meGdyYXBoaWNzL2NmeF9ncmFwaGljcy5oIiwKLSAgICAgICJ4ZmEvZnhncmFwaGljcy9jZnhfcGF0aC5jcHAiLAotICAgICAgInhmYS9meGdyYXBoaWNzL2NmeF9wYXRoLmgiLAotICAgICAgInhmYS9meGdyYXBoaWNzL2NmeF9wYXR0ZXJuLmNwcCIsCi0gICAgICAieGZhL2Z4Z3JhcGhpY3MvY2Z4X3BhdHRlcm4uaCIsCi0gICAgICAieGZhL2Z4Z3JhcGhpY3MvY2Z4X3NoYWRpbmcuY3BwIiwKLSAgICAgICJ4ZmEvZnhncmFwaGljcy9jZnhfc2hhZGluZy5oIiwKKyAgICAgICJ4ZmEvZnhncmFwaGljcy9jeGZhX2dlY29sb3IuY3BwIiwKKyAgICAgICJ4ZmEvZnhncmFwaGljcy9jeGZhX2dlY29sb3IuaCIsCisgICAgICAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXBhdGguY3BwIiwKKyAgICAgICJ4ZmEvZnhncmFwaGljcy9jeGZhX2dlcGF0aC5oIiwKKyAgICAgICJ4ZmEvZnhncmFwaGljcy9jeGZhX2dlcGF0dGVybi5jcHAiLAorICAgICAgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2VwYXR0ZXJuLmgiLAorICAgICAgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2VzaGFkaW5nLmNwcCIsCisgICAgICAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXNoYWRpbmcuaCIsCisgICAgICAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9ncmFwaGljcy5jcHAiLAorICAgICAgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ3JhcGhpY3MuaCIsCiAgICAgXQogICAgIGluY2x1ZGVfZGlycyA9IFsgIi4iIF0KICAgICBkZXBzID0gWworICAgICAgIjpmeGJhcmNvZGUiLAogICAgICAgIjpmeGNydCIsCiAgICAgICAiOmZ4anMiLAogICAgIF0KQEAgLTE3NDQsNjIgKzI3NzUsOTMgQEAKICAgc291cmNlcyA9IFsKICAgICAiY29yZS9mZHJtL2NyeXB0by9meF9jcnlwdF91bml0dGVzdC5jcHAiLAogICAgICJjb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX3BhZ2Vjb250ZW50Z2VuZXJhdG9yX3VuaXR0ZXN0LmNwcCIsCi0gICAgImNvcmUvZnBkZmFwaS9mb250L2ZwZGZfZm9udF9jaWRfdW5pdHRlc3QuY3BwIiwKLSAgICAiY29yZS9mcGRmYXBpL2ZvbnQvZnBkZl9mb250X3VuaXR0ZXN0LmNwcCIsCisgICAgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfY21hcHBhcnNlcl91bml0dGVzdC5jcHAiLAorICAgICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3RvdW5pY29kZW1hcF91bml0dGVzdC5jcHAiLAorICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2RldmljZWNzX3VuaXR0ZXN0LmNwcCIsCisgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcHNlbmdpbmVfdW5pdHRlc3QuY3BwIiwKICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zdHJlYW1jb250ZW50cGFyc2VyX3VuaXR0ZXN0LmNwcCIsCiAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc3RyZWFtcGFyc2VyX3VuaXR0ZXN0LmNwcCIsCiAgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheV91bml0dGVzdC5jcHAiLAorICAgICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfY3Jvc3NfcmVmX2F2YWlsX3VuaXR0ZXN0LmNwcCIsCiAgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudF91bml0dGVzdC5jcHAiLAorICAgICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfaGludF90YWJsZXNfdW5pdHRlc3QuY3BwIiwKKyAgICAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2luZGlyZWN0X29iamVjdF9ob2xkZXJfdW5pdHRlc3QuY3BwIiwKKyAgICAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdF9hdmFpbF91bml0dGVzdC5jcHAiLAogICAgICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfb2JqZWN0X3VuaXR0ZXN0LmNwcCIsCisgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3Rfd2Fsa2VyX3VuaXR0ZXN0LmNwcCIsCisgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9wYWdlX29iamVjdF9hdmFpbF91bml0dGVzdC5jcHAiLAogICAgICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyX3VuaXR0ZXN0LmNwcCIsCisgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9yZWFkX3ZhbGlkYXRvcl91bml0dGVzdC5jcHAiLAogICAgICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc2ltcGxlX3BhcnNlcl91bml0dGVzdC5jcHAiLAogICAgICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3ludGF4X3BhcnNlcl91bml0dGVzdC5jcHAiLAogICAgICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZV91bml0dGVzdC5jcHAiLAogICAgICJjb3JlL2ZwZGZkb2MvY3BkZl9kZXN0X3VuaXR0ZXN0LmNwcCIsCiAgICAgImNvcmUvZnBkZmRvYy9jcGRmX2ZpbGVzcGVjX3VuaXR0ZXN0LmNwcCIsCiAgICAgImNvcmUvZnBkZmRvYy9jcGRmX2Zvcm1maWVsZF91bml0dGVzdC5jcHAiLAotICAgICJjb3JlL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9pbnRfdW5pdHRlc3QuY3BwIiwKKyAgICAiY29yZS9mcGRmZG9jL2NwZGZfbmFtZXRyZWVfdW5pdHRlc3QuY3BwIiwKKyAgICAiY29yZS9mcGRmdGV4dC9jcGRmX2xpbmtleHRyYWN0X3VuaXR0ZXN0LmNwcCIsCiAgICAgImNvcmUvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19hODVfdW5pdHRlc3QuY3BwIiwKICAgICAiY29yZS9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pweF91bml0dGVzdC5jcHAiLAogICAgICJjb3JlL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfcmxlX3VuaXR0ZXN0LmNwcCIsCisgICAgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9CaXRTdHJlYW1fdW5pdHRlc3QuY3BwIiwKICAgICAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlX3VuaXR0ZXN0LmNwcCIsCi0gICAgImNvcmUvZnhjcnQvY2Z4X21heWJlX293bmVkX3VuaXR0ZXN0LmNwcCIsCi0gICAgImNvcmUvZnhjcnQvY2Z4X29ic2VydmFibGVfdW5pdHRlc3QuY3BwIiwKLSAgICAiY29yZS9meGNydC9jZnhfcmV0YWluX3B0cl91bml0dGVzdC5jcHAiLAotICAgICJjb3JlL2Z4Y3J0L2NmeF9zaGFyZWRfY29weV9vbl93cml0ZV91bml0dGVzdC5jcHAiLAotICAgICJjb3JlL2Z4Y3J0L2NmeF9zdHJpbmdfcG9vbF90ZW1wbGF0ZV91bml0dGVzdC5jcHAiLAotICAgICJjb3JlL2Z4Y3J0L2NmeF93ZWFrX3B0cl91bml0dGVzdC5jcHAiLAotICAgICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljX2JzdHJpbmdfdW5pdHRlc3QuY3BwIiwKLSAgICAiY29yZS9meGNydC9meF9iYXNpY19nY2NfdW5pdHRlc3QuY3BwIiwKLSAgICAiY29yZS9meGNydC9meF9iYXNpY19tZW1tZ3JfdW5pdHRlc3QuY3BwIiwKLSAgICAiY29yZS9meGNydC9meF9iYXNpY191dGlsX3VuaXR0ZXN0LmNwcCIsCi0gICAgImNvcmUvZnhjcnQvZnhfYmFzaWNfd3N0cmluZ191bml0dGVzdC5jcHAiLAorICAgICJjb3JlL2Z4Y3J0L2J5dGVzdHJpbmdfdW5pdHRlc3QuY3BwIiwKKyAgICAiY29yZS9meGNydC9jZnhfc2Vla2FibGVtdWx0aXN0cmVhbV91bml0dGVzdC5jcHAiLAogICAgICJjb3JlL2Z4Y3J0L2Z4X2JpZGlfdW5pdHRlc3QuY3BwIiwKKyAgICAiY29yZS9meGNydC9meF9jb29yZGluYXRlc191bml0dGVzdC5jcHAiLAogICAgICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbl91bml0dGVzdC5jcHAiLAorICAgICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeV91bml0dGVzdC5jcHAiLAorICAgICJjb3JlL2Z4Y3J0L2Z4X3JhbmRvbV91bml0dGVzdC5jcHAiLAorICAgICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZ191bml0dGVzdC5jcHAiLAogICAgICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbV91bml0dGVzdC5jcHAiLAotICAgICJjb3JlL2Z4Z2UvZGliL2Z4X2RpYl9lbmdpbmVfdW5pdHRlc3QuY3BwIiwKKyAgICAiY29yZS9meGNydC9tYXliZV9vd25lZF91bml0dGVzdC5jcHAiLAorICAgICJjb3JlL2Z4Y3J0L29ic2VydmFibGVfdW5pdHRlc3QuY3BwIiwKKyAgICAiY29yZS9meGNydC9yZXRhaW5fcHRyX3VuaXR0ZXN0LmNwcCIsCisgICAgImNvcmUvZnhjcnQvc2hhcmVkX2NvcHlfb25fd3JpdGVfdW5pdHRlc3QuY3BwIiwKKyAgICAiY29yZS9meGNydC9zdHJpbmdfcG9vbF90ZW1wbGF0ZV91bml0dGVzdC5jcHAiLAorICAgICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyX3VuaXR0ZXN0LmNwcCIsCisgICAgImNvcmUvZnhjcnQvd2Vha19wdHJfdW5pdHRlc3QuY3BwIiwKKyAgICAiY29yZS9meGNydC93aWRlc3RyaW5nX3VuaXR0ZXN0LmNwcCIsCisgICAgImNvcmUvZnhnZS9kaWIvY3N0cmV0Y2hlbmdpbmVfdW5pdHRlc3QuY3BwIiwKKyAgICAiZnBkZnNkay9mcGRmY2F0YWxvZ191bml0dGVzdC5jcHAiLAogICAgICJmcGRmc2RrL2ZwZGZkb2NfdW5pdHRlc3QuY3BwIiwKICAgICAiZnBkZnNkay9mcGRmZWRpdGltZ191bml0dGVzdC5jcHAiLAotICAgICJmcGRmc2RrL2ZwZGZ2aWV3X3VuaXR0ZXN0LmNwcCIsCisgICAgInRlc3RpbmcvdW5pdF90ZXN0X21haW4uY3BwIiwKICAgXQogICBkZXBzID0gWwogICAgICI6cGRmaXVtIiwKICAgICAiOnRlc3Rfc3VwcG9ydCIsCisgICAgIi8vdGVzdGluZy9nbW9jayIsCiAgICAgIi8vdGVzdGluZy9ndGVzdCIsCi0gICAgIi8vdGVzdGluZy9ndGVzdDpndGVzdF9tYWluIiwKICAgXQogICBpbmNsdWRlX2RpcnMgPSBbXQogICBpZiAocGRmX2VuYWJsZV94ZmEpIHsKICAgICBzb3VyY2VzICs9IFsKLSAgICAgICJ4ZmEvZmRlL2NmZGVfdHh0ZWR0YnVmX3VuaXR0ZXN0LmNwcCIsCi0gICAgICAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NkZWNsYXJhdGlvbl91bml0dGVzdC5jcHAiLAotICAgICAgInhmYS9mZGUvY3NzL2NmZGVfY3Nzc3R5bGVzaGVldF91bml0dGVzdC5jcHAiLAotICAgICAgInhmYS9mZGUvY3NzL2NmZGVfY3NzdmFsdWVsaXN0cGFyc2VyX3VuaXR0ZXN0LmNwcCIsCi0gICAgICAieGZhL2ZkZS94bWwvZmRlX3htbF9pbXBfdW5pdHRlc3QuY3BwIiwKLSAgICAgICJ4ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyX3VuaXR0ZXN0LmNwcCIsCi0gICAgICAieGZhL2Z4ZmEvYXBwL2N4ZmFfdGV4dHBhcnNlcl91bml0dGVzdC5jcHAiLAotICAgICAgInhmYS9meGZhL2FwcC94ZmFfZmZhcHBfdW5pdHRlc3QuY3BwIiwKLSAgICAgICJ4ZmEvZnhmYS9mbTJqcy94ZmFfc2ltcGxlZXhwcmVzc2lvbl91bml0dGVzdC5jcHAiLAorICAgICAgImNvcmUvZnhjb2RlYy9naWYvY2Z4X2dpZmNvbnRleHRfdW5pdHRlc3QuY3BwIiwKKyAgICAgICJjb3JlL2Z4Y29kZWMvZ2lmL2NmeF9sendkZWNvbXByZXNzb3JfdW5pdHRlc3QuY3BwIiwKKyAgICAgICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzZGVjbGFyYXRpb25fdW5pdHRlc3QuY3BwIiwKKyAgICAgICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3R5bGVzaGVldF91bml0dGVzdC5jcHAiLAorICAgICAgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3N2YWx1ZWxpc3RwYXJzZXJfdW5pdHRlc3QuY3BwIiwKKyAgICAgICJjb3JlL2Z4Y3J0L3htbC9jZnhfc2F4cmVhZGVyX3VuaXR0ZXN0LmNwcCIsCisgICAgICAiY29yZS9meGNydC94bWwvY2Z4X3htbHN5bnRheHBhcnNlcl91bml0dGVzdC5jcHAiLAorICAgICAgImZ4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyV3JpdGVyX3VuaXR0ZXN0LmNwcCIsCisgICAgICAiZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhXcml0ZXJfdW5pdHRlc3QuY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTM5V3JpdGVyX3VuaXR0ZXN0LmNwcCIsCisgICAgICAiZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzV3JpdGVyX3VuaXR0ZXN0LmNwcCIsCisgICAgICAiZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjhXcml0ZXJfdW5pdHRlc3QuY3BwIiwKKyAgICAgICJmeGJhcmNvZGUvb25lZC9CQ19PbmVkVVBDQVdyaXRlcl91bml0dGVzdC5jcHAiLAorICAgICAgImZ4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcl91bml0dGVzdC5jcHAiLAorICAgICAgInhmYS9mZGUvY2ZkZV90ZXh0ZWRpdGVuZ2luZV91bml0dGVzdC5jcHAiLAorICAgICAgInhmYS9mZ2FzL2NydC9jZmdhc19mb3JtYXRzdHJpbmdfdW5pdHRlc3QuY3BwIiwKKyAgICAgICJ4ZmEvZmdhcy9sYXlvdXQvY2Z4X3J0ZmJyZWFrX3VuaXR0ZXN0LmNwcCIsCisgICAgICAieGZhL2Z3bC9jZnhfYmFyY29kZV91bml0dGVzdC5jcHAiLAorICAgICAgInhmYS9meGZhL2N4ZmFfZmZiYXJjb2RlX3VuaXR0ZXN0LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvY3hmYV90ZXh0cGFyc2VyX3VuaXR0ZXN0LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvZm0yanMvY3hmYV9mbWxleGVyX3VuaXR0ZXN0LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvZm0yanMvY3hmYV9mbXBhcnNlcl91bml0dGVzdC5jcHAiLAorICAgICAgInhmYS9meGZhL2ZtMmpzL2N4ZmFfZm1zaW1wbGVleHByZXNzaW9uX3VuaXR0ZXN0LmNwcCIsCisgICAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZV91bml0dGVzdC5jcHAiLAorICAgICAgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGVpdGVyYXRvcnRlbXBsYXRlX3VuaXR0ZXN0LmNwcCIsCiAgICAgICAieGZhL2Z4ZmEvcGFyc2VyL3hmYV91dGlsc191bml0dGVzdC5jcHAiLAogICAgIF0KICAgfQpAQCAtMTgwOCw3ICsyODcwLDEwIEBACiAgICAgZGVwcyArPSBbICIvL3NraWEiIF0KICAgfQogICBpZiAocGRmX2VuYWJsZV92OCkgewotICAgIHNvdXJjZXMgKz0gWyAiZnBkZnNkay9qYXZhc2NyaXB0L3B1YmxpY19tZXRob2RzX3VuaXR0ZXN0LmNwcCIgXQorICAgIHNvdXJjZXMgKz0gWworICAgICAgImZ4anMvY2pzX3B1YmxpY21ldGhvZHNfdW5pdHRlc3QuY3BwIiwKKyAgICAgICJmeGpzL2Nqc191dGlsX3VuaXR0ZXN0LmNwcCIsCisgICAgXQogICAgIGluY2x1ZGVfZGlycyArPSBbCiAgICAgICAiLy92OCIsCiAgICAgICAiLy92OC9pbmNsdWRlIiwKQEAgLTE4MjIsMTkgKzI4ODcsMjMgQEAKIAogdGVzdCgicGRmaXVtX2VtYmVkZGVydGVzdHMiKSB7CiAgIHNvdXJjZXMgPSBbCi0gICAgImNvcmUvZnBkZmFwaS9wYWdlL2ZwZGZfcGFnZV9mdW5jX2VtYmVkZGVydGVzdC5jcHAiLAorICAgICJjb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX2NyZWF0b3JfZW1iZWRkZXJ0ZXN0LmNwcCIsCisgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc3RpdGNoZnVuY19lbWJlZGRlcnRlc3QuY3BwIiwKICAgICAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3BhcnNlcl9lbWJlZGRlcnRlc3QuY3BwIiwKICAgICAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3NlY3VyaXR5X2hhbmRsZXJfZW1iZWRkZXJ0ZXN0LmNwcCIsCiAgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlX2VtYmVkZGVydGVzdC5jcHAiLAogICAgICJjb3JlL2ZwZGZhcGkvcmVuZGVyL2ZwZGZfcmVuZGVyX2xvYWRpbWFnZV9lbWJlZGRlcnRlc3QuY3BwIiwKICAgICAiY29yZS9mcGRmYXBpL3JlbmRlci9mcGRmX3JlbmRlcl9wYXR0ZXJuX2VtYmVkZGVydGVzdC5jcHAiLAogICAgICJjb3JlL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZW1iZWRkZXJ0ZXN0LmNwcCIsCi0gICAgImNvcmUvZnhnZS9nZS9meF9nZV90ZXh0X2VtYmVkZGVydGVzdC5jcHAiLAorICAgICJjb3JlL2Z4Z2UvZnhfZ2VfdGV4dF9lbWJlZGRlcnRlc3QuY3BwIiwKICAgICAiZnBkZnNkay9mcGRmX2RhdGFhdmFpbF9lbWJlZGRlcnRlc3QuY3BwIiwKICAgICAiZnBkZnNkay9mcGRmX2ZsYXR0ZW5fZW1iZWRkZXJ0ZXN0LmNwcCIsCiAgICAgImZwZGZzZGsvZnBkZl9zdHJ1Y3R0cmVlX2VtYmVkZGVydGVzdC5jcHAiLAorICAgICJmcGRmc2RrL2ZwZGZhbm5vdF9lbWJlZGRlcnRlc3QuY3BwIiwKKyAgICAiZnBkZnNkay9mcGRmYXR0YWNobWVudF9lbWJlZGRlcnRlc3QuY3BwIiwKICAgICAiZnBkZnNkay9mcGRmZG9jX2VtYmVkZGVydGVzdC5jcHAiLAogICAgICJmcGRmc2RrL2ZwZGZlZGl0X2VtYmVkZGVydGVzdC5jcHAiLAorICAgICJmcGRmc2RrL2ZwZGZlZGl0cGF0aF9lbWJlZGRlcnRlc3QuY3BwIiwKICAgICAiZnBkZnNkay9mcGRmZXh0X2VtYmVkZGVydGVzdC5jcHAiLAogICAgICJmcGRmc2RrL2ZwZGZmb3JtZmlsbF9lbWJlZGRlcnRlc3QuY3BwIiwKICAgICAiZnBkZnNkay9mcGRmcHBvX2VtYmVkZGVydGVzdC5jcHAiLApAQCAtMTg0NCwxMyArMjkxMywyMCBAQAogICAgICJmcGRmc2RrL2ZwZGZ2aWV3X2NfYXBpX3Rlc3QuaCIsCiAgICAgImZwZGZzZGsvZnBkZnZpZXdfZW1iZWRkZXJ0ZXN0LmNwcCIsCiAgICAgImZwZGZzZGsvZnNka19iYXNlZm9ybV9lbWJlZGRlcnRlc3QuY3BwIiwKKyAgICAiZnBkZnNkay9wd2wvY3B3bF9jb21ib19ib3hfZW1iZWRkZXJ0ZXN0LmNwcCIsCisgICAgImZwZGZzZGsvcHdsL2Nwd2xfZWRpdF9lbWJlZGRlcnRlc3QuY3BwIiwKICAgICAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmNwcCIsCiAgICAgInRlc3RpbmcvZW1iZWRkZXJfdGVzdC5oIiwKKyAgICAidGVzdGluZy9lbWJlZGRlcl90ZXN0X21haW4uY3BwIiwKICAgICAidGVzdGluZy9lbWJlZGRlcl90ZXN0X21vY2tfZGVsZWdhdGUuaCIsCiAgICAgInRlc3RpbmcvZW1iZWRkZXJfdGVzdF90aW1lcl9oYW5kbGluZ19kZWxlZ2F0ZS5oIiwKLSAgICAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2ltcGxlX3BhcnNlcl9lbWJlZGRlcnRlc3QuY3BwIiwKKyAgICAidGVzdGluZy9mYWtlX2ZpbGVfYWNjZXNzLmNwcCIsCisgICAgInRlc3RpbmcvZmFrZV9maWxlX2FjY2Vzcy5oIiwKKyAgICAidGVzdGluZy9yYW5nZV9zZXQuY3BwIiwKKyAgICAidGVzdGluZy9yYW5nZV9zZXQuaCIsCiAgIF0KICAgZGVwcyA9IFsKKyAgICAiOmltYWdlX2RpZmYiLAogICAgICI6cGRmaXVtIiwKICAgICAiOnRlc3Rfc3VwcG9ydCIsCiAgICAgIi8vdGVzdGluZy9nbW9jayIsCkBAIC0xODYxLDcgKzI5MzcsNyBAQAogCiAgIGlmIChwZGZfZW5hYmxlX3Y4KSB7CiAgICAgc291cmNlcyArPSBbCi0gICAgICAiZnBkZnNkay9qYXZhc2NyaXB0L3B1YmxpY19tZXRob2RzX2VtYmVkZGVydGVzdC5jcHAiLAorICAgICAgImZ4anMvY2pzX3B1YmxpY21ldGhvZHNfZW1iZWRkZXJ0ZXN0LmNwcCIsCiAgICAgICAiZnhqcy9meGpzX3Y4X2VtYmVkZGVydGVzdC5jcHAiLAogICAgICAgInRlc3RpbmcvanNfZW1iZWRkZXJfdGVzdC5jcHAiLAogICAgICAgInRlc3RpbmcvanNfZW1iZWRkZXJfdGVzdC5oIiwKQEAgLTE4NjksNiArMjk0NSwxNSBAQAogICAgIGRlcHMgKz0gWyAiOmZ4anMiIF0KICAgICBjb25maWdzICs9IFsgIi8vdjg6ZXh0ZXJuYWxfc3RhcnR1cF9kYXRhIiBdCiAgIH0KKyAgaWYgKHBkZl9lbmFibGVfeGZhKSB7CisgICAgc291cmNlcyArPSBbCisgICAgICAiZnhqcy9jZnhqc2VfZm9ybWNhbGNfY29udGV4dF9lbWJlZGRlcnRlc3QuY3BwIiwKKyAgICAgICJ0ZXN0aW5nL3hmYV9qc19lbWJlZGRlcl90ZXN0LmNwcCIsCisgICAgICAidGVzdGluZy94ZmFfanNfZW1iZWRkZXJfdGVzdC5oIiwKKyAgICAgICJ4ZmEvZndsL2Nmd2xfZWRpdF9lbWJlZGRlcnRlc3QuY3BwIiwKKyAgICAgICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaW1wbGVfcGFyc2VyX2VtYmVkZGVydGVzdC5jcHAiLAorICAgIF0KKyAgfQogICBpZiAoaXNfYW5kcm9pZCkgewogICAgIGlnbm9yZV9hbGxfZGF0YV9kZXBzID0gdHJ1ZQogICAgIHVzZV9yYXdfYW5kcm9pZF9leGVjdXRhYmxlID0gdHJ1ZQpAQCAtMTg4Miw2ICsyOTY3LDIzIEBACiAgICAgICAiLy9zYW1wbGVzIiwKICAgICBdCiAgIH0KKworICBleGVjdXRhYmxlKCJwZGZpdW1fZGlmZiIpIHsKKyAgICB0ZXN0b25seSA9IHRydWUKKyAgICBzb3VyY2VzID0gWworICAgICAgInRlc3RpbmcvaW1hZ2VfZGlmZi9pbWFnZV9kaWZmLmNwcCIsCisgICAgXQorICAgIGRlcHMgPSBbCisgICAgICAiOmltYWdlX2RpZmYiLAorICAgICAgIjpwZGZpdW0iLAorICAgICAgIi8vYnVpbGQvY29uZmlnOmV4ZV9hbmRfc2hsaWJfZGVwcyIsCisgICAgICAiLy9idWlsZC93aW46ZGVmYXVsdF9leGVfbWFuaWZlc3QiLAorICAgIF0KKyAgICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KKyAgICBjb25maWdzICs9IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOm5vX2Nocm9taXVtX2NvZGUiIF0KKyAgICBjb25maWdzICs9IFsgIjpwZGZpdW1fY29yZV9jb25maWciIF0KKyAgfQorCiAgIGdyb3VwKCJmdXp6ZXJzIikgewogICAgIHRlc3Rvbmx5ID0gdHJ1ZQogICAgIGRlcHMgPSBbCkBAIC0xODg5LDMgKzI5OTEsMTggQEAKICAgICBdCiAgIH0KIH0KKworZ3JvdXAoInBkZml1bV9hbGwiKSB7CisgIHRlc3Rvbmx5ID0gdHJ1ZQorICBkZXBzID0gWworICAgICI6cGRmaXVtX2VtYmVkZGVydGVzdHMiLAorICAgICI6cGRmaXVtX3VuaXR0ZXN0cyIsCisgIF0KKyAgaWYgKHBkZl9pc19zdGFuZGFsb25lKSB7CisgICAgZGVwcyArPSBbCisgICAgICAiOmZ1enplcnMiLAorICAgICAgIjpwZGZpdW1fZGlmZiIsCisgICAgICAiOnNhbXBsZXMiLAorICAgIF0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvREVQUyBiL0RFUFMKaW5kZXggN2ViZjQxMi4uN2FiYzYwZiAxMDA2NDQKLS0tIGEvREVQUworKysgYi9ERVBTCkBAIC0xLDI1ICsxLDQxIEBACiB1c2VfcmVsYXRpdmVfcGF0aHMgPSBUcnVlCiAKIHZhcnMgPSB7CisgICMgQnkgZGVmYXVsdCwgd2Ugc2hvdWxkIGNoZWNrIG91dCBldmVyeXRoaW5nIG5lZWRlZCB0byBydW4gb24gdGhlIG1haW4KKyAgIyBjaHJvbWl1bSB3YXRlcmZhbGxzLiBUaGlzIHZhciBjYW4gYmUgYWxzbyBiZSBzZXQgdG8gInNtYWxsIiwgaW4gb3JkZXIKKyAgIyB0byBza2lwIHRoaW5ncyBhcmUgbm90IHN0cmljdGx5IG5lZWRlZCB0byBidWlsZCBjaHJvbWl1bSBmb3IgZGV2ZWxvcG1lbnQKKyAgIyBwdXJwb3Nlcy4KKyAgJ2NoZWNrb3V0X2NvbmZpZ3VyYXRpb24nOiAnZGVmYXVsdCcsCisKKyAgIyBUT0RPKGRwcmFua2UpOiBjaGFuZ2UgdG8gIT0gInNtYWxsIiBvbmNlICE9IGlzIHN1cHBvcnRlZC4KKyAgJ2NoZWNrb3V0X2luc3RydW1lbnRlZF9saWJyYXJpZXMnOiAnY2hlY2tvdXRfbGludXggYW5kIGNoZWNrb3V0X2NvbmZpZ3VyYXRpb24gPT0gImRlZmF1bHQiJywKKwogICAnY2hyb21pdW1fZ2l0JzogJ2h0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbScsCiAgICdwZGZpdW1fZ2l0JzogJ2h0dHBzOi8vcGRmaXVtLmdvb2dsZXNvdXJjZS5jb20nLAogCi0gICdhbmRyb2lkX25ka19yZXZpc2lvbic6ICcyNmQ5M2VjMDdmM2NlMmVjMmNkZmVhZTFiMjFlZTZmMTJmZjg2OGQ4JywKLSAgJ2J1aWxkX3JldmlzaW9uJzogJ2RkNzk1YTI2YjllNDNmZjNhMGQ3NjFiZmQ1MDljMmZhNjdhM2E3YTEnLAotICAnYnVpbGR0b29sc19yZXZpc2lvbic6ICdjZjQ5M2Y4YjFhZTU5NjExYjE5YjAwMGQ3YWY5MjI1NTliNmFlOTJhJywKLSAgJ2NhdGFwdWx0X3JldmlzaW9uJzogJzg2MzUyYjk2NmIwMjQ1ZDY4ODNlNWY3ZGYyNzY4Nzg1Njk3OGI2ZDcnLAotICAnY2xhbmdfcmV2aXNpb24nOiAnMzdkNzAxYjg3YTEwYTJiZGVlMWE1YzM1MjNmNzU0ZWJmNjRhN2U2NicsCisgICdhbmRyb2lkX25ka19yZXZpc2lvbic6ICdkNTc1MjMyMTAyMzliODY3ZmE0ZmI5ZDA1YzJhYWNjM2YxODAyZmUwJywKKyAgJ2JpbnV0aWxzX3JldmlzaW9uJzogJ2UxNDYyMjhjMjBhZjZhZjkyMjg4N2QwYmUyZDM2NDFjYmZmYjMzYzUnLAorICAnYnVpbGRfcmV2aXNpb24nOiAnMDk3Yzc5YmFiYzliMmNlNDBiNjFjM2UzM2RhMWM2NjgxYWNmODM3YycsCisgICdidWlsZHRvb2xzX3JldmlzaW9uJzogJ2IzNmM3YjYwZWQ3MzkxOWIxNTdjN2QyM2VjNWZjZTJhYTY5YWIwNWUnLAorICAnY2F0YXB1bHRfcmV2aXNpb24nOiAnZDYyNGIzY2VkMmM4MWQ0ZmI0ZWE5OGE4ZGJiNDUzMjI3MmNjMWUwYScsCisgICdjbGFuZ19yZXZpc2lvbic6ICdhYzFlNWY3OGMzOWRjMmEyNjJhZjE0OTQwNGRkMzZjMTQwZWVjZGMxJywKICAgJ2N5Z3dpbl9yZXZpc2lvbic6ICdjODllNDQ2YjI3MzY5N2ZhZGYzYTEwZmYxMDA3YTk3YzBiN2RlNmRmJywKLSAgJ2dlbl9saWJyYXJ5X2xvYWRlcl9yZXZpc2lvbic6ICc5MTZkNGFjZDhiMmNkZTY3YTM5MDczN2RmYmE5MGIzYzM3ZGUyM2ExJywKKyAgJ2RlcG90X3Rvb2xzX3JldmlzaW9uJzogJzJlOGQ4MzQ4Yjg1NzRmMDZjMjZkYmYzZWY5NTliNWRmMTFiYTUxNDgnLAorICAnZnJlZXR5cGVfcmV2aXNpb24nOiAnMmMwNDhhOGE2MjJlOWY0NGYyNTVhYTMzMTYwMjZmMTI0YWM5ZWNiYycsCiAgICdnbW9ja19yZXZpc2lvbic6ICcyOTc2Mzk2NWFiNTJmMjQ1NjUyOTk5NzZiOTM2ZDEyNjVjYjZhMjcxJywKICAgJ2d0ZXN0X3JldmlzaW9uJzogJzgyNDU1NDViNmRjOWM0NzAzZTY0OTZkMWVmZDE5ZTk3NWFkMmIwMzgnLAotICAnaWN1X3JldmlzaW9uJzogJzczZTI0NzM2Njc2YjRiNDM4MjcwZmRhNDRlNWIyYzgzYjQ5ZmRkODAnLAotICAnaW5zdHJ1bWVudGVkX2xpYl9yZXZpc2lvbic6ICc0NWY1ODE0YjE1NDNlNDFlYTBiZTU0Yzc3MWUzODQwZWE1MmNjYTRhJywKLSAgJ3BkZml1bV90ZXN0c19yZXZpc2lvbic6ICdkMjVhNDIyYWIwM2Q2YzMxMDkzNzBiYzQ1NGM2Mjk1NzVlOTY5MzI5JywKLSAgJ3NraWFfcmV2aXNpb24nOiAnOTBlM2NkNzg5OTFlZjMzN2RiZDAwMjNlZmIzMGVjZTg2NDY5NDMwOCcsCisgICdpY3VfcmV2aXNpb24nOiAnZTNiNDgwZDNiZTQ0NDZlYTE3MDExYzBjZGM5YzRjZDM4MGE1YzU4ZicsCisgICdpbnN0cnVtZW50ZWRfbGliX3JldmlzaW9uJzogJzI4NDE3NDU4YWM0ZGM3OWY2ODkxNTA3OWQwZjI4M2Y2ODI1MDRjYzAnLAorICAnamluamEyX3JldmlzaW9uJzogJ2QzNDM4MzIwNmZhNDJkNTJmYWExMGJiOTkzMWQ2ZDUzOGYzYTU3ZTAnLAorICAnanBlZ190dXJib19yZXZpc2lvbic6ICc3MjYwZTRkOGI4ZTFlNDBiMTdmMDNmYWZkZjFjZDgzMjk2OTAwZjc2JywKKyAgJ21hcmt1cHNhZmVfcmV2aXNpb24nOiAnOGY0NWY1Y2ZhMDAwOWQyYTcwNTg5YmNkYTAzNDliOGNiMmI3Mjc4MycsCisgICdwZGZpdW1fdGVzdHNfcmV2aXNpb24nOiAnM2Q2MjI4ZGE2NTZhMzk3NGQ3MjIyM2E3MDJlNjgwNGRmNDk0NzAzZScsCisgICdza2lhX3JldmlzaW9uJzogJzQwY2EyMDg3ZWYwNzUyZDc4ZmQyZTA5OTU0NzExMDJmZTk2ZmU5ZmUnLAogICAndG9vbHNfbWVtb3J5X3JldmlzaW9uJzogJzQyN2YxMDQ3NWUxYThkNzI0MjRjMjlkMDBiZjY4OTEyMmI3MzhlNWQnLAotICAndHJhY2VfZXZlbnRfcmV2aXNpb24nOiAnMDYyOTRjOGE0YTZmNzQ0ZWYyODRjZDYzY2ZlNTRkYmY2MWVlYTI5MCcsCi0gICd2OF9yZXZpc2lvbic6ICc3YTYzNDc5ODMwMmI0YWIxZjE1MjVhOWE4ODE2Mjk1MTljMGMyYTk5JywKKyAgJ3RyYWNlX2V2ZW50X3JldmlzaW9uJzogJzBlOWE0N2Q3NDk3MGJlZTFiYmZjMDYzYzQ3MjE1NDA2Zjg5MTg2OTknLAorICAndjhfcmV2aXNpb24nOiAnMGMyODc4ODJlYTIzM2YyOTlhOTFmNmI3MmI1NmQ4ZmFhZWNmNTJjMCcsCisgICd5YXNtX3NvdXJjZV9yZXZpc2lvbic6ICdiOTgxMTRlMThkOGI5Yjg0NTg2YjEwZDI0MzUzYWI4NjE2ZDRjNWZjJywKKyAgJ3psaWJfcmV2aXNpb24nOiAnOTExNTViNWQwNzM3NzEzZmM3ZjA0OTljZjBiYTJjNGYyYWYyNDAxNCcsCiB9CiAKIGRlcHMgPSB7CkBAIC0zMSw3ICs0Nyw4IEBACiAgICAgVmFyKCdjaHJvbWl1bV9naXQnKSArICIvY2hyb21pdW0vc3JjL2J1aWxkLmdpdEAiICsgVmFyKCdidWlsZF9yZXZpc2lvbicpLAogCiAgICJidWlsZHRvb2xzIjoKLSAgICBWYXIoJ2Nocm9taXVtX2dpdCcpICsgIi9jaHJvbWl1bS9idWlsZHRvb2xzLmdpdEAiICsgVmFyKCdidWlsZHRvb2xzX3JldmlzaW9uJyksCisgICAgVmFyKCdjaHJvbWl1bV9naXQnKSArICIvY2hyb21pdW0vYnVpbGR0b29scy5naXRAIiArCisgICAgICAgIFZhcignYnVpbGR0b29sc19yZXZpc2lvbicpLAogCiAgICJ0ZXN0aW5nL2NvcnB1cyI6CiAgICAgVmFyKCdwZGZpdW1fZ2l0JykgKyAiL3BkZml1bV90ZXN0c0AiICsgVmFyKCdwZGZpdW1fdGVzdHNfcmV2aXNpb24nKSwKQEAgLTQyLDI1ICs1OSw1NiBAQAogICAidGVzdGluZy9ndGVzdCI6CiAgICAgVmFyKCdjaHJvbWl1bV9naXQnKSArICIvZXh0ZXJuYWwvZ29vZ2xldGVzdC5naXRAIiArIFZhcignZ3Rlc3RfcmV2aXNpb24nKSwKIAorICAidGhpcmRfcGFydHkvYmludXRpbHMiOgorICAgIFZhcignY2hyb21pdW1fZ2l0JykgKyAiL2Nocm9taXVtL3NyYy90aGlyZF9wYXJ0eS9iaW51dGlscy5naXRAIiArCisgICAgICAgIFZhcignYmludXRpbHNfcmV2aXNpb24nKSwKKworICAndGhpcmRfcGFydHkvZGVwb3RfdG9vbHMnOgorICAgIFZhcignY2hyb21pdW1fZ2l0JykgKyAnL2Nocm9taXVtL3Rvb2xzL2RlcG90X3Rvb2xzLmdpdCcgKyAnQCcgKworICAgICAgICBWYXIoJ2RlcG90X3Rvb2xzX3JldmlzaW9uJyksCisKKyAgInRoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYyI6CisgICAgVmFyKCdjaHJvbWl1bV9naXQnKSArICcvY2hyb21pdW0vc3JjL3RoaXJkX3BhcnR5L2ZyZWV0eXBlMi5naXRAJyArCisgICAgICAgIFZhcignZnJlZXR5cGVfcmV2aXNpb24nKSwKKwogICAidGhpcmRfcGFydHkvaWN1IjoKICAgICBWYXIoJ2Nocm9taXVtX2dpdCcpICsgIi9jaHJvbWl1bS9kZXBzL2ljdS5naXRAIiArIFZhcignaWN1X3JldmlzaW9uJyksCiAKICAgInRoaXJkX3BhcnR5L2luc3RydW1lbnRlZF9saWJyYXJpZXMiOgotICAgIFZhcignY2hyb21pdW1fZ2l0JykgKyAiL2Nocm9taXVtL3NyYy90aGlyZF9wYXJ0eS9pbnN0cnVtZW50ZWRfbGlicmFyaWVzLmdpdEAiICsgVmFyKCdpbnN0cnVtZW50ZWRfbGliX3JldmlzaW9uJyksCisgICAgVmFyKCdjaHJvbWl1bV9naXQnKSArCisgICAgICAgICIvY2hyb21pdW0vc3JjL3RoaXJkX3BhcnR5L2luc3RydW1lbnRlZF9saWJyYXJpZXMuZ2l0QCIgKworICAgICAgICBWYXIoJ2luc3RydW1lbnRlZF9saWJfcmV2aXNpb24nKSwKKworICAidGhpcmRfcGFydHkvamluamEyIjoKKyAgICBWYXIoJ2Nocm9taXVtX2dpdCcpICsgIi9jaHJvbWl1bS9zcmMvdGhpcmRfcGFydHkvamluamEyLmdpdEAiICsKKyAgICAgICAgVmFyKCdqaW5qYTJfcmV2aXNpb24nKSwKKworICAidGhpcmRfcGFydHkvbWFya3Vwc2FmZSI6CisgICAgVmFyKCdjaHJvbWl1bV9naXQnKSArICIvY2hyb21pdW0vc3JjL3RoaXJkX3BhcnR5L21hcmt1cHNhZmUuZ2l0QCIgKworICAgICAgICBWYXIoJ21hcmt1cHNhZmVfcmV2aXNpb24nKSwKKworICAidGhpcmRfcGFydHkvbGlianBlZ190dXJibyI6CisgICAgVmFyKCdjaHJvbWl1bV9naXQnKSArICIvY2hyb21pdW0vZGVwcy9saWJqcGVnX3R1cmJvLmdpdEAiICsKKyAgICAgICAgVmFyKCdqcGVnX3R1cmJvX3JldmlzaW9uJyksCiAKICAgInRoaXJkX3BhcnR5L3NraWEiOgotICAgIFZhcignY2hyb21pdW1fZ2l0JykgKyAnL3NraWEuZ2l0JyArICdAJyArICBWYXIoJ3NraWFfcmV2aXNpb24nKSwKKyAgICBWYXIoJ2Nocm9taXVtX2dpdCcpICsgJy9za2lhLmdpdEAnICsgIFZhcignc2tpYV9yZXZpc2lvbicpLAorCisgICJ0aGlyZF9wYXJ0eS96bGliIjoKKyAgICBWYXIoJ2Nocm9taXVtX2dpdCcpICsgIi9jaHJvbWl1bS9zcmMvdGhpcmRfcGFydHkvemxpYi5naXRAIiArCisgICAgICAgIFZhcignemxpYl9yZXZpc2lvbicpLAorCisgICd0aGlyZF9wYXJ0eS95YXNtL3NvdXJjZS9wYXRjaGVkLXlhc20nOgorICAgIFZhcignY2hyb21pdW1fZ2l0JykgKyAnL2Nocm9taXVtL2RlcHMveWFzbS9wYXRjaGVkLXlhc20uZ2l0QCcgKworICAgICAgICBWYXIoJ3lhc21fc291cmNlX3JldmlzaW9uJyksCiAKICAgInRvb2xzL2NsYW5nIjoKICAgICBWYXIoJ2Nocm9taXVtX2dpdCcpICsgIi9jaHJvbWl1bS9zcmMvdG9vbHMvY2xhbmdAIiArICBWYXIoJ2NsYW5nX3JldmlzaW9uJyksCiAKLSAgInRvb2xzL2dlbmVyYXRlX2xpYnJhcnlfbG9hZGVyIjoKLSAgICBWYXIoJ2Nocm9taXVtX2dpdCcpICsgIi9jaHJvbWl1bS9zcmMvdG9vbHMvZ2VuZXJhdGVfbGlicmFyeV9sb2FkZXJAIiArCi0gICAgICAgIFZhcignZ2VuX2xpYnJhcnlfbG9hZGVyX3JldmlzaW9uJyksCi0KICAgIyBUT0RPKEdZUCk6IFJlbW92ZSB0aGlzIHdoZW4gbm8gdG9vbHMgcmVseSBvbiBHWVAgYW55bW9yZS4KICAgInRvb2xzL2d5cCI6Ci0gICAgVmFyKCdjaHJvbWl1bV9naXQnKSArICcvZXh0ZXJuYWwvZ3lwLmdpdCcgKyAnQCcgKyAnYzYxYjBiMzVjODM5NmJmZDU5ZWZjNmNmYzExNDAxZDkxMmIwZjUxMCcsCisgICAgVmFyKCdjaHJvbWl1bV9naXQnKSArICcvZXh0ZXJuYWwvZ3lwLmdpdEAnICsKKyAgICAgICAgJ2ViMjk2ZjY3ZGEwNzhlYzAxZjVlM2E5ZWE5Y2RjNmQyNmQ2ODAxNjEnLAogCiAgICJ0b29scy9tZW1vcnkiOgogICAgIFZhcignY2hyb21pdW1fZ2l0JykgKyAiL2Nocm9taXVtL3NyYy90b29scy9tZW1vcnlAIiArCkBAIC03NSw3ICsxMjMsOSBAQAogICAgICJ0aGlyZF9wYXJ0eS9hbmRyb2lkX25kayI6CiAgICAgICBWYXIoJ2Nocm9taXVtX2dpdCcpICsgIi9hbmRyb2lkX25kay5naXRAIiArIFZhcignYW5kcm9pZF9uZGtfcmV2aXNpb24nKSwKICAgICAidGhpcmRfcGFydHkvY2F0YXB1bHQiOgotICAgICAgVmFyKCdjaHJvbWl1bV9naXQnKSArICIvZXh0ZXJuYWwvZ2l0aHViLmNvbS9jYXRhcHVsdC1wcm9qZWN0L2NhdGFwdWx0LmdpdEAiICsgVmFyKCdjYXRhcHVsdF9yZXZpc2lvbicpLAorICAgICAgVmFyKCdjaHJvbWl1bV9naXQnKSArCisgICAgICAgICAgIi9leHRlcm5hbC9naXRodWIuY29tL2NhdGFwdWx0LXByb2plY3QvY2F0YXB1bHQuZ2l0QCIgKworICAgICAgICAgIFZhcignY2F0YXB1bHRfcmV2aXNpb24nKSwKICAgfSwKICAgIndpbiI6IHsKICAgICAidjgvdGhpcmRfcGFydHkvY3lnd2luIjoKQEAgLTEwMyw3ICsxNTMsNiBAQAogfQogCiBob29rcyA9IFsKLSAgIyBQdWxsIEdOIGJpbmFyaWVzLiBUaGlzIG5lZWRzIHRvIGJlIGJlZm9yZSBydW5uaW5nIEdZUCBiZWxvdy4KICAgewogICAgICduYW1lJzogJ2duX3dpbicsCiAgICAgJ2FjdGlvbic6IFsgJ2Rvd25sb2FkX2Zyb21fZ29vZ2xlX3N0b3JhZ2UnLApAQCAtMTc5LDEwICsyMjgsMjkgQEAKICAgICBdLAogICB9LAogICB7CisgICAgJ25hbWUnOiAnYmludXRpbHMnLAorICAgICdwYXR0ZXJuJzogJ3NyYy90aGlyZF9wYXJ0eS9iaW51dGlscycsCisgICAgJ2NvbmRpdGlvbic6ICdob3N0X29zID09ICJsaW51eCInLAorICAgICdhY3Rpb24nOiBbCisgICAgICAgICdweXRob24nLAorICAgICAgICAncGRmaXVtL3RoaXJkX3BhcnR5L2JpbnV0aWxzL2Rvd25sb2FkLnB5JywKKyAgICBdLAorICB9LAorICB7CisgICAgIyBEb3dubG9hZHMgdGhlIGN1cnJlbnQgc3RhYmxlIGxpbnV4IHN5c3Jvb3QgdG8gYnVpbGQvbGludXgvIGlmIG5lZWRlZC4KKyAgICAjIFRoaXMgc3lzcm9vdCB1cGRhdGVzIGF0IGFib3V0IHRoZSBzYW1lIHJhdGUgdGhhdCB0aGUgY2hyb21lIGJ1aWxkIGRlcHMKKyAgICAjIGNoYW5nZS4KKyAgICAnbmFtZSc6ICdzeXNyb290JywKKyAgICAncGF0dGVybic6ICcuJywKKyAgICAnYWN0aW9uJzogWydweXRob24nLCAncGRmaXVtL2J1aWxkL2xpbnV4L3N5c3Jvb3Rfc2NyaXB0cy9pbnN0YWxsLXN5c3Jvb3QucHknLAorICAgICAgICAgICAgICAgJy0tcnVubmluZy1hcy1ob29rJ10sCisgIH0sCisgIHsKICAgICAjIFVwZGF0ZSB0aGUgV2luZG93cyB0b29sY2hhaW4gaWYgbmVjZXNzYXJ5LgogICAgICduYW1lJzogJ3dpbl90b29sY2hhaW4nLAogICAgICdwYXR0ZXJuJzogJy4nLAotICAgICdhY3Rpb24nOiBbJ3B5dGhvbicsICdwZGZpdW0vYnVpbGQvdnNfdG9vbGNoYWluLnB5JywgJ3VwZGF0ZSddLAorICAgICdjb25kaXRpb24nOiAnY2hlY2tvdXRfd2luJywKKyAgICAnYWN0aW9uJzogWyd2cHl0aG9uJywgJ3BkZml1bS9idWlsZC92c190b29sY2hhaW4ucHknLCAndXBkYXRlJywgJy0tZm9yY2UnXSwKICAgfSwKICAgewogICAgICMgVXBkYXRlIHRoZSBNYWMgdG9vbGNoYWluIGlmIG5lY2Vzc2FyeS4KQEAgLTE5MSwxMSArMjU5LDI3IEBACiAgICAgJ2FjdGlvbic6IFsncHl0aG9uJywgJ3BkZml1bS9idWlsZC9tYWNfdG9vbGNoYWluLnB5J10sCiAgIH0sCiAgIHsKLSAgICAjIFB1bGwgc2FuaXRpemVyLWluc3RydW1lbnRlZCB0aGlyZC1wYXJ0eSBsaWJyYXJpZXMgaWYgcmVxdWVzdGVkIHZpYQotICAgICMgR1lQX0RFRklORVMuCi0gICAgJ25hbWUnOiAnaW5zdHJ1bWVudGVkX2xpYnJhcmllcycsCi0gICAgJ3BhdHRlcm4nOiAnXFwuc2hhMScsCi0gICAgJ2FjdGlvbic6IFsncHl0aG9uJywgJ3BkZml1bS90aGlyZF9wYXJ0eS9pbnN0cnVtZW50ZWRfbGlicmFyaWVzL3NjcmlwdHMvZG93bmxvYWRfYmluYXJpZXMucHknXSwKKyAgICAnbmFtZSc6ICdtc2FuX2NoYWluZWRfb3JpZ2lucycsCisgICAgJ3BhdHRlcm4nOiAnLicsCisgICAgJ2NvbmRpdGlvbic6ICdjaGVja291dF9pbnN0cnVtZW50ZWRfbGlicmFyaWVzJywKKyAgICAnYWN0aW9uJzogWyAncHl0aG9uJywKKyAgICAgICAgICAgICAgICAncGRmaXVtL3RoaXJkX3BhcnR5L2RlcG90X3Rvb2xzL2Rvd25sb2FkX2Zyb21fZ29vZ2xlX3N0b3JhZ2UucHknLAorICAgICAgICAgICAgICAgICItLW5vX3Jlc3VtZSIsCisgICAgICAgICAgICAgICAgIi0tbm9fYXV0aCIsCisgICAgICAgICAgICAgICAgIi0tYnVja2V0IiwgImNocm9taXVtLWluc3RydW1lbnRlZC1saWJyYXJpZXMiLAorICAgICAgICAgICAgICAgICItcyIsICJwZGZpdW0vdGhpcmRfcGFydHkvaW5zdHJ1bWVudGVkX2xpYnJhcmllcy9iaW5hcmllcy9tc2FuLWNoYWluZWQtb3JpZ2lucy10cnVzdHkudGd6LnNoYTEiLAorICAgICAgICAgICAgICBdLAogICB9LAotCisgIHsKKyAgICAnbmFtZSc6ICdtc2FuX25vX29yaWdpbnMnLAorICAgICdwYXR0ZXJuJzogJy4nLAorICAgICdjb25kaXRpb24nOiAnY2hlY2tvdXRfaW5zdHJ1bWVudGVkX2xpYnJhcmllcycsCisgICAgJ2FjdGlvbic6IFsgJ3B5dGhvbicsCisgICAgICAgICAgICAgICAgJ3BkZml1bS90aGlyZF9wYXJ0eS9kZXBvdF90b29scy9kb3dubG9hZF9mcm9tX2dvb2dsZV9zdG9yYWdlLnB5JywKKyAgICAgICAgICAgICAgICAiLS1ub19yZXN1bWUiLAorICAgICAgICAgICAgICAgICItLW5vX2F1dGgiLAorICAgICAgICAgICAgICAgICItLWJ1Y2tldCIsICJjaHJvbWl1bS1pbnN0cnVtZW50ZWQtbGlicmFyaWVzIiwKKyAgICAgICAgICAgICAgICAiLXMiLCAicGRmaXVtL3RoaXJkX3BhcnR5L2luc3RydW1lbnRlZF9saWJyYXJpZXMvYmluYXJpZXMvbXNhbi1uby1vcmlnaW5zLXRydXN0eS50Z3ouc2hhMSIsCisgICAgICAgICAgICAgIF0sCisgIH0sCiBdCmRpZmYgLS1naXQgYS9QUkVTVUJNSVQucHkgYi9QUkVTVUJNSVQucHkKaW5kZXggZGIxYmYwMC4uYTdkYjEyMyAxMDA2NDQKLS0tIGEvUFJFU1VCTUlULnB5CisrKyBiL1BSRVNVQk1JVC5weQpAQCAtMjQ5LDYgKzI0OSw0OCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MpKQogICByZXR1cm4gcmVzdWx0cwogCitkZWYgX0NoZWNrVGVzdER1cGxpY2F0ZXMoaW5wdXRfYXBpLCBvdXRwdXRfYXBpKToKKyAgIiIiQ2hlY2tzIHRoYXQgcGl4ZWwgYW5kIGphdmFzY3JpcHQgdGVzdHMgZG9uJ3QgY29udGFpbiBkdXBsaWNhdGVzLgorICBXZSB1c2UgLmluIGFuZCAucGRmIGZpbGVzLCBoYXZpbmcgYm90aCBjYW4gY2F1c2UgcmFjZSBjb25kaXRpb25zIG9uIHRoZSBib3RzLAorICB3aGljaCBydW4gdGhlIHRlc3RzIGluIHBhcmFsbGVsLgorICAiIiIKKyAgdGVzdHNfYWRkZWQgPSBbXQorICByZXN1bHRzID0gW10KKyAgZm9yIGYgaW4gaW5wdXRfYXBpLkFmZmVjdGVkRmlsZXMoKToKKyAgICBpZiBub3QgZi5Mb2NhbFBhdGgoKS5zdGFydHN3aXRoKCgndGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvJywKKyAgICAgICAgJ3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvJykpOgorICAgICAgY29udGludWUKKyAgICBlbmRfbGVuID0gMAorICAgIGlmIGYuTG9jYWxQYXRoKCkuZW5kc3dpdGgoJy5pbicpOgorICAgICAgZW5kX2xlbiA9IDMKKyAgICBlbGlmIGYuTG9jYWxQYXRoKCkuZW5kc3dpdGgoJy5wZGYnKToKKyAgICAgIGVuZF9sZW4gPSA0CisgICAgZWxzZToKKyAgICAgIGNvbnRpbnVlCisgICAgcGF0aCA9IGYuTG9jYWxQYXRoKClbOi1lbmRfbGVuXQorICAgIGlmIHBhdGggaW4gdGVzdHNfYWRkZWQ6CisgICAgICByZXN1bHRzLmFwcGVuZChvdXRwdXRfYXBpLlByZXN1Ym1pdEVycm9yKAorICAgICAgICAgICdSZW1vdmUgJXMgdG8gcHJldmVudCBzaGFkb3dpbmcgJXMnICUgKHBhdGggKyAnLnBkZicsCisgICAgICAgICAgICBwYXRoICsgJy5pbicpKSkKKyAgICBlbHNlOgorICAgICAgdGVzdHNfYWRkZWQuYXBwZW5kKHBhdGgpCisgIHJldHVybiByZXN1bHRzCisKK2RlZiBfQ2hlY2tQTkdGb3JtYXQoaW5wdXRfYXBpLCBvdXRwdXRfYXBpKToKKyAgIiIiQ2hlY2tzIHRoYXQgLnBuZyBmaWxlcyBoYXZlIGEgZm9ybWF0IHRoYXQgd2lsbCBiZSBjb25zaWRlcmVkIHZhbGlkIGJ5IG91cgorICB0ZXN0IHJ1bm5lcnMuIElmIGEgZmlsZSBlbmRzIHdpdGggLnBuZywgdGhlbiBpdCBtdXN0IGJlIG9mIHRoZSBmb3JtCisgIE5BTUVfZXhwZWN0ZWQoXyh3aW58bWFjfGxpbnV4KSk/LnBkZi4jLnBuZyIiIgorICBleHBlY3RlZF9wYXR0ZXJuID0gaW5wdXRfYXBpLnJlLmNvbXBpbGUoCisgICAgICByJy4rX2V4cGVjdGVkKF8od2lufG1hY3xsaW51eCkpP1wucGRmXC5cZCsucG5nJykKKyAgcmVzdWx0cyA9IFtdCisgIGZvciBmIGluIGlucHV0X2FwaS5BZmZlY3RlZEZpbGVzKGluY2x1ZGVfZGVsZXRlcz1GYWxzZSk6CisgICAgaWYgbm90IGYuTG9jYWxQYXRoKCkuZW5kc3dpdGgoJy5wbmcnKToKKyAgICAgIGNvbnRpbnVlCisgICAgaWYgZXhwZWN0ZWRfcGF0dGVybi5tYXRjaChmLkxvY2FsUGF0aCgpKToKKyAgICAgIGNvbnRpbnVlCisgICAgcmVzdWx0cy5hcHBlbmQob3V0cHV0X2FwaS5QcmVzdWJtaXRFcnJvcigKKyAgICAgICAgJ1BORyBmaWxlICVzIGRvZXMgbm90IGhhdmUgdGhlIGNvcnJlY3QgZm9ybWF0JyAlIGYuTG9jYWxQYXRoKCkpKQorICByZXR1cm4gcmVzdWx0cwogCiBkZWYgQ2hlY2tDaGFuZ2VPblVwbG9hZChpbnB1dF9hcGksIG91dHB1dF9hcGkpOgogICByZXN1bHRzID0gW10KQEAgLTI1Nyw1ICsyOTksNyBAQAogICByZXN1bHRzICs9IGlucHV0X2FwaS5jYW5uZWRfY2hlY2tzLkNoZWNrQ2hhbmdlTGludHNDbGVhbigKICAgICAgIGlucHV0X2FwaSwgb3V0cHV0X2FwaSwgTm9uZSwgTElOVF9GSUxURVJTKQogICByZXN1bHRzICs9IF9DaGVja0luY2x1ZGVPcmRlcihpbnB1dF9hcGksIG91dHB1dF9hcGkpCisgIHJlc3VsdHMgKz0gX0NoZWNrVGVzdER1cGxpY2F0ZXMoaW5wdXRfYXBpLCBvdXRwdXRfYXBpKQorICByZXN1bHRzICs9IF9DaGVja1BOR0Zvcm1hdChpbnB1dF9hcGksIG91dHB1dF9hcGkpCiAKICAgcmV0dXJuIHJlc3VsdHMKZGlmZiAtLWdpdCBhL1JFQURNRS5tZCBiL1JFQURNRS5tZAppbmRleCA4ZTFmYmNiLi42MmVmZGJjIDEwMDY0NAotLS0gYS9SRUFETUUubWQKKysrIGIvUkVBRE1FLm1kCkBAIC0xMSwxMCArMTEsMTEgQEAKIAogIyMjIFdpbmRvd3MgZGV2ZWxvcG1lbnQKIAotUERGaXVtIHVzZXMgYSBzaW1pbGFyIFdpbmRvd3MgdG9vbGNoYWluIGFzIENocm9taXVtOgorUERGaXVtIHVzZXMgdGhlIHNhbWUgYnVpbGQgdG9vbCBhcyBDaHJvbWl1bToKIAogIyMjIyBPcGVuIHNvdXJjZSBjb250cmlidXRvcnMKLVZpc3VhbCBTdHVkaW8gMjAxNSBVcGRhdGUgMiBvciBsYXRlciBpcyBoaWdobHkgcmVjb21tZW5kZWQuCitQbGVhc2UgcmVmZXIgdG8gW0Nocm9taXVtJ3MgVmlzdWFsIFN0dWRpbyBzZXQgdXBdKGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMvKy9tYXN0ZXIvZG9jcy93aW5kb3dzX2J1aWxkX2luc3RydWN0aW9ucy5tZCN2aXN1YWwtc3R1ZGlvKQorZm9yIHJlcXVpcmVtZW50cyBhbmQgaW5zdHJ1Y3Rpb25zIG9uIGJ1aWxkIGVudmlyb25tZW50IGNvbmZpZ3VyYXRpb24uCiAKIFJ1biBgc2V0IERFUE9UX1RPT0xTX1dJTl9UT09MQ0hBSU49MGAsIG9yIHNldCB0aGF0IHZhcmlhYmxlIGluIHlvdXIgZ2xvYmFsCiBlbnZpcm9ubWVudC4KQEAgLTI4LDYgKzI5LDkgQEAKIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZhbHVlLiBJZiB5b3Ugc3BlY2lmeSBBbmRyb2lkIGJ1aWxkLCB0aGUgZGVmYXVsdCBDUFUKIGFyY2hpdGVjdHVyZSB3aWxsIGJlICJgYXJtYCIuCiAKK0l0IGlzIGV4cGVjdGVkIHRoYXQgdGhlcmUgYXJlIHN0aWxsIHNvbWUgcGxhY2VzIGx1cmtpbmcgaW4gdGhlIGNvZGUgd2hpY2ggd2lsbAorbm90IGZ1bmN0aW9uIHByb3Blcmx5IG9uIGJpZy1lbmRpYW4gYXJjaGl0ZWN0dXJlcy4gQnVncyBhbmQvb3IgcGF0Y2hlcyBhcmUKK3dlbGNvbWUsIGhvd2V2ZXIgcHJvdmlkaW5nIHRoaXMgc3VwcG9ydCBpcyAqKm5vdCoqIGEgcHJpb3JpdHkgYXQgdGhpcyB0aW1lLgogCiAjIyMjIEdvb2dsZSBlbXBsb3llZXMKIApAQCAtMzYsNyArNDAsNyBAQAogQGdvb2dsZS5jb20gY3JlZGVudGlhbHMqKi4gRW50ZXIgIjAiIGlmIGFza2VkIGZvciBhIHByb2plY3QtaWQuCiAKIE9uY2UgeW91J3ZlIGRvbmUgdGhpcywgdGhlIHRvb2xjaGFpbiB3aWxsIGJlIGluc3RhbGxlZCBhdXRvbWF0aWNhbGx5IGZvcgoteW91IGluIFt0aGUgc3RlcF0oI0dlbkJ1aWxkKSBiZWxvdy4KK3lvdSBpbiB0aGUgW0dlbmVyYXRlIHRoZSBidWlsZCBmaWxlc10oI0dlbkJ1aWxkKSBzdGVwIGJlbG93LgogCiBUaGUgdG9vbGNoYWluIHdpbGwgYmUgaW4gYGRlcG90X3Rvb2xzXHdpbl90b29sY2hhaW5cdnNfZmlsZXNcPGhhc2g+YCwgYW5kIHdpbmRiZwogY2FuIGJlIGZvdW5kIGluIGBkZXBvdF90b29sc1x3aW5fdG9vbGNoYWluXHZzX2ZpbGVzXDxoYXNoPlx3aW5fc2RrXERlYnVnZ2Vyc2AuCkBAIC01OCwxNSArNjIsMTggQEAKIGNkIHBkZml1bQogYGBgCiAKLSMjPGEgbmFtZT0iR2VuQnVpbGQiPjwvYT4gR2VuZXJhdGUgdGhlIGJ1aWxkIGZpbGVzCitBZGRpdGlvbmFsIGJ1aWxkIGRlcGVuZGVuY2llcyBuZWVkIHRvIGJlIGluc3RhbGxlZCBieSBydW5uaW5nOgorCitgYGAKKy4vYnVpbGQvaW5zdGFsbC1idWlsZC1kZXBzLnNoCitgYGAKKworIyMgR2VuZXJhdGUgdGhlIGJ1aWxkIGZpbGVzCiAKIFdlIHVzZSBHTiB0byBnZW5lcmF0ZSB0aGUgYnVpbGQgZmlsZXMgYW5kCi1bTmluamFdKGh0dHA6Ly9tYXJ0aW5lLmdpdGh1Yi5pby9uaW5qYS8pIChhbHNvIGluY2x1ZGVkIHdpdGggdGhlIGRlcG90XF90b29scwotY2hlY2tvdXQpIHRvIGV4ZWN1dGUgdGhlIGJ1aWxkIGZpbGVzLgotCi1gYGAKLWduIGdlbiA8ZGlyZWN0b3J5PgotYGBgCitbTmluamFdKGh0dHA6Ly9tYXJ0aW5lLmdpdGh1Yi5pby9uaW5qYS8pCit0byBleGVjdXRlIHRoZSBidWlsZCBmaWxlcy4gIEJvdGggb2YgdGhlc2UgYXJlIGluY2x1ZGVkIHdpdGggdGhlCitkZXBvdFxfdG9vbHMgY2hlY2tvdXQuCiAKICMjIyBTZWxlY3RpbmcgYnVpbGQgY29uZmlndXJhdGlvbgogCkBAIC03Niw5ICs4MywxMCBAQAogCiBDb25maWd1cmF0aW9uIGlzIGRvbmUgYnkgZXhlY3V0aW5nIGBnbiBhcmdzIDxkaXJlY3Rvcnk+YCB0byBjb25maWd1cmUgdGhlIGJ1aWxkLgogVGhpcyB3aWxsIGxhdW5jaCBhbiBlZGl0b3IgaW4gd2hpY2ggeW91IGNhbiBzZXQgdGhlIGZvbGxvd2luZyBhcmd1bWVudHMuCitBIHR5cGljYWwgYDxkaXJlY3Rvcnk+YCBuYW1lIGlzIGBvdXQvRGVidWdgLgogCiBgYGAKLXVzZV9nb21hID0gdHJ1ZSAgIyBHb29nbGVycyBvbmx5LgordXNlX2dvbWEgPSB0cnVlICAjIEdvb2dsZXJzIG9ubHkuIE1ha2Ugc3VyZSBnb21hIGlzIGluc3RhbGxlZCBhbmQgcnVubmluZyBmaXJzdC4KIGlzX2RlYnVnID0gdHJ1ZSAgIyBFbmFibGUgZGVidWdnaW5nIGZlYXR1cmVzLgogCiBwZGZfdXNlX3NraWEgPSBmYWxzZSAgIyBTZXQgdHJ1ZSB0byBlbmFibGUgZXhwZXJpbWVudGFsIHNraWEgYmFja2VuZC4KQEAgLTkwLDE5ICs5OCwyMSBAQAogaXNfY29tcG9uZW50X2J1aWxkID0gZmFsc2UgIyBEaXNhYmxlIGNvbXBvbmVudCBidWlsZCAobXVzdCBiZSBmYWxzZSkKIAogY2xhbmdfdXNlX2Nocm9tZV9wbHVnaW5zID0gZmFsc2UgICMgQ3VycmVudGx5IG11c3QgYmUgZmFsc2UuCi11c2Vfc3lzcm9vdCA9IGZhbHNlICAjIEN1cnJlbnRseSBtdXN0IGJlIGZhbHNlIG9uIExpbnV4LgogYGBgCiAKIE5vdGUsIHlvdSBtdXN0IHNldCBgcGRmX2lzX3N0YW5kYWxvbmUgPSB0cnVlYCBpZiB5b3Ugd2FudCB0aGUgc2FtcGxlCiBhcHBsaWNhdGlvbnMgbGlrZSBgcGRmaXVtX3Rlc3RgIHRvIGJ1aWxkLgogCi1XaGVuIGNvbXBsZXRlIHRoZSBhcmd1bWVudHMgd2lsbCBiZSBzdG9yZWQgaW4gYDxkaXJlY3Rvcnk+L2FyZ3MuZ25gLgorV2hlbiBjb21wbGV0ZSB0aGUgYXJndW1lbnRzIHdpbGwgYmUgc3RvcmVkIGluIGA8ZGlyZWN0b3J5Pi9hcmdzLmduYCwgYW5kCitHTiB3aWxsIGF1dG9tYXRpY2FsbHkgdXNlIHRoZSBuZXcgYXJndW1lbnRzIHRvIGdlbmVyYXRlIGJ1aWxkIGZpbGVzLgorU2hvdWxkIHlvdXIgZmlsZXMgZmFpbCB0byBnZW5lcmF0ZSwgcGxlYXNlIGRvdWJsZS1jaGVjayB0aGF0IHlvdSBoYXZlIHNldAordXNlXF9zeXNyb290IGFzIGluZGljYXRlZCBhYm92ZS4KIAogIyMgQnVpbGRpbmcgdGhlIGNvZGUKIAotSWYgeW91IHVzZWQgTmluamEsIHlvdSBjYW4gYnVpbGQgdGhlIHNhbXBsZSBwcm9ncmFtIGJ5OgotYG5pbmphIC1DIDxkaXJlY3Rvcnk+L3BkZml1bV90ZXN0YCBZb3UgY2FuIGJ1aWxkIHRoZSBlbnRpcmUgcHJvZHVjdCAod2hpY2gKLWluY2x1ZGVzIGEgZmV3IHVuaXQgdGVzdHMpIGJ5OiBgbmluamEgLUMgPGRpcmVjdG9yeT5gLgorWW91IGNhbiBidWlsZCB0aGUgc2FtcGxlIHByb2dyYW0gYnkgcnVubmluZzogYG5pbmphIC1DIDxkaXJlY3Rvcnk+IHBkZml1bV90ZXN0YAorWW91IGNhbiBidWlsZCB0aGUgZW50aXJlIHByb2R1Y3QgKHdoaWNoIGluY2x1ZGVzIGEgZmV3IHVuaXQgdGVzdHMpIGJ5IHJ1bm5pbmc6CitgbmluamEgLUMgPGRpcmVjdG9yeT4gcGRmaXVtX2FsbGAuCiAKICMjIFJ1bm5pbmcgdGhlIHNhbXBsZSBwcm9ncmFtCiAKQEAgLTEyNiw2ICsxMzYsMTEgQEAKIHlvdSBzZWUgZmFpbHVyZXMsIGl0IGNhbiBiZSBhIGdvb2QgaWRlYSB0byBydW4gdGhlIHRlc3RzIG9uIHRoZSB0aXAtb2YtdHJlZQogY2hlY2tvdXQgdG8gc2VlIGlmIHRoZSBzYW1lIGZhaWx1cmVzIGFwcGVhci4KIAorIyMgQ29kZSBDb3ZlcmFnZQorCitDb2RlIGNvdmVyYWdlIHJlcG9ydHMgZm9yIFBERml1bSBjYW4gYmUgZ2VuZXJhdGVkIGluIExpbnV4IGRldmVsb3BtZW50CitlbnZpcm9ubWVudHMuIERldGFpbHMgY2FuIGJlIGZvdW5kIFtoZXJlXSgvZG9jcy9jb2RlLWNvdmVyYWdlLm1kKS4KKwogIyMgV2F0ZXJmYWxsCiAKIFRoZSBjdXJyZW50IGhlYWx0aCBvZiB0aGUgc291cmNlIHRyZWUgY2FuIGJlIGZvdW5kIGF0CkBAIC0xNTMsNyArMTY4LDEwIEBACiAKIEZvciBjb250cmlidXRpbmcgY29kZSwgd2Ugd2lsbCBmb2xsb3cKIFtDaHJvbWl1bSdzIHByb2Nlc3NdKGh0dHA6Ly9kZXYuY2hyb21pdW0ub3JnL2RldmVsb3BlcnMvY29udHJpYnV0aW5nLWNvZGUpCi1hcyBtdWNoIGFzIHBvc3NpYmxlLiBUaGUgbWFpbiBleGNlcHRpb25zIGlzOgorYXMgbXVjaCBhcyBwb3NzaWJsZS4gVGhlIG1haW4gZXhjZXB0aW9ucyBhcmU6CiAKIDEuIENvZGUgaGFzIHRvIGNvbmZvcm0gdG8gdGhlIGV4aXN0aW5nIHN0eWxlIGFuZCBub3QgQ2hyb21pdW0vR29vZ2xlIHN0eWxlLgotCisyLiBQREZpdW0gdXNlcyBhIGRpZmZlcmVudCB0b29sIGZvciBjb2RlIHJldmlld3MsIGFuZCBjcmVkZW50aWFscyBmb3IKK3RoZSB0b29sIG5lZWQgdG8gYmUgZ2VuZXJhdGVkIGJlZm9yZSB1cGxvYWRpbmcgYSBDTC4KKzMuIFBERml1bSBpcyBjdXJyZW50bHkgaG9sZGluZyBhdCBDKysxMSBjb21wYXRpYmlsaXR5LCByZWplY3RpbmcgZmVhdHVyZXMgdGhhdAorYXJlIG9ubHkgcHJlc2VudCBpbiBDKysxNCAob250byB3aGljaCBDaHJvbWl1bSBpcyBub3cgc2xvd2x5IG1vdmluZykuCmRpZmYgLS1naXQgYS9idWlsZF9vdmVycmlkZXMvUkVBRE1FLm1kIGIvYnVpbGRfb3ZlcnJpZGVzL1JFQURNRS5tZAppbmRleCBjYzBlZmJmLi42OWEzOGQ0IDEwMDY0NAotLS0gYS9idWlsZF9vdmVycmlkZXMvUkVBRE1FLm1kCisrKyBiL2J1aWxkX292ZXJyaWRlcy9SRUFETUUubWQKQEAgLTE2LDcgKzE2LDcgQEAKIGBidWlsZF9zdGFuZGFsb25lX2Q4ID0gZmFsc2VgLgogCiBUaGUgdHdvIGZpbGVzIHNob3VsZCBkZWZpbmUgdGhlIHNhbWUgc2V0IG9mIHZhcmlhYmxlcywgYnV0IHRoZSB2YWx1ZXMgbWF5Ci12YXJ5IGFzIGFwcHJvcHJpYXRlIHRvIHN1aXQgdGhlIHRoZSBuZWVkcyBvZiB0aGUgdHdvIGRpZmZlcmVudCBidWlsZHMuCit2YXJ5IGFzIGFwcHJvcHJpYXRlIHRvIHN1aXQgdGhlIG5lZWRzIG9mIHRoZSB0d28gZGlmZmVyZW50IGJ1aWxkcy4KIAogVGhlIGJ1aWxkLmduaSBmaWxlIHByb3ZpZGVzIGEgd2F5IGZvciBwcm9qZWN0cyB0byBvdmVycmlkZSBkZWZhdWx0cyBmb3IKIHZhcmlhYmxlcyB1c2VkIGluIC8vYnVpbGQgaXRzZWxmICh3aGljaCB3ZSB3YW50IHRvIGJlIHNoYXJlYWJsZSBiZXR3ZWVuCmRpZmYgLS1naXQgYS9idWlsZF9vdmVycmlkZXMvcGRmaXVtLmduaSBiL2J1aWxkX292ZXJyaWRlcy9wZGZpdW0uZ25pCmluZGV4IDE4ZTZhODcuLmFiODljZDkgMTAwNjQ0Ci0tLSBhL2J1aWxkX292ZXJyaWRlcy9wZGZpdW0uZ25pCisrKyBiL2J1aWxkX292ZXJyaWRlcy9wZGZpdW0uZ25pCkBAIC00LDE3ICs0LDI5IEBACiAKICMgVGhpcyBmaWxlIGNvbnRhaW5zIFBERml1bS1yZWxhdGVkIGJ1aWxkIG92ZXJyaWRlcy4KIAorIyBCdWlsZCBQREZpdW0gZWl0aGVyIHVzaW5nIGEgYnVuZGxlZCBGcmVlVHlwZSBsaWJyYXJ5LCBvciB1c2luZyB0aGUgRnJlZVR5cGUKKyMgdGFyZ2V0IGRlZmluZWQgaW4gLy9idWlsZC9jb25maWcvZnJlZXR5cGUuCisjIERlZmF1bHQ6IFVzZSBhIGJ1bmRsZWQgRnJlZVR5cGUuCitwZGZfYnVuZGxlX2ZyZWV0eXBlX292ZXJyaWRlID0gdHJ1ZQorCiAjIEJ1aWxkIFBERml1bSBlaXRoZXIgd2l0aCBvciB3aXRob3V0IHY4IHN1cHBvcnQuCisjIERlZmF1bHQ6IFdpdGggVjggc3VwcG9ydC4KIHBkZl9lbmFibGVfdjhfb3ZlcnJpZGUgPSB0cnVlCiAKICMgQnVpbGQgUERGaXVtIGVpdGhlciB3aXRoIG9yIHdpdGhvdXQgWEZBIEZvcm1zIHN1cHBvcnQuCisjIERlZmF1bHQ6IFdpdGhvdXQgWEZBIHN1cHBvcnQuCiBwZGZfZW5hYmxlX3hmYV9vdmVycmlkZSA9IGZhbHNlCiAKLSMgQnVpbGQgUERGaXVtIGFnYWluc3Qgc2tpYSAoZXhwZXJpbWVudGFsKSByYXRoZXIgdGhhbiBhZ2csIHJlcGxhY2luZyBhbGwgUERGaXVtIGdyYXBoaWNzLgorIyBCdWlsZCBQREZpdW0gYWdhaW5zdCBza2lhIChleHBlcmltZW50YWwpIHJhdGhlciB0aGFuIGFnZywgcmVwbGFjaW5nIGFsbCBQREZpdW0KKyMgZ3JhcGhpY3MuCisjIERlZmF1bHQ6IFVzZSBhZ2cuCiBwZGZfdXNlX3NraWFfb3ZlcnJpZGUgPSBmYWxzZQogCi0jIEJ1aWxkIFBERml1bSBhZ2FpbnN0IHNraWEgKGV4cGVyaW1lbnRhbCkgcmF0aGVyIHRoYW4gYWdnLCBhZGRpbmcgb25seSBwYXRoIHN1cHBvcnQuCisjIEJ1aWxkIFBERml1bSBhZ2FpbnN0IHNraWEgKGV4cGVyaW1lbnRhbCkgcmF0aGVyIHRoYW4gYWdnLCBhZGRpbmcgb25seSBwYXRoCisjIHN1cHBvcnQuCisjIERlZmF1bHQ6IFVzZSBhZ2cuCiBwZGZfdXNlX3NraWFfcGF0aHNfb3ZlcnJpZGUgPSBmYWxzZQogCiAjIEJ1aWxkIFBERml1bSBlaXRoZXIgd2l0aCBvciB3aXRob3V0IGV4cGVyaW1lbnRhbCB3aW4zMiBHREkgQVBJcy4KKyMgRGVmYXVsdDogV2l0aG91dCBleHBlcmltZW50YWwgd2luMzIgR0RJIEFQSXMuCiBwZGZfdXNlX3dpbjMyX2dkaV9vdmVycmlkZSA9IGZhbHNlCmRpZmYgLS1naXQgYS9jb3JlL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0LmNwcCBiL2NvcmUvZmRybS9jcnlwdG8vZnhfY3J5cHQuY3BwCmluZGV4IDQwMTBmZjQuLmQ1M2ZhNmIgMTAwNjQ0Ci0tLSBhL2NvcmUvZmRybS9jcnlwdG8vZnhfY3J5cHQuY3BwCisrKyBiL2NvcmUvZmRybS9jcnlwdG8vZnhfY3J5cHQuY3BwCkBAIC02LDU5ICs2LDcgQEAKIAogI2luY2x1ZGUgImNvcmUvZmRybS9jcnlwdG8vZnhfY3J5cHQuaCIKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi12b2lkIENSWVBUX0FyY0ZvdXJTZXR1cChDUllQVF9yYzRfY29udGV4dCogcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlbmd0aCkgewotICBpbnQgaSwgaiwgaywgKm0sIGE7Ci0gIHMtPnggPSAwOwotICBzLT55ID0gMDsKLSAgbSA9IHMtPm07Ci0gIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewotICAgIG1baV0gPSBpOwotICB9Ci0gIGogPSBrID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0gICAgYSA9IG1baV07Ci0gICAgaiA9IChqICsgYSArIGtleVtrXSkgJiAweEZGOwotICAgIG1baV0gPSBtW2pdOwotICAgIG1bal0gPSBhOwotICAgIGlmICgrK2sgPj0gKGludClsZW5ndGgpIHsKLSAgICAgIGsgPSAwOwotICAgIH0KLSAgfQotfQotCi12b2lkIENSWVBUX0FyY0ZvdXJDcnlwdChDUllQVF9yYzRfY29udGV4dCogcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZW5ndGgpIHsKLSAgaW50IGksIHgsIHksICptLCBhLCBiOwotICB4ID0gcy0+eDsKLSAgeSA9IHMtPnk7Ci0gIG0gPSBzLT5tOwotICBmb3IgKGkgPSAwOyBpIDwgKGludClsZW5ndGg7IGkrKykgewotICAgIHggPSAoeCArIDEpICYgMHhGRjsKLSAgICBhID0gbVt4XTsKLSAgICB5ID0gKHkgKyBhKSAmIDB4RkY7Ci0gICAgbVt4XSA9IGIgPSBtW3ldOwotICAgIG1beV0gPSBhOwotICAgIGRhdGFbaV0gXj0gbVsoYSArIGIpICYgMHhGRl07Ci0gIH0KLSAgcy0+eCA9IHg7Ci0gIHMtPnkgPSB5OwotfQotCi12b2lkIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKHVpbnQ4X3QqIHBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGtleWxlbikgewotICBDUllQVF9yYzRfY29udGV4dCBzOwotICBDUllQVF9BcmNGb3VyU2V0dXAoJnMsIGtleSwga2V5bGVuKTsKLSAgQ1JZUFRfQXJjRm91ckNyeXB0KCZzLCBwRGF0YSwgc2l6ZSk7Ci19CisjaW5jbHVkZSA8dXRpbGl0eT4KIAogI2RlZmluZSBHRVRfVUlOVDMyKG4sIGIsIGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC03NSw2ICsyMywxMyBAQAogICAgICgoKHVpbnQ4X3QqKWIpWyhpKSArIDNdKSA9ICh1aW50OF90KSgoKG4pID4+IDI0KSAmIDB4RkYpOyBcCiAgIH0KIAorbmFtZXNwYWNlIHsKKworY29uc3QgdWludDhfdCBtZDVfcGFkZGluZ1s2NF0gPSB7CisgICAgMHg4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OworCiB2b2lkIG1kNV9wcm9jZXNzKENSWVBUX21kNV9jb250ZXh0KiBjdHgsIGNvbnN0IHVpbnQ4X3QgZGF0YVs2NF0pIHsKICAgdWludDMyX3QgQSwgQiwgQywgRCwgWFsxNl07CiAgIEdFVF9VSU5UMzIoWFswXSwgZGF0YSwgMCk7CkBAIC0xODEsNiArMTM2LDQxIEBACiAgIGN0eC0+c3RhdGVbM10gKz0gRDsKIH0KIAorfSAgLy8gbmFtZXNwYWNlCisKK3ZvaWQgQ1JZUFRfQXJjRm91clNldHVwKENSWVBUX3JjNF9jb250ZXh0KiBzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCoga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGVuZ3RoKSB7CisgIHMtPnggPSAwOworICBzLT55ID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrUkM0Q29udGV4dFBlcm11dGF0aW9uTGVuZ3RoOyArK2kpCisgICAgcy0+bVtpXSA9IGk7CisKKyAgaW50IGogPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IGtSQzRDb250ZXh0UGVybXV0YXRpb25MZW5ndGg7ICsraSkgeworICAgIGogPSAoaiArIHMtPm1baV0gKyAobGVuZ3RoID8ga2V5W2kgJSBsZW5ndGhdIDogMCkpICYgMHhGRjsKKyAgICBzdGQ6OnN3YXAocy0+bVtpXSwgcy0+bVtqXSk7CisgIH0KK30KKwordm9pZCBDUllQVF9BcmNGb3VyQ3J5cHQoQ1JZUFRfcmM0X2NvbnRleHQqIHMsIHVpbnQ4X3QqIGRhdGEsIHVpbnQzMl90IGxlbmd0aCkgeworICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICBzLT54ID0gKHMtPnggKyAxKSAmIDB4RkY7CisgICAgcy0+eSA9IChzLT55ICsgcy0+bVtzLT54XSkgJiAweEZGOworICAgIHN0ZDo6c3dhcChzLT5tW3MtPnhdLCBzLT5tW3MtPnldKTsKKyAgICBkYXRhW2ldIF49IHMtPm1bKHMtPm1bcy0+eF0gKyBzLT5tW3MtPnldKSAmIDB4RkZdOworICB9Cit9CisKK3ZvaWQgQ1JZUFRfQXJjRm91ckNyeXB0QmxvY2sodWludDhfdCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qga2V5bGVuKSB7CisgIENSWVBUX3JjNF9jb250ZXh0IHM7CisgIENSWVBUX0FyY0ZvdXJTZXR1cCgmcywga2V5LCBrZXlsZW4pOworICBDUllQVF9BcmNGb3VyQ3J5cHQoJnMsIHBEYXRhLCBzaXplKTsKK30KKwogdm9pZCBDUllQVF9NRDVTdGFydChDUllQVF9tZDVfY29udGV4dCogY3R4KSB7CiAgIGN0eC0+dG90YWxbMF0gPSAwOwogICBjdHgtPnRvdGFsWzFdID0gMDsKQEAgLTIwNCw3ICsxOTQsNyBAQAogICBjdHgtPnRvdGFsWzBdICY9IDB4RkZGRkZGRkY7CiAgIGN0eC0+dG90YWxbMV0gKz0gY3R4LT50b3RhbFswXSA8IGxlbmd0aCA8PCAzOwogICBpZiAobGVmdCAmJiBsZW5ndGggPj0gZmlsbCkgewotICAgIEZYU1lTX21lbWNweSgodm9pZCopKGN0eC0+YnVmZmVyICsgbGVmdCksICh2b2lkKilpbnB1dCwgZmlsbCk7CisgICAgbWVtY3B5KGN0eC0+YnVmZmVyICsgbGVmdCwgaW5wdXQsIGZpbGwpOwogICAgIG1kNV9wcm9jZXNzKGN0eCwgY3R4LT5idWZmZXIpOwogICAgIGxlbmd0aCAtPSBmaWxsOwogICAgIGlucHV0ICs9IGZpbGw7CkBAIC0yMTYsMTUgKzIwNiwxMCBAQAogICAgIGlucHV0ICs9IDY0OwogICB9CiAgIGlmIChsZW5ndGgpIHsKLSAgICBGWFNZU19tZW1jcHkoKHZvaWQqKShjdHgtPmJ1ZmZlciArIGxlZnQpLCAodm9pZCopaW5wdXQsIGxlbmd0aCk7CisgICAgbWVtY3B5KGN0eC0+YnVmZmVyICsgbGVmdCwgaW5wdXQsIGxlbmd0aCk7CiAgIH0KIH0KIAotY29uc3QgdWludDhfdCBtZDVfcGFkZGluZ1s2NF0gPSB7Ci0gICAgMHg4MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OwotCiB2b2lkIENSWVBUX01ENUZpbmlzaChDUllQVF9tZDVfY29udGV4dCogY3R4LCB1aW50OF90IGRpZ2VzdFsxNl0pIHsKICAgdWludDMyX3QgbGFzdCwgcGFkbjsKICAgdWludDhfdCBtc2dsZW5bOF07CkBAIC0yNDgsNyArMjMzLDMgQEAKICAgQ1JZUFRfTUQ1VXBkYXRlKCZjdHgsIGlucHV0LCBsZW5ndGgpOwogICBDUllQVF9NRDVGaW5pc2goJmN0eCwgZGlnZXN0KTsKIH0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19OwotI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0LmggYi9jb3JlL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0LmgKaW5kZXggYTQ5OGY0ZS4uNGY2NzE3ZiAxMDA2NDQKLS0tIGEvY29yZS9mZHJtL2NyeXB0by9meF9jcnlwdC5oCisrKyBiL2NvcmUvZmRybS9jcnlwdG8vZnhfY3J5cHQuaApAQCAtOSw0MSArOSw0NCBAQAogCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB7Citjb25zdGV4cHIgaW50MzJfdCBrUkM0Q29udGV4dFBlcm11dGF0aW9uTGVuZ3RoID0gMjU2Oworc3RydWN0IENSWVBUX3JjNF9jb250ZXh0IHsKICAgaW50MzJfdCB4OwogICBpbnQzMl90IHk7Ci0gIGludDMyX3QgbVsyNTZdOwotfSBDUllQVF9yYzRfY29udGV4dDsKKyAgaW50MzJfdCBtW2tSQzRDb250ZXh0UGVybXV0YXRpb25MZW5ndGhdOworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgeworI2RlZmluZSBNQVhfTlIgMTQKKyNkZWZpbmUgTUFYX05CIDgKK3N0cnVjdCBDUllQVF9hZXNfY29udGV4dCB7CisgIHZvaWQgKCplbmNyeXB0KShDUllQVF9hZXNfY29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKTsKKyAgdm9pZCAoKmRlY3J5cHQpKENSWVBUX2Flc19jb250ZXh0KiBjdHgsIHVuc2lnbmVkIGludCogYmxvY2spOworICBpbnQgTmI7CisgIGludCBOcjsKKyAgdW5zaWduZWQgaW50IGtleXNjaGVkWyhNQVhfTlIgKyAxKSAqIE1BWF9OQl07CisgIHVuc2lnbmVkIGludCBpbnZrZXlzY2hlZFsoTUFYX05SICsgMSkgKiBNQVhfTkJdOworICB1bnNpZ25lZCBpbnQgaXZbTUFYX05CXTsKK307CisKK3N0cnVjdCBDUllQVF9tZDVfY29udGV4dCB7CiAgIHVpbnQzMl90IHRvdGFsWzJdOwogICB1aW50MzJfdCBzdGF0ZVs0XTsKICAgdWludDhfdCBidWZmZXJbNjRdOwotfSBDUllQVF9tZDVfY29udGV4dDsKK307CiAKLXR5cGVkZWYgc3RydWN0IHsKK3N0cnVjdCBDUllQVF9zaGExX2NvbnRleHQgewogICB1bnNpZ25lZCBpbnQgaFs1XTsKICAgdW5zaWduZWQgY2hhciBibG9ja1s2NF07CiAgIGludCBibGt1c2VkOwogICB1bnNpZ25lZCBpbnQgbGVuaGk7CiAgIHVuc2lnbmVkIGludCBsZW5sbzsKLX0gQ1JZUFRfc2hhMV9jb250ZXh0OworfTsKIAotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50MzJfdCB0b3RhbFsyXTsKLSAgdWludDMyX3Qgc3RhdGVbOF07Ci0gIHVpbnQ4X3QgYnVmZmVyWzY0XTsKLX0gQ1JZUFRfc2hhMjU2X2NvbnRleHQ7Ci0KLXR5cGVkZWYgc3RydWN0IHsKK3N0cnVjdCBDUllQVF9zaGEyX2NvbnRleHQgewogICB1aW50NjRfdCB0b3RhbFsyXTsKICAgdWludDY0X3Qgc3RhdGVbOF07CiAgIHVpbnQ4X3QgYnVmZmVyWzEyOF07Ci19IENSWVBUX3NoYTM4NF9jb250ZXh0OworfTsKIAogdm9pZCBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayh1aW50OF90KiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplLApAQCAtNTYsMTcgKzU5LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSk7CiAKLXZvaWQgQ1JZUFRfQUVTU2V0S2V5KHZvaWQqIGNvbnRleHQsCit2b2lkIENSWVBUX0FFU1NldEtleShDUllQVF9hZXNfY29udGV4dCogY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJsb2NrbGVuLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCoga2V5LAogICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qga2V5bGVuLAogICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRW5jcnlwdCk7Ci12b2lkIENSWVBUX0FFU1NldElWKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIGl2KTsKLXZvaWQgQ1JZUFRfQUVTRGVjcnlwdCh2b2lkKiBjb250ZXh0LAordm9pZCBDUllQVF9BRVNTZXRJVihDUllQVF9hZXNfY29udGV4dCogY29udGV4dCwgY29uc3QgdWludDhfdCogaXYpOwordm9pZCBDUllQVF9BRVNEZWNyeXB0KENSWVBUX2Flc19jb250ZXh0KiBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjLAogICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUpOwotdm9pZCBDUllQVF9BRVNFbmNyeXB0KHZvaWQqIGNvbnRleHQsCit2b2lkIENSWVBUX0FFU0VuY3J5cHQoQ1JZUFRfYWVzX2NvbnRleHQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSk7CkBAIC04NSwzMiArODgsMzEgQEAKIHZvaWQgQ1JZUFRfU0hBMUZpbmlzaChDUllQVF9zaGExX2NvbnRleHQqIGNvbnRleHQsIHVpbnQ4X3QgZGlnZXN0WzIwXSk7CiB2b2lkIENSWVBUX1NIQTFHZW5lcmF0ZShjb25zdCB1aW50OF90KiBkYXRhLCB1aW50MzJfdCBzaXplLCB1aW50OF90IGRpZ2VzdFsyMF0pOwogCi12b2lkIENSWVBUX1NIQTI1NlN0YXJ0KENSWVBUX3NoYTI1Nl9jb250ZXh0KiBjb250ZXh0KTsKLXZvaWQgQ1JZUFRfU0hBMjU2VXBkYXRlKENSWVBUX3NoYTI1Nl9jb250ZXh0KiBjb250ZXh0LAordm9pZCBDUllQVF9TSEEyNTZTdGFydChDUllQVF9zaGEyX2NvbnRleHQqIGNvbnRleHQpOwordm9pZCBDUllQVF9TSEEyNTZVcGRhdGUoQ1JZUFRfc2hhMl9jb250ZXh0KiBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUpOwotdm9pZCBDUllQVF9TSEEyNTZGaW5pc2goQ1JZUFRfc2hhMjU2X2NvbnRleHQqIGNvbnRleHQsIHVpbnQ4X3QgZGlnZXN0WzMyXSk7Cit2b2lkIENSWVBUX1NIQTI1NkZpbmlzaChDUllQVF9zaGEyX2NvbnRleHQqIGNvbnRleHQsIHVpbnQ4X3QgZGlnZXN0WzMyXSk7CiB2b2lkIENSWVBUX1NIQTI1NkdlbmVyYXRlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGlnZXN0WzMyXSk7CiAKLXZvaWQgQ1JZUFRfU0hBMzg0U3RhcnQoQ1JZUFRfc2hhMzg0X2NvbnRleHQqIGNvbnRleHQpOwotdm9pZCBDUllQVF9TSEEzODRVcGRhdGUoQ1JZUFRfc2hhMzg0X2NvbnRleHQqIGNvbnRleHQsCit2b2lkIENSWVBUX1NIQTM4NFN0YXJ0KENSWVBUX3NoYTJfY29udGV4dCogY29udGV4dCk7Cit2b2lkIENSWVBUX1NIQTM4NFVwZGF0ZShDUllQVF9zaGEyX2NvbnRleHQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSk7Ci12b2lkIENSWVBUX1NIQTM4NEZpbmlzaChDUllQVF9zaGEzODRfY29udGV4dCogY29udGV4dCwgdWludDhfdCBkaWdlc3RbNDhdKTsKK3ZvaWQgQ1JZUFRfU0hBMzg0RmluaXNoKENSWVBUX3NoYTJfY29udGV4dCogY29udGV4dCwgdWludDhfdCBkaWdlc3RbNDhdKTsKIHZvaWQgQ1JZUFRfU0hBMzg0R2VuZXJhdGUoY29uc3QgdWludDhfdCogZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkaWdlc3RbNDhdKTsKIAotdm9pZCBDUllQVF9TSEE1MTJTdGFydCh2b2lkKiBjb250ZXh0KTsKLXZvaWQgQ1JZUFRfU0hBNTEyVXBkYXRlKHZvaWQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHVpbnQzMl90IHNpemUpOwotdm9pZCBDUllQVF9TSEE1MTJGaW5pc2godm9pZCogY29udGV4dCwgdWludDhfdCBkaWdlc3RbNjRdKTsKK3ZvaWQgQ1JZUFRfU0hBNTEyU3RhcnQoQ1JZUFRfc2hhMl9jb250ZXh0KiBjb250ZXh0KTsKK3ZvaWQgQ1JZUFRfU0hBNTEyVXBkYXRlKENSWVBUX3NoYTJfY29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplKTsKK3ZvaWQgQ1JZUFRfU0hBNTEyRmluaXNoKENSWVBUX3NoYTJfY29udGV4dCogY29udGV4dCwgdWludDhfdCBkaWdlc3RbNjRdKTsKIHZvaWQgQ1JZUFRfU0hBNTEyR2VuZXJhdGUoY29uc3QgdWludDhfdCogZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkaWdlc3RbNjRdKTsKLSNpZmRlZiBfX2NwbHVzcGx1cwotfTsKLSNlbmRpZgogCiAjZW5kaWYgIC8vIENPUkVfRkRSTV9DUllQVE9fRlhfQ1JZUFRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZmRybS9jcnlwdG8vZnhfY3J5cHRfYWVzLmNwcCBiL2NvcmUvZmRybS9jcnlwdG8vZnhfY3J5cHRfYWVzLmNwcAppbmRleCA4NDg0YjZmLi45NGQ2NmQwIDEwMDY0NAotLS0gYS9jb3JlL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0X2Flcy5jcHAKKysrIGIvY29yZS9mZHJtL2NyeXB0by9meF9jcnlwdF9hZXMuY3BwCkBAIC02LDEyICs2LDYgQEAKIAogI2luY2x1ZGUgImNvcmUvZmRybS9jcnlwdG8vZnhfY3J5cHQuaCIKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotI2RlZmluZSBNQVhfTlIgMTQKLSNkZWZpbmUgTUFYX05LIDgKLSNkZWZpbmUgTUFYX05CIDgKICNkZWZpbmUgbXVsYnkyKHgpICgoKHggJiAweDdGKSA8PCAxKSBeICh4ICYgMHg4MCA/IDB4MUIgOiAwKSkKICNkZWZpbmUgR0VUXzMyQklUX01TQl9GSVJTVChjcCkgICAgICAgICAgICAgICAgICAgIFwKICAgKCgodW5zaWduZWQgbG9uZykodW5zaWduZWQgY2hhcikoY3ApWzNdKSB8ICAgICAgIFwKQEAgLTI1LDE1ICsxOSwxMCBAQAogICAgIChjcClbMV0gPSAodmFsdWUpID4+IDE2OyAgICAgICAgICAgXAogICAgIChjcClbMF0gPSAodmFsdWUpID4+IDI0OyAgICAgICAgICAgXAogICB9IHdoaWxlICgwKQotc3RydWN0IEFFU0NvbnRleHQgewotICB1bnNpZ25lZCBpbnQga2V5c2NoZWRbKE1BWF9OUiArIDEpICogTUFYX05CXTsKLSAgdW5zaWduZWQgaW50IGludmtleXNjaGVkWyhNQVhfTlIgKyAxKSAqIE1BWF9OQl07Ci0gIHZvaWQgKCplbmNyeXB0KShBRVNDb250ZXh0KiBjdHgsIHVuc2lnbmVkIGludCogYmxvY2spOwotICB2b2lkICgqZGVjcnlwdCkoQUVTQ29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKTsKLSAgdW5zaWduZWQgaW50IGl2W01BWF9OQl07Ci0gIGludCBOYiwgTnI7Ci19Owotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU2JveFsyNTZdID0geworCituYW1lc3BhY2UgeworCitjb25zdCB1bnNpZ25lZCBjaGFyIFNib3hbMjU2XSA9IHsKICAgICAweDYzLCAweDdjLCAweDc3LCAweDdiLCAweGYyLCAweDZiLCAweDZmLCAweGM1LCAweDMwLCAweDAxLCAweDY3LCAweDJiLAogICAgIDB4ZmUsIDB4ZDcsIDB4YWIsIDB4NzYsIDB4Y2EsIDB4ODIsIDB4YzksIDB4N2QsIDB4ZmEsIDB4NTksIDB4NDcsIDB4ZjAsCiAgICAgMHhhZCwgMHhkNCwgMHhhMiwgMHhhZiwgMHg5YywgMHhhNCwgMHg3MiwgMHhjMCwgMHhiNywgMHhmZCwgMHg5MywgMHgyNiwKQEAgLTU2LDcgKzQ1LDcgQEAKICAgICAweDY5LCAweGQ5LCAweDhlLCAweDk0LCAweDliLCAweDFlLCAweDg3LCAweGU5LCAweGNlLCAweDU1LCAweDI4LCAweGRmLAogICAgIDB4OGMsIDB4YTEsIDB4ODksIDB4MGQsIDB4YmYsIDB4ZTYsIDB4NDIsIDB4NjgsIDB4NDEsIDB4OTksIDB4MmQsIDB4MGYsCiAgICAgMHhiMCwgMHg1NCwgMHhiYiwgMHgxNn07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBTYm94aW52WzI1Nl0gPSB7Citjb25zdCB1bnNpZ25lZCBjaGFyIFNib3hpbnZbMjU2XSA9IHsKICAgICAweDUyLCAweDA5LCAweDZhLCAweGQ1LCAweDMwLCAweDM2LCAweGE1LCAweDM4LCAweGJmLCAweDQwLCAweGEzLCAweDllLAogICAgIDB4ODEsIDB4ZjMsIDB4ZDcsIDB4ZmIsIDB4N2MsIDB4ZTMsIDB4MzksIDB4ODIsIDB4OWIsIDB4MmYsIDB4ZmYsIDB4ODcsCiAgICAgMHgzNCwgMHg4ZSwgMHg0MywgMHg0NCwgMHhjNCwgMHhkZSwgMHhlOSwgMHhjYiwgMHg1NCwgMHg3YiwgMHg5NCwgMHgzMiwKQEAgLTc5LDcgKzY4LDcgQEAKICAgICAweGFlLCAweDJhLCAweGY1LCAweGIwLCAweGM4LCAweGViLCAweGJiLCAweDNjLCAweDgzLCAweDUzLCAweDk5LCAweDYxLAogICAgIDB4MTcsIDB4MmIsIDB4MDQsIDB4N2UsIDB4YmEsIDB4NzcsIDB4ZDYsIDB4MjYsIDB4ZTEsIDB4NjksIDB4MTQsIDB4NjMsCiAgICAgMHg1NSwgMHgyMSwgMHgwYywgMHg3ZH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEUwWzI1Nl0gPSB7Citjb25zdCB1bnNpZ25lZCBpbnQgRTBbMjU2XSA9IHsKICAgICAweGM2NjM2M2E1LCAweGY4N2M3Yzg0LCAweGVlNzc3Nzk5LCAweGY2N2I3YjhkLCAweGZmZjJmMjBkLCAweGQ2NmI2YmJkLAogICAgIDB4ZGU2ZjZmYjEsIDB4OTFjNWM1NTQsIDB4NjAzMDMwNTAsIDB4MDIwMTAxMDMsIDB4Y2U2NzY3YTksIDB4NTYyYjJiN2QsCiAgICAgMHhlN2ZlZmUxOSwgMHhiNWQ3ZDc2MiwgMHg0ZGFiYWJlNiwgMHhlYzc2NzY5YSwgMHg4ZmNhY2E0NSwgMHgxZjgyODI5ZCwKQEAgLTEyNCw3ICsxMTMsNyBAQAogICAgIDB4ODQ0MjQyYzYsIDB4ZDA2ODY4YjgsIDB4ODI0MTQxYzMsIDB4Mjk5OTk5YjAsIDB4NWEyZDJkNzcsIDB4MWUwZjBmMTEsCiAgICAgMHg3YmIwYjBjYiwgMHhhODU0NTRmYywgMHg2ZGJiYmJkNiwgMHgyYzE2MTYzYSwKIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEUxWzI1Nl0gPSB7Citjb25zdCB1bnNpZ25lZCBpbnQgRTFbMjU2XSA9IHsKICAgICAweGE1YzY2MzYzLCAweDg0Zjg3YzdjLCAweDk5ZWU3Nzc3LCAweDhkZjY3YjdiLCAweDBkZmZmMmYyLCAweGJkZDY2YjZiLAogICAgIDB4YjFkZTZmNmYsIDB4NTQ5MWM1YzUsIDB4NTA2MDMwMzAsIDB4MDMwMjAxMDEsIDB4YTljZTY3NjcsIDB4N2Q1NjJiMmIsCiAgICAgMHgxOWU3ZmVmZSwgMHg2MmI1ZDdkNywgMHhlNjRkYWJhYiwgMHg5YWVjNzY3NiwgMHg0NThmY2FjYSwgMHg5ZDFmODI4MiwKQEAgLTE2OSw3ICsxNTgsNyBAQAogICAgIDB4YzY4NDQyNDIsIDB4YjhkMDY4NjgsIDB4YzM4MjQxNDEsIDB4YjAyOTk5OTksIDB4Nzc1YTJkMmQsIDB4MTExZTBmMGYsCiAgICAgMHhjYjdiYjBiMCwgMHhmY2E4NTQ1NCwgMHhkNjZkYmJiYiwgMHgzYTJjMTYxNiwKIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEUyWzI1Nl0gPSB7Citjb25zdCB1bnNpZ25lZCBpbnQgRTJbMjU2XSA9IHsKICAgICAweDYzYTVjNjYzLCAweDdjODRmODdjLCAweDc3OTllZTc3LCAweDdiOGRmNjdiLCAweGYyMGRmZmYyLCAweDZiYmRkNjZiLAogICAgIDB4NmZiMWRlNmYsIDB4YzU1NDkxYzUsIDB4MzA1MDYwMzAsIDB4MDEwMzAyMDEsIDB4NjdhOWNlNjcsIDB4MmI3ZDU2MmIsCiAgICAgMHhmZTE5ZTdmZSwgMHhkNzYyYjVkNywgMHhhYmU2NGRhYiwgMHg3NjlhZWM3NiwgMHhjYTQ1OGZjYSwgMHg4MjlkMWY4MiwKQEAgLTIxNCw3ICsyMDMsNyBAQAogICAgIDB4NDJjNjg0NDIsIDB4NjhiOGQwNjgsIDB4NDFjMzgyNDEsIDB4OTliMDI5OTksIDB4MmQ3NzVhMmQsIDB4MGYxMTFlMGYsCiAgICAgMHhiMGNiN2JiMCwgMHg1NGZjYTg1NCwgMHhiYmQ2NmRiYiwgMHgxNjNhMmMxNiwKIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEUzWzI1Nl0gPSB7Citjb25zdCB1bnNpZ25lZCBpbnQgRTNbMjU2XSA9IHsKICAgICAweDYzNjNhNWM2LCAweDdjN2M4NGY4LCAweDc3Nzc5OWVlLCAweDdiN2I4ZGY2LCAweGYyZjIwZGZmLCAweDZiNmJiZGQ2LAogICAgIDB4NmY2ZmIxZGUsIDB4YzVjNTU0OTEsIDB4MzAzMDUwNjAsIDB4MDEwMTAzMDIsIDB4Njc2N2E5Y2UsIDB4MmIyYjdkNTYsCiAgICAgMHhmZWZlMTllNywgMHhkN2Q3NjJiNSwgMHhhYmFiZTY0ZCwgMHg3Njc2OWFlYywgMHhjYWNhNDU4ZiwgMHg4MjgyOWQxZiwKQEAgLTI1OSw3ICsyNDgsNyBAQAogICAgIDB4NDI0MmM2ODQsIDB4Njg2OGI4ZDAsIDB4NDE0MWMzODIsIDB4OTk5OWIwMjksIDB4MmQyZDc3NWEsIDB4MGYwZjExMWUsCiAgICAgMHhiMGIwY2I3YiwgMHg1NDU0ZmNhOCwgMHhiYmJiZDY2ZCwgMHgxNjE2M2EyYywKIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEQwWzI1Nl0gPSB7Citjb25zdCB1bnNpZ25lZCBpbnQgRDBbMjU2XSA9IHsKICAgICAweDUxZjRhNzUwLCAweDdlNDE2NTUzLCAweDFhMTdhNGMzLCAweDNhMjc1ZTk2LCAweDNiYWI2YmNiLCAweDFmOWQ0NWYxLAogICAgIDB4YWNmYTU4YWIsIDB4NGJlMzAzOTMsIDB4MjAzMGZhNTUsIDB4YWQ3NjZkZjYsIDB4ODhjYzc2OTEsIDB4ZjUwMjRjMjUsCiAgICAgMHg0ZmU1ZDdmYywgMHhjNTJhY2JkNywgMHgyNjM1NDQ4MCwgMHhiNTYyYTM4ZiwgMHhkZWIxNWE0OSwgMHgyNWJhMWI2NywKQEAgLTMwNCw3ICsyOTMsNyBAQAogICAgIDB4MjgzYzQ5OGIsIDB4ZmYwZDk1NDEsIDB4MzlhODAxNzEsIDB4MDgwY2IzZGUsIDB4ZDhiNGU0OWMsIDB4NjQ1NmMxOTAsCiAgICAgMHg3YmNiODQ2MSwgMHhkNTMyYjY3MCwgMHg0ODZjNWM3NCwgMHhkMGI4NTc0MiwKIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEQxWzI1Nl0gPSB7Citjb25zdCB1bnNpZ25lZCBpbnQgRDFbMjU2XSA9IHsKICAgICAweDUwNTFmNGE3LCAweDUzN2U0MTY1LCAweGMzMWExN2E0LCAweDk2M2EyNzVlLCAweGNiM2JhYjZiLCAweGYxMWY5ZDQ1LAogICAgIDB4YWJhY2ZhNTgsIDB4OTM0YmUzMDMsIDB4NTUyMDMwZmEsIDB4ZjZhZDc2NmQsIDB4OTE4OGNjNzYsIDB4MjVmNTAyNGMsCiAgICAgMHhmYzRmZTVkNywgMHhkN2M1MmFjYiwgMHg4MDI2MzU0NCwgMHg4ZmI1NjJhMywgMHg0OWRlYjE1YSwgMHg2NzI1YmExYiwKQEAgLTM0OSw3ICszMzgsNyBAQAogICAgIDB4OGIyODNjNDksIDB4NDFmZjBkOTUsIDB4NzEzOWE4MDEsIDB4ZGUwODBjYjMsIDB4OWNkOGI0ZTQsIDB4OTA2NDU2YzEsCiAgICAgMHg2MTdiY2I4NCwgMHg3MGQ1MzJiNiwgMHg3NDQ4NmM1YywgMHg0MmQwYjg1NywKIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEQyWzI1Nl0gPSB7Citjb25zdCB1bnNpZ25lZCBpbnQgRDJbMjU2XSA9IHsKICAgICAweGE3NTA1MWY0LCAweDY1NTM3ZTQxLCAweGE0YzMxYTE3LCAweDVlOTYzYTI3LCAweDZiY2IzYmFiLCAweDQ1ZjExZjlkLAogICAgIDB4NThhYmFjZmEsIDB4MDM5MzRiZTMsIDB4ZmE1NTIwMzAsIDB4NmRmNmFkNzYsIDB4NzY5MTg4Y2MsIDB4NGMyNWY1MDIsCiAgICAgMHhkN2ZjNGZlNSwgMHhjYmQ3YzUyYSwgMHg0NDgwMjYzNSwgMHhhMzhmYjU2MiwgMHg1YTQ5ZGViMSwgMHgxYjY3MjViYSwKQEAgLTM5NCw3ICszODMsNyBAQAogICAgIDB4NDk4YjI4M2MsIDB4OTU0MWZmMGQsIDB4MDE3MTM5YTgsIDB4YjNkZTA4MGMsIDB4ZTQ5Y2Q4YjQsIDB4YzE5MDY0NTYsCiAgICAgMHg4NDYxN2JjYiwgMHhiNjcwZDUzMiwgMHg1Yzc0NDg2YywgMHg1NzQyZDBiOCwKIH07Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IEQzWzI1Nl0gPSB7Citjb25zdCB1bnNpZ25lZCBpbnQgRDNbMjU2XSA9IHsKICAgICAweGY0YTc1MDUxLCAweDQxNjU1MzdlLCAweDE3YTRjMzFhLCAweDI3NWU5NjNhLCAweGFiNmJjYjNiLCAweDlkNDVmMTFmLAogICAgIDB4ZmE1OGFiYWMsIDB4ZTMwMzkzNGIsIDB4MzBmYTU1MjAsIDB4NzY2ZGY2YWQsIDB4Y2M3NjkxODgsIDB4MDI0YzI1ZjUsCiAgICAgMHhlNWQ3ZmM0ZiwgMHgyYWNiZDdjNSwgMHgzNTQ0ODAyNiwgMHg2MmEzOGZiNSwgMHhiMTVhNDlkZSwgMHhiYTFiNjcyNSwKQEAgLTQ2MSw5ICs0NTAsMTAgQEAKICAgICAgICAgICAgICAgICAgKFNib3hbKGJsb2NrWyhpICsgQzEpICUgTmJdID4+IDE2KSAmIDB4RkZdIDw8IDE2KSB8IFwKICAgICAgICAgICAgICAgICAgKFNib3hbKGJsb2NrWyhpICsgQzIpICUgTmJdID4+IDgpICYgMHhGRl0gPDwgOCkgfCAgIFwKICAgICAgICAgICAgICAgICAgKFNib3hbKGJsb2NrWyhpICsgQzMpICUgTmJdKSAmIDB4RkZdKSkKLXN0YXRpYyB2b2lkIGFlc19lbmNyeXB0X25iXzQoQUVTQ29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKSB7CisKK3ZvaWQgYWVzX2VuY3J5cHRfbmJfNChDUllQVF9hZXNfY29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKSB7CiAgIGludCBpOwotICBzdGF0aWMgY29uc3QgaW50IEMxID0gMSwgQzIgPSAyLCBDMyA9IDMsIE5iID0gNDsKKyAgY29uc3QgaW50IEMxID0gMSwgQzIgPSAyLCBDMyA9IDMsIE5iID0gNDsKICAgdW5zaWduZWQgaW50KiBrZXlzY2hlZCA9IGN0eC0+a2V5c2NoZWQ7CiAgIHVuc2lnbmVkIGludCBuZXdzdGF0ZVs0XTsKICAgZm9yIChpID0gMDsgaSA8IGN0eC0+TnIgLSAxOyBpKyspIHsKQEAgLTQ4OCw5ICs0NzgsMTAgQEAKICAgTU9WRVdPUkQoMyk7CiAgIEFERF9ST1VORF9LRVlfNDsKIH0KLXN0YXRpYyB2b2lkIGFlc19lbmNyeXB0X25iXzYoQUVTQ29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKSB7CisKK3ZvaWQgYWVzX2VuY3J5cHRfbmJfNihDUllQVF9hZXNfY29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKSB7CiAgIGludCBpOwotICBzdGF0aWMgY29uc3QgaW50IEMxID0gMSwgQzIgPSAyLCBDMyA9IDMsIE5iID0gNjsKKyAgY29uc3QgaW50IEMxID0gMSwgQzIgPSAyLCBDMyA9IDMsIE5iID0gNjsKICAgdW5zaWduZWQgaW50KiBrZXlzY2hlZCA9IGN0eC0+a2V5c2NoZWQ7CiAgIHVuc2lnbmVkIGludCBuZXdzdGF0ZVs2XTsKICAgZm9yIChpID0gMDsgaSA8IGN0eC0+TnIgLSAxOyBpKyspIHsKQEAgLTUyMyw5ICs1MTQsMTAgQEAKICAgTU9WRVdPUkQoNSk7CiAgIEFERF9ST1VORF9LRVlfNjsKIH0KLXN0YXRpYyB2b2lkIGFlc19lbmNyeXB0X25iXzgoQUVTQ29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKSB7CisKK3ZvaWQgYWVzX2VuY3J5cHRfbmJfOChDUllQVF9hZXNfY29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKSB7CiAgIGludCBpOwotICBzdGF0aWMgY29uc3QgaW50IEMxID0gMSwgQzIgPSAzLCBDMyA9IDQsIE5iID0gODsKKyAgY29uc3QgaW50IEMxID0gMSwgQzIgPSAzLCBDMyA9IDQsIE5iID0gODsKICAgdW5zaWduZWQgaW50KiBrZXlzY2hlZCA9IGN0eC0+a2V5c2NoZWQ7CiAgIHVuc2lnbmVkIGludCBuZXdzdGF0ZVs4XTsKICAgZm9yIChpID0gMDsgaSA8IGN0eC0+TnIgLSAxOyBpKyspIHsKQEAgLTU3OCw5ICs1NzAsMTAgQEAKICAgICAgICAgICAgICAgICAgKFNib3hpbnZbKGJsb2NrWyhpICsgQzEpICUgTmJdID4+IDE2KSAmIDB4RkZdIDw8IDE2KSB8IFwKICAgICAgICAgICAgICAgICAgKFNib3hpbnZbKGJsb2NrWyhpICsgQzIpICUgTmJdID4+IDgpICYgMHhGRl0gPDwgOCkgfCAgIFwKICAgICAgICAgICAgICAgICAgKFNib3hpbnZbKGJsb2NrWyhpICsgQzMpICUgTmJdKSAmIDB4RkZdKSkKLXN0YXRpYyB2b2lkIGFlc19kZWNyeXB0X25iXzQoQUVTQ29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKSB7CisKK3ZvaWQgYWVzX2RlY3J5cHRfbmJfNChDUllQVF9hZXNfY29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKSB7CiAgIGludCBpOwotICBzdGF0aWMgY29uc3QgaW50IEMxID0gNCAtIDEsIEMyID0gNCAtIDIsIEMzID0gNCAtIDMsIE5iID0gNDsKKyAgY29uc3QgaW50IEMxID0gNCAtIDEsIEMyID0gNCAtIDIsIEMzID0gNCAtIDMsIE5iID0gNDsKICAgdW5zaWduZWQgaW50KiBrZXlzY2hlZCA9IGN0eC0+aW52a2V5c2NoZWQ7CiAgIHVuc2lnbmVkIGludCBuZXdzdGF0ZVs0XTsKICAgZm9yIChpID0gMDsgaSA8IGN0eC0+TnIgLSAxOyBpKyspIHsKQEAgLTYwNSw5ICs1OTgsMTAgQEAKICAgTU9WRVdPUkQoMyk7CiAgIEFERF9ST1VORF9LRVlfNDsKIH0KLXN0YXRpYyB2b2lkIGFlc19kZWNyeXB0X25iXzYoQUVTQ29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKSB7CisKK3ZvaWQgYWVzX2RlY3J5cHRfbmJfNihDUllQVF9hZXNfY29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKSB7CiAgIGludCBpOwotICBzdGF0aWMgY29uc3QgaW50IEMxID0gNiAtIDEsIEMyID0gNiAtIDIsIEMzID0gNiAtIDMsIE5iID0gNjsKKyAgY29uc3QgaW50IEMxID0gNiAtIDEsIEMyID0gNiAtIDIsIEMzID0gNiAtIDMsIE5iID0gNjsKICAgdW5zaWduZWQgaW50KiBrZXlzY2hlZCA9IGN0eC0+aW52a2V5c2NoZWQ7CiAgIHVuc2lnbmVkIGludCBuZXdzdGF0ZVs2XTsKICAgZm9yIChpID0gMDsgaSA8IGN0eC0+TnIgLSAxOyBpKyspIHsKQEAgLTY0MCw5ICs2MzQsMTAgQEAKICAgTU9WRVdPUkQoNSk7CiAgIEFERF9ST1VORF9LRVlfNjsKIH0KLXN0YXRpYyB2b2lkIGFlc19kZWNyeXB0X25iXzgoQUVTQ29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKSB7CisKK3ZvaWQgYWVzX2RlY3J5cHRfbmJfOChDUllQVF9hZXNfY29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKSB7CiAgIGludCBpOwotICBzdGF0aWMgY29uc3QgaW50IEMxID0gOCAtIDEsIEMyID0gOCAtIDMsIEMzID0gOCAtIDQsIE5iID0gODsKKyAgY29uc3QgaW50IEMxID0gOCAtIDEsIEMyID0gOCAtIDMsIEMzID0gOCAtIDQsIE5iID0gODsKICAgdW5zaWduZWQgaW50KiBrZXlzY2hlZCA9IGN0eC0+aW52a2V5c2NoZWQ7CiAgIHVuc2lnbmVkIGludCBuZXdzdGF0ZVs4XTsKICAgZm9yIChpID0gMDsgaSA8IGN0eC0+TnIgLSAxOyBpKyspIHsKQEAgLTY4NSwxMCArNjgwLDEwIEBACiB9CiAjdW5kZWYgTUFLRVdPUkQKICN1bmRlZiBMQVNUV09SRAotc3RhdGljIHZvaWQgYWVzX3NldHVwKEFFU0NvbnRleHQqIGN0eCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhcioga2V5LAotICAgICAgICAgICAgICAgICAgICAgIGludCBrZXlsZW4pIHsKK3ZvaWQgYWVzX3NldHVwKENSWVBUX2Flc19jb250ZXh0KiBjdHgsCisgICAgICAgICAgICAgICBpbnQgYmxvY2tsZW4sCisgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBrZXksCisgICAgICAgICAgICAgICBpbnQga2V5bGVuKSB7CiAgIGludCBpLCBqLCBOaywgcmNvbnN0OwogICBBU1NFUlQoYmxvY2tsZW4gPT0gMTYgfHwgYmxvY2tsZW4gPT0gMjQgfHwgYmxvY2tsZW4gPT0gMzIpOwogICBBU1NFUlQoa2V5bGVuID09IDE2IHx8IGtleWxlbiA9PSAyNCB8fCBrZXlsZW4gPT0gMzIpOwpAQCAtNzUyLDE3ICs3NDcsMTcgQEAKICAgICB9CiAgIH0KIH0KLXN0YXRpYyB2b2lkIGFlc19kZWNyeXB0KEFFU0NvbnRleHQqIGN0eCwgdW5zaWduZWQgaW50KiBibG9jaykgewordm9pZCBhZXNfZGVjcnlwdChDUllQVF9hZXNfY29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKSB7CiAgIGN0eC0+ZGVjcnlwdChjdHgsIGJsb2NrKTsKIH0KLXN0YXRpYyB2b2lkIGFlc19kZWNyeXB0X2NiYyh1bnNpZ25lZCBjaGFyKiBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFU0NvbnRleHQqIGN0eCkgewordm9pZCBhZXNfZGVjcnlwdF9jYmModW5zaWduZWQgY2hhciogZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICBDUllQVF9hZXNfY29udGV4dCogY3R4KSB7CiAgIHVuc2lnbmVkIGludCBpdls0XSwgeFs0XSwgY3RbNF07CiAgIGludCBpOwogICBBU1NFUlQoKGxlbiAmIDE1KSA9PSAwKTsKLSAgRlhTWVNfbWVtY3B5KGl2LCBjdHgtPml2LCBzaXplb2YoaXYpKTsKKyAgbWVtY3B5KGl2LCBjdHgtPml2LCBzaXplb2YoaXYpKTsKICAgd2hpbGUgKGxlbiA+IDApIHsKICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgICB4W2ldID0gY3RbaV0gPSBHRVRfMzJCSVRfTVNCX0ZJUlNUKHNyYyArIDQgKiBpKTsKQEAgLTc3NiwxOSArNzcxLDIxIEBACiAgICAgc3JjICs9IDE2OwogICAgIGxlbiAtPSAxNjsKICAgfQotICBGWFNZU19tZW1jcHkoY3R4LT5pdiwgaXYsIHNpemVvZihpdikpOworICBtZW1jcHkoY3R4LT5pdiwgaXYsIHNpemVvZihpdikpOwogfQotc3RhdGljIHZvaWQgYWVzX2VuY3J5cHQoQUVTQ29udGV4dCogY3R4LCB1bnNpZ25lZCBpbnQqIGJsb2NrKSB7CisKK3ZvaWQgYWVzX2VuY3J5cHQoQ1JZUFRfYWVzX2NvbnRleHQqIGN0eCwgdW5zaWduZWQgaW50KiBibG9jaykgewogICBjdHgtPmVuY3J5cHQoY3R4LCBibG9jayk7CiB9Ci1zdGF0aWMgdm9pZCBhZXNfZW5jcnlwdF9jYmModW5zaWduZWQgY2hhciogZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRVNDb250ZXh0KiBjdHgpIHsKKwordm9pZCBhZXNfZW5jcnlwdF9jYmModW5zaWduZWQgY2hhciogZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICBDUllQVF9hZXNfY29udGV4dCogY3R4KSB7CiAgIHVuc2lnbmVkIGludCBpdls0XTsKICAgaW50IGk7CiAgIEFTU0VSVCgobGVuICYgMTUpID09IDApOwotICBGWFNZU19tZW1jcHkoaXYsIGN0eC0+aXYsIHNpemVvZihpdikpOworICBtZW1jcHkoaXYsIGN0eC0+aXYsIHNpemVvZihpdikpOwogICB3aGlsZSAobGVuID4gMCkgewogICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgIGl2W2ldIF49IEdFVF8zMkJJVF9NU0JfRklSU1Qoc3JjICsgNCAqIGkpOwpAQCAtODAxLDMzICs3OTgsMzQgQEAKICAgICBzcmMgKz0gMTY7CiAgICAgbGVuIC09IDE2OwogICB9Ci0gIEZYU1lTX21lbWNweShjdHgtPml2LCBpdiwgc2l6ZW9mKGl2KSk7CisgIG1lbWNweShjdHgtPml2LCBpdiwgc2l6ZW9mKGl2KSk7CiB9Ci12b2lkIENSWVBUX0FFU1NldEtleSh2b2lkKiBjb250ZXh0LAorCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBDUllQVF9BRVNTZXRLZXkoQ1JZUFRfYWVzX2NvbnRleHQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBibG9ja2xlbiwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGtleSwKICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGtleWxlbiwKICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkVuY3J5cHQpIHsKLSAgYWVzX3NldHVwKChBRVNDb250ZXh0Kiljb250ZXh0LCBibG9ja2xlbiwga2V5LCBrZXlsZW4pOworICBhZXNfc2V0dXAoY29udGV4dCwgYmxvY2tsZW4sIGtleSwga2V5bGVuKTsKIH0KLXZvaWQgQ1JZUFRfQUVTU2V0SVYodm9pZCogY29udGV4dCwgY29uc3QgdWludDhfdCogaXYpIHsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCAoKEFFU0NvbnRleHQqKWNvbnRleHQpLT5OYjsgaSsrKSB7Ci0gICAgKChBRVNDb250ZXh0Kiljb250ZXh0KS0+aXZbaV0gPSBHRVRfMzJCSVRfTVNCX0ZJUlNUKGl2ICsgNCAqIGkpOwotICB9CisKK3ZvaWQgQ1JZUFRfQUVTU2V0SVYoQ1JZUFRfYWVzX2NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIGl2KSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGV4dC0+TmI7IGkrKykKKyAgICBjb250ZXh0LT5pdltpXSA9IEdFVF8zMkJJVF9NU0JfRklSU1QoaXYgKyA0ICogaSk7CiB9Ci12b2lkIENSWVBUX0FFU0RlY3J5cHQodm9pZCogY29udGV4dCwKKwordm9pZCBDUllQVF9BRVNEZWNyeXB0KENSWVBUX2Flc19jb250ZXh0KiBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjLAogICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlbikgewotICBhZXNfZGVjcnlwdF9jYmMoZGVzdCwgc3JjLCBsZW4sIChBRVNDb250ZXh0Kiljb250ZXh0KTsKKyAgYWVzX2RlY3J5cHRfY2JjKGRlc3QsIHNyYywgbGVuLCBjb250ZXh0KTsKIH0KLXZvaWQgQ1JZUFRfQUVTRW5jcnlwdCh2b2lkKiBjb250ZXh0LAorCit2b2lkIENSWVBUX0FFU0VuY3J5cHQoQ1JZUFRfYWVzX2NvbnRleHQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGVuKSB7Ci0gIGFlc19lbmNyeXB0X2NiYyhkZXN0LCBzcmMsIGxlbiwgKEFFU0NvbnRleHQqKWNvbnRleHQpOworICBhZXNfZW5jcnlwdF9jYmMoZGVzdCwgc3JjLCBsZW4sIGNvbnRleHQpOwogfQotI2lmZGVmIF9fY3BsdXNwbHVzCi19OwotI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0X3NoYS5jcHAgYi9jb3JlL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0X3NoYS5jcHAKaW5kZXggNzlmZjUwMy4uNTViODg1ZCAxMDA2NDQKLS0tIGEvY29yZS9mZHJtL2NyeXB0by9meF9jcnlwdF9zaGEuY3BwCisrKyBiL2NvcmUvZmRybS9jcnlwdG8vZnhfY3J5cHRfc2hhLmNwcApAQCAtNiwxOCArNiw4OSBAQAogCiAjaW5jbHVkZSAiY29yZS9mZHJtL2NyeXB0by9meF9jcnlwdC5oIgogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCiAjZGVmaW5lIHJvbCh4LCB5KSAoKCh4KSA8PCAoeSkpIHwgKCgodW5zaWduZWQgaW50KXgpID4+ICgzMiAtIHkpKSkKLXN0YXRpYyB2b2lkIFNIQV9Db3JlX0luaXQodW5zaWduZWQgaW50IGhbNV0pIHsKKworI2RlZmluZSBTSEFfR0VUX1VJTlQzMihuLCBiLCBpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChuKSA9ICgodWludDMyX3QpKGIpWyhpKV0gPDwgMjQpIHwgKCh1aW50MzJfdCkoYilbKGkpICsgMV0gPDwgMTYpIHwgXAorICAgICAgICAgICgodWludDMyX3QpKGIpWyhpKSArIDJdIDw8IDgpIHwgKCh1aW50MzJfdCkoYilbKGkpICsgM10pOyAgICAgXAorICB9CisjZGVmaW5lIFNIQV9QVVRfVUlOVDMyKG4sIGIsIGkpICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChiKVsoaSldID0gKHVpbnQ4X3QpKChuKSA+PiAyNCk7ICAgICBcCisgICAgKGIpWyhpKSArIDFdID0gKHVpbnQ4X3QpKChuKSA+PiAxNik7IFwKKyAgICAoYilbKGkpICsgMl0gPSAodWludDhfdCkoKG4pID4+IDgpOyAgXAorICAgIChiKVsoaSkgKyAzXSA9ICh1aW50OF90KSgobikpOyAgICAgICBcCisgIH0KKworI2RlZmluZSBTSEEzODRfRjAoeCwgeSwgeikgKCh4ICYgeSkgfCAoeiAmICh4IHwgeSkpKQorI2RlZmluZSBTSEEzODRfRjEoeCwgeSwgeikgKHogXiAoeCAmICh5IF4geikpKQorI2RlZmluZSBTSEEzODRfU0hSKHgsIG4pICh4ID4+IG4pCisjZGVmaW5lIFNIQTM4NF9ST1RSKHgsIG4pIChTSEEzODRfU0hSKHgsIG4pIHwgeCA8PCAoNjQgLSBuKSkKKyNkZWZpbmUgU0hBMzg0X1MwKHgpIChTSEEzODRfUk9UUih4LCAxKSBeIFNIQTM4NF9ST1RSKHgsIDgpIF4gU0hBMzg0X1NIUih4LCA3KSkKKyNkZWZpbmUgU0hBMzg0X1MxKHgpIFwKKyAgKFNIQTM4NF9ST1RSKHgsIDE5KSBeIFNIQTM4NF9ST1RSKHgsIDYxKSBeIFNIQTM4NF9TSFIoeCwgNikpCisjZGVmaW5lIFNIQTM4NF9TMih4KSBcCisgIChTSEEzODRfUk9UUih4LCAyOCkgXiBTSEEzODRfUk9UUih4LCAzNCkgXiBTSEEzODRfUk9UUih4LCAzOSkpCisjZGVmaW5lIFNIQTM4NF9TMyh4KSBcCisgIChTSEEzODRfUk9UUih4LCAxNCkgXiBTSEEzODRfUk9UUih4LCAxOCkgXiBTSEEzODRfUk9UUih4LCA0MSkpCisjZGVmaW5lIFNIQTM4NF9QKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIHgsIEspICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAxID0gaCArIFNIQTM4NF9TMyhlKSArIFNIQTM4NF9GMShlLCBmLCBnKSArIEsgKyB4OyBcCisgICAgdGVtcDIgPSBTSEEzODRfUzIoYSkgKyBTSEEzODRfRjAoYSwgYiwgYyk7ICAgICAgICAgICAgIFwKKyAgICBkICs9IHRlbXAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGggPSB0ZW1wMSArIHRlbXAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgU0hBMzg0X1IodCkgXAorICAoV1t0XSA9IFNIQTM4NF9TMShXW3QgLSAyXSkgKyBXW3QgLSA3XSArIFNIQTM4NF9TMChXW3QgLSAxNV0pICsgV1t0IC0gMTZdKQorCisjZGVmaW5lIEdFVF9GWF82NFdPUkQobiwgYiwgaSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAobikgPSAoKHVpbnQ2NF90KShiKVsoaSldIDw8IDU2KSB8ICgodWludDY0X3QpKGIpWyhpKSArIDFdIDw8IDQ4KSB8ICAgICBcCisgICAgICAgICAgKCh1aW50NjRfdCkoYilbKGkpICsgMl0gPDwgNDApIHwgKCh1aW50NjRfdCkoYilbKGkpICsgM10gPDwgMzIpIHwgXAorICAgICAgICAgICgodWludDY0X3QpKGIpWyhpKSArIDRdIDw8IDI0KSB8ICgodWludDY0X3QpKGIpWyhpKSArIDVdIDw8IDE2KSB8IFwKKyAgICAgICAgICAoKHVpbnQ2NF90KShiKVsoaSkgKyA2XSA8PCA4KSB8ICgodWludDY0X3QpKGIpWyhpKSArIDddKTsgICAgICAgICBcCisgIH0KKyNkZWZpbmUgUFVUX1VJTlQ2NChuLCBiLCBpKSAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKGIpWyhpKV0gPSAodWludDhfdCkoKG4pID4+IDU2KTsgICAgIFwKKyAgICAoYilbKGkpICsgMV0gPSAodWludDhfdCkoKG4pID4+IDQ4KTsgXAorICAgIChiKVsoaSkgKyAyXSA9ICh1aW50OF90KSgobikgPj4gNDApOyBcCisgICAgKGIpWyhpKSArIDNdID0gKHVpbnQ4X3QpKChuKSA+PiAzMik7IFwKKyAgICAoYilbKGkpICsgNF0gPSAodWludDhfdCkoKG4pID4+IDI0KTsgXAorICAgIChiKVsoaSkgKyA1XSA9ICh1aW50OF90KSgobikgPj4gMTYpOyBcCisgICAgKGIpWyhpKSArIDZdID0gKHVpbnQ4X3QpKChuKSA+PiA4KTsgIFwKKyAgICAoYilbKGkpICsgN10gPSAodWludDhfdCkoKG4pKTsgICAgICAgXAorICB9CisKKyNkZWZpbmUgU0hSKHgsIG4pICgoeCAmIDB4RkZGRkZGRkYpID4+IG4pCisjZGVmaW5lIFJPVFIoeCwgbikgKFNIUih4LCBuKSB8ICh4IDw8ICgzMiAtIG4pKSkKKyNkZWZpbmUgUzAoeCkgKFJPVFIoeCwgNykgXiBST1RSKHgsIDE4KSBeIFNIUih4LCAzKSkKKyNkZWZpbmUgUzEoeCkgKFJPVFIoeCwgMTcpIF4gUk9UUih4LCAxOSkgXiBTSFIoeCwgMTApKQorI2RlZmluZSBTMih4KSAoUk9UUih4LCAyKSBeIFJPVFIoeCwgMTMpIF4gUk9UUih4LCAyMikpCisjZGVmaW5lIFMzKHgpIChST1RSKHgsIDYpIF4gUk9UUih4LCAxMSkgXiBST1RSKHgsIDI1KSkKKyNkZWZpbmUgRjAoeCwgeSwgeikgKCh4ICYgeSkgfCAoeiAmICh4IHwgeSkpKQorI2RlZmluZSBGMSh4LCB5LCB6KSAoeiBeICh4ICYgKHkgXiB6KSkpCisjZGVmaW5lIFIodCkgKFdbdF0gPSBTMShXW3QgLSAyXSkgKyBXW3QgLSA3XSArIFMwKFdbdCAtIDE1XSkgKyBXW3QgLSAxNl0pCisjZGVmaW5lIFBTKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgsIHgsIEspICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDEgPSBoICsgUzMoZSkgKyBGMShlLCBmLCBnKSArIEsgKyB4OyBcCisgICAgdGVtcDIgPSBTMihhKSArIEYwKGEsIGIsIGMpOyAgICAgICAgICAgICBcCisgICAgZCArPSB0ZW1wMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaCA9IHRlbXAxICsgdGVtcDI7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworbmFtZXNwYWNlIHsKKwordm9pZCBTSEFfQ29yZV9Jbml0KHVuc2lnbmVkIGludCBoWzVdKSB7CiAgIGhbMF0gPSAweDY3NDUyMzAxOwogICBoWzFdID0gMHhlZmNkYWI4OTsKICAgaFsyXSA9IDB4OThiYWRjZmU7CiAgIGhbM10gPSAweDEwMzI1NDc2OwogICBoWzRdID0gMHhjM2QyZTFmMDsKIH0KLXN0YXRpYyB2b2lkIFNIQVRyYW5zZm9ybSh1bnNpZ25lZCBpbnQqIGRpZ2VzdCwgdW5zaWduZWQgaW50KiBibG9jaykgeworCit2b2lkIFNIQVRyYW5zZm9ybSh1bnNpZ25lZCBpbnQqIGRpZ2VzdCwgdW5zaWduZWQgaW50KiBibG9jaykgewogICB1bnNpZ25lZCBpbnQgd1s4MF07CiAgIHVuc2lnbmVkIGludCBhLCBiLCBjLCBkLCBlOwogICBpbnQgdDsKQEAgLTczLDIxNiArMTQ0LDk5IEBACiAgIGRpZ2VzdFs0XSArPSBlOwogfQogCi12b2lkIENSWVBUX1NIQTFTdGFydChDUllQVF9zaGExX2NvbnRleHQqIHMpIHsKLSAgU0hBX0NvcmVfSW5pdChzLT5oKTsKLSAgcy0+YmxrdXNlZCA9IDA7Ci0gIHMtPmxlbmhpID0gcy0+bGVubG8gPSAwOwotfQordm9pZCBzaGEyNTZfcHJvY2VzcyhDUllQVF9zaGEyX2NvbnRleHQqIGN0eCwgY29uc3QgdWludDhfdCBkYXRhWzY0XSkgeworICB1aW50MzJfdCBXWzY0XTsKKyAgU0hBX0dFVF9VSU5UMzIoV1swXSwgZGF0YSwgMCk7CisgIFNIQV9HRVRfVUlOVDMyKFdbMV0sIGRhdGEsIDQpOworICBTSEFfR0VUX1VJTlQzMihXWzJdLCBkYXRhLCA4KTsKKyAgU0hBX0dFVF9VSU5UMzIoV1szXSwgZGF0YSwgMTIpOworICBTSEFfR0VUX1VJTlQzMihXWzRdLCBkYXRhLCAxNik7CisgIFNIQV9HRVRfVUlOVDMyKFdbNV0sIGRhdGEsIDIwKTsKKyAgU0hBX0dFVF9VSU5UMzIoV1s2XSwgZGF0YSwgMjQpOworICBTSEFfR0VUX1VJTlQzMihXWzddLCBkYXRhLCAyOCk7CisgIFNIQV9HRVRfVUlOVDMyKFdbOF0sIGRhdGEsIDMyKTsKKyAgU0hBX0dFVF9VSU5UMzIoV1s5XSwgZGF0YSwgMzYpOworICBTSEFfR0VUX1VJTlQzMihXWzEwXSwgZGF0YSwgNDApOworICBTSEFfR0VUX1VJTlQzMihXWzExXSwgZGF0YSwgNDQpOworICBTSEFfR0VUX1VJTlQzMihXWzEyXSwgZGF0YSwgNDgpOworICBTSEFfR0VUX1VJTlQzMihXWzEzXSwgZGF0YSwgNTIpOworICBTSEFfR0VUX1VJTlQzMihXWzE0XSwgZGF0YSwgNTYpOworICBTSEFfR0VUX1VJTlQzMihXWzE1XSwgZGF0YSwgNjApOwogCi12b2lkIENSWVBUX1NIQTFVcGRhdGUoQ1JZUFRfc2hhMV9jb250ZXh0KiBzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSkgewotICB1bnNpZ25lZCBjaGFyKiBxID0gKHVuc2lnbmVkIGNoYXIqKWRhdGE7Ci0gIHVuc2lnbmVkIGludCB3b3JkYmxvY2tbMTZdOwotICBpbnQgbGVuID0gc2l6ZTsKLSAgdW5zaWduZWQgaW50IGxlbncgPSBsZW47Ci0gIGludCBpOwotICBzLT5sZW5sbyArPSBsZW53OwotICBzLT5sZW5oaSArPSAocy0+bGVubG8gPCBsZW53KTsKLSAgaWYgKHMtPmJsa3VzZWQgJiYgcy0+YmxrdXNlZCArIGxlbiA8IDY0KSB7Ci0gICAgRlhTWVNfbWVtY3B5KHMtPmJsb2NrICsgcy0+YmxrdXNlZCwgcSwgbGVuKTsKLSAgICBzLT5ibGt1c2VkICs9IGxlbjsKLSAgfSBlbHNlIHsKLSAgICB3aGlsZSAocy0+YmxrdXNlZCArIGxlbiA+PSA2NCkgewotICAgICAgRlhTWVNfbWVtY3B5KHMtPmJsb2NrICsgcy0+YmxrdXNlZCwgcSwgNjQgLSBzLT5ibGt1c2VkKTsKLSAgICAgIHEgKz0gNjQgLSBzLT5ibGt1c2VkOwotICAgICAgbGVuIC09IDY0IC0gcy0+YmxrdXNlZDsKLSAgICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0gICAgICAgIHdvcmRibG9ja1tpXSA9ICgoKHVuc2lnbmVkIGludClzLT5ibG9ja1tpICogNCArIDBdKSA8PCAyNCkgfAotICAgICAgICAgICAgICAgICAgICAgICAoKCh1bnNpZ25lZCBpbnQpcy0+YmxvY2tbaSAqIDQgKyAxXSkgPDwgMTYpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgKCgodW5zaWduZWQgaW50KXMtPmJsb2NrW2kgKiA0ICsgMl0pIDw8IDgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgKCgodW5zaWduZWQgaW50KXMtPmJsb2NrW2kgKiA0ICsgM10pIDw8IDApOwotICAgICAgfQotICAgICAgU0hBVHJhbnNmb3JtKHMtPmgsIHdvcmRibG9jayk7Ci0gICAgICBzLT5ibGt1c2VkID0gMDsKLSAgICB9Ci0gICAgRlhTWVNfbWVtY3B5KHMtPmJsb2NrLCBxLCBsZW4pOwotICAgIHMtPmJsa3VzZWQgPSBsZW47Ci0gIH0KLX0KLQotdm9pZCBDUllQVF9TSEExRmluaXNoKENSWVBUX3NoYTFfY29udGV4dCogcywgdWludDhfdCBkaWdlc3RbMjBdKSB7Ci0gIGludCBpOwotICBpbnQgcGFkOwotICB1bnNpZ25lZCBjaGFyIGNbNjRdOwotICB1bnNpZ25lZCBpbnQgbGVuaGksIGxlbmxvOwotICBpZiAocy0+YmxrdXNlZCA+PSA1NikgewotICAgIHBhZCA9IDU2ICsgNjQgLSBzLT5ibGt1c2VkOwotICB9IGVsc2UgewotICAgIHBhZCA9IDU2IC0gcy0+YmxrdXNlZDsKLSAgfQotICBsZW5oaSA9IChzLT5sZW5oaSA8PCAzKSB8IChzLT5sZW5sbyA+PiAoMzIgLSAzKSk7Ci0gIGxlbmxvID0gKHMtPmxlbmxvIDw8IDMpOwotICBGWFNZU19tZW1zZXQoYywgMCwgcGFkKTsKLSAgY1swXSA9IDB4ODA7Ci0gIENSWVBUX1NIQTFVcGRhdGUocywgYywgcGFkKTsKLSAgY1swXSA9IChsZW5oaSA+PiAyNCkgJiAweEZGOwotICBjWzFdID0gKGxlbmhpID4+IDE2KSAmIDB4RkY7Ci0gIGNbMl0gPSAobGVuaGkgPj4gOCkgJiAweEZGOwotICBjWzNdID0gKGxlbmhpID4+IDApICYgMHhGRjsKLSAgY1s0XSA9IChsZW5sbyA+PiAyNCkgJiAweEZGOwotICBjWzVdID0gKGxlbmxvID4+IDE2KSAmIDB4RkY7Ci0gIGNbNl0gPSAobGVubG8gPj4gOCkgJiAweEZGOwotICBjWzddID0gKGxlbmxvID4+IDApICYgMHhGRjsKLSAgQ1JZUFRfU0hBMVVwZGF0ZShzLCBjLCA4KTsKLSAgZm9yIChpID0gMDsgaSA8IDU7IGkrKykgewotICAgIGRpZ2VzdFtpICogNF0gPSAocy0+aFtpXSA+PiAyNCkgJiAweEZGOwotICAgIGRpZ2VzdFtpICogNCArIDFdID0gKHMtPmhbaV0gPj4gMTYpICYgMHhGRjsKLSAgICBkaWdlc3RbaSAqIDQgKyAyXSA9IChzLT5oW2ldID4+IDgpICYgMHhGRjsKLSAgICBkaWdlc3RbaSAqIDQgKyAzXSA9IChzLT5oW2ldKSAmIDB4RkY7Ci0gIH0KLX0KLXZvaWQgQ1JZUFRfU0hBMUdlbmVyYXRlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkaWdlc3RbMjBdKSB7Ci0gIENSWVBUX3NoYTFfY29udGV4dCBzOwotICBDUllQVF9TSEExU3RhcnQoJnMpOwotICBDUllQVF9TSEExVXBkYXRlKCZzLCBkYXRhLCBzaXplKTsKLSAgQ1JZUFRfU0hBMUZpbmlzaCgmcywgZGlnZXN0KTsKLX0KLSNkZWZpbmUgR0VUX1VJTlQzMihuLCBiLCBpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAobikgPSAoKHVpbnQzMl90KShiKVsoaSldIDw8IDI0KSB8ICgodWludDMyX3QpKGIpWyhpKSArIDFdIDw8IDE2KSB8IFwKLSAgICAgICAgICAoKHVpbnQzMl90KShiKVsoaSkgKyAyXSA8PCA4KSB8ICgodWludDMyX3QpKGIpWyhpKSArIDNdKTsgICAgIFwKLSAgfQotI2RlZmluZSBQVVRfVUlOVDMyKG4sIGIsIGkpICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoYilbKGkpXSA9ICh1aW50OF90KSgobikgPj4gMjQpOyAgICAgXAotICAgIChiKVsoaSkgKyAxXSA9ICh1aW50OF90KSgobikgPj4gMTYpOyBcCi0gICAgKGIpWyhpKSArIDJdID0gKHVpbnQ4X3QpKChuKSA+PiA4KTsgIFwKLSAgICAoYilbKGkpICsgM10gPSAodWludDhfdCkoKG4pKTsgICAgICAgXAotICB9Ci0KLXZvaWQgQ1JZUFRfU0hBMjU2U3RhcnQoQ1JZUFRfc2hhMjU2X2NvbnRleHQqIGN0eCkgewotICBjdHgtPnRvdGFsWzBdID0gMDsKLSAgY3R4LT50b3RhbFsxXSA9IDA7Ci0gIGN0eC0+c3RhdGVbMF0gPSAweDZBMDlFNjY3OwotICBjdHgtPnN0YXRlWzFdID0gMHhCQjY3QUU4NTsKLSAgY3R4LT5zdGF0ZVsyXSA9IDB4M0M2RUYzNzI7Ci0gIGN0eC0+c3RhdGVbM10gPSAweEE1NEZGNTNBOwotICBjdHgtPnN0YXRlWzRdID0gMHg1MTBFNTI3RjsKLSAgY3R4LT5zdGF0ZVs1XSA9IDB4OUIwNTY4OEM7Ci0gIGN0eC0+c3RhdGVbNl0gPSAweDFGODNEOUFCOwotICBjdHgtPnN0YXRlWzddID0gMHg1QkUwQ0QxOTsKLX0KLQotc3RhdGljIHZvaWQgc2hhMjU2X3Byb2Nlc3MoQ1JZUFRfc2hhMjU2X2NvbnRleHQqIGN0eCwgY29uc3QgdWludDhfdCBkYXRhWzY0XSkgewotICB1aW50MzJfdCB0ZW1wMSwgdGVtcDIsIFdbNjRdOwotICB1aW50MzJfdCBBLCBCLCBDLCBELCBFLCBGLCBHLCBIOwotICBHRVRfVUlOVDMyKFdbMF0sIGRhdGEsIDApOwotICBHRVRfVUlOVDMyKFdbMV0sIGRhdGEsIDQpOwotICBHRVRfVUlOVDMyKFdbMl0sIGRhdGEsIDgpOwotICBHRVRfVUlOVDMyKFdbM10sIGRhdGEsIDEyKTsKLSAgR0VUX1VJTlQzMihXWzRdLCBkYXRhLCAxNik7Ci0gIEdFVF9VSU5UMzIoV1s1XSwgZGF0YSwgMjApOwotICBHRVRfVUlOVDMyKFdbNl0sIGRhdGEsIDI0KTsKLSAgR0VUX1VJTlQzMihXWzddLCBkYXRhLCAyOCk7Ci0gIEdFVF9VSU5UMzIoV1s4XSwgZGF0YSwgMzIpOwotICBHRVRfVUlOVDMyKFdbOV0sIGRhdGEsIDM2KTsKLSAgR0VUX1VJTlQzMihXWzEwXSwgZGF0YSwgNDApOwotICBHRVRfVUlOVDMyKFdbMTFdLCBkYXRhLCA0NCk7Ci0gIEdFVF9VSU5UMzIoV1sxMl0sIGRhdGEsIDQ4KTsKLSAgR0VUX1VJTlQzMihXWzEzXSwgZGF0YSwgNTIpOwotICBHRVRfVUlOVDMyKFdbMTRdLCBkYXRhLCA1Nik7Ci0gIEdFVF9VSU5UMzIoV1sxNV0sIGRhdGEsIDYwKTsKLSNkZWZpbmUgU0hSKHgsIG4pICgoeCAmIDB4RkZGRkZGRkYpID4+IG4pCi0jZGVmaW5lIFJPVFIoeCwgbikgKFNIUih4LCBuKSB8ICh4IDw8ICgzMiAtIG4pKSkKLSNkZWZpbmUgUzAoeCkgKFJPVFIoeCwgNykgXiBST1RSKHgsIDE4KSBeIFNIUih4LCAzKSkKLSNkZWZpbmUgUzEoeCkgKFJPVFIoeCwgMTcpIF4gUk9UUih4LCAxOSkgXiBTSFIoeCwgMTApKQotI2RlZmluZSBTMih4KSAoUk9UUih4LCAyKSBeIFJPVFIoeCwgMTMpIF4gUk9UUih4LCAyMikpCi0jZGVmaW5lIFMzKHgpIChST1RSKHgsIDYpIF4gUk9UUih4LCAxMSkgXiBST1RSKHgsIDI1KSkKLSNkZWZpbmUgRjAoeCwgeSwgeikgKCh4ICYgeSkgfCAoeiAmICh4IHwgeSkpKQotI2RlZmluZSBGMSh4LCB5LCB6KSAoeiBeICh4ICYgKHkgXiB6KSkpCi0jZGVmaW5lIFIodCkgKFdbdF0gPSBTMShXW3QgLSAyXSkgKyBXW3QgLSA3XSArIFMwKFdbdCAtIDE1XSkgKyBXW3QgLSAxNl0pCi0jZGVmaW5lIFAoYSwgYiwgYywgZCwgZSwgZiwgZywgaCwgeCwgSykgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdGVtcDEgPSBoICsgUzMoZSkgKyBGMShlLCBmLCBnKSArIEsgKyB4OyBcCi0gICAgdGVtcDIgPSBTMihhKSArIEYwKGEsIGIsIGMpOyAgICAgICAgICAgICBcCi0gICAgZCArPSB0ZW1wMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaCA9IHRlbXAxICsgdGVtcDI7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLSAgQSA9IGN0eC0+c3RhdGVbMF07Ci0gIEIgPSBjdHgtPnN0YXRlWzFdOwotICBDID0gY3R4LT5zdGF0ZVsyXTsKLSAgRCA9IGN0eC0+c3RhdGVbM107Ci0gIEUgPSBjdHgtPnN0YXRlWzRdOwotICBGID0gY3R4LT5zdGF0ZVs1XTsKLSAgRyA9IGN0eC0+c3RhdGVbNl07Ci0gIEggPSBjdHgtPnN0YXRlWzddOwotICBQKEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFdbMF0sIDB4NDI4QTJGOTgpOwotICBQKEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFdbMV0sIDB4NzEzNzQ0OTEpOwotICBQKEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIFdbMl0sIDB4QjVDMEZCQ0YpOwotICBQKEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFdbM10sIDB4RTlCNURCQTUpOwotICBQKEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFdbNF0sIDB4Mzk1NkMyNUIpOwotICBQKEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIFdbNV0sIDB4NTlGMTExRjEpOwotICBQKEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFdbNl0sIDB4OTIzRjgyQTQpOwotICBQKEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFdbN10sIDB4QUIxQzVFRDUpOwotICBQKEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFdbOF0sIDB4RDgwN0FBOTgpOwotICBQKEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFdbOV0sIDB4MTI4MzVCMDEpOwotICBQKEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIFdbMTBdLCAweDI0MzE4NUJFKTsKLSAgUChGLCBHLCBILCBBLCBCLCBDLCBELCBFLCBXWzExXSwgMHg1NTBDN0RDMyk7Ci0gIFAoRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgV1sxMl0sIDB4NzJCRTVENzQpOwotICBQKEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIFdbMTNdLCAweDgwREVCMUZFKTsKLSAgUChDLCBELCBFLCBGLCBHLCBILCBBLCBCLCBXWzE0XSwgMHg5QkRDMDZBNyk7Ci0gIFAoQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgV1sxNV0sIDB4QzE5QkYxNzQpOwotICBQKEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFIoMTYpLCAweEU0OUI2OUMxKTsKLSAgUChILCBBLCBCLCBDLCBELCBFLCBGLCBHLCBSKDE3KSwgMHhFRkJFNDc4Nik7Ci0gIFAoRywgSCwgQSwgQiwgQywgRCwgRSwgRiwgUigxOCksIDB4MEZDMTlEQzYpOwotICBQKEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFIoMTkpLCAweDI0MENBMUNDKTsKLSAgUChFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBSKDIwKSwgMHgyREU5MkM2Rik7Ci0gIFAoRCwgRSwgRiwgRywgSCwgQSwgQiwgQywgUigyMSksIDB4NEE3NDg0QUEpOwotICBQKEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFIoMjIpLCAweDVDQjBBOURDKTsKLSAgUChCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBSKDIzKSwgMHg3NkY5ODhEQSk7Ci0gIFAoQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgUigyNCksIDB4OTgzRTUxNTIpOwotICBQKEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFIoMjUpLCAweEE4MzFDNjZEKTsKLSAgUChHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBSKDI2KSwgMHhCMDAzMjdDOCk7Ci0gIFAoRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgUigyNyksIDB4QkY1OTdGQzcpOwotICBQKEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFIoMjgpLCAweEM2RTAwQkYzKTsKLSAgUChELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBSKDI5KSwgMHhENUE3OTE0Nyk7Ci0gIFAoQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgUigzMCksIDB4MDZDQTYzNTEpOwotICBQKEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFIoMzEpLCAweDE0MjkyOTY3KTsKLSAgUChBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBSKDMyKSwgMHgyN0I3MEE4NSk7Ci0gIFAoSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgUigzMyksIDB4MkUxQjIxMzgpOwotICBQKEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIFIoMzQpLCAweDREMkM2REZDKTsKLSAgUChGLCBHLCBILCBBLCBCLCBDLCBELCBFLCBSKDM1KSwgMHg1MzM4MEQxMyk7Ci0gIFAoRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgUigzNiksIDB4NjUwQTczNTQpOwotICBQKEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIFIoMzcpLCAweDc2NkEwQUJCKTsKLSAgUChDLCBELCBFLCBGLCBHLCBILCBBLCBCLCBSKDM4KSwgMHg4MUMyQzkyRSk7Ci0gIFAoQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgUigzOSksIDB4OTI3MjJDODUpOwotICBQKEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFIoNDApLCAweEEyQkZFOEExKTsKLSAgUChILCBBLCBCLCBDLCBELCBFLCBGLCBHLCBSKDQxKSwgMHhBODFBNjY0Qik7Ci0gIFAoRywgSCwgQSwgQiwgQywgRCwgRSwgRiwgUig0MiksIDB4QzI0QjhCNzApOwotICBQKEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFIoNDMpLCAweEM3NkM1MUEzKTsKLSAgUChFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBSKDQ0KSwgMHhEMTkyRTgxOSk7Ci0gIFAoRCwgRSwgRiwgRywgSCwgQSwgQiwgQywgUig0NSksIDB4RDY5OTA2MjQpOwotICBQKEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFIoNDYpLCAweEY0MEUzNTg1KTsKLSAgUChCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBSKDQ3KSwgMHgxMDZBQTA3MCk7Ci0gIFAoQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgUig0OCksIDB4MTlBNEMxMTYpOwotICBQKEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFIoNDkpLCAweDFFMzc2QzA4KTsKLSAgUChHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBSKDUwKSwgMHgyNzQ4Nzc0Qyk7Ci0gIFAoRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgUig1MSksIDB4MzRCMEJDQjUpOwotICBQKEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFIoNTIpLCAweDM5MUMwQ0IzKTsKLSAgUChELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBSKDUzKSwgMHg0RUQ4QUE0QSk7Ci0gIFAoQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgUig1NCksIDB4NUI5Q0NBNEYpOwotICBQKEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFIoNTUpLCAweDY4MkU2RkYzKTsKLSAgUChBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBSKDU2KSwgMHg3NDhGODJFRSk7Ci0gIFAoSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgUig1NyksIDB4NzhBNTYzNkYpOwotICBQKEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIFIoNTgpLCAweDg0Qzg3ODE0KTsKLSAgUChGLCBHLCBILCBBLCBCLCBDLCBELCBFLCBSKDU5KSwgMHg4Q0M3MDIwOCk7Ci0gIFAoRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgUig2MCksIDB4OTBCRUZGRkEpOwotICBQKEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIFIoNjEpLCAweEE0NTA2Q0VCKTsKLSAgUChDLCBELCBFLCBGLCBHLCBILCBBLCBCLCBSKDYyKSwgMHhCRUY5QTNGNyk7Ci0gIFAoQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgUig2MyksIDB4QzY3MTc4RjIpOworICB1aW50MzJfdCB0ZW1wMTsKKyAgdWludDMyX3QgdGVtcDI7CisgIHVpbnQzMl90IEEgPSBjdHgtPnN0YXRlWzBdOworICB1aW50MzJfdCBCID0gY3R4LT5zdGF0ZVsxXTsKKyAgdWludDMyX3QgQyA9IGN0eC0+c3RhdGVbMl07CisgIHVpbnQzMl90IEQgPSBjdHgtPnN0YXRlWzNdOworICB1aW50MzJfdCBFID0gY3R4LT5zdGF0ZVs0XTsKKyAgdWludDMyX3QgRiA9IGN0eC0+c3RhdGVbNV07CisgIHVpbnQzMl90IEcgPSBjdHgtPnN0YXRlWzZdOworICB1aW50MzJfdCBIID0gY3R4LT5zdGF0ZVs3XTsKKyAgUFMoQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgV1swXSwgMHg0MjhBMkY5OCk7CisgIFBTKEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFdbMV0sIDB4NzEzNzQ0OTEpOworICBQUyhHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBXWzJdLCAweEI1QzBGQkNGKTsKKyAgUFMoRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgV1szXSwgMHhFOUI1REJBNSk7CisgIFBTKEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFdbNF0sIDB4Mzk1NkMyNUIpOworICBQUyhELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBXWzVdLCAweDU5RjExMUYxKTsKKyAgUFMoQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgV1s2XSwgMHg5MjNGODJBNCk7CisgIFBTKEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFdbN10sIDB4QUIxQzVFRDUpOworICBQUyhBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBXWzhdLCAweEQ4MDdBQTk4KTsKKyAgUFMoSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgV1s5XSwgMHgxMjgzNUIwMSk7CisgIFBTKEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIFdbMTBdLCAweDI0MzE4NUJFKTsKKyAgUFMoRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgV1sxMV0sIDB4NTUwQzdEQzMpOworICBQUyhFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBXWzEyXSwgMHg3MkJFNUQ3NCk7CisgIFBTKEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIFdbMTNdLCAweDgwREVCMUZFKTsKKyAgUFMoQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgV1sxNF0sIDB4OUJEQzA2QTcpOworICBQUyhCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBXWzE1XSwgMHhDMTlCRjE3NCk7CisgIFBTKEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFIoMTYpLCAweEU0OUI2OUMxKTsKKyAgUFMoSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgUigxNyksIDB4RUZCRTQ3ODYpOworICBQUyhHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBSKDE4KSwgMHgwRkMxOURDNik7CisgIFBTKEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFIoMTkpLCAweDI0MENBMUNDKTsKKyAgUFMoRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgUigyMCksIDB4MkRFOTJDNkYpOworICBQUyhELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBSKDIxKSwgMHg0QTc0ODRBQSk7CisgIFBTKEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFIoMjIpLCAweDVDQjBBOURDKTsKKyAgUFMoQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgUigyMyksIDB4NzZGOTg4REEpOworICBQUyhBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBSKDI0KSwgMHg5ODNFNTE1Mik7CisgIFBTKEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFIoMjUpLCAweEE4MzFDNjZEKTsKKyAgUFMoRywgSCwgQSwgQiwgQywgRCwgRSwgRiwgUigyNiksIDB4QjAwMzI3QzgpOworICBQUyhGLCBHLCBILCBBLCBCLCBDLCBELCBFLCBSKDI3KSwgMHhCRjU5N0ZDNyk7CisgIFBTKEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFIoMjgpLCAweEM2RTAwQkYzKTsKKyAgUFMoRCwgRSwgRiwgRywgSCwgQSwgQiwgQywgUigyOSksIDB4RDVBNzkxNDcpOworICBQUyhDLCBELCBFLCBGLCBHLCBILCBBLCBCLCBSKDMwKSwgMHgwNkNBNjM1MSk7CisgIFBTKEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFIoMzEpLCAweDE0MjkyOTY3KTsKKyAgUFMoQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgUigzMiksIDB4MjdCNzBBODUpOworICBQUyhILCBBLCBCLCBDLCBELCBFLCBGLCBHLCBSKDMzKSwgMHgyRTFCMjEzOCk7CisgIFBTKEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIFIoMzQpLCAweDREMkM2REZDKTsKKyAgUFMoRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgUigzNSksIDB4NTMzODBEMTMpOworICBQUyhFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBSKDM2KSwgMHg2NTBBNzM1NCk7CisgIFBTKEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIFIoMzcpLCAweDc2NkEwQUJCKTsKKyAgUFMoQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgUigzOCksIDB4ODFDMkM5MkUpOworICBQUyhCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBSKDM5KSwgMHg5MjcyMkM4NSk7CisgIFBTKEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIFIoNDApLCAweEEyQkZFOEExKTsKKyAgUFMoSCwgQSwgQiwgQywgRCwgRSwgRiwgRywgUig0MSksIDB4QTgxQTY2NEIpOworICBQUyhHLCBILCBBLCBCLCBDLCBELCBFLCBGLCBSKDQyKSwgMHhDMjRCOEI3MCk7CisgIFBTKEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIFIoNDMpLCAweEM3NkM1MUEzKTsKKyAgUFMoRSwgRiwgRywgSCwgQSwgQiwgQywgRCwgUig0NCksIDB4RDE5MkU4MTkpOworICBQUyhELCBFLCBGLCBHLCBILCBBLCBCLCBDLCBSKDQ1KSwgMHhENjk5MDYyNCk7CisgIFBTKEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIFIoNDYpLCAweEY0MEUzNTg1KTsKKyAgUFMoQiwgQywgRCwgRSwgRiwgRywgSCwgQSwgUig0NyksIDB4MTA2QUEwNzApOworICBQUyhBLCBCLCBDLCBELCBFLCBGLCBHLCBILCBSKDQ4KSwgMHgxOUE0QzExNik7CisgIFBTKEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIFIoNDkpLCAweDFFMzc2QzA4KTsKKyAgUFMoRywgSCwgQSwgQiwgQywgRCwgRSwgRiwgUig1MCksIDB4Mjc0ODc3NEMpOworICBQUyhGLCBHLCBILCBBLCBCLCBDLCBELCBFLCBSKDUxKSwgMHgzNEIwQkNCNSk7CisgIFBTKEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIFIoNTIpLCAweDM5MUMwQ0IzKTsKKyAgUFMoRCwgRSwgRiwgRywgSCwgQSwgQiwgQywgUig1MyksIDB4NEVEOEFBNEEpOworICBQUyhDLCBELCBFLCBGLCBHLCBILCBBLCBCLCBSKDU0KSwgMHg1QjlDQ0E0Rik7CisgIFBTKEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIFIoNTUpLCAweDY4MkU2RkYzKTsKKyAgUFMoQSwgQiwgQywgRCwgRSwgRiwgRywgSCwgUig1NiksIDB4NzQ4RjgyRUUpOworICBQUyhILCBBLCBCLCBDLCBELCBFLCBGLCBHLCBSKDU3KSwgMHg3OEE1NjM2Rik7CisgIFBTKEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIFIoNTgpLCAweDg0Qzg3ODE0KTsKKyAgUFMoRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgUig1OSksIDB4OENDNzAyMDgpOworICBQUyhFLCBGLCBHLCBILCBBLCBCLCBDLCBELCBSKDYwKSwgMHg5MEJFRkZGQSk7CisgIFBTKEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIFIoNjEpLCAweEE0NTA2Q0VCKTsKKyAgUFMoQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgUig2MiksIDB4QkVGOUEzRjcpOworICBQUyhCLCBDLCBELCBFLCBGLCBHLCBILCBBLCBSKDYzKSwgMHhDNjcxNzhGMik7CiAgIGN0eC0+c3RhdGVbMF0gKz0gQTsKICAgY3R4LT5zdGF0ZVsxXSArPSBCOwogICBjdHgtPnN0YXRlWzJdICs9IEM7CkBAIC0yOTMsMTMxICsyNDcsMTIgQEAKICAgY3R4LT5zdGF0ZVs3XSArPSBIOwogfQogCi12b2lkIENSWVBUX1NIQTI1NlVwZGF0ZShDUllQVF9zaGEyNTZfY29udGV4dCogY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZW5ndGgpIHsKLSAgaWYgKCFsZW5ndGgpCi0gICAgcmV0dXJuOwotCi0gIHVpbnQzMl90IGxlZnQgPSBjdHgtPnRvdGFsWzBdICYgMHgzRjsKLSAgdWludDMyX3QgZmlsbCA9IDY0IC0gbGVmdDsKLSAgY3R4LT50b3RhbFswXSArPSBsZW5ndGg7Ci0gIGN0eC0+dG90YWxbMF0gJj0gMHhGRkZGRkZGRjsKLSAgaWYgKGN0eC0+dG90YWxbMF0gPCBsZW5ndGgpIHsKLSAgICBjdHgtPnRvdGFsWzFdKys7Ci0gIH0KLSAgaWYgKGxlZnQgJiYgbGVuZ3RoID49IGZpbGwpIHsKLSAgICBGWFNZU19tZW1jcHkoKHZvaWQqKShjdHgtPmJ1ZmZlciArIGxlZnQpLCAodm9pZCopaW5wdXQsIGZpbGwpOwotICAgIHNoYTI1Nl9wcm9jZXNzKGN0eCwgY3R4LT5idWZmZXIpOwotICAgIGxlbmd0aCAtPSBmaWxsOwotICAgIGlucHV0ICs9IGZpbGw7Ci0gICAgbGVmdCA9IDA7Ci0gIH0KLSAgd2hpbGUgKGxlbmd0aCA+PSA2NCkgewotICAgIHNoYTI1Nl9wcm9jZXNzKGN0eCwgaW5wdXQpOwotICAgIGxlbmd0aCAtPSA2NDsKLSAgICBpbnB1dCArPSA2NDsKLSAgfQotICBpZiAobGVuZ3RoKSB7Ci0gICAgRlhTWVNfbWVtY3B5KCh2b2lkKikoY3R4LT5idWZmZXIgKyBsZWZ0KSwgKHZvaWQqKWlucHV0LCBsZW5ndGgpOwotICB9Ci19Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IHNoYTI1Nl9wYWRkaW5nWzY0XSA9IHsKK2NvbnN0IHVpbnQ4X3Qgc2hhMjU2X3BhZGRpbmdbNjRdID0gewogICAgIDB4ODAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiAgICAgMCwgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKICAgICAwLCAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKIAotdm9pZCBDUllQVF9TSEEyNTZGaW5pc2goQ1JZUFRfc2hhMjU2X2NvbnRleHQqIGN0eCwgdWludDhfdCBkaWdlc3RbMzJdKSB7Ci0gIHVpbnQzMl90IGxhc3QsIHBhZG47Ci0gIHVpbnQzMl90IGhpZ2gsIGxvdzsKLSAgdWludDhfdCBtc2dsZW5bOF07Ci0gIGhpZ2ggPSAoY3R4LT50b3RhbFswXSA+PiAyOSkgfCAoY3R4LT50b3RhbFsxXSA8PCAzKTsKLSAgbG93ID0gKGN0eC0+dG90YWxbMF0gPDwgMyk7Ci0gIFBVVF9VSU5UMzIoaGlnaCwgbXNnbGVuLCAwKTsKLSAgUFVUX1VJTlQzMihsb3csIG1zZ2xlbiwgNCk7Ci0gIGxhc3QgPSBjdHgtPnRvdGFsWzBdICYgMHgzRjsKLSAgcGFkbiA9IChsYXN0IDwgNTYpID8gKDU2IC0gbGFzdCkgOiAoMTIwIC0gbGFzdCk7Ci0gIENSWVBUX1NIQTI1NlVwZGF0ZShjdHgsIHNoYTI1Nl9wYWRkaW5nLCBwYWRuKTsKLSAgQ1JZUFRfU0hBMjU2VXBkYXRlKGN0eCwgbXNnbGVuLCA4KTsKLSAgUFVUX1VJTlQzMihjdHgtPnN0YXRlWzBdLCBkaWdlc3QsIDApOwotICBQVVRfVUlOVDMyKGN0eC0+c3RhdGVbMV0sIGRpZ2VzdCwgNCk7Ci0gIFBVVF9VSU5UMzIoY3R4LT5zdGF0ZVsyXSwgZGlnZXN0LCA4KTsKLSAgUFVUX1VJTlQzMihjdHgtPnN0YXRlWzNdLCBkaWdlc3QsIDEyKTsKLSAgUFVUX1VJTlQzMihjdHgtPnN0YXRlWzRdLCBkaWdlc3QsIDE2KTsKLSAgUFVUX1VJTlQzMihjdHgtPnN0YXRlWzVdLCBkaWdlc3QsIDIwKTsKLSAgUFVUX1VJTlQzMihjdHgtPnN0YXRlWzZdLCBkaWdlc3QsIDI0KTsKLSAgUFVUX1VJTlQzMihjdHgtPnN0YXRlWzddLCBkaWdlc3QsIDI4KTsKLX0KLQotdm9pZCBDUllQVF9TSEEyNTZHZW5lcmF0ZShjb25zdCB1aW50OF90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRpZ2VzdFszMl0pIHsKLSAgQ1JZUFRfc2hhMjU2X2NvbnRleHQgY3R4OwotICBDUllQVF9TSEEyNTZTdGFydCgmY3R4KTsKLSAgQ1JZUFRfU0hBMjU2VXBkYXRlKCZjdHgsIGRhdGEsIHNpemUpOwotICBDUllQVF9TSEEyNTZGaW5pc2goJmN0eCwgZGlnZXN0KTsKLX0KLQotdWludDY0X3QgRlhfYXRvNjRpKGNvbnN0IEZYX0NIQVIqIHN0cikgewotICBBU1NFUlQoc3RyKTsKLSAgdWludDY0X3QgcmV0ID0gMDsKLSAgaW50IGxlbiA9IChpbnQpRlhTWVNfc3RybGVuKHN0cik7Ci0gIGxlbiA9IGxlbiA+IDE2ID8gMTYgOiBsZW47Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKLSAgICBpZiAoaSkgewotICAgICAgcmV0IDw8PSA0OwotICAgIH0KLSAgICBpZiAoc3RyW2ldID49ICcwJyAmJiBzdHJbaV0gPD0gJzknKSB7Ci0gICAgICByZXQgfD0gKHN0cltpXSAtICcwJykgJiAweEZGOwotICAgIH0gZWxzZSBpZiAoc3RyW2ldID49ICdhJyAmJiBzdHJbaV0gPD0gJ2YnKSB7Ci0gICAgICByZXQgfD0gKHN0cltpXSAtICdhJyArIDEwKSAmIDB4RkY7Ci0gICAgfSBlbHNlIGlmIChzdHJbaV0gPj0gJ0EnICYmIHN0cltpXSA8PSAnRicpIHsKLSAgICAgIHJldCB8PSAoc3RyW2ldIC0gJ0EnICsgMTApICYgMHhGRjsKLSAgICB9IGVsc2UgewotICAgICAgQVNTRVJUKGZhbHNlKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBDUllQVF9TSEEzODRTdGFydChDUllQVF9zaGEzODRfY29udGV4dCogY3R4KSB7Ci0gIGlmICghY3R4KQotICAgIHJldHVybjsKLQotICBGWFNZU19tZW1zZXQoY3R4LCAwLCBzaXplb2YoQ1JZUFRfc2hhMzg0X2NvbnRleHQpKTsKLSAgY3R4LT5zdGF0ZVswXSA9IEZYX2F0bzY0aSgiY2JiYjlkNWRjMTA1OWVkOCIpOwotICBjdHgtPnN0YXRlWzFdID0gRlhfYXRvNjRpKCI2MjlhMjkyYTM2N2NkNTA3Iik7Ci0gIGN0eC0+c3RhdGVbMl0gPSBGWF9hdG82NGkoIjkxNTkwMTVhMzA3MGRkMTciKTsKLSAgY3R4LT5zdGF0ZVszXSA9IEZYX2F0bzY0aSgiMTUyZmVjZDhmNzBlNTkzOSIpOwotICBjdHgtPnN0YXRlWzRdID0gRlhfYXRvNjRpKCI2NzMzMjY2N2ZmYzAwYjMxIik7Ci0gIGN0eC0+c3RhdGVbNV0gPSBGWF9hdG82NGkoIjhlYjQ0YTg3Njg1ODE1MTEiKTsKLSAgY3R4LT5zdGF0ZVs2XSA9IEZYX2F0bzY0aSgiZGIwYzJlMGQ2NGY5OGZhNyIpOwotICBjdHgtPnN0YXRlWzddID0gRlhfYXRvNjRpKCI0N2I1NDgxZGJlZmE0ZmE0Iik7Ci19Ci0KLSNkZWZpbmUgU0hBMzg0X0YwKHgsIHksIHopICgoeCAmIHkpIHwgKHogJiAoeCB8IHkpKSkKLSNkZWZpbmUgU0hBMzg0X0YxKHgsIHksIHopICh6IF4gKHggJiAoeSBeIHopKSkKLSNkZWZpbmUgU0hBMzg0X1NIUih4LCBuKSAoeCA+PiBuKQotI2RlZmluZSBTSEEzODRfUk9UUih4LCBuKSAoU0hBMzg0X1NIUih4LCBuKSB8IHggPDwgKDY0IC0gbikpCi0jZGVmaW5lIFNIQTM4NF9TMCh4KSAoU0hBMzg0X1JPVFIoeCwgMSkgXiBTSEEzODRfUk9UUih4LCA4KSBeIFNIQTM4NF9TSFIoeCwgNykpCi0jZGVmaW5lIFNIQTM4NF9TMSh4KSBcCi0gIChTSEEzODRfUk9UUih4LCAxOSkgXiBTSEEzODRfUk9UUih4LCA2MSkgXiBTSEEzODRfU0hSKHgsIDYpKQotI2RlZmluZSBTSEEzODRfUzIoeCkgXAotICAoU0hBMzg0X1JPVFIoeCwgMjgpIF4gU0hBMzg0X1JPVFIoeCwgMzQpIF4gU0hBMzg0X1JPVFIoeCwgMzkpKQotI2RlZmluZSBTSEEzODRfUzMoeCkgXAotICAoU0hBMzg0X1JPVFIoeCwgMTQpIF4gU0hBMzg0X1JPVFIoeCwgMTgpIF4gU0hBMzg0X1JPVFIoeCwgNDEpKQotI2RlZmluZSBTSEEzODRfUChhLCBiLCBjLCBkLCBlLCBmLCBnLCBoLCB4LCBLKSAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0ZW1wMSA9IGggKyBTSEEzODRfUzMoZSkgKyBTSEEzODRfRjEoZSwgZiwgZykgKyBLICsgeDsgXAotICAgIHRlbXAyID0gU0hBMzg0X1MyKGEpICsgU0hBMzg0X0YwKGEsIGIsIGMpOyAgICAgICAgICAgICBcCi0gICAgZCArPSB0ZW1wMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBoID0gdGVtcDEgKyB0ZW1wMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0jZGVmaW5lIFNIQTM4NF9SKHQpIFwKLSAgKFdbdF0gPSBTSEEzODRfUzEoV1t0IC0gMl0pICsgV1t0IC0gN10gKyBTSEEzODRfUzAoV1t0IC0gMTVdKSArIFdbdCAtIDE2XSkKLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2hhMzg0X3BhZGRpbmdbMTI4XSA9IHsKK2NvbnN0IHVpbnQ4X3Qgc2hhMzg0X3BhZGRpbmdbMTI4XSA9IHsKICAgICAweDgwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAogICAgIDAsICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiAgICAgMCwgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKQEAgLTQyNiw1NSArMjYxLDM3IEBACiAgICAgMCwgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKIH07CiAKLXN0YXRpYyBjb25zdCBGWF9DSEFSKiBjb25zdGFudHNbXSA9IHsKLSAgICAiNDI4YTJmOThkNzI4YWUyMiIsICI3MTM3NDQ5MTIzZWY2NWNkIiwgImI1YzBmYmNmZWM0ZDNiMmYiLAotICAgICJlOWI1ZGJhNTgxODlkYmJjIiwgIjM5NTZjMjViZjM0OGI1MzgiLCAiNTlmMTExZjFiNjA1ZDAxOSIsCi0gICAgIjkyM2Y4MmE0YWYxOTRmOWIiLCAiYWIxYzVlZDVkYTZkODExOCIsICJkODA3YWE5OGEzMDMwMjQyIiwKLSAgICAiMTI4MzViMDE0NTcwNmZiZSIsICIyNDMxODViZTRlZTRiMjhjIiwgIjU1MGM3ZGMzZDVmZmI0ZTIiLAotICAgICI3MmJlNWQ3NGYyN2I4OTZmIiwgIjgwZGViMWZlM2IxNjk2YjEiLCAiOWJkYzA2YTcyNWM3MTIzNSIsCi0gICAgImMxOWJmMTc0Y2Y2OTI2OTQiLCAiZTQ5YjY5YzE5ZWYxNGFkMiIsICJlZmJlNDc4NjM4NGYyNWUzIiwKLSAgICAiMGZjMTlkYzY4YjhjZDViNSIsICIyNDBjYTFjYzc3YWM5YzY1IiwgIjJkZTkyYzZmNTkyYjAyNzUiLAotICAgICI0YTc0ODRhYTZlYTZlNDgzIiwgIjVjYjBhOWRjYmQ0MWZiZDQiLCAiNzZmOTg4ZGE4MzExNTNiNSIsCi0gICAgIjk4M2U1MTUyZWU2NmRmYWIiLCAiYTgzMWM2NmQyZGI0MzIxMCIsICJiMDAzMjdjODk4ZmIyMTNmIiwKLSAgICAiYmY1OTdmYzdiZWVmMGVlNCIsICJjNmUwMGJmMzNkYTg4ZmMyIiwgImQ1YTc5MTQ3OTMwYWE3MjUiLAotICAgICIwNmNhNjM1MWUwMDM4MjZmIiwgIjE0MjkyOTY3MGEwZTZlNzAiLCAiMjdiNzBhODU0NmQyMmZmYyIsCi0gICAgIjJlMWIyMTM4NWMyNmM5MjYiLCAiNGQyYzZkZmM1YWM0MmFlZCIsICI1MzM4MGQxMzlkOTViM2RmIiwKLSAgICAiNjUwYTczNTQ4YmFmNjNkZSIsICI3NjZhMGFiYjNjNzdiMmE4IiwgIjgxYzJjOTJlNDdlZGFlZTYiLAotICAgICI5MjcyMmM4NTE0ODIzNTNiIiwgImEyYmZlOGExNGNmMTAzNjQiLCAiYTgxYTY2NGJiYzQyMzAwMSIsCi0gICAgImMyNGI4YjcwZDBmODk3OTEiLCAiYzc2YzUxYTMwNjU0YmUzMCIsICJkMTkyZTgxOWQ2ZWY1MjE4IiwKLSAgICAiZDY5OTA2MjQ1NTY1YTkxMCIsICJmNDBlMzU4NTU3NzEyMDJhIiwgIjEwNmFhMDcwMzJiYmQxYjgiLAotICAgICIxOWE0YzExNmI4ZDJkMGM4IiwgIjFlMzc2YzA4NTE0MWFiNTMiLCAiMjc0ODc3NGNkZjhlZWI5OSIsCi0gICAgIjM0YjBiY2I1ZTE5YjQ4YTgiLCAiMzkxYzBjYjNjNWM5NWE2MyIsICI0ZWQ4YWE0YWUzNDE4YWNiIiwKLSAgICAiNWI5Y2NhNGY3NzYzZTM3MyIsICI2ODJlNmZmM2Q2YjJiOGEzIiwgIjc0OGY4MmVlNWRlZmIyZmMiLAotICAgICI3OGE1NjM2ZjQzMTcyZjYwIiwgIjg0Yzg3ODE0YTFmMGFiNzIiLCAiOGNjNzAyMDgxYTY0MzllYyIsCi0gICAgIjkwYmVmZmZhMjM2MzFlMjgiLCAiYTQ1MDZjZWJkZTgyYmRlOSIsICJiZWY5YTNmN2IyYzY3OTE1IiwKLSAgICAiYzY3MTc4ZjJlMzcyNTMyYiIsICJjYTI3M2VjZWVhMjY2MTljIiwgImQxODZiOGM3MjFjMGMyMDciLAotICAgICJlYWRhN2RkNmNkZTBlYjFlIiwgImY1N2Q0ZjdmZWU2ZWQxNzgiLCAiMDZmMDY3YWE3MjE3NmZiYSIsCi0gICAgIjBhNjM3ZGM1YTJjODk4YTYiLCAiMTEzZjk4MDRiZWY5MGRhZSIsICIxYjcxMGIzNTEzMWM0NzFiIiwKLSAgICAiMjhkYjc3ZjUyMzA0N2Q4NCIsICIzMmNhYWI3YjQwYzcyNDkzIiwgIjNjOWViZTBhMTVjOWJlYmMiLAotICAgICI0MzFkNjdjNDljMTAwZDRjIiwgIjRjYzVkNGJlY2IzZTQyYjYiLCAiNTk3ZjI5OWNmYzY1N2UyYSIsCi0gICAgIjVmY2I2ZmFiM2FkNmZhZWMiLCAiNmM0NDE5OGM0YTQ3NTgxNyIsCit1aW50NjRfdCBjb25zdCBjb25zdGFudHNbXSA9IHsKKyAgICAweDQyOGEyZjk4ZDcyOGFlMjJVTEwsIDB4NzEzNzQ0OTEyM2VmNjVjZFVMTCwgMHhiNWMwZmJjZmVjNGQzYjJmVUxMLAorICAgIDB4ZTliNWRiYTU4MTg5ZGJiY1VMTCwgMHgzOTU2YzI1YmYzNDhiNTM4VUxMLCAweDU5ZjExMWYxYjYwNWQwMTlVTEwsCisgICAgMHg5MjNmODJhNGFmMTk0ZjliVUxMLCAweGFiMWM1ZWQ1ZGE2ZDgxMThVTEwsIDB4ZDgwN2FhOThhMzAzMDI0MlVMTCwKKyAgICAweDEyODM1YjAxNDU3MDZmYmVVTEwsIDB4MjQzMTg1YmU0ZWU0YjI4Y1VMTCwgMHg1NTBjN2RjM2Q1ZmZiNGUyVUxMLAorICAgIDB4NzJiZTVkNzRmMjdiODk2ZlVMTCwgMHg4MGRlYjFmZTNiMTY5NmIxVUxMLCAweDliZGMwNmE3MjVjNzEyMzVVTEwsCisgICAgMHhjMTliZjE3NGNmNjkyNjk0VUxMLCAweGU0OWI2OWMxOWVmMTRhZDJVTEwsIDB4ZWZiZTQ3ODYzODRmMjVlM1VMTCwKKyAgICAweDBmYzE5ZGM2OGI4Y2Q1YjVVTEwsIDB4MjQwY2ExY2M3N2FjOWM2NVVMTCwgMHgyZGU5MmM2ZjU5MmIwMjc1VUxMLAorICAgIDB4NGE3NDg0YWE2ZWE2ZTQ4M1VMTCwgMHg1Y2IwYTlkY2JkNDFmYmQ0VUxMLCAweDc2Zjk4OGRhODMxMTUzYjVVTEwsCisgICAgMHg5ODNlNTE1MmVlNjZkZmFiVUxMLCAweGE4MzFjNjZkMmRiNDMyMTBVTEwsIDB4YjAwMzI3Yzg5OGZiMjEzZlVMTCwKKyAgICAweGJmNTk3ZmM3YmVlZjBlZTRVTEwsIDB4YzZlMDBiZjMzZGE4OGZjMlVMTCwgMHhkNWE3OTE0NzkzMGFhNzI1VUxMLAorICAgIDB4MDZjYTYzNTFlMDAzODI2ZlVMTCwgMHgxNDI5Mjk2NzBhMGU2ZTcwVUxMLCAweDI3YjcwYTg1NDZkMjJmZmNVTEwsCisgICAgMHgyZTFiMjEzODVjMjZjOTI2VUxMLCAweDRkMmM2ZGZjNWFjNDJhZWRVTEwsIDB4NTMzODBkMTM5ZDk1YjNkZlVMTCwKKyAgICAweDY1MGE3MzU0OGJhZjYzZGVVTEwsIDB4NzY2YTBhYmIzYzc3YjJhOFVMTCwgMHg4MWMyYzkyZTQ3ZWRhZWU2VUxMLAorICAgIDB4OTI3MjJjODUxNDgyMzUzYlVMTCwgMHhhMmJmZThhMTRjZjEwMzY0VUxMLCAweGE4MWE2NjRiYmM0MjMwMDFVTEwsCisgICAgMHhjMjRiOGI3MGQwZjg5NzkxVUxMLCAweGM3NmM1MWEzMDY1NGJlMzBVTEwsIDB4ZDE5MmU4MTlkNmVmNTIxOFVMTCwKKyAgICAweGQ2OTkwNjI0NTU2NWE5MTBVTEwsIDB4ZjQwZTM1ODU1NzcxMjAyYVVMTCwgMHgxMDZhYTA3MDMyYmJkMWI4VUxMLAorICAgIDB4MTlhNGMxMTZiOGQyZDBjOFVMTCwgMHgxZTM3NmMwODUxNDFhYjUzVUxMLCAweDI3NDg3NzRjZGY4ZWViOTlVTEwsCisgICAgMHgzNGIwYmNiNWUxOWI0OGE4VUxMLCAweDM5MWMwY2IzYzVjOTVhNjNVTEwsIDB4NGVkOGFhNGFlMzQxOGFjYlVMTCwKKyAgICAweDViOWNjYTRmNzc2M2UzNzNVTEwsIDB4NjgyZTZmZjNkNmIyYjhhM1VMTCwgMHg3NDhmODJlZTVkZWZiMmZjVUxMLAorICAgIDB4NzhhNTYzNmY0MzE3MmY2MFVMTCwgMHg4NGM4NzgxNGExZjBhYjcyVUxMLCAweDhjYzcwMjA4MWE2NDM5ZWNVTEwsCisgICAgMHg5MGJlZmZmYTIzNjMxZTI4VUxMLCAweGE0NTA2Y2ViZGU4MmJkZTlVTEwsIDB4YmVmOWEzZjdiMmM2NzkxNVVMTCwKKyAgICAweGM2NzE3OGYyZTM3MjUzMmJVTEwsIDB4Y2EyNzNlY2VlYTI2NjE5Y1VMTCwgMHhkMTg2YjhjNzIxYzBjMjA3VUxMLAorICAgIDB4ZWFkYTdkZDZjZGUwZWIxZVVMTCwgMHhmNTdkNGY3ZmVlNmVkMTc4VUxMLCAweDA2ZjA2N2FhNzIxNzZmYmFVTEwsCisgICAgMHgwYTYzN2RjNWEyYzg5OGE2VUxMLCAweDExM2Y5ODA0YmVmOTBkYWVVTEwsIDB4MWI3MTBiMzUxMzFjNDcxYlVMTCwKKyAgICAweDI4ZGI3N2Y1MjMwNDdkODRVTEwsIDB4MzJjYWFiN2I0MGM3MjQ5M1VMTCwgMHgzYzllYmUwYTE1YzliZWJjVUxMLAorICAgIDB4NDMxZDY3YzQ5YzEwMGQ0Y1VMTCwgMHg0Y2M1ZDRiZWNiM2U0MmI2VUxMLCAweDU5N2YyOTljZmM2NTdlMmFVTEwsCisgICAgMHg1ZmNiNmZhYjNhZDZmYWVjVUxMLCAweDZjNDQxOThjNGE0NzU4MTdVTEwsCiB9OwotI2RlZmluZSBHRVRfRlhfNjRXT1JEKG4sIGIsIGkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKG4pID0gKCh1aW50NjRfdCkoYilbKGkpXSA8PCA1NikgfCAoKHVpbnQ2NF90KShiKVsoaSkgKyAxXSA8PCA0OCkgfCAgICAgXAotICAgICAgICAgICgodWludDY0X3QpKGIpWyhpKSArIDJdIDw8IDQwKSB8ICgodWludDY0X3QpKGIpWyhpKSArIDNdIDw8IDMyKSB8IFwKLSAgICAgICAgICAoKHVpbnQ2NF90KShiKVsoaSkgKyA0XSA8PCAyNCkgfCAoKHVpbnQ2NF90KShiKVsoaSkgKyA1XSA8PCAxNikgfCBcCi0gICAgICAgICAgKCh1aW50NjRfdCkoYilbKGkpICsgNl0gPDwgOCkgfCAoKHVpbnQ2NF90KShiKVsoaSkgKyA3XSk7ICAgICAgICAgXAotICB9Ci0jZGVmaW5lIFBVVF9VSU5UNjQobiwgYiwgaSkgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChiKVsoaSldID0gKHVpbnQ4X3QpKChuKSA+PiA1Nik7ICAgICBcCi0gICAgKGIpWyhpKSArIDFdID0gKHVpbnQ4X3QpKChuKSA+PiA0OCk7IFwKLSAgICAoYilbKGkpICsgMl0gPSAodWludDhfdCkoKG4pID4+IDQwKTsgXAotICAgIChiKVsoaSkgKyAzXSA9ICh1aW50OF90KSgobikgPj4gMzIpOyBcCi0gICAgKGIpWyhpKSArIDRdID0gKHVpbnQ4X3QpKChuKSA+PiAyNCk7IFwKLSAgICAoYilbKGkpICsgNV0gPSAodWludDhfdCkoKG4pID4+IDE2KTsgXAotICAgIChiKVsoaSkgKyA2XSA9ICh1aW50OF90KSgobikgPj4gOCk7ICBcCi0gICAgKGIpWyhpKSArIDddID0gKHVpbnQ4X3QpKChuKSk7ICAgICAgIFwKLSAgfQogCi1zdGF0aWMgdm9pZCBzaGEzODRfcHJvY2VzcyhDUllQVF9zaGEzODRfY29udGV4dCogY3R4LCBjb25zdCB1aW50OF90IGRhdGFbMTI4XSkgewordm9pZCBzaGEzODRfcHJvY2VzcyhDUllQVF9zaGEyX2NvbnRleHQqIGN0eCwgY29uc3QgdWludDhfdCBkYXRhWzEyOF0pIHsKICAgdWludDY0X3QgdGVtcDEsIHRlbXAyOwogICB1aW50NjRfdCBBLCBCLCBDLCBELCBFLCBGLCBHLCBIOwogICB1aW50NjRfdCBXWzgwXTsKQEAgLTUyMywxNCArMzQwLDE0IEBACiAgICAgICB0ZW1wWzZdID0gU0hBMzg0X1IoaSAqIDggKyA2KTsKICAgICAgIHRlbXBbN10gPSBTSEEzODRfUihpICogOCArIDcpOwogICAgIH0KLSAgICBTSEEzODRfUChBLCBCLCBDLCBELCBFLCBGLCBHLCBILCB0ZW1wWzBdLCBGWF9hdG82NGkoY29uc3RhbnRzW2kgKiA4XSkpOwotICAgIFNIQTM4NF9QKEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIHRlbXBbMV0sIEZYX2F0bzY0aShjb25zdGFudHNbaSAqIDggKyAxXSkpOwotICAgIFNIQTM4NF9QKEcsIEgsIEEsIEIsIEMsIEQsIEUsIEYsIHRlbXBbMl0sIEZYX2F0bzY0aShjb25zdGFudHNbaSAqIDggKyAyXSkpOwotICAgIFNIQTM4NF9QKEYsIEcsIEgsIEEsIEIsIEMsIEQsIEUsIHRlbXBbM10sIEZYX2F0bzY0aShjb25zdGFudHNbaSAqIDggKyAzXSkpOwotICAgIFNIQTM4NF9QKEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIHRlbXBbNF0sIEZYX2F0bzY0aShjb25zdGFudHNbaSAqIDggKyA0XSkpOwotICAgIFNIQTM4NF9QKEQsIEUsIEYsIEcsIEgsIEEsIEIsIEMsIHRlbXBbNV0sIEZYX2F0bzY0aShjb25zdGFudHNbaSAqIDggKyA1XSkpOwotICAgIFNIQTM4NF9QKEMsIEQsIEUsIEYsIEcsIEgsIEEsIEIsIHRlbXBbNl0sIEZYX2F0bzY0aShjb25zdGFudHNbaSAqIDggKyA2XSkpOwotICAgIFNIQTM4NF9QKEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIHRlbXBbN10sIEZYX2F0bzY0aShjb25zdGFudHNbaSAqIDggKyA3XSkpOworICAgIFNIQTM4NF9QKEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgsIHRlbXBbMF0sIGNvbnN0YW50c1tpICogOF0pOworICAgIFNIQTM4NF9QKEgsIEEsIEIsIEMsIEQsIEUsIEYsIEcsIHRlbXBbMV0sIGNvbnN0YW50c1tpICogOCArIDFdKTsKKyAgICBTSEEzODRfUChHLCBILCBBLCBCLCBDLCBELCBFLCBGLCB0ZW1wWzJdLCBjb25zdGFudHNbaSAqIDggKyAyXSk7CisgICAgU0hBMzg0X1AoRiwgRywgSCwgQSwgQiwgQywgRCwgRSwgdGVtcFszXSwgY29uc3RhbnRzW2kgKiA4ICsgM10pOworICAgIFNIQTM4NF9QKEUsIEYsIEcsIEgsIEEsIEIsIEMsIEQsIHRlbXBbNF0sIGNvbnN0YW50c1tpICogOCArIDRdKTsKKyAgICBTSEEzODRfUChELCBFLCBGLCBHLCBILCBBLCBCLCBDLCB0ZW1wWzVdLCBjb25zdGFudHNbaSAqIDggKyA1XSk7CisgICAgU0hBMzg0X1AoQywgRCwgRSwgRiwgRywgSCwgQSwgQiwgdGVtcFs2XSwgY29uc3RhbnRzW2kgKiA4ICsgNl0pOworICAgIFNIQTM4NF9QKEIsIEMsIEQsIEUsIEYsIEcsIEgsIEEsIHRlbXBbN10sIGNvbnN0YW50c1tpICogOCArIDddKTsKICAgfQogICBjdHgtPnN0YXRlWzBdICs9IEE7CiAgIGN0eC0+c3RhdGVbMV0gKz0gQjsKQEAgLTU0MiwyMSArMzU5LDE4NSBAQAogICBjdHgtPnN0YXRlWzddICs9IEg7CiB9CiAKLXZvaWQgQ1JZUFRfU0hBMzg0VXBkYXRlKENSWVBUX3NoYTM4NF9jb250ZXh0KiBjdHgsCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBDUllQVF9TSEExU3RhcnQoQ1JZUFRfc2hhMV9jb250ZXh0KiBzKSB7CisgIFNIQV9Db3JlX0luaXQocy0+aCk7CisgIHMtPmJsa3VzZWQgPSAwOworICBzLT5sZW5oaSA9IHMtPmxlbmxvID0gMDsKK30KKwordm9pZCBDUllQVF9TSEExVXBkYXRlKENSWVBUX3NoYTFfY29udGV4dCogcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUpIHsKKyAgdW5zaWduZWQgY2hhciogcSA9ICh1bnNpZ25lZCBjaGFyKilkYXRhOworICB1bnNpZ25lZCBpbnQgd29yZGJsb2NrWzE2XTsKKyAgaW50IGxlbiA9IHNpemU7CisgIHVuc2lnbmVkIGludCBsZW53ID0gbGVuOworICBpbnQgaTsKKyAgcy0+bGVubG8gKz0gbGVudzsKKyAgcy0+bGVuaGkgKz0gKHMtPmxlbmxvIDwgbGVudyk7CisgIGlmIChzLT5ibGt1c2VkICYmIHMtPmJsa3VzZWQgKyBsZW4gPCA2NCkgeworICAgIG1lbWNweShzLT5ibG9jayArIHMtPmJsa3VzZWQsIHEsIGxlbik7CisgICAgcy0+YmxrdXNlZCArPSBsZW47CisgIH0gZWxzZSB7CisgICAgd2hpbGUgKHMtPmJsa3VzZWQgKyBsZW4gPj0gNjQpIHsKKyAgICAgIG1lbWNweShzLT5ibG9jayArIHMtPmJsa3VzZWQsIHEsIDY0IC0gcy0+YmxrdXNlZCk7CisgICAgICBxICs9IDY0IC0gcy0+YmxrdXNlZDsKKyAgICAgIGxlbiAtPSA2NCAtIHMtPmJsa3VzZWQ7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICB3b3JkYmxvY2tbaV0gPSAoKCh1bnNpZ25lZCBpbnQpcy0+YmxvY2tbaSAqIDQgKyAwXSkgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKCgodW5zaWduZWQgaW50KXMtPmJsb2NrW2kgKiA0ICsgMV0pIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgICAgICgoKHVuc2lnbmVkIGludClzLT5ibG9ja1tpICogNCArIDJdKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAgICAgICgoKHVuc2lnbmVkIGludClzLT5ibG9ja1tpICogNCArIDNdKSA8PCAwKTsKKyAgICAgIH0KKyAgICAgIFNIQVRyYW5zZm9ybShzLT5oLCB3b3JkYmxvY2spOworICAgICAgcy0+YmxrdXNlZCA9IDA7CisgICAgfQorICAgIG1lbWNweShzLT5ibG9jaywgcSwgbGVuKTsKKyAgICBzLT5ibGt1c2VkID0gbGVuOworICB9Cit9CisKK3ZvaWQgQ1JZUFRfU0hBMUZpbmlzaChDUllQVF9zaGExX2NvbnRleHQqIHMsIHVpbnQ4X3QgZGlnZXN0WzIwXSkgeworICBpbnQgaTsKKyAgaW50IHBhZDsKKyAgdW5zaWduZWQgY2hhciBjWzY0XTsKKyAgdW5zaWduZWQgaW50IGxlbmhpLCBsZW5sbzsKKyAgaWYgKHMtPmJsa3VzZWQgPj0gNTYpIHsKKyAgICBwYWQgPSA1NiArIDY0IC0gcy0+YmxrdXNlZDsKKyAgfSBlbHNlIHsKKyAgICBwYWQgPSA1NiAtIHMtPmJsa3VzZWQ7CisgIH0KKyAgbGVuaGkgPSAocy0+bGVuaGkgPDwgMykgfCAocy0+bGVubG8gPj4gKDMyIC0gMykpOworICBsZW5sbyA9IChzLT5sZW5sbyA8PCAzKTsKKyAgbWVtc2V0KGMsIDAsIHBhZCk7CisgIGNbMF0gPSAweDgwOworICBDUllQVF9TSEExVXBkYXRlKHMsIGMsIHBhZCk7CisgIGNbMF0gPSAobGVuaGkgPj4gMjQpICYgMHhGRjsKKyAgY1sxXSA9IChsZW5oaSA+PiAxNikgJiAweEZGOworICBjWzJdID0gKGxlbmhpID4+IDgpICYgMHhGRjsKKyAgY1szXSA9IChsZW5oaSA+PiAwKSAmIDB4RkY7CisgIGNbNF0gPSAobGVubG8gPj4gMjQpICYgMHhGRjsKKyAgY1s1XSA9IChsZW5sbyA+PiAxNikgJiAweEZGOworICBjWzZdID0gKGxlbmxvID4+IDgpICYgMHhGRjsKKyAgY1s3XSA9IChsZW5sbyA+PiAwKSAmIDB4RkY7CisgIENSWVBUX1NIQTFVcGRhdGUocywgYywgOCk7CisgIGZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICBkaWdlc3RbaSAqIDRdID0gKHMtPmhbaV0gPj4gMjQpICYgMHhGRjsKKyAgICBkaWdlc3RbaSAqIDQgKyAxXSA9IChzLT5oW2ldID4+IDE2KSAmIDB4RkY7CisgICAgZGlnZXN0W2kgKiA0ICsgMl0gPSAocy0+aFtpXSA+PiA4KSAmIDB4RkY7CisgICAgZGlnZXN0W2kgKiA0ICsgM10gPSAocy0+aFtpXSkgJiAweEZGOworICB9Cit9Cit2b2lkIENSWVBUX1NIQTFHZW5lcmF0ZShjb25zdCB1aW50OF90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGlnZXN0WzIwXSkgeworICBDUllQVF9zaGExX2NvbnRleHQgczsKKyAgQ1JZUFRfU0hBMVN0YXJ0KCZzKTsKKyAgQ1JZUFRfU0hBMVVwZGF0ZSgmcywgZGF0YSwgc2l6ZSk7CisgIENSWVBUX1NIQTFGaW5pc2goJnMsIGRpZ2VzdCk7Cit9Cit2b2lkIENSWVBUX1NIQTI1NlN0YXJ0KENSWVBUX3NoYTJfY29udGV4dCogY3R4KSB7CisgIGN0eC0+dG90YWxbMF0gPSAwOworICBjdHgtPnRvdGFsWzFdID0gMDsKKyAgY3R4LT5zdGF0ZVswXSA9IDB4NkEwOUU2Njc7CisgIGN0eC0+c3RhdGVbMV0gPSAweEJCNjdBRTg1OworICBjdHgtPnN0YXRlWzJdID0gMHgzQzZFRjM3MjsKKyAgY3R4LT5zdGF0ZVszXSA9IDB4QTU0RkY1M0E7CisgIGN0eC0+c3RhdGVbNF0gPSAweDUxMEU1MjdGOworICBjdHgtPnN0YXRlWzVdID0gMHg5QjA1Njg4QzsKKyAgY3R4LT5zdGF0ZVs2XSA9IDB4MUY4M0Q5QUI7CisgIGN0eC0+c3RhdGVbN10gPSAweDVCRTBDRDE5OworfQorCit2b2lkIENSWVBUX1NIQTI1NlVwZGF0ZShDUllQVF9zaGEyX2NvbnRleHQqIGN0eCwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGVuZ3RoKSB7Ci0gIHVpbnQzMl90IGxlZnQsIGZpbGw7Ci0gIGlmICghbGVuZ3RoKSB7CisgIGlmICghbGVuZ3RoKQogICAgIHJldHVybjsKLSAgfQotICBsZWZ0ID0gKHVpbnQzMl90KWN0eC0+dG90YWxbMF0gJiAweDdGOwotICBmaWxsID0gMTI4IC0gbGVmdDsKKworICB1aW50MzJfdCBsZWZ0ID0gY3R4LT50b3RhbFswXSAmIDB4M0Y7CisgIHVpbnQzMl90IGZpbGwgPSA2NCAtIGxlZnQ7CiAgIGN0eC0+dG90YWxbMF0gKz0gbGVuZ3RoOwotICBpZiAoY3R4LT50b3RhbFswXSA8IGxlbmd0aCkgeworICBjdHgtPnRvdGFsWzBdICY9IDB4RkZGRkZGRkY7CisgIGlmIChjdHgtPnRvdGFsWzBdIDwgbGVuZ3RoKQogICAgIGN0eC0+dG90YWxbMV0rKzsKLSAgfQorCiAgIGlmIChsZWZ0ICYmIGxlbmd0aCA+PSBmaWxsKSB7Ci0gICAgRlhTWVNfbWVtY3B5KCh2b2lkKikoY3R4LT5idWZmZXIgKyBsZWZ0KSwgKHZvaWQqKWlucHV0LCBmaWxsKTsKKyAgICBtZW1jcHkoY3R4LT5idWZmZXIgKyBsZWZ0LCBpbnB1dCwgZmlsbCk7CisgICAgc2hhMjU2X3Byb2Nlc3MoY3R4LCBjdHgtPmJ1ZmZlcik7CisgICAgbGVuZ3RoIC09IGZpbGw7CisgICAgaW5wdXQgKz0gZmlsbDsKKyAgICBsZWZ0ID0gMDsKKyAgfQorICB3aGlsZSAobGVuZ3RoID49IDY0KSB7CisgICAgc2hhMjU2X3Byb2Nlc3MoY3R4LCBpbnB1dCk7CisgICAgbGVuZ3RoIC09IDY0OworICAgIGlucHV0ICs9IDY0OworICB9CisgIGlmIChsZW5ndGgpCisgICAgbWVtY3B5KGN0eC0+YnVmZmVyICsgbGVmdCwgaW5wdXQsIGxlbmd0aCk7Cit9CisKK3ZvaWQgQ1JZUFRfU0hBMjU2RmluaXNoKENSWVBUX3NoYTJfY29udGV4dCogY3R4LCB1aW50OF90IGRpZ2VzdFszMl0pIHsKKyAgdWludDhfdCBtc2dsZW5bOF07CisgIHVpbnQzMl90IGhpZ2ggPSAoY3R4LT50b3RhbFswXSA+PiAyOSkgfCAoY3R4LT50b3RhbFsxXSA8PCAzKTsKKyAgdWludDMyX3QgbG93ID0gKGN0eC0+dG90YWxbMF0gPDwgMyk7CisgIFNIQV9QVVRfVUlOVDMyKGhpZ2gsIG1zZ2xlbiwgMCk7CisgIFNIQV9QVVRfVUlOVDMyKGxvdywgbXNnbGVuLCA0KTsKKyAgdWludDMyX3QgbGFzdCA9IGN0eC0+dG90YWxbMF0gJiAweDNGOworICB1aW50MzJfdCBwYWRuID0gKGxhc3QgPCA1NikgPyAoNTYgLSBsYXN0KSA6ICgxMjAgLSBsYXN0KTsKKyAgQ1JZUFRfU0hBMjU2VXBkYXRlKGN0eCwgc2hhMjU2X3BhZGRpbmcsIHBhZG4pOworICBDUllQVF9TSEEyNTZVcGRhdGUoY3R4LCBtc2dsZW4sIDgpOworICBTSEFfUFVUX1VJTlQzMihjdHgtPnN0YXRlWzBdLCBkaWdlc3QsIDApOworICBTSEFfUFVUX1VJTlQzMihjdHgtPnN0YXRlWzFdLCBkaWdlc3QsIDQpOworICBTSEFfUFVUX1VJTlQzMihjdHgtPnN0YXRlWzJdLCBkaWdlc3QsIDgpOworICBTSEFfUFVUX1VJTlQzMihjdHgtPnN0YXRlWzNdLCBkaWdlc3QsIDEyKTsKKyAgU0hBX1BVVF9VSU5UMzIoY3R4LT5zdGF0ZVs0XSwgZGlnZXN0LCAxNik7CisgIFNIQV9QVVRfVUlOVDMyKGN0eC0+c3RhdGVbNV0sIGRpZ2VzdCwgMjApOworICBTSEFfUFVUX1VJTlQzMihjdHgtPnN0YXRlWzZdLCBkaWdlc3QsIDI0KTsKKyAgU0hBX1BVVF9VSU5UMzIoY3R4LT5zdGF0ZVs3XSwgZGlnZXN0LCAyOCk7Cit9CisKK3ZvaWQgQ1JZUFRfU0hBMjU2R2VuZXJhdGUoY29uc3QgdWludDhfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBkaWdlc3RbMzJdKSB7CisgIENSWVBUX3NoYTJfY29udGV4dCBjdHg7CisgIENSWVBUX1NIQTI1NlN0YXJ0KCZjdHgpOworICBDUllQVF9TSEEyNTZVcGRhdGUoJmN0eCwgZGF0YSwgc2l6ZSk7CisgIENSWVBUX1NIQTI1NkZpbmlzaCgmY3R4LCBkaWdlc3QpOworfQorCit2b2lkIENSWVBUX1NIQTM4NFN0YXJ0KENSWVBUX3NoYTJfY29udGV4dCogY3R4KSB7CisgIGlmICghY3R4KQorICAgIHJldHVybjsKKworICBtZW1zZXQoY3R4LCAwLCBzaXplb2YoQ1JZUFRfc2hhMl9jb250ZXh0KSk7CisgIGN0eC0+c3RhdGVbMF0gPSAweGNiYmI5ZDVkYzEwNTllZDhVTEw7CisgIGN0eC0+c3RhdGVbMV0gPSAweDYyOWEyOTJhMzY3Y2Q1MDdVTEw7CisgIGN0eC0+c3RhdGVbMl0gPSAweDkxNTkwMTVhMzA3MGRkMTdVTEw7CisgIGN0eC0+c3RhdGVbM10gPSAweDE1MmZlY2Q4ZjcwZTU5MzlVTEw7CisgIGN0eC0+c3RhdGVbNF0gPSAweDY3MzMyNjY3ZmZjMDBiMzFVTEw7CisgIGN0eC0+c3RhdGVbNV0gPSAweDhlYjQ0YTg3Njg1ODE1MTFVTEw7CisgIGN0eC0+c3RhdGVbNl0gPSAweGRiMGMyZTBkNjRmOThmYTdVTEw7CisgIGN0eC0+c3RhdGVbN10gPSAweDQ3YjU0ODFkYmVmYTRmYTRVTEw7Cit9CisKK3ZvaWQgQ1JZUFRfU0hBMzg0VXBkYXRlKENSWVBUX3NoYTJfY29udGV4dCogY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZW5ndGgpIHsKKyAgaWYgKCFsZW5ndGgpCisgICAgcmV0dXJuOworCisgIHVpbnQzMl90IGxlZnQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY3R4LT50b3RhbFswXSkgJiAweDdGOworICB1aW50MzJfdCBmaWxsID0gMTI4IC0gbGVmdDsKKyAgY3R4LT50b3RhbFswXSArPSBsZW5ndGg7CisgIGlmIChjdHgtPnRvdGFsWzBdIDwgbGVuZ3RoKQorICAgIGN0eC0+dG90YWxbMV0rKzsKKworICBpZiAobGVmdCAmJiBsZW5ndGggPj0gZmlsbCkgeworICAgIG1lbWNweShjdHgtPmJ1ZmZlciArIGxlZnQsIGlucHV0LCBmaWxsKTsKICAgICBzaGEzODRfcHJvY2VzcyhjdHgsIGN0eC0+YnVmZmVyKTsKICAgICBsZW5ndGggLT0gZmlsbDsKICAgICBpbnB1dCArPSBmaWxsOwpAQCAtNTY3LDE1ICs1NDgsMTQgQEAKICAgICBsZW5ndGggLT0gMTI4OwogICAgIGlucHV0ICs9IDEyODsKICAgfQotICBpZiAobGVuZ3RoKSB7Ci0gICAgRlhTWVNfbWVtY3B5KCh2b2lkKikoY3R4LT5idWZmZXIgKyBsZWZ0KSwgKHZvaWQqKWlucHV0LCBsZW5ndGgpOwotICB9CisgIGlmIChsZW5ndGgpCisgICAgbWVtY3B5KGN0eC0+YnVmZmVyICsgbGVmdCwgaW5wdXQsIGxlbmd0aCk7CiB9CiAKLXZvaWQgQ1JZUFRfU0hBMzg0RmluaXNoKENSWVBUX3NoYTM4NF9jb250ZXh0KiBjdHgsIHVpbnQ4X3QgZGlnZXN0WzQ4XSkgewordm9pZCBDUllQVF9TSEEzODRGaW5pc2goQ1JZUFRfc2hhMl9jb250ZXh0KiBjdHgsIHVpbnQ4X3QgZGlnZXN0WzQ4XSkgewogICB1aW50MzJfdCBsYXN0LCBwYWRuOwogICB1aW50OF90IG1zZ2xlblsxNl07Ci0gIEZYU1lTX21lbXNldChtc2dsZW4sIDAsIDE2KTsKKyAgbWVtc2V0KG1zZ2xlbiwgMCwgMTYpOwogICB1aW50NjRfdCBoaWdoLCBsb3c7CiAgIGhpZ2ggPSAoY3R4LT50b3RhbFswXSA+PiAyOSkgfCAoY3R4LT50b3RhbFsxXSA8PCAzKTsKICAgbG93ID0gKGN0eC0+dG90YWxbMF0gPDwgMyk7CkBAIC01OTYsMzggKzU3NiwzNyBAQAogdm9pZCBDUllQVF9TSEEzODRHZW5lcmF0ZShjb25zdCB1aW50OF90KiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRpZ2VzdFs2NF0pIHsKLSAgQ1JZUFRfc2hhMzg0X2NvbnRleHQgY29udGV4dDsKKyAgQ1JZUFRfc2hhMl9jb250ZXh0IGNvbnRleHQ7CiAgIENSWVBUX1NIQTM4NFN0YXJ0KCZjb250ZXh0KTsKICAgQ1JZUFRfU0hBMzg0VXBkYXRlKCZjb250ZXh0LCBkYXRhLCBzaXplKTsKICAgQ1JZUFRfU0hBMzg0RmluaXNoKCZjb250ZXh0LCBkaWdlc3QpOwogfQogCi12b2lkIENSWVBUX1NIQTUxMlN0YXJ0KHZvaWQqIGNvbnRleHQpIHsKLSAgaWYgKCFjb250ZXh0KSB7Cit2b2lkIENSWVBUX1NIQTUxMlN0YXJ0KENSWVBUX3NoYTJfY29udGV4dCogY3R4KSB7CisgIGlmICghY3R4KQogICAgIHJldHVybjsKLSAgfQotICBDUllQVF9zaGEzODRfY29udGV4dCogY3R4ID0gKENSWVBUX3NoYTM4NF9jb250ZXh0Kiljb250ZXh0OwotICBGWFNZU19tZW1zZXQoY3R4LCAwLCBzaXplb2YoQ1JZUFRfc2hhMzg0X2NvbnRleHQpKTsKLSAgY3R4LT5zdGF0ZVswXSA9IEZYX2F0bzY0aSgiNmEwOWU2NjdmM2JjYzkwOCIpOwotICBjdHgtPnN0YXRlWzFdID0gRlhfYXRvNjRpKCJiYjY3YWU4NTg0Y2FhNzNiIik7Ci0gIGN0eC0+c3RhdGVbMl0gPSBGWF9hdG82NGkoIjNjNmVmMzcyZmU5NGY4MmIiKTsKLSAgY3R4LT5zdGF0ZVszXSA9IEZYX2F0bzY0aSgiYTU0ZmY1M2E1ZjFkMzZmMSIpOwotICBjdHgtPnN0YXRlWzRdID0gRlhfYXRvNjRpKCI1MTBlNTI3ZmFkZTY4MmQxIik7Ci0gIGN0eC0+c3RhdGVbNV0gPSBGWF9hdG82NGkoIjliMDU2ODhjMmIzZTZjMWYiKTsKLSAgY3R4LT5zdGF0ZVs2XSA9IEZYX2F0bzY0aSgiMWY4M2Q5YWJmYjQxYmQ2YiIpOwotICBjdHgtPnN0YXRlWzddID0gRlhfYXRvNjRpKCI1YmUwY2QxOTEzN2UyMTc5Iik7CisKKyAgbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKENSWVBUX3NoYTJfY29udGV4dCkpOworICBjdHgtPnN0YXRlWzBdID0gMHg2YTA5ZTY2N2YzYmNjOTA4VUxMOworICBjdHgtPnN0YXRlWzFdID0gMHhiYjY3YWU4NTg0Y2FhNzNiVUxMOworICBjdHgtPnN0YXRlWzJdID0gMHgzYzZlZjM3MmZlOTRmODJiVUxMOworICBjdHgtPnN0YXRlWzNdID0gMHhhNTRmZjUzYTVmMWQzNmYxVUxMOworICBjdHgtPnN0YXRlWzRdID0gMHg1MTBlNTI3ZmFkZTY4MmQxVUxMOworICBjdHgtPnN0YXRlWzVdID0gMHg5YjA1Njg4YzJiM2U2YzFmVUxMOworICBjdHgtPnN0YXRlWzZdID0gMHgxZjgzZDlhYmZiNDFiZDZiVUxMOworICBjdHgtPnN0YXRlWzddID0gMHg1YmUwY2QxOTEzN2UyMTc5VUxMOwogfQogCi12b2lkIENSWVBUX1NIQTUxMlVwZGF0ZSh2b2lkKiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBkYXRhLCB1aW50MzJfdCBzaXplKSB7Ci0gIENSWVBUX3NoYTM4NF9jb250ZXh0KiBjdHggPSAoQ1JZUFRfc2hhMzg0X2NvbnRleHQqKWNvbnRleHQ7Cit2b2lkIENSWVBUX1NIQTUxMlVwZGF0ZShDUllQVF9zaGEyX2NvbnRleHQqIGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplKSB7CiAgIENSWVBUX1NIQTM4NFVwZGF0ZShjdHgsIGRhdGEsIHNpemUpOwogfQogCi12b2lkIENSWVBUX1NIQTUxMkZpbmlzaCh2b2lkKiBjb250ZXh0LCB1aW50OF90IGRpZ2VzdFs2NF0pIHsKLSAgQ1JZUFRfc2hhMzg0X2NvbnRleHQqIGN0eCA9IChDUllQVF9zaGEzODRfY29udGV4dCopY29udGV4dDsKK3ZvaWQgQ1JZUFRfU0hBNTEyRmluaXNoKENSWVBUX3NoYTJfY29udGV4dCogY3R4LCB1aW50OF90IGRpZ2VzdFs2NF0pIHsKICAgdWludDMyX3QgbGFzdCwgcGFkbjsKICAgdWludDhfdCBtc2dsZW5bMTZdOwotICBGWFNZU19tZW1zZXQobXNnbGVuLCAwLCAxNik7CisgIG1lbXNldChtc2dsZW4sIDAsIDE2KTsKICAgdWludDY0X3QgaGlnaCwgbG93OwogICBoaWdoID0gKGN0eC0+dG90YWxbMF0gPj4gMjkpIHwgKGN0eC0+dG90YWxbMV0gPDwgMyk7CiAgIGxvdyA9IChjdHgtPnRvdGFsWzBdIDw8IDMpOwpAQCAtNjUwLDEyICs2MjksOCBAQAogdm9pZCBDUllQVF9TSEE1MTJHZW5lcmF0ZShjb25zdCB1aW50OF90KiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRpZ2VzdFs2NF0pIHsKLSAgQ1JZUFRfc2hhMzg0X2NvbnRleHQgY29udGV4dDsKKyAgQ1JZUFRfc2hhMl9jb250ZXh0IGNvbnRleHQ7CiAgIENSWVBUX1NIQTUxMlN0YXJ0KCZjb250ZXh0KTsKICAgQ1JZUFRfU0hBNTEyVXBkYXRlKCZjb250ZXh0LCBkYXRhLCBzaXplKTsKICAgQ1JZUFRfU0hBNTEyRmluaXNoKCZjb250ZXh0LCBkaWdlc3QpOwogfQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX07Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvZmRybS9jcnlwdG8vZnhfY3J5cHRfdW5pdHRlc3QuY3BwIGIvY29yZS9mZHJtL2NyeXB0by9meF9jcnlwdF91bml0dGVzdC5jcHAKaW5kZXggNGUzZGE2ZS4uZTdmMDViMiAxMDA2NDQKLS0tIGEvY29yZS9mZHJtL2NyeXB0by9meF9jcnlwdF91bml0dGVzdC5jcHAKKysrIGIvY29yZS9mZHJtL2NyeXB0by9meF9jcnlwdF91bml0dGVzdC5jcHAKQEAgLTksMzYgKzksMzMgQEAKICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c3RyaW5nPgogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy90ZXN0X3N1cHBvcnQuaCIKIAogbmFtZXNwYWNlIHsKIAotc3RkOjpzdHJpbmcgQ1JZUFRfVG9CYXNlMTYoY29uc3QgdWludDhfdCogZGlnZXN0KSB7Ci0gIHN0YXRpYyBjaGFyIGNvbnN0IHpFbmNvZGVbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKLSAgc3RkOjpzdHJpbmcgcmV0OwotICByZXQucmVzaXplKDMyKTsKLSAgZm9yIChpbnQgaSA9IDAsIGogPSAwOyBpIDwgMTY7IGkrKywgaiArPSAyKSB7Ci0gICAgdWludDhfdCBhID0gZGlnZXN0W2ldOwotICAgIHJldFtqXSA9IHpFbmNvZGVbKGEgPj4gNCkgJiAweGZdOwotICAgIHJldFtqICsgMV0gPSB6RW5jb2RlW2EgJiAweGZdOwotICB9Ci0gIHJldHVybiByZXQ7CitzdGQ6OnN0cmluZyBDUllQVF9NRDVTdHJpbmcoY29uc3QgY2hhciogc3RyKSB7CisgIHJldHVybiBHZW5lcmF0ZU1ENUJhc2UxNihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihzdHIpLCBzdHJsZW4oc3RyKSk7CiB9CiAKLXN0ZDo6c3RyaW5nIENSWVBUX01ENVN0cmluZyhjb25zdCBjaGFyKiBzdHIpIHsKLSAgdWludDhfdCBkaWdlc3RbMTZdOwotICBDUllQVF9NRDVHZW5lcmF0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihzdHIpLCBzdHJsZW4oc3RyKSwgZGlnZXN0KTsKLSAgcmV0dXJuIENSWVBUX1RvQmFzZTE2KGRpZ2VzdCk7Cit2b2lkIENoZWNrQXJjRm91ckNvbnRleHQoY29uc3QgQ1JZUFRfcmM0X2NvbnRleHQmIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBleHBlY3RlZF94LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXhwZWN0ZWRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBleHBlY3RlZF9wZXJtdXRhdGlvbikgeworICBFWFBFQ1RfRVEoZXhwZWN0ZWRfeCwgY29udGV4dC54KTsKKyAgRVhQRUNUX0VRKGV4cGVjdGVkX3ksIGNvbnRleHQueSk7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtSQzRDb250ZXh0UGVybXV0YXRpb25MZW5ndGg7ICsraSkKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfcGVybXV0YXRpb25baV0sIGNvbnRleHQubVtpXSkgPDwgaTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCiAKLVRFU1QoRlhDUllQVCwgQ1JZUFRfVG9CYXNlMTYpIHsKK1RFU1QoRlhDUllQVCwgQ3J5cHRUb0Jhc2UxNikgewogICB1aW50OF90IGRhdGFbXSA9IHsweGQ0LCAweDFkLCAweDhjLCAweGQ5LCAweDhmLCAweDAwLCAweGIyLCAweDA0LAogICAgICAgICAgICAgICAgICAgICAweGU5LCAweDgwLCAweDA5LCAweDk4LCAweGVjLCAweGY4LCAweDQyLCAweDdlfTsKIAotICBzdGQ6OnN0cmluZyBhY3R1YWwgPSBDUllQVF9Ub0Jhc2UxNihkYXRhKTsKKyAgc3RkOjpzdHJpbmcgYWN0dWFsID0gQ3J5cHRUb0Jhc2UxNihkYXRhKTsKICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQgPSAiZDQxZDhjZDk4ZjAwYjIwNGU5ODAwOTk4ZWNmODQyN2UiOwogCiAgIEVYUEVDVF9FUShleHBlY3RlZCwgYWN0dWFsKTsKQEAgLTE5NCw3ICsxOTEsNyBAQAogICB1aW50OF90IGRpZ2VzdFsxNl07CiAgIENSWVBUX01ENUZpbmlzaCgmY3R4LCBkaWdlc3QpOwogCi0gIHN0ZDo6c3RyaW5nIGFjdHVhbCA9IENSWVBUX1RvQmFzZTE2KGRpZ2VzdCk7CisgIHN0ZDo6c3RyaW5nIGFjdHVhbCA9IENyeXB0VG9CYXNlMTYoZGlnZXN0KTsKICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQgPSAiOTAwMTUwOTgzY2QyNGZiMGQ2OTYzZjdkMjhlMTdmNzIiOwogICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIGFjdHVhbCk7CiB9CkBAIC0yMjcsMyArMjI0LDI4MCBAQAogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDMyOyArK2kpCiAgICAgRVhQRUNUX0VRKGV4cGVjdGVkW2ldLCBhY3R1YWxbaV0pIDw8ICIgYXQgYnl0ZSAiIDw8IGk7CiB9CisKK1RFU1QoRlhDUllQVCwgQ1JZUFRfQXJjRm91clNldHVwKSB7CisgIHsKKyAgICBjb25zdCB1aW50OF90IGtOdWxsUGVybXV0YXRpb25ba1JDNENvbnRleHRQZXJtdXRhdGlvbkxlbmd0aF0gPSB7CisgICAgICAgIDAsICAgMzUsICAzLCAgIDQzLCAgOSwgICAxMSwgIDY1LCAgMjI5LCAzMiwgIDM2LCAgMTM0LCA5OCwgIDU5LCAgMzQsCisgICAgICAgIDE3MywgMTUzLCAyMTQsIDIwMCwgNjQsICAxNjEsIDE5MSwgNjIsICA2LCAgIDI1LCAgNTYsICAyMzQsIDQ5LCAgMjQ2LAorICAgICAgICA2OSwgIDEzMywgMjAzLCAxOTQsIDEwLCAgNDIsICAyMjgsIDE5OCwgMTk1LCAyNDUsIDIzNiwgOTEsICAyMDYsIDIzLAorICAgICAgICAyMzUsIDI3LCAgMTM4LCAxOCwgIDE0MywgMjUwLCAyNDQsIDc2LCAgMTIzLCAyMTcsIDEzMiwgMjQ5LCA3MiwgIDEyNywKKyAgICAgICAgOTQsICAxNTEsIDMzLCAgNjAsICAyNDgsIDg1LCAgMTc3LCAyMTAsIDE0MiwgODMsICAxMTAsIDE0MCwgNDEsICAxMzUsCisgICAgICAgIDE5NiwgMjM4LCAxNTYsIDI0MiwgMTQxLCA2NywgIDUsICAgMTg1LCAxMzEsIDYzLCAgMTM3LCAzNywgIDE3MiwgMTIxLAorICAgICAgICA3MCwgIDE0NCwgMjM3LCAxMzAsIDE3LCAgNDQsICAyNTMsIDE2NiwgNzgsICAyMDEsIDEyLCAgMTE5LCAyMTUsIDcsCisgICAgICAgIDEyNiwgMTE0LCA5NywgIDE5MiwgNTMsICA0LCAgIDI1NCwgNDUsICAxMDIsIDEyMiwgMjMwLCA4OCwgIDE5MywgMTI5LAorICAgICAgICAxNjAsIDEyNCwgODQsICAxMDgsIDIzOSwgMTg5LCAxNTIsIDEyMCwgMTE1LCAyMDcsIDUwLCAgMTc2LCA4NiwgIDE1NywKKyAgICAgICAgMTY0LCAxODcsIDcxLCAgMSwgICAxNSwgIDU4LCAgMjksICAyMSwgIDQ2LCAgMTQ1LCAyNDcsIDE2MiwgOTUsICAxODMsCisgICAgICAgIDEzLCAgMjI2LCAxNTksIDE3NSwgMjIxLCAxMDAsIDk2LCAgMjAyLCAxMDEsIDE3OCwgMTU0LCA0NywgIDIwNSwgMTA2LAorICAgICAgICAxNDgsIDEwNCwgOTMsICAxMTIsIDI2LCAgMTY1LCAxMjgsIDE4NiwgMTQ2LCAyMTgsIDY2LCAgMjExLCAxNzEsIDkwLAorICAgICAgICAyNTIsIDE5LCAgNDAsICA5OSwgIDIyMywgMTc0LCAyNTUsIDUxLCAgNzcsICAyMjcsIDQ4LCAgMjIwLCAxNjgsIDExOCwKKyAgICAgICAgMjI0LCAxMDMsIDc1LCAgMTA1LCAxMjUsIDE5OSwgNzMsICA4MiwgIDU3LCAgMTgxLCA4MSwgIDE0OSwgNjgsICA1MiwKKyAgICAgICAgMjMyLCAyMiwgIDIsICAgMjE2LCAxMTMsIDMwLCAgMTA5LCAxNjMsIDkyLCAgNjEsICAxNCwgIDgsICAgMzgsICAyMjUsCisgICAgICAgIDc5LCAgMjMxLCAxNzAsIDI0MCwgMjAsICAyMTksIDIwNCwgMTUwLCAxODAsIDE4OCwgMTE2LCAxOTAsIDI0MSwgMTk3LAorICAgICAgICAxNzksIDg3LCAgNzQsICAxNDcsIDgwLCAgNTQsICAyMTIsIDE2LCAgMTY3LCAyMjIsIDEzNiwgMjEzLCA1NSwgIDE4MiwKKyAgICAgICAgMTM5LCAyNCwgIDIwOSwgMjUxLCAyMDgsIDI4LCAgMTExLCA4OSwgIDE1OCwgMTU1LCAyNDMsIDEwNywgMjMzLCAxNjksCisgICAgICAgIDExNywgMTg0LCAzMSwgIDM5fTsKKyAgICBDUllQVF9yYzRfY29udGV4dCBjb250ZXh0OworICAgIENSWVBUX0FyY0ZvdXJTZXR1cCgmY29udGV4dCwgbnVsbHB0ciwgMCk7CisgICAgQ2hlY2tBcmNGb3VyQ29udGV4dChjb250ZXh0LCAwLCAwLCBrTnVsbFBlcm11dGF0aW9uKTsKKyAgfQorICB7CisgICAgY29uc3QgdWludDhfdCBrRm9vYmFyUGVybXV0YXRpb25ba1JDNENvbnRleHRQZXJtdXRhdGlvbkxlbmd0aF0gPSB7CisgICAgICAgIDEwMiwgMjE0LCAzOSwgIDQ5LCAgMTcsICAxMzIsIDI0NCwgMTA2LCAxMTQsIDc2LCAgMTgzLCAyMTIsIDExNiwgNzMsCisgICAgICAgIDQyLCAgMTAzLCAxMjgsIDI0NiwgMTM5LCAxOTksIDMxLCAgMjM0LCAyNSwgIDEwOSwgNDgsICAxOSwgIDEyMSwgNCwKKyAgICAgICAgMjAsICA1NCwgIDEzNCwgNzcsICAxNjMsIDM4LCAgNjEsICAxMDEsIDE0NSwgNzgsICAyMTUsIDk2LCAgOTIsICA4MCwKKyAgICAgICAgMjI0LCAxNjgsIDI0MywgMjEwLCA4MiwgIDI1MiwgMTEzLCA1NiwgIDIxNywgNjIsICAyMTgsIDEyOSwgMTI1LCAzMywKKyAgICAgICAgOTksICA5LCAgIDE1MywgNTksICA0MywgIDEzLCAgMjA2LCAxMjQsIDEzMSwgMTgsICAyMTMsIDExOCwgMTczLCAxMjIsCisgICAgICAgIDE5MywgMTcyLCAxNzcsIDEwNSwgMTQ4LCAyMDcsIDE4NiwgNSwgICA4NSwgIDMyLCAgNjgsICAyMjAsIDc5LCAgODQsCisgICAgICAgIDE2OSwgMjA5LCAxNTAsIDcsICAgMTMzLCA2MywgIDE0NywgOTMsICAyNiwgIDEzMCwgNjAsICAxMTcsIDI1MCwgNTcsCisgICAgICAgIDI0LCAgMjQ3LCAyMDAsIDEyNywgMTM2LCA2NiwgIDExMiwgMTA3LCAxNDAsIDE1NCwgNzAsICAxNzAsIDE4NSwgMTM4LAorICAgICAgICAyNDgsIDIzNiwgODgsICA4NiwgIDQ0LCAgMjE2LCAyNDEsIDM1LCAgMTAwLCAxNTEsIDE1NiwgNzQsICAxMTksIDU1LAorICAgICAgICAyNDUsIDQ2LCAgMjI3LCAyMDgsIDIyOSwgMTYsICAyNDksIDE0OSwgNTMsICAxNTcsIDIwMSwgNzUsICA1OCwgIDI4LAorICAgICAgICAxNDIsIDIzOCwgMTgyLCAxODAsIDE3OSwgMTQ0LCAxMiwgIDYsICAgMTc2LCAxMCwgIDkwLCAgMjM5LCAxMDQsIDQwLAorICAgICAgICAxODEsIDE5NCwgMTM3LCA2OSwgIDIyMSwgMjA1LCAxNjUsIDE4OCwgMTkxLCA4NywgIDEsICAgOTEsICAyLCAgIDE3MSwKKyAgICAgICAgMjMyLCAzNCwgIDE2MiwgMTY2LCAxNjAsIDEyNiwgMjI1LCAxNjcsIDEyMywgMTk3LCAyMjMsIDE5NSwgMjIsICAyMDMsCisgICAgICAgIDE4OSwgMjM3LCAzNywgIDI3LCAgMjIyLCAxNzUsIDIzLCAgMTQzLCAxNTIsIDE5MiwgMjEsICAyMzEsIDIyOCwgMTQxLAorICAgICAgICAzMCwgIDIwNCwgMTU4LCAyNDAsIDEyMCwgOTgsICA4OSwgIDgzLCAgMTM1LCAyNTEsIDgxLCAgMTk2LCAxNjEsIDMsCisgICAgICAgIDgsICAgMjMwLCA1MiwgIDIxOSwgNDEsICAyNDIsIDM2LCAgOTcsICAxNSwgIDE1NSwgNjUsICAxODcsIDI1NCwgNjQsCisgICAgICAgIDE1OSwgNjcsICAyMTEsIDEwOCwgMTc4LCAxNDYsIDIwMiwgMTEsICAxNjQsIDIyNiwgMTg0LCA1MCwgIDE5MCwgMTc0LAorICAgICAgICA3MSwgIDIzMywgMjM1LCAxOTgsIDk1LCAgNTEsICAxMTAsIDI1NSwgMjUzLCA3MiwgIDExNSwgMCwgICA0NywgIDk0LAorICAgICAgICAyOSwgIDQ1LCAgMTQsICAxMTF9OworICAgIENSWVBUX3JjNF9jb250ZXh0IGNvbnRleHQ7CisgICAgY29uc3QgdWludDhfdCBrRm9vQmFyW10gPSAiZm9vYmFyIjsKKyAgICBDUllQVF9BcmNGb3VyU2V0dXAoJmNvbnRleHQsIGtGb29CYXIsIEZYX0FycmF5U2l6ZShrRm9vQmFyKSAtIDEpOworICAgIENoZWNrQXJjRm91ckNvbnRleHQoY29udGV4dCwgMCwgMCwga0Zvb2JhclBlcm11dGF0aW9uKTsKKyAgfQorfQorCitURVNUKEZYQ1JZUFQsIENSWVBUX0FyY0ZvdXJDcnlwdCkgeworICBjb25zdCB1aW50OF90IGtEYXRhU2hvcnRbXSA9ICJUaGUgUXVpY2sgRm94IEp1bXBlZCBPdmVyIFRoZSBMYXp5IEJyb3duIERvZy4iOworICBjb25zdCB1aW50OF90IGtEYXRhTG9uZ1tdID0KKyAgICAgICJUaGUgUXVpY2sgRm94IEp1bXBlZCBPdmVyIFRoZSBMYXp5IEJyb3duIERvZy5cbiIKKyAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwXG4iCisgICAgICAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MFxuIgorICAgICAgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpcbiIKKyAgICAgICIhQCMkJV4mKigpW117fTsnOlwiLC48Pi8/XFx8XHJcdFxuIjsKKyAgeworICAgIENSWVBUX3JjNF9jb250ZXh0IGNvbnRleHQ7CisgICAgQ1JZUFRfQXJjRm91clNldHVwKCZjb250ZXh0LCBudWxscHRyLCAwKTsKKworICAgIHVpbnQ4X3QgZGF0YV9zaG9ydFtGWF9BcnJheVNpemUoa0RhdGFTaG9ydCldOworICAgIG1lbWNweShkYXRhX3Nob3J0LCBrRGF0YVNob3J0LCBGWF9BcnJheVNpemUoa0RhdGFTaG9ydCkpOworICAgIGNvbnN0IHVpbnQ4X3Qga0V4cGVjdGVkRW5jcnlwdGVkRGF0YVNob3J0W10gPSB7CisgICAgICAgIDEzOCwgMTEyLCAyMzYsIDk3LCAgMjQyLCA2NiwgIDUyLCAgODksICAyMjUsIDM4LCAgODgsICA4LAorICAgICAgICA0NywgIDc4LCAgMjE2LCAyNCwgIDE3MCwgMTA2LCAyNiwgIDE5OSwgMjA4LCAxMzEsIDE1NywgMjQyLAorICAgICAgICA1NSwgIDExLCAgMjUsICA5MCwgIDY2LCAgMTgyLCAxOSwgIDI1NSwgMjEwLCAxODEsIDg1LCAgNjksCisgICAgICAgIDMxLCAgMjQwLCAyMDYsIDE3MSwgOTcsICA2MiwgIDIwMiwgMTcyLCAzMCwgIDI1Mn07CisgICAgc3RhdGljX2Fzc2VydCgKKyAgICAgICAgRlhfQXJyYXlTaXplKGtFeHBlY3RlZEVuY3J5cHRlZERhdGFTaG9ydCkgPT0gRlhfQXJyYXlTaXplKGRhdGFfc2hvcnQpLAorICAgICAgICAiZGF0YV9zaG9ydCBtaXNtYXRjaCIpOworICAgIENSWVBUX0FyY0ZvdXJDcnlwdCgmY29udGV4dCwgZGF0YV9zaG9ydCwgRlhfQXJyYXlTaXplKGRhdGFfc2hvcnQpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShkYXRhX3Nob3J0KTsgKytpKQorICAgICAgRVhQRUNUX0VRKGtFeHBlY3RlZEVuY3J5cHRlZERhdGFTaG9ydFtpXSwgZGF0YV9zaG9ydFtpXSkgPDwgaTsKKworICAgIGNvbnN0IHVpbnQ4X3Qga1Blcm11dGF0aW9uW2tSQzRDb250ZXh0UGVybXV0YXRpb25MZW5ndGhdID0geworICAgICAgICAwLCAgIDE5OCwgMTAsICAzNywgIDI1MywgMTkyLCAxNzEsIDE4MywgOTksICA4LCAgIDE0NCwgMTAzLCAyMDgsIDE5MSwKKyAgICAgICAgMTQ5LCA5LCAgIDIyOCwgMjQzLCA5NCwgIDE1MCwgMTY5LCAxNTEsIDIxMCwgMjA2LCAyMjEsIDIzNSwgMzIsICAxODYsCisgICAgICAgIDIxMiwgMTIyLCA3MiwgIDIwMCwgMjM2LCAxMzgsIDI0NCwgMjE3LCAxNTgsIDIxMywgMTM5LCAyNDIsIDE3LCAgMTQzLAorICAgICAgICA1MCwgIDEzMiwgMTIsICAxNjAsIDE0NSwgMjUwLCAyMTQsIDc2LCAgMTIzLCAzNSwgIDI3LCAgMjQ5LCAyMDMsIDEyNywKKyAgICAgICAgNjQsICA2MiwgIDMzLCAgNjAsICAyNDgsIDg1LCAgMTc3LCA2LCAgIDE0MiwgODMsICAxMTAsIDE0MCwgNDEsICAxMzUsCisgICAgICAgIDE5NiwgMjM4LCAxNTYsIDkxLCAgMTQxLCA2NywgIDUsICAgMTg1LCAxMzEsIDYzLCAgMTM3LCA0MywgIDE3MiwgMTIxLAorICAgICAgICA3MCwgIDEzNCwgMjM3LCAxMzAsIDI1LCAgNDQsICAxNTMsIDE2NiwgNzgsICAyMDEsIDQyLCAgMTE5LCAyMTUsIDcsCisgICAgICAgIDEyNiwgMTE0LCA5NywgIDExLCAgNTMsICA0LCAgIDI1NCwgNDUsICAxMDIsIDEzMywgMjMwLCA4OCwgIDE5MywgMTI5LAorICAgICAgICAxOCwgIDEyNCwgODQsICAxMDgsIDIzOSwgMTg5LCAxNTIsIDEyMCwgMTE1LCAyMDcsIDIzNCwgMTc2LCA4NiwgIDE1NywKKyAgICAgICAgMTY0LCAxODcsIDcxLCAgMSwgICAxNSwgIDU4LCAgMjksICAyMSwgIDQ2LCAgMjMsICAyNDcsIDE2MiwgOTUsICAyMjksCisgICAgICAgIDEzLCAgMjI2LCAxNTksIDE3NSwgNTYsICAxMDAsIDk2LCAgMjAyLCAxMDEsIDE3OCwgMTU0LCA0NywgIDIwNSwgMTA2LAorICAgICAgICAxNDgsIDEwNCwgOTMsICAxMTIsIDI2LCAgMTY1LCAxMjgsIDI0NiwgMTQ2LCAyMTgsIDY2LCAgMjExLCA2NSwgIDkwLAorICAgICAgICAyNTIsIDE5LCAgNDAsICA0OSwgIDIyMywgMTc0LCAyNTUsIDUxLCAgNzcsICAyMjcsIDQ4LCAgMjIwLCAxNjgsIDExOCwKKyAgICAgICAgMjI0LCA5OCwgIDc1LCAgMTA1LCAxMjUsIDE5OSwgNzMsICA4MiwgIDU3LCAgMTgxLCA4MSwgIDE3MywgNjgsICA1MiwKKyAgICAgICAgMjMyLCAyMiwgIDIsICAgMjE2LCAxMTMsIDMwLCAgMTA5LCAxNjMsIDkyLCAgNjEsICAxNCwgIDM2LCAgMzgsICAyMjUsCisgICAgICAgIDc5LCAgMjMxLCAxNzAsIDI0MCwgMjAsICAyMTksIDIwNCwgMTYxLCAxODAsIDE4OCwgMTE2LCAxOTAsIDI0MSwgMTk3LAorICAgICAgICAxNzksIDg3LCAgNzQsICAxNDcsIDgwLCAgNTQsICA2OSwgIDE2LCAgMTY3LCAyMjIsIDEzNiwgMjQ1LCA1NSwgIDE4MiwKKyAgICAgICAgMywgICAyNCwgIDIwOSwgMjUxLCA1OSwgIDI4LCAgMTExLCA4OSwgIDE5NSwgMTU1LCAxOTQsIDEwNywgMjMzLCAzNCwKKyAgICAgICAgMTE3LCAxODQsIDMxLCAgMzl9OworICAgIENoZWNrQXJjRm91ckNvbnRleHQoY29udGV4dCwgNDYsIDEzNSwga1Blcm11dGF0aW9uKTsKKyAgfQorICB7CisgICAgQ1JZUFRfcmM0X2NvbnRleHQgY29udGV4dDsKKyAgICBDUllQVF9BcmNGb3VyU2V0dXAoJmNvbnRleHQsIG51bGxwdHIsIDApOworCisgICAgdWludDhfdCBkYXRhX2xvbmdbRlhfQXJyYXlTaXplKGtEYXRhTG9uZyldOworICAgIG1lbWNweShkYXRhX2xvbmcsIGtEYXRhTG9uZywgRlhfQXJyYXlTaXplKGtEYXRhTG9uZykpOworICAgIGNvbnN0IHVpbnQ4X3Qga0V4cGVjdGVkRW5jcnlwdGVkRGF0YUxvbmdbXSA9IHsKKyAgICAgICAgMTM4LCAxMTIsIDIzNiwgOTcsICAyNDIsIDY2LCAgNTIsICA4OSwgIDIyNSwgMzgsICA4OCwgIDgsICAgNDcsICA3OCwKKyAgICAgICAgMjE2LCAyNCwgIDE3MCwgMTA2LCAyNiwgIDE5OSwgMjA4LCAxMzEsIDE1NywgMjQyLCA1NSwgIDExLCAgMjUsICA5MCwKKyAgICAgICAgNjYsICAxODIsIDE5LCAgMjU1LCAyMTAsIDE4MSwgODUsICA2OSwgIDMxLCAgMjQwLCAyMDYsIDE3MSwgOTcsICA2MiwKKyAgICAgICAgMjAyLCAxNzIsIDMwLCAgMjQ2LCAxOSwgIDQzLCAgMTg0LCAwLCAgIDE3MywgMjcsICAxNDAsIDkwLCAgMTY3LCAyNDAsCisgICAgICAgIDEyMiwgMTI1LCAxODQsIDQ5LCAgMTQ5LCA3MSwgIDYzLCAgMTA0LCAxNzEsIDE0NCwgMjQyLCAxMDYsIDEyMSwgMTI0LAorICAgICAgICAyMDksIDE0OSwgNjEsICAxLCAgIDY2LCAgMTg2LCAyNTIsIDQ3LCAgNTEsICAxNzAsIDI1MywgNzUsICA5NSwgIDQxLAorICAgICAgICAyMDMsIDI4LCAgMTk3LCAxNzQsIDE0NCwgMjA5LCAxNjYsIDk4LCAgMTQyLCAxMjUsIDQ0LCAgNSwgICAxNDcsIDQyLAorICAgICAgICA3MywgIDE3OCwgMTE5LCA5MCwgIDI1MywgNjksICAxMDMsIDE3OCwgMTUsICAxMzYsIDUxLCAgMTEyLCAzOSwgIDgxLAorICAgICAgICAzNywgIDExMSwgMTI5LCAyMzIsIDEwNiwgMTU5LCAxMjYsIDE0MiwgMTIwLCAxMjQsIDQ4LCAgMTQwLCAyNTMsIDEyLAorICAgICAgICAyMjMsIDIwOCwgMTA2LCA3NiwgIDYwLCAgMjM4LCA1LCAgIDE2MiwgMTAwLCAyMjYsIDI1MSwgMTU2LCAxNjksIDM1LAorICAgICAgICAxOTMsIDEwLCAgMjQyLCAyMTAsIDIwLCAgOTYsICAzNywgIDg0LCAgOTksICAxODMsIDE3OSwgMjAzLCA2MiwgIDEyMiwKKyAgICAgICAgNTQsICA2LCAgIDUxLCAgMjM5LCAxNDIsIDI1MCwgMjM4LCA0MSwgIDIyMywgNTgsICA0OCwgIDEwMSwgMjksICAxODcsCisgICAgICAgIDQzLCAgMjM1LCAzLCAgIDUsICAgMTc2LCAzMywgIDE0LCAgMTcxLCAzNiwgIDI2LCAgMjM0LCAyMDcsIDEwNSwgNzksCisgICAgICAgIDY5LCAgMTI2LCA4MiwgIDE4MywgMTA1LCAyMjgsIDMxLCAgMTczLCA4LCAgIDI0MCwgOTksICA1LCAgIDE0NywgMjA2LAorICAgICAgICAyMTUsIDE0MCwgNDgsICAxOTAsIDE2NSwgNTAsICA0MSwgIDIzMiwgMjksICAxMDUsIDE1NiwgNjQsICAyMjksIDE2NSwKKyAgICAgICAgMTIsICA2NCwgIDE2MywgMjU1LCAxNDYsIDEwOCwgMjEyLCAxMjUsIDE0MiwgMTAxLCAxMywgIDk5LCAgMTc0LCAxMCwKKyAgICAgICAgMTYwLCA2OCwgIDE5NiwgMTIwLCAxMTAsIDIwMSwgMjU0LCAxNTgsIDk3LCAgMjE1LCAwLCAgIDIwNywgOTAsICAyMywKKyAgICAgICAgMjA4LCAxNjEsIDEwNSwgMjI2LCAxNjQsIDExNCwgODAsICAxMzcsIDU4LCAgMTA3LCAxMDksIDQyLCAgMTEwLCAxMDAsCisgICAgICAgIDIwMiwgMTcwLCAyMjQsIDg5LCAgMjgsICA1LCAgIDEzOCwgMTksICAyNTMsIDEwNSwgMjIwLCAxMDUsIDI0LCAgMTg3LAorICAgICAgICAxMDksIDg5LCAgMjA1LCA4OSwgIDIwMn07CisgICAgc3RhdGljX2Fzc2VydCgKKyAgICAgICAgRlhfQXJyYXlTaXplKGtFeHBlY3RlZEVuY3J5cHRlZERhdGFMb25nKSA9PSBGWF9BcnJheVNpemUoZGF0YV9sb25nKSwKKyAgICAgICAgImRhdGFfbG9uZyBtaXNtYXRjaCIpOworICAgIHN0YXRpY19hc3NlcnQoRlhfQXJyYXlTaXplKGRhdGFfbG9uZykgPiAyNTYsICJ0b28gc2hvcnQiKTsKKyAgICBDUllQVF9BcmNGb3VyQ3J5cHQoJmNvbnRleHQsIGRhdGFfbG9uZywgRlhfQXJyYXlTaXplKGRhdGFfbG9uZykpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGRhdGFfbG9uZyk7ICsraSkKKyAgICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRFbmNyeXB0ZWREYXRhTG9uZ1tpXSwgZGF0YV9sb25nW2ldKSA8PCBpOworCisgICAgY29uc3QgdWludDhfdCBrUGVybXV0YXRpb25ba1JDNENvbnRleHRQZXJtdXRhdGlvbkxlbmd0aF0gPSB7CisgICAgICAgIDE3MiwgNTksICAxOTYsIDcyLCAgMTAxLCAyMSwgIDIxNSwgMjEwLCAyMTIsIDUyLCAgMjQzLCA3MywgIDQ3LCAgMjEzLAorICAgICAgICAyMTEsIDUwLCAgMjI4LCAxNDQsIDY2LCAgOTMsICAxNjksIDMxLCAgMjM3LCAyMDYsIDIyMSwgMjM1LCAyMjIsIDI1MCwKKyAgICAgICAgOTcsICA4NywgIDE3NCwgMTY0LCAxOTAsIDExMSwgMjcsICAyMTcsIDE3MywgMTg5LCA2NSwgIDExLCAgMTE1LCAxNzEsCisgICAgICAgIDEwNCwgMTMyLCAxMiwgIDE3MCwgMjA1LCAxMTQsIDcsICAgMTA1LCAzNywgIDgzLCAgNzgsICAxMzQsIDIzNiwgNzAsCisgICAgICAgIDE5NywgMTIyLCAxNzcsIDIwMiwgMzksICAxOTUsIDMwLCAgMywgICA4NiwgIDEyNywgNzQsICAxMDYsIDY4LCAgOTEsCisgICAgICAgIDExMCwgMTIxLCAyMDgsIDI1LCAgNTYsICA2LCAgIDI4LCAgMjI1LCAxNjMsIDE5MywgMTY2LCAyNDQsIDExOSwgMzQsCisgICAgICAgIDIzLCAgODgsICAxMDgsIDEyMywgMTYyLCAxNTksIDI0MiwgNjEsICAyMzAsIDIyNywgMjU0LCAxNCwgIDQsICAgMTU2LAorICAgICAgICAxNjEsIDQ0LCAgNTgsICAxNTMsIDMzLCAgMTQzLCAxMjksIDIzMiwgMTgyLCAxNTIsIDc2LCAgMTY4LCAyMzgsIDIzOSwKKyAgICAgICAgMTg1LCAyMTksIDIzMywgMTYsICAxODgsIDQ1LCAgNDAsICAzNSwgIDEwMywgOTksICA4OSwgIDE1NywgMjQxLCAyNDUsCisgICAgICAgIDE5MiwgMTgwLCAyNDgsIDgsICAgODUsICAyMzEsIDE0NiwgMTU0LCAyNTIsIDE4MSwgMTA3LCAxMjYsIDk4LCAgODAsCisgICAgICAgIDEwMiwgMTY1LCAxOTksIDk0LCAgNDksICAyNTUsIDE4LCAgMjA0LCAyMTYsIDc3LCAgMjAsICAxODcsIDE0NSwgMTI1LAorICAgICAgICAxLCAgIDI0NywgNzksICAyNiwgIDIwNywgODEsICAxMTcsIDE3OSwgMTg2LCAzOCwgIDE3NSwgMTksICAxMzksIDEzOCwKKyAgICAgICAgMTQ5LCA1NCwgIDY0LCAgMTA5LCAyNDksIDEzNSwgMTQyLCAxMTgsIDE3LCAgMTMsICAyMDEsIDE4NCwgNTUsICAyMjQsCisgICAgICAgIDIwOSwgMTU1LCAxMTMsIDIxOCwgODIsICAxMzEsIDE3OCwgMjUzLCAxNDAsIDIyNiwgNDMsICA0MiwgIDI0LCAgMjksCisgICAgICAgIDIyOSwgMjAwLCAxMzcsIDI0MCwgMjAzLCAxNjcsIDk1LCAgMTQ4LCAxNSwgIDE3NiwgNjAsICA3NSwgIDUzLCAgNDEsCisgICAgICAgIDE1MCwgMTEyLCAxNjAsIDk2LCAgMjIsICAxMCwgIDIzNCwgMTE2LCAxMzAsIDE1OCwgMjE0LCAzNiwgIDksICAgNjcsCisgICAgICAgIDE5OCwgMTk0LCAxOTEsIDEwMCwgMTI0LCAxNDcsIDMyLCAgMTgzLCAxMjAsIDI0NiwgNTEsICAxNDEsIDQ2LCAgMjUxLAorICAgICAgICA5MiwgIDIyMywgMTMzLCA2MywgIDAsICAgNzEsICA0OCwgIDEyOCwgMjIwLCA5MCwgIDYyLCAgMTM2LCAyLCAgIDUsCisgICAgICAgIDY5LCAgNTcsICAxNTEsIDg0fTsKKyAgICBDaGVja0FyY0ZvdXJDb250ZXh0KGNvbnRleHQsIDE1LCAyMjIsIGtQZXJtdXRhdGlvbik7CisgIH0KKyAgeworICAgIENSWVBUX3JjNF9jb250ZXh0IGNvbnRleHQ7CisgICAgY29uc3QgdWludDhfdCBrRm9vQmFyW10gPSAiZm9vYmFyIjsKKyAgICBDUllQVF9BcmNGb3VyU2V0dXAoJmNvbnRleHQsIGtGb29CYXIsIEZYX0FycmF5U2l6ZShrRm9vQmFyKSAtIDEpOworCisgICAgdWludDhfdCBkYXRhX3Nob3J0W0ZYX0FycmF5U2l6ZShrRGF0YVNob3J0KV07CisgICAgbWVtY3B5KGRhdGFfc2hvcnQsIGtEYXRhU2hvcnQsIEZYX0FycmF5U2l6ZShrRGF0YVNob3J0KSk7CisgICAgY29uc3QgdWludDhfdCBrRXhwZWN0ZWRFbmNyeXB0ZWREYXRhU2hvcnRbXSA9IHsKKyAgICAgICAgNTksICAxOTMsIDExNywgMjA2LCAxNjcsIDU0LCAgMjE4LCA3LCAgIDIyOSwgMjE0LCAxODgsIDU1LAorICAgICAgICA5MCwgIDIwNSwgMTk2LCAyNSwgIDM2LCAgMTE0LCAxOTksIDIxOCwgMTYxLCAxMDcsIDEyMiwgMTE5LAorICAgICAgICAxMDYsIDE2NywgNDQsICAxNzUsIDI0MCwgMTIzLCAxOTIsIDEwMiwgMTc0LCAxNjcsIDEwNSwgMTg3LAorICAgICAgICAyMDIsIDcwLCAgMTIxLCA4MSwgIDE3LCAgMzAsICA1LCAgIDEzOCwgMTE2LCAxNjZ9OworICAgIHN0YXRpY19hc3NlcnQoCisgICAgICAgIEZYX0FycmF5U2l6ZShrRXhwZWN0ZWRFbmNyeXB0ZWREYXRhU2hvcnQpID09IEZYX0FycmF5U2l6ZShkYXRhX3Nob3J0KSwKKyAgICAgICAgImRhdGFfc2hvcnQgbWlzbWF0Y2giKTsKKyAgICBDUllQVF9BcmNGb3VyQ3J5cHQoJmNvbnRleHQsIGRhdGFfc2hvcnQsIEZYX0FycmF5U2l6ZShkYXRhX3Nob3J0KSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZGF0YV9zaG9ydCk7ICsraSkKKyAgICAgIEVYUEVDVF9FUShrRXhwZWN0ZWRFbmNyeXB0ZWREYXRhU2hvcnRbaV0sIGRhdGFfc2hvcnRbaV0pIDw8IGk7CisKKyAgICBjb25zdCB1aW50OF90IGtQZXJtdXRhdGlvbltrUkM0Q29udGV4dFBlcm11dGF0aW9uTGVuZ3RoXSA9IHsKKyAgICAgICAgMTAyLCA0MSwgIDQ1LCAgODIsICAxMjQsIDE0MSwgMjM3LCAzOCwgIDYsICAgNjQsICA5MCwgIDE0MCwgMjU0LCA5NiwKKyAgICAgICAgMjIwLCAxMDksIDk5LCAgNDksICAyNywgIDIyNywgMjA1LCA3NSwgIDE5MSwgMzcsICAxNywgIDU0LCAgODMsICAxOTYsCisgICAgICAgIDEwOCwgNzksICAzMSwgIDE5MCwgMTgwLCAwLCAgIDEyNSwgMTk0LCAyNDMsIDE1NiwgMjI0LCAyNDYsIDI1MywgMTkzLAorICAgICAgICA0MiwgIDgxLCAgMTE3LCA1NiwgIDE4MSwgMjUyLCAxMTMsIDIxMCwgMjE3LCA2MiwgIDIxOCwgMTI5LCA2MSwgIDMzLAorICAgICAgICAxMjgsIDksICAgMTUzLCA1OSwgIDQzLCAgMTMsICAyMDYsIDQ4LCAgMTMxLCAxOCwgIDIxMywgMTE4LCAxNzMsIDEyMiwKKyAgICAgICAgODAsICAxNzIsIDE3NywgMTA1LCAxNDgsIDIwNywgMTg2LCA1LCAgIDg1LCAgMzIsICA2OCwgIDIxNSwgMTksICA4NCwKKyAgICAgICAgMTY5LCAyMDksIDE1MCwgNywgICAxMzMsIDYzLCAgMTQ3LCA5MywgIDI2LCAgMTMwLCA2MCwgIDE0NSwgMjUwLCA1NywKKyAgICAgICAgMjQsICAyNDcsIDIwMCwgMTI3LCAxMzYsIDY2LCAgMTEyLCAxMDcsIDIxMiwgMTU0LCA3MCwgIDE3MCwgMTg1LCAxMzgsCisgICAgICAgIDI0OCwgMjM2LCA4OCwgIDg2LCAgNDQsICAyMTYsIDI0MSwgMzUsICAxMDAsIDE1MSwgNzgsICA3NCwgIDExOSwgNTUsCisgICAgICAgIDI0NSwgNDYsICAxOTksIDIwOCwgMjI5LCAxNiwgIDI0OSwgMTQ5LCA1MywgIDE1NywgMjAxLCAyMzQsIDU4LCAgMjgsCisgICAgICAgIDE0MiwgMjM4LCAxODIsIDE2MywgMTc5LCAxNDQsIDEyLCAgMTE0LCAxNzYsIDEwLCAgMTgzLCAyMzksIDEwNCwgNDAsCisgICAgICAgIDczLCAgMTAxLCAxMzcsIDY5LCAgMjIxLCAxMzQsIDE2NSwgMTg4LCAyNSwgIDg3LCAgMSwgICA5MSwgIDIsICAgMTcxLAorICAgICAgICAyMzIsIDM0LCAgMTYyLCAxNjYsIDE2MCwgMTI2LCAyMjUsIDE2NywgMTIzLCAxOTcsIDIyMywgMTk1LCAyMiwgIDIwMywKKyAgICAgICAgMTg5LCAyNDQsIDEwMywgMTM5LCAyMjIsIDE3NSwgMjMsICAxNDMsIDE1MiwgMTkyLCAyMSwgIDIzMSwgMjI4LCAxMzIsCisgICAgICAgIDMwLCAgMjA0LCAxNTgsIDI0MCwgMTIwLCA5OCwgIDg5LCAgMTIxLCAxMzUsIDI1MSwgMTY4LCA0LCAgIDE2MSwgMywKKyAgICAgICAgOCwgICAyMzAsIDUyLCAgMjE5LCAyMTQsIDI0MiwgMzYsICA5NywgIDE1LCAgMTU1LCA2NSwgIDE4NywgMTE2LCA3NiwKKyAgICAgICAgMTU5LCA2NywgIDIxMSwgMjAsICAxNzgsIDE0NiwgMjAyLCAxMSwgIDE2NCwgMjI2LCAxODQsIDUwLCAgNzcsICAxNzQsCisgICAgICAgIDcxLCAgMjMzLCAyMzUsIDE5OCwgOTUsICA1MSwgIDExMCwgMjU1LCA5MiwgIDcyLCAgMTE1LCAxMDYsIDQ3LCAgOTQsCisgICAgICAgIDI5LCAgMzksICAxNCwgIDExMX07CisgICAgQ2hlY2tBcmNGb3VyQ29udGV4dChjb250ZXh0LCA0NiwgMzksIGtQZXJtdXRhdGlvbik7CisgIH0KKyAgeworICAgIENSWVBUX3JjNF9jb250ZXh0IGNvbnRleHQ7CisgICAgY29uc3QgdWludDhfdCBrRm9vQmFyW10gPSAiZm9vYmFyIjsKKyAgICBDUllQVF9BcmNGb3VyU2V0dXAoJmNvbnRleHQsIGtGb29CYXIsIEZYX0FycmF5U2l6ZShrRm9vQmFyKSAtIDEpOworCisgICAgdWludDhfdCBkYXRhX2xvbmdbRlhfQXJyYXlTaXplKGtEYXRhTG9uZyldOworICAgIG1lbWNweShkYXRhX2xvbmcsIGtEYXRhTG9uZywgRlhfQXJyYXlTaXplKGtEYXRhTG9uZykpOworICAgIGNvbnN0IHVpbnQ4X3Qga0V4cGVjdGVkRW5jcnlwdGVkRGF0YUxvbmdbXSA9IHsKKyAgICAgICAgNTksICAxOTMsIDExNywgMjA2LCAxNjcsIDU0LCAgMjE4LCA3LCAgIDIyOSwgMjE0LCAxODgsIDU1LCAgOTAsICAyMDUsCisgICAgICAgIDE5NiwgMjUsICAzNiwgIDExNCwgMTk5LCAyMTgsIDE2MSwgMTA3LCAxMjIsIDExOSwgMTA2LCAxNjcsIDQ0LCAgMTc1LAorICAgICAgICAyNDAsIDEyMywgMTkyLCAxMDIsIDE3NCwgMTY3LCAxMDUsIDE4NywgMjAyLCA3MCwgIDEyMSwgODEsICAxNywgIDMwLAorICAgICAgICA1LCAgIDEzOCwgMTE2LCAxNzIsIDE2OSwgNTAsICAxNjAsIDExNiwgMjM3LCAxMTcsIDEwOCwgMjQxLCAxMjcsIDYxLAorICAgICAgICA4MywgIDQ1LCAgNzcsICAxNzYsIDAsICAgMTA2LCAxOTEsIDIyMSwgMTMyLCAxNDMsIDIxOSwgOTQsICAyLCAgIDIzNSwKKyAgICAgICAgMjA0LCAxNjYsIDIwMSwgMTM5LCAxNDAsIDE2MywgMTA0LCAxMTUsIDQ4LCAgMzcsICAxOCwgIDExNCwgMTY4LCA0OSwKKyAgICAgICAgMjM1LCAxNjMsIDE3OSwgMTMxLCAxODIsIDIxOCwgMTIwLCAyMDAsIDksICAgOTAsICA2MCwgIDQ3LCAgNTUsICAyMzUsCisgICAgICAgIDEzNSwgMzcsICAyMSwgIDE3MCwgNDgsICAxMTIsIDE4NSwgMTY5LCA0MywgIDIzMywgODgsICAxMzQsIDExNywgMTI2LAorICAgICAgICAyNDgsIDQwLCAgMTc2LCAyNDgsIDMwLCAgMTMxLCAxMDgsIDQzLCAgMTM5LCA2OCwgIDIzMiwgMjE5LCA3LCAgIDM5LAorICAgICAgICAyMjMsIDQ1LCAgMTk5LCAyNDMsIDU0LCAgMTcxLCAzMSwgIDM3LCAgMTYxLCAyNCwgIDM4LCAgMjUxLCAxMywgIDE0NCwKKyAgICAgICAgMTA2LCAyMTUsIDE3OSwgMjAzLCA1LCAgIDI1MywgMjUsICAzMiwgIDI1LCAgMTQ2LCAxMDksIDE5MywgMTQzLCAxNDEsCisgICAgICAgIDE3NywgMjI2LCAxMzQsIDIyMiwgOTUsICA3OSwgIDE1NiwgMjAyLCAyNDAsIDM0LCAgMTUzLCAxNDUsIDE2OSwgMTUwLAorICAgICAgICAyMzEsIDYzLCAgMTEzLCAyNDIsIDE1NiwgMzksICAxMzYsIDI0OSwgMTA4LCA1MCwgIDE4MSwgMjIsICAyMiwgIDE4MCwKKyAgICAgICAgNTcsICA3NiwgIDY5LCAgNjIsICAyNTQsIDQ3LCAgMTQxLCAyNDksIDIzNSwgOTAsICAyNSwgIDM0LCAgNDAsICAxOTQsCisgICAgICAgIDY2LCAgODYsICAxMTAsIDE5MiwgMjM1LCAxOTEsIDIwNSwgMTMzLCA5MSwgIDMyLCAgMTA0LCA2NSwgIDQzLCAgMzYsCisgICAgICAgIDE0MCwgMzYsICAyMjgsIDE1NiwgMTA1LCAyNTEsIDE2OSwgMTY4LCAyMDMsIDE4OSwgMjM4LCAyMjEsIDY0LCAgMjAwLAorICAgICAgICA2OCwgIDEzNywgMTUzLCA5LCAgIDE4MywgODQsICAxNTMsIDE0MCwgMjM5LCAwLCAgIDE1LCAgNTAsICAxMjYsIDE0NSwKKyAgICAgICAgMjIsICAxMTAsIDQzLCAgNTYsICA5NCwgIDEyNywgNDgsICA5NiwgIDQ3LCAgMTcyLCAzLCAgIDMxLCAgMTMwLCAyNDksCisgICAgICAgIDI0MywgNzMsICAyMDYsIDg5LCAgOSwgICA5MywgIDE1NiwgMTY3LCAyMDUsIDE2NiwgNzUsICAyMjcsIDM2LCAgMzQsCisgICAgICAgIDgxLCAgMTI0LCAxOTUsIDI0NiwgMTUyfTsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICBGWF9BcnJheVNpemUoa0V4cGVjdGVkRW5jcnlwdGVkRGF0YUxvbmcpID09IEZYX0FycmF5U2l6ZShkYXRhX2xvbmcpLAorICAgICAgICAiZGF0YV9sb25nIG1pc21hdGNoIik7CisgICAgc3RhdGljX2Fzc2VydChGWF9BcnJheVNpemUoZGF0YV9sb25nKSA+IDI1NiwgInRvbyBzaG9ydCIpOworICAgIENSWVBUX0FyY0ZvdXJDcnlwdCgmY29udGV4dCwgZGF0YV9sb25nLCBGWF9BcnJheVNpemUoZGF0YV9sb25nKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZGF0YV9sb25nKTsgKytpKQorICAgICAgRVhQRUNUX0VRKGtFeHBlY3RlZEVuY3J5cHRlZERhdGFMb25nW2ldLCBkYXRhX2xvbmdbaV0pIDw8IGk7CisKKyAgICBjb25zdCB1aW50OF90IGtQZXJtdXRhdGlvbltrUkM0Q29udGV4dFBlcm11dGF0aW9uTGVuZ3RoXSA9IHsKKyAgICAgICAgMTg4LCAxMiwgIDgxLCAgMTMwLCAyMjgsIDU4LCAgMTI0LCAyMTgsIDcyLCAgMjEwLCA1MCwgIDcwLCAgMTY2LCAzOCwKKyAgICAgICAgMTEwLCAxMTEsIDczLCAgNDksICAyNywgIDIyNywgMjQ5LCAyMSwgIDEsICAgMjI2LCAxNywgIDU0LCAgNTMsICAxNiwKKyAgICAgICAgMTA4LCA1MSwgIDMxLCAgMTIzLCAyMjEsIDIzLCAgMTI1LCAxNDgsIDUsICAgMjAwLCAyMDgsIDI0NiwgMjUzLCAxOTMsCisgICAgICAgIDQyLCAgNDUsICAyMzYsIDU2LCAgMjMwLCAxOTQsIDE3OCwgMjEzLCAxMjAsIDExNiwgNywgICAxNjQsIDMzLCAgMTA3LAorICAgICAgICAxODksIDIwLCAgMTMzLCAxMTQsIDE3MywgMTYxLCA1OSwgIDEyOCwgMywgICAyMzgsIDY1LCAgNjksICAxNDQsIDE3OSwKKyAgICAgICAgNDQsICAzNSwgIDgsICAgMTYzLCAyNTIsIDE5NSwgMTYwLCAxOTcsIDIwNCwgMjgsICAzNCwgIDEyOSwgNjcsICA4OSwKKyAgICAgICAgMjIsICAxNDksIDE5OSwgMTMxLCAxODIsIDQ2LCAgMjUwLCAyMjIsIDE1NSwgMTA0LCAxMCwgIDMyLCAgMTM5LCAyNDUsCisgICAgICAgIDkwLCAgNDEsICAxMzIsIDIyNCwgODMsICAyNDIsIDEzNSwgNzUsICA3NCwgIDYxLCAgNjIsICAxNDEsIDQzLCAgMTI3LAorICAgICAgICAyNTUsIDkxLCAgMTcwLCA3OCwgIDE1NywgMTAxLCAyNDMsIDIxNiwgMjU0LCAxNTYsIDIyOSwgMTE4LCAxNzQsIDE0NywKKyAgICAgICAgMTAzLCA3NiwgIDE5NiwgMTQ1LCAxMzQsIDk0LCAgMjA1LCAxNDYsIDIwMiwgOTgsICAxMDAsIDEwNiwgMjMyLCAxNzcsCisgICAgICAgIDE4NywgMTMsICA4MCwgIDEzNywgMTUxLCAxMSwgIDgyLCAgNDAsICAxNjcsIDE3NSwgMjUsICAyMTksIDE2OCwgMjQwLAorICAgICAgICA5OSwgIDU1LCAgNCwgICAxOSwgIDE4MCwgMiwgICAyMDMsIDE4LCAgMTcxLCAxNTQsIDExMywgMTE3LCA2LCAgIDE4NSwKKyAgICAgICAgMTcyLCAxODYsIDIzNywgMjIzLCAyMzMsIDI0NCwgMjE3LCAxOTEsIDE5MCwgMTk4LCA5NywgIDE2NSwgMjIwLCA5LAorICAgICAgICAyMTQsIDE1MCwgMTg0LCAxNDMsIDIwNiwgMjQsICAyMDksIDIwNywgMzYsICAxNDIsIDg3LCAgMTUsICAxNTksIDcxLAorICAgICAgICA4NCwgIDE2MiwgMTY5LCA4NiwgIDQ4LCAgNDcsICAxNDAsIDIxNSwgMjQxLCAyMzUsIDE1OCwgMTQsICAyNiwgIDI0OCwKKyAgICAgICAgMTM4LCAxMTksIDIxMiwgMzksICA4OCwgIDEyMSwgOTYsICAxMDksIDI5LCAgNjYsICAxMzYsIDEwMiwgMjI1LCA5MiwKKyAgICAgICAgMjAxLCAxMjYsIDEyMiwgMTkyLCA2MCwgIDAsICAgNjQsICAyMzksIDE4MywgMzcsICA1NywgIDYzLCAgMjM0LCAxODEsCisgICAgICAgIDE1MywgNTIsICAxNzYsIDExMiwgOTMsICA3OSwgIDc3LCAgMTE1LCAyMzEsIDMwLCAgOTUsICAyNTEsIDIxMSwgNjgsCisgICAgICAgIDEwNSwgODUsICAyNDcsIDE1Mn07CisgICAgQ2hlY2tBcmNGb3VyQ29udGV4dChjb250ZXh0LCAxNSwgNjgsIGtQZXJtdXRhdGlvbik7CisgIH0KK30KKworVEVTVChGWENSWVBULCBTaGE1MTJUZXN0KSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGlucHV0ID0KKyAgICAgICJUaGlzIGlzIGEgc2ltcGxlIHRlc3QuIFRvIHNlZSB3aGV0aGVyIGl0IGlzIGdldHRpbmcgY29ycmVjdCB2YWx1ZS4iOworICBjb25zdCB1aW50OF90IGV4cGVjdGVkWzY0XSA9IHsKKyAgICAgIDB4ODYsIDB4QjUsIDB4MDUsIDB4NjMsIDB4QTIsIDB4NkYsIDB4RDYsIDB4RkEsIDB4RUIsIDB4OUIsIDB4QzMsCisgICAgICAweEJCLCAweDlFLCAweEI3LCAweDAzLCAweDgyLCAweEI2LCAweDUwLCAweDU1LCAweDZCLCAweDkwLCAweDY5LAorICAgICAgMHhEMCwgMHhBNywgMHg1MywgMHgwQSwgMHgzNCwgMHhERCwgMHhFQSwgMHgxMSwgMHhDQywgMHg5MSwgMHg1QywKKyAgICAgIDB4QzcsIDB4OTMsIDB4Q0EsIDB4QUUsIDB4MzAsIDB4RDEsIDB4OTYsIDB4QkUsIDB4RDAsIDB4MzUsIDB4MjEsCisgICAgICAweDRBLCAweEM2LCAweDQyLCAweDU2LCAweDBDLCAweEEzLCAweDAwLCAweDY5LCAweDQ0LCAweDc3LCAweENDLAorICAgICAgMHgzRSwgMHhENCwgMHhENiwgMHgxMCwgMHgzMSwgMHhDNiwgMHhDMCwgMHg1OCwgMHhDRn07CisgIHVpbnQ4X3QgYWN0dWFsWzY0XTsKKyAgQ1JZUFRfU0hBNTEyR2VuZXJhdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oaW5wdXQpLCBzdHJsZW4oaW5wdXQpLAorICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWwpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDY0OyArK2kpCisgICAgRVhQRUNUX0VRKGV4cGVjdGVkW2ldLCBhY3R1YWxbaV0pIDw8ICIgYXQgYnl0ZSAiIDw8IGk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvY21hcHMvQ05TMS9DTlMtRVVDLUhfMC5jcHAgYi9jb3JlL2ZwZGZhcGkvY21hcHMvQ05TMS9DTlMtRVVDLUhfMC5jcHAKaW5kZXggZWZiZTM1Mi4uOWQwY2VlOCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL2NtYXBzL0NOUzEvQ05TLUVVQy1IXzAuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9jbWFwcy9DTlMxL0NOUy1FVUMtSF8wLmNwcApAQCAtNjIsMTExICs2MiwxMjQgQEAKICAgICAweEZEQTEsIDB4RkRDQiwgMHgxNzQxLAogfTsKIAotY29uc3QgdWludDE2X3QgZ19GWENNQVBfQ05TX0VVQ19IXzBfRFdvcmRbMjM4ICogNF0gPSB7Ci0gICAgMHg4RUExLCAweEExQTEsIDB4QTFGRSwgMHgwMDYzLCAweDhFQTEsIDB4QTJBMSwgMHhBMkZFLCAweDAwQzEsIDB4OEVBMSwKLSAgICAweEEzQTEsIDB4QTNDRSwgMHgwMTFGLCAweDhFQTEsIDB4QTRBMSwgMHhBNEZFLCAweDAxNEQsIDB4OEVBMSwgMHhBNUExLAotICAgIDB4QTVFQywgMHgwMUFCLCAweDhFQTEsIDB4QTVFRSwgMHhBNUYwLCAweDAxRjcsIDB4OEVBMSwgMHhBNkExLCAweEE2QkUsCi0gICAgMHgwMUZBLCAweDhFQTEsIDB4QTdBMSwgMHhBN0ExLCAweDAyNTMsIDB4OEVBMSwgMHhBN0EyLCAweEE3QTQsIDB4MDIxOCwKLSAgICAweDhFQTEsIDB4QTdBNSwgMHhBN0E1LCAweDAyNTQsIDB4OEVBMSwgMHhBN0E2LCAweEE3QTYsIDB4MDIxQiwgMHg4RUExLAotICAgIDB4QTdBNywgMHhBN0E3LCAweDAyNUEsIDB4OEVBMSwgMHhBN0E4LCAweEE3QTgsIDB4MDIxQywgMHg4RUExLCAweEE3QTksCi0gICAgMHhBN0FDLCAweDAyNUIsIDB4OEVBMSwgMHhBN0FELCAweEE3QUYsIDB4MDIxRCwgMHg4RUExLCAweEE3QjAsIDB4QTdCMCwKLSAgICAweDAyNUYsIDB4OEVBMSwgMHhBN0IxLCAweEE3QjEsIDB4MTc2RSwgMHg4RUExLCAweEE3QjIsIDB4QTdCMiwgMHgwMjYwLAotICAgIDB4OEVBMSwgMHhBN0IzLCAweEE3QjMsIDB4MDI2MiwgMHg4RUExLCAweEE3QjQsIDB4QTdCNCwgMHgwMjIwLCAweDhFQTEsCi0gICAgMHhBN0I1LCAweEE3QjUsIDB4MDI2MywgMHg4RUExLCAweEE3QjYsIDB4QTdCNiwgMHgxNzZGLCAweDhFQTEsIDB4QTdCNywKLSAgICAweEE3QjcsIDB4MDIyMSwgMHg4RUExLCAweEE3QjgsIDB4QTdCOSwgMHgwMjY0LCAweDhFQTEsIDB4QTdCQSwgMHhBN0JBLAotICAgIDB4MDIyMiwgMHg4RUExLCAweEE3QkIsIDB4QTdCQiwgMHgxNzcwLCAweDhFQTEsIDB4QTdCQywgMHhBN0JDLCAweDAyMjMsCi0gICAgMHg4RUExLCAweEE3QkQsIDB4QTdCRCwgMHgwMjY2LCAweDhFQTEsIDB4QTdCRSwgMHhBN0JFLCAweDAyNzksIDB4OEVBMSwKLSAgICAweEE3QkYsIDB4QTdCRiwgMHgxNzc1LCAweDhFQTEsIDB4QTdDMCwgMHhBN0MxLCAweDAyN0EsIDB4OEVBMSwgMHhBN0MyLAotICAgIDB4QTdDMiwgMHgwMjI0LCAweDhFQTEsIDB4QTdDMywgMHhBN0M2LCAweDAyN0MsIDB4OEVBMSwgMHhBN0M3LCAweEE3QzcsCi0gICAgMHgwMjI1LCAweDhFQTEsIDB4QTdDOCwgMHhBN0NCLCAweDAyODIsIDB4OEVBMSwgMHhBN0NDLCAweEE3Q0MsIDB4MTc3NiwKLSAgICAweDhFQTEsIDB4QTdDRCwgMHhBN0NELCAweDAyODYsIDB4OEVBMSwgMHhBN0NFLCAweEE3Q0UsIDB4MDIyNiwgMHg4RUExLAotICAgIDB4QTdDRiwgMHhBN0QwLCAweDAyODgsIDB4OEVBMSwgMHhBN0QxLCAweEE3RDIsIDB4MDI4QywgMHg4RUExLCAweEE3RDMsCi0gICAgMHhBN0Q1LCAweDAyMjcsIDB4OEVBMSwgMHhBN0Q2LCAweEE3RDgsIDB4MDI4RSwgMHg4RUExLCAweEE3RDksIDB4QTdEQSwKLSAgICAweDAyMkEsIDB4OEVBMSwgMHhBN0RCLCAweEE3REIsIDB4MTc3NywgMHg4RUExLCAweEE3REMsIDB4QTdERiwgMHgwMkQwLAotICAgIDB4OEVBMSwgMHhBN0UwLCAweEE3RTAsIDB4MDJENSwgMHg4RUExLCAweEE3RTEsIDB4QTdFMSwgMHgwMjJDLCAweDhFQTEsCi0gICAgMHhBN0UyLCAweEE3RTUsIDB4MDJENiwgMHg4RUExLCAweEE3RTYsIDB4QTdFNiwgMHgwMjJELCAweDhFQTEsIDB4QTdFNywKLSAgICAweEE3RUQsIDB4MDJEQSwgMHg4RUExLCAweEE3RUUsIDB4QTdFRSwgMHgxNzhBLCAweDhFQTEsIDB4QTdFRiwgMHhBN0YyLAotICAgIDB4MDJFMSwgMHg4RUExLCAweEE3RjMsIDB4QTdGMywgMHgxNzhDLCAweDhFQTEsIDB4QTdGNCwgMHhBN0Y4LCAweDAyRTUsCi0gICAgMHg4RUExLCAweEE3RjksIDB4QTdGOSwgMHgxNzhELCAweDhFQTEsIDB4QTdGQSwgMHhBN0ZELCAweDAyRUEsIDB4OEVBMSwKLSAgICAweEE3RkUsIDB4QTdGRSwgMHgwMzU2LCAweDhFQTEsIDB4QThBMSwgMHhBOEE2LCAweDAzNTcsIDB4OEVBMSwgMHhBOEE3LAotICAgIDB4QThBNywgMHgwMzVFLCAweDhFQTEsIDB4QThBOCwgMHhBOEE4LCAweDAzNjIsIDB4OEVBMSwgMHhBOEE5LCAweEE4QUEsCi0gICAgMHgwMjJFLCAweDhFQTEsIDB4QThBQiwgMHhBOEIyLCAweDAzNjMsIDB4OEVBMSwgMHhBOEIzLCAweEE4QjMsIDB4MTdCMiwKLSAgICAweDhFQTEsIDB4QThCNCwgMHhBOEI2LCAweDAzNkIsIDB4OEVBMSwgMHhBOEI3LCAweEE4QkEsIDB4MDNGNiwgMHg4RUExLAotICAgIDB4QThCQiwgMHhBOEJCLCAweDE4MTIsIDB4OEVBMSwgMHhBOEJDLCAweEE4QkUsIDB4MDNGQSwgMHg4RUExLCAweEE4QkYsCi0gICAgMHhBOEMzLCAweDAzRkUsIDB4OEVBMSwgMHhBOEM0LCAweEE4Q0MsIDB4MDQwNSwgMHg4RUExLCAweEE4Q0QsIDB4QThDRCwKLSAgICAweDE4MTMsIDB4OEVBMSwgMHhBOENFLCAweEE4Q0UsIDB4MTgxOCwgMHg4RUExLCAweEE4Q0YsIDB4QThEMiwgMHgwNDBGLAotICAgIDB4OEVBMSwgMHhBOEQzLCAweEE4RDMsIDB4MTgxOSwgMHg4RUExLCAweEE4RDQsIDB4QThEOSwgMHgwNTA4LCAweDhFQTEsCi0gICAgMHhBOERBLCAweEE4REEsIDB4MThFNywgMHg4RUExLCAweEE4REIsIDB4QThFMiwgMHgwNTBFLCAweDhFQTEsIDB4QThFMywKLSAgICAweEE4RTMsIDB4MDIzMCwgMHg4RUExLCAweEE4RTQsIDB4QThFNCwgMHgwNTFCLCAweDhFQTEsIDB4QThFNSwgMHhBOEU3LAotICAgIDB4MDUyMCwgMHg4RUExLCAweEE4RTgsIDB4QThFQiwgMHgwNjk2LCAweDhFQTEsIDB4QThFQywgMHhBOEVDLCAweDAyMzEsCi0gICAgMHg4RUExLCAweEE4RUQsIDB4QThGMCwgMHgwNjlGLCAweDhFQTEsIDB4QThGMSwgMHhBOEZCLCAweDA4MjYsIDB4OEVBMSwKLSAgICAweEE4RkMsIDB4QThGRSwgMHgwOUY1LCAweDhFQTEsIDB4QTlBMSwgMHhBOUExLCAweDFFMzMsIDB4OEVBMSwgMHhBOUEyLAotICAgIDB4QTlBMiwgMHgwOUY4LCAweDhFQTEsIDB4QTlBMywgMHhBOUEzLCAweDFFMzQsIDB4OEVBMSwgMHhBOUE0LCAweEE5QTUsCi0gICAgMHgwOUY5LCAweDhFQTEsIDB4QTlBNiwgMHhBOUFCLCAweDBCRTEsIDB4OEVBMSwgMHhBOUFDLCAweEE5QUUsIDB4MERCQiwKLSAgICAweDhFQTEsIDB4QTlBRiwgMHhBOUFGLCAweDIzNjAsIDB4OEVBMSwgMHhBOUIwLCAweEE5QjAsIDB4MjYxMiwgMHg4RUExLAotICAgIDB4QTlCMSwgMHhBOUIzLCAweDBGN0IsIDB4OEVBMSwgMHhBOUI0LCAweEE5QjUsIDB4MTEwMCwgMHg4RUExLCAweEE5QjYsCi0gICAgMHhBOUI2LCAweDEyODksIDB4OEVBMSwgMHhBOUI3LCAweEE5QjgsIDB4MTNCMiwgMHg4RUExLCAweEE5QjksIDB4QTlCOSwKLSAgICAweDJGMEQsIDB4OEVBMSwgMHhDMkExLCAweEMyQzEsIDB4MDIzMiwgMHg4RUExLCAweEM0QTEsIDB4QzRGRSwgMHgwMjUzLAotICAgIDB4OEVBMSwgMHhDNUExLCAweEM1RkUsIDB4MDJCMSwgMHg4RUExLCAweEM2QTEsIDB4QzZGRSwgMHgwMzBGLCAweDhFQTEsCi0gICAgMHhDN0ExLCAweEM3RkUsIDB4MDM2RCwgMHg4RUExLCAweEM4QTEsIDB4QzhGRSwgMHgwM0NCLCAweDhFQTEsIDB4QzlBMSwKLSAgICAweEM5RkUsIDB4MDQyOSwgMHg4RUExLCAweENBQTEsIDB4Q0FGRSwgMHgwNDg3LCAweDhFQTEsIDB4Q0JBMSwgMHhDQkZFLAotICAgIDB4MDRFNSwgMHg4RUExLCAweENDQTEsIDB4Q0NGRSwgMHgwNTQzLCAweDhFQTEsIDB4Q0RBMSwgMHhDREZFLCAweDA1QTEsCi0gICAgMHg4RUExLCAweENFQTEsIDB4Q0VGRSwgMHgwNUZGLCAweDhFQTEsIDB4Q0ZBMSwgMHhDRkZFLCAweDA2NUQsIDB4OEVBMSwKLSAgICAweEQwQTEsIDB4RDBGRSwgMHgwNkJCLCAweDhFQTEsIDB4RDFBMSwgMHhEMUZFLCAweDA3MTksIDB4OEVBMSwgMHhEMkExLAotICAgIDB4RDJGRSwgMHgwNzc3LCAweDhFQTEsIDB4RDNBMSwgMHhEM0ZFLCAweDA3RDUsIDB4OEVBMSwgMHhENEExLCAweEQ0RkUsCi0gICAgMHgwODMzLCAweDhFQTEsIDB4RDVBMSwgMHhENUZFLCAweDA4OTEsIDB4OEVBMSwgMHhENkExLCAweEQ2RkUsIDB4MDhFRiwKLSAgICAweDhFQTEsIDB4RDdBMSwgMHhEN0ZFLCAweDA5NEQsIDB4OEVBMSwgMHhEOEExLCAweEQ4RkUsIDB4MDlBQiwgMHg4RUExLAotICAgIDB4RDlBMSwgMHhEOUZFLCAweDBBMDksIDB4OEVBMSwgMHhEQUExLCAweERBRkUsIDB4MEE2NywgMHg4RUExLCAweERCQTEsCi0gICAgMHhEQkZFLCAweDBBQzUsIDB4OEVBMSwgMHhEQ0ExLCAweERDRkUsIDB4MEIyMywgMHg4RUExLCAweEREQTEsIDB4RERGRSwKLSAgICAweDBCODEsIDB4OEVBMSwgMHhERUExLCAweERFRkUsIDB4MEJERiwgMHg4RUExLCAweERGQTEsIDB4REZGRSwgMHgwQzNELAotICAgIDB4OEVBMSwgMHhFMEExLCAweEUwRkUsIDB4MEM5QiwgMHg4RUExLCAweEUxQTEsIDB4RTFGRSwgMHgwQ0Y5LCAweDhFQTEsCi0gICAgMHhFMkExLCAweEUyRkUsIDB4MEQ1NywgMHg4RUExLCAweEUzQTEsIDB4RTNGRSwgMHgwREI1LCAweDhFQTEsIDB4RTRBMSwKLSAgICAweEU0RkUsIDB4MEUxMywgMHg4RUExLCAweEU1QTEsIDB4RTVGRSwgMHgwRTcxLCAweDhFQTEsIDB4RTZBMSwgMHhFNkZFLAotICAgIDB4MEVDRiwgMHg4RUExLCAweEU3QTEsIDB4RTdGRSwgMHgwRjJELCAweDhFQTEsIDB4RThBMSwgMHhFOEZFLCAweDBGOEIsCi0gICAgMHg4RUExLCAweEU5QTEsIDB4RTlGRSwgMHgwRkU5LCAweDhFQTEsIDB4RUFBMSwgMHhFQUZFLCAweDEwNDcsIDB4OEVBMSwKLSAgICAweEVCQTEsIDB4RUJGRSwgMHgxMEE1LCAweDhFQTEsIDB4RUNBMSwgMHhFQ0ZFLCAweDExMDMsIDB4OEVBMSwgMHhFREExLAotICAgIDB4RURGRSwgMHgxMTYxLCAweDhFQTEsIDB4RUVBMSwgMHhFRUZFLCAweDExQkYsIDB4OEVBMSwgMHhFRkExLCAweEVGRkUsCi0gICAgMHgxMjFELCAweDhFQTEsIDB4RjBBMSwgMHhGMEZFLCAweDEyN0IsIDB4OEVBMSwgMHhGMUExLCAweEYxRkUsIDB4MTJEOSwKLSAgICAweDhFQTEsIDB4RjJBMSwgMHhGMkZFLCAweDEzMzcsIDB4OEVBMSwgMHhGM0ExLCAweEYzRkUsIDB4MTM5NSwgMHg4RUExLAotICAgIDB4RjRBMSwgMHhGNEZFLCAweDEzRjMsIDB4OEVBMSwgMHhGNUExLCAweEY1RkUsIDB4MTQ1MSwgMHg4RUExLCAweEY2QTEsCi0gICAgMHhGNkZFLCAweDE0QUYsIDB4OEVBMSwgMHhGN0ExLCAweEY3RkUsIDB4MTUwRCwgMHg4RUExLCAweEY4QTEsIDB4RjhGRSwKLSAgICAweDE1NkIsIDB4OEVBMSwgMHhGOUExLCAweEY5RkUsIDB4MTVDOSwgMHg4RUExLCAweEZBQTEsIDB4RkFGRSwgMHgxNjI3LAotICAgIDB4OEVBMSwgMHhGQkExLCAweEZCRkUsIDB4MTY4NSwgMHg4RUExLCAweEZDQTEsIDB4RkNGRSwgMHgxNkUzLCAweDhFQTEsCi0gICAgMHhGREExLCAweEZEQ0IsIDB4MTc0MSwgMHg4RUEyLCAweEExQTEsIDB4QTFGRSwgMHgxNzZDLCAweDhFQTIsIDB4QTJBMSwKLSAgICAweEEyRkUsIDB4MTdDQSwgMHg4RUEyLCAweEEzQTEsIDB4QTNGRSwgMHgxODI4LCAweDhFQTIsIDB4QTRBMSwgMHhBNEZFLAotICAgIDB4MTg4NiwgMHg4RUEyLCAweEE1QTEsIDB4QTVGRSwgMHgxOEU0LCAweDhFQTIsIDB4QTZBMSwgMHhBNkZFLCAweDE5NDIsCi0gICAgMHg4RUEyLCAweEE3QTEsIDB4QTdGRSwgMHgxOUEwLCAweDhFQTIsIDB4QThBMSwgMHhBOEZFLCAweDE5RkUsIDB4OEVBMiwKLSAgICAweEE5QTEsIDB4QTlGRSwgMHgxQTVDLCAweDhFQTIsIDB4QUFBMSwgMHhBQUZFLCAweDFBQkEsIDB4OEVBMiwgMHhBQkExLAotICAgIDB4QUJGRSwgMHgxQjE4LCAweDhFQTIsIDB4QUNBMSwgMHhBQ0ZFLCAweDFCNzYsIDB4OEVBMiwgMHhBREExLCAweEFERkUsCi0gICAgMHgxQkQ0LCAweDhFQTIsIDB4QUVBMSwgMHhBRUZFLCAweDFDMzIsIDB4OEVBMiwgMHhBRkExLCAweEFGRkUsIDB4MUM5MCwKLSAgICAweDhFQTIsIDB4QjBBMSwgMHhCMEZFLCAweDFDRUUsIDB4OEVBMiwgMHhCMUExLCAweEIxRkUsIDB4MUQ0QywgMHg4RUEyLAotICAgIDB4QjJBMSwgMHhCMkZFLCAweDFEQUEsIDB4OEVBMiwgMHhCM0ExLCAweEIzRkUsIDB4MUUwOCwgMHg4RUEyLCAweEI0QTEsCi0gICAgMHhCNEZFLCAweDFFNjYsIDB4OEVBMiwgMHhCNUExLCAweEI1RkUsIDB4MUVDNCwgMHg4RUEyLCAweEI2QTEsIDB4QjZGRSwKLSAgICAweDFGMjIsIDB4OEVBMiwgMHhCN0ExLCAweEI3RkUsIDB4MUY4MCwgMHg4RUEyLCAweEI4QTEsIDB4QjhGRSwgMHgxRkRFLAotICAgIDB4OEVBMiwgMHhCOUExLCAweEI5RkUsIDB4MjAzQywgMHg4RUEyLCAweEJBQTEsIDB4QkFGRSwgMHgyMDlBLCAweDhFQTIsCi0gICAgMHhCQkExLCAweEJCRkUsIDB4MjBGOCwgMHg4RUEyLCAweEJDQTEsIDB4QkNGRSwgMHgyMTU2LCAweDhFQTIsIDB4QkRBMSwKLSAgICAweEJERkUsIDB4MjFCNCwgMHg4RUEyLCAweEJFQTEsIDB4QkVGRSwgMHgyMjEyLCAweDhFQTIsIDB4QkZBMSwgMHhCRkZFLAotICAgIDB4MjI3MCwgMHg4RUEyLCAweEMwQTEsIDB4QzBGRSwgMHgyMkNFLCAweDhFQTIsIDB4QzFBMSwgMHhDMUZFLCAweDIzMkMsCi0gICAgMHg4RUEyLCAweEMyQTEsIDB4QzJGRSwgMHgyMzhBLCAweDhFQTIsIDB4QzNBMSwgMHhDM0ZFLCAweDIzRTgsIDB4OEVBMiwKLSAgICAweEM0QTEsIDB4QzRGRSwgMHgyNDQ2LCAweDhFQTIsIDB4QzVBMSwgMHhDNUZFLCAweDI0QTQsIDB4OEVBMiwgMHhDNkExLAotICAgIDB4QzZGRSwgMHgyNTAyLCAweDhFQTIsIDB4QzdBMSwgMHhDN0ZFLCAweDI1NjAsIDB4OEVBMiwgMHhDOEExLCAweEM4RkUsCi0gICAgMHgyNUJFLCAweDhFQTIsIDB4QzlBMSwgMHhDOUZFLCAweDI2MUMsIDB4OEVBMiwgMHhDQUExLCAweENBRkUsIDB4MjY3QSwKLSAgICAweDhFQTIsIDB4Q0JBMSwgMHhDQkZFLCAweDI2RDgsIDB4OEVBMiwgMHhDQ0ExLCAweENDRkUsIDB4MjczNiwgMHg4RUEyLAotICAgIDB4Q0RBMSwgMHhDREZFLCAweDI3OTQsIDB4OEVBMiwgMHhDRUExLCAweENFRkUsIDB4MjdGMiwgMHg4RUEyLCAweENGQTEsCi0gICAgMHhDRkZFLCAweDI4NTAsIDB4OEVBMiwgMHhEMEExLCAweEQwRkUsIDB4MjhBRSwgMHg4RUEyLCAweEQxQTEsIDB4RDFGRSwKLSAgICAweDI5MEMsIDB4OEVBMiwgMHhEMkExLCAweEQyRkUsIDB4Mjk2QSwgMHg4RUEyLCAweEQzQTEsIDB4RDNGRSwgMHgyOUM4LAotICAgIDB4OEVBMiwgMHhENEExLCAweEQ0RkUsIDB4MkEyNiwgMHg4RUEyLCAweEQ1QTEsIDB4RDVGRSwgMHgyQTg0LCAweDhFQTIsCi0gICAgMHhENkExLCAweEQ2RkUsIDB4MkFFMiwgMHg4RUEyLCAweEQ3QTEsIDB4RDdGRSwgMHgyQjQwLCAweDhFQTIsIDB4RDhBMSwKLSAgICAweEQ4RkUsIDB4MkI5RSwgMHg4RUEyLCAweEQ5QTEsIDB4RDlGRSwgMHgyQkZDLCAweDhFQTIsIDB4REFBMSwgMHhEQUZFLAotICAgIDB4MkM1QSwgMHg4RUEyLCAweERCQTEsIDB4REJGRSwgMHgyQ0I4LCAweDhFQTIsIDB4RENBMSwgMHhEQ0ZFLCAweDJEMTYsCi0gICAgMHg4RUEyLCAweEREQTEsIDB4RERGRSwgMHgyRDc0LCAweDhFQTIsIDB4REVBMSwgMHhERUZFLCAweDJERDIsIDB4OEVBMiwKLSAgICAweERGQTEsIDB4REZGRSwgMHgyRTMwLCAweDhFQTIsIDB4RTBBMSwgMHhFMEZFLCAweDJFOEUsIDB4OEVBMiwgMHhFMUExLAotICAgIDB4RTFGRSwgMHgyRUVDLCAweDhFQTIsIDB4RTJBMSwgMHhFMkZFLCAweDJGNEEsIDB4OEVBMiwgMHhFM0ExLCAweEUzRkUsCi0gICAgMHgyRkE4LCAweDhFQTIsIDB4RTRBMSwgMHhFNEZFLCAweDMwMDYsIDB4OEVBMiwgMHhFNUExLCAweEU1RkUsIDB4MzA2NCwKLSAgICAweDhFQTIsIDB4RTZBMSwgMHhFNkZFLCAweDMwQzIsIDB4OEVBMiwgMHhFN0ExLCAweEU3RkUsIDB4MzEyMCwgMHg4RUEyLAotICAgIDB4RThBMSwgMHhFOEZFLCAweDMxN0UsIDB4OEVBMiwgMHhFOUExLCAweEU5RkUsIDB4MzFEQywgMHg4RUEyLCAweEVBQTEsCi0gICAgMHhFQUZFLCAweDMyM0EsIDB4OEVBMiwgMHhFQkExLCAweEVCRkUsIDB4MzI5OCwgMHg4RUEyLCAweEVDQTEsIDB4RUNGRSwKLSAgICAweDMyRjYsIDB4OEVBMiwgMHhFREExLCAweEVERkUsIDB4MzM1NCwgMHg4RUEyLCAweEVFQTEsIDB4RUVGRSwgMHgzM0IyLAotICAgIDB4OEVBMiwgMHhFRkExLCAweEVGRkUsIDB4MzQxMCwgMHg4RUEyLCAweEYwQTEsIDB4RjBGRSwgMHgzNDZFLCAweDhFQTIsCi0gICAgMHhGMUExLCAweEYxRkUsIDB4MzRDQywgMHg4RUEyLCAweEYyQTEsIDB4RjJDNCwgMHgzNTJBLAorY29uc3QgRlhDTUFQX0RXb3JkQ0lETWFwIGdfRlhDTUFQX0NOU19FVUNfSF8wX0RXb3JkWzIzOF0gPSB7CisgICAgezB4OEVBMSwgMHhBMUExLCAweEExRkUsIDB4MDA2M30sIHsweDhFQTEsIDB4QTJBMSwgMHhBMkZFLCAweDAwQzF9LAorICAgIHsweDhFQTEsIDB4QTNBMSwgMHhBM0NFLCAweDAxMUZ9LCB7MHg4RUExLCAweEE0QTEsIDB4QTRGRSwgMHgwMTREfSwKKyAgICB7MHg4RUExLCAweEE1QTEsIDB4QTVFQywgMHgwMUFCfSwgezB4OEVBMSwgMHhBNUVFLCAweEE1RjAsIDB4MDFGN30sCisgICAgezB4OEVBMSwgMHhBNkExLCAweEE2QkUsIDB4MDFGQX0sIHsweDhFQTEsIDB4QTdBMSwgMHhBN0ExLCAweDAyNTN9LAorICAgIHsweDhFQTEsIDB4QTdBMiwgMHhBN0E0LCAweDAyMTh9LCB7MHg4RUExLCAweEE3QTUsIDB4QTdBNSwgMHgwMjU0fSwKKyAgICB7MHg4RUExLCAweEE3QTYsIDB4QTdBNiwgMHgwMjFCfSwgezB4OEVBMSwgMHhBN0E3LCAweEE3QTcsIDB4MDI1QX0sCisgICAgezB4OEVBMSwgMHhBN0E4LCAweEE3QTgsIDB4MDIxQ30sIHsweDhFQTEsIDB4QTdBOSwgMHhBN0FDLCAweDAyNUJ9LAorICAgIHsweDhFQTEsIDB4QTdBRCwgMHhBN0FGLCAweDAyMUR9LCB7MHg4RUExLCAweEE3QjAsIDB4QTdCMCwgMHgwMjVGfSwKKyAgICB7MHg4RUExLCAweEE3QjEsIDB4QTdCMSwgMHgxNzZFfSwgezB4OEVBMSwgMHhBN0IyLCAweEE3QjIsIDB4MDI2MH0sCisgICAgezB4OEVBMSwgMHhBN0IzLCAweEE3QjMsIDB4MDI2Mn0sIHsweDhFQTEsIDB4QTdCNCwgMHhBN0I0LCAweDAyMjB9LAorICAgIHsweDhFQTEsIDB4QTdCNSwgMHhBN0I1LCAweDAyNjN9LCB7MHg4RUExLCAweEE3QjYsIDB4QTdCNiwgMHgxNzZGfSwKKyAgICB7MHg4RUExLCAweEE3QjcsIDB4QTdCNywgMHgwMjIxfSwgezB4OEVBMSwgMHhBN0I4LCAweEE3QjksIDB4MDI2NH0sCisgICAgezB4OEVBMSwgMHhBN0JBLCAweEE3QkEsIDB4MDIyMn0sIHsweDhFQTEsIDB4QTdCQiwgMHhBN0JCLCAweDE3NzB9LAorICAgIHsweDhFQTEsIDB4QTdCQywgMHhBN0JDLCAweDAyMjN9LCB7MHg4RUExLCAweEE3QkQsIDB4QTdCRCwgMHgwMjY2fSwKKyAgICB7MHg4RUExLCAweEE3QkUsIDB4QTdCRSwgMHgwMjc5fSwgezB4OEVBMSwgMHhBN0JGLCAweEE3QkYsIDB4MTc3NX0sCisgICAgezB4OEVBMSwgMHhBN0MwLCAweEE3QzEsIDB4MDI3QX0sIHsweDhFQTEsIDB4QTdDMiwgMHhBN0MyLCAweDAyMjR9LAorICAgIHsweDhFQTEsIDB4QTdDMywgMHhBN0M2LCAweDAyN0N9LCB7MHg4RUExLCAweEE3QzcsIDB4QTdDNywgMHgwMjI1fSwKKyAgICB7MHg4RUExLCAweEE3QzgsIDB4QTdDQiwgMHgwMjgyfSwgezB4OEVBMSwgMHhBN0NDLCAweEE3Q0MsIDB4MTc3Nn0sCisgICAgezB4OEVBMSwgMHhBN0NELCAweEE3Q0QsIDB4MDI4Nn0sIHsweDhFQTEsIDB4QTdDRSwgMHhBN0NFLCAweDAyMjZ9LAorICAgIHsweDhFQTEsIDB4QTdDRiwgMHhBN0QwLCAweDAyODh9LCB7MHg4RUExLCAweEE3RDEsIDB4QTdEMiwgMHgwMjhDfSwKKyAgICB7MHg4RUExLCAweEE3RDMsIDB4QTdENSwgMHgwMjI3fSwgezB4OEVBMSwgMHhBN0Q2LCAweEE3RDgsIDB4MDI4RX0sCisgICAgezB4OEVBMSwgMHhBN0Q5LCAweEE3REEsIDB4MDIyQX0sIHsweDhFQTEsIDB4QTdEQiwgMHhBN0RCLCAweDE3Nzd9LAorICAgIHsweDhFQTEsIDB4QTdEQywgMHhBN0RGLCAweDAyRDB9LCB7MHg4RUExLCAweEE3RTAsIDB4QTdFMCwgMHgwMkQ1fSwKKyAgICB7MHg4RUExLCAweEE3RTEsIDB4QTdFMSwgMHgwMjJDfSwgezB4OEVBMSwgMHhBN0UyLCAweEE3RTUsIDB4MDJENn0sCisgICAgezB4OEVBMSwgMHhBN0U2LCAweEE3RTYsIDB4MDIyRH0sIHsweDhFQTEsIDB4QTdFNywgMHhBN0VELCAweDAyREF9LAorICAgIHsweDhFQTEsIDB4QTdFRSwgMHhBN0VFLCAweDE3OEF9LCB7MHg4RUExLCAweEE3RUYsIDB4QTdGMiwgMHgwMkUxfSwKKyAgICB7MHg4RUExLCAweEE3RjMsIDB4QTdGMywgMHgxNzhDfSwgezB4OEVBMSwgMHhBN0Y0LCAweEE3RjgsIDB4MDJFNX0sCisgICAgezB4OEVBMSwgMHhBN0Y5LCAweEE3RjksIDB4MTc4RH0sIHsweDhFQTEsIDB4QTdGQSwgMHhBN0ZELCAweDAyRUF9LAorICAgIHsweDhFQTEsIDB4QTdGRSwgMHhBN0ZFLCAweDAzNTZ9LCB7MHg4RUExLCAweEE4QTEsIDB4QThBNiwgMHgwMzU3fSwKKyAgICB7MHg4RUExLCAweEE4QTcsIDB4QThBNywgMHgwMzVFfSwgezB4OEVBMSwgMHhBOEE4LCAweEE4QTgsIDB4MDM2Mn0sCisgICAgezB4OEVBMSwgMHhBOEE5LCAweEE4QUEsIDB4MDIyRX0sIHsweDhFQTEsIDB4QThBQiwgMHhBOEIyLCAweDAzNjN9LAorICAgIHsweDhFQTEsIDB4QThCMywgMHhBOEIzLCAweDE3QjJ9LCB7MHg4RUExLCAweEE4QjQsIDB4QThCNiwgMHgwMzZCfSwKKyAgICB7MHg4RUExLCAweEE4QjcsIDB4QThCQSwgMHgwM0Y2fSwgezB4OEVBMSwgMHhBOEJCLCAweEE4QkIsIDB4MTgxMn0sCisgICAgezB4OEVBMSwgMHhBOEJDLCAweEE4QkUsIDB4MDNGQX0sIHsweDhFQTEsIDB4QThCRiwgMHhBOEMzLCAweDAzRkV9LAorICAgIHsweDhFQTEsIDB4QThDNCwgMHhBOENDLCAweDA0MDV9LCB7MHg4RUExLCAweEE4Q0QsIDB4QThDRCwgMHgxODEzfSwKKyAgICB7MHg4RUExLCAweEE4Q0UsIDB4QThDRSwgMHgxODE4fSwgezB4OEVBMSwgMHhBOENGLCAweEE4RDIsIDB4MDQwRn0sCisgICAgezB4OEVBMSwgMHhBOEQzLCAweEE4RDMsIDB4MTgxOX0sIHsweDhFQTEsIDB4QThENCwgMHhBOEQ5LCAweDA1MDh9LAorICAgIHsweDhFQTEsIDB4QThEQSwgMHhBOERBLCAweDE4RTd9LCB7MHg4RUExLCAweEE4REIsIDB4QThFMiwgMHgwNTBFfSwKKyAgICB7MHg4RUExLCAweEE4RTMsIDB4QThFMywgMHgwMjMwfSwgezB4OEVBMSwgMHhBOEU0LCAweEE4RTQsIDB4MDUxQn0sCisgICAgezB4OEVBMSwgMHhBOEU1LCAweEE4RTcsIDB4MDUyMH0sIHsweDhFQTEsIDB4QThFOCwgMHhBOEVCLCAweDA2OTZ9LAorICAgIHsweDhFQTEsIDB4QThFQywgMHhBOEVDLCAweDAyMzF9LCB7MHg4RUExLCAweEE4RUQsIDB4QThGMCwgMHgwNjlGfSwKKyAgICB7MHg4RUExLCAweEE4RjEsIDB4QThGQiwgMHgwODI2fSwgezB4OEVBMSwgMHhBOEZDLCAweEE4RkUsIDB4MDlGNX0sCisgICAgezB4OEVBMSwgMHhBOUExLCAweEE5QTEsIDB4MUUzM30sIHsweDhFQTEsIDB4QTlBMiwgMHhBOUEyLCAweDA5Rjh9LAorICAgIHsweDhFQTEsIDB4QTlBMywgMHhBOUEzLCAweDFFMzR9LCB7MHg4RUExLCAweEE5QTQsIDB4QTlBNSwgMHgwOUY5fSwKKyAgICB7MHg4RUExLCAweEE5QTYsIDB4QTlBQiwgMHgwQkUxfSwgezB4OEVBMSwgMHhBOUFDLCAweEE5QUUsIDB4MERCQn0sCisgICAgezB4OEVBMSwgMHhBOUFGLCAweEE5QUYsIDB4MjM2MH0sIHsweDhFQTEsIDB4QTlCMCwgMHhBOUIwLCAweDI2MTJ9LAorICAgIHsweDhFQTEsIDB4QTlCMSwgMHhBOUIzLCAweDBGN0J9LCB7MHg4RUExLCAweEE5QjQsIDB4QTlCNSwgMHgxMTAwfSwKKyAgICB7MHg4RUExLCAweEE5QjYsIDB4QTlCNiwgMHgxMjg5fSwgezB4OEVBMSwgMHhBOUI3LCAweEE5QjgsIDB4MTNCMn0sCisgICAgezB4OEVBMSwgMHhBOUI5LCAweEE5QjksIDB4MkYwRH0sIHsweDhFQTEsIDB4QzJBMSwgMHhDMkMxLCAweDAyMzJ9LAorICAgIHsweDhFQTEsIDB4QzRBMSwgMHhDNEZFLCAweDAyNTN9LCB7MHg4RUExLCAweEM1QTEsIDB4QzVGRSwgMHgwMkIxfSwKKyAgICB7MHg4RUExLCAweEM2QTEsIDB4QzZGRSwgMHgwMzBGfSwgezB4OEVBMSwgMHhDN0ExLCAweEM3RkUsIDB4MDM2RH0sCisgICAgezB4OEVBMSwgMHhDOEExLCAweEM4RkUsIDB4MDNDQn0sIHsweDhFQTEsIDB4QzlBMSwgMHhDOUZFLCAweDA0Mjl9LAorICAgIHsweDhFQTEsIDB4Q0FBMSwgMHhDQUZFLCAweDA0ODd9LCB7MHg4RUExLCAweENCQTEsIDB4Q0JGRSwgMHgwNEU1fSwKKyAgICB7MHg4RUExLCAweENDQTEsIDB4Q0NGRSwgMHgwNTQzfSwgezB4OEVBMSwgMHhDREExLCAweENERkUsIDB4MDVBMX0sCisgICAgezB4OEVBMSwgMHhDRUExLCAweENFRkUsIDB4MDVGRn0sIHsweDhFQTEsIDB4Q0ZBMSwgMHhDRkZFLCAweDA2NUR9LAorICAgIHsweDhFQTEsIDB4RDBBMSwgMHhEMEZFLCAweDA2QkJ9LCB7MHg4RUExLCAweEQxQTEsIDB4RDFGRSwgMHgwNzE5fSwKKyAgICB7MHg4RUExLCAweEQyQTEsIDB4RDJGRSwgMHgwNzc3fSwgezB4OEVBMSwgMHhEM0ExLCAweEQzRkUsIDB4MDdENX0sCisgICAgezB4OEVBMSwgMHhENEExLCAweEQ0RkUsIDB4MDgzM30sIHsweDhFQTEsIDB4RDVBMSwgMHhENUZFLCAweDA4OTF9LAorICAgIHsweDhFQTEsIDB4RDZBMSwgMHhENkZFLCAweDA4RUZ9LCB7MHg4RUExLCAweEQ3QTEsIDB4RDdGRSwgMHgwOTREfSwKKyAgICB7MHg4RUExLCAweEQ4QTEsIDB4RDhGRSwgMHgwOUFCfSwgezB4OEVBMSwgMHhEOUExLCAweEQ5RkUsIDB4MEEwOX0sCisgICAgezB4OEVBMSwgMHhEQUExLCAweERBRkUsIDB4MEE2N30sIHsweDhFQTEsIDB4REJBMSwgMHhEQkZFLCAweDBBQzV9LAorICAgIHsweDhFQTEsIDB4RENBMSwgMHhEQ0ZFLCAweDBCMjN9LCB7MHg4RUExLCAweEREQTEsIDB4RERGRSwgMHgwQjgxfSwKKyAgICB7MHg4RUExLCAweERFQTEsIDB4REVGRSwgMHgwQkRGfSwgezB4OEVBMSwgMHhERkExLCAweERGRkUsIDB4MEMzRH0sCisgICAgezB4OEVBMSwgMHhFMEExLCAweEUwRkUsIDB4MEM5Qn0sIHsweDhFQTEsIDB4RTFBMSwgMHhFMUZFLCAweDBDRjl9LAorICAgIHsweDhFQTEsIDB4RTJBMSwgMHhFMkZFLCAweDBENTd9LCB7MHg4RUExLCAweEUzQTEsIDB4RTNGRSwgMHgwREI1fSwKKyAgICB7MHg4RUExLCAweEU0QTEsIDB4RTRGRSwgMHgwRTEzfSwgezB4OEVBMSwgMHhFNUExLCAweEU1RkUsIDB4MEU3MX0sCisgICAgezB4OEVBMSwgMHhFNkExLCAweEU2RkUsIDB4MEVDRn0sIHsweDhFQTEsIDB4RTdBMSwgMHhFN0ZFLCAweDBGMkR9LAorICAgIHsweDhFQTEsIDB4RThBMSwgMHhFOEZFLCAweDBGOEJ9LCB7MHg4RUExLCAweEU5QTEsIDB4RTlGRSwgMHgwRkU5fSwKKyAgICB7MHg4RUExLCAweEVBQTEsIDB4RUFGRSwgMHgxMDQ3fSwgezB4OEVBMSwgMHhFQkExLCAweEVCRkUsIDB4MTBBNX0sCisgICAgezB4OEVBMSwgMHhFQ0ExLCAweEVDRkUsIDB4MTEwM30sIHsweDhFQTEsIDB4RURBMSwgMHhFREZFLCAweDExNjF9LAorICAgIHsweDhFQTEsIDB4RUVBMSwgMHhFRUZFLCAweDExQkZ9LCB7MHg4RUExLCAweEVGQTEsIDB4RUZGRSwgMHgxMjFEfSwKKyAgICB7MHg4RUExLCAweEYwQTEsIDB4RjBGRSwgMHgxMjdCfSwgezB4OEVBMSwgMHhGMUExLCAweEYxRkUsIDB4MTJEOX0sCisgICAgezB4OEVBMSwgMHhGMkExLCAweEYyRkUsIDB4MTMzN30sIHsweDhFQTEsIDB4RjNBMSwgMHhGM0ZFLCAweDEzOTV9LAorICAgIHsweDhFQTEsIDB4RjRBMSwgMHhGNEZFLCAweDEzRjN9LCB7MHg4RUExLCAweEY1QTEsIDB4RjVGRSwgMHgxNDUxfSwKKyAgICB7MHg4RUExLCAweEY2QTEsIDB4RjZGRSwgMHgxNEFGfSwgezB4OEVBMSwgMHhGN0ExLCAweEY3RkUsIDB4MTUwRH0sCisgICAgezB4OEVBMSwgMHhGOEExLCAweEY4RkUsIDB4MTU2Qn0sIHsweDhFQTEsIDB4RjlBMSwgMHhGOUZFLCAweDE1Qzl9LAorICAgIHsweDhFQTEsIDB4RkFBMSwgMHhGQUZFLCAweDE2Mjd9LCB7MHg4RUExLCAweEZCQTEsIDB4RkJGRSwgMHgxNjg1fSwKKyAgICB7MHg4RUExLCAweEZDQTEsIDB4RkNGRSwgMHgxNkUzfSwgezB4OEVBMSwgMHhGREExLCAweEZEQ0IsIDB4MTc0MX0sCisgICAgezB4OEVBMiwgMHhBMUExLCAweEExRkUsIDB4MTc2Q30sIHsweDhFQTIsIDB4QTJBMSwgMHhBMkZFLCAweDE3Q0F9LAorICAgIHsweDhFQTIsIDB4QTNBMSwgMHhBM0ZFLCAweDE4Mjh9LCB7MHg4RUEyLCAweEE0QTEsIDB4QTRGRSwgMHgxODg2fSwKKyAgICB7MHg4RUEyLCAweEE1QTEsIDB4QTVGRSwgMHgxOEU0fSwgezB4OEVBMiwgMHhBNkExLCAweEE2RkUsIDB4MTk0Mn0sCisgICAgezB4OEVBMiwgMHhBN0ExLCAweEE3RkUsIDB4MTlBMH0sIHsweDhFQTIsIDB4QThBMSwgMHhBOEZFLCAweDE5RkV9LAorICAgIHsweDhFQTIsIDB4QTlBMSwgMHhBOUZFLCAweDFBNUN9LCB7MHg4RUEyLCAweEFBQTEsIDB4QUFGRSwgMHgxQUJBfSwKKyAgICB7MHg4RUEyLCAweEFCQTEsIDB4QUJGRSwgMHgxQjE4fSwgezB4OEVBMiwgMHhBQ0ExLCAweEFDRkUsIDB4MUI3Nn0sCisgICAgezB4OEVBMiwgMHhBREExLCAweEFERkUsIDB4MUJENH0sIHsweDhFQTIsIDB4QUVBMSwgMHhBRUZFLCAweDFDMzJ9LAorICAgIHsweDhFQTIsIDB4QUZBMSwgMHhBRkZFLCAweDFDOTB9LCB7MHg4RUEyLCAweEIwQTEsIDB4QjBGRSwgMHgxQ0VFfSwKKyAgICB7MHg4RUEyLCAweEIxQTEsIDB4QjFGRSwgMHgxRDRDfSwgezB4OEVBMiwgMHhCMkExLCAweEIyRkUsIDB4MURBQX0sCisgICAgezB4OEVBMiwgMHhCM0ExLCAweEIzRkUsIDB4MUUwOH0sIHsweDhFQTIsIDB4QjRBMSwgMHhCNEZFLCAweDFFNjZ9LAorICAgIHsweDhFQTIsIDB4QjVBMSwgMHhCNUZFLCAweDFFQzR9LCB7MHg4RUEyLCAweEI2QTEsIDB4QjZGRSwgMHgxRjIyfSwKKyAgICB7MHg4RUEyLCAweEI3QTEsIDB4QjdGRSwgMHgxRjgwfSwgezB4OEVBMiwgMHhCOEExLCAweEI4RkUsIDB4MUZERX0sCisgICAgezB4OEVBMiwgMHhCOUExLCAweEI5RkUsIDB4MjAzQ30sIHsweDhFQTIsIDB4QkFBMSwgMHhCQUZFLCAweDIwOUF9LAorICAgIHsweDhFQTIsIDB4QkJBMSwgMHhCQkZFLCAweDIwRjh9LCB7MHg4RUEyLCAweEJDQTEsIDB4QkNGRSwgMHgyMTU2fSwKKyAgICB7MHg4RUEyLCAweEJEQTEsIDB4QkRGRSwgMHgyMUI0fSwgezB4OEVBMiwgMHhCRUExLCAweEJFRkUsIDB4MjIxMn0sCisgICAgezB4OEVBMiwgMHhCRkExLCAweEJGRkUsIDB4MjI3MH0sIHsweDhFQTIsIDB4QzBBMSwgMHhDMEZFLCAweDIyQ0V9LAorICAgIHsweDhFQTIsIDB4QzFBMSwgMHhDMUZFLCAweDIzMkN9LCB7MHg4RUEyLCAweEMyQTEsIDB4QzJGRSwgMHgyMzhBfSwKKyAgICB7MHg4RUEyLCAweEMzQTEsIDB4QzNGRSwgMHgyM0U4fSwgezB4OEVBMiwgMHhDNEExLCAweEM0RkUsIDB4MjQ0Nn0sCisgICAgezB4OEVBMiwgMHhDNUExLCAweEM1RkUsIDB4MjRBNH0sIHsweDhFQTIsIDB4QzZBMSwgMHhDNkZFLCAweDI1MDJ9LAorICAgIHsweDhFQTIsIDB4QzdBMSwgMHhDN0ZFLCAweDI1NjB9LCB7MHg4RUEyLCAweEM4QTEsIDB4QzhGRSwgMHgyNUJFfSwKKyAgICB7MHg4RUEyLCAweEM5QTEsIDB4QzlGRSwgMHgyNjFDfSwgezB4OEVBMiwgMHhDQUExLCAweENBRkUsIDB4MjY3QX0sCisgICAgezB4OEVBMiwgMHhDQkExLCAweENCRkUsIDB4MjZEOH0sIHsweDhFQTIsIDB4Q0NBMSwgMHhDQ0ZFLCAweDI3MzZ9LAorICAgIHsweDhFQTIsIDB4Q0RBMSwgMHhDREZFLCAweDI3OTR9LCB7MHg4RUEyLCAweENFQTEsIDB4Q0VGRSwgMHgyN0YyfSwKKyAgICB7MHg4RUEyLCAweENGQTEsIDB4Q0ZGRSwgMHgyODUwfSwgezB4OEVBMiwgMHhEMEExLCAweEQwRkUsIDB4MjhBRX0sCisgICAgezB4OEVBMiwgMHhEMUExLCAweEQxRkUsIDB4MjkwQ30sIHsweDhFQTIsIDB4RDJBMSwgMHhEMkZFLCAweDI5NkF9LAorICAgIHsweDhFQTIsIDB4RDNBMSwgMHhEM0ZFLCAweDI5Qzh9LCB7MHg4RUEyLCAweEQ0QTEsIDB4RDRGRSwgMHgyQTI2fSwKKyAgICB7MHg4RUEyLCAweEQ1QTEsIDB4RDVGRSwgMHgyQTg0fSwgezB4OEVBMiwgMHhENkExLCAweEQ2RkUsIDB4MkFFMn0sCisgICAgezB4OEVBMiwgMHhEN0ExLCAweEQ3RkUsIDB4MkI0MH0sIHsweDhFQTIsIDB4RDhBMSwgMHhEOEZFLCAweDJCOUV9LAorICAgIHsweDhFQTIsIDB4RDlBMSwgMHhEOUZFLCAweDJCRkN9LCB7MHg4RUEyLCAweERBQTEsIDB4REFGRSwgMHgyQzVBfSwKKyAgICB7MHg4RUEyLCAweERCQTEsIDB4REJGRSwgMHgyQ0I4fSwgezB4OEVBMiwgMHhEQ0ExLCAweERDRkUsIDB4MkQxNn0sCisgICAgezB4OEVBMiwgMHhEREExLCAweERERkUsIDB4MkQ3NH0sIHsweDhFQTIsIDB4REVBMSwgMHhERUZFLCAweDJERDJ9LAorICAgIHsweDhFQTIsIDB4REZBMSwgMHhERkZFLCAweDJFMzB9LCB7MHg4RUEyLCAweEUwQTEsIDB4RTBGRSwgMHgyRThFfSwKKyAgICB7MHg4RUEyLCAweEUxQTEsIDB4RTFGRSwgMHgyRUVDfSwgezB4OEVBMiwgMHhFMkExLCAweEUyRkUsIDB4MkY0QX0sCisgICAgezB4OEVBMiwgMHhFM0ExLCAweEUzRkUsIDB4MkZBOH0sIHsweDhFQTIsIDB4RTRBMSwgMHhFNEZFLCAweDMwMDZ9LAorICAgIHsweDhFQTIsIDB4RTVBMSwgMHhFNUZFLCAweDMwNjR9LCB7MHg4RUEyLCAweEU2QTEsIDB4RTZGRSwgMHgzMEMyfSwKKyAgICB7MHg4RUEyLCAweEU3QTEsIDB4RTdGRSwgMHgzMTIwfSwgezB4OEVBMiwgMHhFOEExLCAweEU4RkUsIDB4MzE3RX0sCisgICAgezB4OEVBMiwgMHhFOUExLCAweEU5RkUsIDB4MzFEQ30sIHsweDhFQTIsIDB4RUFBMSwgMHhFQUZFLCAweDMyM0F9LAorICAgIHsweDhFQTIsIDB4RUJBMSwgMHhFQkZFLCAweDMyOTh9LCB7MHg4RUEyLCAweEVDQTEsIDB4RUNGRSwgMHgzMkY2fSwKKyAgICB7MHg4RUEyLCAweEVEQTEsIDB4RURGRSwgMHgzMzU0fSwgezB4OEVBMiwgMHhFRUExLCAweEVFRkUsIDB4MzNCMn0sCisgICAgezB4OEVBMiwgMHhFRkExLCAweEVGRkUsIDB4MzQxMH0sIHsweDhFQTIsIDB4RjBBMSwgMHhGMEZFLCAweDM0NkV9LAorICAgIHsweDhFQTIsIDB4RjFBMSwgMHhGMUZFLCAweDM0Q0N9LCB7MHg4RUEyLCAweEYyQTEsIDB4RjJDNCwgMHgzNTJBfSwKIH07CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvY21hcHMvQ05TMS9DTlMtRVVDLVZfMC5jcHAgYi9jb3JlL2ZwZGZhcGkvY21hcHMvQ05TMS9DTlMtRVVDLVZfMC5jcHAKaW5kZXggMjA5MDk2OS4uMTY5ODEwNiAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL2NtYXBzL0NOUzEvQ05TLUVVQy1WXzAuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9jbWFwcy9DTlMxL0NOUy1FVUMtVl8wLmNwcApAQCAtNjksMTIxICs2OSwxMzYgQEAKICAgICAweEZCQTEsIDB4RkJGRSwgMHgxNjg1LCAweEZDQTEsIDB4RkNGRSwgMHgxNkUzLCAweEZEQTEsIDB4RkRDQiwgMHgxNzQxLAogfTsKIAotY29uc3QgdWludDE2X3QgZ19GWENNQVBfQ05TX0VVQ19WXzBfRFdvcmRbMjYxICogNF0gPSB7Ci0gICAgMHg4RUExLCAweEExQTEsIDB4QTFBQiwgMHgwMDYzLCAweDhFQTEsIDB4QTFBQywgMHhBMUFDLCAweDM1NEUsIDB4OEVBMSwKLSAgICAweEExQUQsIDB4QTFCQSwgMHgwMDZGLCAweDhFQTEsIDB4QTFCQiwgMHhBMUJCLCAweDAwN0MsIDB4OEVBMSwgMHhBMUJDLAotICAgIDB4QTFCQywgMHgwMDdFLCAweDhFQTEsIDB4QTFCRCwgMHhBMUJELCAweDAwN0UsIDB4OEVBMSwgMHhBMUJFLCAweEExQkYsCi0gICAgMHgwMDgyLCAweDhFQTEsIDB4QTFDMCwgMHhBMUMxLCAweDAwODIsIDB4OEVBMSwgMHhBMUMyLCAweEExQzMsIDB4MDA4NiwKLSAgICAweDhFQTEsIDB4QTFDNCwgMHhBMUM1LCAweDAwODYsIDB4OEVBMSwgMHhBMUM2LCAweEExQzcsIDB4MDA4QSwgMHg4RUExLAotICAgIDB4QTFDOCwgMHhBMUM5LCAweDAwOEEsIDB4OEVBMSwgMHhBMUNBLCAweEExQ0IsIDB4MDA4RSwgMHg4RUExLCAweEExQ0MsCi0gICAgMHhBMUNELCAweDAwOEUsIDB4OEVBMSwgMHhBMUNFLCAweEExQ0YsIDB4MDA5MiwgMHg4RUExLCAweEExRDAsIDB4QTFEMSwKLSAgICAweDAwOTIsIDB4OEVBMSwgMHhBMUQyLCAweEExRDMsIDB4MDA5NiwgMHg4RUExLCAweEExRDQsIDB4QTFENSwgMHgwMDk2LAotICAgIDB4OEVBMSwgMHhBMUQ2LCAweEExRDcsIDB4MDA5QSwgMHg4RUExLCAweEExRDgsIDB4QTFEOSwgMHgwMDlBLCAweDhFQTEsCi0gICAgMHhBMURBLCAweEExREIsIDB4MDA5RSwgMHg4RUExLCAweEExREMsIDB4QTFGRSwgMHgwMDlFLCAweDhFQTEsIDB4QTJBMSwKLSAgICAweEEyQzMsIDB4MDBDMSwgMHg4RUExLCAweEEyQzQsIDB4QTJDNCwgMHgzNTRGLCAweDhFQTEsIDB4QTJDNSwgMHhBMkZFLAotICAgIDB4MDBFNSwgMHg4RUExLCAweEEzQTEsIDB4QTNDRSwgMHgwMTFGLCAweDhFQTEsIDB4QTRBMSwgMHhBNEZFLCAweDAxNEQsCi0gICAgMHg4RUExLCAweEE1QTEsIDB4QTVFQywgMHgwMUFCLCAweDhFQTEsIDB4QTVFRSwgMHhBNUYwLCAweDAxRjcsIDB4OEVBMSwKLSAgICAweEE2QTEsIDB4QTZCRSwgMHgwMUZBLCAweDhFQTEsIDB4QTdBMSwgMHhBN0ExLCAweDAyNTMsIDB4OEVBMSwgMHhBN0EyLAotICAgIDB4QTdBNCwgMHgwMjE4LCAweDhFQTEsIDB4QTdBNSwgMHhBN0E1LCAweDAyNTQsIDB4OEVBMSwgMHhBN0E2LCAweEE3QTYsCi0gICAgMHgwMjFCLCAweDhFQTEsIDB4QTdBNywgMHhBN0E3LCAweDAyNUEsIDB4OEVBMSwgMHhBN0E4LCAweEE3QTgsIDB4MDIxQywKLSAgICAweDhFQTEsIDB4QTdBOSwgMHhBN0FDLCAweDAyNUIsIDB4OEVBMSwgMHhBN0FELCAweEE3QUYsIDB4MDIxRCwgMHg4RUExLAotICAgIDB4QTdCMCwgMHhBN0IwLCAweDAyNUYsIDB4OEVBMSwgMHhBN0IxLCAweEE3QjEsIDB4MTc2RSwgMHg4RUExLCAweEE3QjIsCi0gICAgMHhBN0IyLCAweDAyNjAsIDB4OEVBMSwgMHhBN0IzLCAweEE3QjMsIDB4MDI2MiwgMHg4RUExLCAweEE3QjQsIDB4QTdCNCwKLSAgICAweDAyMjAsIDB4OEVBMSwgMHhBN0I1LCAweEE3QjUsIDB4MDI2MywgMHg4RUExLCAweEE3QjYsIDB4QTdCNiwgMHgxNzZGLAotICAgIDB4OEVBMSwgMHhBN0I3LCAweEE3QjcsIDB4MDIyMSwgMHg4RUExLCAweEE3QjgsIDB4QTdCOSwgMHgwMjY0LCAweDhFQTEsCi0gICAgMHhBN0JBLCAweEE3QkEsIDB4MDIyMiwgMHg4RUExLCAweEE3QkIsIDB4QTdCQiwgMHgxNzcwLCAweDhFQTEsIDB4QTdCQywKLSAgICAweEE3QkMsIDB4MDIyMywgMHg4RUExLCAweEE3QkQsIDB4QTdCRCwgMHgwMjY2LCAweDhFQTEsIDB4QTdCRSwgMHhBN0JFLAotICAgIDB4MDI3OSwgMHg4RUExLCAweEE3QkYsIDB4QTdCRiwgMHgxNzc1LCAweDhFQTEsIDB4QTdDMCwgMHhBN0MxLCAweDAyN0EsCi0gICAgMHg4RUExLCAweEE3QzIsIDB4QTdDMiwgMHgwMjI0LCAweDhFQTEsIDB4QTdDMywgMHhBN0M2LCAweDAyN0MsIDB4OEVBMSwKLSAgICAweEE3QzcsIDB4QTdDNywgMHgwMjI1LCAweDhFQTEsIDB4QTdDOCwgMHhBN0NCLCAweDAyODIsIDB4OEVBMSwgMHhBN0NDLAotICAgIDB4QTdDQywgMHgxNzc2LCAweDhFQTEsIDB4QTdDRCwgMHhBN0NELCAweDAyODYsIDB4OEVBMSwgMHhBN0NFLCAweEE3Q0UsCi0gICAgMHgwMjI2LCAweDhFQTEsIDB4QTdDRiwgMHhBN0QwLCAweDAyODgsIDB4OEVBMSwgMHhBN0QxLCAweEE3RDIsIDB4MDI4QywKLSAgICAweDhFQTEsIDB4QTdEMywgMHhBN0Q1LCAweDAyMjcsIDB4OEVBMSwgMHhBN0Q2LCAweEE3RDgsIDB4MDI4RSwgMHg4RUExLAotICAgIDB4QTdEOSwgMHhBN0RBLCAweDAyMkEsIDB4OEVBMSwgMHhBN0RCLCAweEE3REIsIDB4MTc3NywgMHg4RUExLCAweEE3REMsCi0gICAgMHhBN0RGLCAweDAyRDAsIDB4OEVBMSwgMHhBN0UwLCAweEE3RTAsIDB4MDJENSwgMHg4RUExLCAweEE3RTEsIDB4QTdFMSwKLSAgICAweDAyMkMsIDB4OEVBMSwgMHhBN0UyLCAweEE3RTUsIDB4MDJENiwgMHg4RUExLCAweEE3RTYsIDB4QTdFNiwgMHgwMjJELAotICAgIDB4OEVBMSwgMHhBN0U3LCAweEE3RUQsIDB4MDJEQSwgMHg4RUExLCAweEE3RUUsIDB4QTdFRSwgMHgxNzhBLCAweDhFQTEsCi0gICAgMHhBN0VGLCAweEE3RjIsIDB4MDJFMSwgMHg4RUExLCAweEE3RjMsIDB4QTdGMywgMHgxNzhDLCAweDhFQTEsIDB4QTdGNCwKLSAgICAweEE3RjgsIDB4MDJFNSwgMHg4RUExLCAweEE3RjksIDB4QTdGOSwgMHgxNzhELCAweDhFQTEsIDB4QTdGQSwgMHhBN0ZELAotICAgIDB4MDJFQSwgMHg4RUExLCAweEE3RkUsIDB4QTdGRSwgMHgwMzU2LCAweDhFQTEsIDB4QThBMSwgMHhBOEE2LCAweDAzNTcsCi0gICAgMHg4RUExLCAweEE4QTcsIDB4QThBNywgMHgwMzVFLCAweDhFQTEsIDB4QThBOCwgMHhBOEE4LCAweDAzNjIsIDB4OEVBMSwKLSAgICAweEE4QTksIDB4QThBQSwgMHgwMjJFLCAweDhFQTEsIDB4QThBQiwgMHhBOEIyLCAweDAzNjMsIDB4OEVBMSwgMHhBOEIzLAotICAgIDB4QThCMywgMHgxN0IyLCAweDhFQTEsIDB4QThCNCwgMHhBOEI2LCAweDAzNkIsIDB4OEVBMSwgMHhBOEI3LCAweEE4QkEsCi0gICAgMHgwM0Y2LCAweDhFQTEsIDB4QThCQiwgMHhBOEJCLCAweDE4MTIsIDB4OEVBMSwgMHhBOEJDLCAweEE4QkUsIDB4MDNGQSwKLSAgICAweDhFQTEsIDB4QThCRiwgMHhBOEMzLCAweDAzRkUsIDB4OEVBMSwgMHhBOEM0LCAweEE4Q0MsIDB4MDQwNSwgMHg4RUExLAotICAgIDB4QThDRCwgMHhBOENELCAweDE4MTMsIDB4OEVBMSwgMHhBOENFLCAweEE4Q0UsIDB4MTgxOCwgMHg4RUExLCAweEE4Q0YsCi0gICAgMHhBOEQyLCAweDA0MEYsIDB4OEVBMSwgMHhBOEQzLCAweEE4RDMsIDB4MTgxOSwgMHg4RUExLCAweEE4RDQsIDB4QThEOSwKLSAgICAweDA1MDgsIDB4OEVBMSwgMHhBOERBLCAweEE4REEsIDB4MThFNywgMHg4RUExLCAweEE4REIsIDB4QThFMiwgMHgwNTBFLAotICAgIDB4OEVBMSwgMHhBOEUzLCAweEE4RTMsIDB4MDIzMCwgMHg4RUExLCAweEE4RTQsIDB4QThFNCwgMHgwNTFCLCAweDhFQTEsCi0gICAgMHhBOEU1LCAweEE4RTcsIDB4MDUyMCwgMHg4RUExLCAweEE4RTgsIDB4QThFQiwgMHgwNjk2LCAweDhFQTEsIDB4QThFQywKLSAgICAweEE4RUMsIDB4MDIzMSwgMHg4RUExLCAweEE4RUQsIDB4QThGMCwgMHgwNjlGLCAweDhFQTEsIDB4QThGMSwgMHhBOEZCLAotICAgIDB4MDgyNiwgMHg4RUExLCAweEE4RkMsIDB4QThGRSwgMHgwOUY1LCAweDhFQTEsIDB4QTlBMSwgMHhBOUExLCAweDFFMzMsCi0gICAgMHg4RUExLCAweEE5QTIsIDB4QTlBMiwgMHgwOUY4LCAweDhFQTEsIDB4QTlBMywgMHhBOUEzLCAweDFFMzQsIDB4OEVBMSwKLSAgICAweEE5QTQsIDB4QTlBNSwgMHgwOUY5LCAweDhFQTEsIDB4QTlBNiwgMHhBOUFCLCAweDBCRTEsIDB4OEVBMSwgMHhBOUFDLAotICAgIDB4QTlBRSwgMHgwREJCLCAweDhFQTEsIDB4QTlBRiwgMHhBOUFGLCAweDIzNjAsIDB4OEVBMSwgMHhBOUIwLCAweEE5QjAsCi0gICAgMHgyNjEyLCAweDhFQTEsIDB4QTlCMSwgMHhBOUIzLCAweDBGN0IsIDB4OEVBMSwgMHhBOUI0LCAweEE5QjUsIDB4MTEwMCwKLSAgICAweDhFQTEsIDB4QTlCNiwgMHhBOUI2LCAweDEyODksIDB4OEVBMSwgMHhBOUI3LCAweEE5QjgsIDB4MTNCMiwgMHg4RUExLAotICAgIDB4QTlCOSwgMHhBOUI5LCAweDJGMEQsIDB4OEVBMSwgMHhDMkExLCAweEMyQzEsIDB4MDIzMiwgMHg4RUExLCAweEM0QTEsCi0gICAgMHhDNEZFLCAweDAyNTMsIDB4OEVBMSwgMHhDNUExLCAweEM1RkUsIDB4MDJCMSwgMHg4RUExLCAweEM2QTEsIDB4QzZGRSwKLSAgICAweDAzMEYsIDB4OEVBMSwgMHhDN0ExLCAweEM3RkUsIDB4MDM2RCwgMHg4RUExLCAweEM4QTEsIDB4QzhGRSwgMHgwM0NCLAotICAgIDB4OEVBMSwgMHhDOUExLCAweEM5RkUsIDB4MDQyOSwgMHg4RUExLCAweENBQTEsIDB4Q0FGRSwgMHgwNDg3LCAweDhFQTEsCi0gICAgMHhDQkExLCAweENCRkUsIDB4MDRFNSwgMHg4RUExLCAweENDQTEsIDB4Q0NGRSwgMHgwNTQzLCAweDhFQTEsIDB4Q0RBMSwKLSAgICAweENERkUsIDB4MDVBMSwgMHg4RUExLCAweENFQTEsIDB4Q0VGRSwgMHgwNUZGLCAweDhFQTEsIDB4Q0ZBMSwgMHhDRkZFLAotICAgIDB4MDY1RCwgMHg4RUExLCAweEQwQTEsIDB4RDBGRSwgMHgwNkJCLCAweDhFQTEsIDB4RDFBMSwgMHhEMUZFLCAweDA3MTksCi0gICAgMHg4RUExLCAweEQyQTEsIDB4RDJGRSwgMHgwNzc3LCAweDhFQTEsIDB4RDNBMSwgMHhEM0ZFLCAweDA3RDUsIDB4OEVBMSwKLSAgICAweEQ0QTEsIDB4RDRGRSwgMHgwODMzLCAweDhFQTEsIDB4RDVBMSwgMHhENUZFLCAweDA4OTEsIDB4OEVBMSwgMHhENkExLAotICAgIDB4RDZGRSwgMHgwOEVGLCAweDhFQTEsIDB4RDdBMSwgMHhEN0ZFLCAweDA5NEQsIDB4OEVBMSwgMHhEOEExLCAweEQ4RkUsCi0gICAgMHgwOUFCLCAweDhFQTEsIDB4RDlBMSwgMHhEOUZFLCAweDBBMDksIDB4OEVBMSwgMHhEQUExLCAweERBRkUsIDB4MEE2NywKLSAgICAweDhFQTEsIDB4REJBMSwgMHhEQkZFLCAweDBBQzUsIDB4OEVBMSwgMHhEQ0ExLCAweERDRkUsIDB4MEIyMywgMHg4RUExLAotICAgIDB4RERBMSwgMHhEREZFLCAweDBCODEsIDB4OEVBMSwgMHhERUExLCAweERFRkUsIDB4MEJERiwgMHg4RUExLCAweERGQTEsCi0gICAgMHhERkZFLCAweDBDM0QsIDB4OEVBMSwgMHhFMEExLCAweEUwRkUsIDB4MEM5QiwgMHg4RUExLCAweEUxQTEsIDB4RTFGRSwKLSAgICAweDBDRjksIDB4OEVBMSwgMHhFMkExLCAweEUyRkUsIDB4MEQ1NywgMHg4RUExLCAweEUzQTEsIDB4RTNGRSwgMHgwREI1LAotICAgIDB4OEVBMSwgMHhFNEExLCAweEU0RkUsIDB4MEUxMywgMHg4RUExLCAweEU1QTEsIDB4RTVGRSwgMHgwRTcxLCAweDhFQTEsCi0gICAgMHhFNkExLCAweEU2RkUsIDB4MEVDRiwgMHg4RUExLCAweEU3QTEsIDB4RTdGRSwgMHgwRjJELCAweDhFQTEsIDB4RThBMSwKLSAgICAweEU4RkUsIDB4MEY4QiwgMHg4RUExLCAweEU5QTEsIDB4RTlGRSwgMHgwRkU5LCAweDhFQTEsIDB4RUFBMSwgMHhFQUZFLAotICAgIDB4MTA0NywgMHg4RUExLCAweEVCQTEsIDB4RUJGRSwgMHgxMEE1LCAweDhFQTEsIDB4RUNBMSwgMHhFQ0ZFLCAweDExMDMsCi0gICAgMHg4RUExLCAweEVEQTEsIDB4RURGRSwgMHgxMTYxLCAweDhFQTEsIDB4RUVBMSwgMHhFRUZFLCAweDExQkYsIDB4OEVBMSwKLSAgICAweEVGQTEsIDB4RUZGRSwgMHgxMjFELCAweDhFQTEsIDB4RjBBMSwgMHhGMEZFLCAweDEyN0IsIDB4OEVBMSwgMHhGMUExLAotICAgIDB4RjFGRSwgMHgxMkQ5LCAweDhFQTEsIDB4RjJBMSwgMHhGMkZFLCAweDEzMzcsIDB4OEVBMSwgMHhGM0ExLCAweEYzRkUsCi0gICAgMHgxMzk1LCAweDhFQTEsIDB4RjRBMSwgMHhGNEZFLCAweDEzRjMsIDB4OEVBMSwgMHhGNUExLCAweEY1RkUsIDB4MTQ1MSwKLSAgICAweDhFQTEsIDB4RjZBMSwgMHhGNkZFLCAweDE0QUYsIDB4OEVBMSwgMHhGN0ExLCAweEY3RkUsIDB4MTUwRCwgMHg4RUExLAotICAgIDB4RjhBMSwgMHhGOEZFLCAweDE1NkIsIDB4OEVBMSwgMHhGOUExLCAweEY5RkUsIDB4MTVDOSwgMHg4RUExLCAweEZBQTEsCi0gICAgMHhGQUZFLCAweDE2MjcsIDB4OEVBMSwgMHhGQkExLCAweEZCRkUsIDB4MTY4NSwgMHg4RUExLCAweEZDQTEsIDB4RkNGRSwKLSAgICAweDE2RTMsIDB4OEVBMSwgMHhGREExLCAweEZEQ0IsIDB4MTc0MSwgMHg4RUEyLCAweEExQTEsIDB4QTFGRSwgMHgxNzZDLAotICAgIDB4OEVBMiwgMHhBMkExLCAweEEyRkUsIDB4MTdDQSwgMHg4RUEyLCAweEEzQTEsIDB4QTNGRSwgMHgxODI4LCAweDhFQTIsCi0gICAgMHhBNEExLCAweEE0RkUsIDB4MTg4NiwgMHg4RUEyLCAweEE1QTEsIDB4QTVGRSwgMHgxOEU0LCAweDhFQTIsIDB4QTZBMSwKLSAgICAweEE2RkUsIDB4MTk0MiwgMHg4RUEyLCAweEE3QTEsIDB4QTdGRSwgMHgxOUEwLCAweDhFQTIsIDB4QThBMSwgMHhBOEZFLAotICAgIDB4MTlGRSwgMHg4RUEyLCAweEE5QTEsIDB4QTlGRSwgMHgxQTVDLCAweDhFQTIsIDB4QUFBMSwgMHhBQUZFLCAweDFBQkEsCi0gICAgMHg4RUEyLCAweEFCQTEsIDB4QUJGRSwgMHgxQjE4LCAweDhFQTIsIDB4QUNBMSwgMHhBQ0ZFLCAweDFCNzYsIDB4OEVBMiwKLSAgICAweEFEQTEsIDB4QURGRSwgMHgxQkQ0LCAweDhFQTIsIDB4QUVBMSwgMHhBRUZFLCAweDFDMzIsIDB4OEVBMiwgMHhBRkExLAotICAgIDB4QUZGRSwgMHgxQzkwLCAweDhFQTIsIDB4QjBBMSwgMHhCMEZFLCAweDFDRUUsIDB4OEVBMiwgMHhCMUExLCAweEIxRkUsCi0gICAgMHgxRDRDLCAweDhFQTIsIDB4QjJBMSwgMHhCMkZFLCAweDFEQUEsIDB4OEVBMiwgMHhCM0ExLCAweEIzRkUsIDB4MUUwOCwKLSAgICAweDhFQTIsIDB4QjRBMSwgMHhCNEZFLCAweDFFNjYsIDB4OEVBMiwgMHhCNUExLCAweEI1RkUsIDB4MUVDNCwgMHg4RUEyLAotICAgIDB4QjZBMSwgMHhCNkZFLCAweDFGMjIsIDB4OEVBMiwgMHhCN0ExLCAweEI3RkUsIDB4MUY4MCwgMHg4RUEyLCAweEI4QTEsCi0gICAgMHhCOEZFLCAweDFGREUsIDB4OEVBMiwgMHhCOUExLCAweEI5RkUsIDB4MjAzQywgMHg4RUEyLCAweEJBQTEsIDB4QkFGRSwKLSAgICAweDIwOUEsIDB4OEVBMiwgMHhCQkExLCAweEJCRkUsIDB4MjBGOCwgMHg4RUEyLCAweEJDQTEsIDB4QkNGRSwgMHgyMTU2LAotICAgIDB4OEVBMiwgMHhCREExLCAweEJERkUsIDB4MjFCNCwgMHg4RUEyLCAweEJFQTEsIDB4QkVGRSwgMHgyMjEyLCAweDhFQTIsCi0gICAgMHhCRkExLCAweEJGRkUsIDB4MjI3MCwgMHg4RUEyLCAweEMwQTEsIDB4QzBGRSwgMHgyMkNFLCAweDhFQTIsIDB4QzFBMSwKLSAgICAweEMxRkUsIDB4MjMyQywgMHg4RUEyLCAweEMyQTEsIDB4QzJGRSwgMHgyMzhBLCAweDhFQTIsIDB4QzNBMSwgMHhDM0ZFLAotICAgIDB4MjNFOCwgMHg4RUEyLCAweEM0QTEsIDB4QzRGRSwgMHgyNDQ2LCAweDhFQTIsIDB4QzVBMSwgMHhDNUZFLCAweDI0QTQsCi0gICAgMHg4RUEyLCAweEM2QTEsIDB4QzZGRSwgMHgyNTAyLCAweDhFQTIsIDB4QzdBMSwgMHhDN0ZFLCAweDI1NjAsIDB4OEVBMiwKLSAgICAweEM4QTEsIDB4QzhGRSwgMHgyNUJFLCAweDhFQTIsIDB4QzlBMSwgMHhDOUZFLCAweDI2MUMsIDB4OEVBMiwgMHhDQUExLAotICAgIDB4Q0FGRSwgMHgyNjdBLCAweDhFQTIsIDB4Q0JBMSwgMHhDQkZFLCAweDI2RDgsIDB4OEVBMiwgMHhDQ0ExLCAweENDRkUsCi0gICAgMHgyNzM2LCAweDhFQTIsIDB4Q0RBMSwgMHhDREZFLCAweDI3OTQsIDB4OEVBMiwgMHhDRUExLCAweENFRkUsIDB4MjdGMiwKLSAgICAweDhFQTIsIDB4Q0ZBMSwgMHhDRkZFLCAweDI4NTAsIDB4OEVBMiwgMHhEMEExLCAweEQwRkUsIDB4MjhBRSwgMHg4RUEyLAotICAgIDB4RDFBMSwgMHhEMUZFLCAweDI5MEMsIDB4OEVBMiwgMHhEMkExLCAweEQyRkUsIDB4Mjk2QSwgMHg4RUEyLCAweEQzQTEsCi0gICAgMHhEM0ZFLCAweDI5QzgsIDB4OEVBMiwgMHhENEExLCAweEQ0RkUsIDB4MkEyNiwgMHg4RUEyLCAweEQ1QTEsIDB4RDVGRSwKLSAgICAweDJBODQsIDB4OEVBMiwgMHhENkExLCAweEQ2RkUsIDB4MkFFMiwgMHg4RUEyLCAweEQ3QTEsIDB4RDdGRSwgMHgyQjQwLAotICAgIDB4OEVBMiwgMHhEOEExLCAweEQ4RkUsIDB4MkI5RSwgMHg4RUEyLCAweEQ5QTEsIDB4RDlGRSwgMHgyQkZDLCAweDhFQTIsCi0gICAgMHhEQUExLCAweERBRkUsIDB4MkM1QSwgMHg4RUEyLCAweERCQTEsIDB4REJGRSwgMHgyQ0I4LCAweDhFQTIsIDB4RENBMSwKLSAgICAweERDRkUsIDB4MkQxNiwgMHg4RUEyLCAweEREQTEsIDB4RERGRSwgMHgyRDc0LCAweDhFQTIsIDB4REVBMSwgMHhERUZFLAotICAgIDB4MkREMiwgMHg4RUEyLCAweERGQTEsIDB4REZGRSwgMHgyRTMwLCAweDhFQTIsIDB4RTBBMSwgMHhFMEZFLCAweDJFOEUsCi0gICAgMHg4RUEyLCAweEUxQTEsIDB4RTFGRSwgMHgyRUVDLCAweDhFQTIsIDB4RTJBMSwgMHhFMkZFLCAweDJGNEEsIDB4OEVBMiwKLSAgICAweEUzQTEsIDB4RTNGRSwgMHgyRkE4LCAweDhFQTIsIDB4RTRBMSwgMHhFNEZFLCAweDMwMDYsIDB4OEVBMiwgMHhFNUExLAotICAgIDB4RTVGRSwgMHgzMDY0LCAweDhFQTIsIDB4RTZBMSwgMHhFNkZFLCAweDMwQzIsIDB4OEVBMiwgMHhFN0ExLCAweEU3RkUsCi0gICAgMHgzMTIwLCAweDhFQTIsIDB4RThBMSwgMHhFOEZFLCAweDMxN0UsIDB4OEVBMiwgMHhFOUExLCAweEU5RkUsIDB4MzFEQywKLSAgICAweDhFQTIsIDB4RUFBMSwgMHhFQUZFLCAweDMyM0EsIDB4OEVBMiwgMHhFQkExLCAweEVCRkUsIDB4MzI5OCwgMHg4RUEyLAotICAgIDB4RUNBMSwgMHhFQ0ZFLCAweDMyRjYsIDB4OEVBMiwgMHhFREExLCAweEVERkUsIDB4MzM1NCwgMHg4RUEyLCAweEVFQTEsCi0gICAgMHhFRUZFLCAweDMzQjIsIDB4OEVBMiwgMHhFRkExLCAweEVGRkUsIDB4MzQxMCwgMHg4RUEyLCAweEYwQTEsIDB4RjBGRSwKLSAgICAweDM0NkUsIDB4OEVBMiwgMHhGMUExLCAweEYxRkUsIDB4MzRDQywgMHg4RUEyLCAweEYyQTEsIDB4RjJDNCwgMHgzNTJBLAorY29uc3QgRlhDTUFQX0RXb3JkQ0lETWFwIGdfRlhDTUFQX0NOU19FVUNfVl8wX0RXb3JkWzI2MV0gPSB7CisgICAgezB4OEVBMSwgMHhBMUExLCAweEExQUIsIDB4MDA2M30sIHsweDhFQTEsIDB4QTFBQywgMHhBMUFDLCAweDM1NEV9LAorICAgIHsweDhFQTEsIDB4QTFBRCwgMHhBMUJBLCAweDAwNkZ9LCB7MHg4RUExLCAweEExQkIsIDB4QTFCQiwgMHgwMDdDfSwKKyAgICB7MHg4RUExLCAweEExQkMsIDB4QTFCQywgMHgwMDdFfSwgezB4OEVBMSwgMHhBMUJELCAweEExQkQsIDB4MDA3RX0sCisgICAgezB4OEVBMSwgMHhBMUJFLCAweEExQkYsIDB4MDA4Mn0sIHsweDhFQTEsIDB4QTFDMCwgMHhBMUMxLCAweDAwODJ9LAorICAgIHsweDhFQTEsIDB4QTFDMiwgMHhBMUMzLCAweDAwODZ9LCB7MHg4RUExLCAweEExQzQsIDB4QTFDNSwgMHgwMDg2fSwKKyAgICB7MHg4RUExLCAweEExQzYsIDB4QTFDNywgMHgwMDhBfSwgezB4OEVBMSwgMHhBMUM4LCAweEExQzksIDB4MDA4QX0sCisgICAgezB4OEVBMSwgMHhBMUNBLCAweEExQ0IsIDB4MDA4RX0sIHsweDhFQTEsIDB4QTFDQywgMHhBMUNELCAweDAwOEV9LAorICAgIHsweDhFQTEsIDB4QTFDRSwgMHhBMUNGLCAweDAwOTJ9LCB7MHg4RUExLCAweEExRDAsIDB4QTFEMSwgMHgwMDkyfSwKKyAgICB7MHg4RUExLCAweEExRDIsIDB4QTFEMywgMHgwMDk2fSwgezB4OEVBMSwgMHhBMUQ0LCAweEExRDUsIDB4MDA5Nn0sCisgICAgezB4OEVBMSwgMHhBMUQ2LCAweEExRDcsIDB4MDA5QX0sIHsweDhFQTEsIDB4QTFEOCwgMHhBMUQ5LCAweDAwOUF9LAorICAgIHsweDhFQTEsIDB4QTFEQSwgMHhBMURCLCAweDAwOUV9LCB7MHg4RUExLCAweEExREMsIDB4QTFGRSwgMHgwMDlFfSwKKyAgICB7MHg4RUExLCAweEEyQTEsIDB4QTJDMywgMHgwMEMxfSwgezB4OEVBMSwgMHhBMkM0LCAweEEyQzQsIDB4MzU0Rn0sCisgICAgezB4OEVBMSwgMHhBMkM1LCAweEEyRkUsIDB4MDBFNX0sIHsweDhFQTEsIDB4QTNBMSwgMHhBM0NFLCAweDAxMUZ9LAorICAgIHsweDhFQTEsIDB4QTRBMSwgMHhBNEZFLCAweDAxNER9LCB7MHg4RUExLCAweEE1QTEsIDB4QTVFQywgMHgwMUFCfSwKKyAgICB7MHg4RUExLCAweEE1RUUsIDB4QTVGMCwgMHgwMUY3fSwgezB4OEVBMSwgMHhBNkExLCAweEE2QkUsIDB4MDFGQX0sCisgICAgezB4OEVBMSwgMHhBN0ExLCAweEE3QTEsIDB4MDI1M30sIHsweDhFQTEsIDB4QTdBMiwgMHhBN0E0LCAweDAyMTh9LAorICAgIHsweDhFQTEsIDB4QTdBNSwgMHhBN0E1LCAweDAyNTR9LCB7MHg4RUExLCAweEE3QTYsIDB4QTdBNiwgMHgwMjFCfSwKKyAgICB7MHg4RUExLCAweEE3QTcsIDB4QTdBNywgMHgwMjVBfSwgezB4OEVBMSwgMHhBN0E4LCAweEE3QTgsIDB4MDIxQ30sCisgICAgezB4OEVBMSwgMHhBN0E5LCAweEE3QUMsIDB4MDI1Qn0sIHsweDhFQTEsIDB4QTdBRCwgMHhBN0FGLCAweDAyMUR9LAorICAgIHsweDhFQTEsIDB4QTdCMCwgMHhBN0IwLCAweDAyNUZ9LCB7MHg4RUExLCAweEE3QjEsIDB4QTdCMSwgMHgxNzZFfSwKKyAgICB7MHg4RUExLCAweEE3QjIsIDB4QTdCMiwgMHgwMjYwfSwgezB4OEVBMSwgMHhBN0IzLCAweEE3QjMsIDB4MDI2Mn0sCisgICAgezB4OEVBMSwgMHhBN0I0LCAweEE3QjQsIDB4MDIyMH0sIHsweDhFQTEsIDB4QTdCNSwgMHhBN0I1LCAweDAyNjN9LAorICAgIHsweDhFQTEsIDB4QTdCNiwgMHhBN0I2LCAweDE3NkZ9LCB7MHg4RUExLCAweEE3QjcsIDB4QTdCNywgMHgwMjIxfSwKKyAgICB7MHg4RUExLCAweEE3QjgsIDB4QTdCOSwgMHgwMjY0fSwgezB4OEVBMSwgMHhBN0JBLCAweEE3QkEsIDB4MDIyMn0sCisgICAgezB4OEVBMSwgMHhBN0JCLCAweEE3QkIsIDB4MTc3MH0sIHsweDhFQTEsIDB4QTdCQywgMHhBN0JDLCAweDAyMjN9LAorICAgIHsweDhFQTEsIDB4QTdCRCwgMHhBN0JELCAweDAyNjZ9LCB7MHg4RUExLCAweEE3QkUsIDB4QTdCRSwgMHgwMjc5fSwKKyAgICB7MHg4RUExLCAweEE3QkYsIDB4QTdCRiwgMHgxNzc1fSwgezB4OEVBMSwgMHhBN0MwLCAweEE3QzEsIDB4MDI3QX0sCisgICAgezB4OEVBMSwgMHhBN0MyLCAweEE3QzIsIDB4MDIyNH0sIHsweDhFQTEsIDB4QTdDMywgMHhBN0M2LCAweDAyN0N9LAorICAgIHsweDhFQTEsIDB4QTdDNywgMHhBN0M3LCAweDAyMjV9LCB7MHg4RUExLCAweEE3QzgsIDB4QTdDQiwgMHgwMjgyfSwKKyAgICB7MHg4RUExLCAweEE3Q0MsIDB4QTdDQywgMHgxNzc2fSwgezB4OEVBMSwgMHhBN0NELCAweEE3Q0QsIDB4MDI4Nn0sCisgICAgezB4OEVBMSwgMHhBN0NFLCAweEE3Q0UsIDB4MDIyNn0sIHsweDhFQTEsIDB4QTdDRiwgMHhBN0QwLCAweDAyODh9LAorICAgIHsweDhFQTEsIDB4QTdEMSwgMHhBN0QyLCAweDAyOEN9LCB7MHg4RUExLCAweEE3RDMsIDB4QTdENSwgMHgwMjI3fSwKKyAgICB7MHg4RUExLCAweEE3RDYsIDB4QTdEOCwgMHgwMjhFfSwgezB4OEVBMSwgMHhBN0Q5LCAweEE3REEsIDB4MDIyQX0sCisgICAgezB4OEVBMSwgMHhBN0RCLCAweEE3REIsIDB4MTc3N30sIHsweDhFQTEsIDB4QTdEQywgMHhBN0RGLCAweDAyRDB9LAorICAgIHsweDhFQTEsIDB4QTdFMCwgMHhBN0UwLCAweDAyRDV9LCB7MHg4RUExLCAweEE3RTEsIDB4QTdFMSwgMHgwMjJDfSwKKyAgICB7MHg4RUExLCAweEE3RTIsIDB4QTdFNSwgMHgwMkQ2fSwgezB4OEVBMSwgMHhBN0U2LCAweEE3RTYsIDB4MDIyRH0sCisgICAgezB4OEVBMSwgMHhBN0U3LCAweEE3RUQsIDB4MDJEQX0sIHsweDhFQTEsIDB4QTdFRSwgMHhBN0VFLCAweDE3OEF9LAorICAgIHsweDhFQTEsIDB4QTdFRiwgMHhBN0YyLCAweDAyRTF9LCB7MHg4RUExLCAweEE3RjMsIDB4QTdGMywgMHgxNzhDfSwKKyAgICB7MHg4RUExLCAweEE3RjQsIDB4QTdGOCwgMHgwMkU1fSwgezB4OEVBMSwgMHhBN0Y5LCAweEE3RjksIDB4MTc4RH0sCisgICAgezB4OEVBMSwgMHhBN0ZBLCAweEE3RkQsIDB4MDJFQX0sIHsweDhFQTEsIDB4QTdGRSwgMHhBN0ZFLCAweDAzNTZ9LAorICAgIHsweDhFQTEsIDB4QThBMSwgMHhBOEE2LCAweDAzNTd9LCB7MHg4RUExLCAweEE4QTcsIDB4QThBNywgMHgwMzVFfSwKKyAgICB7MHg4RUExLCAweEE4QTgsIDB4QThBOCwgMHgwMzYyfSwgezB4OEVBMSwgMHhBOEE5LCAweEE4QUEsIDB4MDIyRX0sCisgICAgezB4OEVBMSwgMHhBOEFCLCAweEE4QjIsIDB4MDM2M30sIHsweDhFQTEsIDB4QThCMywgMHhBOEIzLCAweDE3QjJ9LAorICAgIHsweDhFQTEsIDB4QThCNCwgMHhBOEI2LCAweDAzNkJ9LCB7MHg4RUExLCAweEE4QjcsIDB4QThCQSwgMHgwM0Y2fSwKKyAgICB7MHg4RUExLCAweEE4QkIsIDB4QThCQiwgMHgxODEyfSwgezB4OEVBMSwgMHhBOEJDLCAweEE4QkUsIDB4MDNGQX0sCisgICAgezB4OEVBMSwgMHhBOEJGLCAweEE4QzMsIDB4MDNGRX0sIHsweDhFQTEsIDB4QThDNCwgMHhBOENDLCAweDA0MDV9LAorICAgIHsweDhFQTEsIDB4QThDRCwgMHhBOENELCAweDE4MTN9LCB7MHg4RUExLCAweEE4Q0UsIDB4QThDRSwgMHgxODE4fSwKKyAgICB7MHg4RUExLCAweEE4Q0YsIDB4QThEMiwgMHgwNDBGfSwgezB4OEVBMSwgMHhBOEQzLCAweEE4RDMsIDB4MTgxOX0sCisgICAgezB4OEVBMSwgMHhBOEQ0LCAweEE4RDksIDB4MDUwOH0sIHsweDhFQTEsIDB4QThEQSwgMHhBOERBLCAweDE4RTd9LAorICAgIHsweDhFQTEsIDB4QThEQiwgMHhBOEUyLCAweDA1MEV9LCB7MHg4RUExLCAweEE4RTMsIDB4QThFMywgMHgwMjMwfSwKKyAgICB7MHg4RUExLCAweEE4RTQsIDB4QThFNCwgMHgwNTFCfSwgezB4OEVBMSwgMHhBOEU1LCAweEE4RTcsIDB4MDUyMH0sCisgICAgezB4OEVBMSwgMHhBOEU4LCAweEE4RUIsIDB4MDY5Nn0sIHsweDhFQTEsIDB4QThFQywgMHhBOEVDLCAweDAyMzF9LAorICAgIHsweDhFQTEsIDB4QThFRCwgMHhBOEYwLCAweDA2OUZ9LCB7MHg4RUExLCAweEE4RjEsIDB4QThGQiwgMHgwODI2fSwKKyAgICB7MHg4RUExLCAweEE4RkMsIDB4QThGRSwgMHgwOUY1fSwgezB4OEVBMSwgMHhBOUExLCAweEE5QTEsIDB4MUUzM30sCisgICAgezB4OEVBMSwgMHhBOUEyLCAweEE5QTIsIDB4MDlGOH0sIHsweDhFQTEsIDB4QTlBMywgMHhBOUEzLCAweDFFMzR9LAorICAgIHsweDhFQTEsIDB4QTlBNCwgMHhBOUE1LCAweDA5Rjl9LCB7MHg4RUExLCAweEE5QTYsIDB4QTlBQiwgMHgwQkUxfSwKKyAgICB7MHg4RUExLCAweEE5QUMsIDB4QTlBRSwgMHgwREJCfSwgezB4OEVBMSwgMHhBOUFGLCAweEE5QUYsIDB4MjM2MH0sCisgICAgezB4OEVBMSwgMHhBOUIwLCAweEE5QjAsIDB4MjYxMn0sIHsweDhFQTEsIDB4QTlCMSwgMHhBOUIzLCAweDBGN0J9LAorICAgIHsweDhFQTEsIDB4QTlCNCwgMHhBOUI1LCAweDExMDB9LCB7MHg4RUExLCAweEE5QjYsIDB4QTlCNiwgMHgxMjg5fSwKKyAgICB7MHg4RUExLCAweEE5QjcsIDB4QTlCOCwgMHgxM0IyfSwgezB4OEVBMSwgMHhBOUI5LCAweEE5QjksIDB4MkYwRH0sCisgICAgezB4OEVBMSwgMHhDMkExLCAweEMyQzEsIDB4MDIzMn0sIHsweDhFQTEsIDB4QzRBMSwgMHhDNEZFLCAweDAyNTN9LAorICAgIHsweDhFQTEsIDB4QzVBMSwgMHhDNUZFLCAweDAyQjF9LCB7MHg4RUExLCAweEM2QTEsIDB4QzZGRSwgMHgwMzBGfSwKKyAgICB7MHg4RUExLCAweEM3QTEsIDB4QzdGRSwgMHgwMzZEfSwgezB4OEVBMSwgMHhDOEExLCAweEM4RkUsIDB4MDNDQn0sCisgICAgezB4OEVBMSwgMHhDOUExLCAweEM5RkUsIDB4MDQyOX0sIHsweDhFQTEsIDB4Q0FBMSwgMHhDQUZFLCAweDA0ODd9LAorICAgIHsweDhFQTEsIDB4Q0JBMSwgMHhDQkZFLCAweDA0RTV9LCB7MHg4RUExLCAweENDQTEsIDB4Q0NGRSwgMHgwNTQzfSwKKyAgICB7MHg4RUExLCAweENEQTEsIDB4Q0RGRSwgMHgwNUExfSwgezB4OEVBMSwgMHhDRUExLCAweENFRkUsIDB4MDVGRn0sCisgICAgezB4OEVBMSwgMHhDRkExLCAweENGRkUsIDB4MDY1RH0sIHsweDhFQTEsIDB4RDBBMSwgMHhEMEZFLCAweDA2QkJ9LAorICAgIHsweDhFQTEsIDB4RDFBMSwgMHhEMUZFLCAweDA3MTl9LCB7MHg4RUExLCAweEQyQTEsIDB4RDJGRSwgMHgwNzc3fSwKKyAgICB7MHg4RUExLCAweEQzQTEsIDB4RDNGRSwgMHgwN0Q1fSwgezB4OEVBMSwgMHhENEExLCAweEQ0RkUsIDB4MDgzM30sCisgICAgezB4OEVBMSwgMHhENUExLCAweEQ1RkUsIDB4MDg5MX0sIHsweDhFQTEsIDB4RDZBMSwgMHhENkZFLCAweDA4RUZ9LAorICAgIHsweDhFQTEsIDB4RDdBMSwgMHhEN0ZFLCAweDA5NER9LCB7MHg4RUExLCAweEQ4QTEsIDB4RDhGRSwgMHgwOUFCfSwKKyAgICB7MHg4RUExLCAweEQ5QTEsIDB4RDlGRSwgMHgwQTA5fSwgezB4OEVBMSwgMHhEQUExLCAweERBRkUsIDB4MEE2N30sCisgICAgezB4OEVBMSwgMHhEQkExLCAweERCRkUsIDB4MEFDNX0sIHsweDhFQTEsIDB4RENBMSwgMHhEQ0ZFLCAweDBCMjN9LAorICAgIHsweDhFQTEsIDB4RERBMSwgMHhEREZFLCAweDBCODF9LCB7MHg4RUExLCAweERFQTEsIDB4REVGRSwgMHgwQkRGfSwKKyAgICB7MHg4RUExLCAweERGQTEsIDB4REZGRSwgMHgwQzNEfSwgezB4OEVBMSwgMHhFMEExLCAweEUwRkUsIDB4MEM5Qn0sCisgICAgezB4OEVBMSwgMHhFMUExLCAweEUxRkUsIDB4MENGOX0sIHsweDhFQTEsIDB4RTJBMSwgMHhFMkZFLCAweDBENTd9LAorICAgIHsweDhFQTEsIDB4RTNBMSwgMHhFM0ZFLCAweDBEQjV9LCB7MHg4RUExLCAweEU0QTEsIDB4RTRGRSwgMHgwRTEzfSwKKyAgICB7MHg4RUExLCAweEU1QTEsIDB4RTVGRSwgMHgwRTcxfSwgezB4OEVBMSwgMHhFNkExLCAweEU2RkUsIDB4MEVDRn0sCisgICAgezB4OEVBMSwgMHhFN0ExLCAweEU3RkUsIDB4MEYyRH0sIHsweDhFQTEsIDB4RThBMSwgMHhFOEZFLCAweDBGOEJ9LAorICAgIHsweDhFQTEsIDB4RTlBMSwgMHhFOUZFLCAweDBGRTl9LCB7MHg4RUExLCAweEVBQTEsIDB4RUFGRSwgMHgxMDQ3fSwKKyAgICB7MHg4RUExLCAweEVCQTEsIDB4RUJGRSwgMHgxMEE1fSwgezB4OEVBMSwgMHhFQ0ExLCAweEVDRkUsIDB4MTEwM30sCisgICAgezB4OEVBMSwgMHhFREExLCAweEVERkUsIDB4MTE2MX0sIHsweDhFQTEsIDB4RUVBMSwgMHhFRUZFLCAweDExQkZ9LAorICAgIHsweDhFQTEsIDB4RUZBMSwgMHhFRkZFLCAweDEyMUR9LCB7MHg4RUExLCAweEYwQTEsIDB4RjBGRSwgMHgxMjdCfSwKKyAgICB7MHg4RUExLCAweEYxQTEsIDB4RjFGRSwgMHgxMkQ5fSwgezB4OEVBMSwgMHhGMkExLCAweEYyRkUsIDB4MTMzN30sCisgICAgezB4OEVBMSwgMHhGM0ExLCAweEYzRkUsIDB4MTM5NX0sIHsweDhFQTEsIDB4RjRBMSwgMHhGNEZFLCAweDEzRjN9LAorICAgIHsweDhFQTEsIDB4RjVBMSwgMHhGNUZFLCAweDE0NTF9LCB7MHg4RUExLCAweEY2QTEsIDB4RjZGRSwgMHgxNEFGfSwKKyAgICB7MHg4RUExLCAweEY3QTEsIDB4RjdGRSwgMHgxNTBEfSwgezB4OEVBMSwgMHhGOEExLCAweEY4RkUsIDB4MTU2Qn0sCisgICAgezB4OEVBMSwgMHhGOUExLCAweEY5RkUsIDB4MTVDOX0sIHsweDhFQTEsIDB4RkFBMSwgMHhGQUZFLCAweDE2Mjd9LAorICAgIHsweDhFQTEsIDB4RkJBMSwgMHhGQkZFLCAweDE2ODV9LCB7MHg4RUExLCAweEZDQTEsIDB4RkNGRSwgMHgxNkUzfSwKKyAgICB7MHg4RUExLCAweEZEQTEsIDB4RkRDQiwgMHgxNzQxfSwgezB4OEVBMiwgMHhBMUExLCAweEExRkUsIDB4MTc2Q30sCisgICAgezB4OEVBMiwgMHhBMkExLCAweEEyRkUsIDB4MTdDQX0sIHsweDhFQTIsIDB4QTNBMSwgMHhBM0ZFLCAweDE4Mjh9LAorICAgIHsweDhFQTIsIDB4QTRBMSwgMHhBNEZFLCAweDE4ODZ9LCB7MHg4RUEyLCAweEE1QTEsIDB4QTVGRSwgMHgxOEU0fSwKKyAgICB7MHg4RUEyLCAweEE2QTEsIDB4QTZGRSwgMHgxOTQyfSwgezB4OEVBMiwgMHhBN0ExLCAweEE3RkUsIDB4MTlBMH0sCisgICAgezB4OEVBMiwgMHhBOEExLCAweEE4RkUsIDB4MTlGRX0sIHsweDhFQTIsIDB4QTlBMSwgMHhBOUZFLCAweDFBNUN9LAorICAgIHsweDhFQTIsIDB4QUFBMSwgMHhBQUZFLCAweDFBQkF9LCB7MHg4RUEyLCAweEFCQTEsIDB4QUJGRSwgMHgxQjE4fSwKKyAgICB7MHg4RUEyLCAweEFDQTEsIDB4QUNGRSwgMHgxQjc2fSwgezB4OEVBMiwgMHhBREExLCAweEFERkUsIDB4MUJENH0sCisgICAgezB4OEVBMiwgMHhBRUExLCAweEFFRkUsIDB4MUMzMn0sIHsweDhFQTIsIDB4QUZBMSwgMHhBRkZFLCAweDFDOTB9LAorICAgIHsweDhFQTIsIDB4QjBBMSwgMHhCMEZFLCAweDFDRUV9LCB7MHg4RUEyLCAweEIxQTEsIDB4QjFGRSwgMHgxRDRDfSwKKyAgICB7MHg4RUEyLCAweEIyQTEsIDB4QjJGRSwgMHgxREFBfSwgezB4OEVBMiwgMHhCM0ExLCAweEIzRkUsIDB4MUUwOH0sCisgICAgezB4OEVBMiwgMHhCNEExLCAweEI0RkUsIDB4MUU2Nn0sIHsweDhFQTIsIDB4QjVBMSwgMHhCNUZFLCAweDFFQzR9LAorICAgIHsweDhFQTIsIDB4QjZBMSwgMHhCNkZFLCAweDFGMjJ9LCB7MHg4RUEyLCAweEI3QTEsIDB4QjdGRSwgMHgxRjgwfSwKKyAgICB7MHg4RUEyLCAweEI4QTEsIDB4QjhGRSwgMHgxRkRFfSwgezB4OEVBMiwgMHhCOUExLCAweEI5RkUsIDB4MjAzQ30sCisgICAgezB4OEVBMiwgMHhCQUExLCAweEJBRkUsIDB4MjA5QX0sIHsweDhFQTIsIDB4QkJBMSwgMHhCQkZFLCAweDIwRjh9LAorICAgIHsweDhFQTIsIDB4QkNBMSwgMHhCQ0ZFLCAweDIxNTZ9LCB7MHg4RUEyLCAweEJEQTEsIDB4QkRGRSwgMHgyMUI0fSwKKyAgICB7MHg4RUEyLCAweEJFQTEsIDB4QkVGRSwgMHgyMjEyfSwgezB4OEVBMiwgMHhCRkExLCAweEJGRkUsIDB4MjI3MH0sCisgICAgezB4OEVBMiwgMHhDMEExLCAweEMwRkUsIDB4MjJDRX0sIHsweDhFQTIsIDB4QzFBMSwgMHhDMUZFLCAweDIzMkN9LAorICAgIHsweDhFQTIsIDB4QzJBMSwgMHhDMkZFLCAweDIzOEF9LCB7MHg4RUEyLCAweEMzQTEsIDB4QzNGRSwgMHgyM0U4fSwKKyAgICB7MHg4RUEyLCAweEM0QTEsIDB4QzRGRSwgMHgyNDQ2fSwgezB4OEVBMiwgMHhDNUExLCAweEM1RkUsIDB4MjRBNH0sCisgICAgezB4OEVBMiwgMHhDNkExLCAweEM2RkUsIDB4MjUwMn0sIHsweDhFQTIsIDB4QzdBMSwgMHhDN0ZFLCAweDI1NjB9LAorICAgIHsweDhFQTIsIDB4QzhBMSwgMHhDOEZFLCAweDI1QkV9LCB7MHg4RUEyLCAweEM5QTEsIDB4QzlGRSwgMHgyNjFDfSwKKyAgICB7MHg4RUEyLCAweENBQTEsIDB4Q0FGRSwgMHgyNjdBfSwgezB4OEVBMiwgMHhDQkExLCAweENCRkUsIDB4MjZEOH0sCisgICAgezB4OEVBMiwgMHhDQ0ExLCAweENDRkUsIDB4MjczNn0sIHsweDhFQTIsIDB4Q0RBMSwgMHhDREZFLCAweDI3OTR9LAorICAgIHsweDhFQTIsIDB4Q0VBMSwgMHhDRUZFLCAweDI3RjJ9LCB7MHg4RUEyLCAweENGQTEsIDB4Q0ZGRSwgMHgyODUwfSwKKyAgICB7MHg4RUEyLCAweEQwQTEsIDB4RDBGRSwgMHgyOEFFfSwgezB4OEVBMiwgMHhEMUExLCAweEQxRkUsIDB4MjkwQ30sCisgICAgezB4OEVBMiwgMHhEMkExLCAweEQyRkUsIDB4Mjk2QX0sIHsweDhFQTIsIDB4RDNBMSwgMHhEM0ZFLCAweDI5Qzh9LAorICAgIHsweDhFQTIsIDB4RDRBMSwgMHhENEZFLCAweDJBMjZ9LCB7MHg4RUEyLCAweEQ1QTEsIDB4RDVGRSwgMHgyQTg0fSwKKyAgICB7MHg4RUEyLCAweEQ2QTEsIDB4RDZGRSwgMHgyQUUyfSwgezB4OEVBMiwgMHhEN0ExLCAweEQ3RkUsIDB4MkI0MH0sCisgICAgezB4OEVBMiwgMHhEOEExLCAweEQ4RkUsIDB4MkI5RX0sIHsweDhFQTIsIDB4RDlBMSwgMHhEOUZFLCAweDJCRkN9LAorICAgIHsweDhFQTIsIDB4REFBMSwgMHhEQUZFLCAweDJDNUF9LCB7MHg4RUEyLCAweERCQTEsIDB4REJGRSwgMHgyQ0I4fSwKKyAgICB7MHg4RUEyLCAweERDQTEsIDB4RENGRSwgMHgyRDE2fSwgezB4OEVBMiwgMHhEREExLCAweERERkUsIDB4MkQ3NH0sCisgICAgezB4OEVBMiwgMHhERUExLCAweERFRkUsIDB4MkREMn0sIHsweDhFQTIsIDB4REZBMSwgMHhERkZFLCAweDJFMzB9LAorICAgIHsweDhFQTIsIDB4RTBBMSwgMHhFMEZFLCAweDJFOEV9LCB7MHg4RUEyLCAweEUxQTEsIDB4RTFGRSwgMHgyRUVDfSwKKyAgICB7MHg4RUEyLCAweEUyQTEsIDB4RTJGRSwgMHgyRjRBfSwgezB4OEVBMiwgMHhFM0ExLCAweEUzRkUsIDB4MkZBOH0sCisgICAgezB4OEVBMiwgMHhFNEExLCAweEU0RkUsIDB4MzAwNn0sIHsweDhFQTIsIDB4RTVBMSwgMHhFNUZFLCAweDMwNjR9LAorICAgIHsweDhFQTIsIDB4RTZBMSwgMHhFNkZFLCAweDMwQzJ9LCB7MHg4RUEyLCAweEU3QTEsIDB4RTdGRSwgMHgzMTIwfSwKKyAgICB7MHg4RUEyLCAweEU4QTEsIDB4RThGRSwgMHgzMTdFfSwgezB4OEVBMiwgMHhFOUExLCAweEU5RkUsIDB4MzFEQ30sCisgICAgezB4OEVBMiwgMHhFQUExLCAweEVBRkUsIDB4MzIzQX0sIHsweDhFQTIsIDB4RUJBMSwgMHhFQkZFLCAweDMyOTh9LAorICAgIHsweDhFQTIsIDB4RUNBMSwgMHhFQ0ZFLCAweDMyRjZ9LCB7MHg4RUEyLCAweEVEQTEsIDB4RURGRSwgMHgzMzU0fSwKKyAgICB7MHg4RUEyLCAweEVFQTEsIDB4RUVGRSwgMHgzM0IyfSwgezB4OEVBMiwgMHhFRkExLCAweEVGRkUsIDB4MzQxMH0sCisgICAgezB4OEVBMiwgMHhGMEExLCAweEYwRkUsIDB4MzQ2RX0sIHsweDhFQTIsIDB4RjFBMSwgMHhGMUZFLCAweDM0Q0N9LAorICAgIHsweDhFQTIsIDB4RjJBMSwgMHhGMkM0LCAweDM1MkF9LAogfTsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9jbWFwcy9DTlMxL2NtYXBzX2NuczEuY3BwIGIvY29yZS9mcGRmYXBpL2NtYXBzL0NOUzEvY21hcHNfY25zMS5jcHAKaW5kZXggYTFiYmVmYy4uNTA3NmZjZCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL2NtYXBzL0NOUzEvY21hcHNfY25zMS5jcHAKKysrIGIvY29yZS9mcGRmYXBpL2NtYXBzL0NOUzEvY21hcHNfY25zMS5jcHAKQEAgLTgsNDkgKzgsNDEgQEAKIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9jbWFwcy9jbWFwX2ludC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9jcGRmX21vZHVsZW1nci5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2ZvbnRfaW50LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9mb250Z2xvYmFscy5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW1vZHVsZS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKIAogc3RhdGljIGNvbnN0IEZYQ01BUF9DTWFwIGdfRlhDTUFQX0NOUzFfY21hcHNbXSA9IHsKLSAgICB7IkI1cGMtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfQjVwY19IXzAsIDI0NywgRlhDTUFQX0NNYXA6Ok5vbmUsCi0gICAgIG51bGxwdHIsIDAsIDB9LAotICAgIHsiQjVwYy1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9CNXBjX1ZfMCwgMTIsIEZYQ01BUF9DTWFwOjpOb25lLAotICAgICBudWxscHRyLCAwLCAtMX0sCi0gICAgeyJIS3Njcy1CNS1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9IS3Njc19CNV9IXzUsIDEyMTAsCi0gICAgIEZYQ01BUF9DTWFwOjpOb25lLCBudWxscHRyLCAwLCAwfSwKLSAgICB7IkhLc2NzLUI1LVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0hLc2NzX0I1X1ZfNSwgMTMsCi0gICAgIEZYQ01BUF9DTWFwOjpOb25lLCBudWxscHRyLCAwLCAtMX0sCi0gICAgeyJFVGVuLUI1LUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0VUZW5fQjVfSF8wLCAyNTQsCi0gICAgIEZYQ01BUF9DTWFwOjpOb25lLCBudWxscHRyLCAwLCAwfSwKLSAgICB7IkVUZW4tQjUtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfRVRlbl9CNV9WXzAsIDEzLAotICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgbnVsbHB0ciwgMCwgLTF9LAotICAgIHsiRVRlbm1zLUI1LUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0VUZW5tc19CNV9IXzAsIDEsCi0gICAgIEZYQ01BUF9DTWFwOjpOb25lLCBudWxscHRyLCAwLCAtMn0sCi0gICAgeyJFVGVubXMtQjUtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfRVRlbm1zX0I1X1ZfMCwgMTgsCi0gICAgIEZYQ01BUF9DTWFwOjpOb25lLCBudWxscHRyLCAwLCAtMX0sCi0gICAgeyJDTlMtRVVDLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0NOU19FVUNfSF8wLCAxNTcsCi0gICAgIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfQ05TX0VVQ19IXzBfRFdvcmQsIDIzOCwgMH0sCi0gICAgeyJDTlMtRVVDLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0NOU19FVUNfVl8wLCAxODAsCi0gICAgIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfQ05TX0VVQ19WXzBfRFdvcmQsIDI2MSwgMH0sCi0gICAgeyJVbmlDTlMtVUNTMi1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9VbmlDTlNfVUNTMl9IXzMsIDE2NDE4LAotICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgbnVsbHB0ciwgMCwgMH0sCi0gICAgeyJVbmlDTlMtVUNTMi1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9VbmlDTlNfVUNTMl9WXzMsIDEzLAotICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgbnVsbHB0ciwgMCwgLTF9LAotICAgIHsiVW5pQ05TLVVURjE2LUgiLCBGWENNQVBfQ01hcDo6U2luZ2xlLCBnX0ZYQ01BUF9VbmlDTlNfVVRGMTZfSF8wLCAxNDU1NywKLSAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIG51bGxwdHIsIDAsIDB9LAotICAgIHsiVW5pQ05TLVVURjE2LVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX1VuaUNOU19VQ1MyX1ZfMywgMTMsCi0gICAgIEZYQ01BUF9DTWFwOjpOb25lLCBudWxscHRyLCAwLCAtMX0sCisgICAgeyJCNXBjLUgiLCBnX0ZYQ01BUF9CNXBjX0hfMCwgbnVsbHB0ciwgMjQ3LCAwLCBGWENNQVBfQ01hcDo6UmFuZ2UsIDB9LAorICAgIHsiQjVwYy1WIiwgZ19GWENNQVBfQjVwY19WXzAsIG51bGxwdHIsIDEyLCAwLCBGWENNQVBfQ01hcDo6UmFuZ2UsIC0xfSwKKyAgICB7IkhLc2NzLUI1LUgiLCBnX0ZYQ01BUF9IS3Njc19CNV9IXzUsIG51bGxwdHIsIDEyMTAsIDAsIEZYQ01BUF9DTWFwOjpSYW5nZSwKKyAgICAgMH0sCisgICAgeyJIS3Njcy1CNS1WIiwgZ19GWENNQVBfSEtzY3NfQjVfVl81LCBudWxscHRyLCAxMywgMCwgRlhDTUFQX0NNYXA6OlJhbmdlLAorICAgICAtMX0sCisgICAgeyJFVGVuLUI1LUgiLCBnX0ZYQ01BUF9FVGVuX0I1X0hfMCwgbnVsbHB0ciwgMjU0LCAwLCBGWENNQVBfQ01hcDo6UmFuZ2UsIDB9LAorICAgIHsiRVRlbi1CNS1WIiwgZ19GWENNQVBfRVRlbl9CNV9WXzAsIG51bGxwdHIsIDEzLCAwLCBGWENNQVBfQ01hcDo6UmFuZ2UsIC0xfSwKKyAgICB7IkVUZW5tcy1CNS1IIiwgZ19GWENNQVBfRVRlbm1zX0I1X0hfMCwgbnVsbHB0ciwgMSwgMCwgRlhDTUFQX0NNYXA6OlJhbmdlLAorICAgICAtMn0sCisgICAgeyJFVGVubXMtQjUtViIsIGdfRlhDTUFQX0VUZW5tc19CNV9WXzAsIG51bGxwdHIsIDE4LCAwLCBGWENNQVBfQ01hcDo6UmFuZ2UsCisgICAgIC0xfSwKKyAgICB7IkNOUy1FVUMtSCIsIGdfRlhDTUFQX0NOU19FVUNfSF8wLCBnX0ZYQ01BUF9DTlNfRVVDX0hfMF9EV29yZCwgMTU3LCAyMzgsCisgICAgIEZYQ01BUF9DTWFwOjpSYW5nZSwgMH0sCisgICAgeyJDTlMtRVVDLVYiLCBnX0ZYQ01BUF9DTlNfRVVDX1ZfMCwgZ19GWENNQVBfQ05TX0VVQ19WXzBfRFdvcmQsIDE4MCwgMjYxLAorICAgICBGWENNQVBfQ01hcDo6UmFuZ2UsIDB9LAorICAgIHsiVW5pQ05TLVVDUzItSCIsIGdfRlhDTUFQX1VuaUNOU19VQ1MyX0hfMywgbnVsbHB0ciwgMTY0MTgsIDAsCisgICAgIEZYQ01BUF9DTWFwOjpSYW5nZSwgMH0sCisgICAgeyJVbmlDTlMtVUNTMi1WIiwgZ19GWENNQVBfVW5pQ05TX1VDUzJfVl8zLCBudWxscHRyLCAxMywgMCwKKyAgICAgRlhDTUFQX0NNYXA6OlJhbmdlLCAtMX0sCisgICAgeyJVbmlDTlMtVVRGMTYtSCIsIGdfRlhDTUFQX1VuaUNOU19VVEYxNl9IXzAsIG51bGxwdHIsIDE0NTU3LCAwLAorICAgICBGWENNQVBfQ01hcDo6U2luZ2xlLCAwfSwKKyAgICB7IlVuaUNOUy1VVEYxNi1WIiwgZ19GWENNQVBfVW5pQ05TX1VDUzJfVl8zLCBudWxscHRyLCAxMywgMCwKKyAgICAgRlhDTUFQX0NNYXA6OlJhbmdlLCAtMX0sCiB9OwogCiB2b2lkIENQREZfTW9kdWxlTWdyOjpMb2FkRW1iZWRkZWRDTlMxQ01hcHMoKSB7CiAgIENQREZfRm9udEdsb2JhbHMqIHBGb250R2xvYmFscyA9CiAgICAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+R2V0Rm9udEdsb2JhbHMoKTsKLSAgcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkQ2hhcnNldHNbQ0lEU0VUX0NOUzFdLm1fcE1hcExpc3QgPQotICAgICAgZ19GWENNQVBfQ05TMV9jbWFwczsKLSAgcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkQ2hhcnNldHNbQ0lEU0VUX0NOUzFdLm1fQ291bnQgPQotICAgICAgRlhfQXJyYXlTaXplKGdfRlhDTUFQX0NOUzFfY21hcHMpOwotICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9DTlMxXS5tX3BNYXAgPQotICAgICAgZ19GWENNQVBfQ05TMUNJRDJVbmljb2RlXzU7Ci0gIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbQ0lEU0VUX0NOUzFdLm1fQ291bnQgPSAxOTA4ODsKKyAgcEZvbnRHbG9iYWxzLT5TZXRFbWJlZGRlZENoYXJzZXQoQ0lEU0VUX0NOUzEsIGdfRlhDTUFQX0NOUzFfY21hcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShnX0ZYQ01BUF9DTlMxX2NtYXBzKSk7CisgIHBGb250R2xvYmFscy0+U2V0RW1iZWRkZWRUb1VuaWNvZGUoQ0lEU0VUX0NOUzEsIGdfRlhDTUFQX0NOUzFDSUQyVW5pY29kZV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MDg4KTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9jbWFwcy9DTlMxL2NtYXBzX2NuczEuaCBiL2NvcmUvZnBkZmFwaS9jbWFwcy9DTlMxL2NtYXBzX2NuczEuaAppbmRleCBhODdhNDdmLi42MjdmZWI3IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvY21hcHMvQ05TMS9jbWFwc19jbnMxLmgKKysrIGIvY29yZS9mcGRmYXBpL2NtYXBzL0NOUzEvY21hcHNfY25zMS5oCkBAIC05LDYgKzksOCBAQAogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvY21hcHMvY21hcF9pbnQuaCIKKwogZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGdfRlhDTUFQX0I1cGNfSF8wW107CiBleHRlcm4gY29uc3QgdWludDE2X3QgZ19GWENNQVBfQjVwY19WXzBbXTsKIGV4dGVybiBjb25zdCB1aW50MTZfdCBnX0ZYQ01BUF9IS3Njc19CNV9IXzVbXTsKQEAgLTE4LDkgKzIwLDkgQEAKIGV4dGVybiBjb25zdCB1aW50MTZfdCBnX0ZYQ01BUF9FVGVubXNfQjVfSF8wW107CiBleHRlcm4gY29uc3QgdWludDE2X3QgZ19GWENNQVBfRVRlbm1zX0I1X1ZfMFtdOwogZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGdfRlhDTUFQX0NOU19FVUNfSF8wW107Ci1leHRlcm4gY29uc3QgdWludDE2X3QgZ19GWENNQVBfQ05TX0VVQ19IXzBfRFdvcmRbXTsKK2V4dGVybiBjb25zdCBGWENNQVBfRFdvcmRDSURNYXAgZ19GWENNQVBfQ05TX0VVQ19IXzBfRFdvcmRbXTsKIGV4dGVybiBjb25zdCB1aW50MTZfdCBnX0ZYQ01BUF9DTlNfRVVDX1ZfMFtdOwotZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGdfRlhDTUFQX0NOU19FVUNfVl8wX0RXb3JkW107CitleHRlcm4gY29uc3QgRlhDTUFQX0RXb3JkQ0lETWFwIGdfRlhDTUFQX0NOU19FVUNfVl8wX0RXb3JkW107CiBleHRlcm4gY29uc3QgdWludDE2X3QgZ19GWENNQVBfVW5pQ05TX1VDUzJfSF8zW107CiBleHRlcm4gY29uc3QgdWludDE2X3QgZ19GWENNQVBfVW5pQ05TX1VDUzJfVl8zW107CiBleHRlcm4gY29uc3QgdWludDE2X3QgZ19GWENNQVBfVW5pQ05TX1VURjE2X0hfMFtdOwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2NtYXBzL0dCMS9HQksySy1IXzUuY3BwIGIvY29yZS9mcGRmYXBpL2NtYXBzL0dCMS9HQksySy1IXzUuY3BwCmluZGV4IDM3Yjg4MDMuLjdkN2I0OGEgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9jbWFwcy9HQjEvR0JLMkstSF81LmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvY21hcHMvR0IxL0dCSzJLLUhfNS5jcHAKQEAgLTEzNjYsNDU3ICsxMzY2LDUxNCBAQAogICAgIDB4RkU0MCwgMHhGRTQwLCAweDEyNTksIDB4RkU0MSwgMHhGRTdFLCAweDU2MTAsIDB4RkU4MCwgMHhGRUEwLCAweDU2NEUsCiB9OwogCi1jb25zdCB1aW50MTZfdCBnX0ZYQ01BUF9HQksyS19IXzVfRFdvcmRbMTAxNyAqIDRdID0gewotICAgIDB4ODEzMCwgMHg4NDM2LCAweDg0MzYsIDB4NTc1MiwgMHg4MTM4LCAweEZEMzgsIDB4RkQzOSwgMHg1NzlDLCAweDgxMzgsCi0gICAgMHhGRTMwLCAweEZFMzksIDB4NTc5RSwgMHg4MTM5LCAweDgxMzAsIDB4ODEzNywgMHg1N0E4LCAweDgxMzksIDB4ODEzOSwKLSAgICAweDgxMzksIDB4NTdCMCwgMHg4MTM5LCAweDgyMzAsIDB4ODIzOSwgMHg1N0IxLCAweDgxMzksIDB4ODMzMCwgMHg4MzM5LAotICAgIDB4NTdCQiwgMHg4MTM5LCAweDg0MzAsIDB4ODQzOSwgMHg1N0M1LCAweDgxMzksIDB4ODUzMCwgMHg4NTM5LCAweDU3Q0YsCi0gICAgMHg4MTM5LCAweDg2MzAsIDB4ODYzOSwgMHg1N0Q5LCAweDgxMzksIDB4ODczMCwgMHg4NzM5LCAweDU3RTMsIDB4ODEzOSwKLSAgICAweDg4MzAsIDB4ODgzOSwgMHg1N0VELCAweDgxMzksIDB4ODkzMCwgMHg4OTM5LCAweDU3RjcsIDB4ODEzOSwgMHg4QjMyLAotICAgIDB4OEIzMiwgMHgxMDQyLCAweDgxMzksIDB4OEIzMywgMHg4QjMzLCAweDEyNjMsIDB4ODEzOSwgMHg4QjM0LCAweDhCMzQsCi0gICAgMHgxMjcyLCAweDgxMzksIDB4OEIzNSwgMHg4QjM1LCAweDEyNjUsIDB4ODEzOSwgMHg4QjM2LCAweDhCMzYsIDB4MTA1OSwKLSAgICAweDgxMzksIDB4OEIzNywgMHg4QjM3LCAweDI3OTMsIDB4ODEzOSwgMHg4QjM4LCAweDhCMzgsIDB4MDYzRCwgMHg4MTM5LAotICAgIDB4OEIzOSwgMHg4QjM5LCAweDEzMDMsIDB4ODEzOSwgMHg4QzMwLCAweDhDMzAsIDB4MENBNiwgMHg4MTM5LCAweDhDMzEsCi0gICAgMHg4QzMxLCAweDA2MzgsIDB4ODEzOSwgMHg4QzMyLCAweDhDMzIsIDB4MENDNiwgMHg4MTM5LCAweDhDMzMsIDB4OEMzMywKLSAgICAweDAzRDYsIDB4ODEzOSwgMHg4QzM0LCAweDhDMzQsIDB4MTI5RCwgMHg4MTM5LCAweDhDMzUsIDB4OEMzNSwgMHgxMzE0LAotICAgIDB4ODEzOSwgMHg4QzM2LCAweDhDMzYsIDB4MTMwRiwgMHg4MTM5LCAweDhDMzcsIDB4OEMzNywgMHgwODJCLCAweDgxMzksCi0gICAgMHg4QzM4LCAweDhDMzgsIDB4MTM5OSwgMHg4MTM5LCAweDhDMzksIDB4OEMzOSwgMHgwNTk3LCAweDgxMzksIDB4OEQzMCwKLSAgICAweDhEMzAsIDB4MDlFRiwgMHg4MTM5LCAweDhEMzEsIDB4OEQzMSwgMHgxMkZDLCAweDgxMzksIDB4OEQzMiwgMHg4RDMyLAotICAgIDB4MTI2NiwgMHg4MTM5LCAweDhEMzMsIDB4OEQzMywgMHgxMjg0LCAweDgxMzksIDB4OEQzNCwgMHg4RDM0LCAweDJBMUEsCi0gICAgMHg4MTM5LCAweDhEMzUsIDB4OEQzNSwgMHgwRDQ1LCAweDgxMzksIDB4OEQzNiwgMHg4RDM2LCAweDA0N0UsIDB4ODEzOSwKLSAgICAweDhEMzcsIDB4OEQzNywgMHgxMzUyLCAweDgxMzksIDB4OEQzOCwgMHg4RDM4LCAweDA0Q0MsIDB4ODEzOSwgMHg4RDM5LAotICAgIDB4OEQzOSwgMHgxMzlDLCAweDgxMzksIDB4OEUzMCwgMHg4RTMwLCAweDEwQkIsIDB4ODEzOSwgMHg4RTMxLCAweDhFMzEsCi0gICAgMHgwOTY3LCAweDgxMzksIDB4OEUzMiwgMHg4RTMyLCAweDE1OTMsIDB4ODEzOSwgMHg4RTMzLCAweDhFMzMsIDB4MEU3MiwKLSAgICAweDgxMzksIDB4OEUzNCwgMHg4RTM0LCAweDBENTYsIDB4ODEzOSwgMHg4RTM1LCAweDhFMzUsIDB4MTYxQywgMHg4MTM5LAotICAgIDB4OEUzNiwgMHg4RTM2LCAweDJEMkQsIDB4ODEzOSwgMHg4RTM3LCAweDhFMzcsIDB4MEYxMywgMHg4MTM5LCAweDhFMzgsCi0gICAgMHg4RTM4LCAweDA1NzYsIDB4ODEzOSwgMHg4RTM5LCAweDhFMzksIDB4MEI2RiwgMHg4MTM5LCAweDhGMzAsIDB4OEYzMCwKLSAgICAweDEyMzAsIDB4ODEzOSwgMHg4RjMxLCAweDhGMzEsIDB4MTcyRSwgMHg4MTM5LCAweDhGMzIsIDB4OEYzMiwgMHgwNTZBLAotICAgIDB4ODEzOSwgMHg4RjMzLCAweDhGMzMsIDB4MEY2QywgMHg4MTM5LCAweDhGMzQsIDB4OEYzNCwgMHgxNEI2LCAweDgxMzksCi0gICAgMHg4RjM1LCAweDhGMzUsIDB4MEQ0MywgMHg4MTM5LCAweDhGMzYsIDB4OEYzNiwgMHgxNzc0LCAweDgxMzksIDB4OEYzNywKLSAgICAweDhGMzcsIDB4MENGNiwgMHg4MTM5LCAweDhGMzgsIDB4OEYzOCwgMHgxODE1LCAweDgxMzksIDB4OEYzOSwgMHg4RjM5LAotICAgIDB4MDZGRCwgMHg4MTM5LCAweDkwMzAsIDB4OTAzMCwgMHgwODJELCAweDgxMzksIDB4OTAzMSwgMHg5MDMxLCAweDA4QkUsCi0gICAgMHg4MTM5LCAweDkwMzIsIDB4OTAzMiwgMHgwNkM0LCAweDgxMzksIDB4OTAzMywgMHg5MDMzLCAweDE4MTMsIDB4ODEzOSwKLSAgICAweDkwMzQsIDB4OTAzNCwgMHgwNzNDLCAweDgxMzksIDB4OTAzNSwgMHg5MDM1LCAweDEzOTgsIDB4ODEzOSwgMHg5MDM2LAotICAgIDB4OTAzNiwgMHgxNEFELCAweDgxMzksIDB4OTAzNywgMHg5MDM3LCAweDE0RjYsIDB4ODEzOSwgMHg5MDM4LCAweDkwMzgsCi0gICAgMHgwNzA2LCAweDgxMzksIDB4OTAzOSwgMHg5MDM5LCAweDE3NjIsIDB4ODEzOSwgMHg5MTMwLCAweDkxMzAsIDB4MTVFRSwKLSAgICAweDgxMzksIDB4OTEzMSwgMHg5MTMxLCAweDE1RTAsIDB4ODEzOSwgMHg5MTMyLCAweDkxMzIsIDB4MEY4RiwgMHg4MTM5LAotICAgIDB4OTEzMywgMHg5MTMzLCAweDA2RTUsIDB4ODEzOSwgMHg5MTM0LCAweDkxMzQsIDB4MzI5MiwgMHg4MTM5LCAweDkxMzUsCi0gICAgMHg5MTM1LCAweDBENkQsIDB4ODEzOSwgMHg5MTM2LCAweDkxMzYsIDB4MTFBNiwgMHg4MTM5LCAweDkxMzcsIDB4OTEzNywKLSAgICAweDE5MDksIDB4ODEzOSwgMHg5MTM4LCAweDkxMzgsIDB4MEVEMywgMHg4MTM5LCAweDkxMzksIDB4OTEzOSwgMHgwNUY2LAotICAgIDB4ODEzOSwgMHg5MjMwLCAweDkyMzAsIDB4MDhDMCwgMHg4MTM5LCAweDkyMzEsIDB4OTIzMSwgMHgwNjVBLCAweDgxMzksCi0gICAgMHg5MjMyLCAweDkyMzIsIDB4MEVFRCwgMHg4MTM5LCAweDkyMzMsIDB4OTIzMywgMHgwQ0IwLCAweDgxMzksIDB4OTIzNCwKLSAgICAweDkyMzQsIDB4MTBGRSwgMHg4MTM5LCAweDkyMzUsIDB4OTIzNSwgMHgxMTA1LCAweDgxMzksIDB4OTIzNiwgMHg5MjM2LAotICAgIDB4MEIyMSwgMHg4MTM5LCAweDkyMzcsIDB4OTIzNywgMHgwQzM0LCAweDgxMzksIDB4OTIzOCwgMHg5MjM4LCAweDExQjgsCi0gICAgMHg4MTM5LCAweDkyMzksIDB4OTIzOSwgMHgwNTc4LCAweDgxMzksIDB4OTMzMCwgMHg5MzMwLCAweDE5QkQsIDB4ODEzOSwKLSAgICAweDkzMzEsIDB4OTMzMSwgMHgwRUYyLCAweDgxMzksIDB4OTMzMiwgMHg5MzMyLCAweDA0MzEsIDB4ODEzOSwgMHg5MzMzLAotICAgIDB4OTMzMywgMHgwQUIwLCAweDgxMzksIDB4OTMzNCwgMHg5MzM0LCAweDBENjYsIDB4ODEzOSwgMHg5MzM1LCAweDkzMzUsCi0gICAgMHgwQzE3LCAweDgxMzksIDB4OTMzNiwgMHg5MzM2LCAweDBEQTMsIDB4ODEzOSwgMHg5MzM3LCAweDkzMzcsIDB4MDgwNSwKLSAgICAweDgxMzksIDB4OTMzOCwgMHg5MzM4LCAweDEyMDMsIDB4ODEzOSwgMHg5MzM5LCAweDkzMzksIDB4MDZCMywgMHg4MTM5LAotICAgIDB4OTQzMCwgMHg5NDMwLCAweDEyNjksIDB4ODEzOSwgMHg5NDMxLCAweDk0MzEsIDB4MTY5RCwgMHg4MTM5LCAweDk0MzIsCi0gICAgMHg5NDMyLCAweDBCQ0IsIDB4ODEzOSwgMHg5NDMzLCAweDk0MzMsIDB4MEZFOSwgMHg4MTM5LCAweDk0MzQsIDB4OTQzNCwKLSAgICAweDBCNjQsIDB4ODEzOSwgMHg5NDM1LCAweDk0MzUsIDB4MEM4OSwgMHg4MTM5LCAweDk0MzYsIDB4OTQzNiwgMHgwRkM5LAotICAgIDB4ODEzOSwgMHg5NDM3LCAweDk0MzcsIDB4MTBENiwgMHg4MTM5LCAweDk0MzgsIDB4OTQzOCwgMHgwNzI4LCAweDgxMzksCi0gICAgMHg5NDM5LCAweDk0MzksIDB4MEU5MCwgMHg4MTM5LCAweDk1MzAsIDB4OTUzMCwgMHgwNkM1LCAweDgxMzksIDB4OTUzMSwKLSAgICAweDk1MzEsIDB4MEQzMywgMHg4MTM5LCAweDk1MzIsIDB4OTUzMiwgMHgxMEE4LCAweDgxMzksIDB4OTUzMywgMHg5NTMzLAotICAgIDB4MEU0MiwgMHg4MTM5LCAweDk1MzQsIDB4OTUzNCwgMHgxQkM2LCAweDgxMzksIDB4OTUzNSwgMHg5NTM1LCAweDFCNjAsCi0gICAgMHg4MTM5LCAweDk1MzYsIDB4OTUzNiwgMHgzRUJGLCAweDgxMzksIDB4OTUzNywgMHg5NTM3LCAweDAzRTIsIDB4ODEzOSwKLSAgICAweDk1MzgsIDB4OTUzOCwgMHgwQkMzLCAweDgxMzksIDB4OTUzOSwgMHg5NTM5LCAweDBBRjgsIDB4ODEzOSwgMHg5NjMwLAotICAgIDB4OTYzMCwgMHgwQjIyLCAweDgxMzksIDB4OTYzMSwgMHg5NjMxLCAweDBBQjEsIDB4ODEzOSwgMHg5NjMyLCAweDk2MzIsCi0gICAgMHgwRDRGLCAweDgxMzksIDB4OTYzMywgMHg5NjMzLCAweDBENDYsIDB4ODEzOSwgMHg5NjM0LCAweDk2MzQsIDB4MEQ1NSwKLSAgICAweDgxMzksIDB4OTYzNSwgMHg5NjM1LCAweDQwQ0IsIDB4ODEzOSwgMHg5NjM2LCAweDk2MzYsIDB4MDc4MywgMHg4MTM5LAotICAgIDB4OTYzNywgMHg5NjM3LCAweDBGRDEsIDB4ODEzOSwgMHg5NjM4LCAweDk2MzgsIDB4MDlFQiwgMHg4MTM5LCAweDk2MzksCi0gICAgMHg5NjM5LCAweDExRjAsIDB4ODEzOSwgMHg5NzMwLCAweDk3MzAsIDB4MEFEQywgMHg4MTM5LCAweDk3MzEsIDB4OTczMSwKLSAgICAweDFDRTcsIDB4ODEzOSwgMHg5NzMyLCAweDk3MzIsIDB4MUM1RSwgMHg4MTM5LCAweDk3MzMsIDB4OTczMywgMHgwRUE5LAotICAgIDB4ODEzOSwgMHg5NzM0LCAweDk3MzQsIDB4MTAxQiwgMHg4MTM5LCAweDk3MzUsIDB4OTczNSwgMHgxMEQ1LCAweDgxMzksCi0gICAgMHg5NzM2LCAweDk3MzYsIDB4MDlCQSwgMHg4MTM5LCAweDk3MzcsIDB4OTczNywgMHgwNjM3LCAweDgxMzksIDB4OTczOCwKLSAgICAweDk3MzgsIDB4MUJDQiwgMHg4MTM5LCAweDk3MzksIDB4OTczOSwgMHgwNjM5LCAweDgxMzksIDB4OTgzMCwgMHg5ODMwLAotICAgIDB4MUExRSwgMHg4MTM5LCAweDk4MzEsIDB4OTgzMSwgMHgwQ0JELCAweDgxMzksIDB4OTgzMiwgMHg5ODMyLCAweDA0RTEsCi0gICAgMHg4MTM5LCAweDk4MzMsIDB4OTgzMywgMHgxMjMxLCAweDgxMzksIDB4OTgzNCwgMHg5ODM0LCAweDExQzAsIDB4ODEzOSwKLSAgICAweDk4MzUsIDB4OTgzNSwgMHgwOEY5LCAweDgxMzksIDB4OTgzNiwgMHg5ODM2LCAweDBEMTksIDB4ODEzOSwgMHg5ODM3LAotICAgIDB4OTgzNywgMHgxNjE4LCAweDgxMzksIDB4OTgzOCwgMHg5ODM4LCAweDExREEsIDB4ODEzOSwgMHg5ODM5LCAweDk4MzksCi0gICAgMHgxQ0RDLCAweDgxMzksIDB4OTkzMCwgMHg5OTMwLCAweDBDRTQsIDB4ODEzOSwgMHg5OTMxLCAweDk5MzEsIDB4NDVBMiwKLSAgICAweDgxMzksIDB4OTkzMiwgMHg5OTMyLCAweDFCRjAsIDB4ODEzOSwgMHg5OTMzLCAweDk5MzMsIDB4MDUwQiwgMHg4MTM5LAotICAgIDB4OTkzNCwgMHg5OTM0LCAweDBGRDMsIDB4ODEzOSwgMHg5OTM1LCAweDk5MzUsIDB4MEY5QiwgMHg4MTM5LCAweDk5MzYsCi0gICAgMHg5OTM2LCAweDEwNDksIDB4ODEzOSwgMHg5OTM3LCAweDk5MzcsIDB4NDlEQywgMHg4MTM5LCAweDk5MzgsIDB4OTkzOCwKLSAgICAweDFGOTYsIDB4ODEzOSwgMHg5OTM5LCAweDk5MzksIDB4MDg5OCwgMHg4MTM5LCAweDlBMzAsIDB4OUEzMCwgMHgwRkZELAotICAgIDB4ODEzOSwgMHg5QTMxLCAweDlBMzEsIDB4MDcyMSwgMHg4MTM5LCAweDlBMzIsIDB4OUEzMiwgMHgwNUY4LCAweDgxMzksCi0gICAgMHg5QTMzLCAweDlBMzMsIDB4MUQxNSwgMHg4MTM5LCAweDlBMzQsIDB4OUEzNCwgMHgxRDUwLCAweDgxMzksIDB4OUEzNSwKLSAgICAweDlBMzUsIDB4MUUzQiwgMHg4MTM5LCAweDlBMzYsIDB4OUEzNiwgMHgwNTA1LCAweDgxMzksIDB4OUEzNywgMHg5QTM3LAotICAgIDB4MTIzQywgMHg4MTM5LCAweDlBMzgsIDB4OUEzOCwgMHgxMjQwLCAweDgxMzksIDB4OUEzOSwgMHg5QTM5LCAweDBEMjYsCi0gICAgMHg4MTM5LCAweDlCMzAsIDB4OUIzMCwgMHgxRTdCLCAweDgxMzksIDB4OUIzMSwgMHg5QjMxLCAweDBGOEMsIDB4ODEzOSwKLSAgICAweDlCMzIsIDB4OUIzMiwgMHgwNEUyLCAweDgxMzksIDB4OUIzMywgMHg5QjMzLCAweDREMTMsIDB4ODEzOSwgMHg5QjM0LAotICAgIDB4OUIzNCwgMHgxMDVGLCAweDgxMzksIDB4OUIzNSwgMHg5QjM1LCAweDEwQjQsIDB4ODEzOSwgMHg5QjM2LCAweDlCMzYsCi0gICAgMHg0RTE4LCAweDgxMzksIDB4OUIzNywgMHg5QjM3LCAweDA5REEsIDB4ODEzOSwgMHg5QjM4LCAweDlCMzgsIDB4MDhDMSwKLSAgICAweDgxMzksIDB4OUIzOSwgMHg5QjM5LCAweDFFNzUsIDB4ODEzOSwgMHg5QzMwLCAweDlDMzAsIDB4MjA3RCwgMHg4MTM5LAotICAgIDB4OUMzMSwgMHg5QzMxLCAweDA2QjIsIDB4ODEzOSwgMHg5QzMyLCAweDlDMzIsIDB4MDlFRSwgMHg4MTM5LCAweDlDMzMsCi0gICAgMHg5QzMzLCAweDFENzksIDB4ODEzOSwgMHg5QzM0LCAweDlDMzQsIDB4MTBDRiwgMHg4MTM5LCAweDlDMzUsIDB4OUMzNSwKLSAgICAweDUwRUEsIDB4ODEzOSwgMHg5QzM2LCAweDlDMzYsIDB4MDY2NCwgMHg4MTM5LCAweDlDMzcsIDB4OUMzNywgMHgwQUVCLAotICAgIDB4ODEzOSwgMHg5QzM4LCAweDlDMzgsIDB4MDZFQSwgMHg4MTM5LCAweDlDMzksIDB4OUMzOSwgMHgyMThELCAweDgxMzksCi0gICAgMHg5RDMwLCAweDlEMzAsIDB4MDhGMSwgMHg4MTM5LCAweDlEMzEsIDB4OUQzMSwgMHgxMDdCLCAweDgxMzksIDB4OUQzMiwKLSAgICAweDlEMzIsIDB4MjIwOSwgMHg4MTM5LCAweDlEMzMsIDB4OUQzMywgMHgxRjAwLCAweDgxMzksIDB4OUQzNCwgMHg5RDM0LAotICAgIDB4MUVGNCwgMHg4MTM5LCAweDlEMzUsIDB4OUQzNSwgMHgwRDRBLCAweDgxMzksIDB4OUQzNiwgMHg5RDM2LCAweDBENkUsCi0gICAgMHg4MTM5LCAweDlEMzcsIDB4OUQzNywgMHgwRjUwLCAweDgxMzksIDB4OUQzOCwgMHg5RDM4LCAweDIwNkQsIDB4ODEzOSwKLSAgICAweDlEMzksIDB4OUQzOSwgMHgwNzIwLCAweDgxMzksIDB4OUUzMCwgMHg5RTMwLCAweDA2REEsIDB4ODEzOSwgMHg5RTMxLAotICAgIDB4OUUzMSwgMHgxREVDLCAweDgxMzksIDB4OUUzMiwgMHg5RTMyLCAweDFFRDAsIDB4ODEzOSwgMHg5RTMzLCAweDlFMzMsCi0gICAgMHgxMzlCLCAweDgxMzksIDB4OUUzNCwgMHg5RTM0LCAweDEyNjAsIDB4ODEzOSwgMHg5RTM1LCAweDlFMzUsIDB4MDc0NiwKLSAgICAweDgxMzksIDB4OUUzNiwgMHg5RTM2LCAweDIyMzksIDB4ODEzOSwgMHg5RTM3LCAweDlFMzcsIDB4MjA5QywgMHg4MTM5LAotICAgIDB4OUUzOCwgMHg5RTM4LCAweDI2ODgsIDB4ODEzOSwgMHg5RTM5LCAweDlFMzksIDB4MEE2MCwgMHg4MTM5LCAweDlGMzAsCi0gICAgMHg5RjMwLCAweDIwNzEsIDB4ODEzOSwgMHg5RjMxLCAweDlGMzEsIDB4MEE5MCwgMHg4MTM5LCAweDlGMzIsIDB4OUYzMiwKLSAgICAweDU1ODYsIDB4ODEzOSwgMHg5RjMzLCAweDlGMzMsIDB4MEQ4OSwgMHg4MTM5LCAweDlGMzQsIDB4OUYzNCwgMHgwNzkxLAotICAgIDB4ODEzOSwgMHg5RjM1LCAweDlGMzUsIDB4MUE1NSwgMHg4MTM5LCAweDlGMzYsIDB4OUYzNiwgMHgyNjE4LCAweDgxMzksCi0gICAgMHg5RjM3LCAweDlGMzcsIDB4MDVFNSwgMHg4MTM5LCAweDlGMzgsIDB4OUYzOCwgMHgwNzFELCAweDgxMzksIDB4OUYzOSwKLSAgICAweDlGMzksIDB4MEQ4QSwgMHg4MTM5LCAweEEwMzAsIDB4QTAzMCwgMHgwNDMwLCAweDgxMzksIDB4QTAzMSwgMHhBMDMxLAotICAgIDB4MjBDNiwgMHg4MTM5LCAweEEwMzIsIDB4QTAzMiwgMHgxRTg2LCAweDgxMzksIDB4QTAzMywgMHhBMDMzLCAweDIwMzcsCi0gICAgMHg4MTM5LCAweEEwMzQsIDB4QTAzNCwgMHgxRjM0LCAweDgxMzksIDB4QTAzNSwgMHhBMDM1LCAweDEyRjMsIDB4ODEzOSwKLSAgICAweEE1MzMsIDB4QTUzNSwgMHg1NzdCLCAweDgxMzksIDB4QTUzOCwgMHhBNTM5LCAweDU3N0UsIDB4ODEzOSwgMHhBNjMwLAotICAgIDB4QTYzMCwgMHg1NzgwLCAweDgxMzksIDB4QTYzNCwgMHhBNjM0LCAweDU3NTUsIDB4ODEzOSwgMHhBNjM2LCAweEE2MzYsCi0gICAgMHg1NzY3LCAweDgxMzksIDB4QTczNSwgMHhBNzM1LCAweDU3NzYsIDB4ODEzOSwgMHhBNzM2LCAweEE3MzYsIDB4NTc3OCwKLSAgICAweDgxMzksIDB4QTczNywgMHhBNzM3LCAweDU3NzcsIDB4ODEzOSwgMHhBNzM4LCAweEE3MzgsIDB4NTc3OSwgMHg4MTM5LAotICAgIDB4QTgzNiwgMHhBODM4LCAweDU3ODEsIDB4ODEzOSwgMHhCNDM0LCAweEI0MzksIDB4NTc4NCwgMHg4MTM5LCAweEI1MzAsCi0gICAgMHhCNTM5LCAweDU3OEEsIDB4ODEzOSwgMHhCNjMwLCAweEI2MzcsIDB4NTc5NCwgMHg4MTM5LCAweEVFMzksIDB4RUUzOSwKLSAgICAweDU4MDEsIDB4ODEzOSwgMHhFRjMwLCAweEVGMzksIDB4NTgwMiwgMHg4MTM5LCAweEYwMzAsIDB4RjAzOSwgMHg1ODBDLAotICAgIDB4ODEzOSwgMHhGMTMwLCAweEYxMzksIDB4NTgxNiwgMHg4MTM5LCAweEYyMzAsIDB4RjIzOSwgMHg1ODIwLCAweDgxMzksCi0gICAgMHhGMzMwLCAweEYzMzksIDB4NTgyQSwgMHg4MTM5LCAweEY0MzAsIDB4RjQzOSwgMHg1ODM0LCAweDgxMzksIDB4RjUzMCwKLSAgICAweEY1MzksIDB4NTgzRSwgMHg4MTM5LCAweEY2MzAsIDB4RjYzOSwgMHg1ODQ4LCAweDgxMzksIDB4RjczMCwgMHhGNzM5LAotICAgIDB4NTg1MiwgMHg4MTM5LCAweEY4MzAsIDB4RjgzOSwgMHg1ODVDLCAweDgxMzksIDB4RjkzMCwgMHhGOTM5LCAweDU4NjYsCi0gICAgMHg4MTM5LCAweEZBMzAsIDB4RkEzOSwgMHg1ODcwLCAweDgxMzksIDB4RkIzMCwgMHhGQjM5LCAweDU4N0EsIDB4ODEzOSwKLSAgICAweEZDMzAsIDB4RkMzOSwgMHg1ODg0LCAweDgxMzksIDB4RkQzMCwgMHhGRDM5LCAweDU4OEUsIDB4ODEzOSwgMHhGRTMwLAotICAgIDB4RkUzOSwgMHg1ODk4LCAweDgyMzAsIDB4ODEzMCwgMHg4MTM5LCAweDU4QTIsIDB4ODIzMCwgMHg4MjMwLCAweDgyMzksCi0gICAgMHg1OEFDLCAweDgyMzAsIDB4ODMzMCwgMHg4MzM5LCAweDU4QjYsIDB4ODIzMCwgMHg4NDMwLCAweDg0MzksIDB4NThDMCwKLSAgICAweDgyMzAsIDB4ODUzMCwgMHg4NTM5LCAweDU4Q0EsIDB4ODIzMCwgMHg4NjMwLCAweDg2MzksIDB4NThENCwgMHg4MjMwLAotICAgIDB4ODczMCwgMHg4NzM5LCAweDU4REUsIDB4ODIzMCwgMHg4ODMwLCAweDg4MzksIDB4NThFOCwgMHg4MjMwLCAweDg5MzAsCi0gICAgMHg4OTM5LCAweDU4RjIsIDB4ODIzMCwgMHg4QTMwLCAweDhBMzksIDB4NThGQywgMHg4MjMwLCAweDhCMzAsIDB4OEIzOSwKLSAgICAweDU5MDYsIDB4ODIzMCwgMHg4QzMwLCAweDhDMzksIDB4NTkxMCwgMHg4MjMwLCAweDhEMzAsIDB4OEQzOSwgMHg1OTFBLAotICAgIDB4ODIzMCwgMHg4RTMwLCAweDhFMzksIDB4NTkyNCwgMHg4MjMwLCAweDhGMzAsIDB4OEYzOSwgMHg1OTJFLCAweDgyMzAsCi0gICAgMHg5MDMwLCAweDkwMzksIDB4NTkzOCwgMHg4MjMwLCAweDkxMzAsIDB4OTEzOSwgMHg1OTQyLCAweDgyMzAsIDB4OTIzMCwKLSAgICAweDkyMzksIDB4NTk0QywgMHg4MjMwLCAweDkzMzAsIDB4OTMzOSwgMHg1OTU2LCAweDgyMzAsIDB4OTQzMCwgMHg5NDM5LAotICAgIDB4NTk2MCwgMHg4MjMwLCAweDk1MzAsIDB4OTUzOSwgMHg1OTZBLCAweDgyMzAsIDB4OTYzMCwgMHg5NjM5LCAweDU5NzQsCi0gICAgMHg4MjMwLCAweDk3MzAsIDB4OTczOSwgMHg1OTdFLCAweDgyMzAsIDB4OTgzMCwgMHg5ODM5LCAweDU5ODgsIDB4ODIzMCwKLSAgICAweDk5MzAsIDB4OTkzOSwgMHg1OTkyLCAweDgyMzAsIDB4OUEzMCwgMHg5QTM5LCAweDU5OUMsIDB4ODIzMCwgMHg5QjMwLAotICAgIDB4OUIzOSwgMHg1OUE2LCAweDgyMzAsIDB4OUMzMCwgMHg5QzM5LCAweDU5QjAsIDB4ODIzMCwgMHg5RDMwLCAweDlEMzksCi0gICAgMHg1OUJBLCAweDgyMzAsIDB4OUUzMCwgMHg5RTM5LCAweDU5QzQsIDB4ODIzMCwgMHg5RjMwLCAweDlGMzksIDB4NTlDRSwKLSAgICAweDgyMzAsIDB4QTAzMCwgMHhBMDM5LCAweDU5RDgsIDB4ODIzMCwgMHhBMTMwLCAweEExMzksIDB4NTlFMiwgMHg4MjMwLAotICAgIDB4QTIzMCwgMHhBMjM5LCAweDU5RUMsIDB4ODIzMCwgMHhBMzMwLCAweEEzMzksIDB4NTlGNiwgMHg4MjMwLCAweEE0MzAsCi0gICAgMHhBNDM5LCAweDVBMDAsIDB4ODIzMCwgMHhBNTMwLCAweEE1MzksIDB4NUEwQSwgMHg4MjMwLCAweEE2MzAsIDB4QTYzOSwKLSAgICAweDVBMTQsIDB4ODIzMCwgMHhBNzMwLCAweEE3MzksIDB4NUExRSwgMHg4MjMwLCAweEE4MzAsIDB4QTgzOSwgMHg1QTI4LAotICAgIDB4ODIzMCwgMHhBOTMwLCAweEE5MzksIDB4NUEzMiwgMHg4MjMwLCAweEFBMzAsIDB4QUEzOSwgMHg1QTNDLCAweDgyMzAsCi0gICAgMHhBQjMwLCAweEFCMzksIDB4NUE0NiwgMHg4MjMwLCAweEFDMzAsIDB4QUMzOSwgMHg1QTUwLCAweDgyMzAsIDB4QUQzMCwKLSAgICAweEFEMzksIDB4NUE1QSwgMHg4MjMwLCAweEFFMzAsIDB4QUUzOSwgMHg1QTY0LCAweDgyMzAsIDB4QUYzMCwgMHhBRjM5LAotICAgIDB4NUE2RSwgMHg4MjMwLCAweEIwMzAsIDB4QjAzOSwgMHg1QTc4LCAweDgyMzAsIDB4QjEzMCwgMHhCMTM5LCAweDVBODIsCi0gICAgMHg4MjMwLCAweEIyMzAsIDB4QjIzOSwgMHg1QThDLCAweDgyMzAsIDB4QjMzMCwgMHhCMzM5LCAweDVBOTYsIDB4ODIzMCwKLSAgICAweEI0MzAsIDB4QjQzOSwgMHg1QUEwLCAweDgyMzAsIDB4QjUzMCwgMHhCNTM5LCAweDVBQUEsIDB4ODIzMCwgMHhCNjMwLAotICAgIDB4QjYzOSwgMHg1QUI0LCAweDgyMzAsIDB4QjczMCwgMHhCNzM5LCAweDVBQkUsIDB4ODIzMCwgMHhCODMwLCAweEI4MzksCi0gICAgMHg1QUM4LCAweDgyMzAsIDB4QjkzMCwgMHhCOTM5LCAweDVBRDIsIDB4ODIzMCwgMHhCQTMwLCAweEJBMzksIDB4NUFEQywKLSAgICAweDgyMzAsIDB4QkIzMCwgMHhCQjM5LCAweDVBRTYsIDB4ODIzMCwgMHhCQzMwLCAweEJDMzksIDB4NUFGMCwgMHg4MjMwLAotICAgIDB4QkQzMCwgMHhCRDM5LCAweDVBRkEsIDB4ODIzMCwgMHhCRTMwLCAweEJFMzksIDB4NUIwNCwgMHg4MjMwLCAweEJGMzAsCi0gICAgMHhCRjM5LCAweDVCMEUsIDB4ODIzMCwgMHhDMDMwLCAweEMwMzksIDB4NUIxOCwgMHg4MjMwLCAweEMxMzAsIDB4QzEzOSwKLSAgICAweDVCMjIsIDB4ODIzMCwgMHhDMjMwLCAweEMyMzksIDB4NUIyQywgMHg4MjMwLCAweEMzMzAsIDB4QzMzOSwgMHg1QjM2LAotICAgIDB4ODIzMCwgMHhDNDMwLCAweEM0MzksIDB4NUI0MCwgMHg4MjMwLCAweEM1MzAsIDB4QzUzOSwgMHg1QjRBLCAweDgyMzAsCi0gICAgMHhDNjMwLCAweEM2MzksIDB4NUI1NCwgMHg4MjMwLCAweEM3MzAsIDB4QzczOSwgMHg1QjVFLCAweDgyMzAsIDB4QzgzMCwKLSAgICAweEM4MzksIDB4NUI2OCwgMHg4MjMwLCAweEM5MzAsIDB4QzkzOSwgMHg1QjcyLCAweDgyMzAsIDB4Q0EzMCwgMHhDQTM5LAotICAgIDB4NUI3QywgMHg4MjMwLCAweENCMzAsIDB4Q0IzOSwgMHg1Qjg2LCAweDgyMzAsIDB4Q0MzMCwgMHhDQzM5LCAweDVCOTAsCi0gICAgMHg4MjMwLCAweENEMzAsIDB4Q0QzOSwgMHg1QjlBLCAweDgyMzAsIDB4Q0UzMCwgMHhDRTM5LCAweDVCQTQsIDB4ODIzMCwKLSAgICAweENGMzAsIDB4Q0YzOSwgMHg1QkFFLCAweDgyMzAsIDB4RDAzMCwgMHhEMDM5LCAweDVCQjgsIDB4ODIzMCwgMHhEMTMwLAotICAgIDB4RDEzOSwgMHg1QkMyLCAweDgyMzAsIDB4RDIzMCwgMHhEMjM5LCAweDVCQ0MsIDB4ODIzMCwgMHhEMzMwLCAweEQzMzksCi0gICAgMHg1QkQ2LCAweDgyMzAsIDB4RDQzMCwgMHhENDM5LCAweDVCRTAsIDB4ODIzMCwgMHhENTMwLCAweEQ1MzksIDB4NUJFQSwKLSAgICAweDgyMzAsIDB4RDYzMCwgMHhENjM5LCAweDVCRjQsIDB4ODIzMCwgMHhENzMwLCAweEQ3MzksIDB4NUJGRSwgMHg4MjMwLAotICAgIDB4RDgzMCwgMHhEODM5LCAweDVDMDgsIDB4ODIzMCwgMHhEOTMwLCAweEQ5MzksIDB4NUMxMiwgMHg4MjMwLCAweERBMzAsCi0gICAgMHhEQTM5LCAweDVDMUMsIDB4ODIzMCwgMHhEQjMwLCAweERCMzksIDB4NUMyNiwgMHg4MjMwLCAweERDMzAsIDB4REMzOSwKLSAgICAweDVDMzAsIDB4ODIzMCwgMHhERDMwLCAweEREMzksIDB4NUMzQSwgMHg4MjMwLCAweERFMzAsIDB4REUzOSwgMHg1QzQ0LAotICAgIDB4ODIzMCwgMHhERjMwLCAweERGMzksIDB4NUM0RSwgMHg4MjMwLCAweEUwMzAsIDB4RTAzOSwgMHg1QzU4LCAweDgyMzAsCi0gICAgMHhFMTMwLCAweEUxMzksIDB4NUM2MiwgMHg4MjMwLCAweEUyMzAsIDB4RTIzOSwgMHg1QzZDLCAweDgyMzAsIDB4RTMzMCwKLSAgICAweEUzMzksIDB4NUM3NiwgMHg4MjMwLCAweEU0MzAsIDB4RTQzOSwgMHg1QzgwLCAweDgyMzAsIDB4RTUzMCwgMHhFNTM5LAotICAgIDB4NUM4QSwgMHg4MjMwLCAweEU2MzAsIDB4RTYzOSwgMHg1Qzk0LCAweDgyMzAsIDB4RTczMCwgMHhFNzM5LCAweDVDOUUsCi0gICAgMHg4MjMwLCAweEU4MzAsIDB4RTgzOSwgMHg1Q0E4LCAweDgyMzAsIDB4RTkzMCwgMHhFOTM5LCAweDVDQjIsIDB4ODIzMCwKLSAgICAweEVBMzAsIDB4RUEzOSwgMHg1Q0JDLCAweDgyMzAsIDB4RUIzMCwgMHhFQjM5LCAweDVDQzYsIDB4ODIzMCwgMHhFQzMwLAotICAgIDB4RUMzOSwgMHg1Q0QwLCAweDgyMzAsIDB4RUQzMCwgMHhFRDM5LCAweDVDREEsIDB4ODIzMCwgMHhFRTMwLCAweEVFMzksCi0gICAgMHg1Q0U0LCAweDgyMzAsIDB4RUYzMCwgMHhFRjM5LCAweDVDRUUsIDB4ODIzMCwgMHhGMDMwLCAweEYwMzksIDB4NUNGOCwKLSAgICAweDgyMzAsIDB4RjEzMCwgMHhGMTM5LCAweDVEMDIsIDB4ODIzMCwgMHhGMjMwLCAweEYyMzksIDB4NUQwQywgMHg4MjMwLAotICAgIDB4RjMzMCwgMHhGMzM5LCAweDVEMTYsIDB4ODIzMCwgMHhGNDMwLCAweEY0MzksIDB4NUQyMCwgMHg4MjMwLCAweEY1MzAsCi0gICAgMHhGNTM5LCAweDVEMkEsIDB4ODIzMCwgMHhGNjMwLCAweEY2MzksIDB4NUQzNCwgMHg4MjMwLCAweEY3MzAsIDB4RjczOSwKLSAgICAweDVEM0UsIDB4ODIzMCwgMHhGODMwLCAweEY4MzksIDB4NUQ0OCwgMHg4MjMwLCAweEY5MzAsIDB4RjkzOSwgMHg1RDUyLAotICAgIDB4ODIzMCwgMHhGQTMwLCAweEZBMzksIDB4NUQ1QywgMHg4MjMwLCAweEZCMzAsIDB4RkIzOSwgMHg1RDY2LCAweDgyMzAsCi0gICAgMHhGQzMwLCAweEZDMzksIDB4NUQ3MCwgMHg4MjMwLCAweEZEMzAsIDB4RkQzOSwgMHg1RDdBLCAweDgyMzAsIDB4RkUzMCwKLSAgICAweEZFMzksIDB4NUQ4NCwgMHg4MjMxLCAweDgxMzAsIDB4ODEzOSwgMHg1RDhFLCAweDgyMzEsIDB4ODIzMCwgMHg4MjM5LAotICAgIDB4NUQ5OCwgMHg4MjMxLCAweDgzMzAsIDB4ODMzOSwgMHg1REEyLCAweDgyMzEsIDB4ODQzMCwgMHg4NDM5LCAweDVEQUMsCi0gICAgMHg4MjMxLCAweDg1MzAsIDB4ODUzOSwgMHg1REI2LCAweDgyMzEsIDB4ODYzMCwgMHg4NjM5LCAweDVEQzAsIDB4ODIzMSwKLSAgICAweDg3MzAsIDB4ODczOSwgMHg1RENBLCAweDgyMzEsIDB4ODgzMCwgMHg4ODM5LCAweDVERDQsIDB4ODIzMSwgMHg4OTMwLAotICAgIDB4ODkzOSwgMHg1RERFLCAweDgyMzEsIDB4OEEzMCwgMHg4QTM5LCAweDVERTgsIDB4ODIzMSwgMHg4QjMwLCAweDhCMzksCi0gICAgMHg1REYyLCAweDgyMzEsIDB4OEMzMCwgMHg4QzM5LCAweDVERkMsIDB4ODIzMSwgMHg4RDMwLCAweDhEMzksIDB4NUUwNiwKLSAgICAweDgyMzEsIDB4OEUzMCwgMHg4RTM5LCAweDVFMTAsIDB4ODIzMSwgMHg4RjMwLCAweDhGMzksIDB4NUUxQSwgMHg4MjMxLAotICAgIDB4OTAzMCwgMHg5MDM5LCAweDVFMjQsIDB4ODIzMSwgMHg5MTMwLCAweDkxMzksIDB4NUUyRSwgMHg4MjMxLCAweDkyMzAsCi0gICAgMHg5MjM5LCAweDVFMzgsIDB4ODIzMSwgMHg5MzMwLCAweDkzMzksIDB4NUU0MiwgMHg4MjMxLCAweDk0MzAsIDB4OTQzOSwKLSAgICAweDVFNEMsIDB4ODIzMSwgMHg5NTMwLCAweDk1MzksIDB4NUU1NiwgMHg4MjMxLCAweDk2MzAsIDB4OTYzOSwgMHg1RTYwLAotICAgIDB4ODIzMSwgMHg5NzMwLCAweDk3MzksIDB4NUU2QSwgMHg4MjMxLCAweDk4MzAsIDB4OTgzOSwgMHg1RTc0LCAweDgyMzEsCi0gICAgMHg5OTMwLCAweDk5MzksIDB4NUU3RSwgMHg4MjMxLCAweDlBMzAsIDB4OUEzOSwgMHg1RTg4LCAweDgyMzEsIDB4OUIzMCwKLSAgICAweDlCMzksIDB4NUU5MiwgMHg4MjMxLCAweDlDMzAsIDB4OUMzOSwgMHg1RTlDLCAweDgyMzEsIDB4OUQzMCwgMHg5RDM5LAotICAgIDB4NUVBNiwgMHg4MjMxLCAweDlFMzAsIDB4OUUzOSwgMHg1RUIwLCAweDgyMzEsIDB4OUYzMCwgMHg5RjM5LCAweDVFQkEsCi0gICAgMHg4MjMxLCAweEEwMzAsIDB4QTAzOSwgMHg1RUM0LCAweDgyMzEsIDB4QTEzMCwgMHhBMTM5LCAweDVFQ0UsIDB4ODIzMSwKLSAgICAweEEyMzAsIDB4QTIzOSwgMHg1RUQ4LCAweDgyMzEsIDB4QTMzMCwgMHhBMzM5LCAweDVFRTIsIDB4ODIzMSwgMHhBNDMwLAotICAgIDB4QTQzOSwgMHg1RUVDLCAweDgyMzEsIDB4QTUzMCwgMHhBNTM5LCAweDVFRjYsIDB4ODIzMSwgMHhBNjMwLCAweEE2MzksCi0gICAgMHg1RjAwLCAweDgyMzEsIDB4QTczMCwgMHhBNzM5LCAweDVGMEEsIDB4ODIzMSwgMHhBODMwLCAweEE4MzksIDB4NUYxNCwKLSAgICAweDgyMzEsIDB4QTkzMCwgMHhBOTM5LCAweDVGMUUsIDB4ODIzMSwgMHhBQTMwLCAweEFBMzksIDB4NUYyOCwgMHg4MjMxLAotICAgIDB4QUIzMCwgMHhBQjM5LCAweDVGMzIsIDB4ODIzMSwgMHhBQzMwLCAweEFDMzksIDB4NUYzQywgMHg4MjMxLCAweEFEMzAsCi0gICAgMHhBRDM5LCAweDVGNDYsIDB4ODIzMSwgMHhBRTMwLCAweEFFMzksIDB4NUY1MCwgMHg4MjMxLCAweEFGMzAsIDB4QUYzOSwKLSAgICAweDVGNUEsIDB4ODIzMSwgMHhCMDMwLCAweEIwMzksIDB4NUY2NCwgMHg4MjMxLCAweEIxMzAsIDB4QjEzOSwgMHg1RjZFLAotICAgIDB4ODIzMSwgMHhCMjMwLCAweEIyMzksIDB4NUY3OCwgMHg4MjMxLCAweEIzMzAsIDB4QjMzOSwgMHg1RjgyLCAweDgyMzEsCi0gICAgMHhCNDMwLCAweEI0MzksIDB4NUY4QywgMHg4MjMxLCAweEI1MzAsIDB4QjUzOSwgMHg1Rjk2LCAweDgyMzEsIDB4QjYzMCwKLSAgICAweEI2MzksIDB4NUZBMCwgMHg4MjMxLCAweEI3MzAsIDB4QjczOSwgMHg1RkFBLCAweDgyMzEsIDB4QjgzMCwgMHhCODM5LAotICAgIDB4NUZCNCwgMHg4MjMxLCAweEI5MzAsIDB4QjkzOSwgMHg1RkJFLCAweDgyMzEsIDB4QkEzMCwgMHhCQTM5LCAweDVGQzgsCi0gICAgMHg4MjMxLCAweEJCMzAsIDB4QkIzOSwgMHg1RkQyLCAweDgyMzEsIDB4QkMzMCwgMHhCQzM5LCAweDVGREMsIDB4ODIzMSwKLSAgICAweEJEMzAsIDB4QkQzOSwgMHg1RkU2LCAweDgyMzEsIDB4QkUzMCwgMHhCRTM5LCAweDVGRjAsIDB4ODIzMSwgMHhCRjMwLAotICAgIDB4QkYzOSwgMHg1RkZBLCAweDgyMzEsIDB4QzAzMCwgMHhDMDM5LCAweDYwMDQsIDB4ODIzMSwgMHhDMTMwLCAweEMxMzksCi0gICAgMHg2MDBFLCAweDgyMzEsIDB4QzIzMCwgMHhDMjM5LCAweDYwMTgsIDB4ODIzMSwgMHhDMzMwLCAweEMzMzksIDB4NjAyMiwKLSAgICAweDgyMzEsIDB4QzQzMCwgMHhDNDM5LCAweDYwMkMsIDB4ODIzMSwgMHhDNTMwLCAweEM1MzksIDB4NjAzNiwgMHg4MjMxLAotICAgIDB4QzYzMCwgMHhDNjM5LCAweDYwNDAsIDB4ODIzMSwgMHhDNzMwLCAweEM3MzksIDB4NjA0QSwgMHg4MjMxLCAweEM4MzAsCi0gICAgMHhDODM5LCAweDYwNTQsIDB4ODIzMSwgMHhDOTMwLCAweEM5MzksIDB4NjA1RSwgMHg4MjMxLCAweENBMzAsIDB4Q0EzOSwKLSAgICAweDYwNjgsIDB4ODIzMSwgMHhDQjMwLCAweENCMzksIDB4NjA3MiwgMHg4MjMxLCAweENDMzAsIDB4Q0MzOSwgMHg2MDdDLAotICAgIDB4ODIzMSwgMHhDRDMwLCAweENEMzksIDB4NjA4NiwgMHg4MjMxLCAweENFMzAsIDB4Q0UzOSwgMHg2MDkwLCAweDgyMzEsCi0gICAgMHhDRjMwLCAweENGMzksIDB4NjA5QSwgMHg4MjMxLCAweEQwMzAsIDB4RDAzOSwgMHg2MEE0LCAweDgyMzEsIDB4RDEzMCwKLSAgICAweEQxMzksIDB4NjBBRSwgMHg4MjMxLCAweEQyMzAsIDB4RDIzOSwgMHg2MEI4LCAweDgyMzEsIDB4RDMzMCwgMHhEMzM5LAotICAgIDB4NjBDMiwgMHg4MjMxLCAweEQ0MzAsIDB4RDQzOSwgMHg2MENDLCAweDgyMzEsIDB4RDUzMCwgMHhENTM5LCAweDYwRDYsCi0gICAgMHg4MjMxLCAweEQ2MzAsIDB4RDYzOSwgMHg2MEUwLCAweDgyMzEsIDB4RDczMCwgMHhENzM5LCAweDYwRUEsIDB4ODIzMSwKLSAgICAweEQ4MzAsIDB4RDgzOSwgMHg2MEY0LCAweDgyMzEsIDB4RDkzMCwgMHhEOTM5LCAweDYwRkUsIDB4ODIzMSwgMHhEQTMwLAotICAgIDB4REEzOSwgMHg2MTA4LCAweDgyMzEsIDB4REIzMCwgMHhEQjM5LCAweDYxMTIsIDB4ODIzMSwgMHhEQzMwLCAweERDMzksCi0gICAgMHg2MTFDLCAweDgyMzEsIDB4REQzMCwgMHhERDM5LCAweDYxMjYsIDB4ODIzMSwgMHhERTMwLCAweERFMzksIDB4NjEzMCwKLSAgICAweDgyMzEsIDB4REYzMCwgMHhERjM5LCAweDYxM0EsIDB4ODIzMSwgMHhFMDMwLCAweEUwMzksIDB4NjE0NCwgMHg4MjMxLAotICAgIDB4RTEzMCwgMHhFMTM5LCAweDYxNEUsIDB4ODIzMSwgMHhFMjMwLCAweEUyMzksIDB4NjE1OCwgMHg4MjMxLCAweEUzMzAsCi0gICAgMHhFMzM5LCAweDYxNjIsIDB4ODIzMSwgMHhFNDMwLCAweEU0MzksIDB4NjE2QywgMHg4MjMxLCAweEU1MzAsIDB4RTUzOSwKLSAgICAweDYxNzYsIDB4ODIzMSwgMHhFNjMwLCAweEU2MzksIDB4NjE4MCwgMHg4MjMxLCAweEU3MzAsIDB4RTczOSwgMHg2MThBLAotICAgIDB4ODIzMSwgMHhFODMwLCAweEU4MzksIDB4NjE5NCwgMHg4MjMxLCAweEU5MzAsIDB4RTkzOSwgMHg2MTlFLCAweDgyMzEsCi0gICAgMHhFQTMwLCAweEVBMzksIDB4NjFBOCwgMHg4MjMxLCAweEVCMzAsIDB4RUIzOSwgMHg2MUIyLCAweDgyMzEsIDB4RUMzMCwKLSAgICAweEVDMzksIDB4NjFCQywgMHg4MjMxLCAweEVEMzAsIDB4RUQzOSwgMHg2MUM2LCAweDgyMzEsIDB4RUUzMCwgMHhFRTM5LAotICAgIDB4NjFEMCwgMHg4MjMxLCAweEVGMzAsIDB4RUYzOSwgMHg2MURBLCAweDgyMzEsIDB4RjAzMCwgMHhGMDM5LCAweDYxRTQsCi0gICAgMHg4MjMxLCAweEYxMzAsIDB4RjEzOSwgMHg2MUVFLCAweDgyMzEsIDB4RjIzMCwgMHhGMjM5LCAweDYxRjgsIDB4ODIzMSwKLSAgICAweEYzMzAsIDB4RjMzOSwgMHg2MjAyLCAweDgyMzEsIDB4RjQzMCwgMHhGNDM5LCAweDYyMEMsIDB4ODIzMSwgMHhGNTMwLAotICAgIDB4RjUzOSwgMHg2MjE2LCAweDgyMzEsIDB4RjYzMCwgMHhGNjM5LCAweDYyMjAsIDB4ODIzMSwgMHhGNzMwLCAweEY3MzksCi0gICAgMHg2MjJBLCAweDgyMzEsIDB4RjgzMCwgMHhGODM5LCAweDYyMzQsIDB4ODIzMSwgMHhGOTMwLCAweEY5MzksIDB4NjIzRSwKLSAgICAweDgyMzEsIDB4RkEzMCwgMHhGQTM5LCAweDYyNDgsIDB4ODIzMSwgMHhGQjMwLCAweEZCMzksIDB4NjI1MiwgMHg4MjMxLAotICAgIDB4RkMzMCwgMHhGQzM5LCAweDYyNUMsIDB4ODIzMSwgMHhGRDMwLCAweEZEMzksIDB4NjI2NiwgMHg4MjMxLCAweEZFMzAsCi0gICAgMHhGRTM5LCAweDYyNzAsIDB4ODIzMiwgMHg4MTMwLCAweDgxMzksIDB4NjI3QSwgMHg4MjMyLCAweDgyMzAsIDB4ODIzOSwKLSAgICAweDYyODQsIDB4ODIzMiwgMHg4MzMwLCAweDgzMzksIDB4NjI4RSwgMHg4MjMyLCAweDg0MzAsIDB4ODQzOSwgMHg2Mjk4LAotICAgIDB4ODIzMiwgMHg4NTMwLCAweDg1MzksIDB4NjJBMiwgMHg4MjMyLCAweDg2MzAsIDB4ODYzOSwgMHg2MkFDLCAweDgyMzIsCi0gICAgMHg4NzMwLCAweDg3MzksIDB4NjJCNiwgMHg4MjMyLCAweDg4MzAsIDB4ODgzOSwgMHg2MkMwLCAweDgyMzIsIDB4ODkzMCwKLSAgICAweDg5MzksIDB4NjJDQSwgMHg4MjMyLCAweDhBMzAsIDB4OEEzOSwgMHg2MkQ0LCAweDgyMzIsIDB4OEIzMCwgMHg4QjM5LAotICAgIDB4NjJERSwgMHg4MjMyLCAweDhDMzAsIDB4OEMzOSwgMHg2MkU4LCAweDgyMzIsIDB4OEQzMCwgMHg4RDM5LCAweDYyRjIsCi0gICAgMHg4MjMyLCAweDhFMzAsIDB4OEUzOSwgMHg2MkZDLCAweDgyMzIsIDB4OEYzMCwgMHg4RjM5LCAweDYzMDYsIDB4ODIzMiwKLSAgICAweDkwMzAsIDB4OTAzOSwgMHg2MzEwLCAweDgyMzIsIDB4OTEzMCwgMHg5MTM5LCAweDYzMUEsIDB4ODIzMiwgMHg5MjMwLAotICAgIDB4OTIzOSwgMHg2MzI0LCAweDgyMzIsIDB4OTMzMCwgMHg5MzM5LCAweDYzMkUsIDB4ODIzMiwgMHg5NDMwLCAweDk0MzksCi0gICAgMHg2MzM4LCAweDgyMzIsIDB4OTUzMCwgMHg5NTM5LCAweDYzNDIsIDB4ODIzMiwgMHg5NjMwLCAweDk2MzksIDB4NjM0QywKLSAgICAweDgyMzIsIDB4OTczMCwgMHg5NzM5LCAweDYzNTYsIDB4ODIzMiwgMHg5ODMwLCAweDk4MzksIDB4NjM2MCwgMHg4MjMyLAotICAgIDB4OTkzMCwgMHg5OTM5LCAweDYzNkEsIDB4ODIzMiwgMHg5QTMwLCAweDlBMzksIDB4NjM3NCwgMHg4MjMyLCAweDlCMzAsCi0gICAgMHg5QjM5LCAweDYzN0UsIDB4ODIzMiwgMHg5QzMwLCAweDlDMzksIDB4NjM4OCwgMHg4MjMyLCAweDlEMzAsIDB4OUQzOSwKLSAgICAweDYzOTIsIDB4ODIzMiwgMHg5RTMwLCAweDlFMzksIDB4NjM5QywgMHg4MjMyLCAweDlGMzAsIDB4OUYzOSwgMHg2M0E2LAotICAgIDB4ODIzMiwgMHhBMDMwLCAweEEwMzksIDB4NjNCMCwgMHg4MjMyLCAweEExMzAsIDB4QTEzOSwgMHg2M0JBLCAweDgyMzIsCi0gICAgMHhBMjMwLCAweEEyMzksIDB4NjNDNCwgMHg4MjMyLCAweEEzMzAsIDB4QTMzOSwgMHg2M0NFLCAweDgyMzIsIDB4QTQzMCwKLSAgICAweEE0MzksIDB4NjNEOCwgMHg4MjMyLCAweEE1MzAsIDB4QTUzOSwgMHg2M0UyLCAweDgyMzIsIDB4QTYzMCwgMHhBNjM5LAotICAgIDB4NjNFQywgMHg4MjMyLCAweEE3MzAsIDB4QTczOSwgMHg2M0Y2LCAweDgyMzIsIDB4QTgzMCwgMHhBODM5LCAweDY0MDAsCi0gICAgMHg4MjMyLCAweEE5MzAsIDB4QTkzOSwgMHg2NDBBLCAweDgyMzIsIDB4QUEzMCwgMHhBQTM5LCAweDY0MTQsIDB4ODIzMiwKLSAgICAweEFCMzAsIDB4QUIzOSwgMHg2NDFFLCAweDgyMzIsIDB4QUMzMCwgMHhBQzM5LCAweDY0MjgsIDB4ODIzMiwgMHhBRDMwLAotICAgIDB4QUQzOSwgMHg2NDMyLCAweDgyMzIsIDB4QUUzMCwgMHhBRTM5LCAweDY0M0MsIDB4ODIzMiwgMHhBRjMwLCAweEFGMzksCi0gICAgMHg2NDQ2LCAweDgyMzIsIDB4QjAzMCwgMHhCMDM5LCAweDY0NTAsIDB4ODIzMiwgMHhCMTMwLCAweEIxMzksIDB4NjQ1QSwKLSAgICAweDgyMzIsIDB4QjIzMCwgMHhCMjM5LCAweDY0NjQsIDB4ODIzMiwgMHhCMzMwLCAweEIzMzksIDB4NjQ2RSwgMHg4MjMyLAotICAgIDB4QjQzMCwgMHhCNDM5LCAweDY0NzgsIDB4ODIzMiwgMHhCNTMwLCAweEI1MzksIDB4NjQ4MiwgMHg4MjMyLCAweEI2MzAsCi0gICAgMHhCNjM5LCAweDY0OEMsIDB4ODIzMiwgMHhCNzMwLCAweEI3MzksIDB4NjQ5NiwgMHg4MjMyLCAweEI4MzAsIDB4QjgzOSwKLSAgICAweDY0QTAsIDB4ODIzMiwgMHhCOTMwLCAweEI5MzksIDB4NjRBQSwgMHg4MjMyLCAweEJBMzAsIDB4QkEzOSwgMHg2NEI0LAotICAgIDB4ODIzMiwgMHhCQjMwLCAweEJCMzksIDB4NjRCRSwgMHg4MjMyLCAweEJDMzAsIDB4QkMzOSwgMHg2NEM4LCAweDgyMzIsCi0gICAgMHhCRDMwLCAweEJEMzksIDB4NjREMiwgMHg4MjMyLCAweEJFMzAsIDB4QkUzOSwgMHg2NERDLCAweDgyMzIsIDB4QkYzMCwKLSAgICAweEJGMzksIDB4NjRFNiwgMHg4MjMyLCAweEMwMzAsIDB4QzAzOSwgMHg2NEYwLCAweDgyMzIsIDB4QzEzMCwgMHhDMTM5LAotICAgIDB4NjRGQSwgMHg4MjMyLCAweEMyMzAsIDB4QzIzOSwgMHg2NTA0LCAweDgyMzIsIDB4QzMzMCwgMHhDMzM5LCAweDY1MEUsCi0gICAgMHg4MjMyLCAweEM0MzAsIDB4QzQzOSwgMHg2NTE4LCAweDgyMzIsIDB4QzUzMCwgMHhDNTM5LCAweDY1MjIsIDB4ODIzMiwKLSAgICAweEM2MzAsIDB4QzYzOSwgMHg2NTJDLCAweDgyMzIsIDB4QzczMCwgMHhDNzM5LCAweDY1MzYsIDB4ODIzMiwgMHhDODMwLAotICAgIDB4QzgzOSwgMHg2NTQwLCAweDgyMzIsIDB4QzkzMCwgMHhDOTM5LCAweDY1NEEsIDB4ODIzMiwgMHhDQTMwLCAweENBMzksCi0gICAgMHg2NTU0LCAweDgyMzIsIDB4Q0IzMCwgMHhDQjM5LCAweDY1NUUsIDB4ODIzMiwgMHhDQzMwLCAweENDMzksIDB4NjU2OCwKLSAgICAweDgyMzIsIDB4Q0QzMCwgMHhDRDM5LCAweDY1NzIsIDB4ODIzMiwgMHhDRTMwLCAweENFMzksIDB4NjU3QywgMHg4MjMyLAotICAgIDB4Q0YzMCwgMHhDRjM5LCAweDY1ODYsIDB4ODIzMiwgMHhEMDMwLCAweEQwMzksIDB4NjU5MCwgMHg4MjMyLCAweEQxMzAsCi0gICAgMHhEMTM5LCAweDY1OUEsIDB4ODIzMiwgMHhEMjMwLCAweEQyMzksIDB4NjVBNCwgMHg4MjMyLCAweEQzMzAsIDB4RDMzOSwKLSAgICAweDY1QUUsIDB4ODIzMiwgMHhENDMwLCAweEQ0MzksIDB4NjVCOCwgMHg4MjMyLCAweEQ1MzAsIDB4RDUzOSwgMHg2NUMyLAotICAgIDB4ODIzMiwgMHhENjMwLCAweEQ2MzksIDB4NjVDQywgMHg4MjMyLCAweEQ3MzAsIDB4RDczOSwgMHg2NUQ2LCAweDgyMzIsCi0gICAgMHhEODMwLCAweEQ4MzksIDB4NjVFMCwgMHg4MjMyLCAweEQ5MzAsIDB4RDkzOSwgMHg2NUVBLCAweDgyMzIsIDB4REEzMCwKLSAgICAweERBMzksIDB4NjVGNCwgMHg4MjMyLCAweERCMzAsIDB4REIzOSwgMHg2NUZFLCAweDgyMzIsIDB4REMzMCwgMHhEQzM5LAotICAgIDB4NjYwOCwgMHg4MjMyLCAweEREMzAsIDB4REQzOSwgMHg2NjEyLCAweDgyMzIsIDB4REUzMCwgMHhERTM5LCAweDY2MUMsCi0gICAgMHg4MjMyLCAweERGMzAsIDB4REYzOSwgMHg2NjI2LCAweDgyMzIsIDB4RTAzMCwgMHhFMDM5LCAweDY2MzAsIDB4ODIzMiwKLSAgICAweEUxMzAsIDB4RTEzOSwgMHg2NjNBLCAweDgyMzIsIDB4RTIzMCwgMHhFMjM5LCAweDY2NDQsIDB4ODIzMiwgMHhFMzMwLAotICAgIDB4RTMzOSwgMHg2NjRFLCAweDgyMzIsIDB4RTQzMCwgMHhFNDM5LCAweDY2NTgsIDB4ODIzMiwgMHhFNTMwLCAweEU1MzksCi0gICAgMHg2NjYyLCAweDgyMzIsIDB4RTYzMCwgMHhFNjM5LCAweDY2NkMsIDB4ODIzMiwgMHhFNzMwLCAweEU3MzksIDB4NjY3NiwKLSAgICAweDgyMzIsIDB4RTgzMCwgMHhFODM5LCAweDY2ODAsIDB4ODIzMiwgMHhFOTMwLCAweEU5MzksIDB4NjY4QSwgMHg4MjMyLAotICAgIDB4RUEzMCwgMHhFQTM5LCAweDY2OTQsIDB4ODIzMiwgMHhFQjMwLCAweEVCMzksIDB4NjY5RSwgMHg4MjMyLCAweEVDMzAsCi0gICAgMHhFQzM5LCAweDY2QTgsIDB4ODIzMiwgMHhFRDMwLCAweEVEMzksIDB4NjZCMiwgMHg4MjMyLCAweEVFMzAsIDB4RUUzOSwKLSAgICAweDY2QkMsIDB4ODIzMiwgMHhFRjMwLCAweEVGMzksIDB4NjZDNiwgMHg4MjMyLCAweEYwMzAsIDB4RjAzOSwgMHg2NkQwLAotICAgIDB4ODIzMiwgMHhGMTMwLCAweEYxMzksIDB4NjZEQSwgMHg4MjMyLCAweEYyMzAsIDB4RjIzOSwgMHg2NkU0LCAweDgyMzIsCi0gICAgMHhGMzMwLCAweEYzMzksIDB4NjZFRSwgMHg4MjMyLCAweEY0MzAsIDB4RjQzOSwgMHg2NkY4LCAweDgyMzIsIDB4RjUzMCwKLSAgICAweEY1MzksIDB4NjcwMiwgMHg4MjMyLCAweEY2MzAsIDB4RjYzOSwgMHg2NzBDLCAweDgyMzIsIDB4RjczMCwgMHhGNzM5LAotICAgIDB4NjcxNiwgMHg4MjMyLCAweEY4MzAsIDB4RjgzOSwgMHg2NzIwLCAweDgyMzIsIDB4RjkzMCwgMHhGOTM5LCAweDY3MkEsCi0gICAgMHg4MjMyLCAweEZBMzAsIDB4RkEzOSwgMHg2NzM0LCAweDgyMzIsIDB4RkIzMCwgMHhGQjM5LCAweDY3M0UsIDB4ODIzMiwKLSAgICAweEZDMzAsIDB4RkMzOSwgMHg2NzQ4LCAweDgyMzIsIDB4RkQzMCwgMHhGRDM5LCAweDY3NTIsIDB4ODIzMiwgMHhGRTMwLAotICAgIDB4RkUzOSwgMHg2NzVDLCAweDgyMzMsIDB4ODEzMCwgMHg4MTM5LCAweDY3NjYsIDB4ODIzMywgMHg4MjMwLCAweDgyMzksCi0gICAgMHg2NzcwLCAweDgyMzMsIDB4ODMzMCwgMHg4MzM5LCAweDY3N0EsIDB4ODIzMywgMHg4NDMwLCAweDg0MzksIDB4Njc4NCwKLSAgICAweDgyMzMsIDB4ODUzMCwgMHg4NTM5LCAweDY3OEUsIDB4ODIzMywgMHg4NjMwLCAweDg2MzksIDB4Njc5OCwgMHg4MjMzLAotICAgIDB4ODczMCwgMHg4NzM5LCAweDY3QTIsIDB4ODIzMywgMHg4ODMwLCAweDg4MzksIDB4NjdBQywgMHg4MjMzLCAweDg5MzAsCi0gICAgMHg4OTM5LCAweDY3QjYsIDB4ODIzMywgMHg4QTMwLCAweDhBMzksIDB4NjdDMCwgMHg4MjMzLCAweDhCMzAsIDB4OEIzOSwKLSAgICAweDY3Q0EsIDB4ODIzMywgMHg4QzMwLCAweDhDMzksIDB4NjdENCwgMHg4MjMzLCAweDhEMzAsIDB4OEQzOSwgMHg2N0RFLAotICAgIDB4ODIzMywgMHg4RTMwLCAweDhFMzksIDB4NjdFOCwgMHg4MjMzLCAweDhGMzAsIDB4OEYzOSwgMHg2N0YyLCAweDgyMzMsCi0gICAgMHg5MDMwLCAweDkwMzksIDB4NjdGQywgMHg4MjMzLCAweDkxMzAsIDB4OTEzOSwgMHg2ODA2LCAweDgyMzMsIDB4OTIzMCwKLSAgICAweDkyMzksIDB4NjgxMCwgMHg4MjMzLCAweDkzMzAsIDB4OTMzOSwgMHg2ODFBLCAweDgyMzMsIDB4OTQzMCwgMHg5NDM5LAotICAgIDB4NjgyNCwgMHg4MjMzLCAweDk1MzAsIDB4OTUzOSwgMHg2ODJFLCAweDgyMzMsIDB4OTYzMCwgMHg5NjM5LCAweDY4MzgsCi0gICAgMHg4MjMzLCAweDk3MzAsIDB4OTczOSwgMHg2ODQyLCAweDgyMzMsIDB4OTgzMCwgMHg5ODM5LCAweDY4NEMsIDB4ODIzMywKLSAgICAweDk5MzAsIDB4OTkzOSwgMHg2ODU2LCAweDgyMzMsIDB4OUEzMCwgMHg5QTM5LCAweDY4NjAsIDB4ODIzMywgMHg5QjMwLAotICAgIDB4OUIzOSwgMHg2ODZBLCAweDgyMzMsIDB4OUMzMCwgMHg5QzM5LCAweDY4NzQsIDB4ODIzMywgMHg5RDMwLCAweDlEMzksCi0gICAgMHg2ODdFLCAweDgyMzMsIDB4OUUzMCwgMHg5RTM5LCAweDY4ODgsIDB4ODIzMywgMHg5RjMwLCAweDlGMzksIDB4Njg5MiwKLSAgICAweDgyMzMsIDB4QTAzMCwgMHhBMDM5LCAweDY4OUMsIDB4ODIzMywgMHhBMTMwLCAweEExMzksIDB4NjhBNiwgMHg4MjMzLAotICAgIDB4QTIzMCwgMHhBMjM5LCAweDY4QjAsIDB4ODIzMywgMHhBMzMwLCAweEEzMzksIDB4NjhCQSwgMHg4MjMzLCAweEE0MzAsCi0gICAgMHhBNDM5LCAweDY4QzQsIDB4ODIzMywgMHhBNTMwLCAweEE1MzksIDB4NjhDRSwgMHg4MjMzLCAweEE2MzAsIDB4QTYzOSwKLSAgICAweDY4RDgsIDB4ODIzMywgMHhBNzMwLCAweEE3MzksIDB4NjhFMiwgMHg4MjMzLCAweEE4MzAsIDB4QTgzOSwgMHg2OEVDLAotICAgIDB4ODIzMywgMHhBOTMwLCAweEE5MzksIDB4NjhGNiwgMHg4MjMzLCAweEFBMzAsIDB4QUEzOSwgMHg2OTAwLCAweDgyMzMsCi0gICAgMHhBQjMwLCAweEFCMzksIDB4NjkwQSwgMHg4MjMzLCAweEFDMzAsIDB4QUMzOSwgMHg2OTE0LCAweDgyMzMsIDB4QUQzMCwKLSAgICAweEFEMzksIDB4NjkxRSwgMHg4MjMzLCAweEFFMzAsIDB4QUUzOSwgMHg2OTI4LCAweDgyMzMsIDB4QUYzMCwgMHhBRjM5LAotICAgIDB4NjkzMiwgMHg4MjMzLCAweEIwMzAsIDB4QjAzOSwgMHg2OTNDLCAweDgyMzMsIDB4QjEzMCwgMHhCMTM5LCAweDY5NDYsCi0gICAgMHg4MjMzLCAweEIyMzAsIDB4QjIzOSwgMHg2OTUwLCAweDgyMzMsIDB4QjMzMCwgMHhCMzM5LCAweDY5NUEsIDB4ODIzMywKLSAgICAweEI0MzAsIDB4QjQzOSwgMHg2OTY0LCAweDgyMzMsIDB4QjUzMCwgMHhCNTM5LCAweDY5NkUsIDB4ODIzMywgMHhCNjMwLAotICAgIDB4QjYzOSwgMHg2OTc4LCAweDgyMzMsIDB4QjczMCwgMHhCNzM5LCAweDY5ODIsIDB4ODIzMywgMHhCODMwLCAweEI4MzksCi0gICAgMHg2OThDLCAweDgyMzMsIDB4QjkzMCwgMHhCOTM5LCAweDY5OTYsIDB4ODIzMywgMHhCQTMwLCAweEJBMzksIDB4NjlBMCwKLSAgICAweDgyMzMsIDB4QkIzMCwgMHhCQjM5LCAweDY5QUEsIDB4ODIzMywgMHhCQzMwLCAweEJDMzksIDB4NjlCNCwgMHg4MjMzLAotICAgIDB4QkQzMCwgMHhCRDM5LCAweDY5QkUsIDB4ODIzMywgMHhCRTMwLCAweEJFMzksIDB4NjlDOCwgMHg4MjMzLCAweEJGMzAsCi0gICAgMHhCRjM5LCAweDY5RDIsIDB4ODIzMywgMHhDMDMwLCAweEMwMzksIDB4NjlEQywgMHg4MjMzLCAweEMxMzAsIDB4QzEzOSwKLSAgICAweDY5RTYsIDB4ODIzMywgMHhDMjMwLCAweEMyMzksIDB4NjlGMCwgMHg4MjMzLCAweEMzMzAsIDB4QzMzOSwgMHg2OUZBLAotICAgIDB4ODIzMywgMHhDNDMwLCAweEM0MzksIDB4NkEwNCwgMHg4MjMzLCAweEM1MzAsIDB4QzUzOSwgMHg2QTBFLCAweDgyMzMsCi0gICAgMHhDNjMwLCAweEM2MzksIDB4NkExOCwgMHg4MjMzLCAweEM3MzAsIDB4QzczOSwgMHg2QTIyLCAweDgyMzMsIDB4QzgzMCwKLSAgICAweEM4MzksIDB4NkEyQywgMHg4MjMzLCAweEM5MzAsIDB4QzkzOSwgMHg2QTM2LCAweDgyMzMsIDB4Q0EzMCwgMHhDQTM5LAotICAgIDB4NkE0MCwgMHg4MjMzLCAweENCMzAsIDB4Q0IzOSwgMHg2QTRBLCAweDgyMzMsIDB4Q0MzMCwgMHhDQzM5LCAweDZBNTQsCi0gICAgMHg4MjMzLCAweENEMzAsIDB4Q0QzOSwgMHg2QTVFLCAweDgyMzMsIDB4Q0UzMCwgMHhDRTM5LCAweDZBNjgsIDB4ODIzMywKLSAgICAweENGMzAsIDB4Q0YzOSwgMHg2QTcyLCAweDgyMzMsIDB4RDAzMCwgMHhEMDM5LCAweDZBN0MsIDB4ODIzMywgMHhEMTMwLAotICAgIDB4RDEzOSwgMHg2QTg2LCAweDgyMzMsIDB4RDIzMCwgMHhEMjM5LCAweDZBOTAsIDB4ODIzMywgMHhEMzMwLCAweEQzMzksCi0gICAgMHg2QTlBLCAweDgyMzMsIDB4RDQzMCwgMHhENDM5LCAweDZBQTQsIDB4ODIzMywgMHhENTMwLCAweEQ1MzksIDB4NkFBRSwKLSAgICAweDgyMzMsIDB4RDYzMCwgMHhENjM5LCAweDZBQjgsIDB4ODIzMywgMHhENzMwLCAweEQ3MzksIDB4NkFDMiwgMHg4MjMzLAotICAgIDB4RDgzMCwgMHhEODM5LCAweDZBQ0MsIDB4ODIzMywgMHhEOTMwLCAweEQ5MzksIDB4NkFENiwgMHg4MjMzLCAweERBMzAsCi0gICAgMHhEQTM5LCAweDZBRTAsIDB4ODIzMywgMHhEQjMwLCAweERCMzksIDB4NkFFQSwgMHg4MjMzLCAweERDMzAsIDB4REMzOSwKLSAgICAweDZBRjQsIDB4ODIzMywgMHhERDMwLCAweEREMzksIDB4NkFGRSwgMHg4MjMzLCAweERFMzAsIDB4REUzOSwgMHg2QjA4LAotICAgIDB4ODIzMywgMHhERjMwLCAweERGMzksIDB4NkIxMiwgMHg4MjMzLCAweEUwMzAsIDB4RTAzOSwgMHg2QjFDLCAweDgyMzMsCi0gICAgMHhFMTMwLCAweEUxMzksIDB4NkIyNiwgMHg4MjMzLCAweEUyMzAsIDB4RTIzOSwgMHg2QjMwLCAweDgyMzMsIDB4RTMzMCwKLSAgICAweEUzMzksIDB4NkIzQSwgMHg4MjMzLCAweEU0MzAsIDB4RTQzOSwgMHg2QjQ0LCAweDgyMzMsIDB4RTUzMCwgMHhFNTM5LAotICAgIDB4NkI0RSwgMHg4MjMzLCAweEU2MzAsIDB4RTYzOSwgMHg2QjU4LCAweDgyMzMsIDB4RTczMCwgMHhFNzM5LCAweDZCNjIsCi0gICAgMHg4MjMzLCAweEU4MzAsIDB4RTgzOSwgMHg2QjZDLCAweDgyMzMsIDB4RTkzMCwgMHhFOTM5LCAweDZCNzYsIDB4ODIzMywKLSAgICAweEVBMzAsIDB4RUEzOSwgMHg2QjgwLCAweDgyMzMsIDB4RUIzMCwgMHhFQjM5LCAweDZCOEEsIDB4ODIzMywgMHhFQzMwLAotICAgIDB4RUMzOSwgMHg2Qjk0LCAweDgyMzMsIDB4RUQzMCwgMHhFRDM5LCAweDZCOUUsIDB4ODIzMywgMHhFRTMwLCAweEVFMzksCi0gICAgMHg2QkE4LCAweDgyMzMsIDB4RUYzMCwgMHhFRjM5LCAweDZCQjIsIDB4ODIzMywgMHhGMDMwLCAweEYwMzksIDB4NkJCQywKLSAgICAweDgyMzMsIDB4RjEzMCwgMHhGMTM5LCAweDZCQzYsIDB4ODIzMywgMHhGMjMwLCAweEYyMzksIDB4NkJEMCwgMHg4MjMzLAotICAgIDB4RjMzMCwgMHhGMzM5LCAweDZCREEsIDB4ODIzMywgMHhGNDMwLCAweEY0MzksIDB4NkJFNCwgMHg4MjMzLCAweEY1MzAsCi0gICAgMHhGNTM5LCAweDZCRUUsIDB4ODIzMywgMHhGNjMwLCAweEY2MzksIDB4NkJGOCwgMHg4MjMzLCAweEY3MzAsIDB4RjczOSwKLSAgICAweDZDMDIsIDB4ODIzMywgMHhGODMwLCAweEY4MzksIDB4NkMwQywgMHg4MjMzLCAweEY5MzAsIDB4RjkzOSwgMHg2QzE2LAotICAgIDB4ODIzMywgMHhGQTMwLCAweEZBMzksIDB4NkMyMCwgMHg4MjMzLCAweEZCMzAsIDB4RkIzOSwgMHg2QzJBLCAweDgyMzMsCi0gICAgMHhGQzMwLCAweEZDMzksIDB4NkMzNCwgMHg4MjMzLCAweEZEMzAsIDB4RkQzOSwgMHg2QzNFLCAweDgyMzMsIDB4RkUzMCwKLSAgICAweEZFMzksIDB4NkM0OCwgMHg4MjM0LCAweDgxMzAsIDB4ODEzOSwgMHg2QzUyLCAweDgyMzQsIDB4ODIzMCwgMHg4MjM5LAotICAgIDB4NkM1QywgMHg4MjM0LCAweDgzMzAsIDB4ODMzOSwgMHg2QzY2LCAweDgyMzQsIDB4ODQzMCwgMHg4NDM5LCAweDZDNzAsCi0gICAgMHg4MjM0LCAweDg1MzAsIDB4ODUzOSwgMHg2QzdBLCAweDgyMzQsIDB4ODYzMCwgMHg4NjM5LCAweDZDODQsIDB4ODIzNCwKLSAgICAweDg3MzAsIDB4ODczOSwgMHg2QzhFLCAweDgyMzQsIDB4ODgzMCwgMHg4ODM5LCAweDZDOTgsIDB4ODIzNCwgMHg4OTMwLAotICAgIDB4ODkzOSwgMHg2Q0EyLCAweDgyMzQsIDB4OEEzMCwgMHg4QTM5LCAweDZDQUMsIDB4ODIzNCwgMHg4QjMwLCAweDhCMzksCi0gICAgMHg2Q0I2LCAweDgyMzQsIDB4OEMzMCwgMHg4QzM5LCAweDZDQzAsIDB4ODIzNCwgMHg4RDMwLCAweDhEMzksIDB4NkNDQSwKLSAgICAweDgyMzQsIDB4OEUzMCwgMHg4RTM5LCAweDZDRDQsIDB4ODIzNCwgMHg4RjMwLCAweDhGMzksIDB4NkNERSwgMHg4MjM0LAotICAgIDB4OTAzMCwgMHg5MDM5LCAweDZDRTgsIDB4ODIzNCwgMHg5MTMwLCAweDkxMzksIDB4NkNGMiwgMHg4MjM0LCAweDkyMzAsCi0gICAgMHg5MjM5LCAweDZDRkMsIDB4ODIzNCwgMHg5MzMwLCAweDkzMzksIDB4NkQwNiwgMHg4MjM0LCAweDk0MzAsIDB4OTQzOSwKLSAgICAweDZEMTAsIDB4ODIzNCwgMHg5NTMwLCAweDk1MzksIDB4NkQxQSwgMHg4MjM0LCAweDk2MzAsIDB4OTYzOSwgMHg2RDI0LAotICAgIDB4ODIzNCwgMHg5NzMwLCAweDk3MzksIDB4NkQyRSwgMHg4MjM0LCAweDk4MzAsIDB4OTgzOSwgMHg2RDM4LCAweDgyMzQsCi0gICAgMHg5OTMwLCAweDk5MzksIDB4NkQ0MiwgMHg4MjM0LCAweDlBMzAsIDB4OUEzOSwgMHg2RDRDLCAweDgyMzQsIDB4OUIzMCwKLSAgICAweDlCMzksIDB4NkQ1NiwgMHg4MjM0LCAweDlDMzAsIDB4OUMzOSwgMHg2RDYwLCAweDgyMzQsIDB4OUQzMCwgMHg5RDM5LAotICAgIDB4NkQ2QSwgMHg4MjM0LCAweDlFMzAsIDB4OUUzOSwgMHg2RDc0LCAweDgyMzQsIDB4OUYzMCwgMHg5RjM5LCAweDZEN0UsCi0gICAgMHg4MjM0LCAweEEwMzAsIDB4QTAzOSwgMHg2RDg4LCAweDgyMzQsIDB4QTEzMCwgMHhBMTM5LCAweDZEOTIsIDB4ODIzNCwKLSAgICAweEEyMzAsIDB4QTIzOSwgMHg2RDlDLCAweDgyMzQsIDB4QTMzMCwgMHhBMzM5LCAweDZEQTYsIDB4ODIzNCwgMHhBNDMwLAotICAgIDB4QTQzOSwgMHg2REIwLCAweDgyMzQsIDB4QTUzMCwgMHhBNTM5LCAweDZEQkEsIDB4ODIzNCwgMHhBNjMwLCAweEE2MzksCi0gICAgMHg2REM0LCAweDgyMzQsIDB4QTczMCwgMHhBNzM5LCAweDZEQ0UsIDB4ODIzNCwgMHhBODMwLCAweEE4MzksIDB4NkREOCwKLSAgICAweDgyMzQsIDB4QTkzMCwgMHhBOTM5LCAweDZERTIsIDB4ODIzNCwgMHhBQTMwLCAweEFBMzksIDB4NkRFQywgMHg4MjM0LAotICAgIDB4QUIzMCwgMHhBQjM5LCAweDZERjYsIDB4ODIzNCwgMHhBQzMwLCAweEFDMzksIDB4NkUwMCwgMHg4MjM0LCAweEFEMzAsCi0gICAgMHhBRDM5LCAweDZFMEEsIDB4ODIzNCwgMHhBRTMwLCAweEFFMzksIDB4NkUxNCwgMHg4MjM0LCAweEFGMzAsIDB4QUYzOSwKLSAgICAweDZFMUUsIDB4ODIzNCwgMHhCMDMwLCAweEIwMzksIDB4NkUyOCwgMHg4MjM0LCAweEIxMzAsIDB4QjEzOSwgMHg2RTMyLAotICAgIDB4ODIzNCwgMHhCMjMwLCAweEIyMzksIDB4NkUzQywgMHg4MjM0LCAweEIzMzAsIDB4QjMzOSwgMHg2RTQ2LCAweDgyMzQsCi0gICAgMHhCNDMwLCAweEI0MzksIDB4NkU1MCwgMHg4MjM0LCAweEI1MzAsIDB4QjUzOSwgMHg2RTVBLCAweDgyMzQsIDB4QjYzMCwKLSAgICAweEI2MzksIDB4NkU2NCwgMHg4MjM0LCAweEI3MzAsIDB4QjczOSwgMHg2RTZFLCAweDgyMzQsIDB4QjgzMCwgMHhCODM5LAotICAgIDB4NkU3OCwgMHg4MjM0LCAweEI5MzAsIDB4QjkzOSwgMHg2RTgyLCAweDgyMzQsIDB4QkEzMCwgMHhCQTM5LCAweDZFOEMsCi0gICAgMHg4MjM0LCAweEJCMzAsIDB4QkIzOSwgMHg2RTk2LCAweDgyMzQsIDB4QkMzMCwgMHhCQzM5LCAweDZFQTAsIDB4ODIzNCwKLSAgICAweEJEMzAsIDB4QkQzOSwgMHg2RUFBLCAweDgyMzQsIDB4QkUzMCwgMHhCRTM5LCAweDZFQjQsIDB4ODIzNCwgMHhCRjMwLAotICAgIDB4QkYzOSwgMHg2RUJFLCAweDgyMzQsIDB4QzAzMCwgMHhDMDM5LCAweDZFQzgsIDB4ODIzNCwgMHhDMTMwLCAweEMxMzksCi0gICAgMHg2RUQyLCAweDgyMzQsIDB4QzIzMCwgMHhDMjM5LCAweDZFREMsIDB4ODIzNCwgMHhDMzMwLCAweEMzMzksIDB4NkVFNiwKLSAgICAweDgyMzQsIDB4QzQzMCwgMHhDNDM5LCAweDZFRjAsIDB4ODIzNCwgMHhDNTMwLCAweEM1MzksIDB4NkVGQSwgMHg4MjM0LAotICAgIDB4QzYzMCwgMHhDNjM5LCAweDZGMDQsIDB4ODIzNCwgMHhDNzMwLCAweEM3MzksIDB4NkYwRSwgMHg4MjM0LCAweEM4MzAsCi0gICAgMHhDODM5LCAweDZGMTgsIDB4ODIzNCwgMHhDOTMwLCAweEM5MzksIDB4NkYyMiwgMHg4MjM0LCAweENBMzAsIDB4Q0EzOSwKLSAgICAweDZGMkMsIDB4ODIzNCwgMHhDQjMwLCAweENCMzksIDB4NkYzNiwgMHg4MjM0LCAweENDMzAsIDB4Q0MzOSwgMHg2RjQwLAotICAgIDB4ODIzNCwgMHhDRDMwLCAweENEMzksIDB4NkY0QSwgMHg4MjM0LCAweENFMzAsIDB4Q0UzOSwgMHg2RjU0LCAweDgyMzQsCi0gICAgMHhDRjMwLCAweENGMzksIDB4NkY1RSwgMHg4MjM0LCAweEQwMzAsIDB4RDAzOSwgMHg2RjY4LCAweDgyMzQsIDB4RDEzMCwKLSAgICAweEQxMzksIDB4NkY3MiwgMHg4MjM0LCAweEQyMzAsIDB4RDIzOSwgMHg2RjdDLCAweDgyMzQsIDB4RDMzMCwgMHhEMzM5LAotICAgIDB4NkY4NiwgMHg4MjM0LCAweEQ0MzAsIDB4RDQzOSwgMHg2RjkwLCAweDgyMzQsIDB4RDUzMCwgMHhENTM5LCAweDZGOUEsCi0gICAgMHg4MjM0LCAweEQ2MzAsIDB4RDYzOSwgMHg2RkE0LCAweDgyMzQsIDB4RDczMCwgMHhENzM5LCAweDZGQUUsIDB4ODIzNCwKLSAgICAweEQ4MzAsIDB4RDgzOSwgMHg2RkI4LCAweDgyMzQsIDB4RDkzMCwgMHhEOTM5LCAweDZGQzIsIDB4ODIzNCwgMHhEQTMwLAotICAgIDB4REEzOSwgMHg2RkNDLCAweDgyMzQsIDB4REIzMCwgMHhEQjM5LCAweDZGRDYsIDB4ODIzNCwgMHhEQzMwLCAweERDMzksCi0gICAgMHg2RkUwLCAweDgyMzQsIDB4REQzMCwgMHhERDM5LCAweDZGRUEsIDB4ODIzNCwgMHhERTMwLCAweERFMzksIDB4NkZGNCwKLSAgICAweDgyMzQsIDB4REYzMCwgMHhERjM5LCAweDZGRkUsIDB4ODIzNCwgMHhFMDMwLCAweEUwMzksIDB4NzAwOCwgMHg4MjM0LAotICAgIDB4RTEzMCwgMHhFMTM5LCAweDcwMTIsIDB4ODIzNCwgMHhFMjMwLCAweEUyMzksIDB4NzAxQywgMHg4MjM0LCAweEUzMzAsCi0gICAgMHhFMzM5LCAweDcwMjYsIDB4ODIzNCwgMHhFNDMwLCAweEU0MzksIDB4NzAzMCwgMHg4MjM0LCAweEU1MzAsIDB4RTUzOSwKLSAgICAweDcwM0EsIDB4ODIzNCwgMHhFNjMwLCAweEU2MzksIDB4NzA0NCwgMHg4MjM0LCAweEU3MzAsIDB4RTczOSwgMHg3MDRFLAotICAgIDB4ODIzNCwgMHhFODMwLCAweEU4MzksIDB4NzA1OCwgMHg4MjM0LCAweEU5MzAsIDB4RTkzOSwgMHg3MDYyLCAweDgyMzQsCi0gICAgMHhFQTMwLCAweEVBMzksIDB4NzA2QywgMHg4MjM0LCAweEVCMzAsIDB4RUIzOSwgMHg3MDc2LCAweDgyMzQsIDB4RUMzMCwKLSAgICAweEVDMzksIDB4NzA4MCwgMHg4MjM0LCAweEVEMzAsIDB4RUQzOSwgMHg3MDhBLCAweDgyMzQsIDB4RUUzMCwgMHhFRTM5LAotICAgIDB4NzA5NCwgMHg4MjM0LCAweEVGMzAsIDB4RUYzOSwgMHg3MDlFLCAweDgyMzQsIDB4RjAzMCwgMHhGMDM5LCAweDcwQTgsCi0gICAgMHg4MjM0LCAweEYxMzAsIDB4RjEzOSwgMHg3MEIyLCAweDgyMzQsIDB4RjIzMCwgMHhGMjM5LCAweDcwQkMsIDB4ODIzNCwKLSAgICAweEYzMzAsIDB4RjMzOSwgMHg3MEM2LCAweDgyMzQsIDB4RjQzMCwgMHhGNDM5LCAweDcwRDAsIDB4ODIzNCwgMHhGNTMwLAotICAgIDB4RjUzOSwgMHg3MERBLCAweDgyMzQsIDB4RjYzMCwgMHhGNjM5LCAweDcwRTQsIDB4ODIzNCwgMHhGNzMwLCAweEY3MzksCi0gICAgMHg3MEVFLCAweDgyMzQsIDB4RjgzMCwgMHhGODM5LCAweDcwRjgsIDB4ODIzNCwgMHhGOTMwLCAweEY5MzksIDB4NzEwMiwKLSAgICAweDgyMzQsIDB4RkEzMCwgMHhGQTM5LCAweDcxMEMsIDB4ODIzNCwgMHhGQjMwLCAweEZCMzksIDB4NzExNiwgMHg4MjM0LAotICAgIDB4RkMzMCwgMHhGQzM5LCAweDcxMjAsIDB4ODIzNCwgMHhGRDMwLCAweEZEMzksIDB4NzEyQSwgMHg4MjM0LCAweEZFMzAsCi0gICAgMHhGRTM5LCAweDcxMzQsIDB4ODIzNSwgMHg4MTMwLCAweDgxMzksIDB4NzEzRSwgMHg4MjM1LCAweDgyMzAsIDB4ODIzOSwKLSAgICAweDcxNDgsIDB4ODIzNSwgMHg4MzMwLCAweDgzMzksIDB4NzE1MiwgMHg4MjM1LCAweDg0MzAsIDB4ODQzOSwgMHg3MTVDLAotICAgIDB4ODIzNSwgMHg4NTMwLCAweDg1MzksIDB4NzE2NiwgMHg4MjM1LCAweDg2MzAsIDB4ODYzOSwgMHg3MTcwLCAweDgyMzUsCi0gICAgMHg4NzMwLCAweDg3MzgsIDB4NzE3QSwgMHg4MjM1LCAweDk4MzMsIDB4OTgzOSwgMHg3MTg4LCAweDgyMzUsIDB4OTkzMCwKLSAgICAweDk5MzksIDB4NzE4RiwgMHg4MjM1LCAweDlBMzAsIDB4OUEzOSwgMHg3MTk5LCAweDgyMzUsIDB4OUIzMCwgMHg5QjM5LAotICAgIDB4NzFBMywgMHg4MjM1LCAweDlDMzAsIDB4OUMzOSwgMHg3MUFELCAweDgyMzUsIDB4OUQzMCwgMHg5RDM5LCAweDcxQjcsCi0gICAgMHg4MjM1LCAweDlFMzAsIDB4OUUzOSwgMHg3MUMxLCAweDgyMzUsIDB4OUYzMCwgMHg5RjM5LCAweDcxQ0IsIDB4ODIzNSwKLSAgICAweEEwMzAsIDB4QTAzOSwgMHg3MUQ1LCAweDgyMzUsIDB4QTEzMCwgMHhBMTM5LCAweDcxREYsIDB4ODIzNSwgMHhBMjMwLAotICAgIDB4QTIzOSwgMHg3MUU5LCAweDgyMzUsIDB4QTMzMCwgMHhBMzM5LCAweDcxRjMsIDB4ODIzNSwgMHhBNDMwLCAweEE0MzksCi0gICAgMHg3MUZELCAweDgyMzUsIDB4QTUzMCwgMHhBNTM5LCAweDcyMDcsIDB4ODIzNSwgMHhBNjMwLCAweEE2MzksIDB4NzIxMSwKLSAgICAweDgyMzUsIDB4QTczMCwgMHhBNzM5LCAweDcyMUIsIDB4ODIzNSwgMHhBODMwLCAweEE4MzksIDB4NzIyNSwgMHg4MjM1LAotICAgIDB4QTkzMCwgMHhBOTM5LCAweDcyMkYsIDB4ODIzNSwgMHhBQTMwLCAweEFBMzksIDB4NzIzOSwgMHg4MjM1LCAweEFCMzAsCi0gICAgMHhBQjM5LCAweDcyNDMsIDB4ODIzNSwgMHhBQzMwLCAweEFDMzksIDB4NzI0RCwgMHg4MjM1LCAweEFEMzAsIDB4QUQzOSwKLSAgICAweDcyNTcsIDB4ODIzNSwgMHhBRTMwLCAweEFFMzksIDB4NzI2MSwgMHg4MjM1LCAweEFGMzAsIDB4QUYzOSwgMHg3MjZCLAotICAgIDB4ODIzNSwgMHhCMDMwLCAweEIwMzksIDB4NzI3NSwgMHg4MjM1LCAweEIxMzAsIDB4QjEzOSwgMHg3MjdGLCAweDgyMzUsCi0gICAgMHhCMjMwLCAweEIyMzksIDB4NzI4OSwgMHg4MjM1LCAweEIzMzAsIDB4QjMzOSwgMHg3MjkzLCAweDgyMzUsIDB4QjQzMCwKLSAgICAweEI0MzksIDB4NzI5RCwgMHg4MjM1LCAweEI1MzAsIDB4QjUzOSwgMHg3MkE3LCAweDgyMzUsIDB4QjYzMCwgMHhCNjM5LAotICAgIDB4NzJCMSwgMHg4MjM1LCAweEI3MzAsIDB4QjczOSwgMHg3MkJCLCAweDgyMzUsIDB4QjgzMCwgMHhCODM5LCAweDcyQzUsCi0gICAgMHg4MjM1LCAweEI5MzAsIDB4QjkzOSwgMHg3MkNGLCAweDgyMzUsIDB4QkEzMCwgMHhCQTM5LCAweDcyRDksIDB4ODIzNSwKLSAgICAweEJCMzAsIDB4QkIzOSwgMHg3MkUzLCAweDgyMzUsIDB4QkMzMCwgMHhCQzM5LCAweDcyRUQsIDB4ODIzNSwgMHhCRDMwLAotICAgIDB4QkQzOSwgMHg3MkY3LCAweDgyMzUsIDB4QkUzMCwgMHhCRTM5LCAweDczMDEsIDB4ODIzNSwgMHhCRjMwLCAweEJGMzksCi0gICAgMHg3MzBCLCAweDgyMzUsIDB4QzAzMCwgMHhDMDM5LCAweDczMTUsIDB4ODIzNSwgMHhDMTMwLCAweEMxMzksIDB4NzMxRiwKLSAgICAweDgyMzUsIDB4QzIzMCwgMHhDMjM5LCAweDczMjksIDB4ODIzNSwgMHhDMzMwLCAweEMzMzksIDB4NzMzMywgMHg4MjM1LAotICAgIDB4QzQzMCwgMHhDNDM5LCAweDczM0QsIDB4ODIzNSwgMHhDNTMwLCAweEM1MzksIDB4NzM0NywgMHg4MjM1LCAweEM2MzAsCi0gICAgMHhDNjM5LCAweDczNTEsIDB4ODIzNSwgMHhDNzMwLCAweEM3MzksIDB4NzM1QiwgMHg4MjM1LCAweEM4MzAsIDB4QzgzOSwKLSAgICAweDczNjUsIDB4ODIzNSwgMHhDOTMwLCAweEM5MzksIDB4NzM2RiwgMHg4MjM1LCAweENBMzAsIDB4Q0EzOSwgMHg3Mzc5LAotICAgIDB4ODIzNSwgMHhDQjMwLCAweENCMzksIDB4NzM4MywgMHg4MjM1LCAweENDMzAsIDB4Q0MzOSwgMHg3MzhELCAweDgyMzUsCi0gICAgMHhDRDMwLCAweENEMzksIDB4NzM5NywgMHg4MjM1LCAweENFMzAsIDB4Q0UzOSwgMHg3M0ExLCAweDgyMzUsIDB4Q0YzMCwKLSAgICAweENGMzksIDB4NzNBQiwgMHg4MjM1LCAweEQwMzAsIDB4RDAzOSwgMHg3M0I1LCAweDgyMzUsIDB4RDEzMCwgMHhEMTM5LAotICAgIDB4NzNCRiwgMHg4MjM1LCAweEQyMzAsIDB4RDIzOSwgMHg3M0M5LCAweDgyMzUsIDB4RDMzMCwgMHhEMzM5LCAweDczRDMsCi0gICAgMHg4MjM1LCAweEQ0MzAsIDB4RDQzOSwgMHg3M0RELCAweDgyMzUsIDB4RDUzMCwgMHhENTM5LCAweDczRTcsIDB4ODIzNSwKLSAgICAweEQ2MzAsIDB4RDYzOSwgMHg3M0YxLCAweDgyMzUsIDB4RDczMCwgMHhENzM5LCAweDczRkIsIDB4ODIzNSwgMHhEODMwLAotICAgIDB4RDgzOSwgMHg3NDA1LCAweDgyMzUsIDB4RDkzMCwgMHhEOTM5LCAweDc0MEYsIDB4ODIzNSwgMHhEQTMwLCAweERBMzksCi0gICAgMHg3NDE5LCAweDgyMzUsIDB4REIzMCwgMHhEQjM5LCAweDc0MjMsIDB4ODIzNSwgMHhEQzMwLCAweERDMzksIDB4NzQyRCwKLSAgICAweDgyMzUsIDB4REQzMCwgMHhERDM5LCAweDc0MzcsIDB4ODIzNSwgMHhERTMwLCAweERFMzksIDB4NzQ0MSwgMHg4MjM1LAotICAgIDB4REYzMCwgMHhERjM5LCAweDc0NEIsIDB4ODIzNSwgMHhFMDMwLCAweEUwMzksIDB4NzQ1NSwgMHg4MjM1LCAweEUxMzAsCi0gICAgMHhFMTM5LCAweDc0NUYsIDB4ODIzNSwgMHhFMjMwLCAweEUyMzksIDB4NzQ2OSwgMHg4MjM1LCAweEUzMzAsIDB4RTMzOSwKLSAgICAweDc0NzMsIDB4ODIzNSwgMHhFNDMwLCAweEU0MzksIDB4NzQ3RCwgMHg4MjM1LCAweEU1MzAsIDB4RTUzOSwgMHg3NDg3LAotICAgIDB4ODIzNSwgMHhFNjMwLCAweEU2MzksIDB4NzQ5MSwgMHg4MjM1LCAweEU3MzAsIDB4RTczOSwgMHg3NDlCLCAweDgyMzUsCi0gICAgMHhFODMwLCAweEU4MzksIDB4NzRBNSwgMHg4MjM1LCAweEU5MzAsIDB4RTkzOSwgMHg3NEFGLCAweDgyMzUsIDB4RUEzMCwKLSAgICAweEVBMzksIDB4NzRCOSwgMHg4MjM1LCAweEVCMzAsIDB4RUIzOSwgMHg3NEMzLCAweDgyMzUsIDB4RUMzMCwgMHhFQzM5LAotICAgIDB4NzRDRCwgMHg4MjM1LCAweEVEMzAsIDB4RUQzOSwgMHg3NEQ3LCAweDgyMzUsIDB4RUUzMCwgMHhFRTM5LCAweDc0RTEsCi0gICAgMHg4MjM1LCAweEVGMzAsIDB4RUYzOSwgMHg3NEVCLCAweDgyMzUsIDB4RjAzMCwgMHhGMDM5LCAweDc0RjUsIDB4ODIzNSwKLSAgICAweEYxMzAsIDB4RjEzOSwgMHg3NEZGLCAweDgyMzUsIDB4RjIzMCwgMHhGMjM5LCAweDc1MDksIDB4ODIzNSwgMHhGMzMwLAotICAgIDB4RjMzOSwgMHg3NTEzLCAweDgyMzUsIDB4RjQzMCwgMHhGNDM5LCAweDc1MUQsIDB4ODIzNSwgMHhGNTMwLCAweEY1MzksCi0gICAgMHg3NTI3LCAweDgyMzUsIDB4RjYzMCwgMHhGNjM5LCAweDc1MzEsIDB4ODIzNSwgMHhGNzMwLCAweEY3MzksIDB4NzUzQiwKLSAgICAweDgyMzUsIDB4RjgzMCwgMHhGODM5LCAweDc1NDUsIDB4ODIzNSwgMHhGOTMwLCAweEY5MzksIDB4NzU0RiwgMHg4MjM1LAotICAgIDB4RkEzMCwgMHhGQTM5LCAweDc1NTksIDB4ODIzNSwgMHhGQjMwLCAweEZCMzksIDB4NzU2MywgMHg4MjM1LCAweEZDMzAsCi0gICAgMHhGQzM5LCAweDc1NkQsIDB4ODIzNSwgMHhGRDMwLCAweEZEMzksIDB4NzU3NywgMHg4MjM1LCAweEZFMzAsIDB4RkUzOSwKLSAgICAweDc1ODEsIDB4ODIzNiwgMHg4MTMwLCAweDgxMzksIDB4NzU4QiwgMHg4MjM2LCAweDgyMzAsIDB4ODIzOSwgMHg3NTk1LAotICAgIDB4ODIzNiwgMHg4MzMwLCAweDgzMzksIDB4NzU5RiwgMHg4MjM2LCAweDg0MzAsIDB4ODQzOSwgMHg3NUE5LCAweDgyMzYsCi0gICAgMHg4NTMwLCAweDg1MzksIDB4NzVCMywgMHg4MjM2LCAweDg2MzAsIDB4ODYzOSwgMHg3NUJELCAweDgyMzYsIDB4ODczMCwKLSAgICAweDg3MzksIDB4NzVDNywgMHg4MjM2LCAweDg4MzAsIDB4ODgzOSwgMHg3NUQxLCAweDgyMzYsIDB4ODkzMCwgMHg4OTM5LAotICAgIDB4NzVEQiwgMHg4MjM2LCAweDhBMzAsIDB4OEEzOSwgMHg3NUU1LCAweDgyMzYsIDB4OEIzMCwgMHg4QjM5LCAweDc1RUYsCi0gICAgMHg4MjM2LCAweDhDMzAsIDB4OEMzOSwgMHg3NUY5LCAweDgyMzYsIDB4OEQzMCwgMHg4RDM5LCAweDc2MDMsIDB4ODIzNiwKLSAgICAweDhFMzAsIDB4OEUzNywgMHg3NjBELCAweDgyMzYsIDB4OEYzMSwgMHg4RjM5LCAweDc2MTUsIDB4ODIzNiwgMHg5MDMwLAotICAgIDB4OTAzOSwgMHg3NjFFLCAweDgyMzYsIDB4OTEzMCwgMHg5MTM5LCAweDc2MjgsIDB4ODIzNiwgMHg5MjMwLCAweDkyMzksCi0gICAgMHg3NjMyLCAweDgyMzYsIDB4OTMzMCwgMHg5MzM5LCAweDc2M0MsIDB4ODIzNiwgMHg5NDMwLCAweDk0MzUsIDB4NzY0NiwKK2NvbnN0IEZYQ01BUF9EV29yZENJRE1hcCBnX0ZYQ01BUF9HQksyS19IXzVfRFdvcmRbMTAxN10gPSB7CisgICAgezB4ODEzMCwgMHg4NDM2LCAweDg0MzYsIDB4NTc1Mn0sIHsweDgxMzgsIDB4RkQzOCwgMHhGRDM5LCAweDU3OUN9LAorICAgIHsweDgxMzgsIDB4RkUzMCwgMHhGRTM5LCAweDU3OUV9LCB7MHg4MTM5LCAweDgxMzAsIDB4ODEzNywgMHg1N0E4fSwKKyAgICB7MHg4MTM5LCAweDgxMzksIDB4ODEzOSwgMHg1N0IwfSwgezB4ODEzOSwgMHg4MjMwLCAweDgyMzksIDB4NTdCMX0sCisgICAgezB4ODEzOSwgMHg4MzMwLCAweDgzMzksIDB4NTdCQn0sIHsweDgxMzksIDB4ODQzMCwgMHg4NDM5LCAweDU3QzV9LAorICAgIHsweDgxMzksIDB4ODUzMCwgMHg4NTM5LCAweDU3Q0Z9LCB7MHg4MTM5LCAweDg2MzAsIDB4ODYzOSwgMHg1N0Q5fSwKKyAgICB7MHg4MTM5LCAweDg3MzAsIDB4ODczOSwgMHg1N0UzfSwgezB4ODEzOSwgMHg4ODMwLCAweDg4MzksIDB4NTdFRH0sCisgICAgezB4ODEzOSwgMHg4OTMwLCAweDg5MzksIDB4NTdGN30sIHsweDgxMzksIDB4OEIzMiwgMHg4QjMyLCAweDEwNDJ9LAorICAgIHsweDgxMzksIDB4OEIzMywgMHg4QjMzLCAweDEyNjN9LCB7MHg4MTM5LCAweDhCMzQsIDB4OEIzNCwgMHgxMjcyfSwKKyAgICB7MHg4MTM5LCAweDhCMzUsIDB4OEIzNSwgMHgxMjY1fSwgezB4ODEzOSwgMHg4QjM2LCAweDhCMzYsIDB4MTA1OX0sCisgICAgezB4ODEzOSwgMHg4QjM3LCAweDhCMzcsIDB4Mjc5M30sIHsweDgxMzksIDB4OEIzOCwgMHg4QjM4LCAweDA2M0R9LAorICAgIHsweDgxMzksIDB4OEIzOSwgMHg4QjM5LCAweDEzMDN9LCB7MHg4MTM5LCAweDhDMzAsIDB4OEMzMCwgMHgwQ0E2fSwKKyAgICB7MHg4MTM5LCAweDhDMzEsIDB4OEMzMSwgMHgwNjM4fSwgezB4ODEzOSwgMHg4QzMyLCAweDhDMzIsIDB4MENDNn0sCisgICAgezB4ODEzOSwgMHg4QzMzLCAweDhDMzMsIDB4MDNENn0sIHsweDgxMzksIDB4OEMzNCwgMHg4QzM0LCAweDEyOUR9LAorICAgIHsweDgxMzksIDB4OEMzNSwgMHg4QzM1LCAweDEzMTR9LCB7MHg4MTM5LCAweDhDMzYsIDB4OEMzNiwgMHgxMzBGfSwKKyAgICB7MHg4MTM5LCAweDhDMzcsIDB4OEMzNywgMHgwODJCfSwgezB4ODEzOSwgMHg4QzM4LCAweDhDMzgsIDB4MTM5OX0sCisgICAgezB4ODEzOSwgMHg4QzM5LCAweDhDMzksIDB4MDU5N30sIHsweDgxMzksIDB4OEQzMCwgMHg4RDMwLCAweDA5RUZ9LAorICAgIHsweDgxMzksIDB4OEQzMSwgMHg4RDMxLCAweDEyRkN9LCB7MHg4MTM5LCAweDhEMzIsIDB4OEQzMiwgMHgxMjY2fSwKKyAgICB7MHg4MTM5LCAweDhEMzMsIDB4OEQzMywgMHgxMjg0fSwgezB4ODEzOSwgMHg4RDM0LCAweDhEMzQsIDB4MkExQX0sCisgICAgezB4ODEzOSwgMHg4RDM1LCAweDhEMzUsIDB4MEQ0NX0sIHsweDgxMzksIDB4OEQzNiwgMHg4RDM2LCAweDA0N0V9LAorICAgIHsweDgxMzksIDB4OEQzNywgMHg4RDM3LCAweDEzNTJ9LCB7MHg4MTM5LCAweDhEMzgsIDB4OEQzOCwgMHgwNENDfSwKKyAgICB7MHg4MTM5LCAweDhEMzksIDB4OEQzOSwgMHgxMzlDfSwgezB4ODEzOSwgMHg4RTMwLCAweDhFMzAsIDB4MTBCQn0sCisgICAgezB4ODEzOSwgMHg4RTMxLCAweDhFMzEsIDB4MDk2N30sIHsweDgxMzksIDB4OEUzMiwgMHg4RTMyLCAweDE1OTN9LAorICAgIHsweDgxMzksIDB4OEUzMywgMHg4RTMzLCAweDBFNzJ9LCB7MHg4MTM5LCAweDhFMzQsIDB4OEUzNCwgMHgwRDU2fSwKKyAgICB7MHg4MTM5LCAweDhFMzUsIDB4OEUzNSwgMHgxNjFDfSwgezB4ODEzOSwgMHg4RTM2LCAweDhFMzYsIDB4MkQyRH0sCisgICAgezB4ODEzOSwgMHg4RTM3LCAweDhFMzcsIDB4MEYxM30sIHsweDgxMzksIDB4OEUzOCwgMHg4RTM4LCAweDA1NzZ9LAorICAgIHsweDgxMzksIDB4OEUzOSwgMHg4RTM5LCAweDBCNkZ9LCB7MHg4MTM5LCAweDhGMzAsIDB4OEYzMCwgMHgxMjMwfSwKKyAgICB7MHg4MTM5LCAweDhGMzEsIDB4OEYzMSwgMHgxNzJFfSwgezB4ODEzOSwgMHg4RjMyLCAweDhGMzIsIDB4MDU2QX0sCisgICAgezB4ODEzOSwgMHg4RjMzLCAweDhGMzMsIDB4MEY2Q30sIHsweDgxMzksIDB4OEYzNCwgMHg4RjM0LCAweDE0QjZ9LAorICAgIHsweDgxMzksIDB4OEYzNSwgMHg4RjM1LCAweDBENDN9LCB7MHg4MTM5LCAweDhGMzYsIDB4OEYzNiwgMHgxNzc0fSwKKyAgICB7MHg4MTM5LCAweDhGMzcsIDB4OEYzNywgMHgwQ0Y2fSwgezB4ODEzOSwgMHg4RjM4LCAweDhGMzgsIDB4MTgxNX0sCisgICAgezB4ODEzOSwgMHg4RjM5LCAweDhGMzksIDB4MDZGRH0sIHsweDgxMzksIDB4OTAzMCwgMHg5MDMwLCAweDA4MkR9LAorICAgIHsweDgxMzksIDB4OTAzMSwgMHg5MDMxLCAweDA4QkV9LCB7MHg4MTM5LCAweDkwMzIsIDB4OTAzMiwgMHgwNkM0fSwKKyAgICB7MHg4MTM5LCAweDkwMzMsIDB4OTAzMywgMHgxODEzfSwgezB4ODEzOSwgMHg5MDM0LCAweDkwMzQsIDB4MDczQ30sCisgICAgezB4ODEzOSwgMHg5MDM1LCAweDkwMzUsIDB4MTM5OH0sIHsweDgxMzksIDB4OTAzNiwgMHg5MDM2LCAweDE0QUR9LAorICAgIHsweDgxMzksIDB4OTAzNywgMHg5MDM3LCAweDE0RjZ9LCB7MHg4MTM5LCAweDkwMzgsIDB4OTAzOCwgMHgwNzA2fSwKKyAgICB7MHg4MTM5LCAweDkwMzksIDB4OTAzOSwgMHgxNzYyfSwgezB4ODEzOSwgMHg5MTMwLCAweDkxMzAsIDB4MTVFRX0sCisgICAgezB4ODEzOSwgMHg5MTMxLCAweDkxMzEsIDB4MTVFMH0sIHsweDgxMzksIDB4OTEzMiwgMHg5MTMyLCAweDBGOEZ9LAorICAgIHsweDgxMzksIDB4OTEzMywgMHg5MTMzLCAweDA2RTV9LCB7MHg4MTM5LCAweDkxMzQsIDB4OTEzNCwgMHgzMjkyfSwKKyAgICB7MHg4MTM5LCAweDkxMzUsIDB4OTEzNSwgMHgwRDZEfSwgezB4ODEzOSwgMHg5MTM2LCAweDkxMzYsIDB4MTFBNn0sCisgICAgezB4ODEzOSwgMHg5MTM3LCAweDkxMzcsIDB4MTkwOX0sIHsweDgxMzksIDB4OTEzOCwgMHg5MTM4LCAweDBFRDN9LAorICAgIHsweDgxMzksIDB4OTEzOSwgMHg5MTM5LCAweDA1RjZ9LCB7MHg4MTM5LCAweDkyMzAsIDB4OTIzMCwgMHgwOEMwfSwKKyAgICB7MHg4MTM5LCAweDkyMzEsIDB4OTIzMSwgMHgwNjVBfSwgezB4ODEzOSwgMHg5MjMyLCAweDkyMzIsIDB4MEVFRH0sCisgICAgezB4ODEzOSwgMHg5MjMzLCAweDkyMzMsIDB4MENCMH0sIHsweDgxMzksIDB4OTIzNCwgMHg5MjM0LCAweDEwRkV9LAorICAgIHsweDgxMzksIDB4OTIzNSwgMHg5MjM1LCAweDExMDV9LCB7MHg4MTM5LCAweDkyMzYsIDB4OTIzNiwgMHgwQjIxfSwKKyAgICB7MHg4MTM5LCAweDkyMzcsIDB4OTIzNywgMHgwQzM0fSwgezB4ODEzOSwgMHg5MjM4LCAweDkyMzgsIDB4MTFCOH0sCisgICAgezB4ODEzOSwgMHg5MjM5LCAweDkyMzksIDB4MDU3OH0sIHsweDgxMzksIDB4OTMzMCwgMHg5MzMwLCAweDE5QkR9LAorICAgIHsweDgxMzksIDB4OTMzMSwgMHg5MzMxLCAweDBFRjJ9LCB7MHg4MTM5LCAweDkzMzIsIDB4OTMzMiwgMHgwNDMxfSwKKyAgICB7MHg4MTM5LCAweDkzMzMsIDB4OTMzMywgMHgwQUIwfSwgezB4ODEzOSwgMHg5MzM0LCAweDkzMzQsIDB4MEQ2Nn0sCisgICAgezB4ODEzOSwgMHg5MzM1LCAweDkzMzUsIDB4MEMxN30sIHsweDgxMzksIDB4OTMzNiwgMHg5MzM2LCAweDBEQTN9LAorICAgIHsweDgxMzksIDB4OTMzNywgMHg5MzM3LCAweDA4MDV9LCB7MHg4MTM5LCAweDkzMzgsIDB4OTMzOCwgMHgxMjAzfSwKKyAgICB7MHg4MTM5LCAweDkzMzksIDB4OTMzOSwgMHgwNkIzfSwgezB4ODEzOSwgMHg5NDMwLCAweDk0MzAsIDB4MTI2OX0sCisgICAgezB4ODEzOSwgMHg5NDMxLCAweDk0MzEsIDB4MTY5RH0sIHsweDgxMzksIDB4OTQzMiwgMHg5NDMyLCAweDBCQ0J9LAorICAgIHsweDgxMzksIDB4OTQzMywgMHg5NDMzLCAweDBGRTl9LCB7MHg4MTM5LCAweDk0MzQsIDB4OTQzNCwgMHgwQjY0fSwKKyAgICB7MHg4MTM5LCAweDk0MzUsIDB4OTQzNSwgMHgwQzg5fSwgezB4ODEzOSwgMHg5NDM2LCAweDk0MzYsIDB4MEZDOX0sCisgICAgezB4ODEzOSwgMHg5NDM3LCAweDk0MzcsIDB4MTBENn0sIHsweDgxMzksIDB4OTQzOCwgMHg5NDM4LCAweDA3Mjh9LAorICAgIHsweDgxMzksIDB4OTQzOSwgMHg5NDM5LCAweDBFOTB9LCB7MHg4MTM5LCAweDk1MzAsIDB4OTUzMCwgMHgwNkM1fSwKKyAgICB7MHg4MTM5LCAweDk1MzEsIDB4OTUzMSwgMHgwRDMzfSwgezB4ODEzOSwgMHg5NTMyLCAweDk1MzIsIDB4MTBBOH0sCisgICAgezB4ODEzOSwgMHg5NTMzLCAweDk1MzMsIDB4MEU0Mn0sIHsweDgxMzksIDB4OTUzNCwgMHg5NTM0LCAweDFCQzZ9LAorICAgIHsweDgxMzksIDB4OTUzNSwgMHg5NTM1LCAweDFCNjB9LCB7MHg4MTM5LCAweDk1MzYsIDB4OTUzNiwgMHgzRUJGfSwKKyAgICB7MHg4MTM5LCAweDk1MzcsIDB4OTUzNywgMHgwM0UyfSwgezB4ODEzOSwgMHg5NTM4LCAweDk1MzgsIDB4MEJDM30sCisgICAgezB4ODEzOSwgMHg5NTM5LCAweDk1MzksIDB4MEFGOH0sIHsweDgxMzksIDB4OTYzMCwgMHg5NjMwLCAweDBCMjJ9LAorICAgIHsweDgxMzksIDB4OTYzMSwgMHg5NjMxLCAweDBBQjF9LCB7MHg4MTM5LCAweDk2MzIsIDB4OTYzMiwgMHgwRDRGfSwKKyAgICB7MHg4MTM5LCAweDk2MzMsIDB4OTYzMywgMHgwRDQ2fSwgezB4ODEzOSwgMHg5NjM0LCAweDk2MzQsIDB4MEQ1NX0sCisgICAgezB4ODEzOSwgMHg5NjM1LCAweDk2MzUsIDB4NDBDQn0sIHsweDgxMzksIDB4OTYzNiwgMHg5NjM2LCAweDA3ODN9LAorICAgIHsweDgxMzksIDB4OTYzNywgMHg5NjM3LCAweDBGRDF9LCB7MHg4MTM5LCAweDk2MzgsIDB4OTYzOCwgMHgwOUVCfSwKKyAgICB7MHg4MTM5LCAweDk2MzksIDB4OTYzOSwgMHgxMUYwfSwgezB4ODEzOSwgMHg5NzMwLCAweDk3MzAsIDB4MEFEQ30sCisgICAgezB4ODEzOSwgMHg5NzMxLCAweDk3MzEsIDB4MUNFN30sIHsweDgxMzksIDB4OTczMiwgMHg5NzMyLCAweDFDNUV9LAorICAgIHsweDgxMzksIDB4OTczMywgMHg5NzMzLCAweDBFQTl9LCB7MHg4MTM5LCAweDk3MzQsIDB4OTczNCwgMHgxMDFCfSwKKyAgICB7MHg4MTM5LCAweDk3MzUsIDB4OTczNSwgMHgxMEQ1fSwgezB4ODEzOSwgMHg5NzM2LCAweDk3MzYsIDB4MDlCQX0sCisgICAgezB4ODEzOSwgMHg5NzM3LCAweDk3MzcsIDB4MDYzN30sIHsweDgxMzksIDB4OTczOCwgMHg5NzM4LCAweDFCQ0J9LAorICAgIHsweDgxMzksIDB4OTczOSwgMHg5NzM5LCAweDA2Mzl9LCB7MHg4MTM5LCAweDk4MzAsIDB4OTgzMCwgMHgxQTFFfSwKKyAgICB7MHg4MTM5LCAweDk4MzEsIDB4OTgzMSwgMHgwQ0JEfSwgezB4ODEzOSwgMHg5ODMyLCAweDk4MzIsIDB4MDRFMX0sCisgICAgezB4ODEzOSwgMHg5ODMzLCAweDk4MzMsIDB4MTIzMX0sIHsweDgxMzksIDB4OTgzNCwgMHg5ODM0LCAweDExQzB9LAorICAgIHsweDgxMzksIDB4OTgzNSwgMHg5ODM1LCAweDA4Rjl9LCB7MHg4MTM5LCAweDk4MzYsIDB4OTgzNiwgMHgwRDE5fSwKKyAgICB7MHg4MTM5LCAweDk4MzcsIDB4OTgzNywgMHgxNjE4fSwgezB4ODEzOSwgMHg5ODM4LCAweDk4MzgsIDB4MTFEQX0sCisgICAgezB4ODEzOSwgMHg5ODM5LCAweDk4MzksIDB4MUNEQ30sIHsweDgxMzksIDB4OTkzMCwgMHg5OTMwLCAweDBDRTR9LAorICAgIHsweDgxMzksIDB4OTkzMSwgMHg5OTMxLCAweDQ1QTJ9LCB7MHg4MTM5LCAweDk5MzIsIDB4OTkzMiwgMHgxQkYwfSwKKyAgICB7MHg4MTM5LCAweDk5MzMsIDB4OTkzMywgMHgwNTBCfSwgezB4ODEzOSwgMHg5OTM0LCAweDk5MzQsIDB4MEZEM30sCisgICAgezB4ODEzOSwgMHg5OTM1LCAweDk5MzUsIDB4MEY5Qn0sIHsweDgxMzksIDB4OTkzNiwgMHg5OTM2LCAweDEwNDl9LAorICAgIHsweDgxMzksIDB4OTkzNywgMHg5OTM3LCAweDQ5REN9LCB7MHg4MTM5LCAweDk5MzgsIDB4OTkzOCwgMHgxRjk2fSwKKyAgICB7MHg4MTM5LCAweDk5MzksIDB4OTkzOSwgMHgwODk4fSwgezB4ODEzOSwgMHg5QTMwLCAweDlBMzAsIDB4MEZGRH0sCisgICAgezB4ODEzOSwgMHg5QTMxLCAweDlBMzEsIDB4MDcyMX0sIHsweDgxMzksIDB4OUEzMiwgMHg5QTMyLCAweDA1Rjh9LAorICAgIHsweDgxMzksIDB4OUEzMywgMHg5QTMzLCAweDFEMTV9LCB7MHg4MTM5LCAweDlBMzQsIDB4OUEzNCwgMHgxRDUwfSwKKyAgICB7MHg4MTM5LCAweDlBMzUsIDB4OUEzNSwgMHgxRTNCfSwgezB4ODEzOSwgMHg5QTM2LCAweDlBMzYsIDB4MDUwNX0sCisgICAgezB4ODEzOSwgMHg5QTM3LCAweDlBMzcsIDB4MTIzQ30sIHsweDgxMzksIDB4OUEzOCwgMHg5QTM4LCAweDEyNDB9LAorICAgIHsweDgxMzksIDB4OUEzOSwgMHg5QTM5LCAweDBEMjZ9LCB7MHg4MTM5LCAweDlCMzAsIDB4OUIzMCwgMHgxRTdCfSwKKyAgICB7MHg4MTM5LCAweDlCMzEsIDB4OUIzMSwgMHgwRjhDfSwgezB4ODEzOSwgMHg5QjMyLCAweDlCMzIsIDB4MDRFMn0sCisgICAgezB4ODEzOSwgMHg5QjMzLCAweDlCMzMsIDB4NEQxM30sIHsweDgxMzksIDB4OUIzNCwgMHg5QjM0LCAweDEwNUZ9LAorICAgIHsweDgxMzksIDB4OUIzNSwgMHg5QjM1LCAweDEwQjR9LCB7MHg4MTM5LCAweDlCMzYsIDB4OUIzNiwgMHg0RTE4fSwKKyAgICB7MHg4MTM5LCAweDlCMzcsIDB4OUIzNywgMHgwOURBfSwgezB4ODEzOSwgMHg5QjM4LCAweDlCMzgsIDB4MDhDMX0sCisgICAgezB4ODEzOSwgMHg5QjM5LCAweDlCMzksIDB4MUU3NX0sIHsweDgxMzksIDB4OUMzMCwgMHg5QzMwLCAweDIwN0R9LAorICAgIHsweDgxMzksIDB4OUMzMSwgMHg5QzMxLCAweDA2QjJ9LCB7MHg4MTM5LCAweDlDMzIsIDB4OUMzMiwgMHgwOUVFfSwKKyAgICB7MHg4MTM5LCAweDlDMzMsIDB4OUMzMywgMHgxRDc5fSwgezB4ODEzOSwgMHg5QzM0LCAweDlDMzQsIDB4MTBDRn0sCisgICAgezB4ODEzOSwgMHg5QzM1LCAweDlDMzUsIDB4NTBFQX0sIHsweDgxMzksIDB4OUMzNiwgMHg5QzM2LCAweDA2NjR9LAorICAgIHsweDgxMzksIDB4OUMzNywgMHg5QzM3LCAweDBBRUJ9LCB7MHg4MTM5LCAweDlDMzgsIDB4OUMzOCwgMHgwNkVBfSwKKyAgICB7MHg4MTM5LCAweDlDMzksIDB4OUMzOSwgMHgyMThEfSwgezB4ODEzOSwgMHg5RDMwLCAweDlEMzAsIDB4MDhGMX0sCisgICAgezB4ODEzOSwgMHg5RDMxLCAweDlEMzEsIDB4MTA3Qn0sIHsweDgxMzksIDB4OUQzMiwgMHg5RDMyLCAweDIyMDl9LAorICAgIHsweDgxMzksIDB4OUQzMywgMHg5RDMzLCAweDFGMDB9LCB7MHg4MTM5LCAweDlEMzQsIDB4OUQzNCwgMHgxRUY0fSwKKyAgICB7MHg4MTM5LCAweDlEMzUsIDB4OUQzNSwgMHgwRDRBfSwgezB4ODEzOSwgMHg5RDM2LCAweDlEMzYsIDB4MEQ2RX0sCisgICAgezB4ODEzOSwgMHg5RDM3LCAweDlEMzcsIDB4MEY1MH0sIHsweDgxMzksIDB4OUQzOCwgMHg5RDM4LCAweDIwNkR9LAorICAgIHsweDgxMzksIDB4OUQzOSwgMHg5RDM5LCAweDA3MjB9LCB7MHg4MTM5LCAweDlFMzAsIDB4OUUzMCwgMHgwNkRBfSwKKyAgICB7MHg4MTM5LCAweDlFMzEsIDB4OUUzMSwgMHgxREVDfSwgezB4ODEzOSwgMHg5RTMyLCAweDlFMzIsIDB4MUVEMH0sCisgICAgezB4ODEzOSwgMHg5RTMzLCAweDlFMzMsIDB4MTM5Qn0sIHsweDgxMzksIDB4OUUzNCwgMHg5RTM0LCAweDEyNjB9LAorICAgIHsweDgxMzksIDB4OUUzNSwgMHg5RTM1LCAweDA3NDZ9LCB7MHg4MTM5LCAweDlFMzYsIDB4OUUzNiwgMHgyMjM5fSwKKyAgICB7MHg4MTM5LCAweDlFMzcsIDB4OUUzNywgMHgyMDlDfSwgezB4ODEzOSwgMHg5RTM4LCAweDlFMzgsIDB4MjY4OH0sCisgICAgezB4ODEzOSwgMHg5RTM5LCAweDlFMzksIDB4MEE2MH0sIHsweDgxMzksIDB4OUYzMCwgMHg5RjMwLCAweDIwNzF9LAorICAgIHsweDgxMzksIDB4OUYzMSwgMHg5RjMxLCAweDBBOTB9LCB7MHg4MTM5LCAweDlGMzIsIDB4OUYzMiwgMHg1NTg2fSwKKyAgICB7MHg4MTM5LCAweDlGMzMsIDB4OUYzMywgMHgwRDg5fSwgezB4ODEzOSwgMHg5RjM0LCAweDlGMzQsIDB4MDc5MX0sCisgICAgezB4ODEzOSwgMHg5RjM1LCAweDlGMzUsIDB4MUE1NX0sIHsweDgxMzksIDB4OUYzNiwgMHg5RjM2LCAweDI2MTh9LAorICAgIHsweDgxMzksIDB4OUYzNywgMHg5RjM3LCAweDA1RTV9LCB7MHg4MTM5LCAweDlGMzgsIDB4OUYzOCwgMHgwNzFEfSwKKyAgICB7MHg4MTM5LCAweDlGMzksIDB4OUYzOSwgMHgwRDhBfSwgezB4ODEzOSwgMHhBMDMwLCAweEEwMzAsIDB4MDQzMH0sCisgICAgezB4ODEzOSwgMHhBMDMxLCAweEEwMzEsIDB4MjBDNn0sIHsweDgxMzksIDB4QTAzMiwgMHhBMDMyLCAweDFFODZ9LAorICAgIHsweDgxMzksIDB4QTAzMywgMHhBMDMzLCAweDIwMzd9LCB7MHg4MTM5LCAweEEwMzQsIDB4QTAzNCwgMHgxRjM0fSwKKyAgICB7MHg4MTM5LCAweEEwMzUsIDB4QTAzNSwgMHgxMkYzfSwgezB4ODEzOSwgMHhBNTMzLCAweEE1MzUsIDB4NTc3Qn0sCisgICAgezB4ODEzOSwgMHhBNTM4LCAweEE1MzksIDB4NTc3RX0sIHsweDgxMzksIDB4QTYzMCwgMHhBNjMwLCAweDU3ODB9LAorICAgIHsweDgxMzksIDB4QTYzNCwgMHhBNjM0LCAweDU3NTV9LCB7MHg4MTM5LCAweEE2MzYsIDB4QTYzNiwgMHg1NzY3fSwKKyAgICB7MHg4MTM5LCAweEE3MzUsIDB4QTczNSwgMHg1Nzc2fSwgezB4ODEzOSwgMHhBNzM2LCAweEE3MzYsIDB4NTc3OH0sCisgICAgezB4ODEzOSwgMHhBNzM3LCAweEE3MzcsIDB4NTc3N30sIHsweDgxMzksIDB4QTczOCwgMHhBNzM4LCAweDU3Nzl9LAorICAgIHsweDgxMzksIDB4QTgzNiwgMHhBODM4LCAweDU3ODF9LCB7MHg4MTM5LCAweEI0MzQsIDB4QjQzOSwgMHg1Nzg0fSwKKyAgICB7MHg4MTM5LCAweEI1MzAsIDB4QjUzOSwgMHg1NzhBfSwgezB4ODEzOSwgMHhCNjMwLCAweEI2MzcsIDB4NTc5NH0sCisgICAgezB4ODEzOSwgMHhFRTM5LCAweEVFMzksIDB4NTgwMX0sIHsweDgxMzksIDB4RUYzMCwgMHhFRjM5LCAweDU4MDJ9LAorICAgIHsweDgxMzksIDB4RjAzMCwgMHhGMDM5LCAweDU4MEN9LCB7MHg4MTM5LCAweEYxMzAsIDB4RjEzOSwgMHg1ODE2fSwKKyAgICB7MHg4MTM5LCAweEYyMzAsIDB4RjIzOSwgMHg1ODIwfSwgezB4ODEzOSwgMHhGMzMwLCAweEYzMzksIDB4NTgyQX0sCisgICAgezB4ODEzOSwgMHhGNDMwLCAweEY0MzksIDB4NTgzNH0sIHsweDgxMzksIDB4RjUzMCwgMHhGNTM5LCAweDU4M0V9LAorICAgIHsweDgxMzksIDB4RjYzMCwgMHhGNjM5LCAweDU4NDh9LCB7MHg4MTM5LCAweEY3MzAsIDB4RjczOSwgMHg1ODUyfSwKKyAgICB7MHg4MTM5LCAweEY4MzAsIDB4RjgzOSwgMHg1ODVDfSwgezB4ODEzOSwgMHhGOTMwLCAweEY5MzksIDB4NTg2Nn0sCisgICAgezB4ODEzOSwgMHhGQTMwLCAweEZBMzksIDB4NTg3MH0sIHsweDgxMzksIDB4RkIzMCwgMHhGQjM5LCAweDU4N0F9LAorICAgIHsweDgxMzksIDB4RkMzMCwgMHhGQzM5LCAweDU4ODR9LCB7MHg4MTM5LCAweEZEMzAsIDB4RkQzOSwgMHg1ODhFfSwKKyAgICB7MHg4MTM5LCAweEZFMzAsIDB4RkUzOSwgMHg1ODk4fSwgezB4ODIzMCwgMHg4MTMwLCAweDgxMzksIDB4NThBMn0sCisgICAgezB4ODIzMCwgMHg4MjMwLCAweDgyMzksIDB4NThBQ30sIHsweDgyMzAsIDB4ODMzMCwgMHg4MzM5LCAweDU4QjZ9LAorICAgIHsweDgyMzAsIDB4ODQzMCwgMHg4NDM5LCAweDU4QzB9LCB7MHg4MjMwLCAweDg1MzAsIDB4ODUzOSwgMHg1OENBfSwKKyAgICB7MHg4MjMwLCAweDg2MzAsIDB4ODYzOSwgMHg1OEQ0fSwgezB4ODIzMCwgMHg4NzMwLCAweDg3MzksIDB4NThERX0sCisgICAgezB4ODIzMCwgMHg4ODMwLCAweDg4MzksIDB4NThFOH0sIHsweDgyMzAsIDB4ODkzMCwgMHg4OTM5LCAweDU4RjJ9LAorICAgIHsweDgyMzAsIDB4OEEzMCwgMHg4QTM5LCAweDU4RkN9LCB7MHg4MjMwLCAweDhCMzAsIDB4OEIzOSwgMHg1OTA2fSwKKyAgICB7MHg4MjMwLCAweDhDMzAsIDB4OEMzOSwgMHg1OTEwfSwgezB4ODIzMCwgMHg4RDMwLCAweDhEMzksIDB4NTkxQX0sCisgICAgezB4ODIzMCwgMHg4RTMwLCAweDhFMzksIDB4NTkyNH0sIHsweDgyMzAsIDB4OEYzMCwgMHg4RjM5LCAweDU5MkV9LAorICAgIHsweDgyMzAsIDB4OTAzMCwgMHg5MDM5LCAweDU5Mzh9LCB7MHg4MjMwLCAweDkxMzAsIDB4OTEzOSwgMHg1OTQyfSwKKyAgICB7MHg4MjMwLCAweDkyMzAsIDB4OTIzOSwgMHg1OTRDfSwgezB4ODIzMCwgMHg5MzMwLCAweDkzMzksIDB4NTk1Nn0sCisgICAgezB4ODIzMCwgMHg5NDMwLCAweDk0MzksIDB4NTk2MH0sIHsweDgyMzAsIDB4OTUzMCwgMHg5NTM5LCAweDU5NkF9LAorICAgIHsweDgyMzAsIDB4OTYzMCwgMHg5NjM5LCAweDU5NzR9LCB7MHg4MjMwLCAweDk3MzAsIDB4OTczOSwgMHg1OTdFfSwKKyAgICB7MHg4MjMwLCAweDk4MzAsIDB4OTgzOSwgMHg1OTg4fSwgezB4ODIzMCwgMHg5OTMwLCAweDk5MzksIDB4NTk5Mn0sCisgICAgezB4ODIzMCwgMHg5QTMwLCAweDlBMzksIDB4NTk5Q30sIHsweDgyMzAsIDB4OUIzMCwgMHg5QjM5LCAweDU5QTZ9LAorICAgIHsweDgyMzAsIDB4OUMzMCwgMHg5QzM5LCAweDU5QjB9LCB7MHg4MjMwLCAweDlEMzAsIDB4OUQzOSwgMHg1OUJBfSwKKyAgICB7MHg4MjMwLCAweDlFMzAsIDB4OUUzOSwgMHg1OUM0fSwgezB4ODIzMCwgMHg5RjMwLCAweDlGMzksIDB4NTlDRX0sCisgICAgezB4ODIzMCwgMHhBMDMwLCAweEEwMzksIDB4NTlEOH0sIHsweDgyMzAsIDB4QTEzMCwgMHhBMTM5LCAweDU5RTJ9LAorICAgIHsweDgyMzAsIDB4QTIzMCwgMHhBMjM5LCAweDU5RUN9LCB7MHg4MjMwLCAweEEzMzAsIDB4QTMzOSwgMHg1OUY2fSwKKyAgICB7MHg4MjMwLCAweEE0MzAsIDB4QTQzOSwgMHg1QTAwfSwgezB4ODIzMCwgMHhBNTMwLCAweEE1MzksIDB4NUEwQX0sCisgICAgezB4ODIzMCwgMHhBNjMwLCAweEE2MzksIDB4NUExNH0sIHsweDgyMzAsIDB4QTczMCwgMHhBNzM5LCAweDVBMUV9LAorICAgIHsweDgyMzAsIDB4QTgzMCwgMHhBODM5LCAweDVBMjh9LCB7MHg4MjMwLCAweEE5MzAsIDB4QTkzOSwgMHg1QTMyfSwKKyAgICB7MHg4MjMwLCAweEFBMzAsIDB4QUEzOSwgMHg1QTNDfSwgezB4ODIzMCwgMHhBQjMwLCAweEFCMzksIDB4NUE0Nn0sCisgICAgezB4ODIzMCwgMHhBQzMwLCAweEFDMzksIDB4NUE1MH0sIHsweDgyMzAsIDB4QUQzMCwgMHhBRDM5LCAweDVBNUF9LAorICAgIHsweDgyMzAsIDB4QUUzMCwgMHhBRTM5LCAweDVBNjR9LCB7MHg4MjMwLCAweEFGMzAsIDB4QUYzOSwgMHg1QTZFfSwKKyAgICB7MHg4MjMwLCAweEIwMzAsIDB4QjAzOSwgMHg1QTc4fSwgezB4ODIzMCwgMHhCMTMwLCAweEIxMzksIDB4NUE4Mn0sCisgICAgezB4ODIzMCwgMHhCMjMwLCAweEIyMzksIDB4NUE4Q30sIHsweDgyMzAsIDB4QjMzMCwgMHhCMzM5LCAweDVBOTZ9LAorICAgIHsweDgyMzAsIDB4QjQzMCwgMHhCNDM5LCAweDVBQTB9LCB7MHg4MjMwLCAweEI1MzAsIDB4QjUzOSwgMHg1QUFBfSwKKyAgICB7MHg4MjMwLCAweEI2MzAsIDB4QjYzOSwgMHg1QUI0fSwgezB4ODIzMCwgMHhCNzMwLCAweEI3MzksIDB4NUFCRX0sCisgICAgezB4ODIzMCwgMHhCODMwLCAweEI4MzksIDB4NUFDOH0sIHsweDgyMzAsIDB4QjkzMCwgMHhCOTM5LCAweDVBRDJ9LAorICAgIHsweDgyMzAsIDB4QkEzMCwgMHhCQTM5LCAweDVBREN9LCB7MHg4MjMwLCAweEJCMzAsIDB4QkIzOSwgMHg1QUU2fSwKKyAgICB7MHg4MjMwLCAweEJDMzAsIDB4QkMzOSwgMHg1QUYwfSwgezB4ODIzMCwgMHhCRDMwLCAweEJEMzksIDB4NUFGQX0sCisgICAgezB4ODIzMCwgMHhCRTMwLCAweEJFMzksIDB4NUIwNH0sIHsweDgyMzAsIDB4QkYzMCwgMHhCRjM5LCAweDVCMEV9LAorICAgIHsweDgyMzAsIDB4QzAzMCwgMHhDMDM5LCAweDVCMTh9LCB7MHg4MjMwLCAweEMxMzAsIDB4QzEzOSwgMHg1QjIyfSwKKyAgICB7MHg4MjMwLCAweEMyMzAsIDB4QzIzOSwgMHg1QjJDfSwgezB4ODIzMCwgMHhDMzMwLCAweEMzMzksIDB4NUIzNn0sCisgICAgezB4ODIzMCwgMHhDNDMwLCAweEM0MzksIDB4NUI0MH0sIHsweDgyMzAsIDB4QzUzMCwgMHhDNTM5LCAweDVCNEF9LAorICAgIHsweDgyMzAsIDB4QzYzMCwgMHhDNjM5LCAweDVCNTR9LCB7MHg4MjMwLCAweEM3MzAsIDB4QzczOSwgMHg1QjVFfSwKKyAgICB7MHg4MjMwLCAweEM4MzAsIDB4QzgzOSwgMHg1QjY4fSwgezB4ODIzMCwgMHhDOTMwLCAweEM5MzksIDB4NUI3Mn0sCisgICAgezB4ODIzMCwgMHhDQTMwLCAweENBMzksIDB4NUI3Q30sIHsweDgyMzAsIDB4Q0IzMCwgMHhDQjM5LCAweDVCODZ9LAorICAgIHsweDgyMzAsIDB4Q0MzMCwgMHhDQzM5LCAweDVCOTB9LCB7MHg4MjMwLCAweENEMzAsIDB4Q0QzOSwgMHg1QjlBfSwKKyAgICB7MHg4MjMwLCAweENFMzAsIDB4Q0UzOSwgMHg1QkE0fSwgezB4ODIzMCwgMHhDRjMwLCAweENGMzksIDB4NUJBRX0sCisgICAgezB4ODIzMCwgMHhEMDMwLCAweEQwMzksIDB4NUJCOH0sIHsweDgyMzAsIDB4RDEzMCwgMHhEMTM5LCAweDVCQzJ9LAorICAgIHsweDgyMzAsIDB4RDIzMCwgMHhEMjM5LCAweDVCQ0N9LCB7MHg4MjMwLCAweEQzMzAsIDB4RDMzOSwgMHg1QkQ2fSwKKyAgICB7MHg4MjMwLCAweEQ0MzAsIDB4RDQzOSwgMHg1QkUwfSwgezB4ODIzMCwgMHhENTMwLCAweEQ1MzksIDB4NUJFQX0sCisgICAgezB4ODIzMCwgMHhENjMwLCAweEQ2MzksIDB4NUJGNH0sIHsweDgyMzAsIDB4RDczMCwgMHhENzM5LCAweDVCRkV9LAorICAgIHsweDgyMzAsIDB4RDgzMCwgMHhEODM5LCAweDVDMDh9LCB7MHg4MjMwLCAweEQ5MzAsIDB4RDkzOSwgMHg1QzEyfSwKKyAgICB7MHg4MjMwLCAweERBMzAsIDB4REEzOSwgMHg1QzFDfSwgezB4ODIzMCwgMHhEQjMwLCAweERCMzksIDB4NUMyNn0sCisgICAgezB4ODIzMCwgMHhEQzMwLCAweERDMzksIDB4NUMzMH0sIHsweDgyMzAsIDB4REQzMCwgMHhERDM5LCAweDVDM0F9LAorICAgIHsweDgyMzAsIDB4REUzMCwgMHhERTM5LCAweDVDNDR9LCB7MHg4MjMwLCAweERGMzAsIDB4REYzOSwgMHg1QzRFfSwKKyAgICB7MHg4MjMwLCAweEUwMzAsIDB4RTAzOSwgMHg1QzU4fSwgezB4ODIzMCwgMHhFMTMwLCAweEUxMzksIDB4NUM2Mn0sCisgICAgezB4ODIzMCwgMHhFMjMwLCAweEUyMzksIDB4NUM2Q30sIHsweDgyMzAsIDB4RTMzMCwgMHhFMzM5LCAweDVDNzZ9LAorICAgIHsweDgyMzAsIDB4RTQzMCwgMHhFNDM5LCAweDVDODB9LCB7MHg4MjMwLCAweEU1MzAsIDB4RTUzOSwgMHg1QzhBfSwKKyAgICB7MHg4MjMwLCAweEU2MzAsIDB4RTYzOSwgMHg1Qzk0fSwgezB4ODIzMCwgMHhFNzMwLCAweEU3MzksIDB4NUM5RX0sCisgICAgezB4ODIzMCwgMHhFODMwLCAweEU4MzksIDB4NUNBOH0sIHsweDgyMzAsIDB4RTkzMCwgMHhFOTM5LCAweDVDQjJ9LAorICAgIHsweDgyMzAsIDB4RUEzMCwgMHhFQTM5LCAweDVDQkN9LCB7MHg4MjMwLCAweEVCMzAsIDB4RUIzOSwgMHg1Q0M2fSwKKyAgICB7MHg4MjMwLCAweEVDMzAsIDB4RUMzOSwgMHg1Q0QwfSwgezB4ODIzMCwgMHhFRDMwLCAweEVEMzksIDB4NUNEQX0sCisgICAgezB4ODIzMCwgMHhFRTMwLCAweEVFMzksIDB4NUNFNH0sIHsweDgyMzAsIDB4RUYzMCwgMHhFRjM5LCAweDVDRUV9LAorICAgIHsweDgyMzAsIDB4RjAzMCwgMHhGMDM5LCAweDVDRjh9LCB7MHg4MjMwLCAweEYxMzAsIDB4RjEzOSwgMHg1RDAyfSwKKyAgICB7MHg4MjMwLCAweEYyMzAsIDB4RjIzOSwgMHg1RDBDfSwgezB4ODIzMCwgMHhGMzMwLCAweEYzMzksIDB4NUQxNn0sCisgICAgezB4ODIzMCwgMHhGNDMwLCAweEY0MzksIDB4NUQyMH0sIHsweDgyMzAsIDB4RjUzMCwgMHhGNTM5LCAweDVEMkF9LAorICAgIHsweDgyMzAsIDB4RjYzMCwgMHhGNjM5LCAweDVEMzR9LCB7MHg4MjMwLCAweEY3MzAsIDB4RjczOSwgMHg1RDNFfSwKKyAgICB7MHg4MjMwLCAweEY4MzAsIDB4RjgzOSwgMHg1RDQ4fSwgezB4ODIzMCwgMHhGOTMwLCAweEY5MzksIDB4NUQ1Mn0sCisgICAgezB4ODIzMCwgMHhGQTMwLCAweEZBMzksIDB4NUQ1Q30sIHsweDgyMzAsIDB4RkIzMCwgMHhGQjM5LCAweDVENjZ9LAorICAgIHsweDgyMzAsIDB4RkMzMCwgMHhGQzM5LCAweDVENzB9LCB7MHg4MjMwLCAweEZEMzAsIDB4RkQzOSwgMHg1RDdBfSwKKyAgICB7MHg4MjMwLCAweEZFMzAsIDB4RkUzOSwgMHg1RDg0fSwgezB4ODIzMSwgMHg4MTMwLCAweDgxMzksIDB4NUQ4RX0sCisgICAgezB4ODIzMSwgMHg4MjMwLCAweDgyMzksIDB4NUQ5OH0sIHsweDgyMzEsIDB4ODMzMCwgMHg4MzM5LCAweDVEQTJ9LAorICAgIHsweDgyMzEsIDB4ODQzMCwgMHg4NDM5LCAweDVEQUN9LCB7MHg4MjMxLCAweDg1MzAsIDB4ODUzOSwgMHg1REI2fSwKKyAgICB7MHg4MjMxLCAweDg2MzAsIDB4ODYzOSwgMHg1REMwfSwgezB4ODIzMSwgMHg4NzMwLCAweDg3MzksIDB4NURDQX0sCisgICAgezB4ODIzMSwgMHg4ODMwLCAweDg4MzksIDB4NURENH0sIHsweDgyMzEsIDB4ODkzMCwgMHg4OTM5LCAweDVEREV9LAorICAgIHsweDgyMzEsIDB4OEEzMCwgMHg4QTM5LCAweDVERTh9LCB7MHg4MjMxLCAweDhCMzAsIDB4OEIzOSwgMHg1REYyfSwKKyAgICB7MHg4MjMxLCAweDhDMzAsIDB4OEMzOSwgMHg1REZDfSwgezB4ODIzMSwgMHg4RDMwLCAweDhEMzksIDB4NUUwNn0sCisgICAgezB4ODIzMSwgMHg4RTMwLCAweDhFMzksIDB4NUUxMH0sIHsweDgyMzEsIDB4OEYzMCwgMHg4RjM5LCAweDVFMUF9LAorICAgIHsweDgyMzEsIDB4OTAzMCwgMHg5MDM5LCAweDVFMjR9LCB7MHg4MjMxLCAweDkxMzAsIDB4OTEzOSwgMHg1RTJFfSwKKyAgICB7MHg4MjMxLCAweDkyMzAsIDB4OTIzOSwgMHg1RTM4fSwgezB4ODIzMSwgMHg5MzMwLCAweDkzMzksIDB4NUU0Mn0sCisgICAgezB4ODIzMSwgMHg5NDMwLCAweDk0MzksIDB4NUU0Q30sIHsweDgyMzEsIDB4OTUzMCwgMHg5NTM5LCAweDVFNTZ9LAorICAgIHsweDgyMzEsIDB4OTYzMCwgMHg5NjM5LCAweDVFNjB9LCB7MHg4MjMxLCAweDk3MzAsIDB4OTczOSwgMHg1RTZBfSwKKyAgICB7MHg4MjMxLCAweDk4MzAsIDB4OTgzOSwgMHg1RTc0fSwgezB4ODIzMSwgMHg5OTMwLCAweDk5MzksIDB4NUU3RX0sCisgICAgezB4ODIzMSwgMHg5QTMwLCAweDlBMzksIDB4NUU4OH0sIHsweDgyMzEsIDB4OUIzMCwgMHg5QjM5LCAweDVFOTJ9LAorICAgIHsweDgyMzEsIDB4OUMzMCwgMHg5QzM5LCAweDVFOUN9LCB7MHg4MjMxLCAweDlEMzAsIDB4OUQzOSwgMHg1RUE2fSwKKyAgICB7MHg4MjMxLCAweDlFMzAsIDB4OUUzOSwgMHg1RUIwfSwgezB4ODIzMSwgMHg5RjMwLCAweDlGMzksIDB4NUVCQX0sCisgICAgezB4ODIzMSwgMHhBMDMwLCAweEEwMzksIDB4NUVDNH0sIHsweDgyMzEsIDB4QTEzMCwgMHhBMTM5LCAweDVFQ0V9LAorICAgIHsweDgyMzEsIDB4QTIzMCwgMHhBMjM5LCAweDVFRDh9LCB7MHg4MjMxLCAweEEzMzAsIDB4QTMzOSwgMHg1RUUyfSwKKyAgICB7MHg4MjMxLCAweEE0MzAsIDB4QTQzOSwgMHg1RUVDfSwgezB4ODIzMSwgMHhBNTMwLCAweEE1MzksIDB4NUVGNn0sCisgICAgezB4ODIzMSwgMHhBNjMwLCAweEE2MzksIDB4NUYwMH0sIHsweDgyMzEsIDB4QTczMCwgMHhBNzM5LCAweDVGMEF9LAorICAgIHsweDgyMzEsIDB4QTgzMCwgMHhBODM5LCAweDVGMTR9LCB7MHg4MjMxLCAweEE5MzAsIDB4QTkzOSwgMHg1RjFFfSwKKyAgICB7MHg4MjMxLCAweEFBMzAsIDB4QUEzOSwgMHg1RjI4fSwgezB4ODIzMSwgMHhBQjMwLCAweEFCMzksIDB4NUYzMn0sCisgICAgezB4ODIzMSwgMHhBQzMwLCAweEFDMzksIDB4NUYzQ30sIHsweDgyMzEsIDB4QUQzMCwgMHhBRDM5LCAweDVGNDZ9LAorICAgIHsweDgyMzEsIDB4QUUzMCwgMHhBRTM5LCAweDVGNTB9LCB7MHg4MjMxLCAweEFGMzAsIDB4QUYzOSwgMHg1RjVBfSwKKyAgICB7MHg4MjMxLCAweEIwMzAsIDB4QjAzOSwgMHg1RjY0fSwgezB4ODIzMSwgMHhCMTMwLCAweEIxMzksIDB4NUY2RX0sCisgICAgezB4ODIzMSwgMHhCMjMwLCAweEIyMzksIDB4NUY3OH0sIHsweDgyMzEsIDB4QjMzMCwgMHhCMzM5LCAweDVGODJ9LAorICAgIHsweDgyMzEsIDB4QjQzMCwgMHhCNDM5LCAweDVGOEN9LCB7MHg4MjMxLCAweEI1MzAsIDB4QjUzOSwgMHg1Rjk2fSwKKyAgICB7MHg4MjMxLCAweEI2MzAsIDB4QjYzOSwgMHg1RkEwfSwgezB4ODIzMSwgMHhCNzMwLCAweEI3MzksIDB4NUZBQX0sCisgICAgezB4ODIzMSwgMHhCODMwLCAweEI4MzksIDB4NUZCNH0sIHsweDgyMzEsIDB4QjkzMCwgMHhCOTM5LCAweDVGQkV9LAorICAgIHsweDgyMzEsIDB4QkEzMCwgMHhCQTM5LCAweDVGQzh9LCB7MHg4MjMxLCAweEJCMzAsIDB4QkIzOSwgMHg1RkQyfSwKKyAgICB7MHg4MjMxLCAweEJDMzAsIDB4QkMzOSwgMHg1RkRDfSwgezB4ODIzMSwgMHhCRDMwLCAweEJEMzksIDB4NUZFNn0sCisgICAgezB4ODIzMSwgMHhCRTMwLCAweEJFMzksIDB4NUZGMH0sIHsweDgyMzEsIDB4QkYzMCwgMHhCRjM5LCAweDVGRkF9LAorICAgIHsweDgyMzEsIDB4QzAzMCwgMHhDMDM5LCAweDYwMDR9LCB7MHg4MjMxLCAweEMxMzAsIDB4QzEzOSwgMHg2MDBFfSwKKyAgICB7MHg4MjMxLCAweEMyMzAsIDB4QzIzOSwgMHg2MDE4fSwgezB4ODIzMSwgMHhDMzMwLCAweEMzMzksIDB4NjAyMn0sCisgICAgezB4ODIzMSwgMHhDNDMwLCAweEM0MzksIDB4NjAyQ30sIHsweDgyMzEsIDB4QzUzMCwgMHhDNTM5LCAweDYwMzZ9LAorICAgIHsweDgyMzEsIDB4QzYzMCwgMHhDNjM5LCAweDYwNDB9LCB7MHg4MjMxLCAweEM3MzAsIDB4QzczOSwgMHg2MDRBfSwKKyAgICB7MHg4MjMxLCAweEM4MzAsIDB4QzgzOSwgMHg2MDU0fSwgezB4ODIzMSwgMHhDOTMwLCAweEM5MzksIDB4NjA1RX0sCisgICAgezB4ODIzMSwgMHhDQTMwLCAweENBMzksIDB4NjA2OH0sIHsweDgyMzEsIDB4Q0IzMCwgMHhDQjM5LCAweDYwNzJ9LAorICAgIHsweDgyMzEsIDB4Q0MzMCwgMHhDQzM5LCAweDYwN0N9LCB7MHg4MjMxLCAweENEMzAsIDB4Q0QzOSwgMHg2MDg2fSwKKyAgICB7MHg4MjMxLCAweENFMzAsIDB4Q0UzOSwgMHg2MDkwfSwgezB4ODIzMSwgMHhDRjMwLCAweENGMzksIDB4NjA5QX0sCisgICAgezB4ODIzMSwgMHhEMDMwLCAweEQwMzksIDB4NjBBNH0sIHsweDgyMzEsIDB4RDEzMCwgMHhEMTM5LCAweDYwQUV9LAorICAgIHsweDgyMzEsIDB4RDIzMCwgMHhEMjM5LCAweDYwQjh9LCB7MHg4MjMxLCAweEQzMzAsIDB4RDMzOSwgMHg2MEMyfSwKKyAgICB7MHg4MjMxLCAweEQ0MzAsIDB4RDQzOSwgMHg2MENDfSwgezB4ODIzMSwgMHhENTMwLCAweEQ1MzksIDB4NjBENn0sCisgICAgezB4ODIzMSwgMHhENjMwLCAweEQ2MzksIDB4NjBFMH0sIHsweDgyMzEsIDB4RDczMCwgMHhENzM5LCAweDYwRUF9LAorICAgIHsweDgyMzEsIDB4RDgzMCwgMHhEODM5LCAweDYwRjR9LCB7MHg4MjMxLCAweEQ5MzAsIDB4RDkzOSwgMHg2MEZFfSwKKyAgICB7MHg4MjMxLCAweERBMzAsIDB4REEzOSwgMHg2MTA4fSwgezB4ODIzMSwgMHhEQjMwLCAweERCMzksIDB4NjExMn0sCisgICAgezB4ODIzMSwgMHhEQzMwLCAweERDMzksIDB4NjExQ30sIHsweDgyMzEsIDB4REQzMCwgMHhERDM5LCAweDYxMjZ9LAorICAgIHsweDgyMzEsIDB4REUzMCwgMHhERTM5LCAweDYxMzB9LCB7MHg4MjMxLCAweERGMzAsIDB4REYzOSwgMHg2MTNBfSwKKyAgICB7MHg4MjMxLCAweEUwMzAsIDB4RTAzOSwgMHg2MTQ0fSwgezB4ODIzMSwgMHhFMTMwLCAweEUxMzksIDB4NjE0RX0sCisgICAgezB4ODIzMSwgMHhFMjMwLCAweEUyMzksIDB4NjE1OH0sIHsweDgyMzEsIDB4RTMzMCwgMHhFMzM5LCAweDYxNjJ9LAorICAgIHsweDgyMzEsIDB4RTQzMCwgMHhFNDM5LCAweDYxNkN9LCB7MHg4MjMxLCAweEU1MzAsIDB4RTUzOSwgMHg2MTc2fSwKKyAgICB7MHg4MjMxLCAweEU2MzAsIDB4RTYzOSwgMHg2MTgwfSwgezB4ODIzMSwgMHhFNzMwLCAweEU3MzksIDB4NjE4QX0sCisgICAgezB4ODIzMSwgMHhFODMwLCAweEU4MzksIDB4NjE5NH0sIHsweDgyMzEsIDB4RTkzMCwgMHhFOTM5LCAweDYxOUV9LAorICAgIHsweDgyMzEsIDB4RUEzMCwgMHhFQTM5LCAweDYxQTh9LCB7MHg4MjMxLCAweEVCMzAsIDB4RUIzOSwgMHg2MUIyfSwKKyAgICB7MHg4MjMxLCAweEVDMzAsIDB4RUMzOSwgMHg2MUJDfSwgezB4ODIzMSwgMHhFRDMwLCAweEVEMzksIDB4NjFDNn0sCisgICAgezB4ODIzMSwgMHhFRTMwLCAweEVFMzksIDB4NjFEMH0sIHsweDgyMzEsIDB4RUYzMCwgMHhFRjM5LCAweDYxREF9LAorICAgIHsweDgyMzEsIDB4RjAzMCwgMHhGMDM5LCAweDYxRTR9LCB7MHg4MjMxLCAweEYxMzAsIDB4RjEzOSwgMHg2MUVFfSwKKyAgICB7MHg4MjMxLCAweEYyMzAsIDB4RjIzOSwgMHg2MUY4fSwgezB4ODIzMSwgMHhGMzMwLCAweEYzMzksIDB4NjIwMn0sCisgICAgezB4ODIzMSwgMHhGNDMwLCAweEY0MzksIDB4NjIwQ30sIHsweDgyMzEsIDB4RjUzMCwgMHhGNTM5LCAweDYyMTZ9LAorICAgIHsweDgyMzEsIDB4RjYzMCwgMHhGNjM5LCAweDYyMjB9LCB7MHg4MjMxLCAweEY3MzAsIDB4RjczOSwgMHg2MjJBfSwKKyAgICB7MHg4MjMxLCAweEY4MzAsIDB4RjgzOSwgMHg2MjM0fSwgezB4ODIzMSwgMHhGOTMwLCAweEY5MzksIDB4NjIzRX0sCisgICAgezB4ODIzMSwgMHhGQTMwLCAweEZBMzksIDB4NjI0OH0sIHsweDgyMzEsIDB4RkIzMCwgMHhGQjM5LCAweDYyNTJ9LAorICAgIHsweDgyMzEsIDB4RkMzMCwgMHhGQzM5LCAweDYyNUN9LCB7MHg4MjMxLCAweEZEMzAsIDB4RkQzOSwgMHg2MjY2fSwKKyAgICB7MHg4MjMxLCAweEZFMzAsIDB4RkUzOSwgMHg2MjcwfSwgezB4ODIzMiwgMHg4MTMwLCAweDgxMzksIDB4NjI3QX0sCisgICAgezB4ODIzMiwgMHg4MjMwLCAweDgyMzksIDB4NjI4NH0sIHsweDgyMzIsIDB4ODMzMCwgMHg4MzM5LCAweDYyOEV9LAorICAgIHsweDgyMzIsIDB4ODQzMCwgMHg4NDM5LCAweDYyOTh9LCB7MHg4MjMyLCAweDg1MzAsIDB4ODUzOSwgMHg2MkEyfSwKKyAgICB7MHg4MjMyLCAweDg2MzAsIDB4ODYzOSwgMHg2MkFDfSwgezB4ODIzMiwgMHg4NzMwLCAweDg3MzksIDB4NjJCNn0sCisgICAgezB4ODIzMiwgMHg4ODMwLCAweDg4MzksIDB4NjJDMH0sIHsweDgyMzIsIDB4ODkzMCwgMHg4OTM5LCAweDYyQ0F9LAorICAgIHsweDgyMzIsIDB4OEEzMCwgMHg4QTM5LCAweDYyRDR9LCB7MHg4MjMyLCAweDhCMzAsIDB4OEIzOSwgMHg2MkRFfSwKKyAgICB7MHg4MjMyLCAweDhDMzAsIDB4OEMzOSwgMHg2MkU4fSwgezB4ODIzMiwgMHg4RDMwLCAweDhEMzksIDB4NjJGMn0sCisgICAgezB4ODIzMiwgMHg4RTMwLCAweDhFMzksIDB4NjJGQ30sIHsweDgyMzIsIDB4OEYzMCwgMHg4RjM5LCAweDYzMDZ9LAorICAgIHsweDgyMzIsIDB4OTAzMCwgMHg5MDM5LCAweDYzMTB9LCB7MHg4MjMyLCAweDkxMzAsIDB4OTEzOSwgMHg2MzFBfSwKKyAgICB7MHg4MjMyLCAweDkyMzAsIDB4OTIzOSwgMHg2MzI0fSwgezB4ODIzMiwgMHg5MzMwLCAweDkzMzksIDB4NjMyRX0sCisgICAgezB4ODIzMiwgMHg5NDMwLCAweDk0MzksIDB4NjMzOH0sIHsweDgyMzIsIDB4OTUzMCwgMHg5NTM5LCAweDYzNDJ9LAorICAgIHsweDgyMzIsIDB4OTYzMCwgMHg5NjM5LCAweDYzNEN9LCB7MHg4MjMyLCAweDk3MzAsIDB4OTczOSwgMHg2MzU2fSwKKyAgICB7MHg4MjMyLCAweDk4MzAsIDB4OTgzOSwgMHg2MzYwfSwgezB4ODIzMiwgMHg5OTMwLCAweDk5MzksIDB4NjM2QX0sCisgICAgezB4ODIzMiwgMHg5QTMwLCAweDlBMzksIDB4NjM3NH0sIHsweDgyMzIsIDB4OUIzMCwgMHg5QjM5LCAweDYzN0V9LAorICAgIHsweDgyMzIsIDB4OUMzMCwgMHg5QzM5LCAweDYzODh9LCB7MHg4MjMyLCAweDlEMzAsIDB4OUQzOSwgMHg2MzkyfSwKKyAgICB7MHg4MjMyLCAweDlFMzAsIDB4OUUzOSwgMHg2MzlDfSwgezB4ODIzMiwgMHg5RjMwLCAweDlGMzksIDB4NjNBNn0sCisgICAgezB4ODIzMiwgMHhBMDMwLCAweEEwMzksIDB4NjNCMH0sIHsweDgyMzIsIDB4QTEzMCwgMHhBMTM5LCAweDYzQkF9LAorICAgIHsweDgyMzIsIDB4QTIzMCwgMHhBMjM5LCAweDYzQzR9LCB7MHg4MjMyLCAweEEzMzAsIDB4QTMzOSwgMHg2M0NFfSwKKyAgICB7MHg4MjMyLCAweEE0MzAsIDB4QTQzOSwgMHg2M0Q4fSwgezB4ODIzMiwgMHhBNTMwLCAweEE1MzksIDB4NjNFMn0sCisgICAgezB4ODIzMiwgMHhBNjMwLCAweEE2MzksIDB4NjNFQ30sIHsweDgyMzIsIDB4QTczMCwgMHhBNzM5LCAweDYzRjZ9LAorICAgIHsweDgyMzIsIDB4QTgzMCwgMHhBODM5LCAweDY0MDB9LCB7MHg4MjMyLCAweEE5MzAsIDB4QTkzOSwgMHg2NDBBfSwKKyAgICB7MHg4MjMyLCAweEFBMzAsIDB4QUEzOSwgMHg2NDE0fSwgezB4ODIzMiwgMHhBQjMwLCAweEFCMzksIDB4NjQxRX0sCisgICAgezB4ODIzMiwgMHhBQzMwLCAweEFDMzksIDB4NjQyOH0sIHsweDgyMzIsIDB4QUQzMCwgMHhBRDM5LCAweDY0MzJ9LAorICAgIHsweDgyMzIsIDB4QUUzMCwgMHhBRTM5LCAweDY0M0N9LCB7MHg4MjMyLCAweEFGMzAsIDB4QUYzOSwgMHg2NDQ2fSwKKyAgICB7MHg4MjMyLCAweEIwMzAsIDB4QjAzOSwgMHg2NDUwfSwgezB4ODIzMiwgMHhCMTMwLCAweEIxMzksIDB4NjQ1QX0sCisgICAgezB4ODIzMiwgMHhCMjMwLCAweEIyMzksIDB4NjQ2NH0sIHsweDgyMzIsIDB4QjMzMCwgMHhCMzM5LCAweDY0NkV9LAorICAgIHsweDgyMzIsIDB4QjQzMCwgMHhCNDM5LCAweDY0Nzh9LCB7MHg4MjMyLCAweEI1MzAsIDB4QjUzOSwgMHg2NDgyfSwKKyAgICB7MHg4MjMyLCAweEI2MzAsIDB4QjYzOSwgMHg2NDhDfSwgezB4ODIzMiwgMHhCNzMwLCAweEI3MzksIDB4NjQ5Nn0sCisgICAgezB4ODIzMiwgMHhCODMwLCAweEI4MzksIDB4NjRBMH0sIHsweDgyMzIsIDB4QjkzMCwgMHhCOTM5LCAweDY0QUF9LAorICAgIHsweDgyMzIsIDB4QkEzMCwgMHhCQTM5LCAweDY0QjR9LCB7MHg4MjMyLCAweEJCMzAsIDB4QkIzOSwgMHg2NEJFfSwKKyAgICB7MHg4MjMyLCAweEJDMzAsIDB4QkMzOSwgMHg2NEM4fSwgezB4ODIzMiwgMHhCRDMwLCAweEJEMzksIDB4NjREMn0sCisgICAgezB4ODIzMiwgMHhCRTMwLCAweEJFMzksIDB4NjREQ30sIHsweDgyMzIsIDB4QkYzMCwgMHhCRjM5LCAweDY0RTZ9LAorICAgIHsweDgyMzIsIDB4QzAzMCwgMHhDMDM5LCAweDY0RjB9LCB7MHg4MjMyLCAweEMxMzAsIDB4QzEzOSwgMHg2NEZBfSwKKyAgICB7MHg4MjMyLCAweEMyMzAsIDB4QzIzOSwgMHg2NTA0fSwgezB4ODIzMiwgMHhDMzMwLCAweEMzMzksIDB4NjUwRX0sCisgICAgezB4ODIzMiwgMHhDNDMwLCAweEM0MzksIDB4NjUxOH0sIHsweDgyMzIsIDB4QzUzMCwgMHhDNTM5LCAweDY1MjJ9LAorICAgIHsweDgyMzIsIDB4QzYzMCwgMHhDNjM5LCAweDY1MkN9LCB7MHg4MjMyLCAweEM3MzAsIDB4QzczOSwgMHg2NTM2fSwKKyAgICB7MHg4MjMyLCAweEM4MzAsIDB4QzgzOSwgMHg2NTQwfSwgezB4ODIzMiwgMHhDOTMwLCAweEM5MzksIDB4NjU0QX0sCisgICAgezB4ODIzMiwgMHhDQTMwLCAweENBMzksIDB4NjU1NH0sIHsweDgyMzIsIDB4Q0IzMCwgMHhDQjM5LCAweDY1NUV9LAorICAgIHsweDgyMzIsIDB4Q0MzMCwgMHhDQzM5LCAweDY1Njh9LCB7MHg4MjMyLCAweENEMzAsIDB4Q0QzOSwgMHg2NTcyfSwKKyAgICB7MHg4MjMyLCAweENFMzAsIDB4Q0UzOSwgMHg2NTdDfSwgezB4ODIzMiwgMHhDRjMwLCAweENGMzksIDB4NjU4Nn0sCisgICAgezB4ODIzMiwgMHhEMDMwLCAweEQwMzksIDB4NjU5MH0sIHsweDgyMzIsIDB4RDEzMCwgMHhEMTM5LCAweDY1OUF9LAorICAgIHsweDgyMzIsIDB4RDIzMCwgMHhEMjM5LCAweDY1QTR9LCB7MHg4MjMyLCAweEQzMzAsIDB4RDMzOSwgMHg2NUFFfSwKKyAgICB7MHg4MjMyLCAweEQ0MzAsIDB4RDQzOSwgMHg2NUI4fSwgezB4ODIzMiwgMHhENTMwLCAweEQ1MzksIDB4NjVDMn0sCisgICAgezB4ODIzMiwgMHhENjMwLCAweEQ2MzksIDB4NjVDQ30sIHsweDgyMzIsIDB4RDczMCwgMHhENzM5LCAweDY1RDZ9LAorICAgIHsweDgyMzIsIDB4RDgzMCwgMHhEODM5LCAweDY1RTB9LCB7MHg4MjMyLCAweEQ5MzAsIDB4RDkzOSwgMHg2NUVBfSwKKyAgICB7MHg4MjMyLCAweERBMzAsIDB4REEzOSwgMHg2NUY0fSwgezB4ODIzMiwgMHhEQjMwLCAweERCMzksIDB4NjVGRX0sCisgICAgezB4ODIzMiwgMHhEQzMwLCAweERDMzksIDB4NjYwOH0sIHsweDgyMzIsIDB4REQzMCwgMHhERDM5LCAweDY2MTJ9LAorICAgIHsweDgyMzIsIDB4REUzMCwgMHhERTM5LCAweDY2MUN9LCB7MHg4MjMyLCAweERGMzAsIDB4REYzOSwgMHg2NjI2fSwKKyAgICB7MHg4MjMyLCAweEUwMzAsIDB4RTAzOSwgMHg2NjMwfSwgezB4ODIzMiwgMHhFMTMwLCAweEUxMzksIDB4NjYzQX0sCisgICAgezB4ODIzMiwgMHhFMjMwLCAweEUyMzksIDB4NjY0NH0sIHsweDgyMzIsIDB4RTMzMCwgMHhFMzM5LCAweDY2NEV9LAorICAgIHsweDgyMzIsIDB4RTQzMCwgMHhFNDM5LCAweDY2NTh9LCB7MHg4MjMyLCAweEU1MzAsIDB4RTUzOSwgMHg2NjYyfSwKKyAgICB7MHg4MjMyLCAweEU2MzAsIDB4RTYzOSwgMHg2NjZDfSwgezB4ODIzMiwgMHhFNzMwLCAweEU3MzksIDB4NjY3Nn0sCisgICAgezB4ODIzMiwgMHhFODMwLCAweEU4MzksIDB4NjY4MH0sIHsweDgyMzIsIDB4RTkzMCwgMHhFOTM5LCAweDY2OEF9LAorICAgIHsweDgyMzIsIDB4RUEzMCwgMHhFQTM5LCAweDY2OTR9LCB7MHg4MjMyLCAweEVCMzAsIDB4RUIzOSwgMHg2NjlFfSwKKyAgICB7MHg4MjMyLCAweEVDMzAsIDB4RUMzOSwgMHg2NkE4fSwgezB4ODIzMiwgMHhFRDMwLCAweEVEMzksIDB4NjZCMn0sCisgICAgezB4ODIzMiwgMHhFRTMwLCAweEVFMzksIDB4NjZCQ30sIHsweDgyMzIsIDB4RUYzMCwgMHhFRjM5LCAweDY2QzZ9LAorICAgIHsweDgyMzIsIDB4RjAzMCwgMHhGMDM5LCAweDY2RDB9LCB7MHg4MjMyLCAweEYxMzAsIDB4RjEzOSwgMHg2NkRBfSwKKyAgICB7MHg4MjMyLCAweEYyMzAsIDB4RjIzOSwgMHg2NkU0fSwgezB4ODIzMiwgMHhGMzMwLCAweEYzMzksIDB4NjZFRX0sCisgICAgezB4ODIzMiwgMHhGNDMwLCAweEY0MzksIDB4NjZGOH0sIHsweDgyMzIsIDB4RjUzMCwgMHhGNTM5LCAweDY3MDJ9LAorICAgIHsweDgyMzIsIDB4RjYzMCwgMHhGNjM5LCAweDY3MEN9LCB7MHg4MjMyLCAweEY3MzAsIDB4RjczOSwgMHg2NzE2fSwKKyAgICB7MHg4MjMyLCAweEY4MzAsIDB4RjgzOSwgMHg2NzIwfSwgezB4ODIzMiwgMHhGOTMwLCAweEY5MzksIDB4NjcyQX0sCisgICAgezB4ODIzMiwgMHhGQTMwLCAweEZBMzksIDB4NjczNH0sIHsweDgyMzIsIDB4RkIzMCwgMHhGQjM5LCAweDY3M0V9LAorICAgIHsweDgyMzIsIDB4RkMzMCwgMHhGQzM5LCAweDY3NDh9LCB7MHg4MjMyLCAweEZEMzAsIDB4RkQzOSwgMHg2NzUyfSwKKyAgICB7MHg4MjMyLCAweEZFMzAsIDB4RkUzOSwgMHg2NzVDfSwgezB4ODIzMywgMHg4MTMwLCAweDgxMzksIDB4Njc2Nn0sCisgICAgezB4ODIzMywgMHg4MjMwLCAweDgyMzksIDB4Njc3MH0sIHsweDgyMzMsIDB4ODMzMCwgMHg4MzM5LCAweDY3N0F9LAorICAgIHsweDgyMzMsIDB4ODQzMCwgMHg4NDM5LCAweDY3ODR9LCB7MHg4MjMzLCAweDg1MzAsIDB4ODUzOSwgMHg2NzhFfSwKKyAgICB7MHg4MjMzLCAweDg2MzAsIDB4ODYzOSwgMHg2Nzk4fSwgezB4ODIzMywgMHg4NzMwLCAweDg3MzksIDB4NjdBMn0sCisgICAgezB4ODIzMywgMHg4ODMwLCAweDg4MzksIDB4NjdBQ30sIHsweDgyMzMsIDB4ODkzMCwgMHg4OTM5LCAweDY3QjZ9LAorICAgIHsweDgyMzMsIDB4OEEzMCwgMHg4QTM5LCAweDY3QzB9LCB7MHg4MjMzLCAweDhCMzAsIDB4OEIzOSwgMHg2N0NBfSwKKyAgICB7MHg4MjMzLCAweDhDMzAsIDB4OEMzOSwgMHg2N0Q0fSwgezB4ODIzMywgMHg4RDMwLCAweDhEMzksIDB4NjdERX0sCisgICAgezB4ODIzMywgMHg4RTMwLCAweDhFMzksIDB4NjdFOH0sIHsweDgyMzMsIDB4OEYzMCwgMHg4RjM5LCAweDY3RjJ9LAorICAgIHsweDgyMzMsIDB4OTAzMCwgMHg5MDM5LCAweDY3RkN9LCB7MHg4MjMzLCAweDkxMzAsIDB4OTEzOSwgMHg2ODA2fSwKKyAgICB7MHg4MjMzLCAweDkyMzAsIDB4OTIzOSwgMHg2ODEwfSwgezB4ODIzMywgMHg5MzMwLCAweDkzMzksIDB4NjgxQX0sCisgICAgezB4ODIzMywgMHg5NDMwLCAweDk0MzksIDB4NjgyNH0sIHsweDgyMzMsIDB4OTUzMCwgMHg5NTM5LCAweDY4MkV9LAorICAgIHsweDgyMzMsIDB4OTYzMCwgMHg5NjM5LCAweDY4Mzh9LCB7MHg4MjMzLCAweDk3MzAsIDB4OTczOSwgMHg2ODQyfSwKKyAgICB7MHg4MjMzLCAweDk4MzAsIDB4OTgzOSwgMHg2ODRDfSwgezB4ODIzMywgMHg5OTMwLCAweDk5MzksIDB4Njg1Nn0sCisgICAgezB4ODIzMywgMHg5QTMwLCAweDlBMzksIDB4Njg2MH0sIHsweDgyMzMsIDB4OUIzMCwgMHg5QjM5LCAweDY4NkF9LAorICAgIHsweDgyMzMsIDB4OUMzMCwgMHg5QzM5LCAweDY4NzR9LCB7MHg4MjMzLCAweDlEMzAsIDB4OUQzOSwgMHg2ODdFfSwKKyAgICB7MHg4MjMzLCAweDlFMzAsIDB4OUUzOSwgMHg2ODg4fSwgezB4ODIzMywgMHg5RjMwLCAweDlGMzksIDB4Njg5Mn0sCisgICAgezB4ODIzMywgMHhBMDMwLCAweEEwMzksIDB4Njg5Q30sIHsweDgyMzMsIDB4QTEzMCwgMHhBMTM5LCAweDY4QTZ9LAorICAgIHsweDgyMzMsIDB4QTIzMCwgMHhBMjM5LCAweDY4QjB9LCB7MHg4MjMzLCAweEEzMzAsIDB4QTMzOSwgMHg2OEJBfSwKKyAgICB7MHg4MjMzLCAweEE0MzAsIDB4QTQzOSwgMHg2OEM0fSwgezB4ODIzMywgMHhBNTMwLCAweEE1MzksIDB4NjhDRX0sCisgICAgezB4ODIzMywgMHhBNjMwLCAweEE2MzksIDB4NjhEOH0sIHsweDgyMzMsIDB4QTczMCwgMHhBNzM5LCAweDY4RTJ9LAorICAgIHsweDgyMzMsIDB4QTgzMCwgMHhBODM5LCAweDY4RUN9LCB7MHg4MjMzLCAweEE5MzAsIDB4QTkzOSwgMHg2OEY2fSwKKyAgICB7MHg4MjMzLCAweEFBMzAsIDB4QUEzOSwgMHg2OTAwfSwgezB4ODIzMywgMHhBQjMwLCAweEFCMzksIDB4NjkwQX0sCisgICAgezB4ODIzMywgMHhBQzMwLCAweEFDMzksIDB4NjkxNH0sIHsweDgyMzMsIDB4QUQzMCwgMHhBRDM5LCAweDY5MUV9LAorICAgIHsweDgyMzMsIDB4QUUzMCwgMHhBRTM5LCAweDY5Mjh9LCB7MHg4MjMzLCAweEFGMzAsIDB4QUYzOSwgMHg2OTMyfSwKKyAgICB7MHg4MjMzLCAweEIwMzAsIDB4QjAzOSwgMHg2OTNDfSwgezB4ODIzMywgMHhCMTMwLCAweEIxMzksIDB4Njk0Nn0sCisgICAgezB4ODIzMywgMHhCMjMwLCAweEIyMzksIDB4Njk1MH0sIHsweDgyMzMsIDB4QjMzMCwgMHhCMzM5LCAweDY5NUF9LAorICAgIHsweDgyMzMsIDB4QjQzMCwgMHhCNDM5LCAweDY5NjR9LCB7MHg4MjMzLCAweEI1MzAsIDB4QjUzOSwgMHg2OTZFfSwKKyAgICB7MHg4MjMzLCAweEI2MzAsIDB4QjYzOSwgMHg2OTc4fSwgezB4ODIzMywgMHhCNzMwLCAweEI3MzksIDB4Njk4Mn0sCisgICAgezB4ODIzMywgMHhCODMwLCAweEI4MzksIDB4Njk4Q30sIHsweDgyMzMsIDB4QjkzMCwgMHhCOTM5LCAweDY5OTZ9LAorICAgIHsweDgyMzMsIDB4QkEzMCwgMHhCQTM5LCAweDY5QTB9LCB7MHg4MjMzLCAweEJCMzAsIDB4QkIzOSwgMHg2OUFBfSwKKyAgICB7MHg4MjMzLCAweEJDMzAsIDB4QkMzOSwgMHg2OUI0fSwgezB4ODIzMywgMHhCRDMwLCAweEJEMzksIDB4NjlCRX0sCisgICAgezB4ODIzMywgMHhCRTMwLCAweEJFMzksIDB4NjlDOH0sIHsweDgyMzMsIDB4QkYzMCwgMHhCRjM5LCAweDY5RDJ9LAorICAgIHsweDgyMzMsIDB4QzAzMCwgMHhDMDM5LCAweDY5REN9LCB7MHg4MjMzLCAweEMxMzAsIDB4QzEzOSwgMHg2OUU2fSwKKyAgICB7MHg4MjMzLCAweEMyMzAsIDB4QzIzOSwgMHg2OUYwfSwgezB4ODIzMywgMHhDMzMwLCAweEMzMzksIDB4NjlGQX0sCisgICAgezB4ODIzMywgMHhDNDMwLCAweEM0MzksIDB4NkEwNH0sIHsweDgyMzMsIDB4QzUzMCwgMHhDNTM5LCAweDZBMEV9LAorICAgIHsweDgyMzMsIDB4QzYzMCwgMHhDNjM5LCAweDZBMTh9LCB7MHg4MjMzLCAweEM3MzAsIDB4QzczOSwgMHg2QTIyfSwKKyAgICB7MHg4MjMzLCAweEM4MzAsIDB4QzgzOSwgMHg2QTJDfSwgezB4ODIzMywgMHhDOTMwLCAweEM5MzksIDB4NkEzNn0sCisgICAgezB4ODIzMywgMHhDQTMwLCAweENBMzksIDB4NkE0MH0sIHsweDgyMzMsIDB4Q0IzMCwgMHhDQjM5LCAweDZBNEF9LAorICAgIHsweDgyMzMsIDB4Q0MzMCwgMHhDQzM5LCAweDZBNTR9LCB7MHg4MjMzLCAweENEMzAsIDB4Q0QzOSwgMHg2QTVFfSwKKyAgICB7MHg4MjMzLCAweENFMzAsIDB4Q0UzOSwgMHg2QTY4fSwgezB4ODIzMywgMHhDRjMwLCAweENGMzksIDB4NkE3Mn0sCisgICAgezB4ODIzMywgMHhEMDMwLCAweEQwMzksIDB4NkE3Q30sIHsweDgyMzMsIDB4RDEzMCwgMHhEMTM5LCAweDZBODZ9LAorICAgIHsweDgyMzMsIDB4RDIzMCwgMHhEMjM5LCAweDZBOTB9LCB7MHg4MjMzLCAweEQzMzAsIDB4RDMzOSwgMHg2QTlBfSwKKyAgICB7MHg4MjMzLCAweEQ0MzAsIDB4RDQzOSwgMHg2QUE0fSwgezB4ODIzMywgMHhENTMwLCAweEQ1MzksIDB4NkFBRX0sCisgICAgezB4ODIzMywgMHhENjMwLCAweEQ2MzksIDB4NkFCOH0sIHsweDgyMzMsIDB4RDczMCwgMHhENzM5LCAweDZBQzJ9LAorICAgIHsweDgyMzMsIDB4RDgzMCwgMHhEODM5LCAweDZBQ0N9LCB7MHg4MjMzLCAweEQ5MzAsIDB4RDkzOSwgMHg2QUQ2fSwKKyAgICB7MHg4MjMzLCAweERBMzAsIDB4REEzOSwgMHg2QUUwfSwgezB4ODIzMywgMHhEQjMwLCAweERCMzksIDB4NkFFQX0sCisgICAgezB4ODIzMywgMHhEQzMwLCAweERDMzksIDB4NkFGNH0sIHsweDgyMzMsIDB4REQzMCwgMHhERDM5LCAweDZBRkV9LAorICAgIHsweDgyMzMsIDB4REUzMCwgMHhERTM5LCAweDZCMDh9LCB7MHg4MjMzLCAweERGMzAsIDB4REYzOSwgMHg2QjEyfSwKKyAgICB7MHg4MjMzLCAweEUwMzAsIDB4RTAzOSwgMHg2QjFDfSwgezB4ODIzMywgMHhFMTMwLCAweEUxMzksIDB4NkIyNn0sCisgICAgezB4ODIzMywgMHhFMjMwLCAweEUyMzksIDB4NkIzMH0sIHsweDgyMzMsIDB4RTMzMCwgMHhFMzM5LCAweDZCM0F9LAorICAgIHsweDgyMzMsIDB4RTQzMCwgMHhFNDM5LCAweDZCNDR9LCB7MHg4MjMzLCAweEU1MzAsIDB4RTUzOSwgMHg2QjRFfSwKKyAgICB7MHg4MjMzLCAweEU2MzAsIDB4RTYzOSwgMHg2QjU4fSwgezB4ODIzMywgMHhFNzMwLCAweEU3MzksIDB4NkI2Mn0sCisgICAgezB4ODIzMywgMHhFODMwLCAweEU4MzksIDB4NkI2Q30sIHsweDgyMzMsIDB4RTkzMCwgMHhFOTM5LCAweDZCNzZ9LAorICAgIHsweDgyMzMsIDB4RUEzMCwgMHhFQTM5LCAweDZCODB9LCB7MHg4MjMzLCAweEVCMzAsIDB4RUIzOSwgMHg2QjhBfSwKKyAgICB7MHg4MjMzLCAweEVDMzAsIDB4RUMzOSwgMHg2Qjk0fSwgezB4ODIzMywgMHhFRDMwLCAweEVEMzksIDB4NkI5RX0sCisgICAgezB4ODIzMywgMHhFRTMwLCAweEVFMzksIDB4NkJBOH0sIHsweDgyMzMsIDB4RUYzMCwgMHhFRjM5LCAweDZCQjJ9LAorICAgIHsweDgyMzMsIDB4RjAzMCwgMHhGMDM5LCAweDZCQkN9LCB7MHg4MjMzLCAweEYxMzAsIDB4RjEzOSwgMHg2QkM2fSwKKyAgICB7MHg4MjMzLCAweEYyMzAsIDB4RjIzOSwgMHg2QkQwfSwgezB4ODIzMywgMHhGMzMwLCAweEYzMzksIDB4NkJEQX0sCisgICAgezB4ODIzMywgMHhGNDMwLCAweEY0MzksIDB4NkJFNH0sIHsweDgyMzMsIDB4RjUzMCwgMHhGNTM5LCAweDZCRUV9LAorICAgIHsweDgyMzMsIDB4RjYzMCwgMHhGNjM5LCAweDZCRjh9LCB7MHg4MjMzLCAweEY3MzAsIDB4RjczOSwgMHg2QzAyfSwKKyAgICB7MHg4MjMzLCAweEY4MzAsIDB4RjgzOSwgMHg2QzBDfSwgezB4ODIzMywgMHhGOTMwLCAweEY5MzksIDB4NkMxNn0sCisgICAgezB4ODIzMywgMHhGQTMwLCAweEZBMzksIDB4NkMyMH0sIHsweDgyMzMsIDB4RkIzMCwgMHhGQjM5LCAweDZDMkF9LAorICAgIHsweDgyMzMsIDB4RkMzMCwgMHhGQzM5LCAweDZDMzR9LCB7MHg4MjMzLCAweEZEMzAsIDB4RkQzOSwgMHg2QzNFfSwKKyAgICB7MHg4MjMzLCAweEZFMzAsIDB4RkUzOSwgMHg2QzQ4fSwgezB4ODIzNCwgMHg4MTMwLCAweDgxMzksIDB4NkM1Mn0sCisgICAgezB4ODIzNCwgMHg4MjMwLCAweDgyMzksIDB4NkM1Q30sIHsweDgyMzQsIDB4ODMzMCwgMHg4MzM5LCAweDZDNjZ9LAorICAgIHsweDgyMzQsIDB4ODQzMCwgMHg4NDM5LCAweDZDNzB9LCB7MHg4MjM0LCAweDg1MzAsIDB4ODUzOSwgMHg2QzdBfSwKKyAgICB7MHg4MjM0LCAweDg2MzAsIDB4ODYzOSwgMHg2Qzg0fSwgezB4ODIzNCwgMHg4NzMwLCAweDg3MzksIDB4NkM4RX0sCisgICAgezB4ODIzNCwgMHg4ODMwLCAweDg4MzksIDB4NkM5OH0sIHsweDgyMzQsIDB4ODkzMCwgMHg4OTM5LCAweDZDQTJ9LAorICAgIHsweDgyMzQsIDB4OEEzMCwgMHg4QTM5LCAweDZDQUN9LCB7MHg4MjM0LCAweDhCMzAsIDB4OEIzOSwgMHg2Q0I2fSwKKyAgICB7MHg4MjM0LCAweDhDMzAsIDB4OEMzOSwgMHg2Q0MwfSwgezB4ODIzNCwgMHg4RDMwLCAweDhEMzksIDB4NkNDQX0sCisgICAgezB4ODIzNCwgMHg4RTMwLCAweDhFMzksIDB4NkNENH0sIHsweDgyMzQsIDB4OEYzMCwgMHg4RjM5LCAweDZDREV9LAorICAgIHsweDgyMzQsIDB4OTAzMCwgMHg5MDM5LCAweDZDRTh9LCB7MHg4MjM0LCAweDkxMzAsIDB4OTEzOSwgMHg2Q0YyfSwKKyAgICB7MHg4MjM0LCAweDkyMzAsIDB4OTIzOSwgMHg2Q0ZDfSwgezB4ODIzNCwgMHg5MzMwLCAweDkzMzksIDB4NkQwNn0sCisgICAgezB4ODIzNCwgMHg5NDMwLCAweDk0MzksIDB4NkQxMH0sIHsweDgyMzQsIDB4OTUzMCwgMHg5NTM5LCAweDZEMUF9LAorICAgIHsweDgyMzQsIDB4OTYzMCwgMHg5NjM5LCAweDZEMjR9LCB7MHg4MjM0LCAweDk3MzAsIDB4OTczOSwgMHg2RDJFfSwKKyAgICB7MHg4MjM0LCAweDk4MzAsIDB4OTgzOSwgMHg2RDM4fSwgezB4ODIzNCwgMHg5OTMwLCAweDk5MzksIDB4NkQ0Mn0sCisgICAgezB4ODIzNCwgMHg5QTMwLCAweDlBMzksIDB4NkQ0Q30sIHsweDgyMzQsIDB4OUIzMCwgMHg5QjM5LCAweDZENTZ9LAorICAgIHsweDgyMzQsIDB4OUMzMCwgMHg5QzM5LCAweDZENjB9LCB7MHg4MjM0LCAweDlEMzAsIDB4OUQzOSwgMHg2RDZBfSwKKyAgICB7MHg4MjM0LCAweDlFMzAsIDB4OUUzOSwgMHg2RDc0fSwgezB4ODIzNCwgMHg5RjMwLCAweDlGMzksIDB4NkQ3RX0sCisgICAgezB4ODIzNCwgMHhBMDMwLCAweEEwMzksIDB4NkQ4OH0sIHsweDgyMzQsIDB4QTEzMCwgMHhBMTM5LCAweDZEOTJ9LAorICAgIHsweDgyMzQsIDB4QTIzMCwgMHhBMjM5LCAweDZEOUN9LCB7MHg4MjM0LCAweEEzMzAsIDB4QTMzOSwgMHg2REE2fSwKKyAgICB7MHg4MjM0LCAweEE0MzAsIDB4QTQzOSwgMHg2REIwfSwgezB4ODIzNCwgMHhBNTMwLCAweEE1MzksIDB4NkRCQX0sCisgICAgezB4ODIzNCwgMHhBNjMwLCAweEE2MzksIDB4NkRDNH0sIHsweDgyMzQsIDB4QTczMCwgMHhBNzM5LCAweDZEQ0V9LAorICAgIHsweDgyMzQsIDB4QTgzMCwgMHhBODM5LCAweDZERDh9LCB7MHg4MjM0LCAweEE5MzAsIDB4QTkzOSwgMHg2REUyfSwKKyAgICB7MHg4MjM0LCAweEFBMzAsIDB4QUEzOSwgMHg2REVDfSwgezB4ODIzNCwgMHhBQjMwLCAweEFCMzksIDB4NkRGNn0sCisgICAgezB4ODIzNCwgMHhBQzMwLCAweEFDMzksIDB4NkUwMH0sIHsweDgyMzQsIDB4QUQzMCwgMHhBRDM5LCAweDZFMEF9LAorICAgIHsweDgyMzQsIDB4QUUzMCwgMHhBRTM5LCAweDZFMTR9LCB7MHg4MjM0LCAweEFGMzAsIDB4QUYzOSwgMHg2RTFFfSwKKyAgICB7MHg4MjM0LCAweEIwMzAsIDB4QjAzOSwgMHg2RTI4fSwgezB4ODIzNCwgMHhCMTMwLCAweEIxMzksIDB4NkUzMn0sCisgICAgezB4ODIzNCwgMHhCMjMwLCAweEIyMzksIDB4NkUzQ30sIHsweDgyMzQsIDB4QjMzMCwgMHhCMzM5LCAweDZFNDZ9LAorICAgIHsweDgyMzQsIDB4QjQzMCwgMHhCNDM5LCAweDZFNTB9LCB7MHg4MjM0LCAweEI1MzAsIDB4QjUzOSwgMHg2RTVBfSwKKyAgICB7MHg4MjM0LCAweEI2MzAsIDB4QjYzOSwgMHg2RTY0fSwgezB4ODIzNCwgMHhCNzMwLCAweEI3MzksIDB4NkU2RX0sCisgICAgezB4ODIzNCwgMHhCODMwLCAweEI4MzksIDB4NkU3OH0sIHsweDgyMzQsIDB4QjkzMCwgMHhCOTM5LCAweDZFODJ9LAorICAgIHsweDgyMzQsIDB4QkEzMCwgMHhCQTM5LCAweDZFOEN9LCB7MHg4MjM0LCAweEJCMzAsIDB4QkIzOSwgMHg2RTk2fSwKKyAgICB7MHg4MjM0LCAweEJDMzAsIDB4QkMzOSwgMHg2RUEwfSwgezB4ODIzNCwgMHhCRDMwLCAweEJEMzksIDB4NkVBQX0sCisgICAgezB4ODIzNCwgMHhCRTMwLCAweEJFMzksIDB4NkVCNH0sIHsweDgyMzQsIDB4QkYzMCwgMHhCRjM5LCAweDZFQkV9LAorICAgIHsweDgyMzQsIDB4QzAzMCwgMHhDMDM5LCAweDZFQzh9LCB7MHg4MjM0LCAweEMxMzAsIDB4QzEzOSwgMHg2RUQyfSwKKyAgICB7MHg4MjM0LCAweEMyMzAsIDB4QzIzOSwgMHg2RURDfSwgezB4ODIzNCwgMHhDMzMwLCAweEMzMzksIDB4NkVFNn0sCisgICAgezB4ODIzNCwgMHhDNDMwLCAweEM0MzksIDB4NkVGMH0sIHsweDgyMzQsIDB4QzUzMCwgMHhDNTM5LCAweDZFRkF9LAorICAgIHsweDgyMzQsIDB4QzYzMCwgMHhDNjM5LCAweDZGMDR9LCB7MHg4MjM0LCAweEM3MzAsIDB4QzczOSwgMHg2RjBFfSwKKyAgICB7MHg4MjM0LCAweEM4MzAsIDB4QzgzOSwgMHg2RjE4fSwgezB4ODIzNCwgMHhDOTMwLCAweEM5MzksIDB4NkYyMn0sCisgICAgezB4ODIzNCwgMHhDQTMwLCAweENBMzksIDB4NkYyQ30sIHsweDgyMzQsIDB4Q0IzMCwgMHhDQjM5LCAweDZGMzZ9LAorICAgIHsweDgyMzQsIDB4Q0MzMCwgMHhDQzM5LCAweDZGNDB9LCB7MHg4MjM0LCAweENEMzAsIDB4Q0QzOSwgMHg2RjRBfSwKKyAgICB7MHg4MjM0LCAweENFMzAsIDB4Q0UzOSwgMHg2RjU0fSwgezB4ODIzNCwgMHhDRjMwLCAweENGMzksIDB4NkY1RX0sCisgICAgezB4ODIzNCwgMHhEMDMwLCAweEQwMzksIDB4NkY2OH0sIHsweDgyMzQsIDB4RDEzMCwgMHhEMTM5LCAweDZGNzJ9LAorICAgIHsweDgyMzQsIDB4RDIzMCwgMHhEMjM5LCAweDZGN0N9LCB7MHg4MjM0LCAweEQzMzAsIDB4RDMzOSwgMHg2Rjg2fSwKKyAgICB7MHg4MjM0LCAweEQ0MzAsIDB4RDQzOSwgMHg2RjkwfSwgezB4ODIzNCwgMHhENTMwLCAweEQ1MzksIDB4NkY5QX0sCisgICAgezB4ODIzNCwgMHhENjMwLCAweEQ2MzksIDB4NkZBNH0sIHsweDgyMzQsIDB4RDczMCwgMHhENzM5LCAweDZGQUV9LAorICAgIHsweDgyMzQsIDB4RDgzMCwgMHhEODM5LCAweDZGQjh9LCB7MHg4MjM0LCAweEQ5MzAsIDB4RDkzOSwgMHg2RkMyfSwKKyAgICB7MHg4MjM0LCAweERBMzAsIDB4REEzOSwgMHg2RkNDfSwgezB4ODIzNCwgMHhEQjMwLCAweERCMzksIDB4NkZENn0sCisgICAgezB4ODIzNCwgMHhEQzMwLCAweERDMzksIDB4NkZFMH0sIHsweDgyMzQsIDB4REQzMCwgMHhERDM5LCAweDZGRUF9LAorICAgIHsweDgyMzQsIDB4REUzMCwgMHhERTM5LCAweDZGRjR9LCB7MHg4MjM0LCAweERGMzAsIDB4REYzOSwgMHg2RkZFfSwKKyAgICB7MHg4MjM0LCAweEUwMzAsIDB4RTAzOSwgMHg3MDA4fSwgezB4ODIzNCwgMHhFMTMwLCAweEUxMzksIDB4NzAxMn0sCisgICAgezB4ODIzNCwgMHhFMjMwLCAweEUyMzksIDB4NzAxQ30sIHsweDgyMzQsIDB4RTMzMCwgMHhFMzM5LCAweDcwMjZ9LAorICAgIHsweDgyMzQsIDB4RTQzMCwgMHhFNDM5LCAweDcwMzB9LCB7MHg4MjM0LCAweEU1MzAsIDB4RTUzOSwgMHg3MDNBfSwKKyAgICB7MHg4MjM0LCAweEU2MzAsIDB4RTYzOSwgMHg3MDQ0fSwgezB4ODIzNCwgMHhFNzMwLCAweEU3MzksIDB4NzA0RX0sCisgICAgezB4ODIzNCwgMHhFODMwLCAweEU4MzksIDB4NzA1OH0sIHsweDgyMzQsIDB4RTkzMCwgMHhFOTM5LCAweDcwNjJ9LAorICAgIHsweDgyMzQsIDB4RUEzMCwgMHhFQTM5LCAweDcwNkN9LCB7MHg4MjM0LCAweEVCMzAsIDB4RUIzOSwgMHg3MDc2fSwKKyAgICB7MHg4MjM0LCAweEVDMzAsIDB4RUMzOSwgMHg3MDgwfSwgezB4ODIzNCwgMHhFRDMwLCAweEVEMzksIDB4NzA4QX0sCisgICAgezB4ODIzNCwgMHhFRTMwLCAweEVFMzksIDB4NzA5NH0sIHsweDgyMzQsIDB4RUYzMCwgMHhFRjM5LCAweDcwOUV9LAorICAgIHsweDgyMzQsIDB4RjAzMCwgMHhGMDM5LCAweDcwQTh9LCB7MHg4MjM0LCAweEYxMzAsIDB4RjEzOSwgMHg3MEIyfSwKKyAgICB7MHg4MjM0LCAweEYyMzAsIDB4RjIzOSwgMHg3MEJDfSwgezB4ODIzNCwgMHhGMzMwLCAweEYzMzksIDB4NzBDNn0sCisgICAgezB4ODIzNCwgMHhGNDMwLCAweEY0MzksIDB4NzBEMH0sIHsweDgyMzQsIDB4RjUzMCwgMHhGNTM5LCAweDcwREF9LAorICAgIHsweDgyMzQsIDB4RjYzMCwgMHhGNjM5LCAweDcwRTR9LCB7MHg4MjM0LCAweEY3MzAsIDB4RjczOSwgMHg3MEVFfSwKKyAgICB7MHg4MjM0LCAweEY4MzAsIDB4RjgzOSwgMHg3MEY4fSwgezB4ODIzNCwgMHhGOTMwLCAweEY5MzksIDB4NzEwMn0sCisgICAgezB4ODIzNCwgMHhGQTMwLCAweEZBMzksIDB4NzEwQ30sIHsweDgyMzQsIDB4RkIzMCwgMHhGQjM5LCAweDcxMTZ9LAorICAgIHsweDgyMzQsIDB4RkMzMCwgMHhGQzM5LCAweDcxMjB9LCB7MHg4MjM0LCAweEZEMzAsIDB4RkQzOSwgMHg3MTJBfSwKKyAgICB7MHg4MjM0LCAweEZFMzAsIDB4RkUzOSwgMHg3MTM0fSwgezB4ODIzNSwgMHg4MTMwLCAweDgxMzksIDB4NzEzRX0sCisgICAgezB4ODIzNSwgMHg4MjMwLCAweDgyMzksIDB4NzE0OH0sIHsweDgyMzUsIDB4ODMzMCwgMHg4MzM5LCAweDcxNTJ9LAorICAgIHsweDgyMzUsIDB4ODQzMCwgMHg4NDM5LCAweDcxNUN9LCB7MHg4MjM1LCAweDg1MzAsIDB4ODUzOSwgMHg3MTY2fSwKKyAgICB7MHg4MjM1LCAweDg2MzAsIDB4ODYzOSwgMHg3MTcwfSwgezB4ODIzNSwgMHg4NzMwLCAweDg3MzgsIDB4NzE3QX0sCisgICAgezB4ODIzNSwgMHg5ODMzLCAweDk4MzksIDB4NzE4OH0sIHsweDgyMzUsIDB4OTkzMCwgMHg5OTM5LCAweDcxOEZ9LAorICAgIHsweDgyMzUsIDB4OUEzMCwgMHg5QTM5LCAweDcxOTl9LCB7MHg4MjM1LCAweDlCMzAsIDB4OUIzOSwgMHg3MUEzfSwKKyAgICB7MHg4MjM1LCAweDlDMzAsIDB4OUMzOSwgMHg3MUFEfSwgezB4ODIzNSwgMHg5RDMwLCAweDlEMzksIDB4NzFCN30sCisgICAgezB4ODIzNSwgMHg5RTMwLCAweDlFMzksIDB4NzFDMX0sIHsweDgyMzUsIDB4OUYzMCwgMHg5RjM5LCAweDcxQ0J9LAorICAgIHsweDgyMzUsIDB4QTAzMCwgMHhBMDM5LCAweDcxRDV9LCB7MHg4MjM1LCAweEExMzAsIDB4QTEzOSwgMHg3MURGfSwKKyAgICB7MHg4MjM1LCAweEEyMzAsIDB4QTIzOSwgMHg3MUU5fSwgezB4ODIzNSwgMHhBMzMwLCAweEEzMzksIDB4NzFGM30sCisgICAgezB4ODIzNSwgMHhBNDMwLCAweEE0MzksIDB4NzFGRH0sIHsweDgyMzUsIDB4QTUzMCwgMHhBNTM5LCAweDcyMDd9LAorICAgIHsweDgyMzUsIDB4QTYzMCwgMHhBNjM5LCAweDcyMTF9LCB7MHg4MjM1LCAweEE3MzAsIDB4QTczOSwgMHg3MjFCfSwKKyAgICB7MHg4MjM1LCAweEE4MzAsIDB4QTgzOSwgMHg3MjI1fSwgezB4ODIzNSwgMHhBOTMwLCAweEE5MzksIDB4NzIyRn0sCisgICAgezB4ODIzNSwgMHhBQTMwLCAweEFBMzksIDB4NzIzOX0sIHsweDgyMzUsIDB4QUIzMCwgMHhBQjM5LCAweDcyNDN9LAorICAgIHsweDgyMzUsIDB4QUMzMCwgMHhBQzM5LCAweDcyNER9LCB7MHg4MjM1LCAweEFEMzAsIDB4QUQzOSwgMHg3MjU3fSwKKyAgICB7MHg4MjM1LCAweEFFMzAsIDB4QUUzOSwgMHg3MjYxfSwgezB4ODIzNSwgMHhBRjMwLCAweEFGMzksIDB4NzI2Qn0sCisgICAgezB4ODIzNSwgMHhCMDMwLCAweEIwMzksIDB4NzI3NX0sIHsweDgyMzUsIDB4QjEzMCwgMHhCMTM5LCAweDcyN0Z9LAorICAgIHsweDgyMzUsIDB4QjIzMCwgMHhCMjM5LCAweDcyODl9LCB7MHg4MjM1LCAweEIzMzAsIDB4QjMzOSwgMHg3MjkzfSwKKyAgICB7MHg4MjM1LCAweEI0MzAsIDB4QjQzOSwgMHg3MjlEfSwgezB4ODIzNSwgMHhCNTMwLCAweEI1MzksIDB4NzJBN30sCisgICAgezB4ODIzNSwgMHhCNjMwLCAweEI2MzksIDB4NzJCMX0sIHsweDgyMzUsIDB4QjczMCwgMHhCNzM5LCAweDcyQkJ9LAorICAgIHsweDgyMzUsIDB4QjgzMCwgMHhCODM5LCAweDcyQzV9LCB7MHg4MjM1LCAweEI5MzAsIDB4QjkzOSwgMHg3MkNGfSwKKyAgICB7MHg4MjM1LCAweEJBMzAsIDB4QkEzOSwgMHg3MkQ5fSwgezB4ODIzNSwgMHhCQjMwLCAweEJCMzksIDB4NzJFM30sCisgICAgezB4ODIzNSwgMHhCQzMwLCAweEJDMzksIDB4NzJFRH0sIHsweDgyMzUsIDB4QkQzMCwgMHhCRDM5LCAweDcyRjd9LAorICAgIHsweDgyMzUsIDB4QkUzMCwgMHhCRTM5LCAweDczMDF9LCB7MHg4MjM1LCAweEJGMzAsIDB4QkYzOSwgMHg3MzBCfSwKKyAgICB7MHg4MjM1LCAweEMwMzAsIDB4QzAzOSwgMHg3MzE1fSwgezB4ODIzNSwgMHhDMTMwLCAweEMxMzksIDB4NzMxRn0sCisgICAgezB4ODIzNSwgMHhDMjMwLCAweEMyMzksIDB4NzMyOX0sIHsweDgyMzUsIDB4QzMzMCwgMHhDMzM5LCAweDczMzN9LAorICAgIHsweDgyMzUsIDB4QzQzMCwgMHhDNDM5LCAweDczM0R9LCB7MHg4MjM1LCAweEM1MzAsIDB4QzUzOSwgMHg3MzQ3fSwKKyAgICB7MHg4MjM1LCAweEM2MzAsIDB4QzYzOSwgMHg3MzUxfSwgezB4ODIzNSwgMHhDNzMwLCAweEM3MzksIDB4NzM1Qn0sCisgICAgezB4ODIzNSwgMHhDODMwLCAweEM4MzksIDB4NzM2NX0sIHsweDgyMzUsIDB4QzkzMCwgMHhDOTM5LCAweDczNkZ9LAorICAgIHsweDgyMzUsIDB4Q0EzMCwgMHhDQTM5LCAweDczNzl9LCB7MHg4MjM1LCAweENCMzAsIDB4Q0IzOSwgMHg3MzgzfSwKKyAgICB7MHg4MjM1LCAweENDMzAsIDB4Q0MzOSwgMHg3MzhEfSwgezB4ODIzNSwgMHhDRDMwLCAweENEMzksIDB4NzM5N30sCisgICAgezB4ODIzNSwgMHhDRTMwLCAweENFMzksIDB4NzNBMX0sIHsweDgyMzUsIDB4Q0YzMCwgMHhDRjM5LCAweDczQUJ9LAorICAgIHsweDgyMzUsIDB4RDAzMCwgMHhEMDM5LCAweDczQjV9LCB7MHg4MjM1LCAweEQxMzAsIDB4RDEzOSwgMHg3M0JGfSwKKyAgICB7MHg4MjM1LCAweEQyMzAsIDB4RDIzOSwgMHg3M0M5fSwgezB4ODIzNSwgMHhEMzMwLCAweEQzMzksIDB4NzNEM30sCisgICAgezB4ODIzNSwgMHhENDMwLCAweEQ0MzksIDB4NzNERH0sIHsweDgyMzUsIDB4RDUzMCwgMHhENTM5LCAweDczRTd9LAorICAgIHsweDgyMzUsIDB4RDYzMCwgMHhENjM5LCAweDczRjF9LCB7MHg4MjM1LCAweEQ3MzAsIDB4RDczOSwgMHg3M0ZCfSwKKyAgICB7MHg4MjM1LCAweEQ4MzAsIDB4RDgzOSwgMHg3NDA1fSwgezB4ODIzNSwgMHhEOTMwLCAweEQ5MzksIDB4NzQwRn0sCisgICAgezB4ODIzNSwgMHhEQTMwLCAweERBMzksIDB4NzQxOX0sIHsweDgyMzUsIDB4REIzMCwgMHhEQjM5LCAweDc0MjN9LAorICAgIHsweDgyMzUsIDB4REMzMCwgMHhEQzM5LCAweDc0MkR9LCB7MHg4MjM1LCAweEREMzAsIDB4REQzOSwgMHg3NDM3fSwKKyAgICB7MHg4MjM1LCAweERFMzAsIDB4REUzOSwgMHg3NDQxfSwgezB4ODIzNSwgMHhERjMwLCAweERGMzksIDB4NzQ0Qn0sCisgICAgezB4ODIzNSwgMHhFMDMwLCAweEUwMzksIDB4NzQ1NX0sIHsweDgyMzUsIDB4RTEzMCwgMHhFMTM5LCAweDc0NUZ9LAorICAgIHsweDgyMzUsIDB4RTIzMCwgMHhFMjM5LCAweDc0Njl9LCB7MHg4MjM1LCAweEUzMzAsIDB4RTMzOSwgMHg3NDczfSwKKyAgICB7MHg4MjM1LCAweEU0MzAsIDB4RTQzOSwgMHg3NDdEfSwgezB4ODIzNSwgMHhFNTMwLCAweEU1MzksIDB4NzQ4N30sCisgICAgezB4ODIzNSwgMHhFNjMwLCAweEU2MzksIDB4NzQ5MX0sIHsweDgyMzUsIDB4RTczMCwgMHhFNzM5LCAweDc0OUJ9LAorICAgIHsweDgyMzUsIDB4RTgzMCwgMHhFODM5LCAweDc0QTV9LCB7MHg4MjM1LCAweEU5MzAsIDB4RTkzOSwgMHg3NEFGfSwKKyAgICB7MHg4MjM1LCAweEVBMzAsIDB4RUEzOSwgMHg3NEI5fSwgezB4ODIzNSwgMHhFQjMwLCAweEVCMzksIDB4NzRDM30sCisgICAgezB4ODIzNSwgMHhFQzMwLCAweEVDMzksIDB4NzRDRH0sIHsweDgyMzUsIDB4RUQzMCwgMHhFRDM5LCAweDc0RDd9LAorICAgIHsweDgyMzUsIDB4RUUzMCwgMHhFRTM5LCAweDc0RTF9LCB7MHg4MjM1LCAweEVGMzAsIDB4RUYzOSwgMHg3NEVCfSwKKyAgICB7MHg4MjM1LCAweEYwMzAsIDB4RjAzOSwgMHg3NEY1fSwgezB4ODIzNSwgMHhGMTMwLCAweEYxMzksIDB4NzRGRn0sCisgICAgezB4ODIzNSwgMHhGMjMwLCAweEYyMzksIDB4NzUwOX0sIHsweDgyMzUsIDB4RjMzMCwgMHhGMzM5LCAweDc1MTN9LAorICAgIHsweDgyMzUsIDB4RjQzMCwgMHhGNDM5LCAweDc1MUR9LCB7MHg4MjM1LCAweEY1MzAsIDB4RjUzOSwgMHg3NTI3fSwKKyAgICB7MHg4MjM1LCAweEY2MzAsIDB4RjYzOSwgMHg3NTMxfSwgezB4ODIzNSwgMHhGNzMwLCAweEY3MzksIDB4NzUzQn0sCisgICAgezB4ODIzNSwgMHhGODMwLCAweEY4MzksIDB4NzU0NX0sIHsweDgyMzUsIDB4RjkzMCwgMHhGOTM5LCAweDc1NEZ9LAorICAgIHsweDgyMzUsIDB4RkEzMCwgMHhGQTM5LCAweDc1NTl9LCB7MHg4MjM1LCAweEZCMzAsIDB4RkIzOSwgMHg3NTYzfSwKKyAgICB7MHg4MjM1LCAweEZDMzAsIDB4RkMzOSwgMHg3NTZEfSwgezB4ODIzNSwgMHhGRDMwLCAweEZEMzksIDB4NzU3N30sCisgICAgezB4ODIzNSwgMHhGRTMwLCAweEZFMzksIDB4NzU4MX0sIHsweDgyMzYsIDB4ODEzMCwgMHg4MTM5LCAweDc1OEJ9LAorICAgIHsweDgyMzYsIDB4ODIzMCwgMHg4MjM5LCAweDc1OTV9LCB7MHg4MjM2LCAweDgzMzAsIDB4ODMzOSwgMHg3NTlGfSwKKyAgICB7MHg4MjM2LCAweDg0MzAsIDB4ODQzOSwgMHg3NUE5fSwgezB4ODIzNiwgMHg4NTMwLCAweDg1MzksIDB4NzVCM30sCisgICAgezB4ODIzNiwgMHg4NjMwLCAweDg2MzksIDB4NzVCRH0sIHsweDgyMzYsIDB4ODczMCwgMHg4NzM5LCAweDc1Qzd9LAorICAgIHsweDgyMzYsIDB4ODgzMCwgMHg4ODM5LCAweDc1RDF9LCB7MHg4MjM2LCAweDg5MzAsIDB4ODkzOSwgMHg3NURCfSwKKyAgICB7MHg4MjM2LCAweDhBMzAsIDB4OEEzOSwgMHg3NUU1fSwgezB4ODIzNiwgMHg4QjMwLCAweDhCMzksIDB4NzVFRn0sCisgICAgezB4ODIzNiwgMHg4QzMwLCAweDhDMzksIDB4NzVGOX0sIHsweDgyMzYsIDB4OEQzMCwgMHg4RDM5LCAweDc2MDN9LAorICAgIHsweDgyMzYsIDB4OEUzMCwgMHg4RTM3LCAweDc2MER9LCB7MHg4MjM2LCAweDhGMzEsIDB4OEYzOSwgMHg3NjE1fSwKKyAgICB7MHg4MjM2LCAweDkwMzAsIDB4OTAzOSwgMHg3NjFFfSwgezB4ODIzNiwgMHg5MTMwLCAweDkxMzksIDB4NzYyOH0sCisgICAgezB4ODIzNiwgMHg5MjMwLCAweDkyMzksIDB4NzYzMn0sIHsweDgyMzYsIDB4OTMzMCwgMHg5MzM5LCAweDc2M0N9LAorICAgIHsweDgyMzYsIDB4OTQzMCwgMHg5NDM1LCAweDc2NDZ9LAogfTsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9jbWFwcy9HQjEvY21hcHNfZ2IxLmNwcCBiL2NvcmUvZnBkZmFwaS9jbWFwcy9HQjEvY21hcHNfZ2IxLmNwcAppbmRleCA5ZDE1MjcxLi5mMzUxNjFhIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvY21hcHMvR0IxL2NtYXBzX2diMS5jcHAKKysrIGIvY29yZS9mcGRmYXBpL2NtYXBzL0dCMS9jbWFwc19nYjEuY3BwCkBAIC04LDQ4ICs4LDQxIEBACiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvY21hcHMvY21hcF9pbnQuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvY3BkZl9tb2R1bGVtZ3IuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9mb250X2ludC5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udGdsb2JhbHMuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2Vtb2R1bGUuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCiAKIHN0YXRpYyBjb25zdCBGWENNQVBfQ01hcCBnX0ZYQ01BUF9HQjFfY21hcHNbXSA9IHsKLSAgICB7IkdCLUVVQy1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9HQl9FVUNfSF8wLCA5MCwgRlhDTUFQX0NNYXA6Ok5vbmUsCi0gICAgIG51bGxwdHIsIDAsIDB9LAotICAgIHsiR0ItRVVDLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0dCX0VVQ19WXzAsIDIwLCBGWENNQVBfQ01hcDo6Tm9uZSwKLSAgICAgbnVsbHB0ciwgMCwgLTF9LAotICAgIHsiR0JwYy1FVUMtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfR0JwY19FVUNfSF8wLCA5MSwKLSAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIG51bGxwdHIsIDAsIDB9LAotICAgIHsiR0JwYy1FVUMtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfR0JwY19FVUNfVl8wLCAyMCwKLSAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIG51bGxwdHIsIDAsIC0xfSwKLSAgICB7IkdCSy1FVUMtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfR0JLX0VVQ19IXzIsIDQwNzEsCi0gICAgIEZYQ01BUF9DTWFwOjpOb25lLCBudWxscHRyLCAwLCAwfSwKLSAgICB7IkdCSy1FVUMtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfR0JLX0VVQ19WXzIsIDIwLAotICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgbnVsbHB0ciwgMCwgLTF9LAotICAgIHsiR0JLcC1FVUMtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfR0JLcF9FVUNfSF8yLCA0MDcwLAotICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgbnVsbHB0ciwgMCwgLTJ9LAotICAgIHsiR0JLcC1FVUMtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfR0JLcF9FVUNfVl8yLCAyMCwKLSAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIG51bGxwdHIsIDAsIC0xfSwKLSAgICB7IkdCSzJLLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0dCSzJLX0hfNSwgNDA3MSwKLSAgICAgRlhDTUFQX0NNYXA6OlNpbmdsZSwgZ19GWENNQVBfR0JLMktfSF81X0RXb3JkLCAxMDE3LCAtNH0sCi0gICAgeyJHQksySy1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9HQksyS19WXzUsIDQxLCBGWENNQVBfQ01hcDo6Tm9uZSwKLSAgICAgbnVsbHB0ciwgMCwgLTF9LAotICAgIHsiVW5pR0ItVUNTMi1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9VbmlHQl9VQ1MyX0hfNCwgMTM4MjUsCi0gICAgIEZYQ01BUF9DTWFwOjpOb25lLCBudWxscHRyLCAwLCAwfSwKLSAgICB7IlVuaUdCLVVDUzItViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVW5pR0JfVUNTMl9WXzQsIDI0LAotICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgbnVsbHB0ciwgMCwgLTF9LAotICAgIHsiVW5pR0ItVVRGMTYtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVW5pR0JfVUNTMl9IXzQsIDEzODI1LAotICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgbnVsbHB0ciwgMCwgMH0sCi0gICAgeyJVbmlHQi1VVEYxNi1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9VbmlHQl9VQ1MyX1ZfNCwgMjQsCi0gICAgIEZYQ01BUF9DTWFwOjpOb25lLCBudWxscHRyLCAwLCAtMX0sCisgICAgeyJHQi1FVUMtSCIsIGdfRlhDTUFQX0dCX0VVQ19IXzAsIG51bGxwdHIsIDkwLCAwLCBGWENNQVBfQ01hcDo6UmFuZ2UsIDB9LAorICAgIHsiR0ItRVVDLVYiLCBnX0ZYQ01BUF9HQl9FVUNfVl8wLCBudWxscHRyLCAyMCwgMCwgRlhDTUFQX0NNYXA6OlJhbmdlLCAtMX0sCisgICAgeyJHQnBjLUVVQy1IIiwgZ19GWENNQVBfR0JwY19FVUNfSF8wLCBudWxscHRyLCA5MSwgMCwgRlhDTUFQX0NNYXA6OlJhbmdlLAorICAgICAwfSwKKyAgICB7IkdCcGMtRVVDLVYiLCBnX0ZYQ01BUF9HQnBjX0VVQ19WXzAsIG51bGxwdHIsIDIwLCAwLCBGWENNQVBfQ01hcDo6UmFuZ2UsCisgICAgIC0xfSwKKyAgICB7IkdCSy1FVUMtSCIsIGdfRlhDTUFQX0dCS19FVUNfSF8yLCBudWxscHRyLCA0MDcxLCAwLCBGWENNQVBfQ01hcDo6UmFuZ2UsCisgICAgIDB9LAorICAgIHsiR0JLLUVVQy1WIiwgZ19GWENNQVBfR0JLX0VVQ19WXzIsIG51bGxwdHIsIDIwLCAwLCBGWENNQVBfQ01hcDo6UmFuZ2UsIC0xfSwKKyAgICB7IkdCS3AtRVVDLUgiLCBnX0ZYQ01BUF9HQktwX0VVQ19IXzIsIG51bGxwdHIsIDQwNzAsIDAsIEZYQ01BUF9DTWFwOjpSYW5nZSwKKyAgICAgLTJ9LAorICAgIHsiR0JLcC1FVUMtViIsIGdfRlhDTUFQX0dCS3BfRVVDX1ZfMiwgbnVsbHB0ciwgMjAsIDAsIEZYQ01BUF9DTWFwOjpSYW5nZSwKKyAgICAgLTF9LAorICAgIHsiR0JLMkstSCIsIGdfRlhDTUFQX0dCSzJLX0hfNSwgZ19GWENNQVBfR0JLMktfSF81X0RXb3JkLCA0MDcxLCAxMDE3LAorICAgICBGWENNQVBfQ01hcDo6UmFuZ2UsIC00fSwKKyAgICB7IkdCSzJLLVYiLCBnX0ZYQ01BUF9HQksyS19WXzUsIG51bGxwdHIsIDQxLCAwLCBGWENNQVBfQ01hcDo6UmFuZ2UsIC0xfSwKKyAgICB7IlVuaUdCLVVDUzItSCIsIGdfRlhDTUFQX1VuaUdCX1VDUzJfSF80LCBudWxscHRyLCAxMzgyNSwgMCwKKyAgICAgRlhDTUFQX0NNYXA6OlJhbmdlLCAwfSwKKyAgICB7IlVuaUdCLVVDUzItViIsIGdfRlhDTUFQX1VuaUdCX1VDUzJfVl80LCBudWxscHRyLCAyNCwgMCwKKyAgICAgRlhDTUFQX0NNYXA6OlJhbmdlLCAtMX0sCisgICAgeyJVbmlHQi1VVEYxNi1IIiwgZ19GWENNQVBfVW5pR0JfVUNTMl9IXzQsIG51bGxwdHIsIDEzODI1LCAwLAorICAgICBGWENNQVBfQ01hcDo6UmFuZ2UsIDB9LAorICAgIHsiVW5pR0ItVVRGMTYtViIsIGdfRlhDTUFQX1VuaUdCX1VDUzJfVl80LCBudWxscHRyLCAyNCwgMCwKKyAgICAgRlhDTUFQX0NNYXA6OlJhbmdlLCAtMX0sCiB9OwogCiB2b2lkIENQREZfTW9kdWxlTWdyOjpMb2FkRW1iZWRkZWRHQjFDTWFwcygpIHsKICAgQ1BERl9Gb250R2xvYmFscyogcEZvbnRHbG9iYWxzID0KICAgICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5HZXRGb250R2xvYmFscygpOwotICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRDaGFyc2V0c1tDSURTRVRfR0IxXS5tX3BNYXBMaXN0ID0gZ19GWENNQVBfR0IxX2NtYXBzOwotICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRDaGFyc2V0c1tDSURTRVRfR0IxXS5tX0NvdW50ID0KLSAgICAgIEZYX0FycmF5U2l6ZShnX0ZYQ01BUF9HQjFfY21hcHMpOwotICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9HQjFdLm1fcE1hcCA9Ci0gICAgICBnX0ZYQ01BUF9HQjFDSUQyVW5pY29kZV81OwotICBwRm9udEdsb2JhbHMtPm1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9HQjFdLm1fQ291bnQgPSAzMDI4NDsKKyAgcEZvbnRHbG9iYWxzLT5TZXRFbWJlZGRlZENoYXJzZXQoQ0lEU0VUX0dCMSwgZ19GWENNQVBfR0IxX2NtYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BcnJheVNpemUoZ19GWENNQVBfR0IxX2NtYXBzKSk7CisgIHBGb250R2xvYmFscy0+U2V0RW1iZWRkZWRUb1VuaWNvZGUoQ0lEU0VUX0dCMSwgZ19GWENNQVBfR0IxQ0lEMlVuaWNvZGVfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDI4NCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvY21hcHMvR0IxL2NtYXBzX2diMS5oIGIvY29yZS9mcGRmYXBpL2NtYXBzL0dCMS9jbWFwc19nYjEuaAppbmRleCAwYjhhMzUwLi5hNDc1YWYxIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvY21hcHMvR0IxL2NtYXBzX2diMS5oCisrKyBiL2NvcmUvZnBkZmFwaS9jbWFwcy9HQjEvY21hcHNfZ2IxLmgKQEAgLTksNiArOSw4IEBACiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KIAorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9jbWFwcy9jbWFwX2ludC5oIgorCiBleHRlcm4gY29uc3QgdWludDE2X3QgZ19GWENNQVBfR0JfRVVDX0hfMFtdOwogZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGdfRlhDTUFQX0dCX0VVQ19WXzBbXTsKIGV4dGVybiBjb25zdCB1aW50MTZfdCBnX0ZYQ01BUF9HQnBjX0VVQ19IXzBbXTsKQEAgLTE4LDcgKzIwLDcgQEAKIGV4dGVybiBjb25zdCB1aW50MTZfdCBnX0ZYQ01BUF9HQktwX0VVQ19IXzJbXTsKIGV4dGVybiBjb25zdCB1aW50MTZfdCBnX0ZYQ01BUF9HQktwX0VVQ19WXzJbXTsKIGV4dGVybiBjb25zdCB1aW50MTZfdCBnX0ZYQ01BUF9HQksyS19IXzVbXTsKLWV4dGVybiBjb25zdCB1aW50MTZfdCBnX0ZYQ01BUF9HQksyS19IXzVfRFdvcmRbXTsKK2V4dGVybiBjb25zdCBGWENNQVBfRFdvcmRDSURNYXAgZ19GWENNQVBfR0JLMktfSF81X0RXb3JkW107CiBleHRlcm4gY29uc3QgdWludDE2X3QgZ19GWENNQVBfR0JLMktfVl81W107CiBleHRlcm4gY29uc3QgdWludDE2X3QgZ19GWENNQVBfVW5pR0JfVUNTMl9IXzRbXTsKIGV4dGVybiBjb25zdCB1aW50MTZfdCBnX0ZYQ01BUF9VbmlHQl9VQ1MyX1ZfNFtdOwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2NtYXBzL0phcGFuMS9jbWFwc19qYXBhbjEuY3BwIGIvY29yZS9mcGRmYXBpL2NtYXBzL0phcGFuMS9jbWFwc19qYXBhbjEuY3BwCmluZGV4IGJkZjY1NTkuLmY2NDBmZGQgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9jbWFwcy9KYXBhbjEvY21hcHNfamFwYW4xLmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvY21hcHMvSmFwYW4xL2NtYXBzX2phcGFuMS5jcHAKQEAgLTgsNjEgKzgsNTMgQEAKIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9jbWFwcy9jbWFwX2ludC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9jcGRmX21vZHVsZW1nci5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2ZvbnRfaW50LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9mb250Z2xvYmFscy5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW1vZHVsZS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKIAogc3RhdGljIGNvbnN0IEZYQ01BUF9DTWFwIGdfRlhDTUFQX0phcGFuMV9jbWFwc1tdID0gewotICAgIHsiODNwdi1SS1NKLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQXzgzcHZfUktTSl9IXzEsIDIyMiwKLSAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIG51bGxwdHIsIDAsIDB9LAotICAgIHsiOTBtcy1SS1NKLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQXzkwbXNfUktTSl9IXzIsIDE3MSwKLSAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIG51bGxwdHIsIDAsIDB9LAotICAgIHsiOTBtcy1SS1NKLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQXzkwbXNfUktTSl9WXzIsIDc4LAotICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgbnVsbHB0ciwgMCwgLTF9LAotICAgIHsiOTBtc3AtUktTSi1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF85MG1zcF9SS1NKX0hfMiwgMTcwLAotICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgbnVsbHB0ciwgMCwgLTJ9LAotICAgIHsiOTBtc3AtUktTSi1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF85MG1zcF9SS1NKX1ZfMiwgNzgsCi0gICAgIEZYQ01BUF9DTWFwOjpOb25lLCBudWxscHRyLCAwLCAtMX0sCi0gICAgeyI5MHB2LVJLU0otSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfOTBwdl9SS1NKX0hfMSwgMjYzLAotICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgbnVsbHB0ciwgMCwgMH0sCi0gICAgeyJBZGQtUktTSi1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9BZGRfUktTSl9IXzEsIDYzNSwKLSAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIG51bGxwdHIsIDAsIDB9LAotICAgIHsiQWRkLVJLU0otViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfQWRkX1JLU0pfVl8xLCA1NywKLSAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIG51bGxwdHIsIDAsIC0xfSwKLSAgICB7IkVVQy1IIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9FVUNfSF8xLCAxMjAsIEZYQ01BUF9DTWFwOjpOb25lLAotICAgICBudWxscHRyLCAwLCAwfSwKLSAgICB7IkVVQy1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9FVUNfVl8xLCAyNywgRlhDTUFQX0NNYXA6Ok5vbmUsCi0gICAgIG51bGxwdHIsIDAsIC0xfSwKLSAgICB7IkV4dC1SS1NKLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0V4dF9SS1NKX0hfMiwgNjY1LAotICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgbnVsbHB0ciwgMCwgLTR9LAotICAgIHsiRXh0LVJLU0otViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfRXh0X1JLU0pfVl8yLCAzOSwKLSAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIG51bGxwdHIsIDAsIC0xfSwKLSAgICB7IkgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0hfMSwgMTE4LCBGWENNQVBfQ01hcDo6Tm9uZSwgbnVsbHB0ciwgMCwKKyAgICB7IjgzcHYtUktTSi1IIiwgZ19GWENNQVBfODNwdl9SS1NKX0hfMSwgbnVsbHB0ciwgMjIyLCAwLCBGWENNQVBfQ01hcDo6UmFuZ2UsCiAgICAgIDB9LAotICAgIHsiViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVl8xLCAyNywgRlhDTUFQX0NNYXA6Ok5vbmUsIG51bGxwdHIsIDAsCisgICAgeyI5MG1zLVJLU0otSCIsIGdfRlhDTUFQXzkwbXNfUktTSl9IXzIsIG51bGxwdHIsIDE3MSwgMCwgRlhDTUFQX0NNYXA6OlJhbmdlLAorICAgICAwfSwKKyAgICB7IjkwbXMtUktTSi1WIiwgZ19GWENNQVBfOTBtc19SS1NKX1ZfMiwgbnVsbHB0ciwgNzgsIDAsIEZYQ01BUF9DTWFwOjpSYW5nZSwKICAgICAgLTF9LAotICAgIHsiVW5pSklTLVVDUzItSCIsIEZYQ01BUF9DTWFwOjpTaW5nbGUsIGdfRlhDTUFQX1VuaUpJU19VQ1MyX0hfNCwgOTc3MiwKLSAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIG51bGxwdHIsIDAsIDB9LAotICAgIHsiVW5pSklTLVVDUzItViIsIEZYQ01BUF9DTWFwOjpTaW5nbGUsIGdfRlhDTUFQX1VuaUpJU19VQ1MyX1ZfNCwgMjUxLAotICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgbnVsbHB0ciwgMCwgLTF9LAotICAgIHsiVW5pSklTLVVDUzItSFctSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVW5pSklTX1VDUzJfSFdfSF80LCA0LAotICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgbnVsbHB0ciwgMCwgLTJ9LAotICAgIHsiVW5pSklTLVVDUzItSFctViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVW5pSklTX1VDUzJfSFdfVl80LCAxOTksCi0gICAgIEZYQ01BUF9DTWFwOjpOb25lLCBudWxscHRyLCAwLCAtMX0sCi0gICAgeyJVbmlKSVMtVVRGMTYtSCIsIEZYQ01BUF9DTWFwOjpTaW5nbGUsIGdfRlhDTUFQX1VuaUpJU19VQ1MyX0hfNCwgOTc3MiwKLSAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIG51bGxwdHIsIDAsIDB9LAotICAgIHsiVW5pSklTLVVURjE2LVYiLCBGWENNQVBfQ01hcDo6U2luZ2xlLCBnX0ZYQ01BUF9VbmlKSVNfVUNTMl9WXzQsIDI1MSwKLSAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIG51bGxwdHIsIDAsIC0xfSwKKyAgICB7IjkwbXNwLVJLU0otSCIsIGdfRlhDTUFQXzkwbXNwX1JLU0pfSF8yLCBudWxscHRyLCAxNzAsIDAsCisgICAgIEZYQ01BUF9DTWFwOjpSYW5nZSwgLTJ9LAorICAgIHsiOTBtc3AtUktTSi1WIiwgZ19GWENNQVBfOTBtc3BfUktTSl9WXzIsIG51bGxwdHIsIDc4LCAwLAorICAgICBGWENNQVBfQ01hcDo6UmFuZ2UsIC0xfSwKKyAgICB7IjkwcHYtUktTSi1IIiwgZ19GWENNQVBfOTBwdl9SS1NKX0hfMSwgbnVsbHB0ciwgMjYzLCAwLCBGWENNQVBfQ01hcDo6UmFuZ2UsCisgICAgIDB9LAorICAgIHsiQWRkLVJLU0otSCIsIGdfRlhDTUFQX0FkZF9SS1NKX0hfMSwgbnVsbHB0ciwgNjM1LCAwLCBGWENNQVBfQ01hcDo6UmFuZ2UsCisgICAgIDB9LAorICAgIHsiQWRkLVJLU0otViIsIGdfRlhDTUFQX0FkZF9SS1NKX1ZfMSwgbnVsbHB0ciwgNTcsIDAsIEZYQ01BUF9DTWFwOjpSYW5nZSwKKyAgICAgLTF9LAorICAgIHsiRVVDLUgiLCBnX0ZYQ01BUF9FVUNfSF8xLCBudWxscHRyLCAxMjAsIDAsIEZYQ01BUF9DTWFwOjpSYW5nZSwgMH0sCisgICAgeyJFVUMtViIsIGdfRlhDTUFQX0VVQ19WXzEsIG51bGxwdHIsIDI3LCAwLCBGWENNQVBfQ01hcDo6UmFuZ2UsIC0xfSwKKyAgICB7IkV4dC1SS1NKLUgiLCBnX0ZYQ01BUF9FeHRfUktTSl9IXzIsIG51bGxwdHIsIDY2NSwgMCwgRlhDTUFQX0NNYXA6OlJhbmdlLAorICAgICAtNH0sCisgICAgeyJFeHQtUktTSi1WIiwgZ19GWENNQVBfRXh0X1JLU0pfVl8yLCBudWxscHRyLCAzOSwgMCwgRlhDTUFQX0NNYXA6OlJhbmdlLAorICAgICAtMX0sCisgICAgeyJIIiwgZ19GWENNQVBfSF8xLCBudWxscHRyLCAxMTgsIDAsIEZYQ01BUF9DTWFwOjpSYW5nZSwgMH0sCisgICAgeyJWIiwgZ19GWENNQVBfVl8xLCBudWxscHRyLCAyNywgMCwgRlhDTUFQX0NNYXA6OlJhbmdlLCAtMX0sCisgICAgeyJVbmlKSVMtVUNTMi1IIiwgZ19GWENNQVBfVW5pSklTX1VDUzJfSF80LCBudWxscHRyLCA5NzcyLCAwLAorICAgICBGWENNQVBfQ01hcDo6U2luZ2xlLCAwfSwKKyAgICB7IlVuaUpJUy1VQ1MyLVYiLCBnX0ZYQ01BUF9VbmlKSVNfVUNTMl9WXzQsIG51bGxwdHIsIDI1MSwgMCwKKyAgICAgRlhDTUFQX0NNYXA6OlNpbmdsZSwgLTF9LAorICAgIHsiVW5pSklTLVVDUzItSFctSCIsIGdfRlhDTUFQX1VuaUpJU19VQ1MyX0hXX0hfNCwgbnVsbHB0ciwgNCwgMCwKKyAgICAgRlhDTUFQX0NNYXA6OlJhbmdlLCAtMn0sCisgICAgeyJVbmlKSVMtVUNTMi1IVy1WIiwgZ19GWENNQVBfVW5pSklTX1VDUzJfSFdfVl80LCBudWxscHRyLCAxOTksIDAsCisgICAgIEZYQ01BUF9DTWFwOjpSYW5nZSwgLTF9LAorICAgIHsiVW5pSklTLVVURjE2LUgiLCBnX0ZYQ01BUF9VbmlKSVNfVUNTMl9IXzQsIG51bGxwdHIsIDk3NzIsIDAsCisgICAgIEZYQ01BUF9DTWFwOjpTaW5nbGUsIDB9LAorICAgIHsiVW5pSklTLVVURjE2LVYiLCBnX0ZYQ01BUF9VbmlKSVNfVUNTMl9WXzQsIG51bGxwdHIsIDI1MSwgMCwKKyAgICAgRlhDTUFQX0NNYXA6OlNpbmdsZSwgLTF9LAogfTsKIAogdm9pZCBDUERGX01vZHVsZU1ncjo6TG9hZEVtYmVkZGVkSmFwYW4xQ01hcHMoKSB7CiAgIENQREZfRm9udEdsb2JhbHMqIHBGb250R2xvYmFscyA9CiAgICAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+R2V0Rm9udEdsb2JhbHMoKTsKLSAgcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkQ2hhcnNldHNbQ0lEU0VUX0pBUEFOMV0ubV9wTWFwTGlzdCA9Ci0gICAgICBnX0ZYQ01BUF9KYXBhbjFfY21hcHM7Ci0gIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZENoYXJzZXRzW0NJRFNFVF9KQVBBTjFdLm1fQ291bnQgPQotICAgICAgRlhfQXJyYXlTaXplKGdfRlhDTUFQX0phcGFuMV9jbWFwcyk7Ci0gIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbQ0lEU0VUX0pBUEFOMV0ubV9wTWFwID0KLSAgICAgIGdfRlhDTUFQX0phcGFuMUNJRDJVbmljb2RlXzQ7Ci0gIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbQ0lEU0VUX0pBUEFOMV0ubV9Db3VudCA9IDE1NDQ0OworICBwRm9udEdsb2JhbHMtPlNldEVtYmVkZGVkQ2hhcnNldChDSURTRVRfSkFQQU4xLCBnX0ZYQ01BUF9KYXBhbjFfY21hcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShnX0ZYQ01BUF9KYXBhbjFfY21hcHMpKTsKKyAgcEZvbnRHbG9iYWxzLT5TZXRFbWJlZGRlZFRvVW5pY29kZShDSURTRVRfSkFQQU4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfRlhDTUFQX0phcGFuMUNJRDJVbmljb2RlXzQsIDE1NDQ0KTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9jbWFwcy9Lb3JlYTEvY21hcHNfa29yZWExLmNwcCBiL2NvcmUvZnBkZmFwaS9jbWFwcy9Lb3JlYTEvY21hcHNfa29yZWExLmNwcAppbmRleCA1ZTg4YjNiLi5kYWVjODI1IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvY21hcHMvS29yZWExL2NtYXBzX2tvcmVhMS5jcHAKKysrIGIvY29yZS9mcGRmYXBpL2NtYXBzL0tvcmVhMS9jbWFwc19rb3JlYTEuY3BwCkBAIC04LDQzICs4LDM3IEBACiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvY21hcHMvY21hcF9pbnQuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvY3BkZl9tb2R1bGVtZ3IuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9mb250X2ludC5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udGdsb2JhbHMuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2Vtb2R1bGUuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCiAKIHN0YXRpYyBjb25zdCBGWENNQVBfQ01hcCBnX0ZYQ01BUF9Lb3JlYTFfY21hcHNbXSA9IHsKLSAgICB7IktTQy1FVUMtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfS1NDX0VVQ19IXzAsIDQ2NywKLSAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIG51bGxwdHIsIDAsIDB9LAotICAgIHsiS1NDLUVVQy1WIiwgRlhDTUFQX0NNYXA6OlJhbmdlLCBnX0ZYQ01BUF9LU0NfRVVDX1ZfMCwgMTYsCi0gICAgIEZYQ01BUF9DTWFwOjpOb25lLCBudWxscHRyLCAwLCAtMX0sCi0gICAgeyJLU0Ntcy1VSEMtSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfS1NDbXNfVUhDX0hfMSwgNjc1LAotICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgbnVsbHB0ciwgMCwgLTJ9LAotICAgIHsiS1NDbXMtVUhDLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0tTQ21zX1VIQ19WXzEsIDE2LAotICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgbnVsbHB0ciwgMCwgLTF9LAotICAgIHsiS1NDbXMtVUhDLUhXLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0tTQ21zX1VIQ19IV19IXzEsIDY3NSwKLSAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIG51bGxwdHIsIDAsIDB9LAotICAgIHsiS1NDbXMtVUhDLUhXLVYiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0tTQ21zX1VIQ19IV19WXzEsIDE2LAotICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgbnVsbHB0ciwgMCwgLTF9LAotICAgIHsiS1NDcGMtRVVDLUgiLCBGWENNQVBfQ01hcDo6UmFuZ2UsIGdfRlhDTUFQX0tTQ3BjX0VVQ19IXzAsIDUwOSwKLSAgICAgRlhDTUFQX0NNYXA6Ok5vbmUsIG51bGxwdHIsIDAsIC02fSwKLSAgICB7IlVuaUtTLVVDUzItSCIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVW5pS1NfVUNTMl9IXzEsIDgzOTQsCi0gICAgIEZYQ01BUF9DTWFwOjpOb25lLCBudWxscHRyLCAwLCAwfSwKLSAgICB7IlVuaUtTLVVDUzItViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVW5pS1NfVUNTMl9WXzEsIDE4LAotICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgbnVsbHB0ciwgMCwgLTF9LAotICAgIHsiVW5pS1MtVVRGMTYtSCIsIEZYQ01BUF9DTWFwOjpTaW5nbGUsIGdfRlhDTUFQX1VuaUtTX1VURjE2X0hfMCwgMTU4LAotICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgbnVsbHB0ciwgMCwgLTJ9LAotICAgIHsiVW5pS1MtVVRGMTYtViIsIEZYQ01BUF9DTWFwOjpSYW5nZSwgZ19GWENNQVBfVW5pS1NfVUNTMl9WXzEsIDE4LAotICAgICBGWENNQVBfQ01hcDo6Tm9uZSwgbnVsbHB0ciwgMCwgLTF9LAorICAgIHsiS1NDLUVVQy1IIiwgZ19GWENNQVBfS1NDX0VVQ19IXzAsIG51bGxwdHIsIDQ2NywgMCwgRlhDTUFQX0NNYXA6OlJhbmdlLCAwfSwKKyAgICB7IktTQy1FVUMtViIsIGdfRlhDTUFQX0tTQ19FVUNfVl8wLCBudWxscHRyLCAxNiwgMCwgRlhDTUFQX0NNYXA6OlJhbmdlLCAtMX0sCisgICAgeyJLU0Ntcy1VSEMtSCIsIGdfRlhDTUFQX0tTQ21zX1VIQ19IXzEsIG51bGxwdHIsIDY3NSwgMCwgRlhDTUFQX0NNYXA6OlJhbmdlLAorICAgICAtMn0sCisgICAgeyJLU0Ntcy1VSEMtViIsIGdfRlhDTUFQX0tTQ21zX1VIQ19WXzEsIG51bGxwdHIsIDE2LCAwLCBGWENNQVBfQ01hcDo6UmFuZ2UsCisgICAgIC0xfSwKKyAgICB7IktTQ21zLVVIQy1IVy1IIiwgZ19GWENNQVBfS1NDbXNfVUhDX0hXX0hfMSwgbnVsbHB0ciwgNjc1LCAwLAorICAgICBGWENNQVBfQ01hcDo6UmFuZ2UsIDB9LAorICAgIHsiS1NDbXMtVUhDLUhXLVYiLCBnX0ZYQ01BUF9LU0Ntc19VSENfSFdfVl8xLCBudWxscHRyLCAxNiwgMCwKKyAgICAgRlhDTUFQX0NNYXA6OlJhbmdlLCAtMX0sCisgICAgeyJLU0NwYy1FVUMtSCIsIGdfRlhDTUFQX0tTQ3BjX0VVQ19IXzAsIG51bGxwdHIsIDUwOSwgMCwgRlhDTUFQX0NNYXA6OlJhbmdlLAorICAgICAtNn0sCisgICAgeyJVbmlLUy1VQ1MyLUgiLCBnX0ZYQ01BUF9VbmlLU19VQ1MyX0hfMSwgbnVsbHB0ciwgODM5NCwgMCwKKyAgICAgRlhDTUFQX0NNYXA6OlJhbmdlLCAwfSwKKyAgICB7IlVuaUtTLVVDUzItViIsIGdfRlhDTUFQX1VuaUtTX1VDUzJfVl8xLCBudWxscHRyLCAxOCwgMCwKKyAgICAgRlhDTUFQX0NNYXA6OlJhbmdlLCAtMX0sCisgICAgeyJVbmlLUy1VVEYxNi1IIiwgZ19GWENNQVBfVW5pS1NfVVRGMTZfSF8wLCBudWxscHRyLCAxNTgsIDAsCisgICAgIEZYQ01BUF9DTWFwOjpTaW5nbGUsIC0yfSwKKyAgICB7IlVuaUtTLVVURjE2LVYiLCBnX0ZYQ01BUF9VbmlLU19VQ1MyX1ZfMSwgbnVsbHB0ciwgMTgsIDAsCisgICAgIEZYQ01BUF9DTWFwOjpSYW5nZSwgLTF9LAogfTsKIAogdm9pZCBDUERGX01vZHVsZU1ncjo6TG9hZEVtYmVkZGVkS29yZWExQ01hcHMoKSB7CiAgIENQREZfRm9udEdsb2JhbHMqIHBGb250R2xvYmFscyA9CiAgICAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+R2V0Rm9udEdsb2JhbHMoKTsKLSAgcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkQ2hhcnNldHNbQ0lEU0VUX0tPUkVBMV0ubV9wTWFwTGlzdCA9Ci0gICAgICBnX0ZYQ01BUF9Lb3JlYTFfY21hcHM7Ci0gIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZENoYXJzZXRzW0NJRFNFVF9LT1JFQTFdLm1fQ291bnQgPQotICAgICAgRlhfQXJyYXlTaXplKGdfRlhDTUFQX0tvcmVhMV9jbWFwcyk7Ci0gIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbQ0lEU0VUX0tPUkVBMV0ubV9wTWFwID0KLSAgICAgIGdfRlhDTUFQX0tvcmVhMUNJRDJVbmljb2RlXzI7Ci0gIHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbQ0lEU0VUX0tPUkVBMV0ubV9Db3VudCA9IDE4MzUyOworICBwRm9udEdsb2JhbHMtPlNldEVtYmVkZGVkQ2hhcnNldChDSURTRVRfS09SRUExLCBnX0ZYQ01BUF9Lb3JlYTFfY21hcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShnX0ZYQ01BUF9Lb3JlYTFfY21hcHMpKTsKKyAgcEZvbnRHbG9iYWxzLT5TZXRFbWJlZGRlZFRvVW5pY29kZShDSURTRVRfS09SRUExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfRlhDTUFQX0tvcmVhMUNJRDJVbmljb2RlXzIsIDE4MzUyKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9jbWFwcy9jbWFwX2ludC5oIGIvY29yZS9mcGRmYXBpL2NtYXBzL2NtYXBfaW50LmgKaW5kZXggZTg0ZGMxMS4uMjdmOTYxNyAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL2NtYXBzL2NtYXBfaW50LmgKKysrIGIvY29yZS9mcGRmYXBpL2NtYXBzL2NtYXBfaW50LmgKQEAgLTEwLDIzICsxMCwyOCBAQAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKIAotc3RydWN0IEZYQ01BUF9DTWFwIHsKLSAgZW51bSBNYXBUeXBlIHsgTm9uZSwgU2luZ2xlLCBSYW5nZSwgUmV2ZXJzZSB9OwotCi0gIGNvbnN0IGNoYXIqIG1fTmFtZTsKLSAgTWFwVHlwZSBtX1dvcmRNYXBUeXBlOwotICBjb25zdCB1aW50MTZfdCogbV9wV29yZE1hcDsKLSAgaW50IG1fV29yZENvdW50OwotICBNYXBUeXBlIG1fRFdvcmRNYXBUeXBlOwotICBjb25zdCB1aW50MTZfdCogbV9wRFdvcmRNYXA7Ci0gIGludCBtX0RXb3JkQ291bnQ7Ci0gIGludCBtX1VzZU9mZnNldDsKK3N0cnVjdCBGWENNQVBfRFdvcmRDSURNYXAgeworICB1aW50MTZfdCBtX0hpV29yZDsKKyAgdWludDE2X3QgbV9Mb1dvcmRMb3c7CisgIHVpbnQxNl90IG1fTG9Xb3JkSGlnaDsKKyAgdWludDE2X3QgbV9DSUQ7CiB9OwogCi12b2lkIEZQREZBUElfRmluZEVtYmVkZGVkQ01hcChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYQ01BUF9DTWFwKiYgcE1hcCk7CitzdHJ1Y3QgRlhDTUFQX0NNYXAgeworICBlbnVtIE1hcFR5cGUgOiB1aW50OF90IHsgU2luZ2xlLCBSYW5nZSB9OworCisgIGNvbnN0IGNoYXIqIG1fTmFtZTsKKyAgY29uc3QgdWludDE2X3QqIG1fcFdvcmRNYXA7CisgIGNvbnN0IEZYQ01BUF9EV29yZENJRE1hcCogbV9wRFdvcmRNYXA7CisgIHVpbnQxNl90IG1fV29yZENvdW50OworICB1aW50MTZfdCBtX0RXb3JkQ291bnQ7CisgIE1hcFR5cGUgbV9Xb3JkTWFwVHlwZTsKKyAgaW50OF90IG1fVXNlT2Zmc2V0OworfTsKKworY29uc3QgRlhDTUFQX0NNYXAqIEZQREZBUElfRmluZEVtYmVkZGVkQ01hcChjb25zdCBCeXRlU3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGluZyk7CiB1aW50MTZfdCBGUERGQVBJX0NJREZyb21DaGFyQ29kZShjb25zdCBGWENNQVBfQ01hcCogcE1hcCwgdWludDMyX3QgY2hhcmNvZGUpOwogdWludDMyX3QgRlBERkFQSV9DaGFyQ29kZUZyb21DSUQoY29uc3QgRlhDTUFQX0NNYXAqIHBNYXAsIHVpbnQxNl90IGNpZCk7CiAKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9jbWFwcy9mcGRmX2NtYXBzLmNwcCBiL2NvcmUvZnBkZmFwaS9jbWFwcy9mcGRmX2NtYXBzLmNwcAppbmRleCBjYTAxZDQzLi5iYmE4ZDIxIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvY21hcHMvZnBkZl9jbWFwcy5jcHAKKysrIGIvY29yZS9mcGRmYXBpL2NtYXBzL2ZwZGZfY21hcHMuY3BwCkBAIC02LDExNiArNiw5NSBAQAogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2NtYXBzL2NtYXBfaW50LmgiCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvY3BkZl9tb2R1bGVtZ3IuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9mb250X2ludC5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udGdsb2JhbHMuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2Vtb2R1bGUuaCIKIAotZXh0ZXJuICJDIiB7CituYW1lc3BhY2UgewogCi1zdGF0aWMgaW50IGNvbXBhcmVXb3JkKGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMikgewotICByZXR1cm4gKCoodWludDE2X3QqKXAxKSAtICgqKHVpbnQxNl90KilwMik7Citjb25zdCBGWENNQVBfQ01hcCogRmluZE5leHRDTWFwKGNvbnN0IEZYQ01BUF9DTWFwKiBwTWFwKSB7CisgIHJldHVybiBwTWFwLT5tX1VzZU9mZnNldCA/IHBNYXAgKyBwTWFwLT5tX1VzZU9mZnNldCA6IG51bGxwdHI7CiB9CiAKLXN0YXRpYyBpbnQgY29tcGFyZVdvcmRSYW5nZShjb25zdCB2b2lkKiBrZXksIGNvbnN0IHZvaWQqIGVsZW1lbnQpIHsKLSAgaWYgKCoodWludDE2X3QqKWtleSA8ICoodWludDE2X3QqKWVsZW1lbnQpCi0gICAgcmV0dXJuIC0xOwotICBpZiAoKih1aW50MTZfdCopa2V5ID4gKCh1aW50MTZfdCopZWxlbWVudClbMV0pCi0gICAgcmV0dXJuIDE7Ci0gIHJldHVybiAwOwotfQorfSAgLy8gbmFtZXNwYWNlCiAKLXN0YXRpYyBpbnQgY29tcGFyZURXb3JkUmFuZ2UoY29uc3Qgdm9pZCogcDEsIGNvbnN0IHZvaWQqIHAyKSB7Ci0gIHVpbnQzMl90IGtleSA9ICoodWludDMyX3QqKXAxOwotICB1aW50MTZfdCBoaXdvcmQgPSAodWludDE2X3QpKGtleSA+PiAxNik7Ci0gIHVpbnQxNl90KiBlbGVtZW50ID0gKHVpbnQxNl90KilwMjsKLSAgaWYgKGhpd29yZCA8IGVsZW1lbnRbMF0pCi0gICAgcmV0dXJuIC0xOwotICBpZiAoaGl3b3JkID4gZWxlbWVudFswXSkKLSAgICByZXR1cm4gMTsKLQotICB1aW50MTZfdCBsb3dvcmQgPSAodWludDE2X3Qpa2V5OwotICBpZiAobG93b3JkIDwgZWxlbWVudFsxXSkKLSAgICByZXR1cm4gLTE7Ci0gIGlmIChsb3dvcmQgPiBlbGVtZW50WzJdKQotICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjb21wYXJlRFdvcmRTaW5nbGUoY29uc3Qgdm9pZCogcDEsIGNvbnN0IHZvaWQqIHAyKSB7Ci0gIHVpbnQzMl90IGtleSA9ICoodWludDMyX3QqKXAxOwotICB1aW50MzJfdCB2YWx1ZSA9ICgoKih1aW50MTZfdCopcDIpIDw8IDE2KSB8ICgodWludDE2X3QqKXAyKVsxXTsKLSAgaWYgKGtleSA8IHZhbHVlKQotICAgIHJldHVybiAtMTsKLSAgaWYgKGtleSA+IHZhbHVlKQotICAgIHJldHVybiAxOwotICByZXR1cm4gMDsKLX0KLQotfTsgIC8vIGV4dGVybiAiQyIKLQotdm9pZCBGUERGQVBJX0ZpbmRFbWJlZGRlZENNYXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYQ01BUF9DTWFwKiYgcE1hcCkgewotICBwTWFwID0gbnVsbHB0cjsKK2NvbnN0IEZYQ01BUF9DTWFwKiBGUERGQVBJX0ZpbmRFbWJlZGRlZENNYXAoY29uc3QgQnl0ZVN0cmluZyYgYnNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGluZykgewogICBDUERGX0ZvbnRHbG9iYWxzKiBwRm9udEdsb2JhbHMgPQogICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCk7Ci0gIGNvbnN0IEZYQ01BUF9DTWFwKiBwQ01hcHMgPQotICAgICAgcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkQ2hhcnNldHNbY2hhcnNldF0ubV9wTWFwTGlzdDsKLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBGb250R2xvYmFscy0+bV9FbWJlZGRlZENoYXJzZXRzW2NoYXJzZXRdLm1fQ291bnQ7Ci0gICAgICAgaSsrKSB7Ci0gICAgaWYgKGJzTmFtZSA9PSBwQ01hcHNbaV0ubV9OYW1lKSB7Ci0gICAgICBwTWFwID0gJnBDTWFwc1tpXTsKLSAgICAgIGJyZWFrOwotICAgIH0KKworICBjb25zdCBGWENNQVBfQ01hcCogcENNYXBzOworICB1aW50MzJfdCBjb3VudDsKKyAgc3RkOjp0aWUoY291bnQsIHBDTWFwcykgPSBwRm9udEdsb2JhbHMtPkdldEVtYmVkZGVkQ2hhcnNldChjaGFyc2V0KTsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBpZiAoYnNOYW1lID09IHBDTWFwc1tpXS5tX05hbWUpCisgICAgICByZXR1cm4gJnBDTWFwc1tpXTsKICAgfQorICByZXR1cm4gbnVsbHB0cjsKIH0KIAogdWludDE2X3QgRlBERkFQSV9DSURGcm9tQ2hhckNvZGUoY29uc3QgRlhDTUFQX0NNYXAqIHBNYXAsIHVpbnQzMl90IGNoYXJjb2RlKSB7CisgIEFTU0VSVChwTWFwKTsKKyAgY29uc3QgdWludDE2X3QgbG93b3JkID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGNoYXJjb2RlKTsKICAgaWYgKGNoYXJjb2RlID4+IDE2KSB7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgIGlmIChwTWFwLT5tX0RXb3JkTWFwVHlwZSA9PSBGWENNQVBfQ01hcDo6UmFuZ2UpIHsKLSAgICAgICAgdWludDE2X3QqIGZvdW5kID0gc3RhdGljX2Nhc3Q8dWludDE2X3QqPigKLSAgICAgICAgICAgIEZYU1lTX2JzZWFyY2goJmNoYXJjb2RlLCBwTWFwLT5tX3BEV29yZE1hcCwgcE1hcC0+bV9EV29yZENvdW50LCA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlRFdvcmRSYW5nZSkpOwotICAgICAgICBpZiAoZm91bmQpCi0gICAgICAgICAgcmV0dXJuIGZvdW5kWzNdICsgKHVpbnQxNl90KWNoYXJjb2RlIC0gZm91bmRbMV07Ci0KLSAgICAgIH0gZWxzZSBpZiAocE1hcC0+bV9EV29yZE1hcFR5cGUgPT0gRlhDTUFQX0NNYXA6OlNpbmdsZSkgewotICAgICAgICB1aW50MTZfdCogZm91bmQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdCo+KAotICAgICAgICAgICAgRlhTWVNfYnNlYXJjaCgmY2hhcmNvZGUsIHBNYXAtPm1fcERXb3JkTWFwLCBwTWFwLT5tX0RXb3JkQ291bnQsIDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVEV29yZFNpbmdsZSkpOwotICAgICAgICBpZiAoZm91bmQpCi0gICAgICAgICAgcmV0dXJuIGZvdW5kWzJdOworICAgIHdoaWxlIChwTWFwKSB7CisgICAgICBpZiAocE1hcC0+bV9wRFdvcmRNYXApIHsKKyAgICAgICAgY29uc3QgRlhDTUFQX0RXb3JkQ0lETWFwKiBiZWdpbiA9IHBNYXAtPm1fcERXb3JkTWFwOworICAgICAgICBjb25zdCBhdXRvKiBlbmQgPSBiZWdpbiArIHBNYXAtPm1fRFdvcmRDb3VudDsKKyAgICAgICAgY29uc3QgYXV0byogZm91bmQgPSBzdGQ6Omxvd2VyX2JvdW5kKAorICAgICAgICAgICAgYmVnaW4sIGVuZCwgY2hhcmNvZGUsCisgICAgICAgICAgICBbXShjb25zdCBGWENNQVBfRFdvcmRDSURNYXAmIGVsZW1lbnQsIHVpbnQzMl90IGNoYXJjb2RlKSB7CisgICAgICAgICAgICAgIHVpbnQxNl90IGhpd29yZCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihjaGFyY29kZSA+PiAxNik7CisgICAgICAgICAgICAgIGlmIChlbGVtZW50Lm1fSGlXb3JkICE9IGhpd29yZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5tX0hpV29yZCA8IGhpd29yZDsKKyAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQubV9Mb1dvcmRIaWdoIDwgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGNoYXJjb2RlKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoZm91bmQgIT0gZW5kICYmIGxvd29yZCA+PSBmb3VuZC0+bV9Mb1dvcmRMb3cgJiYKKyAgICAgICAgICAgIGxvd29yZCA8PSBmb3VuZC0+bV9Mb1dvcmRIaWdoKSB7CisgICAgICAgICAgcmV0dXJuIGZvdW5kLT5tX0NJRCArIGxvd29yZCAtIGZvdW5kLT5tX0xvV29yZExvdzsKKyAgICAgICAgfQogICAgICAgfQotICAgICAgaWYgKHBNYXAtPm1fVXNlT2Zmc2V0ID09IDApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgICBwTWFwID0gcE1hcCArIHBNYXAtPm1fVXNlT2Zmc2V0OworICAgICAgcE1hcCA9IEZpbmROZXh0Q01hcChwTWFwKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CiAgIH0KIAotICB1aW50MTZfdCBjb2RlID0gKHVpbnQxNl90KWNoYXJjb2RlOwotICB3aGlsZSAoMSkgeworICB3aGlsZSAocE1hcCkgewogICAgIGlmICghcE1hcC0+bV9wV29yZE1hcCkKICAgICAgIHJldHVybiAwOwogICAgIGlmIChwTWFwLT5tX1dvcmRNYXBUeXBlID09IEZYQ01BUF9DTWFwOjpTaW5nbGUpIHsKLSAgICAgIHVpbnQxNl90KiBmb3VuZCA9IHN0YXRpY19jYXN0PHVpbnQxNl90Kj4oRlhTWVNfYnNlYXJjaCgKLSAgICAgICAgICAmY29kZSwgcE1hcC0+bV9wV29yZE1hcCwgcE1hcC0+bV9Xb3JkQ291bnQsIDQsIGNvbXBhcmVXb3JkKSk7Ci0gICAgICBpZiAoZm91bmQpCi0gICAgICAgIHJldHVybiBmb3VuZFsxXTsKLQotICAgIH0gZWxzZSBpZiAocE1hcC0+bV9Xb3JkTWFwVHlwZSA9PSBGWENNQVBfQ01hcDo6UmFuZ2UpIHsKLSAgICAgIHVpbnQxNl90KiBmb3VuZCA9IHN0YXRpY19jYXN0PHVpbnQxNl90Kj4oRlhTWVNfYnNlYXJjaCgKLSAgICAgICAgICAmY29kZSwgcE1hcC0+bV9wV29yZE1hcCwgcE1hcC0+bV9Xb3JkQ291bnQsIDYsIGNvbXBhcmVXb3JkUmFuZ2UpKTsKLSAgICAgIGlmIChmb3VuZCkKLSAgICAgICAgcmV0dXJuIGZvdW5kWzJdICsgY29kZSAtIGZvdW5kWzBdOworICAgICAgc3RydWN0IFNpbmdsZUNtYXAgeworICAgICAgICB1aW50MTZfdCBjb2RlOworICAgICAgICB1aW50MTZfdCBjaWQ7CisgICAgICB9OworICAgICAgY29uc3QgYXV0byogYmVnaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IFNpbmdsZUNtYXAqPihwTWFwLT5tX3BXb3JkTWFwKTsKKyAgICAgIGNvbnN0IGF1dG8qIGVuZCA9IGJlZ2luICsgcE1hcC0+bV9Xb3JkQ291bnQ7CisgICAgICBjb25zdCBhdXRvKiBmb3VuZCA9IHN0ZDo6bG93ZXJfYm91bmQoCisgICAgICAgICAgYmVnaW4sIGVuZCwgbG93b3JkLCBbXShjb25zdCBTaW5nbGVDbWFwJiBlbGVtZW50LCB1aW50MTZfdCBjb2RlKSB7CisgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5jb2RlIDwgY29kZTsKKyAgICAgICAgICB9KTsKKyAgICAgIGlmIChmb3VuZCAhPSBlbmQgJiYgZm91bmQtPmNvZGUgPT0gbG93b3JkKQorICAgICAgICByZXR1cm4gZm91bmQtPmNpZDsKKyAgICB9IGVsc2UgeworICAgICAgQVNTRVJUKHBNYXAtPm1fV29yZE1hcFR5cGUgPT0gRlhDTUFQX0NNYXA6OlJhbmdlKTsKKyAgICAgIHN0cnVjdCBSYW5nZUNtYXAgeworICAgICAgICB1aW50MTZfdCBsb3c7CisgICAgICAgIHVpbnQxNl90IGhpZ2g7CisgICAgICAgIHVpbnQxNl90IGNpZDsKKyAgICAgIH07CisgICAgICBjb25zdCBhdXRvKiBiZWdpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUmFuZ2VDbWFwKj4ocE1hcC0+bV9wV29yZE1hcCk7CisgICAgICBjb25zdCBhdXRvKiBlbmQgPSBiZWdpbiArIHBNYXAtPm1fV29yZENvdW50OworICAgICAgY29uc3QgYXV0byogZm91bmQgPSBzdGQ6Omxvd2VyX2JvdW5kKAorICAgICAgICAgIGJlZ2luLCBlbmQsIGxvd29yZCwgW10oY29uc3QgUmFuZ2VDbWFwJiBlbGVtZW50LCB1aW50MTZfdCBjb2RlKSB7CisgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oaWdoIDwgY29kZTsKKyAgICAgICAgICB9KTsKKyAgICAgIGlmIChmb3VuZCAhPSBlbmQgJiYgbG93b3JkID49IGZvdW5kLT5sb3cgJiYgbG93b3JkIDw9IGZvdW5kLT5oaWdoKQorICAgICAgICByZXR1cm4gZm91bmQtPmNpZCArIGxvd29yZCAtIGZvdW5kLT5sb3c7CiAgICAgfQotICAgIGlmIChwTWFwLT5tX1VzZU9mZnNldCA9PSAwKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBwTWFwID0gcE1hcCArIHBNYXAtPm1fVXNlT2Zmc2V0OworICAgIHBNYXAgPSBGaW5kTmV4dENNYXAocE1hcCk7CiAgIH0KICAgcmV0dXJuIDA7CiB9CkBAIC0xMjYsNyArMTA1LDggQEAKICAgLy8gdGhlIGZpcnN0IGFsd2F5cyByZXR1cm5zLiBJbnZlc3RpZ2F0ZSBhbmQgZGV0ZXJtaW5lIGhvdyB0aGlzIHNob3VsZAogICAvLyByZWFsbHkgYmUgd29ya2luZy4gKGh0dHBzOi8vY29kZXJldmlldy5jaHJvbWl1bS5vcmcvMjIzNTc0MzAwMyByZW1vdmVkIHRoZQogICAvLyBzZWNvbmQgd2hpbGUgbG9vcC4pCi0gIHdoaWxlICgxKSB7CisgIEFTU0VSVChwTWFwKTsKKyAgd2hpbGUgKHBNYXApIHsKICAgICBpZiAocE1hcC0+bV9Xb3JkTWFwVHlwZSA9PSBGWENNQVBfQ01hcDo6U2luZ2xlKSB7CiAgICAgICBjb25zdCB1aW50MTZfdCogcEN1ciA9IHBNYXAtPm1fcFdvcmRNYXA7CiAgICAgICBjb25zdCB1aW50MTZfdCogcEVuZCA9IHBNYXAtPm1fcFdvcmRNYXAgKyBwTWFwLT5tX1dvcmRDb3VudCAqIDI7CkBAIC0xMzYsNyArMTE2LDggQEAKIAogICAgICAgICBwQ3VyICs9IDI7CiAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChwTWFwLT5tX1dvcmRNYXBUeXBlID09IEZYQ01BUF9DTWFwOjpSYW5nZSkgeworICAgIH0gZWxzZSB7CisgICAgICBBU1NFUlQocE1hcC0+bV9Xb3JkTWFwVHlwZSA9PSBGWENNQVBfQ01hcDo6UmFuZ2UpOwogICAgICAgY29uc3QgdWludDE2X3QqIHBDdXIgPSBwTWFwLT5tX3BXb3JkTWFwOwogICAgICAgY29uc3QgdWludDE2X3QqIHBFbmQgPSBwTWFwLT5tX3BXb3JkTWFwICsgcE1hcC0+bV9Xb3JkQ291bnQgKiAzOwogICAgICAgd2hpbGUgKHBDdXIgPCBwRW5kKSB7CkBAIC0xNDYsOSArMTI3LDcgQEAKICAgICAgICAgcEN1ciArPSAzOwogICAgICAgfQogICAgIH0KLSAgICBpZiAocE1hcC0+bV9Vc2VPZmZzZXQgPT0gMCkKLSAgICAgIHJldHVybiAwOwotCi0gICAgcE1hcCA9IHBNYXAgKyBwTWFwLT5tX1VzZU9mZnNldDsKKyAgICBwTWFwID0gRmluZE5leHRDTWFwKHBNYXApOwogICB9CisgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2NwZGZfbW9kdWxlbWdyLmNwcCBiL2NvcmUvZnBkZmFwaS9jcGRmX21vZHVsZW1nci5jcHAKaW5kZXggYWMyOGIzNi4uNjc4OTk3YSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL2NwZGZfbW9kdWxlbWdyLmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvY3BkZl9tb2R1bGVtZ3IuY3BwCkBAIC0xMCw2ICsxMCwyMiBAQAogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9meF9jb2RlYy5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAorI2lmZGVmIFBERl9FTkFCTEVfWEZBX0JNUAorI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfYm1wbW9kdWxlLmgiCisjZW5kaWYKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBX0dJRgorI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfZ2lmbW9kdWxlLmgiCisjZW5kaWYKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBX1BORworI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfcG5nbW9kdWxlLmgiCisjZW5kaWYKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBX1RJRkYKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX3RpZmZtb2R1bGUuaCIKKyNlbmRpZgorCiBuYW1lc3BhY2UgewogCiBDUERGX01vZHVsZU1nciogZ19wRGVmYXVsdE1nciA9IG51bGxwdHI7CkBAIC0yOSwzNCArNDUsNzAgQEAKICAgZ19wRGVmYXVsdE1nciA9IG51bGxwdHI7CiB9CiAKLUNQREZfTW9kdWxlTWdyOjpDUERGX01vZHVsZU1ncigpIDogbV9wQ29kZWNNb2R1bGUobnVsbHB0cikge30KK0NQREZfTW9kdWxlTWdyOjpDUERGX01vZHVsZU1ncigpIHt9CiAKIENQREZfTW9kdWxlTWdyOjp+Q1BERl9Nb2R1bGVNZ3IoKSB7fQogCit2b2lkIENQREZfTW9kdWxlTWdyOjpJbml0KCkgeworICBJbml0Q29kZWNNb2R1bGUoKTsKKyAgSW5pdFBhZ2VNb2R1bGUoKTsKKyAgTG9hZEVtYmVkZGVkTWFwcygpOworICBMb2FkQ29kZWNNb2R1bGVzKCk7Cit9CisKK3ZvaWQgQ1BERl9Nb2R1bGVNZ3I6OkxvYWRFbWJlZGRlZE1hcHMoKSB7CisgIExvYWRFbWJlZGRlZEdCMUNNYXBzKCk7CisgIExvYWRFbWJlZGRlZEphcGFuMUNNYXBzKCk7CisgIExvYWRFbWJlZGRlZENOUzFDTWFwcygpOworICBMb2FkRW1iZWRkZWRLb3JlYTFDTWFwcygpOworfQorCit2b2lkIENQREZfTW9kdWxlTWdyOjpMb2FkQ29kZWNNb2R1bGVzKCkgeworI2lmZGVmIFBERl9FTkFCTEVfWEZBX0JNUAorICBtX3BDb2RlY01vZHVsZS0+U2V0Qm1wTW9kdWxlKHBkZml1bTo6TWFrZVVuaXF1ZTxDQ29kZWNfQm1wTW9kdWxlPigpKTsKKyNlbmRpZgorCisjaWZkZWYgUERGX0VOQUJMRV9YRkFfR0lGCisgIG1fcENvZGVjTW9kdWxlLT5TZXRHaWZNb2R1bGUocGRmaXVtOjpNYWtlVW5pcXVlPENDb2RlY19HaWZNb2R1bGU+KCkpOworI2VuZGlmCisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQV9QTkcKKyAgbV9wQ29kZWNNb2R1bGUtPlNldFBuZ01vZHVsZShwZGZpdW06Ok1ha2VVbmlxdWU8Q0NvZGVjX1BuZ01vZHVsZT4oKSk7CisjZW5kaWYKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBX1RJRkYKKyAgbV9wQ29kZWNNb2R1bGUtPlNldFRpZmZNb2R1bGUocGRmaXVtOjpNYWtlVW5pcXVlPENDb2RlY19UaWZmTW9kdWxlPigpKTsKKyNlbmRpZgorfQorCit2b2lkIENQREZfTW9kdWxlTWdyOjpJbml0Q29kZWNNb2R1bGUoKSB7CisgIG1fcENvZGVjTW9kdWxlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENDb2RlY19Nb2R1bGVNZ3I+KCk7Cit9CisKIHZvaWQgQ1BERl9Nb2R1bGVNZ3I6OkluaXRQYWdlTW9kdWxlKCkgewogICBtX3BQYWdlTW9kdWxlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfUGFnZU1vZHVsZT4oKTsKIH0KIAogQ0NvZGVjX0ZheE1vZHVsZSogQ1BERl9Nb2R1bGVNZ3I6OkdldEZheE1vZHVsZSgpIHsKLSAgcmV0dXJuIG1fcENvZGVjTW9kdWxlID8gbV9wQ29kZWNNb2R1bGUtPkdldEZheE1vZHVsZSgpIDogbnVsbHB0cjsKKyAgcmV0dXJuIG1fcENvZGVjTW9kdWxlLT5HZXRGYXhNb2R1bGUoKTsKIH0KIAogQ0NvZGVjX0pwZWdNb2R1bGUqIENQREZfTW9kdWxlTWdyOjpHZXRKcGVnTW9kdWxlKCkgewotICByZXR1cm4gbV9wQ29kZWNNb2R1bGUgPyBtX3BDb2RlY01vZHVsZS0+R2V0SnBlZ01vZHVsZSgpIDogbnVsbHB0cjsKKyAgcmV0dXJuIG1fcENvZGVjTW9kdWxlLT5HZXRKcGVnTW9kdWxlKCk7CiB9CiAKIENDb2RlY19KcHhNb2R1bGUqIENQREZfTW9kdWxlTWdyOjpHZXRKcHhNb2R1bGUoKSB7Ci0gIHJldHVybiBtX3BDb2RlY01vZHVsZSA/IG1fcENvZGVjTW9kdWxlLT5HZXRKcHhNb2R1bGUoKSA6IG51bGxwdHI7CisgIHJldHVybiBtX3BDb2RlY01vZHVsZS0+R2V0SnB4TW9kdWxlKCk7CiB9CiAKIENDb2RlY19KYmlnMk1vZHVsZSogQ1BERl9Nb2R1bGVNZ3I6OkdldEpiaWcyTW9kdWxlKCkgewotICByZXR1cm4gbV9wQ29kZWNNb2R1bGUgPyBtX3BDb2RlY01vZHVsZS0+R2V0SmJpZzJNb2R1bGUoKSA6IG51bGxwdHI7CisgIHJldHVybiBtX3BDb2RlY01vZHVsZS0+R2V0SmJpZzJNb2R1bGUoKTsKIH0KIAogQ0NvZGVjX0ljY01vZHVsZSogQ1BERl9Nb2R1bGVNZ3I6OkdldEljY01vZHVsZSgpIHsKLSAgcmV0dXJuIG1fcENvZGVjTW9kdWxlID8gbV9wQ29kZWNNb2R1bGUtPkdldEljY01vZHVsZSgpIDogbnVsbHB0cjsKKyAgcmV0dXJuIG1fcENvZGVjTW9kdWxlLT5HZXRJY2NNb2R1bGUoKTsKIH0KIAogQ0NvZGVjX0ZsYXRlTW9kdWxlKiBDUERGX01vZHVsZU1ncjo6R2V0RmxhdGVNb2R1bGUoKSB7Ci0gIHJldHVybiBtX3BDb2RlY01vZHVsZSA/IG1fcENvZGVjTW9kdWxlLT5HZXRGbGF0ZU1vZHVsZSgpIDogbnVsbHB0cjsKKyAgcmV0dXJuIG1fcENvZGVjTW9kdWxlLT5HZXRGbGF0ZU1vZHVsZSgpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2NwZGZfbW9kdWxlbWdyLmggYi9jb3JlL2ZwZGZhcGkvY3BkZl9tb2R1bGVtZ3IuaAppbmRleCBkMzFmZmQ1Li42YjgzYmM3IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvY3BkZl9tb2R1bGVtZ3IuaAorKysgYi9jb3JlL2ZwZGZhcGkvY3BkZl9tb2R1bGVtZ3IuaApAQCAtMTAsOCArMTAsNiBAQAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx1dGlsaXR5PgogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgotCiBjbGFzcyBDQ29kZWNfRmF4TW9kdWxlOwogY2xhc3MgQ0NvZGVjX0ZsYXRlTW9kdWxlOwogY2xhc3MgQ0NvZGVjX0ljY01vZHVsZTsKQEAgLTM4LDExICszNiw3IEBACiAgIHN0YXRpYyB2b2lkIERlc3Ryb3koKTsKICAgc3RhdGljIGNvbnN0IGludCBrRmlsZUJ1ZlNpemUgPSA1MTI7CiAKLSAgdm9pZCBTZXRDb2RlY01vZHVsZShDQ29kZWNfTW9kdWxlTWdyKiBwTW9kdWxlKSB7IG1fcENvZGVjTW9kdWxlID0gcE1vZHVsZTsgfQotICBDQ29kZWNfTW9kdWxlTWdyKiBHZXRDb2RlY01vZHVsZSgpIHsgcmV0dXJuIG1fcENvZGVjTW9kdWxlOyB9Ci0KLSAgdm9pZCBJbml0UGFnZU1vZHVsZSgpOwotICBDUERGX1BhZ2VNb2R1bGUqIEdldFBhZ2VNb2R1bGUoKSBjb25zdCB7IHJldHVybiBtX3BQYWdlTW9kdWxlLmdldCgpOyB9CisgIHZvaWQgSW5pdCgpOwogCiAgIHZvaWQgU2V0VW5zdXBwb3J0SW5mb0FkYXB0ZXIoCiAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZTREtfVW5zdXBwb3J0SW5mb19BZGFwdGVyPiBwQWRhcHRlcikgewpAQCAtNTIsMTAgKzQ2LDggQEAKICAgICByZXR1cm4gbV9wVW5zdXBwb3J0SW5mb0FkYXB0ZXIuZ2V0KCk7CiAgIH0KIAotICB2b2lkIExvYWRFbWJlZGRlZEdCMUNNYXBzKCk7Ci0gIHZvaWQgTG9hZEVtYmVkZGVkQ05TMUNNYXBzKCk7Ci0gIHZvaWQgTG9hZEVtYmVkZGVkSmFwYW4xQ01hcHMoKTsKLSAgdm9pZCBMb2FkRW1iZWRkZWRLb3JlYTFDTWFwcygpOworICBDQ29kZWNfTW9kdWxlTWdyKiBHZXRDb2RlY01vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcENvZGVjTW9kdWxlLmdldCgpOyB9CisgIENQREZfUGFnZU1vZHVsZSogR2V0UGFnZU1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcFBhZ2VNb2R1bGUuZ2V0KCk7IH0KIAogICBDQ29kZWNfRmF4TW9kdWxlKiBHZXRGYXhNb2R1bGUoKTsKICAgQ0NvZGVjX0pwZWdNb2R1bGUqIEdldEpwZWdNb2R1bGUoKTsKQEAgLTY4LDcgKzYwLDE3IEBACiAgIENQREZfTW9kdWxlTWdyKCk7CiAgIH5DUERGX01vZHVsZU1ncigpOwogCi0gIENDb2RlY19Nb2R1bGVNZ3IqIG1fcENvZGVjTW9kdWxlOworICB2b2lkIEluaXRDb2RlY01vZHVsZSgpOworICB2b2lkIEluaXRQYWdlTW9kdWxlKCk7CisgIHZvaWQgTG9hZEVtYmVkZGVkTWFwcygpOworICB2b2lkIExvYWRDb2RlY01vZHVsZXMoKTsKKworICB2b2lkIExvYWRFbWJlZGRlZEdCMUNNYXBzKCk7CisgIHZvaWQgTG9hZEVtYmVkZGVkQ05TMUNNYXBzKCk7CisgIHZvaWQgTG9hZEVtYmVkZGVkSmFwYW4xQ01hcHMoKTsKKyAgdm9pZCBMb2FkRW1iZWRkZWRLb3JlYTFDTWFwcygpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNfTW9kdWxlTWdyPiBtX3BDb2RlY01vZHVsZTsKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfUGFnZU1vZHVsZT4gbV9wUGFnZU1vZHVsZTsKICAgc3RkOjp1bmlxdWVfcHRyPENGU0RLX1Vuc3VwcG9ydEluZm9fQWRhcHRlcj4gbV9wVW5zdXBwb3J0SW5mb0FkYXB0ZXI7CiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2NwZGZfcGFnZXJlbmRlcmNvbnRleHQuaCBiL2NvcmUvZnBkZmFwaS9jcGRmX3BhZ2VyZW5kZXJjb250ZXh0LmgKaW5kZXggMjcyNDRlNy4uNWNiY2RiNyAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL2NwZGZfcGFnZXJlbmRlcmNvbnRleHQuaAorKysgYi9jb3JlL2ZwZGZhcGkvY3BkZl9wYWdlcmVuZGVyY29udGV4dC5oCkBAIC0yMSwxMSArMjEsMTIgQEAKICAgQ1BERl9QYWdlUmVuZGVyQ29udGV4dCgpOwogICB+Q1BERl9QYWdlUmVuZGVyQ29udGV4dCgpOwogCisgIC8vIFNwZWNpZmljIGRlc3RydWN0aW9uIG9yZGVyIHJlcXVpcmVkLgogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Bbm5vdExpc3Q+IG1fcEFubm90czsKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfUmVuZGVyT3B0aW9ucz4gbV9wT3B0aW9uczsKICAgc3RkOjp1bmlxdWVfcHRyPENGWF9SZW5kZXJEZXZpY2U+IG1fcERldmljZTsKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfUmVuZGVyQ29udGV4dD4gbV9wQ29udGV4dDsKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcj4gbV9wUmVuZGVyZXI7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1JlbmRlck9wdGlvbnM+IG1fcE9wdGlvbnM7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9DUERGX1BBR0VSRU5ERVJDT05URVhUX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX2NyZWF0b3IuY3BwIGIvY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9jcmVhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzFkYTEzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9jcmVhdG9yLmNwcApAQCAtMCwwICsxLDg1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9jcmVhdG9yLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX2VuY3J5cHRvci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9lZGl0L2NwZGZfZmxhdGVlbmNvZGVyLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2NyeXB0b19oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RvY3VtZW50LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bWJlci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9wYXJzZXIuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc2VjdXJpdHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9yYW5kb20uaCIKKworbmFtZXNwYWNlIHsKKworY29uc3Qgc2l6ZV90IGtBcmNoaXZlQnVmZmVyU2l6ZSA9IDMyNzY4OworCitjbGFzcyBDRlhfRmlsZUJ1ZmZlckFyY2hpdmUgOiBwdWJsaWMgSUZYX0FyY2hpdmVTdHJlYW0geworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKGNvbnN0IFJldGFpblB0cjxJRlhfV3JpdGVTdHJlYW0+JiBhcmNoaXZlKTsKKyAgfkNGWF9GaWxlQnVmZmVyQXJjaGl2ZSgpIG92ZXJyaWRlOworCisgIGJvb2wgV3JpdGVCbG9jayhjb25zdCB2b2lkKiBwQnVmLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgIGJvb2wgV3JpdGVCeXRlKHVpbnQ4X3QgYnl0ZSkgb3ZlcnJpZGU7CisgIGJvb2wgV3JpdGVEV29yZCh1aW50MzJfdCBpKSBvdmVycmlkZTsKKyAgYm9vbCBXcml0ZVN0cmluZyhjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyKSBvdmVycmlkZTsKKworICBGWF9GSUxFU0laRSBDdXJyZW50T2Zmc2V0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gb2Zmc2V0XzsgfQorCisgcHJpdmF0ZToKKyAgYm9vbCBGbHVzaCgpOworCisgIEZYX0ZJTEVTSVpFIG9mZnNldF87CisgIHNpemVfdCBjdXJyZW50X2xlbmd0aF87CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZmZlcl87CisgIFJldGFpblB0cjxJRlhfV3JpdGVTdHJlYW0+IGJhY2tpbmdfZmlsZV87Cit9OworCitDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkNGWF9GaWxlQnVmZmVyQXJjaGl2ZSgKKyAgICBjb25zdCBSZXRhaW5QdHI8SUZYX1dyaXRlU3RyZWFtPiYgZmlsZSkKKyAgICA6IG9mZnNldF8oMCksCisgICAgICBjdXJyZW50X2xlbmd0aF8oMCksCisgICAgICBidWZmZXJfKGtBcmNoaXZlQnVmZmVyU2l6ZSksCisgICAgICBiYWNraW5nX2ZpbGVfKGZpbGUpIHsKKyAgQVNTRVJUKGZpbGUpOworfQorCitDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6On5DRlhfRmlsZUJ1ZmZlckFyY2hpdmUoKSB7CisgIEZsdXNoKCk7Cit9CisKK2Jvb2wgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjpGbHVzaCgpIHsKKyAgc2l6ZV90IG5SZW1haW5pbmcgPSBjdXJyZW50X2xlbmd0aF87CisgIGN1cnJlbnRfbGVuZ3RoXyA9IDA7CisgIGlmICghYmFja2luZ19maWxlXykKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghblJlbWFpbmluZykKKyAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGJhY2tpbmdfZmlsZV8tPldyaXRlQmxvY2soYnVmZmVyXy5kYXRhKCksIG5SZW1haW5pbmcpOworfQorCitib29sIENGWF9GaWxlQnVmZmVyQXJjaGl2ZTo6V3JpdGVCbG9jayhjb25zdCB2b2lkKiBwQnVmLCBzaXplX3Qgc2l6ZSkgeworICBBU1NFUlQocEJ1ZiAmJiBzaXplID4gMCk7CisKKyAgY29uc3QgdWludDhfdCogYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4ocEJ1Zik7CisgIHNpemVfdCB0ZW1wX3NpemUgPSBzaXplOworICB3aGlsZSAodGVtcF9zaXplKSB7CisgICAgc2l6ZV90IGJ1Zl9zaXplID0gc3RkOjptaW4oa0FyY2hpdmVCdWZmZXJTaXplIC0gY3VycmVudF9sZW5ndGhfLCB0ZW1wX3NpemUpOworICAgIG1lbWNweShidWZmZXJfLmRhdGEoKSArIGN1cnJlbnRfbGVuZ3RoXywgYnVmZmVyLCBidWZfc2l6ZSk7CisKKyAgICBjdXJyZW50X2xlbmd0aF8gKz0gYnVmX3NpemU7CisgICAgaWYgKGN1cnJlbnRfbGVuZ3RoXyA9PSBrQXJjaGl2ZUJ1ZmZlclNpemUgJiYgIUZsdXNoKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB0ZW1wX3NpemUgLT0gYnVmX3NpemU7CisgICAgYnVmZmVyICs9IGJ1Zl9zaXplOworICB9CisKKyAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxGWF9GSUxFU0laRT4gc2FmZV9vZmZzZXQgPSBvZmZzZXRfOworICBzYWZlX29mZnNldCArPSBzaXplOworICBpZiAoIXNhZmVfb2Zmc2V0LklzVmFsaWQoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgb2Zmc2V0XyA9IHNhZmVfb2Zmc2V0LlZhbHVlT3JEaWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjpXcml0ZUJ5dGUodWludDhfdCBieXRlKSB7CisgIHJldHVybiBXcml0ZUJsb2NrKCZieXRlLCAxKTsKK30KKworYm9vbCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OldyaXRlRFdvcmQodWludDMyX3QgaSkgeworICBjaGFyIGJ1ZlszMl07CisgIEZYU1lTX2l0b2EoaSwgYnVmLCAxMCk7CisgIHJldHVybiBXcml0ZUJsb2NrKGJ1Ziwgc3RybGVuKGJ1ZikpOworfQorCitib29sIENGWF9GaWxlQnVmZmVyQXJjaGl2ZTo6V3JpdGVTdHJpbmcoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN0cikgeworICByZXR1cm4gV3JpdGVCbG9jayhzdHIucmF3X3N0cigpLCBzdHIuR2V0TGVuZ3RoKCkpOworfQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiBHZW5lcmF0ZUZpbGVJRCh1aW50MzJfdCBkd1NlZWQxLCB1aW50MzJfdCBkd1NlZWQyKSB7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZmZlcihzaXplb2YodWludDMyX3QpICogNCk7CisgIHVpbnQzMl90KiBwQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KGJ1ZmZlci5kYXRhKCkpOworICB2b2lkKiBwQ29udGV4dCA9IEZYX1JhbmRvbV9NVF9TdGFydChkd1NlZWQxKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpCisgICAgKnBCdWZmZXIrKyA9IEZYX1JhbmRvbV9NVF9HZW5lcmF0ZShwQ29udGV4dCk7CisKKyAgRlhfUmFuZG9tX01UX0Nsb3NlKHBDb250ZXh0KTsKKyAgcENvbnRleHQgPSBGWF9SYW5kb21fTVRfU3RhcnQoZHdTZWVkMik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKQorICAgICpwQnVmZmVyKysgPSBGWF9SYW5kb21fTVRfR2VuZXJhdGUocENvbnRleHQpOworCisgIEZYX1JhbmRvbV9NVF9DbG9zZShwQ29udGV4dCk7CisgIHJldHVybiBidWZmZXI7Cit9CisKK2ludDMyX3QgT3V0cHV0SW5kZXgoSUZYX0FyY2hpdmVTdHJlYW0qIGFyY2hpdmUsIEZYX0ZJTEVTSVpFIG9mZnNldCkgeworICBpZiAoIWFyY2hpdmUtPldyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90PihvZmZzZXQgPj4gMjQpKSB8fAorICAgICAgIWFyY2hpdmUtPldyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90PihvZmZzZXQgPj4gMTYpKSB8fAorICAgICAgIWFyY2hpdmUtPldyaXRlQnl0ZShzdGF0aWNfY2FzdDx1aW50OF90PihvZmZzZXQgPj4gOCkpIHx8CisgICAgICAhYXJjaGl2ZS0+V3JpdGVCeXRlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KG9mZnNldCkpIHx8CisgICAgICAhYXJjaGl2ZS0+V3JpdGVCeXRlKDApKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiAwOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQ1BERl9DcmVhdG9yOjpDUERGX0NyZWF0b3IoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxJRlhfV3JpdGVTdHJlYW0+JiBhcmNoaXZlKQorICAgIDogbV9wRG9jdW1lbnQocERvYyksCisgICAgICBtX3BQYXJzZXIocERvYy0+R2V0UGFyc2VyKCkpLAorICAgICAgbV9iU2VjdXJpdHlDaGFuZ2VkKGZhbHNlKSwKKyAgICAgIG1fcEVuY3J5cHREaWN0KG1fcFBhcnNlciA/IG1fcFBhcnNlci0+R2V0RW5jcnlwdERpY3QoKSA6IG51bGxwdHIpLAorICAgICAgbV9kd0VuY3J5cHRPYmpOdW0oMCksCisgICAgICBtX3BTZWN1cml0eUhhbmRsZXIobV9wUGFyc2VyID8gbV9wUGFyc2VyLT5HZXRTZWN1cml0eUhhbmRsZXIoKSA6IG51bGxwdHIpLAorICAgICAgbV9wTWV0YWRhdGEobnVsbHB0ciksCisgICAgICBtX2R3TGFzdE9iak51bShtX3BEb2N1bWVudC0+R2V0TGFzdE9iak51bSgpKSwKKyAgICAgIG1fQXJjaGl2ZShwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0ZpbGVCdWZmZXJBcmNoaXZlPihhcmNoaXZlKSksCisgICAgICBtX1NhdmVkT2Zmc2V0KDApLAorICAgICAgbV9pU3RhZ2UoLTEpLAorICAgICAgbV9kd0ZsYWdzKDApLAorICAgICAgbV9DdXJPYmpOdW0oMCksCisgICAgICBtX1hyZWZTdGFydCgwKSwKKyAgICAgIG1fcElEQXJyYXkobnVsbHB0ciksCisgICAgICBtX0ZpbGVWZXJzaW9uKDApIHt9CisKK0NQREZfQ3JlYXRvcjo6fkNQREZfQ3JlYXRvcigpIHt9CisKK2Jvb2wgQ1BERl9DcmVhdG9yOjpXcml0ZVN0cmVhbShjb25zdCBDUERGX09iamVjdCogcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9DcnlwdG9IYW5kbGVyKiBwQ3J5cHRvKSB7CisgIENQREZfRmxhdGVFbmNvZGVyIGVuY29kZXIoY29uc3RfY2FzdDxDUERGX1N0cmVhbSo+KHBTdHJlYW0tPkFzU3RyZWFtKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW0gIT0gbV9wTWV0YWRhdGEpOworICBDUERGX0VuY3J5cHRvciBlbmNyeXB0b3IocENyeXB0bywgb2JqbnVtLCBlbmNvZGVyLkdldERhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZXIuR2V0U2l6ZSgpKTsKKyAgaWYgKHN0YXRpY19jYXN0PHVpbnQzMl90PihlbmNvZGVyLkdldERpY3QoKS0+R2V0SW50ZWdlckZvcigiTGVuZ3RoIikpICE9CisgICAgICBlbmNyeXB0b3IuR2V0U2l6ZSgpKSB7CisgICAgZW5jb2Rlci5DbG9uZURpY3QoKTsKKyAgICBlbmNvZGVyLkdldERpY3QoKS0+U2V0TmV3Rm9yPENQREZfTnVtYmVyPigKKyAgICAgICAgIkxlbmd0aCIsIHN0YXRpY19jYXN0PGludD4oZW5jcnlwdG9yLkdldFNpemUoKSkpOworICB9CisKKyAgaWYgKCFXcml0ZURpcmVjdE9iaihvYmpudW0sIGVuY29kZXIuR2V0RGljdCgpLCB0cnVlKSB8fAorICAgICAgIW1fQXJjaGl2ZS0+V3JpdGVTdHJpbmcoInN0cmVhbVxyXG4iKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIEFsbG93IGZvciBlbXB0eSBzdHJlYW1zLgorICBpZiAoZW5jcnlwdG9yLkdldFNpemUoKSA+IDAgJiYKKyAgICAgICFtX0FyY2hpdmUtPldyaXRlQmxvY2soZW5jcnlwdG9yLkdldERhdGEoKSwgZW5jcnlwdG9yLkdldFNpemUoKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gbV9BcmNoaXZlLT5Xcml0ZVN0cmluZygiXHJcbmVuZHN0cmVhbSIpOworfQorCitib29sIENQREZfQ3JlYXRvcjo6V3JpdGVJbmRpcmVjdE9iaih1aW50MzJfdCBvYmpudW0sIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKSB7CisgIGlmICghbV9BcmNoaXZlLT5Xcml0ZURXb3JkKG9iam51bSkgfHwgIW1fQXJjaGl2ZS0+V3JpdGVTdHJpbmcoIiAwIG9ialxyXG4iKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKHBPYmotPklzU3RyZWFtKCkpIHsKKyAgICBDUERGX0NyeXB0b0hhbmRsZXIqIHBIYW5kbGVyID0KKyAgICAgICAgcE9iaiAhPSBtX3BNZXRhZGF0YSA/IEdldENyeXB0b0hhbmRsZXIoKSA6IG51bGxwdHI7CisgICAgaWYgKCFXcml0ZVN0cmVhbShwT2JqLCBvYmpudW0sIHBIYW5kbGVyKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIGlmICghV3JpdGVEaXJlY3RPYmoob2JqbnVtLCBwT2JqLCB0cnVlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiBtX0FyY2hpdmUtPldyaXRlU3RyaW5nKCJcclxuZW5kb2JqXHJcbiIpOworfQorCitib29sIENQREZfQ3JlYXRvcjo6V3JpdGVEaXJlY3RPYmoodWludDMyX3Qgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkVuY3J5cHQpIHsKKyAgc3dpdGNoIChwT2JqLT5HZXRUeXBlKCkpIHsKKyAgICBjYXNlIENQREZfT2JqZWN0OjpCT09MRUFOOgorICAgIGNhc2UgQ1BERl9PYmplY3Q6Ok5BTUU6CisgICAgY2FzZSBDUERGX09iamVjdDo6TlVMTE9CSjoKKyAgICBjYXNlIENQREZfT2JqZWN0OjpOVU1CRVI6CisgICAgY2FzZSBDUERGX09iamVjdDo6UkVGRVJFTkNFOgorICAgICAgaWYgKCFwT2JqLT5Xcml0ZVRvKG1fQXJjaGl2ZS5nZXQoKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDUERGX09iamVjdDo6U1RSSU5HOiB7CisgICAgICBCeXRlU3RyaW5nIHN0ciA9IHBPYmotPkdldFN0cmluZygpOworICAgICAgYm9vbCBiSGV4ID0gcE9iai0+QXNTdHJpbmcoKS0+SXNIZXgoKTsKKyAgICAgIGlmICghR2V0Q3J5cHRvSGFuZGxlcigpIHx8ICFiRW5jcnlwdCkgeworICAgICAgICBpZiAoIXBPYmotPldyaXRlVG8obV9BcmNoaXZlLmdldCgpKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgQ1BERl9FbmNyeXB0b3IgZW5jcnlwdG9yKEdldENyeXB0b0hhbmRsZXIoKSwgb2JqbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KilzdHIuY19zdHIoKSwgc3RyLkdldExlbmd0aCgpKTsKKyAgICAgIEJ5dGVTdHJpbmcgY29udGVudCA9IFBERl9FbmNvZGVTdHJpbmcoCisgICAgICAgICAgQnl0ZVN0cmluZyhlbmNyeXB0b3IuR2V0RGF0YSgpLCBlbmNyeXB0b3IuR2V0U2l6ZSgpKSwgYkhleCk7CisgICAgICBpZiAoIW1fQXJjaGl2ZS0+V3JpdGVTdHJpbmcoY29udGVudC5Bc1N0cmluZ1ZpZXcoKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIENQREZfT2JqZWN0OjpTVFJFQU06IHsKKyAgICAgIENQREZfRmxhdGVFbmNvZGVyIGVuY29kZXIoY29uc3RfY2FzdDxDUERGX1N0cmVhbSo+KHBPYmotPkFzU3RyZWFtKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgICAgIENQREZfRW5jcnlwdG9yIGVuY3J5cHRvcihHZXRDcnlwdG9IYW5kbGVyKCksIG9iam51bSwgZW5jb2Rlci5HZXREYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5HZXRTaXplKCkpOworICAgICAgaWYgKHN0YXRpY19jYXN0PHVpbnQzMl90PihlbmNvZGVyLkdldERpY3QoKS0+R2V0SW50ZWdlckZvcigiTGVuZ3RoIikpICE9CisgICAgICAgICAgZW5jcnlwdG9yLkdldFNpemUoKSkgeworICAgICAgICBlbmNvZGVyLkNsb25lRGljdCgpOworICAgICAgICBlbmNvZGVyLkdldERpY3QoKS0+U2V0TmV3Rm9yPENQREZfTnVtYmVyPigKKyAgICAgICAgICAgICJMZW5ndGgiLCBzdGF0aWNfY2FzdDxpbnQ+KGVuY3J5cHRvci5HZXRTaXplKCkpKTsKKyAgICAgIH0KKyAgICAgIGlmICghV3JpdGVEaXJlY3RPYmoob2JqbnVtLCBlbmNvZGVyLkdldERpY3QoKSwgdHJ1ZSkgfHwKKyAgICAgICAgICAhbV9BcmNoaXZlLT5Xcml0ZVN0cmluZygic3RyZWFtXHJcbiIpIHx8CisgICAgICAgICAgIW1fQXJjaGl2ZS0+V3JpdGVCbG9jayhlbmNyeXB0b3IuR2V0RGF0YSgpLCBlbmNyeXB0b3IuR2V0U2l6ZSgpKSB8fAorICAgICAgICAgICFtX0FyY2hpdmUtPldyaXRlU3RyaW5nKCJcclxuZW5kc3RyZWFtIikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBDUERGX09iamVjdDo6QVJSQVk6IHsKKyAgICAgIGlmICghbV9BcmNoaXZlLT5Xcml0ZVN0cmluZygiWyIpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIGNvbnN0IENQREZfQXJyYXkqIHAgPSBwT2JqLT5Bc0FycmF5KCk7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHAtPkdldENvdW50KCk7IGkrKykgeworICAgICAgICBDUERGX09iamVjdCogcEVsZW1lbnQgPSBwLT5HZXRPYmplY3RBdChpKTsKKyAgICAgICAgaWYgKCFwRWxlbWVudC0+SXNJbmxpbmUoKSkgeworICAgICAgICAgIGlmICghbV9BcmNoaXZlLT5Xcml0ZVN0cmluZygiICIpIHx8CisgICAgICAgICAgICAgICFtX0FyY2hpdmUtPldyaXRlRFdvcmQocEVsZW1lbnQtPkdldE9iak51bSgpKSB8fAorICAgICAgICAgICAgICAhbV9BcmNoaXZlLT5Xcml0ZVN0cmluZygiIDAgUiIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFXcml0ZURpcmVjdE9iaihvYmpudW0sIHBFbGVtZW50LCB0cnVlKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFtX0FyY2hpdmUtPldyaXRlU3RyaW5nKCJdIikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIENQREZfT2JqZWN0OjpESUNUSU9OQVJZOiB7CisgICAgICBpZiAoIUdldENyeXB0b0hhbmRsZXIoKSB8fCBwT2JqID09IG1fcEVuY3J5cHREaWN0KSB7CisgICAgICAgIGlmICghcE9iai0+V3JpdGVUbyhtX0FyY2hpdmUuZ2V0KCkpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmICghbV9BcmNoaXZlLT5Xcml0ZVN0cmluZygiPDwiKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHAgPSBwT2JqLT5Bc0RpY3Rpb25hcnkoKTsKKyAgICAgIGJvb2wgYlNpZ25EaWN0ID0gcC0+SXNTaWduYXR1cmVEaWN0KCk7CisgICAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogKnApIHsKKyAgICAgICAgYm9vbCBiU2lnblZhbHVlID0gZmFsc2U7CisgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIGtleSA9IGl0LmZpcnN0OworICAgICAgICBDUERGX09iamVjdCogcFZhbHVlID0gaXQuc2Vjb25kLmdldCgpOworICAgICAgICBpZiAoIW1fQXJjaGl2ZS0+V3JpdGVTdHJpbmcoIi8iKSB8fAorICAgICAgICAgICAgIW1fQXJjaGl2ZS0+V3JpdGVTdHJpbmcoUERGX05hbWVFbmNvZGUoa2V5KS5Bc1N0cmluZ1ZpZXcoKSkpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYlNpZ25EaWN0ICYmIGtleSA9PSAiQ29udGVudHMiKQorICAgICAgICAgIGJTaWduVmFsdWUgPSB0cnVlOworICAgICAgICBpZiAoIXBWYWx1ZS0+SXNJbmxpbmUoKSkgeworICAgICAgICAgIGlmICghbV9BcmNoaXZlLT5Xcml0ZVN0cmluZygiICIpIHx8CisgICAgICAgICAgICAgICFtX0FyY2hpdmUtPldyaXRlRFdvcmQocFZhbHVlLT5HZXRPYmpOdW0oKSkgfHwKKyAgICAgICAgICAgICAgIW1fQXJjaGl2ZS0+V3JpdGVTdHJpbmcoIiAwIFIgIikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIVdyaXRlRGlyZWN0T2JqKG9iam51bSwgcFZhbHVlLCAhYlNpZ25WYWx1ZSkpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghbV9BcmNoaXZlLT5Xcml0ZVN0cmluZygiPj4iKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIENQREZfQ3JlYXRvcjo6V3JpdGVPbGRJbmRpcmVjdE9iamVjdCh1aW50MzJfdCBvYmpudW0pIHsKKyAgaWYgKG1fcFBhcnNlci0+SXNPYmplY3RGcmVlT3JOdWxsKG9iam51bSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgbV9PYmplY3RPZmZzZXRzW29iam51bV0gPSBtX0FyY2hpdmUtPkN1cnJlbnRPZmZzZXQoKTsKKworICBib29sIGJFeGlzdEluTWFwID0gISFtX3BEb2N1bWVudC0+R2V0SW5kaXJlY3RPYmplY3Qob2JqbnVtKTsKKyAgQ1BERl9PYmplY3QqIHBPYmogPSBtX3BEb2N1bWVudC0+R2V0T3JQYXJzZUluZGlyZWN0T2JqZWN0KG9iam51bSk7CisgIGlmICghcE9iaikgeworICAgIG1fT2JqZWN0T2Zmc2V0cy5lcmFzZShvYmpudW0pOworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmICghV3JpdGVJbmRpcmVjdE9iaihwT2JqLT5HZXRPYmpOdW0oKSwgcE9iaikpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIWJFeGlzdEluTWFwKQorICAgIG1fcERvY3VtZW50LT5EZWxldGVJbmRpcmVjdE9iamVjdChvYmpudW0pOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDUERGX0NyZWF0b3I6OldyaXRlT2xkT2JqcygpIHsKKyAgdWludDMyX3Qgbkxhc3RPYmpOdW0gPSBtX3BQYXJzZXItPkdldExhc3RPYmpOdW0oKTsKKyAgaWYgKCFtX3BQYXJzZXItPklzVmFsaWRPYmplY3ROdW1iZXIobkxhc3RPYmpOdW0pKQorICAgIHJldHVybiB0cnVlOworCisgIGZvciAodWludDMyX3Qgb2JqbnVtID0gbV9DdXJPYmpOdW07IG9iam51bSA8PSBuTGFzdE9iak51bTsgKytvYmpudW0pIHsKKyAgICBpZiAoIVdyaXRlT2xkSW5kaXJlY3RPYmplY3Qob2JqbnVtKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDUERGX0NyZWF0b3I6OldyaXRlTmV3T2JqcygpIHsKKyAgZm9yIChzaXplX3QgaSA9IG1fQ3VyT2JqTnVtOyBpIDwgbV9OZXdPYmpOdW1BcnJheS5zaXplKCk7ICsraSkgeworICAgIHVpbnQzMl90IG9iam51bSA9IG1fTmV3T2JqTnVtQXJyYXlbaV07CisgICAgQ1BERl9PYmplY3QqIHBPYmogPSBtX3BEb2N1bWVudC0+R2V0SW5kaXJlY3RPYmplY3Qob2JqbnVtKTsKKyAgICBpZiAoIXBPYmopCisgICAgICBjb250aW51ZTsKKworICAgIG1fT2JqZWN0T2Zmc2V0c1tvYmpudW1dID0gbV9BcmNoaXZlLT5DdXJyZW50T2Zmc2V0KCk7CisgICAgaWYgKCFXcml0ZUluZGlyZWN0T2JqKHBPYmotPkdldE9iak51bSgpLCBwT2JqKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDUERGX0NyZWF0b3I6OkluaXRPbGRPYmpOdW1PZmZzZXRzKCkgeworICBpZiAoIW1fcFBhcnNlcikKKyAgICByZXR1cm47CisKKyAgdWludDMyX3QgZHdTdGFydCA9IDA7CisgIHVpbnQzMl90IGR3RW5kID0gbV9wUGFyc2VyLT5HZXRMYXN0T2JqTnVtKCk7CisgIHdoaWxlIChkd1N0YXJ0IDw9IGR3RW5kKSB7CisgICAgd2hpbGUgKGR3U3RhcnQgPD0gZHdFbmQgJiYgbV9wUGFyc2VyLT5Jc09iamVjdEZyZWVPck51bGwoZHdTdGFydCkpCisgICAgICBkd1N0YXJ0Kys7CisKKyAgICBpZiAoZHdTdGFydCA+IGR3RW5kKQorICAgICAgYnJlYWs7CisKKyAgICB1aW50MzJfdCBqID0gZHdTdGFydDsKKyAgICB3aGlsZSAoaiA8PSBkd0VuZCAmJiAhbV9wUGFyc2VyLT5Jc09iamVjdEZyZWVPck51bGwoaikpCisgICAgICBqKys7CisKKyAgICBkd1N0YXJ0ID0gajsKKyAgfQorfQorCit2b2lkIENQREZfQ3JlYXRvcjo6SW5pdE5ld09iak51bU9mZnNldHMoKSB7CisgIGZvciAoY29uc3QgYXV0byYgcGFpciA6ICptX3BEb2N1bWVudCkgeworICAgIGNvbnN0IHVpbnQzMl90IG9iam51bSA9IHBhaXIuZmlyc3Q7CisgICAgaWYgKElzSW5jcmVtZW50YWwoKSB8fAorICAgICAgICBwYWlyLnNlY29uZC0+R2V0T2JqTnVtKCkgPT0gQ1BERl9PYmplY3Q6OmtJbnZhbGlkT2JqTnVtKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKG1fcFBhcnNlciAmJiBtX3BQYXJzZXItPklzVmFsaWRPYmplY3ROdW1iZXIob2JqbnVtKSAmJgorICAgICAgICAhbV9wUGFyc2VyLT5Jc09iamVjdEZyZWUob2JqbnVtKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIG1fTmV3T2JqTnVtQXJyYXkuaW5zZXJ0KHN0ZDo6bG93ZXJfYm91bmQobV9OZXdPYmpOdW1BcnJheS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9OZXdPYmpOdW1BcnJheS5lbmQoKSwgb2JqbnVtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpudW0pOworICB9Cit9CisKK2ludDMyX3QgQ1BERl9DcmVhdG9yOjpXcml0ZURvY19TdGFnZTEoKSB7CisgIEFTU0VSVChtX2lTdGFnZSA+IC0xIHx8IG1faVN0YWdlIDwgMjApOworICBpZiAobV9pU3RhZ2UgPT0gMCkgeworICAgIGlmICghbV9wUGFyc2VyKQorICAgICAgbV9kd0ZsYWdzICY9IH5GUERGQ1JFQVRFX0lOQ1JFTUVOVEFMOworICAgIGlmIChtX2JTZWN1cml0eUNoYW5nZWQgJiYgSXNPcmlnaW5hbCgpKQorICAgICAgbV9kd0ZsYWdzICY9IH5GUERGQ1JFQVRFX0lOQ1JFTUVOVEFMOworCisgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7CisgICAgbV9wTWV0YWRhdGEgPSBwRGljdCA/IHBEaWN0LT5HZXREaXJlY3RPYmplY3RGb3IoIk1ldGFkYXRhIikgOiBudWxscHRyOworICAgIG1faVN0YWdlID0gMTA7CisgIH0KKyAgaWYgKG1faVN0YWdlID09IDEwKSB7CisgICAgaWYgKCFJc0luY3JlbWVudGFsKCkpIHsKKyAgICAgIGlmICghbV9BcmNoaXZlLT5Xcml0ZVN0cmluZygiJVBERi0xLiIpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgIGludDMyX3QgdmVyc2lvbiA9IDc7CisgICAgICBpZiAobV9GaWxlVmVyc2lvbikKKyAgICAgICAgdmVyc2lvbiA9IG1fRmlsZVZlcnNpb247CisgICAgICBlbHNlIGlmIChtX3BQYXJzZXIpCisgICAgICAgIHZlcnNpb24gPSBtX3BQYXJzZXItPkdldEZpbGVWZXJzaW9uKCk7CisKKyAgICAgIGlmICghbV9BcmNoaXZlLT5Xcml0ZURXb3JkKHZlcnNpb24gJSAxMCkgfHwKKyAgICAgICAgICAhbV9BcmNoaXZlLT5Xcml0ZVN0cmluZygiXHJcbiVceEExXHhCM1x4QzVceEQ3XHJcbiIpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKworICAgICAgSW5pdE9sZE9iak51bU9mZnNldHMoKTsKKyAgICAgIG1faVN0YWdlID0gMjA7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fU2F2ZWRPZmZzZXQgPSBtX3BQYXJzZXItPkdldEZpbGVBY2Nlc3MoKS0+R2V0U2l6ZSgpOworICAgICAgbV9pU3RhZ2UgPSAxNTsKKyAgICB9CisgIH0KKyAgaWYgKG1faVN0YWdlID09IDE1KSB7CisgICAgaWYgKElzT3JpZ2luYWwoKSAmJiBtX1NhdmVkT2Zmc2V0ID4gMCkgeworICAgICAgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IHBTcmNGaWxlID0gbV9wUGFyc2VyLT5HZXRGaWxlQWNjZXNzKCk7CisgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXIoNDA5Nik7CisgICAgICBGWF9GSUxFU0laRSBzcmNfc2l6ZSA9IG1fU2F2ZWRPZmZzZXQ7CisgICAgICB3aGlsZSAoc3JjX3NpemUpIHsKKyAgICAgICAgdWludDMyX3QgYmxvY2tfc2l6ZSA9IHNyY19zaXplID4gNDA5NiA/IDQwOTYgOiBzcmNfc2l6ZTsKKyAgICAgICAgaWYgKCFwU3JjRmlsZS0+UmVhZEJsb2NrKGJ1ZmZlci5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0FyY2hpdmUtPkN1cnJlbnRPZmZzZXQoKSAtIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfc2l6ZSkpIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtX0FyY2hpdmUtPldyaXRlQmxvY2soYnVmZmVyLmRhdGEoKSwgYmxvY2tfc2l6ZSkpCisgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIHNyY19zaXplIC09IGJsb2NrX3NpemU7CisgICAgICB9CisgICAgfQorICAgIGlmIChJc09yaWdpbmFsKCkgJiYgbV9wUGFyc2VyLT5HZXRMYXN0WFJlZk9mZnNldCgpID09IDApIHsKKyAgICAgIEluaXRPbGRPYmpOdW1PZmZzZXRzKCk7CisKKyAgICAgIGZvciAodWludDMyX3QgbnVtID0gMDsgbnVtIDw9IG1fcFBhcnNlci0+R2V0TGFzdE9iak51bSgpOyArK251bSkgeworICAgICAgICBpZiAobV9wUGFyc2VyLT5Jc09iamVjdEZyZWVPck51bGwobnVtKSkKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBtX09iamVjdE9mZnNldHNbbnVtXSA9IG1fcFBhcnNlci0+R2V0T2JqZWN0UG9zaXRpb25Pclplcm8obnVtKTsKKyAgICAgIH0KKyAgICB9CisgICAgbV9pU3RhZ2UgPSAyMDsKKyAgfQorICBJbml0TmV3T2JqTnVtT2Zmc2V0cygpOworICByZXR1cm4gbV9pU3RhZ2U7Cit9CisKK2ludDMyX3QgQ1BERl9DcmVhdG9yOjpXcml0ZURvY19TdGFnZTIoKSB7CisgIEFTU0VSVChtX2lTdGFnZSA+PSAyMCB8fCBtX2lTdGFnZSA8IDMwKTsKKyAgaWYgKG1faVN0YWdlID09IDIwKSB7CisgICAgaWYgKCFJc0luY3JlbWVudGFsKCkgJiYgbV9wUGFyc2VyKSB7CisgICAgICBtX0N1ck9iak51bSA9IDA7CisgICAgICBtX2lTdGFnZSA9IDIxOworICAgIH0gZWxzZSB7CisgICAgICBtX2lTdGFnZSA9IDI1OworICAgIH0KKyAgfQorICBpZiAobV9pU3RhZ2UgPT0gMjEpIHsKKyAgICBpZiAoIVdyaXRlT2xkT2JqcygpKQorICAgICAgcmV0dXJuIC0xOworCisgICAgbV9pU3RhZ2UgPSAyNTsKKyAgfQorICBpZiAobV9pU3RhZ2UgPT0gMjUpIHsKKyAgICBtX0N1ck9iak51bSA9IDA7CisgICAgbV9pU3RhZ2UgPSAyNjsKKyAgfQorICBpZiAobV9pU3RhZ2UgPT0gMjYpIHsKKyAgICBpZiAoIVdyaXRlTmV3T2JqcygpKQorICAgICAgcmV0dXJuIC0xOworCisgICAgbV9pU3RhZ2UgPSAyNzsKKyAgfQorICBpZiAobV9pU3RhZ2UgPT0gMjcpIHsKKyAgICBpZiAobV9wRW5jcnlwdERpY3QgJiYgbV9wRW5jcnlwdERpY3QtPklzSW5saW5lKCkpIHsKKyAgICAgIG1fZHdMYXN0T2JqTnVtICs9IDE7CisgICAgICBGWF9GSUxFU0laRSBzYXZlT2Zmc2V0ID0gbV9BcmNoaXZlLT5DdXJyZW50T2Zmc2V0KCk7CisgICAgICBpZiAoIVdyaXRlSW5kaXJlY3RPYmoobV9kd0xhc3RPYmpOdW0sIG1fcEVuY3J5cHREaWN0LkdldCgpKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgICBtX09iamVjdE9mZnNldHNbbV9kd0xhc3RPYmpOdW1dID0gc2F2ZU9mZnNldDsKKyAgICAgIG1fZHdFbmNyeXB0T2JqTnVtID0gbV9kd0xhc3RPYmpOdW07CisgICAgICBpZiAoSXNJbmNyZW1lbnRhbCgpKQorICAgICAgICBtX05ld09iak51bUFycmF5LnB1c2hfYmFjayhtX2R3TGFzdE9iak51bSk7CisgICAgfQorICAgIG1faVN0YWdlID0gODA7CisgIH0KKyAgcmV0dXJuIG1faVN0YWdlOworfQorCitpbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVEb2NfU3RhZ2UzKCkgeworICBBU1NFUlQobV9pU3RhZ2UgPj0gODAgfHwgbV9pU3RhZ2UgPCA5MCk7CisKKyAgdWludDMyX3QgZHdMYXN0T2JqTnVtID0gbV9kd0xhc3RPYmpOdW07CisgIGlmIChtX2lTdGFnZSA9PSA4MCkgeworICAgIG1fWHJlZlN0YXJ0ID0gbV9BcmNoaXZlLT5DdXJyZW50T2Zmc2V0KCk7CisgICAgaWYgKCFJc0luY3JlbWVudGFsKCkgfHwgIW1fcFBhcnNlci0+SXNYUmVmU3RyZWFtKCkpIHsKKyAgICAgIGlmICghSXNJbmNyZW1lbnRhbCgpIHx8IG1fcFBhcnNlci0+R2V0TGFzdFhSZWZPZmZzZXQoKSA9PSAwKSB7CisgICAgICAgIEJ5dGVTdHJpbmcgc3RyOworICAgICAgICBzdHIgPSBwZGZpdW06OkNvbnRhaW5zS2V5KG1fT2JqZWN0T2Zmc2V0cywgMSkKKyAgICAgICAgICAgICAgICAgID8gInhyZWZcclxuIgorICAgICAgICAgICAgICAgICAgOiAieHJlZlxyXG4wIDFcclxuMDAwMDAwMDAwMCA2NTUzNSBmXHJcbiI7CisgICAgICAgIGlmICghbV9BcmNoaXZlLT5Xcml0ZVN0cmluZyhzdHIuQXNTdHJpbmdWaWV3KCkpKQorICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBtX0N1ck9iak51bSA9IDE7CisgICAgICAgIG1faVN0YWdlID0gODE7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIW1fQXJjaGl2ZS0+V3JpdGVTdHJpbmcoInhyZWZcclxuIikpCisgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIG1fQ3VyT2JqTnVtID0gMDsKKyAgICAgICAgbV9pU3RhZ2UgPSA4MjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgbV9pU3RhZ2UgPSA5MDsKKyAgICB9CisgIH0KKyAgaWYgKG1faVN0YWdlID09IDgxKSB7CisgICAgQnl0ZVN0cmluZyBzdHI7CisgICAgdWludDMyX3QgaSA9IG1fQ3VyT2JqTnVtOworICAgIHVpbnQzMl90IGo7CisgICAgd2hpbGUgKGkgPD0gZHdMYXN0T2JqTnVtKSB7CisgICAgICB3aGlsZSAoaSA8PSBkd0xhc3RPYmpOdW0gJiYgIXBkZml1bTo6Q29udGFpbnNLZXkobV9PYmplY3RPZmZzZXRzLCBpKSkKKyAgICAgICAgaSsrOworCisgICAgICBpZiAoaSA+IGR3TGFzdE9iak51bSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGogPSBpOworICAgICAgd2hpbGUgKGogPD0gZHdMYXN0T2JqTnVtICYmIHBkZml1bTo6Q29udGFpbnNLZXkobV9PYmplY3RPZmZzZXRzLCBqKSkKKyAgICAgICAgaisrOworCisgICAgICBpZiAoaSA9PSAxKQorICAgICAgICBzdHIgPSBCeXRlU3RyaW5nOjpGb3JtYXQoIjAgJWRcclxuMDAwMDAwMDAwMCA2NTUzNSBmXHJcbiIsIGopOworICAgICAgZWxzZQorICAgICAgICBzdHIgPSBCeXRlU3RyaW5nOjpGb3JtYXQoIiVkICVkXHJcbiIsIGksIGogLSBpKTsKKworICAgICAgaWYgKCFtX0FyY2hpdmUtPldyaXRlQmxvY2soc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgICAgd2hpbGUgKGkgPCBqKSB7CisgICAgICAgIHN0ciA9IEJ5dGVTdHJpbmc6OkZvcm1hdCgiJTAxMGQgMDAwMDAgblxyXG4iLCBtX09iamVjdE9mZnNldHNbaSsrXSk7CisgICAgICAgIGlmICghbV9BcmNoaXZlLT5Xcml0ZUJsb2NrKHN0ci5jX3N0cigpLCBzdHIuR2V0TGVuZ3RoKCkpKQorICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGlmIChpID4gZHdMYXN0T2JqTnVtKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgbV9pU3RhZ2UgPSA5MDsKKyAgfQorICBpZiAobV9pU3RhZ2UgPT0gODIpIHsKKyAgICBCeXRlU3RyaW5nIHN0cjsKKyAgICB1aW50MzJfdCBpQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPHVpbnQzMl90PihtX05ld09iak51bUFycmF5KTsKKyAgICB1aW50MzJfdCBpID0gbV9DdXJPYmpOdW07CisgICAgd2hpbGUgKGkgPCBpQ291bnQpIHsKKyAgICAgIHNpemVfdCBqID0gaTsKKyAgICAgIHVpbnQzMl90IG9iam51bSA9IG1fTmV3T2JqTnVtQXJyYXlbaV07CisgICAgICB3aGlsZSAoaiA8IGlDb3VudCkgeworICAgICAgICBpZiAoKytqID09IGlDb3VudCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgdWludDMyX3QgZHdDdXJyZW50ID0gbV9OZXdPYmpOdW1BcnJheVtqXTsKKyAgICAgICAgaWYgKGR3Q3VycmVudCAtIG9iam51bSA+IDEpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIG9iam51bSA9IGR3Q3VycmVudDsKKyAgICAgIH0KKyAgICAgIG9iam51bSA9IG1fTmV3T2JqTnVtQXJyYXlbaV07CisgICAgICBpZiAob2JqbnVtID09IDEpCisgICAgICAgIHN0ciA9IEJ5dGVTdHJpbmc6OkZvcm1hdCgiMCAlZFxyXG4wMDAwMDAwMDAwIDY1NTM1IGZcclxuIiwgaiAtIGkgKyAxKTsKKyAgICAgIGVsc2UKKyAgICAgICAgc3RyID0gQnl0ZVN0cmluZzo6Rm9ybWF0KCIlZCAlZFxyXG4iLCBvYmpudW0sIGogLSBpKTsKKworICAgICAgaWYgKCFtX0FyY2hpdmUtPldyaXRlQmxvY2soc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSkpCisgICAgICAgIHJldHVybiAtMTsKKworICAgICAgd2hpbGUgKGkgPCBqKSB7CisgICAgICAgIG9iam51bSA9IG1fTmV3T2JqTnVtQXJyYXlbaSsrXTsKKyAgICAgICAgc3RyID0gQnl0ZVN0cmluZzo6Rm9ybWF0KCIlMDEwZCAwMDAwMCBuXHJcbiIsIG1fT2JqZWN0T2Zmc2V0c1tvYmpudW1dKTsKKyAgICAgICAgaWYgKCFtX0FyY2hpdmUtPldyaXRlQmxvY2soc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSkpCisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgIH0KKyAgICBtX2lTdGFnZSA9IDkwOworICB9CisgIHJldHVybiBtX2lTdGFnZTsKK30KKworaW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlRG9jX1N0YWdlNCgpIHsKKyAgQVNTRVJUKG1faVN0YWdlID49IDkwKTsKKworICBib29sIGJYUmVmU3RyZWFtID0gSXNJbmNyZW1lbnRhbCgpICYmIG1fcFBhcnNlci0+SXNYUmVmU3RyZWFtKCk7CisgIGlmICghYlhSZWZTdHJlYW0pIHsKKyAgICBpZiAoIW1fQXJjaGl2ZS0+V3JpdGVTdHJpbmcoInRyYWlsZXJcclxuPDwiKSkKKyAgICAgIHJldHVybiAtMTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIW1fQXJjaGl2ZS0+V3JpdGVEV29yZChtX3BEb2N1bWVudC0+R2V0TGFzdE9iak51bSgpICsgMSkgfHwKKyAgICAgICAgIW1fQXJjaGl2ZS0+V3JpdGVTdHJpbmcoIiAwIG9iaiA8PCIpKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisKKyAgaWYgKG1fcFBhcnNlcikgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0RpY3Rpb25hcnk+IHAgPSBtX3BQYXJzZXItPkdldENvbWJpbmVkVHJhaWxlcigpOworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiAqcCkgeworICAgICAgY29uc3QgQnl0ZVN0cmluZyYga2V5ID0gaXQuZmlyc3Q7CisgICAgICBDUERGX09iamVjdCogcFZhbHVlID0gaXQuc2Vjb25kLmdldCgpOworICAgICAgaWYgKGtleSA9PSAiRW5jcnlwdCIgfHwga2V5ID09ICJTaXplIiB8fCBrZXkgPT0gIkZpbHRlciIgfHwKKyAgICAgICAgICBrZXkgPT0gIkluZGV4IiB8fCBrZXkgPT0gIkxlbmd0aCIgfHwga2V5ID09ICJQcmV2IiB8fCBrZXkgPT0gIlciIHx8CisgICAgICAgICAga2V5ID09ICJYUmVmU3RtIiB8fCBrZXkgPT0gIklEIikgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmICghbV9BcmNoaXZlLT5Xcml0ZVN0cmluZygoIi8iKSkgfHwKKyAgICAgICAgICAhbV9BcmNoaXZlLT5Xcml0ZVN0cmluZyhQREZfTmFtZUVuY29kZShrZXkpLkFzU3RyaW5nVmlldygpKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBpZiAoIXBWYWx1ZS0+SXNJbmxpbmUoKSkgeworICAgICAgICBpZiAoIW1fQXJjaGl2ZS0+V3JpdGVTdHJpbmcoIiAiKSB8fAorICAgICAgICAgICAgIW1fQXJjaGl2ZS0+V3JpdGVEV29yZChwVmFsdWUtPkdldE9iak51bSgpKSB8fAorICAgICAgICAgICAgIW1fQXJjaGl2ZS0+V3JpdGVTdHJpbmcoIiAwIFIgIikpIHsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoIXBWYWx1ZS0+V3JpdGVUbyhtX0FyY2hpdmUuZ2V0KCkpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCFtX0FyY2hpdmUtPldyaXRlU3RyaW5nKCJcclxuL1Jvb3QgIikgfHwKKyAgICAgICAgIW1fQXJjaGl2ZS0+V3JpdGVEV29yZChtX3BEb2N1bWVudC0+R2V0Um9vdCgpLT5HZXRPYmpOdW0oKSkgfHwKKyAgICAgICAgIW1fQXJjaGl2ZS0+V3JpdGVTdHJpbmcoIiAwIFJcclxuIikpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKG1fcERvY3VtZW50LT5HZXRJbmZvKCkpIHsKKyAgICAgIGlmICghbV9BcmNoaXZlLT5Xcml0ZVN0cmluZygiL0luZm8gIikgfHwKKyAgICAgICAgICAhbV9BcmNoaXZlLT5Xcml0ZURXb3JkKG1fcERvY3VtZW50LT5HZXRJbmZvKCktPkdldE9iak51bSgpKSB8fAorICAgICAgICAgICFtX0FyY2hpdmUtPldyaXRlU3RyaW5nKCIgMCBSXHJcbiIpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKG1fcEVuY3J5cHREaWN0KSB7CisgICAgaWYgKCFtX0FyY2hpdmUtPldyaXRlU3RyaW5nKCIvRW5jcnlwdCIpKQorICAgICAgcmV0dXJuIC0xOworCisgICAgdWludDMyX3QgZHdPYmpOdW0gPSBtX3BFbmNyeXB0RGljdC0+R2V0T2JqTnVtKCk7CisgICAgaWYgKGR3T2JqTnVtID09IDApCisgICAgICBkd09iak51bSA9IG1fcERvY3VtZW50LT5HZXRMYXN0T2JqTnVtKCkgKyAxOworICAgIGlmICghbV9BcmNoaXZlLT5Xcml0ZVN0cmluZygiICIpIHx8ICFtX0FyY2hpdmUtPldyaXRlRFdvcmQoZHdPYmpOdW0pIHx8CisgICAgICAgICFtX0FyY2hpdmUtPldyaXRlU3RyaW5nKCIgMCBSICIpKSB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisKKyAgaWYgKCFtX0FyY2hpdmUtPldyaXRlU3RyaW5nKCIvU2l6ZSAiKSB8fAorICAgICAgIW1fQXJjaGl2ZS0+V3JpdGVEV29yZChtX2R3TGFzdE9iak51bSArIChiWFJlZlN0cmVhbSA/IDIgOiAxKSkpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaWYgKElzSW5jcmVtZW50YWwoKSkgeworICAgIEZYX0ZJTEVTSVpFIHByZXYgPSBtX3BQYXJzZXItPkdldExhc3RYUmVmT2Zmc2V0KCk7CisgICAgaWYgKHByZXYpIHsKKyAgICAgIGlmICghbV9BcmNoaXZlLT5Xcml0ZVN0cmluZygiL1ByZXYgIikpCisgICAgICAgIHJldHVybiAtMTsKKworICAgICAgY2hhciBvZmZzZXRfYnVmWzIwXTsKKyAgICAgIG1lbXNldChvZmZzZXRfYnVmLCAwLCBzaXplb2Yob2Zmc2V0X2J1ZikpOworICAgICAgRlhTWVNfaTY0dG9hKHByZXYsIG9mZnNldF9idWYsIDEwKTsKKyAgICAgIGlmICghbV9BcmNoaXZlLT5Xcml0ZUJsb2NrKG9mZnNldF9idWYsIHN0cmxlbihvZmZzZXRfYnVmKSkpCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKyAgaWYgKG1fcElEQXJyYXkpIHsKKyAgICBpZiAoIW1fQXJjaGl2ZS0+V3JpdGVTdHJpbmcoKCIvSUQiKSkgfHwKKyAgICAgICAgIW1fcElEQXJyYXktPldyaXRlVG8obV9BcmNoaXZlLmdldCgpKSkgeworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorICBpZiAoIWJYUmVmU3RyZWFtKSB7CisgICAgaWYgKCFtX0FyY2hpdmUtPldyaXRlU3RyaW5nKCI+PiIpKQorICAgICAgcmV0dXJuIC0xOworICB9IGVsc2UgeworICAgIGlmICghbV9BcmNoaXZlLT5Xcml0ZVN0cmluZygiL1dbMCA0IDFdL0luZGV4WyIpKQorICAgICAgcmV0dXJuIC0xOworICAgIGlmIChJc0luY3JlbWVudGFsKCkgJiYgbV9wUGFyc2VyICYmIG1fcFBhcnNlci0+R2V0TGFzdFhSZWZPZmZzZXQoKSA9PSAwKSB7CisgICAgICB1aW50MzJfdCBpID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBtX2R3TGFzdE9iak51bTsgaSsrKSB7CisgICAgICAgIGlmICghcGRmaXVtOjpDb250YWluc0tleShtX09iamVjdE9mZnNldHMsIGkpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIW1fQXJjaGl2ZS0+V3JpdGVEV29yZChpKSB8fCAhbV9BcmNoaXZlLT5Xcml0ZVN0cmluZygiIDEgIikpCisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgaWYgKCFtX0FyY2hpdmUtPldyaXRlU3RyaW5nKCJdL0xlbmd0aCAiKSB8fAorICAgICAgICAgICFtX0FyY2hpdmUtPldyaXRlRFdvcmQobV9kd0xhc3RPYmpOdW0gKiA1KSB8fAorICAgICAgICAgICFtX0FyY2hpdmUtPldyaXRlU3RyaW5nKCI+PnN0cmVhbVxyXG4iKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9kd0xhc3RPYmpOdW07IGkrKykgeworICAgICAgICBhdXRvIGl0ID0gbV9PYmplY3RPZmZzZXRzLmZpbmQoaSk7CisgICAgICAgIGlmIChpdCA9PSBtX09iamVjdE9mZnNldHMuZW5kKCkpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIE91dHB1dEluZGV4KG1fQXJjaGl2ZS5nZXQoKSwgaXQtPnNlY29uZCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHNpemVfdCBjb3VudCA9IG1fTmV3T2JqTnVtQXJyYXkuc2l6ZSgpOworICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKCFtX0FyY2hpdmUtPldyaXRlRFdvcmQobV9OZXdPYmpOdW1BcnJheVtpXSkgfHwKKyAgICAgICAgICAgICFtX0FyY2hpdmUtPldyaXRlU3RyaW5nKCIgMSAiKSkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFtX0FyY2hpdmUtPldyaXRlU3RyaW5nKCJdL0xlbmd0aCAiKSB8fAorICAgICAgICAgICFtX0FyY2hpdmUtPldyaXRlRFdvcmQoY291bnQgKiA1KSB8fAorICAgICAgICAgICFtX0FyY2hpdmUtPldyaXRlU3RyaW5nKCI+PnN0cmVhbVxyXG4iKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKyAgICAgICAgT3V0cHV0SW5kZXgobV9BcmNoaXZlLmdldCgpLCBtX09iamVjdE9mZnNldHNbbV9OZXdPYmpOdW1BcnJheVtpXV0pOworICAgIH0KKyAgICBpZiAoIW1fQXJjaGl2ZS0+V3JpdGVTdHJpbmcoIlxyXG5lbmRzdHJlYW0iKSkKKyAgICAgIHJldHVybiAtMTsKKyAgfQorCisgIGlmICghbV9BcmNoaXZlLT5Xcml0ZVN0cmluZygiXHJcbnN0YXJ0eHJlZlxyXG4iKSkKKyAgICByZXR1cm4gLTE7CisKKyAgY2hhciBvZmZzZXRfYnVmWzIwXTsKKyAgbWVtc2V0KG9mZnNldF9idWYsIDAsIHNpemVvZihvZmZzZXRfYnVmKSk7CisgIEZYU1lTX2k2NHRvYShtX1hyZWZTdGFydCwgb2Zmc2V0X2J1ZiwgMTApOworICBpZiAoIW1fQXJjaGl2ZS0+V3JpdGVCbG9jayhvZmZzZXRfYnVmLCBzdHJsZW4ob2Zmc2V0X2J1ZikpIHx8CisgICAgICAhbV9BcmNoaXZlLT5Xcml0ZVN0cmluZygiXHJcbiUlRU9GXHJcbiIpKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgbV9pU3RhZ2UgPSAxMDA7CisgIHJldHVybiBtX2lTdGFnZTsKK30KKworYm9vbCBDUERGX0NyZWF0b3I6OkNyZWF0ZSh1aW50MzJfdCBmbGFncykgeworICBtX2R3RmxhZ3MgPSBmbGFnczsKKyAgbV9pU3RhZ2UgPSAwOworICBtX2R3TGFzdE9iak51bSA9IG1fcERvY3VtZW50LT5HZXRMYXN0T2JqTnVtKCk7CisgIG1fT2JqZWN0T2Zmc2V0cy5jbGVhcigpOworICBtX05ld09iak51bUFycmF5LmNsZWFyKCk7CisKKyAgSW5pdElEKCk7CisgIHJldHVybiBDb250aW51ZSgpID4gLTE7Cit9CisKK3ZvaWQgQ1BERl9DcmVhdG9yOjpJbml0SUQoKSB7CisgIGNvbnN0IENQREZfQXJyYXkqIHBPbGRJREFycmF5ID0gbV9wUGFyc2VyID8gbV9wUGFyc2VyLT5HZXRJREFycmF5KCkgOiBudWxscHRyOworCisgIGJvb2wgaWRBcnJheVByZUV4aXN0aW5nID0gISFtX3BJREFycmF5OworICBpZiAoIWlkQXJyYXlQcmVFeGlzdGluZykgeworICAgIG1fcElEQXJyYXkgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9BcnJheT4oKTsKKyAgICBDUERGX09iamVjdCogcElEMSA9IHBPbGRJREFycmF5ID8gcE9sZElEQXJyYXktPkdldE9iamVjdEF0KDApIDogbnVsbHB0cjsKKyAgICBpZiAocElEMSkgeworICAgICAgbV9wSURBcnJheS0+QWRkKHBJRDEtPkNsb25lKCkpOworICAgIH0gZWxzZSB7CisgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXIgPQorICAgICAgICAgIEdlbmVyYXRlRmlsZUlEKCh1aW50MzJfdCkodWludHB0cl90KXRoaXMsIG1fZHdMYXN0T2JqTnVtKTsKKyAgICAgIEJ5dGVTdHJpbmcgYnNCdWZmZXIoYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSk7CisgICAgICBtX3BJREFycmF5LT5BZGROZXc8Q1BERl9TdHJpbmc+KGJzQnVmZmVyLCB0cnVlKTsKKyAgICB9CisgIH0KKworICBpZiAocE9sZElEQXJyYXkpIHsKKyAgICBDUERGX09iamVjdCogcElEMiA9IHBPbGRJREFycmF5LT5HZXRPYmplY3RBdCgxKTsKKyAgICBpZiAoSXNJbmNyZW1lbnRhbCgpICYmIG1fcEVuY3J5cHREaWN0ICYmIHBJRDIpIHsKKyAgICAgIG1fcElEQXJyYXktPkFkZChwSUQyLT5DbG9uZSgpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyID0KKyAgICAgICAgR2VuZXJhdGVGaWxlSUQoKHVpbnQzMl90KSh1aW50cHRyX3QpdGhpcywgbV9kd0xhc3RPYmpOdW0pOworICAgIEJ5dGVTdHJpbmcgYnNCdWZmZXIoYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSk7CisgICAgbV9wSURBcnJheS0+QWRkTmV3PENQREZfU3RyaW5nPihic0J1ZmZlciwgdHJ1ZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgbV9wSURBcnJheS0+QWRkKG1fcElEQXJyYXktPkdldE9iamVjdEF0KDApLT5DbG9uZSgpKTsKKyAgaWYgKG1fcEVuY3J5cHREaWN0ICYmICFwT2xkSURBcnJheSAmJiBtX3BQYXJzZXIgJiYgIWlkQXJyYXlQcmVFeGlzdGluZykgeworICAgIGlmIChtX3BFbmNyeXB0RGljdC0+R2V0U3RyaW5nRm9yKCJGaWx0ZXIiKSA9PSAiU3RhbmRhcmQiKSB7CisgICAgICBCeXRlU3RyaW5nIHVzZXJfcGFzcyA9IG1fcFBhcnNlci0+R2V0UGFzc3dvcmQoKTsKKyAgICAgIG1fcFNlY3VyaXR5SGFuZGxlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1NlY3VyaXR5SGFuZGxlcj4oKTsKKyAgICAgIG1fcFNlY3VyaXR5SGFuZGxlci0+T25DcmVhdGUobV9wRW5jcnlwdERpY3QuR2V0KCksIG1fcElEQXJyYXkuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJfcGFzcyk7CisgICAgICBtX2JTZWN1cml0eUNoYW5nZWQgPSB0cnVlOworICAgIH0KKyAgfQorfQorCitpbnQzMl90IENQREZfQ3JlYXRvcjo6Q29udGludWUoKSB7CisgIGlmIChtX2lTdGFnZSA8IDApCisgICAgcmV0dXJuIG1faVN0YWdlOworCisgIGludDMyX3QgaVJldCA9IDA7CisgIHdoaWxlIChtX2lTdGFnZSA8IDEwMCkgeworICAgIGlmIChtX2lTdGFnZSA8IDIwKQorICAgICAgaVJldCA9IFdyaXRlRG9jX1N0YWdlMSgpOworICAgIGVsc2UgaWYgKG1faVN0YWdlIDwgMzApCisgICAgICBpUmV0ID0gV3JpdGVEb2NfU3RhZ2UyKCk7CisgICAgZWxzZSBpZiAobV9pU3RhZ2UgPCA5MCkKKyAgICAgIGlSZXQgPSBXcml0ZURvY19TdGFnZTMoKTsKKyAgICBlbHNlCisgICAgICBpUmV0ID0gV3JpdGVEb2NfU3RhZ2U0KCk7CisKKyAgICBpZiAoaVJldCA8IG1faVN0YWdlKQorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoaVJldCA8IDEgfHwgbV9pU3RhZ2UgPT0gMTAwKSB7CisgICAgbV9pU3RhZ2UgPSAtMTsKKyAgICByZXR1cm4gaVJldCA+IDk5ID8gMCA6IChpUmV0IDwgMSA/IC0xIDogaVJldCk7CisgIH0KKyAgcmV0dXJuIG1faVN0YWdlOworfQorCitib29sIENQREZfQ3JlYXRvcjo6U2V0RmlsZVZlcnNpb24oaW50MzJfdCBmaWxlVmVyc2lvbikgeworICBpZiAoZmlsZVZlcnNpb24gPCAxMCB8fCBmaWxlVmVyc2lvbiA+IDE3KQorICAgIHJldHVybiBmYWxzZTsKKyAgbV9GaWxlVmVyc2lvbiA9IGZpbGVWZXJzaW9uOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDUERGX0NyZWF0b3I6OlJlbW92ZVNlY3VyaXR5KCkgeworICBtX3BTZWN1cml0eUhhbmRsZXIuUmVzZXQoKTsKKyAgbV9iU2VjdXJpdHlDaGFuZ2VkID0gdHJ1ZTsKKyAgbV9wRW5jcnlwdERpY3QgPSBudWxscHRyOworfQorCitDUERGX0NyeXB0b0hhbmRsZXIqIENQREZfQ3JlYXRvcjo6R2V0Q3J5cHRvSGFuZGxlcigpIHsKKyAgcmV0dXJuIG1fcFNlY3VyaXR5SGFuZGxlciA/IG1fcFNlY3VyaXR5SGFuZGxlci0+R2V0Q3J5cHRvSGFuZGxlcigpIDogbnVsbHB0cjsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9lZGl0L2NwZGZfY3JlYXRvci5oIGIvY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9jcmVhdG9yLmgKaW5kZXggMDg0MGU0Yi4uNGMxZDBmMSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9jcmVhdG9yLmgKKysrIGIvY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9jcmVhdG9yLmgKQEAgLTcsOTQgKzcsOTYgQEAKICNpZm5kZWYgQ09SRV9GUERGQVBJX0VESVRfQ1BERl9DUkVBVE9SX0hfCiAjZGVmaW5lIENPUkVfRlBERkFQSV9FRElUX0NQREZfQ1JFQVRPUl9IXwogCisjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9tYXliZV9vd25lZC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKIAogY2xhc3MgQ1BERl9BcnJheTsKIGNsYXNzIENQREZfQ3J5cHRvSGFuZGxlcjsKK2NsYXNzIENQREZfU2VjdXJpdHlIYW5kbGVyOwogY2xhc3MgQ1BERl9EaWN0aW9uYXJ5OwogY2xhc3MgQ1BERl9Eb2N1bWVudDsKIGNsYXNzIENQREZfT2JqZWN0OwogY2xhc3MgQ1BERl9QYXJzZXI7Ci1jbGFzcyBDUERGX1hSZWZTdHJlYW07CiAKICNkZWZpbmUgRlBERkNSRUFURV9JTkNSRU1FTlRBTCAxCiAjZGVmaW5lIEZQREZDUkVBVEVfTk9fT1JJR0lOQUwgMgotI2RlZmluZSBGUERGQ1JFQVRFX1BST0dSRVNTSVZFIDQKLSNkZWZpbmUgRlBERkNSRUFURV9PQkpFQ1RTVFJFQU0gOAotCi1DRlhfQnl0ZVRleHRCdWYmIG9wZXJhdG9yPDwoQ0ZYX0J5dGVUZXh0QnVmJiBidWYsIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKTsKIAogY2xhc3MgQ1BERl9DcmVhdG9yIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IENQREZfQ3JlYXRvcihDUERGX0RvY3VtZW50KiBwRG9jKTsKKyAgZXhwbGljaXQgQ1BERl9DcmVhdG9yKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8SUZYX1dyaXRlU3RyZWFtPiYgYXJjaGl2ZSk7CiAgIH5DUERGX0NyZWF0b3IoKTsKIAogICB2b2lkIFJlbW92ZVNlY3VyaXR5KCk7Ci0gIGJvb2wgQ3JlYXRlKGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1dyaXRlU3RyZWFtPiYgcEZpbGUsIHVpbnQzMl90IGZsYWdzID0gMCk7Ci0gIGludDMyX3QgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UgPSBudWxscHRyKTsKLSAgYm9vbCBTZXRGaWxlVmVyc2lvbihpbnQzMl90IGZpbGVWZXJzaW9uID0gMTcpOworICBib29sIENyZWF0ZSh1aW50MzJfdCBmbGFncyk7CisgIGludDMyX3QgQ29udGludWUoKTsKKyAgYm9vbCBTZXRGaWxlVmVyc2lvbihpbnQzMl90IGZpbGVWZXJzaW9uKTsKKworICBJRlhfQXJjaGl2ZVN0cmVhbSogR2V0QXJjaGl2ZSgpIHsgcmV0dXJuIG1fQXJjaGl2ZS5nZXQoKTsgfQorCisgIHVpbnQzMl90IEdldE5leHRPYmplY3ROdW1iZXIoKSB7IHJldHVybiArK21fZHdMYXN0T2JqTnVtOyB9CisgIHVpbnQzMl90IEdldExhc3RPYmplY3ROdW1iZXIoKSBjb25zdCB7IHJldHVybiBtX2R3TGFzdE9iak51bTsgfQorICBDUERGX0NyeXB0b0hhbmRsZXIqIEdldENyeXB0b0hhbmRsZXIoKTsKKyAgQ1BERl9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BEb2N1bWVudC5HZXQoKTsgfQorICBDUERGX0FycmF5KiBHZXRJREFycmF5KCkgY29uc3QgeyByZXR1cm4gbV9wSURBcnJheS5nZXQoKTsgfQorICBDUERGX0RpY3Rpb25hcnkqIEdldEVuY3J5cHREaWN0KCkgY29uc3QgeyByZXR1cm4gbV9wRW5jcnlwdERpY3QuR2V0KCk7IH0KKyAgdWludDMyX3QgR2V0RW5jcnlwdE9iamVjdE51bWJlcigpIGNvbnN0IHsgcmV0dXJuIG1fZHdFbmNyeXB0T2JqTnVtOyB9CisKKyAgdWludDMyX3QgR2V0T2JqZWN0T2Zmc2V0KHVpbnQzMl90IG9iam51bSkgeyByZXR1cm4gbV9PYmplY3RPZmZzZXRzW29iam51bV07IH0KKyAgYm9vbCBIYXNPYmplY3ROdW1iZXIodWludDMyX3Qgb2JqbnVtKSB7CisgICAgcmV0dXJuIG1fT2JqZWN0T2Zmc2V0cy5maW5kKG9iam51bSkgIT0gbV9PYmplY3RPZmZzZXRzLmVuZCgpOworICB9CisgIHZvaWQgU2V0T2JqZWN0T2Zmc2V0KHVpbnQzMl90IG9iam51bSwgRlhfRklMRVNJWkUgb2Zmc2V0KSB7CisgICAgbV9PYmplY3RPZmZzZXRzW29iam51bV0gPSBvZmZzZXQ7CisgIH0KKyAgYm9vbCBJc0luY3JlbWVudGFsKCkgY29uc3QgeyByZXR1cm4gISEobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCk7IH0KKyAgYm9vbCBJc09yaWdpbmFsKCkgY29uc3QgeyByZXR1cm4gIShtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX05PX09SSUdJTkFMKTsgfQogCiAgcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIENQREZfT2JqZWN0U3RyZWFtOwotICBmcmllbmQgY2xhc3MgQ1BERl9YUmVmU3RyZWFtOwotCi0gIGJvb2wgQ3JlYXRlKHVpbnQzMl90IGZsYWdzKTsKLSAgdm9pZCBSZXNldFN0YW5kYXJkU2VjdXJpdHkoKTsKICAgdm9pZCBDbGVhcigpOwogCiAgIHZvaWQgSW5pdE9sZE9iak51bU9mZnNldHMoKTsKICAgdm9pZCBJbml0TmV3T2JqTnVtT2Zmc2V0cygpOwotICB2b2lkIEluaXRJRChib29sIGJEZWZhdWx0ID0gdHJ1ZSk7CisgIHZvaWQgSW5pdElEKCk7CiAKLSAgdm9pZCBBcHBlbmROZXdPYmpOdW0odWludDMyX3Qgb2JqYnVtKTsKLSAgaW50MzJfdCBBcHBlbmRPYmplY3ROdW1iZXJUb1hSZWYodWludDMyX3Qgb2JqbnVtKTsKKyAgaW50MzJfdCBXcml0ZURvY19TdGFnZTEoKTsKKyAgaW50MzJfdCBXcml0ZURvY19TdGFnZTIoKTsKKyAgaW50MzJfdCBXcml0ZURvY19TdGFnZTMoKTsKKyAgaW50MzJfdCBXcml0ZURvY19TdGFnZTQoKTsKIAotICBpbnQzMl90IFdyaXRlRG9jX1N0YWdlMShJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gIGludDMyX3QgV3JpdGVEb2NfU3RhZ2UyKElGWF9QYXVzZSogcFBhdXNlKTsKLSAgaW50MzJfdCBXcml0ZURvY19TdGFnZTMoSUZYX1BhdXNlKiBwUGF1c2UpOwotICBpbnQzMl90IFdyaXRlRG9jX1N0YWdlNChJRlhfUGF1c2UqIHBQYXVzZSk7CisgIGJvb2wgV3JpdGVPbGRJbmRpcmVjdE9iamVjdCh1aW50MzJfdCBvYmpudW0pOworICBib29sIFdyaXRlT2xkT2JqcygpOworICBib29sIFdyaXRlTmV3T2JqcygpOworICBib29sIFdyaXRlRGlyZWN0T2JqKHVpbnQzMl90IG9iam51bSwgY29uc3QgQ1BERl9PYmplY3QqIHBPYmosIGJvb2wgYkVuY3J5cHQpOworICBib29sIFdyaXRlSW5kaXJlY3RPYmoodWludDMyX3Qgb2JqbnVtLCBjb25zdCBDUERGX09iamVjdCogcE9iaik7CiAKLSAgaW50MzJfdCBXcml0ZU9sZEluZGlyZWN0T2JqZWN0KHVpbnQzMl90IG9iam51bSk7Ci0gIGludDMyX3QgV3JpdGVPbGRPYmpzKElGWF9QYXVzZSogcFBhdXNlKTsKLSAgaW50MzJfdCBXcml0ZU5ld09ianMoYm9vbCBiSW5jcmVtZW50YWwsIElGWF9QYXVzZSogcFBhdXNlKTsKLSAgaW50MzJfdCBXcml0ZUluZGlyZWN0T2JqKGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKTsKLSAgaW50MzJfdCBXcml0ZURpcmVjdE9iaih1aW50MzJfdCBvYmpudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9PYmplY3QqIHBPYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRW5jcnlwdCA9IHRydWUpOwotICBpbnQzMl90IFdyaXRlSW5kaXJlY3RPYmplY3RUb1N0cmVhbShjb25zdCBDUERGX09iamVjdCogcE9iaik7Ci0gIGludDMyX3QgV3JpdGVJbmRpcmVjdE9iaih1aW50MzJfdCBvYmpudW0sIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKTsKLSAgaW50MzJfdCBXcml0ZUluZGlyZWN0T2JqZWN0VG9TdHJlYW0odWludDMyX3Qgb2JqbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1NpemUpOworICBib29sIFdyaXRlU3RyZWFtKGNvbnN0IENQREZfT2JqZWN0KiBwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9iam51bSwKKyAgICAgICAgICAgICAgICAgICBDUERGX0NyeXB0b0hhbmRsZXIqIHBDcnlwdG8pOwogCi0gIGludDMyX3QgV3JpdGVTdHJlYW0oY29uc3QgQ1BERl9PYmplY3QqIHBTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2JqbnVtLAotICAgICAgICAgICAgICAgICAgICAgIENQREZfQ3J5cHRvSGFuZGxlciogcENyeXB0byk7CisgIGJvb2wgSXNYUmVmTmVlZEVuZCgpOwogCi0gIENQREZfRG9jdW1lbnQqIGNvbnN0IG1fcERvY3VtZW50OwotICBDUERGX1BhcnNlciogY29uc3QgbV9wUGFyc2VyOworICBVbm93bmVkUHRyPENQREZfRG9jdW1lbnQ+IGNvbnN0IG1fcERvY3VtZW50OworICBVbm93bmVkUHRyPENQREZfUGFyc2VyPiBjb25zdCBtX3BQYXJzZXI7CiAgIGJvb2wgbV9iU2VjdXJpdHlDaGFuZ2VkOwotICBDUERGX0RpY3Rpb25hcnkqIG1fcEVuY3J5cHREaWN0OworICBVbm93bmVkUHRyPENQREZfRGljdGlvbmFyeT4gbV9wRW5jcnlwdERpY3Q7CiAgIHVpbnQzMl90IG1fZHdFbmNyeXB0T2JqTnVtOwotICBib29sIG1fYkVuY3J5cHRDbG9uZWQ7Ci0gIENQREZfQ3J5cHRvSGFuZGxlciogbV9wQ3J5cHRvSGFuZGxlcjsKLSAgLy8gV2hldGhlciB0aGlzIG93bnMgdGhlIGNyeXB0byBoYW5kbGVyIHxtX3BDcnlwdG9IYW5kbGVyfC4KLSAgYm9vbCBtX2JMb2NhbENyeXB0b0hhbmRsZXI7Ci0gIENQREZfT2JqZWN0KiBtX3BNZXRhZGF0YTsKLSAgc3RkOjp1bmlxdWVfcHRyPENQREZfWFJlZlN0cmVhbT4gbV9wWFJlZlN0cmVhbTsKLSAgaW50MzJfdCBtX09iamVjdFN0cmVhbVNpemU7CisgIGZ4Y3J0OjpNYXliZU93bmVkPENQREZfU2VjdXJpdHlIYW5kbGVyPiBtX3BTZWN1cml0eUhhbmRsZXI7CisgIFVub3duZWRQdHI8Q1BERl9PYmplY3Q+IG1fcE1ldGFkYXRhOwogICB1aW50MzJfdCBtX2R3TGFzdE9iak51bTsKLSAgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlIG1fRmlsZTsKLSAgRlhfRklMRVNJWkUgbV9PZmZzZXQ7CisgIHN0ZDo6dW5pcXVlX3B0cjxJRlhfQXJjaGl2ZVN0cmVhbT4gbV9BcmNoaXZlOworICBGWF9GSUxFU0laRSBtX1NhdmVkT2Zmc2V0OwogICBpbnQzMl90IG1faVN0YWdlOwogICB1aW50MzJfdCBtX2R3RmxhZ3M7Ci0gIEZYX1BPU0lUSU9OIG1fUG9zOworICB1aW50MzJfdCBtX0N1ck9iak51bTsKICAgRlhfRklMRVNJWkUgbV9YcmVmU3RhcnQ7Ci0gIENGWF9GaWxlU2l6ZUxpc3RBcnJheSBtX09iamVjdE9mZnNldDsKKyAgc3RkOjptYXA8dWludDMyX3QsIEZYX0ZJTEVTSVpFPiBtX09iamVjdE9mZnNldHM7CiAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBtX05ld09iak51bUFycmF5OyAgLy8gU29ydGVkLCBhc2NlbmRpbmcuCiAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0FycmF5PiBtX3BJREFycmF5OwogICBpbnQzMl90IG1fRmlsZVZlcnNpb247CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX2NyZWF0b3JfZW1iZWRkZXJ0ZXN0LmNwcCBiL2NvcmUvZnBkZmFwaS9lZGl0L2NwZGZfY3JlYXRvcl9lbWJlZGRlcnRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZjdkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX2NyZWF0b3JfZW1iZWRkZXJ0ZXN0LmNwcApAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfYW5ub3QuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9lZGl0LmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCisjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK2NsYXNzIENQREZfQ3JlYXRvckVtYmVkZGVyVGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3Qge307CisKK1RFU1RfRihDUERGX0NyZWF0b3JFbWJlZGRlclRlc3QsIFNhdmVkRG9jc0FyZUVxdWFsQWZ0ZXJQYXJzZSkgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoImFubm90YXRpb25fc3RhbXBfd2l0aF9hcC5wZGYiKSk7CisgIC8vIFNhdmUgd2l0aG91dCBhZGRpdGlvbmFsIGRhdGEgcmVhZGluZy4KKyAgRVhQRUNUX1RSVUUoRlBERl9TYXZlQXNDb3B5KGRvY3VtZW50KCksIHRoaXMsIDApKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgc2F2ZWRfZG9jXzEgPSBHZXRTdHJpbmcoKTsKKyAgQ2xlYXJTdHJpbmcoKTsKKworICB7CisgICAgLy8gRG8gc29tZSByZWFkIG9ubHkgb3BlcmF0aW9ucy4KKyAgICBBU1NFUlRfR0UoMSwgRlBERl9HZXRQYWdlQ291bnQoZG9jdW1lbnQoKSkpOworICAgIEZQREZfUEFHRSBwYWdlID0gRlBERl9Mb2FkUGFnZShkb2N1bWVudCgpLCAwKTsKKyAgICBBU1NFUlRfVFJVRShwYWdlKTsKKyAgICBGUERGX0JJVE1BUCBuZXdfYml0bWFwID0KKyAgICAgICAgUmVuZGVyUGFnZVdpdGhGbGFncyhwYWdlLCBmb3JtX2hhbmRsZSgpLCBGUERGX0FOTk9UKTsKKyAgICBGUERGQml0bWFwX0Rlc3Ryb3kobmV3X2JpdG1hcCk7CisgICAgVW5sb2FkUGFnZShwYWdlKTsKKyAgfQorCisgIC8vIFNhdmUgd2hlbiB3ZSBoYXZlIGFkZGl0aW9uYWwgbG9hZGVkIGRhdGEuCisgIEVYUEVDVF9UUlVFKEZQREZfU2F2ZUFzQ29weShkb2N1bWVudCgpLCB0aGlzLCAwKSk7CisgIGNvbnN0IHN0ZDo6c3RyaW5nIHNhdmVkX2RvY18yID0gR2V0U3RyaW5nKCk7CisgIENsZWFyU3RyaW5nKCk7CisKKyAgLy8gVGhlIHNpemVzIG9mIHNhdmVkIGRvY3Mgc2hvdWxkIGJlIGVxdWFsLgorICBFWFBFQ1RfRVEoc2F2ZWRfZG9jXzEuc2l6ZSgpLCBzYXZlZF9kb2NfMi5zaXplKCkpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9lbmNyeXB0b3IuY3BwIGIvY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9lbmNyeXB0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OGI1YjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX2VuY3J5cHRvci5jcHAKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9lbmNyeXB0b3IuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfY3J5cHRvX2hhbmRsZXIuaCIKKworQ1BERl9FbmNyeXB0b3I6OkNQREZfRW5jcnlwdG9yKENQREZfQ3J5cHRvSGFuZGxlciogcEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9iam51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc2l6ZSkKKyAgICA6IG1fcERhdGEobnVsbHB0ciksIG1fZHdTaXplKDApLCBtX2JOZXdCdWYoZmFsc2UpIHsKKyAgaWYgKHNyY19zaXplID09IDApCisgICAgcmV0dXJuOworCisgIGlmICghcEhhbmRsZXIpIHsKKyAgICBtX3BEYXRhID0gKHVpbnQ4X3QqKXNyY19kYXRhOworICAgIG1fZHdTaXplID0gc3JjX3NpemU7CisgICAgcmV0dXJuOworICB9CisgIG1fZHdTaXplID0gcEhhbmRsZXItPkVuY3J5cHRHZXRTaXplKG9iam51bSwgMCwgc3JjX2RhdGEsIHNyY19zaXplKTsKKyAgbV9wRGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fZHdTaXplKTsKKyAgcEhhbmRsZXItPkVuY3J5cHRDb250ZW50KG9iam51bSwgMCwgc3JjX2RhdGEsIHNyY19zaXplLCBtX3BEYXRhLCBtX2R3U2l6ZSk7CisgIG1fYk5ld0J1ZiA9IHRydWU7Cit9CisKK0NQREZfRW5jcnlwdG9yOjp+Q1BERl9FbmNyeXB0b3IoKSB7CisgIGlmIChtX2JOZXdCdWYpCisgICAgRlhfRnJlZShtX3BEYXRhKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9lZGl0L2NwZGZfZW5jcnlwdG9yLmggYi9jb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX2VuY3J5cHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYzkzMzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX2VuY3J5cHRvci5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZQREZBUElfRURJVF9DUERGX0VOQ1JZUFRPUl9IXworI2RlZmluZSBDT1JFX0ZQREZBUElfRURJVF9DUERGX0VOQ1JZUFRPUl9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK2NsYXNzIENQREZfQ3J5cHRvSGFuZGxlcjsKKworY2xhc3MgQ1BERl9FbmNyeXB0b3IgeworIHB1YmxpYzoKKyAgQ1BERl9FbmNyeXB0b3IoQ1BERl9DcnlwdG9IYW5kbGVyKiBwSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgaW50IG9iam51bSwKKyAgICAgICAgICAgICAgICAgdWludDhfdCogc3JjX2RhdGEsCisgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY19zaXplKTsKKyAgfkNQREZfRW5jcnlwdG9yKCk7CisKKyAgdWludDMyX3QgR2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZHdTaXplOyB9CisgIHVpbnQ4X3QqIEdldERhdGEoKSBjb25zdCB7IHJldHVybiBtX3BEYXRhOyB9CisKKyBwcml2YXRlOgorICB1aW50OF90KiBtX3BEYXRhOworICB1aW50MzJfdCBtX2R3U2l6ZTsKKyAgYm9vbCBtX2JOZXdCdWY7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9FRElUX0NQREZfRU5DUllQVE9SX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX2ZsYXRlZW5jb2Rlci5jcHAgYi9jb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX2ZsYXRlZW5jb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1ZGE4NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnBkZmFwaS9lZGl0L2NwZGZfZmxhdGVlbmNvZGVyLmNwcApAQCAtMCwwICsxLDU2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX2ZsYXRlZW5jb2Rlci5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX25hbWUuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbnVtYmVyLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGUuaCIKKworQ1BERl9GbGF0ZUVuY29kZXI6OkNQREZfRmxhdGVFbmNvZGVyKENQREZfU3RyZWFtKiBwU3RyZWFtLCBib29sIGJGbGF0ZUVuY29kZSkKKyAgICA6IG1fZHdTaXplKDApLCBtX3BBY2MocGRmaXVtOjpNYWtlUmV0YWluPENQREZfU3RyZWFtQWNjPihwU3RyZWFtKSkgeworICBtX3BBY2MtPkxvYWRBbGxEYXRhUmF3KCk7CisKKyAgYm9vbCBiSGFzRmlsdGVyID0gcFN0cmVhbSAmJiBwU3RyZWFtLT5IYXNGaWx0ZXIoKTsKKyAgaWYgKGJIYXNGaWx0ZXIgJiYgIWJGbGF0ZUVuY29kZSkgeworICAgIGF1dG8gcERlc3RBY2MgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERl9TdHJlYW1BY2M+KHBTdHJlYW0pOworICAgIHBEZXN0QWNjLT5Mb2FkQWxsRGF0YUZpbHRlcmVkKCk7CisKKyAgICBtX2R3U2l6ZSA9IHBEZXN0QWNjLT5HZXRTaXplKCk7CisgICAgbV9wRGF0YSA9IHBEZXN0QWNjLT5EZXRhY2hEYXRhKCk7CisgICAgbV9wRGljdCA9IFRvRGljdGlvbmFyeShwU3RyZWFtLT5HZXREaWN0KCktPkNsb25lKCkpOworICAgIG1fcERpY3QtPlJlbW92ZUZvcigiRmlsdGVyIik7CisgICAgcmV0dXJuOworICB9CisgIGlmIChiSGFzRmlsdGVyIHx8ICFiRmxhdGVFbmNvZGUpIHsKKyAgICBtX3BEYXRhID0gY29uc3RfY2FzdDx1aW50OF90Kj4obV9wQWNjLT5HZXREYXRhKCkpOworICAgIG1fZHdTaXplID0gbV9wQWNjLT5HZXRTaXplKCk7CisgICAgbV9wRGljdCA9IHBTdHJlYW0tPkdldERpY3QoKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBUT0RPKHRoZXN0aWcpOiBNb3ZlIHRvIEluaXQoKSBhbmQgY2hlY2sgcmV0dXJuIHZhbHVlLgorICB1aW50OF90KiBidWZmZXIgPSBudWxscHRyOworICA6OkZsYXRlRW5jb2RlKG1fcEFjYy0+R2V0RGF0YSgpLCBtX3BBY2MtPkdldFNpemUoKSwgJmJ1ZmZlciwgJm1fZHdTaXplKTsKKworICBtX3BEYXRhID0gc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+KGJ1ZmZlcik7CisgIG1fcERpY3QgPSBUb0RpY3Rpb25hcnkocFN0cmVhbS0+R2V0RGljdCgpLT5DbG9uZSgpKTsKKyAgbV9wRGljdC0+U2V0TmV3Rm9yPENQREZfTnVtYmVyPigiTGVuZ3RoIiwgc3RhdGljX2Nhc3Q8aW50PihtX2R3U2l6ZSkpOworICBtX3BEaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiRmlsdGVyIiwgIkZsYXRlRGVjb2RlIik7CisgIG1fcERpY3QtPlJlbW92ZUZvcigiRGVjb2RlUGFybXMiKTsKK30KKworQ1BERl9GbGF0ZUVuY29kZXI6On5DUERGX0ZsYXRlRW5jb2RlcigpIHt9CisKK3ZvaWQgQ1BERl9GbGF0ZUVuY29kZXI6OkNsb25lRGljdCgpIHsKKyAgaWYgKG1fcERpY3QuSXNPd25lZCgpKQorICAgIHJldHVybjsKKworICBtX3BEaWN0ID0gVG9EaWN0aW9uYXJ5KG1fcERpY3QtPkNsb25lKCkpOworICBBU1NFUlQobV9wRGljdC5Jc093bmVkKCkpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9mbGF0ZWVuY29kZXIuaCBiL2NvcmUvZnBkZmFwaS9lZGl0L2NwZGZfZmxhdGVlbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3ODE2YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnBkZmFwaS9lZGl0L2NwZGZfZmxhdGVlbmNvZGVyLmgKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlBERkFQSV9FRElUX0NQREZfRkxBVEVFTkNPREVSX0hfCisjZGVmaW5lIENPUkVfRlBERkFQSV9FRElUX0NQREZfRkxBVEVFTkNPREVSX0hfCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW1fYWNjLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9tZW1vcnkuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L21heWJlX293bmVkLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisKK2NsYXNzIENQREZfU3RyZWFtOworCitjbGFzcyBDUERGX0ZsYXRlRW5jb2RlciB7CisgcHVibGljOgorICBDUERGX0ZsYXRlRW5jb2RlcihDUERGX1N0cmVhbSogcFN0cmVhbSwgYm9vbCBiRmxhdGVFbmNvZGUpOworICB+Q1BERl9GbGF0ZUVuY29kZXIoKTsKKworICB2b2lkIENsb25lRGljdCgpOworCisgIHVpbnQzMl90IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBtX2R3U2l6ZTsgfQorICB1aW50OF90KiBHZXREYXRhKCkgY29uc3QgeyByZXR1cm4gbV9wRGF0YS5HZXQoKTsgfQorCisgIENQREZfRGljdGlvbmFyeSogR2V0RGljdCgpIHsgcmV0dXJuIG1fcERpY3QuR2V0KCk7IH0KKworIHByaXZhdGU6CisgIHVpbnQzMl90IG1fZHdTaXplOworICBNYXliZU93bmVkPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IG1fcERhdGE7CisgIE1heWJlT3duZWQ8Q1BERl9EaWN0aW9uYXJ5PiBtX3BEaWN0OworICBSZXRhaW5QdHI8Q1BERl9TdHJlYW1BY2M+IG1fcEFjYzsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GUERGQVBJX0VESVRfQ1BERl9GTEFURUVOQ09ERVJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9lZGl0L2NwZGZfcGFnZWNvbnRlbnRnZW5lcmF0b3IuY3BwIGIvY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9wYWdlY29udGVudGdlbmVyYXRvci5jcHAKaW5kZXggMzU1OTViMy4uOGEwOGE4NCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9wYWdlY29udGVudGdlbmVyYXRvci5jcHAKKysrIGIvY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9wYWdlY29udGVudGdlbmVyYXRvci5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhdGguaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhdGhvYmplY3QuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3RleHRvYmplY3QuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9uYW1lLmgiCkBAIC0yNywxNyArMjgsMTcgQEAKIAogbmFtZXNwYWNlIHsKIAotQ0ZYX0J5dGVUZXh0QnVmJiBvcGVyYXRvcjw8KENGWF9CeXRlVGV4dEJ1ZiYgYXIsIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgYXIsIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgewogICBhciA8PCBtYXRyaXguYSA8PCAiICIgPDwgbWF0cml4LmIgPDwgIiAiIDw8IG1hdHJpeC5jIDw8ICIgIiA8PCBtYXRyaXguZCA8PCAiICIKICAgICAgPDwgbWF0cml4LmUgPDwgIiAiIDw8IG1hdHJpeC5mOwogICByZXR1cm4gYXI7CiB9CiAKLWJvb2wgR2V0Q29sb3IoY29uc3QgQ1BERl9Db2xvciogcENvbG9yLCBGWF9GTE9BVCogcmdiKSB7Citib29sIEdldENvbG9yKGNvbnN0IENQREZfQ29sb3IqIHBDb2xvciwgZmxvYXQqIHJnYikgewogICBpbnQgaW50UkdCWzNdOwogICBpZiAoIXBDb2xvciB8fAogICAgICAgcENvbG9yLT5HZXRDb2xvclNwYWNlKCkgIT0gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX0RFVklDRVJHQikgfHwKLSAgICAgICFwQ29sb3ItPkdldFJHQihpbnRSR0JbMF0sIGludFJHQlsxXSwgaW50UkdCWzJdKSkgeworICAgICAgIXBDb2xvci0+R2V0UkdCKCZpbnRSR0JbMF0sICZpbnRSR0JbMV0sICZpbnRSR0JbMl0pKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIHJnYlswXSA9IGludFJHQlswXSAvIDI1NS4wZjsKQEAgLTQ4LDY1ICs0OSwxMjUgQEAKIAogfSAgLy8gbmFtZXNwYWNlCiAKLUNQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3I6OkNQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3IoQ1BERl9QYWdlKiBwUGFnZSkKLSAgICA6IG1fcFBhZ2UocFBhZ2UpLCBtX3BEb2N1bWVudChtX3BQYWdlLT5tX3BEb2N1bWVudCkgewotICBmb3IgKGNvbnN0IGF1dG8mIHBPYmogOiAqcFBhZ2UtPkdldFBhZ2VPYmplY3RMaXN0KCkpIHsKK0NQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3I6OkNQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3IoCisgICAgQ1BERl9QYWdlT2JqZWN0SG9sZGVyKiBwT2JqSG9sZGVyKQorICAgIDogbV9wT2JqSG9sZGVyKHBPYmpIb2xkZXIpLCBtX3BEb2N1bWVudChwT2JqSG9sZGVyLT5tX3BEb2N1bWVudC5HZXQoKSkgeworICBmb3IgKGNvbnN0IGF1dG8mIHBPYmogOiAqcE9iakhvbGRlci0+R2V0UGFnZU9iamVjdExpc3QoKSkgewogICAgIGlmIChwT2JqKQotICAgICAgbV9wYWdlT2JqZWN0cy5wdXNoX2JhY2socE9iai5nZXQoKSk7CisgICAgICBtX3BhZ2VPYmplY3RzLmVtcGxhY2VfYmFjayhwT2JqLmdldCgpKTsKICAgfQogfQogCiBDUERGX1BhZ2VDb250ZW50R2VuZXJhdG9yOjp+Q1BERl9QYWdlQ29udGVudEdlbmVyYXRvcigpIHt9CiAKIHZvaWQgQ1BERl9QYWdlQ29udGVudEdlbmVyYXRvcjo6R2VuZXJhdGVDb250ZW50KCkgewotICBDRlhfQnl0ZVRleHRCdWYgYnVmOwotICBmb3IgKENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogOiBtX3BhZ2VPYmplY3RzKSB7Ci0gICAgaWYgKENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iamVjdCA9IHBQYWdlT2JqLT5Bc0ltYWdlKCkpCi0gICAgICBQcm9jZXNzSW1hZ2UoJmJ1ZiwgcEltYWdlT2JqZWN0KTsKLSAgICBlbHNlIGlmIChDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqID0gcFBhZ2VPYmotPkFzUGF0aCgpKQotICAgICAgUHJvY2Vzc1BhdGgoJmJ1ZiwgcFBhdGhPYmopOwotICAgIGVsc2UgaWYgKENQREZfVGV4dE9iamVjdCogcFRleHRPYmogPSBwUGFnZU9iai0+QXNUZXh0KCkpCi0gICAgICBQcm9jZXNzVGV4dCgmYnVmLCBwVGV4dE9iaik7Ci0gIH0KLSAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBtX3BQYWdlLT5tX3BGb3JtRGljdDsKLSAgQ1BERl9PYmplY3QqIHBDb250ZW50ID0KLSAgICAgIHBQYWdlRGljdCA/IHBQYWdlRGljdC0+R2V0RGlyZWN0T2JqZWN0Rm9yKCJDb250ZW50cyIpIDogbnVsbHB0cjsKLSAgaWYgKHBDb250ZW50KQotICAgIHBQYWdlRGljdC0+UmVtb3ZlRm9yKCJDb250ZW50cyIpOworICBBU1NFUlQobV9wT2JqSG9sZGVyLT5Jc1BhZ2UoKSk7CiAKLSAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBtX3BEb2N1bWVudC0+TmV3SW5kaXJlY3Q8Q1BERl9TdHJlYW0+KCk7Ci0gIHBTdHJlYW0tPlNldERhdGEoYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0TGVuZ3RoKCkpOwotICBwUGFnZURpY3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIkNvbnRlbnRzIiwgbV9wRG9jdW1lbnQsCisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBtX3BEb2N1bWVudC5HZXQoKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGJ1ZjsKKworICAvLyBTZXQgdGhlIGRlZmF1bHQgZ3JhcGhpYyBzdGF0ZSB2YWx1ZXMKKyAgYnVmIDw8ICJxXG4iOworICBpZiAoIW1fcE9iakhvbGRlci0+R2V0TGFzdENUTSgpLklzSWRlbnRpdHkoKSkKKyAgICBidWYgPDwgbV9wT2JqSG9sZGVyLT5HZXRMYXN0Q1RNKCkuR2V0SW52ZXJzZSgpIDw8ICIgY21cbiI7CisgIFByb2Nlc3NEZWZhdWx0R3JhcGhpY3MoJmJ1Zik7CisKKyAgLy8gUHJvY2VzcyB0aGUgcGFnZSBvYmplY3RzCisgIGlmICghUHJvY2Vzc1BhZ2VPYmplY3RzKCZidWYpKQorICAgIHJldHVybjsKKworICAvLyBSZXR1cm4gZ3JhcGhpY3MgdG8gb3JpZ2luYWwgc3RhdGUKKyAgYnVmIDw8ICJRXG4iOworCisgIC8vIEFkZCBidWZmZXIgdG8gYSBzdHJlYW0gaW4gcGFnZSdzICdDb250ZW50cycKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBtX3BPYmpIb2xkZXItPm1fcEZvcm1EaWN0LkdldCgpOworICBDUERGX09iamVjdCogcENvbnRlbnQgPQorICAgICAgcFBhZ2VEaWN0ID8gcFBhZ2VEaWN0LT5HZXRPYmplY3RGb3IoIkNvbnRlbnRzIikgOiBudWxscHRyOworICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBEb2MtPk5ld0luZGlyZWN0PENQREZfU3RyZWFtPigpOworICBwU3RyZWFtLT5TZXREYXRhKCZidWYpOworICBpZiAocENvbnRlbnQpIHsKKyAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBUb0FycmF5KHBDb250ZW50KTsKKyAgICBpZiAocEFycmF5KSB7CisgICAgICBwQXJyYXktPkFkZE5ldzxDUERGX1JlZmVyZW5jZT4ocERvYywgcFN0cmVhbS0+R2V0T2JqTnVtKCkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDUERGX1JlZmVyZW5jZSogcFJlZmVyZW5jZSA9IFRvUmVmZXJlbmNlKHBDb250ZW50KTsKKyAgICBpZiAoIXBSZWZlcmVuY2UpIHsKKyAgICAgIHBQYWdlRGljdC0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiQ29udGVudHMiLCBtX3BEb2N1bWVudC5HZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5HZXRPYmpOdW0oKSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIENQREZfT2JqZWN0KiBwRGlyZWN0T2JqID0gcFJlZmVyZW5jZS0+R2V0RGlyZWN0KCk7CisgICAgaWYgKCFwRGlyZWN0T2JqKSB7CisgICAgICBwUGFnZURpY3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIkNvbnRlbnRzIiwgbV9wRG9jdW1lbnQuR2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbS0+R2V0T2JqTnVtKCkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDUERGX0FycmF5KiBwT2JqQXJyYXkgPSBwRGlyZWN0T2JqLT5Bc0FycmF5KCk7CisgICAgaWYgKHBPYmpBcnJheSkgeworICAgICAgcE9iakFycmF5LT5BZGROZXc8Q1BERl9SZWZlcmVuY2U+KHBEb2MsIHBTdHJlYW0tPkdldE9iak51bSgpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBEaXJlY3RPYmotPklzU3RyZWFtKCkpIHsKKyAgICAgIENQREZfQXJyYXkqIHBDb250ZW50QXJyYXkgPSBwRG9jLT5OZXdJbmRpcmVjdDxDUERGX0FycmF5PigpOworICAgICAgcENvbnRlbnRBcnJheS0+QWRkTmV3PENQREZfUmVmZXJlbmNlPihwRG9jLCBwRGlyZWN0T2JqLT5HZXRPYmpOdW0oKSk7CisgICAgICBwQ29udGVudEFycmF5LT5BZGROZXc8Q1BERl9SZWZlcmVuY2U+KHBEb2MsIHBTdHJlYW0tPkdldE9iak51bSgpKTsKKyAgICAgIHBQYWdlRGljdC0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiQ29udGVudHMiLCBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZW50QXJyYXktPkdldE9iak51bSgpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgcFBhZ2VEaWN0LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJDb250ZW50cyIsIG1fcERvY3VtZW50LkdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbS0+R2V0T2JqTnVtKCkpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUERGX1BhZ2VDb250ZW50R2VuZXJhdG9yOjpSZWFsaXplUmVzb3VyY2UoCitCeXRlU3RyaW5nIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3I6OlJlYWxpemVSZXNvdXJjZSgKICAgICB1aW50MzJfdCBkd1Jlc291cmNlT2JqTnVtLAotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic1R5cGUpIHsKKyAgICBjb25zdCBCeXRlU3RyaW5nJiBic1R5cGUpIHsKICAgQVNTRVJUKGR3UmVzb3VyY2VPYmpOdW0pOwotICBpZiAoIW1fcFBhZ2UtPm1fcFJlc291cmNlcykgewotICAgIG1fcFBhZ2UtPm1fcFJlc291cmNlcyA9IG1fcERvY3VtZW50LT5OZXdJbmRpcmVjdDxDUERGX0RpY3Rpb25hcnk+KCk7Ci0gICAgbV9wUGFnZS0+bV9wRm9ybURpY3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oCi0gICAgICAgICJSZXNvdXJjZXMiLCBtX3BEb2N1bWVudCwgbV9wUGFnZS0+bV9wUmVzb3VyY2VzLT5HZXRPYmpOdW0oKSk7CisgIGlmICghbV9wT2JqSG9sZGVyLT5tX3BSZXNvdXJjZXMpIHsKKyAgICBtX3BPYmpIb2xkZXItPm1fcFJlc291cmNlcyA9IG1fcERvY3VtZW50LT5OZXdJbmRpcmVjdDxDUERGX0RpY3Rpb25hcnk+KCk7CisgICAgbV9wT2JqSG9sZGVyLT5tX3BGb3JtRGljdC0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigKKyAgICAgICAgIlJlc291cmNlcyIsIG1fcERvY3VtZW50LkdldCgpLAorICAgICAgICBtX3BPYmpIb2xkZXItPm1fcFJlc291cmNlcy0+R2V0T2JqTnVtKCkpOwogICB9Ci0gIENQREZfRGljdGlvbmFyeSogcFJlc0xpc3QgPSBtX3BQYWdlLT5tX3BSZXNvdXJjZXMtPkdldERpY3RGb3IoYnNUeXBlKTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzTGlzdCA9IG1fcE9iakhvbGRlci0+bV9wUmVzb3VyY2VzLT5HZXREaWN0Rm9yKGJzVHlwZSk7CiAgIGlmICghcFJlc0xpc3QpCi0gICAgcFJlc0xpc3QgPSBtX3BQYWdlLT5tX3BSZXNvdXJjZXMtPlNldE5ld0ZvcjxDUERGX0RpY3Rpb25hcnk+KGJzVHlwZSk7CisgICAgcFJlc0xpc3QgPSBtX3BPYmpIb2xkZXItPm1fcFJlc291cmNlcy0+U2V0TmV3Rm9yPENQREZfRGljdGlvbmFyeT4oYnNUeXBlKTsKIAotICBDRlhfQnl0ZVN0cmluZyBuYW1lOworICBCeXRlU3RyaW5nIG5hbWU7CiAgIGludCBpZG51bSA9IDE7CiAgIHdoaWxlICgxKSB7Ci0gICAgbmFtZS5Gb3JtYXQoIkZYJWMlZCIsIGJzVHlwZVswXSwgaWRudW0pOwotICAgIGlmICghcFJlc0xpc3QtPktleUV4aXN0KG5hbWUpKSB7CisgICAgbmFtZSA9IEJ5dGVTdHJpbmc6OkZvcm1hdCgiRlglYyVkIiwgYnNUeXBlWzBdLCBpZG51bSk7CisgICAgaWYgKCFwUmVzTGlzdC0+S2V5RXhpc3QobmFtZSkpCiAgICAgICBicmVhazsKLSAgICB9CisKICAgICBpZG51bSsrOwogICB9Ci0gIHBSZXNMaXN0LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KG5hbWUsIG1fcERvY3VtZW50LCBkd1Jlc291cmNlT2JqTnVtKTsKKyAgcFJlc0xpc3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4obmFtZSwgbV9wRG9jdW1lbnQuR2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3UmVzb3VyY2VPYmpOdW0pOwogICByZXR1cm4gbmFtZTsKIH0KIAotdm9pZCBDUERGX1BhZ2VDb250ZW50R2VuZXJhdG9yOjpQcm9jZXNzSW1hZ2UoQ0ZYX0J5dGVUZXh0QnVmKiBidWYsCitib29sIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3I6OlByb2Nlc3NQYWdlT2JqZWN0cyhzdGQ6Om9zdHJpbmdzdHJlYW0qIGJ1ZikgeworICBib29sIGJEaXJ0eSA9IGZhbHNlOworICBmb3IgKGF1dG8mIHBQYWdlT2JqIDogbV9wYWdlT2JqZWN0cykgeworICAgIGlmIChtX3BPYmpIb2xkZXItPklzUGFnZSgpICYmICFwUGFnZU9iai0+SXNEaXJ0eSgpKQorICAgICAgY29udGludWU7CisKKyAgICBiRGlydHkgPSB0cnVlOworICAgIGlmIChDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmplY3QgPSBwUGFnZU9iai0+QXNJbWFnZSgpKQorICAgICAgUHJvY2Vzc0ltYWdlKGJ1ZiwgcEltYWdlT2JqZWN0KTsKKyAgICBlbHNlIGlmIChDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqID0gcFBhZ2VPYmotPkFzUGF0aCgpKQorICAgICAgUHJvY2Vzc1BhdGgoYnVmLCBwUGF0aE9iaik7CisgICAgZWxzZSBpZiAoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiA9IHBQYWdlT2JqLT5Bc1RleHQoKSkKKyAgICAgIFByb2Nlc3NUZXh0KGJ1ZiwgcFRleHRPYmopOworICAgIHBQYWdlT2JqLT5TZXREaXJ0eShmYWxzZSk7CisgIH0KKyAgcmV0dXJuIGJEaXJ0eTsKK30KKwordm9pZCBDUERGX1BhZ2VDb250ZW50R2VuZXJhdG9yOjpQcm9jZXNzSW1hZ2Uoc3RkOjpvc3RyaW5nc3RyZWFtKiBidWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmopIHsKICAgaWYgKChwSW1hZ2VPYmotPm1hdHJpeCgpLmEgPT0gMCAmJiBwSW1hZ2VPYmotPm1hdHJpeCgpLmIgPT0gMCkgfHwKICAgICAgIChwSW1hZ2VPYmotPm1hdHJpeCgpLmMgPT0gMCAmJiBwSW1hZ2VPYmotPm1hdHJpeCgpLmQgPT0gMCkpIHsKQEAgLTExNCw3ICsxNzUsNyBAQAogICB9CiAgICpidWYgPDwgInEgIiA8PCBwSW1hZ2VPYmotPm1hdHJpeCgpIDw8ICIgY20gIjsKIAotICBDUERGX0ltYWdlKiBwSW1hZ2UgPSBwSW1hZ2VPYmotPkdldEltYWdlKCk7CisgIFJldGFpblB0cjxDUERGX0ltYWdlPiBwSW1hZ2UgPSBwSW1hZ2VPYmotPkdldEltYWdlKCk7CiAgIGlmIChwSW1hZ2UtPklzSW5saW5lKCkpCiAgICAgcmV0dXJuOwogCkBAIC0xMjcsOSArMTg4LDkgQEAKICAgICBwSW1hZ2UtPkNvbnZlcnRTdHJlYW1Ub0luZGlyZWN0T2JqZWN0KCk7CiAKICAgdWludDMyX3QgZHdPYmpOdW0gPSBwU3RyZWFtLT5HZXRPYmpOdW0oKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IFJlYWxpemVSZXNvdXJjZShkd09iak51bSwgIlhPYmplY3QiKTsKKyAgQnl0ZVN0cmluZyBuYW1lID0gUmVhbGl6ZVJlc291cmNlKGR3T2JqTnVtLCAiWE9iamVjdCIpOwogICBpZiAoYldhc0lubGluZSkKLSAgICBwSW1hZ2VPYmotPlNldFVub3duZWRJbWFnZShtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0SW1hZ2UoZHdPYmpOdW0pKTsKKyAgICBwSW1hZ2VPYmotPlNldEltYWdlKG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5HZXRJbWFnZShkd09iak51bSkpOwogCiAgICpidWYgPDwgIi8iIDw8IFBERl9OYW1lRW5jb2RlKG5hbWUpIDw8ICIgRG8gUVxuIjsKIH0KQEAgLTE0NSw5ICsyMDYsMTIgQEAKIC8vIFBhdGggcGFpbnRpbmcgb3BlcmF0b3JzOiAiUyIsICJuIiwgIkIiLCAiZiIsICJCKiIsICJmKiIsIGRlcGVuZGluZyBvbgogLy8gdGhlIGZpbGxpbmcgbW9kZSBhbmQgd2hldGhlciB3ZSB3YW50IHN0cm9raW5nIHRoZSBwYXRoIG9yIG5vdC4KIC8vICJRIiByZXN0b3JlcyB0aGUgZ3JhcGhpY3Mgc3RhdGUgaW1wb3NlZCBieSB0aGUgUHJvY2Vzc0dyYXBoaWNzIG1ldGhvZC4KLXZvaWQgQ1BERl9QYWdlQ29udGVudEdlbmVyYXRvcjo6UHJvY2Vzc1BhdGgoQ0ZYX0J5dGVUZXh0QnVmKiBidWYsCit2b2lkIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3I6OlByb2Nlc3NQYXRoKHN0ZDo6b3N0cmluZ3N0cmVhbSogYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqKSB7CiAgIFByb2Nlc3NHcmFwaGljcyhidWYsIHBQYXRoT2JqKTsKKworICAqYnVmIDw8IHBQYXRoT2JqLT5tX01hdHJpeCA8PCAiIGNtICI7CisKICAgYXV0byYgcFBvaW50cyA9IHBQYXRoT2JqLT5tX1BhdGguR2V0UG9pbnRzKCk7CiAgIGlmIChwUGF0aE9iai0+bV9QYXRoLklzUmVjdCgpKSB7CiAgICAgQ0ZYX1BvaW50RiBkaWZmID0gcFBvaW50c1syXS5tX1BvaW50IC0gcFBvaW50c1swXS5tX1BvaW50OwpAQCAtMTk4LDc5ICsyNjIsMTM2IEBACiAvLyAidyIgc2V0cyB0aGUgc3Ryb2tlIGxpbmUgd2lkdGguCiAvLyAiY2EiIHNldHMgdGhlIGZpbGwgYWxwaGEsICJDQSIgc2V0cyB0aGUgc3Ryb2tlIGFscGhhLgogLy8gInEiIHNhdmVzIHRoZSBncmFwaGljcyBzdGF0ZSwgc28gdGhhdCB0aGUgc2V0dGluZ3MgY2FuIGxhdGVyIGJlIHJldmVyc2VkCi12b2lkIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3I6OlByb2Nlc3NHcmFwaGljcyhDRlhfQnl0ZVRleHRCdWYqIGJ1ZiwKK3ZvaWQgQ1BERl9QYWdlQ29udGVudEdlbmVyYXRvcjo6UHJvY2Vzc0dyYXBoaWNzKHN0ZDo6b3N0cmluZ3N0cmVhbSogYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaikgewogICAqYnVmIDw8ICJxICI7Ci0gIEZYX0ZMT0FUIGZpbGxDb2xvclszXTsKKyAgZmxvYXQgZmlsbENvbG9yWzNdOwogICBpZiAoR2V0Q29sb3IocFBhZ2VPYmotPm1fQ29sb3JTdGF0ZS5HZXRGaWxsQ29sb3IoKSwgZmlsbENvbG9yKSkgewogICAgICpidWYgPDwgZmlsbENvbG9yWzBdIDw8ICIgIiA8PCBmaWxsQ29sb3JbMV0gPDwgIiAiIDw8IGZpbGxDb2xvclsyXQogICAgICAgICAgPDwgIiByZyAiOwogICB9Ci0gIEZYX0ZMT0FUIHN0cm9rZUNvbG9yWzNdOworICBmbG9hdCBzdHJva2VDb2xvclszXTsKICAgaWYgKEdldENvbG9yKHBQYWdlT2JqLT5tX0NvbG9yU3RhdGUuR2V0U3Ryb2tlQ29sb3IoKSwgc3Ryb2tlQ29sb3IpKSB7CiAgICAgKmJ1ZiA8PCBzdHJva2VDb2xvclswXSA8PCAiICIgPDwgc3Ryb2tlQ29sb3JbMV0gPDwgIiAiIDw8IHN0cm9rZUNvbG9yWzJdCiAgICAgICAgICA8PCAiIFJHICI7CiAgIH0KLSAgRlhfRkxPQVQgbGluZVdpZHRoID0gcFBhZ2VPYmotPm1fR3JhcGhTdGF0ZS5HZXRMaW5lV2lkdGgoKTsKKyAgZmxvYXQgbGluZVdpZHRoID0gcFBhZ2VPYmotPm1fR3JhcGhTdGF0ZS5HZXRMaW5lV2lkdGgoKTsKICAgaWYgKGxpbmVXaWR0aCAhPSAxLjBmKQogICAgICpidWYgPDwgbGluZVdpZHRoIDw8ICIgdyAiOworICBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXAgbGluZUNhcCA9IHBQYWdlT2JqLT5tX0dyYXBoU3RhdGUuR2V0TGluZUNhcCgpOworICBpZiAobGluZUNhcCAhPSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBCdXR0KQorICAgICpidWYgPDwgc3RhdGljX2Nhc3Q8aW50PihsaW5lQ2FwKSA8PCAiIEogIjsKKyAgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbiBsaW5lSm9pbiA9IHBQYWdlT2JqLT5tX0dyYXBoU3RhdGUuR2V0TGluZUpvaW4oKTsKKyAgaWYgKGxpbmVKb2luICE9IENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW5NaXRlcikKKyAgICAqYnVmIDw8IHN0YXRpY19jYXN0PGludD4obGluZUpvaW4pIDw8ICIgaiAiOwogCiAgIEdyYXBoaWNzRGF0YSBncmFwaEQ7CiAgIGdyYXBoRC5maWxsQWxwaGEgPSBwUGFnZU9iai0+bV9HZW5lcmFsU3RhdGUuR2V0RmlsbEFscGhhKCk7CiAgIGdyYXBoRC5zdHJva2VBbHBoYSA9IHBQYWdlT2JqLT5tX0dlbmVyYWxTdGF0ZS5HZXRTdHJva2VBbHBoYSgpOwotICBpZiAoZ3JhcGhELmZpbGxBbHBoYSA9PSAxLjBmICYmIGdyYXBoRC5zdHJva2VBbHBoYSA9PSAxLjBmKQorICBncmFwaEQuYmxlbmRUeXBlID0gcFBhZ2VPYmotPm1fR2VuZXJhbFN0YXRlLkdldEJsZW5kVHlwZSgpOworICBpZiAoZ3JhcGhELmZpbGxBbHBoYSA9PSAxLjBmICYmIGdyYXBoRC5zdHJva2VBbHBoYSA9PSAxLjBmICYmCisgICAgICAoZ3JhcGhELmJsZW5kVHlwZSA9PSBGWERJQl9CTEVORF9VTlNVUFBPUlRFRCB8fAorICAgICAgIGdyYXBoRC5ibGVuZFR5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMKSkgewogICAgIHJldHVybjsKKyAgfQogCi0gIENGWF9CeXRlU3RyaW5nIG5hbWU7Ci0gIGF1dG8gaXQgPSBtX3BQYWdlLT5tX0dyYXBoaWNzTWFwLmZpbmQoZ3JhcGhEKTsKLSAgaWYgKGl0ICE9IG1fcFBhZ2UtPm1fR3JhcGhpY3NNYXAuZW5kKCkpIHsKKyAgQnl0ZVN0cmluZyBuYW1lOworICBhdXRvIGl0ID0gbV9wT2JqSG9sZGVyLT5tX0dyYXBoaWNzTWFwLmZpbmQoZ3JhcGhEKTsKKyAgaWYgKGl0ICE9IG1fcE9iakhvbGRlci0+bV9HcmFwaGljc01hcC5lbmQoKSkgewogICAgIG5hbWUgPSBpdC0+c2Vjb25kOwogICB9IGVsc2UgewogICAgIGF1dG8gZ3NEaWN0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4oKTsKLSAgICBnc0RpY3QtPlNldE5ld0ZvcjxDUERGX051bWJlcj4oImNhIiwgZ3JhcGhELmZpbGxBbHBoYSk7Ci0gICAgZ3NEaWN0LT5TZXROZXdGb3I8Q1BERl9OdW1iZXI+KCJDQSIsIGdyYXBoRC5zdHJva2VBbHBoYSk7CisgICAgaWYgKGdyYXBoRC5maWxsQWxwaGEgIT0gMS4wZikKKyAgICAgIGdzRGljdC0+U2V0TmV3Rm9yPENQREZfTnVtYmVyPigiY2EiLCBncmFwaEQuZmlsbEFscGhhKTsKKworICAgIGlmIChncmFwaEQuc3Ryb2tlQWxwaGEgIT0gMS4wZikKKyAgICAgIGdzRGljdC0+U2V0TmV3Rm9yPENQREZfTnVtYmVyPigiQ0EiLCBncmFwaEQuc3Ryb2tlQWxwaGEpOworCisgICAgaWYgKGdyYXBoRC5ibGVuZFR5cGUgIT0gRlhESUJfQkxFTkRfVU5TVVBQT1JURUQgJiYKKyAgICAgICAgZ3JhcGhELmJsZW5kVHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpIHsKKyAgICAgIGdzRGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIkJNIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhZ2VPYmotPm1fR2VuZXJhbFN0YXRlLkdldEJsZW5kTW9kZSgpKTsKKyAgICB9CiAgICAgQ1BERl9PYmplY3QqIHBEaWN0ID0gbV9wRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHN0ZDo6bW92ZShnc0RpY3QpKTsKICAgICB1aW50MzJfdCBkd09iak51bSA9IHBEaWN0LT5HZXRPYmpOdW0oKTsKICAgICBuYW1lID0gUmVhbGl6ZVJlc291cmNlKGR3T2JqTnVtLCAiRXh0R1N0YXRlIik7Ci0gICAgbV9wUGFnZS0+bV9HcmFwaGljc01hcFtncmFwaERdID0gbmFtZTsKKyAgICBtX3BPYmpIb2xkZXItPm1fR3JhcGhpY3NNYXBbZ3JhcGhEXSA9IG5hbWU7CiAgIH0KICAgKmJ1ZiA8PCAiLyIgPDwgUERGX05hbWVFbmNvZGUobmFtZSkgPDwgIiBncyAiOwogfQogCit2b2lkIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3I6OlByb2Nlc3NEZWZhdWx0R3JhcGhpY3MoCisgICAgc3RkOjpvc3RyaW5nc3RyZWFtKiBidWYpIHsKKyAgKmJ1ZiA8PCAiMCAwIDAgUkcgMCAwIDAgcmcgMSB3ICIKKyAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQ+KENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcEJ1dHQpIDw8ICIgSiAiCisgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50PihDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luTWl0ZXIpIDw8ICIgalxuIjsKKyAgR3JhcGhpY3NEYXRhIGRlZmF1bHRHcmFwaGljczsKKyAgZGVmYXVsdEdyYXBoaWNzLmZpbGxBbHBoYSA9IDEuMGY7CisgIGRlZmF1bHRHcmFwaGljcy5zdHJva2VBbHBoYSA9IDEuMGY7CisgIGRlZmF1bHRHcmFwaGljcy5ibGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUw7CisgIGF1dG8gaXQgPSBtX3BPYmpIb2xkZXItPm1fR3JhcGhpY3NNYXAuZmluZChkZWZhdWx0R3JhcGhpY3MpOworICBCeXRlU3RyaW5nIG5hbWU7CisgIGlmIChpdCAhPSBtX3BPYmpIb2xkZXItPm1fR3JhcGhpY3NNYXAuZW5kKCkpIHsKKyAgICBuYW1lID0gaXQtPnNlY29uZDsKKyAgfSBlbHNlIHsKKyAgICBhdXRvIGdzRGljdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCk7CisgICAgZ3NEaWN0LT5TZXROZXdGb3I8Q1BERl9OdW1iZXI+KCJjYSIsIGRlZmF1bHRHcmFwaGljcy5maWxsQWxwaGEpOworICAgIGdzRGljdC0+U2V0TmV3Rm9yPENQREZfTnVtYmVyPigiQ0EiLCBkZWZhdWx0R3JhcGhpY3Muc3Ryb2tlQWxwaGEpOworICAgIGdzRGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIkJNIiwgIk5vcm1hbCIpOworICAgIENQREZfT2JqZWN0KiBwRGljdCA9IG1fcERvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChzdGQ6Om1vdmUoZ3NEaWN0KSk7CisgICAgdWludDMyX3QgZHdPYmpOdW0gPSBwRGljdC0+R2V0T2JqTnVtKCk7CisgICAgbmFtZSA9IFJlYWxpemVSZXNvdXJjZShkd09iak51bSwgIkV4dEdTdGF0ZSIpOworICAgIG1fcE9iakhvbGRlci0+bV9HcmFwaGljc01hcFtkZWZhdWx0R3JhcGhpY3NdID0gbmFtZTsKKyAgfQorICAqYnVmIDw8ICIvIiA8PCBQREZfTmFtZUVuY29kZShuYW1lKS5jX3N0cigpIDw8ICIgZ3MgIjsKK30KKwogLy8gVGhpcyBtZXRob2QgYWRkcyB0ZXh0IHRvIHRoZSBidWZmZXIsIEJUIGJlZ2lucyB0aGUgdGV4dCBvYmplY3QsIEVUIGVuZHMgaXQuCiAvLyBUbSBzZXRzIHRoZSB0ZXh0IG1hdHJpeCAoYWxsb3dzIHBvc2l0aW9uaW5nIGFuZCB0cmFuc2Zvcm1pbmcgdGV4dCkuCiAvLyBUZiBzZXRzIHRoZSBmb250IG5hbWUgKGZyb20gRm9udCBpbiBSZXNvdXJjZXMpIGFuZCBmb250IHNpemUuCiAvLyBUaiBzZXRzIHRoZSBhY3R1YWwgdGV4dCwgPCMjIyMuLi4+IGlzIHVzZWQgd2hlbiBzcGVjaWZ5aW5nIGNoYXJjb2Rlcy4KLXZvaWQgQ1BERl9QYWdlQ29udGVudEdlbmVyYXRvcjo6UHJvY2Vzc1RleHQoQ0ZYX0J5dGVUZXh0QnVmKiBidWYsCit2b2lkIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3I6OlByb2Nlc3NUZXh0KHN0ZDo6b3N0cmluZ3N0cmVhbSogYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqKSB7Ci0gIC8vIFRPRE8obnBtKTogQWRkIHN1cHBvcnQgZm9yIHNvbWV0aGluZyBvdGhlciB0aGFuIHN0YW5kYXJkIHR5cGUxIGZvbnRzLgorICBQcm9jZXNzR3JhcGhpY3MoYnVmLCBwVGV4dE9iaik7CiAgICpidWYgPDwgIkJUICIgPDwgcFRleHRPYmotPkdldFRleHRNYXRyaXgoKSA8PCAiIFRtICI7CiAgIENQREZfRm9udCogcEZvbnQgPSBwVGV4dE9iai0+R2V0Rm9udCgpOwogICBpZiAoIXBGb250KQotICAgIHBGb250ID0gQ1BERl9Gb250OjpHZXRTdG9ja0ZvbnQobV9wRG9jdW1lbnQsICJIZWx2ZXRpY2EiKTsKKyAgICBwRm9udCA9IENQREZfRm9udDo6R2V0U3RvY2tGb250KG1fcERvY3VtZW50LkdldCgpLCAiSGVsdmV0aWNhIik7CiAgIEZvbnREYXRhIGZvbnREOworICBpZiAocEZvbnQtPklzVHlwZTFGb250KCkpCisgICAgZm9udEQudHlwZSA9ICJUeXBlMSI7CisgIGVsc2UgaWYgKHBGb250LT5Jc1RydWVUeXBlRm9udCgpKQorICAgIGZvbnRELnR5cGUgPSAiVHJ1ZVR5cGUiOworICBlbHNlIGlmIChwRm9udC0+SXNDSURGb250KCkpCisgICAgZm9udEQudHlwZSA9ICJUeXBlMCI7CisgIGVsc2UKKyAgICByZXR1cm47CiAgIGZvbnRELmJhc2VGb250ID0gcEZvbnQtPkdldEJhc2VGb250KCk7Ci0gIGF1dG8gaXQgPSBtX3BQYWdlLT5tX0ZvbnRzTWFwLmZpbmQoZm9udEQpOwotICBDRlhfQnl0ZVN0cmluZyBkaWN0TmFtZTsKLSAgaWYgKGl0ICE9IG1fcFBhZ2UtPm1fRm9udHNNYXAuZW5kKCkpIHsKKyAgYXV0byBpdCA9IG1fcE9iakhvbGRlci0+bV9Gb250c01hcC5maW5kKGZvbnREKTsKKyAgQnl0ZVN0cmluZyBkaWN0TmFtZTsKKyAgaWYgKGl0ICE9IG1fcE9iakhvbGRlci0+bV9Gb250c01hcC5lbmQoKSkgewogICAgIGRpY3ROYW1lID0gaXQtPnNlY29uZDsKICAgfSBlbHNlIHsKLSAgICBhdXRvIGZvbnREaWN0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4oKTsKLSAgICBmb250RGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIlR5cGUiLCAiRm9udCIpOwotICAgIGZvbnREaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiU3VidHlwZSIsICJUeXBlMSIpOwotICAgIGZvbnREaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiQmFzZUZvbnQiLCBmb250RC5iYXNlRm9udCk7Ci0gICAgQ1BERl9PYmplY3QqIHBEaWN0ID0gbV9wRG9jdW1lbnQtPkFkZEluZGlyZWN0T2JqZWN0KHN0ZDo6bW92ZShmb250RGljdCkpOwotICAgIHVpbnQzMl90IGR3T2JqTnVtID0gcERpY3QtPkdldE9iak51bSgpOworICAgIHVpbnQzMl90IGR3T2JqTnVtID0gcEZvbnQtPkdldEZvbnREaWN0KCktPkdldE9iak51bSgpOworICAgIGlmICghZHdPYmpOdW0pIHsKKyAgICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBhc3N1bWUgaXQgbXVzdCBiZSBhIHN0YW5kYXJkIGZvbnQKKyAgICAgIGF1dG8gZm9udERpY3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigpOworICAgICAgZm9udERpY3QtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJUeXBlIiwgIkZvbnQiKTsKKyAgICAgIGZvbnREaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiU3VidHlwZSIsIGZvbnRELnR5cGUpOworICAgICAgZm9udERpY3QtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJCYXNlRm9udCIsIGZvbnRELmJhc2VGb250KTsKKyAgICAgIENQREZfT2JqZWN0KiBwRGljdCA9IG1fcERvY3VtZW50LT5BZGRJbmRpcmVjdE9iamVjdChzdGQ6Om1vdmUoZm9udERpY3QpKTsKKyAgICAgIGR3T2JqTnVtID0gcERpY3QtPkdldE9iak51bSgpOworICAgIH0KICAgICBkaWN0TmFtZSA9IFJlYWxpemVSZXNvdXJjZShkd09iak51bSwgIkZvbnQiKTsKLSAgICBtX3BQYWdlLT5tX0ZvbnRzTWFwW2ZvbnREXSA9IGRpY3ROYW1lOworICAgIG1fcE9iakhvbGRlci0+bV9Gb250c01hcFtmb250RF0gPSBkaWN0TmFtZTsKICAgfQogICAqYnVmIDw8ICIvIiA8PCBQREZfTmFtZUVuY29kZShkaWN0TmFtZSkgPDwgIiAiIDw8IHBUZXh0T2JqLT5HZXRGb250U2l6ZSgpCiAgICAgICAgPDwgIiBUZiAiOwotICBDRlhfQnl0ZVN0cmluZyB0ZXh0OwotICBmb3IgKHVpbnQzMl90IGNoYXJjb2RlIDogcFRleHRPYmotPm1fQ2hhckNvZGVzKSB7Ci0gICAgaWYgKGNoYXJjb2RlID09IENQREZfRm9udDo6a0ludmFsaWRDaGFyQ29kZSkKLSAgICAgIGNvbnRpbnVlOwotICAgIHBGb250LT5BcHBlbmRDaGFyKHRleHQsIGNoYXJjb2RlKTsKKyAgQnl0ZVN0cmluZyB0ZXh0OworICBmb3IgKHVpbnQzMl90IGNoYXJjb2RlIDogcFRleHRPYmotPkdldENoYXJDb2RlcygpKSB7CisgICAgaWYgKGNoYXJjb2RlICE9IENQREZfRm9udDo6a0ludmFsaWRDaGFyQ29kZSkKKyAgICAgIHBGb250LT5BcHBlbmRDaGFyKCZ0ZXh0LCBjaGFyY29kZSk7CiAgIH0KLSAgKmJ1ZiA8PCBQREZfRW5jb2RlU3RyaW5nKHRleHQsIHRydWUpIDw8ICIgVGogRVRcbiI7CisgICpidWYgPDwgUERGX0VuY29kZVN0cmluZyh0ZXh0LCB0cnVlKSA8PCAiIFRqIEVUIjsKKyAgKmJ1ZiA8PCAiIFFcbiI7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX3BhZ2Vjb250ZW50Z2VuZXJhdG9yLmggYi9jb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX3BhZ2Vjb250ZW50Z2VuZXJhdG9yLmgKaW5kZXggNzNlNzUxOC4uZWZjNTczOSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9wYWdlY29udGVudGdlbmVyYXRvci5oCisrKyBiL2NvcmUvZnBkZmFwaS9lZGl0L2NwZGZfcGFnZWNvbnRlbnRnZW5lcmF0b3IuaApAQCAtNywzOCArNyw0MiBAQAogI2lmbmRlZiBDT1JFX0ZQREZBUElfRURJVF9DUERGX1BBR0VDT05URU5UR0VORVJBVE9SX0hfCiAjZGVmaW5lIENPUkVfRlBERkFQSV9FRElUX0NQREZfUEFHRUNPTlRFTlRHRU5FUkFUT1JfSF8KIAorI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAKIGNsYXNzIENQREZfRG9jdW1lbnQ7CiBjbGFzcyBDUERGX0ltYWdlT2JqZWN0OwotY2xhc3MgQ1BERl9QYWdlOwogY2xhc3MgQ1BERl9QYWdlT2JqZWN0OworY2xhc3MgQ1BERl9QYWdlT2JqZWN0SG9sZGVyOwogY2xhc3MgQ1BERl9QYXRoT2JqZWN0OwogY2xhc3MgQ1BERl9UZXh0T2JqZWN0OwogCiBjbGFzcyBDUERGX1BhZ2VDb250ZW50R2VuZXJhdG9yIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IENQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3IoQ1BERl9QYWdlKiBwUGFnZSk7CisgIGV4cGxpY2l0IENQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3IoQ1BERl9QYWdlT2JqZWN0SG9sZGVyKiBwT2JqSG9sZGVyKTsKICAgfkNQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3IoKTsKIAogICB2b2lkIEdlbmVyYXRlQ29udGVudCgpOworICBib29sIFByb2Nlc3NQYWdlT2JqZWN0cyhzdGQ6Om9zdHJpbmdzdHJlYW0qIGJ1Zik7CiAKICBwcml2YXRlOgogICBmcmllbmQgY2xhc3MgQ1BERl9QYWdlQ29udGVudEdlbmVyYXRvclRlc3Q7CiAKLSAgdm9pZCBQcm9jZXNzUGF0aChDRlhfQnl0ZVRleHRCdWYqIGJ1ZiwgQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaik7Ci0gIHZvaWQgUHJvY2Vzc0ltYWdlKENGWF9CeXRlVGV4dEJ1ZiogYnVmLCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmopOwotICB2b2lkIFByb2Nlc3NHcmFwaGljcyhDRlhfQnl0ZVRleHRCdWYqIGJ1ZiwgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaik7Ci0gIHZvaWQgUHJvY2Vzc1RleHQoQ0ZYX0J5dGVUZXh0QnVmKiBidWYsIENQREZfVGV4dE9iamVjdCogcFRleHRPYmopOwotICBDRlhfQnl0ZVN0cmluZyBSZWFsaXplUmVzb3VyY2UodWludDMyX3QgZHdSZXNvdXJjZU9iak51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic1R5cGUpOworICB2b2lkIFByb2Nlc3NQYXRoKHN0ZDo6b3N0cmluZ3N0cmVhbSogYnVmLCBDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqKTsKKyAgdm9pZCBQcm9jZXNzSW1hZ2Uoc3RkOjpvc3RyaW5nc3RyZWFtKiBidWYsIENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaik7CisgIHZvaWQgUHJvY2Vzc0dyYXBoaWNzKHN0ZDo6b3N0cmluZ3N0cmVhbSogYnVmLCBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqKTsKKyAgdm9pZCBQcm9jZXNzRGVmYXVsdEdyYXBoaWNzKHN0ZDo6b3N0cmluZ3N0cmVhbSogYnVmKTsKKyAgdm9pZCBQcm9jZXNzVGV4dChzdGQ6Om9zdHJpbmdzdHJlYW0qIGJ1ZiwgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaik7CisgIEJ5dGVTdHJpbmcgUmVhbGl6ZVJlc291cmNlKHVpbnQzMl90IGR3UmVzb3VyY2VPYmpOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIGJzVHlwZSk7CiAKLSAgQ1BERl9QYWdlKiBjb25zdCBtX3BQYWdlOwotICBDUERGX0RvY3VtZW50KiBjb25zdCBtX3BEb2N1bWVudDsKLSAgc3RkOjp2ZWN0b3I8Q1BERl9QYWdlT2JqZWN0Kj4gbV9wYWdlT2JqZWN0czsKKyAgVW5vd25lZFB0cjxDUERGX1BhZ2VPYmplY3RIb2xkZXI+IGNvbnN0IG1fcE9iakhvbGRlcjsKKyAgVW5vd25lZFB0cjxDUERGX0RvY3VtZW50PiBjb25zdCBtX3BEb2N1bWVudDsKKyAgc3RkOjp2ZWN0b3I8VW5vd25lZFB0cjxDUERGX1BhZ2VPYmplY3Q+PiBtX3BhZ2VPYmplY3RzOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfRURJVF9DUERGX1BBR0VDT05URU5UR0VORVJBVE9SX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX3BhZ2Vjb250ZW50Z2VuZXJhdG9yX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnBkZmFwaS9lZGl0L2NwZGZfcGFnZWNvbnRlbnRnZW5lcmF0b3JfdW5pdHRlc3QuY3BwCmluZGV4IGQ4ODEzYmEuLmEwZGI4NjkgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9lZGl0L2NwZGZfcGFnZWNvbnRlbnRnZW5lcmF0b3JfdW5pdHRlc3QuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9lZGl0L2NwZGZfcGFnZWNvbnRlbnRnZW5lcmF0b3JfdW5pdHRlc3QuY3BwCkBAIC00LDM2ICs0LDQ1IEBACiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX3BhZ2Vjb250ZW50Z2VuZXJhdG9yLmgiCiAKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKwogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9jcGRmX21vZHVsZW1nci5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udC5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZm9ybS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0aG9iamVjdC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfdGV4dG9iamVjdC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudC5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9uYW1lLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3BhcnNlci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9yZWZlcmVuY2UuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAogY2xhc3MgQ1BERl9QYWdlQ29udGVudEdlbmVyYXRvclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CiAgcHJvdGVjdGVkOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBDUERGX01vZHVsZU1ncjo6R2V0KCktPkluaXRQYWdlTW9kdWxlKCk7IH0KKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5Jbml0KCk7IH0KIAotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeyBDUERGX01vZHVsZU1ncjo6RGVzdHJveSgpOyB9CisgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgQ1BERl9Nb2R1bGVNZ3I6OkRlc3Ryb3koKTsKKyAgfQogCiAgIHZvaWQgVGVzdFByb2Nlc3NQYXRoKENQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3IqIHBHZW4sCi0gICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiogYnVmLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0qIGJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaikgewogICAgIHBHZW4tPlByb2Nlc3NQYXRoKGJ1ZiwgcFBhdGhPYmopOwogICB9CiAKICAgQ1BERl9EaWN0aW9uYXJ5KiBUZXN0R2V0UmVzb3VyY2UoQ1BERl9QYWdlQ29udGVudEdlbmVyYXRvciogcEdlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKSB7Ci0gICAgcmV0dXJuIHBHZW4tPm1fcFBhZ2UtPm1fcFJlc291cmNlcy0+R2V0RGljdEZvcih0eXBlKS0+R2V0RGljdEZvcihuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgbmFtZSkgeworICAgIHJldHVybiBwR2VuLT5tX3BPYmpIb2xkZXItPm1fcFJlc291cmNlcy0+R2V0RGljdEZvcih0eXBlKS0+R2V0RGljdEZvcihuYW1lKTsKICAgfQogCiAgIHZvaWQgVGVzdFByb2Nlc3NUZXh0KENQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3IqIHBHZW4sCi0gICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiogYnVmLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0qIGJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaikgewogICAgIHBHZW4tPlByb2Nlc3NUZXh0KGJ1ZiwgcFRleHRPYmopOwogICB9CkBAIC00Nyw5ICs1Niw5IEBACiAKICAgYXV0byBwVGVzdFBhZ2UgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9QYWdlPihudWxscHRyLCBudWxscHRyLCBmYWxzZSk7CiAgIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3IgZ2VuZXJhdG9yKHBUZXN0UGFnZS5nZXQoKSk7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBidWY7CiAgIFRlc3RQcm9jZXNzUGF0aCgmZ2VuZXJhdG9yLCAmYnVmLCBwUGF0aE9iai5nZXQoKSk7Ci0gIEVYUEVDVF9FUSgicSAxMCA1IDMgMjUgcmUgQiogUVxuIiwgYnVmLk1ha2VTdHJpbmcoKSk7CisgIEVYUEVDVF9FUSgicSAxIDAgMCAxIDAgMCBjbSAxMCA1IDMgMjUgcmUgQiogUVxuIiwgQnl0ZVN0cmluZyhidWYpKTsKIAogICBwUGF0aE9iaiA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1BhdGhPYmplY3Q+KCk7CiAgIHBQYXRoT2JqLT5tX1BhdGguQXBwZW5kUG9pbnQoQ0ZYX1BvaW50RigwLCAwKSwgRlhQVF9UWVBFOjpNb3ZlVG8sIGZhbHNlKTsKQEAgLTU5LDEwICs2OCwxMCBAQAogICBwUGF0aE9iai0+bV9QYXRoLkFwcGVuZFBvaW50KENGWF9Qb2ludEYoMCwgMy43OGYpLCBGWFBUX1RZUEU6OkxpbmVUbywgdHJ1ZSk7CiAgIHBQYXRoT2JqLT5tX0ZpbGxUeXBlID0gMDsKICAgcFBhdGhPYmotPm1fYlN0cm9rZSA9IGZhbHNlOwotICBidWYuQ2xlYXIoKTsKKyAgYnVmLnN0cigiIik7CiAKICAgVGVzdFByb2Nlc3NQYXRoKCZnZW5lcmF0b3IsICZidWYsIHBQYXRoT2JqLmdldCgpKTsKLSAgRVhQRUNUX0VRKCJxIDAgMCA1LjIgMy43OCByZSBuIFFcbiIsIGJ1Zi5NYWtlU3RyaW5nKCkpOworICBFWFBFQ1RfRVEoInEgMSAwIDAgMSAwIDAgY20gMCAwIDUuMiAzLjc4IHJlIG4gUVxuIiwgQnl0ZVN0cmluZyhidWYpKTsKIH0KIAogVEVTVF9GKENQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3JUZXN0LCBQcm9jZXNzUGF0aCkgewpAQCAtOTEsMTIgKzEwMCwxMiBAQAogCiAgIGF1dG8gcFRlc3RQYWdlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfUGFnZT4obnVsbHB0ciwgbnVsbHB0ciwgZmFsc2UpOwogICBDUERGX1BhZ2VDb250ZW50R2VuZXJhdG9yIGdlbmVyYXRvcihwVGVzdFBhZ2UuZ2V0KCkpOwotICBDRlhfQnl0ZVRleHRCdWYgYnVmOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gYnVmOwogICBUZXN0UHJvY2Vzc1BhdGgoJmdlbmVyYXRvciwgJmJ1ZiwgcFBhdGhPYmouZ2V0KCkpOwogICBFWFBFQ1RfRVEoCi0gICAgICAicSAzLjEwMiA0LjY3IG0gNS40NSAwLjI5IGwgNC4yNCAzLjE1IDQuNjUgMi45OCAzLjQ1NiAwLjI0IGMgMTAuNiAxMS4xNSAiCi0gICAgICAibCAxMSAxMi41IGwgMTEuNDYgMTIuNjcgMTEuODQgMTIuOTYgMTIgMTMuNjQgYyBoIGYgUVxuIiwKLSAgICAgIGJ1Zi5NYWtlU3RyaW5nKCkpOworICAgICAgInEgMSAwIDAgMSAwIDAgY20gMy4xMDIgNC42NyBtIDUuNDUgMC4yOSBsIDQuMjQgMy4xNSA0LjY1IDIuOTggMy40NTYgMC4yNCIKKyAgICAgICIgYyAxMC42IDExLjE1IGwgMTEgMTIuNSBsIDExLjQ2IDEyLjY3IDExLjg0IDEyLjk2IDEyIDEzLjY0IGMgaCBmIFFcbiIsCisgICAgICBCeXRlU3RyaW5nKGJ1ZikpOwogfQogCiBURVNUX0YoQ1BERl9QYWdlQ29udGVudEdlbmVyYXRvclRlc3QsIFByb2Nlc3NHcmFwaGljcykgewpAQCAtMTA3LDExICsxMTYsMTEgQEAKICAgcFBhdGhPYmotPm1fRmlsbFR5cGUgPSBGWEZJTExfV0lORElORzsKICAgcFBhdGhPYmotPm1fYlN0cm9rZSA9IHRydWU7CiAKLSAgRlhfRkxPQVQgcmdiWzNdID0gezAuNWYsIDAuN2YsIDAuMzVmfTsKKyAgZmxvYXQgcmdiWzNdID0gezAuNWYsIDAuN2YsIDAuMzVmfTsKICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFUkdCKTsKICAgcFBhdGhPYmotPm1fQ29sb3JTdGF0ZS5TZXRGaWxsQ29sb3IocENTLCByZ2IsIDMpOwogCi0gIEZYX0ZMT0FUIHJnYjJbM10gPSB7MSwgMC45ZiwgMH07CisgIGZsb2F0IHJnYjJbM10gPSB7MSwgMC45ZiwgMH07CiAgIHBQYXRoT2JqLT5tX0NvbG9yU3RhdGUuU2V0U3Ryb2tlQ29sb3IocENTLCByZ2IyLCAzKTsKICAgcFBhdGhPYmotPm1fR2VuZXJhbFN0YXRlLlNldEZpbGxBbHBoYSgwLjVmKTsKICAgcFBhdGhPYmotPm1fR2VuZXJhbFN0YXRlLlNldFN0cm9rZUFscGhhKDAuOGYpOwpAQCAtMTIxLDI5ICsxMzAsMzEgQEAKICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBwRG9jLT5DcmVhdGVOZXdQYWdlKDApOwogICBhdXRvIHBUZXN0UGFnZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1BhZ2U+KHBEb2MuZ2V0KCksIHBQYWdlRGljdCwgZmFsc2UpOwogICBDUERGX1BhZ2VDb250ZW50R2VuZXJhdG9yIGdlbmVyYXRvcihwVGVzdFBhZ2UuZ2V0KCkpOwotICBDRlhfQnl0ZVRleHRCdWYgYnVmOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gYnVmOwogICBUZXN0UHJvY2Vzc1BhdGgoJmdlbmVyYXRvciwgJmJ1ZiwgcFBhdGhPYmouZ2V0KCkpOwotICBDRlhfQnl0ZVN0cmluZyBwYXRoU3RyaW5nID0gYnVmLk1ha2VTdHJpbmcoKTsKKyAgQnl0ZVN0cmluZyBwYXRoU3RyaW5nKGJ1Zik7CiAKICAgLy8gQ29sb3IgUkdCIHZhbHVlcyB1c2VkIGFyZSBpbnRlZ2VycyBkaXZpZGVkIGJ5IDI1NS4KICAgRVhQRUNUX0VRKCJxIDAuNTAxOTYxIDAuNzAxOTYxIDAuMzQ5MDIgcmcgMSAwLjkwMTk2MSAwIFJHIC8iLAogICAgICAgICAgICAgcGF0aFN0cmluZy5MZWZ0KDQ4KSk7Ci0gIEVYUEVDVF9FUSgiIGdzIDEgMiBtIDMgNCBsIDUgNiBsIGggQiBRXG4iLCBwYXRoU3RyaW5nLlJpZ2h0KDI4KSk7Ci0gIEFTU0VSVF9UUlVFKHBhdGhTdHJpbmcuR2V0TGVuZ3RoKCkgPiA3Nik7CisgIEVYUEVDVF9FUSgiIGdzIDEgMCAwIDEgMCAwIGNtIDEgMiBtIDMgNCBsIDUgNiBsIGggQiBRXG4iLAorICAgICAgICAgICAgcGF0aFN0cmluZy5SaWdodCg0MykpOworICBBU1NFUlRfVFJVRShwYXRoU3RyaW5nLkdldExlbmd0aCgpID4gOTEpOwogICBDUERGX0RpY3Rpb25hcnkqIGV4dGVybmFsR1MgPSBUZXN0R2V0UmVzb3VyY2UoCi0gICAgICAmZ2VuZXJhdG9yLCAiRXh0R1N0YXRlIiwgcGF0aFN0cmluZy5NaWQoNDgsIHBhdGhTdHJpbmcuR2V0TGVuZ3RoKCkgLSA3NikpOworICAgICAgJmdlbmVyYXRvciwgIkV4dEdTdGF0ZSIsIHBhdGhTdHJpbmcuTWlkKDQ4LCBwYXRoU3RyaW5nLkdldExlbmd0aCgpIC0gOTEpKTsKICAgQVNTRVJUX1RSVUUoZXh0ZXJuYWxHUyk7CiAgIEVYUEVDVF9FUSgwLjVmLCBleHRlcm5hbEdTLT5HZXROdW1iZXJGb3IoImNhIikpOwogICBFWFBFQ1RfRVEoMC44ZiwgZXh0ZXJuYWxHUy0+R2V0TnVtYmVyRm9yKCJDQSIpKTsKIAogICAvLyBTYW1lIHBhdGgsIG5vdyB3aXRoIGEgc3Ryb2tlLgogICBwUGF0aE9iai0+bV9HcmFwaFN0YXRlLlNldExpbmVXaWR0aCgxMC41Zik7Ci0gIGJ1Zi5DbGVhcigpOworICBidWYuc3RyKCIiKTsKICAgVGVzdFByb2Nlc3NQYXRoKCZnZW5lcmF0b3IsICZidWYsIHBQYXRoT2JqLmdldCgpKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgcGF0aFN0cmluZzIgPSBidWYuTWFrZVN0cmluZygpOworICBCeXRlU3RyaW5nIHBhdGhTdHJpbmcyKGJ1Zik7CiAgIEVYUEVDVF9FUSgicSAwLjUwMTk2MSAwLjcwMTk2MSAwLjM0OTAyIHJnIDEgMC45MDE5NjEgMCBSRyAxMC41IHcgLyIsCiAgICAgICAgICAgICBwYXRoU3RyaW5nMi5MZWZ0KDU1KSk7Ci0gIEVYUEVDVF9FUSgiIGdzIDEgMiBtIDMgNCBsIDUgNiBsIGggQiBRXG4iLCBwYXRoU3RyaW5nMi5SaWdodCgyOCkpOworICBFWFBFQ1RfRVEoIiBncyAxIDAgMCAxIDAgMCBjbSAxIDIgbSAzIDQgbCA1IDYgbCBoIEIgUVxuIiwKKyAgICAgICAgICAgIHBhdGhTdHJpbmcyLlJpZ2h0KDQzKSk7CiAKICAgLy8gQ29tcGFyZSB3aXRoIHRoZSBwcmV2aW91cyAoc2hvdWxkIHVzZSBzYW1lIGRpY3Rpb25hcnkgZm9yIGdzKQogICBFWFBFQ1RfRVEocGF0aFN0cmluZy5HZXRMZW5ndGgoKSArIDcsIHBhdGhTdHJpbmcyLkdldExlbmd0aCgpKTsKQEAgLTE1MSw3ICsxNjIsOCBAQAogICAgICAgICAgICAgcGF0aFN0cmluZzIuTWlkKDU1LCBwYXRoU3RyaW5nMi5HZXRMZW5ndGgoKSAtIDgzKSk7CiB9CiAKLVRFU1RfRihDUERGX1BhZ2VDb250ZW50R2VuZXJhdG9yVGVzdCwgUHJvY2Vzc1RleHQpIHsKK1RFU1RfRihDUERGX1BhZ2VDb250ZW50R2VuZXJhdG9yVGVzdCwgUHJvY2Vzc1N0YW5kYXJkVGV4dCkgeworICAvLyBDaGVja2luZyBmb250IHdob3NlIGZvbnQgZGljdGlvbmFyeSBpcyBub3QgeWV0IGluZGlyZWN0IG9iamVjdC4KICAgYXV0byBwRG9jID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRG9jdW1lbnQ+KG51bGxwdHIpOwogICBwRG9jLT5DcmVhdGVOZXdEb2MoKTsKICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBwRG9jLT5DcmVhdGVOZXdQYWdlKDApOwpAQCAtMTYxLDE4ICsxNzMsMTYxIEBACiAgIENQREZfRm9udCogcEZvbnQgPSBDUERGX0ZvbnQ6OkdldFN0b2NrRm9udChwRG9jLmdldCgpLCAiVGltZXMtUm9tYW4iKTsKICAgcFRleHRPYmotPm1fVGV4dFN0YXRlLlNldEZvbnQocEZvbnQpOwogICBwVGV4dE9iai0+bV9UZXh0U3RhdGUuU2V0Rm9udFNpemUoMTAuMGYpOworICBmbG9hdCByZ2JbM10gPSB7MC41ZiwgMC43ZiwgMC4zNWZ9OworICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VSR0IpOworICBwVGV4dE9iai0+bV9Db2xvclN0YXRlLlNldEZpbGxDb2xvcihwQ1MsIHJnYiwgMyk7CisKKyAgZmxvYXQgcmdiMlszXSA9IHsxLCAwLjlmLCAwfTsKKyAgcFRleHRPYmotPm1fQ29sb3JTdGF0ZS5TZXRTdHJva2VDb2xvcihwQ1MsIHJnYjIsIDMpOworICBwVGV4dE9iai0+bV9HZW5lcmFsU3RhdGUuU2V0RmlsbEFscGhhKDAuNWYpOworICBwVGV4dE9iai0+bV9HZW5lcmFsU3RhdGUuU2V0U3Ryb2tlQWxwaGEoMC44Zik7CiAgIHBUZXh0T2JqLT5UcmFuc2Zvcm0oQ0ZYX01hdHJpeCgxLCAwLCAwLCAxLCAxMDAsIDEwMCkpOwogICBwVGV4dE9iai0+U2V0VGV4dCgiSGVsbG8gV29ybGQiKTsKLSAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGJ1ZjsKICAgVGVzdFByb2Nlc3NUZXh0KCZnZW5lcmF0b3IsICZidWYsIHBUZXh0T2JqLmdldCgpKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgdGV4dFN0cmluZyA9IGJ1Zi5NYWtlU3RyaW5nKCk7Ci0gIEVYUEVDVF9MVCg2MSwgdGV4dFN0cmluZy5HZXRMZW5ndGgoKSk7Ci0gIEVYUEVDVF9FUSgiQlQgMSAwIDAgMSAxMDAgMTAwIFRtIC8iLCB0ZXh0U3RyaW5nLkxlZnQoMjMpKTsKLSAgRVhQRUNUX0VRKCIgMTAgVGYgPDQ4NjU2QzZDNkYyMDU3NkY3MjZDNjQ+IFRqIEVUXG4iLCB0ZXh0U3RyaW5nLlJpZ2h0KDM4KSk7CisgIEJ5dGVTdHJpbmcgdGV4dFN0cmluZyhidWYpOworICBhdXRvIGZpcnN0UmVzb3VyY2VBdCA9IHRleHRTdHJpbmcuRmluZCgnLycpOworICBBU1NFUlRfVFJVRShmaXJzdFJlc291cmNlQXQuaGFzX3ZhbHVlKCkpOworICBmaXJzdFJlc291cmNlQXQgPSBmaXJzdFJlc291cmNlQXQudmFsdWUoKSArIDE7CisgIGF1dG8gc2Vjb25kUmVzb3VyY2VBdCA9IHRleHRTdHJpbmcuUmV2ZXJzZUZpbmQoJy8nKTsKKyAgQVNTRVJUX1RSVUUoc2Vjb25kUmVzb3VyY2VBdC5oYXNfdmFsdWUoKSk7CisgIHNlY29uZFJlc291cmNlQXQgPSBzZWNvbmRSZXNvdXJjZUF0LnZhbHVlKCkgKyAxOworICBCeXRlU3RyaW5nIGZpcnN0U3RyaW5nID0gdGV4dFN0cmluZy5MZWZ0KGZpcnN0UmVzb3VyY2VBdC52YWx1ZSgpKTsKKyAgQnl0ZVN0cmluZyBtaWRTdHJpbmcgPQorICAgICAgdGV4dFN0cmluZy5NaWQoZmlyc3RSZXNvdXJjZUF0LnZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICBzZWNvbmRSZXNvdXJjZUF0LnZhbHVlKCkgLSBmaXJzdFJlc291cmNlQXQudmFsdWUoKSk7CisgIEJ5dGVTdHJpbmcgbGFzdFN0cmluZyA9CisgICAgICB0ZXh0U3RyaW5nLlJpZ2h0KHRleHRTdHJpbmcuR2V0TGVuZ3RoKCkgLSBzZWNvbmRSZXNvdXJjZUF0LnZhbHVlKCkpOworICAvLyBxIGFuZCBRIG11c3QgYmUgb3V0c2lkZSB0aGUgQlQgLi4gRVQgb3BlcmF0aW9ucworICBCeXRlU3RyaW5nIGNvbXBhcmVTdHJpbmcxID0KKyAgICAgICJxIDAuNTAxOTYxIDAuNzAxOTYxIDAuMzQ5MDIgcmcgMSAwLjkwMTk2MSAwIFJHIC8iOworICAvLyBDb2xvciBSR0IgdmFsdWVzIHVzZWQgYXJlIGludGVnZXJzIGRpdmlkZWQgYnkgMjU1LgorICBCeXRlU3RyaW5nIGNvbXBhcmVTdHJpbmcyID0gIiBncyBCVCAxIDAgMCAxIDEwMCAxMDAgVG0gLyI7CisgIEJ5dGVTdHJpbmcgY29tcGFyZVN0cmluZzMgPSAiIDEwIFRmIDw0ODY1NkM2QzZGMjA1NzZGNzI2QzY0PiBUaiBFVCBRXG4iOworICBFWFBFQ1RfTFQoY29tcGFyZVN0cmluZzEuR2V0TGVuZ3RoKCkgKyBjb21wYXJlU3RyaW5nMi5HZXRMZW5ndGgoKSArCisgICAgICAgICAgICAgICAgY29tcGFyZVN0cmluZzMuR2V0TGVuZ3RoKCksCisgICAgICAgICAgICB0ZXh0U3RyaW5nLkdldExlbmd0aCgpKTsKKyAgRVhQRUNUX0VRKGNvbXBhcmVTdHJpbmcxLCBmaXJzdFN0cmluZy5MZWZ0KGNvbXBhcmVTdHJpbmcxLkdldExlbmd0aCgpKSk7CisgIEVYUEVDVF9FUShjb21wYXJlU3RyaW5nMiwgbWlkU3RyaW5nLlJpZ2h0KGNvbXBhcmVTdHJpbmcyLkdldExlbmd0aCgpKSk7CisgIEVYUEVDVF9FUShjb21wYXJlU3RyaW5nMywgbGFzdFN0cmluZy5SaWdodChjb21wYXJlU3RyaW5nMy5HZXRMZW5ndGgoKSkpOworICBDUERGX0RpY3Rpb25hcnkqIGV4dGVybmFsR1MgPSBUZXN0R2V0UmVzb3VyY2UoCisgICAgICAmZ2VuZXJhdG9yLCAiRXh0R1N0YXRlIiwKKyAgICAgIG1pZFN0cmluZy5MZWZ0KG1pZFN0cmluZy5HZXRMZW5ndGgoKSAtIGNvbXBhcmVTdHJpbmcyLkdldExlbmd0aCgpKSk7CisgIEFTU0VSVF9UUlVFKGV4dGVybmFsR1MpOworICBFWFBFQ1RfRVEoMC41ZiwgZXh0ZXJuYWxHUy0+R2V0TnVtYmVyRm9yKCJjYSIpKTsKKyAgRVhQRUNUX0VRKDAuOGYsIGV4dGVybmFsR1MtPkdldE51bWJlckZvcigiQ0EiKSk7CiAgIENQREZfRGljdGlvbmFyeSogZm9udERpY3QgPSBUZXN0R2V0UmVzb3VyY2UoCi0gICAgICAmZ2VuZXJhdG9yLCAiRm9udCIsIHRleHRTdHJpbmcuTWlkKDIzLCB0ZXh0U3RyaW5nLkdldExlbmd0aCgpIC0gNjEpKTsKKyAgICAgICZnZW5lcmF0b3IsICJGb250IiwKKyAgICAgIGxhc3RTdHJpbmcuTGVmdChsYXN0U3RyaW5nLkdldExlbmd0aCgpIC0gY29tcGFyZVN0cmluZzMuR2V0TGVuZ3RoKCkpKTsKICAgQVNTRVJUX1RSVUUoZm9udERpY3QpOwogICBFWFBFQ1RfRVEoIkZvbnQiLCBmb250RGljdC0+R2V0U3RyaW5nRm9yKCJUeXBlIikpOwogICBFWFBFQ1RfRVEoIlR5cGUxIiwgZm9udERpY3QtPkdldFN0cmluZ0ZvcigiU3VidHlwZSIpKTsKICAgRVhQRUNUX0VRKCJUaW1lcy1Sb21hbiIsIGZvbnREaWN0LT5HZXRTdHJpbmdGb3IoIkJhc2VGb250IikpOwogfQorCitURVNUX0YoQ1BERl9QYWdlQ29udGVudEdlbmVyYXRvclRlc3QsIFByb2Nlc3NUZXh0KSB7CisgIC8vIENoZWNraW5nIGZvbnQgd2hvc2UgZm9udCBkaWN0aW9uYXJ5IGlzIGFscmVhZHkgYW4gaW5kaXJlY3Qgb2JqZWN0LgorICBhdXRvIHBEb2MgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9Eb2N1bWVudD4obnVsbHB0cik7CisgIHBEb2MtPkNyZWF0ZU5ld0RvYygpOworICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBEb2MtPkNyZWF0ZU5ld1BhZ2UoMCk7CisgIGF1dG8gcFRlc3RQYWdlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfUGFnZT4ocERvYy5nZXQoKSwgcFBhZ2VEaWN0LCBmYWxzZSk7CisgIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3IgZ2VuZXJhdG9yKHBUZXN0UGFnZS5nZXQoKSk7CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGJ1ZjsKKyAgeworICAgIC8vIFNldCB0aGUgdGV4dCBvYmplY3QgZm9udCBhbmQgdGV4dAorICAgIGF1dG8gcFRleHRPYmogPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9UZXh0T2JqZWN0PigpOworICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwRG9jLT5OZXdJbmRpcmVjdDxDUERGX0RpY3Rpb25hcnk+KCk7CisgICAgcERpY3QtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJUeXBlIiwgIkZvbnQiKTsKKyAgICBwRGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIlN1YnR5cGUiLCAiVHJ1ZVR5cGUiKTsKKyAgICBDUERGX0ZvbnQqIHBGb250ID0gQ1BERl9Gb250OjpHZXRTdG9ja0ZvbnQocERvYy5nZXQoKSwgIkFyaWFsIik7CisgICAgcERpY3QtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJCYXNlRm9udCIsIHBGb250LT5HZXRCYXNlRm9udCgpKTsKKworICAgIENQREZfRGljdGlvbmFyeSogcERlc2MgPSBwRG9jLT5OZXdJbmRpcmVjdDxDUERGX0RpY3Rpb25hcnk+KCk7CisgICAgcERlc2MtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJUeXBlIiwgIkZvbnREZXNjcmlwdG9yIik7CisgICAgcERlc2MtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJGb250TmFtZSIsIHBGb250LT5HZXRCYXNlRm9udCgpKTsKKyAgICBwRGljdC0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiRm9udERlc2NyaXB0b3IiLCBwRG9jLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZXNjLT5HZXRPYmpOdW0oKSk7CisKKyAgICBDUERGX0ZvbnQqIGxvYWRlZEZvbnQgPSBwRG9jLT5Mb2FkRm9udChwRGljdCk7CisgICAgcFRleHRPYmotPm1fVGV4dFN0YXRlLlNldEZvbnQobG9hZGVkRm9udCk7CisgICAgcFRleHRPYmotPm1fVGV4dFN0YXRlLlNldEZvbnRTaXplKDE1LjVmKTsKKyAgICBwVGV4dE9iai0+U2V0VGV4dCgiSSBhbSBpbmRpcmVjdCIpOworCisgICAgVGVzdFByb2Nlc3NUZXh0KCZnZW5lcmF0b3IsICZidWYsIHBUZXh0T2JqLmdldCgpKTsKKyAgfQorCisgIEJ5dGVTdHJpbmcgdGV4dFN0cmluZyhidWYpOworICBhdXRvIGZpcnN0UmVzb3VyY2VBdCA9IHRleHRTdHJpbmcuRmluZCgnLycpOworICBBU1NFUlRfVFJVRShmaXJzdFJlc291cmNlQXQuaGFzX3ZhbHVlKCkpOworICBmaXJzdFJlc291cmNlQXQgPSBmaXJzdFJlc291cmNlQXQudmFsdWUoKSArIDE7CisgIEJ5dGVTdHJpbmcgZmlyc3RTdHJpbmcgPSB0ZXh0U3RyaW5nLkxlZnQoZmlyc3RSZXNvdXJjZUF0LnZhbHVlKCkpOworICBCeXRlU3RyaW5nIGxhc3RTdHJpbmcgPQorICAgICAgdGV4dFN0cmluZy5SaWdodCh0ZXh0U3RyaW5nLkdldExlbmd0aCgpIC0gZmlyc3RSZXNvdXJjZUF0LnZhbHVlKCkpOworICAvLyBxIGFuZCBRIG11c3QgYmUgb3V0c2lkZSB0aGUgQlQgLi4gRVQgb3BlcmF0aW9ucworICBCeXRlU3RyaW5nIGNvbXBhcmVTdHJpbmcxID0gInEgQlQgMSAwIDAgMSAwIDAgVG0gLyI7CisgIEJ5dGVTdHJpbmcgY29tcGFyZVN0cmluZzIgPSAiIDE1LjUgVGYgPDQ5MjA2MTZEMjA2OTZFNjQ2OTcyNjU2Mzc0PiBUaiBFVCBRXG4iOworICBFWFBFQ1RfTFQoY29tcGFyZVN0cmluZzEuR2V0TGVuZ3RoKCkgKyBjb21wYXJlU3RyaW5nMi5HZXRMZW5ndGgoKSwKKyAgICAgICAgICAgIHRleHRTdHJpbmcuR2V0TGVuZ3RoKCkpOworICBFWFBFQ1RfRVEoY29tcGFyZVN0cmluZzEsIHRleHRTdHJpbmcuTGVmdChjb21wYXJlU3RyaW5nMS5HZXRMZW5ndGgoKSkpOworICBFWFBFQ1RfRVEoY29tcGFyZVN0cmluZzIsIHRleHRTdHJpbmcuUmlnaHQoY29tcGFyZVN0cmluZzIuR2V0TGVuZ3RoKCkpKTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBmb250RGljdCA9IFRlc3RHZXRSZXNvdXJjZSgKKyAgICAgICZnZW5lcmF0b3IsICJGb250IiwKKyAgICAgIHRleHRTdHJpbmcuTWlkKGNvbXBhcmVTdHJpbmcxLkdldExlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAgdGV4dFN0cmluZy5HZXRMZW5ndGgoKSAtIGNvbXBhcmVTdHJpbmcxLkdldExlbmd0aCgpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlU3RyaW5nMi5HZXRMZW5ndGgoKSkpOworICBBU1NFUlRfVFJVRShmb250RGljdCk7CisgIEVYUEVDVF9UUlVFKGZvbnREaWN0LT5HZXRPYmpOdW0oKSk7CisgIEVYUEVDVF9FUSgiRm9udCIsIGZvbnREaWN0LT5HZXRTdHJpbmdGb3IoIlR5cGUiKSk7CisgIEVYUEVDVF9FUSgiVHJ1ZVR5cGUiLCBmb250RGljdC0+R2V0U3RyaW5nRm9yKCJTdWJ0eXBlIikpOworICBFWFBFQ1RfRVEoIkhlbHZldGljYSIsIGZvbnREaWN0LT5HZXRTdHJpbmdGb3IoIkJhc2VGb250IikpOworICBDUERGX0RpY3Rpb25hcnkqIGZvbnREZXNjID0gZm9udERpY3QtPkdldERpY3RGb3IoIkZvbnREZXNjcmlwdG9yIik7CisgIEFTU0VSVF9UUlVFKGZvbnREZXNjKTsKKyAgRVhQRUNUX1RSVUUoZm9udERlc2MtPkdldE9iak51bSgpKTsKKyAgRVhQRUNUX0VRKCJGb250RGVzY3JpcHRvciIsIGZvbnREZXNjLT5HZXRTdHJpbmdGb3IoIlR5cGUiKSk7CisgIEVYUEVDVF9FUSgiSGVsdmV0aWNhIiwgZm9udERlc2MtPkdldFN0cmluZ0ZvcigiRm9udE5hbWUiKSk7Cit9CisKK1RFU1RfRihDUERGX1BhZ2VDb250ZW50R2VuZXJhdG9yVGVzdCwgUHJvY2Vzc0VtcHR5Rm9ybSkgeworICBhdXRvIHBEb2MgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9Eb2N1bWVudD4obnVsbHB0cik7CisgIHBEb2MtPkNyZWF0ZU5ld0RvYygpOworICBhdXRvIHBEaWN0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4oKTsKKyAgYXV0byBwU3RyZWFtID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU3RyZWFtPihudWxscHRyLCAwLCBzdGQ6Om1vdmUocERpY3QpKTsKKworICAvLyBDcmVhdGUgYW4gZW1wdHkgZm9ybS4KKyAgYXV0byBwVGVzdEZvcm0gPQorICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRm9ybT4ocERvYy5nZXQoKSwgbnVsbHB0ciwgcFN0cmVhbS5nZXQoKSk7CisgIHBUZXN0Rm9ybS0+UGFyc2VDb250ZW50KCk7CisgIEFTU0VSVF9UUlVFKHBUZXN0Rm9ybS0+SXNQYXJzZWQoKSk7CisKKyAgLy8gVGhlIGdlbmVyYXRlZCBzdHJlYW0gZm9yIHRoZSBlbXB0eSBmb3JtIHNob3VsZCBiZSBhbiBlbXB0eSBzdHJpbmcuCisgIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3IgZ2VuZXJhdG9yKHBUZXN0Rm9ybS5nZXQoKSk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBidWY7CisgIGdlbmVyYXRvci5Qcm9jZXNzUGFnZU9iamVjdHMoJmJ1Zik7CisgIEVYUEVDVF9FUSgiIiwgQnl0ZVN0cmluZyhidWYpKTsKK30KKworVEVTVF9GKENQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3JUZXN0LCBQcm9jZXNzRm9ybVdpdGhQYXRoKSB7CisgIGF1dG8gcERvYyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RvY3VtZW50PihudWxscHRyKTsKKyAgcERvYy0+Q3JlYXRlTmV3RG9jKCk7CisgIGF1dG8gcERpY3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigpOworICBjb25zdCBjaGFyIGNvbnRlbnRbXSA9CisgICAgICAicSAxIDAgMCAxIDAgMCBjbSAzLjEwMiA0LjY3IG0gNS40NSAwLjI5IGwgNC4yNCAzLjE1IDQuNjUgMi45OCAzLjQ1NiAiCisgICAgICAiMC4yNCBjIDMuMTAyIDQuNjcgbCBoIGYgUVxuIjsKKyAgc2l6ZV90IGJ1Zl9sZW4gPSBGWF9BcnJheVNpemUoY29udGVudCk7CisgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90LCBGeEZyZWVEZWxldGVyPiBidWYoRlhfQWxsb2ModWludDhfdCwgYnVmX2xlbikpOworICBtZW1jcHkoYnVmLmdldCgpLCBjb250ZW50LCBidWZfbGVuKTsKKyAgYXV0byBwU3RyZWFtID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU3RyZWFtPihzdGQ6Om1vdmUoYnVmKSwgYnVmX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocERpY3QpKTsKKworICAvLyBDcmVhdGUgYSBmb3JtIHdpdGggYSBub24tZW1wdHkgc3RyZWFtLgorICBhdXRvIHBUZXN0Rm9ybSA9CisgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9Gb3JtPihwRG9jLmdldCgpLCBudWxscHRyLCBwU3RyZWFtLmdldCgpKTsKKyAgcFRlc3RGb3JtLT5QYXJzZUNvbnRlbnQoKTsKKyAgQVNTRVJUX1RSVUUocFRlc3RGb3JtLT5Jc1BhcnNlZCgpKTsKKworICBDUERGX1BhZ2VDb250ZW50R2VuZXJhdG9yIGdlbmVyYXRvcihwVGVzdEZvcm0uZ2V0KCkpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcHJvY2Vzc19idWY7CisgIGdlbmVyYXRvci5Qcm9jZXNzUGFnZU9iamVjdHMoJnByb2Nlc3NfYnVmKTsKKyAgRVhQRUNUX0VRKGNvbnRlbnQsIEJ5dGVTdHJpbmcocHJvY2Vzc19idWYpKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9lZGl0L2VkaXRpbnQuaCBiL2NvcmUvZnBkZmFwaS9lZGl0L2VkaXRpbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgxYzJjYy4uMDAwMDAwMAotLS0gYS9jb3JlL2ZwZGZhcGkvZWRpdC9lZGl0aW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgQ09SRV9GUERGQVBJX0VESVRfRURJVElOVF9IXwotI2RlZmluZSBDT1JFX0ZQREZBUElfRURJVF9FRElUSU5UX0hfCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJlYW0uaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotCi1jbGFzcyBDUERGX0NyZWF0b3I7Ci1jbGFzcyBDUERGX09iamVjdDsKLQotY2xhc3MgQ1BERl9PYmplY3RTdHJlYW0gewotIHB1YmxpYzoKLSAgc3RydWN0IEl0ZW0gewotICAgIHVpbnQzMl90IG9iam51bTsKLSAgICBGWF9TVFJTSVpFIG9mZnNldDsKLSAgfTsKLQotICBDUERGX09iamVjdFN0cmVhbSgpOwotICB+Q1BERl9PYmplY3RTdHJlYW0oKTsKLQotICB2b2lkIFN0YXJ0KCk7Ci0gIEZYX0ZJTEVTSVpFIEVuZChDUERGX0NyZWF0b3IqIHBDcmVhdG9yKTsKLSAgdm9pZCBDb21wcmVzc0luZGlyZWN0T2JqZWN0KHVpbnQzMl90IGR3T2JqTnVtLCBjb25zdCBDUERGX09iamVjdCogcE9iaik7Ci0gIHZvaWQgQ29tcHJlc3NJbmRpcmVjdE9iamVjdCh1aW50MzJfdCBkd09iak51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1NpemUpOwotCi0gIHN0ZDo6dmVjdG9yPEl0ZW0+IG1fSXRlbXM7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBtX0J1ZmZlcjsKLSAgdWludDMyX3QgbV9kd09iak51bTsKLSAgaW50MzJfdCBtX2luZGV4OwotfTsKLQotY2xhc3MgQ1BERl9YUmVmU3RyZWFtIHsKLSBwdWJsaWM6Ci0gIHN0cnVjdCBJbmRleCB7Ci0gICAgdWludDMyX3Qgb2JqbnVtOwotICAgIHVpbnQzMl90IGNvdW50OwotICB9OwotCi0gIENQREZfWFJlZlN0cmVhbSgpOwotICB+Q1BERl9YUmVmU3RyZWFtKCk7Ci0KLSAgYm9vbCBTdGFydCgpOwotICBpbnQzMl90IENvbXByZXNzSW5kaXJlY3RPYmplY3QodWludDMyX3QgZHdPYmpOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX09iamVjdCogcE9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ3JlYXRvciogcENyZWF0b3IpOwotICBpbnQzMl90IENvbXByZXNzSW5kaXJlY3RPYmplY3QodWludDMyX3QgZHdPYmpOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9DcmVhdG9yKiBwQ3JlYXRvcik7Ci0gIGJvb2wgRW5kKENQREZfQ3JlYXRvciogcENyZWF0b3IsIGJvb2wgYkVPRiA9IGZhbHNlKTsKLSAgdm9pZCBBZGRPYmplY3ROdW1iZXJUb0luZGV4QXJyYXkodWludDMyX3Qgb2JqbnVtKTsKLSAgYm9vbCBFbmRYUmVmU3RyZWFtKENQREZfQ3JlYXRvciogcENyZWF0b3IpOwotCi0gIHN0ZDo6dmVjdG9yPEluZGV4PiBtX0luZGV4QXJyYXk7Ci0gIEZYX0ZJTEVTSVpFIG1fUHJldk9mZnNldDsKLSAgdWludDMyX3QgbV9kd1RlbXBPYmpOdW07Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGludDMyX3QgRW5kT2JqZWN0U3RyZWFtKENQREZfQ3JlYXRvciogcENyZWF0b3IsIGJvb2wgYkVPRiA9IHRydWUpOwotICBib29sIEdlbmVyYXRlWFJlZlN0cmVhbShDUERGX0NyZWF0b3IqIHBDcmVhdG9yLCBib29sIGJFT0YpOwotCi0gIHNpemVfdCBtX2lTZWc7Ci0gIENQREZfT2JqZWN0U3RyZWFtIG1fT2JqU3RyZWFtOwotICBDRlhfQnl0ZVRleHRCdWYgbV9CdWZmZXI7Ci19OwotCi0jZW5kaWYgIC8vIENPUkVfRlBERkFQSV9FRElUX0VESVRJTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9lZGl0L2ZwZGZfZWRpdF9jcmVhdGUuY3BwIGIvY29yZS9mcGRmYXBpL2VkaXQvZnBkZl9lZGl0X2NyZWF0ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlYzBkZTkuLjAwMDAwMDAKLS0tIGEvY29yZS9mcGRmYXBpL2VkaXQvZnBkZl9lZGl0X2NyZWF0ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTk1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9lZGl0L2VkaXRpbnQuaCIKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX2NyZWF0b3IuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfY3J5cHRvX2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudC5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9uYW1lLmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bWJlci5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9wYXJzZXIuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVmZXJlbmNlLmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3NlY3VyaXR5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtLmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbV9hY2MuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyaW5nLmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGUuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9tYXliZV9vd25lZC5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKLQotI2RlZmluZSBQREZfT0JKRUNUU1RSRUFNX01BWExFTkdUSCAoMjU2ICogMTAyNCkKLSNkZWZpbmUgUERGX1hSRUZTVFJFQU1fTUFYU0laRSAxMDAwMAotCi0jZGVmaW5lIEZYX0dFVEJZVEVPRkZTRVQzMihhKSAwCi0jZGVmaW5lIEZYX0dFVEJZVEVPRkZTRVQ0MChhKSAwCi0jZGVmaW5lIEZYX0dFVEJZVEVPRkZTRVQ0OChhKSAwCi0jZGVmaW5lIEZYX0dFVEJZVEVPRkZTRVQ1NihhKSAwCi0jZGVmaW5lIEZYX0dFVEJZVEVPRkZTRVQyNChhKSAoKHVpbnQ4X3QpKGEgPj4gMjQpKQotI2RlZmluZSBGWF9HRVRCWVRFT0ZGU0VUMTYoYSkgKCh1aW50OF90KShhID4+IDE2KSkKLSNkZWZpbmUgRlhfR0VUQllURU9GRlNFVDgoYSkgKCh1aW50OF90KShhID4+IDgpKQotI2RlZmluZSBGWF9HRVRCWVRFT0ZGU0VUMChhKSAoKHVpbnQ4X3QpKGEpKQotCi0vLyBUT0RPKG9jaGFuZyk6IE1ha2UgaGVscGVyIGZvciBhcHBlbmRpbmcgIm9iam51bSAwIFIgIi4KLQotbmFtZXNwYWNlIHsKLQotaW50MzJfdCBQREZfQ3JlYXRvckFwcGVuZE9iamVjdChjb25zdCBDUERGX09iamVjdCogcE9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKiBwRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUmIG9mZnNldCkgewotICBpbnQzMl90IGxlbiA9IDA7Ci0gIGlmICghcE9iaikgewotICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCIgbnVsbCIpIDwgMCkgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBvZmZzZXQgKz0gNTsKLSAgICByZXR1cm4gMTsKLSAgfQotICBzd2l0Y2ggKHBPYmotPkdldFR5cGUoKSkgewotICAgIGNhc2UgQ1BERl9PYmplY3Q6Ok5VTExPQko6Ci0gICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygiIG51bGwiKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgb2Zmc2V0ICs9IDU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENQREZfT2JqZWN0OjpCT09MRUFOOgotICAgIGNhc2UgQ1BERl9PYmplY3Q6Ok5VTUJFUjoKLSAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCIgIikgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZyhwT2JqLT5HZXRTdHJpbmcoKS5Bc1N0cmluZ0MoKSkpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBvZmZzZXQgKz0gbGVuICsgMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ1BERl9PYmplY3Q6OlNUUklORzogewotICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gcE9iai0+R2V0U3RyaW5nKCk7Ci0gICAgICBib29sIGJIZXggPSBwT2JqLT5Bc1N0cmluZygpLT5Jc0hleCgpOwotICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKFBERl9FbmNvZGVTdHJpbmcoc3RyLCBiSGV4KS5Bc1N0cmluZ0MoKSkpIDwKLSAgICAgICAgICAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIG9mZnNldCArPSBsZW47Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBDUERGX09iamVjdDo6TkFNRTogewotICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIi8iKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gcE9iai0+R2V0U3RyaW5nKCk7Ci0gICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoUERGX05hbWVFbmNvZGUoc3RyKS5Bc1N0cmluZ0MoKSkpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBvZmZzZXQgKz0gbGVuICsgMTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIENQREZfT2JqZWN0OjpSRUZFUkVOQ0U6IHsKLSAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCIgIikgPCAwKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChwT2JqLT5Bc1JlZmVyZW5jZSgpLT5HZXRSZWZPYmpOdW0oKSkpIDwgMCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIiAwIFIgIikgPCAwKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBvZmZzZXQgKz0gbGVuICsgNjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIENQREZfT2JqZWN0OjpBUlJBWTogewotICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIlsiKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgb2Zmc2V0ICs9IDE7Ci0gICAgICBjb25zdCBDUERGX0FycmF5KiBwID0gcE9iai0+QXNBcnJheSgpOwotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwLT5HZXRDb3VudCgpOyBpKyspIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBFbGVtZW50ID0gcC0+R2V0T2JqZWN0QXQoaSk7Ci0gICAgICAgIGlmICghcEVsZW1lbnQtPklzSW5saW5lKCkpIHsKLSAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygiICIpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChwRWxlbWVudC0+R2V0T2JqTnVtKCkpKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIiAwIFIiKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgb2Zmc2V0ICs9IGxlbiArIDU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KHBFbGVtZW50LCBwRmlsZSwgb2Zmc2V0KSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCJdIikgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIG9mZnNldCArPSAxOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQ1BERl9PYmplY3Q6OkRJQ1RJT05BUlk6IHsKLSAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCI8PCIpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBvZmZzZXQgKz0gMjsKLSAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcCA9IHBPYmotPkFzRGljdGlvbmFyeSgpOwotICAgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICpwKSB7Ci0gICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXkgPSBpdC5maXJzdDsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IGl0LnNlY29uZC5nZXQoKTsKLSAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIi8iKSA8IDApIHsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKFBERl9OYW1lRW5jb2RlKGtleSkuQXNTdHJpbmdDKCkpKSA8IDApIHsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgb2Zmc2V0ICs9IGxlbiArIDE7Ci0gICAgICAgIGlmICghcFZhbHVlLT5Jc0lubGluZSgpKSB7Ci0gICAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIiAiKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQocFZhbHVlLT5HZXRPYmpOdW0oKSkpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygiIDAgUiIpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgIH0KLSAgICAgICAgICBvZmZzZXQgKz0gbGVuICsgNTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoUERGX0NyZWF0b3JBcHBlbmRPYmplY3QocFZhbHVlLCBwRmlsZSwgb2Zmc2V0KSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCI+PiIpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBvZmZzZXQgKz0gMjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIENQREZfT2JqZWN0OjpTVFJFQU06IHsKLSAgICAgIGNvbnN0IENQREZfU3RyZWFtKiBwID0gcE9iai0+QXNTdHJlYW0oKTsKLSAgICAgIGlmIChQREZfQ3JlYXRvckFwcGVuZE9iamVjdChwLT5HZXREaWN0KCksIHBGaWxlLCBvZmZzZXQpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygic3RyZWFtXHJcbiIpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBvZmZzZXQgKz0gODsKLSAgICAgIENQREZfU3RyZWFtQWNjIGFjYzsKLSAgICAgIGFjYy5Mb2FkQWxsRGF0YShwLCB0cnVlKTsKLSAgICAgIGlmIChwRmlsZS0+QXBwZW5kQmxvY2soYWNjLkdldERhdGEoKSwgYWNjLkdldFNpemUoKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIG9mZnNldCArPSBhY2MuR2V0U2l6ZSgpOwotICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKCJcclxuZW5kc3RyZWFtIikpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBvZmZzZXQgKz0gbGVuOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBBU1NFUlQoZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLWludDMyX3QgUERGX0NyZWF0b3JXcml0ZVRyYWlsZXIoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRmlsZUJ1ZmZlckFyY2hpdmUqIHBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwSURBcnJheSkgewotICBGWF9GSUxFU0laRSBvZmZzZXQgPSAwOwotICBpbnQzMl90IGxlbiA9IDA7Ci0gIENQREZfUGFyc2VyKiBwUGFyc2VyID0gcERvY3VtZW50LT5HZXRQYXJzZXIoKTsKLSAgaWYgKHBQYXJzZXIpIHsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHAgPSBwUGFyc2VyLT5HZXRUcmFpbGVyKCk7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICpwKSB7Ci0gICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5ID0gaXQuZmlyc3Q7Ci0gICAgICBDUERGX09iamVjdCogcFZhbHVlID0gaXQuc2Vjb25kLmdldCgpOwotICAgICAgaWYgKGtleSA9PSAiRW5jcnlwdCIgfHwga2V5ID09ICJTaXplIiB8fCBrZXkgPT0gIkZpbHRlciIgfHwKLSAgICAgICAgICBrZXkgPT0gIkluZGV4IiB8fCBrZXkgPT0gIkxlbmd0aCIgfHwga2V5ID09ICJQcmV2IiB8fCBrZXkgPT0gIlciIHx8Ci0gICAgICAgICAga2V5ID09ICJYUmVmU3RtIiB8fCBrZXkgPT0gIlR5cGUiIHx8IGtleSA9PSAiSUQiKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYgKGtleSA9PSAiRGVjb2RlUGFybXMiKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoKCIvIikpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoUERGX05hbWVFbmNvZGUoa2V5KS5Bc1N0cmluZ0MoKSkpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBvZmZzZXQgKz0gbGVuICsgMTsKLSAgICAgIGlmICghcFZhbHVlLT5Jc0lubGluZSgpKSB7Ci0gICAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCIgIikgPCAwKSB7Ci0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKHBWYWx1ZS0+R2V0T2JqTnVtKCkpKSA8IDApIHsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIiAwIFIgIikgPCAwKSB7Ci0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIG9mZnNldCArPSBsZW4gKyA2OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KHBWYWx1ZSwgcEZpbGUsIG9mZnNldCkgPCAwKSB7Ci0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChwSURBcnJheSkgewotICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoKCIvSUQiKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIG9mZnNldCArPSAzOwotICAgICAgaWYgKFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KHBJREFycmF5LCBwRmlsZSwgb2Zmc2V0KSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gb2Zmc2V0OwotICB9Ci0gIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCJcclxuL1Jvb3QgIikgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKHBEb2N1bWVudC0+R2V0Um9vdCgpLT5HZXRPYmpOdW0oKSkpIDwgMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygiIDAgUlxyXG4iKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgb2Zmc2V0ICs9IGxlbiArIDE0OwotICBpZiAocERvY3VtZW50LT5HZXRJbmZvKCkpIHsKLSAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygiL0luZm8gIikgPCAwKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKHBEb2N1bWVudC0+R2V0SW5mbygpLT5HZXRPYmpOdW0oKSkpIDwgMCkgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygiIDAgUlxyXG4iKSA8IDApIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgb2Zmc2V0ICs9IGxlbiArIDEyOwotICB9Ci0gIGlmIChwSURBcnJheSkgewotICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCgiL0lEIikpIDwgMCkgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBvZmZzZXQgKz0gMzsKLSAgICBpZiAoUERGX0NyZWF0b3JBcHBlbmRPYmplY3QocElEQXJyYXksIHBGaWxlLCBvZmZzZXQpIDwgMCkgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgfQotICByZXR1cm4gb2Zmc2V0OwotfQotCi1pbnQzMl90IFBERl9DcmVhdG9yV3JpdGVFbmNyeXB0KGNvbnN0IENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd09iak51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKiBwRmlsZSkgewotICBpZiAoIXBFbmNyeXB0RGljdCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIEFTU0VSVChwRmlsZSk7Ci0gIEZYX0ZJTEVTSVpFIG9mZnNldCA9IDA7Ci0gIGludDMyX3QgbGVuID0gMDsKLSAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIi9FbmNyeXB0IikgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIG9mZnNldCArPSA4OwotICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygiICIpIDwgMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChkd09iak51bSkpIDwgMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygiIDAgUiAiKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgb2Zmc2V0ICs9IGxlbiArIDY7Ci0gIHJldHVybiBvZmZzZXQ7Ci19Ci0KLXN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFBERl9HZW5lcmF0ZUZpbGVJRCh1aW50MzJfdCBkd1NlZWQxLCB1aW50MzJfdCBkd1NlZWQyKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZmZlcihzaXplb2YodWludDMyX3QpICogNCk7Ci0gIHVpbnQzMl90KiBwQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KGJ1ZmZlci5kYXRhKCkpOwotICB2b2lkKiBwQ29udGV4dCA9IEZYX1JhbmRvbV9NVF9TdGFydChkd1NlZWQxKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpCi0gICAgKnBCdWZmZXIrKyA9IEZYX1JhbmRvbV9NVF9HZW5lcmF0ZShwQ29udGV4dCk7Ci0gIEZYX1JhbmRvbV9NVF9DbG9zZShwQ29udGV4dCk7Ci0gIHBDb250ZXh0ID0gRlhfUmFuZG9tX01UX1N0YXJ0KGR3U2VlZDIpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkKLSAgICAqcEJ1ZmZlcisrID0gRlhfUmFuZG9tX01UX0dlbmVyYXRlKHBDb250ZXh0KTsKLSAgRlhfUmFuZG9tX01UX0Nsb3NlKHBDb250ZXh0KTsKLSAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotdm9pZCBBcHBlbmRJbmRleDAoQ0ZYX0J5dGVUZXh0QnVmJiBidWZmZXIsIGJvb2wgYkZpcnN0T2JqZWN0KSB7Ci0gIGJ1ZmZlci5BcHBlbmRCeXRlKDApOwotICBidWZmZXIuQXBwZW5kQnl0ZSgwKTsKLSAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7Ci0gIGJ1ZmZlci5BcHBlbmRCeXRlKDApOwotICBidWZmZXIuQXBwZW5kQnl0ZSgwKTsKLSAgY29uc3QgdWludDhfdCBieXRlID0gYkZpcnN0T2JqZWN0ID8gMHhGRiA6IDA7Ci0gIGJ1ZmZlci5BcHBlbmRCeXRlKGJ5dGUpOwotICBidWZmZXIuQXBwZW5kQnl0ZShieXRlKTsKLX0KLQotdm9pZCBBcHBlbmRJbmRleDEoQ0ZYX0J5dGVUZXh0QnVmJiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCkgewotICBidWZmZXIuQXBwZW5kQnl0ZSgxKTsKLSAgYnVmZmVyLkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDI0KG9mZnNldCkpOwotICBidWZmZXIuQXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUMTYob2Zmc2V0KSk7Ci0gIGJ1ZmZlci5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQ4KG9mZnNldCkpOwotICBidWZmZXIuQXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUMChvZmZzZXQpKTsKLSAgYnVmZmVyLkFwcGVuZEJ5dGUoMCk7Ci0gIGJ1ZmZlci5BcHBlbmRCeXRlKDApOwotfQotCi12b2lkIEFwcGVuZEluZGV4MihDRlhfQnl0ZVRleHRCdWYmIGJ1ZmZlciwgdWludDMyX3Qgb2JqbnVtLCBpbnQzMl90IGluZGV4KSB7Ci0gIGJ1ZmZlci5BcHBlbmRCeXRlKDIpOwotICBidWZmZXIuQXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUMjQob2JqbnVtKSk7Ci0gIGJ1ZmZlci5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQxNihvYmpudW0pKTsKLSAgYnVmZmVyLkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDgob2JqbnVtKSk7Ci0gIGJ1ZmZlci5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQwKG9iam51bSkpOwotICBidWZmZXIuQXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUOChpbmRleCkpOwotICBidWZmZXIuQXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUMChpbmRleCkpOwotfQotCi1ib29sIElzWFJlZk5lZWRFbmQoQ1BERl9YUmVmU3RyZWFtKiBwWFJlZiwgdWludDMyX3QgZmxhZykgewotICBpZiAoIShmbGFnICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHVpbnQzMl90IGlDb3VudCA9IDA7Ci0gIGZvciAoY29uc3QgYXV0byYgcGFpciA6IHBYUmVmLT5tX0luZGV4QXJyYXkpCi0gICAgaUNvdW50ICs9IHBhaXIuY291bnQ7Ci0KLSAgcmV0dXJuIGlDb3VudCA+PSBQREZfWFJFRlNUUkVBTV9NQVhTSVpFOwotfQotCi1pbnQzMl90IE91dHB1dEluZGV4KENGWF9GaWxlQnVmZmVyQXJjaGl2ZSogcEZpbGUsIEZYX0ZJTEVTSVpFIG9mZnNldCkgewotICBpZiAoc2l6ZW9mKG9mZnNldCkgPiA0KSB7Ci0gICAgaWYgKEZYX0dFVEJZVEVPRkZTRVQzMihvZmZzZXQpKSB7Ci0gICAgICBpZiAocEZpbGUtPkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDU2KG9mZnNldCkpIDwgMCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgaWYgKHBGaWxlLT5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQ0OChvZmZzZXQpKSA8IDApCi0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIGlmIChwRmlsZS0+QXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUNDAob2Zmc2V0KSkgPCAwKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBpZiAocEZpbGUtPkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDMyKG9mZnNldCkpIDwgMCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgfQotICBpZiAocEZpbGUtPkFwcGVuZEJ5dGUoRlhfR0VUQllURU9GRlNFVDI0KG9mZnNldCkpIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0gIGlmIChwRmlsZS0+QXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUMTYob2Zmc2V0KSkgPCAwKQotICAgIHJldHVybiAtMTsKLSAgaWYgKHBGaWxlLT5BcHBlbmRCeXRlKEZYX0dFVEJZVEVPRkZTRVQ4KG9mZnNldCkpIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0gIGlmIChwRmlsZS0+QXBwZW5kQnl0ZShGWF9HRVRCWVRFT0ZGU0VUMChvZmZzZXQpKSA8IDApCi0gICAgcmV0dXJuIC0xOwotICBpZiAocEZpbGUtPkFwcGVuZEJ5dGUoMCkgPCAwKQotICAgIHJldHVybiAtMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWNsYXNzIENQREZfRmxhdGVFbmNvZGVyIHsKLSBwdWJsaWM6Ci0gIENQREZfRmxhdGVFbmNvZGVyKENQREZfU3RyZWFtKiBwU3RyZWFtLCBib29sIGJGbGF0ZUVuY29kZSk7Ci0gIENQREZfRmxhdGVFbmNvZGVyKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgYkZsYXRlRW5jb2RlLAotICAgICAgICAgICAgICAgICAgICBib29sIGJYUmVmU3RyZWFtKTsKLSAgfkNQREZfRmxhdGVFbmNvZGVyKCk7Ci0KLSAgdm9pZCBDbG9uZURpY3QoKTsKLQotICB1aW50MzJfdCBtX2R3U2l6ZTsKLSAgQ0ZYX01heWJlT3duZWQ8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4gbV9wRGF0YTsKLSAgQ0ZYX01heWJlT3duZWQ8Q1BERl9EaWN0aW9uYXJ5PiBtX3BEaWN0OwotICBDUERGX1N0cmVhbUFjYyBtX0FjYzsKLX07Ci0KLXZvaWQgQ1BERl9GbGF0ZUVuY29kZXI6OkNsb25lRGljdCgpIHsKLSAgaWYgKG1fcERpY3QuSXNPd25lZCgpKQotICAgIHJldHVybjsKLSAgbV9wRGljdCA9IFRvRGljdGlvbmFyeShtX3BEaWN0LT5DbG9uZSgpKTsKLSAgQVNTRVJUKG1fcERpY3QuSXNPd25lZCgpKTsKLX0KLQotQ1BERl9GbGF0ZUVuY29kZXI6OkNQREZfRmxhdGVFbmNvZGVyKENQREZfU3RyZWFtKiBwU3RyZWFtLCBib29sIGJGbGF0ZUVuY29kZSkKLSAgICA6IG1fZHdTaXplKDApIHsKLSAgbV9BY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgdHJ1ZSk7Ci0gIGJvb2wgYkhhc0ZpbHRlciA9IHBTdHJlYW0gJiYgcFN0cmVhbS0+SGFzRmlsdGVyKCk7Ci0gIGlmIChiSGFzRmlsdGVyICYmICFiRmxhdGVFbmNvZGUpIHsKLSAgICBDUERGX1N0cmVhbUFjYyBkZXN0QWNjOwotICAgIGRlc3RBY2MuTG9hZEFsbERhdGEocFN0cmVhbSk7Ci0gICAgbV9kd1NpemUgPSBkZXN0QWNjLkdldFNpemUoKTsKLSAgICBtX3BEYXRhID0gZGVzdEFjYy5EZXRhY2hEYXRhKCk7Ci0gICAgbV9wRGljdCA9IFRvRGljdGlvbmFyeShwU3RyZWFtLT5HZXREaWN0KCktPkNsb25lKCkpOwotICAgIG1fcERpY3QtPlJlbW92ZUZvcigiRmlsdGVyIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChiSGFzRmlsdGVyIHx8ICFiRmxhdGVFbmNvZGUpIHsKLSAgICBtX3BEYXRhID0gY29uc3RfY2FzdDx1aW50OF90Kj4obV9BY2MuR2V0RGF0YSgpKTsKLSAgICBtX2R3U2l6ZSA9IG1fQWNjLkdldFNpemUoKTsKLSAgICBtX3BEaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOwotICAgIHJldHVybjsKLSAgfQotICAvLyBUT0RPKHRoZXN0aWcpOiBNb3ZlIHRvIEluaXQoKSBhbmQgY2hlY2sgcmV0dXJuIHZhbHVlLgotICB1aW50OF90KiBidWZmZXIgPSBudWxscHRyOwotICA6OkZsYXRlRW5jb2RlKG1fQWNjLkdldERhdGEoKSwgbV9BY2MuR2V0U2l6ZSgpLCAmYnVmZmVyLCAmbV9kd1NpemUpOwotICBtX3BEYXRhID0gc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+KGJ1ZmZlcik7Ci0gIG1fcERpY3QgPSBUb0RpY3Rpb25hcnkocFN0cmVhbS0+R2V0RGljdCgpLT5DbG9uZSgpKTsKLSAgbV9wRGljdC0+U2V0TmV3Rm9yPENQREZfTnVtYmVyPigiTGVuZ3RoIiwgc3RhdGljX2Nhc3Q8aW50PihtX2R3U2l6ZSkpOwotICBtX3BEaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiRmlsdGVyIiwgIkZsYXRlRGVjb2RlIik7Ci0gIG1fcERpY3QtPlJlbW92ZUZvcigiRGVjb2RlUGFybXMiKTsKLX0KLQotQ1BERl9GbGF0ZUVuY29kZXI6OkNQREZfRmxhdGVFbmNvZGVyKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGbGF0ZUVuY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJYUmVmU3RyZWFtKQotICAgIDogbV9kd1NpemUoMCkgewotICBpZiAoIWJGbGF0ZUVuY29kZSkgewotICAgIG1fcERhdGEgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPihwQnVmZmVyKTsKLSAgICBtX2R3U2l6ZSA9IHNpemU7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHVpbnQ4X3QqIGJ1ZmZlciA9IG51bGxwdHI7Ci0gIC8vIFRPRE8odGhlc3RpZyk6IE1vdmUgdG8gSW5pdCgpIGFuZCBjaGVjayByZXR1cm4gdmFsdWUuCi0gIGlmIChiWFJlZlN0cmVhbSkKLSAgICA6OlBuZ0VuY29kZShwQnVmZmVyLCBzaXplLCAmYnVmZmVyLCAmbV9kd1NpemUpOwotICBlbHNlCi0gICAgOjpGbGF0ZUVuY29kZShwQnVmZmVyLCBzaXplLCAmYnVmZmVyLCAmbV9kd1NpemUpOwotICBtX3BEYXRhID0gc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+KGJ1ZmZlcik7Ci19Ci0KLUNQREZfRmxhdGVFbmNvZGVyOjp+Q1BERl9GbGF0ZUVuY29kZXIoKSB7fQotCi1jbGFzcyBDUERGX0VuY3J5cHRvciB7Ci0gcHVibGljOgotICBDUERGX0VuY3J5cHRvcihDUERGX0NyeXB0b0hhbmRsZXIqIHBIYW5kbGVyLAotICAgICAgICAgICAgICAgICBpbnQgb2JqbnVtLAotICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfZGF0YSwKLSAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NpemUpOwotICB+Q1BERl9FbmNyeXB0b3IoKTsKLQotICB1aW50OF90KiBtX3BEYXRhOwotICB1aW50MzJfdCBtX2R3U2l6ZTsKLSAgYm9vbCBtX2JOZXdCdWY7Ci19OwotCi1DUERGX0VuY3J5cHRvcjo6Q1BERl9FbmNyeXB0b3IoQ1BERl9DcnlwdG9IYW5kbGVyKiBwSGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2JqbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY19zaXplKQotICAgIDogbV9wRGF0YShudWxscHRyKSwgbV9kd1NpemUoMCksIG1fYk5ld0J1ZihmYWxzZSkgewotICBpZiAoc3JjX3NpemUgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKCFwSGFuZGxlcikgewotICAgIG1fcERhdGEgPSAodWludDhfdCopc3JjX2RhdGE7Ci0gICAgbV9kd1NpemUgPSBzcmNfc2l6ZTsKLSAgICByZXR1cm47Ci0gIH0KLSAgbV9kd1NpemUgPSBwSGFuZGxlci0+RW5jcnlwdEdldFNpemUob2JqbnVtLCAwLCBzcmNfZGF0YSwgc3JjX3NpemUpOwotICBtX3BEYXRhID0gRlhfQWxsb2ModWludDhfdCwgbV9kd1NpemUpOwotICBwSGFuZGxlci0+RW5jcnlwdENvbnRlbnQob2JqbnVtLCAwLCBzcmNfZGF0YSwgc3JjX3NpemUsIG1fcERhdGEsIG1fZHdTaXplKTsKLSAgbV9iTmV3QnVmID0gdHJ1ZTsKLX0KLQotQ1BERl9FbmNyeXB0b3I6On5DUERGX0VuY3J5cHRvcigpIHsKLSAgaWYgKG1fYk5ld0J1ZikKLSAgICBGWF9GcmVlKG1fcERhdGEpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotQ1BERl9PYmplY3RTdHJlYW06OkNQREZfT2JqZWN0U3RyZWFtKCkgOiBtX2R3T2JqTnVtKDApLCBtX2luZGV4KDApIHt9Ci0KLUNQREZfT2JqZWN0U3RyZWFtOjp+Q1BERl9PYmplY3RTdHJlYW0oKSB7fQotCi12b2lkIENQREZfT2JqZWN0U3RyZWFtOjpTdGFydCgpIHsKLSAgbV9JdGVtcy5jbGVhcigpOwotICBtX0J1ZmZlci5DbGVhcigpOwotICBtX2R3T2JqTnVtID0gMDsKLSAgbV9pbmRleCA9IDA7Ci19Ci0KLXZvaWQgQ1BERl9PYmplY3RTdHJlYW06OkNvbXByZXNzSW5kaXJlY3RPYmplY3QodWludDMyX3QgZHdPYmpOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqKSB7Ci0gIG1fSXRlbXMucHVzaF9iYWNrKHtkd09iak51bSwgbV9CdWZmZXIuR2V0TGVuZ3RoKCl9KTsKLSAgbV9CdWZmZXIgPDwgcE9iajsKLX0KLQotdm9pZCBDUERGX09iamVjdFN0cmVhbTo6Q29tcHJlc3NJbmRpcmVjdE9iamVjdCh1aW50MzJfdCBkd09iak51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTaXplKSB7Ci0gIG1fSXRlbXMucHVzaF9iYWNrKHtkd09iak51bSwgbV9CdWZmZXIuR2V0TGVuZ3RoKCl9KTsKLSAgbV9CdWZmZXIuQXBwZW5kQmxvY2socEJ1ZmZlciwgZHdTaXplKTsKLX0KLQotRlhfRklMRVNJWkUgQ1BERl9PYmplY3RTdHJlYW06OkVuZChDUERGX0NyZWF0b3IqIHBDcmVhdG9yKSB7Ci0gIEFTU0VSVChwQ3JlYXRvcik7Ci0gIGlmIChtX0l0ZW1zLmVtcHR5KCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKiBwRmlsZSA9ICZwQ3JlYXRvci0+bV9GaWxlOwotICBGWF9GSUxFU0laRSBPYmpPZmZzZXQgPSBwQ3JlYXRvci0+bV9PZmZzZXQ7Ci0gIGlmICghbV9kd09iak51bSkgewotICAgIG1fZHdPYmpOdW0gPSArK3BDcmVhdG9yLT5tX2R3TGFzdE9iak51bTsKLSAgfQotICBDRlhfQnl0ZVRleHRCdWYgdGVtcEJ1ZmZlcjsKLSAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbV9JdGVtcykKLSAgICB0ZW1wQnVmZmVyIDw8IHBhaXIub2JqbnVtIDw8ICIgIiA8PCBwYWlyLm9mZnNldCA8PCAiICI7Ci0KLSAgRlhfRklMRVNJWkUmIG9mZnNldCA9IHBDcmVhdG9yLT5tX09mZnNldDsKLSAgaW50MzJfdCBsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQobV9kd09iak51bSk7Ci0gIGlmIChsZW4gPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIG9mZnNldCArPSBsZW47Ci0gIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZygiIDAgb2JqXHJcbjw8L1R5cGUgL09ialN0bSAvTiAiKSkgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIG9mZnNldCArPSBsZW47Ci0gIHVpbnQzMl90IGlDb3VudCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8dWludDMyX3Q+KG1fSXRlbXMpOwotICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChpQ291bnQpKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgb2Zmc2V0ICs9IGxlbjsKLSAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIi9GaXJzdCAiKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQoKHVpbnQzMl90KXRlbXBCdWZmZXIuR2V0TGVuZ3RoKCkpKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIi9MZW5ndGggIikgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIG9mZnNldCArPSBsZW4gKyAxNTsKLQotICB0ZW1wQnVmZmVyIDw8IG1fQnVmZmVyOwotICBDUERGX0ZsYXRlRW5jb2RlciBlbmNvZGVyKHRlbXBCdWZmZXIuR2V0QnVmZmVyKCksIHRlbXBCdWZmZXIuR2V0TGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UpOwotICBDUERGX0VuY3J5cHRvciBlbmNyeXB0b3IocENyZWF0b3ItPm1fcENyeXB0b0hhbmRsZXIsIG1fZHdPYmpOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLm1fcERhdGEuR2V0KCksIGVuY29kZXIubV9kd1NpemUpOwotICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChlbmNyeXB0b3IubV9kd1NpemUpKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgb2Zmc2V0ICs9IGxlbjsKLSAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIi9GaWx0ZXIgL0ZsYXRlRGVjb2RlIikgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIG9mZnNldCArPSAyMDsKLSAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kU3RyaW5nKCI+PnN0cmVhbVxyXG4iKSkgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChwRmlsZS0+QXBwZW5kQmxvY2soZW5jcnlwdG9yLm1fcERhdGEsIGVuY3J5cHRvci5tX2R3U2l6ZSkgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIG9mZnNldCArPSBsZW4gKyBlbmNyeXB0b3IubV9kd1NpemU7Ci0gIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZygiXHJcbmVuZHN0cmVhbVxyXG5lbmRvYmpcclxuIikpIDwgMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBvZmZzZXQgKz0gbGVuOwotICByZXR1cm4gT2JqT2Zmc2V0OwotfQotCi1DUERGX1hSZWZTdHJlYW06OkNQREZfWFJlZlN0cmVhbSgpCi0gICAgOiBtX1ByZXZPZmZzZXQoMCksIG1fZHdUZW1wT2JqTnVtKDApLCBtX2lTZWcoMCkge30KLQotQ1BERl9YUmVmU3RyZWFtOjp+Q1BERl9YUmVmU3RyZWFtKCkge30KLQotYm9vbCBDUERGX1hSZWZTdHJlYW06OlN0YXJ0KCkgewotICBtX0luZGV4QXJyYXkuY2xlYXIoKTsKLSAgbV9CdWZmZXIuQ2xlYXIoKTsKLSAgbV9pU2VnID0gMDsKLSAgcmV0dXJuIHRydWU7Ci19Ci1pbnQzMl90IENQREZfWFJlZlN0cmVhbTo6Q29tcHJlc3NJbmRpcmVjdE9iamVjdCh1aW50MzJfdCBkd09iak51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9DcmVhdG9yKiBwQ3JlYXRvcikgewotICBpZiAoIXBDcmVhdG9yKQotICAgIHJldHVybiAwOwotCi0gIG1fT2JqU3RyZWFtLkNvbXByZXNzSW5kaXJlY3RPYmplY3QoZHdPYmpOdW0sIHBPYmopOwotICBpZiAocGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX09ialN0cmVhbS5tX0l0ZW1zKSA8Ci0gICAgICAgICAgcENyZWF0b3ItPm1fT2JqZWN0U3RyZWFtU2l6ZSAmJgotICAgICAgbV9PYmpTdHJlYW0ubV9CdWZmZXIuR2V0TGVuZ3RoKCkgPCBQREZfT0JKRUNUU1RSRUFNX01BWExFTkdUSCkgewotICAgIHJldHVybiAxOwotICB9Ci0gIHJldHVybiBFbmRPYmplY3RTdHJlYW0ocENyZWF0b3IpOwotfQotaW50MzJfdCBDUERGX1hSZWZTdHJlYW06OkNvbXByZXNzSW5kaXJlY3RPYmplY3QodWludDMyX3QgZHdPYmpOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9DcmVhdG9yKiBwQ3JlYXRvcikgewotICBpZiAoIXBDcmVhdG9yKQotICAgIHJldHVybiAwOwotCi0gIG1fT2JqU3RyZWFtLkNvbXByZXNzSW5kaXJlY3RPYmplY3QoZHdPYmpOdW0sIHBCdWZmZXIsIGR3U2l6ZSk7Ci0gIGlmIChwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fT2JqU3RyZWFtLm1fSXRlbXMpIDwKLSAgICAgICAgICBwQ3JlYXRvci0+bV9PYmplY3RTdHJlYW1TaXplICYmCi0gICAgICBtX09ialN0cmVhbS5tX0J1ZmZlci5HZXRMZW5ndGgoKSA8IFBERl9PQkpFQ1RTVFJFQU1fTUFYTEVOR1RIKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgcmV0dXJuIEVuZE9iamVjdFN0cmVhbShwQ3JlYXRvcik7Ci19Ci0KLWludDMyX3QgQ1BERl9YUmVmU3RyZWFtOjpFbmRPYmplY3RTdHJlYW0oQ1BERl9DcmVhdG9yKiBwQ3JlYXRvciwgYm9vbCBiRU9GKSB7Ci0gIEZYX0ZJTEVTSVpFIG9iak9mZnNldCA9IDA7Ci0gIGlmIChiRU9GKSB7Ci0gICAgb2JqT2Zmc2V0ID0gbV9PYmpTdHJlYW0uRW5kKHBDcmVhdG9yKTsKLSAgICBpZiAob2JqT2Zmc2V0IDwgMCkgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgfQotICB1aW50MzJfdCYgZHdPYmpTdG1OdW0gPSBtX09ialN0cmVhbS5tX2R3T2JqTnVtOwotICBpZiAoIWR3T2JqU3RtTnVtKSB7Ci0gICAgZHdPYmpTdG1OdW0gPSArK3BDcmVhdG9yLT5tX2R3TGFzdE9iak51bTsKLSAgfQotICBpbnQzMl90IGlTaXplID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX09ialN0cmVhbS5tX0l0ZW1zKTsKLSAgc2l6ZV90IGlTZWcgPSBtX0luZGV4QXJyYXkuc2l6ZSgpOwotICBpZiAoIShwQ3JlYXRvci0+bV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkpIHsKLSAgICBpZiAobV9kd1RlbXBPYmpOdW0gPT0gMCkgewotICAgICAgQXBwZW5kSW5kZXgwKG1fQnVmZmVyLCB0cnVlKTsKLSAgICAgIG1fZHdUZW1wT2JqTnVtKys7Ci0gICAgfQotICAgIHVpbnQzMl90IGVuZF9udW0gPSBtX0luZGV4QXJyYXkuYmFjaygpLm9iam51bSArIG1fSW5kZXhBcnJheS5iYWNrKCkuY291bnQ7Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICBmb3IgKDsgbV9kd1RlbXBPYmpOdW0gPCBlbmRfbnVtOyBtX2R3VGVtcE9iak51bSsrKSB7Ci0gICAgICBGWF9GSUxFU0laRSogb2Zmc2V0ID0gcENyZWF0b3ItPm1fT2JqZWN0T2Zmc2V0LkdldFB0ckF0KG1fZHdUZW1wT2JqTnVtKTsKLSAgICAgIGlmIChvZmZzZXQpIHsKLSAgICAgICAgaWYgKGluZGV4ID49IGlTaXplIHx8Ci0gICAgICAgICAgICBtX2R3VGVtcE9iak51bSAhPSBtX09ialN0cmVhbS5tX0l0ZW1zW2luZGV4XS5vYmpudW0pIHsKLSAgICAgICAgICBBcHBlbmRJbmRleDEobV9CdWZmZXIsICpvZmZzZXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEFwcGVuZEluZGV4MihtX0J1ZmZlciwgZHdPYmpTdG1OdW0sIGluZGV4KyspOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBcHBlbmRJbmRleDAobV9CdWZmZXIsIGZhbHNlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGlTaXplID4gMCAmJiBiRU9GKSB7Ci0gICAgICBwQ3JlYXRvci0+bV9PYmplY3RPZmZzZXQuQWRkKGR3T2JqU3RtTnVtLCAxKTsKLSAgICAgIHBDcmVhdG9yLT5tX09iamVjdE9mZnNldFtkd09ialN0bU51bV0gPSBvYmpPZmZzZXQ7Ci0gICAgfQotICAgIG1faVNlZyA9IGlTZWc7Ci0gICAgaWYgKGJFT0YpIHsKLSAgICAgIG1fT2JqU3RyZWFtLlN0YXJ0KCk7Ci0gICAgfQotICAgIHJldHVybiAxOwotICB9Ci0gIGZvciAoYXV0byBpdCA9IG1fSW5kZXhBcnJheS5iZWdpbigpICsgbV9pU2VnOyBpdCAhPSBtX0luZGV4QXJyYXkuZW5kKCk7Ci0gICAgICAgKytpdCkgewotICAgIGZvciAodWludDMyX3QgbSA9IGl0LT5vYmpudW07IG0gPCBpdC0+b2JqbnVtICsgaXQtPmNvdW50OyArK20pIHsKLSAgICAgIGlmIChtX09ialN0cmVhbS5tX2luZGV4ID49IGlTaXplIHx8Ci0gICAgICAgICAgbSAhPSBtX09ialN0cmVhbS5tX0l0ZW1zW2l0IC0gbV9JbmRleEFycmF5LmJlZ2luKCldLm9iam51bSkgewotICAgICAgICBBcHBlbmRJbmRleDEobV9CdWZmZXIsIHBDcmVhdG9yLT5tX09iamVjdE9mZnNldFttXSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBcHBlbmRJbmRleDIobV9CdWZmZXIsIGR3T2JqU3RtTnVtLCBtX09ialN0cmVhbS5tX2luZGV4KyspOwotICAgICAgfQotICAgIH0KLSAgfQotICBpZiAoaVNpemUgPiAwICYmIGJFT0YpIHsKLSAgICBBcHBlbmRJbmRleDEobV9CdWZmZXIsIG9iak9mZnNldCk7Ci0gICAgbV9JbmRleEFycmF5LnB1c2hfYmFjayh7ZHdPYmpTdG1OdW0sIDF9KTsKLSAgICBpU2VnICs9IDE7Ci0gIH0KLSAgbV9pU2VnID0gaVNlZzsKLSAgaWYgKGJFT0YpIHsKLSAgICBtX09ialN0cmVhbS5TdGFydCgpOwotICB9Ci0gIHJldHVybiAxOwotfQotYm9vbCBDUERGX1hSZWZTdHJlYW06OkdlbmVyYXRlWFJlZlN0cmVhbShDUERGX0NyZWF0b3IqIHBDcmVhdG9yLCBib29sIGJFT0YpIHsKLSAgRlhfRklMRVNJWkUgb2Zmc2V0X3RtcCA9IHBDcmVhdG9yLT5tX09mZnNldDsKLSAgdWludDMyX3Qgb2JqbnVtID0gKytwQ3JlYXRvci0+bV9kd0xhc3RPYmpOdW07Ci0gIENGWF9GaWxlQnVmZmVyQXJjaGl2ZSogcEZpbGUgPSAmcENyZWF0b3ItPm1fRmlsZTsKLSAgYm9vbCBiSW5jcmVtZW50YWwgPSAocENyZWF0b3ItPm1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpICE9IDA7Ci0gIGlmIChiSW5jcmVtZW50YWwpIHsKLSAgICBBZGRPYmplY3ROdW1iZXJUb0luZGV4QXJyYXkob2JqbnVtKTsKLSAgfSBlbHNlIHsKLSAgICBmb3IgKDsgbV9kd1RlbXBPYmpOdW0gPCBwQ3JlYXRvci0+bV9kd0xhc3RPYmpOdW07IG1fZHdUZW1wT2JqTnVtKyspIHsKLSAgICAgIEZYX0ZJTEVTSVpFKiBvZmZzZXQgPSBwQ3JlYXRvci0+bV9PYmplY3RPZmZzZXQuR2V0UHRyQXQobV9kd1RlbXBPYmpOdW0pOwotICAgICAgaWYgKG9mZnNldCkgewotICAgICAgICBBcHBlbmRJbmRleDEobV9CdWZmZXIsICpvZmZzZXQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQXBwZW5kSW5kZXgwKG1fQnVmZmVyLCBmYWxzZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIEFwcGVuZEluZGV4MShtX0J1ZmZlciwgb2Zmc2V0X3RtcCk7Ci0gIEZYX0ZJTEVTSVpFJiBvZmZzZXQgPSBwQ3JlYXRvci0+bV9PZmZzZXQ7Ci0gIGludDMyX3QgbGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKG9iam51bSk7Ci0gIGlmIChsZW4gPCAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIG9mZnNldCArPSBsZW47Ci0gIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZygiIDAgb2JqXHJcbjw8L1R5cGUgL1hSZWYvV1sxIDQgMl0vSW5kZXhbIikpIDwKLSAgICAgIDApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgb2Zmc2V0ICs9IGxlbjsKLSAgaWYgKCFiSW5jcmVtZW50YWwpIHsKLSAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZCgwKSkgPCAwKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZygiICIpKSA8IDApIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgb2Zmc2V0ICs9IGxlbiArIDE7Ci0gICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQob2JqbnVtICsgMSkpIDwgMCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBvZmZzZXQgKz0gbGVuOwotICB9IGVsc2UgewotICAgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1fSW5kZXhBcnJheSkgewotICAgICAgaWYgKChsZW4gPSBwRmlsZS0+QXBwZW5kRFdvcmQocGFpci5vYmpudW0pKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIiAiKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgb2Zmc2V0ICs9IGxlbiArIDE7Ci0gICAgICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChwYWlyLmNvdW50KSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCIgIikgPCAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIG9mZnNldCArPSBsZW4gKyAxOwotICAgIH0KLSAgfQotICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygiXS9TaXplICIpIDwgMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmREV29yZChvYmpudW0gKyAxKSkgPCAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIG9mZnNldCArPSBsZW4gKyA3OwotICBpZiAobV9QcmV2T2Zmc2V0ID4gMCkgewotICAgIGlmIChwRmlsZS0+QXBwZW5kU3RyaW5nKCIvUHJldiAiKSA8IDApIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgRlhfQ0hBUiBvZmZzZXRfYnVmWzIwXTsKLSAgICBGWFNZU19tZW1zZXQob2Zmc2V0X2J1ZiwgMCwgc2l6ZW9mKG9mZnNldF9idWYpKTsKLSAgICBGWFNZU19pNjR0b2EobV9QcmV2T2Zmc2V0LCBvZmZzZXRfYnVmLCAxMCk7Ci0gICAgaW50MzJfdCBvZmZzZXRfbGVuID0gKGludDMyX3QpRlhTWVNfc3RybGVuKG9mZnNldF9idWYpOwotICAgIGlmIChwRmlsZS0+QXBwZW5kQmxvY2sob2Zmc2V0X2J1Ziwgb2Zmc2V0X2xlbikgPCAwKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIG9mZnNldCArPSBvZmZzZXRfbGVuICsgNjsKLSAgfQotICBDUERGX0ZsYXRlRW5jb2RlciBlbmNvZGVyKG1fQnVmZmVyLkdldEJ1ZmZlcigpLCBtX0J1ZmZlci5HZXRMZW5ndGgoKSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgaWYgKHBGaWxlLT5BcHBlbmRTdHJpbmcoIi9GaWx0ZXIgL0ZsYXRlRGVjb2RlIikgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBvZmZzZXQgKz0gMjA7Ci0gIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZygiL0RlY29kZVBhcm1zPDwvQ29sdW1ucyA3L1ByZWRpY3RvciAxMj4+IikpIDwKLSAgICAgIDApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBvZmZzZXQgKz0gbGVuOwotICBpZiAocEZpbGUtPkFwcGVuZFN0cmluZygiL0xlbmd0aCAiKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZERXb3JkKGVuY29kZXIubV9kd1NpemUpKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG9mZnNldCArPSBsZW4gKyA4OwotICBpZiAoYkVPRikgewotICAgIGlmICgobGVuID0gUERGX0NyZWF0b3JXcml0ZVRyYWlsZXIocENyZWF0b3ItPm1fcERvY3VtZW50LCBwRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDcmVhdG9yLT5tX3BJREFycmF5LmdldCgpKSkgPCAwKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIG9mZnNldCArPSBsZW47Ci0gICAgaWYgKHBDcmVhdG9yLT5tX3BFbmNyeXB0RGljdCkgewotICAgICAgdWludDMyX3QgZHdFbmNyeXB0T2JqTnVtID0gcENyZWF0b3ItPm1fcEVuY3J5cHREaWN0LT5HZXRPYmpOdW0oKTsKLSAgICAgIGlmIChkd0VuY3J5cHRPYmpOdW0gPT0gMCkgewotICAgICAgICBkd0VuY3J5cHRPYmpOdW0gPSBwQ3JlYXRvci0+bV9kd0VuY3J5cHRPYmpOdW07Ci0gICAgICB9Ci0gICAgICBpZiAoKGxlbiA9IFBERl9DcmVhdG9yV3JpdGVFbmNyeXB0KHBDcmVhdG9yLT5tX3BFbmNyeXB0RGljdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdFbmNyeXB0T2JqTnVtLCBwRmlsZSkpIDwgMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBvZmZzZXQgKz0gbGVuOwotICAgIH0KLSAgfQotICBpZiAoKGxlbiA9IHBGaWxlLT5BcHBlbmRTdHJpbmcoIj4+c3RyZWFtXHJcbiIpKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG9mZnNldCArPSBsZW47Ci0gIGlmIChwRmlsZS0+QXBwZW5kQmxvY2soZW5jb2Rlci5tX3BEYXRhLkdldCgpLCBlbmNvZGVyLm1fZHdTaXplKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZygiXHJcbmVuZHN0cmVhbVxyXG5lbmRvYmpcclxuIikpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgb2Zmc2V0ICs9IGVuY29kZXIubV9kd1NpemUgKyBsZW47Ci0gIG1fUHJldk9mZnNldCA9IG9mZnNldF90bXA7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENQREZfWFJlZlN0cmVhbTo6RW5kKENQREZfQ3JlYXRvciogcENyZWF0b3IsIGJvb2wgYkVPRikgewotICBpZiAoRW5kT2JqZWN0U3RyZWFtKHBDcmVhdG9yLCBiRU9GKSA8IDApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIEdlbmVyYXRlWFJlZlN0cmVhbShwQ3JlYXRvciwgYkVPRik7Ci19Ci1ib29sIENQREZfWFJlZlN0cmVhbTo6RW5kWFJlZlN0cmVhbShDUERGX0NyZWF0b3IqIHBDcmVhdG9yKSB7Ci0gIGlmICghKHBDcmVhdG9yLT5tX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSkgewotICAgIEFwcGVuZEluZGV4MChtX0J1ZmZlciwgdHJ1ZSk7Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMTsgaSA8IHBDcmVhdG9yLT5tX2R3TGFzdE9iak51bSArIDE7IGkrKykgewotICAgICAgRlhfRklMRVNJWkUqIG9mZnNldCA9IHBDcmVhdG9yLT5tX09iamVjdE9mZnNldC5HZXRQdHJBdChpKTsKLSAgICAgIGlmIChvZmZzZXQpIHsKLSAgICAgICAgQXBwZW5kSW5kZXgxKG1fQnVmZmVyLCAqb2Zmc2V0KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEFwcGVuZEluZGV4MChtX0J1ZmZlciwgZmFsc2UpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtX0luZGV4QXJyYXkpIHsKLSAgICAgIGZvciAodWludDMyX3QgaiA9IHBhaXIub2JqbnVtOyBqIDwgcGFpci5vYmpudW0gKyBwYWlyLmNvdW50OyArK2opCi0gICAgICAgIEFwcGVuZEluZGV4MShtX0J1ZmZlciwgcENyZWF0b3ItPm1fT2JqZWN0T2Zmc2V0W2pdKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIEdlbmVyYXRlWFJlZlN0cmVhbShwQ3JlYXRvciwgZmFsc2UpOwotfQotdm9pZCBDUERGX1hSZWZTdHJlYW06OkFkZE9iamVjdE51bWJlclRvSW5kZXhBcnJheSh1aW50MzJfdCBvYmpudW0pIHsKLSAgaWYgKG1fSW5kZXhBcnJheS5lbXB0eSgpKSB7Ci0gICAgbV9JbmRleEFycmF5LnB1c2hfYmFjayh7b2JqbnVtLCAxfSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHVpbnQzMl90IG5leHRfb2JqbnVtID0gbV9JbmRleEFycmF5LmJhY2soKS5vYmpudW0gKyBtX0luZGV4QXJyYXkuYmFjaygpLmNvdW50OwotICBpZiAob2JqbnVtID09IG5leHRfb2JqbnVtKQotICAgIG1fSW5kZXhBcnJheS5iYWNrKCkuY291bnQgKz0gMTsKLSAgZWxzZQotICAgIG1fSW5kZXhBcnJheS5wdXNoX2JhY2soe29iam51bSwgMX0pOwotfQotCi1DUERGX0NyZWF0b3I6OkNQREZfQ3JlYXRvcihDUERGX0RvY3VtZW50KiBwRG9jKQotICAgIDogbV9wRG9jdW1lbnQocERvYyksCi0gICAgICBtX3BQYXJzZXIocERvYy0+R2V0UGFyc2VyKCkpLAotICAgICAgbV9iU2VjdXJpdHlDaGFuZ2VkKGZhbHNlKSwKLSAgICAgIG1fcEVuY3J5cHREaWN0KG1fcFBhcnNlciA/IG1fcFBhcnNlci0+R2V0RW5jcnlwdERpY3QoKSA6IG51bGxwdHIpLAotICAgICAgbV9kd0VuY3J5cHRPYmpOdW0oMCksCi0gICAgICBtX2JFbmNyeXB0Q2xvbmVkKGZhbHNlKSwKLSAgICAgIG1fcENyeXB0b0hhbmRsZXIobV9wUGFyc2VyID8gbV9wUGFyc2VyLT5HZXRDcnlwdG9IYW5kbGVyKCkgOiBudWxscHRyKSwKLSAgICAgIG1fYkxvY2FsQ3J5cHRvSGFuZGxlcihmYWxzZSksCi0gICAgICBtX3BNZXRhZGF0YShudWxscHRyKSwKLSAgICAgIG1fT2JqZWN0U3RyZWFtU2l6ZSgyMDApLAotICAgICAgbV9kd0xhc3RPYmpOdW0obV9wRG9jdW1lbnQtPkdldExhc3RPYmpOdW0oKSksCi0gICAgICBtX09mZnNldCgwKSwKLSAgICAgIG1faVN0YWdlKC0xKSwKLSAgICAgIG1fZHdGbGFncygwKSwKLSAgICAgIG1fUG9zKG51bGxwdHIpLAotICAgICAgbV9YcmVmU3RhcnQoMCksCi0gICAgICBtX3BJREFycmF5KG51bGxwdHIpLAotICAgICAgbV9GaWxlVmVyc2lvbigwKSB7fQotCi1DUERGX0NyZWF0b3I6On5DUERGX0NyZWF0b3IoKSB7Ci0gIFJlc2V0U3RhbmRhcmRTZWN1cml0eSgpOwotICBpZiAobV9iRW5jcnlwdENsb25lZCkgewotICAgIGRlbGV0ZSBtX3BFbmNyeXB0RGljdDsKLSAgICBtX3BFbmNyeXB0RGljdCA9IG51bGxwdHI7Ci0gIH0KLSAgQ2xlYXIoKTsKLX0KLQotaW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlSW5kaXJlY3RPYmplY3RUb1N0cmVhbShjb25zdCBDUERGX09iamVjdCogcE9iaikgewotICBpZiAoIW1fcFhSZWZTdHJlYW0pCi0gICAgcmV0dXJuIDE7Ci0KLSAgdWludDMyX3Qgb2JqbnVtID0gcE9iai0+R2V0T2JqTnVtKCk7Ci0gIGlmIChtX3BQYXJzZXIgJiYgbV9wUGFyc2VyLT5HZXRPYmplY3RHZW5OdW0ob2JqbnVtKSA+IDApCi0gICAgcmV0dXJuIDE7Ci0KLSAgaWYgKHBPYmotPklzTnVtYmVyKCkpCi0gICAgcmV0dXJuIDE7Ci0KLSAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBPYmotPkdldERpY3QoKTsKLSAgaWYgKHBPYmotPklzU3RyZWFtKCkpIHsKLSAgICBpZiAocERpY3QgJiYgcERpY3QtPkdldFN0cmluZ0ZvcigiVHlwZSIpID09ICJYUmVmIikKLSAgICAgIHJldHVybiAwOwotICAgIHJldHVybiAxOwotICB9Ci0KLSAgaWYgKHBEaWN0KSB7Ci0gICAgaWYgKHBEaWN0ID09IG1fcERvY3VtZW50LT5HZXRSb290KCkgfHwgcERpY3QgPT0gbV9wRW5jcnlwdERpY3QpCi0gICAgICByZXR1cm4gMTsKLSAgICBpZiAocERpY3QtPklzU2lnbmF0dXJlRGljdCgpKQotICAgICAgcmV0dXJuIDE7Ci0gICAgaWYgKHBEaWN0LT5HZXRTdHJpbmdGb3IoIlR5cGUiKSA9PSAiUGFnZSIpCi0gICAgICByZXR1cm4gMTsKLSAgfQotCi0gIG1fcFhSZWZTdHJlYW0tPkFkZE9iamVjdE51bWJlclRvSW5kZXhBcnJheShvYmpudW0pOwotICBpZiAobV9wWFJlZlN0cmVhbS0+Q29tcHJlc3NJbmRpcmVjdE9iamVjdChvYmpudW0sIHBPYmosIHRoaXMpIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0gIGlmICghSXNYUmVmTmVlZEVuZChtX3BYUmVmU3RyZWFtLmdldCgpLCBtX2R3RmxhZ3MpKQotICAgIHJldHVybiAwOwotICBpZiAoIW1fcFhSZWZTdHJlYW0tPkVuZCh0aGlzKSkKLSAgICByZXR1cm4gLTE7Ci0gIGlmICghbV9wWFJlZlN0cmVhbS0+U3RhcnQoKSkKLSAgICByZXR1cm4gLTE7Ci0gIHJldHVybiAwOwotfQotaW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlSW5kaXJlY3RPYmplY3RUb1N0cmVhbSh1aW50MzJfdCBvYmpudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U2l6ZSkgewotICBpZiAoIW1fcFhSZWZTdHJlYW0pIHsKLSAgICByZXR1cm4gMTsKLSAgfQotICBtX3BYUmVmU3RyZWFtLT5BZGRPYmplY3ROdW1iZXJUb0luZGV4QXJyYXkob2JqbnVtKTsKLSAgaW50MzJfdCBpUmV0ID0KLSAgICAgIG1fcFhSZWZTdHJlYW0tPkNvbXByZXNzSW5kaXJlY3RPYmplY3Qob2JqbnVtLCBwQnVmZmVyLCBkd1NpemUsIHRoaXMpOwotICBpZiAoaVJldCA8IDEpIHsKLSAgICByZXR1cm4gaVJldDsKLSAgfQotICBpZiAoIUlzWFJlZk5lZWRFbmQobV9wWFJlZlN0cmVhbS5nZXQoKSwgbV9kd0ZsYWdzKSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIGlmICghbV9wWFJlZlN0cmVhbS0+RW5kKHRoaXMpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmICghbV9wWFJlZlN0cmVhbS0+U3RhcnQoKSkgewotICAgIHJldHVybiAtMTsKLSAgfQotICByZXR1cm4gMDsKLX0KLWludDMyX3QgQ1BERl9DcmVhdG9yOjpBcHBlbmRPYmplY3ROdW1iZXJUb1hSZWYodWludDMyX3Qgb2JqbnVtKSB7Ci0gIGlmICghbV9wWFJlZlN0cmVhbSkgewotICAgIHJldHVybiAxOwotICB9Ci0gIG1fcFhSZWZTdHJlYW0tPkFkZE9iamVjdE51bWJlclRvSW5kZXhBcnJheShvYmpudW0pOwotICBpZiAoIUlzWFJlZk5lZWRFbmQobV9wWFJlZlN0cmVhbS5nZXQoKSwgbV9kd0ZsYWdzKSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIGlmICghbV9wWFJlZlN0cmVhbS0+RW5kKHRoaXMpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmICghbV9wWFJlZlN0cmVhbS0+U3RhcnQoKSkgewotICAgIHJldHVybiAtMTsKLSAgfQotICByZXR1cm4gMDsKLX0KLWludDMyX3QgQ1BERl9DcmVhdG9yOjpXcml0ZVN0cmVhbShjb25zdCBDUERGX09iamVjdCogcFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvYmpudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9DcnlwdG9IYW5kbGVyKiBwQ3J5cHRvKSB7Ci0gIENQREZfRmxhdGVFbmNvZGVyIGVuY29kZXIoY29uc3RfY2FzdDxDUERGX1N0cmVhbSo+KHBTdHJlYW0tPkFzU3RyZWFtKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW0gIT0gbV9wTWV0YWRhdGEpOwotICBDUERGX0VuY3J5cHRvciBlbmNyeXB0b3IocENyeXB0bywgb2JqbnVtLCBlbmNvZGVyLm1fcERhdGEuR2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLm1fZHdTaXplKTsKLSAgaWYgKHN0YXRpY19jYXN0PHVpbnQzMl90PihlbmNvZGVyLm1fcERpY3QtPkdldEludGVnZXJGb3IoIkxlbmd0aCIpKSAhPQotICAgICAgZW5jcnlwdG9yLm1fZHdTaXplKSB7Ci0gICAgZW5jb2Rlci5DbG9uZURpY3QoKTsKLSAgICBlbmNvZGVyLm1fcERpY3QtPlNldE5ld0ZvcjxDUERGX051bWJlcj4oCi0gICAgICAgICJMZW5ndGgiLCBzdGF0aWNfY2FzdDxpbnQ+KGVuY3J5cHRvci5tX2R3U2l6ZSkpOwotICB9Ci0gIGlmIChXcml0ZURpcmVjdE9iaihvYmpudW0sIGVuY29kZXIubV9wRGljdC5HZXQoKSkgPCAwKQotICAgIHJldHVybiAtMTsKLQotICBpbnQgbGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZygic3RyZWFtXHJcbiIpOwotICBpZiAobGVuIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgbV9PZmZzZXQgKz0gbGVuOwotICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKGVuY3J5cHRvci5tX3BEYXRhLCBlbmNyeXB0b3IubV9kd1NpemUpIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgbV9PZmZzZXQgKz0gZW5jcnlwdG9yLm1fZHdTaXplOwotICBpZiAoKGxlbiA9IG1fRmlsZS5BcHBlbmRTdHJpbmcoIlxyXG5lbmRzdHJlYW0iKSkgPCAwKQotICAgIHJldHVybiAtMTsKLQotICBtX09mZnNldCArPSBsZW47Ci0gIHJldHVybiAxOwotfQotaW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlSW5kaXJlY3RPYmoodWludDMyX3Qgb2JqbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9PYmplY3QqIHBPYmopIHsKLSAgaW50MzJfdCBsZW4gPSBtX0ZpbGUuQXBwZW5kRFdvcmQob2JqbnVtKTsKLSAgaWYgKGxlbiA8IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIG1fT2Zmc2V0ICs9IGxlbjsKLSAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKCIgMCBvYmpcclxuIikpIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgbV9PZmZzZXQgKz0gbGVuOwotICBpZiAocE9iai0+SXNTdHJlYW0oKSkgewotICAgIENQREZfQ3J5cHRvSGFuZGxlciogcEhhbmRsZXIgPQotICAgICAgICBwT2JqICE9IG1fcE1ldGFkYXRhID8gbV9wQ3J5cHRvSGFuZGxlciA6IG51bGxwdHI7Ci0gICAgaWYgKFdyaXRlU3RyZWFtKHBPYmosIG9iam51bSwgcEhhbmRsZXIpIDwgMCkKLSAgICAgIHJldHVybiAtMTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoV3JpdGVEaXJlY3RPYmoob2JqbnVtLCBwT2JqKSA8IDApCi0gICAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKCJcclxuZW5kb2JqXHJcbiIpKSA8IDApCi0gICAgcmV0dXJuIC0xOwotCi0gIG1fT2Zmc2V0ICs9IGxlbjsKLSAgaWYgKEFwcGVuZE9iamVjdE51bWJlclRvWFJlZihvYmpudW0pIDwgMCkKLSAgICByZXR1cm4gLTE7Ci0gIHJldHVybiAwOwotfQotaW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlSW5kaXJlY3RPYmooY29uc3QgQ1BERl9PYmplY3QqIHBPYmopIHsKLSAgaW50MzJfdCBpUmV0ID0gV3JpdGVJbmRpcmVjdE9iamVjdFRvU3RyZWFtKHBPYmopOwotICBpZiAoaVJldCA8IDEpIHsKLSAgICByZXR1cm4gaVJldDsKLSAgfQotICByZXR1cm4gV3JpdGVJbmRpcmVjdE9iaihwT2JqLT5HZXRPYmpOdW0oKSwgcE9iaik7Ci19Ci1pbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVEaXJlY3RPYmoodWludDMyX3Qgb2JqbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfT2JqZWN0KiBwT2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkVuY3J5cHQpIHsKLSAgaW50MzJfdCBsZW4gPSAwOwotICBpZiAoIXBPYmopIHsKLSAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiIG51bGwiKSA8IDApIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgbV9PZmZzZXQgKz0gNTsKLSAgICByZXR1cm4gMTsKLSAgfQotICBzd2l0Y2ggKHBPYmotPkdldFR5cGUoKSkgewotICAgIGNhc2UgQ1BERl9PYmplY3Q6Ok5VTExPQko6Ci0gICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiIG51bGwiKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgbV9PZmZzZXQgKz0gNTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ1BERl9PYmplY3Q6OkJPT0xFQU46Ci0gICAgY2FzZSBDUERGX09iamVjdDo6TlVNQkVSOgotICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIiAiKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKHBPYmotPkdldFN0cmluZygpLkFzU3RyaW5nQygpKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIG1fT2Zmc2V0ICs9IGxlbiArIDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENQREZfT2JqZWN0OjpTVFJJTkc6IHsKLSAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IHBPYmotPkdldFN0cmluZygpOwotICAgICAgYm9vbCBiSGV4ID0gcE9iai0+QXNTdHJpbmcoKS0+SXNIZXgoKTsKLSAgICAgIGlmICghbV9wQ3J5cHRvSGFuZGxlciB8fCAhYkVuY3J5cHQpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY29udGVudCA9IFBERl9FbmNvZGVTdHJpbmcoc3RyLCBiSGV4KTsKLSAgICAgICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKGNvbnRlbnQuQXNTdHJpbmdDKCkpKSA8IDApIHsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgbV9PZmZzZXQgKz0gbGVuOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIENQREZfRW5jcnlwdG9yIGVuY3J5cHRvcihtX3BDcnlwdG9IYW5kbGVyLCBvYmpudW0sICh1aW50OF90KilzdHIuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIuR2V0TGVuZ3RoKCkpOwotICAgICAgQ0ZYX0J5dGVTdHJpbmcgY29udGVudCA9IFBERl9FbmNvZGVTdHJpbmcoCi0gICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcoKGNvbnN0IEZYX0NIQVIqKWVuY3J5cHRvci5tX3BEYXRhLCBlbmNyeXB0b3IubV9kd1NpemUpLAotICAgICAgICAgIGJIZXgpOwotICAgICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKGNvbnRlbnQuQXNTdHJpbmdDKCkpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgbV9PZmZzZXQgKz0gbGVuOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQ1BERl9PYmplY3Q6OlNUUkVBTTogewotICAgICAgQ1BERl9GbGF0ZUVuY29kZXIgZW5jb2Rlcihjb25zdF9jYXN0PENQREZfU3RyZWFtKj4ocE9iai0+QXNTdHJlYW0oKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgICAgQ1BERl9FbmNyeXB0b3IgZW5jcnlwdG9yKG1fcENyeXB0b0hhbmRsZXIsIG9iam51bSwgZW5jb2Rlci5tX3BEYXRhLkdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZXIubV9kd1NpemUpOwotICAgICAgaWYgKHN0YXRpY19jYXN0PHVpbnQzMl90PihlbmNvZGVyLm1fcERpY3QtPkdldEludGVnZXJGb3IoIkxlbmd0aCIpKSAhPQotICAgICAgICAgIGVuY3J5cHRvci5tX2R3U2l6ZSkgewotICAgICAgICBlbmNvZGVyLkNsb25lRGljdCgpOwotICAgICAgICBlbmNvZGVyLm1fcERpY3QtPlNldE5ld0ZvcjxDUERGX051bWJlcj4oCi0gICAgICAgICAgICAiTGVuZ3RoIiwgc3RhdGljX2Nhc3Q8aW50PihlbmNyeXB0b3IubV9kd1NpemUpKTsKLSAgICAgIH0KLSAgICAgIGlmIChXcml0ZURpcmVjdE9iaihvYmpudW0sIGVuY29kZXIubV9wRGljdC5HZXQoKSkgPCAwKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZygic3RyZWFtXHJcbiIpKSA8IDApCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgICAgbV9PZmZzZXQgKz0gbGVuOwotICAgICAgaWYgKG1fRmlsZS5BcHBlbmRCbG9jayhlbmNyeXB0b3IubV9wRGF0YSwgZW5jcnlwdG9yLm1fZHdTaXplKSA8IDApCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgICAgbV9PZmZzZXQgKz0gZW5jcnlwdG9yLm1fZHdTaXplOwotICAgICAgaWYgKChsZW4gPSBtX0ZpbGUuQXBwZW5kU3RyaW5nKCJcclxuZW5kc3RyZWFtIikpIDwgMCkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgICBtX09mZnNldCArPSBsZW47Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBDUERGX09iamVjdDo6TkFNRTogewotICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIi8iKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gcE9iai0+R2V0U3RyaW5nKCk7Ci0gICAgICBpZiAoKGxlbiA9IG1fRmlsZS5BcHBlbmRTdHJpbmcoUERGX05hbWVFbmNvZGUoc3RyKS5Bc1N0cmluZ0MoKSkpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBtX09mZnNldCArPSBsZW4gKyAxOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQ1BERl9PYmplY3Q6OlJFRkVSRU5DRTogewotICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIiAiKSA8IDApCi0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZERXb3JkKHBPYmotPkFzUmVmZXJlbmNlKCktPkdldFJlZk9iak51bSgpKSkgPCAwKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiIDAgUiIpIDwgMCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgbV9PZmZzZXQgKz0gbGVuICsgNTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIENQREZfT2JqZWN0OjpBUlJBWTogewotICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIlsiKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgbV9PZmZzZXQgKz0gMTsKLSAgICAgIGNvbnN0IENQREZfQXJyYXkqIHAgPSBwT2JqLT5Bc0FycmF5KCk7Ci0gICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHAtPkdldENvdW50KCk7IGkrKykgewotICAgICAgICBDUERGX09iamVjdCogcEVsZW1lbnQgPSBwLT5HZXRPYmplY3RBdChpKTsKLSAgICAgICAgaWYgKCFwRWxlbWVudC0+SXNJbmxpbmUoKSkgewotICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCIgIikgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZERXb3JkKHBFbGVtZW50LT5HZXRPYmpOdW0oKSkpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiIDAgUiIpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgIH0KLSAgICAgICAgICBtX09mZnNldCArPSBsZW4gKyA1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChXcml0ZURpcmVjdE9iaihvYmpudW0sIHBFbGVtZW50KSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCJdIikgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIG1fT2Zmc2V0ICs9IDE7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBDUERGX09iamVjdDo6RElDVElPTkFSWTogewotICAgICAgaWYgKCFtX3BDcnlwdG9IYW5kbGVyIHx8IHBPYmogPT0gbV9wRW5jcnlwdERpY3QpCi0gICAgICAgIHJldHVybiBQREZfQ3JlYXRvckFwcGVuZE9iamVjdChwT2JqLCAmbV9GaWxlLCBtX09mZnNldCk7Ci0gICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiPDwiKSA8IDApCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgICAgbV9PZmZzZXQgKz0gMjsKLSAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcCA9IHBPYmotPkFzRGljdGlvbmFyeSgpOwotICAgICAgYm9vbCBiU2lnbkRpY3QgPSBwLT5Jc1NpZ25hdHVyZURpY3QoKTsKLSAgICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiAqcCkgewotICAgICAgICBib29sIGJTaWduVmFsdWUgPSBmYWxzZTsKLSAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGtleSA9IGl0LmZpcnN0OwotICAgICAgICBDUERGX09iamVjdCogcFZhbHVlID0gaXQuc2Vjb25kLmdldCgpOwotICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiLyIpIDwgMCkgewotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGxlbiA9IG1fRmlsZS5BcHBlbmRTdHJpbmcoUERGX05hbWVFbmNvZGUoa2V5KS5Bc1N0cmluZ0MoKSkpIDwgMCkgewotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBtX09mZnNldCArPSBsZW4gKyAxOwotICAgICAgICBpZiAoYlNpZ25EaWN0ICYmIGtleSA9PSAiQ29udGVudHMiKSB7Ci0gICAgICAgICAgYlNpZ25WYWx1ZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwVmFsdWUtPklzSW5saW5lKCkpIHsKLSAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiICIpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoKGxlbiA9IG1fRmlsZS5BcHBlbmREV29yZChwVmFsdWUtPkdldE9iak51bSgpKSkgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCIgMCBSICIpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgIH0KLSAgICAgICAgICBtX09mZnNldCArPSBsZW4gKyA2OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChXcml0ZURpcmVjdE9iaihvYmpudW0sIHBWYWx1ZSwgIWJTaWduVmFsdWUpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIj4+IikgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIG1fT2Zmc2V0ICs9IDI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci1pbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVPbGRJbmRpcmVjdE9iamVjdCh1aW50MzJfdCBvYmpudW0pIHsKLSAgaWYgKG1fcFBhcnNlci0+SXNPYmplY3RGcmVlT3JOdWxsKG9iam51bSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgbV9PYmplY3RPZmZzZXRbb2JqbnVtXSA9IG1fT2Zmc2V0OwotICBib29sIGJFeGlzdEluTWFwID0gISFtX3BEb2N1bWVudC0+R2V0SW5kaXJlY3RPYmplY3Qob2JqbnVtKTsKLSAgY29uc3QgdWludDhfdCBvYmplY3RfdHlwZSA9IG1fcFBhcnNlci0+R2V0T2JqZWN0VHlwZShvYmpudW0pOwotICBib29sIGJPYmpTdG0gPSAob2JqZWN0X3R5cGUgPT0gMikgJiYgbV9wRW5jcnlwdERpY3QgJiYgIW1fcFhSZWZTdHJlYW07Ci0gIGlmIChtX3BQYXJzZXItPklzVmVyc2lvblVwZGF0ZWQoKSB8fCBtX2JTZWN1cml0eUNoYW5nZWQgfHwgYkV4aXN0SW5NYXAgfHwKLSAgICAgIGJPYmpTdG0pIHsKLSAgICBDUERGX09iamVjdCogcE9iaiA9IG1fcERvY3VtZW50LT5HZXRPclBhcnNlSW5kaXJlY3RPYmplY3Qob2JqbnVtKTsKLSAgICBpZiAoIXBPYmopIHsKLSAgICAgIG1fT2JqZWN0T2Zmc2V0W29iam51bV0gPSAwOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChXcml0ZUluZGlyZWN0T2JqKHBPYmopKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmICghYkV4aXN0SW5NYXApIHsKLSAgICAgIG1fcERvY3VtZW50LT5EZWxldGVJbmRpcmVjdE9iamVjdChvYmpudW0pOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB1aW50OF90KiBwQnVmZmVyOwotICAgIHVpbnQzMl90IHNpemU7Ci0gICAgbV9wUGFyc2VyLT5HZXRJbmRpcmVjdEJpbmFyeShvYmpudW0sIHBCdWZmZXIsIHNpemUpOwotICAgIGlmICghcEJ1ZmZlcikgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChvYmplY3RfdHlwZSA9PSAyKSB7Ci0gICAgICBpZiAobV9wWFJlZlN0cmVhbSkgewotICAgICAgICBpZiAoV3JpdGVJbmRpcmVjdE9iamVjdFRvU3RyZWFtKG9iam51bSwgcEJ1ZmZlciwgc2l6ZSkgPCAwKSB7Ci0gICAgICAgICAgRlhfRnJlZShwQnVmZmVyKTsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGludDMyX3QgbGVuID0gbV9GaWxlLkFwcGVuZERXb3JkKG9iam51bSk7Ci0gICAgICAgIGlmIChsZW4gPCAwKSB7Ci0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCIgMCBvYmogIikgPCAwKSB7Ci0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIG1fT2Zmc2V0ICs9IGxlbiArIDc7Ci0gICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kQmxvY2socEJ1ZmZlciwgc2l6ZSkgPCAwKSB7Ci0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIG1fT2Zmc2V0ICs9IHNpemU7Ci0gICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCJcclxuZW5kb2JqXHJcbiIpIDwgMCkgewotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBtX09mZnNldCArPSAxMDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKG1fRmlsZS5BcHBlbmRCbG9jayhwQnVmZmVyLCBzaXplKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgbV9PZmZzZXQgKz0gc2l6ZTsKLSAgICAgIGlmIChBcHBlbmRPYmplY3ROdW1iZXJUb1hSZWYob2JqbnVtKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgIH0KLSAgICBGWF9GcmVlKHBCdWZmZXIpOwotICB9Ci0gIHJldHVybiAxOwotfQotaW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlT2xkT2JqcyhJRlhfUGF1c2UqIHBQYXVzZSkgewotICB1aW50MzJfdCBuTGFzdE9iak51bSA9IG1fcFBhcnNlci0+R2V0TGFzdE9iak51bSgpOwotICBpZiAoIW1fcFBhcnNlci0+SXNWYWxpZE9iamVjdE51bWJlcihuTGFzdE9iak51bSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgdWludDMyX3Qgb2JqbnVtID0gKHVpbnQzMl90KSh1aW50cHRyX3QpbV9Qb3M7Ci0gIGZvciAoOyBvYmpudW0gPD0gbkxhc3RPYmpOdW07ICsrb2JqbnVtKSB7Ci0gICAgaW50MzJfdCBpUmV0ID0gV3JpdGVPbGRJbmRpcmVjdE9iamVjdChvYmpudW0pOwotICAgIGlmIChpUmV0IDwgMCkKLSAgICAgIHJldHVybiBpUmV0OwotCi0gICAgaWYgKCFpUmV0KQotICAgICAgY29udGludWU7Ci0KLSAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgbV9Qb3MgPSAodm9pZCopKHVpbnRwdHJfdCkob2JqbnVtICsgMSk7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludDMyX3QgQ1BERl9DcmVhdG9yOjpXcml0ZU5ld09ianMoYm9vbCBiSW5jcmVtZW50YWwsIElGWF9QYXVzZSogcFBhdXNlKSB7Ci0gIHNpemVfdCBpQ291bnQgPSBtX05ld09iak51bUFycmF5LnNpemUoKTsKLSAgc2l6ZV90IGluZGV4ID0gKHNpemVfdCkodWludHB0cl90KW1fUG9zOwotICB3aGlsZSAoaW5kZXggPCBpQ291bnQpIHsKLSAgICB1aW50MzJfdCBvYmpudW0gPSBtX05ld09iak51bUFycmF5W2luZGV4XTsKLSAgICBDUERGX09iamVjdCogcE9iaiA9IG1fcERvY3VtZW50LT5HZXRJbmRpcmVjdE9iamVjdChvYmpudW0pOwotICAgIGlmICghcE9iaikgewotICAgICAgKytpbmRleDsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBtX09iamVjdE9mZnNldFtvYmpudW1dID0gbV9PZmZzZXQ7Ci0gICAgaWYgKFdyaXRlSW5kaXJlY3RPYmoocE9iaikpCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgICBpbmRleCsrOwotICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICBtX1BvcyA9IChGWF9QT1NJVElPTikodWludHB0cl90KWluZGV4OwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICB9Ci0gIHJldHVybiAwOwotfQotCi12b2lkIENQREZfQ3JlYXRvcjo6SW5pdE9sZE9iak51bU9mZnNldHMoKSB7Ci0gIGlmICghbV9wUGFyc2VyKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHVpbnQzMl90IGogPSAwOwotICB1aW50MzJfdCBkd1N0YXJ0ID0gMDsKLSAgdWludDMyX3QgZHdFbmQgPSBtX3BQYXJzZXItPkdldExhc3RPYmpOdW0oKTsKLSAgd2hpbGUgKGR3U3RhcnQgPD0gZHdFbmQpIHsKLSAgICB3aGlsZSAoZHdTdGFydCA8PSBkd0VuZCAmJiBtX3BQYXJzZXItPklzT2JqZWN0RnJlZU9yTnVsbChkd1N0YXJ0KSkKLSAgICAgIGR3U3RhcnQrKzsKLQotICAgIGlmIChkd1N0YXJ0ID4gZHdFbmQpCi0gICAgICBicmVhazsKLQotICAgIGogPSBkd1N0YXJ0OwotICAgIHdoaWxlIChqIDw9IGR3RW5kICYmICFtX3BQYXJzZXItPklzT2JqZWN0RnJlZU9yTnVsbChqKSkKLSAgICAgIGorKzsKLQotICAgIG1fT2JqZWN0T2Zmc2V0LkFkZChkd1N0YXJ0LCBqIC0gZHdTdGFydCk7Ci0gICAgZHdTdGFydCA9IGo7Ci0gIH0KLX0KLQotdm9pZCBDUERGX0NyZWF0b3I6OkluaXROZXdPYmpOdW1PZmZzZXRzKCkgewotICBib29sIGJJbmNyZW1lbnRhbCA9IChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSAhPSAwOwotICBib29sIGJOb09yaWdpbmFsID0gKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfTk9fT1JJR0lOQUwpICE9IDA7Ci0gIGZvciAoY29uc3QgYXV0byYgcGFpciA6ICptX3BEb2N1bWVudCkgewotICAgIGNvbnN0IHVpbnQzMl90IG9iam51bSA9IHBhaXIuZmlyc3Q7Ci0gICAgY29uc3QgQ1BERl9PYmplY3QqIHBPYmogPSBwYWlyLnNlY29uZC5nZXQoKTsKLSAgICBpZiAoYkluY3JlbWVudGFsIHx8IHBPYmotPkdldE9iak51bSgpID09IENQREZfT2JqZWN0OjprSW52YWxpZE9iak51bSkKLSAgICAgIGNvbnRpbnVlOwotICAgIGlmIChtX3BQYXJzZXIgJiYgbV9wUGFyc2VyLT5Jc1ZhbGlkT2JqZWN0TnVtYmVyKG9iam51bSkgJiYKLSAgICAgICAgbV9wUGFyc2VyLT5HZXRPYmplY3RUeXBlKG9iam51bSkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBBcHBlbmROZXdPYmpOdW0ob2JqbnVtKTsKLSAgfQotCi0gIHNpemVfdCBpQ291bnQgPSBtX05ld09iak51bUFycmF5LnNpemUoKTsKLSAgaWYgKGlDb3VudCA9PSAwKQotICAgIHJldHVybjsKLQotICBzaXplX3QgaSA9IDA7Ci0gIHVpbnQzMl90IGR3U3RhcnRPYmpOdW0gPSAwOwotICBib29sIGJDcm9zc1JlZlZhbGlkID0gbV9wUGFyc2VyICYmIG1fcFBhcnNlci0+R2V0TGFzdFhSZWZPZmZzZXQoKSA+IDA7Ci0gIHdoaWxlIChpIDwgaUNvdW50KSB7Ci0gICAgZHdTdGFydE9iak51bSA9IG1fTmV3T2JqTnVtQXJyYXlbaV07Ci0gICAgaWYgKChiSW5jcmVtZW50YWwgJiYgKGJOb09yaWdpbmFsIHx8IGJDcm9zc1JlZlZhbGlkKSkgfHwKLSAgICAgICAgIW1fT2JqZWN0T2Zmc2V0LkdldFB0ckF0KGR3U3RhcnRPYmpOdW0pKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaSsrOwotICB9Ci0gIGlmIChpID49IGlDb3VudCkKLSAgICByZXR1cm47Ci0KLSAgdWludDMyX3QgZHdMYXN0T2JqTnVtID0gZHdTdGFydE9iak51bTsKLSAgaSsrOwotICBib29sIGJOZXdTdGFydCA9IGZhbHNlOwotICBmb3IgKDsgaSA8IGlDb3VudDsgaSsrKSB7Ci0gICAgdWludDMyX3QgZHdDdXJPYmpOdW0gPSBtX05ld09iak51bUFycmF5W2ldOwotICAgIGJvb2wgYkV4aXN0ID0gbV9wUGFyc2VyICYmIG1fcFBhcnNlci0+SXNWYWxpZE9iamVjdE51bWJlcihkd0N1ck9iak51bSkgJiYKLSAgICAgICAgICAgICAgICAgIG1fT2JqZWN0T2Zmc2V0LkdldFB0ckF0KGR3Q3VyT2JqTnVtKTsKLSAgICBpZiAoYkV4aXN0IHx8IGR3Q3VyT2JqTnVtIC0gZHdMYXN0T2JqTnVtID4gMSkgewotICAgICAgaWYgKCFiTmV3U3RhcnQpCi0gICAgICAgIG1fT2JqZWN0T2Zmc2V0LkFkZChkd1N0YXJ0T2JqTnVtLCBkd0xhc3RPYmpOdW0gLSBkd1N0YXJ0T2JqTnVtICsgMSk7Ci0gICAgICBkd1N0YXJ0T2JqTnVtID0gZHdDdXJPYmpOdW07Ci0gICAgfQotICAgIGlmIChiTmV3U3RhcnQpCi0gICAgICBkd1N0YXJ0T2JqTnVtID0gZHdDdXJPYmpOdW07Ci0KLSAgICBiTmV3U3RhcnQgPSBiRXhpc3Q7Ci0gICAgZHdMYXN0T2JqTnVtID0gZHdDdXJPYmpOdW07Ci0gIH0KLSAgbV9PYmplY3RPZmZzZXQuQWRkKGR3U3RhcnRPYmpOdW0sIGR3TGFzdE9iak51bSAtIGR3U3RhcnRPYmpOdW0gKyAxKTsKLX0KLQotdm9pZCBDUERGX0NyZWF0b3I6OkFwcGVuZE5ld09iak51bSh1aW50MzJfdCBvYmpudW0pIHsKLSAgbV9OZXdPYmpOdW1BcnJheS5pbnNlcnQoc3RkOjpsb3dlcl9ib3VuZChtX05ld09iak51bUFycmF5LmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9OZXdPYmpOdW1BcnJheS5lbmQoKSwgb2JqbnVtKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqbnVtKTsKLX0KLQotaW50MzJfdCBDUERGX0NyZWF0b3I6OldyaXRlRG9jX1N0YWdlMShJRlhfUGF1c2UqIHBQYXVzZSkgewotICBBU1NFUlQobV9pU3RhZ2UgPiAtMSB8fCBtX2lTdGFnZSA8IDIwKTsKLSAgaWYgKG1faVN0YWdlID09IDApIHsKLSAgICBpZiAoIW1fcFBhcnNlcikgewotICAgICAgbV9kd0ZsYWdzICY9IH5GUERGQ1JFQVRFX0lOQ1JFTUVOVEFMOwotICAgIH0KLSAgICBpZiAobV9iU2VjdXJpdHlDaGFuZ2VkICYmIChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX05PX09SSUdJTkFMKSA9PSAwKSB7Ci0gICAgICBtX2R3RmxhZ3MgJj0gfkZQREZDUkVBVEVfSU5DUkVNRU5UQUw7Ci0gICAgfQotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOwotICAgIG1fcE1ldGFkYXRhID0gcERpY3QgPyBwRGljdC0+R2V0RGlyZWN0T2JqZWN0Rm9yKCJNZXRhZGF0YSIpIDogbnVsbHB0cjsKLSAgICBpZiAobV9kd0ZsYWdzICYgRlBERkNSRUFURV9PQkpFQ1RTVFJFQU0pIHsKLSAgICAgIG1fcFhSZWZTdHJlYW0gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9YUmVmU3RyZWFtPigpOwotICAgICAgbV9wWFJlZlN0cmVhbS0+U3RhcnQoKTsKLSAgICAgIGlmICgobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgIT0gMCAmJiBtX3BQYXJzZXIpIHsKLSAgICAgICAgRlhfRklMRVNJWkUgcHJldiA9IG1fcFBhcnNlci0+R2V0TGFzdFhSZWZPZmZzZXQoKTsKLSAgICAgICAgbV9wWFJlZlN0cmVhbS0+bV9QcmV2T2Zmc2V0ID0gcHJldjsKLSAgICAgIH0KLSAgICB9Ci0gICAgbV9pU3RhZ2UgPSAxMDsKLSAgfQotICBpZiAobV9pU3RhZ2UgPT0gMTApIHsKLSAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpID09IDApIHsKLSAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCIlUERGLTEuIikgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIG1fT2Zmc2V0ICs9IDc7Ci0gICAgICBpbnQzMl90IHZlcnNpb24gPSA3OwotICAgICAgaWYgKG1fRmlsZVZlcnNpb24pIHsKLSAgICAgICAgdmVyc2lvbiA9IG1fRmlsZVZlcnNpb247Ci0gICAgICB9IGVsc2UgaWYgKG1fcFBhcnNlcikgewotICAgICAgICB2ZXJzaW9uID0gbV9wUGFyc2VyLT5HZXRGaWxlVmVyc2lvbigpOwotICAgICAgfQotICAgICAgaW50MzJfdCBsZW4gPSBtX0ZpbGUuQXBwZW5kRFdvcmQodmVyc2lvbiAlIDEwKTsKLSAgICAgIGlmIChsZW4gPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIG1fT2Zmc2V0ICs9IGxlbjsKLSAgICAgIGlmICgobGVuID0gbV9GaWxlLkFwcGVuZFN0cmluZygiXHJcbiVceEExXHhCM1x4QzVceEQ3XHJcbiIpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgbV9PZmZzZXQgKz0gbGVuOwotICAgICAgSW5pdE9sZE9iak51bU9mZnNldHMoKTsKLSAgICAgIG1faVN0YWdlID0gMjA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gcFNyY0ZpbGUgPQotICAgICAgICAgIG1fcFBhcnNlci0+R2V0RmlsZUFjY2VzcygpOwotICAgICAgbV9PZmZzZXQgPSBwU3JjRmlsZS0+R2V0U2l6ZSgpOwotICAgICAgbV9Qb3MgPSAodm9pZCopKHVpbnRwdHJfdCltX09mZnNldDsKLSAgICAgIG1faVN0YWdlID0gMTU7Ci0gICAgfQotICB9Ci0gIGlmIChtX2lTdGFnZSA9PSAxNSkgewotICAgIGlmICgobV9kd0ZsYWdzICYgRlBERkNSRUFURV9OT19PUklHSU5BTCkgPT0gMCAmJiBtX1BvcykgewotICAgICAgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBwU3JjRmlsZSA9Ci0gICAgICAgICAgbV9wUGFyc2VyLT5HZXRGaWxlQWNjZXNzKCk7Ci0gICAgICB1aW50OF90IGJ1ZmZlcls0MDk2XTsgIC8vIFRPRE8odHNlcGV6KTogZG9uJ3Qgc3RhY2sgYWxsb2NhdGUuCi0gICAgICB1aW50MzJfdCBzcmNfc2l6ZSA9ICh1aW50MzJfdCkodWludHB0cl90KW1fUG9zOwotICAgICAgd2hpbGUgKHNyY19zaXplKSB7Ci0gICAgICAgIHVpbnQzMl90IGJsb2NrX3NpemUgPSBzcmNfc2l6ZSA+IDQwOTYgPyA0MDk2IDogc3JjX3NpemU7Ci0gICAgICAgIGlmICghcFNyY0ZpbGUtPlJlYWRCbG9jayhidWZmZXIsIG1fT2Zmc2V0IC0gc3JjX3NpemUsIGJsb2NrX3NpemUpKSB7Ci0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kQmxvY2soYnVmZmVyLCBibG9ja19zaXplKSA8IDApIHsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgc3JjX3NpemUgLT0gYmxvY2tfc2l6ZTsKLSAgICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgICBtX1BvcyA9ICh2b2lkKikodWludHB0cl90KXNyY19zaXplOwotICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICgobV9kd0ZsYWdzICYgRlBERkNSRUFURV9OT19PUklHSU5BTCkgPT0gMCAmJgotICAgICAgICBtX3BQYXJzZXItPkdldExhc3RYUmVmT2Zmc2V0KCkgPT0gMCkgewotICAgICAgSW5pdE9sZE9iak51bU9mZnNldHMoKTsKLSAgICAgIHVpbnQzMl90IGR3RW5kID0gbV9wUGFyc2VyLT5HZXRMYXN0T2JqTnVtKCk7Ci0gICAgICBib29sIGJPYmpTdG0gPSAobV9kd0ZsYWdzICYgRlBERkNSRUFURV9PQkpFQ1RTVFJFQU0pICE9IDA7Ci0gICAgICBmb3IgKHVpbnQzMl90IG9iam51bSA9IDA7IG9iam51bSA8PSBkd0VuZDsgb2JqbnVtKyspIHsKLSAgICAgICAgaWYgKG1fcFBhcnNlci0+SXNPYmplY3RGcmVlT3JOdWxsKG9iam51bSkpCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgbV9PYmplY3RPZmZzZXRbb2JqbnVtXSA9IG1fcFBhcnNlci0+R2V0T2JqZWN0UG9zaXRpb25Pclplcm8ob2JqbnVtKTsKLSAgICAgICAgaWYgKGJPYmpTdG0pIHsKLSAgICAgICAgICBtX3BYUmVmU3RyZWFtLT5BZGRPYmplY3ROdW1iZXJUb0luZGV4QXJyYXkob2JqbnVtKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGJPYmpTdG0pIHsKLSAgICAgICAgbV9wWFJlZlN0cmVhbS0+RW5kWFJlZlN0cmVhbSh0aGlzKTsKLSAgICAgICAgbV9wWFJlZlN0cmVhbS0+U3RhcnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgbV9pU3RhZ2UgPSAyMDsKLSAgfQotICBJbml0TmV3T2JqTnVtT2Zmc2V0cygpOwotICByZXR1cm4gbV9pU3RhZ2U7Ci19Ci1pbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVEb2NfU3RhZ2UyKElGWF9QYXVzZSogcFBhdXNlKSB7Ci0gIEFTU0VSVChtX2lTdGFnZSA+PSAyMCB8fCBtX2lTdGFnZSA8IDMwKTsKLSAgaWYgKG1faVN0YWdlID09IDIwKSB7Ci0gICAgaWYgKChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSA9PSAwICYmIG1fcFBhcnNlcikgewotICAgICAgbV9Qb3MgPSAodm9pZCopKHVpbnRwdHJfdCkwOwotICAgICAgbV9pU3RhZ2UgPSAyMTsKLSAgICB9IGVsc2UgewotICAgICAgbV9pU3RhZ2UgPSAyNTsKLSAgICB9Ci0gIH0KLSAgaWYgKG1faVN0YWdlID09IDIxKSB7Ci0gICAgaW50MzJfdCBpUmV0ID0gV3JpdGVPbGRPYmpzKHBQYXVzZSk7Ci0gICAgaWYgKGlSZXQpIHsKLSAgICAgIHJldHVybiBpUmV0OwotICAgIH0KLSAgICBtX2lTdGFnZSA9IDI1OwotICB9Ci0gIGlmIChtX2lTdGFnZSA9PSAyNSkgewotICAgIG1fUG9zID0gKHZvaWQqKSh1aW50cHRyX3QpMDsKLSAgICBtX2lTdGFnZSA9IDI2OwotICB9Ci0gIGlmIChtX2lTdGFnZSA9PSAyNikgewotICAgIGludDMyX3QgaVJldCA9Ci0gICAgICAgIFdyaXRlTmV3T2JqcygobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgIT0gMCwgcFBhdXNlKTsKLSAgICBpZiAoaVJldCkgewotICAgICAgcmV0dXJuIGlSZXQ7Ci0gICAgfQotICAgIG1faVN0YWdlID0gMjc7Ci0gIH0KLSAgaWYgKG1faVN0YWdlID09IDI3KSB7Ci0gICAgaWYgKG1fcEVuY3J5cHREaWN0ICYmIG1fcEVuY3J5cHREaWN0LT5Jc0lubGluZSgpKSB7Ci0gICAgICBtX2R3TGFzdE9iak51bSArPSAxOwotICAgICAgRlhfRklMRVNJWkUgc2F2ZU9mZnNldCA9IG1fT2Zmc2V0OwotICAgICAgaWYgKFdyaXRlSW5kaXJlY3RPYmoobV9kd0xhc3RPYmpOdW0sIG1fcEVuY3J5cHREaWN0KSA8IDApCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgICAgbV9PYmplY3RPZmZzZXQuQWRkKG1fZHdMYXN0T2JqTnVtLCAxKTsKLSAgICAgIG1fT2JqZWN0T2Zmc2V0W21fZHdMYXN0T2JqTnVtXSA9IHNhdmVPZmZzZXQ7Ci0gICAgICBtX2R3RW5jcnlwdE9iak51bSA9IG1fZHdMYXN0T2JqTnVtOwotICAgICAgaWYgKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpCi0gICAgICAgIG1fTmV3T2JqTnVtQXJyYXkucHVzaF9iYWNrKG1fZHdMYXN0T2JqTnVtKTsKLSAgICB9Ci0gICAgbV9pU3RhZ2UgPSA4MDsKLSAgfQotICByZXR1cm4gbV9pU3RhZ2U7Ci19Ci1pbnQzMl90IENQREZfQ3JlYXRvcjo6V3JpdGVEb2NfU3RhZ2UzKElGWF9QYXVzZSogcFBhdXNlKSB7Ci0gIEFTU0VSVChtX2lTdGFnZSA+PSA4MCB8fCBtX2lTdGFnZSA8IDkwKTsKLSAgdWludDMyX3QgZHdMYXN0T2JqTnVtID0gbV9kd0xhc3RPYmpOdW07Ci0gIGlmIChtX2lTdGFnZSA9PSA4MCkgewotICAgIG1fWHJlZlN0YXJ0ID0gbV9PZmZzZXQ7Ci0gICAgaWYgKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfT0JKRUNUU1RSRUFNKSB7Ci0gICAgICBtX3BYUmVmU3RyZWFtLT5FbmQodGhpcywgdHJ1ZSk7Ci0gICAgICBtX1hyZWZTdGFydCA9IG1fcFhSZWZTdHJlYW0tPm1fUHJldk9mZnNldDsKLSAgICAgIG1faVN0YWdlID0gOTA7Ci0gICAgfSBlbHNlIGlmICgobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgPT0gMCB8fAotICAgICAgICAgICAgICAgIW1fcFBhcnNlci0+SXNYUmVmU3RyZWFtKCkpIHsKLSAgICAgIGlmICgobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgPT0gMCB8fAotICAgICAgICAgIG1fcFBhcnNlci0+R2V0TGFzdFhSZWZPZmZzZXQoKSA9PSAwKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKLSAgICAgICAgc3RyID0gbV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoMSkKLSAgICAgICAgICAgICAgICAgID8gInhyZWZcclxuIgotICAgICAgICAgICAgICAgICAgOiAieHJlZlxyXG4wIDFcclxuMDAwMDAwMDAwMCA2NTUzNSBmXHJcbiI7Ci0gICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKHN0ci5Bc1N0cmluZ0MoKSkgPCAwKSB7Ci0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIG1fUG9zID0gKHZvaWQqKSh1aW50cHRyX3QpMTsKLSAgICAgICAgbV9pU3RhZ2UgPSA4MTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCJ4cmVmXHJcbiIpIDwgMCkgewotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBtX1BvcyA9ICh2b2lkKikodWludHB0cl90KTA7Ci0gICAgICAgIG1faVN0YWdlID0gODI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1faVN0YWdlID0gOTA7Ci0gICAgfQotICB9Ci0gIGlmIChtX2lTdGFnZSA9PSA4MSkgewotICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKLSAgICB1aW50MzJfdCBpID0gKHVpbnQzMl90KSh1aW50cHRyX3QpbV9Qb3MsIGo7Ci0gICAgd2hpbGUgKGkgPD0gZHdMYXN0T2JqTnVtKSB7Ci0gICAgICB3aGlsZSAoaSA8PSBkd0xhc3RPYmpOdW0gJiYgIW1fT2JqZWN0T2Zmc2V0LkdldFB0ckF0KGkpKSB7Ci0gICAgICAgIGkrKzsKLSAgICAgIH0KLSAgICAgIGlmIChpID4gZHdMYXN0T2JqTnVtKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaiA9IGk7Ci0gICAgICB3aGlsZSAoaiA8PSBkd0xhc3RPYmpOdW0gJiYgbV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoaikpIHsKLSAgICAgICAgaisrOwotICAgICAgfQotICAgICAgaWYgKGkgPT0gMSkgewotICAgICAgICBzdHIuRm9ybWF0KCIwICVkXHJcbjAwMDAwMDAwMDAgNjU1MzUgZlxyXG4iLCBqKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0ci5Gb3JtYXQoIiVkICVkXHJcbiIsIGksIGogLSBpKTsKLSAgICAgIH0KLSAgICAgIGlmIChtX0ZpbGUuQXBwZW5kQmxvY2soc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIHdoaWxlIChpIDwgaikgewotICAgICAgICBzdHIuRm9ybWF0KCIlMDEwZCAwMDAwMCBuXHJcbiIsIG1fT2JqZWN0T2Zmc2V0W2krK10pOwotICAgICAgICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKHN0ci5jX3N0cigpLCBzdHIuR2V0TGVuZ3RoKCkpIDwgMCkgewotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGkgPiBkd0xhc3RPYmpOdW0pIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICBtX1BvcyA9ICh2b2lkKikodWludHB0cl90KWk7Ci0gICAgICAgIHJldHVybiAxOwotICAgICAgfQotICAgIH0KLSAgICBtX2lTdGFnZSA9IDkwOwotICB9Ci0gIGlmIChtX2lTdGFnZSA9PSA4MikgewotICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKLSAgICBzaXplX3QgaUNvdW50ID0gbV9OZXdPYmpOdW1BcnJheS5zaXplKCk7Ci0gICAgc2l6ZV90IGkgPSAoc2l6ZV90KSh1aW50cHRyX3QpbV9Qb3M7Ci0gICAgd2hpbGUgKGkgPCBpQ291bnQpIHsKLSAgICAgIHNpemVfdCBqID0gaTsKLSAgICAgIHVpbnQzMl90IG9iam51bSA9IG1fTmV3T2JqTnVtQXJyYXlbaV07Ci0gICAgICB3aGlsZSAoaiA8IGlDb3VudCkgewotICAgICAgICBpZiAoKytqID09IGlDb3VudCkKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgdWludDMyX3QgZHdDdXJyZW50ID0gbV9OZXdPYmpOdW1BcnJheVtqXTsKLSAgICAgICAgaWYgKGR3Q3VycmVudCAtIG9iam51bSA+IDEpCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIG9iam51bSA9IGR3Q3VycmVudDsKLSAgICAgIH0KLSAgICAgIG9iam51bSA9IG1fTmV3T2JqTnVtQXJyYXlbaV07Ci0gICAgICBpZiAob2JqbnVtID09IDEpIHsKLSAgICAgICAgc3RyLkZvcm1hdCgiMCAlZFxyXG4wMDAwMDAwMDAwIDY1NTM1IGZcclxuIiwgaiAtIGkgKyAxKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0ci5Gb3JtYXQoIiVkICVkXHJcbiIsIG9iam51bSwgaiAtIGkpOwotICAgICAgfQotICAgICAgaWYgKG1fRmlsZS5BcHBlbmRCbG9jayhzdHIuY19zdHIoKSwgc3RyLkdldExlbmd0aCgpKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgd2hpbGUgKGkgPCBqKSB7Ci0gICAgICAgIG9iam51bSA9IG1fTmV3T2JqTnVtQXJyYXlbaSsrXTsKLSAgICAgICAgc3RyLkZvcm1hdCgiJTAxMGQgMDAwMDAgblxyXG4iLCBtX09iamVjdE9mZnNldFtvYmpudW1dKTsKLSAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRCbG9jayhzdHIuY19zdHIoKSwgc3RyLkdldExlbmd0aCgpKSA8IDApCi0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgaWYgKHBQYXVzZSAmJiAoaSAlIDEwMCkgPT0gMCAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgICAgbV9Qb3MgPSAodm9pZCopKHVpbnRwdHJfdClpOwotICAgICAgICByZXR1cm4gMTsKLSAgICAgIH0KLSAgICB9Ci0gICAgbV9pU3RhZ2UgPSA5MDsKLSAgfQotICByZXR1cm4gbV9pU3RhZ2U7Ci19Ci0KLWludDMyX3QgQ1BERl9DcmVhdG9yOjpXcml0ZURvY19TdGFnZTQoSUZYX1BhdXNlKiBwUGF1c2UpIHsKLSAgQVNTRVJUKG1faVN0YWdlID49IDkwKTsKLSAgaWYgKChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX09CSkVDVFNUUkVBTSkgPT0gMCkgewotICAgIGJvb2wgYlhSZWZTdHJlYW0gPQotICAgICAgICAobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgIT0gMCAmJiBtX3BQYXJzZXItPklzWFJlZlN0cmVhbSgpOwotICAgIGlmICghYlhSZWZTdHJlYW0pIHsKLSAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCJ0cmFpbGVyXHJcbjw8IikgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKG1fRmlsZS5BcHBlbmREV29yZChtX3BEb2N1bWVudC0+R2V0TGFzdE9iak51bSgpICsgMSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCIgMCBvYmogPDwiKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgIH0KLSAgICBpZiAobV9wUGFyc2VyKSB7Ci0gICAgICBDUERGX0RpY3Rpb25hcnkqIHAgPSBtX3BQYXJzZXItPkdldFRyYWlsZXIoKTsKLSAgICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiAqcCkgewotICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5ID0gaXQuZmlyc3Q7Ci0gICAgICAgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBpdC5zZWNvbmQuZ2V0KCk7Ci0gICAgICAgIC8vIFRPRE8ob2NoYW5nKTogQ29uc29saWRhdGUgd2l0aCBzaW1pbGFyIGNoZWNrIGluCi0gICAgICAgIC8vIFBERl9DcmVhdG9yV3JpdGVUcmFpbGVyLgotICAgICAgICBpZiAoa2V5ID09ICJFbmNyeXB0IiB8fCBrZXkgPT0gIlNpemUiIHx8IGtleSA9PSAiRmlsdGVyIiB8fAotICAgICAgICAgICAga2V5ID09ICJJbmRleCIgfHwga2V5ID09ICJMZW5ndGgiIHx8IGtleSA9PSAiUHJldiIgfHwga2V5ID09ICJXIiB8fAotICAgICAgICAgICAga2V5ID09ICJYUmVmU3RtIiB8fCBrZXkgPT0gIklEIikgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCgiLyIpKSA8IDApIHsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoUERGX05hbWVFbmNvZGUoa2V5KS5Bc1N0cmluZ0MoKSkgPCAwKSB7Ci0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcFZhbHVlLT5Jc0lubGluZSgpKSB7Ci0gICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIiAiKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmREV29yZChwVmFsdWUtPkdldE9iak51bSgpKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIiAwIFIgIikgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IDA7Ci0gICAgICAgICAgaWYgKFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KHBWYWx1ZSwgJm1fRmlsZSwgb2Zmc2V0KSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIlxyXG4vUm9vdCAiKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgaWYgKG1fRmlsZS5BcHBlbmREV29yZChtX3BEb2N1bWVudC0+R2V0Um9vdCgpLT5HZXRPYmpOdW0oKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCIgMCBSXHJcbiIpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBpZiAobV9wRG9jdW1lbnQtPkdldEluZm8oKSkgewotICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiL0luZm8gIikgPCAwKSB7Ci0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kRFdvcmQobV9wRG9jdW1lbnQtPkdldEluZm8oKS0+R2V0T2JqTnVtKCkpIDwgMCkgewotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiIDAgUlxyXG4iKSA8IDApIHsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fcEVuY3J5cHREaWN0KSB7Ci0gICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiL0VuY3J5cHQiKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgdWludDMyX3QgZHdPYmpOdW0gPSBtX3BFbmNyeXB0RGljdC0+R2V0T2JqTnVtKCk7Ci0gICAgICBpZiAoZHdPYmpOdW0gPT0gMCkgewotICAgICAgICBkd09iak51bSA9IG1fcERvY3VtZW50LT5HZXRMYXN0T2JqTnVtKCkgKyAxOwotICAgICAgfQotICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIiAiKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgaWYgKG1fRmlsZS5BcHBlbmREV29yZChkd09iak51bSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCIgMCBSICIpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCIvU2l6ZSAiKSA8IDApIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWYgKG1fRmlsZS5BcHBlbmREV29yZChtX2R3TGFzdE9iak51bSArIChiWFJlZlN0cmVhbSA/IDIgOiAxKSkgPCAwKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmICgobV9kd0ZsYWdzICYgRlBERkNSRUFURV9JTkNSRU1FTlRBTCkgIT0gMCkgewotICAgICAgRlhfRklMRVNJWkUgcHJldiA9IG1fcFBhcnNlci0+R2V0TGFzdFhSZWZPZmZzZXQoKTsKLSAgICAgIGlmIChwcmV2KSB7Ci0gICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCIvUHJldiAiKSA8IDApIHsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfQ0hBUiBvZmZzZXRfYnVmWzIwXTsKLSAgICAgICAgRlhTWVNfbWVtc2V0KG9mZnNldF9idWYsIDAsIHNpemVvZihvZmZzZXRfYnVmKSk7Ci0gICAgICAgIEZYU1lTX2k2NHRvYShwcmV2LCBvZmZzZXRfYnVmLCAxMCk7Ci0gICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kQmxvY2sob2Zmc2V0X2J1ZiwgRlhTWVNfc3RybGVuKG9mZnNldF9idWYpKSA8IDApIHsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fcElEQXJyYXkpIHsKLSAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCgiL0lEIikpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBGWF9GSUxFU0laRSBvZmZzZXQgPSAwOwotICAgICAgaWYgKFBERl9DcmVhdG9yQXBwZW5kT2JqZWN0KG1fcElEQXJyYXkuZ2V0KCksICZtX0ZpbGUsIG9mZnNldCkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFiWFJlZlN0cmVhbSkgewotICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIj4+IikgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIi9XWzAgNCAxXS9JbmRleFsiKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgaWYgKChtX2R3RmxhZ3MgJiBGUERGQ1JFQVRFX0lOQ1JFTUVOVEFMKSAhPSAwICYmIG1fcFBhcnNlciAmJgotICAgICAgICAgIG1fcFBhcnNlci0+R2V0TGFzdFhSZWZPZmZzZXQoKSA9PSAwKSB7Ci0gICAgICAgIHVpbnQzMl90IGkgPSAwOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbV9kd0xhc3RPYmpOdW07IGkrKykgewotICAgICAgICAgIGlmICghbV9PYmplY3RPZmZzZXQuR2V0UHRyQXQoaSkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZERXb3JkKGkpIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiIDEgIikgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCJdL0xlbmd0aCAiKSA8IDApIHsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmREV29yZChtX2R3TGFzdE9iak51bSAqIDUpIDwgMCkgewotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiPj5zdHJlYW1cclxuIikgPCAwKSB7Ci0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBtX2R3TGFzdE9iak51bTsgaSsrKSB7Ci0gICAgICAgICAgRlhfRklMRVNJWkUqIG9mZnNldCA9IG1fT2JqZWN0T2Zmc2V0LkdldFB0ckF0KGkpOwotICAgICAgICAgIGlmICghb2Zmc2V0KQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgT3V0cHV0SW5kZXgoJm1fRmlsZSwgKm9mZnNldCk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNpemVfdCBjb3VudCA9IG1fTmV3T2JqTnVtQXJyYXkuc2l6ZSgpOwotICAgICAgICBzaXplX3QgaSA9IDA7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmREV29yZChtX05ld09iak51bUFycmF5W2ldKSA8IDApCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmRTdHJpbmcoIiAxICIpIDwgMCkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiXS9MZW5ndGggIikgPCAwKQotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKG1fRmlsZS5BcHBlbmREV29yZChjb3VudCAqIDUpIDwgMCkKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCI+PnN0cmVhbVxyXG4iKSA8IDApCi0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgIHVpbnQzMl90IG9iam51bSA9IG1fTmV3T2JqTnVtQXJyYXlbaV07Ci0gICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gbV9PYmplY3RPZmZzZXRbb2JqbnVtXTsKLSAgICAgICAgICBPdXRwdXRJbmRleCgmbV9GaWxlLCBvZmZzZXQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiXHJcbmVuZHN0cmVhbSIpIDwgMCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgfQotICBpZiAobV9GaWxlLkFwcGVuZFN0cmluZygiXHJcbnN0YXJ0eHJlZlxyXG4iKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgRlhfQ0hBUiBvZmZzZXRfYnVmWzIwXTsKLSAgRlhTWVNfbWVtc2V0KG9mZnNldF9idWYsIDAsIHNpemVvZihvZmZzZXRfYnVmKSk7Ci0gIEZYU1lTX2k2NHRvYShtX1hyZWZTdGFydCwgb2Zmc2V0X2J1ZiwgMTApOwotICBpZiAobV9GaWxlLkFwcGVuZEJsb2NrKG9mZnNldF9idWYsIEZYU1lTX3N0cmxlbihvZmZzZXRfYnVmKSkgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChtX0ZpbGUuQXBwZW5kU3RyaW5nKCJcclxuJSVFT0ZcclxuIikgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIG1fRmlsZS5GbHVzaCgpOwotICByZXR1cm4gbV9pU3RhZ2UgPSAxMDA7Ci19Ci0KLXZvaWQgQ1BERl9DcmVhdG9yOjpDbGVhcigpIHsKLSAgbV9wWFJlZlN0cmVhbS5yZXNldCgpOwotICBtX0ZpbGUuQ2xlYXIoKTsKLSAgbV9OZXdPYmpOdW1BcnJheS5jbGVhcigpOwotICBtX3BJREFycmF5LnJlc2V0KCk7Ci19Ci0KLWJvb2wgQ1BERl9DcmVhdG9yOjpDcmVhdGUoY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfV3JpdGVTdHJlYW0+JiBwRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKLSAgbV9GaWxlLkF0dGFjaEZpbGUocEZpbGUpOwotICByZXR1cm4gQ3JlYXRlKGZsYWdzKTsKLX0KLQotYm9vbCBDUERGX0NyZWF0b3I6OkNyZWF0ZSh1aW50MzJfdCBmbGFncykgewotICBtX2R3RmxhZ3MgPSBmbGFnczsKLSAgbV9pU3RhZ2UgPSAwOwotICBtX09mZnNldCA9IDA7Ci0gIG1fZHdMYXN0T2JqTnVtID0gbV9wRG9jdW1lbnQtPkdldExhc3RPYmpOdW0oKTsKLSAgbV9PYmplY3RPZmZzZXQuQ2xlYXIoKTsKLSAgbV9OZXdPYmpOdW1BcnJheS5jbGVhcigpOwotICBJbml0SUQoKTsKLSAgaWYgKGZsYWdzICYgRlBERkNSRUFURV9QUk9HUkVTU0lWRSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIENvbnRpbnVlKG51bGxwdHIpID4gLTE7Ci19Ci0KLXZvaWQgQ1BERl9DcmVhdG9yOjpJbml0SUQoYm9vbCBiRGVmYXVsdCkgewotICBDUERGX0FycmF5KiBwT2xkSURBcnJheSA9IG1fcFBhcnNlciA/IG1fcFBhcnNlci0+R2V0SURBcnJheSgpIDogbnVsbHB0cjsKLSAgYm9vbCBiTmV3SWQgPSAhbV9wSURBcnJheTsKLSAgaWYgKGJOZXdJZCkgewotICAgIG1fcElEQXJyYXkgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9BcnJheT4oKTsKLSAgICBDUERGX09iamVjdCogcElEMSA9IHBPbGRJREFycmF5ID8gcE9sZElEQXJyYXktPkdldE9iamVjdEF0KDApIDogbnVsbHB0cjsKLSAgICBpZiAocElEMSkgewotICAgICAgbV9wSURBcnJheS0+QWRkKHBJRDEtPkNsb25lKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWZmZXIgPQotICAgICAgICAgIFBERl9HZW5lcmF0ZUZpbGVJRCgodWludDMyX3QpKHVpbnRwdHJfdCkgdGhpcywgbV9kd0xhc3RPYmpOdW0pOwotICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNCdWZmZXIoYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSk7Ci0gICAgICBtX3BJREFycmF5LT5BZGROZXc8Q1BERl9TdHJpbmc+KGJzQnVmZmVyLCB0cnVlKTsKLSAgICB9Ci0gIH0KLSAgaWYgKCFiRGVmYXVsdCkgewotICAgIHJldHVybjsKLSAgfQotICBpZiAocE9sZElEQXJyYXkpIHsKLSAgICBDUERGX09iamVjdCogcElEMiA9IHBPbGRJREFycmF5LT5HZXRPYmplY3RBdCgxKTsKLSAgICBpZiAoKG1fZHdGbGFncyAmIEZQREZDUkVBVEVfSU5DUkVNRU5UQUwpICYmIG1fcEVuY3J5cHREaWN0ICYmIHBJRDIpIHsKLSAgICAgIG1fcElEQXJyYXktPkFkZChwSUQyLT5DbG9uZSgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyID0KLSAgICAgICAgUERGX0dlbmVyYXRlRmlsZUlEKCh1aW50MzJfdCkodWludHB0cl90KSB0aGlzLCBtX2R3TGFzdE9iak51bSk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNCdWZmZXIoYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSk7Ci0gICAgbV9wSURBcnJheS0+QWRkTmV3PENQREZfU3RyaW5nPihic0J1ZmZlciwgdHJ1ZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIG1fcElEQXJyYXktPkFkZChtX3BJREFycmF5LT5HZXRPYmplY3RBdCgwKS0+Q2xvbmUoKSk7Ci0gIGlmIChtX3BFbmNyeXB0RGljdCAmJiAhcE9sZElEQXJyYXkgJiYgbV9wUGFyc2VyICYmIGJOZXdJZCkgewotICAgIGlmIChtX3BFbmNyeXB0RGljdC0+R2V0U3RyaW5nRm9yKCJGaWx0ZXIiKSA9PSAiU3RhbmRhcmQiKSB7Ci0gICAgICBDRlhfQnl0ZVN0cmluZyB1c2VyX3Bhc3MgPSBtX3BQYXJzZXItPkdldFBhc3N3b3JkKCk7Ci0gICAgICB1aW50MzJfdCBmbGFnID0gUERGX0VOQ1JZUFRfQ09OVEVOVDsKLSAgICAgIENQREZfU2VjdXJpdHlIYW5kbGVyIGhhbmRsZXI7Ci0gICAgICBoYW5kbGVyLk9uQ3JlYXRlKG1fcEVuY3J5cHREaWN0LCBtX3BJREFycmF5LmdldCgpLCB1c2VyX3Bhc3MucmF3X3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICB1c2VyX3Bhc3MuR2V0TGVuZ3RoKCksIGZsYWcpOwotICAgICAgaWYgKG1fYkxvY2FsQ3J5cHRvSGFuZGxlcikKLSAgICAgICAgZGVsZXRlIG1fcENyeXB0b0hhbmRsZXI7Ci0gICAgICBtX3BDcnlwdG9IYW5kbGVyID0gbmV3IENQREZfQ3J5cHRvSGFuZGxlcjsKLSAgICAgIG1fcENyeXB0b0hhbmRsZXItPkluaXQobV9wRW5jcnlwdERpY3QsICZoYW5kbGVyKTsKLSAgICAgIG1fYkxvY2FsQ3J5cHRvSGFuZGxlciA9IHRydWU7Ci0gICAgICBtX2JTZWN1cml0eUNoYW5nZWQgPSB0cnVlOwotICAgIH0KLSAgfQotfQotaW50MzJfdCBDUERGX0NyZWF0b3I6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKSB7Ci0gIGlmIChtX2lTdGFnZSA8IDApIHsKLSAgICByZXR1cm4gbV9pU3RhZ2U7Ci0gIH0KLSAgaW50MzJfdCBpUmV0ID0gMDsKLSAgd2hpbGUgKG1faVN0YWdlIDwgMTAwKSB7Ci0gICAgaWYgKG1faVN0YWdlIDwgMjApIHsKLSAgICAgIGlSZXQgPSBXcml0ZURvY19TdGFnZTEocFBhdXNlKTsKLSAgICB9IGVsc2UgaWYgKG1faVN0YWdlIDwgMzApIHsKLSAgICAgIGlSZXQgPSBXcml0ZURvY19TdGFnZTIocFBhdXNlKTsKLSAgICB9IGVsc2UgaWYgKG1faVN0YWdlIDwgOTApIHsKLSAgICAgIGlSZXQgPSBXcml0ZURvY19TdGFnZTMocFBhdXNlKTsKLSAgICB9IGVsc2UgewotICAgICAgaVJldCA9IFdyaXRlRG9jX1N0YWdlNChwUGF1c2UpOwotICAgIH0KLSAgICBpZiAoaVJldCA8IG1faVN0YWdlKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgaWYgKGlSZXQgPCAxIHx8IG1faVN0YWdlID09IDEwMCkgewotICAgIG1faVN0YWdlID0gLTE7Ci0gICAgQ2xlYXIoKTsKLSAgICByZXR1cm4gaVJldCA+IDk5ID8gMCA6IChpUmV0IDwgMSA/IC0xIDogaVJldCk7Ci0gIH0KLSAgcmV0dXJuIG1faVN0YWdlOwotfQotYm9vbCBDUERGX0NyZWF0b3I6OlNldEZpbGVWZXJzaW9uKGludDMyX3QgZmlsZVZlcnNpb24pIHsKLSAgaWYgKGZpbGVWZXJzaW9uIDwgMTAgfHwgZmlsZVZlcnNpb24gPiAxNykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBtX0ZpbGVWZXJzaW9uID0gZmlsZVZlcnNpb247Ci0gIHJldHVybiB0cnVlOwotfQotdm9pZCBDUERGX0NyZWF0b3I6OlJlbW92ZVNlY3VyaXR5KCkgewotICBSZXNldFN0YW5kYXJkU2VjdXJpdHkoKTsKLSAgbV9iU2VjdXJpdHlDaGFuZ2VkID0gdHJ1ZTsKLSAgbV9wRW5jcnlwdERpY3QgPSBudWxscHRyOwotICBtX3BDcnlwdG9IYW5kbGVyID0gbnVsbHB0cjsKLX0KLXZvaWQgQ1BERl9DcmVhdG9yOjpSZXNldFN0YW5kYXJkU2VjdXJpdHkoKSB7Ci0gIGlmICghbV9iTG9jYWxDcnlwdG9IYW5kbGVyKQotICAgIHJldHVybjsKLQotICBkZWxldGUgbV9wQ3J5cHRvSGFuZGxlcjsKLSAgbV9wQ3J5cHRvSGFuZGxlciA9IG51bGxwdHI7Ci0gIG1fYkxvY2FsQ3J5cHRvSGFuZGxlciA9IGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2ZvbnQvY2Z4X2N0dGdzdWJ0YWJsZS5jcHAgYi9jb3JlL2ZwZGZhcGkvZm9udC9jZnhfY3R0Z3N1YnRhYmxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTg2OGNhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL2ZvbnQvY2Z4X2N0dGdzdWJ0YWJsZS5jcHAKQEAgLTAsMCArMSwzNTkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NmeF9jdHRnc3VidGFibGUuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorCitDRlhfQ1RUR1NVQlRhYmxlOjpDRlhfQ1RUR1NVQlRhYmxlKCkgOiBtX2JGZWF1dHVyZU1hcExvYWQoZmFsc2UpIHt9CisKK0NGWF9DVFRHU1VCVGFibGU6On5DRlhfQ1RUR1NVQlRhYmxlKCkge30KKworYm9vbCBDRlhfQ1RUR1NVQlRhYmxlOjpMb2FkR1NVQlRhYmxlKEZUX0J5dGVzIGdzdWIpIHsKKyAgaWYgKChnc3ViWzBdIDw8IDI0dSB8IGdzdWJbMV0gPDwgMTZ1IHwgZ3N1YlsyXSA8PCA4dSB8IGdzdWJbM10pICE9IDB4MDAwMTAwMDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiBQYXJzZSgmZ3N1Yltnc3ViWzRdIDw8IDggfCBnc3ViWzVdXSwgJmdzdWJbZ3N1Yls2XSA8PCA4IHwgZ3N1Yls3XV0sCisgICAgICAgICAgICAgICAmZ3N1Yltnc3ViWzhdIDw8IDggfCBnc3ViWzldXSk7Cit9CisKK2Jvb2wgQ0ZYX0NUVEdTVUJUYWJsZTo6R2V0VmVydGljYWxHbHlwaCh1aW50MzJfdCBnbHlwaG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogdmdseXBobnVtKSB7CisgIHVpbnQzMl90IHRhZ1tdID0geworICAgICAgKHVpbnQ4X3QpJ3YnIDw8IDI0IHwgKHVpbnQ4X3QpJ3InIDw8IDE2IHwgKHVpbnQ4X3QpJ3QnIDw8IDggfAorICAgICAgICAgICh1aW50OF90KScyJywKKyAgICAgICh1aW50OF90KSd2JyA8PCAyNCB8ICh1aW50OF90KSdlJyA8PCAxNiB8ICh1aW50OF90KSdyJyA8PCA4IHwKKyAgICAgICAgICAodWludDhfdCkndCcsCisgIH07CisgIGlmICghbV9iRmVhdXR1cmVNYXBMb2FkKSB7CisgICAgZm9yIChjb25zdCBUU2NyaXB0UmVjb3JkJiBzY3JpcHQgOiBTY3JpcHRMaXN0KSB7CisgICAgICBmb3IgKGNvbnN0IGF1dG8mIHJlY29yZCA6IHNjcmlwdC5MYW5nU3lzUmVjb3JkcykgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGluZGV4IDogcmVjb3JkLkZlYXR1cmVJbmRpY2VzKSB7CisgICAgICAgICAgaWYgKEZlYXR1cmVMaXN0W2luZGV4XS5GZWF0dXJlVGFnID09IHRhZ1swXSB8fAorICAgICAgICAgICAgICBGZWF0dXJlTGlzdFtpbmRleF0uRmVhdHVyZVRhZyA9PSB0YWdbMV0pIHsKKyAgICAgICAgICAgIG1fZmVhdHVyZVNldC5pbnNlcnQoaW5kZXgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAobV9mZWF0dXJlU2V0LmVtcHR5KCkpIHsKKyAgICAgIGludCBpID0gMDsKKyAgICAgIGZvciAoY29uc3QgVEZlYXR1cmVSZWNvcmQmIGZlYXR1cmUgOiBGZWF0dXJlTGlzdCkgeworICAgICAgICBpZiAoZmVhdHVyZS5GZWF0dXJlVGFnID09IHRhZ1swXSB8fCBmZWF0dXJlLkZlYXR1cmVUYWcgPT0gdGFnWzFdKQorICAgICAgICAgIG1fZmVhdHVyZVNldC5pbnNlcnQoaSk7CisgICAgICAgICsraTsKKyAgICAgIH0KKyAgICB9CisgICAgbV9iRmVhdXR1cmVNYXBMb2FkID0gdHJ1ZTsKKyAgfQorICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiBtX2ZlYXR1cmVTZXQpIHsKKyAgICBpZiAoR2V0VmVydGljYWxHbHlwaFN1YihnbHlwaG51bSwgdmdseXBobnVtLCAmRmVhdHVyZUxpc3RbaXRlbV0pKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENGWF9DVFRHU1VCVGFibGU6OkdldFZlcnRpY2FsR2x5cGhTdWIodWludDMyX3QgZ2x5cGhudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHZnbHlwaG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURmVhdHVyZVJlY29yZCogRmVhdHVyZSkgeworICBmb3IgKGludCBpbmRleCA6IEZlYXR1cmUtPkxvb2t1cExpc3RJbmRpY2VzKSB7CisgICAgaWYgKCFwZGZpdW06OkluZGV4SW5Cb3VuZHMoTG9va3VwTGlzdCwgaW5kZXgpKQorICAgICAgY29udGludWU7CisgICAgaWYgKExvb2t1cExpc3RbaW5kZXhdLkxvb2t1cFR5cGUgPT0gMSAmJgorICAgICAgICBHZXRWZXJ0aWNhbEdseXBoU3ViMihnbHlwaG51bSwgdmdseXBobnVtLCAmTG9va3VwTGlzdFtpbmRleF0pKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENGWF9DVFRHU1VCVGFibGU6OkdldFZlcnRpY2FsR2x5cGhTdWIyKHVpbnQzMl90IGdseXBobnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogdmdseXBobnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUTG9va3VwKiBMb29rdXApIHsKKyAgZm9yIChjb25zdCBhdXRvJiBzdWJUYWJsZSA6IExvb2t1cC0+U3ViVGFibGVzKSB7CisgICAgc3dpdGNoIChzdWJUYWJsZS0+U3Vic3RGb3JtYXQpIHsKKyAgICAgIGNhc2UgMTogeworICAgICAgICBhdXRvKiB0YmwxID0gc3RhdGljX2Nhc3Q8VFN1YlRhYmxlMSo+KHN1YlRhYmxlLmdldCgpKTsKKyAgICAgICAgaWYgKEdldENvdmVyYWdlSW5kZXgodGJsMS0+Q292ZXJhZ2UuZ2V0KCksIGdseXBobnVtKSA+PSAwKSB7CisgICAgICAgICAgKnZnbHlwaG51bSA9IGdseXBobnVtICsgdGJsMS0+RGVsdGFHbHlwaElEOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAyOiB7CisgICAgICAgIGF1dG8qIHRibDIgPSBzdGF0aWNfY2FzdDxUU3ViVGFibGUyKj4oc3ViVGFibGUuZ2V0KCkpOworICAgICAgICBpbnQgaW5kZXggPSBHZXRDb3ZlcmFnZUluZGV4KHRibDItPkNvdmVyYWdlLmdldCgpLCBnbHlwaG51bSk7CisgICAgICAgIGlmIChwZGZpdW06OkluZGV4SW5Cb3VuZHModGJsMi0+U3Vic3RpdHV0ZXMsIGluZGV4KSkgeworICAgICAgICAgICp2Z2x5cGhudW0gPSB0YmwyLT5TdWJzdGl0dXRlc1tpbmRleF07CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworaW50IENGWF9DVFRHU1VCVGFibGU6OkdldENvdmVyYWdlSW5kZXgoVENvdmVyYWdlRm9ybWF0QmFzZSogQ292ZXJhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnKSBjb25zdCB7CisgIGlmICghQ292ZXJhZ2UpCisgICAgcmV0dXJuIC0xOworCisgIHN3aXRjaCAoQ292ZXJhZ2UtPkNvdmVyYWdlRm9ybWF0KSB7CisgICAgY2FzZSAxOiB7CisgICAgICBpbnQgaSA9IDA7CisgICAgICBUQ292ZXJhZ2VGb3JtYXQxKiBjMSA9IHN0YXRpY19jYXN0PFRDb3ZlcmFnZUZvcm1hdDEqPihDb3ZlcmFnZSk7CisgICAgICBmb3IgKGNvbnN0IGF1dG8mIGdseXBoIDogYzEtPkdseXBoQXJyYXkpIHsKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PHVpbnQzMl90PihnbHlwaCkgPT0gZykKKyAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgKytpOworICAgICAgfQorICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBjYXNlIDI6IHsKKyAgICAgIFRDb3ZlcmFnZUZvcm1hdDIqIGMyID0gc3RhdGljX2Nhc3Q8VENvdmVyYWdlRm9ybWF0Mio+KENvdmVyYWdlKTsKKyAgICAgIGZvciAoY29uc3QgYXV0byYgcmFuZ2VSZWMgOiBjMi0+UmFuZ2VSZWNvcmRzKSB7CisgICAgICAgIHVpbnQzMl90IHMgPSByYW5nZVJlYy5TdGFydDsKKyAgICAgICAgdWludDMyX3QgZSA9IHJhbmdlUmVjLkVuZDsKKyAgICAgICAgdWludDMyX3Qgc2kgPSByYW5nZVJlYy5TdGFydENvdmVyYWdlSW5kZXg7CisgICAgICAgIGlmIChzIDw9IGcgJiYgZyA8PSBlKQorICAgICAgICAgIHJldHVybiBzaSArIGcgLSBzOworICAgICAgfQorICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorICByZXR1cm4gLTE7Cit9CisKK3VpbnQ4X3QgQ0ZYX0NUVEdTVUJUYWJsZTo6R2V0VUludDgoRlRfQnl0ZXMmIHApIGNvbnN0IHsKKyAgdWludDhfdCByZXQgPSBwWzBdOworICBwICs9IDE7CisgIHJldHVybiByZXQ7Cit9CisKK2ludDE2X3QgQ0ZYX0NUVEdTVUJUYWJsZTo6R2V0SW50MTYoRlRfQnl0ZXMmIHApIGNvbnN0IHsKKyAgdWludDE2X3QgcmV0ID0gcFswXSA8PCA4IHwgcFsxXTsKKyAgcCArPSAyOworICByZXR1cm4gKihpbnQxNl90KikmcmV0OworfQorCit1aW50MTZfdCBDRlhfQ1RUR1NVQlRhYmxlOjpHZXRVSW50MTYoRlRfQnl0ZXMmIHApIGNvbnN0IHsKKyAgdWludDE2X3QgcmV0ID0gcFswXSA8PCA4IHwgcFsxXTsKKyAgcCArPSAyOworICByZXR1cm4gcmV0OworfQorCitpbnQzMl90IENGWF9DVFRHU1VCVGFibGU6OkdldEludDMyKEZUX0J5dGVzJiBwKSBjb25zdCB7CisgIHVpbnQzMl90IHJldCA9IHBbMF0gPDwgMjQgfCBwWzFdIDw8IDE2IHwgcFsyXSA8PCA4IHwgcFszXTsKKyAgcCArPSA0OworICByZXR1cm4gKihpbnQzMl90KikmcmV0OworfQorCit1aW50MzJfdCBDRlhfQ1RUR1NVQlRhYmxlOjpHZXRVSW50MzIoRlRfQnl0ZXMmIHApIGNvbnN0IHsKKyAgdWludDMyX3QgcmV0ID0gcFswXSA8PCAyNCB8IHBbMV0gPDwgMTYgfCBwWzJdIDw8IDggfCBwWzNdOworICBwICs9IDQ7CisgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2UoRlRfQnl0ZXMgc2NyaXB0bGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgZmVhdHVyZWxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzIGxvb2t1cGxpc3QpIHsKKyAgUGFyc2VTY3JpcHRMaXN0KHNjcmlwdGxpc3QpOworICBQYXJzZUZlYXR1cmVMaXN0KGZlYXR1cmVsaXN0KTsKKyAgUGFyc2VMb29rdXBMaXN0KGxvb2t1cGxpc3QpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZVNjcmlwdExpc3QoRlRfQnl0ZXMgcmF3KSB7CisgIEZUX0J5dGVzIHNwID0gcmF3OworICBTY3JpcHRMaXN0ID0gc3RkOjp2ZWN0b3I8VFNjcmlwdFJlY29yZD4oR2V0VUludDE2KHNwKSk7CisgIGZvciAoYXV0byYgc2NyaXB0UmVjIDogU2NyaXB0TGlzdCkgeworICAgIHNjcmlwdFJlYy5TY3JpcHRUYWcgPSBHZXRVSW50MzIoc3ApOworICAgIFBhcnNlU2NyaXB0KCZyYXdbR2V0VUludDE2KHNwKV0sICZzY3JpcHRSZWMpOworICB9Cit9CisKK3ZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VTY3JpcHQoRlRfQnl0ZXMgcmF3LCBUU2NyaXB0UmVjb3JkKiByZWMpIHsKKyAgRlRfQnl0ZXMgc3AgPSByYXc7CisgIHJlYy0+RGVmYXVsdExhbmdTeXMgPSBHZXRVSW50MTYoc3ApOworICByZWMtPkxhbmdTeXNSZWNvcmRzID0gc3RkOjp2ZWN0b3I8VExhbmdTeXNSZWNvcmQ+KEdldFVJbnQxNihzcCkpOworICBmb3IgKGF1dG8mIHN5c1JlY29yZCA6IHJlYy0+TGFuZ1N5c1JlY29yZHMpIHsKKyAgICBzeXNSZWNvcmQuTGFuZ1N5c1RhZyA9IEdldFVJbnQzMihzcCk7CisgICAgUGFyc2VMYW5nU3lzKCZyYXdbR2V0VUludDE2KHNwKV0sICZzeXNSZWNvcmQpOworICB9Cit9CisKK3ZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VMYW5nU3lzKEZUX0J5dGVzIHJhdywgVExhbmdTeXNSZWNvcmQqIHJlYykgeworICBGVF9CeXRlcyBzcCA9IHJhdzsKKyAgcmVjLT5Mb29rdXBPcmRlciA9IEdldFVJbnQxNihzcCk7CisgIHJlYy0+UmVxRmVhdHVyZUluZGV4ID0gR2V0VUludDE2KHNwKTsKKyAgcmVjLT5GZWF0dXJlSW5kaWNlcyA9IHN0ZDo6dmVjdG9yPHVpbnQxNl90PihHZXRVSW50MTYoc3ApKTsKKyAgZm9yIChhdXRvJiBlbGVtZW50IDogcmVjLT5GZWF0dXJlSW5kaWNlcykKKyAgICBlbGVtZW50ID0gR2V0VUludDE2KHNwKTsKK30KKwordm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZUZlYXR1cmVMaXN0KEZUX0J5dGVzIHJhdykgeworICBGVF9CeXRlcyBzcCA9IHJhdzsKKyAgRmVhdHVyZUxpc3QgPSBzdGQ6OnZlY3RvcjxURmVhdHVyZVJlY29yZD4oR2V0VUludDE2KHNwKSk7CisgIGZvciAoYXV0byYgZmVhdHVyZVJlYyA6IEZlYXR1cmVMaXN0KSB7CisgICAgZmVhdHVyZVJlYy5GZWF0dXJlVGFnID0gR2V0VUludDMyKHNwKTsKKyAgICBQYXJzZUZlYXR1cmUoJnJhd1tHZXRVSW50MTYoc3ApXSwgJmZlYXR1cmVSZWMpOworICB9Cit9CisKK3ZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VGZWF0dXJlKEZUX0J5dGVzIHJhdywgVEZlYXR1cmVSZWNvcmQqIHJlYykgeworICBGVF9CeXRlcyBzcCA9IHJhdzsKKyAgcmVjLT5GZWF0dXJlUGFyYW1zID0gR2V0VUludDE2KHNwKTsKKyAgcmVjLT5Mb29rdXBMaXN0SW5kaWNlcyA9IHN0ZDo6dmVjdG9yPHVpbnQxNl90PihHZXRVSW50MTYoc3ApKTsKKyAgZm9yIChhdXRvJiBsaXN0SW5kZXggOiByZWMtPkxvb2t1cExpc3RJbmRpY2VzKQorICAgIGxpc3RJbmRleCA9IEdldFVJbnQxNihzcCk7Cit9CisKK3ZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VMb29rdXBMaXN0KEZUX0J5dGVzIHJhdykgeworICBGVF9CeXRlcyBzcCA9IHJhdzsKKyAgTG9va3VwTGlzdCA9IHN0ZDo6dmVjdG9yPFRMb29rdXA+KEdldFVJbnQxNihzcCkpOworICBmb3IgKGF1dG8mIGxvb2t1cCA6IExvb2t1cExpc3QpCisgICAgUGFyc2VMb29rdXAoJnJhd1tHZXRVSW50MTYoc3ApXSwgJmxvb2t1cCk7Cit9CisKK3ZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VMb29rdXAoRlRfQnl0ZXMgcmF3LCBUTG9va3VwKiByZWMpIHsKKyAgRlRfQnl0ZXMgc3AgPSByYXc7CisgIHJlYy0+TG9va3VwVHlwZSA9IEdldFVJbnQxNihzcCk7CisgIHJlYy0+TG9va3VwRmxhZyA9IEdldFVJbnQxNihzcCk7CisgIHJlYy0+U3ViVGFibGVzID0gc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRTdWJUYWJsZUJhc2U+PihHZXRVSW50MTYoc3ApKTsKKyAgaWYgKHJlYy0+TG9va3VwVHlwZSAhPSAxKQorICAgIHJldHVybjsKKworICBmb3IgKGF1dG8mIHN1YlRhYmxlIDogcmVjLT5TdWJUYWJsZXMpCisgICAgUGFyc2VTaW5nbGVTdWJzdCgmcmF3W0dldFVJbnQxNihzcCldLCAmc3ViVGFibGUpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0NUVEdTVUJUYWJsZTo6VENvdmVyYWdlRm9ybWF0QmFzZT4KK0NGWF9DVFRHU1VCVGFibGU6OlBhcnNlQ292ZXJhZ2UoRlRfQnl0ZXMgcmF3KSB7CisgIEZUX0J5dGVzIHNwID0gcmF3OworICB1aW50MTZfdCBmb3JtYXQgPSBHZXRVSW50MTYoc3ApOworICBpZiAoZm9ybWF0ID09IDEpIHsKKyAgICBhdXRvIHJlYyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxUQ292ZXJhZ2VGb3JtYXQxPigpOworICAgIFBhcnNlQ292ZXJhZ2VGb3JtYXQxKHJhdywgcmVjLmdldCgpKTsKKyAgICByZXR1cm4gc3RkOjptb3ZlKHJlYyk7CisgIH0KKyAgaWYgKGZvcm1hdCA9PSAyKSB7CisgICAgYXV0byByZWMgPSBwZGZpdW06Ok1ha2VVbmlxdWU8VENvdmVyYWdlRm9ybWF0Mj4oKTsKKyAgICBQYXJzZUNvdmVyYWdlRm9ybWF0MihyYXcsIHJlYy5nZXQoKSk7CisgICAgcmV0dXJuIHN0ZDo6bW92ZShyZWMpOworICB9CisgIHJldHVybiBudWxscHRyOworfQorCit2b2lkIENGWF9DVFRHU1VCVGFibGU6OlBhcnNlQ292ZXJhZ2VGb3JtYXQxKEZUX0J5dGVzIHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENvdmVyYWdlRm9ybWF0MSogcmVjKSB7CisgIEZUX0J5dGVzIHNwID0gcmF3OworICAodm9pZClHZXRVSW50MTYoc3ApOworICByZWMtPkdseXBoQXJyYXkgPSBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4oR2V0VUludDE2KHNwKSk7CisgIGZvciAoYXV0byYgZ2x5cGggOiByZWMtPkdseXBoQXJyYXkpCisgICAgZ2x5cGggPSBHZXRVSW50MTYoc3ApOworfQorCit2b2lkIENGWF9DVFRHU1VCVGFibGU6OlBhcnNlQ292ZXJhZ2VGb3JtYXQyKEZUX0J5dGVzIHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENvdmVyYWdlRm9ybWF0MiogcmVjKSB7CisgIEZUX0J5dGVzIHNwID0gcmF3OworICAodm9pZClHZXRVSW50MTYoc3ApOworICByZWMtPlJhbmdlUmVjb3JkcyA9IHN0ZDo6dmVjdG9yPFRSYW5nZVJlY29yZD4oR2V0VUludDE2KHNwKSk7CisgIGZvciAoYXV0byYgcmFuZ2VSZWMgOiByZWMtPlJhbmdlUmVjb3JkcykgeworICAgIHJhbmdlUmVjLlN0YXJ0ID0gR2V0VUludDE2KHNwKTsKKyAgICByYW5nZVJlYy5FbmQgPSBHZXRVSW50MTYoc3ApOworICAgIHJhbmdlUmVjLlN0YXJ0Q292ZXJhZ2VJbmRleCA9IEdldFVJbnQxNihzcCk7CisgIH0KK30KKwordm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZVNpbmdsZVN1YnN0KEZUX0J5dGVzIHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VFN1YlRhYmxlQmFzZT4qIHJlYykgeworICBGVF9CeXRlcyBzcCA9IHJhdzsKKyAgdWludDE2X3QgRm9ybWF0ID0gR2V0VUludDE2KHNwKTsKKyAgc3dpdGNoIChGb3JtYXQpIHsKKyAgICBjYXNlIDE6CisgICAgICAqcmVjID0gcGRmaXVtOjpNYWtlVW5pcXVlPFRTdWJUYWJsZTE+KCk7CisgICAgICBQYXJzZVNpbmdsZVN1YnN0Rm9ybWF0MShyYXcsIHN0YXRpY19jYXN0PFRTdWJUYWJsZTEqPihyZWMtPmdldCgpKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAqcmVjID0gcGRmaXVtOjpNYWtlVW5pcXVlPFRTdWJUYWJsZTI+KCk7CisgICAgICBQYXJzZVNpbmdsZVN1YnN0Rm9ybWF0MihyYXcsIHN0YXRpY19jYXN0PFRTdWJUYWJsZTIqPihyZWMtPmdldCgpKSk7CisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkIENGWF9DVFRHU1VCVGFibGU6OlBhcnNlU2luZ2xlU3Vic3RGb3JtYXQxKEZUX0J5dGVzIHJhdywgVFN1YlRhYmxlMSogcmVjKSB7CisgIEZUX0J5dGVzIHNwID0gcmF3OworICBHZXRVSW50MTYoc3ApOworICB1aW50MTZfdCBvZmZzZXQgPSBHZXRVSW50MTYoc3ApOworICByZWMtPkNvdmVyYWdlID0gUGFyc2VDb3ZlcmFnZSgmcmF3W29mZnNldF0pOworICByZWMtPkRlbHRhR2x5cGhJRCA9IEdldEludDE2KHNwKTsKK30KKwordm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZVNpbmdsZVN1YnN0Rm9ybWF0MihGVF9CeXRlcyByYXcsIFRTdWJUYWJsZTIqIHJlYykgeworICBGVF9CeXRlcyBzcCA9IHJhdzsKKyAgKHZvaWQpR2V0VUludDE2KHNwKTsKKyAgdWludDE2X3Qgb2Zmc2V0ID0gR2V0VUludDE2KHNwKTsKKyAgcmVjLT5Db3ZlcmFnZSA9IFBhcnNlQ292ZXJhZ2UoJnJhd1tvZmZzZXRdKTsKKyAgcmVjLT5TdWJzdGl0dXRlcyA9IHN0ZDo6dmVjdG9yPHVpbnQxNl90PihHZXRVSW50MTYoc3ApKTsKKyAgZm9yIChhdXRvJiBzdWJzdGl0dXRlIDogcmVjLT5TdWJzdGl0dXRlcykKKyAgICBzdWJzdGl0dXRlID0gR2V0VUludDE2KHNwKTsKK30KKworQ0ZYX0NUVEdTVUJUYWJsZTo6VExhbmdTeXNSZWNvcmQ6OlRMYW5nU3lzUmVjb3JkKCkKKyAgICA6IExhbmdTeXNUYWcoMCksIExvb2t1cE9yZGVyKDApLCBSZXFGZWF0dXJlSW5kZXgoMCkge30KKworQ0ZYX0NUVEdTVUJUYWJsZTo6VExhbmdTeXNSZWNvcmQ6On5UTGFuZ1N5c1JlY29yZCgpIHt9CisKK0NGWF9DVFRHU1VCVGFibGU6OlRTY3JpcHRSZWNvcmQ6OlRTY3JpcHRSZWNvcmQoKQorICAgIDogU2NyaXB0VGFnKDApLCBEZWZhdWx0TGFuZ1N5cygwKSB7fQorCitDRlhfQ1RUR1NVQlRhYmxlOjpUU2NyaXB0UmVjb3JkOjp+VFNjcmlwdFJlY29yZCgpIHt9CisKK0NGWF9DVFRHU1VCVGFibGU6OlRGZWF0dXJlUmVjb3JkOjpURmVhdHVyZVJlY29yZCgpCisgICAgOiBGZWF0dXJlVGFnKDApLCBGZWF0dXJlUGFyYW1zKDApIHt9CisKK0NGWF9DVFRHU1VCVGFibGU6OlRGZWF0dXJlUmVjb3JkOjp+VEZlYXR1cmVSZWNvcmQoKSB7fQorCitDRlhfQ1RUR1NVQlRhYmxlOjpUUmFuZ2VSZWNvcmQ6OlRSYW5nZVJlY29yZCgpCisgICAgOiBTdGFydCgwKSwgRW5kKDApLCBTdGFydENvdmVyYWdlSW5kZXgoMCkge30KKworQ0ZYX0NUVEdTVUJUYWJsZTo6VENvdmVyYWdlRm9ybWF0MTo6VENvdmVyYWdlRm9ybWF0MSgpIHsKKyAgQ292ZXJhZ2VGb3JtYXQgPSAxOworfQorCitDRlhfQ1RUR1NVQlRhYmxlOjpUQ292ZXJhZ2VGb3JtYXQxOjp+VENvdmVyYWdlRm9ybWF0MSgpIHt9CisKK0NGWF9DVFRHU1VCVGFibGU6OlRDb3ZlcmFnZUZvcm1hdDI6OlRDb3ZlcmFnZUZvcm1hdDIoKSB7CisgIENvdmVyYWdlRm9ybWF0ID0gMjsKK30KKworQ0ZYX0NUVEdTVUJUYWJsZTo6VENvdmVyYWdlRm9ybWF0Mjo6flRDb3ZlcmFnZUZvcm1hdDIoKSB7fQorCitDRlhfQ1RUR1NVQlRhYmxlOjpUU3ViVGFibGVCYXNlOjpUU3ViVGFibGVCYXNlKCkge30KKworQ0ZYX0NUVEdTVUJUYWJsZTo6VFN1YlRhYmxlQmFzZTo6flRTdWJUYWJsZUJhc2UoKSB7fQorCitDRlhfQ1RUR1NVQlRhYmxlOjpUU3ViVGFibGUxOjpUU3ViVGFibGUxKCkgeworICBTdWJzdEZvcm1hdCA9IDE7Cit9CisKK0NGWF9DVFRHU1VCVGFibGU6OlRTdWJUYWJsZTE6On5UU3ViVGFibGUxKCkge30KKworQ0ZYX0NUVEdTVUJUYWJsZTo6VFN1YlRhYmxlMjo6VFN1YlRhYmxlMigpIHsKKyAgU3Vic3RGb3JtYXQgPSAyOworfQorCitDRlhfQ1RUR1NVQlRhYmxlOjpUU3ViVGFibGUyOjp+VFN1YlRhYmxlMigpIHt9CisKK0NGWF9DVFRHU1VCVGFibGU6OlRMb29rdXA6OlRMb29rdXAoKSA6IExvb2t1cFR5cGUoMCksIExvb2t1cEZsYWcoMCkge30KKworQ0ZYX0NUVEdTVUJUYWJsZTo6VExvb2t1cDo6flRMb29rdXAoKSB7fQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2ZvbnQvY2Z4X2N0dGdzdWJ0YWJsZS5oIGIvY29yZS9mcGRmYXBpL2ZvbnQvY2Z4X2N0dGdzdWJ0YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMWNhZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvZm9udC9jZnhfY3R0Z3N1YnRhYmxlLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZQREZBUElfRk9OVF9DRlhfQ1RUR1NVQlRBQkxFX0hfCisjZGVmaW5lIENPUkVfRlBERkFQSV9GT05UX0NGWF9DVFRHU1VCVEFCTEVfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKKworY2xhc3MgQ0ZYX0NUVEdTVUJUYWJsZSB7CisgcHVibGljOgorICBDRlhfQ1RUR1NVQlRhYmxlKCk7CisgIH5DRlhfQ1RUR1NVQlRhYmxlKCk7CisKKyAgYm9vbCBMb2FkR1NVQlRhYmxlKEZUX0J5dGVzIGdzdWIpOworICBib29sIEdldFZlcnRpY2FsR2x5cGgodWludDMyX3QgZ2x5cGhudW0sIHVpbnQzMl90KiB2Z2x5cGhudW0pOworCisgcHJpdmF0ZToKKyAgc3RydWN0IFRMYW5nU3lzUmVjb3JkIHsKKyAgICBUTGFuZ1N5c1JlY29yZCgpOworICAgIH5UTGFuZ1N5c1JlY29yZCgpOworCisgICAgdWludDMyX3QgTGFuZ1N5c1RhZzsKKyAgICB1aW50MTZfdCBMb29rdXBPcmRlcjsKKyAgICB1aW50MTZfdCBSZXFGZWF0dXJlSW5kZXg7CisgICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IEZlYXR1cmVJbmRpY2VzOworICB9OworCisgIHN0cnVjdCBUU2NyaXB0UmVjb3JkIHsKKyAgICBUU2NyaXB0UmVjb3JkKCk7CisgICAgflRTY3JpcHRSZWNvcmQoKTsKKworICAgIHVpbnQzMl90IFNjcmlwdFRhZzsKKyAgICB1aW50MTZfdCBEZWZhdWx0TGFuZ1N5czsKKyAgICBzdGQ6OnZlY3RvcjxUTGFuZ1N5c1JlY29yZD4gTGFuZ1N5c1JlY29yZHM7CisgIH07CisKKyAgc3RydWN0IFRGZWF0dXJlUmVjb3JkIHsKKyAgICBURmVhdHVyZVJlY29yZCgpOworICAgIH5URmVhdHVyZVJlY29yZCgpOworCisgICAgdWludDMyX3QgRmVhdHVyZVRhZzsKKyAgICB1aW50MTZfdCBGZWF0dXJlUGFyYW1zOworICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBMb29rdXBMaXN0SW5kaWNlczsKKyAgfTsKKworICBzdHJ1Y3QgVFJhbmdlUmVjb3JkIHsKKyAgICBUUmFuZ2VSZWNvcmQoKTsKKworICAgIHVpbnQxNl90IFN0YXJ0OworICAgIHVpbnQxNl90IEVuZDsKKyAgICB1aW50MTZfdCBTdGFydENvdmVyYWdlSW5kZXg7CisgIH07CisKKyAgc3RydWN0IFRDb3ZlcmFnZUZvcm1hdEJhc2UgeworICAgIHZpcnR1YWwgflRDb3ZlcmFnZUZvcm1hdEJhc2UoKSB7fQorICAgIHVpbnQxNl90IENvdmVyYWdlRm9ybWF0OworICB9OworCisgIHN0cnVjdCBUQ292ZXJhZ2VGb3JtYXQxIDogcHVibGljIFRDb3ZlcmFnZUZvcm1hdEJhc2UgeworICAgIFRDb3ZlcmFnZUZvcm1hdDEoKTsKKyAgICB+VENvdmVyYWdlRm9ybWF0MSgpIG92ZXJyaWRlOworCisgICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IEdseXBoQXJyYXk7CisgIH07CisKKyAgc3RydWN0IFRDb3ZlcmFnZUZvcm1hdDIgOiBwdWJsaWMgVENvdmVyYWdlRm9ybWF0QmFzZSB7CisgICAgVENvdmVyYWdlRm9ybWF0MigpOworICAgIH5UQ292ZXJhZ2VGb3JtYXQyKCkgb3ZlcnJpZGU7CisKKyAgICBzdGQ6OnZlY3RvcjxUUmFuZ2VSZWNvcmQ+IFJhbmdlUmVjb3JkczsKKyAgfTsKKworICBzdHJ1Y3QgVERldmljZSB7CisgICAgVERldmljZSgpIDogU3RhcnRTaXplKDApLCBFbmRTaXplKDApLCBEZWx0YUZvcm1hdCgwKSB7fQorCisgICAgdWludDE2X3QgU3RhcnRTaXplOworICAgIHVpbnQxNl90IEVuZFNpemU7CisgICAgdWludDE2X3QgRGVsdGFGb3JtYXQ7CisgIH07CisKKyAgc3RydWN0IFRTdWJUYWJsZUJhc2UgeworICAgIFRTdWJUYWJsZUJhc2UoKTsKKyAgICB2aXJ0dWFsIH5UU3ViVGFibGVCYXNlKCk7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VENvdmVyYWdlRm9ybWF0QmFzZT4gQ292ZXJhZ2U7CisgICAgdWludDE2X3QgU3Vic3RGb3JtYXQ7CisgIH07CisKKyAgc3RydWN0IFRTdWJUYWJsZTEgOiBwdWJsaWMgVFN1YlRhYmxlQmFzZSB7CisgICAgVFN1YlRhYmxlMSgpOworICAgIH5UU3ViVGFibGUxKCkgb3ZlcnJpZGU7CisKKyAgICBpbnQxNl90IERlbHRhR2x5cGhJRDsKKyAgfTsKKworICBzdHJ1Y3QgVFN1YlRhYmxlMiA6IHB1YmxpYyBUU3ViVGFibGVCYXNlIHsKKyAgICBUU3ViVGFibGUyKCk7CisgICAgflRTdWJUYWJsZTIoKSBvdmVycmlkZTsKKworICAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBTdWJzdGl0dXRlczsKKyAgfTsKKworICBzdHJ1Y3QgVExvb2t1cCB7CisgICAgVExvb2t1cCgpOworICAgIH5UTG9va3VwKCk7CisKKyAgICB1aW50MTZfdCBMb29rdXBUeXBlOworICAgIHVpbnQxNl90IExvb2t1cEZsYWc7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRTdWJUYWJsZUJhc2U+PiBTdWJUYWJsZXM7CisgIH07CisKKyAgYm9vbCBQYXJzZShGVF9CeXRlcyBzY3JpcHRsaXN0LCBGVF9CeXRlcyBmZWF0dXJlbGlzdCwgRlRfQnl0ZXMgbG9va3VwbGlzdCk7CisgIHZvaWQgUGFyc2VTY3JpcHRMaXN0KEZUX0J5dGVzIHJhdyk7CisgIHZvaWQgUGFyc2VTY3JpcHQoRlRfQnl0ZXMgcmF3LCBUU2NyaXB0UmVjb3JkKiByZWMpOworICB2b2lkIFBhcnNlTGFuZ1N5cyhGVF9CeXRlcyByYXcsIFRMYW5nU3lzUmVjb3JkKiByZWMpOworICB2b2lkIFBhcnNlRmVhdHVyZUxpc3QoRlRfQnl0ZXMgcmF3KTsKKyAgdm9pZCBQYXJzZUZlYXR1cmUoRlRfQnl0ZXMgcmF3LCBURmVhdHVyZVJlY29yZCogcmVjKTsKKyAgdm9pZCBQYXJzZUxvb2t1cExpc3QoRlRfQnl0ZXMgcmF3KTsKKyAgdm9pZCBQYXJzZUxvb2t1cChGVF9CeXRlcyByYXcsIFRMb29rdXAqIHJlYyk7CisgIHN0ZDo6dW5pcXVlX3B0cjxUQ292ZXJhZ2VGb3JtYXRCYXNlPiBQYXJzZUNvdmVyYWdlKEZUX0J5dGVzIHJhdyk7CisgIHZvaWQgUGFyc2VDb3ZlcmFnZUZvcm1hdDEoRlRfQnl0ZXMgcmF3LCBUQ292ZXJhZ2VGb3JtYXQxKiByZWMpOworICB2b2lkIFBhcnNlQ292ZXJhZ2VGb3JtYXQyKEZUX0J5dGVzIHJhdywgVENvdmVyYWdlRm9ybWF0MiogcmVjKTsKKyAgdm9pZCBQYXJzZVNpbmdsZVN1YnN0KEZUX0J5dGVzIHJhdywgc3RkOjp1bmlxdWVfcHRyPFRTdWJUYWJsZUJhc2U+KiByZWMpOworICB2b2lkIFBhcnNlU2luZ2xlU3Vic3RGb3JtYXQxKEZUX0J5dGVzIHJhdywgVFN1YlRhYmxlMSogcmVjKTsKKyAgdm9pZCBQYXJzZVNpbmdsZVN1YnN0Rm9ybWF0MihGVF9CeXRlcyByYXcsIFRTdWJUYWJsZTIqIHJlYyk7CisKKyAgYm9vbCBHZXRWZXJ0aWNhbEdseXBoU3ViKHVpbnQzMl90IGdseXBobnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHZnbHlwaG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRGZWF0dXJlUmVjb3JkKiBGZWF0dXJlKTsKKyAgYm9vbCBHZXRWZXJ0aWNhbEdseXBoU3ViMih1aW50MzJfdCBnbHlwaG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogdmdseXBobnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMb29rdXAqIExvb2t1cCk7CisgIGludCBHZXRDb3ZlcmFnZUluZGV4KFRDb3ZlcmFnZUZvcm1hdEJhc2UqIENvdmVyYWdlLCB1aW50MzJfdCBnKSBjb25zdDsKKworICB1aW50OF90IEdldFVJbnQ4KEZUX0J5dGVzJiBwKSBjb25zdDsKKyAgaW50MTZfdCBHZXRJbnQxNihGVF9CeXRlcyYgcCkgY29uc3Q7CisgIHVpbnQxNl90IEdldFVJbnQxNihGVF9CeXRlcyYgcCkgY29uc3Q7CisgIGludDMyX3QgR2V0SW50MzIoRlRfQnl0ZXMmIHApIGNvbnN0OworICB1aW50MzJfdCBHZXRVSW50MzIoRlRfQnl0ZXMmIHApIGNvbnN0OworCisgIHN0ZDo6c2V0PHVpbnQzMl90PiBtX2ZlYXR1cmVTZXQ7CisgIGJvb2wgbV9iRmVhdXR1cmVNYXBMb2FkOworICBzdGQ6OnZlY3RvcjxUU2NyaXB0UmVjb3JkPiBTY3JpcHRMaXN0OworICBzdGQ6OnZlY3RvcjxURmVhdHVyZVJlY29yZD4gRmVhdHVyZUxpc3Q7CisgIHN0ZDo6dmVjdG9yPFRMb29rdXA+IExvb2t1cExpc3Q7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9GT05UX0NGWF9DVFRHU1VCVEFCTEVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9mb250L2NmeF9zdG9ja2ZvbnRhcnJheS5jcHAgYi9jb3JlL2ZwZGZhcGkvZm9udC9jZnhfc3RvY2tmb250YXJyYXkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MDg0NzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvZm9udC9jZnhfc3RvY2tmb250YXJyYXkuY3BwCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NmeF9zdG9ja2ZvbnRhcnJheS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgorCitDRlhfU3RvY2tGb250QXJyYXk6OkNGWF9TdG9ja0ZvbnRBcnJheSgpIHt9CisKK0NGWF9TdG9ja0ZvbnRBcnJheTo6fkNGWF9TdG9ja0ZvbnRBcnJheSgpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUobV9TdG9ja0ZvbnRzKTsgKytpKSB7CisgICAgaWYgKG1fU3RvY2tGb250c1tpXSkKKyAgICAgIGRlbGV0ZSBtX1N0b2NrRm9udHNbaV0tPkdldEZvbnREaWN0KCk7CisgIH0KK30KKworQ1BERl9Gb250KiBDRlhfU3RvY2tGb250QXJyYXk6OkdldEZvbnQodWludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgaWYgKGluZGV4ID49IEZYX0FycmF5U2l6ZShtX1N0b2NrRm9udHMpKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gbV9TdG9ja0ZvbnRzW2luZGV4XS5nZXQoKTsKK30KKworQ1BERl9Gb250KiBDRlhfU3RvY2tGb250QXJyYXk6OlNldEZvbnQodWludDMyX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Gb250PiBwRm9udCkgeworICBDUERGX0ZvbnQqIHJlc3VsdCA9IHBGb250LmdldCgpOworICBpZiAoaW5kZXggPCBGWF9BcnJheVNpemUobV9TdG9ja0ZvbnRzKSkKKyAgICBtX1N0b2NrRm9udHNbaW5kZXhdID0gc3RkOjptb3ZlKHBGb250KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9mb250L2NmeF9zdG9ja2ZvbnRhcnJheS5oIGIvY29yZS9mcGRmYXBpL2ZvbnQvY2Z4X3N0b2NrZm9udGFycmF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhMTNjMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnBkZmFwaS9mb250L2NmeF9zdG9ja2ZvbnRhcnJheS5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZQREZBUElfRk9OVF9DRlhfU1RPQ0tGT05UQVJSQVlfSF8KKyNkZWZpbmUgQ09SRV9GUERGQVBJX0ZPTlRfQ0ZYX1NUT0NLRk9OVEFSUkFZX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2ZvbnQuaCIKKworY2xhc3MgQ0ZYX1N0b2NrRm9udEFycmF5IHsKKyBwdWJsaWM6CisgIENGWF9TdG9ja0ZvbnRBcnJheSgpOworICB+Q0ZYX1N0b2NrRm9udEFycmF5KCk7CisKKyAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIHxwRm9udHwsIHJldHVybnMgdW5vd25lZCBwb2ludGVyIHRvIGl0LgorICBDUERGX0ZvbnQqIFNldEZvbnQodWludDMyX3QgaW5kZXgsIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0ZvbnQ+IHBGb250KTsKKyAgQ1BERl9Gb250KiBHZXRGb250KHVpbnQzMl90IGluZGV4KSBjb25zdDsKKworIHByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0ZvbnQ+IG1fU3RvY2tGb250c1sxNF07Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9GT05UX0NGWF9TVE9DS0ZPTlRBUlJBWV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jaWQydW5pY29kZW1hcC5jcHAgYi9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NpZDJ1bmljb2RlbWFwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTA4NTY0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jaWQydW5pY29kZW1hcC5jcHAKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jaWQydW5pY29kZW1hcC5oIgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2NwZGZfbW9kdWxlbWdyLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jbWFwbWFuYWdlci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW1vZHVsZS5oIgorCitDUERGX0NJRDJVbmljb2RlTWFwOjpDUERGX0NJRDJVbmljb2RlTWFwKCkgeworICBtX0VtYmVkZGVkQ291bnQgPSAwOworfQorCitDUERGX0NJRDJVbmljb2RlTWFwOjp+Q1BERl9DSUQyVW5pY29kZU1hcCgpIHt9CisKK2Jvb2wgQ1BERl9DSUQyVW5pY29kZU1hcDo6SXNMb2FkZWQoKSB7CisgIHJldHVybiBtX0VtYmVkZGVkQ291bnQgIT0gMDsKK30KKword2NoYXJfdCBDUERGX0NJRDJVbmljb2RlTWFwOjpVbmljb2RlRnJvbUNJRCh1aW50MTZfdCBDSUQpIHsKKyAgaWYgKG1fQ2hhcnNldCA9PSBDSURTRVRfVU5JQ09ERSkgeworICAgIHJldHVybiBDSUQ7CisgIH0KKyAgaWYgKENJRCA8IG1fRW1iZWRkZWRDb3VudCkgeworICAgIHJldHVybiBtX3BFbWJlZGRlZE1hcFtDSURdOworICB9CisgIHJldHVybiAwOworfQorCit2b2lkIENQREZfQ0lEMlVuaWNvZGVNYXA6OkxvYWQoQ1BERl9DTWFwTWFuYWdlciogcE1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSURTZXQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJQcm9tcHRDSkspIHsKKyAgbV9DaGFyc2V0ID0gY2hhcnNldDsKKworICBDUERGX0ZvbnRHbG9iYWxzKiBwRm9udEdsb2JhbHMgPQorICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCk7CisgIHN0ZDo6dGllKG1fRW1iZWRkZWRDb3VudCwgbV9wRW1iZWRkZWRNYXApID0KKyAgICAgIHBGb250R2xvYmFscy0+R2V0RW1iZWRkZWRUb1VuaWNvZGUoY2hhcnNldCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NpZDJ1bmljb2RlbWFwLmggYi9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NpZDJ1bmljb2RlbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMzZmU1YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfY2lkMnVuaWNvZGVtYXAuaApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GUERGQVBJX0ZPTlRfQ1BERl9DSUQyVU5JQ09ERU1BUF9IXworI2RlZmluZSBDT1JFX0ZQREZBUElfRk9OVF9DUERGX0NJRDJVTklDT0RFTUFQX0hfCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NpZGZvbnQuaCIKKworY2xhc3MgQ1BERl9DTWFwTWFuYWdlcjsKKworY2xhc3MgQ1BERl9DSUQyVW5pY29kZU1hcCB7CisgcHVibGljOgorICBDUERGX0NJRDJVbmljb2RlTWFwKCk7CisgIH5DUERGX0NJRDJVbmljb2RlTWFwKCk7CisKKyAgYm9vbCBJc0xvYWRlZCgpOworICB2b2lkIExvYWQoQ1BERl9DTWFwTWFuYWdlciogcE1nciwgQ0lEU2V0IGNoYXJzZXQsIGJvb2wgYlByb21wdENKSyk7CisgIHdjaGFyX3QgVW5pY29kZUZyb21DSUQodWludDE2X3QgQ0lEKTsKKworIHByaXZhdGU6CisgIENJRFNldCBtX0NoYXJzZXQ7CisgIGNvbnN0IHVpbnQxNl90KiBtX3BFbWJlZGRlZE1hcDsKKyAgdWludDMyX3QgbV9FbWJlZGRlZENvdW50OworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfRk9OVF9DUERGX0NJRDJVTklDT0RFTUFQX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NpZGZvbnQuY3BwIGIvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jaWRmb250LmNwcAppbmRleCA2ZDAxNTM4Li4yMWY4YWRkIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NpZGZvbnQuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfY2lkZm9udC5jcHAKQEAgLTcsMTkgKzcsMjMgQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NpZGZvbnQuaCIKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxsaW1pdHM+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2NtYXBzL2NtYXBfaW50LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2NwZGZfbW9kdWxlbWdyLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY2Z4X2N0dGdzdWJ0YWJsZS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfY2lkMnVuaWNvZGVtYXAuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NtYXAuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NtYXBwYXJzZXIuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2ZvbnRlbmNvZGluZy5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2ZvbnRfaW50LmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvdHRnc3VidGFibGUuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2Vtb2R1bGUuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW1fYWNjLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX21hdGguaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgogCiBuYW1lc3BhY2UgewogCkBAIC0xMTMsMTEgKzExNywxNSBAQAogICAgIHs4ODE4LCAwLCAxMjksIDEyNywgMCwgMTksIDExNH0sIHs4ODE5LCAwLCAxMjksIDEyNywgMCwgMjE4LCAxMDh9LAogfTsKIAorLy8gQm91bmRhcnkgdmFsdWVzIHRvIGF2b2lkIGludGVnZXIgb3ZlcmZsb3cgd2hlbiBtdWx0aXBsaWVkIGJ5IDEwMDAuCitjb25zdCBsb25nIGtNaW5DQm94ID0gLTIxNDc0ODM7Citjb25zdCBsb25nIGtNYXhDQm94ID0gMjE0NzQ4MzsKKwogQ1BERl9Gb250R2xvYmFscyogR2V0Rm9udEdsb2JhbHMoKSB7CiAgIHJldHVybiBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+R2V0Rm9udEdsb2JhbHMoKTsKIH0KIAotI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNpZiBfRlhfUExBVEZPUk1fICE9IF9GWF9QTEFURk9STV9XSU5ET1dTXwogCiBib29sIElzVmFsaWRFbWJlZGRlZENoYXJjb2RlRnJvbVVuaWNvZGVDaGFyc2V0KENJRFNldCBjaGFyc2V0KSB7CiAgIHN3aXRjaCAoY2hhcnNldCkgewpAQCAtMTMyLDQxICsxNDAsNDcgQEAKICAgfQogfQogCi1GWF9XQ0hBUiBFbWJlZGRlZFVuaWNvZGVGcm9tQ2hhcmNvZGUoY29uc3QgRlhDTUFQX0NNYXAqIHBFbWJlZE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSURTZXQgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFyY29kZSkgeword2NoYXJfdCBFbWJlZGRlZFVuaWNvZGVGcm9tQ2hhcmNvZGUoY29uc3QgRlhDTUFQX0NNYXAqIHBFbWJlZE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENJRFNldCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hhcmNvZGUpIHsKICAgaWYgKCFJc1ZhbGlkRW1iZWRkZWRDaGFyY29kZUZyb21Vbmljb2RlQ2hhcnNldChjaGFyc2V0KSkKICAgICByZXR1cm4gMDsKIAogICB1aW50MTZfdCBjaWQgPSBGUERGQVBJX0NJREZyb21DaGFyQ29kZShwRW1iZWRNYXAsIGNoYXJjb2RlKTsKLSAgY29uc3QgYXV0byYgY29kZXMgPSBHZXRGb250R2xvYmFscygpLT5tX0VtYmVkZGVkVG9Vbmljb2Rlc1tjaGFyc2V0XTsKLSAgaWYgKGNvZGVzLm1fcE1hcCAmJiBjaWQgJiYgY2lkIDwgY29kZXMubV9Db3VudCkKLSAgICByZXR1cm4gY29kZXMubV9wTWFwW2NpZF07CisgIGlmICghY2lkKQorICAgIHJldHVybiAwOworCisgIGNvbnN0IHVpbnQxNl90KiBtYXA7CisgIHVpbnQzMl90IGNvdW50OworICBzdGQ6OnRpZShjb3VudCwgbWFwKSA9IEdldEZvbnRHbG9iYWxzKCktPkdldEVtYmVkZGVkVG9Vbmljb2RlKGNoYXJzZXQpOworICBpZiAobWFwICYmIGNpZCA8IGNvdW50KQorICAgIHJldHVybiBtYXBbY2lkXTsKICAgcmV0dXJuIDA7CiB9CiAKIHVpbnQzMl90IEVtYmVkZGVkQ2hhcmNvZGVGcm9tVW5pY29kZShjb25zdCBGWENNQVBfQ01hcCogcEVtYmVkTWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENJRFNldCBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHVuaWNvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90IHVuaWNvZGUpIHsKICAgaWYgKCFJc1ZhbGlkRW1iZWRkZWRDaGFyY29kZUZyb21Vbmljb2RlQ2hhcnNldChjaGFyc2V0KSkKICAgICByZXR1cm4gMDsKIAotICBjb25zdCBhdXRvJiBjb2RlcyA9IEdldEZvbnRHbG9iYWxzKCktPm1fRW1iZWRkZWRUb1VuaWNvZGVzW2NoYXJzZXRdOwotICBjb25zdCB1aW50MTZfdCogcENvZGVzID0gY29kZXMubV9wTWFwOwotICBpZiAoIXBDb2RlcykKKyAgY29uc3QgdWludDE2X3QqIG1hcDsKKyAgdWludDMyX3QgY291bnQ7CisgIHN0ZDo6dGllKGNvdW50LCBtYXApID0gR2V0Rm9udEdsb2JhbHMoKS0+R2V0RW1iZWRkZWRUb1VuaWNvZGUoY2hhcnNldCk7CisgIGlmICghbWFwKQogICAgIHJldHVybiAwOwogCi0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb2Rlcy5tX0NvdW50OyArK2kpIHsKLSAgICBpZiAocENvZGVzW2ldID09IHVuaWNvZGUpIHsKLSAgICAgIHVpbnQzMl90IENoYXJDb2RlID0gRlBERkFQSV9DaGFyQ29kZUZyb21DSUQocEVtYmVkTWFwLCBpKTsKLSAgICAgIGlmIChDaGFyQ29kZSkKLSAgICAgICAgcmV0dXJuIENoYXJDb2RlOworICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgIGlmIChtYXBbaV0gPT0gdW5pY29kZSkgeworICAgICAgdWludDMyX3QgY2hhckNvZGUgPSBGUERGQVBJX0NoYXJDb2RlRnJvbUNJRChwRW1iZWRNYXAsIGkpOworICAgICAgaWYgKGNoYXJDb2RlKQorICAgICAgICByZXR1cm4gY2hhckNvZGU7CiAgICAgfQogICB9CiAgIHJldHVybiAwOwogfQogCi0jZW5kaWYgIC8vIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNlbmRpZiAgLy8gX0ZYX1BMQVRGT1JNXyAhPSBfRlhfUExBVEZPUk1fV0lORE9XU18KIAogdm9pZCBGVF9Vc2VDSURDaGFybWFwKEZYRlRfRmFjZSBmYWNlLCBpbnQgY29kaW5nKSB7CiAgIGludCBlbmNvZGluZzsKQEAgLTIzMSwxOSArMjQ1LDE5IEBACiAgIHJldHVybiBtX3BDTWFwICYmIG1fcENNYXAtPklzVmVydFdyaXRpbmcoKTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9DSURGb250OjpVbmljb2RlRnJvbUNoYXJDb2RlKHVpbnQzMl90IGNoYXJjb2RlKSBjb25zdCB7Ci0gIENGWF9XaWRlU3RyaW5nIHN0ciA9IENQREZfRm9udDo6VW5pY29kZUZyb21DaGFyQ29kZShjaGFyY29kZSk7CitXaWRlU3RyaW5nIENQREZfQ0lERm9udDo6VW5pY29kZUZyb21DaGFyQ29kZSh1aW50MzJfdCBjaGFyY29kZSkgY29uc3QgeworICBXaWRlU3RyaW5nIHN0ciA9IENQREZfRm9udDo6VW5pY29kZUZyb21DaGFyQ29kZShjaGFyY29kZSk7CiAgIGlmICghc3RyLklzRW1wdHkoKSkKICAgICByZXR1cm4gc3RyOwotICBGWF9XQ0hBUiByZXQgPSBHZXRVbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLSAgcmV0dXJuIHJldCA/IHJldCA6IENGWF9XaWRlU3RyaW5nKCk7CisgIHdjaGFyX3QgcmV0ID0gR2V0VW5pY29kZUZyb21DaGFyQ29kZShjaGFyY29kZSk7CisgIHJldHVybiByZXQgPyByZXQgOiBXaWRlU3RyaW5nKCk7CiB9CiAKLUZYX1dDSEFSIENQREZfQ0lERm9udDo6R2V0VW5pY29kZUZyb21DaGFyQ29kZSh1aW50MzJfdCBjaGFyY29kZSkgY29uc3QgewotICBzd2l0Y2ggKG1fcENNYXAtPm1fQ29kaW5nKSB7Cit3Y2hhcl90IENQREZfQ0lERm9udDo6R2V0VW5pY29kZUZyb21DaGFyQ29kZSh1aW50MzJfdCBjaGFyY29kZSkgY29uc3QgeworICBzd2l0Y2ggKG1fcENNYXAtPkdldENvZGluZygpKSB7CiAgICAgY2FzZSBDSURDT0RJTkdfVUNTMjoKICAgICBjYXNlIENJRENPRElOR19VVEYxNjoKLSAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxGWF9XQ0hBUj4oY2hhcmNvZGUpOworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHdjaGFyX3Q+KGNoYXJjb2RlKTsKICAgICBjYXNlIENJRENPRElOR19DSUQ6CiAgICAgICBpZiAoIW1fcENJRDJVbmljb2RlTWFwIHx8ICFtX3BDSUQyVW5pY29kZU1hcC0+SXNMb2FkZWQoKSkKICAgICAgICAgcmV0dXJuIDA7CkBAIC0yNTIsMzAgKzI2NiwzMCBAQAogICBpZiAobV9wQ0lEMlVuaWNvZGVNYXAgJiYgbV9wQ0lEMlVuaWNvZGVNYXAtPklzTG9hZGVkKCkgJiYgbV9wQ01hcC0+SXNMb2FkZWQoKSkKICAgICByZXR1cm4gbV9wQ0lEMlVuaWNvZGVNYXAtPlVuaWNvZGVGcm9tQ0lEKENJREZyb21DaGFyQ29kZShjaGFyY29kZSkpOwogCi0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotICBGWF9XQ0hBUiB1bmljb2RlOworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisgIHdjaGFyX3QgdW5pY29kZTsKICAgaW50IGNoYXJzaXplID0gMTsKICAgaWYgKGNoYXJjb2RlID4gMjU1KSB7CiAgICAgY2hhcmNvZGUgPSAoY2hhcmNvZGUgJSAyNTYpICogMjU2ICsgKGNoYXJjb2RlIC8gMjU2KTsKICAgICBjaGFyc2l6ZSA9IDI7CiAgIH0KLSAgaW50IHJldCA9IEZYU1lTX011bHRpQnl0ZVRvV2lkZUNoYXIoCi0gICAgICBnX0NoYXJzZXRDUHNbbV9wQ01hcC0+bV9Db2RpbmddLCAwLAotICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBGWF9DSEFSKj4oJmNoYXJjb2RlKSwgY2hhcnNpemUsICZ1bmljb2RlLCAxKTsKKyAgaW50IHJldCA9IEZYU1lTX011bHRpQnl0ZVRvV2lkZUNoYXIoZ19DaGFyc2V0Q1BzW21fcENNYXAtPkdldENvZGluZygpXSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmNoYXJjb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnNpemUsICZ1bmljb2RlLCAxKTsKICAgcmV0dXJuIHJldCA9PSAxID8gdW5pY29kZSA6IDA7CiAjZWxzZQotICBpZiAoIW1fcENNYXAtPm1fcEVtYmVkTWFwKQorICBpZiAoIW1fcENNYXAtPkdldEVtYmVkTWFwKCkpCiAgICAgcmV0dXJuIDA7Ci0gIHJldHVybiBFbWJlZGRlZFVuaWNvZGVGcm9tQ2hhcmNvZGUobV9wQ01hcC0+bV9wRW1iZWRNYXAsIG1fcENNYXAtPm1fQ2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyY29kZSk7CisgIHJldHVybiBFbWJlZGRlZFVuaWNvZGVGcm9tQ2hhcmNvZGUobV9wQ01hcC0+R2V0RW1iZWRNYXAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDTWFwLT5HZXRDaGFyc2V0KCksIGNoYXJjb2RlKTsKICNlbmRpZgogfQogCi11aW50MzJfdCBDUERGX0NJREZvbnQ6OkNoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgdW5pY29kZSkgY29uc3QgewordWludDMyX3QgQ1BERl9DSURGb250OjpDaGFyQ29kZUZyb21Vbmljb2RlKHdjaGFyX3QgdW5pY29kZSkgY29uc3QgewogICB1aW50MzJfdCBjaGFyY29kZSA9IENQREZfRm9udDo6Q2hhckNvZGVGcm9tVW5pY29kZSh1bmljb2RlKTsKICAgaWYgKGNoYXJjb2RlKQogICAgIHJldHVybiBjaGFyY29kZTsKLSAgc3dpdGNoIChtX3BDTWFwLT5tX0NvZGluZykgeworICBzd2l0Y2ggKG1fcENNYXAtPkdldENvZGluZygpKSB7CiAgICAgY2FzZSBDSURDT0RJTkdfVU5LTk9XTjoKICAgICAgIHJldHVybiAwOwogICAgIGNhc2UgQ0lEQ09ESU5HX1VDUzI6CkBAIC0yODYsNyArMzAwLDcgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgICB1aW50MzJfdCBDSUQgPSAwOwogICAgICAgd2hpbGUgKENJRCA8IDY1NTM2KSB7Ci0gICAgICAgIEZYX1dDSEFSIHRoaXNfdW5pY29kZSA9CisgICAgICAgIHdjaGFyX3QgdGhpc191bmljb2RlID0KICAgICAgICAgICAgIG1fcENJRDJVbmljb2RlTWFwLT5Vbmljb2RlRnJvbUNJRChzdGF0aWNfY2FzdDx1aW50MTZfdD4oQ0lEKSk7CiAgICAgICAgIGlmICh0aGlzX3VuaWNvZGUgPT0gdW5pY29kZSkKICAgICAgICAgICByZXR1cm4gQ0lEOwpAQCAtMjk4LDIxICszMTIsMjEgQEAKIAogICBpZiAodW5pY29kZSA8IDB4ODApCiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90Pih1bmljb2RlKTsKLSAgaWYgKG1fcENNYXAtPm1fQ29kaW5nID09IENJRENPRElOR19DSUQpCisgIGlmIChtX3BDTWFwLT5HZXRDb2RpbmcoKSA9PSBDSURDT0RJTkdfQ0lEKQogICAgIHJldHVybiAwOwotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXwogICB1aW50OF90IGJ1ZmZlclszMl07CiAgIGludCByZXQgPSBGWFNZU19XaWRlQ2hhclRvTXVsdGlCeXRlKAotICAgICAgZ19DaGFyc2V0Q1BzW21fcENNYXAtPm1fQ29kaW5nXSwgMCwgJnVuaWNvZGUsIDEsCisgICAgICBnX0NoYXJzZXRDUHNbbV9wQ01hcC0+R2V0Q29kaW5nKCldLCAwLCAmdW5pY29kZSwgMSwKICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJ1ZmZlciksIDQsIG51bGxwdHIsIG51bGxwdHIpOwogICBpZiAocmV0ID09IDEpCiAgICAgcmV0dXJuIGJ1ZmZlclswXTsKICAgaWYgKHJldCA9PSAyKQogICAgIHJldHVybiBidWZmZXJbMF0gKiAyNTYgKyBidWZmZXJbMV07CiAjZWxzZQotICBpZiAobV9wQ01hcC0+bV9wRW1iZWRNYXApIHsKLSAgICByZXR1cm4gRW1iZWRkZWRDaGFyY29kZUZyb21Vbmljb2RlKG1fcENNYXAtPm1fcEVtYmVkTWFwLCBtX3BDTWFwLT5tX0NoYXJzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlKTsKKyAgaWYgKG1fcENNYXAtPkdldEVtYmVkTWFwKCkpIHsKKyAgICByZXR1cm4gRW1iZWRkZWRDaGFyY29kZUZyb21Vbmljb2RlKG1fcENNYXAtPkdldEVtYmVkTWFwKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDTWFwLT5HZXRDaGFyc2V0KCksIHVuaWNvZGUpOwogICB9CiAjZW5kaWYKICAgcmV0dXJuIDA7CkBAIC0zNDgsNDMgKzM2Miw0MyBAQAogICBpZiAoIXBFbmNvZGluZykKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgc3VidHlwZSA9IHBDSURGb250RGljdC0+R2V0U3RyaW5nRm9yKCJTdWJ0eXBlIik7CisgIEJ5dGVTdHJpbmcgc3VidHlwZSA9IHBDSURGb250RGljdC0+R2V0U3RyaW5nRm9yKCJTdWJ0eXBlIik7CiAgIG1fYlR5cGUxID0gKHN1YnR5cGUgPT0gIkNJREZvbnRUeXBlMCIpOwogCi0gIENQREZfQ01hcE1hbmFnZXImIG1hbmFnZXIgPSBHZXRGb250R2xvYmFscygpLT5tX0NNYXBNYW5hZ2VyOworICBDUERGX0NNYXBNYW5hZ2VyKiBtYW5hZ2VyID0gR2V0Rm9udEdsb2JhbHMoKS0+R2V0Q01hcE1hbmFnZXIoKTsKICAgaWYgKHBFbmNvZGluZy0+SXNOYW1lKCkpIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBjbWFwID0gcEVuY29kaW5nLT5HZXRTdHJpbmcoKTsKKyAgICBCeXRlU3RyaW5nIGNtYXAgPSBwRW5jb2RpbmctPkdldFN0cmluZygpOwogICAgIGJvb2wgYlByb21wdENKSyA9IG1fcEZvbnRGaWxlICYmIG1fYlR5cGUxOwotICAgIG1fcENNYXAgPSBtYW5hZ2VyLkdldFByZWRlZmluZWRDTWFwKGNtYXAsIGJQcm9tcHRDSkspOworICAgIG1fcENNYXAgPSBtYW5hZ2VyLT5HZXRQcmVkZWZpbmVkQ01hcChjbWFwLCBiUHJvbXB0Q0pLKTsKICAgICBpZiAoIW1fcENNYXApCiAgICAgICByZXR1cm4gZmFsc2U7CiAgIH0gZWxzZSBpZiAoQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwRW5jb2RpbmctPkFzU3RyZWFtKCkpIHsKLSAgICBtX3BDTWFwID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfQ01hcD4oKTsKLSAgICBDUERGX1N0cmVhbUFjYyBhY2M7Ci0gICAgYWNjLkxvYWRBbGxEYXRhKHBTdHJlYW0sIGZhbHNlKTsKLSAgICBtX3BDTWFwLT5Mb2FkRW1iZWRkZWQoYWNjLkdldERhdGEoKSwgYWNjLkdldFNpemUoKSk7CisgICAgYXV0byBwQWNjID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfU3RyZWFtQWNjPihwU3RyZWFtKTsKKyAgICBwQWNjLT5Mb2FkQWxsRGF0YUZpbHRlcmVkKCk7CisgICAgbV9wQ01hcCA9IHBkZml1bTo6TWFrZVJldGFpbjxDUERGX0NNYXA+KCk7CisgICAgbV9wQ01hcC0+TG9hZEVtYmVkZGVkKHBBY2MtPkdldERhdGEoKSwgcEFjYy0+R2V0U2l6ZSgpKTsKICAgfSBlbHNlIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAotICBtX0NoYXJzZXQgPSBtX3BDTWFwLT5tX0NoYXJzZXQ7CisgIG1fQ2hhcnNldCA9IG1fcENNYXAtPkdldENoYXJzZXQoKTsKICAgaWYgKG1fQ2hhcnNldCA9PSBDSURTRVRfVU5LTk9XTikgewogICAgIENQREZfRGljdGlvbmFyeSogcENJREluZm8gPSBwQ0lERm9udERpY3QtPkdldERpY3RGb3IoIkNJRFN5c3RlbUluZm8iKTsKICAgICBpZiAocENJREluZm8pIHsKLSAgICAgIG1fQ2hhcnNldCA9Ci0gICAgICAgICAgQ2hhcnNldEZyb21PcmRlcmluZyhwQ0lESW5mby0+R2V0U3RyaW5nRm9yKCJPcmRlcmluZyIpLkFzU3RyaW5nQygpKTsKKyAgICAgIG1fQ2hhcnNldCA9IENQREZfQ01hcFBhcnNlcjo6Q2hhcnNldEZyb21PcmRlcmluZygKKyAgICAgICAgICBwQ0lESW5mby0+R2V0U3RyaW5nRm9yKCJPcmRlcmluZyIpLkFzU3RyaW5nVmlldygpKTsKICAgICB9CiAgIH0KICAgaWYgKG1fQ2hhcnNldCAhPSBDSURTRVRfVU5LTk9XTikgewotICAgIGJvb2wgYlByb21wdENKSyA9ICFtX3BGb250RmlsZSAmJiAobV9wQ01hcC0+bV9Db2RpbmcgPT0gQ0lEQ09ESU5HX0NJRCB8fAorICAgIGJvb2wgYlByb21wdENKSyA9ICFtX3BGb250RmlsZSAmJiAobV9wQ01hcC0+R2V0Q29kaW5nKCkgPT0gQ0lEQ09ESU5HX0NJRCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENJREZvbnREaWN0LT5LZXlFeGlzdCgiVyIpKTsKLSAgICBtX3BDSUQyVW5pY29kZU1hcCA9IG1hbmFnZXIuR2V0Q0lEMlVuaWNvZGVNYXAobV9DaGFyc2V0LCBiUHJvbXB0Q0pLKTsKKyAgICBtX3BDSUQyVW5pY29kZU1hcCA9IG1hbmFnZXItPkdldENJRDJVbmljb2RlTWFwKG1fQ2hhcnNldCwgYlByb21wdENKSyk7CiAgIH0KICAgaWYgKG1fRm9udC5HZXRGYWNlKCkpIHsKICAgICBpZiAobV9iVHlwZTEpCiAgICAgICBGWEZUX1NlbGVjdF9DaGFybWFwKG1fRm9udC5HZXRGYWNlKCksIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSk7CiAgICAgZWxzZQotICAgICAgRlRfVXNlQ0lEQ2hhcm1hcChtX0ZvbnQuR2V0RmFjZSgpLCBtX3BDTWFwLT5tX0NvZGluZyk7CisgICAgICBGVF9Vc2VDSURDaGFybWFwKG1fRm9udC5HZXRGYWNlKCksIG1fcENNYXAtPkdldENvZGluZygpKTsKICAgfQogICBtX0RlZmF1bHRXaWR0aCA9IHBDSURGb250RGljdC0+R2V0SW50ZWdlckZvcigiRFciLCAxMDAwKTsKICAgQ1BERl9BcnJheSogcFdpZHRoQXJyYXkgPSBwQ0lERm9udERpY3QtPkdldEFycmF5Rm9yKCJXIik7CkBAIC0zOTMsMTQgKzQwNywxNCBAQAogICBpZiAoIUlzRW1iZWRkZWQoKSkKICAgICBMb2FkU3Vic3RGb250KCk7CiAKLSAgaWYgKG1fcEZvbnRGaWxlIHx8IChHZXRTdWJzdEZvbnQoKS0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX0VYQUNUKSkgeworICBpZiAobV9wRm9udEZpbGUpIHsKICAgICBDUERGX09iamVjdCogcG1hcCA9IHBDSURGb250RGljdC0+R2V0RGlyZWN0T2JqZWN0Rm9yKCJDSURUb0dJRE1hcCIpOwogICAgIGlmIChwbWFwKSB7CiAgICAgICBpZiAoQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwbWFwLT5Bc1N0cmVhbSgpKSB7Ci0gICAgICAgIG1fcFN0cmVhbUFjYyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmVhbUFjYz4oKTsKLSAgICAgICAgbV9wU3RyZWFtQWNjLT5Mb2FkQWxsRGF0YShwU3RyZWFtLCBmYWxzZSk7CisgICAgICAgIG1fcFN0cmVhbUFjYyA9IHBkZml1bTo6TWFrZVJldGFpbjxDUERGX1N0cmVhbUFjYz4ocFN0cmVhbSk7CisgICAgICAgIG1fcFN0cmVhbUFjYy0+TG9hZEFsbERhdGFGaWx0ZXJlZCgpOwogICAgICAgfSBlbHNlIGlmIChwbWFwLT5HZXRTdHJpbmcoKSA9PSAiSWRlbnRpdHkiKSB7Ci0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9BUFBMRV8KICAgICAgICAgaWYgKG1fcEZvbnRGaWxlKQogICAgICAgICAgIG1fYkNJRElzR0lEID0gdHJ1ZTsKICNlbHNlCkBAIC00NDAsMTEgKzQ1NCwxNSBAQAogICAgICAgaW50IGVyciA9IEZYRlRfTG9hZF9HbHlwaChmYWNlLCBnbHlwaF9pbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCk7CiAgICAgICBpZiAoIWVycikgewotICAgICAgICBGWEZUX0JCb3ggY2JveDsKICAgICAgICAgRlhGVF9HbHlwaCBnbHlwaDsKICAgICAgICAgZXJyID0gRlhGVF9HZXRfR2x5cGgoKChGWEZUX0ZhY2UpZmFjZSktPmdseXBoLCAmZ2x5cGgpOwogICAgICAgICBpZiAoIWVycikgeworICAgICAgICAgIEZYRlRfQkJveCBjYm94OwogICAgICAgICAgIEZYRlRfR2x5cGhfR2V0X0NCb3goZ2x5cGgsIEZYRlRfR0xZUEhfQkJPWF9QSVhFTFMsICZjYm94KTsKKyAgICAgICAgICBjYm94LnhNaW4gPSBwZGZpdW06OmNsYW1wKGNib3gueE1pbiwga01pbkNCb3gsIGtNYXhDQm94KTsKKyAgICAgICAgICBjYm94LnhNYXggPSBwZGZpdW06OmNsYW1wKGNib3gueE1heCwga01pbkNCb3gsIGtNYXhDQm94KTsKKyAgICAgICAgICBjYm94LnlNaW4gPSBwZGZpdW06OmNsYW1wKGNib3gueU1pbiwga01pbkNCb3gsIGtNYXhDQm94KTsKKyAgICAgICAgICBjYm94LnlNYXggPSBwZGZpdW06OmNsYW1wKGNib3gueU1heCwga01pbkNCb3gsIGtNYXhDQm94KTsKICAgICAgICAgICBpbnQgcGl4ZWxfc2l6ZV94ID0gKChGWEZUX0ZhY2UpZmFjZSktPnNpemUtPm1ldHJpY3MueF9wcGVtOwogICAgICAgICAgIGludCBwaXhlbF9zaXplX3kgPSAoKEZYRlRfRmFjZSlmYWNlKS0+c2l6ZS0+bWV0cmljcy55X3BwZW07CiAgICAgICAgICAgaWYgKHBpeGVsX3NpemVfeCA9PSAwIHx8IHBpeGVsX3NpemVfeSA9PSAwKSB7CkBAIC00ODcsOSArNTA1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIENJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVszXSksCiAgICAgICAgICAgICAgICAgICAgICAgICBDSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bNF0pICogMTAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgIENJRFRyYW5zZm9ybVRvRmxvYXQocFRyYW5zZm9ybVs1XSkgKiAxMDAwKTsKLSAgICAgIENGWF9GbG9hdFJlY3QgcmVjdF9mKHJlY3QpOwotICAgICAgbWF0cml4LlRyYW5zZm9ybVJlY3QocmVjdF9mKTsKLSAgICAgIHJlY3QgPSByZWN0X2YuR2V0T3V0ZXJSZWN0KCk7CisgICAgICByZWN0ID0gbWF0cml4LlRyYW5zZm9ybVJlY3QoQ0ZYX0Zsb2F0UmVjdChyZWN0KSkuR2V0T3V0ZXJSZWN0KCk7CiAgICAgfQogICB9CiAgIGlmIChjaGFyY29kZSA8IDI1NikKQEAgLTYwMywxOSArNjE5LDE5IEBACiAKICAgaWYgKCFtX3BGb250RmlsZSAmJiAhbV9wU3RyZWFtQWNjKSB7CiAgICAgdWludDE2X3QgY2lkID0gQ0lERnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLSAgICBGWF9XQ0hBUiB1bmljb2RlID0gMDsKKyAgICB3Y2hhcl90IHVuaWNvZGUgPSAwOwogICAgIGlmIChtX2JDSURJc0dJRCkgewotI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fQVBQTEVfCisjaWYgX0ZYX1BMQVRGT1JNXyAhPSBfRlhfUExBVEZPUk1fQVBQTEVfCiAgICAgICByZXR1cm4gY2lkOwogI2Vsc2UKLSAgICAgIGlmIChtX0ZsYWdzICYgRlhGT05UX1NZTUJPTElDKQorICAgICAgaWYgKEZvbnRTdHlsZUlzU3ltYm9saWMobV9GbGFncykpCiAgICAgICAgIHJldHVybiBjaWQ7CiAKLSAgICAgIENGWF9XaWRlU3RyaW5nIHVuaV9zdHIgPSBVbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgICAgIFdpZGVTdHJpbmcgdW5pX3N0ciA9IFVuaWNvZGVGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOwogICAgICAgaWYgKHVuaV9zdHIuSXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gY2lkOwogCi0gICAgICB1bmljb2RlID0gdW5pX3N0ci5HZXRBdCgwKTsKKyAgICAgIHVuaWNvZGUgPSB1bmlfc3RyWzBdOwogI2VuZGlmCiAgICAgfSBlbHNlIHsKICAgICAgIGlmIChjaWQgJiYgbV9wQ0lEMlVuaWNvZGVNYXAgJiYgbV9wQ0lEMlVuaWNvZGVNYXAtPklzTG9hZGVkKCkpCkBAIC02MjMsOSArNjM5LDkgQEAKICAgICAgIGlmICh1bmljb2RlID09IDApCiAgICAgICAgIHVuaWNvZGUgPSBHZXRVbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKICAgICAgIGlmICh1bmljb2RlID09IDApIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgdW5pY29kZV9zdHIgPSBVbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKyAgICAgICAgV2lkZVN0cmluZyB1bmljb2RlX3N0ciA9IFVuaWNvZGVGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOwogICAgICAgICBpZiAoIXVuaWNvZGVfc3RyLklzRW1wdHkoKSkKLSAgICAgICAgICB1bmljb2RlID0gdW5pY29kZV9zdHIuR2V0QXQoMCk7CisgICAgICAgICAgdW5pY29kZSA9IHVuaWNvZGVfc3RyWzBdOwogICAgICAgfQogICAgIH0KICAgICBGWEZUX0ZhY2UgZmFjZSA9IG1fRm9udC5HZXRGYWNlKCk7CkBAIC02NDEsOCArNjU3LDggQEAKICAgICAgICAgaUJhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSTsKICAgICAgIGVsc2UgaWYgKGJNYWNSb21hbikKICAgICAgICAgaUJhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfTUFDUk9NQU47Ci0gICAgICBjb25zdCBGWF9DSEFSKiBuYW1lID0gR2V0QWRvYmVDaGFyTmFtZSgKLSAgICAgICAgICBpQmFzZUVuY29kaW5nLCBzdGQ6OnZlY3RvcjxDRlhfQnl0ZVN0cmluZz4oKSwgY2hhcmNvZGUpOworICAgICAgY29uc3QgY2hhciogbmFtZSA9CisgICAgICAgICAgR2V0QWRvYmVDaGFyTmFtZShpQmFzZUVuY29kaW5nLCBzdGQ6OnZlY3RvcjxCeXRlU3RyaW5nPigpLCBjaGFyY29kZSk7CiAgICAgICBpZiAoIW5hbWUpCiAgICAgICAgIHJldHVybiBjaGFyY29kZSA/IHN0YXRpY19jYXN0PGludD4oY2hhcmNvZGUpIDogLTE7CiAKQEAgLTY3MCw3ICs2ODYsNyBAQAogICAgIGlmIChtX0NoYXJzZXQgPT0gQ0lEU0VUX0pBUEFOMSkgewogICAgICAgaWYgKHVuaWNvZGUgPT0gJ1xcJykgewogICAgICAgICB1bmljb2RlID0gJy8nOwotI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fQVBQTEVfCisjaWYgX0ZYX1BMQVRGT1JNXyAhPSBfRlhfUExBVEZPUk1fQVBQTEVfCiAgICAgICB9IGVsc2UgaWYgKHVuaWNvZGUgPT0gMHhhNSkgewogICAgICAgICB1bmljb2RlID0gMHg1YzsKICNlbmRpZgpAQCAtNjg1LDE2ICs3MDEsMTYgQEAKICAgICAgIGZvciAoaSA9IDA7IGkgPCBGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChmYWNlKTsgaSsrKSB7CiAgICAgICAgIHVpbnQzMl90IHJldCA9IEZUX0NoYXJDb2RlRnJvbVVuaWNvZGUoCiAgICAgICAgICAgICBGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbaV0pLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RlhfV0NIQVI+KGNoYXJjb2RlKSk7CisgICAgICAgICAgICBzdGF0aWNfY2FzdDx3Y2hhcl90PihjaGFyY29kZSkpOwogICAgICAgICBpZiAocmV0ID09IDApCiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIEZYRlRfU2V0X0NoYXJtYXAoZmFjZSwgRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKVtpXSk7Ci0gICAgICAgIHVuaWNvZGUgPSBzdGF0aWNfY2FzdDxGWF9XQ0hBUj4ocmV0KTsKKyAgICAgICAgdW5pY29kZSA9IHN0YXRpY19jYXN0PHdjaGFyX3Q+KHJldCk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgaWYgKGkgPT0gRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQoZmFjZSkgJiYgaSkgewogICAgICAgICBGWEZUX1NldF9DaGFybWFwKGZhY2UsIEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbMF0pOwotICAgICAgICB1bmljb2RlID0gc3RhdGljX2Nhc3Q8RlhfV0NIQVI+KGNoYXJjb2RlKTsKKyAgICAgICAgdW5pY29kZSA9IHN0YXRpY19jYXN0PHdjaGFyX3Q+KGNoYXJjb2RlKTsKICAgICAgIH0KICAgICB9CiAgICAgaWYgKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcChmYWNlKSkgewpAQCAtNzExLDIwICs3MjcsMTkgQEAKICAgaWYgKCFtX3BTdHJlYW1BY2MpIHsKICAgICBpZiAobV9iVHlwZTEpCiAgICAgICByZXR1cm4gY2lkOwotCi0gICAgaWYgKG1fcEZvbnRGaWxlICYmICFtX3BDTWFwLT5tX3BNYXBwaW5nKQorICAgIGlmIChtX3BGb250RmlsZSAmJiBtX3BDTWFwLT5Jc0RpcmVjdENoYXJjb2RlVG9DSURUYWJsZUlzRW1wdHkoKSkKICAgICAgIHJldHVybiBjaWQ7Ci0gICAgaWYgKG1fcENNYXAtPm1fQ29kaW5nID09IENJRENPRElOR19VTktOT1dOIHx8CisgICAgaWYgKG1fcENNYXAtPkdldENvZGluZygpID09IENJRENPRElOR19VTktOT1dOIHx8CiAgICAgICAgICFGWEZUX0dldF9GYWNlX0NoYXJtYXAobV9Gb250LkdldEZhY2UoKSkpIHsKICAgICAgIHJldHVybiBjaWQ7CiAgICAgfQogICAgIGlmIChGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcChtX0ZvbnQuR2V0RmFjZSgpKSkgPT0KICAgICAgICAgRlhGVF9FTkNPRElOR19VTklDT0RFKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB1bmljb2RlX3N0ciA9IFVuaWNvZGVGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOworICAgICAgV2lkZVN0cmluZyB1bmljb2RlX3N0ciA9IFVuaWNvZGVGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOwogICAgICAgaWYgKHVuaWNvZGVfc3RyLklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIC0xOwogCi0gICAgICBjaGFyY29kZSA9IHVuaWNvZGVfc3RyLkdldEF0KDApOworICAgICAgY2hhcmNvZGUgPSB1bmljb2RlX3N0clswXTsKICAgICB9CiAgICAgcmV0dXJuIEdldEdseXBoSW5kZXgoY2hhcmNvZGUsIHBWZXJ0R2x5cGgpOwogICB9CkBAIC03MzYsNyArNzUxLDcgQEAKICAgcmV0dXJuIHBkYXRhWzBdICogMjU2ICsgcGRhdGFbMV07CiB9CiAKLXVpbnQzMl90IENQREZfQ0lERm9udDo6R2V0TmV4dENoYXIoY29uc3QgRlhfQ0hBUiogcFN0cmluZywKK3VpbnQzMl90IENQREZfQ0lERm9udDo6R2V0TmV4dENoYXIoY29uc3QgY2hhciogcFN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TdHJMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgb2Zmc2V0KSBjb25zdCB7CiAgIHJldHVybiBtX3BDTWFwLT5HZXROZXh0Q2hhcihwU3RyaW5nLCBuU3RyTGVuLCBvZmZzZXQpOwpAQCAtNzQ2LDE4ICs3NjEsMTggQEAKICAgcmV0dXJuIG1fcENNYXAtPkdldENoYXJTaXplKGNoYXJjb2RlKTsKIH0KIAotaW50IENQREZfQ0lERm9udDo6Q291bnRDaGFyKGNvbnN0IEZYX0NIQVIqIHBTdHJpbmcsIGludCBzaXplKSBjb25zdCB7CitpbnQgQ1BERl9DSURGb250OjpDb3VudENoYXIoY29uc3QgY2hhciogcFN0cmluZywgaW50IHNpemUpIGNvbnN0IHsKICAgcmV0dXJuIG1fcENNYXAtPkNvdW50Q2hhcihwU3RyaW5nLCBzaXplKTsKIH0KIAotaW50IENQREZfQ0lERm9udDo6QXBwZW5kQ2hhcihGWF9DSEFSKiBzdHIsIHVpbnQzMl90IGNoYXJjb2RlKSBjb25zdCB7CitpbnQgQ1BERl9DSURGb250OjpBcHBlbmRDaGFyKGNoYXIqIHN0ciwgdWludDMyX3QgY2hhcmNvZGUpIGNvbnN0IHsKICAgcmV0dXJuIG1fcENNYXAtPkFwcGVuZENoYXIoc3RyLCBjaGFyY29kZSk7CiB9CiAKIGJvb2wgQ1BERl9DSURGb250OjpJc1VuaWNvZGVDb21wYXRpYmxlKCkgY29uc3QgewogICBpZiAobV9wQ0lEMlVuaWNvZGVNYXAgJiYgbV9wQ0lEMlVuaWNvZGVNYXAtPklzTG9hZGVkKCkgJiYgbV9wQ01hcC0+SXNMb2FkZWQoKSkKICAgICByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIG1fcENNYXAtPm1fQ29kaW5nICE9IENJRENPRElOR19VTktOT1dOOworICByZXR1cm4gbV9wQ01hcC0+R2V0Q29kaW5nKCkgIT0gQ0lEQ09ESU5HX1VOS05PV047CiB9CiAKIHZvaWQgQ1BERl9DSURGb250OjpMb2FkU3Vic3RGb250KCkgewpAQCAtNzczLDggKzc4OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkVsZW1lbnRzKSB7CiAgIGludCB3aWR0aF9zdGF0dXMgPSAwOwogICBpbnQgaUN1ckVsZW1lbnQgPSAwOwotICBpbnQgZmlyc3RfY29kZSA9IDA7Ci0gIGludCBsYXN0X2NvZGUgPSAwOworICB1aW50MzJfdCBmaXJzdF9jb2RlID0gMDsKKyAgdWludDMyX3QgbGFzdF9jb2RlID0gMDsKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkrKykgewogICAgIENQREZfT2JqZWN0KiBwT2JqID0gcEFycmF5LT5HZXREaXJlY3RPYmplY3RBdChpKTsKICAgICBpZiAoIXBPYmopCkBAIC03ODMsNiArNzk4LDExIEBACiAgICAgaWYgKENQREZfQXJyYXkqIHBPYmpBcnJheSA9IHBPYmotPkFzQXJyYXkoKSkgewogICAgICAgaWYgKHdpZHRoX3N0YXR1cyAhPSAxKQogICAgICAgICByZXR1cm47CisgICAgICBpZiAoZmlyc3RfY29kZSA+CisgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpIC0gcE9iakFycmF5LT5HZXRDb3VudCgpKSB7CisgICAgICAgIHdpZHRoX3N0YXR1cyA9IDA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQogCiAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHBPYmpBcnJheS0+R2V0Q291bnQoKTsgaiArPSBuRWxlbWVudHMpIHsKICAgICAgICAgcmVzdWx0LT5wdXNoX2JhY2soZmlyc3RfY29kZSk7CkBAIC04MTUsNyArODM1LDcgQEAKIH0KIAogLy8gc3RhdGljCi1GWF9GTE9BVCBDUERGX0NJREZvbnQ6OkNJRFRyYW5zZm9ybVRvRmxvYXQodWludDhfdCBjaCkgeworZmxvYXQgQ1BERl9DSURGb250OjpDSURUcmFuc2Zvcm1Ub0Zsb2F0KHVpbnQ4X3QgY2gpIHsKICAgcmV0dXJuIChjaCA8IDEyOCA/IGNoIDogY2ggLSAyNTUpICogKDEuMGYgLyAxMjcpOwogfQogCkBAIC04MjcsOSArODQ3LDEwIEBACiAKICAgbV9DaGFyc2V0ID0gQ0lEU0VUX0dCMTsKICAgbV9iVHlwZTEgPSBmYWxzZTsKLSAgQ1BERl9DTWFwTWFuYWdlciYgbWFuYWdlciA9IEdldEZvbnRHbG9iYWxzKCktPm1fQ01hcE1hbmFnZXI7Ci0gIG1fcENNYXAgPSBtYW5hZ2VyLkdldFByZWRlZmluZWRDTWFwKCJHQkstRVVDLUgiLCBmYWxzZSk7Ci0gIG1fcENJRDJVbmljb2RlTWFwID0gbWFuYWdlci5HZXRDSUQyVW5pY29kZU1hcChtX0NoYXJzZXQsIGZhbHNlKTsKKworICBDUERGX0NNYXBNYW5hZ2VyKiBtYW5hZ2VyID0gR2V0Rm9udEdsb2JhbHMoKS0+R2V0Q01hcE1hbmFnZXIoKTsKKyAgbV9wQ01hcCA9IG1hbmFnZXItPkdldFByZWRlZmluZWRDTWFwKCJHQkstRVVDLUgiLCBmYWxzZSk7CisgIG1fcENJRDJVbmljb2RlTWFwID0gbWFuYWdlci0+R2V0Q0lEMlVuaWNvZGVNYXAobV9DaGFyc2V0LCBmYWxzZSk7CiAgIGlmICghSXNFbWJlZGRlZCgpKQogICAgIExvYWRTdWJzdEZvbnQoKTsKIApkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jaWRmb250LmggYi9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NpZGZvbnQuaAppbmRleCA3OWVjN2NiLi5mNmZmODNkIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NpZGZvbnQuaAorKysgYi9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NpZGZvbnQuaApAQCAtMTEsMTEgKzExLDEyIEBACiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9mb250LmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfbWF5YmVfb3duZWQuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogCi1lbnVtIENJRFNldCB7CitlbnVtIENJRFNldCA6IHVpbnQ4X3QgewogICBDSURTRVRfVU5LTk9XTiwKICAgQ0lEU0VUX0dCMSwKICAgQ0lEU0VUX0NOUzEsCkBAIC0zNiw3ICszNyw3IEBACiAgIENQREZfQ0lERm9udCgpOwogICB+Q1BERl9DSURGb250KCkgb3ZlcnJpZGU7CiAKLSAgc3RhdGljIEZYX0ZMT0FUIENJRFRyYW5zZm9ybVRvRmxvYXQodWludDhfdCBjaCk7CisgIHN0YXRpYyBmbG9hdCBDSURUcmFuc2Zvcm1Ub0Zsb2F0KHVpbnQ4X3QgY2gpOwogCiAgIC8vIENQREZfRm9udDoKICAgYm9vbCBJc0NJREZvbnQoKSBjb25zdCBvdmVycmlkZTsKQEAgLTQ1LDE2ICs0NiwxNiBAQAogICBpbnQgR2x5cGhGcm9tQ2hhckNvZGUodWludDMyX3QgY2hhcmNvZGUsIGJvb2wqIHBWZXJ0R2x5cGgpIG92ZXJyaWRlOwogICBpbnQgR2V0Q2hhcldpZHRoRih1aW50MzJfdCBjaGFyY29kZSkgb3ZlcnJpZGU7CiAgIEZYX1JFQ1QgR2V0Q2hhckJCb3godWludDMyX3QgY2hhcmNvZGUpIG92ZXJyaWRlOwotICB1aW50MzJfdCBHZXROZXh0Q2hhcihjb25zdCBGWF9DSEFSKiBwU3RyaW5nLAorICB1aW50MzJfdCBHZXROZXh0Q2hhcihjb25zdCBjaGFyKiBwU3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgblN0ckxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBvZmZzZXQpIGNvbnN0IG92ZXJyaWRlOwotICBpbnQgQ291bnRDaGFyKGNvbnN0IEZYX0NIQVIqIHBTdHJpbmcsIGludCBzaXplKSBjb25zdCBvdmVycmlkZTsKLSAgaW50IEFwcGVuZENoYXIoRlhfQ0hBUiogc3RyLCB1aW50MzJfdCBjaGFyY29kZSkgY29uc3Qgb3ZlcnJpZGU7CisgIGludCBDb3VudENoYXIoY29uc3QgY2hhciogcFN0cmluZywgaW50IHNpemUpIGNvbnN0IG92ZXJyaWRlOworICBpbnQgQXBwZW5kQ2hhcihjaGFyKiBzdHIsIHVpbnQzMl90IGNoYXJjb2RlKSBjb25zdCBvdmVycmlkZTsKICAgYm9vbCBJc1ZlcnRXcml0aW5nKCkgY29uc3Qgb3ZlcnJpZGU7CiAgIGJvb2wgSXNVbmljb2RlQ29tcGF0aWJsZSgpIGNvbnN0IG92ZXJyaWRlOwogICBib29sIExvYWQoKSBvdmVycmlkZTsKLSAgQ0ZYX1dpZGVTdHJpbmcgVW5pY29kZUZyb21DaGFyQ29kZSh1aW50MzJfdCBjaGFyY29kZSkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHVpbnQzMl90IENoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgVW5pY29kZSkgY29uc3Qgb3ZlcnJpZGU7CisgIFdpZGVTdHJpbmcgVW5pY29kZUZyb21DaGFyQ29kZSh1aW50MzJfdCBjaGFyY29kZSkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IENoYXJDb2RlRnJvbVVuaWNvZGUod2NoYXJfdCBVbmljb2RlKSBjb25zdCBvdmVycmlkZTsKIAogICB1aW50MTZfdCBDSURGcm9tQ2hhckNvZGUodWludDMyX3QgY2hhcmNvZGUpIGNvbnN0OwogICBjb25zdCB1aW50OF90KiBHZXRDSURUcmFuc2Zvcm0odWludDE2X3QgQ0lEKSBjb25zdDsKQEAgLTcwLDE1ICs3MSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+KiByZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkVsZW1lbnRzKTsKICAgdm9pZCBMb2FkU3Vic3RGb250KCk7Ci0gIEZYX1dDSEFSIEdldFVuaWNvZGVGcm9tQ2hhckNvZGUodWludDMyX3QgY2hhcmNvZGUpIGNvbnN0OworICB3Y2hhcl90IEdldFVuaWNvZGVGcm9tQ2hhckNvZGUodWludDMyX3QgY2hhcmNvZGUpIGNvbnN0OwogCi0gIENGWF9NYXliZU93bmVkPENQREZfQ01hcD4gbV9wQ01hcDsKLSAgQ1BERl9DSUQyVW5pY29kZU1hcCogbV9wQ0lEMlVuaWNvZGVNYXA7CisgIFJldGFpblB0cjxDUERGX0NNYXA+IG1fcENNYXA7CisgIFVub3duZWRQdHI8Q1BERl9DSUQyVW5pY29kZU1hcD4gbV9wQ0lEMlVuaWNvZGVNYXA7CiAgIENJRFNldCBtX0NoYXJzZXQ7CiAgIGJvb2wgbV9iVHlwZTE7CiAgIGJvb2wgbV9iQ0lESXNHSUQ7CiAgIHVpbnQxNl90IG1fRGVmYXVsdFdpZHRoOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9TdHJlYW1BY2M+IG1fcFN0cmVhbUFjYzsKKyAgUmV0YWluUHRyPENQREZfU3RyZWFtQWNjPiBtX3BTdHJlYW1BY2M7CiAgIGJvb2wgbV9iQW5zaVdpZHRoc0ZpeGVkOwogICBGWF9SRUNUIG1fQ2hhckJCb3hbMjU2XTsKICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IG1fV2lkdGhMaXN0OwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jbWFwLmNwcCBiL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfY21hcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY1NGZjYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfY21hcC5jcHAKQEAgLTAsMCArMSw0ODAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfY21hcC5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2NtYXBzL2NtYXBfaW50LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jbWFwbWFuYWdlci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfY21hcHBhcnNlci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zaW1wbGVfcGFyc2VyLmgiCisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBCeXRlUmFuZ2UgeworICB1aW50OF90IG1fRmlyc3Q7CisgIHVpbnQ4X3QgbV9MYXN0OyAgLy8gSW5jbHVzaXZlLgorfTsKKworc3RydWN0IFByZWRlZmluZWRDTWFwIHsKKyAgY29uc3QgY2hhciogbV9wTmFtZTsKKyAgQ0lEU2V0IG1fQ2hhcnNldDsKKyAgQ0lEQ29kaW5nIG1fQ29kaW5nOworICBDUERGX0NNYXA6OkNvZGluZ1NjaGVtZSBtX0NvZGluZ1NjaGVtZTsKKyAgdWludDhfdCBtX0xlYWRpbmdTZWdDb3VudDsKKyAgQnl0ZVJhbmdlIG1fTGVhZGluZ1NlZ3NbMl07Cit9OworCitjb25zdCBQcmVkZWZpbmVkQ01hcCBnX1ByZWRlZmluZWRDTWFwc1tdID0geworICAgIHsiR0ItRVVDIiwKKyAgICAgQ0lEU0VUX0dCMSwKKyAgICAgQ0lEQ09ESU5HX0dCLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDEsCisgICAgIHt7MHhhMSwgMHhmZX19fSwKKyAgICB7IkdCcGMtRVVDIiwKKyAgICAgQ0lEU0VUX0dCMSwKKyAgICAgQ0lEQ09ESU5HX0dCLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDEsCisgICAgIHt7MHhhMSwgMHhmY319fSwKKyAgICB7IkdCSy1FVUMiLAorICAgICBDSURTRVRfR0IxLAorICAgICBDSURDT0RJTkdfR0IsCisgICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKKyAgICAgMSwKKyAgICAge3sweDgxLCAweGZlfX19LAorICAgIHsiR0JLcC1FVUMiLAorICAgICBDSURTRVRfR0IxLAorICAgICBDSURDT0RJTkdfR0IsCisgICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKKyAgICAgMSwKKyAgICAge3sweDgxLCAweGZlfX19LAorICAgIHsiR0JLMkstRVVDIiwKKyAgICAgQ0lEU0VUX0dCMSwKKyAgICAgQ0lEQ09ESU5HX0dCLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDEsCisgICAgIHt7MHg4MSwgMHhmZX19fSwKKyAgICB7IkdCSzJLIiwKKyAgICAgQ0lEU0VUX0dCMSwKKyAgICAgQ0lEQ09ESU5HX0dCLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDEsCisgICAgIHt7MHg4MSwgMHhmZX19fSwKKyAgICB7IlVuaUdCLVVDUzIiLCBDSURTRVRfR0IxLCBDSURDT0RJTkdfVUNTMiwgQ1BERl9DTWFwOjpUd29CeXRlcywgMCwge319LAorICAgIHsiVW5pR0ItVVRGMTYiLCBDSURTRVRfR0IxLCBDSURDT0RJTkdfVVRGMTYsIENQREZfQ01hcDo6VHdvQnl0ZXMsIDAsIHt9fSwKKyAgICB7IkI1cGMiLAorICAgICBDSURTRVRfQ05TMSwKKyAgICAgQ0lEQ09ESU5HX0JJRzUsCisgICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKKyAgICAgMSwKKyAgICAge3sweGExLCAweGZjfX19LAorICAgIHsiSEtzY3MtQjUiLAorICAgICBDSURTRVRfQ05TMSwKKyAgICAgQ0lEQ09ESU5HX0JJRzUsCisgICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKKyAgICAgMSwKKyAgICAge3sweDg4LCAweGZlfX19LAorICAgIHsiRVRlbi1CNSIsCisgICAgIENJRFNFVF9DTlMxLAorICAgICBDSURDT0RJTkdfQklHNSwKKyAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAorICAgICAxLAorICAgICB7ezB4YTEsIDB4ZmV9fX0sCisgICAgeyJFVGVubXMtQjUiLAorICAgICBDSURTRVRfQ05TMSwKKyAgICAgQ0lEQ09ESU5HX0JJRzUsCisgICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKKyAgICAgMSwKKyAgICAge3sweGExLCAweGZlfX19LAorICAgIHsiVW5pQ05TLVVDUzIiLCBDSURTRVRfQ05TMSwgQ0lEQ09ESU5HX1VDUzIsIENQREZfQ01hcDo6VHdvQnl0ZXMsIDAsIHt9fSwKKyAgICB7IlVuaUNOUy1VVEYxNiIsIENJRFNFVF9DTlMxLCBDSURDT0RJTkdfVVRGMTYsIENQREZfQ01hcDo6VHdvQnl0ZXMsIDAsIHt9fSwKKyAgICB7IjgzcHYtUktTSiIsCisgICAgIENJRFNFVF9KQVBBTjEsCisgICAgIENJRENPRElOR19KSVMsCisgICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKKyAgICAgMiwKKyAgICAge3sweDgxLCAweDlmfSwgezB4ZTAsIDB4ZmN9fX0sCisgICAgeyI5MG1zLVJLU0oiLAorICAgICBDSURTRVRfSkFQQU4xLAorICAgICBDSURDT0RJTkdfSklTLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDIsCisgICAgIHt7MHg4MSwgMHg5Zn0sIHsweGUwLCAweGZjfX19LAorICAgIHsiOTBtc3AtUktTSiIsCisgICAgIENJRFNFVF9KQVBBTjEsCisgICAgIENJRENPRElOR19KSVMsCisgICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKKyAgICAgMiwKKyAgICAge3sweDgxLCAweDlmfSwgezB4ZTAsIDB4ZmN9fX0sCisgICAgeyI5MHB2LVJLU0oiLAorICAgICBDSURTRVRfSkFQQU4xLAorICAgICBDSURDT0RJTkdfSklTLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDIsCisgICAgIHt7MHg4MSwgMHg5Zn0sIHsweGUwLCAweGZjfX19LAorICAgIHsiQWRkLVJLU0oiLAorICAgICBDSURTRVRfSkFQQU4xLAorICAgICBDSURDT0RJTkdfSklTLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDIsCisgICAgIHt7MHg4MSwgMHg5Zn0sIHsweGUwLCAweGZjfX19LAorICAgIHsiRVVDIiwKKyAgICAgQ0lEU0VUX0pBUEFOMSwKKyAgICAgQ0lEQ09ESU5HX0pJUywKKyAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAorICAgICAyLAorICAgICB7ezB4OGUsIDB4OGV9LCB7MHhhMSwgMHhmZX19fSwKKyAgICB7IkgiLCBDSURTRVRfSkFQQU4xLCBDSURDT0RJTkdfSklTLCBDUERGX0NNYXA6OlR3b0J5dGVzLCAxLCB7ezB4MjEsIDB4N2V9fX0sCisgICAgeyJWIiwgQ0lEU0VUX0pBUEFOMSwgQ0lEQ09ESU5HX0pJUywgQ1BERl9DTWFwOjpUd29CeXRlcywgMSwge3sweDIxLCAweDdlfX19LAorICAgIHsiRXh0LVJLU0oiLAorICAgICBDSURTRVRfSkFQQU4xLAorICAgICBDSURDT0RJTkdfSklTLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDIsCisgICAgIHt7MHg4MSwgMHg5Zn0sIHsweGUwLCAweGZjfX19LAorICAgIHsiVW5pSklTLVVDUzIiLCBDSURTRVRfSkFQQU4xLCBDSURDT0RJTkdfVUNTMiwgQ1BERl9DTWFwOjpUd29CeXRlcywgMCwge319LAorICAgIHsiVW5pSklTLVVDUzItSFciLAorICAgICBDSURTRVRfSkFQQU4xLAorICAgICBDSURDT0RJTkdfVUNTMiwKKyAgICAgQ1BERl9DTWFwOjpUd29CeXRlcywKKyAgICAgMCwKKyAgICAge319LAorICAgIHsiVW5pSklTLVVURjE2IiwKKyAgICAgQ0lEU0VUX0pBUEFOMSwKKyAgICAgQ0lEQ09ESU5HX1VURjE2LAorICAgICBDUERGX0NNYXA6OlR3b0J5dGVzLAorICAgICAwLAorICAgICB7fX0sCisgICAgeyJLU0MtRVVDIiwKKyAgICAgQ0lEU0VUX0tPUkVBMSwKKyAgICAgQ0lEQ09ESU5HX0tPUkVBLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDEsCisgICAgIHt7MHhhMSwgMHhmZX19fSwKKyAgICB7IktTQ21zLVVIQyIsCisgICAgIENJRFNFVF9LT1JFQTEsCisgICAgIENJRENPRElOR19LT1JFQSwKKyAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAorICAgICAxLAorICAgICB7ezB4ODEsIDB4ZmV9fX0sCisgICAgeyJLU0Ntcy1VSEMtSFciLAorICAgICBDSURTRVRfS09SRUExLAorICAgICBDSURDT0RJTkdfS09SRUEsCisgICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKKyAgICAgMSwKKyAgICAge3sweDgxLCAweGZlfX19LAorICAgIHsiS1NDcGMtRVVDIiwKKyAgICAgQ0lEU0VUX0tPUkVBMSwKKyAgICAgQ0lEQ09ESU5HX0tPUkVBLAorICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCisgICAgIDEsCisgICAgIHt7MHhhMSwgMHhmZH19fSwKKyAgICB7IlVuaUtTLVVDUzIiLCBDSURTRVRfS09SRUExLCBDSURDT0RJTkdfVUNTMiwgQ1BERl9DTWFwOjpUd29CeXRlcywgMCwge319LAorICAgIHsiVW5pS1MtVVRGMTYiLCBDSURTRVRfS09SRUExLCBDSURDT0RJTkdfVVRGMTYsIENQREZfQ01hcDo6VHdvQnl0ZXMsIDAsIHt9fSwKK307CisKK2ludCBDaGVja0ZvdXJCeXRlQ29kZVJhbmdlKHVpbnQ4X3QqIGNvZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDUERGX0NNYXA6OkNvZGVSYW5nZT4mIHJhbmdlcykgeworICBmb3IgKHNpemVfdCBpID0gcmFuZ2VzLnNpemUoKTsgaSA+IDA7IGktLSkgeworICAgIHNpemVfdCBzZWcgPSBpIC0gMTsKKyAgICBpZiAocmFuZ2VzW3NlZ10ubV9DaGFyU2l6ZSA8IHNpemUpCisgICAgICBjb250aW51ZTsKKyAgICBzaXplX3QgaUNoYXIgPSAwOworICAgIHdoaWxlIChpQ2hhciA8IHNpemUpIHsKKyAgICAgIGlmIChjb2Rlc1tpQ2hhcl0gPCByYW5nZXNbc2VnXS5tX0xvd2VyW2lDaGFyXSB8fAorICAgICAgICAgIGNvZGVzW2lDaGFyXSA+IHJhbmdlc1tzZWddLm1fVXBwZXJbaUNoYXJdKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgKytpQ2hhcjsKKyAgICB9CisgICAgaWYgKGlDaGFyID09IHJhbmdlc1tzZWddLm1fQ2hhclNpemUpCisgICAgICByZXR1cm4gMjsKKyAgICBpZiAoaUNoYXIpCisgICAgICByZXR1cm4gKHNpemUgPT0gcmFuZ2VzW3NlZ10ubV9DaGFyU2l6ZSkgPyAyIDogMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc2l6ZV90IEdldEZvdXJCeXRlQ2hhclNpemVJbXBsKAorICAgIHVpbnQzMl90IGNoYXJjb2RlLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENQREZfQ01hcDo6Q29kZVJhbmdlPiYgcmFuZ2VzKSB7CisgIGlmIChyYW5nZXMuZW1wdHkoKSkKKyAgICByZXR1cm4gMTsKKworICB1aW50OF90IGNvZGVzWzRdOworICBjb2Rlc1swXSA9IGNvZGVzWzFdID0gMHgwMDsKKyAgY29kZXNbMl0gPSBzdGF0aWNfY2FzdDx1aW50OF90PihjaGFyY29kZSA+PiA4ICYgMHhGRik7CisgIGNvZGVzWzNdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY2hhcmNvZGUpOworICBmb3IgKHNpemVfdCBvZmZzZXQgPSAwOyBvZmZzZXQgPCA0OyBvZmZzZXQrKykgeworICAgIHNpemVfdCBzaXplID0gNCAtIG9mZnNldDsKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHJhbmdlcy5zaXplKCk7IGorKykgeworICAgICAgc2l6ZV90IGlTZWcgPSAocmFuZ2VzLnNpemUoKSAtIDEpIC0gajsKKyAgICAgIGlmIChyYW5nZXNbaVNlZ10ubV9DaGFyU2l6ZSA8IHNpemUpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgc2l6ZV90IGlDaGFyID0gMDsKKyAgICAgIHdoaWxlIChpQ2hhciA8IHNpemUpIHsKKyAgICAgICAgaWYgKGNvZGVzW29mZnNldCArIGlDaGFyXSA8IHJhbmdlc1tpU2VnXS5tX0xvd2VyW2lDaGFyXSB8fAorICAgICAgICAgICAgY29kZXNbb2Zmc2V0ICsgaUNoYXJdID4gcmFuZ2VzW2lTZWddLm1fVXBwZXJbaUNoYXJdKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKytpQ2hhcjsKKyAgICAgIH0KKyAgICAgIGlmIChpQ2hhciA9PSByYW5nZXNbaVNlZ10ubV9DaGFyU2l6ZSkKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQ1BERl9DTWFwOjpDUERGX0NNYXAoKQorICAgIDogbV9iTG9hZGVkKGZhbHNlKSwKKyAgICAgIG1fYlZlcnRpY2FsKGZhbHNlKSwKKyAgICAgIG1fQ2hhcnNldChDSURTRVRfVU5LTk9XTiksCisgICAgICBtX0NvZGluZ1NjaGVtZShUd29CeXRlcyksCisgICAgICBtX0NvZGluZyhDSURDT0RJTkdfVU5LTk9XTiksCisgICAgICBtX3BFbWJlZE1hcChudWxscHRyKSB7fQorCitDUERGX0NNYXA6On5DUERGX0NNYXAoKSB7fQorCit2b2lkIENQREZfQ01hcDo6TG9hZFByZWRlZmluZWQoQ1BERl9DTWFwTWFuYWdlciogcE1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBic05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUHJvbXB0Q0pLKSB7CisgIG1fUHJlZGVmaW5lZENNYXAgPSBic05hbWU7CisgIGlmIChtX1ByZWRlZmluZWRDTWFwID09ICJJZGVudGl0eS1IIiB8fCBtX1ByZWRlZmluZWRDTWFwID09ICJJZGVudGl0eS1WIikgeworICAgIG1fQ29kaW5nID0gQ0lEQ09ESU5HX0NJRDsKKyAgICBtX2JWZXJ0aWNhbCA9IGJzTmFtZS5MYXN0KCkgPT0gJ1YnOworICAgIG1fYkxvYWRlZCA9IHRydWU7CisgICAgcmV0dXJuOworICB9CisgIEJ5dGVTdHJpbmcgY21hcGlkID0gbV9QcmVkZWZpbmVkQ01hcDsKKyAgbV9iVmVydGljYWwgPSBjbWFwaWQuTGFzdCgpID09ICdWJzsKKyAgaWYgKGNtYXBpZC5HZXRMZW5ndGgoKSA+IDIpIHsKKyAgICBjbWFwaWQgPSBjbWFwaWQuTGVmdChjbWFwaWQuR2V0TGVuZ3RoKCkgLSAyKTsKKyAgfQorICBjb25zdCBQcmVkZWZpbmVkQ01hcCogbWFwID0gbnVsbHB0cjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZ19QcmVkZWZpbmVkQ01hcHMpOyArK2kpIHsKKyAgICBpZiAoY21hcGlkID09IEJ5dGVTdHJpbmdWaWV3KGdfUHJlZGVmaW5lZENNYXBzW2ldLm1fcE5hbWUpKSB7CisgICAgICBtYXAgPSAmZ19QcmVkZWZpbmVkQ01hcHNbaV07CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKCFtYXApCisgICAgcmV0dXJuOworCisgIG1fQ2hhcnNldCA9IG1hcC0+bV9DaGFyc2V0OworICBtX0NvZGluZyA9IG1hcC0+bV9Db2Rpbmc7CisgIG1fQ29kaW5nU2NoZW1lID0gbWFwLT5tX0NvZGluZ1NjaGVtZTsKKyAgaWYgKG1fQ29kaW5nU2NoZW1lID09IE1peGVkVHdvQnl0ZXMpIHsKKyAgICBtX01peGVkVHdvQnl0ZUxlYWRpbmdCeXRlcyA9IHN0ZDo6dmVjdG9yPGJvb2w+KDI1Nik7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1hcC0+bV9MZWFkaW5nU2VnQ291bnQ7ICsraSkgeworICAgICAgY29uc3QgQnl0ZVJhbmdlJiBzZWcgPSBtYXAtPm1fTGVhZGluZ1NlZ3NbaV07CisgICAgICBmb3IgKGludCBiID0gc2VnLm1fRmlyc3Q7IGIgPD0gc2VnLm1fTGFzdDsgKytiKQorICAgICAgICBtX01peGVkVHdvQnl0ZUxlYWRpbmdCeXRlc1tiXSA9IHRydWU7CisgICAgfQorICB9CisgIG1fcEVtYmVkTWFwID0gRlBERkFQSV9GaW5kRW1iZWRkZWRDTWFwKGJzTmFtZSwgbV9DaGFyc2V0LCBtX0NvZGluZyk7CisgIGlmICghbV9wRW1iZWRNYXApCisgICAgcmV0dXJuOworCisgIG1fYkxvYWRlZCA9IHRydWU7Cit9CisKK3ZvaWQgQ1BERl9DTWFwOjpMb2FkRW1iZWRkZWQoY29uc3QgdWludDhfdCogcERhdGEsIHVpbnQzMl90IHNpemUpIHsKKyAgbV9EaXJlY3RDaGFyY29kZVRvQ0lEVGFibGUgPSBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4oNjU1MzYpOworICBDUERGX0NNYXBQYXJzZXIgcGFyc2VyKHRoaXMpOworICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgocERhdGEsIHNpemUpOworICB3aGlsZSAoMSkgeworICAgIEJ5dGVTdHJpbmdWaWV3IHdvcmQgPSBzeW50YXguR2V0V29yZCgpOworICAgIGlmICh3b3JkLklzRW1wdHkoKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHBhcnNlci5QYXJzZVdvcmQod29yZCk7CisgIH0KKyAgaWYgKG1fQ29kaW5nU2NoZW1lID09IE1peGVkRm91ckJ5dGVzICYmIHBhcnNlci5IYXNBZGRpdGlvbmFsTWFwcGluZ3MoKSkgeworICAgIG1fQWRkaXRpb25hbENoYXJjb2RlVG9DSURNYXBwaW5ncyA9IHBhcnNlci5UYWtlQWRkaXRpb25hbE1hcHBpbmdzKCk7CisgICAgc3RkOjpzb3J0KAorICAgICAgICBtX0FkZGl0aW9uYWxDaGFyY29kZVRvQ0lETWFwcGluZ3MuYmVnaW4oKSwKKyAgICAgICAgbV9BZGRpdGlvbmFsQ2hhcmNvZGVUb0NJRE1hcHBpbmdzLmVuZCgpLAorICAgICAgICBbXShjb25zdCBDUERGX0NNYXA6OkNJRFJhbmdlJiBhcmcxLCBjb25zdCBDUERGX0NNYXA6OkNJRFJhbmdlJiBhcmcyKSB7CisgICAgICAgICAgcmV0dXJuIGFyZzEubV9FbmRDb2RlIDwgYXJnMi5tX0VuZENvZGU7CisgICAgICAgIH0pOworICB9Cit9CisKK3VpbnQxNl90IENQREZfQ01hcDo6Q0lERnJvbUNoYXJDb2RlKHVpbnQzMl90IGNoYXJjb2RlKSBjb25zdCB7CisgIGlmIChtX0NvZGluZyA9PSBDSURDT0RJTkdfQ0lEKQorICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTZfdD4oY2hhcmNvZGUpOworCisgIGlmIChtX3BFbWJlZE1hcCkKKyAgICByZXR1cm4gRlBERkFQSV9DSURGcm9tQ2hhckNvZGUobV9wRW1iZWRNYXAsIGNoYXJjb2RlKTsKKworICBpZiAobV9EaXJlY3RDaGFyY29kZVRvQ0lEVGFibGUuZW1wdHkoKSkKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGNoYXJjb2RlKTsKKworICBpZiAoY2hhcmNvZGUgPCAweDEwMDAwKQorICAgIHJldHVybiBtX0RpcmVjdENoYXJjb2RlVG9DSURUYWJsZVtjaGFyY29kZV07CisKKyAgYXV0byBpdCA9IHN0ZDo6bG93ZXJfYm91bmQobV9BZGRpdGlvbmFsQ2hhcmNvZGVUb0NJRE1hcHBpbmdzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQWRkaXRpb25hbENoYXJjb2RlVG9DSURNYXBwaW5ncy5lbmQoKSwgY2hhcmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IENQREZfQ01hcDo6Q0lEUmFuZ2UmIGFyZywgdWludDMyX3QgdmFsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFyZy5tX0VuZENvZGUgPCB2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICBpZiAoaXQgPT0gbV9BZGRpdGlvbmFsQ2hhcmNvZGVUb0NJRE1hcHBpbmdzLmVuZCgpIHx8CisgICAgICBpdC0+bV9TdGFydENvZGUgPiBjaGFyY29kZSkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBpdC0+bV9TdGFydENJRCArIGNoYXJjb2RlIC0gaXQtPm1fU3RhcnRDb2RlOworfQorCit1aW50MzJfdCBDUERGX0NNYXA6OkdldE5leHRDaGFyKGNvbnN0IGNoYXIqIHBTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU3RyTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG9mZnNldCkgY29uc3QgeworICBhdXRvKiBwQnl0ZXMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihwU3RyaW5nKTsKKyAgc3dpdGNoIChtX0NvZGluZ1NjaGVtZSkgeworICAgIGNhc2UgT25lQnl0ZTogeworICAgICAgcmV0dXJuIHBCeXRlc1tvZmZzZXQrK107CisgICAgfQorICAgIGNhc2UgVHdvQnl0ZXM6IHsKKyAgICAgIHVpbnQ4X3QgYnl0ZTEgPSBwQnl0ZXNbb2Zmc2V0KytdOworICAgICAgcmV0dXJuIDI1NiAqIGJ5dGUxICsgcEJ5dGVzW29mZnNldCsrXTsKKyAgICB9CisgICAgY2FzZSBNaXhlZFR3b0J5dGVzOiB7CisgICAgICB1aW50OF90IGJ5dGUxID0gcEJ5dGVzW29mZnNldCsrXTsKKyAgICAgIGlmICghbV9NaXhlZFR3b0J5dGVMZWFkaW5nQnl0ZXNbYnl0ZTFdKQorICAgICAgICByZXR1cm4gYnl0ZTE7CisgICAgICByZXR1cm4gMjU2ICogYnl0ZTEgKyBwQnl0ZXNbb2Zmc2V0KytdOworICAgIH0KKyAgICBjYXNlIE1peGVkRm91ckJ5dGVzOiB7CisgICAgICB1aW50OF90IGNvZGVzWzRdOworICAgICAgaW50IGNoYXJfc2l6ZSA9IDE7CisgICAgICBjb2Rlc1swXSA9IHBCeXRlc1tvZmZzZXQrK107CisgICAgICB3aGlsZSAoMSkgeworICAgICAgICBpbnQgcmV0ID0gQ2hlY2tGb3VyQnl0ZUNvZGVSYW5nZShjb2RlcywgY2hhcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX01peGVkRm91ckJ5dGVMZWFkaW5nUmFuZ2VzKTsKKyAgICAgICAgaWYgKHJldCA9PSAwKQorICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAocmV0ID09IDIpIHsKKyAgICAgICAgICB1aW50MzJfdCBjaGFyY29kZSA9IDA7CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFyX3NpemU7IGkrKykKKyAgICAgICAgICAgIGNoYXJjb2RlID0gKGNoYXJjb2RlIDw8IDgpICsgY29kZXNbaV07CisgICAgICAgICAgcmV0dXJuIGNoYXJjb2RlOworICAgICAgICB9CisgICAgICAgIGlmIChjaGFyX3NpemUgPT0gNCB8fCBvZmZzZXQgPT0gblN0ckxlbikKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY29kZXNbY2hhcl9zaXplKytdID0gcEJ5dGVzW29mZnNldCsrXTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IENQREZfQ01hcDo6R2V0Q2hhclNpemUodWludDMyX3QgY2hhcmNvZGUpIGNvbnN0IHsKKyAgc3dpdGNoIChtX0NvZGluZ1NjaGVtZSkgeworICAgIGNhc2UgT25lQnl0ZToKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgVHdvQnl0ZXM6CisgICAgICByZXR1cm4gMjsKKyAgICBjYXNlIE1peGVkVHdvQnl0ZXM6CisgICAgICBpZiAoY2hhcmNvZGUgPCAweDEwMCkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICByZXR1cm4gMjsKKyAgICBjYXNlIE1peGVkRm91ckJ5dGVzOgorICAgICAgaWYgKGNoYXJjb2RlIDwgMHgxMDApCisgICAgICAgIHJldHVybiAxOworICAgICAgaWYgKGNoYXJjb2RlIDwgMHgxMDAwMCkKKyAgICAgICAgcmV0dXJuIDI7CisgICAgICBpZiAoY2hhcmNvZGUgPCAweDEwMDAwMDApCisgICAgICAgIHJldHVybiAzOworICAgICAgcmV0dXJuIDQ7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBDUERGX0NNYXA6OkNvdW50Q2hhcihjb25zdCBjaGFyKiBwU3RyaW5nLCBpbnQgc2l6ZSkgY29uc3QgeworICBzd2l0Y2ggKG1fQ29kaW5nU2NoZW1lKSB7CisgICAgY2FzZSBPbmVCeXRlOgorICAgICAgcmV0dXJuIHNpemU7CisgICAgY2FzZSBUd29CeXRlczoKKyAgICAgIHJldHVybiAoc2l6ZSArIDEpIC8gMjsKKyAgICBjYXNlIE1peGVkVHdvQnl0ZXM6IHsKKyAgICAgIGludCBjb3VudCA9IDA7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBjb3VudCsrOworICAgICAgICBpZiAobV9NaXhlZFR3b0J5dGVMZWFkaW5nQnl0ZXNbcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oCisgICAgICAgICAgICAgICAgcFN0cmluZylbaV1dKSB7CisgICAgICAgICAgaSsrOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorICAgIGNhc2UgTWl4ZWRGb3VyQnl0ZXM6IHsKKyAgICAgIGludCBjb3VudCA9IDAsIG9mZnNldCA9IDA7CisgICAgICB3aGlsZSAob2Zmc2V0IDwgc2l6ZSkgeworICAgICAgICBHZXROZXh0Q2hhcihwU3RyaW5nLCBzaXplLCBvZmZzZXQpOworICAgICAgICBjb3VudCsrOworICAgICAgfQorICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKyAgfQorICByZXR1cm4gc2l6ZTsKK30KKworaW50IENQREZfQ01hcDo6QXBwZW5kQ2hhcihjaGFyKiBzdHIsIHVpbnQzMl90IGNoYXJjb2RlKSBjb25zdCB7CisgIHN3aXRjaCAobV9Db2RpbmdTY2hlbWUpIHsKKyAgICBjYXNlIE9uZUJ5dGU6CisgICAgICBzdHJbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPihjaGFyY29kZSk7CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIFR3b0J5dGVzOgorICAgICAgc3RyWzBdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oY2hhcmNvZGUgLyAyNTYpOworICAgICAgc3RyWzFdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oY2hhcmNvZGUgJSAyNTYpOworICAgICAgcmV0dXJuIDI7CisgICAgY2FzZSBNaXhlZFR3b0J5dGVzOgorICAgICAgaWYgKGNoYXJjb2RlIDwgMHgxMDAgJiYgIW1fTWl4ZWRUd29CeXRlTGVhZGluZ0J5dGVzW2NoYXJjb2RlXSkgeworICAgICAgICBzdHJbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPihjaGFyY29kZSk7CisgICAgICAgIHJldHVybiAxOworICAgICAgfQorICAgICAgc3RyWzBdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oY2hhcmNvZGUgPj4gOCk7CisgICAgICBzdHJbMV0gPSBzdGF0aWNfY2FzdDxjaGFyPihjaGFyY29kZSk7CisgICAgICByZXR1cm4gMjsKKyAgICBjYXNlIE1peGVkRm91ckJ5dGVzOgorICAgICAgaWYgKGNoYXJjb2RlIDwgMHgxMDApIHsKKyAgICAgICAgaW50IGlTaXplID0gc3RhdGljX2Nhc3Q8aW50PigKKyAgICAgICAgICAgIEdldEZvdXJCeXRlQ2hhclNpemVJbXBsKGNoYXJjb2RlLCBtX01peGVkRm91ckJ5dGVMZWFkaW5nUmFuZ2VzKSk7CisgICAgICAgIGlmIChpU2l6ZSA9PSAwKQorICAgICAgICAgIGlTaXplID0gMTsKKyAgICAgICAgc3RyW2lTaXplIC0gMV0gPSBzdGF0aWNfY2FzdDxjaGFyPihjaGFyY29kZSk7CisgICAgICAgIGlmIChpU2l6ZSA+IDEpCisgICAgICAgICAgbWVtc2V0KHN0ciwgMCwgaVNpemUgLSAxKTsKKyAgICAgICAgcmV0dXJuIGlTaXplOworICAgICAgfQorICAgICAgaWYgKGNoYXJjb2RlIDwgMHgxMDAwMCkgeworICAgICAgICBzdHJbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPihjaGFyY29kZSA+PiA4KTsKKyAgICAgICAgc3RyWzFdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oY2hhcmNvZGUpOworICAgICAgICByZXR1cm4gMjsKKyAgICAgIH0KKyAgICAgIGlmIChjaGFyY29kZSA8IDB4MTAwMDAwMCkgeworICAgICAgICBzdHJbMF0gPSBzdGF0aWNfY2FzdDxjaGFyPihjaGFyY29kZSA+PiAxNik7CisgICAgICAgIHN0clsxXSA9IHN0YXRpY19jYXN0PGNoYXI+KGNoYXJjb2RlID4+IDgpOworICAgICAgICBzdHJbMl0gPSBzdGF0aWNfY2FzdDxjaGFyPihjaGFyY29kZSk7CisgICAgICAgIHJldHVybiAzOworICAgICAgfQorICAgICAgc3RyWzBdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oY2hhcmNvZGUgPj4gMjQpOworICAgICAgc3RyWzFdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oY2hhcmNvZGUgPj4gMTYpOworICAgICAgc3RyWzJdID0gc3RhdGljX2Nhc3Q8Y2hhcj4oY2hhcmNvZGUgPj4gOCk7CisgICAgICBzdHJbM10gPSBzdGF0aWNfY2FzdDxjaGFyPihjaGFyY29kZSk7CisgICAgICByZXR1cm4gNDsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfY21hcC5oIGIvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhNzcyOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfY21hcC5oCkBAIC0wLDAgKzEsMTAzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GUERGQVBJX0ZPTlRfQ1BERl9DTUFQX0hfCisjZGVmaW5lIENPUkVfRlBERkFQSV9GT05UX0NQREZfQ01BUF9IXworCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jaWRmb250LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisKK2NsYXNzIENQREZfQ01hcE1hbmFnZXI7CitzdHJ1Y3QgRlhDTUFQX0NNYXA7CisKK2VudW0gQ0lEQ29kaW5nIDogdWludDhfdCB7CisgIENJRENPRElOR19VTktOT1dOID0gMCwKKyAgQ0lEQ09ESU5HX0dCLAorICBDSURDT0RJTkdfQklHNSwKKyAgQ0lEQ09ESU5HX0pJUywKKyAgQ0lEQ09ESU5HX0tPUkVBLAorICBDSURDT0RJTkdfVUNTMiwKKyAgQ0lEQ09ESU5HX0NJRCwKKyAgQ0lEQ09ESU5HX1VURjE2LAorfTsKKworY2xhc3MgQ1BERl9DTWFwIDogcHVibGljIFJldGFpbmFibGUgeworIHB1YmxpYzoKKyAgZW51bSBDb2RpbmdTY2hlbWUgOiB1aW50OF90IHsKKyAgICBPbmVCeXRlLAorICAgIFR3b0J5dGVzLAorICAgIE1peGVkVHdvQnl0ZXMsCisgICAgTWl4ZWRGb3VyQnl0ZXMKKyAgfTsKKworICBzdHJ1Y3QgQ29kZVJhbmdlIHsKKyAgICBzaXplX3QgbV9DaGFyU2l6ZTsKKyAgICB1aW50OF90IG1fTG93ZXJbNF07CisgICAgdWludDhfdCBtX1VwcGVyWzRdOworICB9OworCisgIHN0cnVjdCBDSURSYW5nZSB7CisgICAgdWludDMyX3QgbV9TdGFydENvZGU7CisgICAgdWludDMyX3QgbV9FbmRDb2RlOworICAgIHVpbnQxNl90IG1fU3RhcnRDSUQ7CisgIH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3M+CisgIGZyaWVuZCBSZXRhaW5QdHI8VD4gcGRmaXVtOjpNYWtlUmV0YWluKEFyZ3MmJi4uLiBhcmdzKTsKKworICB2b2lkIExvYWRQcmVkZWZpbmVkKENQREZfQ01hcE1hbmFnZXIqIHBNZ3IsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJQcm9tcHRDSkspOworICB2b2lkIExvYWRFbWJlZGRlZChjb25zdCB1aW50OF90KiBwRGF0YSwgdWludDMyX3QgZHdTaXplKTsKKworICBib29sIElzTG9hZGVkKCkgY29uc3QgeyByZXR1cm4gbV9iTG9hZGVkOyB9CisgIGJvb2wgSXNWZXJ0V3JpdGluZygpIGNvbnN0IHsgcmV0dXJuIG1fYlZlcnRpY2FsOyB9CisKKyAgdWludDE2X3QgQ0lERnJvbUNoYXJDb2RlKHVpbnQzMl90IGNoYXJjb2RlKSBjb25zdDsKKworICBpbnQgR2V0Q2hhclNpemUodWludDMyX3QgY2hhcmNvZGUpIGNvbnN0OworICB1aW50MzJfdCBHZXROZXh0Q2hhcihjb25zdCBjaGFyKiBwU3RyaW5nLCBpbnQgblN0ckxlbiwgaW50JiBvZmZzZXQpIGNvbnN0OworICBpbnQgQ291bnRDaGFyKGNvbnN0IGNoYXIqIHBTdHJpbmcsIGludCBzaXplKSBjb25zdDsKKyAgaW50IEFwcGVuZENoYXIoY2hhciogc3RyLCB1aW50MzJfdCBjaGFyY29kZSkgY29uc3Q7CisKKyAgdm9pZCBTZXRWZXJ0aWNhbChib29sIHZlcnQpIHsgbV9iVmVydGljYWwgPSB2ZXJ0OyB9CisgIHZvaWQgU2V0Q29kaW5nU2NoZW1lKENvZGluZ1NjaGVtZSBzY2hlbWUpIHsgbV9Db2RpbmdTY2hlbWUgPSBzY2hlbWU7IH0KKyAgdm9pZCBTZXRNaXhlZEZvdXJCeXRlTGVhZGluZ1JhbmdlcyhzdGQ6OnZlY3RvcjxDb2RlUmFuZ2U+IHJhbmdlKSB7CisgICAgbV9NaXhlZEZvdXJCeXRlTGVhZGluZ1JhbmdlcyA9IHJhbmdlOworICB9CisKKyAgaW50IEdldENvZGluZygpIGNvbnN0IHsgcmV0dXJuIG1fQ29kaW5nOyB9CisgIGNvbnN0IEZYQ01BUF9DTWFwKiBHZXRFbWJlZE1hcCgpIGNvbnN0IHsgcmV0dXJuIG1fcEVtYmVkTWFwOyB9CisgIENJRFNldCBHZXRDaGFyc2V0KCkgY29uc3QgeyByZXR1cm4gbV9DaGFyc2V0OyB9CisgIHZvaWQgU2V0Q2hhcnNldChDSURTZXQgc2V0KSB7IG1fQ2hhcnNldCA9IHNldDsgfQorCisgIHZvaWQgU2V0RGlyZWN0Q2hhcmNvZGVUb0NJRFRhYmxlKHNpemVfdCBpZHgsIHVpbnQxNl90IHZhbCkgeworICAgIG1fRGlyZWN0Q2hhcmNvZGVUb0NJRFRhYmxlW2lkeF0gPSB2YWw7CisgIH0KKyAgYm9vbCBJc0RpcmVjdENoYXJjb2RlVG9DSURUYWJsZUlzRW1wdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fRGlyZWN0Q2hhcmNvZGVUb0NJRFRhYmxlLmVtcHR5KCk7CisgIH0KKworIHByaXZhdGU6CisgIENQREZfQ01hcCgpOworICB+Q1BERl9DTWFwKCkgb3ZlcnJpZGU7CisKKyAgQnl0ZVN0cmluZyBtX1ByZWRlZmluZWRDTWFwOworICBib29sIG1fYkxvYWRlZDsKKyAgYm9vbCBtX2JWZXJ0aWNhbDsKKyAgQ0lEU2V0IG1fQ2hhcnNldDsKKyAgQ29kaW5nU2NoZW1lIG1fQ29kaW5nU2NoZW1lOworICBpbnQgbV9Db2Rpbmc7CisgIHN0ZDo6dmVjdG9yPGJvb2w+IG1fTWl4ZWRUd29CeXRlTGVhZGluZ0J5dGVzOworICBzdGQ6OnZlY3RvcjxDb2RlUmFuZ2U+IG1fTWl4ZWRGb3VyQnl0ZUxlYWRpbmdSYW5nZXM7CisgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBtX0RpcmVjdENoYXJjb2RlVG9DSURUYWJsZTsKKyAgc3RkOjp2ZWN0b3I8Q0lEUmFuZ2U+IG1fQWRkaXRpb25hbENoYXJjb2RlVG9DSURNYXBwaW5nczsKKyAgY29uc3QgRlhDTUFQX0NNYXAqIG1fcEVtYmVkTWFwOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfRk9OVF9DUERGX0NNQVBfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfY21hcG1hbmFnZXIuY3BwIGIvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jbWFwbWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMxODNhZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfY21hcG1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfY21hcG1hbmFnZXIuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NpZDJ1bmljb2RlbWFwLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jbWFwLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorCitDUERGX0NNYXBNYW5hZ2VyOjpDUERGX0NNYXBNYW5hZ2VyKCkge30KKworQ1BERl9DTWFwTWFuYWdlcjo6fkNQREZfQ01hcE1hbmFnZXIoKSB7fQorCitSZXRhaW5QdHI8Q1BERl9DTWFwPiBDUERGX0NNYXBNYW5hZ2VyOjpHZXRQcmVkZWZpbmVkQ01hcChjb25zdCBCeXRlU3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUHJvbXB0Q0pLKSB7CisgIGF1dG8gaXQgPSBtX0NNYXBzLmZpbmQobmFtZSk7CisgIGlmIChpdCAhPSBtX0NNYXBzLmVuZCgpKQorICAgIHJldHVybiBpdC0+c2Vjb25kOworCisgIFJldGFpblB0cjxDUERGX0NNYXA+IHBDTWFwID0gTG9hZFByZWRlZmluZWRDTWFwKG5hbWUsIGJQcm9tcHRDSkspOworICBpZiAoIW5hbWUuSXNFbXB0eSgpKQorICAgIG1fQ01hcHNbbmFtZV0gPSBwQ01hcDsKKworICByZXR1cm4gcENNYXA7Cit9CisKK1JldGFpblB0cjxDUERGX0NNYXA+IENQREZfQ01hcE1hbmFnZXI6OkxvYWRQcmVkZWZpbmVkQ01hcCgKKyAgICBjb25zdCBCeXRlU3RyaW5nJiBuYW1lLAorICAgIGJvb2wgYlByb21wdENKSykgeworICBjb25zdCBjaGFyKiBwbmFtZSA9IG5hbWUuY19zdHIoKTsKKyAgaWYgKCpwbmFtZSA9PSAnLycpCisgICAgcG5hbWUrKzsKKworICBhdXRvIHBDTWFwID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfQ01hcD4oKTsKKyAgcENNYXAtPkxvYWRQcmVkZWZpbmVkKHRoaXMsIHBuYW1lLCBiUHJvbXB0Q0pLKTsKKyAgcmV0dXJuIHBDTWFwOworfQorCitDUERGX0NJRDJVbmljb2RlTWFwKiBDUERGX0NNYXBNYW5hZ2VyOjpHZXRDSUQyVW5pY29kZU1hcChDSURTZXQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlByb21wdENKSykgeworICBpZiAoIW1fQ0lEMlVuaWNvZGVNYXBzW2NoYXJzZXRdKQorICAgIG1fQ0lEMlVuaWNvZGVNYXBzW2NoYXJzZXRdID0gTG9hZENJRDJVbmljb2RlTWFwKGNoYXJzZXQsIGJQcm9tcHRDSkspOworCisgIHJldHVybiBtX0NJRDJVbmljb2RlTWFwc1tjaGFyc2V0XS5nZXQoKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPENQREZfQ0lEMlVuaWNvZGVNYXA+IENQREZfQ01hcE1hbmFnZXI6OkxvYWRDSUQyVW5pY29kZU1hcCgKKyAgICBDSURTZXQgY2hhcnNldCwKKyAgICBib29sIGJQcm9tcHRDSkspIHsKKyAgYXV0byBwTWFwID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfQ0lEMlVuaWNvZGVNYXA+KCk7CisgIHBNYXAtPkxvYWQodGhpcywgY2hhcnNldCwgYlByb21wdENKSyk7CisgIHJldHVybiBwTWFwOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jbWFwbWFuYWdlci5oIGIvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jbWFwbWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4OWViM2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NtYXBtYW5hZ2VyLmgKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlBERkFQSV9GT05UX0NQREZfQ01BUE1BTkFHRVJfSF8KKyNkZWZpbmUgQ09SRV9GUERGQVBJX0ZPTlRfQ1BERl9DTUFQTUFOQUdFUl9IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfY2lkZm9udC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvYnl0ZXN0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgorCitjbGFzcyBDUERGX0NNYXBNYW5hZ2VyIHsKKyBwdWJsaWM6CisgIENQREZfQ01hcE1hbmFnZXIoKTsKKyAgfkNQREZfQ01hcE1hbmFnZXIoKTsKKworICBSZXRhaW5QdHI8Q1BERl9DTWFwPiBHZXRQcmVkZWZpbmVkQ01hcChjb25zdCBCeXRlU3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJQcm9tcHRDSkspOworICBDUERGX0NJRDJVbmljb2RlTWFwKiBHZXRDSUQyVW5pY29kZU1hcChDSURTZXQgY2hhcnNldCwgYm9vbCBiUHJvbXB0Q0pLKTsKKworIHByaXZhdGU6CisgIFJldGFpblB0cjxDUERGX0NNYXA+IExvYWRQcmVkZWZpbmVkQ01hcChjb25zdCBCeXRlU3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUHJvbXB0Q0pLKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfQ0lEMlVuaWNvZGVNYXA+IExvYWRDSUQyVW5pY29kZU1hcChDSURTZXQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJQcm9tcHRDSkspOworCisgIHN0ZDo6bWFwPEJ5dGVTdHJpbmcsIFJldGFpblB0cjxDUERGX0NNYXA+PiBtX0NNYXBzOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9DSUQyVW5pY29kZU1hcD4gbV9DSUQyVW5pY29kZU1hcHNbNl07Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9GT05UX0NQREZfQ01BUE1BTkFHRVJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfY21hcHBhcnNlci5jcHAgYi9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NtYXBwYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ODQ0OGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NtYXBwYXJzZXIuY3BwCkBAIC0wLDAgKzEsMTk5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NtYXBwYXJzZXIuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9jbWFwcy9jbWFwX2ludC5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9jcGRmX21vZHVsZW1nci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW1vZHVsZS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3NpbXBsZV9wYXJzZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mcmVldHlwZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBjaGFyKiBjb25zdCBnX0NoYXJzZXROYW1lc1tDSURTRVRfTlVNX1NFVFNdID0ge251bGxwdHIsICAiR0IxIiwgICAgIkNOUzEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSmFwYW4xIiwgIktvcmVhMSIsICJVQ1MifTsKKworQ0lEU2V0IENJRFNldEZyb21TaXplVChzaXplX3QgaW5kZXgpIHsKKyAgaWYgKGluZGV4ID49IENJRFNFVF9OVU1fU0VUUykgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gQ0lEU0VUX1VOS05PV047CisgIH0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PENJRFNldD4oaW5kZXgpOworfQorCitCeXRlU3RyaW5nVmlldyBDTWFwX0dldFN0cmluZyhjb25zdCBCeXRlU3RyaW5nVmlldyYgd29yZCkgeworICBpZiAod29yZC5HZXRMZW5ndGgoKSA8PSAyKQorICAgIHJldHVybiBCeXRlU3RyaW5nVmlldygpOworICByZXR1cm4gd29yZC5SaWdodCh3b3JkLkdldExlbmd0aCgpIC0gMik7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitDUERGX0NNYXBQYXJzZXI6OkNQREZfQ01hcFBhcnNlcihDUERGX0NNYXAqIHBDTWFwKQorICAgIDogbV9wQ01hcChwQ01hcCksIG1fU3RhdHVzKDApLCBtX0NvZGVTZXEoMCkge30KKworQ1BERl9DTWFwUGFyc2VyOjp+Q1BERl9DTWFwUGFyc2VyKCkge30KKwordm9pZCBDUERGX0NNYXBQYXJzZXI6OlBhcnNlV29yZChjb25zdCBCeXRlU3RyaW5nVmlldyYgd29yZCkgeworICBpZiAod29yZC5Jc0VtcHR5KCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHdvcmQgPT0gImJlZ2luY2lkY2hhciIpIHsKKyAgICBtX1N0YXR1cyA9IDE7CisgICAgbV9Db2RlU2VxID0gMDsKKyAgfSBlbHNlIGlmICh3b3JkID09ICJiZWdpbmNpZHJhbmdlIikgeworICAgIG1fU3RhdHVzID0gMjsKKyAgICBtX0NvZGVTZXEgPSAwOworICB9IGVsc2UgaWYgKHdvcmQgPT0gImVuZGNpZHJhbmdlIiB8fCB3b3JkID09ICJlbmRjaWRjaGFyIikgeworICAgIG1fU3RhdHVzID0gMDsKKyAgfSBlbHNlIGlmICh3b3JkID09ICIvV01vZGUiKSB7CisgICAgbV9TdGF0dXMgPSA2OworICB9IGVsc2UgaWYgKHdvcmQgPT0gIi9SZWdpc3RyeSIpIHsKKyAgICBtX1N0YXR1cyA9IDM7CisgIH0gZWxzZSBpZiAod29yZCA9PSAiL09yZGVyaW5nIikgeworICAgIG1fU3RhdHVzID0gNDsKKyAgfSBlbHNlIGlmICh3b3JkID09ICIvU3VwcGxlbWVudCIpIHsKKyAgICBtX1N0YXR1cyA9IDU7CisgIH0gZWxzZSBpZiAod29yZCA9PSAiYmVnaW5jb2Rlc3BhY2VyYW5nZSIpIHsKKyAgICBtX1N0YXR1cyA9IDc7CisgICAgbV9Db2RlU2VxID0gMDsKKyAgfSBlbHNlIGlmICh3b3JkID09ICJ1c2VjbWFwIikgeworICB9IGVsc2UgaWYgKG1fU3RhdHVzID09IDEgfHwgbV9TdGF0dXMgPT0gMikgeworICAgIG1fQ29kZVBvaW50c1ttX0NvZGVTZXFdID0gR2V0Q29kZSh3b3JkKTsKKyAgICBtX0NvZGVTZXErKzsKKyAgICB1aW50MzJfdCBTdGFydENvZGUsIEVuZENvZGU7CisgICAgdWludDE2X3QgU3RhcnRDSUQ7CisgICAgaWYgKG1fU3RhdHVzID09IDEpIHsKKyAgICAgIGlmIChtX0NvZGVTZXEgPCAyKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIEVuZENvZGUgPSBTdGFydENvZGUgPSBtX0NvZGVQb2ludHNbMF07CisgICAgICBTdGFydENJRCA9ICh1aW50MTZfdCltX0NvZGVQb2ludHNbMV07CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX0NvZGVTZXEgPCAzKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIFN0YXJ0Q29kZSA9IG1fQ29kZVBvaW50c1swXTsKKyAgICAgIEVuZENvZGUgPSBtX0NvZGVQb2ludHNbMV07CisgICAgICBTdGFydENJRCA9ICh1aW50MTZfdCltX0NvZGVQb2ludHNbMl07CisgICAgfQorICAgIGlmIChFbmRDb2RlIDwgMHgxMDAwMCkgeworICAgICAgZm9yICh1aW50MzJfdCBjb2RlID0gU3RhcnRDb2RlOyBjb2RlIDw9IEVuZENvZGU7IGNvZGUrKykgeworICAgICAgICBtX3BDTWFwLT5TZXREaXJlY3RDaGFyY29kZVRvQ0lEVGFibGUoCisgICAgICAgICAgICBjb2RlLCBzdGF0aWNfY2FzdDx1aW50MTZfdD4oU3RhcnRDSUQgKyBjb2RlIC0gU3RhcnRDb2RlKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG1fQWRkaXRpb25hbENoYXJjb2RlVG9DSURNYXBwaW5ncy5wdXNoX2JhY2soCisgICAgICAgICAge1N0YXJ0Q29kZSwgRW5kQ29kZSwgU3RhcnRDSUR9KTsKKyAgICB9CisgICAgbV9Db2RlU2VxID0gMDsKKyAgfSBlbHNlIGlmIChtX1N0YXR1cyA9PSAzKSB7CisgICAgbV9TdGF0dXMgPSAwOworICB9IGVsc2UgaWYgKG1fU3RhdHVzID09IDQpIHsKKyAgICBtX3BDTWFwLT5TZXRDaGFyc2V0KENoYXJzZXRGcm9tT3JkZXJpbmcoQ01hcF9HZXRTdHJpbmcod29yZCkpKTsKKyAgICBtX1N0YXR1cyA9IDA7CisgIH0gZWxzZSBpZiAobV9TdGF0dXMgPT0gNSkgeworICAgIG1fU3RhdHVzID0gMDsKKyAgfSBlbHNlIGlmIChtX1N0YXR1cyA9PSA2KSB7CisgICAgbV9wQ01hcC0+U2V0VmVydGljYWwoR2V0Q29kZSh3b3JkKSAhPSAwKTsKKyAgICBtX1N0YXR1cyA9IDA7CisgIH0gZWxzZSBpZiAobV9TdGF0dXMgPT0gNykgeworICAgIGlmICh3b3JkID09ICJlbmRjb2Rlc3BhY2VyYW5nZSIpIHsKKyAgICAgIHNpemVfdCBuU2VncyA9IG1fQ29kZVJhbmdlcy5zaXplKCk7CisgICAgICBpZiAoblNlZ3MgPT0gMSkgeworICAgICAgICBtX3BDTWFwLT5TZXRDb2RpbmdTY2hlbWUoKG1fQ29kZVJhbmdlc1swXS5tX0NoYXJTaXplID09IDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDUERGX0NNYXA6OlR3b0J5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDUERGX0NNYXA6Ok9uZUJ5dGUpOworICAgICAgfSBlbHNlIGlmIChuU2VncyA+IDEpIHsKKyAgICAgICAgbV9wQ01hcC0+U2V0Q29kaW5nU2NoZW1lKENQREZfQ01hcDo6TWl4ZWRGb3VyQnl0ZXMpOworICAgICAgICBtX3BDTWFwLT5TZXRNaXhlZEZvdXJCeXRlTGVhZGluZ1JhbmdlcyhtX0NvZGVSYW5nZXMpOworICAgICAgfQorICAgICAgbV9TdGF0dXMgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBpZiAod29yZC5HZXRMZW5ndGgoKSA9PSAwIHx8IHdvcmRbMF0gIT0gJzwnKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmIChtX0NvZGVTZXEgJSAyKSB7CisgICAgICAgIENQREZfQ01hcDo6Q29kZVJhbmdlIHJhbmdlOworICAgICAgICBpZiAoR2V0Q29kZVJhbmdlKHJhbmdlLCBtX0xhc3RXb3JkLkFzU3RyaW5nVmlldygpLCB3b3JkKSkKKyAgICAgICAgICBtX0NvZGVSYW5nZXMucHVzaF9iYWNrKHJhbmdlKTsKKyAgICAgIH0KKyAgICAgIG1fQ29kZVNlcSsrOworICAgIH0KKyAgfQorICBtX0xhc3RXb3JkID0gd29yZDsKK30KKwordWludDMyX3QgQ1BERl9DTWFwUGFyc2VyOjpHZXRDb2RlKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiB3b3JkKSBjb25zdCB7CisgIGlmICh3b3JkLklzRW1wdHkoKSkKKyAgICByZXR1cm4gMDsKKworICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPHVpbnQzMl90PiBudW0gPSAwOworICBpZiAod29yZFswXSA9PSAnPCcpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHdvcmQuR2V0TGVuZ3RoKCkgJiYgc3RkOjppc3hkaWdpdCh3b3JkW2ldKTsgKytpKSB7CisgICAgICBudW0gPSBudW0gKiAxNiArIEZYU1lTX0hleENoYXJUb0ludCh3b3JkW2ldKTsKKyAgICAgIGlmICghbnVtLklzVmFsaWQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBudW0uVmFsdWVPckRpZSgpOworICB9CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB3b3JkLkdldExlbmd0aCgpICYmIHN0ZDo6aXNkaWdpdCh3b3JkW2ldKTsgKytpKSB7CisgICAgbnVtID0gbnVtICogMTAgKyBGWFNZU19EZWNpbWFsQ2hhclRvSW50KHN0YXRpY19jYXN0PHdjaGFyX3Q+KHdvcmRbaV0pKTsKKyAgICBpZiAoIW51bS5Jc1ZhbGlkKCkpCisgICAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gbnVtLlZhbHVlT3JEaWUoKTsKK30KKworYm9vbCBDUERGX0NNYXBQYXJzZXI6OkdldENvZGVSYW5nZShDUERGX0NNYXA6OkNvZGVSYW5nZSYgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBmaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHNlY29uZCkgY29uc3QgeworICBpZiAoZmlyc3QuR2V0TGVuZ3RoKCkgPT0gMCB8fCBmaXJzdFswXSAhPSAnPCcpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHNpemVfdCBpOworICBmb3IgKGkgPSAxOyBpIDwgZmlyc3QuR2V0TGVuZ3RoKCk7ICsraSkgeworICAgIGlmIChmaXJzdFtpXSA9PSAnPicpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByYW5nZS5tX0NoYXJTaXplID0gKGkgLSAxKSAvIDI7CisgIGlmIChyYW5nZS5tX0NoYXJTaXplID4gNCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yIChpID0gMDsgaSA8IHJhbmdlLm1fQ2hhclNpemU7ICsraSkgeworICAgIHVpbnQ4X3QgZGlnaXQxID0gZmlyc3RbaSAqIDIgKyAxXTsKKyAgICB1aW50OF90IGRpZ2l0MiA9IGZpcnN0W2kgKiAyICsgMl07CisgICAgcmFuZ2UubV9Mb3dlcltpXSA9CisgICAgICAgIEZYU1lTX0hleENoYXJUb0ludChkaWdpdDEpICogMTYgKyBGWFNZU19IZXhDaGFyVG9JbnQoZGlnaXQyKTsKKyAgfQorCisgIHNpemVfdCBzaXplID0gc2Vjb25kLkdldExlbmd0aCgpOworICBmb3IgKGkgPSAwOyBpIDwgcmFuZ2UubV9DaGFyU2l6ZTsgKytpKSB7CisgICAgdWludDhfdCBkaWdpdDEgPSAoaSAqIDIgKyAxIDwgc2l6ZSkgPyBzZWNvbmRbaSAqIDIgKyAxXSA6ICcwJzsKKyAgICB1aW50OF90IGRpZ2l0MiA9IChpICogMiArIDIgPCBzaXplKSA/IHNlY29uZFtpICogMiArIDJdIDogJzAnOworICAgIHJhbmdlLm1fVXBwZXJbaV0gPQorICAgICAgICBGWFNZU19IZXhDaGFyVG9JbnQoZGlnaXQxKSAqIDE2ICsgRlhTWVNfSGV4Q2hhclRvSW50KGRpZ2l0Mik7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHN0YXRpYworQ0lEU2V0IENQREZfQ01hcFBhcnNlcjo6Q2hhcnNldEZyb21PcmRlcmluZyhjb25zdCBCeXRlU3RyaW5nVmlldyYgb3JkZXJpbmcpIHsKKyAgZm9yIChzaXplX3QgY2hhcnNldCA9IDE7IGNoYXJzZXQgPCBGWF9BcnJheVNpemUoZ19DaGFyc2V0TmFtZXMpOyArK2NoYXJzZXQpIHsKKyAgICBpZiAob3JkZXJpbmcgPT0gZ19DaGFyc2V0TmFtZXNbY2hhcnNldF0pCisgICAgICByZXR1cm4gQ0lEU2V0RnJvbVNpemVUKGNoYXJzZXQpOworICB9CisgIHJldHVybiBDSURTRVRfVU5LTk9XTjsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfY21hcHBhcnNlci5oIGIvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jbWFwcGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM0NmM1OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfY21hcHBhcnNlci5oCkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZQREZBUElfRk9OVF9DUERGX0NNQVBQQVJTRVJfSF8KKyNkZWZpbmUgQ09SRV9GUERGQVBJX0ZPTlRfQ1BERl9DTUFQUEFSU0VSX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NpZGZvbnQuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NtYXAuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisKK2NsYXNzIENQREZfQ01hcFBhcnNlciB7CisgcHVibGljOgorICBleHBsaWNpdCBDUERGX0NNYXBQYXJzZXIoQ1BERl9DTWFwKiBwTWFwKTsKKyAgfkNQREZfQ01hcFBhcnNlcigpOworCisgIHZvaWQgUGFyc2VXb3JkKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIpOworICBib29sIEhhc0FkZGl0aW9uYWxNYXBwaW5ncygpIGNvbnN0IHsKKyAgICByZXR1cm4gIW1fQWRkaXRpb25hbENoYXJjb2RlVG9DSURNYXBwaW5ncy5lbXB0eSgpOworICB9CisgIHN0ZDo6dmVjdG9yPENQREZfQ01hcDo6Q0lEUmFuZ2U+IFRha2VBZGRpdGlvbmFsTWFwcGluZ3MoKSB7CisgICAgcmV0dXJuIHN0ZDo6bW92ZShtX0FkZGl0aW9uYWxDaGFyY29kZVRvQ0lETWFwcGluZ3MpOworICB9CisKKyAgdWludDMyX3QgR2V0Q29kZShjb25zdCBCeXRlU3RyaW5nVmlldyYgd29yZCkgY29uc3Q7CisgIGJvb2wgR2V0Q29kZVJhbmdlKENQREZfQ01hcDo6Q29kZVJhbmdlJiByYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGZpcnN0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc2Vjb25kKSBjb25zdDsKKworICBzdGF0aWMgQ0lEU2V0IENoYXJzZXRGcm9tT3JkZXJpbmcoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIG9yZGVyaW5nKTsKKworIHByaXZhdGU6CisKKyAgVW5vd25lZFB0cjxDUERGX0NNYXA+IGNvbnN0IG1fcENNYXA7CisgIGludCBtX1N0YXR1czsKKyAgaW50IG1fQ29kZVNlcTsKKyAgdWludDMyX3QgbV9Db2RlUG9pbnRzWzRdOworICBzdGQ6OnZlY3RvcjxDUERGX0NNYXA6OkNvZGVSYW5nZT4gbV9Db2RlUmFuZ2VzOworICBzdGQ6OnZlY3RvcjxDUERGX0NNYXA6OkNJRFJhbmdlPiBtX0FkZGl0aW9uYWxDaGFyY29kZVRvQ0lETWFwcGluZ3M7CisgIEJ5dGVTdHJpbmcgbV9MYXN0V29yZDsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GUERGQVBJX0ZPTlRfQ1BERl9DTUFQUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NtYXBwYXJzZXJfdW5pdHRlc3QuY3BwIGIvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jbWFwcGFyc2VyX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTM2ZWI3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jbWFwcGFyc2VyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDczIEBACisvLyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NtYXBwYXJzZXIuaCIKKworI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworCitib29sIHVpbnRfcmFuZ2VzX2VxdWFsKHVpbnQ4X3QqIGEsIHVpbnQ4X3QqIGIsIHNpemVfdCBjb3VudCkgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICBpZiAoYVtpXSAhPSBiW2ldKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVChjcGRmX2NtYXBwYXJzZXIsIEdldENvZGUpIHsKKyAgQ1BERl9DTWFwUGFyc2VyIHBhcnNlcihudWxscHRyKTsKKworICBFWFBFQ1RfRVEoMHUsIHBhcnNlci5HZXRDb2RlKCIiKSk7CisgIEVYUEVDVF9FUSgwdSwgcGFyc2VyLkdldENvZGUoIjwiKSk7CisgIEVYUEVDVF9FUSgxOTR1LCBwYXJzZXIuR2V0Q29kZSgiPGMyIikpOworICBFWFBFQ1RfRVEoMTYydSwgcGFyc2VyLkdldENvZGUoIjxBMiIpKTsKKyAgRVhQRUNUX0VRKDI4MDJ1LCBwYXJzZXIuR2V0Q29kZSgiPEFmMiIpKTsKKyAgRVhQRUNUX0VRKDE2MnUsIHBhcnNlci5HZXRDb2RlKCI8QTJ6IikpOworCisgIEVYUEVDVF9FUSgxMnUsIHBhcnNlci5HZXRDb2RlKCIxMiIpKTsKKyAgRVhQRUNUX0VRKDEydSwgcGFyc2VyLkdldENvZGUoIjEyZCIpKTsKKyAgRVhQRUNUX0VRKDEyOHUsIHBhcnNlci5HZXRDb2RlKCIxMjgiKSk7CisKKyAgRVhQRUNUX0VRKDQyOTQ5NjcyOTV1LCBwYXJzZXIuR2V0Q29kZSgiPEZGRkZGRkZGIikpOworCisgIC8vIE92ZXJmbG93IGEgdWludDMyX3QuCisgIEVYUEVDVF9FUSgwdSwgcGFyc2VyLkdldENvZGUoIjwxMDAwMDAwMDAiKSk7Cit9CisKK1RFU1QoY3BkZl9jbWFwcGFyc2VyLCBHZXRDb2RlUmFuZ2UpIHsKKyAgQ1BERl9DTWFwUGFyc2VyIHBhcnNlcihudWxscHRyKTsKKyAgQ1BERl9DTWFwOjpDb2RlUmFuZ2UgcmFuZ2U7CisKKyAgLy8gTXVzdCBzdGFydCB3aXRoIGEgPAorICBFWFBFQ1RfRkFMU0UocGFyc2VyLkdldENvZGVSYW5nZShyYW5nZSwgIiIsICIiKSk7CisgIEVYUEVDVF9GQUxTRShwYXJzZXIuR2V0Q29kZVJhbmdlKHJhbmdlLCAiQSIsICIiKSk7CisKKyAgLy8gbV9DaGFyU2l6ZSBtdXN0IGJlIDw9IDQKKyAgRVhQRUNUX0ZBTFNFKHBhcnNlci5HZXRDb2RlUmFuZ2UocmFuZ2UsICI8YWFhYWFhYWFhYT4iLCAiIikpOworICBFWFBFQ1RfRVEoNXUsIHJhbmdlLm1fQ2hhclNpemUpOworCisgIEVYUEVDVF9UUlVFKHBhcnNlci5HZXRDb2RlUmFuZ2UocmFuZ2UsICI8MTIzNDU2Nzg+IiwgIjw4NzY1NDMyMT4iKSk7CisgIEVYUEVDVF9FUSg0dSwgcmFuZ2UubV9DaGFyU2l6ZSk7CisgIHsKKyAgICB1aW50OF90IGxvd2VyWzRdID0gezE4LCA1MiwgODYsIDEyMH07CisgICAgdWludDhfdCB1cHBlcls0XSA9IHsxMzUsIDEwMSwgNjcsIDMzfTsKKyAgICBFWFBFQ1RfVFJVRSh1aW50X3Jhbmdlc19lcXVhbChsb3dlciwgcmFuZ2UubV9Mb3dlciwgcmFuZ2UubV9DaGFyU2l6ZSkpOworICAgIEVYUEVDVF9UUlVFKHVpbnRfcmFuZ2VzX2VxdWFsKHVwcGVyLCByYW5nZS5tX1VwcGVyLCByYW5nZS5tX0NoYXJTaXplKSk7CisgIH0KKworICAvLyBIZXggY2hhcmFjdGVycworICBFWFBFQ1RfVFJVRShwYXJzZXIuR2V0Q29kZVJhbmdlKHJhbmdlLCAiPGExPiIsICI8RjM+IikpOworICBFWFBFQ1RfRVEoMXUsIHJhbmdlLm1fQ2hhclNpemUpOworICBFWFBFQ1RfRVEoMTYxLCByYW5nZS5tX0xvd2VyWzBdKTsKKyAgRVhQRUNUX0VRKDI0MywgcmFuZ2UubV9VcHBlclswXSk7CisKKyAgLy8gVGhlIHNlY29uZCBzdHJpbmcgc2hvdWxkIHJldHVybiAwJ3MgaWYgaXQgaXMgc2hvcnRlcgorICBFWFBFQ1RfVFJVRShwYXJzZXIuR2V0Q29kZVJhbmdlKHJhbmdlLCAiPGExPiIsICIiKSk7CisgIEVYUEVDVF9FUSgxdSwgcmFuZ2UubV9DaGFyU2l6ZSk7CisgIEVYUEVDVF9FUSgxNjEsIHJhbmdlLm1fTG93ZXJbMF0pOworICBFWFBFQ1RfRVEoMCwgcmFuZ2UubV9VcHBlclswXSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2ZvbnQuY3BwIGIvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9mb250LmNwcAppbmRleCAzNmQ3ZDZhLi44ZDM1NzM5IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2ZvbnQuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udC5jcHAKQEAgLTYsNiArNiw3IEBACiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2ZvbnQuaCIKIAorI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx2ZWN0b3I+CkBAIC0xNSw3ICsxNiw2IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl90cnVldHlwZWZvbnQuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3R5cGUxZm9udC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfdHlwZTNmb250LmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvZm9udF9pbnQuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2RvY3BhZ2VkYXRhLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlbW9kdWxlLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbV9hY2MuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mcmVldHlwZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCiAKQEAgLTM2LDcgKzM3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHhCNywgMHhDMiwgMHhDQiwgMHhDRSwgMHgwMH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4RDAsIDB4QzIsIDB4Q0IsIDB4Q0UsIDB4MDB9fTsKIAotdm9pZCBHZXRQcmVkZWZpbmVkRW5jb2RpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHZhbHVlLCBpbnQqIGJhc2VtYXApIHsKK3ZvaWQgR2V0UHJlZGVmaW5lZEVuY29kaW5nKGNvbnN0IEJ5dGVTdHJpbmcmIHZhbHVlLCBpbnQqIGJhc2VtYXApIHsKICAgaWYgKHZhbHVlID09ICJXaW5BbnNpRW5jb2RpbmciKQogICAgICpiYXNlbWFwID0gUERGRk9OVF9FTkNPRElOR19XSU5BTlNJOwogICBlbHNlIGlmICh2YWx1ZSA9PSAiTWFjUm9tYW5FbmNvZGluZyIpCkBAIC02MSw4ICs2MiwxMSBAQAogCiBDUERGX0ZvbnQ6On5DUERGX0ZvbnQoKSB7CiAgIGlmIChtX3BGb250RmlsZSkgewotICAgIG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlRm9udEZpbGVTdHJlYW1BY2MoCi0gICAgICAgIG1fcEZvbnRGaWxlLT5HZXRTdHJlYW0oKS0+QXNTdHJlYW0oKSk7CisgICAgYXV0byogcFBhZ2VEYXRhID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCk7CisgICAgaWYgKHBQYWdlRGF0YSkgeworICAgICAgcFBhZ2VEYXRhLT5NYXliZVB1cmdlRm9udEZpbGVTdHJlYW1BY2MoCisgICAgICAgICAgbV9wRm9udEZpbGUtPkdldFN0cmVhbSgpLT5Bc1N0cmVhbSgpKTsKKyAgICB9CiAgIH0KIH0KIApAQCAtMTE4LDcgKzEyMiw3IEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAotaW50IENQREZfRm9udDo6Q291bnRDaGFyKGNvbnN0IEZYX0NIQVIqIHBTdHJpbmcsIGludCBzaXplKSBjb25zdCB7CitpbnQgQ1BERl9Gb250OjpDb3VudENoYXIoY29uc3QgY2hhciogcFN0cmluZywgaW50IHNpemUpIGNvbnN0IHsKICAgcmV0dXJuIHNpemU7CiB9CiAKQEAgLTEzMSwzNSArMTM1LDM1IEBACiAgIHJldHVybiBwQ0lERm9udCA/IHBDSURGb250LT5Jc1ZlcnRXcml0aW5nKCkgOiBtX0ZvbnQuSXNWZXJ0aWNhbCgpOwogfQogCi1pbnQgQ1BERl9Gb250OjpBcHBlbmRDaGFyKEZYX0NIQVIqIGJ1ZiwgdWludDMyX3QgY2hhcmNvZGUpIGNvbnN0IHsKLSAgKmJ1ZiA9IHN0YXRpY19jYXN0PEZYX0NIQVI+KGNoYXJjb2RlKTsKK2ludCBDUERGX0ZvbnQ6OkFwcGVuZENoYXIoY2hhciogYnVmLCB1aW50MzJfdCBjaGFyY29kZSkgY29uc3QgeworICAqYnVmID0gc3RhdGljX2Nhc3Q8Y2hhcj4oY2hhcmNvZGUpOwogICByZXR1cm4gMTsKIH0KIAotdm9pZCBDUERGX0ZvbnQ6OkFwcGVuZENoYXIoQ0ZYX0J5dGVTdHJpbmcmIHN0ciwgdWludDMyX3QgY2hhcmNvZGUpIGNvbnN0IHsKK3ZvaWQgQ1BERl9Gb250OjpBcHBlbmRDaGFyKEJ5dGVTdHJpbmcqIHN0ciwgdWludDMyX3QgY2hhcmNvZGUpIGNvbnN0IHsKICAgY2hhciBidWZbNF07CiAgIGludCBsZW4gPSBBcHBlbmRDaGFyKGJ1ZiwgY2hhcmNvZGUpOwotICBpZiAobGVuID09IDEpIHsKLSAgICBzdHIgKz0gYnVmWzBdOwotICB9IGVsc2UgewotICAgIHN0ciArPSBDRlhfQnl0ZVN0cmluZyhidWYsIGxlbik7Ci0gIH0KKyAgKnN0ciArPSBCeXRlU3RyaW5nVmlldyhidWYsIGxlbik7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQREZfRm9udDo6VW5pY29kZUZyb21DaGFyQ29kZSh1aW50MzJfdCBjaGFyY29kZSkgY29uc3QgeworV2lkZVN0cmluZyBDUERGX0ZvbnQ6OlVuaWNvZGVGcm9tQ2hhckNvZGUodWludDMyX3QgY2hhcmNvZGUpIGNvbnN0IHsKICAgaWYgKCFtX2JUb1VuaWNvZGVMb2FkZWQpCiAgICAgTG9hZFVuaWNvZGVNYXAoKTsKIAotICByZXR1cm4gbV9wVG9Vbmljb2RlTWFwID8gbV9wVG9Vbmljb2RlTWFwLT5Mb29rdXAoY2hhcmNvZGUpIDogQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgcmV0dXJuIG1fcFRvVW5pY29kZU1hcCA/IG1fcFRvVW5pY29kZU1hcC0+TG9va3VwKGNoYXJjb2RlKSA6IFdpZGVTdHJpbmcoKTsKIH0KIAotdWludDMyX3QgQ1BERl9Gb250OjpDaGFyQ29kZUZyb21Vbmljb2RlKEZYX1dDSEFSIHVuaWNvZGUpIGNvbnN0IHsKK3VpbnQzMl90IENQREZfRm9udDo6Q2hhckNvZGVGcm9tVW5pY29kZSh3Y2hhcl90IHVuaWNvZGUpIGNvbnN0IHsKICAgaWYgKCFtX2JUb1VuaWNvZGVMb2FkZWQpCiAgICAgTG9hZFVuaWNvZGVNYXAoKTsKIAogICByZXR1cm4gbV9wVG9Vbmljb2RlTWFwID8gbV9wVG9Vbmljb2RlTWFwLT5SZXZlcnNlTG9va3VwKHVuaWNvZGUpIDogMDsKIH0KIAorYm9vbCBDUERGX0ZvbnQ6Okhhc0ZvbnRXaWR0aHMoKSBjb25zdCB7CisgIHJldHVybiB0cnVlOworfQorCiB2b2lkIENQREZfRm9udDo6TG9hZEZvbnREZXNjcmlwdG9yKENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjKSB7CiAgIG1fRmxhZ3MgPSBwRm9udERlc2MtPkdldEludGVnZXJGb3IoIkZsYWdzIiwgRlhGT05UX05PTlNZTUJPTElDKTsKICAgaW50IEl0YWxpY0FuZ2xlID0gMDsKQEAgLTIxOSw3ICsyMjMsNyBAQAogICBjb25zdCB1aW50OF90KiBwRm9udERhdGEgPSBtX3BGb250RmlsZS0+R2V0RGF0YSgpOwogICB1aW50MzJfdCBkd0ZvbnRTaXplID0gbV9wRm9udEZpbGUtPkdldFNpemUoKTsKICAgaWYgKCFtX0ZvbnQuTG9hZEVtYmVkZGVkKHBGb250RGF0YSwgZHdGb250U2l6ZSkpIHsKLSAgICBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+UmVsZWFzZUZvbnRGaWxlU3RyZWFtQWNjKAorICAgIG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5NYXliZVB1cmdlRm9udEZpbGVTdHJlYW1BY2MoCiAgICAgICAgIG1fcEZvbnRGaWxlLT5HZXRTdHJlYW0oKS0+QXNTdHJlYW0oKSk7CiAgICAgbV9wRm9udEZpbGUgPSBudWxscHRyOwogICB9CkBAIC0yODEsNyArMjg1LDcgQEAKICAgbV9wVG9Vbmljb2RlTWFwLT5Mb2FkKHBTdHJlYW0pOwogfQogCi1pbnQgQ1BERl9Gb250OjpHZXRTdHJpbmdXaWR0aChjb25zdCBGWF9DSEFSKiBwU3RyaW5nLCBpbnQgc2l6ZSkgeworaW50IENQREZfRm9udDo6R2V0U3RyaW5nV2lkdGgoY29uc3QgY2hhciogcFN0cmluZywgaW50IHNpemUpIHsKICAgaW50IG9mZnNldCA9IDA7CiAgIGludCB3aWR0aCA9IDA7CiAgIHdoaWxlIChvZmZzZXQgPCBzaXplKSB7CkBAIC0yOTEsOSArMjk1LDEwIEBACiAgIHJldHVybiB3aWR0aDsKIH0KIAorLy8gc3RhdGljCiBDUERGX0ZvbnQqIENQREZfRm9udDo6R2V0U3RvY2tGb250KENQREZfRG9jdW1lbnQqIHBEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgewotICBDRlhfQnl0ZVN0cmluZyBmb250bmFtZShuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIG5hbWUpIHsKKyAgQnl0ZVN0cmluZyBmb250bmFtZShuYW1lKTsKICAgaW50IGZvbnRfaWQgPSBQREZfR2V0U3RhbmRhcmRGb250TmFtZSgmZm9udG5hbWUpOwogICBpZiAoZm9udF9pZCA8IDApCiAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC0zMTQsMTIgKzMxOSwxMiBAQAogCiBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Gb250PiBDUERGX0ZvbnQ6OkNyZWF0ZShDUERGX0RvY3VtZW50KiBwRG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgdHlwZSA9IHBGb250RGljdC0+R2V0U3RyaW5nRm9yKCJTdWJ0eXBlIik7CisgIEJ5dGVTdHJpbmcgdHlwZSA9IHBGb250RGljdC0+R2V0U3RyaW5nRm9yKCJTdWJ0eXBlIik7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0ZvbnQ+IHBGb250OwogICBpZiAodHlwZSA9PSAiVHJ1ZVR5cGUiKSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgdGFnID0gcEZvbnREaWN0LT5HZXRTdHJpbmdGb3IoIkJhc2VGb250IikuTGVmdCg0KTsKKyAgICBCeXRlU3RyaW5nIHRhZyA9IHBGb250RGljdC0+R2V0U3RyaW5nRm9yKCJCYXNlRm9udCIpLkxlZnQoNCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoa0NoaW5lc2VGb250TmFtZXMpOyArK2kpIHsKLSAgICAgIGlmICh0YWcgPT0gQ0ZYX0J5dGVTdHJpbmcoa0NoaW5lc2VGb250TmFtZXNbaV0sIDQpKSB7CisgICAgICBpZiAodGFnID09IEJ5dGVTdHJpbmcoa0NoaW5lc2VGb250TmFtZXNbaV0sIDQpKSB7CiAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvbnREZXNjID0gcEZvbnREaWN0LT5HZXREaWN0Rm9yKCJGb250RGVzY3JpcHRvciIpOwogICAgICAgICBpZiAoIXBGb250RGVzYyB8fCAhcEZvbnREZXNjLT5LZXlFeGlzdCgiRm9udEZpbGUyIikpCiAgICAgICAgICAgcEZvbnQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9DSURGb250PigpOwpAQCAtMzQxLDcgKzM0Niw3IEBACiAgIHJldHVybiBwRm9udC0+TG9hZCgpID8gc3RkOjptb3ZlKHBGb250KSA6IG51bGxwdHI7CiB9CiAKLXVpbnQzMl90IENQREZfRm9udDo6R2V0TmV4dENoYXIoY29uc3QgRlhfQ0hBUiogcFN0cmluZywKK3VpbnQzMl90IENQREZfRm9udDo6R2V0TmV4dENoYXIoY29uc3QgY2hhciogcFN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TdHJMZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgb2Zmc2V0KSBjb25zdCB7CiAgIGlmIChvZmZzZXQgPCAwIHx8IG5TdHJMZW4gPCAxKSB7CkBAIC0zNTMsNyArMzU4LDcgQEAKIAogdm9pZCBDUERGX0ZvbnQ6OkxvYWRQREZFbmNvZGluZyhDUERGX09iamVjdCogcEVuY29kaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGlCYXNlRW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENGWF9CeXRlU3RyaW5nPiogcENoYXJOYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Qnl0ZVN0cmluZz4qIHBDaGFyTmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkVtYmVkZGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJUcnVlVHlwZSkgewogICBpZiAoIXBFbmNvZGluZykgewpAQCAtMzcwLDEyICszNzUsMTIgQEAKICAgICAgICAgaUJhc2VFbmNvZGluZyA9PSBQREZGT05UX0VOQ09ESU5HX1pBUEZESU5HQkFUUykgewogICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBpZiAoKG1fRmxhZ3MgJiBGWEZPTlRfU1lNQk9MSUMpICYmIG1fQmFzZUZvbnQgPT0gIlN5bWJvbCIpIHsKKyAgICBpZiAoRm9udFN0eWxlSXNTeW1ib2xpYyhtX0ZsYWdzKSAmJiBtX0Jhc2VGb250ID09ICJTeW1ib2wiKSB7CiAgICAgICBpZiAoIWJUcnVlVHlwZSkKICAgICAgICAgaUJhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfQURPQkVfU1lNQk9MOwogICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBic0VuY29kaW5nID0gcEVuY29kaW5nLT5HZXRTdHJpbmcoKTsKKyAgICBCeXRlU3RyaW5nIGJzRW5jb2RpbmcgPSBwRW5jb2RpbmctPkdldFN0cmluZygpOwogICAgIGlmIChic0VuY29kaW5nLkNvbXBhcmUoIk1hY0V4cGVydEVuY29kaW5nIikgPT0gMCkgewogICAgICAgYnNFbmNvZGluZyA9ICJXaW5BbnNpRW5jb2RpbmciOwogICAgIH0KQEAgLTM4OSwxMCArMzk0LDkgQEAKIAogICBpZiAoaUJhc2VFbmNvZGluZyAhPSBQREZGT05UX0VOQ09ESU5HX0FET0JFX1NZTUJPTCAmJgogICAgICAgaUJhc2VFbmNvZGluZyAhPSBQREZGT05UX0VOQ09ESU5HX1pBUEZESU5HQkFUUykgewotICAgIENGWF9CeXRlU3RyaW5nIGJzRW5jb2RpbmcgPSBwRGljdC0+R2V0U3RyaW5nRm9yKCJCYXNlRW5jb2RpbmciKTsKLSAgICBpZiAoYnNFbmNvZGluZy5Db21wYXJlKCJNYWNFeHBlcnRFbmNvZGluZyIpID09IDAgJiYgYlRydWVUeXBlKSB7CisgICAgQnl0ZVN0cmluZyBic0VuY29kaW5nID0gcERpY3QtPkdldFN0cmluZ0ZvcigiQmFzZUVuY29kaW5nIik7CisgICAgaWYgKGJUcnVlVHlwZSAmJiBic0VuY29kaW5nLkNvbXBhcmUoIk1hY0V4cGVydEVuY29kaW5nIikgPT0gMCkKICAgICAgIGJzRW5jb2RpbmcgPSAiV2luQW5zaUVuY29kaW5nIjsKLSAgICB9CiAgICAgR2V0UHJlZGVmaW5lZEVuY29kaW5nKGJzRW5jb2RpbmcsICZpQmFzZUVuY29kaW5nKTsKICAgfQogICBpZiAoKCFiRW1iZWRkZWQgfHwgYlRydWVUeXBlKSAmJiBpQmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfQlVJTFRJTikKQEAgLTQyOSwxOSArNDMzLDE5IEBACiAgIHJldHVybiB0cnVlOwogfQogCi1jb25zdCBGWF9DSEFSKiBDUERGX0ZvbnQ6OkdldEFkb2JlQ2hhck5hbWUoCitjb25zdCBjaGFyKiBDUERGX0ZvbnQ6OkdldEFkb2JlQ2hhck5hbWUoCiAgICAgaW50IGlCYXNlRW5jb2RpbmcsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0ZYX0J5dGVTdHJpbmc+JiBjaGFybmFtZXMsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Qnl0ZVN0cmluZz4mIGNoYXJuYW1lcywKICAgICBpbnQgY2hhcmNvZGUpIHsKICAgaWYgKGNoYXJjb2RlIDwgMCB8fCBjaGFyY29kZSA+PSAyNTYpIHsKLSAgICBBU1NFUlQoZmFsc2UpOworICAgIE5PVFJFQUNIRUQoKTsKICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQogCiAgIGlmICghY2hhcm5hbWVzLmVtcHR5KCkgJiYgIWNoYXJuYW1lc1tjaGFyY29kZV0uSXNFbXB0eSgpKQogICAgIHJldHVybiBjaGFybmFtZXNbY2hhcmNvZGVdLmNfc3RyKCk7CiAKLSAgY29uc3QgRlhfQ0hBUiogbmFtZSA9IG51bGxwdHI7CisgIGNvbnN0IGNoYXIqIG5hbWUgPSBudWxscHRyOwogICBpZiAoaUJhc2VFbmNvZGluZykKICAgICBuYW1lID0gUERGX0NoYXJOYW1lRnJvbVByZWRlZmluZWRDaGFyU2V0KGlCYXNlRW5jb2RpbmcsIGNoYXJjb2RlKTsKICAgcmV0dXJuIG5hbWUgJiYgbmFtZVswXSA/IG5hbWUgOiBudWxscHRyOwpAQCAtNDU4LDEzICs0NjIsNDggQEAKIH0KIAogaW50IENQREZfRm9udDo6RmFsbGJhY2tHbHlwaEZyb21DaGFyY29kZShpbnQgZmFsbGJhY2tGb250LCB1aW50MzJfdCBjaGFyY29kZSkgewotICBpZiAoZmFsbGJhY2tGb250IDwgMCB8fAotICAgICAgZmFsbGJhY2tGb250ID49IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50PihtX0ZvbnRGYWxsYmFja3MpKSB7CisgIGlmICghcGRmaXVtOjpJbmRleEluQm91bmRzKG1fRm9udEZhbGxiYWNrcywgZmFsbGJhY2tGb250KSkKICAgICByZXR1cm4gLTE7Ci0gIH0KKworICBXaWRlU3RyaW5nIHN0ciA9IFVuaWNvZGVGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOworICB1aW50MzJfdCB1bmljb2RlID0gIXN0ci5Jc0VtcHR5KCkgPyBzdHJbMF0gOiBjaGFyY29kZTsKICAgaW50IGdseXBoID0KLSAgICAgIEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250RmFsbGJhY2tzW2ZhbGxiYWNrRm9udF0tPkdldEZhY2UoKSwgY2hhcmNvZGUpOwotICBpZiAoZ2x5cGggPT0gMCB8fCBnbHlwaCA9PSAweGZmZmYpCisgICAgICBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udEZhbGxiYWNrc1tmYWxsYmFja0ZvbnRdLT5HZXRGYWNlKCksIHVuaWNvZGUpOworICBpZiAoZ2x5cGggPT0gMCkKICAgICByZXR1cm4gLTE7CisKICAgcmV0dXJuIGdseXBoOwogfQorCitDRlhfRm9udCogQ1BERl9Gb250OjpHZXRGb250RmFsbGJhY2soaW50IHBvc2l0aW9uKSB7CisgIGlmIChwb3NpdGlvbiA8IDAgfHwgc3RhdGljX2Nhc3Q8c2l6ZV90Pihwb3NpdGlvbikgPj0gbV9Gb250RmFsbGJhY2tzLnNpemUoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIG1fRm9udEZhbGxiYWNrc1twb3NpdGlvbl0uZ2V0KCk7Cit9CisKKy8vIHN0YXRpYworaW50IENQREZfRm9udDo6VFQyUERGKGludCBtLCBGWEZUX0ZhY2UgZmFjZSkgeworICBpbnQgdXBtID0gRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKGZhY2UpOworICBpZiAodXBtID09IDApCisgICAgcmV0dXJuIG07CisKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oCisgICAgICBwZGZpdW06OmNsYW1wKChtICogMTAwMC4wICsgdXBtIC8gMikgLyB1cG0sCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKSksCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSkpKTsKK30KKworLy8gc3RhdGljCitib29sIENQREZfRm9udDo6RlRfVXNlVFRDaGFybWFwKEZYRlRfRmFjZSBmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxhdGZvcm1faWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmNvZGluZ19pZCkgeworICBhdXRvKiogcENoYXJNYXAgPSBGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpOworICBmb3IgKGludCBpID0gMDsgaSA8IEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcENvdW50KGZhY2UpOyBpKyspIHsKKyAgICBpZiAoRlhGVF9HZXRfQ2hhcm1hcF9QbGF0Zm9ybUlEKHBDaGFyTWFwW2ldKSA9PSBwbGF0Zm9ybV9pZCAmJgorICAgICAgICBGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nSUQocENoYXJNYXBbaV0pID09IGVuY29kaW5nX2lkKSB7CisgICAgICBGWEZUX1NldF9DaGFybWFwKGZhY2UsIHBDaGFyTWFwW2ldKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2ZvbnQuaCBiL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udC5oCmluZGV4IDYwMjVhODIuLjA0NjhiY2IgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udC5oCisrKyBiL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udC5oCkBAIC0xMCw4ICsxMCwxMiBAQAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3RvdW5pY29kZW1hcC5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW1fYWNjLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnQuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZm9udC5oIgogCiBjbGFzcyBDRlhfU3Vic3RGb250OwpAQCAtMTksNyArMjMsNiBAQAogY2xhc3MgQ1BERl9EaWN0aW9uYXJ5OwogY2xhc3MgQ1BERl9Eb2N1bWVudDsKIGNsYXNzIENQREZfT2JqZWN0OwotY2xhc3MgQ1BERl9TdHJlYW1BY2M7CiBjbGFzcyBDUERGX1RydWVUeXBlRm9udDsKIGNsYXNzIENQREZfVHlwZTFGb250OwogY2xhc3MgQ1BERl9UeXBlM0ZvbnQ7CkBAIC0zMCw3ICszMyw3IEBACiAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Gb250PiBDcmVhdGUoQ1BERl9Eb2N1bWVudCogcERvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCk7CiAgIHN0YXRpYyBDUERGX0ZvbnQqIEdldFN0b2NrRm9udChDUERGX0RvY3VtZW50KiBwRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmb250bmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgZm9udG5hbWUpOwogICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0ludmFsaWRDaGFyQ29kZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigtMSk7CiAKICAgdmlydHVhbCB+Q1BERl9Gb250KCk7CkBAIC01MCw1OCArNTMsNjYgQEAKIAogICB2aXJ0dWFsIGJvb2wgSXNWZXJ0V3JpdGluZygpIGNvbnN0OwogICB2aXJ0dWFsIGJvb2wgSXNVbmljb2RlQ29tcGF0aWJsZSgpIGNvbnN0OwotICB2aXJ0dWFsIHVpbnQzMl90IEdldE5leHRDaGFyKGNvbnN0IEZYX0NIQVIqIHBTdHJpbmcsCisgIHZpcnR1YWwgdWludDMyX3QgR2V0TmV4dENoYXIoY29uc3QgY2hhciogcFN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblN0ckxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG9mZnNldCkgY29uc3Q7Ci0gIHZpcnR1YWwgaW50IENvdW50Q2hhcihjb25zdCBGWF9DSEFSKiBwU3RyaW5nLCBpbnQgc2l6ZSkgY29uc3Q7Ci0gIHZpcnR1YWwgaW50IEFwcGVuZENoYXIoRlhfQ0hBUiogYnVmLCB1aW50MzJfdCBjaGFyY29kZSkgY29uc3Q7CisgIHZpcnR1YWwgaW50IENvdW50Q2hhcihjb25zdCBjaGFyKiBwU3RyaW5nLCBpbnQgc2l6ZSkgY29uc3Q7CisgIHZpcnR1YWwgaW50IEFwcGVuZENoYXIoY2hhciogYnVmLCB1aW50MzJfdCBjaGFyY29kZSkgY29uc3Q7CiAgIHZpcnR1YWwgaW50IEdseXBoRnJvbUNoYXJDb2RlKHVpbnQzMl90IGNoYXJjb2RlLCBib29sKiBwVmVydEdseXBoKSA9IDA7CiAgIHZpcnR1YWwgaW50IEdseXBoRnJvbUNoYXJDb2RlRXh0KHVpbnQzMl90IGNoYXJjb2RlKTsKLSAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBVbmljb2RlRnJvbUNoYXJDb2RlKHVpbnQzMl90IGNoYXJjb2RlKSBjb25zdDsKLSAgdmlydHVhbCB1aW50MzJfdCBDaGFyQ29kZUZyb21Vbmljb2RlKEZYX1dDSEFSIFVuaWNvZGUpIGNvbnN0OworICB2aXJ0dWFsIFdpZGVTdHJpbmcgVW5pY29kZUZyb21DaGFyQ29kZSh1aW50MzJfdCBjaGFyY29kZSkgY29uc3Q7CisgIHZpcnR1YWwgdWludDMyX3QgQ2hhckNvZGVGcm9tVW5pY29kZSh3Y2hhcl90IFVuaWNvZGUpIGNvbnN0OworICB2aXJ0dWFsIGJvb2wgSGFzRm9udFdpZHRocygpIGNvbnN0OwogCi0gIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBHZXRCYXNlRm9udCgpIGNvbnN0IHsgcmV0dXJuIG1fQmFzZUZvbnQ7IH0KKyAgY29uc3QgQnl0ZVN0cmluZyYgR2V0QmFzZUZvbnQoKSBjb25zdCB7IHJldHVybiBtX0Jhc2VGb250OyB9CiAgIENGWF9TdWJzdEZvbnQqIEdldFN1YnN0Rm9udCgpIGNvbnN0IHsgcmV0dXJuIG1fRm9udC5HZXRTdWJzdEZvbnQoKTsgfQogICBib29sIElzRW1iZWRkZWQoKSBjb25zdCB7IHJldHVybiBJc1R5cGUzRm9udCgpIHx8IG1fcEZvbnRGaWxlICE9IG51bGxwdHI7IH0KICAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRGb250RGljdCgpIGNvbnN0IHsgcmV0dXJuIG1fcEZvbnREaWN0OyB9CiAgIGJvb2wgSXNTdGFuZGFyZEZvbnQoKSBjb25zdDsKICAgRlhGVF9GYWNlIEdldEZhY2UoKSBjb25zdCB7IHJldHVybiBtX0ZvbnQuR2V0RmFjZSgpOyB9Ci0gIHZvaWQgQXBwZW5kQ2hhcihDRlhfQnl0ZVN0cmluZyYgc3RyLCB1aW50MzJfdCBjaGFyY29kZSkgY29uc3Q7CisgIHZvaWQgQXBwZW5kQ2hhcihCeXRlU3RyaW5nKiBzdHIsIHVpbnQzMl90IGNoYXJjb2RlKSBjb25zdDsKIAogICB2b2lkIEdldEZvbnRCQm94KEZYX1JFQ1QmIHJlY3QpIGNvbnN0IHsgcmVjdCA9IG1fRm9udEJCb3g7IH0KICAgaW50IEdldFR5cGVBc2NlbnQoKSBjb25zdCB7IHJldHVybiBtX0FzY2VudDsgfQogICBpbnQgR2V0VHlwZURlc2NlbnQoKSBjb25zdCB7IHJldHVybiBtX0Rlc2NlbnQ7IH0KLSAgaW50IEdldFN0cmluZ1dpZHRoKGNvbnN0IEZYX0NIQVIqIHBTdHJpbmcsIGludCBzaXplKTsKKyAgaW50IEdldFN0cmluZ1dpZHRoKGNvbnN0IGNoYXIqIHBTdHJpbmcsIGludCBzaXplKTsKICAgdWludDMyX3QgRmFsbGJhY2tGb250RnJvbUNoYXJjb2RlKHVpbnQzMl90IGNoYXJjb2RlKTsKICAgaW50IEZhbGxiYWNrR2x5cGhGcm9tQ2hhcmNvZGUoaW50IGZhbGxiYWNrRm9udCwgdWludDMyX3QgY2hhcmNvZGUpOwogCiAgIHZpcnR1YWwgaW50IEdldENoYXJXaWR0aEYodWludDMyX3QgY2hhcmNvZGUpID0gMDsKICAgdmlydHVhbCBGWF9SRUNUIEdldENoYXJCQm94KHVpbnQzMl90IGNoYXJjb2RlKSA9IDA7CiAKLSAgQ1BERl9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7Ci0gIENGWF9Gb250IG1fRm9udDsKLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWF9Gb250Pj4gbV9Gb250RmFsbGJhY2tzOworICBDUERGX0RvY3VtZW50KiBHZXREb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcERvY3VtZW50LkdldCgpOyB9CisgIENGWF9Gb250KiBHZXRGb250KCkgeyByZXR1cm4gJm1fRm9udDsgfQorICBjb25zdCBDRlhfRm9udCogR2V0Rm9udCgpIGNvbnN0IHsgcmV0dXJuICZtX0ZvbnQ7IH0KKyAgQ0ZYX0ZvbnQqIEdldEZvbnRGYWxsYmFjayhpbnQgcG9zaXRpb24pOwogCiAgcHJvdGVjdGVkOgogICBDUERGX0ZvbnQoKTsKIAorICBzdGF0aWMgaW50IFRUMlBERihpbnQgbSwgRlhGVF9GYWNlIGZhY2UpOworICBzdGF0aWMgYm9vbCBGVF9Vc2VUVENoYXJtYXAoRlhGVF9GYWNlIGZhY2UsIGludCBwbGF0Zm9ybV9pZCwgaW50IGVuY29kaW5nX2lkKTsKKwogICB2aXJ0dWFsIGJvb2wgTG9hZCgpID0gMDsKIAogICB2b2lkIExvYWRVbmljb2RlTWFwKCkgY29uc3Q7ICAvLyBsb2dpY2FsbHkgY29uc3Qgb25seS4KICAgdm9pZCBMb2FkUERGRW5jb2RpbmcoQ1BERl9PYmplY3QqIHBFbmNvZGluZywKICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBpQmFzZUVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDRlhfQnl0ZVN0cmluZz4qIHBDaGFyTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEJ5dGVTdHJpbmc+KiBwQ2hhck5hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICBib29sIGJFbWJlZGRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVHJ1ZVR5cGUpOwogICB2b2lkIExvYWRGb250RGVzY3JpcHRvcihDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKICAgdm9pZCBDaGVja0ZvbnRNZXRyaWNzKCk7CiAKLSAgY29uc3QgRlhfQ0hBUiogR2V0QWRvYmVDaGFyTmFtZShpbnQgaUJhc2VFbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDRlhfQnl0ZVN0cmluZz4mIGNoYXJuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcmNvZGUpOworICBjb25zdCBjaGFyKiBHZXRBZG9iZUNoYXJOYW1lKGludCBpQmFzZUVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEJ5dGVTdHJpbmc+JiBjaGFybmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYXJjb2RlKTsKIAotICBDRlhfQnl0ZVN0cmluZyBtX0Jhc2VGb250OwotICBDUERGX1N0cmVhbUFjYyogbV9wRm9udEZpbGU7CisgIFVub3duZWRQdHI8Q1BERl9Eb2N1bWVudD4gbV9wRG9jdW1lbnQ7CisgIENGWF9Gb250IG1fRm9udDsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWF9Gb250Pj4gbV9Gb250RmFsbGJhY2tzOworICBCeXRlU3RyaW5nIG1fQmFzZUZvbnQ7CisgIFJldGFpblB0cjxDUERGX1N0cmVhbUFjYz4gbV9wRm9udEZpbGU7CiAgIENQREZfRGljdGlvbmFyeSogbV9wRm9udERpY3Q7CiAgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPENQREZfVG9Vbmljb2RlTWFwPiBtX3BUb1VuaWNvZGVNYXA7CiAgIG11dGFibGUgYm9vbCBtX2JUb1VuaWNvZGVMb2FkZWQ7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2ZvbnRlbmNvZGluZy5jcHAgYi9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2ZvbnRlbmNvZGluZy5jcHAKaW5kZXggODhiMmM4ZC4uOTIxZDU4NCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9mb250ZW5jb2RpbmcuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udGVuY29kaW5nLmNwcApAQCAtMjM2LDcgKzIzNiw3IEBACiAgICAgMHgyN0JDLCAweDI3QkQsIDB4MjdCRSwgMHgwMDAwLAogfTsKIAotY29uc3QgRlhfQ0hBUiogY29uc3QgU3RhbmRhcmRFbmNvZGluZ05hbWVzWzIyNF0gPSB7Citjb25zdCBjaGFyKiBjb25zdCBTdGFuZGFyZEVuY29kaW5nTmFtZXNbMjI0XSA9IHsKICAgICAic3BhY2UiLAogICAgICJleGNsYW0iLAogICAgICJxdW90ZWRibCIsCkBAIC00NjMsNyArNDYzLDcgQEAKICAgICBudWxscHRyLAogfTsKIAotY29uc3QgRlhfQ0hBUiogY29uc3QgQWRvYmVXaW5BbnNpRW5jb2RpbmdOYW1lc1syMjRdID0geworY29uc3QgY2hhciogY29uc3QgQWRvYmVXaW5BbnNpRW5jb2RpbmdOYW1lc1syMjRdID0gewogICAgICJzcGFjZSIsCiAgICAgImV4Y2xhbSIsCiAgICAgInF1b3RlZGJsIiwKQEAgLTY5MCw3ICs2OTAsNyBAQAogICAgICJ5ZGllcmVzaXMiLAogfTsKIAotY29uc3QgRlhfQ0hBUiogY29uc3QgTWFjUm9tYW5FbmNvZGluZ05hbWVzWzIyNF0gPSB7Citjb25zdCBjaGFyKiBjb25zdCBNYWNSb21hbkVuY29kaW5nTmFtZXNbMjI0XSA9IHsKICAgICAic3BhY2UiLAogICAgICJleGNsYW0iLAogICAgICJxdW90ZWRibCIsCkBAIC05MTcsNyArOTE3LDcgQEAKICAgICAiY2Fyb24iLAogfTsKIAotY29uc3QgRlhfQ0hBUiogY29uc3QgTWFjRXhwZXJ0RW5jb2RpbmdOYW1lc1syMjRdID0geworY29uc3QgY2hhciogY29uc3QgTWFjRXhwZXJ0RW5jb2RpbmdOYW1lc1syMjRdID0gewogICAgICJzcGFjZSIsCiAgICAgImV4Y2xhbXNtYWxsIiwKICAgICAiSHVuZ2FydW1sYXV0c21hbGwiLApAQCAtMTE0NCw3ICsxMTQ0LDcgQEAKICAgICBudWxscHRyLAogfTsKIAotY29uc3QgRlhfQ0hBUiogY29uc3QgUERGRG9jRW5jb2RpbmdOYW1lc1syMzJdID0geworY29uc3QgY2hhciogY29uc3QgUERGRG9jRW5jb2RpbmdOYW1lc1syMzJdID0gewogICAgICJicmV2ZSIsCiAgICAgImNhcm9uIiwKICAgICAiY2lyY3VtZmxleCIsCkBAIC0xMzc5LDcgKzEzNzksNyBAQAogICAgICJ5ZGllcmVzaXMiLAogfTsKIAotY29uc3QgRlhfQ0hBUiogY29uc3QgQWRvYmVTeW1ib2xFbmNvZGluZ05hbWVzWzIyNF0gPSB7Citjb25zdCBjaGFyKiBjb25zdCBBZG9iZVN5bWJvbEVuY29kaW5nTmFtZXNbMjI0XSA9IHsKICAgICAic3BhY2UiLAogICAgICJleGNsYW0iLAogICAgICJ1bml2ZXJzYWwiLApAQCAtMTYwNiw3ICsxNjA2LDcgQEAKICAgICBudWxscHRyLAogfTsKIAotY29uc3QgRlhfQ0hBUiogY29uc3QgWmFwZkVuY29kaW5nTmFtZXNbMjI0XSA9IHsKK2NvbnN0IGNoYXIqIGNvbnN0IFphcGZFbmNvZGluZ05hbWVzWzIyNF0gPSB7CiAgICAgInNwYWNlIiwgImExIiwgICAgImEyIiwgICAgImEyMDIiLCAgImEzIiwgICAgImE0IiwgICAgImE1IiwgICAgImExMTkiLAogICAgICJhMTE4IiwgICJhMTE3IiwgICJhMTEiLCAgICJhMTIiLCAgICJhMTMiLCAgICJhMTQiLCAgICJhMTUiLCAgICJhMTYiLAogICAgICJhMTA1IiwgICJhMTciLCAgICJhMTgiLCAgICJhMTkiLCAgICJhMjAiLCAgICJhMjEiLCAgICJhMjIiLCAgICJhMjMiLApAQCAtMTY0NiwxMCArMTY0NiwxMCBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIENQREZfRm9udEVuY29kaW5nOjpDUERGX0ZvbnRFbmNvZGluZygpIHsKLSAgRlhTWVNfbWVtc2V0KG1fVW5pY29kZXMsIDAsIHNpemVvZihtX1VuaWNvZGVzKSk7CisgIG1lbXNldChtX1VuaWNvZGVzLCAwLCBzaXplb2YobV9Vbmljb2RlcykpOwogfQogCi1pbnQgQ1BERl9Gb250RW5jb2Rpbmc6OkNoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgdW5pY29kZSkgY29uc3QgeworaW50IENQREZfRm9udEVuY29kaW5nOjpDaGFyQ29kZUZyb21Vbmljb2RlKHdjaGFyX3QgdW5pY29kZSkgY29uc3QgewogICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKQogICAgIGlmIChtX1VuaWNvZGVzW2ldID09IHVuaWNvZGUpIHsKICAgICAgIHJldHVybiBpOwpAQCAtMTY2MCw3ICsxNjYwLDcgQEAKIENQREZfRm9udEVuY29kaW5nOjpDUERGX0ZvbnRFbmNvZGluZyhpbnQgUHJlZGVmaW5lZEVuY29kaW5nKSB7CiAgIGNvbnN0IHVpbnQxNl90KiBwU3JjID0gUERGX1VuaWNvZGVzRm9yUHJlZGVmaW5lZENoYXJTZXQoUHJlZGVmaW5lZEVuY29kaW5nKTsKICAgaWYgKCFwU3JjKSB7Ci0gICAgRlhTWVNfbWVtc2V0KG1fVW5pY29kZXMsIDAsIHNpemVvZihtX1VuaWNvZGVzKSk7CisgICAgbWVtc2V0KG1fVW5pY29kZXMsIDAsIHNpemVvZihtX1VuaWNvZGVzKSk7CiAgIH0gZWxzZSB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykKICAgICAgIG1fVW5pY29kZXNbaV0gPSBwU3JjW2ldOwpAQCAtMTY2OCwxMiArMTY2OCwxMSBAQAogfQogCiBib29sIENQREZfRm9udEVuY29kaW5nOjpJc0lkZW50aWNhbChDUERGX0ZvbnRFbmNvZGluZyogcEFub3RoZXIpIGNvbnN0IHsKLSAgcmV0dXJuIEZYU1lTX21lbWNtcChtX1VuaWNvZGVzLCBwQW5vdGhlci0+bV9Vbmljb2Rlcywgc2l6ZW9mKG1fVW5pY29kZXMpKSA9PQotICAgICAgICAgMDsKKyAgcmV0dXJuIG1lbWNtcChtX1VuaWNvZGVzLCBwQW5vdGhlci0+bV9Vbmljb2Rlcywgc2l6ZW9mKG1fVW5pY29kZXMpKSA9PSAwOwogfQogCiBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IENQREZfRm9udEVuY29kaW5nOjpSZWFsaXplKAotICAgIENGWF9XZWFrUHRyPENGWF9CeXRlU3RyaW5nUG9vbD4gcFBvb2wpIHsKKyAgICBXZWFrUHRyPEJ5dGVTdHJpbmdQb29sPiBwUG9vbCkgewogICBpbnQgcHJlZGVmaW5lZCA9IDA7CiAgIGZvciAoaW50IGNzID0gUERGRk9OVF9FTkNPRElOR19XSU5BTlNJOyBjcyA8IFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTOwogICAgICAgIGNzKyspIHsKQEAgLTE3MTcsNyArMTcxNiw3IEBACiAgIHJldHVybiBzdGQ6Om1vdmUocERpY3QpOwogfQogCi11aW50MzJfdCBGVF9DaGFyQ29kZUZyb21Vbmljb2RlKGludCBlbmNvZGluZywgRlhfV0NIQVIgdW5pY29kZSkgewordWludDMyX3QgRlRfQ2hhckNvZGVGcm9tVW5pY29kZShpbnQgZW5jb2RpbmcsIHdjaGFyX3QgdW5pY29kZSkgewogICBzd2l0Y2ggKGVuY29kaW5nKSB7CiAgICAgY2FzZSBGWEZUX0VOQ09ESU5HX1VOSUNPREU6CiAgICAgICByZXR1cm4gdW5pY29kZTsKQEAgLTE3NTgsMTggKzE3NTcsMTcgQEAKICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLUZYX1dDSEFSIFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShjb25zdCBGWF9DSEFSKiBuYW1lKSB7Ci0gIHJldHVybiAoRlhfV0NIQVIpKEZYRlRfdW5pY29kZV9mcm9tX2Fkb2JlX25hbWUobmFtZSkgJiAweDdGRkZGRkZGKTsKK3djaGFyX3QgUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgcmV0dXJuICh3Y2hhcl90KShGWEZUX3VuaWNvZGVfZnJvbV9hZG9iZV9uYW1lKG5hbWUpICYgMHg3RkZGRkZGRik7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIFBERl9BZG9iZU5hbWVGcm9tVW5pY29kZShGWF9XQ0hBUiB1bmljb2RlKSB7CitCeXRlU3RyaW5nIFBERl9BZG9iZU5hbWVGcm9tVW5pY29kZSh3Y2hhcl90IHVuaWNvZGUpIHsKICAgY2hhciBnbHlwaF9uYW1lWzY0XTsKICAgRlhGVF9hZG9iZV9uYW1lX2Zyb21fdW5pY29kZShnbHlwaF9uYW1lLCB1bmljb2RlKTsKLSAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGdseXBoX25hbWUpOworICByZXR1cm4gQnl0ZVN0cmluZyhnbHlwaF9uYW1lKTsKIH0KIAotY29uc3QgRlhfQ0hBUiogUERGX0NoYXJOYW1lRnJvbVByZWRlZmluZWRDaGFyU2V0KGludCBlbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNoYXJjb2RlKSB7Citjb25zdCBjaGFyKiBQREZfQ2hhck5hbWVGcm9tUHJlZGVmaW5lZENoYXJTZXQoaW50IGVuY29kaW5nLCB1aW50OF90IGNoYXJjb2RlKSB7CiAgIGlmIChlbmNvZGluZyA9PSBQREZGT05UX0VOQ09ESU5HX1BERkRPQykgewogICAgIGlmIChjaGFyY29kZSA8IDI0KQogICAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC0xODAwLDcgKzE3OTgsNyBAQAogICByZXR1cm4gbnVsbHB0cjsKIH0KIAotRlhfV0NIQVIgRlRfVW5pY29kZUZyb21DaGFyQ29kZShpbnQgZW5jb2RpbmcsIHVpbnQzMl90IGNoYXJjb2RlKSB7Cit3Y2hhcl90IEZUX1VuaWNvZGVGcm9tQ2hhckNvZGUoaW50IGVuY29kaW5nLCB1aW50MzJfdCBjaGFyY29kZSkgewogICBzd2l0Y2ggKGVuY29kaW5nKSB7CiAgICAgY2FzZSBGWEZUX0VOQ09ESU5HX1VOSUNPREU6CiAgICAgICByZXR1cm4gKHVpbnQxNl90KWNoYXJjb2RlOwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9mb250ZW5jb2RpbmcuaCBiL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udGVuY29kaW5nLmgKaW5kZXggNmMwZGU5MC4uMDQwNzA4ZiAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9mb250ZW5jb2RpbmcuaAorKysgYi9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2ZvbnRlbmNvZGluZy5oCkBAIC05LDkgKzksOSBAQAogCiAjaW5jbHVkZSA8bWVtb3J5PgogCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfc3RyaW5nX3Bvb2xfdGVtcGxhdGUuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF93ZWFrX3B0ci5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9zdHJpbmdfcG9vbF90ZW1wbGF0ZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvd2Vha19wdHIuaCIKIAogI2RlZmluZSBQREZGT05UX0VOQ09ESU5HX0JVSUxUSU4gMAogI2RlZmluZSBQREZGT05UX0VOQ09ESU5HX1dJTkFOU0kgMQpAQCAtMjIsMTcgKzIyLDE1IEBACiAjZGVmaW5lIFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTIDYKICNkZWZpbmUgUERGRk9OVF9FTkNPRElOR19QREZET0MgNwogI2RlZmluZSBQREZGT05UX0VOQ09ESU5HX01TX1NZTUJPTCA4Ci0jZGVmaW5lIFBERkZPTlRfRU5DT0RJTkdfVU5JQ09ERSA5CiAKLXVpbnQzMl90IEZUX0NoYXJDb2RlRnJvbVVuaWNvZGUoaW50IGVuY29kaW5nLCBGWF9XQ0hBUiB1bmljb2RlKTsKLUZYX1dDSEFSIEZUX1VuaWNvZGVGcm9tQ2hhckNvZGUoaW50IGVuY29kaW5nLCB1aW50MzJfdCBjaGFyY29kZSk7Cit1aW50MzJfdCBGVF9DaGFyQ29kZUZyb21Vbmljb2RlKGludCBlbmNvZGluZywgd2NoYXJfdCB1bmljb2RlKTsKK3djaGFyX3QgRlRfVW5pY29kZUZyb21DaGFyQ29kZShpbnQgZW5jb2RpbmcsIHVpbnQzMl90IGNoYXJjb2RlKTsKIAotRlhfV0NIQVIgUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKGNvbnN0IEZYX0NIQVIqIG5hbWUpOwotQ0ZYX0J5dGVTdHJpbmcgUERGX0Fkb2JlTmFtZUZyb21Vbmljb2RlKEZYX1dDSEFSIHVuaWNvZGUpOword2NoYXJfdCBQREZfVW5pY29kZUZyb21BZG9iZU5hbWUoY29uc3QgY2hhciogbmFtZSk7CitCeXRlU3RyaW5nIFBERl9BZG9iZU5hbWVGcm9tVW5pY29kZSh3Y2hhcl90IHVuaWNvZGUpOwogCiBjb25zdCB1aW50MTZfdCogUERGX1VuaWNvZGVzRm9yUHJlZGVmaW5lZENoYXJTZXQoaW50IGVuY29kaW5nKTsKLWNvbnN0IEZYX0NIQVIqIFBERl9DaGFyTmFtZUZyb21QcmVkZWZpbmVkQ2hhclNldChpbnQgZW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjaGFyY29kZSk7Citjb25zdCBjaGFyKiBQREZfQ2hhck5hbWVGcm9tUHJlZGVmaW5lZENoYXJTZXQoaW50IGVuY29kaW5nLCB1aW50OF90IGNoYXJjb2RlKTsKIAogY2xhc3MgQ1BERl9PYmplY3Q7CiAKQEAgLTQ1LDE5ICs0MywxOSBAQAogCiAgIGJvb2wgSXNJZGVudGljYWwoQ1BERl9Gb250RW5jb2RpbmcqIHBBbm90aGVyKSBjb25zdDsKIAotICBGWF9XQ0hBUiBVbmljb2RlRnJvbUNoYXJDb2RlKHVpbnQ4X3QgY2hhcmNvZGUpIGNvbnN0IHsKKyAgd2NoYXJfdCBVbmljb2RlRnJvbUNoYXJDb2RlKHVpbnQ4X3QgY2hhcmNvZGUpIGNvbnN0IHsKICAgICByZXR1cm4gbV9Vbmljb2Rlc1tjaGFyY29kZV07CiAgIH0KLSAgaW50IENoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgdW5pY29kZSkgY29uc3Q7CisgIGludCBDaGFyQ29kZUZyb21Vbmljb2RlKHdjaGFyX3QgdW5pY29kZSkgY29uc3Q7CiAKLSAgdm9pZCBTZXRVbmljb2RlKHVpbnQ4X3QgY2hhcmNvZGUsIEZYX1dDSEFSIHVuaWNvZGUpIHsKKyAgdm9pZCBTZXRVbmljb2RlKHVpbnQ4X3QgY2hhcmNvZGUsIHdjaGFyX3QgdW5pY29kZSkgewogICAgIG1fVW5pY29kZXNbY2hhcmNvZGVdID0gdW5pY29kZTsKICAgfQogCi0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gUmVhbGl6ZShDRlhfV2Vha1B0cjxDRlhfQnl0ZVN0cmluZ1Bvb2w+IHBQb29sKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBSZWFsaXplKFdlYWtQdHI8Qnl0ZVN0cmluZ1Bvb2w+IHBQb29sKTsKIAogIHB1YmxpYzoKLSAgRlhfV0NIQVIgbV9Vbmljb2Rlc1syNTZdOworICB3Y2hhcl90IG1fVW5pY29kZXNbMjU2XTsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9GUERGQVBJX0ZPTlRfQ1BERl9GT05URU5DT0RJTkdfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udGdsb2JhbHMuY3BwIGIvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9mb250Z2xvYmFscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRmODdiMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udGdsb2JhbHMuY3BwCkBAIC0wLDAgKzEsMzkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udGdsb2JhbHMuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorCitDUERGX0ZvbnRHbG9iYWxzOjpDUERGX0ZvbnRHbG9iYWxzKCkgeworICBtZW1zZXQobV9FbWJlZGRlZENoYXJzZXRzLCAwLCBzaXplb2YobV9FbWJlZGRlZENoYXJzZXRzKSk7CisgIG1lbXNldChtX0VtYmVkZGVkVG9Vbmljb2RlcywgMCwgc2l6ZW9mKG1fRW1iZWRkZWRUb1VuaWNvZGVzKSk7Cit9CisKK0NQREZfRm9udEdsb2JhbHM6On5DUERGX0ZvbnRHbG9iYWxzKCkge30KKworQ1BERl9Gb250KiBDUERGX0ZvbnRHbG9iYWxzOjpGaW5kKENQREZfRG9jdW1lbnQqIHBEb2MsIHVpbnQzMl90IGluZGV4KSB7CisgIGF1dG8gaXQgPSBtX1N0b2NrTWFwLmZpbmQocERvYyk7CisgIGlmIChpdCA9PSBtX1N0b2NrTWFwLmVuZCgpKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gaXQtPnNlY29uZCA/IGl0LT5zZWNvbmQtPkdldEZvbnQoaW5kZXgpIDogbnVsbHB0cjsKK30KKworQ1BERl9Gb250KiBDUERGX0ZvbnRHbG9iYWxzOjpTZXQoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENQREZfRm9udD4gcEZvbnQpIHsKKyAgaWYgKCFwZGZpdW06OkNvbnRhaW5zS2V5KG1fU3RvY2tNYXAsIHBEb2MpKQorICAgIG1fU3RvY2tNYXBbcERvY10gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX1N0b2NrRm9udEFycmF5PigpOworICByZXR1cm4gbV9TdG9ja01hcFtwRG9jXS0+U2V0Rm9udChpbmRleCwgc3RkOjptb3ZlKHBGb250KSk7Cit9CisKK3ZvaWQgQ1BERl9Gb250R2xvYmFsczo6Q2xlYXIoQ1BERl9Eb2N1bWVudCogcERvYykgeworICBtX1N0b2NrTWFwLmVyYXNlKHBEb2MpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9mb250Z2xvYmFscy5oIGIvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9mb250Z2xvYmFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0N2RmYTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2ZvbnRnbG9iYWxzLmgKQEAgLTAsMCArMSw2NCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlBERkFQSV9GT05UX0NQREZfRk9OVEdMT0JBTFNfSF8KKyNkZWZpbmUgQ09SRV9GUERGQVBJX0ZPTlRfQ1BERl9GT05UR0xPQkFMU19IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2NtYXBzL2NtYXBfaW50LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY2Z4X3N0b2NrZm9udGFycmF5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jbWFwbWFuYWdlci5oIgorCitjbGFzcyBDUERGX0ZvbnRHbG9iYWxzIHsKKyBwdWJsaWM6CisgIENQREZfRm9udEdsb2JhbHMoKTsKKyAgfkNQREZfRm9udEdsb2JhbHMoKTsKKworICB2b2lkIENsZWFyKENQREZfRG9jdW1lbnQqIHBEb2MpOworICBDUERGX0ZvbnQqIEZpbmQoQ1BERl9Eb2N1bWVudCogcERvYywgdWludDMyX3QgaW5kZXgpOworCisgIC8vIFRha2VzIG93bmVyc2hpcCBvZiB8cEZvbnR8LCByZXR1cm5zIHVub3duZWQgcG9pbnRlciB0byBpdC4KKyAgQ1BERl9Gb250KiBTZXQoQ1BERl9Eb2N1bWVudCoga2V5LAorICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENQREZfRm9udD4gcEZvbnQpOworCisgIHZvaWQgU2V0RW1iZWRkZWRDaGFyc2V0KHNpemVfdCBpZHgsIGNvbnN0IEZYQ01BUF9DTWFwKiBtYXAsIHVpbnQzMl90IGNvdW50KSB7CisgICAgbV9FbWJlZGRlZENoYXJzZXRzW2lkeF0ubV9wTWFwTGlzdCA9IG1hcDsKKyAgICBtX0VtYmVkZGVkQ2hhcnNldHNbaWR4XS5tX0NvdW50ID0gY291bnQ7CisgIH0KKyAgc3RkOjpwYWlyPHVpbnQzMl90LCBjb25zdCBGWENNQVBfQ01hcCo+IEdldEVtYmVkZGVkQ2hhcnNldChzaXplX3QgaWR4KSBjb25zdCB7CisgICAgcmV0dXJuIHttX0VtYmVkZGVkQ2hhcnNldHNbaWR4XS5tX0NvdW50LAorICAgICAgICAgICAgbV9FbWJlZGRlZENoYXJzZXRzW2lkeF0ubV9wTWFwTGlzdC5HZXQoKX07CisgIH0KKyAgdm9pZCBTZXRFbWJlZGRlZFRvVW5pY29kZShzaXplX3QgaWR4LCBjb25zdCB1aW50MTZfdCogbWFwLCB1aW50MzJfdCBjb3VudCkgeworICAgIG1fRW1iZWRkZWRUb1VuaWNvZGVzW2lkeF0ubV9wTWFwID0gbWFwOworICAgIG1fRW1iZWRkZWRUb1VuaWNvZGVzW2lkeF0ubV9Db3VudCA9IGNvdW50OworICB9CisgIHN0ZDo6cGFpcjx1aW50MzJfdCwgY29uc3QgdWludDE2X3QqPiBHZXRFbWJlZGRlZFRvVW5pY29kZShzaXplX3QgaWR4KSB7CisgICAgcmV0dXJuIHttX0VtYmVkZGVkVG9Vbmljb2Rlc1tpZHhdLm1fQ291bnQsCisgICAgICAgICAgICBtX0VtYmVkZGVkVG9Vbmljb2Rlc1tpZHhdLm1fcE1hcH07CisgIH0KKworICBDUERGX0NNYXBNYW5hZ2VyKiBHZXRDTWFwTWFuYWdlcigpIHsgcmV0dXJuICZtX0NNYXBNYW5hZ2VyOyB9CisKKyBwcml2YXRlOgorICBDUERGX0NNYXBNYW5hZ2VyIG1fQ01hcE1hbmFnZXI7CisgIHN0cnVjdCB7CisgICAgVW5vd25lZFB0cjxjb25zdCBGWENNQVBfQ01hcD4gbV9wTWFwTGlzdDsKKyAgICB1aW50MzJfdCBtX0NvdW50OworICB9IG1fRW1iZWRkZWRDaGFyc2V0c1tDSURTRVRfTlVNX1NFVFNdOworICBzdHJ1Y3QgeworICAgIGNvbnN0IHVpbnQxNl90KiBtX3BNYXA7CisgICAgdWludDMyX3QgbV9Db3VudDsKKyAgfSBtX0VtYmVkZGVkVG9Vbmljb2Rlc1tDSURTRVRfTlVNX1NFVFNdOworCisgIHN0ZDo6bWFwPENQREZfRG9jdW1lbnQqLCBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1N0b2NrRm9udEFycmF5Pj4gbV9TdG9ja01hcDsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GUERGQVBJX0ZPTlRfQ1BERl9GT05UR0xPQkFMU19IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9zaW1wbGVmb250LmNwcCBiL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfc2ltcGxlZm9udC5jcHAKaW5kZXggYzQxNDI3MC4uOTI5NjViMCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9zaW1wbGVmb250LmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3NpbXBsZWZvbnQuY3BwCkBAIC02LDE2ICs2LDE1IEBACiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3NpbXBsZWZvbnQuaCIKIAotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2ZvbnRfaW50LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfbWF0aC5oIgogCiBDUERGX1NpbXBsZUZvbnQ6OkNQREZfU2ltcGxlRm9udCgpIDogbV9CYXNlRW5jb2RpbmcoUERGRk9OVF9FTkNPRElOR19CVUlMVElOKSB7Ci0gIEZYU1lTX21lbXNldChtX0NoYXJXaWR0aCwgMHhmZiwgc2l6ZW9mKG1fQ2hhcldpZHRoKSk7Ci0gIEZYU1lTX21lbXNldChtX0dseXBoSW5kZXgsIDB4ZmYsIHNpemVvZihtX0dseXBoSW5kZXgpKTsKLSAgRlhTWVNfbWVtc2V0KG1fRXh0R0lELCAweGZmLCBzaXplb2YobV9FeHRHSUQpKTsKKyAgbWVtc2V0KG1fQ2hhcldpZHRoLCAweGZmLCBzaXplb2YobV9DaGFyV2lkdGgpKTsKKyAgbWVtc2V0KG1fR2x5cGhJbmRleCwgMHhmZiwgc2l6ZW9mKG1fR2x5cGhJbmRleCkpOworICBtZW1zZXQobV9FeHRHSUQsIDB4ZmYsIHNpemVvZihtX0V4dEdJRCkpOwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShtX0NoYXJCQm94KTsgKytpKQogICAgIG1fQ2hhckJCb3hbaV0gPSBGWF9SRUNUKC0xLCAtMSwgLTEsIC0xKTsKIH0KQEAgLTI5LDggKzI4LDExIEBACiAgIGlmIChjaGFyY29kZSA+IDB4ZmYpCiAgICAgcmV0dXJuIC0xOwogCi0gIGludCBpbmRleCA9IG1fR2x5cGhJbmRleFsodWludDhfdCljaGFyY29kZV07Ci0gIHJldHVybiBpbmRleCAhPSAweGZmZmYgPyBpbmRleCA6IC0xOworICBpbnQgaW5kZXggPSBtX0dseXBoSW5kZXhbY2hhcmNvZGVdOworICBpZiAoaW5kZXggPT0gMHhmZmZmIHx8IChpbmRleCA9PSAwICYmIElzVHJ1ZVR5cGVGb250KCkpKQorICAgIHJldHVybiAtMTsKKworICByZXR1cm4gaW5kZXg7CiB9CiAKIHZvaWQgQ1BERl9TaW1wbGVGb250OjpMb2FkQ2hhck1ldHJpY3MoaW50IGNoYXJjb2RlKSB7CkBAIC0xMjgsMTEgKzEzMCwxMSBAQAogICB9CiAgIGlmIChtX3BGb250RmlsZSkgewogICAgIGlmIChtX0Jhc2VGb250LkdldExlbmd0aCgpID4gOCAmJiBtX0Jhc2VGb250WzddID09ICcrJykKLSAgICAgIG1fQmFzZUZvbnQgPSBtX0Jhc2VGb250Lk1pZCg4KTsKKyAgICAgIG1fQmFzZUZvbnQgPSBtX0Jhc2VGb250LlJpZ2h0KG1fQmFzZUZvbnQuR2V0TGVuZ3RoKCkgLSA4KTsKICAgfSBlbHNlIHsKICAgICBMb2FkU3Vic3RGb250KCk7CiAgIH0KLSAgaWYgKCEobV9GbGFncyAmIEZYRk9OVF9TWU1CT0xJQykpCisgIGlmICghRm9udFN0eWxlSXNTeW1ib2xpYyhtX0ZsYWdzKSkKICAgICBtX0Jhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfU1RBTkRBUkQ7CiAgIENQREZfT2JqZWN0KiBwRW5jb2RpbmcgPSBtX3BGb250RGljdC0+R2V0RGlyZWN0T2JqZWN0Rm9yKCJFbmNvZGluZyIpOwogICBMb2FkUERGRW5jb2RpbmcocEVuY29kaW5nLCBtX0Jhc2VFbmNvZGluZywgJm1fQ2hhck5hbWVzLCAhIW1fcEZvbnRGaWxlLApAQCAtMTQyLDcgKzE0NCw3IEBACiAgIGlmICghbV9Gb250LkdldEZhY2UoKSkKICAgICByZXR1cm4gdHJ1ZTsKIAotICBpZiAobV9GbGFncyAmIEZYRk9OVF9BTExDQVApIHsKKyAgaWYgKEZvbnRTdHlsZUlzQWxsQ2FwcyhtX0ZsYWdzKSkgewogICAgIHVuc2lnbmVkIGNoYXIga0xvd2VyY2FzZXNbXVsyXSA9IHt7J2EnLCAneid9LCB7MHhlMCwgMHhmNn0sIHsweGY4LCAweGZkfX07CiAgICAgZm9yIChzaXplX3QgcmFuZ2UgPSAwOyByYW5nZSA8IEZYX0FycmF5U2l6ZShrTG93ZXJjYXNlcyk7ICsrcmFuZ2UpIHsKICAgICAgIGNvbnN0IGF1dG8mIGxvd2VyID0ga0xvd2VyY2FzZXNbcmFuZ2VdOwpAQCAtMTY0LDcgKzE2Niw3IEBACiB9CiAKIHZvaWQgQ1BERl9TaW1wbGVGb250OjpMb2FkU3Vic3RGb250KCkgewotICBpZiAoIW1fYlVzZUZvbnRXaWR0aCAmJiAhKG1fRmxhZ3MgJiBGWEZPTlRfRklYRURfUElUQ0gpKSB7CisgIGlmICghbV9iVXNlRm9udFdpZHRoICYmICFGb250U3R5bGVJc0ZpeGVkUGl0Y2gobV9GbGFncykpIHsKICAgICBpbnQgd2lkdGggPSAwLCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewogICAgICAgaWYgKG1fQ2hhcldpZHRoW2ldID09IDAgfHwgbV9DaGFyV2lkdGhbaV0gPT0gMHhmZmZmKQpAQCAtMTk0LDE5ICsxOTYsMjMgQEAKICAgICAgICAgIG1fQmFzZUVuY29kaW5nICE9IFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUERGX1NpbXBsZUZvbnQ6OlVuaWNvZGVGcm9tQ2hhckNvZGUodWludDMyX3QgY2hhcmNvZGUpIGNvbnN0IHsKLSAgQ0ZYX1dpZGVTdHJpbmcgdW5pY29kZSA9IENQREZfRm9udDo6VW5pY29kZUZyb21DaGFyQ29kZShjaGFyY29kZSk7CitXaWRlU3RyaW5nIENQREZfU2ltcGxlRm9udDo6VW5pY29kZUZyb21DaGFyQ29kZSh1aW50MzJfdCBjaGFyY29kZSkgY29uc3QgeworICBXaWRlU3RyaW5nIHVuaWNvZGUgPSBDUERGX0ZvbnQ6OlVuaWNvZGVGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOwogICBpZiAoIXVuaWNvZGUuSXNFbXB0eSgpKQogICAgIHJldHVybiB1bmljb2RlOwotICBGWF9XQ0hBUiByZXQgPSBtX0VuY29kaW5nLlVuaWNvZGVGcm9tQ2hhckNvZGUoKHVpbnQ4X3QpY2hhcmNvZGUpOworICB3Y2hhcl90IHJldCA9IG1fRW5jb2RpbmcuVW5pY29kZUZyb21DaGFyQ29kZSgodWludDhfdCljaGFyY29kZSk7CiAgIGlmIChyZXQgPT0gMCkKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgICByZXR1cm4gV2lkZVN0cmluZygpOwogICByZXR1cm4gcmV0OwogfQogCi11aW50MzJfdCBDUERGX1NpbXBsZUZvbnQ6OkNoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgdW5pY29kZSkgY29uc3QgewordWludDMyX3QgQ1BERl9TaW1wbGVGb250OjpDaGFyQ29kZUZyb21Vbmljb2RlKHdjaGFyX3QgdW5pY29kZSkgY29uc3QgewogICB1aW50MzJfdCByZXQgPSBDUERGX0ZvbnQ6OkNoYXJDb2RlRnJvbVVuaWNvZGUodW5pY29kZSk7CiAgIGlmIChyZXQpCiAgICAgcmV0dXJuIHJldDsKICAgcmV0dXJuIG1fRW5jb2RpbmcuQ2hhckNvZGVGcm9tVW5pY29kZSh1bmljb2RlKTsKIH0KKworYm9vbCBDUERGX1NpbXBsZUZvbnQ6Okhhc0ZvbnRXaWR0aHMoKSBjb25zdCB7CisgIHJldHVybiAhbV9iVXNlRm9udFdpZHRoOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9zaW1wbGVmb250LmggYi9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3NpbXBsZWZvbnQuaAppbmRleCA1OTIyOTBiLi41MjkxMjExIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3NpbXBsZWZvbnQuaAorKysgYi9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3NpbXBsZWZvbnQuaApAQCAtMjQsMTEgKzI0LDEzIEBACiAgIEZYX1JFQ1QgR2V0Q2hhckJCb3godWludDMyX3QgY2hhcmNvZGUpIG92ZXJyaWRlOwogICBpbnQgR2x5cGhGcm9tQ2hhckNvZGUodWludDMyX3QgY2hhcmNvZGUsIGJvb2wqIHBWZXJ0R2x5cGgpIG92ZXJyaWRlOwogICBib29sIElzVW5pY29kZUNvbXBhdGlibGUoKSBjb25zdCBvdmVycmlkZTsKLSAgQ0ZYX1dpZGVTdHJpbmcgVW5pY29kZUZyb21DaGFyQ29kZSh1aW50MzJfdCBjaGFyY29kZSkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHVpbnQzMl90IENoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgVW5pY29kZSkgY29uc3Qgb3ZlcnJpZGU7CisgIFdpZGVTdHJpbmcgVW5pY29kZUZyb21DaGFyQ29kZSh1aW50MzJfdCBjaGFyY29kZSkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IENoYXJDb2RlRnJvbVVuaWNvZGUod2NoYXJfdCBVbmljb2RlKSBjb25zdCBvdmVycmlkZTsKIAogICBDUERGX0ZvbnRFbmNvZGluZyogR2V0RW5jb2RpbmcoKSB7IHJldHVybiAmbV9FbmNvZGluZzsgfQogCisgIGJvb2wgSGFzRm9udFdpZHRocygpIGNvbnN0IG92ZXJyaWRlOworCiAgcHJvdGVjdGVkOgogICB2aXJ0dWFsIHZvaWQgTG9hZEdseXBoTWFwKCkgPSAwOwogCkBAIC0zOSw3ICs0MSw3IEBACiAgIENQREZfRm9udEVuY29kaW5nIG1fRW5jb2Rpbmc7CiAgIHVpbnQxNl90IG1fR2x5cGhJbmRleFsyNTZdOwogICB1aW50MTZfdCBtX0V4dEdJRFsyNTZdOwotICBzdGQ6OnZlY3RvcjxDRlhfQnl0ZVN0cmluZz4gbV9DaGFyTmFtZXM7CisgIHN0ZDo6dmVjdG9yPEJ5dGVTdHJpbmc+IG1fQ2hhck5hbWVzOwogICBpbnQgbV9CYXNlRW5jb2Rpbmc7CiAgIHVpbnQxNl90IG1fQ2hhcldpZHRoWzI1Nl07CiAgIEZYX1JFQ1QgbV9DaGFyQkJveFsyNTZdOwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl90b3VuaWNvZGVtYXAuY3BwIGIvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl90b3VuaWNvZGVtYXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNzQ2ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3RvdW5pY29kZW1hcC5jcHAKQEAgLTAsMCArMSwyMzIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfdG91bmljb2RlbWFwLmgiCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvY3BkZl9tb2R1bGVtZ3IuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NpZDJ1bmljb2RlbWFwLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlbW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3NpbXBsZV9wYXJzZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc2FmZV90eXBlcy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9jb252ZXJzaW9ucy5oIgorCitXaWRlU3RyaW5nIENQREZfVG9Vbmljb2RlTWFwOjpMb29rdXAodWludDMyX3QgY2hhcmNvZGUpIGNvbnN0IHsKKyAgYXV0byBpdCA9IG1fTWFwLmZpbmQoY2hhcmNvZGUpOworICBpZiAoaXQgIT0gbV9NYXAuZW5kKCkpIHsKKyAgICB1aW50MzJfdCB2YWx1ZSA9IGl0LT5zZWNvbmQ7CisgICAgd2NoYXJfdCB1bmljb2RlID0gKHdjaGFyX3QpKHZhbHVlICYgMHhmZmZmKTsKKyAgICBpZiAodW5pY29kZSAhPSAweGZmZmYpIHsKKyAgICAgIHJldHVybiB1bmljb2RlOworICAgIH0KKyAgICBjb25zdCB3Y2hhcl90KiBidWYgPSBtX011bHRpQ2hhckJ1Zi5HZXRCdWZmZXIoKTsKKyAgICB1aW50MzJfdCBidWZfbGVuID0gbV9NdWx0aUNoYXJCdWYuR2V0TGVuZ3RoKCk7CisgICAgaWYgKCFidWYgfHwgYnVmX2xlbiA9PSAwKSB7CisgICAgICByZXR1cm4gV2lkZVN0cmluZygpOworICAgIH0KKyAgICB1aW50MzJfdCBpbmRleCA9IHZhbHVlID4+IDE2OworICAgIGlmIChpbmRleCA+PSBidWZfbGVuKSB7CisgICAgICByZXR1cm4gV2lkZVN0cmluZygpOworICAgIH0KKyAgICB1aW50MzJfdCBsZW4gPSBidWZbaW5kZXhdOworICAgIGlmIChpbmRleCArIGxlbiA8IGluZGV4IHx8IGluZGV4ICsgbGVuID49IGJ1Zl9sZW4pIHsKKyAgICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CisgICAgfQorICAgIHJldHVybiBXaWRlU3RyaW5nKGJ1ZiArIGluZGV4ICsgMSwgbGVuKTsKKyAgfQorICBpZiAobV9wQmFzZU1hcCkgeworICAgIHJldHVybiBtX3BCYXNlTWFwLT5Vbmljb2RlRnJvbUNJRCgodWludDE2X3QpY2hhcmNvZGUpOworICB9CisgIHJldHVybiBXaWRlU3RyaW5nKCk7Cit9CisKK3VpbnQzMl90IENQREZfVG9Vbmljb2RlTWFwOjpSZXZlcnNlTG9va3VwKHdjaGFyX3QgdW5pY29kZSkgY29uc3QgeworICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtX01hcCkgeworICAgIGlmIChwYWlyLnNlY29uZCA9PSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odW5pY29kZSkpCisgICAgICByZXR1cm4gcGFpci5maXJzdDsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8gU3RhdGljLgordWludDMyX3QgQ1BERl9Ub1VuaWNvZGVNYXA6OlN0cmluZ1RvQ29kZShjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyKSB7CisgIGludCBsZW4gPSBzdHIuR2V0TGVuZ3RoKCk7CisgIGlmIChsZW4gPT0gMCkKKyAgICByZXR1cm4gMDsKKworICB1aW50MzJfdCByZXN1bHQgPSAwOworICBpZiAoc3RyWzBdID09ICc8JykgeworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuICYmIHN0ZDo6aXN4ZGlnaXQoc3RyW2ldKTsgKytpKQorICAgICAgcmVzdWx0ID0gcmVzdWx0ICogMTYgKyBGWFNZU19IZXhDaGFyVG9JbnQoc3RyLkNoYXJBdChpKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuICYmIHN0ZDo6aXNkaWdpdChzdHJbaV0pOyArK2kpCisgICAgcmVzdWx0ID0gcmVzdWx0ICogMTAgKyBGWFNZU19EZWNpbWFsQ2hhclRvSW50KHN0ci5DaGFyQXQoaSkpOworCisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBXaWRlU3RyaW5nIFN0cmluZ0RhdGFBZGQoV2lkZVN0cmluZyBzdHIpIHsKKyAgV2lkZVN0cmluZyByZXQ7CisgIGludCBsZW4gPSBzdHIuR2V0TGVuZ3RoKCk7CisgIHdjaGFyX3QgdmFsdWUgPSAxOworICBmb3IgKGludCBpID0gbGVuIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICB3Y2hhcl90IGNoID0gc3RyW2ldICsgdmFsdWU7CisgICAgaWYgKGNoIDwgc3RyW2ldKSB7CisgICAgICByZXQuSW5zZXJ0QXRGcm9udCgwKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0Lkluc2VydEF0RnJvbnQoY2gpOworICAgICAgdmFsdWUgPSAwOworICAgIH0KKyAgfQorICBpZiAodmFsdWUpCisgICAgcmV0Lkluc2VydEF0RnJvbnQodmFsdWUpOworICByZXR1cm4gcmV0OworfQorCisvLyBTdGF0aWMuCitXaWRlU3RyaW5nIENQREZfVG9Vbmljb2RlTWFwOjpTdHJpbmdUb1dpZGVTdHJpbmcoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN0cikgeworICBpbnQgbGVuID0gc3RyLkdldExlbmd0aCgpOworICBpZiAobGVuID09IDApCisgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKKworICBXaWRlU3RyaW5nIHJlc3VsdDsKKyAgaWYgKHN0clswXSA9PSAnPCcpIHsKKyAgICBpbnQgYnl0ZV9wb3MgPSAwOworICAgIHdjaGFyX3QgY2ggPSAwOworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbGVuICYmIHN0ZDo6aXN4ZGlnaXQoc3RyW2ldKTsgKytpKSB7CisgICAgICBjaCA9IGNoICogMTYgKyBGWFNZU19IZXhDaGFyVG9JbnQoc3RyW2ldKTsKKyAgICAgIGJ5dGVfcG9zKys7CisgICAgICBpZiAoYnl0ZV9wb3MgPT0gNCkgeworICAgICAgICByZXN1bHQgKz0gY2g7CisgICAgICAgIGJ5dGVfcG9zID0gMDsKKyAgICAgICAgY2ggPSAwOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK0NQREZfVG9Vbmljb2RlTWFwOjpDUERGX1RvVW5pY29kZU1hcCgpIDogbV9wQmFzZU1hcChudWxscHRyKSB7fQorCitDUERGX1RvVW5pY29kZU1hcDo6fkNQREZfVG9Vbmljb2RlTWFwKCkge30KKwordWludDMyX3QgQ1BERl9Ub1VuaWNvZGVNYXA6OkdldFVuaWNvZGUoKSB7CisgIEZYX1NBRkVfVUlOVDMyIHVuaSA9IG1fTXVsdGlDaGFyQnVmLkdldExlbmd0aCgpOworICB1bmkgPSB1bmkgKiAweDEwMDAwICsgMHhmZmZmOworICByZXR1cm4gdW5pLlZhbHVlT3JEZWZhdWx0KDApOworfQorCit2b2lkIENQREZfVG9Vbmljb2RlTWFwOjpMb2FkKENQREZfU3RyZWFtKiBwU3RyZWFtKSB7CisgIENJRFNldCBjaWRfc2V0ID0gQ0lEU0VUX1VOS05PV047CisgIGF1dG8gcEFjYyA9IHBkZml1bTo6TWFrZVJldGFpbjxDUERGX1N0cmVhbUFjYz4ocFN0cmVhbSk7CisgIHBBY2MtPkxvYWRBbGxEYXRhRmlsdGVyZWQoKTsKKyAgQ1BERl9TaW1wbGVQYXJzZXIgcGFyc2VyKHBBY2MtPkdldERhdGEoKSwgcEFjYy0+R2V0U2l6ZSgpKTsKKyAgd2hpbGUgKDEpIHsKKyAgICBCeXRlU3RyaW5nVmlldyB3b3JkID0gcGFyc2VyLkdldFdvcmQoKTsKKyAgICBpZiAod29yZC5Jc0VtcHR5KCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAod29yZCA9PSAiYmVnaW5iZmNoYXIiKSB7CisgICAgICB3aGlsZSAoMSkgeworICAgICAgICB3b3JkID0gcGFyc2VyLkdldFdvcmQoKTsKKyAgICAgICAgaWYgKHdvcmQuSXNFbXB0eSgpIHx8IHdvcmQgPT0gImVuZGJmY2hhciIpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBzcmNjb2RlID0gU3RyaW5nVG9Db2RlKHdvcmQpOworICAgICAgICB3b3JkID0gcGFyc2VyLkdldFdvcmQoKTsKKyAgICAgICAgV2lkZVN0cmluZyBkZXN0Y29kZSA9IFN0cmluZ1RvV2lkZVN0cmluZyh3b3JkKTsKKyAgICAgICAgaW50IGxlbiA9IGRlc3Rjb2RlLkdldExlbmd0aCgpOworICAgICAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVuID09IDEpIHsKKyAgICAgICAgICBtX01hcFtzcmNjb2RlXSA9IGRlc3Rjb2RlWzBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1fTWFwW3NyY2NvZGVdID0gR2V0VW5pY29kZSgpOworICAgICAgICAgIG1fTXVsdGlDaGFyQnVmLkFwcGVuZENoYXIoZGVzdGNvZGUuR2V0TGVuZ3RoKCkpOworICAgICAgICAgIG1fTXVsdGlDaGFyQnVmIDw8IGRlc3Rjb2RlOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmICh3b3JkID09ICJiZWdpbmJmcmFuZ2UiKSB7CisgICAgICB3aGlsZSAoMSkgeworICAgICAgICBCeXRlU3RyaW5nIGxvdywgaGlnaDsKKyAgICAgICAgbG93ID0gcGFyc2VyLkdldFdvcmQoKTsKKyAgICAgICAgaWYgKGxvdy5Jc0VtcHR5KCkgfHwgbG93ID09ICJlbmRiZnJhbmdlIikgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGhpZ2ggPSBwYXJzZXIuR2V0V29yZCgpOworICAgICAgICB1aW50MzJfdCBsb3djb2RlID0gU3RyaW5nVG9Db2RlKGxvdy5Bc1N0cmluZ1ZpZXcoKSk7CisgICAgICAgIHVpbnQzMl90IGhpZ2hjb2RlID0KKyAgICAgICAgICAgIChsb3djb2RlICYgMHhmZmZmZmYwMCkgfCAoU3RyaW5nVG9Db2RlKGhpZ2guQXNTdHJpbmdWaWV3KCkpICYgMHhmZik7CisgICAgICAgIGlmIChoaWdoY29kZSA9PSAodWludDMyX3QpLTEpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBCeXRlU3RyaW5nIHN0YXJ0KHBhcnNlci5HZXRXb3JkKCkpOworICAgICAgICBpZiAoc3RhcnQgPT0gIlsiKSB7CisgICAgICAgICAgZm9yICh1aW50MzJfdCBjb2RlID0gbG93Y29kZTsgY29kZSA8PSBoaWdoY29kZTsgY29kZSsrKSB7CisgICAgICAgICAgICBCeXRlU3RyaW5nIGRlc3QocGFyc2VyLkdldFdvcmQoKSk7CisgICAgICAgICAgICBXaWRlU3RyaW5nIGRlc3Rjb2RlID0gU3RyaW5nVG9XaWRlU3RyaW5nKGRlc3QuQXNTdHJpbmdWaWV3KCkpOworICAgICAgICAgICAgaW50IGxlbiA9IGRlc3Rjb2RlLkdldExlbmd0aCgpOworICAgICAgICAgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxlbiA9PSAxKSB7CisgICAgICAgICAgICAgIG1fTWFwW2NvZGVdID0gZGVzdGNvZGVbMF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBtX01hcFtjb2RlXSA9IEdldFVuaWNvZGUoKTsKKyAgICAgICAgICAgICAgbV9NdWx0aUNoYXJCdWYuQXBwZW5kQ2hhcihkZXN0Y29kZS5HZXRMZW5ndGgoKSk7CisgICAgICAgICAgICAgIG1fTXVsdGlDaGFyQnVmIDw8IGRlc3Rjb2RlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBwYXJzZXIuR2V0V29yZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFdpZGVTdHJpbmcgZGVzdGNvZGUgPSBTdHJpbmdUb1dpZGVTdHJpbmcoc3RhcnQuQXNTdHJpbmdWaWV3KCkpOworICAgICAgICAgIGludCBsZW4gPSBkZXN0Y29kZS5HZXRMZW5ndGgoKTsKKyAgICAgICAgICB1aW50MzJfdCB2YWx1ZSA9IDA7CisgICAgICAgICAgaWYgKGxlbiA9PSAxKSB7CisgICAgICAgICAgICB2YWx1ZSA9IFN0cmluZ1RvQ29kZShzdGFydC5Bc1N0cmluZ1ZpZXcoKSk7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGNvZGUgPSBsb3djb2RlOyBjb2RlIDw9IGhpZ2hjb2RlOyBjb2RlKyspIHsKKyAgICAgICAgICAgICAgbV9NYXBbY29kZV0gPSB2YWx1ZSsrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGNvZGUgPSBsb3djb2RlOyBjb2RlIDw9IGhpZ2hjb2RlOyBjb2RlKyspIHsKKyAgICAgICAgICAgICAgV2lkZVN0cmluZyByZXRjb2RlOworICAgICAgICAgICAgICBpZiAoY29kZSA9PSBsb3djb2RlKSB7CisgICAgICAgICAgICAgICAgcmV0Y29kZSA9IGRlc3Rjb2RlOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldGNvZGUgPSBTdHJpbmdEYXRhQWRkKGRlc3Rjb2RlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBtX01hcFtjb2RlXSA9IEdldFVuaWNvZGUoKTsKKyAgICAgICAgICAgICAgbV9NdWx0aUNoYXJCdWYuQXBwZW5kQ2hhcihyZXRjb2RlLkdldExlbmd0aCgpKTsKKyAgICAgICAgICAgICAgbV9NdWx0aUNoYXJCdWYgPDwgcmV0Y29kZTsKKyAgICAgICAgICAgICAgZGVzdGNvZGUgPSByZXRjb2RlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAod29yZCA9PSAiL0Fkb2JlLUtvcmVhMS1VQ1MyIikgeworICAgICAgY2lkX3NldCA9IENJRFNFVF9LT1JFQTE7CisgICAgfSBlbHNlIGlmICh3b3JkID09ICIvQWRvYmUtSmFwYW4xLVVDUzIiKSB7CisgICAgICBjaWRfc2V0ID0gQ0lEU0VUX0pBUEFOMTsKKyAgICB9IGVsc2UgaWYgKHdvcmQgPT0gIi9BZG9iZS1DTlMxLVVDUzIiKSB7CisgICAgICBjaWRfc2V0ID0gQ0lEU0VUX0NOUzE7CisgICAgfSBlbHNlIGlmICh3b3JkID09ICIvQWRvYmUtR0IxLVVDUzIiKSB7CisgICAgICBjaWRfc2V0ID0gQ0lEU0VUX0dCMTsKKyAgICB9CisgIH0KKyAgaWYgKGNpZF9zZXQpIHsKKyAgICBtX3BCYXNlTWFwID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpCisgICAgICAgICAgICAgICAgICAgICAtPkdldFBhZ2VNb2R1bGUoKQorICAgICAgICAgICAgICAgICAgICAgLT5HZXRGb250R2xvYmFscygpCisgICAgICAgICAgICAgICAgICAgICAtPkdldENNYXBNYW5hZ2VyKCkKKyAgICAgICAgICAgICAgICAgICAgIC0+R2V0Q0lEMlVuaWNvZGVNYXAoY2lkX3NldCwgZmFsc2UpOworICB9IGVsc2UgeworICAgIG1fcEJhc2VNYXAgPSBudWxscHRyOworICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3RvdW5pY29kZW1hcC5oIGIvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl90b3VuaWNvZGVtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmZjNDcwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl90b3VuaWNvZGVtYXAuaApAQCAtMCwwICsxLDQyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GUERGQVBJX0ZPTlRfQ1BERl9UT1VOSUNPREVNQVBfSF8KKyNkZWZpbmUgQ09SRV9GUERGQVBJX0ZPTlRfQ1BERl9UT1VOSUNPREVNQVBfSF8KKworI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF93aWRldGV4dGJ1Zi5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKKworY2xhc3MgQ1BERl9DSUQyVW5pY29kZU1hcDsKKworY2xhc3MgQ1BERl9Ub1VuaWNvZGVNYXAgeworIHB1YmxpYzoKKyAgQ1BERl9Ub1VuaWNvZGVNYXAoKTsKKyAgfkNQREZfVG9Vbmljb2RlTWFwKCk7CisKKyAgdm9pZCBMb2FkKENQREZfU3RyZWFtKiBwU3RyZWFtKTsKKworICBXaWRlU3RyaW5nIExvb2t1cCh1aW50MzJfdCBjaGFyY29kZSkgY29uc3Q7CisgIHVpbnQzMl90IFJldmVyc2VMb29rdXAod2NoYXJfdCB1bmljb2RlKSBjb25zdDsKKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBjcGRmX3RvdW5pY29kZW1hcF9TdHJpbmdUb0NvZGVfVGVzdDsKKyAgZnJpZW5kIGNsYXNzIGNwZGZfdG91bmljb2RlbWFwX1N0cmluZ1RvV2lkZVN0cmluZ19UZXN0OworCisgIHN0YXRpYyB1aW50MzJfdCBTdHJpbmdUb0NvZGUoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN0cik7CisgIHN0YXRpYyBXaWRlU3RyaW5nIFN0cmluZ1RvV2lkZVN0cmluZyhjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyKTsKKworICB1aW50MzJfdCBHZXRVbmljb2RlKCk7CisKKyAgc3RkOjptYXA8dWludDMyX3QsIHVpbnQzMl90PiBtX01hcDsKKyAgVW5vd25lZFB0cjxDUERGX0NJRDJVbmljb2RlTWFwPiBtX3BCYXNlTWFwOworICBDRlhfV2lkZVRleHRCdWYgbV9NdWx0aUNoYXJCdWY7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9GT05UX0NQREZfVE9VTklDT0RFTUFQX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3RvdW5pY29kZW1hcF91bml0dGVzdC5jcHAgYi9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3RvdW5pY29kZW1hcF91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE1ZGMyNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfdG91bmljb2RlbWFwX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3RvdW5pY29kZW1hcC5oIgorCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK1RFU1QoY3BkZl90b3VuaWNvZGVtYXAsIFN0cmluZ1RvQ29kZSkgeworICBFWFBFQ1RfRVEoMHUsIENQREZfVG9Vbmljb2RlTWFwOjpTdHJpbmdUb0NvZGUoIiIpKTsKKyAgRVhQRUNUX0VRKDE5NHUsIENQREZfVG9Vbmljb2RlTWFwOjpTdHJpbmdUb0NvZGUoIjxjMiIpKTsKKyAgRVhQRUNUX0VRKDE2MnUsIENQREZfVG9Vbmljb2RlTWFwOjpTdHJpbmdUb0NvZGUoIjxBMiIpKTsKKyAgRVhQRUNUX0VRKDI4MDJ1LCBDUERGX1RvVW5pY29kZU1hcDo6U3RyaW5nVG9Db2RlKCI8QWYyIikpOworICBFWFBFQ1RfRVEoMTJ1LCBDUERGX1RvVW5pY29kZU1hcDo6U3RyaW5nVG9Db2RlKCIxMiIpKTsKKyAgRVhQRUNUX0VRKDEyOHUsIENQREZfVG9Vbmljb2RlTWFwOjpTdHJpbmdUb0NvZGUoIjEyOCIpKTsKK30KKworVEVTVChjcGRmX3RvdW5pY29kZW1hcCwgU3RyaW5nVG9XaWRlU3RyaW5nKSB7CisgIEVYUEVDVF9FUShMIiIsIENQREZfVG9Vbmljb2RlTWFwOjpTdHJpbmdUb1dpZGVTdHJpbmcoIiIpKTsKKyAgRVhQRUNUX0VRKEwiIiwgQ1BERl9Ub1VuaWNvZGVNYXA6OlN0cmluZ1RvV2lkZVN0cmluZygiMTIzNCIpKTsKKworICBFWFBFQ1RfRVEoTCIiLCBDUERGX1RvVW5pY29kZU1hcDo6U3RyaW5nVG9XaWRlU3RyaW5nKCI8YzIiKSk7CisKKyAgV2lkZVN0cmluZyByZXMgPSBMIlx4YzJhYiI7CisgIEVYUEVDVF9FUShyZXMsIENQREZfVG9Vbmljb2RlTWFwOjpTdHJpbmdUb1dpZGVTdHJpbmcoIjxjMmFiIikpOworICBFWFBFQ1RfRVEocmVzLCBDUERGX1RvVW5pY29kZU1hcDo6U3RyaW5nVG9XaWRlU3RyaW5nKCI8YzJhYmFiIikpOworICBFWFBFQ1RfRVEocmVzLCBDUERGX1RvVW5pY29kZU1hcDo6U3RyaW5nVG9XaWRlU3RyaW5nKCI8YzJhYiAxMjM0IikpOworCisgIHJlcyArPSBMIlx4ZmFhYiI7CisgIEVYUEVDVF9FUShyZXMsIENQREZfVG9Vbmljb2RlTWFwOjpTdHJpbmdUb1dpZGVTdHJpbmcoIjxjMmFiRmFBYiIpKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfdHJ1ZXR5cGVmb250LmNwcCBiL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfdHJ1ZXR5cGVmb250LmNwcAppbmRleCBiOGJlZTI5Li45MWMyMzhhIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3RydWV0eXBlZm9udC5jcHAKKysrIGIvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl90cnVldHlwZWZvbnQuY3BwCkBAIC02LDcgKzYsNiBAQAogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl90cnVldHlwZWZvbnQuaCIKIAotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2ZvbnRfaW50LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZm9udC5oIgogCkBAIC00Miw3ICs0MSw3IEBACiAgIGlmIChtX3BGb250RmlsZSAmJiBtX0ZvbnQuR2V0RmFjZSgpLT5udW1fY2hhcm1hcHMgPiAwICYmCiAgICAgICAoYmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfTUFDUk9NQU4gfHwKICAgICAgICBiYXNlRW5jb2RpbmcgPT0gUERGRk9OVF9FTkNPRElOR19XSU5BTlNJKSAmJgotICAgICAgKG1fRmxhZ3MgJiBGWEZPTlRfU1lNQk9MSUMpKSB7CisgICAgICBGb250U3R5bGVJc1N5bWJvbGljKG1fRmxhZ3MpKSB7CiAgICAgYm9vbCBiU3VwcG9ydFdpbiA9IGZhbHNlOwogICAgIGJvb2wgYlN1cHBvcnRNYWMgPSBmYWxzZTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcENvdW50KG1fRm9udC5HZXRGYWNlKCkpOyBpKyspIHsKQEAgLTY1LDcgKzY0LDcgQEAKICAgaWYgKCgoYmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfTUFDUk9NQU4gfHwKICAgICAgICAgYmFzZUVuY29kaW5nID09IFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSSkgJiYKICAgICAgICBtX0NoYXJOYW1lcy5lbXB0eSgpKSB8fAotICAgICAgKG1fRmxhZ3MgJiBGWEZPTlRfTk9OU1lNQk9MSUMpKSB7CisgICAgICBGb250U3R5bGVJc05vblN5bWJvbGljKG1fRmxhZ3MpKSB7CiAgICAgaWYgKCFGWEZUX0hhc19HbHlwaF9OYW1lcyhtX0ZvbnQuR2V0RmFjZSgpKSAmJgogICAgICAgICAoIW1fRm9udC5HZXRGYWNlKCktPm51bV9jaGFybWFwcyB8fCAhbV9Gb250LkdldEZhY2UoKS0+Y2hhcm1hcHMpKSB7CiAgICAgICBpbnQgblN0YXJ0Q2hhciA9IG1fcEZvbnREaWN0LT5HZXRJbnRlZ2VyRm9yKCJGaXJzdENoYXIiKTsKQEAgLTczLDIwICs3MiwxOCBAQAogICAgICAgICByZXR1cm47CiAKICAgICAgIGludCBjaGFyY29kZSA9IDA7Ci0gICAgICBmb3IgKDsgY2hhcmNvZGUgPCBuU3RhcnRDaGFyOyBjaGFyY29kZSsrKSB7CisgICAgICBmb3IgKDsgY2hhcmNvZGUgPCBuU3RhcnRDaGFyOyBjaGFyY29kZSsrKQogICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gMDsKLSAgICAgIH0KICAgICAgIHVpbnQxNl90IG5HbHlwaCA9IGNoYXJjb2RlIC0gblN0YXJ0Q2hhciArIDM7Ci0gICAgICBmb3IgKDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlKyssIG5HbHlwaCsrKSB7CisgICAgICBmb3IgKDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlKyssIG5HbHlwaCsrKQogICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gbkdseXBoOwotICAgICAgfQogICAgICAgcmV0dXJuOwogICAgIH0KICAgICBib29sIGJNU1VuaWNvZGUgPSBGVF9Vc2VUVENoYXJtYXAobV9Gb250LkdldEZhY2UoKSwgMywgMSk7CiAgICAgYm9vbCBiTWFjUm9tYW4gPSBmYWxzZTsKICAgICBib29sIGJNU1N5bWJvbCA9IGZhbHNlOwogICAgIGlmICghYk1TVW5pY29kZSkgewotICAgICAgaWYgKG1fRmxhZ3MgJiBGWEZPTlRfTk9OU1lNQk9MSUMpIHsKKyAgICAgIGlmIChGb250U3R5bGVJc05vblN5bWJvbGljKG1fRmxhZ3MpKSB7CiAgICAgICAgIGJNYWNSb21hbiA9IEZUX1VzZVRUQ2hhcm1hcChtX0ZvbnQuR2V0RmFjZSgpLCAxLCAwKTsKICAgICAgICAgYk1TU3ltYm9sID0gIWJNYWNSb21hbiAmJiBGVF9Vc2VUVENoYXJtYXAobV9Gb250LkdldEZhY2UoKSwgMywgMCk7CiAgICAgICB9IGVsc2UgewpAQCAtOTYsOCArOTMsNyBAQAogICAgIH0KICAgICBib29sIGJUb1VuaWNvZGUgPSBtX3BGb250RGljdC0+S2V5RXhpc3QoIlRvVW5pY29kZSIpOwogICAgIGZvciAoaW50IGNoYXJjb2RlID0gMDsgY2hhcmNvZGUgPCAyNTY7IGNoYXJjb2RlKyspIHsKLSAgICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUgPQotICAgICAgICAgIEdldEFkb2JlQ2hhck5hbWUoYmFzZUVuY29kaW5nLCBtX0NoYXJOYW1lcywgY2hhcmNvZGUpOworICAgICAgY29uc3QgY2hhciogbmFtZSA9IEdldEFkb2JlQ2hhck5hbWUoYmFzZUVuY29kaW5nLCBtX0NoYXJOYW1lcywgY2hhcmNvZGUpOwogICAgICAgaWYgKCFuYW1lKSB7CiAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPQogICAgICAgICAgICAgbV9wRm9udEZpbGUgPyBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5HZXRGYWNlKCksIGNoYXJjb2RlKSA6IC0xOwpAQCAtMTA5LDkgKzEwNSw4IEBACiAgICAgICAgICAgdWludDE2X3QgdW5pY29kZSA9IGtQcmVmaXhbal0gKiAyNTYgKyBjaGFyY29kZTsKICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0KICAgICAgICAgICAgICAgRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQuR2V0RmFjZSgpLCB1bmljb2RlKTsKLSAgICAgICAgICBpZiAobV9HbHlwaEluZGV4W2NoYXJjb2RlXSkgeworICAgICAgICAgIGlmIChtX0dseXBoSW5kZXhbY2hhcmNvZGVdKQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9IGVsc2UgaWYgKG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0pIHsKICAgICAgICAgaWYgKGJNU1VuaWNvZGUpIHsKQEAgLTEyOSwyOCArMTI0LDI0IEBACiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBpZiAoKG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPT0gMCB8fCBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID09IDB4ZmZmZikgJiYKLSAgICAgICAgICBuYW1lKSB7Ci0gICAgICAgIGlmIChuYW1lWzBdID09ICcuJyAmJiBGWFNZU19zdHJjbXAobmFtZSwgIi5ub3RkZWYiKSA9PSAwKSB7Ci0gICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250LkdldEZhY2UoKSwgMzIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPQotICAgICAgICAgICAgICBGWEZUX0dldF9OYW1lX0luZGV4KG1fRm9udC5HZXRGYWNlKCksIChjaGFyKiluYW1lKTsKLSAgICAgICAgICBpZiAobV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoYlRvVW5pY29kZSkgewotICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1VuaWNvZGUgPSBVbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKLSAgICAgICAgICAgICAgaWYgKCF3c1VuaWNvZGUuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9Ci0gICAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250LkdldEZhY2UoKSwgd3NVbmljb2RlWzBdKTsKLSAgICAgICAgICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gd3NVbmljb2RlWzBdOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9PSAwKSB7Ci0gICAgICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPQotICAgICAgICAgICAgICAgICAgRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQuR2V0RmFjZSgpLCBjaGFyY29kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9CisgICAgICBpZiAoKG1fR2x5cGhJbmRleFtjaGFyY29kZV0gIT0gMCAmJiBtX0dseXBoSW5kZXhbY2hhcmNvZGVdICE9IDB4ZmZmZikgfHwKKyAgICAgICAgICAhbmFtZSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJjbXAobmFtZSwgIi5ub3RkZWYiKSA9PSAwKSB7CisgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5HZXRGYWNlKCksIDMyKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0KKyAgICAgICAgICBGWEZUX0dldF9OYW1lX0luZGV4KG1fRm9udC5HZXRGYWNlKCksIChjaGFyKiluYW1lKTsKKyAgICAgIGlmIChtX0dseXBoSW5kZXhbY2hhcmNvZGVdICE9IDAgfHwgIWJUb1VuaWNvZGUpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBXaWRlU3RyaW5nIHdzVW5pY29kZSA9IFVuaWNvZGVGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOworICAgICAgaWYgKCF3c1VuaWNvZGUuSXNFbXB0eSgpKSB7CisgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPQorICAgICAgICAgICAgRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQuR2V0RmFjZSgpLCB3c1VuaWNvZGVbMF0pOworICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gd3NVbmljb2RlWzBdOwogICAgICAgfQogICAgIH0KICAgICByZXR1cm47CkBAIC0xNzAsNyArMTYxLDcgQEAKICAgICBpZiAoYkZvdW5kKSB7CiAgICAgICBpZiAoYmFzZUVuY29kaW5nICE9IFBERkZPTlRfRU5DT0RJTkdfQlVJTFRJTikgewogICAgICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSsrKSB7Ci0gICAgICAgICAgY29uc3QgRlhfQ0hBUiogbmFtZSA9CisgICAgICAgICAgY29uc3QgY2hhciogbmFtZSA9CiAgICAgICAgICAgICAgIEdldEFkb2JlQ2hhck5hbWUoYmFzZUVuY29kaW5nLCBtX0NoYXJOYW1lcywgY2hhcmNvZGUpOwogICAgICAgICAgIGlmIChuYW1lKQogICAgICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShuYW1lKTsKQEAgLTIwNCw3ICsxOTUsNyBAQAogICAgICAgaWYgKG1fcEZvbnRGaWxlKSB7CiAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSBjaGFyY29kZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUgPSBHZXRBZG9iZUNoYXJOYW1lKDAsIG1fQ2hhck5hbWVzLCBjaGFyY29kZSk7CisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBHZXRBZG9iZUNoYXJOYW1lKDAsIG1fQ2hhck5hbWVzLCBjaGFyY29kZSk7CiAgICAgICAgIGlmIChuYW1lKQogICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSBQREZfVW5pY29kZUZyb21BZG9iZU5hbWUobmFtZSk7CiAgICAgICAgIGVsc2UgaWYgKHBVbmljb2RlcykKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfdHlwZTFmb250LmNwcCBiL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfdHlwZTFmb250LmNwcAppbmRleCAxYTM3NTU1Li43Nzk4N2JiIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3R5cGUxZm9udC5jcHAKKysrIGIvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl90eXBlMWZvbnQuY3BwCkBAIC02LDIxICs2LDIyIEBACiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3R5cGUxZm9udC5oIgogCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvZm9udF9pbnQuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZ2Vtb2R1bGUuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKIAotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCiAjaW5jbHVkZSAiY29yZS9meGdlL2FwcGxlL2FwcGxlX2ludC5oIgogI2VuZGlmCiAKIG5hbWVzcGFjZSB7CiAKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXwogc3RydWN0IEdseXBoTmFtZU1hcCB7Ci0gIGNvbnN0IEZYX0NIQVIqIG1fcFN0ckFkb2JlOwotICBjb25zdCBGWF9DSEFSKiBtX3BTdHJVbmljb2RlOworICBjb25zdCBjaGFyKiBtX3BTdHJBZG9iZTsKKyAgY29uc3QgY2hhciogbV9wU3RyVW5pY29kZTsKIH07CiAKIGNvbnN0IEdseXBoTmFtZU1hcCBnX0dseXBoTmFtZVN1YnN0c1tdID0ge3siZmYiLCAidW5pRkIwMCJ9LApAQCAtMjksMTkgKzMwLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImZpIiwgInVuaUZCMDEifSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZmwiLCAidW5pRkIwMiJ9fTsKIAotaW50IGNvbXBhcmVTdHJpbmcoY29uc3Qgdm9pZCoga2V5LCBjb25zdCB2b2lkKiBlbGVtZW50KSB7Ci0gIHJldHVybiBGWFNZU19zdHJpY21wKHN0YXRpY19jYXN0PGNvbnN0IEZYX0NIQVIqPihrZXkpLAotICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHbHlwaE5hbWVNYXAqPihlbGVtZW50KS0+bV9wU3RyQWRvYmUpOworY29uc3QgY2hhciogR2x5cGhOYW1lUmVtYXAoY29uc3QgY2hhciogcFN0ckFkb2JlKSB7CisgIGZvciAoY29uc3QgYXV0byYgZWxlbWVudCA6IGdfR2x5cGhOYW1lU3Vic3RzKSB7CisgICAgaWYgKCFGWFNZU19zdHJpY21wKGVsZW1lbnQubV9wU3RyQWRvYmUsIHBTdHJBZG9iZSkpCisgICAgICByZXR1cm4gZWxlbWVudC5tX3BTdHJVbmljb2RlOworICB9CisgIHJldHVybiBudWxscHRyOwogfQogCi1jb25zdCBGWF9DSEFSKiBHbHlwaE5hbWVSZW1hcChjb25zdCBGWF9DSEFSKiBwU3RyQWRvYmUpIHsKLSAgY29uc3QgR2x5cGhOYW1lTWFwKiBmb3VuZCA9IHN0YXRpY19jYXN0PGNvbnN0IEdseXBoTmFtZU1hcCo+KEZYU1lTX2JzZWFyY2goCi0gICAgICBwU3RyQWRvYmUsIGdfR2x5cGhOYW1lU3Vic3RzLCBGWF9BcnJheVNpemUoZ19HbHlwaE5hbWVTdWJzdHMpLAotICAgICAgc2l6ZW9mKEdseXBoTmFtZU1hcCksIGNvbXBhcmVTdHJpbmcpKTsKLSAgcmV0dXJuIGZvdW5kID8gZm91bmQtPm1fcFN0clVuaWNvZGUgOiBudWxscHRyOwotfQotCi0jZW5kaWYgIC8vIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisjZW5kaWYgIC8vIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXwogCiBib29sIEZUX1VzZVR5cGUxQ2hhcm1hcChGWEZUX0ZhY2UgZmFjZSkgewogICBpZiAoRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQoZmFjZSkgPT0gMCkgewpAQCAtOTQsNyArOTEsNyBAQAogICAgICAgbV9CYXNlRW5jb2RpbmcgPSBQREZGT05UX0VOQ09ESU5HX0FET0JFX1NZTUJPTDsKICAgICBlbHNlIGlmIChtX0Jhc2UxNEZvbnQgPT0gMTMpCiAgICAgICBtX0Jhc2VFbmNvZGluZyA9IFBERkZPTlRfRU5DT0RJTkdfWkFQRkRJTkdCQVRTOwotICAgIGVsc2UgaWYgKG1fRmxhZ3MgJiBGWEZPTlRfTk9OU1lNQk9MSUMpCisgICAgZWxzZSBpZiAoRm9udFN0eWxlSXNOb25TeW1ib2xpYyhtX0ZsYWdzKSkKICAgICAgIG1fQmFzZUVuY29kaW5nID0gUERGRk9OVF9FTkNPRElOR19TVEFOREFSRDsKICAgfQogICByZXR1cm4gTG9hZENvbW1vbigpOwpAQCAtMTE1LDcgKzExMiw3IEBACiAgIGlmICghbV9Gb250LkdldEZhY2UoKSkKICAgICByZXR1cm47CiAKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXwogICBib29sIGJDb3JlVGV4dCA9IHRydWU7CiAgIENRdWFydHoyRCYgcXVhcnR6MmQgPQogICAgICAgc3RhdGljX2Nhc3Q8Q0FwcGxlUGxhdGZvcm0qPihDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSkKQEAgLTEzOSw3ICsxMzYsNyBAQAogICAgICAgICAgIHVpbnQxNl90IHVuaWNvZGUgPSBwcmVmaXhbal0gKiAyNTYgKyBjaGFyY29kZTsKICAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0KICAgICAgICAgICAgICAgRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQuR2V0RmFjZSgpLCB1bmljb2RlKTsKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXwogICAgICAgICAgIENhbGNFeHRHSUQoY2hhcmNvZGUpOwogI2VuZGlmCiAgICAgICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0pIHsKQEAgLTE0OSwxOSArMTQ2LDE5IEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIGlmIChiR290T25lKSB7Ci0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9BUFBMRV8KICAgICAgICAgaWYgKCFiQ29yZVRleHQpCi0gICAgICAgICAgRlhTWVNfbWVtY3B5KG1fRXh0R0lELCBtX0dseXBoSW5kZXgsIDI1Nik7CisgICAgICAgICAgbWVtY3B5KG1fRXh0R0lELCBtX0dseXBoSW5kZXgsIDI1Nik7CiAjZW5kaWYKICAgICAgICAgcmV0dXJuOwogICAgICAgfQogICAgIH0KICAgICBGWEZUX1NlbGVjdF9DaGFybWFwKG1fRm9udC5HZXRGYWNlKCksIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSk7Ci0gICAgaWYgKG1fQmFzZUVuY29kaW5nID09IDApIHsKKyAgICBpZiAobV9CYXNlRW5jb2RpbmcgPT0gMCkKICAgICAgIG1fQmFzZUVuY29kaW5nID0gUERGRk9OVF9FTkNPRElOR19TVEFOREFSRDsKLSAgICB9CisKICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSsrKSB7Ci0gICAgICBjb25zdCBGWF9DSEFSKiBuYW1lID0KKyAgICAgIGNvbnN0IGNoYXIqIG5hbWUgPQogICAgICAgICAgIEdldEFkb2JlQ2hhck5hbWUobV9CYXNlRW5jb2RpbmcsIG1fQ2hhck5hbWVzLCBjaGFyY29kZSk7CiAgICAgICBpZiAoIW5hbWUpCiAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTY5LDE2MSArMTY2LDE1OCBAQAogICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShuYW1lKTsKICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KAogICAgICAgICAgIG1fRm9udC5HZXRGYWNlKCksIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0pOwotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCiAgICAgICBDYWxjRXh0R0lEKGNoYXJjb2RlKTsKICNlbmRpZgotICAgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPT0gMCAmJiBGWFNZU19zdHJjbXAobmFtZSwgIi5ub3RkZWYiKSA9PSAwKSB7CisgICAgICBpZiAobV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9PSAwICYmIHN0cmNtcChuYW1lLCAiLm5vdGRlZiIpID09IDApIHsKICAgICAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IDB4MjA7CiAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5HZXRGYWNlKCksIDB4MjApOwotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCiAgICAgICAgIENhbGNFeHRHSUQoY2hhcmNvZGUpOwogI2VuZGlmCiAgICAgICB9CiAgICAgfQotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCiAgICAgaWYgKCFiQ29yZVRleHQpCi0gICAgICBGWFNZU19tZW1jcHkobV9FeHRHSUQsIG1fR2x5cGhJbmRleCwgMjU2KTsKKyAgICAgIG1lbWNweShtX0V4dEdJRCwgbV9HbHlwaEluZGV4LCAyNTYpOwogI2VuZGlmCiAgICAgcmV0dXJuOwogICB9CiAgIEZUX1VzZVR5cGUxQ2hhcm1hcChtX0ZvbnQuR2V0RmFjZSgpKTsKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXwogICBpZiAoYkNvcmVUZXh0KSB7Ci0gICAgaWYgKG1fRmxhZ3MgJiBGWEZPTlRfU1lNQk9MSUMpIHsKKyAgICBpZiAoRm9udFN0eWxlSXNTeW1ib2xpYyhtX0ZsYWdzKSkgewogICAgICAgZm9yIChpbnQgY2hhcmNvZGUgPSAwOyBjaGFyY29kZSA8IDI1NjsgY2hhcmNvZGUrKykgewotICAgICAgICBjb25zdCBGWF9DSEFSKiBuYW1lID0KKyAgICAgICAgY29uc3QgY2hhciogbmFtZSA9CiAgICAgICAgICAgICBHZXRBZG9iZUNoYXJOYW1lKG1fQmFzZUVuY29kaW5nLCBtX0NoYXJOYW1lcywgY2hhcmNvZGUpOwogICAgICAgICBpZiAobmFtZSkgewogICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSBQREZfVW5pY29kZUZyb21BZG9iZU5hbWUobmFtZSk7CiAgICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9Ci0gICAgICAgICAgICAgIEZYRlRfR2V0X05hbWVfSW5kZXgobV9Gb250LkdldEZhY2UoKSwgKGNoYXIqKW5hbWUpOworICAgICAgICAgICAgICBGWEZUX0dldF9OYW1lX0luZGV4KG1fRm9udC5HZXRGYWNlKCksIGNvbnN0X2Nhc3Q8Y2hhcio+KG5hbWUpKTsKICAgICAgICAgICBTZXRFeHRHSUQobmFtZSwgY2hhcmNvZGUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPQogICAgICAgICAgICAgICBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5HZXRGYWNlKCksIGNoYXJjb2RlKTsKLSAgICAgICAgICBGWF9XQ0hBUiB1bmljb2RlID0gMDsKKyAgICAgICAgICB3Y2hhcl90IHVuaWNvZGUgPSAwOwogICAgICAgICAgIGlmIChtX0dseXBoSW5kZXhbY2hhcmNvZGVdKSB7CiAgICAgICAgICAgICB1bmljb2RlID0KICAgICAgICAgICAgICAgICBGVF9Vbmljb2RlRnJvbUNoYXJDb2RlKFBERkZPTlRfRU5DT0RJTkdfU1RBTkRBUkQsIGNoYXJjb2RlKTsKICAgICAgICAgICB9Ci0gICAgICAgICAgRlhfQ0hBUiBuYW1lX2dseXBoWzI1Nl07Ci0gICAgICAgICAgRlhTWVNfbWVtc2V0KG5hbWVfZ2x5cGgsIDAsIHNpemVvZihuYW1lX2dseXBoKSk7CisgICAgICAgICAgY2hhciBuYW1lX2dseXBoWzI1Nl07CisgICAgICAgICAgbWVtc2V0KG5hbWVfZ2x5cGgsIDAsIHNpemVvZihuYW1lX2dseXBoKSk7CiAgICAgICAgICAgRlhGVF9HZXRfR2x5cGhfTmFtZShtX0ZvbnQuR2V0RmFjZSgpLCBtX0dseXBoSW5kZXhbY2hhcmNvZGVdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9nbHlwaCwgMjU2KTsKICAgICAgICAgICBuYW1lX2dseXBoWzI1NV0gPSAwOwotICAgICAgICAgIGlmICh1bmljb2RlID09IDAgJiYgbmFtZV9nbHlwaFswXSAhPSAwKSB7CisgICAgICAgICAgaWYgKHVuaWNvZGUgPT0gMCAmJiBuYW1lX2dseXBoWzBdICE9IDApCiAgICAgICAgICAgICB1bmljb2RlID0gUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKG5hbWVfZ2x5cGgpOwotICAgICAgICAgIH0KKwogICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSB1bmljb2RlOwogICAgICAgICAgIFNldEV4dEdJRChuYW1lX2dseXBoLCBjaGFyY29kZSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgYm9vbCBiVW5pY29kZSA9IGZhbHNlOwotICAgIGlmICgwID09IEZYRlRfU2VsZWN0X0NoYXJtYXAobV9Gb250LkdldEZhY2UoKSwgRlhGVF9FTkNPRElOR19VTklDT0RFKSkgewotICAgICAgYlVuaWNvZGUgPSB0cnVlOwotICAgIH0KKworICAgIGJvb2wgYlVuaWNvZGUgPQorICAgICAgICBGWEZUX1NlbGVjdF9DaGFybWFwKG1fRm9udC5HZXRGYWNlKCksIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkgPT0gMDsKICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSsrKSB7Ci0gICAgICBjb25zdCBGWF9DSEFSKiBuYW1lID0KKyAgICAgIGNvbnN0IGNoYXIqIG5hbWUgPQogICAgICAgICAgIEdldEFkb2JlQ2hhck5hbWUobV9CYXNlRW5jb2RpbmcsIG1fQ2hhck5hbWVzLCBjaGFyY29kZSk7Ci0gICAgICBpZiAoIW5hbWUpIHsKKyAgICAgIGlmICghbmFtZSkKICAgICAgICAgY29udGludWU7Ci0gICAgICB9CisKICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSBQREZfVW5pY29kZUZyb21BZG9iZU5hbWUobmFtZSk7Ci0gICAgICBjb25zdCBGWF9DSEFSKiBwU3RyVW5pY29kZSA9IEdseXBoTmFtZVJlbWFwKG5hbWUpOworICAgICAgY29uc3QgY2hhciogcFN0clVuaWNvZGUgPSBHbHlwaE5hbWVSZW1hcChuYW1lKTsKICAgICAgIGlmIChwU3RyVW5pY29kZSAmJgotICAgICAgICAgIDAgPT0gRlhGVF9HZXRfTmFtZV9JbmRleChtX0ZvbnQuR2V0RmFjZSgpLCAoY2hhciopbmFtZSkpIHsKKyAgICAgICAgICBGWEZUX0dldF9OYW1lX0luZGV4KG1fRm9udC5HZXRGYWNlKCksIGNvbnN0X2Nhc3Q8Y2hhcio+KG5hbWUpKSA9PSAwKSB7CiAgICAgICAgIG5hbWUgPSBwU3RyVW5pY29kZTsKICAgICAgIH0KICAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPQotICAgICAgICAgIEZYRlRfR2V0X05hbWVfSW5kZXgobV9Gb250LkdldEZhY2UoKSwgKGNoYXIqKW5hbWUpOworICAgICAgICAgIEZYRlRfR2V0X05hbWVfSW5kZXgobV9Gb250LkdldEZhY2UoKSwgY29uc3RfY2FzdDxjaGFyKj4obmFtZSkpOwogICAgICAgU2V0RXh0R0lEKG5hbWUsIGNoYXJjb2RlKTsKLSAgICAgIGlmIChtX0dseXBoSW5kZXhbY2hhcmNvZGVdID09IDApIHsKLSAgICAgICAgaWYgKEZYU1lTX3N0cmNtcChuYW1lLCAiLm5vdGRlZiIpICE9IDAgJiYKLSAgICAgICAgICAgIEZYU1lTX3N0cmNtcChuYW1lLCAic3BhY2UiKSAhPSAwKSB7Ci0gICAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X0NoYXJfSW5kZXgoCi0gICAgICAgICAgICAgIG1fRm9udC5HZXRGYWNlKCksCi0gICAgICAgICAgICAgIGJVbmljb2RlID8gbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA6IGNoYXJjb2RlKTsKLSAgICAgICAgICBDYWxjRXh0R0lEKGNoYXJjb2RlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gMHgyMDsKLSAgICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0KLSAgICAgICAgICAgICAgYlVuaWNvZGUgPyBGWEZUX0dldF9DaGFyX0luZGV4KG1fRm9udC5HZXRGYWNlKCksIDB4MjApIDogMHhmZmZmOwotICAgICAgICAgIENhbGNFeHRHSUQoY2hhcmNvZGUpOwotICAgICAgICB9CisgICAgICBpZiAobV9HbHlwaEluZGV4W2NoYXJjb2RlXSAhPSAwKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgaWYgKHN0cmNtcChuYW1lLCAiLm5vdGRlZiIpICE9IDAgJiYgc3RyY21wKG5hbWUsICJzcGFjZSIpICE9IDApIHsKKyAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IEZYRlRfR2V0X0NoYXJfSW5kZXgoCisgICAgICAgICAgICBtX0ZvbnQuR2V0RmFjZSgpLAorICAgICAgICAgICAgYlVuaWNvZGUgPyBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdIDogY2hhcmNvZGUpOworICAgICAgICBDYWxjRXh0R0lEKGNoYXJjb2RlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSAweDIwOworICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0KKyAgICAgICAgICAgIGJVbmljb2RlID8gRlhGVF9HZXRfQ2hhcl9JbmRleChtX0ZvbnQuR2V0RmFjZSgpLCAweDIwKSA6IDB4ZmZmZjsKKyAgICAgICAgQ2FsY0V4dEdJRChjaGFyY29kZSk7CiAgICAgICB9CiAgICAgfQogICAgIHJldHVybjsKICAgfQotI2VuZGlmICAvLyBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICBpZiAobV9GbGFncyAmIEZYRk9OVF9TWU1CT0xJQykgeworI2VuZGlmICAvLyBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9BUFBMRV8KKyAgaWYgKEZvbnRTdHlsZUlzU3ltYm9saWMobV9GbGFncykpIHsKICAgICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSsrKSB7Ci0gICAgICBjb25zdCBGWF9DSEFSKiBuYW1lID0KKyAgICAgIGNvbnN0IGNoYXIqIG5hbWUgPQogICAgICAgICAgIEdldEFkb2JlQ2hhck5hbWUobV9CYXNlRW5jb2RpbmcsIG1fQ2hhck5hbWVzLCBjaGFyY29kZSk7CiAgICAgICBpZiAobmFtZSkgewogICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gUERGX1VuaWNvZGVGcm9tQWRvYmVOYW1lKG5hbWUpOwogICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0KLSAgICAgICAgICAgIEZYRlRfR2V0X05hbWVfSW5kZXgobV9Gb250LkdldEZhY2UoKSwgKGNoYXIqKW5hbWUpOworICAgICAgICAgICAgRlhGVF9HZXRfTmFtZV9JbmRleChtX0ZvbnQuR2V0RmFjZSgpLCBjb25zdF9jYXN0PGNoYXIqPihuYW1lKSk7CiAgICAgICB9IGVsc2UgewogICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0KICAgICAgICAgICAgIEZYRlRfR2V0X0NoYXJfSW5kZXgobV9Gb250LkdldEZhY2UoKSwgY2hhcmNvZGUpOwogICAgICAgICBpZiAobV9HbHlwaEluZGV4W2NoYXJjb2RlXSkgewotICAgICAgICAgIEZYX1dDSEFSIHVuaWNvZGUgPQorICAgICAgICAgIHdjaGFyX3QgdW5pY29kZSA9CiAgICAgICAgICAgICAgIEZUX1VuaWNvZGVGcm9tQ2hhckNvZGUoUERGRk9OVF9FTkNPRElOR19TVEFOREFSRCwgY2hhcmNvZGUpOwogICAgICAgICAgIGlmICh1bmljb2RlID09IDApIHsKLSAgICAgICAgICAgIEZYX0NIQVIgbmFtZV9nbHlwaFsyNTZdOwotICAgICAgICAgICAgRlhTWVNfbWVtc2V0KG5hbWVfZ2x5cGgsIDAsIHNpemVvZihuYW1lX2dseXBoKSk7CisgICAgICAgICAgICBjaGFyIG5hbWVfZ2x5cGhbMjU2XTsKKyAgICAgICAgICAgIG1lbXNldChuYW1lX2dseXBoLCAwLCBzaXplb2YobmFtZV9nbHlwaCkpOwogICAgICAgICAgICAgRlhGVF9HZXRfR2x5cGhfTmFtZShtX0ZvbnQuR2V0RmFjZSgpLCBtX0dseXBoSW5kZXhbY2hhcmNvZGVdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2dseXBoLCAyNTYpOwogICAgICAgICAgICAgbmFtZV9nbHlwaFsyNTVdID0gMDsKLSAgICAgICAgICAgIGlmIChuYW1lX2dseXBoWzBdICE9IDApIHsKKyAgICAgICAgICAgIGlmIChuYW1lX2dseXBoWzBdICE9IDApCiAgICAgICAgICAgICAgIHVuaWNvZGUgPSBQREZfVW5pY29kZUZyb21BZG9iZU5hbWUobmFtZV9nbHlwaCk7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICAgIG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gPSB1bmljb2RlOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCiAgICAgaWYgKCFiQ29yZVRleHQpCi0gICAgICBGWFNZU19tZW1jcHkobV9FeHRHSUQsIG1fR2x5cGhJbmRleCwgMjU2KTsKKyAgICAgIG1lbWNweShtX0V4dEdJRCwgbV9HbHlwaEluZGV4LCAyNTYpOwogCiAjZW5kaWYKICAgICByZXR1cm47CiAgIH0KLSAgYm9vbCBiVW5pY29kZSA9IGZhbHNlOwotICBpZiAoMCA9PSBGWEZUX1NlbGVjdF9DaGFybWFwKG1fRm9udC5HZXRGYWNlKCksIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkpIHsKLSAgICBiVW5pY29kZSA9IHRydWU7Ci0gIH0KKworICBib29sIGJVbmljb2RlID0KKyAgICAgIEZYRlRfU2VsZWN0X0NoYXJtYXAobV9Gb250LkdldEZhY2UoKSwgRlhGVF9FTkNPRElOR19VTklDT0RFKSA9PSAwOwogICBmb3IgKGludCBjaGFyY29kZSA9IDA7IGNoYXJjb2RlIDwgMjU2OyBjaGFyY29kZSsrKSB7Ci0gICAgY29uc3QgRlhfQ0hBUiogbmFtZSA9Ci0gICAgICAgIEdldEFkb2JlQ2hhck5hbWUobV9CYXNlRW5jb2RpbmcsIG1fQ2hhck5hbWVzLCBjaGFyY29kZSk7Ci0gICAgaWYgKCFuYW1lKSB7CisgICAgY29uc3QgY2hhciogbmFtZSA9IEdldEFkb2JlQ2hhck5hbWUobV9CYXNlRW5jb2RpbmcsIG1fQ2hhck5hbWVzLCBjaGFyY29kZSk7CisgICAgaWYgKCFuYW1lKQogICAgICAgY29udGludWU7Ci0gICAgfQorCiAgICAgbV9FbmNvZGluZy5tX1VuaWNvZGVzW2NoYXJjb2RlXSA9IFBERl9Vbmljb2RlRnJvbUFkb2JlTmFtZShuYW1lKTsKLSAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfTmFtZV9JbmRleChtX0ZvbnQuR2V0RmFjZSgpLCAoY2hhciopbmFtZSk7Ci0gICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPT0gMCkgewotICAgICAgaWYgKEZYU1lTX3N0cmNtcChuYW1lLCAiLm5vdGRlZiIpICE9IDAgJiYKLSAgICAgICAgICBGWFNZU19zdHJjbXAobmFtZSwgInNwYWNlIikgIT0gMCkgewotICAgICAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0gRlhGVF9HZXRfQ2hhcl9JbmRleCgKLSAgICAgICAgICAgIG1fRm9udC5HZXRGYWNlKCksCi0gICAgICAgICAgICBiVW5pY29kZSA/IG1fRW5jb2RpbmcubV9Vbmljb2Rlc1tjaGFyY29kZV0gOiBjaGFyY29kZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gMHgyMDsKLSAgICAgICAgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSA9IDB4ZmZmZjsKLSAgICAgIH0KKyAgICBtX0dseXBoSW5kZXhbY2hhcmNvZGVdID0KKyAgICAgICAgRlhGVF9HZXRfTmFtZV9JbmRleChtX0ZvbnQuR2V0RmFjZSgpLCBjb25zdF9jYXN0PGNoYXIqPihuYW1lKSk7CisgICAgaWYgKG1fR2x5cGhJbmRleFtjaGFyY29kZV0gIT0gMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKHN0cmNtcChuYW1lLCAiLm5vdGRlZiIpICE9IDAgJiYgc3RyY21wKG5hbWUsICJzcGFjZSIpICE9IDApIHsKKyAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSBGWEZUX0dldF9DaGFyX0luZGV4KAorICAgICAgICAgIG1fRm9udC5HZXRGYWNlKCksCisgICAgICAgICAgYlVuaWNvZGUgPyBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdIDogY2hhcmNvZGUpOworICAgIH0gZWxzZSB7CisgICAgICBtX0VuY29kaW5nLm1fVW5pY29kZXNbY2hhcmNvZGVdID0gMHgyMDsKKyAgICAgIG1fR2x5cGhJbmRleFtjaGFyY29kZV0gPSAweGZmZmY7CiAgICAgfQogICB9Ci0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9BUFBMRV8KICAgaWYgKCFiQ29yZVRleHQpCi0gICAgRlhTWVNfbWVtY3B5KG1fRXh0R0lELCBtX0dseXBoSW5kZXgsIDI1Nik7CisgICAgbWVtY3B5KG1fRXh0R0lELCBtX0dseXBoSW5kZXgsIDI1Nik7CiAjZW5kaWYKIH0KIAotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi12b2lkIENQREZfVHlwZTFGb250OjpTZXRFeHRHSUQoY29uc3QgRlhfQ0hBUiogbmFtZSwgaW50IGNoYXJjb2RlKSB7CisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCit2b2lkIENQREZfVHlwZTFGb250OjpTZXRFeHRHSUQoY29uc3QgY2hhciogbmFtZSwgaW50IGNoYXJjb2RlKSB7CiAgIENGU3RyaW5nUmVmIG5hbWVfY3QgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nTm9Db3B5KAogICAgICAga0NGQWxsb2NhdG9yRGVmYXVsdCwgbmFtZSwga0NGU3RyaW5nRW5jb2RpbmdBU0NJSSwga0NGQWxsb2NhdG9yTnVsbCk7CiAgIG1fRXh0R0lEW2NoYXJjb2RlXSA9CkBAIC0zMzMsMTAgKzMyNywxMCBAQAogfQogCiB2b2lkIENQREZfVHlwZTFGb250OjpDYWxjRXh0R0lEKGludCBjaGFyY29kZSkgewotICBGWF9DSEFSIG5hbWVfZ2x5cGhbMjU2XTsKKyAgY2hhciBuYW1lX2dseXBoWzI1Nl07CiAgIEZYRlRfR2V0X0dseXBoX05hbWUobV9Gb250LkdldEZhY2UoKSwgbV9HbHlwaEluZGV4W2NoYXJjb2RlXSwgbmFtZV9nbHlwaCwKICAgICAgICAgICAgICAgICAgICAgICAyNTYpOwogICBuYW1lX2dseXBoWzI1NV0gPSAwOwogICBTZXRFeHRHSUQobmFtZV9nbHlwaCwgY2hhcmNvZGUpOwogfQotI2VuZGlmICAvLyBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworI2VuZGlmICAvLyBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9BUFBMRV8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfdHlwZTFmb250LmggYi9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3R5cGUxZm9udC5oCmluZGV4IGY1ZjM3ODUuLjc2YzQ5NjIgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfdHlwZTFmb250LmgKKysrIGIvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl90eXBlMWZvbnQuaApAQCAtMjksOCArMjksOCBAQAogICAvLyBDUERGX1NpbXBsZUZvbnQ6CiAgIHZvaWQgTG9hZEdseXBoTWFwKCkgb3ZlcnJpZGU7CiAKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICB2b2lkIFNldEV4dEdJRChjb25zdCBGWF9DSEFSKiBuYW1lLCBpbnQgY2hhcmNvZGUpOworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXworICB2b2lkIFNldEV4dEdJRChjb25zdCBjaGFyKiBuYW1lLCBpbnQgY2hhcmNvZGUpOwogICB2b2lkIENhbGNFeHRHSUQoaW50IGNoYXJjb2RlKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3R5cGUzY2hhci5jcHAgYi9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3R5cGUzY2hhci5jcHAKaW5kZXggNWViMTJjMS4uOGE4OTU4MiAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl90eXBlM2NoYXIuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfdHlwZTNjaGFyLmNwcApAQCAtNiwxNyArNiwzNiBAQAogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl90eXBlM2NoYXIuaCIKIAorI2luY2x1ZGUgPHV0aWxpdHk+CisKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2Zvcm0uaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2ltYWdlLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9pbWFnZW9iamVjdC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW9iamVjdC5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2RpYml0bWFwLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgogCi1DUERGX1R5cGUzQ2hhcjo6Q1BERl9UeXBlM0NoYXIoQ1BERl9Gb3JtKiBwRm9ybSkKLSAgICA6IG1fcEZvcm0ocEZvcm0pLCBtX2JDb2xvcmVkKGZhbHNlKSB7fQorbmFtZXNwYWNlIHsKKworY29uc3RleHByIGZsb2F0IGtUZXh0VW5pdEluR2x5cGhVbml0ID0gMTAwMC4wZjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NQREZfVHlwZTNDaGFyOjpDUERGX1R5cGUzQ2hhcihzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Gb3JtPiBwRm9ybSkKKyAgICA6IG1fcEZvcm0oc3RkOjptb3ZlKHBGb3JtKSkge30KIAogQ1BERl9UeXBlM0NoYXI6On5DUERGX1R5cGUzQ2hhcigpIHt9CiAKKy8vIHN0YXRpYworZmxvYXQgQ1BERl9UeXBlM0NoYXI6OlRleHRVbml0VG9HbHlwaFVuaXQoZmxvYXQgZlRleHRVbml0KSB7CisgIHJldHVybiBmVGV4dFVuaXQgKiBrVGV4dFVuaXRJbkdseXBoVW5pdDsKK30KKworLy8gc3RhdGljCit2b2lkIENQREZfVHlwZTNDaGFyOjpUZXh0VW5pdFJlY3RUb0dseXBoVW5pdFJlY3QoQ0ZYX0Zsb2F0UmVjdCogcFJlY3QpIHsKKyAgcFJlY3QtPlNjYWxlKGtUZXh0VW5pdEluR2x5cGhVbml0KTsKK30KKwogYm9vbCBDUERGX1R5cGUzQ2hhcjo6TG9hZEJpdG1hcChDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0KSB7CiAgIGlmIChtX3BCaXRtYXAgfHwgIW1fcEZvcm0pCiAgICAgcmV0dXJuIHRydWU7CkBAIC0yOSwxMCArNDgsNTcgQEAKICAgICByZXR1cm4gZmFsc2U7CiAKICAgbV9JbWFnZU1hdHJpeCA9IHBQYWdlT2JqLT5Bc0ltYWdlKCktPm1hdHJpeCgpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQlNvdXJjZT4gcFNvdXJjZSA9Ci0gICAgICBwUGFnZU9iai0+QXNJbWFnZSgpLT5HZXRJbWFnZSgpLT5Mb2FkRElCU291cmNlKCk7Ci0gIGlmIChwU291cmNlKQotICAgIG1fcEJpdG1hcCA9IHBTb3VyY2UtPkNsb25lKCk7CisgIHsKKyAgICAvLyB8cFNvdXJjZXwgYWN0dWFsbHkgZ2V0cyBhc3NpZ25lZCBhIENQREZfRElCU291cmNlLCB3aGljaCBoYXMgcG9pbnRlcnMKKyAgICAvLyBpbnRvIG9iamVjdHMgb3duZWQgYnkgfG1fcEZvcm18LiBNYWtlIHN1cmUgaXQgaXMgb3V0IG9mIHNjb3BlIGJlZm9yZQorICAgIC8vIGNsZWFyaW5nIHRoZSBmb3JtLgorICAgIFJldGFpblB0cjxDRlhfRElCU291cmNlPiBwU291cmNlID0KKyAgICAgICAgcFBhZ2VPYmotPkFzSW1hZ2UoKS0+R2V0SW1hZ2UoKS0+TG9hZERJQlNvdXJjZSgpOworCisgICAgLy8gQ2xvbmUoKSBpcyBub24tdmlydHVhbCwgYW5kIGNhbid0IGJlIG92ZXJsb2FkZWQgYnkgQ1BERl9ESUJTb3VyY2UgdG8KKyAgICAvLyByZXR1cm4gYSBjbG9uZSBvZiB0aGUgc3ViY2xhc3MgYXMgb25lIHdvdWxkIHR5cGljYWxseSBleHBlY3QgZnJvbSBhCisgICAgLy8gc3VjaCBhIG1ldGhvZC4gSW5zdGVhZCwgaXQgb25seSBjbG9uZXMgdGhlIENGWF9ESUJTb3VyY2UsIG5vbmUgb2Ygd2hvc2UKKyAgICAvLyBtZW1iZXJzIHBvaW50IHRvIG9iamVjdHMgb3duZWQgYnkgdGhlIGZvcm0uIEFzIGEgcmVzdWx0LCB8bV9wQml0bWFwfAorICAgIC8vIG1heSBvdXRsaXZlIHxtX3BGb3JtfC4KKyAgICBpZiAocFNvdXJjZSkKKyAgICAgIG1fcEJpdG1hcCA9IHBTb3VyY2UtPkNsb25lKG51bGxwdHIpOworICB9CiAgIG1fcEZvcm0ucmVzZXQoKTsKICAgcmV0dXJuIHRydWU7CiB9CisKK3ZvaWQgQ1BERl9UeXBlM0NoYXI6OkluaXRpYWxpemVGcm9tU3RyZWFtRGF0YShib29sIGJDb2xvcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBwRGF0YSkgeworICBtX2JDb2xvcmVkID0gYkNvbG9yZWQ7CisgIG1fV2lkdGggPSBGWFNZU19yb3VuZChUZXh0VW5pdFRvR2x5cGhVbml0KHBEYXRhWzBdKSk7CisgIG1fQkJveC5sZWZ0ID0gRlhTWVNfcm91bmQoVGV4dFVuaXRUb0dseXBoVW5pdChwRGF0YVsyXSkpOworICBtX0JCb3guYm90dG9tID0gRlhTWVNfcm91bmQoVGV4dFVuaXRUb0dseXBoVW5pdChwRGF0YVszXSkpOworICBtX0JCb3gucmlnaHQgPSBGWFNZU19yb3VuZChUZXh0VW5pdFRvR2x5cGhVbml0KHBEYXRhWzRdKSk7CisgIG1fQkJveC50b3AgPSBGWFNZU19yb3VuZChUZXh0VW5pdFRvR2x5cGhVbml0KHBEYXRhWzVdKSk7Cit9CisKK3ZvaWQgQ1BERl9UeXBlM0NoYXI6OlRyYW5zZm9ybShjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKKyAgbV9XaWR0aCA9IG1fV2lkdGggKiBtYXRyaXguR2V0WFVuaXQoKSArIDAuNWY7CisKKyAgQ0ZYX0Zsb2F0UmVjdCBjaGFyX3JlY3Q7CisgIGlmIChtX0JCb3gucmlnaHQgPD0gbV9CQm94LmxlZnQgfHwgbV9CQm94LmJvdHRvbSA+PSBtX0JCb3gudG9wKSB7CisgICAgY2hhcl9yZWN0ID0gZm9ybSgpLT5DYWxjQm91bmRpbmdCb3goKTsKKyAgICBUZXh0VW5pdFJlY3RUb0dseXBoVW5pdFJlY3QoJmNoYXJfcmVjdCk7CisgIH0gZWxzZSB7CisgICAgY2hhcl9yZWN0ID0gQ0ZYX0Zsb2F0UmVjdChtX0JCb3gpOworICB9CisKKyAgbV9CQm94ID0gbWF0cml4LlRyYW5zZm9ybVJlY3QoY2hhcl9yZWN0KS5Ub1JvdW5kZWRGeFJlY3QoKTsKK30KKwordm9pZCBDUERGX1R5cGUzQ2hhcjo6UmVzZXRGb3JtKCkgeworICBtX3BGb3JtLnJlc2V0KCk7Cit9CisKK1JldGFpblB0cjxDRlhfRElCaXRtYXA+IENQREZfVHlwZTNDaGFyOjpHZXRCaXRtYXAoKSB7CisgIHJldHVybiBtX3BCaXRtYXA7Cit9CisKK2NvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBDUERGX1R5cGUzQ2hhcjo6R2V0Qml0bWFwKCkgY29uc3QgeworICByZXR1cm4gbV9wQml0bWFwOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl90eXBlM2NoYXIuaCBiL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfdHlwZTNjaGFyLmgKaW5kZXggNTQ5ZjQ5ZS4uYzljNTU1NSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl90eXBlM2NoYXIuaAorKysgYi9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3R5cGUzY2hhci5oCkBAIC0xMSw2ICsxMSw3IEBACiAKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKIAogY2xhc3MgQ0ZYX0RJQml0bWFwOwogY2xhc3MgQ1BERl9Gb3JtOwpAQCAtMTgsMTYgKzE5LDM0IEBACiAKIGNsYXNzIENQREZfVHlwZTNDaGFyIHsKICBwdWJsaWM6Ci0gIC8vIFRha2VzIG93bmVyc2hpcCBvZiB8cEZvcm18LgotICBleHBsaWNpdCBDUERGX1R5cGUzQ2hhcihDUERGX0Zvcm0qIHBGb3JtKTsKKyAgZXhwbGljaXQgQ1BERl9UeXBlM0NoYXIoc3RkOjp1bmlxdWVfcHRyPENQREZfRm9ybT4gcEZvcm0pOwogICB+Q1BERl9UeXBlM0NoYXIoKTsKIAorICBzdGF0aWMgZmxvYXQgVGV4dFVuaXRUb0dseXBoVW5pdChmbG9hdCBmVGV4dFVuaXQpOworICBzdGF0aWMgdm9pZCBUZXh0VW5pdFJlY3RUb0dseXBoVW5pdFJlY3QoQ0ZYX0Zsb2F0UmVjdCogcFJlY3QpOworCiAgIGJvb2wgTG9hZEJpdG1hcChDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0KTsKIAorICB2b2lkIEluaXRpYWxpemVGcm9tU3RyZWFtRGF0YShib29sIGJDb2xvcmVkLCBjb25zdCBmbG9hdCogcERhdGEpOworICB2b2lkIFRyYW5zZm9ybShjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpOworICB2b2lkIFJlc2V0Rm9ybSgpOworCisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IEdldEJpdG1hcCgpOworICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgR2V0Qml0bWFwKCkgY29uc3Q7CisKKyAgY29uc3QgQ1BERl9Gb3JtKiBmb3JtKCkgY29uc3QgeyByZXR1cm4gbV9wRm9ybS5nZXQoKTsgfQorICBDUERGX0Zvcm0qIGZvcm0oKSB7IHJldHVybiBtX3BGb3JtLmdldCgpOyB9CisKKyAgYm9vbCBjb2xvcmVkKCkgY29uc3QgeyByZXR1cm4gbV9iQ29sb3JlZDsgfQorICBpbnQgd2lkdGgoKSBjb25zdCB7IHJldHVybiBtX1dpZHRoOyB9CisgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCgpIGNvbnN0IHsgcmV0dXJuIG1fSW1hZ2VNYXRyaXg7IH0KKyAgY29uc3QgRlhfUkVDVCYgYmJveCgpIGNvbnN0IHsgcmV0dXJuIG1fQkJveDsgfQorCisgcHJpdmF0ZToKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfRm9ybT4gbV9wRm9ybTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gbV9wQml0bWFwOwotICBib29sIG1fYkNvbG9yZWQ7Ci0gIGludCBtX1dpZHRoOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBtX3BCaXRtYXA7CisgIGJvb2wgbV9iQ29sb3JlZCA9IGZhbHNlOworICBpbnQgbV9XaWR0aCA9IDA7CiAgIENGWF9NYXRyaXggbV9JbWFnZU1hdHJpeDsKICAgRlhfUkVDVCBtX0JCb3g7CiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl90eXBlM2ZvbnQuY3BwIGIvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl90eXBlM2ZvbnQuY3BwCmluZGV4IGY2Y2Q2ZWMuLmMzMjhjMTAgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfdHlwZTNmb250LmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3R5cGUzZm9udC5jcHAKQEAgLTYsMjUgKzYsMjUgQEAKIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfdHlwZTNmb250LmgiCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8dXRpbGl0eT4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfdHlwZTNjaGFyLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9mb3JtLmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvcGFnZWludC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbS5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgogCi0jZGVmaW5lIEZQREZfTUFYX1RZUEUzX0ZPUk1fTEVWRUwgNAorbmFtZXNwYWNlIHsKIAotQ1BERl9UeXBlM0ZvbnQ6OkNQREZfVHlwZTNGb250KCkKLSAgICA6IG1fcENoYXJQcm9jcyhudWxscHRyKSwKLSAgICAgIG1fcFBhZ2VSZXNvdXJjZXMobnVsbHB0ciksCi0gICAgICBtX3BGb250UmVzb3VyY2VzKG51bGxwdHIpLAotICAgICAgbV9DaGFyTG9hZGluZ0RlcHRoKDApIHsKLSAgRlhTWVNfbWVtc2V0KG1fQ2hhcldpZHRoTCwgMCwgc2l6ZW9mKG1fQ2hhcldpZHRoTCkpOworY29uc3RleHByIGludCBrTWF4VHlwZTNGb3JtTGV2ZWwgPSA0OworCit9ICAvLyBuYW1lc3BhY2UKKworQ1BERl9UeXBlM0ZvbnQ6OkNQREZfVHlwZTNGb250KCkgeworICBtZW1zZXQobV9DaGFyV2lkdGhMLCAwLCBzaXplb2YobV9DaGFyV2lkdGhMKSk7CiB9CiAKIENQREZfVHlwZTNGb250Ojp+Q1BERl9UeXBlM0ZvbnQoKSB7fQpAQCAtNDQsMzAgKzQ0LDM1IEBACiBib29sIENQREZfVHlwZTNGb250OjpMb2FkKCkgewogICBtX3BGb250UmVzb3VyY2VzID0gbV9wRm9udERpY3QtPkdldERpY3RGb3IoIlJlc291cmNlcyIpOwogICBDUERGX0FycmF5KiBwTWF0cml4ID0gbV9wRm9udERpY3QtPkdldEFycmF5Rm9yKCJGb250TWF0cml4Iik7Ci0gIEZYX0ZMT0FUIHhzY2FsZSA9IDEuMGYsIHlzY2FsZSA9IDEuMGY7CisgIGZsb2F0IHhzY2FsZSA9IDEuMGY7CisgIGZsb2F0IHlzY2FsZSA9IDEuMGY7CiAgIGlmIChwTWF0cml4KSB7CiAgICAgbV9Gb250TWF0cml4ID0gcE1hdHJpeC0+R2V0TWF0cml4KCk7CiAgICAgeHNjYWxlID0gbV9Gb250TWF0cml4LmE7CiAgICAgeXNjYWxlID0gbV9Gb250TWF0cml4LmQ7CiAgIH0KKwogICBDUERGX0FycmF5KiBwQkJveCA9IG1fcEZvbnREaWN0LT5HZXRBcnJheUZvcigiRm9udEJCb3giKTsKICAgaWYgKHBCQm94KSB7Ci0gICAgbV9Gb250QkJveC5sZWZ0ID0gKGludDMyX3QpKHBCQm94LT5HZXROdW1iZXJBdCgwKSAqIHhzY2FsZSAqIDEwMDApOwotICAgIG1fRm9udEJCb3guYm90dG9tID0gKGludDMyX3QpKHBCQm94LT5HZXROdW1iZXJBdCgxKSAqIHlzY2FsZSAqIDEwMDApOwotICAgIG1fRm9udEJCb3gucmlnaHQgPSAoaW50MzJfdCkocEJCb3gtPkdldE51bWJlckF0KDIpICogeHNjYWxlICogMTAwMCk7Ci0gICAgbV9Gb250QkJveC50b3AgPSAoaW50MzJfdCkocEJCb3gtPkdldE51bWJlckF0KDMpICogeXNjYWxlICogMTAwMCk7CisgICAgQ0ZYX0Zsb2F0UmVjdCBib3goCisgICAgICAgIHBCQm94LT5HZXROdW1iZXJBdCgwKSAqIHhzY2FsZSwgcEJCb3gtPkdldE51bWJlckF0KDEpICogeXNjYWxlLAorICAgICAgICBwQkJveC0+R2V0TnVtYmVyQXQoMikgKiB4c2NhbGUsIHBCQm94LT5HZXROdW1iZXJBdCgzKSAqIHlzY2FsZSk7CisgICAgQ1BERl9UeXBlM0NoYXI6OlRleHRVbml0UmVjdFRvR2x5cGhVbml0UmVjdCgmYm94KTsKKyAgICBtX0ZvbnRCQm94ID0gYm94LlRvRnhSZWN0KCk7CiAgIH0KKworICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrQ2hhckxpbWl0ID0gRlhfQXJyYXlTaXplKG1fQ2hhcldpZHRoTCk7CiAgIGludCBTdGFydENoYXIgPSBtX3BGb250RGljdC0+R2V0SW50ZWdlckZvcigiRmlyc3RDaGFyIik7Ci0gIENQREZfQXJyYXkqIHBXaWR0aEFycmF5ID0gbV9wRm9udERpY3QtPkdldEFycmF5Rm9yKCJXaWR0aHMiKTsKLSAgaWYgKHBXaWR0aEFycmF5ICYmIChTdGFydENoYXIgPj0gMCAmJiBTdGFydENoYXIgPCAyNTYpKSB7Ci0gICAgc2l6ZV90IGNvdW50ID0gcFdpZHRoQXJyYXktPkdldENvdW50KCk7Ci0gICAgaWYgKGNvdW50ID4gMjU2KQotICAgICAgY291bnQgPSAyNTY7Ci0gICAgaWYgKFN0YXJ0Q2hhciArIGNvdW50ID4gMjU2KQotICAgICAgY291bnQgPSAyNTYgLSBTdGFydENoYXI7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICBtX0NoYXJXaWR0aExbU3RhcnRDaGFyICsgaV0gPQotICAgICAgICAgIEZYU1lTX3JvdW5kKHBXaWR0aEFycmF5LT5HZXROdW1iZXJBdChpKSAqIHhzY2FsZSAqIDEwMDApOworICBpZiAoU3RhcnRDaGFyID49IDAgJiYgc3RhdGljX2Nhc3Q8c2l6ZV90PihTdGFydENoYXIpIDwga0NoYXJMaW1pdCkgeworICAgIENQREZfQXJyYXkqIHBXaWR0aEFycmF5ID0gbV9wRm9udERpY3QtPkdldEFycmF5Rm9yKCJXaWR0aHMiKTsKKyAgICBpZiAocFdpZHRoQXJyYXkpIHsKKyAgICAgIHNpemVfdCBjb3VudCA9IHN0ZDo6bWluKHBXaWR0aEFycmF5LT5HZXRDb3VudCgpLCBrQ2hhckxpbWl0KTsKKyAgICAgIGNvdW50ID0gc3RkOjptaW4oY291bnQsIGtDaGFyTGltaXQgLSBTdGFydENoYXIpOworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgIG1fQ2hhcldpZHRoTFtTdGFydENoYXIgKyBpXSA9CisgICAgICAgICAgICBGWFNZU19yb3VuZChDUERGX1R5cGUzQ2hhcjo6VGV4dFVuaXRUb0dseXBoVW5pdCgKKyAgICAgICAgICAgICAgICBwV2lkdGhBcnJheS0+R2V0TnVtYmVyQXQoaSkgKiB4c2NhbGUpKTsKKyAgICAgIH0KICAgICB9CiAgIH0KICAgbV9wQ2hhclByb2NzID0gbV9wRm9udERpY3QtPkdldERpY3RGb3IoIkNoYXJQcm9jcyIpOwpAQCAtNzcsMTkgKzgyLDIxIEBACiAgIHJldHVybiB0cnVlOwogfQogCit2b2lkIENQREZfVHlwZTNGb250OjpMb2FkR2x5cGhNYXAoKSB7fQorCiB2b2lkIENQREZfVHlwZTNGb250OjpDaGVja1R5cGUzRm9udE1ldHJpY3MoKSB7CiAgIENoZWNrRm9udE1ldHJpY3MoKTsKIH0KIAogQ1BERl9UeXBlM0NoYXIqIENQREZfVHlwZTNGb250OjpMb2FkQ2hhcih1aW50MzJfdCBjaGFyY29kZSkgewotICBpZiAobV9DaGFyTG9hZGluZ0RlcHRoID49IEZQREZfTUFYX1RZUEUzX0ZPUk1fTEVWRUwpCisgIGlmIChtX0NoYXJMb2FkaW5nRGVwdGggPj0ga01heFR5cGUzRm9ybUxldmVsKQogICAgIHJldHVybiBudWxscHRyOwogCiAgIGF1dG8gaXQgPSBtX0NhY2hlTWFwLmZpbmQoY2hhcmNvZGUpOwogICBpZiAoaXQgIT0gbV9DYWNoZU1hcC5lbmQoKSkKICAgICByZXR1cm4gaXQtPnNlY29uZC5nZXQoKTsKIAotICBjb25zdCBGWF9DSEFSKiBuYW1lID0gR2V0QWRvYmVDaGFyTmFtZShtX0Jhc2VFbmNvZGluZywgbV9DaGFyTmFtZXMsIGNoYXJjb2RlKTsKKyAgY29uc3QgY2hhciogbmFtZSA9IEdldEFkb2JlQ2hhck5hbWUobV9CYXNlRW5jb2RpbmcsIG1fQ2hhck5hbWVzLCBjaGFyY29kZSk7CiAgIGlmICghbmFtZSkKICAgICByZXR1cm4gbnVsbHB0cjsKIApAQCAtOTgsNDAgKzEwNSwyNyBAQAogICBpZiAoIXBTdHJlYW0pCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgc3RkOjp1bmlxdWVfcHRyPENQREZfVHlwZTNDaGFyPiBwTmV3Q2hhcihuZXcgQ1BERl9UeXBlM0NoYXIobmV3IENQREZfRm9ybSgKLSAgICAgIG1fcERvY3VtZW50LCBtX3BGb250UmVzb3VyY2VzID8gbV9wRm9udFJlc291cmNlcyA6IG1fcFBhZ2VSZXNvdXJjZXMsCi0gICAgICBwU3RyZWFtLCBudWxscHRyKSkpOworICBhdXRvIHBOZXdDaGFyID0KKyAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1R5cGUzQ2hhcj4ocGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRm9ybT4oCisgICAgICAgICAgbV9wRG9jdW1lbnQuR2V0KCksCisgICAgICAgICAgbV9wRm9udFJlc291cmNlcyA/IG1fcEZvbnRSZXNvdXJjZXMuR2V0KCkgOiBtX3BQYWdlUmVzb3VyY2VzLkdldCgpLAorICAgICAgICAgIHBTdHJlYW0sIG51bGxwdHIpKTsKIAogICAvLyBUaGlzIGNhbiB0cmlnZ2VyIHJlY3Vyc2lvbiBpbnRvIHRoaXMgbWV0aG9kLiBUaGUgY29udGVudCBvZiB8bV9DYWNoZU1hcHwKICAgLy8gY2FuIGNoYW5nZSBhcyBhIHJlc3VsdC4gVGh1cyBhZnRlciBpdCByZXR1cm5zLCBjaGVjayB0aGUgY2FjaGUgYWdhaW4gZm9yCiAgIC8vIGEgY2FjaGUgaGl0LgogICBtX0NoYXJMb2FkaW5nRGVwdGgrKzsKLSAgcE5ld0NoYXItPm1fcEZvcm0tPlBhcnNlQ29udGVudChudWxscHRyLCBudWxscHRyLCBwTmV3Q2hhci5nZXQoKSk7CisgIHBOZXdDaGFyLT5mb3JtKCktPlBhcnNlQ29udGVudFdpdGhQYXJhbXMobnVsbHB0ciwgbnVsbHB0ciwgcE5ld0NoYXIuZ2V0KCksIDApOwogICBtX0NoYXJMb2FkaW5nRGVwdGgtLTsKICAgaXQgPSBtX0NhY2hlTWFwLmZpbmQoY2hhcmNvZGUpOwogICBpZiAoaXQgIT0gbV9DYWNoZU1hcC5lbmQoKSkKICAgICByZXR1cm4gaXQtPnNlY29uZC5nZXQoKTsKIAotICBGWF9GTE9BVCBzY2FsZSA9IG1fRm9udE1hdHJpeC5HZXRYVW5pdCgpOwotICBwTmV3Q2hhci0+bV9XaWR0aCA9IChpbnQzMl90KShwTmV3Q2hhci0+bV9XaWR0aCAqIHNjYWxlICsgMC41Zik7Ci0gIEZYX1JFQ1QmIHJjQkJveCA9IHBOZXdDaGFyLT5tX0JCb3g7Ci0gIENGWF9GbG9hdFJlY3QgY2hhcl9yZWN0KAotICAgICAgKEZYX0ZMT0FUKXJjQkJveC5sZWZ0IC8gMTAwMC4wZiwgKEZYX0ZMT0FUKXJjQkJveC5ib3R0b20gLyAxMDAwLjBmLAotICAgICAgKEZYX0ZMT0FUKXJjQkJveC5yaWdodCAvIDEwMDAuMGYsIChGWF9GTE9BVClyY0JCb3gudG9wIC8gMTAwMC4wZik7Ci0gIGlmIChyY0JCb3gucmlnaHQgPD0gcmNCQm94LmxlZnQgfHwgcmNCQm94LmJvdHRvbSA+PSByY0JCb3gudG9wKQotICAgIGNoYXJfcmVjdCA9IHBOZXdDaGFyLT5tX3BGb3JtLT5DYWxjQm91bmRpbmdCb3goKTsKLQotICBtX0ZvbnRNYXRyaXguVHJhbnNmb3JtUmVjdChjaGFyX3JlY3QpOwotICByY0JCb3gubGVmdCA9IEZYU1lTX3JvdW5kKGNoYXJfcmVjdC5sZWZ0ICogMTAwMCk7Ci0gIHJjQkJveC5yaWdodCA9IEZYU1lTX3JvdW5kKGNoYXJfcmVjdC5yaWdodCAqIDEwMDApOwotICByY0JCb3gudG9wID0gRlhTWVNfcm91bmQoY2hhcl9yZWN0LnRvcCAqIDEwMDApOwotICByY0JCb3guYm90dG9tID0gRlhTWVNfcm91bmQoY2hhcl9yZWN0LmJvdHRvbSAqIDEwMDApOwotCi0gIEFTU0VSVCghcGRmaXVtOjpDb250YWluc0tleShtX0NhY2hlTWFwLCBjaGFyY29kZSkpOworICBwTmV3Q2hhci0+VHJhbnNmb3JtKG1fRm9udE1hdHJpeCk7CiAgIG1fQ2FjaGVNYXBbY2hhcmNvZGVdID0gc3RkOjptb3ZlKHBOZXdDaGFyKTsKICAgQ1BERl9UeXBlM0NoYXIqIHBDYWNoZWRDaGFyID0gbV9DYWNoZU1hcFtjaGFyY29kZV0uZ2V0KCk7Ci0gIGlmIChwQ2FjaGVkQ2hhci0+bV9wRm9ybS0+R2V0UGFnZU9iamVjdExpc3QoKS0+ZW1wdHkoKSkKLSAgICBwQ2FjaGVkQ2hhci0+bV9wRm9ybS5yZXNldCgpOworICBpZiAocENhY2hlZENoYXItPmZvcm0oKS0+R2V0UGFnZU9iamVjdExpc3QoKS0+ZW1wdHkoKSkKKyAgICBwQ2FjaGVkQ2hhci0+UmVzZXRGb3JtKCk7CiAgIHJldHVybiBwQ2FjaGVkQ2hhcjsKIH0KIApAQCAtMTQzLDEwICsxMzcsMTMgQEAKICAgICByZXR1cm4gbV9DaGFyV2lkdGhMW2NoYXJjb2RlXTsKIAogICBjb25zdCBDUERGX1R5cGUzQ2hhciogcENoYXIgPSBMb2FkQ2hhcihjaGFyY29kZSk7Ci0gIHJldHVybiBwQ2hhciA/IHBDaGFyLT5tX1dpZHRoIDogMDsKKyAgcmV0dXJuIHBDaGFyID8gcENoYXItPndpZHRoKCkgOiAwOwogfQogCiBGWF9SRUNUIENQREZfVHlwZTNGb250OjpHZXRDaGFyQkJveCh1aW50MzJfdCBjaGFyY29kZSkgeworICBGWF9SRUNUIHJldDsKICAgY29uc3QgQ1BERl9UeXBlM0NoYXIqIHBDaGFyID0gTG9hZENoYXIoY2hhcmNvZGUpOwotICByZXR1cm4gcENoYXIgPyBwQ2hhci0+bV9CQm94IDogRlhfUkVDVCgpOworICBpZiAocENoYXIpCisgICAgcmV0ID0gcENoYXItPmJib3goKTsKKyAgcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfdHlwZTNmb250LmggYi9jb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3R5cGUzZm9udC5oCmluZGV4IDBiYWUxOTIuLjNmMmUwMTggMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9mb250L2NwZGZfdHlwZTNmb250LmgKKysrIGIvY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl90eXBlM2ZvbnQuaApAQCAtNDUsMTUgKzQ1LDE1IEBACiAgIGJvb2wgTG9hZCgpIG92ZXJyaWRlOwogCiAgIC8vIENQREZfU2ltcGxlRm9udDoKLSAgdm9pZCBMb2FkR2x5cGhNYXAoKSBvdmVycmlkZSB7fQorICB2b2lkIExvYWRHbHlwaE1hcCgpIG92ZXJyaWRlOwogCiAgIGludCBtX0NoYXJXaWR0aExbMjU2XTsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BDaGFyUHJvY3M7Ci0gIENQREZfRGljdGlvbmFyeSogbV9wUGFnZVJlc291cmNlczsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BGb250UmVzb3VyY2VzOworICBVbm93bmVkUHRyPENQREZfRGljdGlvbmFyeT4gbV9wQ2hhclByb2NzOworICBVbm93bmVkUHRyPENQREZfRGljdGlvbmFyeT4gbV9wUGFnZVJlc291cmNlczsKKyAgVW5vd25lZFB0cjxDUERGX0RpY3Rpb25hcnk+IG1fcEZvbnRSZXNvdXJjZXM7CiAgIHN0ZDo6bWFwPHVpbnQzMl90LCBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9UeXBlM0NoYXI+PiBtX0NhY2hlTWFwOwogICAvLyBUaGUgZGVwdGggY2hhciBsb2FkaW5nIGlzIGluLCB0byBhdm9pZCByZWN1cml2ZSBjYWxsaW5nIExvYWRDaGFyKCkuCi0gIGludCBtX0NoYXJMb2FkaW5nRGVwdGg7CisgIGludCBtX0NoYXJMb2FkaW5nRGVwdGggPSAwOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfRk9OVF9DUERGX1RZUEUzRk9OVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2ZvbnQvZm9udF9pbnQuaCBiL2NvcmUvZnBkZmFwaS9mb250L2ZvbnRfaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZDgyMWUuLjAwMDAwMDAKLS0tIGEvY29yZS9mcGRmYXBpL2ZvbnQvZm9udF9pbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgQ09SRV9GUERGQVBJX0ZPTlRfRk9OVF9JTlRfSF8KLSNkZWZpbmUgQ09SRV9GUERGQVBJX0ZPTlRfRk9OVF9JTlRfSF8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jaWRmb250LmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfbWF5YmVfb3duZWQuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0KLWNsYXNzIENQREZfQ0lEMlVuaWNvZGVNYXA7Ci1jbGFzcyBDUERGX0NNYXA7Ci1jbGFzcyBDUERGX0ZvbnQ7Ci1jbGFzcyBDUERGX1N0cmVhbTsKLQotdXNpbmcgRlhGVF9MaWJyYXJ5ID0gdm9pZCo7Ci0KLWludCBUVDJQREYoaW50IG0sIEZYRlRfRmFjZSBmYWNlKTsKLWJvb2wgRlRfVXNlVFRDaGFybWFwKEZYRlRfRmFjZSBmYWNlLCBpbnQgcGxhdGZvcm1faWQsIGludCBlbmNvZGluZ19pZCk7Ci1DSURTZXQgQ2hhcnNldEZyb21PcmRlcmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG9yZGVyaW5nKTsKLQotY2xhc3MgQ1BERl9DTWFwTWFuYWdlciB7Ci0gcHVibGljOgotICBDUERGX0NNYXBNYW5hZ2VyKCk7Ci0gIH5DUERGX0NNYXBNYW5hZ2VyKCk7Ci0KLSAgQ0ZYX01heWJlT3duZWQ8Q1BERl9DTWFwPiBHZXRQcmVkZWZpbmVkQ01hcChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJQcm9tcHRDSkspOwotICBDUERGX0NJRDJVbmljb2RlTWFwKiBHZXRDSUQyVW5pY29kZU1hcChDSURTZXQgY2hhcnNldCwgYm9vbCBiUHJvbXB0Q0pLKTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0NNYXA+IExvYWRQcmVkZWZpbmVkQ01hcChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlByb21wdENKSyk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0NJRDJVbmljb2RlTWFwPiBMb2FkQ0lEMlVuaWNvZGVNYXAoQ0lEU2V0IGNoYXJzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUHJvbXB0Q0pLKTsKLQotICBzdGQ6Om1hcDxDRlhfQnl0ZVN0cmluZywgc3RkOjp1bmlxdWVfcHRyPENQREZfQ01hcD4+IG1fQ01hcHM7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0NJRDJVbmljb2RlTWFwPiBtX0NJRDJVbmljb2RlTWFwc1s2XTsKLX07Ci0KLWNsYXNzIENGWF9TdG9ja0ZvbnRBcnJheSB7Ci0gcHVibGljOgotICBDRlhfU3RvY2tGb250QXJyYXkoKTsKLSAgfkNGWF9TdG9ja0ZvbnRBcnJheSgpOwotCi0gIC8vIFRha2VzIG93bmVyc2hpcCBvZiB8cEZvbnR8LCByZXR1cm5zIHVub3duZWQgcG9pbnRlciB0byBpdC4KLSAgQ1BERl9Gb250KiBTZXRGb250KHVpbnQzMl90IGluZGV4LCBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Gb250PiBwRm9udCk7Ci0gIENQREZfRm9udCogR2V0Rm9udCh1aW50MzJfdCBpbmRleCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Gb250PiBtX1N0b2NrRm9udHNbMTRdOwotfTsKLQotY2xhc3MgQ1BERl9Gb250R2xvYmFscyB7Ci0gcHVibGljOgotICBDUERGX0ZvbnRHbG9iYWxzKCk7Ci0gIH5DUERGX0ZvbnRHbG9iYWxzKCk7Ci0KLSAgdm9pZCBDbGVhcihDUERGX0RvY3VtZW50KiBwRG9jKTsKLSAgQ1BERl9Gb250KiBGaW5kKENQREZfRG9jdW1lbnQqIHBEb2MsIHVpbnQzMl90IGluZGV4KTsKLQotICAvLyBUYWtlcyBvd25lcnNoaXAgb2YgfHBGb250fCwgcmV0dXJucyB1bm93bmVkIHBvaW50ZXIgdG8gaXQuCi0gIENQREZfRm9udCogU2V0KENQREZfRG9jdW1lbnQqIGtleSwKLSAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0ZvbnQ+IHBGb250KTsKLQotICBDUERGX0NNYXBNYW5hZ2VyIG1fQ01hcE1hbmFnZXI7Ci0gIHN0cnVjdCB7Ci0gICAgY29uc3Qgc3RydWN0IEZYQ01BUF9DTWFwKiBtX3BNYXBMaXN0OwotICAgIHVpbnQzMl90IG1fQ291bnQ7Ci0gIH0gbV9FbWJlZGRlZENoYXJzZXRzW0NJRFNFVF9OVU1fU0VUU107Ci0gIHN0cnVjdCB7Ci0gICAgY29uc3QgdWludDE2X3QqIG1fcE1hcDsKLSAgICB1aW50MzJfdCBtX0NvdW50OwotICB9IG1fRW1iZWRkZWRUb1VuaWNvZGVzW0NJRFNFVF9OVU1fU0VUU107Ci0KLSBwcml2YXRlOgotICBzdGQ6Om1hcDxDUERGX0RvY3VtZW50Kiwgc3RkOjp1bmlxdWVfcHRyPENGWF9TdG9ja0ZvbnRBcnJheT4+IG1fU3RvY2tNYXA7Ci19OwotCi1zdHJ1Y3QgQ01hcF9Db2RlUmFuZ2UgewotICBpbnQgbV9DaGFyU2l6ZTsKLSAgdWludDhfdCBtX0xvd2VyWzRdOwotICB1aW50OF90IG1fVXBwZXJbNF07Ci19OwotCi1jbGFzcyBDUERGX0NNYXBQYXJzZXIgewotIHB1YmxpYzoKLSAgQ1BERl9DTWFwUGFyc2VyKCk7Ci0gIH5DUERGX0NNYXBQYXJzZXIoKTsKLSAgdm9pZCBJbml0aWFsaXplKENQREZfQ01hcCogcE1hcCk7Ci0gIHZvaWQgUGFyc2VXb3JkKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKTsKLSAgQ0ZYX0JpbmFyeUJ1ZiBtX0FkZE1hcHM7Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgZnBkZl9mb250X2NpZF9DTWFwX0dldENvZGVfVGVzdDsKLSAgZnJpZW5kIGNsYXNzIGZwZGZfZm9udF9jaWRfQ01hcF9HZXRDb2RlUmFuZ2VfVGVzdDsKLQotICBzdGF0aWMgdWludDMyX3QgQ01hcF9HZXRDb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgd29yZCk7Ci0gIHN0YXRpYyBib29sIENNYXBfR2V0Q29kZVJhbmdlKENNYXBfQ29kZVJhbmdlJiByYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzZWNvbmQpOwotCi0gIENQREZfQ01hcCogbV9wQ01hcDsKLSAgaW50IG1fU3RhdHVzOwotICBpbnQgbV9Db2RlU2VxOwotICB1aW50MzJfdCBtX0NvZGVQb2ludHNbNF07Ci0gIHN0ZDo6dmVjdG9yPENNYXBfQ29kZVJhbmdlPiBtX0NvZGVSYW5nZXM7Ci0gIENGWF9CeXRlU3RyaW5nIG1fTGFzdFdvcmQ7Ci19OwotCi1lbnVtIENJRENvZGluZyA6IHVpbnQ4X3QgewotICBDSURDT0RJTkdfVU5LTk9XTiA9IDAsCi0gIENJRENPRElOR19HQiwKLSAgQ0lEQ09ESU5HX0JJRzUsCi0gIENJRENPRElOR19KSVMsCi0gIENJRENPRElOR19LT1JFQSwKLSAgQ0lEQ09ESU5HX1VDUzIsCi0gIENJRENPRElOR19DSUQsCi0gIENJRENPRElOR19VVEYxNiwKLX07Ci0KLWNsYXNzIENQREZfQ01hcCB7Ci0gcHVibGljOgotICBlbnVtIENvZGluZ1NjaGVtZSA6IHVpbnQ4X3QgewotICAgIE9uZUJ5dGUsCi0gICAgVHdvQnl0ZXMsCi0gICAgTWl4ZWRUd29CeXRlcywKLSAgICBNaXhlZEZvdXJCeXRlcwotICB9OwotCi0gIENQREZfQ01hcCgpOwotICB+Q1BERl9DTWFwKCk7Ci0KLSAgdm9pZCBMb2FkUHJlZGVmaW5lZChDUERGX0NNYXBNYW5hZ2VyKiBwTWdyLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlByb21wdENKSyk7Ci0gIHZvaWQgTG9hZEVtYmVkZGVkKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCB1aW50MzJfdCBkd1NpemUpOwotCi0gIGJvb2wgSXNMb2FkZWQoKSBjb25zdDsKLSAgYm9vbCBJc1ZlcnRXcml0aW5nKCkgY29uc3Q7Ci0gIHVpbnQxNl90IENJREZyb21DaGFyQ29kZSh1aW50MzJfdCBjaGFyY29kZSkgY29uc3Q7Ci0gIGludCBHZXRDaGFyU2l6ZSh1aW50MzJfdCBjaGFyY29kZSkgY29uc3Q7Ci0gIHVpbnQzMl90IEdldE5leHRDaGFyKGNvbnN0IEZYX0NIQVIqIHBTdHJpbmcsIGludCBuU3RyTGVuLCBpbnQmIG9mZnNldCkgY29uc3Q7Ci0gIGludCBDb3VudENoYXIoY29uc3QgRlhfQ0hBUiogcFN0cmluZywgaW50IHNpemUpIGNvbnN0OwotICBpbnQgQXBwZW5kQ2hhcihGWF9DSEFSKiBzdHIsIHVpbnQzMl90IGNoYXJjb2RlKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBDUERGX0NNYXBQYXJzZXI7Ci0gIGZyaWVuZCBjbGFzcyBDUERGX0NJREZvbnQ7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgbV9QcmVkZWZpbmVkQ01hcDsKLSAgYm9vbCBtX2JWZXJ0aWNhbDsKLSAgQ0lEU2V0IG1fQ2hhcnNldDsKLSAgaW50IG1fQ29kaW5nOwotICBDb2RpbmdTY2hlbWUgbV9Db2RpbmdTY2hlbWU7Ci0gIGludCBtX25Db2RlUmFuZ2VzOwotICB1aW50OF90KiBtX3BMZWFkaW5nQnl0ZXM7Ci0gIHVpbnQxNl90KiBtX3BNYXBwaW5nOwotICB1aW50OF90KiBtX3BBZGRNYXBwaW5nOwotICBib29sIG1fYkxvYWRlZDsKLSAgY29uc3QgRlhDTUFQX0NNYXAqIG1fcEVtYmVkTWFwOwotfTsKLQotY2xhc3MgQ1BERl9DSUQyVW5pY29kZU1hcCB7Ci0gcHVibGljOgotICBDUERGX0NJRDJVbmljb2RlTWFwKCk7Ci0gIH5DUERGX0NJRDJVbmljb2RlTWFwKCk7Ci0KLSAgYm9vbCBJc0xvYWRlZCgpOwotICB2b2lkIExvYWQoQ1BERl9DTWFwTWFuYWdlciogcE1nciwgQ0lEU2V0IGNoYXJzZXQsIGJvb2wgYlByb21wdENKSyk7Ci0gIEZYX1dDSEFSIFVuaWNvZGVGcm9tQ0lEKHVpbnQxNl90IENJRCk7Ci0KLSBwcml2YXRlOgotICBDSURTZXQgbV9DaGFyc2V0OwotICBjb25zdCB1aW50MTZfdCogbV9wRW1iZWRkZWRNYXA7Ci0gIHVpbnQzMl90IG1fRW1iZWRkZWRDb3VudDsKLX07Ci0KLWNsYXNzIENQREZfVG9Vbmljb2RlTWFwIHsKLSBwdWJsaWM6Ci0gIENQREZfVG9Vbmljb2RlTWFwKCk7Ci0gIH5DUERGX1RvVW5pY29kZU1hcCgpOwotCi0gIHZvaWQgTG9hZChDUERGX1N0cmVhbSogcFN0cmVhbSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgTG9va3VwKHVpbnQzMl90IGNoYXJjb2RlKSBjb25zdDsKLSAgdWludDMyX3QgUmV2ZXJzZUxvb2t1cChGWF9XQ0hBUiB1bmljb2RlKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBmcGRmX2ZvbnRfU3RyaW5nVG9Db2RlX1Rlc3Q7Ci0gIGZyaWVuZCBjbGFzcyBmcGRmX2ZvbnRfU3RyaW5nVG9XaWRlU3RyaW5nX1Rlc3Q7Ci0KLSAgc3RhdGljIHVpbnQzMl90IFN0cmluZ1RvQ29kZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7Ci0gIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBTdHJpbmdUb1dpZGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpOwotCi0gIHVpbnQzMl90IEdldFVuaWNvZGUoKTsKLQotICBzdGQ6Om1hcDx1aW50MzJfdCwgdWludDMyX3Q+IG1fTWFwOwotICBDUERGX0NJRDJVbmljb2RlTWFwKiBtX3BCYXNlTWFwOwotICBDRlhfV2lkZVRleHRCdWYgbV9NdWx0aUNoYXJCdWY7Ci19OwotCi0jZW5kaWYgIC8vIENPUkVfRlBERkFQSV9GT05UX0ZPTlRfSU5UX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvZm9udC9mcGRmX2ZvbnQuY3BwIGIvY29yZS9mcGRmYXBpL2ZvbnQvZnBkZl9mb250LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JiZDYzNy4uMDAwMDAwMAotLS0gYS9jb3JlL2ZwZGZhcGkvZm9udC9mcGRmX2ZvbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2ZvbnRfaW50LmgiCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9jcGRmX21vZHVsZW1nci5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZm9ybS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW1vZHVsZS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL3BhZ2VpbnQuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudC5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9uYW1lLmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bWJlci5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zaW1wbGVfcGFyc2VyLmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbV9hY2MuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dC5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc2FmZV90eXBlcy5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mcmVldHlwZS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9jb252ZXJzaW9ucy5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCi0KLWludCBUVDJQREYoaW50IG0sIEZYRlRfRmFjZSBmYWNlKSB7Ci0gIGludCB1cG0gPSBGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0oZmFjZSk7Ci0gIGlmICh1cG0gPT0gMCkKLSAgICByZXR1cm4gbTsKLSAgcmV0dXJuIHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PGludD4oCi0gICAgICAoc3RhdGljX2Nhc3Q8ZG91YmxlPihtKSAqIDEwMDAgKyB1cG0gLyAyKSAvIHVwbSk7Ci19Ci0KLWJvb2wgRlRfVXNlVFRDaGFybWFwKEZYRlRfRmFjZSBmYWNlLCBpbnQgcGxhdGZvcm1faWQsIGludCBlbmNvZGluZ19pZCkgewotICBhdXRvKiBwQ2hhck1hcCA9IEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQoZmFjZSk7IGkrKykgewotICAgIGlmIChGWEZUX0dldF9DaGFybWFwX1BsYXRmb3JtSUQocENoYXJNYXBbaV0pID09IHBsYXRmb3JtX2lkICYmCi0gICAgICAgIEZYRlRfR2V0X0NoYXJtYXBfRW5jb2RpbmdJRChwQ2hhck1hcFtpXSkgPT0gZW5jb2RpbmdfaWQpIHsKLSAgICAgIEZYRlRfU2V0X0NoYXJtYXAoZmFjZSwgcENoYXJNYXBbaV0pOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotQ0ZYX1N0b2NrRm9udEFycmF5OjpDRlhfU3RvY2tGb250QXJyYXkoKSB7fQotCi1DRlhfU3RvY2tGb250QXJyYXk6On5DRlhfU3RvY2tGb250QXJyYXkoKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKG1fU3RvY2tGb250cyk7ICsraSkgewotICAgIGlmIChtX1N0b2NrRm9udHNbaV0pCi0gICAgICBkZWxldGUgbV9TdG9ja0ZvbnRzW2ldLT5HZXRGb250RGljdCgpOwotICB9Ci19Ci0KLUNQREZfRm9udCogQ0ZYX1N0b2NrRm9udEFycmF5OjpHZXRGb250KHVpbnQzMl90IGluZGV4KSBjb25zdCB7Ci0gIGlmIChpbmRleCA+PSBGWF9BcnJheVNpemUobV9TdG9ja0ZvbnRzKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIG1fU3RvY2tGb250c1tpbmRleF0uZ2V0KCk7Ci19Ci0KLUNQREZfRm9udCogQ0ZYX1N0b2NrRm9udEFycmF5OjpTZXRGb250KHVpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENQREZfRm9udD4gcEZvbnQpIHsKLSAgQ1BERl9Gb250KiByZXN1bHQgPSBwRm9udC5nZXQoKTsKLSAgaWYgKGluZGV4IDwgRlhfQXJyYXlTaXplKG1fU3RvY2tGb250cykpCi0gICAgbV9TdG9ja0ZvbnRzW2luZGV4XSA9IHN0ZDo6bW92ZShwRm9udCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLUNQREZfRm9udEdsb2JhbHM6OkNQREZfRm9udEdsb2JhbHMoKSB7Ci0gIEZYU1lTX21lbXNldChtX0VtYmVkZGVkQ2hhcnNldHMsIDAsIHNpemVvZihtX0VtYmVkZGVkQ2hhcnNldHMpKTsKLSAgRlhTWVNfbWVtc2V0KG1fRW1iZWRkZWRUb1VuaWNvZGVzLCAwLCBzaXplb2YobV9FbWJlZGRlZFRvVW5pY29kZXMpKTsKLX0KLQotQ1BERl9Gb250R2xvYmFsczo6fkNQREZfRm9udEdsb2JhbHMoKSB7fQotCi1DUERGX0ZvbnQqIENQREZfRm9udEdsb2JhbHM6OkZpbmQoQ1BERl9Eb2N1bWVudCogcERvYywgdWludDMyX3QgaW5kZXgpIHsKLSAgYXV0byBpdCA9IG1fU3RvY2tNYXAuZmluZChwRG9jKTsKLSAgaWYgKGl0ID09IG1fU3RvY2tNYXAuZW5kKCkpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIHJldHVybiBpdC0+c2Vjb25kID8gaXQtPnNlY29uZC0+R2V0Rm9udChpbmRleCkgOiBudWxscHRyOwotfQotCi1DUERGX0ZvbnQqIENQREZfRm9udEdsb2JhbHM6OlNldChDUERGX0RvY3VtZW50KiBwRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Gb250PiBwRm9udCkgewotICBpZiAoIXBkZml1bTo6Q29udGFpbnNLZXkobV9TdG9ja01hcCwgcERvYykpCi0gICAgbV9TdG9ja01hcFtwRG9jXSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfU3RvY2tGb250QXJyYXk+KCk7Ci0gIHJldHVybiBtX1N0b2NrTWFwW3BEb2NdLT5TZXRGb250KGluZGV4LCBzdGQ6Om1vdmUocEZvbnQpKTsKLX0KLQotdm9pZCBDUERGX0ZvbnRHbG9iYWxzOjpDbGVhcihDUERGX0RvY3VtZW50KiBwRG9jKSB7Ci0gIG1fU3RvY2tNYXAuZXJhc2UocERvYyk7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENQREZfVG9Vbmljb2RlTWFwOjpMb29rdXAodWludDMyX3QgY2hhcmNvZGUpIGNvbnN0IHsKLSAgYXV0byBpdCA9IG1fTWFwLmZpbmQoY2hhcmNvZGUpOwotICBpZiAoaXQgIT0gbV9NYXAuZW5kKCkpIHsKLSAgICB1aW50MzJfdCB2YWx1ZSA9IGl0LT5zZWNvbmQ7Ci0gICAgRlhfV0NIQVIgdW5pY29kZSA9IChGWF9XQ0hBUikodmFsdWUgJiAweGZmZmYpOwotICAgIGlmICh1bmljb2RlICE9IDB4ZmZmZikgewotICAgICAgcmV0dXJuIHVuaWNvZGU7Ci0gICAgfQotICAgIGNvbnN0IEZYX1dDSEFSKiBidWYgPSBtX011bHRpQ2hhckJ1Zi5HZXRCdWZmZXIoKTsKLSAgICB1aW50MzJfdCBidWZfbGVuID0gbV9NdWx0aUNoYXJCdWYuR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKCFidWYgfHwgYnVmX2xlbiA9PSAwKSB7Ci0gICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICB9Ci0gICAgdWludDMyX3QgaW5kZXggPSB2YWx1ZSA+PiAxNjsKLSAgICBpZiAoaW5kZXggPj0gYnVmX2xlbikgewotICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgfQotICAgIHVpbnQzMl90IGxlbiA9IGJ1ZltpbmRleF07Ci0gICAgaWYgKGluZGV4ICsgbGVuIDwgaW5kZXggfHwgaW5kZXggKyBsZW4gPj0gYnVmX2xlbikgewotICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZyhidWYgKyBpbmRleCArIDEsIGxlbik7Ci0gIH0KLSAgaWYgKG1fcEJhc2VNYXApIHsKLSAgICByZXR1cm4gbV9wQmFzZU1hcC0+VW5pY29kZUZyb21DSUQoKHVpbnQxNl90KWNoYXJjb2RlKTsKLSAgfQotICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLX0KLQotdWludDMyX3QgQ1BERl9Ub1VuaWNvZGVNYXA6OlJldmVyc2VMb29rdXAoRlhfV0NIQVIgdW5pY29kZSkgY29uc3QgewotICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtX01hcCkgewotICAgIGlmIChwYWlyLnNlY29uZCA9PSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odW5pY29kZSkpCi0gICAgICByZXR1cm4gcGFpci5maXJzdDsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotLy8gU3RhdGljLgotdWludDMyX3QgQ1BERl9Ub1VuaWNvZGVNYXA6OlN0cmluZ1RvQ29kZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgewotICBpbnQgbGVuID0gc3RyLkdldExlbmd0aCgpOwotICBpZiAobGVuID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgaWYgKHN0clswXSA9PSAnPCcpIHsKLSAgICBmb3IgKGludCBpID0gMTsgaSA8IGxlbiAmJiBzdGQ6OmlzeGRpZ2l0KHN0cltpXSk7ICsraSkKLSAgICAgIHJlc3VsdCA9IHJlc3VsdCAqIDE2ICsgRlhTWVNfdG9IZXhEaWdpdChzdHIuQ2hhckF0KGkpKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW4gJiYgc3RkOjppc2RpZ2l0KHN0cltpXSk7ICsraSkKLSAgICByZXN1bHQgPSByZXN1bHQgKiAxMCArIEZYU1lTX3RvRGVjaW1hbERpZ2l0KHN0ci5DaGFyQXQoaSkpOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBDRlhfV2lkZVN0cmluZyBTdHJpbmdEYXRhQWRkKENGWF9XaWRlU3RyaW5nIHN0cikgewotICBDRlhfV2lkZVN0cmluZyByZXQ7Ci0gIGludCBsZW4gPSBzdHIuR2V0TGVuZ3RoKCk7Ci0gIEZYX1dDSEFSIHZhbHVlID0gMTsKLSAgZm9yIChpbnQgaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0gICAgRlhfV0NIQVIgY2ggPSBzdHJbaV0gKyB2YWx1ZTsKLSAgICBpZiAoY2ggPCBzdHJbaV0pIHsKLSAgICAgIHJldC5JbnNlcnQoMCwgMCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldC5JbnNlcnQoMCwgY2gpOwotICAgICAgdmFsdWUgPSAwOwotICAgIH0KLSAgfQotICBpZiAodmFsdWUpIHsKLSAgICByZXQuSW5zZXJ0KDAsIHZhbHVlKTsKLSAgfQotICByZXR1cm4gcmV0OwotfQotCi0vLyBTdGF0aWMuCi1DRlhfV2lkZVN0cmluZyBDUERGX1RvVW5pY29kZU1hcDo6U3RyaW5nVG9XaWRlU3RyaW5nKAotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSB7Ci0gIGludCBsZW4gPSBzdHIuR2V0TGVuZ3RoKCk7Ci0gIGlmIChsZW4gPT0gMCkKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLQotICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7Ci0gIGlmIChzdHJbMF0gPT0gJzwnKSB7Ci0gICAgaW50IGJ5dGVfcG9zID0gMDsKLSAgICBGWF9XQ0hBUiBjaCA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsZW4gJiYgc3RkOjppc3hkaWdpdChzdHJbaV0pOyArK2kpIHsKLSAgICAgIGNoID0gY2ggKiAxNiArIEZYU1lTX3RvSGV4RGlnaXQoc3RyW2ldKTsKLSAgICAgIGJ5dGVfcG9zKys7Ci0gICAgICBpZiAoYnl0ZV9wb3MgPT0gNCkgewotICAgICAgICByZXN1bHQgKz0gY2g7Ci0gICAgICAgIGJ5dGVfcG9zID0gMDsKLSAgICAgICAgY2ggPSAwOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLUNQREZfVG9Vbmljb2RlTWFwOjpDUERGX1RvVW5pY29kZU1hcCgpIDogbV9wQmFzZU1hcChudWxscHRyKSB7fQotCi1DUERGX1RvVW5pY29kZU1hcDo6fkNQREZfVG9Vbmljb2RlTWFwKCkge30KLQotdWludDMyX3QgQ1BERl9Ub1VuaWNvZGVNYXA6OkdldFVuaWNvZGUoKSB7Ci0gIEZYX1NBRkVfVUlOVDMyIHVuaSA9IG1fTXVsdGlDaGFyQnVmLkdldExlbmd0aCgpOwotICB1bmkgPSB1bmkgKiAweDEwMDAwICsgMHhmZmZmOwotICByZXR1cm4gdW5pLlZhbHVlT3JEZWZhdWx0KDApOwotfQotCi12b2lkIENQREZfVG9Vbmljb2RlTWFwOjpMb2FkKENQREZfU3RyZWFtKiBwU3RyZWFtKSB7Ci0gIENJRFNldCBjaWRfc2V0ID0gQ0lEU0VUX1VOS05PV047Ci0gIENQREZfU3RyZWFtQWNjIHN0cmVhbTsKLSAgc3RyZWFtLkxvYWRBbGxEYXRhKHBTdHJlYW0sIGZhbHNlKTsKLSAgQ1BERl9TaW1wbGVQYXJzZXIgcGFyc2VyKHN0cmVhbS5HZXREYXRhKCksIHN0cmVhbS5HZXRTaXplKCkpOwotICB3aGlsZSAoMSkgewotICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gcGFyc2VyLkdldFdvcmQoKTsKLSAgICBpZiAod29yZC5Jc0VtcHR5KCkpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAod29yZCA9PSAiYmVnaW5iZmNoYXIiKSB7Ci0gICAgICB3aGlsZSAoMSkgewotICAgICAgICB3b3JkID0gcGFyc2VyLkdldFdvcmQoKTsKLSAgICAgICAgaWYgKHdvcmQuSXNFbXB0eSgpIHx8IHdvcmQgPT0gImVuZGJmY2hhciIpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB1aW50MzJfdCBzcmNjb2RlID0gU3RyaW5nVG9Db2RlKHdvcmQpOwotICAgICAgICB3b3JkID0gcGFyc2VyLkdldFdvcmQoKTsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgZGVzdGNvZGUgPSBTdHJpbmdUb1dpZGVTdHJpbmcod29yZCk7Ci0gICAgICAgIGludCBsZW4gPSBkZXN0Y29kZS5HZXRMZW5ndGgoKTsKLSAgICAgICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxlbiA9PSAxKSB7Ci0gICAgICAgICAgbV9NYXBbc3JjY29kZV0gPSBkZXN0Y29kZS5HZXRBdCgwKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBtX01hcFtzcmNjb2RlXSA9IEdldFVuaWNvZGUoKTsKLSAgICAgICAgICBtX011bHRpQ2hhckJ1Zi5BcHBlbmRDaGFyKGRlc3Rjb2RlLkdldExlbmd0aCgpKTsKLSAgICAgICAgICBtX011bHRpQ2hhckJ1ZiA8PCBkZXN0Y29kZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSBpZiAod29yZCA9PSAiYmVnaW5iZnJhbmdlIikgewotICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgbG93LCBoaWdoOwotICAgICAgICBsb3cgPSBwYXJzZXIuR2V0V29yZCgpOwotICAgICAgICBpZiAobG93LklzRW1wdHkoKSB8fCBsb3cgPT0gImVuZGJmcmFuZ2UiKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaGlnaCA9IHBhcnNlci5HZXRXb3JkKCk7Ci0gICAgICAgIHVpbnQzMl90IGxvd2NvZGUgPSBTdHJpbmdUb0NvZGUobG93LkFzU3RyaW5nQygpKTsKLSAgICAgICAgdWludDMyX3QgaGlnaGNvZGUgPQotICAgICAgICAgICAgKGxvd2NvZGUgJiAweGZmZmZmZjAwKSB8IChTdHJpbmdUb0NvZGUoaGlnaC5Bc1N0cmluZ0MoKSkgJiAweGZmKTsKLSAgICAgICAgaWYgKGhpZ2hjb2RlID09ICh1aW50MzJfdCktMSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHN0YXJ0KHBhcnNlci5HZXRXb3JkKCkpOwotICAgICAgICBpZiAoc3RhcnQgPT0gIlsiKSB7Ci0gICAgICAgICAgZm9yICh1aW50MzJfdCBjb2RlID0gbG93Y29kZTsgY29kZSA8PSBoaWdoY29kZTsgY29kZSsrKSB7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBkZXN0KHBhcnNlci5HZXRXb3JkKCkpOwotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgZGVzdGNvZGUgPSBTdHJpbmdUb1dpZGVTdHJpbmcoZGVzdC5Bc1N0cmluZ0MoKSk7Ci0gICAgICAgICAgICBpbnQgbGVuID0gZGVzdGNvZGUuR2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAobGVuID09IDApIHsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobGVuID09IDEpIHsKLSAgICAgICAgICAgICAgbV9NYXBbY29kZV0gPSBkZXN0Y29kZS5HZXRBdCgwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIG1fTWFwW2NvZGVdID0gR2V0VW5pY29kZSgpOwotICAgICAgICAgICAgICBtX011bHRpQ2hhckJ1Zi5BcHBlbmRDaGFyKGRlc3Rjb2RlLkdldExlbmd0aCgpKTsKLSAgICAgICAgICAgICAgbV9NdWx0aUNoYXJCdWYgPDwgZGVzdGNvZGU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHBhcnNlci5HZXRXb3JkKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgZGVzdGNvZGUgPSBTdHJpbmdUb1dpZGVTdHJpbmcoc3RhcnQuQXNTdHJpbmdDKCkpOwotICAgICAgICAgIGludCBsZW4gPSBkZXN0Y29kZS5HZXRMZW5ndGgoKTsKLSAgICAgICAgICB1aW50MzJfdCB2YWx1ZSA9IDA7Ci0gICAgICAgICAgaWYgKGxlbiA9PSAxKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IFN0cmluZ1RvQ29kZShzdGFydC5Bc1N0cmluZ0MoKSk7Ci0gICAgICAgICAgICBmb3IgKHVpbnQzMl90IGNvZGUgPSBsb3djb2RlOyBjb2RlIDw9IGhpZ2hjb2RlOyBjb2RlKyspIHsKLSAgICAgICAgICAgICAgbV9NYXBbY29kZV0gPSB2YWx1ZSsrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKHVpbnQzMl90IGNvZGUgPSBsb3djb2RlOyBjb2RlIDw9IGhpZ2hjb2RlOyBjb2RlKyspIHsKLSAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgcmV0Y29kZTsKLSAgICAgICAgICAgICAgaWYgKGNvZGUgPT0gbG93Y29kZSkgewotICAgICAgICAgICAgICAgIHJldGNvZGUgPSBkZXN0Y29kZTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXRjb2RlID0gU3RyaW5nRGF0YUFkZChkZXN0Y29kZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgbV9NYXBbY29kZV0gPSBHZXRVbmljb2RlKCk7Ci0gICAgICAgICAgICAgIG1fTXVsdGlDaGFyQnVmLkFwcGVuZENoYXIocmV0Y29kZS5HZXRMZW5ndGgoKSk7Ci0gICAgICAgICAgICAgIG1fTXVsdGlDaGFyQnVmIDw8IHJldGNvZGU7Ci0gICAgICAgICAgICAgIGRlc3Rjb2RlID0gcmV0Y29kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHdvcmQgPT0gIi9BZG9iZS1Lb3JlYTEtVUNTMiIpIHsKLSAgICAgIGNpZF9zZXQgPSBDSURTRVRfS09SRUExOwotICAgIH0gZWxzZSBpZiAod29yZCA9PSAiL0Fkb2JlLUphcGFuMS1VQ1MyIikgewotICAgICAgY2lkX3NldCA9IENJRFNFVF9KQVBBTjE7Ci0gICAgfSBlbHNlIGlmICh3b3JkID09ICIvQWRvYmUtQ05TMS1VQ1MyIikgewotICAgICAgY2lkX3NldCA9IENJRFNFVF9DTlMxOwotICAgIH0gZWxzZSBpZiAod29yZCA9PSAiL0Fkb2JlLUdCMS1VQ1MyIikgewotICAgICAgY2lkX3NldCA9IENJRFNFVF9HQjE7Ci0gICAgfQotICB9Ci0gIGlmIChjaWRfc2V0KSB7Ci0gICAgbV9wQmFzZU1hcCA9IENQREZfTW9kdWxlTWdyOjpHZXQoKQotICAgICAgICAgICAgICAgICAgICAgLT5HZXRQYWdlTW9kdWxlKCkKLSAgICAgICAgICAgICAgICAgICAgIC0+R2V0Rm9udEdsb2JhbHMoKQotICAgICAgICAgICAgICAgICAgICAgLT5tX0NNYXBNYW5hZ2VyLkdldENJRDJVbmljb2RlTWFwKGNpZF9zZXQsIGZhbHNlKTsKLSAgfSBlbHNlIHsKLSAgICBtX3BCYXNlTWFwID0gbnVsbHB0cjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2ZvbnQvZnBkZl9mb250X2NpZC5jcHAgYi9jb3JlL2ZwZGZhcGkvZm9udC9mcGRmX2ZvbnRfY2lkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiMTg2ZC4uMDAwMDAwMAotLS0gYS9jb3JlL2ZwZGZhcGkvZm9udC9mcGRmX2ZvbnRfY2lkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc4NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9mb250X2ludC5oIgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvY21hcHMvY21hcF9pbnQuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvY3BkZl9tb2R1bGVtZ3IuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC90dGdzdWJ0YWJsZS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW1vZHVsZS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3NpbXBsZV9wYXJzZXIuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dC5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mcmVldHlwZS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKLQotbmFtZXNwYWNlIHsKLQotY29uc3QgRlhfQ0hBUiogY29uc3QgZ19DaGFyc2V0TmFtZXNbQ0lEU0VUX05VTV9TRVRTXSA9IHsKLSAgICBudWxscHRyLCAiR0IxIiwgIkNOUzEiLCAiSmFwYW4xIiwgIktvcmVhMSIsICJVQ1MifTsKLQotY2xhc3MgQ1BERl9QcmVkZWZpbmVkQ01hcCB7Ci0gcHVibGljOgotICBjb25zdCBGWF9DSEFSKiBtX3BOYW1lOwotICBDSURTZXQgbV9DaGFyc2V0OwotICBDSURDb2RpbmcgbV9Db2Rpbmc7Ci0gIENQREZfQ01hcDo6Q29kaW5nU2NoZW1lIG1fQ29kaW5nU2NoZW1lOwotICB1aW50OF90IG1fTGVhZGluZ1NlZ0NvdW50OwotICB1aW50OF90IG1fTGVhZGluZ1NlZ3NbNF07Ci19OwotCi1jb25zdCBDUERGX1ByZWRlZmluZWRDTWFwIGdfUHJlZGVmaW5lZENNYXBzW10gPSB7Ci0gICAgeyJHQi1FVUMiLAotICAgICBDSURTRVRfR0IxLAotICAgICBDSURDT0RJTkdfR0IsCi0gICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKLSAgICAgMSwKLSAgICAgezB4YTEsIDB4ZmV9fSwKLSAgICB7IkdCcGMtRVVDIiwKLSAgICAgQ0lEU0VUX0dCMSwKLSAgICAgQ0lEQ09ESU5HX0dCLAotICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCi0gICAgIDEsCi0gICAgIHsweGExLCAweGZjfX0sCi0gICAgeyJHQkstRVVDIiwKLSAgICAgQ0lEU0VUX0dCMSwKLSAgICAgQ0lEQ09ESU5HX0dCLAotICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCi0gICAgIDEsCi0gICAgIHsweDgxLCAweGZlfX0sCi0gICAgeyJHQktwLUVVQyIsCi0gICAgIENJRFNFVF9HQjEsCi0gICAgIENJRENPRElOR19HQiwKLSAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAotICAgICAxLAotICAgICB7MHg4MSwgMHhmZX19LAotICAgIHsiR0JLMkstRVVDIiwKLSAgICAgQ0lEU0VUX0dCMSwKLSAgICAgQ0lEQ09ESU5HX0dCLAotICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCi0gICAgIDEsCi0gICAgIHsweDgxLCAweGZlfX0sCi0gICAgeyJHQksySyIsCi0gICAgIENJRFNFVF9HQjEsCi0gICAgIENJRENPRElOR19HQiwKLSAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAotICAgICAxLAotICAgICB7MHg4MSwgMHhmZX19LAotICAgIHsiVW5pR0ItVUNTMiIsIENJRFNFVF9HQjEsIENJRENPRElOR19VQ1MyLCBDUERGX0NNYXA6OlR3b0J5dGVzLCAwLCB7fX0sCi0gICAgeyJVbmlHQi1VVEYxNiIsIENJRFNFVF9HQjEsIENJRENPRElOR19VVEYxNiwgQ1BERl9DTWFwOjpUd29CeXRlcywgMCwge319LAotICAgIHsiQjVwYyIsCi0gICAgIENJRFNFVF9DTlMxLAotICAgICBDSURDT0RJTkdfQklHNSwKLSAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAotICAgICAxLAotICAgICB7MHhhMSwgMHhmY319LAotICAgIHsiSEtzY3MtQjUiLAotICAgICBDSURTRVRfQ05TMSwKLSAgICAgQ0lEQ09ESU5HX0JJRzUsCi0gICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKLSAgICAgMSwKLSAgICAgezB4ODgsIDB4ZmV9fSwKLSAgICB7IkVUZW4tQjUiLAotICAgICBDSURTRVRfQ05TMSwKLSAgICAgQ0lEQ09ESU5HX0JJRzUsCi0gICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKLSAgICAgMSwKLSAgICAgezB4YTEsIDB4ZmV9fSwKLSAgICB7IkVUZW5tcy1CNSIsCi0gICAgIENJRFNFVF9DTlMxLAotICAgICBDSURDT0RJTkdfQklHNSwKLSAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAotICAgICAxLAotICAgICB7MHhhMSwgMHhmZX19LAotICAgIHsiVW5pQ05TLVVDUzIiLCBDSURTRVRfQ05TMSwgQ0lEQ09ESU5HX1VDUzIsIENQREZfQ01hcDo6VHdvQnl0ZXMsIDAsIHt9fSwKLSAgICB7IlVuaUNOUy1VVEYxNiIsIENJRFNFVF9DTlMxLCBDSURDT0RJTkdfVVRGMTYsIENQREZfQ01hcDo6VHdvQnl0ZXMsIDAsIHt9fSwKLSAgICB7IjgzcHYtUktTSiIsCi0gICAgIENJRFNFVF9KQVBBTjEsCi0gICAgIENJRENPRElOR19KSVMsCi0gICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKLSAgICAgMiwKLSAgICAgezB4ODEsIDB4OWYsIDB4ZTAsIDB4ZmN9fSwKLSAgICB7IjkwbXMtUktTSiIsCi0gICAgIENJRFNFVF9KQVBBTjEsCi0gICAgIENJRENPRElOR19KSVMsCi0gICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKLSAgICAgMiwKLSAgICAgezB4ODEsIDB4OWYsIDB4ZTAsIDB4ZmN9fSwKLSAgICB7IjkwbXNwLVJLU0oiLAotICAgICBDSURTRVRfSkFQQU4xLAotICAgICBDSURDT0RJTkdfSklTLAotICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCi0gICAgIDIsCi0gICAgIHsweDgxLCAweDlmLCAweGUwLCAweGZjfX0sCi0gICAgeyI5MHB2LVJLU0oiLAotICAgICBDSURTRVRfSkFQQU4xLAotICAgICBDSURDT0RJTkdfSklTLAotICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCi0gICAgIDIsCi0gICAgIHsweDgxLCAweDlmLCAweGUwLCAweGZjfX0sCi0gICAgeyJBZGQtUktTSiIsCi0gICAgIENJRFNFVF9KQVBBTjEsCi0gICAgIENJRENPRElOR19KSVMsCi0gICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKLSAgICAgMiwKLSAgICAgezB4ODEsIDB4OWYsIDB4ZTAsIDB4ZmN9fSwKLSAgICB7IkVVQyIsCi0gICAgIENJRFNFVF9KQVBBTjEsCi0gICAgIENJRENPRElOR19KSVMsCi0gICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKLSAgICAgMiwKLSAgICAgezB4OGUsIDB4OGUsIDB4YTEsIDB4ZmV9fSwKLSAgICB7IkgiLCBDSURTRVRfSkFQQU4xLCBDSURDT0RJTkdfSklTLCBDUERGX0NNYXA6OlR3b0J5dGVzLCAxLCB7MHgyMSwgMHg3ZX19LAotICAgIHsiViIsIENJRFNFVF9KQVBBTjEsIENJRENPRElOR19KSVMsIENQREZfQ01hcDo6VHdvQnl0ZXMsIDEsIHsweDIxLCAweDdlfX0sCi0gICAgeyJFeHQtUktTSiIsCi0gICAgIENJRFNFVF9KQVBBTjEsCi0gICAgIENJRENPRElOR19KSVMsCi0gICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKLSAgICAgMiwKLSAgICAgezB4ODEsIDB4OWYsIDB4ZTAsIDB4ZmN9fSwKLSAgICB7IlVuaUpJUy1VQ1MyIiwgQ0lEU0VUX0pBUEFOMSwgQ0lEQ09ESU5HX1VDUzIsIENQREZfQ01hcDo6VHdvQnl0ZXMsIDAsIHt9fSwKLSAgICB7IlVuaUpJUy1VQ1MyLUhXIiwKLSAgICAgQ0lEU0VUX0pBUEFOMSwKLSAgICAgQ0lEQ09ESU5HX1VDUzIsCi0gICAgIENQREZfQ01hcDo6VHdvQnl0ZXMsCi0gICAgIDAsCi0gICAgIHt9fSwKLSAgICB7IlVuaUpJUy1VVEYxNiIsCi0gICAgIENJRFNFVF9KQVBBTjEsCi0gICAgIENJRENPRElOR19VVEYxNiwKLSAgICAgQ1BERl9DTWFwOjpUd29CeXRlcywKLSAgICAgMCwKLSAgICAge319LAotICAgIHsiS1NDLUVVQyIsCi0gICAgIENJRFNFVF9LT1JFQTEsCi0gICAgIENJRENPRElOR19LT1JFQSwKLSAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAotICAgICAxLAotICAgICB7MHhhMSwgMHhmZX19LAotICAgIHsiS1NDbXMtVUhDIiwKLSAgICAgQ0lEU0VUX0tPUkVBMSwKLSAgICAgQ0lEQ09ESU5HX0tPUkVBLAotICAgICBDUERGX0NNYXA6Ok1peGVkVHdvQnl0ZXMsCi0gICAgIDEsCi0gICAgIHsweDgxLCAweGZlfX0sCi0gICAgeyJLU0Ntcy1VSEMtSFciLAotICAgICBDSURTRVRfS09SRUExLAotICAgICBDSURDT0RJTkdfS09SRUEsCi0gICAgIENQREZfQ01hcDo6TWl4ZWRUd29CeXRlcywKLSAgICAgMSwKLSAgICAgezB4ODEsIDB4ZmV9fSwKLSAgICB7IktTQ3BjLUVVQyIsCi0gICAgIENJRFNFVF9LT1JFQTEsCi0gICAgIENJRENPRElOR19LT1JFQSwKLSAgICAgQ1BERl9DTWFwOjpNaXhlZFR3b0J5dGVzLAotICAgICAxLAotICAgICB7MHhhMSwgMHhmZH19LAotICAgIHsiVW5pS1MtVUNTMiIsIENJRFNFVF9LT1JFQTEsIENJRENPRElOR19VQ1MyLCBDUERGX0NNYXA6OlR3b0J5dGVzLCAwLCB7fX0sCi0gICAgeyJVbmlLUy1VVEYxNiIsIENJRFNFVF9LT1JFQTEsIENJRENPRElOR19VVEYxNiwgQ1BERl9DTWFwOjpUd29CeXRlcywgMCwge319LAotfTsKLQotQ0lEU2V0IENJRFNldEZyb21TaXplVChzaXplX3QgaW5kZXgpIHsKLSAgaWYgKGluZGV4ID49IENJRFNFVF9OVU1fU0VUUykgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gQ0lEU0VUX1VOS05PV047Ci0gIH0KLSAgcmV0dXJuIHN0YXRpY19jYXN0PENJRFNldD4oaW5kZXgpOwotfQotCi1DRlhfQnl0ZVN0cmluZ0MgQ01hcF9HZXRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB3b3JkKSB7Ci0gIGlmICh3b3JkLkdldExlbmd0aCgpIDw9IDIpCi0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQygpOwotICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKCZ3b3JkWzFdLCB3b3JkLkdldExlbmd0aCgpIC0gMik7Ci19Ci0KLWludCBDb21wYXJlRFdPUkQoY29uc3Qgdm9pZCogZGF0YTEsIGNvbnN0IHZvaWQqIGRhdGEyKSB7Ci0gIHJldHVybiAoKih1aW50MzJfdCopZGF0YTEpIC0gKCoodWludDMyX3QqKWRhdGEyKTsKLX0KLQotaW50IENvbXBhcmVDSUQoY29uc3Qgdm9pZCoga2V5LCBjb25zdCB2b2lkKiBlbGVtZW50KSB7Ci0gIGlmICgoKih1aW50MzJfdCopa2V5KSA8ICgqKHVpbnQzMl90KillbGVtZW50KSkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAoKCoodWludDMyX3QqKWtleSkgPgotICAgICAgKCoodWludDMyX3QqKWVsZW1lbnQpICsgKCh1aW50MzJfdCopZWxlbWVudClbMV0gLyA2NTUzNikgewotICAgIHJldHVybiAxOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1pbnQgQ2hlY2tDb2RlUmFuZ2UodWludDhfdCogY29kZXMsCi0gICAgICAgICAgICAgICAgICAgaW50IHNpemUsCi0gICAgICAgICAgICAgICAgICAgQ01hcF9Db2RlUmFuZ2UqIHBSYW5nZXMsCi0gICAgICAgICAgICAgICAgICAgaW50IG5SYW5nZXMpIHsKLSAgaW50IGlTZWcgPSBuUmFuZ2VzIC0gMTsKLSAgd2hpbGUgKGlTZWcgPj0gMCkgewotICAgIGlmIChwUmFuZ2VzW2lTZWddLm1fQ2hhclNpemUgPCBzaXplKSB7Ci0gICAgICAtLWlTZWc7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaW50IGlDaGFyID0gMDsKLSAgICB3aGlsZSAoaUNoYXIgPCBzaXplKSB7Ci0gICAgICBpZiAoY29kZXNbaUNoYXJdIDwgcFJhbmdlc1tpU2VnXS5tX0xvd2VyW2lDaGFyXSB8fAotICAgICAgICAgIGNvZGVzW2lDaGFyXSA+IHBSYW5nZXNbaVNlZ10ubV9VcHBlcltpQ2hhcl0pIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICArK2lDaGFyOwotICAgIH0KLSAgICBpZiAoaUNoYXIgPT0gcFJhbmdlc1tpU2VnXS5tX0NoYXJTaXplKQotICAgICAgcmV0dXJuIDI7Ci0KLSAgICBpZiAoaUNoYXIpCi0gICAgICByZXR1cm4gKHNpemUgPT0gcFJhbmdlc1tpU2VnXS5tX0NoYXJTaXplKSA/IDIgOiAxOwotICAgIGlTZWctLTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotaW50IEdldENoYXJTaXplSW1wbCh1aW50MzJfdCBjaGFyY29kZSwKLSAgICAgICAgICAgICAgICAgICAgQ01hcF9Db2RlUmFuZ2UqIHBSYW5nZXMsCi0gICAgICAgICAgICAgICAgICAgIGludCBpUmFuZ2VzU2l6ZSkgewotICBpZiAoIWlSYW5nZXNTaXplKQotICAgIHJldHVybiAxOwotCi0gIHVpbnQ4X3QgY29kZXNbNF07Ci0gIGNvZGVzWzBdID0gY29kZXNbMV0gPSAweDAwOwotICBjb2Rlc1syXSA9ICh1aW50OF90KShjaGFyY29kZSA+PiA4ICYgMHhGRik7Ci0gIGNvZGVzWzNdID0gKHVpbnQ4X3QpY2hhcmNvZGU7Ci0gIGludCBvZmZzZXQgPSAwOwotICBpbnQgc2l6ZSA9IDQ7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7Ci0gICAgaW50IGlTZWcgPSBpUmFuZ2VzU2l6ZSAtIDE7Ci0gICAgd2hpbGUgKGlTZWcgPj0gMCkgewotICAgICAgaWYgKHBSYW5nZXNbaVNlZ10ubV9DaGFyU2l6ZSA8IHNpemUpIHsKLSAgICAgICAgLS1pU2VnOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGludCBpQ2hhciA9IDA7Ci0gICAgICB3aGlsZSAoaUNoYXIgPCBzaXplKSB7Ci0gICAgICAgIGlmIChjb2Rlc1tvZmZzZXQgKyBpQ2hhcl0gPCBwUmFuZ2VzW2lTZWddLm1fTG93ZXJbaUNoYXJdIHx8Ci0gICAgICAgICAgICBjb2Rlc1tvZmZzZXQgKyBpQ2hhcl0gPiBwUmFuZ2VzW2lTZWddLm1fVXBwZXJbaUNoYXJdKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgKytpQ2hhcjsKLSAgICAgIH0KLSAgICAgIGlmIChpQ2hhciA9PSBwUmFuZ2VzW2lTZWddLm1fQ2hhclNpemUpCi0gICAgICAgIHJldHVybiBzaXplOwotICAgICAgLS1pU2VnOwotICAgIH0KLSAgICAtLXNpemU7Ci0gICAgKytvZmZzZXQ7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1DUERGX0NNYXBNYW5hZ2VyOjpDUERGX0NNYXBNYW5hZ2VyKCkge30KLQotQ1BERl9DTWFwTWFuYWdlcjo6fkNQREZfQ01hcE1hbmFnZXIoKSB7fQotCi1DRlhfTWF5YmVPd25lZDxDUERGX0NNYXA+IENQREZfQ01hcE1hbmFnZXI6OkdldFByZWRlZmluZWRDTWFwKAotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLAotICAgIGJvb2wgYlByb21wdENKSykgewotICBhdXRvIGl0ID0gbV9DTWFwcy5maW5kKG5hbWUpOwotICBpZiAoaXQgIT0gbV9DTWFwcy5lbmQoKSkKLSAgICByZXR1cm4gQ0ZYX01heWJlT3duZWQ8Q1BERl9DTWFwPihpdC0+c2Vjb25kLmdldCgpKTsgIC8vIFVub3duZWQuCi0KLSAgc3RkOjp1bmlxdWVfcHRyPENQREZfQ01hcD4gcENNYXAgPSBMb2FkUHJlZGVmaW5lZENNYXAobmFtZSwgYlByb21wdENKSyk7Ci0gIGlmIChuYW1lLklzRW1wdHkoKSkKLSAgICByZXR1cm4gQ0ZYX01heWJlT3duZWQ8Q1BERl9DTWFwPihzdGQ6Om1vdmUocENNYXApKTsgIC8vIE93bmVkLgotCi0gIENQREZfQ01hcCogcFVub3duZWQgPSBwQ01hcC5nZXQoKTsKLSAgbV9DTWFwc1tuYW1lXSA9IHN0ZDo6bW92ZShwQ01hcCk7Ci0gIHJldHVybiBDRlhfTWF5YmVPd25lZDxDUERGX0NNYXA+KHBVbm93bmVkKTsgIC8vIFVub3duZWQuCi19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxDUERGX0NNYXA+IENQREZfQ01hcE1hbmFnZXI6OkxvYWRQcmVkZWZpbmVkQ01hcCgKLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwKLSAgICBib29sIGJQcm9tcHRDSkspIHsKLSAgYXV0byBwQ01hcCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0NNYXA+KCk7Ci0gIGNvbnN0IEZYX0NIQVIqIHBuYW1lID0gbmFtZS5jX3N0cigpOwotICBpZiAoKnBuYW1lID09ICcvJykKLSAgICBwbmFtZSsrOwotCi0gIHBDTWFwLT5Mb2FkUHJlZGVmaW5lZCh0aGlzLCBwbmFtZSwgYlByb21wdENKSyk7Ci0gIHJldHVybiBwQ01hcDsKLX0KLQotQ1BERl9DSUQyVW5pY29kZU1hcCogQ1BERl9DTWFwTWFuYWdlcjo6R2V0Q0lEMlVuaWNvZGVNYXAoQ0lEU2V0IGNoYXJzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJQcm9tcHRDSkspIHsKLSAgaWYgKCFtX0NJRDJVbmljb2RlTWFwc1tjaGFyc2V0XSkKLSAgICBtX0NJRDJVbmljb2RlTWFwc1tjaGFyc2V0XSA9IExvYWRDSUQyVW5pY29kZU1hcChjaGFyc2V0LCBiUHJvbXB0Q0pLKTsKLQotICByZXR1cm4gbV9DSUQyVW5pY29kZU1hcHNbY2hhcnNldF0uZ2V0KCk7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxDUERGX0NJRDJVbmljb2RlTWFwPiBDUERGX0NNYXBNYW5hZ2VyOjpMb2FkQ0lEMlVuaWNvZGVNYXAoCi0gICAgQ0lEU2V0IGNoYXJzZXQsCi0gICAgYm9vbCBiUHJvbXB0Q0pLKSB7Ci0gIGF1dG8gcE1hcCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0NJRDJVbmljb2RlTWFwPigpOwotICBwTWFwLT5Mb2FkKHRoaXMsIGNoYXJzZXQsIGJQcm9tcHRDSkspOwotICByZXR1cm4gcE1hcDsKLX0KLQotQ1BERl9DTWFwUGFyc2VyOjpDUERGX0NNYXBQYXJzZXIoKQotICAgIDogbV9wQ01hcChudWxscHRyKSwgbV9TdGF0dXMoMCksIG1fQ29kZVNlcSgwKSB7fQotCi1DUERGX0NNYXBQYXJzZXI6On5DUERGX0NNYXBQYXJzZXIoKSB7fQotCi12b2lkIENQREZfQ01hcFBhcnNlcjo6SW5pdGlhbGl6ZShDUERGX0NNYXAqIHBDTWFwKSB7Ci0gIG1fcENNYXAgPSBwQ01hcDsKLSAgbV9TdGF0dXMgPSAwOwotICBtX0NvZGVTZXEgPSAwOwotICBtX0FkZE1hcHMuRXN0aW1hdGVTaXplKDAsIDEwMjQwKTsKLX0KLQotdm9pZCBDUERGX0NNYXBQYXJzZXI6OlBhcnNlV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHdvcmQpIHsKLSAgaWYgKHdvcmQuSXNFbXB0eSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmICh3b3JkID09ICJiZWdpbmNpZGNoYXIiKSB7Ci0gICAgbV9TdGF0dXMgPSAxOwotICAgIG1fQ29kZVNlcSA9IDA7Ci0gIH0gZWxzZSBpZiAod29yZCA9PSAiYmVnaW5jaWRyYW5nZSIpIHsKLSAgICBtX1N0YXR1cyA9IDI7Ci0gICAgbV9Db2RlU2VxID0gMDsKLSAgfSBlbHNlIGlmICh3b3JkID09ICJlbmRjaWRyYW5nZSIgfHwgd29yZCA9PSAiZW5kY2lkY2hhciIpIHsKLSAgICBtX1N0YXR1cyA9IDA7Ci0gIH0gZWxzZSBpZiAod29yZCA9PSAiL1dNb2RlIikgewotICAgIG1fU3RhdHVzID0gNjsKLSAgfSBlbHNlIGlmICh3b3JkID09ICIvUmVnaXN0cnkiKSB7Ci0gICAgbV9TdGF0dXMgPSAzOwotICB9IGVsc2UgaWYgKHdvcmQgPT0gIi9PcmRlcmluZyIpIHsKLSAgICBtX1N0YXR1cyA9IDQ7Ci0gIH0gZWxzZSBpZiAod29yZCA9PSAiL1N1cHBsZW1lbnQiKSB7Ci0gICAgbV9TdGF0dXMgPSA1OwotICB9IGVsc2UgaWYgKHdvcmQgPT0gImJlZ2luY29kZXNwYWNlcmFuZ2UiKSB7Ci0gICAgbV9TdGF0dXMgPSA3OwotICAgIG1fQ29kZVNlcSA9IDA7Ci0gIH0gZWxzZSBpZiAod29yZCA9PSAidXNlY21hcCIpIHsKLSAgfSBlbHNlIGlmIChtX1N0YXR1cyA9PSAxIHx8IG1fU3RhdHVzID09IDIpIHsKLSAgICBtX0NvZGVQb2ludHNbbV9Db2RlU2VxXSA9IENNYXBfR2V0Q29kZSh3b3JkKTsKLSAgICBtX0NvZGVTZXErKzsKLSAgICB1aW50MzJfdCBTdGFydENvZGUsIEVuZENvZGU7Ci0gICAgdWludDE2X3QgU3RhcnRDSUQ7Ci0gICAgaWYgKG1fU3RhdHVzID09IDEpIHsKLSAgICAgIGlmIChtX0NvZGVTZXEgPCAyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIEVuZENvZGUgPSBTdGFydENvZGUgPSBtX0NvZGVQb2ludHNbMF07Ci0gICAgICBTdGFydENJRCA9ICh1aW50MTZfdCltX0NvZGVQb2ludHNbMV07Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChtX0NvZGVTZXEgPCAzKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIFN0YXJ0Q29kZSA9IG1fQ29kZVBvaW50c1swXTsKLSAgICAgIEVuZENvZGUgPSBtX0NvZGVQb2ludHNbMV07Ci0gICAgICBTdGFydENJRCA9ICh1aW50MTZfdCltX0NvZGVQb2ludHNbMl07Ci0gICAgfQotICAgIGlmIChFbmRDb2RlIDwgMHgxMDAwMCkgewotICAgICAgZm9yICh1aW50MzJfdCBjb2RlID0gU3RhcnRDb2RlOyBjb2RlIDw9IEVuZENvZGU7IGNvZGUrKykgewotICAgICAgICBtX3BDTWFwLT5tX3BNYXBwaW5nW2NvZGVdID0gKHVpbnQxNl90KShTdGFydENJRCArIGNvZGUgLSBTdGFydENvZGUpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB1aW50MzJfdCBidWZbMl07Ci0gICAgICBidWZbMF0gPSBTdGFydENvZGU7Ci0gICAgICBidWZbMV0gPSAoKEVuZENvZGUgLSBTdGFydENvZGUpIDw8IDE2KSArIFN0YXJ0Q0lEOwotICAgICAgbV9BZGRNYXBzLkFwcGVuZEJsb2NrKGJ1Ziwgc2l6ZW9mIGJ1Zik7Ci0gICAgfQotICAgIG1fQ29kZVNlcSA9IDA7Ci0gIH0gZWxzZSBpZiAobV9TdGF0dXMgPT0gMykgewotICAgIG1fU3RhdHVzID0gMDsKLSAgfSBlbHNlIGlmIChtX1N0YXR1cyA9PSA0KSB7Ci0gICAgbV9wQ01hcC0+bV9DaGFyc2V0ID0gQ2hhcnNldEZyb21PcmRlcmluZyhDTWFwX0dldFN0cmluZyh3b3JkKSk7Ci0gICAgbV9TdGF0dXMgPSAwOwotICB9IGVsc2UgaWYgKG1fU3RhdHVzID09IDUpIHsKLSAgICBtX1N0YXR1cyA9IDA7Ci0gIH0gZWxzZSBpZiAobV9TdGF0dXMgPT0gNikgewotICAgIG1fcENNYXAtPm1fYlZlcnRpY2FsID0gQ01hcF9HZXRDb2RlKHdvcmQpICE9IDA7Ci0gICAgbV9TdGF0dXMgPSAwOwotICB9IGVsc2UgaWYgKG1fU3RhdHVzID09IDcpIHsKLSAgICBpZiAod29yZCA9PSAiZW5kY29kZXNwYWNlcmFuZ2UiKSB7Ci0gICAgICB1aW50MzJfdCBuU2VncyA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8dWludDMyX3Q+KG1fQ29kZVJhbmdlcyk7Ci0gICAgICBpZiAoblNlZ3MgPiAxKSB7Ci0gICAgICAgIG1fcENNYXAtPm1fQ29kaW5nU2NoZW1lID0gQ1BERl9DTWFwOjpNaXhlZEZvdXJCeXRlczsKLSAgICAgICAgbV9wQ01hcC0+bV9uQ29kZVJhbmdlcyA9IG5TZWdzOwotICAgICAgICBGWF9GcmVlKG1fcENNYXAtPm1fcExlYWRpbmdCeXRlcyk7Ci0gICAgICAgIG1fcENNYXAtPm1fcExlYWRpbmdCeXRlcyA9Ci0gICAgICAgICAgICBGWF9BbGxvYzJEKHVpbnQ4X3QsIG5TZWdzLCBzaXplb2YoQ01hcF9Db2RlUmFuZ2UpKTsKLSAgICAgICAgRlhTWVNfbWVtY3B5KG1fcENNYXAtPm1fcExlYWRpbmdCeXRlcywgbV9Db2RlUmFuZ2VzLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgIG5TZWdzICogc2l6ZW9mKENNYXBfQ29kZVJhbmdlKSk7Ci0gICAgICB9IGVsc2UgaWYgKG5TZWdzID09IDEpIHsKLSAgICAgICAgbV9wQ01hcC0+bV9Db2RpbmdTY2hlbWUgPSAobV9Db2RlUmFuZ2VzWzBdLm1fQ2hhclNpemUgPT0gMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDUERGX0NNYXA6OlR3b0J5dGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ1BERl9DTWFwOjpPbmVCeXRlOwotICAgICAgfQotICAgICAgbV9TdGF0dXMgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAod29yZC5HZXRMZW5ndGgoKSA9PSAwIHx8IHdvcmQuR2V0QXQoMCkgIT0gJzwnKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChtX0NvZGVTZXEgJSAyKSB7Ci0gICAgICAgIENNYXBfQ29kZVJhbmdlIHJhbmdlOwotICAgICAgICBpZiAoQ01hcF9HZXRDb2RlUmFuZ2UocmFuZ2UsIG1fTGFzdFdvcmQuQXNTdHJpbmdDKCksIHdvcmQpKQotICAgICAgICAgIG1fQ29kZVJhbmdlcy5wdXNoX2JhY2socmFuZ2UpOwotICAgICAgfQotICAgICAgbV9Db2RlU2VxKys7Ci0gICAgfQotICB9Ci0gIG1fTGFzdFdvcmQgPSB3b3JkOwotfQotCi0vLyBTdGF0aWMuCi11aW50MzJfdCBDUERGX0NNYXBQYXJzZXI6OkNNYXBfR2V0Q29kZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHdvcmQpIHsKLSAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzx1aW50MzJfdD4gbnVtID0gMDsKLSAgaWYgKHdvcmQuR2V0QXQoMCkgPT0gJzwnKSB7Ci0gICAgZm9yIChpbnQgaSA9IDE7IGkgPCB3b3JkLkdldExlbmd0aCgpICYmIHN0ZDo6aXN4ZGlnaXQod29yZC5HZXRBdChpKSk7ICsraSkgewotICAgICAgbnVtID0gbnVtICogMTYgKyBGWFNZU190b0hleERpZ2l0KHdvcmQuR2V0QXQoaSkpOwotICAgICAgaWYgKCFudW0uSXNWYWxpZCgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIG51bS5WYWx1ZU9yRGllKCk7Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IHdvcmQuR2V0TGVuZ3RoKCkgJiYgc3RkOjppc2RpZ2l0KHdvcmQuR2V0QXQoaSkpOyArK2kpIHsKLSAgICBudW0gPSBudW0gKiAxMCArIEZYU1lTX3RvRGVjaW1hbERpZ2l0KHN0YXRpY19jYXN0PEZYX1dDSEFSPih3b3JkLkdldEF0KGkpKSk7Ci0gICAgaWYgKCFudW0uSXNWYWxpZCgpKQotICAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIG51bS5WYWx1ZU9yRGllKCk7Ci19Ci0KLS8vIFN0YXRpYy4KLWJvb2wgQ1BERl9DTWFwUGFyc2VyOjpDTWFwX0dldENvZGVSYW5nZShDTWFwX0NvZGVSYW5nZSYgcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNlY29uZCkgewotICBpZiAoZmlyc3QuR2V0TGVuZ3RoKCkgPT0gMCB8fCBmaXJzdC5HZXRBdCgwKSAhPSAnPCcpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGludCBpOwotICBmb3IgKGkgPSAxOyBpIDwgZmlyc3QuR2V0TGVuZ3RoKCk7ICsraSkgewotICAgIGlmIChmaXJzdC5HZXRBdChpKSA9PSAnPicpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByYW5nZS5tX0NoYXJTaXplID0gKGkgLSAxKSAvIDI7Ci0gIGlmIChyYW5nZS5tX0NoYXJTaXplID4gNCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHJhbmdlLm1fQ2hhclNpemU7ICsraSkgewotICAgIHVpbnQ4X3QgZGlnaXQxID0gZmlyc3QuR2V0QXQoaSAqIDIgKyAxKTsKLSAgICB1aW50OF90IGRpZ2l0MiA9IGZpcnN0LkdldEF0KGkgKiAyICsgMik7Ci0gICAgcmFuZ2UubV9Mb3dlcltpXSA9IEZYU1lTX3RvSGV4RGlnaXQoZGlnaXQxKSAqIDE2ICsgRlhTWVNfdG9IZXhEaWdpdChkaWdpdDIpOwotICB9Ci0KLSAgdWludDMyX3Qgc2l6ZSA9IHNlY29uZC5HZXRMZW5ndGgoKTsKLSAgZm9yIChpID0gMDsgaSA8IHJhbmdlLm1fQ2hhclNpemU7ICsraSkgewotICAgIHVpbnQ4X3QgZGlnaXQxID0gKCh1aW50MzJfdClpICogMiArIDEgPCBzaXplKQotICAgICAgICAgICAgICAgICAgICAgICAgID8gc2Vjb25kLkdldEF0KChGWF9TVFJTSVpFKWkgKiAyICsgMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICA6ICcwJzsKLSAgICB1aW50OF90IGRpZ2l0MiA9ICgodWludDMyX3QpaSAqIDIgKyAyIDwgc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICA/IHNlY29uZC5HZXRBdCgoRlhfU1RSU0laRSlpICogMiArIDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgOiAnMCc7Ci0gICAgcmFuZ2UubV9VcHBlcltpXSA9IEZYU1lTX3RvSGV4RGlnaXQoZGlnaXQxKSAqIDE2ICsgRlhTWVNfdG9IZXhEaWdpdChkaWdpdDIpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1DUERGX0NNYXA6OkNQREZfQ01hcCgpIHsKLSAgbV9DaGFyc2V0ID0gQ0lEU0VUX1VOS05PV047Ci0gIG1fQ29kaW5nID0gQ0lEQ09ESU5HX1VOS05PV047Ci0gIG1fQ29kaW5nU2NoZW1lID0gVHdvQnl0ZXM7Ci0gIG1fYlZlcnRpY2FsID0gZmFsc2U7Ci0gIG1fYkxvYWRlZCA9IGZhbHNlOwotICBtX3BNYXBwaW5nID0gbnVsbHB0cjsKLSAgbV9wTGVhZGluZ0J5dGVzID0gbnVsbHB0cjsKLSAgbV9wQWRkTWFwcGluZyA9IG51bGxwdHI7Ci0gIG1fcEVtYmVkTWFwID0gbnVsbHB0cjsKLSAgbV9uQ29kZVJhbmdlcyA9IDA7Ci19Ci1DUERGX0NNYXA6On5DUERGX0NNYXAoKSB7Ci0gIEZYX0ZyZWUobV9wTWFwcGluZyk7Ci0gIEZYX0ZyZWUobV9wQWRkTWFwcGluZyk7Ci0gIEZYX0ZyZWUobV9wTGVhZGluZ0J5dGVzKTsKLX0KLQotYm9vbCBDUERGX0NNYXA6OklzTG9hZGVkKCkgY29uc3QgewotICByZXR1cm4gbV9iTG9hZGVkOwotfQotCi1ib29sIENQREZfQ01hcDo6SXNWZXJ0V3JpdGluZygpIGNvbnN0IHsKLSAgcmV0dXJuIG1fYlZlcnRpY2FsOwotfQotCi12b2lkIENQREZfQ01hcDo6TG9hZFByZWRlZmluZWQoQ1BERl9DTWFwTWFuYWdlciogcE1nciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgYnNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlByb21wdENKSykgewotICBtX1ByZWRlZmluZWRDTWFwID0gYnNOYW1lOwotICBpZiAobV9QcmVkZWZpbmVkQ01hcCA9PSAiSWRlbnRpdHktSCIgfHwgbV9QcmVkZWZpbmVkQ01hcCA9PSAiSWRlbnRpdHktViIpIHsKLSAgICBtX0NvZGluZyA9IENJRENPRElOR19DSUQ7Ci0gICAgbV9iVmVydGljYWwgPSBic05hbWVbOV0gPT0gJ1YnOwotICAgIG1fYkxvYWRlZCA9IHRydWU7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENGWF9CeXRlU3RyaW5nIGNtYXBpZCA9IG1fUHJlZGVmaW5lZENNYXA7Ci0gIG1fYlZlcnRpY2FsID0gY21hcGlkLlJpZ2h0KDEpID09ICJWIjsKLSAgaWYgKGNtYXBpZC5HZXRMZW5ndGgoKSA+IDIpIHsKLSAgICBjbWFwaWQgPSBjbWFwaWQuTGVmdChjbWFwaWQuR2V0TGVuZ3RoKCkgLSAyKTsKLSAgfQotICBjb25zdCBDUERGX1ByZWRlZmluZWRDTWFwKiBtYXAgPSBudWxscHRyOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShnX1ByZWRlZmluZWRDTWFwcyk7ICsraSkgewotICAgIGlmIChjbWFwaWQgPT0gQ0ZYX0J5dGVTdHJpbmdDKGdfUHJlZGVmaW5lZENNYXBzW2ldLm1fcE5hbWUpKSB7Ci0gICAgICBtYXAgPSAmZ19QcmVkZWZpbmVkQ01hcHNbaV07Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgaWYgKCFtYXApCi0gICAgcmV0dXJuOwotCi0gIG1fQ2hhcnNldCA9IG1hcC0+bV9DaGFyc2V0OwotICBtX0NvZGluZyA9IG1hcC0+bV9Db2Rpbmc7Ci0gIG1fQ29kaW5nU2NoZW1lID0gbWFwLT5tX0NvZGluZ1NjaGVtZTsKLSAgaWYgKG1fQ29kaW5nU2NoZW1lID09IE1peGVkVHdvQnl0ZXMpIHsKLSAgICBtX3BMZWFkaW5nQnl0ZXMgPSBGWF9BbGxvYyh1aW50OF90LCAyNTYpOwotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtYXAtPm1fTGVhZGluZ1NlZ0NvdW50OyArK2kpIHsKLSAgICAgIGNvbnN0IHVpbnQ4X3QqIHNlZ3MgPSBtYXAtPm1fTGVhZGluZ1NlZ3M7Ci0gICAgICBmb3IgKGludCBiID0gc2Vnc1tpICogMl07IGIgPD0gc2Vnc1tpICogMiArIDFdOyArK2IpIHsKLSAgICAgICAgbV9wTGVhZGluZ0J5dGVzW2JdID0gMTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgRlBERkFQSV9GaW5kRW1iZWRkZWRDTWFwKGJzTmFtZSwgbV9DaGFyc2V0LCBtX0NvZGluZywgbV9wRW1iZWRNYXApOwotICBpZiAoIW1fcEVtYmVkTWFwKQotICAgIHJldHVybjsKLQotICBtX2JMb2FkZWQgPSB0cnVlOwotfQotCi12b2lkIENQREZfQ01hcDo6TG9hZEVtYmVkZGVkKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCB1aW50MzJfdCBzaXplKSB7Ci0gIG1fcE1hcHBpbmcgPSBGWF9BbGxvYyh1aW50MTZfdCwgNjU1MzYpOwotICBDUERGX0NNYXBQYXJzZXIgcGFyc2VyOwotICBwYXJzZXIuSW5pdGlhbGl6ZSh0aGlzKTsKLSAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KHBEYXRhLCBzaXplKTsKLSAgd2hpbGUgKDEpIHsKLSAgICBDRlhfQnl0ZVN0cmluZ0Mgd29yZCA9IHN5bnRheC5HZXRXb3JkKCk7Ci0gICAgaWYgKHdvcmQuSXNFbXB0eSgpKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgcGFyc2VyLlBhcnNlV29yZCh3b3JkKTsKLSAgfQotICBpZiAobV9Db2RpbmdTY2hlbWUgPT0gTWl4ZWRGb3VyQnl0ZXMgJiYgcGFyc2VyLm1fQWRkTWFwcy5HZXRTaXplKCkpIHsKLSAgICBtX3BBZGRNYXBwaW5nID0gRlhfQWxsb2ModWludDhfdCwgcGFyc2VyLm1fQWRkTWFwcy5HZXRTaXplKCkgKyA0KTsKLSAgICAqKHVpbnQzMl90KiltX3BBZGRNYXBwaW5nID0gcGFyc2VyLm1fQWRkTWFwcy5HZXRTaXplKCkgLyA4OwotICAgIEZYU1lTX21lbWNweShtX3BBZGRNYXBwaW5nICsgNCwgcGFyc2VyLm1fQWRkTWFwcy5HZXRCdWZmZXIoKSwKLSAgICAgICAgICAgICAgICAgcGFyc2VyLm1fQWRkTWFwcy5HZXRTaXplKCkpOwotICAgIEZYU1lTX3Fzb3J0KG1fcEFkZE1hcHBpbmcgKyA0LCBwYXJzZXIubV9BZGRNYXBzLkdldFNpemUoKSAvIDgsIDgsCi0gICAgICAgICAgICAgICAgQ29tcGFyZURXT1JEKTsKLSAgfQotfQotCi11aW50MTZfdCBDUERGX0NNYXA6OkNJREZyb21DaGFyQ29kZSh1aW50MzJfdCBjaGFyY29kZSkgY29uc3QgewotICBpZiAobV9Db2RpbmcgPT0gQ0lEQ09ESU5HX0NJRCkgewotICAgIHJldHVybiAodWludDE2X3QpY2hhcmNvZGU7Ci0gIH0KLSAgaWYgKG1fcEVtYmVkTWFwKSB7Ci0gICAgcmV0dXJuIEZQREZBUElfQ0lERnJvbUNoYXJDb2RlKG1fcEVtYmVkTWFwLCBjaGFyY29kZSk7Ci0gIH0KLSAgaWYgKCFtX3BNYXBwaW5nKSB7Ci0gICAgcmV0dXJuICh1aW50MTZfdCljaGFyY29kZTsKLSAgfQotICBpZiAoY2hhcmNvZGUgPj4gMTYpIHsKLSAgICBpZiAobV9wQWRkTWFwcGluZykgewotICAgICAgdm9pZCogZm91bmQgPSBGWFNZU19ic2VhcmNoKCZjaGFyY29kZSwgbV9wQWRkTWFwcGluZyArIDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih1aW50MzJfdCopbV9wQWRkTWFwcGluZywgOCwgQ29tcGFyZUNJRCk7Ci0gICAgICBpZiAoIWZvdW5kKQotICAgICAgICByZXR1cm4gMDsKLSAgICAgIHJldHVybiAodWludDE2X3QpKCgodWludDMyX3QqKWZvdW5kKVsxXSAlIDY1NTM2ICsgY2hhcmNvZGUgLQotICAgICAgICAgICAgICAgICAgICAgICAgKih1aW50MzJfdCopZm91bmQpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gbV9wTWFwcGluZ1tjaGFyY29kZV07Ci19Ci0KLXVpbnQzMl90IENQREZfQ01hcDo6R2V0TmV4dENoYXIoY29uc3QgRlhfQ0hBUiogcFN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TdHJMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgb2Zmc2V0KSBjb25zdCB7Ci0gIHN3aXRjaCAobV9Db2RpbmdTY2hlbWUpIHsKLSAgICBjYXNlIE9uZUJ5dGU6Ci0gICAgICByZXR1cm4gKCh1aW50OF90KilwU3RyaW5nKVtvZmZzZXQrK107Ci0gICAgY2FzZSBUd29CeXRlczoKLSAgICAgIG9mZnNldCArPSAyOwotICAgICAgcmV0dXJuICgodWludDhfdCopcFN0cmluZylbb2Zmc2V0IC0gMl0gKiAyNTYgKwotICAgICAgICAgICAgICgodWludDhfdCopcFN0cmluZylbb2Zmc2V0IC0gMV07Ci0gICAgY2FzZSBNaXhlZFR3b0J5dGVzOiB7Ci0gICAgICB1aW50OF90IGJ5dGUxID0gKCh1aW50OF90KilwU3RyaW5nKVtvZmZzZXQrK107Ci0gICAgICBpZiAoIW1fcExlYWRpbmdCeXRlc1tieXRlMV0pIHsKLSAgICAgICAgcmV0dXJuIGJ5dGUxOwotICAgICAgfQotICAgICAgdWludDhfdCBieXRlMiA9ICgodWludDhfdCopcFN0cmluZylbb2Zmc2V0KytdOwotICAgICAgcmV0dXJuIGJ5dGUxICogMjU2ICsgYnl0ZTI7Ci0gICAgfQotICAgIGNhc2UgTWl4ZWRGb3VyQnl0ZXM6IHsKLSAgICAgIHVpbnQ4X3QgY29kZXNbNF07Ci0gICAgICBpbnQgY2hhcl9zaXplID0gMTsKLSAgICAgIGNvZGVzWzBdID0gKCh1aW50OF90KilwU3RyaW5nKVtvZmZzZXQrK107Ci0gICAgICBDTWFwX0NvZGVSYW5nZSogcFJhbmdlcyA9IChDTWFwX0NvZGVSYW5nZSopbV9wTGVhZGluZ0J5dGVzOwotICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaW50IHJldCA9IENoZWNrQ29kZVJhbmdlKGNvZGVzLCBjaGFyX3NpemUsIHBSYW5nZXMsIG1fbkNvZGVSYW5nZXMpOwotICAgICAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0ID09IDIpIHsKLSAgICAgICAgICB1aW50MzJfdCBjaGFyY29kZSA9IDA7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFyX3NpemU7IGkrKykgewotICAgICAgICAgICAgY2hhcmNvZGUgPSAoY2hhcmNvZGUgPDwgOCkgKyBjb2Rlc1tpXTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIGNoYXJjb2RlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjaGFyX3NpemUgPT0gNCB8fCBvZmZzZXQgPT0gblN0ckxlbikgewotICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGNvZGVzW2NoYXJfc2l6ZSsrXSA9ICgodWludDhfdCopcFN0cmluZylbb2Zmc2V0KytdOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiAwOwotfQotaW50IENQREZfQ01hcDo6R2V0Q2hhclNpemUodWludDMyX3QgY2hhcmNvZGUpIGNvbnN0IHsKLSAgc3dpdGNoIChtX0NvZGluZ1NjaGVtZSkgewotICAgIGNhc2UgT25lQnl0ZToKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgVHdvQnl0ZXM6Ci0gICAgICByZXR1cm4gMjsKLSAgICBjYXNlIE1peGVkVHdvQnl0ZXM6Ci0gICAgY2FzZSBNaXhlZEZvdXJCeXRlczoKLSAgICAgIGlmIChjaGFyY29kZSA8IDB4MTAwKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgICAgfQotICAgICAgaWYgKGNoYXJjb2RlIDwgMHgxMDAwMCkgewotICAgICAgICByZXR1cm4gMjsKLSAgICAgIH0KLSAgICAgIGlmIChjaGFyY29kZSA8IDB4MTAwMDAwMCkgewotICAgICAgICByZXR1cm4gMzsKLSAgICAgIH0KLSAgICAgIHJldHVybiA0OwotICB9Ci0gIHJldHVybiAxOwotfQotaW50IENQREZfQ01hcDo6Q291bnRDaGFyKGNvbnN0IEZYX0NIQVIqIHBTdHJpbmcsIGludCBzaXplKSBjb25zdCB7Ci0gIHN3aXRjaCAobV9Db2RpbmdTY2hlbWUpIHsKLSAgICBjYXNlIE9uZUJ5dGU6Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICBjYXNlIFR3b0J5dGVzOgotICAgICAgcmV0dXJuIChzaXplICsgMSkgLyAyOwotICAgIGNhc2UgTWl4ZWRUd29CeXRlczogewotICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICAgIGlmIChtX3BMZWFkaW5nQnl0ZXNbKCh1aW50OF90KilwU3RyaW5nKVtpXV0pIHsKLSAgICAgICAgICBpKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBjb3VudDsKLSAgICB9Ci0gICAgY2FzZSBNaXhlZEZvdXJCeXRlczogewotICAgICAgaW50IGNvdW50ID0gMCwgb2Zmc2V0ID0gMDsKLSAgICAgIHdoaWxlIChvZmZzZXQgPCBzaXplKSB7Ci0gICAgICAgIEdldE5leHRDaGFyKHBTdHJpbmcsIHNpemUsIG9mZnNldCk7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gY291bnQ7Ci0gICAgfQotICB9Ci0gIHJldHVybiBzaXplOwotfQotCi1pbnQgQ1BERl9DTWFwOjpBcHBlbmRDaGFyKEZYX0NIQVIqIHN0ciwgdWludDMyX3QgY2hhcmNvZGUpIGNvbnN0IHsKLSAgc3dpdGNoIChtX0NvZGluZ1NjaGVtZSkgewotICAgIGNhc2UgT25lQnl0ZToKLSAgICAgIHN0clswXSA9ICh1aW50OF90KWNoYXJjb2RlOwotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBUd29CeXRlczoKLSAgICAgIHN0clswXSA9ICh1aW50OF90KShjaGFyY29kZSAvIDI1Nik7Ci0gICAgICBzdHJbMV0gPSAodWludDhfdCkoY2hhcmNvZGUgJSAyNTYpOwotICAgICAgcmV0dXJuIDI7Ci0gICAgY2FzZSBNaXhlZFR3b0J5dGVzOgotICAgIGNhc2UgTWl4ZWRGb3VyQnl0ZXM6Ci0gICAgICBpZiAoY2hhcmNvZGUgPCAweDEwMCkgewotICAgICAgICBDTWFwX0NvZGVSYW5nZSogcFJhbmdlcyA9IChDTWFwX0NvZGVSYW5nZSopbV9wTGVhZGluZ0J5dGVzOwotICAgICAgICBpbnQgaVNpemUgPSBHZXRDaGFyU2l6ZUltcGwoY2hhcmNvZGUsIHBSYW5nZXMsIG1fbkNvZGVSYW5nZXMpOwotICAgICAgICBpZiAoaVNpemUgPT0gMCkgewotICAgICAgICAgIGlTaXplID0gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaVNpemUgPiAxKSB7Ci0gICAgICAgICAgRlhTWVNfbWVtc2V0KHN0ciwgMCwgc2l6ZW9mKHVpbnQ4X3QpICogaVNpemUpOwotICAgICAgICB9Ci0gICAgICAgIHN0cltpU2l6ZSAtIDFdID0gKHVpbnQ4X3QpY2hhcmNvZGU7Ci0gICAgICAgIHJldHVybiBpU2l6ZTsKLSAgICAgIH0KLSAgICAgIGlmIChjaGFyY29kZSA8IDB4MTAwMDApIHsKLSAgICAgICAgc3RyWzBdID0gKHVpbnQ4X3QpKGNoYXJjb2RlID4+IDgpOwotICAgICAgICBzdHJbMV0gPSAodWludDhfdCljaGFyY29kZTsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgICB9Ci0gICAgICBpZiAoY2hhcmNvZGUgPCAweDEwMDAwMDApIHsKLSAgICAgICAgc3RyWzBdID0gKHVpbnQ4X3QpKGNoYXJjb2RlID4+IDE2KTsKLSAgICAgICAgc3RyWzFdID0gKHVpbnQ4X3QpKGNoYXJjb2RlID4+IDgpOwotICAgICAgICBzdHJbMl0gPSAodWludDhfdCljaGFyY29kZTsKLSAgICAgICAgcmV0dXJuIDM7Ci0gICAgICB9Ci0gICAgICBzdHJbMF0gPSAodWludDhfdCkoY2hhcmNvZGUgPj4gMjQpOwotICAgICAgc3RyWzFdID0gKHVpbnQ4X3QpKGNoYXJjb2RlID4+IDE2KTsKLSAgICAgIHN0clsyXSA9ICh1aW50OF90KShjaGFyY29kZSA+PiA4KTsKLSAgICAgIHN0clszXSA9ICh1aW50OF90KWNoYXJjb2RlOwotICAgICAgcmV0dXJuIDQ7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLUNQREZfQ0lEMlVuaWNvZGVNYXA6OkNQREZfQ0lEMlVuaWNvZGVNYXAoKSB7Ci0gIG1fRW1iZWRkZWRDb3VudCA9IDA7Ci19Ci0KLUNQREZfQ0lEMlVuaWNvZGVNYXA6On5DUERGX0NJRDJVbmljb2RlTWFwKCkge30KLQotYm9vbCBDUERGX0NJRDJVbmljb2RlTWFwOjpJc0xvYWRlZCgpIHsKLSAgcmV0dXJuIG1fRW1iZWRkZWRDb3VudCAhPSAwOwotfQotCi1GWF9XQ0hBUiBDUERGX0NJRDJVbmljb2RlTWFwOjpVbmljb2RlRnJvbUNJRCh1aW50MTZfdCBDSUQpIHsKLSAgaWYgKG1fQ2hhcnNldCA9PSBDSURTRVRfVU5JQ09ERSkgewotICAgIHJldHVybiBDSUQ7Ci0gIH0KLSAgaWYgKENJRCA8IG1fRW1iZWRkZWRDb3VudCkgewotICAgIHJldHVybiBtX3BFbWJlZGRlZE1hcFtDSURdOwotICB9Ci0gIHJldHVybiAwOwotfQotCi12b2lkIENQREZfQ0lEMlVuaWNvZGVNYXA6OkxvYWQoQ1BERl9DTWFwTWFuYWdlciogcE1nciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSURTZXQgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJQcm9tcHRDSkspIHsKLSAgbV9DaGFyc2V0ID0gY2hhcnNldDsKLQotICBDUERGX0ZvbnRHbG9iYWxzKiBwRm9udEdsb2JhbHMgPQotICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRQYWdlTW9kdWxlKCktPkdldEZvbnRHbG9iYWxzKCk7Ci0gIG1fcEVtYmVkZGVkTWFwID0gcEZvbnRHbG9iYWxzLT5tX0VtYmVkZGVkVG9Vbmljb2Rlc1tjaGFyc2V0XS5tX3BNYXA7Ci0gIG1fRW1iZWRkZWRDb3VudCA9IHBGb250R2xvYmFscy0+bV9FbWJlZGRlZFRvVW5pY29kZXNbY2hhcnNldF0ubV9Db3VudDsKLX0KLQotQ0lEU2V0IENoYXJzZXRGcm9tT3JkZXJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvcmRlcmluZykgewotICBmb3IgKHNpemVfdCBjaGFyc2V0ID0gMTsgY2hhcnNldCA8IEZYX0FycmF5U2l6ZShnX0NoYXJzZXROYW1lcyk7ICsrY2hhcnNldCkgewotICAgIGlmIChvcmRlcmluZyA9PSBnX0NoYXJzZXROYW1lc1tjaGFyc2V0XSkKLSAgICAgIHJldHVybiBDSURTZXRGcm9tU2l6ZVQoY2hhcnNldCk7Ci0gIH0KLSAgcmV0dXJuIENJRFNFVF9VTktOT1dOOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2ZvbnQvZnBkZl9mb250X2NpZF91bml0dGVzdC5jcHAgYi9jb3JlL2ZwZGZhcGkvZm9udC9mcGRmX2ZvbnRfY2lkX3VuaXR0ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNmNWU0Ny4uMDAwMDAwMAotLS0gYS9jb3JlL2ZwZGZhcGkvZm9udC9mcGRmX2ZvbnRfY2lkX3VuaXR0ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE1IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2ZvbnRfaW50LmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSB7Ci0KLWJvb2wgdWludF9yYW5nZXNfZXF1YWwodWludDhfdCogYSwgdWludDhfdCogYiwgc2l6ZV90IGNvdW50KSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgIGlmIChhW2ldICE9IGJbaV0pCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1URVNUKGZwZGZfZm9udF9jaWQsIENNYXBfR2V0Q29kZSkgewotICBFWFBFQ1RfRVEoMHUsIENQREZfQ01hcFBhcnNlcjo6Q01hcF9HZXRDb2RlKCIiKSk7Ci0gIEVYUEVDVF9FUSgwdSwgQ1BERl9DTWFwUGFyc2VyOjpDTWFwX0dldENvZGUoIjwiKSk7Ci0gIEVYUEVDVF9FUSgxOTR1LCBDUERGX0NNYXBQYXJzZXI6OkNNYXBfR2V0Q29kZSgiPGMyIikpOwotICBFWFBFQ1RfRVEoMTYydSwgQ1BERl9DTWFwUGFyc2VyOjpDTWFwX0dldENvZGUoIjxBMiIpKTsKLSAgRVhQRUNUX0VRKDI4MDJ1LCBDUERGX0NNYXBQYXJzZXI6OkNNYXBfR2V0Q29kZSgiPEFmMiIpKTsKLSAgRVhQRUNUX0VRKDE2MnUsIENQREZfQ01hcFBhcnNlcjo6Q01hcF9HZXRDb2RlKCI8QTJ6IikpOwotCi0gIEVYUEVDVF9FUSgxMnUsIENQREZfQ01hcFBhcnNlcjo6Q01hcF9HZXRDb2RlKCIxMiIpKTsKLSAgRVhQRUNUX0VRKDEydSwgQ1BERl9DTWFwUGFyc2VyOjpDTWFwX0dldENvZGUoIjEyZCIpKTsKLSAgRVhQRUNUX0VRKDEyOHUsIENQREZfQ01hcFBhcnNlcjo6Q01hcF9HZXRDb2RlKCIxMjgiKSk7Ci0KLSAgRVhQRUNUX0VRKDQyOTQ5NjcyOTV1LCBDUERGX0NNYXBQYXJzZXI6OkNNYXBfR2V0Q29kZSgiPEZGRkZGRkZGIikpOwotCi0gIC8vIE92ZXJmbG93IGEgdWludDMyX3QuCi0gIEVYUEVDVF9FUSgwdSwgQ1BERl9DTWFwUGFyc2VyOjpDTWFwX0dldENvZGUoIjwxMDAwMDAwMDAiKSk7Ci19Ci0KLVRFU1QoZnBkZl9mb250X2NpZCwgQ01hcF9HZXRDb2RlUmFuZ2UpIHsKLSAgQ01hcF9Db2RlUmFuZ2UgcmFuZ2U7Ci0KLSAgLy8gTXVzdCBzdGFydCB3aXRoIGEgPAotICBFWFBFQ1RfRkFMU0UoQ1BERl9DTWFwUGFyc2VyOjpDTWFwX0dldENvZGVSYW5nZShyYW5nZSwgIiIsICIiKSk7Ci0gIEVYUEVDVF9GQUxTRShDUERGX0NNYXBQYXJzZXI6OkNNYXBfR2V0Q29kZVJhbmdlKHJhbmdlLCAiQSIsICIiKSk7Ci0KLSAgLy8gbV9DaGFyU2l6ZSBtdXN0IGJlIDw9IDQKLSAgRVhQRUNUX0ZBTFNFKENQREZfQ01hcFBhcnNlcjo6Q01hcF9HZXRDb2RlUmFuZ2UocmFuZ2UsICI8YWFhYWFhYWFhYT4iLCAiIikpOwotICBFWFBFQ1RfRVEoNSwgcmFuZ2UubV9DaGFyU2l6ZSk7Ci0KLSAgRVhQRUNUX1RSVUUoCi0gICAgICBDUERGX0NNYXBQYXJzZXI6OkNNYXBfR2V0Q29kZVJhbmdlKHJhbmdlLCAiPDEyMzQ1Njc4PiIsICI8ODc2NTQzMjE+IikpOwotICBFWFBFQ1RfRVEoNCwgcmFuZ2UubV9DaGFyU2l6ZSk7Ci0gIHsKLSAgICB1aW50OF90IGxvd2VyWzRdID0gezE4LCA1MiwgODYsIDEyMH07Ci0gICAgdWludDhfdCB1cHBlcls0XSA9IHsxMzUsIDEwMSwgNjcsIDMzfTsKLSAgICBFWFBFQ1RfVFJVRSh1aW50X3Jhbmdlc19lcXVhbChsb3dlciwgcmFuZ2UubV9Mb3dlciwgcmFuZ2UubV9DaGFyU2l6ZSkpOwotICAgIEVYUEVDVF9UUlVFKHVpbnRfcmFuZ2VzX2VxdWFsKHVwcGVyLCByYW5nZS5tX1VwcGVyLCByYW5nZS5tX0NoYXJTaXplKSk7Ci0gIH0KLQotICAvLyBIZXggY2hhcmFjdGVycwotICBFWFBFQ1RfVFJVRShDUERGX0NNYXBQYXJzZXI6OkNNYXBfR2V0Q29kZVJhbmdlKHJhbmdlLCAiPGExPiIsICI8RjM+IikpOwotICBFWFBFQ1RfRVEoMSwgcmFuZ2UubV9DaGFyU2l6ZSk7Ci0gIEVYUEVDVF9FUSgxNjEsIHJhbmdlLm1fTG93ZXJbMF0pOwotICBFWFBFQ1RfRVEoMjQzLCByYW5nZS5tX1VwcGVyWzBdKTsKLQotICAvLyBUaGUgc2Vjb25kIHN0cmluZyBzaG91bGQgcmV0dXJuIDAncyBpZiBpdCBpcyBzaG9ydGVyCi0gIEVYUEVDVF9UUlVFKENQREZfQ01hcFBhcnNlcjo6Q01hcF9HZXRDb2RlUmFuZ2UocmFuZ2UsICI8YTE+IiwgIiIpKTsKLSAgRVhQRUNUX0VRKDEsIHJhbmdlLm1fQ2hhclNpemUpOwotICBFWFBFQ1RfRVEoMTYxLCByYW5nZS5tX0xvd2VyWzBdKTsKLSAgRVhQRUNUX0VRKDAsIHJhbmdlLm1fVXBwZXJbMF0pOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL2ZvbnQvZnBkZl9mb250X3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnBkZmFwaS9mb250L2ZwZGZfZm9udF91bml0dGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3N2FlOGEuLjAwMDAwMDAKLS0tIGEvY29yZS9mcGRmYXBpL2ZvbnQvZnBkZl9mb250X3VuaXR0ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE1IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2ZvbnRfaW50LmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLVRFU1QoZnBkZl9mb250LCBTdHJpbmdUb0NvZGUpIHsKLSAgRVhQRUNUX0VRKDB1LCBDUERGX1RvVW5pY29kZU1hcDo6U3RyaW5nVG9Db2RlKCIiKSk7Ci0gIEVYUEVDVF9FUSgxOTR1LCBDUERGX1RvVW5pY29kZU1hcDo6U3RyaW5nVG9Db2RlKCI8YzIiKSk7Ci0gIEVYUEVDVF9FUSgxNjJ1LCBDUERGX1RvVW5pY29kZU1hcDo6U3RyaW5nVG9Db2RlKCI8QTIiKSk7Ci0gIEVYUEVDVF9FUSgyODAydSwgQ1BERl9Ub1VuaWNvZGVNYXA6OlN0cmluZ1RvQ29kZSgiPEFmMiIpKTsKLSAgRVhQRUNUX0VRKDEydSwgQ1BERl9Ub1VuaWNvZGVNYXA6OlN0cmluZ1RvQ29kZSgiMTIiKSk7Ci0gIEVYUEVDVF9FUSgxMjh1LCBDUERGX1RvVW5pY29kZU1hcDo6U3RyaW5nVG9Db2RlKCIxMjgiKSk7Ci19Ci0KLVRFU1QoZnBkZl9mb250LCBTdHJpbmdUb1dpZGVTdHJpbmcpIHsKLSAgRVhQRUNUX0VRKEwiIiwgQ1BERl9Ub1VuaWNvZGVNYXA6OlN0cmluZ1RvV2lkZVN0cmluZygiIikpOwotICBFWFBFQ1RfRVEoTCIiLCBDUERGX1RvVW5pY29kZU1hcDo6U3RyaW5nVG9XaWRlU3RyaW5nKCIxMjM0IikpOwotCi0gIEVYUEVDVF9FUShMIiIsIENQREZfVG9Vbmljb2RlTWFwOjpTdHJpbmdUb1dpZGVTdHJpbmcoIjxjMiIpKTsKLQotICBDRlhfV2lkZVN0cmluZyByZXMgPSBMIlx4YzJhYiI7Ci0gIEVYUEVDVF9FUShyZXMsIENQREZfVG9Vbmljb2RlTWFwOjpTdHJpbmdUb1dpZGVTdHJpbmcoIjxjMmFiIikpOwotICBFWFBFQ1RfRVEocmVzLCBDUERGX1RvVW5pY29kZU1hcDo6U3RyaW5nVG9XaWRlU3RyaW5nKCI8YzJhYmFiIikpOwotICBFWFBFQ1RfRVEocmVzLCBDUERGX1RvVW5pY29kZU1hcDo6U3RyaW5nVG9XaWRlU3RyaW5nKCI8YzJhYiAxMjM0IikpOwotCi0gIHJlcyArPSBMIlx4ZmFhYiI7Ci0gIEVYUEVDVF9FUShyZXMsIENQREZfVG9Vbmljb2RlTWFwOjpTdHJpbmdUb1dpZGVTdHJpbmcoIjxjMmFiRmFBYiIpKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9mb250L3R0Z3N1YnRhYmxlLmNwcCBiL2NvcmUvZnBkZmFwaS9mb250L3R0Z3N1YnRhYmxlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFlOGU5Yy4uMDAwMDAwMAotLS0gYS9jb3JlL2ZwZGZhcGkvZm9udC90dGdzdWJ0YWJsZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MjYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvdHRnc3VidGFibGUuaCIKLQotI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mcmVldHlwZS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCi0KLUNGWF9HbHlwaE1hcDo6Q0ZYX0dseXBoTWFwKCkge30KLQotQ0ZYX0dseXBoTWFwOjp+Q0ZYX0dseXBoTWFwKCkge30KLQotZXh0ZXJuICJDIiB7Ci1zdGF0aWMgaW50IF9Db21wYXJlSW50KGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMikgewotICByZXR1cm4gKCoodWludDMyX3QqKXAxKSAtICgqKHVpbnQzMl90KilwMik7Ci19Ci19OwotCi1zdHJ1Y3QgX0ludFBhaXIgewotICBpbnQzMl90IGtleTsKLSAgaW50MzJfdCB2YWx1ZTsKLX07Ci0KLXZvaWQgQ0ZYX0dseXBoTWFwOjpTZXRBdChpbnQga2V5LCBpbnQgdmFsdWUpIHsKLSAgdWludDMyX3QgY291bnQgPSBtX0J1ZmZlci5HZXRTaXplKCkgLyBzaXplb2YoX0ludFBhaXIpOwotICBfSW50UGFpciogYnVmID0gKF9JbnRQYWlyKiltX0J1ZmZlci5HZXRCdWZmZXIoKTsKLSAgX0ludFBhaXIgcGFpciA9IHtrZXksIHZhbHVlfTsKLSAgaWYgKGNvdW50ID09IDAgfHwga2V5ID4gYnVmW2NvdW50IC0gMV0ua2V5KSB7Ci0gICAgbV9CdWZmZXIuQXBwZW5kQmxvY2soJnBhaXIsIHNpemVvZihfSW50UGFpcikpOwotICAgIHJldHVybjsKLSAgfQotICBpbnQgbG93ID0gMCwgaGlnaCA9IGNvdW50IC0gMTsKLSAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7Ci0gICAgaW50IG1pZCA9IChsb3cgKyBoaWdoKSAvIDI7Ci0gICAgaWYgKGJ1ZlttaWRdLmtleSA8IGtleSkgewotICAgICAgbG93ID0gbWlkICsgMTsKLSAgICB9IGVsc2UgaWYgKGJ1ZlttaWRdLmtleSA+IGtleSkgewotICAgICAgaGlnaCA9IG1pZCAtIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJ1ZlttaWRdLnZhbHVlID0gdmFsdWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIG1fQnVmZmVyLkluc2VydEJsb2NrKGxvdyAqIHNpemVvZihfSW50UGFpciksICZwYWlyLCBzaXplb2YoX0ludFBhaXIpKTsKLX0KLQotYm9vbCBDRlhfR2x5cGhNYXA6Okxvb2t1cChpbnQga2V5LCBpbnQmIHZhbHVlKSB7Ci0gIHZvaWQqIHBSZXN1bHQgPSBGWFNZU19ic2VhcmNoKCZrZXksIG1fQnVmZmVyLkdldEJ1ZmZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0J1ZmZlci5HZXRTaXplKCkgLyBzaXplb2YoX0ludFBhaXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoX0ludFBhaXIpLCBfQ29tcGFyZUludCk7Ci0gIGlmICghcFJlc3VsdCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB2YWx1ZSA9ICgodWludDMyX3QqKXBSZXN1bHQpWzFdOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotQ0ZYX0NUVEdTVUJUYWJsZTo6Q0ZYX0NUVEdTVUJUYWJsZSgpCi0gICAgOiBtX2JGZWF1dHVyZU1hcExvYWQoZmFsc2UpLCBsb2FkZWQoZmFsc2UpIHt9Ci0KLUNGWF9DVFRHU1VCVGFibGU6OkNGWF9DVFRHU1VCVGFibGUoRlRfQnl0ZXMgZ3N1YikKLSAgICA6IG1fYkZlYXV0dXJlTWFwTG9hZChmYWxzZSksIGxvYWRlZChmYWxzZSkgewotICBMb2FkR1NVQlRhYmxlKGdzdWIpOwotfQotCi1DRlhfQ1RUR1NVQlRhYmxlOjp+Q0ZYX0NUVEdTVUJUYWJsZSgpIHt9Ci0KLWJvb2wgQ0ZYX0NUVEdTVUJUYWJsZTo6SXNPaygpIGNvbnN0IHsKLSAgcmV0dXJuIGxvYWRlZDsKLX0KLQotYm9vbCBDRlhfQ1RUR1NVQlRhYmxlOjpMb2FkR1NVQlRhYmxlKEZUX0J5dGVzIGdzdWIpIHsKLSAgaGVhZGVyLlZlcnNpb24gPSBnc3ViWzBdIDw8IDI0IHwgZ3N1YlsxXSA8PCAxNiB8IGdzdWJbMl0gPDwgOCB8IGdzdWJbM107Ci0gIGlmIChoZWFkZXIuVmVyc2lvbiAhPSAweDAwMDEwMDAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGhlYWRlci5TY3JpcHRMaXN0ID0gZ3N1Yls0XSA8PCA4IHwgZ3N1Yls1XTsKLSAgaGVhZGVyLkZlYXR1cmVMaXN0ID0gZ3N1Yls2XSA8PCA4IHwgZ3N1Yls3XTsKLSAgaGVhZGVyLkxvb2t1cExpc3QgPSBnc3ViWzhdIDw8IDggfCBnc3ViWzldOwotICByZXR1cm4gUGFyc2UoJmdzdWJbaGVhZGVyLlNjcmlwdExpc3RdLCAmZ3N1YltoZWFkZXIuRmVhdHVyZUxpc3RdLAotICAgICAgICAgICAgICAgJmdzdWJbaGVhZGVyLkxvb2t1cExpc3RdKTsKLX0KLQotYm9vbCBDRlhfQ1RUR1NVQlRhYmxlOjpHZXRWZXJ0aWNhbEdseXBoKHVpbnQzMl90IGdseXBobnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiB2Z2x5cGhudW0pIHsKLSAgdWludDMyX3QgdGFnW10gPSB7Ci0gICAgICAodWludDhfdCkndicgPDwgMjQgfCAodWludDhfdCkncicgPDwgMTYgfCAodWludDhfdCkndCcgPDwgOCB8Ci0gICAgICAgICAgKHVpbnQ4X3QpJzInLAotICAgICAgKHVpbnQ4X3QpJ3YnIDw8IDI0IHwgKHVpbnQ4X3QpJ2UnIDw8IDE2IHwgKHVpbnQ4X3QpJ3InIDw8IDggfAotICAgICAgICAgICh1aW50OF90KSd0JywKLSAgfTsKLSAgaWYgKCFtX2JGZWF1dHVyZU1hcExvYWQpIHsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHNjcmlwdCA6IFNjcmlwdExpc3QuU2NyaXB0UmVjb3JkcykgewotICAgICAgZm9yIChjb25zdCBhdXRvJiByZWNvcmQgOiBzY3JpcHQuU2NyaXB0LkxhbmdTeXNSZWNvcmRzKSB7Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byYgaW5kZXggOiByZWNvcmQuTGFuZ1N5cy5GZWF0dXJlSW5kaWNlcykgewotICAgICAgICAgIGlmIChGZWF0dXJlTGlzdC5GZWF0dXJlUmVjb3Jkc1tpbmRleF0uRmVhdHVyZVRhZyA9PSB0YWdbMF0gfHwKLSAgICAgICAgICAgICAgRmVhdHVyZUxpc3QuRmVhdHVyZVJlY29yZHNbaW5kZXhdLkZlYXR1cmVUYWcgPT0gdGFnWzFdKSB7Ci0gICAgICAgICAgICBtX2ZlYXR1cmVTZXQuaW5zZXJ0KGluZGV4KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fZmVhdHVyZVNldC5lbXB0eSgpKSB7Ci0gICAgICBpbnQgaSA9IDA7Ci0gICAgICBmb3IgKGNvbnN0IGF1dG8mIGZlYXR1cmUgOiBGZWF0dXJlTGlzdC5GZWF0dXJlUmVjb3JkcykgewotICAgICAgICBpZiAoZmVhdHVyZS5GZWF0dXJlVGFnID09IHRhZ1swXSB8fCBmZWF0dXJlLkZlYXR1cmVUYWcgPT0gdGFnWzFdKQotICAgICAgICAgIG1fZmVhdHVyZVNldC5pbnNlcnQoaSk7Ci0gICAgICAgICsraTsKLSAgICAgIH0KLSAgICB9Ci0gICAgbV9iRmVhdXR1cmVNYXBMb2FkID0gdHJ1ZTsKLSAgfQotICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiBtX2ZlYXR1cmVTZXQpIHsKLSAgICBpZiAoR2V0VmVydGljYWxHbHlwaFN1YihnbHlwaG51bSwgdmdseXBobnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZGZWF0dXJlTGlzdC5GZWF0dXJlUmVjb3Jkc1tpdGVtXS5GZWF0dXJlKSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDRlhfQ1RUR1NVQlRhYmxlOjpHZXRWZXJ0aWNhbEdseXBoU3ViKHVpbnQzMl90IGdseXBobnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiB2Z2x5cGhudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEZlYXR1cmUqIEZlYXR1cmUpIHsKLSAgZm9yIChpbnQgaW5kZXggOiBGZWF0dXJlLT5Mb29rdXBMaXN0SW5kaWNlcykgewotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQ+KExvb2t1cExpc3QuTG9va3VwcykpCi0gICAgICBjb250aW51ZTsKLQotICAgIGlmIChMb29rdXBMaXN0Lkxvb2t1cHNbaW5kZXhdLkxvb2t1cFR5cGUgPT0gMSAmJgotICAgICAgICBHZXRWZXJ0aWNhbEdseXBoU3ViMihnbHlwaG51bSwgdmdseXBobnVtLCAmTG9va3VwTGlzdC5Mb29rdXBzW2luZGV4XSkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ0ZYX0NUVEdTVUJUYWJsZTo6R2V0VmVydGljYWxHbHlwaFN1YjIodWludDMyX3QgZ2x5cGhudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiB2Z2x5cGhudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRMb29rdXAqIExvb2t1cCkgewotICBmb3IgKGNvbnN0IGF1dG8mIHN1YlRhYmxlIDogTG9va3VwLT5TdWJUYWJsZXMpIHsKLSAgICBzd2l0Y2ggKHN1YlRhYmxlLT5TdWJzdEZvcm1hdCkgewotICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGF1dG8gdGJsMSA9IHN0YXRpY19jYXN0PFRTaW5nbGVTdWJzdEZvcm1hdDEqPihzdWJUYWJsZS5nZXQoKSk7Ci0gICAgICAgIGlmIChHZXRDb3ZlcmFnZUluZGV4KHRibDEtPkNvdmVyYWdlLmdldCgpLCBnbHlwaG51bSkgPj0gMCkgewotICAgICAgICAgICp2Z2x5cGhudW0gPSBnbHlwaG51bSArIHRibDEtPkRlbHRhR2x5cGhJRDsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgMjogewotICAgICAgICBhdXRvIHRibDIgPSBzdGF0aWNfY2FzdDxUU2luZ2xlU3Vic3RGb3JtYXQyKj4oc3ViVGFibGUuZ2V0KCkpOwotICAgICAgICBpbnQgaW5kZXggPSBHZXRDb3ZlcmFnZUluZGV4KHRibDItPkNvdmVyYWdlLmdldCgpLCBnbHlwaG51bSk7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwICYmCi0gICAgICAgICAgICBpbmRleCA8IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50Pih0YmwyLT5TdWJzdGl0dXRlcykpIHsKLSAgICAgICAgICAqdmdseXBobnVtID0gdGJsMi0+U3Vic3RpdHV0ZXNbaW5kZXhdOwotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWludCBDRlhfQ1RUR1NVQlRhYmxlOjpHZXRDb3ZlcmFnZUluZGV4KFRDb3ZlcmFnZUZvcm1hdEJhc2UqIENvdmVyYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZykgY29uc3QgewotICBpZiAoIUNvdmVyYWdlKQotICAgIHJldHVybiAtMTsKLQotICBzd2l0Y2ggKENvdmVyYWdlLT5Db3ZlcmFnZUZvcm1hdCkgewotICAgIGNhc2UgMTogewotICAgICAgaW50IGkgPSAwOwotICAgICAgVENvdmVyYWdlRm9ybWF0MSogYzEgPSAoVENvdmVyYWdlRm9ybWF0MSopQ292ZXJhZ2U7Ci0gICAgICBmb3IgKGNvbnN0IGF1dG8mIGdseXBoIDogYzEtPkdseXBoQXJyYXkpIHsKLSAgICAgICAgaWYgKHN0YXRpY19jYXN0PHVpbnQzMl90PihnbHlwaCkgPT0gZykKLSAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgKytpOwotICAgICAgfQotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBjYXNlIDI6IHsKLSAgICAgIFRDb3ZlcmFnZUZvcm1hdDIqIGMyID0gKFRDb3ZlcmFnZUZvcm1hdDIqKUNvdmVyYWdlOwotICAgICAgZm9yIChjb25zdCBhdXRvJiByYW5nZVJlYyA6IGMyLT5SYW5nZVJlY29yZHMpIHsKLSAgICAgICAgdWludDMyX3QgcyA9IHJhbmdlUmVjLlN0YXJ0OwotICAgICAgICB1aW50MzJfdCBlID0gcmFuZ2VSZWMuRW5kOwotICAgICAgICB1aW50MzJfdCBzaSA9IHJhbmdlUmVjLlN0YXJ0Q292ZXJhZ2VJbmRleDsKLSAgICAgICAgaWYgKHMgPD0gZyAmJiBnIDw9IGUpCi0gICAgICAgICAgcmV0dXJuIHNpICsgZyAtIHM7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB9Ci0gIHJldHVybiAtMTsKLX0KLQotdWludDhfdCBDRlhfQ1RUR1NVQlRhYmxlOjpHZXRVSW50OChGVF9CeXRlcyYgcCkgY29uc3QgewotICB1aW50OF90IHJldCA9IHBbMF07Ci0gIHAgKz0gMTsKLSAgcmV0dXJuIHJldDsKLX0KLQotaW50MTZfdCBDRlhfQ1RUR1NVQlRhYmxlOjpHZXRJbnQxNihGVF9CeXRlcyYgcCkgY29uc3QgewotICB1aW50MTZfdCByZXQgPSBwWzBdIDw8IDggfCBwWzFdOwotICBwICs9IDI7Ci0gIHJldHVybiAqKGludDE2X3QqKSZyZXQ7Ci19Ci0KLXVpbnQxNl90IENGWF9DVFRHU1VCVGFibGU6OkdldFVJbnQxNihGVF9CeXRlcyYgcCkgY29uc3QgewotICB1aW50MTZfdCByZXQgPSBwWzBdIDw8IDggfCBwWzFdOwotICBwICs9IDI7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWludDMyX3QgQ0ZYX0NUVEdTVUJUYWJsZTo6R2V0SW50MzIoRlRfQnl0ZXMmIHApIGNvbnN0IHsKLSAgdWludDMyX3QgcmV0ID0gcFswXSA8PCAyNCB8IHBbMV0gPDwgMTYgfCBwWzJdIDw8IDggfCBwWzNdOwotICBwICs9IDQ7Ci0gIHJldHVybiAqKGludDMyX3QqKSZyZXQ7Ci19Ci0KLXVpbnQzMl90IENGWF9DVFRHU1VCVGFibGU6OkdldFVJbnQzMihGVF9CeXRlcyYgcCkgY29uc3QgewotICB1aW50MzJfdCByZXQgPSBwWzBdIDw8IDI0IHwgcFsxXSA8PCAxNiB8IHBbMl0gPDwgOCB8IHBbM107Ci0gIHAgKz0gNDsKLSAgcmV0dXJuIHJldDsKLX0KLQotYm9vbCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZShGVF9CeXRlcyBzY3JpcHRsaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyBmZWF0dXJlbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgbG9va3VwbGlzdCkgewotICBQYXJzZVNjcmlwdExpc3Qoc2NyaXB0bGlzdCwgJlNjcmlwdExpc3QpOwotICBQYXJzZUZlYXR1cmVMaXN0KGZlYXR1cmVsaXN0LCAmRmVhdHVyZUxpc3QpOwotICBQYXJzZUxvb2t1cExpc3QobG9va3VwbGlzdCwgJkxvb2t1cExpc3QpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZVNjcmlwdExpc3QoRlRfQnl0ZXMgcmF3LCBUU2NyaXB0TGlzdCogcmVjKSB7Ci0gIEZUX0J5dGVzIHNwID0gcmF3OwotICByZWMtPlNjcmlwdFJlY29yZHMgPSBzdGQ6OnZlY3RvcjxUU2NyaXB0UmVjb3JkPihHZXRVSW50MTYoc3ApKTsKLSAgZm9yIChhdXRvJiBzY3JpcHRSZWMgOiByZWMtPlNjcmlwdFJlY29yZHMpIHsKLSAgICBzY3JpcHRSZWMuU2NyaXB0VGFnID0gR2V0VUludDMyKHNwKTsKLSAgICBQYXJzZVNjcmlwdCgmcmF3W0dldFVJbnQxNihzcCldLCAmc2NyaXB0UmVjLlNjcmlwdCk7Ci0gIH0KLX0KLQotdm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZVNjcmlwdChGVF9CeXRlcyByYXcsIFRTY3JpcHQqIHJlYykgewotICBGVF9CeXRlcyBzcCA9IHJhdzsKLSAgcmVjLT5EZWZhdWx0TGFuZ1N5cyA9IEdldFVJbnQxNihzcCk7Ci0gIHJlYy0+TGFuZ1N5c1JlY29yZHMgPSBzdGQ6OnZlY3RvcjxUTGFuZ1N5c1JlY29yZD4oR2V0VUludDE2KHNwKSk7Ci0gIGZvciAoYXV0byYgc3lzUmVjb3JkIDogcmVjLT5MYW5nU3lzUmVjb3JkcykgewotICAgIHN5c1JlY29yZC5MYW5nU3lzVGFnID0gR2V0VUludDMyKHNwKTsKLSAgICBQYXJzZUxhbmdTeXMoJnJhd1tHZXRVSW50MTYoc3ApXSwgJnN5c1JlY29yZC5MYW5nU3lzKTsKLSAgfQotfQotCi12b2lkIENGWF9DVFRHU1VCVGFibGU6OlBhcnNlTGFuZ1N5cyhGVF9CeXRlcyByYXcsIFRMYW5nU3lzKiByZWMpIHsKLSAgRlRfQnl0ZXMgc3AgPSByYXc7Ci0gIHJlYy0+TG9va3VwT3JkZXIgPSBHZXRVSW50MTYoc3ApOwotICByZWMtPlJlcUZlYXR1cmVJbmRleCA9IEdldFVJbnQxNihzcCk7Ci0gIHJlYy0+RmVhdHVyZUluZGljZXMgPSBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4oR2V0VUludDE2KHNwKSk7Ci0gIGZvciAoYXV0byYgZWxlbWVudCA6IHJlYy0+RmVhdHVyZUluZGljZXMpCi0gICAgZWxlbWVudCA9IEdldFVJbnQxNihzcCk7Ci19Ci0KLXZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VGZWF0dXJlTGlzdChGVF9CeXRlcyByYXcsIFRGZWF0dXJlTGlzdCogcmVjKSB7Ci0gIEZUX0J5dGVzIHNwID0gcmF3OwotICByZWMtPkZlYXR1cmVSZWNvcmRzID0gc3RkOjp2ZWN0b3I8VEZlYXR1cmVSZWNvcmQ+KEdldFVJbnQxNihzcCkpOwotICBmb3IgKGF1dG8mIGZlYXR1cmVSZWMgOiByZWMtPkZlYXR1cmVSZWNvcmRzKSB7Ci0gICAgZmVhdHVyZVJlYy5GZWF0dXJlVGFnID0gR2V0VUludDMyKHNwKTsKLSAgICBQYXJzZUZlYXR1cmUoJnJhd1tHZXRVSW50MTYoc3ApXSwgJmZlYXR1cmVSZWMuRmVhdHVyZSk7Ci0gIH0KLX0KLQotdm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZUZlYXR1cmUoRlRfQnl0ZXMgcmF3LCBURmVhdHVyZSogcmVjKSB7Ci0gIEZUX0J5dGVzIHNwID0gcmF3OwotICByZWMtPkZlYXR1cmVQYXJhbXMgPSBHZXRVSW50MTYoc3ApOwotICByZWMtPkxvb2t1cExpc3RJbmRpY2VzID0gc3RkOjp2ZWN0b3I8dWludDE2X3Q+KEdldFVJbnQxNihzcCkpOwotICBmb3IgKGF1dG8mIGxpc3RJbmRleCA6IHJlYy0+TG9va3VwTGlzdEluZGljZXMpCi0gICAgbGlzdEluZGV4ID0gR2V0VUludDE2KHNwKTsKLX0KLQotdm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZUxvb2t1cExpc3QoRlRfQnl0ZXMgcmF3LCBUTG9va3VwTGlzdCogcmVjKSB7Ci0gIEZUX0J5dGVzIHNwID0gcmF3OwotICByZWMtPkxvb2t1cHMgPSBzdGQ6OnZlY3RvcjxUTG9va3VwPihHZXRVSW50MTYoc3ApKTsKLSAgZm9yIChhdXRvJiBsb29rdXAgOiByZWMtPkxvb2t1cHMpCi0gICAgUGFyc2VMb29rdXAoJnJhd1tHZXRVSW50MTYoc3ApXSwgJmxvb2t1cCk7Ci19Ci0KLXZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VMb29rdXAoRlRfQnl0ZXMgcmF3LCBUTG9va3VwKiByZWMpIHsKLSAgRlRfQnl0ZXMgc3AgPSByYXc7Ci0gIHJlYy0+TG9va3VwVHlwZSA9IEdldFVJbnQxNihzcCk7Ci0gIHJlYy0+TG9va3VwRmxhZyA9IEdldFVJbnQxNihzcCk7Ci0gIHJlYy0+U3ViVGFibGVzID0gc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRTdWJUYWJsZUJhc2U+PihHZXRVSW50MTYoc3ApKTsKLSAgaWYgKHJlYy0+TG9va3VwVHlwZSAhPSAxKQotICAgIHJldHVybjsKLQotICBmb3IgKGF1dG8mIHN1YlRhYmxlIDogcmVjLT5TdWJUYWJsZXMpCi0gICAgUGFyc2VTaW5nbGVTdWJzdCgmcmF3W0dldFVJbnQxNihzcCldLCAmc3ViVGFibGUpOwotfQotCi1DRlhfQ1RUR1NVQlRhYmxlOjpUQ292ZXJhZ2VGb3JtYXRCYXNlKiBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZUNvdmVyYWdlKAotICAgIEZUX0J5dGVzIHJhdykgewotICBGVF9CeXRlcyBzcCA9IHJhdzsKLSAgdWludDE2X3QgZm9ybWF0ID0gR2V0VUludDE2KHNwKTsKLSAgVENvdmVyYWdlRm9ybWF0QmFzZSogcmVjID0gbnVsbHB0cjsKLSAgaWYgKGZvcm1hdCA9PSAxKSB7Ci0gICAgcmVjID0gbmV3IFRDb3ZlcmFnZUZvcm1hdDEoKTsKLSAgICBQYXJzZUNvdmVyYWdlRm9ybWF0MShyYXcsIHN0YXRpY19jYXN0PFRDb3ZlcmFnZUZvcm1hdDEqPihyZWMpKTsKLSAgfSBlbHNlIGlmIChmb3JtYXQgPT0gMikgewotICAgIHJlYyA9IG5ldyBUQ292ZXJhZ2VGb3JtYXQyKCk7Ci0gICAgUGFyc2VDb3ZlcmFnZUZvcm1hdDIocmF3LCBzdGF0aWNfY2FzdDxUQ292ZXJhZ2VGb3JtYXQyKj4ocmVjKSk7Ci0gIH0KLSAgcmV0dXJuIHJlYzsKLX0KLQotdm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZUNvdmVyYWdlRm9ybWF0MShGVF9CeXRlcyByYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDb3ZlcmFnZUZvcm1hdDEqIHJlYykgewotICBGVF9CeXRlcyBzcCA9IHJhdzsKLSAgKHZvaWQpR2V0VUludDE2KHNwKTsKLSAgcmVjLT5HbHlwaEFycmF5ID0gc3RkOjp2ZWN0b3I8dWludDE2X3Q+KEdldFVJbnQxNihzcCkpOwotICBmb3IgKGF1dG8mIGdseXBoIDogcmVjLT5HbHlwaEFycmF5KQotICAgIGdseXBoID0gR2V0VUludDE2KHNwKTsKLX0KLQotdm9pZCBDRlhfQ1RUR1NVQlRhYmxlOjpQYXJzZUNvdmVyYWdlRm9ybWF0MihGVF9CeXRlcyByYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRDb3ZlcmFnZUZvcm1hdDIqIHJlYykgewotICBGVF9CeXRlcyBzcCA9IHJhdzsKLSAgKHZvaWQpR2V0VUludDE2KHNwKTsKLSAgcmVjLT5SYW5nZVJlY29yZHMgPSBzdGQ6OnZlY3RvcjxUUmFuZ2VSZWNvcmQ+KEdldFVJbnQxNihzcCkpOwotICBmb3IgKGF1dG8mIHJhbmdlUmVjIDogcmVjLT5SYW5nZVJlY29yZHMpIHsKLSAgICByYW5nZVJlYy5TdGFydCA9IEdldFVJbnQxNihzcCk7Ci0gICAgcmFuZ2VSZWMuRW5kID0gR2V0VUludDE2KHNwKTsKLSAgICByYW5nZVJlYy5TdGFydENvdmVyYWdlSW5kZXggPSBHZXRVSW50MTYoc3ApOwotICB9Ci19Ci0KLXZvaWQgQ0ZYX0NUVEdTVUJUYWJsZTo6UGFyc2VTaW5nbGVTdWJzdChGVF9CeXRlcyByYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFRTdWJUYWJsZUJhc2U+KiByZWMpIHsKLSAgRlRfQnl0ZXMgc3AgPSByYXc7Ci0gIHVpbnQxNl90IEZvcm1hdCA9IEdldFVJbnQxNihzcCk7Ci0gIHN3aXRjaCAoRm9ybWF0KSB7Ci0gICAgY2FzZSAxOgotICAgICAgKnJlYyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxUU2luZ2xlU3Vic3RGb3JtYXQxPigpOwotICAgICAgUGFyc2VTaW5nbGVTdWJzdEZvcm1hdDEocmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VFNpbmdsZVN1YnN0Rm9ybWF0MSo+KHJlYy0+Z2V0KCkpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjoKLSAgICAgICpyZWMgPSBwZGZpdW06Ok1ha2VVbmlxdWU8VFNpbmdsZVN1YnN0Rm9ybWF0Mj4oKTsKLSAgICAgIFBhcnNlU2luZ2xlU3Vic3RGb3JtYXQyKHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFRTaW5nbGVTdWJzdEZvcm1hdDIqPihyZWMtPmdldCgpKSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIENGWF9DVFRHU1VCVGFibGU6OlBhcnNlU2luZ2xlU3Vic3RGb3JtYXQxKEZUX0J5dGVzIHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFNpbmdsZVN1YnN0Rm9ybWF0MSogcmVjKSB7Ci0gIEZUX0J5dGVzIHNwID0gcmF3OwotICBHZXRVSW50MTYoc3ApOwotICB1aW50MTZfdCBvZmZzZXQgPSBHZXRVSW50MTYoc3ApOwotICByZWMtPkNvdmVyYWdlLnJlc2V0KFBhcnNlQ292ZXJhZ2UoJnJhd1tvZmZzZXRdKSk7Ci0gIHJlYy0+RGVsdGFHbHlwaElEID0gR2V0SW50MTYoc3ApOwotfQotCi12b2lkIENGWF9DVFRHU1VCVGFibGU6OlBhcnNlU2luZ2xlU3Vic3RGb3JtYXQyKEZUX0J5dGVzIHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFNpbmdsZVN1YnN0Rm9ybWF0MiogcmVjKSB7Ci0gIEZUX0J5dGVzIHNwID0gcmF3OwotICAodm9pZClHZXRVSW50MTYoc3ApOwotICB1aW50MTZfdCBvZmZzZXQgPSBHZXRVSW50MTYoc3ApOwotICByZWMtPkNvdmVyYWdlLnJlc2V0KFBhcnNlQ292ZXJhZ2UoJnJhd1tvZmZzZXRdKSk7Ci0gIHJlYy0+U3Vic3RpdHV0ZXMgPSBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4oR2V0VUludDE2KHNwKSk7Ci0gIGZvciAoYXV0byYgc3Vic3RpdHV0ZSA6IHJlYy0+U3Vic3RpdHV0ZXMpCi0gICAgc3Vic3RpdHV0ZSA9IEdldFVJbnQxNihzcCk7Ci19Ci0KLUNGWF9DVFRHU1VCVGFibGU6OlRDb3ZlcmFnZUZvcm1hdDE6OlRDb3ZlcmFnZUZvcm1hdDEoKQotICAgIDogVENvdmVyYWdlRm9ybWF0QmFzZSgxKSB7fQotCi1DRlhfQ1RUR1NVQlRhYmxlOjpUQ292ZXJhZ2VGb3JtYXQxOjp+VENvdmVyYWdlRm9ybWF0MSgpIHt9Ci0KLUNGWF9DVFRHU1VCVGFibGU6OlRSYW5nZVJlY29yZDo6VFJhbmdlUmVjb3JkKCkKLSAgICA6IFN0YXJ0KDApLCBFbmQoMCksIFN0YXJ0Q292ZXJhZ2VJbmRleCgwKSB7fQotCi1DRlhfQ1RUR1NVQlRhYmxlOjpUQ292ZXJhZ2VGb3JtYXQyOjpUQ292ZXJhZ2VGb3JtYXQyKCkKLSAgICA6IFRDb3ZlcmFnZUZvcm1hdEJhc2UoMikge30KLQotQ0ZYX0NUVEdTVUJUYWJsZTo6VENvdmVyYWdlRm9ybWF0Mjo6flRDb3ZlcmFnZUZvcm1hdDIoKSB7fQotCi1DRlhfQ1RUR1NVQlRhYmxlOjpUU2luZ2xlU3Vic3RGb3JtYXQxOjpUU2luZ2xlU3Vic3RGb3JtYXQxKCkKLSAgICA6IFRTdWJUYWJsZUJhc2UoMSksIERlbHRhR2x5cGhJRCgwKSB7fQotCi1DRlhfQ1RUR1NVQlRhYmxlOjpUU2luZ2xlU3Vic3RGb3JtYXQxOjp+VFNpbmdsZVN1YnN0Rm9ybWF0MSgpIHt9Ci0KLUNGWF9DVFRHU1VCVGFibGU6OlRTaW5nbGVTdWJzdEZvcm1hdDI6OlRTaW5nbGVTdWJzdEZvcm1hdDIoKQotICAgIDogVFN1YlRhYmxlQmFzZSgyKSB7fQotCi1DRlhfQ1RUR1NVQlRhYmxlOjpUU2luZ2xlU3Vic3RGb3JtYXQyOjp+VFNpbmdsZVN1YnN0Rm9ybWF0MigpIHt9Ci0KLUNGWF9DVFRHU1VCVGFibGU6OlRMb29rdXA6OlRMb29rdXAoKSA6IExvb2t1cFR5cGUoMCksIExvb2t1cEZsYWcoMCkge30KLQotQ0ZYX0NUVEdTVUJUYWJsZTo6VExvb2t1cDo6flRMb29rdXAoKSB7fQotCi1DRlhfQ1RUR1NVQlRhYmxlOjpUU2NyaXB0OjpUU2NyaXB0KCkgOiBEZWZhdWx0TGFuZ1N5cygwKSB7fQotCi1DRlhfQ1RUR1NVQlRhYmxlOjpUU2NyaXB0Ojp+VFNjcmlwdCgpIHt9Ci0KLUNGWF9DVFRHU1VCVGFibGU6OlRTY3JpcHRMaXN0OjpUU2NyaXB0TGlzdCgpIHt9Ci0KLUNGWF9DVFRHU1VCVGFibGU6OlRTY3JpcHRMaXN0Ojp+VFNjcmlwdExpc3QoKSB7fQotCi1DRlhfQ1RUR1NVQlRhYmxlOjpURmVhdHVyZTo6VEZlYXR1cmUoKSA6IEZlYXR1cmVQYXJhbXMoMCkge30KLQotQ0ZYX0NUVEdTVUJUYWJsZTo6VEZlYXR1cmU6On5URmVhdHVyZSgpIHt9Ci0KLUNGWF9DVFRHU1VCVGFibGU6OlRGZWF0dXJlTGlzdDo6VEZlYXR1cmVMaXN0KCkge30KLQotQ0ZYX0NUVEdTVUJUYWJsZTo6VEZlYXR1cmVMaXN0Ojp+VEZlYXR1cmVMaXN0KCkge30KLQotQ0ZYX0NUVEdTVUJUYWJsZTo6VExvb2t1cExpc3Q6OlRMb29rdXBMaXN0KCkge30KLQotQ0ZYX0NUVEdTVUJUYWJsZTo6VExvb2t1cExpc3Q6On5UTG9va3VwTGlzdCgpIHt9Ci0KLUNGWF9DVFRHU1VCVGFibGU6OlRMYW5nU3lzOjpUTGFuZ1N5cygpIDogTG9va3VwT3JkZXIoMCksIFJlcUZlYXR1cmVJbmRleCgwKSB7fQotCi1DRlhfQ1RUR1NVQlRhYmxlOjpUTGFuZ1N5czo6flRMYW5nU3lzKCkge30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9mb250L3R0Z3N1YnRhYmxlLmggYi9jb3JlL2ZwZGZhcGkvZm9udC90dGdzdWJ0YWJsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTI3MjY5Li4wMDAwMDAwCi0tLSBhL2NvcmUvZnBkZmFwaS9mb250L3R0Z3N1YnRhYmxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlBERkFQSV9GT05UX1RUR1NVQlRBQkxFX0hfCi0jZGVmaW5lIENPUkVfRlBERkFQSV9GT05UX1RUR1NVQlRBQkxFX0hfCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mb250LmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZyZWV0eXBlLmgiCi0KLWNsYXNzIENGWF9HbHlwaE1hcCB7Ci0gcHVibGljOgotICBDRlhfR2x5cGhNYXAoKTsKLSAgfkNGWF9HbHlwaE1hcCgpOwotCi0gIHZvaWQgU2V0QXQoaW50IGtleSwgaW50IHZhbHVlKTsKLSAgYm9vbCBMb29rdXAoaW50IGtleSwgaW50JiB2YWx1ZSk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIENGWF9CaW5hcnlCdWYgbV9CdWZmZXI7Ci19OwotCi1jbGFzcyBDRlhfQ1RUR1NVQlRhYmxlIHsKLSBwdWJsaWM6Ci0gIENGWF9DVFRHU1VCVGFibGUoKTsKLSAgZXhwbGljaXQgQ0ZYX0NUVEdTVUJUYWJsZShGVF9CeXRlcyBnc3ViKTsKLSAgdmlydHVhbCB+Q0ZYX0NUVEdTVUJUYWJsZSgpOwotCi0gIGJvb2wgSXNPaygpIGNvbnN0OwotICBib29sIExvYWRHU1VCVGFibGUoRlRfQnl0ZXMgZ3N1Yik7Ci0gIGJvb2wgR2V0VmVydGljYWxHbHlwaCh1aW50MzJfdCBnbHlwaG51bSwgdWludDMyX3QqIHZnbHlwaG51bSk7Ci0KLSBwcml2YXRlOgotICBzdHJ1Y3QgdHRfZ3N1Yl9oZWFkZXIgewotICAgIHVpbnQzMl90IFZlcnNpb247Ci0gICAgdWludDE2X3QgU2NyaXB0TGlzdDsKLSAgICB1aW50MTZfdCBGZWF0dXJlTGlzdDsKLSAgICB1aW50MTZfdCBMb29rdXBMaXN0OwotICB9OwotCi0gIHN0cnVjdCBUTGFuZ1N5cyB7Ci0gICAgVExhbmdTeXMoKTsKLSAgICB+VExhbmdTeXMoKTsKLQotICAgIHVpbnQxNl90IExvb2t1cE9yZGVyOwotICAgIHVpbnQxNl90IFJlcUZlYXR1cmVJbmRleDsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gRmVhdHVyZUluZGljZXM7Ci0KLSAgIHByaXZhdGU6Ci0gICAgVExhbmdTeXMoY29uc3QgVExhbmdTeXMmKSA9IGRlbGV0ZTsKLSAgICBUTGFuZ1N5cyYgb3BlcmF0b3I9KGNvbnN0IFRMYW5nU3lzJikgPSBkZWxldGU7Ci0gIH07Ci0KLSAgc3RydWN0IFRMYW5nU3lzUmVjb3JkIHsKLSAgICBUTGFuZ1N5c1JlY29yZCgpIDogTGFuZ1N5c1RhZygwKSB7fQotCi0gICAgdWludDMyX3QgTGFuZ1N5c1RhZzsKLSAgICBUTGFuZ1N5cyBMYW5nU3lzOwotCi0gICBwcml2YXRlOgotICAgIFRMYW5nU3lzUmVjb3JkKGNvbnN0IFRMYW5nU3lzUmVjb3JkJikgPSBkZWxldGU7Ci0gICAgVExhbmdTeXNSZWNvcmQmIG9wZXJhdG9yPShjb25zdCBUTGFuZ1N5c1JlY29yZCYpID0gZGVsZXRlOwotICB9OwotCi0gIHN0cnVjdCBUU2NyaXB0IHsKLSAgICBUU2NyaXB0KCk7Ci0gICAgflRTY3JpcHQoKTsKLQotICAgIHVpbnQxNl90IERlZmF1bHRMYW5nU3lzOwotICAgIHN0ZDo6dmVjdG9yPFRMYW5nU3lzUmVjb3JkPiBMYW5nU3lzUmVjb3JkczsKLQotICAgcHJpdmF0ZToKLSAgICBUU2NyaXB0KGNvbnN0IFRTY3JpcHQmKSA9IGRlbGV0ZTsKLSAgICBUU2NyaXB0JiBvcGVyYXRvcj0oY29uc3QgVFNjcmlwdCYpID0gZGVsZXRlOwotICB9OwotCi0gIHN0cnVjdCBUU2NyaXB0UmVjb3JkIHsKLSAgICBUU2NyaXB0UmVjb3JkKCkgOiBTY3JpcHRUYWcoMCkge30KLQotICAgIHVpbnQzMl90IFNjcmlwdFRhZzsKLSAgICBUU2NyaXB0IFNjcmlwdDsKLQotICAgcHJpdmF0ZToKLSAgICBUU2NyaXB0UmVjb3JkKGNvbnN0IFRTY3JpcHRSZWNvcmQmKSA9IGRlbGV0ZTsKLSAgICBUU2NyaXB0UmVjb3JkJiBvcGVyYXRvcj0oY29uc3QgVFNjcmlwdFJlY29yZCYpID0gZGVsZXRlOwotICB9OwotCi0gIHN0cnVjdCBUU2NyaXB0TGlzdCB7Ci0gICAgVFNjcmlwdExpc3QoKTsKLSAgICB+VFNjcmlwdExpc3QoKTsKLQotICAgIHN0ZDo6dmVjdG9yPFRTY3JpcHRSZWNvcmQ+IFNjcmlwdFJlY29yZHM7Ci0KLSAgIHByaXZhdGU6Ci0gICAgVFNjcmlwdExpc3QoY29uc3QgVFNjcmlwdExpc3QmKSA9IGRlbGV0ZTsKLSAgICBUU2NyaXB0TGlzdCYgb3BlcmF0b3I9KGNvbnN0IFRTY3JpcHRMaXN0JikgPSBkZWxldGU7Ci0gIH07Ci0KLSAgc3RydWN0IFRGZWF0dXJlIHsKLSAgICBURmVhdHVyZSgpOwotICAgIH5URmVhdHVyZSgpOwotCi0gICAgdWludDE2X3QgRmVhdHVyZVBhcmFtczsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gTG9va3VwTGlzdEluZGljZXM7Ci0KLSAgIHByaXZhdGU6Ci0gICAgVEZlYXR1cmUoY29uc3QgVEZlYXR1cmUmKSA9IGRlbGV0ZTsKLSAgICBURmVhdHVyZSYgb3BlcmF0b3I9KGNvbnN0IFRGZWF0dXJlJikgPSBkZWxldGU7Ci0gIH07Ci0KLSAgc3RydWN0IFRGZWF0dXJlUmVjb3JkIHsKLSAgICBURmVhdHVyZVJlY29yZCgpIDogRmVhdHVyZVRhZygwKSB7fQotCi0gICAgdWludDMyX3QgRmVhdHVyZVRhZzsKLSAgICBURmVhdHVyZSBGZWF0dXJlOwotCi0gICBwcml2YXRlOgotICAgIFRGZWF0dXJlUmVjb3JkKGNvbnN0IFRGZWF0dXJlUmVjb3JkJikgPSBkZWxldGU7Ci0gICAgVEZlYXR1cmVSZWNvcmQmIG9wZXJhdG9yPShjb25zdCBURmVhdHVyZVJlY29yZCYpID0gZGVsZXRlOwotICB9OwotCi0gIHN0cnVjdCBURmVhdHVyZUxpc3QgewotICAgIFRGZWF0dXJlTGlzdCgpOwotICAgIH5URmVhdHVyZUxpc3QoKTsKLQotICAgIHN0ZDo6dmVjdG9yPFRGZWF0dXJlUmVjb3JkPiBGZWF0dXJlUmVjb3JkczsKLQotICAgcHJpdmF0ZToKLSAgICBURmVhdHVyZUxpc3QoY29uc3QgVEZlYXR1cmVMaXN0JikgPSBkZWxldGU7Ci0gICAgVEZlYXR1cmVMaXN0JiBvcGVyYXRvcj0oY29uc3QgVEZlYXR1cmVMaXN0JikgPSBkZWxldGU7Ci0gIH07Ci0KLSAgZW51bSBUTG9va3VwRmxhZyB7Ci0gICAgTE9PS1VQRkxBR19SaWdodFRvTGVmdCA9IDB4MDAwMSwKLSAgICBMT09LVVBGTEFHX0lnbm9yZUJhc2VHbHlwaHMgPSAweDAwMDIsCi0gICAgTE9PS1VQRkxBR19JZ25vcmVMaWdhdHVyZXMgPSAweDAwMDQsCi0gICAgTE9PS1VQRkxBR19JZ25vcmVNYXJrcyA9IDB4MDAwOCwKLSAgICBMT09LVVBGTEFHX1Jlc2VydmVkID0gMHgwMEYwLAotICAgIExPT0tVUEZMQUdfTWFya0F0dGFjaG1lbnRUeXBlID0gMHhGRjAwLAotICB9OwotCi0gIHN0cnVjdCBUQ292ZXJhZ2VGb3JtYXRCYXNlIHsKLSAgICBUQ292ZXJhZ2VGb3JtYXRCYXNlKCkgOiBDb3ZlcmFnZUZvcm1hdCgwKSB7fQotICAgIGV4cGxpY2l0IFRDb3ZlcmFnZUZvcm1hdEJhc2UodWludDE2X3QgZm9ybWF0KSA6IENvdmVyYWdlRm9ybWF0KGZvcm1hdCkge30KLSAgICB2aXJ0dWFsIH5UQ292ZXJhZ2VGb3JtYXRCYXNlKCkge30KLQotICAgIHVpbnQxNl90IENvdmVyYWdlRm9ybWF0OwotICAgIENGWF9HbHlwaE1hcCBtX2dseXBoTWFwOwotCi0gICBwcml2YXRlOgotICAgIFRDb3ZlcmFnZUZvcm1hdEJhc2UoY29uc3QgVENvdmVyYWdlRm9ybWF0QmFzZSYpOwotICAgIFRDb3ZlcmFnZUZvcm1hdEJhc2UmIG9wZXJhdG9yPShjb25zdCBUQ292ZXJhZ2VGb3JtYXRCYXNlJik7Ci0gIH07Ci0KLSAgc3RydWN0IFRDb3ZlcmFnZUZvcm1hdDEgOiBwdWJsaWMgVENvdmVyYWdlRm9ybWF0QmFzZSB7Ci0gICAgVENvdmVyYWdlRm9ybWF0MSgpOwotICAgIH5UQ292ZXJhZ2VGb3JtYXQxKCkgb3ZlcnJpZGU7Ci0KLSAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gR2x5cGhBcnJheTsKLQotICAgcHJpdmF0ZToKLSAgICBUQ292ZXJhZ2VGb3JtYXQxKGNvbnN0IFRDb3ZlcmFnZUZvcm1hdDEmKSA9IGRlbGV0ZTsKLSAgICBUQ292ZXJhZ2VGb3JtYXQxJiBvcGVyYXRvcj0oY29uc3QgVENvdmVyYWdlRm9ybWF0MSYpID0gZGVsZXRlOwotICB9OwotCi0gIHN0cnVjdCBUUmFuZ2VSZWNvcmQgewotICAgIFRSYW5nZVJlY29yZCgpOwotCi0gICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFRSYW5nZVJlY29yZCYgcjEsIGNvbnN0IFRSYW5nZVJlY29yZCYgcjIpIHsKLSAgICAgIHJldHVybiByMS5TdGFydCA+IHIyLlN0YXJ0OwotICAgIH0KLQotICAgIHVpbnQxNl90IFN0YXJ0OwotICAgIHVpbnQxNl90IEVuZDsKLSAgICB1aW50MTZfdCBTdGFydENvdmVyYWdlSW5kZXg7Ci0KLSAgIHByaXZhdGU6Ci0gICAgVFJhbmdlUmVjb3JkKGNvbnN0IFRSYW5nZVJlY29yZCYpID0gZGVsZXRlOwotICB9OwotCi0gIHN0cnVjdCBUQ292ZXJhZ2VGb3JtYXQyIDogcHVibGljIFRDb3ZlcmFnZUZvcm1hdEJhc2UgewotICAgIFRDb3ZlcmFnZUZvcm1hdDIoKTsKLSAgICB+VENvdmVyYWdlRm9ybWF0MigpIG92ZXJyaWRlOwotCi0gICAgc3RkOjp2ZWN0b3I8VFJhbmdlUmVjb3JkPiBSYW5nZVJlY29yZHM7Ci0KLSAgIHByaXZhdGU6Ci0gICAgVENvdmVyYWdlRm9ybWF0Mihjb25zdCBUQ292ZXJhZ2VGb3JtYXQyJikgPSBkZWxldGU7Ci0gICAgVENvdmVyYWdlRm9ybWF0MiYgb3BlcmF0b3I9KGNvbnN0IFRDb3ZlcmFnZUZvcm1hdDImKSA9IGRlbGV0ZTsKLSAgfTsKLQotICBzdHJ1Y3QgVERldmljZSB7Ci0gICAgVERldmljZSgpIDogU3RhcnRTaXplKDApLCBFbmRTaXplKDApLCBEZWx0YUZvcm1hdCgwKSB7fQotCi0gICAgdWludDE2X3QgU3RhcnRTaXplOwotICAgIHVpbnQxNl90IEVuZFNpemU7Ci0gICAgdWludDE2X3QgRGVsdGFGb3JtYXQ7Ci0KLSAgIHByaXZhdGU6Ci0gICAgVERldmljZShjb25zdCBURGV2aWNlJikgPSBkZWxldGU7Ci0gICAgVERldmljZSYgb3BlcmF0b3I9KGNvbnN0IFREZXZpY2UmKSA9IGRlbGV0ZTsKLSAgfTsKLQotICBzdHJ1Y3QgVFN1YlRhYmxlQmFzZSB7Ci0gICAgVFN1YlRhYmxlQmFzZSgpIDogU3Vic3RGb3JtYXQoMCkge30KLSAgICBleHBsaWNpdCBUU3ViVGFibGVCYXNlKHVpbnQxNl90IGZvcm1hdCkgOiBTdWJzdEZvcm1hdChmb3JtYXQpIHt9Ci0gICAgdmlydHVhbCB+VFN1YlRhYmxlQmFzZSgpIHt9Ci0KLSAgICB1aW50MTZfdCBTdWJzdEZvcm1hdDsKLQotICAgcHJpdmF0ZToKLSAgICBUU3ViVGFibGVCYXNlKGNvbnN0IFRTdWJUYWJsZUJhc2UmKSA9IGRlbGV0ZTsKLSAgICBUU3ViVGFibGVCYXNlJiBvcGVyYXRvcj0oY29uc3QgVFN1YlRhYmxlQmFzZSYpID0gZGVsZXRlOwotICB9OwotCi0gIHN0cnVjdCBUU2luZ2xlU3Vic3RGb3JtYXQxIDogcHVibGljIFRTdWJUYWJsZUJhc2UgewotICAgIFRTaW5nbGVTdWJzdEZvcm1hdDEoKTsKLSAgICB+VFNpbmdsZVN1YnN0Rm9ybWF0MSgpIG92ZXJyaWRlOwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPFRDb3ZlcmFnZUZvcm1hdEJhc2U+IENvdmVyYWdlOwotICAgIGludDE2X3QgRGVsdGFHbHlwaElEOwotCi0gICBwcml2YXRlOgotICAgIFRTaW5nbGVTdWJzdEZvcm1hdDEoY29uc3QgVFNpbmdsZVN1YnN0Rm9ybWF0MSYpID0gZGVsZXRlOwotICAgIFRTaW5nbGVTdWJzdEZvcm1hdDEmIG9wZXJhdG9yPShjb25zdCBUU2luZ2xlU3Vic3RGb3JtYXQxJikgPSBkZWxldGU7Ci0gIH07Ci0KLSAgc3RydWN0IFRTaW5nbGVTdWJzdEZvcm1hdDIgOiBwdWJsaWMgVFN1YlRhYmxlQmFzZSB7Ci0gICAgVFNpbmdsZVN1YnN0Rm9ybWF0MigpOwotICAgIH5UU2luZ2xlU3Vic3RGb3JtYXQyKCkgb3ZlcnJpZGU7Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8VENvdmVyYWdlRm9ybWF0QmFzZT4gQ292ZXJhZ2U7Ci0gICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IFN1YnN0aXR1dGVzOwotCi0gICBwcml2YXRlOgotICAgIFRTaW5nbGVTdWJzdEZvcm1hdDIoY29uc3QgVFNpbmdsZVN1YnN0Rm9ybWF0MiYpID0gZGVsZXRlOwotICAgIFRTaW5nbGVTdWJzdEZvcm1hdDImIG9wZXJhdG9yPShjb25zdCBUU2luZ2xlU3Vic3RGb3JtYXQyJikgPSBkZWxldGU7Ci0gIH07Ci0KLSAgc3RydWN0IFRMb29rdXAgewotICAgIFRMb29rdXAoKTsKLSAgICB+VExvb2t1cCgpOwotCi0gICAgdWludDE2X3QgTG9va3VwVHlwZTsKLSAgICB1aW50MTZfdCBMb29rdXBGbGFnOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxUU3ViVGFibGVCYXNlPj4gU3ViVGFibGVzOwotCi0gICBwcml2YXRlOgotICAgIFRMb29rdXAoY29uc3QgVExvb2t1cCYpID0gZGVsZXRlOwotICAgIFRMb29rdXAmIG9wZXJhdG9yPShjb25zdCBUTG9va3VwJikgPSBkZWxldGU7Ci0gIH07Ci0KLSAgc3RydWN0IFRMb29rdXBMaXN0IHsKLSAgICBUTG9va3VwTGlzdCgpOwotICAgIH5UTG9va3VwTGlzdCgpOwotCi0gICAgc3RkOjp2ZWN0b3I8VExvb2t1cD4gTG9va3VwczsKLQotICAgcHJpdmF0ZToKLSAgICBUTG9va3VwTGlzdChjb25zdCBUTG9va3VwTGlzdCYpID0gZGVsZXRlOwotICAgIFRMb29rdXBMaXN0JiBvcGVyYXRvcj0oY29uc3QgVExvb2t1cExpc3QmKSA9IGRlbGV0ZTsKLSAgfTsKLQotICBib29sIFBhcnNlKEZUX0J5dGVzIHNjcmlwdGxpc3QsIEZUX0J5dGVzIGZlYXR1cmVsaXN0LCBGVF9CeXRlcyBsb29rdXBsaXN0KTsKLSAgdm9pZCBQYXJzZVNjcmlwdExpc3QoRlRfQnl0ZXMgcmF3LCBUU2NyaXB0TGlzdCogcmVjKTsKLSAgdm9pZCBQYXJzZVNjcmlwdChGVF9CeXRlcyByYXcsIFRTY3JpcHQqIHJlYyk7Ci0gIHZvaWQgUGFyc2VMYW5nU3lzKEZUX0J5dGVzIHJhdywgVExhbmdTeXMqIHJlYyk7Ci0gIHZvaWQgUGFyc2VGZWF0dXJlTGlzdChGVF9CeXRlcyByYXcsIFRGZWF0dXJlTGlzdCogcmVjKTsKLSAgdm9pZCBQYXJzZUZlYXR1cmUoRlRfQnl0ZXMgcmF3LCBURmVhdHVyZSogcmVjKTsKLSAgdm9pZCBQYXJzZUxvb2t1cExpc3QoRlRfQnl0ZXMgcmF3LCBUTG9va3VwTGlzdCogcmVjKTsKLSAgdm9pZCBQYXJzZUxvb2t1cChGVF9CeXRlcyByYXcsIFRMb29rdXAqIHJlYyk7Ci0gIFRDb3ZlcmFnZUZvcm1hdEJhc2UqIFBhcnNlQ292ZXJhZ2UoRlRfQnl0ZXMgcmF3KTsKLSAgdm9pZCBQYXJzZUNvdmVyYWdlRm9ybWF0MShGVF9CeXRlcyByYXcsIFRDb3ZlcmFnZUZvcm1hdDEqIHJlYyk7Ci0gIHZvaWQgUGFyc2VDb3ZlcmFnZUZvcm1hdDIoRlRfQnl0ZXMgcmF3LCBUQ292ZXJhZ2VGb3JtYXQyKiByZWMpOwotICB2b2lkIFBhcnNlU2luZ2xlU3Vic3QoRlRfQnl0ZXMgcmF3LCBzdGQ6OnVuaXF1ZV9wdHI8VFN1YlRhYmxlQmFzZT4qIHJlYyk7Ci0gIHZvaWQgUGFyc2VTaW5nbGVTdWJzdEZvcm1hdDEoRlRfQnl0ZXMgcmF3LCBUU2luZ2xlU3Vic3RGb3JtYXQxKiByZWMpOwotICB2b2lkIFBhcnNlU2luZ2xlU3Vic3RGb3JtYXQyKEZUX0J5dGVzIHJhdywgVFNpbmdsZVN1YnN0Rm9ybWF0MiogcmVjKTsKLQotICBib29sIEdldFZlcnRpY2FsR2x5cGhTdWIodWludDMyX3QgZ2x5cGhudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogdmdseXBobnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVEZlYXR1cmUqIEZlYXR1cmUpOwotICBib29sIEdldFZlcnRpY2FsR2x5cGhTdWIyKHVpbnQzMl90IGdseXBobnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiB2Z2x5cGhudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVExvb2t1cCogTG9va3VwKTsKLSAgaW50IEdldENvdmVyYWdlSW5kZXgoVENvdmVyYWdlRm9ybWF0QmFzZSogQ292ZXJhZ2UsIHVpbnQzMl90IGcpIGNvbnN0OwotCi0gIHVpbnQ4X3QgR2V0VUludDgoRlRfQnl0ZXMmIHApIGNvbnN0OwotICBpbnQxNl90IEdldEludDE2KEZUX0J5dGVzJiBwKSBjb25zdDsKLSAgdWludDE2X3QgR2V0VUludDE2KEZUX0J5dGVzJiBwKSBjb25zdDsKLSAgaW50MzJfdCBHZXRJbnQzMihGVF9CeXRlcyYgcCkgY29uc3Q7Ci0gIHVpbnQzMl90IEdldFVJbnQzMihGVF9CeXRlcyYgcCkgY29uc3Q7Ci0KLSAgc3RkOjpzZXQ8dWludDMyX3Q+IG1fZmVhdHVyZVNldDsKLSAgYm9vbCBtX2JGZWF1dHVyZU1hcExvYWQ7Ci0gIGJvb2wgbG9hZGVkOwotICB0dF9nc3ViX2hlYWRlciBoZWFkZXI7Ci0gIFRTY3JpcHRMaXN0IFNjcmlwdExpc3Q7Ci0gIFRGZWF0dXJlTGlzdCBGZWF0dXJlTGlzdDsKLSAgVExvb2t1cExpc3QgTG9va3VwTGlzdDsKLX07Ci0KLSNlbmRpZiAgLy8gQ09SRV9GUERGQVBJX0ZPTlRfVFRHU1VCVEFCTEVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfYWxsc3RhdGVzLmNwcCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfYWxsc3RhdGVzLmNwcAppbmRleCAyODJhNDdmLi5hZmM4N2EyIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2FsbHN0YXRlcy5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9hbGxzdGF0ZXMuY3BwCkBAIC0xMCwxOCArMTAsMTAgQEAKIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW9iamVjdGhvbGRlci5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc3RyZWFtY29udGVudHBhcnNlci5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL3BhZ2VpbnQuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZ3JhcGhzdGF0ZWRhdGEuaCIKLQotbmFtZXNwYWNlIHsKLQotRlhfRkxPQVQgQ2xpcEZsb2F0KEZYX0ZMT0FUIGYpIHsKLSAgcmV0dXJuIHN0ZDo6bWF4KDAuMGYsIHN0ZDo6bWluKDEuMGYsIGYpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgogCiBDUERGX0FsbFN0YXRlczo6Q1BERl9BbGxTdGF0ZXMoKQogICAgIDogbV9UZXh0TGVhZGluZygwKSwgbV9UZXh0UmlzZSgwKSwgbV9UZXh0SG9yelNjYWxlKDEuMGYpIHt9CkBAIC00MCwxNiArMzIsMTQgQEAKICAgbV9UZXh0SG9yelNjYWxlID0gc3JjLm1fVGV4dEhvcnpTY2FsZTsKIH0KIAotdm9pZCBDUERGX0FsbFN0YXRlczo6U2V0TGluZURhc2goQ1BERl9BcnJheSogcEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcGhhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzY2FsZSkgewordm9pZCBDUERGX0FsbFN0YXRlczo6U2V0TGluZURhc2goQ1BERl9BcnJheSogcEFycmF5LCBmbG9hdCBwaGFzZSwgZmxvYXQgc2NhbGUpIHsKICAgbV9HcmFwaFN0YXRlLlNldExpbmVEYXNoKHBBcnJheSwgcGhhc2UsIHNjYWxlKTsKIH0KIAogdm9pZCBDUERGX0FsbFN0YXRlczo6UHJvY2Vzc0V4dEdTKENQREZfRGljdGlvbmFyeSogcEdTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtQ29udGVudFBhcnNlciogcFBhcnNlcikgewogICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogKnBHUykgewotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXlfc3RyID0gaXQuZmlyc3Q7CisgICAgY29uc3QgQnl0ZVN0cmluZyYga2V5X3N0ciA9IGl0LmZpcnN0OwogICAgIENQREZfT2JqZWN0KiBwRWxlbWVudCA9IGl0LnNlY29uZC5nZXQoKTsKICAgICBDUERGX09iamVjdCogcE9iamVjdCA9IHBFbGVtZW50ID8gcEVsZW1lbnQtPkdldERpcmVjdCgpIDogbnVsbHB0cjsKICAgICBpZiAoIXBPYmplY3QpCkBAIC0xMTksMTAgKzEwOSwxMiBAQAogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBGWEJTVFJfSUQoJ0MnLCAnQScsIDAsIDApOgotICAgICAgICBtX0dlbmVyYWxTdGF0ZS5TZXRTdHJva2VBbHBoYShDbGlwRmxvYXQocE9iamVjdC0+R2V0TnVtYmVyKCkpKTsKKyAgICAgICAgbV9HZW5lcmFsU3RhdGUuU2V0U3Ryb2tlQWxwaGEoCisgICAgICAgICAgICBwZGZpdW06OmNsYW1wKHBPYmplY3QtPkdldE51bWJlcigpLCAwLjBmLCAxLjBmKSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBGWEJTVFJfSUQoJ2MnLCAnYScsIDAsIDApOgotICAgICAgICBtX0dlbmVyYWxTdGF0ZS5TZXRGaWxsQWxwaGEoQ2xpcEZsb2F0KHBPYmplY3QtPkdldE51bWJlcigpKSk7CisgICAgICAgIG1fR2VuZXJhbFN0YXRlLlNldEZpbGxBbHBoYSgKKyAgICAgICAgICAgIHBkZml1bTo6Y2xhbXAocE9iamVjdC0+R2V0TnVtYmVyKCksIDAuMGYsIDEuMGYpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIEZYQlNUUl9JRCgnTycsICdQJywgMCwgMCk6CiAgICAgICAgIG1fR2VuZXJhbFN0YXRlLlNldFN0cm9rZU9QKCEhcE9iamVjdC0+R2V0SW50ZWdlcigpKTsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfYWxsc3RhdGVzLmggYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2FsbHN0YXRlcy5oCmluZGV4IGRhZDFiODUuLjczMDAwM2EgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfYWxsc3RhdGVzLmgKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9hbGxzdGF0ZXMuaApAQCAtMjIsMTYgKzIyLDE2IEBACiAKICAgdm9pZCBDb3B5KGNvbnN0IENQREZfQWxsU3RhdGVzJiBzcmMpOwogICB2b2lkIFByb2Nlc3NFeHRHUyhDUERGX0RpY3Rpb25hcnkqIHBHUywgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyKiBwUGFyc2VyKTsKLSAgdm9pZCBTZXRMaW5lRGFzaChDUERGX0FycmF5KiwgRlhfRkxPQVQsIEZYX0ZMT0FUIHNjYWxlKTsKKyAgdm9pZCBTZXRMaW5lRGFzaChDUERGX0FycmF5KiwgZmxvYXQsIGZsb2F0IHNjYWxlKTsKIAogICBDRlhfTWF0cml4IG1fVGV4dE1hdHJpeDsKICAgQ0ZYX01hdHJpeCBtX0NUTTsKICAgQ0ZYX01hdHJpeCBtX1BhcmVudE1hdHJpeDsKICAgQ0ZYX1BvaW50RiBtX1RleHRQb3M7CiAgIENGWF9Qb2ludEYgbV9UZXh0TGluZVBvczsKLSAgRlhfRkxPQVQgbV9UZXh0TGVhZGluZzsKLSAgRlhfRkxPQVQgbV9UZXh0UmlzZTsKLSAgRlhfRkxPQVQgbV9UZXh0SG9yelNjYWxlOworICBmbG9hdCBtX1RleHRMZWFkaW5nOworICBmbG9hdCBtX1RleHRSaXNlOworICBmbG9hdCBtX1RleHRIb3J6U2NhbGU7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9QQUdFX0NQREZfQUxMU1RBVEVTX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NsaXBwYXRoLmNwcCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY2xpcHBhdGguY3BwCmluZGV4IDcxNGI1NmIuLjQ2NWEyZDMgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY2xpcHBhdGguY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY2xpcHBhdGguY3BwCkBAIC0xMCw3ICsxMCw2IEBACiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhdGguaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3RleHRvYmplY3QuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCiAKICNkZWZpbmUgRlBERl9DTElQUEFUSF9NQVhfVEVYVFMgMTAyNAogCkBAIC0yMCw4ICsxOSw4IEBACiAKIENQREZfQ2xpcFBhdGg6On5DUERGX0NsaXBQYXRoKCkge30KIAotdWludDMyX3QgQ1BERl9DbGlwUGF0aDo6R2V0UGF0aENvdW50KCkgY29uc3QgewotICByZXR1cm4gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTx1aW50MzJfdD4obV9SZWYuR2V0T2JqZWN0KCktPm1fUGF0aEFuZFR5cGVMaXN0KTsKK3NpemVfdCBDUERGX0NsaXBQYXRoOjpHZXRQYXRoQ291bnQoKSBjb25zdCB7CisgIHJldHVybiBtX1JlZi5HZXRPYmplY3QoKS0+bV9QYXRoQW5kVHlwZUxpc3Quc2l6ZSgpOwogfQogCiBDUERGX1BhdGggQ1BERl9DbGlwUGF0aDo6R2V0UGF0aChzaXplX3QgaSkgY29uc3QgewpAQCAtMzIsOCArMzEsOCBAQAogICByZXR1cm4gbV9SZWYuR2V0T2JqZWN0KCktPm1fUGF0aEFuZFR5cGVMaXN0W2ldLnNlY29uZDsKIH0KIAotdWludDMyX3QgQ1BERl9DbGlwUGF0aDo6R2V0VGV4dENvdW50KCkgY29uc3QgewotICByZXR1cm4gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTx1aW50MzJfdD4obV9SZWYuR2V0T2JqZWN0KCktPm1fVGV4dExpc3QpOworc2l6ZV90IENQREZfQ2xpcFBhdGg6OkdldFRleHRDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fUmVmLkdldE9iamVjdCgpLT5tX1RleHRMaXN0LnNpemUoKTsKIH0KIAogQ1BERl9UZXh0T2JqZWN0KiBDUERGX0NsaXBQYXRoOjpHZXRUZXh0KHNpemVfdCBpKSBjb25zdCB7CkBAIC00MywzNiArNDIsMzMgQEAKIENGWF9GbG9hdFJlY3QgQ1BERl9DbGlwUGF0aDo6R2V0Q2xpcEJveCgpIGNvbnN0IHsKICAgQ0ZYX0Zsb2F0UmVjdCByZWN0OwogICBib29sIGJTdGFydGVkID0gZmFsc2U7Ci0gIGludCBjb3VudCA9IEdldFBhdGhDb3VudCgpOwotICBpZiAoY291bnQpIHsKKyAgaWYgKEdldFBhdGhDb3VudCgpID4gMCkgewogICAgIHJlY3QgPSBHZXRQYXRoKDApLkdldEJvdW5kaW5nQm94KCk7Ci0gICAgZm9yIChpbnQgaSA9IDE7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBHZXRQYXRoQ291bnQoKTsgKytpKSB7CiAgICAgICBDRlhfRmxvYXRSZWN0IHBhdGhfcmVjdCA9IEdldFBhdGgoaSkuR2V0Qm91bmRpbmdCb3goKTsKICAgICAgIHJlY3QuSW50ZXJzZWN0KHBhdGhfcmVjdCk7CiAgICAgfQogICAgIGJTdGFydGVkID0gdHJ1ZTsKICAgfQotICBjb3VudCA9IEdldFRleHRDb3VudCgpOwotICBpZiAoY291bnQpIHsKLSAgICBDRlhfRmxvYXRSZWN0IGxheWVyX3JlY3Q7Ci0gICAgYm9vbCBiTGF5ZXJTdGFydGVkID0gZmFsc2U7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqID0gR2V0VGV4dChpKTsKLSAgICAgIGlmICghcFRleHRPYmopIHsKLSAgICAgICAgaWYgKCFiU3RhcnRlZCkgewotICAgICAgICAgIHJlY3QgPSBsYXllcl9yZWN0OwotICAgICAgICAgIGJTdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZWN0LkludGVyc2VjdChsYXllcl9yZWN0KTsKLSAgICAgICAgfQotICAgICAgICBiTGF5ZXJTdGFydGVkID0gZmFsc2U7CisKKyAgQ0ZYX0Zsb2F0UmVjdCBsYXllcl9yZWN0OworICBib29sIGJMYXllclN0YXJ0ZWQgPSBmYWxzZTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBHZXRUZXh0Q291bnQoKTsgKytpKSB7CisgICAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiA9IEdldFRleHQoaSk7CisgICAgaWYgKCFwVGV4dE9iaikgeworICAgICAgaWYgKCFiU3RhcnRlZCkgeworICAgICAgICByZWN0ID0gbGF5ZXJfcmVjdDsKKyAgICAgICAgYlN0YXJ0ZWQgPSB0cnVlOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFiTGF5ZXJTdGFydGVkKSB7Ci0gICAgICAgICAgbGF5ZXJfcmVjdCA9IENGWF9GbG9hdFJlY3QocFRleHRPYmotPkdldEJCb3gobnVsbHB0cikpOwotICAgICAgICAgIGJMYXllclN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGxheWVyX3JlY3QuVW5pb24oQ0ZYX0Zsb2F0UmVjdChwVGV4dE9iai0+R2V0QkJveChudWxscHRyKSkpOwotICAgICAgICB9CisgICAgICAgIHJlY3QuSW50ZXJzZWN0KGxheWVyX3JlY3QpOworICAgICAgfQorICAgICAgYkxheWVyU3RhcnRlZCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIWJMYXllclN0YXJ0ZWQpIHsKKyAgICAgICAgbGF5ZXJfcmVjdCA9IENGWF9GbG9hdFJlY3QocFRleHRPYmotPkdldEJCb3gobnVsbHB0cikpOworICAgICAgICBiTGF5ZXJTdGFydGVkID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGxheWVyX3JlY3QuVW5pb24oQ0ZYX0Zsb2F0UmVjdChwVGV4dE9iai0+R2V0QkJveChudWxscHRyKSkpOwogICAgICAgfQogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jbGlwcGF0aC5oIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jbGlwcGF0aC5oCmluZGV4IGRkNDRjYjIuLjkxYTI1Y2QgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY2xpcHBhdGguaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NsaXBwYXRoLmgKQEAgLTEyLDkgKzEyLDggQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhdGguaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9zaGFyZWRfY29weV9vbl93cml0ZS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9zaGFyZWRfY29weV9vbl93cml0ZS5oIgogCiBjbGFzcyBDUERGX1BhdGg7CiBjbGFzcyBDUERGX1RleHRPYmplY3Q7CkBAIC0yOCwxNiArMjcsMTYgQEAKICAgdm9pZCBFbXBsYWNlKCkgeyBtX1JlZi5FbXBsYWNlKCk7IH0KICAgdm9pZCBTZXROdWxsKCkgeyBtX1JlZi5TZXROdWxsKCk7IH0KIAotICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gISFtX1JlZjsgfQorICBib29sIEhhc1JlZigpIGNvbnN0IHsgcmV0dXJuICEhbV9SZWY7IH0KICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENQREZfQ2xpcFBhdGgmIHRoYXQpIGNvbnN0IHsKICAgICByZXR1cm4gbV9SZWYgPT0gdGhhdC5tX1JlZjsKICAgfQogICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ1BERl9DbGlwUGF0aCYgdGhhdCkgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSB0aGF0KTsgfQogCi0gIHVpbnQzMl90IEdldFBhdGhDb3VudCgpIGNvbnN0OworICBzaXplX3QgR2V0UGF0aENvdW50KCkgY29uc3Q7CiAgIENQREZfUGF0aCBHZXRQYXRoKHNpemVfdCBpKSBjb25zdDsKICAgdWludDhfdCBHZXRDbGlwVHlwZShzaXplX3QgaSkgY29uc3Q7Ci0gIHVpbnQzMl90IEdldFRleHRDb3VudCgpIGNvbnN0OworICBzaXplX3QgR2V0VGV4dENvdW50KCkgY29uc3Q7CiAgIENQREZfVGV4dE9iamVjdCogR2V0VGV4dChzaXplX3QgaSkgY29uc3Q7CiAgIENGWF9GbG9hdFJlY3QgR2V0Q2xpcEJveCgpIGNvbnN0OwogICB2b2lkIEFwcGVuZFBhdGgoQ1BERl9QYXRoIHBhdGgsIHVpbnQ4X3QgdHlwZSwgYm9vbCBiQXV0b01lcmdlKTsKQEAgLTQ1LDE5ICs0NCwxOSBAQAogICB2b2lkIFRyYW5zZm9ybShjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpOwogCiAgcHJpdmF0ZToKLSAgY2xhc3MgUGF0aERhdGEgeworICBjbGFzcyBQYXRoRGF0YSA6IHB1YmxpYyBSZXRhaW5hYmxlIHsKICAgIHB1YmxpYzoKICAgICB1c2luZyBQYXRoQW5kVHlwZURhdGEgPSBzdGQ6OnBhaXI8Q1BERl9QYXRoLCB1aW50OF90PjsKIAogICAgIFBhdGhEYXRhKCk7CiAgICAgUGF0aERhdGEoY29uc3QgUGF0aERhdGEmIHRoYXQpOwotICAgIH5QYXRoRGF0YSgpOworICAgIH5QYXRoRGF0YSgpIG92ZXJyaWRlOwogCiAgICAgc3RkOjp2ZWN0b3I8UGF0aEFuZFR5cGVEYXRhPiBtX1BhdGhBbmRUeXBlTGlzdDsKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9UZXh0T2JqZWN0Pj4gbV9UZXh0TGlzdDsKICAgfTsKIAotICBDRlhfU2hhcmVkQ29weU9uV3JpdGU8UGF0aERhdGE+IG1fUmVmOworICBTaGFyZWRDb3B5T25Xcml0ZTxQYXRoRGF0YT4gbV9SZWY7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9QQUdFX0NQREZfQ0xJUFBBVEhfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29sb3IuY3BwIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb2xvci5jcHAKaW5kZXggNGJhMjhjZS4uZDM2NGU4ZSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb2xvci5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb2xvci5jcHAKQEAgLTcsMTIgKzcsMTEgQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbG9yLmgiCiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2RvY3BhZ2VkYXRhLmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvcGFnZWludC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudC5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCiAKLUNQREZfQ29sb3I6OkNQREZfQ29sb3IoKSA6IG1fcENTKG51bGxwdHIpLCBtX3BCdWZmZXIobnVsbHB0cikge30KK0NQREZfQ29sb3I6OkNQREZfQ29sb3IoKSB7fQogCiBDUERGX0NvbG9yOjp+Q1BERl9Db2xvcigpIHsKICAgUmVsZWFzZUJ1ZmZlcigpOwpAQCAtMjAsMTggKzE5LDE4IEBACiB9CiAKIGJvb2wgQ1BERl9Db2xvcjo6SXNQYXR0ZXJuKCkgY29uc3QgewotICByZXR1cm4gbV9wQ1MgJiYgbV9wQ1MtPkdldEZhbWlseSgpID09IFBERkNTX1BBVFRFUk47CisgIHJldHVybiBtX3BDUyAmJiBJc1BhdHRlcm5JbnRlcm5hbCgpOwogfQogCiB2b2lkIENQREZfQ29sb3I6OlJlbGVhc2VCdWZmZXIoKSB7CiAgIGlmICghbV9wQnVmZmVyKQogICAgIHJldHVybjsKIAotICBpZiAobV9wQ1MtPkdldEZhbWlseSgpID09IFBERkNTX1BBVFRFUk4pIHsKLSAgICBQYXR0ZXJuVmFsdWUqIHB2YWx1ZSA9IChQYXR0ZXJuVmFsdWUqKW1fcEJ1ZmZlcjsKKyAgaWYgKElzUGF0dGVybkludGVybmFsKCkpIHsKKyAgICBQYXR0ZXJuVmFsdWUqIHB2YWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGF0dGVyblZhbHVlKj4obV9wQnVmZmVyKTsKICAgICBDUERGX1BhdHRlcm4qIHBQYXR0ZXJuID0KICAgICAgICAgcHZhbHVlLT5tX3BDb3VudGVkUGF0dGVybiA/IHB2YWx1ZS0+bV9wQ291bnRlZFBhdHRlcm4tPmdldCgpIDogbnVsbHB0cjsKLSAgICBpZiAocFBhdHRlcm4gJiYgcFBhdHRlcm4tPmRvY3VtZW50KCkpIHsKKyAgICBpZiAocFBhdHRlcm4pIHsKICAgICAgIENQREZfRG9jUGFnZURhdGEqIHBQYWdlRGF0YSA9IHBQYXR0ZXJuLT5kb2N1bWVudCgpLT5HZXRQYWdlRGF0YSgpOwogICAgICAgaWYgKHBQYWdlRGF0YSkKICAgICAgICAgcFBhZ2VEYXRhLT5SZWxlYXNlUGF0dGVybihwUGF0dGVybi0+cGF0dGVybl9vYmooKSk7CkBAIC00MiwxMCArNDEsMjIgQEAKIH0KIAogdm9pZCBDUERGX0NvbG9yOjpSZWxlYXNlQ29sb3JTcGFjZSgpIHsKLSAgaWYgKG1fcENTICYmIG1fcENTLT5tX3BEb2N1bWVudCkgewotICAgIG1fcENTLT5tX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+UmVsZWFzZUNvbG9yU3BhY2UobV9wQ1MtPkdldEFycmF5KCkpOwotICAgIG1fcENTID0gbnVsbHB0cjsKLSAgfQorICBpZiAoIW1fcENTKQorICAgIHJldHVybjsKKworICBDUERGX0RvY3VtZW50KiBwRG9jID0gbV9wQ1MtPkdldERvY3VtZW50KCk7CisgIGlmICghcERvYykKKyAgICByZXR1cm47CisKKyAgYXV0byogcFBhZ2VEYXRhID0gcERvYy0+R2V0UGFnZURhdGEoKTsKKyAgaWYgKHBQYWdlRGF0YSkKKyAgICBwUGFnZURhdGEtPlJlbGVhc2VDb2xvclNwYWNlKG1fcENTLT5HZXRBcnJheSgpKTsKKworICBtX3BDUyA9IG51bGxwdHI7Cit9CisKK2Jvb2wgQ1BERl9Db2xvcjo6SXNQYXR0ZXJuSW50ZXJuYWwoKSBjb25zdCB7CisgIHJldHVybiBtX3BDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfUEFUVEVSTjsKIH0KIAogdm9pZCBDUERGX0NvbG9yOjpTZXRDb2xvclNwYWNlKENQREZfQ29sb3JTcGFjZSogcENTKSB7CkBAIC02MSwyMSArNzIsMjMgQEAKICAgUmVsZWFzZUNvbG9yU3BhY2UoKTsKIAogICBtX3BDUyA9IHBDUzsKLSAgaWYgKG1fcENTKSB7CisgIGlmIChwQ1MpIHsKICAgICBtX3BCdWZmZXIgPSBwQ1MtPkNyZWF0ZUJ1ZigpOwogICAgIHBDUy0+R2V0RGVmYXVsdENvbG9yKG1fcEJ1ZmZlcik7CiAgIH0KIH0KIAotdm9pZCBDUERGX0NvbG9yOjpTZXRWYWx1ZShGWF9GTE9BVCogY29tcHMpIHsKK3ZvaWQgQ1BERl9Db2xvcjo6U2V0VmFsdWUoY29uc3QgZmxvYXQqIGNvbXBzKSB7CiAgIGlmICghbV9wQnVmZmVyKQogICAgIHJldHVybjsKLSAgaWYgKG1fcENTLT5HZXRGYW1pbHkoKSAhPSBQREZDU19QQVRURVJOKQotICAgIEZYU1lTX21lbWNweShtX3BCdWZmZXIsIGNvbXBzLCBtX3BDUy0+Q291bnRDb21wb25lbnRzKCkgKiBzaXplb2YoRlhfRkxPQVQpKTsKKyAgaWYgKCFJc1BhdHRlcm5JbnRlcm5hbCgpKQorICAgIG1lbWNweShtX3BCdWZmZXIsIGNvbXBzLCBtX3BDUy0+Q291bnRDb21wb25lbnRzKCkgKiBzaXplb2YoZmxvYXQpKTsKIH0KIAotdm9pZCBDUERGX0NvbG9yOjpTZXRWYWx1ZShDUERGX1BhdHRlcm4qIHBQYXR0ZXJuLCBGWF9GTE9BVCogY29tcHMsIGludCBuY29tcHMpIHsKLSAgaWYgKG5jb21wcyA+IE1BWF9QQVRURVJOX0NPTE9SQ09NUFMpCit2b2lkIENQREZfQ29sb3I6OlNldFZhbHVlKENQREZfUGF0dGVybiogcFBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBjb21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbmNvbXBzKSB7CisgIGlmIChuY29tcHMgPiBrTWF4UGF0dGVybkNvbG9yQ29tcHMpCiAgICAgcmV0dXJuOwogCiAgIGlmICghSXNQYXR0ZXJuKCkpIHsKQEAgLTg1LDE5ICs5OCwxOCBAQAogICB9CiAKICAgQ1BERl9Eb2NQYWdlRGF0YSogcERvY1BhZ2VEYXRhID0gbnVsbHB0cjsKLSAgUGF0dGVyblZhbHVlKiBwdmFsdWUgPSAoUGF0dGVyblZhbHVlKiltX3BCdWZmZXI7Ci0gIGlmIChwdmFsdWUtPm1fcFBhdHRlcm4gJiYgcHZhbHVlLT5tX3BQYXR0ZXJuLT5kb2N1bWVudCgpKSB7CisgIFBhdHRlcm5WYWx1ZSogcHZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxQYXR0ZXJuVmFsdWUqPihtX3BCdWZmZXIpOworICBpZiAocHZhbHVlLT5tX3BQYXR0ZXJuKSB7CiAgICAgcERvY1BhZ2VEYXRhID0gcHZhbHVlLT5tX3BQYXR0ZXJuLT5kb2N1bWVudCgpLT5HZXRQYWdlRGF0YSgpOwotICAgIGlmIChwRG9jUGFnZURhdGEpCi0gICAgICBwRG9jUGFnZURhdGEtPlJlbGVhc2VQYXR0ZXJuKHB2YWx1ZS0+bV9wUGF0dGVybi0+cGF0dGVybl9vYmooKSk7CisgICAgcERvY1BhZ2VEYXRhLT5SZWxlYXNlUGF0dGVybihwdmFsdWUtPm1fcFBhdHRlcm4tPnBhdHRlcm5fb2JqKCkpOwogICB9CiAgIHB2YWx1ZS0+bV9uQ29tcHMgPSBuY29tcHM7CiAgIHB2YWx1ZS0+bV9wUGF0dGVybiA9IHBQYXR0ZXJuOwogICBpZiAobmNvbXBzKQotICAgIEZYU1lTX21lbWNweShwdmFsdWUtPm1fQ29tcHMsIGNvbXBzLCBuY29tcHMgKiBzaXplb2YoRlhfRkxPQVQpKTsKKyAgICBtZW1jcHkocHZhbHVlLT5tX0NvbXBzLCBjb21wcywgbmNvbXBzICogc2l6ZW9mKGZsb2F0KSk7CiAKICAgcHZhbHVlLT5tX3BDb3VudGVkUGF0dGVybiA9IG51bGxwdHI7Ci0gIGlmIChwUGF0dGVybiAmJiBwUGF0dGVybi0+ZG9jdW1lbnQoKSkgeworICBpZiAocFBhdHRlcm4pIHsKICAgICBpZiAoIXBEb2NQYWdlRGF0YSkKICAgICAgIHBEb2NQYWdlRGF0YSA9IHBQYXR0ZXJuLT5kb2N1bWVudCgpLT5HZXRQYWdlRGF0YSgpOwogCkBAIC0xMDksNDcgKzEyMSw1MSBAQAogdm9pZCBDUERGX0NvbG9yOjpDb3B5KGNvbnN0IENQREZfQ29sb3IqIHBTcmMpIHsKICAgUmVsZWFzZUJ1ZmZlcigpOwogICBSZWxlYXNlQ29sb3JTcGFjZSgpOwotCiAgIG1fcENTID0gcFNyYy0+bV9wQ1M7Ci0gIGlmIChtX3BDUyAmJiBtX3BDUy0+bV9wRG9jdW1lbnQpIHsKLSAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBtX3BDUy0+R2V0QXJyYXkoKTsKLSAgICBpZiAocEFycmF5KQotICAgICAgbV9wQ1MgPSBtX3BDUy0+bV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPkdldENvcGllZENvbG9yU3BhY2UocEFycmF5KTsKLSAgfQogICBpZiAoIW1fcENTKQogICAgIHJldHVybjsKIAorICBDUERGX0RvY3VtZW50KiBwRG9jID0gbV9wQ1MtPkdldERvY3VtZW50KCk7CisgIENQREZfQXJyYXkqIHBBcnJheSA9IG1fcENTLT5HZXRBcnJheSgpOworICBpZiAocERvYyAmJiBwQXJyYXkpIHsKKyAgICBtX3BDUyA9IHBEb2MtPkdldFBhZ2VEYXRhKCktPkdldENvcGllZENvbG9yU3BhY2UocEFycmF5KTsKKyAgICBpZiAoIW1fcENTKQorICAgICAgcmV0dXJuOworICB9CiAgIG1fcEJ1ZmZlciA9IG1fcENTLT5DcmVhdGVCdWYoKTsKLSAgRlhTWVNfbWVtY3B5KG1fcEJ1ZmZlciwgcFNyYy0+bV9wQnVmZmVyLCBtX3BDUy0+R2V0QnVmU2l6ZSgpKTsKLSAgaWYgKG1fcENTLT5HZXRGYW1pbHkoKSAhPSBQREZDU19QQVRURVJOKQorICBtZW1jcHkobV9wQnVmZmVyLCBwU3JjLT5tX3BCdWZmZXIsIG1fcENTLT5HZXRCdWZTaXplKCkpOworICBpZiAoIUlzUGF0dGVybkludGVybmFsKCkpCiAgICAgcmV0dXJuOwogCiAgIFBhdHRlcm5WYWx1ZSogcFZhbHVlID0gcmVpbnRlcnByZXRfY2FzdDxQYXR0ZXJuVmFsdWUqPihtX3BCdWZmZXIpOwogICBDUERGX1BhdHRlcm4qIHBQYXR0ZXJuID0gcFZhbHVlLT5tX3BQYXR0ZXJuOwotICBpZiAocFBhdHRlcm4gJiYgcFBhdHRlcm4tPmRvY3VtZW50KCkpIHsKLSAgICBwVmFsdWUtPm1fcFBhdHRlcm4gPSBwUGF0dGVybi0+ZG9jdW1lbnQoKS0+R2V0UGFnZURhdGEoKS0+R2V0UGF0dGVybigKLSAgICAgICAgcFBhdHRlcm4tPnBhdHRlcm5fb2JqKCksIGZhbHNlLCBwUGF0dGVybi0+cGFyZW50X21hdHJpeCgpKTsKLSAgfQorICBpZiAoIXBQYXR0ZXJuKQorICAgIHJldHVybjsKKworICBwVmFsdWUtPm1fcFBhdHRlcm4gPSBwUGF0dGVybi0+ZG9jdW1lbnQoKS0+R2V0UGFnZURhdGEoKS0+R2V0UGF0dGVybigKKyAgICAgIHBQYXR0ZXJuLT5wYXR0ZXJuX29iaigpLCBmYWxzZSwgcFBhdHRlcm4tPnBhcmVudF9tYXRyaXgoKSk7CiB9CiAKLWJvb2wgQ1BERl9Db2xvcjo6R2V0UkdCKGludCYgUiwgaW50JiBHLCBpbnQmIEIpIGNvbnN0IHsKK2Jvb2wgQ1BERl9Db2xvcjo6R2V0UkdCKGludCogUiwgaW50KiBHLCBpbnQqIEIpIGNvbnN0IHsKICAgaWYgKCFtX3BDUyB8fCAhbV9wQnVmZmVyKQogICAgIHJldHVybiBmYWxzZTsKIAotICBGWF9GTE9BVCByID0gMC4wZiwgZyA9IDAuMGYsIGIgPSAwLjBmOwotICBpZiAoIW1fcENTLT5HZXRSR0IobV9wQnVmZmVyLCByLCBnLCBiKSkKKyAgZmxvYXQgciA9IDAuMGY7CisgIGZsb2F0IGcgPSAwLjBmOworICBmbG9hdCBiID0gMC4wZjsKKyAgaWYgKCFtX3BDUy0+R2V0UkdCKG1fcEJ1ZmZlciwgJnIsICZnLCAmYikpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIFIgPSAoaW50MzJfdCkociAqIDI1NSArIDAuNWYpOwotICBHID0gKGludDMyX3QpKGcgKiAyNTUgKyAwLjVmKTsKLSAgQiA9IChpbnQzMl90KShiICogMjU1ICsgMC41Zik7CisgICpSID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4ociAqIDI1NSArIDAuNWYpOworICAqRyA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGcgKiAyNTUgKyAwLjVmKTsKKyAgKkIgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihiICogMjU1ICsgMC41Zik7CiAgIHJldHVybiB0cnVlOwogfQogCiBDUERGX1BhdHRlcm4qIENQREZfQ29sb3I6OkdldFBhdHRlcm4oKSBjb25zdCB7Ci0gIGlmICghbV9wQnVmZmVyIHx8IG1fcENTLT5HZXRGYW1pbHkoKSAhPSBQREZDU19QQVRURVJOKQorICBpZiAoIW1fcEJ1ZmZlciB8fCAhSXNQYXR0ZXJuSW50ZXJuYWwoKSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAotICBQYXR0ZXJuVmFsdWUqIHB2YWx1ZSA9IChQYXR0ZXJuVmFsdWUqKW1fcEJ1ZmZlcjsKKyAgUGF0dGVyblZhbHVlKiBwdmFsdWUgPSByZWludGVycHJldF9jYXN0PFBhdHRlcm5WYWx1ZSo+KG1fcEJ1ZmZlcik7CiAgIHJldHVybiBwdmFsdWUtPm1fcFBhdHRlcm47CiB9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbG9yLmggYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbG9yLmgKaW5kZXggZTgxYjUzMS4uMmVhYzdjZiAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb2xvci5oCisrKyBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29sb3IuaApAQCAtMjMsMTkgKzIzLDIzIEBACiAgIHZvaWQgQ29weShjb25zdCBDUERGX0NvbG9yKiBwU3JjKTsKIAogICB2b2lkIFNldENvbG9yU3BhY2UoQ1BERl9Db2xvclNwYWNlKiBwQ1MpOwotICB2b2lkIFNldFZhbHVlKEZYX0ZMT0FUKiBjb21wKTsKLSAgdm9pZCBTZXRWYWx1ZShDUERGX1BhdHRlcm4qIHBQYXR0ZXJuLCBGWF9GTE9BVCogY29tcCwgaW50IG5jb21wcyk7CisgIHZvaWQgU2V0VmFsdWUoY29uc3QgZmxvYXQqIGNvbXApOworICB2b2lkIFNldFZhbHVlKENQREZfUGF0dGVybiogcFBhdHRlcm4sIGNvbnN0IGZsb2F0KiBjb21wLCB1aW50MzJfdCBuY29tcHMpOwogCi0gIGJvb2wgR2V0UkdCKGludCYgUiwgaW50JiBHLCBpbnQmIEIpIGNvbnN0OworICBib29sIEdldFJHQihpbnQqIFIsIGludCogRywgaW50KiBCKSBjb25zdDsKICAgQ1BERl9QYXR0ZXJuKiBHZXRQYXR0ZXJuKCkgY29uc3Q7CiAgIGNvbnN0IENQREZfQ29sb3JTcGFjZSogR2V0Q29sb3JTcGFjZSgpIGNvbnN0IHsgcmV0dXJuIG1fcENTOyB9CiAKICBwcm90ZWN0ZWQ6CiAgIHZvaWQgUmVsZWFzZUJ1ZmZlcigpOwogICB2b2lkIFJlbGVhc2VDb2xvclNwYWNlKCk7CisgIGJvb2wgSXNQYXR0ZXJuSW50ZXJuYWwoKSBjb25zdDsKIAotICBDUERGX0NvbG9yU3BhY2UqIG1fcENTOwotICBGWF9GTE9BVCogbV9wQnVmZmVyOworICAvLyBUT0RPKHRoZXN0aWcpOiBDb252ZXJ0IHRoaXMgdG8gYSBzbWFydCBwb2ludGVyIG9yIHZlY3Rvci4KKyAgLy8gfG1fcEJ1ZmZlcnwgaXMgY3JlYXRlZCBieSB8bV9wQ1N8LCBzbyBpZiBpdCBpcyBub24tbnVsbCwgdGhlbiBzbyBpcworICAvLyB8bV9wQ1N8LgorICBmbG9hdCogbV9wQnVmZmVyID0gbnVsbHB0cjsKKyAgQ1BERl9Db2xvclNwYWNlKiBtX3BDUyA9IG51bGxwdHI7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9QQUdFX0NQREZfQ09MT1JfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29sb3JzcGFjZS5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbG9yc3BhY2UuY3BwCmluZGV4IDZjZDAwNzUuLmZkZTBlZDQgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29sb3JzcGFjZS5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb2xvcnNwYWNlLmNwcApAQCAtNiwxMiArNiwyMCBAQAogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb2xvcnNwYWNlLmgiCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bGltaXRzPgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9jcGRmX21vZHVsZW1nci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZGV2aWNlY3MuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2RvY3BhZ2VkYXRhLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfaWNjcHJvZmlsZS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW1vZHVsZS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0dGVybi5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0dGVybmNzLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaCIKQEAgLTIwLDkgKzI4LDEzIEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW1fYWNjLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2FjdGlvbi5oIgorI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfaWNjbW9kdWxlLmgiCiAjaW5jbHVkZSAiY29yZS9meGNvZGVjL2Z4X2NvZGVjLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfbWF5YmVfb3duZWQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9maXhlZGJ1Zmdyb3cuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvbWF5YmVfb3duZWQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCiAKIG5hbWVzcGFjZSB7CiAKQEAgLTYyLDU3ICs3NCw0OCBAQAogY2xhc3MgQ1BERl9DYWxHcmF5IDogcHVibGljIENQREZfQ29sb3JTcGFjZSB7CiAgcHVibGljOgogICBleHBsaWNpdCBDUERGX0NhbEdyYXkoQ1BERl9Eb2N1bWVudCogcERvYyk7CisgIH5DUERGX0NhbEdyYXkoKSBvdmVycmlkZSB7fQogCi0gIGJvb2wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7Ci0KLSAgYm9vbCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAotICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKLSAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOwotICBib29sIFNldFJHQihGWF9GTE9BVCogcEJ1ZiwKLSAgICAgICAgICAgICAgRlhfRkxPQVQgUiwKLSAgICAgICAgICAgICAgRlhfRkxPQVQgRywKLSAgICAgICAgICAgICAgRlhfRkxPQVQgQikgY29uc3Qgb3ZlcnJpZGU7Ci0KKyAgLy8gQ1BERl9Db2xvclNwYWNlOgorICB1aW50MzJfdCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PENQREZfT2JqZWN0Kj4qIHBWaXNpdGVkKSBvdmVycmlkZTsKKyAgYm9vbCBHZXRSR0IoZmxvYXQqIHBCdWYsIGZsb2F0KiBSLCBmbG9hdCogRywgZmxvYXQqIEIpIGNvbnN0IG92ZXJyaWRlOwogICB2b2lkIFRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFNyY0J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJUcmFuc01hc2sgPSBmYWxzZSkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRyYW5zTWFzaykgY29uc3Qgb3ZlcnJpZGU7CiAKICBwcml2YXRlOgotICBGWF9GTE9BVCBtX1doaXRlUG9pbnRbM107Ci0gIEZYX0ZMT0FUIG1fQmxhY2tQb2ludFszXTsKLSAgRlhfRkxPQVQgbV9HYW1tYTsKKyAgZmxvYXQgbV9XaGl0ZVBvaW50WzNdOworICBmbG9hdCBtX0JsYWNrUG9pbnRbM107CisgIGZsb2F0IG1fR2FtbWE7CiB9OwogCiBjbGFzcyBDUERGX0NhbFJHQiA6IHB1YmxpYyBDUERGX0NvbG9yU3BhY2UgewogIHB1YmxpYzoKICAgZXhwbGljaXQgQ1BERl9DYWxSR0IoQ1BERl9Eb2N1bWVudCogcERvYyk7CisgIH5DUERGX0NhbFJHQigpIG92ZXJyaWRlIHt9CiAKLSAgYm9vbCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKKyAgdWludDMyX3Qgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXksCisgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxDUERGX09iamVjdCo+KiBwVmlzaXRlZCkgb3ZlcnJpZGU7CiAKLSAgYm9vbCBHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAotICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKLSAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpIGNvbnN0IG92ZXJyaWRlOwotICBib29sIFNldFJHQihGWF9GTE9BVCogcEJ1ZiwKLSAgICAgICAgICAgICAgRlhfRkxPQVQgUiwKLSAgICAgICAgICAgICAgRlhfRkxPQVQgRywKLSAgICAgICAgICAgICAgRlhfRkxPQVQgQikgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgR2V0UkdCKGZsb2F0KiBwQnVmLCBmbG9hdCogUiwgZmxvYXQqIEcsIGZsb2F0KiBCKSBjb25zdCBvdmVycmlkZTsKIAogICB2b2lkIFRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFNyY0J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJUcmFuc01hc2sgPSBmYWxzZSkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRyYW5zTWFzaykgY29uc3Qgb3ZlcnJpZGU7CiAKLSAgRlhfRkxPQVQgbV9XaGl0ZVBvaW50WzNdOwotICBGWF9GTE9BVCBtX0JsYWNrUG9pbnRbM107Ci0gIEZYX0ZMT0FUIG1fR2FtbWFbM107Ci0gIEZYX0ZMT0FUIG1fTWF0cml4WzldOworICBmbG9hdCBtX1doaXRlUG9pbnRbM107CisgIGZsb2F0IG1fQmxhY2tQb2ludFszXTsKKyAgZmxvYXQgbV9HYW1tYVszXTsKKyAgZmxvYXQgbV9NYXRyaXhbOV07CiAgIGJvb2wgbV9iR2FtbWE7CiAgIGJvb2wgbV9iTWF0cml4OwogfTsKQEAgLTEyMCwzMiArMTIzLDI4IEBACiBjbGFzcyBDUERGX0xhYkNTIDogcHVibGljIENQREZfQ29sb3JTcGFjZSB7CiAgcHVibGljOgogICBleHBsaWNpdCBDUERGX0xhYkNTKENQREZfRG9jdW1lbnQqIHBEb2MpOworICB+Q1BERl9MYWJDUygpIG92ZXJyaWRlIHt9CiAKLSAgYm9vbCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSBvdmVycmlkZTsKKyAgdWludDMyX3Qgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXksCisgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxDUERGX09iamVjdCo+KiBwVmlzaXRlZCkgb3ZlcnJpZGU7CiAKICAgdm9pZCBHZXREZWZhdWx0VmFsdWUoaW50IGlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIG1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIG1heCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGJvb2wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAotICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKLSAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKLSAgYm9vbCBTZXRSR0IoRlhfRkxPQVQqIHBCdWYsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUIFIsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUIEcsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUIEIpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBtaW4sCisgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBtYXgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIEdldFJHQihmbG9hdCogcEJ1ZiwgZmxvYXQqIFIsIGZsb2F0KiBHLCBmbG9hdCogQikgY29uc3Qgb3ZlcnJpZGU7CiAKICAgdm9pZCBUcmFuc2xhdGVJbWFnZUxpbmUodWludDhfdCogcERlc3RCdWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNCdWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV93aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVHJhbnNNYXNrID0gZmFsc2UpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJUcmFuc01hc2spIGNvbnN0IG92ZXJyaWRlOwogCi0gIEZYX0ZMT0FUIG1fV2hpdGVQb2ludFszXTsKLSAgRlhfRkxPQVQgbV9CbGFja1BvaW50WzNdOwotICBGWF9GTE9BVCBtX1Jhbmdlc1s0XTsKKyAgZmxvYXQgbV9XaGl0ZVBvaW50WzNdOworICBmbG9hdCBtX0JsYWNrUG9pbnRbM107CisgIGZsb2F0IG1fUmFuZ2VzWzRdOwogfTsKIAogY2xhc3MgQ1BERl9JQ0NCYXNlZENTIDogcHVibGljIENQREZfQ29sb3JTcGFjZSB7CkBAIC0xNTMsMzUgKzE1MiwzNiBAQAogICBleHBsaWNpdCBDUERGX0lDQ0Jhc2VkQ1MoQ1BERl9Eb2N1bWVudCogcERvYyk7CiAgIH5DUERGX0lDQ0Jhc2VkQ1MoKSBvdmVycmlkZTsKIAotICBib29sIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOwotCi0gIGJvb2wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAotICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKLSAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKLSAgYm9vbCBTZXRSR0IoRlhfRkxPQVQqIHBCdWYsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUIFIsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUIEcsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUIEIpIGNvbnN0IG92ZXJyaWRlOwotCi0gIGJvb2wgdl9HZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLAotICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgYywKLSAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIG0sCi0gICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB5LAotICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgaykgY29uc3Qgb3ZlcnJpZGU7Ci0KKyAgLy8gQ1BERl9Db2xvclNwYWNlOgorICB1aW50MzJfdCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PENQREZfT2JqZWN0Kj4qIHBWaXNpdGVkKSBvdmVycmlkZTsKKyAgYm9vbCBHZXRSR0IoZmxvYXQqIHBCdWYsIGZsb2F0KiBSLCBmbG9hdCogRywgZmxvYXQqIEIpIGNvbnN0IG92ZXJyaWRlOwogICB2b2lkIEVuYWJsZVN0ZENvbnZlcnNpb24oYm9vbCBiRW5hYmxlZCkgb3ZlcnJpZGU7CiAgIHZvaWQgVHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwU3JjQnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2Vfd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRyYW5zTWFzayA9IGZhbHNlKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVHJhbnNNYXNrKSBjb25zdCBvdmVycmlkZTsKIAotICBDRlhfTWF5YmVPd25lZDxDUERGX0NvbG9yU3BhY2U+IG1fcEFsdGVyQ1M7Ci0gIENQREZfSWNjUHJvZmlsZSogbV9wUHJvZmlsZTsKLSAgdWludDhfdCogbV9wQ2FjaGU7Ci0gIEZYX0ZMT0FUKiBtX3BSYW5nZXM7CisgIGJvb2wgSXNTUkdCKCkgY29uc3QgeyByZXR1cm4gbV9wUHJvZmlsZS0+SXNTUkdCKCk7IH0KKworIHByaXZhdGU6CisgIC8vIElmIG5vIHZhbGlkIElDQyBwcm9maWxlIG9yIHVzaW5nIHNSR0IsIHRyeSBsb29raW5nIGZvciBhbiBhbHRlcm5hdGUuCisgIGJvb2wgRmluZEFsdGVybmF0ZVByb2ZpbGUoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PENQREZfT2JqZWN0Kj4qIHBWaXNpdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5FeHBlY3RlZENvbXBvbmVudHMpOworICBzdGF0aWMgQ1BERl9Db2xvclNwYWNlKiBHZXRTdG9ja0FsdGVybmF0ZVByb2ZpbGUodWludDMyX3QgbkNvbXBvbmVudHMpOworICBzdGF0aWMgYm9vbCBJc1ZhbGlkQ29tcG9uZW50cyhpbnQzMl90IG5Db21wcyk7CisgIHN0YXRpYyBzdGQ6OnZlY3RvcjxmbG9hdD4gR2V0UmFuZ2VzKENQREZfRGljdGlvbmFyeSogcERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5Db21wb25lbnRzKTsKKworICBNYXliZU93bmVkPENQREZfQ29sb3JTcGFjZT4gbV9wQWx0ZXJDUzsKKyAgUmV0YWluUHRyPENQREZfSWNjUHJvZmlsZT4gbV9wUHJvZmlsZTsKKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4gbV9wQ2FjaGU7CisgIHN0ZDo6dmVjdG9yPGZsb2F0PiBtX3BSYW5nZXM7CiB9OwogCiBjbGFzcyBDUERGX0luZGV4ZWRDUyA6IHB1YmxpYyBDUERGX0NvbG9yU3BhY2UgewpAQCAtMTg5LDIyICsxODksMjAgQEAKICAgZXhwbGljaXQgQ1BERl9JbmRleGVkQ1MoQ1BERl9Eb2N1bWVudCogcERvYyk7CiAgIH5DUERGX0luZGV4ZWRDUygpIG92ZXJyaWRlOwogCi0gIGJvb2wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7CisgIHVpbnQzMl90IHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5LAorICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8Q1BERl9PYmplY3QqPiogcFZpc2l0ZWQpIG92ZXJyaWRlOwogCi0gIGJvb2wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAotICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKLSAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKLSAgQ1BERl9Db2xvclNwYWNlKiBHZXRCYXNlQ1MoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBHZXRSR0IoZmxvYXQqIHBCdWYsIGZsb2F0KiBSLCBmbG9hdCogRywgZmxvYXQqIEIpIGNvbnN0IG92ZXJyaWRlOwogCiAgIHZvaWQgRW5hYmxlU3RkQ29udmVyc2lvbihib29sIGJFbmFibGVkKSBvdmVycmlkZTsKIAotICBDUERGX0NvbG9yU3BhY2UqIG1fcEJhc2VDUzsKLSAgQ1BERl9Db3VudGVkQ29sb3JTcGFjZSogbV9wQ291bnRlZEJhc2VDUzsKLSAgaW50IG1fbkJhc2VDb21wb25lbnRzOwotICBpbnQgbV9NYXhJbmRleDsKLSAgQ0ZYX0J5dGVTdHJpbmcgbV9UYWJsZTsKLSAgRlhfRkxPQVQqIG1fcENvbXBNaW5NYXg7CisgIENQREZfQ29sb3JTcGFjZSogbV9wQmFzZUNTID0gbnVsbHB0cjsKKyAgVW5vd25lZFB0cjxDUERGX0NvdW50ZWRDb2xvclNwYWNlPiBtX3BDb3VudGVkQmFzZUNTOworICB1aW50MzJfdCBtX25CYXNlQ29tcG9uZW50cyA9IDA7CisgIGludCBtX01heEluZGV4ID0gMDsKKyAgQnl0ZVN0cmluZyBtX1RhYmxlOworICBmbG9hdCogbV9wQ29tcE1pbk1heCA9IG51bGxwdHI7CiB9OwogCiBjbGFzcyBDUERGX1NlcGFyYXRpb25DUyA6IHB1YmxpYyBDUERGX0NvbG9yU3BhY2UgewpAQCAtMjE0LDE0ICsyMTIsMTMgQEAKIAogICAvLyBDUERGX0NvbG9yU3BhY2U6CiAgIHZvaWQgR2V0RGVmYXVsdFZhbHVlKGludCBpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtYXgpIGNvbnN0IG92ZXJyaWRlOwotICBib29sIHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIG92ZXJyaWRlOwotICBib29sIEdldFJHQihGWF9GTE9BVCogcEJ1ZiwKLSAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAotICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIG1heCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5LAorICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8Q1BERl9PYmplY3QqPiogcFZpc2l0ZWQpIG92ZXJyaWRlOworICBib29sIEdldFJHQihmbG9hdCogcEJ1ZiwgZmxvYXQqIFIsIGZsb2F0KiBHLCBmbG9hdCogQikgY29uc3Qgb3ZlcnJpZGU7CiAgIHZvaWQgRW5hYmxlU3RkQ29udmVyc2lvbihib29sIGJFbmFibGVkKSBvdmVycmlkZTsKIAogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Db2xvclNwYWNlPiBtX3BBbHRDUzsKQEAgLTIzNiw4NiArMjMzLDE0MiBAQAogCiAgIC8vIENQREZfQ29sb3JTcGFjZToKICAgdm9pZCBHZXREZWZhdWx0VmFsdWUoaW50IGlDb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIG1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIG1heCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGJvb2wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7Ci0gIGJvb2wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAotICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKLSAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbWluLAorICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbWF4KSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3Qgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXksCisgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxDUERGX09iamVjdCo+KiBwVmlzaXRlZCkgb3ZlcnJpZGU7CisgIGJvb2wgR2V0UkdCKGZsb2F0KiBwQnVmLCBmbG9hdCogUiwgZmxvYXQqIEcsIGZsb2F0KiBCKSBjb25zdCBvdmVycmlkZTsKICAgdm9pZCBFbmFibGVTdGRDb252ZXJzaW9uKGJvb2wgYkVuYWJsZWQpIG92ZXJyaWRlOwogCiAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0NvbG9yU3BhY2U+IG1fcEFsdENTOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9GdW5jdGlvbj4gbV9wRnVuYzsKIH07CiAKLUZYX0ZMT0FUIFJHQl9Db252ZXJzaW9uKEZYX0ZMT0FUIGNvbG9yQ29tcG9uZW50KSB7Ci0gIGlmIChjb2xvckNvbXBvbmVudCA+IDEpCi0gICAgY29sb3JDb21wb25lbnQgPSAxOwotICBpZiAoY29sb3JDb21wb25lbnQgPCAwKQotICAgIGNvbG9yQ29tcG9uZW50ID0gMDsKK2NsYXNzIFZlY3Rvcl8zYnkxIHsKKyBwdWJsaWM6CisgIFZlY3Rvcl8zYnkxKCkgOiBhKDAuMGYpLCBiKDAuMGYpLCBjKDAuMGYpIHt9CiAKLSAgaW50IHNjYWxlID0gKGludCkoY29sb3JDb21wb25lbnQgKiAxMDIzKTsKLSAgaWYgKHNjYWxlIDwgMCkKLSAgICBzY2FsZSA9IDA7CisgIFZlY3Rvcl8zYnkxKGZsb2F0IGExLCBmbG9hdCBiMSwgZmxvYXQgYzEpIDogYShhMSksIGIoYjEpLCBjKGMxKSB7fQorCisgIGZsb2F0IGE7CisgIGZsb2F0IGI7CisgIGZsb2F0IGM7Cit9OworCitjbGFzcyBNYXRyaXhfM2J5MyB7CisgcHVibGljOgorICBNYXRyaXhfM2J5MygpCisgICAgICA6IGEoMC4wZiksCisgICAgICAgIGIoMC4wZiksCisgICAgICAgIGMoMC4wZiksCisgICAgICAgIGQoMC4wZiksCisgICAgICAgIGUoMC4wZiksCisgICAgICAgIGYoMC4wZiksCisgICAgICAgIGcoMC4wZiksCisgICAgICAgIGgoMC4wZiksCisgICAgICAgIGkoMC4wZikge30KKworICBNYXRyaXhfM2J5MyhmbG9hdCBhMSwKKyAgICAgICAgICAgICAgZmxvYXQgYjEsCisgICAgICAgICAgICAgIGZsb2F0IGMxLAorICAgICAgICAgICAgICBmbG9hdCBkMSwKKyAgICAgICAgICAgICAgZmxvYXQgZTEsCisgICAgICAgICAgICAgIGZsb2F0IGYxLAorICAgICAgICAgICAgICBmbG9hdCBnMSwKKyAgICAgICAgICAgICAgZmxvYXQgaDEsCisgICAgICAgICAgICAgIGZsb2F0IGkxKQorICAgICAgOiBhKGExKSwgYihiMSksIGMoYzEpLCBkKGQxKSwgZShlMSksIGYoZjEpLCBnKGcxKSwgaChoMSksIGkoaTEpIHt9CisKKyAgTWF0cml4XzNieTMgSW52ZXJzZSgpIHsKKyAgICBmbG9hdCBkZXQgPSBhICogKGUgKiBpIC0gZiAqIGgpIC0gYiAqIChpICogZCAtIGYgKiBnKSArIGMgKiAoZCAqIGggLSBlICogZyk7CisgICAgaWYgKGZhYnMoZGV0KSA8IHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjplcHNpbG9uKCkpCisgICAgICByZXR1cm4gTWF0cml4XzNieTMoKTsKKworICAgIHJldHVybiBNYXRyaXhfM2J5MygKKyAgICAgICAgKGUgKiBpIC0gZiAqIGgpIC8gZGV0LCAtKGIgKiBpIC0gYyAqIGgpIC8gZGV0LCAoYiAqIGYgLSBjICogZSkgLyBkZXQsCisgICAgICAgIC0oZCAqIGkgLSBmICogZykgLyBkZXQsIChhICogaSAtIGMgKiBnKSAvIGRldCwgLShhICogZiAtIGMgKiBkKSAvIGRldCwKKyAgICAgICAgKGQgKiBoIC0gZSAqIGcpIC8gZGV0LCAtKGEgKiBoIC0gYiAqIGcpIC8gZGV0LCAoYSAqIGUgLSBiICogZCkgLyBkZXQpOworICB9CisKKyAgTWF0cml4XzNieTMgTXVsdGlwbHkoY29uc3QgTWF0cml4XzNieTMmIG0pIHsKKyAgICByZXR1cm4gTWF0cml4XzNieTMoYSAqIG0uYSArIGIgKiBtLmQgKyBjICogbS5nLCBhICogbS5iICsgYiAqIG0uZSArIGMgKiBtLmgsCisgICAgICAgICAgICAgICAgICAgICAgIGEgKiBtLmMgKyBiICogbS5mICsgYyAqIG0uaSwgZCAqIG0uYSArIGUgKiBtLmQgKyBmICogbS5nLAorICAgICAgICAgICAgICAgICAgICAgICBkICogbS5iICsgZSAqIG0uZSArIGYgKiBtLmgsIGQgKiBtLmMgKyBlICogbS5mICsgZiAqIG0uaSwKKyAgICAgICAgICAgICAgICAgICAgICAgZyAqIG0uYSArIGggKiBtLmQgKyBpICogbS5nLCBnICogbS5iICsgaCAqIG0uZSArIGkgKiBtLmgsCisgICAgICAgICAgICAgICAgICAgICAgIGcgKiBtLmMgKyBoICogbS5mICsgaSAqIG0uaSk7CisgIH0KKworICBWZWN0b3JfM2J5MSBUcmFuc2Zvcm1WZWN0b3IoY29uc3QgVmVjdG9yXzNieTEmIHYpIHsKKyAgICByZXR1cm4gVmVjdG9yXzNieTEoYSAqIHYuYSArIGIgKiB2LmIgKyBjICogdi5jLCBkICogdi5hICsgZSAqIHYuYiArIGYgKiB2LmMsCisgICAgICAgICAgICAgICAgICAgICAgIGcgKiB2LmEgKyBoICogdi5iICsgaSAqIHYuYyk7CisgIH0KKworICBmbG9hdCBhOworICBmbG9hdCBiOworICBmbG9hdCBjOworICBmbG9hdCBkOworICBmbG9hdCBlOworICBmbG9hdCBmOworICBmbG9hdCBnOworICBmbG9hdCBoOworICBmbG9hdCBpOworfTsKKworZmxvYXQgUkdCX0NvbnZlcnNpb24oZmxvYXQgY29sb3JDb21wb25lbnQpIHsKKyAgY29sb3JDb21wb25lbnQgPSBwZGZpdW06OmNsYW1wKGNvbG9yQ29tcG9uZW50LCAwLjBmLCAxLjBmKTsKKyAgaW50IHNjYWxlID0gc3RkOjptYXgoc3RhdGljX2Nhc3Q8aW50Pihjb2xvckNvbXBvbmVudCAqIDEwMjMpLCAwKTsKICAgaWYgKHNjYWxlIDwgMTkyKQotICAgIGNvbG9yQ29tcG9uZW50ID0gKGdfc1JHQlNhbXBsZXMxW3NjYWxlXSAvIDI1NS4wZik7Ci0gIGVsc2UKLSAgICBjb2xvckNvbXBvbmVudCA9IChnX3NSR0JTYW1wbGVzMltzY2FsZSAvIDQgLSA0OF0gLyAyNTUuMGYpOwotICByZXR1cm4gY29sb3JDb21wb25lbnQ7CisgICAgcmV0dXJuIGdfc1JHQlNhbXBsZXMxW3NjYWxlXSAvIDI1NS4wZjsKKyAgcmV0dXJuIGdfc1JHQlNhbXBsZXMyW3NjYWxlIC8gNCAtIDQ4XSAvIDI1NS4wZjsKIH0KIAotdm9pZCBYWVpfdG9fc1JHQihGWF9GTE9BVCBYLAotICAgICAgICAgICAgICAgICBGWF9GTE9BVCBZLAotICAgICAgICAgICAgICAgICBGWF9GTE9BVCBaLAotICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKLSAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCi0gICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSB7Ci0gIEZYX0ZMT0FUIFIxID0gMy4yNDEwZiAqIFggLSAxLjUzNzRmICogWSAtIDAuNDk4NmYgKiBaOwotICBGWF9GTE9BVCBHMSA9IC0wLjk2OTJmICogWCArIDEuODc2MGYgKiBZICsgMC4wNDE2ZiAqIFo7Ci0gIEZYX0ZMT0FUIEIxID0gMC4wNTU2ZiAqIFggLSAwLjIwNDBmICogWSArIDEuMDU3MGYgKiBaOwordm9pZCBYWVpfdG9fc1JHQihmbG9hdCBYLCBmbG9hdCBZLCBmbG9hdCBaLCBmbG9hdCogUiwgZmxvYXQqIEcsIGZsb2F0KiBCKSB7CisgIGZsb2F0IFIxID0gMy4yNDEwZiAqIFggLSAxLjUzNzRmICogWSAtIDAuNDk4NmYgKiBaOworICBmbG9hdCBHMSA9IC0wLjk2OTJmICogWCArIDEuODc2MGYgKiBZICsgMC4wNDE2ZiAqIFo7CisgIGZsb2F0IEIxID0gMC4wNTU2ZiAqIFggLSAwLjIwNDBmICogWSArIDEuMDU3MGYgKiBaOwogCi0gIFIgPSBSR0JfQ29udmVyc2lvbihSMSk7Ci0gIEcgPSBSR0JfQ29udmVyc2lvbihHMSk7Ci0gIEIgPSBSR0JfQ29udmVyc2lvbihCMSk7CisgICpSID0gUkdCX0NvbnZlcnNpb24oUjEpOworICAqRyA9IFJHQl9Db252ZXJzaW9uKEcxKTsKKyAgKkIgPSBSR0JfQ29udmVyc2lvbihCMSk7CiB9CiAKLXZvaWQgWFlaX3RvX3NSR0JfV2hpdGVQb2ludChGWF9GTE9BVCBYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgWiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBYdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBZdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBadykgewordm9pZCBYWVpfdG9fc1JHQl9XaGl0ZVBvaW50KGZsb2F0IFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBaLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IFh3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IFl3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IFp3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBCKSB7CiAgIC8vIFRoZSBmb2xsb3dpbmcgUkdCX3h5eiBpcyBiYXNlZCBvbgogICAvLyBzUkdCIHZhbHVlIHtSeCxSeX09ezAuNjQsIDAuMzN9LCB7R3gsR3l9PXswLjMwLCAwLjYwfSwge0J4LEJ5fT17MC4xNSwgMC4wNn0KIAotICBGWF9GTE9BVCBSeCA9IDAuNjRmLCBSeSA9IDAuMzNmOwotICBGWF9GTE9BVCBHeCA9IDAuMzBmLCBHeSA9IDAuNjBmOwotICBGWF9GTE9BVCBCeCA9IDAuMTVmLCBCeSA9IDAuMDZmOwotICBDRlhfTWF0cml4XzNieTMgUkdCX3h5eihSeCwgR3gsIEJ4LCBSeSwgR3ksIEJ5LCAxIC0gUnggLSBSeSwgMSAtIEd4IC0gR3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSBCeCAtIEJ5KTsKLSAgQ0ZYX1ZlY3Rvcl8zYnkxIHdoaXRlUG9pbnQoWHcsIFl3LCBadyk7Ci0gIENGWF9WZWN0b3JfM2J5MSBYWVooWCwgWSwgWik7CisgIGZsb2F0IFJ4ID0gMC42NGYsIFJ5ID0gMC4zM2Y7CisgIGZsb2F0IEd4ID0gMC4zMGYsIEd5ID0gMC42MGY7CisgIGZsb2F0IEJ4ID0gMC4xNWYsIEJ5ID0gMC4wNmY7CisgIE1hdHJpeF8zYnkzIFJHQl94eXooUngsIEd4LCBCeCwgUnksIEd5LCBCeSwgMSAtIFJ4IC0gUnksIDEgLSBHeCAtIEd5LAorICAgICAgICAgICAgICAgICAgICAgIDEgLSBCeCAtIEJ5KTsKKyAgVmVjdG9yXzNieTEgd2hpdGVQb2ludChYdywgWXcsIFp3KTsKKyAgVmVjdG9yXzNieTEgWFlaKFgsIFksIFopOwogCi0gIENGWF9WZWN0b3JfM2J5MSBSR0JfU3VtX1hZWiA9IFJHQl94eXouSW52ZXJzZSgpLlRyYW5zZm9ybVZlY3Rvcih3aGl0ZVBvaW50KTsKLSAgQ0ZYX01hdHJpeF8zYnkzIFJHQl9TVU1fWFlaX0RJQUcoUkdCX1N1bV9YWVouYSwgMCwgMCwgMCwgUkdCX1N1bV9YWVouYiwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgUkdCX1N1bV9YWVouYyk7Ci0gIENGWF9NYXRyaXhfM2J5MyBNID0gUkdCX3h5ei5NdWx0aXBseShSR0JfU1VNX1hZWl9ESUFHKTsKLSAgQ0ZYX1ZlY3Rvcl8zYnkxIFJHQiA9IE0uSW52ZXJzZSgpLlRyYW5zZm9ybVZlY3RvcihYWVopOworICBWZWN0b3JfM2J5MSBSR0JfU3VtX1hZWiA9IFJHQl94eXouSW52ZXJzZSgpLlRyYW5zZm9ybVZlY3Rvcih3aGl0ZVBvaW50KTsKKyAgTWF0cml4XzNieTMgUkdCX1NVTV9YWVpfRElBRyhSR0JfU3VtX1hZWi5hLCAwLCAwLCAwLCBSR0JfU3VtX1hZWi5iLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJHQl9TdW1fWFlaLmMpOworICBNYXRyaXhfM2J5MyBNID0gUkdCX3h5ei5NdWx0aXBseShSR0JfU1VNX1hZWl9ESUFHKTsKKyAgVmVjdG9yXzNieTEgUkdCID0gTS5JbnZlcnNlKCkuVHJhbnNmb3JtVmVjdG9yKFhZWik7CiAKLSAgUiA9IFJHQl9Db252ZXJzaW9uKFJHQi5hKTsKLSAgRyA9IFJHQl9Db252ZXJzaW9uKFJHQi5iKTsKLSAgQiA9IFJHQl9Db252ZXJzaW9uKFJHQi5jKTsKKyAgKlIgPSBSR0JfQ29udmVyc2lvbihSR0IuYSk7CisgICpHID0gUkdCX0NvbnZlcnNpb24oUkdCLmIpOworICAqQiA9IFJHQl9Db252ZXJzaW9uKFJHQi5jKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCiAKLUNQREZfQ29sb3JTcGFjZSogQ1BERl9Db2xvclNwYWNlOjpDb2xvcnNwYWNlRnJvbU5hbWUoCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpIHsKKy8vIHN0YXRpYworQ1BERl9Db2xvclNwYWNlKiBDUERGX0NvbG9yU3BhY2U6OkNvbG9yc3BhY2VGcm9tTmFtZShjb25zdCBCeXRlU3RyaW5nJiBuYW1lKSB7CiAgIGlmIChuYW1lID09ICJEZXZpY2VSR0IiIHx8IG5hbWUgPT0gIlJHQiIpCiAgICAgcmV0dXJuIENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VSR0IpOwogICBpZiAobmFtZSA9PSAiRGV2aWNlR3JheSIgfHwgbmFtZSA9PSAiRyIpCkBAIC0zMjcsMTIgKzM4MCwyMyBAQAogICByZXR1cm4gbnVsbHB0cjsKIH0KIAorLy8gc3RhdGljCiBDUERGX0NvbG9yU3BhY2UqIENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhpbnQgZmFtaWx5KSB7CiAgIHJldHVybiBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldFBhZ2VNb2R1bGUoKS0+R2V0U3RvY2tDUyhmYW1pbHkpOwogfQogCisvLyBzdGF0aWMKIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0NvbG9yU3BhY2U+IENQREZfQ29sb3JTcGFjZTo6TG9hZChDUERGX0RvY3VtZW50KiBwRG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwT2JqKSB7CisgIHN0ZDo6c2V0PENQREZfT2JqZWN0Kj4gdmlzaXRlZDsKKyAgcmV0dXJuIExvYWQocERvYywgcE9iaiwgJnZpc2l0ZWQpOworfQorCisvLyBzdGF0aWMKK3N0ZDo6dW5pcXVlX3B0cjxDUERGX0NvbG9yU3BhY2U+IENQREZfQ29sb3JTcGFjZTo6TG9hZCgKKyAgICBDUERGX0RvY3VtZW50KiBwRG9jLAorICAgIENQREZfT2JqZWN0KiBwT2JqLAorICAgIHN0ZDo6c2V0PENQREZfT2JqZWN0Kj4qIHBWaXNpdGVkKSB7CiAgIGlmICghcE9iaikKICAgICByZXR1cm4gbnVsbHB0cjsKIApAQCAtMzY0LDM0ICs0MjgsNDMgQEAKICAgaWYgKCFwRmFtaWx5T2JqKQogICAgIHJldHVybiBudWxscHRyOwogCi0gIENGWF9CeXRlU3RyaW5nIGZhbWlseW5hbWUgPSBwRmFtaWx5T2JqLT5HZXRTdHJpbmcoKTsKKyAgQnl0ZVN0cmluZyBmYW1pbHluYW1lID0gcEZhbWlseU9iai0+R2V0U3RyaW5nKCk7CiAgIGlmIChwQXJyYXktPkdldENvdW50KCkgPT0gMSkKICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPENQREZfQ29sb3JTcGFjZT4oQ29sb3JzcGFjZUZyb21OYW1lKGZhbWlseW5hbWUpKTsKIAogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Db2xvclNwYWNlPiBwQ1M7Ci0gIHVpbnQzMl90IGlkID0gZmFtaWx5bmFtZS5HZXRJRCgpOwotICBpZiAoaWQgPT0gRlhCU1RSX0lEKCdDJywgJ2EnLCAnbCcsICdHJykpIHsKLSAgICBwQ1MucmVzZXQobmV3IENQREZfQ2FsR3JheShwRG9jKSk7Ci0gIH0gZWxzZSBpZiAoaWQgPT0gRlhCU1RSX0lEKCdDJywgJ2EnLCAnbCcsICdSJykpIHsKLSAgICBwQ1MucmVzZXQobmV3IENQREZfQ2FsUkdCKHBEb2MpKTsKLSAgfSBlbHNlIGlmIChpZCA9PSBGWEJTVFJfSUQoJ0wnLCAnYScsICdiJywgMCkpIHsKLSAgICBwQ1MucmVzZXQobmV3IENQREZfTGFiQ1MocERvYykpOwotICB9IGVsc2UgaWYgKGlkID09IEZYQlNUUl9JRCgnSScsICdDJywgJ0MnLCAnQicpKSB7Ci0gICAgcENTLnJlc2V0KG5ldyBDUERGX0lDQ0Jhc2VkQ1MocERvYykpOwotICB9IGVsc2UgaWYgKGlkID09IEZYQlNUUl9JRCgnSScsICduJywgJ2QnLCAnZScpIHx8Ci0gICAgICAgICAgICAgaWQgPT0gRlhCU1RSX0lEKCdJJywgMCwgMCwgMCkpIHsKLSAgICBwQ1MucmVzZXQobmV3IENQREZfSW5kZXhlZENTKHBEb2MpKTsKLSAgfSBlbHNlIGlmIChpZCA9PSBGWEJTVFJfSUQoJ1MnLCAnZScsICdwJywgJ2EnKSkgewotICAgIHBDUy5yZXNldChuZXcgQ1BERl9TZXBhcmF0aW9uQ1MocERvYykpOwotICB9IGVsc2UgaWYgKGlkID09IEZYQlNUUl9JRCgnRCcsICdlJywgJ3YnLCAnaScpKSB7Ci0gICAgcENTLnJlc2V0KG5ldyBDUERGX0RldmljZU5DUyhwRG9jKSk7Ci0gIH0gZWxzZSBpZiAoaWQgPT0gRlhCU1RSX0lEKCdQJywgJ2EnLCAndCcsICd0JykpIHsKLSAgICBwQ1MucmVzZXQobmV3IENQREZfUGF0dGVybkNTKHBEb2MpKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKKyAgc3dpdGNoIChmYW1pbHluYW1lLkdldElEKCkpIHsKKyAgICBjYXNlIEZYQlNUUl9JRCgnQycsICdhJywgJ2wnLCAnRycpOgorICAgICAgcENTLnJlc2V0KG5ldyBDUERGX0NhbEdyYXkocERvYykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWEJTVFJfSUQoJ0MnLCAnYScsICdsJywgJ1InKToKKyAgICAgIHBDUy5yZXNldChuZXcgQ1BERl9DYWxSR0IocERvYykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWEJTVFJfSUQoJ0wnLCAnYScsICdiJywgMCk6CisgICAgICBwQ1MucmVzZXQobmV3IENQREZfTGFiQ1MocERvYykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWEJTVFJfSUQoJ0knLCAnQycsICdDJywgJ0InKToKKyAgICAgIHBDUy5yZXNldChuZXcgQ1BERl9JQ0NCYXNlZENTKHBEb2MpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhCU1RSX0lEKCdJJywgJ24nLCAnZCcsICdlJyk6CisgICAgY2FzZSBGWEJTVFJfSUQoJ0knLCAwLCAwLCAwKToKKyAgICAgIHBDUy5yZXNldChuZXcgQ1BERl9JbmRleGVkQ1MocERvYykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWEJTVFJfSUQoJ1MnLCAnZScsICdwJywgJ2EnKToKKyAgICAgIHBDUy5yZXNldChuZXcgQ1BERl9TZXBhcmF0aW9uQ1MocERvYykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWEJTVFJfSUQoJ0QnLCAnZScsICd2JywgJ2knKToKKyAgICAgIHBDUy5yZXNldChuZXcgQ1BERl9EZXZpY2VOQ1MocERvYykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWEJTVFJfSUQoJ1AnLCAnYScsICd0JywgJ3QnKToKKyAgICAgIHBDUy5yZXNldChuZXcgQ1BERl9QYXR0ZXJuQ1MocERvYykpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBudWxscHRyOwogICB9CiAgIHBDUy0+bV9wQXJyYXkgPSBwQXJyYXk7Ci0gIGlmICghcENTLT52X0xvYWQocERvYywgcEFycmF5KSkKKyAgcENTLT5tX25Db21wb25lbnRzID0gcENTLT52X0xvYWQocERvYywgcEFycmF5LCBwVmlzaXRlZCk7CisgIGlmIChwQ1MtPm1fbkNvbXBvbmVudHMgPT0gMCkKICAgICByZXR1cm4gbnVsbHB0cjsKIAogICByZXR1cm4gcENTOwpAQCAtNDA4LDczICs0ODEsMjQgQEAKIH0KIAogaW50IENQREZfQ29sb3JTcGFjZTo6R2V0QnVmU2l6ZSgpIGNvbnN0IHsKLSAgaWYgKG1fRmFtaWx5ID09IFBERkNTX1BBVFRFUk4pIHsKKyAgaWYgKG1fRmFtaWx5ID09IFBERkNTX1BBVFRFUk4pCiAgICAgcmV0dXJuIHNpemVvZihQYXR0ZXJuVmFsdWUpOwotICB9Ci0gIHJldHVybiBtX25Db21wb25lbnRzICogc2l6ZW9mKEZYX0ZMT0FUKTsKKyAgcmV0dXJuIG1fbkNvbXBvbmVudHMgKiBzaXplb2YoZmxvYXQpOwogfQogCi1GWF9GTE9BVCogQ1BERl9Db2xvclNwYWNlOjpDcmVhdGVCdWYoKSB7CitmbG9hdCogQ1BERl9Db2xvclNwYWNlOjpDcmVhdGVCdWYoKSB7CiAgIGludCBzaXplID0gR2V0QnVmU2l6ZSgpOwotICB1aW50OF90KiBwQnVmID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7Ci0gIHJldHVybiAoRlhfRkxPQVQqKXBCdWY7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PGZsb2F0Kj4oRlhfQWxsb2ModWludDhfdCwgc2l6ZSkpOwogfQogCi1ib29sIENQREZfQ29sb3JTcGFjZTo6c1JHQigpIGNvbnN0IHsKLSAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRVJHQikgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChtX0ZhbWlseSAhPSBQREZDU19JQ0NCQVNFRCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBDUERGX0lDQ0Jhc2VkQ1MqIHBDUyA9IChDUERGX0lDQ0Jhc2VkQ1MqKXRoaXM7Ci0gIHJldHVybiBwQ1MtPm1fcFByb2ZpbGUtPm1fYnNSR0I7Ci19Ci0KLWJvb2wgQ1BERl9Db2xvclNwYWNlOjpTZXRSR0IoRlhfRkxPQVQqIHBCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEIpIGNvbnN0IHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENQREZfQ29sb3JTcGFjZTo6R2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBrKSBjb25zdCB7Ci0gIGlmICh2X0dldENNWUsocEJ1ZiwgYywgbSwgeSwgaykpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBGWF9GTE9BVCBSLCBHLCBCOwotICBpZiAoIUdldFJHQihwQnVmLCBSLCBHLCBCKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBzUkdCX3RvX0Fkb2JlQ01ZSyhSLCBHLCBCLCBjLCBtLCB5LCBrKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1BERl9Db2xvclNwYWNlOjpTZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaykgY29uc3QgewotICBpZiAodl9TZXRDTVlLKHBCdWYsIGMsIG0sIHksIGspKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgRlhfRkxPQVQgUiwgRywgQjsKLSAgQWRvYmVDTVlLX3RvX3NSR0IoYywgbSwgeSwgaywgUiwgRywgQik7Ci0gIHJldHVybiBTZXRSR0IocEJ1ZiwgUiwgRywgQik7Ci19Ci0KLXZvaWQgQ1BERl9Db2xvclNwYWNlOjpHZXREZWZhdWx0Q29sb3IoRlhfRkxPQVQqIGJ1ZikgY29uc3QgewotICBpZiAoIWJ1ZiB8fCBtX0ZhbWlseSA9PSBQREZDU19QQVRURVJOKSB7Cit2b2lkIENQREZfQ29sb3JTcGFjZTo6R2V0RGVmYXVsdENvbG9yKGZsb2F0KiBidWYpIGNvbnN0IHsKKyAgaWYgKCFidWYgfHwgbV9GYW1pbHkgPT0gUERGQ1NfUEFUVEVSTikKICAgICByZXR1cm47Ci0gIH0KLSAgRlhfRkxPQVQgbWluLCBtYXg7Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX25Db21wb25lbnRzOyBpKyspIHsKLSAgICBHZXREZWZhdWx0VmFsdWUoaSwgYnVmW2ldLCBtaW4sIG1heCk7Ci0gIH0KKworICBmbG9hdCBtaW47CisgIGZsb2F0IG1heDsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fbkNvbXBvbmVudHM7IGkrKykKKyAgICBHZXREZWZhdWx0VmFsdWUoaSwgJmJ1ZltpXSwgJm1pbiwgJm1heCk7CiB9CiAKIHVpbnQzMl90IENQREZfQ29sb3JTcGFjZTo6Q291bnRDb21wb25lbnRzKCkgY29uc3QgewpAQCAtNDgyLDEyICs1MDYsMTIgQEAKIH0KIAogdm9pZCBDUERGX0NvbG9yU3BhY2U6OkdldERlZmF1bHRWYWx1ZShpbnQgaUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbWF4KSBjb25zdCB7Ci0gIHZhbHVlID0gMDsKLSAgbWluID0gMDsKLSAgbWF4ID0gMS4wZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbWF4KSBjb25zdCB7CisgICp2YWx1ZSA9IDAuMGY7CisgICptaW4gPSAwLjBmOworICAqbWF4ID0gMS4wZjsKIH0KIAogdm9pZCBDUERGX0NvbG9yU3BhY2U6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBkZXN0X2J1ZiwKQEAgLTQ5NiwyNyArNTIwLDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV93aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVHJhbnNNYXNrKSBjb25zdCB7Ci0gIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiBzcmNidWYobV9uQ29tcG9uZW50cyk7Ci0gIEZYX0ZMT0FUKiBzcmMgPSBzcmNidWY7Ci0gIEZYX0ZMT0FUIFIsIEcsIEI7CisgIENGWF9GaXhlZEJ1Zkdyb3c8ZmxvYXQsIDE2PiBzcmNidWYobV9uQ29tcG9uZW50cyk7CisgIGZsb2F0KiBzcmMgPSBzcmNidWY7CisgIGZsb2F0IFI7CisgIGZsb2F0IEc7CisgIGZsb2F0IEI7CisgIGNvbnN0IGludCBkaXZpc29yID0gbV9GYW1pbHkgIT0gUERGQ1NfSU5ERVhFRCA/IDI1NSA6IDE7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpKyspIHsKICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgbV9uQ29tcG9uZW50czsgaisrKQotICAgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0lOREVYRUQpIHsKLSAgICAgICAgc3JjW2pdID0gKEZYX0ZMT0FUKSgqc3JjX2J1ZisrKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNyY1tqXSA9IChGWF9GTE9BVCkoKnNyY19idWYrKykgLyAyNTU7Ci0gICAgICB9Ci0gICAgR2V0UkdCKHNyYywgUiwgRywgQik7Ci0gICAgKmRlc3RfYnVmKysgPSAoaW50MzJfdCkoQiAqIDI1NSk7Ci0gICAgKmRlc3RfYnVmKysgPSAoaW50MzJfdCkoRyAqIDI1NSk7Ci0gICAgKmRlc3RfYnVmKysgPSAoaW50MzJfdCkoUiAqIDI1NSk7CisgICAgICBzcmNbal0gPSBzdGF0aWNfY2FzdDxmbG9hdD4oKnNyY19idWYrKykgLyBkaXZpc29yOworICAgIEdldFJHQihzcmMsICZSLCAmRywgJkIpOworICAgICpkZXN0X2J1ZisrID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oQiAqIDI1NSk7CisgICAgKmRlc3RfYnVmKysgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihHICogMjU1KTsKKyAgICAqZGVzdF9idWYrKyA9IHN0YXRpY19jYXN0PGludDMyX3Q+KFIgKiAyNTUpOwogICB9CiB9CiAKLUNQREZfQ29sb3JTcGFjZSogQ1BERl9Db2xvclNwYWNlOjpHZXRCYXNlQ1MoKSBjb25zdCB7Ci0gIHJldHVybiBudWxscHRyOwotfQotCiB2b2lkIENQREZfQ29sb3JTcGFjZTo6RW5hYmxlU3RkQ29udmVyc2lvbihib29sIGJFbmFibGVkKSB7CiAgIGlmIChiRW5hYmxlZCkKICAgICBtX2R3U3RkQ29udmVyc2lvbisrOwpAQCAtNTI0LDc5ICs1NDMsNDcgQEAKICAgICBtX2R3U3RkQ29udmVyc2lvbi0tOwogfQogCi1DUERGX0NvbG9yU3BhY2U6OkNQREZfQ29sb3JTcGFjZShDUERGX0RvY3VtZW50KiBwRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5Db21wb25lbnRzKQotICAgIDogbV9wRG9jdW1lbnQocERvYyksCi0gICAgICBtX0ZhbWlseShmYW1pbHkpLAotICAgICAgbV9uQ29tcG9uZW50cyhuQ29tcG9uZW50cyksCi0gICAgICBtX3BBcnJheShudWxscHRyKSwKLSAgICAgIG1fZHdTdGRDb252ZXJzaW9uKDApIHt9CitDUERGX0NvbG9yU3BhY2U6OkNQREZfQ29sb3JTcGFjZShDUERGX0RvY3VtZW50KiBwRG9jLCBpbnQgZmFtaWx5KQorICAgIDogbV9wRG9jdW1lbnQocERvYyksIG1fRmFtaWx5KGZhbWlseSkge30KIAogQ1BERl9Db2xvclNwYWNlOjp+Q1BERl9Db2xvclNwYWNlKCkge30KIAotYm9vbCBDUERGX0NvbG9yU3BhY2U6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1BERl9Db2xvclNwYWNlOjp2X0dldENNWUsoRlhfRkxPQVQqIHBCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBrKSBjb25zdCB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDUERGX0NvbG9yU3BhY2U6OnZfU2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaykgY29uc3QgewotICByZXR1cm4gZmFsc2U7Cit2b2lkIENQREZfQ29sb3JTcGFjZTo6U2V0Q29tcG9uZW50c0ZvclN0b2NrQ1ModWludDMyX3QgbkNvbXBvbmVudHMpIHsKKyAgQVNTRVJUKCFtX3BEb2N1bWVudCk7ICAvLyBTdG9jayBjb2xvcnNwYWNlIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBkb2N1bWVudC4KKyAgbV9uQ29tcG9uZW50cyA9IG5Db21wb25lbnRzOwogfQogCiBDUERGX0NhbEdyYXk6OkNQREZfQ2FsR3JheShDUERGX0RvY3VtZW50KiBwRG9jKQotICAgIDogQ1BERl9Db2xvclNwYWNlKHBEb2MsIFBERkNTX0NBTEdSQVksIDEpIHt9CisgICAgOiBDUERGX0NvbG9yU3BhY2UocERvYywgUERGQ1NfQ0FMR1JBWSkge30KIAotYm9vbCBDUERGX0NhbEdyYXk6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIHsKK3VpbnQzMl90IENQREZfQ2FsR3JheTo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxDUERGX09iamVjdCo+KiBwVmlzaXRlZCkgewogICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcEFycmF5LT5HZXREaWN0QXQoMSk7CiAgIGlmICghcERpY3QpCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiAwOwogCiAgIENQREZfQXJyYXkqIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheUZvcigiV2hpdGVQb2ludCIpOwotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspCiAgICAgbV9XaGl0ZVBvaW50W2ldID0gcFBhcmFtID8gcFBhcmFtLT5HZXROdW1iZXJBdChpKSA6IDA7CiAKICAgcFBhcmFtID0gcERpY3QtPkdldEFycmF5Rm9yKCJCbGFja1BvaW50Iik7Ci0gIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQogICAgIG1fQmxhY2tQb2ludFtpXSA9IHBQYXJhbSA/IHBQYXJhbS0+R2V0TnVtYmVyQXQoaSkgOiAwOwogCiAgIG1fR2FtbWEgPSBwRGljdC0+R2V0TnVtYmVyRm9yKCJHYW1tYSIpOwogICBpZiAobV9HYW1tYSA9PSAwKQogICAgIG1fR2FtbWEgPSAxLjBmOwotICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIDE7CiB9CiAKLWJvb2wgQ1BERl9DYWxHcmF5OjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpIGNvbnN0IHsKLSAgUiA9IEcgPSBCID0gKnBCdWY7Citib29sIENQREZfQ2FsR3JheTo6R2V0UkdCKGZsb2F0KiBwQnVmLCBmbG9hdCogUiwgZmxvYXQqIEcsIGZsb2F0KiBCKSBjb25zdCB7CisgICpSID0gKnBCdWY7CisgICpHID0gKnBCdWY7CisgICpCID0gKnBCdWY7CiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENQREZfQ2FsR3JheTo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBSLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBHLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBCKSBjb25zdCB7Ci0gIGlmIChSID09IEcgJiYgUiA9PSBCKSB7Ci0gICAgKnBCdWYgPSBSOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQogdm9pZCBDUERGX0NhbEdyYXk6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFNyY0J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVscywKQEAgLTYxMSwyNiArNTk4LDI3IEBACiB9CiAKIENQREZfQ2FsUkdCOjpDUERGX0NhbFJHQihDUERGX0RvY3VtZW50KiBwRG9jKQotICAgIDogQ1BERl9Db2xvclNwYWNlKHBEb2MsIFBERkNTX0NBTFJHQiwgMykge30KKyAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBQREZDU19DQUxSR0IpIHt9CiAKLWJvb2wgQ1BERl9DYWxSR0I6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIHsKK3VpbnQzMl90IENQREZfQ2FsUkdCOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxDUERGX09iamVjdCo+KiBwVmlzaXRlZCkgewogICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcEFycmF5LT5HZXREaWN0QXQoMSk7CiAgIGlmICghcERpY3QpCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiAwOwogCiAgIENQREZfQXJyYXkqIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheUZvcigiV2hpdGVQb2ludCIpOwotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspCiAgICAgbV9XaGl0ZVBvaW50W2ldID0gcFBhcmFtID8gcFBhcmFtLT5HZXROdW1iZXJBdChpKSA6IDA7CiAKICAgcFBhcmFtID0gcERpY3QtPkdldEFycmF5Rm9yKCJCbGFja1BvaW50Iik7Ci0gIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQogICAgIG1fQmxhY2tQb2ludFtpXSA9IHBQYXJhbSA/IHBQYXJhbS0+R2V0TnVtYmVyQXQoaSkgOiAwOwogCiAgIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheUZvcigiR2FtbWEiKTsKICAgaWYgKHBQYXJhbSkgewogICAgIG1fYkdhbW1hID0gdHJ1ZTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKQogICAgICAgbV9HYW1tYVtpXSA9IHBQYXJhbS0+R2V0TnVtYmVyQXQoaSk7CiAgIH0gZWxzZSB7CiAgICAgbV9iR2FtbWEgPSBmYWxzZTsKQEAgLTYzOSwzMCArNjI3LDI3IEBACiAgIHBQYXJhbSA9IHBEaWN0LT5HZXRBcnJheUZvcigiTWF0cml4Iik7CiAgIGlmIChwUGFyYW0pIHsKICAgICBtX2JNYXRyaXggPSB0cnVlOwotICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA5OyBpKyspCiAgICAgICBtX01hdHJpeFtpXSA9IHBQYXJhbS0+R2V0TnVtYmVyQXQoaSk7CiAgIH0gZWxzZSB7CiAgICAgbV9iTWF0cml4ID0gZmFsc2U7CiAgIH0KLSAgcmV0dXJuIHRydWU7CisgIHJldHVybiAzOwogfQogCi1ib29sIENQREZfQ2FsUkdCOjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpIGNvbnN0IHsKLSAgRlhfRkxPQVQgQV8gPSBwQnVmWzBdOwotICBGWF9GTE9BVCBCXyA9IHBCdWZbMV07Ci0gIEZYX0ZMT0FUIENfID0gcEJ1ZlsyXTsKK2Jvb2wgQ1BERl9DYWxSR0I6OkdldFJHQihmbG9hdCogcEJ1ZiwgZmxvYXQqIFIsIGZsb2F0KiBHLCBmbG9hdCogQikgY29uc3QgeworICBmbG9hdCBBXyA9IHBCdWZbMF07CisgIGZsb2F0IEJfID0gcEJ1ZlsxXTsKKyAgZmxvYXQgQ18gPSBwQnVmWzJdOwogICBpZiAobV9iR2FtbWEpIHsKLSAgICBBXyA9IChGWF9GTE9BVClGWFNZU19wb3coQV8sIG1fR2FtbWFbMF0pOwotICAgIEJfID0gKEZYX0ZMT0FUKUZYU1lTX3BvdyhCXywgbV9HYW1tYVsxXSk7Ci0gICAgQ18gPSAoRlhfRkxPQVQpRlhTWVNfcG93KENfLCBtX0dhbW1hWzJdKTsKKyAgICBBXyA9IEZYU1lTX3BvdyhBXywgbV9HYW1tYVswXSk7CisgICAgQl8gPSBGWFNZU19wb3coQl8sIG1fR2FtbWFbMV0pOworICAgIENfID0gRlhTWVNfcG93KENfLCBtX0dhbW1hWzJdKTsKICAgfQogCi0gIEZYX0ZMT0FUIFg7Ci0gIEZYX0ZMT0FUIFk7Ci0gIEZYX0ZMT0FUIFo7CisgIGZsb2F0IFg7CisgIGZsb2F0IFk7CisgIGZsb2F0IFo7CiAgIGlmIChtX2JNYXRyaXgpIHsKICAgICBYID0gbV9NYXRyaXhbMF0gKiBBXyArIG1fTWF0cml4WzNdICogQl8gKyBtX01hdHJpeFs2XSAqIENfOwogICAgIFkgPSBtX01hdHJpeFsxXSAqIEFfICsgbV9NYXRyaXhbNF0gKiBCXyArIG1fTWF0cml4WzddICogQ187CkBAIC02NzIsMTggKzY1Nyw4IEBACiAgICAgWSA9IEJfOwogICAgIFogPSBDXzsKICAgfQotICBYWVpfdG9fc1JHQl9XaGl0ZVBvaW50KFgsIFksIFosIFIsIEcsIEIsIG1fV2hpdGVQb2ludFswXSwgbV9XaGl0ZVBvaW50WzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1fV2hpdGVQb2ludFsyXSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENQREZfQ2FsUkdCOjpTZXRSR0IoRlhfRkxPQVQqIHBCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBHLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEIpIGNvbnN0IHsKLSAgcEJ1ZlswXSA9IFI7Ci0gIHBCdWZbMV0gPSBHOwotICBwQnVmWzJdID0gQjsKKyAgWFlaX3RvX3NSR0JfV2hpdGVQb2ludChYLCBZLCBaLCBtX1doaXRlUG9pbnRbMF0sIG1fV2hpdGVQb2ludFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX1doaXRlUG9pbnRbMl0sIFIsIEcsIEIpOwogICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtNjk0LDE1ICs2NjksMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRyYW5zTWFzaykgY29uc3QgewogICBpZiAoYlRyYW5zTWFzaykgewotICAgIEZYX0ZMT0FUIENhbFszXTsKLSAgICBGWF9GTE9BVCBSOwotICAgIEZYX0ZMT0FUIEc7Ci0gICAgRlhfRkxPQVQgQjsKKyAgICBmbG9hdCBDYWxbM107CisgICAgZmxvYXQgUjsKKyAgICBmbG9hdCBHOworICAgIGZsb2F0IEI7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkrKykgewotICAgICAgQ2FsWzBdID0gKChGWF9GTE9BVClwU3JjQnVmWzJdKSAvIDI1NTsKLSAgICAgIENhbFsxXSA9ICgoRlhfRkxPQVQpcFNyY0J1ZlsxXSkgLyAyNTU7Ci0gICAgICBDYWxbMl0gPSAoKEZYX0ZMT0FUKXBTcmNCdWZbMF0pIC8gMjU1OwotICAgICAgR2V0UkdCKENhbCwgUiwgRywgQik7CisgICAgICBDYWxbMF0gPSBzdGF0aWNfY2FzdDxmbG9hdD4ocFNyY0J1ZlsyXSkgLyAyNTU7CisgICAgICBDYWxbMV0gPSBzdGF0aWNfY2FzdDxmbG9hdD4ocFNyY0J1ZlsxXSkgLyAyNTU7CisgICAgICBDYWxbMl0gPSBzdGF0aWNfY2FzdDxmbG9hdD4ocFNyY0J1ZlswXSkgLyAyNTU7CisgICAgICBHZXRSR0IoQ2FsLCAmUiwgJkcsICZCKTsKICAgICAgIHBEZXN0QnVmWzBdID0gRlhTWVNfcm91bmQoQiAqIDI1NSk7CiAgICAgICBwRGVzdEJ1ZlsxXSA9IEZYU1lTX3JvdW5kKEcgKiAyNTUpOwogICAgICAgcERlc3RCdWZbMl0gPSBGWFNZU19yb3VuZChSICogMjU1KTsKQEAgLTcxNCw2MCArNjg5LDU3IEBACiB9CiAKIENQREZfTGFiQ1M6OkNQREZfTGFiQ1MoQ1BERl9Eb2N1bWVudCogcERvYykKLSAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBQREZDU19MQUIsIDMpIHt9CisgICAgOiBDUERGX0NvbG9yU3BhY2UocERvYywgUERGQ1NfTEFCKSB7fQogCiB2b2lkIENQREZfTGFiQ1M6OkdldERlZmF1bHRWYWx1ZShpbnQgaUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbWF4KSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIG1heCkgY29uc3QgewogICBBU1NFUlQoaUNvbXBvbmVudCA8IDMpOwotICB2YWx1ZSA9IDA7CiAgIGlmIChpQ29tcG9uZW50ID09IDApIHsKLSAgICBtaW4gPSAwOwotICAgIG1heCA9IDEwMCAqIDEuMGY7Ci0gIH0gZWxzZSB7Ci0gICAgbWluID0gbV9SYW5nZXNbaUNvbXBvbmVudCAqIDIgLSAyXTsKLSAgICBtYXggPSBtX1Jhbmdlc1tpQ29tcG9uZW50ICogMiAtIDFdOwotICAgIGlmICh2YWx1ZSA8IG1pbikKLSAgICAgIHZhbHVlID0gbWluOwotICAgIGVsc2UgaWYgKHZhbHVlID4gbWF4KQotICAgICAgdmFsdWUgPSBtYXg7CisgICAgKm1pbiA9IDAuMGY7CisgICAgKm1heCA9IDEwMCAqIDEuMGY7CisgICAgKnZhbHVlID0gMC4wZjsKKyAgICByZXR1cm47CiAgIH0KKworICAqbWluID0gbV9SYW5nZXNbaUNvbXBvbmVudCAqIDIgLSAyXTsKKyAgKm1heCA9IG1fUmFuZ2VzW2lDb21wb25lbnQgKiAyIC0gMV07CisgICp2YWx1ZSA9IHBkZml1bTo6Y2xhbXAoMC4wZiwgKm1pbiwgKm1heCk7CiB9CiAKLWJvb2wgQ1BERl9MYWJDUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgewordWludDMyX3QgQ1BERl9MYWJDUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PENQREZfT2JqZWN0Kj4qIHBWaXNpdGVkKSB7CiAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwQXJyYXktPkdldERpY3RBdCgxKTsKICAgaWYgKCFwRGljdCkKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIDA7CiAKICAgQ1BERl9BcnJheSogcFBhcmFtID0gcERpY3QtPkdldEFycmF5Rm9yKCJXaGl0ZVBvaW50Iik7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQorICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykKICAgICBtX1doaXRlUG9pbnRbaV0gPSBwUGFyYW0gPyBwUGFyYW0tPkdldE51bWJlckF0KGkpIDogMDsKIAogICBwUGFyYW0gPSBwRGljdC0+R2V0QXJyYXlGb3IoIkJsYWNrUG9pbnQiKTsKLSAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspCiAgICAgbV9CbGFja1BvaW50W2ldID0gcFBhcmFtID8gcFBhcmFtLT5HZXROdW1iZXJBdChpKSA6IDA7CiAKICAgcFBhcmFtID0gcERpY3QtPkdldEFycmF5Rm9yKCJSYW5nZSIpOwotICBjb25zdCBGWF9GTE9BVCBkZWZfcmFuZ2VzWzRdID0gey0xMDAgKiAxLjBmLCAxMDAgKiAxLjBmLCAtMTAwICogMS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAgKiAxLjBmfTsKLSAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLSAgICBtX1Jhbmdlc1tpXSA9IHBQYXJhbSA/IHBQYXJhbS0+R2V0TnVtYmVyQXQoaSkgOiBkZWZfcmFuZ2VzW2ldOwotICByZXR1cm4gdHJ1ZTsKKyAgY29uc3QgZmxvYXQga0RlZmF1bHRSYW5nZXNbNF0gPSB7LTEwMC4wZiwgMTAwLjBmLCAtMTAwLjBmLCAxMDAuMGZ9OworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShrRGVmYXVsdFJhbmdlcyk7IGkrKykKKyAgICBtX1Jhbmdlc1tpXSA9IHBQYXJhbSA/IHBQYXJhbS0+R2V0TnVtYmVyQXQoaSkgOiBrRGVmYXVsdFJhbmdlc1tpXTsKKyAgcmV0dXJuIDM7CiB9CiAKLWJvb2wgQ1BERl9MYWJDUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCB7Ci0gIEZYX0ZMT0FUIExzdGFyID0gcEJ1ZlswXTsKLSAgRlhfRkxPQVQgYXN0YXIgPSBwQnVmWzFdOwotICBGWF9GTE9BVCBic3RhciA9IHBCdWZbMl07Ci0gIEZYX0ZMT0FUIE0gPSAoTHN0YXIgKyAxNi4wZikgLyAxMTYuMGY7Ci0gIEZYX0ZMT0FUIEwgPSBNICsgYXN0YXIgLyA1MDAuMGY7Ci0gIEZYX0ZMT0FUIE4gPSBNIC0gYnN0YXIgLyAyMDAuMGY7Ci0gIEZYX0ZMT0FUIFgsIFksIFo7Citib29sIENQREZfTGFiQ1M6OkdldFJHQihmbG9hdCogcEJ1ZiwgZmxvYXQqIFIsIGZsb2F0KiBHLCBmbG9hdCogQikgY29uc3QgeworICBmbG9hdCBMc3RhciA9IHBCdWZbMF07CisgIGZsb2F0IGFzdGFyID0gcEJ1ZlsxXTsKKyAgZmxvYXQgYnN0YXIgPSBwQnVmWzJdOworICBmbG9hdCBNID0gKExzdGFyICsgMTYuMGYpIC8gMTE2LjBmOworICBmbG9hdCBMID0gTSArIGFzdGFyIC8gNTAwLjBmOworICBmbG9hdCBOID0gTSAtIGJzdGFyIC8gMjAwLjBmOworICBmbG9hdCBYOworICBmbG9hdCBZOworICBmbG9hdCBaOwogICBpZiAoTCA8IDAuMjA2OWYpCiAgICAgWCA9IDAuOTU3ZiAqIDAuMTI4NDJmICogKEwgLSAwLjEzNzlmKTsKICAgZWxzZQpAQCAtNzg3LDEzICs3NTksNiBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDUERGX0xhYkNTOjpTZXRSR0IoRlhfRkxPQVQqIHBCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBSLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgRywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEIpIGNvbnN0IHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCiB2b2lkIENQREZfTGFiQ1M6OlRyYW5zbGF0ZUltYWdlTGluZSh1aW50OF90KiBwRGVzdEJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNCdWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzLApAQCAtODAxLDE0MCArNzY2LDEwMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRyYW5zTWFzaykgY29uc3QgewogICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7Ci0gICAgRlhfRkxPQVQgbGFiWzNdOwotICAgIEZYX0ZMT0FUIFIsIEcsIEI7Ci0gICAgbGFiWzBdID0gKHBTcmNCdWZbMF0gKiAxMDAgLyAyNTUuMGYpOwotICAgIGxhYlsxXSA9IChGWF9GTE9BVCkocFNyY0J1ZlsxXSAtIDEyOCk7Ci0gICAgbGFiWzJdID0gKEZYX0ZMT0FUKShwU3JjQnVmWzJdIC0gMTI4KTsKLSAgICBHZXRSR0IobGFiLCBSLCBHLCBCKTsKLSAgICBwRGVzdEJ1ZlswXSA9IChpbnQzMl90KShCICogMjU1KTsKLSAgICBwRGVzdEJ1ZlsxXSA9IChpbnQzMl90KShHICogMjU1KTsKLSAgICBwRGVzdEJ1ZlsyXSA9IChpbnQzMl90KShSICogMjU1KTsKKyAgICBmbG9hdCBsYWJbM107CisgICAgbGFiWzBdID0gcFNyY0J1ZlswXSAqIDEwMCAvIDI1NS4wZjsKKyAgICBsYWJbMV0gPSBwU3JjQnVmWzFdIC0gMTI4OworICAgIGxhYlsyXSA9IHBTcmNCdWZbMl0gLSAxMjg7CisKKyAgICBmbG9hdCBSOworICAgIGZsb2F0IEc7CisgICAgZmxvYXQgQjsKKyAgICBHZXRSR0IobGFiLCAmUiwgJkcsICZCKTsKKyAgICBwRGVzdEJ1ZlswXSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KEIgKiAyNTUpOworICAgIHBEZXN0QnVmWzFdID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oRyAqIDI1NSk7CisgICAgcERlc3RCdWZbMl0gPSBzdGF0aWNfY2FzdDxpbnQzMl90PihSICogMjU1KTsKICAgICBwRGVzdEJ1ZiArPSAzOwogICAgIHBTcmNCdWYgKz0gMzsKICAgfQogfQogCiBDUERGX0lDQ0Jhc2VkQ1M6OkNQREZfSUNDQmFzZWRDUyhDUERGX0RvY3VtZW50KiBwRG9jKQotICAgIDogQ1BERl9Db2xvclNwYWNlKHBEb2MsIFBERkNTX0lDQ0JBU0VELCAwKSwKLSAgICAgIG1fcFByb2ZpbGUobnVsbHB0ciksCi0gICAgICBtX3BDYWNoZShudWxscHRyKSwKLSAgICAgIG1fcFJhbmdlcyhudWxscHRyKSB7fQorICAgIDogQ1BERl9Db2xvclNwYWNlKHBEb2MsIFBERkNTX0lDQ0JBU0VEKSB7fQogCiBDUERGX0lDQ0Jhc2VkQ1M6On5DUERGX0lDQ0Jhc2VkQ1MoKSB7Ci0gIEZYX0ZyZWUobV9wQ2FjaGUpOwotICBGWF9GcmVlKG1fcFJhbmdlcyk7Ci0gIGlmIChtX3BQcm9maWxlICYmIG1fcERvY3VtZW50KQotICAgIG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlSWNjUHJvZmlsZShtX3BQcm9maWxlKTsKKyAgaWYgKG1fcFByb2ZpbGUgJiYgbV9wRG9jdW1lbnQpIHsKKyAgICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IG1fcFByb2ZpbGUtPkdldFN0cmVhbSgpOworICAgIG1fcFByb2ZpbGUuUmVzZXQoKTsgIC8vIEdpdmUgdXAgb3VyIHJlZmVyZW5jZSBmaXJzdC4KKyAgICBhdXRvKiBwUGFnZURhdGEgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKTsKKyAgICBpZiAocFBhZ2VEYXRhKQorICAgICAgcFBhZ2VEYXRhLT5NYXliZVB1cmdlSWNjUHJvZmlsZShwU3RyZWFtKTsKKyAgfQogfQogCi1ib29sIENQREZfSUNDQmFzZWRDUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgewordWludDMyX3QgQ1BERl9JQ0NCYXNlZENTOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PENQREZfT2JqZWN0Kj4qIHBWaXNpdGVkKSB7CiAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gcEFycmF5LT5HZXRTdHJlYW1BdCgxKTsKICAgaWYgKCFwU3RyZWFtKQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gMDsKIAorICAvLyBUaGUgUERGIDEuNyBzcGVjIHNheXMgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIG11c3QgYmUgdmFsaWQuIFdoaWxlIHNvbWUKKyAgLy8gUERGIHZpZXdlcnMgdG9sZXJhdGUgaW52YWxpZCB2YWx1ZXMsIEFjcm9iYXQgZG9lcyBub3QsIHNvIGJlIGNvbnNpc3RlbnQKKyAgLy8gd2l0aCBBY3JvYmF0IGFuZCByZWplY3QgYmFkIHZhbHVlcy4KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBTdHJlYW0tPkdldERpY3QoKTsKKyAgaW50MzJfdCBuRGljdENvbXBvbmVudHMgPSBwRGljdCA/IHBEaWN0LT5HZXRJbnRlZ2VyRm9yKCJOIikgOiAwOworICBpZiAoIUlzVmFsaWRDb21wb25lbnRzKG5EaWN0Q29tcG9uZW50cykpCisgICAgcmV0dXJuIDA7CisKKyAgdWludDMyX3QgbkNvbXBvbmVudHMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obkRpY3RDb21wb25lbnRzKTsKICAgbV9wUHJvZmlsZSA9IHBEb2MtPkxvYWRJY2NQcm9maWxlKHBTdHJlYW0pOwogICBpZiAoIW1fcFByb2ZpbGUpCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiAwOwogCi0gIC8vIFRyeSB1c2luZyB0aGUgfG5Db21wb25lbnRzfCBmcm9tIElDQyBwcm9maWxlCi0gIG1fbkNvbXBvbmVudHMgPSBtX3BQcm9maWxlLT5HZXRDb21wb25lbnRzKCk7Ci0gIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7Ci0gIGlmICghbV9wUHJvZmlsZS0+bV9wVHJhbnNmb3JtKSB7ICAvLyBObyB2YWxpZCBJQ0MgcHJvZmlsZSBvciB1c2luZyBzUkdCCi0gICAgQ1BERl9PYmplY3QqIHBBbHRlckNTT2JqID0KLSAgICAgICAgcERpY3QgPyBwRGljdC0+R2V0RGlyZWN0T2JqZWN0Rm9yKCJBbHRlcm5hdGUiKSA6IG51bGxwdHI7Ci0gICAgaWYgKHBBbHRlckNTT2JqKSB7Ci0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Db2xvclNwYWNlPiBwQWx0ZXJDUyA9Ci0gICAgICAgICAgQ1BERl9Db2xvclNwYWNlOjpMb2FkKHBEb2MsIHBBbHRlckNTT2JqKTsKLSAgICAgIGlmIChwQWx0ZXJDUykgewotICAgICAgICBpZiAobV9uQ29tcG9uZW50cyA9PSAwKSB7ICAgICAgICAgICAgICAgICAvLyBOTyB2YWxpZCBJQ0MgcHJvZmlsZQotICAgICAgICAgIGlmIChwQWx0ZXJDUy0+Q291bnRDb21wb25lbnRzKCkgPiAwKSB7ICAvLyBVc2UgQWx0ZXJuYXRpdmUgY29sb3JzcGFjZQotICAgICAgICAgICAgbV9uQ29tcG9uZW50cyA9IHBBbHRlckNTLT5Db3VudENvbXBvbmVudHMoKTsKLSAgICAgICAgICAgIG1fcEFsdGVyQ1MgPSBzdGQ6Om1vdmUocEFsdGVyQ1MpOwotICAgICAgICAgIH0gZWxzZSB7ICAvLyBObyB2YWxpZCBhbHRlcm5hdGl2ZSBjb2xvcnNwYWNlCi0gICAgICAgICAgICBpbnQzMl90IG5EaWN0Q29tcG9uZW50cyA9IHBEaWN0ID8gcERpY3QtPkdldEludGVnZXJGb3IoIk4iKSA6IDA7Ci0gICAgICAgICAgICBpZiAobkRpY3RDb21wb25lbnRzICE9IDEgJiYgbkRpY3RDb21wb25lbnRzICE9IDMgJiYKLSAgICAgICAgICAgICAgICBuRGljdENvbXBvbmVudHMgIT0gNCkgewotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX25Db21wb25lbnRzID0gbkRpY3RDb21wb25lbnRzOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsgIC8vIFVzaW5nIHNSR0IKLSAgICAgICAgICBpZiAocEFsdGVyQ1MtPkNvdW50Q29tcG9uZW50cygpID09IG1fbkNvbXBvbmVudHMpCi0gICAgICAgICAgICBtX3BBbHRlckNTID0gc3RkOjptb3ZlKHBBbHRlckNTKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAoIW1fcEFsdGVyQ1MpIHsKLSAgICAgIGlmIChtX25Db21wb25lbnRzID09IDEpCi0gICAgICAgIG1fcEFsdGVyQ1MgPSBHZXRTdG9ja0NTKFBERkNTX0RFVklDRUdSQVkpOwotICAgICAgZWxzZSBpZiAobV9uQ29tcG9uZW50cyA9PSAzKQotICAgICAgICBtX3BBbHRlckNTID0gR2V0U3RvY2tDUyhQREZDU19ERVZJQ0VSR0IpOwotICAgICAgZWxzZSBpZiAobV9uQ29tcG9uZW50cyA9PSA0KQotICAgICAgICBtX3BBbHRlckNTID0gR2V0U3RvY2tDUyhQREZDU19ERVZJQ0VDTVlLKTsKLSAgICB9CisgIC8vIFRoZSBQREYgMS43IHNwZWMgYWxzbyBzYXlzIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyBpbiB0aGUgSUNDIHByb2ZpbGUKKyAgLy8gbXVzdCBtYXRjaCB0aGUgTiB2YWx1ZS4gSG93ZXZlciwgdGhhdCBhc3N1bWVzIHRoZSB2aWV3ZXIgYWN0dWFsbHkKKyAgLy8gdW5kZXJzdGFuZHMgdGhlIElDQyBwcm9maWxlLgorICAvLyBJZiB0aGUgdmFsaWQgSUNDIHByb2ZpbGUgaGFzIGEgbWlzbWF0Y2gsIGZhaWwuCisgIGlmIChtX3BQcm9maWxlLT5Jc1ZhbGlkKCkgJiYgbV9wUHJvZmlsZS0+R2V0Q29tcG9uZW50cygpICE9IG5Db21wb25lbnRzKQorICAgIHJldHVybiAwOworCisgIC8vIElmIFBERml1bSBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoZSBJQ0MgcHJvZmlsZSBmb3JtYXQgYXQgYWxsLCBvciBpZiBpdCdzCisgIC8vIFNSR0IsIGEgcHJvZmlsZSBQREZpdW0gcmVjb2duaXplcyBidXQgZG9lcyBub3Qgc3VwcG9ydCB3ZWxsLCB0aGVuIHRyeSB0aGUKKyAgLy8gYWx0ZXJuYXRlIHByb2ZpbGUuCisgIGlmICghbV9wUHJvZmlsZS0+SXNTdXBwb3J0ZWQoKSAmJgorICAgICAgIUZpbmRBbHRlcm5hdGVQcm9maWxlKHBEb2MsIHBEaWN0LCBwVmlzaXRlZCwgbkNvbXBvbmVudHMpKSB7CisgICAgLy8gSWYgdGhlcmUgaXMgbm8gYWx0ZXJuYXRlIHByb2ZpbGUsIHVzZSBhIHN0b2NrIHByb2ZpbGUgYXMgbWVudGlvbmVkIGluCisgICAgLy8gdGhlIFBERiAxLjcgc3BlYyBpbiB0YWJsZSA0LjE2IGluIHRoZSAiQWx0ZXJuYXRlIiBrZXkgZGVzY3JpcHRpb24uCisgICAgQVNTRVJUKCFtX3BBbHRlckNTKTsKKyAgICBtX3BBbHRlckNTID0gR2V0U3RvY2tBbHRlcm5hdGVQcm9maWxlKG5Db21wb25lbnRzKTsKICAgfQotICBDUERGX0FycmF5KiBwUmFuZ2VzID0gcERpY3QtPkdldEFycmF5Rm9yKCJSYW5nZSIpOwotICBtX3BSYW5nZXMgPSBGWF9BbGxvYzJEKEZYX0ZMT0FULCBtX25Db21wb25lbnRzLCAyKTsKLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fbkNvbXBvbmVudHMgKiAyOyBpKyspIHsKLSAgICBpZiAocFJhbmdlcykKLSAgICAgIG1fcFJhbmdlc1tpXSA9IHBSYW5nZXMtPkdldE51bWJlckF0KGkpOwotICAgIGVsc2UgaWYgKGkgJSAyKQotICAgICAgbV9wUmFuZ2VzW2ldID0gMS4wZjsKLSAgICBlbHNlCi0gICAgICBtX3BSYW5nZXNbaV0gPSAwOwotICB9Ci0gIHJldHVybiB0cnVlOworCisgIG1fcFJhbmdlcyA9IEdldFJhbmdlcyhwRGljdCwgbkNvbXBvbmVudHMpOworICByZXR1cm4gbkNvbXBvbmVudHM7CiB9CiAKLWJvb2wgQ1BERl9JQ0NCYXNlZENTOjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpIGNvbnN0IHsKLSAgaWYgKG1fcFByb2ZpbGUgJiYgbV9wUHJvZmlsZS0+bV9ic1JHQikgewotICAgIFIgPSBwQnVmWzBdOwotICAgIEcgPSBwQnVmWzFdOwotICAgIEIgPSBwQnVmWzJdOworYm9vbCBDUERGX0lDQ0Jhc2VkQ1M6OkdldFJHQihmbG9hdCogcEJ1ZiwgZmxvYXQqIFIsIGZsb2F0KiBHLCBmbG9hdCogQikgY29uc3QgeworICBBU1NFUlQobV9wUHJvZmlsZSk7CisgIGlmIChJc1NSR0IoKSkgeworICAgICpSID0gcEJ1ZlswXTsKKyAgICAqRyA9IHBCdWZbMV07CisgICAgKkIgPSBwQnVmWzJdOwogICAgIHJldHVybiB0cnVlOwogICB9Ci0gIENDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEljY01vZHVsZSgpOwotICBpZiAoIW1fcFByb2ZpbGUtPm1fcFRyYW5zZm9ybSB8fCAhcEljY01vZHVsZSkgewotICAgIGlmIChtX3BBbHRlckNTKQotICAgICAgcmV0dXJuIG1fcEFsdGVyQ1MtPkdldFJHQihwQnVmLCBSLCBHLCBCKTsKLQotICAgIFIgPSAwLjBmOwotICAgIEcgPSAwLjBmOwotICAgIEIgPSAwLjBmOworICBpZiAobV9wUHJvZmlsZS0+dHJhbnNmb3JtKCkpIHsKKyAgICBmbG9hdCByZ2JbM107CisgICAgQ0NvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SWNjTW9kdWxlKCk7CisgICAgcEljY01vZHVsZS0+U2V0Q29tcG9uZW50cyhDb3VudENvbXBvbmVudHMoKSk7CisgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlKG1fcFByb2ZpbGUtPnRyYW5zZm9ybSgpLCBwQnVmLCByZ2IpOworICAgICpSID0gcmdiWzBdOworICAgICpHID0gcmdiWzFdOworICAgICpCID0gcmdiWzJdOwogICAgIHJldHVybiB0cnVlOwogICB9Ci0gIEZYX0ZMT0FUIHJnYlszXTsKLSAgcEljY01vZHVsZS0+U2V0Q29tcG9uZW50cyhtX25Db21wb25lbnRzKTsKLSAgcEljY01vZHVsZS0+VHJhbnNsYXRlKG1fcFByb2ZpbGUtPm1fcFRyYW5zZm9ybSwgcEJ1ZiwgcmdiKTsKLSAgUiA9IHJnYlswXTsKLSAgRyA9IHJnYlsxXTsKLSAgQiA9IHJnYlsyXTsKLSAgcmV0dXJuIHRydWU7Ci19CiAKLWJvb2wgQ1BERl9JQ0NCYXNlZENTOjpTZXRSR0IoRlhfRkxPQVQqIHBCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEIpIGNvbnN0IHsKLSAgcmV0dXJuIGZhbHNlOwotfQorICBpZiAobV9wQWx0ZXJDUykKKyAgICByZXR1cm4gbV9wQWx0ZXJDUy0+R2V0UkdCKHBCdWYsIFIsIEcsIEIpOwogCi1ib29sIENQREZfSUNDQmFzZWRDUzo6dl9HZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgaykgY29uc3QgewotICBpZiAobV9uQ29tcG9uZW50cyAhPSA0KQotICAgIHJldHVybiBmYWxzZTsKLQotICBjID0gcEJ1ZlswXTsKLSAgbSA9IHBCdWZbMV07Ci0gIHkgPSBwQnVmWzJdOwotICBrID0gcEJ1ZlszXTsKKyAgKlIgPSAwLjBmOworICAqRyA9IDAuMGY7CisgICpCID0gMC4wZjsKICAgcmV0dXJuIHRydWU7CiB9CiAKQEAgLTk1MCwxMjMgKzg3OCwyMDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJUcmFuc01hc2spIGNvbnN0IHsKLSAgaWYgKG1fcFByb2ZpbGUtPm1fYnNSR0IpIHsKKyAgaWYgKElzU1JHQigpKSB7CiAgICAgUmV2ZXJzZVJHQihwRGVzdEJ1ZiwgcFNyY0J1ZiwgcGl4ZWxzKTsKLSAgfSBlbHNlIGlmIChtX3BQcm9maWxlLT5tX3BUcmFuc2Zvcm0pIHsKLSAgICBpbnQgbk1heENvbG9ycyA9IDE7Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fbkNvbXBvbmVudHM7IGkrKykgewotICAgICAgbk1heENvbG9ycyAqPSA1MjsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFtX3BQcm9maWxlLT50cmFuc2Zvcm0oKSkgeworICAgIGlmIChtX3BBbHRlckNTKSB7CisgICAgICBtX3BBbHRlckNTLT5UcmFuc2xhdGVJbWFnZUxpbmUocERlc3RCdWYsIHBTcmNCdWYsIHBpeGVscywgaW1hZ2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfaGVpZ2h0LCBmYWxzZSk7CiAgICAgfQotICAgIGlmIChtX25Db21wb25lbnRzID4gMyB8fCBpbWFnZV93aWR0aCAqIGltYWdlX2hlaWdodCA8IG5NYXhDb2xvcnMgKiAzIC8gMikgewotICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRJY2NNb2R1bGUoKS0+VHJhbnNsYXRlU2NhbmxpbmUoCi0gICAgICAgICAgbV9wUHJvZmlsZS0+bV9wVHJhbnNmb3JtLCBwRGVzdEJ1ZiwgcFNyY0J1ZiwgcGl4ZWxzKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKCFtX3BDYWNoZSkgewotICAgICAgICAoKENQREZfSUNDQmFzZWRDUyopdGhpcyktPm1fcENhY2hlID0gRlhfQWxsb2MyRCh1aW50OF90LCBuTWF4Q29sb3JzLCAzKTsKLSAgICAgICAgdWludDhfdCogdGVtcF9zcmMgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIG5NYXhDb2xvcnMsIG1fbkNvbXBvbmVudHMpOwotICAgICAgICB1aW50OF90KiBwU3JjID0gdGVtcF9zcmM7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbk1heENvbG9yczsgaSsrKSB7Ci0gICAgICAgICAgdWludDMyX3QgY29sb3IgPSBpOwotICAgICAgICAgIHVpbnQzMl90IG9yZGVyID0gbk1heENvbG9ycyAvIDUyOwotICAgICAgICAgIGZvciAodWludDMyX3QgYyA9IDA7IGMgPCBtX25Db21wb25lbnRzOyBjKyspIHsKLSAgICAgICAgICAgICpwU3JjKysgPSAodWludDhfdCkoY29sb3IgLyBvcmRlciAqIDUpOwotICAgICAgICAgICAgY29sb3IgJT0gb3JkZXI7Ci0gICAgICAgICAgICBvcmRlciAvPSA1MjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRJY2NNb2R1bGUoKS0+VHJhbnNsYXRlU2NhbmxpbmUoCi0gICAgICAgICAgICBtX3BQcm9maWxlLT5tX3BUcmFuc2Zvcm0sIG1fcENhY2hlLCB0ZW1wX3NyYywgbk1heENvbG9ycyk7Ci0gICAgICAgIEZYX0ZyZWUodGVtcF9zcmMpOwotICAgICAgfQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHM7IGkrKykgewotICAgICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgICBmb3IgKHVpbnQzMl90IGMgPSAwOyBjIDwgbV9uQ29tcG9uZW50czsgYysrKSB7Ci0gICAgICAgICAgaW5kZXggPSBpbmRleCAqIDUyICsgKCpwU3JjQnVmKSAvIDU7Ci0gICAgICAgICAgcFNyY0J1ZisrOwotICAgICAgICB9Ci0gICAgICAgIGluZGV4ICo9IDM7Ci0gICAgICAgICpwRGVzdEJ1ZisrID0gbV9wQ2FjaGVbaW5kZXhdOwotICAgICAgICAqcERlc3RCdWYrKyA9IG1fcENhY2hlW2luZGV4ICsgMV07Ci0gICAgICAgICpwRGVzdEJ1ZisrID0gbV9wQ2FjaGVbaW5kZXggKyAyXTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyB8bk1heENvbG9yc3wgd2lsbCBub3Qgb3ZlcmZsb3cgc2luY2UgfG5Db21wb25lbnRzfCBpcyBsaW1pdGVkIGluIHNpemUuCisgIGNvbnN0IHVpbnQzMl90IG5Db21wb25lbnRzID0gQ291bnRDb21wb25lbnRzKCk7CisgIEFTU0VSVChJc1ZhbGlkQ29tcG9uZW50cyhuQ29tcG9uZW50cykpOworICBpbnQgbk1heENvbG9ycyA9IDE7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuQ29tcG9uZW50czsgaSsrKQorICAgIG5NYXhDb2xvcnMgKj0gNTI7CisKKyAgYm9vbCBiVHJhbnNsYXRlID0gbkNvbXBvbmVudHMgPiAzOworICBpZiAoIWJUcmFuc2xhdGUpIHsKKyAgICBGWF9TQUZFX0lOVDMyIG5QaXhlbENvdW50ID0gaW1hZ2Vfd2lkdGg7CisgICAgblBpeGVsQ291bnQgKj0gaW1hZ2VfaGVpZ2h0OworICAgIGlmIChuUGl4ZWxDb3VudC5Jc1ZhbGlkKCkpCisgICAgICBiVHJhbnNsYXRlID0gblBpeGVsQ291bnQuVmFsdWVPckRpZSgpIDwgbk1heENvbG9ycyAqIDMgLyAyOworICB9CisgIGlmIChiVHJhbnNsYXRlKSB7CisgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRJY2NNb2R1bGUoKS0+VHJhbnNsYXRlU2NhbmxpbmUoCisgICAgICAgIG1fcFByb2ZpbGUtPnRyYW5zZm9ybSgpLCBwRGVzdEJ1ZiwgcFNyY0J1ZiwgcGl4ZWxzKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoIW1fcENhY2hlKSB7CisgICAgbV9wQ2FjaGUucmVzZXQoRlhfQWxsb2MyRCh1aW50OF90LCBuTWF4Q29sb3JzLCAzKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IHRlbXBfc3JjKAorICAgICAgICBGWF9BbGxvYzJEKHVpbnQ4X3QsIG5NYXhDb2xvcnMsIG5Db21wb25lbnRzKSk7CisgICAgdWludDhfdCogcFNyYyA9IHRlbXBfc3JjLmdldCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbk1heENvbG9yczsgaSsrKSB7CisgICAgICB1aW50MzJfdCBjb2xvciA9IGk7CisgICAgICB1aW50MzJfdCBvcmRlciA9IG5NYXhDb2xvcnMgLyA1MjsKKyAgICAgIGZvciAodWludDMyX3QgYyA9IDA7IGMgPCBuQ29tcG9uZW50czsgYysrKSB7CisgICAgICAgICpwU3JjKysgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb2xvciAvIG9yZGVyICogNSk7CisgICAgICAgIGNvbG9yICU9IG9yZGVyOworICAgICAgICBvcmRlciAvPSA1MjsKICAgICAgIH0KICAgICB9Ci0gIH0gZWxzZSBpZiAobV9wQWx0ZXJDUykgewotICAgIG1fcEFsdGVyQ1MtPlRyYW5zbGF0ZUltYWdlTGluZShwRGVzdEJ1ZiwgcFNyY0J1ZiwgcGl4ZWxzLCBpbWFnZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfaGVpZ2h0KTsKKyAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEljY01vZHVsZSgpLT5UcmFuc2xhdGVTY2FubGluZSgKKyAgICAgICAgbV9wUHJvZmlsZS0+dHJhbnNmb3JtKCksIG1fcENhY2hlLmdldCgpLCB0ZW1wX3NyYy5nZXQoKSwgbk1heENvbG9ycyk7CisgIH0KKyAgdWludDhfdCogcENhY2hlUHRyID0gbV9wQ2FjaGUuZ2V0KCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpKyspIHsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIGZvciAodWludDMyX3QgYyA9IDA7IGMgPCBuQ29tcG9uZW50czsgYysrKSB7CisgICAgICBpbmRleCA9IGluZGV4ICogNTIgKyAoKnBTcmNCdWYpIC8gNTsKKyAgICAgIHBTcmNCdWYrKzsKKyAgICB9CisgICAgaW5kZXggKj0gMzsKKyAgICAqcERlc3RCdWYrKyA9IHBDYWNoZVB0cltpbmRleF07CisgICAgKnBEZXN0QnVmKysgPSBwQ2FjaGVQdHJbaW5kZXggKyAxXTsKKyAgICAqcERlc3RCdWYrKyA9IHBDYWNoZVB0cltpbmRleCArIDJdOwogICB9CiB9CiAKK2Jvb2wgQ1BERl9JQ0NCYXNlZENTOjpGaW5kQWx0ZXJuYXRlUHJvZmlsZShDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8Q1BERl9PYmplY3QqPiogcFZpc2l0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkV4cGVjdGVkQ29tcG9uZW50cykgeworICBDUERGX09iamVjdCogcEFsdGVyQ1NPYmogPSBwRGljdC0+R2V0RGlyZWN0T2JqZWN0Rm9yKCJBbHRlcm5hdGUiKTsKKyAgaWYgKCFwQWx0ZXJDU09iaikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYXV0byBwQWx0ZXJDUyA9IENQREZfQ29sb3JTcGFjZTo6TG9hZChwRG9jLCBwQWx0ZXJDU09iaiwgcFZpc2l0ZWQpOworICBpZiAoIXBBbHRlckNTKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAocEFsdGVyQ1MtPkdldEZhbWlseSgpID09IFBERkNTX1BBVFRFUk4pCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChwQWx0ZXJDUy0+Q291bnRDb21wb25lbnRzKCkgIT0gbkV4cGVjdGVkQ29tcG9uZW50cykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbV9wQWx0ZXJDUyA9IHN0ZDo6bW92ZShwQWx0ZXJDUyk7CisgIHJldHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK0NQREZfQ29sb3JTcGFjZSogQ1BERl9JQ0NCYXNlZENTOjpHZXRTdG9ja0FsdGVybmF0ZVByb2ZpbGUoCisgICAgdWludDMyX3QgbkNvbXBvbmVudHMpIHsKKyAgaWYgKG5Db21wb25lbnRzID09IDEpCisgICAgcmV0dXJuIEdldFN0b2NrQ1MoUERGQ1NfREVWSUNFR1JBWSk7CisgIGlmIChuQ29tcG9uZW50cyA9PSAzKQorICAgIHJldHVybiBHZXRTdG9ja0NTKFBERkNTX0RFVklDRVJHQik7CisgIGlmIChuQ29tcG9uZW50cyA9PSA0KQorICAgIHJldHVybiBHZXRTdG9ja0NTKFBERkNTX0RFVklDRUNNWUspOworICBOT1RSRUFDSEVEKCk7CisgIHJldHVybiBudWxscHRyOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQ1BERl9JQ0NCYXNlZENTOjpJc1ZhbGlkQ29tcG9uZW50cyhpbnQzMl90IG5Db21wcykgeworICByZXR1cm4gbkNvbXBzID09IDEgfHwgbkNvbXBzID09IDMgfHwgbkNvbXBzID09IDQ7Cit9CisKKy8vIHN0YXRpYworc3RkOjp2ZWN0b3I8ZmxvYXQ+IENQREZfSUNDQmFzZWRDUzo6R2V0UmFuZ2VzKENQREZfRGljdGlvbmFyeSogcERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkNvbXBvbmVudHMpIHsKKyAgQVNTRVJUKElzVmFsaWRDb21wb25lbnRzKG5Db21wb25lbnRzKSk7CisKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHJhbmdlczsKKyAgcmFuZ2VzLnJlc2VydmUobkNvbXBvbmVudHMgKiAyKTsKKyAgQ1BERl9BcnJheSogcFJhbmdlcyA9IHBEaWN0LT5HZXRBcnJheUZvcigiUmFuZ2UiKTsKKyAgaWYgKHBSYW5nZXMpIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbkNvbXBvbmVudHMgKiAyOyBpKyspIHsKKyAgICAgIHJhbmdlcy5wdXNoX2JhY2socFJhbmdlcy0+R2V0TnVtYmVyQXQoaSkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbkNvbXBvbmVudHM7IGkrKykgeworICAgICAgcmFuZ2VzLnB1c2hfYmFjaygwLjBmKTsKKyAgICAgIHJhbmdlcy5wdXNoX2JhY2soMS4wZik7CisgICAgfQorICB9CisgIHJldHVybiByYW5nZXM7Cit9CisKIENQREZfSW5kZXhlZENTOjpDUERGX0luZGV4ZWRDUyhDUERGX0RvY3VtZW50KiBwRG9jKQotICAgIDogQ1BERl9Db2xvclNwYWNlKHBEb2MsIFBERkNTX0lOREVYRUQsIDEpLAotICAgICAgbV9wQmFzZUNTKG51bGxwdHIpLAotICAgICAgbV9wQ291bnRlZEJhc2VDUyhudWxscHRyKSwKLSAgICAgIG1fcENvbXBNaW5NYXgobnVsbHB0cikge30KKyAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBQREZDU19JTkRFWEVEKSB7fQogCiBDUERGX0luZGV4ZWRDUzo6fkNQREZfSW5kZXhlZENTKCkgewogICBGWF9GcmVlKG1fcENvbXBNaW5NYXgpOwogICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IG1fcENvdW50ZWRCYXNlQ1MgPyBtX3BDb3VudGVkQmFzZUNTLT5nZXQoKSA6IG51bGxwdHI7CiAgIGlmIChwQ1MgJiYgbV9wRG9jdW1lbnQpIHsKLSAgICBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+UmVsZWFzZUNvbG9yU3BhY2UocENTLT5HZXRBcnJheSgpKTsKKyAgICBhdXRvKiBwUGFnZURhdGEgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKTsKKyAgICBpZiAocFBhZ2VEYXRhKQorICAgICAgcFBhZ2VEYXRhLT5SZWxlYXNlQ29sb3JTcGFjZShwQ1MtPkdldEFycmF5KCkpOwogICB9CiB9CiAKLWJvb2wgQ1BERl9JbmRleGVkQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0FycmF5KiBwQXJyYXkpIHsKLSAgaWYgKHBBcnJheS0+R2V0Q291bnQoKSA8IDQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KK3VpbnQzMl90IENQREZfSW5kZXhlZENTOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxDUERGX09iamVjdCo+KiBwVmlzaXRlZCkgeworICBpZiAocEFycmF5LT5HZXRDb3VudCgpIDwgNCkKKyAgICByZXR1cm4gMDsKKwogICBDUERGX09iamVjdCogcEJhc2VPYmogPSBwQXJyYXktPkdldERpcmVjdE9iamVjdEF0KDEpOwotICBpZiAocEJhc2VPYmogPT0gbV9wQXJyYXkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KKyAgaWYgKHBCYXNlT2JqID09IG1fcEFycmF5KQorICAgIHJldHVybiAwOworCiAgIENQREZfRG9jUGFnZURhdGEqIHBEb2NQYWdlRGF0YSA9IHBEb2MtPkdldFBhZ2VEYXRhKCk7Ci0gIG1fcEJhc2VDUyA9IHBEb2NQYWdlRGF0YS0+R2V0Q29sb3JTcGFjZShwQmFzZU9iaiwgbnVsbHB0cik7Ci0gIGlmICghbV9wQmFzZUNTKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9CisgIG1fcEJhc2VDUyA9IHBEb2NQYWdlRGF0YS0+R2V0Q29sb3JTcGFjZUd1YXJkZWQocEJhc2VPYmosIG51bGxwdHIsIHBWaXNpdGVkKTsKKyAgaWYgKCFtX3BCYXNlQ1MpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gVGhlIGJhc2UgY29sb3Igc3BhY2UgY2Fubm90IGJlIGEgUGF0dGVybiBvciBJbmRleGVkIHNwYWNlLCBhY2NvcmRpbmcgdG8gdGhlCisgIC8vIFBERiAxLjcgc3BlYywgcGFnZSAyNjMuCisgIGludCBmYW1pbHkgPSBtX3BCYXNlQ1MtPkdldEZhbWlseSgpOworICBpZiAoZmFtaWx5ID09IFBERkNTX0lOREVYRUQgfHwgZmFtaWx5ID09IFBERkNTX1BBVFRFUk4pCisgICAgcmV0dXJuIDA7CisKICAgbV9wQ291bnRlZEJhc2VDUyA9IHBEb2NQYWdlRGF0YS0+RmluZENvbG9yU3BhY2VQdHIobV9wQmFzZUNTLT5HZXRBcnJheSgpKTsKICAgbV9uQmFzZUNvbXBvbmVudHMgPSBtX3BCYXNlQ1MtPkNvdW50Q29tcG9uZW50cygpOwotICBtX3BDb21wTWluTWF4ID0gRlhfQWxsb2MyRChGWF9GTE9BVCwgbV9uQmFzZUNvbXBvbmVudHMsIDIpOwotICBGWF9GTE9BVCBkZWZ2YWx1ZTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25CYXNlQ29tcG9uZW50czsgaSsrKSB7Ci0gICAgbV9wQmFzZUNTLT5HZXREZWZhdWx0VmFsdWUoaSwgZGVmdmFsdWUsIG1fcENvbXBNaW5NYXhbaSAqIDJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENvbXBNaW5NYXhbaSAqIDIgKyAxXSk7CisgIG1fcENvbXBNaW5NYXggPSBGWF9BbGxvYzJEKGZsb2F0LCBtX25CYXNlQ29tcG9uZW50cywgMik7CisgIGZsb2F0IGRlZnZhbHVlOworICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9uQmFzZUNvbXBvbmVudHM7IGkrKykgeworICAgIG1fcEJhc2VDUy0+R2V0RGVmYXVsdFZhbHVlKGksICZkZWZ2YWx1ZSwgJm1fcENvbXBNaW5NYXhbaSAqIDJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX3BDb21wTWluTWF4W2kgKiAyICsgMV0pOwogICAgIG1fcENvbXBNaW5NYXhbaSAqIDIgKyAxXSAtPSBtX3BDb21wTWluTWF4W2kgKiAyXTsKICAgfQogICBtX01heEluZGV4ID0gcEFycmF5LT5HZXRJbnRlZ2VyQXQoMik7CiAKICAgQ1BERl9PYmplY3QqIHBUYWJsZU9iaiA9IHBBcnJheS0+R2V0RGlyZWN0T2JqZWN0QXQoMyk7CiAgIGlmICghcFRhYmxlT2JqKQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gMDsKIAogICBpZiAoQ1BERl9TdHJpbmcqIHBTdHJpbmcgPSBwVGFibGVPYmotPkFzU3RyaW5nKCkpIHsKICAgICBtX1RhYmxlID0gcFN0cmluZy0+R2V0U3RyaW5nKCk7CiAgIH0gZWxzZSBpZiAoQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwVGFibGVPYmotPkFzU3RyZWFtKCkpIHsKLSAgICBDUERGX1N0cmVhbUFjYyBhY2M7Ci0gICAgYWNjLkxvYWRBbGxEYXRhKHBTdHJlYW0sIGZhbHNlKTsKLSAgICBtX1RhYmxlID0gQ0ZYX0J5dGVTdHJpbmdDKGFjYy5HZXREYXRhKCksIGFjYy5HZXRTaXplKCkpOworICAgIGF1dG8gcEFjYyA9IHBkZml1bTo6TWFrZVJldGFpbjxDUERGX1N0cmVhbUFjYz4ocFN0cmVhbSk7CisgICAgcEFjYy0+TG9hZEFsbERhdGFGaWx0ZXJlZCgpOworICAgIG1fVGFibGUgPSBCeXRlU3RyaW5nVmlldyhwQWNjLT5HZXREYXRhKCksIHBBY2MtPkdldFNpemUoKSk7CiAgIH0KLSAgcmV0dXJuIHRydWU7CisgIHJldHVybiAxOwogfQogCi1ib29sIENQREZfSW5kZXhlZENTOjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpIGNvbnN0IHsKLSAgaW50IGluZGV4ID0gKGludDMyX3QpKCpwQnVmKTsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IG1fTWF4SW5kZXgpIHsKK2Jvb2wgQ1BERl9JbmRleGVkQ1M6OkdldFJHQihmbG9hdCogcEJ1ZiwgZmxvYXQqIFIsIGZsb2F0KiBHLCBmbG9hdCogQikgY29uc3QgeworICBpbnQzMl90IGluZGV4ID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oKnBCdWYpOworICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gbV9NYXhJbmRleCkKICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KKwogICBpZiAobV9uQmFzZUNvbXBvbmVudHMpIHsKLSAgICBpZiAoaW5kZXggPT0gSU5UX01BWCB8fCAoaW5kZXggKyAxKSA+IElOVF9NQVggLyBtX25CYXNlQ29tcG9uZW50cyB8fAotICAgICAgICAoaW5kZXggKyAxKSAqIG1fbkJhc2VDb21wb25lbnRzID4gKGludCltX1RhYmxlLkdldExlbmd0aCgpKSB7Ci0gICAgICBSID0gRyA9IEIgPSAwOworICAgIEZYX1NBRkVfU0laRV9UIGxlbmd0aCA9IGluZGV4OworICAgIGxlbmd0aCArPSAxOworICAgIGxlbmd0aCAqPSBtX25CYXNlQ29tcG9uZW50czsKKyAgICBpZiAoIWxlbmd0aC5Jc1ZhbGlkKCkgfHwgbGVuZ3RoLlZhbHVlT3JEaWUoKSA+IG1fVGFibGUuR2V0TGVuZ3RoKCkpIHsKKyAgICAgICpSID0gMDsKKyAgICAgICpHID0gMDsKKyAgICAgICpCID0gMDsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgIH0KLSAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IENvbXBzKG1fbkJhc2VDb21wb25lbnRzKTsKLSAgRlhfRkxPQVQqIGNvbXBzID0gQ29tcHM7CisgIENGWF9GaXhlZEJ1Zkdyb3c8ZmxvYXQsIDE2PiBDb21wcyhtX25CYXNlQ29tcG9uZW50cyk7CisgIGZsb2F0KiBjb21wcyA9IENvbXBzOwogICBjb25zdCB1aW50OF90KiBwVGFibGUgPSBtX1RhYmxlLnJhd19zdHIoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX25CYXNlQ29tcG9uZW50czsgaSsrKSB7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX25CYXNlQ29tcG9uZW50czsgaSsrKSB7CiAgICAgY29tcHNbaV0gPQogICAgICAgICBtX3BDb21wTWluTWF4W2kgKiAyXSArCiAgICAgICAgIG1fcENvbXBNaW5NYXhbaSAqIDIgKyAxXSAqIHBUYWJsZVtpbmRleCAqIG1fbkJhc2VDb21wb25lbnRzICsgaV0gLyAyNTU7CkBAIC0xMDc0LDExMyArMTA4OCw2MCBAQAogICByZXR1cm4gbV9wQmFzZUNTLT5HZXRSR0IoY29tcHMsIFIsIEcsIEIpOwogfQogCi1DUERGX0NvbG9yU3BhY2UqIENQREZfSW5kZXhlZENTOjpHZXRCYXNlQ1MoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BCYXNlQ1M7Ci19Ci0KIHZvaWQgQ1BERl9JbmRleGVkQ1M6OkVuYWJsZVN0ZENvbnZlcnNpb24oYm9vbCBiRW5hYmxlZCkgewogICBDUERGX0NvbG9yU3BhY2U6OkVuYWJsZVN0ZENvbnZlcnNpb24oYkVuYWJsZWQpOwotICBpZiAobV9wQmFzZUNTKSB7CisgIGlmIChtX3BCYXNlQ1MpCiAgICAgbV9wQmFzZUNTLT5FbmFibGVTdGRDb252ZXJzaW9uKGJFbmFibGVkKTsKLSAgfQotfQotCi1DUERGX1BhdHRlcm5DUzo6Q1BERl9QYXR0ZXJuQ1MoQ1BERl9Eb2N1bWVudCogcERvYykKLSAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBQREZDU19QQVRURVJOLCAxKSwKLSAgICAgIG1fcEJhc2VDUyhudWxscHRyKSwKLSAgICAgIG1fcENvdW50ZWRCYXNlQ1MobnVsbHB0cikge30KLQotQ1BERl9QYXR0ZXJuQ1M6On5DUERGX1BhdHRlcm5DUygpIHsKLSAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBtX3BDb3VudGVkQmFzZUNTID8gbV9wQ291bnRlZEJhc2VDUy0+Z2V0KCkgOiBudWxscHRyOwotICBpZiAocENTICYmIG1fcERvY3VtZW50KSB7Ci0gICAgbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VDb2xvclNwYWNlKHBDUy0+R2V0QXJyYXkoKSk7Ci0gIH0KLX0KLQotYm9vbCBDUERGX1BhdHRlcm5DUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgewotICBDUERGX09iamVjdCogcEJhc2VDUyA9IHBBcnJheS0+R2V0RGlyZWN0T2JqZWN0QXQoMSk7Ci0gIGlmIChwQmFzZUNTID09IG1fcEFycmF5KSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIENQREZfRG9jUGFnZURhdGEqIHBEb2NQYWdlRGF0YSA9IHBEb2MtPkdldFBhZ2VEYXRhKCk7Ci0gIG1fcEJhc2VDUyA9IHBEb2NQYWdlRGF0YS0+R2V0Q29sb3JTcGFjZShwQmFzZUNTLCBudWxscHRyKTsKLSAgaWYgKG1fcEJhc2VDUykgewotICAgIGlmIChtX3BCYXNlQ1MtPkdldEZhbWlseSgpID09IFBERkNTX1BBVFRFUk4pIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgbV9wQ291bnRlZEJhc2VDUyA9IHBEb2NQYWdlRGF0YS0+RmluZENvbG9yU3BhY2VQdHIobV9wQmFzZUNTLT5HZXRBcnJheSgpKTsKLSAgICBtX25Db21wb25lbnRzID0gbV9wQmFzZUNTLT5Db3VudENvbXBvbmVudHMoKSArIDE7Ci0gICAgaWYgKG1fcEJhc2VDUy0+Q291bnRDb21wb25lbnRzKCkgPiBNQVhfUEFUVEVSTl9DT0xPUkNPTVBTKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9IGVsc2UgewotICAgIG1fbkNvbXBvbmVudHMgPSAxOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENQREZfUGF0dGVybkNTOjpHZXRSR0IoRlhfRkxPQVQqIHBCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpIGNvbnN0IHsKLSAgaWYgKG1fcEJhc2VDUykgewotICAgIEFTU0VSVChtX3BCYXNlQ1MtPkdldEZhbWlseSgpICE9IFBERkNTX1BBVFRFUk4pOwotICAgIFBhdHRlcm5WYWx1ZSogcHZhbHVlID0gKFBhdHRlcm5WYWx1ZSopcEJ1ZjsKLSAgICBpZiAobV9wQmFzZUNTLT5HZXRSR0IocHZhbHVlLT5tX0NvbXBzLCBSLCBHLCBCKSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIFIgPSBHID0gQiA9IDAuNzVmOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLUNQREZfQ29sb3JTcGFjZSogQ1BERl9QYXR0ZXJuQ1M6OkdldEJhc2VDUygpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcEJhc2VDUzsKIH0KIAogQ1BERl9TZXBhcmF0aW9uQ1M6OkNQREZfU2VwYXJhdGlvbkNTKENQREZfRG9jdW1lbnQqIHBEb2MpCi0gICAgOiBDUERGX0NvbG9yU3BhY2UocERvYywgUERGQ1NfU0VQQVJBVElPTiwgMSkge30KKyAgICA6IENQREZfQ29sb3JTcGFjZShwRG9jLCBQREZDU19TRVBBUkFUSU9OKSB7fQogCiBDUERGX1NlcGFyYXRpb25DUzo6fkNQREZfU2VwYXJhdGlvbkNTKCkge30KIAogdm9pZCBDUERGX1NlcGFyYXRpb25DUzo6R2V0RGVmYXVsdFZhbHVlKGludCBpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtYXgpIGNvbnN0IHsKLSAgdmFsdWUgPSAxLjBmOwotICBtaW4gPSAwOwotICBtYXggPSAxLjBmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBtYXgpIGNvbnN0IHsKKyAgKnZhbHVlID0gMS4wZjsKKyAgKm1pbiA9IDA7CisgICptYXggPSAxLjBmOwogfQogCi1ib29sIENQREZfU2VwYXJhdGlvbkNTOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KSB7Ci0gIENGWF9CeXRlU3RyaW5nIG5hbWUgPSBwQXJyYXktPkdldFN0cmluZ0F0KDEpOwordWludDMyX3QgQ1BERl9TZXBhcmF0aW9uQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PENQREZfT2JqZWN0Kj4qIHBWaXNpdGVkKSB7CisgIEJ5dGVTdHJpbmcgbmFtZSA9IHBBcnJheS0+R2V0U3RyaW5nQXQoMSk7CiAgIGlmIChuYW1lID09ICJOb25lIikgewogICAgIG1fVHlwZSA9IE5vbmU7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIDE7CiAgIH0KIAogICBtX1R5cGUgPSBDb2xvcmFudDsKICAgQ1BERl9PYmplY3QqIHBBbHRDUyA9IHBBcnJheS0+R2V0RGlyZWN0T2JqZWN0QXQoMik7CiAgIGlmIChwQWx0Q1MgPT0gbV9wQXJyYXkpCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiAwOwogCi0gIG1fcEFsdENTID0gTG9hZChwRG9jLCBwQWx0Q1MpOworICBtX3BBbHRDUyA9IExvYWQocERvYywgcEFsdENTLCBwVmlzaXRlZCk7CiAgIGlmICghbV9wQWx0Q1MpCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiAwOworCisgIGlmIChtX3BBbHRDUy0+SXNTcGVjaWFsKCkpCisgICAgcmV0dXJuIDA7CiAKICAgQ1BERl9PYmplY3QqIHBGdW5jT2JqID0gcEFycmF5LT5HZXREaXJlY3RPYmplY3RBdCgzKTsKLSAgaWYgKHBGdW5jT2JqICYmICFwRnVuY09iai0+SXNOYW1lKCkpCi0gICAgbV9wRnVuYyA9IENQREZfRnVuY3Rpb246OkxvYWQocEZ1bmNPYmopOwotCi0gIGlmIChtX3BGdW5jICYmIG1fcEZ1bmMtPkNvdW50T3V0cHV0cygpIDwgbV9wQWx0Q1MtPkNvdW50Q29tcG9uZW50cygpKQotICAgIG1fcEZ1bmMucmVzZXQoKTsKLSAgcmV0dXJuIHRydWU7CisgIGlmIChwRnVuY09iaiAmJiAhcEZ1bmNPYmotPklzTmFtZSgpKSB7CisgICAgYXV0byBwRnVuYyA9IENQREZfRnVuY3Rpb246OkxvYWQocEZ1bmNPYmopOworICAgIGlmIChwRnVuYyAmJiBwRnVuYy0+Q291bnRPdXRwdXRzKCkgPj0gbV9wQWx0Q1MtPkNvdW50Q29tcG9uZW50cygpKQorICAgICAgbV9wRnVuYyA9IHN0ZDo6bW92ZShwRnVuYyk7CisgIH0KKyAgcmV0dXJuIDE7CiB9CiAKLWJvb2wgQ1BERl9TZXBhcmF0aW9uQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3QgeworYm9vbCBDUERGX1NlcGFyYXRpb25DUzo6R2V0UkdCKGZsb2F0KiBwQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBCKSBjb25zdCB7CiAgIGlmIChtX1R5cGUgPT0gTm9uZSkKICAgICByZXR1cm4gZmFsc2U7CiAKQEAgLTExODksMTUgKzExNTAsMTUgQEAKICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGludCBuQ29tcHMgPSBtX3BBbHRDUy0+Q291bnRDb21wb25lbnRzKCk7Ci0gICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IHJlc3VsdHMobkNvbXBzKTsKKyAgICBDRlhfRml4ZWRCdWZHcm93PGZsb2F0LCAxNj4gcmVzdWx0cyhuQ29tcHMpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvbXBzOyBpKyspCiAgICAgICByZXN1bHRzW2ldID0gKnBCdWY7CiAgICAgcmV0dXJuIG1fcEFsdENTLT5HZXRSR0IocmVzdWx0cywgUiwgRywgQik7CiAgIH0KIAotICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gcmVzdWx0cyhtX3BGdW5jLT5Db3VudE91dHB1dHMoKSk7CisgIENGWF9GaXhlZEJ1Zkdyb3c8ZmxvYXQsIDE2PiByZXN1bHRzKG1fcEZ1bmMtPkNvdW50T3V0cHV0cygpKTsKICAgaW50IG5yZXN1bHRzID0gMDsKLSAgbV9wRnVuYy0+Q2FsbChwQnVmLCAxLCByZXN1bHRzLCBucmVzdWx0cyk7CisgIG1fcEZ1bmMtPkNhbGwocEJ1ZiwgMSwgcmVzdWx0cywgJm5yZXN1bHRzKTsKICAgaWYgKG5yZXN1bHRzID09IDApCiAgICAgcmV0dXJuIGZhbHNlOwogCkBAIC0xMjE3LDQ3ICsxMTc4LDUxIEBACiB9CiAKIENQREZfRGV2aWNlTkNTOjpDUERGX0RldmljZU5DUyhDUERGX0RvY3VtZW50KiBwRG9jKQotICAgIDogQ1BERl9Db2xvclNwYWNlKHBEb2MsIFBERkNTX0RFVklDRU4sIDApIHt9CisgICAgOiBDUERGX0NvbG9yU3BhY2UocERvYywgUERGQ1NfREVWSUNFTikge30KIAogQ1BERl9EZXZpY2VOQ1M6On5DUERGX0RldmljZU5DUygpIHt9CiAKIHZvaWQgQ1BERl9EZXZpY2VOQ1M6OkdldERlZmF1bHRWYWx1ZShpbnQgaUNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIG1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbWF4KSBjb25zdCB7Ci0gIHZhbHVlID0gMS4wZjsKLSAgbWluID0gMDsKLSAgbWF4ID0gMS4wZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbWF4KSBjb25zdCB7CisgICp2YWx1ZSA9IDEuMGY7CisgICptaW4gPSAwOworICAqbWF4ID0gMS4wZjsKIH0KIAotYm9vbCBDUERGX0RldmljZU5DUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgewordWludDMyX3QgQ1BERl9EZXZpY2VOQ1M6OnZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PENQREZfT2JqZWN0Kj4qIHBWaXNpdGVkKSB7CiAgIENQREZfQXJyYXkqIHBPYmogPSBUb0FycmF5KHBBcnJheS0+R2V0RGlyZWN0T2JqZWN0QXQoMSkpOwogICBpZiAoIXBPYmopCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiAwOwogCi0gIG1fbkNvbXBvbmVudHMgPSBwT2JqLT5HZXRDb3VudCgpOwogICBDUERGX09iamVjdCogcEFsdENTID0gcEFycmF5LT5HZXREaXJlY3RPYmplY3RBdCgyKTsKICAgaWYgKCFwQWx0Q1MgfHwgcEFsdENTID09IG1fcEFycmF5KQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gMDsKIAotICBtX3BBbHRDUyA9IExvYWQocERvYywgcEFsdENTKTsKKyAgbV9wQWx0Q1MgPSBMb2FkKHBEb2MsIHBBbHRDUywgcFZpc2l0ZWQpOwogICBtX3BGdW5jID0gQ1BERl9GdW5jdGlvbjo6TG9hZChwQXJyYXktPkdldERpcmVjdE9iamVjdEF0KDMpKTsKICAgaWYgKCFtX3BBbHRDUyB8fCAhbV9wRnVuYykKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIDA7CiAKLSAgcmV0dXJuIG1fcEZ1bmMtPkNvdW50T3V0cHV0cygpID49IG1fcEFsdENTLT5Db3VudENvbXBvbmVudHMoKTsKKyAgaWYgKG1fcEFsdENTLT5Jc1NwZWNpYWwoKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAobV9wRnVuYy0+Q291bnRPdXRwdXRzKCkgPCBtX3BBbHRDUy0+Q291bnRDb21wb25lbnRzKCkpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIHBPYmotPkdldENvdW50KCk7CiB9CiAKLWJvb2wgQ1BERl9EZXZpY2VOQ1M6OkdldFJHQihGWF9GTE9BVCogcEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQikgY29uc3QgeworYm9vbCBDUERGX0RldmljZU5DUzo6R2V0UkdCKGZsb2F0KiBwQnVmLCBmbG9hdCogUiwgZmxvYXQqIEcsIGZsb2F0KiBCKSBjb25zdCB7CiAgIGlmICghbV9wRnVuYykKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IHJlc3VsdHMobV9wRnVuYy0+Q291bnRPdXRwdXRzKCkpOworICBDRlhfRml4ZWRCdWZHcm93PGZsb2F0LCAxNj4gcmVzdWx0cyhtX3BGdW5jLT5Db3VudE91dHB1dHMoKSk7CiAgIGludCBucmVzdWx0cyA9IDA7Ci0gIG1fcEZ1bmMtPkNhbGwocEJ1ZiwgbV9uQ29tcG9uZW50cywgcmVzdWx0cywgbnJlc3VsdHMpOworICBtX3BGdW5jLT5DYWxsKHBCdWYsIENvdW50Q29tcG9uZW50cygpLCByZXN1bHRzLCAmbnJlc3VsdHMpOwogICBpZiAobnJlc3VsdHMgPT0gMCkKICAgICByZXR1cm4gZmFsc2U7CiAKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29sb3JzcGFjZS5oIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb2xvcnNwYWNlLmgKaW5kZXggYzRkNjJlZC4uN2YzYTczOSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb2xvcnNwYWNlLmgKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb2xvcnNwYWNlLmgKQEAgLTgsOSArOCwxMiBAQAogI2RlZmluZSBDT1JFX0ZQREZBUElfUEFHRV9DUERGX0NPTE9SU1BBQ0VfSF8KIAogI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CiAKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhdHRlcm4uaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogCiAjZGVmaW5lIFBERkNTX0RFVklDRUdSQVkgMQogI2RlZmluZSBQREZDU19ERVZJQ0VSR0IgMgpAQCAtMjgsNzggKzMxLDc4IEBACiBjbGFzcyBDUERGX0RvY3VtZW50OwogY2xhc3MgQ1BERl9PYmplY3Q7CiAKK2NvbnN0ZXhwciBzaXplX3Qga01heFBhdHRlcm5Db2xvckNvbXBzID0gMTY7CisKK3N0cnVjdCBQYXR0ZXJuVmFsdWUgeworICBDUERGX1BhdHRlcm4qIG1fcFBhdHRlcm47CisgIENQREZfQ291bnRlZFBhdHRlcm4qIG1fcENvdW50ZWRQYXR0ZXJuOworICBpbnQgbV9uQ29tcHM7CisgIGZsb2F0IG1fQ29tcHNba01heFBhdHRlcm5Db2xvckNvbXBzXTsKK307CisKIGNsYXNzIENQREZfQ29sb3JTcGFjZSB7CiAgcHVibGljOgogICBzdGF0aWMgQ1BERl9Db2xvclNwYWNlKiBHZXRTdG9ja0NTKGludCBGYW1pbHkpOwotICBzdGF0aWMgQ1BERl9Db2xvclNwYWNlKiBDb2xvcnNwYWNlRnJvbU5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOworICBzdGF0aWMgQ1BERl9Db2xvclNwYWNlKiBDb2xvcnNwYWNlRnJvbU5hbWUoY29uc3QgQnl0ZVN0cmluZyYgbmFtZSk7CiAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Db2xvclNwYWNlPiBMb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwQ1NPYmopOworICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPENQREZfQ29sb3JTcGFjZT4gTG9hZCgKKyAgICAgIENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICBDUERGX09iamVjdCogcENTT2JqLAorICAgICAgc3RkOjpzZXQ8Q1BERl9PYmplY3QqPiogcFZpc2l0ZWQpOwogCiAgIHZvaWQgUmVsZWFzZSgpOwogCiAgIGludCBHZXRCdWZTaXplKCkgY29uc3Q7Ci0gIEZYX0ZMT0FUKiBDcmVhdGVCdWYoKTsKLSAgdm9pZCBHZXREZWZhdWx0Q29sb3IoRlhfRkxPQVQqIGJ1ZikgY29uc3Q7CisgIGZsb2F0KiBDcmVhdGVCdWYoKTsKKyAgdm9pZCBHZXREZWZhdWx0Q29sb3IoZmxvYXQqIGJ1ZikgY29uc3Q7CiAgIHVpbnQzMl90IENvdW50Q29tcG9uZW50cygpIGNvbnN0OwogICBpbnQgR2V0RmFtaWx5KCkgY29uc3QgeyByZXR1cm4gbV9GYW1pbHk7IH0KKyAgYm9vbCBJc1NwZWNpYWwoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZhbWlseSgpID09IFBERkNTX1NFUEFSQVRJT04gfHwgR2V0RmFtaWx5KCkgPT0gUERGQ1NfREVWSUNFTiB8fAorICAgICAgICAgICBHZXRGYW1pbHkoKSA9PSBQREZDU19JTkRFWEVEIHx8IEdldEZhbWlseSgpID09IFBERkNTX1BBVFRFUk47CisgIH0KKwogICB2aXJ0dWFsIHZvaWQgR2V0RGVmYXVsdFZhbHVlKGludCBpQ29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtYXgpIGNvbnN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBtYXgpIGNvbnN0OwogCi0gIGJvb2wgc1JHQigpIGNvbnN0OwotICB2aXJ0dWFsIGJvb2wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBTZXRSR0IoRlhfRkxPQVQqIHBCdWYsIEZYX0ZMT0FUIFIsIEZYX0ZMT0FUIEcsIEZYX0ZMT0FUIEIpIGNvbnN0OwotCi0gIGJvb2wgR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKLSAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBjLAotICAgICAgICAgICAgICAgRlhfRkxPQVQmIG0sCi0gICAgICAgICAgICAgICBGWF9GTE9BVCYgeSwKLSAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBrKSBjb25zdDsKLSAgYm9vbCBTZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLAotICAgICAgICAgICAgICAgRlhfRkxPQVQgYywKLSAgICAgICAgICAgICAgIEZYX0ZMT0FUIG0sCi0gICAgICAgICAgICAgICBGWF9GTE9BVCB5LAotICAgICAgICAgICAgICAgRlhfRkxPQVQgaykgY29uc3Q7CisgIHZpcnR1YWwgYm9vbCBHZXRSR0IoZmxvYXQqIHBCdWYsIGZsb2F0KiBSLCBmbG9hdCogRywgZmxvYXQqIEIpIGNvbnN0ID0gMDsKIAogICB2aXJ0dWFsIHZvaWQgVHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIGRlc3RfYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2Vfd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGltYWdlX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJUcmFuc01hc2sgPSBmYWxzZSkgY29uc3Q7Ci0KLSAgQ1BERl9BcnJheSomIEdldEFycmF5KCkgeyByZXR1cm4gbV9wQXJyYXk7IH0KLSAgdmlydHVhbCBDUERGX0NvbG9yU3BhY2UqIEdldEJhc2VDUygpIGNvbnN0OwotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVHJhbnNNYXNrKSBjb25zdDsKICAgdmlydHVhbCB2b2lkIEVuYWJsZVN0ZENvbnZlcnNpb24oYm9vbCBiRW5hYmxlZCk7CiAKLSAgQ1BERl9Eb2N1bWVudCogY29uc3QgbV9wRG9jdW1lbnQ7CisgIENQREZfQXJyYXkqIEdldEFycmF5KCkgY29uc3QgeyByZXR1cm4gbV9wQXJyYXkuR2V0KCk7IH0KKyAgQ1BERl9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BEb2N1bWVudC5HZXQoKTsgfQogCiAgcHJvdGVjdGVkOgotICBDUERGX0NvbG9yU3BhY2UoQ1BERl9Eb2N1bWVudCogcERvYywgaW50IGZhbWlseSwgdWludDMyX3QgbkNvbXBvbmVudHMpOworICBDUERGX0NvbG9yU3BhY2UoQ1BERl9Eb2N1bWVudCogcERvYywgaW50IGZhbWlseSk7CiAgIHZpcnR1YWwgfkNQREZfQ29sb3JTcGFjZSgpOwogCi0gIHZpcnR1YWwgYm9vbCB2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9BcnJheSogcEFycmF5KTsKLSAgdmlydHVhbCBib29sIHZfR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgaykgY29uc3Q7Ci0gIHZpcnR1YWwgYm9vbCB2X1NldENNWUsoRlhfRkxPQVQqIHBCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBtLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaykgY29uc3Q7CisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBjb21wb25lbnRzLCBvciAwIG9uIGZhaWx1cmUuCisgIHZpcnR1YWwgdWludDMyX3Qgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8Q1BERl9PYmplY3QqPiogcFZpc2l0ZWQpID0gMDsKIAotICBpbnQgbV9GYW1pbHk7Ci0gIHVpbnQzMl90IG1fbkNvbXBvbmVudHM7Ci0gIENQREZfQXJyYXkqIG1fcEFycmF5OwotICB1aW50MzJfdCBtX2R3U3RkQ29udmVyc2lvbjsKKyAgLy8gU3RvY2sgY29sb3JzcGFjZXMgYXJlIG5vdCBsb2FkZWQgbm9ybWFsbHkuIFRoaXMgaW5pdGlhbGl6ZXMgdGhlaXIKKyAgLy8gY29tcG9uZW50cyBjb3VudC4KKyAgdm9pZCBTZXRDb21wb25lbnRzRm9yU3RvY2tDUyh1aW50MzJfdCBuQ29tcG9uZW50cyk7CisKKyAgVW5vd25lZFB0cjxDUERGX0RvY3VtZW50PiBjb25zdCBtX3BEb2N1bWVudDsKKyAgVW5vd25lZFB0cjxDUERGX0FycmF5PiBtX3BBcnJheTsKKyAgY29uc3QgaW50IG1fRmFtaWx5OworICB1aW50MzJfdCBtX2R3U3RkQ29udmVyc2lvbiA9IDA7CisKKyBwcml2YXRlOgorICB1aW50MzJfdCBtX25Db21wb25lbnRzID0gMDsKIH07Cit1c2luZyBDUERGX0NvdW50ZWRDb2xvclNwYWNlID0gQ1BERl9Db3VudGVkT2JqZWN0PENQREZfQ29sb3JTcGFjZT47CiAKIG5hbWVzcGFjZSBzdGQgewogCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbG9yc3RhdGUuY3BwIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb2xvcnN0YXRlLmNwcAppbmRleCBjNDNhMzMxLi42OTNmY2YxIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbG9yc3RhdGUuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29sb3JzdGF0ZS5jcHAKQEAgLTcwLDQyICs3MCw0NiBAQAogfQogCiB2b2lkIENQREZfQ29sb3JTdGF0ZTo6U2V0RmlsbENvbG9yKENQREZfQ29sb3JTcGFjZSogcENTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcFZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuVmFsdWVzKSB7CiAgIENvbG9yRGF0YSogcERhdGEgPSBtX1JlZi5HZXRQcml2YXRlQ29weSgpOwogICBTZXRDb2xvcihwRGF0YS0+bV9GaWxsQ29sb3IsIHBEYXRhLT5tX0ZpbGxSR0IsIHBDUywgcFZhbHVlLCBuVmFsdWVzKTsKIH0KIAogdm9pZCBDUERGX0NvbG9yU3RhdGU6OlNldFN0cm9rZUNvbG9yKENQREZfQ29sb3JTcGFjZSogcENTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHBWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuVmFsdWVzKSB7CiAgIENvbG9yRGF0YSogcERhdGEgPSBtX1JlZi5HZXRQcml2YXRlQ29weSgpOwogICBTZXRDb2xvcihwRGF0YS0+bV9TdHJva2VDb2xvciwgcERhdGEtPm1fU3Ryb2tlUkdCLCBwQ1MsIHBWYWx1ZSwgblZhbHVlcyk7CiB9CiAKIHZvaWQgQ1BERl9Db2xvclN0YXRlOjpTZXRGaWxsUGF0dGVybihDUERGX1BhdHRlcm4qIHBQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHBWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuVmFsdWVzKSB7CiAgIENvbG9yRGF0YSogcERhdGEgPSBtX1JlZi5HZXRQcml2YXRlQ29weSgpOwogICBwRGF0YS0+bV9GaWxsQ29sb3IuU2V0VmFsdWUocFBhdHRlcm4sIHBWYWx1ZSwgblZhbHVlcyk7Ci0gIGludCBSLCBHLCBCOwotICBib29sIHJldCA9IHBEYXRhLT5tX0ZpbGxDb2xvci5HZXRSR0IoUiwgRywgQik7CisgIGludCBSOworICBpbnQgRzsKKyAgaW50IEI7CisgIGJvb2wgcmV0ID0gcERhdGEtPm1fRmlsbENvbG9yLkdldFJHQigmUiwgJkcsICZCKTsKICAgaWYgKENQREZfVGlsaW5nUGF0dGVybiogcFRpbGluZ1BhdHRlcm4gPSBwUGF0dGVybi0+QXNUaWxpbmdQYXR0ZXJuKCkpIHsKICAgICBpZiAoIXJldCAmJiBwVGlsaW5nUGF0dGVybi0+Y29sb3JlZCgpKSB7CiAgICAgICBwRGF0YS0+bV9GaWxsUkdCID0gMHgwMEJGQkZCRjsKICAgICAgIHJldHVybjsKICAgICB9CiAgIH0KLSAgcERhdGEtPm1fRmlsbFJHQiA9IHJldCA/IEZYU1lTX1JHQihSLCBHLCBCKSA6ICh1aW50MzJfdCktMTsKKyAgcERhdGEtPm1fRmlsbFJHQiA9IHJldCA/IEZYU1lTX1JHQihSLCBHLCBCKSA6IDB4RkZGRkZGRkY7CiB9CiAKIHZvaWQgQ1BERl9Db2xvclN0YXRlOjpTZXRTdHJva2VQYXR0ZXJuKENQREZfUGF0dGVybiogcFBhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHBWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5WYWx1ZXMpIHsKICAgQ29sb3JEYXRhKiBwRGF0YSA9IG1fUmVmLkdldFByaXZhdGVDb3B5KCk7CiAgIHBEYXRhLT5tX1N0cm9rZUNvbG9yLlNldFZhbHVlKHBQYXR0ZXJuLCBwVmFsdWUsIG5WYWx1ZXMpOwotICBpbnQgUiwgRywgQjsKLSAgYm9vbCByZXQgPSBwRGF0YS0+bV9TdHJva2VDb2xvci5HZXRSR0IoUiwgRywgQik7CisgIGludCBSOworICBpbnQgRzsKKyAgaW50IEI7CisgIGJvb2wgcmV0ID0gcERhdGEtPm1fU3Ryb2tlQ29sb3IuR2V0UkdCKCZSLCAmRywgJkIpOwogICBpZiAoQ1BERl9UaWxpbmdQYXR0ZXJuKiBwVGlsaW5nUGF0dGVybiA9IHBQYXR0ZXJuLT5Bc1RpbGluZ1BhdHRlcm4oKSkgewogICAgIGlmICghcmV0ICYmIHBUaWxpbmdQYXR0ZXJuLT5jb2xvcmVkKCkpIHsKICAgICAgIHBEYXRhLT5tX1N0cm9rZVJHQiA9IDB4MDBCRkJGQkY7CkBAIC0xMTMsMTMgKzExNywxMyBAQAogICAgIH0KICAgfQogICBwRGF0YS0+bV9TdHJva2VSR0IgPQotICAgICAgcERhdGEtPm1fU3Ryb2tlQ29sb3IuR2V0UkdCKFIsIEcsIEIpID8gRlhTWVNfUkdCKFIsIEcsIEIpIDogKHVpbnQzMl90KS0xOworICAgICAgcERhdGEtPm1fU3Ryb2tlQ29sb3IuR2V0UkdCKCZSLCAmRywgJkIpID8gRlhTWVNfUkdCKFIsIEcsIEIpIDogMHhGRkZGRkZGRjsKIH0KIAogdm9pZCBDUERGX0NvbG9yU3RhdGU6OlNldENvbG9yKENQREZfQ29sb3ImIGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiByZ2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcFZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5WYWx1ZXMpIHsKICAgaWYgKHBDUykKICAgICBjb2xvci5TZXRDb2xvclNwYWNlKHBDUyk7CkBAIC0xMzMsNyArMTM3LDcgQEAKICAgaW50IFI7CiAgIGludCBHOwogICBpbnQgQjsKLSAgcmdiID0gY29sb3IuR2V0UkdCKFIsIEcsIEIpID8gRlhTWVNfUkdCKFIsIEcsIEIpIDogKHVpbnQzMl90KS0xOworICByZ2IgPSBjb2xvci5HZXRSR0IoJlIsICZHLCAmQikgPyBGWFNZU19SR0IoUiwgRywgQikgOiAweEZGRkZGRkZGOwogfQogCiBDUERGX0NvbG9yU3RhdGU6OkNvbG9yRGF0YTo6Q29sb3JEYXRhKCkgOiBtX0ZpbGxSR0IoMCksIG1fU3Ryb2tlUkdCKDApIHt9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbG9yc3RhdGUuaCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29sb3JzdGF0ZS5oCmluZGV4IDQ5YzcxYjYuLjk2MTkwNTEgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29sb3JzdGF0ZS5oCisrKyBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29sb3JzdGF0ZS5oCkBAIC04LDkgKzgsOCBAQAogI2RlZmluZSBDT1JFX0ZQREZBUElfUEFHRV9DUERGX0NPTE9SU1RBVEVfSF8KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29sb3IuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9zaGFyZWRfY29weV9vbl93cml0ZS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvc2hhcmVkX2NvcHlfb25fd3JpdGUuaCIKIAogY2xhc3MgQ1BERl9Db2xvcjsKIGNsYXNzIENQREZfQ29sb3JTcGFjZTsKQEAgLTM5LDIzICszOCwxOSBAQAogICBDUERGX0NvbG9yKiBHZXRNdXRhYmxlU3Ryb2tlQ29sb3IoKTsKICAgYm9vbCBIYXNTdHJva2VDb2xvcigpIGNvbnN0OwogCi0gIHZvaWQgU2V0RmlsbENvbG9yKENQREZfQ29sb3JTcGFjZSogcENTLCBGWF9GTE9BVCogcFZhbHVlLCB1aW50MzJfdCBuVmFsdWVzKTsKLSAgdm9pZCBTZXRTdHJva2VDb2xvcihDUERGX0NvbG9yU3BhY2UqIHBDUywgRlhfRkxPQVQqIHBWYWx1ZSwgdWludDMyX3QgblZhbHVlcyk7Ci0gIHZvaWQgU2V0RmlsbFBhdHRlcm4oQ1BERl9QYXR0ZXJuKiBwYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgblZhbHVlcyk7Ci0gIHZvaWQgU2V0U3Ryb2tlUGF0dGVybihDUERGX1BhdHRlcm4qIHBhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgblZhbHVlcyk7CisgIHZvaWQgU2V0RmlsbENvbG9yKENQREZfQ29sb3JTcGFjZSogcENTLCBmbG9hdCogcFZhbHVlLCB1aW50MzJfdCBuVmFsdWVzKTsKKyAgdm9pZCBTZXRTdHJva2VDb2xvcihDUERGX0NvbG9yU3BhY2UqIHBDUywgZmxvYXQqIHBWYWx1ZSwgdWludDMyX3QgblZhbHVlcyk7CisgIHZvaWQgU2V0RmlsbFBhdHRlcm4oQ1BERl9QYXR0ZXJuKiBwYXR0ZXJuLCBmbG9hdCogcFZhbHVlLCB1aW50MzJfdCBuVmFsdWVzKTsKKyAgdm9pZCBTZXRTdHJva2VQYXR0ZXJuKENQREZfUGF0dGVybiogcGF0dGVybiwgZmxvYXQqIHBWYWx1ZSwgdWludDMyX3QgblZhbHVlcyk7CiAKLSAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuICEhbV9SZWY7IH0KKyAgYm9vbCBIYXNSZWYoKSBjb25zdCB7IHJldHVybiAhIW1fUmVmOyB9CiAKICBwcml2YXRlOgotICBjbGFzcyBDb2xvckRhdGEgeworICBjbGFzcyBDb2xvckRhdGEgOiBwdWJsaWMgUmV0YWluYWJsZSB7CiAgICBwdWJsaWM6CiAgICAgQ29sb3JEYXRhKCk7CiAgICAgQ29sb3JEYXRhKGNvbnN0IENvbG9yRGF0YSYgc3JjKTsKLSAgICB+Q29sb3JEYXRhKCk7CisgICAgfkNvbG9yRGF0YSgpIG92ZXJyaWRlOwogCiAgICAgdm9pZCBTZXREZWZhdWx0KCk7CiAKQEAgLTY4LDEwICs2MywxMCBAQAogICB2b2lkIFNldENvbG9yKENQREZfQ29sb3ImIGNvbG9yLAogICAgICAgICAgICAgICAgIHVpbnQzMl90JiByZ2IsCiAgICAgICAgICAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MsCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICBmbG9hdCogcFZhbHVlLAogICAgICAgICAgICAgICAgIHVpbnQzMl90IG5WYWx1ZXMpOwogCi0gIENGWF9TaGFyZWRDb3B5T25Xcml0ZTxDb2xvckRhdGE+IG1fUmVmOworICBTaGFyZWRDb3B5T25Xcml0ZTxDb2xvckRhdGE+IG1fUmVmOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfUEFHRV9DUERGX0NPTE9SU1RBVEVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29udGVudG1hcmsuY3BwIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb250ZW50bWFyay5jcHAKaW5kZXggMDdmMGJkOS4uYzU0ZWY1NSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb250ZW50bWFyay5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb250ZW50bWFyay5jcHAKQEAgLTYsMTEgKzYsOSBAQAogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb250ZW50bWFyay5oIgogCi0jaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHV0aWxpdHk+CiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKIAogQ1BERl9Db250ZW50TWFyazo6Q1BERl9Db250ZW50TWFyaygpIHt9CiAKQEAgLTE5LDI0ICsxNywyMCBAQAogCiBDUERGX0NvbnRlbnRNYXJrOjp+Q1BERl9Db250ZW50TWFyaygpIHt9CiAKLXZvaWQgQ1BERl9Db250ZW50TWFyazo6U2V0TnVsbCgpIHsKLSAgbV9SZWYuU2V0TnVsbCgpOwotfQotCi1pbnQgQ1BERl9Db250ZW50TWFyazo6Q291bnRJdGVtcygpIGNvbnN0IHsKK3NpemVfdCBDUERGX0NvbnRlbnRNYXJrOjpDb3VudEl0ZW1zKCkgY29uc3QgewogICByZXR1cm4gbV9SZWYuR2V0T2JqZWN0KCktPkNvdW50SXRlbXMoKTsKIH0KIAotY29uc3QgQ1BERl9Db250ZW50TWFya0l0ZW0mIENQREZfQ29udGVudE1hcms6OkdldEl0ZW0oaW50IGkpIGNvbnN0IHsKK2NvbnN0IENQREZfQ29udGVudE1hcmtJdGVtJiBDUERGX0NvbnRlbnRNYXJrOjpHZXRJdGVtKHNpemVfdCBpKSBjb25zdCB7CiAgIHJldHVybiBtX1JlZi5HZXRPYmplY3QoKS0+R2V0SXRlbShpKTsKIH0KIAotaW50IENQREZfQ29udGVudE1hcms6OkdldE1DSUQoKSBjb25zdCB7CitpbnQgQ1BERl9Db250ZW50TWFyazo6R2V0TWFya2VkQ29udGVudElEKCkgY29uc3QgewogICBjb25zdCBNYXJrRGF0YSogcERhdGEgPSBtX1JlZi5HZXRPYmplY3QoKTsKLSAgcmV0dXJuIHBEYXRhID8gcERhdGEtPkdldE1DSUQoKSA6IC0xOworICByZXR1cm4gcERhdGEgPyBwRGF0YS0+R2V0TWFya2VkQ29udGVudElEKCkgOiAtMTsKIH0KIAotdm9pZCBDUERGX0NvbnRlbnRNYXJrOjpBZGRNYXJrKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLAordm9pZCBDUERGX0NvbnRlbnRNYXJrOjpBZGRNYXJrKGNvbnN0IEJ5dGVTdHJpbmcmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJEaXJlY3QpIHsKICAgbV9SZWYuR2V0UHJpdmF0ZUNvcHkoKS0+QWRkTWFyayhuYW1lLCBwRGljdCwgYkRpcmVjdCk7CkBAIC00OCwzNCArNDIsNiBAQAogICAgIG1fUmVmLlNldE51bGwoKTsKIH0KIAotYm9vbCBDUERGX0NvbnRlbnRNYXJrOjpIYXNNYXJrKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbWFyaykgY29uc3QgewotICBjb25zdCBNYXJrRGF0YSogcERhdGEgPSBtX1JlZi5HZXRPYmplY3QoKTsKLSAgaWYgKCFwRGF0YSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBwRGF0YS0+Q291bnRJdGVtcygpOyBpKyspIHsKLSAgICBpZiAocERhdGEtPkdldEl0ZW0oaSkuR2V0TmFtZSgpID09IG1hcmspCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1BERl9Db250ZW50TWFyazo6TG9va3VwTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiYgcERpY3QpIGNvbnN0IHsKLSAgY29uc3QgTWFya0RhdGEqIHBEYXRhID0gbV9SZWYuR2V0T2JqZWN0KCk7Ci0gIGlmICghcERhdGEpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgcERhdGEtPkNvdW50SXRlbXMoKTsgaSsrKSB7Ci0gICAgY29uc3QgQ1BERl9Db250ZW50TWFya0l0ZW0mIGl0ZW0gPSBwRGF0YS0+R2V0SXRlbShpKTsKLSAgICBpZiAoaXRlbS5HZXROYW1lKCkgPT0gbWFyaykgewotICAgICAgcERpY3QgPSBpdGVtLkdldFBhcmFtKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCiBDUERGX0NvbnRlbnRNYXJrOjpNYXJrRGF0YTo6TWFya0RhdGEoKSB7fQogCiBDUERGX0NvbnRlbnRNYXJrOjpNYXJrRGF0YTo6TWFya0RhdGEoY29uc3QgTWFya0RhdGEmIHNyYykKQEAgLTgzLDQwICs0OSwzNCBAQAogCiBDUERGX0NvbnRlbnRNYXJrOjpNYXJrRGF0YTo6fk1hcmtEYXRhKCkge30KIAotaW50IENQREZfQ29udGVudE1hcms6Ok1hcmtEYXRhOjpDb3VudEl0ZW1zKCkgY29uc3QgewotICByZXR1cm4gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQ+KG1fTWFya3MpOwotfQotCi1DUERGX0NvbnRlbnRNYXJrSXRlbSYgQ1BERl9Db250ZW50TWFyazo6TWFya0RhdGE6OkdldEl0ZW0oaW50IGluZGV4KSB7Ci0gIHJldHVybiBtX01hcmtzW2luZGV4XTsKK3NpemVfdCBDUERGX0NvbnRlbnRNYXJrOjpNYXJrRGF0YTo6Q291bnRJdGVtcygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fTWFya3Muc2l6ZSgpOwogfQogCiBjb25zdCBDUERGX0NvbnRlbnRNYXJrSXRlbSYgQ1BERl9Db250ZW50TWFyazo6TWFya0RhdGE6OkdldEl0ZW0oCi0gICAgaW50IGluZGV4KSBjb25zdCB7CisgICAgc2l6ZV90IGluZGV4KSBjb25zdCB7CiAgIHJldHVybiBtX01hcmtzW2luZGV4XTsKIH0KIAotaW50IENQREZfQ29udGVudE1hcms6Ok1hcmtEYXRhOjpHZXRNQ0lEKCkgY29uc3QgeworaW50IENQREZfQ29udGVudE1hcms6Ok1hcmtEYXRhOjpHZXRNYXJrZWRDb250ZW50SUQoKSBjb25zdCB7CiAgIGZvciAoY29uc3QgYXV0byYgbWFyayA6IG1fTWFya3MpIHsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbWFyay5HZXRQYXJhbSgpOworICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtYXJrLkdldFBhcmFtKCk7CiAgICAgaWYgKHBEaWN0ICYmIHBEaWN0LT5LZXlFeGlzdCgiTUNJRCIpKQogICAgICAgcmV0dXJuIHBEaWN0LT5HZXRJbnRlZ2VyRm9yKCJNQ0lEIik7CiAgIH0KICAgcmV0dXJuIC0xOwogfQogCi12b2lkIENQREZfQ29udGVudE1hcms6Ok1hcmtEYXRhOjpBZGRNYXJrKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLAordm9pZCBDUERGX0NvbnRlbnRNYXJrOjpNYXJrRGF0YTo6QWRkTWFyayhjb25zdCBCeXRlU3RyaW5nJiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJEaXJlY3QpIHsKICAgQ1BERl9Db250ZW50TWFya0l0ZW0gaXRlbTsKICAgaXRlbS5TZXROYW1lKG5hbWUpOwogICBpZiAocERpY3QpIHsKLSAgICBpZiAoYkRpcmVjdCkgewotICAgICAgaXRlbS5TZXREaXJlY3REaWN0KAotICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0RpY3Rpb25hcnk+KFRvRGljdGlvbmFyeShwRGljdC0+Q2xvbmUoKSkpKTsKLSAgICB9IGVsc2UgeworICAgIGlmIChiRGlyZWN0KQorICAgICAgaXRlbS5TZXREaXJlY3REaWN0KFRvRGljdGlvbmFyeShwRGljdC0+Q2xvbmUoKSkpOworICAgIGVsc2UKICAgICAgIGl0ZW0uU2V0UHJvcGVydGllc0RpY3QocERpY3QpOwotICAgIH0KICAgfQogICBtX01hcmtzLnB1c2hfYmFjayhzdGQ6Om1vdmUoaXRlbSkpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb250ZW50bWFyay5oIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb250ZW50bWFyay5oCmluZGV4IDE1NGYxOWQuLjc4YTk0ODYgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29udGVudG1hcmsuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbnRlbnRtYXJrLmgKQEAgLTEwLDkgKzEwLDggQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbnRlbnRtYXJraXRlbS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3NoYXJlZF9jb3B5X29uX3dyaXRlLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9zaGFyZWRfY29weV9vbl93cml0ZS5oIgogCiBjbGFzcyBDUERGX0RpY3Rpb25hcnk7CiAKQEAgLTIyLDM0ICsyMSwyNyBAQAogICBDUERGX0NvbnRlbnRNYXJrKGNvbnN0IENQREZfQ29udGVudE1hcmsmIHRoYXQpOwogICB+Q1BERl9Db250ZW50TWFyaygpOwogCi0gIHZvaWQgU2V0TnVsbCgpOworICBpbnQgR2V0TWFya2VkQ29udGVudElEKCkgY29uc3Q7CisgIHNpemVfdCBDb3VudEl0ZW1zKCkgY29uc3Q7CisgIGNvbnN0IENQREZfQ29udGVudE1hcmtJdGVtJiBHZXRJdGVtKHNpemVfdCBpKSBjb25zdDsKIAotICBpbnQgR2V0TUNJRCgpIGNvbnN0OwotICBpbnQgQ291bnRJdGVtcygpIGNvbnN0OwotICBjb25zdCBDUERGX0NvbnRlbnRNYXJrSXRlbSYgR2V0SXRlbShpbnQgaSkgY29uc3Q7Ci0KLSAgYm9vbCBIYXNNYXJrKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbWFyaykgY29uc3Q7Ci0gIGJvb2wgTG9va3VwTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG1hcmssIENQREZfRGljdGlvbmFyeSomIHBEaWN0KSBjb25zdDsKLSAgdm9pZCBBZGRNYXJrKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKLSAgICAgICAgICAgICAgIGJvb2wgYkRpcmVjdCk7CisgIHZvaWQgQWRkTWFyayhjb25zdCBCeXRlU3RyaW5nJiBuYW1lLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBib29sIGJEaXJlY3QpOwogICB2b2lkIERlbGV0ZUxhc3RNYXJrKCk7CiAKLSAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuICEhbV9SZWY7IH0KKyAgYm9vbCBIYXNSZWYoKSBjb25zdCB7IHJldHVybiAhIW1fUmVmOyB9CiAKICBwcml2YXRlOgotICBjbGFzcyBNYXJrRGF0YSB7CisgIGNsYXNzIE1hcmtEYXRhIDogcHVibGljIFJldGFpbmFibGUgewogICAgcHVibGljOgogICAgIE1hcmtEYXRhKCk7CiAgICAgTWFya0RhdGEoY29uc3QgTWFya0RhdGEmIHNyYyk7Ci0gICAgfk1hcmtEYXRhKCk7CisgICAgfk1hcmtEYXRhKCkgb3ZlcnJpZGU7CiAKLSAgICBpbnQgQ291bnRJdGVtcygpIGNvbnN0OwotICAgIENQREZfQ29udGVudE1hcmtJdGVtJiBHZXRJdGVtKGludCBpbmRleCk7Ci0gICAgY29uc3QgQ1BERl9Db250ZW50TWFya0l0ZW0mIEdldEl0ZW0oaW50IGluZGV4KSBjb25zdDsKKyAgICBzaXplX3QgQ291bnRJdGVtcygpIGNvbnN0OworICAgIGNvbnN0IENQREZfQ29udGVudE1hcmtJdGVtJiBHZXRJdGVtKHNpemVfdCBpbmRleCkgY29uc3Q7CiAKLSAgICBpbnQgR2V0TUNJRCgpIGNvbnN0OwotICAgIHZvaWQgQWRkTWFyayhjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwKKyAgICBpbnQgR2V0TWFya2VkQ29udGVudElEKCkgY29uc3Q7CisgICAgdm9pZCBBZGRNYXJrKGNvbnN0IEJ5dGVTdHJpbmcmIG5hbWUsCiAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QsCiAgICAgICAgICAgICAgICAgIGJvb2wgYkRpY3ROZWVkQ2xvbmUpOwogICAgIHZvaWQgRGVsZXRlTGFzdE1hcmsoKTsKQEAgLTU4LDcgKzUwLDcgQEAKICAgICBzdGQ6OnZlY3RvcjxDUERGX0NvbnRlbnRNYXJrSXRlbT4gbV9NYXJrczsKICAgfTsKIAotICBDRlhfU2hhcmVkQ29weU9uV3JpdGU8TWFya0RhdGE+IG1fUmVmOworICBTaGFyZWRDb3B5T25Xcml0ZTxNYXJrRGF0YT4gbV9SZWY7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9QQUdFX0NQREZfQ09OVEVOVE1BUktfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29udGVudG1hcmtpdGVtLmNwcCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29udGVudG1hcmtpdGVtLmNwcAppbmRleCAyYzM3MDE0Li5kZTcyMGIzIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbnRlbnRtYXJraXRlbS5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb250ZW50bWFya2l0ZW0uY3BwCkBAIC0yNiw3ICsyNiw3IEBACiBDUERGX0RpY3Rpb25hcnkqIENQREZfQ29udGVudE1hcmtJdGVtOjpHZXRQYXJhbSgpIGNvbnN0IHsKICAgc3dpdGNoIChtX1BhcmFtVHlwZSkgewogICAgIGNhc2UgUHJvcGVydGllc0RpY3Q6Ci0gICAgICByZXR1cm4gbV9wUHJvcGVydGllc0RpY3Q7CisgICAgICByZXR1cm4gbV9wUHJvcGVydGllc0RpY3QuR2V0KCk7CiAgICAgY2FzZSBEaXJlY3REaWN0OgogICAgICAgcmV0dXJuIG1fcERpcmVjdERpY3QuZ2V0KCk7CiAgICAgY2FzZSBOb25lOgpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb250ZW50bWFya2l0ZW0uaCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29udGVudG1hcmtpdGVtLmgKaW5kZXggZWQyNzM3MS4uZWE4OTYwNiAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb250ZW50bWFya2l0ZW0uaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbnRlbnRtYXJraXRlbS5oCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9tZW1vcnkuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogCiBjbGFzcyBDUERGX0RpY3Rpb25hcnk7CiAKQEAgLTI1LDE5ICsyNiwxOSBAQAogCiAgIENQREZfQ29udGVudE1hcmtJdGVtJiBvcGVyYXRvcj0oQ1BERl9Db250ZW50TWFya0l0ZW0mJiBvdGhlcikgPSBkZWZhdWx0OwogCi0gIENGWF9CeXRlU3RyaW5nIEdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtX01hcmtOYW1lOyB9CisgIEJ5dGVTdHJpbmcgR2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fTWFya05hbWU7IH0KICAgUGFyYW1UeXBlIEdldFBhcmFtVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fUGFyYW1UeXBlOyB9CiAgIENQREZfRGljdGlvbmFyeSogR2V0UGFyYW0oKSBjb25zdDsKICAgYm9vbCBIYXNNQ0lEKCkgY29uc3Q7CiAKLSAgdm9pZCBTZXROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKSB7IG1fTWFya05hbWUgPSBuYW1lOyB9CisgIHZvaWQgU2V0TmFtZShjb25zdCBCeXRlU3RyaW5nJiBuYW1lKSB7IG1fTWFya05hbWUgPSBuYW1lOyB9CiAgIHZvaWQgU2V0RGlyZWN0RGljdChzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5PiBwRGljdCk7CiAgIHZvaWQgU2V0UHJvcGVydGllc0RpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CiAKICBwcml2YXRlOgotICBDRlhfQnl0ZVN0cmluZyBtX01hcmtOYW1lOworICBCeXRlU3RyaW5nIG1fTWFya05hbWU7CiAgIFBhcmFtVHlwZSBtX1BhcmFtVHlwZTsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BQcm9wZXJ0aWVzRGljdDsgIC8vIG5vdCBvd25lZC4KKyAgVW5vd25lZFB0cjxDUERGX0RpY3Rpb25hcnk+IG1fcFByb3BlcnRpZXNEaWN0OwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5PiBtX3BEaXJlY3REaWN0OwogfTsKIApkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb250ZW50cGFyc2VyLmNwcCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29udGVudHBhcnNlci5jcHAKaW5kZXggN2NlYjUwOS4uOTMxNTFhZiAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb250ZW50cGFyc2VyLmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbnRlbnRwYXJzZXIuY3BwCkBAIC0xNyw2OCArMTcsNTQgQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbV9hY2MuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2lmeF9wYXVzZWluZGljYXRvci5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAogI2RlZmluZSBQQVJTRV9TVEVQX0xJTUlUIDEwMAogCi1DUERGX0NvbnRlbnRQYXJzZXI6OkNQREZfQ29udGVudFBhcnNlcigpCi0gICAgOiBtX1N0YXR1cyhSZWFkeSksCi0gICAgICBtX0ludGVybmFsU3RhZ2UoU1RBR0VfR0VUQ09OVEVOVCksCi0gICAgICBtX3BPYmplY3RIb2xkZXIobnVsbHB0ciksCi0gICAgICBtX2JGb3JtKGZhbHNlKSwKLSAgICAgIG1fcFR5cGUzQ2hhcihudWxscHRyKSwKLSAgICAgIG1fcERhdGEobnVsbHB0ciksCi0gICAgICBtX1NpemUoMCksCi0gICAgICBtX0N1cnJlbnRPZmZzZXQoMCkge30KLQotQ1BERl9Db250ZW50UGFyc2VyOjp+Q1BERl9Db250ZW50UGFyc2VyKCkgewotICBpZiAoIW1fcFNpbmdsZVN0cmVhbSkKLSAgICBGWF9GcmVlKG1fcERhdGEpOwotfQotCi12b2lkIENQREZfQ29udGVudFBhcnNlcjo6U3RhcnQoQ1BERl9QYWdlKiBwUGFnZSkgewotICBpZiAobV9TdGF0dXMgIT0gUmVhZHkgfHwgIXBQYWdlIHx8ICFwUGFnZS0+bV9wRG9jdW1lbnQgfHwKLSAgICAgICFwUGFnZS0+bV9wRm9ybURpY3QpIHsKLSAgICBtX1N0YXR1cyA9IERvbmU7CitDUERGX0NvbnRlbnRQYXJzZXI6OkNQREZfQ29udGVudFBhcnNlcihDUERGX1BhZ2UqIHBQYWdlKQorICAgIDogbV9JbnRlcm5hbFN0YWdlKFNUQUdFX0dFVENPTlRFTlQpLCBtX3BPYmplY3RIb2xkZXIocFBhZ2UpIHsKKyAgaWYgKCFwUGFnZSB8fCAhcFBhZ2UtPm1fcERvY3VtZW50IHx8ICFwUGFnZS0+bV9wRm9ybURpY3QpIHsKKyAgICBtX2JJc0RvbmUgPSB0cnVlOwogICAgIHJldHVybjsKICAgfQotICBtX3BPYmplY3RIb2xkZXIgPSBwUGFnZTsKLSAgbV9iRm9ybSA9IGZhbHNlOwotICBtX1N0YXR1cyA9IFRvQmVDb250aW51ZWQ7Ci0gIG1fSW50ZXJuYWxTdGFnZSA9IFNUQUdFX0dFVENPTlRFTlQ7Ci0gIG1fQ3VycmVudE9mZnNldCA9IDA7CiAKICAgQ1BERl9PYmplY3QqIHBDb250ZW50ID0gcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXREaXJlY3RPYmplY3RGb3IoIkNvbnRlbnRzIik7CiAgIGlmICghcENvbnRlbnQpIHsKLSAgICBtX1N0YXR1cyA9IERvbmU7CisgICAgbV9iSXNEb25lID0gdHJ1ZTsKICAgICByZXR1cm47CiAgIH0KLSAgaWYgKENQREZfU3RyZWFtKiBwU3RyZWFtID0gcENvbnRlbnQtPkFzU3RyZWFtKCkpIHsKLSAgICBtX25TdHJlYW1zID0gMDsKLSAgICBtX3BTaW5nbGVTdHJlYW0gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJlYW1BY2M+KCk7Ci0gICAgbV9wU2luZ2xlU3RyZWFtLT5Mb2FkQWxsRGF0YShwU3RyZWFtLCBmYWxzZSk7Ci0gIH0gZWxzZSBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcENvbnRlbnQtPkFzQXJyYXkoKSkgewotICAgIG1fblN0cmVhbXMgPSBwQXJyYXktPkdldENvdW50KCk7Ci0gICAgaWYgKG1fblN0cmVhbXMpCi0gICAgICBtX1N0cmVhbUFycmF5LnJlc2l6ZShtX25TdHJlYW1zKTsKLSAgICBlbHNlCi0gICAgICBtX1N0YXR1cyA9IERvbmU7Ci0gIH0gZWxzZSB7Ci0gICAgbV9TdGF0dXMgPSBEb25lOworICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBDb250ZW50LT5Bc1N0cmVhbSgpOworICBpZiAocFN0cmVhbSkgeworICAgIG1fcFNpbmdsZVN0cmVhbSA9IHBkZml1bTo6TWFrZVJldGFpbjxDUERGX1N0cmVhbUFjYz4ocFN0cmVhbSk7CisgICAgbV9wU2luZ2xlU3RyZWFtLT5Mb2FkQWxsRGF0YUZpbHRlcmVkKCk7CisgICAgcmV0dXJuOwogICB9CisgIENQREZfQXJyYXkqIHBBcnJheSA9IHBDb250ZW50LT5Bc0FycmF5KCk7CisgIGlmICghcEFycmF5KSB7CisgICAgbV9iSXNEb25lID0gdHJ1ZTsKKyAgICByZXR1cm47CisgIH0KKyAgbV9uU3RyZWFtcyA9IHBBcnJheS0+R2V0Q291bnQoKTsKKyAgaWYgKCFtX25TdHJlYW1zKSB7CisgICAgbV9iSXNEb25lID0gdHJ1ZTsKKyAgICByZXR1cm47CisgIH0KKyAgbV9TdHJlYW1BcnJheS5yZXNpemUobV9uU3RyZWFtcyk7CiB9CiAKLXZvaWQgQ1BERl9Db250ZW50UGFyc2VyOjpTdGFydChDUERGX0Zvcm0qIHBGb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQWxsU3RhdGVzKiBwR3JhcGhpY1N0YXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwUGFyZW50TWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCkgewotICBtX3BUeXBlM0NoYXIgPSBwVHlwZTNDaGFyOwotICBtX3BPYmplY3RIb2xkZXIgPSBwRm9ybTsKLSAgbV9iRm9ybSA9IHRydWU7CitDUERGX0NvbnRlbnRQYXJzZXI6OkNQREZfQ29udGVudFBhcnNlcihDUERGX0Zvcm0qIHBGb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BbGxTdGF0ZXMqIHBHcmFwaGljU3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFBhcmVudE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8Y29uc3QgdWludDhfdCo+KiBwYXJzZWRTZXQpCisgICAgOiBtX0ludGVybmFsU3RhZ2UoU1RBR0VfUEFSU0UpLAorICAgICAgbV9wT2JqZWN0SG9sZGVyKHBGb3JtKSwKKyAgICAgIG1fcFR5cGUzQ2hhcihwVHlwZTNDaGFyKSB7CiAgIENGWF9NYXRyaXggZm9ybV9tYXRyaXggPSBwRm9ybS0+bV9wRm9ybURpY3QtPkdldE1hdHJpeEZvcigiTWF0cml4Iik7CiAgIGlmIChwR3JhcGhpY1N0YXRlcykKICAgICBmb3JtX21hdHJpeC5Db25jYXQocEdyYXBoaWNTdGF0ZXMtPm1fQ1RNKTsKKwogICBDUERGX0FycmF5KiBwQkJveCA9IHBGb3JtLT5tX3BGb3JtRGljdC0+R2V0QXJyYXlGb3IoIkJCb3giKTsKICAgQ0ZYX0Zsb2F0UmVjdCBmb3JtX2Jib3g7CiAgIENQREZfUGF0aCBDbGlwUGF0aDsKQEAgLTkxLDQxICs3Nyw0MyBAQAogICAgIGlmIChwUGFyZW50TWF0cml4KQogICAgICAgQ2xpcFBhdGguVHJhbnNmb3JtKHBQYXJlbnRNYXRyaXgpOwogCi0gICAgZm9ybV9tYXRyaXguVHJhbnNmb3JtUmVjdChmb3JtX2Jib3gpOworICAgIGZvcm1fYmJveCA9IGZvcm1fbWF0cml4LlRyYW5zZm9ybVJlY3QoZm9ybV9iYm94KTsKICAgICBpZiAocFBhcmVudE1hdHJpeCkKLSAgICAgIHBQYXJlbnRNYXRyaXgtPlRyYW5zZm9ybVJlY3QoZm9ybV9iYm94KTsKKyAgICAgIGZvcm1fYmJveCA9IHBQYXJlbnRNYXRyaXgtPlRyYW5zZm9ybVJlY3QoZm9ybV9iYm94KTsKICAgfQogCiAgIENQREZfRGljdGlvbmFyeSogcFJlc291cmNlcyA9IHBGb3JtLT5tX3BGb3JtRGljdC0+R2V0RGljdEZvcigiUmVzb3VyY2VzIik7CiAgIG1fcFBhcnNlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI+KAotICAgICAgcEZvcm0tPm1fcERvY3VtZW50LCBwRm9ybS0+bV9wUGFnZVJlc291cmNlcywgcEZvcm0tPm1fcFJlc291cmNlcywKLSAgICAgIHBQYXJlbnRNYXRyaXgsIHBGb3JtLCBwUmVzb3VyY2VzLCAmZm9ybV9iYm94LCBwR3JhcGhpY1N0YXRlcywgbGV2ZWwpOworICAgICAgcEZvcm0tPm1fcERvY3VtZW50LkdldCgpLCBwRm9ybS0+bV9wUGFnZVJlc291cmNlcy5HZXQoKSwKKyAgICAgIHBGb3JtLT5tX3BSZXNvdXJjZXMuR2V0KCksIHBQYXJlbnRNYXRyaXgsIHBGb3JtLCBwUmVzb3VyY2VzLCBmb3JtX2Jib3gsCisgICAgICBwR3JhcGhpY1N0YXRlcywgcGFyc2VkU2V0KTsKICAgbV9wUGFyc2VyLT5HZXRDdXJTdGF0ZXMoKS0+bV9DVE0gPSBmb3JtX21hdHJpeDsKICAgbV9wUGFyc2VyLT5HZXRDdXJTdGF0ZXMoKS0+bV9QYXJlbnRNYXRyaXggPSBmb3JtX21hdHJpeDsKLSAgaWYgKENsaXBQYXRoKSB7CisgIGlmIChDbGlwUGF0aC5IYXNSZWYoKSkgewogICAgIG1fcFBhcnNlci0+R2V0Q3VyU3RhdGVzKCktPm1fQ2xpcFBhdGguQXBwZW5kUGF0aChDbGlwUGF0aCwgRlhGSUxMX1dJTkRJTkcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwogICB9Ci0gIGlmIChwRm9ybS0+bV9UcmFuc3BhcmVuY3kgJiBQREZUUkFOU19HUk9VUCkgeworICBpZiAocEZvcm0tPm1faVRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0dST1VQKSB7CiAgICAgQ1BERl9HZW5lcmFsU3RhdGUqIHBTdGF0ZSA9ICZtX3BQYXJzZXItPkdldEN1clN0YXRlcygpLT5tX0dlbmVyYWxTdGF0ZTsKICAgICBwU3RhdGUtPlNldEJsZW5kVHlwZShGWERJQl9CTEVORF9OT1JNQUwpOwogICAgIHBTdGF0ZS0+U2V0U3Ryb2tlQWxwaGEoMS4wZik7CiAgICAgcFN0YXRlLT5TZXRGaWxsQWxwaGEoMS4wZik7CiAgICAgcFN0YXRlLT5TZXRTb2Z0TWFzayhudWxscHRyKTsKICAgfQotICBtX25TdHJlYW1zID0gMDsKLSAgbV9wU2luZ2xlU3RyZWFtID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU3RyZWFtQWNjPigpOwotICBtX3BTaW5nbGVTdHJlYW0tPkxvYWRBbGxEYXRhKHBGb3JtLT5tX3BGb3JtU3RyZWFtLCBmYWxzZSk7Ci0gIG1fcERhdGEgPSAodWludDhfdCopbV9wU2luZ2xlU3RyZWFtLT5HZXREYXRhKCk7CisgIG1fcFNpbmdsZVN0cmVhbSA9CisgICAgICBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERl9TdHJlYW1BY2M+KHBGb3JtLT5tX3BGb3JtU3RyZWFtLkdldCgpKTsKKyAgbV9wU2luZ2xlU3RyZWFtLT5Mb2FkQWxsRGF0YUZpbHRlcmVkKCk7CisgIG1fcERhdGEuUmVzZXQobV9wU2luZ2xlU3RyZWFtLT5HZXREYXRhKCkpOwogICBtX1NpemUgPSBtX3BTaW5nbGVTdHJlYW0tPkdldFNpemUoKTsKLSAgbV9TdGF0dXMgPSBUb0JlQ29udGludWVkOwotICBtX0ludGVybmFsU3RhZ2UgPSBTVEFHRV9QQVJTRTsKLSAgbV9DdXJyZW50T2Zmc2V0ID0gMDsKIH0KIAotdm9pZCBDUERGX0NvbnRlbnRQYXJzZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKSB7Ci0gIGludCBzdGVwcyA9IDA7Ci0gIHdoaWxlIChtX1N0YXR1cyA9PSBUb0JlQ29udGludWVkKSB7CitDUERGX0NvbnRlbnRQYXJzZXI6On5DUERGX0NvbnRlbnRQYXJzZXIoKSB7fQorCitib29sIENQREZfQ29udGVudFBhcnNlcjo6Q29udGludWUoSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpIHsKKyAgaWYgKG1fYklzRG9uZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgd2hpbGUgKCFtX2JJc0RvbmUpIHsKICAgICBpZiAobV9JbnRlcm5hbFN0YWdlID09IFNUQUdFX0dFVENPTlRFTlQpIHsKICAgICAgIGlmIChtX0N1cnJlbnRPZmZzZXQgPT0gbV9uU3RyZWFtcykgewogICAgICAgICBpZiAoIW1fU3RyZWFtQXJyYXkuZW1wdHkoKSkgewpAQCAtMTM1LDIwICsxMjMsMjEgQEAKICAgICAgICAgICAgIHNhZmVTaXplICs9IDE7CiAgICAgICAgICAgfQogICAgICAgICAgIGlmICghc2FmZVNpemUuSXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICBtX1N0YXR1cyA9IERvbmU7Ci0gICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBtX2JJc0RvbmUgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgIH0KICAgICAgICAgICBtX1NpemUgPSBzYWZlU2l6ZS5WYWx1ZU9yRGllKCk7Ci0gICAgICAgICAgbV9wRGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fU2l6ZSk7CisgICAgICAgICAgbV9wRGF0YS5SZXNldChzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4oCisgICAgICAgICAgICAgIEZYX0FsbG9jKHVpbnQ4X3QsIG1fU2l6ZSkpKTsKICAgICAgICAgICB1aW50MzJfdCBwb3MgPSAwOwogICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgc3RyZWFtIDogbV9TdHJlYW1BcnJheSkgewotICAgICAgICAgICAgRlhTWVNfbWVtY3B5KG1fcERhdGEgKyBwb3MsIHN0cmVhbS0+R2V0RGF0YSgpLCBzdHJlYW0tPkdldFNpemUoKSk7CisgICAgICAgICAgICBtZW1jcHkobV9wRGF0YS5HZXQoKSArIHBvcywgc3RyZWFtLT5HZXREYXRhKCksIHN0cmVhbS0+R2V0U2l6ZSgpKTsKICAgICAgICAgICAgIHBvcyArPSBzdHJlYW0tPkdldFNpemUoKTsKLSAgICAgICAgICAgIG1fcERhdGFbcG9zKytdID0gJyAnOworICAgICAgICAgICAgbV9wRGF0YS5HZXQoKVtwb3MrK10gPSAnICc7CiAgICAgICAgICAgfQogICAgICAgICAgIG1fU3RyZWFtQXJyYXkuY2xlYXIoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBtX3BEYXRhID0gKHVpbnQ4X3QqKW1fcFNpbmdsZVN0cmVhbS0+R2V0RGF0YSgpOworICAgICAgICAgIG1fcERhdGEuUmVzZXQobV9wU2luZ2xlU3RyZWFtLT5HZXREYXRhKCkpOwogICAgICAgICAgIG1fU2l6ZSA9IG1fcFNpbmdsZVN0cmVhbS0+R2V0U2l6ZSgpOwogICAgICAgICB9CiAgICAgICAgIG1fSW50ZXJuYWxTdGFnZSA9IFNUQUdFX1BBUlNFOwpAQCAtMTU2LDUwICsxNDUsNDYgQEAKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIENQREZfQXJyYXkqIHBDb250ZW50ID0KICAgICAgICAgICAgIG1fcE9iamVjdEhvbGRlci0+bV9wRm9ybURpY3QtPkdldEFycmF5Rm9yKCJDb250ZW50cyIpOwotICAgICAgICBtX1N0cmVhbUFycmF5W21fQ3VycmVudE9mZnNldF0gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJlYW1BY2M+KCk7CiAgICAgICAgIENQREZfU3RyZWFtKiBwU3RyZWFtT2JqID0gVG9TdHJlYW0oCiAgICAgICAgICAgICBwQ29udGVudCA/IHBDb250ZW50LT5HZXREaXJlY3RPYmplY3RBdChtX0N1cnJlbnRPZmZzZXQpIDogbnVsbHB0cik7Ci0gICAgICAgIG1fU3RyZWFtQXJyYXlbbV9DdXJyZW50T2Zmc2V0XS0+TG9hZEFsbERhdGEocFN0cmVhbU9iaiwgZmFsc2UpOworICAgICAgICBtX1N0cmVhbUFycmF5W21fQ3VycmVudE9mZnNldF0gPQorICAgICAgICAgICAgcGRmaXVtOjpNYWtlUmV0YWluPENQREZfU3RyZWFtQWNjPihwU3RyZWFtT2JqKTsKKyAgICAgICAgbV9TdHJlYW1BcnJheVttX0N1cnJlbnRPZmZzZXRdLT5Mb2FkQWxsRGF0YUZpbHRlcmVkKCk7CiAgICAgICAgIG1fQ3VycmVudE9mZnNldCsrOwogICAgICAgfQogICAgIH0KICAgICBpZiAobV9JbnRlcm5hbFN0YWdlID09IFNUQUdFX1BBUlNFKSB7CiAgICAgICBpZiAoIW1fcFBhcnNlcikgeworICAgICAgICBtX3BhcnNlZFNldCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxzdGQ6OnNldDxjb25zdCB1aW50OF90Kj4+KCk7CiAgICAgICAgIG1fcFBhcnNlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI+KAotICAgICAgICAgICAgbV9wT2JqZWN0SG9sZGVyLT5tX3BEb2N1bWVudCwgbV9wT2JqZWN0SG9sZGVyLT5tX3BQYWdlUmVzb3VyY2VzLAotICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0ciwgbV9wT2JqZWN0SG9sZGVyLCBtX3BPYmplY3RIb2xkZXItPm1fcFJlc291cmNlcywKLSAgICAgICAgICAgICZtX3BPYmplY3RIb2xkZXItPm1fQkJveCwgbnVsbHB0ciwgMCk7CisgICAgICAgICAgICBtX3BPYmplY3RIb2xkZXItPm1fcERvY3VtZW50LkdldCgpLAorICAgICAgICAgICAgbV9wT2JqZWN0SG9sZGVyLT5tX3BQYWdlUmVzb3VyY2VzLkdldCgpLCBudWxscHRyLCBudWxscHRyLAorICAgICAgICAgICAgbV9wT2JqZWN0SG9sZGVyLkdldCgpLCBtX3BPYmplY3RIb2xkZXItPm1fcFJlc291cmNlcy5HZXQoKSwKKyAgICAgICAgICAgIG1fcE9iamVjdEhvbGRlci0+bV9CQm94LCBudWxscHRyLCBtX3BhcnNlZFNldC5nZXQoKSk7CiAgICAgICAgIG1fcFBhcnNlci0+R2V0Q3VyU3RhdGVzKCktPm1fQ29sb3JTdGF0ZS5TZXREZWZhdWx0KCk7CiAgICAgICB9CiAgICAgICBpZiAobV9DdXJyZW50T2Zmc2V0ID49IG1fU2l6ZSkgewogICAgICAgICBtX0ludGVybmFsU3RhZ2UgPSBTVEFHRV9DSEVDS0NMSVA7CiAgICAgICB9IGVsc2UgewogICAgICAgICBtX0N1cnJlbnRPZmZzZXQgKz0KLSAgICAgICAgICAgIG1fcFBhcnNlci0+UGFyc2UobV9wRGF0YSArIG1fQ3VycmVudE9mZnNldCwKKyAgICAgICAgICAgIG1fcFBhcnNlci0+UGFyc2UobV9wRGF0YS5HZXQoKSArIG1fQ3VycmVudE9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9TaXplIC0gbV9DdXJyZW50T2Zmc2V0LCBQQVJTRV9TVEVQX0xJTUlUKTsKICAgICAgIH0KICAgICB9CiAgICAgaWYgKG1fSW50ZXJuYWxTdGFnZSA9PSBTVEFHRV9DSEVDS0NMSVApIHsKICAgICAgIGlmIChtX3BUeXBlM0NoYXIpIHsKLSAgICAgICAgbV9wVHlwZTNDaGFyLT5tX2JDb2xvcmVkID0gbV9wUGFyc2VyLT5Jc0NvbG9yZWQoKTsKLSAgICAgICAgbV9wVHlwZTNDaGFyLT5tX1dpZHRoID0KLSAgICAgICAgICAgIEZYU1lTX3JvdW5kKG1fcFBhcnNlci0+R2V0VHlwZTNEYXRhKClbMF0gKiAxMDAwKTsKLSAgICAgICAgbV9wVHlwZTNDaGFyLT5tX0JCb3gubGVmdCA9Ci0gICAgICAgICAgICBGWFNZU19yb3VuZChtX3BQYXJzZXItPkdldFR5cGUzRGF0YSgpWzJdICogMTAwMCk7Ci0gICAgICAgIG1fcFR5cGUzQ2hhci0+bV9CQm94LmJvdHRvbSA9Ci0gICAgICAgICAgICBGWFNZU19yb3VuZChtX3BQYXJzZXItPkdldFR5cGUzRGF0YSgpWzNdICogMTAwMCk7Ci0gICAgICAgIG1fcFR5cGUzQ2hhci0+bV9CQm94LnJpZ2h0ID0KLSAgICAgICAgICAgIEZYU1lTX3JvdW5kKG1fcFBhcnNlci0+R2V0VHlwZTNEYXRhKClbNF0gKiAxMDAwKTsKLSAgICAgICAgbV9wVHlwZTNDaGFyLT5tX0JCb3gudG9wID0KLSAgICAgICAgICAgIEZYU1lTX3JvdW5kKG1fcFBhcnNlci0+R2V0VHlwZTNEYXRhKClbNV0gKiAxMDAwKTsKKyAgICAgICAgbV9wVHlwZTNDaGFyLT5Jbml0aWFsaXplRnJvbVN0cmVhbURhdGEobV9wUGFyc2VyLT5Jc0NvbG9yZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRUeXBlM0RhdGEoKSk7CiAgICAgICB9CisKICAgICAgIGZvciAoYXV0byYgcE9iaiA6ICptX3BPYmplY3RIb2xkZXItPkdldFBhZ2VPYmplY3RMaXN0KCkpIHsKLSAgICAgICAgaWYgKCFwT2JqLT5tX0NsaXBQYXRoKQorICAgICAgICBpZiAoIXBPYmotPm1fQ2xpcFBhdGguSGFzUmVmKCkpCiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIGlmIChwT2JqLT5tX0NsaXBQYXRoLkdldFBhdGhDb3VudCgpICE9IDEpCiAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChwT2JqLT5tX0NsaXBQYXRoLkdldFRleHRDb3VudCgpKQorICAgICAgICBpZiAocE9iai0+bV9DbGlwUGF0aC5HZXRUZXh0Q291bnQoKSA+IDApCiAgICAgICAgICAgY29udGludWU7CisKICAgICAgICAgQ1BERl9QYXRoIENsaXBQYXRoID0gcE9iai0+bV9DbGlwUGF0aC5HZXRQYXRoKDApOwogICAgICAgICBpZiAoIUNsaXBQYXRoLklzUmVjdCgpIHx8IHBPYmotPklzU2hhZGluZygpKQogICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMjEyLDExICsxOTcsMTEgQEAKICAgICAgICAgaWYgKG9sZF9yZWN0LkNvbnRhaW5zKG9ial9yZWN0KSkKICAgICAgICAgICBwT2JqLT5tX0NsaXBQYXRoLlNldE51bGwoKTsKICAgICAgIH0KLSAgICAgIG1fU3RhdHVzID0gRG9uZTsKLSAgICAgIHJldHVybjsKKyAgICAgIG1fYklzRG9uZSA9IHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHN0ZXBzKys7CiAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpCiAgICAgICBicmVhazsKICAgfQorICByZXR1cm4gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29udGVudHBhcnNlci5oIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb250ZW50cGFyc2VyLmgKaW5kZXggNWZkMTFmNi4uYzY1ZGE2ZCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb250ZW50cGFyc2VyLmgKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb250ZW50cGFyc2VyLmgKQEAgLTgsMTAgKzgsMTQgQEAKICNkZWZpbmUgQ09SRV9GUERGQVBJX1BBR0VfQ1BERl9DT05URU5UUEFSU0VSX0hfCiAKICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW9iamVjdGhvbGRlci5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc3RyZWFtY29udGVudHBhcnNlci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW1fYWNjLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9tYXliZV9vd25lZC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKIAogY2xhc3MgQ1BERl9BbGxTdGF0ZXM7CiBjbGFzcyBDUERGX0Zvcm07CkBAIC0yMSwxOSArMjUsMTkgQEAKIAogY2xhc3MgQ1BERl9Db250ZW50UGFyc2VyIHsKICBwdWJsaWM6Ci0gIGVudW0gUGFyc2VTdGF0dXMgeyBSZWFkeSwgVG9CZUNvbnRpbnVlZCwgRG9uZSB9OwotCi0gIENQREZfQ29udGVudFBhcnNlcigpOworICBleHBsaWNpdCBDUERGX0NvbnRlbnRQYXJzZXIoQ1BERl9QYWdlKiBwUGFnZSk7CisgIENQREZfQ29udGVudFBhcnNlcihDUERGX0Zvcm0qIHBGb3JtLAorICAgICAgICAgICAgICAgICAgICAgQ1BERl9BbGxTdGF0ZXMqIHBHcmFwaGljU3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFBhcmVudE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgIENQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8Y29uc3QgdWludDhfdCo+KiBwYXJzZWRTZXQpOwogICB+Q1BERl9Db250ZW50UGFyc2VyKCk7CiAKLSAgUGFyc2VTdGF0dXMgR2V0U3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbV9TdGF0dXM7IH0KLSAgdm9pZCBTdGFydChDUERGX1BhZ2UqIHBQYWdlKTsKLSAgdm9pZCBTdGFydChDUERGX0Zvcm0qIHBGb3JtLAotICAgICAgICAgICAgIENQREZfQWxsU3RhdGVzKiBwR3JhcGhpY1N0YXRlcywKLSAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwUGFyZW50TWF0cml4LAotICAgICAgICAgICAgIENQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyLAotICAgICAgICAgICAgIGludCBsZXZlbCk7Ci0gIHZvaWQgQ29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpOworICBjb25zdCBDUERGX0FsbFN0YXRlcyogR2V0Q3VyU3RhdGVzKCkgY29uc3QgeworICAgIHJldHVybiBtX3BQYXJzZXIgPyBtX3BQYXJzZXItPkdldEN1clN0YXRlcygpIDogbnVsbHB0cjsKKyAgfQorICAvLyBSZXR1cm5zIHdoZXRoZXIgdG8gY29udGludWUgb3Igbm90LgorICBib29sIENvbnRpbnVlKElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKTsKIAogIHByaXZhdGU6CiAgIGVudW0gSW50ZXJuYWxTdGFnZSB7CkBAIC00MiwxNyArNDYsMjIgQEAKICAgICBTVEFHRV9DSEVDS0NMSVAsCiAgIH07CiAKLSAgUGFyc2VTdGF0dXMgbV9TdGF0dXM7CisgIGJvb2wgbV9iSXNEb25lID0gZmFsc2U7CiAgIEludGVybmFsU3RhZ2UgbV9JbnRlcm5hbFN0YWdlOwotICBDUERGX1BhZ2VPYmplY3RIb2xkZXIqIG1fcE9iamVjdEhvbGRlcjsKLSAgYm9vbCBtX2JGb3JtOwotICBDUERGX1R5cGUzQ2hhciogbV9wVHlwZTNDaGFyOwotICB1aW50MzJfdCBtX25TdHJlYW1zOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9TdHJlYW1BY2M+IG1fcFNpbmdsZVN0cmVhbTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENQREZfU3RyZWFtQWNjPj4gbV9TdHJlYW1BcnJheTsKLSAgdWludDhfdCogbV9wRGF0YTsKLSAgdWludDMyX3QgbV9TaXplOwotICB1aW50MzJfdCBtX0N1cnJlbnRPZmZzZXQ7CisgIFVub3duZWRQdHI8Q1BERl9QYWdlT2JqZWN0SG9sZGVyPiBjb25zdCBtX3BPYmplY3RIb2xkZXI7CisgIFVub3duZWRQdHI8Q1BERl9UeXBlM0NoYXI+IG1fcFR5cGUzQ2hhcjsgIC8vIE9ubHkgdXNlZCB3aGVuIHBhcnNpbmcgZm9ybXMuCisgIHVpbnQzMl90IG1fblN0cmVhbXMgPSAwOworICBSZXRhaW5QdHI8Q1BERl9TdHJlYW1BY2M+IG1fcFNpbmdsZVN0cmVhbTsKKyAgc3RkOjp2ZWN0b3I8UmV0YWluUHRyPENQREZfU3RyZWFtQWNjPj4gbV9TdHJlYW1BcnJheTsKKyAgTWF5YmVPd25lZDx1aW50OF90LCBGeEZyZWVEZWxldGVyPiBtX3BEYXRhOworICB1aW50MzJfdCBtX1NpemUgPSAwOworICB1aW50MzJfdCBtX0N1cnJlbnRPZmZzZXQgPSAwOworCisgIC8vIE9ubHkgdXNlZCB3aGVuIHBhcnNpbmcgcGFnZXMuCisgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnNldDxjb25zdCB1aW50OF90Kj4+IG1fcGFyc2VkU2V0OworCisgIC8vIHxtX3BQYXJzZXJ8IGhhcyBhIHJlZmVyZW5jZSB0byB8bV9wYXJzZWRTZXR8LCBzbyBtdXN0IGJlIGJlbG93IGFuZCB0aHVzCisgIC8vIGRlc3Ryb3llZCBmaXJzdC4KICAgc3RkOjp1bmlxdWVfcHRyPENQREZfU3RyZWFtQ29udGVudFBhcnNlcj4gbV9wUGFyc2VyOwogfTsKIApkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb3VudGVkb2JqZWN0LmggYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvdW50ZWRvYmplY3QuaAppbmRleCA2NGY5MzZjLi5jYjM5NjE2IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvdW50ZWRvYmplY3QuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvdW50ZWRvYmplY3QuaApAQCAtOSw4ICs5LDYgQEAKIAogI2luY2x1ZGUgPG1lbW9yeT4KIAotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29sb3JzcGFjZS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0dGVybi5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCiAKIHRlbXBsYXRlIDxjbGFzcyBUPgpAQCAtNDQsNyArNDIsNSBAQAogICBzaXplX3QgbV9uQ291bnQ7CiAgIFQqIG1fcE9iajsKIH07Ci11c2luZyBDUERGX0NvdW50ZWRDb2xvclNwYWNlID0gQ1BERl9Db3VudGVkT2JqZWN0PENQREZfQ29sb3JTcGFjZT47Ci11c2luZyBDUERGX0NvdW50ZWRQYXR0ZXJuID0gQ1BERl9Db3VudGVkT2JqZWN0PENQREZfUGF0dGVybj47CiAKICNlbmRpZiAgLy8gQ09SRV9GUERGQVBJX1BBR0VfQ1BERl9DT1VOVEVET0JKRUNUX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2RldmljZWNzLmNwcCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZGV2aWNlY3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYjQxMjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2RldmljZWNzLmNwcApAQCAtMCwwICsxLDE1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9kZXZpY2Vjcy5oIgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudC5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW1fYWNjLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9meF9jb2RlYy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworZmxvYXQgTm9ybWFsaXplQ2hhbm5lbChmbG9hdCBmVmFsKSB7CisgIHJldHVybiBwZGZpdW06OmNsYW1wKGZWYWwsIDAuMGYsIDEuMGYpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKwordWludDMyX3QgQ29tcG9uZW50c0ZvckZhbWlseShpbnQgZmFtaWx5KSB7CisgIGlmIChmYW1pbHkgPT0gUERGQ1NfREVWSUNFUkdCKQorICAgIHJldHVybiAzOworICBpZiAoZmFtaWx5ID09IFBERkNTX0RFVklDRUdSQVkpCisgICAgcmV0dXJuIDE7CisgIEFTU0VSVChmYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSyk7CisgIHJldHVybiA0OworfQorCit2b2lkIFJldmVyc2VSR0IodWludDhfdCogcERlc3RCdWYsIGNvbnN0IHVpbnQ4X3QqIHBTcmNCdWYsIGludCBwaXhlbHMpIHsKKyAgaWYgKHBEZXN0QnVmID09IHBTcmNCdWYpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgICB1aW50OF90IHRlbXAgPSBwRGVzdEJ1ZlsyXTsKKyAgICAgIHBEZXN0QnVmWzJdID0gcERlc3RCdWZbMF07CisgICAgICBwRGVzdEJ1ZlswXSA9IHRlbXA7CisgICAgICBwRGVzdEJ1ZiArPSAzOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgICAqcERlc3RCdWYrKyA9IHBTcmNCdWZbMl07CisgICAgICAqcERlc3RCdWYrKyA9IHBTcmNCdWZbMV07CisgICAgICAqcERlc3RCdWYrKyA9IHBTcmNCdWZbMF07CisgICAgICBwU3JjQnVmICs9IDM7CisgICAgfQorICB9Cit9CisKK0NQREZfRGV2aWNlQ1M6OkNQREZfRGV2aWNlQ1MoaW50IGZhbWlseSkgOiBDUERGX0NvbG9yU3BhY2UobnVsbHB0ciwgZmFtaWx5KSB7CisgIEFTU0VSVChmYW1pbHkgPT0gUERGQ1NfREVWSUNFR1JBWSB8fCBmYW1pbHkgPT0gUERGQ1NfREVWSUNFUkdCIHx8CisgICAgICAgICBmYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSyk7CisgIFNldENvbXBvbmVudHNGb3JTdG9ja0NTKENvbXBvbmVudHNGb3JGYW1pbHkoR2V0RmFtaWx5KCkpKTsKK30KKworQ1BERl9EZXZpY2VDUzo6fkNQREZfRGV2aWNlQ1MoKSB7fQorCit1aW50MzJfdCBDUERGX0RldmljZUNTOjp2X0xvYWQoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8Q1BERl9PYmplY3QqPiogcFZpc2l0ZWQpIHsKKyAgLy8gVW5saWtlIG90aGVyIGNsYXNzZXMgdGhhdCBpbmhlcml0IGZyb20gQ1BERl9Db2xvclNwYWNlLCBDUERGX0RldmljZUNTIGlzCisgIC8vIG5ldmVyIGxvYWRlZCBieSBDUERGX0NvbG9yU3BhY2UuCisgIE5PVFJFQUNIRUQoKTsKKyAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgQ1BERl9EZXZpY2VDUzo6R2V0UkdCKGZsb2F0KiBwQnVmLCBmbG9hdCogUiwgZmxvYXQqIEcsIGZsb2F0KiBCKSBjb25zdCB7CisgIHN3aXRjaCAobV9GYW1pbHkpIHsKKyAgICBjYXNlIFBERkNTX0RFVklDRUdSQVk6CisgICAgICAqUiA9IE5vcm1hbGl6ZUNoYW5uZWwoKnBCdWYpOworICAgICAgKkcgPSAqUjsKKyAgICAgICpCID0gKlI7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIFBERkNTX0RFVklDRVJHQjoKKyAgICAgICpSID0gTm9ybWFsaXplQ2hhbm5lbChwQnVmWzBdKTsKKyAgICAgICpHID0gTm9ybWFsaXplQ2hhbm5lbChwQnVmWzFdKTsKKyAgICAgICpCID0gTm9ybWFsaXplQ2hhbm5lbChwQnVmWzJdKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgUERGQ1NfREVWSUNFQ01ZSzoKKyAgICAgIGlmIChtX2R3U3RkQ29udmVyc2lvbikgeworICAgICAgICBmbG9hdCBrID0gcEJ1ZlszXTsKKyAgICAgICAgKlIgPSAxLjBmIC0gc3RkOjptaW4oMS4wZiwgcEJ1ZlswXSArIGspOworICAgICAgICAqRyA9IDEuMGYgLSBzdGQ6Om1pbigxLjBmLCBwQnVmWzFdICsgayk7CisgICAgICAgICpCID0gMS4wZiAtIHN0ZDo6bWluKDEuMGYsIHBCdWZbMl0gKyBrKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6dGllKCpSLCAqRywgKkIpID0gQWRvYmVDTVlLX3RvX3NSR0IoCisgICAgICAgICAgICBOb3JtYWxpemVDaGFubmVsKHBCdWZbMF0pLCBOb3JtYWxpemVDaGFubmVsKHBCdWZbMV0pLAorICAgICAgICAgICAgTm9ybWFsaXplQ2hhbm5lbChwQnVmWzJdKSwgTm9ybWFsaXplQ2hhbm5lbChwQnVmWzNdKSk7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK3ZvaWQgQ1BERl9EZXZpY2VDUzo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFNyY0J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVHJhbnNNYXNrKSBjb25zdCB7CisgIHN3aXRjaCAobV9GYW1pbHkpIHsKKyAgICBjYXNlIFBERkNTX0RFVklDRUdSQVk6CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgICAgICpwRGVzdEJ1ZisrID0gcFNyY0J1ZltpXTsKKyAgICAgICAgKnBEZXN0QnVmKysgPSBwU3JjQnVmW2ldOworICAgICAgICAqcERlc3RCdWYrKyA9IHBTcmNCdWZbaV07CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBERkNTX0RFVklDRVJHQjoKKyAgICAgIFJldmVyc2VSR0IocERlc3RCdWYsIHBTcmNCdWYsIHBpeGVscyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBERkNTX0RFVklDRUNNWUs6CisgICAgICBpZiAoYlRyYW5zTWFzaykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgICAgICAgaW50IGsgPSAyNTUgLSBwU3JjQnVmWzNdOworICAgICAgICAgIHBEZXN0QnVmWzBdID0gKCgyNTUgLSBwU3JjQnVmWzBdKSAqIGspIC8gMjU1OworICAgICAgICAgIHBEZXN0QnVmWzFdID0gKCgyNTUgLSBwU3JjQnVmWzFdKSAqIGspIC8gMjU1OworICAgICAgICAgIHBEZXN0QnVmWzJdID0gKCgyNTUgLSBwU3JjQnVmWzJdKSAqIGspIC8gMjU1OworICAgICAgICAgIHBEZXN0QnVmICs9IDM7CisgICAgICAgICAgcFNyY0J1ZiArPSA0OworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7CisgICAgICAgICAgaWYgKG1fZHdTdGRDb252ZXJzaW9uKSB7CisgICAgICAgICAgICB1aW50OF90IGsgPSBwU3JjQnVmWzNdOworICAgICAgICAgICAgcERlc3RCdWZbMl0gPSAyNTUgLSBzdGQ6Om1pbigyNTUsIHBTcmNCdWZbMF0gKyBrKTsKKyAgICAgICAgICAgIHBEZXN0QnVmWzFdID0gMjU1IC0gc3RkOjptaW4oMjU1LCBwU3JjQnVmWzFdICsgayk7CisgICAgICAgICAgICBwRGVzdEJ1ZlswXSA9IDI1NSAtIHN0ZDo6bWluKDI1NSwgcFNyY0J1ZlsyXSArIGspOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGQ6OnRpZShwRGVzdEJ1ZlsyXSwgcERlc3RCdWZbMV0sIHBEZXN0QnVmWzBdKSA9CisgICAgICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKHBTcmNCdWZbMF0sIHBTcmNCdWZbMV0sIHBTcmNCdWZbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNCdWZbM10pOworICAgICAgICAgIH0KKyAgICAgICAgICBwU3JjQnVmICs9IDQ7CisgICAgICAgICAgcERlc3RCdWYgKz0gMzsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2RldmljZWNzLmggYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2RldmljZWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVlOGVjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZGV2aWNlY3MuaApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GUERGQVBJX1BBR0VfQ1BERl9ERVZJQ0VDU19IXworI2RlZmluZSBDT1JFX0ZQREZBUElfUEFHRV9DUERGX0RFVklDRUNTX0hfCisKKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbG9yc3BhY2UuaCIKKworY2xhc3MgQ1BERl9EZXZpY2VDUyA6IHB1YmxpYyBDUERGX0NvbG9yU3BhY2UgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1BERl9EZXZpY2VDUyhpbnQgZmFtaWx5KTsKKyAgfkNQREZfRGV2aWNlQ1MoKSBvdmVycmlkZTsKKworICAvLyBDUERGX0NvbG9yU3BhY2U6CisgIHVpbnQzMl90IHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5LAorICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8Q1BERl9PYmplY3QqPiogcFZpc2l0ZWQpIG92ZXJyaWRlOworICBib29sIEdldFJHQihmbG9hdCogcEJ1ZiwgZmxvYXQqIFIsIGZsb2F0KiBHLCBmbG9hdCogQikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgVHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwU3JjQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2Vfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRyYW5zTWFzaykgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9QQUdFX0NQREZfREVWSUNFQ1NfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZGV2aWNlY3NfdW5pdHRlc3QuY3BwIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9kZXZpY2Vjc191bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE3MWQwMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZGV2aWNlY3NfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTE0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2RldmljZWNzLmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK1RFU1QoQ1BERl9EZXZpY2VDU1Rlc3QsIEdldFJHQkZyb21HcmF5KSB7CisgIGZsb2F0IFI7CisgIGZsb2F0IEc7CisgIGZsb2F0IEI7CisgIENQREZfRGV2aWNlQ1MgZGV2aWNlX2dyYXkoUERGQ1NfREVWSUNFR1JBWSk7CisKKyAgLy8gVGVzdCBub3JtYWwgdmFsdWVzLiBGb3IgZ3JheSwgb25seSBmaXJzdCB2YWx1ZSBmcm9tIGJ1ZiBzaG91bGQgYmUgdXNlZC4KKyAgZmxvYXQgYnVmWzNdID0gezAuNDNmLCAwLjExZiwgMC4zNGZ9OworICBBU1NFUlRfVFJVRShkZXZpY2VfZ3JheS5HZXRSR0IoYnVmLCAmUiwgJkcsICZCKSk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjQzZiwgUik7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjQzZiwgRyk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjQzZiwgQik7CisgIGJ1ZlswXSA9IDAuODcyZjsKKyAgQVNTRVJUX1RSVUUoZGV2aWNlX2dyYXkuR2V0UkdCKGJ1ZiwgJlIsICZHLCAmQikpOworICBFWFBFQ1RfRkxPQVRfRVEoMC44NzJmLCBSKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuODcyZiwgRyk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjg3MmYsIEIpOworCisgIC8vIFRlc3QgYm91bmRhcnkgdmFsdWVzCisgIGJ1ZlswXSA9IHswLjBmfTsKKyAgQVNTRVJUX1RSVUUoZGV2aWNlX2dyYXkuR2V0UkdCKGJ1ZiwgJlIsICZHLCAmQikpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgUik7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCBHKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuMGYsIEIpOworICBidWZbMF0gPSAxLjBmOworICBBU1NFUlRfVFJVRShkZXZpY2VfZ3JheS5HZXRSR0IoYnVmLCAmUiwgJkcsICZCKSk7CisgIEVYUEVDVF9GTE9BVF9FUSgxLjBmLCBSKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDEuMGYsIEcpOworICBFWFBFQ1RfRkxPQVRfRVEoMS4wZiwgQik7CisKKyAgLy8gVGVzdCBvdXQgb2YgcmFuZ2UgdmFsdWVzCisgIGJ1ZlswXSA9IC0wLjAxZjsKKyAgQVNTRVJUX1RSVUUoZGV2aWNlX2dyYXkuR2V0UkdCKGJ1ZiwgJlIsICZHLCAmQikpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgUik7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCBHKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuMGYsIEIpOworICBidWZbMF0gPSAxMi41ZjsKKyAgQVNTRVJUX1RSVUUoZGV2aWNlX2dyYXkuR2V0UkdCKGJ1ZiwgJlIsICZHLCAmQikpOworICBFWFBFQ1RfRkxPQVRfRVEoMS4wZiwgUik7CisgIEVYUEVDVF9GTE9BVF9FUSgxLjBmLCBHKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDEuMGYsIEIpOworfQorCitURVNUKENQREZfRGV2aWNlQ1NUZXN0LCBHZXRSR0JGcm9tUkdCKSB7CisgIGZsb2F0IFI7CisgIGZsb2F0IEc7CisgIGZsb2F0IEI7CisgIENQREZfRGV2aWNlQ1MgZGV2aWNlX3JnYihQREZDU19ERVZJQ0VSR0IpOworCisgIC8vIFRlc3Qgbm9ybWFsIHZhbHVlcworICBmbG9hdCBidWZbM10gPSB7MC4xM2YsIDEuMGYsIDAuNjUyZn07CisgIEFTU0VSVF9UUlVFKGRldmljZV9yZ2IuR2V0UkdCKGJ1ZiwgJlIsICZHLCAmQikpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4xM2YsIFIpOworICBFWFBFQ1RfRkxPQVRfRVEoMS4wZiwgRyk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjY1MmYsIEIpOworICBidWZbMF0gPSAwLjBmOworICBidWZbMV0gPSAwLjUyZjsKKyAgYnVmWzJdID0gMC43OGY7CisgIEFTU0VSVF9UUlVFKGRldmljZV9yZ2IuR2V0UkdCKGJ1ZiwgJlIsICZHLCAmQikpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgUik7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjUyZiwgRyk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjc4ZiwgQik7CisKKyAgLy8gVGVzdCBvdXQgb2YgcmFuZ2UgdmFsdWVzCisgIGJ1ZlswXSA9IC0xMC41ZjsKKyAgYnVmWzFdID0gMTAwLjBmOworICBBU1NFUlRfVFJVRShkZXZpY2VfcmdiLkdldFJHQihidWYsICZSLCAmRywgJkIpKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuMGYsIFIpOworICBFWFBFQ1RfRkxPQVRfRVEoMS4wZiwgRyk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjc4ZiwgQik7Cit9CisKK1RFU1QoQ1BERl9EZXZpY2VDU1Rlc3QsIEdldFJHQkZyb21DTVlLKSB7CisgIGZsb2F0IFI7CisgIGZsb2F0IEc7CisgIGZsb2F0IEI7CisgIENQREZfRGV2aWNlQ1MgZGV2aWNlX2NteWsoUERGQ1NfREVWSUNFQ01ZSyk7CisKKyAgLy8gVGVzdCBub3JtYWwgdmFsdWVzCisgIGZsb2F0IGJ1Zls0XSA9IHswLjZmLCAwLjVmLCAwLjNmLCAwLjlmfTsKKyAgQVNTRVJUX1RSVUUoZGV2aWNlX2NteWsuR2V0UkdCKGJ1ZiwgJlIsICZHLCAmQikpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wNjI3NDUxZiwgUik7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjA2Mjc0NTFmLCBHKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuMTA1ODgyMzZmLCBCKTsKKyAgYnVmWzBdID0gMC4xNWY7CisgIGJ1ZlsyXSA9IDAuMGY7CisgIEFTU0VSVF9UUlVFKGRldmljZV9jbXlrLkdldFJHQihidWYsICZSLCAmRywgJkIpKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuMmYsIFIpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wODYyNzQ1ZiwgRyk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjE2NDcwNTg5ZiwgQik7CisgIGJ1ZlsyXSA9IDEuMGY7CisgIGJ1ZlszXSA9IDAuMGY7CisgIEFTU0VSVF9UUlVFKGRldmljZV9jbXlrLkdldFJHQihidWYsICZSLCAmRywgJkIpKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuODUwOTgwNDZmLCBSKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuNTUyOTQxZiwgRyk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjE1Njg2Mjc1ZiwgQik7CisKKyAgLy8gVGVzdCBvdXQgb2YgcmFuZ2UgdmFsdWVzCisgIGJ1ZlsyXSA9IDEuNWY7CisgIGJ1ZlszXSA9IC0wLjZmOworICBBU1NFUlRfVFJVRShkZXZpY2VfY215ay5HZXRSR0IoYnVmLCAmUiwgJkcsICZCKSk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjg1MDk4MDQ2ZiwgUik7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjU1Mjk0MWYsIEcpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4xNTY4NjI3NWYsIEIpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9kb2NwYWdlZGF0YS5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2RvY3BhZ2VkYXRhLmNwcAppbmRleCBhZjI2MTgyLi4wZDJhOTE4IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2RvY3BhZ2VkYXRhLmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2RvY3BhZ2VkYXRhLmNwcApAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgImNvcmUvZmRybS9jcnlwdG8vZnhfY3J5cHQuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvY3BkZl9tb2R1bGVtZ3IuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3R5cGUxZm9udC5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2ZvbnRfaW50LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9pY2Nwcm9maWxlLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9pbWFnZS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW1vZHVsZS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0dGVybi5oIgpAQCAtMjgsNyArMjgsOSBAQAogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKIAogQ1BERl9Eb2NQYWdlRGF0YTo6Q1BERl9Eb2NQYWdlRGF0YShDUERGX0RvY3VtZW50KiBwUERGRG9jKQotICAgIDogbV9wUERGRG9jKHBQREZEb2MpLCBtX2JGb3JjZUNsZWFyKGZhbHNlKSB7fQorICAgIDogbV9iRm9yY2VDbGVhcihmYWxzZSksIG1fcFBERkRvYyhwUERGRG9jKSB7CisgIGFzc2VydChtX3BQREZEb2MpOworfQogCiBDUERGX0RvY1BhZ2VEYXRhOjp+Q1BERl9Eb2NQYWdlRGF0YSgpIHsKICAgQ2xlYXIoZmFsc2UpOwpAQCAtNTAsMTEgKzUyLDI2IEBACiB2b2lkIENQREZfRG9jUGFnZURhdGE6OkNsZWFyKGJvb2wgYkZvcmNlUmVsZWFzZSkgewogICBtX2JGb3JjZUNsZWFyID0gYkZvcmNlUmVsZWFzZTsKIAorICAvLyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGlmIHxiRm9yY2VSZWxlYXNlfCBpcyB0cnVlIHdlIHdpbGwgZGVzdHJveSBhbnkKKyAgLy8gcGF0dGVybiB3ZSBzZWUgcmVnYXJkbGVzcyBvZiB0aGUgcmVmLWNvdW50LiBUaGUgdGlsaW5nIHBhdHRlcm4gb3ducyBhCisgIC8vIEZvcm0gb2JqZWN0IHdoaWNoIG93bnMgYSBTaGFkaW5nT2JqZWN0LiBUaGUgU2hhZGluZ09iamVjdCBoYXMgYW4gdW5vd25lZAorICAvLyBwb2ludGVyIHRvIGEgU2hhZGluZ1BhdHRlcm4uIFRoZSBTaGFkaW5nUGF0dGVybiBpcyBvd25lZCBieSB0aGUKKyAgLy8gRG9jUGFnZURhdGEuIFNvLCB3ZSBsb29wIHRocm91Z2ggYW5kIGNsZWFyIGFueSB0aWxpbmcgcGF0dGVybnMgYmVmb3JlIHdlCisgIC8vIGRvIHRoZSBzYW1lIGZvciBhbnkgc2hhZGluZyBwYXR0ZXJucywgb3RoZXJ3aXNlIHdlIG1heSBmcmVlIHRoZQorICAvLyBTaGFkaW5nUGF0dGVybiBiZWZvcmUgdGhlIFNoYWRpbmdPYmplY3QgYW5kIHRyaWdnZXIgYW4gdW5vd25lZCBwb2ludGVyCisgIC8vIHByb2JlIHdhcm5pbmcuCisgIGZvciAoYXV0byYgaXQgOiBtX1BhdHRlcm5NYXApIHsKKyAgICBDUERGX0NvdW50ZWRQYXR0ZXJuKiBwdERhdGEgPSBpdC5zZWNvbmQ7CisgICAgaWYgKCFwdERhdGEtPmdldCgpIHx8ICFwdERhdGEtPmdldCgpLT5Bc1RpbGluZ1BhdHRlcm4oKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChiRm9yY2VSZWxlYXNlIHx8IHB0RGF0YS0+dXNlX2NvdW50KCkgPCAyKQorICAgICAgcHREYXRhLT5jbGVhcigpOworICB9CisKICAgZm9yIChhdXRvJiBpdCA6IG1fUGF0dGVybk1hcCkgewogICAgIENQREZfQ291bnRlZFBhdHRlcm4qIHB0RGF0YSA9IGl0LnNlY29uZDsKICAgICBpZiAoIXB0RGF0YS0+Z2V0KCkpCiAgICAgICBjb250aW51ZTsKLQogICAgIGlmIChiRm9yY2VSZWxlYXNlIHx8IHB0RGF0YS0+dXNlX2NvdW50KCkgPCAyKQogICAgICAgcHREYXRhLT5jbGVhcigpOwogICB9CkBAIC02Myw3ICs4MCw2IEBACiAgICAgQ1BERl9Db3VudGVkRm9udCogZm9udERhdGEgPSBpdC5zZWNvbmQ7CiAgICAgaWYgKCFmb250RGF0YS0+Z2V0KCkpCiAgICAgICBjb250aW51ZTsKLQogICAgIGlmIChiRm9yY2VSZWxlYXNlIHx8IGZvbnREYXRhLT51c2VfY291bnQoKSA8IDIpIHsKICAgICAgIGZvbnREYXRhLT5jbGVhcigpOwogICAgIH0KQEAgLTczLDcgKzg5LDYgQEAKICAgICBDUERGX0NvdW50ZWRDb2xvclNwYWNlKiBjc0RhdGEgPSBpdC5zZWNvbmQ7CiAgICAgaWYgKCFjc0RhdGEtPmdldCgpKQogICAgICAgY29udGludWU7Ci0KICAgICBpZiAoYkZvcmNlUmVsZWFzZSB8fCBjc0RhdGEtPnVzZV9jb3VudCgpIDwgMikgewogICAgICAgY3NEYXRhLT5nZXQoKS0+UmVsZWFzZSgpOwogICAgICAgY3NEYXRhLT5yZXNldChudWxscHRyKTsKQEAgLTgyLDExICs5Nyw3IEBACiAKICAgZm9yIChhdXRvIGl0ID0gbV9JY2NQcm9maWxlTWFwLmJlZ2luKCk7IGl0ICE9IG1fSWNjUHJvZmlsZU1hcC5lbmQoKTspIHsKICAgICBhdXRvIGN1cnJfaXQgPSBpdCsrOwotICAgIENQREZfQ291bnRlZEljY1Byb2ZpbGUqIGlwRGF0YSA9IGN1cnJfaXQtPnNlY29uZDsKLSAgICBpZiAoIWlwRGF0YS0+Z2V0KCkpCi0gICAgICBjb250aW51ZTsKLQotICAgIGlmIChiRm9yY2VSZWxlYXNlIHx8IGlwRGF0YS0+dXNlX2NvdW50KCkgPCAyKSB7CisgICAgaWYgKGJGb3JjZVJlbGVhc2UgfHwgY3Vycl9pdC0+c2Vjb25kLT5IYXNPbmVSZWYoKSkgewogICAgICAgZm9yIChhdXRvIGhhc2hfaXQgPSBtX0hhc2hQcm9maWxlTWFwLmJlZ2luKCk7CiAgICAgICAgICAgIGhhc2hfaXQgIT0gbV9IYXNoUHJvZmlsZU1hcC5lbmQoKTsgKytoYXNoX2l0KSB7CiAgICAgICAgIGlmIChjdXJyX2l0LT5maXJzdCA9PSBoYXNoX2l0LT5zZWNvbmQpIHsKQEAgLTk0LDM3ICsxMDUsMTcgQEAKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgfQotICAgICAgZGVsZXRlIGlwRGF0YS0+Z2V0KCk7Ci0gICAgICBkZWxldGUgaXBEYXRhOwogICAgICAgbV9JY2NQcm9maWxlTWFwLmVyYXNlKGN1cnJfaXQpOwogICAgIH0KICAgfQogCiAgIGZvciAoYXV0byBpdCA9IG1fRm9udEZpbGVNYXAuYmVnaW4oKTsgaXQgIT0gbV9Gb250RmlsZU1hcC5lbmQoKTspIHsKICAgICBhdXRvIGN1cnJfaXQgPSBpdCsrOwotICAgIENQREZfQ291bnRlZFN0cmVhbUFjYyogcENvdW50ZWRGb250ID0gY3Vycl9pdC0+c2Vjb25kOwotICAgIGlmICghcENvdW50ZWRGb250LT5nZXQoKSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgaWYgKGJGb3JjZVJlbGVhc2UgfHwgcENvdW50ZWRGb250LT51c2VfY291bnQoKSA8IDIpIHsKLSAgICAgIGRlbGV0ZSBwQ291bnRlZEZvbnQtPmdldCgpOwotICAgICAgZGVsZXRlIHBDb3VudGVkRm9udDsKKyAgICBpZiAoYkZvcmNlUmVsZWFzZSB8fCBjdXJyX2l0LT5zZWNvbmQtPkhhc09uZVJlZigpKQogICAgICAgbV9Gb250RmlsZU1hcC5lcmFzZShjdXJyX2l0KTsKLSAgICB9CiAgIH0KIAotICBmb3IgKGF1dG8gaXQgPSBtX0ltYWdlTWFwLmJlZ2luKCk7IGl0ICE9IG1fSW1hZ2VNYXAuZW5kKCk7KSB7Ci0gICAgYXV0byBjdXJyX2l0ID0gaXQrKzsKLSAgICBDUERGX0NvdW50ZWRJbWFnZSogcENvdW50ZWRJbWFnZSA9IGN1cnJfaXQtPnNlY29uZDsKLSAgICBpZiAoIXBDb3VudGVkSW1hZ2UtPmdldCgpKQotICAgICAgY29udGludWU7Ci0KLSAgICBpZiAoYkZvcmNlUmVsZWFzZSB8fCBwQ291bnRlZEltYWdlLT51c2VfY291bnQoKSA8IDIpIHsKLSAgICAgIGRlbGV0ZSBwQ291bnRlZEltYWdlLT5nZXQoKTsKLSAgICAgIGRlbGV0ZSBwQ291bnRlZEltYWdlOwotICAgICAgbV9JbWFnZU1hcC5lcmFzZShjdXJyX2l0KTsKLSAgICB9Ci0gIH0KKyAgbV9JbWFnZU1hcC5jbGVhcigpOwogfQogCiBDUERGX0ZvbnQqIENQREZfRG9jUGFnZURhdGE6OkdldEZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QpIHsKQEAgLTEzOSw3ICsxMzAsOCBAQAogICAgICAgcmV0dXJuIHBGb250RGF0YS0+QWRkUmVmKCk7CiAgICAgfQogICB9Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0ZvbnQ+IHBGb250ID0gQ1BERl9Gb250OjpDcmVhdGUobV9wUERGRG9jLCBwRm9udERpY3QpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Gb250PiBwRm9udCA9CisgICAgICBDUERGX0ZvbnQ6OkNyZWF0ZShtX3BQREZEb2MuR2V0KCksIHBGb250RGljdCk7CiAgIGlmICghcEZvbnQpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKQEAgLTE1Miw3ICsxNDQsNyBAQAogICByZXR1cm4gcEZvbnREYXRhLT5BZGRSZWYoKTsKIH0KIAotQ1BERl9Gb250KiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRTdGFuZGFyZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZvbnROYW1lLAorQ1BERl9Gb250KiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRTdGFuZGFyZEZvbnQoY29uc3QgQnl0ZVN0cmluZyYgZm9udE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnRFbmNvZGluZyogcEVuY29kaW5nKSB7CiAgIGlmIChmb250TmFtZS5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC0xODcsNyArMTc5LDcgQEAKICAgICAgICAgICAgICAgICAgIHBFbmNvZGluZy0+UmVhbGl6ZShtX3BQREZEb2MtPkdldEJ5dGVTdHJpbmdQb29sKCkpKTsKICAgfQogCi0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0ZvbnQ+IHBGb250ID0gQ1BERl9Gb250OjpDcmVhdGUobV9wUERGRG9jLCBwRGljdCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0ZvbnQ+IHBGb250ID0gQ1BERl9Gb250OjpDcmVhdGUobV9wUERGRG9jLkdldCgpLCBwRGljdCk7CiAgIGlmICghcEZvbnQpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKQEAgLTIyMCwxMCArMjEyLDEwIEBACiAgICAgQ1BERl9PYmplY3QqIHBDU09iaiwKICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMpIHsKICAgc3RkOjpzZXQ8Q1BERl9PYmplY3QqPiB2aXNpdGVkOwotICByZXR1cm4gR2V0Q29sb3JTcGFjZUltcGwocENTT2JqLCBwUmVzb3VyY2VzLCAmdmlzaXRlZCk7CisgIHJldHVybiBHZXRDb2xvclNwYWNlR3VhcmRlZChwQ1NPYmosIHBSZXNvdXJjZXMsICZ2aXNpdGVkKTsKIH0KIAotQ1BERl9Db2xvclNwYWNlKiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRDb2xvclNwYWNlSW1wbCgKK0NQREZfQ29sb3JTcGFjZSogQ1BERl9Eb2NQYWdlRGF0YTo6R2V0Q29sb3JTcGFjZUd1YXJkZWQoCiAgICAgQ1BERl9PYmplY3QqIHBDU09iaiwKICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMsCiAgICAgc3RkOjpzZXQ8Q1BERl9PYmplY3QqPiogcFZpc2l0ZWQpIHsKQEAgLTIzMywxNSArMjI1LDE2IEBACiAgIGlmIChwZGZpdW06OkNvbnRhaW5zS2V5KCpwVmlzaXRlZCwgcENTT2JqKSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAorICBwZGZpdW06OlNjb3BlZFNldEluc2VydGlvbjxDUERGX09iamVjdCo+IGluc2VydGlvbihwVmlzaXRlZCwgcENTT2JqKTsKKwogICBpZiAocENTT2JqLT5Jc05hbWUoKSkgewotICAgIENGWF9CeXRlU3RyaW5nIG5hbWUgPSBwQ1NPYmotPkdldFN0cmluZygpOworICAgIEJ5dGVTdHJpbmcgbmFtZSA9IHBDU09iai0+R2V0U3RyaW5nKCk7CiAgICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBDUERGX0NvbG9yU3BhY2U6OkNvbG9yc3BhY2VGcm9tTmFtZShuYW1lKTsKICAgICBpZiAoIXBDUyAmJiBwUmVzb3VyY2VzKSB7CiAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBMaXN0ID0gcFJlc291cmNlcy0+R2V0RGljdEZvcigiQ29sb3JTcGFjZSIpOwogICAgICAgaWYgKHBMaXN0KSB7Ci0gICAgICAgIHBkZml1bTo6U2NvcGVkU2V0SW5zZXJ0aW9uPENQREZfT2JqZWN0Kj4gaW5zZXJ0aW9uKHBWaXNpdGVkLCBwQ1NPYmopOwotICAgICAgICByZXR1cm4gR2V0Q29sb3JTcGFjZUltcGwocExpc3QtPkdldERpcmVjdE9iamVjdEZvcihuYW1lKSwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaXNpdGVkKTsKKyAgICAgICAgcmV0dXJuIEdldENvbG9yU3BhY2VHdWFyZGVkKHBMaXN0LT5HZXREaXJlY3RPYmplY3RGb3IobmFtZSksIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlzaXRlZCk7CiAgICAgICB9CiAgICAgfQogICAgIGlmICghcENTIHx8ICFwUmVzb3VyY2VzKQpAQCAtMjY2LDggKzI1OSw3IEBACiAgICAgaWYgKCFwRGVmYXVsdENTKQogICAgICAgcmV0dXJuIHBDUzsKIAotICAgIHBkZml1bTo6U2NvcGVkU2V0SW5zZXJ0aW9uPENQREZfT2JqZWN0Kj4gaW5zZXJ0aW9uKHBWaXNpdGVkLCBwQ1NPYmopOwotICAgIHJldHVybiBHZXRDb2xvclNwYWNlSW1wbChwRGVmYXVsdENTLCBudWxscHRyLCBwVmlzaXRlZCk7CisgICAgcmV0dXJuIEdldENvbG9yU3BhY2VHdWFyZGVkKHBEZWZhdWx0Q1MsIG51bGxwdHIsIHBWaXNpdGVkKTsKICAgfQogCiAgIENQREZfQXJyYXkqIHBBcnJheSA9IHBDU09iai0+QXNBcnJheSgpOwpAQCAtMjc1LDkgKzI2Nyw4IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiAKICAgaWYgKHBBcnJheS0+R2V0Q291bnQoKSA9PSAxKSB7Ci0gICAgcGRmaXVtOjpTY29wZWRTZXRJbnNlcnRpb248Q1BERl9PYmplY3QqPiBpbnNlcnRpb24ocFZpc2l0ZWQsIHBDU09iaik7Ci0gICAgcmV0dXJuIEdldENvbG9yU3BhY2VJbXBsKHBBcnJheS0+R2V0RGlyZWN0T2JqZWN0QXQoMCksIHBSZXNvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaXNpdGVkKTsKKyAgICByZXR1cm4gR2V0Q29sb3JTcGFjZUd1YXJkZWQocEFycmF5LT5HZXREaXJlY3RPYmplY3RBdCgwKSwgcFJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZpc2l0ZWQpOwogICB9CiAKICAgQ1BERl9Db3VudGVkQ29sb3JTcGFjZSogY3NEYXRhID0gbnVsbHB0cjsKQEAgLTI5MCw3ICsyODEsNyBAQAogICB9CiAKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfQ29sb3JTcGFjZT4gcENTID0KLSAgICAgIENQREZfQ29sb3JTcGFjZTo6TG9hZChtX3BQREZEb2MsIHBBcnJheSk7CisgICAgICBDUERGX0NvbG9yU3BhY2U6OkxvYWQobV9wUERGRG9jLkdldCgpLCBwQXJyYXksIHBWaXNpdGVkKTsKICAgaWYgKCFwQ1MpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKQEAgLTM1MSwyMyArMzQyLDI0IEBACiAgIH0KICAgc3RkOjp1bmlxdWVfcHRyPENQREZfUGF0dGVybj4gcFBhdHRlcm47CiAgIGlmIChiU2hhZGluZykgewotICAgIHBQYXR0ZXJuID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU2hhZGluZ1BhdHRlcm4+KG1fcFBERkRvYywgcFBhdHRlcm5PYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgbWF0cml4KTsKKyAgICBwUGF0dGVybiA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1NoYWRpbmdQYXR0ZXJuPigKKyAgICAgICAgbV9wUERGRG9jLkdldCgpLCBwUGF0dGVybk9iaiwgdHJ1ZSwgbWF0cml4KTsKICAgfSBlbHNlIHsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFBhdHRlcm5PYmogPyBwUGF0dGVybk9iai0+R2V0RGljdCgpIDogbnVsbHB0cjsKLSAgICBpZiAocERpY3QpIHsKLSAgICAgIGludCB0eXBlID0gcERpY3QtPkdldEludGVnZXJGb3IoIlBhdHRlcm5UeXBlIik7Ci0gICAgICBpZiAodHlwZSA9PSBDUERGX1BhdHRlcm46OlRJTElORykgewotICAgICAgICBwUGF0dGVybiA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1RpbGluZ1BhdHRlcm4+KG1fcFBERkRvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGF0dGVybk9iaiwgbWF0cml4KTsKLSAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBDUERGX1BhdHRlcm46OlNIQURJTkcpIHsKLSAgICAgICAgcFBhdHRlcm4gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TaGFkaW5nUGF0dGVybj4oCi0gICAgICAgICAgICBtX3BQREZEb2MsIHBQYXR0ZXJuT2JqLCBmYWxzZSwgbWF0cml4KTsKLSAgICAgIH0KKyAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFBhdHRlcm5PYmotPkdldERpY3QoKTsKKyAgICBpZiAoIXBEaWN0KQorICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBpbnQgdHlwZSA9IHBEaWN0LT5HZXRJbnRlZ2VyRm9yKCJQYXR0ZXJuVHlwZSIpOworICAgIGlmICh0eXBlID09IENQREZfUGF0dGVybjo6VElMSU5HKSB7CisgICAgICBwUGF0dGVybiA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1RpbGluZ1BhdHRlcm4+KG1fcFBERkRvYy5HZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhdHRlcm5PYmosIG1hdHJpeCk7CisgICAgfSBlbHNlIGlmICh0eXBlID09IENQREZfUGF0dGVybjo6U0hBRElORykgeworICAgICAgcFBhdHRlcm4gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TaGFkaW5nUGF0dGVybj4oCisgICAgICAgICAgbV9wUERGRG9jLkdldCgpLCBwUGF0dGVybk9iaiwgZmFsc2UsIG1hdHJpeCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KICAgfQotICBpZiAoIXBQYXR0ZXJuKQotICAgIHJldHVybiBudWxscHRyOwogCiAgIGlmIChwdERhdGEpIHsKICAgICBwdERhdGEtPnJlc2V0KHN0ZDo6bW92ZShwUGF0dGVybikpOwpAQCAtMzk4LDkxICszOTAsNjYgQEAKICAgcFBhdHRlcm4tPmNsZWFyKCk7CiB9CiAKLUNQREZfSW1hZ2UqIENQREZfRG9jUGFnZURhdGE6OkdldEltYWdlKHVpbnQzMl90IGR3U3RyZWFtT2JqTnVtKSB7CitSZXRhaW5QdHI8Q1BERl9JbWFnZT4gQ1BERl9Eb2NQYWdlRGF0YTo6R2V0SW1hZ2UodWludDMyX3QgZHdTdHJlYW1PYmpOdW0pIHsKICAgQVNTRVJUKGR3U3RyZWFtT2JqTnVtKTsKICAgYXV0byBpdCA9IG1fSW1hZ2VNYXAuZmluZChkd1N0cmVhbU9iak51bSk7CiAgIGlmIChpdCAhPSBtX0ltYWdlTWFwLmVuZCgpKQotICAgIHJldHVybiBpdC0+c2Vjb25kLT5BZGRSZWYoKTsKKyAgICByZXR1cm4gaXQtPnNlY29uZDsKIAotICBDUERGX0NvdW50ZWRJbWFnZSogcENvdW50ZWRJbWFnZSA9IG5ldyBDUERGX0NvdW50ZWRJbWFnZSgKLSAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0ltYWdlPihtX3BQREZEb2MsIGR3U3RyZWFtT2JqTnVtKSk7Ci0gIG1fSW1hZ2VNYXBbZHdTdHJlYW1PYmpOdW1dID0gcENvdW50ZWRJbWFnZTsKLSAgcmV0dXJuIHBDb3VudGVkSW1hZ2UtPkFkZFJlZigpOworICBhdXRvIHBJbWFnZSA9IHBkZml1bTo6TWFrZVJldGFpbjxDUERGX0ltYWdlPihtX3BQREZEb2MuR2V0KCksIGR3U3RyZWFtT2JqTnVtKTsKKyAgbV9JbWFnZU1hcFtkd1N0cmVhbU9iak51bV0gPSBwSW1hZ2U7CisgIHJldHVybiBwSW1hZ2U7CiB9CiAKLXZvaWQgQ1BERl9Eb2NQYWdlRGF0YTo6UmVsZWFzZUltYWdlKHVpbnQzMl90IGR3U3RyZWFtT2JqTnVtKSB7Cit2b2lkIENQREZfRG9jUGFnZURhdGE6Ok1heWJlUHVyZ2VJbWFnZSh1aW50MzJfdCBkd1N0cmVhbU9iak51bSkgewogICBBU1NFUlQoZHdTdHJlYW1PYmpOdW0pOwogICBhdXRvIGl0ID0gbV9JbWFnZU1hcC5maW5kKGR3U3RyZWFtT2JqTnVtKTsKLSAgaWYgKGl0ID09IG1fSW1hZ2VNYXAuZW5kKCkpCi0gICAgcmV0dXJuOwotCi0gIENQREZfQ291bnRlZEltYWdlKiBwQ291bnRlZEltYWdlID0gaXQtPnNlY29uZDsKLSAgaWYgKCFwQ291bnRlZEltYWdlKQotICAgIHJldHVybjsKLQotICBwQ291bnRlZEltYWdlLT5SZW1vdmVSZWYoKTsKLSAgaWYgKHBDb3VudGVkSW1hZ2UtPnVzZV9jb3VudCgpID4gMSkKLSAgICByZXR1cm47Ci0KLSAgLy8gV2UgaGF2ZSBpdGVtIG9ubHkgaW4gbV9JbWFnZU1hcCBjYWNoZS4gQ2xlYW4gaXQuCi0gIGRlbGV0ZSBwQ291bnRlZEltYWdlLT5nZXQoKTsKLSAgZGVsZXRlIHBDb3VudGVkSW1hZ2U7Ci0gIG1fSW1hZ2VNYXAuZXJhc2UoaXQpOworICBpZiAoaXQgIT0gbV9JbWFnZU1hcC5lbmQoKSAmJiBpdC0+c2Vjb25kLT5IYXNPbmVSZWYoKSkKKyAgICBtX0ltYWdlTWFwLmVyYXNlKGl0KTsKIH0KIAotQ1BERl9JY2NQcm9maWxlKiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRJY2NQcm9maWxlKAotICAgIENQREZfU3RyZWFtKiBwSWNjUHJvZmlsZVN0cmVhbSkgewotICBpZiAoIXBJY2NQcm9maWxlU3RyZWFtKQorUmV0YWluUHRyPENQREZfSWNjUHJvZmlsZT4gQ1BERl9Eb2NQYWdlRGF0YTo6R2V0SWNjUHJvZmlsZSgKKyAgICBDUERGX1N0cmVhbSogcFByb2ZpbGVTdHJlYW0pIHsKKyAgaWYgKCFwUHJvZmlsZVN0cmVhbSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAotICBhdXRvIGl0ID0gbV9JY2NQcm9maWxlTWFwLmZpbmQocEljY1Byb2ZpbGVTdHJlYW0pOworICBhdXRvIGl0ID0gbV9JY2NQcm9maWxlTWFwLmZpbmQocFByb2ZpbGVTdHJlYW0pOwogICBpZiAoaXQgIT0gbV9JY2NQcm9maWxlTWFwLmVuZCgpKQotICAgIHJldHVybiBpdC0+c2Vjb25kLT5BZGRSZWYoKTsKKyAgICByZXR1cm4gaXQtPnNlY29uZDsKIAotICBDUERGX1N0cmVhbUFjYyBzdHJlYW07Ci0gIHN0cmVhbS5Mb2FkQWxsRGF0YShwSWNjUHJvZmlsZVN0cmVhbSwgZmFsc2UpOworICBhdXRvIHBBY2Nlc3NvciA9IHBkZml1bTo6TWFrZVJldGFpbjxDUERGX1N0cmVhbUFjYz4ocFByb2ZpbGVTdHJlYW0pOworICBwQWNjZXNzb3ItPkxvYWRBbGxEYXRhRmlsdGVyZWQoKTsKKwogICB1aW50OF90IGRpZ2VzdFsyMF07Ci0gIENSWVBUX1NIQTFHZW5lcmF0ZShzdHJlYW0uR2V0RGF0YSgpLCBzdHJlYW0uR2V0U2l6ZSgpLCBkaWdlc3QpOwotICBDRlhfQnl0ZVN0cmluZyBic0RpZ2VzdChkaWdlc3QsIDIwKTsKKyAgQ1JZUFRfU0hBMUdlbmVyYXRlKHBBY2Nlc3Nvci0+R2V0RGF0YSgpLCBwQWNjZXNzb3ItPkdldFNpemUoKSwgZGlnZXN0KTsKKworICBCeXRlU3RyaW5nIGJzRGlnZXN0KGRpZ2VzdCwgMjApOwogICBhdXRvIGhhc2hfaXQgPSBtX0hhc2hQcm9maWxlTWFwLmZpbmQoYnNEaWdlc3QpOwogICBpZiAoaGFzaF9pdCAhPSBtX0hhc2hQcm9maWxlTWFwLmVuZCgpKSB7CiAgICAgYXV0byBpdF9jb3BpZWRfc3RyZWFtID0gbV9JY2NQcm9maWxlTWFwLmZpbmQoaGFzaF9pdC0+c2Vjb25kKTsKICAgICBpZiAoaXRfY29waWVkX3N0cmVhbSAhPSBtX0ljY1Byb2ZpbGVNYXAuZW5kKCkpCi0gICAgICByZXR1cm4gaXRfY29waWVkX3N0cmVhbS0+c2Vjb25kLT5BZGRSZWYoKTsKKyAgICAgIHJldHVybiBpdF9jb3BpZWRfc3RyZWFtLT5zZWNvbmQ7CiAgIH0KLSAgQ1BERl9Db3VudGVkSWNjUHJvZmlsZSogaXBEYXRhID0gbmV3IENQREZfQ291bnRlZEljY1Byb2ZpbGUoCi0gICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9JY2NQcm9maWxlPihzdHJlYW0uR2V0RGF0YSgpLCBzdHJlYW0uR2V0U2l6ZSgpKSk7Ci0gIG1fSWNjUHJvZmlsZU1hcFtwSWNjUHJvZmlsZVN0cmVhbV0gPSBpcERhdGE7Ci0gIG1fSGFzaFByb2ZpbGVNYXBbYnNEaWdlc3RdID0gcEljY1Byb2ZpbGVTdHJlYW07Ci0gIHJldHVybiBpcERhdGEtPkFkZFJlZigpOworICBhdXRvIHBQcm9maWxlID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfSWNjUHJvZmlsZT4oCisgICAgICBwUHJvZmlsZVN0cmVhbSwgcEFjY2Vzc29yLT5HZXREYXRhKCksIHBBY2Nlc3Nvci0+R2V0U2l6ZSgpKTsKKyAgbV9JY2NQcm9maWxlTWFwW3BQcm9maWxlU3RyZWFtXSA9IHBQcm9maWxlOworICBtX0hhc2hQcm9maWxlTWFwW2JzRGlnZXN0XSA9IHBQcm9maWxlU3RyZWFtOworICByZXR1cm4gcFByb2ZpbGU7CiB9CiAKLXZvaWQgQ1BERl9Eb2NQYWdlRGF0YTo6UmVsZWFzZUljY1Byb2ZpbGUoY29uc3QgQ1BERl9JY2NQcm9maWxlKiBwSWNjUHJvZmlsZSkgewotICBBU1NFUlQocEljY1Byb2ZpbGUpOwotCi0gIGZvciAoYXV0byBpdCA9IG1fSWNjUHJvZmlsZU1hcC5iZWdpbigpOyBpdCAhPSBtX0ljY1Byb2ZpbGVNYXAuZW5kKCk7ICsraXQpIHsKLSAgICBDUERGX0NvdW50ZWRJY2NQcm9maWxlKiBwcm9maWxlID0gaXQtPnNlY29uZDsKLSAgICBpZiAocHJvZmlsZS0+Z2V0KCkgIT0gcEljY1Byb2ZpbGUpCi0gICAgICBjb250aW51ZTsKLQotICAgIHByb2ZpbGUtPlJlbW92ZVJlZigpOwotICAgIGlmIChwcm9maWxlLT51c2VfY291bnQoKSA+IDEpCi0gICAgICBjb250aW51ZTsKLSAgICAvLyBXZSBoYXZlIGl0ZW0gb25seSBpbiBtX0ljY1Byb2ZpbGVNYXAgY2FjaGUuIENsZWFuIGl0LgotICAgIGRlbGV0ZSBwcm9maWxlLT5nZXQoKTsKLSAgICBkZWxldGUgcHJvZmlsZTsKK3ZvaWQgQ1BERl9Eb2NQYWdlRGF0YTo6TWF5YmVQdXJnZUljY1Byb2ZpbGUoQ1BERl9TdHJlYW0qIHBQcm9maWxlU3RyZWFtKSB7CisgIEFTU0VSVChwUHJvZmlsZVN0cmVhbSk7CisgIGF1dG8gaXQgPSBtX0ljY1Byb2ZpbGVNYXAuZmluZChwUHJvZmlsZVN0cmVhbSk7CisgIGlmIChpdCAhPSBtX0ljY1Byb2ZpbGVNYXAuZW5kKCkgJiYgaXQtPnNlY29uZC0+SGFzT25lUmVmKCkpCiAgICAgbV9JY2NQcm9maWxlTWFwLmVyYXNlKGl0KTsKLSAgICByZXR1cm47Ci0gIH0KIH0KIAotQ1BERl9TdHJlYW1BY2MqIENQREZfRG9jUGFnZURhdGE6OkdldEZvbnRGaWxlU3RyZWFtQWNjKAorUmV0YWluUHRyPENQREZfU3RyZWFtQWNjPiBDUERGX0RvY1BhZ2VEYXRhOjpHZXRGb250RmlsZVN0cmVhbUFjYygKICAgICBDUERGX1N0cmVhbSogcEZvbnRTdHJlYW0pIHsKICAgQVNTRVJUKHBGb250U3RyZWFtKTsKLQogICBhdXRvIGl0ID0gbV9Gb250RmlsZU1hcC5maW5kKHBGb250U3RyZWFtKTsKICAgaWYgKGl0ICE9IG1fRm9udEZpbGVNYXAuZW5kKCkpCi0gICAgcmV0dXJuIGl0LT5zZWNvbmQtPkFkZFJlZigpOworICAgIHJldHVybiBpdC0+c2Vjb25kOwogCiAgIENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0ID0gcEZvbnRTdHJlYW0tPkdldERpY3QoKTsKICAgaW50MzJfdCBvcmdfc2l6ZSA9IHBGb250RGljdC0+R2V0SW50ZWdlckZvcigiTGVuZ3RoMSIpICsKQEAgLTQ5MCwzNiArNDU3LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICBwRm9udERpY3QtPkdldEludGVnZXJGb3IoIkxlbmd0aDMiKTsKICAgb3JnX3NpemUgPSBzdGQ6Om1heChvcmdfc2l6ZSwgMCk7CiAKLSAgYXV0byBwRm9udEFjYyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmVhbUFjYz4oKTsKLSAgcEZvbnRBY2MtPkxvYWRBbGxEYXRhKHBGb250U3RyZWFtLCBmYWxzZSwgb3JnX3NpemUpOwotCi0gIENQREZfQ291bnRlZFN0cmVhbUFjYyogcENvdW50ZWRGb250ID0KLSAgICAgIG5ldyBDUERGX0NvdW50ZWRTdHJlYW1BY2Moc3RkOjptb3ZlKHBGb250QWNjKSk7Ci0gIG1fRm9udEZpbGVNYXBbcEZvbnRTdHJlYW1dID0gcENvdW50ZWRGb250OwotICByZXR1cm4gcENvdW50ZWRGb250LT5BZGRSZWYoKTsKKyAgYXV0byBwRm9udEFjYyA9IHBkZml1bTo6TWFrZVJldGFpbjxDUERGX1N0cmVhbUFjYz4ocEZvbnRTdHJlYW0pOworICBwRm9udEFjYy0+TG9hZEFsbERhdGEoZmFsc2UsIG9yZ19zaXplLCBmYWxzZSk7CisgIG1fRm9udEZpbGVNYXBbcEZvbnRTdHJlYW1dID0gcEZvbnRBY2M7CisgIHJldHVybiBwRm9udEFjYzsKIH0KIAotdm9pZCBDUERGX0RvY1BhZ2VEYXRhOjpSZWxlYXNlRm9udEZpbGVTdHJlYW1BY2MoCit2b2lkIENQREZfRG9jUGFnZURhdGE6Ok1heWJlUHVyZ2VGb250RmlsZVN0cmVhbUFjYygKICAgICBjb25zdCBDUERGX1N0cmVhbSogcEZvbnRTdHJlYW0pIHsKICAgaWYgKCFwRm9udFN0cmVhbSkKICAgICByZXR1cm47CiAKICAgYXV0byBpdCA9IG1fRm9udEZpbGVNYXAuZmluZChwRm9udFN0cmVhbSk7Ci0gIGlmIChpdCA9PSBtX0ZvbnRGaWxlTWFwLmVuZCgpKQotICAgIHJldHVybjsKLQotICBDUERGX0NvdW50ZWRTdHJlYW1BY2MqIHBDb3VudGVkU3RyZWFtID0gaXQtPnNlY29uZDsKLSAgaWYgKCFwQ291bnRlZFN0cmVhbSkKLSAgICByZXR1cm47Ci0KLSAgcENvdW50ZWRTdHJlYW0tPlJlbW92ZVJlZigpOwotICBpZiAocENvdW50ZWRTdHJlYW0tPnVzZV9jb3VudCgpID4gMSkKLSAgICByZXR1cm47Ci0KLSAgLy8gV2UgaGF2ZSBpdGVtIG9ubHkgaW4gbV9Gb250RmlsZU1hcCBjYWNoZS4gQ2xlYW4gaXQuCi0gIGRlbGV0ZSBwQ291bnRlZFN0cmVhbS0+Z2V0KCk7Ci0gIGRlbGV0ZSBwQ291bnRlZFN0cmVhbTsKLSAgbV9Gb250RmlsZU1hcC5lcmFzZShpdCk7CisgIGlmIChpdCAhPSBtX0ZvbnRGaWxlTWFwLmVuZCgpICYmIGl0LT5zZWNvbmQtPkhhc09uZVJlZigpKQorICAgIG1fRm9udEZpbGVNYXAuZXJhc2UoaXQpOwogfQogCiBDUERGX0NvdW50ZWRDb2xvclNwYWNlKiBDUERGX0RvY1BhZ2VEYXRhOjpGaW5kQ29sb3JTcGFjZVB0cigKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZG9jcGFnZWRhdGEuaCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZG9jcGFnZWRhdGEuaAppbmRleCAzNzUzOGViLi4wMjEwN2FhIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2RvY3BhZ2VkYXRhLmgKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9kb2NwYWdlZGF0YS5oCkBAIC0xMCw5ICsxMCwxMCBAQAogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxzZXQ+CiAKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvdW50ZWRvYmplY3QuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbG9yc3BhY2UuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAKIGNsYXNzIENQREZfRGljdGlvbmFyeTsKIGNsYXNzIENQREZfRG9jdW1lbnQ7CkBAIC0yMSw2ICsyMiw3IEBACiBjbGFzcyBDUERGX0ljY1Byb2ZpbGU7CiBjbGFzcyBDUERGX0ltYWdlOwogY2xhc3MgQ1BERl9PYmplY3Q7CitjbGFzcyBDUERGX1BhdHRlcm47CiBjbGFzcyBDUERGX1N0cmVhbTsKIGNsYXNzIENQREZfU3RyZWFtQWNjOwogCkBAIC0zMCw1NiArMzIsNTEgQEAKICAgfkNQREZfRG9jUGFnZURhdGEoKTsKIAogICB2b2lkIENsZWFyKGJvb2wgYlJlbGVhc2UgPSBmYWxzZSk7CisgIGJvb2wgSXNGb3JjZUNsZWFyKCkgY29uc3QgeyByZXR1cm4gbV9iRm9yY2VDbGVhcjsgfQorCiAgIENQREZfRm9udCogR2V0Rm9udChDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCk7Ci0gIENQREZfRm9udCogR2V0U3RhbmRhcmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmb250TmFtZSwKKyAgQ1BERl9Gb250KiBHZXRTdGFuZGFyZEZvbnQoY29uc3QgQnl0ZVN0cmluZyYgZm9udE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udEVuY29kaW5nKiBwRW5jb2RpbmcpOwogICB2b2lkIFJlbGVhc2VGb250KGNvbnN0IENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0KTsKKwogICBDUERGX0NvbG9yU3BhY2UqIEdldENvbG9yU3BhY2UoQ1BERl9PYmplY3QqIHBDU09iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJlc291cmNlcyk7CisgIENQREZfQ29sb3JTcGFjZSogR2V0Q29sb3JTcGFjZUd1YXJkZWQoQ1BERl9PYmplY3QqIHBDU09iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8Q1BERl9PYmplY3QqPiogcFZpc2l0ZWQpOworCiAgIENQREZfQ29sb3JTcGFjZSogR2V0Q29waWVkQ29sb3JTcGFjZShDUERGX09iamVjdCogcENTT2JqKTsKICAgdm9pZCBSZWxlYXNlQ29sb3JTcGFjZShjb25zdCBDUERGX09iamVjdCogcENvbG9yU3BhY2UpOworCiAgIENQREZfUGF0dGVybiogR2V0UGF0dGVybihDUERGX09iamVjdCogcFBhdHRlcm5PYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGFkaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KTsKICAgdm9pZCBSZWxlYXNlUGF0dGVybihjb25zdCBDUERGX09iamVjdCogcFBhdHRlcm5PYmopOwotICBDUERGX0ltYWdlKiBHZXRJbWFnZSh1aW50MzJfdCBkd1N0cmVhbU9iak51bSk7Ci0gIHZvaWQgUmVsZWFzZUltYWdlKHVpbnQzMl90IGR3U3RyZWFtT2JqTnVtKTsKLSAgQ1BERl9JY2NQcm9maWxlKiBHZXRJY2NQcm9maWxlKENQREZfU3RyZWFtKiBwSWNjUHJvZmlsZVN0cmVhbSk7Ci0gIHZvaWQgUmVsZWFzZUljY1Byb2ZpbGUoY29uc3QgQ1BERl9JY2NQcm9maWxlKiBwSWNjUHJvZmlsZSk7Ci0gIENQREZfU3RyZWFtQWNjKiBHZXRGb250RmlsZVN0cmVhbUFjYyhDUERGX1N0cmVhbSogcEZvbnRTdHJlYW0pOwotICB2b2lkIFJlbGVhc2VGb250RmlsZVN0cmVhbUFjYyhjb25zdCBDUERGX1N0cmVhbSogcEZvbnRTdHJlYW0pOwotICBib29sIElzRm9yY2VDbGVhcigpIGNvbnN0IHsgcmV0dXJuIG1fYkZvcmNlQ2xlYXI7IH0KKworICBSZXRhaW5QdHI8Q1BERl9JbWFnZT4gR2V0SW1hZ2UodWludDMyX3QgZHdTdHJlYW1PYmpOdW0pOworICB2b2lkIE1heWJlUHVyZ2VJbWFnZSh1aW50MzJfdCBkd1N0cmVhbU9iak51bSk7CisKKyAgUmV0YWluUHRyPENQREZfSWNjUHJvZmlsZT4gR2V0SWNjUHJvZmlsZShDUERGX1N0cmVhbSogcFByb2ZpbGVTdHJlYW0pOworICB2b2lkIE1heWJlUHVyZ2VJY2NQcm9maWxlKENQREZfU3RyZWFtKiBwUHJvZmlsZVN0cmVhbSk7CisKKyAgUmV0YWluUHRyPENQREZfU3RyZWFtQWNjPiBHZXRGb250RmlsZVN0cmVhbUFjYyhDUERGX1N0cmVhbSogcEZvbnRTdHJlYW0pOworICB2b2lkIE1heWJlUHVyZ2VGb250RmlsZVN0cmVhbUFjYyhjb25zdCBDUERGX1N0cmVhbSogcEZvbnRTdHJlYW0pOworCiAgIENQREZfQ291bnRlZENvbG9yU3BhY2UqIEZpbmRDb2xvclNwYWNlUHRyKENQREZfT2JqZWN0KiBwQ1NPYmopIGNvbnN0OwogICBDUERGX0NvdW50ZWRQYXR0ZXJuKiBGaW5kUGF0dGVyblB0cihDUERGX09iamVjdCogcFBhdHRlcm5PYmopIGNvbnN0OwogCiAgcHJpdmF0ZToKICAgdXNpbmcgQ1BERl9Db3VudGVkRm9udCA9IENQREZfQ291bnRlZE9iamVjdDxDUERGX0ZvbnQ+OwotICB1c2luZyBDUERGX0NvdW50ZWRJY2NQcm9maWxlID0gQ1BERl9Db3VudGVkT2JqZWN0PENQREZfSWNjUHJvZmlsZT47Ci0gIHVzaW5nIENQREZfQ291bnRlZEltYWdlID0gQ1BERl9Db3VudGVkT2JqZWN0PENQREZfSW1hZ2U+OwotICB1c2luZyBDUERGX0NvdW50ZWRTdHJlYW1BY2MgPSBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9TdHJlYW1BY2M+OwogCi0gIHVzaW5nIENQREZfQ29sb3JTcGFjZU1hcCA9Ci0gICAgICBzdGQ6Om1hcDxjb25zdCBDUERGX09iamVjdCosIENQREZfQ291bnRlZENvbG9yU3BhY2UqPjsKLSAgdXNpbmcgQ1BERl9Gb250RmlsZU1hcCA9IHN0ZDo6bWFwPGNvbnN0IENQREZfU3RyZWFtKiwgQ1BERl9Db3VudGVkU3RyZWFtQWNjKj47Ci0gIHVzaW5nIENQREZfRm9udE1hcCA9IHN0ZDo6bWFwPGNvbnN0IENQREZfRGljdGlvbmFyeSosIENQREZfQ291bnRlZEZvbnQqPjsKLSAgdXNpbmcgQ1BERl9JY2NQcm9maWxlTWFwID0KLSAgICAgIHN0ZDo6bWFwPGNvbnN0IENQREZfU3RyZWFtKiwgQ1BERl9Db3VudGVkSWNjUHJvZmlsZSo+OwotICB1c2luZyBDUERGX0ltYWdlTWFwID0gc3RkOjptYXA8dWludDMyX3QsIENQREZfQ291bnRlZEltYWdlKj47Ci0gIHVzaW5nIENQREZfUGF0dGVybk1hcCA9IHN0ZDo6bWFwPGNvbnN0IENQREZfT2JqZWN0KiwgQ1BERl9Db3VudGVkUGF0dGVybio+OwotCi0gIENQREZfQ29sb3JTcGFjZSogR2V0Q29sb3JTcGFjZUltcGwoQ1BERl9PYmplY3QqIHBDU09iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8Q1BERl9PYmplY3QqPiogcFZpc2l0ZWQpOwotCi0gIENQREZfRG9jdW1lbnQqIGNvbnN0IG1fcFBERkRvYzsKICAgYm9vbCBtX2JGb3JjZUNsZWFyOwotICBzdGQ6Om1hcDxDRlhfQnl0ZVN0cmluZywgQ1BERl9TdHJlYW0qPiBtX0hhc2hQcm9maWxlTWFwOwotICBDUERGX0NvbG9yU3BhY2VNYXAgbV9Db2xvclNwYWNlTWFwOwotICBDUERGX0ZvbnRGaWxlTWFwIG1fRm9udEZpbGVNYXA7Ci0gIENQREZfRm9udE1hcCBtX0ZvbnRNYXA7Ci0gIENQREZfSWNjUHJvZmlsZU1hcCBtX0ljY1Byb2ZpbGVNYXA7Ci0gIENQREZfSW1hZ2VNYXAgbV9JbWFnZU1hcDsKLSAgQ1BERl9QYXR0ZXJuTWFwIG1fUGF0dGVybk1hcDsKKyAgVW5vd25lZFB0cjxDUERGX0RvY3VtZW50PiBjb25zdCBtX3BQREZEb2M7CisgIHN0ZDo6bWFwPEJ5dGVTdHJpbmcsIENQREZfU3RyZWFtKj4gbV9IYXNoUHJvZmlsZU1hcDsKKyAgc3RkOjptYXA8Y29uc3QgQ1BERl9PYmplY3QqLCBDUERGX0NvdW50ZWRDb2xvclNwYWNlKj4gbV9Db2xvclNwYWNlTWFwOworICBzdGQ6Om1hcDxjb25zdCBDUERGX1N0cmVhbSosIFJldGFpblB0cjxDUERGX1N0cmVhbUFjYz4+IG1fRm9udEZpbGVNYXA7CisgIHN0ZDo6bWFwPGNvbnN0IENQREZfRGljdGlvbmFyeSosIENQREZfQ291bnRlZEZvbnQqPiBtX0ZvbnRNYXA7CisgIHN0ZDo6bWFwPGNvbnN0IENQREZfU3RyZWFtKiwgUmV0YWluUHRyPENQREZfSWNjUHJvZmlsZT4+IG1fSWNjUHJvZmlsZU1hcDsKKyAgc3RkOjptYXA8dWludDMyX3QsIFJldGFpblB0cjxDUERGX0ltYWdlPj4gbV9JbWFnZU1hcDsKKyAgc3RkOjptYXA8Y29uc3QgQ1BERl9PYmplY3QqLCBDUERGX0NvdW50ZWRQYXR0ZXJuKj4gbV9QYXR0ZXJuTWFwOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfUEFHRV9DUERGX0RPQ1BBR0VEQVRBX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2V4cGludGZ1bmMuY3BwIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9leHBpbnRmdW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDEyMTMxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9leHBpbnRmdW5jLmNwcApAQCAtMCwwICsxLDYwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2V4cGludGZ1bmMuaCIKKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9tZW1vcnkuaCIKKworQ1BERl9FeHBJbnRGdW5jOjpDUERGX0V4cEludEZ1bmMoKQorICAgIDogQ1BERl9GdW5jdGlvbihUeXBlOjprVHlwZTJFeHBvdGVudGlhbEludGVycG9sYXRpb24pLAorICAgICAgbV9wQmVnaW5WYWx1ZXMobnVsbHB0ciksCisgICAgICBtX3BFbmRWYWx1ZXMobnVsbHB0cikge30KKworQ1BERl9FeHBJbnRGdW5jOjp+Q1BERl9FeHBJbnRGdW5jKCkgeworICBGWF9GcmVlKG1fcEJlZ2luVmFsdWVzKTsKKyAgRlhfRnJlZShtX3BFbmRWYWx1ZXMpOworfQorCitib29sIENQREZfRXhwSW50RnVuYzo6dl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKSB7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwT2JqLT5HZXREaWN0KCk7CisgIGlmICghcERpY3QpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENQREZfQXJyYXkqIHBBcnJheTAgPSBwRGljdC0+R2V0QXJyYXlGb3IoIkMwIik7CisgIGlmIChtX25PdXRwdXRzID09IDApIHsKKyAgICBtX25PdXRwdXRzID0gMTsKKyAgICBpZiAocEFycmF5MCkKKyAgICAgIG1fbk91dHB1dHMgPSBwQXJyYXkwLT5HZXRDb3VudCgpOworICB9CisKKyAgQ1BERl9BcnJheSogcEFycmF5MSA9IHBEaWN0LT5HZXRBcnJheUZvcigiQzEiKTsKKyAgbV9wQmVnaW5WYWx1ZXMgPSBGWF9BbGxvYzJEKGZsb2F0LCBtX25PdXRwdXRzLCAyKTsKKyAgbV9wRW5kVmFsdWVzID0gRlhfQWxsb2MyRChmbG9hdCwgbV9uT3V0cHV0cywgMik7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX25PdXRwdXRzOyBpKyspIHsKKyAgICBtX3BCZWdpblZhbHVlc1tpXSA9IHBBcnJheTAgPyBwQXJyYXkwLT5HZXRGbG9hdEF0KGkpIDogMC4wZjsKKyAgICBtX3BFbmRWYWx1ZXNbaV0gPSBwQXJyYXkxID8gcEFycmF5MS0+R2V0RmxvYXRBdChpKSA6IDEuMGY7CisgIH0KKworICBtX0V4cG9uZW50ID0gcERpY3QtPkdldEZsb2F0Rm9yKCJOIik7CisgIG1fbk9yaWdPdXRwdXRzID0gbV9uT3V0cHV0czsKKyAgaWYgKG1fbk91dHB1dHMgJiYgbV9uSW5wdXRzID4gSU5UX01BWCAvIG1fbk91dHB1dHMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG1fbk91dHB1dHMgKj0gbV9uSW5wdXRzOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDUERGX0V4cEludEZ1bmM6OnZfQ2FsbChmbG9hdCogaW5wdXRzLCBmbG9hdCogcmVzdWx0cykgY29uc3QgeworICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9uSW5wdXRzOyBpKyspCisgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IG1fbk9yaWdPdXRwdXRzOyBqKyspIHsKKyAgICAgIHJlc3VsdHNbaSAqIG1fbk9yaWdPdXRwdXRzICsgal0gPQorICAgICAgICAgIG1fcEJlZ2luVmFsdWVzW2pdICsgRlhTWVNfcG93KGlucHV0c1tpXSwgbV9FeHBvbmVudCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3BFbmRWYWx1ZXNbal0gLSBtX3BCZWdpblZhbHVlc1tqXSk7CisgICAgfQorICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZXhwaW50ZnVuYy5oIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9leHBpbnRmdW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY3ZDJmYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZXhwaW50ZnVuYy5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZQREZBUElfUEFHRV9DUERGX0VYUElOVEZVTkNfSF8KKyNkZWZpbmUgQ09SRV9GUERGQVBJX1BBR0VfQ1BERl9FWFBJTlRGVU5DX0hfCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2Z1bmN0aW9uLmgiCisKK2NsYXNzIENQREZfRXhwSW50RnVuYyA6IHB1YmxpYyBDUERGX0Z1bmN0aW9uIHsKKyBwdWJsaWM6CisgIENQREZfRXhwSW50RnVuYygpOworICB+Q1BERl9FeHBJbnRGdW5jKCkgb3ZlcnJpZGU7CisKKyAgLy8gQ1BERl9GdW5jdGlvbgorICBib29sIHZfSW5pdChDUERGX09iamVjdCogcE9iaikgb3ZlcnJpZGU7CisgIGJvb2wgdl9DYWxsKGZsb2F0KiBpbnB1dHMsIGZsb2F0KiByZXN1bHRzKSBjb25zdCBvdmVycmlkZTsKKworICB1aW50MzJfdCBtX25PcmlnT3V0cHV0czsKKyAgZmxvYXQgbV9FeHBvbmVudDsKKyAgZmxvYXQqIG1fcEJlZ2luVmFsdWVzOworICBmbG9hdCogbV9wRW5kVmFsdWVzOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfUEFHRV9DUERGX0VYUElOVEZVTkNfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZm9ybS5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2Zvcm0uY3BwCmluZGV4IGIzZjJiMzcuLmJiMDZjYmYgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZm9ybS5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9mb3JtLmNwcApAQCAtOSw3ICs5LDYgQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbnRlbnRwYXJzZXIuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2VvYmplY3QuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2VvYmplY3Rob2xkZXIuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9wYWdlaW50LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgpAQCAtMTcsMTcgKzE2LDE2IEBACiBDUERGX0Zvcm06OkNQREZfRm9ybShDUERGX0RvY3VtZW50KiBwRG9jLAogICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwRm9ybVN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhcmVudFJlc291cmNlcykgewotICBtX3BEb2N1bWVudCA9IHBEb2M7CisgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYXJlbnRSZXNvdXJjZXMpCisgICAgOiBDUERGX1BhZ2VPYmplY3RIb2xkZXIocERvYywgcEZvcm1TdHJlYW0tPkdldERpY3QoKSkgewogICBtX3BGb3JtU3RyZWFtID0gcEZvcm1TdHJlYW07Ci0gIG1fcEZvcm1EaWN0ID0gcEZvcm1TdHJlYW0gPyBwRm9ybVN0cmVhbS0+R2V0RGljdCgpIDogbnVsbHB0cjsKICAgbV9wUmVzb3VyY2VzID0gbV9wRm9ybURpY3QtPkdldERpY3RGb3IoIlJlc291cmNlcyIpOwogICBtX3BQYWdlUmVzb3VyY2VzID0gcFBhZ2VSZXNvdXJjZXM7CiAgIGlmICghbV9wUmVzb3VyY2VzKQogICAgIG1fcFJlc291cmNlcyA9IHBQYXJlbnRSZXNvdXJjZXM7CiAgIGlmICghbV9wUmVzb3VyY2VzKQogICAgIG1fcFJlc291cmNlcyA9IHBQYWdlUmVzb3VyY2VzOwotICBtX1RyYW5zcGFyZW5jeSA9IDA7CisgIG1faVRyYW5zcGFyZW5jeSA9IDA7CiAgIExvYWRUcmFuc0luZm8oKTsKIH0KIApAQCAtMzYsMTkgKzM0LDI5IEBACiB2b2lkIENQREZfRm9ybTo6U3RhcnRQYXJzZShDUERGX0FsbFN0YXRlcyogcEdyYXBoaWNTdGF0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwUGFyZW50TWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9UeXBlM0NoYXIqIHBUeXBlM0NoYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PGNvbnN0IHVpbnQ4X3QqPiogcGFyc2VkU2V0KSB7CiAgIGlmIChtX1BhcnNlU3RhdGUgPT0gQ09OVEVOVF9QQVJTRUQgfHwgbV9QYXJzZVN0YXRlID09IENPTlRFTlRfUEFSU0lORykKICAgICByZXR1cm47CiAKLSAgbV9wUGFyc2VyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfQ29udGVudFBhcnNlcj4oKTsKLSAgbV9wUGFyc2VyLT5TdGFydCh0aGlzLCBwR3JhcGhpY1N0YXRlcywgcFBhcmVudE1hdHJpeCwgcFR5cGUzQ2hhciwgbGV2ZWwpOworICBpZiAoIXBhcnNlZFNldCkgeworICAgIGlmICghbV9QYXJzZWRTZXQpCisgICAgICBtX1BhcnNlZFNldCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxzdGQ6OnNldDxjb25zdCB1aW50OF90Kj4+KCk7CisgICAgcGFyc2VkU2V0ID0gbV9QYXJzZWRTZXQuZ2V0KCk7CisgIH0KKworICBtX3BQYXJzZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9Db250ZW50UGFyc2VyPigKKyAgICAgIHRoaXMsIHBHcmFwaGljU3RhdGVzLCBwUGFyZW50TWF0cml4LCBwVHlwZTNDaGFyLCBwYXJzZWRTZXQpOwogICBtX1BhcnNlU3RhdGUgPSBDT05URU5UX1BBUlNJTkc7CiB9CiAKLXZvaWQgQ1BERl9Gb3JtOjpQYXJzZUNvbnRlbnQoQ1BERl9BbGxTdGF0ZXMqIHBHcmFwaGljU3RhdGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwUGFyZW50TWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1R5cGUzQ2hhciogcFR5cGUzQ2hhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsKSB7Ci0gIFN0YXJ0UGFyc2UocEdyYXBoaWNTdGF0ZXMsIHBQYXJlbnRNYXRyaXgsIHBUeXBlM0NoYXIsIGxldmVsKTsKK3ZvaWQgQ1BERl9Gb3JtOjpQYXJzZUNvbnRlbnQoKSB7CisgIFBhcnNlQ29udGVudFdpdGhQYXJhbXMobnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cik7Cit9CisKK3ZvaWQgQ1BERl9Gb3JtOjpQYXJzZUNvbnRlbnRXaXRoUGFyYW1zKENQREZfQWxsU3RhdGVzKiBwR3JhcGhpY1N0YXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBQYXJlbnRNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1R5cGUzQ2hhciogcFR5cGUzQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PGNvbnN0IHVpbnQ4X3QqPiogcGFyc2VkU2V0KSB7CisgIFN0YXJ0UGFyc2UocEdyYXBoaWNTdGF0ZXMsIHBQYXJlbnRNYXRyaXgsIHBUeXBlM0NoYXIsIHBhcnNlZFNldCk7CiAgIENvbnRpbnVlUGFyc2UobnVsbHB0cik7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2Zvcm0uaCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZm9ybS5oCmluZGV4IDkxMGYzOGYuLmM1Mjg1YTEgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZm9ybS5oCisrKyBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZm9ybS5oCkBAIC03LDYgKzcsOSBAQAogI2lmbmRlZiBDT1JFX0ZQREZBUElfUEFHRV9DUERGX0ZPUk1fSF8KICNkZWZpbmUgQ09SRV9GUERGQVBJX1BBR0VfQ1BERl9GT1JNX0hfCiAKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgorCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlb2JqZWN0aG9sZGVyLmgiCiAKIGNsYXNzIENQREZfRG9jdW1lbnQ7CkBAIC0yNCwxNiArMjcsMTkgQEAKICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhcmVudFJlc291cmNlcyA9IG51bGxwdHIpOwogICB+Q1BERl9Gb3JtKCkgb3ZlcnJpZGU7CiAKLSAgdm9pZCBQYXJzZUNvbnRlbnQoQ1BERl9BbGxTdGF0ZXMqIHBHcmFwaGljU3RhdGVzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwUGFyZW50TWF0cml4LAotICAgICAgICAgICAgICAgICAgICBDUERGX1R5cGUzQ2hhciogcFR5cGUzQ2hhciwKLSAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsID0gMCk7CisgIHZvaWQgUGFyc2VDb250ZW50KCk7CisgIHZvaWQgUGFyc2VDb250ZW50V2l0aFBhcmFtcyhDUERGX0FsbFN0YXRlcyogcEdyYXBoaWNTdGF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwUGFyZW50TWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9UeXBlM0NoYXIqIHBUeXBlM0NoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxjb25zdCB1aW50OF90Kj4qIHBhcnNlZFNldCk7CiAKICBwcml2YXRlOgogICB2b2lkIFN0YXJ0UGFyc2UoQ1BERl9BbGxTdGF0ZXMqIHBHcmFwaGljU3RhdGVzLAogICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFBhcmVudE1hdHJpeCwKICAgICAgICAgICAgICAgICAgIENQREZfVHlwZTNDaGFyKiBwVHlwZTNDaGFyLAotICAgICAgICAgICAgICAgICAgaW50IGxldmVsID0gMCk7CisgICAgICAgICAgICAgICAgICBzdGQ6OnNldDxjb25zdCB1aW50OF90Kj4qIHBhcnNlZFNldCk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6c2V0PGNvbnN0IHVpbnQ4X3QqPj4gbV9QYXJzZWRTZXQ7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9QQUdFX0NQREZfRk9STV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9mb3Jtb2JqZWN0LmNwcCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZm9ybW9iamVjdC5jcHAKaW5kZXggNTY0MmE1ZC4uZWNhOTJjYSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9mb3Jtb2JqZWN0LmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2Zvcm1vYmplY3QuY3BwCkBAIC02LDkgKzYsMTMgQEAKIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZm9ybW9iamVjdC5oIgogCisjaW5jbHVkZSA8dXRpbGl0eT4KKwogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZm9ybS5oIgogCi1DUERGX0Zvcm1PYmplY3Q6OkNQREZfRm9ybU9iamVjdCgpIHt9CitDUERGX0Zvcm1PYmplY3Q6OkNQREZfRm9ybU9iamVjdChzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Gb3JtPiBwRm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkKKyAgICA6IG1fcEZvcm0oc3RkOjptb3ZlKHBGb3JtKSksIG1fRm9ybU1hdHJpeChtYXRyaXgpIHt9CiAKIENQREZfRm9ybU9iamVjdDo6fkNQREZfRm9ybU9iamVjdCgpIHt9CiAKQEAgLTM0LDggKzM4LDggQEAKIH0KIAogdm9pZCBDUERGX0Zvcm1PYmplY3Q6OkNhbGNCb3VuZGluZ0JveCgpIHsKLSAgQ0ZYX0Zsb2F0UmVjdCBmb3JtX3JlY3QgPSBtX3BGb3JtLT5DYWxjQm91bmRpbmdCb3goKTsKLSAgbV9Gb3JtTWF0cml4LlRyYW5zZm9ybVJlY3QoZm9ybV9yZWN0KTsKKyAgQ0ZYX0Zsb2F0UmVjdCBmb3JtX3JlY3QgPQorICAgICAgbV9Gb3JtTWF0cml4LlRyYW5zZm9ybVJlY3QobV9wRm9ybS0+Q2FsY0JvdW5kaW5nQm94KCkpOwogICBtX0xlZnQgPSBmb3JtX3JlY3QubGVmdDsKICAgbV9Cb3R0b20gPSBmb3JtX3JlY3QuYm90dG9tOwogICBtX1JpZ2h0ID0gZm9ybV9yZWN0LnJpZ2h0OwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9mb3Jtb2JqZWN0LmggYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2Zvcm1vYmplY3QuaAppbmRleCBiMTNjYjVmLi5jNzIzY2MwIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2Zvcm1vYmplY3QuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2Zvcm1vYmplY3QuaApAQCAtMTYsNyArMTYsNyBAQAogCiBjbGFzcyBDUERGX0Zvcm1PYmplY3QgOiBwdWJsaWMgQ1BERl9QYWdlT2JqZWN0IHsKICBwdWJsaWM6Ci0gIENQREZfRm9ybU9iamVjdCgpOworICBDUERGX0Zvcm1PYmplY3Qoc3RkOjp1bmlxdWVfcHRyPENQREZfRm9ybT4gcEZvcm0sIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCk7CiAgIH5DUERGX0Zvcm1PYmplY3QoKSBvdmVycmlkZTsKIAogICAvLyBDUERGX1BhZ2VPYmplY3Q6CkBAIC0yOCw4ICsyOCwxMCBAQAogCiAgIHZvaWQgQ2FsY0JvdW5kaW5nQm94KCk7CiAgIGNvbnN0IENQREZfRm9ybSogZm9ybSgpIGNvbnN0IHsgcmV0dXJuIG1fcEZvcm0uZ2V0KCk7IH0KKyAgY29uc3QgQ0ZYX01hdHJpeCYgZm9ybV9tYXRyaXgoKSBjb25zdCB7IHJldHVybiBtX0Zvcm1NYXRyaXg7IH0KIAotICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Gb3JtPiBtX3BGb3JtOworIHByaXZhdGU6CisgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDUERGX0Zvcm0+IG1fcEZvcm07CiAgIENGWF9NYXRyaXggbV9Gb3JtTWF0cml4OwogfTsKIApkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9mdW5jdGlvbi5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2Z1bmN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzVjNTNhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9mdW5jdGlvbi5jcHAKQEAgLTAsMCArMSwxNTMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZnVuY3Rpb24uaCIKKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZXhwaW50ZnVuYy5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcHNmdW5jLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zYW1wbGVkZnVuYy5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc3RpdGNoZnVuYy5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworLy8gc3RhdGljCitzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9GdW5jdGlvbj4gQ1BERl9GdW5jdGlvbjo6TG9hZChDUERGX09iamVjdCogcEZ1bmNPYmopIHsKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfRnVuY3Rpb24+IHBGdW5jOworICBpZiAoIXBGdW5jT2JqKQorICAgIHJldHVybiBwRnVuYzsKKworICBpbnQgaVR5cGUgPSAtMTsKKyAgaWYgKENQREZfU3RyZWFtKiBwU3RyZWFtID0gcEZ1bmNPYmotPkFzU3RyZWFtKCkpCisgICAgaVR5cGUgPSBwU3RyZWFtLT5HZXREaWN0KCktPkdldEludGVnZXJGb3IoIkZ1bmN0aW9uVHlwZSIpOworICBlbHNlIGlmIChDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcEZ1bmNPYmotPkFzRGljdGlvbmFyeSgpKQorICAgIGlUeXBlID0gcERpY3QtPkdldEludGVnZXJGb3IoIkZ1bmN0aW9uVHlwZSIpOworCisgIFR5cGUgdHlwZSA9IEludGVnZXJUb0Z1bmN0aW9uVHlwZShpVHlwZSk7CisgIGlmICh0eXBlID09IFR5cGU6OmtUeXBlMFNhbXBsZWQpCisgICAgcEZ1bmMgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TYW1wbGVkRnVuYz4oKTsKKyAgZWxzZSBpZiAodHlwZSA9PSBUeXBlOjprVHlwZTJFeHBvdGVudGlhbEludGVycG9sYXRpb24pCisgICAgcEZ1bmMgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9FeHBJbnRGdW5jPigpOworICBlbHNlIGlmICh0eXBlID09IFR5cGU6OmtUeXBlM1N0aXRjaGluZykKKyAgICBwRnVuYyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0aXRjaEZ1bmM+KCk7CisgIGVsc2UgaWYgKHR5cGUgPT0gVHlwZTo6a1R5cGU0UG9zdFNjcmlwdCkKKyAgICBwRnVuYyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1BTRnVuYz4oKTsKKworICBpZiAoIXBGdW5jIHx8ICFwRnVuYy0+SW5pdChwRnVuY09iaikpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgcmV0dXJuIHBGdW5jOworfQorCisvLyBzdGF0aWMKK0NQREZfRnVuY3Rpb246OlR5cGUgQ1BERl9GdW5jdGlvbjo6SW50ZWdlclRvRnVuY3Rpb25UeXBlKGludCBpVHlwZSkgeworICBzd2l0Y2ggKGlUeXBlKSB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMjoKKyAgICBjYXNlIDM6CisgICAgY2FzZSA0OgorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFR5cGU+KGlUeXBlKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIFR5cGU6OmtUeXBlSW52YWxpZDsKKyAgfQorfQorCitDUERGX0Z1bmN0aW9uOjpDUERGX0Z1bmN0aW9uKFR5cGUgdHlwZSkKKyAgICA6IG1fcERvbWFpbnMobnVsbHB0ciksIG1fcFJhbmdlcyhudWxscHRyKSwgbV9UeXBlKHR5cGUpIHt9CisKK0NQREZfRnVuY3Rpb246On5DUERGX0Z1bmN0aW9uKCkgeworICBGWF9GcmVlKG1fcERvbWFpbnMpOworICBGWF9GcmVlKG1fcFJhbmdlcyk7Cit9CisKK2Jvb2wgQ1BERl9GdW5jdGlvbjo6SW5pdChDUERGX09iamVjdCogcE9iaikgeworICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBPYmotPkFzU3RyZWFtKCk7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU3RyZWFtID8gcFN0cmVhbS0+R2V0RGljdCgpIDogcE9iai0+QXNEaWN0aW9uYXJ5KCk7CisKKyAgQ1BERl9BcnJheSogcERvbWFpbnMgPSBwRGljdC0+R2V0QXJyYXlGb3IoIkRvbWFpbiIpOworICBpZiAoIXBEb21haW5zKQorICAgIHJldHVybiBmYWxzZTsKKworICBtX25JbnB1dHMgPSBwRG9tYWlucy0+R2V0Q291bnQoKSAvIDI7CisgIGlmIChtX25JbnB1dHMgPT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbV9wRG9tYWlucyA9IEZYX0FsbG9jMkQoZmxvYXQsIG1fbklucHV0cywgMik7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX25JbnB1dHMgKiAyOyBpKyspIHsKKyAgICBtX3BEb21haW5zW2ldID0gcERvbWFpbnMtPkdldEZsb2F0QXQoaSk7CisgIH0KKyAgQ1BERl9BcnJheSogcFJhbmdlcyA9IHBEaWN0LT5HZXRBcnJheUZvcigiUmFuZ2UiKTsKKyAgbV9uT3V0cHV0cyA9IDA7CisgIGlmIChwUmFuZ2VzKSB7CisgICAgbV9uT3V0cHV0cyA9IHBSYW5nZXMtPkdldENvdW50KCkgLyAyOworICAgIG1fcFJhbmdlcyA9IEZYX0FsbG9jMkQoZmxvYXQsIG1fbk91dHB1dHMsIDIpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX25PdXRwdXRzICogMjsgaSsrKQorICAgICAgbV9wUmFuZ2VzW2ldID0gcFJhbmdlcy0+R2V0RmxvYXRBdChpKTsKKyAgfQorICB1aW50MzJfdCBvbGRfb3V0cHV0cyA9IG1fbk91dHB1dHM7CisgIGlmICghdl9Jbml0KHBPYmopKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKG1fcFJhbmdlcyAmJiBtX25PdXRwdXRzID4gb2xkX291dHB1dHMpIHsKKyAgICBtX3BSYW5nZXMgPSBGWF9SZWFsbG9jKGZsb2F0LCBtX3BSYW5nZXMsIG1fbk91dHB1dHMgKiAyKTsKKyAgICBpZiAobV9wUmFuZ2VzKSB7CisgICAgICBtZW1zZXQobV9wUmFuZ2VzICsgKG9sZF9vdXRwdXRzICogMiksIDAsCisgICAgICAgICAgICAgc2l6ZW9mKGZsb2F0KSAqIChtX25PdXRwdXRzIC0gb2xkX291dHB1dHMpICogMik7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIENQREZfRnVuY3Rpb246OkNhbGwoZmxvYXQqIGlucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbnJlc3VsdHMpIGNvbnN0IHsKKyAgaWYgKG1fbklucHV0cyAhPSBuaW5wdXRzKQorICAgIHJldHVybiBmYWxzZTsKKworICAqbnJlc3VsdHMgPSBtX25PdXRwdXRzOworICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9uSW5wdXRzOyBpKyspIHsKKyAgICBpbnB1dHNbaV0gPQorICAgICAgICBwZGZpdW06OmNsYW1wKGlucHV0c1tpXSwgbV9wRG9tYWluc1tpICogMl0sIG1fcERvbWFpbnNbaSAqIDIgKyAxXSk7CisgIH0KKyAgdl9DYWxsKGlucHV0cywgcmVzdWx0cyk7CisgIGlmICghbV9wUmFuZ2VzKQorICAgIHJldHVybiB0cnVlOworCisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX25PdXRwdXRzOyBpKyspIHsKKyAgICByZXN1bHRzW2ldID0KKyAgICAgICAgcGRmaXVtOjpjbGFtcChyZXN1bHRzW2ldLCBtX3BSYW5nZXNbaSAqIDJdLCBtX3BSYW5nZXNbaSAqIDIgKyAxXSk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFNlZSBQREYgUmVmZXJlbmNlIDEuNywgcGFnZSAxNzAuCitmbG9hdCBDUERGX0Z1bmN0aW9uOjpJbnRlcnBvbGF0ZShmbG9hdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHhtYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5bWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeW1heCkgY29uc3QgeworICBmbG9hdCBkaXZpc29yID0geG1heCAtIHhtaW47CisgIHJldHVybiB5bWluICsgKGRpdmlzb3IgPyAoeCAtIHhtaW4pICogKHltYXggLSB5bWluKSAvIGRpdmlzb3IgOiAwKTsKK30KKworY29uc3QgQ1BERl9TYW1wbGVkRnVuYyogQ1BERl9GdW5jdGlvbjo6VG9TYW1wbGVkRnVuYygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fVHlwZSA9PSBUeXBlOjprVHlwZTBTYW1wbGVkCisgICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxjb25zdCBDUERGX1NhbXBsZWRGdW5jKj4odGhpcykKKyAgICAgICAgICAgICA6IG51bGxwdHI7Cit9CisKK2NvbnN0IENQREZfRXhwSW50RnVuYyogQ1BERl9GdW5jdGlvbjo6VG9FeHBJbnRGdW5jKCkgY29uc3QgeworICByZXR1cm4gbV9UeXBlID09IFR5cGU6OmtUeXBlMkV4cG90ZW50aWFsSW50ZXJwb2xhdGlvbgorICAgICAgICAgICAgID8gc3RhdGljX2Nhc3Q8Y29uc3QgQ1BERl9FeHBJbnRGdW5jKj4odGhpcykKKyAgICAgICAgICAgICA6IG51bGxwdHI7Cit9CisKK2NvbnN0IENQREZfU3RpdGNoRnVuYyogQ1BERl9GdW5jdGlvbjo6VG9TdGl0Y2hGdW5jKCkgY29uc3QgeworICByZXR1cm4gbV9UeXBlID09IFR5cGU6OmtUeXBlM1N0aXRjaGluZworICAgICAgICAgICAgID8gc3RhdGljX2Nhc3Q8Y29uc3QgQ1BERl9TdGl0Y2hGdW5jKj4odGhpcykKKyAgICAgICAgICAgICA6IG51bGxwdHI7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2Z1bmN0aW9uLmggYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2Z1bmN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3Y2Y4NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZnVuY3Rpb24uaApAQCAtMCwwICsxLDY0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GUERGQVBJX1BBR0VfQ1BERl9GVU5DVElPTl9IXworI2RlZmluZSBDT1JFX0ZQREZBUElfUEFHRV9DUERGX0ZVTkNUSU9OX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK2NsYXNzIENQREZfRXhwSW50RnVuYzsKK2NsYXNzIENQREZfT2JqZWN0OworY2xhc3MgQ1BERl9TYW1wbGVkRnVuYzsKK2NsYXNzIENQREZfU3RpdGNoRnVuYzsKKworY2xhc3MgQ1BERl9GdW5jdGlvbiB7CisgcHVibGljOgorICBlbnVtIGNsYXNzIFR5cGUgeworICAgIGtUeXBlSW52YWxpZCA9IC0xLAorICAgIGtUeXBlMFNhbXBsZWQgPSAwLAorICAgIGtUeXBlMkV4cG90ZW50aWFsSW50ZXJwb2xhdGlvbiA9IDIsCisgICAga1R5cGUzU3RpdGNoaW5nID0gMywKKyAgICBrVHlwZTRQb3N0U2NyaXB0ID0gNCwKKyAgfTsKKworICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPENQREZfRnVuY3Rpb24+IExvYWQoQ1BERl9PYmplY3QqIHBGdW5jT2JqKTsKKyAgc3RhdGljIFR5cGUgSW50ZWdlclRvRnVuY3Rpb25UeXBlKGludCBpVHlwZSk7CisKKyAgdmlydHVhbCB+Q1BERl9GdW5jdGlvbigpOworCisgIGJvb2wgQ2FsbChmbG9hdCogaW5wdXRzLAorICAgICAgICAgICAgdWludDMyX3QgbmlucHV0cywKKyAgICAgICAgICAgIGZsb2F0KiByZXN1bHRzLAorICAgICAgICAgICAgaW50KiBucmVzdWx0cykgY29uc3Q7CisgIHVpbnQzMl90IENvdW50SW5wdXRzKCkgY29uc3QgeyByZXR1cm4gbV9uSW5wdXRzOyB9CisgIHVpbnQzMl90IENvdW50T3V0cHV0cygpIGNvbnN0IHsgcmV0dXJuIG1fbk91dHB1dHM7IH0KKyAgZmxvYXQgR2V0RG9tYWluKGludCBpKSBjb25zdCB7IHJldHVybiBtX3BEb21haW5zW2ldOyB9CisgIGZsb2F0IEdldFJhbmdlKGludCBpKSBjb25zdCB7IHJldHVybiBtX3BSYW5nZXNbaV07IH0KKyAgZmxvYXQgSW50ZXJwb2xhdGUoZmxvYXQgeCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgeG1pbiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgeG1heCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgeW1pbiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgeW1heCkgY29uc3Q7CisKKyAgY29uc3QgQ1BERl9TYW1wbGVkRnVuYyogVG9TYW1wbGVkRnVuYygpIGNvbnN0OworICBjb25zdCBDUERGX0V4cEludEZ1bmMqIFRvRXhwSW50RnVuYygpIGNvbnN0OworICBjb25zdCBDUERGX1N0aXRjaEZ1bmMqIFRvU3RpdGNoRnVuYygpIGNvbnN0OworCisgcHJvdGVjdGVkOgorICBleHBsaWNpdCBDUERGX0Z1bmN0aW9uKFR5cGUgdHlwZSk7CisKKyAgYm9vbCBJbml0KENQREZfT2JqZWN0KiBwT2JqKTsKKyAgdmlydHVhbCBib29sIHZfSW5pdChDUERGX09iamVjdCogcE9iaikgPSAwOworICB2aXJ0dWFsIGJvb2wgdl9DYWxsKGZsb2F0KiBpbnB1dHMsIGZsb2F0KiByZXN1bHRzKSBjb25zdCA9IDA7CisKKyAgdWludDMyX3QgbV9uSW5wdXRzOworICB1aW50MzJfdCBtX25PdXRwdXRzOworICBmbG9hdCogbV9wRG9tYWluczsKKyAgZmxvYXQqIG1fcFJhbmdlczsKKyAgY29uc3QgVHlwZSBtX1R5cGU7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9QQUdFX0NQREZfRlVOQ1RJT05fSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZ2VuZXJhbHN0YXRlLmNwcCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZ2VuZXJhbHN0YXRlLmNwcAppbmRleCA0ZWRkOWIyLi44NDVjZWRkIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2dlbmVyYWxzdGF0ZS5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9nZW5lcmFsc3RhdGUuY3BwCkBAIC0xMyw3ICsxMyw3IEBACiAKIG5hbWVzcGFjZSB7CiAKLWludCBSSV9TdHJpbmdUb0lkKGNvbnN0IENGWF9CeXRlU3RyaW5nJiByaSkgeworaW50IFJJX1N0cmluZ1RvSWQoY29uc3QgQnl0ZVN0cmluZyYgcmkpIHsKICAgdWludDMyX3QgaWQgPSByaS5HZXRJRCgpOwogICBpZiAoaWQgPT0gRlhCU1RSX0lEKCdBJywgJ2InLCAncycsICdvJykpCiAgICAgcmV0dXJuIDE7CkBAIC0yNyw3ICsyNyw3IEBACiAgIHJldHVybiAwOwogfQogCi1pbnQgR2V0QmxlbmRUeXBlSW50ZXJuYWwoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG1vZGUpIHsKK2ludCBHZXRCbGVuZFR5cGVJbnRlcm5hbChjb25zdCBCeXRlU3RyaW5nJiBtb2RlKSB7CiAgIHN3aXRjaCAobW9kZS5HZXRJRCgpKSB7CiAgICAgY2FzZSBGWEJTVFJfSUQoJ04nLCAnbycsICdyJywgJ20nKToKICAgICBjYXNlIEZYQlNUUl9JRCgnQycsICdvJywgJ20nLCAncCcpOgpAQCAtNzUsOSArNzUsNDYgQEAKIAogQ1BERl9HZW5lcmFsU3RhdGU6On5DUERGX0dlbmVyYWxTdGF0ZSgpIHt9CiAKLXZvaWQgQ1BERl9HZW5lcmFsU3RhdGU6OlNldFJlbmRlckludGVudChjb25zdCBDRlhfQnl0ZVN0cmluZyYgcmkpIHsKK3ZvaWQgQ1BERl9HZW5lcmFsU3RhdGU6OlNldFJlbmRlckludGVudChjb25zdCBCeXRlU3RyaW5nJiByaSkgewogICBtX1JlZi5HZXRQcml2YXRlQ29weSgpLT5tX1JlbmRlckludGVudCA9IFJJX1N0cmluZ1RvSWQocmkpOwogfQorQnl0ZVN0cmluZyBDUERGX0dlbmVyYWxTdGF0ZTo6R2V0QmxlbmRNb2RlKCkgY29uc3QgeworICBzd2l0Y2ggKEdldEJsZW5kVHlwZSgpKSB7CisgICAgY2FzZSBGWERJQl9CTEVORF9OT1JNQUw6CisgICAgICByZXR1cm4gQnl0ZVN0cmluZygiTm9ybWFsIik7CisgICAgY2FzZSBGWERJQl9CTEVORF9NVUxUSVBMWToKKyAgICAgIHJldHVybiBCeXRlU3RyaW5nKCJNdWx0aXBseSIpOworICAgIGNhc2UgRlhESUJfQkxFTkRfU0NSRUVOOgorICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcoIlNjcmVlbiIpOworICAgIGNhc2UgRlhESUJfQkxFTkRfT1ZFUkxBWToKKyAgICAgIHJldHVybiBCeXRlU3RyaW5nKCJPdmVybGF5Iik7CisgICAgY2FzZSBGWERJQl9CTEVORF9EQVJLRU46CisgICAgICByZXR1cm4gQnl0ZVN0cmluZygiRGFya2VuIik7CisgICAgY2FzZSBGWERJQl9CTEVORF9MSUdIVEVOOgorICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcoIkxpZ2h0ZW4iKTsKKyAgICBjYXNlIEZYRElCX0JMRU5EX0NPTE9SRE9ER0U6CisgICAgICByZXR1cm4gQnl0ZVN0cmluZygiQ29sb3JEb2RnZSIpOworICAgIGNhc2UgRlhESUJfQkxFTkRfQ09MT1JCVVJOOgorICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcoIkNvbG9yQnVybiIpOworICAgIGNhc2UgRlhESUJfQkxFTkRfSEFSRExJR0hUOgorICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcoIkhhcmRMaWdodCIpOworICAgIGNhc2UgRlhESUJfQkxFTkRfU09GVExJR0hUOgorICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcoIlNvZnRMaWdodCIpOworICAgIGNhc2UgRlhESUJfQkxFTkRfRElGRkVSRU5DRToKKyAgICAgIHJldHVybiBCeXRlU3RyaW5nKCJEaWZmZXJlbmNlIik7CisgICAgY2FzZSBGWERJQl9CTEVORF9FWENMVVNJT046CisgICAgICByZXR1cm4gQnl0ZVN0cmluZygiRXhjbHVzaW9uIik7CisgICAgY2FzZSBGWERJQl9CTEVORF9IVUU6CisgICAgICByZXR1cm4gQnl0ZVN0cmluZygiSHVlIik7CisgICAgY2FzZSBGWERJQl9CTEVORF9TQVRVUkFUSU9OOgorICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcoIlNhdHVyYXRpb24iKTsKKyAgICBjYXNlIEZYRElCX0JMRU5EX0NPTE9SOgorICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcoIkNvbG9yIik7CisgICAgY2FzZSBGWERJQl9CTEVORF9MVU1JTk9TSVRZOgorICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcoIkx1bWlub3NpdHkiKTsKKyAgfQorICByZXR1cm4gQnl0ZVN0cmluZygiTm9ybWFsIik7Cit9CiAKIGludCBDUERGX0dlbmVyYWxTdGF0ZTo6R2V0QmxlbmRUeXBlKCkgY29uc3QgewogICBjb25zdCBTdGF0ZURhdGEqIHBEYXRhID0gbV9SZWYuR2V0T2JqZWN0KCk7CkBAIC04OCwyNyArMTI1LDI3IEBACiAgIG1fUmVmLkdldFByaXZhdGVDb3B5KCktPm1fQmxlbmRUeXBlID0gdHlwZTsKIH0KIAotRlhfRkxPQVQgQ1BERl9HZW5lcmFsU3RhdGU6OkdldEZpbGxBbHBoYSgpIGNvbnN0IHsKK2Zsb2F0IENQREZfR2VuZXJhbFN0YXRlOjpHZXRGaWxsQWxwaGEoKSBjb25zdCB7CiAgIGNvbnN0IFN0YXRlRGF0YSogcERhdGEgPSBtX1JlZi5HZXRPYmplY3QoKTsKICAgcmV0dXJuIHBEYXRhID8gcERhdGEtPm1fRmlsbEFscGhhIDogMS4wZjsKIH0KIAotdm9pZCBDUERGX0dlbmVyYWxTdGF0ZTo6U2V0RmlsbEFscGhhKEZYX0ZMT0FUIGFscGhhKSB7Cit2b2lkIENQREZfR2VuZXJhbFN0YXRlOjpTZXRGaWxsQWxwaGEoZmxvYXQgYWxwaGEpIHsKICAgbV9SZWYuR2V0UHJpdmF0ZUNvcHkoKS0+bV9GaWxsQWxwaGEgPSBhbHBoYTsKIH0KIAotRlhfRkxPQVQgQ1BERl9HZW5lcmFsU3RhdGU6OkdldFN0cm9rZUFscGhhKCkgY29uc3QgeworZmxvYXQgQ1BERl9HZW5lcmFsU3RhdGU6OkdldFN0cm9rZUFscGhhKCkgY29uc3QgewogICBjb25zdCBTdGF0ZURhdGEqIHBEYXRhID0gbV9SZWYuR2V0T2JqZWN0KCk7CiAgIHJldHVybiBwRGF0YSA/IHBEYXRhLT5tX1N0cm9rZUFscGhhIDogMS4wZjsKIH0KIAotdm9pZCBDUERGX0dlbmVyYWxTdGF0ZTo6U2V0U3Ryb2tlQWxwaGEoRlhfRkxPQVQgYWxwaGEpIHsKK3ZvaWQgQ1BERl9HZW5lcmFsU3RhdGU6OlNldFN0cm9rZUFscGhhKGZsb2F0IGFscGhhKSB7CiAgIG1fUmVmLkdldFByaXZhdGVDb3B5KCktPm1fU3Ryb2tlQWxwaGEgPSBhbHBoYTsKIH0KIAogQ1BERl9PYmplY3QqIENQREZfR2VuZXJhbFN0YXRlOjpHZXRTb2Z0TWFzaygpIGNvbnN0IHsKICAgY29uc3QgU3RhdGVEYXRhKiBwRGF0YSA9IG1fUmVmLkdldE9iamVjdCgpOwotICByZXR1cm4gcERhdGEgPyBwRGF0YS0+bV9wU29mdE1hc2sgOiBudWxscHRyOworICByZXR1cm4gcERhdGEgPyBwRGF0YS0+bV9wU29mdE1hc2suR2V0KCkgOiBudWxscHRyOwogfQogCiB2b2lkIENQREZfR2VuZXJhbFN0YXRlOjpTZXRTb2Z0TWFzayhDUERGX09iamVjdCogcE9iamVjdCkgewpAQCAtMTE3LDIzICsxNTQsMjQgQEAKIAogQ1BERl9PYmplY3QqIENQREZfR2VuZXJhbFN0YXRlOjpHZXRUUigpIGNvbnN0IHsKICAgY29uc3QgU3RhdGVEYXRhKiBwRGF0YSA9IG1fUmVmLkdldE9iamVjdCgpOwotICByZXR1cm4gcERhdGEgPyBwRGF0YS0+bV9wVFIgOiBudWxscHRyOworICByZXR1cm4gcERhdGEgPyBwRGF0YS0+bV9wVFIuR2V0KCkgOiBudWxscHRyOwogfQogCiB2b2lkIENQREZfR2VuZXJhbFN0YXRlOjpTZXRUUihDUERGX09iamVjdCogcE9iamVjdCkgewogICBtX1JlZi5HZXRQcml2YXRlQ29weSgpLT5tX3BUUiA9IHBPYmplY3Q7CiB9CiAKLUNQREZfVHJhbnNmZXJGdW5jKiBDUERGX0dlbmVyYWxTdGF0ZTo6R2V0VHJhbnNmZXJGdW5jKCkgY29uc3QgeworUmV0YWluUHRyPENQREZfVHJhbnNmZXJGdW5jPiBDUERGX0dlbmVyYWxTdGF0ZTo6R2V0VHJhbnNmZXJGdW5jKCkgY29uc3QgewogICBjb25zdCBTdGF0ZURhdGEqIHBEYXRhID0gbV9SZWYuR2V0T2JqZWN0KCk7CiAgIHJldHVybiBwRGF0YSA/IHBEYXRhLT5tX3BUcmFuc2ZlckZ1bmMgOiBudWxscHRyOwogfQogCi12b2lkIENQREZfR2VuZXJhbFN0YXRlOjpTZXRUcmFuc2ZlckZ1bmMoQ1BERl9UcmFuc2ZlckZ1bmMqIHBGdW5jKSB7Cit2b2lkIENQREZfR2VuZXJhbFN0YXRlOjpTZXRUcmFuc2ZlckZ1bmMoCisgICAgY29uc3QgUmV0YWluUHRyPENQREZfVHJhbnNmZXJGdW5jPiYgcEZ1bmMpIHsKICAgbV9SZWYuR2V0UHJpdmF0ZUNvcHkoKS0+bV9wVHJhbnNmZXJGdW5jID0gcEZ1bmM7CiB9CiAKLXZvaWQgQ1BERl9HZW5lcmFsU3RhdGU6OlNldEJsZW5kTW9kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgbW9kZSkgewordm9pZCBDUERGX0dlbmVyYWxTdGF0ZTo6U2V0QmxlbmRNb2RlKGNvbnN0IEJ5dGVTdHJpbmcmIG1vZGUpIHsKICAgU3RhdGVEYXRhKiBwRGF0YSA9IG1fUmVmLkdldFByaXZhdGVDb3B5KCk7CiAgIHBEYXRhLT5tX0JsZW5kTW9kZSA9IG1vZGU7CiAgIHBEYXRhLT5tX0JsZW5kVHlwZSA9IEdldEJsZW5kVHlwZUludGVybmFsKG1vZGUpOwpAQCAtMTg2LDExICsyMjQsMTEgQEAKICAgbV9SZWYuR2V0UHJpdmF0ZUNvcHkoKS0+bV9wSFQgPSBwT2JqZWN0OwogfQogCi12b2lkIENQREZfR2VuZXJhbFN0YXRlOjpTZXRGbGF0bmVzcyhGWF9GTE9BVCBmbGF0bmVzcykgewordm9pZCBDUERGX0dlbmVyYWxTdGF0ZTo6U2V0RmxhdG5lc3MoZmxvYXQgZmxhdG5lc3MpIHsKICAgbV9SZWYuR2V0UHJpdmF0ZUNvcHkoKS0+bV9GbGF0bmVzcyA9IGZsYXRuZXNzOwogfQogCi12b2lkIENQREZfR2VuZXJhbFN0YXRlOjpTZXRTbW9vdGhuZXNzKEZYX0ZMT0FUIHNtb290aG5lc3MpIHsKK3ZvaWQgQ1BERl9HZW5lcmFsU3RhdGU6OlNldFNtb290aG5lc3MoZmxvYXQgc21vb3RobmVzcykgewogICBtX1JlZi5HZXRQcml2YXRlQ29weSgpLT5tX1Ntb290aG5lc3MgPSBzbW9vdGhuZXNzOwogfQogCkBAIC0yNjYsMTggKzMwNCwyMSBAQAogICBtX01hdHJpeCA9IHRoYXQubV9NYXRyaXg7CiAgIG1fU01hc2tNYXRyaXggPSB0aGF0Lm1fU01hc2tNYXRyaXg7CiAKLSAgaWYgKHRoYXQubV9wVHJhbnNmZXJGdW5jICYmIHRoYXQubV9wVHJhbnNmZXJGdW5jLT5tX3BQREZEb2MpIHsKKyAgaWYgKHRoYXQubV9wVHJhbnNmZXJGdW5jICYmIHRoYXQubV9wVHJhbnNmZXJGdW5jLT5HZXREb2N1bWVudCgpKSB7CiAgICAgQ1BERl9Eb2NSZW5kZXJEYXRhKiBwRG9jQ2FjaGUgPQotICAgICAgICB0aGF0Lm1fcFRyYW5zZmVyRnVuYy0+bV9wUERGRG9jLT5HZXRSZW5kZXJEYXRhKCk7CisgICAgICAgIHRoYXQubV9wVHJhbnNmZXJGdW5jLT5HZXREb2N1bWVudCgpLT5HZXRSZW5kZXJEYXRhKCk7CiAgICAgaWYgKHBEb2NDYWNoZSkKLSAgICAgIG1fcFRyYW5zZmVyRnVuYyA9IHBEb2NDYWNoZS0+R2V0VHJhbnNmZXJGdW5jKG1fcFRSKTsKKyAgICAgIG1fcFRyYW5zZmVyRnVuYyA9IHBEb2NDYWNoZS0+R2V0VHJhbnNmZXJGdW5jKG1fcFRSLkdldCgpKTsKICAgfQogfQogCiBDUERGX0dlbmVyYWxTdGF0ZTo6U3RhdGVEYXRhOjp+U3RhdGVEYXRhKCkgewotICBpZiAobV9wVHJhbnNmZXJGdW5jICYmIG1fcFRyYW5zZmVyRnVuYy0+bV9wUERGRG9jKSB7Ci0gICAgQ1BERl9Eb2NSZW5kZXJEYXRhKiBwRG9jQ2FjaGUgPSBtX3BUcmFuc2ZlckZ1bmMtPm1fcFBERkRvYy0+R2V0UmVuZGVyRGF0YSgpOwotICAgIGlmIChwRG9jQ2FjaGUpCi0gICAgICBwRG9jQ2FjaGUtPlJlbGVhc2VUcmFuc2ZlckZ1bmMobV9wVFIpOworICBpZiAobV9wVHJhbnNmZXJGdW5jICYmIG1fcFRyYW5zZmVyRnVuYy0+R2V0RG9jdW1lbnQoKSkgeworICAgIENQREZfRG9jUmVuZGVyRGF0YSogcERvY0NhY2hlID0KKyAgICAgICAgbV9wVHJhbnNmZXJGdW5jLT5HZXREb2N1bWVudCgpLT5HZXRSZW5kZXJEYXRhKCk7CisgICAgaWYgKHBEb2NDYWNoZSkgeworICAgICAgbV9wVHJhbnNmZXJGdW5jLlJlc2V0KCk7ICAvLyBHaXZlIHVwIG91ciByZWZlcmVuY2UgZmlyc3QuCisgICAgICBwRG9jQ2FjaGUtPk1heWJlUHVyZ2VUcmFuc2ZlckZ1bmMobV9wVFIuR2V0KCkpOworICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9nZW5lcmFsc3RhdGUuaCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZ2VuZXJhbHN0YXRlLmgKaW5kZXggNTIxMWM1Mi4uNWQ2ZDVkYyAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9nZW5lcmFsc3RhdGUuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2dlbmVyYWxzdGF0ZS5oCkBAIC03LDggKzcsMTAgQEAKICNpZm5kZWYgQ09SRV9GUERGQVBJX1BBR0VfQ1BERl9HRU5FUkFMU1RBVEVfSF8KICNkZWZpbmUgQ09SRV9GUERGQVBJX1BBR0VfQ1BERl9HRU5FUkFMU1RBVEVfSF8KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3NoYXJlZF9jb3B5X29uX3dyaXRlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9meF9kaWIuaCIKIAogY2xhc3MgQ1BERl9PYmplY3Q7CkBAIC0yMSwxOCArMjMsMTkgQEAKICAgfkNQREZfR2VuZXJhbFN0YXRlKCk7CiAKICAgdm9pZCBFbXBsYWNlKCkgeyBtX1JlZi5FbXBsYWNlKCk7IH0KLSAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuICEhbV9SZWY7IH0KKyAgYm9vbCBIYXNSZWYoKSBjb25zdCB7IHJldHVybiAhIW1fUmVmOyB9CiAKLSAgdm9pZCBTZXRSZW5kZXJJbnRlbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHJpKTsKKyAgdm9pZCBTZXRSZW5kZXJJbnRlbnQoY29uc3QgQnl0ZVN0cmluZyYgcmkpOwogCisgIEJ5dGVTdHJpbmcgR2V0QmxlbmRNb2RlKCkgY29uc3Q7CiAgIGludCBHZXRCbGVuZFR5cGUoKSBjb25zdDsKICAgdm9pZCBTZXRCbGVuZFR5cGUoaW50IHR5cGUpOwogCi0gIEZYX0ZMT0FUIEdldEZpbGxBbHBoYSgpIGNvbnN0OwotICB2b2lkIFNldEZpbGxBbHBoYShGWF9GTE9BVCBhbHBoYSk7CisgIGZsb2F0IEdldEZpbGxBbHBoYSgpIGNvbnN0OworICB2b2lkIFNldEZpbGxBbHBoYShmbG9hdCBhbHBoYSk7CiAKLSAgRlhfRkxPQVQgR2V0U3Ryb2tlQWxwaGEoKSBjb25zdDsKLSAgdm9pZCBTZXRTdHJva2VBbHBoYShGWF9GTE9BVCBhbHBoYSk7CisgIGZsb2F0IEdldFN0cm9rZUFscGhhKCkgY29uc3Q7CisgIHZvaWQgU2V0U3Ryb2tlQWxwaGEoZmxvYXQgYWxwaGEpOwogCiAgIENQREZfT2JqZWN0KiBHZXRTb2Z0TWFzaygpIGNvbnN0OwogICB2b2lkIFNldFNvZnRNYXNrKENQREZfT2JqZWN0KiBwT2JqZWN0KTsKQEAgLTQwLDEwICs0MywxMCBAQAogICBDUERGX09iamVjdCogR2V0VFIoKSBjb25zdDsKICAgdm9pZCBTZXRUUihDUERGX09iamVjdCogcE9iamVjdCk7CiAKLSAgQ1BERl9UcmFuc2ZlckZ1bmMqIEdldFRyYW5zZmVyRnVuYygpIGNvbnN0OwotICB2b2lkIFNldFRyYW5zZmVyRnVuYyhDUERGX1RyYW5zZmVyRnVuYyogcEZ1bmMpOworICBSZXRhaW5QdHI8Q1BERl9UcmFuc2ZlckZ1bmM+IEdldFRyYW5zZmVyRnVuYygpIGNvbnN0OworICB2b2lkIFNldFRyYW5zZmVyRnVuYyhjb25zdCBSZXRhaW5QdHI8Q1BERl9UcmFuc2ZlckZ1bmM+JiBwRnVuYyk7CiAKLSAgdm9pZCBTZXRCbGVuZE1vZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG1vZGUpOworICB2b2lkIFNldEJsZW5kTW9kZShjb25zdCBCeXRlU3RyaW5nJiBtb2RlKTsKIAogICBjb25zdCBDRlhfTWF0cml4KiBHZXRTTWFza01hdHJpeCgpIGNvbnN0OwogICB2b2lkIFNldFNNYXNrTWF0cml4KGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCk7CkBAIC02MSw4ICs2NCw4IEBACiAgIHZvaWQgU2V0VUNSKENQREZfT2JqZWN0KiBwT2JqZWN0KTsKICAgdm9pZCBTZXRIVChDUERGX09iamVjdCogcE9iamVjdCk7CiAKLSAgdm9pZCBTZXRGbGF0bmVzcyhGWF9GTE9BVCBmbGF0bmVzcyk7Ci0gIHZvaWQgU2V0U21vb3RobmVzcyhGWF9GTE9BVCBzbW9vdGhuZXNzKTsKKyAgdm9pZCBTZXRGbGF0bmVzcyhmbG9hdCBmbGF0bmVzcyk7CisgIHZvaWQgU2V0U21vb3RobmVzcyhmbG9hdCBzbW9vdGhuZXNzKTsKIAogICBib29sIEdldFN0cm9rZUFkanVzdCgpIGNvbnN0OwogICB2b2lkIFNldFN0cm9rZUFkanVzdChib29sIGFkanVzdCk7CkBAIC03NCwyMCArNzcsMjAgQEAKICAgQ0ZYX01hdHJpeCogR2V0TXV0YWJsZU1hdHJpeCgpOwogCiAgcHJpdmF0ZToKLSAgY2xhc3MgU3RhdGVEYXRhIHsKKyAgY2xhc3MgU3RhdGVEYXRhIDogcHVibGljIFJldGFpbmFibGUgewogICAgcHVibGljOgogICAgIFN0YXRlRGF0YSgpOwogICAgIFN0YXRlRGF0YShjb25zdCBTdGF0ZURhdGEmIHRoYXQpOwotICAgIH5TdGF0ZURhdGEoKTsKKyAgICB+U3RhdGVEYXRhKCkgb3ZlcnJpZGU7CiAKLSAgICBDRlhfQnl0ZVN0cmluZyBtX0JsZW5kTW9kZTsKKyAgICBCeXRlU3RyaW5nIG1fQmxlbmRNb2RlOwogICAgIGludCBtX0JsZW5kVHlwZTsKLSAgICBDUERGX09iamVjdCogbV9wU29mdE1hc2s7CisgICAgVW5vd25lZFB0cjxDUERGX09iamVjdD4gbV9wU29mdE1hc2s7CiAgICAgQ0ZYX01hdHJpeCBtX1NNYXNrTWF0cml4OwotICAgIEZYX0ZMT0FUIG1fU3Ryb2tlQWxwaGE7Ci0gICAgRlhfRkxPQVQgbV9GaWxsQWxwaGE7Ci0gICAgQ1BERl9PYmplY3QqIG1fcFRSOwotICAgIENQREZfVHJhbnNmZXJGdW5jKiBtX3BUcmFuc2ZlckZ1bmM7CisgICAgZmxvYXQgbV9TdHJva2VBbHBoYTsKKyAgICBmbG9hdCBtX0ZpbGxBbHBoYTsKKyAgICBVbm93bmVkUHRyPENQREZfT2JqZWN0PiBtX3BUUjsKKyAgICBSZXRhaW5QdHI8Q1BERl9UcmFuc2ZlckZ1bmM+IG1fcFRyYW5zZmVyRnVuYzsKICAgICBDRlhfTWF0cml4IG1fTWF0cml4OwogICAgIGludCBtX1JlbmRlckludGVudDsKICAgICBib29sIG1fU3Ryb2tlQWRqdXN0OwpAQCAtOTYsMTQgKzk5LDE0IEBACiAgICAgYm9vbCBtX1N0cm9rZU9QOwogICAgIGJvb2wgbV9GaWxsT1A7CiAgICAgaW50IG1fT1BNb2RlOwotICAgIENQREZfT2JqZWN0KiBtX3BCRzsKLSAgICBDUERGX09iamVjdCogbV9wVUNSOwotICAgIENQREZfT2JqZWN0KiBtX3BIVDsKLSAgICBGWF9GTE9BVCBtX0ZsYXRuZXNzOwotICAgIEZYX0ZMT0FUIG1fU21vb3RobmVzczsKKyAgICBVbm93bmVkUHRyPENQREZfT2JqZWN0PiBtX3BCRzsKKyAgICBVbm93bmVkUHRyPENQREZfT2JqZWN0PiBtX3BVQ1I7CisgICAgVW5vd25lZFB0cjxDUERGX09iamVjdD4gbV9wSFQ7CisgICAgZmxvYXQgbV9GbGF0bmVzczsKKyAgICBmbG9hdCBtX1Ntb290aG5lc3M7CiAgIH07CiAKLSAgQ0ZYX1NoYXJlZENvcHlPbldyaXRlPFN0YXRlRGF0YT4gbV9SZWY7CisgIFNoYXJlZENvcHlPbldyaXRlPFN0YXRlRGF0YT4gbV9SZWY7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9QQUdFX0NQREZfR0VORVJBTFNUQVRFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2ljY3Byb2ZpbGUuY3BwIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9pY2Nwcm9maWxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDRmNTMwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9pY2Nwcm9maWxlLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2ljY3Byb2ZpbGUuaCIKKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9jcGRmX21vZHVsZW1nci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2ljY21vZHVsZS5oIgorCituYW1lc3BhY2UgeworCitib29sIERldGVjdFNSR0IoY29uc3QgdWludDhfdCogcERhdGEsIHVpbnQzMl90IGR3U2l6ZSkgeworICByZXR1cm4gZHdTaXplID09IDMxNDQgJiYgbWVtY21wKHBEYXRhICsgMHgxOTAsICJzUkdCIElFQzYxOTY2LTIuMSIsIDE3KSA9PSAwOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQ1BERl9JY2NQcm9maWxlOjpDUERGX0ljY1Byb2ZpbGUoQ1BERl9TdHJlYW0qIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U2l6ZSkKKyAgICA6IG1fYnNSR0IoRGV0ZWN0U1JHQihwRGF0YSwgZHdTaXplKSksIG1fcFN0cmVhbShwU3RyZWFtKSB7CisgIGlmIChtX2JzUkdCKSB7CisgICAgbV9uU3JjQ29tcG9uZW50cyA9IDM7CisgICAgcmV0dXJuOworICB9CisKKyAgdWludDMyX3QgblNyY0NvbXBzID0gMDsKKyAgYXV0byogcEljY01vZHVsZSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SWNjTW9kdWxlKCk7CisgIG1fVHJhbnNmb3JtID0gcEljY01vZHVsZS0+Q3JlYXRlVHJhbnNmb3JtX3NSR0IocERhdGEsIGR3U2l6ZSwgJm5TcmNDb21wcyk7CisgIGlmIChtX1RyYW5zZm9ybSkKKyAgICBtX25TcmNDb21wb25lbnRzID0gblNyY0NvbXBzOworfQorCitDUERGX0ljY1Byb2ZpbGU6On5DUERGX0ljY1Byb2ZpbGUoKSB7fQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9pY2Nwcm9maWxlLmggYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2ljY3Byb2ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmM0OThhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9pY2Nwcm9maWxlLmgKQEAgLTAsMCArMSw0MCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlBERkFQSV9QQUdFX0NQREZfSUNDUFJPRklMRV9IXworI2RlZmluZSBDT1JFX0ZQREZBUElfUEFHRV9DUERGX0lDQ1BST0ZJTEVfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKKworY2xhc3MgQ0xjbXNDbW07CitjbGFzcyBDUERGX1N0cmVhbTsKKworY2xhc3MgQ1BERl9JY2NQcm9maWxlIDogcHVibGljIFJldGFpbmFibGUgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3M+CisgIGZyaWVuZCBSZXRhaW5QdHI8VD4gcGRmaXVtOjpNYWtlUmV0YWluKEFyZ3MmJi4uLiBhcmdzKTsKKworICBDUERGX1N0cmVhbSogR2V0U3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbV9wU3RyZWFtLkdldCgpOyB9CisgIGJvb2wgSXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIElzU1JHQigpIHx8IElzU3VwcG9ydGVkKCk7IH0KKyAgYm9vbCBJc1NSR0IoKSBjb25zdCB7IHJldHVybiBtX2JzUkdCOyB9CisgIGJvb2wgSXNTdXBwb3J0ZWQoKSBjb25zdCB7IHJldHVybiAhIW1fVHJhbnNmb3JtOyB9CisgIENMY21zQ21tKiB0cmFuc2Zvcm0oKSB7IHJldHVybiBtX1RyYW5zZm9ybS5nZXQoKTsgfQorICB1aW50MzJfdCBHZXRDb21wb25lbnRzKCkgY29uc3QgeyByZXR1cm4gbV9uU3JjQ29tcG9uZW50czsgfQorCisgcHJpdmF0ZToKKyAgQ1BERl9JY2NQcm9maWxlKENQREZfU3RyZWFtKiBwU3RyZWFtLCBjb25zdCB1aW50OF90KiBwRGF0YSwgdWludDMyX3QgZHdTaXplKTsKKyAgfkNQREZfSWNjUHJvZmlsZSgpIG92ZXJyaWRlOworCisgIGNvbnN0IGJvb2wgbV9ic1JHQjsKKyAgVW5vd25lZFB0cjxDUERGX1N0cmVhbT4gY29uc3QgbV9wU3RyZWFtOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0xjbXNDbW0+IG1fVHJhbnNmb3JtOworICB1aW50MzJfdCBtX25TcmNDb21wb25lbnRzID0gMDsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GUERGQVBJX1BBR0VfQ1BERl9JQ0NQUk9GSUxFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2ltYWdlLmNwcCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfaW1hZ2UuY3BwCmluZGV4IDZiMGJmZDcuLjY1Y2E3OGUgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfaW1hZ2UuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfaW1hZ2UuY3BwCkBAIC0yNCw3ICsyNCw5IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmluZy5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9kaWJzb3VyY2UuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcGFnZXJlbmRlcmNhY2hlLmgiCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2Z4X2NvZGVjLmgiCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19qcGVnbW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJlYW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9kaWJpdG1hcC5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9meF9kaWIuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfY29udmVyc2lvbnMuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCkBAIC03MCw2ICs3MiwxMCBAQAogICBtX3BEb2N1bWVudC0+QWRkSW5kaXJlY3RPYmplY3QobV9wU3RyZWFtLlJlbGVhc2UoKSk7CiB9CiAKK0NQREZfRGljdGlvbmFyeSogQ1BERl9JbWFnZTo6R2V0RGljdCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcFN0cmVhbSA/IG1fcFN0cmVhbS0+R2V0RGljdCgpIDogbnVsbHB0cjsKK30KKwogc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeT4gQ1BERl9JbWFnZTo6SW5pdEpQRUcodWludDhfdCogcERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplKSB7CiAgIGludDMyX3Qgd2lkdGg7CkBAIC04OCw3ICs5NCw3IEBACiAgIHBEaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiU3VidHlwZSIsICJJbWFnZSIpOwogICBwRGljdC0+U2V0TmV3Rm9yPENQREZfTnVtYmVyPigiV2lkdGgiLCB3aWR0aCk7CiAgIHBEaWN0LT5TZXROZXdGb3I8Q1BERl9OdW1iZXI+KCJIZWlnaHQiLCBoZWlnaHQpOwotICBjb25zdCBGWF9DSEFSKiBjc25hbWUgPSBudWxscHRyOworICBjb25zdCBjaGFyKiBjc25hbWUgPSBudWxscHRyOwogICBpZiAobnVtX2NvbXBzID09IDEpIHsKICAgICBjc25hbWUgPSAiRGV2aWNlR3JheSI7CiAgIH0gZWxzZSBpZiAobnVtX2NvbXBzID09IDMpIHsKQEAgLTExNiw4ICsxMjIsNyBAQAogICByZXR1cm4gcERpY3Q7CiB9CiAKLXZvaWQgQ1BERl9JbWFnZTo6U2V0SnBlZ0ltYWdlKAotICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBGaWxlKSB7Cit2b2lkIENQREZfSW1hZ2U6OlNldEpwZWdJbWFnZShjb25zdCBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBGaWxlKSB7CiAgIHVpbnQzMl90IHNpemUgPSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDx1aW50MzJfdD4ocEZpbGUtPkdldFNpemUoKSk7CiAgIGlmICghc2l6ZSkKICAgICByZXR1cm47CkBAIC0xNDEsNyArMTQ2LDcgQEAKIH0KIAogdm9pZCBDUERGX0ltYWdlOjpTZXRKcGVnSW1hZ2VJbmxpbmUoCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGUpIHsKKyAgICBjb25zdCBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBGaWxlKSB7CiAgIHVpbnQzMl90IHNpemUgPSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDx1aW50MzJfdD4ocEZpbGUtPkdldFNpemUoKSk7CiAgIGlmICghc2l6ZSkKICAgICByZXR1cm47CkBAIC0xNTcsNyArMTYyLDcgQEAKICAgbV9wU3RyZWFtLT5Jbml0U3RyZWFtKCYoZGF0YVswXSksIHNpemUsIHN0ZDo6bW92ZShwRGljdCkpOwogfQogCi12b2lkIENQREZfSW1hZ2U6OlNldEltYWdlKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCkgewordm9pZCBDUERGX0ltYWdlOjpTZXRJbWFnZShjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcCkgewogICBpbnQzMl90IEJpdG1hcFdpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKTsKICAgaW50MzJfdCBCaXRtYXBIZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKTsKICAgaWYgKEJpdG1hcFdpZHRoIDwgMSB8fCBCaXRtYXBIZWlnaHQgPCAxKQpAQCAtMTcxLDcgKzE3Niw3IEBACiAgIHBEaWN0LT5TZXROZXdGb3I8Q1BERl9OdW1iZXI+KCJIZWlnaHQiLCBCaXRtYXBIZWlnaHQpOwogCiAgIGNvbnN0IGludDMyX3QgYnBwID0gcEJpdG1hcC0+R2V0QlBQKCk7Ci0gIEZYX1NUUlNJWkUgZGVzdF9waXRjaCA9IDA7CisgIHNpemVfdCBkZXN0X3BpdGNoID0gMDsKICAgYm9vbCBiQ29weVdpdGhvdXRBbHBoYSA9IHRydWU7CiAgIGlmIChicHAgPT0gMSkgewogICAgIGludDMyX3QgcmVzZXRfYSA9IDA7CkBAIC0xODMsOSArMTg4LDEwIEBACiAgICAgaW50MzJfdCBzZXRfZyA9IDA7CiAgICAgaW50MzJfdCBzZXRfYiA9IDA7CiAgICAgaWYgKCFwQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgICBBcmdiRGVjb2RlKHBCaXRtYXAtPkdldFBhbGV0dGVBcmdiKDApLCByZXNldF9hLCByZXNldF9yLCByZXNldF9nLAotICAgICAgICAgICAgICAgICByZXNldF9iKTsKLSAgICAgIEFyZ2JEZWNvZGUocEJpdG1hcC0+R2V0UGFsZXR0ZUFyZ2IoMSksIHNldF9hLCBzZXRfciwgc2V0X2csIHNldF9iKTsKKyAgICAgIHN0ZDo6dGllKHJlc2V0X2EsIHJlc2V0X3IsIHJlc2V0X2csIHJlc2V0X2IpID0KKyAgICAgICAgICBBcmdiRGVjb2RlKHBCaXRtYXAtPkdldFBhbGV0dGVBcmdiKDApKTsKKyAgICAgIHN0ZDo6dGllKHNldF9hLCBzZXRfciwgc2V0X2csIHNldF9iKSA9CisgICAgICAgICAgQXJnYkRlY29kZShwQml0bWFwLT5HZXRQYWxldHRlQXJnYigxKSk7CiAgICAgfQogICAgIGlmIChzZXRfYSA9PSAwIHx8IHJlc2V0X2EgPT0gMCkgewogICAgICAgcERpY3QtPlNldE5ld0ZvcjxDUERGX0Jvb2xlYW4+KCJJbWFnZU1hc2siLCB0cnVlKTsKQEAgLTE5OSwxNCArMjA1LDE0IEBACiAgICAgICBwQ1MtPkFkZE5ldzxDUERGX05hbWU+KCJJbmRleGVkIik7CiAgICAgICBwQ1MtPkFkZE5ldzxDUERGX05hbWU+KCJEZXZpY2VSR0IiKTsKICAgICAgIHBDUy0+QWRkTmV3PENQREZfTnVtYmVyPigxKTsKLSAgICAgIENGWF9CeXRlU3RyaW5nIGN0OwotICAgICAgRlhfQ0hBUiogcEJ1ZiA9IGN0LkdldEJ1ZmZlcig2KTsKLSAgICAgIHBCdWZbMF0gPSAoRlhfQ0hBUilyZXNldF9yOwotICAgICAgcEJ1ZlsxXSA9IChGWF9DSEFSKXJlc2V0X2c7Ci0gICAgICBwQnVmWzJdID0gKEZYX0NIQVIpcmVzZXRfYjsKLSAgICAgIHBCdWZbM10gPSAoRlhfQ0hBUilzZXRfcjsKLSAgICAgIHBCdWZbNF0gPSAoRlhfQ0hBUilzZXRfZzsKLSAgICAgIHBCdWZbNV0gPSAoRlhfQ0hBUilzZXRfYjsKKyAgICAgIEJ5dGVTdHJpbmcgY3Q7CisgICAgICBjaGFyKiBwQnVmID0gY3QuR2V0QnVmZmVyKDYpOworICAgICAgcEJ1ZlswXSA9IChjaGFyKXJlc2V0X3I7CisgICAgICBwQnVmWzFdID0gKGNoYXIpcmVzZXRfZzsKKyAgICAgIHBCdWZbMl0gPSAoY2hhcilyZXNldF9iOworICAgICAgcEJ1ZlszXSA9IChjaGFyKXNldF9yOworICAgICAgcEJ1Zls0XSA9IChjaGFyKXNldF9nOworICAgICAgcEJ1Zls1XSA9IChjaGFyKXNldF9iOwogICAgICAgY3QuUmVsZWFzZUJ1ZmZlcig2KTsKICAgICAgIHBDUy0+QWRkTmV3PENQREZfU3RyaW5nPihjdCwgdHJ1ZSk7CiAgICAgfQpAQCAtMjMzLDggKzIzOSw4IEBACiAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4obV9wRG9jdW1lbnQtPkdldEJ5dGVTdHJpbmdQb29sKCkpOwogICAgICAgQ1BERl9TdHJlYW0qIHBDVFMgPSBtX3BEb2N1bWVudC0+TmV3SW5kaXJlY3Q8Q1BERl9TdHJlYW0+KAogICAgICAgICAgIHN0ZDo6bW92ZShwQ29sb3JUYWJsZSksIGlQYWxldHRlICogMywgc3RkOjptb3ZlKHBOZXdEaWN0KSk7Ci0gICAgICBwQ1MtPkFkZE5ldzxDUERGX1JlZmVyZW5jZT4obV9wRG9jdW1lbnQsIHBDVFMtPkdldE9iak51bSgpKTsKLSAgICAgIHBEaWN0LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJDb2xvclNwYWNlIiwgbV9wRG9jdW1lbnQsCisgICAgICBwQ1MtPkFkZE5ldzxDUERGX1JlZmVyZW5jZT4obV9wRG9jdW1lbnQuR2V0KCksIHBDVFMtPkdldE9iak51bSgpKTsKKyAgICAgIHBEaWN0LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJDb2xvclNwYWNlIiwgbV9wRG9jdW1lbnQuR2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ1MtPkdldE9iak51bSgpKTsKICAgICB9IGVsc2UgewogICAgICAgcERpY3QtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJDb2xvclNwYWNlIiwgIkRldmljZUdyYXkiKTsKQEAgLTI0OCw3ICsyNTQsNyBAQAogICAgIGJDb3B5V2l0aG91dEFscGhhID0gZmFsc2U7CiAgIH0KIAotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBwTWFza0JpdG1hcDsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcE1hc2tCaXRtYXA7CiAgIGlmIChwQml0bWFwLT5IYXNBbHBoYSgpKQogICAgIHBNYXNrQml0bWFwID0gcEJpdG1hcC0+Q2xvbmVBbHBoYU1hc2soKTsKIApAQCAtMjU2LDcgKzI2Miw3IEBACiAgICAgaW50MzJfdCBtYXNrV2lkdGggPSBwTWFza0JpdG1hcC0+R2V0V2lkdGgoKTsKICAgICBpbnQzMl90IG1hc2tIZWlnaHQgPSBwTWFza0JpdG1hcC0+R2V0SGVpZ2h0KCk7CiAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IG1hc2tfYnVmOwotICAgIEZYX1NUUlNJWkUgbWFza19zaXplID0gMDsKKyAgICBpbnQzMl90IG1hc2tfc2l6ZSA9IDA7CiAgICAgYXV0byBwTWFza0RpY3QgPQogICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PihtX3BEb2N1bWVudC0+R2V0Qnl0ZVN0cmluZ1Bvb2woKSk7CiAgICAgcE1hc2tEaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiVHlwZSIsICJYT2JqZWN0Iik7CkBAIC0yNjksMTQgKzI3NSwxNCBAQAogICAgICAgbWFza19idWYucmVzZXQoRlhfQWxsb2MyRCh1aW50OF90LCBtYXNrSGVpZ2h0LCBtYXNrV2lkdGgpKTsKICAgICAgIG1hc2tfc2l6ZSA9IG1hc2tIZWlnaHQgKiBtYXNrV2lkdGg7ICAvLyBTYWZlIHNpbmNlIGNoZWNrZWQgYWxsb2MgcmV0dXJuZWQuCiAgICAgICBmb3IgKGludDMyX3QgYSA9IDA7IGEgPCBtYXNrSGVpZ2h0OyBhKyspIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5KG1hc2tfYnVmLmdldCgpICsgYSAqIG1hc2tXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgIHBNYXNrQml0bWFwLT5HZXRTY2FubGluZShhKSwgbWFza1dpZHRoKTsKKyAgICAgICAgbWVtY3B5KG1hc2tfYnVmLmdldCgpICsgYSAqIG1hc2tXaWR0aCwgcE1hc2tCaXRtYXAtPkdldFNjYW5saW5lKGEpLAorICAgICAgICAgICAgICAgbWFza1dpZHRoKTsKICAgICAgIH0KICAgICB9CiAgICAgcE1hc2tEaWN0LT5TZXROZXdGb3I8Q1BERl9OdW1iZXI+KCJMZW5ndGgiLCBtYXNrX3NpemUpOwogICAgIENQREZfU3RyZWFtKiBwTmV3U3RyZWFtID0gbV9wRG9jdW1lbnQtPk5ld0luZGlyZWN0PENQREZfU3RyZWFtPigKICAgICAgICAgc3RkOjptb3ZlKG1hc2tfYnVmKSwgbWFza19zaXplLCBzdGQ6Om1vdmUocE1hc2tEaWN0KSk7Ci0gICAgcERpY3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIlNNYXNrIiwgbV9wRG9jdW1lbnQsCisgICAgcERpY3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIlNNYXNrIiwgbV9wRG9jdW1lbnQuR2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5ld1N0cmVhbS0+R2V0T2JqTnVtKCkpOwogICB9CiAKQEAgLTI4NCwxMSArMjkwLDExIEBACiAgIGludDMyX3Qgc3JjX3BpdGNoID0gcEJpdG1hcC0+R2V0UGl0Y2goKTsKICAgdWludDhfdCogZGVzdF9idWYgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIGRlc3RfcGl0Y2gsIEJpdG1hcEhlaWdodCk7CiAgIC8vIFNhZmUgYXMgY2hlY2tlZCBhbGxvYyByZXR1cm5lZC4KLSAgRlhfU1RSU0laRSBkZXN0X3NpemUgPSBkZXN0X3BpdGNoICogQml0bWFwSGVpZ2h0OworICBzaXplX3QgZGVzdF9zaXplID0gZGVzdF9waXRjaCAqIEJpdG1hcEhlaWdodDsKICAgdWludDhfdCogcERlc3QgPSBkZXN0X2J1ZjsKICAgaWYgKGJDb3B5V2l0aG91dEFscGhhKSB7CiAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgQml0bWFwSGVpZ2h0OyBpKyspIHsKLSAgICAgIEZYU1lTX21lbWNweShwRGVzdCwgc3JjX2J1ZiwgZGVzdF9waXRjaCk7CisgICAgICBtZW1jcHkocERlc3QsIHNyY19idWYsIGRlc3RfcGl0Y2gpOwogICAgICAgcERlc3QgKz0gZGVzdF9waXRjaDsKICAgICAgIHNyY19idWYgKz0gc3JjX3BpdGNoOwogICAgIH0KQEAgLTI5OCw3ICszMDQsNyBAQAogICAgIGZvciAoaW50MzJfdCByb3cgPSAwOyByb3cgPCBCaXRtYXBIZWlnaHQ7IHJvdysrKSB7CiAgICAgICBzcmNfb2Zmc2V0ID0gcm93ICogc3JjX3BpdGNoOwogICAgICAgZm9yIChpbnQzMl90IGNvbHVtbiA9IDA7IGNvbHVtbiA8IEJpdG1hcFdpZHRoOyBjb2x1bW4rKykgewotICAgICAgICBGWF9GTE9BVCBhbHBoYSA9IDE7CisgICAgICAgIGZsb2F0IGFscGhhID0gMTsKICAgICAgICAgcERlc3RbZGVzdF9vZmZzZXRdID0gKHVpbnQ4X3QpKHNyY19idWZbc3JjX29mZnNldCArIDJdICogYWxwaGEpOwogICAgICAgICBwRGVzdFtkZXN0X29mZnNldCArIDFdID0gKHVpbnQ4X3QpKHNyY19idWZbc3JjX29mZnNldCArIDFdICogYWxwaGEpOwogICAgICAgICBwRGVzdFtkZXN0X29mZnNldCArIDJdID0gKHVpbnQ4X3QpKHNyY19idWZbc3JjX29mZnNldF0gKiBhbHBoYSk7CkBAIC0zMjAsMjggKzMyNiwyNiBAQAogICBGWF9GcmVlKGRlc3RfYnVmKTsKIH0KIAotdm9pZCBDUERGX0ltYWdlOjpSZXNldENhY2hlKENQREZfUGFnZSogcFBhZ2UsIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCkgewotICBwUGFnZS0+R2V0UmVuZGVyQ2FjaGUoKS0+UmVzZXRCaXRtYXAobV9wU3RyZWFtLkdldCgpLCBwQml0bWFwKTsKK3ZvaWQgQ1BERl9JbWFnZTo6UmVzZXRDYWNoZShDUERGX1BhZ2UqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwQml0bWFwKSB7CisgIFJldGFpblB0cjxDUERGX0ltYWdlPiBwSG9sZGVyKHRoaXMpOworICBwUGFnZS0+R2V0UmVuZGVyQ2FjaGUoKS0+UmVzZXRCaXRtYXAocEhvbGRlciwgcEJpdG1hcCk7CiB9CiAKLXN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCU291cmNlPiBDUERGX0ltYWdlOjpMb2FkRElCU291cmNlKCkgY29uc3QgewotICBhdXRvIHNvdXJjZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RJQlNvdXJjZT4oKTsKLSAgaWYgKCFzb3VyY2UtPkxvYWQobV9wRG9jdW1lbnQsIG1fcFN0cmVhbS5HZXQoKSkpCitSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4gQ1BERl9JbWFnZTo6TG9hZERJQlNvdXJjZSgpIGNvbnN0IHsKKyAgYXV0byBzb3VyY2UgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERl9ESUJTb3VyY2U+KCk7CisgIGlmICghc291cmNlLT5Mb2FkKG1fcERvY3VtZW50LkdldCgpLCBtX3BTdHJlYW0uR2V0KCkpKQogICAgIHJldHVybiBudWxscHRyOwogCi0gIHJldHVybiBzdGQ6Om1vdmUoc291cmNlKTsKKyAgcmV0dXJuIHNvdXJjZTsKIH0KIAotQ0ZYX0RJQlNvdXJjZSogQ1BERl9JbWFnZTo6RGV0YWNoQml0bWFwKCkgewotICBDRlhfRElCU291cmNlKiBwQml0bWFwID0gbV9wRElCU291cmNlOwotICBtX3BESUJTb3VyY2UgPSBudWxscHRyOwotICByZXR1cm4gcEJpdG1hcDsKK1JldGFpblB0cjxDRlhfRElCU291cmNlPiBDUERGX0ltYWdlOjpEZXRhY2hCaXRtYXAoKSB7CisgIHJldHVybiBzdGQ6Om1vdmUobV9wRElCU291cmNlKTsKIH0KIAotQ0ZYX0RJQlNvdXJjZSogQ1BERl9JbWFnZTo6RGV0YWNoTWFzaygpIHsKLSAgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCA9IG1fcE1hc2s7Ci0gIG1fcE1hc2sgPSBudWxscHRyOwotICByZXR1cm4gcEJpdG1hcDsKK1JldGFpblB0cjxDRlhfRElCU291cmNlPiBDUERGX0ltYWdlOjpEZXRhY2hNYXNrKCkgeworICByZXR1cm4gc3RkOjptb3ZlKG1fcE1hc2spOwogfQogCiBib29sIENQREZfSW1hZ2U6OlN0YXJ0TG9hZERJQlNvdXJjZShDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UsCkBAIC0zNDksMzUgKzM1MywzMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3RkQ1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBHcm91cEZhbWlseSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkxvYWRNYXNrKSB7Ci0gIGF1dG8gc291cmNlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRElCU291cmNlPigpOwotICBpbnQgcmV0ID0gc291cmNlLT5TdGFydExvYWRESUJTb3VyY2UobV9wRG9jdW1lbnQsIG1fcFN0cmVhbS5HZXQoKSwgdHJ1ZSwKKyAgYXV0byBzb3VyY2UgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERl9ESUJTb3VyY2U+KCk7CisgIGludCByZXQgPSBzb3VyY2UtPlN0YXJ0TG9hZERJQlNvdXJjZShtX3BEb2N1bWVudC5HZXQoKSwgbV9wU3RyZWFtLkdldCgpLCB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1SZXNvdXJjZSwgcFBhZ2VSZXNvdXJjZSwgYlN0ZENTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBGYW1pbHksIGJMb2FkTWFzayk7Ci0gIGlmIChyZXQgPT0gMikgewotICAgIG1fcERJQlNvdXJjZSA9IHNvdXJjZS5yZWxlYXNlKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KICAgaWYgKCFyZXQpIHsKLSAgICBtX3BESUJTb3VyY2UgPSBudWxscHRyOworICAgIG1fcERJQlNvdXJjZS5SZXNldCgpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQorICBtX3BESUJTb3VyY2UgPSBzb3VyY2U7CisgIGlmIChyZXQgPT0gMikKKyAgICByZXR1cm4gdHJ1ZTsKKwogICBtX3BNYXNrID0gc291cmNlLT5EZXRhY2hNYXNrKCk7CiAgIG1fTWF0dGVDb2xvciA9IHNvdXJjZS0+R2V0TWF0dGVDb2xvcigpOwotICBtX3BESUJTb3VyY2UgPSBzb3VyY2UucmVsZWFzZSgpOwogICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgQ1BERl9JbWFnZTo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpIHsKLSAgQ1BERl9ESUJTb3VyY2UqIHBTb3VyY2UgPSBzdGF0aWNfY2FzdDxDUERGX0RJQlNvdXJjZSo+KG1fcERJQlNvdXJjZSk7Citib29sIENQREZfSW1hZ2U6OkNvbnRpbnVlKElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKSB7CisgIFJldGFpblB0cjxDUERGX0RJQlNvdXJjZT4gcFNvdXJjZSA9IG1fcERJQlNvdXJjZS5BczxDUERGX0RJQlNvdXJjZT4oKTsKICAgaW50IHJldCA9IHBTb3VyY2UtPkNvbnRpbnVlTG9hZERJQlNvdXJjZShwUGF1c2UpOwotICBpZiAocmV0ID09IDIpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQogICBpZiAoIXJldCkgewotICAgIGRlbGV0ZSBtX3BESUJTb3VyY2U7Ci0gICAgbV9wRElCU291cmNlID0gbnVsbHB0cjsKKyAgICBtX3BESUJTb3VyY2UuUmVzZXQoKTsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KKyAgaWYgKHJldCA9PSAyKQorICAgIHJldHVybiB0cnVlOworCiAgIG1fcE1hc2sgPSBwU291cmNlLT5EZXRhY2hNYXNrKCk7CiAgIG1fTWF0dGVDb2xvciA9IHBTb3VyY2UtPkdldE1hdHRlQ29sb3IoKTsKICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9pbWFnZS5oIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9pbWFnZS5oCmluZGV4IDE5MDk0OTguLjIzODY0YmIgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfaW1hZ2UuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2ltYWdlLmgKQEAgLTEwLDMyICsxMCwzMCBAQAogI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9tYXliZV9vd25lZC5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9tYXliZV9vd25lZC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKIAogY2xhc3MgQ0ZYX0RJQlNvdXJjZTsKIGNsYXNzIENGWF9ESUJpdG1hcDsKIGNsYXNzIENQREZfRG9jdW1lbnQ7CiBjbGFzcyBDUERGX1BhZ2U7Ci1jbGFzcyBJRlhfUGF1c2U7CitjbGFzcyBJRlhfUGF1c2VJbmRpY2F0b3I7CiBjbGFzcyBJRlhfU2Vla2FibGVSZWFkU3RyZWFtOwogCi1jbGFzcyBDUERGX0ltYWdlIHsKK2NsYXNzIENQREZfSW1hZ2UgOiBwdWJsaWMgUmV0YWluYWJsZSB7CiAgcHVibGljOgotICBleHBsaWNpdCBDUERGX0ltYWdlKENQREZfRG9jdW1lbnQqIHBEb2MpOwotICBDUERGX0ltYWdlKENQREZfRG9jdW1lbnQqIHBEb2MsIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1N0cmVhbT4gcFN0cmVhbSk7Ci0gIENQREZfSW1hZ2UoQ1BERl9Eb2N1bWVudCogcERvYywgdWludDMyX3QgZHdTdHJlYW1PYmpOdW0pOwotICB+Q1BERl9JbWFnZSgpOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KKyAgZnJpZW5kIFJldGFpblB0cjxUPiBwZGZpdW06Ok1ha2VSZXRhaW4oQXJncyYmLi4uIGFyZ3MpOwogCiAgIHZvaWQgQ29udmVydFN0cmVhbVRvSW5kaXJlY3RPYmplY3QoKTsKIAogICBDUERGX0RpY3Rpb25hcnkqIEdldElubGluZURpY3QoKSBjb25zdCB7IHJldHVybiBtX3BEaWN0LkdldCgpOyB9CiAgIENQREZfU3RyZWFtKiBHZXRTdHJlYW0oKSBjb25zdCB7IHJldHVybiBtX3BTdHJlYW0uR2V0KCk7IH0KLSAgQ1BERl9EaWN0aW9uYXJ5KiBHZXREaWN0KCkgY29uc3QgewotICAgIHJldHVybiBtX3BTdHJlYW0gPyBtX3BTdHJlYW0tPkdldERpY3QoKSA6IG51bGxwdHI7Ci0gIH0KLSAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRPQygpIGNvbnN0IHsgcmV0dXJuIG1fcE9DOyB9Ci0gIENQREZfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9wRG9jdW1lbnQ7IH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXREaWN0KCkgY29uc3Q7CisgIENQREZfRGljdGlvbmFyeSogR2V0T0MoKSBjb25zdCB7IHJldHVybiBtX3BPQy5HZXQoKTsgfQorICBDUERGX0RvY3VtZW50KiBHZXREb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcERvY3VtZW50LkdldCgpOyB9CiAKICAgaW50MzJfdCBHZXRQaXhlbEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fSGVpZ2h0OyB9CiAgIGludDMyX3QgR2V0UGl4ZWxXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fV2lkdGg7IH0KQEAgLTQ0LDI4ICs0MiwzMiBAQAogICBib29sIElzTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1fYklzTWFzazsgfQogICBib29sIElzSW50ZXJwb2woKSBjb25zdCB7IHJldHVybiBtX2JJbnRlcnBvbGF0ZTsgfQogCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCU291cmNlPiBMb2FkRElCU291cmNlKCkgY29uc3Q7CisgIFJldGFpblB0cjxDRlhfRElCU291cmNlPiBMb2FkRElCU291cmNlKCkgY29uc3Q7CiAKLSAgdm9pZCBTZXRJbWFnZShjb25zdCBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCk7Ci0gIHZvaWQgU2V0SnBlZ0ltYWdlKGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBGaWxlKTsKLSAgdm9pZCBTZXRKcGVnSW1hZ2VJbmxpbmUoY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGUpOworICB2b2lkIFNldEltYWdlKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwRElCaXRtYXApOworICB2b2lkIFNldEpwZWdJbWFnZShjb25zdCBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBGaWxlKTsKKyAgdm9pZCBTZXRKcGVnSW1hZ2VJbmxpbmUoY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZSk7CiAKLSAgdm9pZCBSZXNldENhY2hlKENQREZfUGFnZSogcFBhZ2UsIGNvbnN0IENGWF9ESUJpdG1hcCogcERJQml0bWFwKTsKLQorICB2b2lkIFJlc2V0Q2FjaGUoQ1BERl9QYWdlKiBwUGFnZSwgY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBESUJpdG1hcCk7CiAgIGJvb2wgU3RhcnRMb2FkRElCU291cmNlKENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTdGRDUyA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBHcm91cEZhbWlseSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkxvYWRNYXNrID0gZmFsc2UpOwotICBib29sIENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKLSAgQ0ZYX0RJQlNvdXJjZSogRGV0YWNoQml0bWFwKCk7Ci0gIENGWF9ESUJTb3VyY2UqIERldGFjaE1hc2soKTsKKyAgYm9vbCBDb250aW51ZShJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CisgIFJldGFpblB0cjxDRlhfRElCU291cmNlPiBEZXRhY2hCaXRtYXAoKTsKKyAgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+IERldGFjaE1hc2soKTsKIAotICBDRlhfRElCU291cmNlKiBtX3BESUJTb3VyY2UgPSBudWxscHRyOwotICBDRlhfRElCU291cmNlKiBtX3BNYXNrID0gbnVsbHB0cjsKKyAgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+IG1fcERJQlNvdXJjZTsKKyAgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+IG1fcE1hc2s7CiAgIHVpbnQzMl90IG1fTWF0dGVDb2xvciA9IDA7CiAKICBwcml2YXRlOgorICBleHBsaWNpdCBDUERGX0ltYWdlKENQREZfRG9jdW1lbnQqIHBEb2MpOworICBDUERGX0ltYWdlKENQREZfRG9jdW1lbnQqIHBEb2MsIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1N0cmVhbT4gcFN0cmVhbSk7CisgIENQREZfSW1hZ2UoQ1BERl9Eb2N1bWVudCogcERvYywgdWludDMyX3QgZHdTdHJlYW1PYmpOdW0pOworICB+Q1BERl9JbWFnZSgpIG92ZXJyaWRlOworCiAgIHZvaWQgRmluaXNoSW5pdGlhbGl6YXRpb24oKTsKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeT4gSW5pdEpQRUcodWludDhfdCogcERhdGEsIHVpbnQzMl90IHNpemUpOwogCkBAIC03NCwxMCArNzYsMTAgQEAKICAgYm9vbCBtX2JJc0lubGluZSA9IGZhbHNlOwogICBib29sIG1fYklzTWFzayA9IGZhbHNlOwogICBib29sIG1fYkludGVycG9sYXRlID0gZmFsc2U7Ci0gIENQREZfRG9jdW1lbnQqIGNvbnN0IG1fcERvY3VtZW50OwotICBDRlhfTWF5YmVPd25lZDxDUERGX1N0cmVhbT4gbV9wU3RyZWFtOwotICBDRlhfTWF5YmVPd25lZDxDUERGX0RpY3Rpb25hcnk+IG1fcERpY3Q7Ci0gIENQREZfRGljdGlvbmFyeSogbV9wT0MgPSBudWxscHRyOworICBVbm93bmVkUHRyPENQREZfRG9jdW1lbnQ+IGNvbnN0IG1fcERvY3VtZW50OworICBNYXliZU93bmVkPENQREZfU3RyZWFtPiBtX3BTdHJlYW07CisgIE1heWJlT3duZWQ8Q1BERl9EaWN0aW9uYXJ5PiBtX3BEaWN0OworICBVbm93bmVkUHRyPENQREZfRGljdGlvbmFyeT4gbV9wT0M7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9QQUdFX0NQREZfSU1BR0VfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfaW1hZ2VvYmplY3QuY3BwIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9pbWFnZW9iamVjdC5jcHAKaW5kZXggMDFkMmRmNy4uM2I1YTc0MCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9pbWFnZW9iamVjdC5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9pbWFnZW9iamVjdC5jcHAKQEAgLTEyLDExICsxMiwxMCBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfaW1hZ2UuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaCIKIAotQ1BERl9JbWFnZU9iamVjdDo6Q1BERl9JbWFnZU9iamVjdCgpCi0gICAgOiBtX3BJbWFnZShudWxscHRyKSwgbV9wSW1hZ2VPd25lZChmYWxzZSkge30KK0NQREZfSW1hZ2VPYmplY3Q6OkNQREZfSW1hZ2VPYmplY3QoKSB7fQogCiBDUERGX0ltYWdlT2JqZWN0Ojp+Q1BERl9JbWFnZU9iamVjdCgpIHsKLSAgUmVsZWFzZSgpOworICBNYXliZVB1cmdlQ2FjaGUoKTsKIH0KIAogQ1BERl9QYWdlT2JqZWN0OjpUeXBlIENQREZfSW1hZ2VPYmplY3Q6OkdldFR5cGUoKSBjb25zdCB7CkBAIC0yNiw2ICsyNSw3IEBACiB2b2lkIENQREZfSW1hZ2VPYmplY3Q6OlRyYW5zZm9ybShjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKICAgbV9NYXRyaXguQ29uY2F0KG1hdHJpeCk7CiAgIENhbGNCb3VuZGluZ0JveCgpOworICBTZXREaXJ0eSh0cnVlKTsKIH0KIAogYm9vbCBDUERGX0ltYWdlT2JqZWN0OjpJc0ltYWdlKCkgY29uc3QgewpAQCAtNDEsMzcgKzQxLDM1IEBACiB9CiAKIHZvaWQgQ1BERl9JbWFnZU9iamVjdDo6Q2FsY0JvdW5kaW5nQm94KCkgewotICBtX0xlZnQgPSAwOwotICBtX0JvdHRvbSA9IDA7Ci0gIG1fUmlnaHQgPSAxLjBmOwotICBtX1RvcCA9IDEuMGY7Ci0gIG1fTWF0cml4LlRyYW5zZm9ybVJlY3QobV9MZWZ0LCBtX1JpZ2h0LCBtX1RvcCwgbV9Cb3R0b20pOworICBzdGQ6OnRpZShtX0xlZnQsIG1fUmlnaHQsIG1fVG9wLCBtX0JvdHRvbSkgPQorICAgICAgbV9NYXRyaXguVHJhbnNmb3JtUmVjdCgwLmYsIDEuZiwgMS5mLCAwLmYpOwogfQogCi12b2lkIENQREZfSW1hZ2VPYmplY3Q6OlNldE93bmVkSW1hZ2Uoc3RkOjp1bmlxdWVfcHRyPENQREZfSW1hZ2U+IHBJbWFnZSkgewotICBSZWxlYXNlKCk7Ci0gIG1fcEltYWdlID0gcEltYWdlLnJlbGVhc2UoKTsKLSAgbV9wSW1hZ2VPd25lZCA9IHRydWU7Ci19Ci0KLXZvaWQgQ1BERl9JbWFnZU9iamVjdDo6U2V0VW5vd25lZEltYWdlKENQREZfSW1hZ2UqIHBJbWFnZSkgewotICBSZWxlYXNlKCk7Cit2b2lkIENQREZfSW1hZ2VPYmplY3Q6OlNldEltYWdlKGNvbnN0IFJldGFpblB0cjxDUERGX0ltYWdlPiYgcEltYWdlKSB7CisgIE1heWJlUHVyZ2VDYWNoZSgpOwogICBtX3BJbWFnZSA9IHBJbWFnZTsKLSAgbV9wSW1hZ2VPd25lZCA9IGZhbHNlOwogfQogCi12b2lkIENQREZfSW1hZ2VPYmplY3Q6OlJlbGVhc2UoKSB7Ci0gIGlmIChtX3BJbWFnZU93bmVkKSB7Ci0gICAgZGVsZXRlIG1fcEltYWdlOwotICAgIG1fcEltYWdlID0gbnVsbHB0cjsKLSAgICBtX3BJbWFnZU93bmVkID0gZmFsc2U7Ci0gICAgcmV0dXJuOwotICB9Ci0KK3ZvaWQgQ1BERl9JbWFnZU9iamVjdDo6TWF5YmVQdXJnZUNhY2hlKCkgewogICBpZiAoIW1fcEltYWdlKQogICAgIHJldHVybjsKIAotICBDUERGX0RvY1BhZ2VEYXRhKiBwUGFnZURhdGEgPSBtX3BJbWFnZS0+R2V0RG9jdW1lbnQoKS0+R2V0UGFnZURhdGEoKTsKLSAgcFBhZ2VEYXRhLT5SZWxlYXNlSW1hZ2UobV9wSW1hZ2UtPkdldFN0cmVhbSgpLT5HZXRPYmpOdW0oKSk7Ci0gIG1fcEltYWdlID0gbnVsbHB0cjsKKyAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gbV9wSW1hZ2UtPkdldERvY3VtZW50KCk7CisgIGlmICghcERvY3VtZW50KQorICAgIHJldHVybjsKKworICBDUERGX0RvY1BhZ2VEYXRhKiBwUGFnZURhdGEgPSBwRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCk7CisgIGlmICghcFBhZ2VEYXRhKQorICAgIHJldHVybjsKKworICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IG1fcEltYWdlLT5HZXRTdHJlYW0oKTsKKyAgaWYgKCFwU3RyZWFtKQorICAgIHJldHVybjsKKworICB1aW50MzJfdCBvYmpudW0gPSBwU3RyZWFtLT5HZXRPYmpOdW0oKTsKKyAgaWYgKCFvYmpudW0pCisgICAgcmV0dXJuOworCisgIG1fcEltYWdlLlJlc2V0KCk7ICAvLyBDbGVhciBteSByZWZlcmVuY2UgYmVmb3JlIGFza2luZyB0aGUgY2FjaGUuCisgIHBQYWdlRGF0YS0+TWF5YmVQdXJnZUltYWdlKG9iam51bSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2ltYWdlb2JqZWN0LmggYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2ltYWdlb2JqZWN0LmgKaW5kZXggMWJiZmMwNS4uMTZhNTA2ZSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9pbWFnZW9iamVjdC5oCisrKyBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfaW1hZ2VvYmplY3QuaApAQCAtMjcsMTkgKzI3LDE2IEBACiAgIGNvbnN0IENQREZfSW1hZ2VPYmplY3QqIEFzSW1hZ2UoKSBjb25zdCBvdmVycmlkZTsKIAogICB2b2lkIENhbGNCb3VuZGluZ0JveCgpOwotICBDUERGX0ltYWdlKiBHZXRJbWFnZSgpIGNvbnN0IHsgcmV0dXJuIG1fcEltYWdlOyB9Ci0gIHZvaWQgU2V0T3duZWRJbWFnZShzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9JbWFnZT4gcEltYWdlKTsKLSAgdm9pZCBTZXRVbm93bmVkSW1hZ2UoQ1BERl9JbWFnZSogcEltYWdlKTsKLQorICBSZXRhaW5QdHI8Q1BERl9JbWFnZT4gR2V0SW1hZ2UoKSBjb25zdCB7IHJldHVybiBtX3BJbWFnZTsgfQorICB2b2lkIFNldEltYWdlKGNvbnN0IFJldGFpblB0cjxDUERGX0ltYWdlPiYgcEltYWdlKTsKICAgdm9pZCBzZXRfbWF0cml4KGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeyBtX01hdHJpeCA9IG1hdHJpeDsgfQogICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgoKSBjb25zdCB7IHJldHVybiBtX01hdHJpeDsgfQogCiAgcHJpdmF0ZToKLSAgdm9pZCBSZWxlYXNlKCk7CisgIHZvaWQgTWF5YmVQdXJnZUNhY2hlKCk7CiAKICAgQ0ZYX01hdHJpeCBtX01hdHJpeDsKLSAgQ1BERl9JbWFnZSogbV9wSW1hZ2U7Ci0gIGJvb2wgbV9wSW1hZ2VPd25lZDsKKyAgUmV0YWluUHRyPENQREZfSW1hZ2U+IG1fcEltYWdlOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfUEFHRV9DUERGX0lNQUdFT0JKRUNUX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX21lc2hzdHJlYW0uY3BwIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9tZXNoc3RyZWFtLmNwcAppbmRleCAyNGVmOWIyLi4wODNhY2NlIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX21lc2hzdHJlYW0uY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfbWVzaHN0cmVhbS5jcHAKQEAgLTcsNyArNyw3IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9tZXNoc3RyZWFtLmgiCiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbG9yc3BhY2UuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9wYWdlaW50LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9mdW5jdGlvbi5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgogCiBuYW1lc3BhY2UgewpAQCAtMTA3LDE0ICsxMDcsMTggQEAKICAgICAgIG1feG1pbigwKSwKICAgICAgIG1feG1heCgwKSwKICAgICAgIG1feW1pbigwKSwKLSAgICAgIG1feW1heCgwKSB7CisgICAgICBtX3ltYXgoMCksCisgICAgICBtX3BTdHJlYW0ocGRmaXVtOjpNYWtlUmV0YWluPENQREZfU3RyZWFtQWNjPihwU2hhZGluZ1N0cmVhbSkpIHsKICAgbWVtc2V0KCZtX0NvbG9yTWluLCAwLCBzaXplb2YobV9Db2xvck1pbikpOwogICBtZW1zZXQoJm1fQ29sb3JNYXgsIDAsIHNpemVvZihtX0NvbG9yTWF4KSk7CiB9CiAKK0NQREZfTWVzaFN0cmVhbTo6fkNQREZfTWVzaFN0cmVhbSgpIHt9CisKIGJvb2wgQ1BERl9NZXNoU3RyZWFtOjpMb2FkKCkgewotICBtX1N0cmVhbS5Mb2FkQWxsRGF0YShtX3BTaGFkaW5nU3RyZWFtKTsKLSAgbV9CaXRTdHJlYW0uSW5pdChtX1N0cmVhbS5HZXREYXRhKCksIG1fU3RyZWFtLkdldFNpemUoKSk7CisgIG1fcFN0cmVhbS0+TG9hZEFsbERhdGFGaWx0ZXJlZCgpOworICBtX0JpdFN0cmVhbSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfQml0U3RyZWFtPihtX3BTdHJlYW0tPkdldERhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3RyZWFtLT5HZXRTaXplKCkpOwogICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wU2hhZGluZ1N0cmVhbS0+R2V0RGljdCgpOwogICBtX25Db29yZEJpdHMgPSBwRGljdC0+R2V0SW50ZWdlckZvcigiQml0c1BlckNvb3JkaW5hdGUiKTsKICAgbV9uQ29tcG9uZW50Qml0cyA9IHBEaWN0LT5HZXRJbnRlZ2VyRm9yKCJCaXRzUGVyQ29tcG9uZW50Iik7CkBAIC0xNTUsMjAgKzE1OSwyMCBAQAogfQogCiBib29sIENQREZfTWVzaFN0cmVhbTo6Q2FuUmVhZEZsYWcoKSBjb25zdCB7Ci0gIHJldHVybiBtX0JpdFN0cmVhbS5CaXRzUmVtYWluaW5nKCkgPj0gbV9uRmxhZ0JpdHM7CisgIHJldHVybiBtX0JpdFN0cmVhbS0+Qml0c1JlbWFpbmluZygpID49IG1fbkZsYWdCaXRzOwogfQogCiBib29sIENQREZfTWVzaFN0cmVhbTo6Q2FuUmVhZENvb3JkcygpIGNvbnN0IHsKLSAgcmV0dXJuIG1fQml0U3RyZWFtLkJpdHNSZW1haW5pbmcoKSAvIDIgPj0gbV9uQ29vcmRCaXRzOworICByZXR1cm4gbV9CaXRTdHJlYW0tPkJpdHNSZW1haW5pbmcoKSAvIDIgPj0gbV9uQ29vcmRCaXRzOwogfQogCiBib29sIENQREZfTWVzaFN0cmVhbTo6Q2FuUmVhZENvbG9yKCkgY29uc3QgewotICByZXR1cm4gbV9CaXRTdHJlYW0uQml0c1JlbWFpbmluZygpIC8gbV9uQ29tcG9uZW50Qml0cyA+PSBtX25Db21wb25lbnRzOworICByZXR1cm4gbV9CaXRTdHJlYW0tPkJpdHNSZW1haW5pbmcoKSAvIG1fbkNvbXBvbmVudEJpdHMgPj0gbV9uQ29tcG9uZW50czsKIH0KIAogdWludDMyX3QgQ1BERl9NZXNoU3RyZWFtOjpSZWFkRmxhZygpIHsKICAgQVNTRVJUKFNob3VsZENoZWNrQml0c1BlckZsYWcobV90eXBlKSk7Ci0gIHJldHVybiBtX0JpdFN0cmVhbS5HZXRCaXRzKG1fbkZsYWdCaXRzKSAmIDB4MDM7CisgIHJldHVybiBtX0JpdFN0cmVhbS0+R2V0Qml0cyhtX25GbGFnQml0cykgJiAweDAzOwogfQogCiBDRlhfUG9pbnRGIENQREZfTWVzaFN0cmVhbTo6UmVhZENvb3JkcygpIHsKQEAgLTE3Niw0OSArMTgwLDQ3IEBACiAKICAgQ0ZYX1BvaW50RiBwb3M7CiAgIGlmIChtX25Db29yZEJpdHMgPT0gMzIpIHsKLSAgICBwb3MueCA9IG1feG1pbiArCi0gICAgICAgICAgICBtX0JpdFN0cmVhbS5HZXRCaXRzKG1fbkNvb3JkQml0cykgKiAobV94bWF4IC0gbV94bWluKSAvCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihtX0Nvb3JkTWF4KTsKLSAgICBwb3MueSA9IG1feW1pbiArCi0gICAgICAgICAgICBtX0JpdFN0cmVhbS5HZXRCaXRzKG1fbkNvb3JkQml0cykgKiAobV95bWF4IC0gbV95bWluKSAvCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihtX0Nvb3JkTWF4KTsKKyAgICBwb3MueCA9IG1feG1pbiArIG1fQml0U3RyZWFtLT5HZXRCaXRzKG1fbkNvb3JkQml0cykgKiAobV94bWF4IC0gbV94bWluKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihtX0Nvb3JkTWF4KTsKKyAgICBwb3MueSA9IG1feW1pbiArIG1fQml0U3RyZWFtLT5HZXRCaXRzKG1fbkNvb3JkQml0cykgKiAobV95bWF4IC0gbV95bWluKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihtX0Nvb3JkTWF4KTsKICAgfSBlbHNlIHsKICAgICBwb3MueCA9IG1feG1pbiArCi0gICAgICAgICAgICBtX0JpdFN0cmVhbS5HZXRCaXRzKG1fbkNvb3JkQml0cykgKiAobV94bWF4IC0gbV94bWluKSAvIG1fQ29vcmRNYXg7CisgICAgICAgICAgICBtX0JpdFN0cmVhbS0+R2V0Qml0cyhtX25Db29yZEJpdHMpICogKG1feG1heCAtIG1feG1pbikgLyBtX0Nvb3JkTWF4OwogICAgIHBvcy55ID0gbV95bWluICsKLSAgICAgICAgICAgIG1fQml0U3RyZWFtLkdldEJpdHMobV9uQ29vcmRCaXRzKSAqIChtX3ltYXggLSBtX3ltaW4pIC8gbV9Db29yZE1heDsKKyAgICAgICAgICAgIG1fQml0U3RyZWFtLT5HZXRCaXRzKG1fbkNvb3JkQml0cykgKiAobV95bWF4IC0gbV95bWluKSAvIG1fQ29vcmRNYXg7CiAgIH0KICAgcmV0dXJuIHBvczsKIH0KIAotc3RkOjp0dXBsZTxGWF9GTE9BVCwgRlhfRkxPQVQsIEZYX0ZMT0FUPiBDUERGX01lc2hTdHJlYW06OlJlYWRDb2xvcigpIHsKK3N0ZDo6dHVwbGU8ZmxvYXQsIGZsb2F0LCBmbG9hdD4gQ1BERl9NZXNoU3RyZWFtOjpSZWFkQ29sb3IoKSB7CiAgIEFTU0VSVChTaG91bGRDaGVja0JQQyhtX3R5cGUpKTsKIAotICBGWF9GTE9BVCBjb2xvcl92YWx1ZVtrTWF4Q29tcG9uZW50c107CisgIGZsb2F0IGNvbG9yX3ZhbHVlW2tNYXhDb21wb25lbnRzXTsKICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fbkNvbXBvbmVudHM7ICsraSkgewotICAgIGNvbG9yX3ZhbHVlW2ldID0gbV9Db2xvck1pbltpXSArCi0gICAgICAgICAgICAgICAgICAgICBtX0JpdFN0cmVhbS5HZXRCaXRzKG1fbkNvbXBvbmVudEJpdHMpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAobV9Db2xvck1heFtpXSAtIG1fQ29sb3JNaW5baV0pIC8gbV9Db21wb25lbnRNYXg7CisgICAgY29sb3JfdmFsdWVbaV0gPSBtX0NvbG9yTWluW2ldICsgbV9CaXRTdHJlYW0tPkdldEJpdHMobV9uQ29tcG9uZW50Qml0cykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9Db2xvck1heFtpXSAtIG1fQ29sb3JNaW5baV0pIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Db21wb25lbnRNYXg7CiAgIH0KIAotICBGWF9GTE9BVCByOwotICBGWF9GTE9BVCBnOwotICBGWF9GTE9BVCBiOworICBmbG9hdCByID0gMC4wOworICBmbG9hdCBnID0gMC4wOworICBmbG9hdCBiID0gMC4wOwogICBpZiAobV9mdW5jcy5lbXB0eSgpKSB7Ci0gICAgbV9wQ1MtPkdldFJHQihjb2xvcl92YWx1ZSwgciwgZywgYik7Ci0gICAgcmV0dXJuIHN0ZDo6dHVwbGU8RlhfRkxPQVQsIEZYX0ZMT0FULCBGWF9GTE9BVD4ociwgZywgYik7CisgICAgbV9wQ1MtPkdldFJHQihjb2xvcl92YWx1ZSwgJnIsICZnLCAmYik7CisgICAgcmV0dXJuIHN0ZDo6dHVwbGU8ZmxvYXQsIGZsb2F0LCBmbG9hdD4ociwgZywgYik7CiAgIH0KIAotICBGWF9GTE9BVCByZXN1bHRba01heENvbXBvbmVudHNdOwotICBGWFNZU19tZW1zZXQocmVzdWx0LCAwLCBzaXplb2YocmVzdWx0KSk7CisgIGZsb2F0IHJlc3VsdFtrTWF4Q29tcG9uZW50c107CisgIG1lbXNldChyZXN1bHQsIDAsIHNpemVvZihyZXN1bHQpKTsKICAgaW50IG5SZXN1bHRzOwogICBmb3IgKGNvbnN0IGF1dG8mIGZ1bmMgOiBtX2Z1bmNzKSB7CiAgICAgaWYgKGZ1bmMgJiYgZnVuYy0+Q291bnRPdXRwdXRzKCkgPD0ga01heENvbXBvbmVudHMpCi0gICAgICBmdW5jLT5DYWxsKGNvbG9yX3ZhbHVlLCAxLCByZXN1bHQsIG5SZXN1bHRzKTsKKyAgICAgIGZ1bmMtPkNhbGwoY29sb3JfdmFsdWUsIDEsIHJlc3VsdCwgJm5SZXN1bHRzKTsKICAgfQogCi0gIG1fcENTLT5HZXRSR0IocmVzdWx0LCByLCBnLCBiKTsKLSAgcmV0dXJuIHN0ZDo6dHVwbGU8RlhfRkxPQVQsIEZYX0ZMT0FULCBGWF9GTE9BVD4ociwgZywgYik7CisgIG1fcENTLT5HZXRSR0IocmVzdWx0LCAmciwgJmcsICZiKTsKKyAgcmV0dXJuIHN0ZDo6dHVwbGU8ZmxvYXQsIGZsb2F0LCBmbG9hdD4ociwgZywgYik7CiB9CiAKIGJvb2wgQ1BERl9NZXNoU3RyZWFtOjpSZWFkVmVydGV4KGNvbnN0IENGWF9NYXRyaXgmIHBPYmplY3QyQml0bWFwLApAQCAtMjM1LDIzICsyMzcsMjYgQEAKICAgaWYgKCFDYW5SZWFkQ29sb3IoKSkKICAgICByZXR1cm4gZmFsc2U7CiAgIHN0ZDo6dGllKHZlcnRleC0+ciwgdmVydGV4LT5nLCB2ZXJ0ZXgtPmIpID0gUmVhZENvbG9yKCk7Ci0gIG1fQml0U3RyZWFtLkJ5dGVBbGlnbigpOworICBtX0JpdFN0cmVhbS0+Qnl0ZUFsaWduKCk7CiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENQREZfTWVzaFN0cmVhbTo6UmVhZFZlcnRleFJvdyhjb25zdCBDRlhfTWF0cml4JiBwT2JqZWN0MkJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfTWVzaFZlcnRleCogdmVydGV4KSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgIGlmIChtX0JpdFN0cmVhbS5Jc0VPRigpIHx8ICFDYW5SZWFkQ29vcmRzKCkpCi0gICAgICByZXR1cm4gZmFsc2U7CitzdGQ6OnZlY3RvcjxDUERGX01lc2hWZXJ0ZXg+IENQREZfTWVzaFN0cmVhbTo6UmVhZFZlcnRleFJvdygKKyAgICBjb25zdCBDRlhfTWF0cml4JiBwT2JqZWN0MkJpdG1hcCwKKyAgICBpbnQgY291bnQpIHsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9NZXNoVmVydGV4PiB2ZXJ0aWNlczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgaWYgKG1fQml0U3RyZWFtLT5Jc0VPRigpIHx8ICFDYW5SZWFkQ29vcmRzKCkpCisgICAgICByZXR1cm4gc3RkOjp2ZWN0b3I8Q1BERl9NZXNoVmVydGV4PigpOwogCi0gICAgdmVydGV4W2ldLnBvc2l0aW9uID0gcE9iamVjdDJCaXRtYXAuVHJhbnNmb3JtKFJlYWRDb29yZHMoKSk7CisgICAgdmVydGljZXMucHVzaF9iYWNrKENQREZfTWVzaFZlcnRleCgpKTsKKyAgICBDUERGX01lc2hWZXJ0ZXgmIHZlcnRleCA9IHZlcnRpY2VzLmJhY2soKTsKKyAgICB2ZXJ0ZXgucG9zaXRpb24gPSBwT2JqZWN0MkJpdG1hcC5UcmFuc2Zvcm0oUmVhZENvb3JkcygpKTsKICAgICBpZiAoIUNhblJlYWRDb2xvcigpKQotICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPENQREZfTWVzaFZlcnRleD4oKTsKIAotICAgIHN0ZDo6dGllKHZlcnRleFtpXS5yLCB2ZXJ0ZXhbaV0uZywgdmVydGV4W2ldLmIpID0gUmVhZENvbG9yKCk7Ci0gICAgbV9CaXRTdHJlYW0uQnl0ZUFsaWduKCk7CisgICAgc3RkOjp0aWUodmVydGV4LnIsIHZlcnRleC5nLCB2ZXJ0ZXguYikgPSBSZWFkQ29sb3IoKTsKKyAgICBtX0JpdFN0cmVhbS0+Qnl0ZUFsaWduKCk7CiAgIH0KLSAgcmV0dXJuIHRydWU7CisgIHJldHVybiB2ZXJ0aWNlczsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfbWVzaHN0cmVhbS5oIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9tZXNoc3RyZWFtLmgKaW5kZXggZDQwZGU0YS4uN2MzNGIyNSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9tZXNoc3RyZWFtLmgKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9tZXNoc3RyZWFtLmgKQEAgLTEzLDcgKzEzLDcgQEAKIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc2hhZGluZ3BhdHRlcm4uaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtX2FjYy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9iaXRzdHJlYW0uaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgogCiBjbGFzcyBDUERGX01lc2hWZXJ0ZXggewpAQCAtMjMsOSArMjMsOSBAQAogICB+Q1BERl9NZXNoVmVydGV4KCk7CiAKICAgQ0ZYX1BvaW50RiBwb3NpdGlvbjsKLSAgRlhfRkxPQVQgcjsKLSAgRlhfRkxPQVQgZzsKLSAgRlhfRkxPQVQgYjsKKyAgZmxvYXQgcjsKKyAgZmxvYXQgZzsKKyAgZmxvYXQgYjsKIH07CiAKIGNsYXNzIENGWF9NYXRyaXg7CkBAIC0zOSw2ICszOSw3IEBACiAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9GdW5jdGlvbj4+JiBmdW5jcywKICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwU2hhZGluZ1N0cmVhbSwKICAgICAgICAgICAgICAgICAgIENQREZfQ29sb3JTcGFjZSogcENTKTsKKyAgfkNQREZfTWVzaFN0cmVhbSgpOwogCiAgIGJvb2wgTG9hZCgpOwogCkBAIC00OCwxNiArNDksMTUgQEAKIAogICB1aW50MzJfdCBSZWFkRmxhZygpOwogICBDRlhfUG9pbnRGIFJlYWRDb29yZHMoKTsKLSAgc3RkOjp0dXBsZTxGWF9GTE9BVCwgRlhfRkxPQVQsIEZYX0ZMT0FUPiBSZWFkQ29sb3IoKTsKKyAgc3RkOjp0dXBsZTxmbG9hdCwgZmxvYXQsIGZsb2F0PiBSZWFkQ29sb3IoKTsKIAogICBib29sIFJlYWRWZXJ0ZXgoY29uc3QgQ0ZYX01hdHJpeCYgcE9iamVjdDJCaXRtYXAsCiAgICAgICAgICAgICAgICAgICBDUERGX01lc2hWZXJ0ZXgqIHZlcnRleCwKICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBmbGFnKTsKLSAgYm9vbCBSZWFkVmVydGV4Um93KGNvbnN0IENGWF9NYXRyaXgmIHBPYmplY3QyQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgQ1BERl9NZXNoVmVydGV4KiB2ZXJ0ZXgpOworICBzdGQ6OnZlY3RvcjxDUERGX01lc2hWZXJ0ZXg+IFJlYWRWZXJ0ZXhSb3coY29uc3QgQ0ZYX01hdHJpeCYgcE9iamVjdDJCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpOwogCi0gIENGWF9CaXRTdHJlYW0qIEJpdFN0cmVhbSgpIHsgcmV0dXJuICZtX0JpdFN0cmVhbTsgfQorICBDRlhfQml0U3RyZWFtKiBCaXRTdHJlYW0oKSB7IHJldHVybiBtX0JpdFN0cmVhbS5nZXQoKTsgfQogICB1aW50MzJfdCBDb21wb25lbnRCaXRzKCkgY29uc3QgeyByZXR1cm4gbV9uQ29tcG9uZW50Qml0czsgfQogICB1aW50MzJfdCBDb21wb25lbnRzKCkgY29uc3QgeyByZXR1cm4gbV9uQ29tcG9uZW50czsgfQogCkBAIC02NiwyMiArNjYsMjIgQEAKIAogICBjb25zdCBTaGFkaW5nVHlwZSBtX3R5cGU7CiAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDUERGX0Z1bmN0aW9uPj4mIG1fZnVuY3M7Ci0gIENQREZfU3RyZWFtKiBjb25zdCBtX3BTaGFkaW5nU3RyZWFtOwotICBDUERGX0NvbG9yU3BhY2UqIGNvbnN0IG1fcENTOworICBVbm93bmVkUHRyPENQREZfU3RyZWFtPiBjb25zdCBtX3BTaGFkaW5nU3RyZWFtOworICBVbm93bmVkUHRyPENQREZfQ29sb3JTcGFjZT4gY29uc3QgbV9wQ1M7CiAgIHVpbnQzMl90IG1fbkNvb3JkQml0czsKICAgdWludDMyX3QgbV9uQ29tcG9uZW50Qml0czsKICAgdWludDMyX3QgbV9uRmxhZ0JpdHM7CiAgIHVpbnQzMl90IG1fbkNvbXBvbmVudHM7CiAgIHVpbnQzMl90IG1fQ29vcmRNYXg7CiAgIHVpbnQzMl90IG1fQ29tcG9uZW50TWF4OwotICBGWF9GTE9BVCBtX3htaW47Ci0gIEZYX0ZMT0FUIG1feG1heDsKLSAgRlhfRkxPQVQgbV95bWluOwotICBGWF9GTE9BVCBtX3ltYXg7Ci0gIEZYX0ZMT0FUIG1fQ29sb3JNaW5ba01heENvbXBvbmVudHNdOwotICBGWF9GTE9BVCBtX0NvbG9yTWF4W2tNYXhDb21wb25lbnRzXTsKLSAgQ1BERl9TdHJlYW1BY2MgbV9TdHJlYW07Ci0gIENGWF9CaXRTdHJlYW0gbV9CaXRTdHJlYW07CisgIGZsb2F0IG1feG1pbjsKKyAgZmxvYXQgbV94bWF4OworICBmbG9hdCBtX3ltaW47CisgIGZsb2F0IG1feW1heDsKKyAgZmxvYXQgbV9Db2xvck1pbltrTWF4Q29tcG9uZW50c107CisgIGZsb2F0IG1fQ29sb3JNYXhba01heENvbXBvbmVudHNdOworICBSZXRhaW5QdHI8Q1BERl9TdHJlYW1BY2M+IG1fcFN0cmVhbTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWF9CaXRTdHJlYW0+IG1fQml0U3RyZWFtOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfUEFHRV9DUERGX01FU0hTVFJFQU1fSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZS5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2UuY3BwCmluZGV4IDQ2MTIzYWIuLmVlN2I1ZDQgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZS5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlLmNwcApAQCAtMTIsNyArMTIsNiBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9jcGRmX3BhZ2VyZW5kZXJjb250ZXh0LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb250ZW50cGFyc2VyLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlb2JqZWN0LmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvcGFnZWludC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdC5oIgpAQCAtMjMsNDQgKzIyLDMzIEBACiBDUERGX1BhZ2U6OkNQREZfUGFnZShDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCwKICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlBhZ2VDYWNoZSkKLSAgICA6IG1fUGFnZVdpZHRoKDEwMCksCisgICAgOiBDUERGX1BhZ2VPYmplY3RIb2xkZXIocERvY3VtZW50LCBwUGFnZURpY3QpLAorICAgICAgbV9QYWdlV2lkdGgoMTAwKSwKICAgICAgIG1fUGFnZUhlaWdodCgxMDApLAotICAgICAgbV9wVmlldyhudWxscHRyKSwKLSAgICAgIG1fcFBhZ2VSZW5kZXIoYlBhZ2VDYWNoZSA/IG5ldyBDUERGX1BhZ2VSZW5kZXJDYWNoZSh0aGlzKSA6IG51bGxwdHIpIHsKLSAgbV9wRm9ybURpY3QgPSBwUGFnZURpY3Q7Ci0gIG1fcERvY3VtZW50ID0gcERvY3VtZW50OworICAgICAgbV9wVmlldyhudWxscHRyKSB7CisgIGlmIChiUGFnZUNhY2hlKQorICAgIG1fcFBhZ2VSZW5kZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9QYWdlUmVuZGVyQ2FjaGU+KHRoaXMpOwogICBpZiAoIXBQYWdlRGljdCkKICAgICByZXR1cm47CiAKLSAgQ1BERl9PYmplY3QqIHBhZ2VBdHRyID0gR2V0UGFnZUF0dHIoIlJlc291cmNlcyIpOwotICBtX3BSZXNvdXJjZXMgPSBwYWdlQXR0ciA/IHBhZ2VBdHRyLT5HZXREaWN0KCkgOiBudWxscHRyOworICBDUERGX09iamVjdCogcFBhZ2VBdHRyID0gR2V0UGFnZUF0dHIoIlJlc291cmNlcyIpOworICBtX3BSZXNvdXJjZXMgPSBwUGFnZUF0dHIgPyBwUGFnZUF0dHItPkdldERpY3QoKSA6IG51bGxwdHI7CiAgIG1fcFBhZ2VSZXNvdXJjZXMgPSBtX3BSZXNvdXJjZXM7Ci0gIENQREZfT2JqZWN0KiBwUm90YXRlID0gR2V0UGFnZUF0dHIoIlJvdGF0ZSIpOwotICBpbnQgcm90YXRlID0gcFJvdGF0ZSA/IHBSb3RhdGUtPkdldEludGVnZXIoKSAvIDkwICUgNCA6IDA7Ci0gIGlmIChyb3RhdGUgPCAwKQotICAgIHJvdGF0ZSArPSA0OwogCi0gIENQREZfQXJyYXkqIHBNZWRpYUJveCA9IFRvQXJyYXkoR2V0UGFnZUF0dHIoIk1lZGlhQm94IikpOwotICBDRlhfRmxvYXRSZWN0IG1lZGlhYm94OwotICBpZiAocE1lZGlhQm94KSB7Ci0gICAgbWVkaWFib3ggPSBwTWVkaWFCb3gtPkdldFJlY3QoKTsKLSAgICBtZWRpYWJveC5Ob3JtYWxpemUoKTsKLSAgfQorICBDRlhfRmxvYXRSZWN0IG1lZGlhYm94ID0gR2V0Qm94KCJNZWRpYUJveCIpOwogICBpZiAobWVkaWFib3guSXNFbXB0eSgpKQogICAgIG1lZGlhYm94ID0gQ0ZYX0Zsb2F0UmVjdCgwLCAwLCA2MTIsIDc5Mik7CiAKLSAgQ1BERl9BcnJheSogcENyb3BCb3ggPSBUb0FycmF5KEdldFBhZ2VBdHRyKCJDcm9wQm94IikpOwotICBpZiAocENyb3BCb3gpIHsKLSAgICBtX0JCb3ggPSBwQ3JvcEJveC0+R2V0UmVjdCgpOwotICAgIG1fQkJveC5Ob3JtYWxpemUoKTsKLSAgfQorICBtX0JCb3ggPSBHZXRCb3goIkNyb3BCb3giKTsKICAgaWYgKG1fQkJveC5Jc0VtcHR5KCkpCiAgICAgbV9CQm94ID0gbWVkaWFib3g7CiAgIGVsc2UKICAgICBtX0JCb3guSW50ZXJzZWN0KG1lZGlhYm94KTsKIAotICBtX1BhZ2VXaWR0aCA9IG1fQkJveC5yaWdodCAtIG1fQkJveC5sZWZ0OwotICBtX1BhZ2VIZWlnaHQgPSBtX0JCb3gudG9wIC0gbV9CQm94LmJvdHRvbTsKKyAgbV9QYWdlV2lkdGggPSBtX0JCb3guV2lkdGgoKTsKKyAgbV9QYWdlSGVpZ2h0ID0gbV9CQm94LkhlaWdodCgpOworCisgIGludCByb3RhdGUgPSBHZXRQYWdlUm90YXRpb24oKTsKICAgaWYgKHJvdGF0ZSAlIDIpCiAgICAgc3RkOjpzd2FwKG1fUGFnZVdpZHRoLCBtX1BhZ2VIZWlnaHQpOwogCkBAIC04MCwxOCArNjgsMjEgQEAKICAgICAgIGJyZWFrOwogICB9CiAKLSAgbV9UcmFuc3BhcmVuY3kgPSBQREZUUkFOU19JU09MQVRFRDsKKyAgbV9pVHJhbnNwYXJlbmN5ID0gUERGVFJBTlNfSVNPTEFURUQ7CiAgIExvYWRUcmFuc0luZm8oKTsKIH0KIAogQ1BERl9QYWdlOjp+Q1BERl9QYWdlKCkge30KIAorYm9vbCBDUERGX1BhZ2U6OklzUGFnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHRydWU7Cit9CisKIHZvaWQgQ1BERl9QYWdlOjpTdGFydFBhcnNlKCkgewogICBpZiAobV9QYXJzZVN0YXRlID09IENPTlRFTlRfUEFSU0VEIHx8IG1fUGFyc2VTdGF0ZSA9PSBDT05URU5UX1BBUlNJTkcpCiAgICAgcmV0dXJuOwogCi0gIG1fcFBhcnNlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0NvbnRlbnRQYXJzZXI+KCk7Ci0gIG1fcFBhcnNlci0+U3RhcnQodGhpcyk7CisgIG1fcFBhcnNlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0NvbnRlbnRQYXJzZXI+KHRoaXMpOwogICBtX1BhcnNlU3RhdGUgPSBDT05URU5UX1BBUlNJTkc7CiB9CiAKQEAgLTEwNSw4ICs5Niw4IEBACiAgIG1fcFJlbmRlckNvbnRleHQgPSBzdGQ6Om1vdmUocENvbnRleHQpOwogfQogCi1DUERGX09iamVjdCogQ1BERl9QYWdlOjpHZXRQYWdlQXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkgY29uc3QgewotICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IG1fcEZvcm1EaWN0OworQ1BERl9PYmplY3QqIENQREZfUGFnZTo6R2V0UGFnZUF0dHIoY29uc3QgQnl0ZVN0cmluZyYgbmFtZSkgY29uc3QgeworICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IG1fcEZvcm1EaWN0LkdldCgpOwogICBzdGQ6OnNldDxDUERGX0RpY3Rpb25hcnkqPiB2aXNpdGVkOwogICB3aGlsZSAoMSkgewogICAgIHZpc2l0ZWQuaW5zZXJ0KHBQYWdlRGljdCk7CkBAIC0xMjAsNiArMTExLDE2IEBACiAgIHJldHVybiBudWxscHRyOwogfQogCitDRlhfRmxvYXRSZWN0IENQREZfUGFnZTo6R2V0Qm94KGNvbnN0IEJ5dGVTdHJpbmcmIG5hbWUpIGNvbnN0IHsKKyAgQ0ZYX0Zsb2F0UmVjdCBib3g7CisgIENQREZfQXJyYXkqIHBCb3ggPSBUb0FycmF5KEdldFBhZ2VBdHRyKG5hbWUpKTsKKyAgaWYgKHBCb3gpIHsKKyAgICBib3ggPSBwQm94LT5HZXRSZWN0KCk7CisgICAgYm94Lk5vcm1hbGl6ZSgpOworICB9CisgIHJldHVybiBib3g7Cit9CisKIENGWF9NYXRyaXggQ1BERl9QYWdlOjpHZXREaXNwbGF5TWF0cml4KGludCB4UG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeFNpemUsCkBAIC0xNzYsMTIgKzE3NywyMiBAQAogICByZXR1cm4gbWF0cml4OwogfQogCitpbnQgQ1BERl9QYWdlOjpHZXRQYWdlUm90YXRpb24oKSBjb25zdCB7CisgIENQREZfT2JqZWN0KiBwUm90YXRlID0gR2V0UGFnZUF0dHIoIlJvdGF0ZSIpOworICBpbnQgcm90YXRlID0gcFJvdGF0ZSA/IChwUm90YXRlLT5HZXRJbnRlZ2VyKCkgLyA5MCkgJSA0IDogMDsKKyAgcmV0dXJuIChyb3RhdGUgPCAwKSA/IChyb3RhdGUgKyA0KSA6IHJvdGF0ZTsKK30KKwogYm9vbCBHcmFwaGljc0RhdGE6Om9wZXJhdG9yPChjb25zdCBHcmFwaGljc0RhdGEmIG90aGVyKSBjb25zdCB7CiAgIGlmIChmaWxsQWxwaGEgIT0gb3RoZXIuZmlsbEFscGhhKQogICAgIHJldHVybiBmaWxsQWxwaGEgPCBvdGhlci5maWxsQWxwaGE7Ci0gIHJldHVybiBzdHJva2VBbHBoYSA8IG90aGVyLnN0cm9rZUFscGhhOworICBpZiAoc3Ryb2tlQWxwaGEgIT0gb3RoZXIuc3Ryb2tlQWxwaGEpCisgICAgcmV0dXJuIHN0cm9rZUFscGhhIDwgb3RoZXIuc3Ryb2tlQWxwaGE7CisgIHJldHVybiBibGVuZFR5cGUgPCBvdGhlci5ibGVuZFR5cGU7CiB9CiAKIGJvb2wgRm9udERhdGE6Om9wZXJhdG9yPChjb25zdCBGb250RGF0YSYgb3RoZXIpIGNvbnN0IHsKLSAgcmV0dXJuIGJhc2VGb250IDwgb3RoZXIuYmFzZUZvbnQ7CisgIGlmIChiYXNlRm9udCAhPSBvdGhlci5iYXNlRm9udCkKKyAgICByZXR1cm4gYmFzZUZvbnQgPCBvdGhlci5iYXNlRm9udDsKKyAgcmV0dXJuIHR5cGUgPCBvdGhlci50eXBlOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlLmggYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2UuaAppbmRleCA5ZTMwMzU2Li5lMWI1YmNmIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2UuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2UuaApAQCAtNywxMSArNyw5IEBACiAjaWZuZGVmIENPUkVfRlBERkFQSV9QQUdFX0NQREZfUEFHRV9IXwogI2RlZmluZSBDT1JFX0ZQREZBUElfUEFHRV9DUERGX1BBR0VfSF8KIAotI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2VvYmplY3Rob2xkZXIuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCiAKQEAgLTIxLDE5ICsxOSw2IEBACiBjbGFzcyBDUERGX1BhZ2VSZW5kZXJDYWNoZTsKIGNsYXNzIENQREZfUGFnZVJlbmRlckNvbnRleHQ7CiAKLS8vIFRoZXNlIHN0cnVjdHMgYXJlIHVzZWQgdG8ga2VlcCB0cmFjayBvZiByZXNvdXJjZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbgotLy8gZ2VuZXJhdGVkIGluIHRoZSBwYWdlLgotc3RydWN0IEdyYXBoaWNzRGF0YSB7Ci0gIEZYX0ZMT0FUIGZpbGxBbHBoYTsKLSAgRlhfRkxPQVQgc3Ryb2tlQWxwaGE7Ci0gIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEdyYXBoaWNzRGF0YSYgb3RoZXIpIGNvbnN0OwotfTsKLQotc3RydWN0IEZvbnREYXRhIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgYmFzZUZvbnQ7Ci0gIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEZvbnREYXRhJiBvdGhlcikgY29uc3Q7Ci19OwotCiBjbGFzcyBDUERGX1BhZ2UgOiBwdWJsaWMgQ1BERl9QYWdlT2JqZWN0SG9sZGVyIHsKICBwdWJsaWM6CiAgIGNsYXNzIFZpZXcge307ICAvLyBDYWxsZXIgaW1wbGVtZW50cyBhcyBkZXNpcmVkLCBlbXB0eSBoZXJlIGR1ZSB0byBsYXllcmluZy4KQEAgLTQzLDYgKzI4LDkgQEAKICAgICAgICAgICAgIGJvb2wgYlBhZ2VDYWNoZSk7CiAgIH5DUERGX1BhZ2UoKSBvdmVycmlkZTsKIAorICAvLyBDUERGX1BhZ2VPYmplY3RIb2xkZXIKKyAgYm9vbCBJc1BhZ2UoKSBjb25zdCBvdmVycmlkZTsKKwogICB2b2lkIFBhcnNlQ29udGVudCgpOwogCiAgIENGWF9NYXRyaXggR2V0RGlzcGxheU1hdHJpeChpbnQgeFBvcywKQEAgLTUxLDExICszOSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlSb3RhdGUpIGNvbnN0OwogCi0gIEZYX0ZMT0FUIEdldFBhZ2VXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fUGFnZVdpZHRoOyB9Ci0gIEZYX0ZMT0FUIEdldFBhZ2VIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX1BhZ2VIZWlnaHQ7IH0KKyAgZmxvYXQgR2V0UGFnZVdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9QYWdlV2lkdGg7IH0KKyAgZmxvYXQgR2V0UGFnZUhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fUGFnZUhlaWdodDsgfQogICBDRlhfRmxvYXRSZWN0IEdldFBhZ2VCQm94KCkgY29uc3QgeyByZXR1cm4gbV9CQm94OyB9Ci0gIGNvbnN0IENGWF9NYXRyaXgmIEdldFBhZ2VNYXRyaXgoKSBjb25zdCB7IHJldHVybiBtX1BhZ2VNYXRyaXg7IH0KLSAgQ1BERl9PYmplY3QqIEdldFBhZ2VBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKSBjb25zdDsKKyAgaW50IEdldFBhZ2VSb3RhdGlvbigpIGNvbnN0OwogICBDUERGX1BhZ2VSZW5kZXJDYWNoZSogR2V0UmVuZGVyQ2FjaGUoKSBjb25zdCB7IHJldHVybiBtX3BQYWdlUmVuZGVyLmdldCgpOyB9CiAKICAgQ1BERl9QYWdlUmVuZGVyQ29udGV4dCogR2V0UmVuZGVyQ29udGV4dCgpIGNvbnN0IHsKQEAgLTY2LDE0ICs1MywxNCBAQAogICBWaWV3KiBHZXRWaWV3KCkgY29uc3QgeyByZXR1cm4gbV9wVmlldzsgfQogICB2b2lkIFNldFZpZXcoVmlldyogcFZpZXcpIHsgbV9wVmlldyA9IHBWaWV3OyB9CiAKLSAgc3RkOjptYXA8R3JhcGhpY3NEYXRhLCBDRlhfQnl0ZVN0cmluZz4gbV9HcmFwaGljc01hcDsKLSAgc3RkOjptYXA8Rm9udERhdGEsIENGWF9CeXRlU3RyaW5nPiBtX0ZvbnRzTWFwOwotCi0gcHJvdGVjdGVkOgorIHByaXZhdGU6CiAgIHZvaWQgU3RhcnRQYXJzZSgpOwogCi0gIEZYX0ZMT0FUIG1fUGFnZVdpZHRoOwotICBGWF9GTE9BVCBtX1BhZ2VIZWlnaHQ7CisgIENQREZfT2JqZWN0KiBHZXRQYWdlQXR0cihjb25zdCBCeXRlU3RyaW5nJiBuYW1lKSBjb25zdDsKKyAgQ0ZYX0Zsb2F0UmVjdCBHZXRCb3goY29uc3QgQnl0ZVN0cmluZyYgbmFtZSkgY29uc3Q7CisKKyAgZmxvYXQgbV9QYWdlV2lkdGg7CisgIGZsb2F0IG1fUGFnZUhlaWdodDsKICAgQ0ZYX01hdHJpeCBtX1BhZ2VNYXRyaXg7CiAgIFZpZXcqIG1fcFZpZXc7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1BhZ2VSZW5kZXJDYWNoZT4gbV9wUGFnZVJlbmRlcjsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW1vZHVsZS5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2Vtb2R1bGUuY3BwCmluZGV4IDgwZWRmMmMuLjNiMThhY2UgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW1vZHVsZS5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlbW9kdWxlLmNwcApAQCAtNywxMCArNywxMiBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW1vZHVsZS5oIgogCiBDUERGX1BhZ2VNb2R1bGU6OkNQREZfUGFnZU1vZHVsZSgpCi0gICAgOiBtX1N0b2NrR3JheUNTKG51bGxwdHIsIFBERkNTX0RFVklDRUdSQVkpLAotICAgICAgbV9TdG9ja1JHQkNTKG51bGxwdHIsIFBERkNTX0RFVklDRVJHQiksCi0gICAgICBtX1N0b2NrQ01ZS0NTKG51bGxwdHIsIFBERkNTX0RFVklDRUNNWUspLAotICAgICAgbV9TdG9ja1BhdHRlcm5DUyhudWxscHRyKSB7fQorICAgIDogbV9TdG9ja0dyYXlDUyhQREZDU19ERVZJQ0VHUkFZKSwKKyAgICAgIG1fU3RvY2tSR0JDUyhQREZDU19ERVZJQ0VSR0IpLAorICAgICAgbV9TdG9ja0NNWUtDUyhQREZDU19ERVZJQ0VDTVlLKSwKKyAgICAgIG1fU3RvY2tQYXR0ZXJuQ1MobnVsbHB0cikgeworICBtX1N0b2NrUGF0dGVybkNTLkluaXRpYWxpemVTdG9ja1BhdHRlcm4oKTsKK30KIAogQ1BERl9QYWdlTW9kdWxlOjp+Q1BERl9QYWdlTW9kdWxlKCkge30KIApkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlbW9kdWxlLmggYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2Vtb2R1bGUuaAppbmRleCA0YWExOWRhLi43MjBlZTg1IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2Vtb2R1bGUuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2Vtb2R1bGUuaApAQCAtNyw5ICs3LDEwIEBACiAjaWZuZGVmIENPUkVfRlBERkFQSV9QQUdFX0NQREZfUEFHRU1PRFVMRV9IXwogI2RlZmluZSBDT1JFX0ZQREZBUElfUEFHRV9DUERGX1BBR0VNT0RVTEVfSF8KIAotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2ZvbnRfaW50LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9mb250Z2xvYmFscy5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29sb3JzcGFjZS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL3BhZ2VpbnQuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2RldmljZWNzLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYXR0ZXJuY3MuaCIKIAogY2xhc3MgQ1BERl9Eb2N1bWVudDsKIApkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlb2JqZWN0LmNwcCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW9iamVjdC5jcHAKaW5kZXggYzBlMDMxZS4uOGJiNWJmNSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlb2JqZWN0LmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2VvYmplY3QuY3BwCkBAIC02LDcgKzYsNyBAQAogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlb2JqZWN0LmgiCiAKLUNQREZfUGFnZU9iamVjdDo6Q1BERl9QYWdlT2JqZWN0KCkge30KK0NQREZfUGFnZU9iamVjdDo6Q1BERl9QYWdlT2JqZWN0KCkgOiBtX2JEaXJ0eShmYWxzZSkge30KIAogQ1BERl9QYWdlT2JqZWN0Ojp+Q1BERl9QYWdlT2JqZWN0KCkge30KIApAQCAtNzYsMjQgKzc2LDI3IEBACiAgIG1fUmlnaHQgPSBwU3JjLT5tX1JpZ2h0OwogICBtX1RvcCA9IHBTcmMtPm1fVG9wOwogICBtX0JvdHRvbSA9IHBTcmMtPm1fQm90dG9tOworICBtX2JEaXJ0eSA9IHRydWU7CiB9CiAKIHZvaWQgQ1BERl9QYWdlT2JqZWN0OjpUcmFuc2Zvcm1DbGlwUGF0aChDRlhfTWF0cml4JiBtYXRyaXgpIHsKLSAgaWYgKCFtX0NsaXBQYXRoKQorICBpZiAoIW1fQ2xpcFBhdGguSGFzUmVmKCkpCiAgICAgcmV0dXJuOwogICBtX0NsaXBQYXRoLlRyYW5zZm9ybShtYXRyaXgpOworICBTZXREaXJ0eSh0cnVlKTsKIH0KIAogdm9pZCBDUERGX1BhZ2VPYmplY3Q6OlRyYW5zZm9ybUdlbmVyYWxTdGF0ZShDRlhfTWF0cml4JiBtYXRyaXgpIHsKLSAgaWYgKCFtX0dlbmVyYWxTdGF0ZSkKKyAgaWYgKCFtX0dlbmVyYWxTdGF0ZS5IYXNSZWYoKSkKICAgICByZXR1cm47CiAgIG1fR2VuZXJhbFN0YXRlLkdldE11dGFibGVNYXRyaXgoKS0+Q29uY2F0KG1hdHJpeCk7CisgIFNldERpcnR5KHRydWUpOwogfQogCiBGWF9SRUNUIENQREZfUGFnZU9iamVjdDo6R2V0QkJveChjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSBjb25zdCB7CiAgIENGWF9GbG9hdFJlY3QgcmVjdChtX0xlZnQsIG1fQm90dG9tLCBtX1JpZ2h0LCBtX1RvcCk7Ci0gIGlmIChwTWF0cml4KSB7Ci0gICAgcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChyZWN0KTsKLSAgfQorICBpZiAocE1hdHJpeCkKKyAgICByZWN0ID0gcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChyZWN0KTsKKwogICByZXR1cm4gcmVjdC5HZXRPdXRlclJlY3QoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW9iamVjdC5oIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlb2JqZWN0LmgKaW5kZXggZDJiODRhNS4uZDIzY2Q5NyAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlb2JqZWN0LmgKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlb2JqZWN0LmgKQEAgLTQ5LDYgKzQ5LDggQEAKICAgdmlydHVhbCBDUERGX0Zvcm1PYmplY3QqIEFzRm9ybSgpOwogICB2aXJ0dWFsIGNvbnN0IENQREZfRm9ybU9iamVjdCogQXNGb3JtKCkgY29uc3Q7CiAKKyAgdm9pZCBTZXREaXJ0eShib29sIHZhbHVlKSB7IG1fYkRpcnR5ID0gdmFsdWU7IH0KKyAgYm9vbCBJc0RpcnR5KCkgY29uc3QgeyByZXR1cm4gbV9iRGlydHk7IH0KICAgdm9pZCBUcmFuc2Zvcm1DbGlwUGF0aChDRlhfTWF0cml4JiBtYXRyaXgpOwogICB2b2lkIFRyYW5zZm9ybUdlbmVyYWxTdGF0ZShDRlhfTWF0cml4JiBtYXRyaXgpOwogCkBAIC01NywxMCArNTksMTAgQEAKICAgfQogICBGWF9SRUNUIEdldEJCb3goY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgY29uc3Q7CiAKLSAgRlhfRkxPQVQgbV9MZWZ0OwotICBGWF9GTE9BVCBtX1JpZ2h0OwotICBGWF9GTE9BVCBtX1RvcDsKLSAgRlhfRkxPQVQgbV9Cb3R0b207CisgIGZsb2F0IG1fTGVmdDsKKyAgZmxvYXQgbV9SaWdodDsKKyAgZmxvYXQgbV9Ub3A7CisgIGZsb2F0IG1fQm90dG9tOwogICBDUERGX0NvbnRlbnRNYXJrIG1fQ29udGVudE1hcms7CiAKICBwcm90ZWN0ZWQ6CkBAIC02OSw2ICs3MSw4IEBACiAgcHJpdmF0ZToKICAgQ1BERl9QYWdlT2JqZWN0KGNvbnN0IENQREZfUGFnZU9iamVjdCYgc3JjKSA9IGRlbGV0ZTsKICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgQ1BERl9QYWdlT2JqZWN0JiBzcmMpID0gZGVsZXRlOworCisgIGJvb2wgbV9iRGlydHk7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9QQUdFX0NQREZfUEFHRU9CSkVDVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlb2JqZWN0aG9sZGVyLmNwcCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW9iamVjdGhvbGRlci5jcHAKaW5kZXggMzMwNGQ0ZS4uNTFhNjdlOCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlb2JqZWN0aG9sZGVyLmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2VvYmplY3Rob2xkZXIuY3BwCkBAIC04LDMzICs4LDQ2IEBACiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2FsbHN0YXRlcy5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29udGVudHBhcnNlci5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW9iamVjdC5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL3BhZ2VpbnQuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgogCi1DUERGX1BhZ2VPYmplY3RIb2xkZXI6OkNQREZfUGFnZU9iamVjdEhvbGRlcigpCi0gICAgOiBtX3BGb3JtRGljdChudWxscHRyKSwKK0NQREZfUGFnZU9iamVjdEhvbGRlcjo6Q1BERl9QYWdlT2JqZWN0SG9sZGVyKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCkKKyAgICA6IG1fcEZvcm1EaWN0KHBGb3JtRGljdCksCiAgICAgICBtX3BGb3JtU3RyZWFtKG51bGxwdHIpLAotICAgICAgbV9wRG9jdW1lbnQobnVsbHB0ciksCisgICAgICBtX3BEb2N1bWVudChwRG9jKSwKICAgICAgIG1fcFBhZ2VSZXNvdXJjZXMobnVsbHB0ciksCiAgICAgICBtX3BSZXNvdXJjZXMobnVsbHB0ciksCi0gICAgICBtX1RyYW5zcGFyZW5jeSgwKSwKKyAgICAgIG1faVRyYW5zcGFyZW5jeSgwKSwKICAgICAgIG1fYkJhY2tncm91bmRBbHBoYU5lZWRlZChmYWxzZSksCi0gICAgICBtX2JIYXNJbWFnZU1hc2soZmFsc2UpLAotICAgICAgbV9QYXJzZVN0YXRlKENPTlRFTlRfTk9UX1BBUlNFRCkge30KKyAgICAgIG1fUGFyc2VTdGF0ZShDT05URU5UX05PVF9QQVJTRUQpIHsKKyAgLy8gVE9ETyh0aGVzdGlnKTogQ2hlY2sgaWYgfG1fcEZvcm1EaWN0fCBpcyBuZXZlciBhIG51bGxwdHIgYW5kIHNpbXBsaWZ5CisgIC8vIGNhbGxlcnMgdGhhdCBjaGVja3MgZm9yIHRoYXQuCit9CiAKIENQREZfUGFnZU9iamVjdEhvbGRlcjo6fkNQREZfUGFnZU9iamVjdEhvbGRlcigpIHt9CiAKLXZvaWQgQ1BERl9QYWdlT2JqZWN0SG9sZGVyOjpDb250aW51ZVBhcnNlKElGWF9QYXVzZSogcFBhdXNlKSB7Ci0gIGlmICghbV9wUGFyc2VyKSB7Citib29sIENQREZfUGFnZU9iamVjdEhvbGRlcjo6SXNQYWdlKCkgY29uc3QgeworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ1BERl9QYWdlT2JqZWN0SG9sZGVyOjpDb250aW51ZVBhcnNlKElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKSB7CisgIGlmICghbV9wUGFyc2VyKQogICAgIHJldHVybjsKLSAgfQotICBtX3BQYXJzZXItPkNvbnRpbnVlKHBQYXVzZSk7Ci0gIGlmIChtX3BQYXJzZXItPkdldFN0YXR1cygpID09IENQREZfQ29udGVudFBhcnNlcjo6RG9uZSkgewotICAgIG1fUGFyc2VTdGF0ZSA9IENPTlRFTlRfUEFSU0VEOwotICAgIG1fcFBhcnNlci5yZXNldCgpOwotICB9CisKKyAgaWYgKG1fcFBhcnNlci0+Q29udGludWUocFBhdXNlKSkKKyAgICByZXR1cm47CisKKyAgbV9QYXJzZVN0YXRlID0gQ09OVEVOVF9QQVJTRUQ7CisgIGlmIChtX3BQYXJzZXItPkdldEN1clN0YXRlcygpKQorICAgIG1fTGFzdENUTSA9IG1fcFBhcnNlci0+R2V0Q3VyU3RhdGVzKCktPm1fQ1RNOworICBtX3BQYXJzZXIucmVzZXQoKTsKK30KKwordm9pZCBDUERGX1BhZ2VPYmplY3RIb2xkZXI6OkFkZEltYWdlTWFza0JvdW5kaW5nQm94KGNvbnN0IENGWF9GbG9hdFJlY3QmIGJveCkgeworICBtX01hc2tCb3VuZGluZ0JveGVzLnB1c2hfYmFjayhib3gpOwogfQogCiB2b2lkIENQREZfUGFnZU9iamVjdEhvbGRlcjo6VHJhbnNmb3JtKGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgewpAQCAtNDQsMTIgKzU3LDEyIEBACiAKIENGWF9GbG9hdFJlY3QgQ1BERl9QYWdlT2JqZWN0SG9sZGVyOjpDYWxjQm91bmRpbmdCb3goKSBjb25zdCB7CiAgIGlmIChtX1BhZ2VPYmplY3RMaXN0LmVtcHR5KCkpCi0gICAgcmV0dXJuIENGWF9GbG9hdFJlY3QoMCwgMCwgMCwgMCk7CisgICAgcmV0dXJuIENGWF9GbG9hdFJlY3QoKTsKIAotICBGWF9GTE9BVCBsZWZ0ID0gMTAwMDAwMC4wZjsKLSAgRlhfRkxPQVQgcmlnaHQgPSAtMTAwMDAwMC4wZjsKLSAgRlhfRkxPQVQgYm90dG9tID0gMTAwMDAwMC4wZjsKLSAgRlhfRkxPQVQgdG9wID0gLTEwMDAwMDAuMGY7CisgIGZsb2F0IGxlZnQgPSAxMDAwMDAwLjBmOworICBmbG9hdCByaWdodCA9IC0xMDAwMDAwLjBmOworICBmbG9hdCBib3R0b20gPSAxMDAwMDAwLjBmOworICBmbG9hdCB0b3AgPSAtMTAwMDAwMC4wZjsKICAgZm9yIChjb25zdCBhdXRvJiBwT2JqIDogbV9QYWdlT2JqZWN0TGlzdCkgewogICAgIGxlZnQgPSBzdGQ6Om1pbihsZWZ0LCBwT2JqLT5tX0xlZnQpOwogICAgIHJpZ2h0ID0gc3RkOjptYXgocmlnaHQsIHBPYmotPm1fUmlnaHQpOwpAQCAtNzAsMTEgKzgzLDExIEBACiAgIGlmIChwR3JvdXAtPkdldFN0cmluZ0ZvcigiUyIpICE9ICJUcmFuc3BhcmVuY3kiKSB7CiAgICAgcmV0dXJuOwogICB9Ci0gIG1fVHJhbnNwYXJlbmN5IHw9IFBERlRSQU5TX0dST1VQOworICBtX2lUcmFuc3BhcmVuY3kgfD0gUERGVFJBTlNfR1JPVVA7CiAgIGlmIChwR3JvdXAtPkdldEludGVnZXJGb3IoIkkiKSkgewotICAgIG1fVHJhbnNwYXJlbmN5IHw9IFBERlRSQU5TX0lTT0xBVEVEOworICAgIG1faVRyYW5zcGFyZW5jeSB8PSBQREZUUkFOU19JU09MQVRFRDsKICAgfQogICBpZiAocEdyb3VwLT5HZXRJbnRlZ2VyRm9yKCJLIikpIHsKLSAgICBtX1RyYW5zcGFyZW5jeSB8PSBQREZUUkFOU19LTk9DS09VVDsKKyAgICBtX2lUcmFuc3BhcmVuY3kgfD0gUERGVFJBTlNfS05PQ0tPVVQ7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW9iamVjdGhvbGRlci5oIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlb2JqZWN0aG9sZGVyLmgKaW5kZXggYWVlNzYxNy4uZjY0OWVmNyAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlb2JqZWN0aG9sZGVyLmgKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlb2JqZWN0aG9sZGVyLmgKQEAgLTcsMTMgKzcsMTcgQEAKICNpZm5kZWYgQ09SRV9GUERGQVBJX1BBR0VfQ1BERl9QQUdFT0JKRUNUSE9MREVSX0hfCiAjZGVmaW5lIENPUkVfRlBERkFQSV9QQUdFX0NQREZfUEFHRU9CSkVDVEhPTERFUl9IXwogCisjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2VvYmplY3RsaXN0LmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAKLWNsYXNzIElGWF9QYXVzZTsKK2NsYXNzIElGWF9QYXVzZUluZGljYXRvcjsKIGNsYXNzIENQREZfRGljdGlvbmFyeTsKIGNsYXNzIENQREZfU3RyZWFtOwogY2xhc3MgQ1BERl9Eb2N1bWVudDsKQEAgLTIzLDM3ICsyNyw1OSBAQAogI2RlZmluZSBQREZUUkFOU19JU09MQVRFRCAweDAyMDAKICNkZWZpbmUgUERGVFJBTlNfS05PQ0tPVVQgMHgwNDAwCiAKKy8vIFRoZXNlIHN0cnVjdHMgYXJlIHVzZWQgdG8ga2VlcCB0cmFjayBvZiByZXNvdXJjZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbgorLy8gZ2VuZXJhdGVkIGluIHRoZSBwYWdlIG9iamVjdCBob2xkZXIuCitzdHJ1Y3QgR3JhcGhpY3NEYXRhIHsKKyAgZmxvYXQgZmlsbEFscGhhOworICBmbG9hdCBzdHJva2VBbHBoYTsKKyAgaW50IGJsZW5kVHlwZTsKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgR3JhcGhpY3NEYXRhJiBvdGhlcikgY29uc3Q7Cit9OworCitzdHJ1Y3QgRm9udERhdGEgeworICBCeXRlU3RyaW5nIGJhc2VGb250OworICBCeXRlU3RyaW5nIHR5cGU7CisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEZvbnREYXRhJiBvdGhlcikgY29uc3Q7Cit9OworCiBjbGFzcyBDUERGX1BhZ2VPYmplY3RIb2xkZXIgewogIHB1YmxpYzoKLSAgQ1BERl9QYWdlT2JqZWN0SG9sZGVyKCk7CisgIENQREZfUGFnZU9iamVjdEhvbGRlcihDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCk7CiAgIHZpcnR1YWwgfkNQREZfUGFnZU9iamVjdEhvbGRlcigpOwogCi0gIHZvaWQgQ29udGludWVQYXJzZShJRlhfUGF1c2UqIHBQYXVzZSk7CisgIHZpcnR1YWwgYm9vbCBJc1BhZ2UoKSBjb25zdDsKKworICB2b2lkIENvbnRpbnVlUGFyc2UoSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpOwogICBib29sIElzUGFyc2VkKCkgY29uc3QgeyByZXR1cm4gbV9QYXJzZVN0YXRlID09IENPTlRFTlRfUEFSU0VEOyB9CiAKICAgQ1BERl9QYWdlT2JqZWN0TGlzdCogR2V0UGFnZU9iamVjdExpc3QoKSB7IHJldHVybiAmbV9QYWdlT2JqZWN0TGlzdDsgfQogICBjb25zdCBDUERGX1BhZ2VPYmplY3RMaXN0KiBHZXRQYWdlT2JqZWN0TGlzdCgpIGNvbnN0IHsKICAgICByZXR1cm4gJm1fUGFnZU9iamVjdExpc3Q7CiAgIH0KKyAgY29uc3QgQ0ZYX01hdHJpeCYgR2V0TGFzdENUTSgpIGNvbnN0IHsgcmV0dXJuIG1fTGFzdENUTTsgfQogCiAgIGJvb2wgQmFja2dyb3VuZEFscGhhTmVlZGVkKCkgY29uc3QgeyByZXR1cm4gbV9iQmFja2dyb3VuZEFscGhhTmVlZGVkOyB9CiAgIHZvaWQgU2V0QmFja2dyb3VuZEFscGhhTmVlZGVkKGJvb2wgbmVlZGVkKSB7CiAgICAgbV9iQmFja2dyb3VuZEFscGhhTmVlZGVkID0gbmVlZGVkOwogICB9CiAKLSAgYm9vbCBIYXNJbWFnZU1hc2soKSBjb25zdCB7IHJldHVybiBtX2JIYXNJbWFnZU1hc2s7IH0KLSAgdm9pZCBTZXRIYXNJbWFnZU1hc2soYm9vbCB2YWx1ZSkgeyBtX2JIYXNJbWFnZU1hc2sgPSB2YWx1ZTsgfQotCisgIGJvb2wgSGFzSW1hZ2VNYXNrKCkgY29uc3QgeyByZXR1cm4gIW1fTWFza0JvdW5kaW5nQm94ZXMuZW1wdHkoKTsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxDRlhfRmxvYXRSZWN0PiYgR2V0TWFza0JvdW5kaW5nQm94ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fTWFza0JvdW5kaW5nQm94ZXM7CisgIH0KKyAgdm9pZCBBZGRJbWFnZU1hc2tCb3VuZGluZ0JveChjb25zdCBDRlhfRmxvYXRSZWN0JiBib3gpOwogICB2b2lkIFRyYW5zZm9ybShjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpOwogICBDRlhfRmxvYXRSZWN0IENhbGNCb3VuZGluZ0JveCgpIGNvbnN0OwogCi0gIENQREZfRGljdGlvbmFyeSogbV9wRm9ybURpY3Q7Ci0gIENQREZfU3RyZWFtKiBtX3BGb3JtU3RyZWFtOwotICBDUERGX0RvY3VtZW50KiBtX3BEb2N1bWVudDsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BQYWdlUmVzb3VyY2VzOwotICBDUERGX0RpY3Rpb25hcnkqIG1fcFJlc291cmNlczsKKyAgY29uc3QgVW5vd25lZFB0cjxDUERGX0RpY3Rpb25hcnk+IG1fcEZvcm1EaWN0OworICBVbm93bmVkUHRyPENQREZfU3RyZWFtPiBtX3BGb3JtU3RyZWFtOworICBVbm93bmVkUHRyPENQREZfRG9jdW1lbnQ+IG1fcERvY3VtZW50OworICBVbm93bmVkUHRyPENQREZfRGljdGlvbmFyeT4gbV9wUGFnZVJlc291cmNlczsKKyAgVW5vd25lZFB0cjxDUERGX0RpY3Rpb25hcnk+IG1fcFJlc291cmNlczsKKyAgc3RkOjptYXA8R3JhcGhpY3NEYXRhLCBCeXRlU3RyaW5nPiBtX0dyYXBoaWNzTWFwOworICBzdGQ6Om1hcDxGb250RGF0YSwgQnl0ZVN0cmluZz4gbV9Gb250c01hcDsKICAgQ0ZYX0Zsb2F0UmVjdCBtX0JCb3g7Ci0gIGludCBtX1RyYW5zcGFyZW5jeTsKKyAgaW50IG1faVRyYW5zcGFyZW5jeTsKIAogIHByb3RlY3RlZDoKICAgZW51bSBQYXJzZVN0YXRlIHsgQ09OVEVOVF9OT1RfUEFSU0VELCBDT05URU5UX1BBUlNJTkcsIENPTlRFTlRfUEFSU0VEIH07CkBAIC02MSwxMCArODcsMTEgQEAKICAgdm9pZCBMb2FkVHJhbnNJbmZvKCk7CiAKICAgYm9vbCBtX2JCYWNrZ3JvdW5kQWxwaGFOZWVkZWQ7Ci0gIGJvb2wgbV9iSGFzSW1hZ2VNYXNrOworICBzdGQ6OnZlY3RvcjxDRlhfRmxvYXRSZWN0PiBtX01hc2tCb3VuZGluZ0JveGVzOwogICBQYXJzZVN0YXRlIG1fUGFyc2VTdGF0ZTsKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfQ29udGVudFBhcnNlcj4gbV9wUGFyc2VyOwogICBDUERGX1BhZ2VPYmplY3RMaXN0IG1fUGFnZU9iamVjdExpc3Q7CisgIENGWF9NYXRyaXggbV9MYXN0Q1RNOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfUEFHRV9DUERGX1BBR0VPQkpFQ1RIT0xERVJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW9iamVjdGxpc3QuY3BwIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlb2JqZWN0bGlzdC5jcHAKaW5kZXggMDJiNTkwZS4uYWZkMmM5OCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlb2JqZWN0bGlzdC5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlb2JqZWN0bGlzdC5jcHAKQEAgLTYsMTEgKzYsOCBAQAogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlb2JqZWN0bGlzdC5oIgogCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvcGFnZWludC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKIAogQ1BERl9QYWdlT2JqZWN0KiBDUERGX1BhZ2VPYmplY3RMaXN0OjpHZXRQYWdlT2JqZWN0QnlJbmRleChpbnQgaW5kZXgpIHsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludD4oKnRoaXMpKQotICAgIHJldHVybiBudWxscHRyOwotICByZXR1cm4gKCp0aGlzKVtpbmRleF0uZ2V0KCk7CisgIHJldHVybiBwZGZpdW06OkluZGV4SW5Cb3VuZHMoKnRoaXMsIGluZGV4KSA/ICgqdGhpcylbaW5kZXhdLmdldCgpIDogbnVsbHB0cjsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0aC5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhdGguY3BwCmluZGV4IGRkYzZiYmQuLmI1NjI0OWMgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0aC5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYXRoLmNwcApAQCAtMjgsOCArMjgsOCBAQAogICByZXR1cm4gbV9SZWYuR2V0T2JqZWN0KCktPkdldEJvdW5kaW5nQm94KCk7CiB9CiAKLUNGWF9GbG9hdFJlY3QgQ1BERl9QYXRoOjpHZXRCb3VuZGluZ0JveChGWF9GTE9BVCBsaW5lX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG1pdGVyX2xpbWl0KSBjb25zdCB7CitDRlhfRmxvYXRSZWN0IENQREZfUGF0aDo6R2V0Qm91bmRpbmdCb3goZmxvYXQgbGluZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtaXRlcl9saW1pdCkgY29uc3QgewogICByZXR1cm4gbV9SZWYuR2V0T2JqZWN0KCktPkdldEJvdW5kaW5nQm94KGxpbmVfd2lkdGgsIG1pdGVyX2xpbWl0KTsKIH0KIApAQCAtNDksMTAgKzQ5LDcgQEAKICAgbV9SZWYuR2V0UHJpdmF0ZUNvcHkoKS0+QXBwZW5kKHBEYXRhLCBwTWF0cml4KTsKIH0KIAotdm9pZCBDUERGX1BhdGg6OkFwcGVuZFJlY3QoRlhfRkxPQVQgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9wKSB7Cit2b2lkIENQREZfUGF0aDo6QXBwZW5kUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCBib3R0b20sIGZsb2F0IHJpZ2h0LCBmbG9hdCB0b3ApIHsKICAgbV9SZWYuR2V0UHJpdmF0ZUNvcHkoKS0+QXBwZW5kUmVjdChsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3ApOwogfQogCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhdGguaCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0aC5oCmluZGV4IGIwYzVhNjguLjYxM2Q3MTUgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0aC5oCisrKyBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0aC5oCkBAIC05LDkgKzksOSBAQAogCiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfc2hhcmVkX2NvcHlfb25fd3JpdGUuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZnhnZWRldmljZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvc2hhcmVkX2NvcHlfb25fd3JpdGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2RlZmF1bHRyZW5kZXJkZXZpY2UuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3BhdGhkYXRhLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaCIKIApAQCAtMjIsMjggKzIyLDI4IEBACiAgIH5DUERGX1BhdGgoKTsKIAogICB2b2lkIEVtcGxhY2UoKSB7IG1fUmVmLkVtcGxhY2UoKTsgfQotICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gISFtX1JlZjsgfQorICBib29sIEhhc1JlZigpIGNvbnN0IHsgcmV0dXJuICEhbV9SZWY7IH0KIAogICBjb25zdCBzdGQ6OnZlY3RvcjxGWF9QQVRIUE9JTlQ+JiBHZXRQb2ludHMoKSBjb25zdDsKICAgdm9pZCBDbG9zZVBhdGgoKTsKIAogICBDRlhfUG9pbnRGIEdldFBvaW50KGludCBpbmRleCkgY29uc3Q7CiAgIENGWF9GbG9hdFJlY3QgR2V0Qm91bmRpbmdCb3goKSBjb25zdDsKLSAgQ0ZYX0Zsb2F0UmVjdCBHZXRCb3VuZGluZ0JveChGWF9GTE9BVCBsaW5lX3dpZHRoLCBGWF9GTE9BVCBtaXRlcl9saW1pdCkgY29uc3Q7CisgIENGWF9GbG9hdFJlY3QgR2V0Qm91bmRpbmdCb3goZmxvYXQgbGluZV93aWR0aCwgZmxvYXQgbWl0ZXJfbGltaXQpIGNvbnN0OwogCiAgIGJvb2wgSXNSZWN0KCkgY29uc3Q7CiAgIHZvaWQgVHJhbnNmb3JtKGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOwogCiAgIHZvaWQgQXBwZW5kKGNvbnN0IENQREZfUGF0aCYgb3RoZXIsIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOwogICB2b2lkIEFwcGVuZChjb25zdCBDRlhfUGF0aERhdGEqIHBEYXRhLCBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKLSAgdm9pZCBBcHBlbmRSZWN0KEZYX0ZMT0FUIGxlZnQsIEZYX0ZMT0FUIGJvdHRvbSwgRlhfRkxPQVQgcmlnaHQsIEZYX0ZMT0FUIHRvcCk7CisgIHZvaWQgQXBwZW5kUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCBib3R0b20sIGZsb2F0IHJpZ2h0LCBmbG9hdCB0b3ApOwogICB2b2lkIEFwcGVuZFBvaW50KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCBGWFBUX1RZUEUgdHlwZSwgYm9vbCBjbG9zZSk7CiAKICAgLy8gVE9ETyh0c2VwZXopOiBSZW1vdmUgd2hlbiBhbGwgYWNjZXNzIHRocnUgdGhpcyBjbGFzcy4KICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBHZXRPYmplY3QoKSBjb25zdCB7IHJldHVybiBtX1JlZi5HZXRPYmplY3QoKTsgfQogCiAgcHJpdmF0ZToKLSAgQ0ZYX1NoYXJlZENvcHlPbldyaXRlPENGWF9QYXRoRGF0YT4gbV9SZWY7CisgIFNoYXJlZENvcHlPbldyaXRlPENGWF9QYXRoRGF0YT4gbV9SZWY7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9QQUdFX0NQREZfUEFUSF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYXRob2JqZWN0LmNwcCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0aG9iamVjdC5jcHAKaW5kZXggYjViYjg5My4uZDhjMmNiOCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYXRob2JqZWN0LmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhdGhvYmplY3QuY3BwCkBAIC02LDcgKzYsNyBAQAogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYXRob2JqZWN0LmgiCiAKLUNQREZfUGF0aE9iamVjdDo6Q1BERl9QYXRoT2JqZWN0KCkge30KK0NQREZfUGF0aE9iamVjdDo6Q1BERl9QYXRoT2JqZWN0KCkgOiBtX0ZpbGxUeXBlKDApLCBtX2JTdHJva2UoZmFsc2UpIHt9CiAKIENQREZfUGF0aE9iamVjdDo6fkNQREZfUGF0aE9iamVjdCgpIHt9CiAKQEAgLTE3LDYgKzE3LDcgQEAKIHZvaWQgQ1BERl9QYXRoT2JqZWN0OjpUcmFuc2Zvcm0oY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7CiAgIG1fTWF0cml4LkNvbmNhdChtYXRyaXgpOwogICBDYWxjQm91bmRpbmdCb3goKTsKKyAgU2V0RGlydHkodHJ1ZSk7CiB9CiAKIGJvb2wgQ1BERl9QYXRoT2JqZWN0OjpJc1BhdGgoKSBjb25zdCB7CkBAIC0zMiwxNiArMzMsMTYgQEAKIH0KIAogdm9pZCBDUERGX1BhdGhPYmplY3Q6OkNhbGNCb3VuZGluZ0JveCgpIHsKLSAgaWYgKCFtX1BhdGgpCisgIGlmICghbV9QYXRoLkhhc1JlZigpKQogICAgIHJldHVybjsKICAgQ0ZYX0Zsb2F0UmVjdCByZWN0OwotICBGWF9GTE9BVCB3aWR0aCA9IG1fR3JhcGhTdGF0ZS5HZXRMaW5lV2lkdGgoKTsKKyAgZmxvYXQgd2lkdGggPSBtX0dyYXBoU3RhdGUuR2V0TGluZVdpZHRoKCk7CiAgIGlmIChtX2JTdHJva2UgJiYgd2lkdGggIT0gMCkgewogICAgIHJlY3QgPSBtX1BhdGguR2V0Qm91bmRpbmdCb3god2lkdGgsIG1fR3JhcGhTdGF0ZS5HZXRNaXRlckxpbWl0KCkpOwogICB9IGVsc2UgewogICAgIHJlY3QgPSBtX1BhdGguR2V0Qm91bmRpbmdCb3goKTsKICAgfQotICBtX01hdHJpeC5UcmFuc2Zvcm1SZWN0KHJlY3QpOworICByZWN0ID0gbV9NYXRyaXguVHJhbnNmb3JtUmVjdChyZWN0KTsKIAogICBpZiAod2lkdGggPT0gMCAmJiBtX2JTdHJva2UpIHsKICAgICByZWN0LmxlZnQgKz0gLTAuNWY7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhdHRlcm4uY3BwIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYXR0ZXJuLmNwcAppbmRleCBiMGEyZDgxLi44OGU1ZGVlIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhdHRlcm4uY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0dGVybi5jcHAKQEAgLTYsMTMgKzYsMTcgQEAKIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0dGVybi5oIgogCi1DUERGX1BhdHRlcm46OkNQREZfUGF0dGVybihQYXR0ZXJuVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvYywKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgorCitDUERGX1BhdHRlcm46OkNQREZfUGF0dGVybihDUERGX0RvY3VtZW50KiBwRG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBwYXJlbnRNYXRyaXgpCi0gICAgOiBtX1BhdHRlcm5UeXBlKHR5cGUpLAotICAgICAgbV9wRG9jdW1lbnQocERvYyksCi0gICAgICBtX3BQYXR0ZXJuT2JqKHBPYmopLAotICAgICAgbV9QYXJlbnRNYXRyaXgocGFyZW50TWF0cml4KSB7fQorICAgIDogbV9wRG9jdW1lbnQocERvYyksIG1fcFBhdHRlcm5PYmoocE9iaiksIG1fUGFyZW50TWF0cml4KHBhcmVudE1hdHJpeCkge30KIAogQ1BERl9QYXR0ZXJuOjp+Q1BERl9QYXR0ZXJuKCkge30KKwordm9pZCBDUERGX1BhdHRlcm46OlNldFBhdHRlcm5Ub0Zvcm1NYXRyaXgoKSB7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwYXR0ZXJuX29iaigpLT5HZXREaWN0KCk7CisgIG1fUGF0dGVybjJGb3JtID0gcERpY3QtPkdldE1hdHJpeEZvcigiTWF0cml4Iik7CisgIG1fUGF0dGVybjJGb3JtLkNvbmNhdChtX1BhcmVudE1hdHJpeCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhdHRlcm4uaCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0dGVybi5oCmluZGV4IGQ0NDk2NWYuLjMwN2M2NzcgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0dGVybi5oCisrKyBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0dGVybi5oCkBAIC03LDggKzcsMTAgQEAKICNpZm5kZWYgQ09SRV9GUERGQVBJX1BBR0VfQ1BERl9QQVRURVJOX0hfCiAjZGVmaW5lIENPUkVfRlBERkFQSV9QQUdFX0NQREZfUEFUVEVSTl9IXwogCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb3VudGVkb2JqZWN0LmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogCiBjbGFzcyBDUERGX0RvY3VtZW50OwogY2xhc3MgQ1BERl9PYmplY3Q7CkBAIC0yNCwyMiArMjYsMjUgQEAKICAgdmlydHVhbCBDUERGX1RpbGluZ1BhdHRlcm4qIEFzVGlsaW5nUGF0dGVybigpID0gMDsKICAgdmlydHVhbCBDUERGX1NoYWRpbmdQYXR0ZXJuKiBBc1NoYWRpbmdQYXR0ZXJuKCkgPSAwOwogCi0gIENQREZfRG9jdW1lbnQqIGRvY3VtZW50KCkgeyByZXR1cm4gbV9wRG9jdW1lbnQ7IH0KLSAgQ1BERl9PYmplY3QqIHBhdHRlcm5fb2JqKCkgeyByZXR1cm4gbV9wUGF0dGVybk9iajsgfQorICAvLyBBbGwgdGhlIGdldHRlcnMgdGhhdCByZXR1cm4gcG9pbnRlcnMgcmV0dXJuIG5vbi1OVUxMIHBvaW50ZXJzLgorICBDUERGX0RvY3VtZW50KiBkb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcERvY3VtZW50LkdldCgpOyB9CisgIENQREZfT2JqZWN0KiBwYXR0ZXJuX29iaigpIGNvbnN0IHsgcmV0dXJuIG1fcFBhdHRlcm5PYmouR2V0KCk7IH0KICAgQ0ZYX01hdHJpeCogcGF0dGVybl90b19mb3JtKCkgeyByZXR1cm4gJm1fUGF0dGVybjJGb3JtOyB9CiAgIGNvbnN0IENGWF9NYXRyaXgmIHBhcmVudF9tYXRyaXgoKSBjb25zdCB7IHJldHVybiBtX1BhcmVudE1hdHJpeDsgfQogCiAgcHJvdGVjdGVkOgotICBDUERGX1BhdHRlcm4oUGF0dGVyblR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2MsCisgIENQREZfUGF0dGVybihDUERGX0RvY3VtZW50KiBwRG9jLAogICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBPYmosCiAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBwYXJlbnRNYXRyaXgpOwogCi0gIGNvbnN0IFBhdHRlcm5UeXBlIG1fUGF0dGVyblR5cGU7Ci0gIENQREZfRG9jdW1lbnQqIGNvbnN0IG1fcERvY3VtZW50OwotICBDUERGX09iamVjdCogY29uc3QgbV9wUGF0dGVybk9iajsKKyAgdm9pZCBTZXRQYXR0ZXJuVG9Gb3JtTWF0cml4KCk7CisKKyBwcml2YXRlOgorICBVbm93bmVkUHRyPENQREZfRG9jdW1lbnQ+IGNvbnN0IG1fcERvY3VtZW50OworICBVbm93bmVkUHRyPENQREZfT2JqZWN0PiBjb25zdCBtX3BQYXR0ZXJuT2JqOwogICBDRlhfTWF0cml4IG1fUGF0dGVybjJGb3JtOwogICBjb25zdCBDRlhfTWF0cml4IG1fUGFyZW50TWF0cml4OwogfTsKK3VzaW5nIENQREZfQ291bnRlZFBhdHRlcm4gPSBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9QYXR0ZXJuPjsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfUEFHRV9DUERGX1BBVFRFUk5fSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0dGVybmNzLmNwcCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0dGVybmNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGI2ODBmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYXR0ZXJuY3MuY3BwCkBAIC0wLDAgKzEsNjQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0dGVybmNzLmgiCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2RvY3BhZ2VkYXRhLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RvY3VtZW50LmgiCisKK0NQREZfUGF0dGVybkNTOjpDUERGX1BhdHRlcm5DUyhDUERGX0RvY3VtZW50KiBwRG9jKQorICAgIDogQ1BERl9Db2xvclNwYWNlKHBEb2MsIFBERkNTX1BBVFRFUk4pLAorICAgICAgbV9wQmFzZUNTKG51bGxwdHIpLAorICAgICAgbV9wQ291bnRlZEJhc2VDUyhudWxscHRyKSB7fQorCitDUERGX1BhdHRlcm5DUzo6fkNQREZfUGF0dGVybkNTKCkgeworICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IG1fcENvdW50ZWRCYXNlQ1MgPyBtX3BDb3VudGVkQmFzZUNTLT5nZXQoKSA6IG51bGxwdHI7CisgIGlmIChwQ1MgJiYgbV9wRG9jdW1lbnQpIHsKKyAgICBhdXRvKiBwUGFnZURhdGEgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKTsKKyAgICBpZiAocFBhZ2VEYXRhKQorICAgICAgcFBhZ2VEYXRhLT5SZWxlYXNlQ29sb3JTcGFjZShwQ1MtPkdldEFycmF5KCkpOworICB9Cit9CisKK3ZvaWQgQ1BERl9QYXR0ZXJuQ1M6OkluaXRpYWxpemVTdG9ja1BhdHRlcm4oKSB7CisgIFNldENvbXBvbmVudHNGb3JTdG9ja0NTKDEpOworfQorCit1aW50MzJfdCBDUERGX1BhdHRlcm5DUzo6dl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8Q1BERl9PYmplY3QqPiogcFZpc2l0ZWQpIHsKKyAgQ1BERl9PYmplY3QqIHBCYXNlQ1MgPSBwQXJyYXktPkdldERpcmVjdE9iamVjdEF0KDEpOworICBpZiAocEJhc2VDUyA9PSBtX3BBcnJheSkKKyAgICByZXR1cm4gMDsKKworICBDUERGX0RvY1BhZ2VEYXRhKiBwRG9jUGFnZURhdGEgPSBwRG9jLT5HZXRQYWdlRGF0YSgpOworICBtX3BCYXNlQ1MgPSBwRG9jUGFnZURhdGEtPkdldENvbG9yU3BhY2VHdWFyZGVkKHBCYXNlQ1MsIG51bGxwdHIsIHBWaXNpdGVkKTsKKyAgaWYgKCFtX3BCYXNlQ1MpCisgICAgcmV0dXJuIDE7CisKKyAgaWYgKG1fcEJhc2VDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfUEFUVEVSTikKKyAgICByZXR1cm4gMDsKKworICBtX3BDb3VudGVkQmFzZUNTID0gcERvY1BhZ2VEYXRhLT5GaW5kQ29sb3JTcGFjZVB0cihtX3BCYXNlQ1MtPkdldEFycmF5KCkpOworICBpZiAobV9wQmFzZUNTLT5Db3VudENvbXBvbmVudHMoKSA+IGtNYXhQYXR0ZXJuQ29sb3JDb21wcykKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gbV9wQmFzZUNTLT5Db3VudENvbXBvbmVudHMoKSArIDE7Cit9CisKK2Jvb2wgQ1BERl9QYXR0ZXJuQ1M6OkdldFJHQihmbG9hdCogcEJ1ZiwgZmxvYXQqIFIsIGZsb2F0KiBHLCBmbG9hdCogQikgY29uc3QgeworICBpZiAobV9wQmFzZUNTKSB7CisgICAgQVNTRVJUKG1fcEJhc2VDUy0+R2V0RmFtaWx5KCkgIT0gUERGQ1NfUEFUVEVSTik7CisgICAgUGF0dGVyblZhbHVlKiBwdmFsdWUgPSByZWludGVycHJldF9jYXN0PFBhdHRlcm5WYWx1ZSo+KHBCdWYpOworICAgIGlmIChtX3BCYXNlQ1MtPkdldFJHQihwdmFsdWUtPm1fQ29tcHMsIFIsIEcsIEIpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgKlIgPSAwLjc1ZjsKKyAgKkcgPSAwLjc1ZjsKKyAgKkIgPSAwLjc1ZjsKKyAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYXR0ZXJuY3MuaCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0dGVybmNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFkMGQ0OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0dGVybmNzLmgKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlBERkFQSV9QQUdFX0NQREZfUEFUVEVSTkNTX0hfCisjZGVmaW5lIENPUkVfRlBERkFQSV9QQUdFX0NQREZfUEFUVEVSTkNTX0hfCisKKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbG9yc3BhY2UuaCIKKworY2xhc3MgQ1BERl9Eb2N1bWVudDsKKworY2xhc3MgQ1BERl9QYXR0ZXJuQ1MgOiBwdWJsaWMgQ1BERl9Db2xvclNwYWNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENQREZfUGF0dGVybkNTKENQREZfRG9jdW1lbnQqIHBEb2MpOworICB+Q1BERl9QYXR0ZXJuQ1MoKSBvdmVycmlkZTsKKworICAvLyBDYWxsZWQgZm9yIHRoZSBzdG9jayBwYXR0ZXJuLCBzaW5jZSBpdCBpcyBpbml0aWFsaXplZCB2aWEgTG9hZCgpLgorICB2b2lkIEluaXRpYWxpemVTdG9ja1BhdHRlcm4oKTsKKworICAvLyBDUERGX0NvbG9yU3BhY2U6CisgIHVpbnQzMl90IHZfTG9hZChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcEFycmF5LAorICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8Q1BERl9PYmplY3QqPiogcFZpc2l0ZWQpIG92ZXJyaWRlOworICBib29sIEdldFJHQihmbG9hdCogcEJ1ZiwgZmxvYXQqIFIsIGZsb2F0KiBHLCBmbG9hdCogQikgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBDUERGX0NvbG9yU3BhY2UqIG1fcEJhc2VDUzsKKyAgQ1BERl9Db3VudGVkQ29sb3JTcGFjZSogbV9wQ291bnRlZEJhc2VDUzsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GUERGQVBJX1BBR0VfQ1BERl9QQVRURVJOQ1NfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcHNlbmdpbmUuY3BwIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wc2VuZ2luZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NlM2E2MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcHNlbmdpbmUuY3BwCkBAIC0wLDAgKzEsNDMyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BzZW5naW5lLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zaW1wbGVfcGFyc2VyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBQREZfUFNPcE5hbWUgeworICBjb25zdCBjaGFyKiBuYW1lOworICBQREZfUFNPUCBvcDsKK307CisKK2NvbnN0ZXhwciBQREZfUFNPcE5hbWUga1BzT3BOYW1lc1tdID0geworICAgIHsiYWJzIiwgUFNPUF9BQlN9LAorICAgIHsiYWRkIiwgUFNPUF9BRER9LAorICAgIHsiYW5kIiwgUFNPUF9BTkR9LAorICAgIHsiYXRhbiIsIFBTT1BfQVRBTn0sCisgICAgeyJiaXRzaGlmdCIsIFBTT1BfQklUU0hJRlR9LAorICAgIHsiY2VpbGluZyIsIFBTT1BfQ0VJTElOR30sCisgICAgeyJjb3B5IiwgUFNPUF9DT1BZfSwKKyAgICB7ImNvcyIsIFBTT1BfQ09TfSwKKyAgICB7ImN2aSIsIFBTT1BfQ1ZJfSwKKyAgICB7ImN2ciIsIFBTT1BfQ1ZSfSwKKyAgICB7ImRpdiIsIFBTT1BfRElWfSwKKyAgICB7ImR1cCIsIFBTT1BfRFVQfSwKKyAgICB7ImVxIiwgUFNPUF9FUX0sCisgICAgeyJleGNoIiwgUFNPUF9FWENIfSwKKyAgICB7ImV4cCIsIFBTT1BfRVhQfSwKKyAgICB7ImZhbHNlIiwgUFNPUF9GQUxTRX0sCisgICAgeyJmbG9vciIsIFBTT1BfRkxPT1J9LAorICAgIHsiZ2UiLCBQU09QX0dFfSwKKyAgICB7Imd0IiwgUFNPUF9HVH0sCisgICAgeyJpZGl2IiwgUFNPUF9JRElWfSwKKyAgICB7ImlmIiwgUFNPUF9JRn0sCisgICAgeyJpZmVsc2UiLCBQU09QX0lGRUxTRX0sCisgICAgeyJpbmRleCIsIFBTT1BfSU5ERVh9LAorICAgIHsibGUiLCBQU09QX0xFfSwKKyAgICB7ImxuIiwgUFNPUF9MTn0sCisgICAgeyJsb2ciLCBQU09QX0xPR30sCisgICAgeyJsdCIsIFBTT1BfTFR9LAorICAgIHsibW9kIiwgUFNPUF9NT0R9LAorICAgIHsibXVsIiwgUFNPUF9NVUx9LAorICAgIHsibmUiLCBQU09QX05FfSwKKyAgICB7Im5lZyIsIFBTT1BfTkVHfSwKKyAgICB7Im5vdCIsIFBTT1BfTk9UfSwKKyAgICB7Im9yIiwgUFNPUF9PUn0sCisgICAgeyJwb3AiLCBQU09QX1BPUH0sCisgICAgeyJyb2xsIiwgUFNPUF9ST0xMfSwKKyAgICB7InJvdW5kIiwgUFNPUF9ST1VORH0sCisgICAgeyJzaW4iLCBQU09QX1NJTn0sCisgICAgeyJzcXJ0IiwgUFNPUF9TUVJUfSwKKyAgICB7InN1YiIsIFBTT1BfU1VCfSwKKyAgICB7InRydWUiLCBQU09QX1RSVUV9LAorICAgIHsidHJ1bmNhdGUiLCBQU09QX1RSVU5DQVRFfSwKKyAgICB7InhvciIsIFBTT1BfWE9SfSwKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitDUERGX1BTT1A6OkNQREZfUFNPUCgpCisgICAgOiBtX29wKFBTT1BfUFJPQyksIG1fdmFsdWUoMCksIG1fcHJvYyhwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9QU1Byb2M+KCkpIHt9CisKK0NQREZfUFNPUDo6Q1BERl9QU09QKFBERl9QU09QIG9wKSA6IG1fb3Aob3ApLCBtX3ZhbHVlKDApIHsKKyAgQVNTRVJUKG1fb3AgIT0gUFNPUF9DT05TVCk7CisgIEFTU0VSVChtX29wICE9IFBTT1BfUFJPQyk7Cit9CisKK0NQREZfUFNPUDo6Q1BERl9QU09QKGZsb2F0IHZhbHVlKSA6IG1fb3AoUFNPUF9DT05TVCksIG1fdmFsdWUodmFsdWUpIHt9CisKK0NQREZfUFNPUDo6fkNQREZfUFNPUCgpIHt9CisKK2Zsb2F0IENQREZfUFNPUDo6R2V0RmxvYXRWYWx1ZSgpIGNvbnN0IHsKKyAgaWYgKG1fb3AgPT0gUFNPUF9DT05TVCkKKyAgICByZXR1cm4gbV92YWx1ZTsKKworICBOT1RSRUFDSEVEKCk7CisgIHJldHVybiAwOworfQorCitDUERGX1BTUHJvYyogQ1BERl9QU09QOjpHZXRQcm9jKCkgY29uc3QgeworICBpZiAobV9vcCA9PSBQU09QX1BST0MpCisgICAgcmV0dXJuIG1fcHJvYy5nZXQoKTsKKyAgTk9UUkVBQ0hFRCgpOworICByZXR1cm4gbnVsbHB0cjsKK30KKworYm9vbCBDUERGX1BTRW5naW5lOjpFeGVjdXRlKCkgeworICByZXR1cm4gbV9NYWluUHJvYy5FeGVjdXRlKHRoaXMpOworfQorCitDUERGX1BTUHJvYzo6Q1BERl9QU1Byb2MoKSB7fQorQ1BERl9QU1Byb2M6On5DUERGX1BTUHJvYygpIHt9CisKK2Jvb2wgQ1BERl9QU1Byb2M6OlBhcnNlKENQREZfU2ltcGxlUGFyc2VyKiBwYXJzZXIsIGludCBkZXB0aCkgeworICBpZiAoZGVwdGggPiBrTWF4RGVwdGgpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHdoaWxlICgxKSB7CisgICAgQnl0ZVN0cmluZ1ZpZXcgd29yZCA9IHBhcnNlci0+R2V0V29yZCgpOworICAgIGlmICh3b3JkLklzRW1wdHkoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICh3b3JkID09ICJ9IikKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKHdvcmQgPT0gInsiKSB7CisgICAgICBtX09wZXJhdG9ycy5wdXNoX2JhY2socGRmaXVtOjpNYWtlVW5pcXVlPENQREZfUFNPUD4oKSk7CisgICAgICBpZiAoIW1fT3BlcmF0b3JzLmJhY2soKS0+R2V0UHJvYygpLT5QYXJzZShwYXJzZXIsIGRlcHRoICsgMSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIEFkZE9wZXJhdG9yKHdvcmQpOworICB9Cit9CisKK2Jvb2wgQ1BERl9QU1Byb2M6OkV4ZWN1dGUoQ1BERl9QU0VuZ2luZSogcEVuZ2luZSkgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fT3BlcmF0b3JzLnNpemUoKTsgKytpKSB7CisgICAgY29uc3QgUERGX1BTT1Agb3AgPSBtX09wZXJhdG9yc1tpXS0+R2V0T3AoKTsKKyAgICBpZiAob3AgPT0gUFNPUF9QUk9DKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAob3AgPT0gUFNPUF9DT05TVCkgeworICAgICAgcEVuZ2luZS0+UHVzaChtX09wZXJhdG9yc1tpXS0+R2V0RmxvYXRWYWx1ZSgpKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChvcCA9PSBQU09QX0lGKSB7CisgICAgICBpZiAoaSA9PSAwIHx8IG1fT3BlcmF0b3JzW2kgLSAxXS0+R2V0T3AoKSAhPSBQU09QX1BST0MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgaWYgKHBFbmdpbmUtPlBvcEludCgpKQorICAgICAgICBtX09wZXJhdG9yc1tpIC0gMV0tPkdldFByb2MoKS0+RXhlY3V0ZShwRW5naW5lKTsKKyAgICB9IGVsc2UgaWYgKG9wID09IFBTT1BfSUZFTFNFKSB7CisgICAgICBpZiAoaSA8IDIgfHwgbV9PcGVyYXRvcnNbaSAtIDFdLT5HZXRPcCgpICE9IFBTT1BfUFJPQyB8fAorICAgICAgICAgIG1fT3BlcmF0b3JzW2kgLSAyXS0+R2V0T3AoKSAhPSBQU09QX1BST0MpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgc2l6ZV90IG9mZnNldCA9IHBFbmdpbmUtPlBvcEludCgpID8gMiA6IDE7CisgICAgICBtX09wZXJhdG9yc1tpIC0gb2Zmc2V0XS0+R2V0UHJvYygpLT5FeGVjdXRlKHBFbmdpbmUpOworICAgIH0gZWxzZSB7CisgICAgICBwRW5naW5lLT5Eb09wZXJhdG9yKG9wKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ1BERl9QU1Byb2M6OkFkZE9wZXJhdG9yRm9yVGVzdGluZyhjb25zdCBCeXRlU3RyaW5nVmlldyYgd29yZCkgeworICBBZGRPcGVyYXRvcih3b3JkKTsKK30KKwordm9pZCBDUERGX1BTUHJvYzo6QWRkT3BlcmF0b3IoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHdvcmQpIHsKKyAgY29uc3QgYXV0byogcEZvdW5kID0gc3RkOjpsb3dlcl9ib3VuZCgKKyAgICAgIHN0ZDo6YmVnaW4oa1BzT3BOYW1lcyksIHN0ZDo6ZW5kKGtQc09wTmFtZXMpLCB3b3JkLAorICAgICAgW10oY29uc3QgUERGX1BTT3BOYW1lJiBuYW1lLCBjb25zdCBCeXRlU3RyaW5nVmlldyYgd29yZCkgeworICAgICAgICByZXR1cm4gbmFtZS5uYW1lIDwgd29yZDsKKyAgICAgIH0pOworICBpZiAocEZvdW5kICE9IHN0ZDo6ZW5kKGtQc09wTmFtZXMpICYmIHBGb3VuZC0+bmFtZSA9PSB3b3JkKQorICAgIG1fT3BlcmF0b3JzLnB1c2hfYmFjayhwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9QU09QPihwRm91bmQtPm9wKSk7CisgIGVsc2UKKyAgICBtX09wZXJhdG9ycy5wdXNoX2JhY2socGRmaXVtOjpNYWtlVW5pcXVlPENQREZfUFNPUD4oRlhfYXRvZih3b3JkKSkpOworfQorCitDUERGX1BTRW5naW5lOjpDUERGX1BTRW5naW5lKCkgOiBtX1N0YWNrQ291bnQoMCkge30KKworQ1BERl9QU0VuZ2luZTo6fkNQREZfUFNFbmdpbmUoKSB7fQorCit2b2lkIENQREZfUFNFbmdpbmU6OlB1c2goZmxvYXQgdikgeworICBpZiAobV9TdGFja0NvdW50IDwga1BTRW5naW5lU3RhY2tTaXplKQorICAgIG1fU3RhY2tbbV9TdGFja0NvdW50KytdID0gdjsKK30KKworZmxvYXQgQ1BERl9QU0VuZ2luZTo6UG9wKCkgeworICByZXR1cm4gbV9TdGFja0NvdW50ID4gMCA/IG1fU3RhY2tbLS1tX1N0YWNrQ291bnRdIDogMDsKK30KKworaW50IENQREZfUFNFbmdpbmU6OlBvcEludCgpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oUG9wKCkpOworfQorCitib29sIENQREZfUFNFbmdpbmU6OlBhcnNlKGNvbnN0IGNoYXIqIHN0ciwgaW50IHNpemUpIHsKKyAgQ1BERl9TaW1wbGVQYXJzZXIgcGFyc2VyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHN0ciksIHNpemUpOworICBCeXRlU3RyaW5nVmlldyB3b3JkID0gcGFyc2VyLkdldFdvcmQoKTsKKyAgcmV0dXJuIHdvcmQgPT0gInsiID8gbV9NYWluUHJvYy5QYXJzZSgmcGFyc2VyLCAwKSA6IGZhbHNlOworfQorCitib29sIENQREZfUFNFbmdpbmU6OkRvT3BlcmF0b3IoUERGX1BTT1Agb3ApIHsKKyAgaW50IGkxOworICBpbnQgaTI7CisgIGZsb2F0IGQxOworICBmbG9hdCBkMjsKKyAgRlhfU0FGRV9JTlQzMiByZXN1bHQ7CisgIHN3aXRjaCAob3ApIHsKKyAgICBjYXNlIFBTT1BfQUREOgorICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIGQyID0gUG9wKCk7CisgICAgICBQdXNoKGQxICsgZDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX1NVQjoKKyAgICAgIGQyID0gUG9wKCk7CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaChkMSAtIGQyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9NVUw6CisgICAgICBkMSA9IFBvcCgpOworICAgICAgZDIgPSBQb3AoKTsKKyAgICAgIFB1c2goZDEgKiBkMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfRElWOgorICAgICAgZDIgPSBQb3AoKTsKKyAgICAgIGQxID0gUG9wKCk7CisgICAgICBQdXNoKGQxIC8gZDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX0lESVY6CisgICAgICBpMiA9IFBvcEludCgpOworICAgICAgaTEgPSBQb3BJbnQoKTsKKyAgICAgIGlmIChpMikgeworICAgICAgICByZXN1bHQgPSBpMTsKKyAgICAgICAgcmVzdWx0IC89IGkyOworICAgICAgICBQdXNoKHJlc3VsdC5WYWx1ZU9yRGVmYXVsdCgwKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBQdXNoKDApOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX01PRDoKKyAgICAgIGkyID0gUG9wSW50KCk7CisgICAgICBpMSA9IFBvcEludCgpOworICAgICAgaWYgKGkyKSB7CisgICAgICAgIHJlc3VsdCA9IGkxOworICAgICAgICByZXN1bHQgJT0gaTI7CisgICAgICAgIFB1c2gocmVzdWx0LlZhbHVlT3JEZWZhdWx0KDApKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFB1c2goMCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfTkVHOgorICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIFB1c2goLWQxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9BQlM6CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaChmYWJzKGQxKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfQ0VJTElORzoKKyAgICAgIGQxID0gUG9wKCk7CisgICAgICBQdXNoKGNlaWwoZDEpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9GTE9PUjoKKyAgICAgIGQxID0gUG9wKCk7CisgICAgICBQdXNoKGZsb29yKGQxKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfUk9VTkQ6CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaChGWFNZU19yb3VuZChkMSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX1RSVU5DQVRFOgorICAgICAgaTEgPSBQb3BJbnQoKTsKKyAgICAgIFB1c2goaTEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX1NRUlQ6CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaChzcXJ0KGQxKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfU0lOOgorICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIFB1c2goc2luKGQxICogRlhfUEkgLyAxODAuMGYpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9DT1M6CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaChjb3MoZDEgKiBGWF9QSSAvIDE4MC4wZikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX0FUQU46CisgICAgICBkMiA9IFBvcCgpOworICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIGQxID0gYXRhbjIoZDEsIGQyKSAqIDE4MC4wIC8gRlhfUEk7CisgICAgICBpZiAoZDEgPCAwKSB7CisgICAgICAgIGQxICs9IDM2MDsKKyAgICAgIH0KKyAgICAgIFB1c2goZDEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX0VYUDoKKyAgICAgIGQyID0gUG9wKCk7CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaChGWFNZU19wb3coZDEsIGQyKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfTE46CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaChsb2coZDEpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9MT0c6CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaChsb2cxMChkMSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX0NWSToKKyAgICAgIGkxID0gUG9wSW50KCk7CisgICAgICBQdXNoKGkxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9DVlI6CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfRVE6CisgICAgICBkMiA9IFBvcCgpOworICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIFB1c2goZDEgPT0gZDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX05FOgorICAgICAgZDIgPSBQb3AoKTsKKyAgICAgIGQxID0gUG9wKCk7CisgICAgICBQdXNoKGQxICE9IGQyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9HVDoKKyAgICAgIGQyID0gUG9wKCk7CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaChkMSA+IGQyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9HRToKKyAgICAgIGQyID0gUG9wKCk7CisgICAgICBkMSA9IFBvcCgpOworICAgICAgUHVzaChkMSA+PSBkMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfTFQ6CisgICAgICBkMiA9IFBvcCgpOworICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIFB1c2goZDEgPCBkMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfTEU6CisgICAgICBkMiA9IFBvcCgpOworICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIFB1c2goZDEgPD0gZDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX0FORDoKKyAgICAgIGkxID0gUG9wSW50KCk7CisgICAgICBpMiA9IFBvcEludCgpOworICAgICAgUHVzaChpMSAmIGkyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9PUjoKKyAgICAgIGkxID0gUG9wSW50KCk7CisgICAgICBpMiA9IFBvcEludCgpOworICAgICAgUHVzaChpMSB8IGkyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9YT1I6CisgICAgICBpMSA9IFBvcEludCgpOworICAgICAgaTIgPSBQb3BJbnQoKTsKKyAgICAgIFB1c2goaTEgXiBpMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfTk9UOgorICAgICAgaTEgPSBQb3BJbnQoKTsKKyAgICAgIFB1c2goIWkxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgUFNPUF9CSVRTSElGVDogeworICAgICAgaW50IHNoaWZ0ID0gUG9wSW50KCk7CisgICAgICByZXN1bHQgPSBQb3BJbnQoKTsKKyAgICAgIGlmIChzaGlmdCA+IDApIHsKKyAgICAgICAgcmVzdWx0IDw8PSBzaGlmdDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEF2b2lkcyB1bnNhZmUgbmVnYXRpb24gb2YgSU5UX01JTi4KKyAgICAgICAgRlhfU0FGRV9JTlQzMiBzYWZlX3NoaWZ0ID0gc2hpZnQ7CisgICAgICAgIHJlc3VsdCA+Pj0gKC1zYWZlX3NoaWZ0KS5WYWx1ZU9yRGVmYXVsdCgwKTsKKyAgICAgIH0KKyAgICAgIFB1c2gocmVzdWx0LlZhbHVlT3JEZWZhdWx0KDApKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBTT1BfVFJVRToKKyAgICAgIFB1c2goMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfRkFMU0U6CisgICAgICBQdXNoKDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX1BPUDoKKyAgICAgIFBvcCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBQU09QX0VYQ0g6CisgICAgICBkMiA9IFBvcCgpOworICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIFB1c2goZDIpOworICAgICAgUHVzaChkMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfRFVQOgorICAgICAgZDEgPSBQb3AoKTsKKyAgICAgIFB1c2goZDEpOworICAgICAgUHVzaChkMSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBTT1BfQ09QWTogeworICAgICAgaW50IG4gPSBQb3BJbnQoKTsKKyAgICAgIGlmIChuIDwgMCB8fCBtX1N0YWNrQ291bnQgKyBuID4ga1BTRW5naW5lU3RhY2tTaXplIHx8CisgICAgICAgICAgbiA+IHN0YXRpY19jYXN0PGludD4obV9TdGFja0NvdW50KSkKKyAgICAgICAgYnJlYWs7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgbV9TdGFja1ttX1N0YWNrQ291bnQgKyBpXSA9IG1fU3RhY2tbbV9TdGFja0NvdW50ICsgaSAtIG5dOworICAgICAgbV9TdGFja0NvdW50ICs9IG47CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQU09QX0lOREVYOiB7CisgICAgICBpbnQgbiA9IFBvcEludCgpOworICAgICAgaWYgKG4gPCAwIHx8IG4gPj0gc3RhdGljX2Nhc3Q8aW50PihtX1N0YWNrQ291bnQpKQorICAgICAgICBicmVhazsKKyAgICAgIFB1c2gobV9TdGFja1ttX1N0YWNrQ291bnQgLSBuIC0gMV0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFNPUF9ST0xMOiB7CisgICAgICBpbnQgaiA9IFBvcEludCgpOworICAgICAgaW50IG4gPSBQb3BJbnQoKTsKKyAgICAgIGlmIChqID09IDAgfHwgbiA9PSAwIHx8IG1fU3RhY2tDb3VudCA9PSAwKQorICAgICAgICBicmVhazsKKyAgICAgIGlmIChuIDwgMCB8fCBuID4gc3RhdGljX2Nhc3Q8aW50PihtX1N0YWNrQ291bnQpKQorICAgICAgICBicmVhazsKKworICAgICAgaiAlPSBuOworICAgICAgaWYgKGogPiAwKQorICAgICAgICBqIC09IG47CisgICAgICBhdXRvKiBiZWdpbl9pdCA9IHN0ZDo6YmVnaW4obV9TdGFjaykgKyBtX1N0YWNrQ291bnQgLSBuOworICAgICAgYXV0byogbWlkZGxlX2l0ID0gYmVnaW5faXQgLSBqOworICAgICAgYXV0byogZW5kX2l0ID0gc3RkOjpiZWdpbihtX1N0YWNrKSArIG1fU3RhY2tDb3VudDsKKyAgICAgIHN0ZDo6cm90YXRlKGJlZ2luX2l0LCBtaWRkbGVfaXQsIGVuZF9pdCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wc2VuZ2luZS5oIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wc2VuZ2luZS5oCmluZGV4IDY1OWNhODIuLjYzZDkxZDAgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcHNlbmdpbmUuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BzZW5naW5lLmgKQEAgLTEwLDEzICsxMCwxNCBAQAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCiAKIGNsYXNzIENQREZfUFNFbmdpbmU7Ci1jbGFzcyBDUERGX1BTT1A7CitjbGFzcyBDUERGX1BTUHJvYzsKIGNsYXNzIENQREZfU2ltcGxlUGFyc2VyOwogCi1lbnVtIFBERl9QU09QIHsKK2VudW0gUERGX1BTT1AgOiB1aW50OF90IHsKICAgUFNPUF9BREQsCiAgIFBTT1BfU1VCLAogICBQU09QX01VTCwKQEAgLTYzLDcgKzY0LDIyIEBACiAgIFBTT1BfQ09OU1QKIH07CiAKLWNvbnN0ZXhwciB1aW50MzJfdCBQU0VOR0lORV9TVEFDS1NJWkUgPSAxMDA7CitjbGFzcyBDUERGX1BTT1AgeworIHB1YmxpYzoKKyAgQ1BERl9QU09QKCk7CisgIGV4cGxpY2l0IENQREZfUFNPUChQREZfUFNPUCBvcCk7CisgIGV4cGxpY2l0IENQREZfUFNPUChmbG9hdCB2YWx1ZSk7CisgIH5DUERGX1BTT1AoKTsKKworICBmbG9hdCBHZXRGbG9hdFZhbHVlKCkgY29uc3Q7CisgIENQREZfUFNQcm9jKiBHZXRQcm9jKCkgY29uc3Q7CisgIFBERl9QU09QIEdldE9wKCkgY29uc3QgeyByZXR1cm4gbV9vcDsgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgUERGX1BTT1AgbV9vcDsKKyAgY29uc3QgZmxvYXQgbV92YWx1ZTsKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfUFNQcm9jPiBtX3Byb2M7Cit9OwogCiBjbGFzcyBDUERGX1BTUHJvYyB7CiAgcHVibGljOgpAQCAtNzMsOCArODksMTggQEAKICAgYm9vbCBQYXJzZShDUERGX1NpbXBsZVBhcnNlciogcGFyc2VyLCBpbnQgZGVwdGgpOwogICBib29sIEV4ZWN1dGUoQ1BERl9QU0VuZ2luZSogcEVuZ2luZSk7CiAKKyAgLy8gVGhlc2UgbWV0aG9kcyBhcmUgZXhwb3NlZCBmb3IgdGVzdGluZy4KKyAgdm9pZCBBZGRPcGVyYXRvckZvclRlc3RpbmcoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHdvcmQpOworICBzaXplX3QgbnVtX29wZXJhdG9ycygpIGNvbnN0IHsgcmV0dXJuIG1fT3BlcmF0b3JzLnNpemUoKTsgfQorICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9QU09QPiYgbGFzdF9vcGVyYXRvcigpIHsKKyAgICByZXR1cm4gbV9PcGVyYXRvcnMuYmFjaygpOworICB9CisKICBwcml2YXRlOgogICBzdGF0aWMgY29uc3QgaW50IGtNYXhEZXB0aCA9IDEyODsKKworICB2b2lkIEFkZE9wZXJhdG9yKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiB3b3JkKTsKKwogICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9QU09QPj4gbV9PcGVyYXRvcnM7CiB9OwogCkBAIC04MywxNiArMTA5LDE4IEBACiAgIENQREZfUFNFbmdpbmUoKTsKICAgfkNQREZfUFNFbmdpbmUoKTsKIAotICBib29sIFBhcnNlKGNvbnN0IEZYX0NIQVIqIHN0ciwgaW50IHNpemUpOworICBib29sIFBhcnNlKGNvbnN0IGNoYXIqIHN0ciwgaW50IHNpemUpOwogICBib29sIEV4ZWN1dGUoKTsKICAgYm9vbCBEb09wZXJhdG9yKFBERl9QU09QIG9wKTsKICAgdm9pZCBSZXNldCgpIHsgbV9TdGFja0NvdW50ID0gMDsgfQotICB2b2lkIFB1c2goRlhfRkxPQVQgdmFsdWUpOwotICBGWF9GTE9BVCBQb3AoKTsKKyAgdm9pZCBQdXNoKGZsb2F0IHZhbHVlKTsKKyAgZmxvYXQgUG9wKCk7CisgIGludCBQb3BJbnQoKTsKICAgdWludDMyX3QgR2V0U3RhY2tTaXplKCkgY29uc3QgeyByZXR1cm4gbV9TdGFja0NvdW50OyB9CiAKICBwcml2YXRlOgotICBGWF9GTE9BVCBtX1N0YWNrW1BTRU5HSU5FX1NUQUNLU0laRV07CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga1BTRW5naW5lU3RhY2tTaXplID0gMTAwOworICBmbG9hdCBtX1N0YWNrW2tQU0VuZ2luZVN0YWNrU2l6ZV07CiAgIHVpbnQzMl90IG1fU3RhY2tDb3VudDsKICAgQ1BERl9QU1Byb2MgbV9NYWluUHJvYzsKIH07CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BzZW5naW5lX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcHNlbmdpbmVfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NjZjM2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BzZW5naW5lX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDU2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BzZW5naW5lLmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK1RFU1QoQ1BERl9QU1Byb2MsIEFkZE9wZXJhdG9yKSB7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgUERGX1BTT1Agb3A7CisgIH0ga1Rlc3REYXRhW10gPSB7CisgICAgICB7ImFkZCIsIFBTT1BfQUREfSwgICAgICAgICB7InN1YiIsIFBTT1BfU1VCfSwKKyAgICAgIHsibXVsIiwgUFNPUF9NVUx9LCAgICAgICAgIHsiZGl2IiwgUFNPUF9ESVZ9LAorICAgICAgeyJpZGl2IiwgUFNPUF9JRElWfSwgICAgICAgeyJtb2QiLCBQU09QX01PRH0sCisgICAgICB7Im5lZyIsIFBTT1BfTkVHfSwgICAgICAgICB7ImFicyIsIFBTT1BfQUJTfSwKKyAgICAgIHsiY2VpbGluZyIsIFBTT1BfQ0VJTElOR30sIHsiZmxvb3IiLCBQU09QX0ZMT09SfSwKKyAgICAgIHsicm91bmQiLCBQU09QX1JPVU5EfSwgICAgIHsidHJ1bmNhdGUiLCBQU09QX1RSVU5DQVRFfSwKKyAgICAgIHsic3FydCIsIFBTT1BfU1FSVH0sICAgICAgIHsic2luIiwgUFNPUF9TSU59LAorICAgICAgeyJjb3MiLCBQU09QX0NPU30sICAgICAgICAgeyJhdGFuIiwgUFNPUF9BVEFOfSwKKyAgICAgIHsiZXhwIiwgUFNPUF9FWFB9LCAgICAgICAgIHsibG4iLCBQU09QX0xOfSwKKyAgICAgIHsibG9nIiwgUFNPUF9MT0d9LCAgICAgICAgIHsiY3ZpIiwgUFNPUF9DVkl9LAorICAgICAgeyJjdnIiLCBQU09QX0NWUn0sICAgICAgICAgeyJlcSIsIFBTT1BfRVF9LAorICAgICAgeyJuZSIsIFBTT1BfTkV9LCAgICAgICAgICAgeyJndCIsIFBTT1BfR1R9LAorICAgICAgeyJnZSIsIFBTT1BfR0V9LCAgICAgICAgICAgeyJsdCIsIFBTT1BfTFR9LAorICAgICAgeyJsZSIsIFBTT1BfTEV9LCAgICAgICAgICAgeyJhbmQiLCBQU09QX0FORH0sCisgICAgICB7Im9yIiwgUFNPUF9PUn0sICAgICAgICAgICB7InhvciIsIFBTT1BfWE9SfSwKKyAgICAgIHsibm90IiwgUFNPUF9OT1R9LCAgICAgICAgIHsiYml0c2hpZnQiLCBQU09QX0JJVFNISUZUfSwKKyAgICAgIHsidHJ1ZSIsIFBTT1BfVFJVRX0sICAgICAgIHsiZmFsc2UiLCBQU09QX0ZBTFNFfSwKKyAgICAgIHsiaWYiLCBQU09QX0lGfSwgICAgICAgICAgIHsiaWZlbHNlIiwgUFNPUF9JRkVMU0V9LAorICAgICAgeyJwb3AiLCBQU09QX1BPUH0sICAgICAgICAgeyJleGNoIiwgUFNPUF9FWENIfSwKKyAgICAgIHsiZHVwIiwgUFNPUF9EVVB9LCAgICAgICAgIHsiY29weSIsIFBTT1BfQ09QWX0sCisgICAgICB7ImluZGV4IiwgUFNPUF9JTkRFWH0sICAgICB7InJvbGwiLCBQU09QX1JPTEx9LAorICAgICAgeyI1NSIsIFBTT1BfQ09OU1R9LCAgICAgICAgeyIxMjMuNCIsIFBTT1BfQ09OU1R9LAorICAgICAgeyItNSIsIFBTT1BfQ09OU1R9LCAgICAgICAgeyJpbnZhbGlkIiwgUFNPUF9DT05TVH0sCisgIH07CisKKyAgQ1BERl9QU1Byb2MgcHJvYzsKKyAgRVhQRUNUX0VRKDBVLCBwcm9jLm51bV9vcGVyYXRvcnMoKSk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGtUZXN0RGF0YSk7ICsraSkgeworICAgIEJ5dGVTdHJpbmdWaWV3IHdvcmQoa1Rlc3REYXRhW2ldLm5hbWUpOworICAgIHByb2MuQWRkT3BlcmF0b3JGb3JUZXN0aW5nKHdvcmQpOworICAgIEFTU0VSVF9FUShpICsgMSwgcHJvYy5udW1fb3BlcmF0b3JzKCkpOworICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDUERGX1BTT1A+JiBuZXdfcHNvcCA9IHByb2MubGFzdF9vcGVyYXRvcigpOworICAgIEFTU0VSVF9UUlVFKG5ld19wc29wKTsKKyAgICBQREZfUFNPUCBuZXdfb3AgPSBuZXdfcHNvcC0+R2V0T3AoKTsKKyAgICBFWFBFQ1RfRVEoa1Rlc3REYXRhW2ldLm9wLCBuZXdfb3ApOworICAgIGlmIChuZXdfb3AgPT0gUFNPUF9DT05TVCkgeworICAgICAgZmxvYXQgZnYgPSBuZXdfcHNvcC0+R2V0RmxvYXRWYWx1ZSgpOworICAgICAgaWYgKHdvcmQgPT0gImludmFsaWQiKQorICAgICAgICBFWFBFQ1RfRkxPQVRfRVEoMCwgZnYpOworICAgICAgZWxzZQorICAgICAgICBFWFBFQ1RfRVEod29yZCwgQnl0ZVN0cmluZzo6Rm9ybWF0RmxvYXQoZnYpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcHNmdW5jLmNwcCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcHNmdW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjEwMWViCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wc2Z1bmMuY3BwCkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcHNmdW5jLmgiCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtX2FjYy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworQ1BERl9QU0Z1bmM6OkNQREZfUFNGdW5jKCkgOiBDUERGX0Z1bmN0aW9uKFR5cGU6OmtUeXBlNFBvc3RTY3JpcHQpIHt9CisKK0NQREZfUFNGdW5jOjp+Q1BERl9QU0Z1bmMoKSB7fQorCitib29sIENQREZfUFNGdW5jOjp2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopIHsKKyAgYXV0byBwQWNjID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfU3RyZWFtQWNjPihwT2JqLT5Bc1N0cmVhbSgpKTsKKyAgcEFjYy0+TG9hZEFsbERhdGFGaWx0ZXJlZCgpOworICByZXR1cm4gbV9QUy5QYXJzZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwQWNjLT5HZXREYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICBwQWNjLT5HZXRTaXplKCkpOworfQorCitib29sIENQREZfUFNGdW5jOjp2X0NhbGwoZmxvYXQqIGlucHV0cywgZmxvYXQqIHJlc3VsdHMpIGNvbnN0IHsKKyAgQ1BERl9QU0VuZ2luZSYgUFMgPSBjb25zdF9jYXN0PENQREZfUFNFbmdpbmUmPihtX1BTKTsKKyAgUFMuUmVzZXQoKTsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fbklucHV0czsgaSsrKQorICAgIFBTLlB1c2goaW5wdXRzW2ldKTsKKyAgUFMuRXhlY3V0ZSgpOworICBpZiAoUFMuR2V0U3RhY2tTaXplKCkgPCBtX25PdXRwdXRzKQorICAgIHJldHVybiBmYWxzZTsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fbk91dHB1dHM7IGkrKykKKyAgICByZXN1bHRzW21fbk91dHB1dHMgLSBpIC0gMV0gPSBQUy5Qb3AoKTsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BzZnVuYy5oIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wc2Z1bmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGMxOGM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wc2Z1bmMuaApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GUERGQVBJX1BBR0VfQ1BERl9QU0ZVTkNfSF8KKyNkZWZpbmUgQ09SRV9GUERGQVBJX1BBR0VfQ1BERl9QU0ZVTkNfSF8KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BzZW5naW5lLmgiCisKK2NsYXNzIENQREZfT2JqZWN0OworCitjbGFzcyBDUERGX1BTRnVuYyA6IHB1YmxpYyBDUERGX0Z1bmN0aW9uIHsKKyBwdWJsaWM6CisgIENQREZfUFNGdW5jKCk7CisgIH5DUERGX1BTRnVuYygpIG92ZXJyaWRlOworCisgIC8vIENQREZfRnVuY3Rpb24KKyAgYm9vbCB2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopIG92ZXJyaWRlOworICBib29sIHZfQ2FsbChmbG9hdCogaW5wdXRzLCBmbG9hdCogcmVzdWx0cykgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBDUERGX1BTRW5naW5lIG1fUFM7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9QQUdFX0NQREZfUFNGVU5DX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3NhbXBsZWRmdW5jLmNwcCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc2FtcGxlZGZ1bmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ZTFmZDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3NhbXBsZWRmdW5jLmNwcApAQCAtMCwwICsxLDE1OCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zYW1wbGVkZnVuYy5oIgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfZml4ZWRidWZncm93LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9leHRlbnNpb24uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKKworbmFtZXNwYWNlIHsKKworLy8gU2VlIFBERiBSZWZlcmVuY2UgMS43LCBwYWdlIDE3MCwgdGFibGUgMy4zNi4KK2Jvb2wgSXNWYWxpZEJpdHNQZXJTYW1wbGUodWludDMyX3QgeCkgeworICBzd2l0Y2ggKHgpIHsKKyAgICBjYXNlIDE6CisgICAgY2FzZSAyOgorICAgIGNhc2UgNDoKKyAgICBjYXNlIDg6CisgICAgY2FzZSAxMjoKKyAgICBjYXNlIDE2OgorICAgIGNhc2UgMjQ6CisgICAgY2FzZSAzMjoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0NQREZfU2FtcGxlZEZ1bmM6OkNQREZfU2FtcGxlZEZ1bmMoKSA6IENQREZfRnVuY3Rpb24oVHlwZTo6a1R5cGUwU2FtcGxlZCkge30KKworQ1BERl9TYW1wbGVkRnVuYzo6fkNQREZfU2FtcGxlZEZ1bmMoKSB7fQorCitib29sIENQREZfU2FtcGxlZEZ1bmM6OnZfSW5pdChDUERGX09iamVjdCogcE9iaikgeworICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBPYmotPkFzU3RyZWFtKCk7CisgIGlmICghcFN0cmVhbSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBTdHJlYW0tPkdldERpY3QoKTsKKyAgQ1BERl9BcnJheSogcFNpemUgPSBwRGljdC0+R2V0QXJyYXlGb3IoIlNpemUiKTsKKyAgQ1BERl9BcnJheSogcEVuY29kZSA9IHBEaWN0LT5HZXRBcnJheUZvcigiRW5jb2RlIik7CisgIENQREZfQXJyYXkqIHBEZWNvZGUgPSBwRGljdC0+R2V0QXJyYXlGb3IoIkRlY29kZSIpOworICBtX25CaXRzUGVyU2FtcGxlID0gcERpY3QtPkdldEludGVnZXJGb3IoIkJpdHNQZXJTYW1wbGUiKTsKKyAgaWYgKCFJc1ZhbGlkQml0c1BlclNhbXBsZShtX25CaXRzUGVyU2FtcGxlKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbV9TYW1wbGVNYXggPSAweGZmZmZmZmZmID4+ICgzMiAtIG1fbkJpdHNQZXJTYW1wbGUpOworICBtX3BTYW1wbGVTdHJlYW0gPSBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERl9TdHJlYW1BY2M+KHBTdHJlYW0pOworICBtX3BTYW1wbGVTdHJlYW0tPkxvYWRBbGxEYXRhRmlsdGVyZWQoKTsKKyAgRlhfU0FGRV9VSU5UMzIgblRvdGFsU2FtcGxlQml0cyA9IDE7CisgIG1fRW5jb2RlSW5mby5yZXNpemUobV9uSW5wdXRzKTsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fbklucHV0czsgaSsrKSB7CisgICAgbV9FbmNvZGVJbmZvW2ldLnNpemVzID0gcFNpemUgPyBwU2l6ZS0+R2V0SW50ZWdlckF0KGkpIDogMDsKKyAgICBpZiAoIXBTaXplICYmIGkgPT0gMCkKKyAgICAgIG1fRW5jb2RlSW5mb1tpXS5zaXplcyA9IHBEaWN0LT5HZXRJbnRlZ2VyRm9yKCJTaXplIik7CisgICAgblRvdGFsU2FtcGxlQml0cyAqPSBtX0VuY29kZUluZm9baV0uc2l6ZXM7CisgICAgaWYgKHBFbmNvZGUpIHsKKyAgICAgIG1fRW5jb2RlSW5mb1tpXS5lbmNvZGVfbWluID0gcEVuY29kZS0+R2V0RmxvYXRBdChpICogMik7CisgICAgICBtX0VuY29kZUluZm9baV0uZW5jb2RlX21heCA9IHBFbmNvZGUtPkdldEZsb2F0QXQoaSAqIDIgKyAxKTsKKyAgICB9IGVsc2UgeworICAgICAgbV9FbmNvZGVJbmZvW2ldLmVuY29kZV9taW4gPSAwOworICAgICAgbV9FbmNvZGVJbmZvW2ldLmVuY29kZV9tYXggPQorICAgICAgICAgIG1fRW5jb2RlSW5mb1tpXS5zaXplcyA9PSAxID8gMSA6IChmbG9hdCltX0VuY29kZUluZm9baV0uc2l6ZXMgLSAxOworICAgIH0KKyAgfQorICBuVG90YWxTYW1wbGVCaXRzICo9IG1fbkJpdHNQZXJTYW1wbGU7CisgIG5Ub3RhbFNhbXBsZUJpdHMgKj0gbV9uT3V0cHV0czsKKyAgRlhfU0FGRV9VSU5UMzIgblRvdGFsU2FtcGxlQnl0ZXMgPSBuVG90YWxTYW1wbGVCaXRzOworICBuVG90YWxTYW1wbGVCeXRlcyArPSA3OworICBuVG90YWxTYW1wbGVCeXRlcyAvPSA4OworICBpZiAoIW5Ub3RhbFNhbXBsZUJ5dGVzLklzVmFsaWQoKSB8fCBuVG90YWxTYW1wbGVCeXRlcy5WYWx1ZU9yRGllKCkgPT0gMCB8fAorICAgICAgblRvdGFsU2FtcGxlQnl0ZXMuVmFsdWVPckRpZSgpID4gbV9wU2FtcGxlU3RyZWFtLT5HZXRTaXplKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbV9EZWNvZGVJbmZvLnJlc2l6ZShtX25PdXRwdXRzKTsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fbk91dHB1dHM7IGkrKykgeworICAgIGlmIChwRGVjb2RlKSB7CisgICAgICBtX0RlY29kZUluZm9baV0uZGVjb2RlX21pbiA9IHBEZWNvZGUtPkdldEZsb2F0QXQoMiAqIGkpOworICAgICAgbV9EZWNvZGVJbmZvW2ldLmRlY29kZV9tYXggPSBwRGVjb2RlLT5HZXRGbG9hdEF0KDIgKiBpICsgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fRGVjb2RlSW5mb1tpXS5kZWNvZGVfbWluID0gbV9wUmFuZ2VzW2kgKiAyXTsKKyAgICAgIG1fRGVjb2RlSW5mb1tpXS5kZWNvZGVfbWF4ID0gbV9wUmFuZ2VzW2kgKiAyICsgMV07CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIENQREZfU2FtcGxlZEZ1bmM6OnZfQ2FsbChmbG9hdCogaW5wdXRzLCBmbG9hdCogcmVzdWx0cykgY29uc3QgeworICBpbnQgcG9zID0gMDsKKyAgQ0ZYX0ZpeGVkQnVmR3JvdzxmbG9hdCwgMTY+IGVuY29kZWRfaW5wdXRfYnVmKG1fbklucHV0cyk7CisgIGZsb2F0KiBlbmNvZGVkX2lucHV0ID0gZW5jb2RlZF9pbnB1dF9idWY7CisgIENGWF9GaXhlZEJ1Zkdyb3c8dWludDMyX3QsIDMyPiBpbnRfYnVmKG1fbklucHV0cyAqIDIpOworICB1aW50MzJfdCogaW5kZXggPSBpbnRfYnVmOworICB1aW50MzJfdCogYmxvY2tzaXplID0gaW5kZXggKyBtX25JbnB1dHM7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX25JbnB1dHM7IGkrKykgeworICAgIGlmIChpID09IDApCisgICAgICBibG9ja3NpemVbaV0gPSAxOworICAgIGVsc2UKKyAgICAgIGJsb2Nrc2l6ZVtpXSA9IGJsb2Nrc2l6ZVtpIC0gMV0gKiBtX0VuY29kZUluZm9baSAtIDFdLnNpemVzOworICAgIGVuY29kZWRfaW5wdXRbaV0gPQorICAgICAgICBJbnRlcnBvbGF0ZShpbnB1dHNbaV0sIG1fcERvbWFpbnNbaSAqIDJdLCBtX3BEb21haW5zW2kgKiAyICsgMV0sCisgICAgICAgICAgICAgICAgICAgIG1fRW5jb2RlSW5mb1tpXS5lbmNvZGVfbWluLCBtX0VuY29kZUluZm9baV0uZW5jb2RlX21heCk7CisgICAgaW5kZXhbaV0gPSBwZGZpdW06OmNsYW1wKHN0YXRpY19jYXN0PHVpbnQzMl90PihlbmNvZGVkX2lucHV0W2ldKSwgMFUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fRW5jb2RlSW5mb1tpXS5zaXplcyAtIDEpOworICAgIHBvcyArPSBpbmRleFtpXSAqIGJsb2Nrc2l6ZVtpXTsKKyAgfQorICBGWF9TQUZFX0lOVDMyIGJpdHNfdG9fb3V0cHV0ID0gbV9uT3V0cHV0czsKKyAgYml0c190b19vdXRwdXQgKj0gbV9uQml0c1BlclNhbXBsZTsKKyAgaWYgKCFiaXRzX3RvX291dHB1dC5Jc1ZhbGlkKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIEZYX1NBRkVfSU5UMzIgYml0cG9zID0gcG9zOworICBiaXRwb3MgKj0gYml0c190b19vdXRwdXQuVmFsdWVPckRpZSgpOworICBpZiAoIWJpdHBvcy5Jc1ZhbGlkKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIEZYX1NBRkVfSU5UMzIgcmFuZ2VfY2hlY2sgPSBiaXRwb3M7CisgIHJhbmdlX2NoZWNrICs9IGJpdHNfdG9fb3V0cHV0LlZhbHVlT3JEaWUoKTsKKyAgaWYgKCFyYW5nZV9jaGVjay5Jc1ZhbGlkKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGNvbnN0IHVpbnQ4X3QqIHBTYW1wbGVEYXRhID0gbV9wU2FtcGxlU3RyZWFtLT5HZXREYXRhKCk7CisgIGlmICghcFNhbXBsZURhdGEpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBtX25PdXRwdXRzOyBqKyssIGJpdHBvcyArPSBtX25CaXRzUGVyU2FtcGxlKSB7CisgICAgdWludDMyX3Qgc2FtcGxlID0KKyAgICAgICAgR2V0Qml0czMyKHBTYW1wbGVEYXRhLCBiaXRwb3MuVmFsdWVPckRpZSgpLCBtX25CaXRzUGVyU2FtcGxlKTsKKyAgICBmbG9hdCBlbmNvZGVkID0gKGZsb2F0KXNhbXBsZTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9uSW5wdXRzOyBpKyspIHsKKyAgICAgIGlmIChpbmRleFtpXSA9PSBtX0VuY29kZUluZm9baV0uc2l6ZXMgLSAxKSB7CisgICAgICAgIGlmIChpbmRleFtpXSA9PSAwKQorICAgICAgICAgIGVuY29kZWQgPSBlbmNvZGVkX2lucHV0W2ldICogKGZsb2F0KXNhbXBsZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZYX1NBRkVfSU5UMzIgYml0cG9zMiA9IGJsb2Nrc2l6ZVtpXTsKKyAgICAgICAgYml0cG9zMiArPSBwb3M7CisgICAgICAgIGJpdHBvczIgKj0gbV9uT3V0cHV0czsKKyAgICAgICAgYml0cG9zMiArPSBqOworICAgICAgICBiaXRwb3MyICo9IG1fbkJpdHNQZXJTYW1wbGU7CisgICAgICAgIGlmICghYml0cG9zMi5Jc1ZhbGlkKCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB1aW50MzJfdCBzYW1wbGUxID0KKyAgICAgICAgICAgIEdldEJpdHMzMihwU2FtcGxlRGF0YSwgYml0cG9zMi5WYWx1ZU9yRGllKCksIG1fbkJpdHNQZXJTYW1wbGUpOworICAgICAgICBlbmNvZGVkICs9CisgICAgICAgICAgICAoZW5jb2RlZF9pbnB1dFtpXSAtIGluZGV4W2ldKSAqICgoZmxvYXQpc2FtcGxlMSAtIChmbG9hdClzYW1wbGUpOworICAgICAgfQorICAgIH0KKyAgICByZXN1bHRzW2pdID0KKyAgICAgICAgSW50ZXJwb2xhdGUoZW5jb2RlZCwgMCwgKGZsb2F0KW1fU2FtcGxlTWF4LCBtX0RlY29kZUluZm9bal0uZGVjb2RlX21pbiwKKyAgICAgICAgICAgICAgICAgICAgbV9EZWNvZGVJbmZvW2pdLmRlY29kZV9tYXgpOworICB9CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zYW1wbGVkZnVuYy5oIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zYW1wbGVkZnVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZGZlZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3NhbXBsZWRmdW5jLmgKQEAgLTAsMCArMSw1MCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlBERkFQSV9QQUdFX0NQREZfU0FNUExFREZVTkNfSF8KKyNkZWZpbmUgQ09SRV9GUERGQVBJX1BBR0VfQ1BERl9TQU1QTEVERlVOQ19IXworCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW1fYWNjLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisKK2NsYXNzIENQREZfU2FtcGxlZEZ1bmMgOiBwdWJsaWMgQ1BERl9GdW5jdGlvbiB7CisgcHVibGljOgorICBzdHJ1Y3QgU2FtcGxlRW5jb2RlSW5mbyB7CisgICAgZmxvYXQgZW5jb2RlX21heDsKKyAgICBmbG9hdCBlbmNvZGVfbWluOworICAgIHVpbnQzMl90IHNpemVzOworICB9OworCisgIHN0cnVjdCBTYW1wbGVEZWNvZGVJbmZvIHsKKyAgICBmbG9hdCBkZWNvZGVfbWF4OworICAgIGZsb2F0IGRlY29kZV9taW47CisgIH07CisKKyAgQ1BERl9TYW1wbGVkRnVuYygpOworICB+Q1BERl9TYW1wbGVkRnVuYygpIG92ZXJyaWRlOworCisgIC8vIENQREZfRnVuY3Rpb24KKyAgYm9vbCB2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopIG92ZXJyaWRlOworICBib29sIHZfQ2FsbChmbG9hdCogaW5wdXRzLCBmbG9hdCogcmVzdWx0cykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8U2FtcGxlRW5jb2RlSW5mbz4mIEdldEVuY29kZUluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIG1fRW5jb2RlSW5mbzsKKyAgfQorICB1aW50MzJfdCBHZXRCaXRzUGVyU2FtcGxlKCkgY29uc3QgeyByZXR1cm4gbV9uQml0c1BlclNhbXBsZTsgfQorICBSZXRhaW5QdHI8Q1BERl9TdHJlYW1BY2M+IEdldFNhbXBsZVN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIG1fcFNhbXBsZVN0cmVhbTsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8U2FtcGxlRW5jb2RlSW5mbz4gbV9FbmNvZGVJbmZvOworICBzdGQ6OnZlY3RvcjxTYW1wbGVEZWNvZGVJbmZvPiBtX0RlY29kZUluZm87CisgIHVpbnQzMl90IG1fbkJpdHNQZXJTYW1wbGU7CisgIHVpbnQzMl90IG1fU2FtcGxlTWF4OworICBSZXRhaW5QdHI8Q1BERl9TdHJlYW1BY2M+IG1fcFNhbXBsZVN0cmVhbTsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GUERGQVBJX1BBR0VfQ1BERl9TQU1QTEVERlVOQ19IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zaGFkaW5nb2JqZWN0LmNwcCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc2hhZGluZ29iamVjdC5jcHAKaW5kZXggOTI4YjBhZi4uMWIxNmFjNCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zaGFkaW5nb2JqZWN0LmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3NoYWRpbmdvYmplY3QuY3BwCkBAIC02LDExICs2LDEyIEBACiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3NoYWRpbmdvYmplY3QuaCIKIAotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZG9jcGFnZWRhdGEuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3NoYWRpbmdwYXR0ZXJuLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RvY3VtZW50LmgiCiAKLUNQREZfU2hhZGluZ09iamVjdDo6Q1BERl9TaGFkaW5nT2JqZWN0KCkgOiBtX3BTaGFkaW5nKG51bGxwdHIpIHt9CitDUERGX1NoYWRpbmdPYmplY3Q6OkNQREZfU2hhZGluZ09iamVjdChDUERGX1NoYWRpbmdQYXR0ZXJuKiBwYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KQorICAgIDogbV9wU2hhZGluZyhwYXR0ZXJuKSwgbV9NYXRyaXgobWF0cml4KSB7fQogCiBDUERGX1NoYWRpbmdPYmplY3Q6On5DUERGX1NoYWRpbmdPYmplY3QoKSB7fQogCkBAIC0xOSwxNCArMjAsMTUgQEAKIH0KIAogdm9pZCBDUERGX1NoYWRpbmdPYmplY3Q6OlRyYW5zZm9ybShjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKLSAgaWYgKG1fQ2xpcFBhdGgpCisgIGlmIChtX0NsaXBQYXRoLkhhc1JlZigpKQogICAgIG1fQ2xpcFBhdGguVHJhbnNmb3JtKG1hdHJpeCk7CiAKICAgbV9NYXRyaXguQ29uY2F0KG1hdHJpeCk7Ci0gIGlmIChtX0NsaXBQYXRoKSB7CisgIGlmIChtX0NsaXBQYXRoLkhhc1JlZigpKSB7CiAgICAgQ2FsY0JvdW5kaW5nQm94KCk7CiAgIH0gZWxzZSB7Ci0gICAgbWF0cml4LlRyYW5zZm9ybVJlY3QobV9MZWZ0LCBtX1JpZ2h0LCBtX1RvcCwgbV9Cb3R0b20pOworICAgIHN0ZDo6dGllKG1fTGVmdCwgbV9SaWdodCwgbV9Ub3AsIG1fQm90dG9tKSA9CisgICAgICAgIG1hdHJpeC5UcmFuc2Zvcm1SZWN0KG1fTGVmdCwgbV9SaWdodCwgbV9Ub3AsIG1fQm90dG9tKTsKICAgfQogfQogCkBAIC00Myw3ICs0NSw3IEBACiB9CiAKIHZvaWQgQ1BERl9TaGFkaW5nT2JqZWN0OjpDYWxjQm91bmRpbmdCb3goKSB7Ci0gIGlmICghbV9DbGlwUGF0aCkKKyAgaWYgKCFtX0NsaXBQYXRoLkhhc1JlZigpKQogICAgIHJldHVybjsKICAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gbV9DbGlwUGF0aC5HZXRDbGlwQm94KCk7CiAgIG1fTGVmdCA9IHJlY3QubGVmdDsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc2hhZGluZ29iamVjdC5oIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zaGFkaW5nb2JqZWN0LmgKaW5kZXggZmZkNjIyMy4uODBlMDYyYyAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zaGFkaW5nb2JqZWN0LmgKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zaGFkaW5nb2JqZWN0LmgKQEAgLTksMTUgKzksMTYgQEAKIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW9iamVjdC5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAKIGNsYXNzIENQREZfU2hhZGluZ1BhdHRlcm47CiAKIGNsYXNzIENQREZfU2hhZGluZ09iamVjdCA6IHB1YmxpYyBDUERGX1BhZ2VPYmplY3QgewogIHB1YmxpYzoKLSAgQ1BERl9TaGFkaW5nT2JqZWN0KCk7CisgIENQREZfU2hhZGluZ09iamVjdChDUERGX1NoYWRpbmdQYXR0ZXJuKiBwYXR0ZXJuLCBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpOwogICB+Q1BERl9TaGFkaW5nT2JqZWN0KCkgb3ZlcnJpZGU7CiAKLSAgLy8gQ1BERl9QYWdlT2JqZWN0CisgIC8vIENQREZfUGFnZU9iamVjdDoKICAgVHlwZSBHZXRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CiAgIHZvaWQgVHJhbnNmb3JtKGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgb3ZlcnJpZGU7CiAgIGJvb2wgSXNTaGFkaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CkBAIC0yNiw3ICsyNywxMSBAQAogCiAgIHZvaWQgQ2FsY0JvdW5kaW5nQm94KCk7CiAKLSAgQ1BERl9TaGFkaW5nUGF0dGVybiogbV9wU2hhZGluZzsKKyAgY29uc3QgQ1BERl9TaGFkaW5nUGF0dGVybiogcGF0dGVybigpIGNvbnN0IHsgcmV0dXJuIG1fcFNoYWRpbmcuR2V0KCk7IH0KKyAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KCkgY29uc3QgeyByZXR1cm4gbV9NYXRyaXg7IH0KKworIHByaXZhdGU6CisgIFVub3duZWRQdHI8Q1BERl9TaGFkaW5nUGF0dGVybj4gbV9wU2hhZGluZzsKICAgQ0ZYX01hdHJpeCBtX01hdHJpeDsKIH07CiAKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc2hhZGluZ3BhdHRlcm4uY3BwIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zaGFkaW5ncGF0dGVybi5jcHAKaW5kZXggZTE5ZmZhZi4uZjFlNzViNyAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zaGFkaW5ncGF0dGVybi5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zaGFkaW5ncGF0dGVybi5jcHAKQEAgLTksNyArOSw3IEBACiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9kb2NwYWdlZGF0YS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL3BhZ2VpbnQuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2Z1bmN0aW9uLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaCIKQEAgLTMxLDI3ICszMSwyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcFBhdHRlcm5PYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoYWRpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIHBhcmVudE1hdHJpeCkKLSAgICA6IENQREZfUGF0dGVybihTSEFESU5HLAotICAgICAgICAgICAgICAgICAgIHBEb2MsCi0gICAgICAgICAgICAgICAgICAgYlNoYWRpbmcgPyBudWxscHRyIDogcFBhdHRlcm5PYmosCi0gICAgICAgICAgICAgICAgICAgcGFyZW50TWF0cml4KSwKKyAgICA6IENQREZfUGF0dGVybihwRG9jLCBiU2hhZGluZyA/IG51bGxwdHIgOiBwUGF0dGVybk9iaiwgcGFyZW50TWF0cml4KSwKICAgICAgIG1fU2hhZGluZ1R5cGUoa0ludmFsaWRTaGFkaW5nKSwKICAgICAgIG1fYlNoYWRpbmdPYmooYlNoYWRpbmcpLAogICAgICAgbV9wU2hhZGluZ09iaihwUGF0dGVybk9iaiksCiAgICAgICBtX3BDUyhudWxscHRyKSwKICAgICAgIG1fcENvdW50ZWRDUyhudWxscHRyKSB7CisgIGFzc2VydChkb2N1bWVudCgpKTsKICAgaWYgKCFiU2hhZGluZykgewotICAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BQYXR0ZXJuT2JqLT5HZXREaWN0KCk7Ci0gICAgbV9QYXR0ZXJuMkZvcm0gPSBwRGljdC0+R2V0TWF0cml4Rm9yKCJNYXRyaXgiKTsKLSAgICBtX3BTaGFkaW5nT2JqID0gcERpY3QtPkdldERpcmVjdE9iamVjdEZvcigiU2hhZGluZyIpOwotICAgIG1fUGF0dGVybjJGb3JtLkNvbmNhdChwYXJlbnRNYXRyaXgpOworICAgIG1fcFNoYWRpbmdPYmogPSBwYXR0ZXJuX29iaigpLT5HZXREaWN0KCktPkdldERpcmVjdE9iamVjdEZvcigiU2hhZGluZyIpOworICAgIFNldFBhdHRlcm5Ub0Zvcm1NYXRyaXgoKTsKICAgfQogfQogCiBDUERGX1NoYWRpbmdQYXR0ZXJuOjp+Q1BERl9TaGFkaW5nUGF0dGVybigpIHsKLSAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBtX3BDb3VudGVkQ1MgPyBtX3BDb3VudGVkQ1MtPmdldCgpIDogbnVsbHB0cjsKLSAgaWYgKHBDUyAmJiBtX3BEb2N1bWVudCkKLSAgICBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+UmVsZWFzZUNvbG9yU3BhY2UocENTLT5HZXRBcnJheSgpKTsKKyAgQ1BERl9Db2xvclNwYWNlKiBwQ291bnRlZENTID0gbV9wQ291bnRlZENTID8gbV9wQ291bnRlZENTLT5nZXQoKSA6IG51bGxwdHI7CisgIGlmIChwQ291bnRlZENTKSB7CisgICAgYXV0byogcFBhZ2VEYXRhID0gZG9jdW1lbnQoKS0+R2V0UGFnZURhdGEoKTsKKyAgICBpZiAocFBhZ2VEYXRhKSB7CisgICAgICBtX3BDUy5SZWxlYXNlKCk7ICAvLyBHaXZlIHVwIHVub3duZWQgcmVmZXJlbmNlIGZpcnN0LgorICAgICAgcFBhZ2VEYXRhLT5SZWxlYXNlQ29sb3JTcGFjZShwQ291bnRlZENTLT5HZXRBcnJheSgpKTsKKyAgICB9CisgIH0KIH0KIAogQ1BERl9UaWxpbmdQYXR0ZXJuKiBDUERGX1NoYWRpbmdQYXR0ZXJuOjpBc1RpbGluZ1BhdHRlcm4oKSB7CkBAIC04NiwxNiArODcsMTEwIEBACiAgIGlmICghcENTT2JqKQogICAgIHJldHVybiBmYWxzZTsKIAotICBDUERGX0RvY1BhZ2VEYXRhKiBwRG9jUGFnZURhdGEgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKTsKKyAgQ1BERl9Eb2NQYWdlRGF0YSogcERvY1BhZ2VEYXRhID0gZG9jdW1lbnQoKS0+R2V0UGFnZURhdGEoKTsKICAgbV9wQ1MgPSBwRG9jUGFnZURhdGEtPkdldENvbG9yU3BhY2UocENTT2JqLCBudWxscHRyKTsKLSAgaWYgKG1fcENTKQotICAgIG1fcENvdW50ZWRDUyA9IHBEb2NQYWdlRGF0YS0+RmluZENvbG9yU3BhY2VQdHIobV9wQ1MtPkdldEFycmF5KCkpOworCisgIC8vIFRoZSBjb2xvciBzcGFjZSBpcyByZXF1aXJlZCBhbmQgY2Fubm90IGJlIGEgUGF0dGVybiBzcGFjZSwgYWNjb3JkaW5nIHRvIHRoZQorICAvLyBQREYgMS43IHNwZWMsIHBhZ2UgMzA1LgorICBpZiAoIW1fcENTIHx8IG1fcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19QQVRURVJOKQorICAgIHJldHVybiBmYWxzZTsKKworICBtX3BDb3VudGVkQ1MgPSBwRG9jUGFnZURhdGEtPkZpbmRDb2xvclNwYWNlUHRyKG1fcENTLT5HZXRBcnJheSgpKTsKIAogICBtX1NoYWRpbmdUeXBlID0gVG9TaGFkaW5nVHlwZShwU2hhZGluZ0RpY3QtPkdldEludGVnZXJGb3IoIlNoYWRpbmdUeXBlIikpOwogCi0gIC8vIFdlIGV4cGVjdCB0byBoYXZlIGEgc3RyZWFtIGlmIG91ciBzaGFkaW5nIHR5cGUgaXMgYSBtZXNoLgotICBpZiAoSXNNZXNoU2hhZGluZygpICYmICFUb1N0cmVhbShtX3BTaGFkaW5nT2JqKSkKKyAgcmV0dXJuIFZhbGlkYXRlKCk7Cit9CisKK2Jvb2wgQ1BERl9TaGFkaW5nUGF0dGVybjo6VmFsaWRhdGUoKSBjb25zdCB7CisgIGlmIChtX1NoYWRpbmdUeXBlID09IGtJbnZhbGlkU2hhZGluZykKICAgICByZXR1cm4gZmFsc2U7CiAKKyAgLy8gV2UgZXhwZWN0IHRvIGhhdmUgYSBzdHJlYW0gaWYgb3VyIHNoYWRpbmcgdHlwZSBpcyBhIG1lc2guCisgIGlmIChJc01lc2hTaGFkaW5nKCkgJiYgIVRvU3RyZWFtKG1fcFNoYWRpbmdPYmouR2V0KCkpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBWYWxpZGF0ZSBjb2xvciBzcGFjZQorICBzd2l0Y2ggKG1fU2hhZGluZ1R5cGUpIHsKKyAgICBjYXNlIGtGdW5jdGlvbkJhc2VkU2hhZGluZzoKKyAgICBjYXNlIGtBeGlhbFNoYWRpbmc6CisgICAgY2FzZSBrUmFkaWFsU2hhZGluZzogeworICAgICAgaWYgKG1fcENTLT5HZXRGYW1pbHkoKSA9PSBQREZDU19JTkRFWEVEKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrRnJlZUZvcm1Hb3VyYXVkVHJpYW5nbGVNZXNoU2hhZGluZzoKKyAgICBjYXNlIGtMYXR0aWNlRm9ybUdvdXJhdWRUcmlhbmdsZU1lc2hTaGFkaW5nOgorICAgIGNhc2Uga0Nvb25zUGF0Y2hNZXNoU2hhZGluZzoKKyAgICBjYXNlIGtUZW5zb3JQcm9kdWN0UGF0Y2hNZXNoU2hhZGluZzogeworICAgICAgaWYgKCFtX3BGdW5jdGlvbnMuZW1wdHkoKSAmJiBtX3BDUy0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfSU5ERVhFRCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICB1aW50MzJfdCBuTnVtQ29sb3JTcGFjZUNvbXBvbmVudHMgPSBtX3BDUy0+Q291bnRDb21wb25lbnRzKCk7CisgIHN3aXRjaCAobV9TaGFkaW5nVHlwZSkgeworICAgIGNhc2Uga0Z1bmN0aW9uQmFzZWRTaGFkaW5nOiB7CisgICAgICAvLyBFaXRoZXIgb25lIDItdG8tTiBmdW5jdGlvbiBvciBOIDItdG8tMSBmdW5jdGlvbnMuCisgICAgICBpZiAoIVZhbGlkYXRlRnVuY3Rpb25zKDEsIDIsIG5OdW1Db2xvclNwYWNlQ29tcG9uZW50cykgJiYKKyAgICAgICAgICAhVmFsaWRhdGVGdW5jdGlvbnMobk51bUNvbG9yU3BhY2VDb21wb25lbnRzLCAyLCAxKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrQXhpYWxTaGFkaW5nOgorICAgIGNhc2Uga1JhZGlhbFNoYWRpbmc6IHsKKyAgICAgIC8vIEVpdGhlciBvbmUgMS10by1OIGZ1bmN0aW9uIG9yIE4gMS10by0xIGZ1bmN0aW9ucy4KKyAgICAgIGlmICghVmFsaWRhdGVGdW5jdGlvbnMoMSwgMSwgbk51bUNvbG9yU3BhY2VDb21wb25lbnRzKSAmJgorICAgICAgICAgICFWYWxpZGF0ZUZ1bmN0aW9ucyhuTnVtQ29sb3JTcGFjZUNvbXBvbmVudHMsIDEsIDEpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGtGcmVlRm9ybUdvdXJhdWRUcmlhbmdsZU1lc2hTaGFkaW5nOgorICAgIGNhc2Uga0xhdHRpY2VGb3JtR291cmF1ZFRyaWFuZ2xlTWVzaFNoYWRpbmc6CisgICAgY2FzZSBrQ29vbnNQYXRjaE1lc2hTaGFkaW5nOgorICAgIGNhc2Uga1RlbnNvclByb2R1Y3RQYXRjaE1lc2hTaGFkaW5nOiB7CisgICAgICAvLyBFaXRoZXIgbm8gZnVuY3Rpb24sIG9uZSAxLXRvLU4gZnVuY3Rpb24sIG9yIE4gMS10by0xIGZ1bmN0aW9ucy4KKyAgICAgIGlmICghbV9wRnVuY3Rpb25zLmVtcHR5KCkgJiYKKyAgICAgICAgICAhVmFsaWRhdGVGdW5jdGlvbnMoMSwgMSwgbk51bUNvbG9yU3BhY2VDb21wb25lbnRzKSAmJgorICAgICAgICAgICFWYWxpZGF0ZUZ1bmN0aW9ucyhuTnVtQ29sb3JTcGFjZUNvbXBvbmVudHMsIDEsIDEpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CiAgIHJldHVybiB0cnVlOwogfQorCitib29sIENQREZfU2hhZGluZ1BhdHRlcm46OlZhbGlkYXRlRnVuY3Rpb25zKAorICAgIHVpbnQzMl90IG5FeHBlY3RlZE51bUZ1bmN0aW9ucywKKyAgICB1aW50MzJfdCBuRXhwZWN0ZWROdW1JbnB1dHMsCisgICAgdWludDMyX3QgbkV4cGVjdGVkTnVtT3V0cHV0cykgY29uc3QgeworICBpZiAobV9wRnVuY3Rpb25zLnNpemUoKSAhPSBuRXhwZWN0ZWROdW1GdW5jdGlvbnMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8dWludDMyX3Q+IG5Ub3RhbE91dHB1dHMgPSAwOworICBmb3IgKGNvbnN0IGF1dG8mIGZ1bmN0aW9uIDogbV9wRnVuY3Rpb25zKSB7CisgICAgaWYgKCFmdW5jdGlvbikKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChmdW5jdGlvbi0+Q291bnRJbnB1dHMoKSAhPSBuRXhwZWN0ZWROdW1JbnB1dHMgfHwKKyAgICAgICAgZnVuY3Rpb24tPkNvdW50T3V0cHV0cygpICE9IG5FeHBlY3RlZE51bU91dHB1dHMpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBuVG90YWxPdXRwdXRzICs9IGZ1bmN0aW9uLT5Db3VudE91dHB1dHMoKTsKKyAgfQorCisgIHJldHVybiBuVG90YWxPdXRwdXRzLklzVmFsaWQoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc2hhZGluZ3BhdHRlcm4uaCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc2hhZGluZ3BhdHRlcm4uaAppbmRleCAxMzYxNTNkLi4xN2I2ZTRiIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3NoYWRpbmdwYXR0ZXJuLmgKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zaGFkaW5ncGF0dGVybi5oCkBAIC0xMCw5ICsxMCwxMCBAQAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvdW50ZWRvYmplY3QuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbG9yc3BhY2UuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhdHRlcm4uaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKIAogZW51bSBTaGFkaW5nVHlwZSB7CiAgIGtJbnZhbGlkU2hhZGluZyA9IDAsCkBAIC01MywyMiArNTQsMjggQEAKIAogICBTaGFkaW5nVHlwZSBHZXRTaGFkaW5nVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fU2hhZGluZ1R5cGU7IH0KICAgYm9vbCBJc1NoYWRpbmdPYmplY3QoKSBjb25zdCB7IHJldHVybiBtX2JTaGFkaW5nT2JqOyB9Ci0gIENQREZfT2JqZWN0KiBHZXRTaGFkaW5nT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gbV9wU2hhZGluZ09iajsgfQotICBDUERGX0NvbG9yU3BhY2UqIEdldENTKCkgY29uc3QgeyByZXR1cm4gbV9wQ1M7IH0KKyAgQ1BERl9PYmplY3QqIEdldFNoYWRpbmdPYmplY3QoKSBjb25zdCB7IHJldHVybiBtX3BTaGFkaW5nT2JqLkdldCgpOyB9CisgIENQREZfQ29sb3JTcGFjZSogR2V0Q1MoKSBjb25zdCB7IHJldHVybiBtX3BDUy5HZXQoKTsgfQogICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9GdW5jdGlvbj4+JiBHZXRGdW5jcygpIGNvbnN0IHsKICAgICByZXR1cm4gbV9wRnVuY3Rpb25zOwogICB9CiAKICBwcml2YXRlOgorICAvLyBDb25zdHJhaW50cyBpbiBQREYgMS43IHNwZWMsIDQuNi4zIFNoYWRpbmcgUGF0dGVybnMsIHBhZ2VzIDMwOC0zMzEuCisgIGJvb2wgVmFsaWRhdGUoKSBjb25zdDsKKyAgYm9vbCBWYWxpZGF0ZUZ1bmN0aW9ucyh1aW50MzJfdCBuRXhwZWN0ZWROdW1GdW5jdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkV4cGVjdGVkTnVtSW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5FeHBlY3RlZE51bU91dHB1dHMpIGNvbnN0OworCiAgIFNoYWRpbmdUeXBlIG1fU2hhZGluZ1R5cGU7CiAgIGJvb2wgbV9iU2hhZGluZ09iajsKLSAgQ1BERl9PYmplY3QqIG1fcFNoYWRpbmdPYmo7CisgIFVub3duZWRQdHI8Q1BERl9PYmplY3Q+IG1fcFNoYWRpbmdPYmo7CiAKICAgLy8gU3RpbGwga2VlcCB8bV9wQ1N8IGFzIHNvbWUgQ1BERl9Db2xvclNwYWNlIChuYW1lIG9iamVjdCkgYXJlIG5vdCBtYW5hZ2VkCiAgIC8vIGFzIGNvdW50ZWQgb2JqZWN0cy4gUmVmZXIgdG8gQ1BERl9Eb2NQYWdlRGF0YTo6R2V0Q29sb3JTcGFjZS4KLSAgQ1BERl9Db2xvclNwYWNlKiBtX3BDUzsKKyAgVW5vd25lZFB0cjxDUERGX0NvbG9yU3BhY2U+IG1fcENTOwogCi0gIENQREZfQ291bnRlZENvbG9yU3BhY2UqIG1fcENvdW50ZWRDUzsKKyAgVW5vd25lZFB0cjxDUERGX0NvdW50ZWRDb2xvclNwYWNlPiBtX3BDb3VudGVkQ1M7CiAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDUERGX0Z1bmN0aW9uPj4gbV9wRnVuY3Rpb25zOwogfTsKIApkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zdGl0Y2hmdW5jLmNwcCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc3RpdGNoZnVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM2Yzc0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc3RpdGNoZnVuYy5jcHAKQEAgLTAsMCArMSw5MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zdGl0Y2hmdW5jLmgiCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgorCitDUERGX1N0aXRjaEZ1bmM6OkNQREZfU3RpdGNoRnVuYygpCisgICAgOiBDUERGX0Z1bmN0aW9uKFR5cGU6OmtUeXBlM1N0aXRjaGluZyksCisgICAgICBtX3BCb3VuZHMobnVsbHB0ciksCisgICAgICBtX3BFbmNvZGUobnVsbHB0cikge30KKworQ1BERl9TdGl0Y2hGdW5jOjp+Q1BERl9TdGl0Y2hGdW5jKCkgeworICBGWF9GcmVlKG1fcEJvdW5kcyk7CisgIEZYX0ZyZWUobV9wRW5jb2RlKTsKK30KKworYm9vbCBDUERGX1N0aXRjaEZ1bmM6OnZfSW5pdChDUERGX09iamVjdCogcE9iaikgeworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcE9iai0+R2V0RGljdCgpOworICBpZiAoIXBEaWN0KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChtX25JbnB1dHMgIT0ga1JlcXVpcmVkTnVtSW5wdXRzKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIENQREZfQXJyYXkqIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheUZvcigiRnVuY3Rpb25zIik7CisgIGlmICghcEFycmF5KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHVpbnQzMl90IG5TdWJzID0gcEFycmF5LT5HZXRDb3VudCgpOworICBpZiAoblN1YnMgPT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisgIG1fbk91dHB1dHMgPSAwOworICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgblN1YnM7IGkrKykgeworICAgIENQREZfT2JqZWN0KiBwU3ViID0gcEFycmF5LT5HZXREaXJlY3RPYmplY3RBdChpKTsKKyAgICBpZiAocFN1YiA9PSBwT2JqKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0Z1bmN0aW9uPiBwRnVuYyhDUERGX0Z1bmN0aW9uOjpMb2FkKHBTdWIpKTsKKyAgICBpZiAoIXBGdW5jKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIENoZWNrIHRoYXQgdGhlIGlucHV0IGRpbWVuc2lvbmFsaXR5IGlzIDEsIGFuZCB0aGF0IGFsbCBvdXRwdXQKKyAgICAvLyBkaW1lbnNpb25hbGl0aWVzIGFyZSB0aGUgc2FtZS4KKyAgICBpZiAocEZ1bmMtPkNvdW50SW5wdXRzKCkgIT0ga1JlcXVpcmVkTnVtSW5wdXRzKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChwRnVuYy0+Q291bnRPdXRwdXRzKCkgIT0gbV9uT3V0cHV0cykgeworICAgICAgaWYgKG1fbk91dHB1dHMpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgbV9uT3V0cHV0cyA9IHBGdW5jLT5Db3VudE91dHB1dHMoKTsKKyAgICB9CisKKyAgICBtX3BTdWJGdW5jdGlvbnMucHVzaF9iYWNrKHN0ZDo6bW92ZShwRnVuYykpOworICB9CisgIG1fcEJvdW5kcyA9IEZYX0FsbG9jKGZsb2F0LCBuU3VicyArIDEpOworICBtX3BCb3VuZHNbMF0gPSBtX3BEb21haW5zWzBdOworICBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXlGb3IoIkJvdW5kcyIpOworICBpZiAoIXBBcnJheSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuU3VicyAtIDE7IGkrKykKKyAgICBtX3BCb3VuZHNbaSArIDFdID0gcEFycmF5LT5HZXRGbG9hdEF0KGkpOworICBtX3BCb3VuZHNbblN1YnNdID0gbV9wRG9tYWluc1sxXTsKKyAgbV9wRW5jb2RlID0gRlhfQWxsb2MyRChmbG9hdCwgblN1YnMsIDIpOworICBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXlGb3IoIkVuY29kZSIpOworICBpZiAoIXBBcnJheSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5TdWJzICogMjsgaSsrKQorICAgIG1fcEVuY29kZVtpXSA9IHBBcnJheS0+R2V0RmxvYXRBdChpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1BERl9TdGl0Y2hGdW5jOjp2X0NhbGwoZmxvYXQqIGlucHV0cywgZmxvYXQqIG91dHB1dHMpIGNvbnN0IHsKKyAgZmxvYXQgaW5wdXQgPSBpbnB1dHNbMF07CisgIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBpIDwgbV9wU3ViRnVuY3Rpb25zLnNpemUoKSAtIDE7IGkrKykgeworICAgIGlmIChpbnB1dCA8IG1fcEJvdW5kc1tpICsgMV0pCisgICAgICBicmVhazsKKyAgfQorICBpbnB1dCA9IEludGVycG9sYXRlKGlucHV0LCBtX3BCb3VuZHNbaV0sIG1fcEJvdW5kc1tpICsgMV0sIG1fcEVuY29kZVtpICogMl0sCisgICAgICAgICAgICAgICAgICAgICAgbV9wRW5jb2RlW2kgKiAyICsgMV0pOworICBpbnQgbnJlc3VsdHM7CisgIG1fcFN1YkZ1bmN0aW9uc1tpXS0+Q2FsbCgmaW5wdXQsIGtSZXF1aXJlZE51bUlucHV0cywgb3V0cHV0cywgJm5yZXN1bHRzKTsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3N0aXRjaGZ1bmMuaCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc3RpdGNoZnVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZTVlNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3N0aXRjaGZ1bmMuaApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GUERGQVBJX1BBR0VfQ1BERl9TVElUQ0hGVU5DX0hfCisjZGVmaW5lIENPUkVfRlBERkFQSV9QQUdFX0NQREZfU1RJVENIRlVOQ19IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZnVuY3Rpb24uaCIKKworY2xhc3MgQ1BERl9TdGl0Y2hGdW5jIDogcHVibGljIENQREZfRnVuY3Rpb24geworIHB1YmxpYzoKKyAgQ1BERl9TdGl0Y2hGdW5jKCk7CisgIH5DUERGX1N0aXRjaEZ1bmMoKSBvdmVycmlkZTsKKworICAvLyBDUERGX0Z1bmN0aW9uCisgIGJvb2wgdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKSBvdmVycmlkZTsKKyAgYm9vbCB2X0NhbGwoZmxvYXQqIGlucHV0cywgZmxvYXQqIHJlc3VsdHMpIGNvbnN0IG92ZXJyaWRlOworCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDUERGX0Z1bmN0aW9uPj4mIEdldFN1YkZ1bmN0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9wU3ViRnVuY3Rpb25zOworICB9CisgIGZsb2F0IEdldEJvdW5kKHNpemVfdCBpKSBjb25zdCB7IHJldHVybiBtX3BCb3VuZHNbaV07IH0KKworIHByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDUERGX0Z1bmN0aW9uPj4gbV9wU3ViRnVuY3Rpb25zOworICBmbG9hdCogbV9wQm91bmRzOworICBmbG9hdCogbV9wRW5jb2RlOworCisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrUmVxdWlyZWROdW1JbnB1dHMgPSAxOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfUEFHRV9DUERGX1NUSVRDSEZVTkNfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2ZwZGZfcGFnZV9mdW5jX2VtYmVkZGVydGVzdC5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3N0aXRjaGZ1bmNfZW1iZWRkZXJ0ZXN0LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY29yZS9mcGRmYXBpL3BhZ2UvZnBkZl9wYWdlX2Z1bmNfZW1iZWRkZXJ0ZXN0LmNwcApyZW5hbWUgdG8gY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zdGl0Y2hmdW5jX2VtYmVkZGVydGVzdC5jcHAKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc3RyZWFtY29udGVudHBhcnNlci5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3N0cmVhbWNvbnRlbnRwYXJzZXIuY3BwCmluZGV4IDYyMTFiNmEuLjRlMzg1N2IgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc3RyZWFtY29udGVudHBhcnNlci5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zdHJlYW1jb250ZW50cGFyc2VyLmNwcApAQCAtMjUsNyArMjUsNiBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc2hhZGluZ3BhdHRlcm4uaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3N0cmVhbXBhcnNlci5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfdGV4dG9iamVjdC5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL3BhZ2VpbnQuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudC5oIgpAQCAtMzYsNyArMzUsOSBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9ncmFwaHN0YXRlZGF0YS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCiAKIG5hbWVzcGFjZSB7CiAKQEAgLTc1LDExICs3NiwxMSBAQAogICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IFRvU3RyZWFtKHBTaGFkaW5nLT5HZXRTaGFkaW5nT2JqZWN0KCkpOwogICBDUERGX0NvbG9yU3BhY2UqIHBDUyA9IHBTaGFkaW5nLT5HZXRDUygpOwogICBpZiAoIXBTdHJlYW0gfHwgIXBDUykKLSAgICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdCgwLCAwLCAwLCAwKTsKKyAgICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdCgpOwogCiAgIENQREZfTWVzaFN0cmVhbSBzdHJlYW0odHlwZSwgcFNoYWRpbmctPkdldEZ1bmNzKCksIHBTdHJlYW0sIHBDUyk7CiAgIGlmICghc3RyZWFtLkxvYWQoKSkKLSAgICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdCgwLCAwLCAwLCAwKTsKKyAgICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdCgpOwogCiAgIENGWF9GbG9hdFJlY3QgcmVjdDsKICAgYm9vbCBiU3RhcnRlZCA9IGZhbHNlOwpAQCAtMTE0LDkgKzExNSw5IEBACiAgICAgICAgIGJyZWFrOwogICAgICAgQ0ZYX1BvaW50RiBvcmlnaW4gPSBzdHJlYW0uUmVhZENvb3JkcygpOwogICAgICAgaWYgKGJTdGFydGVkKSB7Ci0gICAgICAgIHJlY3QuVXBkYXRlUmVjdChvcmlnaW4ueCwgb3JpZ2luLnkpOworICAgICAgICByZWN0LlVwZGF0ZVJlY3Qob3JpZ2luKTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlY3QuSW5pdFJlY3Qob3JpZ2luLngsIG9yaWdpbi55KTsKKyAgICAgICAgcmVjdC5Jbml0UmVjdChvcmlnaW4pOwogICAgICAgICBiU3RhcnRlZCA9IHRydWU7CiAgICAgICB9CiAgICAgfQpAQCAtMTMwLDEzICsxMzEsMTIgQEAKICAgICBpZiAoYkdvdXJhdWQpCiAgICAgICBzdHJlYW0uQml0U3RyZWFtKCktPkJ5dGVBbGlnbigpOwogICB9Ci0gIG1hdHJpeC5UcmFuc2Zvcm1SZWN0KHJlY3QpOwotICByZXR1cm4gcmVjdDsKKyAgcmV0dXJuIG1hdHJpeC5UcmFuc2Zvcm1SZWN0KHJlY3QpOwogfQogCiBzdHJ1Y3QgQWJiclBhaXIgewotICBjb25zdCBGWF9DSEFSKiBhYmJyOwotICBjb25zdCBGWF9DSEFSKiBmdWxsX25hbWU7CisgIGNvbnN0IGNoYXIqIGFiYnI7CisgIGNvbnN0IGNoYXIqIGZ1bGxfbmFtZTsKIH07CiAKIGNvbnN0IEFiYnJQYWlyIElubGluZUtleUFiYnJbXSA9IHsKQEAgLTE1NiwxOCArMTU2LDE3IEBACiAKIHN0cnVjdCBBYmJyUmVwbGFjZW1lbnRPcCB7CiAgIGJvb2wgaXNfcmVwbGFjZV9rZXk7Ci0gIENGWF9CeXRlU3RyaW5nIGtleTsKLSAgQ0ZYX0J5dGVTdHJpbmdDIHJlcGxhY2VtZW50OworICBCeXRlU3RyaW5nIGtleTsKKyAgQnl0ZVN0cmluZ1ZpZXcgcmVwbGFjZW1lbnQ7CiB9OwogCi1DRlhfQnl0ZVN0cmluZ0MgRmluZEZ1bGxOYW1lKGNvbnN0IEFiYnJQYWlyKiB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGFiYnIpIHsKLSAgYXV0byBpdCA9IHN0ZDo6ZmluZF9pZih0YWJsZSwgdGFibGUgKyBjb3VudCwgW2FiYnJdKGNvbnN0IEFiYnJQYWlyJiBwYWlyKSB7CitCeXRlU3RyaW5nVmlldyBGaW5kRnVsbE5hbWUoY29uc3QgQWJiclBhaXIqIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgYWJicikgeworICBhdXRvKiBpdCA9IHN0ZDo6ZmluZF9pZih0YWJsZSwgdGFibGUgKyBjb3VudCwgW2FiYnJdKGNvbnN0IEFiYnJQYWlyJiBwYWlyKSB7CiAgICAgcmV0dXJuIHBhaXIuYWJiciA9PSBhYmJyOwogICB9KTsKLSAgcmV0dXJuIGl0ICE9IHRhYmxlICsgY291bnQgPyBDRlhfQnl0ZVN0cmluZ0MoaXQtPmZ1bGxfbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDRlhfQnl0ZVN0cmluZ0MoKTsKKyAgcmV0dXJuIGl0ICE9IHRhYmxlICsgY291bnQgPyBCeXRlU3RyaW5nVmlldyhpdC0+ZnVsbF9uYW1lKSA6IEJ5dGVTdHJpbmdWaWV3KCk7CiB9CiAKIHZvaWQgUmVwbGFjZUFiYnIoQ1BERl9PYmplY3QqIHBPYmopIHsKQEAgLTE3NiwxMCArMTc1LDEwIEBACiAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcE9iai0+QXNEaWN0aW9uYXJ5KCk7CiAgICAgICBzdGQ6OnZlY3RvcjxBYmJyUmVwbGFjZW1lbnRPcD4gcmVwbGFjZW1lbnRzOwogICAgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICpwRGljdCkgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBrZXkgPSBpdC5maXJzdDsKKyAgICAgICAgQnl0ZVN0cmluZyBrZXkgPSBpdC5maXJzdDsKICAgICAgICAgQ1BERl9PYmplY3QqIHZhbHVlID0gaXQuc2Vjb25kLmdldCgpOwotICAgICAgICBDRlhfQnl0ZVN0cmluZ0MgZnVsbG5hbWUgPSBGaW5kRnVsbE5hbWUoCi0gICAgICAgICAgICBJbmxpbmVLZXlBYmJyLCBGWF9BcnJheVNpemUoSW5saW5lS2V5QWJiciksIGtleS5Bc1N0cmluZ0MoKSk7CisgICAgICAgIEJ5dGVTdHJpbmdWaWV3IGZ1bGxuYW1lID0gRmluZEZ1bGxOYW1lKAorICAgICAgICAgICAgSW5saW5lS2V5QWJiciwgRlhfQXJyYXlTaXplKElubGluZUtleUFiYnIpLCBrZXkuQXNTdHJpbmdWaWV3KCkpOwogICAgICAgICBpZiAoIWZ1bGxuYW1lLklzRW1wdHkoKSkgewogICAgICAgICAgIEFiYnJSZXBsYWNlbWVudE9wIG9wOwogICAgICAgICAgIG9wLmlzX3JlcGxhY2Vfa2V5ID0gdHJ1ZTsKQEAgLTE5MCw5ICsxODksMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICh2YWx1ZS0+SXNOYW1lKCkpIHsKLSAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gdmFsdWUtPkdldFN0cmluZygpOwotICAgICAgICAgIGZ1bGxuYW1lID0gRmluZEZ1bGxOYW1lKAotICAgICAgICAgICAgICBJbmxpbmVWYWx1ZUFiYnIsIEZYX0FycmF5U2l6ZShJbmxpbmVWYWx1ZUFiYnIpLCBuYW1lLkFzU3RyaW5nQygpKTsKKyAgICAgICAgICBCeXRlU3RyaW5nIG5hbWUgPSB2YWx1ZS0+R2V0U3RyaW5nKCk7CisgICAgICAgICAgZnVsbG5hbWUgPQorICAgICAgICAgICAgICBGaW5kRnVsbE5hbWUoSW5saW5lVmFsdWVBYmJyLCBGWF9BcnJheVNpemUoSW5saW5lVmFsdWVBYmJyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuQXNTdHJpbmdWaWV3KCkpOwogICAgICAgICAgIGlmICghZnVsbG5hbWUuSXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBBYmJyUmVwbGFjZW1lbnRPcCBvcDsKICAgICAgICAgICAgIG9wLmlzX3JlcGxhY2Vfa2V5ID0gZmFsc2U7CkBAIC0yMDYsOSArMjA2LDkgQEAKICAgICAgIH0KICAgICAgIGZvciAoY29uc3QgYXV0byYgb3AgOiByZXBsYWNlbWVudHMpIHsKICAgICAgICAgaWYgKG9wLmlzX3JlcGxhY2Vfa2V5KQotICAgICAgICAgIHBEaWN0LT5SZXBsYWNlS2V5KG9wLmtleSwgQ0ZYX0J5dGVTdHJpbmcob3AucmVwbGFjZW1lbnQpKTsKKyAgICAgICAgICBwRGljdC0+UmVwbGFjZUtleShvcC5rZXksIEJ5dGVTdHJpbmcob3AucmVwbGFjZW1lbnQpKTsKICAgICAgICAgZWxzZQotICAgICAgICAgIHBEaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPihvcC5rZXksIENGWF9CeXRlU3RyaW5nKG9wLnJlcGxhY2VtZW50KSk7CisgICAgICAgICAgcERpY3QtPlNldE5ld0ZvcjxDUERGX05hbWU+KG9wLmtleSwgQnl0ZVN0cmluZyhvcC5yZXBsYWNlbWVudCkpOwogICAgICAgfQogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMjE3LDExICsyMTcsMTIgQEAKICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpKyspIHsKICAgICAgICAgQ1BERl9PYmplY3QqIHBFbGVtZW50ID0gcEFycmF5LT5HZXRPYmplY3RBdChpKTsKICAgICAgICAgaWYgKHBFbGVtZW50LT5Jc05hbWUoKSkgewotICAgICAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWUgPSBwRWxlbWVudC0+R2V0U3RyaW5nKCk7Ci0gICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIGZ1bGxuYW1lID0gRmluZEZ1bGxOYW1lKAotICAgICAgICAgICAgICBJbmxpbmVWYWx1ZUFiYnIsIEZYX0FycmF5U2l6ZShJbmxpbmVWYWx1ZUFiYnIpLCBuYW1lLkFzU3RyaW5nQygpKTsKKyAgICAgICAgICBCeXRlU3RyaW5nIG5hbWUgPSBwRWxlbWVudC0+R2V0U3RyaW5nKCk7CisgICAgICAgICAgQnl0ZVN0cmluZ1ZpZXcgZnVsbG5hbWUgPQorICAgICAgICAgICAgICBGaW5kRnVsbE5hbWUoSW5saW5lVmFsdWVBYmJyLCBGWF9BcnJheVNpemUoSW5saW5lVmFsdWVBYmJyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuQXNTdHJpbmdWaWV3KCkpOwogICAgICAgICAgIGlmICghZnVsbG5hbWUuSXNFbXB0eSgpKQotICAgICAgICAgICAgcEFycmF5LT5TZXROZXdBdDxDUERGX05hbWU+KGksIENGWF9CeXRlU3RyaW5nKGZ1bGxuYW1lKSk7CisgICAgICAgICAgICBwQXJyYXktPlNldE5ld0F0PENQREZfTmFtZT4oaSwgQnl0ZVN0cmluZyhmdWxsbmFtZSkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIFJlcGxhY2VBYmJyKHBFbGVtZW50KTsKICAgICAgICAgfQpAQCAtMjM1LDE1ICsyMzYsNiBAQAogCiB9ICAvLyBuYW1lc3BhY2UKIAotQ0ZYX0J5dGVTdHJpbmdDIFBERl9GaW5kS2V5QWJicmV2aWF0aW9uRm9yVGVzdGluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGFiYnIpIHsKLSAgcmV0dXJuIEZpbmRGdWxsTmFtZShJbmxpbmVLZXlBYmJyLCBGWF9BcnJheVNpemUoSW5saW5lS2V5QWJiciksIGFiYnIpOwotfQotCi1DRlhfQnl0ZVN0cmluZ0MgUERGX0ZpbmRWYWx1ZUFiYnJldmlhdGlvbkZvclRlc3RpbmcoCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBhYmJyKSB7Ci0gIHJldHVybiBGaW5kRnVsbE5hbWUoSW5saW5lVmFsdWVBYmJyLCBGWF9BcnJheVNpemUoSW5saW5lVmFsdWVBYmJyKSwgYWJicik7Ci19Ci0KIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6Q1BERl9TdHJlYW1Db250ZW50UGFyc2VyKAogICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLApAQCAtMjUxLDI5ICsyNDMsMjUgQEAKICAgICBjb25zdCBDRlhfTWF0cml4KiBwbXRDb250ZW50VG9Vc2VyLAogICAgIENQREZfUGFnZU9iamVjdEhvbGRlciogcE9iakhvbGRlciwKICAgICBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMsCi0gICAgQ0ZYX0Zsb2F0UmVjdCogcEJCb3gsCisgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNCQm94LAogICAgIENQREZfQWxsU3RhdGVzKiBwU3RhdGVzLAotICAgIGludCBsZXZlbCkKKyAgICBzdGQ6OnNldDxjb25zdCB1aW50OF90Kj4qIHBhcnNlZFNldCkKICAgICA6IG1fcERvY3VtZW50KHBEb2N1bWVudCksCiAgICAgICBtX3BQYWdlUmVzb3VyY2VzKHBQYWdlUmVzb3VyY2VzKSwKICAgICAgIG1fcFBhcmVudFJlc291cmNlcyhwUGFyZW50UmVzb3VyY2VzKSwKICAgICAgIG1fcFJlc291cmNlcyhwUmVzb3VyY2VzKSwKICAgICAgIG1fcE9iamVjdEhvbGRlcihwT2JqSG9sZGVyKSwKLSAgICAgIG1fTGV2ZWwobGV2ZWwpLAorICAgICAgbV9QYXJzZWRTZXQocGFyc2VkU2V0KSwKKyAgICAgIG1fQkJveChyY0JCb3gpLAogICAgICAgbV9QYXJhbVN0YXJ0UG9zKDApLAogICAgICAgbV9QYXJhbUNvdW50KDApLAotICAgICAgbV9wQ3VyU3RhdGVzKG5ldyBDUERGX0FsbFN0YXRlcyksCi0gICAgICBtX3BMYXN0VGV4dE9iamVjdChudWxscHRyKSwKKyAgICAgIG1fcEN1clN0YXRlcyhwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9BbGxTdGF0ZXM+KCkpLAogICAgICAgbV9EZWZGb250U2l6ZSgwKSwKLSAgICAgIG1fcFBhdGhQb2ludHMobnVsbHB0ciksCi0gICAgICBtX1BhdGhQb2ludENvdW50KDApLAotICAgICAgbV9QYXRoQWxsb2NTaXplKDApLAogICAgICAgbV9QYXRoU3RhcnRYKDAuMGYpLAogICAgICAgbV9QYXRoU3RhcnRZKDAuMGYpLAogICAgICAgbV9QYXRoQ3VycmVudFgoMC4wZiksCiAgICAgICBtX1BhdGhDdXJyZW50WSgwLjBmKSwKICAgICAgIG1fUGF0aENsaXBUeXBlKDApLAotICAgICAgbV9wTGFzdEltYWdlKG51bGxwdHIpLAogICAgICAgbV9iQ29sb3JlZChmYWxzZSksCiAgICAgICBtX2JSZXNvdXJjZU1pc3NpbmcoZmFsc2UpIHsKICAgaWYgKHBtdENvbnRlbnRUb1VzZXIpCkBAIC0yODIsOCArMjcwLDYgQEAKICAgICBtX3BSZXNvdXJjZXMgPSBtX3BQYXJlbnRSZXNvdXJjZXM7CiAgIGlmICghbV9wUmVzb3VyY2VzKQogICAgIG1fcFJlc291cmNlcyA9IG1fcFBhZ2VSZXNvdXJjZXM7Ci0gIGlmIChwQkJveCkKLSAgICBtX0JCb3ggPSAqcEJCb3g7CiAgIGlmIChwU3RhdGVzKSB7CiAgICAgbV9wQ3VyU3RhdGVzLT5Db3B5KCpwU3RhdGVzKTsKICAgfSBlbHNlIHsKQEAgLTI5OSw3ICsyODUsNiBAQAogCiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6On5DUERGX1N0cmVhbUNvbnRlbnRQYXJzZXIoKSB7CiAgIENsZWFyQWxsUGFyYW1zKCk7Ci0gIEZYX0ZyZWUobV9wUGF0aFBvaW50cyk7CiB9CiAKIGludCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkdldE5leHRQYXJhbVBvcygpIHsKQEAgLTMyMSw3ICszMDYsNyBAQAogICByZXR1cm4gaW5kZXg7CiB9CiAKLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGROYW1lUGFyYW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic05hbWUpIHsKK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGROYW1lUGFyYW0oY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzTmFtZSkgewogICBDb250ZW50UGFyYW0mIHBhcmFtID0gbV9QYXJhbUJ1ZltHZXROZXh0UGFyYW1Qb3MoKV07CiAgIGlmIChic05hbWUuR2V0TGVuZ3RoKCkgPiAzMikgewogICAgIHBhcmFtLm1fVHlwZSA9IENvbnRlbnRQYXJhbTo6T0JKRUNUOwpAQCAtMzI5LDE4ICszMTQsMTggQEAKICAgICAgICAgbV9wRG9jdW1lbnQtPkdldEJ5dGVTdHJpbmdQb29sKCksIFBERl9OYW1lRGVjb2RlKGJzTmFtZSkpOwogICB9IGVsc2UgewogICAgIHBhcmFtLm1fVHlwZSA9IENvbnRlbnRQYXJhbTo6TkFNRTsKLSAgICBpZiAoYnNOYW1lLkZpbmQoJyMnKSA9PSAtMSkgewotICAgICAgRlhTWVNfbWVtY3B5KHBhcmFtLm1fTmFtZS5tX0J1ZmZlciwgYnNOYW1lLnJhd19zdHIoKSwgYnNOYW1lLkdldExlbmd0aCgpKTsKLSAgICAgIHBhcmFtLm1fTmFtZS5tX0xlbiA9IGJzTmFtZS5HZXRMZW5ndGgoKTsKLSAgICB9IGVsc2UgewotICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gUERGX05hbWVEZWNvZGUoYnNOYW1lKTsKLSAgICAgIEZYU1lTX21lbWNweShwYXJhbS5tX05hbWUubV9CdWZmZXIsIHN0ci5jX3N0cigpLCBzdHIuR2V0TGVuZ3RoKCkpOworICAgIGlmIChic05hbWUuQ29udGFpbnMoJyMnKSkgeworICAgICAgQnl0ZVN0cmluZyBzdHIgPSBQREZfTmFtZURlY29kZShic05hbWUpOworICAgICAgbWVtY3B5KHBhcmFtLm1fTmFtZS5tX0J1ZmZlciwgc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSk7CiAgICAgICBwYXJhbS5tX05hbWUubV9MZW4gPSBzdHIuR2V0TGVuZ3RoKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lbWNweShwYXJhbS5tX05hbWUubV9CdWZmZXIsIGJzTmFtZS5yYXdfc3RyKCksIGJzTmFtZS5HZXRMZW5ndGgoKSk7CisgICAgICBwYXJhbS5tX05hbWUubV9MZW4gPSBic05hbWUuR2V0TGVuZ3RoKCk7CiAgICAgfQogICB9CiB9CiAKLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGROdW1iZXJQYXJhbShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgewordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkFkZE51bWJlclBhcmFtKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIpIHsKICAgQ29udGVudFBhcmFtJiBwYXJhbSA9IG1fUGFyYW1CdWZbR2V0TmV4dFBhcmFtUG9zKCldOwogICBwYXJhbS5tX1R5cGUgPSBDb250ZW50UGFyYW06Ok5VTUJFUjsKICAgcGFyYW0ubV9OdW1iZXIubV9iSW50ZWdlciA9IEZYX2F0b251bShzdHIsICZwYXJhbS5tX051bWJlci5tX0ludGVnZXIpOwpAQCAtMzg3LDE5ICszNzIsMTkgQEAKICAgICBwYXJhbS5tX1R5cGUgPSBDb250ZW50UGFyYW06Ok9CSkVDVDsKICAgICBwYXJhbS5tX3BPYmplY3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9OYW1lPigKICAgICAgICAgbV9wRG9jdW1lbnQtPkdldEJ5dGVTdHJpbmdQb29sKCksCi0gICAgICAgIENGWF9CeXRlU3RyaW5nKHBhcmFtLm1fTmFtZS5tX0J1ZmZlciwgcGFyYW0ubV9OYW1lLm1fTGVuKSk7CisgICAgICAgIEJ5dGVTdHJpbmcocGFyYW0ubV9OYW1lLm1fQnVmZmVyLCBwYXJhbS5tX05hbWUubV9MZW4pKTsKICAgICByZXR1cm4gcGFyYW0ubV9wT2JqZWN0LmdldCgpOwogICB9CiAgIGlmIChwYXJhbS5tX1R5cGUgPT0gQ29udGVudFBhcmFtOjpPQkpFQ1QpCiAgICAgcmV0dXJuIHBhcmFtLm1fcE9iamVjdC5nZXQoKTsKIAotICBBU1NFUlQoZmFsc2UpOworICBOT1RSRUFDSEVEKCk7CiAgIHJldHVybiBudWxscHRyOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkdldFN0cmluZyh1aW50MzJfdCBpbmRleCkgeworQnl0ZVN0cmluZyBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkdldFN0cmluZyh1aW50MzJfdCBpbmRleCkgewogICBpZiAoaW5kZXggPj0gbV9QYXJhbUNvdW50KSB7Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CisgICAgcmV0dXJuIEJ5dGVTdHJpbmcoKTsKICAgfQogICBpbnQgcmVhbF9pbmRleCA9IG1fUGFyYW1TdGFydFBvcyArIG1fUGFyYW1Db3VudCAtIGluZGV4IC0gMTsKICAgaWYgKHJlYWxfaW5kZXggPj0ga1BhcmFtQnVmU2l6ZSkgewpAQCAtNDA3LDE1ICszOTIsMTUgQEAKICAgfQogICBDb250ZW50UGFyYW0mIHBhcmFtID0gbV9QYXJhbUJ1ZltyZWFsX2luZGV4XTsKICAgaWYgKHBhcmFtLm1fVHlwZSA9PSBDb250ZW50UGFyYW06Ok5BTUUpIHsKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcocGFyYW0ubV9OYW1lLm1fQnVmZmVyLCBwYXJhbS5tX05hbWUubV9MZW4pOworICAgIHJldHVybiBCeXRlU3RyaW5nKHBhcmFtLm1fTmFtZS5tX0J1ZmZlciwgcGFyYW0ubV9OYW1lLm1fTGVuKTsKICAgfQogICBpZiAocGFyYW0ubV9UeXBlID09IDAgJiYgcGFyYW0ubV9wT2JqZWN0KSB7CiAgICAgcmV0dXJuIHBhcmFtLm1fcE9iamVjdC0+R2V0U3RyaW5nKCk7CiAgIH0KLSAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CisgIHJldHVybiBCeXRlU3RyaW5nKCk7CiB9CiAKLUZYX0ZMT0FUIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6R2V0TnVtYmVyKHVpbnQzMl90IGluZGV4KSB7CitmbG9hdCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkdldE51bWJlcih1aW50MzJfdCBpbmRleCkgewogICBpZiAoaW5kZXggPj0gbV9QYXJhbUNvdW50KSB7CiAgICAgcmV0dXJuIDA7CiAgIH0KQEAgLTQyNSwxMiArNDEwLDEyIEBACiAgIH0KICAgQ29udGVudFBhcmFtJiBwYXJhbSA9IG1fUGFyYW1CdWZbcmVhbF9pbmRleF07CiAgIGlmIChwYXJhbS5tX1R5cGUgPT0gQ29udGVudFBhcmFtOjpOVU1CRVIpIHsKLSAgICByZXR1cm4gcGFyYW0ubV9OdW1iZXIubV9iSW50ZWdlciA/IChGWF9GTE9BVClwYXJhbS5tX051bWJlci5tX0ludGVnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBhcmFtLm1fTnVtYmVyLm1fRmxvYXQ7CisgICAgcmV0dXJuIHBhcmFtLm1fTnVtYmVyLm1fYkludGVnZXIKKyAgICAgICAgICAgICAgID8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBhcmFtLm1fTnVtYmVyLm1fSW50ZWdlcikKKyAgICAgICAgICAgICAgIDogcGFyYW0ubV9OdW1iZXIubV9GbG9hdDsKICAgfQotICBpZiAocGFyYW0ubV9UeXBlID09IDAgJiYgcGFyYW0ubV9wT2JqZWN0KSB7CisgIGlmIChwYXJhbS5tX1R5cGUgPT0gMCAmJiBwYXJhbS5tX3BPYmplY3QpCiAgICAgcmV0dXJuIHBhcmFtLm1fcE9iamVjdC0+R2V0TnVtYmVyKCk7Ci0gIH0KICAgcmV0dXJuIDA7CiB9CiAKQEAgLTU3Myw3ICs1NTgsNyBAQAogICB9KTsKIH0KIAotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6Ok9uT3BlcmF0b3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvcCkgewordm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6Ok9uT3BlcmF0b3IoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIG9wKSB7CiAgIHN0YXRpYyBjb25zdCBPcENvZGVzIHNfT3BDb2RlcyA9IEluaXRpYWxpemVPcENvZGVzKCk7CiAKICAgYXV0byBpdCA9IHNfT3BDb2Rlcy5maW5kKG9wLkdldElEKCkpOwpAQCAtNjAwLDcgKzU4NSw3IEBACiB9CiAKIHZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfQmVnaW5NYXJrZWRDb250ZW50X0RpY3Rpb25hcnkoKSB7Ci0gIENGWF9CeXRlU3RyaW5nIHRhZyA9IEdldFN0cmluZygxKTsKKyAgQnl0ZVN0cmluZyB0YWcgPSBHZXRTdHJpbmcoMSk7CiAgIENQREZfT2JqZWN0KiBwUHJvcGVydHkgPSBHZXRPYmplY3QoMCk7CiAgIGlmICghcFByb3BlcnR5KSB7CiAgICAgcmV0dXJuOwpAQCAtNjMyLDEyICs2MTcsMTMgQEAKICAgICBpZiAodHlwZSAhPSBDUERGX1N0cmVhbVBhcnNlcjo6TmFtZSkgewogICAgICAgYnJlYWs7CiAgICAgfQotICAgIENGWF9CeXRlU3RyaW5nIGtleShtX3BTeW50YXgtPkdldFdvcmQoKS5NaWQoMSkpOworICAgIGF1dG8gd29yZCA9IG1fcFN5bnRheC0+R2V0V29yZCgpOworICAgIEJ5dGVTdHJpbmcga2V5KHdvcmQuUmlnaHQod29yZC5HZXRMZW5ndGgoKSAtIDEpKTsKICAgICBhdXRvIHBPYmogPSBtX3BTeW50YXgtPlJlYWROZXh0T2JqZWN0KGZhbHNlLCBmYWxzZSwgMCk7CiAgICAgaWYgKCFrZXkuSXNFbXB0eSgpKSB7CiAgICAgICB1aW50MzJfdCBkd09iak51bSA9IHBPYmogPyBwT2JqLT5HZXRPYmpOdW0oKSA6IDA7CiAgICAgICBpZiAoZHdPYmpOdW0pCi0gICAgICAgIHBEaWN0LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KGtleSwgbV9wRG9jdW1lbnQsIGR3T2JqTnVtKTsKKyAgICAgICAgcERpY3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oa2V5LCBtX3BEb2N1bWVudC5HZXQoKSwgZHdPYmpOdW0pOwogICAgICAgZWxzZQogICAgICAgICBwRGljdC0+U2V0Rm9yKGtleSwgc3RkOjptb3ZlKHBPYmopKTsKICAgICB9CkBAIC02NDcsNyArNjMzLDcgQEAKICAgaWYgKHBEaWN0LT5LZXlFeGlzdCgiQ29sb3JTcGFjZSIpKSB7CiAgICAgcENTT2JqID0gcERpY3QtPkdldERpcmVjdE9iamVjdEZvcigiQ29sb3JTcGFjZSIpOwogICAgIGlmIChwQ1NPYmotPklzTmFtZSgpKSB7Ci0gICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gcENTT2JqLT5HZXRTdHJpbmcoKTsKKyAgICAgIEJ5dGVTdHJpbmcgbmFtZSA9IHBDU09iai0+R2V0U3RyaW5nKCk7CiAgICAgICBpZiAobmFtZSAhPSAiRGV2aWNlUkdCIiAmJiBuYW1lICE9ICJEZXZpY2VHcmF5IiAmJiBuYW1lICE9ICJEZXZpY2VDTVlLIikgewogICAgICAgICBwQ1NPYmogPSBGaW5kUmVzb3VyY2VPYmooIkNvbG9yU3BhY2UiLCBuYW1lKTsKICAgICAgICAgaWYgKHBDU09iaiAmJiBwQ1NPYmotPklzSW5saW5lKCkpCkBAIC02NTcsNyArNjQzLDcgQEAKICAgfQogICBwRGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIlN1YnR5cGUiLCAiSW1hZ2UiKTsKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfU3RyZWFtPiBwU3RyZWFtID0KLSAgICAgIG1fcFN5bnRheC0+UmVhZElubGluZVN0cmVhbShtX3BEb2N1bWVudCwgc3RkOjptb3ZlKHBEaWN0KSwgcENTT2JqKTsKKyAgICAgIG1fcFN5bnRheC0+UmVhZElubGluZVN0cmVhbShtX3BEb2N1bWVudC5HZXQoKSwgc3RkOjptb3ZlKHBEaWN0KSwgcENTT2JqKTsKICAgd2hpbGUgKDEpIHsKICAgICBDUERGX1N0cmVhbVBhcnNlcjo6U3ludGF4VHlwZSB0eXBlID0gbV9wU3ludGF4LT5QYXJzZU5leHRFbGVtZW50KCk7CiAgICAgaWYgKHR5cGUgPT0gQ1BERl9TdHJlYW1QYXJzZXI6OkVuZE9mRGF0YSkgewpAQCAtNjcwLDcgKzY1NiwxMSBAQAogICAgICAgYnJlYWs7CiAgICAgfQogICB9Ci0gIEFkZEltYWdlKHN0ZDo6bW92ZShwU3RyZWFtKSk7CisgIENQREZfSW1hZ2VPYmplY3QqIHBPYmogPSBBZGRJbWFnZShzdGQ6Om1vdmUocFN0cmVhbSkpOworICAvLyBSZWNvcmQgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGlzIGltYWdlLCBzbyByZW5kZXJpbmcgY29kZSBjYW4gZHJhdyBpdAorICAvLyBwcm9wZXJseS4KKyAgaWYgKHBPYmogJiYgcE9iai0+R2V0SW1hZ2UoKS0+SXNNYXNrKCkpCisgICAgbV9wT2JqZWN0SG9sZGVyLT5BZGRJbWFnZU1hc2tCb3VuZGluZ0JveChwT2JqLT5HZXRSZWN0KCkpOwogfQogCiB2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0JlZ2luTWFya2VkQ29udGVudCgpIHsKQEAgLTczNiwxMCArNzI2LDE0IEBACiB9CiAKIHZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRXhlY3V0ZVhPYmplY3QoKSB7Ci0gIENGWF9CeXRlU3RyaW5nIG5hbWUgPSBHZXRTdHJpbmcoMCk7CisgIEJ5dGVTdHJpbmcgbmFtZSA9IEdldFN0cmluZygwKTsKICAgaWYgKG5hbWUgPT0gbV9MYXN0SW1hZ2VOYW1lICYmIG1fcExhc3RJbWFnZSAmJiBtX3BMYXN0SW1hZ2UtPkdldFN0cmVhbSgpICYmCiAgICAgICBtX3BMYXN0SW1hZ2UtPkdldFN0cmVhbSgpLT5HZXRPYmpOdW0oKSkgewotICAgIEFkZEltYWdlKG1fcExhc3RJbWFnZSk7CisgICAgQ1BERl9JbWFnZU9iamVjdCogcE9iaiA9IEFkZEltYWdlKG1fcExhc3RJbWFnZSk7CisgICAgLy8gUmVjb3JkIHRoZSBib3VuZGluZyBib3ggb2YgdGhpcyBpbWFnZSwgc28gcmVuZGVyaW5nIGNvZGUgY2FuIGRyYXcgaXQKKyAgICAvLyBwcm9wZXJseS4KKyAgICBpZiAocE9iaiAmJiBwT2JqLT5HZXRJbWFnZSgpLT5Jc01hc2soKSkKKyAgICAgIG1fcE9iamVjdEhvbGRlci0+QWRkSW1hZ2VNYXNrQm91bmRpbmdCb3gocE9iai0+R2V0UmVjdCgpKTsKICAgICByZXR1cm47CiAgIH0KIApAQCAtNzQ5LDcgKzc0Myw3IEBACiAgICAgcmV0dXJuOwogICB9CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgdHlwZTsKKyAgQnl0ZVN0cmluZyB0eXBlOwogICBpZiAocFhPYmplY3QtPkdldERpY3QoKSkKICAgICB0eXBlID0gcFhPYmplY3QtPkdldERpY3QoKS0+R2V0U3RyaW5nRm9yKCJTdWJ0eXBlIik7CiAKQEAgLTc2MCwyOCArNzU0LDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFkZEltYWdlKHBYT2JqZWN0LT5HZXRPYmpOdW0oKSk7CiAKICAgICBtX0xhc3RJbWFnZU5hbWUgPSBuYW1lOwotICAgIG1fcExhc3RJbWFnZSA9IHBPYmotPkdldEltYWdlKCk7Ci0gICAgaWYgKCFtX3BPYmplY3RIb2xkZXItPkhhc0ltYWdlTWFzaygpKQotICAgICAgbV9wT2JqZWN0SG9sZGVyLT5TZXRIYXNJbWFnZU1hc2sobV9wTGFzdEltYWdlLT5Jc01hc2soKSk7CisgICAgaWYgKHBPYmopIHsKKyAgICAgIG1fcExhc3RJbWFnZSA9IHBPYmotPkdldEltYWdlKCk7CisgICAgICBpZiAobV9wTGFzdEltYWdlLT5Jc01hc2soKSkKKyAgICAgICAgbV9wT2JqZWN0SG9sZGVyLT5BZGRJbWFnZU1hc2tCb3VuZGluZ0JveChwT2JqLT5HZXRSZWN0KCkpOworICAgIH0KICAgfSBlbHNlIGlmICh0eXBlID09ICJGb3JtIikgewogICAgIEFkZEZvcm0ocFhPYmplY3QpOwogICB9CiB9CiAKIHZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRGb3JtKENQREZfU3RyZWFtKiBwU3RyZWFtKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0Zvcm1PYmplY3Q+IHBGb3JtT2JqKG5ldyBDUERGX0Zvcm1PYmplY3QpOwotICBwRm9ybU9iai0+bV9wRm9ybS5yZXNldCgKLSAgICAgIG5ldyBDUERGX0Zvcm0obV9wRG9jdW1lbnQsIG1fcFBhZ2VSZXNvdXJjZXMsIHBTdHJlYW0sIG1fcFJlc291cmNlcykpOwotICBwRm9ybU9iai0+bV9Gb3JtTWF0cml4ID0gbV9wQ3VyU3RhdGVzLT5tX0NUTTsKLSAgcEZvcm1PYmotPm1fRm9ybU1hdHJpeC5Db25jYXQobV9tdENvbnRlbnRUb1VzZXIpOwogICBDUERGX0FsbFN0YXRlcyBzdGF0dXM7CiAgIHN0YXR1cy5tX0dlbmVyYWxTdGF0ZSA9IG1fcEN1clN0YXRlcy0+bV9HZW5lcmFsU3RhdGU7CiAgIHN0YXR1cy5tX0dyYXBoU3RhdGUgPSBtX3BDdXJTdGF0ZXMtPm1fR3JhcGhTdGF0ZTsKICAgc3RhdHVzLm1fQ29sb3JTdGF0ZSA9IG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlOwogICBzdGF0dXMubV9UZXh0U3RhdGUgPSBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlOwotICBwRm9ybU9iai0+bV9wRm9ybS0+UGFyc2VDb250ZW50KCZzdGF0dXMsIG51bGxwdHIsIG51bGxwdHIsIG1fTGV2ZWwgKyAxKTsKKyAgYXV0byBmb3JtID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRm9ybT4oCisgICAgICBtX3BEb2N1bWVudC5HZXQoKSwgbV9wUGFnZVJlc291cmNlcy5HZXQoKSwgcFN0cmVhbSwgbV9wUmVzb3VyY2VzLkdldCgpKTsKKyAgZm9ybS0+UGFyc2VDb250ZW50V2l0aFBhcmFtcygmc3RhdHVzLCBudWxscHRyLCBudWxscHRyLCBtX1BhcnNlZFNldC5HZXQoKSk7CisKKyAgQ0ZYX01hdHJpeCBtYXRyaXggPSBtX3BDdXJTdGF0ZXMtPm1fQ1RNOworICBtYXRyaXguQ29uY2F0KG1fbXRDb250ZW50VG9Vc2VyKTsKKworICBhdXRvIHBGb3JtT2JqID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRm9ybU9iamVjdD4oc3RkOjptb3ZlKGZvcm0pLCBtYXRyaXgpOwogICBpZiAoIW1fcE9iamVjdEhvbGRlci0+QmFja2dyb3VuZEFscGhhTmVlZGVkKCkgJiYKLSAgICAgIHBGb3JtT2JqLT5tX3BGb3JtLT5CYWNrZ3JvdW5kQWxwaGFOZWVkZWQoKSkgeworICAgICAgcEZvcm1PYmotPmZvcm0oKS0+QmFja2dyb3VuZEFscGhhTmVlZGVkKCkpIHsKICAgICBtX3BPYmplY3RIb2xkZXItPlNldEJhY2tncm91bmRBbHBoYU5lZWRlZCh0cnVlKTsKICAgfQogICBwRm9ybU9iai0+Q2FsY0JvdW5kaW5nQm94KCk7CkBAIC03OTUsMjMgKzc5MywyNCBAQAogICAgIHJldHVybiBudWxscHRyOwogCiAgIGF1dG8gcEltYWdlT2JqID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfSW1hZ2VPYmplY3Q+KCk7Ci0gIHBJbWFnZU9iai0+U2V0T3duZWRJbWFnZSgKLSAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0ltYWdlPihtX3BEb2N1bWVudCwgc3RkOjptb3ZlKHBTdHJlYW0pKSk7CisgIHBJbWFnZU9iai0+U2V0SW1hZ2UoCisgICAgICBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERl9JbWFnZT4obV9wRG9jdW1lbnQuR2V0KCksIHN0ZDo6bW92ZShwU3RyZWFtKSkpOwogICByZXR1cm4gQWRkSW1hZ2VPYmplY3Qoc3RkOjptb3ZlKHBJbWFnZU9iaikpOwogfQogCiBDUERGX0ltYWdlT2JqZWN0KiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkFkZEltYWdlKHVpbnQzMl90IHN0cmVhbU9iak51bSkgewogICBhdXRvIHBJbWFnZU9iaiA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0ltYWdlT2JqZWN0PigpOwotICBwSW1hZ2VPYmotPlNldFVub3duZWRJbWFnZShtX3BEb2N1bWVudC0+TG9hZEltYWdlRnJvbVBhZ2VEYXRhKHN0cmVhbU9iak51bSkpOworICBwSW1hZ2VPYmotPlNldEltYWdlKG1fcERvY3VtZW50LT5Mb2FkSW1hZ2VGcm9tUGFnZURhdGEoc3RyZWFtT2JqTnVtKSk7CiAgIHJldHVybiBBZGRJbWFnZU9iamVjdChzdGQ6Om1vdmUocEltYWdlT2JqKSk7CiB9CiAKLUNQREZfSW1hZ2VPYmplY3QqIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6QWRkSW1hZ2UoQ1BERl9JbWFnZSogcEltYWdlKSB7CitDUERGX0ltYWdlT2JqZWN0KiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkFkZEltYWdlKAorICAgIGNvbnN0IFJldGFpblB0cjxDUERGX0ltYWdlPiYgcEltYWdlKSB7CiAgIGlmICghcEltYWdlKQogICAgIHJldHVybiBudWxscHRyOwogCiAgIGF1dG8gcEltYWdlT2JqID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfSW1hZ2VPYmplY3Q+KCk7Ci0gIHBJbWFnZU9iai0+U2V0VW5vd25lZEltYWdlKAorICBwSW1hZ2VPYmotPlNldEltYWdlKAogICAgICAgbV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPkdldEltYWdlKHBJbWFnZS0+R2V0U3RyZWFtKCktPkdldE9iak51bSgpKSk7CiAKICAgcmV0dXJuIEFkZEltYWdlT2JqZWN0KHN0ZDo6bW92ZShwSW1hZ2VPYmopKTsKQEAgLTgzNyw3ICs4MzYsNyBAQAogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9FbmRJbWFnZSgpIHt9CiAKIHZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfRW5kTWFya2VkQ29udGVudCgpIHsKLSAgaWYgKG1fQ3VyQ29udGVudE1hcmspCisgIGlmIChtX0N1ckNvbnRlbnRNYXJrLkhhc1JlZigpKQogICAgIG1fQ3VyQ29udGVudE1hcmsuRGVsZXRlTGFzdE1hcmsoKTsKIH0KIApAQCAtODY0LDE5ICs4NjMsMTkgQEAKIH0KIAogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRHcmF5X0ZpbGwoKSB7Ci0gIEZYX0ZMT0FUIHZhbHVlID0gR2V0TnVtYmVyKDApOworICBmbG9hdCB2YWx1ZSA9IEdldE51bWJlcigwKTsKICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFR1JBWSk7CiAgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLlNldEZpbGxDb2xvcihwQ1MsICZ2YWx1ZSwgMSk7CiB9CiAKIHZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0R3JheV9TdHJva2UoKSB7Ci0gIEZYX0ZMT0FUIHZhbHVlID0gR2V0TnVtYmVyKDApOworICBmbG9hdCB2YWx1ZSA9IEdldE51bWJlcigwKTsKICAgQ1BERl9Db2xvclNwYWNlKiBwQ1MgPSBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFR1JBWSk7CiAgIG1fcEN1clN0YXRlcy0+bV9Db2xvclN0YXRlLlNldFN0cm9rZUNvbG9yKHBDUywgJnZhbHVlLCAxKTsKIH0KIAogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRFeHRlbmRHcmFwaFN0YXRlKCkgewotICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gR2V0U3RyaW5nKDApOworICBCeXRlU3RyaW5nIG5hbWUgPSBHZXRTdHJpbmcoMCk7CiAgIENQREZfRGljdGlvbmFyeSogcEdTID0gVG9EaWN0aW9uYXJ5KEZpbmRSZXNvdXJjZU9iaigiRXh0R1N0YXRlIiwgbmFtZSkpOwogICBpZiAoIXBHUykgewogICAgIG1fYlJlc291cmNlTWlzc2luZyA9IHRydWU7CkBAIC04ODYsMTQgKzg4NSwxMyBAQAogfQogCiB2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0Nsb3NlUGF0aCgpIHsKLSAgaWYgKG1fUGF0aFBvaW50Q291bnQgPT0gMCkgeworICBpZiAobV9QYXRoUG9pbnRzLmVtcHR5KCkpCiAgICAgcmV0dXJuOwotICB9Ci0gIGlmIChtX1BhdGhTdGFydFggIT0gbV9QYXRoQ3VycmVudFggfHwgbV9QYXRoU3RhcnRZICE9IG1fUGF0aEN1cnJlbnRZKSB7CisKKyAgaWYgKG1fUGF0aFN0YXJ0WCAhPSBtX1BhdGhDdXJyZW50WCB8fCBtX1BhdGhTdGFydFkgIT0gbV9QYXRoQ3VycmVudFkpCiAgICAgQWRkUGF0aFBvaW50KG1fUGF0aFN0YXJ0WCwgbV9QYXRoU3RhcnRZLCBGWFBUX1RZUEU6OkxpbmVUbywgdHJ1ZSk7Ci0gIH0gZWxzZSBpZiAobV9wUGF0aFBvaW50c1ttX1BhdGhQb2ludENvdW50IC0gMV0ubV9UeXBlICE9IEZYUFRfVFlQRTo6TW92ZVRvKSB7Ci0gICAgbV9wUGF0aFBvaW50c1ttX1BhdGhQb2ludENvdW50IC0gMV0ubV9DbG9zZUZpZ3VyZSA9IHRydWU7Ci0gIH0KKyAgZWxzZSBpZiAobV9QYXRoUG9pbnRzLmJhY2soKS5tX1R5cGUgIT0gRlhQVF9UWVBFOjpNb3ZlVG8pCisgICAgbV9QYXRoUG9pbnRzLmJhY2soKS5tX0Nsb3NlRmlndXJlID0gdHJ1ZTsKIH0KIAogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRGbGF0KCkgewpAQCAtOTE2LDcgKzkxNCw3IEBACiAgIGlmIChtX1BhcmFtQ291bnQgIT0gNCkKICAgICByZXR1cm47CiAKLSAgRlhfRkxPQVQgdmFsdWVzWzRdOworICBmbG9hdCB2YWx1ZXNbNF07CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgdmFsdWVzW2ldID0gR2V0TnVtYmVyKDMgLSBpKTsKICAgfQpAQCAtOTI4LDcgKzkyNiw3IEBACiAgIGlmIChtX1BhcmFtQ291bnQgIT0gNCkKICAgICByZXR1cm47CiAKLSAgRlhfRkxPQVQgdmFsdWVzWzRdOworICBmbG9hdCB2YWx1ZXNbNF07CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICAgdmFsdWVzW2ldID0gR2V0TnVtYmVyKDMgLSBpKTsKICAgfQpAQCAtOTYyLDcgKzk2MCw3IEBACiB9CiAKIHZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2F2ZUdyYXBoU3RhdGUoKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0FsbFN0YXRlcz4gcFN0YXRlcyhuZXcgQ1BERl9BbGxTdGF0ZXMpOworICBhdXRvIHBTdGF0ZXMgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9BbGxTdGF0ZXM+KCk7CiAgIHBTdGF0ZXMtPkNvcHkoKm1fcEN1clN0YXRlcyk7CiAgIG1fU3RhdGVTdGFjay5wdXNoX2JhY2soc3RkOjptb3ZlKHBTdGF0ZXMpKTsKIH0KQEAgLTk3NiwxNSArOTc0LDEyIEBACiB9CiAKIHZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfUmVjdGFuZ2xlKCkgewotICBGWF9GTE9BVCB4ID0gR2V0TnVtYmVyKDMpLCB5ID0gR2V0TnVtYmVyKDIpOwotICBGWF9GTE9BVCB3ID0gR2V0TnVtYmVyKDEpLCBoID0gR2V0TnVtYmVyKDApOworICBmbG9hdCB4ID0gR2V0TnVtYmVyKDMpLCB5ID0gR2V0TnVtYmVyKDIpOworICBmbG9hdCB3ID0gR2V0TnVtYmVyKDEpLCBoID0gR2V0TnVtYmVyKDApOwogICBBZGRQYXRoUmVjdCh4LCB5LCB3LCBoKTsKIH0KIAotdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkFkZFBhdGhSZWN0KEZYX0ZMT0FUIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGgpIHsKK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRQYXRoUmVjdChmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB3LCBmbG9hdCBoKSB7CiAgIEFkZFBhdGhQb2ludCh4LCB5LCBGWFBUX1RZUEU6Ok1vdmVUbywgZmFsc2UpOwogICBBZGRQYXRoUG9pbnQoeCArIHcsIHksIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7CiAgIEFkZFBhdGhQb2ludCh4ICsgdywgeSArIGgsIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7CkBAIC05OTYsNyArOTkxLDcgQEAKICAgaWYgKG1fUGFyYW1Db3VudCAhPSAzKQogICAgIHJldHVybjsKIAotICBGWF9GTE9BVCB2YWx1ZXNbM107CisgIGZsb2F0IHZhbHVlc1szXTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICB2YWx1ZXNbaV0gPSBHZXROdW1iZXIoMiAtIGkpOwogICB9CkBAIC0xMDA4LDcgKzEwMDMsNyBAQAogICBpZiAobV9QYXJhbUNvdW50ICE9IDMpCiAgICAgcmV0dXJuOwogCi0gIEZYX0ZMT0FUIHZhbHVlc1szXTsKKyAgZmxvYXQgdmFsdWVzWzNdOwogICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewogICAgIHZhbHVlc1tpXSA9IEdldE51bWJlcigyIC0gaSk7CiAgIH0KQEAgLTEwMjgsNyArMTAyMyw3IEBACiB9CiAKIHZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q29sb3JfRmlsbCgpIHsKLSAgRlhfRkxPQVQgdmFsdWVzWzRdOworICBmbG9hdCB2YWx1ZXNbNF07CiAgIGludCBuYXJncyA9IG1fUGFyYW1Db3VudDsKICAgaWYgKG5hcmdzID4gNCkgewogICAgIG5hcmdzID0gNDsKQEAgLTEwNDAsNyArMTAzNSw3IEBACiB9CiAKIHZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2V0Q29sb3JfU3Ryb2tlKCkgewotICBGWF9GTE9BVCB2YWx1ZXNbNF07CisgIGZsb2F0IHZhbHVlc1s0XTsKICAgaW50IG5hcmdzID0gbV9QYXJhbUNvdW50OwogICBpZiAobmFyZ3MgPiA0KSB7CiAgICAgbmFyZ3MgPSA0OwpAQCAtMTA2MCw5ICsxMDU1LDkgQEAKICAgdWludDMyX3QgbnZhbHVlcyA9IG5hcmdzOwogICBpZiAocExhc3RQYXJhbS0+SXNOYW1lKCkpCiAgICAgbnZhbHVlcy0tOwotICBGWF9GTE9BVCogdmFsdWVzID0gbnVsbHB0cjsKKyAgZmxvYXQqIHZhbHVlcyA9IG51bGxwdHI7CiAgIGlmIChudmFsdWVzKSB7Ci0gICAgdmFsdWVzID0gRlhfQWxsb2MoRlhfRkxPQVQsIG52YWx1ZXMpOworICAgIHZhbHVlcyA9IEZYX0FsbG9jKGZsb2F0LCBudmFsdWVzKTsKICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbnZhbHVlczsgaSsrKSB7CiAgICAgICB2YWx1ZXNbaV0gPSBHZXROdW1iZXIobmFyZ3MgLSBpIC0gMSk7CiAgICAgfQpAQCAtMTA4OCw5ICsxMDgzLDkgQEAKICAgaWYgKHBMYXN0UGFyYW0tPklzTmFtZSgpKQogICAgIG52YWx1ZXMtLTsKIAotICBGWF9GTE9BVCogdmFsdWVzID0gbnVsbHB0cjsKKyAgZmxvYXQqIHZhbHVlcyA9IG51bGxwdHI7CiAgIGlmIChudmFsdWVzKSB7Ci0gICAgdmFsdWVzID0gRlhfQWxsb2MoRlhfRkxPQVQsIG52YWx1ZXMpOworICAgIHZhbHVlcyA9IEZYX0FsbG9jKGZsb2F0LCBudmFsdWVzKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IG52YWx1ZXM7IGkrKykgewogICAgICAgdmFsdWVzW2ldID0gR2V0TnVtYmVyKG5hcmdzIC0gaSAtIDEpOwogICAgIH0KQEAgLTExMTgsMTUgKzExMTMsMTQgQEAKICAgaWYgKCFwU2hhZGluZy0+SXNTaGFkaW5nT2JqZWN0KCkgfHwgIXBTaGFkaW5nLT5Mb2FkKCkpCiAgICAgcmV0dXJuOwogCi0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1NoYWRpbmdPYmplY3Q+IHBPYmoobmV3IENQREZfU2hhZGluZ09iamVjdCk7Ci0gIHBPYmotPm1fcFNoYWRpbmcgPSBwU2hhZGluZzsKKyAgQ0ZYX01hdHJpeCBtYXRyaXggPSBtX3BDdXJTdGF0ZXMtPm1fQ1RNOworICBtYXRyaXguQ29uY2F0KG1fbXRDb250ZW50VG9Vc2VyKTsKKyAgYXV0byBwT2JqID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU2hhZGluZ09iamVjdD4ocFNoYWRpbmcsIG1hdHJpeCk7CiAgIFNldEdyYXBoaWNTdGF0ZXMocE9iai5nZXQoKSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gIHBPYmotPm1fTWF0cml4ID0gbV9wQ3VyU3RhdGVzLT5tX0NUTTsKLSAgcE9iai0+bV9NYXRyaXguQ29uY2F0KG1fbXRDb250ZW50VG9Vc2VyKTsKICAgQ0ZYX0Zsb2F0UmVjdCBiYm94ID0KLSAgICAgIHBPYmotPm1fQ2xpcFBhdGggPyBwT2JqLT5tX0NsaXBQYXRoLkdldENsaXBCb3goKSA6IG1fQkJveDsKKyAgICAgIHBPYmotPm1fQ2xpcFBhdGguSGFzUmVmKCkgPyBwT2JqLT5tX0NsaXBQYXRoLkdldENsaXBCb3goKSA6IG1fQkJveDsKICAgaWYgKHBTaGFkaW5nLT5Jc01lc2hTaGFkaW5nKCkpCi0gICAgYmJveC5JbnRlcnNlY3QoR2V0U2hhZGluZ0JCb3gocFNoYWRpbmcsIHBPYmotPm1fTWF0cml4KSk7CisgICAgYmJveC5JbnRlcnNlY3QoR2V0U2hhZGluZ0JCb3gocFNoYWRpbmcsIHBPYmotPm1hdHJpeCgpKSk7CiAgIHBPYmotPm1fTGVmdCA9IGJib3gubGVmdDsKICAgcE9iai0+bV9SaWdodCA9IGJib3gucmlnaHQ7CiAgIHBPYmotPm1fVG9wID0gYmJveC50b3A7CkBAIC0xMTQ5LDcgKzExNDMsNyBAQAogfQogCiB2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX1NldEZvbnQoKSB7Ci0gIEZYX0ZMT0FUIGZzID0gR2V0TnVtYmVyKDApOworICBmbG9hdCBmcyA9IEdldE51bWJlcigwKTsKICAgaWYgKGZzID09IDApIHsKICAgICBmcyA9IG1fRGVmRm9udFNpemU7CiAgIH0KQEAgLTExNjAsOSArMTE1NCw4IEBACiAgIH0KIH0KIAotQ1BERl9PYmplY3QqIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6RmluZFJlc291cmNlT2JqKAotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiB0eXBlLAotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKSB7CitDUERGX09iamVjdCogQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpGaW5kUmVzb3VyY2VPYmooY29uc3QgQnl0ZVN0cmluZyYgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBuYW1lKSB7CiAgIGlmICghbV9wUmVzb3VyY2VzKQogICAgIHJldHVybiBudWxscHRyOwogICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wUmVzb3VyY2VzLT5HZXREaWN0Rm9yKHR5cGUpOwpAQCAtMTE3NSwyOSArMTE2OCwyOSBAQAogICByZXR1cm4gcFBhZ2VEaWN0ID8gcFBhZ2VEaWN0LT5HZXREaXJlY3RPYmplY3RGb3IobmFtZSkgOiBudWxscHRyOwogfQogCi1DUERGX0ZvbnQqIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6RmluZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpIHsKK0NQREZfRm9udCogQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpGaW5kRm9udChjb25zdCBCeXRlU3RyaW5nJiBuYW1lKSB7CiAgIENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0ID0gVG9EaWN0aW9uYXJ5KEZpbmRSZXNvdXJjZU9iaigiRm9udCIsIG5hbWUpKTsKICAgaWYgKCFwRm9udERpY3QpIHsKICAgICBtX2JSZXNvdXJjZU1pc3NpbmcgPSB0cnVlOwotICAgIHJldHVybiBDUERGX0ZvbnQ6OkdldFN0b2NrRm9udChtX3BEb2N1bWVudCwgIkhlbHZldGljYSIpOworICAgIHJldHVybiBDUERGX0ZvbnQ6OkdldFN0b2NrRm9udChtX3BEb2N1bWVudC5HZXQoKSwgIkhlbHZldGljYSIpOwogICB9CiAKICAgQ1BERl9Gb250KiBwRm9udCA9IG1fcERvY3VtZW50LT5Mb2FkRm9udChwRm9udERpY3QpOwogICBpZiAocEZvbnQgJiYgcEZvbnQtPklzVHlwZTNGb250KCkpIHsKLSAgICBwRm9udC0+QXNUeXBlM0ZvbnQoKS0+U2V0UGFnZVJlc291cmNlcyhtX3BSZXNvdXJjZXMpOworICAgIHBGb250LT5Bc1R5cGUzRm9udCgpLT5TZXRQYWdlUmVzb3VyY2VzKG1fcFJlc291cmNlcy5HZXQoKSk7CiAgICAgcEZvbnQtPkFzVHlwZTNGb250KCktPkNoZWNrVHlwZTNGb250TWV0cmljcygpOwogICB9CiAgIHJldHVybiBwRm9udDsKIH0KIAogQ1BERl9Db2xvclNwYWNlKiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkZpbmRDb2xvclNwYWNlKAotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKSB7CisgICAgY29uc3QgQnl0ZVN0cmluZyYgbmFtZSkgewogICBpZiAobmFtZSA9PSAiUGF0dGVybiIpIHsKICAgICByZXR1cm4gQ1BERl9Db2xvclNwYWNlOjpHZXRTdG9ja0NTKFBERkNTX1BBVFRFUk4pOwogICB9CiAgIGlmIChuYW1lID09ICJEZXZpY2VHcmF5IiB8fCBuYW1lID09ICJEZXZpY2VDTVlLIiB8fCBuYW1lID09ICJEZXZpY2VSR0IiKSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZGVmbmFtZSA9ICJEZWZhdWx0IjsKLSAgICBkZWZuYW1lICs9IG5hbWUuTWlkKDcpOworICAgIEJ5dGVTdHJpbmcgZGVmbmFtZSA9ICJEZWZhdWx0IjsKKyAgICBkZWZuYW1lICs9IG5hbWUuUmlnaHQobmFtZS5HZXRMZW5ndGgoKSAtIDcpOwogICAgIENQREZfT2JqZWN0KiBwRGVmT2JqID0gRmluZFJlc291cmNlT2JqKCJDb2xvclNwYWNlIiwgZGVmbmFtZSk7CiAgICAgaWYgKCFwRGVmT2JqKSB7CiAgICAgICBpZiAobmFtZSA9PSAiRGV2aWNlR3JheSIpIHsKQEAgLTEyMTgsNyArMTIxMSw3IEBACiAgIHJldHVybiBtX3BEb2N1bWVudC0+TG9hZENvbG9yU3BhY2UocENTT2JqKTsKIH0KIAotQ1BERl9QYXR0ZXJuKiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkZpbmRQYXR0ZXJuKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLAorQ1BERl9QYXR0ZXJuKiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkZpbmRQYXR0ZXJuKGNvbnN0IEJ5dGVTdHJpbmcmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hhZGluZykgewogICBDUERGX09iamVjdCogcFBhdHRlcm4gPQogICAgICAgRmluZFJlc291cmNlT2JqKGJTaGFkaW5nID8gIlNoYWRpbmciIDogIlBhdHRlcm4iLCBuYW1lKTsKQEAgLTEyMzAsOSArMTIyMyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX1BhcmVudE1hdHJpeCk7CiB9CiAKLXZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRUZXh0T2JqZWN0KENGWF9CeXRlU3RyaW5nKiBwU3RycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZJbml0S2VybmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwS2VybmluZywKK3ZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpBZGRUZXh0T2JqZWN0KEJ5dGVTdHJpbmcqIHBTdHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZkluaXRLZXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHBLZXJuaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5zZWdzKSB7CiAgIENQREZfRm9udCogcEZvbnQgPSBtX3BDdXJTdGF0ZXMtPm1fVGV4dFN0YXRlLkdldEZvbnQoKTsKICAgaWYgKCFwRm9udCkgewpAQCAtMTI1NiwyMSArMTI0OSwyMiBAQAogICAgICAgcEZvbnQtPklzVHlwZTNGb250KCkgPyBUZXh0UmVuZGVyaW5nTW9kZTo6TU9ERV9GSUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGUuR2V0VGV4dE1vZGUoKTsKICAgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1RleHRPYmplY3Q+IHBUZXh0KG5ldyBDUERGX1RleHRPYmplY3QpOworICAgIGF1dG8gcFRleHQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9UZXh0T2JqZWN0PigpOwogICAgIG1fcExhc3RUZXh0T2JqZWN0ID0gcFRleHQuZ2V0KCk7Ci0gICAgU2V0R3JhcGhpY1N0YXRlcyhtX3BMYXN0VGV4dE9iamVjdCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgU2V0R3JhcGhpY1N0YXRlcyhtX3BMYXN0VGV4dE9iamVjdC5HZXQoKSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgaWYgKFRleHRSZW5kZXJpbmdNb2RlSXNTdHJva2VNb2RlKHRleHRfbW9kZSkpIHsKLSAgICAgIEZYX0ZMT0FUKiBwQ1RNID0gcFRleHQtPm1fVGV4dFN0YXRlLkdldE11dGFibGVDVE0oKTsKKyAgICAgIGZsb2F0KiBwQ1RNID0gcFRleHQtPm1fVGV4dFN0YXRlLkdldE11dGFibGVDVE0oKTsKICAgICAgIHBDVE1bMF0gPSBtX3BDdXJTdGF0ZXMtPm1fQ1RNLmE7CiAgICAgICBwQ1RNWzFdID0gbV9wQ3VyU3RhdGVzLT5tX0NUTS5jOwogICAgICAgcENUTVsyXSA9IG1fcEN1clN0YXRlcy0+bV9DVE0uYjsKICAgICAgIHBDVE1bM10gPSBtX3BDdXJTdGF0ZXMtPm1fQ1RNLmQ7CiAgICAgfQogICAgIHBUZXh0LT5TZXRTZWdtZW50cyhwU3RycywgcEtlcm5pbmcsIG5zZWdzKTsKLSAgICBwVGV4dC0+bV9Qb3MgPSBtX210Q29udGVudFRvVXNlci5UcmFuc2Zvcm0oCi0gICAgICAgIG1fcEN1clN0YXRlcy0+bV9DVE0uVHJhbnNmb3JtKG1fcEN1clN0YXRlcy0+bV9UZXh0TWF0cml4LlRyYW5zZm9ybSgKLSAgICAgICAgICAgIENGWF9Qb2ludEYobV9wQ3VyU3RhdGVzLT5tX1RleHRQb3MueCwKLSAgICAgICAgICAgICAgICAgICAgICAgbV9wQ3VyU3RhdGVzLT5tX1RleHRQb3MueSArIG1fcEN1clN0YXRlcy0+bV9UZXh0UmlzZSkpKSk7CisgICAgcFRleHQtPlNldFBvc2l0aW9uKAorICAgICAgICBtX210Q29udGVudFRvVXNlci5UcmFuc2Zvcm0obV9wQ3VyU3RhdGVzLT5tX0NUTS5UcmFuc2Zvcm0oCisgICAgICAgICAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dE1hdHJpeC5UcmFuc2Zvcm0oQ0ZYX1BvaW50RigKKyAgICAgICAgICAgICAgICBtX3BDdXJTdGF0ZXMtPm1fVGV4dFBvcy54LAorICAgICAgICAgICAgICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0UG9zLnkgKyBtX3BDdXJTdGF0ZXMtPm1fVGV4dFJpc2UpKSkpKTsKIAogICAgIG1fcEN1clN0YXRlcy0+bV9UZXh0UG9zICs9CiAgICAgICAgIHBUZXh0LT5DYWxjUG9zaXRpb25EYXRhKG1fcEN1clN0YXRlcy0+bV9UZXh0SG9yelNjYWxlKTsKQEAgLTEyOTUsNyArMTI4OSw3IEBACiB9CiAKIHZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpIYW5kbGVfU2hvd1RleHQoKSB7Ci0gIENGWF9CeXRlU3RyaW5nIHN0ciA9IEdldFN0cmluZygwKTsKKyAgQnl0ZVN0cmluZyBzdHIgPSBHZXRTdHJpbmcoMCk7CiAgIGlmIChzdHIuSXNFbXB0eSgpKSB7CiAgICAgcmV0dXJuOwogICB9CkBAIC0xMzIyLDMxICsxMzE2LDI3IEBACiAgICAgfQogICAgIHJldHVybjsKICAgfQotICBDRlhfQnl0ZVN0cmluZyogcFN0cnMgPSBuZXcgQ0ZYX0J5dGVTdHJpbmdbbnNlZ3NdOwotICBGWF9GTE9BVCogcEtlcm5pbmcgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbnNlZ3MpOworICBzdGQ6OnZlY3RvcjxCeXRlU3RyaW5nPiBzdHJzKG5zZWdzKTsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGtlcm5pbmdzKG5zZWdzKTsKICAgc2l6ZV90IGlTZWdtZW50ID0gMDsKLSAgRlhfRkxPQVQgZkluaXRLZXJuaW5nID0gMDsKKyAgZmxvYXQgZkluaXRLZXJuaW5nID0gMDsKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICBDUERGX09iamVjdCogcE9iaiA9IHBBcnJheS0+R2V0RGlyZWN0T2JqZWN0QXQoaSk7CiAgICAgaWYgKHBPYmotPklzU3RyaW5nKCkpIHsKLSAgICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IHBPYmotPkdldFN0cmluZygpOwotICAgICAgaWYgKHN0ci5Jc0VtcHR5KCkpIHsKKyAgICAgIEJ5dGVTdHJpbmcgc3RyID0gcE9iai0+R2V0U3RyaW5nKCk7CisgICAgICBpZiAoc3RyLklzRW1wdHkoKSkKICAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBwU3Ryc1tpU2VnbWVudF0gPSBzdHI7Ci0gICAgICBwS2VybmluZ1tpU2VnbWVudCsrXSA9IDA7CisgICAgICBzdHJzW2lTZWdtZW50XSA9IHN0cjsKKyAgICAgIGtlcm5pbmdzW2lTZWdtZW50KytdID0gMDsKICAgICB9IGVsc2UgewotICAgICAgRlhfRkxPQVQgbnVtID0gcE9iaiA/IHBPYmotPkdldE51bWJlcigpIDogMDsKLSAgICAgIGlmIChpU2VnbWVudCA9PSAwKSB7CisgICAgICBmbG9hdCBudW0gPSBwT2JqLT5HZXROdW1iZXIoKTsKKyAgICAgIGlmIChpU2VnbWVudCA9PSAwKQogICAgICAgICBmSW5pdEtlcm5pbmcgKz0gbnVtOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcEtlcm5pbmdbaVNlZ21lbnQgLSAxXSArPSBudW07Ci0gICAgICB9CisgICAgICBlbHNlCisgICAgICAgIGtlcm5pbmdzW2lTZWdtZW50IC0gMV0gKz0gbnVtOwogICAgIH0KICAgfQotICBBZGRUZXh0T2JqZWN0KHBTdHJzLCBmSW5pdEtlcm5pbmcsIHBLZXJuaW5nLCBpU2VnbWVudCk7Ci0gIGRlbGV0ZVtdIHBTdHJzOwotICBGWF9GcmVlKHBLZXJuaW5nKTsKKyAgQWRkVGV4dE9iamVjdChzdHJzLmRhdGEoKSwgZkluaXRLZXJuaW5nLCBrZXJuaW5ncy5kYXRhKCksIGlTZWdtZW50KTsKIH0KIAogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkhhbmRsZV9TZXRUZXh0TGVhZGluZygpIHsKQEAgLTEzNjgsNyArMTM1OCw3IEBACiAgIHRleHRfbWF0cml4LkNvbmNhdChtX3BDdXJTdGF0ZXMtPm1fVGV4dE1hdHJpeCk7CiAgIHRleHRfbWF0cml4LkNvbmNhdChtX3BDdXJTdGF0ZXMtPm1fQ1RNKTsKICAgdGV4dF9tYXRyaXguQ29uY2F0KG1fbXRDb250ZW50VG9Vc2VyKTsKLSAgRlhfRkxPQVQqIHBUZXh0TWF0cml4ID0gbV9wQ3VyU3RhdGVzLT5tX1RleHRTdGF0ZS5HZXRNdXRhYmxlTWF0cml4KCk7CisgIGZsb2F0KiBwVGV4dE1hdHJpeCA9IG1fcEN1clN0YXRlcy0+bV9UZXh0U3RhdGUuR2V0TXV0YWJsZU1hdHJpeCgpOwogICBwVGV4dE1hdHJpeFswXSA9IHRleHRfbWF0cml4LmE7CiAgIHBUZXh0TWF0cml4WzFdID0gdGV4dF9tYXRyaXguYzsKICAgcFRleHRNYXRyaXhbMl0gPSB0ZXh0X21hdHJpeC5iOwpAQCAtMTQzOSw2OCArMTQyOSw2NCBAQAogCiB2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6SGFuZGxlX0ludmFsaWQoKSB7fQogCi12b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6QWRkUGF0aFBvaW50KEZYX0ZMT0FUIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHksCit2b2lkIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6QWRkUGF0aFBvaW50KGZsb2F0IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYUFRfVFlQRSB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNsb3NlKSB7CisgIC8vIElmIHRoZSBwYXRoIHBvaW50IGlzIHRoZSBzYW1lIG1vdmUgYXMgdGhlIHByZXZpb3VzIG9uZSBhbmQgbmVpdGhlciBvZiB0aGVtCisgIC8vIGNsb3NlcyB0aGUgcGF0aCwgdGhlbiBqdXN0IHNraXAgaXQuCisgIGlmICghY2xvc2UgJiYgdHlwZSA9PSBGWFBUX1RZUEU6Ok1vdmVUbyAmJiAhbV9QYXRoUG9pbnRzLmVtcHR5KCkgJiYKKyAgICAgICFtX1BhdGhQb2ludHMuYmFjaygpLm1fQ2xvc2VGaWd1cmUgJiYKKyAgICAgIG1fUGF0aFBvaW50cy5iYWNrKCkubV9UeXBlID09IHR5cGUgJiYgbV9QYXRoQ3VycmVudFggPT0geCAmJgorICAgICAgbV9QYXRoQ3VycmVudFkgPT0geSkgeworICAgIHJldHVybjsKKyAgfQorCiAgIG1fUGF0aEN1cnJlbnRYID0geDsKICAgbV9QYXRoQ3VycmVudFkgPSB5OwogICBpZiAodHlwZSA9PSBGWFBUX1RZUEU6Ok1vdmVUbyAmJiAhY2xvc2UpIHsKICAgICBtX1BhdGhTdGFydFggPSB4OwogICAgIG1fUGF0aFN0YXJ0WSA9IHk7Ci0gICAgaWYgKG1fUGF0aFBvaW50Q291bnQgJiYKLSAgICAgICAgbV9wUGF0aFBvaW50c1ttX1BhdGhQb2ludENvdW50IC0gMV0uSXNUeXBlQW5kT3BlbihGWFBUX1RZUEU6Ok1vdmVUbykpIHsKLSAgICAgIG1fcFBhdGhQb2ludHNbbV9QYXRoUG9pbnRDb3VudCAtIDFdLm1fUG9pbnQgPSBDRlhfUG9pbnRGKHgsIHkpOworICAgIGlmICghbV9QYXRoUG9pbnRzLmVtcHR5KCkgJiYKKyAgICAgICAgbV9QYXRoUG9pbnRzLmJhY2soKS5Jc1R5cGVBbmRPcGVuKEZYUFRfVFlQRTo6TW92ZVRvKSkgeworICAgICAgbV9QYXRoUG9pbnRzLmJhY2soKS5tX1BvaW50ID0gQ0ZYX1BvaW50Rih4LCB5KTsKICAgICAgIHJldHVybjsKICAgICB9Ci0gIH0gZWxzZSBpZiAobV9QYXRoUG9pbnRDb3VudCA9PSAwKSB7CisgIH0gZWxzZSBpZiAobV9QYXRoUG9pbnRzLmVtcHR5KCkpIHsKICAgICByZXR1cm47CiAgIH0KLSAgbV9QYXRoUG9pbnRDb3VudCsrOwotICBpZiAobV9QYXRoUG9pbnRDb3VudCA+IG1fUGF0aEFsbG9jU2l6ZSkgewotICAgIGludCBuZXdzaXplID0gbV9QYXRoUG9pbnRDb3VudCArIDI1NjsKLSAgICBGWF9QQVRIUE9JTlQqIHBOZXdQb2ludHMgPSBGWF9BbGxvYyhGWF9QQVRIUE9JTlQsIG5ld3NpemUpOwotICAgIGlmIChtX1BhdGhBbGxvY1NpemUpIHsKLSAgICAgIEZYU1lTX21lbWNweShwTmV3UG9pbnRzLCBtX3BQYXRoUG9pbnRzLAotICAgICAgICAgICAgICAgICAgIG1fUGF0aEFsbG9jU2l6ZSAqIHNpemVvZihGWF9QQVRIUE9JTlQpKTsKLSAgICAgIEZYX0ZyZWUobV9wUGF0aFBvaW50cyk7Ci0gICAgfQotICAgIG1fcFBhdGhQb2ludHMgPSBwTmV3UG9pbnRzOwotICAgIG1fUGF0aEFsbG9jU2l6ZSA9IG5ld3NpemU7Ci0gIH0KLSAgbV9wUGF0aFBvaW50c1ttX1BhdGhQb2ludENvdW50IC0gMV0ubV9UeXBlID0gdHlwZTsKLSAgbV9wUGF0aFBvaW50c1ttX1BhdGhQb2ludENvdW50IC0gMV0ubV9DbG9zZUZpZ3VyZSA9IGNsb3NlOwotICBtX3BQYXRoUG9pbnRzW21fUGF0aFBvaW50Q291bnQgLSAxXS5tX1BvaW50ID0gQ0ZYX1BvaW50Rih4LCB5KTsKKyAgbV9QYXRoUG9pbnRzLnB1c2hfYmFjayhGWF9QQVRIUE9JTlQoQ0ZYX1BvaW50Rih4LCB5KSwgdHlwZSwgY2xvc2UpKTsKIH0KIAogdm9pZCBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkFkZFBhdGhPYmplY3QoaW50IEZpbGxUeXBlLCBib29sIGJTdHJva2UpIHsKLSAgaW50IFBhdGhQb2ludENvdW50ID0gbV9QYXRoUG9pbnRDb3VudDsKKyAgc3RkOjp2ZWN0b3I8RlhfUEFUSFBPSU5UPiBQYXRoUG9pbnRzOworICBQYXRoUG9pbnRzLnN3YXAobV9QYXRoUG9pbnRzKTsKICAgdWludDhfdCBQYXRoQ2xpcFR5cGUgPSBtX1BhdGhDbGlwVHlwZTsKLSAgbV9QYXRoUG9pbnRDb3VudCA9IDA7CiAgIG1fUGF0aENsaXBUeXBlID0gMDsKLSAgaWYgKFBhdGhQb2ludENvdW50IDw9IDEpIHsKLSAgICBpZiAoUGF0aFBvaW50Q291bnQgJiYgUGF0aENsaXBUeXBlKSB7CisKKyAgaWYgKFBhdGhQb2ludHMuZW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgaWYgKFBhdGhQb2ludHMuc2l6ZSgpID09IDEpIHsKKyAgICBpZiAoUGF0aENsaXBUeXBlKSB7CiAgICAgICBDUERGX1BhdGggcGF0aDsKICAgICAgIHBhdGguQXBwZW5kUmVjdCgwLCAwLCAwLCAwKTsKICAgICAgIG1fcEN1clN0YXRlcy0+bV9DbGlwUGF0aC5BcHBlbmRQYXRoKHBhdGgsIEZYRklMTF9XSU5ESU5HLCB0cnVlKTsKICAgICB9CiAgICAgcmV0dXJuOwogICB9Ci0gIGlmIChQYXRoUG9pbnRDb3VudCAmJgotICAgICAgbV9wUGF0aFBvaW50c1tQYXRoUG9pbnRDb3VudCAtIDFdLklzVHlwZUFuZE9wZW4oRlhQVF9UWVBFOjpNb3ZlVG8pKSB7Ci0gICAgUGF0aFBvaW50Q291bnQtLTsKLSAgfQorCisgIGlmIChQYXRoUG9pbnRzLmJhY2soKS5Jc1R5cGVBbmRPcGVuKEZYUFRfVFlQRTo6TW92ZVRvKSkKKyAgICBQYXRoUG9pbnRzLnBvcF9iYWNrKCk7CiAKICAgQ1BERl9QYXRoIFBhdGg7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgUGF0aFBvaW50Q291bnQ7IGkrKykgewotICAgIEZYX1BBVEhQT0lOVCYgcG9pbnQgPSBtX3BQYXRoUG9pbnRzW2ldOworICBmb3IgKGNvbnN0IGF1dG8mIHBvaW50IDogUGF0aFBvaW50cykKICAgICBQYXRoLkFwcGVuZFBvaW50KHBvaW50Lm1fUG9pbnQsIHBvaW50Lm1fVHlwZSwgcG9pbnQubV9DbG9zZUZpZ3VyZSk7Ci0gIH0KIAogICBDRlhfTWF0cml4IG1hdHJpeCA9IG1fcEN1clN0YXRlcy0+bV9DVE07CiAgIG1hdHJpeC5Db25jYXQobV9tdENvbnRlbnRUb1VzZXIpOwogICBpZiAoYlN0cm9rZSB8fCBGaWxsVHlwZSkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1BhdGhPYmplY3Q+IHBQYXRoT2JqKG5ldyBDUERGX1BhdGhPYmplY3QpOworICAgIGF1dG8gcFBhdGhPYmogPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9QYXRoT2JqZWN0PigpOwogICAgIHBQYXRoT2JqLT5tX2JTdHJva2UgPSBiU3Ryb2tlOwogICAgIHBQYXRoT2JqLT5tX0ZpbGxUeXBlID0gRmlsbFR5cGU7CiAgICAgcFBhdGhPYmotPm1fUGF0aCA9IFBhdGg7CkBAIC0xNTIxLDkgKzE1MDcsMTMgQEAKIHVpbnQzMl90IENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6UGFyc2UoY29uc3QgdWludDhfdCogcERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWF4X2Nvc3QpIHsKLSAgaWYgKG1fTGV2ZWwgPiBrTWF4Rm9ybUxldmVsKQorICBpZiAobV9QYXJzZWRTZXQtPnNpemUoKSA+IGtNYXhGb3JtTGV2ZWwgfHwKKyAgICAgIHBkZml1bTo6Q29udGFpbnNLZXkoKm1fUGFyc2VkU2V0LCBwRGF0YSkpCiAgICAgcmV0dXJuIGR3U2l6ZTsKIAorICBwZGZpdW06OlNjb3BlZFNldEluc2VydGlvbjxjb25zdCB1aW50OF90Kj4gc2NvcGVkSW5zZXJ0KG1fUGFyc2VkU2V0LkdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhKTsKKwogICB1aW50MzJfdCBJbml0T2JqQ291bnQgPSBtX3BPYmplY3RIb2xkZXItPkdldFBhZ2VPYmplY3RMaXN0KCktPnNpemUoKTsKICAgQ1BERl9TdHJlYW1QYXJzZXIgc3ludGF4KHBEYXRhLCBkd1NpemUsIG1fcERvY3VtZW50LT5HZXRCeXRlU3RyaW5nUG9vbCgpKTsKICAgQ1BERl9TdHJlYW1QYXJzZXJBdXRvQ2xlYXJlciBhdXRvX2NsZWFyZXIoJm1fcFN5bnRheCwgJnN5bnRheCk7CkBAIC0xNTQyLDkgKzE1MzIsMTEgQEAKICAgICAgIGNhc2UgQ1BERl9TdHJlYW1QYXJzZXI6Ok51bWJlcjoKICAgICAgICAgQWRkTnVtYmVyUGFyYW0oc3ludGF4LkdldFdvcmQoKSk7CiAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBDUERGX1N0cmVhbVBhcnNlcjo6TmFtZToKLSAgICAgICAgQWRkTmFtZVBhcmFtKHN5bnRheC5HZXRXb3JkKCkuTWlkKDEpKTsKKyAgICAgIGNhc2UgQ1BERl9TdHJlYW1QYXJzZXI6Ok5hbWU6IHsKKyAgICAgICAgYXV0byB3b3JkID0gc3ludGF4LkdldFdvcmQoKTsKKyAgICAgICAgQWRkTmFtZVBhcmFtKHdvcmQuUmlnaHQod29yZC5HZXRMZW5ndGgoKSAtIDEpKTsKICAgICAgICAgYnJlYWs7CisgICAgICB9CiAgICAgICBkZWZhdWx0OgogICAgICAgICBBZGRPYmplY3RQYXJhbShzeW50YXguR2V0T2JqZWN0KCkpOwogICAgIH0KQEAgLTE1NTMsNyArMTU0NSw3IEBACiB9CiAKIHZvaWQgQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpQYXJzZVBhdGhPYmplY3QoKSB7Ci0gIEZYX0ZMT0FUIHBhcmFtc1s2XSA9IHt9OworICBmbG9hdCBwYXJhbXNbNl0gPSB7fTsKICAgaW50IG5QYXJhbXMgPSAwOwogICBpbnQgbGFzdF9wb3MgPSBtX3BTeW50YXgtPkdldFBvcygpOwogICB3aGlsZSAoMSkgewpAQCAtMTU2Myw3ICsxNTU1LDcgQEAKICAgICAgIGNhc2UgQ1BERl9TdHJlYW1QYXJzZXI6OkVuZE9mRGF0YToKICAgICAgICAgcmV0dXJuOwogICAgICAgY2FzZSBDUERGX1N0cmVhbVBhcnNlcjo6S2V5d29yZDogewotICAgICAgICBDRlhfQnl0ZVN0cmluZ0Mgc3RyYyA9IG1fcFN5bnRheC0+R2V0V29yZCgpOworICAgICAgICBCeXRlU3RyaW5nVmlldyBzdHJjID0gbV9wU3ludGF4LT5HZXRXb3JkKCk7CiAgICAgICAgIGludCBsZW4gPSBzdHJjLkdldExlbmd0aCgpOwogICAgICAgICBpZiAobGVuID09IDEpIHsKICAgICAgICAgICBzd2l0Y2ggKHN0cmNbMF0pIHsKQEAgLTE2MjQsNyArMTYxNiw4IEBACiAKICAgICAgICAgaW50IHZhbHVlOwogICAgICAgICBib29sIGJJbnRlZ2VyID0gRlhfYXRvbnVtKG1fcFN5bnRheC0+R2V0V29yZCgpLCAmdmFsdWUpOwotICAgICAgICBwYXJhbXNbblBhcmFtcysrXSA9IGJJbnRlZ2VyID8gKEZYX0ZMT0FUKXZhbHVlIDogKihGWF9GTE9BVCopJnZhbHVlOworICAgICAgICBwYXJhbXNbblBhcmFtcysrXSA9IGJJbnRlZ2VyID8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPigmdmFsdWUpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICAgIGRlZmF1bHQ6CkBAIC0xNjM3LDYgKzE2MzAsMTggQEAKICAgfQogfQogCisvLyBzdGF0aWMKK0J5dGVTdHJpbmdWaWV3IENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6RmluZEtleUFiYnJldmlhdGlvbkZvclRlc3RpbmcoCisgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGFiYnIpIHsKKyAgcmV0dXJuIEZpbmRGdWxsTmFtZShJbmxpbmVLZXlBYmJyLCBGWF9BcnJheVNpemUoSW5saW5lS2V5QWJiciksIGFiYnIpOworfQorCisvLyBzdGF0aWMKK0J5dGVTdHJpbmdWaWV3IENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6RmluZFZhbHVlQWJicmV2aWF0aW9uRm9yVGVzdGluZygKKyAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgYWJicikgeworICByZXR1cm4gRmluZEZ1bGxOYW1lKElubGluZVZhbHVlQWJiciwgRlhfQXJyYXlTaXplKElubGluZVZhbHVlQWJiciksIGFiYnIpOworfQorCiBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkNvbnRlbnRQYXJhbTo6Q29udGVudFBhcmFtKCkge30KIAogQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjpDb250ZW50UGFyYW06On5Db250ZW50UGFyYW0oKSB7fQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zdHJlYW1jb250ZW50cGFyc2VyLmggYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3N0cmVhbWNvbnRlbnRwYXJzZXIuaAppbmRleCBjZDQxOTkwLi5kZTRhOTJmIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3N0cmVhbWNvbnRlbnRwYXJzZXIuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3N0cmVhbWNvbnRlbnRwYXJzZXIuaApAQCAtNyw4ICs3LDkgQEAKICNpZm5kZWYgQ09SRV9GUERGQVBJX1BBR0VfQ1BERl9TVFJFQU1DT05URU5UUEFSU0VSX0hfCiAjZGVmaW5lIENPUkVfRlBERkFQSV9QQUdFX0NQREZfU1RSRUFNQ09OVEVOVFBBUlNFUl9IXwogCisjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbnRlbnRtYXJrLmgiCkBAIC0zNywxNyArMzgsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBtdENvbnRlbnRUb1VzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2VPYmplY3RIb2xkZXIqIHBPYmplY3RIb2xkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRmxvYXRSZWN0KiBwQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjQkJveCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQWxsU3RhdGVzKiBwQWxsU3RhdGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PGNvbnN0IHVpbnQ4X3QqPiogcGFyc2VkU2V0KTsKICAgfkNQREZfU3RyZWFtQ29udGVudFBhcnNlcigpOwogCiAgIHVpbnQzMl90IFBhcnNlKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCB1aW50MzJfdCBkd1NpemUsIHVpbnQzMl90IG1heF9jb3N0KTsKLSAgQ1BERl9QYWdlT2JqZWN0SG9sZGVyKiBHZXRQYWdlT2JqZWN0SG9sZGVyKCkgY29uc3QgeyByZXR1cm4gbV9wT2JqZWN0SG9sZGVyOyB9CisgIENQREZfUGFnZU9iamVjdEhvbGRlciogR2V0UGFnZU9iamVjdEhvbGRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9wT2JqZWN0SG9sZGVyLkdldCgpOworICB9CiAgIENQREZfQWxsU3RhdGVzKiBHZXRDdXJTdGF0ZXMoKSBjb25zdCB7IHJldHVybiBtX3BDdXJTdGF0ZXMuZ2V0KCk7IH0KICAgYm9vbCBJc0NvbG9yZWQoKSBjb25zdCB7IHJldHVybiBtX2JDb2xvcmVkOyB9Ci0gIGNvbnN0IEZYX0ZMT0FUKiBHZXRUeXBlM0RhdGEoKSBjb25zdCB7IHJldHVybiBtX1R5cGUzRGF0YTsgfQotICBDUERGX0ZvbnQqIEZpbmRGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKTsKKyAgY29uc3QgZmxvYXQqIEdldFR5cGUzRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fVHlwZTNEYXRhOyB9CisgIENQREZfRm9udCogRmluZEZvbnQoY29uc3QgQnl0ZVN0cmluZyYgbmFtZSk7CisKKyAgc3RhdGljIEJ5dGVTdHJpbmdWaWV3IEZpbmRLZXlBYmJyZXZpYXRpb25Gb3JUZXN0aW5nKAorICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGFiYnIpOworICBzdGF0aWMgQnl0ZVN0cmluZ1ZpZXcgRmluZFZhbHVlQWJicmV2aWF0aW9uRm9yVGVzdGluZygKKyAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBhYmJyKTsKIAogIHByaXZhdGU6CiAgIHN0cnVjdCBDb250ZW50UGFyYW0gewpAQCAtNjIsNyArNzAsNyBAQAogICAgICAgYm9vbCBtX2JJbnRlZ2VyOwogICAgICAgdW5pb24gewogICAgICAgICBpbnQgbV9JbnRlZ2VyOwotICAgICAgICBGWF9GTE9BVCBtX0Zsb2F0OworICAgICAgICBmbG9hdCBtX0Zsb2F0OwogICAgICAgfTsKICAgICB9IG1fTnVtYmVyOwogICAgIHN0cnVjdCB7CkBAIC03Myw0MyArODEsNDEgQEAKIAogICBzdGF0aWMgY29uc3QgaW50IGtQYXJhbUJ1ZlNpemUgPSAxNjsKIAotICB1c2luZyBPcENvZGVzID0KLSAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MzJfdCwgdm9pZCAoQ1BERl9TdHJlYW1Db250ZW50UGFyc2VyOjoqKSgpPjsKKyAgdXNpbmcgT3BDb2RlcyA9IHN0ZDo6bWFwPHVpbnQzMl90LCB2b2lkIChDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OiopKCk+OwogICBzdGF0aWMgT3BDb2RlcyBJbml0aWFsaXplT3BDb2RlcygpOwogCi0gIHZvaWQgQWRkTmFtZVBhcmFtKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKTsKLSAgdm9pZCBBZGROdW1iZXJQYXJhbShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7CisgIHZvaWQgQWRkTmFtZVBhcmFtKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIpOworICB2b2lkIEFkZE51bWJlclBhcmFtKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIpOwogICB2b2lkIEFkZE9iamVjdFBhcmFtKHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gcE9iaik7CiAgIGludCBHZXROZXh0UGFyYW1Qb3MoKTsKICAgdm9pZCBDbGVhckFsbFBhcmFtcygpOwogICBDUERGX09iamVjdCogR2V0T2JqZWN0KHVpbnQzMl90IGluZGV4KTsKLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0U3RyaW5nKHVpbnQzMl90IGluZGV4KTsKLSAgRlhfRkxPQVQgR2V0TnVtYmVyKHVpbnQzMl90IGluZGV4KTsKKyAgQnl0ZVN0cmluZyBHZXRTdHJpbmcodWludDMyX3QgaW5kZXgpOworICBmbG9hdCBHZXROdW1iZXIodWludDMyX3QgaW5kZXgpOwogICBpbnQgR2V0SW50ZWdlcih1aW50MzJfdCBpbmRleCkgeyByZXR1cm4gKGludDMyX3QpKEdldE51bWJlcihpbmRleCkpOyB9Ci0gIHZvaWQgT25PcGVyYXRvcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG9wKTsKLSAgdm9pZCBBZGRUZXh0T2JqZWN0KENGWF9CeXRlU3RyaW5nKiBwVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZJbml0S2VybmluZywKLSAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwS2VybmluZywKKyAgdm9pZCBPbk9wZXJhdG9yKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBvcCk7CisgIHZvaWQgQWRkVGV4dE9iamVjdChCeXRlU3RyaW5nKiBwVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZJbml0S2VybmluZywKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwS2VybmluZywKICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCk7CiAKICAgdm9pZCBPbkNoYW5nZVRleHRNYXRyaXgoKTsKICAgdm9pZCBQYXJzZVBhdGhPYmplY3QoKTsKLSAgdm9pZCBBZGRQYXRoUG9pbnQoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgRlhQVF9UWVBFIHR5cGUsIGJvb2wgY2xvc2UpOwotICB2b2lkIEFkZFBhdGhSZWN0KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIEZYX0ZMT0FUIHcsIEZYX0ZMT0FUIGgpOworICB2b2lkIEFkZFBhdGhQb2ludChmbG9hdCB4LCBmbG9hdCB5LCBGWFBUX1RZUEUgdHlwZSwgYm9vbCBjbG9zZSk7CisgIHZvaWQgQWRkUGF0aFJlY3QoZmxvYXQgeCwgZmxvYXQgeSwgZmxvYXQgdywgZmxvYXQgaCk7CiAgIHZvaWQgQWRkUGF0aE9iamVjdChpbnQgRmlsbFR5cGUsIGJvb2wgYlN0cm9rZSk7CiAgIENQREZfSW1hZ2VPYmplY3QqIEFkZEltYWdlKHN0ZDo6dW5pcXVlX3B0cjxDUERGX1N0cmVhbT4gcFN0cmVhbSk7CiAgIENQREZfSW1hZ2VPYmplY3QqIEFkZEltYWdlKHVpbnQzMl90IHN0cmVhbU9iak51bSk7Ci0gIENQREZfSW1hZ2VPYmplY3QqIEFkZEltYWdlKENQREZfSW1hZ2UqIHBJbWFnZSk7CisgIENQREZfSW1hZ2VPYmplY3QqIEFkZEltYWdlKGNvbnN0IFJldGFpblB0cjxDUERGX0ltYWdlPiYgcEltYWdlKTsKIAogICB2b2lkIEFkZEZvcm0oQ1BERl9TdHJlYW0qIHBTdHJlYW0pOwogICB2b2lkIFNldEdyYXBoaWNTdGF0ZXMoQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiR3JhcGgpOwotICBDUERGX0NvbG9yU3BhY2UqIEZpbmRDb2xvclNwYWNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKTsKLSAgQ1BERl9QYXR0ZXJuKiBGaW5kUGF0dGVybihjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgYm9vbCBiU2hhZGluZyk7Ci0gIENQREZfT2JqZWN0KiBGaW5kUmVzb3VyY2VPYmooY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOworICBDUERGX0NvbG9yU3BhY2UqIEZpbmRDb2xvclNwYWNlKGNvbnN0IEJ5dGVTdHJpbmcmIG5hbWUpOworICBDUERGX1BhdHRlcm4qIEZpbmRQYXR0ZXJuKGNvbnN0IEJ5dGVTdHJpbmcmIG5hbWUsIGJvb2wgYlNoYWRpbmcpOworICBDUERGX09iamVjdCogRmluZFJlc291cmNlT2JqKGNvbnN0IEJ5dGVTdHJpbmcmIHR5cGUsIGNvbnN0IEJ5dGVTdHJpbmcmIG5hbWUpOwogCiAgIC8vIFRha2VzIG93bmVyc2hpcCBvZiB8cEltYWdlT2JqfCwgcmV0dXJucyB1bm93bmVkIHBvaW50ZXIgdG8gaXQuCiAgIENQREZfSW1hZ2VPYmplY3QqIEFkZEltYWdlT2JqZWN0KHN0ZDo6dW5pcXVlX3B0cjxDUERGX0ltYWdlT2JqZWN0PiBwSW1hZ2VPYmopOwpAQCAtMTg3LDE0ICsxOTMsMTQgQEAKICAgdm9pZCBIYW5kbGVfTmV4dExpbmVTaG93VGV4dF9TcGFjZSgpOwogICB2b2lkIEhhbmRsZV9JbnZhbGlkKCk7CiAKLSAgQ1BERl9Eb2N1bWVudCogY29uc3QgbV9wRG9jdW1lbnQ7Ci0gIENQREZfRGljdGlvbmFyeSogbV9wUGFnZVJlc291cmNlczsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BQYXJlbnRSZXNvdXJjZXM7Ci0gIENQREZfRGljdGlvbmFyeSogbV9wUmVzb3VyY2VzOwotICBDUERGX1BhZ2VPYmplY3RIb2xkZXIqIG1fcE9iamVjdEhvbGRlcjsKLSAgaW50IG1fTGV2ZWw7CisgIFVub3duZWRQdHI8Q1BERl9Eb2N1bWVudD4gY29uc3QgbV9wRG9jdW1lbnQ7CisgIFVub3duZWRQdHI8Q1BERl9EaWN0aW9uYXJ5PiBjb25zdCBtX3BQYWdlUmVzb3VyY2VzOworICBVbm93bmVkUHRyPENQREZfRGljdGlvbmFyeT4gY29uc3QgbV9wUGFyZW50UmVzb3VyY2VzOworICBVbm93bmVkUHRyPENQREZfRGljdGlvbmFyeT4gbV9wUmVzb3VyY2VzOworICBVbm93bmVkUHRyPENQREZfUGFnZU9iamVjdEhvbGRlcj4gY29uc3QgbV9wT2JqZWN0SG9sZGVyOworICBVbm93bmVkUHRyPHN0ZDo6c2V0PGNvbnN0IHVpbnQ4X3QqPj4gY29uc3QgbV9QYXJzZWRTZXQ7CiAgIENGWF9NYXRyaXggbV9tdENvbnRlbnRUb1VzZXI7Ci0gIENGWF9GbG9hdFJlY3QgbV9CQm94OworICBjb25zdCBDRlhfRmxvYXRSZWN0IG1fQkJveDsKICAgQ29udGVudFBhcmFtIG1fUGFyYW1CdWZba1BhcmFtQnVmU2l6ZV07CiAgIHVpbnQzMl90IG1fUGFyYW1TdGFydFBvczsKICAgdWludDMyX3QgbV9QYXJhbUNvdW50OwpAQCAtMjAyLDIwICsyMDgsMTggQEAKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfQWxsU3RhdGVzPiBtX3BDdXJTdGF0ZXM7CiAgIENQREZfQ29udGVudE1hcmsgbV9DdXJDb250ZW50TWFyazsKICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENQREZfVGV4dE9iamVjdD4+IG1fQ2xpcFRleHRMaXN0OwotICBDUERGX1RleHRPYmplY3QqIG1fcExhc3RUZXh0T2JqZWN0OwotICBGWF9GTE9BVCBtX0RlZkZvbnRTaXplOwotICBGWF9QQVRIUE9JTlQqIG1fcFBhdGhQb2ludHM7Ci0gIGludCBtX1BhdGhQb2ludENvdW50OwotICBpbnQgbV9QYXRoQWxsb2NTaXplOwotICBGWF9GTE9BVCBtX1BhdGhTdGFydFg7Ci0gIEZYX0ZMT0FUIG1fUGF0aFN0YXJ0WTsKLSAgRlhfRkxPQVQgbV9QYXRoQ3VycmVudFg7Ci0gIEZYX0ZMT0FUIG1fUGF0aEN1cnJlbnRZOworICBVbm93bmVkUHRyPENQREZfVGV4dE9iamVjdD4gbV9wTGFzdFRleHRPYmplY3Q7CisgIGZsb2F0IG1fRGVmRm9udFNpemU7CisgIHN0ZDo6dmVjdG9yPEZYX1BBVEhQT0lOVD4gbV9QYXRoUG9pbnRzOworICBmbG9hdCBtX1BhdGhTdGFydFg7CisgIGZsb2F0IG1fUGF0aFN0YXJ0WTsKKyAgZmxvYXQgbV9QYXRoQ3VycmVudFg7CisgIGZsb2F0IG1fUGF0aEN1cnJlbnRZOwogICB1aW50OF90IG1fUGF0aENsaXBUeXBlOwotICBDRlhfQnl0ZVN0cmluZyBtX0xhc3RJbWFnZU5hbWU7Ci0gIENQREZfSW1hZ2UqIG1fcExhc3RJbWFnZTsKKyAgQnl0ZVN0cmluZyBtX0xhc3RJbWFnZU5hbWU7CisgIFJldGFpblB0cjxDUERGX0ltYWdlPiBtX3BMYXN0SW1hZ2U7CiAgIGJvb2wgbV9iQ29sb3JlZDsKLSAgRlhfRkxPQVQgbV9UeXBlM0RhdGFbNl07CisgIGZsb2F0IG1fVHlwZTNEYXRhWzZdOwogICBib29sIG1fYlJlc291cmNlTWlzc2luZzsKICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENQREZfQWxsU3RhdGVzPj4gbV9TdGF0ZVN0YWNrOwogfTsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc3RyZWFtY29udGVudHBhcnNlcl91bml0dGVzdC5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3N0cmVhbWNvbnRlbnRwYXJzZXJfdW5pdHRlc3QuY3BwCmluZGV4IGJlMmZjYjAuLjBmNGZjMWUgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc3RyZWFtY29udGVudHBhcnNlcl91bml0dGVzdC5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zdHJlYW1jb250ZW50cGFyc2VyX3VuaXR0ZXN0LmNwcApAQCAtMiwzMyArMiw0MyBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL3BhZ2VpbnQuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3N0cmVhbWNvbnRlbnRwYXJzZXIuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKIAogVEVTVChjcGRmX3N0cmVhbWNvbnRlbnRwYXJzZXIsIFBERl9GaW5kS2V5QWJicmV2aWF0aW9uKSB7Ci0gIEVYUEVDVF9FUShDRlhfQnl0ZVN0cmluZ0MoIkJpdHNQZXJDb21wb25lbnQiKSwKLSAgICAgICAgICAgIFBERl9GaW5kS2V5QWJicmV2aWF0aW9uRm9yVGVzdGluZyhDRlhfQnl0ZVN0cmluZ0MoIkJQQyIpKSk7Ci0gIEVYUEVDVF9FUShDRlhfQnl0ZVN0cmluZ0MoIldpZHRoIiksCi0gICAgICAgICAgICBQREZfRmluZEtleUFiYnJldmlhdGlvbkZvclRlc3RpbmcoQ0ZYX0J5dGVTdHJpbmdDKCJXIikpKTsKLSAgRVhQRUNUX0VRKENGWF9CeXRlU3RyaW5nQygiIiksCi0gICAgICAgICAgICBQREZfRmluZEtleUFiYnJldmlhdGlvbkZvclRlc3RpbmcoQ0ZYX0J5dGVTdHJpbmdDKCIiKSkpOwotICBFWFBFQ1RfRVEoQ0ZYX0J5dGVTdHJpbmdDKCIiKSwKLSAgICAgICAgICAgIFBERl9GaW5kS2V5QWJicmV2aWF0aW9uRm9yVGVzdGluZyhDRlhfQnl0ZVN0cmluZ0MoIk5vSW5MaXN0IikpKTsKKyAgRVhQRUNUX0VRKEJ5dGVTdHJpbmdWaWV3KCJCaXRzUGVyQ29tcG9uZW50IiksCisgICAgICAgICAgICBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkZpbmRLZXlBYmJyZXZpYXRpb25Gb3JUZXN0aW5nKAorICAgICAgICAgICAgICAgIEJ5dGVTdHJpbmdWaWV3KCJCUEMiKSkpOworICBFWFBFQ1RfRVEoQnl0ZVN0cmluZ1ZpZXcoIldpZHRoIiksCisgICAgICAgICAgICBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkZpbmRLZXlBYmJyZXZpYXRpb25Gb3JUZXN0aW5nKAorICAgICAgICAgICAgICAgIEJ5dGVTdHJpbmdWaWV3KCJXIikpKTsKKyAgRVhQRUNUX0VRKEJ5dGVTdHJpbmdWaWV3KCIiKSwKKyAgICAgICAgICAgIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6RmluZEtleUFiYnJldmlhdGlvbkZvclRlc3RpbmcoCisgICAgICAgICAgICAgICAgQnl0ZVN0cmluZ1ZpZXcoIiIpKSk7CisgIEVYUEVDVF9FUShCeXRlU3RyaW5nVmlldygiIiksCisgICAgICAgICAgICBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkZpbmRLZXlBYmJyZXZpYXRpb25Gb3JUZXN0aW5nKAorICAgICAgICAgICAgICAgIEJ5dGVTdHJpbmdWaWV3KCJOb0luTGlzdCIpKSk7CiAgIC8vIFByZWZpeCBzaG91bGQgbm90IG1hdGNoLgotICBFWFBFQ1RfRVEoQ0ZYX0J5dGVTdHJpbmdDKCIiKSwKLSAgICAgICAgICAgIFBERl9GaW5kS2V5QWJicmV2aWF0aW9uRm9yVGVzdGluZyhDRlhfQnl0ZVN0cmluZ0MoIldXIikpKTsKKyAgRVhQRUNUX0VRKEJ5dGVTdHJpbmdWaWV3KCIiKSwKKyAgICAgICAgICAgIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6RmluZEtleUFiYnJldmlhdGlvbkZvclRlc3RpbmcoCisgICAgICAgICAgICAgICAgQnl0ZVN0cmluZ1ZpZXcoIldXIikpKTsKIH0KIAogVEVTVChjcGRmX3N0cmVhbWNvbnRlbnRwYXJzZXIsIFBERl9GaW5kVmFsdWVBYmJyZXZpYXRpb24pIHsKLSAgRVhQRUNUX0VRKENGWF9CeXRlU3RyaW5nQygiRGV2aWNlR3JheSIpLAotICAgICAgICAgICAgUERGX0ZpbmRWYWx1ZUFiYnJldmlhdGlvbkZvclRlc3RpbmcoQ0ZYX0J5dGVTdHJpbmdDKCJHIikpKTsKLSAgRVhQRUNUX0VRKENGWF9CeXRlU3RyaW5nQygiRENURGVjb2RlIiksCi0gICAgICAgICAgICBQREZfRmluZFZhbHVlQWJicmV2aWF0aW9uRm9yVGVzdGluZyhDRlhfQnl0ZVN0cmluZ0MoIkRDVCIpKSk7Ci0gIEVYUEVDVF9FUShDRlhfQnl0ZVN0cmluZ0MoIiIpLAotICAgICAgICAgICAgUERGX0ZpbmRWYWx1ZUFiYnJldmlhdGlvbkZvclRlc3RpbmcoQ0ZYX0J5dGVTdHJpbmdDKCIiKSkpOwotICBFWFBFQ1RfRVEoQ0ZYX0J5dGVTdHJpbmdDKCIiKSwKLSAgICAgICAgICAgIFBERl9GaW5kVmFsdWVBYmJyZXZpYXRpb25Gb3JUZXN0aW5nKENGWF9CeXRlU3RyaW5nQygiTm9Jbkxpc3QiKSkpOworICBFWFBFQ1RfRVEoQnl0ZVN0cmluZ1ZpZXcoIkRldmljZUdyYXkiKSwKKyAgICAgICAgICAgIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjo6RmluZFZhbHVlQWJicmV2aWF0aW9uRm9yVGVzdGluZygKKyAgICAgICAgICAgICAgICBCeXRlU3RyaW5nVmlldygiRyIpKSk7CisgIEVYUEVDVF9FUShCeXRlU3RyaW5nVmlldygiRENURGVjb2RlIiksCisgICAgICAgICAgICBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkZpbmRWYWx1ZUFiYnJldmlhdGlvbkZvclRlc3RpbmcoCisgICAgICAgICAgICAgICAgQnl0ZVN0cmluZ1ZpZXcoIkRDVCIpKSk7CisgIEVYUEVDVF9FUShCeXRlU3RyaW5nVmlldygiIiksCisgICAgICAgICAgICBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkZpbmRWYWx1ZUFiYnJldmlhdGlvbkZvclRlc3RpbmcoCisgICAgICAgICAgICAgICAgQnl0ZVN0cmluZ1ZpZXcoIiIpKSk7CisgIEVYUEVDVF9FUShCeXRlU3RyaW5nVmlldygiIiksCisgICAgICAgICAgICBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkZpbmRWYWx1ZUFiYnJldmlhdGlvbkZvclRlc3RpbmcoCisgICAgICAgICAgICAgICAgQnl0ZVN0cmluZ1ZpZXcoIk5vSW5MaXN0IikpKTsKICAgLy8gUHJlZml4IHNob3VsZCBub3QgbWF0Y2guCi0gIEVYUEVDVF9FUShDRlhfQnl0ZVN0cmluZ0MoIiIpLAotICAgICAgICAgICAgUERGX0ZpbmRWYWx1ZUFiYnJldmlhdGlvbkZvclRlc3RpbmcoQ0ZYX0J5dGVTdHJpbmdDKCJJSSIpKSk7CisgIEVYUEVDVF9FUShCeXRlU3RyaW5nVmlldygiIiksCisgICAgICAgICAgICBDUERGX1N0cmVhbUNvbnRlbnRQYXJzZXI6OkZpbmRWYWx1ZUFiYnJldmlhdGlvbkZvclRlc3RpbmcoCisgICAgICAgICAgICAgICAgQnl0ZVN0cmluZ1ZpZXcoIklJIikpKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc3RyZWFtcGFyc2VyLmNwcCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc3RyZWFtcGFyc2VyLmNwcAppbmRleCAyOTRkNzJjLi4yYzdlMDI1IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3N0cmVhbXBhcnNlci5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zdHJlYW1wYXJzZXIuY3BwCkBAIC04LDcgKzgsOSBAQAogCiAjaW5jbHVkZSA8bGltaXRzLmg+CiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8dXRpbGl0eT4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9jcGRmX21vZHVsZW1nci5oIgpAQCAtMjQsMTggKzI2LDE5IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmluZy5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl91dGlsaXR5LmgiCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2Z4X2NvZGVjLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9leHQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2pwZWdtb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX3NjYW5saW5lZGVjb2Rlci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCiAKIG5hbWVzcGFjZSB7CiAKIGNvbnN0IHVpbnQzMl90IGtNYXhOZXN0ZWRQYXJzaW5nTGV2ZWwgPSA1MTI7CiBjb25zdCB1aW50MzJfdCBrTWF4V29yZEJ1ZmZlciA9IDI1NjsKLWNvbnN0IEZYX1NUUlNJWkUga01heFN0cmluZ0xlbmd0aCA9IDMyNzY3OworY29uc3Qgc2l6ZV90IGtNYXhTdHJpbmdMZW5ndGggPSAzMjc2NzsKIAogdWludDMyX3QgRGVjb2RlQWxsU2NhbmxpbmVzKHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNfU2NhbmxpbmVEZWNvZGVyPiBwRGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIGRlc3Rfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZGVzdF9zaXplKSB7CiAgIGlmICghcERlY29kZXIpCiAgICAgcmV0dXJuIEZYX0lOVkFMSURfT0ZGU0VUOwogICBpbnQgbmNvbXBzID0gcERlY29kZXItPkNvdW50Q29tcHMoKTsKQEAgLTQ2LDI2ICs0OSwyNiBAQAogICBpZiAoaGVpZ2h0ID09IDAgfHwgcGl0Y2ggPiAoMSA8PCAzMCkgLyBoZWlnaHQpCiAgICAgcmV0dXJuIEZYX0lOVkFMSURfT0ZGU0VUOwogCi0gIGRlc3RfYnVmID0gRlhfQWxsb2MyRCh1aW50OF90LCBwaXRjaCwgaGVpZ2h0KTsKLSAgZGVzdF9zaXplID0gcGl0Y2ggKiBoZWlnaHQ7ICAvLyBTYWZlIHNpbmNlIGNoZWNrZWQgYWxsb2MgcmV0dXJuZWQuCi0gIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgKmRlc3RfYnVmID0gRlhfQWxsb2MyRCh1aW50OF90LCBwaXRjaCwgaGVpZ2h0KTsKKyAgKmRlc3Rfc2l6ZSA9IHBpdGNoICogaGVpZ2h0OyAgLy8gU2FmZSBzaW5jZSBjaGVja2VkIGFsbG9jIHJldHVybmVkLgorICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7ICsrcm93KSB7CiAgICAgY29uc3QgdWludDhfdCogcExpbmUgPSBwRGVjb2Rlci0+R2V0U2NhbmxpbmUocm93KTsKICAgICBpZiAoIXBMaW5lKQogICAgICAgYnJlYWs7CiAKLSAgICBGWFNZU19tZW1jcHkoZGVzdF9idWYgKyByb3cgKiBwaXRjaCwgcExpbmUsIHBpdGNoKTsKKyAgICBtZW1jcHkoKmRlc3RfYnVmICsgcm93ICogcGl0Y2gsIHBMaW5lLCBwaXRjaCk7CiAgIH0KICAgcmV0dXJuIHBEZWNvZGVyLT5HZXRTcmNPZmZzZXQoKTsKIH0KIAotdWludDMyX3QgUERGX0RlY29kZUlubGluZVN0cmVhbShjb25zdCB1aW50OF90KiBzcmNfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIGRlc3Rfc2l6ZSkgewordWludDMyX3QgRGVjb2RlSW5saW5lU3RyZWFtKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgZGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRlc3Rfc2l6ZSkgewogICBpZiAoZGVjb2RlciA9PSAiQ0NJVFRGYXhEZWNvZGUiIHx8IGRlY29kZXIgPT0gIkNDRiIpIHsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjX1NjYW5saW5lRGVjb2Rlcj4gcERlY29kZXIgPQogICAgICAgICBGUERGQVBJX0NyZWF0ZUZheERlY29kZXIoc3JjX2J1ZiwgbGltaXQsIHdpZHRoLCBoZWlnaHQsIHBQYXJhbSk7CkBAIC03Niw3ICs3OSw3IEBACiAgIGlmIChkZWNvZGVyID09ICJBU0NJSUhleERlY29kZSIgfHwgZGVjb2RlciA9PSAiQUh4IikKICAgICByZXR1cm4gSGV4RGVjb2RlKHNyY19idWYsIGxpbWl0LCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKICAgaWYgKGRlY29kZXIgPT0gIkZsYXRlRGVjb2RlIiB8fCBkZWNvZGVyID09ICJGbCIpIHsKLSAgICByZXR1cm4gRlBERkFQSV9GbGF0ZU9yTFpXRGVjb2RlKGZhbHNlLCBzcmNfYnVmLCBsaW1pdCwgcFBhcmFtLCBkZXN0X3NpemUsCisgICAgcmV0dXJuIEZQREZBUElfRmxhdGVPckxaV0RlY29kZShmYWxzZSwgc3JjX2J1ZiwgbGltaXQsIHBQYXJhbSwgKmRlc3Rfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYnVmLCBkZXN0X3NpemUpOwogICB9CiAgIGlmIChkZWNvZGVyID09ICJMWldEZWNvZGUiIHx8IGRlY29kZXIgPT0gIkxaVyIpIHsKQEAgLTkyLDI3ICs5NSwyMCBAQAogICB9CiAgIGlmIChkZWNvZGVyID09ICJSdW5MZW5ndGhEZWNvZGUiIHx8IGRlY29kZXIgPT0gIlJMIikKICAgICByZXR1cm4gUnVuTGVuZ3RoRGVjb2RlKHNyY19idWYsIGxpbWl0LCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKLSAgZGVzdF9zaXplID0gMDsKLSAgZGVzdF9idWYgPSAwOwotICByZXR1cm4gKHVpbnQzMl90KS0xOworICAqZGVzdF9zaXplID0gMDsKKyAgKmRlc3RfYnVmID0gMDsKKyAgcmV0dXJuIDB4RkZGRkZGRkY7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZQogCiBDUERGX1N0cmVhbVBhcnNlcjo6Q1BERl9TdHJlYW1QYXJzZXIoY29uc3QgdWludDhfdCogcERhdGEsIHVpbnQzMl90IGR3U2l6ZSkKLSAgICA6IG1fcEJ1ZihwRGF0YSksCi0gICAgICBtX1NpemUoZHdTaXplKSwKLSAgICAgIG1fUG9zKDApLAotICAgICAgbV9wUG9vbChudWxscHRyKSB7fQorICAgIDogbV9wQnVmKHBEYXRhKSwgbV9TaXplKGR3U2l6ZSksIG1fUG9zKDApLCBtX3BQb29sKG51bGxwdHIpIHt9CiAKLUNQREZfU3RyZWFtUGFyc2VyOjpDUERGX1N0cmVhbVBhcnNlcigKLSAgICBjb25zdCB1aW50OF90KiBwRGF0YSwKLSAgICB1aW50MzJfdCBkd1NpemUsCi0gICAgY29uc3QgQ0ZYX1dlYWtQdHI8Q0ZYX0J5dGVTdHJpbmdQb29sPiYgcFBvb2wpCi0gICAgOiBtX3BCdWYocERhdGEpLAotICAgICAgbV9TaXplKGR3U2l6ZSksCi0gICAgICBtX1BvcygwKSwKLSAgICAgIG1fcFBvb2wocFBvb2wpIHt9CitDUERGX1N0cmVhbVBhcnNlcjo6Q1BERl9TdHJlYW1QYXJzZXIoY29uc3QgdWludDhfdCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYWtQdHI8Qnl0ZVN0cmluZ1Bvb2w+JiBwUG9vbCkKKyAgICA6IG1fcEJ1ZihwRGF0YSksIG1fU2l6ZShkd1NpemUpLCBtX1BvcygwKSwgbV9wUG9vbChwUG9vbCkge30KIAogQ1BERl9TdHJlYW1QYXJzZXI6On5DUERGX1N0cmVhbVBhcnNlcigpIHt9CiAKQEAgLTEyNiw3ICsxMjIsNyBAQAogICBpZiAoUERGQ2hhcklzV2hpdGVzcGFjZShtX3BCdWZbbV9Qb3NdKSkKICAgICBtX1BvcysrOwogCi0gIENGWF9CeXRlU3RyaW5nIERlY29kZXI7CisgIEJ5dGVTdHJpbmcgRGVjb2RlcjsKICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW0gPSBudWxscHRyOwogICBDUERGX09iamVjdCogcEZpbHRlciA9IHBEaWN0LT5HZXREaXJlY3RPYmplY3RGb3IoIkZpbHRlciIpOwogICBpZiAocEZpbHRlcikgewpAQCAtMTg0LDE1ICsxODAsMTUgQEAKICAgICBpZiAoT3JpZ1NpemUgPiBtX1NpemUgLSBtX1BvcykKICAgICAgIE9yaWdTaXplID0gbV9TaXplIC0gbV9Qb3M7CiAgICAgcERhdGEucmVzZXQoRlhfQWxsb2ModWludDhfdCwgT3JpZ1NpemUpKTsKLSAgICBGWFNZU19tZW1jcHkocERhdGEuZ2V0KCksIG1fcEJ1ZiArIG1fUG9zLCBPcmlnU2l6ZSk7CisgICAgbWVtY3B5KHBEYXRhLmdldCgpLCBtX3BCdWYgKyBtX1BvcywgT3JpZ1NpemUpOwogICAgIGR3U3RyZWFtU2l6ZSA9IE9yaWdTaXplOwogICAgIG1fUG9zICs9IE9yaWdTaXplOwogICB9IGVsc2UgewogICAgIHVpbnQ4X3QqIHBJZ25vcmUgPSBudWxscHRyOwogICAgIHVpbnQzMl90IGR3RGVzdFNpemUgPSBPcmlnU2l6ZTsKICAgICBkd1N0cmVhbVNpemUgPQotICAgICAgICBQREZfRGVjb2RlSW5saW5lU3RyZWFtKG1fcEJ1ZiArIG1fUG9zLCBtX1NpemUgLSBtX1Bvcywgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVyLCBwUGFyYW0sIHBJZ25vcmUsIGR3RGVzdFNpemUpOworICAgICAgICBEZWNvZGVJbmxpbmVTdHJlYW0obV9wQnVmICsgbV9Qb3MsIG1fU2l6ZSAtIG1fUG9zLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjb2RlciwgcFBhcmFtLCAmcElnbm9yZSwgJmR3RGVzdFNpemUpOwogICAgIEZYX0ZyZWUocElnbm9yZSk7CiAgICAgaWYgKHN0YXRpY19jYXN0PGludD4oZHdTdHJlYW1TaXplKSA8IDApCiAgICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTIxNywxMCArMjEzLDEwIEBACiAgICAgfQogICAgIG1fUG9zID0gZHdTYXZlUG9zOwogICAgIHBEYXRhLnJlc2V0KEZYX0FsbG9jKHVpbnQ4X3QsIGR3U3RyZWFtU2l6ZSkpOwotICAgIEZYU1lTX21lbWNweShwRGF0YS5nZXQoKSwgbV9wQnVmICsgbV9Qb3MsIGR3U3RyZWFtU2l6ZSk7CisgICAgbWVtY3B5KHBEYXRhLmdldCgpLCBtX3BCdWYgKyBtX1BvcywgZHdTdHJlYW1TaXplKTsKICAgICBtX1BvcyArPSBkd1N0cmVhbVNpemU7CiAgIH0KLSAgcERpY3QtPlNldE5ld0ZvcjxDUERGX051bWJlcj4oIkxlbmd0aCIsIChpbnQpZHdTdHJlYW1TaXplKTsKKyAgcERpY3QtPlNldE5ld0ZvcjxDUERGX051bWJlcj4oIkxlbmd0aCIsIHN0YXRpY19jYXN0PGludD4oZHdTdHJlYW1TaXplKSk7CiAgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJlYW0+KHN0ZDo6bW92ZShwRGF0YSksIGR3U3RyZWFtU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHBEaWN0KSk7CiB9CkBAIC0zMTYsMTggKzMxMiwxOCBAQAogICBpZiAoYklzTnVtYmVyKSB7CiAgICAgbV9Xb3JkQnVmZmVyW21fV29yZFNpemVdID0gMDsKICAgICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfTnVtYmVyPigKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDKG1fV29yZEJ1ZmZlciwgbV9Xb3JkU2l6ZSkpOworICAgICAgICBCeXRlU3RyaW5nVmlldyhtX1dvcmRCdWZmZXIsIG1fV29yZFNpemUpKTsKICAgfQogCiAgIGludCBmaXJzdF9jaGFyID0gbV9Xb3JkQnVmZmVyWzBdOwogICBpZiAoZmlyc3RfY2hhciA9PSAnLycpIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0KLSAgICAgICAgUERGX05hbWVEZWNvZGUoQ0ZYX0J5dGVTdHJpbmdDKG1fV29yZEJ1ZmZlciArIDEsIG1fV29yZFNpemUgLSAxKSk7CisgICAgQnl0ZVN0cmluZyBuYW1lID0KKyAgICAgICAgUERGX05hbWVEZWNvZGUoQnl0ZVN0cmluZ1ZpZXcobV9Xb3JkQnVmZmVyICsgMSwgbV9Xb3JkU2l6ZSAtIDEpKTsKICAgICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfTmFtZT4obV9wUG9vbCwgbmFtZSk7CiAgIH0KIAogICBpZiAoZmlyc3RfY2hhciA9PSAnKCcpIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBSZWFkU3RyaW5nKCk7CisgICAgQnl0ZVN0cmluZyBzdHIgPSBSZWFkU3RyaW5nKCk7CiAgICAgcmV0dXJuIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmluZz4obV9wUG9vbCwgc3RyLCBmYWxzZSk7CiAgIH0KIApAQCAtMzQ0LDggKzM0MCw4IEBACiAgICAgICBpZiAoIW1fV29yZFNpemUgfHwgbV9Xb3JkQnVmZmVyWzBdICE9ICcvJykKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgICAgIENGWF9CeXRlU3RyaW5nIGtleSA9Ci0gICAgICAgICAgUERGX05hbWVEZWNvZGUoQ0ZYX0J5dGVTdHJpbmdDKG1fV29yZEJ1ZmZlciArIDEsIG1fV29yZFNpemUgLSAxKSk7CisgICAgICBCeXRlU3RyaW5nIGtleSA9CisgICAgICAgICAgUERGX05hbWVEZWNvZGUoQnl0ZVN0cmluZ1ZpZXcobV9Xb3JkQnVmZmVyICsgMSwgbV9Xb3JkU2l6ZSAtIDEpKTsKICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gcE9iaiA9CiAgICAgICAgICAgUmVhZE5leHRPYmplY3QodHJ1ZSwgYkluQXJyYXksIGR3UmVjdXJzaW9uTGV2ZWwgKyAxKTsKICAgICAgIGlmICghcE9iaikKQEAgLTQ2OCwxMiArNDY0LDEyIEBACiAgIH0KIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TdHJlYW1QYXJzZXI6OlJlYWRTdHJpbmcoKSB7CitCeXRlU3RyaW5nIENQREZfU3RyZWFtUGFyc2VyOjpSZWFkU3RyaW5nKCkgewogICBpZiAoIVBvc2l0aW9uSXNJbkJvdW5kcygpKQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CiAKICAgdWludDhfdCBjaCA9IG1fcEJ1ZlttX1BvcysrXTsKLSAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGJ1ZjsKICAgaW50IHBhcmxldmVsID0gMDsKICAgaW50IHN0YXR1cyA9IDA7CiAgIGludCBpRXNjQ29kZSA9IDA7CkBAIC00ODIsNTQgKzQ3OCw1NSBAQAogICAgICAgY2FzZSAwOgogICAgICAgICBpZiAoY2ggPT0gJyknKSB7CiAgICAgICAgICAgaWYgKHBhcmxldmVsID09IDApIHsKLSAgICAgICAgICAgIGlmIChidWYuR2V0TGVuZ3RoKCkgPiBrTWF4U3RyaW5nTGVuZ3RoKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhidWYuR2V0QnVmZmVyKCksIGtNYXhTdHJpbmdMZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJ1Zi5NYWtlU3RyaW5nKCk7CisgICAgICAgICAgICByZXR1cm4gQnl0ZVN0cmluZygKKyAgICAgICAgICAgICAgICBidWYuc3RyKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1pbihzdGF0aWNfY2FzdDxzaXplX3Q+KGJ1Zi50ZWxscCgpKSwga01heFN0cmluZ0xlbmd0aCkpOwogICAgICAgICAgIH0KICAgICAgICAgICBwYXJsZXZlbC0tOwotICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCcpJyk7CisgICAgICAgICAgYnVmIDw8ICcpJzsKICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnKCcpIHsKICAgICAgICAgICBwYXJsZXZlbCsrOwotICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCcoJyk7CisgICAgICAgICAgYnVmIDw8ICcoJzsKICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXFwnKSB7CiAgICAgICAgICAgc3RhdHVzID0gMTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBidWYuQXBwZW5kQ2hhcigoY2hhciljaCk7CisgICAgICAgICAgYnVmIDw8IHN0YXRpY19jYXN0PGNoYXI+KGNoKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgMToKICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnNycpIHsKLSAgICAgICAgICBpRXNjQ29kZSA9IEZYU1lTX3RvRGVjaW1hbERpZ2l0KHN0YXRpY19jYXN0PEZYX1dDSEFSPihjaCkpOworICAgICAgICAgIGlFc2NDb2RlID0gRlhTWVNfRGVjaW1hbENoYXJUb0ludChzdGF0aWNfY2FzdDxjaGFyPihjaCkpOwogICAgICAgICAgIHN0YXR1cyA9IDI7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGNoID09ICduJykgewotICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdcbicpOwotICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdyJykgewotICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdccicpOwotICAgICAgICB9IGVsc2UgaWYgKGNoID09ICd0JykgewotICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdcdCcpOwotICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdiJykgewotICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdcYicpOwotICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdmJykgewotICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdcZicpOwotICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgaWYgKGNoID09ICdccicpIHsKICAgICAgICAgICBzdGF0dXMgPSA0OwogICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdcbicpIHsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2ggPT0gJ1xuJykgeworICAgICAgICAgIC8vIERvIG5vdGhpbmcuCisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ24nKSB7CisgICAgICAgICAgYnVmIDw8ICdcbic7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ3InKSB7CisgICAgICAgICAgYnVmIDw8ICdccic7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ3QnKSB7CisgICAgICAgICAgYnVmIDw8ICdcdCc7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ2InKSB7CisgICAgICAgICAgYnVmIDw8ICdcYic7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ2YnKSB7CisgICAgICAgICAgYnVmIDw8ICdcZic7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYnVmLkFwcGVuZENoYXIoY2gpOworICAgICAgICAgIGJ1ZiA8PCBzdGF0aWNfY2FzdDxjaGFyPihjaCk7CiAgICAgICAgIH0KICAgICAgICAgc3RhdHVzID0gMDsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIDI6CiAgICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzcnKSB7CiAgICAgICAgICAgaUVzY0NvZGUgPQotICAgICAgICAgICAgICBpRXNjQ29kZSAqIDggKyBGWFNZU190b0RlY2ltYWxEaWdpdChzdGF0aWNfY2FzdDxGWF9XQ0hBUj4oY2gpKTsKKyAgICAgICAgICAgICAgaUVzY0NvZGUgKiA4ICsgRlhTWVNfRGVjaW1hbENoYXJUb0ludChzdGF0aWNfY2FzdDxjaGFyPihjaCkpOwogICAgICAgICAgIHN0YXR1cyA9IDM7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYnVmLkFwcGVuZENoYXIoaUVzY0NvZGUpOworICAgICAgICAgIGJ1ZiA8PCBzdGF0aWNfY2FzdDxjaGFyPihpRXNjQ29kZSk7CiAgICAgICAgICAgc3RhdHVzID0gMDsKICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpAQCAtNTM3LDIwICs1MzQsMTkgQEAKICAgICAgIGNhc2UgMzoKICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnNycpIHsKICAgICAgICAgICBpRXNjQ29kZSA9Ci0gICAgICAgICAgICAgIGlFc2NDb2RlICogOCArIEZYU1lTX3RvRGVjaW1hbERpZ2l0KHN0YXRpY19jYXN0PEZYX1dDSEFSPihjaCkpOwotICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKGlFc2NDb2RlKTsKKyAgICAgICAgICAgICAgaUVzY0NvZGUgKiA4ICsgRlhTWVNfRGVjaW1hbENoYXJUb0ludChzdGF0aWNfY2FzdDxjaGFyPihjaCkpOworICAgICAgICAgIGJ1ZiA8PCBzdGF0aWNfY2FzdDxjaGFyPihpRXNjQ29kZSk7CiAgICAgICAgICAgc3RhdHVzID0gMDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBidWYuQXBwZW5kQ2hhcihpRXNjQ29kZSk7CisgICAgICAgICAgYnVmIDw8IHN0YXRpY19jYXN0PGNoYXI+KGlFc2NDb2RlKTsKICAgICAgICAgICBzdGF0dXMgPSAwOwogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSA0OgogICAgICAgICBzdGF0dXMgPSAwOwotICAgICAgICBpZiAoY2ggIT0gJ1xuJykgeworICAgICAgICBpZiAoY2ggIT0gJ1xuJykKICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICB9CiAgICAgaWYgKCFQb3NpdGlvbklzSW5Cb3VuZHMoKSkKQEAgLTU2MSwxNyArNTU3LDE2IEBACiAgIGlmIChQb3NpdGlvbklzSW5Cb3VuZHMoKSkKICAgICArK21fUG9zOwogCi0gIGlmIChidWYuR2V0TGVuZ3RoKCkgPiBrTWF4U3RyaW5nTGVuZ3RoKSB7Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGJ1Zi5HZXRCdWZmZXIoKSwga01heFN0cmluZ0xlbmd0aCk7Ci0gIH0KLSAgcmV0dXJuIGJ1Zi5NYWtlU3RyaW5nKCk7CisgIHJldHVybiBCeXRlU3RyaW5nKAorICAgICAgYnVmLnN0cigpLmNfc3RyKCksCisgICAgICBzdGQ6Om1pbihzdGF0aWNfY2FzdDxzaXplX3Q+KGJ1Zi50ZWxscCgpKSwga01heFN0cmluZ0xlbmd0aCkpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUERGX1N0cmVhbVBhcnNlcjo6UmVhZEhleFN0cmluZygpIHsKK0J5dGVTdHJpbmcgQ1BERl9TdHJlYW1QYXJzZXI6OlJlYWRIZXhTdHJpbmcoKSB7CiAgIGlmICghUG9zaXRpb25Jc0luQm91bmRzKCkpCi0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CisgICAgcmV0dXJuIEJ5dGVTdHJpbmcoKTsKIAotICBDRlhfQnl0ZVRleHRCdWYgYnVmOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gYnVmOwogICBib29sIGJGaXJzdCA9IHRydWU7CiAgIGludCBjb2RlID0gMDsKICAgd2hpbGUgKFBvc2l0aW9uSXNJbkJvdW5kcygpKSB7CkBAIC01ODMsMjIgKzU3OCwyMSBAQAogICAgIGlmICghc3RkOjppc3hkaWdpdChjaCkpCiAgICAgICBjb250aW51ZTsKIAotICAgIGludCB2YWwgPSBGWFNZU190b0hleERpZ2l0KGNoKTsKKyAgICBpbnQgdmFsID0gRlhTWVNfSGV4Q2hhclRvSW50KGNoKTsKICAgICBpZiAoYkZpcnN0KSB7CiAgICAgICBjb2RlID0gdmFsICogMTY7CiAgICAgfSBlbHNlIHsKICAgICAgIGNvZGUgKz0gdmFsOwotICAgICAgYnVmLkFwcGVuZEJ5dGUoKHVpbnQ4X3QpY29kZSk7CisgICAgICBidWYgPDwgc3RhdGljX2Nhc3Q8dWludDhfdD4oY29kZSk7CiAgICAgfQogICAgIGJGaXJzdCA9ICFiRmlyc3Q7CiAgIH0KICAgaWYgKCFiRmlyc3QpCi0gICAgYnVmLkFwcGVuZENoYXIoKGNoYXIpY29kZSk7CisgICAgYnVmIDw8IHN0YXRpY19jYXN0PGNoYXI+KGNvZGUpOwogCi0gIGlmIChidWYuR2V0TGVuZ3RoKCkgPiBrTWF4U3RyaW5nTGVuZ3RoKQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhidWYuR2V0QnVmZmVyKCksIGtNYXhTdHJpbmdMZW5ndGgpOwotCi0gIHJldHVybiBidWYuTWFrZVN0cmluZygpOworICByZXR1cm4gQnl0ZVN0cmluZygKKyAgICAgIGJ1Zi5zdHIoKS5jX3N0cigpLAorICAgICAgc3RkOjptaW4oc3RhdGljX2Nhc3Q8c2l6ZV90PihidWYudGVsbHAoKSksIGtNYXhTdHJpbmdMZW5ndGgpKTsKIH0KIAogYm9vbCBDUERGX1N0cmVhbVBhcnNlcjo6UG9zaXRpb25Jc0luQm91bmRzKCkgY29uc3QgewpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zdHJlYW1wYXJzZXIuaCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc3RyZWFtcGFyc2VyLmgKaW5kZXggZmRjNDE4Yy4uMTU4NzI2YiAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zdHJlYW1wYXJzZXIuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3N0cmVhbXBhcnNlci5oCkBAIC0xNCw4ICsxNCw4IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RvY3VtZW50LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9zdHJpbmdfcG9vbF90ZW1wbGF0ZS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3dlYWtfcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9zdHJpbmdfcG9vbF90ZW1wbGF0ZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvd2Vha19wdHIuaCIKIAogY2xhc3MgQ1BERl9TdHJlYW1QYXJzZXIgewogIHB1YmxpYzoKQEAgLTI0LDEyICsyNCwxMiBAQAogICBDUERGX1N0cmVhbVBhcnNlcihjb25zdCB1aW50OF90KiBwRGF0YSwgdWludDMyX3QgZHdTaXplKTsKICAgQ1BERl9TdHJlYW1QYXJzZXIoY29uc3QgdWludDhfdCogcERhdGEsCiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dlYWtQdHI8Q0ZYX0J5dGVTdHJpbmdQb29sPiYgcFBvb2wpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWFrUHRyPEJ5dGVTdHJpbmdQb29sPiYgcFBvb2wpOwogICB+Q1BERl9TdHJlYW1QYXJzZXIoKTsKIAogICBTeW50YXhUeXBlIFBhcnNlTmV4dEVsZW1lbnQoKTsKLSAgQ0ZYX0J5dGVTdHJpbmdDIEdldFdvcmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQyhtX1dvcmRCdWZmZXIsIG1fV29yZFNpemUpOworICBCeXRlU3RyaW5nVmlldyBHZXRXb3JkKCkgY29uc3QgeworICAgIHJldHVybiBCeXRlU3RyaW5nVmlldyhtX1dvcmRCdWZmZXIsIG1fV29yZFNpemUpOwogICB9CiAgIHVpbnQzMl90IEdldFBvcygpIGNvbnN0IHsgcmV0dXJuIG1fUG9zOyB9CiAgIHZvaWQgU2V0UG9zKHVpbnQzMl90IHBvcykgeyBtX1BvcyA9IHBvczsgfQpAQCAtNDYsOCArNDYsOCBAQAogICBmcmllbmQgY2xhc3MgY3BkZl9zdHJlYW1wYXJzZXJfUmVhZEhleFN0cmluZ19UZXN0OwogCiAgIHZvaWQgR2V0TmV4dFdvcmQoYm9vbCYgYklzTnVtYmVyKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgUmVhZFN0cmluZygpOwotICBDRlhfQnl0ZVN0cmluZyBSZWFkSGV4U3RyaW5nKCk7CisgIEJ5dGVTdHJpbmcgUmVhZFN0cmluZygpOworICBCeXRlU3RyaW5nIFJlYWRIZXhTdHJpbmcoKTsKICAgYm9vbCBQb3NpdGlvbklzSW5Cb3VuZHMoKSBjb25zdDsKIAogICBjb25zdCB1aW50OF90KiBtX3BCdWY7CkBAIC01Niw3ICs1Niw3IEBACiAgIHVpbnQ4X3QgbV9Xb3JkQnVmZmVyWzI1Nl07CiAgIHVpbnQzMl90IG1fV29yZFNpemU7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gbV9wTGFzdE9iajsKLSAgQ0ZYX1dlYWtQdHI8Q0ZYX0J5dGVTdHJpbmdQb29sPiBtX3BQb29sOworICBXZWFrUHRyPEJ5dGVTdHJpbmdQb29sPiBtX3BQb29sOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfUEFHRV9DUERGX1NUUkVBTVBBUlNFUl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl90ZXh0b2JqZWN0LmNwcCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfdGV4dG9iamVjdC5jcHAKaW5kZXggZGE2OWRlOC4uMGQ2MGQ1MCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl90ZXh0b2JqZWN0LmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3RleHRvYmplY3QuY3BwCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfdGV4dG9iamVjdC5oIgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHV0aWxpdHk+CiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NpZGZvbnQuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2ZvbnQuaCIKQEAgLTE5LDE1ICsyMCwyMCBAQAogCiBDUERGX1RleHRPYmplY3Q6OkNQREZfVGV4dE9iamVjdCgpIHt9CiAKLUNQREZfVGV4dE9iamVjdDo6fkNQREZfVGV4dE9iamVjdCgpIHt9Ci0KLWludCBDUERGX1RleHRPYmplY3Q6OkNvdW50SXRlbXMoKSBjb25zdCB7Ci0gIHJldHVybiBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludD4obV9DaGFyQ29kZXMpOworQ1BERl9UZXh0T2JqZWN0Ojp+Q1BERl9UZXh0T2JqZWN0KCkgeworICAvLyBNb3ZlIG1fQ2hhckNvZGVzIHRvIGEgbG9jYWwgdmFyaWFibGUgc28gaXQgd2lsbCBiZSBjYXB0dXJlZCBpbiBjcmFzaCBkdW1wcywKKyAgLy8gdG8gaGVscCB3aXRoIGludmVzdGlnYXRpbmcgY3JidWcuY29tLzc4MjIxNS4KKyAgYXV0byBjaGFyX2NvZGVzX2NvcHkgPSBzdGQ6Om1vdmUobV9DaGFyQ29kZXMpOwogfQogCi12b2lkIENQREZfVGV4dE9iamVjdDo6R2V0SXRlbUluZm8oaW50IGluZGV4LCBDUERGX1RleHRPYmplY3RJdGVtKiBwSW5mbykgY29uc3Qgeworc2l6ZV90IENQREZfVGV4dE9iamVjdDo6Q291bnRJdGVtcygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fQ2hhckNvZGVzLnNpemUoKTsKK30KKwordm9pZCBDUERGX1RleHRPYmplY3Q6OkdldEl0ZW1JbmZvKHNpemVfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1RleHRPYmplY3RJdGVtKiBwSW5mbykgY29uc3QgewogICBwSW5mby0+bV9DaGFyQ29kZSA9IG1fQ2hhckNvZGVzW2luZGV4XTsKLSAgcEluZm8tPm1fT3JpZ2luID0gQ0ZYX1BvaW50RihpbmRleCA/IG1fQ2hhclBvc1tpbmRleCAtIDFdIDogMCwgMCk7CisgIHBJbmZvLT5tX09yaWdpbiA9IENGWF9Qb2ludEYoaW5kZXggPiAwID8gbV9DaGFyUG9zW2luZGV4IC0gMV0gOiAwLCAwKTsKICAgaWYgKHBJbmZvLT5tX0NoYXJDb2RlID09IENQREZfRm9udDo6a0ludmFsaWRDaGFyQ29kZSkKICAgICByZXR1cm47CiAKQEAgLTQ0LDI0ICs1MCwyNCBAQAogICBzaG9ydCB2eTsKICAgcEZvbnQtPkFzQ0lERm9udCgpLT5HZXRWZXJ0T3JpZ2luKENJRCwgdngsIHZ5KTsKIAotICBGWF9GTE9BVCBmb250c2l6ZSA9IG1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCk7CisgIGZsb2F0IGZvbnRzaXplID0gbV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKTsKICAgcEluZm8tPm1fT3JpZ2luLnggLT0gZm9udHNpemUgKiB2eCAvIDEwMDA7CiAgIHBJbmZvLT5tX09yaWdpbi55IC09IGZvbnRzaXplICogdnkgLyAxMDAwOwogfQogCi1pbnQgQ1BERl9UZXh0T2JqZWN0OjpDb3VudENoYXJzKCkgY29uc3QgewotICBpbnQgY291bnQgPSAwOworc2l6ZV90IENQREZfVGV4dE9iamVjdDo6Q291bnRDaGFycygpIGNvbnN0IHsKKyAgc2l6ZV90IGNvdW50ID0gMDsKICAgZm9yICh1aW50MzJfdCBjaGFyY29kZSA6IG1fQ2hhckNvZGVzKSB7CiAgICAgaWYgKGNoYXJjb2RlICE9IENQREZfRm9udDo6a0ludmFsaWRDaGFyQ29kZSkKLSAgICAgIGNvdW50Kys7CisgICAgICArK2NvdW50OwogICB9CiAgIHJldHVybiBjb3VudDsKIH0KIAotdm9pZCBDUERGX1RleHRPYmplY3Q6OkdldENoYXJJbmZvKGludCBpbmRleCwKK3ZvaWQgQ1BERl9UZXh0T2JqZWN0OjpHZXRDaGFySW5mbyhzaXplX3QgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNoYXJjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBrZXJuaW5nKSBjb25zdCB7Ci0gIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGtlcm5pbmcpIGNvbnN0IHsKKyAgc2l6ZV90IGNvdW50ID0gMDsKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX0NoYXJDb2Rlcy5zaXplKCk7ICsraSkgewogICAgIGlmIChtX0NoYXJDb2Rlc1tpXSA9PSBDUERGX0ZvbnQ6OmtJbnZhbGlkQ2hhckNvZGUpCiAgICAgICBjb250aW51ZTsKQEAgLTc4LDkgKzg0LDEwIEBACiAgIH0KIH0KIAotdm9pZCBDUERGX1RleHRPYmplY3Q6OkdldENoYXJJbmZvKGludCBpbmRleCwgQ1BERl9UZXh0T2JqZWN0SXRlbSogcEluZm8pIGNvbnN0IHsKLSAgaW50IGNvdW50ID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludD4obV9DaGFyQ29kZXMpOyArK2kpIHsKK3ZvaWQgQ1BERl9UZXh0T2JqZWN0OjpHZXRDaGFySW5mbyhzaXplX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9UZXh0T2JqZWN0SXRlbSogcEluZm8pIGNvbnN0IHsKKyAgc2l6ZV90IGNvdW50ID0gMDsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX0NoYXJDb2Rlcy5zaXplKCk7ICsraSkgewogICAgIHVpbnQzMl90IGNoYXJjb2RlID0gbV9DaGFyQ29kZXNbaV07CiAgICAgaWYgKGNoYXJjb2RlID09IENQREZfRm9udDo6a0ludmFsaWRDaGFyQ29kZSkKICAgICAgIGNvbnRpbnVlOwpAQCAtMTA4LDEzICsxMTUsMTQgQEAKICAgQ0ZYX01hdHJpeCB0ZXh0X21hdHJpeCA9IEdldFRleHRNYXRyaXgoKTsKICAgdGV4dF9tYXRyaXguQ29uY2F0KG1hdHJpeCk7CiAKLSAgRlhfRkxPQVQqIHBUZXh0TWF0cml4ID0gbV9UZXh0U3RhdGUuR2V0TXV0YWJsZU1hdHJpeCgpOworICBmbG9hdCogcFRleHRNYXRyaXggPSBtX1RleHRTdGF0ZS5HZXRNdXRhYmxlTWF0cml4KCk7CiAgIHBUZXh0TWF0cml4WzBdID0gdGV4dF9tYXRyaXguYTsKICAgcFRleHRNYXRyaXhbMV0gPSB0ZXh0X21hdHJpeC5jOwogICBwVGV4dE1hdHJpeFsyXSA9IHRleHRfbWF0cml4LmI7CiAgIHBUZXh0TWF0cml4WzNdID0gdGV4dF9tYXRyaXguZDsKICAgbV9Qb3MgPSBDRlhfUG9pbnRGKHRleHRfbWF0cml4LmUsIHRleHRfbWF0cml4LmYpOwogICBDYWxjUG9zaXRpb25EYXRhKDApOworICBTZXREaXJ0eSh0cnVlKTsKIH0KIAogYm9vbCBDUERGX1RleHRPYmplY3Q6OklzVGV4dCgpIGNvbnN0IHsKQEAgLTEzMCwxMyArMTM4LDEzIEBACiB9CiAKIENGWF9NYXRyaXggQ1BERl9UZXh0T2JqZWN0OjpHZXRUZXh0TWF0cml4KCkgY29uc3QgewotICBjb25zdCBGWF9GTE9BVCogcFRleHRNYXRyaXggPSBtX1RleHRTdGF0ZS5HZXRNYXRyaXgoKTsKKyAgY29uc3QgZmxvYXQqIHBUZXh0TWF0cml4ID0gbV9UZXh0U3RhdGUuR2V0TWF0cml4KCk7CiAgIHJldHVybiBDRlhfTWF0cml4KHBUZXh0TWF0cml4WzBdLCBwVGV4dE1hdHJpeFsyXSwgcFRleHRNYXRyaXhbMV0sCiAgICAgICAgICAgICAgICAgICAgIHBUZXh0TWF0cml4WzNdLCBtX1Bvcy54LCBtX1Bvcy55KTsKIH0KIAotdm9pZCBDUERGX1RleHRPYmplY3Q6OlNldFNlZ21lbnRzKGNvbnN0IENGWF9CeXRlU3RyaW5nKiBwU3RycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9GTE9BVCogcEtlcm5pbmcsCit2b2lkIENQREZfVGV4dE9iamVjdDo6U2V0U2VnbWVudHMoY29uc3QgQnl0ZVN0cmluZyogcFN0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHBLZXJuaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuc2VncykgewogICBtX0NoYXJDb2Rlcy5jbGVhcigpOwogICBtX0NoYXJQb3MuY2xlYXIoKTsKQEAgLTE0OSw3ICsxNTcsNyBAQAogICBtX0NoYXJQb3MucmVzaXplKG5DaGFycyAtIDEpOwogICBpbnQgaW5kZXggPSAwOwogICBmb3IgKGludCBpID0gMDsgaSA8IG5zZWdzOyArK2kpIHsKLSAgICBjb25zdCBGWF9DSEFSKiBzZWdtZW50ID0gcFN0cnNbaV0uY19zdHIoKTsKKyAgICBjb25zdCBjaGFyKiBzZWdtZW50ID0gcFN0cnNbaV0uY19zdHIoKTsKICAgICBpbnQgbGVuID0gcFN0cnNbaV0uR2V0TGVuZ3RoKCk7CiAgICAgaW50IG9mZnNldCA9IDA7CiAgICAgd2hpbGUgKG9mZnNldCA8IGxlbikKQEAgLTE2MSwxMyArMTY5LDE0IEBACiAgIH0KIH0KIAotdm9pZCBDUERGX1RleHRPYmplY3Q6OlNldFRleHQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikgewordm9pZCBDUERGX1RleHRPYmplY3Q6OlNldFRleHQoY29uc3QgQnl0ZVN0cmluZyYgc3RyKSB7CiAgIFNldFNlZ21lbnRzKCZzdHIsIG51bGxwdHIsIDEpOwogICBSZWNhbGNQb3NpdGlvbkRhdGEoKTsKKyAgU2V0RGlydHkodHJ1ZSk7CiB9CiAKLUZYX0ZMT0FUIENQREZfVGV4dE9iamVjdDo6R2V0Q2hhcldpZHRoKHVpbnQzMl90IGNoYXJjb2RlKSBjb25zdCB7Ci0gIEZYX0ZMT0FUIGZvbnRzaXplID0gbV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKSAvIDEwMDA7CitmbG9hdCBDUERGX1RleHRPYmplY3Q6OkdldENoYXJXaWR0aCh1aW50MzJfdCBjaGFyY29kZSkgY29uc3QgeworICBmbG9hdCBmb250c2l6ZSA9IG1fVGV4dFN0YXRlLkdldEZvbnRTaXplKCkgLyAxMDAwOwogICBDUERGX0ZvbnQqIHBGb250ID0gbV9UZXh0U3RhdGUuR2V0Rm9udCgpOwogICBib29sIGJWZXJ0V3JpdGluZyA9IGZhbHNlOwogICBDUERGX0NJREZvbnQqIHBDSURGb250ID0gcEZvbnQtPkFzQ0lERm9udCgpOwpAQCAtMTg0LDI0ICsxOTMsMjQgQEAKICAgcmV0dXJuIG1fVGV4dFN0YXRlLkdldEZvbnQoKTsKIH0KIAotRlhfRkxPQVQgQ1BERl9UZXh0T2JqZWN0OjpHZXRGb250U2l6ZSgpIGNvbnN0IHsKK2Zsb2F0IENQREZfVGV4dE9iamVjdDo6R2V0Rm9udFNpemUoKSBjb25zdCB7CiAgIHJldHVybiBtX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpOwogfQogCi1DRlhfUG9pbnRGIENQREZfVGV4dE9iamVjdDo6Q2FsY1Bvc2l0aW9uRGF0YShGWF9GTE9BVCBob3J6X3NjYWxlKSB7Ci0gIEZYX0ZMT0FUIGN1cnBvcyA9IDA7Ci0gIEZYX0ZMT0FUIG1pbl94ID0gMTAwMDAgKiAxLjBmOwotICBGWF9GTE9BVCBtYXhfeCA9IC0xMDAwMCAqIDEuMGY7Ci0gIEZYX0ZMT0FUIG1pbl95ID0gMTAwMDAgKiAxLjBmOwotICBGWF9GTE9BVCBtYXhfeSA9IC0xMDAwMCAqIDEuMGY7CitDRlhfUG9pbnRGIENQREZfVGV4dE9iamVjdDo6Q2FsY1Bvc2l0aW9uRGF0YShmbG9hdCBob3J6X3NjYWxlKSB7CisgIGZsb2F0IGN1cnBvcyA9IDA7CisgIGZsb2F0IG1pbl94ID0gMTAwMDAgKiAxLjBmOworICBmbG9hdCBtYXhfeCA9IC0xMDAwMCAqIDEuMGY7CisgIGZsb2F0IG1pbl95ID0gMTAwMDAgKiAxLjBmOworICBmbG9hdCBtYXhfeSA9IC0xMDAwMCAqIDEuMGY7CiAgIENQREZfRm9udCogcEZvbnQgPSBtX1RleHRTdGF0ZS5HZXRGb250KCk7CiAgIGJvb2wgYlZlcnRXcml0aW5nID0gZmFsc2U7CiAgIENQREZfQ0lERm9udCogcENJREZvbnQgPSBwRm9udC0+QXNDSURGb250KCk7CiAgIGlmIChwQ0lERm9udCkKICAgICBiVmVydFdyaXRpbmcgPSBwQ0lERm9udC0+SXNWZXJ0V3JpdGluZygpOwogCi0gIEZYX0ZMT0FUIGZvbnRzaXplID0gbV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludD4obV9DaGFyQ29kZXMpOyArK2kpIHsKKyAgZmxvYXQgZm9udHNpemUgPSBtX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fQ2hhckNvZGVzLnNpemUoKTsgKytpKSB7CiAgICAgdWludDMyX3QgY2hhcmNvZGUgPSBtX0NoYXJDb2Rlc1tpXTsKICAgICBpZiAoaSA+IDApIHsKICAgICAgIGlmIChjaGFyY29kZSA9PSBDUERGX0ZvbnQ6OmtJbnZhbGlkQ2hhckNvZGUpIHsKQEAgLTIxMiwxNCArMjIxLDE0IEBACiAgICAgfQogCiAgICAgRlhfUkVDVCBjaGFyX3JlY3QgPSBwRm9udC0+R2V0Q2hhckJCb3goY2hhcmNvZGUpOwotICAgIEZYX0ZMT0FUIGNoYXJ3aWR0aDsKKyAgICBmbG9hdCBjaGFyd2lkdGg7CiAgICAgaWYgKCFiVmVydFdyaXRpbmcpIHsKLSAgICAgIG1pbl95ID0gc3RkOjptaW4obWluX3ksIHN0YXRpY19jYXN0PEZYX0ZMT0FUPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1pbihjaGFyX3JlY3QudG9wLCBjaGFyX3JlY3QuYm90dG9tKSkpOwotICAgICAgbWF4X3kgPSBzdGQ6Om1heChtYXhfeSwgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWF4KGNoYXJfcmVjdC50b3AsIGNoYXJfcmVjdC5ib3R0b20pKSk7Ci0gICAgICBGWF9GTE9BVCBjaGFyX2xlZnQgPSBjdXJwb3MgKyBjaGFyX3JlY3QubGVmdCAqIGZvbnRzaXplIC8gMTAwMDsKLSAgICAgIEZYX0ZMT0FUIGNoYXJfcmlnaHQgPSBjdXJwb3MgKyBjaGFyX3JlY3QucmlnaHQgKiBmb250c2l6ZSAvIDEwMDA7CisgICAgICBtaW5feSA9IHN0ZDo6bWluKAorICAgICAgICAgIG1pbl95LCBzdGF0aWNfY2FzdDxmbG9hdD4oc3RkOjptaW4oY2hhcl9yZWN0LnRvcCwgY2hhcl9yZWN0LmJvdHRvbSkpKTsKKyAgICAgIG1heF95ID0gc3RkOjptYXgoCisgICAgICAgICAgbWF4X3ksIHN0YXRpY19jYXN0PGZsb2F0PihzdGQ6Om1heChjaGFyX3JlY3QudG9wLCBjaGFyX3JlY3QuYm90dG9tKSkpOworICAgICAgZmxvYXQgY2hhcl9sZWZ0ID0gY3VycG9zICsgY2hhcl9yZWN0LmxlZnQgKiBmb250c2l6ZSAvIDEwMDA7CisgICAgICBmbG9hdCBjaGFyX3JpZ2h0ID0gY3VycG9zICsgY2hhcl9yZWN0LnJpZ2h0ICogZm9udHNpemUgLyAxMDAwOwogICAgICAgbWluX3ggPSBzdGQ6Om1pbihtaW5feCwgc3RkOjptaW4oY2hhcl9sZWZ0LCBjaGFyX3JpZ2h0KSk7CiAgICAgICBtYXhfeCA9IHN0ZDo6bWF4KG1heF94LCBzdGQ6Om1heChjaGFyX2xlZnQsIGNoYXJfcmlnaHQpKTsKICAgICAgIGNoYXJ3aWR0aCA9IHBGb250LT5HZXRDaGFyV2lkdGhGKGNoYXJjb2RlKSAqIGZvbnRzaXplIC8gMTAwMDsKQEAgLTIzMiwxMiArMjQxLDEyIEBACiAgICAgICBjaGFyX3JlY3QucmlnaHQgLT0gdng7CiAgICAgICBjaGFyX3JlY3QudG9wIC09IHZ5OwogICAgICAgY2hhcl9yZWN0LmJvdHRvbSAtPSB2eTsKLSAgICAgIG1pbl94ID0gc3RkOjptaW4obWluX3gsIHN0YXRpY19jYXN0PEZYX0ZMT0FUPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1pbihjaGFyX3JlY3QubGVmdCwgY2hhcl9yZWN0LnJpZ2h0KSkpOwotICAgICAgbWF4X3ggPSBzdGQ6Om1heChtYXhfeCwgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWF4KGNoYXJfcmVjdC5sZWZ0LCBjaGFyX3JlY3QucmlnaHQpKSk7Ci0gICAgICBGWF9GTE9BVCBjaGFyX3RvcCA9IGN1cnBvcyArIGNoYXJfcmVjdC50b3AgKiBmb250c2l6ZSAvIDEwMDA7Ci0gICAgICBGWF9GTE9BVCBjaGFyX2JvdHRvbSA9IGN1cnBvcyArIGNoYXJfcmVjdC5ib3R0b20gKiBmb250c2l6ZSAvIDEwMDA7CisgICAgICBtaW5feCA9IHN0ZDo6bWluKAorICAgICAgICAgIG1pbl94LCBzdGF0aWNfY2FzdDxmbG9hdD4oc3RkOjptaW4oY2hhcl9yZWN0LmxlZnQsIGNoYXJfcmVjdC5yaWdodCkpKTsKKyAgICAgIG1heF94ID0gc3RkOjptYXgoCisgICAgICAgICAgbWF4X3gsIHN0YXRpY19jYXN0PGZsb2F0PihzdGQ6Om1heChjaGFyX3JlY3QubGVmdCwgY2hhcl9yZWN0LnJpZ2h0KSkpOworICAgICAgZmxvYXQgY2hhcl90b3AgPSBjdXJwb3MgKyBjaGFyX3JlY3QudG9wICogZm9udHNpemUgLyAxMDAwOworICAgICAgZmxvYXQgY2hhcl9ib3R0b20gPSBjdXJwb3MgKyBjaGFyX3JlY3QuYm90dG9tICogZm9udHNpemUgLyAxMDAwOwogICAgICAgbWluX3kgPSBzdGQ6Om1pbihtaW5feSwgc3RkOjptaW4oY2hhcl90b3AsIGNoYXJfYm90dG9tKSk7CiAgICAgICBtYXhfeSA9IHN0ZDo6bWF4KG1heF95LCBzdGQ6Om1heChjaGFyX3RvcCwgY2hhcl9ib3R0b20pKTsKICAgICAgIGNoYXJ3aWR0aCA9IHBDSURGb250LT5HZXRWZXJ0V2lkdGgoQ0lEKSAqIGZvbnRzaXplIC8gMTAwMDsKQEAgLTI1OSwxNyArMjY4LDEzIEBACiAgICAgbWluX3kgPSBtaW5feSAqIGZvbnRzaXplIC8gMTAwMDsKICAgICBtYXhfeSA9IG1heF95ICogZm9udHNpemUgLyAxMDAwOwogICB9Ci0KLSAgbV9MZWZ0ID0gbWluX3g7Ci0gIG1fUmlnaHQgPSBtYXhfeDsKLSAgbV9Cb3R0b20gPSBtaW5feTsKLSAgbV9Ub3AgPSBtYXhfeTsKLSAgR2V0VGV4dE1hdHJpeCgpLlRyYW5zZm9ybVJlY3QobV9MZWZ0LCBtX1JpZ2h0LCBtX1RvcCwgbV9Cb3R0b20pOworICBzdGQ6OnRpZShtX0xlZnQsIG1fUmlnaHQsIG1fVG9wLCBtX0JvdHRvbSkgPQorICAgICAgR2V0VGV4dE1hdHJpeCgpLlRyYW5zZm9ybVJlY3QobWluX3gsIG1heF94LCBtYXhfeSwgbWluX3kpOwogCiAgIGlmICghVGV4dFJlbmRlcmluZ01vZGVJc1N0cm9rZU1vZGUobV9UZXh0U3RhdGUuR2V0VGV4dE1vZGUoKSkpCiAgICAgcmV0dXJuIHJldDsKIAotICBGWF9GTE9BVCBoYWxmX3dpZHRoID0gbV9HcmFwaFN0YXRlLkdldExpbmVXaWR0aCgpIC8gMjsKKyAgZmxvYXQgaGFsZl93aWR0aCA9IG1fR3JhcGhTdGF0ZS5HZXRMaW5lV2lkdGgoKSAvIDI7CiAgIG1fTGVmdCAtPSBoYWxmX3dpZHRoOwogICBtX1JpZ2h0ICs9IGhhbGZfd2lkdGg7CiAgIG1fVG9wICs9IGhhbGZfd2lkdGg7CkBAIC0yNzgsOSArMjgzLDkgQEAKICAgcmV0dXJuIHJldDsKIH0KIAotdm9pZCBDUERGX1RleHRPYmplY3Q6OlNldFBvc2l0aW9uKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpIHsKLSAgRlhfRkxPQVQgZHggPSB4IC0gbV9Qb3MueDsKLSAgRlhfRkxPQVQgZHkgPSB5IC0gbV9Qb3MueTsKK3ZvaWQgQ1BERl9UZXh0T2JqZWN0OjpTZXRQb3NpdGlvbihmbG9hdCB4LCBmbG9hdCB5KSB7CisgIGZsb2F0IGR4ID0geCAtIG1fUG9zLng7CisgIGZsb2F0IGR5ID0geSAtIG1fUG9zLnk7CiAgIG1fUG9zLnggPSB4OwogICBtX1Bvcy55ID0geTsKICAgbV9MZWZ0ICs9IGR4OwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl90ZXh0b2JqZWN0LmggYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3RleHRvYmplY3QuaAppbmRleCA1OWRhNzE4Li5hNmZjNjIzIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3RleHRvYmplY3QuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3RleHRvYmplY3QuaApAQCAtMzYsMzcgKzM2LDM2IEBACiAgIGNvbnN0IENQREZfVGV4dE9iamVjdCogQXNUZXh0KCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfVGV4dE9iamVjdD4gQ2xvbmUoKSBjb25zdDsKLSAgaW50IENvdW50SXRlbXMoKSBjb25zdDsKLSAgdm9pZCBHZXRJdGVtSW5mbyhpbnQgaW5kZXgsIENQREZfVGV4dE9iamVjdEl0ZW0qIHBJbmZvKSBjb25zdDsKLSAgaW50IENvdW50Q2hhcnMoKSBjb25zdDsKLSAgdm9pZCBHZXRDaGFySW5mbyhpbnQgaW5kZXgsIHVpbnQzMl90KiBjaGFyY29kZSwgRlhfRkxPQVQqIGtlcm5pbmcpIGNvbnN0OwotICB2b2lkIEdldENoYXJJbmZvKGludCBpbmRleCwgQ1BERl9UZXh0T2JqZWN0SXRlbSogcEluZm8pIGNvbnN0OwotICBGWF9GTE9BVCBHZXRDaGFyV2lkdGgodWludDMyX3QgY2hhcmNvZGUpIGNvbnN0OworCisgIHNpemVfdCBDb3VudEl0ZW1zKCkgY29uc3Q7CisgIHZvaWQgR2V0SXRlbUluZm8oc2l6ZV90IGluZGV4LCBDUERGX1RleHRPYmplY3RJdGVtKiBwSW5mbykgY29uc3Q7CisKKyAgc2l6ZV90IENvdW50Q2hhcnMoKSBjb25zdDsKKyAgdm9pZCBHZXRDaGFySW5mbyhzaXplX3QgaW5kZXgsIHVpbnQzMl90KiBjaGFyY29kZSwgZmxvYXQqIGtlcm5pbmcpIGNvbnN0OworICB2b2lkIEdldENoYXJJbmZvKHNpemVfdCBpbmRleCwgQ1BERl9UZXh0T2JqZWN0SXRlbSogcEluZm8pIGNvbnN0OworICBmbG9hdCBHZXRDaGFyV2lkdGgodWludDMyX3QgY2hhcmNvZGUpIGNvbnN0OworCiAgIENGWF9Qb2ludEYgR2V0UG9zKCkgY29uc3QgeyByZXR1cm4gbV9Qb3M7IH0KICAgQ0ZYX01hdHJpeCBHZXRUZXh0TWF0cml4KCkgY29uc3Q7CiAgIENQREZfRm9udCogR2V0Rm9udCgpIGNvbnN0OwotICBGWF9GTE9BVCBHZXRGb250U2l6ZSgpIGNvbnN0OworICBmbG9hdCBHZXRGb250U2l6ZSgpIGNvbnN0OwogCi0gIHZvaWQgU2V0VGV4dChjb25zdCBDRlhfQnl0ZVN0cmluZyYgdGV4dCk7Ci0gIHZvaWQgU2V0UG9zaXRpb24oRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSk7CisgIHZvaWQgU2V0VGV4dChjb25zdCBCeXRlU3RyaW5nJiB0ZXh0KTsKKyAgdm9pZCBTZXRQb3NpdGlvbihDRlhfUG9pbnRGIHBvcykgeyBtX1BvcyA9IHBvczsgfQorICB2b2lkIFNldFBvc2l0aW9uKGZsb2F0IHgsIGZsb2F0IHkpOwogCiAgIHZvaWQgUmVjYWxjUG9zaXRpb25EYXRhKCk7CiAKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBHZXRDaGFyQ29kZXMoKSBjb25zdCB7IHJldHVybiBtX0NoYXJDb2RlczsgfQorICBjb25zdCBzdGQ6OnZlY3RvcjxmbG9hdD4mIEdldENoYXJQb3NpdGlvbnMoKSBjb25zdCB7IHJldHVybiBtX0NoYXJQb3M7IH0KKworICB2b2lkIFNldFNlZ21lbnRzKGNvbnN0IEJ5dGVTdHJpbmcqIHBTdHJzLCBjb25zdCBmbG9hdCogcEtlcm5pbmcsIGludCBuU2Vncyk7CisgIENGWF9Qb2ludEYgQ2FsY1Bvc2l0aW9uRGF0YShmbG9hdCBob3J6X3NjYWxlKTsKKwogIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBDUERGX1JlbmRlclN0YXR1czsKLSAgZnJpZW5kIGNsYXNzIENQREZfU3RyZWFtQ29udGVudFBhcnNlcjsKLSAgZnJpZW5kIGNsYXNzIENQREZfVGV4dFJlbmRlcmVyOwotICBmcmllbmQgY2xhc3MgQ1BERl9QYWdlQ29udGVudEdlbmVyYXRvcjsKLQotICB2b2lkIFNldFNlZ21lbnRzKGNvbnN0IENGWF9CeXRlU3RyaW5nKiBwU3RycywKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9GTE9BVCogcEtlcm5pbmcsCi0gICAgICAgICAgICAgICAgICAgaW50IG5TZWdzKTsKLQotICBDRlhfUG9pbnRGIENhbGNQb3NpdGlvbkRhdGEoRlhfRkxPQVQgaG9yel9zY2FsZSk7Ci0KICAgQ0ZYX1BvaW50RiBtX1BvczsKICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IG1fQ2hhckNvZGVzOwotICBzdGQ6OnZlY3RvcjxGWF9GTE9BVD4gbV9DaGFyUG9zOworICBzdGQ6OnZlY3RvcjxmbG9hdD4gbV9DaGFyUG9zOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfUEFHRV9DUERGX1RFWFRPQkpFQ1RfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfdGV4dHN0YXRlLmNwcCBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfdGV4dHN0YXRlLmNwcAppbmRleCA5OTBjOWNjLi5iZDIzNmEyIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3RleHRzdGF0ZS5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl90ZXh0c3RhdGUuY3BwCkBAIC0yNSw1MSArMjUsNTEgQEAKICAgbV9SZWYuR2V0UHJpdmF0ZUNvcHkoKS0+U2V0Rm9udChwRm9udCk7CiB9CiAKLUZYX0ZMT0FUIENQREZfVGV4dFN0YXRlOjpHZXRGb250U2l6ZSgpIGNvbnN0IHsKK2Zsb2F0IENQREZfVGV4dFN0YXRlOjpHZXRGb250U2l6ZSgpIGNvbnN0IHsKICAgcmV0dXJuIG1fUmVmLkdldE9iamVjdCgpLT5tX0ZvbnRTaXplOwogfQogCi12b2lkIENQREZfVGV4dFN0YXRlOjpTZXRGb250U2l6ZShGWF9GTE9BVCBzaXplKSB7Cit2b2lkIENQREZfVGV4dFN0YXRlOjpTZXRGb250U2l6ZShmbG9hdCBzaXplKSB7CiAgIG1fUmVmLkdldFByaXZhdGVDb3B5KCktPm1fRm9udFNpemUgPSBzaXplOwogfQogCi1jb25zdCBGWF9GTE9BVCogQ1BERl9UZXh0U3RhdGU6OkdldE1hdHJpeCgpIGNvbnN0IHsKK2NvbnN0IGZsb2F0KiBDUERGX1RleHRTdGF0ZTo6R2V0TWF0cml4KCkgY29uc3QgewogICByZXR1cm4gbV9SZWYuR2V0T2JqZWN0KCktPm1fTWF0cml4OwogfQogCi1GWF9GTE9BVCogQ1BERl9UZXh0U3RhdGU6OkdldE11dGFibGVNYXRyaXgoKSB7CitmbG9hdCogQ1BERl9UZXh0U3RhdGU6OkdldE11dGFibGVNYXRyaXgoKSB7CiAgIHJldHVybiBtX1JlZi5HZXRQcml2YXRlQ29weSgpLT5tX01hdHJpeDsKIH0KIAotRlhfRkxPQVQgQ1BERl9UZXh0U3RhdGU6OkdldENoYXJTcGFjZSgpIGNvbnN0IHsKK2Zsb2F0IENQREZfVGV4dFN0YXRlOjpHZXRDaGFyU3BhY2UoKSBjb25zdCB7CiAgIHJldHVybiBtX1JlZi5HZXRPYmplY3QoKS0+bV9DaGFyU3BhY2U7CiB9CiAKLXZvaWQgQ1BERl9UZXh0U3RhdGU6OlNldENoYXJTcGFjZShGWF9GTE9BVCBzcCkgewordm9pZCBDUERGX1RleHRTdGF0ZTo6U2V0Q2hhclNwYWNlKGZsb2F0IHNwKSB7CiAgIG1fUmVmLkdldFByaXZhdGVDb3B5KCktPm1fQ2hhclNwYWNlID0gc3A7CiB9CiAKLUZYX0ZMT0FUIENQREZfVGV4dFN0YXRlOjpHZXRXb3JkU3BhY2UoKSBjb25zdCB7CitmbG9hdCBDUERGX1RleHRTdGF0ZTo6R2V0V29yZFNwYWNlKCkgY29uc3QgewogICByZXR1cm4gbV9SZWYuR2V0T2JqZWN0KCktPm1fV29yZFNwYWNlOwogfQogCi12b2lkIENQREZfVGV4dFN0YXRlOjpTZXRXb3JkU3BhY2UoRlhfRkxPQVQgc3ApIHsKK3ZvaWQgQ1BERl9UZXh0U3RhdGU6OlNldFdvcmRTcGFjZShmbG9hdCBzcCkgewogICBtX1JlZi5HZXRQcml2YXRlQ29weSgpLT5tX1dvcmRTcGFjZSA9IHNwOwogfQogCi1GWF9GTE9BVCBDUERGX1RleHRTdGF0ZTo6R2V0Rm9udFNpemVWKCkgY29uc3QgeworZmxvYXQgQ1BERl9UZXh0U3RhdGU6OkdldEZvbnRTaXplVigpIGNvbnN0IHsKICAgcmV0dXJuIG1fUmVmLkdldE9iamVjdCgpLT5HZXRGb250U2l6ZVYoKTsKIH0KIAotRlhfRkxPQVQgQ1BERl9UZXh0U3RhdGU6OkdldEZvbnRTaXplSCgpIGNvbnN0IHsKK2Zsb2F0IENQREZfVGV4dFN0YXRlOjpHZXRGb250U2l6ZUgoKSBjb25zdCB7CiAgIHJldHVybiBtX1JlZi5HZXRPYmplY3QoKS0+R2V0Rm9udFNpemVIKCk7CiB9CiAKLUZYX0ZMT0FUIENQREZfVGV4dFN0YXRlOjpHZXRCYXNlbGluZUFuZ2xlKCkgY29uc3QgeworZmxvYXQgQ1BERl9UZXh0U3RhdGU6OkdldEJhc2VsaW5lQW5nbGUoKSBjb25zdCB7CiAgIHJldHVybiBtX1JlZi5HZXRPYmplY3QoKS0+R2V0QmFzZWxpbmVBbmdsZSgpOwogfQogCi1GWF9GTE9BVCBDUERGX1RleHRTdGF0ZTo6R2V0U2hlYXJBbmdsZSgpIGNvbnN0IHsKK2Zsb2F0IENQREZfVGV4dFN0YXRlOjpHZXRTaGVhckFuZ2xlKCkgY29uc3QgewogICByZXR1cm4gbV9SZWYuR2V0T2JqZWN0KCktPkdldFNoZWFyQW5nbGUoKTsKIH0KIApAQCAtODEsMTEgKzgxLDExIEBACiAgIG1fUmVmLkdldFByaXZhdGVDb3B5KCktPm1fVGV4dE1vZGUgPSBtb2RlOwogfQogCi1jb25zdCBGWF9GTE9BVCogQ1BERl9UZXh0U3RhdGU6OkdldENUTSgpIGNvbnN0IHsKK2NvbnN0IGZsb2F0KiBDUERGX1RleHRTdGF0ZTo6R2V0Q1RNKCkgY29uc3QgewogICByZXR1cm4gbV9SZWYuR2V0T2JqZWN0KCktPm1fQ1RNOwogfQogCi1GWF9GTE9BVCogQ1BERl9UZXh0U3RhdGU6OkdldE11dGFibGVDVE0oKSB7CitmbG9hdCogQ1BERl9UZXh0U3RhdGU6OkdldE11dGFibGVDVE0oKSB7CiAgIHJldHVybiBtX1JlZi5HZXRQcml2YXRlQ29weSgpLT5tX0NUTTsKIH0KIApAQCAtMTE1LDQzICsxMTUsNDMgQEAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpCiAgICAgbV9DVE1baV0gPSB0aGF0Lm1fQ1RNW2ldOwogCi0gIGlmIChtX3BEb2N1bWVudCAmJiBtX3BGb250KSB7CisgIGlmIChtX3BEb2N1bWVudCAmJiBtX3BGb250KQogICAgIG1fcEZvbnQgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKS0+R2V0Rm9udChtX3BGb250LT5HZXRGb250RGljdCgpKTsKLSAgfQogfQogCiBDUERGX1RleHRTdGF0ZTo6VGV4dERhdGE6On5UZXh0RGF0YSgpIHsKLSAgaWYgKG1fcERvY3VtZW50ICYmIG1fcEZvbnQpIHsKLSAgICBDUERGX0RvY1BhZ2VEYXRhKiBwUGFnZURhdGEgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKTsKLSAgICBpZiAocFBhZ2VEYXRhICYmICFwUGFnZURhdGEtPklzRm9yY2VDbGVhcigpKQotICAgICAgcFBhZ2VEYXRhLT5SZWxlYXNlRm9udChtX3BGb250LT5HZXRGb250RGljdCgpKTsKLSAgfQorICBSZWxlYXNlRm9udCgpOwogfQogCiB2b2lkIENQREZfVGV4dFN0YXRlOjpUZXh0RGF0YTo6U2V0Rm9udChDUERGX0ZvbnQqIHBGb250KSB7Ci0gIENQREZfRG9jdW1lbnQqIHBEb2MgPSBtX3BEb2N1bWVudDsKLSAgQ1BERl9Eb2NQYWdlRGF0YSogcFBhZ2VEYXRhID0gcERvYyA/IHBEb2MtPkdldFBhZ2VEYXRhKCkgOiBudWxscHRyOwotICBpZiAocFBhZ2VEYXRhICYmIG1fcEZvbnQgJiYgIXBQYWdlRGF0YS0+SXNGb3JjZUNsZWFyKCkpCi0gICAgcFBhZ2VEYXRhLT5SZWxlYXNlRm9udChtX3BGb250LT5HZXRGb250RGljdCgpKTsKLQotICBtX3BEb2N1bWVudCA9IHBGb250ID8gcEZvbnQtPm1fcERvY3VtZW50IDogbnVsbHB0cjsKKyAgUmVsZWFzZUZvbnQoKTsKKyAgbV9wRG9jdW1lbnQgPSBwRm9udCA/IHBGb250LT5HZXREb2N1bWVudCgpIDogbnVsbHB0cjsKICAgbV9wRm9udCA9IHBGb250OwogfQogCi1GWF9GTE9BVCBDUERGX1RleHRTdGF0ZTo6VGV4dERhdGE6OkdldEZvbnRTaXplVigpIGNvbnN0IHsKLSAgcmV0dXJuIEZYU1lTX2ZhYnMoRlhTWVNfc3FydDIobV9NYXRyaXhbMV0sIG1fTWF0cml4WzNdKSAqIG1fRm9udFNpemUpOworZmxvYXQgQ1BERl9UZXh0U3RhdGU6OlRleHREYXRhOjpHZXRGb250U2l6ZVYoKSBjb25zdCB7CisgIHJldHVybiBmYWJzKEZYU1lTX3NxcnQyKG1fTWF0cml4WzFdLCBtX01hdHJpeFszXSkgKiBtX0ZvbnRTaXplKTsKIH0KIAotRlhfRkxPQVQgQ1BERl9UZXh0U3RhdGU6OlRleHREYXRhOjpHZXRGb250U2l6ZUgoKSBjb25zdCB7Ci0gIHJldHVybiBGWFNZU19mYWJzKEZYU1lTX3NxcnQyKG1fTWF0cml4WzBdLCBtX01hdHJpeFsyXSkgKiBtX0ZvbnRTaXplKTsKK2Zsb2F0IENQREZfVGV4dFN0YXRlOjpUZXh0RGF0YTo6R2V0Rm9udFNpemVIKCkgY29uc3QgeworICByZXR1cm4gZmFicyhGWFNZU19zcXJ0MihtX01hdHJpeFswXSwgbV9NYXRyaXhbMl0pICogbV9Gb250U2l6ZSk7CiB9CiAKLUZYX0ZMT0FUIENQREZfVGV4dFN0YXRlOjpUZXh0RGF0YTo6R2V0QmFzZWxpbmVBbmdsZSgpIGNvbnN0IHsKLSAgcmV0dXJuIEZYU1lTX2F0YW4yKG1fTWF0cml4WzJdLCBtX01hdHJpeFswXSk7CitmbG9hdCBDUERGX1RleHRTdGF0ZTo6VGV4dERhdGE6OkdldEJhc2VsaW5lQW5nbGUoKSBjb25zdCB7CisgIHJldHVybiBhdGFuMihtX01hdHJpeFsyXSwgbV9NYXRyaXhbMF0pOwogfQogCi1GWF9GTE9BVCBDUERGX1RleHRTdGF0ZTo6VGV4dERhdGE6OkdldFNoZWFyQW5nbGUoKSBjb25zdCB7Ci0gIHJldHVybiBHZXRCYXNlbGluZUFuZ2xlKCkgKyBGWFNZU19hdGFuMihtX01hdHJpeFsxXSwgbV9NYXRyaXhbM10pOworZmxvYXQgQ1BERl9UZXh0U3RhdGU6OlRleHREYXRhOjpHZXRTaGVhckFuZ2xlKCkgY29uc3QgeworICByZXR1cm4gR2V0QmFzZWxpbmVBbmdsZSgpICsgYXRhbjIobV9NYXRyaXhbMV0sIG1fTWF0cml4WzNdKTsKK30KKwordm9pZCBDUERGX1RleHRTdGF0ZTo6VGV4dERhdGE6OlJlbGVhc2VGb250KCkgeworICBpZiAoIW1fcERvY3VtZW50IHx8ICFtX3BGb250KQorICAgIHJldHVybjsKKworICBDUERGX0RvY1BhZ2VEYXRhKiBwUGFnZURhdGEgPSBtX3BEb2N1bWVudC0+R2V0UGFnZURhdGEoKTsKKyAgaWYgKHBQYWdlRGF0YSAmJiAhcFBhZ2VEYXRhLT5Jc0ZvcmNlQ2xlYXIoKSkKKyAgICBwUGFnZURhdGEtPlJlbGVhc2VGb250KG1fcEZvbnQtPkdldEZvbnREaWN0KCkpOwogfQogCiBib29sIFNldFRleHRSZW5kZXJpbmdNb2RlRnJvbUludChpbnQgaU1vZGUsIFRleHRSZW5kZXJpbmdNb2RlKiBtb2RlKSB7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3RleHRzdGF0ZS5oIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl90ZXh0c3RhdGUuaAppbmRleCA0NzIzNDY5Li5hYTEyODA3IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3RleHRzdGF0ZS5oCisrKyBiL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfdGV4dHN0YXRlLmgKQEAgLTcsOCArNyw4IEBACiAjaWZuZGVmIENPUkVfRlBERkFQSV9QQUdFX0NQREZfVEVYVFNUQVRFX0hfCiAjZGVmaW5lIENPUkVfRlBERkFQSV9QQUdFX0NQREZfVEVYVFNUQVRFX0hfCiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9zaGFyZWRfY29weV9vbl93cml0ZS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3NoYXJlZF9jb3B5X29uX3dyaXRlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogCiBjbGFzcyBDUERGX0RvY3VtZW50OwogY2xhc3MgQ1BERl9Gb250OwpAQCAtMzUsNTMgKzM1LDU2IEBACiAgIENQREZfRm9udCogR2V0Rm9udCgpIGNvbnN0OwogICB2b2lkIFNldEZvbnQoQ1BERl9Gb250KiBwRm9udCk7CiAKLSAgRlhfRkxPQVQgR2V0Rm9udFNpemUoKSBjb25zdDsKLSAgdm9pZCBTZXRGb250U2l6ZShGWF9GTE9BVCBzaXplKTsKKyAgZmxvYXQgR2V0Rm9udFNpemUoKSBjb25zdDsKKyAgdm9pZCBTZXRGb250U2l6ZShmbG9hdCBzaXplKTsKIAotICBjb25zdCBGWF9GTE9BVCogR2V0TWF0cml4KCkgY29uc3Q7Ci0gIEZYX0ZMT0FUKiBHZXRNdXRhYmxlTWF0cml4KCk7CisgIGNvbnN0IGZsb2F0KiBHZXRNYXRyaXgoKSBjb25zdDsKKyAgZmxvYXQqIEdldE11dGFibGVNYXRyaXgoKTsKIAotICBGWF9GTE9BVCBHZXRDaGFyU3BhY2UoKSBjb25zdDsKLSAgdm9pZCBTZXRDaGFyU3BhY2UoRlhfRkxPQVQgc3ApOworICBmbG9hdCBHZXRDaGFyU3BhY2UoKSBjb25zdDsKKyAgdm9pZCBTZXRDaGFyU3BhY2UoZmxvYXQgc3ApOwogCi0gIEZYX0ZMT0FUIEdldFdvcmRTcGFjZSgpIGNvbnN0OwotICB2b2lkIFNldFdvcmRTcGFjZShGWF9GTE9BVCBzcCk7CisgIGZsb2F0IEdldFdvcmRTcGFjZSgpIGNvbnN0OworICB2b2lkIFNldFdvcmRTcGFjZShmbG9hdCBzcCk7CiAKLSAgRlhfRkxPQVQgR2V0Rm9udFNpemVWKCkgY29uc3Q7Ci0gIEZYX0ZMT0FUIEdldEZvbnRTaXplSCgpIGNvbnN0OwotICBGWF9GTE9BVCBHZXRCYXNlbGluZUFuZ2xlKCkgY29uc3Q7Ci0gIEZYX0ZMT0FUIEdldFNoZWFyQW5nbGUoKSBjb25zdDsKKyAgZmxvYXQgR2V0Rm9udFNpemVWKCkgY29uc3Q7CisgIGZsb2F0IEdldEZvbnRTaXplSCgpIGNvbnN0OworICBmbG9hdCBHZXRCYXNlbGluZUFuZ2xlKCkgY29uc3Q7CisgIGZsb2F0IEdldFNoZWFyQW5nbGUoKSBjb25zdDsKIAogICBUZXh0UmVuZGVyaW5nTW9kZSBHZXRUZXh0TW9kZSgpIGNvbnN0OwogICB2b2lkIFNldFRleHRNb2RlKFRleHRSZW5kZXJpbmdNb2RlIG1vZGUpOwogCi0gIGNvbnN0IEZYX0ZMT0FUKiBHZXRDVE0oKSBjb25zdDsKLSAgRlhfRkxPQVQqIEdldE11dGFibGVDVE0oKTsKKyAgY29uc3QgZmxvYXQqIEdldENUTSgpIGNvbnN0OworICBmbG9hdCogR2V0TXV0YWJsZUNUTSgpOwogCiAgcHJpdmF0ZToKLSAgY2xhc3MgVGV4dERhdGEgeworICBjbGFzcyBUZXh0RGF0YSA6IHB1YmxpYyBSZXRhaW5hYmxlIHsKICAgIHB1YmxpYzoKICAgICBUZXh0RGF0YSgpOwogICAgIFRleHREYXRhKGNvbnN0IFRleHREYXRhJiBzcmMpOwotICAgIH5UZXh0RGF0YSgpOworICAgIH5UZXh0RGF0YSgpIG92ZXJyaWRlOwogCiAgICAgdm9pZCBTZXRGb250KENQREZfRm9udCogcEZvbnQpOwotICAgIEZYX0ZMT0FUIEdldEZvbnRTaXplVigpIGNvbnN0OwotICAgIEZYX0ZMT0FUIEdldEZvbnRTaXplSCgpIGNvbnN0OwotICAgIEZYX0ZMT0FUIEdldEJhc2VsaW5lQW5nbGUoKSBjb25zdDsKLSAgICBGWF9GTE9BVCBHZXRTaGVhckFuZ2xlKCkgY29uc3Q7CisgICAgZmxvYXQgR2V0Rm9udFNpemVWKCkgY29uc3Q7CisgICAgZmxvYXQgR2V0Rm9udFNpemVIKCkgY29uc3Q7CisgICAgZmxvYXQgR2V0QmFzZWxpbmVBbmdsZSgpIGNvbnN0OworICAgIGZsb2F0IEdldFNoZWFyQW5nbGUoKSBjb25zdDsKIAogICAgIENQREZfRm9udCogbV9wRm9udDsKLSAgICBDUERGX0RvY3VtZW50KiBtX3BEb2N1bWVudDsKLSAgICBGWF9GTE9BVCBtX0ZvbnRTaXplOwotICAgIEZYX0ZMT0FUIG1fQ2hhclNwYWNlOwotICAgIEZYX0ZMT0FUIG1fV29yZFNwYWNlOworICAgIFVub3duZWRQdHI8Q1BERl9Eb2N1bWVudD4gbV9wRG9jdW1lbnQ7CisgICAgZmxvYXQgbV9Gb250U2l6ZTsKKyAgICBmbG9hdCBtX0NoYXJTcGFjZTsKKyAgICBmbG9hdCBtX1dvcmRTcGFjZTsKICAgICBUZXh0UmVuZGVyaW5nTW9kZSBtX1RleHRNb2RlOwotICAgIEZYX0ZMT0FUIG1fTWF0cml4WzRdOwotICAgIEZYX0ZMT0FUIG1fQ1RNWzRdOworICAgIGZsb2F0IG1fTWF0cml4WzRdOworICAgIGZsb2F0IG1fQ1RNWzRdOworCisgICBwcml2YXRlOgorICAgIHZvaWQgUmVsZWFzZUZvbnQoKTsKICAgfTsKIAotICBDRlhfU2hhcmVkQ29weU9uV3JpdGU8VGV4dERhdGE+IG1fUmVmOworICBTaGFyZWRDb3B5T25Xcml0ZTxUZXh0RGF0YT4gbV9SZWY7CiB9OwogCiBib29sIFNldFRleHRSZW5kZXJpbmdNb2RlRnJvbUludChpbnQgaU1vZGUsIFRleHRSZW5kZXJpbmdNb2RlKiBtb2RlKTsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfdGlsaW5ncGF0dGVybi5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3RpbGluZ3BhdHRlcm4uY3BwCmluZGV4IGEwNDFmMzguLmE1MjUyNTcgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYWdlL2NwZGZfdGlsaW5ncGF0dGVybi5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl90aWxpbmdwYXR0ZXJuLmNwcApAQCAtMTUsMTEgKzE1LDEwIEBACiBDUERGX1RpbGluZ1BhdHRlcm46OkNQREZfVGlsaW5nUGF0dGVybihDUERGX0RvY3VtZW50KiBwRG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBQYXR0ZXJuT2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgcGFyZW50TWF0cml4KQotICAgIDogQ1BERl9QYXR0ZXJuKFRJTElORywgcERvYywgcFBhdHRlcm5PYmosIHBhcmVudE1hdHJpeCkgewotICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wUGF0dGVybk9iai0+R2V0RGljdCgpOwotICBtX1BhdHRlcm4yRm9ybSA9IHBEaWN0LT5HZXRNYXRyaXhGb3IoIk1hdHJpeCIpOwotICBtX2JDb2xvcmVkID0gcERpY3QtPkdldEludGVnZXJGb3IoIlBhaW50VHlwZSIpID09IDE7Ci0gIG1fUGF0dGVybjJGb3JtLkNvbmNhdChwYXJlbnRNYXRyaXgpOworICAgIDogQ1BERl9QYXR0ZXJuKHBEb2MsIHBQYXR0ZXJuT2JqLCBwYXJlbnRNYXRyaXgpIHsKKyAgYXNzZXJ0KGRvY3VtZW50KCkpOworICBtX2JDb2xvcmVkID0gcGF0dGVybl9vYmooKS0+R2V0RGljdCgpLT5HZXRJbnRlZ2VyRm9yKCJQYWludFR5cGUiKSA9PSAxOworICBTZXRQYXR0ZXJuVG9Gb3JtTWF0cml4KCk7CiB9CiAKIENQREZfVGlsaW5nUGF0dGVybjo6fkNQREZfVGlsaW5nUGF0dGVybigpIHt9CkBAIC0zNiwyMCArMzUsMjEgQEAKICAgaWYgKG1fcEZvcm0pCiAgICAgcmV0dXJuIHRydWU7CiAKLSAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcFBhdHRlcm5PYmotPkdldERpY3QoKTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBhdHRlcm5fb2JqKCktPkdldERpY3QoKTsKICAgaWYgKCFwRGljdCkKICAgICByZXR1cm4gZmFsc2U7CiAKICAgbV9iQ29sb3JlZCA9IHBEaWN0LT5HZXRJbnRlZ2VyRm9yKCJQYWludFR5cGUiKSA9PSAxOwotICBtX1hTdGVwID0gKEZYX0ZMT0FUKUZYU1lTX2ZhYnMocERpY3QtPkdldE51bWJlckZvcigiWFN0ZXAiKSk7Ci0gIG1fWVN0ZXAgPSAoRlhfRkxPQVQpRlhTWVNfZmFicyhwRGljdC0+R2V0TnVtYmVyRm9yKCJZU3RlcCIpKTsKKyAgbV9YU3RlcCA9IHN0YXRpY19jYXN0PGZsb2F0PihmYWJzKHBEaWN0LT5HZXROdW1iZXJGb3IoIlhTdGVwIikpKTsKKyAgbV9ZU3RlcCA9IHN0YXRpY19jYXN0PGZsb2F0PihmYWJzKHBEaWN0LT5HZXROdW1iZXJGb3IoIllTdGVwIikpKTsKIAotICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IG1fcFBhdHRlcm5PYmotPkFzU3RyZWFtKCk7CisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gcGF0dGVybl9vYmooKS0+QXNTdHJlYW0oKTsKICAgaWYgKCFwU3RyZWFtKQogICAgIHJldHVybiBmYWxzZTsKIAotICBtX3BGb3JtID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRm9ybT4obV9wRG9jdW1lbnQsIG51bGxwdHIsIHBTdHJlYW0pOwotICBtX3BGb3JtLT5QYXJzZUNvbnRlbnQobnVsbHB0ciwgJm1fUGFyZW50TWF0cml4LCBudWxscHRyKTsKKyAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4ID0gcGFyZW50X21hdHJpeCgpOworICBtX3BGb3JtID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRm9ybT4oZG9jdW1lbnQoKSwgbnVsbHB0ciwgcFN0cmVhbSk7CisgIG1fcEZvcm0tPlBhcnNlQ29udGVudFdpdGhQYXJhbXMobnVsbHB0ciwgJm1hdHJpeCwgbnVsbHB0ciwgMCk7CiAgIG1fQkJveCA9IHBEaWN0LT5HZXRSZWN0Rm9yKCJCQm94Iik7CiAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl90aWxpbmdwYXR0ZXJuLmggYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3RpbGluZ3BhdHRlcm4uaAppbmRleCAzZjA4NTFhLi5kOTQ1MGQ3IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3RpbGluZ3BhdHRlcm4uaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3RpbGluZ3BhdHRlcm4uaApAQCAtMzEsMTUgKzMxLDE1IEBACiAKICAgYm9vbCBjb2xvcmVkKCkgY29uc3QgeyByZXR1cm4gbV9iQ29sb3JlZDsgfQogICBjb25zdCBDRlhfRmxvYXRSZWN0JiBiYm94KCkgY29uc3QgeyByZXR1cm4gbV9CQm94OyB9Ci0gIEZYX0ZMT0FUIHhfc3RlcCgpIGNvbnN0IHsgcmV0dXJuIG1fWFN0ZXA7IH0KLSAgRlhfRkxPQVQgeV9zdGVwKCkgY29uc3QgeyByZXR1cm4gbV9ZU3RlcDsgfQorICBmbG9hdCB4X3N0ZXAoKSBjb25zdCB7IHJldHVybiBtX1hTdGVwOyB9CisgIGZsb2F0IHlfc3RlcCgpIGNvbnN0IHsgcmV0dXJuIG1fWVN0ZXA7IH0KICAgQ1BERl9Gb3JtKiBmb3JtKCkgY29uc3QgeyByZXR1cm4gbV9wRm9ybS5nZXQoKTsgfQogCiAgcHJpdmF0ZToKICAgYm9vbCBtX2JDb2xvcmVkOwogICBDRlhfRmxvYXRSZWN0IG1fQkJveDsKLSAgRlhfRkxPQVQgbV9YU3RlcDsKLSAgRlhfRkxPQVQgbV9ZU3RlcDsKKyAgZmxvYXQgbV9YU3RlcDsKKyAgZmxvYXQgbV9ZU3RlcDsKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfRm9ybT4gbV9wRm9ybTsKIH07CiAKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL2ZwZGZfcGFnZV9jb2xvcnMuY3BwIGIvY29yZS9mcGRmYXBpL3BhZ2UvZnBkZl9wYWdlX2NvbG9ycy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MTI5ZTQuLjAwMDAwMDAKLS0tIGEvY29yZS9mcGRmYXBpL3BhZ2UvZnBkZl9wYWdlX2NvbG9ycy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvcGFnZWludC5oIgotCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvY3BkZl9tb2R1bGVtZ3IuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudC5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtX2FjYy5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJpbmcuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvZnhfY29kZWMuaCIKLQotbmFtZXNwYWNlIHsKLQotRlhfRkxPQVQgTm9ybWFsaXplQ2hhbm5lbChGWF9GTE9BVCBmVmFsKSB7Ci0gIHJldHVybiBzdGQ6Om1pbihzdGQ6Om1heChmVmFsLCAwLjBmKSwgMS4wZik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi11aW50MzJfdCBDb21wb25lbnRzRm9yRmFtaWx5KGludCBmYW1pbHkpIHsKLSAgaWYgKGZhbWlseSA9PSBQREZDU19ERVZJQ0VSR0IpCi0gICAgcmV0dXJuIDM7Ci0gIGlmIChmYW1pbHkgPT0gUERGQ1NfREVWSUNFR1JBWSkKLSAgICByZXR1cm4gMTsKLSAgQVNTRVJUKGZhbWlseSA9PSBQREZDU19ERVZJQ0VDTVlLKTsKLSAgcmV0dXJuIDQ7Ci19Ci0KLXZvaWQgc1JHQl90b19BZG9iZUNNWUsoRlhfRkxPQVQgUiwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgRywKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgQiwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtLAotICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGspIHsKLSAgYyA9IDEuMGYgLSBSOwotICBtID0gMS4wZiAtIEc7Ci0gIHkgPSAxLjBmIC0gQjsKLSAgayA9IGM7Ci0gIGlmIChtIDwgaykgewotICAgIGsgPSBtOwotICB9Ci0gIGlmICh5IDwgaykgewotICAgIGsgPSB5OwotICB9Ci19Ci0KLXZvaWQgUmV2ZXJzZVJHQih1aW50OF90KiBwRGVzdEJ1ZiwgY29uc3QgdWludDhfdCogcFNyY0J1ZiwgaW50IHBpeGVscykgewotICBpZiAocERlc3RCdWYgPT0gcFNyY0J1ZikgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpKyspIHsKLSAgICAgIHVpbnQ4X3QgdGVtcCA9IHBEZXN0QnVmWzJdOwotICAgICAgcERlc3RCdWZbMl0gPSBwRGVzdEJ1ZlswXTsKLSAgICAgIHBEZXN0QnVmWzBdID0gdGVtcDsKLSAgICAgIHBEZXN0QnVmICs9IDM7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpKyspIHsKLSAgICAgICpwRGVzdEJ1ZisrID0gcFNyY0J1ZlsyXTsKLSAgICAgICpwRGVzdEJ1ZisrID0gcFNyY0J1ZlsxXTsKLSAgICAgICpwRGVzdEJ1ZisrID0gcFNyY0J1ZlswXTsKLSAgICAgIHBTcmNCdWYgKz0gMzsKLSAgICB9Ci0gIH0KLX0KLQotQ1BERl9EZXZpY2VDUzo6Q1BERl9EZXZpY2VDUyhDUERGX0RvY3VtZW50KiBwRG9jLCBpbnQgZmFtaWx5KQotICAgIDogQ1BERl9Db2xvclNwYWNlKHBEb2MsIGZhbWlseSwgQ29tcG9uZW50c0ZvckZhbWlseShmYW1pbHkpKSB7Ci0gIEFTU0VSVChmYW1pbHkgPT0gUERGQ1NfREVWSUNFR1JBWSB8fCBmYW1pbHkgPT0gUERGQ1NfREVWSUNFUkdCIHx8Ci0gICAgICAgICBmYW1pbHkgPT0gUERGQ1NfREVWSUNFQ01ZSyk7Ci19Ci0KLWJvb2wgQ1BERl9EZXZpY2VDUzo6R2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCB7Ci0gIHN3aXRjaCAobV9GYW1pbHkpIHsKLSAgICBjYXNlIFBERkNTX0RFVklDRUdSQVk6Ci0gICAgICBSID0gTm9ybWFsaXplQ2hhbm5lbCgqcEJ1Zik7Ci0gICAgICBHID0gUjsKLSAgICAgIEIgPSBSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQREZDU19ERVZJQ0VSR0I6Ci0gICAgICBSID0gTm9ybWFsaXplQ2hhbm5lbChwQnVmWzBdKTsKLSAgICAgIEcgPSBOb3JtYWxpemVDaGFubmVsKHBCdWZbMV0pOwotICAgICAgQiA9IE5vcm1hbGl6ZUNoYW5uZWwocEJ1ZlsyXSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBERkNTX0RFVklDRUNNWUs6Ci0gICAgICBpZiAobV9kd1N0ZENvbnZlcnNpb24pIHsKLSAgICAgICAgRlhfRkxPQVQgayA9IHBCdWZbM107Ci0gICAgICAgIFIgPSAxLjBmIC0gc3RkOjptaW4oMS4wZiwgcEJ1ZlswXSArIGspOwotICAgICAgICBHID0gMS4wZiAtIHN0ZDo6bWluKDEuMGYsIHBCdWZbMV0gKyBrKTsKLSAgICAgICAgQiA9IDEuMGYgLSBzdGQ6Om1pbigxLjBmLCBwQnVmWzJdICsgayk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQihwQnVmWzBdLCBwQnVmWzFdLCBwQnVmWzJdLCBwQnVmWzNdLCBSLCBHLCBCKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBBU1NFUlQoZmFsc2UpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENQREZfRGV2aWNlQ1M6OnZfR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBrKSBjb25zdCB7Ci0gIGlmIChtX0ZhbWlseSAhPSBQREZDU19ERVZJQ0VDTVlLKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjID0gcEJ1ZlswXTsKLSAgbSA9IHBCdWZbMV07Ci0gIHkgPSBwQnVmWzJdOwotICBrID0gcEJ1ZlszXTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1BERl9EZXZpY2VDUzo6U2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBCKSBjb25zdCB7Ci0gIHN3aXRjaCAobV9GYW1pbHkpIHsKLSAgICBjYXNlIFBERkNTX0RFVklDRUdSQVk6Ci0gICAgICBpZiAoUiAhPSBHIHx8IFIgIT0gQikKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgKnBCdWYgPSBSOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBQREZDU19ERVZJQ0VSR0I6Ci0gICAgICBwQnVmWzBdID0gUjsKLSAgICAgIHBCdWZbMV0gPSBHOwotICAgICAgcEJ1ZlsyXSA9IEI7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIFBERkNTX0RFVklDRUNNWUs6Ci0gICAgICBzUkdCX3RvX0Fkb2JlQ01ZSyhSLCBHLCBCLCBwQnVmWzBdLCBwQnVmWzFdLCBwQnVmWzJdLCBwQnVmWzNdKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICBBU1NFUlQoZmFsc2UpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWJvb2wgQ1BERl9EZXZpY2VDUzo6dl9TZXRDTVlLKEZYX0ZMT0FUKiBwQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaykgY29uc3QgewotICBzd2l0Y2ggKG1fRmFtaWx5KSB7Ci0gICAgY2FzZSBQREZDU19ERVZJQ0VHUkFZOgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgUERGQ1NfREVWSUNFUkdCOgotICAgICAgQWRvYmVDTVlLX3RvX3NSR0IoYywgbSwgeSwgaywgcEJ1ZlswXSwgcEJ1ZlsxXSwgcEJ1ZlsyXSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIFBERkNTX0RFVklDRUNNWUs6Ci0gICAgICBwQnVmWzBdID0gYzsKLSAgICAgIHBCdWZbMV0gPSBtOwotICAgICAgcEJ1ZlsyXSA9IHk7Ci0gICAgICBwQnVmWzNdID0gazsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICBBU1NFUlQoZmFsc2UpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLXZvaWQgQ1BERl9EZXZpY2VDUzo6VHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFNyY0J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2Vfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2VfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVHJhbnNNYXNrKSBjb25zdCB7Ci0gIHN3aXRjaCAobV9GYW1pbHkpIHsKLSAgICBjYXNlIFBERkNTX0RFVklDRUdSQVk6Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7Ci0gICAgICAgICpwRGVzdEJ1ZisrID0gcFNyY0J1ZltpXTsKLSAgICAgICAgKnBEZXN0QnVmKysgPSBwU3JjQnVmW2ldOwotICAgICAgICAqcERlc3RCdWYrKyA9IHBTcmNCdWZbaV07Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBERkNTX0RFVklDRVJHQjoKLSAgICAgIFJldmVyc2VSR0IocERlc3RCdWYsIHBTcmNCdWYsIHBpeGVscyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBERkNTX0RFVklDRUNNWUs6Ci0gICAgICBpZiAoYlRyYW5zTWFzaykgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7Ci0gICAgICAgICAgaW50IGsgPSAyNTUgLSBwU3JjQnVmWzNdOwotICAgICAgICAgIHBEZXN0QnVmWzBdID0gKCgyNTUgLSBwU3JjQnVmWzBdKSAqIGspIC8gMjU1OwotICAgICAgICAgIHBEZXN0QnVmWzFdID0gKCgyNTUgLSBwU3JjQnVmWzFdKSAqIGspIC8gMjU1OwotICAgICAgICAgIHBEZXN0QnVmWzJdID0gKCgyNTUgLSBwU3JjQnVmWzJdKSAqIGspIC8gMjU1OwotICAgICAgICAgIHBEZXN0QnVmICs9IDM7Ci0gICAgICAgICAgcFNyY0J1ZiArPSA0OwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpeGVsczsgaSsrKSB7Ci0gICAgICAgICAgaWYgKG1fZHdTdGRDb252ZXJzaW9uKSB7Ci0gICAgICAgICAgICB1aW50OF90IGsgPSBwU3JjQnVmWzNdOwotICAgICAgICAgICAgcERlc3RCdWZbMl0gPSAyNTUgLSBzdGQ6Om1pbigyNTUsIHBTcmNCdWZbMF0gKyBrKTsKLSAgICAgICAgICAgIHBEZXN0QnVmWzFdID0gMjU1IC0gc3RkOjptaW4oMjU1LCBwU3JjQnVmWzFdICsgayk7Ci0gICAgICAgICAgICBwRGVzdEJ1ZlswXSA9IDI1NSAtIHN0ZDo6bWluKDI1NSwgcFNyY0J1ZlsyXSArIGspOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEocFNyY0J1ZlswXSwgcFNyY0J1ZlsxXSwgcFNyY0J1ZlsyXSwgcFNyY0J1ZlszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVzdEJ1ZlsyXSwgcERlc3RCdWZbMV0sIHBEZXN0QnVmWzBdKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcFNyY0J1ZiArPSA0OwotICAgICAgICAgIHBEZXN0QnVmICs9IDM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBBU1NFUlQoZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotQ1BERl9JY2NQcm9maWxlOjpDUERGX0ljY1Byb2ZpbGUoY29uc3QgdWludDhfdCogcERhdGEsIHVpbnQzMl90IGR3U2l6ZSkKLSAgICA6IG1fYnNSR0IoZmFsc2UpLCBtX3BUcmFuc2Zvcm0obnVsbHB0ciksIG1fblNyY0NvbXBvbmVudHMoMCkgewotICBpZiAoZHdTaXplID09IDMxNDQgJiYKLSAgICAgIEZYU1lTX21lbWNtcChwRGF0YSArIDB4MTkwLCAic1JHQiBJRUM2MTk2Ni0yLjEiLCAxNykgPT0gMCkgewotICAgIG1fYnNSR0IgPSB0cnVlOwotICAgIG1fblNyY0NvbXBvbmVudHMgPSAzOwotICB9IGVsc2UgaWYgKENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SWNjTW9kdWxlKCkpIHsKLSAgICBtX3BUcmFuc2Zvcm0gPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEljY01vZHVsZSgpLT5DcmVhdGVUcmFuc2Zvcm1fc1JHQigKLSAgICAgICAgcERhdGEsIGR3U2l6ZSwgbV9uU3JjQ29tcG9uZW50cyk7Ci0gIH0KLX0KLUNQREZfSWNjUHJvZmlsZTo6fkNQREZfSWNjUHJvZmlsZSgpIHsKLSAgaWYgKG1fcFRyYW5zZm9ybSkgewotICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SWNjTW9kdWxlKCktPkRlc3Ryb3lUcmFuc2Zvcm0obV9wVHJhbnNmb3JtKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhZ2UvZnBkZl9wYWdlX2Z1bmMuY3BwIGIvY29yZS9mcGRmYXBpL3BhZ2UvZnBkZl9wYWdlX2Z1bmMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTY2NDFmLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnBkZmFwaS9wYWdlL2ZwZGZfcGFnZV9mdW5jLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg2MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9wYWdlaW50LmgiCi0KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BzZW5naW5lLmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc2ltcGxlX3BhcnNlci5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtX2FjYy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc2FmZV90eXBlcy5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLQotbmFtZXNwYWNlIHsKLQotc3RydWN0IFBERl9QU09wTmFtZSB7Ci0gIGNvbnN0IEZYX0NIQVIqIG5hbWU7Ci0gIFBERl9QU09QIG9wOwotfTsKLQotY29uc3QgUERGX1BTT3BOYW1lIGtQc09wTmFtZXNbXSA9IHsKLSAgICB7ImFkZCIsIFBTT1BfQUREfSwgICAgICAgICB7InN1YiIsIFBTT1BfU1VCfSwKLSAgICB7Im11bCIsIFBTT1BfTVVMfSwgICAgICAgICB7ImRpdiIsIFBTT1BfRElWfSwKLSAgICB7ImlkaXYiLCBQU09QX0lESVZ9LCAgICAgICB7Im1vZCIsIFBTT1BfTU9EfSwKLSAgICB7Im5lZyIsIFBTT1BfTkVHfSwgICAgICAgICB7ImFicyIsIFBTT1BfQUJTfSwKLSAgICB7ImNlaWxpbmciLCBQU09QX0NFSUxJTkd9LCB7ImZsb29yIiwgUFNPUF9GTE9PUn0sCi0gICAgeyJyb3VuZCIsIFBTT1BfUk9VTkR9LCAgICAgeyJ0cnVuY2F0ZSIsIFBTT1BfVFJVTkNBVEV9LAotICAgIHsic3FydCIsIFBTT1BfU1FSVH0sICAgICAgIHsic2luIiwgUFNPUF9TSU59LAotICAgIHsiY29zIiwgUFNPUF9DT1N9LCAgICAgICAgIHsiYXRhbiIsIFBTT1BfQVRBTn0sCi0gICAgeyJleHAiLCBQU09QX0VYUH0sICAgICAgICAgeyJsbiIsIFBTT1BfTE59LAotICAgIHsibG9nIiwgUFNPUF9MT0d9LCAgICAgICAgIHsiY3ZpIiwgUFNPUF9DVkl9LAotICAgIHsiY3ZyIiwgUFNPUF9DVlJ9LCAgICAgICAgIHsiZXEiLCBQU09QX0VRfSwKLSAgICB7Im5lIiwgUFNPUF9ORX0sICAgICAgICAgICB7Imd0IiwgUFNPUF9HVH0sCi0gICAgeyJnZSIsIFBTT1BfR0V9LCAgICAgICAgICAgeyJsdCIsIFBTT1BfTFR9LAotICAgIHsibGUiLCBQU09QX0xFfSwgICAgICAgICAgIHsiYW5kIiwgUFNPUF9BTkR9LAotICAgIHsib3IiLCBQU09QX09SfSwgICAgICAgICAgIHsieG9yIiwgUFNPUF9YT1J9LAotICAgIHsibm90IiwgUFNPUF9OT1R9LCAgICAgICAgIHsiYml0c2hpZnQiLCBQU09QX0JJVFNISUZUfSwKLSAgICB7InRydWUiLCBQU09QX1RSVUV9LCAgICAgICB7ImZhbHNlIiwgUFNPUF9GQUxTRX0sCi0gICAgeyJpZiIsIFBTT1BfSUZ9LCAgICAgICAgICAgeyJpZmVsc2UiLCBQU09QX0lGRUxTRX0sCi0gICAgeyJwb3AiLCBQU09QX1BPUH0sICAgICAgICAgeyJleGNoIiwgUFNPUF9FWENIfSwKLSAgICB7ImR1cCIsIFBTT1BfRFVQfSwgICAgICAgICB7ImNvcHkiLCBQU09QX0NPUFl9LAotICAgIHsiaW5kZXgiLCBQU09QX0lOREVYfSwgICAgIHsicm9sbCIsIFBTT1BfUk9MTH19OwotCi0vLyBTZWUgUERGIFJlZmVyZW5jZSAxLjcsIHBhZ2UgMTcwLCB0YWJsZSAzLjM2LgotYm9vbCBJc1ZhbGlkQml0c1BlclNhbXBsZSh1aW50MzJfdCB4KSB7Ci0gIHN3aXRjaCAoeCkgewotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSA0OgotICAgIGNhc2UgODoKLSAgICBjYXNlIDEyOgotICAgIGNhc2UgMTY6Ci0gICAgY2FzZSAyNDoKLSAgICBjYXNlIDMyOgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0vLyBTZWUgUERGIFJlZmVyZW5jZSAxLjcsIHBhZ2UgMTcwLgotRlhfRkxPQVQgUERGX0ludGVycG9sYXRlKEZYX0ZMT0FUIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeG1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4bWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHltaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeW1heCkgewotICBGWF9GTE9BVCBkaXZpc29yID0geG1heCAtIHhtaW47Ci0gIHJldHVybiB5bWluICsgKGRpdmlzb3IgPyAoeCAtIHhtaW4pICogKHltYXggLSB5bWluKSAvIGRpdmlzb3IgOiAwKTsKLX0KLQotY2xhc3MgQ1BERl9QU0Z1bmMgOiBwdWJsaWMgQ1BERl9GdW5jdGlvbiB7Ci0gcHVibGljOgotICBDUERGX1BTRnVuYygpIDogQ1BERl9GdW5jdGlvbihUeXBlOjprVHlwZTRQb3N0U2NyaXB0KSB7fQotICB+Q1BERl9QU0Z1bmMoKSBvdmVycmlkZSB7fQotCi0gIC8vIENQREZfRnVuY3Rpb24KLSAgYm9vbCB2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopIG92ZXJyaWRlOwotICBib29sIHZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBDUERGX1BTRW5naW5lIG1fUFM7Ci19OwotCi1ib29sIENQREZfUFNGdW5jOjp2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopIHsKLSAgQ1BERl9TdHJlYW1BY2MgYWNjOwotICBhY2MuTG9hZEFsbERhdGEocE9iai0+QXNTdHJlYW0oKSwgZmFsc2UpOwotICByZXR1cm4gbV9QUy5QYXJzZShyZWludGVycHJldF9jYXN0PGNvbnN0IEZYX0NIQVIqPihhY2MuR2V0RGF0YSgpKSwKLSAgICAgICAgICAgICAgICAgICAgYWNjLkdldFNpemUoKSk7Ci19Ci0KLWJvb2wgQ1BERl9QU0Z1bmM6OnZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3QgewotICBDUERGX1BTRW5naW5lJiBQUyA9IGNvbnN0X2Nhc3Q8Q1BERl9QU0VuZ2luZSY+KG1fUFMpOwotICBQUy5SZXNldCgpOwotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9uSW5wdXRzOyBpKyspCi0gICAgUFMuUHVzaChpbnB1dHNbaV0pOwotICBQUy5FeGVjdXRlKCk7Ci0gIGlmIChQUy5HZXRTdGFja1NpemUoKSA8IG1fbk91dHB1dHMpCi0gICAgcmV0dXJuIGZhbHNlOwotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9uT3V0cHV0czsgaSsrKQotICAgIHJlc3VsdHNbbV9uT3V0cHV0cyAtIGkgLSAxXSA9IFBTLlBvcCgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLWNsYXNzIENQREZfUFNPUCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDUERGX1BTT1AoUERGX1BTT1Agb3ApIDogbV9vcChvcCksIG1fdmFsdWUoMCkgewotICAgIEFTU0VSVChtX29wICE9IFBTT1BfQ09OU1QpOwotICAgIEFTU0VSVChtX29wICE9IFBTT1BfUFJPQyk7Ci0gIH0KLSAgZXhwbGljaXQgQ1BERl9QU09QKEZYX0ZMT0FUIHZhbHVlKSA6IG1fb3AoUFNPUF9DT05TVCksIG1fdmFsdWUodmFsdWUpIHt9Ci0gIGV4cGxpY2l0IENQREZfUFNPUChzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9QU1Byb2M+IHByb2MpCi0gICAgICA6IG1fb3AoUFNPUF9QUk9DKSwgbV92YWx1ZSgwKSwgbV9wcm9jKHN0ZDo6bW92ZShwcm9jKSkge30KLQotICBGWF9GTE9BVCBHZXRGbG9hdFZhbHVlKCkgY29uc3QgewotICAgIGlmIChtX29wID09IFBTT1BfQ09OU1QpCi0gICAgICByZXR1cm4gbV92YWx1ZTsKLQotICAgIEFTU0VSVChmYWxzZSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgQ1BERl9QU1Byb2MqIEdldFByb2MoKSBjb25zdCB7Ci0gICAgaWYgKG1fb3AgPT0gUFNPUF9QUk9DKQotICAgICAgcmV0dXJuIG1fcHJvYy5nZXQoKTsKLSAgICBBU1NFUlQoZmFsc2UpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgUERGX1BTT1AgR2V0T3AoKSBjb25zdCB7IHJldHVybiBtX29wOyB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBQREZfUFNPUCBtX29wOwotICBjb25zdCBGWF9GTE9BVCBtX3ZhbHVlOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9QU1Byb2M+IG1fcHJvYzsKLX07Ci0KLWJvb2wgQ1BERl9QU0VuZ2luZTo6RXhlY3V0ZSgpIHsKLSAgcmV0dXJuIG1fTWFpblByb2MuRXhlY3V0ZSh0aGlzKTsKLX0KLQotQ1BERl9QU1Byb2M6OkNQREZfUFNQcm9jKCkge30KLUNQREZfUFNQcm9jOjp+Q1BERl9QU1Byb2MoKSB7fQotCi1ib29sIENQREZfUFNQcm9jOjpFeGVjdXRlKENQREZfUFNFbmdpbmUqIHBFbmdpbmUpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX09wZXJhdG9ycy5zaXplKCk7ICsraSkgewotICAgIGNvbnN0IFBERl9QU09QIG9wID0gbV9PcGVyYXRvcnNbaV0tPkdldE9wKCk7Ci0gICAgaWYgKG9wID09IFBTT1BfUFJPQykKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgaWYgKG9wID09IFBTT1BfQ09OU1QpIHsKLSAgICAgIHBFbmdpbmUtPlB1c2gobV9PcGVyYXRvcnNbaV0tPkdldEZsb2F0VmFsdWUoKSk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBpZiAob3AgPT0gUFNPUF9JRikgewotICAgICAgaWYgKGkgPT0gMCB8fCBtX09wZXJhdG9yc1tpIC0gMV0tPkdldE9wKCkgIT0gUFNPUF9QUk9DKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ+KHBFbmdpbmUtPlBvcCgpKSkKLSAgICAgICAgbV9PcGVyYXRvcnNbaSAtIDFdLT5HZXRQcm9jKCktPkV4ZWN1dGUocEVuZ2luZSk7Ci0gICAgfSBlbHNlIGlmIChvcCA9PSBQU09QX0lGRUxTRSkgewotICAgICAgaWYgKGkgPCAyIHx8IG1fT3BlcmF0b3JzW2kgLSAxXS0+R2V0T3AoKSAhPSBQU09QX1BST0MgfHwKLSAgICAgICAgICBtX09wZXJhdG9yc1tpIC0gMl0tPkdldE9wKCkgIT0gUFNPUF9QUk9DKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHNpemVfdCBvZmZzZXQgPSBzdGF0aWNfY2FzdDxpbnQ+KHBFbmdpbmUtPlBvcCgpKSA/IDIgOiAxOwotICAgICAgbV9PcGVyYXRvcnNbaSAtIG9mZnNldF0tPkdldFByb2MoKS0+RXhlY3V0ZShwRW5naW5lKTsKLSAgICB9IGVsc2UgewotICAgICAgcEVuZ2luZS0+RG9PcGVyYXRvcihvcCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1DUERGX1BTRW5naW5lOjpDUERGX1BTRW5naW5lKCkgewotICBtX1N0YWNrQ291bnQgPSAwOwotfQotQ1BERl9QU0VuZ2luZTo6fkNQREZfUFNFbmdpbmUoKSB7fQotdm9pZCBDUERGX1BTRW5naW5lOjpQdXNoKEZYX0ZMT0FUIHYpIHsKLSAgaWYgKG1fU3RhY2tDb3VudCA9PSBQU0VOR0lORV9TVEFDS1NJWkUpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgbV9TdGFja1ttX1N0YWNrQ291bnQrK10gPSB2OwotfQotRlhfRkxPQVQgQ1BERl9QU0VuZ2luZTo6UG9wKCkgewotICBpZiAobV9TdGFja0NvdW50ID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gbV9TdGFja1stLW1fU3RhY2tDb3VudF07Ci19Ci1ib29sIENQREZfUFNFbmdpbmU6OlBhcnNlKGNvbnN0IEZYX0NIQVIqIHN0ciwgaW50IHNpemUpIHsKLSAgQ1BERl9TaW1wbGVQYXJzZXIgcGFyc2VyKCh1aW50OF90KilzdHIsIHNpemUpOwotICBDRlhfQnl0ZVN0cmluZ0Mgd29yZCA9IHBhcnNlci5HZXRXb3JkKCk7Ci0gIGlmICh3b3JkICE9ICJ7IikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gbV9NYWluUHJvYy5QYXJzZSgmcGFyc2VyLCAwKTsKLX0KLQotYm9vbCBDUERGX1BTUHJvYzo6UGFyc2UoQ1BERl9TaW1wbGVQYXJzZXIqIHBhcnNlciwgaW50IGRlcHRoKSB7Ci0gIGlmIChkZXB0aCA+IGtNYXhEZXB0aCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgd2hpbGUgKDEpIHsKLSAgICBDRlhfQnl0ZVN0cmluZ0Mgd29yZCA9IHBhcnNlci0+R2V0V29yZCgpOwotICAgIGlmICh3b3JkLklzRW1wdHkoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAod29yZCA9PSAifSIpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAod29yZCA9PSAieyIpIHsKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1BTUHJvYz4gcHJvYyhuZXcgQ1BERl9QU1Byb2MpOwotICAgICAgc3RkOjp1bmlxdWVfcHRyPENQREZfUFNPUD4gb3AobmV3IENQREZfUFNPUChzdGQ6Om1vdmUocHJvYykpKTsKLSAgICAgIG1fT3BlcmF0b3JzLnB1c2hfYmFjayhzdGQ6Om1vdmUob3ApKTsKLSAgICAgIGlmICghbV9PcGVyYXRvcnMuYmFjaygpLT5HZXRQcm9jKCktPlBhcnNlKHBhcnNlciwgZGVwdGggKyAxKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICAgIGZvciAoY29uc3QgUERGX1BTT3BOYW1lJiBvcF9uYW1lIDoga1BzT3BOYW1lcykgewotICAgICAgICBpZiAod29yZCA9PSBDRlhfQnl0ZVN0cmluZ0Mob3BfbmFtZS5uYW1lKSkgewotICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1BTT1A+IG9wKG5ldyBDUERGX1BTT1Aob3BfbmFtZS5vcCkpOwotICAgICAgICAgIG1fT3BlcmF0b3JzLnB1c2hfYmFjayhzdGQ6Om1vdmUob3ApKTsKLSAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICghZm91bmQpIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENQREZfUFNPUD4gb3AobmV3IENQREZfUFNPUChGWF9hdG9mKHdvcmQpKSk7Ci0gICAgICAgIG1fT3BlcmF0b3JzLnB1c2hfYmFjayhzdGQ6Om1vdmUob3ApKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotYm9vbCBDUERGX1BTRW5naW5lOjpEb09wZXJhdG9yKFBERl9QU09QIG9wKSB7Ci0gIGludCBpMTsKLSAgaW50IGkyOwotICBGWF9GTE9BVCBkMTsKLSAgRlhfRkxPQVQgZDI7Ci0gIEZYX1NBRkVfSU5UMzIgcmVzdWx0OwotICBzd2l0Y2ggKG9wKSB7Ci0gICAgY2FzZSBQU09QX0FERDoKLSAgICAgIGQxID0gUG9wKCk7Ci0gICAgICBkMiA9IFBvcCgpOwotICAgICAgUHVzaChkMSArIGQyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFNPUF9TVUI6Ci0gICAgICBkMiA9IFBvcCgpOwotICAgICAgZDEgPSBQb3AoKTsKLSAgICAgIFB1c2goZDEgLSBkMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBTT1BfTVVMOgotICAgICAgZDEgPSBQb3AoKTsKLSAgICAgIGQyID0gUG9wKCk7Ci0gICAgICBQdXNoKGQxICogZDIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQU09QX0RJVjoKLSAgICAgIGQyID0gUG9wKCk7Ci0gICAgICBkMSA9IFBvcCgpOwotICAgICAgUHVzaChkMSAvIGQyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFNPUF9JRElWOgotICAgICAgaTIgPSBzdGF0aWNfY2FzdDxpbnQ+KFBvcCgpKTsKLSAgICAgIGkxID0gc3RhdGljX2Nhc3Q8aW50PihQb3AoKSk7Ci0gICAgICBpZiAoaTIpIHsKLSAgICAgICAgcmVzdWx0ID0gaTE7Ci0gICAgICAgIHJlc3VsdCAvPSBpMjsKLSAgICAgICAgUHVzaChyZXN1bHQuVmFsdWVPckRlZmF1bHQoMCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgUHVzaCgwKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFNPUF9NT0Q6Ci0gICAgICBpMiA9IHN0YXRpY19jYXN0PGludD4oUG9wKCkpOwotICAgICAgaTEgPSBzdGF0aWNfY2FzdDxpbnQ+KFBvcCgpKTsKLSAgICAgIGlmIChpMikgewotICAgICAgICByZXN1bHQgPSBpMTsKLSAgICAgICAgcmVzdWx0ICU9IGkyOwotICAgICAgICBQdXNoKHJlc3VsdC5WYWx1ZU9yRGVmYXVsdCgwKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBQdXNoKDApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQU09QX05FRzoKLSAgICAgIGQxID0gUG9wKCk7Ci0gICAgICBQdXNoKC1kMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBTT1BfQUJTOgotICAgICAgZDEgPSBQb3AoKTsKLSAgICAgIFB1c2goKEZYX0ZMT0FUKUZYU1lTX2ZhYnMoZDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFNPUF9DRUlMSU5HOgotICAgICAgZDEgPSBQb3AoKTsKLSAgICAgIFB1c2goKEZYX0ZMT0FUKUZYU1lTX2NlaWwoZDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFNPUF9GTE9PUjoKLSAgICAgIGQxID0gUG9wKCk7Ci0gICAgICBQdXNoKChGWF9GTE9BVClGWFNZU19mbG9vcihkMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQU09QX1JPVU5EOgotICAgICAgZDEgPSBQb3AoKTsKLSAgICAgIFB1c2goRlhTWVNfcm91bmQoZDEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFNPUF9UUlVOQ0FURToKLSAgICAgIGkxID0gKGludClQb3AoKTsKLSAgICAgIFB1c2goaTEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQU09QX1NRUlQ6Ci0gICAgICBkMSA9IFBvcCgpOwotICAgICAgUHVzaCgoRlhfRkxPQVQpRlhTWVNfc3FydChkMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQU09QX1NJTjoKLSAgICAgIGQxID0gUG9wKCk7Ci0gICAgICBQdXNoKChGWF9GTE9BVClGWFNZU19zaW4oZDEgKiBGWF9QSSAvIDE4MC4wZikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQU09QX0NPUzoKLSAgICAgIGQxID0gUG9wKCk7Ci0gICAgICBQdXNoKChGWF9GTE9BVClGWFNZU19jb3MoZDEgKiBGWF9QSSAvIDE4MC4wZikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQU09QX0FUQU46Ci0gICAgICBkMiA9IFBvcCgpOwotICAgICAgZDEgPSBQb3AoKTsKLSAgICAgIGQxID0gKEZYX0ZMT0FUKShGWFNZU19hdGFuMihkMSwgZDIpICogMTgwLjAgLyBGWF9QSSk7Ci0gICAgICBpZiAoZDEgPCAwKSB7Ci0gICAgICAgIGQxICs9IDM2MDsKLSAgICAgIH0KLSAgICAgIFB1c2goZDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQU09QX0VYUDoKLSAgICAgIGQyID0gUG9wKCk7Ci0gICAgICBkMSA9IFBvcCgpOwotICAgICAgUHVzaCgoRlhfRkxPQVQpRlhTWVNfcG93KGQxLCBkMikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQU09QX0xOOgotICAgICAgZDEgPSBQb3AoKTsKLSAgICAgIFB1c2goKEZYX0ZMT0FUKUZYU1lTX2xvZyhkMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQU09QX0xPRzoKLSAgICAgIGQxID0gUG9wKCk7Ci0gICAgICBQdXNoKChGWF9GTE9BVClGWFNZU19sb2cxMChkMSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQU09QX0NWSToKLSAgICAgIGkxID0gKGludClQb3AoKTsKLSAgICAgIFB1c2goaTEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQU09QX0NWUjoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFNPUF9FUToKLSAgICAgIGQyID0gUG9wKCk7Ci0gICAgICBkMSA9IFBvcCgpOwotICAgICAgUHVzaCgoaW50KShkMSA9PSBkMikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQU09QX05FOgotICAgICAgZDIgPSBQb3AoKTsKLSAgICAgIGQxID0gUG9wKCk7Ci0gICAgICBQdXNoKChpbnQpKGQxICE9IGQyKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBTT1BfR1Q6Ci0gICAgICBkMiA9IFBvcCgpOwotICAgICAgZDEgPSBQb3AoKTsKLSAgICAgIFB1c2goKGludCkoZDEgPiBkMikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQU09QX0dFOgotICAgICAgZDIgPSBQb3AoKTsKLSAgICAgIGQxID0gUG9wKCk7Ci0gICAgICBQdXNoKChpbnQpKGQxID49IGQyKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBTT1BfTFQ6Ci0gICAgICBkMiA9IFBvcCgpOwotICAgICAgZDEgPSBQb3AoKTsKLSAgICAgIFB1c2goKGludCkoZDEgPCBkMikpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQU09QX0xFOgotICAgICAgZDIgPSBQb3AoKTsKLSAgICAgIGQxID0gUG9wKCk7Ci0gICAgICBQdXNoKChpbnQpKGQxIDw9IGQyKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBTT1BfQU5EOgotICAgICAgaTEgPSAoaW50KVBvcCgpOwotICAgICAgaTIgPSAoaW50KVBvcCgpOwotICAgICAgUHVzaChpMSAmIGkyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFNPUF9PUjoKLSAgICAgIGkxID0gKGludClQb3AoKTsKLSAgICAgIGkyID0gKGludClQb3AoKTsKLSAgICAgIFB1c2goaTEgfCBpMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBTT1BfWE9SOgotICAgICAgaTEgPSAoaW50KVBvcCgpOwotICAgICAgaTIgPSAoaW50KVBvcCgpOwotICAgICAgUHVzaChpMSBeIGkyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFNPUF9OT1Q6Ci0gICAgICBpMSA9IChpbnQpUG9wKCk7Ci0gICAgICBQdXNoKChpbnQpIWkxKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFNPUF9CSVRTSElGVDogewotICAgICAgaW50IHNoaWZ0ID0gKGludClQb3AoKTsKLSAgICAgIHJlc3VsdCA9IChpbnQpUG9wKCk7Ci0gICAgICBpZiAoc2hpZnQgPiAwKSB7Ci0gICAgICAgIHJlc3VsdCA8PD0gc2hpZnQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBBdm9pZHMgdW5zYWZlIG5lZ2F0aW9uIG9mIElOVF9NSU4uCi0gICAgICAgIEZYX1NBRkVfSU5UMzIgc2FmZV9zaGlmdCA9IHNoaWZ0OwotICAgICAgICByZXN1bHQgPj49ICgtc2FmZV9zaGlmdCkuVmFsdWVPckRlZmF1bHQoMCk7Ci0gICAgICB9Ci0gICAgICBQdXNoKHJlc3VsdC5WYWx1ZU9yRGVmYXVsdCgwKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBQU09QX1RSVUU6Ci0gICAgICBQdXNoKDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQU09QX0ZBTFNFOgotICAgICAgUHVzaCgwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFNPUF9QT1A6Ci0gICAgICBQb3AoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFNPUF9FWENIOgotICAgICAgZDIgPSBQb3AoKTsKLSAgICAgIGQxID0gUG9wKCk7Ci0gICAgICBQdXNoKGQyKTsKLSAgICAgIFB1c2goZDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQU09QX0RVUDoKLSAgICAgIGQxID0gUG9wKCk7Ci0gICAgICBQdXNoKGQxKTsKLSAgICAgIFB1c2goZDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQU09QX0NPUFk6IHsKLSAgICAgIGludCBuID0gc3RhdGljX2Nhc3Q8aW50PihQb3AoKSk7Ci0gICAgICBpZiAobiA8IDAgfHwgbV9TdGFja0NvdW50ICsgbiA+IFBTRU5HSU5FX1NUQUNLU0laRSB8fAotICAgICAgICAgIG4gPiBzdGF0aWNfY2FzdDxpbnQ+KG1fU3RhY2tDb3VudCkpCi0gICAgICAgIGJyZWFrOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspCi0gICAgICAgIG1fU3RhY2tbbV9TdGFja0NvdW50ICsgaV0gPSBtX1N0YWNrW21fU3RhY2tDb3VudCArIGkgLSBuXTsKLSAgICAgIG1fU3RhY2tDb3VudCArPSBuOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgUFNPUF9JTkRFWDogewotICAgICAgaW50IG4gPSBzdGF0aWNfY2FzdDxpbnQ+KFBvcCgpKTsKLSAgICAgIGlmIChuIDwgMCB8fCBuID49IHN0YXRpY19jYXN0PGludD4obV9TdGFja0NvdW50KSkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBQdXNoKG1fU3RhY2tbbV9TdGFja0NvdW50IC0gbiAtIDFdKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFBTT1BfUk9MTDogewotICAgICAgaW50IGogPSBzdGF0aWNfY2FzdDxpbnQ+KFBvcCgpKTsKLSAgICAgIGludCBuID0gc3RhdGljX2Nhc3Q8aW50PihQb3AoKSk7Ci0gICAgICBpZiAoaiA9PSAwIHx8IG4gPT0gMCB8fCBtX1N0YWNrQ291bnQgPT0gMCkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBpZiAobiA8IDAgfHwgbiA+IHN0YXRpY19jYXN0PGludD4obV9TdGFja0NvdW50KSkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGogJT0gbjsKLSAgICAgIGlmIChqID4gMCkKLSAgICAgICAgaiAtPSBuOwotICAgICAgYXV0byBiZWdpbl9pdCA9IHN0ZDo6YmVnaW4obV9TdGFjaykgKyBtX1N0YWNrQ291bnQgLSBuOwotICAgICAgYXV0byBtaWRkbGVfaXQgPSBiZWdpbl9pdCAtIGo7Ci0gICAgICBhdXRvIGVuZF9pdCA9IHN0ZDo6YmVnaW4obV9TdGFjaykgKyBtX1N0YWNrQ291bnQ7Ci0gICAgICBzdGQ6OnJvdGF0ZShiZWdpbl9pdCwgbWlkZGxlX2l0LCBlbmRfaXQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotQ1BERl9TYW1wbGVkRnVuYzo6Q1BERl9TYW1wbGVkRnVuYygpIDogQ1BERl9GdW5jdGlvbihUeXBlOjprVHlwZTBTYW1wbGVkKSB7fQotCi1DUERGX1NhbXBsZWRGdW5jOjp+Q1BERl9TYW1wbGVkRnVuYygpIHt9Ci0KLWJvb2wgQ1BERl9TYW1wbGVkRnVuYzo6dl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKSB7Ci0gIENQREZfU3RyZWFtKiBwU3RyZWFtID0gcE9iai0+QXNTdHJlYW0oKTsKLSAgaWYgKCFwU3RyZWFtKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOwotICBDUERGX0FycmF5KiBwU2l6ZSA9IHBEaWN0LT5HZXRBcnJheUZvcigiU2l6ZSIpOwotICBDUERGX0FycmF5KiBwRW5jb2RlID0gcERpY3QtPkdldEFycmF5Rm9yKCJFbmNvZGUiKTsKLSAgQ1BERl9BcnJheSogcERlY29kZSA9IHBEaWN0LT5HZXRBcnJheUZvcigiRGVjb2RlIik7Ci0gIG1fbkJpdHNQZXJTYW1wbGUgPSBwRGljdC0+R2V0SW50ZWdlckZvcigiQml0c1BlclNhbXBsZSIpOwotICBpZiAoIUlzVmFsaWRCaXRzUGVyU2FtcGxlKG1fbkJpdHNQZXJTYW1wbGUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBtX1NhbXBsZU1heCA9IDB4ZmZmZmZmZmYgPj4gKDMyIC0gbV9uQml0c1BlclNhbXBsZSk7Ci0gIG1fcFNhbXBsZVN0cmVhbSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmVhbUFjYz4oKTsKLSAgbV9wU2FtcGxlU3RyZWFtLT5Mb2FkQWxsRGF0YShwU3RyZWFtLCBmYWxzZSk7Ci0gIEZYX1NBRkVfVUlOVDMyIG5Ub3RhbFNhbXBsZUJpdHMgPSAxOwotICBtX0VuY29kZUluZm8ucmVzaXplKG1fbklucHV0cyk7Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX25JbnB1dHM7IGkrKykgewotICAgIG1fRW5jb2RlSW5mb1tpXS5zaXplcyA9IHBTaXplID8gcFNpemUtPkdldEludGVnZXJBdChpKSA6IDA7Ci0gICAgaWYgKCFwU2l6ZSAmJiBpID09IDApCi0gICAgICBtX0VuY29kZUluZm9baV0uc2l6ZXMgPSBwRGljdC0+R2V0SW50ZWdlckZvcigiU2l6ZSIpOwotICAgIG5Ub3RhbFNhbXBsZUJpdHMgKj0gbV9FbmNvZGVJbmZvW2ldLnNpemVzOwotICAgIGlmIChwRW5jb2RlKSB7Ci0gICAgICBtX0VuY29kZUluZm9baV0uZW5jb2RlX21pbiA9IHBFbmNvZGUtPkdldEZsb2F0QXQoaSAqIDIpOwotICAgICAgbV9FbmNvZGVJbmZvW2ldLmVuY29kZV9tYXggPSBwRW5jb2RlLT5HZXRGbG9hdEF0KGkgKiAyICsgMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1fRW5jb2RlSW5mb1tpXS5lbmNvZGVfbWluID0gMDsKLSAgICAgIG1fRW5jb2RlSW5mb1tpXS5lbmNvZGVfbWF4ID0KLSAgICAgICAgICBtX0VuY29kZUluZm9baV0uc2l6ZXMgPT0gMSA/IDEgOiAoRlhfRkxPQVQpbV9FbmNvZGVJbmZvW2ldLnNpemVzIC0gMTsKLSAgICB9Ci0gIH0KLSAgblRvdGFsU2FtcGxlQml0cyAqPSBtX25CaXRzUGVyU2FtcGxlOwotICBuVG90YWxTYW1wbGVCaXRzICo9IG1fbk91dHB1dHM7Ci0gIEZYX1NBRkVfVUlOVDMyIG5Ub3RhbFNhbXBsZUJ5dGVzID0gblRvdGFsU2FtcGxlQml0czsKLSAgblRvdGFsU2FtcGxlQnl0ZXMgKz0gNzsKLSAgblRvdGFsU2FtcGxlQnl0ZXMgLz0gODsKLSAgaWYgKCFuVG90YWxTYW1wbGVCeXRlcy5Jc1ZhbGlkKCkgfHwgblRvdGFsU2FtcGxlQnl0ZXMuVmFsdWVPckRpZSgpID09IDAgfHwKLSAgICAgIG5Ub3RhbFNhbXBsZUJ5dGVzLlZhbHVlT3JEaWUoKSA+IG1fcFNhbXBsZVN0cmVhbS0+R2V0U2l6ZSgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIG1fRGVjb2RlSW5mby5yZXNpemUobV9uT3V0cHV0cyk7Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX25PdXRwdXRzOyBpKyspIHsKLSAgICBpZiAocERlY29kZSkgewotICAgICAgbV9EZWNvZGVJbmZvW2ldLmRlY29kZV9taW4gPSBwRGVjb2RlLT5HZXRGbG9hdEF0KDIgKiBpKTsKLSAgICAgIG1fRGVjb2RlSW5mb1tpXS5kZWNvZGVfbWF4ID0gcERlY29kZS0+R2V0RmxvYXRBdCgyICogaSArIDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBtX0RlY29kZUluZm9baV0uZGVjb2RlX21pbiA9IG1fcFJhbmdlc1tpICogMl07Ci0gICAgICBtX0RlY29kZUluZm9baV0uZGVjb2RlX21heCA9IG1fcFJhbmdlc1tpICogMiArIDFdOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDUERGX1NhbXBsZWRGdW5jOjp2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0IHsKLSAgaW50IHBvcyA9IDA7Ci0gIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiBlbmNvZGVkX2lucHV0X2J1ZihtX25JbnB1dHMpOwotICBGWF9GTE9BVCogZW5jb2RlZF9pbnB1dCA9IGVuY29kZWRfaW5wdXRfYnVmOwotICBDRlhfRml4ZWRCdWZHcm93PHVpbnQzMl90LCAzMj4gaW50X2J1ZihtX25JbnB1dHMgKiAyKTsKLSAgdWludDMyX3QqIGluZGV4ID0gaW50X2J1ZjsKLSAgdWludDMyX3QqIGJsb2Nrc2l6ZSA9IGluZGV4ICsgbV9uSW5wdXRzOwotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9uSW5wdXRzOyBpKyspIHsKLSAgICBpZiAoaSA9PSAwKQotICAgICAgYmxvY2tzaXplW2ldID0gMTsKLSAgICBlbHNlCi0gICAgICBibG9ja3NpemVbaV0gPSBibG9ja3NpemVbaSAtIDFdICogbV9FbmNvZGVJbmZvW2kgLSAxXS5zaXplczsKLSAgICBlbmNvZGVkX2lucHV0W2ldID0KLSAgICAgICAgUERGX0ludGVycG9sYXRlKGlucHV0c1tpXSwgbV9wRG9tYWluc1tpICogMl0sIG1fcERvbWFpbnNbaSAqIDIgKyAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fRW5jb2RlSW5mb1tpXS5lbmNvZGVfbWluLCBtX0VuY29kZUluZm9baV0uZW5jb2RlX21heCk7Ci0gICAgaW5kZXhbaV0gPSBzdGQ6Om1pbigodWludDMyX3Qpc3RkOjptYXgoMC5mLCBlbmNvZGVkX2lucHV0W2ldKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1fRW5jb2RlSW5mb1tpXS5zaXplcyAtIDEpOwotICAgIHBvcyArPSBpbmRleFtpXSAqIGJsb2Nrc2l6ZVtpXTsKLSAgfQotICBGWF9TQUZFX0lOVDMyIGJpdHNfdG9fb3V0cHV0ID0gbV9uT3V0cHV0czsKLSAgYml0c190b19vdXRwdXQgKj0gbV9uQml0c1BlclNhbXBsZTsKLSAgaWYgKCFiaXRzX3RvX291dHB1dC5Jc1ZhbGlkKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIEZYX1NBRkVfSU5UMzIgYml0cG9zID0gcG9zOwotICBiaXRwb3MgKj0gYml0c190b19vdXRwdXQuVmFsdWVPckRpZSgpOwotICBpZiAoIWJpdHBvcy5Jc1ZhbGlkKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIEZYX1NBRkVfSU5UMzIgcmFuZ2VfY2hlY2sgPSBiaXRwb3M7Ci0gIHJhbmdlX2NoZWNrICs9IGJpdHNfdG9fb3V0cHV0LlZhbHVlT3JEaWUoKTsKLSAgaWYgKCFyYW5nZV9jaGVjay5Jc1ZhbGlkKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNvbnN0IHVpbnQ4X3QqIHBTYW1wbGVEYXRhID0gbV9wU2FtcGxlU3RyZWFtLT5HZXREYXRhKCk7Ci0gIGlmICghcFNhbXBsZURhdGEpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBtX25PdXRwdXRzOyBqKyssIGJpdHBvcyArPSBtX25CaXRzUGVyU2FtcGxlKSB7Ci0gICAgdWludDMyX3Qgc2FtcGxlID0KLSAgICAgICAgR2V0Qml0czMyKHBTYW1wbGVEYXRhLCBiaXRwb3MuVmFsdWVPckRpZSgpLCBtX25CaXRzUGVyU2FtcGxlKTsKLSAgICBGWF9GTE9BVCBlbmNvZGVkID0gKEZYX0ZMT0FUKXNhbXBsZTsKLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9uSW5wdXRzOyBpKyspIHsKLSAgICAgIGlmIChpbmRleFtpXSA9PSBtX0VuY29kZUluZm9baV0uc2l6ZXMgLSAxKSB7Ci0gICAgICAgIGlmIChpbmRleFtpXSA9PSAwKQotICAgICAgICAgIGVuY29kZWQgPSBlbmNvZGVkX2lucHV0W2ldICogKEZYX0ZMT0FUKXNhbXBsZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYX1NBRkVfSU5UMzIgYml0cG9zMiA9IGJsb2Nrc2l6ZVtpXTsKLSAgICAgICAgYml0cG9zMiArPSBwb3M7Ci0gICAgICAgIGJpdHBvczIgKj0gbV9uT3V0cHV0czsKLSAgICAgICAgYml0cG9zMiArPSBqOwotICAgICAgICBiaXRwb3MyICo9IG1fbkJpdHNQZXJTYW1wbGU7Ci0gICAgICAgIGlmICghYml0cG9zMi5Jc1ZhbGlkKCkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB1aW50MzJfdCBzYW1wbGUxID0KLSAgICAgICAgICAgIEdldEJpdHMzMihwU2FtcGxlRGF0YSwgYml0cG9zMi5WYWx1ZU9yRGllKCksIG1fbkJpdHNQZXJTYW1wbGUpOwotICAgICAgICBlbmNvZGVkICs9IChlbmNvZGVkX2lucHV0W2ldIC0gaW5kZXhbaV0pICoKLSAgICAgICAgICAgICAgICAgICAoKEZYX0ZMT0FUKXNhbXBsZTEgLSAoRlhfRkxPQVQpc2FtcGxlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmVzdWx0c1tqXSA9Ci0gICAgICAgIFBERl9JbnRlcnBvbGF0ZShlbmNvZGVkLCAwLCAoRlhfRkxPQVQpbV9TYW1wbGVNYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBtX0RlY29kZUluZm9bal0uZGVjb2RlX21pbiwgbV9EZWNvZGVJbmZvW2pdLmRlY29kZV9tYXgpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1DUERGX0V4cEludEZ1bmM6OkNQREZfRXhwSW50RnVuYygpCi0gICAgOiBDUERGX0Z1bmN0aW9uKFR5cGU6OmtUeXBlMkV4cG90ZW50aWFsSW50ZXJwb2xhdGlvbiksCi0gICAgICBtX3BCZWdpblZhbHVlcyhudWxscHRyKSwKLSAgICAgIG1fcEVuZFZhbHVlcyhudWxscHRyKSB7fQotCi1DUERGX0V4cEludEZ1bmM6On5DUERGX0V4cEludEZ1bmMoKSB7Ci0gIEZYX0ZyZWUobV9wQmVnaW5WYWx1ZXMpOwotICBGWF9GcmVlKG1fcEVuZFZhbHVlcyk7Ci19Ci1ib29sIENQREZfRXhwSW50RnVuYzo6dl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKSB7Ci0gIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwT2JqLT5HZXREaWN0KCk7Ci0gIGlmICghcERpY3QpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQ1BERl9BcnJheSogcEFycmF5MCA9IHBEaWN0LT5HZXRBcnJheUZvcigiQzAiKTsKLSAgaWYgKG1fbk91dHB1dHMgPT0gMCkgewotICAgIG1fbk91dHB1dHMgPSAxOwotICAgIGlmIChwQXJyYXkwKSB7Ci0gICAgICBtX25PdXRwdXRzID0gcEFycmF5MC0+R2V0Q291bnQoKTsKLSAgICB9Ci0gIH0KLSAgQ1BERl9BcnJheSogcEFycmF5MSA9IHBEaWN0LT5HZXRBcnJheUZvcigiQzEiKTsKLSAgbV9wQmVnaW5WYWx1ZXMgPSBGWF9BbGxvYzJEKEZYX0ZMT0FULCBtX25PdXRwdXRzLCAyKTsKLSAgbV9wRW5kVmFsdWVzID0gRlhfQWxsb2MyRChGWF9GTE9BVCwgbV9uT3V0cHV0cywgMik7Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX25PdXRwdXRzOyBpKyspIHsKLSAgICBtX3BCZWdpblZhbHVlc1tpXSA9IHBBcnJheTAgPyBwQXJyYXkwLT5HZXRGbG9hdEF0KGkpIDogMC4wZjsKLSAgICBtX3BFbmRWYWx1ZXNbaV0gPSBwQXJyYXkxID8gcEFycmF5MS0+R2V0RmxvYXRBdChpKSA6IDEuMGY7Ci0gIH0KLSAgbV9FeHBvbmVudCA9IHBEaWN0LT5HZXRGbG9hdEZvcigiTiIpOwotICBtX25PcmlnT3V0cHV0cyA9IG1fbk91dHB1dHM7Ci0gIGlmIChtX25PdXRwdXRzICYmIG1fbklucHV0cyA+IElOVF9NQVggLyBtX25PdXRwdXRzKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIG1fbk91dHB1dHMgKj0gbV9uSW5wdXRzOwotICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgQ1BERl9FeHBJbnRGdW5jOjp2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0IHsKLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fbklucHV0czsgaSsrKQotICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBtX25PcmlnT3V0cHV0czsgaisrKSB7Ci0gICAgICByZXN1bHRzW2kgKiBtX25PcmlnT3V0cHV0cyArIGpdID0KLSAgICAgICAgICBtX3BCZWdpblZhbHVlc1tqXSArCi0gICAgICAgICAgKEZYX0ZMT0FUKUZYU1lTX3BvdyhpbnB1dHNbaV0sIG1fRXhwb25lbnQpICoKLSAgICAgICAgICAgICAgKG1fcEVuZFZhbHVlc1tqXSAtIG1fcEJlZ2luVmFsdWVzW2pdKTsKLSAgICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1DUERGX1N0aXRjaEZ1bmM6OkNQREZfU3RpdGNoRnVuYygpCi0gICAgOiBDUERGX0Z1bmN0aW9uKFR5cGU6OmtUeXBlM1N0aXRjaGluZyksCi0gICAgICBtX3BCb3VuZHMobnVsbHB0ciksCi0gICAgICBtX3BFbmNvZGUobnVsbHB0cikge30KLQotQ1BERl9TdGl0Y2hGdW5jOjp+Q1BERl9TdGl0Y2hGdW5jKCkgewotICBGWF9GcmVlKG1fcEJvdW5kcyk7Ci0gIEZYX0ZyZWUobV9wRW5jb2RlKTsKLX0KLQotYm9vbCBDUERGX1N0aXRjaEZ1bmM6OnZfSW5pdChDUERGX09iamVjdCogcE9iaikgewotICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcE9iai0+R2V0RGljdCgpOwotICBpZiAoIXBEaWN0KSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChtX25JbnB1dHMgIT0ga1JlcXVpcmVkTnVtSW5wdXRzKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIENQREZfQXJyYXkqIHBBcnJheSA9IHBEaWN0LT5HZXRBcnJheUZvcigiRnVuY3Rpb25zIik7Ci0gIGlmICghcEFycmF5KSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHVpbnQzMl90IG5TdWJzID0gcEFycmF5LT5HZXRDb3VudCgpOwotICBpZiAoblN1YnMgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIG1fbk91dHB1dHMgPSAwOwotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgblN1YnM7IGkrKykgewotICAgIENQREZfT2JqZWN0KiBwU3ViID0gcEFycmF5LT5HZXREaXJlY3RPYmplY3RBdChpKTsKLSAgICBpZiAocFN1YiA9PSBwT2JqKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0Z1bmN0aW9uPiBwRnVuYyhDUERGX0Z1bmN0aW9uOjpMb2FkKHBTdWIpKTsKLSAgICBpZiAoIXBGdW5jKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIC8vIENoZWNrIHRoYXQgdGhlIGlucHV0IGRpbWVuc2lvbmFsaXR5IGlzIDEsIGFuZCB0aGF0IGFsbCBvdXRwdXQKLSAgICAvLyBkaW1lbnNpb25hbGl0aWVzIGFyZSB0aGUgc2FtZS4KLSAgICBpZiAocEZ1bmMtPkNvdW50SW5wdXRzKCkgIT0ga1JlcXVpcmVkTnVtSW5wdXRzKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmIChwRnVuYy0+Q291bnRPdXRwdXRzKCkgIT0gbV9uT3V0cHV0cykgewotICAgICAgaWYgKG1fbk91dHB1dHMpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgbV9uT3V0cHV0cyA9IHBGdW5jLT5Db3VudE91dHB1dHMoKTsKLSAgICB9Ci0KLSAgICBtX3BTdWJGdW5jdGlvbnMucHVzaF9iYWNrKHN0ZDo6bW92ZShwRnVuYykpOwotICB9Ci0gIG1fcEJvdW5kcyA9IEZYX0FsbG9jKEZYX0ZMT0FULCBuU3VicyArIDEpOwotICBtX3BCb3VuZHNbMF0gPSBtX3BEb21haW5zWzBdOwotICBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXlGb3IoIkJvdW5kcyIpOwotICBpZiAoIXBBcnJheSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuU3VicyAtIDE7IGkrKykKLSAgICBtX3BCb3VuZHNbaSArIDFdID0gcEFycmF5LT5HZXRGbG9hdEF0KGkpOwotICBtX3BCb3VuZHNbblN1YnNdID0gbV9wRG9tYWluc1sxXTsKLSAgbV9wRW5jb2RlID0gRlhfQWxsb2MyRChGWF9GTE9BVCwgblN1YnMsIDIpOwotICBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXlGb3IoIkVuY29kZSIpOwotICBpZiAoIXBBcnJheSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5TdWJzICogMjsgaSsrKQotICAgIG1fcEVuY29kZVtpXSA9IHBBcnJheS0+R2V0RmxvYXRBdChpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1BERl9TdGl0Y2hGdW5jOjp2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIG91dHB1dHMpIGNvbnN0IHsKLSAgRlhfRkxPQVQgaW5wdXQgPSBpbnB1dHNbMF07Ci0gIHNpemVfdCBpOwotICBmb3IgKGkgPSAwOyBpIDwgbV9wU3ViRnVuY3Rpb25zLnNpemUoKSAtIDE7IGkrKykgewotICAgIGlmIChpbnB1dCA8IG1fcEJvdW5kc1tpICsgMV0pCi0gICAgICBicmVhazsKLSAgfQotICBpbnB1dCA9IFBERl9JbnRlcnBvbGF0ZShpbnB1dCwgbV9wQm91bmRzW2ldLCBtX3BCb3VuZHNbaSArIDFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BFbmNvZGVbaSAqIDJdLCBtX3BFbmNvZGVbaSAqIDIgKyAxXSk7Ci0gIGludCBucmVzdWx0czsKLSAgbV9wU3ViRnVuY3Rpb25zW2ldLT5DYWxsKCZpbnB1dCwga1JlcXVpcmVkTnVtSW5wdXRzLCBvdXRwdXRzLCBucmVzdWx0cyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBzdGF0aWMKLXN0ZDo6dW5pcXVlX3B0cjxDUERGX0Z1bmN0aW9uPiBDUERGX0Z1bmN0aW9uOjpMb2FkKENQREZfT2JqZWN0KiBwRnVuY09iaikgewotICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9GdW5jdGlvbj4gcEZ1bmM7Ci0gIGlmICghcEZ1bmNPYmopCi0gICAgcmV0dXJuIHBGdW5jOwotCi0gIGludCBpVHlwZSA9IC0xOwotICBpZiAoQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwRnVuY09iai0+QXNTdHJlYW0oKSkKLSAgICBpVHlwZSA9IHBTdHJlYW0tPkdldERpY3QoKS0+R2V0SW50ZWdlckZvcigiRnVuY3Rpb25UeXBlIik7Ci0gIGVsc2UgaWYgKENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwRnVuY09iai0+QXNEaWN0aW9uYXJ5KCkpCi0gICAgaVR5cGUgPSBwRGljdC0+R2V0SW50ZWdlckZvcigiRnVuY3Rpb25UeXBlIik7Ci0KLSAgVHlwZSB0eXBlID0gSW50ZWdlclRvRnVuY3Rpb25UeXBlKGlUeXBlKTsKLSAgaWYgKHR5cGUgPT0gVHlwZTo6a1R5cGUwU2FtcGxlZCkKLSAgICBwRnVuYyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1NhbXBsZWRGdW5jPigpOwotICBlbHNlIGlmICh0eXBlID09IFR5cGU6OmtUeXBlMkV4cG90ZW50aWFsSW50ZXJwb2xhdGlvbikKLSAgICBwRnVuYyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0V4cEludEZ1bmM+KCk7Ci0gIGVsc2UgaWYgKHR5cGUgPT0gVHlwZTo6a1R5cGUzU3RpdGNoaW5nKQotICAgIHBGdW5jID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU3RpdGNoRnVuYz4oKTsKLSAgZWxzZSBpZiAodHlwZSA9PSBUeXBlOjprVHlwZTRQb3N0U2NyaXB0KQotICAgIHBGdW5jID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfUFNGdW5jPigpOwotCi0gIGlmICghcEZ1bmMgfHwgIXBGdW5jLT5Jbml0KHBGdW5jT2JqKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICByZXR1cm4gcEZ1bmM7Ci19Ci0KLS8vIHN0YXRpYwotQ1BERl9GdW5jdGlvbjo6VHlwZSBDUERGX0Z1bmN0aW9uOjpJbnRlZ2VyVG9GdW5jdGlvblR5cGUoaW50IGlUeXBlKSB7Ci0gIHN3aXRjaCAoaVR5cGUpIHsKLSAgICBjYXNlIDA6Ci0gICAgY2FzZSAyOgotICAgIGNhc2UgMzoKLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHlwZT4oaVR5cGUpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gVHlwZTo6a1R5cGVJbnZhbGlkOwotICB9Ci19Ci0KLUNQREZfRnVuY3Rpb246OkNQREZfRnVuY3Rpb24oVHlwZSB0eXBlKQotICAgIDogbV9wRG9tYWlucyhudWxscHRyKSwgbV9wUmFuZ2VzKG51bGxwdHIpLCBtX1R5cGUodHlwZSkge30KLQotQ1BERl9GdW5jdGlvbjo6fkNQREZfRnVuY3Rpb24oKSB7Ci0gIEZYX0ZyZWUobV9wRG9tYWlucyk7Ci0gIEZYX0ZyZWUobV9wUmFuZ2VzKTsKLX0KLQotYm9vbCBDUERGX0Z1bmN0aW9uOjpJbml0KENQREZfT2JqZWN0KiBwT2JqKSB7Ci0gIENQREZfU3RyZWFtKiBwU3RyZWFtID0gcE9iai0+QXNTdHJlYW0oKTsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBTdHJlYW0gPyBwU3RyZWFtLT5HZXREaWN0KCkgOiBwT2JqLT5Bc0RpY3Rpb25hcnkoKTsKLQotICBDUERGX0FycmF5KiBwRG9tYWlucyA9IHBEaWN0LT5HZXRBcnJheUZvcigiRG9tYWluIik7Ci0gIGlmICghcERvbWFpbnMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG1fbklucHV0cyA9IHBEb21haW5zLT5HZXRDb3VudCgpIC8gMjsKLSAgaWYgKG1fbklucHV0cyA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBtX3BEb21haW5zID0gRlhfQWxsb2MyRChGWF9GTE9BVCwgbV9uSW5wdXRzLCAyKTsKLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fbklucHV0cyAqIDI7IGkrKykgewotICAgIG1fcERvbWFpbnNbaV0gPSBwRG9tYWlucy0+R2V0RmxvYXRBdChpKTsKLSAgfQotICBDUERGX0FycmF5KiBwUmFuZ2VzID0gcERpY3QtPkdldEFycmF5Rm9yKCJSYW5nZSIpOwotICBtX25PdXRwdXRzID0gMDsKLSAgaWYgKHBSYW5nZXMpIHsKLSAgICBtX25PdXRwdXRzID0gcFJhbmdlcy0+R2V0Q291bnQoKSAvIDI7Ci0gICAgbV9wUmFuZ2VzID0gRlhfQWxsb2MyRChGWF9GTE9BVCwgbV9uT3V0cHV0cywgMik7Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fbk91dHB1dHMgKiAyOyBpKyspCi0gICAgICBtX3BSYW5nZXNbaV0gPSBwUmFuZ2VzLT5HZXRGbG9hdEF0KGkpOwotICB9Ci0gIHVpbnQzMl90IG9sZF9vdXRwdXRzID0gbV9uT3V0cHV0czsKLSAgaWYgKCF2X0luaXQocE9iaikpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAobV9wUmFuZ2VzICYmIG1fbk91dHB1dHMgPiBvbGRfb3V0cHV0cykgewotICAgIG1fcFJhbmdlcyA9IEZYX1JlYWxsb2MoRlhfRkxPQVQsIG1fcFJhbmdlcywgbV9uT3V0cHV0cyAqIDIpOwotICAgIGlmIChtX3BSYW5nZXMpIHsKLSAgICAgIEZYU1lTX21lbXNldChtX3BSYW5nZXMgKyAob2xkX291dHB1dHMgKiAyKSwgMCwKLSAgICAgICAgICAgICAgICAgICBzaXplb2YoRlhfRkxPQVQpICogKG1fbk91dHB1dHMgLSBvbGRfb3V0cHV0cykgKiAyKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1BERl9GdW5jdGlvbjo6Q2FsbChGWF9GTE9BVCogaW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5pbnB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHJlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBucmVzdWx0cykgY29uc3QgewotICBpZiAobV9uSW5wdXRzICE9IG5pbnB1dHMpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgbnJlc3VsdHMgPSBtX25PdXRwdXRzOwotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9uSW5wdXRzOyBpKyspIHsKLSAgICBpZiAoaW5wdXRzW2ldIDwgbV9wRG9tYWluc1tpICogMl0pCi0gICAgICBpbnB1dHNbaV0gPSBtX3BEb21haW5zW2kgKiAyXTsKLSAgICBlbHNlIGlmIChpbnB1dHNbaV0gPiBtX3BEb21haW5zW2kgKiAyICsgMV0pCi0gICAgICBpbnB1dHNbaV0gPSBtX3BEb21haW5zW2kgKiAyXSArIDE7Ci0gIH0KLSAgdl9DYWxsKGlucHV0cywgcmVzdWx0cyk7Ci0gIGlmIChtX3BSYW5nZXMpIHsKLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9uT3V0cHV0czsgaSsrKSB7Ci0gICAgICBpZiAocmVzdWx0c1tpXSA8IG1fcFJhbmdlc1tpICogMl0pCi0gICAgICAgIHJlc3VsdHNbaV0gPSBtX3BSYW5nZXNbaSAqIDJdOwotICAgICAgZWxzZSBpZiAocmVzdWx0c1tpXSA+IG1fcFJhbmdlc1tpICogMiArIDFdKQotICAgICAgICByZXN1bHRzW2ldID0gbV9wUmFuZ2VzW2kgKiAyICsgMV07Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBDUERGX1NhbXBsZWRGdW5jKiBDUERGX0Z1bmN0aW9uOjpUb1NhbXBsZWRGdW5jKCkgY29uc3QgewotICByZXR1cm4gbV9UeXBlID09IFR5cGU6OmtUeXBlMFNhbXBsZWQKLSAgICAgICAgICAgICA/IHN0YXRpY19jYXN0PGNvbnN0IENQREZfU2FtcGxlZEZ1bmMqPih0aGlzKQotICAgICAgICAgICAgIDogbnVsbHB0cjsKLX0KLQotY29uc3QgQ1BERl9FeHBJbnRGdW5jKiBDUERGX0Z1bmN0aW9uOjpUb0V4cEludEZ1bmMoKSBjb25zdCB7Ci0gIHJldHVybiBtX1R5cGUgPT0gVHlwZTo6a1R5cGUyRXhwb3RlbnRpYWxJbnRlcnBvbGF0aW9uCi0gICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxjb25zdCBDUERGX0V4cEludEZ1bmMqPih0aGlzKQotICAgICAgICAgICAgIDogbnVsbHB0cjsKLX0KLQotY29uc3QgQ1BERl9TdGl0Y2hGdW5jKiBDUERGX0Z1bmN0aW9uOjpUb1N0aXRjaEZ1bmMoKSBjb25zdCB7Ci0gIHJldHVybiBtX1R5cGUgPT0gVHlwZTo6a1R5cGUzU3RpdGNoaW5nCi0gICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxjb25zdCBDUERGX1N0aXRjaEZ1bmMqPih0aGlzKQotICAgICAgICAgICAgIDogbnVsbHB0cjsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYWdlL3BhZ2VpbnQuaCBiL2NvcmUvZnBkZmFwaS9wYWdlL3BhZ2VpbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcwMDYzMy4uMDAwMDAwMAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFnZS9wYWdlaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlBERkFQSV9QQUdFX1BBR0VJTlRfSF8KLSNkZWZpbmUgQ09SRV9GUERGQVBJX1BBR0VfUEFHRUlOVF9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29sb3JzcGFjZS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY291bnRlZG9iamVjdC5oIgotCi1jbGFzcyBDUERGX0V4cEludEZ1bmM7Ci1jbGFzcyBDUERGX1BhdHRlcm47Ci1jbGFzcyBDUERGX1NhbXBsZWRGdW5jOwotY2xhc3MgQ1BERl9TdGl0Y2hGdW5jOwotY2xhc3MgQ1BERl9TdHJlYW1BY2M7Ci0KLWNsYXNzIENQREZfRnVuY3Rpb24gewotIHB1YmxpYzoKLSAgZW51bSBjbGFzcyBUeXBlIHsKLSAgICBrVHlwZUludmFsaWQgPSAtMSwKLSAgICBrVHlwZTBTYW1wbGVkID0gMCwKLSAgICBrVHlwZTJFeHBvdGVudGlhbEludGVycG9sYXRpb24gPSAyLAotICAgIGtUeXBlM1N0aXRjaGluZyA9IDMsCi0gICAga1R5cGU0UG9zdFNjcmlwdCA9IDQsCi0gIH07Ci0KLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0Z1bmN0aW9uPiBMb2FkKENQREZfT2JqZWN0KiBwRnVuY09iaik7Ci0gIHN0YXRpYyBUeXBlIEludGVnZXJUb0Z1bmN0aW9uVHlwZShpbnQgaVR5cGUpOwotCi0gIHZpcnR1YWwgfkNQREZfRnVuY3Rpb24oKTsKLSAgYm9vbCBDYWxsKEZYX0ZMT0FUKiBpbnB1dHMsCi0gICAgICAgICAgICB1aW50MzJfdCBuaW5wdXRzLAotICAgICAgICAgICAgRlhfRkxPQVQqIHJlc3VsdHMsCi0gICAgICAgICAgICBpbnQmIG5yZXN1bHRzKSBjb25zdDsKLSAgdWludDMyX3QgQ291bnRJbnB1dHMoKSBjb25zdCB7IHJldHVybiBtX25JbnB1dHM7IH0KLSAgdWludDMyX3QgQ291bnRPdXRwdXRzKCkgY29uc3QgeyByZXR1cm4gbV9uT3V0cHV0czsgfQotICBGWF9GTE9BVCBHZXREb21haW4oaW50IGkpIGNvbnN0IHsgcmV0dXJuIG1fcERvbWFpbnNbaV07IH0KLSAgRlhfRkxPQVQgR2V0UmFuZ2UoaW50IGkpIGNvbnN0IHsgcmV0dXJuIG1fcFJhbmdlc1tpXTsgfQotCi0gIGNvbnN0IENQREZfU2FtcGxlZEZ1bmMqIFRvU2FtcGxlZEZ1bmMoKSBjb25zdDsKLSAgY29uc3QgQ1BERl9FeHBJbnRGdW5jKiBUb0V4cEludEZ1bmMoKSBjb25zdDsKLSAgY29uc3QgQ1BERl9TdGl0Y2hGdW5jKiBUb1N0aXRjaEZ1bmMoKSBjb25zdDsKLQotIHByb3RlY3RlZDoKLSAgZXhwbGljaXQgQ1BERl9GdW5jdGlvbihUeXBlIHR5cGUpOwotCi0gIGJvb2wgSW5pdChDUERGX09iamVjdCogcE9iaik7Ci0gIHZpcnR1YWwgYm9vbCB2X0luaXQoQ1BERl9PYmplY3QqIHBPYmopID0gMDsKLSAgdmlydHVhbCBib29sIHZfQ2FsbChGWF9GTE9BVCogaW5wdXRzLCBGWF9GTE9BVCogcmVzdWx0cykgY29uc3QgPSAwOwotCi0gIHVpbnQzMl90IG1fbklucHV0czsKLSAgdWludDMyX3QgbV9uT3V0cHV0czsKLSAgRlhfRkxPQVQqIG1fcERvbWFpbnM7Ci0gIEZYX0ZMT0FUKiBtX3BSYW5nZXM7Ci0gIGNvbnN0IFR5cGUgbV9UeXBlOwotfTsKLQotY2xhc3MgQ1BERl9FeHBJbnRGdW5jIDogcHVibGljIENQREZfRnVuY3Rpb24gewotIHB1YmxpYzoKLSAgQ1BERl9FeHBJbnRGdW5jKCk7Ci0gIH5DUERGX0V4cEludEZ1bmMoKSBvdmVycmlkZTsKLQotICAvLyBDUERGX0Z1bmN0aW9uCi0gIGJvb2wgdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKSBvdmVycmlkZTsKLSAgYm9vbCB2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHVpbnQzMl90IG1fbk9yaWdPdXRwdXRzOwotICBGWF9GTE9BVCBtX0V4cG9uZW50OwotICBGWF9GTE9BVCogbV9wQmVnaW5WYWx1ZXM7Ci0gIEZYX0ZMT0FUKiBtX3BFbmRWYWx1ZXM7Ci19OwotCi1jbGFzcyBDUERGX1NhbXBsZWRGdW5jIDogcHVibGljIENQREZfRnVuY3Rpb24gewotIHB1YmxpYzoKLSAgc3RydWN0IFNhbXBsZUVuY29kZUluZm8gewotICAgIEZYX0ZMT0FUIGVuY29kZV9tYXg7Ci0gICAgRlhfRkxPQVQgZW5jb2RlX21pbjsKLSAgICB1aW50MzJfdCBzaXplczsKLSAgfTsKLQotICBzdHJ1Y3QgU2FtcGxlRGVjb2RlSW5mbyB7Ci0gICAgRlhfRkxPQVQgZGVjb2RlX21heDsKLSAgICBGWF9GTE9BVCBkZWNvZGVfbWluOwotICB9OwotCi0gIENQREZfU2FtcGxlZEZ1bmMoKTsKLSAgfkNQREZfU2FtcGxlZEZ1bmMoKSBvdmVycmlkZTsKLQotICAvLyBDUERGX0Z1bmN0aW9uCi0gIGJvb2wgdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKSBvdmVycmlkZTsKLSAgYm9vbCB2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0IG92ZXJyaWRlOwotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPFNhbXBsZUVuY29kZUluZm8+JiBHZXRFbmNvZGVJbmZvKCkgY29uc3QgewotICAgIHJldHVybiBtX0VuY29kZUluZm87Ci0gIH0KLSAgdWludDMyX3QgR2V0Qml0c1BlclNhbXBsZSgpIGNvbnN0IHsgcmV0dXJuIG1fbkJpdHNQZXJTYW1wbGU7IH0KLSAgY29uc3QgQ1BERl9TdHJlYW1BY2MqIEdldFNhbXBsZVN0cmVhbSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbV9wU2FtcGxlU3RyZWFtLmdldCgpOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnZlY3RvcjxTYW1wbGVFbmNvZGVJbmZvPiBtX0VuY29kZUluZm87Ci0gIHN0ZDo6dmVjdG9yPFNhbXBsZURlY29kZUluZm8+IG1fRGVjb2RlSW5mbzsKLSAgdWludDMyX3QgbV9uQml0c1BlclNhbXBsZTsKLSAgdWludDMyX3QgbV9TYW1wbGVNYXg7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1N0cmVhbUFjYz4gbV9wU2FtcGxlU3RyZWFtOwotfTsKLQotY2xhc3MgQ1BERl9TdGl0Y2hGdW5jIDogcHVibGljIENQREZfRnVuY3Rpb24gewotIHB1YmxpYzoKLSAgQ1BERl9TdGl0Y2hGdW5jKCk7Ci0gIH5DUERGX1N0aXRjaEZ1bmMoKSBvdmVycmlkZTsKLQotICAvLyBDUERGX0Z1bmN0aW9uCi0gIGJvb2wgdl9Jbml0KENQREZfT2JqZWN0KiBwT2JqKSBvdmVycmlkZTsKLSAgYm9vbCB2X0NhbGwoRlhfRkxPQVQqIGlucHV0cywgRlhfRkxPQVQqIHJlc3VsdHMpIGNvbnN0IG92ZXJyaWRlOwotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDUERGX0Z1bmN0aW9uPj4mIEdldFN1YkZ1bmN0aW9ucygpIGNvbnN0IHsKLSAgICByZXR1cm4gbV9wU3ViRnVuY3Rpb25zOwotICB9Ci0gIEZYX0ZMT0FUIEdldEJvdW5kKHNpemVfdCBpKSBjb25zdCB7IHJldHVybiBtX3BCb3VuZHNbaV07IH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDUERGX0Z1bmN0aW9uPj4gbV9wU3ViRnVuY3Rpb25zOwotICBGWF9GTE9BVCogbV9wQm91bmRzOwotICBGWF9GTE9BVCogbV9wRW5jb2RlOwotCi0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrUmVxdWlyZWROdW1JbnB1dHMgPSAxOwotfTsKLQotY2xhc3MgQ1BERl9JY2NQcm9maWxlIHsKLSBwdWJsaWM6Ci0gIENQREZfSWNjUHJvZmlsZShjb25zdCB1aW50OF90KiBwRGF0YSwgdWludDMyX3QgZHdTaXplKTsKLSAgfkNQREZfSWNjUHJvZmlsZSgpOwotICB1aW50MzJfdCBHZXRDb21wb25lbnRzKCkgY29uc3QgeyByZXR1cm4gbV9uU3JjQ29tcG9uZW50czsgfQotICBib29sIG1fYnNSR0I7Ci0gIHZvaWQqIG1fcFRyYW5zZm9ybTsKLQotIHByaXZhdGU6Ci0gIHVpbnQzMl90IG1fblNyY0NvbXBvbmVudHM7Ci19OwotCi1jbGFzcyBDUERGX0RldmljZUNTIDogcHVibGljIENQREZfQ29sb3JTcGFjZSB7Ci0gcHVibGljOgotICBDUERGX0RldmljZUNTKENQREZfRG9jdW1lbnQqIHBEb2MsIGludCBmYW1pbHkpOwotCi0gIGJvb2wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAotICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKLSAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKLSAgYm9vbCBTZXRSR0IoRlhfRkxPQVQqIHBCdWYsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUIFIsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUIEcsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUIEIpIGNvbnN0IG92ZXJyaWRlOwotICBib29sIHZfR2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKLSAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGMsCi0gICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBtLAotICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgeSwKLSAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGspIGNvbnN0IG92ZXJyaWRlOwotICBib29sIHZfU2V0Q01ZSyhGWF9GTE9BVCogcEJ1ZiwKLSAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYywKLSAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbSwKLSAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSwKLSAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaykgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgVHJhbnNsYXRlSW1hZ2VMaW5lKHVpbnQ4X3QqIHBEZXN0QnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwU3JjQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1hZ2Vfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWFnZV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRyYW5zTWFzayA9IGZhbHNlKSBjb25zdCBvdmVycmlkZTsKLX07Ci0KLWNsYXNzIENQREZfUGF0dGVybkNTIDogcHVibGljIENQREZfQ29sb3JTcGFjZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDUERGX1BhdHRlcm5DUyhDUERGX0RvY3VtZW50KiBwRG9jKTsKLSAgfkNQREZfUGF0dGVybkNTKCkgb3ZlcnJpZGU7Ci0gIGJvb2wgdl9Mb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfQXJyYXkqIHBBcnJheSkgb3ZlcnJpZGU7Ci0gIGJvb2wgR2V0UkdCKEZYX0ZMT0FUKiBwQnVmLAotICAgICAgICAgICAgICBGWF9GTE9BVCYgUiwKLSAgICAgICAgICAgICAgRlhfRkxPQVQmIEcsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUJiBCKSBjb25zdCBvdmVycmlkZTsKLSAgQ1BERl9Db2xvclNwYWNlKiBHZXRCYXNlQ1MoKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIENQREZfQ29sb3JTcGFjZSogbV9wQmFzZUNTOwotICBDUERGX0NvdW50ZWRDb2xvclNwYWNlKiBtX3BDb3VudGVkQmFzZUNTOwotfTsKLQotI2RlZmluZSBNQVhfUEFUVEVSTl9DT0xPUkNPTVBTIDE2Ci1zdHJ1Y3QgUGF0dGVyblZhbHVlIHsKLSAgQ1BERl9QYXR0ZXJuKiBtX3BQYXR0ZXJuOwotICBDUERGX0NvdW50ZWRQYXR0ZXJuKiBtX3BDb3VudGVkUGF0dGVybjsKLSAgaW50IG1fbkNvbXBzOwotICBGWF9GTE9BVCBtX0NvbXBzW01BWF9QQVRURVJOX0NPTE9SQ09NUFNdOwotfTsKLQotQ0ZYX0J5dGVTdHJpbmdDIFBERl9GaW5kS2V5QWJicmV2aWF0aW9uRm9yVGVzdGluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGFiYnIpOwotQ0ZYX0J5dGVTdHJpbmdDIFBERl9GaW5kVmFsdWVBYmJyZXZpYXRpb25Gb3JUZXN0aW5nKAotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYWJicik7Ci0KLSNlbmRpZiAgLy8gQ09SRV9GUERGQVBJX1BBR0VfUEFHRUlOVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9jZmRmX2RvY3VtZW50LmNwcCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY2ZkZl9kb2N1bWVudC5jcHAKaW5kZXggNjU3NTU1Mi4uZjZhZjQ1NCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhcnNlci9jZmRmX2RvY3VtZW50LmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NmZGZfZG9jdW1lbnQuY3BwCkBAIC03LDExICs3LDE0IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jZmRmX2RvY3VtZW50LmgiCiAKICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDx1dGlsaXR5PgogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9jcmVhdG9yLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3ludGF4X3BhcnNlci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfdXRpbGl0eS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X21lbW9yeXN0cmVhbS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAogQ0ZERl9Eb2N1bWVudDo6Q0ZERl9Eb2N1bWVudCgpCkBAIC0yNiwyOSArMjksMjEgQEAKICAgcmV0dXJuIHBEb2M7CiB9CiAKLXN0ZDo6dW5pcXVlX3B0cjxDRkRGX0RvY3VtZW50PiBDRkRGX0RvY3VtZW50OjpQYXJzZUZpbGUoCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGUpIHsKLSAgaWYgKCFwRmlsZSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQorc3RkOjp1bmlxdWVfcHRyPENGREZfRG9jdW1lbnQ+IENGREZfRG9jdW1lbnQ6OlBhcnNlTWVtb3J5KHVpbnQ4X3QqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUpIHsKICAgYXV0byBwRG9jID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGREZfRG9jdW1lbnQ+KCk7Ci0gIHBEb2MtPlBhcnNlU3RyZWFtKHBGaWxlKTsKKyAgcERvYy0+UGFyc2VTdHJlYW0ocGRmaXVtOjpNYWtlUmV0YWluPENGWF9NZW1vcnlTdHJlYW0+KHBEYXRhLCBzaXplLCBmYWxzZSkpOwogICByZXR1cm4gcERvYy0+bV9wUm9vdERpY3QgPyBzdGQ6Om1vdmUocERvYykgOiBudWxscHRyOwogfQogCi1zdGQ6OnVuaXF1ZV9wdHI8Q0ZERl9Eb2N1bWVudD4gQ0ZERl9Eb2N1bWVudDo6UGFyc2VNZW1vcnkodWludDhfdCogcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSkgewotICByZXR1cm4gQ0ZERl9Eb2N1bWVudDo6UGFyc2VGaWxlKElGWF9NZW1vcnlTdHJlYW06OkNyZWF0ZShwRGF0YSwgc2l6ZSkpOwotfQotCiB2b2lkIENGREZfRG9jdW1lbnQ6OlBhcnNlU3RyZWFtKAotICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBGaWxlKSB7CisgICAgY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZSkgewogICBtX3BGaWxlID0gcEZpbGU7CiAgIENQREZfU3ludGF4UGFyc2VyIHBhcnNlcjsKICAgcGFyc2VyLkluaXRQYXJzZXIobV9wRmlsZSwgMCk7CiAgIHdoaWxlICgxKSB7CiAgICAgYm9vbCBiTnVtYmVyOwotICAgIENGWF9CeXRlU3RyaW5nIHdvcmQgPSBwYXJzZXIuR2V0TmV4dFdvcmQoJmJOdW1iZXIpOworICAgIEJ5dGVTdHJpbmcgd29yZCA9IHBhcnNlci5HZXROZXh0V29yZCgmYk51bWJlcik7CiAgICAgaWYgKGJOdW1iZXIpIHsKICAgICAgIHVpbnQzMl90IG9iam51bSA9IEZYU1lTX2F0b3VpKHdvcmQuY19zdHIoKSk7CiAgICAgICBpZiAoIW9iam51bSkKQEAgLTYyLDggKzU3LDcgQEAKICAgICAgIGlmICh3b3JkICE9ICJvYmoiKQogICAgICAgICBicmVhazsKIAotICAgICAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBwT2JqID0KLSAgICAgICAgICBwYXJzZXIuR2V0T2JqZWN0KHRoaXMsIG9iam51bSwgMCwgdHJ1ZSk7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IHBPYmogPSBwYXJzZXIuR2V0T2JqZWN0Qm9keSh0aGlzKTsKICAgICAgIGlmICghcE9iaikKICAgICAgICAgYnJlYWs7CiAKQEAgLTc2LDcgKzcwLDcgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0RpY3Rpb25hcnk+IHBNYWluRGljdCA9Ci0gICAgICAgICAgVG9EaWN0aW9uYXJ5KHBhcnNlci5HZXRPYmplY3QodGhpcywgMCwgMCwgdHJ1ZSkpOworICAgICAgICAgIFRvRGljdGlvbmFyeShwYXJzZXIuR2V0T2JqZWN0Qm9keSh0aGlzKSk7CiAgICAgICBpZiAocE1haW5EaWN0KQogICAgICAgICBtX3BSb290RGljdCA9IHBNYWluRGljdC0+R2V0RGljdEZvcigiUm9vdCIpOwogCkBAIC04NSwxMCArNzksMTEgQEAKICAgfQogfQogCi1ib29sIENGREZfRG9jdW1lbnQ6OldyaXRlQnVmKENGWF9CeXRlVGV4dEJ1ZiYgYnVmKSBjb25zdCB7CitCeXRlU3RyaW5nIENGREZfRG9jdW1lbnQ6OldyaXRlVG9TdHJpbmcoKSBjb25zdCB7CiAgIGlmICghbV9wUm9vdERpY3QpCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CiAKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGJ1ZjsKICAgYnVmIDw8ICIlRkRGLTEuMlxyXG4iOwogICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiAqdGhpcykKICAgICBidWYgPDwgcGFpci5maXJzdCA8PCAiIDAgb2JqXHJcbiIKQEAgLTk2LDUgKzkxLDYgQEAKIAogICBidWYgPDwgInRyYWlsZXJcclxuPDwvUm9vdCAiIDw8IG1fcFJvb3REaWN0LT5HZXRPYmpOdW0oKQogICAgICAgPDwgIiAwIFI+PlxyXG4lJUVPRlxyXG4iOwotICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gQnl0ZVN0cmluZyhidWYpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9jZmRmX2RvY3VtZW50LmggYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NmZGZfZG9jdW1lbnQuaAppbmRleCBmODNhZGMxLi5iMmNiZDViIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NmZGZfZG9jdW1lbnQuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NmZGZfZG9jdW1lbnQuaApAQCAtMTEsMjkgKzExLDI4IEBACiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfaW5kaXJlY3Rfb2JqZWN0X2hvbGRlci5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3QuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogCiBjbGFzcyBDUERGX0RpY3Rpb25hcnk7CitjbGFzcyBJRlhfU2Vla2FibGVSZWFkU3RyZWFtOwogCiBjbGFzcyBDRkRGX0RvY3VtZW50IDogcHVibGljIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIgewogIHB1YmxpYzoKICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDRkRGX0RvY3VtZW50PiBDcmVhdGVOZXdEb2MoKTsKLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDRkRGX0RvY3VtZW50PiBQYXJzZUZpbGUoCi0gICAgICBjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZSk7CiAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Q0ZERl9Eb2N1bWVudD4gUGFyc2VNZW1vcnkodWludDhfdCogcERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSk7CiAKICAgQ0ZERl9Eb2N1bWVudCgpOwogICB+Q0ZERl9Eb2N1bWVudCgpIG92ZXJyaWRlOwogCi0gIGJvb2wgV3JpdGVCdWYoQ0ZYX0J5dGVUZXh0QnVmJiBidWYpIGNvbnN0OwotICBDUERGX0RpY3Rpb25hcnkqIEdldFJvb3QoKSBjb25zdCB7IHJldHVybiBtX3BSb290RGljdDsgfQorICBCeXRlU3RyaW5nIFdyaXRlVG9TdHJpbmcoKSBjb25zdDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRSb290KCkgY29uc3QgeyByZXR1cm4gbV9wUm9vdERpY3QuR2V0KCk7IH0KIAogIHByb3RlY3RlZDoKLSAgdm9pZCBQYXJzZVN0cmVhbShjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZSk7CisgIHZvaWQgUGFyc2VTdHJlYW0oY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZSk7CiAKLSAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BSb290RGljdDsKLSAgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBtX3BGaWxlOworICBVbm93bmVkUHRyPENQREZfRGljdGlvbmFyeT4gbV9wUm9vdERpY3Q7CisgIFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBtX3BGaWxlOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfUEFSU0VSX0NGREZfRE9DVU1FTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuY3BwCmluZGV4IDA1YTkzNzAuLjVhNWNkYzkgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmNwcApAQCAtMTQsMTMgKzE0LDEzIEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3JlZmVyZW5jZS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJlYW0uaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2xvZ2dpbmcuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCiAKIENQREZfQXJyYXk6OkNQREZfQXJyYXkoKSB7fQogCi1DUERGX0FycmF5OjpDUERGX0FycmF5KGNvbnN0IENGWF9XZWFrUHRyPENGWF9CeXRlU3RyaW5nUG9vbD4mIHBQb29sKQotICAgIDogbV9wUG9vbChwUG9vbCkge30KK0NQREZfQXJyYXk6OkNQREZfQXJyYXkoY29uc3QgV2Vha1B0cjxCeXRlU3RyaW5nUG9vbD4mIHBQb29sKSA6IG1fcFBvb2wocFBvb2wpIHt9CiAKIENQREZfQXJyYXk6On5DUERGX0FycmF5KCkgewogICAvLyBCcmVhayBjeWNsZXMgZm9yIGN5Y2xpYyByZWZlcmVuY2VzLgpAQCAtNTcsOCArNTcsMTEgQEAKICAgcFZpc2l0ZWQtPmluc2VydCh0aGlzKTsKICAgYXV0byBwQ29weSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0FycmF5PigpOwogICBmb3IgKGNvbnN0IGF1dG8mIHBWYWx1ZSA6IG1fT2JqZWN0cykgewotICAgIGlmICghcGRmaXVtOjpDb250YWluc0tleSgqcFZpc2l0ZWQsIHBWYWx1ZS5nZXQoKSkpCi0gICAgICBwQ29weS0+bV9PYmplY3RzLnB1c2hfYmFjayhwVmFsdWUtPkNsb25lTm9uQ3ljbGljKGJEaXJlY3QsIHBWaXNpdGVkKSk7CisgICAgaWYgKCFwZGZpdW06OkNvbnRhaW5zS2V5KCpwVmlzaXRlZCwgcFZhbHVlLmdldCgpKSkgeworICAgICAgc3RkOjpzZXQ8Y29uc3QgQ1BERl9PYmplY3QqPiB2aXNpdGVkKCpwVmlzaXRlZCk7CisgICAgICBpZiAoYXV0byBvYmogPSBwVmFsdWUtPkNsb25lTm9uQ3ljbGljKGJEaXJlY3QsICZ2aXNpdGVkKSkKKyAgICAgICAgcENvcHktPm1fT2JqZWN0cy5wdXNoX2JhY2soc3RkOjptb3ZlKG9iaikpOworICAgIH0KICAgfQogICByZXR1cm4gc3RkOjptb3ZlKHBDb3B5KTsKIH0KQEAgLTk2LDE5ICs5OSwyNSBAQAogICByZXR1cm4gbV9PYmplY3RzW2ldLT5HZXREaXJlY3QoKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9BcnJheTo6R2V0U3RyaW5nQXQoc2l6ZV90IGkpIGNvbnN0IHsKK0J5dGVTdHJpbmcgQ1BERl9BcnJheTo6R2V0U3RyaW5nQXQoc2l6ZV90IGkpIGNvbnN0IHsKICAgaWYgKGkgPj0gbV9PYmplY3RzLnNpemUoKSkKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKKyAgICByZXR1cm4gQnl0ZVN0cmluZygpOwogICByZXR1cm4gbV9PYmplY3RzW2ldLT5HZXRTdHJpbmcoKTsKIH0KIAorV2lkZVN0cmluZyBDUERGX0FycmF5OjpHZXRVbmljb2RlVGV4dEF0KHNpemVfdCBpKSBjb25zdCB7CisgIGlmIChpID49IG1fT2JqZWN0cy5zaXplKCkpCisgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKKyAgcmV0dXJuIG1fT2JqZWN0c1tpXS0+R2V0VW5pY29kZVRleHQoKTsKK30KKwogaW50IENQREZfQXJyYXk6OkdldEludGVnZXJBdChzaXplX3QgaSkgY29uc3QgewogICBpZiAoaSA+PSBtX09iamVjdHMuc2l6ZSgpKQogICAgIHJldHVybiAwOwogICByZXR1cm4gbV9PYmplY3RzW2ldLT5HZXRJbnRlZ2VyKCk7CiB9CiAKLUZYX0ZMT0FUIENQREZfQXJyYXk6OkdldE51bWJlckF0KHNpemVfdCBpKSBjb25zdCB7CitmbG9hdCBDUERGX0FycmF5OjpHZXROdW1iZXJBdChzaXplX3QgaSkgY29uc3QgewogICBpZiAoaSA+PSBtX09iamVjdHMuc2l6ZSgpKQogICAgIHJldHVybiAwOwogICByZXR1cm4gbV9PYmplY3RzW2ldLT5HZXROdW1iZXIoKTsKQEAgLTEzMywxNCArMTQyLDEzIEBACiAgIHJldHVybiBUb0FycmF5KEdldERpcmVjdE9iamVjdEF0KGkpKTsKIH0KIAotdm9pZCBDUERGX0FycmF5OjpSZW1vdmVBdChzaXplX3QgaSwgc2l6ZV90IG5Db3VudCkgewotICBpZiAoaSA+PSBtX09iamVjdHMuc2l6ZSgpKQotICAgIHJldHVybjsKK3ZvaWQgQ1BERl9BcnJheTo6Q2xlYXIoKSB7CisgIG1fT2JqZWN0cy5jbGVhcigpOworfQogCi0gIGlmIChuQ291bnQgPD0gMCB8fCBuQ291bnQgPiBtX09iamVjdHMuc2l6ZSgpIC0gaSkKLSAgICByZXR1cm47Ci0KLSAgbV9PYmplY3RzLmVyYXNlKG1fT2JqZWN0cy5iZWdpbigpICsgaSwgbV9PYmplY3RzLmJlZ2luKCkgKyBpICsgbkNvdW50KTsKK3ZvaWQgQ1BERl9BcnJheTo6UmVtb3ZlQXQoc2l6ZV90IGkpIHsKKyAgaWYgKGkgPCBtX09iamVjdHMuc2l6ZSgpKQorICAgIG1fT2JqZWN0cy5lcmFzZShtX09iamVjdHMuYmVnaW4oKSArIGkpOwogfQogCiB2b2lkIENQREZfQXJyYXk6OkNvbnZlcnRUb0luZGlyZWN0T2JqZWN0QXQoc2l6ZV90IGksCkBAIC0xNTksNyArMTY3LDcgQEAKICAgQVNTRVJUKElzQXJyYXkoKSk7CiAgIEFTU0VSVCghcE9iaiB8fCBwT2JqLT5Jc0lubGluZSgpKTsKICAgaWYgKGkgPj0gbV9PYmplY3RzLnNpemUoKSkgewotICAgIEFTU0VSVChmYWxzZSk7CisgICAgTk9UUkVBQ0hFRCgpOwogICAgIHJldHVybiBudWxscHRyOwogICB9CiAgIENQREZfT2JqZWN0KiBwUmV0ID0gcE9iai5nZXQoKTsKQEAgLTE5MCwzICsxOTgsMjIgQEAKICAgbV9PYmplY3RzLnB1c2hfYmFjayhzdGQ6Om1vdmUocE9iaikpOwogICByZXR1cm4gcFJldDsKIH0KKworYm9vbCBDUERGX0FycmF5OjpXcml0ZVRvKElGWF9BcmNoaXZlU3RyZWFtKiBhcmNoaXZlKSBjb25zdCB7CisgIGlmICghYXJjaGl2ZS0+V3JpdGVTdHJpbmcoIlsiKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBHZXRDb3VudCgpOyArK2kpIHsKKyAgICBDUERGX09iamVjdCogcEVsZW1lbnQgPSBHZXRPYmplY3RBdChpKTsKKyAgICBpZiAoIXBFbGVtZW50LT5Jc0lubGluZSgpKSB7CisgICAgICBpZiAoIWFyY2hpdmUtPldyaXRlU3RyaW5nKCIgIikgfHwKKyAgICAgICAgICAhYXJjaGl2ZS0+V3JpdGVEV29yZChwRWxlbWVudC0+R2V0T2JqTnVtKCkpIHx8CisgICAgICAgICAgIWFyY2hpdmUtPldyaXRlU3RyaW5nKCIgMCBSIikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXBFbGVtZW50LT5Xcml0ZVRvKGFyY2hpdmUpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiBhcmNoaXZlLT5Xcml0ZVN0cmluZygiXSIpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmggYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaAppbmRleCAwYjE2ZjdmLi5iZjhjYjQyIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaApAQCAtMTUsNyArMTUsNiBAQAogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2luZGlyZWN0X29iamVjdF9ob2xkZXIuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfb2JqZWN0LmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKQEAgLTI1LDcgKzI0LDcgQEAKICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4+Ojpjb25zdF9pdGVyYXRvcjsKIAogICBDUERGX0FycmF5KCk7Ci0gIGV4cGxpY2l0IENQREZfQXJyYXkoY29uc3QgQ0ZYX1dlYWtQdHI8Q0ZYX0J5dGVTdHJpbmdQb29sPiYgcFBvb2wpOworICBleHBsaWNpdCBDUERGX0FycmF5KGNvbnN0IFdlYWtQdHI8Qnl0ZVN0cmluZ1Bvb2w+JiBwUG9vbCk7CiAgIH5DUERGX0FycmF5KCkgb3ZlcnJpZGU7CiAKICAgLy8gQ1BERl9PYmplY3Q6CkBAIC0zNCwxOCArMzMsMjAgQEAKICAgYm9vbCBJc0FycmF5KCkgY29uc3Qgb3ZlcnJpZGU7CiAgIENQREZfQXJyYXkqIEFzQXJyYXkoKSBvdmVycmlkZTsKICAgY29uc3QgQ1BERl9BcnJheSogQXNBcnJheSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIFdyaXRlVG8oSUZYX0FyY2hpdmVTdHJlYW0qIGFyY2hpdmUpIGNvbnN0IG92ZXJyaWRlOwogCiAgIGJvb2wgSXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1fT2JqZWN0cy5lbXB0eSgpOyB9CiAgIHNpemVfdCBHZXRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fT2JqZWN0cy5zaXplKCk7IH0KICAgQ1BERl9PYmplY3QqIEdldE9iamVjdEF0KHNpemVfdCBpbmRleCkgY29uc3Q7CiAgIENQREZfT2JqZWN0KiBHZXREaXJlY3RPYmplY3RBdChzaXplX3QgaW5kZXgpIGNvbnN0OwotICBDRlhfQnl0ZVN0cmluZyBHZXRTdHJpbmdBdChzaXplX3QgaW5kZXgpIGNvbnN0OworICBCeXRlU3RyaW5nIEdldFN0cmluZ0F0KHNpemVfdCBpbmRleCkgY29uc3Q7CisgIFdpZGVTdHJpbmcgR2V0VW5pY29kZVRleHRBdChzaXplX3QgaW5kZXgpIGNvbnN0OwogICBpbnQgR2V0SW50ZWdlckF0KHNpemVfdCBpbmRleCkgY29uc3Q7Ci0gIEZYX0ZMT0FUIEdldE51bWJlckF0KHNpemVfdCBpbmRleCkgY29uc3Q7CisgIGZsb2F0IEdldE51bWJlckF0KHNpemVfdCBpbmRleCkgY29uc3Q7CiAgIENQREZfRGljdGlvbmFyeSogR2V0RGljdEF0KHNpemVfdCBpbmRleCkgY29uc3Q7CiAgIENQREZfU3RyZWFtKiBHZXRTdHJlYW1BdChzaXplX3QgaW5kZXgpIGNvbnN0OwogICBDUERGX0FycmF5KiBHZXRBcnJheUF0KHNpemVfdCBpbmRleCkgY29uc3Q7Ci0gIEZYX0ZMT0FUIEdldEZsb2F0QXQoc2l6ZV90IGluZGV4KSBjb25zdCB7IHJldHVybiBHZXROdW1iZXJBdChpbmRleCk7IH0KKyAgZmxvYXQgR2V0RmxvYXRBdChzaXplX3QgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIEdldE51bWJlckF0KGluZGV4KTsgfQogICBDRlhfTWF0cml4IEdldE1hdHJpeCgpOwogICBDRlhfRmxvYXRSZWN0IEdldFJlY3QoKTsKIApAQCAtOTgsNyArOTksOCBAQAogICAgICAgICBpbmRleCwgcGRmaXVtOjpNYWtlVW5pcXVlPFQ+KG1fcFBvb2wsIHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLikpKTsKICAgfQogCi0gIHZvaWQgUmVtb3ZlQXQoc2l6ZV90IGluZGV4LCBzaXplX3QgbkNvdW50ID0gMSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgdm9pZCBSZW1vdmVBdChzaXplX3QgaW5kZXgpOwogICB2b2lkIENvbnZlcnRUb0luZGlyZWN0T2JqZWN0QXQoc2l6ZV90IGluZGV4LCBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBwRG9jKTsKIAogICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fT2JqZWN0cy5iZWdpbigpOyB9CkBAIC0xMTAsNyArMTEyLDcgQEAKICAgICAgIHN0ZDo6c2V0PGNvbnN0IENQREZfT2JqZWN0Kj4qIHBWaXNpdGVkKSBjb25zdCBvdmVycmlkZTsKIAogICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+PiBtX09iamVjdHM7Ci0gIENGWF9XZWFrUHRyPENGWF9CeXRlU3RyaW5nUG9vbD4gbV9wUG9vbDsKKyAgV2Vha1B0cjxCeXRlU3RyaW5nUG9vbD4gbV9wUG9vbDsKIH07CiAKIGlubGluZSBDUERGX0FycmF5KiBUb0FycmF5KENQREZfT2JqZWN0KiBvYmopIHsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheV91bml0dGVzdC5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXlfdW5pdHRlc3QuY3BwCmluZGV4IDQ2Nzc3MjguLjRjZTY2ZGMgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheV91bml0dGVzdC5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5X3VuaXR0ZXN0LmNwcApAQCAtMTQsNTIgKzE0LDU5IEBACiAKIFRFU1QoY3BkZl9hcnJheSwgUmVtb3ZlQXQpIHsKICAgewotICAgIGludCBlbGVtc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9BcnJheT4gYXJyKG5ldyBDUERGX0FycmF5KTsKKyAgICBjb25zdCBpbnQgZWxlbXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMH07CisgICAgYXV0byBhcnIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9BcnJheT4oKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShlbGVtcyk7ICsraSkKICAgICAgIGFyci0+QWRkTmV3PENQREZfTnVtYmVyPihlbGVtc1tpXSk7Ci0gICAgYXJyLT5SZW1vdmVBdCgzLCAzKTsKLSAgICBpbnQgZXhwZWN0ZWRbXSA9IHsxLCAyLCAzLCA3LCA4LCA5LCAxMH07Ci0gICAgRVhQRUNUX0VRKEZYX0FycmF5U2l6ZShleHBlY3RlZCksIGFyci0+R2V0Q291bnQoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAzOyArK2kpCisgICAgICBhcnItPlJlbW92ZUF0KDMpOworICAgIGNvbnN0IGludCBleHBlY3RlZFtdID0gezEsIDIsIDMsIDcsIDgsIDksIDEwfTsKKyAgICBBU1NFUlRfRVEoRlhfQXJyYXlTaXplKGV4cGVjdGVkKSwgYXJyLT5HZXRDb3VudCgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShleHBlY3RlZCk7ICsraSkKICAgICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSwgYXJyLT5HZXRJbnRlZ2VyQXQoaSkpOwotICAgIGFyci0+UmVtb3ZlQXQoNCwgMik7Ci0gICAgaW50IGV4cGVjdGVkMltdID0gezEsIDIsIDMsIDcsIDEwfTsKLSAgICBFWFBFQ1RfRVEoRlhfQXJyYXlTaXplKGV4cGVjdGVkMiksIGFyci0+R2V0Q291bnQoKSk7CisgICAgYXJyLT5SZW1vdmVBdCg0KTsKKyAgICBhcnItPlJlbW92ZUF0KDQpOworICAgIGNvbnN0IGludCBleHBlY3RlZDJbXSA9IHsxLCAyLCAzLCA3LCAxMH07CisgICAgQVNTRVJUX0VRKEZYX0FycmF5U2l6ZShleHBlY3RlZDIpLCBhcnItPkdldENvdW50KCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGV4cGVjdGVkMik7ICsraSkKICAgICAgIEVYUEVDVF9FUShleHBlY3RlZDJbaV0sIGFyci0+R2V0SW50ZWdlckF0KGkpKTsKICAgfQogICB7Ci0gICAgLy8gV2hlbiB0aGUgcmFuZ2UgaXMgb3V0IG9mIGJvdW5kLCBSZW1vdmVBdCBoYXMgbm8gZWZmZWN0LgotICAgIGludCBlbGVtc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9BcnJheT4gYXJyKG5ldyBDUERGX0FycmF5KTsKKyAgICAvLyBXaGVuIHRoZSByYW5nZSBpcyBvdXQgb2YgYm91bmQsIFJlbW92ZUF0KCkgaGFzIG5vIGVmZmVjdC4KKyAgICBjb25zdCBpbnQgZWxlbXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMH07CisgICAgYXV0byBhcnIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9BcnJheT4oKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShlbGVtcyk7ICsraSkKICAgICAgIGFyci0+QWRkTmV3PENQREZfTnVtYmVyPihlbGVtc1tpXSk7Ci0gICAgYXJyLT5SZW1vdmVBdCg4LCA1KTsKLSAgICBFWFBFQ1RfRVEoRlhfQXJyYXlTaXplKGVsZW1zKSwgYXJyLT5HZXRDb3VudCgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShlbGVtcyk7ICsraSkKLSAgICAgIEVYUEVDVF9FUShlbGVtc1tpXSwgYXJyLT5HZXRJbnRlZ2VyQXQoaSkpOwotICAgIGFyci0+UmVtb3ZlQXQoMCwgMTIpOwotICAgIEVYUEVDVF9FUShGWF9BcnJheVNpemUoZWxlbXMpLCBhcnItPkdldENvdW50KCkpOwotICAgIGFyci0+UmVtb3ZlQXQoMTEsIDEpOworICAgIGFyci0+UmVtb3ZlQXQoMTEpOwogICAgIEVYUEVDVF9FUShGWF9BcnJheVNpemUoZWxlbXMpLCBhcnItPkdldENvdW50KCkpOwogICB9CiB9CiAKK1RFU1QoY3BkZl9hcnJheSwgQ2xlYXIpIHsKKyAgY29uc3QgaW50IGVsZW1zW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTB9OworICBhdXRvIGFyciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0FycmF5PigpOworICBFWFBFQ1RfRVEoMFUsIGFyci0+R2V0Q291bnQoKSk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGVsZW1zKTsgKytpKQorICAgIGFyci0+QWRkTmV3PENQREZfTnVtYmVyPihlbGVtc1tpXSk7CisgIEVYUEVDVF9FUShGWF9BcnJheVNpemUoZWxlbXMpLCBhcnItPkdldENvdW50KCkpOworICBhcnItPkNsZWFyKCk7CisgIEVYUEVDVF9FUSgwVSwgYXJyLT5HZXRDb3VudCgpKTsKK30KKwogVEVTVChjcGRmX2FycmF5LCBJbnNlcnRBdCkgewogICB7Ci0gICAgaW50IGVsZW1zW10gPSB7MSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTB9OworICAgIGNvbnN0IGludCBlbGVtc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfTsKICAgICBhdXRvIGFyciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0FycmF5PigpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGVsZW1zKTsgKytpKQogICAgICAgYXJyLT5JbnNlcnROZXdBdDxDUERGX051bWJlcj4oaSwgZWxlbXNbaV0pOwotICAgIEVYUEVDVF9FUShGWF9BcnJheVNpemUoZWxlbXMpLCBhcnItPkdldENvdW50KCkpOworICAgIEFTU0VSVF9FUShGWF9BcnJheVNpemUoZWxlbXMpLCBhcnItPkdldENvdW50KCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGVsZW1zKTsgKytpKQogICAgICAgRVhQRUNUX0VRKGVsZW1zW2ldLCBhcnItPkdldEludGVnZXJBdChpKSk7CiAgICAgYXJyLT5JbnNlcnROZXdBdDxDUERGX051bWJlcj4oMywgMzMpOwogICAgIGFyci0+SW5zZXJ0TmV3QXQ8Q1BERl9OdW1iZXI+KDYsIDU1KTsKICAgICBhcnItPkluc2VydE5ld0F0PENQREZfTnVtYmVyPigxMiwgMTIpOwotICAgIGludCBleHBlY3RlZFtdID0gezEsIDIsIDMsIDMzLCA0LCA1LCA1NSwgNiwgNywgOCwgOSwgMTAsIDEyfTsKLSAgICBFWFBFQ1RfRVEoRlhfQXJyYXlTaXplKGV4cGVjdGVkKSwgYXJyLT5HZXRDb3VudCgpKTsKKyAgICBjb25zdCBpbnQgZXhwZWN0ZWRbXSA9IHsxLCAyLCAzLCAzMywgNCwgNSwgNTUsIDYsIDcsIDgsIDksIDEwLCAxMn07CisgICAgQVNTRVJUX0VRKEZYX0FycmF5U2l6ZShleHBlY3RlZCksIGFyci0+R2V0Q291bnQoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZXhwZWN0ZWQpOyArK2kpCiAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIGFyci0+R2V0SW50ZWdlckF0KGkpKTsKICAgfQpAQCAtNjcsMTIgKzc0LDEyIEBACiAgICAgLy8gV2hlbiB0aGUgcG9zaXRpb24gdG8gaW5zZXJ0IGlzIGJleW9uZCB0aGUgdXBwZXIgYm91bmQsCiAgICAgLy8gYW4gZWxlbWVudCBpcyBpbnNlcnRlZCBhdCB0aGF0IHBvc2l0aW9uIHdoaWxlIG90aGVyIHVuZmlsbGVkCiAgICAgLy8gcG9zaXRpb25zIGhhdmUgbnVsbHB0ci4KLSAgICBpbnQgZWxlbXNbXSA9IHsxLCAyfTsKKyAgICBjb25zdCBpbnQgZWxlbXNbXSA9IHsxLCAyfTsKICAgICBhdXRvIGFyciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0FycmF5PigpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGVsZW1zKTsgKytpKQogICAgICAgYXJyLT5JbnNlcnROZXdBdDxDUERGX051bWJlcj4oaSwgZWxlbXNbaV0pOwogICAgIGFyci0+SW5zZXJ0TmV3QXQ8Q1BERl9OdW1iZXI+KDEwLCAxMCk7Ci0gICAgRVhQRUNUX0VRKDExdSwgYXJyLT5HZXRDb3VudCgpKTsKKyAgICBBU1NFUlRfRVEoMTF1LCBhcnItPkdldENvdW50KCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGVsZW1zKTsgKytpKQogICAgICAgRVhQRUNUX0VRKGVsZW1zW2ldLCBhcnItPkdldEludGVnZXJBdChpKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IEZYX0FycmF5U2l6ZShlbGVtcyk7IGkgPCAxMDsgKytpKQpAQCAtODQsMTIgKzkxLDEyIEBACiBURVNUKGNwZGZfYXJyYXksIENsb25lKSB7CiAgIHsKICAgICAvLyBCYXNpYyBjYXNlLgotICAgIGludCBlbGVtc1tdID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfTsKKyAgICBjb25zdCBpbnQgZWxlbXNbXSA9IHsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMH07CiAgICAgYXV0byBhcnIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9BcnJheT4oKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShlbGVtcyk7ICsraSkKICAgICAgIGFyci0+SW5zZXJ0TmV3QXQ8Q1BERl9OdW1iZXI+KGksIGVsZW1zW2ldKTsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9BcnJheT4gYXJyMiA9IFRvQXJyYXkoYXJyLT5DbG9uZSgpKTsKLSAgICBFWFBFQ1RfRVEoYXJyLT5HZXRDb3VudCgpLCBhcnIyLT5HZXRDb3VudCgpKTsKKyAgICBBU1NFUlRfRVEoYXJyLT5HZXRDb3VudCgpLCBhcnIyLT5HZXRDb3VudCgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShlbGVtcyk7ICsraSkgewogICAgICAgLy8gQ2xvbmUoKSBhbHdheXMgY3JlYXRlIG5ldyBvYmplY3RzLgogICAgICAgRVhQRUNUX05FKGFyci0+R2V0T2JqZWN0QXQoaSksIGFycjItPkdldE9iamVjdEF0KGkpKTsKQEAgLTEwMCwxNiArMTA3LDE1IEBACiAgICAgLy8gQ2xvbmUoKSB3aXRoIGFuZCB3aXRob3V0IGRlcmVmZXJlbmNpbmcgcmVmZXJlbmNlIG9iamVjdHMuCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtT2ZSb3dzID0gMzsKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1PZlJvd0VsZW1zID0gNTsKLSAgICBpbnQgZWxlbXNba051bU9mUm93c11ba051bU9mUm93RWxlbXNdID0geworICAgIGNvbnN0IGludCBlbGVtc1trTnVtT2ZSb3dzXVtrTnVtT2ZSb3dFbGVtc10gPSB7CiAgICAgICAgIHsxLCAyLCAzLCA0LCA1fSwgezEwLCA5LCA4LCA3LCA2fSwgezExLCAxMiwgMTMsIDE0LCAxNX19OwotICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0FycmF5PiBhcnIobmV3IENQREZfQXJyYXkpOworICAgIGF1dG8gYXJyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfQXJyYXk+KCk7CiAgICAgLy8gSW5kaXJlY3QgcmVmZXJlbmNlcyB0byBpbmRpcmVjdCBvYmplY3RzLgotICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyPiBvYmpfaG9sZGVyKAotICAgICAgICBuZXcgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlcigpKTsKKyAgICBhdXRvIG9ial9ob2xkZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9JbmRpcmVjdE9iamVjdEhvbGRlcj4oKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1PZlJvd3M7ICsraSkgewogICAgICAgYXV0byBhcnJfZWxlbSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0FycmF5PigpOwogICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBrTnVtT2ZSb3dFbGVtczsgKytqKSB7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX051bWJlcj4gb2JqKG5ldyBDUERGX051bWJlcihlbGVtc1tpXVtqXSkpOworICAgICAgICBhdXRvIG9iaiA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX051bWJlcj4oZWxlbXNbaV1bal0pOwogICAgICAgICAvLyBTdGFydHMgb2JqZWN0IG51bWJlciBmcm9tIDEuCiAgICAgICAgIGludCBvYmpfbnVtID0gaSAqIGtOdW1PZlJvd0VsZW1zICsgaiArIDE7CiAgICAgICAgIG9ial9ob2xkZXItPlJlcGxhY2VJbmRpcmVjdE9iamVjdElmSGlnaGVyR2VuZXJhdGlvbihvYmpfbnVtLApAQCAtMTIyLDEwICsxMjgsMTAgQEAKICAgICAvLyBOb3QgZGVyZWZlcmVuY2luZyByZWZlcmVuY2Ugb2JqZWN0cyBtZWFucyBqdXN0IGNyZWF0aW5nIG5ldyByZWZlcmVuY2VzCiAgICAgLy8gaW5zdGVhZCBvZiBuZXcgY29waWVzIG9mIGRpcmVjdCBvYmplY3RzLgogICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0FycmF5PiBhcnIxID0gVG9BcnJheShhcnItPkNsb25lKCkpOwotICAgIEVYUEVDVF9FUShhcnItPkdldENvdW50KCksIGFycjEtPkdldENvdW50KCkpOworICAgIEFTU0VSVF9FUShhcnItPkdldENvdW50KCksIGFycjEtPkdldENvdW50KCkpOwogICAgIC8vIERlcmVmZXJlbmNpbmcgcmVmZXJlbmNlIG9iamVjdHMgY3JlYXRlcyBuZXcgY29waWVzIG9mIGRpcmVjdCBvYmplY3RzLgogICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0FycmF5PiBhcnIyID0gVG9BcnJheShhcnItPkNsb25lRGlyZWN0T2JqZWN0KCkpOwotICAgIEVYUEVDVF9FUShhcnItPkdldENvdW50KCksIGFycjItPkdldENvdW50KCkpOworICAgIEFTU0VSVF9FUShhcnItPkdldENvdW50KCksIGFycjItPkdldENvdW50KCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bU9mUm93czsgKytpKSB7CiAgICAgICBDUERGX0FycmF5KiBhcnJfZWxlbSA9IGFyci0+R2V0T2JqZWN0QXQoaSktPkFzQXJyYXkoKTsKICAgICAgIENQREZfQXJyYXkqIGFycjFfZWxlbSA9IGFycjEtPkdldE9iamVjdEF0KGkpLT5Bc0FycmF5KCk7CkBAIC0xMzMsOSArMTM5LDkgQEAKICAgICAgIEVYUEVDVF9ORShhcnJfZWxlbSwgYXJyMV9lbGVtKTsKICAgICAgIEVYUEVDVF9ORShhcnJfZWxlbSwgYXJyMl9lbGVtKTsKICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwga051bU9mUm93RWxlbXM7ICsraikgewotICAgICAgICBhdXRvIGVsZW1fb2JqID0gYXJyX2VsZW0tPkdldE9iamVjdEF0KGopOwotICAgICAgICBhdXRvIGVsZW1fb2JqMSA9IGFycjFfZWxlbS0+R2V0T2JqZWN0QXQoaik7Ci0gICAgICAgIGF1dG8gZWxlbV9vYmoyID0gYXJyMl9lbGVtLT5HZXRPYmplY3RBdChqKTsKKyAgICAgICAgYXV0byogZWxlbV9vYmogPSBhcnJfZWxlbS0+R2V0T2JqZWN0QXQoaik7CisgICAgICAgIGF1dG8qIGVsZW1fb2JqMSA9IGFycjFfZWxlbS0+R2V0T2JqZWN0QXQoaik7CisgICAgICAgIGF1dG8qIGVsZW1fb2JqMiA9IGFycjJfZWxlbS0+R2V0T2JqZWN0QXQoaik7CiAgICAgICAgIC8vIFJlc3VsdHMgZnJvbSBub3QgZGVmZXJlbmNpbmcgcmVmZXJlbmNlIG9iamVjdHMuCiAgICAgICAgIEVYUEVDVF9ORShlbGVtX29iaiwgZWxlbV9vYmoxKTsKICAgICAgICAgRVhQRUNUX1RSVUUoZWxlbV9vYmoxLT5Jc1JlZmVyZW5jZSgpKTsKQEAgLTE1NCw3ICsxNjAsNyBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bU9mUm93czsgKytpKSB7CiAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGtOdW1PZlJvd0VsZW1zOyArK2opIHsKICAgICAgICAgLy8gUmVzdWx0cyBmcm9tIG5vdCBkZWZlcmVuY2luZyByZWZlcmVuY2Ugb2JqZWN0cy4KLSAgICAgICAgYXV0byBlbGVtX29iajEgPSBhcnIxLT5HZXRPYmplY3RBdChpKS0+QXNBcnJheSgpLT5HZXRPYmplY3RBdChqKTsKKyAgICAgICAgYXV0byogZWxlbV9vYmoxID0gYXJyMS0+R2V0T2JqZWN0QXQoaSktPkFzQXJyYXkoKS0+R2V0T2JqZWN0QXQoaik7CiAgICAgICAgIEVYUEVDVF9UUlVFKGVsZW1fb2JqMS0+SXNSZWZlcmVuY2UoKSk7CiAgICAgICAgIEVYUEVDVF9FUShlbGVtc1tpXVtqXSwgZWxlbV9vYmoxLT5HZXRJbnRlZ2VyKCkpOwogICAgICAgICAvLyBSZXN1bHRzIGZyb20gZGVmZXJlbmNpbmcgcmVmZXJlbmNlIG9iamVjdHMuCkBAIC0xNjYsMTIgKzE3MiwxMyBAQAogfQogCiBURVNUKGNwZGZfYXJyYXksIEl0ZXJhdG9yKSB7Ci0gIGludCBlbGVtc1tdID0gey0yMywgLTExLCAgICAgMywgICAgICAgICA0NTUsICAgMjM0NTg3NywKLSAgICAgICAgICAgICAgICAgMCwgICA3ODk1MzMwLCAtMTI1NjQzMzQsIDEwMDAwLCAtMTAwMDAwfTsKLSAgc3RkOjp1bmlxdWVfcHRyPENQREZfQXJyYXk+IGFycihuZXcgQ1BERl9BcnJheSk7CisgIGNvbnN0IGludCBlbGVtc1tdID0gey0yMywgLTExLCAgICAgMywgICAgICAgICA0NTUsICAgMjM0NTg3NywKKyAgICAgICAgICAgICAgICAgICAgICAgMCwgICA3ODk1MzMwLCAtMTI1NjQzMzQsIDEwMDAwLCAtMTAwMDAwfTsKKyAgYXV0byBhcnIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9BcnJheT4oKTsKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZWxlbXMpOyArK2kpCiAgICAgYXJyLT5JbnNlcnROZXdBdDxDUERGX051bWJlcj4oaSwgZWxlbXNbaV0pOwogICBzaXplX3QgaW5kZXggPSAwOwogICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogKmFycikKICAgICBFWFBFQ1RfRVEoZWxlbXNbaW5kZXgrK10sIGl0LT5Bc051bWJlcigpLT5HZXRJbnRlZ2VyKCkpOworICBFWFBFQ1RfRVEoRlhfQXJyYXlTaXplKGVsZW1zKSwgaW5kZXgpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2Jvb2xlYW4uY3BwIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2Jvb2xlYW4uY3BwCmluZGV4IDAyMDRmZDkuLmExZGM0NTAgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9ib29sZWFuLmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYm9vbGVhbi5jcHAKQEAgLTUsNiArNSw3IEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2Jvb2xlYW4uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmVhbS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAogQ1BERl9Cb29sZWFuOjpDUERGX0Jvb2xlYW4oKSA6IG1fYlZhbHVlKGZhbHNlKSB7fQpAQCAtMjEsNyArMjIsNyBAQAogICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfQm9vbGVhbj4obV9iVmFsdWUpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUERGX0Jvb2xlYW46OkdldFN0cmluZygpIGNvbnN0IHsKK0J5dGVTdHJpbmcgQ1BERl9Cb29sZWFuOjpHZXRTdHJpbmcoKSBjb25zdCB7CiAgIHJldHVybiBtX2JWYWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSI7CiB9CiAKQEAgLTI5LDcgKzMwLDcgQEAKICAgcmV0dXJuIG1fYlZhbHVlOwogfQogCi12b2lkIENQREZfQm9vbGVhbjo6U2V0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpIHsKK3ZvaWQgQ1BERl9Cb29sZWFuOjpTZXRTdHJpbmcoY29uc3QgQnl0ZVN0cmluZyYgc3RyKSB7CiAgIG1fYlZhbHVlID0gKHN0ciA9PSAidHJ1ZSIpOwogfQogCkBAIC00NCwzICs0NSw4IEBACiBjb25zdCBDUERGX0Jvb2xlYW4qIENQREZfQm9vbGVhbjo6QXNCb29sZWFuKCkgY29uc3QgewogICByZXR1cm4gdGhpczsKIH0KKworYm9vbCBDUERGX0Jvb2xlYW46OldyaXRlVG8oSUZYX0FyY2hpdmVTdHJlYW0qIGFyY2hpdmUpIGNvbnN0IHsKKyAgcmV0dXJuIGFyY2hpdmUtPldyaXRlU3RyaW5nKCIgIikgJiYKKyAgICAgICAgIGFyY2hpdmUtPldyaXRlU3RyaW5nKEdldFN0cmluZygpLkFzU3RyaW5nVmlldygpKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9ib29sZWFuLmggYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYm9vbGVhbi5oCmluZGV4IGFmZWJjMjkuLmMwYTY5ZDggMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9ib29sZWFuLmgKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2Jvb2xlYW4uaApAQCAtMjIsMTIgKzIyLDEzIEBACiAgIC8vIENQREZfT2JqZWN0OgogICBUeXBlIEdldFR5cGUoKSBjb25zdCBvdmVycmlkZTsKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBDbG9uZSgpIGNvbnN0IG92ZXJyaWRlOwotICBDRlhfQnl0ZVN0cmluZyBHZXRTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgQnl0ZVN0cmluZyBHZXRTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKICAgaW50IEdldEludGVnZXIoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBTZXRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikgb3ZlcnJpZGU7CisgIHZvaWQgU2V0U3RyaW5nKGNvbnN0IEJ5dGVTdHJpbmcmIHN0cikgb3ZlcnJpZGU7CiAgIGJvb2wgSXNCb29sZWFuKCkgY29uc3Qgb3ZlcnJpZGU7CiAgIENQREZfQm9vbGVhbiogQXNCb29sZWFuKCkgb3ZlcnJpZGU7CiAgIGNvbnN0IENQREZfQm9vbGVhbiogQXNCb29sZWFuKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgV3JpdGVUbyhJRlhfQXJjaGl2ZVN0cmVhbSogYXJjaGl2ZSkgY29uc3Qgb3ZlcnJpZGU7CiAKICBwcm90ZWN0ZWQ6CiAgIGJvb2wgbV9iVmFsdWU7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfY3Jvc3NfcmVmX2F2YWlsLmNwcCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9jcm9zc19yZWZfYXZhaWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlOTgxOGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfY3Jvc3NfcmVmX2F2YWlsLmNwcApAQCAtMCwwICsxLDIxMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2Nyb3NzX3JlZl9hdmFpbC5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX25hbWUuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVhZF92YWxpZGF0b3IuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVmZXJlbmNlLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N5bnRheF9wYXJzZXIuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2ZwZGZfcGFyc2VyX3V0aWxpdHkuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIga0Nyb3NzUmVmS2V5d29yZFtdID0gInhyZWYiOworY29uc3RleHByIGNoYXIga1RyYWlsZXJLZXl3b3JkW10gPSAidHJhaWxlciI7Citjb25zdGV4cHIgY2hhciBrUHJldkNyb3NzUmVmRmllbGRLZXlbXSA9ICJQcmV2IjsKK2NvbnN0ZXhwciBjaGFyIGtUeXBlRmllbGRLZXlbXSA9ICJUeXBlIjsKK2NvbnN0ZXhwciBjaGFyIGtQcmV2Q3Jvc3NSZWZTdHJlYW1PZmZzZXRGaWVsZEtleVtdID0gIlhSZWZTdG0iOworY29uc3RleHByIGNoYXIga1hSZWZLZXl3b3JkW10gPSAiWFJlZiI7Citjb25zdGV4cHIgY2hhciBrRW5jcnlwdEtleVtdID0gIkVuY3J5cHQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1BERl9Dcm9zc1JlZkF2YWlsOjpDUERGX0Nyb3NzUmVmQXZhaWwoQ1BERl9TeW50YXhQYXJzZXIqIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIGxhc3RfY3Jvc3NyZWZfb2Zmc2V0KQorICAgIDogcGFyc2VyXyhwYXJzZXIpLCBsYXN0X2Nyb3NzcmVmX29mZnNldF8obGFzdF9jcm9zc3JlZl9vZmZzZXQpIHsKKyAgQVNTRVJUKHBhcnNlcl8pOworICBBZGRDcm9zc1JlZkZvckNoZWNrKGxhc3RfY3Jvc3NyZWZfb2Zmc2V0KTsKK30KKworQ1BERl9Dcm9zc1JlZkF2YWlsOjp+Q1BERl9Dcm9zc1JlZkF2YWlsKCkge30KKworQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzIENQREZfQ3Jvc3NSZWZBdmFpbDo6Q2hlY2tBdmFpbCgpIHsKKyAgaWYgKGN1cnJlbnRfc3RhdHVzXyA9PSBDUERGX0RhdGFBdmFpbDo6RGF0YUF2YWlsYWJsZSkKKyAgICByZXR1cm4gQ1BERl9EYXRhQXZhaWw6OkRhdGFBdmFpbGFibGU7CisKKyAgY29uc3QgQ1BERl9SZWFkVmFsaWRhdG9yOjpTZXNzaW9uIHJlYWRfc2Vzc2lvbihHZXRWYWxpZGF0b3IoKS5HZXQoKSk7CisgIHdoaWxlICh0cnVlKSB7CisgICAgYm9vbCBjaGVja19yZXN1bHQgPSBmYWxzZTsKKyAgICBzd2l0Y2ggKGN1cnJlbnRfc3RhdGVfKSB7CisgICAgICBjYXNlIFN0YXRlOjprQ3Jvc3NSZWZDaGVjazoKKyAgICAgICAgY2hlY2tfcmVzdWx0ID0gQ2hlY2tDcm9zc1JlZigpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU3RhdGU6OmtDcm9zc1JlZlY0SXRlbUNoZWNrOgorICAgICAgICBjaGVja19yZXN1bHQgPSBDaGVja0Nyb3NzUmVmVjRJdGVtKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTdGF0ZTo6a0Nyb3NzUmVmVjRUcmFpbGVyQ2hlY2s6CisgICAgICAgIGNoZWNrX3Jlc3VsdCA9IENoZWNrQ3Jvc3NSZWZWNFRyYWlsZXIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFN0YXRlOjprRG9uZToKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiB7CisgICAgICAgIGN1cnJlbnRfc3RhdHVzXyA9IENQREZfRGF0YUF2YWlsOjpEYXRhRXJyb3I7CisgICAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmICghY2hlY2tfcmVzdWx0KQorICAgICAgYnJlYWs7CisKKyAgICBBU1NFUlQoIUdldFZhbGlkYXRvcigpLT5oYXNfcmVhZF9wcm9ibGVtcygpKTsKKyAgfQorICByZXR1cm4gY3VycmVudF9zdGF0dXNfOworfQorCitib29sIENQREZfQ3Jvc3NSZWZBdmFpbDo6Q2hlY2tSZWFkUHJvYmxlbXMoKSB7CisgIGlmIChHZXRWYWxpZGF0b3IoKS0+cmVhZF9lcnJvcigpKSB7CisgICAgY3VycmVudF9zdGF0dXNfID0gQ1BERl9EYXRhQXZhaWw6OkRhdGFFcnJvcjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gR2V0VmFsaWRhdG9yKCktPmhhc191bmF2YWlsYWJsZV9kYXRhKCk7Cit9CisKK2Jvb2wgQ1BERl9Dcm9zc1JlZkF2YWlsOjpDaGVja0Nyb3NzUmVmKCkgeworICBpZiAoY3Jvc3NfcmVmc19mb3JfY2hlY2tfLmVtcHR5KCkpIHsKKyAgICAvLyBBbGwgY3Jvc3MgcmVmcyB3ZXJlIGNoZWNrZWQuCisgICAgY3VycmVudF9zdGF0ZV8gPSBTdGF0ZTo6a0RvbmU7CisgICAgY3VycmVudF9zdGF0dXNfID0gQ1BERl9EYXRhQXZhaWw6OkRhdGFBdmFpbGFibGU7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcGFyc2VyXy0+U2V0UG9zKGNyb3NzX3JlZnNfZm9yX2NoZWNrXy5mcm9udCgpKTsKKworICBjb25zdCBCeXRlU3RyaW5nIGZpcnN0X3dvcmQgPSBwYXJzZXJfLT5QZWVrTmV4dFdvcmQobnVsbHB0cik7CisgIGlmIChDaGVja1JlYWRQcm9ibGVtcygpKQorICAgIHJldHVybiBmYWxzZTsKKworICBjb25zdCBib29sIHJlc3VsdCA9IChmaXJzdF93b3JkID09IGtDcm9zc1JlZktleXdvcmQpID8gQ2hlY2tDcm9zc1JlZlY0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENoZWNrQ3Jvc3NSZWZTdHJlYW0oKTsKKworICBpZiAocmVzdWx0KQorICAgIGNyb3NzX3JlZnNfZm9yX2NoZWNrXy5wb3AoKTsKKworICByZXR1cm4gcmVzdWx0OworfQorCitib29sIENQREZfQ3Jvc3NSZWZBdmFpbDo6Q2hlY2tDcm9zc1JlZlY0KCkgeworICBjb25zdCBCeXRlU3RyaW5nIGtleXdvcmQgPSBwYXJzZXJfLT5HZXRLZXl3b3JkKCk7CisgIGlmIChDaGVja1JlYWRQcm9ibGVtcygpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoa2V5d29yZCAhPSBrQ3Jvc3NSZWZLZXl3b3JkKSB7CisgICAgY3VycmVudF9zdGF0dXNfID0gQ1BERl9EYXRhQXZhaWw6OkRhdGFFcnJvcjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjdXJyZW50X3N0YXRlXyA9IFN0YXRlOjprQ3Jvc3NSZWZWNEl0ZW1DaGVjazsKKyAgY3VycmVudF9vZmZzZXRfID0gcGFyc2VyXy0+R2V0UG9zKCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENQREZfQ3Jvc3NSZWZBdmFpbDo6Q2hlY2tDcm9zc1JlZlY0SXRlbSgpIHsKKyAgcGFyc2VyXy0+U2V0UG9zKGN1cnJlbnRfb2Zmc2V0Xyk7CisgIGNvbnN0IEJ5dGVTdHJpbmcga2V5d29yZCA9IHBhcnNlcl8tPkdldEtleXdvcmQoKTsKKyAgaWYgKENoZWNrUmVhZFByb2JsZW1zKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChrZXl3b3JkLklzRW1wdHkoKSkgeworICAgIGN1cnJlbnRfc3RhdHVzXyA9IENQREZfRGF0YUF2YWlsOjpEYXRhRXJyb3I7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKGtleXdvcmQgPT0ga1RyYWlsZXJLZXl3b3JkKQorICAgIGN1cnJlbnRfc3RhdGVfID0gU3RhdGU6OmtDcm9zc1JlZlY0VHJhaWxlckNoZWNrOworCisgIC8vIEdvIHRvIG5leHQgaXRlbS4KKyAgY3VycmVudF9vZmZzZXRfID0gcGFyc2VyXy0+R2V0UG9zKCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENQREZfQ3Jvc3NSZWZBdmFpbDo6Q2hlY2tDcm9zc1JlZlY0VHJhaWxlcigpIHsKKyAgcGFyc2VyXy0+U2V0UG9zKGN1cnJlbnRfb2Zmc2V0Xyk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeT4gdHJhaWxlciA9CisgICAgICBUb0RpY3Rpb25hcnkocGFyc2VyXy0+R2V0T2JqZWN0Qm9keShudWxscHRyKSk7CisgIGlmIChDaGVja1JlYWRQcm9ibGVtcygpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoIXRyYWlsZXIpIHsKKyAgICBjdXJyZW50X3N0YXR1c18gPSBDUERGX0RhdGFBdmFpbDo6RGF0YUVycm9yOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChUb1JlZmVyZW5jZSh0cmFpbGVyLT5HZXRPYmplY3RGb3Ioa0VuY3J5cHRLZXkpKSkgeworICAgIGN1cnJlbnRfc3RhdHVzXyA9IENQREZfRGF0YUF2YWlsOjpEYXRhRXJyb3I7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgY29uc3QgaW50MzJfdCB4cmVmcG9zID0KKyAgICAgIEdldERpcmVjdEludGVnZXIodHJhaWxlci5nZXQoKSwga1ByZXZDcm9zc1JlZkZpZWxkS2V5KTsKKyAgaWYgKHhyZWZwb3MgJiYKKyAgICAgIHBkZml1bTo6YmFzZTo6SXNWYWx1ZUluUmFuZ2VGb3JOdW1lcmljVHlwZTxGWF9GSUxFU0laRT4oeHJlZnBvcykpCisgICAgQWRkQ3Jvc3NSZWZGb3JDaGVjayhzdGF0aWNfY2FzdDxGWF9GSUxFU0laRT4oeHJlZnBvcykpOworCisgIGNvbnN0IGludDMyX3Qgc3RyZWFtX3hyZWZfb2Zmc2V0ID0KKyAgICAgIEdldERpcmVjdEludGVnZXIodHJhaWxlci5nZXQoKSwga1ByZXZDcm9zc1JlZlN0cmVhbU9mZnNldEZpZWxkS2V5KTsKKyAgaWYgKHN0cmVhbV94cmVmX29mZnNldCAmJgorICAgICAgcGRmaXVtOjpiYXNlOjpJc1ZhbHVlSW5SYW5nZUZvck51bWVyaWNUeXBlPEZYX0ZJTEVTSVpFPigKKyAgICAgICAgICBzdHJlYW1feHJlZl9vZmZzZXQpKQorICAgIEFkZENyb3NzUmVmRm9yQ2hlY2soc3RhdGljX2Nhc3Q8RlhfRklMRVNJWkU+KHN0cmVhbV94cmVmX29mZnNldCkpOworCisgIC8vIEdvdG8gY2hlY2sgbmV4dCBjcm9zc3JlZgorICBjdXJyZW50X3N0YXRlXyA9IFN0YXRlOjprQ3Jvc3NSZWZDaGVjazsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1BERl9Dcm9zc1JlZkF2YWlsOjpDaGVja0Nyb3NzUmVmU3RyZWFtKCkgeworICBhdXRvIGNyb3NzX3JlZiA9CisgICAgICBwYXJzZXJfLT5HZXRJbmRpcmVjdE9iamVjdChudWxscHRyLCBDUERGX1N5bnRheFBhcnNlcjo6UGFyc2VUeXBlOjprTG9vc2UpOworICBpZiAoQ2hlY2tSZWFkUHJvYmxlbXMoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiB0cmFpbGVyID0KKyAgICAgIGNyb3NzX3JlZiAmJiBjcm9zc19yZWYtPklzU3RyZWFtKCkgPyBjcm9zc19yZWYtPkdldERpY3QoKSA6IG51bGxwdHI7CisgIGlmICghdHJhaWxlcikgeworICAgIGN1cnJlbnRfc3RhdHVzXyA9IENQREZfRGF0YUF2YWlsOjpEYXRhRXJyb3I7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKFRvUmVmZXJlbmNlKHRyYWlsZXItPkdldE9iamVjdEZvcihrRW5jcnlwdEtleSkpKSB7CisgICAgY3VycmVudF9zdGF0dXNfID0gQ1BERl9EYXRhQXZhaWw6OkRhdGFFcnJvcjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBDUERGX05hbWUqIHR5cGVfbmFtZSA9IFRvTmFtZSh0cmFpbGVyLT5HZXRPYmplY3RGb3Ioa1R5cGVGaWVsZEtleSkpOworICBpZiAodHlwZV9uYW1lICYmIHR5cGVfbmFtZS0+R2V0U3RyaW5nKCkgPT0ga1hSZWZLZXl3b3JkKSB7CisgICAgY29uc3QgaW50MzJfdCB4cmVmcG9zID0gdHJhaWxlci0+R2V0SW50ZWdlckZvcihrUHJldkNyb3NzUmVmRmllbGRLZXkpOworICAgIGlmICh4cmVmcG9zICYmCisgICAgICAgIHBkZml1bTo6YmFzZTo6SXNWYWx1ZUluUmFuZ2VGb3JOdW1lcmljVHlwZTxGWF9GSUxFU0laRT4oeHJlZnBvcykpCisgICAgICBBZGRDcm9zc1JlZkZvckNoZWNrKHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPih4cmVmcG9zKSk7CisgIH0KKyAgLy8gR290byBjaGVjayBuZXh0IGNyb3NzcmVmCisgIGN1cnJlbnRfc3RhdGVfID0gU3RhdGU6OmtDcm9zc1JlZkNoZWNrOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDUERGX0Nyb3NzUmVmQXZhaWw6OkFkZENyb3NzUmVmRm9yQ2hlY2soRlhfRklMRVNJWkUgY3Jvc3NyZWZfb2Zmc2V0KSB7CisgIGlmIChyZWdpc3RlcmVkX2Nyb3NzcmVmc18uY291bnQoY3Jvc3NyZWZfb2Zmc2V0KSkKKyAgICByZXR1cm47CisKKyAgY3Jvc3NfcmVmc19mb3JfY2hlY2tfLnB1c2goY3Jvc3NyZWZfb2Zmc2V0KTsKKyAgcmVnaXN0ZXJlZF9jcm9zc3JlZnNfLmluc2VydChjcm9zc3JlZl9vZmZzZXQpOworfQorCitmeGNydDo6UmV0YWluUHRyPENQREZfUmVhZFZhbGlkYXRvcj4gQ1BERl9Dcm9zc1JlZkF2YWlsOjpHZXRWYWxpZGF0b3IoKSB7CisgIHJldHVybiBwYXJzZXJfLT5HZXRWYWxpZGF0b3IoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9jcm9zc19yZWZfYXZhaWwuaCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9jcm9zc19yZWZfYXZhaWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWQ1OGYzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2Nyb3NzX3JlZl9hdmFpbC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBDT1JFX0ZQREZBUElfUEFSU0VSX0NQREZfQ1JPU1NfUkVGX0FWQUlMX0hfCisjZGVmaW5lIENPUkVfRlBERkFQSV9QQVJTRVJfQ1BERl9DUk9TU19SRUZfQVZBSUxfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGF0YV9hdmFpbC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKKworY2xhc3MgQ1BERl9TeW50YXhQYXJzZXI7CisKK2NsYXNzIENQREZfQ3Jvc3NSZWZBdmFpbCB7CisgcHVibGljOgorICBDUERGX0Nyb3NzUmVmQXZhaWwoQ1BERl9TeW50YXhQYXJzZXIqIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIGxhc3RfY3Jvc3NyZWZfb2Zmc2V0KTsKKyAgfkNQREZfQ3Jvc3NSZWZBdmFpbCgpOworCisgIEZYX0ZJTEVTSVpFIGxhc3RfY3Jvc3NyZWZfb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbGFzdF9jcm9zc3JlZl9vZmZzZXRfOyB9CisKKyAgQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzIENoZWNrQXZhaWwoKTsKKworIHByaXZhdGU6CisgIGVudW0gY2xhc3MgU3RhdGUgeworICAgIGtDcm9zc1JlZkNoZWNrLAorICAgIGtDcm9zc1JlZlY0SXRlbUNoZWNrLAorICAgIGtDcm9zc1JlZlY0VHJhaWxlckNoZWNrLAorICAgIGtEb25lLAorICB9OworCisgIGJvb2wgQ2hlY2tSZWFkUHJvYmxlbXMoKTsKKyAgYm9vbCBDaGVja0Nyb3NzUmVmKCk7CisgIGJvb2wgQ2hlY2tDcm9zc1JlZlY0KCk7CisgIGJvb2wgQ2hlY2tDcm9zc1JlZlY0SXRlbSgpOworICBib29sIENoZWNrQ3Jvc3NSZWZWNFRyYWlsZXIoKTsKKyAgYm9vbCBDaGVja0Nyb3NzUmVmU3RyZWFtKCk7CisKKyAgdm9pZCBBZGRDcm9zc1JlZkZvckNoZWNrKEZYX0ZJTEVTSVpFIGNyb3NzcmVmX29mZnNldCk7CisKKyAgZnhjcnQ6OlJldGFpblB0cjxDUERGX1JlYWRWYWxpZGF0b3I+IEdldFZhbGlkYXRvcigpOworCisgIGZ4Y3J0OjpVbm93bmVkUHRyPENQREZfU3ludGF4UGFyc2VyPiBwYXJzZXJfOworICBjb25zdCBGWF9GSUxFU0laRSBsYXN0X2Nyb3NzcmVmX29mZnNldF8gPSAwOworICBDUERGX0RhdGFBdmFpbDo6RG9jQXZhaWxTdGF0dXMgY3VycmVudF9zdGF0dXNfID0KKyAgICAgIENQREZfRGF0YUF2YWlsOjpEYXRhTm90QXZhaWxhYmxlOworICBTdGF0ZSBjdXJyZW50X3N0YXRlXyA9IFN0YXRlOjprQ3Jvc3NSZWZDaGVjazsKKyAgRlhfRklMRVNJWkUgY3VycmVudF9vZmZzZXRfID0gMDsKKyAgc3RkOjpxdWV1ZTxGWF9GSUxFU0laRT4gY3Jvc3NfcmVmc19mb3JfY2hlY2tfOworICBzdGQ6OnNldDxGWF9GSUxFU0laRT4gcmVnaXN0ZXJlZF9jcm9zc3JlZnNfOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfUEFSU0VSX0NQREZfQ1JPU1NfUkVGX0FWQUlMX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfY3Jvc3NfcmVmX2F2YWlsX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9jcm9zc19yZWZfYXZhaWxfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OThlMTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfY3Jvc3NfcmVmX2F2YWlsX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDMzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2Nyb3NzX3JlZl9hdmFpbC5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zeW50YXhfcGFyc2VyLmgiCisjaW5jbHVkZSAidGVzdGluZy9meF9zdHJpbmdfdGVzdGhlbHBlcnMuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK3N0ZDo6dW5pcXVlX3B0cjxDUERGX1N5bnRheFBhcnNlcj4gTWFrZVBhcnNlckZvckJ1ZmZlcigKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBidWZmZXIsCisgICAgc2l6ZV90IGJ1ZmZlcl9zaXplKSB7CisgIGF1dG8gcGFyc2VyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU3ludGF4UGFyc2VyPigpOworICBwYXJzZXItPkluaXRQYXJzZXIoCisgICAgICBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0J1ZmZlclNlZWthYmxlUmVhZFN0cmVhbT4oYnVmZmVyLCBidWZmZXJfc2l6ZSksIDApOworICByZXR1cm4gcGFyc2VyOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVChDUERGX0Nyb3NzUmVmQXZhaWxUZXN0LCBDaGVja0Nyb3NzUmVmVjQpIHsKKyAgY29uc3QgdW5zaWduZWQgY2hhciB4cmVmX3RhYmxlW10gPQorICAgICAgInhyZWYgXG4iCisgICAgICAiMCA2IFxuIgorICAgICAgIjAwMDAwMDAwMDMgNjU1MzUgZiBcbiIKKyAgICAgICIwMDAwMDAwMDE3IDAwMDAwIG4gXG4iCisgICAgICAiMDAwMDAwMDA4MSAwMDAwMCBuIFxuIgorICAgICAgIjAwMDAwMDAwMDAgMDAwMDcgZiBcbiIKKyAgICAgICIwMDAwMDAwMzMxIDAwMDAwIG4gXG4iCisgICAgICAiMDAwMDAwMDQwOSAwMDAwMCBuIFxuIgorICAgICAgInRyYWlsZXJcbiIKKyAgICAgICI8PC9Sb290IDE0IDAgUi9JRCAiCisgICAgICAiWzxhZmJiMGY1OTNjMmQyYWVhNWI1MTljYjYxZGExYzE3Yj48NGY5YmIyZTc5Nzg0MDE4MDhmOGYxZjJhNzVjMzIyYzg+XSIKKyAgICAgICIvSW5mbyAxNSAwIFIvU2l6ZSAxNj4+IjsKKyAgY29uc3QgRlhfRklMRVNJWkUgbGFzdF9jcm9zc3JlZl9vZmZzZXQgPSAwOworCisgIGF1dG8gcGFyc2VyID0gTWFrZVBhcnNlckZvckJ1ZmZlcih4cmVmX3RhYmxlLCBGWF9BcnJheVNpemUoeHJlZl90YWJsZSkpOworICBhdXRvIGNyb3NzX3JlZl9hdmFpbCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0Nyb3NzUmVmQXZhaWw+KAorICAgICAgcGFyc2VyLmdldCgpLCBsYXN0X2Nyb3NzcmVmX29mZnNldCk7CisKKyAgRVhQRUNUX0VRKENQREZfRGF0YUF2YWlsOjpEYXRhQXZhaWxhYmxlLCBjcm9zc19yZWZfYXZhaWwtPkNoZWNrQXZhaWwoKSk7Cit9CisKK1RFU1QoQ1BERl9Dcm9zc1JlZkF2YWlsVGVzdCwgQ2hlY2tDcm9zc1JlZlN0cmVhbSkgeworICBjb25zdCB1bnNpZ25lZCBjaGFyIHhyZWZfc3RyZWFtW10gPQorICAgICAgIjE2IDAgb2JqXG4iCisgICAgICAiPDwvRmlsdGVyIC9GbGF0ZURlY29kZT4+IgorICAgICAgIiBzdHJlYW0gXG4iCisgICAgICAiU1RSRUFNIERBVEEgU1RSRUFNIERBVEEgU1RSRUFNIERBVEFcbiIKKyAgICAgICJlbmRzdHJlYW1cbiIKKyAgICAgICJlbmRvYmpcbiI7CisgIGNvbnN0IEZYX0ZJTEVTSVpFIGxhc3RfY3Jvc3NyZWZfb2Zmc2V0ID0gMDsKKworICBhdXRvIHBhcnNlciA9IE1ha2VQYXJzZXJGb3JCdWZmZXIoeHJlZl9zdHJlYW0sIEZYX0FycmF5U2l6ZSh4cmVmX3N0cmVhbSkpOworICBhdXRvIGNyb3NzX3JlZl9hdmFpbCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0Nyb3NzUmVmQXZhaWw+KAorICAgICAgcGFyc2VyLmdldCgpLCBsYXN0X2Nyb3NzcmVmX29mZnNldCk7CisKKyAgRVhQRUNUX0VRKENQREZfRGF0YUF2YWlsOjpEYXRhQXZhaWxhYmxlLCBjcm9zc19yZWZfYXZhaWwtPkNoZWNrQXZhaWwoKSk7Cit9CisKK1RFU1QoQ1BERl9Dcm9zc1JlZkF2YWlsVGVzdCwgSW5jb3JyZWN0U3RhcnRPZmZzZXQpIHsKKyAgY29uc3QgdW5zaWduZWQgY2hhciB4cmVmX3N0cmVhbVtdID0KKyAgICAgICIxNiAwIG9ialxuIgorICAgICAgIjw8L0ZpbHRlciAvRmxhdGVEZWNvZGU+PiIKKyAgICAgICIgc3RyZWFtIFxuIgorICAgICAgIlNUUkVBTSBEQVRBIFNUUkVBTSBEQVRBIFNUUkVBTSBEQVRBXG4iCisgICAgICAiZW5kc3RyZWFtXG4iCisgICAgICAiZW5kb2JqXG4iOworCisgIGNvbnN0IEZYX0ZJTEVTSVpFIGxhc3RfY3Jvc3NyZWZfb2Zmc2V0ID0gNzAwMDA7CisKKyAgYXV0byBwYXJzZXIgPSBNYWtlUGFyc2VyRm9yQnVmZmVyKHhyZWZfc3RyZWFtLCBGWF9BcnJheVNpemUoeHJlZl9zdHJlYW0pKTsKKyAgYXV0byBjcm9zc19yZWZfYXZhaWwgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9Dcm9zc1JlZkF2YWlsPigKKyAgICAgIHBhcnNlci5nZXQoKSwgbGFzdF9jcm9zc3JlZl9vZmZzZXQpOworCisgIEVYUEVDVF9FUShDUERGX0RhdGFBdmFpbDo6RGF0YUVycm9yLCBjcm9zc19yZWZfYXZhaWwtPkNoZWNrQXZhaWwoKSk7Cit9CisKK1RFU1QoQ1BERl9Dcm9zc1JlZkF2YWlsVGVzdCwgSW5jb3JyZWN0UHJldk9mZnNldCkgeworICBjb25zdCB1bnNpZ25lZCBjaGFyIHhyZWZfc3RyZWFtW10gPQorICAgICAgIjE2IDAgb2JqXG4iCisgICAgICAiPDwvVHlwZSAvWFJlZiAvUHJldiA3MDAwMD4+IgorICAgICAgIiBzdHJlYW0gXG4iCisgICAgICAiU1RSRUFNIERBVEEgU1RSRUFNIERBVEEgU1RSRUFNIERBVEFcbiIKKyAgICAgICJlbmRzdHJlYW1cbiIKKyAgICAgICJlbmRvYmpcbiI7CisgIGNvbnN0IEZYX0ZJTEVTSVpFIGxhc3RfY3Jvc3NyZWZfb2Zmc2V0ID0gMDsKKworICBhdXRvIHBhcnNlciA9IE1ha2VQYXJzZXJGb3JCdWZmZXIoeHJlZl9zdHJlYW0sIEZYX0FycmF5U2l6ZSh4cmVmX3N0cmVhbSkpOworICBhdXRvIGNyb3NzX3JlZl9hdmFpbCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0Nyb3NzUmVmQXZhaWw+KAorICAgICAgcGFyc2VyLmdldCgpLCBsYXN0X2Nyb3NzcmVmX29mZnNldCk7CisgIEVYUEVDVF9FUShDUERGX0RhdGFBdmFpbDo6RGF0YUVycm9yLCBjcm9zc19yZWZfYXZhaWwtPkNoZWNrQXZhaWwoKSk7Cit9CisKK1RFU1QoQ1BERl9Dcm9zc1JlZkF2YWlsVGVzdCwgSW5jb3JyZWN0UHJldlN0cmVhbU9mZnNldCkgeworICBjb25zdCB1bnNpZ25lZCBjaGFyIHhyZWZfdGFibGVbXSA9CisgICAgICAieHJlZiBcbiIKKyAgICAgICIwIDYgXG4iCisgICAgICAiMDAwMDAwMDAwMyA2NTUzNSBmIFxuIgorICAgICAgIjAwMDAwMDAwMTcgMDAwMDAgbiBcbiIKKyAgICAgICIwMDAwMDAwMDgxIDAwMDAwIG4gXG4iCisgICAgICAiMDAwMDAwMDAwMCAwMDAwNyBmIFxuIgorICAgICAgIjAwMDAwMDAzMzEgMDAwMDAgbiBcbiIKKyAgICAgICIwMDAwMDAwNDA5IDAwMDAwIG4gXG4iCisgICAgICAidHJhaWxlclxuIgorICAgICAgIjw8L1Jvb3QgMTQgMCBSL0lEICIKKyAgICAgICJbPGFmYmIwZjU5M2MyZDJhZWE1YjUxOWNiNjFkYTFjMTdiPjw0ZjliYjJlNzk3ODQwMTgwOGY4ZjFmMmE3NWMzMjJjOD5dIgorICAgICAgIi9JbmZvIDE1IDAgUi9TaXplIDE2IC9YUmVmU3RtIDcwMDAwPj4iOworICBjb25zdCBGWF9GSUxFU0laRSBsYXN0X2Nyb3NzcmVmX29mZnNldCA9IDA7CisKKyAgYXV0byBwYXJzZXIgPSBNYWtlUGFyc2VyRm9yQnVmZmVyKHhyZWZfdGFibGUsIEZYX0FycmF5U2l6ZSh4cmVmX3RhYmxlKSk7CisgIGF1dG8gY3Jvc3NfcmVmX2F2YWlsID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfQ3Jvc3NSZWZBdmFpbD4oCisgICAgICBwYXJzZXIuZ2V0KCksIGxhc3RfY3Jvc3NyZWZfb2Zmc2V0KTsKKyAgRVhQRUNUX0VRKENQREZfRGF0YUF2YWlsOjpEYXRhRXJyb3IsIGNyb3NzX3JlZl9hdmFpbC0+Q2hlY2tBdmFpbCgpKTsKK30KKworVEVTVChDUERGX0Nyb3NzUmVmQXZhaWxUZXN0LCBJbmNvcnJlY3REYXRhKSB7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW5jb3JyZWN0X2RhdGFbXSA9CisgICAgICAiZmlhamFvaWxmIHc5aWZhb2lod29pYWZoamEgd2ZpamFvZmlqb2lhdyBmaGogb2lhd2hmb2lhaCAiCisgICAgICAid2ZvaWhvaXdmZ2hvdWlhZmdod29pZ2FoZmkiOworICBjb25zdCBGWF9GSUxFU0laRSBsYXN0X2Nyb3NzcmVmX29mZnNldCA9IDA7CisKKyAgYXV0byBwYXJzZXIgPQorICAgICAgTWFrZVBhcnNlckZvckJ1ZmZlcihpbmNvcnJlY3RfZGF0YSwgRlhfQXJyYXlTaXplKGluY29ycmVjdF9kYXRhKSk7CisgIGF1dG8gY3Jvc3NfcmVmX2F2YWlsID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfQ3Jvc3NSZWZBdmFpbD4oCisgICAgICBwYXJzZXIuZ2V0KCksIGxhc3RfY3Jvc3NyZWZfb2Zmc2V0KTsKKyAgRVhQRUNUX0VRKENQREZfRGF0YUF2YWlsOjpEYXRhRXJyb3IsIGNyb3NzX3JlZl9hdmFpbC0+Q2hlY2tBdmFpbCgpKTsKK30KKworVEVTVChDUERGX0Nyb3NzUmVmQXZhaWxUZXN0LCBUaHJlZUNyb3NzUmVmVjQpIHsKKyAgY2hhciBpbnRfYnVmZmVyWzEwMF07CisgIGludCBwcmV2X29mZnNldCA9IDA7CisgIGludCBjdXJfb2Zmc2V0ID0gMDsKKyAgc3RkOjpzdHJpbmcgdGFibGUgPSAicGRmIGJsYWggYmxhaCBibGFoXG4iOworICBwcmV2X29mZnNldCA9IGN1cl9vZmZzZXQ7CisgIGN1cl9vZmZzZXQgPSBzdGF0aWNfY2FzdDxpbnQ+KHRhYmxlLnNpemUoKSk7CisgIHRhYmxlICs9CisgICAgICAieHJlZiBcbiIKKyAgICAgICIwIDYgXG4iCisgICAgICAiMDAwMDAwMDAwMyA2NTUzNSBmIFxuIgorICAgICAgInRyYWlsZXJcbiIKKyAgICAgICI8PC9Sb290IDE0IDAgUi9JRCAiCisgICAgICAiWzxhZmJiMGY1OTNjMmQyYWVhNWI1MTljYjYxZGExYzE3Yj48NGY5YmIyZTc5Nzg0MDE4MDhmOGYxZjJhNzVjMzIyYzg+XSIKKyAgICAgICIvSW5mbyAxNSAwIFIvU2l6ZSAxNj4+XG4iOworICB0YWJsZSArPSAiRHVtbXkgRGF0YSBqZ3dodWdob3Vpd2JhaG5nIjsKKyAgcHJldl9vZmZzZXQgPSBjdXJfb2Zmc2V0OworICBjdXJfb2Zmc2V0ID0gc3RhdGljX2Nhc3Q8aW50Pih0YWJsZS5zaXplKCkpOworICB0YWJsZSArPSBzdGQ6OnN0cmluZygKKyAgICAgICAgICAgICAgICJ4cmVmIFxuIgorICAgICAgICAgICAgICAgIjAgNiBcbiIKKyAgICAgICAgICAgICAgICIwMDAwMDAwMDAzIDY1NTM1IGYgXG4iCisgICAgICAgICAgICAgICAidHJhaWxlclxuIgorICAgICAgICAgICAgICAgIjw8L1Jvb3QgMTQgMCBSL0lEICIKKyAgICAgICAgICAgICAgICJbPGFmYmIwZjU5M2MyZDJhZWE1YjUxOWNiNjFkYTFjMTdiPjwiCisgICAgICAgICAgICAgICAiNGY5YmIyZTc5Nzg0MDE4MDhmOGYxZjJhNzVjMzIyYzg+XSIKKyAgICAgICAgICAgICAgICIvSW5mbyAxNSAwIFIvU2l6ZSAxNiIKKyAgICAgICAgICAgICAgICIvUHJldiAiKSArCisgICAgICAgICAgIEZYU1lTX2l0b2EocHJldl9vZmZzZXQsIGludF9idWZmZXIsIDEwKSArICI+PlxuIjsKKyAgdGFibGUgKz0gIk1vcmUgRHVtbXkgRGF0YSBqZ3dodWdob3Vpd2JhaG5nIjsKKyAgcHJldl9vZmZzZXQgPSBjdXJfb2Zmc2V0OworICBjdXJfb2Zmc2V0ID0gc3RhdGljX2Nhc3Q8aW50Pih0YWJsZS5zaXplKCkpOworICB0YWJsZSArPSBzdGQ6OnN0cmluZygKKyAgICAgICAgICAgICAgICJ4cmVmIFxuIgorICAgICAgICAgICAgICAgIjAgNiBcbiIKKyAgICAgICAgICAgICAgICIwMDAwMDAwMDAzIDY1NTM1IGYgXG4iCisgICAgICAgICAgICAgICAidHJhaWxlclxuIgorICAgICAgICAgICAgICAgIjw8L1Jvb3QgMTQgMCBSL0lEICIKKyAgICAgICAgICAgICAgICJbPGFmYmIwZjU5M2MyZDJhZWE1YjUxOWNiNjFkYTFjMTdiPjwiCisgICAgICAgICAgICAgICAiNGY5YmIyZTc5Nzg0MDE4MDhmOGYxZjJhNzVjMzIyYzg+XSIKKyAgICAgICAgICAgICAgICIvSW5mbyAxNSAwIFIvU2l6ZSAxNiIKKyAgICAgICAgICAgICAgICIvUHJldiAiKSArCisgICAgICAgICAgIEZYU1lTX2l0b2EocHJldl9vZmZzZXQsIGludF9idWZmZXIsIDEwKSArICI+PlxuIjsKKyAgY29uc3QgRlhfRklMRVNJWkUgbGFzdF9jcm9zc3JlZl9vZmZzZXQgPSBjdXJfb2Zmc2V0OworCisgIGF1dG8gcGFyc2VyID0gTWFrZVBhcnNlckZvckJ1ZmZlcigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KHRhYmxlLmRhdGEoKSksIHRhYmxlLnNpemUoKSk7CisgIGF1dG8gY3Jvc3NfcmVmX2F2YWlsID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfQ3Jvc3NSZWZBdmFpbD4oCisgICAgICBwYXJzZXIuZ2V0KCksIGxhc3RfY3Jvc3NyZWZfb2Zmc2V0KTsKKyAgRVhQRUNUX0VRKENQREZfRGF0YUF2YWlsOjpEYXRhQXZhaWxhYmxlLCBjcm9zc19yZWZfYXZhaWwtPkNoZWNrQXZhaWwoKSk7Cit9CisKK1RFU1QoQ1BERl9Dcm9zc1JlZkF2YWlsVGVzdCwgVGhyZWVDcm9zc1JlZlY1KSB7CisgIGNoYXIgaW50X2J1ZmZlclsxMDBdOworICBpbnQgcHJldl9vZmZzZXQgPSAwOworICBpbnQgY3VyX29mZnNldCA9IDA7CisgIHN0ZDo6c3RyaW5nIHRhYmxlID0gInBkZiBibGFoIGJsYWggYmxhaFxuIjsKKyAgcHJldl9vZmZzZXQgPSBjdXJfb2Zmc2V0OworICBjdXJfb2Zmc2V0ID0gc3RhdGljX2Nhc3Q8aW50Pih0YWJsZS5zaXplKCkpOworICB0YWJsZSArPQorICAgICAgIjE2IDAgb2JqXG4iCisgICAgICAiPDwvVHlwZSAvWFJlZj4+IgorICAgICAgIiBzdHJlYW0gXG4iCisgICAgICAiU1RSRUFNIERBVEEgU1RSRUFNIERBVEEgU1RSRUFNIERBVEEgYWhmY3VhYmZrdWFiZnVcbiIKKyAgICAgICJlbmRzdHJlYW1cbiIKKyAgICAgICJlbmRvYmpcbiI7CisgIHRhYmxlICs9ICJEdW1teSBEYXRhIGpnd2h1Z2hvdWl3YmFobmciOworCisgIHByZXZfb2Zmc2V0ID0gY3VyX29mZnNldDsKKyAgY3VyX29mZnNldCA9IHN0YXRpY19jYXN0PGludD4odGFibGUuc2l6ZSgpKTsKKyAgdGFibGUgKz0gc3RkOjpzdHJpbmcoCisgICAgICAgICAgICAgICAiNTUgMCBvYmpcbiIKKyAgICAgICAgICAgICAgICI8PC9UeXBlIC9YUmVmIC9QcmV2ICIpICsKKyAgICAgICAgICAgRlhTWVNfaXRvYShwcmV2X29mZnNldCwgaW50X2J1ZmZlciwgMTApICsKKyAgICAgICAgICAgIj4+IgorICAgICAgICAgICAiIHN0cmVhbSBcbiIKKyAgICAgICAgICAgIlNUUkVBTSBEQVRBIFNUUkVBTSBEQVRBIFNUUkVBTSBEQVRBXG4iCisgICAgICAgICAgICJlbmRzdHJlYW1cbiIKKyAgICAgICAgICAgImVuZG9ialxuIjsKKyAgdGFibGUgKz0gIk1vcmUgRHVtbXkgRGF0YSBqZ3dodWdob3Vpd2JhaG5nIjsKKyAgcHJldl9vZmZzZXQgPSBjdXJfb2Zmc2V0OworICBjdXJfb2Zmc2V0ID0gc3RhdGljX2Nhc3Q8aW50Pih0YWJsZS5zaXplKCkpOworICB0YWJsZSArPSBzdGQ6OnN0cmluZygKKyAgICAgICAgICAgICAgICI4OCAwIG9ialxuIgorICAgICAgICAgICAgICAgIjw8L1R5cGUgL1hSZWYgL05OTk4gL1ByZXYgIikgKworICAgICAgICAgICBGWFNZU19pdG9hKHByZXZfb2Zmc2V0LCBpbnRfYnVmZmVyLCAxMCkgKworICAgICAgICAgICAiPj4iCisgICAgICAgICAgICIgc3RyZWFtIFxuIgorICAgICAgICAgICAiU1RSRUFNIERBVEEgU1RSRUFNIERBVEEgU1RSRUFNIERBVEEgZmF2YXZcbiIKKyAgICAgICAgICAgImVuZHN0cmVhbVxuIgorICAgICAgICAgICAiZW5kb2JqXG4iOworICBjb25zdCBGWF9GSUxFU0laRSBsYXN0X2Nyb3NzcmVmX29mZnNldCA9IGN1cl9vZmZzZXQ7CisKKyAgYXV0byBwYXJzZXIgPSBNYWtlUGFyc2VyRm9yQnVmZmVyKAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4odGFibGUuZGF0YSgpKSwgdGFibGUuc2l6ZSgpKTsKKyAgYXV0byBjcm9zc19yZWZfYXZhaWwgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9Dcm9zc1JlZkF2YWlsPigKKyAgICAgIHBhcnNlci5nZXQoKSwgbGFzdF9jcm9zc3JlZl9vZmZzZXQpOworICBFWFBFQ1RfRVEoQ1BERl9EYXRhQXZhaWw6OkRhdGFBdmFpbGFibGUsIGNyb3NzX3JlZl9hdmFpbC0+Q2hlY2tBdmFpbCgpKTsKK30KKworVEVTVChDUERGX0Nyb3NzUmVmQXZhaWxUZXN0LCBNaXhlZCkgeworICBjaGFyIGludF9idWZmZXJbMTAwXTsKKyAgc3RkOjpzdHJpbmcgdGFibGUgPSAicGRmIGJsYWggYmxhaCBibGFoXG4iOworCisgIGNvbnN0IGludCBmaXJzdF92NV90YWJsZV9vZmZzZXQgPSBzdGF0aWNfY2FzdDxpbnQ+KHRhYmxlLnNpemUoKSk7CisgIHRhYmxlICs9CisgICAgICAiMTYgMCBvYmpcbiIKKyAgICAgICI8PC9UeXBlIC9YUmVmPj4iCisgICAgICAiIHN0cmVhbSBcbiIKKyAgICAgICJTVFJFQU0gREFUQSBTVFJFQU0gREFUQSBTVFJFQU0gREFUQSBhaGZjdWFiZmt1YWJmdVxuIgorICAgICAgImVuZHN0cmVhbVxuIgorICAgICAgImVuZG9ialxuIjsKKyAgdGFibGUgKz0gIkR1bW15IERhdGEgamd3aHVnaG91aXdiYWhuZyI7CisKKyAgY29uc3QgaW50IHNlY29uZF92NF90YWJsZV9vZmZzZXQgPSBzdGF0aWNfY2FzdDxpbnQ+KHRhYmxlLnNpemUoKSk7CisgIHRhYmxlICs9IHN0ZDo6c3RyaW5nKAorICAgICAgICAgICAgICAgInhyZWYgXG4iCisgICAgICAgICAgICAgICAiMCA2IFxuIgorICAgICAgICAgICAgICAgIjAwMDAwMDAwMDMgNjU1MzUgZiBcbiIKKyAgICAgICAgICAgICAgICJ0cmFpbGVyXG4iCisgICAgICAgICAgICAgICAiPDwvUm9vdCAxNCAwIFIvSUQgIgorICAgICAgICAgICAgICAgIls8YWZiYjBmNTkzYzJkMmFlYTViNTE5Y2I2MWRhMWMxN2I+PCIKKyAgICAgICAgICAgICAgICI0ZjliYjJlNzk3ODQwMTgwOGY4ZjFmMmE3NWMzMjJjOD5dIgorICAgICAgICAgICAgICAgIi9JbmZvIDE1IDAgUi9TaXplIDE2IgorICAgICAgICAgICAgICAgIi9QcmV2ICIpICsKKyAgICAgICAgICAgRlhTWVNfaXRvYShmaXJzdF92NV90YWJsZV9vZmZzZXQsIGludF9idWZmZXIsIDEwKSArICI+PlxuIjsKKyAgdGFibGUgKz0gIk1vcmUgRHVtbXkgRGF0YSBqZ3dodWdob3Vpd2JhaG5nIjsKKworICBjb25zdCBpbnQgbGFzdF92NF90YWJsZV9vZmZzZXQgPSBzdGF0aWNfY2FzdDxpbnQ+KHRhYmxlLnNpemUoKSk7CisgIHRhYmxlICs9IHN0ZDo6c3RyaW5nKAorICAgICAgICAgICAgICAgInhyZWYgXG4iCisgICAgICAgICAgICAgICAiMCA2IFxuIgorICAgICAgICAgICAgICAgIjAwMDAwMDAwMDMgNjU1MzUgZiBcbiIKKyAgICAgICAgICAgICAgICJ0cmFpbGVyXG4iCisgICAgICAgICAgICAgICAiPDwvUm9vdCAxNCAwIFIvSUQgIgorICAgICAgICAgICAgICAgIls8YWZiYjBmNTkzYzJkMmFlYTViNTE5Y2I2MWRhMWMxN2I+PCIKKyAgICAgICAgICAgICAgICI0ZjliYjJlNzk3ODQwMTgwOGY4ZjFmMmE3NWMzMjJjOD5dIgorICAgICAgICAgICAgICAgIi9JbmZvIDE1IDAgUi9TaXplIDE2IgorICAgICAgICAgICAgICAgIi9QcmV2ICIpICsKKyAgICAgICAgICAgRlhTWVNfaXRvYShzZWNvbmRfdjRfdGFibGVfb2Zmc2V0LCBpbnRfYnVmZmVyLCAxMCkgKyAiIC9YUmVmU3RtICIgKworICAgICAgICAgICBGWFNZU19pdG9hKGZpcnN0X3Y1X3RhYmxlX29mZnNldCwgaW50X2J1ZmZlciwgMTApICsgIj4+XG4iOworICBjb25zdCBGWF9GSUxFU0laRSBsYXN0X2Nyb3NzcmVmX29mZnNldCA9IGxhc3RfdjRfdGFibGVfb2Zmc2V0OworCisgIGF1dG8gcGFyc2VyID0gTWFrZVBhcnNlckZvckJ1ZmZlcigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KHRhYmxlLmRhdGEoKSksIHRhYmxlLnNpemUoKSk7CisgIGF1dG8gY3Jvc3NfcmVmX2F2YWlsID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfQ3Jvc3NSZWZBdmFpbD4oCisgICAgICBwYXJzZXIuZ2V0KCksIGxhc3RfY3Jvc3NyZWZfb2Zmc2V0KTsKKyAgRVhQRUNUX0VRKENQREZfRGF0YUF2YWlsOjpEYXRhQXZhaWxhYmxlLCBjcm9zc19yZWZfYXZhaWwtPkNoZWNrQXZhaWwoKSk7Cit9CisKK1RFU1QoQ1BERl9Dcm9zc1JlZkF2YWlsVGVzdCwgQ3Jvc3NSZWZWNUlzTm90U3RyZWFtKSB7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgaW52YWxpZF94cmVmX3N0cmVhbVtdID0KKyAgICAgICIxNiAwIG9ialxuIgorICAgICAgIlsvYXJyYXkgL29iamVjdF1cbiIKKyAgICAgICJlbmRzdHJlYW1cbiIKKyAgICAgICJlbmRvYmpcbiI7CisgIGNvbnN0IEZYX0ZJTEVTSVpFIGxhc3RfY3Jvc3NyZWZfb2Zmc2V0ID0gMDsKKworICBhdXRvIHBhcnNlciA9IE1ha2VQYXJzZXJGb3JCdWZmZXIoaW52YWxpZF94cmVmX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FycmF5U2l6ZShpbnZhbGlkX3hyZWZfc3RyZWFtKSk7CisgIGF1dG8gY3Jvc3NfcmVmX2F2YWlsID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfQ3Jvc3NSZWZBdmFpbD4oCisgICAgICBwYXJzZXIuZ2V0KCksIGxhc3RfY3Jvc3NyZWZfb2Zmc2V0KTsKKyAgRVhQRUNUX0VRKENQREZfRGF0YUF2YWlsOjpEYXRhRXJyb3IsIGNyb3NzX3JlZl9hdmFpbC0+Q2hlY2tBdmFpbCgpKTsKK30KKworVEVTVChDUERGX0Nyb3NzUmVmQXZhaWxUZXN0LCBDcm9zc1JlZlY0V2l0aEVuY3J5cHRSZWYpIHsKKyAgY29uc3QgdW5zaWduZWQgY2hhciB4cmVmX3RhYmxlW10gPQorICAgICAgInhyZWYgXG4iCisgICAgICAiMCA2IFxuIgorICAgICAgIjAwMDAwMDAwMDMgNjU1MzUgZiBcbiIKKyAgICAgICIwMDAwMDAwMDE3IDAwMDAwIG4gXG4iCisgICAgICAiMDAwMDAwMDA4MSAwMDAwMCBuIFxuIgorICAgICAgIjAwMDAwMDAwMDAgMDAwMDcgZiBcbiIKKyAgICAgICIwMDAwMDAwMzMxIDAwMDAwIG4gXG4iCisgICAgICAiMDAwMDAwMDQwOSAwMDAwMCBuIFxuIgorICAgICAgInRyYWlsZXJcbiIKKyAgICAgICI8PC9Sb290IDE0IDAgUi9JRCAiCisgICAgICAiWzxhZmJiMGY1OTNjMmQyYWVhNWI1MTljYjYxZGExYzE3Yj48NGY5YmIyZTc5Nzg0MDE4MDhmOGYxZjJhNzVjMzIyYzg+XSIKKyAgICAgICIvRW5jcnlwdCA3NyAwIFIiCisgICAgICAiL0luZm8gMTUgMCBSL1NpemUgMTY+PiI7CisgIGNvbnN0IEZYX0ZJTEVTSVpFIGxhc3RfY3Jvc3NyZWZfb2Zmc2V0ID0gMDsKKworICBhdXRvIHBhcnNlciA9IE1ha2VQYXJzZXJGb3JCdWZmZXIoeHJlZl90YWJsZSwgRlhfQXJyYXlTaXplKHhyZWZfdGFibGUpKTsKKyAgYXV0byBjcm9zc19yZWZfYXZhaWwgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9Dcm9zc1JlZkF2YWlsPigKKyAgICAgIHBhcnNlci5nZXQoKSwgbGFzdF9jcm9zc3JlZl9vZmZzZXQpOworICBFWFBFQ1RfRVEoQ1BERl9EYXRhQXZhaWw6OkRhdGFFcnJvciwgY3Jvc3NfcmVmX2F2YWlsLT5DaGVja0F2YWlsKCkpOworfQorCitURVNUKENQREZfQ3Jvc3NSZWZBdmFpbFRlc3QsIENyb3NzUmVmU3RyZWFtV2l0aEVuY3J5cHRSZWYpIHsKKyAgY29uc3QgdW5zaWduZWQgY2hhciB4cmVmX3N0cmVhbVtdID0KKyAgICAgICIxNiAwIG9ialxuIgorICAgICAgIjw8L0ZpbHRlciAvRmxhdGVEZWNvZGUgL0VuY3J5cHQgNzcgMCBSPj4iCisgICAgICAiIHN0cmVhbSBcbiIKKyAgICAgICJTVFJFQU0gREFUQSBTVFJFQU0gREFUQSBTVFJFQU0gREFUQVxuIgorICAgICAgImVuZHN0cmVhbVxuIgorICAgICAgImVuZG9ialxuIjsKKyAgY29uc3QgRlhfRklMRVNJWkUgbGFzdF9jcm9zc3JlZl9vZmZzZXQgPSAwOworCisgIGF1dG8gcGFyc2VyID0gTWFrZVBhcnNlckZvckJ1ZmZlcih4cmVmX3N0cmVhbSwgRlhfQXJyYXlTaXplKHhyZWZfc3RyZWFtKSk7CisgIGF1dG8gY3Jvc3NfcmVmX2F2YWlsID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfQ3Jvc3NSZWZBdmFpbD4oCisgICAgICBwYXJzZXIuZ2V0KCksIGxhc3RfY3Jvc3NyZWZfb2Zmc2V0KTsKKyAgRVhQRUNUX0VRKENQREZfRGF0YUF2YWlsOjpEYXRhRXJyb3IsIGNyb3NzX3JlZl9hdmFpbC0+Q2hlY2tBdmFpbCgpKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9jcnlwdG9faGFuZGxlci5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfY3J5cHRvX2hhbmRsZXIuY3BwCmluZGV4IDYxZjc4YzQuLmQ5NjNkZjQgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9jcnlwdG9faGFuZGxlci5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2NyeXB0b19oYW5kbGVyLmNwcApAQCAtOCwxMCArOCw0MiBAQAogCiAjaW5jbHVkZSA8dGltZS5oPgogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0YWNrPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKICNpbmNsdWRlICJjb3JlL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9lbmNyeXB0b3IuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX2ZsYXRlZW5jb2Rlci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bWJlci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3Rfd2Fsa2VyLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3BhcnNlci5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zZWN1cml0eV9oYW5kbGVyLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3NpbXBsZV9wYXJzZXIuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbV9hY2MuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyaW5nLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBjaGFyIGtDb250ZW50c0tleVtdID0gIkNvbnRlbnRzIjsKK2NvbnN0ZXhwciBjaGFyIGtUeXBlS2V5W10gPSAiVHlwZSI7Citjb25zdGV4cHIgY2hhciBrRlRLZXlbXSA9ICJGVCI7Citjb25zdGV4cHIgY2hhciBrU2lnblR5cGVWYWx1ZVtdID0gIlNpZyI7CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK2Jvb2wgQ1BERl9DcnlwdG9IYW5kbGVyOjpJc1NpZ25hdHVyZURpY3Rpb25hcnkoCisgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBkaWN0aW9uYXJ5KSB7CisgIGlmICghZGljdGlvbmFyeSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGNvbnN0IENQREZfT2JqZWN0KiB0eXBlX29iaiA9IGRpY3Rpb25hcnktPkdldERpcmVjdE9iamVjdEZvcihrVHlwZUtleSk7CisgIGlmICghdHlwZV9vYmopCisgICAgdHlwZV9vYmogPSBkaWN0aW9uYXJ5LT5HZXREaXJlY3RPYmplY3RGb3Ioa0ZUS2V5KTsKKyAgcmV0dXJuIHR5cGVfb2JqICYmIHR5cGVfb2JqLT5HZXRTdHJpbmcoKSA9PSBrU2lnblR5cGVWYWx1ZTsKK30KIAogdm9pZCBDUERGX0NyeXB0b0hhbmRsZXI6OkNyeXB0QmxvY2soYm9vbCBiRW5jcnlwdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9iam51bSwKQEAgLTIxLDcgKzUzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIGRlc3Rfc2l6ZSkgewogICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfTk9ORSkgewotICAgIEZYU1lTX21lbWNweShkZXN0X2J1Ziwgc3JjX2J1Ziwgc3JjX3NpemUpOworICAgIG1lbWNweShkZXN0X2J1Ziwgc3JjX2J1Ziwgc3JjX3NpemUpOwogICAgIHJldHVybjsKICAgfQogICB1aW50OF90IHJlYWxrZXlbMTZdOwpAQCAtMzEsNyArNjMsNyBAQAogICAgIFBvcHVsYXRlS2V5KG9iam51bSwgZ2VubnVtLCBrZXkxKTsKIAogICAgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9BRVMpIHsKLSAgICAgIEZYU1lTX21lbWNweShrZXkxICsgbV9LZXlMZW4gKyA1LCAic0FsVCIsIDQpOworICAgICAgbWVtY3B5KGtleTEgKyBtX0tleUxlbiArIDUsICJzQWxUIiwgNCk7CiAgICAgfQogICAgIENSWVBUX01ENUdlbmVyYXRlKAogICAgICAgICBrZXkxLCBtX0NpcGhlciA9PSBGWENJUEhFUl9BRVMgPyBtX0tleUxlbiArIDkgOiBtX0tleUxlbiArIDUsIHJlYWxrZXkpOwpAQCAtNDEsNDQgKzczLDQ2IEBACiAgICAgfQogICB9CiAgIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9BRVMpIHsKLSAgICBDUllQVF9BRVNTZXRLZXkobV9wQUVTQ29udGV4dCwgMTYsIG1fS2V5TGVuID09IDMyID8gbV9FbmNyeXB0S2V5IDogcmVhbGtleSwKLSAgICAgICAgICAgICAgICAgICAgbV9LZXlMZW4sIGJFbmNyeXB0KTsKKyAgICBDUllQVF9BRVNTZXRLZXkobV9wQUVTQ29udGV4dC5nZXQoKSwgMTYsCisgICAgICAgICAgICAgICAgICAgIG1fS2V5TGVuID09IDMyID8gbV9FbmNyeXB0S2V5IDogcmVhbGtleSwgbV9LZXlMZW4sCisgICAgICAgICAgICAgICAgICAgIGJFbmNyeXB0KTsKICAgICBpZiAoYkVuY3J5cHQpIHsKICAgICAgIHVpbnQ4X3QgaXZbMTZdOwogICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CiAgICAgICAgIGl2W2ldID0gKHVpbnQ4X3QpcmFuZCgpOwogICAgICAgfQotICAgICAgQ1JZUFRfQUVTU2V0SVYobV9wQUVTQ29udGV4dCwgaXYpOwotICAgICAgRlhTWVNfbWVtY3B5KGRlc3RfYnVmLCBpdiwgMTYpOworICAgICAgQ1JZUFRfQUVTU2V0SVYobV9wQUVTQ29udGV4dC5nZXQoKSwgaXYpOworICAgICAgbWVtY3B5KGRlc3RfYnVmLCBpdiwgMTYpOwogICAgICAgaW50IG5ibG9ja3MgPSBzcmNfc2l6ZSAvIDE2OwotICAgICAgQ1JZUFRfQUVTRW5jcnlwdChtX3BBRVNDb250ZXh0LCBkZXN0X2J1ZiArIDE2LCBzcmNfYnVmLCBuYmxvY2tzICogMTYpOworICAgICAgQ1JZUFRfQUVTRW5jcnlwdChtX3BBRVNDb250ZXh0LmdldCgpLCBkZXN0X2J1ZiArIDE2LCBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICBuYmxvY2tzICogMTYpOwogICAgICAgdWludDhfdCBwYWRkaW5nWzE2XTsKLSAgICAgIEZYU1lTX21lbWNweShwYWRkaW5nLCBzcmNfYnVmICsgbmJsb2NrcyAqIDE2LCBzcmNfc2l6ZSAlIDE2KTsKLSAgICAgIEZYU1lTX21lbXNldChwYWRkaW5nICsgc3JjX3NpemUgJSAxNiwgMTYgLSBzcmNfc2l6ZSAlIDE2LAotICAgICAgICAgICAgICAgICAgIDE2IC0gc3JjX3NpemUgJSAxNik7Ci0gICAgICBDUllQVF9BRVNFbmNyeXB0KG1fcEFFU0NvbnRleHQsIGRlc3RfYnVmICsgbmJsb2NrcyAqIDE2ICsgMTYsIHBhZGRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgIDE2KTsKKyAgICAgIG1lbWNweShwYWRkaW5nLCBzcmNfYnVmICsgbmJsb2NrcyAqIDE2LCBzcmNfc2l6ZSAlIDE2KTsKKyAgICAgIG1lbXNldChwYWRkaW5nICsgc3JjX3NpemUgJSAxNiwgMTYgLSBzcmNfc2l6ZSAlIDE2LCAxNiAtIHNyY19zaXplICUgMTYpOworICAgICAgQ1JZUFRfQUVTRW5jcnlwdChtX3BBRVNDb250ZXh0LmdldCgpLCBkZXN0X2J1ZiArIG5ibG9ja3MgKiAxNiArIDE2LAorICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nLCAxNik7CiAgICAgICBkZXN0X3NpemUgPSAzMiArIG5ibG9ja3MgKiAxNjsKICAgICB9IGVsc2UgewotICAgICAgQ1JZUFRfQUVTU2V0SVYobV9wQUVTQ29udGV4dCwgc3JjX2J1Zik7Ci0gICAgICBDUllQVF9BRVNEZWNyeXB0KG1fcEFFU0NvbnRleHQsIGRlc3RfYnVmLCBzcmNfYnVmICsgMTYsIHNyY19zaXplIC0gMTYpOworICAgICAgQ1JZUFRfQUVTU2V0SVYobV9wQUVTQ29udGV4dC5nZXQoKSwgc3JjX2J1Zik7CisgICAgICBDUllQVF9BRVNEZWNyeXB0KG1fcEFFU0NvbnRleHQuZ2V0KCksIGRlc3RfYnVmLCBzcmNfYnVmICsgMTYsCisgICAgICAgICAgICAgICAgICAgICAgIHNyY19zaXplIC0gMTYpOwogICAgICAgZGVzdF9zaXplID0gc3JjX3NpemUgLSAxNjsKICAgICAgIGRlc3Rfc2l6ZSAtPSBkZXN0X2J1ZltkZXN0X3NpemUgLSAxXTsKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgQVNTRVJUKGRlc3Rfc2l6ZSA9PSBzcmNfc2l6ZSk7CiAgICAgaWYgKGRlc3RfYnVmICE9IHNyY19idWYpIHsKLSAgICAgIEZYU1lTX21lbWNweShkZXN0X2J1Ziwgc3JjX2J1Ziwgc3JjX3NpemUpOworICAgICAgbWVtY3B5KGRlc3RfYnVmLCBzcmNfYnVmLCBzcmNfc2l6ZSk7CiAgICAgfQogICAgIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKGRlc3RfYnVmLCBkZXN0X3NpemUsIHJlYWxrZXksIHJlYWxrZXlsZW4pOwogICB9CiB9CiAKIHN0cnVjdCBBRVNDcnlwdENvbnRleHQgewotICB1aW50OF90IG1fQ29udGV4dFsyMDQ4XTsKICAgYm9vbCBtX2JJVjsKICAgdWludDhfdCBtX0Jsb2NrWzE2XTsKICAgdWludDMyX3QgbV9CbG9ja09mZnNldDsKKyAgQ1JZUFRfYWVzX2NvbnRleHQgbV9Db250ZXh0OwogfTsKIAogdm9pZCogQ1BERl9DcnlwdG9IYW5kbGVyOjpDcnlwdFN0YXJ0KHVpbnQzMl90IG9iam51bSwKQEAgLTkxLDEyICsxMjUsMTIgQEAKICAgICBBRVNDcnlwdENvbnRleHQqIHBDb250ZXh0ID0gRlhfQWxsb2MoQUVTQ3J5cHRDb250ZXh0LCAxKTsKICAgICBwQ29udGV4dC0+bV9iSVYgPSB0cnVlOwogICAgIHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0ID0gMDsKLSAgICBDUllQVF9BRVNTZXRLZXkocENvbnRleHQtPm1fQ29udGV4dCwgMTYsIG1fRW5jcnlwdEtleSwgMzIsIGJFbmNyeXB0KTsKKyAgICBDUllQVF9BRVNTZXRLZXkoJnBDb250ZXh0LT5tX0NvbnRleHQsIDE2LCBtX0VuY3J5cHRLZXksIDMyLCBiRW5jcnlwdCk7CiAgICAgaWYgKGJFbmNyeXB0KSB7CiAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKICAgICAgICAgcENvbnRleHQtPm1fQmxvY2tbaV0gPSAodWludDhfdClyYW5kKCk7CiAgICAgICB9Ci0gICAgICBDUllQVF9BRVNTZXRJVihwQ29udGV4dC0+bV9Db250ZXh0LCBwQ29udGV4dC0+bV9CbG9jayk7CisgICAgICBDUllQVF9BRVNTZXRJVigmcENvbnRleHQtPm1fQ29udGV4dCwgcENvbnRleHQtPm1fQmxvY2spOwogICAgIH0KICAgICByZXR1cm4gcENvbnRleHQ7CiAgIH0KQEAgLTEwNCw3ICsxMzgsNyBAQAogICBQb3B1bGF0ZUtleShvYmpudW0sIGdlbm51bSwga2V5MSk7CiAKICAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUykgewotICAgIEZYU1lTX21lbWNweShrZXkxICsgbV9LZXlMZW4gKyA1LCAic0FsVCIsIDQpOworICAgIG1lbWNweShrZXkxICsgbV9LZXlMZW4gKyA1LCAic0FsVCIsIDQpOwogICB9CiAgIHVpbnQ4X3QgcmVhbGtleVsxNl07CiAgIENSWVBUX01ENUdlbmVyYXRlKApAQCAtMTE3LDEyICsxNTEsMTIgQEAKICAgICBBRVNDcnlwdENvbnRleHQqIHBDb250ZXh0ID0gRlhfQWxsb2MoQUVTQ3J5cHRDb250ZXh0LCAxKTsKICAgICBwQ29udGV4dC0+bV9iSVYgPSB0cnVlOwogICAgIHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0ID0gMDsKLSAgICBDUllQVF9BRVNTZXRLZXkocENvbnRleHQtPm1fQ29udGV4dCwgMTYsIHJlYWxrZXksIDE2LCBiRW5jcnlwdCk7CisgICAgQ1JZUFRfQUVTU2V0S2V5KCZwQ29udGV4dC0+bV9Db250ZXh0LCAxNiwgcmVhbGtleSwgMTYsIGJFbmNyeXB0KTsKICAgICBpZiAoYkVuY3J5cHQpIHsKICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgewogICAgICAgICBwQ29udGV4dC0+bV9CbG9ja1tpXSA9ICh1aW50OF90KXJhbmQoKTsKICAgICAgIH0KLSAgICAgIENSWVBUX0FFU1NldElWKHBDb250ZXh0LT5tX0NvbnRleHQsIHBDb250ZXh0LT5tX0Jsb2NrKTsKKyAgICAgIENSWVBUX0FFU1NldElWKCZwQ29udGV4dC0+bV9Db250ZXh0LCBwQ29udGV4dC0+bV9CbG9jayk7CiAgICAgfQogICAgIHJldHVybiBwQ29udGV4dDsKICAgfQpAQCAtMTYyLDIzICsxOTYsMjMgQEAKICAgICBpZiAoY29weV9zaXplID4gc3JjX2xlZnQpIHsKICAgICAgIGNvcHlfc2l6ZSA9IHNyY19sZWZ0OwogICAgIH0KLSAgICBGWFNZU19tZW1jcHkocENvbnRleHQtPm1fQmxvY2sgKyBwQ29udGV4dC0+bV9CbG9ja09mZnNldCwgc3JjX2J1ZiArIHNyY19vZmYsCi0gICAgICAgICAgICAgICAgIGNvcHlfc2l6ZSk7CisgICAgbWVtY3B5KHBDb250ZXh0LT5tX0Jsb2NrICsgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQsIHNyY19idWYgKyBzcmNfb2ZmLAorICAgICAgICAgICBjb3B5X3NpemUpOwogICAgIHNyY19vZmYgKz0gY29weV9zaXplOwogICAgIHNyY19sZWZ0IC09IGNvcHlfc2l6ZTsKICAgICBwQ29udGV4dC0+bV9CbG9ja09mZnNldCArPSBjb3B5X3NpemU7CiAgICAgaWYgKHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0ID09IDE2KSB7CiAgICAgICBpZiAoIWJFbmNyeXB0ICYmIHBDb250ZXh0LT5tX2JJVikgewotICAgICAgICBDUllQVF9BRVNTZXRJVihwQ29udGV4dC0+bV9Db250ZXh0LCBwQ29udGV4dC0+bV9CbG9jayk7CisgICAgICAgIENSWVBUX0FFU1NldElWKCZwQ29udGV4dC0+bV9Db250ZXh0LCBwQ29udGV4dC0+bV9CbG9jayk7CiAgICAgICAgIHBDb250ZXh0LT5tX2JJViA9IGZhbHNlOwogICAgICAgICBwQ29udGV4dC0+bV9CbG9ja09mZnNldCA9IDA7CiAgICAgICB9IGVsc2UgaWYgKHNyY19vZmYgPCBzcmNfc2l6ZSkgewogICAgICAgICB1aW50OF90IGJsb2NrX2J1ZlsxNl07CiAgICAgICAgIGlmIChiRW5jcnlwdCkgewotICAgICAgICAgIENSWVBUX0FFU0VuY3J5cHQocENvbnRleHQtPm1fQ29udGV4dCwgYmxvY2tfYnVmLCBwQ29udGV4dC0+bV9CbG9jaywKKyAgICAgICAgICBDUllQVF9BRVNFbmNyeXB0KCZwQ29udGV4dC0+bV9Db250ZXh0LCBibG9ja19idWYsIHBDb250ZXh0LT5tX0Jsb2NrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIENSWVBUX0FFU0RlY3J5cHQocENvbnRleHQtPm1fQ29udGV4dCwgYmxvY2tfYnVmLCBwQ29udGV4dC0+bV9CbG9jaywKKyAgICAgICAgICBDUllQVF9BRVNEZWNyeXB0KCZwQ29udGV4dC0+bV9Db250ZXh0LCBibG9ja19idWYsIHBDb250ZXh0LT5tX0Jsb2NrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYpOwogICAgICAgICB9CiAgICAgICAgIGRlc3RfYnVmLkFwcGVuZEJsb2NrKGJsb2NrX2J1ZiwgMTYpOwpAQCAtMjA4LDE4ICsyNDIsMTggQEAKICAgaWYgKGJFbmNyeXB0KSB7CiAgICAgdWludDhfdCBibG9ja19idWZbMTZdOwogICAgIGlmIChwQ29udGV4dC0+bV9CbG9ja09mZnNldCA9PSAxNikgewotICAgICAgQ1JZUFRfQUVTRW5jcnlwdChwQ29udGV4dC0+bV9Db250ZXh0LCBibG9ja19idWYsIHBDb250ZXh0LT5tX0Jsb2NrLCAxNik7CisgICAgICBDUllQVF9BRVNFbmNyeXB0KCZwQ29udGV4dC0+bV9Db250ZXh0LCBibG9ja19idWYsIHBDb250ZXh0LT5tX0Jsb2NrLCAxNik7CiAgICAgICBkZXN0X2J1Zi5BcHBlbmRCbG9jayhibG9ja19idWYsIDE2KTsKICAgICAgIHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0ID0gMDsKICAgICB9Ci0gICAgRlhTWVNfbWVtc2V0KHBDb250ZXh0LT5tX0Jsb2NrICsgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQsCi0gICAgICAgICAgICAgICAgICh1aW50OF90KSgxNiAtIHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0KSwKLSAgICAgICAgICAgICAgICAgMTYgLSBwQ29udGV4dC0+bV9CbG9ja09mZnNldCk7Ci0gICAgQ1JZUFRfQUVTRW5jcnlwdChwQ29udGV4dC0+bV9Db250ZXh0LCBibG9ja19idWYsIHBDb250ZXh0LT5tX0Jsb2NrLCAxNik7CisgICAgbWVtc2V0KHBDb250ZXh0LT5tX0Jsb2NrICsgcENvbnRleHQtPm1fQmxvY2tPZmZzZXQsCisgICAgICAgICAgICh1aW50OF90KSgxNiAtIHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0KSwKKyAgICAgICAgICAgMTYgLSBwQ29udGV4dC0+bV9CbG9ja09mZnNldCk7CisgICAgQ1JZUFRfQUVTRW5jcnlwdCgmcENvbnRleHQtPm1fQ29udGV4dCwgYmxvY2tfYnVmLCBwQ29udGV4dC0+bV9CbG9jaywgMTYpOwogICAgIGRlc3RfYnVmLkFwcGVuZEJsb2NrKGJsb2NrX2J1ZiwgMTYpOwogICB9IGVsc2UgaWYgKHBDb250ZXh0LT5tX0Jsb2NrT2Zmc2V0ID09IDE2KSB7CiAgICAgdWludDhfdCBibG9ja19idWZbMTZdOwotICAgIENSWVBUX0FFU0RlY3J5cHQocENvbnRleHQtPm1fQ29udGV4dCwgYmxvY2tfYnVmLCBwQ29udGV4dC0+bV9CbG9jaywgMTYpOworICAgIENSWVBUX0FFU0RlY3J5cHQoJnBDb250ZXh0LT5tX0NvbnRleHQsIGJsb2NrX2J1ZiwgcENvbnRleHQtPm1fQmxvY2ssIDE2KTsKICAgICBpZiAoYmxvY2tfYnVmWzE1XSA8PSAxNikgewogICAgICAgZGVzdF9idWYuQXBwZW5kQmxvY2soYmxvY2tfYnVmLCAxNiAtIGJsb2NrX2J1ZlsxNV0pOwogICAgIH0KQEAgLTIyOCwxNCArMjYyLDE0IEBACiAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIENQREZfQ3J5cHRvSGFuZGxlcjo6RGVjcnlwdCh1aW50MzJfdCBvYmpudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyKSB7CitCeXRlU3RyaW5nIENQREZfQ3J5cHRvSGFuZGxlcjo6RGVjcnlwdCh1aW50MzJfdCBvYmpudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBzdHIpIHsKICAgQ0ZYX0JpbmFyeUJ1ZiBkZXN0X2J1ZjsKICAgdm9pZCogY29udGV4dCA9IERlY3J5cHRTdGFydChvYmpudW0sIGdlbm51bSk7CiAgIERlY3J5cHRTdHJlYW0oY29udGV4dCwgc3RyLnJhd19zdHIoKSwgc3RyLkdldExlbmd0aCgpLCBkZXN0X2J1Zik7CiAgIERlY3J5cHRGaW5pc2goY29udGV4dCwgZGVzdF9idWYpOwotICBzdHIgPSBDRlhfQnl0ZVN0cmluZyhkZXN0X2J1Zi5HZXRCdWZmZXIoKSwgZGVzdF9idWYuR2V0U2l6ZSgpKTsKKyAgcmV0dXJuIEJ5dGVTdHJpbmcoZGVzdF9idWYuR2V0QnVmZmVyKCksIGRlc3RfYnVmLkdldFNpemUoKSk7CiB9CiAKIHZvaWQqIENQREZfQ3J5cHRvSGFuZGxlcjo6RGVjcnlwdFN0YXJ0KHVpbnQzMl90IG9iam51bSwgdWludDMyX3QgZ2VubnVtKSB7CkBAIC0yNDUsNjEgKzI3OSw5OSBAQAogICByZXR1cm4gbV9DaXBoZXIgPT0gRlhDSVBIRVJfQUVTID8gc3JjX3NpemUgLSAxNiA6IHNyY19zaXplOwogfQogCi1ib29sIENQREZfQ3J5cHRvSGFuZGxlcjo6SW5pdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU2VjdXJpdHlIYW5kbGVyKiBwU2VjdXJpdHlIYW5kbGVyKSB7Ci0gIGNvbnN0IHVpbnQ4X3QqIGtleTsKLSAgaWYgKCFwU2VjdXJpdHlIYW5kbGVyLT5HZXRDcnlwdEluZm8obV9DaXBoZXIsIGtleSwgbV9LZXlMZW4pKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChtX0tleUxlbiA+IDMyIHx8IG1fS2V5TGVuIDwgMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAobV9DaXBoZXIgIT0gRlhDSVBIRVJfTk9ORSkgewotICAgIEZYU1lTX21lbWNweShtX0VuY3J5cHRLZXksIGtleSwgbV9LZXlMZW4pOwotICB9Ci0gIGlmIChtX0NpcGhlciA9PSBGWENJUEhFUl9BRVMpIHsKLSAgICBtX3BBRVNDb250ZXh0ID0gRlhfQWxsb2ModWludDhfdCwgMjA0OCk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Citib29sIENQREZfQ3J5cHRvSGFuZGxlcjo6SXNDaXBoZXJBRVMoKSBjb25zdCB7CisgIHJldHVybiBtX0NpcGhlciA9PSBGWENJUEhFUl9BRVM7CiB9CiAKLWJvb2wgQ1BERl9DcnlwdG9IYW5kbGVyOjpJbml0KGludCBjaXBoZXIsIGNvbnN0IHVpbnQ4X3QqIGtleSwgaW50IGtleWxlbikgewotICBpZiAoY2lwaGVyID09IEZYQ0lQSEVSX0FFUykgewotICAgIHN3aXRjaCAoa2V5bGVuKSB7Ci0gICAgICBjYXNlIDE2OgotICAgICAgY2FzZSAyNDoKLSAgICAgIGNhc2UgMzI6CitzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IENQREZfQ3J5cHRvSGFuZGxlcjo6RGVjcnlwdE9iamVjdFRyZWUoCisgICAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBvYmplY3QpIHsKKyAgaWYgKCFvYmplY3QpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgc3RydWN0IE1heUJlU2lnbmF0dXJlIHsKKyAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBhcmVudDsKKyAgICBDUERGX09iamVjdCogY29udGVudHM7CisgIH07CisKKyAgc3RkOjpzdGFjazxNYXlCZVNpZ25hdHVyZT4gbWF5X2JlX3NpZ25fZGljdGlvbmFyaWVzOworICBjb25zdCB1aW50MzJfdCBvYmpfbnVtID0gb2JqZWN0LT5HZXRPYmpOdW0oKTsKKyAgY29uc3QgdWludDMyX3QgZ2VuX251bSA9IG9iamVjdC0+R2V0R2VuTnVtKCk7CisKKyAgQ1BERl9PYmplY3QqIG9iamVjdF90b19kZWNyeXB0ID0gb2JqZWN0LmdldCgpOworICB3aGlsZSAob2JqZWN0X3RvX2RlY3J5cHQpIHsKKyAgICBDUERGX05vbkNvbnN0T2JqZWN0V2Fsa2VyIHdhbGtlcihvYmplY3RfdG9fZGVjcnlwdCk7CisgICAgb2JqZWN0X3RvX2RlY3J5cHQgPSBudWxscHRyOworICAgIHdoaWxlIChDUERGX09iamVjdCogY2hpbGQgPSB3YWxrZXIuR2V0TmV4dCgpKSB7CisgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBhcmVudF9kaWN0ID0KKyAgICAgICAgICB3YWxrZXIuR2V0UGFyZW50KCkgPyB3YWxrZXIuR2V0UGFyZW50KCktPkdldERpY3QoKSA6IG51bGxwdHI7CisgICAgICBpZiAod2Fsa2VyLmRpY3Rpb25hcnlfa2V5KCkgPT0ga0NvbnRlbnRzS2V5ICYmCisgICAgICAgICAgKHBhcmVudF9kaWN0LT5LZXlFeGlzdChrVHlwZUtleSkgfHwgcGFyZW50X2RpY3QtPktleUV4aXN0KGtGVEtleSkpKSB7CisgICAgICAgIC8vIFRoaXMgb2JqZWN0IG1heSBiZSBjb250ZW50cyBvZiBzaWduYXR1cmUgZGljdGlvbmFyeS4KKyAgICAgICAgLy8gQnV0IG5vdyB2YWx1ZXMgb2YgJ1R5cGUnIGFuZCAnRlQnIG9mIGRpY3Rpb25hcnkga2V5cyBhcmUgZW5jcnlwdGVkLAorICAgICAgICAvLyBhbmQgd2UgY2FuIG5vdCBjaGVjayB0aGlzLgorICAgICAgICAvLyBUZW1wb3Jhcnkgc2tpcCBpdCwgdG8gcHJldmVudCBzaWduYXR1cmUgY29ycnVwdGlvbi4KKyAgICAgICAgLy8gSXQgd2lsbCBiZSBkZWNyeXB0ZWQgb24gbmV4dCBpbnRlcmF0aW9ucywgaWYgdGhpcyBpcyBub3QgY29udGVudHMgb2YKKyAgICAgICAgLy8gc2lnbmF0dXJlIGRpY3Rpb25hcnkuCisgICAgICAgIG1heV9iZV9zaWduX2RpY3Rpb25hcmllcy5wdXNoKE1heUJlU2lnbmF0dXJlKHtwYXJlbnRfZGljdCwgY2hpbGR9KSk7CisgICAgICAgIHdhbGtlci5Ta2lwV2Fsa0ludG9DdXJyZW50T2JqZWN0KCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgLy8gU3RyaW5ncyBkZWNyeXB0aW9uLgorICAgICAgaWYgKGNoaWxkLT5Jc1N0cmluZygpKSB7CisgICAgICAgIC8vIFRPRE8oYXJ0LXNuYWtlKTogTW92ZSBkZWNyeXB0aW9uIGludG8gdGhlIENQREZfU3RyaW5nIGNsYXNzLgorICAgICAgICBDUERGX1N0cmluZyogc3RyID0gY2hpbGQtPkFzU3RyaW5nKCk7CisgICAgICAgIHN0ci0+U2V0U3RyaW5nKERlY3J5cHQob2JqX251bSwgZ2VuX251bSwgc3RyLT5HZXRTdHJpbmcoKSkpOworICAgICAgfQorICAgICAgLy8gU3RyZWFtIGRlY3J5cHRpb24uCisgICAgICBpZiAoY2hpbGQtPklzU3RyZWFtKCkpIHsKKyAgICAgICAgLy8gVE9ETyhhcnQtc25ha2UpOiBNb3ZlIGRlY3J5cHRpb24gaW50byB0aGUgQ1BERl9TdHJlYW0gY2xhc3MuCisgICAgICAgIENQREZfU3RyZWFtKiBzdHJlYW0gPSBjaGlsZC0+QXNTdHJlYW0oKTsKKyAgICAgICAgYXV0byBzdHJlYW1fYWNjZXNzID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfU3RyZWFtQWNjPihzdHJlYW0pOworICAgICAgICBzdHJlYW1fYWNjZXNzLT5Mb2FkQWxsRGF0YVJhdygpOworCisgICAgICAgIGlmIChJc0NpcGhlckFFUygpICYmIHN0cmVhbV9hY2Nlc3MtPkdldFNpemUoKSA8IDE2KSB7CisgICAgICAgICAgc3RyZWFtLT5TZXREYXRhKG51bGxwdHIsIDApOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiBkZWNyeXB0ZWRfYnVmOworICAgICAgICBkZWNyeXB0ZWRfYnVmLkVzdGltYXRlU2l6ZShEZWNyeXB0R2V0U2l6ZShzdHJlYW1fYWNjZXNzLT5HZXRTaXplKCkpKTsKKworICAgICAgICB2b2lkKiBjb250ZXh0ID0gRGVjcnlwdFN0YXJ0KG9ial9udW0sIGdlbl9udW0pOworICAgICAgICBib29sIGRlY3J5cHRfcmVzdWx0ID0KKyAgICAgICAgICAgIERlY3J5cHRTdHJlYW0oY29udGV4dCwgc3RyZWFtX2FjY2Vzcy0+R2V0RGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fYWNjZXNzLT5HZXRTaXplKCksIGRlY3J5cHRlZF9idWYpOworICAgICAgICBkZWNyeXB0X3Jlc3VsdCAmPSBEZWNyeXB0RmluaXNoKGNvbnRleHQsIGRlY3J5cHRlZF9idWYpOworICAgICAgICBpZiAoZGVjcnlwdF9yZXN1bHQpIHsKKyAgICAgICAgICBjb25zdCB1aW50MzJfdCBkZWNyeXB0ZWRfc2l6ZSA9IGRlY3J5cHRlZF9idWYuR2V0U2l6ZSgpOworICAgICAgICAgIHN0cmVhbS0+U2V0RGF0YShkZWNyeXB0ZWRfYnVmLkRldGFjaEJ1ZmZlcigpLCBkZWNyeXB0ZWRfc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gRGVjcnlwdGlvbiBmYWlsZWQsIHNldCB0aGUgc3RyZWFtIHRvIGVtcHR5CisgICAgICAgICAgc3RyZWFtLT5TZXREYXRhKG51bGxwdHIsIDApOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8vIFNpZ25hdHVyZSBkaWN0aW9uYXJpZXMgY2hlY2suCisgICAgd2hpbGUgKCFtYXlfYmVfc2lnbl9kaWN0aW9uYXJpZXMuZW1wdHkoKSkgeworICAgICAgYXV0byBkaWN0X2FuZF9jb250ZW50cyA9IHN0ZDo6bW92ZShtYXlfYmVfc2lnbl9kaWN0aW9uYXJpZXMudG9wKCkpOworICAgICAgbWF5X2JlX3NpZ25fZGljdGlvbmFyaWVzLnBvcCgpOworICAgICAgaWYgKCFJc1NpZ25hdHVyZURpY3Rpb25hcnkoZGljdF9hbmRfY29udGVudHMucGFyZW50KSkgeworICAgICAgICAvLyBUaGlzIGlzIG5vdCBzaWduYXR1cmUgZGljdGlvbmFyeS4gRG8gZGVjcnlwdCBpdHMgY29udGVudHMuCisgICAgICAgIG9iamVjdF90b19kZWNyeXB0ID0gZGljdF9hbmRfY29udGVudHMuY29udGVudHM7CiAgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfSBlbHNlIGlmIChjaXBoZXIgPT0gRlhDSVBIRVJfQUVTMikgewotICAgIGlmIChrZXlsZW4gIT0gMzIpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoY2lwaGVyID09IEZYQ0lQSEVSX1JDNCkgewotICAgIGlmIChrZXlsZW4gPCA1IHx8IGtleWxlbiA+IDE2KSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChrZXlsZW4gPiAzMikgewotICAgICAga2V5bGVuID0gMzI7CisgICAgICB9CiAgICAgfQogICB9Ci0gIG1fQ2lwaGVyID0gY2lwaGVyOwotICBtX0tleUxlbiA9IGtleWxlbjsKLSAgRlhTWVNfbWVtY3B5KG1fRW5jcnlwdEtleSwga2V5LCBrZXlsZW4pOwotICBpZiAobV9DaXBoZXIgPT0gRlhDSVBIRVJfQUVTKSB7Ci0gICAgbV9wQUVTQ29udGV4dCA9IEZYX0FsbG9jKHVpbnQ4X3QsIDIwNDgpOwotICB9Ci0gIHJldHVybiB0cnVlOworICByZXR1cm4gb2JqZWN0OwogfQorCiBib29sIENQREZfQ3J5cHRvSGFuZGxlcjo6RGVjcnlwdFN0cmVhbSh2b2lkKiBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY19zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiYgZGVzdF9idWYpIHsKICAgcmV0dXJuIENyeXB0U3RyZWFtKGNvbnRleHQsIHNyY19idWYsIHNyY19zaXplLCBkZXN0X2J1ZiwgZmFsc2UpOwogfQorCiBib29sIENQREZfQ3J5cHRvSGFuZGxlcjo6RGVjcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1ZikgewogICByZXR1cm4gQ3J5cHRGaW5pc2goY29udGV4dCwgZGVzdF9idWYsIGZhbHNlKTsKIH0KQEAgLTMxMiw2ICszODQsNyBAQAogICB9CiAgIHJldHVybiBzcmNfc2l6ZTsKIH0KKwogYm9vbCBDUERGX0NyeXB0b0hhbmRsZXI6OkVuY3J5cHRDb250ZW50KHVpbnQzMl90IG9iam51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5udW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKQEAgLTMyMSwxOSArMzk0LDI5IEBACiAgIENyeXB0QmxvY2sodHJ1ZSwgb2JqbnVtLCBnZW5udW0sIHNyY19idWYsIHNyY19zaXplLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKICAgcmV0dXJuIHRydWU7CiB9Ci1DUERGX0NyeXB0b0hhbmRsZXI6OkNQREZfQ3J5cHRvSGFuZGxlcigpIHsKLSAgbV9wQUVTQ29udGV4dCA9IG51bGxwdHI7Ci0gIG1fQ2lwaGVyID0gRlhDSVBIRVJfTk9ORTsKLSAgbV9LZXlMZW4gPSAwOworCitDUERGX0NyeXB0b0hhbmRsZXI6OkNQREZfQ3J5cHRvSGFuZGxlcihpbnQgY2lwaGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCoga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleWxlbikKKyAgICA6IG1fS2V5TGVuKHN0ZDo6bWluKGtleWxlbiwgMzIpKSwgbV9DaXBoZXIoY2lwaGVyKSB7CisgIEFTU0VSVChjaXBoZXIgIT0gRlhDSVBIRVJfQUVTIHx8IGtleWxlbiA9PSAxNiB8fCBrZXlsZW4gPT0gMjQgfHwKKyAgICAgICAgIGtleWxlbiA9PSAzMik7CisgIEFTU0VSVChjaXBoZXIgIT0gRlhDSVBIRVJfQUVTMiB8fCBrZXlsZW4gPT0gMzIpOworICBBU1NFUlQoY2lwaGVyICE9IEZYQ0lQSEVSX1JDNCB8fCAoa2V5bGVuID49IDUgJiYga2V5bGVuIDw9IDE2KSk7CisKKyAgaWYgKG1fQ2lwaGVyICE9IEZYQ0lQSEVSX05PTkUpCisgICAgbWVtY3B5KG1fRW5jcnlwdEtleSwga2V5LCBtX0tleUxlbik7CisKKyAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX0FFUykKKyAgICBtX3BBRVNDb250ZXh0LnJlc2V0KEZYX0FsbG9jKENSWVBUX2Flc19jb250ZXh0LCAxKSk7CiB9Ci1DUERGX0NyeXB0b0hhbmRsZXI6On5DUERGX0NyeXB0b0hhbmRsZXIoKSB7Ci0gIEZYX0ZyZWUobV9wQUVTQ29udGV4dCk7Ci19CisKK0NQREZfQ3J5cHRvSGFuZGxlcjo6fkNQREZfQ3J5cHRvSGFuZGxlcigpIHt9CiAKIHZvaWQgQ1BERl9DcnlwdG9IYW5kbGVyOjpQb3B1bGF0ZUtleSh1aW50MzJfdCBvYmpudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VubnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGtleSkgewotICBGWFNZU19tZW1jcHkoa2V5LCBtX0VuY3J5cHRLZXksIG1fS2V5TGVuKTsKKyAgbWVtY3B5KGtleSwgbV9FbmNyeXB0S2V5LCBtX0tleUxlbik7CiAgIGtleVttX0tleUxlbiArIDBdID0gKHVpbnQ4X3Qpb2JqbnVtOwogICBrZXlbbV9LZXlMZW4gKyAxXSA9ICh1aW50OF90KShvYmpudW0gPj4gOCk7CiAgIGtleVttX0tleUxlbiArIDJdID0gKHVpbnQ4X3QpKG9iam51bSA+PiAxNik7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfY3J5cHRvX2hhbmRsZXIuaCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9jcnlwdG9faGFuZGxlci5oCmluZGV4IDYzYTI1OTAuLjMyZWVhZWYgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9jcnlwdG9faGFuZGxlci5oCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9jcnlwdG9faGFuZGxlci5oCkBAIC03LDI4ICs3LDI5IEBACiAjaWZuZGVmIENPUkVfRlBERkFQSV9QQVJTRVJfQ1BERl9DUllQVE9fSEFORExFUl9IXwogI2RlZmluZSBDT1JFX0ZQREZBUElfUEFSU0VSX0NQREZfQ1JZUFRPX0hBTkRMRVJfSF8KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJjb3JlL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfYmluYXJ5YnVmLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9tZW1vcnkuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCiAKIGNsYXNzIENQREZfRGljdGlvbmFyeTsKK2NsYXNzIENQREZfT2JqZWN0OwogY2xhc3MgQ1BERl9TZWN1cml0eUhhbmRsZXI7CiAKIGNsYXNzIENQREZfQ3J5cHRvSGFuZGxlciB7CiAgcHVibGljOgotICBDUERGX0NyeXB0b0hhbmRsZXIoKTsKKyAgQ1BERl9DcnlwdG9IYW5kbGVyKGludCBjaXBoZXIsIGNvbnN0IHVpbnQ4X3QqIGtleSwgaW50IGtleWxlbik7CiAgIH5DUERGX0NyeXB0b0hhbmRsZXIoKTsKIAotICBib29sIEluaXQoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsCi0gICAgICAgICAgICBDUERGX1NlY3VyaXR5SGFuZGxlciogcFNlY3VyaXR5SGFuZGxlcik7Ci0gIHVpbnQzMl90IERlY3J5cHRHZXRTaXplKHVpbnQzMl90IHNyY19zaXplKTsKLSAgdm9pZCogRGVjcnlwdFN0YXJ0KHVpbnQzMl90IG9iam51bSwgdWludDMyX3QgZ2VubnVtKTsKLSAgdm9pZCBEZWNyeXB0KHVpbnQzMl90IG9iam51bSwgdWludDMyX3QgZ2VubnVtLCBDRlhfQnl0ZVN0cmluZyYgc3RyKTsKLSAgYm9vbCBEZWNyeXB0U3RyZWFtKHZvaWQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAotICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7Ci0gIGJvb2wgRGVjcnlwdEZpbmlzaCh2b2lkKiBjb250ZXh0LCBDRlhfQmluYXJ5QnVmJiBkZXN0X2J1Zik7CisgIHN0YXRpYyBib29sIElzU2lnbmF0dXJlRGljdGlvbmFyeShjb25zdCBDUERGX0RpY3Rpb25hcnkqIGRpY3Rpb25hcnkpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gRGVjcnlwdE9iamVjdFRyZWUoCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IG9iamVjdCk7CisKICAgdWludDMyX3QgRW5jcnlwdEdldFNpemUodWludDMyX3Qgb2JqbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2ZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLApAQCAtNDAsOSArNDEsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwKICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgZGVzdF9zaXplKTsKIAotICBib29sIEluaXQoaW50IGNpcGhlciwgY29uc3QgdWludDhfdCoga2V5LCBpbnQga2V5bGVuKTsKKyAgYm9vbCBJc0NpcGhlckFFUygpIGNvbnN0OwogCi0gcHJvdGVjdGVkOgorIHByaXZhdGU6CisgIHVpbnQzMl90IERlY3J5cHRHZXRTaXplKHVpbnQzMl90IHNyY19zaXplKTsKKyAgdm9pZCogRGVjcnlwdFN0YXJ0KHVpbnQzMl90IG9iam51bSwgdWludDMyX3QgZ2VubnVtKTsKKyAgQnl0ZVN0cmluZyBEZWNyeXB0KHVpbnQzMl90IG9iam51bSwgdWludDMyX3QgZ2VubnVtLCBjb25zdCBCeXRlU3RyaW5nJiBzdHIpOworICBib29sIERlY3J5cHRTdHJlYW0odm9pZCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKTsKKyAgYm9vbCBEZWNyeXB0RmluaXNoKHZvaWQqIGNvbnRleHQsIENGWF9CaW5hcnlCdWYmIGRlc3RfYnVmKTsKKworICB2b2lkIFBvcHVsYXRlS2V5KHVpbnQzMl90IG9iam51bSwgdWludDMyX3QgZ2VubnVtLCB1aW50OF90KiBrZXkpOwogICB2b2lkIENyeXB0QmxvY2soYm9vbCBiRW5jcnlwdCwKICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9iam51bSwKICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbm51bSwKQEAgLTYxLDEwICs3Miw3IEBACiAgIHVpbnQ4X3QgbV9FbmNyeXB0S2V5WzMyXTsKICAgaW50IG1fS2V5TGVuOwogICBpbnQgbV9DaXBoZXI7Ci0gIHVpbnQ4X3QqIG1fcEFFU0NvbnRleHQ7Ci0KLSBwcml2YXRlOgotICB2b2lkIFBvcHVsYXRlS2V5KHVpbnQzMl90IG9iam51bSwgdWludDMyX3QgZ2VubnVtLCB1aW50OF90KiBrZXkpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1JZUFRfYWVzX2NvbnRleHQsIEZ4RnJlZURlbGV0ZXI+IG1fcEFFU0NvbnRleHQ7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9QQVJTRVJfQ1BERl9DUllQVE9fSEFORExFUl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RhdGFfYXZhaWwuY3BwIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RhdGFfYXZhaWwuY3BwCmluZGV4IDY0ZWFmMmEuLmFmODBmZDkgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kYXRhX2F2YWlsLmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGF0YV9hdmFpbC5jcHAKQEAgLTEyLDI4MSArMTIsMTI1IEBACiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvY3BkZl9tb2R1bGVtZ3IuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfY3Jvc3NfcmVmX2F2YWlsLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfaGludF90YWJsZXMuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbGluZWFyaXplZF9oZWFkZXIuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbmFtZS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9udW1iZXIuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFnZV9vYmplY3RfYXZhaWwuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVhZF92YWxpZGF0b3IuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVmZXJlbmNlLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfdXRpbGl0eS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfbWVtb3J5c3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9leHRlbnNpb24uaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfY29udmVyc2lvbnMuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgogCituYW1lc3BhY2UgeworCisvLyBzdGF0aWMKK2NvbnN0IENQREZfT2JqZWN0KiBHZXRSZXNvdXJjZU9iamVjdChjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSB7CisgIGNvbnN0ZXhwciBzaXplX3Qga01heEhpZXJhcmNoeURlcHRoID0gNjQ7CisgIHNpemVfdCBkZXB0aCA9IDA7CisKKyAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBkaWN0aW9uYXJ5X3RvX2NoZWNrID0gcERpY3Q7CisgIHdoaWxlIChkaWN0aW9uYXJ5X3RvX2NoZWNrKSB7CisgICAgY29uc3QgQ1BERl9PYmplY3QqIHJlc3VsdCA9IGRpY3Rpb25hcnlfdG9fY2hlY2stPkdldE9iamVjdEZvcigiUmVzb3VyY2VzIik7CisgICAgaWYgKHJlc3VsdCkKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgY29uc3QgQ1BERl9PYmplY3QqIHBhcmVudCA9IGRpY3Rpb25hcnlfdG9fY2hlY2stPkdldE9iamVjdEZvcigiUGFyZW50Iik7CisgICAgZGljdGlvbmFyeV90b19jaGVjayA9IHBhcmVudCA/IHBhcmVudC0+R2V0RGljdCgpIDogbnVsbHB0cjsKKworICAgIGlmICgrK2RlcHRoID4ga01heEhpZXJhcmNoeURlcHRoKSB7CisgICAgICAvLyBXZSBoYXZlIGN5Y2xlIGluIHBhcmVudHMgaGllcmFyY2h5LgorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICB9CisgIHJldHVybiBudWxscHRyOworfQorCitjbGFzcyBIaW50c1Njb3BlIHsKKyBwdWJsaWM6CisgIEhpbnRzU2NvcGUoQ1BERl9SZWFkVmFsaWRhdG9yKiB2YWxpZGF0b3IsCisgICAgICAgICAgICAgQ1BERl9EYXRhQXZhaWw6OkRvd25sb2FkSGludHMqIGhpbnRzKQorICAgICAgOiB2YWxpZGF0b3JfKHZhbGlkYXRvcikgeworICAgIEFTU0VSVCh2YWxpZGF0b3JfKTsKKyAgICB2YWxpZGF0b3JfLT5TZXREb3dubG9hZEhpbnRzKGhpbnRzKTsKKyAgfQorCisgIH5IaW50c1Njb3BlKCkgeyB2YWxpZGF0b3JfLT5TZXREb3dubG9hZEhpbnRzKG51bGxwdHIpOyB9CisKKyBwcml2YXRlOgorICBVbm93bmVkUHRyPENQREZfUmVhZFZhbGlkYXRvcj4gdmFsaWRhdG9yXzsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCiBDUERGX0RhdGFBdmFpbDo6RmlsZUF2YWlsOjp+RmlsZUF2YWlsKCkge30KIAogQ1BERl9EYXRhQXZhaWw6OkRvd25sb2FkSGludHM6On5Eb3dubG9hZEhpbnRzKCkge30KIAotLy8gc3RhdGljCi1pbnQgQ1BERl9EYXRhQXZhaWw6OnNfQ3VycmVudERhdGFBdmFpbFJlY3Vyc2lvbkRlcHRoID0gMDsKLQogQ1BERl9EYXRhQXZhaWw6OkNQREZfRGF0YUF2YWlsKAogICAgIEZpbGVBdmFpbCogcEZpbGVBdmFpbCwKLSAgICBjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZVJlYWQsCisgICAgY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZVJlYWQsCiAgICAgYm9vbCBiU3VwcG9ydEhpbnRUYWJsZSkKLSAgICA6IG1fcEZpbGVBdmFpbChwRmlsZUF2YWlsKSwgbV9wRmlsZVJlYWQocEZpbGVSZWFkKSB7Ci0gIG1fUG9zID0gMDsKLSAgbV9kd0ZpbGVMZW4gPSAwOwotICBpZiAobV9wRmlsZVJlYWQpIHsKLSAgICBtX2R3RmlsZUxlbiA9ICh1aW50MzJfdCltX3BGaWxlUmVhZC0+R2V0U2l6ZSgpOwotICB9Ci0gIG1fZHdDdXJyZW50T2Zmc2V0ID0gMDsKLSAgbV9kd1hSZWZPZmZzZXQgPSAwOwotICBtX2R3VHJhaWxlck9mZnNldCA9IDA7Ci0gIG1fYnVmZmVyT2Zmc2V0ID0gMDsKLSAgbV9idWZmZXJTaXplID0gMDsKLSAgbV9QYWdlc09iak51bSA9IDA7Ci0gIG1fZHdDdXJyZW50WFJlZlN0ZWFtID0gMDsKLSAgbV9kd0Fjcm9Gb3JtT2JqTnVtID0gMDsKLSAgbV9kd0luZm9PYmpOdW0gPSAwOwotICBtX3BEb2N1bWVudCA9IDA7Ci0gIG1fZHdFbmNyeXB0T2JqTnVtID0gMDsKLSAgbV9kd1ByZXZYUmVmT2Zmc2V0ID0gMDsKLSAgbV9kd0xhc3RYUmVmT2Zmc2V0ID0gMDsKLSAgbV9iRG9jQXZhaWwgPSBmYWxzZTsKLSAgbV9iTWFpblhSZWZMb2FkVHJpZWQgPSBmYWxzZTsKLSAgbV9iRG9jQXZhaWwgPSBmYWxzZTsKLSAgbV9iUGFnZXNMb2FkID0gZmFsc2U7Ci0gIG1fYlBhZ2VzVHJlZUxvYWQgPSBmYWxzZTsKLSAgbV9iTWFpblhSZWZMb2FkZWRPSyA9IGZhbHNlOwotICBtX2JBbm5vdHNMb2FkID0gZmFsc2U7Ci0gIG1fYkhhdmVBY3JvRm9ybSA9IGZhbHNlOwotICBtX2JBY3JvRm9ybUxvYWQgPSBmYWxzZTsKLSAgbV9iUGFnZUxvYWRlZE9LID0gZmFsc2U7Ci0gIG1fYk5lZWREb3duTG9hZFJlc291cmNlID0gZmFsc2U7Ci0gIG1fYkxpbmVhcml6ZWRGb3JtUGFyYW1Mb2FkID0gZmFsc2U7Ci0gIG1fcFRyYWlsZXIgPSBudWxscHRyOwotICBtX3BDdXJyZW50UGFyc2VyID0gbnVsbHB0cjsKLSAgbV9wQWNyb0Zvcm0gPSBudWxscHRyOwotICBtX3BQYWdlRGljdCA9IG51bGxwdHI7Ci0gIG1fcFBhZ2VSZXNvdXJjZSA9IG51bGxwdHI7Ci0gIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9IRUFERVI7Ci0gIG1fYlRvdGFsTG9hZFBhZ2VUcmVlID0gZmFsc2U7Ci0gIG1fYkN1clBhZ2VEaWN0TG9hZE9LID0gZmFsc2U7Ci0gIG1fYkxpbmVhcmVkRGF0YU9LID0gZmFsc2U7Ci0gIG1fYlN1cHBvcnRIaW50VGFibGUgPSBiU3VwcG9ydEhpbnRUYWJsZTsKLX0KKyAgICA6IG1fcEZpbGVBdmFpbChwRmlsZUF2YWlsKSwKKyAgICAgIG1fcEZpbGVSZWFkKAorICAgICAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDUERGX1JlYWRWYWxpZGF0b3I+KHBGaWxlUmVhZCwgbV9wRmlsZUF2YWlsKSksCisgICAgICBtX2R3RmlsZUxlbihtX3BGaWxlUmVhZC0+R2V0U2l6ZSgpKSwKKyAgICAgIG1fYlN1cHBvcnRIaW50VGFibGUoYlN1cHBvcnRIaW50VGFibGUpIHt9CiAKIENQREZfRGF0YUF2YWlsOjp+Q1BERl9EYXRhQXZhaWwoKSB7CiAgIG1fcEhpbnRUYWJsZXMucmVzZXQoKTsKLSAgZm9yIChDUERGX09iamVjdCogcE9iamVjdCA6IG1fYXJyYXlBY3JvZm9ybXMpCi0gICAgZGVsZXRlIHBPYmplY3Q7Ci19Ci0KLXZvaWQgQ1BERl9EYXRhQXZhaWw6OlNldERvY3VtZW50KENQREZfRG9jdW1lbnQqIHBEb2MpIHsKLSAgbV9wRG9jdW1lbnQgPSBwRG9jOwotfQotCi11aW50MzJfdCBDUERGX0RhdGFBdmFpbDo6R2V0T2JqZWN0U2l6ZSh1aW50MzJfdCBvYmpudW0sIEZYX0ZJTEVTSVpFJiBvZmZzZXQpIHsKLSAgQ1BERl9QYXJzZXIqIHBQYXJzZXIgPSBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCk7Ci0gIGlmICghcFBhcnNlciB8fCAhcFBhcnNlci0+SXNWYWxpZE9iamVjdE51bWJlcihvYmpudW0pKQotICAgIHJldHVybiAwOwotCi0gIGlmIChwUGFyc2VyLT5HZXRPYmplY3RUeXBlKG9iam51bSkgPT0gMikKLSAgICBvYmpudW0gPSBwUGFyc2VyLT5HZXRPYmplY3RQb3NpdGlvbk9yWmVybyhvYmpudW0pOwotCi0gIGlmIChwUGFyc2VyLT5HZXRPYmplY3RUeXBlKG9iam51bSkgIT0gMSAmJgotICAgICAgcFBhcnNlci0+R2V0T2JqZWN0VHlwZShvYmpudW0pICE9IDI1NSkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgb2Zmc2V0ID0gcFBhcnNlci0+R2V0T2JqZWN0UG9zaXRpb25Pclplcm8ob2JqbnVtKTsKLSAgaWYgKG9mZnNldCA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIGF1dG8gaXQgPSBwUGFyc2VyLT5tX1NvcnRlZE9mZnNldC5maW5kKG9mZnNldCk7Ci0gIGlmIChpdCA9PSBwUGFyc2VyLT5tX1NvcnRlZE9mZnNldC5lbmQoKSB8fAotICAgICAgKytpdCA9PSBwUGFyc2VyLT5tX1NvcnRlZE9mZnNldC5lbmQoKSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiAqaXQgLSBvZmZzZXQ7Ci19Ci0KLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkFyZU9iamVjdHNBdmFpbGFibGUoc3RkOjp2ZWN0b3I8Q1BERl9PYmplY3QqPiYgb2JqX2FycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJQYXJzZVBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvd25sb2FkSGludHMqIHBIaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q1BERl9PYmplY3QqPiYgcmV0X2FycmF5KSB7Ci0gIGlmIChvYmpfYXJyYXkuZW1wdHkoKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICB1aW50MzJfdCBjb3VudCA9IDA7Ci0gIHN0ZDo6dmVjdG9yPENQREZfT2JqZWN0Kj4gbmV3X29ial9hcnJheTsKLSAgZm9yIChDUERGX09iamVjdCogcE9iaiA6IG9ial9hcnJheSkgewotICAgIGlmICghcE9iaikKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgaW50MzJfdCB0eXBlID0gcE9iai0+R2V0VHlwZSgpOwotICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgY2FzZSBDUERGX09iamVjdDo6QVJSQVk6IHsKLSAgICAgICAgQ1BERl9BcnJheSogcEFycmF5ID0gcE9iai0+QXNBcnJheSgpOwotICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IHBBcnJheS0+R2V0Q291bnQoKTsgKytrKQotICAgICAgICAgIG5ld19vYmpfYXJyYXkucHVzaF9iYWNrKHBBcnJheS0+R2V0T2JqZWN0QXQoaykpOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgQ1BERl9PYmplY3Q6OlNUUkVBTToKLSAgICAgICAgcE9iaiA9IHBPYmotPkdldERpY3QoKTsKLSAgICAgIGNhc2UgQ1BERl9PYmplY3Q6OkRJQ1RJT05BUlk6IHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBPYmotPkdldERpY3QoKTsKLSAgICAgICAgaWYgKHBEaWN0ICYmIHBEaWN0LT5HZXRTdHJpbmdGb3IoIlR5cGUiKSA9PSAiUGFnZSIgJiYgIWJQYXJzZVBhZ2UpCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICpwRGljdCkgewotICAgICAgICAgIGlmIChpdC5maXJzdCAhPSAiUGFyZW50IikKLSAgICAgICAgICAgIG5ld19vYmpfYXJyYXkucHVzaF9iYWNrKGl0LnNlY29uZC5nZXQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIENQREZfT2JqZWN0OjpSRUZFUkVOQ0U6IHsKLSAgICAgICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSBwT2JqLT5Bc1JlZmVyZW5jZSgpOwotICAgICAgICB1aW50MzJfdCBkd051bSA9IHBSZWYtPkdldFJlZk9iak51bSgpOwotCi0gICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldDsKLSAgICAgICAgdWludDMyX3Qgc2l6ZSA9IEdldE9iamVjdFNpemUoZHdOdW0sIG9mZnNldCk7Ci0gICAgICAgIGlmIChzaXplID09IDAgfHwgb2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gbV9kd0ZpbGVMZW4pCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKCFJc0RhdGFBdmFpbChvZmZzZXQsIHNpemUsIHBIaW50cykpIHsKLSAgICAgICAgICByZXRfYXJyYXkucHVzaF9iYWNrKHBPYmopOwotICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgIH0gZWxzZSBpZiAoIXBkZml1bTo6Q29udGFpbnNLZXkobV9PYmplY3RTZXQsIGR3TnVtKSkgewotICAgICAgICAgIG1fT2JqZWN0U2V0Lmluc2VydChkd051bSk7Ci0gICAgICAgICAgQ1BERl9PYmplY3QqIHBSZWZlcnJlZCA9Ci0gICAgICAgICAgICAgIG1fcERvY3VtZW50LT5HZXRPclBhcnNlSW5kaXJlY3RPYmplY3QocFJlZi0+R2V0UmVmT2JqTnVtKCkpOwotICAgICAgICAgIGlmIChwUmVmZXJyZWQpCi0gICAgICAgICAgICBuZXdfb2JqX2FycmF5LnB1c2hfYmFjayhwUmVmZXJyZWQpOwotICAgICAgICB9Ci0gICAgICB9IGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGlmIChjb3VudCA+IDApIHsKLSAgICBmb3IgKENQREZfT2JqZWN0KiBwT2JqIDogbmV3X29ial9hcnJheSkgewotICAgICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSBwT2JqLT5Bc1JlZmVyZW5jZSgpOwotICAgICAgaWYgKHBSZWYgJiYgcGRmaXVtOjpDb250YWluc0tleShtX09iamVjdFNldCwgcFJlZi0+R2V0UmVmT2JqTnVtKCkpKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIHJldF9hcnJheS5wdXNoX2JhY2socE9iaik7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIG9ial9hcnJheSA9IG5ld19vYmpfYXJyYXk7Ci0gIHJldHVybiBBcmVPYmplY3RzQXZhaWxhYmxlKG9ial9hcnJheSwgZmFsc2UsIHBIaW50cywgcmV0X2FycmF5KTsKIH0KIAogQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzIENQREZfRGF0YUF2YWlsOjpJc0RvY0F2YWlsKAogICAgIERvd25sb2FkSGludHMqIHBIaW50cykgewotICBpZiAoIW1fZHdGaWxlTGVuICYmIG1fcEZpbGVSZWFkKSB7Ci0gICAgbV9kd0ZpbGVMZW4gPSAodWludDMyX3QpbV9wRmlsZVJlYWQtPkdldFNpemUoKTsKLSAgICBpZiAoIW1fZHdGaWxlTGVuKQotICAgICAgcmV0dXJuIERhdGFFcnJvcjsKLSAgfQorICBpZiAoIW1fZHdGaWxlTGVuKQorICAgIHJldHVybiBEYXRhRXJyb3I7CisKKyAgY29uc3QgSGludHNTY29wZSBoaW50c19zY29wZShtX3BGaWxlUmVhZC5HZXQoKSwgcEhpbnRzKTsKIAogICB3aGlsZSAoIW1fYkRvY0F2YWlsKSB7Ci0gICAgaWYgKCFDaGVja0RvY1N0YXR1cyhwSGludHMpKQorICAgIGlmICghQ2hlY2tEb2NTdGF0dXMoKSkKICAgICAgIHJldHVybiBEYXRhTm90QXZhaWxhYmxlOwogICB9CiAKICAgcmV0dXJuIERhdGFBdmFpbGFibGU7CiB9CiAKLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrQWNyb0Zvcm1TdWJPYmplY3QoRG93bmxvYWRIaW50cyogcEhpbnRzKSB7Ci0gIGlmIChtX29ianNfYXJyYXkuZW1wdHkoKSkgewotICAgIG1fT2JqZWN0U2V0LmNsZWFyKCk7Ci0gICAgc3RkOjp2ZWN0b3I8Q1BERl9PYmplY3QqPiBvYmpfYXJyYXkgPSBtX2FycmF5QWNyb2Zvcm1zOwotICAgIGlmICghQXJlT2JqZWN0c0F2YWlsYWJsZShvYmpfYXJyYXksIGZhbHNlLCBwSGludHMsIG1fb2Jqc19hcnJheSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBtX29ianNfYXJyYXkuY2xlYXIoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPENQREZfT2JqZWN0Kj4gbmV3X29ianNfYXJyYXk7Ci0gIGlmICghQXJlT2JqZWN0c0F2YWlsYWJsZShtX29ianNfYXJyYXksIGZhbHNlLCBwSGludHMsIG5ld19vYmpzX2FycmF5KSkgewotICAgIG1fb2Jqc19hcnJheSA9IG5ld19vYmpzX2FycmF5OwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZvciAoQ1BERl9PYmplY3QqIHBPYmplY3QgOiBtX2FycmF5QWNyb2Zvcm1zKQotICAgIGRlbGV0ZSBwT2JqZWN0OwotCi0gIG1fYXJyYXlBY3JvZm9ybXMuY2xlYXIoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrQWNyb0Zvcm0oRG93bmxvYWRIaW50cyogcEhpbnRzKSB7Ci0gIGJvb2wgYkV4aXN0ID0gZmFsc2U7Ci0gIG1fcEFjcm9Gb3JtID0gR2V0T2JqZWN0KG1fZHdBY3JvRm9ybU9iak51bSwgcEhpbnRzLCAmYkV4aXN0KS5yZWxlYXNlKCk7Ci0gIGlmICghYkV4aXN0KSB7Ci0gICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0VUUkVFOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgaWYgKCFtX3BBY3JvRm9ybSkgewotICAgIGlmIChtX2RvY1N0YXR1cyA9PSBQREZfREFUQUFWQUlMX0VSUk9SKSB7Ci0gICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgbV9hcnJheUFjcm9mb3Jtcy5wdXNoX2JhY2sobV9wQWNyb0Zvcm0pOwotICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRVRSRUU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENQREZfRGF0YUF2YWlsOjpDaGVja0RvY1N0YXR1cyhEb3dubG9hZEhpbnRzKiBwSGludHMpIHsKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrRG9jU3RhdHVzKCkgewogICBzd2l0Y2ggKG1fZG9jU3RhdHVzKSB7CiAgICAgY2FzZSBQREZfREFUQUFWQUlMX0hFQURFUjoKLSAgICAgIHJldHVybiBDaGVja0hlYWRlcihwSGludHMpOworICAgICAgcmV0dXJuIENoZWNrSGVhZGVyKCk7CiAgICAgY2FzZSBQREZfREFUQUFWQUlMX0ZJUlNUUEFHRToKLSAgICAgIHJldHVybiBDaGVja0ZpcnN0UGFnZShwSGludHMpOworICAgICAgcmV0dXJuIENoZWNrRmlyc3RQYWdlKCk7CiAgICAgY2FzZSBQREZfREFUQUFWQUlMX0hJTlRUQUJMRToKLSAgICAgIHJldHVybiBDaGVja0hpbnRUYWJsZXMocEhpbnRzKTsKLSAgICBjYXNlIFBERl9EQVRBQVZBSUxfRU5EOgotICAgICAgcmV0dXJuIENoZWNrRW5kKHBIaW50cyk7Ci0gICAgY2FzZSBQREZfREFUQUFWQUlMX0NST1NTUkVGOgotICAgICAgcmV0dXJuIENoZWNrQ3Jvc3NSZWYocEhpbnRzKTsKLSAgICBjYXNlIFBERl9EQVRBQVZBSUxfQ1JPU1NSRUZfSVRFTToKLSAgICAgIHJldHVybiBDaGVja0Nyb3NzUmVmSXRlbShwSGludHMpOwotICAgIGNhc2UgUERGX0RBVEFBVkFJTF9DUk9TU1JFRl9TVFJFQU06Ci0gICAgICByZXR1cm4gQ2hlY2tBbGxDcm9zc1JlZlN0cmVhbShwSGludHMpOwotICAgIGNhc2UgUERGX0RBVEFBVkFJTF9UUkFJTEVSOgotICAgICAgcmV0dXJuIENoZWNrVHJhaWxlcihwSGludHMpOwotICAgIGNhc2UgUERGX0RBVEFBVkFJTF9UUkFJTEVSX0FQUEVORDoKLSAgICAgIHJldHVybiBDaGVja1RyYWlsZXJBcHBlbmQocEhpbnRzKTsKKyAgICAgIHJldHVybiBDaGVja0hpbnRUYWJsZXMoKTsKICAgICBjYXNlIFBERl9EQVRBQVZBSUxfTE9BREFMTENST1NTUkVGOgotICAgICAgcmV0dXJuIExvYWRBbGxYcmVmKHBIaW50cyk7CisgICAgICByZXR1cm4gQ2hlY2tBbmRMb2FkQWxsWHJlZigpOwogICAgIGNhc2UgUERGX0RBVEFBVkFJTF9MT0FEQUxMRklMRToKLSAgICAgIHJldHVybiBMb2FkQWxsRmlsZShwSGludHMpOworICAgICAgcmV0dXJuIExvYWRBbGxGaWxlKCk7CiAgICAgY2FzZSBQREZfREFUQUFWQUlMX1JPT1Q6Ci0gICAgICByZXR1cm4gQ2hlY2tSb290KHBIaW50cyk7CisgICAgICByZXR1cm4gQ2hlY2tSb290KCk7CiAgICAgY2FzZSBQREZfREFUQUFWQUlMX0lORk86Ci0gICAgICByZXR1cm4gQ2hlY2tJbmZvKHBIaW50cyk7Ci0gICAgY2FzZSBQREZfREFUQUFWQUlMX0FDUk9GT1JNOgotICAgICAgcmV0dXJuIENoZWNrQWNyb0Zvcm0ocEhpbnRzKTsKKyAgICAgIHJldHVybiBDaGVja0luZm8oKTsKICAgICBjYXNlIFBERl9EQVRBQVZBSUxfUEFHRVRSRUU6CiAgICAgICBpZiAobV9iVG90YWxMb2FkUGFnZVRyZWUpCi0gICAgICAgIHJldHVybiBDaGVja1BhZ2VzKHBIaW50cyk7Ci0gICAgICByZXR1cm4gTG9hZERvY1BhZ2VzKHBIaW50cyk7CisgICAgICAgIHJldHVybiBDaGVja1BhZ2VzKCk7CisgICAgICByZXR1cm4gTG9hZERvY1BhZ2VzKCk7CiAgICAgY2FzZSBQREZfREFUQUFWQUlMX1BBR0U6CiAgICAgICBpZiAobV9iVG90YWxMb2FkUGFnZVRyZWUpCi0gICAgICAgIHJldHVybiBDaGVja1BhZ2UocEhpbnRzKTsKKyAgICAgICAgcmV0dXJuIENoZWNrUGFnZSgpOwogICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0VfTEFURVJMT0FEOwogICAgICAgcmV0dXJuIHRydWU7CiAgICAgY2FzZSBQREZfREFUQUFWQUlMX0VSUk9SOgotICAgICAgcmV0dXJuIExvYWRBbGxGaWxlKHBIaW50cyk7CisgICAgICByZXR1cm4gTG9hZEFsbEZpbGUoKTsKICAgICBjYXNlIFBERl9EQVRBQVZBSUxfUEFHRV9MQVRFUkxPQUQ6CiAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRTsKICAgICBkZWZhdWx0OgpAQCAtMjk1LDE0ICsxMzksMTQgQEAKICAgfQogfQogCi1ib29sIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VTdGF0dXMoRG93bmxvYWRIaW50cyogcEhpbnRzKSB7Citib29sIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VTdGF0dXMoKSB7CiAgIHN3aXRjaCAobV9kb2NTdGF0dXMpIHsKICAgICBjYXNlIFBERl9EQVRBQVZBSUxfUEFHRVRSRUU6Ci0gICAgICByZXR1cm4gQ2hlY2tQYWdlcyhwSGludHMpOworICAgICAgcmV0dXJuIENoZWNrUGFnZXMoKTsKICAgICBjYXNlIFBERl9EQVRBQVZBSUxfUEFHRToKLSAgICAgIHJldHVybiBDaGVja1BhZ2UocEhpbnRzKTsKKyAgICAgIHJldHVybiBDaGVja1BhZ2UoKTsKICAgICBjYXNlIFBERl9EQVRBQVZBSUxfRVJST1I6Ci0gICAgICByZXR1cm4gTG9hZEFsbEZpbGUocEhpbnRzKTsKKyAgICAgIHJldHVybiBMb2FkQWxsRmlsZSgpOwogICAgIGRlZmF1bHQ6CiAgICAgICBtX2JQYWdlc1RyZWVMb2FkID0gdHJ1ZTsKICAgICAgIG1fYlBhZ2VzTG9hZCA9IHRydWU7CkBAIC0zMTAsMjAgKzE1NCw0NSBAQAogICB9CiB9CiAKLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkxvYWRBbGxGaWxlKERvd25sb2FkSGludHMqIHBIaW50cykgewotICBpZiAobV9wRmlsZUF2YWlsLT5Jc0RhdGFBdmFpbCgwLCAodWludDMyX3QpbV9kd0ZpbGVMZW4pKSB7Citib29sIENQREZfRGF0YUF2YWlsOjpMb2FkQWxsRmlsZSgpIHsKKyAgaWYgKEdldFZhbGlkYXRvcigpLT5DaGVja1dob2xlRmlsZUFuZFJlcXVlc3RJZlVuYXZhaWxhYmxlKCkpIHsKICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRE9ORTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQotCi0gIHBIaW50cy0+QWRkU2VnbWVudCgwLCAodWludDMyX3QpbV9kd0ZpbGVMZW4pOwogICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkxvYWRBbGxYcmVmKERvd25sb2FkSGludHMqIHBIaW50cykgewotICBtX3BhcnNlci5tX3BTeW50YXgtPkluaXRQYXJzZXIobV9wRmlsZVJlYWQsICh1aW50MzJfdCltX2R3SGVhZGVyT2Zmc2V0KTsKLSAgaWYgKCFtX3BhcnNlci5Mb2FkQWxsQ3Jvc3NSZWZWNChtX2R3TGFzdFhSZWZPZmZzZXQpICYmCi0gICAgICAhbV9wYXJzZXIuTG9hZEFsbENyb3NzUmVmVjUobV9kd0xhc3RYUmVmT2Zmc2V0KSkgeworYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tBbmRMb2FkQWxsWHJlZigpIHsKKyAgaWYgKCFtX3BDcm9zc1JlZkF2YWlsKSB7CisgICAgY29uc3QgQ1BERl9SZWFkVmFsaWRhdG9yOjpTZXNzaW9uIHJlYWRfc2Vzc2lvbihHZXRWYWxpZGF0b3IoKS5HZXQoKSk7CisgICAgY29uc3QgRlhfRklMRVNJWkUgbGFzdF94cmVmX29mZnNldCA9IG1fcGFyc2VyLlBhcnNlU3RhcnRYUmVmKCk7CisgICAgaWYgKEdldFZhbGlkYXRvcigpLT5oYXNfcmVhZF9wcm9ibGVtcygpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGxhc3RfeHJlZl9vZmZzZXQgPD0gMCkgeworICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fcENyb3NzUmVmQXZhaWwgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9Dcm9zc1JlZkF2YWlsPihHZXRTeW50YXhQYXJzZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF94cmVmX29mZnNldCk7CisgIH0KKworICBzd2l0Y2ggKG1fcENyb3NzUmVmQXZhaWwtPkNoZWNrQXZhaWwoKSkgeworICAgIGNhc2UgRG9jQXZhaWxTdGF0dXM6OkRhdGFBdmFpbGFibGU6CisgICAgICBicmVhazsKKyAgICBjYXNlIERvY0F2YWlsU3RhdHVzOjpEYXRhTm90QXZhaWxhYmxlOgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgRG9jQXZhaWxTdGF0dXM6OkRhdGFFcnJvcjoKKyAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBkZWZhdWx0OgorICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFtX3BhcnNlci5Mb2FkQWxsQ3Jvc3NSZWZWNChtX3BDcm9zc1JlZkF2YWlsLT5sYXN0X2Nyb3NzcmVmX29mZnNldCgpKSAmJgorICAgICAgIW1fcGFyc2VyLkxvYWRBbGxDcm9zc1JlZlY1KG1fcENyb3NzUmVmQXZhaWwtPmxhc3RfY3Jvc3NyZWZfb2Zmc2V0KCkpKSB7CiAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwogICAgIHJldHVybiBmYWxzZTsKICAgfQpAQCAtMzM2LDMwICsyMDUsMjEgQEAKIH0KIAogc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBDUERGX0RhdGFBdmFpbDo6R2V0T2JqZWN0KHVpbnQzMl90IG9iam51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3dubG9hZEhpbnRzKiBwSGludHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcEV4aXN0SW5GaWxlKSB7Ci0gIHVpbnQzMl90IHNpemUgPSAwOwotICBGWF9GSUxFU0laRSBvZmZzZXQgPSAwOwogICBDUERGX1BhcnNlciogcFBhcnNlciA9IG51bGxwdHI7CiAKICAgaWYgKHBFeGlzdEluRmlsZSkKICAgICAqcEV4aXN0SW5GaWxlID0gdHJ1ZTsKIAotICBpZiAobV9wRG9jdW1lbnQpIHsKLSAgICBzaXplID0gR2V0T2JqZWN0U2l6ZShvYmpudW0sIG9mZnNldCk7Ci0gICAgcFBhcnNlciA9IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKTsKLSAgfSBlbHNlIHsKLSAgICBzaXplID0gKHVpbnQzMl90KW1fcGFyc2VyLkdldE9iamVjdFNpemUob2JqbnVtKTsKLSAgICBvZmZzZXQgPSBtX3BhcnNlci5HZXRPYmplY3RPZmZzZXQob2JqbnVtKTsKLSAgICBwUGFyc2VyID0gJm1fcGFyc2VyOwotICB9Ci0KLSAgaWYgKCFJc0RhdGFBdmFpbChvZmZzZXQsIHNpemUsIHBIaW50cykpCi0gICAgcmV0dXJuIG51bGxwdHI7CisgIHBQYXJzZXIgPSBtX3BEb2N1bWVudCA/IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKSA6ICZtX3BhcnNlcjsKIAogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IHBSZXQ7Ci0gIGlmIChwUGFyc2VyKQorICBpZiAocFBhcnNlcikgeworICAgIGNvbnN0IENQREZfUmVhZFZhbGlkYXRvcjo6U2Vzc2lvbiByZWFkX3Nlc3Npb24oR2V0VmFsaWRhdG9yKCkuR2V0KCkpOwogICAgIHBSZXQgPSBwUGFyc2VyLT5QYXJzZUluZGlyZWN0T2JqZWN0KG51bGxwdHIsIG9iam51bSk7CisgICAgaWYgKEdldFZhbGlkYXRvcigpLT5oYXNfcmVhZF9wcm9ibGVtcygpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KIAogICBpZiAoIXBSZXQgJiYgcEV4aXN0SW5GaWxlKQogICAgICpwRXhpc3RJbkZpbGUgPSBmYWxzZTsKQEAgLTM2NywyNyArMjI3LDIzIEBACiAgIHJldHVybiBwUmV0OwogfQogCi1ib29sIENQREZfRGF0YUF2YWlsOjpDaGVja0luZm8oRG93bmxvYWRIaW50cyogcEhpbnRzKSB7Citib29sIENQREZfRGF0YUF2YWlsOjpDaGVja0luZm8oKSB7CiAgIGJvb2wgYkV4aXN0ID0gZmFsc2U7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gcEluZm8gPQotICAgICAgR2V0T2JqZWN0KG1fZHdJbmZvT2JqTnVtLCBwSGludHMsICZiRXhpc3QpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IHBJbmZvID0gR2V0T2JqZWN0KG1fZHdJbmZvT2JqTnVtLCAmYkV4aXN0KTsKICAgaWYgKGJFeGlzdCAmJiAhcEluZm8pIHsKICAgICBpZiAobV9kb2NTdGF0dXMgPT0gUERGX0RBVEFBVkFJTF9FUlJPUikgewogICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIGlmIChtX1BvcyA9PSBtX2R3RmlsZUxlbikKLSAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLSAgbV9kb2NTdGF0dXMgPQotICAgICAgbV9iSGF2ZUFjcm9Gb3JtID8gUERGX0RBVEFBVkFJTF9BQ1JPRk9STSA6IFBERl9EQVRBQVZBSUxfUEFHRVRSRUU7CisgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9QQUdFVFJFRTsKICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUm9vdChEb3dubG9hZEhpbnRzKiBwSGludHMpIHsKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUm9vdCgpIHsKICAgYm9vbCBiRXhpc3QgPSBmYWxzZTsKLSAgbV9wUm9vdCA9IEdldE9iamVjdChtX2R3Um9vdE9iak51bSwgcEhpbnRzLCAmYkV4aXN0KTsKKyAgbV9wUm9vdCA9IEdldE9iamVjdChtX2R3Um9vdE9iak51bSwgJmJFeGlzdCk7CiAgIGlmICghYkV4aXN0KSB7CiAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwogICAgIHJldHVybiB0cnVlOwpAQCAtNDE0LDI0ICsyNzAsMTMgQEAKICAgfQogCiAgIG1fUGFnZXNPYmpOdW0gPSBwUmVmLT5HZXRSZWZPYmpOdW0oKTsKLSAgQ1BERl9SZWZlcmVuY2UqIHBBY3JvRm9ybVJlZiA9Ci0gICAgICBUb1JlZmVyZW5jZShtX3BSb290LT5HZXREaWN0KCktPkdldE9iamVjdEZvcigiQWNyb0Zvcm0iKSk7Ci0gIGlmIChwQWNyb0Zvcm1SZWYpIHsKLSAgICBtX2JIYXZlQWNyb0Zvcm0gPSB0cnVlOwotICAgIG1fZHdBY3JvRm9ybU9iak51bSA9IHBBY3JvRm9ybVJlZi0+R2V0UmVmT2JqTnVtKCk7Ci0gIH0KIAotICBpZiAobV9kd0luZm9PYmpOdW0pIHsKLSAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfSU5GTzsKLSAgfSBlbHNlIHsKLSAgICBtX2RvY1N0YXR1cyA9Ci0gICAgICAgIG1fYkhhdmVBY3JvRm9ybSA/IFBERl9EQVRBQVZBSUxfQUNST0ZPUk0gOiBQREZfREFUQUFWQUlMX1BBR0VUUkVFOwotICB9CisgIG1fZG9jU3RhdHVzID0gbV9kd0luZm9PYmpOdW0gPyBQREZfREFUQUFWQUlMX0lORk8gOiBQREZfREFUQUFWQUlMX1BBR0VUUkVFOwogICByZXR1cm4gdHJ1ZTsKIH0KIAogYm9vbCBDUERGX0RhdGFBdmFpbDo6UHJlcGFyZVBhZ2VJdGVtKCkgewotICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKKyAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7CiAgIENQREZfUmVmZXJlbmNlKiBwUmVmID0KICAgICAgIFRvUmVmZXJlbmNlKHBSb290ID8gcFJvb3QtPkdldE9iamVjdEZvcigiUGFnZXMiKSA6IG51bGxwdHIpOwogICBpZiAoIXBSZWYpIHsKQEAgLTQ1MywxMiArMjk4LDExIEBACiAgIG1fcGFnZU1hcENoZWNrU3RhdGUuZXJhc2UoZHdQYWdlKTsKIH0KIAotYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlKERvd25sb2FkSGludHMqIHBIaW50cykgeworYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlKCkgewogICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gVW5hdmFpbE9iakxpc3Q7CiAgIGZvciAodWludDMyX3QgZHdQYWdlT2JqTnVtIDogbV9QYWdlT2JqTGlzdCkgewogICAgIGJvb2wgYkV4aXN0cyA9IGZhbHNlOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gcE9iaiA9Ci0gICAgICAgIEdldE9iamVjdChkd1BhZ2VPYmpOdW0sIHBIaW50cywgJmJFeGlzdHMpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gcE9iaiA9IEdldE9iamVjdChkd1BhZ2VPYmpOdW0sICZiRXhpc3RzKTsKICAgICBpZiAoIXBPYmopIHsKICAgICAgIGlmIChiRXhpc3RzKQogICAgICAgICBVbmF2YWlsT2JqTGlzdC5wdXNoX2JhY2soZHdQYWdlT2JqTnVtKTsKQEAgLTQ3NCw3ICszMTgsNyBAQAogICAgIGlmICghcE9iai0+SXNEaWN0aW9uYXJ5KCkpCiAgICAgICBjb250aW51ZTsKIAotICAgIENGWF9CeXRlU3RyaW5nIHR5cGUgPSBwT2JqLT5HZXREaWN0KCktPkdldFN0cmluZ0ZvcigiVHlwZSIpOworICAgIEJ5dGVTdHJpbmcgdHlwZSA9IHBPYmotPkdldERpY3QoKS0+R2V0U3RyaW5nRm9yKCJUeXBlIik7CiAgICAgaWYgKHR5cGUgPT0gIlBhZ2VzIikgewogICAgICAgbV9QYWdlc0FycmF5LnB1c2hfYmFjayhzdGQ6Om1vdmUocE9iaikpOwogICAgICAgY29udGludWU7CkBAIC01MjIsNyArMzY2LDggQEAKICAgICAgICAgaWYgKENQREZfUmVmZXJlbmNlKiBwUmVmID0gVG9SZWZlcmVuY2UocEtpZHNBcnJheS0+R2V0T2JqZWN0QXQoaSkpKQogICAgICAgICAgIG1fUGFnZU9iakxpc3QucHVzaF9iYWNrKHBSZWYtPkdldFJlZk9iak51bSgpKTsKICAgICAgIH0KLSAgICB9IGJyZWFrOworICAgICAgYnJlYWs7CisgICAgfQogICAgIGRlZmF1bHQ6CiAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CiAgICAgICByZXR1cm4gZmFsc2U7CkBAIC01MzAsMTAgKzM3NSw5IEBACiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VzKERvd25sb2FkSGludHMqIHBIaW50cykgeworYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlcygpIHsKICAgYm9vbCBiRXhpc3RzID0gZmFsc2U7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gcFBhZ2VzID0KLSAgICAgIEdldE9iamVjdChtX1BhZ2VzT2JqTnVtLCBwSGludHMsICZiRXhpc3RzKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBwUGFnZXMgPSBHZXRPYmplY3QobV9QYWdlc09iak51bSwgJmJFeGlzdHMpOwogICBpZiAoIWJFeGlzdHMpIHsKICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7CiAgICAgcmV0dXJuIHRydWU7CkBAIC01NTYsMzEgKzQwMCwyNyBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tIZWFkZXIoRG93bmxvYWRIaW50cyogcEhpbnRzKSB7Ci0gIEFTU0VSVChtX2R3RmlsZUxlbiA+PSAwKTsKLSAgY29uc3QgdWludDMyX3Qga1JlcVNpemUgPSBzdGQ6Om1pbihzdGF0aWNfY2FzdDx1aW50MzJfdD4obV9kd0ZpbGVMZW4pLCAxMDI0VSk7Ci0KLSAgaWYgKG1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwoMCwga1JlcVNpemUpKSB7Ci0gICAgdWludDhfdCBidWZmZXJbMTAyNF07Ci0gICAgbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhidWZmZXIsIDAsIGtSZXFTaXplKTsKLQotICAgIGlmIChJc0xpbmVhcml6ZWRGaWxlKGJ1ZmZlciwga1JlcVNpemUpKSB7Ci0gICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRklSU1RQQUdFOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAobV9kb2NTdGF0dXMgPT0gUERGX0RBVEFBVkFJTF9FUlJPUikKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VORDsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Citib29sIENQREZfRGF0YUF2YWlsOjpDaGVja0hlYWRlcigpIHsKKyAgc3dpdGNoIChDaGVja0hlYWRlckFuZExpbmVhcml6ZWQoKSkgeworICAgIGNhc2UgRG9jQXZhaWxTdGF0dXM6OkRhdGFBdmFpbGFibGU6CisgICAgICBtX2RvY1N0YXR1cyA9IG1fcExpbmVhcml6ZWQgPyBQREZfREFUQUFWQUlMX0ZJUlNUUEFHRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUERGX0RBVEFBVkFJTF9MT0FEQUxMQ1JPU1NSRUY7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIERvY0F2YWlsU3RhdHVzOjpEYXRhTm90QXZhaWxhYmxlOgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgRG9jQXZhaWxTdGF0dXM6OkRhdGFFcnJvcjoKKyAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLQotICBwSGludHMtPkFkZFNlZ21lbnQoMCwga1JlcVNpemUpOwotICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrRmlyc3RQYWdlKERvd25sb2FkSGludHMqIHBIaW50cykgeworYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tGaXJzdFBhZ2UoKSB7CiAgIGlmICghbV9wTGluZWFyaXplZC0+R2V0Rmlyc3RQYWdlRW5kT2Zmc2V0KCkgfHwKLSAgICAgICFtX3BMaW5lYXJpemVkLT5HZXRGaWxlU2l6ZSgpIHx8ICFtX3BMaW5lYXJpemVkLT5HZXRMYXN0WFJlZk9mZnNldCgpKSB7CisgICAgICAhbV9wTGluZWFyaXplZC0+R2V0RmlsZVNpemUoKSB8fAorICAgICAgIW1fcExpbmVhcml6ZWQtPkdldE1haW5YUmVmVGFibGVGaXJzdEVudHJ5T2Zmc2V0KCkpIHsKICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CkBAIC01OTAsNDEgKzQzMCwxOCBAQAogICBpZiAoKEZYX0ZJTEVTSVpFKWR3RW5kID4gbV9kd0ZpbGVMZW4pCiAgICAgZHdFbmQgPSAodWludDMyX3QpbV9kd0ZpbGVMZW47CiAKLSAgaW50MzJfdCBpU3RhcnRQb3MgPSAoaW50MzJfdCkobV9kd0ZpbGVMZW4gPiAxMDI0ID8gMTAyNCA6IG1fZHdGaWxlTGVuKTsKLSAgaW50MzJfdCBpU2l6ZSA9IGR3RW5kID4gMTAyNCA/IGR3RW5kIC0gMTAyNCA6IDA7Ci0gIGlmICghbV9wRmlsZUF2YWlsLT5Jc0RhdGFBdmFpbChpU3RhcnRQb3MsIGlTaXplKSkgewotICAgIHBIaW50cy0+QWRkU2VnbWVudChpU3RhcnRQb3MsIGlTaXplKTsKKyAgY29uc3QgRlhfRklMRVNJWkUgc3RhcnRfcG9zID0gbV9kd0ZpbGVMZW4gPiAxMDI0ID8gMTAyNCA6IG1fZHdGaWxlTGVuOworICBjb25zdCBzaXplX3QgZGF0YV9zaXplID0gZHdFbmQgPiAxMDI0ID8gc3RhdGljX2Nhc3Q8c2l6ZV90Pihkd0VuZCAtIDEwMjQpIDogMDsKKyAgaWYgKCFHZXRWYWxpZGF0b3IoKS0+Q2hlY2tEYXRhUmFuZ2VBbmRSZXF1ZXN0SWZVbmF2YWlsYWJsZShzdGFydF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9zaXplKSkKICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KIAogICBtX2RvY1N0YXR1cyA9CiAgICAgICBtX2JTdXBwb3J0SGludFRhYmxlID8gUERGX0RBVEFBVkFJTF9ISU5UVEFCTEUgOiBQREZfREFUQUFWQUlMX0RPTkU7CiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENQREZfRGF0YUF2YWlsOjpJc0RhdGFBdmFpbChGWF9GSUxFU0laRSBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG93bmxvYWRIaW50cyogcEhpbnRzKSB7Ci0gIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IG1fZHdGaWxlTGVuKQotICAgIHJldHVybiB0cnVlOwotCi0gIEZYX1NBRkVfRklMRVNJWkUgc2FmZVNpemUgPSBvZmZzZXQ7Ci0gIHNhZmVTaXplICs9IHNpemU7Ci0gIHNhZmVTaXplICs9IDUxMjsKLSAgaWYgKCFzYWZlU2l6ZS5Jc1ZhbGlkKCkgfHwgc2FmZVNpemUuVmFsdWVPckRpZSgpID4gbV9kd0ZpbGVMZW4pCi0gICAgc2l6ZSA9IG1fZHdGaWxlTGVuIC0gb2Zmc2V0OwotICBlbHNlCi0gICAgc2l6ZSArPSA1MTI7Ci0KLSAgaWYgKCFtX3BGaWxlQXZhaWwtPklzRGF0YUF2YWlsKG9mZnNldCwgc2l6ZSkpIHsKLSAgICBpZiAocEhpbnRzKQotICAgICAgcEhpbnRzLT5BZGRTZWdtZW50KG9mZnNldCwgc2l6ZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENQREZfRGF0YUF2YWlsOjpDaGVja0hpbnRUYWJsZXMoRG93bmxvYWRIaW50cyogcEhpbnRzKSB7Citib29sIENQREZfRGF0YUF2YWlsOjpDaGVja0hpbnRUYWJsZXMoKSB7CiAgIGlmIChtX3BMaW5lYXJpemVkLT5HZXRQYWdlQ291bnQoKSA8PSAxKSB7CiAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0RPTkU7CiAgICAgcmV0dXJuIHRydWU7CkBAIC02MzQsMTggKzQ1MSwxNyBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIEZYX0ZJTEVTSVpFIHN6SGludFN0YXJ0ID0gbV9wTGluZWFyaXplZC0+R2V0SGludFN0YXJ0KCk7Ci0gIEZYX0ZJTEVTSVpFIHN6SGludExlbmd0aCA9IG1fcExpbmVhcml6ZWQtPkdldEhpbnRMZW5ndGgoKTsKKyAgY29uc3QgRlhfRklMRVNJWkUgc3pIaW50U3RhcnQgPSBtX3BMaW5lYXJpemVkLT5HZXRIaW50U3RhcnQoKTsKKyAgY29uc3QgdWludDMyX3Qgc3pIaW50TGVuZ3RoID0gbV9wTGluZWFyaXplZC0+R2V0SGludExlbmd0aCgpOwogCi0gIGlmICghSXNEYXRhQXZhaWwoc3pIaW50U3RhcnQsIHN6SGludExlbmd0aCwgcEhpbnRzKSkKKyAgaWYgKCFHZXRWYWxpZGF0b3IoKS0+Q2hlY2tEYXRhUmFuZ2VBbmRSZXF1ZXN0SWZVbmF2YWlsYWJsZShzekhpbnRTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzekhpbnRMZW5ndGgpKQogICAgIHJldHVybiBmYWxzZTsKIAotICBtX3N5bnRheFBhcnNlci5Jbml0UGFyc2VyKG1fcEZpbGVSZWFkLCBtX2R3SGVhZGVyT2Zmc2V0KTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9IaW50VGFibGVzPiBwSGludFRhYmxlcygKLSAgICAgIG5ldyBDUERGX0hpbnRUYWJsZXModGhpcywgbV9wTGluZWFyaXplZC5nZXQoKSkpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IHBIaW50U3RyZWFtKAotICAgICAgUGFyc2VJbmRpcmVjdE9iamVjdEF0KHN6SGludFN0YXJ0LCAwKSk7CisgIGF1dG8gcEhpbnRUYWJsZXMgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9IaW50VGFibGVzPihHZXRWYWxpZGF0b3IoKS5HZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcExpbmVhcml6ZWQuZ2V0KCkpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IHBIaW50U3RyZWFtID0KKyAgICAgIFBhcnNlSW5kaXJlY3RPYmplY3RBdChzekhpbnRTdGFydCwgMCk7CiAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gVG9TdHJlYW0ocEhpbnRTdHJlYW0uZ2V0KCkpOwogICBpZiAocFN0cmVhbSAmJiBwSGludFRhYmxlcy0+TG9hZEhpbnRTdHJlYW0ocFN0cmVhbSkpCiAgICAgbV9wSGludFRhYmxlcyA9IHN0ZDo6bW92ZShwSGludFRhYmxlcyk7CkBAIC02NTgsNDUyICs0NzQsNjUgQEAKICAgICBGWF9GSUxFU0laRSBwb3MsCiAgICAgdWludDMyX3Qgb2JqbnVtLAogICAgIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIHBPYmpMaXN0KSB7Ci0gIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9zeW50YXhQYXJzZXIuU2F2ZVBvcygpOwotICBtX3N5bnRheFBhcnNlci5SZXN0b3JlUG9zKHBvcyk7Ci0KLSAgYm9vbCBiSXNOdW1iZXI7Ci0gIENGWF9CeXRlU3RyaW5nIHdvcmQgPSBtX3N5bnRheFBhcnNlci5HZXROZXh0V29yZCgmYklzTnVtYmVyKTsKLSAgaWYgKCFiSXNOdW1iZXIpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgdWludDMyX3QgcGFyc2VyX29iam51bSA9IEZYU1lTX2F0b3VpKHdvcmQuY19zdHIoKSk7Ci0gIGlmIChvYmpudW0gJiYgcGFyc2VyX29iam51bSAhPSBvYmpudW0pCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgd29yZCA9IG1fc3ludGF4UGFyc2VyLkdldE5leHRXb3JkKCZiSXNOdW1iZXIpOwotICBpZiAoIWJJc051bWJlcikKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICB1aW50MzJfdCBnZW5udW0gPSBGWFNZU19hdG91aSh3b3JkLmNfc3RyKCkpOwotICBpZiAobV9zeW50YXhQYXJzZXIuR2V0S2V5d29yZCgpICE9ICJvYmoiKSB7Ci0gICAgbV9zeW50YXhQYXJzZXIuUmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IHBPYmogPQotICAgICAgbV9zeW50YXhQYXJzZXIuR2V0T2JqZWN0KHBPYmpMaXN0LCBwYXJzZXJfb2JqbnVtLCBnZW5udW0sIHRydWUpOwotICBtX3N5bnRheFBhcnNlci5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgcmV0dXJuIHBPYmo7CisgIGNvbnN0IEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gR2V0U3ludGF4UGFyc2VyKCktPkdldFBvcygpOworICBHZXRTeW50YXhQYXJzZXIoKS0+U2V0UG9zKHBvcyk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gcmVzdWx0ID0gR2V0U3ludGF4UGFyc2VyKCktPkdldEluZGlyZWN0T2JqZWN0KAorICAgICAgcE9iakxpc3QsIENQREZfU3ludGF4UGFyc2VyOjpQYXJzZVR5cGU6OmtMb29zZSk7CisgIEdldFN5bnRheFBhcnNlcigpLT5TZXRQb3MoU2F2ZWRQb3MpOworICByZXR1cm4gKHJlc3VsdCAmJiAoIW9iam51bSB8fCByZXN1bHQtPkdldE9iak51bSgpID09IG9iam51bSkpCisgICAgICAgICAgICAgPyBzdGQ6Om1vdmUocmVzdWx0KQorICAgICAgICAgICAgIDogbnVsbHB0cjsKIH0KIAogQ1BERl9EYXRhQXZhaWw6OkRvY0xpbmVhcml6YXRpb25TdGF0dXMgQ1BERl9EYXRhQXZhaWw6OklzTGluZWFyaXplZFBERigpIHsKLSAgY29uc3QgdWludDMyX3Qga1JlcVNpemUgPSAxMDI0OwotICBpZiAoIW1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwoMCwga1JlcVNpemUpKQotICAgIHJldHVybiBMaW5lYXJpemF0aW9uVW5rbm93bjsKLQotICBpZiAoIW1fcEZpbGVSZWFkKQotICAgIHJldHVybiBOb3RMaW5lYXJpemVkOwotCi0gIEZYX0ZJTEVTSVpFIGR3U2l6ZSA9IG1fcEZpbGVSZWFkLT5HZXRTaXplKCk7Ci0gIGlmIChkd1NpemUgPCAoRlhfRklMRVNJWkUpa1JlcVNpemUpCi0gICAgcmV0dXJuIExpbmVhcml6YXRpb25Vbmtub3duOwotCi0gIHVpbnQ4X3QgYnVmZmVyWzEwMjRdOwotICBtX3BGaWxlUmVhZC0+UmVhZEJsb2NrKGJ1ZmZlciwgMCwga1JlcVNpemUpOwotICBpZiAoSXNMaW5lYXJpemVkRmlsZShidWZmZXIsIGtSZXFTaXplKSkKLSAgICByZXR1cm4gTGluZWFyaXplZDsKLQotICByZXR1cm4gTm90TGluZWFyaXplZDsKLX0KLQotYm9vbCBDUERGX0RhdGFBdmFpbDo6SXNMaW5lYXJpemVkKCkgewotICByZXR1cm4gISFtX3BMaW5lYXJpemVkOwotfQotCi1ib29sIENQREZfRGF0YUF2YWlsOjpJc0xpbmVhcml6ZWRGaWxlKHVpbnQ4X3QqIHBEYXRhLCB1aW50MzJfdCBkd0xlbikgewotICBpZiAobV9wTGluZWFyaXplZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBDRlhfUmV0YWluUHRyPElGWF9NZW1vcnlTdHJlYW0+IGZpbGUgPQotICAgICAgSUZYX01lbW9yeVN0cmVhbTo6Q3JlYXRlKHBEYXRhLCAoc2l6ZV90KWR3TGVuLCBmYWxzZSk7Ci0gIGludDMyX3Qgb2Zmc2V0ID0gR2V0SGVhZGVyT2Zmc2V0KGZpbGUpOwotICBpZiAob2Zmc2V0ID09IC0xKSB7Ci0gICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIG1fZHdIZWFkZXJPZmZzZXQgPSBvZmZzZXQ7Ci0gIG1fc3ludGF4UGFyc2VyLkluaXRQYXJzZXIoZmlsZSwgb2Zmc2V0KTsKLSAgbV9zeW50YXhQYXJzZXIuUmVzdG9yZVBvcyhtX3N5bnRheFBhcnNlci5tX0hlYWRlck9mZnNldCArIDkpOwotCi0gIGJvb2wgYk51bWJlcjsKLSAgQ0ZYX0J5dGVTdHJpbmcgd29yZE9iak51bSA9IG1fc3ludGF4UGFyc2VyLkdldE5leHRXb3JkKCZiTnVtYmVyKTsKLSAgaWYgKCFiTnVtYmVyKQotICAgIHJldHVybiBmYWxzZTsKLQotICB1aW50MzJfdCBvYmpudW0gPSBGWFNZU19hdG91aSh3b3JkT2JqTnVtLmNfc3RyKCkpOwotICBtX3BMaW5lYXJpemVkID0gQ1BERl9MaW5lYXJpemVkSGVhZGVyOjpDcmVhdGVGb3JPYmplY3QoCi0gICAgICBQYXJzZUluZGlyZWN0T2JqZWN0QXQobV9zeW50YXhQYXJzZXIubV9IZWFkZXJPZmZzZXQgKyA5LCBvYmpudW0pKTsKLSAgaWYgKCFtX3BMaW5lYXJpemVkIHx8Ci0gICAgICBtX3BMaW5lYXJpemVkLT5HZXRGaWxlU2l6ZSgpICE9IG1fcEZpbGVSZWFkLT5HZXRTaXplKCkpIHsKLSAgICBtX3BMaW5lYXJpemVkLnJlc2V0KCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENQREZfRGF0YUF2YWlsOjpDaGVja0VuZChEb3dubG9hZEhpbnRzKiBwSGludHMpIHsKLSAgdWludDMyX3QgcmVxX3BvcyA9ICh1aW50MzJfdCkobV9kd0ZpbGVMZW4gPiAxMDI0ID8gbV9kd0ZpbGVMZW4gLSAxMDI0IDogMCk7Ci0gIHVpbnQzMl90IGR3U2l6ZSA9ICh1aW50MzJfdCkobV9kd0ZpbGVMZW4gLSByZXFfcG9zKTsKLQotICBpZiAobV9wRmlsZUF2YWlsLT5Jc0RhdGFBdmFpbChyZXFfcG9zLCBkd1NpemUpKSB7Ci0gICAgdWludDhfdCBidWZmZXJbMTAyNF07Ci0gICAgbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhidWZmZXIsIHJlcV9wb3MsIGR3U2l6ZSk7Ci0KLSAgICBDRlhfUmV0YWluUHRyPElGWF9NZW1vcnlTdHJlYW0+IGZpbGUgPQotICAgICAgICBJRlhfTWVtb3J5U3RyZWFtOjpDcmVhdGUoYnVmZmVyLCAoc2l6ZV90KWR3U2l6ZSwgZmFsc2UpOwotICAgIG1fc3ludGF4UGFyc2VyLkluaXRQYXJzZXIoZmlsZSwgMCk7Ci0gICAgbV9zeW50YXhQYXJzZXIuUmVzdG9yZVBvcyhkd1NpemUgLSAxKTsKLQotICAgIGlmIChtX3N5bnRheFBhcnNlci5TZWFyY2hXb3JkKCJzdGFydHhyZWYiLCB0cnVlLCBmYWxzZSwgZHdTaXplKSkgewotICAgICAgbV9zeW50YXhQYXJzZXIuR2V0TmV4dFdvcmQobnVsbHB0cik7Ci0KLSAgICAgIGJvb2wgYk51bWJlcjsKLSAgICAgIENGWF9CeXRlU3RyaW5nIHhyZWZwb3Nfc3RyID0gbV9zeW50YXhQYXJzZXIuR2V0TmV4dFdvcmQoJmJOdW1iZXIpOwotICAgICAgaWYgKCFiTnVtYmVyKSB7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBtX2R3WFJlZk9mZnNldCA9IChGWF9GSUxFU0laRSlGWFNZU19hdG9pNjQoeHJlZnBvc19zdHIuY19zdHIoKSk7Ci0gICAgICBpZiAoIW1fZHdYUmVmT2Zmc2V0IHx8IG1fZHdYUmVmT2Zmc2V0ID4gbV9kd0ZpbGVMZW4pIHsKLSAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgbV9kd0xhc3RYUmVmT2Zmc2V0ID0gbV9kd1hSZWZPZmZzZXQ7Ci0gICAgICBTZXRTdGFydE9mZnNldChtX2R3WFJlZk9mZnNldCk7Ci0gICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfQ1JPU1NSRUY7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwSGludHMtPkFkZFNlZ21lbnQocmVxX3BvcywgZHdTaXplKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1pbnQzMl90IENQREZfRGF0YUF2YWlsOjpDaGVja0Nyb3NzUmVmU3RyZWFtKERvd25sb2FkSGludHMqIHBIaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUmIHhyZWZfb2Zmc2V0KSB7Ci0gIHhyZWZfb2Zmc2V0ID0gMDsKLSAgdWludDMyX3QgcmVxX3NpemUgPQotICAgICAgKHVpbnQzMl90KShtX1BvcyArIDUxMiA+IG1fZHdGaWxlTGVuID8gbV9kd0ZpbGVMZW4gLSBtX1BvcyA6IDUxMik7Ci0KLSAgaWYgKG1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwobV9Qb3MsIHJlcV9zaXplKSkgewotICAgIGludDMyX3QgaVNpemUgPSAoaW50MzJfdCkobV9Qb3MgKyByZXFfc2l6ZSAtIG1fZHdDdXJyZW50WFJlZlN0ZWFtKTsKLSAgICBDRlhfQmluYXJ5QnVmIGJ1ZihpU2l6ZSk7Ci0gICAgdWludDhfdCogcEJ1ZiA9IGJ1Zi5HZXRCdWZmZXIoKTsKLQotICAgIG1fcEZpbGVSZWFkLT5SZWFkQmxvY2socEJ1ZiwgbV9kd0N1cnJlbnRYUmVmU3RlYW0sIGlTaXplKTsKLQotICAgIENGWF9SZXRhaW5QdHI8SUZYX01lbW9yeVN0cmVhbT4gZmlsZSA9Ci0gICAgICAgIElGWF9NZW1vcnlTdHJlYW06OkNyZWF0ZShwQnVmLCAoc2l6ZV90KWlTaXplLCBmYWxzZSk7Ci0gICAgbV9wYXJzZXIubV9wU3ludGF4LT5Jbml0UGFyc2VyKGZpbGUsIDApOwotCi0gICAgYm9vbCBiTnVtYmVyOwotICAgIENGWF9CeXRlU3RyaW5nIG9iam51bSA9IG1fcGFyc2VyLm1fcFN5bnRheC0+R2V0TmV4dFdvcmQoJmJOdW1iZXIpOwotICAgIGlmICghYk51bWJlcikKLSAgICAgIHJldHVybiAtMTsKLQotICAgIHVpbnQzMl90IG9iak51bSA9IEZYU1lTX2F0b3VpKG9iam51bS5jX3N0cigpKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IHBPYmogPQotICAgICAgICBtX3BhcnNlci5QYXJzZUluZGlyZWN0T2JqZWN0QXQobnVsbHB0ciwgMCwgb2JqTnVtKTsKLQotICAgIGlmICghcE9iaikgewotICAgICAgbV9Qb3MgKz0gbV9wYXJzZXIubV9wU3ludGF4LT5TYXZlUG9zKCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcE9iai0+R2V0RGljdCgpOwotICAgIENQREZfTmFtZSogcE5hbWUgPSBUb05hbWUocERpY3QgPyBwRGljdC0+R2V0T2JqZWN0Rm9yKCJUeXBlIikgOiBudWxscHRyKTsKLSAgICBpZiAocE5hbWUgJiYgcE5hbWUtPkdldFN0cmluZygpID09ICJYUmVmIikgewotICAgICAgbV9Qb3MgKz0gbV9wYXJzZXIubV9wU3ludGF4LT5TYXZlUG9zKCk7Ci0gICAgICB4cmVmX29mZnNldCA9IHBPYmotPkdldERpY3QoKS0+R2V0SW50ZWdlckZvcigiUHJldiIpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIHJldHVybiAtMTsKLSAgfQotICBwSGludHMtPkFkZFNlZ21lbnQobV9Qb3MsIHJlcV9zaXplKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQ1BERl9EYXRhQXZhaWw6OlNldFN0YXJ0T2Zmc2V0KEZYX0ZJTEVTSVpFIGR3T2Zmc2V0KSB7Ci0gIG1fUG9zID0gZHdPZmZzZXQ7Ci19Ci0KLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkdldE5leHRUb2tlbihDRlhfQnl0ZVN0cmluZyYgdG9rZW4pIHsKLSAgdWludDhfdCBjaDsKLSAgaWYgKCFHZXROZXh0Q2hhcihjaCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHdoaWxlICgxKSB7Ci0gICAgd2hpbGUgKFBERkNoYXJJc1doaXRlc3BhY2UoY2gpKSB7Ci0gICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChjaCAhPSAnJScpCi0gICAgICBicmVhazsKLQotICAgIHdoaWxlICgxKSB7Ci0gICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFBERkNoYXJJc0xpbmVFbmRpbmcoY2gpKQotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICB1aW50OF90IGJ1ZmZlclsyNTZdOwotICB1aW50MzJfdCBpbmRleCA9IDA7Ci0gIGlmIChQREZDaGFySXNEZWxpbWl0ZXIoY2gpKSB7Ci0gICAgYnVmZmVyW2luZGV4KytdID0gY2g7Ci0gICAgaWYgKGNoID09ICcvJykgewotICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmICghUERGQ2hhcklzT3RoZXIoY2gpICYmICFQREZDaGFySXNOdW1lcmljKGNoKSkgewotICAgICAgICAgIG1fUG9zLS07Ci0gICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgcmV0KGJ1ZmZlciwgaW5kZXgpOwotICAgICAgICAgIHRva2VuID0gcmV0OwotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGluZGV4IDwgc2l6ZW9mKGJ1ZmZlcikpCi0gICAgICAgICAgYnVmZmVyW2luZGV4KytdID0gY2g7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChjaCA9PSAnPCcpIHsKLSAgICAgIGlmICghR2V0TmV4dENoYXIoY2gpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmIChjaCA9PSAnPCcpCi0gICAgICAgIGJ1ZmZlcltpbmRleCsrXSA9IGNoOwotICAgICAgZWxzZQotICAgICAgICBtX1Bvcy0tOwotICAgIH0gZWxzZSBpZiAoY2ggPT0gJz4nKSB7Ci0gICAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICBpZiAoY2ggPT0gJz4nKQotICAgICAgICBidWZmZXJbaW5kZXgrK10gPSBjaDsKLSAgICAgIGVsc2UKLSAgICAgICAgbV9Qb3MtLTsKLSAgICB9Ci0KLSAgICBDRlhfQnl0ZVN0cmluZyByZXQoYnVmZmVyLCBpbmRleCk7Ci0gICAgdG9rZW4gPSByZXQ7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB3aGlsZSAoMSkgewotICAgIGlmIChpbmRleCA8IHNpemVvZihidWZmZXIpKQotICAgICAgYnVmZmVyW2luZGV4KytdID0gY2g7Ci0KLSAgICBpZiAoIUdldE5leHRDaGFyKGNoKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChQREZDaGFySXNEZWxpbWl0ZXIoY2gpIHx8IFBERkNoYXJJc1doaXRlc3BhY2UoY2gpKSB7Ci0gICAgICBtX1Bvcy0tOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgdG9rZW4gPSBDRlhfQnl0ZVN0cmluZyhidWZmZXIsIGluZGV4KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkdldE5leHRDaGFyKHVpbnQ4X3QmIGNoKSB7Ci0gIEZYX0ZJTEVTSVpFIHBvcyA9IG1fUG9zOwotICBpZiAocG9zID49IG1fZHdGaWxlTGVuKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAobV9idWZmZXJPZmZzZXQgPj0gcG9zIHx8Ci0gICAgICAoRlhfRklMRVNJWkUpKG1fYnVmZmVyT2Zmc2V0ICsgbV9idWZmZXJTaXplKSA8PSBwb3MpIHsKLSAgICBGWF9GSUxFU0laRSByZWFkX3BvcyA9IHBvczsKLSAgICB1aW50MzJfdCByZWFkX3NpemUgPSA1MTI7Ci0gICAgaWYgKChGWF9GSUxFU0laRSlyZWFkX3NpemUgPiBtX2R3RmlsZUxlbikKLSAgICAgIHJlYWRfc2l6ZSA9ICh1aW50MzJfdCltX2R3RmlsZUxlbjsKLQotICAgIGlmICgoRlhfRklMRVNJWkUpKHJlYWRfcG9zICsgcmVhZF9zaXplKSA+IG1fZHdGaWxlTGVuKQotICAgICAgcmVhZF9wb3MgPSBtX2R3RmlsZUxlbiAtIHJlYWRfc2l6ZTsKLQotICAgIGlmICghbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhtX2J1ZmZlckRhdGEsIHJlYWRfcG9zLCByZWFkX3NpemUpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgbV9idWZmZXJPZmZzZXQgPSByZWFkX3BvczsKLSAgICBtX2J1ZmZlclNpemUgPSByZWFkX3NpemU7Ci0gIH0KLSAgY2ggPSBtX2J1ZmZlckRhdGFbcG9zIC0gbV9idWZmZXJPZmZzZXRdOwotICBtX1BvcysrOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tDcm9zc1JlZkl0ZW0oRG93bmxvYWRIaW50cyogcEhpbnRzKSB7Ci0gIGludDMyX3QgaVNpemUgPSAwOwotICBDRlhfQnl0ZVN0cmluZyB0b2tlbjsKLSAgd2hpbGUgKDEpIHsKLSAgICBpZiAoIUdldE5leHRUb2tlbih0b2tlbikpIHsKLSAgICAgIGlTaXplID0gKGludDMyX3QpKG1fUG9zICsgNTEyID4gbV9kd0ZpbGVMZW4gPyBtX2R3RmlsZUxlbiAtIG1fUG9zIDogNTEyKTsKLSAgICAgIHBIaW50cy0+QWRkU2VnbWVudChtX1BvcywgaVNpemUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICh0b2tlbiA9PSAidHJhaWxlciIpIHsKLSAgICAgIG1fZHdUcmFpbGVyT2Zmc2V0ID0gbV9Qb3M7Ci0gICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfVFJBSUxFUjsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KKyAgc3dpdGNoIChDaGVja0hlYWRlckFuZExpbmVhcml6ZWQoKSkgeworICAgIGNhc2UgRG9jQXZhaWxTdGF0dXM6OkRhdGFBdmFpbGFibGU6CisgICAgICByZXR1cm4gbV9wTGluZWFyaXplZCA/IERvY0xpbmVhcml6YXRpb25TdGF0dXM6OkxpbmVhcml6ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRG9jTGluZWFyaXphdGlvblN0YXR1czo6Tm90TGluZWFyaXplZDsKKyAgICBjYXNlIERvY0F2YWlsU3RhdHVzOjpEYXRhTm90QXZhaWxhYmxlOgorICAgICAgcmV0dXJuIERvY0xpbmVhcml6YXRpb25TdGF0dXM6OkxpbmVhcml6YXRpb25Vbmtub3duOworICAgIGNhc2UgRG9jQXZhaWxTdGF0dXM6OkRhdGFFcnJvcjoKKyAgICAgIHJldHVybiBEb2NMaW5lYXJpemF0aW9uU3RhdHVzOjpOb3RMaW5lYXJpemVkOworICAgIGRlZmF1bHQ6CisgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICByZXR1cm4gRG9jTGluZWFyaXphdGlvblN0YXR1czo6TGluZWFyaXphdGlvblVua25vd247CiAgIH0KIH0KIAotYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tBbGxDcm9zc1JlZlN0cmVhbShEb3dubG9hZEhpbnRzKiBwSGludHMpIHsKLSAgRlhfRklMRVNJWkUgeHJlZl9vZmZzZXQgPSAwOworQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzIENQREZfRGF0YUF2YWlsOjpDaGVja0hlYWRlckFuZExpbmVhcml6ZWQoKSB7CisgIGlmIChtX2JIZWFkZXJBdmFpbCkKKyAgICByZXR1cm4gRG9jQXZhaWxTdGF0dXM6OkRhdGFBdmFpbGFibGU7CiAKLSAgaW50MzJfdCBuUmV0ID0gQ2hlY2tDcm9zc1JlZlN0cmVhbShwSGludHMsIHhyZWZfb2Zmc2V0KTsKLSAgaWYgKG5SZXQgPT0gMSkgewotICAgIGlmICgheHJlZl9vZmZzZXQpIHsKLSAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMQ1JPU1NSRUY7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1fZHdDdXJyZW50WFJlZlN0ZWFtID0geHJlZl9vZmZzZXQ7Ci0gICAgICBtX1BvcyA9IHhyZWZfb2Zmc2V0OwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQorICBjb25zdCBDUERGX1JlYWRWYWxpZGF0b3I6OlNlc3Npb24gcmVhZF9zZXNzaW9uKEdldFZhbGlkYXRvcigpLkdldCgpKTsKKyAgY29uc3QgaW50MzJfdCBoZWFkZXJfb2Zmc2V0ID0gR2V0SGVhZGVyT2Zmc2V0KEdldFZhbGlkYXRvcigpKTsKKyAgaWYgKEdldFZhbGlkYXRvcigpLT5oYXNfcmVhZF9wcm9ibGVtcygpKQorICAgIHJldHVybiBEb2NBdmFpbFN0YXR1czo6RGF0YU5vdEF2YWlsYWJsZTsKIAotICBpZiAoblJldCA9PSAtMSkKLSAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7Ci0gIHJldHVybiBmYWxzZTsKKyAgaWYgKGhlYWRlcl9vZmZzZXQgPT0ga0ludmFsaWRIZWFkZXJPZmZzZXQpCisgICAgcmV0dXJuIERvY0F2YWlsU3RhdHVzOjpEYXRhRXJyb3I7CisKKyAgbV9wYXJzZXIubV9wU3ludGF4LT5Jbml0UGFyc2VyV2l0aFZhbGlkYXRvcihHZXRWYWxpZGF0b3IoKSwgaGVhZGVyX29mZnNldCk7CisgIG1fcExpbmVhcml6ZWQgPSBtX3BhcnNlci5QYXJzZUxpbmVhcml6ZWRIZWFkZXIoKTsKKyAgaWYgKEdldFZhbGlkYXRvcigpLT5oYXNfcmVhZF9wcm9ibGVtcygpKQorICAgIHJldHVybiBEb2NBdmFpbFN0YXR1czo6RGF0YU5vdEF2YWlsYWJsZTsKKworICBtX2JIZWFkZXJBdmFpbCA9IHRydWU7CisgIHJldHVybiBEb2NBdmFpbFN0YXR1czo6RGF0YUF2YWlsYWJsZTsKIH0KIAotYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tDcm9zc1JlZihEb3dubG9hZEhpbnRzKiBwSGludHMpIHsKLSAgaW50MzJfdCBpU2l6ZSA9IDA7Ci0gIENGWF9CeXRlU3RyaW5nIHRva2VuOwotICBpZiAoIUdldE5leHRUb2tlbih0b2tlbikpIHsKLSAgICBpU2l6ZSA9IChpbnQzMl90KShtX1BvcyArIDUxMiA+IG1fZHdGaWxlTGVuID8gbV9kd0ZpbGVMZW4gLSBtX1BvcyA6IDUxMik7Ci0gICAgcEhpbnRzLT5BZGRTZWdtZW50KG1fUG9zLCBpU2l6ZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKHRva2VuID09ICJ4cmVmIikgewotICAgIHdoaWxlICgxKSB7Ci0gICAgICBpZiAoIUdldE5leHRUb2tlbih0b2tlbikpIHsKLSAgICAgICAgaVNpemUgPQotICAgICAgICAgICAgKGludDMyX3QpKG1fUG9zICsgNTEyID4gbV9kd0ZpbGVMZW4gPyBtX2R3RmlsZUxlbiAtIG1fUG9zIDogNTEyKTsKLSAgICAgICAgcEhpbnRzLT5BZGRTZWdtZW50KG1fUG9zLCBpU2l6ZSk7Ci0gICAgICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9DUk9TU1JFRl9JVEVNOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh0b2tlbiA9PSAidHJhaWxlciIpIHsKLSAgICAgICAgbV9kd1RyYWlsZXJPZmZzZXQgPSBtX1BvczsKLSAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1RSQUlMRVI7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENQREZfRGF0YUF2YWlsOjpDaGVja1RyYWlsZXJBcHBlbmQoRG93bmxvYWRIaW50cyogcEhpbnRzKSB7Ci0gIGlmIChtX1BvcyA8IG1fZHdGaWxlTGVuKSB7Ci0gICAgRlhfRklMRVNJWkUgZHdBcHBlbmRQb3MgPSBtX1BvcyArIG1fc3ludGF4UGFyc2VyLlNhdmVQb3MoKTsKLSAgICBpbnQzMl90IGlTaXplID0gKGludDMyX3QpKAotICAgICAgICBkd0FwcGVuZFBvcyArIDUxMiA+IG1fZHdGaWxlTGVuID8gbV9kd0ZpbGVMZW4gLSBkd0FwcGVuZFBvcyA6IDUxMik7Ci0KLSAgICBpZiAoIW1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwoZHdBcHBlbmRQb3MsIGlTaXplKSkgewotICAgICAgcEhpbnRzLT5BZGRTZWdtZW50KGR3QXBwZW5kUG9zLCBpU2l6ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgaWYgKG1fZHdQcmV2WFJlZk9mZnNldCkgewotICAgIFNldFN0YXJ0T2Zmc2V0KG1fZHdQcmV2WFJlZk9mZnNldCk7Ci0gICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0NST1NTUkVGOwotICB9IGVsc2UgewotICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9MT0FEQUxMQ1JPU1NSRUY7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrVHJhaWxlcihEb3dubG9hZEhpbnRzKiBwSGludHMpIHsKLSAgaW50MzJfdCBpVHJhaWxlclNpemUgPQotICAgICAgKGludDMyX3QpKG1fUG9zICsgNTEyID4gbV9kd0ZpbGVMZW4gPyBtX2R3RmlsZUxlbiAtIG1fUG9zIDogNTEyKTsKLSAgaWYgKG1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwobV9Qb3MsIGlUcmFpbGVyU2l6ZSkpIHsKLSAgICBpbnQzMl90IGlTaXplID0gKGludDMyX3QpKG1fUG9zICsgaVRyYWlsZXJTaXplIC0gbV9kd1RyYWlsZXJPZmZzZXQpOwotICAgIENGWF9CaW5hcnlCdWYgYnVmKGlTaXplKTsKLSAgICB1aW50OF90KiBwQnVmID0gYnVmLkdldEJ1ZmZlcigpOwotICAgIGlmICghcEJ1ZikgewotICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhwQnVmLCBtX2R3VHJhaWxlck9mZnNldCwgaVNpemUpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ0ZYX1JldGFpblB0cjxJRlhfTWVtb3J5U3RyZWFtPiBmaWxlID0KLSAgICAgICAgSUZYX01lbW9yeVN0cmVhbTo6Q3JlYXRlKHBCdWYsIChzaXplX3QpaVNpemUsIGZhbHNlKTsKLSAgICBtX3N5bnRheFBhcnNlci5Jbml0UGFyc2VyKGZpbGUsIDApOwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBwVHJhaWxlcigKLSAgICAgICAgbV9zeW50YXhQYXJzZXIuR2V0T2JqZWN0KG51bGxwdHIsIDAsIDAsIHRydWUpKTsKLSAgICBpZiAoIXBUcmFpbGVyKSB7Ci0gICAgICBtX1BvcyArPSBtX3N5bnRheFBhcnNlci5TYXZlUG9zKCk7Ci0gICAgICBwSGludHMtPkFkZFNlZ21lbnQobV9Qb3MsIGlUcmFpbGVyU2l6ZSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFwVHJhaWxlci0+SXNEaWN0aW9uYXJ5KCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBUcmFpbGVyRGljdCA9IHBUcmFpbGVyLT5HZXREaWN0KCk7Ci0gICAgQ1BERl9PYmplY3QqIHBFbmNyeXB0ID0gcFRyYWlsZXJEaWN0LT5HZXRPYmplY3RGb3IoIkVuY3J5cHQiKTsKLSAgICBpZiAoVG9SZWZlcmVuY2UocEVuY3J5cHQpKSB7Ci0gICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCB4cmVmcG9zID0gR2V0RGlyZWN0SW50ZWdlcihwVHJhaWxlckRpY3QsICJQcmV2Iik7Ci0gICAgaWYgKHhyZWZwb3MpIHsKLSAgICAgIG1fZHdQcmV2WFJlZk9mZnNldCA9IEdldERpcmVjdEludGVnZXIocFRyYWlsZXJEaWN0LCAiWFJlZlN0bSIpOwotICAgICAgaWYgKG1fZHdQcmV2WFJlZk9mZnNldCkgewotICAgICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBtX2R3UHJldlhSZWZPZmZzZXQgPSB4cmVmcG9zOwotICAgICAgICBpZiAobV9kd1ByZXZYUmVmT2Zmc2V0ID49IG1fZHdGaWxlTGVuKSB7Ci0gICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0xPQURBTExGSUxFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFNldFN0YXJ0T2Zmc2V0KG1fZHdQcmV2WFJlZk9mZnNldCk7Ci0gICAgICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1RSQUlMRVJfQVBQRU5EOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgbV9kd1ByZXZYUmVmT2Zmc2V0ID0gMDsKLSAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfVFJBSUxFUl9BUFBFTkQ7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcEhpbnRzLT5BZGRTZWdtZW50KG1fUG9zLCBpVHJhaWxlclNpemUpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkNoZWNrUGFnZSh1aW50MzJfdCBkd1BhZ2UsIERvd25sb2FkSGludHMqIHBIaW50cykgeworYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlKHVpbnQzMl90IGR3UGFnZSkgewogICB3aGlsZSAodHJ1ZSkgewogICAgIHN3aXRjaCAobV9kb2NTdGF0dXMpIHsKICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9QQUdFVFJFRToKLSAgICAgICAgaWYgKCFMb2FkRG9jUGFnZXMocEhpbnRzKSkKKyAgICAgICAgaWYgKCFMb2FkRG9jUGFnZXMoKSkKICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBQREZfREFUQUFWQUlMX1BBR0U6Ci0gICAgICAgIGlmICghTG9hZERvY1BhZ2UoZHdQYWdlLCBwSGludHMpKQorICAgICAgICBpZiAoIUxvYWREb2NQYWdlKGR3UGFnZSkpCiAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgUERGX0RBVEFBVkFJTF9FUlJPUjoKLSAgICAgICAgcmV0dXJuIExvYWRBbGxGaWxlKHBIaW50cyk7CisgICAgICAgIHJldHVybiBMb2FkQWxsRmlsZSgpOwogICAgICAgZGVmYXVsdDoKICAgICAgICAgbV9iUGFnZXNUcmVlTG9hZCA9IHRydWU7CiAgICAgICAgIG1fYlBhZ2VzTG9hZCA9IHRydWU7CkBAIC0xMTE1LDEwICs1NDQsOSBAQAogfQogCiBib29sIENQREZfRGF0YUF2YWlsOjpDaGVja0FycmF5UGFnZU5vZGUodWludDMyX3QgZHdQYWdlTm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFnZU5vZGUqIHBQYWdlTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWdlTm9kZSogcFBhZ2VOb2RlKSB7CiAgIGJvb2wgYkV4aXN0cyA9IGZhbHNlOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IHBQYWdlcyA9IEdldE9iamVjdChkd1BhZ2VObywgcEhpbnRzLCAmYkV4aXN0cyk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gcFBhZ2VzID0gR2V0T2JqZWN0KGR3UGFnZU5vLCAmYkV4aXN0cyk7CiAgIGlmICghYkV4aXN0cykgewogICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMTQ3LDEwICs1NzUsOSBAQAogfQogCiBib29sIENQREZfRGF0YUF2YWlsOjpDaGVja1Vua25vd25QYWdlTm9kZSh1aW50MzJfdCBkd1BhZ2VObywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2VOb2RlKiBwUGFnZU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2VOb2RlKiBwUGFnZU5vZGUpIHsKICAgYm9vbCBiRXhpc3RzID0gZmFsc2U7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gcFBhZ2UgPSBHZXRPYmplY3QoZHdQYWdlTm8sIHBIaW50cywgJmJFeGlzdHMpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IHBQYWdlID0gR2V0T2JqZWN0KGR3UGFnZU5vLCAmYkV4aXN0cyk7CiAgIGlmICghYkV4aXN0cykgewogICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMTcyLDQyICs1OTksNDcgQEAKIAogICBwUGFnZU5vZGUtPm1fZHdQYWdlTm8gPSBkd1BhZ2VObzsKICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBQYWdlLT5HZXREaWN0KCk7Ci0gIENGWF9CeXRlU3RyaW5nIHR5cGUgPSBwRGljdC0+R2V0U3RyaW5nRm9yKCJUeXBlIik7Ci0gIGlmICh0eXBlID09ICJQYWdlcyIpIHsKLSAgICBwUGFnZU5vZGUtPm1fdHlwZSA9IFBERl9QQUdFTk9ERV9QQUdFUzsKLSAgICBDUERGX09iamVjdCogcEtpZHMgPSBwRGljdC0+R2V0T2JqZWN0Rm9yKCJLaWRzIik7Ci0gICAgaWYgKCFwS2lkcykgewotICAgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9CisgIGNvbnN0IEJ5dGVTdHJpbmcgdHlwZSA9IHBEaWN0LT5HZXRTdHJpbmdGb3IoIlR5cGUiKTsKKyAgaWYgKHR5cGUgPT0gIlBhZ2UiKSB7CisgICAgcFBhZ2VOb2RlLT5tX3R5cGUgPSBQREZfUEFHRU5PREVfUEFHRTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQogCi0gICAgc3dpdGNoIChwS2lkcy0+R2V0VHlwZSgpKSB7Ci0gICAgICBjYXNlIENQREZfT2JqZWN0OjpSRUZFUkVOQ0U6IHsKLSAgICAgICAgQ1BERl9SZWZlcmVuY2UqIHBLaWQgPSBwS2lkcy0+QXNSZWZlcmVuY2UoKTsKKyAgaWYgKHR5cGUgIT0gIlBhZ2VzIikgeworICAgIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9FUlJPUjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwUGFnZU5vZGUtPm1fdHlwZSA9IFBERl9QQUdFTk9ERV9QQUdFUzsKKyAgQ1BERl9PYmplY3QqIHBLaWRzID0gcERpY3QtPkdldE9iamVjdEZvcigiS2lkcyIpOworICBpZiAoIXBLaWRzKSB7CisgICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX1BBR0U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBzd2l0Y2ggKHBLaWRzLT5HZXRUeXBlKCkpIHsKKyAgICBjYXNlIENQREZfT2JqZWN0OjpSRUZFUkVOQ0U6IHsKKyAgICAgIENQREZfUmVmZXJlbmNlKiBwS2lkID0gcEtpZHMtPkFzUmVmZXJlbmNlKCk7CisgICAgICBhdXRvIHBOb2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPFBhZ2VOb2RlPigpOworICAgICAgcE5vZGUtPm1fZHdQYWdlTm8gPSBwS2lkLT5HZXRSZWZPYmpOdW0oKTsKKyAgICAgIHBQYWdlTm9kZS0+bV9DaGlsZE5vZGVzLnB1c2hfYmFjayhzdGQ6Om1vdmUocE5vZGUpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIENQREZfT2JqZWN0OjpBUlJBWTogeworICAgICAgQ1BERl9BcnJheSogcEtpZHNBcnJheSA9IHBLaWRzLT5Bc0FycmF5KCk7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBLaWRzQXJyYXktPkdldENvdW50KCk7ICsraSkgeworICAgICAgICBDUERGX1JlZmVyZW5jZSogcEtpZCA9IFRvUmVmZXJlbmNlKHBLaWRzQXJyYXktPkdldE9iamVjdEF0KGkpKTsKKyAgICAgICAgaWYgKCFwS2lkKQorICAgICAgICAgIGNvbnRpbnVlOworCiAgICAgICAgIGF1dG8gcE5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8UGFnZU5vZGU+KCk7CiAgICAgICAgIHBOb2RlLT5tX2R3UGFnZU5vID0gcEtpZC0+R2V0UmVmT2JqTnVtKCk7CiAgICAgICAgIHBQYWdlTm9kZS0+bV9DaGlsZE5vZGVzLnB1c2hfYmFjayhzdGQ6Om1vdmUocE5vZGUpKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIENQREZfT2JqZWN0OjpBUlJBWTogewotICAgICAgICBDUERGX0FycmF5KiBwS2lkc0FycmF5ID0gcEtpZHMtPkFzQXJyYXkoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwS2lkc0FycmF5LT5HZXRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICBDUERGX1JlZmVyZW5jZSogcEtpZCA9IFRvUmVmZXJlbmNlKHBLaWRzQXJyYXktPkdldE9iamVjdEF0KGkpKTsKLSAgICAgICAgICBpZiAoIXBLaWQpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIGF1dG8gcE5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8UGFnZU5vZGU+KCk7Ci0gICAgICAgICAgcE5vZGUtPm1fZHdQYWdlTm8gPSBwS2lkLT5HZXRSZWZPYmpOdW0oKTsKLSAgICAgICAgICBwUGFnZU5vZGUtPm1fQ2hpbGROb2Rlcy5wdXNoX2JhY2soc3RkOjptb3ZlKHBOb2RlKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOwogICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlID09ICJQYWdlIikgewotICAgIHBQYWdlTm9kZS0+bV90eXBlID0gUERGX1BBR0VOT0RFX1BBR0U7Ci0gIH0gZWxzZSB7Ci0gICAgbV9kb2NTdGF0dXMgPSBQREZfREFUQUFWQUlMX0VSUk9SOwotICAgIHJldHVybiBmYWxzZTsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CiAgIH0KICAgcmV0dXJuIHRydWU7CiB9CkBAIC0xMjE1LDcgKzY0Nyw2IEBACiBib29sIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VOb2RlKGNvbnN0IENQREZfRGF0YUF2YWlsOjpQYWdlTm9kZSYgcGFnZU5vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG93bmxvYWRIaW50cyogcEhpbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpIHsKICAgaWYgKGxldmVsID49IGtNYXhQYWdlUmVjdXJzaW9uRGVwdGgpCiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTIzMiwxMiArNjYzLDEyIEBACiAKICAgICBpZiAocE5vZGUtPm1fdHlwZSA9PSBQREZfUEFHRU5PREVfVU5LTk9XTikgewogICAgICAgLy8gVXBkYXRlcyB0aGUgdHlwZSBmb3IgdGhlIHVua25vd24gcGFnZSBub2RlLgotICAgICAgaWYgKCFDaGVja1Vua25vd25QYWdlTm9kZShwTm9kZS0+bV9kd1BhZ2VObywgcE5vZGUsIHBIaW50cykpCisgICAgICBpZiAoIUNoZWNrVW5rbm93blBhZ2VOb2RlKHBOb2RlLT5tX2R3UGFnZU5vLCBwTm9kZSkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgaWYgKHBOb2RlLT5tX3R5cGUgPT0gUERGX1BBR0VOT0RFX0FSUkFZKSB7CiAgICAgICAvLyBVcGRhdGVzIGEgbW9yZSBzcGVjaWZpYyB0eXBlIGZvciB0aGUgYXJyYXkgcGFnZSBub2RlLgotICAgICAgaWYgKCFDaGVja0FycmF5UGFnZU5vZGUocE5vZGUtPm1fZHdQYWdlTm8sIHBOb2RlLCBwSGludHMpKQorICAgICAgaWYgKCFDaGVja0FycmF5UGFnZU5vZGUocE5vZGUtPm1fZHdQYWdlTm8sIHBOb2RlKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBzd2l0Y2ggKHBOb2RlLT5tX3R5cGUpIHsKQEAgLTEyNDcsNyArNjc4LDcgQEAKICAgICAgICAgICBtX3BEb2N1bWVudC0+U2V0UGFnZU9iak51bShpUGFnZSwgcE5vZGUtPm1fZHdQYWdlTm8pOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgUERGX1BBR0VOT0RFX1BBR0VTOgotICAgICAgICBpZiAoIUNoZWNrUGFnZU5vZGUoKnBOb2RlLCBpUGFnZSwgaUNvdW50LCBwSGludHMsIGxldmVsICsgMSkpCisgICAgICAgIGlmICghQ2hlY2tQYWdlTm9kZSgqcE5vZGUsIGlQYWdlLCBpQ291bnQsIGxldmVsICsgMSkpCiAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgUERGX1BBR0VOT0RFX1VOS05PV046CkBAIC0xMjYzLDcgKzY5NCw3IEBACiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENQREZfRGF0YUF2YWlsOjpMb2FkRG9jUGFnZSh1aW50MzJfdCBkd1BhZ2UsIERvd25sb2FkSGludHMqIHBIaW50cykgeworYm9vbCBDUERGX0RhdGFBdmFpbDo6TG9hZERvY1BhZ2UodWludDMyX3QgZHdQYWdlKSB7CiAgIEZYX1NBRkVfSU5UMzIgc2FmZVBhZ2UgPSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxpbnQzMl90Pihkd1BhZ2UpOwogICBpbnQzMl90IGlQYWdlID0gc2FmZVBhZ2UuVmFsdWVPckRpZSgpOwogICBpZiAobV9wRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpIDw9IGlQYWdlIHx8CkBAIC0xMjc2LDEzICs3MDcsMTIgQEAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogICBpbnQzMl90IGlDb3VudCA9IC0xOwotICByZXR1cm4gQ2hlY2tQYWdlTm9kZShtX1BhZ2VOb2RlLCBpUGFnZSwgaUNvdW50LCBwSGludHMsIDApOworICByZXR1cm4gQ2hlY2tQYWdlTm9kZShtX1BhZ2VOb2RlLCBpUGFnZSwgaUNvdW50LCAwKTsKIH0KIAotYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlQ291bnQoRG93bmxvYWRIaW50cyogcEhpbnRzKSB7Citib29sIENQREZfRGF0YUF2YWlsOjpDaGVja1BhZ2VDb3VudCgpIHsKICAgYm9vbCBiRXhpc3RzID0gZmFsc2U7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gcFBhZ2VzID0KLSAgICAgIEdldE9iamVjdChtX1BhZ2VzT2JqTnVtLCBwSGludHMsICZiRXhpc3RzKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBwUGFnZXMgPSBHZXRPYmplY3QobV9QYWdlc09iak51bSwgJmJFeGlzdHMpOwogICBpZiAoIWJFeGlzdHMpIHsKICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfRVJST1I7CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTMwMSwxMSArNzMxLDExIEBACiAgIHJldHVybiBwUGFnZXNEaWN0LT5HZXRJbnRlZ2VyRm9yKCJDb3VudCIpID4gMDsKIH0KIAotYm9vbCBDUERGX0RhdGFBdmFpbDo6TG9hZERvY1BhZ2VzKERvd25sb2FkSGludHMqIHBIaW50cykgewotICBpZiAoIUNoZWNrVW5rbm93blBhZ2VOb2RlKG1fUGFnZXNPYmpOdW0sICZtX1BhZ2VOb2RlLCBwSGludHMpKQorYm9vbCBDUERGX0RhdGFBdmFpbDo6TG9hZERvY1BhZ2VzKCkgeworICBpZiAoIUNoZWNrVW5rbm93blBhZ2VOb2RlKG1fUGFnZXNPYmpOdW0sICZtX1BhZ2VOb2RlKSkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgaWYgKENoZWNrUGFnZUNvdW50KHBIaW50cykpIHsKKyAgaWYgKENoZWNrUGFnZUNvdW50KCkpIHsKICAgICBtX2RvY1N0YXR1cyA9IFBERl9EQVRBQVZBSUxfUEFHRTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQpAQCAtMTMxNCw5ICs3NDQsOSBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgQ1BERl9EYXRhQXZhaWw6OkxvYWRQYWdlcyhEb3dubG9hZEhpbnRzKiBwSGludHMpIHsKK2Jvb2wgQ1BERl9EYXRhQXZhaWw6OkxvYWRQYWdlcygpIHsKICAgd2hpbGUgKCFtX2JQYWdlc1RyZWVMb2FkKSB7Ci0gICAgaWYgKCFDaGVja1BhZ2VTdGF0dXMocEhpbnRzKSkKKyAgICBpZiAoIUNoZWNrUGFnZVN0YXR1cygpKQogICAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKQEAgLTEzMjcsMjYgKzc1NywzMiBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKLUNQREZfRGF0YUF2YWlsOjpEb2NBdmFpbFN0YXR1cyBDUERGX0RhdGFBdmFpbDo6Q2hlY2tMaW5lYXJpemVkRGF0YSgKLSAgICBEb3dubG9hZEhpbnRzKiBwSGludHMpIHsKK0NQREZfRGF0YUF2YWlsOjpEb2NBdmFpbFN0YXR1cyBDUERGX0RhdGFBdmFpbDo6Q2hlY2tMaW5lYXJpemVkRGF0YSgpIHsKICAgaWYgKG1fYkxpbmVhcmVkRGF0YU9LKQogICAgIHJldHVybiBEYXRhQXZhaWxhYmxlOwogICBBU1NFUlQobV9wTGluZWFyaXplZCk7Ci0gIGlmICghbV9wTGluZWFyaXplZC0+R2V0TGFzdFhSZWZPZmZzZXQoKSkKKyAgaWYgKCFtX3BMaW5lYXJpemVkLT5HZXRNYWluWFJlZlRhYmxlRmlyc3RFbnRyeU9mZnNldCgpIHx8ICFtX3BEb2N1bWVudCB8fAorICAgICAgIW1fcERvY3VtZW50LT5HZXRQYXJzZXIoKSB8fCAhbV9wRG9jdW1lbnQtPkdldFBhcnNlcigpLT5HZXRUcmFpbGVyKCkpIHsKICAgICByZXR1cm4gRGF0YUVycm9yOworICB9CiAKICAgaWYgKCFtX2JNYWluWFJlZkxvYWRUcmllZCkgewotICAgIEZYX1NBRkVfVUlOVDMyIGRhdGFfc2l6ZSA9IG1fZHdGaWxlTGVuOwotICAgIGRhdGFfc2l6ZSAtPSBtX3BMaW5lYXJpemVkLT5HZXRMYXN0WFJlZk9mZnNldCgpOworICAgIGNvbnN0IEZYX1NBRkVfRklMRVNJWkUgbWFpbl94cmVmX29mZnNldCA9CisgICAgICAgIG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+R2V0VHJhaWxlcigpLT5HZXRJbnRlZ2VyRm9yKCJQcmV2Iik7CisgICAgaWYgKCFtYWluX3hyZWZfb2Zmc2V0LklzVmFsaWQoKSkKKyAgICAgIHJldHVybiBEYXRhRXJyb3I7CisKKyAgICBpZiAobWFpbl94cmVmX29mZnNldC5WYWx1ZU9yRGllKCkgPT0gMCkKKyAgICAgIHJldHVybiBEYXRhQXZhaWxhYmxlOworCisgICAgRlhfU0FGRV9TSVpFX1QgZGF0YV9zaXplID0gbV9kd0ZpbGVMZW47CisgICAgZGF0YV9zaXplIC09IG1haW5feHJlZl9vZmZzZXQuVmFsdWVPckRpZSgpOwogICAgIGlmICghZGF0YV9zaXplLklzVmFsaWQoKSkKICAgICAgIHJldHVybiBEYXRhRXJyb3I7CiAKLSAgICBpZiAoIW1fcEZpbGVBdmFpbC0+SXNEYXRhQXZhaWwobV9wTGluZWFyaXplZC0+R2V0TGFzdFhSZWZPZmZzZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9zaXplLlZhbHVlT3JEaWUoKSkpIHsKLSAgICAgIHBIaW50cy0+QWRkU2VnbWVudChtX3BMaW5lYXJpemVkLT5HZXRMYXN0WFJlZk9mZnNldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfc2l6ZS5WYWx1ZU9yRGllKCkpOworICAgIGlmICghR2V0VmFsaWRhdG9yKCktPkNoZWNrRGF0YVJhbmdlQW5kUmVxdWVzdElmVW5hdmFpbGFibGUoCisgICAgICAgICAgICBtYWluX3hyZWZfb2Zmc2V0LlZhbHVlT3JEaWUoKSwgZGF0YV9zaXplLlZhbHVlT3JEaWUoKSkpCiAgICAgICByZXR1cm4gRGF0YU5vdEF2YWlsYWJsZTsKLSAgICB9CiAKICAgICBDUERGX1BhcnNlcjo6RXJyb3IgZVJldCA9CiAgICAgICAgIG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+TG9hZExpbmVhcml6ZWRNYWluWFJlZlRhYmxlKCk7CkBAIC0xMzY0LDIyMyArODAwLDEzOSBAQAogICByZXR1cm4gbV9iTGluZWFyZWREYXRhT0sgPyBEYXRhQXZhaWxhYmxlIDogRGF0YU5vdEF2YWlsYWJsZTsKIH0KIAotYm9vbCBDUERGX0RhdGFBdmFpbDo6Q2hlY2tQYWdlQW5ub3RzKHVpbnQzMl90IGR3UGFnZSwgRG93bmxvYWRIaW50cyogcEhpbnRzKSB7Ci0gIGlmIChtX29ianNfYXJyYXkuZW1wdHkoKSkgewotICAgIG1fT2JqZWN0U2V0LmNsZWFyKCk7Ci0KLSAgICBGWF9TQUZFX0lOVDMyIHNhZmVQYWdlID0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8aW50MzJfdD4oZHdQYWdlKTsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IG1fcERvY3VtZW50LT5HZXRQYWdlKHNhZmVQYWdlLlZhbHVlT3JEaWUoKSk7Ci0gICAgaWYgKCFwUGFnZURpY3QpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIENQREZfT2JqZWN0KiBwQW5ub3RzID0gcFBhZ2VEaWN0LT5HZXRPYmplY3RGb3IoIkFubm90cyIpOwotICAgIGlmICghcEFubm90cykKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgc3RkOjp2ZWN0b3I8Q1BERl9PYmplY3QqPiBvYmpfYXJyYXk7Ci0gICAgb2JqX2FycmF5LnB1c2hfYmFjayhwQW5ub3RzKTsKLSAgICBpZiAoIUFyZU9iamVjdHNBdmFpbGFibGUob2JqX2FycmF5LCBmYWxzZSwgcEhpbnRzLCBtX29ianNfYXJyYXkpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgbV9vYmpzX2FycmF5LmNsZWFyKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBzdGQ6OnZlY3RvcjxDUERGX09iamVjdCo+IG5ld19vYmpzX2FycmF5OwotICBpZiAoIUFyZU9iamVjdHNBdmFpbGFibGUobV9vYmpzX2FycmF5LCBmYWxzZSwgcEhpbnRzLCBuZXdfb2Jqc19hcnJheSkpIHsKLSAgICBtX29ianNfYXJyYXkgPSBuZXdfb2Jqc19hcnJheTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgbV9vYmpzX2FycmF5LmNsZWFyKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1DUERGX0RhdGFBdmFpbDo6RG9jQXZhaWxTdGF0dXMgQ1BERl9EYXRhQXZhaWw6OkNoZWNrTGluZWFyaXplZEZpcnN0UGFnZSgKLSAgICB1aW50MzJfdCBkd1BhZ2UsCi0gICAgRG93bmxvYWRIaW50cyogcEhpbnRzKSB7Ci0gIGlmICghbV9iQW5ub3RzTG9hZCkgewotICAgIGlmICghQ2hlY2tQYWdlQW5ub3RzKGR3UGFnZSwgcEhpbnRzKSkKLSAgICAgIHJldHVybiBEYXRhTm90QXZhaWxhYmxlOwotICAgIG1fYkFubm90c0xvYWQgPSB0cnVlOwotICB9Ci0gIGNvbnN0IGJvb2wgaXNfcGFnZV92YWxpZCA9IFZhbGlkYXRlUGFnZShkd1BhZ2UpOwotICAodm9pZClpc19wYWdlX3ZhbGlkOwotICBBU1NFUlQoaXNfcGFnZV92YWxpZCk7Ci0gIHJldHVybiBEYXRhQXZhaWxhYmxlOwotfQotCi1ib29sIENQREZfRGF0YUF2YWlsOjpIYXZlUmVzb3VyY2VBbmNlc3RvcihDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSB7Ci0gIENGWF9BdXRvUmVzdG9yZXI8aW50PiByZXN0b3Jlcigmc19DdXJyZW50RGF0YUF2YWlsUmVjdXJzaW9uRGVwdGgpOwotICBpZiAoKytzX0N1cnJlbnREYXRhQXZhaWxSZWN1cnNpb25EZXB0aCA+IGtNYXhEYXRhQXZhaWxSZWN1cnNpb25EZXB0aCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1BERl9PYmplY3QqIHBQYXJlbnQgPSBwRGljdC0+R2V0T2JqZWN0Rm9yKCJQYXJlbnQiKTsKLSAgaWYgKCFwUGFyZW50KQotICAgIHJldHVybiBmYWxzZTsKLQotICBDUERGX0RpY3Rpb25hcnkqIHBQYXJlbnREaWN0ID0gcFBhcmVudC0+R2V0RGljdCgpOwotICBpZiAoIXBQYXJlbnREaWN0KQotICAgIHJldHVybiBmYWxzZTsKLQotICBDUERGX09iamVjdCogcFJldCA9IHBQYXJlbnREaWN0LT5HZXRPYmplY3RGb3IoIlJlc291cmNlcyIpOwotICBpZiAocFJldCkgewotICAgIG1fcFBhZ2VSZXNvdXJjZSA9IHBSZXQ7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gSGF2ZVJlc291cmNlQW5jZXN0b3IocFBhcmVudERpY3QpOwotfQotCiBDUERGX0RhdGFBdmFpbDo6RG9jQXZhaWxTdGF0dXMgQ1BERl9EYXRhQXZhaWw6OklzUGFnZUF2YWlsKAogICAgIHVpbnQzMl90IGR3UGFnZSwKICAgICBEb3dubG9hZEhpbnRzKiBwSGludHMpIHsKICAgaWYgKCFtX3BEb2N1bWVudCkKICAgICByZXR1cm4gRGF0YUVycm9yOwogCisgIGNvbnN0IEZYX1NBRkVfSU5UMzIgc2FmZVBhZ2UgPSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxpbnQzMl90Pihkd1BhZ2UpOworICBpZiAoIXNhZmVQYWdlLklzVmFsaWQoKSkKKyAgICByZXR1cm4gRGF0YUVycm9yOworCisgIGlmIChzYWZlUGFnZS5WYWx1ZU9yRGllKCkgPj0gbV9wRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpKSB7CisgICAgLy8gVGhpcyBpcyBYRkEgcGFnZS4KKyAgICByZXR1cm4gRGF0YUF2YWlsYWJsZTsKKyAgfQorCiAgIGlmIChJc0ZpcnN0Q2hlY2soZHdQYWdlKSkgewogICAgIG1fYkN1clBhZ2VEaWN0TG9hZE9LID0gZmFsc2U7Ci0gICAgbV9iUGFnZUxvYWRlZE9LID0gZmFsc2U7Ci0gICAgbV9iQW5ub3RzTG9hZCA9IGZhbHNlOwotICAgIG1fYk5lZWREb3duTG9hZFJlc291cmNlID0gZmFsc2U7Ci0gICAgbV9vYmpzX2FycmF5LmNsZWFyKCk7Ci0gICAgbV9PYmplY3RTZXQuY2xlYXIoKTsKICAgfQogCiAgIGlmIChwZGZpdW06OkNvbnRhaW5zS2V5KG1fcGFnZXNMb2FkU3RhdGUsIGR3UGFnZSkpCiAgICAgcmV0dXJuIERhdGFBdmFpbGFibGU7CiAKKyAgY29uc3QgSGludHNTY29wZSBoaW50c19zY29wZShHZXRWYWxpZGF0b3IoKS5HZXQoKSwgcEhpbnRzKTsKKwogICBpZiAobV9wTGluZWFyaXplZCkgewogICAgIGlmIChkd1BhZ2UgPT0gbV9wTGluZWFyaXplZC0+R2V0Rmlyc3RQYWdlTm8oKSkgewotICAgICAgRG9jQXZhaWxTdGF0dXMgblJldCA9IENoZWNrTGluZWFyaXplZEZpcnN0UGFnZShkd1BhZ2UsIHBIaW50cyk7Ci0gICAgICBpZiAoblJldCA9PSBEYXRhQXZhaWxhYmxlKQotICAgICAgICBtX3BhZ2VzTG9hZFN0YXRlLmluc2VydChkd1BhZ2UpOwotICAgICAgcmV0dXJuIG5SZXQ7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IG1fcERvY3VtZW50LT5HZXRQYWdlKHNhZmVQYWdlLlZhbHVlT3JEaWUoKSk7CisgICAgICBpZiAoIXBQYWdlRGljdCkKKyAgICAgICAgcmV0dXJuIERhdGFFcnJvcjsKKworICAgICAgYXV0byBwYWdlX251bV9vYmogPSBzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICBkd1BhZ2UsIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1BhZ2VPYmplY3RBdmFpbD4oCisgICAgICAgICAgICAgICAgICAgICAgR2V0VmFsaWRhdG9yKCkuR2V0KCksIG1fcERvY3VtZW50LCBwUGFnZURpY3QpKTsKKworICAgICAgQ1BERl9QYWdlT2JqZWN0QXZhaWwqIHBhZ2Vfb2JqX2F2YWlsID0KKyAgICAgICAgICBtX1BhZ2VzT2JqQXZhaWwuaW5zZXJ0KHN0ZDo6bW92ZShwYWdlX251bV9vYmopKS5maXJzdC0+c2Vjb25kLmdldCgpOworICAgICAgLy8gVE9ETyhhcnQtc25ha2UpOiBDaGVjayByZXNvdXJjZXMuCisgICAgICByZXR1cm4gcGFnZV9vYmpfYXZhaWwtPkNoZWNrQXZhaWwoKTsKICAgICB9CiAKLSAgICBEb2NBdmFpbFN0YXR1cyBuUmVzdWx0ID0gQ2hlY2tMaW5lYXJpemVkRGF0YShwSGludHMpOworICAgIERvY0F2YWlsU3RhdHVzIG5SZXN1bHQgPSBDaGVja0xpbmVhcml6ZWREYXRhKCk7CiAgICAgaWYgKG5SZXN1bHQgIT0gRGF0YUF2YWlsYWJsZSkKICAgICAgIHJldHVybiBuUmVzdWx0OwogCiAgICAgaWYgKG1fcEhpbnRUYWJsZXMpIHsKLSAgICAgIG5SZXN1bHQgPSBtX3BIaW50VGFibGVzLT5DaGVja1BhZ2UoZHdQYWdlLCBwSGludHMpOworICAgICAgblJlc3VsdCA9IG1fcEhpbnRUYWJsZXMtPkNoZWNrUGFnZShkd1BhZ2UpOwogICAgICAgaWYgKG5SZXN1bHQgIT0gRGF0YUF2YWlsYWJsZSkKICAgICAgICAgcmV0dXJuIG5SZXN1bHQ7Ci0gICAgICBtX3BhZ2VzTG9hZFN0YXRlLmluc2VydChkd1BhZ2UpOwotICAgICAgcmV0dXJuIEdldFBhZ2UoZHdQYWdlKSA/IERhdGFBdmFpbGFibGUgOiBEYXRhRXJyb3I7CisgICAgICBpZiAoR2V0UGFnZShkd1BhZ2UpKSB7CisgICAgICAgIG1fcGFnZXNMb2FkU3RhdGUuaW5zZXJ0KGR3UGFnZSk7CisgICAgICAgIHJldHVybiBEYXRhQXZhaWxhYmxlOworICAgICAgfQogICAgIH0KIAotICAgIGlmIChtX2JNYWluWFJlZkxvYWRlZE9LKSB7Ci0gICAgICBpZiAobV9iVG90YWxMb2FkUGFnZVRyZWUpIHsKLSAgICAgICAgaWYgKCFMb2FkUGFnZXMocEhpbnRzKSkKLSAgICAgICAgICByZXR1cm4gRGF0YU5vdEF2YWlsYWJsZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghbV9iQ3VyUGFnZURpY3RMb2FkT0sgJiYgIUNoZWNrUGFnZShkd1BhZ2UsIHBIaW50cykpCi0gICAgICAgICAgcmV0dXJuIERhdGFOb3RBdmFpbGFibGU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghTG9hZEFsbEZpbGUocEhpbnRzKSkKKyAgICBpZiAoIW1fYk1haW5YUmVmTG9hZGVkT0spIHsKKyAgICAgIGlmICghTG9hZEFsbEZpbGUoKSkKICAgICAgICAgcmV0dXJuIERhdGFOb3RBdmFpbGFibGU7CiAgICAgICBtX3BEb2N1bWVudC0+R2V0UGFyc2VyKCktPlJlYnVpbGRDcm9zc1JlZigpOwogICAgICAgUmVzZXRGaXJzdENoZWNrKGR3UGFnZSk7CiAgICAgICByZXR1cm4gRGF0YUF2YWlsYWJsZTsKICAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKCFtX2JUb3RhbExvYWRQYWdlVHJlZSAmJiAhbV9iQ3VyUGFnZURpY3RMb2FkT0sgJiYKLSAgICAgICAgIUNoZWNrUGFnZShkd1BhZ2UsIHBIaW50cykpIHsKLSAgICAgIHJldHVybiBEYXRhTm90QXZhaWxhYmxlOwotICAgIH0KLSAgfQotCi0gIGlmIChtX2JIYXZlQWNyb0Zvcm0gJiYgIW1fYkFjcm9Gb3JtTG9hZCkgewotICAgIGlmICghQ2hlY2tBY3JvRm9ybVN1Yk9iamVjdChwSGludHMpKQotICAgICAgcmV0dXJuIERhdGFOb3RBdmFpbGFibGU7Ci0gICAgbV9iQWNyb0Zvcm1Mb2FkID0gdHJ1ZTsKLSAgfQotCi0gIGlmICghbV9iUGFnZUxvYWRlZE9LKSB7Ci0gICAgaWYgKG1fb2Jqc19hcnJheS5lbXB0eSgpKSB7Ci0gICAgICBtX09iamVjdFNldC5jbGVhcigpOwotCi0gICAgICBGWF9TQUZFX0lOVDMyIHNhZmVQYWdlID0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8aW50MzJfdD4oZHdQYWdlKTsKLSAgICAgIG1fcFBhZ2VEaWN0ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2Uoc2FmZVBhZ2UuVmFsdWVPckRpZSgpKTsKLSAgICAgIGlmICghbV9wUGFnZURpY3QpIHsKLSAgICAgICAgUmVzZXRGaXJzdENoZWNrKGR3UGFnZSk7Ci0gICAgICAgIC8vIFRoaXMgaXMgWEZBIHBhZ2UuCi0gICAgICAgIHJldHVybiBEYXRhQXZhaWxhYmxlOwotICAgICAgfQotCi0gICAgICBzdGQ6OnZlY3RvcjxDUERGX09iamVjdCo+IG9ial9hcnJheTsKLSAgICAgIG9ial9hcnJheS5wdXNoX2JhY2sobV9wUGFnZURpY3QpOwotICAgICAgaWYgKCFBcmVPYmplY3RzQXZhaWxhYmxlKG9ial9hcnJheSwgdHJ1ZSwgcEhpbnRzLCBtX29ianNfYXJyYXkpKQorICAgIGlmIChtX2JUb3RhbExvYWRQYWdlVHJlZSkgeworICAgICAgaWYgKCFMb2FkUGFnZXMoKSkKICAgICAgICAgcmV0dXJuIERhdGFOb3RBdmFpbGFibGU7Ci0KLSAgICAgIG1fb2Jqc19hcnJheS5jbGVhcigpOwogICAgIH0gZWxzZSB7Ci0gICAgICBzdGQ6OnZlY3RvcjxDUERGX09iamVjdCo+IG5ld19vYmpzX2FycmF5OwotICAgICAgaWYgKCFBcmVPYmplY3RzQXZhaWxhYmxlKG1fb2Jqc19hcnJheSwgZmFsc2UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpKSB7Ci0gICAgICAgIG1fb2Jqc19hcnJheSA9IG5ld19vYmpzX2FycmF5OworICAgICAgaWYgKCFtX2JDdXJQYWdlRGljdExvYWRPSyAmJiAhQ2hlY2tQYWdlKGR3UGFnZSkpCiAgICAgICAgIHJldHVybiBEYXRhTm90QXZhaWxhYmxlOwotICAgICAgfQogICAgIH0KLSAgICBtX29ianNfYXJyYXkuY2xlYXIoKTsKLSAgICBtX2JQYWdlTG9hZGVkT0sgPSB0cnVlOwotICB9Ci0KLSAgaWYgKCFtX2JBbm5vdHNMb2FkKSB7Ci0gICAgaWYgKCFDaGVja1BhZ2VBbm5vdHMoZHdQYWdlLCBwSGludHMpKQorICB9IGVsc2UgeworICAgIGlmICghbV9iVG90YWxMb2FkUGFnZVRyZWUgJiYgIW1fYkN1clBhZ2VEaWN0TG9hZE9LICYmICFDaGVja1BhZ2UoZHdQYWdlKSkgewogICAgICAgcmV0dXJuIERhdGFOb3RBdmFpbGFibGU7Ci0gICAgbV9iQW5ub3RzTG9hZCA9IHRydWU7CisgICAgfQogICB9CiAKLSAgaWYgKG1fcFBhZ2VEaWN0ICYmICFtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSkgewotICAgIG1fcFBhZ2VSZXNvdXJjZSA9IG1fcFBhZ2VEaWN0LT5HZXRPYmplY3RGb3IoIlJlc291cmNlcyIpOwotICAgIG1fYk5lZWREb3duTG9hZFJlc291cmNlID0KLSAgICAgICAgbV9wUGFnZVJlc291cmNlIHx8IEhhdmVSZXNvdXJjZUFuY2VzdG9yKG1fcFBhZ2VEaWN0KTsKKyAgaWYgKENoZWNrQWNyb0Zvcm0oKSA9PSBEb2NGb3JtU3RhdHVzOjpGb3JtTm90QXZhaWxhYmxlKQorICAgIHJldHVybiBEYXRhTm90QXZhaWxhYmxlOworCisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gbV9wRG9jdW1lbnQtPkdldFBhZ2Uoc2FmZVBhZ2UuVmFsdWVPckRpZSgpKTsKKyAgaWYgKCFwUGFnZURpY3QpCisgICAgcmV0dXJuIERhdGFFcnJvcjsKKworICB7CisgICAgYXV0byBwYWdlX251bV9vYmogPSBzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgZHdQYWdlLCBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9QYWdlT2JqZWN0QXZhaWw+KAorICAgICAgICAgICAgICAgICAgICBHZXRWYWxpZGF0b3IoKS5HZXQoKSwgbV9wRG9jdW1lbnQsIHBQYWdlRGljdCkpOworICAgIENQREZfUGFnZU9iamVjdEF2YWlsKiBwYWdlX29ial9hdmFpbCA9CisgICAgICAgIG1fUGFnZXNPYmpBdmFpbC5pbnNlcnQoc3RkOjptb3ZlKHBhZ2VfbnVtX29iaikpLmZpcnN0LT5zZWNvbmQuZ2V0KCk7CisgICAgY29uc3QgRG9jQXZhaWxTdGF0dXMgc3RhdHVzID0gcGFnZV9vYmpfYXZhaWwtPkNoZWNrQXZhaWwoKTsKKyAgICBpZiAoc3RhdHVzICE9IERvY0F2YWlsU3RhdHVzOjpEYXRhQXZhaWxhYmxlKQorICAgICAgcmV0dXJuIHN0YXR1czsKICAgfQogCi0gIGlmIChtX2JOZWVkRG93bkxvYWRSZXNvdXJjZSkgewotICAgIGlmICghQ2hlY2tSZXNvdXJjZXMocEhpbnRzKSkKLSAgICAgIHJldHVybiBEYXRhTm90QXZhaWxhYmxlOwotICAgIG1fYk5lZWREb3duTG9hZFJlc291cmNlID0gZmFsc2U7Ci0gIH0KKyAgY29uc3QgRG9jQXZhaWxTdGF0dXMgcmVzb3VyY2VzX3N0YXR1cyA9IENoZWNrUmVzb3VyY2VzKHBQYWdlRGljdCk7CisgIGlmIChyZXNvdXJjZXNfc3RhdHVzICE9IERvY0F2YWlsU3RhdHVzOjpEYXRhQXZhaWxhYmxlKQorICAgIHJldHVybiByZXNvdXJjZXNfc3RhdHVzOwogCi0gIG1fYlBhZ2VMb2FkZWRPSyA9IGZhbHNlOwotICBtX2JBbm5vdHNMb2FkID0gZmFsc2U7CiAgIG1fYkN1clBhZ2VEaWN0TG9hZE9LID0gZmFsc2U7Ci0KICAgUmVzZXRGaXJzdENoZWNrKGR3UGFnZSk7CiAgIG1fcGFnZXNMb2FkU3RhdGUuaW5zZXJ0KGR3UGFnZSk7Ci0gIGNvbnN0IGJvb2wgaXNfcGFnZV92YWxpZCA9IFZhbGlkYXRlUGFnZShkd1BhZ2UpOwotICAodm9pZClpc19wYWdlX3ZhbGlkOwotICBBU1NFUlQoaXNfcGFnZV92YWxpZCk7CiAgIHJldHVybiBEYXRhQXZhaWxhYmxlOwogfQogCi1ib29sIENQREZfRGF0YUF2YWlsOjpDaGVja1Jlc291cmNlcyhEb3dubG9hZEhpbnRzKiBwSGludHMpIHsKLSAgaWYgKG1fb2Jqc19hcnJheS5lbXB0eSgpKSB7Ci0gICAgc3RkOjp2ZWN0b3I8Q1BERl9PYmplY3QqPiBvYmpfYXJyYXk7Ci0gICAgb2JqX2FycmF5LnB1c2hfYmFjayhtX3BQYWdlUmVzb3VyY2UpOwotICAgIGlmICghQXJlT2JqZWN0c0F2YWlsYWJsZShvYmpfYXJyYXksIHRydWUsIHBIaW50cywgbV9vYmpzX2FycmF5KSkKLSAgICAgIHJldHVybiBmYWxzZTsKK0NQREZfRGF0YUF2YWlsOjpEb2NBdmFpbFN0YXR1cyBDUERGX0RhdGFBdmFpbDo6Q2hlY2tSZXNvdXJjZXMoCisgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwYWdlKSB7CisgIEFTU0VSVChwYWdlKTsKKyAgY29uc3QgQ1BERl9SZWFkVmFsaWRhdG9yOjpTZXNzaW9uIHJlYWRfc2Vzc2lvbihHZXRWYWxpZGF0b3IoKS5HZXQoKSk7CisgIGNvbnN0IENQREZfT2JqZWN0KiByZXNvdXJjZXMgPSBHZXRSZXNvdXJjZU9iamVjdChwYWdlKTsKKyAgaWYgKEdldFZhbGlkYXRvcigpLT5oYXNfcmVhZF9wcm9ibGVtcygpKQorICAgIHJldHVybiBEb2NBdmFpbFN0YXR1czo6RGF0YU5vdEF2YWlsYWJsZTsKIAotICAgIG1fb2Jqc19hcnJheS5jbGVhcigpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHN0ZDo6dmVjdG9yPENQREZfT2JqZWN0Kj4gbmV3X29ianNfYXJyYXk7Ci0gIGlmICghQXJlT2JqZWN0c0F2YWlsYWJsZShtX29ianNfYXJyYXksIGZhbHNlLCBwSGludHMsIG5ld19vYmpzX2FycmF5KSkgewotICAgIG1fb2Jqc19hcnJheSA9IG5ld19vYmpzX2FycmF5OwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBtX29ianNfYXJyYXkuY2xlYXIoKTsKLSAgcmV0dXJuIHRydWU7CisgIGlmICghcmVzb3VyY2VzKQorICAgIHJldHVybiBEb2NBdmFpbFN0YXR1czo6RGF0YUF2YWlsYWJsZTsKKworICBDUERGX1BhZ2VPYmplY3RBdmFpbCogcmVzb3VyY2VfYXZhaWwgPQorICAgICAgbV9QYWdlc1Jlc291cmNlc0F2YWlsCisgICAgICAgICAgLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgcmVzb3VyY2VzLCBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9QYWdlT2JqZWN0QXZhaWw+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRWYWxpZGF0b3IoKS5HZXQoKSwgbV9wRG9jdW1lbnQsIHJlc291cmNlcykpKQorICAgICAgICAgIC5maXJzdC0+c2Vjb25kLmdldCgpOworICByZXR1cm4gcmVzb3VyY2VfYXZhaWwtPkNoZWNrQXZhaWwoKTsKIH0KIAotdm9pZCBDUERGX0RhdGFBdmFpbDo6R2V0TGluZWFyaXplZE1haW5YUmVmSW5mbyhGWF9GSUxFU0laRSogcFBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBTaXplKSB7Ci0gIGlmIChwUG9zKQotICAgICpwUG9zID0gbV9kd0xhc3RYUmVmT2Zmc2V0OwotICBpZiAocFNpemUpCi0gICAgKnBTaXplID0gKHVpbnQzMl90KShtX2R3RmlsZUxlbiAtIG1fZHdMYXN0WFJlZk9mZnNldCk7CitSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gQ1BERl9EYXRhQXZhaWw6OkdldEZpbGVSZWFkKCkgY29uc3QgeworICByZXR1cm4gbV9wRmlsZVJlYWQ7Cit9CisKK1JldGFpblB0cjxDUERGX1JlYWRWYWxpZGF0b3I+IENQREZfRGF0YUF2YWlsOjpHZXRWYWxpZGF0b3IoKSBjb25zdCB7CisgIHJldHVybiBtX3BGaWxlUmVhZDsKK30KKworQ1BERl9TeW50YXhQYXJzZXIqIENQREZfRGF0YUF2YWlsOjpHZXRTeW50YXhQYXJzZXIoKSBjb25zdCB7CisgIHJldHVybiBtX3BEb2N1bWVudCA/IG1fcERvY3VtZW50LT5HZXRQYXJzZXIoKS0+bV9wU3ludGF4LmdldCgpCisgICAgICAgICAgICAgICAgICAgICA6IG1fcGFyc2VyLm1fcFN5bnRheC5nZXQoKTsKIH0KIAogaW50IENQREZfRGF0YUF2YWlsOjpHZXRQYWdlQ291bnQoKSBjb25zdCB7CkBAIC0xNjExLDMxICs5NjMsMzQgQEAKICAgbV9wRG9jdW1lbnQtPlNldFBhZ2VPYmpOdW0oaW5kZXgsIGR3T2JqTnVtKTsKICAgLy8gUGFnZSBvYmplY3QgYWxyZWFkeSBjYW4gYmUgcGFyc2VkIGluIGRvY3VtZW50LgogICBpZiAoIW1fcERvY3VtZW50LT5HZXRJbmRpcmVjdE9iamVjdChkd09iak51bSkpIHsKLSAgICBtX3N5bnRheFBhcnNlci5Jbml0UGFyc2VyKAotICAgICAgICBtX3BGaWxlUmVhZCwgcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8dWludDMyX3Q+KHN6UGFnZVN0YXJ0UG9zKSk7CiAgICAgbV9wRG9jdW1lbnQtPlJlcGxhY2VJbmRpcmVjdE9iamVjdElmSGlnaGVyR2VuZXJhdGlvbigKLSAgICAgICAgZHdPYmpOdW0sIFBhcnNlSW5kaXJlY3RPYmplY3RBdCgwLCBkd09iak51bSwgbV9wRG9jdW1lbnQpKTsKKyAgICAgICAgZHdPYmpOdW0sIFBhcnNlSW5kaXJlY3RPYmplY3RBdChzelBhZ2VTdGFydFBvcywgZHdPYmpOdW0sIG1fcERvY3VtZW50KSk7CiAgIH0KLSAgY29uc3QgYm9vbCBpc19wYWdlX3ZhbGlkID0gVmFsaWRhdGVQYWdlKGluZGV4KTsKLSAgKHZvaWQpaXNfcGFnZV92YWxpZDsKLSAgQVNTRVJUKGlzX3BhZ2VfdmFsaWQpOworICBpZiAoIVZhbGlkYXRlUGFnZShpbmRleCkpCisgICAgcmV0dXJuIG51bGxwdHI7CiAgIHJldHVybiBtX3BEb2N1bWVudC0+R2V0UGFnZShpbmRleCk7CiB9CiAKIENQREZfRGF0YUF2YWlsOjpEb2NGb3JtU3RhdHVzIENQREZfRGF0YUF2YWlsOjpJc0Zvcm1BdmFpbCgKICAgICBEb3dubG9hZEhpbnRzKiBwSGludHMpIHsKKyAgY29uc3QgSGludHNTY29wZSBoaW50c19zY29wZShHZXRWYWxpZGF0b3IoKS5HZXQoKSwgcEhpbnRzKTsKKyAgcmV0dXJuIENoZWNrQWNyb0Zvcm0oKTsKK30KKworQ1BERl9EYXRhQXZhaWw6OkRvY0Zvcm1TdGF0dXMgQ1BERl9EYXRhQXZhaWw6OkNoZWNrQWNyb0Zvcm0oKSB7CiAgIGlmICghbV9wRG9jdW1lbnQpCiAgICAgcmV0dXJuIEZvcm1BdmFpbGFibGU7CisKICAgaWYgKG1fcExpbmVhcml6ZWQpIHsKLSAgICBEb2NBdmFpbFN0YXR1cyBuRG9jU3RhdHVzID0gQ2hlY2tMaW5lYXJpemVkRGF0YShwSGludHMpOworICAgIERvY0F2YWlsU3RhdHVzIG5Eb2NTdGF0dXMgPSBDaGVja0xpbmVhcml6ZWREYXRhKCk7CiAgICAgaWYgKG5Eb2NTdGF0dXMgPT0gRGF0YUVycm9yKQogICAgICAgcmV0dXJuIEZvcm1FcnJvcjsKICAgICBpZiAobkRvY1N0YXR1cyA9PSBEYXRhTm90QXZhaWxhYmxlKQogICAgICAgcmV0dXJuIEZvcm1Ob3RBdmFpbGFibGU7CiAgIH0KIAotICBpZiAoIW1fYkxpbmVhcml6ZWRGb3JtUGFyYW1Mb2FkKSB7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7CisgIGlmICghbV9wRm9ybUF2YWlsKSB7CisgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7CiAgICAgaWYgKCFwUm9vdCkKICAgICAgIHJldHVybiBGb3JtQXZhaWxhYmxlOwogCkBAIC0xNjQzLDIxICs5OTgsMjAgQEAKICAgICBpZiAoIXBBY3JvRm9ybSkKICAgICAgIHJldHVybiBGb3JtTm90RXhpc3Q7CiAKLSAgICBtX29ianNfYXJyYXkucHVzaF9iYWNrKHBBY3JvRm9ybS0+R2V0RGljdCgpKTsKLSAgICBtX2JMaW5lYXJpemVkRm9ybVBhcmFtTG9hZCA9IHRydWU7CisgICAgbV9wRm9ybUF2YWlsID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfUGFnZU9iamVjdEF2YWlsPigKKyAgICAgICAgR2V0VmFsaWRhdG9yKCkuR2V0KCksIG1fcERvY3VtZW50LCBwQWNyb0Zvcm0pOwogICB9Ci0KLSAgc3RkOjp2ZWN0b3I8Q1BERl9PYmplY3QqPiBuZXdfb2Jqc19hcnJheTsKLSAgaWYgKCFBcmVPYmplY3RzQXZhaWxhYmxlKG1fb2Jqc19hcnJheSwgZmFsc2UsIHBIaW50cywgbmV3X29ianNfYXJyYXkpKSB7Ci0gICAgbV9vYmpzX2FycmF5ID0gbmV3X29ianNfYXJyYXk7Ci0gICAgcmV0dXJuIEZvcm1Ob3RBdmFpbGFibGU7CisgIHN3aXRjaCAobV9wRm9ybUF2YWlsLT5DaGVja0F2YWlsKCkpIHsKKyAgICBjYXNlIERvY0F2YWlsU3RhdHVzOjpEYXRhRXJyb3I6CisgICAgICByZXR1cm4gRG9jRm9ybVN0YXR1czo6Rm9ybUVycm9yOworICAgIGNhc2UgRG9jQXZhaWxTdGF0dXM6OkRhdGFOb3RBdmFpbGFibGU6CisgICAgICByZXR1cm4gRG9jRm9ybVN0YXR1czo6Rm9ybU5vdEF2YWlsYWJsZTsKKyAgICBjYXNlIERvY0F2YWlsU3RhdHVzOjpEYXRhQXZhaWxhYmxlOgorICAgICAgcmV0dXJuIERvY0Zvcm1TdGF0dXM6OkZvcm1BdmFpbGFibGU7CisgICAgZGVmYXVsdDoKKyAgICAgIE5PVFJFQUNIRUQoKTsKICAgfQotCi0gIG1fb2Jqc19hcnJheS5jbGVhcigpOwotICBjb25zdCBib29sIGlzX2Zvcm1fdmFsaWQgPSBWYWxpZGF0ZUZvcm0oKTsKLSAgKHZvaWQpaXNfZm9ybV92YWxpZDsKLSAgQVNTRVJUKGlzX2Zvcm1fdmFsaWQpOwotICByZXR1cm4gRm9ybUF2YWlsYWJsZTsKKyAgcmV0dXJuIERvY0Zvcm1TdGF0dXM6OkZvcm1FcnJvcjsKIH0KIAogYm9vbCBDUERGX0RhdGFBdmFpbDo6VmFsaWRhdGVQYWdlKHVpbnQzMl90IGR3UGFnZSkgewpAQCAtMTY2NSwyMyArMTAxOSwzNSBAQAogICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IG1fcERvY3VtZW50LT5HZXRQYWdlKHNhZmVQYWdlLlZhbHVlT3JEaWUoKSk7CiAgIGlmICghcFBhZ2VEaWN0KQogICAgIHJldHVybiBmYWxzZTsKLSAgc3RkOjp2ZWN0b3I8Q1BERl9PYmplY3QqPiBvYmpfYXJyYXk7Ci0gIG9ial9hcnJheS5wdXNoX2JhY2socFBhZ2VEaWN0KTsKLSAgc3RkOjp2ZWN0b3I8Q1BERl9PYmplY3QqPiBkdW1teTsKLSAgcmV0dXJuIEFyZU9iamVjdHNBdmFpbGFibGUob2JqX2FycmF5LCB0cnVlLCBudWxscHRyLCBkdW1teSk7CisgIENQREZfUGFnZU9iamVjdEF2YWlsIG9ial9hdmFpbChHZXRWYWxpZGF0b3IoKS5HZXQoKSwgbV9wRG9jdW1lbnQsIHBQYWdlRGljdCk7CisgIHJldHVybiBvYmpfYXZhaWwuQ2hlY2tBdmFpbCgpID09IERvY0F2YWlsU3RhdHVzOjpEYXRhQXZhaWxhYmxlOwogfQogCi1ib29sIENQREZfRGF0YUF2YWlsOjpWYWxpZGF0ZUZvcm0oKSB7Ci0gIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOwotICBpZiAoIXBSb290KQotICAgIHJldHVybiB0cnVlOwotICBDUERGX09iamVjdCogcEFjcm9Gb3JtID0gcFJvb3QtPkdldE9iamVjdEZvcigiQWNyb0Zvcm0iKTsKLSAgaWYgKCFwQWNyb0Zvcm0pCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdGQ6OnZlY3RvcjxDUERGX09iamVjdCo+IG9ial9hcnJheTsKLSAgb2JqX2FycmF5LnB1c2hfYmFjayhwQWNyb0Zvcm0pOwotICBzdGQ6OnZlY3RvcjxDUERGX09iamVjdCo+IGR1bW15OwotICByZXR1cm4gQXJlT2JqZWN0c0F2YWlsYWJsZShvYmpfYXJyYXksIHRydWUsIG51bGxwdHIsIGR1bW15KTsKK3N0ZDo6cGFpcjxDUERGX1BhcnNlcjo6RXJyb3IsIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0RvY3VtZW50Pj4KK0NQREZfRGF0YUF2YWlsOjpQYXJzZURvY3VtZW50KGNvbnN0IGNoYXIqIHBhc3N3b3JkKSB7CisgIGlmIChtX3BEb2N1bWVudCkgeworICAgIC8vIFdlIGFscmVhZHkgcmV0dXJuZWQgcGFyc2VkIGRvY3VtZW50LgorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihDUERGX1BhcnNlcjo6SEFORExFUl9FUlJPUiwgbnVsbHB0cik7CisgIH0KKyAgYXV0byBwYXJzZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9QYXJzZXI+KCk7CisgIHBhcnNlci0+U2V0UGFzc3dvcmQocGFzc3dvcmQpOworICBhdXRvIGRvY3VtZW50ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRG9jdW1lbnQ+KHN0ZDo6bW92ZShwYXJzZXIpKTsKKworICBDUERGX1JlYWRWYWxpZGF0b3I6OlNlc3Npb24gcmVhZF9zZXNzaW9uKEdldFZhbGlkYXRvcigpLkdldCgpKTsKKyAgQ1BERl9QYXJzZXI6OkVycm9yIGVycm9yID0gZG9jdW1lbnQtPkdldFBhcnNlcigpLT5TdGFydExpbmVhcml6ZWRQYXJzZSgKKyAgICAgIEdldEZpbGVSZWFkKCksIGRvY3VtZW50LmdldCgpKTsKKworICAvLyBBZGRpdGlvbmFsIGNoZWNrLCB0aGF0IGFsbCBvay4KKyAgaWYgKEdldFZhbGlkYXRvcigpLT5oYXNfcmVhZF9wcm9ibGVtcygpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihDUERGX1BhcnNlcjo6SEFORExFUl9FUlJPUiwgbnVsbHB0cik7CisgIH0KKworICBpZiAoZXJyb3IgIT0gQ1BERl9QYXJzZXI6OlNVQ0NFU1MpCisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGVycm9yLCBudWxscHRyKTsKKworICBtX3BEb2N1bWVudCA9IGRvY3VtZW50LmdldCgpOworICByZXR1cm4gc3RkOjptYWtlX3BhaXIoQ1BERl9QYXJzZXI6OlNVQ0NFU1MsIHN0ZDo6bW92ZShkb2N1bWVudCkpOwogfQogCiBDUERGX0RhdGFBdmFpbDo6UGFnZU5vZGU6OlBhZ2VOb2RlKCkgOiBtX3R5cGUoUERGX1BBR0VOT0RFX1VOS05PV04pIHt9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGF0YV9hdmFpbC5oIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RhdGFfYXZhaWwuaAppbmRleCA2NTYzOGNmLi5kZmIxZjBjIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGF0YV9hdmFpbC5oCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kYXRhX2F2YWlsLmgKQEAgLTcsMzQgKzcsMzIgQEAKICNpZm5kZWYgQ09SRV9GUERGQVBJX1BBUlNFUl9DUERGX0RBVEFfQVZBSUxfSF8KICNkZWZpbmUgQ09SRV9GUERGQVBJX1BBUlNFUl9DUERGX0RBVEFfQVZBSUxfSF8KIAorI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3BhcnNlci5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zeW50YXhfcGFyc2VyLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKIAorY2xhc3MgQ1BERl9Dcm9zc1JlZkF2YWlsOwogY2xhc3MgQ1BERl9EaWN0aW9uYXJ5OwogY2xhc3MgQ1BERl9IaW50VGFibGVzOwogY2xhc3MgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlcjsKIGNsYXNzIENQREZfTGluZWFyaXplZEhlYWRlcjsKK2NsYXNzIENQREZfUGFnZU9iamVjdEF2YWlsOwogY2xhc3MgQ1BERl9QYXJzZXI7CitjbGFzcyBDUERGX1JlYWRWYWxpZGF0b3I7CiAKIGVudW0gUERGX0RBVEFBVkFJTF9TVEFUVVMgewogICBQREZfREFUQUFWQUlMX0hFQURFUiA9IDAsCiAgIFBERl9EQVRBQVZBSUxfRklSU1RQQUdFLAogICBQREZfREFUQUFWQUlMX0hJTlRUQUJMRSwKLSAgUERGX0RBVEFBVkFJTF9FTkQsCi0gIFBERl9EQVRBQVZBSUxfQ1JPU1NSRUYsCi0gIFBERl9EQVRBQVZBSUxfQ1JPU1NSRUZfSVRFTSwKLSAgUERGX0RBVEFBVkFJTF9DUk9TU1JFRl9TVFJFQU0sCi0gIFBERl9EQVRBQVZBSUxfVFJBSUxFUiwKICAgUERGX0RBVEFBVkFJTF9MT0FEQUxMQ1JPU1NSRUYsCiAgIFBERl9EQVRBQVZBSUxfUk9PVCwKICAgUERGX0RBVEFBVkFJTF9JTkZPLAotICBQREZfREFUQUFWQUlMX0FDUk9GT1JNLAotICBQREZfREFUQUFWQUlMX0FDUk9GT1JNX1NVQk9CSkVDVCwKICAgUERGX0RBVEFBVkFJTF9QQUdFVFJFRSwKICAgUERGX0RBVEFBVkFJTF9QQUdFLAogICBQREZfREFUQUFWQUlMX1BBR0VfTEFURVJMT0FELApAQCAtNDIsNyArNDAsNiBAQAogICBQREZfREFUQUFWQUlMX0RPTkUsCiAgIFBERl9EQVRBQVZBSUxfRVJST1IsCiAgIFBERl9EQVRBQVZBSUxfTE9BREFMTEZJTEUsCi0gIFBERl9EQVRBQVZBSUxfVFJBSUxFUl9BUFBFTkQKIH07CiAKIGVudW0gUERGX1BBR0VOT0RFX1RZUEUgewpAQCAtODUsMzMgKzgyLDMzIEBACiAgIGNsYXNzIEZpbGVBdmFpbCB7CiAgICBwdWJsaWM6CiAgICAgdmlydHVhbCB+RmlsZUF2YWlsKCk7Ci0gICAgdmlydHVhbCBib29sIElzRGF0YUF2YWlsKEZYX0ZJTEVTSVpFIG9mZnNldCwgdWludDMyX3Qgc2l6ZSkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBJc0RhdGFBdmFpbChGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSA9IDA7CiAgIH07CiAKICAgY2xhc3MgRG93bmxvYWRIaW50cyB7CiAgICBwdWJsaWM6CiAgICAgdmlydHVhbCB+RG93bmxvYWRIaW50cygpOwotICAgIHZpcnR1YWwgdm9pZCBBZGRTZWdtZW50KEZYX0ZJTEVTSVpFIG9mZnNldCwgdWludDMyX3Qgc2l6ZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBBZGRTZWdtZW50KEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpID0gMDsKICAgfTsKIAogICBDUERGX0RhdGFBdmFpbChGaWxlQXZhaWwqIHBGaWxlQXZhaWwsCi0gICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBGaWxlUmVhZCwKKyAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZVJlYWQsCiAgICAgICAgICAgICAgICAgIGJvb2wgYlN1cHBvcnRIaW50VGFibGUpOwogICB+Q1BERl9EYXRhQXZhaWwoKTsKIAotICBib29sIElzRGF0YUF2YWlsKEZYX0ZJTEVTSVpFIG9mZnNldCwgdWludDMyX3Qgc2l6ZSwgRG93bmxvYWRIaW50cyogcEhpbnRzKTsKICAgRG9jQXZhaWxTdGF0dXMgSXNEb2NBdmFpbChEb3dubG9hZEhpbnRzKiBwSGludHMpOwotICB2b2lkIFNldERvY3VtZW50KENQREZfRG9jdW1lbnQqIHBEb2MpOwogICBEb2NBdmFpbFN0YXR1cyBJc1BhZ2VBdmFpbCh1aW50MzJfdCBkd1BhZ2UsIERvd25sb2FkSGludHMqIHBIaW50cyk7CiAgIERvY0Zvcm1TdGF0dXMgSXNGb3JtQXZhaWwoRG93bmxvYWRIaW50cyogcEhpbnRzKTsKICAgRG9jTGluZWFyaXphdGlvblN0YXR1cyBJc0xpbmVhcml6ZWRQREYoKTsKLSAgYm9vbCBJc0xpbmVhcml6ZWQoKTsKLSAgdm9pZCBHZXRMaW5lYXJpemVkTWFpblhSZWZJbmZvKEZYX0ZJTEVTSVpFKiBwUG9zLCB1aW50MzJfdCogcFNpemUpOwotICBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IEdldEZpbGVSZWFkKCkgY29uc3QgewotICAgIHJldHVybiBtX3BGaWxlUmVhZDsKLSAgfQorICBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gR2V0RmlsZVJlYWQoKSBjb25zdDsKICAgaW50IEdldFBhZ2VDb3VudCgpIGNvbnN0OwogICBDUERGX0RpY3Rpb25hcnkqIEdldFBhZ2UoaW50IGluZGV4KTsKKyAgUmV0YWluUHRyPENQREZfUmVhZFZhbGlkYXRvcj4gR2V0VmFsaWRhdG9yKCkgY29uc3Q7CisKKyAgc3RkOjpwYWlyPENQREZfUGFyc2VyOjpFcnJvciwgc3RkOjp1bmlxdWVfcHRyPENQREZfRG9jdW1lbnQ+PiBQYXJzZURvY3VtZW50KAorICAgICAgY29uc3QgY2hhciogcGFzc3dvcmQpOworCisgIGNvbnN0IENQREZfSGludFRhYmxlcyogR2V0SGludFRhYmxlcygpIGNvbnN0IHsgcmV0dXJuIG1fcEhpbnRUYWJsZXMuZ2V0KCk7IH0KIAogIHByb3RlY3RlZDoKICAgY2xhc3MgUGFnZU5vZGUgewpAQCAtMTI0LDEzNCArMTIxLDg0IEBACiAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFBhZ2VOb2RlPj4gbV9DaGlsZE5vZGVzOwogICB9OwogCi0gIHN0YXRpYyBjb25zdCBpbnQga01heERhdGFBdmFpbFJlY3Vyc2lvbkRlcHRoID0gNjQ7Ci0gIHN0YXRpYyBpbnQgc19DdXJyZW50RGF0YUF2YWlsUmVjdXJzaW9uRGVwdGg7CiAgIHN0YXRpYyBjb25zdCBpbnQga01heFBhZ2VSZWN1cnNpb25EZXB0aCA9IDEwMjQ7CiAKLSAgdWludDMyX3QgR2V0T2JqZWN0U2l6ZSh1aW50MzJfdCBvYmpudW0sIEZYX0ZJTEVTSVpFJiBvZmZzZXQpOwotICBib29sIEFyZU9iamVjdHNBdmFpbGFibGUoc3RkOjp2ZWN0b3I8Q1BERl9PYmplY3QqPiYgb2JqX2FycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUGFyc2VQYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRG93bmxvYWRIaW50cyogcEhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q1BERl9PYmplY3QqPiYgcmV0X2FycmF5KTsKLSAgYm9vbCBDaGVja0RvY1N0YXR1cyhEb3dubG9hZEhpbnRzKiBwSGludHMpOwotICBib29sIENoZWNrSGVhZGVyKERvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gIGJvb2wgQ2hlY2tGaXJzdFBhZ2UoRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgYm9vbCBDaGVja0hpbnRUYWJsZXMoRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgYm9vbCBDaGVja0VuZChEb3dubG9hZEhpbnRzKiBwSGludHMpOwotICBib29sIENoZWNrQ3Jvc3NSZWYoRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgYm9vbCBDaGVja0Nyb3NzUmVmSXRlbShEb3dubG9hZEhpbnRzKiBwSGludHMpOwotICBib29sIENoZWNrVHJhaWxlcihEb3dubG9hZEhpbnRzKiBwSGludHMpOwotICBib29sIENoZWNrUm9vdChEb3dubG9hZEhpbnRzKiBwSGludHMpOwotICBib29sIENoZWNrSW5mbyhEb3dubG9hZEhpbnRzKiBwSGludHMpOwotICBib29sIENoZWNrUGFnZXMoRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgYm9vbCBDaGVja1BhZ2UoRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgYm9vbCBDaGVja1Jlc291cmNlcyhEb3dubG9hZEhpbnRzKiBwSGludHMpOwotICBib29sIENoZWNrQW5ub3RzKERvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gIGJvb2wgQ2hlY2tBY3JvRm9ybShEb3dubG9hZEhpbnRzKiBwSGludHMpOwotICBib29sIENoZWNrQWNyb0Zvcm1TdWJPYmplY3QoRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgYm9vbCBDaGVja1RyYWlsZXJBcHBlbmQoRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgYm9vbCBDaGVja1BhZ2VTdGF0dXMoRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgYm9vbCBDaGVja0FsbENyb3NzUmVmU3RyZWFtKERvd25sb2FkSGludHMqIHBIaW50cyk7CisgIGJvb2wgQ2hlY2tEb2NTdGF0dXMoKTsKKyAgYm9vbCBDaGVja0hlYWRlcigpOworICBib29sIENoZWNrRmlyc3RQYWdlKCk7CisgIGJvb2wgQ2hlY2tIaW50VGFibGVzKCk7CisgIGJvb2wgQ2hlY2tSb290KCk7CisgIGJvb2wgQ2hlY2tJbmZvKCk7CisgIGJvb2wgQ2hlY2tQYWdlcygpOworICBib29sIENoZWNrUGFnZSgpOworICBEb2NBdmFpbFN0YXR1cyBDaGVja1Jlc291cmNlcyhjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBhZ2UpOworICBEb2NGb3JtU3RhdHVzIENoZWNrQWNyb0Zvcm0oKTsKKyAgYm9vbCBDaGVja1BhZ2VTdGF0dXMoKTsKIAotICBpbnQzMl90IENoZWNrQ3Jvc3NSZWZTdHJlYW0oRG93bmxvYWRIaW50cyogcEhpbnRzLCBGWF9GSUxFU0laRSYgeHJlZl9vZmZzZXQpOwotICBib29sIElzTGluZWFyaXplZEZpbGUodWludDhfdCogcERhdGEsIHVpbnQzMl90IGR3TGVuKTsKLSAgdm9pZCBTZXRTdGFydE9mZnNldChGWF9GSUxFU0laRSBkd09mZnNldCk7Ci0gIGJvb2wgR2V0TmV4dFRva2VuKENGWF9CeXRlU3RyaW5nJiB0b2tlbik7Ci0gIGJvb2wgR2V0TmV4dENoYXIodWludDhfdCYgY2gpOworICBEb2NBdmFpbFN0YXR1cyBDaGVja0hlYWRlckFuZExpbmVhcml6ZWQoKTsKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBQYXJzZUluZGlyZWN0T2JqZWN0QXQoCiAgICAgICBGWF9GSUxFU0laRSBwb3MsCiAgICAgICB1aW50MzJfdCBvYmpudW0sCiAgICAgICBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBwT2JqTGlzdCA9IG51bGxwdHIpOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IEdldE9iamVjdCh1aW50MzJfdCBvYmpudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvd25sb2FkSGludHMqIHBIaW50cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcEV4aXN0SW5GaWxlKTsKICAgYm9vbCBHZXRQYWdlS2lkcyhDUERGX1BhcnNlciogcFBhcnNlciwgQ1BERl9PYmplY3QqIHBQYWdlcyk7CiAgIGJvb2wgUHJlcGFyZVBhZ2VJdGVtKCk7Ci0gIGJvb2wgTG9hZFBhZ2VzKERvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gIGJvb2wgTG9hZEFsbFhyZWYoRG93bmxvYWRIaW50cyogcEhpbnRzKTsKLSAgYm9vbCBMb2FkQWxsRmlsZShEb3dubG9hZEhpbnRzKiBwSGludHMpOwotICBEb2NBdmFpbFN0YXR1cyBDaGVja0xpbmVhcml6ZWREYXRhKERvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gIGJvb2wgQ2hlY2tQYWdlQW5ub3RzKHVpbnQzMl90IGR3UGFnZSwgRG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgYm9vbCBMb2FkUGFnZXMoKTsKKyAgYm9vbCBDaGVja0FuZExvYWRBbGxYcmVmKCk7CisgIGJvb2wgTG9hZEFsbEZpbGUoKTsKKyAgRG9jQXZhaWxTdGF0dXMgQ2hlY2tMaW5lYXJpemVkRGF0YSgpOwogCi0gIERvY0F2YWlsU3RhdHVzIENoZWNrTGluZWFyaXplZEZpcnN0UGFnZSh1aW50MzJfdCBkd1BhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3dubG9hZEhpbnRzKiBwSGludHMpOwotICBib29sIEhhdmVSZXNvdXJjZUFuY2VzdG9yKENQREZfRGljdGlvbmFyeSogcERpY3QpOwotICBib29sIENoZWNrUGFnZSh1aW50MzJfdCBkd1BhZ2UsIERvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gIGJvb2wgTG9hZERvY1BhZ2VzKERvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gIGJvb2wgTG9hZERvY1BhZ2UodWludDMyX3QgZHdQYWdlLCBEb3dubG9hZEhpbnRzKiBwSGludHMpOworICBib29sIENoZWNrUGFnZSh1aW50MzJfdCBkd1BhZ2UpOworICBib29sIExvYWREb2NQYWdlcygpOworICBib29sIExvYWREb2NQYWdlKHVpbnQzMl90IGR3UGFnZSk7CiAgIGJvb2wgQ2hlY2tQYWdlTm9kZShjb25zdCBQYWdlTm9kZSYgcGFnZU5vZGUsCiAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQYWdlLAogICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgRG93bmxvYWRIaW50cyogcEhpbnRzLAogICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsKTsKLSAgYm9vbCBDaGVja1Vua25vd25QYWdlTm9kZSh1aW50MzJfdCBkd1BhZ2VObywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWdlTm9kZSogcFBhZ2VOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvd25sb2FkSGludHMqIHBIaW50cyk7Ci0gIGJvb2wgQ2hlY2tBcnJheVBhZ2VOb2RlKHVpbnQzMl90IGR3UGFnZU5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQYWdlTm9kZSogcFBhZ2VOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBEb3dubG9hZEhpbnRzKiBwSGludHMpOwotICBib29sIENoZWNrUGFnZUNvdW50KERvd25sb2FkSGludHMqIHBIaW50cyk7CisgIGJvb2wgQ2hlY2tVbmtub3duUGFnZU5vZGUodWludDMyX3QgZHdQYWdlTm8sIFBhZ2VOb2RlKiBwUGFnZU5vZGUpOworICBib29sIENoZWNrQXJyYXlQYWdlTm9kZSh1aW50MzJfdCBkd1BhZ2VObywgUGFnZU5vZGUqIHBQYWdlTm9kZSk7CisgIGJvb2wgQ2hlY2tQYWdlQ291bnQoKTsKICAgYm9vbCBJc0ZpcnN0Q2hlY2sodWludDMyX3QgZHdQYWdlKTsKICAgdm9pZCBSZXNldEZpcnN0Q2hlY2sodWludDMyX3QgZHdQYWdlKTsKICAgYm9vbCBWYWxpZGF0ZVBhZ2UodWludDMyX3QgZHdQYWdlKTsKLSAgYm9vbCBWYWxpZGF0ZUZvcm0oKTsKKyAgQ1BERl9TeW50YXhQYXJzZXIqIEdldFN5bnRheFBhcnNlcigpIGNvbnN0OwogCiAgIEZpbGVBdmFpbCogY29uc3QgbV9wRmlsZUF2YWlsOwotICBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IG1fcEZpbGVSZWFkOworICBSZXRhaW5QdHI8Q1BERl9SZWFkVmFsaWRhdG9yPiBtX3BGaWxlUmVhZDsKICAgQ1BERl9QYXJzZXIgbV9wYXJzZXI7Ci0gIENQREZfU3ludGF4UGFyc2VyIG1fc3ludGF4UGFyc2VyOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IG1fcFJvb3Q7Ci0gIHVpbnQzMl90IG1fZHdSb290T2JqTnVtOwotICB1aW50MzJfdCBtX2R3SW5mb09iak51bTsKKyAgdWludDMyX3QgbV9kd1Jvb3RPYmpOdW0gPSAwOworICB1aW50MzJfdCBtX2R3SW5mb09iak51bSA9IDA7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0xpbmVhcml6ZWRIZWFkZXI+IG1fcExpbmVhcml6ZWQ7Ci0gIENQREZfT2JqZWN0KiBtX3BUcmFpbGVyOwotICBib29sIG1fYkRvY0F2YWlsOwotICBGWF9GSUxFU0laRSBtX2R3SGVhZGVyT2Zmc2V0OwotICBGWF9GSUxFU0laRSBtX2R3TGFzdFhSZWZPZmZzZXQ7Ci0gIEZYX0ZJTEVTSVpFIG1fZHdYUmVmT2Zmc2V0OwotICBGWF9GSUxFU0laRSBtX2R3VHJhaWxlck9mZnNldDsKLSAgRlhfRklMRVNJWkUgbV9kd0N1cnJlbnRPZmZzZXQ7Ci0gIFBERl9EQVRBQVZBSUxfU1RBVFVTIG1fZG9jU3RhdHVzOwotICBGWF9GSUxFU0laRSBtX2R3RmlsZUxlbjsKLSAgQ1BERl9Eb2N1bWVudCogbV9wRG9jdW1lbnQ7Ci0gIHN0ZDo6c2V0PHVpbnQzMl90PiBtX09iamVjdFNldDsKLSAgc3RkOjp2ZWN0b3I8Q1BERl9PYmplY3QqPiBtX29ianNfYXJyYXk7Ci0gIEZYX0ZJTEVTSVpFIG1fUG9zOwotICBGWF9GSUxFU0laRSBtX2J1ZmZlck9mZnNldDsKLSAgdWludDMyX3QgbV9idWZmZXJTaXplOwotICBDRlhfQnl0ZVN0cmluZyBtX1dvcmRCdWY7Ci0gIHVpbnQ4X3QgbV9idWZmZXJEYXRhWzUxMl07Ci0gIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBtX1hSZWZTdHJlYW1MaXN0OworICBib29sIG1fYkRvY0F2YWlsID0gZmFsc2U7CisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0Nyb3NzUmVmQXZhaWw+IG1fcENyb3NzUmVmQXZhaWw7CisgIFBERl9EQVRBQVZBSUxfU1RBVFVTIG1fZG9jU3RhdHVzID0gUERGX0RBVEFBVkFJTF9IRUFERVI7CisgIGNvbnN0IEZYX0ZJTEVTSVpFIG1fZHdGaWxlTGVuOworICBDUERGX0RvY3VtZW50KiBtX3BEb2N1bWVudCA9IG51bGxwdHI7CiAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBtX1BhZ2VPYmpMaXN0OwotICB1aW50MzJfdCBtX1BhZ2VzT2JqTnVtOwotICBib29sIG1fYkxpbmVhcmVkRGF0YU9LOwotICBib29sIG1fYk1haW5YUmVmTG9hZFRyaWVkOwotICBib29sIG1fYk1haW5YUmVmTG9hZGVkT0s7Ci0gIGJvb2wgbV9iUGFnZXNUcmVlTG9hZDsKLSAgYm9vbCBtX2JQYWdlc0xvYWQ7Ci0gIENQREZfUGFyc2VyKiBtX3BDdXJyZW50UGFyc2VyOwotICBGWF9GSUxFU0laRSBtX2R3Q3VycmVudFhSZWZTdGVhbTsKLSAgYm9vbCBtX2JBbm5vdHNMb2FkOwotICBib29sIG1fYkhhdmVBY3JvRm9ybTsKLSAgdWludDMyX3QgbV9kd0Fjcm9Gb3JtT2JqTnVtOwotICBib29sIG1fYkFjcm9Gb3JtTG9hZDsKLSAgQ1BERl9PYmplY3QqIG1fcEFjcm9Gb3JtOwotICBzdGQ6OnZlY3RvcjxDUERGX09iamVjdCo+IG1fYXJyYXlBY3JvZm9ybXM7Ci0gIENQREZfRGljdGlvbmFyeSogbV9wUGFnZURpY3Q7Ci0gIENQREZfT2JqZWN0KiBtX3BQYWdlUmVzb3VyY2U7Ci0gIGJvb2wgbV9iTmVlZERvd25Mb2FkUmVzb3VyY2U7Ci0gIGJvb2wgbV9iUGFnZUxvYWRlZE9LOwotICBib29sIG1fYkxpbmVhcml6ZWRGb3JtUGFyYW1Mb2FkOworICB1aW50MzJfdCBtX1BhZ2VzT2JqTnVtID0gMDsKKyAgYm9vbCBtX2JMaW5lYXJlZERhdGFPSyA9IGZhbHNlOworICBib29sIG1fYk1haW5YUmVmTG9hZFRyaWVkID0gZmFsc2U7CisgIGJvb2wgbV9iTWFpblhSZWZMb2FkZWRPSyA9IGZhbHNlOworICBib29sIG1fYlBhZ2VzVHJlZUxvYWQgPSBmYWxzZTsKKyAgYm9vbCBtX2JQYWdlc0xvYWQgPSBmYWxzZTsKKyAgQ1BERl9QYXJzZXIqIG1fcEN1cnJlbnRQYXJzZXIgPSBudWxscHRyOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9QYWdlT2JqZWN0QXZhaWw+IG1fcEZvcm1BdmFpbDsKICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0Pj4gbV9QYWdlc0FycmF5OwotICB1aW50MzJfdCBtX2R3RW5jcnlwdE9iak51bTsKLSAgRlhfRklMRVNJWkUgbV9kd1ByZXZYUmVmT2Zmc2V0OwotICBib29sIG1fYlRvdGFsTG9hZFBhZ2VUcmVlOwotICBib29sIG1fYkN1clBhZ2VEaWN0TG9hZE9LOworICB1aW50MzJfdCBtX2R3RW5jcnlwdE9iak51bSA9IDA7CisgIGJvb2wgbV9iVG90YWxMb2FkUGFnZVRyZWUgPSBmYWxzZTsKKyAgYm9vbCBtX2JDdXJQYWdlRGljdExvYWRPSyA9IGZhbHNlOwogICBQYWdlTm9kZSBtX1BhZ2VOb2RlOwogICBzdGQ6OnNldDx1aW50MzJfdD4gbV9wYWdlTWFwQ2hlY2tTdGF0ZTsKICAgc3RkOjpzZXQ8dWludDMyX3Q+IG1fcGFnZXNMb2FkU3RhdGU7CisgIHN0ZDo6c2V0PHVpbnQzMl90PiBtX1NlZW5QcmV2UG9zaXRpb25zOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9IaW50VGFibGVzPiBtX3BIaW50VGFibGVzOwotICBib29sIG1fYlN1cHBvcnRIaW50VGFibGU7CisgIGNvbnN0IGJvb2wgbV9iU3VwcG9ydEhpbnRUYWJsZTsKKyAgc3RkOjptYXA8dWludDMyX3QsIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1BhZ2VPYmplY3RBdmFpbD4+IG1fUGFnZXNPYmpBdmFpbDsKKyAgc3RkOjptYXA8Y29uc3QgQ1BERl9PYmplY3QqLCBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9QYWdlT2JqZWN0QXZhaWw+PgorICAgICAgbV9QYWdlc1Jlc291cmNlc0F2YWlsOworICBib29sIG1fYkhlYWRlckF2YWlsID0gZmFsc2U7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9QQVJTRVJfQ1BERl9EQVRBX0FWQUlMX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5jcHAKaW5kZXggNDA4Nzc1My4uMWU3ZjZhOSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmNwcApAQCAtMTEsMTggKzExLDIxIEBACiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYm9vbGVhbi5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9jcnlwdG9faGFuZGxlci5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9uYW1lLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bWJlci5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9yZWZlcmVuY2UuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJlYW0uaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2xvZ2dpbmcuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCiAKIENQREZfRGljdGlvbmFyeTo6Q1BERl9EaWN0aW9uYXJ5KCkKLSAgICA6IENQREZfRGljdGlvbmFyeShDRlhfV2Vha1B0cjxDRlhfQnl0ZVN0cmluZ1Bvb2w+KCkpIHt9CisgICAgOiBDUERGX0RpY3Rpb25hcnkoV2Vha1B0cjxCeXRlU3RyaW5nUG9vbD4oKSkge30KIAotQ1BERl9EaWN0aW9uYXJ5OjpDUERGX0RpY3Rpb25hcnkoY29uc3QgQ0ZYX1dlYWtQdHI8Q0ZYX0J5dGVTdHJpbmdQb29sPiYgcFBvb2wpCitDUERGX0RpY3Rpb25hcnk6OkNQREZfRGljdGlvbmFyeShjb25zdCBXZWFrUHRyPEJ5dGVTdHJpbmdQb29sPiYgcFBvb2wpCiAgICAgOiBtX3BQb29sKHBQb29sKSB7fQogCiBDUERGX0RpY3Rpb25hcnk6On5DUERGX0RpY3Rpb25hcnkoKSB7CkBAIC02OCw2NSArNzEsNjQgQEAKICAgYXV0byBwQ29weSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KG1fcFBvb2wpOwogICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogKnRoaXMpIHsKICAgICBpZiAoIXBkZml1bTo6Q29udGFpbnNLZXkoKnBWaXNpdGVkLCBpdC5zZWNvbmQuZ2V0KCkpKSB7Ci0gICAgICBwQ29weS0+bV9NYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAotICAgICAgICAgIGl0LmZpcnN0LCBpdC5zZWNvbmQtPkNsb25lTm9uQ3ljbGljKGJEaXJlY3QsIHBWaXNpdGVkKSkpOworICAgICAgc3RkOjpzZXQ8Y29uc3QgQ1BERl9PYmplY3QqPiB2aXNpdGVkKCpwVmlzaXRlZCk7CisgICAgICBpZiAoYXV0byBvYmogPSBpdC5zZWNvbmQtPkNsb25lTm9uQ3ljbGljKGJEaXJlY3QsICZ2aXNpdGVkKSkKKyAgICAgICAgcENvcHktPm1fTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihpdC5maXJzdCwgc3RkOjptb3ZlKG9iaikpKTsKICAgICB9CiAgIH0KICAgcmV0dXJuIHN0ZDo6bW92ZShwQ29weSk7CiB9CiAKLUNQREZfT2JqZWN0KiBDUERGX0RpY3Rpb25hcnk6OkdldE9iamVjdEZvcihjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5KSBjb25zdCB7CitDUERGX09iamVjdCogQ1BERl9EaWN0aW9uYXJ5OjpHZXRPYmplY3RGb3IoY29uc3QgQnl0ZVN0cmluZyYga2V5KSBjb25zdCB7CiAgIGF1dG8gaXQgPSBtX01hcC5maW5kKGtleSk7CiAgIHJldHVybiBpdCAhPSBtX01hcC5lbmQoKSA/IGl0LT5zZWNvbmQuZ2V0KCkgOiBudWxscHRyOwogfQogCi1DUERGX09iamVjdCogQ1BERl9EaWN0aW9uYXJ5OjpHZXREaXJlY3RPYmplY3RGb3IoCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGtleSkgY29uc3QgeworQ1BERl9PYmplY3QqIENQREZfRGljdGlvbmFyeTo6R2V0RGlyZWN0T2JqZWN0Rm9yKGNvbnN0IEJ5dGVTdHJpbmcmIGtleSkgY29uc3QgewogICBDUERGX09iamVjdCogcCA9IEdldE9iamVjdEZvcihrZXkpOwogICByZXR1cm4gcCA/IHAtPkdldERpcmVjdCgpIDogbnVsbHB0cjsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9EaWN0aW9uYXJ5OjpHZXRTdHJpbmdGb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGtleSkgY29uc3QgeworQnl0ZVN0cmluZyBDUERGX0RpY3Rpb25hcnk6OkdldFN0cmluZ0Zvcihjb25zdCBCeXRlU3RyaW5nJiBrZXkpIGNvbnN0IHsKICAgQ1BERl9PYmplY3QqIHAgPSBHZXRPYmplY3RGb3Ioa2V5KTsKLSAgcmV0dXJuIHAgPyBwLT5HZXRTdHJpbmcoKSA6IENGWF9CeXRlU3RyaW5nKCk7CisgIHJldHVybiBwID8gcC0+R2V0U3RyaW5nKCkgOiBCeXRlU3RyaW5nKCk7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQREZfRGljdGlvbmFyeTo6R2V0VW5pY29kZVRleHRGb3IoCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGtleSkgY29uc3QgeworV2lkZVN0cmluZyBDUERGX0RpY3Rpb25hcnk6OkdldFVuaWNvZGVUZXh0Rm9yKGNvbnN0IEJ5dGVTdHJpbmcmIGtleSkgY29uc3QgewogICBDUERGX09iamVjdCogcCA9IEdldE9iamVjdEZvcihrZXkpOwogICBpZiAoQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSBUb1JlZmVyZW5jZShwKSkKICAgICBwID0gcFJlZi0+R2V0RGlyZWN0KCk7Ci0gIHJldHVybiBwID8gcC0+R2V0VW5pY29kZVRleHQoKSA6IENGWF9XaWRlU3RyaW5nKCk7CisgIHJldHVybiBwID8gcC0+R2V0VW5pY29kZVRleHQoKSA6IFdpZGVTdHJpbmcoKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9EaWN0aW9uYXJ5OjpHZXRTdHJpbmdGb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBkZWYpIGNvbnN0IHsKK0J5dGVTdHJpbmcgQ1BERl9EaWN0aW9uYXJ5OjpHZXRTdHJpbmdGb3IoY29uc3QgQnl0ZVN0cmluZyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBkZWYpIGNvbnN0IHsKICAgQ1BERl9PYmplY3QqIHAgPSBHZXRPYmplY3RGb3Ioa2V5KTsKLSAgcmV0dXJuIHAgPyBwLT5HZXRTdHJpbmcoKSA6IENGWF9CeXRlU3RyaW5nKGRlZik7CisgIHJldHVybiBwID8gcC0+R2V0U3RyaW5nKCkgOiBCeXRlU3RyaW5nKGRlZik7CiB9CiAKLWludCBDUERGX0RpY3Rpb25hcnk6OkdldEludGVnZXJGb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGtleSkgY29uc3QgeworaW50IENQREZfRGljdGlvbmFyeTo6R2V0SW50ZWdlckZvcihjb25zdCBCeXRlU3RyaW5nJiBrZXkpIGNvbnN0IHsKICAgQ1BERl9PYmplY3QqIHAgPSBHZXRPYmplY3RGb3Ioa2V5KTsKICAgcmV0dXJuIHAgPyBwLT5HZXRJbnRlZ2VyKCkgOiAwOwogfQogCi1pbnQgQ1BERl9EaWN0aW9uYXJ5OjpHZXRJbnRlZ2VyRm9yKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXksIGludCBkZWYpIGNvbnN0IHsKK2ludCBDUERGX0RpY3Rpb25hcnk6OkdldEludGVnZXJGb3IoY29uc3QgQnl0ZVN0cmluZyYga2V5LCBpbnQgZGVmKSBjb25zdCB7CiAgIENQREZfT2JqZWN0KiBwID0gR2V0T2JqZWN0Rm9yKGtleSk7CiAgIHJldHVybiBwID8gcC0+R2V0SW50ZWdlcigpIDogZGVmOwogfQogCi1GWF9GTE9BVCBDUERGX0RpY3Rpb25hcnk6OkdldE51bWJlckZvcihjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5KSBjb25zdCB7CitmbG9hdCBDUERGX0RpY3Rpb25hcnk6OkdldE51bWJlckZvcihjb25zdCBCeXRlU3RyaW5nJiBrZXkpIGNvbnN0IHsKICAgQ1BERl9PYmplY3QqIHAgPSBHZXRPYmplY3RGb3Ioa2V5KTsKICAgcmV0dXJuIHAgPyBwLT5HZXROdW1iZXIoKSA6IDA7CiB9CiAKLWJvb2wgQ1BERl9EaWN0aW9uYXJ5OjpHZXRCb29sZWFuRm9yKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXksCitib29sIENQREZfRGljdGlvbmFyeTo6R2V0Qm9vbGVhbkZvcihjb25zdCBCeXRlU3RyaW5nJiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJEZWZhdWx0KSBjb25zdCB7CiAgIENQREZfT2JqZWN0KiBwID0gR2V0T2JqZWN0Rm9yKGtleSk7CiAgIHJldHVybiBUb0Jvb2xlYW4ocCkgPyBwLT5HZXRJbnRlZ2VyKCkgIT0gMCA6IGJEZWZhdWx0OwogfQogCi1DUERGX0RpY3Rpb25hcnkqIENQREZfRGljdGlvbmFyeTo6R2V0RGljdEZvcihjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5KSBjb25zdCB7CitDUERGX0RpY3Rpb25hcnkqIENQREZfRGljdGlvbmFyeTo6R2V0RGljdEZvcihjb25zdCBCeXRlU3RyaW5nJiBrZXkpIGNvbnN0IHsKICAgQ1BERl9PYmplY3QqIHAgPSBHZXREaXJlY3RPYmplY3RGb3Ioa2V5KTsKICAgaWYgKCFwKQogICAgIHJldHVybiBudWxscHRyOwpAQCAtMTM3LDE1ICsxMzksMTUgQEAKICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLUNQREZfQXJyYXkqIENQREZfRGljdGlvbmFyeTo6R2V0QXJyYXlGb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGtleSkgY29uc3QgeworQ1BERl9BcnJheSogQ1BERl9EaWN0aW9uYXJ5OjpHZXRBcnJheUZvcihjb25zdCBCeXRlU3RyaW5nJiBrZXkpIGNvbnN0IHsKICAgcmV0dXJuIFRvQXJyYXkoR2V0RGlyZWN0T2JqZWN0Rm9yKGtleSkpOwogfQogCi1DUERGX1N0cmVhbSogQ1BERl9EaWN0aW9uYXJ5OjpHZXRTdHJlYW1Gb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGtleSkgY29uc3QgeworQ1BERl9TdHJlYW0qIENQREZfRGljdGlvbmFyeTo6R2V0U3RyZWFtRm9yKGNvbnN0IEJ5dGVTdHJpbmcmIGtleSkgY29uc3QgewogICByZXR1cm4gVG9TdHJlYW0oR2V0RGlyZWN0T2JqZWN0Rm9yKGtleSkpOwogfQogCi1DRlhfRmxvYXRSZWN0IENQREZfRGljdGlvbmFyeTo6R2V0UmVjdEZvcihjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5KSBjb25zdCB7CitDRlhfRmxvYXRSZWN0IENQREZfRGljdGlvbmFyeTo6R2V0UmVjdEZvcihjb25zdCBCeXRlU3RyaW5nJiBrZXkpIGNvbnN0IHsKICAgQ0ZYX0Zsb2F0UmVjdCByZWN0OwogICBDUERGX0FycmF5KiBwQXJyYXkgPSBHZXRBcnJheUZvcihrZXkpOwogICBpZiAocEFycmF5KQpAQCAtMTUzLDcgKzE1NSw3IEBACiAgIHJldHVybiByZWN0OwogfQogCi1DRlhfTWF0cml4IENQREZfRGljdGlvbmFyeTo6R2V0TWF0cml4Rm9yKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXkpIGNvbnN0IHsKK0NGWF9NYXRyaXggQ1BERl9EaWN0aW9uYXJ5OjpHZXRNYXRyaXhGb3IoY29uc3QgQnl0ZVN0cmluZyYga2V5KSBjb25zdCB7CiAgIENGWF9NYXRyaXggbWF0cml4OwogICBDUERGX0FycmF5KiBwQXJyYXkgPSBHZXRBcnJheUZvcihrZXkpOwogICBpZiAocEFycmF5KQpAQCAtMTYxLDE4ICsxNjMsMTUgQEAKICAgcmV0dXJuIG1hdHJpeDsKIH0KIAotYm9vbCBDUERGX0RpY3Rpb25hcnk6OktleUV4aXN0KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXkpIGNvbnN0IHsKK2Jvb2wgQ1BERl9EaWN0aW9uYXJ5OjpLZXlFeGlzdChjb25zdCBCeXRlU3RyaW5nJiBrZXkpIGNvbnN0IHsKICAgcmV0dXJuIHBkZml1bTo6Q29udGFpbnNLZXkobV9NYXAsIGtleSk7CiB9CiAKIGJvb2wgQ1BERl9EaWN0aW9uYXJ5OjpJc1NpZ25hdHVyZURpY3QoKSBjb25zdCB7Ci0gIENQREZfT2JqZWN0KiBwVHlwZSA9IEdldERpcmVjdE9iamVjdEZvcigiVHlwZSIpOwotICBpZiAoIXBUeXBlKQotICAgIHBUeXBlID0gR2V0RGlyZWN0T2JqZWN0Rm9yKCJGVCIpOwotICByZXR1cm4gcFR5cGUgJiYgcFR5cGUtPkdldFN0cmluZygpID09ICJTaWciOworICByZXR1cm4gQ1BERl9DcnlwdG9IYW5kbGVyOjpJc1NpZ25hdHVyZURpY3Rpb25hcnkodGhpcyk7CiB9CiAKLUNQREZfT2JqZWN0KiBDUERGX0RpY3Rpb25hcnk6OlNldEZvcihjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5LAorQ1BERl9PYmplY3QqIENQREZfRGljdGlvbmFyeTo6U2V0Rm9yKGNvbnN0IEJ5dGVTdHJpbmcmIGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IHBPYmopIHsKICAgaWYgKCFwT2JqKSB7CiAgICAgbV9NYXAuZXJhc2Uoa2V5KTsKQEAgLTE4NSw3ICsxODQsNyBAQAogfQogCiB2b2lkIENQREZfRGljdGlvbmFyeTo6Q29udmVydFRvSW5kaXJlY3RPYmplY3RGb3IoCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGtleSwKKyAgICBjb25zdCBCeXRlU3RyaW5nJiBrZXksCiAgICAgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciogcEhvbGRlcikgewogICBhdXRvIGl0ID0gbV9NYXAuZmluZChrZXkpOwogICBpZiAoaXQgPT0gbV9NYXAuZW5kKCkgfHwgaXQtPnNlY29uZC0+SXNSZWZlcmVuY2UoKSkKQEAgLTE5NSwxMiArMTk0LDE4IEBACiAgIGl0LT5zZWNvbmQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9SZWZlcmVuY2U+KHBIb2xkZXIsIHBPYmotPkdldE9iak51bSgpKTsKIH0KIAotdm9pZCBDUERGX0RpY3Rpb25hcnk6OlJlbW92ZUZvcihjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5KSB7Ci0gIG1fTWFwLmVyYXNlKGtleSk7CitzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IENQREZfRGljdGlvbmFyeTo6UmVtb3ZlRm9yKGNvbnN0IEJ5dGVTdHJpbmcmIGtleSkgeworICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IHJlc3VsdDsKKyAgYXV0byBpdCA9IG1fTWFwLmZpbmQoa2V5KTsKKyAgaWYgKGl0ICE9IG1fTWFwLmVuZCgpKSB7CisgICAgcmVzdWx0ID0gc3RkOjptb3ZlKGl0LT5zZWNvbmQpOworICAgIG1fTWFwLmVyYXNlKGl0KTsKKyAgfQorICByZXR1cm4gcmVzdWx0OwogfQogCi12b2lkIENQREZfRGljdGlvbmFyeTo6UmVwbGFjZUtleShjb25zdCBDRlhfQnl0ZVN0cmluZyYgb2xka2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5ld2tleSkgewordm9pZCBDUERGX0RpY3Rpb25hcnk6OlJlcGxhY2VLZXkoY29uc3QgQnl0ZVN0cmluZyYgb2xka2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgbmV3a2V5KSB7CiAgIGF1dG8gb2xkX2l0ID0gbV9NYXAuZmluZChvbGRrZXkpOwogICBpZiAob2xkX2l0ID09IG1fTWFwLmVuZCgpKQogICAgIHJldHVybjsKQEAgLTIxMyw3ICsyMTgsNyBAQAogICBtX01hcC5lcmFzZShvbGRfaXQpOwogfQogCi12b2lkIENQREZfRGljdGlvbmFyeTo6U2V0UmVjdEZvcihjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5LAordm9pZCBDUERGX0RpY3Rpb25hcnk6OlNldFJlY3RGb3IoY29uc3QgQnl0ZVN0cmluZyYga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgewogICBDUERGX0FycmF5KiBwQXJyYXkgPSBTZXROZXdGb3I8Q1BERl9BcnJheT4oa2V5KTsKICAgcEFycmF5LT5BZGROZXc8Q1BERl9OdW1iZXI+KHJlY3QubGVmdCk7CkBAIC0yMjIsNyArMjI3LDcgQEAKICAgcEFycmF5LT5BZGROZXc8Q1BERl9OdW1iZXI+KHJlY3QudG9wKTsKIH0KIAotdm9pZCBDUERGX0RpY3Rpb25hcnk6OlNldE1hdHJpeEZvcihjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5LAordm9pZCBDUERGX0RpY3Rpb25hcnk6OlNldE1hdHJpeEZvcihjb25zdCBCeXRlU3RyaW5nJiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgewogICBDUERGX0FycmF5KiBwQXJyYXkgPSBTZXROZXdGb3I8Q1BERl9BcnJheT4oa2V5KTsKICAgcEFycmF5LT5BZGROZXc8Q1BERl9OdW1iZXI+KG1hdHJpeC5hKTsKQEAgLTIzMyw2ICsyMzgsMzEgQEAKICAgcEFycmF5LT5BZGROZXc8Q1BERl9OdW1iZXI+KG1hdHJpeC5mKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9EaWN0aW9uYXJ5OjpNYXliZUludGVybihjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKSB7CitCeXRlU3RyaW5nIENQREZfRGljdGlvbmFyeTo6TWF5YmVJbnRlcm4oY29uc3QgQnl0ZVN0cmluZyYgc3RyKSB7CiAgIHJldHVybiBtX3BQb29sID8gbV9wUG9vbC0+SW50ZXJuKHN0cikgOiBzdHI7CiB9CisKK2Jvb2wgQ1BERl9EaWN0aW9uYXJ5OjpXcml0ZVRvKElGWF9BcmNoaXZlU3RyZWFtKiBhcmNoaXZlKSBjb25zdCB7CisgIGlmICghYXJjaGl2ZS0+V3JpdGVTdHJpbmcoIjw8IikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZvciAoY29uc3QgYXV0byYgaXQgOiAqdGhpcykgeworICAgIGNvbnN0IEJ5dGVTdHJpbmcmIGtleSA9IGl0LmZpcnN0OworICAgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBpdC5zZWNvbmQuZ2V0KCk7CisgICAgaWYgKCFhcmNoaXZlLT5Xcml0ZVN0cmluZygiLyIpIHx8CisgICAgICAgICFhcmNoaXZlLT5Xcml0ZVN0cmluZyhQREZfTmFtZUVuY29kZShrZXkpLkFzU3RyaW5nVmlldygpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghcFZhbHVlLT5Jc0lubGluZSgpKSB7CisgICAgICBpZiAoIWFyY2hpdmUtPldyaXRlU3RyaW5nKCIgIikgfHwKKyAgICAgICAgICAhYXJjaGl2ZS0+V3JpdGVEV29yZChwVmFsdWUtPkdldE9iak51bSgpKSB8fAorICAgICAgICAgICFhcmNoaXZlLT5Xcml0ZVN0cmluZygiIDAgUiIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFwVmFsdWUtPldyaXRlVG8oYXJjaGl2ZSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGFyY2hpdmUtPldyaXRlU3RyaW5nKCI+PiIpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgKaW5kZXggMTNjYmRjZi4uNjg4ZTg4ZSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oCkBAIC0xMywxMCArMTMsMTAgQEAKICNpbmNsdWRlIDx1dGlsaXR5PgogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdC5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3N0cmluZ19wb29sX3RlbXBsYXRlLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfd2Vha19wdHIuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3N0cmluZ19wb29sX3RlbXBsYXRlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC93ZWFrX3B0ci5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAogY2xhc3MgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlcjsKQEAgLTI0LDEwICsyNCwxMCBAQAogY2xhc3MgQ1BERl9EaWN0aW9uYXJ5IDogcHVibGljIENQREZfT2JqZWN0IHsKICBwdWJsaWM6CiAgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0KLSAgICAgIHN0ZDo6bWFwPENGWF9CeXRlU3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+Pjo6Y29uc3RfaXRlcmF0b3I7CisgICAgICBzdGQ6Om1hcDxCeXRlU3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+Pjo6Y29uc3RfaXRlcmF0b3I7CiAKICAgQ1BERl9EaWN0aW9uYXJ5KCk7Ci0gIGV4cGxpY2l0IENQREZfRGljdGlvbmFyeShjb25zdCBDRlhfV2Vha1B0cjxDRlhfQnl0ZVN0cmluZ1Bvb2w+JiBwUG9vbCk7CisgIGV4cGxpY2l0IENQREZfRGljdGlvbmFyeShjb25zdCBXZWFrUHRyPEJ5dGVTdHJpbmdQb29sPiYgcFBvb2wpOwogICB+Q1BERl9EaWN0aW9uYXJ5KCkgb3ZlcnJpZGU7CiAKICAgLy8gQ1BERl9PYmplY3Q6CkBAIC0zNyw3OCArMzcsNzYgQEAKICAgYm9vbCBJc0RpY3Rpb25hcnkoKSBjb25zdCBvdmVycmlkZTsKICAgQ1BERl9EaWN0aW9uYXJ5KiBBc0RpY3Rpb25hcnkoKSBvdmVycmlkZTsKICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBBc0RpY3Rpb25hcnkoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBXcml0ZVRvKElGWF9BcmNoaXZlU3RyZWFtKiBhcmNoaXZlKSBjb25zdCBvdmVycmlkZTsKIAogICBzaXplX3QgR2V0Q291bnQoKSBjb25zdCB7IHJldHVybiBtX01hcC5zaXplKCk7IH0KLSAgQ1BERl9PYmplY3QqIEdldE9iamVjdEZvcihjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5KSBjb25zdDsKLSAgQ1BERl9PYmplY3QqIEdldERpcmVjdE9iamVjdEZvcihjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5KSBjb25zdDsKLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0U3RyaW5nRm9yKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXkpIGNvbnN0OwotICBDRlhfQnl0ZVN0cmluZyBHZXRTdHJpbmdGb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBkZWZhdWx0X3N0cikgY29uc3Q7Ci0gIENGWF9XaWRlU3RyaW5nIEdldFVuaWNvZGVUZXh0Rm9yKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXkpIGNvbnN0OwotICBpbnQgR2V0SW50ZWdlckZvcihjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5KSBjb25zdDsKLSAgaW50IEdldEludGVnZXJGb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGtleSwgaW50IGRlZmF1bHRfaW50KSBjb25zdDsKLSAgYm9vbCBHZXRCb29sZWFuRm9yKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXksIGJvb2wgYkRlZmF1bHQgPSBmYWxzZSkgY29uc3Q7Ci0gIEZYX0ZMT0FUIEdldE51bWJlckZvcihjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5KSBjb25zdDsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBHZXREaWN0Rm9yKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXkpIGNvbnN0OwotICBDUERGX1N0cmVhbSogR2V0U3RyZWFtRm9yKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXkpIGNvbnN0OwotICBDUERGX0FycmF5KiBHZXRBcnJheUZvcihjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5KSBjb25zdDsKLSAgQ0ZYX0Zsb2F0UmVjdCBHZXRSZWN0Rm9yKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXkpIGNvbnN0OwotICBDRlhfTWF0cml4IEdldE1hdHJpeEZvcihjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5KSBjb25zdDsKLSAgRlhfRkxPQVQgR2V0RmxvYXRGb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGtleSkgY29uc3QgewotICAgIHJldHVybiBHZXROdW1iZXJGb3Ioa2V5KTsKLSAgfQorICBDUERGX09iamVjdCogR2V0T2JqZWN0Rm9yKGNvbnN0IEJ5dGVTdHJpbmcmIGtleSkgY29uc3Q7CisgIENQREZfT2JqZWN0KiBHZXREaXJlY3RPYmplY3RGb3IoY29uc3QgQnl0ZVN0cmluZyYga2V5KSBjb25zdDsKKyAgQnl0ZVN0cmluZyBHZXRTdHJpbmdGb3IoY29uc3QgQnl0ZVN0cmluZyYga2V5KSBjb25zdDsKKyAgQnl0ZVN0cmluZyBHZXRTdHJpbmdGb3IoY29uc3QgQnl0ZVN0cmluZyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBkZWZhdWx0X3N0cikgY29uc3Q7CisgIFdpZGVTdHJpbmcgR2V0VW5pY29kZVRleHRGb3IoY29uc3QgQnl0ZVN0cmluZyYga2V5KSBjb25zdDsKKyAgaW50IEdldEludGVnZXJGb3IoY29uc3QgQnl0ZVN0cmluZyYga2V5KSBjb25zdDsKKyAgaW50IEdldEludGVnZXJGb3IoY29uc3QgQnl0ZVN0cmluZyYga2V5LCBpbnQgZGVmYXVsdF9pbnQpIGNvbnN0OworICBib29sIEdldEJvb2xlYW5Gb3IoY29uc3QgQnl0ZVN0cmluZyYga2V5LCBib29sIGJEZWZhdWx0ID0gZmFsc2UpIGNvbnN0OworICBmbG9hdCBHZXROdW1iZXJGb3IoY29uc3QgQnl0ZVN0cmluZyYga2V5KSBjb25zdDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXREaWN0Rm9yKGNvbnN0IEJ5dGVTdHJpbmcmIGtleSkgY29uc3Q7CisgIENQREZfU3RyZWFtKiBHZXRTdHJlYW1Gb3IoY29uc3QgQnl0ZVN0cmluZyYga2V5KSBjb25zdDsKKyAgQ1BERl9BcnJheSogR2V0QXJyYXlGb3IoY29uc3QgQnl0ZVN0cmluZyYga2V5KSBjb25zdDsKKyAgQ0ZYX0Zsb2F0UmVjdCBHZXRSZWN0Rm9yKGNvbnN0IEJ5dGVTdHJpbmcmIGtleSkgY29uc3Q7CisgIENGWF9NYXRyaXggR2V0TWF0cml4Rm9yKGNvbnN0IEJ5dGVTdHJpbmcmIGtleSkgY29uc3Q7CisgIGZsb2F0IEdldEZsb2F0Rm9yKGNvbnN0IEJ5dGVTdHJpbmcmIGtleSkgY29uc3QgeyByZXR1cm4gR2V0TnVtYmVyRm9yKGtleSk7IH0KIAotICBib29sIEtleUV4aXN0KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXkpIGNvbnN0OworICBib29sIEtleUV4aXN0KGNvbnN0IEJ5dGVTdHJpbmcmIGtleSkgY29uc3Q7CiAgIGJvb2wgSXNTaWduYXR1cmVEaWN0KCkgY29uc3Q7CiAKICAgLy8gU2V0KiBmdW5jdGlvbnMgaW52YWxpZGF0ZSBpdGVyYXRvcnMgZm9yIHRoZSBlbGVtZW50IHdpdGggdGhlIGtleSB8a2V5fC4KICAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIHxwT2JqfCwgcmV0dXJucyBhbiB1bm93bmVkIHBvaW50ZXIgdG8gaXQuCi0gIENQREZfT2JqZWN0KiBTZXRGb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IHBPYmopOworICBDUERGX09iamVjdCogU2V0Rm9yKGNvbnN0IEJ5dGVTdHJpbmcmIGtleSwgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBwT2JqKTsKIAogICAvLyBDcmVhdGVzIGEgbmV3IG9iamVjdCBvd25lZCBieSB0aGUgZGljdGlvbmFyeSBhbmQgcmV0dXJucyBhbiB1bm93bmVkCiAgIC8vIHBvaW50ZXIgdG8gaXQuCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgogICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhQ2FuSW50ZXJuU3RyaW5nczxUPjo6dmFsdWUsIFQqPjo6dHlwZSBTZXROZXdGb3IoCi0gICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5LAorICAgICAgY29uc3QgQnl0ZVN0cmluZyYga2V5LAogICAgICAgQXJncyYmLi4uIGFyZ3MpIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KAogICAgICAgICBTZXRGb3Ioa2V5LCBwZGZpdW06Ok1ha2VVbmlxdWU8VD4oc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSkpOwogICB9CiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgogICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxDYW5JbnRlcm5TdHJpbmdzPFQ+Ojp2YWx1ZSwgVCo+Ojp0eXBlIFNldE5ld0ZvcigKLSAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXksCisgICAgICBjb25zdCBCeXRlU3RyaW5nJiBrZXksCiAgICAgICBBcmdzJiYuLi4gYXJncykgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDxUKj4oU2V0Rm9yKAogICAgICAgICBrZXksIHBkZml1bTo6TWFrZVVuaXF1ZTxUPihtX3BQb29sLCBzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pKSk7CiAgIH0KIAogICAvLyBDb252ZW5pZW5jZSBmdW5jdGlvbnMgdG8gY29udmVydCBuYXRpdmUgb2JqZWN0cyB0byBhcnJheSBmb3JtLgotICB2b2lkIFNldFJlY3RGb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGtleSwgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCk7Ci0gIHZvaWQgU2V0TWF0cml4Rm9yKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXksIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCk7CisgIHZvaWQgU2V0UmVjdEZvcihjb25zdCBCeXRlU3RyaW5nJiBrZXksIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpOworICB2b2lkIFNldE1hdHJpeEZvcihjb25zdCBCeXRlU3RyaW5nJiBrZXksIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCk7CiAKLSAgdm9pZCBDb252ZXJ0VG9JbmRpcmVjdE9iamVjdEZvcihjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5LAorICB2b2lkIENvbnZlcnRUb0luZGlyZWN0T2JqZWN0Rm9yKGNvbnN0IEJ5dGVTdHJpbmcmIGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBwSG9sZGVyKTsKIAogICAvLyBJbnZhbGlkYXRlcyBpdGVyYXRvcnMgZm9yIHRoZSBlbGVtZW50IHdpdGggdGhlIGtleSB8a2V5fC4KLSAgdm9pZCBSZW1vdmVGb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGtleSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gUmVtb3ZlRm9yKGNvbnN0IEJ5dGVTdHJpbmcmIGtleSk7CiAKICAgLy8gSW52YWxpZGF0ZXMgaXRlcmF0b3JzIGZvciB0aGUgZWxlbWVudCB3aXRoIHRoZSBrZXkgfG9sZGtleXwuCi0gIHZvaWQgUmVwbGFjZUtleShjb25zdCBDRlhfQnl0ZVN0cmluZyYgb2xka2V5LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmV3a2V5KTsKKyAgdm9pZCBSZXBsYWNlS2V5KGNvbnN0IEJ5dGVTdHJpbmcmIG9sZGtleSwgY29uc3QgQnl0ZVN0cmluZyYgbmV3a2V5KTsKIAogICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1fTWFwLmJlZ2luKCk7IH0KICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gbV9NYXAuZW5kKCk7IH0KIAotICBDRlhfV2Vha1B0cjxDRlhfQnl0ZVN0cmluZ1Bvb2w+IEdldEJ5dGVTdHJpbmdQb29sKCkgY29uc3QgeyByZXR1cm4gbV9wUG9vbDsgfQorICBXZWFrUHRyPEJ5dGVTdHJpbmdQb29sPiBHZXRCeXRlU3RyaW5nUG9vbCgpIGNvbnN0IHsgcmV0dXJuIG1fcFBvb2w7IH0KIAogIHByb3RlY3RlZDoKLSAgQ0ZYX0J5dGVTdHJpbmcgTWF5YmVJbnRlcm4oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cik7CisgIEJ5dGVTdHJpbmcgTWF5YmVJbnRlcm4oY29uc3QgQnl0ZVN0cmluZyYgc3RyKTsKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBDbG9uZU5vbkN5Y2xpYygKICAgICAgIGJvb2wgYkRpcmVjdCwKICAgICAgIHN0ZDo6c2V0PGNvbnN0IENQREZfT2JqZWN0Kj4qIHZpc2l0ZWQpIGNvbnN0IG92ZXJyaWRlOwogCi0gIENGWF9XZWFrUHRyPENGWF9CeXRlU3RyaW5nUG9vbD4gbV9wUG9vbDsKLSAgc3RkOjptYXA8Q0ZYX0J5dGVTdHJpbmcsIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4+IG1fTWFwOworICBXZWFrUHRyPEJ5dGVTdHJpbmdQb29sPiBtX3BQb29sOworICBzdGQ6Om1hcDxCeXRlU3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+PiBtX01hcDsKIH07CiAKIGlubGluZSBDUERGX0RpY3Rpb25hcnkqIFRvRGljdGlvbmFyeShDUERGX09iamVjdCogb2JqKSB7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuY3BwIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RvY3VtZW50LmNwcAppbmRleCAyMWViNjFhLi41NjU4ODZhIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudC5jcHAKQEAgLTE0LDggKzE0LDggQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvY3BkZl9tb2R1bGVtZ3IuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2ZvbnRlbmNvZGluZy5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZG9jcGFnZWRhdGEuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2ljY3Byb2ZpbGUuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2Vtb2R1bGUuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9wYWdlaW50LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbGluZWFyaXplZF9oZWFkZXIuaCIKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfZGlic291cmNlLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX2RvY3JlbmRlcmRhdGEuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvSkJpZzJfRG9jdW1lbnRDb250ZXh0LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb2RlcGFnZS5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfdW5pY29kZWVuY29kaW5nLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZvbnQuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCkBAIC0zNyw3ICszOCw3IEBACiAKIGNvbnN0IGludCBGWF9NQVhfUEFHRV9MRVZFTCA9IDEwMjQ7CiAKLWNvbnN0IHVpbnQxNl90IGdfRlhfQ1A4NzRVbmljb2Rlc1sxMjhdID0geworY29uc3QgdWludDE2X3QgZ19GWF9NU0RPU1RoYWlVbmljb2Rlc1sxMjhdID0gewogICAgIDB4MjBBQywgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwMjYsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCiAgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjAxOCwKICAgICAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLApAQCAtNTQsNyArNTUsNyBAQAogICAgIDB4MEU1NSwgMHgwRTU2LCAweDBFNTcsIDB4MEU1OCwgMHgwRTU5LCAweDBFNUEsIDB4MEU1QiwgMHgwMDAwLCAweDAwMDAsCiAgICAgMHgwMDAwLCAweDAwMDAsCiB9OwotY29uc3QgdWludDE2X3QgZ19GWF9DUDEyNTBVbmljb2Rlc1sxMjhdID0geworY29uc3QgdWludDE2X3QgZ19GWF9NU1dpbkVhc3Rlcm5FdXJvcGVhblVuaWNvZGVzWzEyOF0gPSB7CiAgICAgMHgyMEFDLCAweDAwMDAsIDB4MjAxQSwgMHgwMDAwLCAweDIwMUUsIDB4MjAyNiwgMHgyMDIwLCAweDIwMjEsIDB4MDAwMCwKICAgICAweDIwMzAsIDB4MDE2MCwgMHgyMDM5LCAweDAxNUEsIDB4MDE2NCwgMHgwMTdELCAweDAxNzksIDB4MDAwMCwgMHgyMDE4LAogICAgIDB4MjAxOSwgMHgyMDFDLCAweDIwMUQsIDB4MjAyMiwgMHgyMDEzLCAweDIwMTQsIDB4MDAwMCwgMHgyMTIyLCAweDAxNjEsCkBAIC03MSw3ICs3Miw3IEBACiAgICAgMHgwMTUxLCAweDAwRjYsIDB4MDBGNywgMHgwMTU5LCAweDAxNkYsIDB4MDBGQSwgMHgwMTcxLCAweDAwRkMsIDB4MDBGRCwKICAgICAweDAxNjMsIDB4MDJEOSwKIH07Ci1jb25zdCB1aW50MTZfdCBnX0ZYX0NQMTI1MVVuaWNvZGVzWzEyOF0gPSB7Citjb25zdCB1aW50MTZfdCBnX0ZYX01TV2luQ3lyaWxsaWNVbmljb2Rlc1sxMjhdID0gewogICAgIDB4MDQwMiwgMHgwNDAzLCAweDIwMUEsIDB4MDQ1MywgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLCAweDIwQUMsCiAgICAgMHgyMDMwLCAweDA0MDksIDB4MjAzOSwgMHgwNDBBLCAweDA0MEMsIDB4MDQwQiwgMHgwNDBGLCAweDA0NTIsIDB4MjAxOCwKICAgICAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAweDAwMDAsIDB4MjEyMiwgMHgwNDU5LApAQCAtODgsNyArODksNyBAQAogICAgIDB4MDQ0NSwgMHgwNDQ2LCAweDA0NDcsIDB4MDQ0OCwgMHgwNDQ5LCAweDA0NEEsIDB4MDQ0QiwgMHgwNDRDLCAweDA0NEQsCiAgICAgMHgwNDRFLCAweDA0NEYsCiB9OwotY29uc3QgdWludDE2X3QgZ19GWF9DUDEyNTNVbmljb2Rlc1sxMjhdID0geworY29uc3QgdWludDE2X3QgZ19GWF9NU1dpbkdyZWVrVW5pY29kZXNbMTI4XSA9IHsKICAgICAweDIwQUMsIDB4MDAwMCwgMHgyMDFBLCAweDAxOTIsIDB4MjAxRSwgMHgyMDI2LCAweDIwMjAsIDB4MjAyMSwgMHgwMDAwLAogICAgIDB4MjAzMCwgMHgwMDAwLCAweDIwMzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwMTgsCiAgICAgMHgyMDE5LCAweDIwMUMsIDB4MjAxRCwgMHgyMDIyLCAweDIwMTMsIDB4MjAxNCwgMHgwMDAwLCAweDIxMjIsIDB4MDAwMCwKQEAgLTEwNSw3ICsxMDYsNyBAQAogICAgIDB4MDNDNSwgMHgwM0M2LCAweDAzQzcsIDB4MDNDOCwgMHgwM0M5LCAweDAzQ0EsIDB4MDNDQiwgMHgwM0NDLCAweDAzQ0QsCiAgICAgMHgwM0NFLCAweDAwMDAsCiB9OwotY29uc3QgdWludDE2X3QgZ19GWF9DUDEyNTRVbmljb2Rlc1sxMjhdID0geworY29uc3QgdWludDE2X3QgZ19GWF9NU1dpblR1cmtpc2hVbmljb2Rlc1sxMjhdID0gewogICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDE5MiwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLCAweDAyQzYsCiAgICAgMHgyMDMwLCAweDAxNjAsIDB4MjAzOSwgMHgwMTUyLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MjAxOCwKICAgICAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAweDAyREMsIDB4MjEyMiwgMHgwMTYxLApAQCAtMTIyLDcgKzEyMyw3IEBACiAgICAgMHgwMEY1LCAweDAwRjYsIDB4MDBGNywgMHgwMEY4LCAweDAwRjksIDB4MDBGQSwgMHgwMEZCLCAweDAwRkMsIDB4MDEzMSwKICAgICAweDAxNUYsIDB4MDBGRiwKIH07Ci1jb25zdCB1aW50MTZfdCBnX0ZYX0NQMTI1NVVuaWNvZGVzWzEyOF0gPSB7Citjb25zdCB1aW50MTZfdCBnX0ZYX01TV2luSGVicmV3VW5pY29kZXNbMTI4XSA9IHsKICAgICAweDIwQUMsIDB4MDAwMCwgMHgyMDFBLCAweDAxOTIsIDB4MjAxRSwgMHgyMDI2LCAweDIwMjAsIDB4MjAyMSwgMHgwMkM2LAogICAgIDB4MjAzMCwgMHgwMDAwLCAweDIwMzksIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDIwMTgsCiAgICAgMHgyMDE5LCAweDIwMUMsIDB4MjAxRCwgMHgyMDIyLCAweDIwMTMsIDB4MjAxNCwgMHgwMkRDLCAweDIxMjIsIDB4MDAwMCwKQEAgLTEzOSw3ICsxNDAsNyBAQAogICAgIDB4MDVFNSwgMHgwNUU2LCAweDA1RTcsIDB4MDVFOCwgMHgwNUU5LCAweDA1RUEsIDB4MDAwMCwgMHgwMDAwLCAweDIwMEUsCiAgICAgMHgyMDBGLCAweDAwMDAsCiB9OwotY29uc3QgdWludDE2X3QgZ19GWF9DUDEyNTZVbmljb2Rlc1sxMjhdID0geworY29uc3QgdWludDE2X3QgZ19GWF9NU1dpbkFyYWJpY1VuaWNvZGVzWzEyOF0gPSB7CiAgICAgMHgyMEFDLCAweDA2N0UsIDB4MjAxQSwgMHgwMTkyLCAweDIwMUUsIDB4MjAyNiwgMHgyMDIwLCAweDIwMjEsIDB4MDJDNiwKICAgICAweDIwMzAsIDB4MDY3OSwgMHgyMDM5LCAweDAxNTIsIDB4MDY4NiwgMHgwNjk4LCAweDA2ODgsIDB4MDZBRiwgMHgyMDE4LAogICAgIDB4MjAxOSwgMHgyMDFDLCAweDIwMUQsIDB4MjAyMiwgMHgyMDEzLCAweDIwMTQsIDB4MDZBOSwgMHgyMTIyLCAweDA2OTEsCkBAIC0xNTYsNyArMTU3LDcgQEAKICAgICAweDA2NEYsIDB4MDY1MCwgMHgwMEY3LCAweDA2NTEsIDB4MDBGOSwgMHgwNjUyLCAweDAwRkIsIDB4MDBGQywgMHgyMDBFLAogICAgIDB4MjAwRiwgMHgwNkQyLAogfTsKLWNvbnN0IHVpbnQxNl90IGdfRlhfQ1AxMjU3VW5pY29kZXNbMTI4XSA9IHsKK2NvbnN0IHVpbnQxNl90IGdfRlhfTVNXaW5CYWx0aWNVbmljb2Rlc1sxMjhdID0gewogICAgIDB4MjBBQywgMHgwMDAwLCAweDIwMUEsIDB4MDAwMCwgMHgyMDFFLCAweDIwMjYsIDB4MjAyMCwgMHgyMDIxLCAweDAwMDAsCiAgICAgMHgyMDMwLCAweDAwMDAsIDB4MjAzOSwgMHgwMDAwLCAweDAwQTgsIDB4MDJDNywgMHgwMEI4LCAweDAwMDAsIDB4MjAxOCwKICAgICAweDIwMTksIDB4MjAxQywgMHgyMDFELCAweDIwMjIsIDB4MjAxMywgMHgyMDE0LCAweDAwMDAsIDB4MjEyMiwgMHgwMDAwLApAQCAtMTgwLDE0ICsxODEsMTQgQEAKIH07CiAKIGNvbnN0IEZYX0NoYXJzZXRVbmljb2RlcyBnX0ZYX0NoYXJzZXRVbmljb2Rlc1tdID0gewotICAgIHtGWEZPTlRfVEhBSV9DSEFSU0VULCBnX0ZYX0NQODc0VW5pY29kZXN9LAotICAgIHtGWEZPTlRfRUFTVEVVUk9QRV9DSEFSU0VULCBnX0ZYX0NQMTI1MFVuaWNvZGVzfSwKLSAgICB7RlhGT05UX1JVU1NJQU5fQ0hBUlNFVCwgZ19GWF9DUDEyNTFVbmljb2Rlc30sCi0gICAge0ZYRk9OVF9HUkVFS19DSEFSU0VULCBnX0ZYX0NQMTI1M1VuaWNvZGVzfSwKLSAgICB7RlhGT05UX1RVUktJU0hfQ0hBUlNFVCwgZ19GWF9DUDEyNTRVbmljb2Rlc30sCi0gICAge0ZYRk9OVF9IRUJSRVdfQ0hBUlNFVCwgZ19GWF9DUDEyNTVVbmljb2Rlc30sCi0gICAge0ZYRk9OVF9BUkFCSUNfQ0hBUlNFVCwgZ19GWF9DUDEyNTZVbmljb2Rlc30sCi0gICAge0ZYRk9OVF9CQUxUSUNfQ0hBUlNFVCwgZ19GWF9DUDEyNTdVbmljb2Rlc30sCisgICAge0ZYX0NIQVJTRVRfVGhhaSwgZ19GWF9NU0RPU1RoYWlVbmljb2Rlc30sCisgICAge0ZYX0NIQVJTRVRfTVNXaW5fRWFzdGVybkV1cm9wZWFuLCBnX0ZYX01TV2luRWFzdGVybkV1cm9wZWFuVW5pY29kZXN9LAorICAgIHtGWF9DSEFSU0VUX01TV2luX0N5cmlsbGljLCBnX0ZYX01TV2luQ3lyaWxsaWNVbmljb2Rlc30sCisgICAge0ZYX0NIQVJTRVRfTVNXaW5fR3JlZWssIGdfRlhfTVNXaW5HcmVla1VuaWNvZGVzfSwKKyAgICB7RlhfQ0hBUlNFVF9NU1dpbl9UdXJraXNoLCBnX0ZYX01TV2luVHVya2lzaFVuaWNvZGVzfSwKKyAgICB7RlhfQ0hBUlNFVF9NU1dpbl9IZWJyZXcsIGdfRlhfTVNXaW5IZWJyZXdVbmljb2Rlc30sCisgICAge0ZYX0NIQVJTRVRfTVNXaW5fQXJhYmljLCBnX0ZYX01TV2luQXJhYmljVW5pY29kZXN9LAorICAgIHtGWF9DSEFSU0VUX01TV2luX0JhbHRpYywgZ19GWF9NU1dpbkJhbHRpY1VuaWNvZGVzfSwKIH07CiAKIHZvaWQgSW5zZXJ0V2lkdGhBcnJheUltcGwoaW50KiB3aWR0aHMsIGludCBzaXplLCBDUERGX0FycmF5KiBwV2lkdGhBcnJheSkgewpAQCAtMjA4LDcgKzIwOSw3IEBACiAgIEZYX0ZyZWUod2lkdGhzKTsKIH0KIAotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXwogdm9pZCBJbnNlcnRXaWR0aEFycmF5KEhEQyBoREMsIGludCBzdGFydCwgaW50IGVuZCwgQ1BERl9BcnJheSogcFdpZHRoQXJyYXkpIHsKICAgaW50IHNpemUgPSBlbmQgLSBzdGFydCArIDE7CiAgIGludCogd2lkdGhzID0gRlhfQWxsb2MoaW50LCBzaXplKTsKQEAgLTIxNiw4ICsyMTcsOCBAQAogICBJbnNlcnRXaWR0aEFycmF5SW1wbCh3aWR0aHMsIHNpemUsIHBXaWR0aEFycmF5KTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgRlBERl9HZXRQU05hbWVGcm9tVFQoSERDIGhEQykgewotICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7CitCeXRlU3RyaW5nIEZQREZfR2V0UFNOYW1lRnJvbVRUKEhEQyBoREMpIHsKKyAgQnl0ZVN0cmluZyByZXN1bHQ7CiAgIERXT1JEIHNpemUgPSA6OkdldEZvbnREYXRhKGhEQywgJ2VtYW4nLCAwLCBudWxscHRyLCAwKTsKICAgaWYgKHNpemUgIT0gR0RJX0VSUk9SKSB7CiAgICAgTFBCWVRFIGJ1ZmZlciA9IEZYX0FsbG9jKEJZVEUsIHNpemUpOwpAQCAtMjI3LDEyICsyMjgsMTIgQEAKICAgfQogICByZXR1cm4gcmVzdWx0OwogfQotI2VuZGlmICAvLyBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisjZW5kaWYgIC8vIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCiAKIHZvaWQgSW5zZXJ0V2lkdGhBcnJheTEoQ0ZYX0ZvbnQqIHBGb250LAogICAgICAgICAgICAgICAgICAgICAgICBDRlhfVW5pY29kZUVuY29kaW5nKiBwRW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3Qgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QgZW5kLAogICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwV2lkdGhBcnJheSkgewogICBpbnQgc2l6ZSA9IGVuZCAtIHN0YXJ0ICsgMTsKICAgaW50KiB3aWR0aHMgPSBGWF9BbGxvYyhpbnQsIHNpemUpOwpAQCAtMjk4LDcgKzI5OSw3IEBACiB2b2lkIFByb2Nlc3NOb25iQ0pLKENQREZfRGljdGlvbmFyeSogcEJhc2VEaWN0LAogICAgICAgICAgICAgICAgICAgICBib29sIGJvbGQsCiAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXRhbGljLAotICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBiYXNlZm9udCwKKyAgICAgICAgICAgICAgICAgICAgQnl0ZVN0cmluZyBiYXNlZm9udCwKICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENQREZfQXJyYXk+IHBXaWR0aHMpIHsKICAgaWYgKGJvbGQgJiYgaXRhbGljKQogICAgIGJhc2Vmb250ICs9ICIsQm9sZEl0YWxpYyI7CkBAIC0zMTUsNyArMzE2LDcgQEAKIAogc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeT4gQ2FsY3VsYXRlRm9udERlc2MoCiAgICAgQ1BERl9Eb2N1bWVudCogcERvYywKLSAgICBDRlhfQnl0ZVN0cmluZyBiYXNlZm9udCwKKyAgICBCeXRlU3RyaW5nIGJhc2Vmb250LAogICAgIGludCBmbGFncywKICAgICBpbnQgaXRhbGljYW5nbGUsCiAgICAgaW50IGFzY2VuZCwKQEAgLTM0MSwyMCArMzQyLDE4IEBACiAgICAgOiBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKCksCiAgICAgICBtX3BQYXJzZXIoc3RkOjptb3ZlKHBQYXJzZXIpKSwKICAgICAgIG1fcFJvb3REaWN0KG51bGxwdHIpLAotICAgICAgbV9wSW5mb0RpY3QobnVsbHB0ciksCiAgICAgICBtX2lOZXh0UGFnZVRvVHJhdmVyc2UoMCksCiAgICAgICBtX2JSZWFjaGVkTWF4UGFnZUxldmVsKGZhbHNlKSwKICAgICAgIG1fYkxpbmVhcml6ZWQoZmFsc2UpLAogICAgICAgbV9pRmlyc3RQYWdlTm8oMCksCiAgICAgICBtX2R3Rmlyc3RQYWdlT2JqTnVtKDApLAotICAgICAgbV9wRG9jUGFnZShuZXcgQ1BERl9Eb2NQYWdlRGF0YSh0aGlzKSksCi0gICAgICBtX3BEb2NSZW5kZXIobmV3IENQREZfRG9jUmVuZGVyRGF0YSh0aGlzKSkgeworICAgICAgbV9wRG9jUGFnZShwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9Eb2NQYWdlRGF0YT4odGhpcykpLAorICAgICAgbV9wRG9jUmVuZGVyKHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RvY1JlbmRlckRhdGE+KHRoaXMpKSB7CiAgIGlmIChwUGFyc2VyKQogICAgIFNldExhc3RPYmpOdW0obV9wUGFyc2VyLT5HZXRMYXN0T2JqTnVtKCkpOwogfQogCiBDUERGX0RvY3VtZW50Ojp+Q1BERl9Eb2N1bWVudCgpIHsKLSAgZGVsZXRlIG1fcERvY1BhZ2U7CiAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0UGFnZU1vZHVsZSgpLT5DbGVhclN0b2NrRm9udCh0aGlzKTsKIH0KIApAQCAtMzc0LDYgKzM3MywxMyBAQAogICBpZiAoIW1fcFJvb3REaWN0KQogICAgIHJldHVybjsKIAorICBMb2FkRG9jdW1lbnRJbmZvKCk7Cit9CisKK3ZvaWQgQ1BERl9Eb2N1bWVudDo6TG9hZERvY3VtZW50SW5mbygpIHsKKyAgaWYgKCFtX3BQYXJzZXIpCisgICAgcmV0dXJuOworCiAgIENQREZfT2JqZWN0KiBwSW5mb09iaiA9IEdldE9yUGFyc2VJbmRpcmVjdE9iamVjdChtX3BQYXJzZXItPkdldEluZm9PYmpOdW0oKSk7CiAgIGlmIChwSW5mb09iaikKICAgICBtX3BJbmZvRGljdCA9IHBJbmZvT2JqLT5HZXREaWN0KCk7CkBAIC00MDYsNiArNDEyLDcgQEAKICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZXMgPSBtX3BUcmVlVHJhdmVyc2FsW2xldmVsXS5maXJzdDsKICAgQ1BERl9BcnJheSogcEtpZExpc3QgPSBwUGFnZXMtPkdldEFycmF5Rm9yKCJLaWRzIik7CiAgIGlmICghcEtpZExpc3QpIHsKKyAgICBtX3BUcmVlVHJhdmVyc2FsLnBvcF9iYWNrKCk7CiAgICAgaWYgKCpuUGFnZXNUb0dvICE9IDEpCiAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICBtX1BhZ2VMaXN0W2lQYWdlXSA9IHBQYWdlcy0+R2V0T2JqTnVtKCk7CkBAIC00MjEsNiArNDI4LDcgQEAKICAgICAgICBpKyspIHsKICAgICBpZiAoKm5QYWdlc1RvR28gPT0gMCkKICAgICAgIGJyZWFrOworICAgIHBLaWRMaXN0LT5Db252ZXJ0VG9JbmRpcmVjdE9iamVjdEF0KGksIHRoaXMpOwogICAgIENQREZfRGljdGlvbmFyeSogcEtpZCA9IHBLaWRMaXN0LT5HZXREaWN0QXQoaSk7CiAgICAgaWYgKCFwS2lkKSB7CiAgICAgICAoKm5QYWdlc1RvR28pLS07CkBAIC00NjgsNyArNDc2LDcgQEAKIH0KIAogQ1BERl9EaWN0aW9uYXJ5KiBDUERGX0RvY3VtZW50OjpHZXRQYWdlc0RpY3QoKSBjb25zdCB7Ci0gIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBHZXRSb290KCk7CisgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBHZXRSb290KCk7CiAgIHJldHVybiBwUm9vdCA/IHBSb290LT5HZXREaWN0Rm9yKCJQYWdlcyIpIDogbnVsbHB0cjsKIH0KIApAQCAtNDc3LDEwICs0ODUsMTAgQEAKIH0KIAogQ1BERl9EaWN0aW9uYXJ5KiBDUERGX0RvY3VtZW50OjpHZXRQYWdlKGludCBpUGFnZSkgewotICBpZiAoaVBhZ2UgPCAwIHx8IGlQYWdlID49IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50PihtX1BhZ2VMaXN0KSkKKyAgaWYgKCFwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9QYWdlTGlzdCwgaVBhZ2UpKQogICAgIHJldHVybiBudWxscHRyOwogCi0gIGlmIChtX2JMaW5lYXJpemVkICYmIChpUGFnZSA9PSBtX2lGaXJzdFBhZ2VObykpIHsKKyAgaWYgKG1fYkxpbmVhcml6ZWQgJiYgaVBhZ2UgPT0gbV9pRmlyc3RQYWdlTm8pIHsKICAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9CiAgICAgICAgICAgICBUb0RpY3Rpb25hcnkoR2V0T3JQYXJzZUluZGlyZWN0T2JqZWN0KG1fZHdGaXJzdFBhZ2VPYmpOdW0pKSkgewogICAgICAgcmV0dXJuIHBEaWN0OwpAQCAtNDk0LDE4ICs1MDIsMTEgQEAKICAgaWYgKCFwUGFnZXMpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgaWYgKGlQYWdlIC0gbV9pTmV4dFBhZ2VUb1RyYXZlcnNlICsgMSA8PSAwKSB7Ci0gICAgLy8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIHBhZ2UgZG9lcyBub3QgaGF2ZSBhbiBvYmplY3QgbnVtYmVyLiBPbiByZXBlYXRlZAotICAgIC8vIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gZm9yIHRoZSBzYW1lIHBhZ2UgaW5kZXgsIHRoaXMgY29uZGl0aW9uIGNhdXNlcwotICAgIC8vIFRyYXZlcnNlUERGUGFnZXMoKSB0byBpbmNvcnJlY3RseSByZXR1cm4gbnVsbHB0ci4KLSAgICAvLyBFeGFtcGxlICJ0ZXN0aW5nL2NvcnB1cy9meC9vdGhlci9qZXRtYW5fc3RkLnBkZiIKLSAgICAvLyBXZSBzaG91bGQgcmVzdGFydCB0cmF2ZXJzaW5nIGluIHRoaXMgY2FzZS4KLSAgICAvLyBUT0RPKGFydC1zbmFrZSk6IG9wdGltaXplIHRoaXMuCisgIGlmIChtX3BUcmVlVHJhdmVyc2FsLmVtcHR5KCkpIHsKICAgICBSZXNldFRyYXZlcnNhbCgpOworICAgIG1fcFRyZWVUcmF2ZXJzYWwucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKHBQYWdlcywgMCkpOwogICB9CiAgIGludCBuUGFnZXNUb0dvID0gaVBhZ2UgLSBtX2lOZXh0UGFnZVRvVHJhdmVyc2UgKyAxOwotICBpZiAobV9wVHJlZVRyYXZlcnNhbC5lbXB0eSgpKQotICAgIG1fcFRyZWVUcmF2ZXJzYWwucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKHBQYWdlcywgMCkpOwogICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlID0gVHJhdmVyc2VQREZQYWdlcyhpUGFnZSwgJm5QYWdlc1RvR28sIDApOwogICBtX2lOZXh0UGFnZVRvVHJhdmVyc2UgPSBpUGFnZSArIDE7CiAgIHJldHVybiBwUGFnZTsKQEAgLTUxOSw3ICs1MjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHNraXBfY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvYmpudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpIGNvbnN0IHsKICAgaWYgKCFwTm9kZS0+S2V5RXhpc3QoIktpZHMiKSkgewogICAgIGlmIChvYmpudW0gPT0gcE5vZGUtPkdldE9iak51bSgpKQogICAgICAgcmV0dXJuICppbmRleDsKQEAgLTU4Niw3ICs1ODcsNyBAQAogICBpbnQgZm91bmRfaW5kZXggPSBGaW5kUGFnZUluZGV4KHBQYWdlcywgJnNraXBfY291bnQsIG9iam51bSwgJnN0YXJ0X2luZGV4KTsKIAogICAvLyBDb3JydXB0IHBhZ2UgdHJlZSBtYXkgeWllbGQgb3V0LW9mLXJhbmdlIHJlc3VsdHMuCi0gIGlmIChmb3VuZF9pbmRleCA8IDAgfHwgZm91bmRfaW5kZXggPj0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQ+KG1fUGFnZUxpc3QpKQorICBpZiAoIXBkZml1bTo6SW5kZXhJbkJvdW5kcyhtX1BhZ2VMaXN0LCBmb3VuZF9pbmRleCkpCiAgICAgcmV0dXJuIC0xOwogCiAgIG1fUGFnZUxpc3RbZm91bmRfaW5kZXhdID0gb2JqbnVtOwpAQCAtNjI3LDcgKzYyOCw3IEBACiAgIHJldHVybiBtX3BEb2NQYWdlLT5HZXRGb250KHBGb250RGljdCk7CiB9CiAKLUNQREZfU3RyZWFtQWNjKiBDUERGX0RvY3VtZW50OjpMb2FkRm9udEZpbGUoQ1BERl9TdHJlYW0qIHBTdHJlYW0pIHsKK1JldGFpblB0cjxDUERGX1N0cmVhbUFjYz4gQ1BERl9Eb2N1bWVudDo6TG9hZEZvbnRGaWxlKENQREZfU3RyZWFtKiBwU3RyZWFtKSB7CiAgIHJldHVybiBtX3BEb2NQYWdlLT5HZXRGb250RmlsZVN0cmVhbUFjYyhwU3RyZWFtKTsKIH0KIApAQCAtNjQyLDE3ICs2NDMsMTkgQEAKICAgcmV0dXJuIG1fcERvY1BhZ2UtPkdldFBhdHRlcm4ocFBhdHRlcm5PYmosIGJTaGFkaW5nLCBtYXRyaXgpOwogfQogCi1DUERGX0ljY1Byb2ZpbGUqIENQREZfRG9jdW1lbnQ6OkxvYWRJY2NQcm9maWxlKENQREZfU3RyZWFtKiBwU3RyZWFtKSB7CitSZXRhaW5QdHI8Q1BERl9JY2NQcm9maWxlPiBDUERGX0RvY3VtZW50OjpMb2FkSWNjUHJvZmlsZShDUERGX1N0cmVhbSogcFN0cmVhbSkgewogICByZXR1cm4gbV9wRG9jUGFnZS0+R2V0SWNjUHJvZmlsZShwU3RyZWFtKTsKIH0KIAotQ1BERl9JbWFnZSogQ1BERl9Eb2N1bWVudDo6TG9hZEltYWdlRnJvbVBhZ2VEYXRhKHVpbnQzMl90IGR3U3RyZWFtT2JqTnVtKSB7CitSZXRhaW5QdHI8Q1BERl9JbWFnZT4gQ1BERl9Eb2N1bWVudDo6TG9hZEltYWdlRnJvbVBhZ2VEYXRhKAorICAgIHVpbnQzMl90IGR3U3RyZWFtT2JqTnVtKSB7CiAgIEFTU0VSVChkd1N0cmVhbU9iak51bSk7CiAgIHJldHVybiBtX3BEb2NQYWdlLT5HZXRJbWFnZShkd1N0cmVhbU9iak51bSk7CiB9CiAKIHZvaWQgQ1BERl9Eb2N1bWVudDo6Q3JlYXRlTmV3RG9jKCkgewotICBBU1NFUlQoIW1fcFJvb3REaWN0ICYmICFtX3BJbmZvRGljdCk7CisgIEFTU0VSVCghbV9wUm9vdERpY3QpOworICBBU1NFUlQoIW1fcEluZm9EaWN0KTsKICAgbV9wUm9vdERpY3QgPSBOZXdJbmRpcmVjdDxDUERGX0RpY3Rpb25hcnk+KCk7CiAgIG1fcFJvb3REaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiVHlwZSIsICJDYXRhbG9nIik7CiAKQEAgLTcyMyw3ICs3MjYsNyBAQAogfQogCiBib29sIENQREZfRG9jdW1lbnQ6Okluc2VydE5ld1BhZ2UoaW50IGlQYWdlLCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCkgewotICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gR2V0Um9vdCgpOworICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gR2V0Um9vdCgpOwogICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlcyA9IHBSb290ID8gcFJvb3QtPkdldERpY3RGb3IoIlBhZ2VzIikgOiBudWxscHRyOwogICBpZiAoIXBQYWdlcykKICAgICByZXR1cm4gZmFsc2U7CkBAIC03NjUsOSArNzY4LDkgQEAKICAgbV9QYWdlTGlzdC5lcmFzZShtX1BhZ2VMaXN0LmJlZ2luKCkgKyBpUGFnZSk7CiB9CiAKLUNQREZfRm9udCogQ1BERl9Eb2N1bWVudDo6QWRkU3RhbmRhcmRGb250KGNvbnN0IEZYX0NIQVIqIGZvbnQsCitDUERGX0ZvbnQqIENQREZfRG9jdW1lbnQ6OkFkZFN0YW5kYXJkRm9udChjb25zdCBjaGFyKiBmb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250RW5jb2RpbmcqIHBFbmNvZGluZykgewotICBDRlhfQnl0ZVN0cmluZyBuYW1lKGZvbnQpOworICBCeXRlU3RyaW5nIG5hbWUoZm9udCk7CiAgIGlmIChQREZfR2V0U3RhbmRhcmRGb250TmFtZSgmbmFtZSkgPCAwKQogICAgIHJldHVybiBudWxscHRyOwogICByZXR1cm4gR2V0UGFnZURhdGEoKS0+R2V0U3RhbmRhcmRGb250KG5hbWUsIHBFbmNvZGluZyk7CkBAIC03OTEsNyArNzk0LDcgQEAKIAogICBjb25zdCB1aW50MTZfdCogcFVuaWNvZGVzID0gZ19GWF9DaGFyc2V0VW5pY29kZXNbaV0ubV9wVW5pY29kZXM7CiAgIGZvciAoaW50IGogPSAwOyBqIDwgMTI4OyBqKyspIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gUERGX0Fkb2JlTmFtZUZyb21Vbmljb2RlKHBVbmljb2Rlc1tqXSk7CisgICAgQnl0ZVN0cmluZyBuYW1lID0gUERGX0Fkb2JlTmFtZUZyb21Vbmljb2RlKHBVbmljb2Rlc1tqXSk7CiAgICAgcEFycmF5LT5BZGROZXc8Q1BERl9OYW1lPihuYW1lLklzRW1wdHkoKSA/ICIubm90ZGVmIiA6IG5hbWUpOwogICB9CiAgIHBCYXNlRGljdC0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiRW5jb2RpbmciLCB0aGlzLApAQCAtODAzLDIyICs4MDYsMjIgQEAKICAgICBDUERGX0RpY3Rpb25hcnkqIHBCYXNlRGljdCwKICAgICBpbnQgY2hhcnNldCwKICAgICBib29sIGJWZXJ0LAotICAgIENGWF9CeXRlU3RyaW5nIGJhc2Vmb250LAotICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChGWF9XQ0hBUiwgRlhfV0NIQVIsIENQREZfQXJyYXkqKT4gSW5zZXJ0KSB7CisgICAgQnl0ZVN0cmluZyBiYXNlZm9udCwKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQod2NoYXJfdCwgd2NoYXJfdCwgQ1BERl9BcnJheSopPiBJbnNlcnQpIHsKICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QgPSBOZXdJbmRpcmVjdDxDUERGX0RpY3Rpb25hcnk+KCk7Ci0gIENGWF9CeXRlU3RyaW5nIGNtYXA7Ci0gIENGWF9CeXRlU3RyaW5nIG9yZGVyaW5nOworICBCeXRlU3RyaW5nIGNtYXA7CisgIEJ5dGVTdHJpbmcgb3JkZXJpbmc7CiAgIGludCBzdXBwbGVtZW50ID0gMDsKICAgQ1BERl9BcnJheSogcFdpZHRoQXJyYXkgPSBwRm9udERpY3QtPlNldE5ld0ZvcjxDUERGX0FycmF5PigiVyIpOwogICBzd2l0Y2ggKGNoYXJzZXQpIHsKLSAgICBjYXNlIEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUOgorICAgIGNhc2UgRlhfQ0hBUlNFVF9DaGluZXNlVHJhZGl0aW9uYWw6CiAgICAgICBjbWFwID0gYlZlcnQgPyAiRVRlbm1zLUI1LVYiIDogIkVUZW5tcy1CNS1IIjsKICAgICAgIG9yZGVyaW5nID0gIkNOUzEiOwogICAgICAgc3VwcGxlbWVudCA9IDQ7CiAgICAgICBwV2lkdGhBcnJheS0+QWRkTmV3PENQREZfTnVtYmVyPigxKTsKICAgICAgIEluc2VydCgweDIwLCAweDdlLCBwV2lkdGhBcnJheSk7CiAgICAgICBicmVhazsKLSAgICBjYXNlIEZYRk9OVF9HQjIzMTJfQ0hBUlNFVDoKKyAgICBjYXNlIEZYX0NIQVJTRVRfQ2hpbmVzZVNpbXBsaWZpZWQ6CiAgICAgICBjbWFwID0gYlZlcnQgPyAiR0JLLUVVQy1WIiA6ICJHQkstRVVDLUgiOwogICAgICAgb3JkZXJpbmcgPSAiR0IxIjsKICAgICAgIHN1cHBsZW1lbnQgPSAyOwpAQCAtODI3LDE0ICs4MzAsMTQgQEAKICAgICAgIHBXaWR0aEFycmF5LT5BZGROZXc8Q1BERl9OdW1iZXI+KDgxNCk7CiAgICAgICBJbnNlcnQoMHgyMSwgMHg3ZSwgcFdpZHRoQXJyYXkpOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWEZPTlRfSEFOR1VMX0NIQVJTRVQ6CisgICAgY2FzZSBGWF9DSEFSU0VUX0hhbmd1bDoKICAgICAgIGNtYXAgPSBiVmVydCA/ICJLU0Ntcy1VSEMtViIgOiAiS1NDbXMtVUhDLUgiOwogICAgICAgb3JkZXJpbmcgPSAiS29yZWExIjsKICAgICAgIHN1cHBsZW1lbnQgPSAyOwogICAgICAgcFdpZHRoQXJyYXktPkFkZE5ldzxDUERGX051bWJlcj4oMSk7CiAgICAgICBJbnNlcnQoMHgyMCwgMHg3ZSwgcFdpZHRoQXJyYXkpOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVDoKKyAgICBjYXNlIEZYX0NIQVJTRVRfU2hpZnRKSVM6CiAgICAgICBjbWFwID0gYlZlcnQgPyAiOTBtcy1SS1NKLVYiIDogIjkwbXMtUktTSi1IIjsKICAgICAgIG9yZGVyaW5nID0gIkphcGFuMSI7CiAgICAgICBzdXBwbGVtZW50ID0gNTsKQEAgLTg3MCwyMCArODczLDE4IEBACiAgIGlmICghcEZvbnQpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgYm9vbCBiQ0pLID0gY2hhcnNldCA9PSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVCB8fAotICAgICAgICAgICAgICBjaGFyc2V0ID09IEZYRk9OVF9HQjIzMTJfQ0hBUlNFVCB8fAotICAgICAgICAgICAgICBjaGFyc2V0ID09IEZYRk9OVF9IQU5HVUxfQ0hBUlNFVCB8fAotICAgICAgICAgICAgICBjaGFyc2V0ID09IEZYRk9OVF9TSElGVEpJU19DSEFSU0VUOwotICBDRlhfQnl0ZVN0cmluZyBiYXNlZm9udCA9IHBGb250LT5HZXRGYW1pbHlOYW1lKCk7CisgIGJvb2wgYkNKSyA9IGNoYXJzZXQgPT0gRlhfQ0hBUlNFVF9DaGluZXNlVHJhZGl0aW9uYWwgfHwKKyAgICAgICAgICAgICAgY2hhcnNldCA9PSBGWF9DSEFSU0VUX0NoaW5lc2VTaW1wbGlmaWVkIHx8CisgICAgICAgICAgICAgIGNoYXJzZXQgPT0gRlhfQ0hBUlNFVF9IYW5ndWwgfHwgY2hhcnNldCA9PSBGWF9DSEFSU0VUX1NoaWZ0SklTOworICBCeXRlU3RyaW5nIGJhc2Vmb250ID0gcEZvbnQtPkdldEZhbWlseU5hbWUoKTsKICAgYmFzZWZvbnQuUmVwbGFjZSgiICIsICIiKTsKICAgaW50IGZsYWdzID0KICAgICAgIENhbGN1bGF0ZUZsYWdzKHBGb250LT5Jc0JvbGQoKSwgcEZvbnQtPklzSXRhbGljKCksIHBGb250LT5Jc0ZpeGVkV2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgY2hhcnNldCA9PSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQpOworICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBjaGFyc2V0ID09IEZYX0NIQVJTRVRfU3ltYm9sKTsKIAogICBDUERGX0RpY3Rpb25hcnkqIHBCYXNlRGljdCA9IE5ld0luZGlyZWN0PENQREZfRGljdGlvbmFyeT4oKTsKICAgcEJhc2VEaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiVHlwZSIsICJGb250Iik7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfVW5pY29kZUVuY29kaW5nPiBwRW5jb2RpbmcoCi0gICAgICBuZXcgQ0ZYX1VuaWNvZGVFbmNvZGluZyhwRm9udCkpOworICBhdXRvIHBFbmNvZGluZyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfVW5pY29kZUVuY29kaW5nPihwRm9udCk7CiAgIENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0ID0gcEJhc2VEaWN0OwogICBpZiAoIWJDSkspIHsKICAgICBhdXRvIHBXaWR0aHMgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9BcnJheT4oKTsKQEAgLTg5Miw4ICs4OTMsOCBAQAogICAgICAgaW50IGNoYXJfd2lkdGggPSBwRm9udC0+R2V0R2x5cGhXaWR0aChnbHlwaF9pbmRleCk7CiAgICAgICBwV2lkdGhzLT5BZGROZXc8Q1BERl9OdW1iZXI+KGNoYXJfd2lkdGgpOwogICAgIH0KLSAgICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfQU5TSV9DSEFSU0VUIHx8IGNoYXJzZXQgPT0gRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCB8fAotICAgICAgICBjaGFyc2V0ID09IEZYRk9OVF9TWU1CT0xfQ0hBUlNFVCkgeworICAgIGlmIChjaGFyc2V0ID09IEZYX0NIQVJTRVRfQU5TSSB8fCBjaGFyc2V0ID09IEZYX0NIQVJTRVRfRGVmYXVsdCB8fAorICAgICAgICBjaGFyc2V0ID09IEZYX0NIQVJTRVRfU3ltYm9sKSB7CiAgICAgICBwQmFzZURpY3QtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJFbmNvZGluZyIsICJXaW5BbnNpRW5jb2RpbmciKTsKICAgICAgIGZvciAoaW50IGNoYXJjb2RlID0gMTI4OyBjaGFyY29kZSA8PSAyNTU7IGNoYXJjb2RlKyspIHsKICAgICAgICAgaW50IGdseXBoX2luZGV4ID0gcEVuY29kaW5nLT5HbHlwaEZyb21DaGFyQ29kZShjaGFyY29kZSk7CkBAIC05MTQsMTIgKzkxNSwxMSBAQAogICAgIFByb2Nlc3NOb25iQ0pLKHBCYXNlRGljdCwgcEZvbnQtPklzQm9sZCgpLCBwRm9udC0+SXNJdGFsaWMoKSwgYmFzZWZvbnQsCiAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHBXaWR0aHMpKTsKICAgfSBlbHNlIHsKLSAgICBwRm9udERpY3QgPSBQcm9jZXNzYkNKSyhwQmFzZURpY3QsIGNoYXJzZXQsIGJWZXJ0LCBiYXNlZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcEZvbnQsICZwRW5jb2RpbmddKEZYX1dDSEFSIHN0YXJ0LCBGWF9XQ0hBUiBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiB3aWR0aEFycikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0V2lkdGhBcnJheTEocEZvbnQsIHBFbmNvZGluZy5nZXQoKSwgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQsIHdpZHRoQXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICBwRm9udERpY3QgPSBQcm9jZXNzYkNKSygKKyAgICAgICAgcEJhc2VEaWN0LCBjaGFyc2V0LCBiVmVydCwgYmFzZWZvbnQsCisgICAgICAgIFtwRm9udCwgJnBFbmNvZGluZ10od2NoYXJfdCBzdGFydCwgd2NoYXJfdCBlbmQsIENQREZfQXJyYXkqIHdpZHRoQXJyKSB7CisgICAgICAgICAgSW5zZXJ0V2lkdGhBcnJheTEocEZvbnQsIHBFbmNvZGluZy5nZXQoKSwgc3RhcnQsIGVuZCwgd2lkdGhBcnIpOworICAgICAgICB9KTsKICAgfQogICBpbnQgaXRhbGljYW5nbGUgPQogICAgICAgcEZvbnQtPkdldFN1YnN0Rm9udCgpID8gcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX0l0YWxpY0FuZ2xlIDogMDsKQEAgLTkzNCw3ICs5MzQsNyBAQAogICBpZiAocEZvbnQtPkdldFN1YnN0Rm9udCgpKSB7CiAgICAgblN0ZW1WID0gcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1dlaWdodCAvIDU7CiAgIH0gZWxzZSB7Ci0gICAgc3RhdGljIGNvbnN0IEZYX0NIQVIgc3RlbV9jaGFyc1tdID0geydpJywgJ0knLCAnIScsICcxJ307CisgICAgc3RhdGljIGNvbnN0IGNoYXIgc3RlbV9jaGFyc1tdID0geydpJywgJ0knLCAnIScsICcxJ307CiAgICAgY29uc3Qgc2l6ZV90IGNvdW50ID0gRlhfQXJyYXlTaXplKHN0ZW1fY2hhcnMpOwogICAgIHVpbnQzMl90IGdseXBoID0gcEVuY29kaW5nLT5HbHlwaEZyb21DaGFyQ29kZShzdGVtX2NoYXJzWzBdKTsKICAgICBuU3RlbVYgPSBwRm9udC0+R2V0R2x5cGhXaWR0aChnbHlwaCk7CkBAIC05NTMsMTcgKzk1MywxOCBAQAogICByZXR1cm4gTG9hZEZvbnQocEJhc2VEaWN0KTsKIH0KIAotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXwogQ1BERl9Gb250KiBDUERGX0RvY3VtZW50OjpBZGRXaW5kb3dzRm9udChMT0dGT05UVyogcExvZ0ZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlZlcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRyYW5zbGF0ZU5hbWUpIHsKICAgTE9HRk9OVEEgbGZhOwotICBGWFNZU19tZW1jcHkoJmxmYSwgcExvZ0ZvbnQsIChjaGFyKilsZmEubGZGYWNlTmFtZSAtIChjaGFyKikmbGZhKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgZmFjZSA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwTG9nRm9udC0+bGZGYWNlTmFtZSk7CisgIG1lbWNweSgmbGZhLCBwTG9nRm9udCwgKGNoYXIqKWxmYS5sZkZhY2VOYW1lIC0gKGNoYXIqKSZsZmEpOworICBCeXRlU3RyaW5nIGZhY2UgPSBCeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwTG9nRm9udC0+bGZGYWNlTmFtZSk7CiAgIGlmIChmYWNlLkdldExlbmd0aCgpID49IExGX0ZBQ0VTSVpFKQogICAgIHJldHVybiBudWxscHRyOwogCi0gIEZYU1lTX3N0cmNweShsZmEubGZGYWNlTmFtZSwgZmFjZS5jX3N0cigpKTsKKyAgc3RybmNweShsZmEubGZGYWNlTmFtZSwgZmFjZS5jX3N0cigpLAorICAgICAgICAgIChmYWNlLkdldExlbmd0aCgpICsgMSkgKiBzaXplb2YoQnl0ZVN0cmluZzo6Q2hhclR5cGUpKTsKICAgcmV0dXJuIEFkZFdpbmRvd3NGb250KCZsZmEsIGJWZXJ0LCBiVHJhbnNsYXRlTmFtZSk7CiB9CiAKQEAgLTk5MCwxMyArOTkxLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTG9nRm9udC0+bGZQaXRjaEFuZEZhbWlseSAmIDMpID09IEZJWEVEX1BJVENILAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocExvZ0ZvbnQtPmxmUGl0Y2hBbmRGYW1pbHkgJiAweGY4KSA9PSBGRl9ST01BTiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBMb2dGb250LT5sZlBpdGNoQW5kRmFtaWx5ICYgMHhmOCkgPT0gRkZfU0NSSVBULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTG9nRm9udC0+bGZDaGFyU2V0ID09IEZYRk9OVF9TWU1CT0xfQ0hBUlNFVCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMb2dGb250LT5sZkNoYXJTZXQgPT0gRlhfQ0hBUlNFVF9TeW1ib2wpOwogCi0gIGJvb2wgYkNKSyA9IHBMb2dGb250LT5sZkNoYXJTZXQgPT0gRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQgfHwKLSAgICAgICAgICAgICAgcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQgfHwKLSAgICAgICAgICAgICAgcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBGWEZPTlRfSEFOR1VMX0NIQVJTRVQgfHwKLSAgICAgICAgICAgICAgcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVDsKLSAgQ0ZYX0J5dGVTdHJpbmcgYmFzZWZvbnQ7CisgIGJvb2wgYkNKSyA9IHBMb2dGb250LT5sZkNoYXJTZXQgPT0gRlhfQ0hBUlNFVF9DaGluZXNlVHJhZGl0aW9uYWwgfHwKKyAgICAgICAgICAgICAgcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBGWF9DSEFSU0VUX0NoaW5lc2VTaW1wbGlmaWVkIHx8CisgICAgICAgICAgICAgIHBMb2dGb250LT5sZkNoYXJTZXQgPT0gRlhfQ0hBUlNFVF9IYW5ndWwgfHwKKyAgICAgICAgICAgICAgcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBGWF9DSEFSU0VUX1NoaWZ0SklTOworICBCeXRlU3RyaW5nIGJhc2Vmb250OwogICBpZiAoYlRyYW5zbGF0ZU5hbWUgJiYgYkNKSykKICAgICBiYXNlZm9udCA9IEZQREZfR2V0UFNOYW1lRnJvbVRUKGhEQyk7CiAKQEAgLTEwMTUsOSArMTAxNiw5IEBACiAgIHBCYXNlRGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIlR5cGUiLCAiRm9udCIpOwogICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCA9IHBCYXNlRGljdDsKICAgaWYgKCFiQ0pLKSB7Ci0gICAgaWYgKHBMb2dGb250LT5sZkNoYXJTZXQgPT0gRlhGT05UX0FOU0lfQ0hBUlNFVCB8fAotICAgICAgICBwTG9nRm9udC0+bGZDaGFyU2V0ID09IEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQgfHwKLSAgICAgICAgcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQpIHsKKyAgICBpZiAocExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBGWF9DSEFSU0VUX0FOU0kgfHwKKyAgICAgICAgcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBGWF9DSEFSU0VUX0RlZmF1bHQgfHwKKyAgICAgICAgcExvZ0ZvbnQtPmxmQ2hhclNldCA9PSBGWF9DSEFSU0VUX1N5bWJvbCkgewogICAgICAgcEJhc2VEaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiRW5jb2RpbmciLCAiV2luQW5zaUVuY29kaW5nIik7CiAgICAgfSBlbHNlIHsKICAgICAgIENhbGN1bGF0ZUVuY29kaW5nRGljdChwTG9nRm9udC0+bGZDaGFyU2V0LCBwQmFzZURpY3QpOwpAQCAtMTAzMiw3ICsxMDMzLDcgQEAKICAgfSBlbHNlIHsKICAgICBwRm9udERpY3QgPQogICAgICAgICBQcm9jZXNzYkNKSyhwQmFzZURpY3QsIHBMb2dGb250LT5sZkNoYXJTZXQsIGJWZXJ0LCBiYXNlZm9udCwKLSAgICAgICAgICAgICAgICAgICAgWyZoRENdKEZYX1dDSEFSIHN0YXJ0LCBGWF9XQ0hBUiBlbmQsIENQREZfQXJyYXkqIHdpZHRoQXJyKSB7CisgICAgICAgICAgICAgICAgICAgIFsmaERDXSh3Y2hhcl90IHN0YXJ0LCB3Y2hhcl90IGVuZCwgQ1BERl9BcnJheSogd2lkdGhBcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRXaWR0aEFycmF5KGhEQywgc3RhcnQsIGVuZCwgd2lkdGhBcnIpOwogICAgICAgICAgICAgICAgICAgICB9KTsKICAgfQpAQCAtMTA1MSw0ICsxMDUyLDQgQEAKICAgRGVsZXRlREMoaERDKTsKICAgcmV0dXJuIExvYWRGb250KHBCYXNlRGljdCk7CiB9Ci0jZW5kaWYgIC8vICBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisjZW5kaWYgIC8vICBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RvY3VtZW50LmggYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaAppbmRleCAzODQ4YWQ2Li5kNzNkYmMxIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaApAQCAtMTMsMTAgKzEzLDEwIEBACiAjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2ltYWdlLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2luZGlyZWN0X29iamVjdF9ob2xkZXIuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfb2JqZWN0LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfbGlua2xpc3QuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCiAKIGNsYXNzIENGWF9Gb250OwogY2xhc3MgQ0ZYX01hdHJpeDsKQEAgLTI2LDIxICsyNiwxNyBAQAogY2xhc3MgQ1BERl9Gb250OwogY2xhc3MgQ1BERl9Gb250RW5jb2Rpbmc7CiBjbGFzcyBDUERGX0ljY1Byb2ZpbGU7Ci1jbGFzcyBDUERGX0ltYWdlOwogY2xhc3MgQ1BERl9MaW5lYXJpemVkSGVhZGVyOwogY2xhc3MgQ1BERl9QYXJzZXI7CiBjbGFzcyBDUERGX1BhdHRlcm47CiBjbGFzcyBDUERGX1N0cmVhbUFjYzsKIGNsYXNzIEpCaWcyX0RvY3VtZW50Q29udGV4dDsKIAotI2RlZmluZSBGUERGUEVSTV9QUklOVCAweDAwMDQKICNkZWZpbmUgRlBERlBFUk1fTU9ESUZZIDB4MDAwOAotI2RlZmluZSBGUERGUEVSTV9FWFRSQUNUIDB4MDAxMAogI2RlZmluZSBGUERGUEVSTV9BTk5PVF9GT1JNIDB4MDAyMAogI2RlZmluZSBGUERGUEVSTV9GSUxMX0ZPUk0gMHgwMTAwCiAjZGVmaW5lIEZQREZQRVJNX0VYVFJBQ1RfQUNDRVNTIDB4MDIwMAotI2RlZmluZSBGUERGUEVSTV9BU1NFTUJMRSAweDA0MDAKLSNkZWZpbmUgRlBERlBFUk1fUFJJTlRfSElHSCAweDA4MDAKKwogI2RlZmluZSBGUERGX1BBR0VfTUFYX05VTSAweEZGRkZGCiAKIGNsYXNzIENQREZfRG9jdW1lbnQgOiBwdWJsaWMgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciB7CkBAIC00OSw4ICs0NSwxMCBAQAogICB+Q1BERl9Eb2N1bWVudCgpIG92ZXJyaWRlOwogCiAgIENQREZfUGFyc2VyKiBHZXRQYXJzZXIoKSBjb25zdCB7IHJldHVybiBtX3BQYXJzZXIuZ2V0KCk7IH0KLSAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRSb290KCkgY29uc3QgeyByZXR1cm4gbV9wUm9vdERpY3Q7IH0KLSAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRJbmZvKCkgY29uc3QgeyByZXR1cm4gbV9wSW5mb0RpY3Q7IH0KKyAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBHZXRSb290KCkgY29uc3QgeyByZXR1cm4gbV9wUm9vdERpY3Q7IH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRSb290KCkgeyByZXR1cm4gbV9wUm9vdERpY3Q7IH0KKyAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBHZXRJbmZvKCkgY29uc3QgeyByZXR1cm4gbV9wSW5mb0RpY3QuR2V0KCk7IH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRJbmZvKCkgeyByZXR1cm4gbV9wSW5mb0RpY3QuR2V0KCk7IH0KIAogICB2b2lkIERlbGV0ZVBhZ2UoaW50IGlQYWdlKTsKICAgaW50IEdldFBhZ2VDb3VudCgpIGNvbnN0OwpAQCAtNTgsNyArNTYsOSBAQAogICBDUERGX0RpY3Rpb25hcnkqIEdldFBhZ2UoaW50IGlQYWdlKTsKICAgaW50IEdldFBhZ2VJbmRleCh1aW50MzJfdCBvYmpudW0pOwogICB1aW50MzJfdCBHZXRVc2VyUGVybWlzc2lvbnMoKSBjb25zdDsKLSAgQ1BERl9Eb2NQYWdlRGF0YSogR2V0UGFnZURhdGEoKSBjb25zdCB7IHJldHVybiBtX3BEb2NQYWdlOyB9CisKKyAgLy8gUmV0dXJucyBhIHZhbGlkIHBvaW50ZXIsIHVubGVzcyBpdCBpcyBjYWxsZWQgZHVyaW5nIGRlc3RydWN0aW9uLgorICBDUERGX0RvY1BhZ2VEYXRhKiBHZXRQYWdlRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fcERvY1BhZ2UuZ2V0KCk7IH0KIAogICB2b2lkIFNldFBhZ2VPYmpOdW0oaW50IGlQYWdlLCB1aW50MzJfdCBvYmpOdW0pOwogCkBAIC03OCwyMCArNzgsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGFkaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCk7CiAKLSAgQ1BERl9JbWFnZSogTG9hZEltYWdlRnJvbVBhZ2VEYXRhKHVpbnQzMl90IGR3U3RyZWFtT2JqTnVtKTsKLSAgQ1BERl9TdHJlYW1BY2MqIExvYWRGb250RmlsZShDUERGX1N0cmVhbSogcFN0cmVhbSk7Ci0gIENQREZfSWNjUHJvZmlsZSogTG9hZEljY1Byb2ZpbGUoQ1BERl9TdHJlYW0qIHBTdHJlYW0pOworICBSZXRhaW5QdHI8Q1BERl9JbWFnZT4gTG9hZEltYWdlRnJvbVBhZ2VEYXRhKHVpbnQzMl90IGR3U3RyZWFtT2JqTnVtKTsKKyAgUmV0YWluUHRyPENQREZfU3RyZWFtQWNjPiBMb2FkRm9udEZpbGUoQ1BERl9TdHJlYW0qIHBTdHJlYW0pOworICBSZXRhaW5QdHI8Q1BERl9JY2NQcm9maWxlPiBMb2FkSWNjUHJvZmlsZShDUERGX1N0cmVhbSogcFN0cmVhbSk7CiAKICAgdm9pZCBMb2FkRG9jKCk7CiAgIHZvaWQgTG9hZExpbmVhcml6ZWREb2MoY29uc3QgQ1BERl9MaW5lYXJpemVkSGVhZGVyKiBwTGluZWFyaXphdGlvblBhcmFtcyk7CiAgIHZvaWQgTG9hZFBhZ2VzKCk7CisgIHZvaWQgTG9hZERvY3VtZW50SW5mbygpOwogCiAgIHZvaWQgQ3JlYXRlTmV3RG9jKCk7CiAgIENQREZfRGljdGlvbmFyeSogQ3JlYXRlTmV3UGFnZShpbnQgaVBhZ2UpOwogCi0gIENQREZfRm9udCogQWRkU3RhbmRhcmRGb250KGNvbnN0IEZYX0NIQVIqIGZvbnQsIENQREZfRm9udEVuY29kaW5nKiBwRW5jb2RpbmcpOworICBDUERGX0ZvbnQqIEFkZFN0YW5kYXJkRm9udChjb25zdCBjaGFyKiBmb250LCBDUERGX0ZvbnRFbmNvZGluZyogcEVuY29kaW5nKTsKICAgQ1BERl9Gb250KiBBZGRGb250KENGWF9Gb250KiBwRm9udCwgaW50IGNoYXJzZXQsIGJvb2wgYlZlcnQpOwotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXwogICBDUERGX0ZvbnQqIEFkZFdpbmRvd3NGb250KExPR0ZPTlRBKiBwTG9nRm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJWZXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRyYW5zbGF0ZU5hbWUgPSBmYWxzZSk7CkBAIC0xMDksNyArMTEwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHNraXBfY291bnQsCiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9iam51bSwKICAgICAgICAgICAgICAgICAgICAgaW50KiBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsID0gMCk7CisgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCA9IDApIGNvbnN0OwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IFBhcnNlSW5kaXJlY3RPYmplY3QodWludDMyX3Qgb2JqbnVtKSBvdmVycmlkZTsKICAgdm9pZCBMb2FkRG9jSW50ZXJuYWwoKTsKICAgc2l6ZV90IENhbGN1bGF0ZUVuY29kaW5nRGljdChpbnQgY2hhcnNldCwgQ1BERl9EaWN0aW9uYXJ5KiBwQmFzZURpY3QpOwpAQCAtMTE4LDggKzExOSw4IEBACiAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBCYXNlRGljdCwKICAgICAgIGludCBjaGFyc2V0LAogICAgICAgYm9vbCBiVmVydCwKLSAgICAgIENGWF9CeXRlU3RyaW5nIGJhc2Vmb250LAotICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEZYX1dDSEFSLCBGWF9XQ0hBUiwgQ1BERl9BcnJheSopPiBJbnNlcnQpOworICAgICAgQnl0ZVN0cmluZyBiYXNlZm9udCwKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCh3Y2hhcl90LCB3Y2hhcl90LCBDUERGX0FycmF5Kik+IEluc2VydCk7CiAgIGJvb2wgSW5zZXJ0RGVsZXRlUERGUGFnZShDUERGX0RpY3Rpb25hcnkqIHBQYWdlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUGFnZXNUb0dvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QsCkBAIC0xMjksMjEgKzEzMCwyNSBAQAogICB2b2lkIFJlc2V0VHJhdmVyc2FsKCk7CiAKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfUGFyc2VyPiBtX3BQYXJzZXI7Ci0gIENQREZfRGljdGlvbmFyeSogbV9wUm9vdERpY3Q7Ci0gIENQREZfRGljdGlvbmFyeSogbV9wSW5mb0RpY3Q7CisKKyAgLy8gVE9ETyh0c2VwZXopOiBmaWd1cmUgb3V0IHdoeSB0ZXN0cyBicmVhayBpZiB0aGlzIGlzIGFuIFVub3duZWRQdHIuCisgIENQREZfRGljdGlvbmFyeSogbV9wUm9vdERpY3Q7ICAvLyBOb3Qgb3duZWQuCisKKyAgVW5vd25lZFB0cjxDUERGX0RpY3Rpb25hcnk+IG1fcEluZm9EaWN0OworCiAgIC8vIFZlY3RvciBvZiBwYWlycyB0byBrbm93IGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHBhZ2UgdHJlZS4gVGhlIGluZGV4IGluIHRoZQogICAvLyB2ZWN0b3IgY29ycmVzcG9uZHMgdG8gdGhlIGxldmVsIGJlaW5nIGRlc2NyaWJlZC4gVGhlIHBhaXIgY29udGFpbnMgYQogICAvLyBwb2ludGVyIHRvIHRoZSBkaWN0aW9uYXJ5IGJlaW5nIHByb2Nlc3NlZCBhdCB0aGUgbGV2ZWwsIGFuZCBhbiBpbmRleCBvZiB0aGUKICAgLy8gb2YgdGhlIGNoaWxkIGJlaW5nIHByb2Nlc3NlZCB3aXRoaW4gdGhlIGRpY3Rpb25hcnkncyAvS2lkcyBhcnJheS4KICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPENQREZfRGljdGlvbmFyeSosIHNpemVfdD4+IG1fcFRyZWVUcmF2ZXJzYWw7CisKICAgLy8gSW5kZXggb2YgdGhlIG5leHQgcGFnZSB0aGF0IHdpbGwgYmUgdHJhdmVyc2VkIGZyb20gdGhlIHBhZ2UgdHJlZS4KICAgaW50IG1faU5leHRQYWdlVG9UcmF2ZXJzZTsKICAgYm9vbCBtX2JSZWFjaGVkTWF4UGFnZUxldmVsOwogICBib29sIG1fYkxpbmVhcml6ZWQ7CiAgIGludCBtX2lGaXJzdFBhZ2VObzsKICAgdWludDMyX3QgbV9kd0ZpcnN0UGFnZU9iak51bTsKLSAgLy8gVE9ETyh0aGVzdGlnKTogRmlndXJlIG91dCB3aHkgdGhpcyBjYW5ub3QgYmUgYSBzdGQ6OnVuaXF1ZV9wdHIuCi0gIENQREZfRG9jUGFnZURhdGEqIG1fcERvY1BhZ2U7CisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0RvY1BhZ2VEYXRhPiBtX3BEb2NQYWdlOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Eb2NSZW5kZXJEYXRhPiBtX3BEb2NSZW5kZXI7CiAgIHN0ZDo6dW5pcXVlX3B0cjxKQmlnMl9Eb2N1bWVudENvbnRleHQ+IG1fcENvZGVjQ29udGV4dDsKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfTGlua0xpc3Q+IG1fcExpbmtzQ29udGV4dDsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudF91bml0dGVzdC5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnRfdW5pdHRlc3QuY3BwCmluZGV4IDQ4MTVmZmIuLmQxYjhkY2UgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudF91bml0dGVzdC5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RvY3VtZW50X3VuaXR0ZXN0LmNwcApAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9ib29sZWFuLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbGluZWFyaXplZF9oZWFkZXIuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbmFtZS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9udW1iZXIuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3JlZmVyZW5jZS5oIgpAQCAtMjIsNiArMjMsOCBAQAogCiBuYW1lc3BhY2UgewogCitjb25zdCBpbnQga051bVRlc3RQYWdlcyA9IDc7CisKIENQREZfRGljdGlvbmFyeSogQ3JlYXRlUGFnZVRyZWVOb2RlKHN0ZDo6dW5pcXVlX3B0cjxDUERGX0FycmF5PiBraWRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCkgewpAQCAtODIsMTMgKzg1LDE4IEBACiAgICAgYWxsUGFnZXMtPkFkZE5ldzxDUERGX1JlZmVyZW5jZT4odGhpcywgYnJhbmNoMy0+R2V0T2JqTnVtKCkpOwogICAgIGFsbFBhZ2VzLT5BZGROZXc8Q1BERl9SZWZlcmVuY2U+KHRoaXMsIGJyYW5jaDQtPkdldE9iak51bSgpKTsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBhZ2VzRGljdCA9Ci0gICAgICAgIENyZWF0ZVBhZ2VUcmVlTm9kZShzdGQ6Om1vdmUoYWxsUGFnZXMpLCB0aGlzLCA3KTsKKyAgICAgICAgQ3JlYXRlUGFnZVRyZWVOb2RlKHN0ZDo6bW92ZShhbGxQYWdlcyksIHRoaXMsIGtOdW1UZXN0UGFnZXMpOwogCiAgICAgbV9wT3duZWRSb290RGljdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCk7CiAgICAgbV9wT3duZWRSb290RGljdC0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiUGFnZXMiLCB0aGlzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZXNEaWN0LT5HZXRPYmpOdW0oKSk7CiAgICAgbV9wUm9vdERpY3QgPSBtX3BPd25lZFJvb3REaWN0LmdldCgpOwotICAgIG1fUGFnZUxpc3QucmVzaXplKDcpOworICAgIG1fUGFnZUxpc3QucmVzaXplKGtOdW1UZXN0UGFnZXMpOworICB9CisKKyAgdm9pZCBTZXRUcmVlU2l6ZShpbnQgc2l6ZSkgeworICAgIG1fcE93bmVkUm9vdERpY3QtPlNldE5ld0ZvcjxDUERGX051bWJlcj4oIkNvdW50Iiwgc2l6ZSk7CisgICAgbV9QYWdlTGlzdC5yZXNpemUoc2l6ZSk7CiAgIH0KIAogIHByaXZhdGU6CkBAIC0xMDUsNyArMTEzLDcgQEAKICAgICBhbGxQYWdlcy0+QWRkTmV3PENQREZfUmVmZXJlbmNlPigKICAgICAgICAgdGhpcywgQWRkSW5kaXJlY3RPYmplY3QoQ3JlYXRlTnVtYmVyZWRQYWdlKDEpKS0+R2V0T2JqTnVtKCkpOwogICAgIC8vIFBhZ2Ugd2l0aG91dCBwYWdlTnVtLgotICAgIGFsbFBhZ2VzLT5BZGQoQ3JlYXRlTnVtYmVyZWRQYWdlKDIpKTsKKyAgICBpbmxpbmVkX3BhZ2VfID0gYWxsUGFnZXMtPkFkZChDcmVhdGVOdW1iZXJlZFBhZ2UoMikpOwogICAgIENQREZfRGljdGlvbmFyeSogcGFnZXNEaWN0ID0KICAgICAgICAgQ3JlYXRlUGFnZVRyZWVOb2RlKHN0ZDo6bW92ZShhbGxQYWdlcyksIHRoaXMsIDMpOwogICAgIG1fcE93bmVkUm9vdERpY3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigpOwpAQCAtMTE1LDQ2ICsxMjMsNjIgQEAKICAgICBtX1BhZ2VMaXN0LnJlc2l6ZSgzKTsKICAgfQogCisgIGNvbnN0IENQREZfT2JqZWN0KiBpbmxpbmVkX3BhZ2UoKSBjb25zdCB7IHJldHVybiBpbmxpbmVkX3BhZ2VfOyB9CisKICBwcml2YXRlOgogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5PiBtX3BPd25lZFJvb3REaWN0OworICBjb25zdCBDUERGX09iamVjdCogaW5saW5lZF9wYWdlXzsKIH07CiAKIGNsYXNzIFRlc3RMaW5lYXJpemVkIDogcHVibGljIENQREZfTGluZWFyaXplZEhlYWRlciB7CiAgcHVibGljOgogICBleHBsaWNpdCBUZXN0TGluZWFyaXplZChDUERGX0RpY3Rpb25hcnkqIGRpY3QpCi0gICAgICA6IENQREZfTGluZWFyaXplZEhlYWRlcihkaWN0KSB7fQorICAgICAgOiBDUERGX0xpbmVhcml6ZWRIZWFkZXIoZGljdCwgMCkge30KK307CisKK2NsYXNzIENQREZfVGVzdERvY1BhZ2VzV2l0aG91dEtpZHMgOiBwdWJsaWMgQ1BERl9Eb2N1bWVudCB7CisgcHVibGljOgorICBDUERGX1Rlc3REb2NQYWdlc1dpdGhvdXRLaWRzKCkgOiBDUERGX0RvY3VtZW50KG51bGxwdHIpIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBhZ2VzRGljdCA9IE5ld0luZGlyZWN0PENQREZfRGljdGlvbmFyeT4oKTsKKyAgICBwYWdlc0RpY3QtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJUeXBlIiwgIlBhZ2VzIik7CisgICAgcGFnZXNEaWN0LT5TZXROZXdGb3I8Q1BERl9OdW1iZXI+KCJDb3VudCIsIDMpOworICAgIG1fUGFnZUxpc3QucmVzaXplKDEwKTsKKyAgICBtX3BPd25lZFJvb3REaWN0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4oKTsKKyAgICBtX3BPd25lZFJvb3REaWN0LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJQYWdlcyIsIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlc0RpY3QtPkdldE9iak51bSgpKTsKKyAgICBtX3BSb290RGljdCA9IG1fcE93bmVkUm9vdERpY3QuZ2V0KCk7CisgIH0KKworIHByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0RpY3Rpb25hcnk+IG1fcE93bmVkUm9vdERpY3Q7CiB9OwogfSAgLy8gbmFtZXNwYWNlCiAKIGNsYXNzIGNwZGZfZG9jdW1lbnRfdGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKICBwdWJsaWM6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgQ1BERl9Nb2R1bGVNZ3IqIG1vZHVsZV9tZ3IgPSBDUERGX01vZHVsZU1ncjo6R2V0KCk7Ci0gICAgbW9kdWxlX21nci0+SW5pdFBhZ2VNb2R1bGUoKTsKLSAgfQorICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBDUERGX01vZHVsZU1ncjo6R2V0KCktPkluaXQoKTsgfQogICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeyBDUERGX01vZHVsZU1ncjo6RGVzdHJveSgpOyB9CiB9OwogCiBURVNUX0YoY3BkZl9kb2N1bWVudF90ZXN0LCBHZXRQYWdlcykgewogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9UZXN0RG9jdW1lbnRGb3JQYWdlcz4gZG9jdW1lbnQgPQogICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfVGVzdERvY3VtZW50Rm9yUGFnZXM+KCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgNzsgaSsrKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVRlc3RQYWdlczsgaSsrKSB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwYWdlID0gZG9jdW1lbnQtPkdldFBhZ2UoaSk7CiAgICAgQVNTRVJUX1RSVUUocGFnZSk7CiAgICAgQVNTRVJUX1RSVUUocGFnZS0+S2V5RXhpc3QoIlBhZ2VOdW1iZXJpbmciKSk7CiAgICAgRVhQRUNUX0VRKGksIHBhZ2UtPkdldEludGVnZXJGb3IoIlBhZ2VOdW1iZXJpbmciKSk7CiAgIH0KLSAgQ1BERl9EaWN0aW9uYXJ5KiBwYWdlID0gZG9jdW1lbnQtPkdldFBhZ2UoNyk7CisgIENQREZfRGljdGlvbmFyeSogcGFnZSA9IGRvY3VtZW50LT5HZXRQYWdlKGtOdW1UZXN0UGFnZXMpOwogICBFWFBFQ1RfRkFMU0UocGFnZSk7CiB9CiAKIFRFU1RfRihjcGRmX2RvY3VtZW50X3Rlc3QsIEdldFBhZ2VXaXRob3V0T2JqTnVtVHdpY2UpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPENQREZfVGVzdERvY3VtZW50V2l0aFBhZ2VXaXRob3V0UGFnZU51bT4gZG9jdW1lbnQgPQotICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfVGVzdERvY3VtZW50V2l0aFBhZ2VXaXRob3V0UGFnZU51bT4oKTsKKyAgYXV0byBkb2N1bWVudCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1Rlc3REb2N1bWVudFdpdGhQYWdlV2l0aG91dFBhZ2VOdW0+KCk7CiAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcGFnZSA9IGRvY3VtZW50LT5HZXRQYWdlKDIpOwogICBBU1NFUlRfVFJVRShwYWdlKTsKLSAgLy8gVGhpcyBpcyBwYWdlIHdpdGhvdXQgb2JqIG51bS4KLSAgQVNTRVJUX0VRKDB1bCwgcGFnZS0+R2V0T2JqTnVtKCkpOworICBBU1NFUlRfRVEoZG9jdW1lbnQtPmlubGluZWRfcGFnZSgpLCBwYWdlKTsKKwogICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHNlY29uZF9jYWxsX3BhZ2UgPSBkb2N1bWVudC0+R2V0UGFnZSgyKTsKICAgRVhQRUNUX1RSVUUoc2Vjb25kX2NhbGxfcGFnZSk7CiAgIEVYUEVDVF9FUShwYWdlLCBzZWNvbmRfY2FsbF9wYWdlKTsKQEAgLTE2OSw3ICsxOTMsNyBAQAogICAgIEFTU0VSVF9UUlVFKHBhZ2UtPktleUV4aXN0KCJQYWdlTnVtYmVyaW5nIikpOwogICAgIEVYUEVDVF9FUShpLCBwYWdlLT5HZXRJbnRlZ2VyRm9yKCJQYWdlTnVtYmVyaW5nIikpOwogICB9Ci0gIENQREZfRGljdGlvbmFyeSogcGFnZSA9IGRvY3VtZW50LT5HZXRQYWdlKDcpOworICBDUERGX0RpY3Rpb25hcnkqIHBhZ2UgPSBkb2N1bWVudC0+R2V0UGFnZShrTnVtVGVzdFBhZ2VzKTsKICAgRVhQRUNUX0ZBTFNFKHBhZ2UpOwogfQogCkBAIC0xODcsNyArMjExLDcgQEAKICAgQVNTRVJUX1RSVUUocGFnZS0+S2V5RXhpc3QoIlBhZ2VOdW1iZXJpbmciKSk7CiAgIEVYUEVDVF9FUSgzLCBwYWdlLT5HZXRJbnRlZ2VyRm9yKCJQYWdlTnVtYmVyaW5nIikpOwogCi0gIHBhZ2UgPSBkb2N1bWVudC0+R2V0UGFnZSg3KTsKKyAgcGFnZSA9IGRvY3VtZW50LT5HZXRQYWdlKGtOdW1UZXN0UGFnZXMpOwogICBFWFBFQ1RfRkFMU0UocGFnZSk7CiAKICAgcGFnZSA9IGRvY3VtZW50LT5HZXRQYWdlKDYpOwpAQCAtMjE5LDMgKzI0MywyNSBAQAogICBFWFBFQ1RfVFJVRShkb2N1bWVudC5Jc1BhZ2VMb2FkZWQodGVzdF9wYWdlX251bSkpOwogICBFWFBFQ1RfRVEocGFnZV9zdHViLCBkb2N1bWVudC5HZXRQYWdlKHRlc3RfcGFnZV9udW0pKTsKIH0KKworVEVTVF9GKGNwZGZfZG9jdW1lbnRfdGVzdCwgQ291bnRHcmVhdGVyVGhhblBhZ2VUcmVlKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1Rlc3REb2N1bWVudEZvclBhZ2VzPiBkb2N1bWVudCA9CisgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9UZXN0RG9jdW1lbnRGb3JQYWdlcz4oKTsKKyAgZG9jdW1lbnQtPlNldFRyZWVTaXplKGtOdW1UZXN0UGFnZXMgKyAzKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtVGVzdFBhZ2VzOyBpKyspCisgICAgRVhQRUNUX1RSVUUoZG9jdW1lbnQtPkdldFBhZ2UoaSkpOworICBmb3IgKGludCBpID0ga051bVRlc3RQYWdlczsgaSA8IGtOdW1UZXN0UGFnZXMgKyA0OyBpKyspCisgICAgRVhQRUNUX0ZBTFNFKGRvY3VtZW50LT5HZXRQYWdlKGkpKTsKKyAgRVhQRUNUX1RSVUUoZG9jdW1lbnQtPkdldFBhZ2Uoa051bVRlc3RQYWdlcyAtIDEpKTsKK30KKworVEVTVF9GKGNwZGZfZG9jdW1lbnRfdGVzdCwgUGFnZXNXaXRob3V0S2lkcykgeworICAvLyBTZXQgdXAgYSBkb2N1bWVudCB3aXRoIFBhZ2VzIGRpY3Qgd2l0aG91dCBraWRzLCBhbmQgQ291bnQgPSAzCisgIGF1dG8gcERvYyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1Rlc3REb2NQYWdlc1dpdGhvdXRLaWRzPigpOworICBFWFBFQ1RfVFJVRShwRG9jLT5HZXRQYWdlKDApKTsKKyAgLy8gVGVzdCBHZXRQYWdlIGRvZXMgbm90IGZldGNoIHBhZ2VzIG91dCBvZiByYW5nZQorICBmb3IgKGludCBpID0gMTsgaSA8IDU7IGkrKykKKyAgICBFWFBFQ1RfRkFMU0UocERvYy0+R2V0UGFnZShpKSk7CisKKyAgRVhQRUNUX1RSVUUocERvYy0+R2V0UGFnZSgwKSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfaGludF90YWJsZXMuY3BwIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2hpbnRfdGFibGVzLmNwcAppbmRleCBlMDAwMTg4Li5jOTEyM2Q0IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfaGludF90YWJsZXMuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9oaW50X3RhYmxlcy5jcHAKQEAgLTEzLDggKzEzLDEwIEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbGluZWFyaXplZF9oZWFkZXIuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVhZF92YWxpZGF0b3IuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbV9hY2MuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9iaXRzdHJlYW0uaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfY29udmVyc2lvbnMuaCIKIApAQCAtMzQsOSArMzYsOSBAQAogCiB9ICAvLyBuYW1lc3BhY2UKIAotQ1BERl9IaW50VGFibGVzOjpDUERGX0hpbnRUYWJsZXMoQ1BERl9EYXRhQXZhaWwqIHBEYXRhQXZhaWwsCitDUERGX0hpbnRUYWJsZXM6OkNQREZfSGludFRhYmxlcyhDUERGX1JlYWRWYWxpZGF0b3IqIHBWYWxpZGF0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0xpbmVhcml6ZWRIZWFkZXIqIHBMaW5lYXJpemVkKQotICAgIDogbV9wRGF0YUF2YWlsKHBEYXRhQXZhaWwpLAorICAgIDogbV9wVmFsaWRhdG9yKHBWYWxpZGF0b3IpLAogICAgICAgbV9wTGluZWFyaXplZChwTGluZWFyaXplZCksCiAgICAgICBtX25GaXJzdFBhZ2VTaGFyZWRPYmpzKDApLAogICAgICAgbV9zekZpcnN0UGFnZU9iak9mZnNldCgwKSB7CkBAIC00Nyw3ICs0OSw3IEBACiAKIHVpbnQzMl90IENQREZfSGludFRhYmxlczo6R2V0SXRlbUxlbmd0aCgKICAgICB1aW50MzJfdCBpbmRleCwKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxGWF9GSUxFU0laRT4mIHN6QXJyYXkpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxGWF9GSUxFU0laRT4mIHN6QXJyYXkpIGNvbnN0IHsKICAgaWYgKHN6QXJyYXkuc2l6ZSgpIDwgMiB8fCBpbmRleCA+IHN6QXJyYXkuc2l6ZSgpIC0gMiB8fAogICAgICAgc3pBcnJheVtpbmRleF0gPiBzekFycmF5W2luZGV4ICsgMV0pIHsKICAgICByZXR1cm4gMDsKQEAgLTI5MCw2ICsyOTIsMTEgQEAKICAgLy8gZ3JlYXRlc3QgYW5kIGxlYXN0IGxlbmd0aCBvZiBhIHNoYXJlZCBvYmplY3QgZ3JvdXAsIGluIGJ5dGVzLgogICB1aW50MzJfdCBkd0RlbHRhR3JvdXBMZW4gPSBoU3RyZWFtLT5HZXRCaXRzKDE2KTsKIAorICAvLyBUcnlpbmcgdG8gZGVjb2RlIG1vcmUgdGhhbiAzMiBiaXRzIGlzbid0IGdvaW5nIHRvIHdvcmsgd2hlbiB3ZSB3cml0ZSBpbnRvCisgIC8vIGEgdWludDMyX3QuCisgIGlmIChkd0RlbHRhR3JvdXBMZW4gPiAzMSkKKyAgICByZXR1cm4gZmFsc2U7CisKICAgaWYgKGR3Rmlyc3RTaGFyZWRPYmpOdW0gPj0gQ1BERl9QYXJzZXI6OmtNYXhPYmplY3ROdW1iZXIgfHwKICAgICAgIG1fbkZpcnN0UGFnZVNoYXJlZE9ianMgPj0gQ1BERl9QYXJzZXI6OmtNYXhPYmplY3ROdW1iZXIgfHwKICAgICAgIGR3U2hhcmVkT2JqVG90YWwgPj0gQ1BERl9QYXJzZXI6OmtNYXhPYmplY3ROdW1iZXIpIHsKQEAgLTM2Niw3ICszNzMsMTAgQEAKIGJvb2wgQ1BERl9IaW50VGFibGVzOjpHZXRQYWdlUG9zKHVpbnQzMl90IGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUqIHN6UGFnZVN0YXJ0UG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUqIHN6UGFnZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkd09iak51bSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGR3T2JqTnVtKSBjb25zdCB7CisgIGlmIChpbmRleCA+PSBtX3BMaW5lYXJpemVkLT5HZXRQYWdlQ291bnQoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKICAgKnN6UGFnZVN0YXJ0UG9zID0gbV9zelBhZ2VPZmZzZXRBcnJheVtpbmRleF07CiAgICpzelBhZ2VMZW5ndGggPSBHZXRJdGVtTGVuZ3RoKGluZGV4LCBtX3N6UGFnZU9mZnNldEFycmF5KTsKIApAQCAtMzk0LDEyICs0MDQsNyBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzIENQREZfSGludFRhYmxlczo6Q2hlY2tQYWdlKAotICAgIHVpbnQzMl90IGluZGV4LAotICAgIENQREZfRGF0YUF2YWlsOjpEb3dubG9hZEhpbnRzKiBwSGludHMpIHsKLSAgaWYgKCFwSGludHMpCi0gICAgcmV0dXJuIENQREZfRGF0YUF2YWlsOjpEYXRhRXJyb3I7Ci0KK0NQREZfRGF0YUF2YWlsOjpEb2NBdmFpbFN0YXR1cyBDUERGX0hpbnRUYWJsZXM6OkNoZWNrUGFnZSh1aW50MzJfdCBpbmRleCkgewogICBpbnQgbkZpcnN0UGFnZU51bSA9IEdldEZpcnN0UGFnZU51bWJlcigpOwogICBpZiAoIXBkZml1bTo6YmFzZTo6SXNWYWx1ZUluUmFuZ2VGb3JOdW1lcmljVHlwZTx1aW50MzJfdD4obkZpcnN0UGFnZU51bSkpCiAgICAgcmV0dXJuIENQREZfRGF0YUF2YWlsOjpEYXRhRXJyb3I7CkBAIC00MTIsNyArNDE3LDggQEAKICAgaWYgKCFkd0xlbmd0aCkKICAgICByZXR1cm4gQ1BERl9EYXRhQXZhaWw6OkRhdGFFcnJvcjsKIAotICBpZiAoIW1fcERhdGFBdmFpbC0+SXNEYXRhQXZhaWwobV9zelBhZ2VPZmZzZXRBcnJheVtpbmRleF0sIGR3TGVuZ3RoLCBwSGludHMpKQorICBpZiAoIW1fcFZhbGlkYXRvci0+Q2hlY2tEYXRhUmFuZ2VBbmRSZXF1ZXN0SWZVbmF2YWlsYWJsZSgKKyAgICAgICAgICBtX3N6UGFnZU9mZnNldEFycmF5W2luZGV4XSwgZHdMZW5ndGgpKQogICAgIHJldHVybiBDUERGX0RhdGFBdmFpbDo6RGF0YU5vdEF2YWlsYWJsZTsKIAogICAvLyBEb3dubG9hZCBkYXRhIG9mIHNoYXJlZCBvYmplY3RzIGluIHRoZSBwYWdlLgpAQCAtNDQzLDggKzQ0OSw4IEBACiAgICAgaWYgKCFkd0xlbmd0aCkKICAgICAgIHJldHVybiBDUERGX0RhdGFBdmFpbDo6RGF0YUVycm9yOwogCi0gICAgaWYgKCFtX3BEYXRhQXZhaWwtPklzRGF0YUF2YWlsKG1fc3pTaGFyZWRPYmpPZmZzZXRBcnJheVtkd0luZGV4XSwgZHdMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIaW50cykpIHsKKyAgICBpZiAoIW1fcFZhbGlkYXRvci0+Q2hlY2tEYXRhUmFuZ2VBbmRSZXF1ZXN0SWZVbmF2YWlsYWJsZSgKKyAgICAgICAgICAgIG1fc3pTaGFyZWRPYmpPZmZzZXRBcnJheVtkd0luZGV4XSwgZHdMZW5ndGgpKSB7CiAgICAgICByZXR1cm4gQ1BERl9EYXRhQXZhaWw6OkRhdGFOb3RBdmFpbGFibGU7CiAgICAgfQogICB9CkBAIC00NjQsMTAgKzQ3MCwxMCBAQAogICBpZiAoc2hhcmVkX2hpbnRfdGFibGVfb2Zmc2V0IDw9IDApCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIENQREZfU3RyZWFtQWNjIGFjYzsKLSAgYWNjLkxvYWRBbGxEYXRhKHBIaW50U3RyZWFtKTsKKyAgYXV0byBwQWNjID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfU3RyZWFtQWNjPihwSGludFN0cmVhbSk7CisgIHBBY2MtPkxvYWRBbGxEYXRhRmlsdGVyZWQoKTsKIAotICB1aW50MzJfdCBzaXplID0gYWNjLkdldFNpemUoKTsKKyAgdWludDMyX3Qgc2l6ZSA9IHBBY2MtPkdldFNpemUoKTsKICAgLy8gVGhlIGhlYWRlciBzZWN0aW9uIG9mIHBhZ2Ugb2Zmc2V0IGhpbnQgdGFibGUgaXMgMzYgYnl0ZXMuCiAgIC8vIFRoZSBoZWFkZXIgc2VjdGlvbiBvZiBzaGFyZWQgb2JqZWN0IGhpbnQgdGFibGUgaXMgMjQgYnl0ZXMuCiAgIC8vIEhpbnQgdGFibGUgaGFzIGF0IGxlYXN0IDYwIGJ5dGVzLgpAQCAtNDgxLDggKzQ4Nyw3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgQ0ZYX0JpdFN0cmVhbSBiczsKLSAgYnMuSW5pdChhY2MuR2V0RGF0YSgpLCBzaXplKTsKKyAgQ0ZYX0JpdFN0cmVhbSBicyhwQWNjLT5HZXREYXRhKCksIHNpemUpOwogICByZXR1cm4gUmVhZFBhZ2VIaW50VGFibGUoJmJzKSAmJgogICAgICAgICAgUmVhZFNoYXJlZE9iakhpbnRUYWJsZSgmYnMsIHNoYXJlZF9oaW50X3RhYmxlX29mZnNldCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfaGludF90YWJsZXMuaCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9oaW50X3RhYmxlcy5oCmluZGV4IGUwYmM2ZTAuLmQ1ZmViNDYgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9oaW50X3RhYmxlcy5oCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9oaW50X3RhYmxlcy5oCkBAIC0xMCwyNyArMTAsMjYgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGF0YV9hdmFpbC5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmVhbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKIAogY2xhc3MgQ0ZYX0JpdFN0cmVhbTsKIGNsYXNzIENQREZfTGluZWFyaXplZEhlYWRlcjsKIGNsYXNzIENQREZfU3RyZWFtOworY2xhc3MgQ1BERl9SZWFkVmFsaWRhdG9yOwogCiBjbGFzcyBDUERGX0hpbnRUYWJsZXMgewogIHB1YmxpYzoKLSAgQ1BERl9IaW50VGFibGVzKENQREZfRGF0YUF2YWlsKiBwRGF0YUF2YWlsLAorICBDUERGX0hpbnRUYWJsZXMoQ1BERl9SZWFkVmFsaWRhdG9yKiBwVmFsaWRhdG9yLAogICAgICAgICAgICAgICAgICAgQ1BERl9MaW5lYXJpemVkSGVhZGVyKiBwTGluZWFyaXplZCk7CiAgIHZpcnR1YWwgfkNQREZfSGludFRhYmxlcygpOwogCiAgIGJvb2wgR2V0UGFnZVBvcyh1aW50MzJfdCBpbmRleCwKICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFKiBzelBhZ2VTdGFydFBvcywKICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFKiBzelBhZ2VMZW5ndGgsCi0gICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHdPYmpOdW0pOworICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGR3T2JqTnVtKSBjb25zdDsKIAotICBDUERGX0RhdGFBdmFpbDo6RG9jQXZhaWxTdGF0dXMgQ2hlY2tQYWdlKAotICAgICAgdWludDMyX3QgaW5kZXgsCi0gICAgICBDUERGX0RhdGFBdmFpbDo6RG93bmxvYWRIaW50cyogcEhpbnRzKTsKKyAgQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzIENoZWNrUGFnZSh1aW50MzJfdCBpbmRleCk7CiAKICAgYm9vbCBMb2FkSGludFN0cmVhbShDUERGX1N0cmVhbSogcEhpbnRTdHJlYW0pOwogCkBAIC00OCwxMyArNDcsMTMgQEAKICAgdmlydHVhbCBpbnQgUmVhZFByaW1hcnlIaW50U3RyZWFtTGVuZ3RoKCkgY29uc3Q7CiAKICAgdWludDMyX3QgR2V0SXRlbUxlbmd0aCh1aW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxGWF9GSUxFU0laRT4mIHN6QXJyYXkpOwotCi0gIC8vIE93bmVyLCBvdXRsaXZlcyB0aGlzIG9iamVjdC4KLSAgQ1BERl9EYXRhQXZhaWwqIGNvbnN0IG1fcERhdGFBdmFpbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxGWF9GSUxFU0laRT4mIHN6QXJyYXkpIGNvbnN0OwogCiAgIC8vIE93bmVkIGJ5IHxtX3BEYXRhQXZhaWx8LgotICBDUERGX0xpbmVhcml6ZWRIZWFkZXIqIGNvbnN0IG1fcExpbmVhcml6ZWQ7CisgIFVub3duZWRQdHI8Q1BERl9SZWFkVmFsaWRhdG9yPiBtX3BWYWxpZGF0b3I7CisKKyAgLy8gT3duZWQgYnkgfG1fcERhdGFBdmFpbHwuCisgIFVub3duZWRQdHI8Q1BERl9MaW5lYXJpemVkSGVhZGVyPiBjb25zdCBtX3BMaW5lYXJpemVkOwogCiAgIHVpbnQzMl90IG1fbkZpcnN0UGFnZVNoYXJlZE9ianM7CiAgIEZYX0ZJTEVTSVpFIG1fc3pGaXJzdFBhZ2VPYmpPZmZzZXQ7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfaGludF90YWJsZXNfdW5pdHRlc3QuY3BwIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2hpbnRfdGFibGVzX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDU3MjI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2hpbnRfdGFibGVzX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDY5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfaGludF90YWJsZXMuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9jcGRmX21vZHVsZW1nci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kYXRhX2F2YWlsLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJlYW0uaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL3V0aWxzL3BhdGhfc2VydmljZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworc3RkOjp1bmlxdWVfcHRyPENQREZfRGF0YUF2YWlsPiBNYWtlRGF0YUF2YWlsRnJvbUZpbGUoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVfbmFtZSkgeworICBzdGQ6OnN0cmluZyBmaWxlX3BhdGg7CisgIGlmICghUGF0aFNlcnZpY2U6OkdldFRlc3RGaWxlUGF0aChmaWxlX25hbWUsICZmaWxlX3BhdGgpKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGF0YUF2YWlsPigKKyAgICAgIG51bGxwdHIsIElGWF9TZWVrYWJsZVJlYWRTdHJlYW06OkNyZWF0ZUZyb21GaWxlbmFtZShmaWxlX3BhdGguY19zdHIoKSksCisgICAgICB0cnVlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIENQREZfSGludFRhYmxlc1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICBDUERGX0hpbnRUYWJsZXNUZXN0KCkgeworICAgIC8vIE5lZWRzIGZvciBlbmNvZGluZyBIaW50IHRhYmxlIHN0cmVhbS4KKyAgICBDUERGX01vZHVsZU1ncjo6R2V0KCktPkluaXQoKTsKKyAgfQorCisgIH5DUERGX0hpbnRUYWJsZXNUZXN0KCkgb3ZlcnJpZGUgeyBDUERGX01vZHVsZU1ncjo6RGVzdHJveSgpOyB9Cit9OworCitURVNUX0YoQ1BERl9IaW50VGFibGVzVGVzdCwgTG9hZCkgeworICBhdXRvIGRhdGFfYXZhaWwgPSBNYWtlRGF0YUF2YWlsRnJvbUZpbGUoImZlYXR1cmVfbGluZWFyaXplZF9sb2FkaW5nLnBkZiIpOworICBBU1NFUlRfRVEoQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzOjpEYXRhQXZhaWxhYmxlLAorICAgICAgICAgICAgZGF0YV9hdmFpbC0+SXNEb2NBdmFpbChudWxscHRyKSk7CisKKyAgQVNTRVJUX1RSVUUoZGF0YV9hdmFpbC0+R2V0SGludFRhYmxlcygpKTsKKworICBjb25zdCBDUERGX0hpbnRUYWJsZXMqIGhpbnRfdGFibGVzID0gZGF0YV9hdmFpbC0+R2V0SGludFRhYmxlcygpOworICBGWF9GSUxFU0laRSBwYWdlX3N0YXJ0ID0gMDsKKyAgRlhfRklMRVNJWkUgcGFnZV9sZW5ndGggPSAwOworICB1aW50MzJfdCBwYWdlX29ial9udW0gPSAwOworCisgIEFTU0VSVF9UUlVFKAorICAgICAgaGludF90YWJsZXMtPkdldFBhZ2VQb3MoMCwgJnBhZ2Vfc3RhcnQsICZwYWdlX2xlbmd0aCwgJnBhZ2Vfb2JqX251bSkpOworICBFWFBFQ1RfRVEoNzc3LCBwYWdlX3N0YXJ0KTsKKyAgRVhQRUNUX0VRKDQzMjgsIHBhZ2VfbGVuZ3RoKTsKKyAgRVhQRUNUX0VRKDM5dSwgcGFnZV9vYmpfbnVtKTsKKworICBBU1NFUlRfVFJVRSgKKyAgICAgIGhpbnRfdGFibGVzLT5HZXRQYWdlUG9zKDEsICZwYWdlX3N0YXJ0LCAmcGFnZV9sZW5ndGgsICZwYWdlX29ial9udW0pKTsKKyAgRVhQRUNUX0VRKDUxMDUsIHBhZ2Vfc3RhcnQpOworICBFWFBFQ1RfRVEoNzY3LCBwYWdlX2xlbmd0aCk7CisgIEVYUEVDVF9FUSgxdSwgcGFnZV9vYmpfbnVtKTsKKworICBBU1NFUlRfRkFMU0UoCisgICAgICBoaW50X3RhYmxlcy0+R2V0UGFnZVBvcygyLCAmcGFnZV9zdGFydCwgJnBhZ2VfbGVuZ3RoLCAmcGFnZV9vYmpfbnVtKSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfaW5kaXJlY3Rfb2JqZWN0X2hvbGRlci5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfaW5kaXJlY3Rfb2JqZWN0X2hvbGRlci5jcHAKaW5kZXggMzAzN2QwYi4uNDJlMzEyYyAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2luZGlyZWN0X29iamVjdF9ob2xkZXIuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9pbmRpcmVjdF9vYmplY3RfaG9sZGVyLmNwcApAQCAtMTMsOSArMTMsMTcgQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9sb2dnaW5nLmgiCiAKK25hbWVzcGFjZSB7CisKK0NQREZfT2JqZWN0KiBGaWx0ZXJJbnZhbGlkT2JqTnVtKENQREZfT2JqZWN0KiBvYmopIHsKKyAgcmV0dXJuIG9iaiAmJiBvYmotPkdldE9iak51bSgpICE9IENQREZfT2JqZWN0OjprSW52YWxpZE9iak51bSA/IG9iaiA6IG51bGxwdHI7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCiBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyOjpDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKCkKICAgICA6IG1fTGFzdE9iak51bSgwKSwKLSAgICAgIG1fcEJ5dGVTdHJpbmdQb29sKHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfQnl0ZVN0cmluZ1Bvb2w+KCkpIHt9CisgICAgICBtX3BCeXRlU3RyaW5nUG9vbChwZGZpdW06Ok1ha2VVbmlxdWU8Qnl0ZVN0cmluZ1Bvb2w+KCkpIHt9CiAKIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXI6On5DUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKCkgewogICBtX3BCeXRlU3RyaW5nUG9vbC5EZWxldGVPYmplY3QoKTsgIC8vIE1ha2Ugd2Vhay4KQEAgLTI0LDI2ICszMiwzMCBAQAogQ1BERl9PYmplY3QqIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXI6OkdldEluZGlyZWN0T2JqZWN0KAogICAgIHVpbnQzMl90IG9iam51bSkgY29uc3QgewogICBhdXRvIGl0ID0gbV9JbmRpcmVjdE9ianMuZmluZChvYmpudW0pOwotICByZXR1cm4gaXQgIT0gbV9JbmRpcmVjdE9ianMuZW5kKCkgPyBpdC0+c2Vjb25kLmdldCgpIDogbnVsbHB0cjsKKyAgcmV0dXJuIChpdCAhPSBtX0luZGlyZWN0T2Jqcy5lbmQoKSkgPyBGaWx0ZXJJbnZhbGlkT2JqTnVtKGl0LT5zZWNvbmQuZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cjsKIH0KIAogQ1BERl9PYmplY3QqIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXI6OkdldE9yUGFyc2VJbmRpcmVjdE9iamVjdCgKICAgICB1aW50MzJfdCBvYmpudW0pIHsKLSAgaWYgKG9iam51bSA9PSAwKQorICBpZiAob2JqbnVtID09IDAgfHwgb2JqbnVtID09IENQREZfT2JqZWN0OjprSW52YWxpZE9iak51bSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAotICBDUERGX09iamVjdCogcE9iaiA9IEdldEluZGlyZWN0T2JqZWN0KG9iam51bSk7Ci0gIGlmIChwT2JqKQotICAgIHJldHVybiBwT2JqLT5HZXRPYmpOdW0oKSAhPSBDUERGX09iamVjdDo6a0ludmFsaWRPYmpOdW0gPyBwT2JqIDogbnVsbHB0cjsKKyAgLy8gQWRkIGl0ZW0gYW55d2F5IHRvIHByZXZlbnQgcmVjdXJzaXZlbHkgcGFyc2luZyBvZiBzYW1lIG9iamVjdC4KKyAgYXV0byBpbnNlcnRfcmVzdWx0ID0gbV9JbmRpcmVjdE9ianMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKG9iam51bSwgbnVsbHB0cikpOworICBpZiAoIWluc2VydF9yZXN1bHQuc2Vjb25kKQorICAgIHJldHVybiBGaWx0ZXJJbnZhbGlkT2JqTnVtKGluc2VydF9yZXN1bHQuZmlyc3QtPnNlY29uZC5nZXQoKSk7CiAKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBwTmV3T2JqID0gUGFyc2VJbmRpcmVjdE9iamVjdChvYmpudW0pOwotICBpZiAoIXBOZXdPYmopCisgIGlmICghcE5ld09iaikgeworICAgIG1fSW5kaXJlY3RPYmpzLmVyYXNlKGluc2VydF9yZXN1bHQuZmlyc3QpOwogICAgIHJldHVybiBudWxscHRyOworICB9CiAKLSAgcE5ld09iai0+bV9PYmpOdW0gPSBvYmpudW07CisgIHBOZXdPYmotPlNldE9iak51bShvYmpudW0pOwogICBtX0xhc3RPYmpOdW0gPSBzdGQ6Om1heChtX0xhc3RPYmpOdW0sIG9iam51bSk7Ci0gIG1fSW5kaXJlY3RPYmpzW29iam51bV0gPSBzdGQ6Om1vdmUocE5ld09iaik7Ci0gIHJldHVybiBtX0luZGlyZWN0T2Jqc1tvYmpudW1dLmdldCgpOworICBpbnNlcnRfcmVzdWx0LmZpcnN0LT5zZWNvbmQgPSBzdGQ6Om1vdmUocE5ld09iaik7CisgIHJldHVybiBpbnNlcnRfcmVzdWx0LmZpcnN0LT5zZWNvbmQuZ2V0KCk7CiB9CiAKIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlcjo6UGFyc2VJbmRpcmVjdE9iamVjdCgKQEAgLTUzLDM3ICs2NSw0MiBAQAogCiBDUERGX09iamVjdCogQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlcjo6QWRkSW5kaXJlY3RPYmplY3QoCiAgICAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBwT2JqKSB7Ci0gIENIRUNLKCFwT2JqLT5tX09iak51bSk7Ci0gIENQREZfT2JqZWN0KiBwVW5vd25lZCA9IHBPYmouZ2V0KCk7Ci0gIHBPYmotPm1fT2JqTnVtID0gKyttX0xhc3RPYmpOdW07Ci0gIGlmIChtX0luZGlyZWN0T2Jqc1ttX0xhc3RPYmpOdW1dKQotICAgIG1fT3JwaGFuT2Jqcy5wdXNoX2JhY2soc3RkOjptb3ZlKG1fSW5kaXJlY3RPYmpzW21fTGFzdE9iak51bV0pKTsKKyAgQ0hFQ0soIXBPYmotPkdldE9iak51bSgpKTsKKyAgcE9iai0+U2V0T2JqTnVtKCsrbV9MYXN0T2JqTnVtKTsKIAotICBtX0luZGlyZWN0T2Jqc1ttX0xhc3RPYmpOdW1dID0gc3RkOjptb3ZlKHBPYmopOwotICByZXR1cm4gcFVub3duZWQ7CisgIGF1dG8mIG9ial9ob2xkZXIgPSBtX0luZGlyZWN0T2Jqc1ttX0xhc3RPYmpOdW1dOworICBpZiAob2JqX2hvbGRlcikKKyAgICBtX09ycGhhbk9ianMucHVzaF9iYWNrKHN0ZDo6bW92ZShvYmpfaG9sZGVyKSk7CisKKyAgb2JqX2hvbGRlciA9IHN0ZDo6bW92ZShwT2JqKTsKKyAgcmV0dXJuIG9ial9ob2xkZXIuZ2V0KCk7CiB9CiAKIGJvb2wgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlcjo6UmVwbGFjZUluZGlyZWN0T2JqZWN0SWZIaWdoZXJHZW5lcmF0aW9uKAogICAgIHVpbnQzMl90IG9iam51bSwKICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IHBPYmopIHsKICAgQVNTRVJUKG9iam51bSk7Ci0gIGlmICghcE9iaikKKyAgaWYgKCFwT2JqIHx8IG9iam51bSA9PSBDUERGX09iamVjdDo6a0ludmFsaWRPYmpOdW0pCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIENQREZfT2JqZWN0KiBwT2xkT2JqID0gR2V0SW5kaXJlY3RPYmplY3Qob2JqbnVtKTsKLSAgaWYgKHBPbGRPYmogJiYgcE9iai0+R2V0R2VuTnVtKCkgPD0gcE9sZE9iai0+R2V0R2VuTnVtKCkpCisgIGF1dG8mIG9ial9ob2xkZXIgPSBtX0luZGlyZWN0T2Jqc1tvYmpudW1dOworICBjb25zdCBDUERGX09iamVjdCogb2xkX29iamVjdCA9IEZpbHRlckludmFsaWRPYmpOdW0ob2JqX2hvbGRlci5nZXQoKSk7CisgIGlmIChvbGRfb2JqZWN0ICYmIHBPYmotPkdldEdlbk51bSgpIDw9IG9sZF9vYmplY3QtPkdldEdlbk51bSgpKQogICAgIHJldHVybiBmYWxzZTsKIAotICBwT2JqLT5tX09iak51bSA9IG9iam51bTsKLSAgbV9JbmRpcmVjdE9ianNbb2JqbnVtXSA9IHN0ZDo6bW92ZShwT2JqKTsKKyAgcE9iai0+U2V0T2JqTnVtKG9iam51bSk7CisgIGlmIChvYmpfaG9sZGVyKQorICAgIG1fT3JwaGFuT2Jqcy5wdXNoX2JhY2soc3RkOjptb3ZlKG9ial9ob2xkZXIpKTsKKworICBvYmpfaG9sZGVyID0gc3RkOjptb3ZlKHBPYmopOwogICBtX0xhc3RPYmpOdW0gPSBzdGQ6Om1heChtX0xhc3RPYmpOdW0sIG9iam51bSk7CiAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXI6OkRlbGV0ZUluZGlyZWN0T2JqZWN0KHVpbnQzMl90IG9iam51bSkgewotICBDUERGX09iamVjdCogcE9iaiA9IEdldEluZGlyZWN0T2JqZWN0KG9iam51bSk7Ci0gIGlmICghcE9iaiB8fCBwT2JqLT5HZXRPYmpOdW0oKSA9PSBDUERGX09iamVjdDo6a0ludmFsaWRPYmpOdW0pCisgIGF1dG8gaXQgPSBtX0luZGlyZWN0T2Jqcy5maW5kKG9iam51bSk7CisgIGlmIChpdCA9PSBtX0luZGlyZWN0T2Jqcy5lbmQoKSB8fCAhRmlsdGVySW52YWxpZE9iak51bShpdC0+c2Vjb25kLmdldCgpKSkKICAgICByZXR1cm47CiAKLSAgbV9JbmRpcmVjdE9ianMuZXJhc2Uob2JqbnVtKTsKKyAgbV9JbmRpcmVjdE9ianMuZXJhc2UoaXQpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2luZGlyZWN0X29iamVjdF9ob2xkZXIuaCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9pbmRpcmVjdF9vYmplY3RfaG9sZGVyLmgKaW5kZXggYjZkMzNhMy4uNTczNzRiOSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2luZGlyZWN0X29iamVjdF9ob2xkZXIuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfaW5kaXJlY3Rfb2JqZWN0X2hvbGRlci5oCkBAIC0xNCw5ICsxNCw5IEBACiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdC5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3N0cmluZ19wb29sX3RlbXBsYXRlLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfd2Vha19wdHIuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvc3RyaW5nX3Bvb2xfdGVtcGxhdGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3dlYWtfcHRyLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogCiBjbGFzcyBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyIHsKQEAgLTI4LDcgKzI4LDcgQEAKICAgdmlydHVhbCB+Q1BERl9JbmRpcmVjdE9iamVjdEhvbGRlcigpOwogCiAgIENQREZfT2JqZWN0KiBHZXRJbmRpcmVjdE9iamVjdCh1aW50MzJfdCBvYmpudW0pIGNvbnN0OwotICBDUERGX09iamVjdCogR2V0T3JQYXJzZUluZGlyZWN0T2JqZWN0KHVpbnQzMl90IG9iam51bSk7CisgIHZpcnR1YWwgQ1BERl9PYmplY3QqIEdldE9yUGFyc2VJbmRpcmVjdE9iamVjdCh1aW50MzJfdCBvYmpudW0pOwogICB2b2lkIERlbGV0ZUluZGlyZWN0T2JqZWN0KHVpbnQzMl90IG9iam51bSk7CiAKICAgLy8gQ3JlYXRlcyBhbmQgYWRkcyBhIG5ldyBvYmplY3Qgb3duZWQgYnkgdGhlIGluZGlyZWN0IG9iamVjdCBob2xkZXIsCkBAIC01OCw3ICs1OCw3IEBACiAgIHVpbnQzMl90IEdldExhc3RPYmpOdW0oKSBjb25zdCB7IHJldHVybiBtX0xhc3RPYmpOdW07IH0KICAgdm9pZCBTZXRMYXN0T2JqTnVtKHVpbnQzMl90IG9iam51bSkgeyBtX0xhc3RPYmpOdW0gPSBvYmpudW07IH0KIAotICBDRlhfV2Vha1B0cjxDRlhfQnl0ZVN0cmluZ1Bvb2w+IEdldEJ5dGVTdHJpbmdQb29sKCkgY29uc3QgeworICBXZWFrUHRyPEJ5dGVTdHJpbmdQb29sPiBHZXRCeXRlU3RyaW5nUG9vbCgpIGNvbnN0IHsKICAgICByZXR1cm4gbV9wQnl0ZVN0cmluZ1Bvb2w7CiAgIH0KIApAQCAtNzIsNyArNzIsNyBAQAogICB1aW50MzJfdCBtX0xhc3RPYmpOdW07CiAgIHN0ZDo6bWFwPHVpbnQzMl90LCBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+PiBtX0luZGlyZWN0T2JqczsKICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0Pj4gbV9PcnBoYW5PYmpzOwotICBDRlhfV2Vha1B0cjxDRlhfQnl0ZVN0cmluZ1Bvb2w+IG1fcEJ5dGVTdHJpbmdQb29sOworICBXZWFrUHRyPEJ5dGVTdHJpbmdQb29sPiBtX3BCeXRlU3RyaW5nUG9vbDsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9GUERGQVBJX1BBUlNFUl9DUERGX0lORElSRUNUX09CSkVDVF9IT0xERVJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9pbmRpcmVjdF9vYmplY3RfaG9sZGVyX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9pbmRpcmVjdF9vYmplY3RfaG9sZGVyX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjYyNjRmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2luZGlyZWN0X29iamVjdF9ob2xkZXJfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsODEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9pbmRpcmVjdF9vYmplY3RfaG9sZGVyLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9udWxsLmgiCisjaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjbGFzcyBNb2NrSW5kaXJlY3RPYmplY3RIb2xkZXIgOiBwdWJsaWMgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciB7CisgcHVibGljOgorICBNb2NrSW5kaXJlY3RPYmplY3RIb2xkZXIoKSB7fQorICB+TW9ja0luZGlyZWN0T2JqZWN0SG9sZGVyKCkgb3ZlcnJpZGUge30KKworICBNT0NLX01FVEhPRDEoUGFyc2VJbmRpcmVjdE9iamVjdCwKKyAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4odWludDMyX3Qgb2JqbnVtKSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVChDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyVGVzdCwgUmVjdXJzaXZlUGFyc2VPZlNhbWVPYmplY3QpIHsKKyAgTW9ja0luZGlyZWN0T2JqZWN0SG9sZGVyIG1vY2tfaG9sZGVyOworICAvLyBQYXJzZUluZGlyZWN0T2JqZWN0IHNob3VsZCBub3QgYmUgY2FsbGVkIGFnYWluIG9uIHJlY3Vyc2l2ZWx5IHNhbWUgb2JqZWN0CisgIC8vIHBhcnNlIHJlcXVlc3QuCisgIEVYUEVDVF9DQUxMKG1vY2tfaG9sZGVyLCBQYXJzZUluZGlyZWN0T2JqZWN0KDo6dGVzdGluZzo6XykpCisgICAgICAuV2lsbE9uY2UoOjp0ZXN0aW5nOjpXaXRoQXJnPDA+KDo6dGVzdGluZzo6SW52b2tlKAorICAgICAgICAgIFsmbW9ja19ob2xkZXJdKHVpbnQzMl90IG9iam51bSkgLT4gc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiB7CisgICAgICAgICAgICBjb25zdCBDUERGX09iamVjdCogc2FtZV9wYXJzZSA9CisgICAgICAgICAgICAgICAgbW9ja19ob2xkZXIuR2V0T3JQYXJzZUluZGlyZWN0T2JqZWN0KG9iam51bSk7CisgICAgICAgICAgICBDSEVDSyghc2FtZV9wYXJzZSk7CisgICAgICAgICAgICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfTnVsbD4oKTsKKyAgICAgICAgICB9KSkpOworCisgIEVYUEVDVF9UUlVFKG1vY2tfaG9sZGVyLkdldE9yUGFyc2VJbmRpcmVjdE9iamVjdCgxMDAwKSk7Cit9CisKK1RFU1QoQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlclRlc3QsIEdldE9iamVjdE1ldGhvZHMpIHsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrT2JqTnVtID0gMTAwMDsKKyAgTW9ja0luZGlyZWN0T2JqZWN0SG9sZGVyIG1vY2tfaG9sZGVyOworCisgIEVYUEVDVF9DQUxMKG1vY2tfaG9sZGVyLCBQYXJzZUluZGlyZWN0T2JqZWN0KDo6dGVzdGluZzo6XykpLlRpbWVzKDApOworICBFWFBFQ1RfRkFMU0UobW9ja19ob2xkZXIuR2V0SW5kaXJlY3RPYmplY3Qoa09iak51bSkpOworICA6OnRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX2hvbGRlcik7CisKKyAgRVhQRUNUX0NBTEwobW9ja19ob2xkZXIsIFBhcnNlSW5kaXJlY3RPYmplY3QoOjp0ZXN0aW5nOjpfKSkKKyAgICAgIC5XaWxsT25jZSg6OnRlc3Rpbmc6OldpdGhBcmc8MD4oOjp0ZXN0aW5nOjpJbnZva2UoCisgICAgICAgICAgW10odWludDMyX3Qgb2JqbnVtKSAtPiBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IHsKKyAgICAgICAgICAgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9OdWxsPigpOworICAgICAgICAgIH0pKSk7CisgIEVYUEVDVF9UUlVFKG1vY2tfaG9sZGVyLkdldE9yUGFyc2VJbmRpcmVjdE9iamVjdChrT2JqTnVtKSk7CisgIDo6dGVzdGluZzo6TW9jazo6VmVyaWZ5QW5kQ2xlYXJFeHBlY3RhdGlvbnMoJm1vY2tfaG9sZGVyKTsKKworICBFWFBFQ1RfQ0FMTChtb2NrX2hvbGRlciwgUGFyc2VJbmRpcmVjdE9iamVjdCg6OnRlc3Rpbmc6Ol8pKS5UaW1lcygwKTsKKyAgQVNTRVJUX1RSVUUobW9ja19ob2xkZXIuR2V0SW5kaXJlY3RPYmplY3Qoa09iak51bSkpOworICA6OnRlc3Rpbmc6Ok1vY2s6OlZlcmlmeUFuZENsZWFyRXhwZWN0YXRpb25zKCZtb2NrX2hvbGRlcik7CisKKyAgRVhQRUNUX0VRKGtPYmpOdW0sIG1vY2tfaG9sZGVyLkdldEluZGlyZWN0T2JqZWN0KGtPYmpOdW0pLT5HZXRPYmpOdW0oKSk7Cit9CisKK1RFU1QoQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlclRlc3QsIFBhcnNlSW52YWxpZE9iak51bSkgeworICBNb2NrSW5kaXJlY3RPYmplY3RIb2xkZXIgbW9ja19ob2xkZXI7CisKKyAgRVhQRUNUX0NBTEwobW9ja19ob2xkZXIsIFBhcnNlSW5kaXJlY3RPYmplY3QoOjp0ZXN0aW5nOjpfKSkuVGltZXMoMCk7CisgIEVYUEVDVF9GQUxTRSgKKyAgICAgIG1vY2tfaG9sZGVyLkdldE9yUGFyc2VJbmRpcmVjdE9iamVjdChDUERGX09iamVjdDo6a0ludmFsaWRPYmpOdW0pKTsKK30KKworVEVTVChDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyVGVzdCwgUmVwbGFjZU9iamVjdFdpdGhJbnZhbGlkT2JqTnVtKSB7CisgIE1vY2tJbmRpcmVjdE9iamVjdEhvbGRlciBtb2NrX2hvbGRlcjsKKworICBFWFBFQ1RfQ0FMTChtb2NrX2hvbGRlciwgUGFyc2VJbmRpcmVjdE9iamVjdCg6OnRlc3Rpbmc6Ol8pKS5UaW1lcygwKTsKKyAgRVhQRUNUX0ZBTFNFKG1vY2tfaG9sZGVyLlJlcGxhY2VJbmRpcmVjdE9iamVjdElmSGlnaGVyR2VuZXJhdGlvbigKKyAgICAgIENQREZfT2JqZWN0OjprSW52YWxpZE9iak51bSwgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfTnVsbD4oKSkpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2xpbmVhcml6ZWRfaGVhZGVyLmNwcCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9saW5lYXJpemVkX2hlYWRlci5jcHAKaW5kZXggYTU2ZDY0Zi4uOTk0ZDY5ZiAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2xpbmVhcml6ZWRfaGVhZGVyLmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbGluZWFyaXplZF9oZWFkZXIuY3BwCkBAIC03LDE1ICs3LDIwIEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2xpbmVhcml6ZWRfaGVhZGVyLmgiCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bGltaXRzPgogI2luY2x1ZGUgPHV0aWxpdHk+CiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9udW1iZXIuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3ludGF4X3BhcnNlci5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAogbmFtZXNwYWNlIHsKIAorY29uc3RleHByIEZYX0ZJTEVTSVpFIGtMaW5lYXJpemVkSGVhZGVyT2Zmc2V0ID0gOTsKK2NvbnN0ZXhwciBzaXplX3Qga01heEludCA9IHN0YXRpY19jYXN0PHNpemVfdD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSk7CisKIHRlbXBsYXRlIDxjbGFzcyBUPgogYm9vbCBJc1ZhbGlkTnVtZXJpY0RpY3Rpb25hcnlWYWx1ZShjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBrZXksCkBAIC0zMiwzNiArMzcsNzAgQEAKICAgcmV0dXJuIHN0YXRpY19jYXN0PFQ+KHJhd192YWx1ZSkgPj0gbWluX3ZhbHVlOwogfQogCitib29sIElzTGluZWFyaXplZEhlYWRlclZhbGlkKGNvbnN0IENQREZfTGluZWFyaXplZEhlYWRlciogaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBmaWxlX3NpemUpIHsKKyAgQVNTRVJUKGhlYWRlcik7CisgIHJldHVybiBoZWFkZXItPkdldEZpbGVTaXplKCkgPT0gZmlsZV9zaXplICYmCisgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGhlYWRlci0+R2V0Rmlyc3RQYWdlTm8oKSkgPj0gMCAmJgorICAgICAgICAgaGVhZGVyLT5HZXRGaXJzdFBhZ2VObygpIDwga01heEludCAmJgorICAgICAgICAgaGVhZGVyLT5HZXRNYWluWFJlZlRhYmxlRmlyc3RFbnRyeU9mZnNldCgpIDwgZmlsZV9zaXplICYmCisgICAgICAgICBoZWFkZXItPkdldFBhZ2VDb3VudCgpID4gMCAmJgorICAgICAgICAgaGVhZGVyLT5HZXRGaXJzdFBhZ2VFbmRPZmZzZXQoKSA8IGZpbGVfc2l6ZSAmJgorICAgICAgICAgaGVhZGVyLT5HZXRMYXN0WFJlZk9mZnNldCgpIDwgZmlsZV9zaXplICYmCisgICAgICAgICBoZWFkZXItPkdldEhpbnRTdGFydCgpIDwgZmlsZV9zaXplOworfQorCiB9ICAvLyBuYW1lc3BhY2UKIAogLy8gc3RhdGljCi1zdGQ6OnVuaXF1ZV9wdHI8Q1BERl9MaW5lYXJpemVkSGVhZGVyPiBDUERGX0xpbmVhcml6ZWRIZWFkZXI6OkNyZWF0ZUZvck9iamVjdCgKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IHBPYmopIHsKLSAgYXV0byBwRGljdCA9IFRvRGljdGlvbmFyeShzdGQ6Om1vdmUocE9iaikpOworc3RkOjp1bmlxdWVfcHRyPENQREZfTGluZWFyaXplZEhlYWRlcj4gQ1BERl9MaW5lYXJpemVkSGVhZGVyOjpQYXJzZSgKKyAgICBDUERGX1N5bnRheFBhcnNlciogcGFyc2VyKSB7CisgIHBhcnNlci0+U2V0UG9zKGtMaW5lYXJpemVkSGVhZGVyT2Zmc2V0KTsKKworICBjb25zdCBhdXRvIHBEaWN0ID0gVG9EaWN0aW9uYXJ5KAorICAgICAgcGFyc2VyLT5HZXRJbmRpcmVjdE9iamVjdChudWxscHRyLCBDUERGX1N5bnRheFBhcnNlcjo6UGFyc2VUeXBlOjprTG9vc2UpKTsKKwogICBpZiAoIXBEaWN0IHx8ICFwRGljdC0+S2V5RXhpc3QoIkxpbmVhcml6ZWQiKSB8fAogICAgICAgIUlzVmFsaWROdW1lcmljRGljdGlvbmFyeVZhbHVlPEZYX0ZJTEVTSVpFPihwRGljdC5nZXQoKSwgIkwiLCAxKSB8fAogICAgICAgIUlzVmFsaWROdW1lcmljRGljdGlvbmFyeVZhbHVlPHVpbnQzMl90PihwRGljdC5nZXQoKSwgIlAiLCAwLCBmYWxzZSkgfHwKICAgICAgICFJc1ZhbGlkTnVtZXJpY0RpY3Rpb25hcnlWYWx1ZTxGWF9GSUxFU0laRT4ocERpY3QuZ2V0KCksICJUIiwgMSkgfHwKICAgICAgICFJc1ZhbGlkTnVtZXJpY0RpY3Rpb25hcnlWYWx1ZTx1aW50MzJfdD4ocERpY3QuZ2V0KCksICJOIiwgMCkgfHwKICAgICAgICFJc1ZhbGlkTnVtZXJpY0RpY3Rpb25hcnlWYWx1ZTxGWF9GSUxFU0laRT4ocERpY3QuZ2V0KCksICJFIiwgMSkgfHwKLSAgICAgICFJc1ZhbGlkTnVtZXJpY0RpY3Rpb25hcnlWYWx1ZTx1aW50MzJfdD4ocERpY3QuZ2V0KCksICJPIiwgMSkpCisgICAgICAhSXNWYWxpZE51bWVyaWNEaWN0aW9uYXJ5VmFsdWU8dWludDMyX3Q+KHBEaWN0LmdldCgpLCAiTyIsIDEpKSB7CiAgICAgcmV0dXJuIG51bGxwdHI7Ci0gIHJldHVybiBwZGZpdW06OldyYXBVbmlxdWUobmV3IENQREZfTGluZWFyaXplZEhlYWRlcihwRGljdC5nZXQoKSkpOworICB9CisgIC8vIE1vdmUgcGFyc2VyIHRvIHRoZSBzdGFydCBvZiB0aGUgeHJlZiB0YWJsZSBmb3IgdGhlIGRvY3VtZW50cyBmaXJzdCBwYWdlLgorICAvLyAoc2twcGluZyBlbmRvYmoga2V5d29yZCkKKyAgaWYgKHBhcnNlci0+R2V0TmV4dFdvcmQobnVsbHB0cikgIT0gImVuZG9iaiIpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgYXV0byByZXN1bHQgPSBwZGZpdW06OldyYXBVbmlxdWUoCisgICAgICBuZXcgQ1BERl9MaW5lYXJpemVkSGVhZGVyKHBEaWN0LmdldCgpLCBwYXJzZXItPkdldFBvcygpKSk7CisKKyAgaWYgKCFJc0xpbmVhcml6ZWRIZWFkZXJWYWxpZChyZXN1bHQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLT5HZXRGaWxlQWNjZXNzKCktPkdldFNpemUoKSkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gcmVzdWx0OwogfQogCi1DUERGX0xpbmVhcml6ZWRIZWFkZXI6OkNQREZfTGluZWFyaXplZEhlYWRlcihjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSB7Ci0gIG1fc3pGaWxlU2l6ZSA9IHBEaWN0LT5HZXRJbnRlZ2VyRm9yKCJMIik7Ci0gIG1fZHdGaXJzdFBhZ2VObyA9IHBEaWN0LT5HZXRJbnRlZ2VyRm9yKCJQIik7Ci0gIG1fc3pMYXN0WFJlZk9mZnNldCA9IHBEaWN0LT5HZXRJbnRlZ2VyRm9yKCJUIik7Ci0gIG1fUGFnZUNvdW50ID0gcERpY3QtPkdldEludGVnZXJGb3IoIk4iKTsKLSAgbV9zekZpcnN0UGFnZUVuZE9mZnNldCA9IHBEaWN0LT5HZXRJbnRlZ2VyRm9yKCJFIik7Ci0gIG1fRmlyc3RQYWdlT2JqTnVtID0gcERpY3QtPkdldEludGVnZXJGb3IoIk8iKTsKK0NQREZfTGluZWFyaXplZEhlYWRlcjo6Q1BERl9MaW5lYXJpemVkSGVhZGVyKGNvbnN0IENQREZfRGljdGlvbmFyeSogcERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBzekxhc3RYUmVmT2Zmc2V0KQorICAgIDogbV9zekZpbGVTaXplKHBEaWN0LT5HZXRJbnRlZ2VyRm9yKCJMIikpLAorICAgICAgbV9kd0ZpcnN0UGFnZU5vKHBEaWN0LT5HZXRJbnRlZ2VyRm9yKCJQIikpLAorICAgICAgbV9zek1haW5YUmVmVGFibGVGaXJzdEVudHJ5T2Zmc2V0KHBEaWN0LT5HZXRJbnRlZ2VyRm9yKCJUIikpLAorICAgICAgbV9QYWdlQ291bnQocERpY3QtPkdldEludGVnZXJGb3IoIk4iKSksCisgICAgICBtX3N6Rmlyc3RQYWdlRW5kT2Zmc2V0KHBEaWN0LT5HZXRJbnRlZ2VyRm9yKCJFIikpLAorICAgICAgbV9GaXJzdFBhZ2VPYmpOdW0ocERpY3QtPkdldEludGVnZXJGb3IoIk8iKSksCisgICAgICBtX3N6TGFzdFhSZWZPZmZzZXQoc3pMYXN0WFJlZk9mZnNldCkgewogICBjb25zdCBDUERGX0FycmF5KiBwSGludFN0cmVhbVJhbmdlID0gcERpY3QtPkdldEFycmF5Rm9yKCJIIik7CiAgIGNvbnN0IHNpemVfdCBuSGludFN0cmVhbVNpemUgPQogICAgICAgcEhpbnRTdHJlYW1SYW5nZSA/IHBIaW50U3RyZWFtUmFuZ2UtPkdldENvdW50KCkgOiAwOwogICBpZiAobkhpbnRTdHJlYW1TaXplID09IDIgfHwgbkhpbnRTdHJlYW1TaXplID09IDQpIHsKICAgICBtX3N6SGludFN0YXJ0ID0gc3RkOjptYXgocEhpbnRTdHJlYW1SYW5nZS0+R2V0SW50ZWdlckF0KDApLCAwKTsKLSAgICBtX3N6SGludExlbmd0aCA9IHN0ZDo6bWF4KHBIaW50U3RyZWFtUmFuZ2UtPkdldEludGVnZXJBdCgxKSwgMCk7CisgICAgY29uc3QgRlhfU0FGRV9VSU5UMzIgc2FmZV9oaW50X2xlbmd0aCA9IHBIaW50U3RyZWFtUmFuZ2UtPkdldEludGVnZXJBdCgxKTsKKyAgICBpZiAoc2FmZV9oaW50X2xlbmd0aC5Jc1ZhbGlkKCkpCisgICAgICBtX0hpbnRMZW5ndGggPSBzYWZlX2hpbnRfbGVuZ3RoLlZhbHVlT3JEaWUoKTsKICAgfQogfQogCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbGluZWFyaXplZF9oZWFkZXIuaCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9saW5lYXJpemVkX2hlYWRlci5oCmluZGV4IDBkNmQ3MjUuLjk2NGFlMjYgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9saW5lYXJpemVkX2hlYWRlci5oCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9saW5lYXJpemVkX2hlYWRlci5oCkBAIC0xNCw0MiArMTQsNDggQEAKIAogY2xhc3MgQ1BERl9EaWN0aW9uYXJ5OwogY2xhc3MgQ1BERl9PYmplY3Q7CitjbGFzcyBDUERGX1N5bnRheFBhcnNlcjsKIAogY2xhc3MgQ1BERl9MaW5lYXJpemVkSGVhZGVyIHsKICBwdWJsaWM6CiAgIH5DUERGX0xpbmVhcml6ZWRIZWFkZXIoKTsKLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0xpbmVhcml6ZWRIZWFkZXI+IENyZWF0ZUZvck9iamVjdCgKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gcE9iaik7CisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9MaW5lYXJpemVkSGVhZGVyPiBQYXJzZSgKKyAgICAgIENQREZfU3ludGF4UGFyc2VyKiBwYXJzZXIpOwogCiAgIC8vIFdpbGwgb25seSByZXR1cm4gdmFsdWVzID4gMC4KICAgRlhfRklMRVNJWkUgR2V0RmlsZVNpemUoKSBjb25zdCB7IHJldHVybiBtX3N6RmlsZVNpemU7IH0KICAgdWludDMyX3QgR2V0Rmlyc3RQYWdlTm8oKSBjb25zdCB7IHJldHVybiBtX2R3Rmlyc3RQYWdlTm87IH0KICAgLy8gV2lsbCBvbmx5IHJldHVybiB2YWx1ZXMgPiAwLgotICBGWF9GSUxFU0laRSBHZXRMYXN0WFJlZk9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1fc3pMYXN0WFJlZk9mZnNldDsgfQorICBGWF9GSUxFU0laRSBHZXRNYWluWFJlZlRhYmxlRmlyc3RFbnRyeU9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9zek1haW5YUmVmVGFibGVGaXJzdEVudHJ5T2Zmc2V0OworICB9CiAgIHVpbnQzMl90IEdldFBhZ2VDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fUGFnZUNvdW50OyB9CiAgIC8vIFdpbGwgb25seSByZXR1cm4gdmFsdWVzID4gMC4KICAgRlhfRklMRVNJWkUgR2V0Rmlyc3RQYWdlRW5kT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV9zekZpcnN0UGFnZUVuZE9mZnNldDsgfQogICAvLyBXaWxsIG9ubHkgcmV0dXJuIHZhbHVlcyA+IDAuCiAgIHVpbnQzMl90IEdldEZpcnN0UGFnZU9iak51bSgpIGNvbnN0IHsgcmV0dXJuIG1fRmlyc3RQYWdlT2JqTnVtOyB9CisgIC8vIFdpbGwgb25seSByZXR1cm4gdmFsdWVzID4gMC4KKyAgRlhfRklMRVNJWkUgR2V0TGFzdFhSZWZPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtX3N6TGFzdFhSZWZPZmZzZXQ7IH0KIAogICBib29sIEhhc0hpbnRUYWJsZSgpIGNvbnN0OwogICAvLyBXaWxsIG9ubHkgcmV0dXJuIHZhbHVlcyA+IDAuCiAgIEZYX0ZJTEVTSVpFIEdldEhpbnRTdGFydCgpIGNvbnN0IHsgcmV0dXJuIG1fc3pIaW50U3RhcnQ7IH0KLSAgLy8gV2lsbCBvbmx5IHJldHVybiB2YWx1ZXMgPiAwLgotICBGWF9GSUxFU0laRSBHZXRIaW50TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9zekhpbnRMZW5ndGg7IH0KKyAgdWludDMyX3QgR2V0SGludExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fSGludExlbmd0aDsgfQogCiAgcHJvdGVjdGVkOgotICBleHBsaWNpdCBDUERGX0xpbmVhcml6ZWRIZWFkZXIoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CisgIENQREZfTGluZWFyaXplZEhlYWRlcihjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgc3pMYXN0WFJlZk9mZnNldCk7CiAKICBwcml2YXRlOgotICBGWF9GSUxFU0laRSBtX3N6RmlsZVNpemUgPSAwOwotICB1aW50MzJfdCBtX2R3Rmlyc3RQYWdlTm8gPSAwOwotICBGWF9GSUxFU0laRSBtX3N6TGFzdFhSZWZPZmZzZXQgPSAwOwotICB1aW50MzJfdCBtX1BhZ2VDb3VudCA9IDA7Ci0gIEZYX0ZJTEVTSVpFIG1fc3pGaXJzdFBhZ2VFbmRPZmZzZXQgPSAwOwotICB1aW50MzJfdCBtX0ZpcnN0UGFnZU9iak51bSA9IDA7CisgIGNvbnN0IEZYX0ZJTEVTSVpFIG1fc3pGaWxlU2l6ZTsKKyAgY29uc3QgdWludDMyX3QgbV9kd0ZpcnN0UGFnZU5vOworICBjb25zdCBGWF9GSUxFU0laRSBtX3N6TWFpblhSZWZUYWJsZUZpcnN0RW50cnlPZmZzZXQ7CisgIGNvbnN0IHVpbnQzMl90IG1fUGFnZUNvdW50OworICBjb25zdCBGWF9GSUxFU0laRSBtX3N6Rmlyc3RQYWdlRW5kT2Zmc2V0OworICBjb25zdCB1aW50MzJfdCBtX0ZpcnN0UGFnZU9iak51bTsKKyAgY29uc3QgRlhfRklMRVNJWkUgbV9zekxhc3RYUmVmT2Zmc2V0OwogICBGWF9GSUxFU0laRSBtX3N6SGludFN0YXJ0ID0gMDsKLSAgRlhfRklMRVNJWkUgbV9zekhpbnRMZW5ndGggPSAwOworICB1aW50MzJfdCBtX0hpbnRMZW5ndGggPSAwOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfUEFSU0VSX0NQREZfTElORUFSSVpFRF9IRUFERVJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9uYW1lLmNwcCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9uYW1lLmNwcAppbmRleCA1YmU2NGQzLi4wNjA3YTMwIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbmFtZS5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX25hbWUuY3BwCkBAIC03LDEwICs3LDEwIEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX25hbWUuaCIKIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJlYW0uaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKLUNQREZfTmFtZTo6Q1BERl9OYW1lKENGWF9XZWFrUHRyPENGWF9CeXRlU3RyaW5nUG9vbD4gcFBvb2wsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKQorQ1BERl9OYW1lOjpDUERGX05hbWUoV2Vha1B0cjxCeXRlU3RyaW5nUG9vbD4gcFBvb2wsIGNvbnN0IEJ5dGVTdHJpbmcmIHN0cikKICAgICA6IG1fTmFtZShzdHIpIHsKICAgaWYgKHBQb29sKQogICAgIG1fTmFtZSA9IHBQb29sLT5JbnRlcm4obV9OYW1lKTsKQEAgLTI2LDExICsyNiwxMSBAQAogICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfTmFtZT4obnVsbHB0ciwgbV9OYW1lKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9OYW1lOjpHZXRTdHJpbmcoKSBjb25zdCB7CitCeXRlU3RyaW5nIENQREZfTmFtZTo6R2V0U3RyaW5nKCkgY29uc3QgewogICByZXR1cm4gbV9OYW1lOwogfQogCi12b2lkIENQREZfTmFtZTo6U2V0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpIHsKK3ZvaWQgQ1BERl9OYW1lOjpTZXRTdHJpbmcoY29uc3QgQnl0ZVN0cmluZyYgc3RyKSB7CiAgIG1fTmFtZSA9IHN0cjsKIH0KIApAQCAtNDYsNiArNDYsMTEgQEAKICAgcmV0dXJuIHRoaXM7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQREZfTmFtZTo6R2V0VW5pY29kZVRleHQoKSBjb25zdCB7CitXaWRlU3RyaW5nIENQREZfTmFtZTo6R2V0VW5pY29kZVRleHQoKSBjb25zdCB7CiAgIHJldHVybiBQREZfRGVjb2RlVGV4dChtX05hbWUpOwogfQorCitib29sIENQREZfTmFtZTo6V3JpdGVUbyhJRlhfQXJjaGl2ZVN0cmVhbSogYXJjaGl2ZSkgY29uc3QgeworICByZXR1cm4gYXJjaGl2ZS0+V3JpdGVTdHJpbmcoIi8iKSAmJgorICAgICAgICAgYXJjaGl2ZS0+V3JpdGVTdHJpbmcoUERGX05hbWVFbmNvZGUoR2V0U3RyaW5nKCkpLkFzU3RyaW5nVmlldygpKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9uYW1lLmggYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbmFtZS5oCmluZGV4IDYxMzE4ZDQuLjg4MGMxMGEgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9uYW1lLmgKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX25hbWUuaApAQCAtMTAsMjYgKzEwLDI3IEBACiAjaW5jbHVkZSA8bWVtb3J5PgogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdC5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3N0cmluZ19wb29sX3RlbXBsYXRlLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfd2Vha19wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3N0cmluZ19wb29sX3RlbXBsYXRlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC93ZWFrX3B0ci5oIgogCiBjbGFzcyBDUERGX05hbWUgOiBwdWJsaWMgQ1BERl9PYmplY3QgewogIHB1YmxpYzoKLSAgQ1BERl9OYW1lKENGWF9XZWFrUHRyPENGWF9CeXRlU3RyaW5nUG9vbD4gcFBvb2wsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpOworICBDUERGX05hbWUoV2Vha1B0cjxCeXRlU3RyaW5nUG9vbD4gcFBvb2wsIGNvbnN0IEJ5dGVTdHJpbmcmIHN0cik7CiAgIH5DUERGX05hbWUoKSBvdmVycmlkZTsKIAogICAvLyBDUERGX09iamVjdDoKICAgVHlwZSBHZXRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gQ2xvbmUoKSBjb25zdCBvdmVycmlkZTsKLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0U3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIENGWF9XaWRlU3RyaW5nIEdldFVuaWNvZGVUZXh0KCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgU2V0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpIG92ZXJyaWRlOworICBCeXRlU3RyaW5nIEdldFN0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBXaWRlU3RyaW5nIEdldFVuaWNvZGVUZXh0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2V0U3RyaW5nKGNvbnN0IEJ5dGVTdHJpbmcmIHN0cikgb3ZlcnJpZGU7CiAgIGJvb2wgSXNOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CiAgIENQREZfTmFtZSogQXNOYW1lKCkgb3ZlcnJpZGU7CiAgIGNvbnN0IENQREZfTmFtZSogQXNOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgV3JpdGVUbyhJRlhfQXJjaGl2ZVN0cmVhbSogYXJjaGl2ZSkgY29uc3Qgb3ZlcnJpZGU7CiAKICBwcm90ZWN0ZWQ6Ci0gIENGWF9CeXRlU3RyaW5nIG1fTmFtZTsKKyAgQnl0ZVN0cmluZyBtX05hbWU7CiB9OwogCiBpbmxpbmUgQ1BERl9OYW1lKiBUb05hbWUoQ1BERl9PYmplY3QqIG9iaikgewpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bGwuY3BwIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bGwuY3BwCmluZGV4IDQxNDc4ZDcuLjEwNzRlZmQgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9udWxsLmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbnVsbC5jcHAKQEAgLTUsNiArNSw3IEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bGwuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmVhbS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAogQ1BERl9OdWxsOjpDUERGX051bGwoKSB7fQpAQCAtMTYsMyArMTcsMTEgQEAKIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gQ1BERl9OdWxsOjpDbG9uZSgpIGNvbnN0IHsKICAgcmV0dXJuIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX051bGw+KCk7CiB9CisKK2Jvb2wgQ1BERl9OdWxsOjpXcml0ZVRvKElGWF9BcmNoaXZlU3RyZWFtKiBhcmNoaXZlKSBjb25zdCB7CisgIHJldHVybiBhcmNoaXZlLT5Xcml0ZVN0cmluZygiIG51bGwiKTsKK30KKworYm9vbCBDUERGX051bGw6OklzTnVsbCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbnVsbC5oIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bGwuaAppbmRleCA0Zjg0MjBmLi4yZWMwNWVjIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbnVsbC5oCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9udWxsLmgKQEAgLTE4LDYgKzE4LDggQEAKICAgLy8gQ1BERl9PYmplY3QuCiAgIFR5cGUgR2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IENsb25lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgV3JpdGVUbyhJRlhfQXJjaGl2ZVN0cmVhbSogYXJjaGl2ZSkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgSXNOdWxsKCkgY29uc3Qgb3ZlcnJpZGU7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9QQVJTRVJfQ1BERl9OVUxMX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbnVtYmVyLmNwcCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9udW1iZXIuY3BwCmluZGV4IDI0ZmViMmEuLmRhYzFmNDAgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9udW1iZXIuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9udW1iZXIuY3BwCkBAIC01LDE1ICs1LDE2IEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bWJlci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyZWFtLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogCiBDUERGX051bWJlcjo6Q1BERl9OdW1iZXIoKSA6IG1fYkludGVnZXIodHJ1ZSksIG1fSW50ZWdlcigwKSB7fQogCiBDUERGX051bWJlcjo6Q1BERl9OdW1iZXIoaW50IHZhbHVlKSA6IG1fYkludGVnZXIodHJ1ZSksIG1fSW50ZWdlcih2YWx1ZSkge30KIAotQ1BERl9OdW1iZXI6OkNQREZfTnVtYmVyKEZYX0ZMT0FUIHZhbHVlKSA6IG1fYkludGVnZXIoZmFsc2UpLCBtX0Zsb2F0KHZhbHVlKSB7fQorQ1BERl9OdW1iZXI6OkNQREZfTnVtYmVyKGZsb2F0IHZhbHVlKSA6IG1fYkludGVnZXIoZmFsc2UpLCBtX0Zsb2F0KHZhbHVlKSB7fQogCi1DUERGX051bWJlcjo6Q1BERl9OdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpCitDUERGX051bWJlcjo6Q1BERl9OdW1iZXIoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN0cikKICAgICA6IG1fYkludGVnZXIoRlhfYXRvbnVtKHN0ciwgJm1fSW50ZWdlcikpIHt9CiAKIENQREZfTnVtYmVyOjp+Q1BERl9OdW1iZXIoKSB7fQpAQCAtMjcsOCArMjgsOCBAQAogICAgICAgICAgICAgICAgICAgICA6IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX051bWJlcj4obV9GbG9hdCk7CiB9CiAKLUZYX0ZMT0FUIENQREZfTnVtYmVyOjpHZXROdW1iZXIoKSBjb25zdCB7Ci0gIHJldHVybiBtX2JJbnRlZ2VyID8gc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KG1fSW50ZWdlcikgOiBtX0Zsb2F0OworZmxvYXQgQ1BERl9OdW1iZXI6OkdldE51bWJlcigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYkludGVnZXIgPyBzdGF0aWNfY2FzdDxmbG9hdD4obV9JbnRlZ2VyKSA6IG1fRmxvYXQ7CiB9CiAKIGludCBDUERGX051bWJlcjo6R2V0SW50ZWdlcigpIGNvbnN0IHsKQEAgLTQ3LDExICs0OCwxNiBAQAogICByZXR1cm4gdGhpczsKIH0KIAotdm9pZCBDUERGX051bWJlcjo6U2V0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpIHsKLSAgbV9iSW50ZWdlciA9IEZYX2F0b251bShzdHIuQXNTdHJpbmdDKCksICZtX0ludGVnZXIpOwordm9pZCBDUERGX051bWJlcjo6U2V0U3RyaW5nKGNvbnN0IEJ5dGVTdHJpbmcmIHN0cikgeworICBtX2JJbnRlZ2VyID0gRlhfYXRvbnVtKHN0ci5Bc1N0cmluZ1ZpZXcoKSwgJm1fSW50ZWdlcik7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQREZfTnVtYmVyOjpHZXRTdHJpbmcoKSBjb25zdCB7Ci0gIHJldHVybiBtX2JJbnRlZ2VyID8gQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdEludGVnZXIobV9JbnRlZ2VyLCBGWEZPUk1BVF9TSUdORUQpCi0gICAgICAgICAgICAgICAgICAgIDogQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdEZsb2F0KG1fRmxvYXQpOworQnl0ZVN0cmluZyBDUERGX051bWJlcjo6R2V0U3RyaW5nKCkgY29uc3QgeworICByZXR1cm4gbV9iSW50ZWdlciA/IEJ5dGVTdHJpbmc6OkZvcm1hdEludGVnZXIobV9JbnRlZ2VyKQorICAgICAgICAgICAgICAgICAgICA6IEJ5dGVTdHJpbmc6OkZvcm1hdEZsb2F0KG1fRmxvYXQpOworfQorCitib29sIENQREZfTnVtYmVyOjpXcml0ZVRvKElGWF9BcmNoaXZlU3RyZWFtKiBhcmNoaXZlKSBjb25zdCB7CisgIHJldHVybiBhcmNoaXZlLT5Xcml0ZVN0cmluZygiICIpICYmCisgICAgICAgICBhcmNoaXZlLT5Xcml0ZVN0cmluZyhHZXRTdHJpbmcoKS5Bc1N0cmluZ1ZpZXcoKSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbnVtYmVyLmggYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbnVtYmVyLmgKaW5kZXggODVhNzhlNS4uNjYxMTc3MyAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bWJlci5oCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9udW1iZXIuaApAQCAtMTcsMjAgKzE3LDIxIEBACiAgcHVibGljOgogICBDUERGX051bWJlcigpOwogICBleHBsaWNpdCBDUERGX051bWJlcihpbnQgdmFsdWUpOwotICBleHBsaWNpdCBDUERGX051bWJlcihGWF9GTE9BVCB2YWx1ZSk7Ci0gIGV4cGxpY2l0IENQREZfTnVtYmVyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKTsKKyAgZXhwbGljaXQgQ1BERl9OdW1iZXIoZmxvYXQgdmFsdWUpOworICBleHBsaWNpdCBDUERGX051bWJlcihjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyKTsKICAgfkNQREZfTnVtYmVyKCkgb3ZlcnJpZGU7CiAKICAgLy8gQ1BERl9PYmplY3Q6CiAgIFR5cGUgR2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IENsb25lKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIENGWF9CeXRlU3RyaW5nIEdldFN0cmluZygpIGNvbnN0IG92ZXJyaWRlOwotICBGWF9GTE9BVCBHZXROdW1iZXIoKSBjb25zdCBvdmVycmlkZTsKKyAgQnl0ZVN0cmluZyBHZXRTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgZmxvYXQgR2V0TnVtYmVyKCkgY29uc3Qgb3ZlcnJpZGU7CiAgIGludCBHZXRJbnRlZ2VyKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgU2V0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpIG92ZXJyaWRlOworICB2b2lkIFNldFN0cmluZyhjb25zdCBCeXRlU3RyaW5nJiBzdHIpIG92ZXJyaWRlOwogICBib29sIElzTnVtYmVyKCkgY29uc3Qgb3ZlcnJpZGU7CiAgIENQREZfTnVtYmVyKiBBc051bWJlcigpIG92ZXJyaWRlOwogICBjb25zdCBDUERGX051bWJlciogQXNOdW1iZXIoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBXcml0ZVRvKElGWF9BcmNoaXZlU3RyZWFtKiBhcmNoaXZlKSBjb25zdCBvdmVycmlkZTsKIAogICBib29sIElzSW50ZWdlcigpIGNvbnN0IHsgcmV0dXJuIG1fYkludGVnZXI7IH0KIApAQCAtMzgsNyArMzksNyBAQAogICBib29sIG1fYkludGVnZXI7CiAgIHVuaW9uIHsKICAgICBpbnQgbV9JbnRlZ2VyOwotICAgIEZYX0ZMT0FUIG1fRmxvYXQ7CisgICAgZmxvYXQgbV9GbG9hdDsKICAgfTsKIH07CiAKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3QuY3BwIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdC5jcHAKaW5kZXggYWNkYTMzNC4uNjc2MzJhMCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdC5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdC5jcHAKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGUuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKIAogQ1BERl9PYmplY3Q6On5DUERGX09iamVjdCgpIHt9CkBAIC0zOCwxNSArMzksMTUgQEAKICAgcmV0dXJuIENsb25lKCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQREZfT2JqZWN0OjpHZXRTdHJpbmcoKSBjb25zdCB7Ci0gIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworQnl0ZVN0cmluZyBDUERGX09iamVjdDo6R2V0U3RyaW5nKCkgY29uc3QgeworICByZXR1cm4gQnl0ZVN0cmluZygpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUERGX09iamVjdDo6R2V0VW5pY29kZVRleHQoKSBjb25zdCB7Ci0gIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworV2lkZVN0cmluZyBDUERGX09iamVjdDo6R2V0VW5pY29kZVRleHQoKSBjb25zdCB7CisgIHJldHVybiBXaWRlU3RyaW5nKCk7CiB9CiAKLUZYX0ZMT0FUIENQREZfT2JqZWN0OjpHZXROdW1iZXIoKSBjb25zdCB7CitmbG9hdCBDUERGX09iamVjdDo6R2V0TnVtYmVyKCkgY29uc3QgewogICByZXR1cm4gMDsKIH0KIApAQCAtNTgsOCArNTksOCBAQAogICByZXR1cm4gbnVsbHB0cjsKIH0KIAotdm9pZCBDUERGX09iamVjdDo6U2V0U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpIHsKLSAgQVNTRVJUKGZhbHNlKTsKK3ZvaWQgQ1BERl9PYmplY3Q6OlNldFN0cmluZyhjb25zdCBCeXRlU3RyaW5nJiBzdHIpIHsKKyAgTk9UUkVBQ0hFRCgpOwogfQogCiBib29sIENQREZfT2JqZWN0OjpJc0FycmF5KCkgY29uc3QgewpAQCAtOTQsNiArOTUsMTAgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIENQREZfT2JqZWN0OjpJc051bGwoKSBjb25zdCB7CisgIHJldHVybiBmYWxzZTsKK30KKwogQ1BERl9BcnJheSogQ1BERl9PYmplY3Q6OkFzQXJyYXkoKSB7CiAgIHJldHVybiBudWxscHRyOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdC5oIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdC5oCmluZGV4IGY2YmM1YjQuLjdhMTQ0OTIgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3QuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfb2JqZWN0LmgKQEAgLTIzLDYgKzIzLDcgQEAKIGNsYXNzIENQREZfUmVmZXJlbmNlOwogY2xhc3MgQ1BERl9TdHJlYW07CiBjbGFzcyBDUERGX1N0cmluZzsKK2NsYXNzIElGWF9BcmNoaXZlU3RyZWFtOwogCiBjbGFzcyBDUERGX09iamVjdCB7CiAgcHVibGljOgpAQCAtNDMsNyArNDQsOSBAQAogCiAgIHZpcnR1YWwgVHlwZSBHZXRUeXBlKCkgY29uc3QgPSAwOwogICB1aW50MzJfdCBHZXRPYmpOdW0oKSBjb25zdCB7IHJldHVybiBtX09iak51bTsgfQorICB2b2lkIFNldE9iak51bSh1aW50MzJfdCBvYmpudW0pIHsgbV9PYmpOdW0gPSBvYmpudW07IH0KICAgdWludDMyX3QgR2V0R2VuTnVtKCkgY29uc3QgeyByZXR1cm4gbV9HZW5OdW07IH0KKyAgdm9pZCBTZXRHZW5OdW0odWludDMyX3QgZ2VubnVtKSB7IG1fR2VuTnVtID0gZ2VubnVtOyB9CiAgIGJvb2wgSXNJbmxpbmUoKSBjb25zdCB7IHJldHVybiBtX09iak51bSA9PSAwOyB9CiAKICAgLy8gQ3JlYXRlIGEgZGVlcCBjb3B5IG9mIHRoZSBvYmplY3QuCkBAIC01NCwxMyArNTcsMTMgQEAKICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IENsb25lRGlyZWN0T2JqZWN0KCkgY29uc3Q7CiAKICAgdmlydHVhbCBDUERGX09iamVjdCogR2V0RGlyZWN0KCkgY29uc3Q7Ci0gIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0U3RyaW5nKCkgY29uc3Q7Ci0gIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0VW5pY29kZVRleHQoKSBjb25zdDsKLSAgdmlydHVhbCBGWF9GTE9BVCBHZXROdW1iZXIoKSBjb25zdDsKKyAgdmlydHVhbCBCeXRlU3RyaW5nIEdldFN0cmluZygpIGNvbnN0OworICB2aXJ0dWFsIFdpZGVTdHJpbmcgR2V0VW5pY29kZVRleHQoKSBjb25zdDsKKyAgdmlydHVhbCBmbG9hdCBHZXROdW1iZXIoKSBjb25zdDsKICAgdmlydHVhbCBpbnQgR2V0SW50ZWdlcigpIGNvbnN0OwogICB2aXJ0dWFsIENQREZfRGljdGlvbmFyeSogR2V0RGljdCgpIGNvbnN0OwogCi0gIHZpcnR1YWwgdm9pZCBTZXRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cik7CisgIHZpcnR1YWwgdm9pZCBTZXRTdHJpbmcoY29uc3QgQnl0ZVN0cmluZyYgc3RyKTsKIAogICB2aXJ0dWFsIGJvb2wgSXNBcnJheSgpIGNvbnN0OwogICB2aXJ0dWFsIGJvb2wgSXNCb29sZWFuKCkgY29uc3Q7CkBAIC03MCw2ICs3Myw3IEBACiAgIHZpcnR1YWwgYm9vbCBJc1JlZmVyZW5jZSgpIGNvbnN0OwogICB2aXJ0dWFsIGJvb2wgSXNTdHJlYW0oKSBjb25zdDsKICAgdmlydHVhbCBib29sIElzU3RyaW5nKCkgY29uc3Q7CisgIHZpcnR1YWwgYm9vbCBJc051bGwoKSBjb25zdDsKIAogICB2aXJ0dWFsIENQREZfQXJyYXkqIEFzQXJyYXkoKTsKICAgdmlydHVhbCBjb25zdCBDUERGX0FycmF5KiBBc0FycmF5KCkgY29uc3Q7CkBAIC04OCwxNyArOTIsNyBAQAogICB2aXJ0dWFsIENQREZfU3RyaW5nKiBBc1N0cmluZygpOwogICB2aXJ0dWFsIGNvbnN0IENQREZfU3RyaW5nKiBBc1N0cmluZygpIGNvbnN0OwogCi0gcHJvdGVjdGVkOgotICBmcmllbmQgY2xhc3MgQ1BERl9BcnJheTsKLSAgZnJpZW5kIGNsYXNzIENQREZfRGljdGlvbmFyeTsKLSAgZnJpZW5kIGNsYXNzIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXI7Ci0gIGZyaWVuZCBjbGFzcyBDUERGX1BhcnNlcjsKLSAgZnJpZW5kIGNsYXNzIENQREZfUmVmZXJlbmNlOwotICBmcmllbmQgY2xhc3MgQ1BERl9TdHJlYW07Ci0KLSAgQ1BERl9PYmplY3QoKSA6IG1fT2JqTnVtKDApLCBtX0dlbk51bSgwKSB7fQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gQ2xvbmVPYmplY3ROb25DeWNsaWMoYm9vbCBiRGlyZWN0KSBjb25zdDsKKyAgdmlydHVhbCBib29sIFdyaXRlVG8oSUZYX0FyY2hpdmVTdHJlYW0qIGFyY2hpdmUpIGNvbnN0ID0gMDsKIAogICAvLyBDcmVhdGUgYSBkZWVwIGNvcHkgb2YgdGhlIG9iamVjdCB3aXRoIHRoZSBvcHRpb24gdG8gZWl0aGVyCiAgIC8vIGNvcHkgYSByZWZlcmVuY2Ugb2JqZWN0IG9yIGRpcmVjdGx5IGNvcHkgdGhlIG9iamVjdCBpdCByZWZlcnMgdG8KQEAgLTExMCwxMSArMTA0LDE3IEBACiAgICAgICBib29sIGJEaXJlY3QsCiAgICAgICBzdGQ6OnNldDxjb25zdCBDUERGX09iamVjdCo+KiBwVmlzaXRlZCkgY29uc3Q7CiAKKyBwcm90ZWN0ZWQ6CisgIENQREZfT2JqZWN0KCkgOiBtX09iak51bSgwKSwgbV9HZW5OdW0oMCkge30KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IENsb25lT2JqZWN0Tm9uQ3ljbGljKGJvb2wgYkRpcmVjdCkgY29uc3Q7CisKICAgdWludDMyX3QgbV9PYmpOdW07Ci0gIHVpbnQzMl90IG1fR2VuTnVtOwogCiAgcHJpdmF0ZToKICAgQ1BERl9PYmplY3QoY29uc3QgQ1BERl9PYmplY3QmIHNyYykge30KKworICB1aW50MzJfdCBtX0dlbk51bTsKIH07CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdF9hdmFpbC5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfb2JqZWN0X2F2YWlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWU3ZjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdF9hdmFpbC5jcHAKQEAgLTAsMCArMSwxNDggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3RfYXZhaWwuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9pbmRpcmVjdF9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdF93YWxrZXIuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVhZF92YWxpZGF0b3IuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVmZXJlbmNlLmgiCisKK0NQREZfT2JqZWN0QXZhaWw6OkNQREZfT2JqZWN0QXZhaWwoQ1BERl9SZWFkVmFsaWRhdG9yKiB2YWxpZGF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIGhvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9PYmplY3QqIHJvb3QpCisgICAgOiB2YWxpZGF0b3JfKHZhbGlkYXRvciksIGhvbGRlcl8oaG9sZGVyKSwgcm9vdF8ocm9vdCkgeworICBBU1NFUlQodmFsaWRhdG9yXyk7CisgIEFTU0VSVChob2xkZXIpOworICBBU1NFUlQocm9vdF8pOworICBpZiAoIXJvb3RfLT5Jc0lubGluZSgpKQorICAgIHBhcnNlZF9vYmpudW1zXy5pbnNlcnQocm9vdF8tPkdldE9iak51bSgpKTsKK30KKworQ1BERl9PYmplY3RBdmFpbDo6Q1BERl9PYmplY3RBdmFpbChDUERGX1JlYWRWYWxpZGF0b3IqIHZhbGlkYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciogaG9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvYmpfbnVtKQorICAgIDogdmFsaWRhdG9yXyh2YWxpZGF0b3IpLAorICAgICAgaG9sZGVyXyhob2xkZXIpLAorICAgICAgcm9vdF8ocGRmaXVtOjpNYWtlVW5pcXVlPENQREZfUmVmZXJlbmNlPihob2xkZXIsIG9ial9udW0pKSB7CisgIEFTU0VSVCh2YWxpZGF0b3JfKTsKKyAgQVNTRVJUKGhvbGRlcik7Cit9CisKK0NQREZfT2JqZWN0QXZhaWw6On5DUERGX09iamVjdEF2YWlsKCkge30KKworQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzIENQREZfT2JqZWN0QXZhaWw6OkNoZWNrQXZhaWwoKSB7CisgIGlmICghTG9hZFJvb3RPYmplY3QoKSkKKyAgICByZXR1cm4gQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzOjpEYXRhTm90QXZhaWxhYmxlOworCisgIGlmIChDaGVja09iamVjdHMoKSkgeworICAgIENsZWFuTWVtb3J5KCk7CisgICAgcmV0dXJuIENQREZfRGF0YUF2YWlsOjpEb2NBdmFpbFN0YXR1czo6RGF0YUF2YWlsYWJsZTsKKyAgfQorICByZXR1cm4gQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzOjpEYXRhTm90QXZhaWxhYmxlOworfQorCitib29sIENQREZfT2JqZWN0QXZhaWw6OkxvYWRSb290T2JqZWN0KCkgeworICBpZiAoIW5vbl9wYXJzZWRfb2JqZWN0c18uZW1wdHkoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICB3aGlsZSAocm9vdF8gJiYgcm9vdF8tPklzUmVmZXJlbmNlKCkpIHsKKyAgICBjb25zdCB1aW50MzJfdCByZWZfb2JqX251bSA9IHJvb3RfLT5Bc1JlZmVyZW5jZSgpLT5HZXRSZWZPYmpOdW0oKTsKKyAgICBpZiAoSGFzT2JqZWN0UGFyc2VkKHJlZl9vYmpfbnVtKSkgeworICAgICAgcm9vdF8gPSBudWxscHRyOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgY29uc3QgQ1BERl9SZWFkVmFsaWRhdG9yOjpTZXNzaW9uIHBhcnNlX3Nlc3Npb24odmFsaWRhdG9yXy5HZXQoKSk7CisgICAgY29uc3QgQ1BERl9PYmplY3QqIGRpcmVjdCA9IGhvbGRlcl8tPkdldE9yUGFyc2VJbmRpcmVjdE9iamVjdChyZWZfb2JqX251bSk7CisgICAgaWYgKHZhbGlkYXRvcl8tPmhhc19yZWFkX3Byb2JsZW1zKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBwYXJzZWRfb2JqbnVtc18uaW5zZXJ0KHJlZl9vYmpfbnVtKTsKKyAgICByb290XyA9IGRpcmVjdDsKKyAgfQorICBzdGQ6OnN0YWNrPHVpbnQzMl90PiBub25fcGFyc2VkX29iamVjdHNfaW5fcm9vdDsKKyAgaWYgKEFwcGVuZE9iamVjdFN1YlJlZnMocm9vdF8uR2V0KCksICZub25fcGFyc2VkX29iamVjdHNfaW5fcm9vdCkpIHsKKyAgICBub25fcGFyc2VkX29iamVjdHNfID0gc3RkOjptb3ZlKG5vbl9wYXJzZWRfb2JqZWN0c19pbl9yb290KTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1BERl9PYmplY3RBdmFpbDo6Q2hlY2tPYmplY3RzKCkgeworICBzdGQ6OnN0YWNrPHVpbnQzMl90PiBvYmplY3RzX3RvX2NoZWNrID0gc3RkOjptb3ZlKG5vbl9wYXJzZWRfb2JqZWN0c18pOworICBzdGQ6OnNldDx1aW50MzJfdD4gY2hlY2tlZF9vYmplY3RzOworICB3aGlsZSAoIW9iamVjdHNfdG9fY2hlY2suZW1wdHkoKSkgeworICAgIGNvbnN0IHVpbnQzMl90IG9ial9udW0gPSBvYmplY3RzX3RvX2NoZWNrLnRvcCgpOworICAgIG9iamVjdHNfdG9fY2hlY2sucG9wKCk7CisKKyAgICBpZiAoSGFzT2JqZWN0UGFyc2VkKG9ial9udW0pKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoIWNoZWNrZWRfb2JqZWN0cy5pbnNlcnQob2JqX251bSkuc2Vjb25kKQorICAgICAgY29udGludWU7CisKKyAgICBjb25zdCBDUERGX1JlYWRWYWxpZGF0b3I6OlNlc3Npb24gcGFyc2Vfc2Vzc2lvbih2YWxpZGF0b3JfLkdldCgpKTsKKyAgICBjb25zdCBDUERGX09iamVjdCogZGlyZWN0ID0gaG9sZGVyXy0+R2V0T3JQYXJzZUluZGlyZWN0T2JqZWN0KG9ial9udW0pOworICAgIGlmIChkaXJlY3QgPT0gcm9vdF8uR2V0KCkpCisgICAgICBjb250aW51ZTsKKworICAgIGlmICh2YWxpZGF0b3JfLT5oYXNfcmVhZF9wcm9ibGVtcygpIHx8CisgICAgICAgICFBcHBlbmRPYmplY3RTdWJSZWZzKGRpcmVjdCwgJm9iamVjdHNfdG9fY2hlY2spKSB7CisgICAgICBub25fcGFyc2VkX29iamVjdHNfLnB1c2gob2JqX251bSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgcGFyc2VkX29iam51bXNfLmluc2VydChvYmpfbnVtKTsKKyAgfQorICByZXR1cm4gbm9uX3BhcnNlZF9vYmplY3RzXy5lbXB0eSgpOworfQorCitib29sIENQREZfT2JqZWN0QXZhaWw6OkFwcGVuZE9iamVjdFN1YlJlZnMoY29uc3QgQ1BERl9PYmplY3QqIG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0YWNrPHVpbnQzMl90PiogcmVmcykgY29uc3QgeworICBBU1NFUlQocmVmcyk7CisgIGlmICghb2JqZWN0KQorICAgIHJldHVybiB0cnVlOworCisgIENQREZfT2JqZWN0V2Fsa2VyIHdhbGtlcihvYmplY3QpOworICB3aGlsZSAoY29uc3QgQ1BERl9PYmplY3QqIG9iaiA9IHdhbGtlci5HZXROZXh0KCkpIHsKKyAgICBjb25zdCBDUERGX1JlYWRWYWxpZGF0b3I6OlNlc3Npb24gcGFyc2Vfc2Vzc2lvbih2YWxpZGF0b3JfLkdldCgpKTsKKworICAgIC8vIFNraXAgaWYgdGhpcyBvYmplY3QgaWYgaXQncyBhbiBpbmxpbmVkIHJvb3QsIHRoZSBwYXJlbnQgb2JqZWN0IG9yCisgICAgLy8gZXhwbGljaXRpbHkgZXhjbHVkZWQuCisgICAgY29uc3QgYm9vbCBza2lwID0gKHdhbGtlci5HZXRQYXJlbnQoKSAmJiBvYmogPT0gcm9vdF8uR2V0KCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgd2Fsa2VyLmRpY3Rpb25hcnlfa2V5KCkgPT0gIlBhcmVudCIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAob2JqICE9IHJvb3RfLkdldCgpICYmIEV4Y2x1ZGVPYmplY3Qob2JqKSk7CisKKyAgICAvLyBXZSBuZWVkIHRvIHBhcnNlIHRoZSBvYmplY3QgYmVmb3JlIHdlIGNhbiBkbyB0aGUgZXhjbHVzaW9uIGNoZWNrLgorICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB0aGUgZXhjbHVzaW9uIGNoZWNrIG1heSBjaGVjayBhZ2FpbnN0IGEgcmVmZXJlbmNlZAorICAgIC8vIGZpZWxkIG9mIHRoZSBvYmplY3Qgd2hpY2ggd2UgbmVlZCB0byBtYWtlIHN1cmUgaXMgbG9hZGVkLgorICAgIGlmICh2YWxpZGF0b3JfLT5oYXNfcmVhZF9wcm9ibGVtcygpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHNraXApIHsKKyAgICAgIHdhbGtlci5Ta2lwV2Fsa0ludG9DdXJyZW50T2JqZWN0KCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAob2JqLT5Jc1JlZmVyZW5jZSgpKQorICAgICAgcmVmcy0+cHVzaChvYmotPkFzUmVmZXJlbmNlKCktPkdldFJlZk9iak51bSgpKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDUERGX09iamVjdEF2YWlsOjpDbGVhbk1lbW9yeSgpIHsKKyAgcm9vdF8uUmVzZXQoKTsKKyAgcGFyc2VkX29iam51bXNfLmNsZWFyKCk7Cit9CisKK2Jvb2wgQ1BERl9PYmplY3RBdmFpbDo6RXhjbHVkZU9iamVjdChjb25zdCBDUERGX09iamVjdCogb2JqZWN0KSBjb25zdCB7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDUERGX09iamVjdEF2YWlsOjpIYXNPYmplY3RQYXJzZWQodWludDMyX3Qgb2JqX251bSkgY29uc3QgeworICByZXR1cm4gcGFyc2VkX29iam51bXNfLmNvdW50KG9ial9udW0pID4gMDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3RfYXZhaWwuaCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3RfYXZhaWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTkzZWEyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdF9hdmFpbC5oCkBAIC0wLDAgKzEsNTMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBDT1JFX0ZQREZBUElfUEFSU0VSX0NQREZfT0JKRUNUX0FWQUlMX0hfCisjZGVmaW5lIENPUkVfRlBERkFQSV9QQVJTRVJfQ1BERl9PQkpFQ1RfQVZBSUxfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RhY2s+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGF0YV9hdmFpbC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvbWF5YmVfb3duZWQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisKK2NsYXNzIENQREZfT2JqZWN0OworY2xhc3MgQ1BERl9SZWZlcmVuY2U7CitjbGFzcyBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyOworY2xhc3MgQ1BERl9SZWFkVmFsaWRhdG9yOworCisvLyBIZWxwZXIgZm9yIGNoZWNrIGF2YWlsYWJpbGl0eSBvZiBvYmplY3QgdHJlZS4KK2NsYXNzIENQREZfT2JqZWN0QXZhaWwgeworIHB1YmxpYzoKKyAgQ1BERl9PYmplY3RBdmFpbChDUERGX1JlYWRWYWxpZGF0b3IqIHZhbGlkYXRvciwKKyAgICAgICAgICAgICAgICAgICBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBob2xkZXIsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9PYmplY3QqIHJvb3QpOworICBDUERGX09iamVjdEF2YWlsKENQREZfUmVhZFZhbGlkYXRvciogdmFsaWRhdG9yLAorICAgICAgICAgICAgICAgICAgIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIGhvbGRlciwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvYmpfbnVtKTsKKyAgdmlydHVhbCB+Q1BERl9PYmplY3RBdmFpbCgpOworCisgIENQREZfRGF0YUF2YWlsOjpEb2NBdmFpbFN0YXR1cyBDaGVja0F2YWlsKCk7CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgYm9vbCBFeGNsdWRlT2JqZWN0KGNvbnN0IENQREZfT2JqZWN0KiBvYmplY3QpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgYm9vbCBMb2FkUm9vdE9iamVjdCgpOworICBib29sIENoZWNrT2JqZWN0cygpOworICBib29sIEFwcGVuZE9iamVjdFN1YlJlZnMoY29uc3QgQ1BERl9PYmplY3QqIG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RhY2s8dWludDMyX3Q+KiByZWZzKSBjb25zdDsKKyAgdm9pZCBDbGVhbk1lbW9yeSgpOworICBib29sIEhhc09iamVjdFBhcnNlZCh1aW50MzJfdCBvYmpfbnVtKSBjb25zdDsKKworICBVbm93bmVkUHRyPENQREZfUmVhZFZhbGlkYXRvcj4gdmFsaWRhdG9yXzsKKyAgLy8gVE9ETyhhcnQtc25ha2UpOiBNYWtlIGl0IFVub3duZWRQdHI8LCBhZnRlciBmaXggZG9jdW1lbnQgb3duaW5nIGlzc3VlLgorICBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBob2xkZXJfOworICBNYXliZU93bmVkPGNvbnN0IENQREZfT2JqZWN0PiByb290XzsKKyAgc3RkOjpzZXQ8dWludDMyX3Q+IHBhcnNlZF9vYmpudW1zXzsKKyAgc3RkOjpzdGFjazx1aW50MzJfdD4gbm9uX3BhcnNlZF9vYmplY3RzXzsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GUERGQVBJX1BBUlNFUl9DUERGX09CSkVDVF9BVkFJTF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdF9hdmFpbF91bml0dGVzdC5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfb2JqZWN0X2F2YWlsX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzNkYTcwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdF9hdmFpbF91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwzNTAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3RfYXZhaWwuaCIKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfaW5kaXJlY3Rfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9yZWFkX3ZhbGlkYXRvci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9yZWZlcmVuY2UuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJlYW0uaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2Z4X3N0cmluZ190ZXN0aGVscGVycy5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY2xhc3MgVGVzdFJlYWRWYWxpZGF0b3IgOiBwdWJsaWMgQ1BERl9SZWFkVmFsaWRhdG9yIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgorICBmcmllbmQgUmV0YWluUHRyPFQ+IHBkZml1bTo6TWFrZVJldGFpbihBcmdzJiYuLi4gYXJncyk7CisKKyAgdm9pZCBTaW11bGF0ZVJlYWRFcnJvcigpIHsgUmVhZEJsb2NrKG51bGxwdHIsIDAsIDEpOyB9CisKKyBwcm90ZWN0ZWQ6CisgIFRlc3RSZWFkVmFsaWRhdG9yKCkKKyAgICAgIDogQ1BERl9SZWFkVmFsaWRhdG9yKAorICAgICAgICAgICAgcGRmaXVtOjpNYWtlUmV0YWluPENGWF9JbnZhbGlkU2Vla2FibGVSZWFkU3RyZWFtPigxMDApLAorICAgICAgICAgICAgbnVsbHB0cikge30KKyAgflRlc3RSZWFkVmFsaWRhdG9yKCkgb3ZlcnJpZGUge30KK307CisKK2NsYXNzIFRlc3RIb2xkZXIgOiBwdWJsaWMgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciB7CisgcHVibGljOgorICBlbnVtIGNsYXNzIE9iamVjdFN0YXRlIHsKKyAgICBVbmF2YWlsYWJsZSwKKyAgICBBdmFpbGFibGUsCisgIH07CisgIFRlc3RIb2xkZXIoKSA6IHZhbGlkYXRvcl8ocGRmaXVtOjpNYWtlUmV0YWluPFRlc3RSZWFkVmFsaWRhdG9yPigpKSB7fQorICB+VGVzdEhvbGRlcigpIG92ZXJyaWRlIHt9CisKKyAgLy8gQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciBvdmVycmlkZXM6CisgIENQREZfT2JqZWN0KiBHZXRPclBhcnNlSW5kaXJlY3RPYmplY3QodWludDMyX3Qgb2JqbnVtKSBvdmVycmlkZSB7CisgICAgYXV0byBpdCA9IG9iamVjdHNfZGF0YV8uZmluZChvYmpudW0pOworICAgIGlmIChpdCA9PSBvYmplY3RzX2RhdGFfLmVuZCgpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBPYmplY3REYXRhJiBvYmpfZGF0YSA9IGl0LT5zZWNvbmQ7CisgICAgaWYgKG9ial9kYXRhLnN0YXRlID09IE9iamVjdFN0YXRlOjpVbmF2YWlsYWJsZSkgeworICAgICAgdmFsaWRhdG9yXy0+U2ltdWxhdGVSZWFkRXJyb3IoKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gb2JqX2RhdGEub2JqZWN0LmdldCgpOworICB9CisKKyAgUmV0YWluUHRyPENQREZfUmVhZFZhbGlkYXRvcj4gR2V0VmFsaWRhdG9yKCkgeyByZXR1cm4gdmFsaWRhdG9yXzsgfQorCisgIHZvaWQgQWRkT2JqZWN0KHVpbnQzMl90IG9iam51bSwKKyAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBvYmplY3QsCisgICAgICAgICAgICAgICAgIE9iamVjdFN0YXRlIHN0YXRlKSB7CisgICAgT2JqZWN0RGF0YSBvYmplY3RfZGF0YTsKKyAgICBvYmplY3RfZGF0YS5vYmplY3QgPSBzdGQ6Om1vdmUob2JqZWN0KTsKKyAgICBvYmplY3RfZGF0YS5zdGF0ZSA9IHN0YXRlOworICAgIEFTU0VSVChvYmplY3RzX2RhdGFfLmZpbmQob2JqbnVtKSA9PSBvYmplY3RzX2RhdGFfLmVuZCgpKTsKKyAgICBvYmplY3RzX2RhdGFfW29iam51bV0gPSBzdGQ6Om1vdmUob2JqZWN0X2RhdGEpOworICB9CisKKyAgdm9pZCBTZXRPYmplY3RTdGF0ZSh1aW50MzJfdCBvYmpudW0sIE9iamVjdFN0YXRlIHN0YXRlKSB7CisgICAgYXV0byBpdCA9IG9iamVjdHNfZGF0YV8uZmluZChvYmpudW0pOworICAgIEFTU0VSVChpdCAhPSBvYmplY3RzX2RhdGFfLmVuZCgpKTsKKyAgICBPYmplY3REYXRhJiBvYmpfZGF0YSA9IGl0LT5zZWNvbmQ7CisgICAgb2JqX2RhdGEuc3RhdGUgPSBzdGF0ZTsKKyAgfQorCisgIENQREZfT2JqZWN0KiBHZXRUZXN0T2JqZWN0KHVpbnQzMl90IG9iam51bSkgeworICAgIGF1dG8gaXQgPSBvYmplY3RzX2RhdGFfLmZpbmQob2JqbnVtKTsKKyAgICBpZiAoaXQgPT0gb2JqZWN0c19kYXRhXy5lbmQoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBpdC0+c2Vjb25kLm9iamVjdC5nZXQoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RydWN0IE9iamVjdERhdGEgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gb2JqZWN0OworICAgIE9iamVjdFN0YXRlIHN0YXRlID0gT2JqZWN0U3RhdGU6OlVuYXZhaWxhYmxlOworICB9OworICBzdGQ6Om1hcDx1aW50MzJfdCwgT2JqZWN0RGF0YT4gb2JqZWN0c19kYXRhXzsKKyAgUmV0YWluUHRyPFRlc3RSZWFkVmFsaWRhdG9yPiB2YWxpZGF0b3JfOworfTsKKworY2xhc3MgQ1BERl9PYmplY3RBdmFpbEZhaWxPbkV4Y2x1ZGUgOiBwdWJsaWMgQ1BERl9PYmplY3RBdmFpbCB7CisgcHVibGljOgorICB1c2luZyBDUERGX09iamVjdEF2YWlsOjpDUERGX09iamVjdEF2YWlsOworICB+Q1BERl9PYmplY3RBdmFpbEZhaWxPbkV4Y2x1ZGUoKSBvdmVycmlkZSB7fQorICBib29sIEV4Y2x1ZGVPYmplY3QoY29uc3QgQ1BERl9PYmplY3QqIG9iamVjdCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK2NsYXNzIENQREZfT2JqZWN0QXZhaWxFeGNsdWRlQXJyYXkgOiBwdWJsaWMgQ1BERl9PYmplY3RBdmFpbCB7CisgcHVibGljOgorICB1c2luZyBDUERGX09iamVjdEF2YWlsOjpDUERGX09iamVjdEF2YWlsOworICB+Q1BERl9PYmplY3RBdmFpbEV4Y2x1ZGVBcnJheSgpIG92ZXJyaWRlIHt9CisgIGJvb2wgRXhjbHVkZU9iamVjdChjb25zdCBDUERGX09iamVjdCogb2JqZWN0KSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIG9iamVjdC0+SXNBcnJheSgpOworICB9Cit9OworCitjbGFzcyBDUERGX09iamVjdEF2YWlsRXhjbHVkZVR5cGVLZXkgOiBwdWJsaWMgQ1BERl9PYmplY3RBdmFpbCB7CisgcHVibGljOgorICB1c2luZyBDUERGX09iamVjdEF2YWlsOjpDUERGX09iamVjdEF2YWlsOworICB+Q1BERl9PYmplY3RBdmFpbEV4Y2x1ZGVUeXBlS2V5KCkgb3ZlcnJpZGUge30KKyAgYm9vbCBFeGNsdWRlT2JqZWN0KGNvbnN0IENQREZfT2JqZWN0KiBvYmplY3QpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAvLyBUaGUgdmFsdWUgb2YgIlR5cGUiIG1heSBiZSByZWZlcmVuY2UsIGFuZCBpZiBpdCBpcyBub3QgYXZhaWxhYmxlLCB3ZSBjYW4KKyAgICAvLyBpbmNvcnJlY3QgZmlsdGVyIG9iamVjdHMuCisgICAgLy8gSW4gdGhpcyBjYXNlIENQREZfT2JqZWN0QXZhaWwgc2hvdWxkIHdhaXQgYXZhaWxhYmlsaXR5IG9mIHRoaXMgaXRlbSBhbmQKKyAgICAvLyBjYWxsIEV4Y2x1ZGVPYmplY3QgYWdhaW4uCisgICAgcmV0dXJuIG9iamVjdC0+SXNEaWN0aW9uYXJ5KCkgJiYKKyAgICAgICAgICAgb2JqZWN0LT5HZXREaWN0KCktPkdldFN0cmluZ0ZvcigiVHlwZSIpID09ICJFeGNsdWRlIG1lIjsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK1RFU1QoQ1BERl9PYmplY3RBdmFpbFRlc3QsIE9uZU9iamVjdCkgeworICBUZXN0SG9sZGVyIGhvbGRlcjsKKyAgaG9sZGVyLkFkZE9iamVjdCgxLCBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJpbmc+KG51bGxwdHIsICJzdHJpbmciLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgVGVzdEhvbGRlcjo6T2JqZWN0U3RhdGU6OlVuYXZhaWxhYmxlKTsKKyAgQ1BERl9PYmplY3RBdmFpbCBhdmFpbChob2xkZXIuR2V0VmFsaWRhdG9yKCkuR2V0KCksICZob2xkZXIsIDEpOworICBFWFBFQ1RfRVEoQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzOjpEYXRhTm90QXZhaWxhYmxlLAorICAgICAgICAgICAgYXZhaWwuQ2hlY2tBdmFpbCgpKTsKKyAgaG9sZGVyLlNldE9iamVjdFN0YXRlKDEsIFRlc3RIb2xkZXI6Ok9iamVjdFN0YXRlOjpBdmFpbGFibGUpOworICBFWFBFQ1RfRVEoQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzOjpEYXRhQXZhaWxhYmxlLCBhdmFpbC5DaGVja0F2YWlsKCkpOworfQorCitURVNUKENQREZfT2JqZWN0QXZhaWxUZXN0LCBPbmVSZWZlcmVuY2VkT2JqZWN0KSB7CisgIFRlc3RIb2xkZXIgaG9sZGVyOworICBob2xkZXIuQWRkT2JqZWN0KDEsIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1JlZmVyZW5jZT4oJmhvbGRlciwgMiksCisgICAgICAgICAgICAgICAgICAgVGVzdEhvbGRlcjo6T2JqZWN0U3RhdGU6OlVuYXZhaWxhYmxlKTsKKyAgaG9sZGVyLkFkZE9iamVjdCgyLCBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJpbmc+KG51bGxwdHIsICJzdHJpbmciLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgVGVzdEhvbGRlcjo6T2JqZWN0U3RhdGU6OlVuYXZhaWxhYmxlKTsKKyAgQ1BERl9PYmplY3RBdmFpbCBhdmFpbChob2xkZXIuR2V0VmFsaWRhdG9yKCkuR2V0KCksICZob2xkZXIsIDEpOworICBFWFBFQ1RfRVEoQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzOjpEYXRhTm90QXZhaWxhYmxlLAorICAgICAgICAgICAgYXZhaWwuQ2hlY2tBdmFpbCgpKTsKKworICBob2xkZXIuU2V0T2JqZWN0U3RhdGUoMSwgVGVzdEhvbGRlcjo6T2JqZWN0U3RhdGU6OkF2YWlsYWJsZSk7CisgIEVYUEVDVF9FUShDUERGX0RhdGFBdmFpbDo6RG9jQXZhaWxTdGF0dXM6OkRhdGFOb3RBdmFpbGFibGUsCisgICAgICAgICAgICBhdmFpbC5DaGVja0F2YWlsKCkpOworCisgIGhvbGRlci5TZXRPYmplY3RTdGF0ZSgyLCBUZXN0SG9sZGVyOjpPYmplY3RTdGF0ZTo6QXZhaWxhYmxlKTsKKyAgRVhQRUNUX0VRKENQREZfRGF0YUF2YWlsOjpEb2NBdmFpbFN0YXR1czo6RGF0YUF2YWlsYWJsZSwgYXZhaWwuQ2hlY2tBdmFpbCgpKTsKK30KKworVEVTVChDUERGX09iamVjdEF2YWlsVGVzdCwgQ3ljbGVkUmVmZXJlbmNlcykgeworICBUZXN0SG9sZGVyIGhvbGRlcjsKKyAgaG9sZGVyLkFkZE9iamVjdCgxLCBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9SZWZlcmVuY2U+KCZob2xkZXIsIDIpLAorICAgICAgICAgICAgICAgICAgIFRlc3RIb2xkZXI6Ok9iamVjdFN0YXRlOjpVbmF2YWlsYWJsZSk7CisgIGhvbGRlci5BZGRPYmplY3QoMiwgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfUmVmZXJlbmNlPigmaG9sZGVyLCAzKSwKKyAgICAgICAgICAgICAgICAgICBUZXN0SG9sZGVyOjpPYmplY3RTdGF0ZTo6VW5hdmFpbGFibGUpOworICBob2xkZXIuQWRkT2JqZWN0KDMsIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1JlZmVyZW5jZT4oJmhvbGRlciwgMSksCisgICAgICAgICAgICAgICAgICAgVGVzdEhvbGRlcjo6T2JqZWN0U3RhdGU6OlVuYXZhaWxhYmxlKTsKKworICBDUERGX09iamVjdEF2YWlsIGF2YWlsKGhvbGRlci5HZXRWYWxpZGF0b3IoKS5HZXQoKSwgJmhvbGRlciwgMSk7CisgIEVYUEVDVF9FUShDUERGX0RhdGFBdmFpbDo6RG9jQXZhaWxTdGF0dXM6OkRhdGFOb3RBdmFpbGFibGUsCisgICAgICAgICAgICBhdmFpbC5DaGVja0F2YWlsKCkpOworCisgIGhvbGRlci5TZXRPYmplY3RTdGF0ZSgxLCBUZXN0SG9sZGVyOjpPYmplY3RTdGF0ZTo6QXZhaWxhYmxlKTsKKyAgRVhQRUNUX0VRKENQREZfRGF0YUF2YWlsOjpEb2NBdmFpbFN0YXR1czo6RGF0YU5vdEF2YWlsYWJsZSwKKyAgICAgICAgICAgIGF2YWlsLkNoZWNrQXZhaWwoKSk7CisKKyAgaG9sZGVyLlNldE9iamVjdFN0YXRlKDIsIFRlc3RIb2xkZXI6Ok9iamVjdFN0YXRlOjpBdmFpbGFibGUpOworICBFWFBFQ1RfRVEoQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzOjpEYXRhTm90QXZhaWxhYmxlLAorICAgICAgICAgICAgYXZhaWwuQ2hlY2tBdmFpbCgpKTsKKworICBob2xkZXIuU2V0T2JqZWN0U3RhdGUoMywgVGVzdEhvbGRlcjo6T2JqZWN0U3RhdGU6OkF2YWlsYWJsZSk7CisgIEVYUEVDVF9FUShDUERGX0RhdGFBdmFpbDo6RG9jQXZhaWxTdGF0dXM6OkRhdGFBdmFpbGFibGUsIGF2YWlsLkNoZWNrQXZhaWwoKSk7Cit9CisKK1RFU1QoQ1BERl9PYmplY3RBdmFpbFRlc3QsIERvTm90Q2hlY2tQYXJlbnQpIHsKKyAgVGVzdEhvbGRlciBob2xkZXI7CisgIGhvbGRlci5BZGRPYmplY3QoMSwgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4oKSwKKyAgICAgICAgICAgICAgICAgICBUZXN0SG9sZGVyOjpPYmplY3RTdGF0ZTo6VW5hdmFpbGFibGUpOworICBob2xkZXIuQWRkT2JqZWN0KDIsIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCksCisgICAgICAgICAgICAgICAgICAgVGVzdEhvbGRlcjo6T2JqZWN0U3RhdGU6OlVuYXZhaWxhYmxlKTsKKworICBob2xkZXIuR2V0VGVzdE9iamVjdCgyKS0+R2V0RGljdCgpLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJQYXJlbnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZob2xkZXIsIDEpOworCisgIENQREZfT2JqZWN0QXZhaWwgYXZhaWwoaG9sZGVyLkdldFZhbGlkYXRvcigpLkdldCgpLCAmaG9sZGVyLCAyKTsKKyAgRVhQRUNUX0VRKENQREZfRGF0YUF2YWlsOjpEb2NBdmFpbFN0YXR1czo6RGF0YU5vdEF2YWlsYWJsZSwKKyAgICAgICAgICAgIGF2YWlsLkNoZWNrQXZhaWwoKSk7CisKKyAgaG9sZGVyLlNldE9iamVjdFN0YXRlKDIsIFRlc3RIb2xkZXI6Ok9iamVjdFN0YXRlOjpBdmFpbGFibGUpOworICAvLyAgT2JqZWN0IHNob3VsZCBiZSBhdmFpbGFibGUgaW4gY2FzZSB3aGVuICJQYXJlbnQiIG9iamVjdCBpcyB1bmF2YWlsYWJsZS4KKyAgRVhQRUNUX0VRKENQREZfRGF0YUF2YWlsOjpEb2NBdmFpbFN0YXR1czo6RGF0YUF2YWlsYWJsZSwgYXZhaWwuQ2hlY2tBdmFpbCgpKTsKK30KKworVEVTVChDUERGX09iamVjdEF2YWlsVGVzdCwgR2VuZXJpYykgeworICBUZXN0SG9sZGVyIGhvbGRlcjsKKyAgY29uc3QgdWludDMyX3Qga0RlcHRoID0gMTAwOworICBmb3IgKHVpbnQzMl90IGkgPSAxOyBpIDwga0RlcHRoOyArK2kpIHsKKyAgICBob2xkZXIuQWRkT2JqZWN0KGksIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCksCisgICAgICAgICAgICAgICAgICAgICBUZXN0SG9sZGVyOjpPYmplY3RTdGF0ZTo6VW5hdmFpbGFibGUpOworICAgIC8vIEFkZCByZWYgdG8gbmV4dCBkaWN0aW9uYXJ5LgorICAgIGhvbGRlci5HZXRUZXN0T2JqZWN0KGkpLT5HZXREaWN0KCktPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oCisgICAgICAgICJDaGlsZCIsICZob2xkZXIsIGkgKyAxKTsKKyAgfQorICAvLyBBZGQgZmluYWwgb2JqZWN0CisgIGhvbGRlci5BZGRPYmplY3Qoa0RlcHRoLCBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigpLAorICAgICAgICAgICAgICAgICAgIFRlc3RIb2xkZXI6Ok9iamVjdFN0YXRlOjpVbmF2YWlsYWJsZSk7CisKKyAgQ1BERl9PYmplY3RBdmFpbCBhdmFpbChob2xkZXIuR2V0VmFsaWRhdG9yKCkuR2V0KCksICZob2xkZXIsIDEpOworCisgIGZvciAodWludDMyX3QgaSA9IDE7IGkgPD0ga0RlcHRoOyArK2kpIHsKKyAgICBFWFBFQ1RfRVEoQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzOjpEYXRhTm90QXZhaWxhYmxlLAorICAgICAgICAgICAgICBhdmFpbC5DaGVja0F2YWlsKCkpOworICAgIGhvbGRlci5TZXRPYmplY3RTdGF0ZShpLCBUZXN0SG9sZGVyOjpPYmplY3RTdGF0ZTo6QXZhaWxhYmxlKTsKKyAgfQorICBFWFBFQ1RfRVEoQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzOjpEYXRhQXZhaWxhYmxlLCBhdmFpbC5DaGVja0F2YWlsKCkpOworfQorCitURVNUKENQREZfT2JqZWN0QXZhaWxUZXN0LCBOb3RFeGNsdWRlUm9vdCkgeworICBUZXN0SG9sZGVyIGhvbGRlcjsKKyAgaG9sZGVyLkFkZE9iamVjdCgxLCBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigpLAorICAgICAgICAgICAgICAgICAgIFRlc3RIb2xkZXI6Ok9iamVjdFN0YXRlOjpBdmFpbGFibGUpOworICBDUERGX09iamVjdEF2YWlsRmFpbE9uRXhjbHVkZSBhdmFpbChob2xkZXIuR2V0VmFsaWRhdG9yKCkuR2V0KCksICZob2xkZXIsIDEpOworICBFWFBFQ1RfRVEoQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzOjpEYXRhQXZhaWxhYmxlLCBhdmFpbC5DaGVja0F2YWlsKCkpOworfQorCitURVNUKENQREZfT2JqZWN0QXZhaWxUZXN0LCBOb3RFeGNsdWRlUmVmZXJlZFJvb3QpIHsKKyAgVGVzdEhvbGRlciBob2xkZXI7CisgIGhvbGRlci5BZGRPYmplY3QoMSwgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfUmVmZXJlbmNlPigmaG9sZGVyLCAyKSwKKyAgICAgICAgICAgICAgICAgICBUZXN0SG9sZGVyOjpPYmplY3RTdGF0ZTo6QXZhaWxhYmxlKTsKKyAgaG9sZGVyLkFkZE9iamVjdCgyLCBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigpLAorICAgICAgICAgICAgICAgICAgIFRlc3RIb2xkZXI6Ok9iamVjdFN0YXRlOjpBdmFpbGFibGUpOworICBDUERGX09iamVjdEF2YWlsRmFpbE9uRXhjbHVkZSBhdmFpbChob2xkZXIuR2V0VmFsaWRhdG9yKCkuR2V0KCksICZob2xkZXIsIDEpOworICBFWFBFQ1RfRVEoQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzOjpEYXRhQXZhaWxhYmxlLCBhdmFpbC5DaGVja0F2YWlsKCkpOworfQorCitURVNUKENQREZfT2JqZWN0QXZhaWxUZXN0LCBFeGNsdWRlKSB7CisgIFRlc3RIb2xkZXIgaG9sZGVyOworICBob2xkZXIuQWRkT2JqZWN0KDEsIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCksCisgICAgICAgICAgICAgICAgICAgVGVzdEhvbGRlcjo6T2JqZWN0U3RhdGU6OkF2YWlsYWJsZSk7CisgIGhvbGRlci5HZXRUZXN0T2JqZWN0KDEpLT5HZXREaWN0KCktPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIkFycmF5UmVmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaG9sZGVyLCAyKTsKKyAgaG9sZGVyLkFkZE9iamVjdCgyLCBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9BcnJheT4oKSwKKyAgICAgICAgICAgICAgICAgICBUZXN0SG9sZGVyOjpPYmplY3RTdGF0ZTo6QXZhaWxhYmxlKTsKKyAgaG9sZGVyLkdldFRlc3RPYmplY3QoMiktPkFzQXJyYXkoKS0+QWRkTmV3PENQREZfUmVmZXJlbmNlPigmaG9sZGVyLCAyKTsKKworICAvLyBBZGQgc3RyaW5nLCB3aGljaCBpcyByZWZlcmVkIGJ5IGFycmF5IGl0ZW0uIEl0IGlzIHNob3VsZCBub3QgYmUgY2hlY2tlZC4KKyAgaG9sZGVyLkFkZE9iamVjdCgKKyAgICAgIDMsCisgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJpbmc+KG51bGxwdHIsICJOb3QgYXZhaWxhYmxlIHN0cmluZyIsIGZhbHNlKSwKKyAgICAgIFRlc3RIb2xkZXI6Ok9iamVjdFN0YXRlOjpVbmF2YWlsYWJsZSk7CisgIENQREZfT2JqZWN0QXZhaWxFeGNsdWRlQXJyYXkgYXZhaWwoaG9sZGVyLkdldFZhbGlkYXRvcigpLkdldCgpLCAmaG9sZGVyLCAxKTsKKyAgRVhQRUNUX0VRKENQREZfRGF0YUF2YWlsOjpEb2NBdmFpbFN0YXR1czo6RGF0YUF2YWlsYWJsZSwgYXZhaWwuQ2hlY2tBdmFpbCgpKTsKK30KKworVEVTVChDUERGX09iamVjdEF2YWlsVGVzdCwgUmVhZEVycm9yT25FeGNsdWRlKSB7CisgIFRlc3RIb2xkZXIgaG9sZGVyOworICBob2xkZXIuQWRkT2JqZWN0KDEsIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCksCisgICAgICAgICAgICAgICAgICAgVGVzdEhvbGRlcjo6T2JqZWN0U3RhdGU6OkF2YWlsYWJsZSk7CisgIGhvbGRlci5HZXRUZXN0T2JqZWN0KDEpLT5HZXREaWN0KCktPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIkRpY3RSZWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZob2xkZXIsIDIpOworICBob2xkZXIuQWRkT2JqZWN0KDIsIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCksCisgICAgICAgICAgICAgICAgICAgVGVzdEhvbGRlcjo6T2JqZWN0U3RhdGU6OkF2YWlsYWJsZSk7CisKKyAgaG9sZGVyLkdldFRlc3RPYmplY3QoMiktPkdldERpY3QoKS0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiVHlwZSIsICZob2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyk7CisgIC8vIFRoZSB2YWx1ZSBvZiAiVHlwZSIga2V5IGlzIG5vdCBhdmFpbGFibGUgYXQgc3RhcnQKKyAgaG9sZGVyLkFkZE9iamVjdCgKKyAgICAgIDMsIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmluZz4obnVsbHB0ciwgIkV4Y2x1ZGUgbWUiLCBmYWxzZSksCisgICAgICBUZXN0SG9sZGVyOjpPYmplY3RTdGF0ZTo6VW5hdmFpbGFibGUpOworCisgIGhvbGRlci5HZXRUZXN0T2JqZWN0KDIpLT5HZXREaWN0KCktPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIk90aGVyRGF0YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvbGRlciwgNCk7CisgIC8vIEFkZCBzdHJpbmcsIHdoaWNoIGlzIHJlZmVyZWQgYnkgZGljdGlvbmFyeSBpdGVtLiBJdCBpcyBzaG91bGQgbm90IGJlCisgIC8vIGNoZWNrZWQsIGJlY2F1c2UgdGhlIGRpY3Rpb25hcnkgd2l0aCBpdCwgc2hvdWxkIGJlIHNraXBwZWQuCisgIGhvbGRlci5BZGRPYmplY3QoCisgICAgICA0LAorICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU3RyaW5nPihudWxscHRyLCAiTm90IGF2YWlsYWJsZSBzdHJpbmciLCBmYWxzZSksCisgICAgICBUZXN0SG9sZGVyOjpPYmplY3RTdGF0ZTo6VW5hdmFpbGFibGUpOworCisgIENQREZfT2JqZWN0QXZhaWxFeGNsdWRlVHlwZUtleSBhdmFpbChob2xkZXIuR2V0VmFsaWRhdG9yKCkuR2V0KCksICZob2xkZXIsIDEpOworCisgIEVYUEVDVF9FUShDUERGX0RhdGFBdmFpbDo6RG9jQXZhaWxTdGF0dXM6OkRhdGFOb3RBdmFpbGFibGUsCisgICAgICAgICAgICBhdmFpbC5DaGVja0F2YWlsKCkpOworCisgIC8vIE1ha2UgIlR5cGUiIHZhbHVlIG9iamVjdCBhdmFpbGFibGUuCisgIGhvbGRlci5TZXRPYmplY3RTdGF0ZSgzLCBUZXN0SG9sZGVyOjpPYmplY3RTdGF0ZTo6QXZhaWxhYmxlKTsKKworICAvLyBOb3cgb2JqZWN0IHNob3VsZCBiZSBhdmFpbGFibGUsIGFsdGhvdWdoIHRoZSBvYmplY3QgJzQnIGlzIG5vdCBhdmFpbGFibGUsCisgIC8vIGJlY2F1c2UgaXQgaXMgaW4gc2tpcHBlZCBkaWN0aW9uYXJ5LgorICBFWFBFQ1RfRVEoQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzOjpEYXRhQXZhaWxhYmxlLCBhdmFpbC5DaGVja0F2YWlsKCkpOworfQorCitURVNUKENQREZfT2JqZWN0QXZhaWxUZXN0LCBJZ25vcmVOb3RFeGlzdHNPYmplY3QpIHsKKyAgVGVzdEhvbGRlciBob2xkZXI7CisgIGhvbGRlci5BZGRPYmplY3QoMSwgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4oKSwKKyAgICAgICAgICAgICAgICAgICBUZXN0SG9sZGVyOjpPYmplY3RTdGF0ZTo6QXZhaWxhYmxlKTsKKyAgaG9sZGVyLkdldFRlc3RPYmplY3QoMSktPkdldERpY3QoKS0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigKKyAgICAgICJOb3RFeGlzdHNPYmpSZWYiLCAmaG9sZGVyLCAyKTsKKyAgQ1BERl9PYmplY3RBdmFpbCBhdmFpbChob2xkZXIuR2V0VmFsaWRhdG9yKCkuR2V0KCksICZob2xkZXIsIDEpOworICAvLyBOb3cgb2JqZWN0IHNob3VsZCBiZSBhdmFpbGFibGUsIGFsdGhvdWdoIHRoZSBvYmplY3QgJzInIGlzIG5vdCBleGlzdHMuIEJ1dAorICAvLyBhbGwgZXhpc3RzIGluIGZpbGUgcmVsYXRlZCBkYXRhIGFyZSBjaGVja2VkLgorICBFWFBFQ1RfRVEoQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzOjpEYXRhQXZhaWxhYmxlLCBhdmFpbC5DaGVja0F2YWlsKCkpOworfQorCitURVNUKENQREZfT2JqZWN0QXZhaWxUZXN0LCBDaGVja1R3aWNlKSB7CisgIFRlc3RIb2xkZXIgaG9sZGVyOworICBob2xkZXIuQWRkT2JqZWN0KDEsIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmluZz4obnVsbHB0ciwgInN0cmluZyIsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICBUZXN0SG9sZGVyOjpPYmplY3RTdGF0ZTo6VW5hdmFpbGFibGUpOworCisgIENQREZfT2JqZWN0QXZhaWwgYXZhaWwoaG9sZGVyLkdldFZhbGlkYXRvcigpLkdldCgpLCAmaG9sZGVyLCAxKTsKKyAgRVhQRUNUX0VRKGF2YWlsLkNoZWNrQXZhaWwoKSwgYXZhaWwuQ2hlY2tBdmFpbCgpKTsKKworICBob2xkZXIuU2V0T2JqZWN0U3RhdGUoMSwgVGVzdEhvbGRlcjo6T2JqZWN0U3RhdGU6OkF2YWlsYWJsZSk7CisgIEVYUEVDVF9FUShhdmFpbC5DaGVja0F2YWlsKCksIGF2YWlsLkNoZWNrQXZhaWwoKSk7Cit9CisKK1RFU1QoQ1BERl9PYmplY3RBdmFpbFRlc3QsIFNlbGZSZWZlcmVkSW5saW5lZE9iamVjdCkgeworICBUZXN0SG9sZGVyIGhvbGRlcjsKKyAgaG9sZGVyLkFkZE9iamVjdCgxLCBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigpLAorICAgICAgICAgICAgICAgICAgIFRlc3RIb2xkZXI6Ok9iamVjdFN0YXRlOjpBdmFpbGFibGUpOworCisgIGhvbGRlci5HZXRUZXN0T2JqZWN0KDEpLT5HZXREaWN0KCktPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIkRhdGEiLCAmaG9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOworICBhdXRvKiByb290ID0KKyAgICAgIGhvbGRlci5HZXRUZXN0T2JqZWN0KDEpLT5HZXREaWN0KCktPlNldE5ld0ZvcjxDUERGX0RpY3Rpb25hcnk+KCJEaWN0Iik7CisKKyAgcm9vdC0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiU2VsZiIsICZob2xkZXIsIDEpOworCisgIGhvbGRlci5BZGRPYmplY3QoMiwgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU3RyaW5nPihudWxscHRyLCAiRGF0YSIsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICBUZXN0SG9sZGVyOjpPYmplY3RTdGF0ZTo6VW5hdmFpbGFibGUpOworCisgIENQREZfT2JqZWN0QXZhaWwgYXZhaWwoaG9sZGVyLkdldFZhbGlkYXRvcigpLkdldCgpLCAmaG9sZGVyLCByb290KTsKKworICBFWFBFQ1RfRVEoQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzOjpEYXRhTm90QXZhaWxhYmxlLAorICAgICAgICAgICAgYXZhaWwuQ2hlY2tBdmFpbCgpKTsKKworICBob2xkZXIuU2V0T2JqZWN0U3RhdGUoMiwgVGVzdEhvbGRlcjo6T2JqZWN0U3RhdGU6OkF2YWlsYWJsZSk7CisKKyAgRVhQRUNUX0VRKENQREZfRGF0YUF2YWlsOjpEb2NBdmFpbFN0YXR1czo6RGF0YUF2YWlsYWJsZSwgYXZhaWwuQ2hlY2tBdmFpbCgpKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3RfdW5pdHRlc3QuY3BwIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdF91bml0dGVzdC5jcHAKaW5kZXggOTI3YjEwNi4uNGIxNjAyMSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdF91bml0dGVzdC5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdF91bml0dGVzdC5jcHAKQEAgLTIsMjMgKzIsMjEgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2Jvb2xlYW4uaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9pbmRpcmVjdF9vYmplY3RfaG9sZGVyLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX25hbWUuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbnVsbC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9udW1iZXIuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVmZXJlbmNlLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJpbmcuaCIKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfaW5kaXJlY3Rfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKIAogbmFtZXNwYWNlIHsKQEAgLTgyLDcgKzgwLDcgQEAKICAgICAvLyBBbGwgZGlyZWN0IG9iamVjdHMuCiAgICAgQ1BERl9PYmplY3QqIG9ianNbXSA9IHtib29sZWFuX2ZhbHNlX29iaiwgYm9vbGVhbl90cnVlX29iaiwgbnVtYmVyX2ludF9vYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXJfZmxvYXRfb2JqLCAgc3RyX3JlZ19vYmosICAgICAgc3RyX3NwZWNfb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9vYmosICAgICAgICAgIG1fQXJyYXlPYmosICAgICAgIG1fRGljdE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfb2JqLCAgICAgICAgICBtX0FycmF5T2JqLkdldCgpLCBtX0RpY3RPYmouR2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1fb2JqLCAgICAgICAgbnVsbF9vYmp9OwogICAgIG1fRGlyZWN0T2JqVHlwZXMgPSB7CiAgICAgICAgIENQREZfT2JqZWN0OjpCT09MRUFOLCBDUERGX09iamVjdDo6Qk9PTEVBTiwgQ1BERl9PYmplY3Q6Ok5VTUJFUiwKQEAgLTE2Miw4ICsxNjAsOCBAQAogICAgICAgICAvLyBzdHJlYW1zIG5lZWQgdG8gYmUgaGFuZGxlZC4KICAgICAgICAgaWYgKCFzdHJlYW0xLT5Jc01lbW9yeUJhc2VkKCkgfHwgIXN0cmVhbTItPklzTWVtb3J5QmFzZWQoKSkKICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBGWFNZU19tZW1jbXAoc3RyZWFtMS0+R2V0UmF3RGF0YSgpLCBzdHJlYW0yLT5HZXRSYXdEYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtMS0+R2V0UmF3U2l6ZSgpKSA9PSAwOworICAgICAgICByZXR1cm4gbWVtY21wKHN0cmVhbTEtPkdldFJhd0RhdGEoKSwgc3RyZWFtMi0+R2V0UmF3RGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbTEtPkdldFJhd1NpemUoKSkgPT0gMDsKICAgICAgIH0KICAgICAgIGNhc2UgQ1BERl9PYmplY3Q6OlJFRkVSRU5DRToKICAgICAgICAgcmV0dXJuIG9iajEtPkFzUmVmZXJlbmNlKCktPkdldFJlZk9iak51bSgpID09CkBAIC0xNzksOSArMTc3LDkgQEAKICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0Pj4gbV9EaXJlY3RPYmpzOwogICBzdGQ6OnZlY3RvcjxpbnQ+IG1fRGlyZWN0T2JqVHlwZXM7CiAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4+IG1fUmVmT2JqczsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBtX0RpY3RPYmo7Ci0gIENQREZfRGljdGlvbmFyeSogbV9TdHJlYW1EaWN0T2JqOwotICBDUERGX0FycmF5KiBtX0FycmF5T2JqOworICBVbm93bmVkUHRyPENQREZfRGljdGlvbmFyeT4gbV9EaWN0T2JqOworICBVbm93bmVkUHRyPENQREZfRGljdGlvbmFyeT4gbV9TdHJlYW1EaWN0T2JqOworICBVbm93bmVkUHRyPENQREZfQXJyYXk+IG1fQXJyYXlPYmo7CiAgIHN0ZDo6dmVjdG9yPENQREZfT2JqZWN0Kj4gbV9JbmRpcmVjdE9ianM7CiB9OwogCkBAIC0yMTgsMTQgKzIxNiwxNCBAQAogfQogCiBURVNUX0YoUERGT2JqZWN0c1Rlc3QsIEdldE51bWJlcikgewotICBjb25zdCBGWF9GTE9BVCBkaXJlY3Rfb2JqX3Jlc3VsdHNbXSA9IHswLCAwLCAxMjQ1LCA5LjAwMzQ1ZiwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgICAgMCwgICAgICAgIDB9OworICBjb25zdCBmbG9hdCBkaXJlY3Rfb2JqX3Jlc3VsdHNbXSA9IHswLCAwLCAxMjQ1LCA5LjAwMzQ1ZiwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgICAgMCwgICAgICAgIDB9OwogICAvLyBDaGVjayBmb3IgZGlyZWN0IG9iamVjdHMuCiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9EaXJlY3RPYmpzLnNpemUoKTsgKytpKQogICAgIEVYUEVDVF9FUShkaXJlY3Rfb2JqX3Jlc3VsdHNbaV0sIG1fRGlyZWN0T2Jqc1tpXS0+R2V0TnVtYmVyKCkpOwogCiAgIC8vIENoZWNrIGluZGlyZWN0IHJlZmVyZW5jZXMuCi0gIGNvbnN0IEZYX0ZMT0FUIGluZGlyZWN0X29ial9yZXN1bHRzW10gPSB7MCwgMTI0NSwgMCwgMCwgMCwgMCwgMH07CisgIGNvbnN0IGZsb2F0IGluZGlyZWN0X29ial9yZXN1bHRzW10gPSB7MCwgMTI0NSwgMCwgMCwgMCwgMCwgMH07CiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9SZWZPYmpzLnNpemUoKTsgKytpKQogICAgIEVYUEVDVF9FUShpbmRpcmVjdF9vYmpfcmVzdWx0c1tpXSwgbV9SZWZPYmpzW2ldLT5HZXROdW1iZXIoKSk7CiB9CkBAIC0yNDQsMjMgKzI0MiwyOSBAQAogCiBURVNUX0YoUERGT2JqZWN0c1Rlc3QsIEdldERpY3QpIHsKICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBjb25zdCBkaXJlY3Rfb2JqX3Jlc3VsdHNbXSA9IHsKLSAgICAgIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsICAgbnVsbHB0ciwgICAgICAgICBudWxscHRyLCBudWxscHRyLAotICAgICAgbnVsbHB0ciwgbnVsbHB0ciwgbV9EaWN0T2JqLCBtX1N0cmVhbURpY3RPYmosIG51bGxwdHJ9OworICAgICAgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgICAgICAgICBudWxscHRyLAorICAgICAgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbV9EaWN0T2JqLkdldCgpLCBtX1N0cmVhbURpY3RPYmouR2V0KCksCisgICAgICBudWxscHRyfTsKICAgLy8gQ2hlY2sgZm9yIGRpcmVjdCBvYmplY3RzLgogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fRGlyZWN0T2Jqcy5zaXplKCk7ICsraSkKICAgICBFWFBFQ1RfRVEoZGlyZWN0X29ial9yZXN1bHRzW2ldLCBtX0RpcmVjdE9ianNbaV0tPkdldERpY3QoKSk7CiAKICAgLy8gQ2hlY2sgaW5kaXJlY3QgcmVmZXJlbmNlcy4KLSAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBjb25zdCBpbmRpcmVjdF9vYmpfcmVzdWx0c1tdID0gewotICAgICAgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbV9EaWN0T2JqLCBtX1N0cmVhbURpY3RPYmp9OworICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIGNvbnN0IGluZGlyZWN0X29ial9yZXN1bHRzW10gPSB7bnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0RpY3RPYmouR2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1N0cmVhbURpY3RPYmouR2V0KCl9OwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fUmVmT2Jqcy5zaXplKCk7ICsraSkKICAgICBFWFBFQ1RfVFJVRShFcXVhbChpbmRpcmVjdF9vYmpfcmVzdWx0c1tpXSwgbV9SZWZPYmpzW2ldLT5HZXREaWN0KCkpKTsKIH0KIAogVEVTVF9GKFBERk9iamVjdHNUZXN0LCBHZXRBcnJheSkgewogICBjb25zdCBDUERGX0FycmF5KiBjb25zdCBkaXJlY3Rfb2JqX3Jlc3VsdHNbXSA9IHsKLSAgICAgIG51bGxwdHIsIG51bGxwdHIsICAgIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsCi0gICAgICBudWxscHRyLCBtX0FycmF5T2JqLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyfTsKKyAgICAgIG51bGxwdHIsIG51bGxwdHIsICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsCisgICAgICBudWxscHRyLCBtX0FycmF5T2JqLkdldCgpLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyfTsKICAgLy8gQ2hlY2sgZm9yIGRpcmVjdCBvYmplY3RzLgogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fRGlyZWN0T2Jqcy5zaXplKCk7ICsraSkKICAgICBFWFBFQ1RfRVEoZGlyZWN0X29ial9yZXN1bHRzW2ldLCBtX0RpcmVjdE9ianNbaV0tPkFzQXJyYXkoKSk7CkBAIC00ODQsOCArNDg4LDggQEAKICAgICAvLyBTdHJpbmcgYW5kIG5hbWUgYXJyYXkKICAgICBjb25zdCBjaGFyKiBjb25zdCB2YWxzW10gPSB7InRoaXMiLCAiYWRzZGUkJV4iLCAiXHJcdCIsICAgICAgICAgICAiXCIwMTIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLiIsICAgICJFWVJFVyIsICAgICJJdCBpcyBhIGpva2UgOikifTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9BcnJheT4gc3RyaW5nX2FycmF5KG5ldyBDUERGX0FycmF5KTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9BcnJheT4gbmFtZV9hcnJheShuZXcgQ1BERl9BcnJheSk7CisgICAgYXV0byBzdHJpbmdfYXJyYXkgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9BcnJheT4oKTsKKyAgICBhdXRvIG5hbWVfYXJyYXkgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9BcnJheT4oKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh2YWxzKTsgKytpKSB7CiAgICAgICBzdHJpbmdfYXJyYXktPkluc2VydE5ld0F0PENQREZfU3RyaW5nPihpLCB2YWxzW2ldLCBmYWxzZSk7CiAgICAgICBuYW1lX2FycmF5LT5JbnNlcnROZXdBdDxDUERGX05hbWU+KGksIHZhbHNbaV0pOwpAQCAtNjkzLDEwICs2OTcsMTEgQEAKIH0KIAogVEVTVChQREZBcnJheVRlc3QsIEFkZFN0cmluZ0FuZE5hbWUpIHsKLSAgY29uc3QgY2hhciogdmFsc1tdID0geyIiLCAgICAgICAgImEiLCAiZWhqaFJJT1lUVEZkZmNkbnYiLCAgIjEyMjMyMyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiJCMlXiYqKiIsICIgIiwgIlRoaXMgaXMgYSB0ZXN0LlxyXG4ifTsKLSAgc3RkOjp1bmlxdWVfcHRyPENQREZfQXJyYXk+IHN0cmluZ19hcnJheShuZXcgQ1BERl9BcnJheSk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0FycmF5PiBuYW1lX2FycmF5KG5ldyBDUERGX0FycmF5KTsKKyAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiB2YWxzW10gPSB7CisgICAgICAiIiwgICAgICAgICJhIiwgImVoamhSSU9ZVFRGZGZjZG52IiwgICIxMjIzMjMiLAorICAgICAgIiQjJV4mKioiLCAiICIsICJUaGlzIGlzIGEgdGVzdC5cclxuIn07CisgIGF1dG8gc3RyaW5nX2FycmF5ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfQXJyYXk+KCk7CisgIGF1dG8gbmFtZV9hcnJheSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0FycmF5PigpOwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh2YWxzKTsgKytpKSB7CiAgICAgc3RyaW5nX2FycmF5LT5BZGROZXc8Q1BERl9TdHJpbmc+KHZhbHNbaV0sIGZhbHNlKTsKICAgICBuYW1lX2FycmF5LT5BZGROZXc8Q1BERl9OYW1lPih2YWxzW2ldKTsKQEAgLTcxMCw4ICs3MTUsNyBAQAogfQogCiBURVNUKFBERkFycmF5VGVzdCwgQWRkUmVmZXJlbmNlQW5kR2V0T2JqZWN0QXQpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXI+IGhvbGRlcigKLSAgICAgIG5ldyBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKCkpOworICBhdXRvIGhvbGRlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyPigpOwogICBDUERGX0Jvb2xlYW4qIGJvb2xlYW5fb2JqID0gbmV3IENQREZfQm9vbGVhbih0cnVlKTsKICAgQ1BERl9OdW1iZXIqIGludF9vYmogPSBuZXcgQ1BERl9OdW1iZXIoLTEyMzQpOwogICBDUERGX051bWJlciogZmxvYXRfb2JqID0gbmV3IENQREZfTnVtYmVyKDIzNDUuMDg5Zik7CkBAIC03MjMsNyArNzI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfb2JqLCAgICAgbmFtZV9vYmosIG51bGxfb2JqfTsKICAgdW5zaWduZWQgaW50IG9ial9udW1zW10gPSB7MiwgNCwgNywgMjM0NSwgNzk5ODg3LCAxfTsKICAgYXV0byBhcnIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9BcnJheT4oKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENQREZfQXJyYXk+IGFycjEobmV3IENQREZfQXJyYXkpOworICBhdXRvIGFycjEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9BcnJheT4oKTsKICAgLy8gQ3JlYXRlIHR3byBhcnJheXMgb2YgcmVmZXJlbmNlcyBieSBkaWZmZXJlbnQgQWRkUmVmZXJlbmNlKCkgQVBJcy4KICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoaW5kaXJlY3Rfb2Jqcyk7ICsraSkgewogICAgIGhvbGRlci0+UmVwbGFjZUluZGlyZWN0T2JqZWN0SWZIaWdoZXJHZW5lcmF0aW9uKApAQCAtNzQ4LDcgKzc1Miw3IEBACiAKIFRFU1QoUERGQXJyYXlUZXN0LCBDbG9uZURpcmVjdE9iamVjdCkgewogICBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyIG9iamVjdHNfaG9sZGVyOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9BcnJheT4gYXJyYXkobmV3IENQREZfQXJyYXkpOworICBhdXRvIGFycmF5ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfQXJyYXk+KCk7CiAgIGFycmF5LT5BZGROZXc8Q1BERl9SZWZlcmVuY2U+KCZvYmplY3RzX2hvbGRlciwgMTIzNCk7CiAgIEFTU0VSVF9FUSgxVSwgYXJyYXktPkdldENvdW50KCkpOwogICBDUERGX09iamVjdCogb2JqID0gYXJyYXktPkdldE9iamVjdEF0KDApOwpAQCAtNzYxLDcgKzc2NSw3IEBACiAKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfQXJyYXk+IGNsb25lZF9hcnJheSA9CiAgICAgICBUb0FycmF5KHN0ZDo6bW92ZShjbG9uZWRfYXJyYXlfb2JqZWN0KSk7Ci0gIEFTU0VSVF9FUSgxVSwgY2xvbmVkX2FycmF5LT5HZXRDb3VudCgpKTsKKyAgQVNTRVJUX0VRKDBVLCBjbG9uZWRfYXJyYXktPkdldENvdW50KCkpOwogICBDUERGX09iamVjdCogY2xvbmVkX29iaiA9IGNsb25lZF9hcnJheS0+R2V0T2JqZWN0QXQoMCk7CiAgIEVYUEVDVF9GQUxTRShjbG9uZWRfb2JqKTsKIH0KQEAgLTc4MCw5ICs3ODQsNzggQEAKICAgRVhQRUNUX0VRKDQyLCBhcnJheS0+R2V0SW50ZWdlckF0KDApKTsKIH0KIAorVEVTVChQREZTdHJlYW1UZXN0LCBTZXREYXRhKSB7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEoMTAwKTsKKyAgYXV0byBzdHJlYW0gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJlYW0+KCk7CisgIHN0cmVhbS0+SW5pdFN0cmVhbShkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigpKTsKKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PGludD4oZGF0YS5zaXplKCkpLAorICAgICAgICAgICAgc3RyZWFtLT5HZXREaWN0KCktPkdldEludGVnZXJGb3IoIkxlbmd0aCIpKTsKKworICBzdHJlYW0tPkdldERpY3QoKS0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigiRmlsdGVyIiwgTCJTb21lRmlsdGVyIik7CisgIHN0cmVhbS0+R2V0RGljdCgpLT5TZXROZXdGb3I8Q1BERl9TdHJpbmc+KCJEZWNvZGVQYXJtcyIsIEwiU29tZVBhcmFtcyIpOworCisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG5ld19kYXRhKGRhdGEuc2l6ZSgpICogMik7CisgIHN0cmVhbS0+U2V0RGF0YShuZXdfZGF0YS5kYXRhKCksIG5ld19kYXRhLnNpemUoKSk7CisKKyAgLy8gVGhlICJMZW5ndGgiIGZpZWxkIHNob3VsZCBiZSB1cGRhdGVkIGZvciBuZXcgZGF0YSBzaXplLgorICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8aW50PihuZXdfZGF0YS5zaXplKCkpLAorICAgICAgICAgICAgc3RyZWFtLT5HZXREaWN0KCktPkdldEludGVnZXJGb3IoIkxlbmd0aCIpKTsKKworICAvLyBUaGUgIkZpbHRlciIgYW5kICJEZWNvZGVQYXJtcyIgZmllbGRzIHNob3VsZCBub3QgYmUgY2hhbmdlZC4KKyAgRVhQRUNUX0VRKHN0cmVhbS0+R2V0RGljdCgpLT5HZXRVbmljb2RlVGV4dEZvcigiRmlsdGVyIiksIEwiU29tZUZpbHRlciIpOworICBFWFBFQ1RfRVEoc3RyZWFtLT5HZXREaWN0KCktPkdldFVuaWNvZGVUZXh0Rm9yKCJEZWNvZGVQYXJtcyIpLCBMIlNvbWVQYXJhbXMiKTsKK30KKworVEVTVChQREZTdHJlYW1UZXN0LCBTZXREYXRhQW5kUmVtb3ZlRmlsdGVyKSB7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGEoMTAwKTsKKyAgYXV0byBzdHJlYW0gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJlYW0+KCk7CisgIHN0cmVhbS0+SW5pdFN0cmVhbShkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigpKTsKKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PGludD4oZGF0YS5zaXplKCkpLAorICAgICAgICAgICAgc3RyZWFtLT5HZXREaWN0KCktPkdldEludGVnZXJGb3IoIkxlbmd0aCIpKTsKKworICBzdHJlYW0tPkdldERpY3QoKS0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigiRmlsdGVyIiwgTCJTb21lRmlsdGVyIik7CisgIHN0cmVhbS0+R2V0RGljdCgpLT5TZXROZXdGb3I8Q1BERl9TdHJpbmc+KCJEZWNvZGVQYXJtcyIsIEwiU29tZVBhcmFtcyIpOworCisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG5ld19kYXRhKGRhdGEuc2l6ZSgpICogMik7CisgIHN0cmVhbS0+U2V0RGF0YUFuZFJlbW92ZUZpbHRlcihuZXdfZGF0YS5kYXRhKCksIG5ld19kYXRhLnNpemUoKSk7CisgIC8vIFRoZSAiTGVuZ3RoIiBmaWVsZCBzaG91bGQgYmUgdXBkYXRlZCBmb3IgbmV3IGRhdGEgc2l6ZS4KKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PGludD4obmV3X2RhdGEuc2l6ZSgpKSwKKyAgICAgICAgICAgIHN0cmVhbS0+R2V0RGljdCgpLT5HZXRJbnRlZ2VyRm9yKCJMZW5ndGgiKSk7CisKKyAgLy8gVGhlICJGaWx0ZXIiIGFuZCAiRGVjb2RlUGFybXMiIHNob3VsZCBiZSByZW1vdmVkLgorICBFWFBFQ1RfRkFMU0Uoc3RyZWFtLT5HZXREaWN0KCktPktleUV4aXN0KCJGaWx0ZXIiKSk7CisgIEVYUEVDVF9GQUxTRShzdHJlYW0tPkdldERpY3QoKS0+S2V5RXhpc3QoIkRlY29kZVBhcm1zIikpOworfQorCitURVNUKFBERlN0cmVhbVRlc3QsIExlbmd0aEluRGljdGlvbmFyeU9uQ3JlYXRlKSB7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga0J1ZlNpemUgPSAxMDA7CisgIC8vIFRoZSBsZW5ndGggZmllbGQgc2hvdWxkIGJlIGNyZWF0ZWQgb24gc3RyZWFtIGNyZWF0ZS4KKyAgeworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90LCBGeEZyZWVEZWxldGVyPiBkYXRhOworICAgIGRhdGEucmVzZXQoRlhfQWxsb2ModWludDhfdCwga0J1ZlNpemUpKTsKKyAgICBhdXRvIHN0cmVhbSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmVhbT4oCisgICAgICAgIHN0ZDo6bW92ZShkYXRhKSwga0J1ZlNpemUsIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCkpOworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxpbnQ+KGtCdWZTaXplKSwKKyAgICAgICAgICAgICAgc3RyZWFtLT5HZXREaWN0KCktPkdldEludGVnZXJGb3IoIkxlbmd0aCIpKTsKKyAgfQorICAvLyBUaGUgbGVuZ3RoIGZpZWxkIHNob3VsZCBiZSBjb3JyZWN0ZWQgb24gc3RyZWFtIGNyZWF0ZS4KKyAgeworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90LCBGeEZyZWVEZWxldGVyPiBkYXRhOworICAgIGRhdGEucmVzZXQoRlhfQWxsb2ModWludDhfdCwga0J1ZlNpemUpKTsKKyAgICBhdXRvIGRpY3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigpOworICAgIGRpY3QtPlNldE5ld0ZvcjxDUERGX051bWJlcj4oIkxlbmd0aCIsIDMwMDAwKTsKKyAgICBhdXRvIHN0cmVhbSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmVhbT4oc3RkOjptb3ZlKGRhdGEpLCBrQnVmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGRpY3QpKTsKKyAgICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8aW50PihrQnVmU2l6ZSksCisgICAgICAgICAgICAgIHN0cmVhbS0+R2V0RGljdCgpLT5HZXRJbnRlZ2VyRm9yKCJMZW5ndGgiKSk7CisgIH0KK30KKwogVEVTVChQREZEaWN0aW9uYXJ5VGVzdCwgQ2xvbmVEaXJlY3RPYmplY3QpIHsKICAgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciBvYmplY3RzX2hvbGRlcjsKLSAgc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeT4gZGljdChuZXcgQ1BERl9EaWN0aW9uYXJ5KCkpOworICBhdXRvIGRpY3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigpOwogICBkaWN0LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJmb28iLCAmb2JqZWN0c19ob2xkZXIsIDEyMzQpOwogICBBU1NFUlRfRVEoMVUsIGRpY3QtPkdldENvdW50KCkpOwogICBDUERGX09iamVjdCogb2JqID0gZGljdC0+R2V0T2JqZWN0Rm9yKCJmb28iKTsKQEAgLTc5NSw3ICs4NjgsNyBAQAogCiAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0RpY3Rpb25hcnk+IGNsb25lZF9kaWN0ID0KICAgICAgIFRvRGljdGlvbmFyeShzdGQ6Om1vdmUoY2xvbmVkX2RpY3Rfb2JqZWN0KSk7Ci0gIEFTU0VSVF9FUSgxVSwgY2xvbmVkX2RpY3QtPkdldENvdW50KCkpOworICBBU1NFUlRfRVEoMFUsIGNsb25lZF9kaWN0LT5HZXRDb3VudCgpKTsKICAgQ1BERl9PYmplY3QqIGNsb25lZF9vYmogPSBjbG9uZWRfZGljdC0+R2V0T2JqZWN0Rm9yKCJmb28iKTsKICAgRVhQRUNUX0ZBTFNFKGNsb25lZF9vYmopOwogfQpAQCAtODU5LDcgKzkzMiw3IEBACiAgICAgQ1BERl9PYmplY3QqIGNsb25lZF9hcnIgPSBjbG9uZWRfZGljdC0+R2V0T2JqZWN0Rm9yKCJhcnIiKTsKICAgICBBU1NFUlRfVFJVRShjbG9uZWRfYXJyKTsKICAgICBBU1NFUlRfVFJVRShjbG9uZWRfYXJyLT5Jc0FycmF5KCkpOwotICAgIEVYUEVDVF9FUSgxdSwgY2xvbmVkX2Fyci0+QXNBcnJheSgpLT5HZXRDb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMFUsIGNsb25lZF9hcnItPkFzQXJyYXkoKS0+R2V0Q291bnQoKSk7CiAgICAgLy8gUmVjdXJzaXZlbHkgcmVmZXJlbmNlZCBvYmplY3QgaXMgbm90IGNsb25lZC4KICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgY2xvbmVkX2Fyci0+QXNBcnJheSgpLT5HZXRPYmplY3RBdCgwKSk7CiAgIH0KQEAgLTg2Nyw3ICs5NDAsNyBAQAogCiBURVNUKFBERkRpY3Rpb25hcnlUZXN0LCBDb252ZXJ0SW5kaXJlY3QpIHsKICAgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciBvYmplY3RzX2hvbGRlcjsKLSAgc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeT4gZGljdChuZXcgQ1BERl9EaWN0aW9uYXJ5KTsKKyAgYXV0byBkaWN0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4oKTsKICAgQ1BERl9PYmplY3QqIHBPYmogPSBkaWN0LT5TZXROZXdGb3I8Q1BERl9OdW1iZXI+KCJjbGFtcyIsIDQyKTsKICAgZGljdC0+Q29udmVydFRvSW5kaXJlY3RPYmplY3RGb3IoImNsYW1zIiwgJm9iamVjdHNfaG9sZGVyKTsKICAgQ1BERl9PYmplY3QqIHBSZWYgPSBkaWN0LT5HZXRPYmplY3RGb3IoImNsYW1zIik7CkBAIC04NzgsMyArOTUxLDEzIEBACiAgIEVYUEVDVF9FUShwT2JqLCBwTnVtKTsKICAgRVhQRUNUX0VRKDQyLCBkaWN0LT5HZXRJbnRlZ2VyRm9yKCJjbGFtcyIpKTsKIH0KKworVEVTVChQREZEaWN0aW9uYXJ5VGVzdCwgRXh0cmFjdE9iamVjdE9uUmVtb3ZlKSB7CisgIGF1dG8gZGljdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCk7CisgIENQREZfT2JqZWN0KiBwT2JqID0gZGljdC0+U2V0TmV3Rm9yPENQREZfTnVtYmVyPigiY2hpbGQiLCA0Mik7CisgIGF1dG8gZXh0cmFjdGVkX29iamVjdCA9IGRpY3QtPlJlbW92ZUZvcigiY2hpbGQiKTsKKyAgRVhQRUNUX0VRKHBPYmosIGV4dHJhY3RlZF9vYmplY3QuZ2V0KCkpOworCisgIGV4dHJhY3RlZF9vYmplY3QgPSBkaWN0LT5SZW1vdmVGb3IoIm5vbl9leGlzdHNfb2JqZWN0Iik7CisgIEVYUEVDVF9GQUxTRShleHRyYWN0ZWRfb2JqZWN0KTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3Rfd2Fsa2VyLmNwcCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3Rfd2Fsa2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjU5YTA1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdF93YWxrZXIuY3BwCkBAIC0wLDAgKzEsMTY1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfb2JqZWN0X3dhbGtlci5oIgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbS5oIgorCituYW1lc3BhY2UgeworCitjbGFzcyBTdHJlYW1JdGVyYXRvciA6IHB1YmxpYyBDUERGX09iamVjdFdhbGtlcjo6U3Vib2JqZWN0SXRlcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgU3RyZWFtSXRlcmF0b3IoY29uc3QgQ1BERl9TdHJlYW0qIHN0cmVhbSkKKyAgICAgIDogU3Vib2JqZWN0SXRlcmF0b3Ioc3RyZWFtKSB7fQorICB+U3RyZWFtSXRlcmF0b3IoKSBvdmVycmlkZSB7fQorCisgIGJvb2wgSXNGaW5pc2hlZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIElzU3RhcnRlZCgpICYmIGlzX2ZpbmlzaGVkXzsgfQorCisgIGNvbnN0IENQREZfT2JqZWN0KiBJbmNyZW1lbnRJbXBsKCkgb3ZlcnJpZGUgeworICAgIEFTU0VSVChJc1N0YXJ0ZWQoKSk7CisgICAgQVNTRVJUKCFJc0ZpbmlzaGVkKCkpOworICAgIGlzX2ZpbmlzaGVkXyA9IHRydWU7CisgICAgcmV0dXJuIG9iamVjdCgpLT5HZXREaWN0KCk7CisgIH0KKworICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGUge30KKworIHByaXZhdGU6CisgIGJvb2wgaXNfZmluaXNoZWRfID0gZmFsc2U7Cit9OworCitjbGFzcyBEaWN0aW9uYXJ5SXRlcmF0b3IgOiBwdWJsaWMgQ1BERl9PYmplY3RXYWxrZXI6OlN1Ym9iamVjdEl0ZXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IERpY3Rpb25hcnlJdGVyYXRvcihjb25zdCBDUERGX0RpY3Rpb25hcnkqIGRpY3Rpb25hcnkpCisgICAgICA6IFN1Ym9iamVjdEl0ZXJhdG9yKGRpY3Rpb25hcnkpIHt9CisgIH5EaWN0aW9uYXJ5SXRlcmF0b3IoKSBvdmVycmlkZSB7fQorCisgIGJvb2wgSXNGaW5pc2hlZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSXNTdGFydGVkKCkgJiYgZGljdF9pdGVyYXRvcl8gPT0gb2JqZWN0KCktPkdldERpY3QoKS0+ZW5kKCk7CisgIH0KKworICBjb25zdCBDUERGX09iamVjdCogSW5jcmVtZW50SW1wbCgpIG92ZXJyaWRlIHsKKyAgICBBU1NFUlQoSXNTdGFydGVkKCkpOworICAgIEFTU0VSVCghSXNGaW5pc2hlZCgpKTsKKyAgICBjb25zdCBDUERGX09iamVjdCogcmVzdWx0ID0gZGljdF9pdGVyYXRvcl8tPnNlY29uZC5nZXQoKTsKKyAgICBkaWN0X2tleV8gPSBkaWN0X2l0ZXJhdG9yXy0+Zmlyc3Q7CisgICAgKytkaWN0X2l0ZXJhdG9yXzsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgdm9pZCBTdGFydCgpIG92ZXJyaWRlIHsKKyAgICBBU1NFUlQoIUlzU3RhcnRlZCgpKTsKKyAgICBkaWN0X2l0ZXJhdG9yXyA9IG9iamVjdCgpLT5HZXREaWN0KCktPmJlZ2luKCk7CisgIH0KKworICBjb25zdCBCeXRlU3RyaW5nJiBkaWN0X2tleSgpIGNvbnN0IHsgcmV0dXJuIGRpY3Rfa2V5XzsgfQorCisgcHJpdmF0ZToKKyAgQ1BERl9EaWN0aW9uYXJ5Ojpjb25zdF9pdGVyYXRvciBkaWN0X2l0ZXJhdG9yXzsKKyAgQnl0ZVN0cmluZyBkaWN0X2tleV87Cit9OworCitjbGFzcyBBcnJheUl0ZXJhdG9yIDogcHVibGljIENQREZfT2JqZWN0V2Fsa2VyOjpTdWJvYmplY3RJdGVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBBcnJheUl0ZXJhdG9yKGNvbnN0IENQREZfQXJyYXkqIGFycmF5KSA6IFN1Ym9iamVjdEl0ZXJhdG9yKGFycmF5KSB7fQorCisgIH5BcnJheUl0ZXJhdG9yKCkgb3ZlcnJpZGUge30KKworICBib29sIElzRmluaXNoZWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIElzU3RhcnRlZCgpICYmIGFycl9pdGVyYXRvcl8gPT0gb2JqZWN0KCktPkFzQXJyYXkoKS0+ZW5kKCk7CisgIH0KKworICBjb25zdCBDUERGX09iamVjdCogSW5jcmVtZW50SW1wbCgpIG92ZXJyaWRlIHsKKyAgICBBU1NFUlQoSXNTdGFydGVkKCkpOworICAgIEFTU0VSVCghSXNGaW5pc2hlZCgpKTsKKyAgICBjb25zdCBDUERGX09iamVjdCogcmVzdWx0ID0gYXJyX2l0ZXJhdG9yXy0+Z2V0KCk7CisgICAgKythcnJfaXRlcmF0b3JfOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICB2b2lkIFN0YXJ0KCkgb3ZlcnJpZGUgeyBhcnJfaXRlcmF0b3JfID0gb2JqZWN0KCktPkFzQXJyYXkoKS0+YmVnaW4oKTsgfQorCisgcHVibGljOgorICBDUERGX0FycmF5Ojpjb25zdF9pdGVyYXRvciBhcnJfaXRlcmF0b3JfOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NQREZfT2JqZWN0V2Fsa2VyOjpTdWJvYmplY3RJdGVyYXRvcjo6flN1Ym9iamVjdEl0ZXJhdG9yKCkge30KKworY29uc3QgQ1BERl9PYmplY3QqIENQREZfT2JqZWN0V2Fsa2VyOjpTdWJvYmplY3RJdGVyYXRvcjo6SW5jcmVtZW50KCkgeworICBpZiAoIUlzU3RhcnRlZCgpKSB7CisgICAgU3RhcnQoKTsKKyAgICBpc19zdGFydGVkXyA9IHRydWU7CisgIH0KKyAgd2hpbGUgKCFJc0ZpbmlzaGVkKCkpIHsKKyAgICBjb25zdCBDUERGX09iamVjdCogcmVzdWx0ID0gSW5jcmVtZW50SW1wbCgpOworICAgIGlmIChyZXN1bHQpCisgICAgICByZXR1cm4gcmVzdWx0OworICB9CisgIHJldHVybiBudWxscHRyOworfQorCitDUERGX09iamVjdFdhbGtlcjo6U3Vib2JqZWN0SXRlcmF0b3I6OlN1Ym9iamVjdEl0ZXJhdG9yKAorICAgIGNvbnN0IENQREZfT2JqZWN0KiBvYmplY3QpCisgICAgOiBvYmplY3RfKG9iamVjdCkgeworICBBU1NFUlQob2JqZWN0Xyk7Cit9CisKKy8vIHN0YXRpYworc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0V2Fsa2VyOjpTdWJvYmplY3RJdGVyYXRvcj4KK0NQREZfT2JqZWN0V2Fsa2VyOjpNYWtlSXRlcmF0b3IoY29uc3QgQ1BERl9PYmplY3QqIG9iamVjdCkgeworICBpZiAob2JqZWN0LT5Jc1N0cmVhbSgpKQorICAgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8U3RyZWFtSXRlcmF0b3I+KG9iamVjdC0+QXNTdHJlYW0oKSk7CisgIGlmIChvYmplY3QtPklzRGljdGlvbmFyeSgpKQorICAgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8RGljdGlvbmFyeUl0ZXJhdG9yPihvYmplY3QtPkFzRGljdGlvbmFyeSgpKTsKKyAgaWYgKG9iamVjdC0+SXNBcnJheSgpKQorICAgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8QXJyYXlJdGVyYXRvcj4ob2JqZWN0LT5Bc0FycmF5KCkpOworICByZXR1cm4gbnVsbHB0cjsKK30KKworQ1BERl9PYmplY3RXYWxrZXI6OkNQREZfT2JqZWN0V2Fsa2VyKGNvbnN0IENQREZfT2JqZWN0KiByb290KQorICAgIDogbmV4dF9vYmplY3RfKHJvb3QpLCBwYXJlbnRfb2JqZWN0XyhudWxscHRyKSwgY3VycmVudF9kZXB0aF8oMCkge30KKworQ1BERl9PYmplY3RXYWxrZXI6On5DUERGX09iamVjdFdhbGtlcigpIHt9CisKK2NvbnN0IENQREZfT2JqZWN0KiBDUERGX09iamVjdFdhbGtlcjo6R2V0TmV4dCgpIHsKKyAgd2hpbGUgKCFzdGFja18uZW1wdHkoKSB8fCBuZXh0X29iamVjdF8pIHsKKyAgICBpZiAobmV4dF9vYmplY3RfKSB7CisgICAgICBhdXRvIG5ld19pdGVyYXRvciA9IE1ha2VJdGVyYXRvcihuZXh0X29iamVjdF8pOworICAgICAgaWYgKG5ld19pdGVyYXRvcikgeworICAgICAgICAvLyBTY2hlZHVsZSB3YWxrIHdpdGhpbiBjb21wb3NpdGUgb2JqZWN0cy4KKyAgICAgICAgc3RhY2tfLnB1c2goc3RkOjptb3ZlKG5ld19pdGVyYXRvcikpOworICAgICAgfQorICAgICAgYXV0byogcmVzdWx0ID0gbmV4dF9vYmplY3RfOworICAgICAgbmV4dF9vYmplY3RfID0gbnVsbHB0cjsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgU3Vib2JqZWN0SXRlcmF0b3IqIGl0ID0gc3RhY2tfLnRvcCgpLmdldCgpOworICAgIGlmIChpdC0+SXNGaW5pc2hlZCgpKSB7CisgICAgICBzdGFja18ucG9wKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG5leHRfb2JqZWN0XyA9IGl0LT5JbmNyZW1lbnQoKTsKKyAgICAgIHBhcmVudF9vYmplY3RfID0gaXQtPm9iamVjdCgpOworICAgICAgZGljdF9rZXlfID0gcGFyZW50X29iamVjdF8tPklzRGljdGlvbmFyeSgpCisgICAgICAgICAgICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxEaWN0aW9uYXJ5SXRlcmF0b3IqPihpdCktPmRpY3Rfa2V5KCkKKyAgICAgICAgICAgICAgICAgICAgICA6IEJ5dGVTdHJpbmcoKTsKKyAgICAgIGN1cnJlbnRfZGVwdGhfID0gc3RhY2tfLnNpemUoKTsKKyAgICB9CisgIH0KKyAgZGljdF9rZXlfID0gQnl0ZVN0cmluZygpOworICBjdXJyZW50X2RlcHRoXyA9IDA7CisgIHJldHVybiBudWxscHRyOworfQorCit2b2lkIENQREZfT2JqZWN0V2Fsa2VyOjpTa2lwV2Fsa0ludG9DdXJyZW50T2JqZWN0KCkgeworICBpZiAoc3RhY2tfLmVtcHR5KCkgfHwgc3RhY2tfLnRvcCgpLT5Jc1N0YXJ0ZWQoKSkKKyAgICByZXR1cm47CisgIHN0YWNrXy5wb3AoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3Rfd2Fsa2VyLmggYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfb2JqZWN0X3dhbGtlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYWQzYzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfb2JqZWN0X3dhbGtlci5oCkBAIC0wLDAgKzEsNjkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBDT1JFX0ZQREZBUElfUEFSU0VSX0NQREZfT0JKRUNUX1dBTEtFUl9IXworI2RlZmluZSBDT1JFX0ZQREZBUElfUEFSU0VSX0NQREZfT0JKRUNUX1dBTEtFUl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0YWNrPgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKKworLy8gV2FsayBvbiBhbGwgbm9uLW51bGwgc3ViLW9iamVjdHMgaW4gYW4gb2JqZWN0IGluIGRlcHRoLCBpbmNsdWRlIGl0c2VsZiwKKy8vIGxpa2UgaW4gZmxhdCBsaXN0LgorY2xhc3MgQ1BERl9PYmplY3RXYWxrZXIgeworIHB1YmxpYzoKKyAgY2xhc3MgU3Vib2JqZWN0SXRlcmF0b3IgeworICAgcHVibGljOgorICAgIHZpcnR1YWwgflN1Ym9iamVjdEl0ZXJhdG9yKCk7CisgICAgYm9vbCBJc1N0YXJ0ZWQoKSBjb25zdCB7IHJldHVybiBpc19zdGFydGVkXzsgfQorICAgIGJvb2wgdmlydHVhbCBJc0ZpbmlzaGVkKCkgY29uc3QgPSAwOworICAgIGNvbnN0IENQREZfT2JqZWN0KiBJbmNyZW1lbnQoKTsKKyAgICBjb25zdCBDUERGX09iamVjdCogb2JqZWN0KCkgY29uc3QgeyByZXR1cm4gb2JqZWN0XzsgfQorCisgICBwcm90ZWN0ZWQ6CisgICAgZXhwbGljaXQgU3Vib2JqZWN0SXRlcmF0b3IoY29uc3QgQ1BERl9PYmplY3QqIG9iamVjdCk7CisKKyAgICB2aXJ0dWFsIGNvbnN0IENQREZfT2JqZWN0KiBJbmNyZW1lbnRJbXBsKCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBTdGFydCgpID0gMDsKKworICAgcHJpdmF0ZToKKyAgICBjb25zdCBDUERGX09iamVjdCogb2JqZWN0XzsKKyAgICBib29sIGlzX3N0YXJ0ZWRfID0gZmFsc2U7CisgIH07CisKKyAgZXhwbGljaXQgQ1BERl9PYmplY3RXYWxrZXIoY29uc3QgQ1BERl9PYmplY3QqIHJvb3QpOworICB+Q1BERl9PYmplY3RXYWxrZXIoKTsKKworICBjb25zdCBDUERGX09iamVjdCogR2V0TmV4dCgpOworICB2b2lkIFNraXBXYWxrSW50b0N1cnJlbnRPYmplY3QoKTsKKworICBzaXplX3QgY3VycmVudF9kZXB0aCgpIGNvbnN0IHsgcmV0dXJuIGN1cnJlbnRfZGVwdGhfOyB9CisgIGNvbnN0IENQREZfT2JqZWN0KiBHZXRQYXJlbnQoKSBjb25zdCB7IHJldHVybiBwYXJlbnRfb2JqZWN0XzsgfQorICBjb25zdCBCeXRlU3RyaW5nJiBkaWN0aW9uYXJ5X2tleSgpIGNvbnN0IHsgcmV0dXJuIGRpY3Rfa2V5XzsgfQorCisgcHJpdmF0ZToKKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxTdWJvYmplY3RJdGVyYXRvcj4gTWFrZUl0ZXJhdG9yKAorICAgICAgY29uc3QgQ1BERl9PYmplY3QqIG9iamVjdCk7CisKKyAgY29uc3QgQ1BERl9PYmplY3QqIG5leHRfb2JqZWN0XzsKKyAgY29uc3QgQ1BERl9PYmplY3QqIHBhcmVudF9vYmplY3RfOworCisgIEJ5dGVTdHJpbmcgZGljdF9rZXlfOworICBzaXplX3QgY3VycmVudF9kZXB0aF87CisKKyAgc3RkOjpzdGFjazxzdGQ6OnVuaXF1ZV9wdHI8U3Vib2JqZWN0SXRlcmF0b3I+PiBzdGFja187Cit9OworCitjbGFzcyBDUERGX05vbkNvbnN0T2JqZWN0V2Fsa2VyIDogcHVibGljIENQREZfT2JqZWN0V2Fsa2VyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENQREZfTm9uQ29uc3RPYmplY3RXYWxrZXIoQ1BERl9PYmplY3QqIHJvb3QpCisgICAgICA6IENQREZfT2JqZWN0V2Fsa2VyKHJvb3QpIHt9CisKKyAgQ1BERl9PYmplY3QqIEdldE5leHQoKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q1BERl9PYmplY3QqPihDUERGX09iamVjdFdhbGtlcjo6R2V0TmV4dCgpKTsKKyAgfQorfTsKKworI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfUEFSU0VSX0NQREZfT0JKRUNUX1dBTEtFUl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdF93YWxrZXJfdW5pdHRlc3QuY3BwIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdF93YWxrZXJfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZmZlODQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfb2JqZWN0X3dhbGtlcl91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxNDUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3Rfd2Fsa2VyLmgiCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2Jvb2xlYW4uaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9uYW1lLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bGwuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbnVtYmVyLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3JlZmVyZW5jZS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyaW5nLmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitzdGQ6OnN0cmluZyBXYWxrKENQREZfT2JqZWN0KiBvYmplY3QpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgQ1BERl9PYmplY3RXYWxrZXIgd2Fsa2VyKG9iamVjdCk7CisgIHdoaWxlIChjb25zdCBDUERGX09iamVjdCogb2JqID0gd2Fsa2VyLkdldE5leHQoKSkgeworICAgIGlmIChvYmotPklzRGljdGlvbmFyeSgpKQorICAgICAgcmVzdWx0IDw8ICIgRGljdCI7CisgICAgZWxzZSBpZiAob2JqLT5Jc0FycmF5KCkpCisgICAgICByZXN1bHQgPDwgIiBBcnIiOworICAgIGVsc2UgaWYgKG9iai0+SXNTdHJpbmcoKSkKKyAgICAgIHJlc3VsdCA8PCAiIFN0ciI7CisgICAgZWxzZSBpZiAob2JqLT5Jc0Jvb2xlYW4oKSkKKyAgICAgIHJlc3VsdCA8PCAiIEJvb2wiOworICAgIGVsc2UgaWYgKG9iai0+SXNTdHJlYW0oKSkKKyAgICAgIHJlc3VsdCA8PCAiIFN0cmVhbSI7CisgICAgZWxzZSBpZiAob2JqLT5Jc1JlZmVyZW5jZSgpKQorICAgICAgcmVzdWx0IDw8ICIgUmVmIjsKKyAgICBlbHNlIGlmIChvYmotPklzTnVtYmVyKCkpCisgICAgICByZXN1bHQgPDwgIiBOdW0iOworICAgIGVsc2UgaWYgKG9iai0+SXNOdWxsKCkpCisgICAgICByZXN1bHQgPDwgIiBOdWxsIjsKKyAgICBlbHNlCisgICAgICByZXN1bHQgPDwgIiBVbmtub3duIjsKKyAgfQorICBzdGQ6OnN0cmluZyByZXN1bHRfc3RyID0gcmVzdWx0LnN0cigpOworICBpZiAoIXJlc3VsdF9zdHIuZW1wdHkoKSkgeworICAgIHJlc3VsdF9zdHIuZXJhc2UocmVzdWx0X3N0ci5iZWdpbigpKTsgIC8vIHJlbW92ZSBzdGFydCBzcGFjZQorICB9CisgIHJldHVybiByZXN1bHRfc3RyOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVChDUERGX09iamVjdFdhbGtlclRlc3QsIFNpbXBsZSkgeworICBFWFBFQ1RfRVEoV2FsayhwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9OdWxsPigpLmdldCgpKSwgIk51bGwiKTsKKyAgRVhQRUNUX0VRKFdhbGsocGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4oKS5nZXQoKSksICJEaWN0Iik7CisgIEVYUEVDVF9FUShXYWxrKHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0FycmF5PigpLmdldCgpKSwgIkFyciIpOworICBFWFBFQ1RfRVEoV2FsayhwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJpbmc+KCkuZ2V0KCkpLCAiU3RyIik7CisgIEVYUEVDVF9FUShXYWxrKHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0Jvb2xlYW4+KCkuZ2V0KCkpLCAiQm9vbCIpOworICBFWFBFQ1RfRVEoV2FsayhwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJlYW0+KCkuZ2V0KCkpLCAiU3RyZWFtIik7CisgIEVYUEVDVF9FUShXYWxrKHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1JlZmVyZW5jZT4obnVsbHB0ciwgMCkuZ2V0KCkpLCAiUmVmIik7Cit9CisKK1RFU1QoQ1BERl9PYmplY3RXYWxrZXJUZXN0LCBDb21iaW5lZE9iamVjdCkgeworICBhdXRvIGRpY3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigpOworICBkaWN0LT5TZXRGb3IoIjEiLCBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJpbmc+KCkpOworICBkaWN0LT5TZXRGb3IoIjIiLCBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9Cb29sZWFuPigpKTsKKyAgYXV0byBhcnJheSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0FycmF5PigpOworICBhcnJheS0+QWRkKHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1JlZmVyZW5jZT4obnVsbHB0ciwgMCkpOworICBhcnJheS0+QWRkKHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX051bGw+KCkpOworICBhcnJheS0+QWRkKHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmVhbT4oCisgICAgICBudWxscHRyLCAwLCBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigpKSk7CisgIGRpY3QtPlNldEZvcigiMyIsIHN0ZDo6bW92ZShhcnJheSkpOworICAvLyBUaGUgbGFzdCBudW1iZXIgZm9yIHN0cmVhbSBsZW5ndGguCisgIEVYUEVDVF9FUShXYWxrKGRpY3QuZ2V0KCkpLCAiRGljdCBTdHIgQm9vbCBBcnIgUmVmIE51bGwgU3RyZWFtIERpY3QgTnVtIik7Cit9CisKK1RFU1QoQ1BERl9PYmplY3RXYWxrZXJUZXN0LCBHZXRQYXJlbnQpIHsKKyAgYXV0byBsZXZlbF80ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfTnVtYmVyPigwKTsKKyAgYXV0byBsZXZlbF8zID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4oKTsKKyAgbGV2ZWxfMy0+U2V0Rm9yKCJMZW5ndGgiLCBzdGQ6Om1vdmUobGV2ZWxfNCkpOworICBhdXRvIGxldmVsXzIgPQorICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU3RyZWFtPihudWxscHRyLCAwLCBzdGQ6Om1vdmUobGV2ZWxfMykpOworICBhdXRvIGxldmVsXzEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9BcnJheT4oKTsKKyAgbGV2ZWxfMS0+QWRkKHN0ZDo6bW92ZShsZXZlbF8yKSk7CisgIGF1dG8gbGV2ZWxfMCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCk7CisgIGxldmVsXzAtPlNldEZvcigiQXJyYXkiLCBzdGQ6Om1vdmUobGV2ZWxfMSkpOworCisgIC8vIFdlIGhhdmUgPDwvQXJyYXkgWyBzdHJlYW0oIDw8IC9MZW5ndGggMCA+PikgXT4+CisgIC8vIEluIHRoaXMgY2FzZSBlYWNoIHN0ZXAgd2lsbCBpbmNyZWFzZSBkZXB0aC4KKyAgLy8gQW5kIG9uIGVhY2ggc3RlcCB0aGUgcHJldiBvYmplY3Qgc2hvdWxkIGJlIHBhcmVudCBmb3IgY3VycmVudC4KKyAgY29uc3QgQ1BERl9PYmplY3QqIGN1cl9wYXJlbnQgPSBudWxscHRyOworICBDUERGX09iamVjdFdhbGtlciB3YWxrZXIobGV2ZWxfMC5nZXQoKSk7CisgIHdoaWxlIChjb25zdCBDUERGX09iamVjdCogb2JqID0gd2Fsa2VyLkdldE5leHQoKSkgeworICAgIEVYUEVDVF9FUShjdXJfcGFyZW50LCB3YWxrZXIuR2V0UGFyZW50KCkpOworICAgIGN1cl9wYXJlbnQgPSBvYmo7CisgIH0KK30KKworVEVTVChDUERGX09iamVjdFdhbGtlclRlc3QsIFNraXBXYWxrSW50b0N1cnJlbnRPYmplY3QpIHsKKyAgYXV0byByb290X2FycmF5ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfQXJyYXk+KCk7CisgIC8vIEFkZCAyIG51bGwgb2JqZWN0cyBpbnRvIHxyb290X2FycmF5fC4gWyBudWxsMSwgbnVsbDIgXQorICByb290X2FycmF5LT5BZGROZXc8Q1BERl9OdWxsPigpOworICByb290X2FycmF5LT5BZGROZXc8Q1BERl9OdWxsPigpOworICAvLyB8cm9vdF9hcnJheXwgd2lsbCBjb250YWluIDQgbnVsbCBvYmplY3RzIGFmdGVyIHRoaXMuCisgIC8vIFsgbnVsbDEsIG51bGwyLCBbIG51bGwzLCBudWxsNCBdIF0KKyAgcm9vdF9hcnJheS0+QWRkKHJvb3RfYXJyYXktPkNsb25lKCkpOworCisgIGludCBub25fYXJyYXlfb2JqZWN0cyA9IDA7CisgIENQREZfT2JqZWN0V2Fsa2VyIHdhbGtlcihyb290X2FycmF5LmdldCgpKTsKKyAgd2hpbGUgKGNvbnN0IENQREZfT2JqZWN0KiBvYmogPSB3YWxrZXIuR2V0TmV4dCgpKSB7CisgICAgaWYgKG9iaiAhPSByb290X2FycmF5LmdldCgpICYmIG9iai0+SXNBcnJheSgpKSB7CisgICAgICAvLyBza2lwIG90aGVyIGFycmF5IGV4Y2VwdCByb290LgorICAgICAgd2Fsa2VyLlNraXBXYWxrSW50b0N1cnJlbnRPYmplY3QoKTsKKyAgICB9CisgICAgaWYgKCFvYmotPklzQXJyYXkoKSkKKyAgICAgICsrbm9uX2FycmF5X29iamVjdHM7CisgIH0KKyAgLy8gMiBvYmplY3RzIGZyb20gY2hpbGQgYXJyYXkgc2hvdWxkIGJlIHNraXBwZWQuCisgIEVYUEVDVF9FUSgyLCBub25fYXJyYXlfb2JqZWN0cyk7Cit9CisKK1RFU1QoQ1BERl9PYmplY3RXYWxrZXJUZXN0LCBEaWN0aW9uYXJ5S2V5KSB7CisgIGF1dG8gZGljdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCk7CisgIGRpY3QtPlNldEZvcigiMSIsIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX051bGw+KCkpOworICBkaWN0LT5TZXRGb3IoIjIiLCBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9OdWxsPigpKTsKKyAgZGljdC0+U2V0Rm9yKCIzIiwgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfTnVsbD4oKSk7CisgIGRpY3QtPlNldEZvcigiNCIsIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX051bGw+KCkpOworICBkaWN0LT5TZXRGb3IoIjUiLCBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9OdWxsPigpKTsKKworICBDUERGX09iamVjdFdhbGtlciB3YWxrZXIoZGljdC5nZXQoKSk7CisgIHdoaWxlIChjb25zdCBDUERGX09iamVjdCogb2JqID0gd2Fsa2VyLkdldE5leHQoKSkgeworICAgIGlmIChvYmogPT0gZGljdC5nZXQoKSkgeworICAgICAgLy8gSWdub3JlIHJvb3QgZGljdGluYXJ5IG9iamVjdAorICAgICAgY29udGludWU7CisgICAgfQorICAgIC8vIFRlc3QgdGhhdCwgZGljdGlvbmFyeSBrZXkgaXMgY29ycmVjdC4KKyAgICBFWFBFQ1RfRVEod2Fsa2VyLkdldFBhcmVudCgpLT5Bc0RpY3Rpb25hcnkoKS0+R2V0T2JqZWN0Rm9yKAorICAgICAgICAgICAgICAgICAgd2Fsa2VyLmRpY3Rpb25hcnlfa2V5KCkpLAorICAgICAgICAgICAgICBvYmopOworICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFnZV9vYmplY3RfYXZhaWwuY3BwIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3BhZ2Vfb2JqZWN0X2F2YWlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjczODg1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3BhZ2Vfb2JqZWN0X2F2YWlsLmNwcApAQCAtMCwwICsxLDE3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFnZV9vYmplY3RfYXZhaWwuaCIKKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgiCisKK0NQREZfUGFnZU9iamVjdEF2YWlsOjp+Q1BERl9QYWdlT2JqZWN0QXZhaWwoKSB7fQorCitib29sIENQREZfUGFnZU9iamVjdEF2YWlsOjpFeGNsdWRlT2JqZWN0KGNvbnN0IENQREZfT2JqZWN0KiBvYmplY3QpIGNvbnN0IHsKKyAgaWYgKENQREZfT2JqZWN0QXZhaWw6OkV4Y2x1ZGVPYmplY3Qob2JqZWN0KSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gb2JqZWN0LT5Jc0RpY3Rpb25hcnkoKSAmJgorICAgICAgICAgb2JqZWN0LT5HZXREaWN0KCktPkdldFN0cmluZ0ZvcigiVHlwZSIpID09ICJQYWdlIjsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9wYWdlX29iamVjdF9hdmFpbC5oIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3BhZ2Vfb2JqZWN0X2F2YWlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM3NDBlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9wYWdlX29iamVjdF9hdmFpbC5oCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBDT1JFX0ZQREZBUElfUEFSU0VSX0NQREZfUEFHRV9PQkpFQ1RfQVZBSUxfSF8KKyNkZWZpbmUgQ09SRV9GUERGQVBJX1BBUlNFUl9DUERGX1BBR0VfT0JKRUNUX0FWQUlMX0hfCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfb2JqZWN0X2F2YWlsLmgiCisKKy8vIEhlbHBlciBmb3IgY2hlY2sgYXZhaWxhYmlsaXR5IG9mIHBhZ2UncyBvYmplY3QgdHJlZS4KKy8vIEV4Y2x1ZGUgcmVmZXJlbmNlcyB0byBwYWdlcy4KK2NsYXNzIENQREZfUGFnZU9iamVjdEF2YWlsIDogcHVibGljIENQREZfT2JqZWN0QXZhaWwgeworIHB1YmxpYzoKKyAgdXNpbmcgQ1BERl9PYmplY3RBdmFpbDo6Q1BERl9PYmplY3RBdmFpbDsKKyAgfkNQREZfUGFnZU9iamVjdEF2YWlsKCkgb3ZlcnJpZGU7CisKKyBwcm90ZWN0ZWQ6CisgIGJvb2wgRXhjbHVkZU9iamVjdChjb25zdCBDUERGX09iamVjdCogb2JqZWN0KSBjb25zdCBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GUERGQVBJX1BBUlNFUl9DUERGX1BBR0VfT0JKRUNUX0FWQUlMX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFnZV9vYmplY3RfYXZhaWxfdW5pdHRlc3QuY3BwIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3BhZ2Vfb2JqZWN0X2F2YWlsX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGJhMGUzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3BhZ2Vfb2JqZWN0X2F2YWlsX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDEyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3BhZ2Vfb2JqZWN0X2F2YWlsLmgiCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9pbmRpcmVjdF9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3JlYWRfdmFsaWRhdG9yLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3JlZmVyZW5jZS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmVhbS5oIgorI2luY2x1ZGUgInRlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCisKK2NsYXNzIFRlc3RSZWFkVmFsaWRhdG9yIDogcHVibGljIENQREZfUmVhZFZhbGlkYXRvciB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KKyAgZnJpZW5kIFJldGFpblB0cjxUPiBwZGZpdW06Ok1ha2VSZXRhaW4oQXJncyYmLi4uIGFyZ3MpOworCisgIHZvaWQgU2ltdWxhdGVSZWFkRXJyb3IoKSB7IFJlYWRCbG9jayhudWxscHRyLCAwLCAxKTsgfQorCisgcHJvdGVjdGVkOgorICBUZXN0UmVhZFZhbGlkYXRvcigpCisgICAgICA6IENQREZfUmVhZFZhbGlkYXRvcigKKyAgICAgICAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDRlhfSW52YWxpZFNlZWthYmxlUmVhZFN0cmVhbT4oMTAwKSwKKyAgICAgICAgICAgIG51bGxwdHIpIHt9CisgIH5UZXN0UmVhZFZhbGlkYXRvcigpIG92ZXJyaWRlIHt9Cit9OworCitjbGFzcyBUZXN0SG9sZGVyIDogcHVibGljIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIgeworIHB1YmxpYzoKKyAgZW51bSBjbGFzcyBPYmplY3RTdGF0ZSB7CisgICAgVW5hdmFpbGFibGUsCisgICAgQXZhaWxhYmxlLAorICB9OworICBUZXN0SG9sZGVyKCkgOiB2YWxpZGF0b3JfKHBkZml1bTo6TWFrZVJldGFpbjxUZXN0UmVhZFZhbGlkYXRvcj4oKSkge30KKyAgflRlc3RIb2xkZXIoKSBvdmVycmlkZSB7fQorCisgIC8vIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIgb3ZlcnJpZGVzOgorICBDUERGX09iamVjdCogR2V0T3JQYXJzZUluZGlyZWN0T2JqZWN0KHVpbnQzMl90IG9iam51bSkgb3ZlcnJpZGUgeworICAgIGF1dG8gaXQgPSBvYmplY3RzX2RhdGFfLmZpbmQob2JqbnVtKTsKKyAgICBpZiAoaXQgPT0gb2JqZWN0c19kYXRhXy5lbmQoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgT2JqZWN0RGF0YSYgb2JqX2RhdGEgPSBpdC0+c2Vjb25kOworICAgIGlmIChvYmpfZGF0YS5zdGF0ZSA9PSBPYmplY3RTdGF0ZTo6VW5hdmFpbGFibGUpIHsKKyAgICAgIHZhbGlkYXRvcl8tPlNpbXVsYXRlUmVhZEVycm9yKCk7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG9ial9kYXRhLm9iamVjdC5nZXQoKTsKKyAgfQorCisgIFJldGFpblB0cjxDUERGX1JlYWRWYWxpZGF0b3I+IEdldFZhbGlkYXRvcigpIHsgcmV0dXJuIHZhbGlkYXRvcl87IH0KKworICB2b2lkIEFkZE9iamVjdCh1aW50MzJfdCBvYmpudW0sCisgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gb2JqZWN0LAorICAgICAgICAgICAgICAgICBPYmplY3RTdGF0ZSBzdGF0ZSkgeworICAgIE9iamVjdERhdGEgb2JqZWN0X2RhdGE7CisgICAgb2JqZWN0X2RhdGEub2JqZWN0ID0gc3RkOjptb3ZlKG9iamVjdCk7CisgICAgb2JqZWN0X2RhdGEuc3RhdGUgPSBzdGF0ZTsKKyAgICBBU1NFUlQob2JqZWN0c19kYXRhXy5maW5kKG9iam51bSkgPT0gb2JqZWN0c19kYXRhXy5lbmQoKSk7CisgICAgb2JqZWN0c19kYXRhX1tvYmpudW1dID0gc3RkOjptb3ZlKG9iamVjdF9kYXRhKTsKKyAgfQorCisgIHZvaWQgU2V0T2JqZWN0U3RhdGUodWludDMyX3Qgb2JqbnVtLCBPYmplY3RTdGF0ZSBzdGF0ZSkgeworICAgIGF1dG8gaXQgPSBvYmplY3RzX2RhdGFfLmZpbmQob2JqbnVtKTsKKyAgICBBU1NFUlQoaXQgIT0gb2JqZWN0c19kYXRhXy5lbmQoKSk7CisgICAgT2JqZWN0RGF0YSYgb2JqX2RhdGEgPSBpdC0+c2Vjb25kOworICAgIG9ial9kYXRhLnN0YXRlID0gc3RhdGU7CisgIH0KKworICBDUERGX09iamVjdCogR2V0VGVzdE9iamVjdCh1aW50MzJfdCBvYmpudW0pIHsKKyAgICBhdXRvIGl0ID0gb2JqZWN0c19kYXRhXy5maW5kKG9iam51bSk7CisgICAgaWYgKGl0ID09IG9iamVjdHNfZGF0YV8uZW5kKCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gaXQtPnNlY29uZC5vYmplY3QuZ2V0KCk7CisgIH0KKworIHByaXZhdGU6CisgIHN0cnVjdCBPYmplY3REYXRhIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IG9iamVjdDsKKyAgICBPYmplY3RTdGF0ZSBzdGF0ZSA9IE9iamVjdFN0YXRlOjpVbmF2YWlsYWJsZTsKKyAgfTsKKyAgc3RkOjptYXA8dWludDMyX3QsIE9iamVjdERhdGE+IG9iamVjdHNfZGF0YV87CisgIFJldGFpblB0cjxUZXN0UmVhZFZhbGlkYXRvcj4gdmFsaWRhdG9yXzsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitURVNUKENQREZfUGFnZU9iamVjdEF2YWlsVGVzdCwgRXhjbHVkZVBhZ2VzKSB7CisgIFRlc3RIb2xkZXIgaG9sZGVyOworICBob2xkZXIuQWRkT2JqZWN0KDEsIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCksCisgICAgICAgICAgICAgICAgICAgVGVzdEhvbGRlcjo6T2JqZWN0U3RhdGU6OkF2YWlsYWJsZSk7CisgIGhvbGRlci5HZXRUZXN0T2JqZWN0KDEpLT5HZXREaWN0KCktPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIktpZHMiLCAmaG9sZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOworICBob2xkZXIuQWRkT2JqZWN0KDIsIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0FycmF5PigpLAorICAgICAgICAgICAgICAgICAgIFRlc3RIb2xkZXI6Ok9iamVjdFN0YXRlOjpBdmFpbGFibGUpOworICBob2xkZXIuR2V0VGVzdE9iamVjdCgyKS0+QXNBcnJheSgpLT5BZGROZXc8Q1BERl9SZWZlcmVuY2U+KCZob2xkZXIsIDMpOworCisgIGhvbGRlci5BZGRPYmplY3QoMywgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4oKSwKKyAgICAgICAgICAgICAgICAgICBUZXN0SG9sZGVyOjpPYmplY3RTdGF0ZTo6QXZhaWxhYmxlKTsKKyAgaG9sZGVyLkdldFRlc3RPYmplY3QoMyktPkdldERpY3QoKS0+U2V0Rm9yKAorICAgICAgIlR5cGUiLCBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJpbmc+KG51bGxwdHIsICJQYWdlIiwgZmFsc2UpKTsKKyAgaG9sZGVyLkdldFRlc3RPYmplY3QoMyktPkdldERpY3QoKS0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiT3RoZXJQYWdlRGF0YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhvbGRlciwgNCk7CisgIC8vIEFkZCB1bmF2YWlsYWJsZSBvYmplY3QgcmVsYXRlZCB0byBvdGhlciBwYWdlLgorICBob2xkZXIuQWRkT2JqZWN0KAorICAgICAgNCwgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU3RyaW5nPihudWxscHRyLCAiT3RoZXIgcGFnZSBkYXRhIiwgZmFsc2UpLAorICAgICAgVGVzdEhvbGRlcjo6T2JqZWN0U3RhdGU6OlVuYXZhaWxhYmxlKTsKKworICBDUERGX1BhZ2VPYmplY3RBdmFpbCBhdmFpbChob2xkZXIuR2V0VmFsaWRhdG9yKCkuR2V0KCksICZob2xkZXIsIDEpOworICAvLyBOb3cgb2JqZWN0IHNob3VsZCBiZSBhdmFpbGFibGUsIGFsdGhvdWdoIHRoZSBvYmplY3QgJzQnIGlzIG5vdCBhdmFpbGFibGUsCisgIC8vIGJlY2F1c2UgaXQgaXMgaW4gc2tpcHBlZCBvdGhlciBwYWdlLgorICBFWFBFQ1RfRVEoQ1BERl9EYXRhQXZhaWw6OkRvY0F2YWlsU3RhdHVzOjpEYXRhQXZhaWxhYmxlLCBhdmFpbC5DaGVja0F2YWlsKCkpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3BhcnNlci5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyLmNwcAppbmRleCBmOWQ5ZWIzLi4wZDFiMDJhIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyLmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyLmNwcApAQCAtMjIsNyArMjIsOSBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW1fYWNjLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N5bnRheF9wYXJzZXIuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2ZwZGZfcGFyc2VyX3V0aWxpdHkuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvYXV0b3Jlc3RvcmVyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfbWVtb3J5c3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9leHRlbnNpb24uaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgpAQCAtMzMsNiArMzUsOCBAQAogLy8gdGhpcyBtYXkgYmUgbGFyZ2UgZW5vdWdoIGluIHByYWN0aWNlLgogY29uc3QgaW50MzJfdCBrTWF4WFJlZlNpemUgPSAxMDQ4NTc2OwogCitjb25zdGV4cHIgRlhfRklMRVNJWkUga1BERkhlYWRlclNpemUgPSA5OworCiB1aW50MzJfdCBHZXRWYXJJbnQoY29uc3QgdWludDhfdCogcCwgaW50MzJfdCBuKSB7CiAgIHVpbnQzMl90IHJlc3VsdCA9IDA7CiAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG47ICsraSkKQEAgLTQwLDMwICs0NCw5MyBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCi1pbnQzMl90IEdldFN0cmVhbU5Db3VudChDUERGX1N0cmVhbUFjYyogcE9ialN0cmVhbSkgeworaW50MzJfdCBHZXRTdHJlYW1OQ291bnQoY29uc3QgUmV0YWluUHRyPENQREZfU3RyZWFtQWNjPiYgcE9ialN0cmVhbSkgewogICByZXR1cm4gcE9ialN0cmVhbS0+R2V0RGljdCgpLT5HZXRJbnRlZ2VyRm9yKCJOIik7CiB9CiAKLWludDMyX3QgR2V0U3RyZWFtRmlyc3QoQ1BERl9TdHJlYW1BY2MqIHBPYmpTdHJlYW0pIHsKK2ludDMyX3QgR2V0U3RyZWFtRmlyc3QoY29uc3QgUmV0YWluUHRyPENQREZfU3RyZWFtQWNjPiYgcE9ialN0cmVhbSkgewogICByZXR1cm4gcE9ialN0cmVhbS0+R2V0RGljdCgpLT5HZXRJbnRlZ2VyRm9yKCJGaXJzdCIpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UKIAorY2xhc3MgQ1BERl9QYXJzZXI6OlRyYWlsZXJEYXRhIHsKKyBwdWJsaWM6CisgIFRyYWlsZXJEYXRhKCkge30KKyAgflRyYWlsZXJEYXRhKCkge30KKworICBDUERGX0RpY3Rpb25hcnkqIEdldE1haW5UcmFpbGVyKCkgY29uc3QgeyByZXR1cm4gbWFpbl90cmFpbGVyXy5nZXQoKTsgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0RpY3Rpb25hcnk+IEdldENvbWJpbmVkVHJhaWxlcigpIGNvbnN0IHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5PiByZXN1bHQgPQorICAgICAgICBUb0RpY3Rpb25hcnkobWFpbl90cmFpbGVyXy0+Q2xvbmUoKSk7CisKKyAgICAvLyBJbmZvIGlzIG9wdGlvbmFsLgorICAgIHVpbnQzMl90IGluZm9fb2JqX251bSA9IEdldEluZm9PYmpOdW0oKTsKKyAgICBpZiAoaW5mb19vYmpfbnVtID4gMCkKKyAgICAgIHJlc3VsdC0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiSW5mbyIsIG51bGxwdHIsIEdldEluZm9PYmpOdW0oKSk7CisKKyAgICAvLyBSb290IGlzIHJlcXVpcmVkLgorICAgIHJlc3VsdC0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiUm9vdCIsIG51bGxwdHIsIEdldFJvb3RPYmpOdW0oKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHZvaWQgU2V0TWFpblRyYWlsZXIoc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeT4gdHJhaWxlcikgeworICAgIEFTU0VSVCh0cmFpbGVyKTsKKyAgICBtYWluX3RyYWlsZXJfID0gc3RkOjptb3ZlKHRyYWlsZXIpOworICAgIEFwcGx5VHJhaWxlcihtYWluX3RyYWlsZXJfLmdldCgpKTsKKyAgfQorCisgIHZvaWQgQXBwZW5kVHJhaWxlcihzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5PiB0cmFpbGVyKSB7CisgICAgQVNTRVJUKHRyYWlsZXIpOworICAgIEFwcGx5VHJhaWxlcih0cmFpbGVyLmdldCgpKTsKKyAgfQorCisgIHZvaWQgQ2xlYXIoKSB7CisgICAgbWFpbl90cmFpbGVyXy5yZXNldCgpOworICAgIGxhc3RfaW5mb19vYmpfbnVtXyA9IDA7CisgICAgbGFzdF9yb290X29ial9udW1fID0gMDsKKyAgfQorCisgIHVpbnQzMl90IEdldEluZm9PYmpOdW0oKSBjb25zdCB7CisgICAgY29uc3QgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSBUb1JlZmVyZW5jZSgKKyAgICAgICAgR2V0TWFpblRyYWlsZXIoKSA/IEdldE1haW5UcmFpbGVyKCktPkdldE9iamVjdEZvcigiSW5mbyIpIDogbnVsbHB0cik7CisgICAgcmV0dXJuIHBSZWYgPyBwUmVmLT5HZXRSZWZPYmpOdW0oKSA6IGxhc3RfaW5mb19vYmpfbnVtXzsKKyAgfQorCisgIHVpbnQzMl90IEdldFJvb3RPYmpOdW0oKSBjb25zdCB7CisgICAgY29uc3QgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSBUb1JlZmVyZW5jZSgKKyAgICAgICAgR2V0TWFpblRyYWlsZXIoKSA/IEdldE1haW5UcmFpbGVyKCktPkdldE9iamVjdEZvcigiUm9vdCIpIDogbnVsbHB0cik7CisgICAgcmV0dXJuIHBSZWYgPyBwUmVmLT5HZXRSZWZPYmpOdW0oKSA6IGxhc3Rfcm9vdF9vYmpfbnVtXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgdm9pZCBBcHBseVRyYWlsZXIoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBkaWN0KSB7CisgICAgLy8gVGhlIG1vc3QgcmVjZW50IEluZm8gb2JqZWN0IG51bWJlciBjb250YWluZWQgaW4gbGFzdCBhZGRlZCB0cmFpbGVyLgorICAgIC8vIFNlZSBQREYgMS43IHNwZWMsIHNlY3Rpb24gMy40LjUgLSBJbmNyZW1lbnRhbCBVcGRhdGVzLgorICAgIGNvbnN0IGF1dG8qIHBSZWYgPSBUb1JlZmVyZW5jZShkaWN0LT5HZXRPYmplY3RGb3IoIkluZm8iKSk7CisgICAgaWYgKHBSZWYpCisgICAgICBsYXN0X2luZm9fb2JqX251bV8gPSBwUmVmLT5HZXRSZWZPYmpOdW0oKTsKKworICAgIGNvbnN0IGF1dG8qIHBSb290ID0gVG9SZWZlcmVuY2UoZGljdC0+R2V0T2JqZWN0Rm9yKCJSb290IikpOworICAgIGlmIChwUm9vdCkKKyAgICAgIGxhc3Rfcm9vdF9vYmpfbnVtXyA9IHBSb290LT5HZXRSZWZPYmpOdW0oKTsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0RpY3Rpb25hcnk+IG1haW5fdHJhaWxlcl87CisgIHVpbnQzMl90IGxhc3RfaW5mb19vYmpfbnVtXyA9IDA7CisgIHVpbnQzMl90IGxhc3Rfcm9vdF9vYmpfbnVtXyA9IDA7Cit9OworCiBDUERGX1BhcnNlcjo6Q1BERl9QYXJzZXIoKQotICAgIDogbV9wRG9jdW1lbnQobnVsbHB0ciksCisgICAgOiBtX3BTeW50YXgocGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU3ludGF4UGFyc2VyPigpKSwKICAgICAgIG1fYkhhc1BhcnNlZChmYWxzZSksCiAgICAgICBtX2JYUmVmU3RyZWFtKGZhbHNlKSwKLSAgICAgIG1fYlZlcnNpb25VcGRhdGVkKGZhbHNlKSwKICAgICAgIG1fRmlsZVZlcnNpb24oMCksCi0gICAgICBtX3BFbmNyeXB0RGljdChudWxscHRyKSwKLSAgICAgIG1fZHdYcmVmU3RhcnRPYmpOdW0oMCkgewotICBtX3BTeW50YXggPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TeW50YXhQYXJzZXI+KCk7Ci19CisgICAgICBtX1RyYWlsZXJEYXRhKHBkZml1bTo6TWFrZVVuaXF1ZTxUcmFpbGVyRGF0YT4oKSkge30KIAogQ1BERl9QYXJzZXI6On5DUERGX1BhcnNlcigpIHsKICAgUmVsZWFzZUVuY3J5cHRIYW5kbGVyKCk7Ci0gIFNldEVuY3J5cHREaWN0aW9uYXJ5KG51bGxwdHIpOwogfQogCiB1aW50MzJfdCBDUERGX1BhcnNlcjo6R2V0TGFzdE9iak51bSgpIGNvbnN0IHsKQEAgLTc5LDEwICsxNDYsMTAgQEAKICAgcmV0dXJuIGl0ICE9IG1fT2JqZWN0SW5mby5lbmQoKSA/IGl0LT5zZWNvbmQucG9zIDogMDsKIH0KIAotdWludDhfdCBDUERGX1BhcnNlcjo6R2V0T2JqZWN0VHlwZSh1aW50MzJfdCBvYmpudW0pIGNvbnN0IHsKK0NQREZfUGFyc2VyOjpPYmplY3RUeXBlIENQREZfUGFyc2VyOjpHZXRPYmplY3RUeXBlKHVpbnQzMl90IG9iam51bSkgY29uc3QgewogICBBU1NFUlQoSXNWYWxpZE9iamVjdE51bWJlcihvYmpudW0pKTsKICAgYXV0byBpdCA9IG1fT2JqZWN0SW5mby5maW5kKG9iam51bSk7Ci0gIHJldHVybiBpdCAhPSBtX09iamVjdEluZm8uZW5kKCkgPyBpdC0+c2Vjb25kLnR5cGUgOiAwOworICByZXR1cm4gaXQgIT0gbV9PYmplY3RJbmZvLmVuZCgpID8gaXQtPnNlY29uZC50eXBlIDogT2JqZWN0VHlwZTo6a0ZyZWU7CiB9CiAKIHVpbnQxNl90IENQREZfUGFyc2VyOjpHZXRPYmplY3RHZW5OdW0odWludDMyX3Qgb2JqbnVtKSBjb25zdCB7CkBAIC05MiwyMCArMTU5LDI4IEBACiB9CiAKIGJvb2wgQ1BERl9QYXJzZXI6OklzT2JqZWN0RnJlZU9yTnVsbCh1aW50MzJfdCBvYmpudW0pIGNvbnN0IHsKLSAgdWludDhfdCB0eXBlID0gR2V0T2JqZWN0VHlwZShvYmpudW0pOwotICByZXR1cm4gdHlwZSA9PSAwIHx8IHR5cGUgPT0gMjU1OworICBzd2l0Y2ggKEdldE9iamVjdFR5cGUob2JqbnVtKSkgeworICAgIGNhc2UgT2JqZWN0VHlwZTo6a0ZyZWU6CisgICAgY2FzZSBPYmplY3RUeXBlOjprTnVsbDoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgT2JqZWN0VHlwZTo6a05vdENvbXByZXNzZWQ6CisgICAgY2FzZSBPYmplY3RUeXBlOjprQ29tcHJlc3NlZDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBBU1NFUlQoZmFsc2UpOyAgLy8gTk9UUkVBQ0hFRCgpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1BERl9QYXJzZXI6OklzT2JqZWN0RnJlZSh1aW50MzJfdCBvYmpudW0pIGNvbnN0IHsKKyAgcmV0dXJuIEdldE9iamVjdFR5cGUob2JqbnVtKSA9PSBPYmplY3RUeXBlOjprRnJlZTsKIH0KIAogdm9pZCBDUERGX1BhcnNlcjo6U2V0RW5jcnlwdERpY3Rpb25hcnkoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgewogICBtX3BFbmNyeXB0RGljdCA9IHBEaWN0OwogfQogCi1DUERGX0NyeXB0b0hhbmRsZXIqIENQREZfUGFyc2VyOjpHZXRDcnlwdG9IYW5kbGVyKCkgewotICByZXR1cm4gbV9wU3ludGF4LT5tX3BDcnlwdG9IYW5kbGVyLmdldCgpOwotfQotCi1DRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IENQREZfUGFyc2VyOjpHZXRGaWxlQWNjZXNzKCkgY29uc3QgewotICByZXR1cm4gbV9wU3ludGF4LT5tX3BGaWxlQWNjZXNzOworUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IENQREZfUGFyc2VyOjpHZXRGaWxlQWNjZXNzKCkgY29uc3QgeworICByZXR1cm4gbV9wU3ludGF4LT5HZXRGaWxlQWNjZXNzKCk7CiB9CiAKIHZvaWQgQ1BERl9QYXJzZXI6OlNocmlua09iamVjdE1hcCh1aW50MzJfdCBvYmpudW0pIHsKQEAgLTEyNCw1MCArMTk5LDU1IEBACiAgICAgbV9PYmplY3RJbmZvW29iam51bSAtIDFdLnBvcyA9IDA7CiB9CiAKK2Jvb2wgQ1BERl9QYXJzZXI6OkluaXRTeW50YXhQYXJzZXIoCisgICAgY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBmaWxlX2FjY2VzcykgeworICBjb25zdCBpbnQzMl90IGhlYWRlcl9vZmZzZXQgPSBHZXRIZWFkZXJPZmZzZXQoZmlsZV9hY2Nlc3MpOworICBpZiAoaGVhZGVyX29mZnNldCA9PSBrSW52YWxpZEhlYWRlck9mZnNldCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChmaWxlX2FjY2Vzcy0+R2V0U2l6ZSgpIDwgaGVhZGVyX29mZnNldCArIGtQREZIZWFkZXJTaXplKQorICAgIHJldHVybiBmYWxzZTsKKworICBtX3BTeW50YXgtPkluaXRQYXJzZXIoZmlsZV9hY2Nlc3MsIGhlYWRlcl9vZmZzZXQpOworICByZXR1cm4gUGFyc2VGaWxlVmVyc2lvbigpOworfQorCitib29sIENQREZfUGFyc2VyOjpQYXJzZUZpbGVWZXJzaW9uKCkgeworICBtX0ZpbGVWZXJzaW9uID0gMDsKKyAgdWludDhfdCBjaDsKKyAgaWYgKCFtX3BTeW50YXgtPkdldENoYXJBdCg1LCBjaCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChzdGQ6OmlzZGlnaXQoY2gpKQorICAgIG1fRmlsZVZlcnNpb24gPSBGWFNZU19EZWNpbWFsQ2hhclRvSW50KHN0YXRpY19jYXN0PHdjaGFyX3Q+KGNoKSkgKiAxMDsKKworICBpZiAoIW1fcFN5bnRheC0+R2V0Q2hhckF0KDcsIGNoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKHN0ZDo6aXNkaWdpdChjaCkpCisgICAgbV9GaWxlVmVyc2lvbiArPSBGWFNZU19EZWNpbWFsQ2hhclRvSW50KHN0YXRpY19jYXN0PHdjaGFyX3Q+KGNoKSk7CisgIHJldHVybiB0cnVlOworfQorCiBDUERGX1BhcnNlcjo6RXJyb3IgQ1BERl9QYXJzZXI6OlN0YXJ0UGFyc2UoCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGVBY2Nlc3MsCisgICAgY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZUFjY2VzcywKICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgaWYgKCFJbml0U3ludGF4UGFyc2VyKHBGaWxlQWNjZXNzKSkKKyAgICByZXR1cm4gRk9STUFUX0VSUk9SOworICByZXR1cm4gU3RhcnRQYXJzZUludGVybmFsKHBEb2N1bWVudCk7Cit9CisKK0NQREZfUGFyc2VyOjpFcnJvciBDUERGX1BhcnNlcjo6U3RhcnRQYXJzZUludGVybmFsKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCkgewogICBBU1NFUlQoIW1fYkhhc1BhcnNlZCk7CiAgIG1fYkhhc1BhcnNlZCA9IHRydWU7CiAgIG1fYlhSZWZTdHJlYW0gPSBmYWxzZTsKLSAgbV9MYXN0WFJlZk9mZnNldCA9IDA7CiAKLSAgaW50MzJfdCBvZmZzZXQgPSBHZXRIZWFkZXJPZmZzZXQocEZpbGVBY2Nlc3MpOwotICBpZiAob2Zmc2V0ID09IC0xKQotICAgIHJldHVybiBGT1JNQVRfRVJST1I7Ci0KLSAgbV9wU3ludGF4LT5Jbml0UGFyc2VyKHBGaWxlQWNjZXNzLCBvZmZzZXQpOwotCi0gIHVpbnQ4X3QgY2g7Ci0gIGlmICghbV9wU3ludGF4LT5HZXRDaGFyQXQoNSwgY2gpKQotICAgIHJldHVybiBGT1JNQVRfRVJST1I7Ci0KLSAgaWYgKHN0ZDo6aXNkaWdpdChjaCkpCi0gICAgbV9GaWxlVmVyc2lvbiA9IEZYU1lTX3RvRGVjaW1hbERpZ2l0KHN0YXRpY19jYXN0PEZYX1dDSEFSPihjaCkpICogMTA7Ci0KLSAgaWYgKCFtX3BTeW50YXgtPkdldENoYXJBdCg3LCBjaCkpCi0gICAgcmV0dXJuIEZPUk1BVF9FUlJPUjsKLQotICBpZiAoc3RkOjppc2RpZ2l0KGNoKSkKLSAgICBtX0ZpbGVWZXJzaW9uICs9IEZYU1lTX3RvRGVjaW1hbERpZ2l0KHN0YXRpY19jYXN0PEZYX1dDSEFSPihjaCkpOwotCi0gIGlmIChtX3BTeW50YXgtPm1fRmlsZUxlbiA8IG1fcFN5bnRheC0+bV9IZWFkZXJPZmZzZXQgKyA5KQotICAgIHJldHVybiBGT1JNQVRfRVJST1I7Ci0KLSAgbV9wU3ludGF4LT5SZXN0b3JlUG9zKG1fcFN5bnRheC0+bV9GaWxlTGVuIC0gbV9wU3ludGF4LT5tX0hlYWRlck9mZnNldCAtIDkpOwogICBtX3BEb2N1bWVudCA9IHBEb2N1bWVudDsKIAogICBib29sIGJYUmVmUmVidWlsdCA9IGZhbHNlOwotICBpZiAobV9wU3ludGF4LT5TZWFyY2hXb3JkKCJzdGFydHhyZWYiLCB0cnVlLCBmYWxzZSwgNDA5NikpIHsKLSAgICBtX1NvcnRlZE9mZnNldC5pbnNlcnQobV9wU3ludGF4LT5TYXZlUG9zKCkpOwotICAgIG1fcFN5bnRheC0+R2V0S2V5d29yZCgpOwogCi0gICAgYm9vbCBiTnVtYmVyOwotICAgIENGWF9CeXRlU3RyaW5nIHhyZWZwb3Nfc3RyID0gbV9wU3ludGF4LT5HZXROZXh0V29yZCgmYk51bWJlcik7Ci0gICAgaWYgKCFiTnVtYmVyKQotICAgICAgcmV0dXJuIEZPUk1BVF9FUlJPUjsKKyAgbV9MYXN0WFJlZk9mZnNldCA9IFBhcnNlU3RhcnRYUmVmKCk7CiAKLSAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gKEZYX0ZJTEVTSVpFKUZYU1lTX2F0b2k2NCh4cmVmcG9zX3N0ci5jX3N0cigpKTsKKyAgaWYgKG1fTGFzdFhSZWZPZmZzZXQgPiAwKSB7CiAgICAgaWYgKCFMb2FkQWxsQ3Jvc3NSZWZWNChtX0xhc3RYUmVmT2Zmc2V0KSAmJgogICAgICAgICAhTG9hZEFsbENyb3NzUmVmVjUobV9MYXN0WFJlZk9mZnNldCkpIHsKICAgICAgIGlmICghUmVidWlsZENyb3NzUmVmKCkpCkBAIC0yMTYsMTggKzI5Niw0MCBAQAogICAgIENQREZfUmVmZXJlbmNlKiBwTWV0YWRhdGEgPQogICAgICAgICBUb1JlZmVyZW5jZShtX3BEb2N1bWVudC0+R2V0Um9vdCgpLT5HZXRPYmplY3RGb3IoIk1ldGFkYXRhIikpOwogICAgIGlmIChwTWV0YWRhdGEpCi0gICAgICBtX3BTeW50YXgtPm1fTWV0YWRhdGFPYmpudW0gPSBwTWV0YWRhdGEtPkdldFJlZk9iak51bSgpOworICAgICAgbV9NZXRhZGF0YU9iam51bSA9IHBNZXRhZGF0YS0+R2V0UmVmT2JqTnVtKCk7CiAgIH0KICAgcmV0dXJuIFNVQ0NFU1M7CiB9CisKK0ZYX0ZJTEVTSVpFIENQREZfUGFyc2VyOjpQYXJzZVN0YXJ0WFJlZigpIHsKKyAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtTdGFydFhSZWZLZXl3b3JkW10gPSAic3RhcnR4cmVmIjsKKyAgbV9wU3ludGF4LT5TZXRQb3MobV9wU3ludGF4LT5tX0ZpbGVMZW4gLSBtX3BTeW50YXgtPm1fSGVhZGVyT2Zmc2V0IC0KKyAgICAgICAgICAgICAgICAgICAgc3RybGVuKGtTdGFydFhSZWZLZXl3b3JkKSk7CisgIGlmICghbV9wU3ludGF4LT5CYWNrd2FyZHNTZWFyY2hUb1dvcmQoa1N0YXJ0WFJlZktleXdvcmQsIDQwOTYpKQorICAgIHJldHVybiAwOworCisgIC8vIFNraXAgInN0YXJ0eHJlZiIga2V5d29yZC4KKyAgbV9wU3ludGF4LT5HZXRLZXl3b3JkKCk7CisKKyAgLy8gUmVhZCBYUmVmIG9mZnNldC4KKyAgYm9vbCBiTnVtYmVyOworICBjb25zdCBCeXRlU3RyaW5nIHhyZWZwb3Nfc3RyID0gbV9wU3ludGF4LT5HZXROZXh0V29yZCgmYk51bWJlcik7CisgIGlmICghYk51bWJlciB8fCB4cmVmcG9zX3N0ci5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIDA7CisKKyAgY29uc3QgRlhfU0FGRV9GSUxFU0laRSByZXN1bHQgPSBGWFNZU19hdG9pNjQoeHJlZnBvc19zdHIuY19zdHIoKSk7CisgIGlmICghcmVzdWx0LklzVmFsaWQoKSB8fCByZXN1bHQuVmFsdWVPckRpZSgpID49IEdldEZpbGVBY2Nlc3MoKS0+R2V0U2l6ZSgpKQorICAgIHJldHVybiAwOworCisgIHJldHVybiByZXN1bHQuVmFsdWVPckRpZSgpOworfQorCiBDUERGX1BhcnNlcjo6RXJyb3IgQ1BERl9QYXJzZXI6OlNldEVuY3J5cHRIYW5kbGVyKCkgewogICBSZWxlYXNlRW5jcnlwdEhhbmRsZXIoKTsKLSAgU2V0RW5jcnlwdERpY3Rpb25hcnkobnVsbHB0cik7Ci0KLSAgaWYgKCFtX3BUcmFpbGVyKQorICBpZiAoIUdldFRyYWlsZXIoKSkKICAgICByZXR1cm4gRk9STUFUX0VSUk9SOwogCi0gIENQREZfT2JqZWN0KiBwRW5jcnlwdE9iaiA9IG1fcFRyYWlsZXItPkdldE9iamVjdEZvcigiRW5jcnlwdCIpOworICBDUERGX09iamVjdCogcEVuY3J5cHRPYmogPSBHZXRUcmFpbGVyKCktPkdldE9iamVjdEZvcigiRW5jcnlwdCIpOwogICBpZiAocEVuY3J5cHRPYmopIHsKICAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QgPSBwRW5jcnlwdE9iai0+QXNEaWN0aW9uYXJ5KCkpIHsKICAgICAgIFNldEVuY3J5cHREaWN0aW9uYXJ5KHBFbmNyeXB0RGljdCk7CkBAIC0yMzksNDIgKzM0MSwzNCBAQAogICB9CiAKICAgaWYgKG1fcEVuY3J5cHREaWN0KSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZmlsdGVyID0gbV9wRW5jcnlwdERpY3QtPkdldFN0cmluZ0ZvcigiRmlsdGVyIik7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENQREZfU2VjdXJpdHlIYW5kbGVyPiBwU2VjdXJpdHlIYW5kbGVyOwotICAgIEVycm9yIGVyciA9IEhBTkRMRVJfRVJST1I7Ci0gICAgaWYgKGZpbHRlciA9PSAiU3RhbmRhcmQiKSB7Ci0gICAgICBwU2VjdXJpdHlIYW5kbGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU2VjdXJpdHlIYW5kbGVyPigpOwotICAgICAgZXJyID0gUEFTU1dPUkRfRVJST1I7Ci0gICAgfQotICAgIGlmICghcFNlY3VyaXR5SGFuZGxlcikKKyAgICBCeXRlU3RyaW5nIGZpbHRlciA9IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmdGb3IoIkZpbHRlciIpOworICAgIGlmIChmaWx0ZXIgIT0gIlN0YW5kYXJkIikKICAgICAgIHJldHVybiBIQU5ETEVSX0VSUk9SOwogCi0gICAgaWYgKCFwU2VjdXJpdHlIYW5kbGVyLT5PbkluaXQodGhpcywgbV9wRW5jcnlwdERpY3QpKQotICAgICAgcmV0dXJuIGVycjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9TZWN1cml0eUhhbmRsZXI+IHBTZWN1cml0eUhhbmRsZXIgPQorICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TZWN1cml0eUhhbmRsZXI+KCk7CisgICAgaWYgKCFwU2VjdXJpdHlIYW5kbGVyLT5PbkluaXQobV9wRW5jcnlwdERpY3QuR2V0KCksIEdldElEQXJyYXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1Bhc3N3b3JkKSkKKyAgICAgIHJldHVybiBQQVNTV09SRF9FUlJPUjsKIAogICAgIG1fcFNlY3VyaXR5SGFuZGxlciA9IHN0ZDo6bW92ZShwU2VjdXJpdHlIYW5kbGVyKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9DcnlwdG9IYW5kbGVyPiBwQ3J5cHRvSGFuZGxlcigKLSAgICAgICAgbV9wU2VjdXJpdHlIYW5kbGVyLT5DcmVhdGVDcnlwdG9IYW5kbGVyKCkpOwotICAgIGlmICghcENyeXB0b0hhbmRsZXItPkluaXQobV9wRW5jcnlwdERpY3QsIG1fcFNlY3VyaXR5SGFuZGxlci5nZXQoKSkpCi0gICAgICByZXR1cm4gSEFORExFUl9FUlJPUjsKLSAgICBtX3BTeW50YXgtPlNldEVuY3J5cHQoc3RkOjptb3ZlKHBDcnlwdG9IYW5kbGVyKSk7CiAgIH0KICAgcmV0dXJuIFNVQ0NFU1M7CiB9CiAKIHZvaWQgQ1BERl9QYXJzZXI6OlJlbGVhc2VFbmNyeXB0SGFuZGxlcigpIHsKLSAgbV9wU3ludGF4LT5tX3BDcnlwdG9IYW5kbGVyLnJlc2V0KCk7CiAgIG1fcFNlY3VyaXR5SGFuZGxlci5yZXNldCgpOworICBTZXRFbmNyeXB0RGljdGlvbmFyeShudWxscHRyKTsKIH0KIAogRlhfRklMRVNJWkUgQ1BERl9QYXJzZXI6OkdldE9iamVjdE9mZnNldCh1aW50MzJfdCBvYmpudW0pIGNvbnN0IHsKICAgaWYgKCFJc1ZhbGlkT2JqZWN0TnVtYmVyKG9iam51bSkpCiAgICAgcmV0dXJuIDA7CiAKLSAgaWYgKEdldE9iamVjdFR5cGUob2JqbnVtKSA9PSAxKQorICBpZiAoR2V0T2JqZWN0VHlwZShvYmpudW0pID09IE9iamVjdFR5cGU6OmtOb3RDb21wcmVzc2VkKQogICAgIHJldHVybiBHZXRPYmplY3RQb3NpdGlvbk9yWmVybyhvYmpudW0pOwogCi0gIGlmIChHZXRPYmplY3RUeXBlKG9iam51bSkgPT0gMikgeworICBpZiAoR2V0T2JqZWN0VHlwZShvYmpudW0pID09IE9iamVjdFR5cGU6OmtDb21wcmVzc2VkKSB7CiAgICAgRlhfRklMRVNJWkUgcG9zID0gR2V0T2JqZWN0UG9zaXRpb25Pclplcm8ob2JqbnVtKTsKICAgICByZXR1cm4gR2V0T2JqZWN0UG9zaXRpb25Pclplcm8ocG9zKTsKICAgfQpAQCAtMjkwLDMyICszODQsMzIgQEAKICAgICBpZiAoaXQuc2Vjb25kLnBvcyA9PSAwKQogICAgICAgY29udGludWU7CiAgICAgLy8gRmluZCB0aGUgZmlyc3Qgbm9uLXplcm8gcG9zaXRpb24uCi0gICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX3BTeW50YXgtPlNhdmVQb3MoKTsKLSAgICBtX3BTeW50YXgtPlJlc3RvcmVQb3MoaXQuc2Vjb25kLnBvcyk7CisgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX3BTeW50YXgtPkdldFBvcygpOworICAgIG1fcFN5bnRheC0+U2V0UG9zKGl0LnNlY29uZC5wb3MpOwogICAgIGJvb2wgaXNfbnVtID0gZmFsc2U7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgbnVtX3N0ciA9IG1fcFN5bnRheC0+R2V0TmV4dFdvcmQoJmlzX251bSk7Ci0gICAgbV9wU3ludGF4LT5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKKyAgICBCeXRlU3RyaW5nIG51bV9zdHIgPSBtX3BTeW50YXgtPkdldE5leHRXb3JkKCZpc19udW0pOworICAgIG1fcFN5bnRheC0+U2V0UG9zKFNhdmVkUG9zKTsKICAgICBpZiAoIWlzX251bSB8fCBudW1fc3RyLklzRW1wdHkoKSB8fAogICAgICAgICBGWFNZU19hdG91aShudW1fc3RyLmNfc3RyKCkpICE9IGl0LmZpcnN0KSB7CiAgICAgICAvLyBJZiB0aGUgb2JqZWN0IG51bWJlciByZWFkIGRvZXNuJ3QgbWF0Y2ggdGhlIG9uZSBzdG9yZWQsCiAgICAgICAvLyBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlLgogICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CisgICAgcmV0dXJuIHRydWU7CiAgIH0KICAgcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgQ1BERl9QYXJzZXI6OkxvYWRBbGxDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHhyZWZwb3MpIHsKLSAgaWYgKCFMb2FkQ3Jvc3NSZWZWNCh4cmVmcG9zLCAwLCB0cnVlKSkKKyAgaWYgKCFMb2FkQ3Jvc3NSZWZWNCh4cmVmcG9zLCB0cnVlKSkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgbV9wVHJhaWxlciA9IExvYWRUcmFpbGVyVjQoKTsKLSAgaWYgKCFtX3BUcmFpbGVyKQorICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5PiB0cmFpbGVyID0gTG9hZFRyYWlsZXJWNCgpOworICBpZiAoIXRyYWlsZXIpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIGludDMyX3QgeHJlZnNpemUgPSBHZXREaXJlY3RJbnRlZ2VyKG1fcFRyYWlsZXIuZ2V0KCksICJTaXplIik7CisgIG1fVHJhaWxlckRhdGEtPlNldE1haW5UcmFpbGVyKHN0ZDo6bW92ZSh0cmFpbGVyKSk7CisgIGludDMyX3QgeHJlZnNpemUgPSBHZXREaXJlY3RJbnRlZ2VyKEdldFRyYWlsZXIoKSwgIlNpemUiKTsKICAgaWYgKHhyZWZzaXplID4gMCAmJiB4cmVmc2l6ZSA8PSBrTWF4WFJlZlNpemUpCiAgICAgU2hyaW5rT2JqZWN0TWFwKHhyZWZzaXplKTsKIApAQCAtMzI0LDEyICs0MTgsMTIgQEAKICAgc3RkOjpzZXQ8RlhfRklMRVNJWkU+IHNlZW5feHJlZnBvczsKIAogICBDcm9zc1JlZkxpc3QucHVzaF9iYWNrKHhyZWZwb3MpOwotICBYUmVmU3RyZWFtTGlzdC5wdXNoX2JhY2soR2V0RGlyZWN0SW50ZWdlcihtX3BUcmFpbGVyLmdldCgpLCAiWFJlZlN0bSIpKTsKKyAgWFJlZlN0cmVhbUxpc3QucHVzaF9iYWNrKEdldERpcmVjdEludGVnZXIoR2V0VHJhaWxlcigpLCAiWFJlZlN0bSIpKTsKICAgc2Vlbl94cmVmcG9zLmluc2VydCh4cmVmcG9zKTsKIAotICAvLyBXaGVuIHxtX3BUcmFpbGVyfCBkb2Vzbid0IGhhdmUgUHJldiBlbnRyeSBvciBQcmV2IGVudHJ5IHZhbHVlIGlzIG5vdAorICAvLyBXaGVuIHRoZSB0cmFpbGVyIGRvZXNuJ3QgaGF2ZSBQcmV2IGVudHJ5IG9yIFByZXYgZW50cnkgdmFsdWUgaXMgbm90CiAgIC8vIG51bWVyaWNhbCwgR2V0RGlyZWN0SW50ZWdlcigpIHJldHVybnMgMC4gTG9hZGluZyB3aWxsIGVuZC4KLSAgeHJlZnBvcyA9IEdldERpcmVjdEludGVnZXIobV9wVHJhaWxlci5nZXQoKSwgIlByZXYiKTsKKyAgeHJlZnBvcyA9IEdldERpcmVjdEludGVnZXIoR2V0VHJhaWxlcigpLCAiUHJldiIpOwogICB3aGlsZSAoeHJlZnBvcykgewogICAgIC8vIENoZWNrIGZvciBjaXJjdWxhciByZWZlcmVuY2VzLgogICAgIGlmIChwZGZpdW06OkNvbnRhaW5zS2V5KHNlZW5feHJlZnBvcywgeHJlZnBvcykpCkBAIC0zMzksNyArNDMzLDcgQEAKIAogICAgIC8vIFNMT1cgLi4uCiAgICAgQ3Jvc3NSZWZMaXN0Lmluc2VydChDcm9zc1JlZkxpc3QuYmVnaW4oKSwgeHJlZnBvcyk7Ci0gICAgTG9hZENyb3NzUmVmVjQoeHJlZnBvcywgMCwgdHJ1ZSk7CisgICAgTG9hZENyb3NzUmVmVjQoeHJlZnBvcywgdHJ1ZSk7CiAKICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5PiBwRGljdChMb2FkVHJhaWxlclY0KCkpOwogICAgIGlmICghcERpY3QpCkBAIC0zNTAsMjggKzQ0NCwzMiBAQAogICAgIC8vIFNMT1cgLi4uCiAgICAgWFJlZlN0cmVhbUxpc3QuaW5zZXJ0KFhSZWZTdHJlYW1MaXN0LmJlZ2luKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaWN0LT5HZXRJbnRlZ2VyRm9yKCJYUmVmU3RtIikpOwotICAgIG1fVHJhaWxlcnMucHVzaF9iYWNrKHN0ZDo6bW92ZShwRGljdCkpOworICAgIG1fVHJhaWxlckRhdGEtPkFwcGVuZFRyYWlsZXIoc3RkOjptb3ZlKHBEaWN0KSk7CiAgIH0KIAogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IENyb3NzUmVmTGlzdC5zaXplKCk7ICsraSkgewotICAgIGlmICghTG9hZENyb3NzUmVmVjQoQ3Jvc3NSZWZMaXN0W2ldLCBYUmVmU3RyZWFtTGlzdFtpXSwgZmFsc2UpKQorICAgIGlmICghTG9hZENyb3NzUmVmVjQoQ3Jvc3NSZWZMaXN0W2ldLCBmYWxzZSkpCiAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoWFJlZlN0cmVhbUxpc3RbaV0gJiYgIUxvYWRDcm9zc1JlZlY1KCZYUmVmU3RyZWFtTGlzdFtpXSwgZmFsc2UpKQorICAgICAgcmV0dXJuIGZhbHNlOworCiAgICAgaWYgKGkgPT0gMCAmJiAhVmVyaWZ5Q3Jvc3NSZWZWNCgpKQogICAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENQREZfUGFyc2VyOjpMb2FkTGluZWFyaXplZEFsbENyb3NzUmVmVjQoRlhfRklMRVNJWkUgeHJlZnBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd09iakNvdW50KSB7Ci0gIGlmICghTG9hZExpbmVhcml6ZWRDcm9zc1JlZlY0KHhyZWZwb3MsIGR3T2JqQ291bnQpKQorYm9vbCBDUERGX1BhcnNlcjo6TG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHhyZWZwb3MpIHsKKyAgaWYgKCFMb2FkQ3Jvc3NSZWZWNCh4cmVmcG9zLCBmYWxzZSkpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIG1fcFRyYWlsZXIgPSBMb2FkVHJhaWxlclY0KCk7Ci0gIGlmICghbV9wVHJhaWxlcikKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeT4gdHJhaWxlciA9IExvYWRUcmFpbGVyVjQoKTsKKyAgaWYgKCF0cmFpbGVyKQogICAgIHJldHVybiBmYWxzZTsKIAotICBpbnQzMl90IHhyZWZzaXplID0gR2V0RGlyZWN0SW50ZWdlcihtX3BUcmFpbGVyLmdldCgpLCAiU2l6ZSIpOworICBtX1RyYWlsZXJEYXRhLT5TZXRNYWluVHJhaWxlcihzdGQ6Om1vdmUodHJhaWxlcikpOworICBpbnQzMl90IHhyZWZzaXplID0gR2V0RGlyZWN0SW50ZWdlcihHZXRUcmFpbGVyKCksICJTaXplIik7CiAgIGlmICh4cmVmc2l6ZSA9PSAwKQogICAgIHJldHVybiBmYWxzZTsKIApAQCAtMzgwLDEwICs0NzgsMTAgQEAKICAgc3RkOjpzZXQ8RlhfRklMRVNJWkU+IHNlZW5feHJlZnBvczsKIAogICBDcm9zc1JlZkxpc3QucHVzaF9iYWNrKHhyZWZwb3MpOwotICBYUmVmU3RyZWFtTGlzdC5wdXNoX2JhY2soR2V0RGlyZWN0SW50ZWdlcihtX3BUcmFpbGVyLmdldCgpLCAiWFJlZlN0bSIpKTsKKyAgWFJlZlN0cmVhbUxpc3QucHVzaF9iYWNrKEdldERpcmVjdEludGVnZXIoR2V0VHJhaWxlcigpLCAiWFJlZlN0bSIpKTsKICAgc2Vlbl94cmVmcG9zLmluc2VydCh4cmVmcG9zKTsKIAotICB4cmVmcG9zID0gR2V0RGlyZWN0SW50ZWdlcihtX3BUcmFpbGVyLmdldCgpLCAiUHJldiIpOworICB4cmVmcG9zID0gR2V0RGlyZWN0SW50ZWdlcihHZXRUcmFpbGVyKCksICJQcmV2Iik7CiAgIHdoaWxlICh4cmVmcG9zKSB7CiAgICAgLy8gQ2hlY2sgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMuCiAgICAgaWYgKHBkZml1bTo6Q29udGFpbnNLZXkoc2Vlbl94cmVmcG9zLCB4cmVmcG9zKSkKQEAgLTM5Myw3ICs0OTEsNyBAQAogCiAgICAgLy8gU0xPVyAuLi4KICAgICBDcm9zc1JlZkxpc3QuaW5zZXJ0KENyb3NzUmVmTGlzdC5iZWdpbigpLCB4cmVmcG9zKTsKLSAgICBMb2FkQ3Jvc3NSZWZWNCh4cmVmcG9zLCAwLCB0cnVlKTsKKyAgICBMb2FkQ3Jvc3NSZWZWNCh4cmVmcG9zLCB0cnVlKTsKIAogICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0RpY3Rpb25hcnk+IHBEaWN0KExvYWRUcmFpbGVyVjQoKSk7CiAgICAgaWYgKCFwRGljdCkKQEAgLTQwNCw5NSArNTAyLDEyMCBAQAogICAgIC8vIFNMT1cgLi4uCiAgICAgWFJlZlN0cmVhbUxpc3QuaW5zZXJ0KFhSZWZTdHJlYW1MaXN0LmJlZ2luKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEaWN0LT5HZXRJbnRlZ2VyRm9yKCJYUmVmU3RtIikpOwotICAgIG1fVHJhaWxlcnMucHVzaF9iYWNrKHN0ZDo6bW92ZShwRGljdCkpOworICAgIG1fVHJhaWxlckRhdGEtPkFwcGVuZFRyYWlsZXIoc3RkOjptb3ZlKHBEaWN0KSk7CiAgIH0KIAogICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IENyb3NzUmVmTGlzdC5zaXplKCk7ICsraSkgewotICAgIGlmICghTG9hZENyb3NzUmVmVjQoQ3Jvc3NSZWZMaXN0W2ldLCBYUmVmU3RyZWFtTGlzdFtpXSwgZmFsc2UpKQorICAgIGlmICghTG9hZENyb3NzUmVmVjQoQ3Jvc3NSZWZMaXN0W2ldLCBmYWxzZSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoWFJlZlN0cmVhbUxpc3RbaV0gJiYgIUxvYWRDcm9zc1JlZlY1KCZYUmVmU3RyZWFtTGlzdFtpXSwgZmFsc2UpKQogICAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENQREZfUGFyc2VyOjpMb2FkTGluZWFyaXplZENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3T2JqQ291bnQpIHsKLSAgRlhfRklMRVNJWkUgZHdTdGFydFBvcyA9IHBvcyAtIG1fcFN5bnRheC0+bV9IZWFkZXJPZmZzZXQ7Citib29sIENQREZfUGFyc2VyOjpQYXJzZUFuZEFwcGVuZENyb3NzUmVmU3Vic2VjdGlvbkRhdGEoCisgICAgdWludDMyX3Qgc3RhcnRfb2JqbnVtLAorICAgIHVpbnQzMl90IGNvdW50LAorICAgIHN0ZDo6dmVjdG9yPENyb3NzUmVmT2JqRGF0YT4qIG91dF9vYmplY3RzKSB7CisgIC8vIEVhY2ggZW50cnkgc2hhbGwgYmUgZXhhY3RseSAyMCBieXRlLgorICAvLyBBIHNhbXBsZSBlbnRyeSBsb29rcyBsaWtlOgorICAvLyAiMDAwMDAwMDAwMCAwMDAwNyBmXHJcbiIKKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtFbnRyeUNvbnN0U2l6ZSA9IDIwOwogCi0gIG1fcFN5bnRheC0+UmVzdG9yZVBvcyhkd1N0YXJ0UG9zKTsKLSAgbV9Tb3J0ZWRPZmZzZXQuaW5zZXJ0KHBvcyk7CisgIGlmICghb3V0X29iamVjdHMpIHsKKyAgICBGWF9TQUZFX0ZJTEVTSVpFIHBvcyA9IGNvdW50OworICAgIHBvcyAqPSBrRW50cnlDb25zdFNpemU7CisgICAgcG9zICs9IG1fcFN5bnRheC0+R2V0UG9zKCk7CisgICAgaWYgKCFwb3MuSXNWYWxpZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIG1fcFN5bnRheC0+U2V0UG9zKHBvcy5WYWx1ZU9yRGllKCkpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGNvbnN0IHNpemVfdCBzdGFydF9vYmpfaW5kZXggPSBvdXRfb2JqZWN0cy0+c2l6ZSgpOworICBGWF9TQUZFX1NJWkVfVCBuZXdfc2l6ZSA9IHN0YXJ0X29ial9pbmRleDsKKyAgbmV3X3NpemUgKz0gY291bnQ7CisgIGlmICghbmV3X3NpemUuSXNWYWxpZCgpKQorICAgIHJldHVybiBmYWxzZTsKIAotICB1aW50MzJfdCBzdGFydF9vYmpudW0gPSAwOwotICB1aW50MzJfdCBjb3VudCA9IGR3T2JqQ291bnQ7Ci0gIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9wU3ludGF4LT5TYXZlUG9zKCk7CisgIGlmIChuZXdfc2l6ZS5WYWx1ZU9yRGllKCkgPiBrTWF4WFJlZlNpemUpCisgICAgcmV0dXJuIGZhbHNlOwogCi0gIGNvbnN0IGludDMyX3QgcmVjb3Jkc2l6ZSA9IDIwOwotICBzdGQ6OnZlY3RvcjxjaGFyPiBidWYoMTAyNCAqIHJlY29yZHNpemUgKyAxKTsKLSAgYnVmWzEwMjQgKiByZWNvcmRzaXplXSA9ICdcMCc7CisgIGNvbnN0IHNpemVfdCBtYXhfZW50cmllc19pbl9maWxlID0KKyAgICAgIG1fcFN5bnRheC0+R2V0RmlsZUFjY2VzcygpLT5HZXRTaXplKCkgLyBrRW50cnlDb25zdFNpemU7CisgIGlmIChuZXdfc2l6ZS5WYWx1ZU9yRGllKCkgPiBtYXhfZW50cmllc19pbl9maWxlKQorICAgIHJldHVybiBmYWxzZTsKKworICBvdXRfb2JqZWN0cy0+cmVzaXplKG5ld19zaXplLlZhbHVlT3JEaWUoKSk7CisKKyAgc3RkOjp2ZWN0b3I8Y2hhcj4gYnVmKDEwMjQgKiBrRW50cnlDb25zdFNpemUgKyAxKTsKKyAgYnVmLmJhY2soKSA9ICdcMCc7CiAKICAgaW50MzJfdCBuQmxvY2tzID0gY291bnQgLyAxMDI0ICsgMTsKICAgZm9yIChpbnQzMl90IGJsb2NrID0gMDsgYmxvY2sgPCBuQmxvY2tzOyBibG9jaysrKSB7CiAgICAgaW50MzJfdCBibG9ja19zaXplID0gYmxvY2sgPT0gbkJsb2NrcyAtIDEgPyBjb3VudCAlIDEwMjQgOiAxMDI0OwotICAgIHVpbnQzMl90IGR3UmVhZFNpemUgPSBibG9ja19zaXplICogcmVjb3Jkc2l6ZTsKLSAgICBpZiAoKEZYX0ZJTEVTSVpFKShkd1N0YXJ0UG9zICsgZHdSZWFkU2l6ZSkgPiBtX3BTeW50YXgtPm1fRmlsZUxlbikKLSAgICAgIHJldHVybiBmYWxzZTsKLQogICAgIGlmICghbV9wU3ludGF4LT5SZWFkQmxvY2socmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYnVmLmRhdGEoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1JlYWRTaXplKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfc2l6ZSAqIGtFbnRyeUNvbnN0U2l6ZSkpIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBibG9ja19zaXplOyBpKyspIHsKLSAgICAgIHVpbnQzMl90IG9iam51bSA9IHN0YXJ0X29iam51bSArIGJsb2NrICogMTAyNCArIGk7Ci0gICAgICBjaGFyKiBwRW50cnkgPSAmYnVmW2kgKiByZWNvcmRzaXplXTsKKyAgICAgIENyb3NzUmVmT2JqRGF0YSYgb2JqX2RhdGEgPQorICAgICAgICAgICgqb3V0X29iamVjdHMpW3N0YXJ0X29ial9pbmRleCArIGJsb2NrICogMTAyNCArIGldOworCisgICAgICBjb25zdCB1aW50MzJfdCBvYmpudW0gPSBzdGFydF9vYmpudW0gKyBibG9jayAqIDEwMjQgKyBpOworCisgICAgICBvYmpfZGF0YS5vYmpfbnVtID0gb2JqbnVtOworCisgICAgICBPYmplY3RJbmZvJiBpbmZvID0gb2JqX2RhdGEuaW5mbzsKKworICAgICAgY2hhciogcEVudHJ5ID0gJmJ1ZltpICoga0VudHJ5Q29uc3RTaXplXTsKICAgICAgIGlmIChwRW50cnlbMTddID09ICdmJykgewotICAgICAgICBtX09iamVjdEluZm9bb2JqbnVtXS5wb3MgPSAwOwotICAgICAgICBtX09iamVjdEluZm9bb2JqbnVtXS50eXBlID0gMDsKKyAgICAgICAgaW5mby5wb3MgPSAwOworICAgICAgICBpbmZvLnR5cGUgPSBPYmplY3RUeXBlOjprRnJlZTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGludDMyX3Qgb2Zmc2V0ID0gRlhTWVNfYXRvaShwRW50cnkpOwotICAgICAgICBpZiAob2Zmc2V0ID09IDApIHsKKyAgICAgICAgY29uc3QgRlhfU0FGRV9GSUxFU0laRSBvZmZzZXQgPSBGWFNZU19hdG9pNjQocEVudHJ5KTsKKyAgICAgICAgaWYgKCFvZmZzZXQuSXNWYWxpZCgpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAob2Zmc2V0LlZhbHVlT3JEaWUoKSA9PSAwKSB7CiAgICAgICAgICAgZm9yIChpbnQzMl90IGMgPSAwOyBjIDwgMTA7IGMrKykgewogICAgICAgICAgICAgaWYgKCFzdGQ6OmlzZGlnaXQocEVudHJ5W2NdKSkKICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIG1fT2JqZWN0SW5mb1tvYmpudW1dLnBvcyA9IG9mZnNldDsKLSAgICAgICAgaW50MzJfdCB2ZXJzaW9uID0gRlhTWVNfYXRvaShwRW50cnkgKyAxMSk7Ci0gICAgICAgIGlmICh2ZXJzaW9uID49IDEpCi0gICAgICAgICAgbV9iVmVyc2lvblVwZGF0ZWQgPSB0cnVlOworICAgICAgICBpbmZvLnBvcyA9IG9mZnNldC5WYWx1ZU9yRGllKCk7CiAKLSAgICAgICAgbV9PYmplY3RJbmZvW29iam51bV0uZ2VubnVtID0gdmVyc2lvbjsKLSAgICAgICAgaWYgKG1fT2JqZWN0SW5mb1tvYmpudW1dLnBvcyA8IG1fcFN5bnRheC0+bV9GaWxlTGVuKQotICAgICAgICAgIG1fU29ydGVkT2Zmc2V0Lmluc2VydChtX09iamVjdEluZm9bb2JqbnVtXS5wb3MpOwotCi0gICAgICAgIG1fT2JqZWN0SW5mb1tvYmpudW1dLnR5cGUgPSAxOworICAgICAgICAvLyBUT0RPKGFydC1zbmFrZSk6IFRoZSBpbmZvLmdlbm51bSBpcyB1aW50MTZfdCwgYnV0IHZlcnNpb24gbWF5IGJlCisgICAgICAgIC8vIGdyZWF0ZWQgdGhhbiBtYXg8dWludDE2X3Q+LiBOZWVkcyBzb2x2ZSB0aGlzIGlzc3VlLgorICAgICAgICBjb25zdCBpbnQzMl90IHZlcnNpb24gPSBGWFNZU19hdG9pKHBFbnRyeSArIDExKTsKKyAgICAgICAgaW5mby5nZW5udW0gPSB2ZXJzaW9uOworICAgICAgICBpbmZvLnR5cGUgPSBPYmplY3RUeXBlOjprTm90Q29tcHJlc3NlZDsKICAgICAgIH0KICAgICB9CiAgIH0KLSAgbV9wU3ludGF4LT5SZXN0b3JlUG9zKFNhdmVkUG9zICsgY291bnQgKiByZWNvcmRzaXplKTsKICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQ1BERl9QYXJzZXI6OkxvYWRDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIHN0cmVhbXBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNraXApIHsKLSAgbV9wU3ludGF4LT5SZXN0b3JlUG9zKHBvcyk7Citib29sIENQREZfUGFyc2VyOjpQYXJzZUNyb3NzUmVmVjQoc3RkOjp2ZWN0b3I8Q3Jvc3NSZWZPYmpEYXRhPiogb3V0X29iamVjdHMpIHsKKyAgaWYgKG91dF9vYmplY3RzKQorICAgIG91dF9vYmplY3RzLT5jbGVhcigpOworCiAgIGlmIChtX3BTeW50YXgtPkdldEtleXdvcmQoKSAhPSAieHJlZiIpCiAgICAgcmV0dXJuIGZhbHNlOwotCi0gIG1fU29ydGVkT2Zmc2V0Lmluc2VydChwb3MpOwotICBpZiAoc3RyZWFtcG9zKQotICAgIG1fU29ydGVkT2Zmc2V0Lmluc2VydChzdHJlYW1wb3MpOwotCisgIHN0ZDo6dmVjdG9yPENyb3NzUmVmT2JqRGF0YT4gcmVzdWx0X29iamVjdHM7CiAgIHdoaWxlICgxKSB7Ci0gICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX3BTeW50YXgtPlNhdmVQb3MoKTsKKyAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fcFN5bnRheC0+R2V0UG9zKCk7CiAgICAgYm9vbCBiSXNOdW1iZXI7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IG1fcFN5bnRheC0+R2V0TmV4dFdvcmQoJmJJc051bWJlcik7Ci0gICAgaWYgKHdvcmQuSXNFbXB0eSgpKQorICAgIEJ5dGVTdHJpbmcgd29yZCA9IG1fcFN5bnRheC0+R2V0TmV4dFdvcmQoJmJJc051bWJlcik7CisgICAgaWYgKHdvcmQuSXNFbXB0eSgpKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCiAgICAgaWYgKCFiSXNOdW1iZXIpIHsKLSAgICAgIG1fcFN5bnRheC0+UmVzdG9yZVBvcyhTYXZlZFBvcyk7CisgICAgICBtX3BTeW50YXgtPlNldFBvcyhTYXZlZFBvcyk7CiAgICAgICBicmVhazsKICAgICB9CiAKQEAgLTUwMiw1MiArNjI1LDM1IEBACiAKICAgICB1aW50MzJfdCBjb3VudCA9IG1fcFN5bnRheC0+R2V0RGlyZWN0TnVtKCk7CiAgICAgbV9wU3ludGF4LT5Ub05leHRXb3JkKCk7Ci0gICAgU2F2ZWRQb3MgPSBtX3BTeW50YXgtPlNhdmVQb3MoKTsKLSAgICBjb25zdCBpbnQzMl90IHJlY29yZHNpemUgPSAyMDsKKyAgICBTYXZlZFBvcyA9IG1fcFN5bnRheC0+R2V0UG9zKCk7CiAKLSAgICBtX2R3WHJlZlN0YXJ0T2JqTnVtID0gc3RhcnRfb2JqbnVtOwotICAgIGlmICghYlNraXApIHsKLSAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGJ1ZigxMDI0ICogcmVjb3Jkc2l6ZSArIDEpOwotICAgICAgYnVmWzEwMjQgKiByZWNvcmRzaXplXSA9ICdcMCc7Ci0KLSAgICAgIGludDMyX3QgbkJsb2NrcyA9IGNvdW50IC8gMTAyNCArIDE7Ci0gICAgICBmb3IgKGludDMyX3QgYmxvY2sgPSAwOyBibG9jayA8IG5CbG9ja3M7IGJsb2NrKyspIHsKLSAgICAgICAgaW50MzJfdCBibG9ja19zaXplID0gYmxvY2sgPT0gbkJsb2NrcyAtIDEgPyBjb3VudCAlIDEwMjQgOiAxMDI0OwotICAgICAgICBtX3BTeW50YXgtPlJlYWRCbG9jayhyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihidWYuZGF0YSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfc2l6ZSAqIHJlY29yZHNpemUpOwotCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGJsb2NrX3NpemU7IGkrKykgewotICAgICAgICAgIHVpbnQzMl90IG9iam51bSA9IHN0YXJ0X29iam51bSArIGJsb2NrICogMTAyNCArIGk7Ci0gICAgICAgICAgY2hhciogcEVudHJ5ID0gJmJ1ZltpICogcmVjb3Jkc2l6ZV07Ci0gICAgICAgICAgaWYgKHBFbnRyeVsxN10gPT0gJ2YnKSB7Ci0gICAgICAgICAgICBtX09iamVjdEluZm9bb2JqbnVtXS5wb3MgPSAwOwotICAgICAgICAgICAgbV9PYmplY3RJbmZvW29iam51bV0udHlwZSA9IDA7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IChGWF9GSUxFU0laRSlGWFNZU19hdG9pNjQocEVudHJ5KTsKLSAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gMCkgewotICAgICAgICAgICAgICBmb3IgKGludDMyX3QgYyA9IDA7IGMgPCAxMDsgYysrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFzdGQ6OmlzZGlnaXQocEVudHJ5W2NdKSkKLSAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtX09iamVjdEluZm9bb2JqbnVtXS5wb3MgPSBvZmZzZXQ7Ci0gICAgICAgICAgICBpbnQzMl90IHZlcnNpb24gPSBGWFNZU19hdG9pKHBFbnRyeSArIDExKTsKLSAgICAgICAgICAgIGlmICh2ZXJzaW9uID49IDEpCi0gICAgICAgICAgICAgIG1fYlZlcnNpb25VcGRhdGVkID0gdHJ1ZTsKLQotICAgICAgICAgICAgbV9PYmplY3RJbmZvW29iam51bV0uZ2VubnVtID0gdmVyc2lvbjsKLSAgICAgICAgICAgIGlmIChtX09iamVjdEluZm9bb2JqbnVtXS5wb3MgPCBtX3BTeW50YXgtPm1fRmlsZUxlbikKLSAgICAgICAgICAgICAgbV9Tb3J0ZWRPZmZzZXQuaW5zZXJ0KG1fT2JqZWN0SW5mb1tvYmpudW1dLnBvcyk7Ci0KLSAgICAgICAgICAgIG1fT2JqZWN0SW5mb1tvYmpudW1dLnR5cGUgPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQorICAgIGlmICghUGFyc2VBbmRBcHBlbmRDcm9zc1JlZlN1YnNlY3Rpb25EYXRhKAorICAgICAgICAgICAgc3RhcnRfb2JqbnVtLCBjb3VudCwgb3V0X29iamVjdHMgPyAmcmVzdWx0X29iamVjdHMgOiBudWxscHRyKSkgeworICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBtX3BTeW50YXgtPlJlc3RvcmVQb3MoU2F2ZWRQb3MgKyBjb3VudCAqIHJlY29yZHNpemUpOwogICB9Ci0gIHJldHVybiAhc3RyZWFtcG9zIHx8IExvYWRDcm9zc1JlZlY1KCZzdHJlYW1wb3MsIGZhbHNlKTsKKyAgaWYgKG91dF9vYmplY3RzKQorICAgICpvdXRfb2JqZWN0cyA9IHN0ZDo6bW92ZShyZXN1bHRfb2JqZWN0cyk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENQREZfUGFyc2VyOjpMb2FkQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTa2lwKSB7CisgIG1fcFN5bnRheC0+U2V0UG9zKHBvcyk7CisgIHN0ZDo6dmVjdG9yPENyb3NzUmVmT2JqRGF0YT4gb2JqZWN0czsKKyAgaWYgKCFQYXJzZUNyb3NzUmVmVjQoYlNraXAgPyBudWxscHRyIDogJm9iamVjdHMpKQorICAgIHJldHVybiBmYWxzZTsKKworICBNZXJnZUNyb3NzUmVmT2JqZWN0c0RhdGEob2JqZWN0cyk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ1BERl9QYXJzZXI6Ok1lcmdlQ3Jvc3NSZWZPYmplY3RzRGF0YSgKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDcm9zc1JlZk9iakRhdGE+JiBvYmplY3RzKSB7CisgIGZvciAoY29uc3QgYXV0byYgb2JqIDogb2JqZWN0cykgeworICAgIG1fT2JqZWN0SW5mb1tvYmoub2JqX251bV0gPSBvYmouaW5mbzsKKyAgfQogfQogCiBib29sIENQREZfUGFyc2VyOjpMb2FkQWxsQ3Jvc3NSZWZWNShGWF9GSUxFU0laRSB4cmVmcG9zKSB7CkBAIC01NzEsOCArNjc3LDcgQEAKIAogYm9vbCBDUERGX1BhcnNlcjo6UmVidWlsZENyb3NzUmVmKCkgewogICBtX09iamVjdEluZm8uY2xlYXIoKTsKLSAgbV9Tb3J0ZWRPZmZzZXQuY2xlYXIoKTsKLSAgbV9wVHJhaWxlci5yZXNldCgpOworICBtX1RyYWlsZXJEYXRhLT5DbGVhcigpOwogCiAgIFBhcnNlclN0YXRlIHN0YXRlID0gUGFyc2VyU3RhdGU6OmtEZWZhdWx0OwogICBpbnQzMl90IGluc2lkZV9pbmRleCA9IDA7CkBAIC01OTQsNyArNjk5LDcgQEAKICAgICBib29sIGJPdmVyRmxvdyA9IGZhbHNlOwogICAgIHVpbnQzMl90IHNpemUgPQogICAgICAgICBzdGQ6Om1pbigodWludDMyX3QpKG1fcFN5bnRheC0+bV9GaWxlTGVuIC0gcG9zKSwga0J1ZmZlclNpemUpOwotICAgIGlmICghbV9wU3ludGF4LT5tX3BGaWxlQWNjZXNzLT5SZWFkQmxvY2soYnVmZmVyLmRhdGEoKSwgcG9zLCBzaXplKSkKKyAgICBpZiAoIW1fcFN5bnRheC0+R2V0RmlsZUFjY2VzcygpLT5SZWFkQmxvY2soYnVmZmVyLmRhdGEoKSwgcG9zLCBzaXplKSkKICAgICAgIGJyZWFrOwogCiAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewpAQCAtNjI3LDcgKzczMiw3IEBACiAgICAgICAgICAgaWYgKHN0ZDo6aXNkaWdpdChieXRlKSkgewogICAgICAgICAgICAgc3RhcnRfcG9zID0gcG9zICsgaTsKICAgICAgICAgICAgIHN0YXRlID0gUGFyc2VyU3RhdGU6OmtPYmpOdW07Ci0gICAgICAgICAgICBvYmpudW0gPSBGWFNZU190b0RlY2ltYWxEaWdpdChzdGF0aWNfY2FzdDxGWF9XQ0hBUj4oYnl0ZSkpOworICAgICAgICAgICAgb2JqbnVtID0gRlhTWVNfRGVjaW1hbENoYXJUb0ludChzdGF0aWNfY2FzdDx3Y2hhcl90PihieXRlKSk7CiAgICAgICAgICAgfSBlbHNlIGlmIChieXRlID09ICd0JykgewogICAgICAgICAgICAgc3RhdGUgPSBQYXJzZXJTdGF0ZTo6a1RyYWlsZXI7CiAgICAgICAgICAgICBpbnNpZGVfaW5kZXggPSAxOwpAQCAtNjQyLDggKzc0Nyw4IEBACiAKICAgICAgICAgY2FzZSBQYXJzZXJTdGF0ZTo6a09iak51bToKICAgICAgICAgICBpZiAoc3RkOjppc2RpZ2l0KGJ5dGUpKSB7Ci0gICAgICAgICAgICBvYmpudW0gPQotICAgICAgICAgICAgICAgIG9iam51bSAqIDEwICsgRlhTWVNfdG9EZWNpbWFsRGlnaXQoc3RhdGljX2Nhc3Q8RlhfV0NIQVI+KGJ5dGUpKTsKKyAgICAgICAgICAgIG9iam51bSA9IG9iam51bSAqIDEwICsKKyAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0RlY2ltYWxDaGFyVG9JbnQoc3RhdGljX2Nhc3Q8d2NoYXJfdD4oYnl0ZSkpOwogICAgICAgICAgIH0gZWxzZSBpZiAoUERGQ2hhcklzV2hpdGVzcGFjZShieXRlKSkgewogICAgICAgICAgICAgc3RhdGUgPSBQYXJzZXJTdGF0ZTo6a1Bvc3RPYmpOdW07CiAgICAgICAgICAgfSBlbHNlIHsKQEAgLTY1Nyw3ICs3NjIsNyBAQAogICAgICAgICAgIGlmIChzdGQ6OmlzZGlnaXQoYnl0ZSkpIHsKICAgICAgICAgICAgIHN0YXJ0X3BvczEgPSBwb3MgKyBpOwogICAgICAgICAgICAgc3RhdGUgPSBQYXJzZXJTdGF0ZTo6a0dlbk51bTsKLSAgICAgICAgICAgIGdlbm51bSA9IEZYU1lTX3RvRGVjaW1hbERpZ2l0KHN0YXRpY19jYXN0PEZYX1dDSEFSPihieXRlKSk7CisgICAgICAgICAgICBnZW5udW0gPSBGWFNZU19EZWNpbWFsQ2hhclRvSW50KHN0YXRpY19jYXN0PHdjaGFyX3Q+KGJ5dGUpKTsKICAgICAgICAgICB9IGVsc2UgaWYgKGJ5dGUgPT0gJ3QnKSB7CiAgICAgICAgICAgICBzdGF0ZSA9IFBhcnNlclN0YXRlOjprVHJhaWxlcjsKICAgICAgICAgICAgIGluc2lkZV9pbmRleCA9IDE7CkBAIC02NjksOCArNzc0LDggQEAKIAogICAgICAgICBjYXNlIFBhcnNlclN0YXRlOjprR2VuTnVtOgogICAgICAgICAgIGlmIChzdGQ6OmlzZGlnaXQoYnl0ZSkpIHsKLSAgICAgICAgICAgIGdlbm51bSA9Ci0gICAgICAgICAgICAgICAgZ2VubnVtICogMTAgKyBGWFNZU190b0RlY2ltYWxEaWdpdChzdGF0aWNfY2FzdDxGWF9XQ0hBUj4oYnl0ZSkpOworICAgICAgICAgICAgZ2VubnVtID0gZ2VubnVtICogMTAgKworICAgICAgICAgICAgICAgICAgICAgRlhTWVNfRGVjaW1hbENoYXJUb0ludChzdGF0aWNfY2FzdDx3Y2hhcl90PihieXRlKSk7CiAgICAgICAgICAgfSBlbHNlIGlmIChQREZDaGFySXNXaGl0ZXNwYWNlKGJ5dGUpKSB7CiAgICAgICAgICAgICBzdGF0ZSA9IFBhcnNlclN0YXRlOjprUG9zdEdlbk51bTsKICAgICAgICAgICB9IGVsc2UgewpAQCAtNjg1LDcgKzc5MCw3IEBACiAgICAgICAgICAgICBpbnNpZGVfaW5kZXggPSAxOwogICAgICAgICAgIH0gZWxzZSBpZiAoc3RkOjppc2RpZ2l0KGJ5dGUpKSB7CiAgICAgICAgICAgICBvYmpudW0gPSBnZW5udW07Ci0gICAgICAgICAgICBnZW5udW0gPSBGWFNZU190b0RlY2ltYWxEaWdpdChzdGF0aWNfY2FzdDxGWF9XQ0hBUj4oYnl0ZSkpOworICAgICAgICAgICAgZ2VubnVtID0gRlhTWVNfRGVjaW1hbENoYXJUb0ludChzdGF0aWNfY2FzdDx3Y2hhcl90PihieXRlKSk7CiAgICAgICAgICAgICBzdGFydF9wb3MgPSBzdGFydF9wb3MxOwogICAgICAgICAgICAgc3RhcnRfcG9zMSA9IHBvcyArIGk7CiAgICAgICAgICAgICBzdGF0ZSA9IFBhcnNlclN0YXRlOjprR2VuTnVtOwpAQCAtNzE5LDEyICs4MjQsMTEgQEAKICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgaWYgKFBERkNoYXJJc1doaXRlc3BhY2UoYnl0ZSkgfHwgUERGQ2hhcklzRGVsaW1pdGVyKGJ5dGUpKSB7CiAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2JqX3BvcyA9IHN0YXJ0X3BvcyAtIG1fcFN5bnRheC0+bV9IZWFkZXJPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgbV9Tb3J0ZWRPZmZzZXQuaW5zZXJ0KG9ial9wb3MpOwogICAgICAgICAgICAgICAgIGxhc3Rfb2JqID0gc3RhcnRfcG9zOwogICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9ial9lbmQgPSAwOwogICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gcE9iamVjdCA9Ci0gICAgICAgICAgICAgICAgICAgIFBhcnNlSW5kaXJlY3RPYmplY3RBdEJ5U3RyaWN0KG1fcERvY3VtZW50LCBvYmpfcG9zLCBvYmpudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvYmpfZW5kKTsKKyAgICAgICAgICAgICAgICAgICAgUGFyc2VJbmRpcmVjdE9iamVjdEF0QnlTdHJpY3QobV9wRG9jdW1lbnQuR2V0KCksIG9ial9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iam51bSwgJm9ial9lbmQpOwogICAgICAgICAgICAgICAgIGlmIChDUERGX1N0cmVhbSogcFN0cmVhbSA9IFRvU3RyZWFtKHBPYmplY3QuZ2V0KCkpKSB7CiAgICAgICAgICAgICAgICAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBTdHJlYW0tPkdldERpY3QoKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAoKHBEaWN0LT5LZXlFeGlzdCgiVHlwZSIpKSAmJgpAQCAtNzMzLDE0ICs4MzcsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcFJvb3QgPSBwRGljdC0+R2V0T2JqZWN0Rm9yKCJSb290Iik7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBSb290ICYmIHBSb290LT5HZXREaWN0KCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJvb3QtPkdldERpY3QoKS0+R2V0T2JqZWN0Rm9yKCJQYWdlcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BUcmFpbGVyID0gVG9EaWN0aW9uYXJ5KHBEaWN0LT5DbG9uZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fVHJhaWxlckRhdGEtPlNldE1haW5UcmFpbGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvRGljdGlvbmFyeShwRGljdC0+Q2xvbmUoKSkpOwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCA9IDA7Ci0gICAgICAgICAgICAgICAgbV9wU3ludGF4LT5SZXN0b3JlUG9zKG9ial9wb3MpOworICAgICAgICAgICAgICAgIG1fcFN5bnRheC0+U2V0UG9zKG9ial9wb3MpOwogICAgICAgICAgICAgICAgIG9mZnNldCA9IG1fcFN5bnRheC0+RmluZFRhZygib2JqIiwgMCk7CiAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA9PSAtMSkKICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IDA7CkBAIC03NTgsMTUgKzg2MywxMiBAQAogICAgICAgICAgICAgICAgIGlmICghbV9PYmplY3RJbmZvLmVtcHR5KCkgJiYgSXNWYWxpZE9iamVjdE51bWJlcihvYmpudW0pICYmCiAgICAgICAgICAgICAgICAgICAgIG1fT2JqZWN0SW5mb1tvYmpudW1dLnBvcykgewogICAgICAgICAgICAgICAgICAgaWYgKHBPYmplY3QpIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2xkZ2VuID0gR2V0T2JqZWN0R2VuTnVtKG9iam51bSk7CiAgICAgICAgICAgICAgICAgICAgIG1fT2JqZWN0SW5mb1tvYmpudW1dLnBvcyA9IG9ial9wb3M7CiAgICAgICAgICAgICAgICAgICAgIG1fT2JqZWN0SW5mb1tvYmpudW1dLmdlbm51bSA9IGdlbm51bTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9sZGdlbiAhPSBnZW5udW0pCi0gICAgICAgICAgICAgICAgICAgICAgbV9iVmVyc2lvblVwZGF0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICBtX09iamVjdEluZm9bb2JqbnVtXS5wb3MgPSBvYmpfcG9zOwotICAgICAgICAgICAgICAgICAgbV9PYmplY3RJbmZvW29iam51bV0udHlwZSA9IDE7CisgICAgICAgICAgICAgICAgICBtX09iamVjdEluZm9bb2JqbnVtXS50eXBlID0gT2JqZWN0VHlwZTo6a05vdENvbXByZXNzZWQ7CiAgICAgICAgICAgICAgICAgICBtX09iamVjdEluZm9bb2JqbnVtXS5nZW5udW0gPSBnZW5udW07CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CkBAIC03ODAsMTYgKzg4MiwxNiBAQAogICAgICAgICAgIGlmIChpbnNpZGVfaW5kZXggPT0gNykgewogICAgICAgICAgICAgaWYgKFBERkNoYXJJc1doaXRlc3BhY2UoYnl0ZSkgfHwgUERGQ2hhcklzRGVsaW1pdGVyKGJ5dGUpKSB7CiAgICAgICAgICAgICAgIGxhc3RfdHJhaWxlciA9IHBvcyArIGkgLSA3OwotICAgICAgICAgICAgICBtX3BTeW50YXgtPlJlc3RvcmVQb3MocG9zICsgaSAtIG1fcFN5bnRheC0+bV9IZWFkZXJPZmZzZXQpOworICAgICAgICAgICAgICBtX3BTeW50YXgtPlNldFBvcyhwb3MgKyBpIC0gbV9wU3ludGF4LT5tX0hlYWRlck9mZnNldCk7CiAKICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBwT2JqID0KLSAgICAgICAgICAgICAgICAgIG1fcFN5bnRheC0+R2V0T2JqZWN0KG1fcERvY3VtZW50LCAwLCAwLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgIG1fcFN5bnRheC0+R2V0T2JqZWN0Qm9keShtX3BEb2N1bWVudC5HZXQoKSk7CiAgICAgICAgICAgICAgIGlmIChwT2JqKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBPYmotPklzRGljdGlvbmFyeSgpIHx8IHBPYmotPkFzU3RyZWFtKCkpIHsKICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gcE9iai0+QXNTdHJlYW0oKTsKICAgICAgICAgICAgICAgICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBUcmFpbGVyID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0cmVhbSA/IHBTdHJlYW0tPkdldERpY3QoKSA6IHBPYmotPkFzRGljdGlvbmFyeSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtX3BUcmFpbGVyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChHZXRUcmFpbGVyKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICBDUERGX09iamVjdCogcFJvb3QgPSBwVHJhaWxlci0+R2V0T2JqZWN0Rm9yKCJSb290Iik7CiAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSBUb1JlZmVyZW5jZShwUm9vdCk7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwUm9vdCB8fApAQCAtNzk3LDM2ICs4OTksMzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fT2JqZWN0SW5mb1twUmVmLT5HZXRSZWZPYmpOdW0oKV0ucG9zICE9IDApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGl0ID0gcFRyYWlsZXItPmJlZ2luKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXQgIT0gcFRyYWlsZXItPmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXkgPSBpdC0+Zmlyc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIGtleSA9IGl0LT5maXJzdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBFbGVtZW50ID0gaXQtPnNlY29uZC5nZXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdPYmpOdW0gPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEVsZW1lbnQgPyBwRWxlbWVudC0+R2V0T2JqTnVtKCkgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHdPYmpOdW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BUcmFpbGVyLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksIG1fcERvY3VtZW50LCBkd09iak51bSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0VHJhaWxlcigpLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksIG1fcERvY3VtZW50LkdldCgpLCBkd09iak51bSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wVHJhaWxlci0+U2V0Rm9yKGtleSwgcEVsZW1lbnQtPkNsb25lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFRyYWlsZXIoKS0+U2V0Rm9yKGtleSwgcEVsZW1lbnQtPkNsb25lKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgIGlmIChwT2JqLT5Jc1N0cmVhbSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtX3BUcmFpbGVyID0gVG9EaWN0aW9uYXJ5KHBUcmFpbGVyLT5DbG9uZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbV9wVHJhaWxlciA9IFRvRGljdGlvbmFyeShzdGQ6Om1vdmUocE9iaikpOwotICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICBtX1RyYWlsZXJEYXRhLT5TZXRNYWluVHJhaWxlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVG9EaWN0aW9uYXJ5KHBPYmotPklzU3RyZWFtKCkgPyBwVHJhaWxlci0+Q2xvbmUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHN0ZDo6bW92ZShwT2JqKSkpOwogCi0gICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgZHdTYXZlUG9zID0gbV9wU3ludGF4LT5TYXZlUG9zKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyV29yZCA9IG1fcFN5bnRheC0+R2V0S2V5d29yZCgpOworICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIGR3U2F2ZVBvcyA9IG1fcFN5bnRheC0+R2V0UG9zKCk7CisgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0cmluZyBzdHJXb3JkID0gbV9wU3ludGF4LT5HZXRLZXl3b3JkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJXb3JkLkNvbXBhcmUoInN0YXJ0eHJlZiIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJOdW1iZXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBic09mZnNldCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3ludGF4LT5HZXROZXh0V29yZCgmYk51bWJlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nIGJzT2Zmc2V0ID0gbV9wU3ludGF4LT5HZXROZXh0V29yZCgmYk51bWJlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYk51bWJlcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9MYXN0WFJlZk9mZnNldCA9IEZYU1lTX2F0b2koYnNPZmZzZXQuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgIG1fcFN5bnRheC0+UmVzdG9yZVBvcyhkd1NhdmVQb3MpOworICAgICAgICAgICAgICAgICAgICAgIG1fcFN5bnRheC0+U2V0UG9zKGR3U2F2ZVBvcyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC05MTgsMjMgKzEwMTcsMjIgQEAKICAgZWxzZSBpZiAobGFzdF90cmFpbGVyID09IC0xIHx8IGxhc3RfeHJlZiA8IGxhc3Rfb2JqKQogICAgIGxhc3RfdHJhaWxlciA9IG1fcFN5bnRheC0+bV9GaWxlTGVuOwogCi0gIG1fU29ydGVkT2Zmc2V0Lmluc2VydChsYXN0X3RyYWlsZXIgLSBtX3BTeW50YXgtPm1fSGVhZGVyT2Zmc2V0KTsKLSAgcmV0dXJuIG1fcFRyYWlsZXIgJiYgIW1fT2JqZWN0SW5mby5lbXB0eSgpOworICByZXR1cm4gR2V0VHJhaWxlcigpICYmICFtX09iamVjdEluZm8uZW1wdHkoKTsKIH0KIAogYm9vbCBDUERGX1BhcnNlcjo6TG9hZENyb3NzUmVmVjUoRlhfRklMRVNJWkUqIHBvcywgYm9vbCBiTWFpblhSZWYpIHsKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBwT2JqZWN0KAotICAgICAgUGFyc2VJbmRpcmVjdE9iamVjdEF0KG1fcERvY3VtZW50LCAqcG9zLCAwKSk7CisgICAgICBQYXJzZUluZGlyZWN0T2JqZWN0QXQobV9wRG9jdW1lbnQuR2V0KCksICpwb3MsIDApKTsKICAgaWYgKCFwT2JqZWN0KQogICAgIHJldHVybiBmYWxzZTsKIAotICB1aW50MzJfdCBvYmpudW0gPSBwT2JqZWN0LT5tX09iak51bTsKKyAgdWludDMyX3Qgb2JqbnVtID0gcE9iamVjdC0+R2V0T2JqTnVtKCk7CiAgIGlmICghb2JqbnVtKQogICAgIHJldHVybiBmYWxzZTsKIAogICBDUERGX09iamVjdCogcFVub3duZWRPYmplY3QgPSBwT2JqZWN0LmdldCgpOwogICBpZiAobV9wRG9jdW1lbnQpIHsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBSb290RGljdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7CisgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdERpY3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOwogICAgIGlmIChwUm9vdERpY3QgJiYgcFJvb3REaWN0LT5HZXRPYmpOdW0oKSA9PSBvYmpudW0pCiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgaWYgKCFtX3BEb2N1bWVudC0+UmVwbGFjZUluZGlyZWN0T2JqZWN0SWZIaWdoZXJHZW5lcmF0aW9uKApAQCAtOTU1LDEyICsxMDUzLDEyIEBACiAKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeT4gcE5ld1RyYWlsZXIgPSBUb0RpY3Rpb25hcnkocERpY3QtPkNsb25lKCkpOwogICBpZiAoYk1haW5YUmVmKSB7Ci0gICAgbV9wVHJhaWxlciA9IHN0ZDo6bW92ZShwTmV3VHJhaWxlcik7CisgICAgbV9UcmFpbGVyRGF0YS0+U2V0TWFpblRyYWlsZXIoc3RkOjptb3ZlKHBOZXdUcmFpbGVyKSk7CiAgICAgU2hyaW5rT2JqZWN0TWFwKHNpemUpOwogICAgIGZvciAoYXV0byYgaXQgOiBtX09iamVjdEluZm8pCi0gICAgICBpdC5zZWNvbmQudHlwZSA9IDA7CisgICAgICBpdC5zZWNvbmQudHlwZSA9IE9iamVjdFR5cGU6OmtGcmVlOwogICB9IGVsc2UgewotICAgIG1fVHJhaWxlcnMucHVzaF9iYWNrKHN0ZDo6bW92ZShwTmV3VHJhaWxlcikpOworICAgIG1fVHJhaWxlckRhdGEtPkFwcGVuZFRyYWlsZXIoc3RkOjptb3ZlKHBOZXdUcmFpbGVyKSk7CiAgIH0KIAogICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+IGFyckluZGV4OwpAQCAtOTk3LDE4ICsxMDk1LDE3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIHVpbnQzMl90IHRvdGFsV2lkdGggPSBkd0FjY1dpZHRoLlZhbHVlT3JEaWUoKTsKLSAgQ1BERl9TdHJlYW1BY2MgYWNjOwotICBhY2MuTG9hZEFsbERhdGEocFN0cmVhbSk7CisgIGF1dG8gcEFjYyA9IHBkZml1bTo6TWFrZVJldGFpbjxDUERGX1N0cmVhbUFjYz4ocFN0cmVhbSk7CisgIHBBY2MtPkxvYWRBbGxEYXRhRmlsdGVyZWQoKTsKIAotICBjb25zdCB1aW50OF90KiBwRGF0YSA9IGFjYy5HZXREYXRhKCk7Ci0gIHVpbnQzMl90IGR3VG90YWxTaXplID0gYWNjLkdldFNpemUoKTsKKyAgY29uc3QgdWludDhfdCogcERhdGEgPSBwQWNjLT5HZXREYXRhKCk7CisgIHVpbnQzMl90IGR3VG90YWxTaXplID0gcEFjYy0+R2V0U2l6ZSgpOwogICB1aW50MzJfdCBzZWdpbmRleCA9IDA7CiAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBhcnJJbmRleC5zaXplKCk7IGkrKykgewogICAgIGludDMyX3Qgc3RhcnRudW0gPSBhcnJJbmRleFtpXS5maXJzdDsKICAgICBpZiAoc3RhcnRudW0gPCAwKQogICAgICAgY29udGludWU7CiAKLSAgICBtX2R3WHJlZlN0YXJ0T2JqTnVtID0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8dWludDMyX3Q+KHN0YXJ0bnVtKTsKICAgICB1aW50MzJfdCBjb3VudCA9IHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PHVpbnQzMl90PihhcnJJbmRleFtpXS5zZWNvbmQpOwogICAgIEZYX1NBRkVfVUlOVDMyIGR3Q2FjdWxhdGVkU2l6ZSA9IHNlZ2luZGV4OwogICAgIGR3Q2FjdWxhdGVkU2l6ZSArPSBjb3VudDsKQEAgLTEwMjYsMzUgKzExMjMsNDEgQEAKICAgICAgIGNvbnRpbnVlOwogCiAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IGNvdW50OyBqKyspIHsKLSAgICAgIGludDMyX3QgdHlwZSA9IDE7CisgICAgICBPYmplY3RUeXBlIHR5cGUgPSBPYmplY3RUeXBlOjprTm90Q29tcHJlc3NlZDsKICAgICAgIGNvbnN0IHVpbnQ4X3QqIGVudHJ5c3RhcnQgPSBzZWdzdGFydCArIGogKiB0b3RhbFdpZHRoOwotICAgICAgaWYgKFdpZHRoQXJyYXlbMF0pCi0gICAgICAgIHR5cGUgPSBHZXRWYXJJbnQoZW50cnlzdGFydCwgV2lkdGhBcnJheVswXSk7CisgICAgICBpZiAoV2lkdGhBcnJheVswXSkgeworICAgICAgICBjb25zdCBpbnQgY3Jvc3NfcmVmX3N0cmVhbV9vYmpfdHlwZSA9CisgICAgICAgICAgICBHZXRWYXJJbnQoZW50cnlzdGFydCwgV2lkdGhBcnJheVswXSk7CisgICAgICAgIHR5cGUgPSBHZXRPYmplY3RUeXBlRnJvbUNyb3NzUmVmU3RyZWFtVHlwZShjcm9zc19yZWZfc3RyZWFtX29ial90eXBlKTsKKyAgICAgIH0KIAotICAgICAgaWYgKEdldE9iamVjdFR5cGUoc3RhcnRudW0gKyBqKSA9PSAyNTUpIHsKKyAgICAgIGlmIChHZXRPYmplY3RUeXBlKHN0YXJ0bnVtICsgaikgPT0gT2JqZWN0VHlwZTo6a051bGwpIHsKICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0KICAgICAgICAgICAgIEdldFZhckludChlbnRyeXN0YXJ0ICsgV2lkdGhBcnJheVswXSwgV2lkdGhBcnJheVsxXSk7CiAgICAgICAgIG1fT2JqZWN0SW5mb1tzdGFydG51bSArIGpdLnBvcyA9IG9mZnNldDsKLSAgICAgICAgbV9Tb3J0ZWRPZmZzZXQuaW5zZXJ0KG9mZnNldCk7CiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQogCi0gICAgICBpZiAoR2V0T2JqZWN0VHlwZShzdGFydG51bSArIGopKQorICAgICAgaWYgKEdldE9iamVjdFR5cGUoc3RhcnRudW0gKyBqKSAhPSBPYmplY3RUeXBlOjprRnJlZSkKICAgICAgICAgY29udGludWU7CiAKLSAgICAgIG1fT2JqZWN0SW5mb1tzdGFydG51bSArIGpdLnR5cGUgPSB0eXBlOwotICAgICAgaWYgKHR5cGUgPT0gMCkgewotICAgICAgICBtX09iamVjdEluZm9bc3RhcnRudW0gKyBqXS5wb3MgPSAwOworICAgICAgT2JqZWN0SW5mbyYgaW5mbyA9IG1fT2JqZWN0SW5mb1tzdGFydG51bSArIGpdOworCisgICAgICBpbmZvLnR5cGUgPSB0eXBlOworICAgICAgaWYgKHR5cGUgPT0gT2JqZWN0VHlwZTo6a0ZyZWUpIHsKKyAgICAgICAgaW5mby5wb3MgPSAwOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0KKyAgICAgICAgY29uc3QgRlhfRklMRVNJWkUgZW50cnlfdmFsdWUgPQogICAgICAgICAgICAgR2V0VmFySW50KGVudHJ5c3RhcnQgKyBXaWR0aEFycmF5WzBdLCBXaWR0aEFycmF5WzFdKTsKLSAgICAgICAgbV9PYmplY3RJbmZvW3N0YXJ0bnVtICsgal0ucG9zID0gb2Zmc2V0OwotICAgICAgICBpZiAodHlwZSA9PSAxKSB7Ci0gICAgICAgICAgbV9Tb3J0ZWRPZmZzZXQuaW5zZXJ0KG9mZnNldCk7CisgICAgICAgIGlmICh0eXBlID09IE9iamVjdFR5cGU6OmtOb3RDb21wcmVzc2VkKSB7CisgICAgICAgICAgY29uc3QgYXV0byBvYmplY3Rfb2Zmc2V0ID0gZW50cnlfdmFsdWU7CisgICAgICAgICAgaW5mby5wb3MgPSBvYmplY3Rfb2Zmc2V0OwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8ICFJc1ZhbGlkT2JqZWN0TnVtYmVyKG9mZnNldCkpCisgICAgICAgICAgY29uc3QgYXV0byBhcmNoaXZlX29ial9udW0gPSBlbnRyeV92YWx1ZTsKKyAgICAgICAgICBpbmZvLmFyY2hpdmVfb2JqX251bSA9IGFyY2hpdmVfb2JqX251bTsKKyAgICAgICAgICBpZiAoYXJjaGl2ZV9vYmpfbnVtIDwgMCB8fCAhSXNWYWxpZE9iamVjdE51bWJlcihhcmNoaXZlX29ial9udW0pKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIG1fT2JqZWN0SW5mb1tvZmZzZXRdLnR5cGUgPSAyNTU7CisgICAgICAgICAgbV9PYmplY3RJbmZvW2FyY2hpdmVfb2JqX251bV0udHlwZSA9IE9iamVjdFR5cGU6OmtOdWxsOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtMTA2MywzNSArMTE2NiwyNCBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotQ1BERl9BcnJheSogQ1BERl9QYXJzZXI6OkdldElEQXJyYXkoKSB7Ci0gIGlmICghbV9wVHJhaWxlcikKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBDUERGX09iamVjdCogcElEID0gbV9wVHJhaWxlci0+R2V0T2JqZWN0Rm9yKCJJRCIpOwotICBpZiAoIXBJRCkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBDUERGX1JlZmVyZW5jZSogcFJlZiA9IHBJRC0+QXNSZWZlcmVuY2UoKTsKLSAgaWYgKCFwUmVmKQotICAgIHJldHVybiBUb0FycmF5KHBJRCk7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBwTmV3T2JqID0KLSAgICAgIFBhcnNlSW5kaXJlY3RPYmplY3QobnVsbHB0ciwgcFJlZi0+R2V0UmVmT2JqTnVtKCkpOwotICBwSUQgPSBwTmV3T2JqLmdldCgpOwotICBtX3BUcmFpbGVyLT5TZXRGb3IoIklEIiwgc3RkOjptb3ZlKHBOZXdPYmopKTsKLSAgcmV0dXJuIFRvQXJyYXkocElEKTsKK2NvbnN0IENQREZfQXJyYXkqIENQREZfUGFyc2VyOjpHZXRJREFycmF5KCkgY29uc3QgeworICByZXR1cm4gR2V0VHJhaWxlcigpID8gR2V0VHJhaWxlcigpLT5HZXRBcnJheUZvcigiSUQiKSA6IG51bGxwdHI7CiB9CiAKLXVpbnQzMl90IENQREZfUGFyc2VyOjpHZXRSb290T2JqTnVtKCkgewotICBDUERGX1JlZmVyZW5jZSogcFJlZiA9Ci0gICAgICBUb1JlZmVyZW5jZShtX3BUcmFpbGVyID8gbV9wVHJhaWxlci0+R2V0T2JqZWN0Rm9yKCJSb290IikgOiBudWxscHRyKTsKLSAgcmV0dXJuIHBSZWYgPyBwUmVmLT5HZXRSZWZPYmpOdW0oKSA6IDA7CitDUERGX0RpY3Rpb25hcnkqIENQREZfUGFyc2VyOjpHZXRUcmFpbGVyKCkgY29uc3QgeworICByZXR1cm4gbV9UcmFpbGVyRGF0YS0+R2V0TWFpblRyYWlsZXIoKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeT4gQ1BERl9QYXJzZXI6OkdldENvbWJpbmVkVHJhaWxlcigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fVHJhaWxlckRhdGEtPkdldENvbWJpbmVkVHJhaWxlcigpOwogfQogCiB1aW50MzJfdCBDUERGX1BhcnNlcjo6R2V0SW5mb09iak51bSgpIHsKLSAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPQotICAgICAgVG9SZWZlcmVuY2UobV9wVHJhaWxlciA/IG1fcFRyYWlsZXItPkdldE9iamVjdEZvcigiSW5mbyIpIDogbnVsbHB0cik7Ci0gIHJldHVybiBwUmVmID8gcFJlZi0+R2V0UmVmT2JqTnVtKCkgOiAwOworICByZXR1cm4gbV9UcmFpbGVyRGF0YS0+R2V0SW5mb09iak51bSgpOworfQorCit1aW50MzJfdCBDUERGX1BhcnNlcjo6R2V0Um9vdE9iak51bSgpIHsKKyAgcmV0dXJuIG1fVHJhaWxlckRhdGEtPkdldFJvb3RPYmpOdW0oKTsKIH0KIAogc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBDUERGX1BhcnNlcjo6UGFyc2VJbmRpcmVjdE9iamVjdCgKQEAgLTExMDUsMjEgKzExOTcsMjQgQEAKICAgICByZXR1cm4gbnVsbHB0cjsKIAogICBwZGZpdW06OlNjb3BlZFNldEluc2VydGlvbjx1aW50MzJfdD4gbG9jYWxfaW5zZXJ0KCZtX1BhcnNpbmdPYmpOdW1zLCBvYmpudW0pOwotICBpZiAoR2V0T2JqZWN0VHlwZShvYmpudW0pID09IDEgfHwgR2V0T2JqZWN0VHlwZShvYmpudW0pID09IDI1NSkgeworICBpZiAoR2V0T2JqZWN0VHlwZShvYmpudW0pID09IE9iamVjdFR5cGU6OmtOb3RDb21wcmVzc2VkIHx8CisgICAgICBHZXRPYmplY3RUeXBlKG9iam51bSkgPT0gT2JqZWN0VHlwZTo6a051bGwpIHsKICAgICBGWF9GSUxFU0laRSBwb3MgPSBtX09iamVjdEluZm9bb2JqbnVtXS5wb3M7CiAgICAgaWYgKHBvcyA8PSAwKQogICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgcmV0dXJuIFBhcnNlSW5kaXJlY3RPYmplY3RBdChwT2JqTGlzdCwgcG9zLCBvYmpudW0pOwogICB9Ci0gIGlmIChHZXRPYmplY3RUeXBlKG9iam51bSkgIT0gMikKKyAgaWYgKEdldE9iamVjdFR5cGUob2JqbnVtKSAhPSBPYmplY3RUeXBlOjprQ29tcHJlc3NlZCkKICAgICByZXR1cm4gbnVsbHB0cjsKIAotICBDUERGX1N0cmVhbUFjYyogcE9ialN0cmVhbSA9IEdldE9iamVjdFN0cmVhbShtX09iamVjdEluZm9bb2JqbnVtXS5wb3MpOworICBSZXRhaW5QdHI8Q1BERl9TdHJlYW1BY2M+IHBPYmpTdHJlYW0gPQorICAgICAgR2V0T2JqZWN0U3RyZWFtKG1fT2JqZWN0SW5mb1tvYmpudW1dLnBvcyk7CiAgIGlmICghcE9ialN0cmVhbSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAotICBDRlhfUmV0YWluUHRyPElGWF9NZW1vcnlTdHJlYW0+IGZpbGUgPSBJRlhfTWVtb3J5U3RyZWFtOjpDcmVhdGUoCi0gICAgICAodWludDhfdCopcE9ialN0cmVhbS0+R2V0RGF0YSgpLCAoc2l6ZV90KXBPYmpTdHJlYW0tPkdldFNpemUoKSwgZmFsc2UpOworICBhdXRvIGZpbGUgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX01lbW9yeVN0cmVhbT4oCisgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QqPihwT2JqU3RyZWFtLT5HZXREYXRhKCkpLAorICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihwT2JqU3RyZWFtLT5HZXRTaXplKCkpLCBmYWxzZSk7CiAgIENQREZfU3ludGF4UGFyc2VyIHN5bnRheDsKICAgc3ludGF4LkluaXRQYXJzZXIoZmlsZSwgMCk7CiAgIGNvbnN0IGludDMyX3Qgb2Zmc2V0ID0gR2V0U3RyZWFtRmlyc3QocE9ialN0cmVhbSk7CkBAIC0xMTM3LDE0ICsxMjMyLDE0IEBACiAgIGlmIChpdCA9PSBtX09iakNhY2hlW3BPYmpTdHJlYW1dLmVuZCgpKQogICAgIHJldHVybiBudWxscHRyOwogCi0gIHN5bnRheC5SZXN0b3JlUG9zKG9mZnNldCArIGl0LT5zZWNvbmQpOwotICByZXR1cm4gc3ludGF4LkdldE9iamVjdChwT2JqTGlzdCwgMCwgMCwgdHJ1ZSk7CisgIHN5bnRheC5TZXRQb3Mob2Zmc2V0ICsgaXQtPnNlY29uZCk7CisgIHJldHVybiBzeW50YXguR2V0T2JqZWN0Qm9keShwT2JqTGlzdCk7CiB9CiAKLUNQREZfU3RyZWFtQWNjKiBDUERGX1BhcnNlcjo6R2V0T2JqZWN0U3RyZWFtKHVpbnQzMl90IG9iam51bSkgeworUmV0YWluUHRyPENQREZfU3RyZWFtQWNjPiBDUERGX1BhcnNlcjo6R2V0T2JqZWN0U3RyZWFtKHVpbnQzMl90IG9iam51bSkgewogICBhdXRvIGl0ID0gbV9PYmplY3RTdHJlYW1NYXAuZmluZChvYmpudW0pOwogICBpZiAoaXQgIT0gbV9PYmplY3RTdHJlYW1NYXAuZW5kKCkpCi0gICAgcmV0dXJuIGl0LT5zZWNvbmQuZ2V0KCk7CisgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CiAKICAgaWYgKCFtX3BEb2N1bWVudCkKICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTExNTQsMTk3ICsxMjQ5LDQ1IEBACiAgIGlmICghcFN0cmVhbSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAotICBDUERGX1N0cmVhbUFjYyogcFN0cmVhbUFjYyA9IG5ldyBDUERGX1N0cmVhbUFjYzsKLSAgcFN0cmVhbUFjYy0+TG9hZEFsbERhdGEocFN0cmVhbSk7Ci0gIG1fT2JqZWN0U3RyZWFtTWFwW29iam51bV0ucmVzZXQocFN0cmVhbUFjYyk7CisgIGF1dG8gcFN0cmVhbUFjYyA9IHBkZml1bTo6TWFrZVJldGFpbjxDUERGX1N0cmVhbUFjYz4ocFN0cmVhbSk7CisgIHBTdHJlYW1BY2MtPkxvYWRBbGxEYXRhRmlsdGVyZWQoKTsKKyAgbV9PYmplY3RTdHJlYW1NYXBbb2JqbnVtXSA9IHBTdHJlYW1BY2M7CiAgIHJldHVybiBwU3RyZWFtQWNjOwogfQogCi1GWF9GSUxFU0laRSBDUERGX1BhcnNlcjo6R2V0T2JqZWN0U2l6ZSh1aW50MzJfdCBvYmpudW0pIGNvbnN0IHsKLSAgaWYgKCFJc1ZhbGlkT2JqZWN0TnVtYmVyKG9iam51bSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKEdldE9iamVjdFR5cGUob2JqbnVtKSA9PSAyKQotICAgIG9iam51bSA9IEdldE9iamVjdFBvc2l0aW9uT3JaZXJvKG9iam51bSk7Ci0KLSAgaWYgKEdldE9iamVjdFR5cGUob2JqbnVtKSAhPSAxICYmIEdldE9iamVjdFR5cGUob2JqbnVtKSAhPSAyNTUpCi0gICAgcmV0dXJuIDA7Ci0KLSAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gR2V0T2JqZWN0UG9zaXRpb25Pclplcm8ob2JqbnVtKTsKLSAgaWYgKG9mZnNldCA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIGF1dG8gaXQgPSBtX1NvcnRlZE9mZnNldC5maW5kKG9mZnNldCk7Ci0gIGlmIChpdCA9PSBtX1NvcnRlZE9mZnNldC5lbmQoKSB8fCArK2l0ID09IG1fU29ydGVkT2Zmc2V0LmVuZCgpKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiAqaXQgLSBvZmZzZXQ7Ci19Ci0KLXZvaWQgQ1BERl9QYXJzZXI6OkdldEluZGlyZWN0QmluYXJ5KHVpbnQzMl90IG9iam51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBwQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNpemUpIHsKLSAgcEJ1ZmZlciA9IG51bGxwdHI7Ci0gIHNpemUgPSAwOwotICBpZiAoIUlzVmFsaWRPYmplY3ROdW1iZXIob2JqbnVtKSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKEdldE9iamVjdFR5cGUob2JqbnVtKSA9PSAyKSB7Ci0gICAgQ1BERl9TdHJlYW1BY2MqIHBPYmpTdHJlYW0gPSBHZXRPYmplY3RTdHJlYW0obV9PYmplY3RJbmZvW29iam51bV0ucG9zKTsKLSAgICBpZiAoIXBPYmpTdHJlYW0pCi0gICAgICByZXR1cm47Ci0KLSAgICBpbnQzMl90IG9mZnNldCA9IEdldFN0cmVhbUZpcnN0KHBPYmpTdHJlYW0pOwotICAgIGNvbnN0IHVpbnQ4X3QqIHBEYXRhID0gcE9ialN0cmVhbS0+R2V0RGF0YSgpOwotICAgIHVpbnQzMl90IHRvdGFsc2l6ZSA9IHBPYmpTdHJlYW0tPkdldFNpemUoKTsKLSAgICBDRlhfUmV0YWluUHRyPElGWF9NZW1vcnlTdHJlYW0+IGZpbGUgPQotICAgICAgICBJRlhfTWVtb3J5U3RyZWFtOjpDcmVhdGUoKHVpbnQ4X3QqKXBEYXRhLCAoc2l6ZV90KXRvdGFsc2l6ZSwgZmFsc2UpOwotICAgIENQREZfU3ludGF4UGFyc2VyIHN5bnRheDsKLSAgICBzeW50YXguSW5pdFBhcnNlcihmaWxlLCAwKTsKLQotICAgIGZvciAoaW50IGkgPSBHZXRTdHJlYW1OQ291bnQocE9ialN0cmVhbSk7IGkgPiAwOyAtLWkpIHsKLSAgICAgIHVpbnQzMl90IHRoaXNudW0gPSBzeW50YXguR2V0RGlyZWN0TnVtKCk7Ci0gICAgICB1aW50MzJfdCB0aGlzb2ZmID0gc3ludGF4LkdldERpcmVjdE51bSgpOwotICAgICAgaWYgKHRoaXNudW0gIT0gb2JqbnVtKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKGkgPT0gMSkgewotICAgICAgICBzaXplID0gdG90YWxzaXplIC0gKHRoaXNvZmYgKyBvZmZzZXQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3ludGF4LkdldERpcmVjdE51bSgpOyAgLy8gU2tpcCBuZXh0bnVtLgotICAgICAgICB1aW50MzJfdCBuZXh0b2ZmID0gc3ludGF4LkdldERpcmVjdE51bSgpOwotICAgICAgICBzaXplID0gbmV4dG9mZiAtIHRoaXNvZmY7Ci0gICAgICB9Ci0KLSAgICAgIHBCdWZmZXIgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKLSAgICAgIEZYU1lTX21lbWNweShwQnVmZmVyLCBwRGF0YSArIHRoaXNvZmYgKyBvZmZzZXQsIHNpemUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoR2V0T2JqZWN0VHlwZShvYmpudW0pICE9IDEpCi0gICAgcmV0dXJuOwotCi0gIEZYX0ZJTEVTSVpFIHBvcyA9IG1fT2JqZWN0SW5mb1tvYmpudW1dLnBvczsKLSAgaWYgKHBvcyA9PSAwKQotICAgIHJldHVybjsKLQotICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fcFN5bnRheC0+U2F2ZVBvcygpOwotICBtX3BTeW50YXgtPlJlc3RvcmVQb3MocG9zKTsKLQotICBib29sIGJJc051bWJlcjsKLSAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IG1fcFN5bnRheC0+R2V0TmV4dFdvcmQoJmJJc051bWJlcik7Ci0gIGlmICghYklzTnVtYmVyKSB7Ci0gICAgbV9wU3ludGF4LT5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB1aW50MzJfdCBwYXJzZXJfb2JqbnVtID0gRlhTWVNfYXRvdWkod29yZC5jX3N0cigpKTsKLSAgaWYgKHBhcnNlcl9vYmpudW0gJiYgcGFyc2VyX29iam51bSAhPSBvYmpudW0pIHsKLSAgICBtX3BTeW50YXgtPlJlc3RvcmVQb3MoU2F2ZWRQb3MpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHdvcmQgPSBtX3BTeW50YXgtPkdldE5leHRXb3JkKCZiSXNOdW1iZXIpOwotICBpZiAoIWJJc051bWJlcikgewotICAgIG1fcFN5bnRheC0+UmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKG1fcFN5bnRheC0+R2V0S2V5d29yZCgpICE9ICJvYmoiKSB7Ci0gICAgbV9wU3ludGF4LT5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBhdXRvIGl0ID0gbV9Tb3J0ZWRPZmZzZXQuZmluZChwb3MpOwotICBpZiAoaXQgPT0gbV9Tb3J0ZWRPZmZzZXQuZW5kKCkgfHwgKytpdCA9PSBtX1NvcnRlZE9mZnNldC5lbmQoKSkgewotICAgIG1fcFN5bnRheC0+UmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRlhfRklMRVNJWkUgbmV4dG9mZiA9ICppdDsKLSAgYm9vbCBiTmV4dE9mZlZhbGlkID0gZmFsc2U7Ci0gIGlmIChuZXh0b2ZmICE9IHBvcykgewotICAgIG1fcFN5bnRheC0+UmVzdG9yZVBvcyhuZXh0b2ZmKTsKLSAgICB3b3JkID0gbV9wU3ludGF4LT5HZXROZXh0V29yZCgmYklzTnVtYmVyKTsKLSAgICBpZiAod29yZCA9PSAieHJlZiIpIHsKLSAgICAgIGJOZXh0T2ZmVmFsaWQgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoYklzTnVtYmVyKSB7Ci0gICAgICB3b3JkID0gbV9wU3ludGF4LT5HZXROZXh0V29yZCgmYklzTnVtYmVyKTsKLSAgICAgIGlmIChiSXNOdW1iZXIgJiYgbV9wU3ludGF4LT5HZXRLZXl3b3JkKCkgPT0gIm9iaiIpIHsKLSAgICAgICAgYk5leHRPZmZWYWxpZCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFiTmV4dE9mZlZhbGlkKSB7Ci0gICAgbV9wU3ludGF4LT5SZXN0b3JlUG9zKHBvcyk7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgIGlmIChtX3BTeW50YXgtPkdldEtleXdvcmQoKSA9PSAiZW5kb2JqIikKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmIChtX3BTeW50YXgtPlNhdmVQb3MoKSA9PSBtX3BTeW50YXgtPm1fRmlsZUxlbikKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIG5leHRvZmYgPSBtX3BTeW50YXgtPlNhdmVQb3MoKTsKLSAgfQotCi0gIHNpemUgPSAodWludDMyX3QpKG5leHRvZmYgLSBwb3MpOwotICBwQnVmZmVyID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7Ci0gIG1fcFN5bnRheC0+UmVzdG9yZVBvcyhwb3MpOwotICBtX3BTeW50YXgtPlJlYWRCbG9jayhwQnVmZmVyLCBzaXplKTsKLSAgbV9wU3ludGF4LT5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLX0KLQogc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBDUERGX1BhcnNlcjo6UGFyc2VJbmRpcmVjdE9iamVjdEF0KAogICAgIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIHBPYmpMaXN0LAogICAgIEZYX0ZJTEVTSVpFIHBvcywKICAgICB1aW50MzJfdCBvYmpudW0pIHsKLSAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX3BTeW50YXgtPlNhdmVQb3MoKTsKLSAgbV9wU3ludGF4LT5SZXN0b3JlUG9zKHBvcyk7Ci0gIGJvb2wgYklzTnVtYmVyOwotICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gbV9wU3ludGF4LT5HZXROZXh0V29yZCgmYklzTnVtYmVyKTsKLSAgaWYgKCFiSXNOdW1iZXIpIHsKLSAgICBtX3BTeW50YXgtPlJlc3RvcmVQb3MoU2F2ZWRQb3MpOworICByZXR1cm4gUGFyc2VJbmRpcmVjdE9iamVjdEF0SW50ZXJuYWwoCisgICAgICBwT2JqTGlzdCwgcG9zLCBvYmpudW0sIENQREZfU3ludGF4UGFyc2VyOjpQYXJzZVR5cGU6OmtMb29zZSwgbnVsbHB0cik7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gQ1BERl9QYXJzZXI6OlBhcnNlSW5kaXJlY3RPYmplY3RBdEludGVybmFsKAorICAgIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIHBPYmpMaXN0LAorICAgIEZYX0ZJTEVTSVpFIHBvcywKKyAgICB1aW50MzJfdCBvYmpudW0sCisgICAgQ1BERl9TeW50YXhQYXJzZXI6OlBhcnNlVHlwZSBwYXJzZV90eXBlLAorICAgIEZYX0ZJTEVTSVpFKiBwUmVzdWx0UG9zKSB7CisgIGNvbnN0IEZYX0ZJTEVTSVpFIHNhdmVkX3BvcyA9IG1fcFN5bnRheC0+R2V0UG9zKCk7CisgIG1fcFN5bnRheC0+U2V0UG9zKHBvcyk7CisgIGF1dG8gcmVzdWx0ID0gbV9wU3ludGF4LT5HZXRJbmRpcmVjdE9iamVjdChwT2JqTGlzdCwgcGFyc2VfdHlwZSk7CisKKyAgaWYgKHBSZXN1bHRQb3MpCisgICAgKnBSZXN1bHRQb3MgPSBtX3BTeW50YXgtPkdldFBvcygpOworICBtX3BTeW50YXgtPlNldFBvcyhzYXZlZF9wb3MpOworCisgIGlmIChyZXN1bHQgJiYgb2JqbnVtICYmIHJlc3VsdC0+R2V0T2JqTnVtKCkgIT0gb2JqbnVtKQogICAgIHJldHVybiBudWxscHRyOwotICB9CiAKLSAgRlhfRklMRVNJWkUgb2JqT2Zmc2V0ID0gbV9wU3ludGF4LT5TYXZlUG9zKCk7Ci0gIG9iak9mZnNldCAtPSB3b3JkLkdldExlbmd0aCgpOwotICB1aW50MzJfdCBwYXJzZXJfb2JqbnVtID0gRlhTWVNfYXRvdWkod29yZC5jX3N0cigpKTsKLSAgaWYgKG9iam51bSAmJiBwYXJzZXJfb2JqbnVtICE9IG9iam51bSkgewotICAgIG1fcFN5bnRheC0+UmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KKyAgY29uc3QgYm9vbCBzaG91bGRfZGVjcnlwdCA9IG1fcFNlY3VyaXR5SGFuZGxlciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU2VjdXJpdHlIYW5kbGVyLT5HZXRDcnlwdG9IYW5kbGVyKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iam51bSAhPSBtX01ldGFkYXRhT2JqbnVtOworICBpZiAoc2hvdWxkX2RlY3J5cHQpCisgICAgcmVzdWx0ID0gbV9wU2VjdXJpdHlIYW5kbGVyLT5HZXRDcnlwdG9IYW5kbGVyKCktPkRlY3J5cHRPYmplY3RUcmVlKAorICAgICAgICBzdGQ6Om1vdmUocmVzdWx0KSk7CiAKLSAgd29yZCA9IG1fcFN5bnRheC0+R2V0TmV4dFdvcmQoJmJJc051bWJlcik7Ci0gIGlmICghYklzTnVtYmVyKSB7Ci0gICAgbV9wU3ludGF4LT5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotCi0gIHVpbnQzMl90IHBhcnNlcl9nZW5udW0gPSBGWFNZU19hdG91aSh3b3JkLmNfc3RyKCkpOwotICBpZiAobV9wU3ludGF4LT5HZXRLZXl3b3JkKCkgIT0gIm9iaiIpIHsKLSAgICBtX3BTeW50YXgtPlJlc3RvcmVQb3MoU2F2ZWRQb3MpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBwT2JqID0KLSAgICAgIG1fcFN5bnRheC0+R2V0T2JqZWN0KHBPYmpMaXN0LCBvYmpudW0sIHBhcnNlcl9nZW5udW0sIHRydWUpOwotICBtX3BTeW50YXgtPlNhdmVQb3MoKTsKLQotICBDRlhfQnl0ZVN0cmluZyBic1dvcmQgPSBtX3BTeW50YXgtPkdldEtleXdvcmQoKTsKLSAgaWYgKGJzV29yZCA9PSAiZW5kb2JqIikKLSAgICBtX3BTeW50YXgtPlNhdmVQb3MoKTsKLQotICBtX3BTeW50YXgtPlJlc3RvcmVQb3MoU2F2ZWRQb3MpOwotICBpZiAocE9iaikgewotICAgIGlmICghb2JqbnVtKQotICAgICAgcE9iai0+bV9PYmpOdW0gPSBwYXJzZXJfb2JqbnVtOwotICAgIHBPYmotPm1fR2VuTnVtID0gcGFyc2VyX2dlbm51bTsKLSAgfQotICByZXR1cm4gcE9iajsKKyAgcmV0dXJuIHJlc3VsdDsKIH0KIAogc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBDUERGX1BhcnNlcjo6UGFyc2VJbmRpcmVjdE9iamVjdEF0QnlTdHJpY3QoCkBAIC0xMzUyLDQyICsxMjk1LDggQEAKICAgICBGWF9GSUxFU0laRSBwb3MsCiAgICAgdWludDMyX3Qgb2JqbnVtLAogICAgIEZYX0ZJTEVTSVpFKiBwUmVzdWx0UG9zKSB7Ci0gIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9wU3ludGF4LT5TYXZlUG9zKCk7Ci0gIG1fcFN5bnRheC0+UmVzdG9yZVBvcyhwb3MpOwotCi0gIGJvb2wgYklzTnVtYmVyOwotICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gbV9wU3ludGF4LT5HZXROZXh0V29yZCgmYklzTnVtYmVyKTsKLSAgaWYgKCFiSXNOdW1iZXIpIHsKLSAgICBtX3BTeW50YXgtPlJlc3RvcmVQb3MoU2F2ZWRQb3MpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgdWludDMyX3QgcGFyc2VyX29iam51bSA9IEZYU1lTX2F0b3VpKHdvcmQuY19zdHIoKSk7Ci0gIGlmIChvYmpudW0gJiYgcGFyc2VyX29iam51bSAhPSBvYmpudW0pIHsKLSAgICBtX3BTeW50YXgtPlJlc3RvcmVQb3MoU2F2ZWRQb3MpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgd29yZCA9IG1fcFN5bnRheC0+R2V0TmV4dFdvcmQoJmJJc051bWJlcik7Ci0gIGlmICghYklzTnVtYmVyKSB7Ci0gICAgbV9wU3ludGF4LT5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotCi0gIHVpbnQzMl90IGdlbm51bSA9IEZYU1lTX2F0b3VpKHdvcmQuY19zdHIoKSk7Ci0gIGlmIChtX3BTeW50YXgtPkdldEtleXdvcmQoKSAhPSAib2JqIikgewotICAgIG1fcFN5bnRheC0+UmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IHBPYmogPQotICAgICAgbV9wU3ludGF4LT5HZXRPYmplY3RGb3JTdHJpY3QocE9iakxpc3QsIG9iam51bSwgZ2VubnVtKTsKLQotICBpZiAocFJlc3VsdFBvcykKLSAgICAqcFJlc3VsdFBvcyA9IG1fcFN5bnRheC0+bV9Qb3M7Ci0KLSAgbV9wU3ludGF4LT5SZXN0b3JlUG9zKFNhdmVkUG9zKTsKLSAgcmV0dXJuIHBPYmo7CisgIHJldHVybiBQYXJzZUluZGlyZWN0T2JqZWN0QXRJbnRlcm5hbCgKKyAgICAgIHBPYmpMaXN0LCBwb3MsIG9iam51bSwgQ1BERl9TeW50YXhQYXJzZXI6OlBhcnNlVHlwZTo6a1N0cmljdCwgcFJlc3VsdFBvcyk7CiB9CiAKIHVpbnQzMl90IENQREZfUGFyc2VyOjpHZXRGaXJzdFBhZ2VObygpIGNvbnN0IHsKQEAgLTEzOTgsNyArMTMwNyw3IEBACiAgIGlmIChtX3BTeW50YXgtPkdldEtleXdvcmQoKSAhPSAidHJhaWxlciIpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgcmV0dXJuIFRvRGljdGlvbmFyeShtX3BTeW50YXgtPkdldE9iamVjdChtX3BEb2N1bWVudCwgMCwgMCwgdHJ1ZSkpOworICByZXR1cm4gVG9EaWN0aW9uYXJ5KG1fcFN5bnRheC0+R2V0T2JqZWN0Qm9keShtX3BEb2N1bWVudC5HZXQoKSkpOwogfQogCiB1aW50MzJfdCBDUERGX1BhcnNlcjo6R2V0UGVybWlzc2lvbnMoKSBjb25zdCB7CkBAIC0xNDE0LDYxICsxMzIzLDMxIEBACiAgIHJldHVybiBkd1Blcm1pc3Npb247CiB9CiAKLWJvb2wgQ1BERl9QYXJzZXI6OklzTGluZWFyaXplZEZpbGUoCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGVBY2Nlc3MsCi0gICAgdWludDMyX3Qgb2Zmc2V0KSB7Ci0gIG1fcFN5bnRheC0+SW5pdFBhcnNlcihwRmlsZUFjY2Vzcywgb2Zmc2V0KTsKLSAgbV9wU3ludGF4LT5SZXN0b3JlUG9zKG1fcFN5bnRheC0+bV9IZWFkZXJPZmZzZXQgKyA5KTsKLQotICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fcFN5bnRheC0+U2F2ZVBvcygpOwotICBib29sIGJJc051bWJlcjsKLSAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IG1fcFN5bnRheC0+R2V0TmV4dFdvcmQoJmJJc051bWJlcik7Ci0gIGlmICghYklzTnVtYmVyKQotICAgIHJldHVybiBmYWxzZTsKLQotICB1aW50MzJfdCBvYmpudW0gPSBGWFNZU19hdG91aSh3b3JkLmNfc3RyKCkpOwotICB3b3JkID0gbV9wU3ludGF4LT5HZXROZXh0V29yZCgmYklzTnVtYmVyKTsKLSAgaWYgKCFiSXNOdW1iZXIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHVpbnQzMl90IGdlbm51bSA9IEZYU1lTX2F0b3VpKHdvcmQuY19zdHIoKSk7Ci0gIGlmIChtX3BTeW50YXgtPkdldEtleXdvcmQoKSAhPSAib2JqIikgewotICAgIG1fcFN5bnRheC0+UmVzdG9yZVBvcyhTYXZlZFBvcyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgbV9wTGluZWFyaXplZCA9IENQREZfTGluZWFyaXplZEhlYWRlcjo6Q3JlYXRlRm9yT2JqZWN0KAotICAgICAgbV9wU3ludGF4LT5HZXRPYmplY3QobnVsbHB0ciwgb2JqbnVtLCBnZW5udW0sIHRydWUpKTsKLSAgaWYgKCFtX3BMaW5lYXJpemVkKQotICAgIHJldHVybiBmYWxzZTsKLQotICBtX0xhc3RYUmVmT2Zmc2V0ID0gbV9wTGluZWFyaXplZC0+R2V0TGFzdFhSZWZPZmZzZXQoKTsKLSAgLy8gTW92ZSBwYXJzZXIgb250byBmaXJzdCBwYWdlIHhyZWYgdGFibGUgc3RhcnQuCi0gIG1fcFN5bnRheC0+R2V0TmV4dFdvcmQobnVsbHB0cik7Ci0gIHJldHVybiB0cnVlOworc3RkOjp1bmlxdWVfcHRyPENQREZfTGluZWFyaXplZEhlYWRlcj4gQ1BERl9QYXJzZXI6OlBhcnNlTGluZWFyaXplZEhlYWRlcigpIHsKKyAgcmV0dXJuIENQREZfTGluZWFyaXplZEhlYWRlcjo6UGFyc2UobV9wU3ludGF4LmdldCgpKTsKIH0KIAogQ1BERl9QYXJzZXI6OkVycm9yIENQREZfUGFyc2VyOjpTdGFydExpbmVhcml6ZWRQYXJzZSgKLSAgICBjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZUFjY2VzcywKKyAgICBjb25zdCBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBGaWxlQWNjZXNzLAogICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCkgewogICBBU1NFUlQoIW1fYkhhc1BhcnNlZCk7CiAgIG1fYlhSZWZTdHJlYW0gPSBmYWxzZTsKICAgbV9MYXN0WFJlZk9mZnNldCA9IDA7CiAKLSAgaW50MzJfdCBvZmZzZXQgPSBHZXRIZWFkZXJPZmZzZXQocEZpbGVBY2Nlc3MpOwotICBpZiAob2Zmc2V0ID09IC0xKQorICBpZiAoIUluaXRTeW50YXhQYXJzZXIocEZpbGVBY2Nlc3MpKQogICAgIHJldHVybiBGT1JNQVRfRVJST1I7CiAKLSAgaWYgKCFJc0xpbmVhcml6ZWRGaWxlKHBGaWxlQWNjZXNzLCBvZmZzZXQpKSB7Ci0gICAgbV9wU3ludGF4LT5tX3BGaWxlQWNjZXNzID0gbnVsbHB0cjsKLSAgICByZXR1cm4gU3RhcnRQYXJzZShwRmlsZUFjY2Vzcywgc3RkOjptb3ZlKHBEb2N1bWVudCkpOwotICB9CisgIG1fcExpbmVhcml6ZWQgPSBQYXJzZUxpbmVhcml6ZWRIZWFkZXIoKTsKKyAgaWYgKCFtX3BMaW5lYXJpemVkKQorICAgIHJldHVybiBTdGFydFBhcnNlSW50ZXJuYWwoc3RkOjptb3ZlKHBEb2N1bWVudCkpOworCiAgIG1fYkhhc1BhcnNlZCA9IHRydWU7CiAgIG1fcERvY3VtZW50ID0gcERvY3VtZW50OwogCi0gIEZYX0ZJTEVTSVpFIGR3Rmlyc3RYUmVmT2Zmc2V0ID0gbV9wU3ludGF4LT5TYXZlUG9zKCk7CisgIG1fTGFzdFhSZWZPZmZzZXQgPSBtX3BMaW5lYXJpemVkLT5HZXRMYXN0WFJlZk9mZnNldCgpOworICBGWF9GSUxFU0laRSBkd0ZpcnN0WFJlZk9mZnNldCA9IG1fTGFzdFhSZWZPZmZzZXQ7CiAgIGJvb2wgYlhSZWZSZWJ1aWx0ID0gZmFsc2U7Ci0gIGJvb2wgYkxvYWRWNCA9IExvYWRDcm9zc1JlZlY0KGR3Rmlyc3RYUmVmT2Zmc2V0LCAwLCBmYWxzZSk7CisgIGJvb2wgYkxvYWRWNCA9IExvYWRDcm9zc1JlZlY0KGR3Rmlyc3RYUmVmT2Zmc2V0LCBmYWxzZSk7CiAgIGlmICghYkxvYWRWNCAmJiAhTG9hZENyb3NzUmVmVjUoJmR3Rmlyc3RYUmVmT2Zmc2V0LCB0cnVlKSkgewogICAgIGlmICghUmVidWlsZENyb3NzUmVmKCkpCiAgICAgICByZXR1cm4gRk9STUFUX0VSUk9SOwpAQCAtMTQ3NiwxMyArMTM1NSwxMyBAQAogICAgIGJYUmVmUmVidWlsdCA9IHRydWU7CiAgICAgbV9MYXN0WFJlZk9mZnNldCA9IDA7CiAgIH0KLQogICBpZiAoYkxvYWRWNCkgewotICAgIG1fcFRyYWlsZXIgPSBMb2FkVHJhaWxlclY0KCk7Ci0gICAgaWYgKCFtX3BUcmFpbGVyKQorICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0RpY3Rpb25hcnk+IHRyYWlsZXIgPSBMb2FkVHJhaWxlclY0KCk7CisgICAgaWYgKCF0cmFpbGVyKQogICAgICAgcmV0dXJuIFNVQ0NFU1M7CiAKLSAgICBpbnQzMl90IHhyZWZzaXplID0gR2V0RGlyZWN0SW50ZWdlcihtX3BUcmFpbGVyLmdldCgpLCAiU2l6ZSIpOworICAgIG1fVHJhaWxlckRhdGEtPlNldE1haW5UcmFpbGVyKHN0ZDo6bW92ZSh0cmFpbGVyKSk7CisgICAgaW50MzJfdCB4cmVmc2l6ZSA9IEdldERpcmVjdEludGVnZXIoR2V0VHJhaWxlcigpLCAiU2l6ZSIpOwogICAgIGlmICh4cmVmc2l6ZSA+IDApCiAgICAgICBTaHJpbmtPYmplY3RNYXAoeHJlZnNpemUpOwogICB9CkBAIC0xNTIyLDcgKzE0MDEsNyBAQAogICBpZiAobV9wU2VjdXJpdHlIYW5kbGVyICYmIG1fcFNlY3VyaXR5SGFuZGxlci0+SXNNZXRhZGF0YUVuY3J5cHRlZCgpKSB7CiAgICAgaWYgKENQREZfUmVmZXJlbmNlKiBwTWV0YWRhdGEgPQogICAgICAgICAgICAgVG9SZWZlcmVuY2UobV9wRG9jdW1lbnQtPkdldFJvb3QoKS0+R2V0T2JqZWN0Rm9yKCJNZXRhZGF0YSIpKSkKLSAgICAgIG1fcFN5bnRheC0+bV9NZXRhZGF0YU9iam51bSA9IHBNZXRhZGF0YS0+R2V0UmVmT2JqTnVtKCk7CisgICAgICBtX01ldGFkYXRhT2JqbnVtID0gcE1ldGFkYXRhLT5HZXRSZWZPYmpOdW0oKTsKICAgfQogICByZXR1cm4gU1VDQ0VTUzsKIH0KQEAgLTE1NDcsMzMgKzE0MjYsMzcgQEAKIH0KIAogQ1BERl9QYXJzZXI6OkVycm9yIENQREZfUGFyc2VyOjpMb2FkTGluZWFyaXplZE1haW5YUmVmVGFibGUoKSB7Ci0gIHVpbnQzMl90IGR3U2F2ZU1ldGFkYXRhT2JqbnVtID0gbV9wU3ludGF4LT5tX01ldGFkYXRhT2JqbnVtOwotICBtX3BTeW50YXgtPm1fTWV0YWRhdGFPYmpudW0gPSAwOwotICBtX3BUcmFpbGVyLnJlc2V0KCk7Ci0gIG1fcFN5bnRheC0+UmVzdG9yZVBvcyhtX0xhc3RYUmVmT2Zmc2V0IC0gbV9wU3ludGF4LT5tX0hlYWRlck9mZnNldCk7CisgIGNvbnN0IEZYX1NBRkVfRklMRVNJWkUgbWFpbl94cmVmX29mZnNldCA9IEdldFRyYWlsZXIoKS0+R2V0SW50ZWdlckZvcigiUHJldiIpOworICBpZiAoIW1haW5feHJlZl9vZmZzZXQuSXNWYWxpZCgpKQorICAgIHJldHVybiBGT1JNQVRfRVJST1I7CiAKLSAgdWludDhfdCBjaCA9IDA7Ci0gIHVpbnQzMl90IGR3Q291bnQgPSAwOwotICBtX3BTeW50YXgtPkdldE5leHRDaGFyKGNoKTsKLSAgd2hpbGUgKFBERkNoYXJJc1doaXRlc3BhY2UoY2gpKSB7Ci0gICAgKytkd0NvdW50OwotICAgIGlmIChtX3BTeW50YXgtPm1fRmlsZUxlbiA8PQotICAgICAgICAoRlhfRklMRVNJWkUpKG1fcFN5bnRheC0+U2F2ZVBvcygpICsgbV9wU3ludGF4LT5tX0hlYWRlck9mZnNldCkpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBtX3BTeW50YXgtPkdldE5leHRDaGFyKGNoKTsKLSAgfQotICBtX0xhc3RYUmVmT2Zmc2V0ICs9IGR3Q291bnQ7CisgIGlmIChtYWluX3hyZWZfb2Zmc2V0LlZhbHVlT3JEaWUoKSA9PSAwKQorICAgIHJldHVybiBTVUNDRVNTOworCisgIGNvbnN0IEF1dG9SZXN0b3Jlcjx1aW50MzJfdD4gc2F2ZV9tZXRhZGF0YV9vYmpudW0oJm1fTWV0YWRhdGFPYmpudW0pOworICBtX01ldGFkYXRhT2JqbnVtID0gMDsKICAgbV9PYmplY3RTdHJlYW1NYXAuY2xlYXIoKTsKICAgbV9PYmpDYWNoZS5jbGVhcigpOwogCi0gIGlmICghTG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY0KG1fTGFzdFhSZWZPZmZzZXQsIG1fZHdYcmVmU3RhcnRPYmpOdW0pICYmCi0gICAgICAhTG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY1KG1fTGFzdFhSZWZPZmZzZXQpKSB7CisgIGlmICghTG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY0KG1haW5feHJlZl9vZmZzZXQuVmFsdWVPckRpZSgpKSAmJgorICAgICAgIUxvYWRMaW5lYXJpemVkQWxsQ3Jvc3NSZWZWNShtYWluX3hyZWZfb2Zmc2V0LlZhbHVlT3JEaWUoKSkpIHsKICAgICBtX0xhc3RYUmVmT2Zmc2V0ID0gMDsKLSAgICBtX3BTeW50YXgtPm1fTWV0YWRhdGFPYmpudW0gPSBkd1NhdmVNZXRhZGF0YU9iam51bTsKICAgICByZXR1cm4gRk9STUFUX0VSUk9SOwogICB9CiAKLSAgbV9wU3ludGF4LT5tX01ldGFkYXRhT2JqbnVtID0gZHdTYXZlTWV0YWRhdGFPYmpudW07CiAgIHJldHVybiBTVUNDRVNTOwogfQorCitDUERGX1BhcnNlcjo6T2JqZWN0VHlwZSBDUERGX1BhcnNlcjo6R2V0T2JqZWN0VHlwZUZyb21Dcm9zc1JlZlN0cmVhbVR5cGUoCisgICAgaW50IGNyb3NzX3JlZl9zdHJlYW1fdHlwZSkgY29uc3QgeworICBzd2l0Y2ggKGNyb3NzX3JlZl9zdHJlYW1fdHlwZSkgeworICAgIGNhc2UgMDoKKyAgICAgIHJldHVybiBDUERGX1BhcnNlcjo6T2JqZWN0VHlwZTo6a0ZyZWU7CisgICAgY2FzZSAxOgorICAgICAgcmV0dXJuIENQREZfUGFyc2VyOjpPYmplY3RUeXBlOjprTm90Q29tcHJlc3NlZDsKKyAgICBjYXNlIDI6CisgICAgICByZXR1cm4gQ1BERl9QYXJzZXI6Ok9iamVjdFR5cGU6OmtDb21wcmVzc2VkOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQ1BERl9QYXJzZXI6Ok9iamVjdFR5cGU6OmtOdWxsOworICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyLmggYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyLmgKaW5kZXggZjhmZjdhMS4uNDViOGNiOSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3BhcnNlci5oCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9wYXJzZXIuaApAQCAtNywxMiArNywxNyBAQAogI2lmbmRlZiBDT1JFX0ZQREZBUElfUEFSU0VSX0NQREZfUEFSU0VSX0hfCiAjZGVmaW5lIENPUkVfRlBERkFQSV9QQVJTRVJfQ1BERl9QQVJTRVJfSF8KIAorI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N5bnRheF9wYXJzZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogCiBjbGFzcyBDUERGX0FycmF5OwogY2xhc3MgQ1BERl9DcnlwdG9IYW5kbGVyOwpAQCAtNDAsMjUgKzQ1LDMzIEBACiAgIC8vIGFyZSBoaWdoZXIsIGJ1dCB0aGlzIG1heSBiZSBsYXJnZSBlbm91Z2ggaW4gcHJhY3RpY2UuCiAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4T2JqZWN0TnVtYmVyID0gMTA0ODU3NjsKIAorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtJbnZhbGlkUG9zID0gc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKTsKKwogICBDUERGX1BhcnNlcigpOwogICB+Q1BERl9QYXJzZXIoKTsKIAotICBFcnJvciBTdGFydFBhcnNlKGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBGaWxlLAorICBFcnJvciBTdGFydFBhcnNlKGNvbnN0IFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGUsCiAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KTsKLSAgRXJyb3IgU3RhcnRMaW5lYXJpemVkUGFyc2UoY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGUsCisgIEVycm9yIFN0YXJ0TGluZWFyaXplZFBhcnNlKGNvbnN0IFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiAKLSAgdm9pZCBTZXRQYXNzd29yZChjb25zdCBGWF9DSEFSKiBwYXNzd29yZCkgeyBtX1Bhc3N3b3JkID0gcGFzc3dvcmQ7IH0KLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0UGFzc3dvcmQoKSB7IHJldHVybiBtX1Bhc3N3b3JkOyB9Ci0gIENQREZfRGljdGlvbmFyeSogR2V0VHJhaWxlcigpIGNvbnN0IHsgcmV0dXJuIG1fcFRyYWlsZXIuZ2V0KCk7IH0KKyAgdm9pZCBTZXRQYXNzd29yZChjb25zdCBjaGFyKiBwYXNzd29yZCkgeyBtX1Bhc3N3b3JkID0gcGFzc3dvcmQ7IH0KKyAgQnl0ZVN0cmluZyBHZXRQYXNzd29yZCgpIHsgcmV0dXJuIG1fUGFzc3dvcmQ7IH0KKworICBDUERGX0RpY3Rpb25hcnkqIEdldFRyYWlsZXIoKSBjb25zdDsKKworICAvLyBSZXR1cm5zIGEgbmV3IHRyYWlsZXIgd2hpY2ggY29tYmluZXMgdGhlIGxhc3QgcmVhZCB0cmFpbGVyIHdpdGggdGhlIC9Sb290CisgIC8vIGFuZCAvSW5mbyBmcm9tIHByZXZpb3VzIG9uZXMuCisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0RpY3Rpb25hcnk+IEdldENvbWJpbmVkVHJhaWxlcigpIGNvbnN0OworCiAgIEZYX0ZJTEVTSVpFIEdldExhc3RYUmVmT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV9MYXN0WFJlZk9mZnNldDsgfQogCiAgIHVpbnQzMl90IEdldFBlcm1pc3Npb25zKCkgY29uc3Q7CiAgIHVpbnQzMl90IEdldFJvb3RPYmpOdW0oKTsKICAgdWludDMyX3QgR2V0SW5mb09iak51bSgpOwotICBDUERGX0FycmF5KiBHZXRJREFycmF5KCk7CisgIGNvbnN0IENQREZfQXJyYXkqIEdldElEQXJyYXkoKSBjb25zdDsKIAotICBDUERGX0RpY3Rpb25hcnkqIEdldEVuY3J5cHREaWN0KCkgY29uc3QgeyByZXR1cm4gbV9wRW5jcnlwdERpY3Q7IH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRFbmNyeXB0RGljdCgpIGNvbnN0IHsgcmV0dXJuIG1fcEVuY3J5cHREaWN0LkdldCgpOyB9CiAKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBQYXJzZUluZGlyZWN0T2JqZWN0KAogICAgICAgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciogcE9iakxpc3QsCkBAIC02NywxNyArODAsMTYgQEAKICAgdWludDMyX3QgR2V0TGFzdE9iak51bSgpIGNvbnN0OwogICBib29sIElzVmFsaWRPYmplY3ROdW1iZXIodWludDMyX3Qgb2JqbnVtKSBjb25zdDsKICAgRlhfRklMRVNJWkUgR2V0T2JqZWN0UG9zaXRpb25Pclplcm8odWludDMyX3Qgb2JqbnVtKSBjb25zdDsKLSAgdWludDhfdCBHZXRPYmplY3RUeXBlKHVpbnQzMl90IG9iam51bSkgY29uc3Q7CiAgIHVpbnQxNl90IEdldE9iamVjdEdlbk51bSh1aW50MzJfdCBvYmpudW0pIGNvbnN0OwotICBib29sIElzVmVyc2lvblVwZGF0ZWQoKSBjb25zdCB7IHJldHVybiBtX2JWZXJzaW9uVXBkYXRlZDsgfQogICBib29sIElzT2JqZWN0RnJlZU9yTnVsbCh1aW50MzJfdCBvYmpudW0pIGNvbnN0OwotICBDUERGX0NyeXB0b0hhbmRsZXIqIEdldENyeXB0b0hhbmRsZXIoKTsKLSAgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBHZXRGaWxlQWNjZXNzKCkgY29uc3Q7CisgIENQREZfU2VjdXJpdHlIYW5kbGVyKiBHZXRTZWN1cml0eUhhbmRsZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fcFNlY3VyaXR5SGFuZGxlci5nZXQoKTsKKyAgfQorICBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gR2V0RmlsZUFjY2VzcygpIGNvbnN0OworICBib29sIElzT2JqZWN0RnJlZSh1aW50MzJfdCBvYmpudW0pIGNvbnN0OwogCiAgIEZYX0ZJTEVTSVpFIEdldE9iamVjdE9mZnNldCh1aW50MzJfdCBvYmpudW0pIGNvbnN0OwotICBGWF9GSUxFU0laRSBHZXRPYmplY3RTaXplKHVpbnQzMl90IG9iam51bSkgY29uc3Q7CiAKLSAgdm9pZCBHZXRJbmRpcmVjdEJpbmFyeSh1aW50MzJfdCBvYmpudW0sIHVpbnQ4X3QqJiBwQnVmZmVyLCB1aW50MzJfdCYgc2l6ZSk7CiAgIGludCBHZXRGaWxlVmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1fRmlsZVZlcnNpb247IH0KICAgYm9vbCBJc1hSZWZTdHJlYW0oKSBjb25zdCB7IHJldHVybiBtX2JYUmVmU3RyZWFtOyB9CiAKQEAgLTk1LDIzICsxMDcsMzcgQEAKICAgdWludDMyX3QgR2V0Rmlyc3RQYWdlTm8oKSBjb25zdDsKIAogIHByb3RlY3RlZDoKLSAgc3RydWN0IE9iamVjdEluZm8gewotICAgIE9iamVjdEluZm8oKSA6IHBvcygwKSwgdHlwZSgwKSwgZ2VubnVtKDApIHt9CisgIGVudW0gY2xhc3MgT2JqZWN0VHlwZSA6IHVpbnQ4X3QgeworICAgIGtGcmVlID0gMHgwMCwKKyAgICBrTm90Q29tcHJlc3NlZCA9IDB4MDEsCisgICAga0NvbXByZXNzZWQgPSAweDAyLAorICAgIGtOdWxsID0gMHhGRiwKKyAgfTsKIAotICAgIEZYX0ZJTEVTSVpFIHBvczsKLSAgICB1aW50OF90IHR5cGU7CisgIHN0cnVjdCBPYmplY3RJbmZvIHsKKyAgICBPYmplY3RJbmZvKCkgOiBwb3MoMCksIHR5cGUoT2JqZWN0VHlwZTo6a0ZyZWUpLCBnZW5udW0oMCkge30KKyAgICAvLyBpZiB0eXBlIGlzIE9iamVjdFR5cGU6OmtDb21wcmVzc2VkIHRoZSBhcmNoaXZlX29ial9udW0gc2hvdWxkIGJlIHVzZWQuCisgICAgLy8gaWYgdHlwZSBpcyBPYmplY3RUeXBlOjprTm90Q29tcHJlc3NlZCB0aGUgcG9zIHNob3VsZCBiZSB1c2VkLgorICAgIC8vIEluIG90aGVyIGNhc2VzIGl0cyBhcmUgdW51c2VkLgorICAgIHVuaW9uIHsKKyAgICAgIEZYX0ZJTEVTSVpFIHBvczsKKyAgICAgIEZYX0ZJTEVTSVpFIGFyY2hpdmVfb2JqX251bTsKKyAgICB9OworICAgIE9iamVjdFR5cGUgdHlwZTsKICAgICB1aW50MTZfdCBnZW5udW07CiAgIH07CiAKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfU3ludGF4UGFyc2VyPiBtX3BTeW50YXg7CiAgIHN0ZDo6bWFwPHVpbnQzMl90LCBPYmplY3RJbmZvPiBtX09iamVjdEluZm87CiAKLSAgYm9vbCBMb2FkQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MsIEZYX0ZJTEVTSVpFIHN0cmVhbXBvcywgYm9vbCBiU2tpcCk7CisgIGJvb2wgTG9hZENyb3NzUmVmVjQoRlhfRklMRVNJWkUgcG9zLCBib29sIGJTa2lwKTsKICAgYm9vbCBSZWJ1aWxkQ3Jvc3NSZWYoKTsKIAogIHByaXZhdGU6CiAgIGZyaWVuZCBjbGFzcyBDUERGX0RhdGFBdmFpbDsKIAorICBjbGFzcyBUcmFpbGVyRGF0YTsKKwogICBlbnVtIGNsYXNzIFBhcnNlclN0YXRlIHsKICAgICBrRGVmYXVsdCwKICAgICBrQ29tbWVudCwKQEAgLTEyOSw0NCArMTU1LDY4IEBACiAgICAga0VuZE9iagogICB9OwogCi0gIENQREZfT2JqZWN0KiBQYXJzZURpcmVjdChDUERGX09iamVjdCogcE9iaik7CisgIHN0cnVjdCBDcm9zc1JlZk9iakRhdGEgeworICAgIHVpbnQzMl90IG9ial9udW0gPSAwOworICAgIE9iamVjdEluZm8gaW5mbzsKKyAgfTsKKworICBFcnJvciBTdGFydFBhcnNlSW50ZXJuYWwoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KTsKKyAgRlhfRklMRVNJWkUgUGFyc2VTdGFydFhSZWYoKTsKICAgYm9vbCBMb2FkQWxsQ3Jvc3NSZWZWNChGWF9GSUxFU0laRSBwb3MpOwogICBib29sIExvYWRBbGxDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHBvcyk7CiAgIGJvb2wgTG9hZENyb3NzUmVmVjUoRlhfRklMRVNJWkUqIHBvcywgYm9vbCBiTWFpblhSZWYpOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5PiBMb2FkVHJhaWxlclY0KCk7CiAgIEVycm9yIFNldEVuY3J5cHRIYW5kbGVyKCk7CiAgIHZvaWQgUmVsZWFzZUVuY3J5cHRIYW5kbGVyKCk7Ci0gIGJvb2wgTG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcywgdWludDMyX3QgZHdPYmpDb3VudCk7Ci0gIGJvb2wgTG9hZExpbmVhcml6ZWRDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcywgdWludDMyX3QgZHdPYmpDb3VudCk7CisgIGJvb2wgTG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY0KEZYX0ZJTEVTSVpFIHBvcyk7CiAgIGJvb2wgTG9hZExpbmVhcml6ZWRBbGxDcm9zc1JlZlY1KEZYX0ZJTEVTSVpFIHBvcyk7CiAgIEVycm9yIExvYWRMaW5lYXJpemVkTWFpblhSZWZUYWJsZSgpOwotICBDUERGX1N0cmVhbUFjYyogR2V0T2JqZWN0U3RyZWFtKHVpbnQzMl90IG51bWJlcik7Ci0gIGJvb2wgSXNMaW5lYXJpemVkRmlsZSgKLSAgICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBGaWxlQWNjZXNzLAotICAgICAgdWludDMyX3Qgb2Zmc2V0KTsKKyAgUmV0YWluUHRyPENQREZfU3RyZWFtQWNjPiBHZXRPYmplY3RTdHJlYW0odWludDMyX3QgbnVtYmVyKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfTGluZWFyaXplZEhlYWRlcj4gUGFyc2VMaW5lYXJpemVkSGVhZGVyKCk7CiAgIHZvaWQgU2V0RW5jcnlwdERpY3Rpb25hcnkoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CiAgIHZvaWQgU2hyaW5rT2JqZWN0TWFwKHVpbnQzMl90IHNpemUpOwogICAvLyBBIHNpbXBsZSBjaGVjayB3aGV0aGVyIHRoZSBjcm9zcyByZWZlcmVuY2UgdGFibGUgbWF0Y2hlcyB3aXRoCiAgIC8vIHRoZSBvYmplY3RzLgogICBib29sIFZlcmlmeUNyb3NzUmVmVjQoKTsKIAotICBDUERGX0RvY3VtZW50KiBtX3BEb2N1bWVudDsgIC8vIG5vdCBvd25lZAorICAvLyBJZiBvdXRfb2JqZWN0cyBpcyBudWxsLCB0aGUgcGFyc2VyIHBvc2l0aW9uIHdpbGwgYmUgbW92ZWQgdG8gZW5kIHN1YnNlY3Rpb24KKyAgLy8gd2l0aG91dCBhZGRpdGlvbmFsIHZhbGlkYXRpb24uCisgIGJvb2wgUGFyc2VBbmRBcHBlbmRDcm9zc1JlZlN1YnNlY3Rpb25EYXRhKAorICAgICAgdWludDMyX3Qgc3RhcnRfb2JqbnVtLAorICAgICAgdWludDMyX3QgY291bnQsCisgICAgICBzdGQ6OnZlY3RvcjxDcm9zc1JlZk9iakRhdGE+KiBvdXRfb2JqZWN0cyk7CisgIGJvb2wgUGFyc2VDcm9zc1JlZlY0KHN0ZDo6dmVjdG9yPENyb3NzUmVmT2JqRGF0YT4qIG91dF9vYmplY3RzKTsKKyAgdm9pZCBNZXJnZUNyb3NzUmVmT2JqZWN0c0RhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8Q3Jvc3NSZWZPYmpEYXRhPiYgb2JqZWN0cyk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBQYXJzZUluZGlyZWN0T2JqZWN0QXRJbnRlcm5hbCgKKyAgICAgIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIHBPYmpMaXN0LAorICAgICAgRlhfRklMRVNJWkUgcG9zLAorICAgICAgdWludDMyX3Qgb2JqbnVtLAorICAgICAgQ1BERl9TeW50YXhQYXJzZXI6OlBhcnNlVHlwZSBwYXJzZV90eXBlLAorICAgICAgRlhfRklMRVNJWkUqIHBSZXN1bHRQb3MpOworCisgIGJvb2wgSW5pdFN5bnRheFBhcnNlcihjb25zdCBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIGZpbGVfYWNjZXNzKTsKKyAgYm9vbCBQYXJzZUZpbGVWZXJzaW9uKCk7CisKKyAgVW5vd25lZFB0cjxDUERGX0RvY3VtZW50PiBtX3BEb2N1bWVudDsKKyAgT2JqZWN0VHlwZSBHZXRPYmplY3RUeXBlKHVpbnQzMl90IG9iam51bSkgY29uc3Q7CisgIE9iamVjdFR5cGUgR2V0T2JqZWN0VHlwZUZyb21Dcm9zc1JlZlN0cmVhbVR5cGUoCisgICAgICBpbnQgY3Jvc3NfcmVmX3N0cmVhbV90eXBlKSBjb25zdDsKKwogICBib29sIG1fYkhhc1BhcnNlZDsKICAgYm9vbCBtX2JYUmVmU3RyZWFtOwotICBib29sIG1fYlZlcnNpb25VcGRhdGVkOwogICBpbnQgbV9GaWxlVmVyc2lvbjsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BFbmNyeXB0RGljdDsKKyAgLy8gbV9UcmFpbGVyRGF0YSBtdXN0IGJlIGRlc3Ryb3llZCBhZnRlciBtX3BTZWN1cml0eUhhbmRsZXIgZHVlIHRvIHRoZQorICAvLyBvd25lcnNoaXAgb2YgdGhlIElEIGFycmF5IGRhdGEuCisgIHN0ZDo6dW5pcXVlX3B0cjxUcmFpbGVyRGF0YT4gbV9UcmFpbGVyRGF0YTsKKyAgVW5vd25lZFB0cjxDUERGX0RpY3Rpb25hcnk+IG1fcEVuY3J5cHREaWN0OwogICBGWF9GSUxFU0laRSBtX0xhc3RYUmVmT2Zmc2V0OwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9TZWN1cml0eUhhbmRsZXI+IG1fcFNlY3VyaXR5SGFuZGxlcjsKLSAgQ0ZYX0J5dGVTdHJpbmcgbV9QYXNzd29yZDsKLSAgc3RkOjpzZXQ8RlhfRklMRVNJWkU+IG1fU29ydGVkT2Zmc2V0OwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5PiBtX3BUcmFpbGVyOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5Pj4gbV9UcmFpbGVyczsKKyAgQnl0ZVN0cmluZyBtX1Bhc3N3b3JkOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9MaW5lYXJpemVkSGVhZGVyPiBtX3BMaW5lYXJpemVkOwotICB1aW50MzJfdCBtX2R3WHJlZlN0YXJ0T2JqTnVtOwogCi0gIC8vIEEgbWFwIG9mIG9iamVjdCBudW1iZXJzIHRvIGluZGlyZWN0IHN0cmVhbXMuIE1hcCBvd25zIHRoZSBzdHJlYW1zLgotICBzdGQ6Om1hcDx1aW50MzJfdCwgc3RkOjp1bmlxdWVfcHRyPENQREZfU3RyZWFtQWNjPj4gbV9PYmplY3RTdHJlYW1NYXA7CisgIC8vIEEgbWFwIG9mIG9iamVjdCBudW1iZXJzIHRvIGluZGlyZWN0IHN0cmVhbXMuCisgIHN0ZDo6bWFwPHVpbnQzMl90LCBSZXRhaW5QdHI8Q1BERl9TdHJlYW1BY2M+PiBtX09iamVjdFN0cmVhbU1hcDsKIAogICAvLyBNYXBwaW5nIG9mIG9iamVjdCBudW1iZXJzIHRvIG9mZnNldHMuIFRoZSBvZmZzZXRzIGFyZSByZWxhdGl2ZSB0byB0aGUgZmlyc3QKICAgLy8gb2JqZWN0IGluIHRoZSBzdHJlYW0uCkBAIC0xNzQsMTAgKzIyNCwxMiBAQAogCiAgIC8vIE1hcHBpbmcgb2Ygc3RyZWFtcyB0byB0aGVpciBvYmplY3QgY2FjaGVzLiBUaGlzIGlzIHZhbGlkIGFzIGxvbmcgYXMgdGhlCiAgIC8vIHN0cmVhbXMgaW4gfG1fT2JqZWN0U3RyZWFtTWFwfCBhcmUgdmFsaWQuCi0gIHN0ZDo6bWFwPENQREZfU3RyZWFtQWNjKiwgU3RyZWFtT2JqZWN0Q2FjaGU+IG1fT2JqQ2FjaGU7CisgIHN0ZDo6bWFwPFJldGFpblB0cjxDUERGX1N0cmVhbUFjYz4sIFN0cmVhbU9iamVjdENhY2hlPiBtX09iakNhY2hlOwogCiAgIC8vIEFsbCBpbmRpcmVjdCBvYmplY3QgbnVtYmVycyB0aGF0IGFyZSBiZWluZyBwYXJzZWQuCiAgIHN0ZDo6c2V0PHVpbnQzMl90PiBtX1BhcnNpbmdPYmpOdW1zOworCisgIHVpbnQzMl90IG1fTWV0YWRhdGFPYmpudW0gPSAwOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfUEFSU0VSX0NQREZfUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyX2VtYmVkZGVydGVzdC5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyX2VtYmVkZGVydGVzdC5jcHAKaW5kZXggZjUyM2Q2Yi4uNDEwOTcxNSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3BhcnNlcl9lbWJlZGRlcnRlc3QuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9wYXJzZXJfZW1iZWRkZXJ0ZXN0LmNwcApAQCAtMzEsMTAgKzMxLDYgQEAKICAgKHZvaWQpR2V0UGFnZUNvdW50KCk7CiB9CiAKLVRFU1RfRihDUERGUGFyc2VyRW1iZWRkZXJ0ZXN0LCBGZWF0dXJlX0xpbmVhcml6ZWRfTG9hZGluZykgewotICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoImZlYXR1cmVfbGluZWFyaXplZF9sb2FkaW5nLnBkZiIsIG51bGxwdHIsIHRydWUpKTsKLX0KLQogVEVTVF9GKENQREZQYXJzZXJFbWJlZGRlcnRlc3QsIEJ1Z18zMjVhKSB7CiAgIEVYUEVDVF9GQUxTRShPcGVuRG9jdW1lbnQoImJ1Z18zMjVfYS5wZGYiKSk7CiB9CkBAIC01NywzICs1MywyMyBAQAogICBGUERGVGV4dF9DbG9zZVBhZ2UodGV4dF9wYWdlKTsKICAgVW5sb2FkUGFnZShwYWdlKTsKIH0KKworVEVTVF9GKENQREZQYXJzZXJFbWJlZGRlcnRlc3QsIEJ1Z183NTc3MDUpIHsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJidWdfNzU3NzA1LnBkZiIpKTsKK30KKworVEVTVF9GKENQREZQYXJzZXJFbWJlZGRlcnRlc3QsIExvYWRNYWluQ3Jvc3NSZWZUYWJsZSkgeworICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnRMaW5lYXJpemVkKCJmZWF0dXJlX2xpbmVhcml6ZWRfbG9hZGluZy5wZGYiKSk7CisgIC8vIFRvIGNoZWNrIHRoYXQgbWFpbiBjcm9zcyByZWYgdGFibGUgaXMgbG9hZGVkIGNvcnJlY3RseSx3aWxsIGJlIGVub3VnaCB0bworICAvLyBjaGVjayB0aGF0IHRoZSBzZWNvbmQgcGFnZSB3YXMgY29ycmVjdGx5IGxvYWRlZC4gQmVjYXVzZSBpdCBpcyBjb250YWlucworICAvLyBjcm9zc3JlZnMgZm9yIHNlY29uZCBwYWdlLgorICBFWFBFQ1RfRVEoMiwgR2V0UGFnZUNvdW50KCkpOworICBGUERGX1BBR0UgcGFnZSA9IExvYWRQYWdlKDEpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgcGFnZSk7CisgIEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlID0gRlBERlRleHRfTG9hZFBhZ2UocGFnZSk7CisgIEVYUEVDVF9ORShudWxscHRyLCB0ZXh0X3BhZ2UpOworICAvLyBUaGUgcGFnZSBzaG91bGQgbm90IGJlIGJsYW5rLgorICBFWFBFQ1RfTFQoMCwgRlBERlRleHRfQ291bnRDaGFycyh0ZXh0X3BhZ2UpKTsKKyAgRlBERlRleHRfQ2xvc2VQYWdlKHRleHRfcGFnZSk7CisgIFVubG9hZFBhZ2UocGFnZSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9wYXJzZXJfdW5pdHRlc3QuY3BwCmluZGV4IDM1MThmN2QuLjU1NWMzNWMgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9wYXJzZXJfdW5pdHRlc3QuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9wYXJzZXJfdW5pdHRlc3QuY3BwCkBAIC03LDQxICs3LDEzIEBACiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N5bnRheF9wYXJzZXIuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9leHQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAidGVzdGluZy9meF9zdHJpbmdfdGVzdGhlbHBlcnMuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL3V0aWxzL3BhdGhfc2VydmljZS5oIgogCi0vLyBQcm92aWRlIGEgd2F5IHRvIHJlYWQgdGVzdCBkYXRhIGZyb20gYSBidWZmZXIgaW5zdGVhZCBvZiBhIGZpbGUuCi1jbGFzcyBDRlhfVGVzdEJ1ZmZlclJlYWQgOiBwdWJsaWMgSUZYX1NlZWthYmxlUmVhZFN0cmVhbSB7Ci0gcHVibGljOgotICBzdGF0aWMgQ0ZYX1JldGFpblB0cjxDRlhfVGVzdEJ1ZmZlclJlYWQ+IENyZWF0ZSgKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGJ1ZmZlcl9pbiwKLSAgICAgIHNpemVfdCBidWZfc2l6ZSkgewotICAgIHJldHVybiBDRlhfUmV0YWluUHRyPENGWF9UZXN0QnVmZmVyUmVhZD4oCi0gICAgICAgIG5ldyBDRlhfVGVzdEJ1ZmZlclJlYWQoYnVmZmVyX2luLCBidWZfc2l6ZSkpOwotICB9Ci0KLSAgLy8gSUZYX1NlZWthYmxlUmVhZFN0cmVhbToKLSAgYm9vbCBSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZSB7Ci0gICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ICsgc2l6ZSA+IHRvdGFsX3NpemVfKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgbWVtY3B5KGJ1ZmZlciwgYnVmZmVyXyArIG9mZnNldCwgc2l6ZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBGWF9GSUxFU0laRSBHZXRTaXplKCkgb3ZlcnJpZGUgeyByZXR1cm4gKEZYX0ZJTEVTSVpFKXRvdGFsX3NpemVfOyB9OwotCi0gcHJvdGVjdGVkOgotICBDRlhfVGVzdEJ1ZmZlclJlYWQoY29uc3QgdW5zaWduZWQgY2hhciogYnVmZmVyX2luLCBzaXplX3QgYnVmX3NpemUpCi0gICAgICA6IGJ1ZmZlcl8oYnVmZmVyX2luKSwgdG90YWxfc2l6ZV8oYnVmX3NpemUpIHt9Ci0KLSAgY29uc3QgdW5zaWduZWQgY2hhciogYnVmZmVyXzsKLSAgc2l6ZV90IHRvdGFsX3NpemVfOwotfTsKLQogLy8gQSB3cmFwcGVyIGNsYXNzIHRvIGhlbHAgdGVzdCBtZW1iZXIgZnVuY3Rpb25zIG9mIENQREZfUGFyc2VyLgogY2xhc3MgQ1BERl9UZXN0UGFyc2VyIDogcHVibGljIENQREZfUGFyc2VyIHsKICBwdWJsaWM6CkBAIC00OSw4ICsyMSw4IEBACiAgIH5DUERGX1Rlc3RQYXJzZXIoKSB7fQogCiAgIC8vIFNldHVwIHJlYWRpbmcgZnJvbSBhIGZpbGUgYW5kIGluaXRpYWwgc3RhdGVzLgotICBib29sIEluaXRUZXN0RnJvbUZpbGUoY29uc3QgRlhfQ0hBUiogcGF0aCkgewotICAgIENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gcEZpbGVBY2Nlc3MgPQorICBib29sIEluaXRUZXN0RnJvbUZpbGUoY29uc3QgY2hhciogcGF0aCkgeworICAgIFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBwRmlsZUFjY2VzcyA9CiAgICAgICAgIElGWF9TZWVrYWJsZVJlYWRTdHJlYW06OkNyZWF0ZUZyb21GaWxlbmFtZShwYXRoKTsKICAgICBpZiAoIXBGaWxlQWNjZXNzKQogICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNjIsMTEgKzM0LDkgQEAKIAogICAvLyBTZXR1cCByZWFkaW5nIGZyb20gYSBidWZmZXIgYW5kIGluaXRpYWwgc3RhdGVzLgogICBib29sIEluaXRUZXN0RnJvbUJ1ZmZlcihjb25zdCB1bnNpZ25lZCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW4pIHsKLSAgICBDRlhfUmV0YWluUHRyPENGWF9UZXN0QnVmZmVyUmVhZD4gYnVmZmVyX3JlYWRlciA9Ci0gICAgICAgIENGWF9UZXN0QnVmZmVyUmVhZDo6Q3JlYXRlKGJ1ZmZlciwgbGVuKTsKLQogICAgIC8vIEZvciB0aGUgdGVzdCBmaWxlLCB0aGUgaGVhZGVyIGlzIHNldCBhdCB0aGUgYmVnaW5uaW5nLgotICAgIG1fcFN5bnRheC0+SW5pdFBhcnNlcihidWZmZXJfcmVhZGVyLCAwKTsKKyAgICBtX3BTeW50YXgtPkluaXRQYXJzZXIoCisgICAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDRlhfQnVmZmVyU2Vla2FibGVSZWFkU3RyZWFtPihidWZmZXIsIGxlbiksIDApOwogICAgIHJldHVybiB0cnVlOwogICB9CiAKQEAgLTEyMiw5ICs5MiwxNSBAQAogICAgIEFTU0VSVF9UUlVFKAogICAgICAgICBwYXJzZXIuSW5pdFRlc3RGcm9tQnVmZmVyKHhyZWZfdGFibGUsIEZYX0FycmF5U2l6ZSh4cmVmX3RhYmxlKSkpOwogCi0gICAgQVNTRVJUX1RSVUUocGFyc2VyLkxvYWRDcm9zc1JlZlY0KDAsIDAsIGZhbHNlKSk7CisgICAgQVNTRVJUX1RSVUUocGFyc2VyLkxvYWRDcm9zc1JlZlY0KDAsIGZhbHNlKSk7CiAgICAgY29uc3QgRlhfRklMRVNJWkUgb2Zmc2V0c1tdID0gezAsIDE3LCA4MSwgMCwgMzMxLCA0MDl9OwotICAgIGNvbnN0IHVpbnQ4X3QgdHlwZXNbXSA9IHswLCAxLCAxLCAwLCAxLCAxfTsKKyAgICBjb25zdCBDUERGX1Rlc3RQYXJzZXI6Ok9iamVjdFR5cGUgdHlwZXNbXSA9IHsKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprRnJlZSwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprTm90Q29tcHJlc3NlZCwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprTm90Q29tcHJlc3NlZCwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprRnJlZSwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprTm90Q29tcHJlc3NlZCwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprTm90Q29tcHJlc3NlZH07CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUob2Zmc2V0cyk7ICsraSkgewogICAgICAgRVhQRUNUX0VRKG9mZnNldHNbaV0sIHBhcnNlci5tX09iamVjdEluZm9baV0ucG9zKTsKICAgICAgIEVYUEVDVF9FUSh0eXBlc1tpXSwgcGFyc2VyLm1fT2JqZWN0SW5mb1tpXS50eXBlKTsKQEAgLTE0NywxMCArMTIzLDIzIEBACiAgICAgQVNTRVJUX1RSVUUoCiAgICAgICAgIHBhcnNlci5Jbml0VGVzdEZyb21CdWZmZXIoeHJlZl90YWJsZSwgRlhfQXJyYXlTaXplKHhyZWZfdGFibGUpKSk7CiAKLSAgICBBU1NFUlRfVFJVRShwYXJzZXIuTG9hZENyb3NzUmVmVjQoMCwgMCwgZmFsc2UpKTsKKyAgICBBU1NFUlRfVFJVRShwYXJzZXIuTG9hZENyb3NzUmVmVjQoMCwgZmFsc2UpKTsKICAgICBjb25zdCBGWF9GSUxFU0laRSBvZmZzZXRzW10gPSB7MCwgMCwgICAgIDAsICAgICAyNTMyNSwgMCwgMCwgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMjU1MTgsIDI1NjM1LCAwLCAgICAgMCwgMjU3Nzd9OwotICAgIGNvbnN0IHVpbnQ4X3QgdHlwZXNbXSA9IHswLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAxfTsKKyAgICBjb25zdCBDUERGX1Rlc3RQYXJzZXI6Ok9iamVjdFR5cGUgdHlwZXNbXSA9IHsKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprRnJlZSwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprRnJlZSwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprRnJlZSwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprTm90Q29tcHJlc3NlZCwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprRnJlZSwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprRnJlZSwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprRnJlZSwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprRnJlZSwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprTm90Q29tcHJlc3NlZCwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprTm90Q29tcHJlc3NlZCwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprRnJlZSwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprRnJlZSwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprTm90Q29tcHJlc3NlZH07CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUob2Zmc2V0cyk7ICsraSkgewogICAgICAgRVhQRUNUX0VRKG9mZnNldHNbaV0sIHBhcnNlci5tX09iamVjdEluZm9baV0ucG9zKTsKICAgICAgIEVYUEVDVF9FUSh0eXBlc1tpXSwgcGFyc2VyLm1fT2JqZWN0SW5mb1tpXS50eXBlKTsKQEAgLTE3MywxMCArMTYyLDIzIEBACiAgICAgQVNTRVJUX1RSVUUoCiAgICAgICAgIHBhcnNlci5Jbml0VGVzdEZyb21CdWZmZXIoeHJlZl90YWJsZSwgRlhfQXJyYXlTaXplKHhyZWZfdGFibGUpKSk7CiAKLSAgICBBU1NFUlRfVFJVRShwYXJzZXIuTG9hZENyb3NzUmVmVjQoMCwgMCwgZmFsc2UpKTsKKyAgICBBU1NFUlRfVFJVRShwYXJzZXIuTG9hZENyb3NzUmVmVjQoMCwgZmFsc2UpKTsKICAgICBjb25zdCBGWF9GSUxFU0laRSBvZmZzZXRzW10gPSB7MCwgMCwgMCwgICAgIDI1MzI1LCAwLCAwLCAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAyNTYzNSwgMCwgICAgIDAsIDI1Nzc3fTsKLSAgICBjb25zdCB1aW50OF90IHR5cGVzW10gPSB7MCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMX07CisgICAgY29uc3QgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlIHR5cGVzW10gPSB7CisgICAgICAgIENQREZfVGVzdFBhcnNlcjo6T2JqZWN0VHlwZTo6a0ZyZWUsCisgICAgICAgIENQREZfVGVzdFBhcnNlcjo6T2JqZWN0VHlwZTo6a0ZyZWUsCisgICAgICAgIENQREZfVGVzdFBhcnNlcjo6T2JqZWN0VHlwZTo6a0ZyZWUsCisgICAgICAgIENQREZfVGVzdFBhcnNlcjo6T2JqZWN0VHlwZTo6a05vdENvbXByZXNzZWQsCisgICAgICAgIENQREZfVGVzdFBhcnNlcjo6T2JqZWN0VHlwZTo6a0ZyZWUsCisgICAgICAgIENQREZfVGVzdFBhcnNlcjo6T2JqZWN0VHlwZTo6a0ZyZWUsCisgICAgICAgIENQREZfVGVzdFBhcnNlcjo6T2JqZWN0VHlwZTo6a0ZyZWUsCisgICAgICAgIENQREZfVGVzdFBhcnNlcjo6T2JqZWN0VHlwZTo6a0ZyZWUsCisgICAgICAgIENQREZfVGVzdFBhcnNlcjo6T2JqZWN0VHlwZTo6a0ZyZWUsCisgICAgICAgIENQREZfVGVzdFBhcnNlcjo6T2JqZWN0VHlwZTo6a05vdENvbXByZXNzZWQsCisgICAgICAgIENQREZfVGVzdFBhcnNlcjo6T2JqZWN0VHlwZTo6a0ZyZWUsCisgICAgICAgIENQREZfVGVzdFBhcnNlcjo6T2JqZWN0VHlwZTo6a0ZyZWUsCisgICAgICAgIENQREZfVGVzdFBhcnNlcjo6T2JqZWN0VHlwZTo6a05vdENvbXByZXNzZWR9OwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKG9mZnNldHMpOyArK2kpIHsKICAgICAgIEVYUEVDVF9FUShvZmZzZXRzW2ldLCBwYXJzZXIubV9PYmplY3RJbmZvW2ldLnBvcyk7CiAgICAgICBFWFBFQ1RfRVEodHlwZXNbaV0sIHBhcnNlci5tX09iamVjdEluZm9baV0udHlwZSk7CkBAIC0xOTgsOSArMjAwLDE2IEBACiAgICAgQVNTRVJUX1RSVUUoCiAgICAgICAgIHBhcnNlci5Jbml0VGVzdEZyb21CdWZmZXIoeHJlZl90YWJsZSwgRlhfQXJyYXlTaXplKHhyZWZfdGFibGUpKSk7CiAKLSAgICBBU1NFUlRfVFJVRShwYXJzZXIuTG9hZENyb3NzUmVmVjQoMCwgMCwgZmFsc2UpKTsKKyAgICBBU1NFUlRfVFJVRShwYXJzZXIuTG9hZENyb3NzUmVmVjQoMCwgZmFsc2UpKTsKICAgICBjb25zdCBGWF9GSUxFU0laRSBvZmZzZXRzW10gPSB7MCwgMjMsIDAsIDAsIDAsIDQ1LCAxNzl9OwotICAgIGNvbnN0IHVpbnQ4X3QgdHlwZXNbXSA9IHswLCAxLCAwLCAwLCAwLCAxLCAxfTsKKyAgICBjb25zdCBDUERGX1Rlc3RQYXJzZXI6Ok9iamVjdFR5cGUgdHlwZXNbXSA9IHsKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprRnJlZSwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprTm90Q29tcHJlc3NlZCwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprRnJlZSwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprRnJlZSwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprRnJlZSwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprTm90Q29tcHJlc3NlZCwKKyAgICAgICAgQ1BERl9UZXN0UGFyc2VyOjpPYmplY3RUeXBlOjprTm90Q29tcHJlc3NlZH07CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUob2Zmc2V0cyk7ICsraSkgewogICAgICAgRVhQRUNUX0VRKG9mZnNldHNbaV0sIHBhcnNlci5tX09iamVjdEluZm9baV0ucG9zKTsKICAgICAgIEVYUEVDVF9FUSh0eXBlc1tpXSwgcGFyc2VyLm1fT2JqZWN0SW5mb1tpXS50eXBlKTsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9yZWFkX3ZhbGlkYXRvci5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVhZF92YWxpZGF0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NTA1NjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVhZF92YWxpZGF0b3IuY3BwCkBAIC0wLDAgKzEsMTY0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVhZF92YWxpZGF0b3IuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9jcGRmX21vZHVsZW1nci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgorCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgRlhfRklMRVNJWkUga0FsaWduQmxvY2tWYWx1ZSA9IENQREZfTW9kdWxlTWdyOjprRmlsZUJ1ZlNpemU7CisKK0ZYX0ZJTEVTSVpFIEFsaWduRG93bihGWF9GSUxFU0laRSBvZmZzZXQpIHsKKyAgcmV0dXJuIG9mZnNldCA+IDAgPyAob2Zmc2V0IC0gb2Zmc2V0ICUga0FsaWduQmxvY2tWYWx1ZSkgOiAwOworfQorCitGWF9GSUxFU0laRSBBbGlnblVwKEZYX0ZJTEVTSVpFIG9mZnNldCkgeworICBGWF9TQUZFX0ZJTEVTSVpFIHNhZmVfcmVzdWx0ID0gQWxpZ25Eb3duKG9mZnNldCk7CisgIHNhZmVfcmVzdWx0ICs9IGtBbGlnbkJsb2NrVmFsdWU7CisgIGlmIChzYWZlX3Jlc3VsdC5Jc1ZhbGlkKCkpCisgICAgcmV0dXJuIHNhZmVfcmVzdWx0LlZhbHVlT3JEaWUoKTsKKyAgcmV0dXJuIG9mZnNldDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0NQREZfUmVhZFZhbGlkYXRvcjo6U2Vzc2lvbjo6U2Vzc2lvbihDUERGX1JlYWRWYWxpZGF0b3IqIHZhbGlkYXRvcikKKyAgICA6IHZhbGlkYXRvcl8odmFsaWRhdG9yKSB7CisgIEFTU0VSVCh2YWxpZGF0b3JfKTsKKyAgc2F2ZWRfcmVhZF9lcnJvcl8gPSB2YWxpZGF0b3JfLT5yZWFkX2Vycm9yXzsKKyAgc2F2ZWRfaGFzX3VuYXZhaWxhYmxlX2RhdGFfID0gdmFsaWRhdG9yXy0+aGFzX3VuYXZhaWxhYmxlX2RhdGFfOworICB2YWxpZGF0b3JfLT5SZXNldEVycm9ycygpOworfQorCitDUERGX1JlYWRWYWxpZGF0b3I6OlNlc3Npb246On5TZXNzaW9uKCkgeworICB2YWxpZGF0b3JfLT5yZWFkX2Vycm9yXyB8PSBzYXZlZF9yZWFkX2Vycm9yXzsKKyAgdmFsaWRhdG9yXy0+aGFzX3VuYXZhaWxhYmxlX2RhdGFfIHw9IHNhdmVkX2hhc191bmF2YWlsYWJsZV9kYXRhXzsKK30KKworQ1BERl9SZWFkVmFsaWRhdG9yOjpDUERGX1JlYWRWYWxpZGF0b3IoCisgICAgY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBmaWxlX3JlYWQsCisgICAgQ1BERl9EYXRhQXZhaWw6OkZpbGVBdmFpbCogZmlsZV9hdmFpbCkKKyAgICA6IGZpbGVfcmVhZF8oZmlsZV9yZWFkKSwKKyAgICAgIGZpbGVfYXZhaWxfKGZpbGVfYXZhaWwpLAorICAgICAgcmVhZF9lcnJvcl8oZmFsc2UpLAorICAgICAgaGFzX3VuYXZhaWxhYmxlX2RhdGFfKGZhbHNlKSwKKyAgICAgIHdob2xlX2ZpbGVfYWxyZWFkeV9hdmFpbGFibGVfKGZhbHNlKSwKKyAgICAgIGZpbGVfc2l6ZV8oZmlsZV9yZWFkLT5HZXRTaXplKCkpIHt9CisKK0NQREZfUmVhZFZhbGlkYXRvcjo6fkNQREZfUmVhZFZhbGlkYXRvcigpIHt9CisKK3ZvaWQgQ1BERl9SZWFkVmFsaWRhdG9yOjpSZXNldEVycm9ycygpIHsKKyAgcmVhZF9lcnJvcl8gPSBmYWxzZTsKKyAgaGFzX3VuYXZhaWxhYmxlX2RhdGFfID0gZmFsc2U7Cit9CisKK2Jvb2wgQ1BERl9SZWFkVmFsaWRhdG9yOjpSZWFkQmxvY2sodm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7CisgIEZYX1NBRkVfRklMRVNJWkUgZW5kX29mZnNldCA9IG9mZnNldDsKKyAgZW5kX29mZnNldCArPSBzaXplOworICBpZiAoIWVuZF9vZmZzZXQuSXNWYWxpZCgpIHx8IGVuZF9vZmZzZXQuVmFsdWVPckRpZSgpID4gZmlsZV9zaXplXykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFJc0RhdGFSYW5nZUF2YWlsYWJsZShvZmZzZXQsIHNpemUpKSB7CisgICAgU2NoZWR1bGVEb3dubG9hZChvZmZzZXQsIHNpemUpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChmaWxlX3JlYWRfLT5SZWFkQmxvY2soYnVmZmVyLCBvZmZzZXQsIHNpemUpKQorICAgIHJldHVybiB0cnVlOworCisgIHJlYWRfZXJyb3JfID0gdHJ1ZTsKKyAgU2NoZWR1bGVEb3dubG9hZChvZmZzZXQsIHNpemUpOworICByZXR1cm4gZmFsc2U7Cit9CisKK0ZYX0ZJTEVTSVpFIENQREZfUmVhZFZhbGlkYXRvcjo6R2V0U2l6ZSgpIHsKKyAgcmV0dXJuIGZpbGVfc2l6ZV87Cit9CisKK3ZvaWQgQ1BERl9SZWFkVmFsaWRhdG9yOjpTY2hlZHVsZURvd25sb2FkKEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgaGFzX3VuYXZhaWxhYmxlX2RhdGFfID0gdHJ1ZTsKKyAgaWYgKCFoaW50c18gfHwgc2l6ZSA9PSAwKQorICAgIHJldHVybjsKKworICBjb25zdCBGWF9GSUxFU0laRSBzdGFydF9zZWdtZW50X29mZnNldCA9IEFsaWduRG93bihvZmZzZXQpOworICBGWF9TQUZFX0ZJTEVTSVpFIGVuZF9zZWdtZW50X29mZnNldCA9IG9mZnNldDsKKyAgZW5kX3NlZ21lbnRfb2Zmc2V0ICs9IHNpemU7CisgIGlmICghZW5kX3NlZ21lbnRfb2Zmc2V0LklzVmFsaWQoKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm47CisgIH0KKyAgZW5kX3NlZ21lbnRfb2Zmc2V0ID0KKyAgICAgIHN0ZDo6bWluKGZpbGVfc2l6ZV8sIEFsaWduVXAoZW5kX3NlZ21lbnRfb2Zmc2V0LlZhbHVlT3JEaWUoKSkpOworCisgIEZYX1NBRkVfU0laRV9UIHNlZ21lbnRfc2l6ZSA9IGVuZF9zZWdtZW50X29mZnNldDsKKyAgc2VnbWVudF9zaXplIC09IHN0YXJ0X3NlZ21lbnRfb2Zmc2V0OworICBpZiAoIXNlZ21lbnRfc2l6ZS5Jc1ZhbGlkKCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuOworICB9CisgIGhpbnRzXy0+QWRkU2VnbWVudChzdGFydF9zZWdtZW50X29mZnNldCwgc2VnbWVudF9zaXplLlZhbHVlT3JEaWUoKSk7Cit9CisKK2Jvb2wgQ1BERl9SZWFkVmFsaWRhdG9yOjpJc0RhdGFSYW5nZUF2YWlsYWJsZShGWF9GSUxFU0laRSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIGNvbnN0IHsKKyAgcmV0dXJuIHdob2xlX2ZpbGVfYWxyZWFkeV9hdmFpbGFibGVfIHx8ICFmaWxlX2F2YWlsXyB8fAorICAgICAgICAgZmlsZV9hdmFpbF8tPklzRGF0YUF2YWlsKG9mZnNldCwgc2l6ZSk7Cit9CisKK2Jvb2wgQ1BERl9SZWFkVmFsaWRhdG9yOjpJc1dob2xlRmlsZUF2YWlsYWJsZSgpIHsKKyAgY29uc3QgRlhfU0FGRV9TSVpFX1Qgc2FmZV9zaXplID0gZmlsZV9zaXplXzsKKyAgd2hvbGVfZmlsZV9hbHJlYWR5X2F2YWlsYWJsZV8gPQorICAgICAgd2hvbGVfZmlsZV9hbHJlYWR5X2F2YWlsYWJsZV8gfHwKKyAgICAgIChzYWZlX3NpemUuSXNWYWxpZCgpID8gSXNEYXRhUmFuZ2VBdmFpbGFibGUoMCwgc2FmZV9zaXplLlZhbHVlT3JEaWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmFsc2UpOworCisgIHJldHVybiB3aG9sZV9maWxlX2FscmVhZHlfYXZhaWxhYmxlXzsKK30KKworYm9vbCBDUERGX1JlYWRWYWxpZGF0b3I6OkNoZWNrRGF0YVJhbmdlQW5kUmVxdWVzdElmVW5hdmFpbGFibGUoCisgICAgRlhfRklMRVNJWkUgb2Zmc2V0LAorICAgIHNpemVfdCBzaXplKSB7CisgIGlmIChvZmZzZXQgPiBmaWxlX3NpemVfKQorICAgIHJldHVybiB0cnVlOworCisgIEZYX1NBRkVfRklMRVNJWkUgZW5kX3NlZ21lbnRfb2Zmc2V0ID0gb2Zmc2V0OworICBlbmRfc2VnbWVudF9vZmZzZXQgKz0gc2l6ZTsKKyAgLy8gSW5jcmVhc2UgY2hlY2tlZCByYW5nZSB0byBhbGxvdyBDUERGX1N5bnRheFBhcnNlciByZWFkIHdob2xlIGJ1ZmZlci4KKyAgZW5kX3NlZ21lbnRfb2Zmc2V0ICs9IENQREZfTW9kdWxlTWdyOjprRmlsZUJ1ZlNpemU7CisgIGlmICghZW5kX3NlZ21lbnRfb2Zmc2V0LklzVmFsaWQoKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgZW5kX3NlZ21lbnRfb2Zmc2V0ID0gc3RkOjptaW4oCisgICAgICBmaWxlX3NpemVfLCBzdGF0aWNfY2FzdDxGWF9GSUxFU0laRT4oZW5kX3NlZ21lbnRfb2Zmc2V0LlZhbHVlT3JEaWUoKSkpOworICBGWF9TQUZFX1NJWkVfVCBzZWdtZW50X3NpemUgPSBlbmRfc2VnbWVudF9vZmZzZXQ7CisgIHNlZ21lbnRfc2l6ZSAtPSBvZmZzZXQ7CisgIGlmICghc2VnbWVudF9zaXplLklzVmFsaWQoKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoSXNEYXRhUmFuZ2VBdmFpbGFibGUob2Zmc2V0LCBzZWdtZW50X3NpemUuVmFsdWVPckRpZSgpKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBTY2hlZHVsZURvd25sb2FkKG9mZnNldCwgc2VnbWVudF9zaXplLlZhbHVlT3JEaWUoKSk7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDUERGX1JlYWRWYWxpZGF0b3I6OkNoZWNrV2hvbGVGaWxlQW5kUmVxdWVzdElmVW5hdmFpbGFibGUoKSB7CisgIGlmIChJc1dob2xlRmlsZUF2YWlsYWJsZSgpKQorICAgIHJldHVybiB0cnVlOworCisgIGNvbnN0IEZYX1NBRkVfU0laRV9UIHNhZmVfc2l6ZSA9IGZpbGVfc2l6ZV87CisgIGlmIChzYWZlX3NpemUuSXNWYWxpZCgpKQorICAgIFNjaGVkdWxlRG93bmxvYWQoMCwgc2FmZV9zaXplLlZhbHVlT3JEaWUoKSk7CisKKyAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3JlYWRfdmFsaWRhdG9yLmggYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVhZF92YWxpZGF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWMzM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3JlYWRfdmFsaWRhdG9yLmgKQEAgLTAsMCArMSw2OSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIENPUkVfRlBERkFQSV9QQVJTRVJfQ1BERl9SRUFEX1ZBTElEQVRPUl9IXworI2RlZmluZSBDT1JFX0ZQREZBUElfUEFSU0VSX0NQREZfUkVBRF9WQUxJREFUT1JfSF8KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kYXRhX2F2YWlsLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJlYW0uaCIKKworY2xhc3MgQ1BERl9SZWFkVmFsaWRhdG9yIDogcHVibGljIElGWF9TZWVrYWJsZVJlYWRTdHJlYW0geworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3M+CisgIGZyaWVuZCBSZXRhaW5QdHI8VD4gcGRmaXVtOjpNYWtlUmV0YWluKEFyZ3MmJi4uLiBhcmdzKTsKKworICBjbGFzcyBTZXNzaW9uIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBTZXNzaW9uKENQREZfUmVhZFZhbGlkYXRvciogdmFsaWRhdG9yKTsKKyAgICB+U2Vzc2lvbigpOworCisgICBwcml2YXRlOgorICAgIFVub3duZWRQdHI8Q1BERl9SZWFkVmFsaWRhdG9yPiB2YWxpZGF0b3JfOworICAgIGJvb2wgc2F2ZWRfcmVhZF9lcnJvcl87CisgICAgYm9vbCBzYXZlZF9oYXNfdW5hdmFpbGFibGVfZGF0YV87CisgIH07CisKKyAgdm9pZCBTZXREb3dubG9hZEhpbnRzKENQREZfRGF0YUF2YWlsOjpEb3dubG9hZEhpbnRzKiBoaW50cykgeworICAgIGhpbnRzXyA9IGhpbnRzOworICB9CisKKyAgYm9vbCByZWFkX2Vycm9yKCkgY29uc3QgeyByZXR1cm4gcmVhZF9lcnJvcl87IH0KKyAgYm9vbCBoYXNfdW5hdmFpbGFibGVfZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGhhc191bmF2YWlsYWJsZV9kYXRhXzsgfQorCisgIGJvb2wgaGFzX3JlYWRfcHJvYmxlbXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlYWRfZXJyb3IoKSB8fCBoYXNfdW5hdmFpbGFibGVfZGF0YSgpOworICB9CisKKyAgdm9pZCBSZXNldEVycm9ycygpOworCisgIGJvb2wgSXNXaG9sZUZpbGVBdmFpbGFibGUoKTsKKworICBib29sIENoZWNrRGF0YVJhbmdlQW5kUmVxdWVzdElmVW5hdmFpbGFibGUoRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgIGJvb2wgQ2hlY2tXaG9sZUZpbGVBbmRSZXF1ZXN0SWZVbmF2YWlsYWJsZSgpOworCisgIC8vIElGWF9TZWVrYWJsZVJlYWRTdHJlYW0gb3ZlcnJpZGVzOgorICBib29sIFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICBGWF9GSUxFU0laRSBHZXRTaXplKCkgb3ZlcnJpZGU7CisKKyBwcm90ZWN0ZWQ6CisgIENQREZfUmVhZFZhbGlkYXRvcihjb25zdCBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIGZpbGVfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgIENQREZfRGF0YUF2YWlsOjpGaWxlQXZhaWwqIGZpbGVfYXZhaWwpOworICB+Q1BERl9SZWFkVmFsaWRhdG9yKCkgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICB2b2lkIFNjaGVkdWxlRG93bmxvYWQoRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisgIGJvb2wgSXNEYXRhUmFuZ2VBdmFpbGFibGUoRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgY29uc3Q7CisKKyAgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IGZpbGVfcmVhZF87CisgIFVub3duZWRQdHI8Q1BERl9EYXRhQXZhaWw6OkZpbGVBdmFpbD4gZmlsZV9hdmFpbF87CisKKyAgVW5vd25lZFB0cjxDUERGX0RhdGFBdmFpbDo6RG93bmxvYWRIaW50cz4gaGludHNfOworCisgIGJvb2wgcmVhZF9lcnJvcl87CisgIGJvb2wgaGFzX3VuYXZhaWxhYmxlX2RhdGFfOworICBib29sIHdob2xlX2ZpbGVfYWxyZWFkeV9hdmFpbGFibGVfOworICBjb25zdCBGWF9GSUxFU0laRSBmaWxlX3NpemVfOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfUEFSU0VSX0NQREZfUkVBRF9WQUxJREFUT1JfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9yZWFkX3ZhbGlkYXRvcl91bml0dGVzdC5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVhZF92YWxpZGF0b3JfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0N2FiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVhZF92YWxpZGF0b3JfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMzAxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVhZF92YWxpZGF0b3IuaCIKKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X21lbW9yeXN0cmVhbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyZWFtLmgiCisjaW5jbHVkZSAidGVzdGluZy9meF9zdHJpbmdfdGVzdGhlbHBlcnMuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIHVpbnQzMl90IGtUZXN0RGF0YVNpemUgPSA2NCAqIDEwMjQgLSA0Njc7CisKK3N0ZDo6cGFpcjxGWF9GSUxFU0laRSwgRlhfRklMRVNJWkU+IE1ha2VSYW5nZSh1aW50MzJfdCBzdGFydCwgdWludDMyX3QgZW5kKSB7CisgIHJldHVybiBzdGQ6OnBhaXI8RlhfRklMRVNJWkUsIEZYX0ZJTEVTSVpFPihzdGFydCwgZW5kKTsKK30KKworY2xhc3MgTW9ja0ZpbGVBdmFpbCA6IHB1YmxpYyBDUERGX0RhdGFBdmFpbDo6RmlsZUF2YWlsIHsKKyBwdWJsaWM6CisgIE1vY2tGaWxlQXZhaWwoKSA6IGF2YWlsYWJsZV9yYW5nZV8oMCwgMCkge30KKyAgfk1vY2tGaWxlQXZhaWwoKSBvdmVycmlkZSB7fQorCisgIGJvb2wgSXNEYXRhQXZhaWwoRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBhdmFpbGFibGVfcmFuZ2VfLmZpcnN0IDw9IG9mZnNldCAmJgorICAgICAgICAgICBhdmFpbGFibGVfcmFuZ2VfLnNlY29uZCA+PSBzdGF0aWNfY2FzdDxGWF9GSUxFU0laRT4ob2Zmc2V0ICsgc2l6ZSk7CisgIH0KKworICB2b2lkIFNldEF2YWlsYWJsZVJhbmdlKGNvbnN0IHN0ZDo6cGFpcjxGWF9GSUxFU0laRSwgRlhfRklMRVNJWkU+JiByYW5nZSkgeworICAgIGF2YWlsYWJsZV9yYW5nZV8gPSByYW5nZTsKKyAgfQorCisgIHZvaWQgU2V0QXZhaWxhYmxlUmFuZ2UodWludDMyX3Qgc3RhcnQsIHVpbnQzMl90IGVuZCkgeworICAgIFNldEF2YWlsYWJsZVJhbmdlKE1ha2VSYW5nZShzdGFydCwgZW5kKSk7CisgIH0KKworIHByaXZhdGU6CisgIHN0ZDo6cGFpcjxGWF9GSUxFU0laRSwgRlhfRklMRVNJWkU+IGF2YWlsYWJsZV9yYW5nZV87Cit9OworCitjbGFzcyBNb2NrRG93bmxvYWRIaW50cyA6IHB1YmxpYyBDUERGX0RhdGFBdmFpbDo6RG93bmxvYWRIaW50cyB7CisgcHVibGljOgorICBNb2NrRG93bmxvYWRIaW50cygpIDogbGFzdF9yZXF1ZXN0ZWRfcmFuZ2VfKDAsIDApIHt9CisgIH5Nb2NrRG93bmxvYWRIaW50cygpIG92ZXJyaWRlIHt9CisKKyAgdm9pZCBBZGRTZWdtZW50KEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlIHsKKyAgICBsYXN0X3JlcXVlc3RlZF9yYW5nZV8uZmlyc3QgPSBvZmZzZXQ7CisgICAgbGFzdF9yZXF1ZXN0ZWRfcmFuZ2VfLnNlY29uZCA9IG9mZnNldCArIHNpemU7CisgIH0KKworICBjb25zdCBzdGQ6OnBhaXI8RlhfRklMRVNJWkUsIEZYX0ZJTEVTSVpFPiYgR2V0TGFzdFJlcXVzdGVkUmFuZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGxhc3RfcmVxdWVzdGVkX3JhbmdlXzsKKyAgfQorCisgIHZvaWQgUmVzZXQoKSB7IGxhc3RfcmVxdWVzdGVkX3JhbmdlXyA9IE1ha2VSYW5nZSgwLCAwKTsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjpwYWlyPEZYX0ZJTEVTSVpFLCBGWF9GSUxFU0laRT4gbGFzdF9yZXF1ZXN0ZWRfcmFuZ2VfOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK1RFU1QoQ1BERl9SZWFkVmFsaWRhdG9yVGVzdCwgVW5hdmFpbGFibGVEYXRhKSB7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHRlc3RfZGF0YShrVGVzdERhdGFTaXplKTsKKyAgYXV0byBmaWxlID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9NZW1vcnlTdHJlYW0+KHRlc3RfZGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2RhdGEuc2l6ZSgpLCBmYWxzZSk7CisgIE1vY2tGaWxlQXZhaWwgZmlsZV9hdmFpbDsKKyAgYXV0byB2YWxpZGF0b3IgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERl9SZWFkVmFsaWRhdG9yPihmaWxlLCAmZmlsZV9hdmFpbCk7CisKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVhZF9idWZmZXIoMTAwKTsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgdmFsaWRhdG9yLT5SZWFkQmxvY2socmVhZF9idWZmZXIuZGF0YSgpLCA1MDAwLCByZWFkX2J1ZmZlci5zaXplKCkpKTsKKworICBFWFBFQ1RfRkFMU0UodmFsaWRhdG9yLT5yZWFkX2Vycm9yKCkpOworICBFWFBFQ1RfVFJVRSh2YWxpZGF0b3ItPmhhc191bmF2YWlsYWJsZV9kYXRhKCkpOworCisgIHZhbGlkYXRvci0+UmVzZXRFcnJvcnMoKTsKKworICBmaWxlX2F2YWlsLlNldEF2YWlsYWJsZVJhbmdlKDUwMDAsIDUwMDAgKyByZWFkX2J1ZmZlci5zaXplKCkpOworCisgIEVYUEVDVF9UUlVFKAorICAgICAgdmFsaWRhdG9yLT5SZWFkQmxvY2socmVhZF9idWZmZXIuZGF0YSgpLCA1MDAwLCByZWFkX2J1ZmZlci5zaXplKCkpKTsKKyAgRVhQRUNUX0ZBTFNFKHZhbGlkYXRvci0+cmVhZF9lcnJvcigpKTsKKyAgRVhQRUNUX0ZBTFNFKHZhbGlkYXRvci0+aGFzX3VuYXZhaWxhYmxlX2RhdGEoKSk7Cit9CisKK1RFU1QoQ1BERl9SZWFkVmFsaWRhdG9yVGVzdCwgVW5hdmFpbGFibGVEYXRhV2l0aEhpbnRzKSB7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHRlc3RfZGF0YShrVGVzdERhdGFTaXplKTsKKyAgYXV0byBmaWxlID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9NZW1vcnlTdHJlYW0+KHRlc3RfZGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2RhdGEuc2l6ZSgpLCBmYWxzZSk7CisgIE1vY2tGaWxlQXZhaWwgZmlsZV9hdmFpbDsKKyAgYXV0byB2YWxpZGF0b3IgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERl9SZWFkVmFsaWRhdG9yPihmaWxlLCAmZmlsZV9hdmFpbCk7CisKKyAgTW9ja0Rvd25sb2FkSGludHMgaGludHM7CisgIHZhbGlkYXRvci0+U2V0RG93bmxvYWRIaW50cygmaGludHMpOworCisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlYWRfYnVmZmVyKDEwMCk7CisKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgdmFsaWRhdG9yLT5SZWFkQmxvY2socmVhZF9idWZmZXIuZGF0YSgpLCA1MDAwLCByZWFkX2J1ZmZlci5zaXplKCkpKTsKKyAgRVhQRUNUX0ZBTFNFKHZhbGlkYXRvci0+cmVhZF9lcnJvcigpKTsKKyAgRVhQRUNUX1RSVUUodmFsaWRhdG9yLT5oYXNfdW5hdmFpbGFibGVfZGF0YSgpKTsKKworICAvLyBSZXF1ZXN0ZWQgcmFuZ2Ugc2hvdWxkIGJlIGVubGFyZ2VkIGFuZCBhbGlnbmVkLgorICBFWFBFQ1RfRVEoTWFrZVJhbmdlKDQ2MDgsIDUxMjApLCBoaW50cy5HZXRMYXN0UmVxdXN0ZWRSYW5nZSgpKTsKKworICBmaWxlX2F2YWlsLlNldEF2YWlsYWJsZVJhbmdlKGhpbnRzLkdldExhc3RSZXF1c3RlZFJhbmdlKCkpOworICBoaW50cy5SZXNldCgpOworCisgIHZhbGlkYXRvci0+UmVzZXRFcnJvcnMoKTsKKyAgRVhQRUNUX1RSVUUoCisgICAgICB2YWxpZGF0b3ItPlJlYWRCbG9jayhyZWFkX2J1ZmZlci5kYXRhKCksIDUwMDAsIHJlYWRfYnVmZmVyLnNpemUoKSkpOworICAvLyBObyBuZXcgcmVxdWVzdCBvbiBhbHJlYWR5IGF2YWlsYWJsZSBkYXRhLgorICBFWFBFQ1RfRVEoTWFrZVJhbmdlKDAsIDApLCBoaW50cy5HZXRMYXN0UmVxdXN0ZWRSYW5nZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKHZhbGlkYXRvci0+cmVhZF9lcnJvcigpKTsKKyAgRVhQRUNUX0ZBTFNFKHZhbGlkYXRvci0+aGFzX3VuYXZhaWxhYmxlX2RhdGEoKSk7CisKKyAgdmFsaWRhdG9yLT5SZXNldEVycm9ycygpOworICAvLyBUcnkgcmVhZCB1bmF2YWlsYWJsZSBkYXRhIGF0IGZpbGUgZW5kLgorICBFWFBFQ1RfRkFMU0UodmFsaWRhdG9yLT5SZWFkQmxvY2socmVhZF9idWZmZXIuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLT5HZXRTaXplKCkgLSByZWFkX2J1ZmZlci5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX2J1ZmZlci5zaXplKCkpKTsKKyAgLy8gU2hvdWxkIG5vdCBlbmxhcmdlIHJlcXVlc3QgYXQgZmlsZSBlbmQuCisgIEVYUEVDVF9FUSh2YWxpZGF0b3ItPkdldFNpemUoKSwgaGludHMuR2V0TGFzdFJlcXVzdGVkUmFuZ2UoKS5zZWNvbmQpOworICBFWFBFQ1RfRkFMU0UodmFsaWRhdG9yLT5yZWFkX2Vycm9yKCkpOworICBFWFBFQ1RfVFJVRSh2YWxpZGF0b3ItPmhhc191bmF2YWlsYWJsZV9kYXRhKCkpOworCisgIHZhbGlkYXRvci0+U2V0RG93bmxvYWRIaW50cyhudWxscHRyKTsKK30KKworVEVTVChDUERGX1JlYWRWYWxpZGF0b3JUZXN0LCBSZWFkRXJyb3IpIHsKKyAgYXV0byBmaWxlID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9JbnZhbGlkU2Vla2FibGVSZWFkU3RyZWFtPihrVGVzdERhdGFTaXplKTsKKyAgYXV0byB2YWxpZGF0b3IgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERl9SZWFkVmFsaWRhdG9yPihmaWxlLCBudWxscHRyKTsKKworICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0J1ZmZlclNpemUgPSAzICogMTAwMDsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyKGtCdWZmZXJTaXplKTsKKworICBFWFBFQ1RfRkFMU0UodmFsaWRhdG9yLT5SZWFkQmxvY2soYnVmZmVyLmRhdGEoKSwgNTAwMCwgMTAwKSk7CisgIEVYUEVDVF9UUlVFKHZhbGlkYXRvci0+cmVhZF9lcnJvcigpKTsKKyAgRVhQRUNUX1RSVUUodmFsaWRhdG9yLT5oYXNfdW5hdmFpbGFibGVfZGF0YSgpKTsKK30KKworVEVTVChDUERGX1JlYWRWYWxpZGF0b3JUZXN0LCBJbnRPdmVyZmxvdykgeworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB0ZXN0X2RhdGEoa1Rlc3REYXRhU2l6ZSk7CisgIGF1dG8gZmlsZSA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfTWVtb3J5U3RyZWFtPih0ZXN0X2RhdGEuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9kYXRhLnNpemUoKSwgZmFsc2UpOworICBNb2NrRmlsZUF2YWlsIGZpbGVfYXZhaWw7CisgIGF1dG8gdmFsaWRhdG9yID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfUmVhZFZhbGlkYXRvcj4oZmlsZSwgJmZpbGVfYXZhaWwpOworCisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlYWRfYnVmZmVyKDEwMCk7CisKKyAgLy8gSWYgd2UgaGF2ZSBpbnQgb3ZlcmZsb3csIHRoaXMgaXMgZXF1YWwgcmVhZGluZyBhZnRlciBmaWxlIGVuZC4gVGhpcyBpcyBub3QKKyAgLy8gcmVhZF9lcnJvciwgYW5kIGluIHRoaXMgY2FzZSB3ZSBoYXZlIG5vdCB1bmF2YWlsYWJsZSBkYXRhLiBJdCBpcyBqdXN0IGVycm9yCisgIC8vIG9mIGlucHV0IHBhcmFtcy4KKyAgRVhQRUNUX0ZBTFNFKHZhbGlkYXRvci0+UmVhZEJsb2NrKHJlYWRfYnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8RlhfRklMRVNJWkU+OjptYXgoKSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkX2J1ZmZlci5zaXplKCkpKTsKKyAgRVhQRUNUX0ZBTFNFKHZhbGlkYXRvci0+cmVhZF9lcnJvcigpKTsKKyAgRVhQRUNUX0ZBTFNFKHZhbGlkYXRvci0+aGFzX3VuYXZhaWxhYmxlX2RhdGEoKSk7Cit9CisKK1RFU1QoQ1BERl9SZWFkVmFsaWRhdG9yVGVzdCwgU2Vzc2lvbikgeworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB0ZXN0X2RhdGEoa1Rlc3REYXRhU2l6ZSk7CisKKyAgYXV0byBmaWxlID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9JbnZhbGlkU2Vla2FibGVSZWFkU3RyZWFtPihrVGVzdERhdGFTaXplKTsKKyAgTW9ja0ZpbGVBdmFpbCBmaWxlX2F2YWlsOworICBNb2NrRG93bmxvYWRIaW50cyBoaW50czsKKyAgYXV0byB2YWxpZGF0b3IgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERl9SZWFkVmFsaWRhdG9yPihmaWxlLCAmZmlsZV9hdmFpbCk7CisgIHZhbGlkYXRvci0+U2V0RG93bmxvYWRIaW50cygmaGludHMpOworCisgIGNvbnN0IENQREZfUmVhZFZhbGlkYXRvcjo6U2Vzc2lvbiByZWFkX3Nlc3Npb24odmFsaWRhdG9yLkdldCgpKTsKKyAgQVNTRVJUX0ZBTFNFKHZhbGlkYXRvci0+aGFzX3JlYWRfcHJvYmxlbXMoKSk7CisKKyAgLy8gRGF0YSBpcyB1bmF2YWlsYWJsZQorICB2YWxpZGF0b3ItPlJlYWRCbG9jayh0ZXN0X2RhdGEuZGF0YSgpLCAwLCAxMDApOworCisgIEVYUEVDVF9UUlVFKHZhbGlkYXRvci0+aGFzX3JlYWRfcHJvYmxlbXMoKSk7CisgIEVYUEVDVF9UUlVFKHZhbGlkYXRvci0+aGFzX3VuYXZhaWxhYmxlX2RhdGEoKSk7CisgIEVYUEVDVF9GQUxTRSh2YWxpZGF0b3ItPnJlYWRfZXJyb3IoKSk7CisKKyAgeworICAgIGNvbnN0IENQREZfUmVhZFZhbGlkYXRvcjo6U2Vzc2lvbiByZWFkX3N1YnNlc3Npb24odmFsaWRhdG9yLkdldCgpKTsKKyAgICAvLyBUaGUgcmVhZCBwcm9ibGVtcyBzaG91bGQgYmUgaGlkZGVuLgorICAgIEVYUEVDVF9GQUxTRSh2YWxpZGF0b3ItPmhhc19yZWFkX3Byb2JsZW1zKCkpOworCisgICAgZmlsZV9hdmFpbC5TZXRBdmFpbGFibGVSYW5nZSgwLCAxMDApOworICAgIC8vIFJlYWQgZmFpbC4KKyAgICB2YWxpZGF0b3ItPlJlYWRCbG9jayh0ZXN0X2RhdGEuZGF0YSgpLCAwLCAxMDApOworICAgIEVYUEVDVF9UUlVFKHZhbGlkYXRvci0+aGFzX3JlYWRfcHJvYmxlbXMoKSk7CisgICAgRVhQRUNUX1RSVUUodmFsaWRhdG9yLT5oYXNfdW5hdmFpbGFibGVfZGF0YSgpKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWxpZGF0b3ItPnJlYWRfZXJyb3IoKSk7CisgIH0KKworICAvLyBUaGUgcHJvYmxlbXMgc2hvdWxkIGJlIG1lcmdlZAorICBFWFBFQ1RfVFJVRSh2YWxpZGF0b3ItPmhhc19yZWFkX3Byb2JsZW1zKCkpOworICBFWFBFQ1RfVFJVRSh2YWxpZGF0b3ItPmhhc191bmF2YWlsYWJsZV9kYXRhKCkpOworICBFWFBFQ1RfVFJVRSh2YWxpZGF0b3ItPnJlYWRfZXJyb3IoKSk7Cit9CisKK1RFU1QoQ1BERl9SZWFkVmFsaWRhdG9yVGVzdCwgU2Vzc2lvblJlc2V0KSB7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHRlc3RfZGF0YShrVGVzdERhdGFTaXplKTsKKworICBhdXRvIGZpbGUgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0ludmFsaWRTZWVrYWJsZVJlYWRTdHJlYW0+KGtUZXN0RGF0YVNpemUpOworICBNb2NrRmlsZUF2YWlsIGZpbGVfYXZhaWw7CisgIE1vY2tEb3dubG9hZEhpbnRzIGhpbnRzOworICBhdXRvIHZhbGlkYXRvciA9IHBkZml1bTo6TWFrZVJldGFpbjxDUERGX1JlYWRWYWxpZGF0b3I+KGZpbGUsICZmaWxlX2F2YWlsKTsKKyAgdmFsaWRhdG9yLT5TZXREb3dubG9hZEhpbnRzKCZoaW50cyk7CisKKyAgY29uc3QgQ1BERl9SZWFkVmFsaWRhdG9yOjpTZXNzaW9uIHJlYWRfc2Vzc2lvbih2YWxpZGF0b3IuR2V0KCkpOworICBBU1NFUlRfRkFMU0UodmFsaWRhdG9yLT5oYXNfcmVhZF9wcm9ibGVtcygpKTsKKworICAvLyBEYXRhIGlzIHVuYXZhaWxhYmxlCisgIHZhbGlkYXRvci0+UmVhZEJsb2NrKHRlc3RfZGF0YS5kYXRhKCksIDAsIDEwMCk7CisKKyAgRVhQRUNUX1RSVUUodmFsaWRhdG9yLT5oYXNfcmVhZF9wcm9ibGVtcygpKTsKKyAgRVhQRUNUX1RSVUUodmFsaWRhdG9yLT5oYXNfdW5hdmFpbGFibGVfZGF0YSgpKTsKKyAgRVhQRUNUX0ZBTFNFKHZhbGlkYXRvci0+cmVhZF9lcnJvcigpKTsKKworICB7CisgICAgY29uc3QgQ1BERl9SZWFkVmFsaWRhdG9yOjpTZXNzaW9uIHJlYWRfc3Vic2Vzc2lvbih2YWxpZGF0b3IuR2V0KCkpOworICAgIC8vIFRoZSByZWFkIHByb2JsZW1zIHNob3VsZCBiZSBoaWRkZW4uCisgICAgRVhQRUNUX0ZBTFNFKHZhbGlkYXRvci0+aGFzX3JlYWRfcHJvYmxlbXMoKSk7CisKKyAgICBmaWxlX2F2YWlsLlNldEF2YWlsYWJsZVJhbmdlKDAsIDEwMCk7CisgICAgLy8gUmVhZCBmYWlsLgorICAgIHZhbGlkYXRvci0+UmVhZEJsb2NrKHRlc3RfZGF0YS5kYXRhKCksIDAsIDEwMCk7CisgICAgRVhQRUNUX1RSVUUodmFsaWRhdG9yLT5oYXNfcmVhZF9wcm9ibGVtcygpKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWxpZGF0b3ItPmhhc191bmF2YWlsYWJsZV9kYXRhKCkpOworICAgIEVYUEVDVF9UUlVFKHZhbGlkYXRvci0+cmVhZF9lcnJvcigpKTsKKworICAgIC8vIFJlc2V0IHNlc3Npb24uCisgICAgdmFsaWRhdG9yLT5SZXNldEVycm9ycygpOworICAgIEVYUEVDVF9GQUxTRSh2YWxpZGF0b3ItPmhhc19yZWFkX3Byb2JsZW1zKCkpOworICB9CisKKyAgLy8gVGhlIHByb2JsZW1zIHNob3VsZCBiZSByZXN0b3JlZC4KKyAgRVhQRUNUX1RSVUUodmFsaWRhdG9yLT5oYXNfcmVhZF9wcm9ibGVtcygpKTsKKyAgRVhQRUNUX1RSVUUodmFsaWRhdG9yLT5oYXNfdW5hdmFpbGFibGVfZGF0YSgpKTsKKyAgRVhQRUNUX0ZBTFNFKHZhbGlkYXRvci0+cmVhZF9lcnJvcigpKTsKK30KKworVEVTVChDUERGX1JlYWRWYWxpZGF0b3JUZXN0LCBDaGVja0RhdGFSYW5nZUFuZFJlcXVlc3RJZlVuYXZhaWxhYmxlKSB7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHRlc3RfZGF0YShrVGVzdERhdGFTaXplKTsKKyAgYXV0byBmaWxlID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9NZW1vcnlTdHJlYW0+KHRlc3RfZGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2RhdGEuc2l6ZSgpLCBmYWxzZSk7CisgIE1vY2tGaWxlQXZhaWwgZmlsZV9hdmFpbDsKKyAgYXV0byB2YWxpZGF0b3IgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERl9SZWFkVmFsaWRhdG9yPihmaWxlLCAmZmlsZV9hdmFpbCk7CisKKyAgTW9ja0Rvd25sb2FkSGludHMgaGludHM7CisgIHZhbGlkYXRvci0+U2V0RG93bmxvYWRIaW50cygmaGludHMpOworCisgIEVYUEVDVF9GQUxTRSh2YWxpZGF0b3ItPkNoZWNrRGF0YVJhbmdlQW5kUmVxdWVzdElmVW5hdmFpbGFibGUoNTAwMCwgMTAwKSk7CisgIEVYUEVDVF9GQUxTRSh2YWxpZGF0b3ItPnJlYWRfZXJyb3IoKSk7CisgIEVYUEVDVF9UUlVFKHZhbGlkYXRvci0+aGFzX3VuYXZhaWxhYmxlX2RhdGEoKSk7CisKKyAgLy8gUmVxdWVzdGVkIHJhbmdlIHNob3VsZCBiZSBlbmxhcmdlZCBhbmQgYWxpZ25lZC4KKyAgRVhQRUNUX0VRKE1ha2VSYW5nZSg0NjA4LCA1NjMyKSwgaGludHMuR2V0TGFzdFJlcXVzdGVkUmFuZ2UoKSk7CisKKyAgZmlsZV9hdmFpbC5TZXRBdmFpbGFibGVSYW5nZShoaW50cy5HZXRMYXN0UmVxdXN0ZWRSYW5nZSgpKTsKKyAgaGludHMuUmVzZXQoKTsKKworICB2YWxpZGF0b3ItPlJlc2V0RXJyb3JzKCk7CisgIEVYUEVDVF9UUlVFKHZhbGlkYXRvci0+Q2hlY2tEYXRhUmFuZ2VBbmRSZXF1ZXN0SWZVbmF2YWlsYWJsZSg1MDAwLCAxMDApKTsKKyAgLy8gTm8gbmV3IHJlcXVlc3Qgb24gYWxyZWFkeSBhdmFpbGFibGUgZGF0YS4KKyAgRVhQRUNUX0VRKE1ha2VSYW5nZSgwLCAwKSwgaGludHMuR2V0TGFzdFJlcXVzdGVkUmFuZ2UoKSk7CisgIEVYUEVDVF9GQUxTRSh2YWxpZGF0b3ItPnJlYWRfZXJyb3IoKSk7CisgIEVYUEVDVF9GQUxTRSh2YWxpZGF0b3ItPmhhc191bmF2YWlsYWJsZV9kYXRhKCkpOworCisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlYWRfYnVmZmVyKDEwMCk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgdmFsaWRhdG9yLT5SZWFkQmxvY2socmVhZF9idWZmZXIuZGF0YSgpLCA1MDAwLCByZWFkX2J1ZmZlci5zaXplKCkpKTsKKyAgLy8gTm8gbmV3IHJlcXVlc3Qgb24gYWxyZWFkeSBhdmFpbGFibGUgZGF0YS4KKyAgRVhQRUNUX0VRKE1ha2VSYW5nZSgwLCAwKSwgaGludHMuR2V0TGFzdFJlcXVzdGVkUmFuZ2UoKSk7CisgIEVYUEVDVF9GQUxTRSh2YWxpZGF0b3ItPnJlYWRfZXJyb3IoKSk7CisgIEVYUEVDVF9GQUxTRSh2YWxpZGF0b3ItPmhhc191bmF2YWlsYWJsZV9kYXRhKCkpOworCisgIHZhbGlkYXRvci0+UmVzZXRFcnJvcnMoKTsKKyAgLy8gVHJ5IHJlcXVlc3QgdW5hdmFpbGFibGUgZGF0YSBhdCBmaWxlIGVuZC4KKyAgRVhQRUNUX0ZBTFNFKHZhbGlkYXRvci0+Q2hlY2tEYXRhUmFuZ2VBbmRSZXF1ZXN0SWZVbmF2YWlsYWJsZSgKKyAgICAgIHZhbGlkYXRvci0+R2V0U2l6ZSgpIC0gMTAwLCAxMDApKTsKKworICAvLyBTaG91bGQgbm90IGVubGFyZ2UgcmVxdWVzdCBhdCBmaWxlIGVuZC4KKyAgRVhQRUNUX0VRKHZhbGlkYXRvci0+R2V0U2l6ZSgpLCBoaW50cy5HZXRMYXN0UmVxdXN0ZWRSYW5nZSgpLnNlY29uZCk7CisgIEVYUEVDVF9GQUxTRSh2YWxpZGF0b3ItPnJlYWRfZXJyb3IoKSk7CisgIEVYUEVDVF9UUlVFKHZhbGlkYXRvci0+aGFzX3VuYXZhaWxhYmxlX2RhdGEoKSk7CisKKyAgdmFsaWRhdG9yLT5SZXNldEVycm9ycygpOworICAvLyBPZmZzZXQgPiBmaWxlIHNpemUgc2hvdWxkIHlpZWxkIHx0cnVlfCBhbmQgbm90IGNhdXNlIGEgZmV0Y2guCisgIEVYUEVDVF9UUlVFKAorICAgICAgdmFsaWRhdG9yLT5DaGVja0RhdGFSYW5nZUFuZFJlcXVlc3RJZlVuYXZhaWxhYmxlKGtUZXN0RGF0YVNpemUgKyAxLCAxKSk7CisgIC8vIE5vIG5ldyByZXF1ZXN0IG9uIGFscmVhZHkgYXZhaWxhYmxlIGRhdGEuCisgIEVYUEVDVF9GQUxTRSh2YWxpZGF0b3ItPnJlYWRfZXJyb3IoKSk7CisgIEVYUEVDVF9GQUxTRSh2YWxpZGF0b3ItPmhhc191bmF2YWlsYWJsZV9kYXRhKCkpOworCisgIHZhbGlkYXRvci0+U2V0RG93bmxvYWRIaW50cyhudWxscHRyKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9yZWZlcmVuY2UuY3BwIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3JlZmVyZW5jZS5jcHAKaW5kZXggNjdiNjdjMi4uMmNhMGJkZCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3JlZmVyZW5jZS5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3JlZmVyZW5jZS5jcHAKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3JlZmVyZW5jZS5oIgogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2luZGlyZWN0X29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmVhbS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCiAKQEAgLTE5LDEyICsyMCwxMiBAQAogICByZXR1cm4gUkVGRVJFTkNFOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUERGX1JlZmVyZW5jZTo6R2V0U3RyaW5nKCkgY29uc3QgeworQnl0ZVN0cmluZyBDUERGX1JlZmVyZW5jZTo6R2V0U3RyaW5nKCkgY29uc3QgewogICBDUERGX09iamVjdCogb2JqID0gU2FmZUdldERpcmVjdCgpOwotICByZXR1cm4gb2JqID8gb2JqLT5HZXRTdHJpbmcoKSA6IENGWF9CeXRlU3RyaW5nKCk7CisgIHJldHVybiBvYmogPyBvYmotPkdldFN0cmluZygpIDogQnl0ZVN0cmluZygpOwogfQogCi1GWF9GTE9BVCBDUERGX1JlZmVyZW5jZTo6R2V0TnVtYmVyKCkgY29uc3QgeworZmxvYXQgQ1BERl9SZWZlcmVuY2U6OkdldE51bWJlcigpIGNvbnN0IHsKICAgQ1BERl9PYmplY3QqIG9iaiA9IFNhZmVHZXREaXJlY3QoKTsKICAgcmV0dXJuIG9iaiA/IG9iai0+R2V0TnVtYmVyKCkgOiAwOwogfQpAQCAtNjUsNyArNjYsNyBAQAogICAgICAgICAgICAgICAgPyBwRGlyZWN0LT5DbG9uZU5vbkN5Y2xpYyh0cnVlLCBwVmlzaXRlZCkKICAgICAgICAgICAgICAgIDogbnVsbHB0cjsKICAgfQotICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfUmVmZXJlbmNlPihtX3BPYmpMaXN0LCBtX1JlZk9iak51bSk7CisgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9SZWZlcmVuY2U+KG1fcE9iakxpc3QuR2V0KCksIG1fUmVmT2JqTnVtKTsKIH0KIAogQ1BERl9PYmplY3QqIENQREZfUmVmZXJlbmNlOjpTYWZlR2V0RGlyZWN0KCkgY29uc3QgewpAQCAtODIsMyArODMsOCBAQAogICByZXR1cm4gbV9wT2JqTGlzdCA/IG1fcE9iakxpc3QtPkdldE9yUGFyc2VJbmRpcmVjdE9iamVjdChtX1JlZk9iak51bSkKICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyOwogfQorCitib29sIENQREZfUmVmZXJlbmNlOjpXcml0ZVRvKElGWF9BcmNoaXZlU3RyZWFtKiBhcmNoaXZlKSBjb25zdCB7CisgIHJldHVybiBhcmNoaXZlLT5Xcml0ZVN0cmluZygiICIpICYmIGFyY2hpdmUtPldyaXRlRFdvcmQoR2V0UmVmT2JqTnVtKCkpICYmCisgICAgICAgICBhcmNoaXZlLT5Xcml0ZVN0cmluZygiIDAgUiAiKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9yZWZlcmVuY2UuaCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9yZWZlcmVuY2UuaAppbmRleCBiZTdmMTg0Li5iNDcyYjRhIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVmZXJlbmNlLmgKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3JlZmVyZW5jZS5oCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSA8c2V0PgogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKIAogY2xhc3MgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlcjsKIApAQCAtMjMsMTcgKzI0LDE3IEBACiAgIFR5cGUgR2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IENsb25lKCkgY29uc3Qgb3ZlcnJpZGU7CiAgIENQREZfT2JqZWN0KiBHZXREaXJlY3QoKSBjb25zdCBvdmVycmlkZTsKLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0U3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIEZYX0ZMT0FUIEdldE51bWJlcigpIGNvbnN0IG92ZXJyaWRlOworICBCeXRlU3RyaW5nIEdldFN0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBmbG9hdCBHZXROdW1iZXIoKSBjb25zdCBvdmVycmlkZTsKICAgaW50IEdldEludGVnZXIoKSBjb25zdCBvdmVycmlkZTsKICAgQ1BERl9EaWN0aW9uYXJ5KiBHZXREaWN0KCkgY29uc3Qgb3ZlcnJpZGU7CiAgIGJvb2wgSXNSZWZlcmVuY2UoKSBjb25zdCBvdmVycmlkZTsKICAgQ1BERl9SZWZlcmVuY2UqIEFzUmVmZXJlbmNlKCkgb3ZlcnJpZGU7CiAgIGNvbnN0IENQREZfUmVmZXJlbmNlKiBBc1JlZmVyZW5jZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIFdyaXRlVG8oSUZYX0FyY2hpdmVTdHJlYW0qIGFyY2hpdmUpIGNvbnN0IG92ZXJyaWRlOwogCi0gIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIEdldE9iakxpc3QoKSBjb25zdCB7IHJldHVybiBtX3BPYmpMaXN0OyB9CisgIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIEdldE9iakxpc3QoKSBjb25zdCB7IHJldHVybiBtX3BPYmpMaXN0LkdldCgpOyB9CiAgIHVpbnQzMl90IEdldFJlZk9iak51bSgpIGNvbnN0IHsgcmV0dXJuIG1fUmVmT2JqTnVtOyB9Ci0KICAgdm9pZCBTZXRSZWYoQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciogcERvYywgdWludDMyX3Qgb2JqbnVtKTsKIAogIHByb3RlY3RlZDoKQEAgLTQyLDcgKzQzLDcgQEAKICAgICAgIHN0ZDo6c2V0PGNvbnN0IENQREZfT2JqZWN0Kj4qIHBWaXNpdGVkKSBjb25zdCBvdmVycmlkZTsKICAgQ1BERl9PYmplY3QqIFNhZmVHZXREaXJlY3QoKSBjb25zdDsKIAotICBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBtX3BPYmpMaXN0OworICBVbm93bmVkUHRyPENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXI+IG1fcE9iakxpc3Q7CiAgIHVpbnQzMl90IG1fUmVmT2JqTnVtOwogfTsKIApkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3NlY3VyaXR5X2hhbmRsZXIuY3BwIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3NlY3VyaXR5X2hhbmRsZXIuY3BwCmluZGV4IDYxODM0ZmMuLjdlYjVjNDIgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zZWN1cml0eV9oYW5kbGVyLmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc2VjdXJpdHlfaGFuZGxlci5jcHAKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfY3J5cHRvX2hhbmRsZXIuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3QuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmluZy5oIgogCiBuYW1lc3BhY2UgewpAQCAtMjcsNDcgKzI2LDYwIEBACiAgICAgMHg1NiwgMHhmZiwgMHhmYSwgMHgwMSwgMHgwOCwgMHgyZSwgMHgyZSwgMHgwMCwgMHhiNiwgMHhkMCwgMHg2OCwKICAgICAweDNlLCAweDgwLCAweDJmLCAweDBjLCAweGE5LCAweGZlLCAweDY0LCAweDUzLCAweDY5LCAweDdhfTsKIAotdm9pZCBDYWxjRW5jcnlwdEtleShDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwYXNzd29yZCwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFzc19zaXplLAordm9pZCBDYWxjRW5jcnlwdEtleShjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBwYXNzd29yZCwKICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoga2V5LAogICAgICAgICAgICAgICAgICAgICBpbnQga2V5bGVuLAogICAgICAgICAgICAgICAgICAgICBib29sIGJJZ25vcmVNZXRhLAotICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiBwSWRBcnJheSkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBmaWxlSWQpIHsKICAgaW50IHJldmlzaW9uID0gcEVuY3J5cHQtPkdldEludGVnZXJGb3IoIlIiKTsKICAgdWludDhfdCBwYXNzY29kZVszMl07CiAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAzMjsgaSsrKSB7Ci0gICAgcGFzc2NvZGVbaV0gPSBpIDwgcGFzc19zaXplID8gcGFzc3dvcmRbaV0gOiBkZWZwYXNzY29kZVtpIC0gcGFzc19zaXplXTsKKyAgICBwYXNzY29kZVtpXSA9IGkgPCBwYXNzd29yZC5HZXRMZW5ndGgoKQorICAgICAgICAgICAgICAgICAgICAgID8gcGFzc3dvcmRbaV0KKyAgICAgICAgICAgICAgICAgICAgICA6IGRlZnBhc3Njb2RlW2kgLSBwYXNzd29yZC5HZXRMZW5ndGgoKV07CiAgIH0KICAgQ1JZUFRfbWQ1X2NvbnRleHQgbWQ1OwogICBDUllQVF9NRDVTdGFydCgmbWQ1KTsKICAgQ1JZUFRfTUQ1VXBkYXRlKCZtZDUsIHBhc3Njb2RlLCAzMik7Ci0gIENGWF9CeXRlU3RyaW5nIG9rZXkgPSBwRW5jcnlwdC0+R2V0U3RyaW5nRm9yKCJPIik7CisgIEJ5dGVTdHJpbmcgb2tleSA9IHBFbmNyeXB0LT5HZXRTdHJpbmdGb3IoIk8iKTsKICAgQ1JZUFRfTUQ1VXBkYXRlKCZtZDUsICh1aW50OF90Kilva2V5LmNfc3RyKCksIG9rZXkuR2V0TGVuZ3RoKCkpOwogICB1aW50MzJfdCBwZXJtID0gcEVuY3J5cHQtPkdldEludGVnZXJGb3IoIlAiKTsKICAgQ1JZUFRfTUQ1VXBkYXRlKCZtZDUsICh1aW50OF90KikmcGVybSwgNCk7Ci0gIGlmIChwSWRBcnJheSkgewotICAgIENGWF9CeXRlU3RyaW5nIGlkID0gcElkQXJyYXktPkdldFN0cmluZ0F0KDApOwotICAgIENSWVBUX01ENVVwZGF0ZSgmbWQ1LCAodWludDhfdCopaWQuY19zdHIoKSwgaWQuR2V0TGVuZ3RoKCkpOwotICB9CisgIGlmICghZmlsZUlkLklzRW1wdHkoKSkKKyAgICBDUllQVF9NRDVVcGRhdGUoJm1kNSwgKHVpbnQ4X3QqKWZpbGVJZC5jX3N0cigpLCBmaWxlSWQuR2V0TGVuZ3RoKCkpOwogICBpZiAoIWJJZ25vcmVNZXRhICYmIHJldmlzaW9uID49IDMgJiYKICAgICAgICFwRW5jcnlwdC0+R2V0SW50ZWdlckZvcigiRW5jcnlwdE1ldGFkYXRhIiwgMSkpIHsKLSAgICB1aW50MzJfdCB0YWcgPSAodWludDMyX3QpLTE7CisgICAgdWludDMyX3QgdGFnID0gMHhGRkZGRkZGRjsKICAgICBDUllQVF9NRDVVcGRhdGUoJm1kNSwgKHVpbnQ4X3QqKSZ0YWcsIDQpOwogICB9CiAgIHVpbnQ4X3QgZGlnZXN0WzE2XTsKICAgQ1JZUFRfTUQ1RmluaXNoKCZtZDUsIGRpZ2VzdCk7CiAgIHVpbnQzMl90IGNvcHlfbGVuID0ga2V5bGVuOwotICBpZiAoY29weV9sZW4gPiBzaXplb2YoZGlnZXN0KSkgeworICBpZiAoY29weV9sZW4gPiBzaXplb2YoZGlnZXN0KSkKICAgICBjb3B5X2xlbiA9IHNpemVvZihkaWdlc3QpOwotICB9CiAgIGlmIChyZXZpc2lvbiA+PSAzKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDsgaSsrKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDsgaSsrKQogICAgICAgQ1JZUFRfTUQ1R2VuZXJhdGUoZGlnZXN0LCBjb3B5X2xlbiwgZGlnZXN0KTsKLSAgICB9CiAgIH0KLSAgRlhTWVNfbWVtc2V0KGtleSwgMCwga2V5bGVuKTsKLSAgRlhTWVNfbWVtY3B5KGtleSwgZGlnZXN0LCBjb3B5X2xlbik7CisgIG1lbXNldChrZXksIDAsIGtleWxlbik7CisgIG1lbWNweShrZXksIGRpZ2VzdCwgY29weV9sZW4pOworfQorCitib29sIElzVmFsaWRLZXlMZW5ndGhGb3JDaXBoZXIoaW50IGNpcGhlciwgaW50IGtleWxlbikgeworICBzd2l0Y2ggKGNpcGhlcikgeworICAgIGNhc2UgRlhDSVBIRVJfQUVTOgorICAgICAgcmV0dXJuIGtleWxlbiA9PSAxNiB8fCBrZXlsZW4gPT0gMjQgfHwga2V5bGVuID09IDMyOworICAgIGNhc2UgRlhDSVBIRVJfQUVTMjoKKyAgICAgIHJldHVybiBrZXlsZW4gPT0gMzI7CisgICAgY2FzZSBGWENJUEhFUl9SQzQ6CisgICAgICByZXR1cm4ga2V5bGVuID49IDUgJiYga2V5bGVuIDw9IDE2OworICAgIGNhc2UgRlhDSVBIRVJfTk9ORToKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICBOT1RSRUFDSEVEKCk7CisgIH0KKyAgcmV0dXJuIGZhbHNlOwogfQogCiB9ICAvLyBuYW1lc3BhY2UKQEAgLTc1LDggKzg3LDYgQEAKIENQREZfU2VjdXJpdHlIYW5kbGVyOjpDUERGX1NlY3VyaXR5SGFuZGxlcigpCiAgICAgOiBtX1ZlcnNpb24oMCksCiAgICAgICBtX1JldmlzaW9uKDApLAotICAgICAgbV9wUGFyc2VyKG51bGxwdHIpLAotICAgICAgbV9wRW5jcnlwdERpY3QobnVsbHB0ciksCiAgICAgICBtX1Blcm1pc3Npb25zKDApLAogICAgICAgbV9DaXBoZXIoRlhDSVBIRVJfTk9ORSksCiAgICAgICBtX0tleUxlbigwKSwKQEAgLTg0LDQwICs5NCwzNiBAQAogCiBDUERGX1NlY3VyaXR5SGFuZGxlcjo6fkNQREZfU2VjdXJpdHlIYW5kbGVyKCkge30KIAotQ1BERl9DcnlwdG9IYW5kbGVyKiBDUERGX1NlY3VyaXR5SGFuZGxlcjo6Q3JlYXRlQ3J5cHRvSGFuZGxlcigpIHsKLSAgcmV0dXJuIG5ldyBDUERGX0NyeXB0b0hhbmRsZXI7Ci19Ci0KLWJvb2wgQ1BERl9TZWN1cml0eUhhbmRsZXI6Ok9uSW5pdChDUERGX1BhcnNlciogcFBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCkgewotICBtX3BQYXJzZXIgPSBwUGFyc2VyOwotICBpZiAoIUxvYWREaWN0KHBFbmNyeXB0RGljdCkpIHsKK2Jvb2wgQ1BERl9TZWN1cml0eUhhbmRsZXI6Ok9uSW5pdChjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0FycmF5KiBwSWRBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBwYXNzd29yZCkgeworICBtX0ZpbGVJZCA9IHBJZEFycmF5ID8gcElkQXJyYXktPkdldFN0cmluZ0F0KDApIDogIiI7CisgIGlmICghTG9hZERpY3QocEVuY3J5cHREaWN0KSkKICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX05PTkUpIHsKKyAgaWYgKG1fQ2lwaGVyID09IEZYQ0lQSEVSX05PTkUpCiAgICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIENoZWNrU2VjdXJpdHkobV9LZXlMZW4pOworICBpZiAoIUNoZWNrU2VjdXJpdHkocGFzc3dvcmQpKQorICAgIHJldHVybiBmYWxzZTsKKworICBJbml0Q3J5cHRvSGFuZGxlcigpOworICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDUERGX1NlY3VyaXR5SGFuZGxlcjo6Q2hlY2tTZWN1cml0eShpbnQzMl90IGtleV9sZW4pIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgcGFzc3dvcmQgPSBtX3BQYXJzZXItPkdldFBhc3N3b3JkKCk7Citib29sIENQREZfU2VjdXJpdHlIYW5kbGVyOjpDaGVja1NlY3VyaXR5KGNvbnN0IEJ5dGVTdHJpbmcmIHBhc3N3b3JkKSB7CiAgIGlmICghcGFzc3dvcmQuSXNFbXB0eSgpICYmCi0gICAgICBDaGVja1Bhc3N3b3JkKHBhc3N3b3JkLnJhd19zdHIoKSwgcGFzc3dvcmQuR2V0TGVuZ3RoKCksIHRydWUsCi0gICAgICAgICAgICAgICAgICAgIG1fRW5jcnlwdEtleSwga2V5X2xlbikpIHsKKyAgICAgIENoZWNrUGFzc3dvcmQocGFzc3dvcmQsIHRydWUsIG1fRW5jcnlwdEtleSwgbV9LZXlMZW4pKSB7CiAgICAgbV9iT3duZXJVbmxvY2tlZCA9IHRydWU7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KLSAgcmV0dXJuIENoZWNrUGFzc3dvcmQocGFzc3dvcmQucmF3X3N0cigpLCBwYXNzd29yZC5HZXRMZW5ndGgoKSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgIG1fRW5jcnlwdEtleSwga2V5X2xlbik7CisgIHJldHVybiBDaGVja1Bhc3N3b3JkKHBhc3N3b3JkLCBmYWxzZSwgbV9FbmNyeXB0S2V5LCBtX0tleUxlbik7CiB9CiAKLXVpbnQzMl90IENQREZfU2VjdXJpdHlIYW5kbGVyOjpHZXRQZXJtaXNzaW9ucygpIHsKK3VpbnQzMl90IENQREZfU2VjdXJpdHlIYW5kbGVyOjpHZXRQZXJtaXNzaW9ucygpIGNvbnN0IHsKICAgcmV0dXJuIG1fYk93bmVyVW5sb2NrZWQgPyAweEZGRkZGRkZGIDogbV9QZXJtaXNzaW9uczsKIH0KIAotc3RhdGljIGJvb2wgTG9hZENyeXB0SW5mbyhDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsCitzdGF0aWMgYm9vbCBMb2FkQ3J5cHRJbmZvKGNvbnN0IENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGNpcGhlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBrZXlsZW4pIHsKICAgaW50IFZlcnNpb24gPSBwRW5jcnlwdERpY3QtPkdldEludGVnZXJGb3IoIlYiKTsKQEAgLTE0OCw3ICsxNTQsNyBAQAogICAgICAgICBuS2V5Qml0cyAqPSA4OwogICAgICAgfQogICAgICAga2V5bGVuID0gbktleUJpdHMgLyA4OwotICAgICAgQ0ZYX0J5dGVTdHJpbmcgY2lwaGVyX25hbWUgPSBwRGVmRmlsdGVyLT5HZXRTdHJpbmdGb3IoIkNGTSIpOworICAgICAgQnl0ZVN0cmluZyBjaXBoZXJfbmFtZSA9IHBEZWZGaWx0ZXItPkdldFN0cmluZ0ZvcigiQ0ZNIik7CiAgICAgICBpZiAoY2lwaGVyX25hbWUgPT0gIkFFU1YyIiB8fCBjaXBoZXJfbmFtZSA9PSAiQUVTVjMiKSB7CiAgICAgICAgIGNpcGhlciA9IEZYQ0lQSEVSX0FFUzsKICAgICAgIH0KQEAgLTE1OSwyNyArMTY1LDI2IEBACiAgIGlmIChrZXlsZW4gPiAzMiB8fCBrZXlsZW4gPCAwKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIHJldHVybiB0cnVlOworICByZXR1cm4gSXNWYWxpZEtleUxlbmd0aEZvckNpcGhlcihjaXBoZXIsIGtleWxlbik7CiB9CiAKLWJvb2wgQ1BERl9TZWN1cml0eUhhbmRsZXI6OkxvYWREaWN0KENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0KSB7Citib29sIENQREZfU2VjdXJpdHlIYW5kbGVyOjpMb2FkRGljdChjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCkgewogICBtX3BFbmNyeXB0RGljdCA9IHBFbmNyeXB0RGljdDsKICAgbV9WZXJzaW9uID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyRm9yKCJWIik7CiAgIG1fUmV2aXNpb24gPSBwRW5jcnlwdERpY3QtPkdldEludGVnZXJGb3IoIlIiKTsKICAgbV9QZXJtaXNzaW9ucyA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlckZvcigiUCIsIC0xKTsKICAgaWYgKG1fVmVyc2lvbiA8IDQpCi0gICAgcmV0dXJuIExvYWRDcnlwdEluZm8ocEVuY3J5cHREaWN0LCBDRlhfQnl0ZVN0cmluZygpLCBtX0NpcGhlciwgbV9LZXlMZW4pOworICAgIHJldHVybiBMb2FkQ3J5cHRJbmZvKHBFbmNyeXB0RGljdCwgQnl0ZVN0cmluZygpLCBtX0NpcGhlciwgbV9LZXlMZW4pOwogCi0gIENGWF9CeXRlU3RyaW5nIHN0bWZfbmFtZSA9IHBFbmNyeXB0RGljdC0+R2V0U3RyaW5nRm9yKCJTdG1GIik7Ci0gIENGWF9CeXRlU3RyaW5nIHN0cmZfbmFtZSA9IHBFbmNyeXB0RGljdC0+R2V0U3RyaW5nRm9yKCJTdHJGIik7CisgIEJ5dGVTdHJpbmcgc3RtZl9uYW1lID0gcEVuY3J5cHREaWN0LT5HZXRTdHJpbmdGb3IoIlN0bUYiKTsKKyAgQnl0ZVN0cmluZyBzdHJmX25hbWUgPSBwRW5jcnlwdERpY3QtPkdldFN0cmluZ0ZvcigiU3RyRiIpOwogICBpZiAoc3RtZl9uYW1lICE9IHN0cmZfbmFtZSkKICAgICByZXR1cm4gZmFsc2U7CiAKICAgcmV0dXJuIExvYWRDcnlwdEluZm8ocEVuY3J5cHREaWN0LCBzdHJmX25hbWUsIG1fQ2lwaGVyLCBtX0tleUxlbik7CiB9CiAKLWJvb2wgQ1BERl9TZWN1cml0eUhhbmRsZXI6OkxvYWREaWN0KENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHlwZSwKK2Jvb2wgQ1BERl9TZWN1cml0eUhhbmRsZXI6OkxvYWREaWN0KGNvbnN0IENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBjaXBoZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGtleV9sZW4pIHsKICAgbV9wRW5jcnlwdERpY3QgPSBwRW5jcnlwdERpY3Q7CkBAIC0xODcsOCArMTkyLDggQEAKICAgbV9SZXZpc2lvbiA9IHBFbmNyeXB0RGljdC0+R2V0SW50ZWdlckZvcigiUiIpOwogICBtX1Blcm1pc3Npb25zID0gcEVuY3J5cHREaWN0LT5HZXRJbnRlZ2VyRm9yKCJQIiwgLTEpOwogCi0gIENGWF9CeXRlU3RyaW5nIHN0cmZfbmFtZTsKLSAgQ0ZYX0J5dGVTdHJpbmcgc3RtZl9uYW1lOworICBCeXRlU3RyaW5nIHN0cmZfbmFtZTsKKyAgQnl0ZVN0cmluZyBzdG1mX25hbWU7CiAgIGlmIChtX1ZlcnNpb24gPj0gNCkgewogICAgIHN0bWZfbmFtZSA9IHBFbmNyeXB0RGljdC0+R2V0U3RyaW5nRm9yKCJTdG1GIik7CiAgICAgc3RyZl9uYW1lID0gcEVuY3J5cHREaWN0LT5HZXRTdHJpbmdGb3IoIlN0ckYiKTsKQEAgLTIwMywxNCArMjA4LDYgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQ1BERl9TZWN1cml0eUhhbmRsZXI6OkdldENyeXB0SW5mbyhpbnQmIGNpcGhlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiYgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYga2V5bGVuKSB7Ci0gIGNpcGhlciA9IG1fQ2lwaGVyOwotICBidWZmZXIgPSBtX0VuY3J5cHRLZXk7Ci0gIGtleWxlbiA9IG1fS2V5TGVuOwotICByZXR1cm4gdHJ1ZTsKLX0KICNkZWZpbmUgRlhfR0VUXzMyV09SRChuLCBiLCBpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIChuKSA9ICh1aW50MzJfdCkoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTIyOSwxNCArMjI2LDEzIEBACiAgIHJldHVybiAoaW50KXJldDsKIH0KIAotdm9pZCBSZXZpc2lvbjZfSGFzaChjb25zdCB1aW50OF90KiBwYXNzd29yZCwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSwKK3ZvaWQgUmV2aXNpb242X0hhc2goY29uc3QgQnl0ZVN0cmluZyYgcGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNhbHQsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZlY3RvciwKICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogaGFzaCkgewotICBDUllQVF9zaGEyNTZfY29udGV4dCBzaGE7CisgIENSWVBUX3NoYTJfY29udGV4dCBzaGE7CiAgIENSWVBUX1NIQTI1NlN0YXJ0KCZzaGEpOwotICBDUllQVF9TSEEyNTZVcGRhdGUoJnNoYSwgcGFzc3dvcmQsIHNpemUpOworICBDUllQVF9TSEEyNTZVcGRhdGUoJnNoYSwgcGFzc3dvcmQucmF3X3N0cigpLCBwYXNzd29yZC5HZXRMZW5ndGgoKSk7CiAgIENSWVBUX1NIQTI1NlVwZGF0ZSgmc2hhLCBzYWx0LCA4KTsKICAgaWYgKHZlY3RvcikKICAgICBDUllQVF9TSEEyNTZVcGRhdGUoJnNoYSwgdmVjdG9yLCA0OCk7CkBAIC0yNDQsMzUgKzI0MCwzNyBAQAogICB1aW50OF90IGRpZ2VzdFszMl07CiAgIENSWVBUX1NIQTI1NkZpbmlzaCgmc2hhLCBkaWdlc3QpOwogCi0gIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZjsKICAgdWludDhfdCogaW5wdXQgPSBkaWdlc3Q7CiAgIHVpbnQ4X3QqIGtleSA9IGlucHV0OwogICB1aW50OF90KiBpdiA9IGlucHV0ICsgMTY7Ci0gIHVpbnQ4X3QqIEUgPSBidWYuR2V0QnVmZmVyKCk7Ci0gIGludCBpQnVmTGVuID0gYnVmLkdldExlbmd0aCgpOwotICBDRlhfQnl0ZVRleHRCdWYgaW50ZXJEaWdlc3Q7CisgIHVpbnQ4X3QqIEUgPSBudWxscHRyOworICBpbnQgaUJ1ZkxlbiA9IDA7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGludGVyRGlnZXN0OwogICBpbnQgaSA9IDA7CiAgIGludCBpQmxvY2tTaXplID0gMzI7Ci0gIHVpbnQ4X3QqIGFlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIDIwNDgpOworICBDUllQVF9hZXNfY29udGV4dCBhZXM7CisgIG1lbXNldCgmYWVzLCAwLCBzaXplb2YoYWVzKSk7CiAgIHdoaWxlIChpIDwgNjQgfHwgaSA8IEVbaUJ1ZkxlbiAtIDFdICsgMzIpIHsKLSAgICBpbnQgaVJvdW5kU2l6ZSA9IHNpemUgKyBpQmxvY2tTaXplOworICAgIGludCBpUm91bmRTaXplID0gcGFzc3dvcmQuR2V0TGVuZ3RoKCkgKyBpQmxvY2tTaXplOwogICAgIGlmICh2ZWN0b3IpIHsKICAgICAgIGlSb3VuZFNpemUgKz0gNDg7CiAgICAgfQogICAgIGlCdWZMZW4gPSBpUm91bmRTaXplICogNjQ7Ci0gICAgYnVmLkVzdGltYXRlU2l6ZShpQnVmTGVuKTsKLSAgICBFID0gYnVmLkdldEJ1ZmZlcigpOwotICAgIENGWF9CeXRlVGV4dEJ1ZiBjb250ZW50OworICAgIGJ1Zi5yZXNpemUoaUJ1Zkxlbik7CisgICAgRSA9IGJ1Zi5kYXRhKCk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29udGVudDsKICAgICBmb3IgKGludCBqID0gMDsgaiA8IDY0OyArK2opIHsKLSAgICAgIGNvbnRlbnQuQXBwZW5kQmxvY2socGFzc3dvcmQsIHNpemUpOwotICAgICAgY29udGVudC5BcHBlbmRCbG9jayhpbnB1dCwgaUJsb2NrU2l6ZSk7CisgICAgICBjb250ZW50Lmluc2VydChzdGQ6OmVuZChjb250ZW50KSwgcGFzc3dvcmQucmF3X3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQucmF3X3N0cigpICsgcGFzc3dvcmQuR2V0TGVuZ3RoKCkpOworICAgICAgY29udGVudC5pbnNlcnQoc3RkOjplbmQoY29udGVudCksIGlucHV0LCBpbnB1dCArIGlCbG9ja1NpemUpOwogICAgICAgaWYgKHZlY3RvcikgewotICAgICAgICBjb250ZW50LkFwcGVuZEJsb2NrKHZlY3RvciwgNDgpOworICAgICAgICBjb250ZW50Lmluc2VydChzdGQ6OmVuZChjb250ZW50KSwgdmVjdG9yLCB2ZWN0b3IgKyA0OCk7CiAgICAgICB9CiAgICAgfQotICAgIENSWVBUX0FFU1NldEtleShhZXMsIDE2LCBrZXksIDE2LCB0cnVlKTsKLSAgICBDUllQVF9BRVNTZXRJVihhZXMsIGl2KTsKLSAgICBDUllQVF9BRVNFbmNyeXB0KGFlcywgRSwgY29udGVudC5HZXRCdWZmZXIoKSwgaUJ1Zkxlbik7CisgICAgQ1JZUFRfQUVTU2V0S2V5KCZhZXMsIDE2LCBrZXksIDE2LCB0cnVlKTsKKyAgICBDUllQVF9BRVNTZXRJVigmYWVzLCBpdik7CisgICAgQ1JZUFRfQUVTRW5jcnlwdCgmYWVzLCBFLCBjb250ZW50LmRhdGEoKSwgaUJ1Zkxlbik7CiAgICAgaW50IGlIYXNoID0gMDsKICAgICBzd2l0Y2ggKEJpZ09yZGVyNjRCaXRzTW9kMyhFKSkgewogICAgICAgY2FzZSAwOgpAQCAtMjg4LDggKzI4Niw4IEBACiAgICAgICAgIGlCbG9ja1NpemUgPSA2NDsKICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIGludGVyRGlnZXN0LkVzdGltYXRlU2l6ZShpQmxvY2tTaXplKTsKLSAgICBpbnB1dCA9IGludGVyRGlnZXN0LkdldEJ1ZmZlcigpOworICAgIGludGVyRGlnZXN0LnJlc2l6ZShpQmxvY2tTaXplKTsKKyAgICBpbnB1dCA9IGludGVyRGlnZXN0LmRhdGEoKTsKICAgICBpZiAoaUhhc2ggPT0gMCkgewogICAgICAgQ1JZUFRfU0hBMjU2R2VuZXJhdGUoRSwgaUJ1ZkxlbiwgaW5wdXQpOwogICAgIH0gZWxzZSBpZiAoaUhhc2ggPT0gMSkgewpAQCAtMzAxLDg1ICsyOTksODAgQEAKICAgICBpdiA9IGlucHV0ICsgMTY7CiAgICAgKytpOwogICB9Ci0gIEZYX0ZyZWUoYWVzKTsKICAgaWYgKGhhc2gpIHsKLSAgICBGWFNZU19tZW1jcHkoaGFzaCwgaW5wdXQsIDMyKTsKKyAgICBtZW1jcHkoaGFzaCwgaW5wdXQsIDMyKTsKICAgfQogfQogCi1ib29sIENQREZfU2VjdXJpdHlIYW5kbGVyOjpBRVMyNTZfQ2hlY2tQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUsCitib29sIENQREZfU2VjdXJpdHlIYW5kbGVyOjpBRVMyNTZfQ2hlY2tQYXNzd29yZChjb25zdCBCeXRlU3RyaW5nJiBwYXNzd29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk93bmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoga2V5KSB7CiAgIGlmICghbV9wRW5jcnlwdERpY3QpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIENGWF9CeXRlU3RyaW5nIG9rZXkgPSBtX3BFbmNyeXB0RGljdC0+R2V0U3RyaW5nRm9yKCJPIik7CisgIEJ5dGVTdHJpbmcgb2tleSA9IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmdGb3IoIk8iKTsKICAgaWYgKG9rZXkuR2V0TGVuZ3RoKCkgPCA0OCkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgdWtleSA9IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmdGb3IoIlUiKTsKKyAgQnl0ZVN0cmluZyB1a2V5ID0gbV9wRW5jcnlwdERpY3QtPkdldFN0cmluZ0ZvcigiVSIpOwogICBpZiAodWtleS5HZXRMZW5ndGgoKSA8IDQ4KQogICAgIHJldHVybiBmYWxzZTsKIAogICBjb25zdCB1aW50OF90KiBwa2V5ID0gYk93bmVyID8gb2tleS5yYXdfc3RyKCkgOiB1a2V5LnJhd19zdHIoKTsKLSAgQ1JZUFRfc2hhMjU2X2NvbnRleHQgc2hhOworICBDUllQVF9zaGEyX2NvbnRleHQgc2hhOwogICB1aW50OF90IGRpZ2VzdFszMl07CiAgIGlmIChtX1JldmlzaW9uID49IDYpIHsKLSAgICBSZXZpc2lvbjZfSGFzaChwYXNzd29yZCwgc2l6ZSwgKGNvbnN0IHVpbnQ4X3QqKXBrZXkgKyAzMiwKKyAgICBSZXZpc2lvbjZfSGFzaChwYXNzd29yZCwgKGNvbnN0IHVpbnQ4X3QqKXBrZXkgKyAzMiwKICAgICAgICAgICAgICAgICAgICBiT3duZXIgPyB1a2V5LnJhd19zdHIoKSA6IG51bGxwdHIsIGRpZ2VzdCk7CiAgIH0gZWxzZSB7CiAgICAgQ1JZUFRfU0hBMjU2U3RhcnQoJnNoYSk7Ci0gICAgQ1JZUFRfU0hBMjU2VXBkYXRlKCZzaGEsIHBhc3N3b3JkLCBzaXplKTsKKyAgICBDUllQVF9TSEEyNTZVcGRhdGUoJnNoYSwgcGFzc3dvcmQucmF3X3N0cigpLCBwYXNzd29yZC5HZXRMZW5ndGgoKSk7CiAgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKCZzaGEsIHBrZXkgKyAzMiwgOCk7CiAgICAgaWYgKGJPd25lcikKICAgICAgIENSWVBUX1NIQTI1NlVwZGF0ZSgmc2hhLCB1a2V5LnJhd19zdHIoKSwgNDgpOwotCiAgICAgQ1JZUFRfU0hBMjU2RmluaXNoKCZzaGEsIGRpZ2VzdCk7CiAgIH0KLSAgaWYgKEZYU1lTX21lbWNtcChkaWdlc3QsIHBrZXksIDMyKSAhPSAwKQorICBpZiAobWVtY21wKGRpZ2VzdCwgcGtleSwgMzIpICE9IDApCiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIGlmICgha2V5KQogICAgIHJldHVybiB0cnVlOwogCiAgIGlmIChtX1JldmlzaW9uID49IDYpIHsKLSAgICBSZXZpc2lvbjZfSGFzaChwYXNzd29yZCwgc2l6ZSwgKGNvbnN0IHVpbnQ4X3QqKXBrZXkgKyA0MCwKKyAgICBSZXZpc2lvbjZfSGFzaChwYXNzd29yZCwgKGNvbnN0IHVpbnQ4X3QqKXBrZXkgKyA0MCwKICAgICAgICAgICAgICAgICAgICBiT3duZXIgPyB1a2V5LnJhd19zdHIoKSA6IG51bGxwdHIsIGRpZ2VzdCk7CiAgIH0gZWxzZSB7CiAgICAgQ1JZUFRfU0hBMjU2U3RhcnQoJnNoYSk7Ci0gICAgQ1JZUFRfU0hBMjU2VXBkYXRlKCZzaGEsIHBhc3N3b3JkLCBzaXplKTsKKyAgICBDUllQVF9TSEEyNTZVcGRhdGUoJnNoYSwgcGFzc3dvcmQucmF3X3N0cigpLCBwYXNzd29yZC5HZXRMZW5ndGgoKSk7CiAgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKCZzaGEsIHBrZXkgKyA0MCwgOCk7CiAgICAgaWYgKGJPd25lcikKICAgICAgIENSWVBUX1NIQTI1NlVwZGF0ZSgmc2hhLCB1a2V5LnJhd19zdHIoKSwgNDgpOwotCiAgICAgQ1JZUFRfU0hBMjU2RmluaXNoKCZzaGEsIGRpZ2VzdCk7CiAgIH0KLSAgQ0ZYX0J5dGVTdHJpbmcgZWtleSA9IG1fcEVuY3J5cHREaWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtX3BFbmNyeXB0RGljdC0+R2V0U3RyaW5nRm9yKGJPd25lciA/ICJPRSIgOiAiVUUiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ0ZYX0J5dGVTdHJpbmcoKTsKKyAgQnl0ZVN0cmluZyBla2V5ID0gbV9wRW5jcnlwdERpY3QtPkdldFN0cmluZ0ZvcihiT3duZXIgPyAiT0UiIDogIlVFIik7CiAgIGlmIChla2V5LkdldExlbmd0aCgpIDwgMzIpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGFlcygyMDQ4KTsKLSAgQ1JZUFRfQUVTU2V0S2V5KGFlcy5kYXRhKCksIDE2LCBkaWdlc3QsIDMyLCBmYWxzZSk7CisgIENSWVBUX2Flc19jb250ZXh0IGFlczsKKyAgbWVtc2V0KCZhZXMsIDAsIHNpemVvZihhZXMpKTsKKyAgQ1JZUFRfQUVTU2V0S2V5KCZhZXMsIDE2LCBkaWdlc3QsIDMyLCBmYWxzZSk7CiAgIHVpbnQ4X3QgaXZbMTZdOwotICBGWFNZU19tZW1zZXQoaXYsIDAsIDE2KTsKLSAgQ1JZUFRfQUVTU2V0SVYoYWVzLmRhdGEoKSwgaXYpOwotICBDUllQVF9BRVNEZWNyeXB0KGFlcy5kYXRhKCksIGtleSwgZWtleS5yYXdfc3RyKCksIDMyKTsKLSAgQ1JZUFRfQUVTU2V0S2V5KGFlcy5kYXRhKCksIDE2LCBrZXksIDMyLCBmYWxzZSk7Ci0gIENSWVBUX0FFU1NldElWKGFlcy5kYXRhKCksIGl2KTsKLSAgQ0ZYX0J5dGVTdHJpbmcgcGVybXMgPSBtX3BFbmNyeXB0RGljdC0+R2V0U3RyaW5nRm9yKCJQZXJtcyIpOworICBtZW1zZXQoaXYsIDAsIDE2KTsKKyAgQ1JZUFRfQUVTU2V0SVYoJmFlcywgaXYpOworICBDUllQVF9BRVNEZWNyeXB0KCZhZXMsIGtleSwgZWtleS5yYXdfc3RyKCksIDMyKTsKKyAgQ1JZUFRfQUVTU2V0S2V5KCZhZXMsIDE2LCBrZXksIDMyLCBmYWxzZSk7CisgIENSWVBUX0FFU1NldElWKCZhZXMsIGl2KTsKKyAgQnl0ZVN0cmluZyBwZXJtcyA9IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmdGb3IoIlBlcm1zIik7CiAgIGlmIChwZXJtcy5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIHVpbnQ4X3QgcGVybXNfYnVmWzE2XTsKLSAgRlhTWVNfbWVtc2V0KHBlcm1zX2J1ZiwgMCwgc2l6ZW9mKHBlcm1zX2J1ZikpOworICBtZW1zZXQocGVybXNfYnVmLCAwLCBzaXplb2YocGVybXNfYnVmKSk7CiAgIHNpemVfdCBjb3B5X2xlbiA9CiAgICAgICBzdGQ6Om1pbihzaXplb2YocGVybXNfYnVmKSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihwZXJtcy5HZXRMZW5ndGgoKSkpOwotICBGWFNZU19tZW1jcHkocGVybXNfYnVmLCBwZXJtcy5yYXdfc3RyKCksIGNvcHlfbGVuKTsKKyAgbWVtY3B5KHBlcm1zX2J1ZiwgcGVybXMucmF3X3N0cigpLCBjb3B5X2xlbik7CiAgIHVpbnQ4X3QgYnVmWzE2XTsKLSAgQ1JZUFRfQUVTRGVjcnlwdChhZXMuZGF0YSgpLCBidWYsIHBlcm1zX2J1ZiwgMTYpOworICBDUllQVF9BRVNEZWNyeXB0KCZhZXMsIGJ1ZiwgcGVybXNfYnVmLCAxNik7CiAgIGlmIChidWZbOV0gIT0gJ2EnIHx8IGJ1ZlsxMF0gIT0gJ2QnIHx8IGJ1ZlsxMV0gIT0gJ2InKQogICAgIHJldHVybiBmYWxzZTsKIApAQCAtMzkzLDM5ICszODYsMzkgQEAKICAgcmV0dXJuIGJ1Zls4XSA9PSAnRicgfHwgSXNNZXRhZGF0YUVuY3J5cHRlZCgpOwogfQogCi1ib29sIENQREZfU2VjdXJpdHlIYW5kbGVyOjpDaGVja1Bhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplLAorYm9vbCBDUERGX1NlY3VyaXR5SGFuZGxlcjo6Q2hlY2tQYXNzd29yZChjb25zdCBCeXRlU3RyaW5nJiBwYXNzd29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiT3duZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBrZXlfbGVuKSB7CiAgIGlmIChtX1JldmlzaW9uID49IDUpCi0gICAgcmV0dXJuIEFFUzI1Nl9DaGVja1Bhc3N3b3JkKHBhc3N3b3JkLCBzaXplLCBiT3duZXIsIGtleSk7CisgICAgcmV0dXJuIEFFUzI1Nl9DaGVja1Bhc3N3b3JkKHBhc3N3b3JkLCBiT3duZXIsIGtleSk7CiAKICAgdWludDhfdCBrZXlidWZbMzJdOwogICBpZiAoIWtleSkKICAgICBrZXkgPSBrZXlidWY7CiAKICAgaWYgKGJPd25lcikKLSAgICByZXR1cm4gQ2hlY2tPd25lclBhc3N3b3JkKHBhc3N3b3JkLCBzaXplLCBrZXksIGtleV9sZW4pOworICAgIHJldHVybiBDaGVja093bmVyUGFzc3dvcmQocGFzc3dvcmQsIGtleSwga2V5X2xlbik7CiAKLSAgcmV0dXJuIENoZWNrVXNlclBhc3N3b3JkKHBhc3N3b3JkLCBzaXplLCBmYWxzZSwga2V5LCBrZXlfbGVuKSB8fAotICAgICAgICAgQ2hlY2tVc2VyUGFzc3dvcmQocGFzc3dvcmQsIHNpemUsIHRydWUsIGtleSwga2V5X2xlbik7CisgIHJldHVybiBDaGVja1VzZXJQYXNzd29yZChwYXNzd29yZCwgZmFsc2UsIGtleSwga2V5X2xlbikgfHwKKyAgICAgICAgIENoZWNrVXNlclBhc3N3b3JkKHBhc3N3b3JkLCB0cnVlLCBrZXksIGtleV9sZW4pOwogfQotYm9vbCBDUERGX1NlY3VyaXR5SGFuZGxlcjo6Q2hlY2tVc2VyUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXNzX3NpemUsCisKK2Jvb2wgQ1BERl9TZWN1cml0eUhhbmRsZXI6OkNoZWNrVXNlclBhc3N3b3JkKGNvbnN0IEJ5dGVTdHJpbmcmIHBhc3N3b3JkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSWdub3JlRW5jcnlwdE1ldGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGtleV9sZW4pIHsKLSAgQ2FsY0VuY3J5cHRLZXkobV9wRW5jcnlwdERpY3QsIHBhc3N3b3JkLCBwYXNzX3NpemUsIGtleSwga2V5X2xlbiwKLSAgICAgICAgICAgICAgICAgYklnbm9yZUVuY3J5cHRNZXRhLCBtX3BQYXJzZXItPkdldElEQXJyYXkoKSk7Ci0gIENGWF9CeXRlU3RyaW5nIHVrZXkgPQotICAgICAgbV9wRW5jcnlwdERpY3QgPyBtX3BFbmNyeXB0RGljdC0+R2V0U3RyaW5nRm9yKCJVIikgOiBDRlhfQnl0ZVN0cmluZygpOworICBDYWxjRW5jcnlwdEtleShtX3BFbmNyeXB0RGljdC5HZXQoKSwgcGFzc3dvcmQsIGtleSwga2V5X2xlbiwKKyAgICAgICAgICAgICAgICAgYklnbm9yZUVuY3J5cHRNZXRhLCBtX0ZpbGVJZCk7CisgIEJ5dGVTdHJpbmcgdWtleSA9CisgICAgICBtX3BFbmNyeXB0RGljdCA/IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmdGb3IoIlUiKSA6IEJ5dGVTdHJpbmcoKTsKICAgaWYgKHVrZXkuR2V0TGVuZ3RoKCkgPCAxNikgewogICAgIHJldHVybiBmYWxzZTsKICAgfQorCiAgIHVpbnQ4X3QgdWtleWJ1ZlszMl07CiAgIGlmIChtX1JldmlzaW9uID09IDIpIHsKLSAgICBGWFNZU19tZW1jcHkodWtleWJ1ZiwgZGVmcGFzc2NvZGUsIDMyKTsKKyAgICBtZW1jcHkodWtleWJ1ZiwgZGVmcGFzc2NvZGUsIDMyKTsKICAgICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayh1a2V5YnVmLCAzMiwga2V5LCBrZXlfbGVuKTsKICAgfSBlbHNlIHsKICAgICB1aW50OF90IHRlc3RbMzJdLCB0bXBrZXlbMzJdOwpAQCAtNDMzLDkgKzQyNiw5IEBACiAgICAgaWYgKGNvcHlfbGVuID4gKHVpbnQzMl90KXVrZXkuR2V0TGVuZ3RoKCkpIHsKICAgICAgIGNvcHlfbGVuID0gdWtleS5HZXRMZW5ndGgoKTsKICAgICB9Ci0gICAgRlhTWVNfbWVtc2V0KHRlc3QsIDAsIHNpemVvZih0ZXN0KSk7Ci0gICAgRlhTWVNfbWVtc2V0KHRtcGtleSwgMCwgc2l6ZW9mKHRtcGtleSkpOwotICAgIEZYU1lTX21lbWNweSh0ZXN0LCB1a2V5LmNfc3RyKCksIGNvcHlfbGVuKTsKKyAgICBtZW1zZXQodGVzdCwgMCwgc2l6ZW9mKHRlc3QpKTsKKyAgICBtZW1zZXQodG1wa2V5LCAwLCBzaXplb2YodG1wa2V5KSk7CisgICAgbWVtY3B5KHRlc3QsIHVrZXkuY19zdHIoKSwgY29weV9sZW4pOwogICAgIGZvciAoaW50MzJfdCBpID0gMTk7IGkgPj0gMDsgaS0tKSB7CiAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGtleV9sZW47IGorKykKICAgICAgICAgdG1wa2V5W2pdID0ga2V5W2pdIF4gc3RhdGljX2Nhc3Q8dWludDhfdD4oaSk7CkBAIC00NDQsMjYgKzQzNywyNCBAQAogICAgIENSWVBUX21kNV9jb250ZXh0IG1kNTsKICAgICBDUllQVF9NRDVTdGFydCgmbWQ1KTsKICAgICBDUllQVF9NRDVVcGRhdGUoJm1kNSwgZGVmcGFzc2NvZGUsIDMyKTsKLSAgICBDUERGX0FycmF5KiBwSWRBcnJheSA9IG1fcFBhcnNlci0+R2V0SURBcnJheSgpOwotICAgIGlmIChwSWRBcnJheSkgewotICAgICAgQ0ZYX0J5dGVTdHJpbmcgaWQgPSBwSWRBcnJheS0+R2V0U3RyaW5nQXQoMCk7Ci0gICAgICBDUllQVF9NRDVVcGRhdGUoJm1kNSwgKHVpbnQ4X3QqKWlkLmNfc3RyKCksIGlkLkdldExlbmd0aCgpKTsKKyAgICBpZiAoIW1fRmlsZUlkLklzRW1wdHkoKSkgeworICAgICAgQ1JZUFRfTUQ1VXBkYXRlKCZtZDUsICh1aW50OF90KiltX0ZpbGVJZC5jX3N0cigpLCBtX0ZpbGVJZC5HZXRMZW5ndGgoKSk7CiAgICAgfQogICAgIENSWVBUX01ENUZpbmlzaCgmbWQ1LCB1a2V5YnVmKTsKLSAgICByZXR1cm4gRlhTWVNfbWVtY21wKHRlc3QsIHVrZXlidWYsIDE2KSA9PSAwOworICAgIHJldHVybiBtZW1jbXAodGVzdCwgdWtleWJ1ZiwgMTYpID09IDA7CiAgIH0KLSAgaWYgKEZYU1lTX21lbWNtcCgodm9pZCopdWtleS5jX3N0cigpLCB1a2V5YnVmLCAxNikgPT0gMCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIG1lbWNtcCh1a2V5LmNfc3RyKCksIHVrZXlidWYsIDE2KSA9PSAwOwogfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TZWN1cml0eUhhbmRsZXI6OkdldFVzZXJQYXNzd29yZChjb25zdCB1aW50OF90KiBvd25lcl9wYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXNzX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qga2V5X2xlbikgewotICBDRlhfQnl0ZVN0cmluZyBva2V5ID0gbV9wRW5jcnlwdERpY3QtPkdldFN0cmluZ0ZvcigiTyIpOworCitCeXRlU3RyaW5nIENQREZfU2VjdXJpdHlIYW5kbGVyOjpHZXRVc2VyUGFzc3dvcmQoCisgICAgY29uc3QgQnl0ZVN0cmluZyYgb3duZXJfcGFzc3dvcmQsCisgICAgaW50MzJfdCBrZXlfbGVuKSBjb25zdCB7CisgIEJ5dGVTdHJpbmcgb2tleSA9IG1fcEVuY3J5cHREaWN0LT5HZXRTdHJpbmdGb3IoIk8iKTsKICAgdWludDhfdCBwYXNzY29kZVszMl07CiAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAzMjsgaSsrKSB7Ci0gICAgcGFzc2NvZGVbaV0gPSBpIDwgcGFzc19zaXplID8gb3duZXJfcGFzc1tpXSA6IGRlZnBhc3Njb2RlW2kgLSBwYXNzX3NpemVdOworICAgIHBhc3Njb2RlW2ldID0gaSA8IG93bmVyX3Bhc3N3b3JkLkdldExlbmd0aCgpCisgICAgICAgICAgICAgICAgICAgICAgPyBvd25lcl9wYXNzd29yZFtpXQorICAgICAgICAgICAgICAgICAgICAgIDogZGVmcGFzc2NvZGVbaSAtIG93bmVyX3Bhc3N3b3JkLkdldExlbmd0aCgpXTsKICAgfQogICB1aW50OF90IGRpZ2VzdFsxNl07CiAgIENSWVBUX01ENUdlbmVyYXRlKHBhc3Njb2RlLCAzMiwgZGlnZXN0KTsKQEAgLTQ3MywyNSArNDY0LDI1IEBACiAgICAgfQogICB9CiAgIHVpbnQ4X3QgZW5ja2V5WzMyXTsKLSAgRlhTWVNfbWVtc2V0KGVuY2tleSwgMCwgc2l6ZW9mKGVuY2tleSkpOworICBtZW1zZXQoZW5ja2V5LCAwLCBzaXplb2YoZW5ja2V5KSk7CiAgIHVpbnQzMl90IGNvcHlfbGVuID0ga2V5X2xlbjsKICAgaWYgKGNvcHlfbGVuID4gc2l6ZW9mKGRpZ2VzdCkpIHsKICAgICBjb3B5X2xlbiA9IHNpemVvZihkaWdlc3QpOwogICB9Ci0gIEZYU1lTX21lbWNweShlbmNrZXksIGRpZ2VzdCwgY29weV9sZW4pOworICBtZW1jcHkoZW5ja2V5LCBkaWdlc3QsIGNvcHlfbGVuKTsKICAgaW50IG9rZXlsZW4gPSBva2V5LkdldExlbmd0aCgpOwogICBpZiAob2tleWxlbiA+IDMyKSB7CiAgICAgb2tleWxlbiA9IDMyOwogICB9CiAgIHVpbnQ4X3Qgb2tleWJ1Zls2NF07Ci0gIEZYU1lTX21lbXNldChva2V5YnVmLCAwLCBzaXplb2Yob2tleWJ1ZikpOwotICBGWFNZU19tZW1jcHkob2tleWJ1Ziwgb2tleS5jX3N0cigpLCBva2V5bGVuKTsKKyAgbWVtc2V0KG9rZXlidWYsIDAsIHNpemVvZihva2V5YnVmKSk7CisgIG1lbWNweShva2V5YnVmLCBva2V5LmNfc3RyKCksIG9rZXlsZW4pOwogICBpZiAobV9SZXZpc2lvbiA9PSAyKSB7CiAgICAgQ1JZUFRfQXJjRm91ckNyeXB0QmxvY2sob2tleWJ1Ziwgb2tleWxlbiwgZW5ja2V5LCBrZXlfbGVuKTsKICAgfSBlbHNlIHsKICAgICBmb3IgKGludDMyX3QgaSA9IDE5OyBpID49IDA7IGktLSkgewogICAgICAgdWludDhfdCB0ZW1wa2V5WzMyXTsKLSAgICAgIEZYU1lTX21lbXNldCh0ZW1wa2V5LCAwLCBzaXplb2YodGVtcGtleSkpOworICAgICAgbWVtc2V0KHRlbXBrZXksIDAsIHNpemVvZih0ZW1wa2V5KSk7CiAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IG1fS2V5TGVuOyBqKyspCiAgICAgICAgIHRlbXBrZXlbal0gPSBlbmNrZXlbal0gXiBzdGF0aWNfY2FzdDx1aW50OF90PihpKTsKICAgICAgIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKG9rZXlidWYsIG9rZXlsZW4sIHRlbXBrZXksIGtleV9sZW4pOwpAQCAtNTAxLDUzICs0OTIsNDkgQEAKICAgd2hpbGUgKGxlbiAmJiBkZWZwYXNzY29kZVtsZW4gLSAxXSA9PSBva2V5YnVmW2xlbiAtIDFdKSB7CiAgICAgbGVuLS07CiAgIH0KLSAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKG9rZXlidWYsIGxlbik7CisgIHJldHVybiBCeXRlU3RyaW5nKG9rZXlidWYsIGxlbik7CiB9Ci1ib29sIENQREZfU2VjdXJpdHlIYW5kbGVyOjpDaGVja093bmVyUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFzc19zaXplLAorCitib29sIENQREZfU2VjdXJpdHlIYW5kbGVyOjpDaGVja093bmVyUGFzc3dvcmQoY29uc3QgQnl0ZVN0cmluZyYgcGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qga2V5X2xlbikgewotICBDRlhfQnl0ZVN0cmluZyB1c2VyX3Bhc3MgPSBHZXRVc2VyUGFzc3dvcmQocGFzc3dvcmQsIHBhc3Nfc2l6ZSwga2V5X2xlbik7Ci0gIGlmIChDaGVja1VzZXJQYXNzd29yZCh1c2VyX3Bhc3MucmF3X3N0cigpLCB1c2VyX3Bhc3MuR2V0TGVuZ3RoKCksIGZhbHNlLCBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICBrZXlfbGVuKSkgeworICBCeXRlU3RyaW5nIHVzZXJfcGFzcyA9IEdldFVzZXJQYXNzd29yZChwYXNzd29yZCwga2V5X2xlbik7CisgIGlmIChDaGVja1VzZXJQYXNzd29yZCh1c2VyX3Bhc3MsIGZhbHNlLCBrZXksIGtleV9sZW4pKQogICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBDaGVja1VzZXJQYXNzd29yZCh1c2VyX3Bhc3MucmF3X3N0cigpLCB1c2VyX3Bhc3MuR2V0TGVuZ3RoKCksIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksIGtleV9sZW4pOworICByZXR1cm4gQ2hlY2tVc2VyUGFzc3dvcmQodXNlcl9wYXNzLCB0cnVlLCBrZXksIGtleV9sZW4pOwogfQogCiBib29sIENQREZfU2VjdXJpdHlIYW5kbGVyOjpJc01ldGFkYXRhRW5jcnlwdGVkKCkgY29uc3QgewogICByZXR1cm4gbV9wRW5jcnlwdERpY3QtPkdldEJvb2xlYW5Gb3IoIkVuY3J5cHRNZXRhZGF0YSIsIHRydWUpOwogfQogCi12b2lkIENQREZfU2VjdXJpdHlIYW5kbGVyOjpPbkNyZWF0ZShDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQXJyYXkqIHBJZEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdXNlcl9wYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdXNlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogb3duZXJfcGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG93bmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJEZWZhdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHlwZSkgewotICBpbnQgY2lwaGVyID0gMCwga2V5X2xlbiA9IDA7Ci0gIGlmICghTG9hZERpY3QocEVuY3J5cHREaWN0LCB0eXBlLCBjaXBoZXIsIGtleV9sZW4pKSB7Cit2b2lkIENQREZfU2VjdXJpdHlIYW5kbGVyOjpPbkNyZWF0ZUludGVybmFsKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0FycmF5KiBwSWRBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgdXNlcl9wYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgb3duZXJfcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkRlZmF1bHQpIHsKKyAgQVNTRVJUKHBFbmNyeXB0RGljdCk7CisKKyAgaW50IGNpcGhlciA9IDA7CisgIGludCBrZXlfbGVuID0gMDsKKyAgaWYgKCFMb2FkRGljdChwRW5jcnlwdERpY3QsIGNpcGhlciwga2V5X2xlbikpIHsKICAgICByZXR1cm47CiAgIH0KLSAgaWYgKGJEZWZhdWx0ICYmICghb3duZXJfcGFzcyB8fCBvd25lcl9zaXplID09IDApKSB7Ci0gICAgb3duZXJfcGFzcyA9IHVzZXJfcGFzczsKLSAgICBvd25lcl9zaXplID0gdXNlcl9zaXplOwotICB9CisgIEJ5dGVTdHJpbmcgb3duZXJfcGFzc3dvcmRfY29weSA9IG93bmVyX3Bhc3N3b3JkOworICBpZiAoYkRlZmF1bHQgJiYgb3duZXJfcGFzc3dvcmQuSXNFbXB0eSgpKQorICAgIG93bmVyX3Bhc3N3b3JkX2NvcHkgPSB1c2VyX3Bhc3N3b3JkOworCiAgIGlmIChtX1JldmlzaW9uID49IDUpIHsKICAgICBpbnQgdCA9IChpbnQpdGltZShudWxscHRyKTsKLSAgICBDUllQVF9zaGEyNTZfY29udGV4dCBzaGE7CisgICAgQ1JZUFRfc2hhMl9jb250ZXh0IHNoYTsKICAgICBDUllQVF9TSEEyNTZTdGFydCgmc2hhKTsKICAgICBDUllQVF9TSEEyNTZVcGRhdGUoJnNoYSwgKHVpbnQ4X3QqKSZ0LCBzaXplb2YgdCk7CiAgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKCZzaGEsIG1fRW5jcnlwdEtleSwgMzIpOwogICAgIENSWVBUX1NIQTI1NlVwZGF0ZSgmc2hhLCAodWludDhfdCopInRoZXJlIiwgNSk7CiAgICAgQ1JZUFRfU0hBMjU2RmluaXNoKCZzaGEsIG1fRW5jcnlwdEtleSk7Ci0gICAgQUVTMjU2X1NldFBhc3N3b3JkKHBFbmNyeXB0RGljdCwgdXNlcl9wYXNzLCB1c2VyX3NpemUsIGZhbHNlLCBtX0VuY3J5cHRLZXkpOworICAgIEFFUzI1Nl9TZXRQYXNzd29yZChwRW5jcnlwdERpY3QsIHVzZXJfcGFzc3dvcmQsIGZhbHNlLCBtX0VuY3J5cHRLZXkpOwogICAgIGlmIChiRGVmYXVsdCkgewotICAgICAgQUVTMjU2X1NldFBhc3N3b3JkKHBFbmNyeXB0RGljdCwgb3duZXJfcGFzcywgb3duZXJfc2l6ZSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtX0VuY3J5cHRLZXkpOworICAgICAgQUVTMjU2X1NldFBhc3N3b3JkKHBFbmNyeXB0RGljdCwgb3duZXJfcGFzc3dvcmRfY29weSwgdHJ1ZSwgbV9FbmNyeXB0S2V5KTsKICAgICAgIEFFUzI1Nl9TZXRQZXJtcyhwRW5jcnlwdERpY3QsIG1fUGVybWlzc2lvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgcEVuY3J5cHREaWN0LT5HZXRCb29sZWFuRm9yKCJFbmNyeXB0TWV0YWRhdGEiLCB0cnVlKSwKICAgICAgICAgICAgICAgICAgICAgICBtX0VuY3J5cHRLZXkpOwpAQCAtNTU3LDggKzU0NCw5IEBACiAgIGlmIChiRGVmYXVsdCkgewogICAgIHVpbnQ4X3QgcGFzc2NvZGVbMzJdOwogICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAzMjsgaSsrKSB7Ci0gICAgICBwYXNzY29kZVtpXSA9Ci0gICAgICAgICAgaSA8IG93bmVyX3NpemUgPyBvd25lcl9wYXNzW2ldIDogZGVmcGFzc2NvZGVbaSAtIG93bmVyX3NpemVdOworICAgICAgcGFzc2NvZGVbaV0gPSBpIDwgb3duZXJfcGFzc3dvcmRfY29weS5HZXRMZW5ndGgoKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBvd25lcl9wYXNzd29yZF9jb3B5W2ldCisgICAgICAgICAgICAgICAgICAgICAgICA6IGRlZnBhc3Njb2RlW2kgLSBvd25lcl9wYXNzd29yZF9jb3B5LkdldExlbmd0aCgpXTsKICAgICB9CiAgICAgdWludDhfdCBkaWdlc3RbMTZdOwogICAgIENSWVBUX01ENUdlbmVyYXRlKHBhc3Njb2RlLCAzMiwgZGlnZXN0KTsKQEAgLTU2Nyw5ICs1NTUsMTEgQEAKICAgICAgICAgQ1JZUFRfTUQ1R2VuZXJhdGUoZGlnZXN0LCAxNiwgZGlnZXN0KTsKICAgICB9CiAgICAgdWludDhfdCBlbmNrZXlbMzJdOwotICAgIEZYU1lTX21lbWNweShlbmNrZXksIGRpZ2VzdCwga2V5X2xlbik7CisgICAgbWVtY3B5KGVuY2tleSwgZGlnZXN0LCBrZXlfbGVuKTsKICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgMzI7IGkrKykgewotICAgICAgcGFzc2NvZGVbaV0gPSBpIDwgdXNlcl9zaXplID8gdXNlcl9wYXNzW2ldIDogZGVmcGFzc2NvZGVbaSAtIHVzZXJfc2l6ZV07CisgICAgICBwYXNzY29kZVtpXSA9IGkgPCB1c2VyX3Bhc3N3b3JkLkdldExlbmd0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICA/IHVzZXJfcGFzc3dvcmRbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgIDogZGVmcGFzc2NvZGVbaSAtIHVzZXJfcGFzc3dvcmQuR2V0TGVuZ3RoKCldOwogICAgIH0KICAgICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhwYXNzY29kZSwgMzIsIGVuY2tleSwga2V5X2xlbik7CiAgICAgdWludDhfdCB0ZW1wa2V5WzMyXTsKQEAgLTU4MCwyNCArNTcwLDI3IEBACiAgICAgICAgIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKHBhc3Njb2RlLCAzMiwgdGVtcGtleSwga2V5X2xlbik7CiAgICAgICB9CiAgICAgfQotICAgIHBFbmNyeXB0RGljdC0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigiTyIsIENGWF9CeXRlU3RyaW5nKHBhc3Njb2RlLCAzMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICBwRW5jcnlwdERpY3QtPlNldE5ld0ZvcjxDUERGX1N0cmluZz4oIk8iLCBCeXRlU3RyaW5nKHBhc3Njb2RlLCAzMiksIGZhbHNlKTsKICAgfQotICBDYWxjRW5jcnlwdEtleShtX3BFbmNyeXB0RGljdCwgKHVpbnQ4X3QqKXVzZXJfcGFzcywgdXNlcl9zaXplLCBtX0VuY3J5cHRLZXksCi0gICAgICAgICAgICAgICAgIGtleV9sZW4sIGZhbHNlLCBwSWRBcnJheSk7CisKKyAgQnl0ZVN0cmluZyBmaWxlSWQ7CisgIGlmIChwSWRBcnJheSkgeworICAgIGZpbGVJZCA9IHBJZEFycmF5LT5HZXRTdHJpbmdBdCgwKTsKKyAgfQorCisgIENhbGNFbmNyeXB0S2V5KG1fcEVuY3J5cHREaWN0LkdldCgpLCB1c2VyX3Bhc3N3b3JkLCBtX0VuY3J5cHRLZXksIGtleV9sZW4sCisgICAgICAgICAgICAgICAgIGZhbHNlLCBmaWxlSWQpOwogICBpZiAobV9SZXZpc2lvbiA8IDMpIHsKICAgICB1aW50OF90IHRlbXBidWZbMzJdOwotICAgIEZYU1lTX21lbWNweSh0ZW1wYnVmLCBkZWZwYXNzY29kZSwgMzIpOworICAgIG1lbWNweSh0ZW1wYnVmLCBkZWZwYXNzY29kZSwgMzIpOwogICAgIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKHRlbXBidWYsIDMyLCBtX0VuY3J5cHRLZXksIGtleV9sZW4pOwotICAgIHBFbmNyeXB0RGljdC0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigiVSIsIENGWF9CeXRlU3RyaW5nKHRlbXBidWYsIDMyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIHBFbmNyeXB0RGljdC0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigiVSIsIEJ5dGVTdHJpbmcodGVtcGJ1ZiwgMzIpLCBmYWxzZSk7CiAgIH0gZWxzZSB7CiAgICAgQ1JZUFRfbWQ1X2NvbnRleHQgbWQ1OwogICAgIENSWVBUX01ENVN0YXJ0KCZtZDUpOwogICAgIENSWVBUX01ENVVwZGF0ZSgmbWQ1LCBkZWZwYXNzY29kZSwgMzIpOwotICAgIGlmIChwSWRBcnJheSkgewotICAgICAgQ0ZYX0J5dGVTdHJpbmcgaWQgPSBwSWRBcnJheS0+R2V0U3RyaW5nQXQoMCk7Ci0gICAgICBDUllQVF9NRDVVcGRhdGUoJm1kNSwgKHVpbnQ4X3QqKWlkLmNfc3RyKCksIGlkLkdldExlbmd0aCgpKTsKKyAgICBpZiAoIWZpbGVJZC5Jc0VtcHR5KCkpIHsKKyAgICAgIENSWVBUX01ENVVwZGF0ZSgmbWQ1LCAodWludDhfdCopZmlsZUlkLmNfc3RyKCksIGZpbGVJZC5HZXRMZW5ndGgoKSk7CiAgICAgfQogICAgIHVpbnQ4X3QgZGlnZXN0WzMyXTsKICAgICBDUllQVF9NRDVGaW5pc2goJm1kNSwgZGlnZXN0KTsKQEAgLTYxMCwzMSArNjAzLDI3IEBACiAgICAgICBDUllQVF9BcmNGb3VyQ3J5cHRCbG9jayhkaWdlc3QsIDE2LCB0ZW1wa2V5LCBrZXlfbGVuKTsKICAgICB9CiAgICAgQ1JZUFRfTUQ1R2VuZXJhdGUoZGlnZXN0LCAxNiwgZGlnZXN0ICsgMTYpOwotICAgIHBFbmNyeXB0RGljdC0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigiVSIsIENGWF9CeXRlU3RyaW5nKGRpZ2VzdCwgMzIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgcEVuY3J5cHREaWN0LT5TZXROZXdGb3I8Q1BERl9TdHJpbmc+KCJVIiwgQnl0ZVN0cmluZyhkaWdlc3QsIDMyKSwgZmFsc2UpOwogICB9CiB9CisKIHZvaWQgQ1BERl9TZWN1cml0eUhhbmRsZXI6Ok9uQ3JlYXRlKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcElkQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1c2VyX3Bhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB1c2VyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBvd25lcl9wYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb3duZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHR5cGUpIHsKLSAgT25DcmVhdGUocEVuY3J5cHREaWN0LCBwSWRBcnJheSwgdXNlcl9wYXNzLCB1c2VyX3NpemUsIG93bmVyX3Bhc3MsIG93bmVyX3NpemUsCi0gICAgICAgICAgIHRydWUsIHR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9BcnJheSogcElkQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiB1c2VyX3Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgb3duZXJfcGFzc3dvcmQpIHsKKyAgT25DcmVhdGVJbnRlcm5hbChwRW5jcnlwdERpY3QsIHBJZEFycmF5LCB1c2VyX3Bhc3N3b3JkLCBvd25lcl9wYXNzd29yZCwgdHJ1ZSk7CisgIEluaXRDcnlwdG9IYW5kbGVyKCk7CiB9CisKIHZvaWQgQ1BERl9TZWN1cml0eUhhbmRsZXI6Ok9uQ3JlYXRlKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcElkQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1c2VyX3Bhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB1c2VyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0eXBlKSB7Ci0gIE9uQ3JlYXRlKHBFbmNyeXB0RGljdCwgcElkQXJyYXksIHVzZXJfcGFzcywgdXNlcl9zaXplLCBudWxscHRyLCAwLCBmYWxzZSwKLSAgICAgICAgICAgdHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0FycmF5KiBwSWRBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIHVzZXJfcGFzc3dvcmQpIHsKKyAgT25DcmVhdGVJbnRlcm5hbChwRW5jcnlwdERpY3QsIHBJZEFycmF5LCB1c2VyX3Bhc3N3b3JkLCBCeXRlU3RyaW5nKCksIGZhbHNlKTsKKyAgSW5pdENyeXB0b0hhbmRsZXIoKTsKIH0KKwogdm9pZCBDUERGX1NlY3VyaXR5SGFuZGxlcjo6QUVTMjU2X1NldFBhc3N3b3JkKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgcGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiT3duZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCoga2V5KSB7CiAgIENSWVBUX3NoYTFfY29udGV4dCBzaGE7CkBAIC02NDUsNDUgKzYzNCw0NSBAQAogICB1aW50OF90IGRpZ2VzdFsyMF07CiAgIENSWVBUX1NIQTFGaW5pc2goJnNoYSwgZGlnZXN0KTsKIAotICBDRlhfQnl0ZVN0cmluZyB1a2V5ID0gcEVuY3J5cHREaWN0LT5HZXRTdHJpbmdGb3IoIlUiKTsKLSAgQ1JZUFRfc2hhMjU2X2NvbnRleHQgc2hhMjsKKyAgQnl0ZVN0cmluZyB1a2V5ID0gcEVuY3J5cHREaWN0LT5HZXRTdHJpbmdGb3IoIlUiKTsKKyAgQ1JZUFRfc2hhMl9jb250ZXh0IHNoYTI7CiAgIHVpbnQ4X3QgZGlnZXN0MVs0OF07CiAgIGlmIChtX1JldmlzaW9uID49IDYpIHsKLSAgICBSZXZpc2lvbjZfSGFzaChwYXNzd29yZCwgc2l6ZSwgZGlnZXN0LCBiT3duZXIgPyB1a2V5LnJhd19zdHIoKSA6IG51bGxwdHIsCisgICAgUmV2aXNpb242X0hhc2gocGFzc3dvcmQsIGRpZ2VzdCwgYk93bmVyID8gdWtleS5yYXdfc3RyKCkgOiBudWxscHRyLAogICAgICAgICAgICAgICAgICAgIGRpZ2VzdDEpOwogICB9IGVsc2UgewogICAgIENSWVBUX1NIQTI1NlN0YXJ0KCZzaGEyKTsKLSAgICBDUllQVF9TSEEyNTZVcGRhdGUoJnNoYTIsIHBhc3N3b3JkLCBzaXplKTsKKyAgICBDUllQVF9TSEEyNTZVcGRhdGUoJnNoYTIsIHBhc3N3b3JkLnJhd19zdHIoKSwgcGFzc3dvcmQuR2V0TGVuZ3RoKCkpOwogICAgIENSWVBUX1NIQTI1NlVwZGF0ZSgmc2hhMiwgZGlnZXN0LCA4KTsKICAgICBpZiAoYk93bmVyKSB7CiAgICAgICBDUllQVF9TSEEyNTZVcGRhdGUoJnNoYTIsIHVrZXkucmF3X3N0cigpLCB1a2V5LkdldExlbmd0aCgpKTsKICAgICB9CiAgICAgQ1JZUFRfU0hBMjU2RmluaXNoKCZzaGEyLCBkaWdlc3QxKTsKICAgfQotICBGWFNZU19tZW1jcHkoZGlnZXN0MSArIDMyLCBkaWdlc3QsIDE2KTsKKyAgbWVtY3B5KGRpZ2VzdDEgKyAzMiwgZGlnZXN0LCAxNik7CiAgIHBFbmNyeXB0RGljdC0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPihiT3duZXIgPyAiTyIgOiAiVSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyhkaWdlc3QxLCA0OCksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHJpbmcoZGlnZXN0MSwgNDgpLCBmYWxzZSk7CiAgIGlmIChtX1JldmlzaW9uID49IDYpIHsKLSAgICBSZXZpc2lvbjZfSGFzaChwYXNzd29yZCwgc2l6ZSwgZGlnZXN0ICsgOCwKLSAgICAgICAgICAgICAgICAgICBiT3duZXIgPyB1a2V5LnJhd19zdHIoKSA6IG51bGxwdHIsIGRpZ2VzdDEpOworICAgIFJldmlzaW9uNl9IYXNoKHBhc3N3b3JkLCBkaWdlc3QgKyA4LCBiT3duZXIgPyB1a2V5LnJhd19zdHIoKSA6IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgZGlnZXN0MSk7CiAgIH0gZWxzZSB7CiAgICAgQ1JZUFRfU0hBMjU2U3RhcnQoJnNoYTIpOwotICAgIENSWVBUX1NIQTI1NlVwZGF0ZSgmc2hhMiwgcGFzc3dvcmQsIHNpemUpOworICAgIENSWVBUX1NIQTI1NlVwZGF0ZSgmc2hhMiwgcGFzc3dvcmQucmF3X3N0cigpLCBwYXNzd29yZC5HZXRMZW5ndGgoKSk7CiAgICAgQ1JZUFRfU0hBMjU2VXBkYXRlKCZzaGEyLCBkaWdlc3QgKyA4LCA4KTsKICAgICBpZiAoYk93bmVyKSB7CiAgICAgICBDUllQVF9TSEEyNTZVcGRhdGUoJnNoYTIsIHVrZXkucmF3X3N0cigpLCB1a2V5LkdldExlbmd0aCgpKTsKICAgICB9CiAgICAgQ1JZUFRfU0hBMjU2RmluaXNoKCZzaGEyLCBkaWdlc3QxKTsKICAgfQotICB1aW50OF90KiBhZXMgPSBGWF9BbGxvYyh1aW50OF90LCAyMDQ4KTsKLSAgQ1JZUFRfQUVTU2V0S2V5KGFlcywgMTYsIGRpZ2VzdDEsIDMyLCB0cnVlKTsKKyAgQ1JZUFRfYWVzX2NvbnRleHQgYWVzOworICBtZW1zZXQoJmFlcywgMCwgc2l6ZW9mKGFlcykpOworICBDUllQVF9BRVNTZXRLZXkoJmFlcywgMTYsIGRpZ2VzdDEsIDMyLCB0cnVlKTsKICAgdWludDhfdCBpdlsxNl07Ci0gIEZYU1lTX21lbXNldChpdiwgMCwgMTYpOwotICBDUllQVF9BRVNTZXRJVihhZXMsIGl2KTsKLSAgQ1JZUFRfQUVTRW5jcnlwdChhZXMsIGRpZ2VzdDEsIGtleSwgMzIpOwotICBGWF9GcmVlKGFlcyk7CisgIG1lbXNldChpdiwgMCwgMTYpOworICBDUllQVF9BRVNTZXRJVigmYWVzLCBpdik7CisgIENSWVBUX0FFU0VuY3J5cHQoJmFlcywgZGlnZXN0MSwga2V5LCAzMik7CiAgIHBFbmNyeXB0RGljdC0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPihiT3duZXIgPyAiT0UiIDogIlVFIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nKGRpZ2VzdDEsIDMyKSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0cmluZyhkaWdlc3QxLCAzMiksIGZhbHNlKTsKIH0KIAogdm9pZCBDUERGX1NlY3VyaXR5SGFuZGxlcjo6QUVTMjU2X1NldFBlcm1zKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LApAQCAtNzAzLDEzICs2OTIsMjEgQEAKICAgYnVmWzldID0gJ2EnOwogICBidWZbMTBdID0gJ2QnOwogICBidWZbMTFdID0gJ2InOwotICB1aW50OF90KiBhZXMgPSBGWF9BbGxvYyh1aW50OF90LCAyMDQ4KTsKLSAgQ1JZUFRfQUVTU2V0S2V5KGFlcywgMTYsIGtleSwgMzIsIHRydWUpOwotICB1aW50OF90IGl2WzE2XSwgYnVmMVsxNl07Ci0gIEZYU1lTX21lbXNldChpdiwgMCwgMTYpOwotICBDUllQVF9BRVNTZXRJVihhZXMsIGl2KTsKLSAgQ1JZUFRfQUVTRW5jcnlwdChhZXMsIGJ1ZjEsIGJ1ZiwgMTYpOwotICBGWF9GcmVlKGFlcyk7Ci0gIHBFbmNyeXB0RGljdC0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigiUGVybXMiLCBDRlhfQnl0ZVN0cmluZyhidWYxLCAxNiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisKKyAgQ1JZUFRfYWVzX2NvbnRleHQgYWVzOworICBtZW1zZXQoJmFlcywgMCwgc2l6ZW9mKGFlcykpOworICBDUllQVF9BRVNTZXRLZXkoJmFlcywgMTYsIGtleSwgMzIsIHRydWUpOworCisgIHVpbnQ4X3QgaXZbMTZdOworICBtZW1zZXQoaXYsIDAsIDE2KTsKKyAgQ1JZUFRfQUVTU2V0SVYoJmFlcywgaXYpOworCisgIHVpbnQ4X3QgYnVmMVsxNl07CisgIENSWVBUX0FFU0VuY3J5cHQoJmFlcywgYnVmMSwgYnVmLCAxNik7CisgIHBFbmNyeXB0RGljdC0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigiUGVybXMiLCBCeXRlU3RyaW5nKGJ1ZjEsIDE2KSwgZmFsc2UpOworfQorCit2b2lkIENQREZfU2VjdXJpdHlIYW5kbGVyOjpJbml0Q3J5cHRvSGFuZGxlcigpIHsKKyAgbV9wQ3J5cHRvSGFuZGxlciA9CisgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9DcnlwdG9IYW5kbGVyPihtX0NpcGhlciwgbV9FbmNyeXB0S2V5LCBtX0tleUxlbik7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc2VjdXJpdHlfaGFuZGxlci5oIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3NlY3VyaXR5X2hhbmRsZXIuaAppbmRleCAxYTQxYjY3Li5lYjk1NzQzIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc2VjdXJpdHlfaGFuZGxlci5oCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zZWN1cml0eV9oYW5kbGVyLmgKQEAgLTcsNiArNyw4IEBACiAjaWZuZGVmIENPUkVfRlBERkFQSV9QQVJTRVJfQ1BERl9TRUNVUklUWV9IQU5ETEVSX0hfCiAjZGVmaW5lIENPUkVfRlBERkFQSV9QQVJTRVJfQ1BERl9TRUNVUklUWV9IQU5ETEVSX0hfCiAKKyNpbmNsdWRlIDxtZW1vcnk+CisKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCiAKQEAgLTE1LDggKzE3LDYgQEAKICNkZWZpbmUgRlhDSVBIRVJfQUVTIDIKICNkZWZpbmUgRlhDSVBIRVJfQUVTMiAzCiAKLSNkZWZpbmUgUERGX0VOQ1JZUFRfQ09OVEVOVCAwCi0KIGNsYXNzIENQREZfQXJyYXk7CiBjbGFzcyBDUERGX0NyeXB0b0hhbmRsZXI7CiBjbGFzcyBDUERGX0RpY3Rpb25hcnk7CkBAIC0yNyw4NCArMjcsNzUgQEAKICAgQ1BERl9TZWN1cml0eUhhbmRsZXIoKTsKICAgfkNQREZfU2VjdXJpdHlIYW5kbGVyKCk7CiAKLSAgYm9vbCBPbkluaXQoQ1BERl9QYXJzZXIqIHBQYXJzZXIsIENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0KTsKLSAgdWludDMyX3QgR2V0UGVybWlzc2lvbnMoKTsKLSAgYm9vbCBHZXRDcnlwdEluZm8oaW50JiBjaXBoZXIsIGNvbnN0IHVpbnQ4X3QqJiBidWZmZXIsIGludCYga2V5bGVuKTsKKyAgYm9vbCBPbkluaXQoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsCisgICAgICAgICAgICAgIGNvbnN0IENQREZfQXJyYXkqIHBJZEFycmF5LAorICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBwYXNzd29yZCk7CisgIHZvaWQgT25DcmVhdGUoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsCisgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9BcnJheSogcElkQXJyYXksCisgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgdXNlcl9wYXNzd29yZCwKKyAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBvd25lcl9wYXNzd29yZCk7CisgIHZvaWQgT25DcmVhdGUoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsCisgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9BcnJheSogcElkQXJyYXksCisgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgdXNlcl9wYXNzd29yZCk7CisKKyAgdWludDMyX3QgR2V0UGVybWlzc2lvbnMoKSBjb25zdDsKICAgYm9vbCBJc01ldGFkYXRhRW5jcnlwdGVkKCkgY29uc3Q7Ci0gIENQREZfQ3J5cHRvSGFuZGxlciogQ3JlYXRlQ3J5cHRvSGFuZGxlcigpOwogCi0gIHZvaWQgT25DcmVhdGUoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsCi0gICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcElkQXJyYXksCi0gICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdXNlcl9wYXNzLAotICAgICAgICAgICAgICAgIHVpbnQzMl90IHVzZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBvd25lcl9wYXNzLAotICAgICAgICAgICAgICAgIHVpbnQzMl90IG93bmVyX3NpemUsCi0gICAgICAgICAgICAgICAgdWludDMyX3QgdHlwZSA9IFBERl9FTkNSWVBUX0NPTlRFTlQpOwotCi0gIHZvaWQgT25DcmVhdGUoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsCi0gICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcElkQXJyYXksCi0gICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdXNlcl9wYXNzLAotICAgICAgICAgICAgICAgIHVpbnQzMl90IHVzZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICB1aW50MzJfdCB0eXBlID0gUERGX0VOQ1JZUFRfQ09OVEVOVCk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0VXNlclBhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIG93bmVyX3Bhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXNzX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGtleV9sZW4pOwotICBib29sIENoZWNrUGFzc3dvcmQoY29uc3QgdWludDhfdCogcGFzc3dvcmQsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwYXNzX3NpemUsCisgIEJ5dGVTdHJpbmcgR2V0VXNlclBhc3N3b3JkKGNvbnN0IEJ5dGVTdHJpbmcmIG93bmVyX3Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGtleV9sZW4pIGNvbnN0OworICBib29sIENoZWNrUGFzc3dvcmQoY29uc3QgQnl0ZVN0cmluZyYgdXNlcl9wYXNzd29yZCwKICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk93bmVyLAogICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoga2V5LAogICAgICAgICAgICAgICAgICAgICAgaW50IGtleV9sZW4pOwogCisgIENQREZfQ3J5cHRvSGFuZGxlciogR2V0Q3J5cHRvSGFuZGxlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9wQ3J5cHRvSGFuZGxlci5nZXQoKTsKKyAgfQorCiAgcHJpdmF0ZToKLSAgYm9vbCBMb2FkRGljdChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCk7Ci0gIGJvb2wgTG9hZERpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsCi0gICAgICAgICAgICAgICAgdWludDMyX3QgdHlwZSwKKyAgYm9vbCBMb2FkRGljdChjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCk7CisgIGJvb2wgTG9hZERpY3QoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsCiAgICAgICAgICAgICAgICAgaW50JiBjaXBoZXIsCiAgICAgICAgICAgICAgICAgaW50JiBrZXlfbGVuKTsKIAotICBib29sIENoZWNrVXNlclBhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhc3Nfc2l6ZSwKKyAgYm9vbCBDaGVja1VzZXJQYXNzd29yZChjb25zdCBCeXRlU3RyaW5nJiBwYXNzd29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJZ25vcmVFbmNyeXB0TWV0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBrZXlfbGVuKTsKIAotICBib29sIENoZWNrT3duZXJQYXNzd29yZChjb25zdCB1aW50OF90KiBwYXNzd29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFzc19zaXplLAorICBib29sIENoZWNrT3duZXJQYXNzd29yZChjb25zdCBCeXRlU3RyaW5nJiBwYXNzd29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoga2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGtleV9sZW4pOwotICBib29sIEFFUzI1Nl9DaGVja1Bhc3N3b3JkKGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUsCisgIGJvb2wgQUVTMjU2X0NoZWNrUGFzc3dvcmQoY29uc3QgQnl0ZVN0cmluZyYgcGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiT3duZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoga2V5KTsKICAgdm9pZCBBRVMyNTZfU2V0UGFzc3dvcmQoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBhc3N3b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBwYXNzd29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiT3duZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGtleSk7CiAgIHZvaWQgQUVTMjU2X1NldFBlcm1zKENQREZfRGljdGlvbmFyeSogcEVuY3J5cHREaWN0LAogICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwZXJtaXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICBib29sIGJFbmNyeXB0TWV0YWRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGtleSk7Ci0gIHZvaWQgT25DcmVhdGUoQ1BERl9EaWN0aW9uYXJ5KiBwRW5jcnlwdERpY3QsCi0gICAgICAgICAgICAgICAgQ1BERl9BcnJheSogcElkQXJyYXksCi0gICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdXNlcl9wYXNzLAotICAgICAgICAgICAgICAgIHVpbnQzMl90IHVzZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBvd25lcl9wYXNzLAotICAgICAgICAgICAgICAgIHVpbnQzMl90IG93bmVyX3NpemUsCi0gICAgICAgICAgICAgICAgYm9vbCBiRGVmYXVsdCwKLSAgICAgICAgICAgICAgICB1aW50MzJfdCB0eXBlKTsKLSAgYm9vbCBDaGVja1NlY3VyaXR5KGludDMyX3Qga2V5X2xlbik7CisgIHZvaWQgT25DcmVhdGVJbnRlcm5hbChDUERGX0RpY3Rpb25hcnkqIHBFbmNyeXB0RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfQXJyYXkqIHBJZEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgdXNlcl9wYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIG93bmVyX3Bhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRGVmYXVsdCk7CisgIGJvb2wgQ2hlY2tTZWN1cml0eShjb25zdCBCeXRlU3RyaW5nJiBwYXNzd29yZCk7CisKKyAgdm9pZCBJbml0Q3J5cHRvSGFuZGxlcigpOwogCiAgIGludCBtX1ZlcnNpb247CiAgIGludCBtX1JldmlzaW9uOwotICBDUERGX1BhcnNlciogbV9wUGFyc2VyOwotICBDUERGX0RpY3Rpb25hcnkqIG1fcEVuY3J5cHREaWN0OworICBVbm93bmVkUHRyPGNvbnN0IENQREZfRGljdGlvbmFyeT4gbV9wRW5jcnlwdERpY3Q7CisgIEJ5dGVTdHJpbmcgbV9GaWxlSWQ7CiAgIHVpbnQzMl90IG1fUGVybWlzc2lvbnM7CiAgIGludCBtX0NpcGhlcjsKICAgdWludDhfdCBtX0VuY3J5cHRLZXlbMzJdOwogICBpbnQgbV9LZXlMZW47CiAgIGJvb2wgbV9iT3duZXJVbmxvY2tlZDsKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfQ3J5cHRvSGFuZGxlcj4gbV9wQ3J5cHRvSGFuZGxlcjsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9GUERGQVBJX1BBUlNFUl9DUERGX1NFQ1VSSVRZX0hBTkRMRVJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zZWN1cml0eV9oYW5kbGVyX2VtYmVkZGVydGVzdC5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc2VjdXJpdHlfaGFuZGxlcl9lbWJlZGRlcnRlc3QuY3BwCmluZGV4IGM2YzYyMTcuLmExZDVmZGEgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zZWN1cml0eV9oYW5kbGVyX2VtYmVkZGVydGVzdC5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3NlY3VyaXR5X2hhbmRsZXJfZW1iZWRkZXJ0ZXN0LmNwcApAQCAtMiw2ICsyLDEyIEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9lZGl0LmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfc2F2ZS5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmdmlldy5oIgogI2luY2x1ZGUgInRlc3RpbmcvZW1iZWRkZXJfdGVzdC5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogCkBAIC0xMyw3ICsxOSw3IEBACiB9CiAKIFRFU1RfRihDUERGU2VjdXJpdHlIYW5kbGVyRW1iZWRkZXJ0ZXN0LCBVbmVuY3J5cHRlZFdpdGhQYXNzd29yZCkgewotICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoImFib3V0X2JsYW5rLnBkZiIsICJmb29iYXIiKSk7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudFdpdGhQYXNzd29yZCgiYWJvdXRfYmxhbmsucGRmIiwgImZvb2JhciIpKTsKICAgRVhQRUNUX0VRKDB4RkZGRkZGRkYsIEZQREZfR2V0RG9jUGVybWlzc2lvbnMoZG9jdW1lbnQoKSkpOwogfQogCkBAIC0yMiwzMyArMjgsODIgQEAKIH0KIAogVEVTVF9GKENQREZTZWN1cml0eUhhbmRsZXJFbWJlZGRlcnRlc3QsIEJhZFBhc3N3b3JkKSB7Ci0gIEVYUEVDVF9GQUxTRShPcGVuRG9jdW1lbnQoImVuY3J5cHRlZC5wZGYiLCAidGlnZXIiKSk7CisgIEVYUEVDVF9GQUxTRShPcGVuRG9jdW1lbnRXaXRoUGFzc3dvcmQoImVuY3J5cHRlZC5wZGYiLCAidGlnZXIiKSk7CiB9CiAKIFRFU1RfRihDUERGU2VjdXJpdHlIYW5kbGVyRW1iZWRkZXJ0ZXN0LCBVc2VyUGFzc3dvcmQpIHsKLSAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJlbmNyeXB0ZWQucGRmIiwgIjEyMzQiKSk7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudFdpdGhQYXNzd29yZCgiZW5jcnlwdGVkLnBkZiIsICIxMjM0IikpOwogICBFWFBFQ1RfRVEoMHhGRkZGRjJDMCwgRlBERl9HZXREb2NQZXJtaXNzaW9ucyhkb2N1bWVudCgpKSk7CiB9CiAKIFRFU1RfRihDUERGU2VjdXJpdHlIYW5kbGVyRW1iZWRkZXJ0ZXN0LCBPd25lclBhc3N3b3JkKSB7Ci0gIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiZW5jcnlwdGVkLnBkZiIsICI1Njc4IikpOworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnRXaXRoUGFzc3dvcmQoImVuY3J5cHRlZC5wZGYiLCAiNTY3OCIpKTsKICAgRVhQRUNUX0VRKDB4RkZGRkZGRkMsIEZQREZfR2V0RG9jUGVybWlzc2lvbnMoZG9jdW1lbnQoKSkpOwogfQogCitURVNUX0YoQ1BERlNlY3VyaXR5SGFuZGxlckVtYmVkZGVydGVzdCwgUGFzc3dvcmRBZnRlckdlbmVyYXRlU2F2ZSkgeworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0xJTlVYXworICBjb25zdCBjaGFyIG1kNVtdID0gIjcwNDhkY2E1OGUyZWQ4ZjkzMzM5MDA4YjkxZTRlYjRlIjsKKyNlbGlmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXworICBjb25zdCBjaGFyIG1kNVtdID0gIjY5NTFiNmM5ODkxZGZlMDMzMmE1YjE5ODNlNDg0NDAwIjsKKyNlbHNlCisgIGNvbnN0IGNoYXIgbWQ1W10gPSAiYTVkZGUzYzZjMzdiODcxNmI5YjM2OWEwMzc1MmE3MjgiOworI2VuZGlmICAvLyBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9MSU5VWF8KKyAgeworICAgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudFdpdGhPcHRpb25zKCJlbmNyeXB0ZWQucGRmIiwgIjU2NzgiLCB0cnVlKSk7CisgICAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkUGFnZSgwKTsKKyAgICBBU1NFUlRfVFJVRShwYWdlKTsKKyAgICBGUERGX1BBR0VPQkpFQ1QgcmVkX3JlY3QgPSBGUERGUGFnZU9ial9DcmVhdGVOZXdSZWN0KDEwLCAxMCwgMjAsIDIwKTsKKyAgICBBU1NFUlRfVFJVRShyZWRfcmVjdCk7CisgICAgRVhQRUNUX1RSVUUoRlBERlBhdGhfU2V0RmlsbENvbG9yKHJlZF9yZWN0LCAyNTUsIDAsIDAsIDI1NSkpOworICAgIEVYUEVDVF9UUlVFKEZQREZQYXRoX1NldERyYXdNb2RlKHJlZF9yZWN0LCBGUERGX0ZJTExNT0RFX0FMVEVSTkFURSwgMCkpOworICAgIEZQREZQYWdlX0luc2VydE9iamVjdChwYWdlLCByZWRfcmVjdCk7CisgICAgRlBERl9CSVRNQVAgcGFnZV9iaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UpOworICAgIENvbXBhcmVCaXRtYXAocGFnZV9iaXRtYXAsIDYxMiwgNzkyLCBtZDUpOworICAgIEZQREZCaXRtYXBfRGVzdHJveShwYWdlX2JpdG1hcCk7CisgICAgRVhQRUNUX1RSVUUoRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KHBhZ2UpKTsKKyAgICBTZXRXaG9sZUZpbGVBdmFpbGFibGUoKTsKKyAgICBFWFBFQ1RfVFJVRShGUERGX1NhdmVBc0NvcHkoZG9jdW1lbnQoKSwgdGhpcywgMCkpOworICAgIFVubG9hZFBhZ2UocGFnZSk7CisgIH0KKyAgc3RkOjpzdHJpbmcgbmV3X2ZpbGUgPSBHZXRTdHJpbmcoKTsKKyAgRlBERl9GSUxFQUNDRVNTIGZpbGVfYWNjZXNzOworICBtZW1zZXQoJmZpbGVfYWNjZXNzLCAwLCBzaXplb2YoZmlsZV9hY2Nlc3MpKTsKKyAgZmlsZV9hY2Nlc3MubV9GaWxlTGVuID0gbmV3X2ZpbGUuc2l6ZSgpOworICBmaWxlX2FjY2Vzcy5tX0dldEJsb2NrID0gR2V0QmxvY2tGcm9tU3RyaW5nOworICBmaWxlX2FjY2Vzcy5tX1BhcmFtID0gJm5ld19maWxlOworICBFWFBFQ1RfRkFMU0UoRlBERl9Mb2FkQ3VzdG9tRG9jdW1lbnQoJmZpbGVfYWNjZXNzLCBudWxscHRyKSk7CisKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBwYXNzd29yZDsKKyAgICBjb25zdCB1bnNpZ25lZCBsb25nIHBlcm1pc3Npb25zOworICB9IHRlc3RzW10gPSB7eyIxMjM0IiwgMHhGRkZGRjJDMH0sIHsiNTY3OCIsIDB4RkZGRkZGRkN9fTsKKworICBmb3IgKGNvbnN0IGF1dG8mIHRlc3QgOiB0ZXN0cykgeworICAgIE9wZW5TYXZlZERvY3VtZW50KHRlc3QucGFzc3dvcmQpOworICAgIEZQREZfUEFHRSBwYWdlID0gTG9hZFNhdmVkUGFnZSgwKTsKKyAgICBWZXJpZnlTYXZlZFJlbmRlcmluZyhwYWdlLCA2MTIsIDc5MiwgbWQ1KTsKKyAgICBFWFBFQ1RfRVEodGVzdC5wZXJtaXNzaW9ucywgRlBERl9HZXREb2NQZXJtaXNzaW9ucyhtX1NhdmVkRG9jdW1lbnQpKTsKKworICAgIENsb3NlU2F2ZWRQYWdlKHBhZ2UpOworICAgIENsb3NlU2F2ZWREb2N1bWVudCgpOworICB9Cit9CisKIFRFU1RfRihDUERGU2VjdXJpdHlIYW5kbGVyRW1iZWRkZXJ0ZXN0LCBOb1Bhc3N3b3JkVmVyc2lvbjUpIHsKICAgQVNTRVJUX0ZBTFNFKE9wZW5Eb2N1bWVudCgiYnVnXzY0NC5wZGYiKSk7CiB9CiAKIFRFU1RfRihDUERGU2VjdXJpdHlIYW5kbGVyRW1iZWRkZXJ0ZXN0LCBCYWRQYXNzd29yZFZlcnNpb241KSB7Ci0gIEFTU0VSVF9GQUxTRShPcGVuRG9jdW1lbnQoImJ1Z182NDQucGRmIiwgInRpZ2VyIikpOworICBBU1NFUlRfRkFMU0UoT3BlbkRvY3VtZW50V2l0aFBhc3N3b3JkKCJidWdfNjQ0LnBkZiIsICJ0aWdlciIpKTsKIH0KIAogVEVTVF9GKENQREZTZWN1cml0eUhhbmRsZXJFbWJlZGRlcnRlc3QsIE93bmVyUGFzc3dvcmRWZXJzaW9uNSkgewotICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoImJ1Z182NDQucGRmIiwgImEiKSk7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudFdpdGhQYXNzd29yZCgiYnVnXzY0NC5wZGYiLCAiYSIpKTsKICAgRVhQRUNUX0VRKDB4RkZGRkZGRkMsIEZQREZfR2V0RG9jUGVybWlzc2lvbnMoZG9jdW1lbnQoKSkpOwogfQogCiBURVNUX0YoQ1BERlNlY3VyaXR5SGFuZGxlckVtYmVkZGVydGVzdCwgVXNlclBhc3N3b3JkVmVyc2lvbjUpIHsKLSAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJidWdfNjQ0LnBkZiIsICJiIikpOworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnRXaXRoUGFzc3dvcmQoImJ1Z182NDQucGRmIiwgImIiKSk7CiAgIEVYUEVDVF9FUSgweEZGRkZGRkZDLCBGUERGX0dldERvY1Blcm1pc3Npb25zKGRvY3VtZW50KCkpKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zaW1wbGVfcGFyc2VyLmNwcCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zaW1wbGVfcGFyc2VyLmNwcAppbmRleCA2NTBjMjE2Li5iNDlmODQyIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc2ltcGxlX3BhcnNlci5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3NpbXBsZV9wYXJzZXIuY3BwCkBAIC0xMSwyMCArMTEsMjAgQEAKIENQREZfU2ltcGxlUGFyc2VyOjpDUERGX1NpbXBsZVBhcnNlcihjb25zdCB1aW50OF90KiBwRGF0YSwgdWludDMyX3QgZHdTaXplKQogICAgIDogbV9wRGF0YShwRGF0YSksIG1fZHdTaXplKGR3U2l6ZSksIG1fZHdDdXJQb3MoMCkge30KIAotQ1BERl9TaW1wbGVQYXJzZXI6OkNQREZfU2ltcGxlUGFyc2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKQorQ1BERl9TaW1wbGVQYXJzZXI6OkNQREZfU2ltcGxlUGFyc2VyKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIpCiAgICAgOiBtX3BEYXRhKHN0ci5yYXdfc3RyKCkpLCBtX2R3U2l6ZShzdHIuR2V0TGVuZ3RoKCkpLCBtX2R3Q3VyUG9zKDApIHt9CiAKLXZvaWQgQ1BERl9TaW1wbGVQYXJzZXI6OlBhcnNlV29yZChjb25zdCB1aW50OF90KiYgcFN0YXJ0LCB1aW50MzJfdCYgZHdTaXplKSB7Ci0gIHBTdGFydCA9IG51bGxwdHI7Ci0gIGR3U2l6ZSA9IDA7CitzdGQ6OnBhaXI8Y29uc3QgdWludDhfdCosIHVpbnQzMl90PiBDUERGX1NpbXBsZVBhcnNlcjo6UGFyc2VXb3JkKCkgeworICBjb25zdCB1aW50OF90KiBwU3RhcnQgPSBudWxscHRyOworICB1aW50OF90IGR3U2l6ZSA9IDA7CiAgIHVpbnQ4X3QgY2g7CiAgIHdoaWxlICgxKSB7CiAgICAgaWYgKG1fZHdTaXplIDw9IG1fZHdDdXJQb3MpCi0gICAgICByZXR1cm47CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIocFN0YXJ0LCBkd1NpemUpOwogICAgIGNoID0gbV9wRGF0YVttX2R3Q3VyUG9zKytdOwogICAgIHdoaWxlIChQREZDaGFySXNXaGl0ZXNwYWNlKGNoKSkgewogICAgICAgaWYgKG1fZHdTaXplIDw9IG1fZHdDdXJQb3MpCi0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHBTdGFydCwgZHdTaXplKTsKICAgICAgIGNoID0gbV9wRGF0YVttX2R3Q3VyUG9zKytdOwogICAgIH0KIApAQCAtMzMsNyArMzMsNyBAQAogCiAgICAgd2hpbGUgKDEpIHsKICAgICAgIGlmIChtX2R3U2l6ZSA8PSBtX2R3Q3VyUG9zKQotICAgICAgICByZXR1cm47CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihwU3RhcnQsIGR3U2l6ZSk7CiAgICAgICBjaCA9IG1fcERhdGFbbV9kd0N1clBvcysrXTsKICAgICAgIGlmIChQREZDaGFySXNMaW5lRW5kaW5nKGNoKSkKICAgICAgICAgYnJlYWs7CkBAIC00NiwxOSArNDYsMTkgQEAKICAgICBpZiAoY2ggPT0gJy8nKSB7CiAgICAgICB3aGlsZSAoMSkgewogICAgICAgICBpZiAobV9kd1NpemUgPD0gbV9kd0N1clBvcykKLSAgICAgICAgICByZXR1cm47CisgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHBTdGFydCwgZHdTaXplKTsKICAgICAgICAgY2ggPSBtX3BEYXRhW21fZHdDdXJQb3MrK107CiAgICAgICAgIGlmICghUERGQ2hhcklzT3RoZXIoY2gpICYmICFQREZDaGFySXNOdW1lcmljKGNoKSkgewogICAgICAgICAgIG1fZHdDdXJQb3MtLTsKICAgICAgICAgICBkd1NpemUgPSBtX2R3Q3VyUG9zIC0gc3RhcnRfcG9zOwotICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIocFN0YXJ0LCBkd1NpemUpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIGR3U2l6ZSA9IDE7CiAgICAgICBpZiAoY2ggPT0gJzwnKSB7CiAgICAgICAgIGlmIChtX2R3U2l6ZSA8PSBtX2R3Q3VyUG9zKQotICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIocFN0YXJ0LCBkd1NpemUpOwogICAgICAgICBjaCA9IG1fcERhdGFbbV9kd0N1clBvcysrXTsKICAgICAgICAgaWYgKGNoID09ICc8JykKICAgICAgICAgICBkd1NpemUgPSAyOwpAQCAtNjYsNyArNjYsNyBAQAogICAgICAgICAgIG1fZHdDdXJQb3MtLTsKICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJz4nKSB7CiAgICAgICAgIGlmIChtX2R3U2l6ZSA8PSBtX2R3Q3VyUG9zKQotICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIocFN0YXJ0LCBkd1NpemUpOwogICAgICAgICBjaCA9IG1fcERhdGFbbV9kd0N1clBvcysrXTsKICAgICAgICAgaWYgKGNoID09ICc+JykKICAgICAgICAgICBkd1NpemUgPSAyOwpAQCAtNzQsMTMgKzc0LDEzIEBACiAgICAgICAgICAgbV9kd0N1clBvcy0tOwogICAgICAgfQogICAgIH0KLSAgICByZXR1cm47CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHBTdGFydCwgZHdTaXplKTsKICAgfQogCiAgIGR3U2l6ZSA9IDE7CiAgIHdoaWxlICgxKSB7CiAgICAgaWYgKG1fZHdTaXplIDw9IG1fZHdDdXJQb3MpCi0gICAgICByZXR1cm47CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIocFN0YXJ0LCBkd1NpemUpOwogICAgIGNoID0gbV9wRGF0YVttX2R3Q3VyUG9zKytdOwogCiAgICAgaWYgKFBERkNoYXJJc0RlbGltaXRlcihjaCkgfHwgUERGQ2hhcklzV2hpdGVzcGFjZShjaCkpIHsKQEAgLTg5LDEyICs4OSwxMyBAQAogICAgIH0KICAgICBkd1NpemUrKzsKICAgfQorICByZXR1cm4gc3RkOjptYWtlX3BhaXIocFN0YXJ0LCBkd1NpemUpOwogfQogCi1DRlhfQnl0ZVN0cmluZ0MgQ1BERl9TaW1wbGVQYXJzZXI6OkdldFdvcmQoKSB7CitCeXRlU3RyaW5nVmlldyBDUERGX1NpbXBsZVBhcnNlcjo6R2V0V29yZCgpIHsKICAgY29uc3QgdWludDhfdCogcFN0YXJ0OwogICB1aW50MzJfdCBkd1NpemU7Ci0gIFBhcnNlV29yZChwU3RhcnQsIGR3U2l6ZSk7CisgIHN0ZDo6dGllKHBTdGFydCwgZHdTaXplKSA9IFBhcnNlV29yZCgpOwogICBpZiAoZHdTaXplID09IDEgJiYgcFN0YXJ0WzBdID09ICc8JykgewogICAgIHdoaWxlIChtX2R3Q3VyUG9zIDwgbV9kd1NpemUgJiYgbV9wRGF0YVttX2R3Q3VyUG9zXSAhPSAnPicpIHsKICAgICAgIG1fZHdDdXJQb3MrKzsKQEAgLTEwMiw4ICsxMDMsOCBAQAogICAgIGlmIChtX2R3Q3VyUG9zIDwgbV9kd1NpemUpIHsKICAgICAgIG1fZHdDdXJQb3MrKzsKICAgICB9Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQyhwU3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfU1RSU0laRSkobV9kd0N1clBvcyAtIChwU3RhcnQgLSBtX3BEYXRhKSkpOworICAgIHJldHVybiBCeXRlU3RyaW5nVmlldyhwU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4obV9kd0N1clBvcyAtIChwU3RhcnQgLSBtX3BEYXRhKSkpOwogICB9CiAgIGlmIChkd1NpemUgPT0gMSAmJiBwU3RhcnRbMF0gPT0gJygnKSB7CiAgICAgaW50IGxldmVsID0gMTsKQEAgLTEzMCwxMyArMTMxLDEzIEBACiAgICAgaWYgKG1fZHdDdXJQb3MgPCBtX2R3U2l6ZSkgewogICAgICAgbV9kd0N1clBvcysrOwogICAgIH0KLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKHBTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9TVFJTSVpFKShtX2R3Q3VyUG9zIC0gKHBTdGFydCAtIG1fcERhdGEpKSk7CisgICAgcmV0dXJuIEJ5dGVTdHJpbmdWaWV3KHBTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihtX2R3Q3VyUG9zIC0gKHBTdGFydCAtIG1fcERhdGEpKSk7CiAgIH0KLSAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQyhwU3RhcnQsIGR3U2l6ZSk7CisgIHJldHVybiBCeXRlU3RyaW5nVmlldyhwU3RhcnQsIGR3U2l6ZSk7CiB9CiAKLWJvb2wgQ1BERl9TaW1wbGVQYXJzZXI6OkZpbmRUYWdQYXJhbUZyb21TdGFydChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRva2VuLAorYm9vbCBDUERGX1NpbXBsZVBhcnNlcjo6RmluZFRhZ1BhcmFtRnJvbVN0YXJ0KGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiB0b2tlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblBhcmFtcykgewogICBuUGFyYW1zKys7CiAgIHVpbnQzMl90KiBwQnVmID0gRlhfQWxsb2ModWludDMyX3QsIG5QYXJhbXMpOwpAQCAtMTUyLDcgKzE1Myw3IEBACiAgICAgaWYgKGJ1Zl9jb3VudCA+IG5QYXJhbXMpIHsKICAgICAgIGJ1Zl9jb3VudCA9IG5QYXJhbXM7CiAgICAgfQotICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gR2V0V29yZCgpOworICAgIEJ5dGVTdHJpbmdWaWV3IHdvcmQgPSBHZXRXb3JkKCk7CiAgICAgaWYgKHdvcmQuSXNFbXB0eSgpKSB7CiAgICAgICBGWF9GcmVlKHBCdWYpOwogICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3NpbXBsZV9wYXJzZXIuaCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zaW1wbGVfcGFyc2VyLmgKaW5kZXggMGZmNjk4NS4uNjU5MDM5ZSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3NpbXBsZV9wYXJzZXIuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc2ltcGxlX3BhcnNlci5oCkBAIC03LDI1ICs3LDI3IEBACiAjaWZuZGVmIENPUkVfRlBERkFQSV9QQVJTRVJfQ1BERl9TSU1QTEVfUEFSU0VSX0hfCiAjZGVmaW5lIENPUkVfRlBERkFQSV9QQVJTRVJfQ1BERl9TSU1QTEVfUEFSU0VSX0hfCiAKKyNpbmNsdWRlIDx1dGlsaXR5PgorCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgogCiBjbGFzcyBDUERGX1NpbXBsZVBhcnNlciB7CiAgcHVibGljOgogICBDUERGX1NpbXBsZVBhcnNlcihjb25zdCB1aW50OF90KiBwRGF0YSwgdWludDMyX3QgZHdTaXplKTsKLSAgZXhwbGljaXQgQ1BERl9TaW1wbGVQYXJzZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpOworICBleHBsaWNpdCBDUERGX1NpbXBsZVBhcnNlcihjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyKTsKIAotICBDRlhfQnl0ZVN0cmluZ0MgR2V0V29yZCgpOworICBCeXRlU3RyaW5nVmlldyBHZXRXb3JkKCk7CiAKICAgLy8gRmluZCB0aGUgdG9rZW4gYW5kIGl0cyB8blBhcmFtc3wgcGFyYW1ldGVycyBmcm9tIHRoZSBzdGFydCBvZiBkYXRhLAogICAvLyBhbmQgbW92ZSB0aGUgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgc3RhcnQgb2YgdGhvc2UgcGFyYW1ldGVycy4KLSAgYm9vbCBGaW5kVGFnUGFyYW1Gcm9tU3RhcnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0b2tlbiwgaW50IG5QYXJhbXMpOworICBib29sIEZpbmRUYWdQYXJhbUZyb21TdGFydChjb25zdCBCeXRlU3RyaW5nVmlldyYgdG9rZW4sIGludCBuUGFyYW1zKTsKIAogICAvLyBGb3IgdGVzdGluZyBvbmx5LgogICB1aW50MzJfdCBHZXRDdXJQb3MoKSBjb25zdCB7IHJldHVybiBtX2R3Q3VyUG9zOyB9CiAKICBwcml2YXRlOgotICB2b2lkIFBhcnNlV29yZChjb25zdCB1aW50OF90KiYgcFN0YXJ0LCB1aW50MzJfdCYgZHdTaXplKTsKKyAgc3RkOjpwYWlyPGNvbnN0IHVpbnQ4X3QqLCB1aW50MzJfdD4gUGFyc2VXb3JkKCk7CiAKICAgY29uc3QgdWludDhfdCogbV9wRGF0YTsKICAgdWludDMyX3QgbV9kd1NpemU7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc2ltcGxlX3BhcnNlcl91bml0dGVzdC5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc2ltcGxlX3BhcnNlcl91bml0dGVzdC5jcHAKaW5kZXggNWY1NmI5NC4uZThkM2I3MSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3NpbXBsZV9wYXJzZXJfdW5pdHRlc3QuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zaW1wbGVfcGFyc2VyX3VuaXR0ZXN0LmNwcApAQCAtNywxMiArNywxMSBAQAogI2luY2x1ZGUgPHN0cmluZz4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfdXRpbGl0eS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5oIgogCiBURVNUKFNpbXBsZVBhcnNlclRlc3QsIEdldFdvcmQpIHsKLSAgcGRmaXVtOjpTdHJGdW5jVGVzdERhdGEgdGVzdF9kYXRhW10gPSB7CisgIHN0YXRpYyBjb25zdCBwZGZpdW06OlN0ckZ1bmNUZXN0RGF0YSB0ZXN0X2RhdGFbXSA9IHsKICAgICAgIC8vIEVtcHR5IHNyYyBzdHJpbmcuCiAgICAgICBTVFJfSU5fT1VUX0NBU0UoIiIsICIiKSwKICAgICAgIC8vIENvbnRlbnQgd2l0aCB3aGl0ZXNwYWNlcyBvbmx5LgpAQCAtNTEsMTYgKzUwLDE4IEBACiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RfZGF0YSk7ICsraSkgewogICAgIGNvbnN0IHBkZml1bTo6U3RyRnVuY1Rlc3REYXRhJiBkYXRhID0gdGVzdF9kYXRhW2ldOwogICAgIENQREZfU2ltcGxlUGFyc2VyIHBhcnNlcihkYXRhLmlucHV0LCBkYXRhLmlucHV0X3NpemUpOwotICAgIENGWF9CeXRlU3RyaW5nQyB3b3JkID0gcGFyc2VyLkdldFdvcmQoKTsKLSAgICBFWFBFQ1RfRVEoc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGF0YS5leHBlY3RlZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZXhwZWN0ZWRfc2l6ZSksCi0gICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKHdvcmQuY19zdHIoKSwgd29yZC5HZXRMZW5ndGgoKSkpCisgICAgQnl0ZVN0cmluZ1ZpZXcgd29yZCA9IHBhcnNlci5HZXRXb3JkKCk7CisgICAgRVhQRUNUX0VRKGRhdGEuZXhwZWN0ZWRfc2l6ZSwgd29yZC5HZXRMZW5ndGgoKSkgPDwgIiBmb3IgY2FzZSAiIDw8IGk7CisgICAgaWYgKGRhdGEuZXhwZWN0ZWRfc2l6ZSAhPSB3b3JkLkdldExlbmd0aCgpKQorICAgICAgY29udGludWU7CisgICAgRVhQRUNUX0VRKAorICAgICAgICAwLCBtZW1jbXAoZGF0YS5leHBlY3RlZCwgd29yZC51bnRlcm1pbmF0ZWRfY19zdHIoKSwgZGF0YS5leHBlY3RlZF9zaXplKSkKICAgICAgICAgPDwgIiBmb3IgY2FzZSAiIDw8IGk7CiAgIH0KIH0KIAogVEVTVChTaW1wbGVQYXJzZXJUZXN0LCBGaW5kVGFnUGFyYW1Gcm9tU3RhcnQpIHsKLSAgc3RydWN0IEZpbmRUYWdUZXN0U3RydWN0IHsKKyAgc3RhdGljIGNvbnN0IHN0cnVjdCBGaW5kVGFnVGVzdFN0cnVjdCB7CiAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW5wdXQ7CiAgICAgdW5zaWduZWQgaW50IGlucHV0X3NpemU7CiAgICAgY29uc3QgY2hhciogdG9rZW47CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtLmNwcCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uY3BwCmluZGV4IGQ2MmI0NTYuLjA3NGU3NDcgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uY3BwCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bWJlci5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW1fYWNjLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmVhbS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9jb252ZXJzaW9ucy5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCkBAIC0yMSw3ICsyMiw5IEBACiBDUERGX1N0cmVhbTo6Q1BERl9TdHJlYW0oc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IHBEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeT4gcERpY3QpCi0gICAgOiBtX2R3U2l6ZShzaXplKSwgbV9wRGljdChzdGQ6Om1vdmUocERpY3QpKSwgbV9wRGF0YUJ1ZihzdGQ6Om1vdmUocERhdGEpKSB7fQorICAgIDogbV9wRGljdChzdGQ6Om1vdmUocERpY3QpKSB7CisgIFNldERhdGEoc3RkOjptb3ZlKHBEYXRhKSwgc2l6ZSk7Cit9CiAKIENQREZfU3RyZWFtOjp+Q1BERl9TdHJlYW0oKSB7CiAgIG1fT2JqTnVtID0ga0ludmFsaWRPYmpOdW07CkBAIC01MywxOCArNTYsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeT4gcERpY3QpIHsKICAgbV9wRGljdCA9IHN0ZDo6bW92ZShwRGljdCk7Ci0gIG1fYk1lbW9yeUJhc2VkID0gdHJ1ZTsKLSAgbV9wRmlsZSA9IG51bGxwdHI7Ci0gIG1fcERhdGFCdWYucmVzZXQoRlhfQWxsb2ModWludDhfdCwgc2l6ZSkpOwotICBpZiAocERhdGEpCi0gICAgRlhTWVNfbWVtY3B5KG1fcERhdGFCdWYuZ2V0KCksIHBEYXRhLCBzaXplKTsKLSAgbV9kd1NpemUgPSBzaXplOwotICBpZiAobV9wRGljdCkKLSAgICBtX3BEaWN0LT5TZXROZXdGb3I8Q1BERl9OdW1iZXI+KCJMZW5ndGgiLCBzdGF0aWNfY2FzdDxpbnQ+KG1fZHdTaXplKSk7CisgIFNldERhdGEocERhdGEsIHNpemUpOwogfQogCiB2b2lkIENQREZfU3RyZWFtOjpJbml0U3RyZWFtRnJvbUZpbGUoCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGUsCisgICAgY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZSwKICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5PiBwRGljdCkgewogICBtX3BEaWN0ID0gc3RkOjptb3ZlKHBEaWN0KTsKICAgbV9iTWVtb3J5QmFzZWQgPSBmYWxzZTsKQEAgLTgzLDMxICs3OSw1NCBAQAogICAgIGJvb2wgYkRpcmVjdCwKICAgICBzdGQ6OnNldDxjb25zdCBDUERGX09iamVjdCo+KiBwVmlzaXRlZCkgY29uc3QgewogICBwVmlzaXRlZC0+aW5zZXJ0KHRoaXMpOwotICBDUERGX1N0cmVhbUFjYyBhY2M7Ci0gIGFjYy5Mb2FkQWxsRGF0YSh0aGlzLCB0cnVlKTsKKyAgYXV0byBwQWNjID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfU3RyZWFtQWNjPih0aGlzKTsKKyAgcEFjYy0+TG9hZEFsbERhdGFSYXcoKTsKIAotICB1aW50MzJfdCBzdHJlYW1TaXplID0gYWNjLkdldFNpemUoKTsKKyAgdWludDMyX3Qgc3RyZWFtU2l6ZSA9IHBBY2MtPkdldFNpemUoKTsKICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IEdldERpY3QoKTsKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeT4gcE5ld0RpY3Q7CiAgIGlmIChwRGljdCAmJiAhcGRmaXVtOjpDb250YWluc0tleSgqcFZpc2l0ZWQsIHBEaWN0KSkgewogICAgIHBOZXdEaWN0ID0gVG9EaWN0aW9uYXJ5KAogICAgICAgICBzdGF0aWNfY2FzdDxDUERGX09iamVjdCo+KHBEaWN0KS0+Q2xvbmVOb25DeWNsaWMoYkRpcmVjdCwgcFZpc2l0ZWQpKTsKICAgfQotICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU3RyZWFtPihhY2MuRGV0YWNoRGF0YSgpLCBzdHJlYW1TaXplLAorICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU3RyZWFtPihwQWNjLT5EZXRhY2hEYXRhKCksIHN0cmVhbVNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwTmV3RGljdCkpOwogfQogCit2b2lkIENQREZfU3RyZWFtOjpTZXREYXRhQW5kUmVtb3ZlRmlsdGVyKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCB1aW50MzJfdCBzaXplKSB7CisgIFNldERhdGEocERhdGEsIHNpemUpOworICBtX3BEaWN0LT5SZW1vdmVGb3IoIkZpbHRlciIpOworICBtX3BEaWN0LT5SZW1vdmVGb3IoIkRlY29kZVBhcm1zIik7Cit9CisKK3ZvaWQgQ1BERl9TdHJlYW06OlNldERhdGFBbmRSZW1vdmVGaWx0ZXIoc3RkOjpvc3RyaW5nc3RyZWFtKiBzdHJlYW0pIHsKKyAgU2V0RGF0YUFuZFJlbW92ZUZpbHRlcigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHN0cmVhbS0+c3RyKCkuY19zdHIoKSksIHN0cmVhbS0+dGVsbHAoKSk7Cit9CisKIHZvaWQgQ1BERl9TdHJlYW06OlNldERhdGEoY29uc3QgdWludDhfdCogcERhdGEsIHVpbnQzMl90IHNpemUpIHsKKyAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IGRhdGFfY29weTsKKyAgaWYgKHBEYXRhKSB7CisgICAgZGF0YV9jb3B5LnJlc2V0KEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpKTsKKyAgICBtZW1jcHkoZGF0YV9jb3B5LmdldCgpLCBwRGF0YSwgc2l6ZSk7CisgIH0KKyAgU2V0RGF0YShzdGQ6Om1vdmUoZGF0YV9jb3B5KSwgc2l6ZSk7Cit9CisKK3ZvaWQgQ1BERl9TdHJlYW06OlNldERhdGEoc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplKSB7CiAgIG1fYk1lbW9yeUJhc2VkID0gdHJ1ZTsKLSAgbV9wRGF0YUJ1Zi5yZXNldChGWF9BbGxvYyh1aW50OF90LCBzaXplKSk7Ci0gIGlmIChwRGF0YSkKLSAgICBGWFNZU19tZW1jcHkobV9wRGF0YUJ1Zi5nZXQoKSwgcERhdGEsIHNpemUpOworICBtX3BGaWxlID0gbnVsbHB0cjsKKyAgbV9wRGF0YUJ1ZiA9IHN0ZDo6bW92ZShwRGF0YSk7CiAgIG1fZHdTaXplID0gc2l6ZTsKICAgaWYgKCFtX3BEaWN0KQogICAgIG1fcERpY3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigpOwogICBtX3BEaWN0LT5TZXROZXdGb3I8Q1BERl9OdW1iZXI+KCJMZW5ndGgiLCBzdGF0aWNfY2FzdDxpbnQ+KHNpemUpKTsKLSAgbV9wRGljdC0+UmVtb3ZlRm9yKCJGaWx0ZXIiKTsKLSAgbV9wRGljdC0+UmVtb3ZlRm9yKCJEZWNvZGVQYXJtcyIpOworfQorCit2b2lkIENQREZfU3RyZWFtOjpTZXREYXRhKHN0ZDo6b3N0cmluZ3N0cmVhbSogc3RyZWFtKSB7CisgIFNldERhdGEocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oc3RyZWFtLT5zdHIoKS5jX3N0cigpKSwKKyAgICAgICAgICBzdHJlYW0tPnRlbGxwKCkpOwogfQogCiBib29sIENQREZfU3RyZWFtOjpSZWFkUmF3RGF0YShGWF9GSUxFU0laRSBvZmZzZXQsCkBAIC0xMTcsNyArMTM2LDcgQEAKICAgICByZXR1cm4gbV9wRmlsZS0+UmVhZEJsb2NrKGJ1Ziwgb2Zmc2V0LCBzaXplKTsKIAogICBpZiAobV9wRGF0YUJ1ZikKLSAgICBGWFNZU19tZW1jcHkoYnVmLCBtX3BEYXRhQnVmLmdldCgpICsgb2Zmc2V0LCBzaXplKTsKKyAgICBtZW1jcHkoYnVmLCBtX3BEYXRhQnVmLmdldCgpICsgb2Zmc2V0LCBzaXplKTsKIAogICByZXR1cm4gdHJ1ZTsKIH0KQEAgLTEyNiw4ICsxNDUsMTggQEAKICAgcmV0dXJuIG1fcERpY3QgJiYgbV9wRGljdC0+S2V5RXhpc3QoIkZpbHRlciIpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUERGX1N0cmVhbTo6R2V0VW5pY29kZVRleHQoKSBjb25zdCB7Ci0gIENQREZfU3RyZWFtQWNjIHN0cmVhbTsKLSAgc3RyZWFtLkxvYWRBbGxEYXRhKHRoaXMsIGZhbHNlKTsKLSAgcmV0dXJuIFBERl9EZWNvZGVUZXh0KHN0cmVhbS5HZXREYXRhKCksIHN0cmVhbS5HZXRTaXplKCkpOworV2lkZVN0cmluZyBDUERGX1N0cmVhbTo6R2V0VW5pY29kZVRleHQoKSBjb25zdCB7CisgIGF1dG8gcEFjYyA9IHBkZml1bTo6TWFrZVJldGFpbjxDUERGX1N0cmVhbUFjYz4odGhpcyk7CisgIHBBY2MtPkxvYWRBbGxEYXRhRmlsdGVyZWQoKTsKKyAgcmV0dXJuIFBERl9EZWNvZGVUZXh0KHBBY2MtPkdldERhdGEoKSwgcEFjYy0+R2V0U2l6ZSgpKTsKK30KKworYm9vbCBDUERGX1N0cmVhbTo6V3JpdGVUbyhJRlhfQXJjaGl2ZVN0cmVhbSogYXJjaGl2ZSkgY29uc3QgeworICBpZiAoIUdldERpY3QoKS0+V3JpdGVUbyhhcmNoaXZlKSB8fCAhYXJjaGl2ZS0+V3JpdGVTdHJpbmcoInN0cmVhbVxyXG4iKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYXV0byBwQWNjID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfU3RyZWFtQWNjPih0aGlzKTsKKyAgcEFjYy0+TG9hZEFsbERhdGFSYXcoKTsKKyAgcmV0dXJuIGFyY2hpdmUtPldyaXRlQmxvY2socEFjYy0+R2V0RGF0YSgpLCBwQWNjLT5HZXRTaXplKCkpICYmCisgICAgICAgICBhcmNoaXZlLT5Xcml0ZVN0cmluZygiXHJcbmVuZHN0cmVhbSIpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbS5oIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbS5oCmluZGV4IDkwMmNkNzUuLmY4YjA5YWYgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtLmgKQEAgLTksMTAgKzksMTEgQEAKIAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdC5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmVhbS5oIgogCiBjbGFzcyBDUERGX1N0cmVhbSA6IHB1YmxpYyBDUERGX09iamVjdCB7CiAgcHVibGljOgpAQCAtMjksMjEgKzMwLDI4IEBACiAgIFR5cGUgR2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IENsb25lKCkgY29uc3Qgb3ZlcnJpZGU7CiAgIENQREZfRGljdGlvbmFyeSogR2V0RGljdCgpIGNvbnN0IG92ZXJyaWRlOwotICBDRlhfV2lkZVN0cmluZyBHZXRVbmljb2RlVGV4dCgpIGNvbnN0IG92ZXJyaWRlOworICBXaWRlU3RyaW5nIEdldFVuaWNvZGVUZXh0KCkgY29uc3Qgb3ZlcnJpZGU7CiAgIGJvb2wgSXNTdHJlYW0oKSBjb25zdCBvdmVycmlkZTsKICAgQ1BERl9TdHJlYW0qIEFzU3RyZWFtKCkgb3ZlcnJpZGU7CiAgIGNvbnN0IENQREZfU3RyZWFtKiBBc1N0cmVhbSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIFdyaXRlVG8oSUZYX0FyY2hpdmVTdHJlYW0qIGFyY2hpdmUpIGNvbnN0IG92ZXJyaWRlOwogCiAgIHVpbnQzMl90IEdldFJhd1NpemUoKSBjb25zdCB7IHJldHVybiBtX2R3U2l6ZTsgfQogICB1aW50OF90KiBHZXRSYXdEYXRhKCkgY29uc3QgeyByZXR1cm4gbV9wRGF0YUJ1Zi5nZXQoKTsgfQogCi0gIC8vIERvZXMgbm90IHRha2VzIG9ud2Vyc2hpcCBvZiB8cERhdGF8LCBjb3BpZXMgaW50byBpbnRlcm5hbGx5LW93bmVkIGJ1ZmZlci4KKyAgLy8gRG9lcyBub3QgdGFrZXMgb3duZXJzaGlwIG9mIHxwRGF0YXwsIGNvcGllcyBpbnRvIGludGVybmFsbHktb3duZWQgYnVmZmVyLgogICB2b2lkIFNldERhdGEoY29uc3QgdWludDhfdCogcERhdGEsIHVpbnQzMl90IHNpemUpOworICB2b2lkIFNldERhdGEoc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IHBEYXRhLCB1aW50MzJfdCBzaXplKTsKKyAgdm9pZCBTZXREYXRhKHN0ZDo6b3N0cmluZ3N0cmVhbSogc3RyZWFtKTsKKyAgLy8gU2V0IGRhdGEgYW5kIHJlbW92ZSAiRmlsdGVyIiBhbmQgIkRlY29kZVBhcm1zIiBmaWVsZHMgZnJvbSBzdHJlYW0KKyAgLy8gZGljdGlvbmFyeS4KKyAgdm9pZCBTZXREYXRhQW5kUmVtb3ZlRmlsdGVyKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCB1aW50MzJfdCBzaXplKTsKKyAgdm9pZCBTZXREYXRhQW5kUmVtb3ZlRmlsdGVyKHN0ZDo6b3N0cmluZ3N0cmVhbSogc3RyZWFtKTsKIAogICB2b2lkIEluaXRTdHJlYW0oY29uc3QgdWludDhfdCogcERhdGEsCiAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplLAogICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeT4gcERpY3QpOwotICB2b2lkIEluaXRTdHJlYW1Gcm9tRmlsZShjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZSwKKyAgdm9pZCBJbml0U3RyZWFtRnJvbUZpbGUoY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeT4gcERpY3QpOwogCiAgIGJvb2wgUmVhZFJhd0RhdGEoRlhfRklMRVNJWkUgc3RhcnRfcG9zLApAQCAtNjIsNyArNzAsNyBAQAogICB1aW50MzJfdCBtX2R3U2l6ZSA9IDA7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0RpY3Rpb25hcnk+IG1fcERpY3Q7CiAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90LCBGeEZyZWVEZWxldGVyPiBtX3BEYXRhQnVmOwotICBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IG1fcEZpbGU7CisgIFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBtX3BGaWxlOwogfTsKIAogaW5saW5lIENQREZfU3RyZWFtKiBUb1N0cmVhbShDUERGX09iamVjdCogb2JqKSB7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtX2FjYy5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtX2FjYy5jcHAKaW5kZXggNDIzZGU3Yy4uZDExNWI0OCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbV9hY2MuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW1fYWNjLmNwcApAQCAtOCw1MyArOCw4IEBACiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZS5oIgogCi1DUERGX1N0cmVhbUFjYzo6Q1BERl9TdHJlYW1BY2MoKQotICAgIDogbV9wRGF0YShudWxscHRyKSwKLSAgICAgIG1fZHdTaXplKDApLAotICAgICAgbV9iTmV3QnVmKGZhbHNlKSwKLSAgICAgIG1fcEltYWdlUGFyYW0obnVsbHB0ciksCi0gICAgICBtX3BTdHJlYW0obnVsbHB0ciksCi0gICAgICBtX3BTcmNEYXRhKG51bGxwdHIpIHt9Ci0KLXZvaWQgQ1BERl9TdHJlYW1BY2M6OkxvYWRBbGxEYXRhKGNvbnN0IENQREZfU3RyZWFtKiBwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmF3QWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXN0aW1hdGVkX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJbWFnZUFjYykgewotICBpZiAoIXBTdHJlYW0pCi0gICAgcmV0dXJuOwotCi0gIG1fcFN0cmVhbSA9IHBTdHJlYW07Ci0gIGlmIChwU3RyZWFtLT5Jc01lbW9yeUJhc2VkKCkgJiYgKCFwU3RyZWFtLT5IYXNGaWx0ZXIoKSB8fCBiUmF3QWNjZXNzKSkgewotICAgIG1fZHdTaXplID0gcFN0cmVhbS0+R2V0UmF3U2l6ZSgpOwotICAgIG1fcERhdGEgPSBwU3RyZWFtLT5HZXRSYXdEYXRhKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHVpbnQzMl90IGR3U3JjU2l6ZSA9IHBTdHJlYW0tPkdldFJhd1NpemUoKTsKLSAgaWYgKGR3U3JjU2l6ZSA9PSAwKQotICAgIHJldHVybjsKLQotICB1aW50OF90KiBwU3JjRGF0YTsKLSAgaWYgKCFwU3RyZWFtLT5Jc01lbW9yeUJhc2VkKCkpIHsKLSAgICBwU3JjRGF0YSA9IG1fcFNyY0RhdGEgPSBGWF9BbGxvYyh1aW50OF90LCBkd1NyY1NpemUpOwotICAgIGlmICghcFN0cmVhbS0+UmVhZFJhd0RhdGEoMCwgcFNyY0RhdGEsIGR3U3JjU2l6ZSkpCi0gICAgICByZXR1cm47Ci0gIH0gZWxzZSB7Ci0gICAgcFNyY0RhdGEgPSBwU3RyZWFtLT5HZXRSYXdEYXRhKCk7Ci0gIH0KLSAgaWYgKCFwU3RyZWFtLT5IYXNGaWx0ZXIoKSB8fCBiUmF3QWNjZXNzKSB7Ci0gICAgbV9wRGF0YSA9IHBTcmNEYXRhOwotICAgIG1fZHdTaXplID0gZHdTcmNTaXplOwotICB9IGVsc2UgaWYgKCFQREZfRGF0YURlY29kZShwU3JjRGF0YSwgZHdTcmNTaXplLCBtX3BTdHJlYW0tPkdldERpY3QoKSwgbV9wRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd1NpemUsIG1fSW1hZ2VEZWNvZGVyLCBtX3BJbWFnZVBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZWRfc2l6ZSwgYkltYWdlQWNjKSkgewotICAgIG1fcERhdGEgPSBwU3JjRGF0YTsKLSAgICBtX2R3U2l6ZSA9IGR3U3JjU2l6ZTsKLSAgfQotICBpZiAocFNyY0RhdGEgIT0gcFN0cmVhbS0+R2V0UmF3RGF0YSgpICYmIHBTcmNEYXRhICE9IG1fcERhdGEpCi0gICAgRlhfRnJlZShwU3JjRGF0YSk7Ci0gIG1fcFNyY0RhdGEgPSBudWxscHRyOwotICBtX2JOZXdCdWYgPSBtX3BEYXRhICE9IHBTdHJlYW0tPkdldFJhd0RhdGEoKTsKLX0KK0NQREZfU3RyZWFtQWNjOjpDUERGX1N0cmVhbUFjYyhjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSkKKyAgICA6IG1fcFN0cmVhbShwU3RyZWFtKSB7fQogCiBDUERGX1N0cmVhbUFjYzo6fkNQREZfU3RyZWFtQWNjKCkgewogICBpZiAobV9iTmV3QnVmKQpAQCAtNjIsMTAgKzE3LDYzIEBACiAgIEZYX0ZyZWUobV9wU3JjRGF0YSk7CiB9CiAKK3ZvaWQgQ1BERl9TdHJlYW1BY2M6OkxvYWRBbGxEYXRhKGJvb2wgYlJhd0FjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGVzdGltYXRlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSW1hZ2VBY2MpIHsKKyAgaWYgKCFtX3BTdHJlYW0pCisgICAgcmV0dXJuOworCisgIGJvb2wgYlByb2Nlc3NSYXdEYXRhID0gYlJhd0FjY2VzcyB8fCAhbV9wU3RyZWFtLT5IYXNGaWx0ZXIoKTsKKyAgaWYgKGJQcm9jZXNzUmF3RGF0YSAmJiBtX3BTdHJlYW0tPklzTWVtb3J5QmFzZWQoKSkgeworICAgIG1fZHdTaXplID0gbV9wU3RyZWFtLT5HZXRSYXdTaXplKCk7CisgICAgbV9wRGF0YSA9IG1fcFN0cmVhbS0+R2V0UmF3RGF0YSgpOworICAgIHJldHVybjsKKyAgfQorICB1aW50MzJfdCBkd1NyY1NpemUgPSBtX3BTdHJlYW0tPkdldFJhd1NpemUoKTsKKyAgaWYgKGR3U3JjU2l6ZSA9PSAwKQorICAgIHJldHVybjsKKworICB1aW50OF90KiBwU3JjRGF0YTsKKyAgaWYgKG1fcFN0cmVhbS0+SXNNZW1vcnlCYXNlZCgpKSB7CisgICAgcFNyY0RhdGEgPSBtX3BTdHJlYW0tPkdldFJhd0RhdGEoKTsKKyAgfSBlbHNlIHsKKyAgICBwU3JjRGF0YSA9IG1fcFNyY0RhdGEgPSBGWF9BbGxvYyh1aW50OF90LCBkd1NyY1NpemUpOworICAgIGlmICghbV9wU3RyZWFtLT5SZWFkUmF3RGF0YSgwLCBwU3JjRGF0YSwgZHdTcmNTaXplKSkKKyAgICAgIHJldHVybjsKKyAgfQorICBpZiAoYlByb2Nlc3NSYXdEYXRhKSB7CisgICAgbV9wRGF0YSA9IHBTcmNEYXRhOworICAgIG1fZHdTaXplID0gZHdTcmNTaXplOworICB9IGVsc2UgaWYgKCFQREZfRGF0YURlY29kZShwU3JjRGF0YSwgZHdTcmNTaXplLCBtX3BTdHJlYW0tPkdldERpY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVkX3NpemUsIGJJbWFnZUFjYywgJm1fcERhdGEsICZtX2R3U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fSW1hZ2VEZWNvZGVyLCAmbV9wSW1hZ2VQYXJhbSkpIHsKKyAgICBtX3BEYXRhID0gcFNyY0RhdGE7CisgICAgbV9kd1NpemUgPSBkd1NyY1NpemU7CisgIH0KKyAgaWYgKHBTcmNEYXRhICE9IG1fcFN0cmVhbS0+R2V0UmF3RGF0YSgpICYmIHBTcmNEYXRhICE9IG1fcERhdGEpCisgICAgRlhfRnJlZShwU3JjRGF0YSk7CisgIG1fcFNyY0RhdGEgPSBudWxscHRyOworICBtX2JOZXdCdWYgPSBtX3BEYXRhICE9IG1fcFN0cmVhbS0+R2V0UmF3RGF0YSgpOworfQorCit2b2lkIENQREZfU3RyZWFtQWNjOjpMb2FkQWxsRGF0YUZpbHRlcmVkKCkgeworICBMb2FkQWxsRGF0YShmYWxzZSwgMCwgZmFsc2UpOworfQorCit2b2lkIENQREZfU3RyZWFtQWNjOjpMb2FkQWxsRGF0YVJhdygpIHsKKyAgTG9hZEFsbERhdGEodHJ1ZSwgMCwgZmFsc2UpOworfQorCitDUERGX0RpY3Rpb25hcnkqIENQREZfU3RyZWFtQWNjOjpHZXREaWN0KCkgY29uc3QgeworICByZXR1cm4gbV9wU3RyZWFtID8gbV9wU3RyZWFtLT5HZXREaWN0KCkgOiBudWxscHRyOworfQorCiBjb25zdCB1aW50OF90KiBDUERGX1N0cmVhbUFjYzo6R2V0RGF0YSgpIGNvbnN0IHsKLSAgaWYgKG1fYk5ld0J1ZikKLSAgICByZXR1cm4gbV9wRGF0YTsKLSAgcmV0dXJuIG1fcFN0cmVhbSA/IG1fcFN0cmVhbS0+R2V0UmF3RGF0YSgpIDogbnVsbHB0cjsKKyAgcmV0dXJuIEdldERhdGFIZWxwZXIoKTsKK30KKwordWludDhfdCogQ1BERl9TdHJlYW1BY2M6OkdldERhdGEoKSB7CisgIHJldHVybiBHZXREYXRhSGVscGVyKCk7CiB9CiAKIHVpbnQzMl90IENQREZfU3RyZWFtQWNjOjpHZXRTaXplKCkgY29uc3QgewpAQCAtODIsNiArOTAsMTIgQEAKICAgICByZXR1cm4gcDsKICAgfQogICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4gcChGWF9BbGxvYyh1aW50OF90LCBtX2R3U2l6ZSkpOwotICBGWFNZU19tZW1jcHkocC5nZXQoKSwgbV9wRGF0YSwgbV9kd1NpemUpOworICBtZW1jcHkocC5nZXQoKSwgbV9wRGF0YSwgbV9kd1NpemUpOwogICByZXR1cm4gcDsKIH0KKwordWludDhfdCogQ1BERl9TdHJlYW1BY2M6OkdldERhdGFIZWxwZXIoKSBjb25zdCB7CisgIGlmIChtX2JOZXdCdWYpCisgICAgcmV0dXJuIG1fcERhdGE7CisgIHJldHVybiBtX3BTdHJlYW0gPyBtX3BTdHJlYW0tPkdldFJhd0RhdGEoKSA6IG51bGxwdHI7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtX2FjYy5oIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbV9hY2MuaAppbmRleCA1MWE4YTE4Li5kNTRlMDAwIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtX2FjYy5oCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW1fYWNjLmgKQEAgLTEzLDM5ICsxMyw0NCBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCiAKLWNsYXNzIENQREZfU3RyZWFtQWNjIHsKK2NsYXNzIENQREZfU3RyZWFtQWNjIDogcHVibGljIFJldGFpbmFibGUgewogIHB1YmxpYzoKLSAgQ1BERl9TdHJlYW1BY2MoKTsKLSAgfkNQREZfU3RyZWFtQWNjKCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgorICBmcmllbmQgUmV0YWluUHRyPFQ+IHBkZml1bTo6TWFrZVJldGFpbihBcmdzJiYuLi4gYXJncyk7CiAKICAgQ1BERl9TdHJlYW1BY2MoY29uc3QgQ1BERl9TdHJlYW1BY2MmKSA9IGRlbGV0ZTsKICAgQ1BERl9TdHJlYW1BY2MmIG9wZXJhdG9yPShjb25zdCBDUERGX1N0cmVhbUFjYyYpID0gZGVsZXRlOwogCi0gIHZvaWQgTG9hZEFsbERhdGEoY29uc3QgQ1BERl9TdHJlYW0qIHBTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgYm9vbCBiUmF3QWNjZXNzID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXN0aW1hdGVkX3NpemUgPSAwLAotICAgICAgICAgICAgICAgICAgIGJvb2wgYkltYWdlQWNjID0gZmFsc2UpOworICB2b2lkIExvYWRBbGxEYXRhKGJvb2wgYlJhd0FjY2VzcywgdWludDMyX3QgZXN0aW1hdGVkX3NpemUsIGJvb2wgYkltYWdlQWNjKTsKKyAgdm9pZCBMb2FkQWxsRGF0YUZpbHRlcmVkKCk7CisgIHZvaWQgTG9hZEFsbERhdGFSYXcoKTsKIAotICBjb25zdCBDUERGX1N0cmVhbSogR2V0U3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbV9wU3RyZWFtOyB9Ci0gIENQREZfRGljdGlvbmFyeSogR2V0RGljdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbV9wU3RyZWFtID8gbV9wU3RyZWFtLT5HZXREaWN0KCkgOiBudWxscHRyOwotICB9CisgIGNvbnN0IENQREZfU3RyZWFtKiBHZXRTdHJlYW0oKSBjb25zdCB7IHJldHVybiBtX3BTdHJlYW0uR2V0KCk7IH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXREaWN0KCkgY29uc3Q7CiAKICAgY29uc3QgdWludDhfdCogR2V0RGF0YSgpIGNvbnN0OworICB1aW50OF90KiBHZXREYXRhKCk7CiAgIHVpbnQzMl90IEdldFNpemUoKSBjb25zdDsKLSAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIEdldEltYWdlRGVjb2RlcigpIGNvbnN0IHsgcmV0dXJuIG1fSW1hZ2VEZWNvZGVyOyB9CisgIGNvbnN0IEJ5dGVTdHJpbmcmIEdldEltYWdlRGVjb2RlcigpIGNvbnN0IHsgcmV0dXJuIG1fSW1hZ2VEZWNvZGVyOyB9CiAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogR2V0SW1hZ2VQYXJhbSgpIGNvbnN0IHsgcmV0dXJuIG1fcEltYWdlUGFyYW07IH0KICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IERldGFjaERhdGEoKTsKIAogIHByb3RlY3RlZDoKLSAgdWludDhfdCogbV9wRGF0YTsKLSAgdWludDMyX3QgbV9kd1NpemU7Ci0gIGJvb2wgbV9iTmV3QnVmOwotICBDRlhfQnl0ZVN0cmluZyBtX0ltYWdlRGVjb2RlcjsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BJbWFnZVBhcmFtOwotICBjb25zdCBDUERGX1N0cmVhbSogbV9wU3RyZWFtOwotICB1aW50OF90KiBtX3BTcmNEYXRhOworICBleHBsaWNpdCBDUERGX1N0cmVhbUFjYyhjb25zdCBDUERGX1N0cmVhbSogcFN0cmVhbSk7CisgIH5DUERGX1N0cmVhbUFjYygpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgdWludDhfdCogR2V0RGF0YUhlbHBlcigpIGNvbnN0OworCisgIHVpbnQ4X3QqIG1fcERhdGEgPSBudWxscHRyOworICB1aW50MzJfdCBtX2R3U2l6ZSA9IDA7CisgIGJvb2wgbV9iTmV3QnVmID0gZmFsc2U7CisgIEJ5dGVTdHJpbmcgbV9JbWFnZURlY29kZXI7CisgIENQREZfRGljdGlvbmFyeSogbV9wSW1hZ2VQYXJhbSA9IG51bGxwdHI7CisgIFVub3duZWRQdHI8Y29uc3QgQ1BERl9TdHJlYW0+IGNvbnN0IG1fcFN0cmVhbTsKKyAgdWludDhfdCogbV9wU3JjRGF0YSA9IG51bGxwdHI7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9QQVJTRVJfQ1BERl9TVFJFQU1fQUNDX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyaW5nLmNwcCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJpbmcuY3BwCmluZGV4IDA2YmFlNTQuLjg1MTQ0MmUgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJpbmcuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJpbmcuY3BwCkBAIC05LDIwICs5LDIwIEBACiAjaW5jbHVkZSA8dXRpbGl0eT4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJlYW0uaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKIENQREZfU3RyaW5nOjpDUERGX1N0cmluZygpIDogbV9iSGV4KGZhbHNlKSB7fQogCi1DUERGX1N0cmluZzo6Q1BERl9TdHJpbmcoQ0ZYX1dlYWtQdHI8Q0ZYX0J5dGVTdHJpbmdQb29sPiBwUG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyLAorQ1BERl9TdHJpbmc6OkNQREZfU3RyaW5nKFdlYWtQdHI8Qnl0ZVN0cmluZ1Bvb2w+IHBQb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIHN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJIZXgpCiAgICAgOiBtX1N0cmluZyhzdHIpLCBtX2JIZXgoYkhleCkgewogICBpZiAocFBvb2wpCiAgICAgbV9TdHJpbmcgPSBwUG9vbC0+SW50ZXJuKG1fU3RyaW5nKTsKIH0KIAotQ1BERl9TdHJpbmc6OkNQREZfU3RyaW5nKENGWF9XZWFrUHRyPENGWF9CeXRlU3RyaW5nUG9vbD4gcFBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikKK0NQREZfU3RyaW5nOjpDUERGX1N0cmluZyhXZWFrUHRyPEJ5dGVTdHJpbmdQb29sPiBwUG9vbCwgY29uc3QgV2lkZVN0cmluZyYgc3RyKQogICAgIDogbV9TdHJpbmcoUERGX0VuY29kZVRleHQoc3RyKSksIG1fYkhleChmYWxzZSkgewogICBpZiAocFBvb2wpCiAgICAgbV9TdHJpbmcgPSBwUG9vbC0+SW50ZXJuKG1fU3RyaW5nKTsKQEAgLTQxLDExICs0MSwxMSBAQAogICByZXR1cm4gc3RkOjptb3ZlKHBSZXQpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUERGX1N0cmluZzo6R2V0U3RyaW5nKCkgY29uc3QgeworQnl0ZVN0cmluZyBDUERGX1N0cmluZzo6R2V0U3RyaW5nKCkgY29uc3QgewogICByZXR1cm4gbV9TdHJpbmc7CiB9CiAKLXZvaWQgQ1BERl9TdHJpbmc6OlNldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKSB7Cit2b2lkIENQREZfU3RyaW5nOjpTZXRTdHJpbmcoY29uc3QgQnl0ZVN0cmluZyYgc3RyKSB7CiAgIG1fU3RyaW5nID0gc3RyOwogfQogCkBAIC02MSw2ICs2MSwxMSBAQAogICByZXR1cm4gdGhpczsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9TdHJpbmc6OkdldFVuaWNvZGVUZXh0KCkgY29uc3QgeworV2lkZVN0cmluZyBDUERGX1N0cmluZzo6R2V0VW5pY29kZVRleHQoKSBjb25zdCB7CiAgIHJldHVybiBQREZfRGVjb2RlVGV4dChtX1N0cmluZyk7CiB9CisKK2Jvb2wgQ1BERl9TdHJpbmc6OldyaXRlVG8oSUZYX0FyY2hpdmVTdHJlYW0qIGFyY2hpdmUpIGNvbnN0IHsKKyAgcmV0dXJuIGFyY2hpdmUtPldyaXRlU3RyaW5nKAorICAgICAgUERGX0VuY29kZVN0cmluZyhHZXRTdHJpbmcoKSwgSXNIZXgoKSkuQXNTdHJpbmdWaWV3KCkpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmluZy5oIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmluZy5oCmluZGV4IDY2OThkOGMuLmI2YWFhY2IgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJpbmcuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyaW5nLmgKQEAgLTEwLDM0ICsxMCwzMyBAQAogI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3QuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9zdHJpbmdfcG9vbF90ZW1wbGF0ZS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3dlYWtfcHRyLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvc3RyaW5nX3Bvb2xfdGVtcGxhdGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3dlYWtfcHRyLmgiCiAKIGNsYXNzIENQREZfU3RyaW5nIDogcHVibGljIENQREZfT2JqZWN0IHsKICBwdWJsaWM6CiAgIENQREZfU3RyaW5nKCk7Ci0gIENQREZfU3RyaW5nKENGWF9XZWFrUHRyPENGWF9CeXRlU3RyaW5nUG9vbD4gcFBvb2wsCi0gICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIsCi0gICAgICAgICAgICAgIGJvb2wgYkhleCk7Ci0gIENQREZfU3RyaW5nKENGWF9XZWFrUHRyPENGWF9CeXRlU3RyaW5nUG9vbD4gcFBvb2wsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOworICBDUERGX1N0cmluZyhXZWFrUHRyPEJ5dGVTdHJpbmdQb29sPiBwUG9vbCwgY29uc3QgQnl0ZVN0cmluZyYgc3RyLCBib29sIGJIZXgpOworICBDUERGX1N0cmluZyhXZWFrUHRyPEJ5dGVTdHJpbmdQb29sPiBwUG9vbCwgY29uc3QgV2lkZVN0cmluZyYgc3RyKTsKICAgfkNQREZfU3RyaW5nKCkgb3ZlcnJpZGU7CiAKICAgLy8gQ1BERl9PYmplY3Q6CiAgIFR5cGUgR2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IENsb25lKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIENGWF9CeXRlU3RyaW5nIEdldFN0cmluZygpIGNvbnN0IG92ZXJyaWRlOwotICBDRlhfV2lkZVN0cmluZyBHZXRVbmljb2RlVGV4dCgpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIFNldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKSBvdmVycmlkZTsKKyAgQnl0ZVN0cmluZyBHZXRTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgV2lkZVN0cmluZyBHZXRVbmljb2RlVGV4dCgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIFNldFN0cmluZyhjb25zdCBCeXRlU3RyaW5nJiBzdHIpIG92ZXJyaWRlOwogICBib29sIElzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CiAgIENQREZfU3RyaW5nKiBBc1N0cmluZygpIG92ZXJyaWRlOwogICBjb25zdCBDUERGX1N0cmluZyogQXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBXcml0ZVRvKElGWF9BcmNoaXZlU3RyZWFtKiBhcmNoaXZlKSBjb25zdCBvdmVycmlkZTsKIAogICBib29sIElzSGV4KCkgY29uc3QgeyByZXR1cm4gbV9iSGV4OyB9CiAKICBwcm90ZWN0ZWQ6Ci0gIENGWF9CeXRlU3RyaW5nIG1fU3RyaW5nOworICBCeXRlU3RyaW5nIG1fU3RyaW5nOwogICBib29sIG1fYkhleDsKIH07CiAKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zeW50YXhfcGFyc2VyLmNwcCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zeW50YXhfcGFyc2VyLmNwcAppbmRleCAxYjgxYjk4Li42NmNlMTgzIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3ludGF4X3BhcnNlci5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N5bnRheF9wYXJzZXIuY3BwCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zeW50YXhfcGFyc2VyLmgiCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIApAQCAtMTgsMTIgKzE5LDE1IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX25hbWUuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbnVsbC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9udW1iZXIuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVhZF92YWxpZGF0b3IuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVmZXJlbmNlLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJpbmcuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfdXRpbGl0eS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9hdXRvcmVzdG9yZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9iaW5hcnlidWYuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9tYXRoLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogCkBAIC0zNywzNyArNDEsMzQgQEAKIGludCBDUERGX1N5bnRheFBhcnNlcjo6c19DdXJyZW50UmVjdXJzaW9uRGVwdGggPSAwOwogCiBDUERGX1N5bnRheFBhcnNlcjo6Q1BERl9TeW50YXhQYXJzZXIoKQotICAgIDogQ1BERl9TeW50YXhQYXJzZXIoQ0ZYX1dlYWtQdHI8Q0ZYX0J5dGVTdHJpbmdQb29sPigpKSB7fQorICAgIDogQ1BERl9TeW50YXhQYXJzZXIoV2Vha1B0cjxCeXRlU3RyaW5nUG9vbD4oKSkge30KIAotQ1BERl9TeW50YXhQYXJzZXI6OkNQREZfU3ludGF4UGFyc2VyKAotICAgIGNvbnN0IENGWF9XZWFrUHRyPENGWF9CeXRlU3RyaW5nUG9vbD4mIHBQb29sKQotICAgIDogbV9NZXRhZGF0YU9iam51bSgwKSwKLSAgICAgIG1fcEZpbGVBY2Nlc3MobnVsbHB0ciksCi0gICAgICBtX3BGaWxlQnVmKG51bGxwdHIpLAotICAgICAgbV9CdWZTaXplKENQREZfTW9kdWxlTWdyOjprRmlsZUJ1ZlNpemUpLAotICAgICAgbV9wUG9vbChwUG9vbCkge30KK0NQREZfU3ludGF4UGFyc2VyOjpDUERGX1N5bnRheFBhcnNlcihjb25zdCBXZWFrUHRyPEJ5dGVTdHJpbmdQb29sPiYgcFBvb2wpCisgICAgOiBtX3BGaWxlQWNjZXNzKG51bGxwdHIpLCBtX3BQb29sKHBQb29sKSB7fQogCiBDUERGX1N5bnRheFBhcnNlcjo6fkNQREZfU3ludGF4UGFyc2VyKCkgewotICBGWF9GcmVlKG1fcEZpbGVCdWYpOwogfQogCiBib29sIENQREZfU3ludGF4UGFyc2VyOjpHZXRDaGFyQXQoRlhfRklMRVNJWkUgcG9zLCB1aW50OF90JiBjaCkgewotICBDRlhfQXV0b1Jlc3RvcmVyPEZYX0ZJTEVTSVpFPiBzYXZlX3BvcygmbV9Qb3MpOworICBBdXRvUmVzdG9yZXI8RlhfRklMRVNJWkU+IHNhdmVfcG9zKCZtX1Bvcyk7CiAgIG1fUG9zID0gcG9zOwogICByZXR1cm4gR2V0TmV4dENoYXIoY2gpOwogfQogCi1ib29sIENQREZfU3ludGF4UGFyc2VyOjpSZWFkQ2hhcihGWF9GSUxFU0laRSByZWFkX3BvcywgdWludDMyX3QgcmVhZF9zaXplKSB7Ci0gIGlmIChzdGF0aWNfY2FzdDxGWF9GSUxFU0laRT4ocmVhZF9wb3MgKyByZWFkX3NpemUpID4gbV9GaWxlTGVuKSB7Ci0gICAgaWYgKG1fRmlsZUxlbiA8IHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihyZWFkX3NpemUpKSB7Ci0gICAgICByZWFkX3BvcyA9IDA7Ci0gICAgICByZWFkX3NpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obV9GaWxlTGVuKTsKLSAgICB9IGVsc2UgewotICAgICAgcmVhZF9wb3MgPSBtX0ZpbGVMZW4gLSByZWFkX3NpemU7Ci0gICAgfQotICB9Ci0gIGlmICghbV9wRmlsZUFjY2Vzcy0+UmVhZEJsb2NrKG1fcEZpbGVCdWYsIHJlYWRfcG9zLCByZWFkX3NpemUpKQorYm9vbCBDUERGX1N5bnRheFBhcnNlcjo6UmVhZEJsb2NrQXQoRlhfRklMRVNJWkUgcmVhZF9wb3MpIHsKKyAgaWYgKHJlYWRfcG9zID49IG1fRmlsZUxlbikKICAgICByZXR1cm4gZmFsc2U7CisgIHNpemVfdCByZWFkX3NpemUgPSBDUERGX01vZHVsZU1ncjo6a0ZpbGVCdWZTaXplOworICBGWF9TQUZFX0ZJTEVTSVpFIHNhZmVfZW5kID0gcmVhZF9wb3M7CisgIHNhZmVfZW5kICs9IHJlYWRfc2l6ZTsKKyAgaWYgKCFzYWZlX2VuZC5Jc1ZhbGlkKCkgfHwgc2FmZV9lbmQuVmFsdWVPckRpZSgpID4gbV9GaWxlTGVuKQorICAgIHJlYWRfc2l6ZSA9IG1fRmlsZUxlbiAtIHJlYWRfcG9zOworCisgIG1fcEZpbGVCdWYucmVzaXplKHJlYWRfc2l6ZSk7CisgIGlmICghbV9wRmlsZUFjY2Vzcy0+UmVhZEJsb2NrKG1fcEZpbGVCdWYuZGF0YSgpLCByZWFkX3BvcywgcmVhZF9zaXplKSkgeworICAgIG1fcEZpbGVCdWYuY2xlYXIoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KIAogICBtX0J1Zk9mZnNldCA9IHJlYWRfcG9zOwogICByZXR1cm4gdHJ1ZTsKQEAgLTc4LDM0ICs3OSwyNyBAQAogICBpZiAocG9zID49IG1fRmlsZUxlbikKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgaWYgKENoZWNrUG9zaXRpb24ocG9zKSkgewotICAgIEZYX0ZJTEVTSVpFIHJlYWRfcG9zID0gcG9zOwotICAgIHVpbnQzMl90IHJlYWRfc2l6ZSA9IG1fQnVmU2l6ZTsKLSAgICByZWFkX3NpemUgPSBzdGQ6Om1pbihyZWFkX3NpemUsIHN0YXRpY19jYXN0PHVpbnQzMl90PihtX0ZpbGVMZW4pKTsKLSAgICBpZiAoIVJlYWRDaGFyKHJlYWRfcG9zLCByZWFkX3NpemUpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9CisgIGlmICghSXNQb3NpdGlvblJlYWQocG9zKSAmJiAhUmVhZEJsb2NrQXQocG9zKSkKKyAgICByZXR1cm4gZmFsc2U7CisKICAgY2ggPSBtX3BGaWxlQnVmW3BvcyAtIG1fQnVmT2Zmc2V0XTsKICAgbV9Qb3MrKzsKICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQ1BERl9TeW50YXhQYXJzZXI6OkdldENoYXJBdEJhY2t3YXJkKEZYX0ZJTEVTSVpFIHBvcywgdWludDhfdCYgY2gpIHsKK2Jvb2wgQ1BERl9TeW50YXhQYXJzZXI6OkdldENoYXJBdEJhY2t3YXJkKEZYX0ZJTEVTSVpFIHBvcywgdWludDhfdCogY2gpIHsKICAgcG9zICs9IG1fSGVhZGVyT2Zmc2V0OwogICBpZiAocG9zID49IG1fRmlsZUxlbikKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgaWYgKENoZWNrUG9zaXRpb24ocG9zKSkgewotICAgIEZYX0ZJTEVTSVpFIHJlYWRfcG9zOwotICAgIGlmIChwb3MgPCBzdGF0aWNfY2FzdDxGWF9GSUxFU0laRT4obV9CdWZTaXplKSkKLSAgICAgIHJlYWRfcG9zID0gMDsKLSAgICBlbHNlCi0gICAgICByZWFkX3BvcyA9IHBvcyAtIG1fQnVmU2l6ZSArIDE7Ci0gICAgdWludDMyX3QgcmVhZF9zaXplID0gbV9CdWZTaXplOwotICAgIGlmICghUmVhZENoYXIocmVhZF9wb3MsIHJlYWRfc2l6ZSkpCisgIGlmICghSXNQb3NpdGlvblJlYWQocG9zKSkgeworICAgIEZYX0ZJTEVTSVpFIGJsb2NrX3N0YXJ0ID0gMDsKKyAgICBpZiAocG9zID49IENQREZfTW9kdWxlTWdyOjprRmlsZUJ1ZlNpemUpCisgICAgICBibG9ja19zdGFydCA9IHBvcyAtIENQREZfTW9kdWxlTWdyOjprRmlsZUJ1ZlNpemUgKyAxOworICAgIGlmICghUmVhZEJsb2NrQXQoYmxvY2tfc3RhcnQpIHx8ICFJc1Bvc2l0aW9uUmVhZChwb3MpKQogICAgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIGNoID0gbV9wRmlsZUJ1Zltwb3MgLSBtX0J1Zk9mZnNldF07CisgICpjaCA9IG1fcEZpbGVCdWZbcG9zIC0gbV9CdWZPZmZzZXRdOwogICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMTIxLDI3ICsxMTUsMTEgQEAKICAgaWYgKGJJc051bWJlcikKICAgICAqYklzTnVtYmVyID0gdHJ1ZTsKIAorICBUb05leHRXb3JkKCk7CiAgIHVpbnQ4X3QgY2g7CiAgIGlmICghR2V0TmV4dENoYXIoY2gpKQogICAgIHJldHVybjsKIAotICB3aGlsZSAoMSkgewotICAgIHdoaWxlIChQREZDaGFySXNXaGl0ZXNwYWNlKGNoKSkgewotICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoY2ggIT0gJyUnKQotICAgICAgYnJlYWs7Ci0KLSAgICB3aGlsZSAoMSkgewotICAgICAgaWYgKCFHZXROZXh0Q2hhcihjaCkpCi0gICAgICAgIHJldHVybjsKLSAgICAgIGlmIChQREZDaGFySXNMaW5lRW5kaW5nKGNoKSkKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KICAgaWYgKFBERkNoYXJJc0RlbGltaXRlcihjaCkpIHsKICAgICBpZiAoYklzTnVtYmVyKQogICAgICAgKmJJc051bWJlciA9IGZhbHNlOwpAQCAtMTk5LDEyICsxNzcsMTIgQEAKICAgfQogfQogCi1DRlhfQnl0ZVN0cmluZyBDUERGX1N5bnRheFBhcnNlcjo6UmVhZFN0cmluZygpIHsKK0J5dGVTdHJpbmcgQ1BERl9TeW50YXhQYXJzZXI6OlJlYWRTdHJpbmcoKSB7CiAgIHVpbnQ4X3QgY2g7CiAgIGlmICghR2V0TmV4dENoYXIoY2gpKQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CiAKLSAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGJ1ZjsKICAgaW50MzJfdCBwYXJsZXZlbCA9IDA7CiAgIFJlYWRTdGF0dXMgc3RhdHVzID0gUmVhZFN0YXR1czo6Tm9ybWFsOwogICBpbnQzMl90IGlFc2NDb2RlID0gMDsKQEAgLTIxMyw3ICsxOTEsNyBAQAogICAgICAgY2FzZSBSZWFkU3RhdHVzOjpOb3JtYWw6CiAgICAgICAgIGlmIChjaCA9PSAnKScpIHsKICAgICAgICAgICBpZiAocGFybGV2ZWwgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBidWYuTWFrZVN0cmluZygpOworICAgICAgICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcoYnVmKTsKICAgICAgICAgICBwYXJsZXZlbC0tOwogICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcoJykgewogICAgICAgICAgIHBhcmxldmVsKys7CkBAIC0yMjEsNDAgKzE5OSw0MSBAQAogICAgICAgICBpZiAoY2ggPT0gJ1xcJykKICAgICAgICAgICBzdGF0dXMgPSBSZWFkU3RhdHVzOjpCYWNrc2xhc2g7CiAgICAgICAgIGVsc2UKLSAgICAgICAgICBidWYuQXBwZW5kQ2hhcihjaCk7CisgICAgICAgICAgYnVmIDw8IHN0YXRpY19jYXN0PGNoYXI+KGNoKTsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIFJlYWRTdGF0dXM6OkJhY2tzbGFzaDoKICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnNycpIHsKLSAgICAgICAgICBpRXNjQ29kZSA9IEZYU1lTX3RvRGVjaW1hbERpZ2l0KHN0YXRpY19jYXN0PEZYX1dDSEFSPihjaCkpOworICAgICAgICAgIGlFc2NDb2RlID0gRlhTWVNfRGVjaW1hbENoYXJUb0ludChzdGF0aWNfY2FzdDx3Y2hhcl90PihjaCkpOwogICAgICAgICAgIHN0YXR1cyA9IFJlYWRTdGF0dXM6Ok9jdGFsOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGNoID09ICduJykgewotICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdcbicpOwotICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdyJykgewotICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdccicpOwotICAgICAgICB9IGVsc2UgaWYgKGNoID09ICd0JykgewotICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdcdCcpOwotICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdiJykgewotICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdcYicpOwotICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdmJykgewotICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKCdcZicpOwotICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdccicpIHsKKyAgICAgICAgaWYgKGNoID09ICdccicpIHsKICAgICAgICAgICBzdGF0dXMgPSBSZWFkU3RhdHVzOjpDYXJyaWFnZVJldHVybjsKICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2ggPT0gJ24nKSB7CisgICAgICAgICAgYnVmIDw8ICdcbic7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ3InKSB7CisgICAgICAgICAgYnVmIDw8ICdccic7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ3QnKSB7CisgICAgICAgICAgYnVmIDw8ICdcdCc7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ2InKSB7CisgICAgICAgICAgYnVmIDw8ICdcYic7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ2YnKSB7CisgICAgICAgICAgYnVmIDw8ICdcZic7CiAgICAgICAgIH0gZWxzZSBpZiAoY2ggIT0gJ1xuJykgewotICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKGNoKTsKKyAgICAgICAgICBidWYgPDwgc3RhdGljX2Nhc3Q8Y2hhcj4oY2gpOwogICAgICAgICB9CiAgICAgICAgIHN0YXR1cyA9IFJlYWRTdGF0dXM6Ok5vcm1hbDsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIFJlYWRTdGF0dXM6Ok9jdGFsOgogICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc3JykgewogICAgICAgICAgIGlFc2NDb2RlID0KLSAgICAgICAgICAgICAgaUVzY0NvZGUgKiA4ICsgRlhTWVNfdG9EZWNpbWFsRGlnaXQoc3RhdGljX2Nhc3Q8RlhfV0NIQVI+KGNoKSk7CisgICAgICAgICAgICAgIGlFc2NDb2RlICogOCArIEZYU1lTX0RlY2ltYWxDaGFyVG9JbnQoc3RhdGljX2Nhc3Q8d2NoYXJfdD4oY2gpKTsKICAgICAgICAgICBzdGF0dXMgPSBSZWFkU3RhdHVzOjpGaW5pc2hPY3RhbDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBidWYuQXBwZW5kQ2hhcihpRXNjQ29kZSk7CisgICAgICAgICAgYnVmIDw8IHN0YXRpY19jYXN0PGNoYXI+KGlFc2NDb2RlKTsKICAgICAgICAgICBzdGF0dXMgPSBSZWFkU3RhdHVzOjpOb3JtYWw7CiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KQEAgLTI2MywxMCArMjQyLDEwIEBACiAgICAgICAgIHN0YXR1cyA9IFJlYWRTdGF0dXM6Ok5vcm1hbDsKICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnNycpIHsKICAgICAgICAgICBpRXNjQ29kZSA9Ci0gICAgICAgICAgICAgIGlFc2NDb2RlICogOCArIEZYU1lTX3RvRGVjaW1hbERpZ2l0KHN0YXRpY19jYXN0PEZYX1dDSEFSPihjaCkpOwotICAgICAgICAgIGJ1Zi5BcHBlbmRDaGFyKGlFc2NDb2RlKTsKKyAgICAgICAgICAgICAgaUVzY0NvZGUgKiA4ICsgRlhTWVNfRGVjaW1hbENoYXJUb0ludChzdGF0aWNfY2FzdDx3Y2hhcl90PihjaCkpOworICAgICAgICAgIGJ1ZiA8PCBzdGF0aWNfY2FzdDxjaGFyPihpRXNjQ29kZSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYnVmLkFwcGVuZENoYXIoaUVzY0NvZGUpOworICAgICAgICAgIGJ1ZiA8PCBzdGF0aWNfY2FzdDxjaGFyPihpRXNjQ29kZSk7CiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CkBAIC0yODIsMTUgKzI2MSwxNSBAQAogICB9CiAKICAgR2V0TmV4dENoYXIoY2gpOwotICByZXR1cm4gYnVmLk1ha2VTdHJpbmcoKTsKKyAgcmV0dXJuIEJ5dGVTdHJpbmcoYnVmKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TeW50YXhQYXJzZXI6OlJlYWRIZXhTdHJpbmcoKSB7CitCeXRlU3RyaW5nIENQREZfU3ludGF4UGFyc2VyOjpSZWFkSGV4U3RyaW5nKCkgewogICB1aW50OF90IGNoOwogICBpZiAoIUdldE5leHRDaGFyKGNoKSkKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKKyAgICByZXR1cm4gQnl0ZVN0cmluZygpOwogCi0gIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBidWY7CiAgIGJvb2wgYkZpcnN0ID0gdHJ1ZTsKICAgdWludDhfdCBjb2RlID0gMDsKICAgd2hpbGUgKDEpIHsKQEAgLTI5OCwxMiArMjc3LDEyIEBACiAgICAgICBicmVhazsKIAogICAgIGlmIChzdGQ6OmlzeGRpZ2l0KGNoKSkgewotICAgICAgaW50IHZhbCA9IEZYU1lTX3RvSGV4RGlnaXQoY2gpOworICAgICAgaW50IHZhbCA9IEZYU1lTX0hleENoYXJUb0ludChjaCk7CiAgICAgICBpZiAoYkZpcnN0KSB7CiAgICAgICAgIGNvZGUgPSB2YWwgKiAxNjsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGNvZGUgKz0gdmFsOwotICAgICAgICBidWYuQXBwZW5kQnl0ZShjb2RlKTsKKyAgICAgICAgYnVmIDw8IHN0YXRpY19jYXN0PGNoYXI+KGNvZGUpOwogICAgICAgfQogICAgICAgYkZpcnN0ID0gIWJGaXJzdDsKICAgICB9CkBAIC0zMTIsOSArMjkxLDkgQEAKICAgICAgIGJyZWFrOwogICB9CiAgIGlmICghYkZpcnN0KQotICAgIGJ1Zi5BcHBlbmRCeXRlKGNvZGUpOworICAgIGJ1ZiA8PCBzdGF0aWNfY2FzdDxjaGFyPihjb2RlKTsKIAotICByZXR1cm4gYnVmLk1ha2VTdHJpbmcoKTsKKyAgcmV0dXJuIEJ5dGVTdHJpbmcoYnVmKTsKIH0KIAogdm9pZCBDUERGX1N5bnRheFBhcnNlcjo6VG9OZXh0TGluZSgpIHsKQEAgLTM1Niw0NCArMzM1LDYwIEBACiAgIG1fUG9zLS07CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQREZfU3ludGF4UGFyc2VyOjpHZXROZXh0V29yZChib29sKiBiSXNOdW1iZXIpIHsKK0J5dGVTdHJpbmcgQ1BERl9TeW50YXhQYXJzZXI6OkdldE5leHRXb3JkKGJvb2wqIGJJc051bWJlcikgeworICBjb25zdCBDUERGX1JlYWRWYWxpZGF0b3I6OlNlc3Npb24gcmVhZF9zZXNzaW9uKEdldFZhbGlkYXRvcigpLkdldCgpKTsKICAgR2V0TmV4dFdvcmRJbnRlcm5hbChiSXNOdW1iZXIpOwotICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKGNvbnN0IEZYX0NIQVIqKW1fV29yZEJ1ZmZlciwgbV9Xb3JkU2l6ZSk7CisgIEJ5dGVTdHJpbmcgcmV0OworICBpZiAoIUdldFZhbGlkYXRvcigpLT5oYXNfcmVhZF9wcm9ibGVtcygpKQorICAgIHJldCA9IEJ5dGVTdHJpbmcobV9Xb3JkQnVmZmVyLCBtX1dvcmRTaXplKTsKKyAgcmV0dXJuIHJldDsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TeW50YXhQYXJzZXI6OkdldEtleXdvcmQoKSB7CitCeXRlU3RyaW5nIENQREZfU3ludGF4UGFyc2VyOjpQZWVrTmV4dFdvcmQoYm9vbCogYklzTnVtYmVyKSB7CisgIEF1dG9SZXN0b3JlcjxGWF9GSUxFU0laRT4gc2F2ZV9wb3MoJm1fUG9zKTsKKyAgcmV0dXJuIEdldE5leHRXb3JkKGJJc051bWJlcik7Cit9CisKK0J5dGVTdHJpbmcgQ1BERl9TeW50YXhQYXJzZXI6OkdldEtleXdvcmQoKSB7CiAgIHJldHVybiBHZXROZXh0V29yZChudWxscHRyKTsKIH0KIAotc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBDUERGX1N5bnRheFBhcnNlcjo6R2V0T2JqZWN0KAorc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBDUERGX1N5bnRheFBhcnNlcjo6R2V0T2JqZWN0Qm9keSgKKyAgICBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBwT2JqTGlzdCkgeworICBjb25zdCBDUERGX1JlYWRWYWxpZGF0b3I6OlNlc3Npb24gcmVhZF9zZXNzaW9uKEdldFZhbGlkYXRvcigpLkdldCgpKTsKKyAgYXV0byByZXN1bHQgPSBHZXRPYmplY3RCb2R5SW50ZXJuYWwocE9iakxpc3QsIFBhcnNlVHlwZTo6a0xvb3NlKTsKKyAgaWYgKEdldFZhbGlkYXRvcigpLT5oYXNfcmVhZF9wcm9ibGVtcygpKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gcmVzdWx0OworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IENQREZfU3ludGF4UGFyc2VyOjpHZXRPYmplY3RCb2R5SW50ZXJuYWwoCiAgICAgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciogcE9iakxpc3QsCi0gICAgdWludDMyX3Qgb2JqbnVtLAotICAgIHVpbnQzMl90IGdlbm51bSwKLSAgICBib29sIGJEZWNyeXB0KSB7Ci0gIENGWF9BdXRvUmVzdG9yZXI8aW50PiByZXN0b3Jlcigmc19DdXJyZW50UmVjdXJzaW9uRGVwdGgpOworICAgIFBhcnNlVHlwZSBwYXJzZV90eXBlKSB7CisgIEF1dG9SZXN0b3JlcjxpbnQ+IHJlc3RvcmVyKCZzX0N1cnJlbnRSZWN1cnNpb25EZXB0aCk7CiAgIGlmICgrK3NfQ3VycmVudFJlY3Vyc2lvbkRlcHRoID4ga1BhcnNlck1heFJlY3Vyc2lvbkRlcHRoKQogICAgIHJldHVybiBudWxscHRyOwogCiAgIEZYX0ZJTEVTSVpFIFNhdmVkT2JqUG9zID0gbV9Qb3M7CiAgIGJvb2wgYklzTnVtYmVyOwotICBDRlhfQnl0ZVN0cmluZyB3b3JkID0gR2V0TmV4dFdvcmQoJmJJc051bWJlcik7CisgIEJ5dGVTdHJpbmcgd29yZCA9IEdldE5leHRXb3JkKCZiSXNOdW1iZXIpOwogICBpZiAod29yZC5HZXRMZW5ndGgoKSA9PSAwKQogICAgIHJldHVybiBudWxscHRyOwogCiAgIGlmIChiSXNOdW1iZXIpIHsKICAgICBGWF9GSUxFU0laRSBTYXZlZFBvcyA9IG1fUG9zOwotICAgIENGWF9CeXRlU3RyaW5nIG5leHR3b3JkID0gR2V0TmV4dFdvcmQoJmJJc051bWJlcik7CisgICAgQnl0ZVN0cmluZyBuZXh0d29yZCA9IEdldE5leHRXb3JkKCZiSXNOdW1iZXIpOwogICAgIGlmIChiSXNOdW1iZXIpIHsKLSAgICAgIENGWF9CeXRlU3RyaW5nIG5leHR3b3JkMiA9IEdldE5leHRXb3JkKG51bGxwdHIpOworICAgICAgQnl0ZVN0cmluZyBuZXh0d29yZDIgPSBHZXROZXh0V29yZChudWxscHRyKTsKICAgICAgIGlmIChuZXh0d29yZDIgPT0gIlIiKSB7Ci0gICAgICAgIHVpbnQzMl90IG9iam51bSA9IEZYU1lTX2F0b3VpKHdvcmQuY19zdHIoKSk7Ci0gICAgICAgIGlmIChvYmpudW0gPT0gQ1BERl9PYmplY3Q6OmtJbnZhbGlkT2JqTnVtKQorICAgICAgICB1aW50MzJfdCByZWZudW0gPSBGWFNZU19hdG91aSh3b3JkLmNfc3RyKCkpOworICAgICAgICBpZiAocmVmbnVtID09IENQREZfT2JqZWN0OjprSW52YWxpZE9iak51bSkKICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgcmV0dXJuIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1JlZmVyZW5jZT4ocE9iakxpc3QsIG9iam51bSk7CisgICAgICAgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9SZWZlcmVuY2U+KHBPYmpMaXN0LCByZWZudW0pOwogICAgICAgfQogICAgIH0KICAgICBtX1BvcyA9IFNhdmVkUG9zOwotICAgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9OdW1iZXI+KHdvcmQuQXNTdHJpbmdDKCkpOworICAgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9OdW1iZXI+KHdvcmQuQXNTdHJpbmdWaWV3KCkpOwogICB9CiAKICAgaWYgKHdvcmQgPT0gInRydWUiIHx8IHdvcmQgPT0gImZhbHNlIikKQEAgLTQwMywzNyArMzk4LDMzIEBACiAgICAgcmV0dXJuIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX051bGw+KCk7CiAKICAgaWYgKHdvcmQgPT0gIigiKSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gUmVhZFN0cmluZygpOwotICAgIGlmIChtX3BDcnlwdG9IYW5kbGVyICYmIGJEZWNyeXB0KQotICAgICAgbV9wQ3J5cHRvSGFuZGxlci0+RGVjcnlwdChvYmpudW0sIGdlbm51bSwgc3RyKTsKKyAgICBCeXRlU3RyaW5nIHN0ciA9IFJlYWRTdHJpbmcoKTsKICAgICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU3RyaW5nPihtX3BQb29sLCBzdHIsIGZhbHNlKTsKICAgfQogICBpZiAod29yZCA9PSAiPCIpIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBSZWFkSGV4U3RyaW5nKCk7Ci0gICAgaWYgKG1fcENyeXB0b0hhbmRsZXIgJiYgYkRlY3J5cHQpCi0gICAgICBtX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0KG9iam51bSwgZ2VubnVtLCBzdHIpOworICAgIEJ5dGVTdHJpbmcgc3RyID0gUmVhZEhleFN0cmluZygpOwogICAgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJpbmc+KG1fcFBvb2wsIHN0ciwgdHJ1ZSk7CiAgIH0KICAgaWYgKHdvcmQgPT0gIlsiKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENQREZfQXJyYXk+IHBBcnJheSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0FycmF5PigpOworICAgIGF1dG8gcEFycmF5ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfQXJyYXk+KCk7CiAgICAgd2hpbGUgKHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gcE9iaiA9Ci0gICAgICAgICAgICAgICBHZXRPYmplY3QocE9iakxpc3QsIG9iam51bSwgZ2VubnVtLCB0cnVlKSkgeworICAgICAgICAgICAgICAgR2V0T2JqZWN0Qm9keUludGVybmFsKHBPYmpMaXN0LCBQYXJzZVR5cGU6OmtMb29zZSkpIHsKICAgICAgIHBBcnJheS0+QWRkKHN0ZDo6bW92ZShwT2JqKSk7CiAgICAgfQotICAgIHJldHVybiBzdGQ6Om1vdmUocEFycmF5KTsKKyAgICByZXR1cm4gKHBhcnNlX3R5cGUgPT0gUGFyc2VUeXBlOjprTG9vc2UgfHwgbV9Xb3JkQnVmZmVyWzBdID09ICddJykKKyAgICAgICAgICAgICAgID8gc3RkOjptb3ZlKHBBcnJheSkKKyAgICAgICAgICAgICAgIDogbnVsbHB0cjsKICAgfQogICBpZiAod29yZFswXSA9PSAnLycpIHsKICAgICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfTmFtZT4oCiAgICAgICAgIG1fcFBvb2wsCi0gICAgICAgIFBERl9OYW1lRGVjb2RlKENGWF9CeXRlU3RyaW5nQyhtX1dvcmRCdWZmZXIgKyAxLCBtX1dvcmRTaXplIC0gMSkpKTsKKyAgICAgICAgUERGX05hbWVEZWNvZGUoQnl0ZVN0cmluZ1ZpZXcobV9Xb3JkQnVmZmVyICsgMSwgbV9Xb3JkU2l6ZSAtIDEpKSk7CiAgIH0KICAgaWYgKHdvcmQgPT0gIjw8IikgewotICAgIGludDMyX3QgbktleXMgPSAwOwotICAgIEZYX0ZJTEVTSVpFIGR3U2lnblZhbHVlUG9zID0gMDsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5PiBwRGljdCA9CiAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KG1fcFBvb2wpOwogICAgIHdoaWxlICgxKSB7Ci0gICAgICBDRlhfQnl0ZVN0cmluZyBrZXkgPSBHZXROZXh0V29yZChudWxscHRyKTsKKyAgICAgIEJ5dGVTdHJpbmcga2V5ID0gR2V0TmV4dFdvcmQobnVsbHB0cik7CiAgICAgICBpZiAoa2V5LklzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKQEAgLTQ0OCwzOCArNDM5LDM0IEBACiAgICAgICBpZiAoa2V5WzBdICE9ICcvJykKICAgICAgICAgY29udGludWU7CiAKLSAgICAgICsrbktleXM7CiAgICAgICBrZXkgPSBQREZfTmFtZURlY29kZShrZXkpOwotICAgICAgaWYgKGtleS5Jc0VtcHR5KCkpCi0gICAgICAgIGNvbnRpbnVlOwogCi0gICAgICBpZiAoa2V5ID09ICIvQ29udGVudHMiKQotICAgICAgICBkd1NpZ25WYWx1ZVBvcyA9IG1fUG9zOworICAgICAgaWYgKGtleS5Jc0VtcHR5KCkgJiYgcGFyc2VfdHlwZSA9PSBQYXJzZVR5cGU6OmtMb29zZSkKKyAgICAgICAgY29udGludWU7CiAKICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gcE9iaiA9Ci0gICAgICAgICAgR2V0T2JqZWN0KHBPYmpMaXN0LCBvYmpudW0sIGdlbm51bSwgdHJ1ZSk7Ci0gICAgICBpZiAoIXBPYmopCi0gICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIEdldE9iamVjdEJvZHlJbnRlcm5hbChwT2JqTGlzdCwgUGFyc2VUeXBlOjprTG9vc2UpOworICAgICAgaWYgKCFwT2JqKSB7CisgICAgICAgIGlmIChwYXJzZV90eXBlID09IFBhcnNlVHlwZTo6a0xvb3NlKQorICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICBDRlhfQnl0ZVN0cmluZyBrZXlOb1NsYXNoKGtleS5yYXdfc3RyKCkgKyAxLCBrZXkuR2V0TGVuZ3RoKCkgLSAxKTsKLSAgICAgIHBEaWN0LT5TZXRGb3Ioa2V5Tm9TbGFzaCwgc3RkOjptb3ZlKHBPYmopKTsKLSAgICB9CisgICAgICAgIFRvTmV4dExpbmUoKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICB9CiAKLSAgICAvLyBPbmx5IHdoZW4gdGhpcyBpcyBhIHNpZ25hdHVyZSBkaWN0aW9uYXJ5IGFuZCBoYXMgY29udGVudHMsIHdlIHJlc2V0IHRoZQotICAgIC8vIGNvbnRlbnRzIHRvIHRoZSB1bi1kZWNyeXB0ZWQgZm9ybS4KLSAgICBpZiAocERpY3QtPklzU2lnbmF0dXJlRGljdCgpICYmIGR3U2lnblZhbHVlUG9zKSB7Ci0gICAgICBDRlhfQXV0b1Jlc3RvcmVyPEZYX0ZJTEVTSVpFPiBzYXZlX3BvcygmbV9Qb3MpOwotICAgICAgbV9Qb3MgPSBkd1NpZ25WYWx1ZVBvczsKLSAgICAgIHBEaWN0LT5TZXRGb3IoIkNvbnRlbnRzIiwgR2V0T2JqZWN0KHBPYmpMaXN0LCBvYmpudW0sIGdlbm51bSwgZmFsc2UpKTsKKyAgICAgIGlmICgha2V5LklzRW1wdHkoKSkgeworICAgICAgICBCeXRlU3RyaW5nIGtleU5vU2xhc2goa2V5LnJhd19zdHIoKSArIDEsIGtleS5HZXRMZW5ndGgoKSAtIDEpOworICAgICAgICBwRGljdC0+U2V0Rm9yKGtleU5vU2xhc2gsIHN0ZDo6bW92ZShwT2JqKSk7CisgICAgICB9CiAgICAgfQogCiAgICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1BvczsKLSAgICBDRlhfQnl0ZVN0cmluZyBuZXh0d29yZCA9IEdldE5leHRXb3JkKG51bGxwdHIpOworICAgIEJ5dGVTdHJpbmcgbmV4dHdvcmQgPSBHZXROZXh0V29yZChudWxscHRyKTsKICAgICBpZiAobmV4dHdvcmQgIT0gInN0cmVhbSIpIHsKICAgICAgIG1fUG9zID0gU2F2ZWRQb3M7CiAgICAgICByZXR1cm4gc3RkOjptb3ZlKHBEaWN0KTsKICAgICB9Ci0gICAgcmV0dXJuIFJlYWRTdHJlYW0oc3RkOjptb3ZlKHBEaWN0KSwgb2JqbnVtLCBnZW5udW0pOworICAgIHJldHVybiBSZWFkU3RyZWFtKHN0ZDo6bW92ZShwRGljdCkpOwogICB9CiAgIGlmICh3b3JkID09ICI+PiIpCiAgICAgbV9Qb3MgPSBTYXZlZE9ialBvczsKQEAgLTQ4NywxMTUgKzQ3NCwzOSBAQAogICByZXR1cm4gbnVsbHB0cjsKIH0KIAotc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBDUERGX1N5bnRheFBhcnNlcjo6R2V0T2JqZWN0Rm9yU3RyaWN0KAorc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBDUERGX1N5bnRheFBhcnNlcjo6R2V0SW5kaXJlY3RPYmplY3QoCiAgICAgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciogcE9iakxpc3QsCi0gICAgdWludDMyX3Qgb2JqbnVtLAotICAgIHVpbnQzMl90IGdlbm51bSkgewotICBDRlhfQXV0b1Jlc3RvcmVyPGludD4gcmVzdG9yZXIoJnNfQ3VycmVudFJlY3Vyc2lvbkRlcHRoKTsKLSAgaWYgKCsrc19DdXJyZW50UmVjdXJzaW9uRGVwdGggPiBrUGFyc2VyTWF4UmVjdXJzaW9uRGVwdGgpCisgICAgUGFyc2VUeXBlIHBhcnNlX3R5cGUpIHsKKyAgY29uc3QgQ1BERl9SZWFkVmFsaWRhdG9yOjpTZXNzaW9uIHJlYWRfc2Vzc2lvbihHZXRWYWxpZGF0b3IoKS5HZXQoKSk7CisgIGNvbnN0IEZYX0ZJTEVTSVpFIHNhdmVkX3BvcyA9IEdldFBvcygpOworICBib29sIGlzX251bWJlciA9IGZhbHNlOworICBCeXRlU3RyaW5nIHdvcmQgPSBHZXROZXh0V29yZCgmaXNfbnVtYmVyKTsKKyAgaWYgKCFpc19udW1iZXIgfHwgd29yZC5Jc0VtcHR5KCkpIHsKKyAgICBTZXRQb3Moc2F2ZWRfcG9zKTsKICAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBjb25zdCB1aW50MzJfdCBwYXJzZXJfb2JqbnVtID0gRlhTWVNfYXRvdWkod29yZC5jX3N0cigpKTsKIAotICBGWF9GSUxFU0laRSBTYXZlZE9ialBvcyA9IG1fUG9zOwotICBib29sIGJJc051bWJlcjsKLSAgQ0ZYX0J5dGVTdHJpbmcgd29yZCA9IEdldE5leHRXb3JkKCZiSXNOdW1iZXIpOwotICBpZiAod29yZC5HZXRMZW5ndGgoKSA9PSAwKQorICB3b3JkID0gR2V0TmV4dFdvcmQoJmlzX251bWJlcik7CisgIGlmICghaXNfbnVtYmVyIHx8IHdvcmQuSXNFbXB0eSgpKSB7CisgICAgU2V0UG9zKHNhdmVkX3Bvcyk7CiAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgY29uc3QgdWludDMyX3QgcGFyc2VyX2dlbm51bSA9IEZYU1lTX2F0b3VpKHdvcmQuY19zdHIoKSk7CiAKLSAgaWYgKGJJc051bWJlcikgewotICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9Qb3M7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgbmV4dHdvcmQgPSBHZXROZXh0V29yZCgmYklzTnVtYmVyKTsKLSAgICBpZiAoYklzTnVtYmVyKSB7Ci0gICAgICBDRlhfQnl0ZVN0cmluZyBuZXh0d29yZDIgPSBHZXROZXh0V29yZChudWxscHRyKTsKLSAgICAgIGlmIChuZXh0d29yZDIgPT0gIlIiKSB7Ci0gICAgICAgIHVpbnQzMl90IG9iam51bSA9IEZYU1lTX2F0b3VpKHdvcmQuY19zdHIoKSk7Ci0gICAgICAgIGlmIChvYmpudW0gPT0gQ1BERl9PYmplY3Q6OmtJbnZhbGlkT2JqTnVtKQotICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfUmVmZXJlbmNlPihwT2JqTGlzdCwgb2JqbnVtKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgbV9Qb3MgPSBTYXZlZFBvczsKLSAgICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfTnVtYmVyPih3b3JkLkFzU3RyaW5nQygpKTsKKyAgaWYgKEdldEtleXdvcmQoKSAhPSAib2JqIikgeworICAgIFNldFBvcyhzYXZlZF9wb3MpOworICAgIHJldHVybiBudWxscHRyOwogICB9CiAKLSAgaWYgKHdvcmQgPT0gInRydWUiIHx8IHdvcmQgPT0gImZhbHNlIikKLSAgICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfQm9vbGVhbj4od29yZCA9PSAidHJ1ZSIpOwotCi0gIGlmICh3b3JkID09ICJudWxsIikKLSAgICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfTnVsbD4oKTsKLQotICBpZiAod29yZCA9PSAiKCIpIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBSZWFkU3RyaW5nKCk7Ci0gICAgaWYgKG1fcENyeXB0b0hhbmRsZXIpCi0gICAgICBtX3BDcnlwdG9IYW5kbGVyLT5EZWNyeXB0KG9iam51bSwgZ2VubnVtLCBzdHIpOwotICAgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJpbmc+KG1fcFBvb2wsIHN0ciwgZmFsc2UpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IHBPYmogPQorICAgICAgR2V0T2JqZWN0Qm9keUludGVybmFsKHBPYmpMaXN0LCBwYXJzZV90eXBlKTsKKyAgaWYgKHBPYmopIHsKKyAgICBwT2JqLT5TZXRPYmpOdW0ocGFyc2VyX29iam51bSk7CisgICAgcE9iai0+U2V0R2VuTnVtKHBhcnNlcl9nZW5udW0pOwogICB9Ci0gIGlmICh3b3JkID09ICI8IikgewotICAgIENGWF9CeXRlU3RyaW5nIHN0ciA9IFJlYWRIZXhTdHJpbmcoKTsKLSAgICBpZiAobV9wQ3J5cHRvSGFuZGxlcikKLSAgICAgIG1fcENyeXB0b0hhbmRsZXItPkRlY3J5cHQob2JqbnVtLCBnZW5udW0sIHN0cik7Ci0gICAgcmV0dXJuIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmluZz4obV9wUG9vbCwgc3RyLCB0cnVlKTsKLSAgfQotICBpZiAod29yZCA9PSAiWyIpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9BcnJheT4gcEFycmF5ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfQXJyYXk+KCk7Ci0gICAgd2hpbGUgKHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gcE9iaiA9Ci0gICAgICAgICAgICAgICBHZXRPYmplY3QocE9iakxpc3QsIG9iam51bSwgZ2VubnVtLCB0cnVlKSkgewotICAgICAgcEFycmF5LT5BZGQoc3RkOjptb3ZlKHBPYmopKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1fV29yZEJ1ZmZlclswXSA9PSAnXScgPyBzdGQ6Om1vdmUocEFycmF5KSA6IG51bGxwdHI7Ci0gIH0KLSAgaWYgKHdvcmRbMF0gPT0gJy8nKSB7Ci0gICAgcmV0dXJuIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX05hbWU+KAotICAgICAgICBtX3BQb29sLAotICAgICAgICBQREZfTmFtZURlY29kZShDRlhfQnl0ZVN0cmluZ0MobV9Xb3JkQnVmZmVyICsgMSwgbV9Xb3JkU2l6ZSAtIDEpKSk7Ci0gIH0KLSAgaWYgKHdvcmQgPT0gIjw8IikgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0RpY3Rpb25hcnk+IHBEaWN0ID0KLSAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4obV9wUG9vbCk7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgIEZYX0ZJTEVTSVpFIFNhdmVkUG9zID0gbV9Qb3M7Ci0gICAgICBDRlhfQnl0ZVN0cmluZyBrZXkgPSBHZXROZXh0V29yZChudWxscHRyKTsKLSAgICAgIGlmIChrZXkuSXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKIAotICAgICAgaWYgKGtleSA9PSAiPj4iKQotICAgICAgICBicmVhazsKLQotICAgICAgaWYgKGtleSA9PSAiZW5kb2JqIikgewotICAgICAgICBtX1BvcyA9IFNhdmVkUG9zOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChrZXlbMF0gIT0gJy8nKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAga2V5ID0gUERGX05hbWVEZWNvZGUoa2V5KTsKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gb2JqKAotICAgICAgICAgIEdldE9iamVjdChwT2JqTGlzdCwgb2JqbnVtLCBnZW5udW0sIHRydWUpKTsKLSAgICAgIGlmICghb2JqKSB7Ci0gICAgICAgIHVpbnQ4X3QgY2g7Ci0gICAgICAgIHdoaWxlIChHZXROZXh0Q2hhcihjaCkgJiYgY2ggIT0gMHgwQSAmJiBjaCAhPSAweDBEKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChrZXkuR2V0TGVuZ3RoKCkgPiAxKSB7Ci0gICAgICAgIHBEaWN0LT5TZXRGb3IoQ0ZYX0J5dGVTdHJpbmcoa2V5LmNfc3RyKCkgKyAxLCBrZXkuR2V0TGVuZ3RoKCkgLSAxKSwKLSAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUob2JqKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgRlhfRklMRVNJWkUgU2F2ZWRQb3MgPSBtX1BvczsKLSAgICBDRlhfQnl0ZVN0cmluZyBuZXh0d29yZCA9IEdldE5leHRXb3JkKG51bGxwdHIpOwotICAgIGlmIChuZXh0d29yZCAhPSAic3RyZWFtIikgewotICAgICAgbV9Qb3MgPSBTYXZlZFBvczsKLSAgICAgIHJldHVybiBzdGQ6Om1vdmUocERpY3QpOwotICAgIH0KLSAgICByZXR1cm4gUmVhZFN0cmVhbShzdGQ6Om1vdmUocERpY3QpLCBvYmpudW0sIGdlbm51bSk7Ci0gIH0KLSAgaWYgKHdvcmQgPT0gIj4+IikKLSAgICBtX1BvcyA9IFNhdmVkT2JqUG9zOwotCi0gIHJldHVybiBudWxscHRyOworICByZXR1cm4gR2V0VmFsaWRhdG9yKCktPmhhc19yZWFkX3Byb2JsZW1zKCkgPyBudWxscHRyIDogc3RkOjptb3ZlKHBPYmopOwogfQogCiB1bnNpZ25lZCBpbnQgQ1BERl9TeW50YXhQYXJzZXI6OlJlYWRFT0xNYXJrZXJzKEZYX0ZJTEVTSVpFIHBvcykgewpAQCAtNjE1LDI4ICs1MjYsMTcgQEAKIH0KIAogc3RkOjp1bmlxdWVfcHRyPENQREZfU3RyZWFtPiBDUERGX1N5bnRheFBhcnNlcjo6UmVhZFN0cmVhbSgKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5PiBwRGljdCwKLSAgICB1aW50MzJfdCBvYmpudW0sCi0gICAgdWludDMyX3QgZ2VubnVtKSB7Ci0gIENQREZfT2JqZWN0KiBwTGVuT2JqID0gcERpY3QtPkdldE9iamVjdEZvcigiTGVuZ3RoIik7Ci0gIEZYX0ZJTEVTSVpFIGxlbiA9IC0xOwotICBDUERGX1JlZmVyZW5jZSogcExlbk9ialJlZiA9IFRvUmVmZXJlbmNlKHBMZW5PYmopOwotCi0gIGJvb2wgZGlmZmVyaW5nT2JqTnVtID0gIXBMZW5PYmpSZWYgfHwgKHBMZW5PYmpSZWYtPkdldE9iakxpc3QoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVuT2JqUmVmLT5HZXRSZWZPYmpOdW0oKSAhPSBvYmpudW0pOwotICBpZiAocExlbk9iaiAmJiBkaWZmZXJpbmdPYmpOdW0pCi0gICAgbGVuID0gcExlbk9iai0+R2V0SW50ZWdlcigpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0RpY3Rpb25hcnk+IHBEaWN0KSB7CisgIGNvbnN0IENQREZfTnVtYmVyKiBwTGVuT2JqID0gVG9OdW1iZXIocERpY3QtPkdldERpcmVjdE9iamVjdEZvcigiTGVuZ3RoIikpOworICBGWF9GSUxFU0laRSBsZW4gPSBwTGVuT2JqID8gcExlbk9iai0+R2V0SW50ZWdlcigpIDogLTE7CiAKICAgLy8gTG9jYXRlIHRoZSBzdGFydCBvZiBzdHJlYW0uCiAgIFRvTmV4dExpbmUoKTsKICAgRlhfRklMRVNJWkUgc3RyZWFtU3RhcnRQb3MgPSBtX1BvczsKIAotICBjb25zdCBDRlhfQnl0ZVN0cmluZ0Mga0VuZFN0cmVhbVN0cigiZW5kc3RyZWFtIik7Ci0gIGNvbnN0IENGWF9CeXRlU3RyaW5nQyBrRW5kT2JqU3RyKCJlbmRvYmoiKTsKKyAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcga0VuZFN0cmVhbVN0cigiZW5kc3RyZWFtIik7CisgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3IGtFbmRPYmpTdHIoImVuZG9iaiIpOwogCi0gIENQREZfQ3J5cHRvSGFuZGxlciogcENyeXB0b0hhbmRsZXIgPQotICAgICAgb2JqbnVtID09IG1fTWV0YWRhdGFPYmpudW0gPyBudWxscHRyIDogbV9wQ3J5cHRvSGFuZGxlci5nZXQoKTsKLSAgaWYgKCFwQ3J5cHRvSGFuZGxlcikgewogICAgIGJvb2wgYlNlYXJjaEZvcktleXdvcmQgPSB0cnVlOwogICAgIGlmIChsZW4gPj0gMCkgewogICAgICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxGWF9GSUxFU0laRT4gcG9zID0gbV9Qb3M7CkBAIC02NDUsMTMgKzU0NSwxMyBAQAogICAgICAgICBtX1BvcyA9IHBvcy5WYWx1ZU9yRGllKCk7CiAKICAgICAgIG1fUG9zICs9IFJlYWRFT0xNYXJrZXJzKG1fUG9zKTsKLSAgICAgIEZYU1lTX21lbXNldChtX1dvcmRCdWZmZXIsIDAsIGtFbmRTdHJlYW1TdHIuR2V0TGVuZ3RoKCkgKyAxKTsKKyAgICAgIG1lbXNldChtX1dvcmRCdWZmZXIsIDAsIGtFbmRTdHJlYW1TdHIuR2V0TGVuZ3RoKCkgKyAxKTsKICAgICAgIEdldE5leHRXb3JkSW50ZXJuYWwobnVsbHB0cik7CiAgICAgICAvLyBFYXJsaWVyIHZlcnNpb24gb2YgUERGIHNwZWNpZmljYXRpb24gZG9lc24ndCByZXF1aXJlIEVPTCBtYXJrZXIgYmVmb3JlCiAgICAgICAvLyAnZW5kc3RyZWFtJyBrZXl3b3JkLiBJZiBrZXl3b3JkICdlbmRzdHJlYW0nIGZvbGxvd3MgdGhlIGJ5dGVzIGluCiAgICAgICAvLyBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBzaWduYWxzIHRoZSBlbmQgb2Ygc3RyZWFtLgotICAgICAgaWYgKEZYU1lTX21lbWNtcChtX1dvcmRCdWZmZXIsIGtFbmRTdHJlYW1TdHIucmF3X3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICBrRW5kU3RyZWFtU3RyLkdldExlbmd0aCgpKSA9PSAwKSB7CisgICAgICBpZiAobWVtY21wKG1fV29yZEJ1ZmZlciwga0VuZFN0cmVhbVN0ci5yYXdfc3RyKCksCisgICAgICAgICAgICAgICAgIGtFbmRTdHJlYW1TdHIuR2V0TGVuZ3RoKCkpID09IDApIHsKICAgICAgICAgYlNlYXJjaEZvcktleXdvcmQgPSBmYWxzZTsKICAgICAgIH0KICAgICB9CkBAIC03MjMsNyArNjIzLDExIEBACiAgICAgICBwRGljdC0+U2V0TmV3Rm9yPENQREZfTnVtYmVyPigiTGVuZ3RoIiwgc3RhdGljX2Nhc3Q8aW50PihsZW4pKTsKICAgICB9CiAgICAgbV9Qb3MgPSBzdHJlYW1TdGFydFBvczsKLSAgfQorCisgIC8vIFJlYWQgdXAgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiBOb3RlLCB3ZSBhbGxvdyB6ZXJvIGxlbmd0aCBzdHJlYW1zIGFzCisgIC8vIHdlIG5lZWQgdG8gcGFzcyB0aGVtIHRocm91Z2ggd2hlbiB3ZSBhcmUgaW1wb3J0aW5nIHBhZ2VzIGludG8gYSBuZXcKKyAgLy8gZG9jdW1lbnQuCisgIGxlbiA9IHN0ZDo6bWluKGxlbiwgbV9GaWxlTGVuIC0gbV9Qb3MgLSBtX0hlYWRlck9mZnNldCk7CiAgIGlmIChsZW4gPCAwKQogICAgIHJldHVybiBudWxscHRyOwogCkBAIC03MzEsNDcgKzYzNSw0MSBAQAogICBpZiAobGVuID4gMCkgewogICAgIHBEYXRhLnJlc2V0KEZYX0FsbG9jKHVpbnQ4X3QsIGxlbikpOwogICAgIFJlYWRCbG9jayhwRGF0YS5nZXQoKSwgbGVuKTsKLSAgICBpZiAocENyeXB0b0hhbmRsZXIpIHsKLSAgICAgIENGWF9CaW5hcnlCdWYgZGVzdF9idWY7Ci0gICAgICBkZXN0X2J1Zi5Fc3RpbWF0ZVNpemUocENyeXB0b0hhbmRsZXItPkRlY3J5cHRHZXRTaXplKGxlbikpOwotCi0gICAgICB2b2lkKiBjb250ZXh0ID0gcENyeXB0b0hhbmRsZXItPkRlY3J5cHRTdGFydChvYmpudW0sIGdlbm51bSk7Ci0gICAgICBwQ3J5cHRvSGFuZGxlci0+RGVjcnlwdFN0cmVhbShjb250ZXh0LCBwRGF0YS5nZXQoKSwgbGVuLCBkZXN0X2J1Zik7Ci0gICAgICBwQ3J5cHRvSGFuZGxlci0+RGVjcnlwdEZpbmlzaChjb250ZXh0LCBkZXN0X2J1Zik7Ci0gICAgICBsZW4gPSBkZXN0X2J1Zi5HZXRTaXplKCk7Ci0gICAgICBwRGF0YSA9IGRlc3RfYnVmLkRldGFjaEJ1ZmZlcigpOwotICAgIH0KICAgfQotCiAgIGF1dG8gcFN0cmVhbSA9CiAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJlYW0+KHN0ZDo6bW92ZShwRGF0YSksIGxlbiwgc3RkOjptb3ZlKHBEaWN0KSk7CiAgIHN0cmVhbVN0YXJ0UG9zID0gbV9Qb3M7Ci0gIEZYU1lTX21lbXNldChtX1dvcmRCdWZmZXIsIDAsIGtFbmRPYmpTdHIuR2V0TGVuZ3RoKCkgKyAxKTsKKyAgbWVtc2V0KG1fV29yZEJ1ZmZlciwgMCwga0VuZE9ialN0ci5HZXRMZW5ndGgoKSArIDEpOwogICBHZXROZXh0V29yZEludGVybmFsKG51bGxwdHIpOwogCiAgIGludCBudW1NYXJrZXJzID0gUmVhZEVPTE1hcmtlcnMobV9Qb3MpOwogICBpZiAobV9Xb3JkU2l6ZSA9PSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KGtFbmRPYmpTdHIuR2V0TGVuZ3RoKCkpICYmCiAgICAgICBudW1NYXJrZXJzICE9IDAgJiYKLSAgICAgIEZYU1lTX21lbWNtcChtX1dvcmRCdWZmZXIsIGtFbmRPYmpTdHIucmF3X3N0cigpLAotICAgICAgICAgICAgICAgICAgIGtFbmRPYmpTdHIuR2V0TGVuZ3RoKCkpID09IDApIHsKKyAgICAgIG1lbWNtcChtX1dvcmRCdWZmZXIsIGtFbmRPYmpTdHIucmF3X3N0cigpLCBrRW5kT2JqU3RyLkdldExlbmd0aCgpKSA9PSAwKSB7CiAgICAgbV9Qb3MgPSBzdHJlYW1TdGFydFBvczsKICAgfQogICByZXR1cm4gcFN0cmVhbTsKIH0KIAogdm9pZCBDUERGX1N5bnRheFBhcnNlcjo6SW5pdFBhcnNlcigKLSAgICBjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZUFjY2VzcywKKyAgICBjb25zdCBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBGaWxlQWNjZXNzLAogICAgIHVpbnQzMl90IEhlYWRlck9mZnNldCkgewotICBGWF9GcmVlKG1fcEZpbGVCdWYpOworICBBU1NFUlQocEZpbGVBY2Nlc3MpOworICByZXR1cm4gSW5pdFBhcnNlcldpdGhWYWxpZGF0b3IoCisgICAgICBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERl9SZWFkVmFsaWRhdG9yPihwRmlsZUFjY2VzcywgbnVsbHB0ciksCisgICAgICBIZWFkZXJPZmZzZXQpOworfQogCi0gIG1fcEZpbGVCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBtX0J1ZlNpemUpOwordm9pZCBDUERGX1N5bnRheFBhcnNlcjo6SW5pdFBhcnNlcldpdGhWYWxpZGF0b3IoCisgICAgY29uc3QgUmV0YWluUHRyPENQREZfUmVhZFZhbGlkYXRvcj4mIHZhbGlkYXRvciwKKyAgICB1aW50MzJfdCBIZWFkZXJPZmZzZXQpIHsKKyAgQVNTRVJUKHZhbGlkYXRvcik7CisgIG1fcEZpbGVCdWYuY2xlYXIoKTsKICAgbV9IZWFkZXJPZmZzZXQgPSBIZWFkZXJPZmZzZXQ7Ci0gIG1fRmlsZUxlbiA9IHBGaWxlQWNjZXNzLT5HZXRTaXplKCk7CisgIG1fRmlsZUxlbiA9IHZhbGlkYXRvci0+R2V0U2l6ZSgpOwogICBtX1BvcyA9IDA7Ci0gIG1fcEZpbGVBY2Nlc3MgPSBwRmlsZUFjY2VzczsKKyAgbV9wRmlsZUFjY2VzcyA9IHZhbGlkYXRvcjsKICAgbV9CdWZPZmZzZXQgPSAwOwotICBwRmlsZUFjY2Vzcy0+UmVhZEJsb2NrKG1fcEZpbGVCdWYsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptaW4obV9CdWZTaXplLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4obV9GaWxlTGVuKSkpOwogfQogCiB1aW50MzJfdCBDUERGX1N5bnRheFBhcnNlcjo6R2V0RGlyZWN0TnVtKCkgewpAQCAtNzgxLDEyICs2NzksMTIgQEAKICAgICByZXR1cm4gMDsKIAogICBtX1dvcmRCdWZmZXJbbV9Xb3JkU2l6ZV0gPSAwOwotICByZXR1cm4gRlhTWVNfYXRvdWkocmVpbnRlcnByZXRfY2FzdDxjb25zdCBGWF9DSEFSKj4obV9Xb3JkQnVmZmVyKSk7CisgIHJldHVybiBGWFNZU19hdG91aShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihtX1dvcmRCdWZmZXIpKTsKIH0KIAogYm9vbCBDUERGX1N5bnRheFBhcnNlcjo6SXNXaG9sZVdvcmQoRlhfRklMRVNJWkUgc3RhcnRwb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHRhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2hlY2tLZXl3b3JkKSB7CiAgIGNvbnN0IHVpbnQzMl90IHRhZ2xlbiA9IHRhZy5HZXRMZW5ndGgoKTsKIApAQCAtODEyLDc3ICs3MTAsNDEgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLS8vIFRPRE8oZHNpbmNsYWlyKTogU3BsaXQgaW50byBhIFNlYXJjaFdvcmRGb3J3YXJkIGFuZCBTZWFyY2hXb3JkQmFja3dhcmRzCi0vLyBhbmQgZHJvcCB0aGUgYm9vbC4KLWJvb2wgQ1BERl9TeW50YXhQYXJzZXI6OlNlYXJjaFdvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYldob2xlV29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRm9yd2FyZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgbGltaXQpIHsKK2Jvb2wgQ1BERl9TeW50YXhQYXJzZXI6OkJhY2t3YXJkc1NlYXJjaFRvV29yZChjb25zdCBCeXRlU3RyaW5nVmlldyYgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIGxpbWl0KSB7CiAgIGludDMyX3QgdGFnbGVuID0gdGFnLkdldExlbmd0aCgpOwogICBpZiAodGFnbGVuID09IDApCiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIEZYX0ZJTEVTSVpFIHBvcyA9IG1fUG9zOwotICBpbnQzMl90IG9mZnNldCA9IDA7Ci0gIGlmICghYkZvcndhcmQpCi0gICAgb2Zmc2V0ID0gdGFnbGVuIC0gMTsKLQotICBjb25zdCB1aW50OF90KiB0YWdfZGF0YSA9IHRhZy5yYXdfc3RyKCk7Ci0gIHVpbnQ4X3QgYnl0ZTsKKyAgaW50MzJfdCBvZmZzZXQgPSB0YWdsZW4gLSAxOwogICB3aGlsZSAoMSkgewotICAgIGlmIChiRm9yd2FyZCkgewotICAgICAgaWYgKGxpbWl0ICYmIHBvcyA+PSBtX1BvcyArIGxpbWl0KQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGxpbWl0ICYmIHBvcyA8PSBtX1BvcyAtIGxpbWl0KQorICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICBpZiAoIUdldENoYXJBdChwb3MsIGJ5dGUpKQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgdWludDhfdCBieXRlOworICAgIGlmICghR2V0Q2hhckF0QmFja3dhcmQocG9zLCAmYnl0ZSkpCisgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICB9IGVsc2UgewotICAgICAgaWYgKGxpbWl0ICYmIHBvcyA8PSBtX1BvcyAtIGxpbWl0KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGlmICghR2V0Q2hhckF0QmFja3dhcmQocG9zLCBieXRlKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChieXRlID09IHRhZ19kYXRhW29mZnNldF0pIHsKLSAgICAgIGlmIChiRm9yd2FyZCkgewotICAgICAgICBvZmZzZXQrKzsKLSAgICAgICAgaWYgKG9mZnNldCA8IHRhZ2xlbikgewotICAgICAgICAgIHBvcysrOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvZmZzZXQtLTsKLSAgICAgICAgaWYgKG9mZnNldCA+PSAwKSB7Ci0gICAgICAgICAgcG9zLS07Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KKyAgICBpZiAoYnl0ZSA9PSB0YWdbb2Zmc2V0XSkgeworICAgICAgb2Zmc2V0LS07CisgICAgICBpZiAob2Zmc2V0ID49IDApIHsKKyAgICAgICAgcG9zLS07CisgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQotCi0gICAgICBGWF9GSUxFU0laRSBzdGFydHBvcyA9IGJGb3J3YXJkID8gcG9zIC0gdGFnbGVuICsgMSA6IHBvczsKLSAgICAgIGlmICghYldob2xlV29yZCB8fCBJc1dob2xlV29yZChzdGFydHBvcywgbGltaXQsIHRhZywgZmFsc2UpKSB7Ci0gICAgICAgIG1fUG9zID0gc3RhcnRwb3M7CisgICAgICBpZiAoSXNXaG9sZVdvcmQocG9zLCBsaW1pdCwgdGFnLCBmYWxzZSkpIHsKKyAgICAgICAgbV9Qb3MgPSBwb3M7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgfQogICAgIH0KLQotICAgIGlmIChiRm9yd2FyZCkgewotICAgICAgb2Zmc2V0ID0gYnl0ZSA9PSB0YWdfZGF0YVswXSA/IDEgOiAwOwotICAgICAgcG9zKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG9mZnNldCA9IGJ5dGUgPT0gdGFnX2RhdGFbdGFnbGVuIC0gMV0gPyB0YWdsZW4gLSAyIDogdGFnbGVuIC0gMTsKLSAgICAgIHBvcy0tOwotICAgIH0KLQorICAgIG9mZnNldCA9IGJ5dGUgPT0gdGFnW3RhZ2xlbiAtIDFdID8gdGFnbGVuIC0gMiA6IHRhZ2xlbiAtIDE7CisgICAgcG9zLS07CiAgICAgaWYgKHBvcyA8IDApCiAgICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLQotICByZXR1cm4gZmFsc2U7CiB9CiAKLUZYX0ZJTEVTSVpFIENQREZfU3ludGF4UGFyc2VyOjpGaW5kVGFnKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFnLAorRlhfRklMRVNJWkUgQ1BERl9TeW50YXhQYXJzZXI6OkZpbmRUYWcoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHRhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIGxpbWl0KSB7CiAgIGludDMyX3QgdGFnbGVuID0gdGFnLkdldExlbmd0aCgpOwogICBpbnQzMl90IG1hdGNoID0gMDsKQEAgLTkwOCw3ICs3NzAsMTEgQEAKICAgcmV0dXJuIC0xOwogfQogCi12b2lkIENQREZfU3ludGF4UGFyc2VyOjpTZXRFbmNyeXB0KAotICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0NyeXB0b0hhbmRsZXI+IHBDcnlwdG9IYW5kbGVyKSB7Ci0gIG1fcENyeXB0b0hhbmRsZXIgPSBzdGQ6Om1vdmUocENyeXB0b0hhbmRsZXIpOworUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IENQREZfU3ludGF4UGFyc2VyOjpHZXRGaWxlQWNjZXNzKCkgY29uc3QgeworICByZXR1cm4gbV9wRmlsZUFjY2VzczsKK30KKworYm9vbCBDUERGX1N5bnRheFBhcnNlcjo6SXNQb3NpdGlvblJlYWQoRlhfRklMRVNJWkUgcG9zKSBjb25zdCB7CisgIHJldHVybiBtX0J1Zk9mZnNldCA8PSBwb3MgJiYKKyAgICAgICAgIHBvcyA8IHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX0J1Zk9mZnNldCArIG1fcEZpbGVCdWYuc2l6ZSgpKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zeW50YXhfcGFyc2VyLmggYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3ludGF4X3BhcnNlci5oCmluZGV4IDhkZDkxMDMuLmQzNDQyODggMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zeW50YXhfcGFyc2VyLmgKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N5bnRheF9wYXJzZXIuaApAQCAtNyw1NCArNyw2MCBAQAogI2lmbmRlZiBDT1JFX0ZQREZBUElfUEFSU0VSX0NQREZfU1lOVEFYX1BBUlNFUl9IXwogI2RlZmluZSBDT1JFX0ZQREZBUElfUEFSU0VSX0NQREZfU1lOVEFYX1BBUlNFUl9IXwogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9zdHJpbmdfcG9vbF90ZW1wbGF0ZS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3dlYWtfcHRyLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvc3RyaW5nX3Bvb2xfdGVtcGxhdGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3dlYWtfcHRyLmgiCiAKIGNsYXNzIENQREZfQ3J5cHRvSGFuZGxlcjsKIGNsYXNzIENQREZfRGljdGlvbmFyeTsKIGNsYXNzIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXI7CiBjbGFzcyBDUERGX09iamVjdDsKK2NsYXNzIENQREZfUmVhZFZhbGlkYXRvcjsKIGNsYXNzIENQREZfU3RyZWFtOwogY2xhc3MgSUZYX1NlZWthYmxlUmVhZFN0cmVhbTsKIAogY2xhc3MgQ1BERl9TeW50YXhQYXJzZXIgewogIHB1YmxpYzoKKyAgZW51bSBjbGFzcyBQYXJzZVR5cGUgeyBrU3RyaWN0LCBrTG9vc2UgfTsKKwogICBDUERGX1N5bnRheFBhcnNlcigpOwotICBleHBsaWNpdCBDUERGX1N5bnRheFBhcnNlcihjb25zdCBDRlhfV2Vha1B0cjxDRlhfQnl0ZVN0cmluZ1Bvb2w+JiBwUG9vbCk7CisgIGV4cGxpY2l0IENQREZfU3ludGF4UGFyc2VyKGNvbnN0IFdlYWtQdHI8Qnl0ZVN0cmluZ1Bvb2w+JiBwUG9vbCk7CiAgIH5DUERGX1N5bnRheFBhcnNlcigpOwogCi0gIHZvaWQgSW5pdFBhcnNlcihjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZUFjY2VzcywKKyAgdm9pZCBJbml0UGFyc2VyKGNvbnN0IFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGVBY2Nlc3MsCiAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBIZWFkZXJPZmZzZXQpOwogCi0gIEZYX0ZJTEVTSVpFIFNhdmVQb3MoKSBjb25zdCB7IHJldHVybiBtX1BvczsgfQotICB2b2lkIFJlc3RvcmVQb3MoRlhfRklMRVNJWkUgcG9zKSB7IG1fUG9zID0gcG9zOyB9CisgIHZvaWQgSW5pdFBhcnNlcldpdGhWYWxpZGF0b3IoY29uc3QgUmV0YWluUHRyPENQREZfUmVhZFZhbGlkYXRvcj4mIHBWYWxpZGF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSGVhZGVyT2Zmc2V0KTsKIAotICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IEdldE9iamVjdChDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBwT2JqTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2JqbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkRlY3J5cHQpOworICBGWF9GSUxFU0laRSBHZXRQb3MoKSBjb25zdCB7IHJldHVybiBtX1BvczsgfQorICB2b2lkIFNldFBvcyhGWF9GSUxFU0laRSBwb3MpIHsgbV9Qb3MgPSBzdGQ6Om1pbihwb3MsIG1fRmlsZUxlbik7IH0KIAotICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IEdldE9iamVjdEZvclN0cmljdCgKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBHZXRPYmplY3RCb2R5KAorICAgICAgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciogcE9iakxpc3QpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gR2V0SW5kaXJlY3RPYmplY3QoCiAgICAgICBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBwT2JqTGlzdCwKLSAgICAgIHVpbnQzMl90IG9iam51bSwKLSAgICAgIHVpbnQzMl90IGdlbm51bSk7CisgICAgICBQYXJzZVR5cGUgcGFyc2VfdHlwZSk7CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0S2V5d29yZCgpOworICBCeXRlU3RyaW5nIEdldEtleXdvcmQoKTsKICAgdm9pZCBUb05leHRMaW5lKCk7CiAgIHZvaWQgVG9OZXh0V29yZCgpOwotICBib29sIFNlYXJjaFdvcmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB3b3JkLAotICAgICAgICAgICAgICAgICAgYm9vbCBiV2hvbGVXb3JkLAotICAgICAgICAgICAgICAgICAgYm9vbCBiRm9yd2FyZCwKLSAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIGxpbWl0KTsKLQotICBGWF9GSUxFU0laRSBGaW5kVGFnKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFnLCBGWF9GSUxFU0laRSBsaW1pdCk7Ci0gIHZvaWQgU2V0RW5jcnlwdChzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9DcnlwdG9IYW5kbGVyPiBwQ3J5cHRvSGFuZGxlcik7CisgIGJvb2wgQmFja3dhcmRzU2VhcmNoVG9Xb3JkKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiB3b3JkLCBGWF9GSUxFU0laRSBsaW1pdCk7CisgIEZYX0ZJTEVTSVpFIEZpbmRUYWcoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHRhZywgRlhfRklMRVNJWkUgbGltaXQpOwogICBib29sIFJlYWRCbG9jayh1aW50OF90KiBwQnVmLCB1aW50MzJfdCBzaXplKTsKICAgYm9vbCBHZXRDaGFyQXQoRlhfRklMRVNJWkUgcG9zLCB1aW50OF90JiBjaCk7Ci0gIENGWF9CeXRlU3RyaW5nIEdldE5leHRXb3JkKGJvb2wqIGJJc051bWJlcik7CisgIEJ5dGVTdHJpbmcgR2V0TmV4dFdvcmQoYm9vbCogYklzTnVtYmVyKTsKKyAgQnl0ZVN0cmluZyBQZWVrTmV4dFdvcmQoYm9vbCogYklzTnVtYmVyKTsKKworICBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gR2V0RmlsZUFjY2VzcygpIGNvbnN0OworCisgIGNvbnN0IFJldGFpblB0cjxDUERGX1JlYWRWYWxpZGF0b3I+JiBHZXRWYWxpZGF0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fcEZpbGVBY2Nlc3M7CisgIH0KIAogIHByaXZhdGU6CiAgIGZyaWVuZCBjbGFzcyBDUERGX1BhcnNlcjsKQEAgLTY1LDQwICs3MSwzNiBAQAogICBzdGF0aWMgaW50IHNfQ3VycmVudFJlY3Vyc2lvbkRlcHRoOwogCiAgIHVpbnQzMl90IEdldERpcmVjdE51bSgpOwotICBib29sIFJlYWRDaGFyKEZYX0ZJTEVTSVpFIHJlYWRfcG9zLCB1aW50MzJfdCByZWFkX3NpemUpOworICBib29sIFJlYWRCbG9ja0F0KEZYX0ZJTEVTSVpFIHJlYWRfcG9zKTsKICAgYm9vbCBHZXROZXh0Q2hhcih1aW50OF90JiBjaCk7Ci0gIGJvb2wgR2V0Q2hhckF0QmFja3dhcmQoRlhfRklMRVNJWkUgcG9zLCB1aW50OF90JiBjaCk7CisgIGJvb2wgR2V0Q2hhckF0QmFja3dhcmQoRlhfRklMRVNJWkUgcG9zLCB1aW50OF90KiBjaCk7CiAgIHZvaWQgR2V0TmV4dFdvcmRJbnRlcm5hbChib29sKiBiSXNOdW1iZXIpOwogICBib29sIElzV2hvbGVXb3JkKEZYX0ZJTEVTSVpFIHN0YXJ0cG9zLAogICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIGxpbWl0LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFnLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiB0YWcsCiAgICAgICAgICAgICAgICAgICAgYm9vbCBjaGVja0tleXdvcmQpOwogCi0gIENGWF9CeXRlU3RyaW5nIFJlYWRTdHJpbmcoKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgUmVhZEhleFN0cmluZygpOworICBCeXRlU3RyaW5nIFJlYWRTdHJpbmcoKTsKKyAgQnl0ZVN0cmluZyBSZWFkSGV4U3RyaW5nKCk7CiAgIHVuc2lnbmVkIGludCBSZWFkRU9MTWFya2VycyhGWF9GSUxFU0laRSBwb3MpOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9TdHJlYW0+IFJlYWRTdHJlYW0oCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5PiBwRGljdCwKLSAgICAgIHVpbnQzMl90IG9iam51bSwKLSAgICAgIHVpbnQzMl90IGdlbm51bSk7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5PiBwRGljdCk7CiAKLSAgaW5saW5lIGJvb2wgQ2hlY2tQb3NpdGlvbihGWF9GSUxFU0laRSBwb3MpIHsKLSAgICByZXR1cm4gbV9CdWZPZmZzZXQgPj0gcG9zIHx8Ci0gICAgICAgICAgIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX0J1Zk9mZnNldCArIG1fQnVmU2l6ZSkgPD0gcG9zOwotICB9CisgIGJvb2wgSXNQb3NpdGlvblJlYWQoRlhfRklMRVNJWkUgcG9zKSBjb25zdDsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IEdldE9iamVjdEJvZHlJbnRlcm5hbCgKKyAgICAgIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIqIHBPYmpMaXN0LAorICAgICAgUGFyc2VUeXBlIHBhcnNlX3R5cGUpOwogCiAgIEZYX0ZJTEVTSVpFIG1fUG9zOwotICB1aW50MzJfdCBtX01ldGFkYXRhT2JqbnVtOwotICBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IG1fcEZpbGVBY2Nlc3M7CisgIFJldGFpblB0cjxDUERGX1JlYWRWYWxpZGF0b3I+IG1fcEZpbGVBY2Nlc3M7CiAgIEZYX0ZJTEVTSVpFIG1fSGVhZGVyT2Zmc2V0OwogICBGWF9GSUxFU0laRSBtX0ZpbGVMZW47Ci0gIHVpbnQ4X3QqIG1fcEZpbGVCdWY7Ci0gIHVpbnQzMl90IG1fQnVmU2l6ZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbV9wRmlsZUJ1ZjsKICAgRlhfRklMRVNJWkUgbV9CdWZPZmZzZXQ7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0NyeXB0b0hhbmRsZXI+IG1fcENyeXB0b0hhbmRsZXI7CiAgIHVpbnQ4X3QgbV9Xb3JkQnVmZmVyWzI1N107CiAgIHVpbnQzMl90IG1fV29yZFNpemU7Ci0gIENGWF9XZWFrUHRyPENGWF9CeXRlU3RyaW5nUG9vbD4gbV9wUG9vbDsKKyAgV2Vha1B0cjxCeXRlU3RyaW5nUG9vbD4gbV9wUG9vbDsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9GUERGQVBJX1BBUlNFUl9DUERGX1NZTlRBWF9QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zeW50YXhfcGFyc2VyX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zeW50YXhfcGFyc2VyX3VuaXR0ZXN0LmNwcAppbmRleCA2NGMzM2JhLi5jYjA2NWViIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3ludGF4X3BhcnNlcl91bml0dGVzdC5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N5bnRheF9wYXJzZXJfdW5pdHRlc3QuY3BwCkBAIC04LDcgKzgsOCBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3QuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N5bnRheF9wYXJzZXIuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X21lbW9yeXN0cmVhbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJlYW0uaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL3V0aWxzL3BhdGhfc2VydmljZS5oIgpAQCAtMTgsODQgKzE5LDg0IEBACiAgICAgLy8gRW1wdHkgc3RyaW5nLgogICAgIHVpbnQ4X3QgZGF0YVtdID0gIiI7CiAgICAgQ1BERl9TeW50YXhQYXJzZXIgcGFyc2VyOwotICAgIHBhcnNlci5Jbml0UGFyc2VyKElGWF9NZW1vcnlTdHJlYW06OkNyZWF0ZShkYXRhLCAwLCBmYWxzZSksIDApOworICAgIHBhcnNlci5Jbml0UGFyc2VyKHBkZml1bTo6TWFrZVJldGFpbjxDRlhfTWVtb3J5U3RyZWFtPihkYXRhLCAwLCBmYWxzZSksIDApOwogICAgIEVYUEVDVF9FUSgiIiwgcGFyc2VyLlJlYWRIZXhTdHJpbmcoKSk7Ci0gICAgRVhQRUNUX0VRKDAsIHBhcnNlci5TYXZlUG9zKCkpOworICAgIEVYUEVDVF9FUSgwLCBwYXJzZXIuR2V0UG9zKCkpOwogICB9CiAKICAgewogICAgIC8vIEJsYW5rIHN0cmluZy4KICAgICB1aW50OF90IGRhdGFbXSA9ICIgICI7CiAgICAgQ1BERl9TeW50YXhQYXJzZXIgcGFyc2VyOwotICAgIHBhcnNlci5Jbml0UGFyc2VyKElGWF9NZW1vcnlTdHJlYW06OkNyZWF0ZShkYXRhLCAyLCBmYWxzZSksIDApOworICAgIHBhcnNlci5Jbml0UGFyc2VyKHBkZml1bTo6TWFrZVJldGFpbjxDRlhfTWVtb3J5U3RyZWFtPihkYXRhLCAyLCBmYWxzZSksIDApOwogICAgIEVYUEVDVF9FUSgiIiwgcGFyc2VyLlJlYWRIZXhTdHJpbmcoKSk7Ci0gICAgRVhQRUNUX0VRKDIsIHBhcnNlci5TYXZlUG9zKCkpOworICAgIEVYUEVDVF9FUSgyLCBwYXJzZXIuR2V0UG9zKCkpOwogICB9CiAKICAgewogICAgIC8vIFNraXBzIHVua25vd24gY2hhcmFjdGVycy4KICAgICB1aW50OF90IGRhdGFbXSA9ICJ6MTJiIjsKICAgICBDUERGX1N5bnRheFBhcnNlciBwYXJzZXI7Ci0gICAgcGFyc2VyLkluaXRQYXJzZXIoSUZYX01lbW9yeVN0cmVhbTo6Q3JlYXRlKGRhdGEsIDQsIGZhbHNlKSwgMCk7CisgICAgcGFyc2VyLkluaXRQYXJzZXIocGRmaXVtOjpNYWtlUmV0YWluPENGWF9NZW1vcnlTdHJlYW0+KGRhdGEsIDQsIGZhbHNlKSwgMCk7CiAgICAgRVhQRUNUX0VRKCJceDEyXHhiMCIsIHBhcnNlci5SZWFkSGV4U3RyaW5nKCkpOwotICAgIEVYUEVDVF9FUSg0LCBwYXJzZXIuU2F2ZVBvcygpKTsKKyAgICBFWFBFQ1RfRVEoNCwgcGFyc2VyLkdldFBvcygpKTsKICAgfQogCiAgIHsKICAgICAvLyBTa2lwcyB1bmtub3duIGNoYXJhY3RlcnMuCiAgICAgdWludDhfdCBkYXRhW10gPSAiKjwmKiMkXiZAMSI7CiAgICAgQ1BERl9TeW50YXhQYXJzZXIgcGFyc2VyOwotICAgIHBhcnNlci5Jbml0UGFyc2VyKElGWF9NZW1vcnlTdHJlYW06OkNyZWF0ZShkYXRhLCAxMCwgZmFsc2UpLCAwKTsKKyAgICBwYXJzZXIuSW5pdFBhcnNlcihwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX01lbW9yeVN0cmVhbT4oZGF0YSwgMTAsIGZhbHNlKSwgMCk7CiAgICAgRVhQRUNUX0VRKCJceDEwIiwgcGFyc2VyLlJlYWRIZXhTdHJpbmcoKSk7Ci0gICAgRVhQRUNUX0VRKDEwLCBwYXJzZXIuU2F2ZVBvcygpKTsKKyAgICBFWFBFQ1RfRVEoMTAsIHBhcnNlci5HZXRQb3MoKSk7CiAgIH0KIAogICB7CiAgICAgLy8gU2tpcHMgdW5rbm93biBjaGFyYWN0ZXJzLgogICAgIHVpbnQ4X3QgZGF0YVtdID0gIlx4ODB6YWIiOwogICAgIENQREZfU3ludGF4UGFyc2VyIHBhcnNlcjsKLSAgICBwYXJzZXIuSW5pdFBhcnNlcihJRlhfTWVtb3J5U3RyZWFtOjpDcmVhdGUoZGF0YSwgNCwgZmFsc2UpLCAwKTsKKyAgICBwYXJzZXIuSW5pdFBhcnNlcihwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX01lbW9yeVN0cmVhbT4oZGF0YSwgNCwgZmFsc2UpLCAwKTsKICAgICBFWFBFQ1RfRVEoIlx4YWIiLCBwYXJzZXIuUmVhZEhleFN0cmluZygpKTsKLSAgICBFWFBFQ1RfRVEoNCwgcGFyc2VyLlNhdmVQb3MoKSk7CisgICAgRVhQRUNUX0VRKDQsIHBhcnNlci5HZXRQb3MoKSk7CiAgIH0KIAogICB7CiAgICAgLy8gU2tpcHMgdW5rbm93biBjaGFyYWN0ZXJzLgogICAgIHVpbnQ4X3QgZGF0YVtdID0gIlx4ZmZ6YWIiOwogICAgIENQREZfU3ludGF4UGFyc2VyIHBhcnNlcjsKLSAgICBwYXJzZXIuSW5pdFBhcnNlcihJRlhfTWVtb3J5U3RyZWFtOjpDcmVhdGUoZGF0YSwgNCwgZmFsc2UpLCAwKTsKKyAgICBwYXJzZXIuSW5pdFBhcnNlcihwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX01lbW9yeVN0cmVhbT4oZGF0YSwgNCwgZmFsc2UpLCAwKTsKICAgICBFWFBFQ1RfRVEoIlx4YWIiLCBwYXJzZXIuUmVhZEhleFN0cmluZygpKTsKLSAgICBFWFBFQ1RfRVEoNCwgcGFyc2VyLlNhdmVQb3MoKSk7CisgICAgRVhQRUNUX0VRKDQsIHBhcnNlci5HZXRQb3MoKSk7CiAgIH0KIAogICB7CiAgICAgLy8gUmVndWxhciBjb252ZXJzaW9uLgogICAgIHVpbnQ4X3QgZGF0YVtdID0gIjFBMmI+YWJjZCI7CiAgICAgQ1BERl9TeW50YXhQYXJzZXIgcGFyc2VyOwotICAgIHBhcnNlci5Jbml0UGFyc2VyKElGWF9NZW1vcnlTdHJlYW06OkNyZWF0ZShkYXRhLCA5LCBmYWxzZSksIDApOworICAgIHBhcnNlci5Jbml0UGFyc2VyKHBkZml1bTo6TWFrZVJldGFpbjxDRlhfTWVtb3J5U3RyZWFtPihkYXRhLCA5LCBmYWxzZSksIDApOwogICAgIEVYUEVDVF9FUSgiXHgxYVx4MmIiLCBwYXJzZXIuUmVhZEhleFN0cmluZygpKTsKLSAgICBFWFBFQ1RfRVEoNSwgcGFyc2VyLlNhdmVQb3MoKSk7CisgICAgRVhQRUNUX0VRKDUsIHBhcnNlci5HZXRQb3MoKSk7CiAgIH0KIAogICB7CiAgICAgLy8gUG9zaXRpb24gb3V0IG9mIGJvdW5kcy4KICAgICB1aW50OF90IGRhdGFbXSA9ICIxMmFiPiI7CiAgICAgQ1BERl9TeW50YXhQYXJzZXIgcGFyc2VyOwotICAgIHBhcnNlci5Jbml0UGFyc2VyKElGWF9NZW1vcnlTdHJlYW06OkNyZWF0ZShkYXRhLCA1LCBmYWxzZSksIDApOwotICAgIHBhcnNlci5SZXN0b3JlUG9zKDUpOworICAgIHBhcnNlci5Jbml0UGFyc2VyKHBkZml1bTo6TWFrZVJldGFpbjxDRlhfTWVtb3J5U3RyZWFtPihkYXRhLCA1LCBmYWxzZSksIDApOworICAgIHBhcnNlci5TZXRQb3MoNSk7CiAgICAgRVhQRUNUX0VRKCIiLCBwYXJzZXIuUmVhZEhleFN0cmluZygpKTsKIAotICAgIHBhcnNlci5SZXN0b3JlUG9zKDYpOworICAgIHBhcnNlci5TZXRQb3MoNik7CiAgICAgRVhQRUNUX0VRKCIiLCBwYXJzZXIuUmVhZEhleFN0cmluZygpKTsKIAotICAgIHBhcnNlci5SZXN0b3JlUG9zKC0xKTsKKyAgICBwYXJzZXIuU2V0UG9zKC0xKTsKICAgICBFWFBFQ1RfRVEoIiIsIHBhcnNlci5SZWFkSGV4U3RyaW5nKCkpOwogCi0gICAgcGFyc2VyLlJlc3RvcmVQb3Moc3RkOjpudW1lcmljX2xpbWl0czxGWF9GSUxFU0laRT46Om1heCgpKTsKKyAgICBwYXJzZXIuU2V0UG9zKHN0ZDo6bnVtZXJpY19saW1pdHM8RlhfRklMRVNJWkU+OjptYXgoKSk7CiAgICAgRVhQRUNUX0VRKCIiLCBwYXJzZXIuUmVhZEhleFN0cmluZygpKTsKIAogICAgIC8vIENoZWNrIHN0cmluZyBzdGlsbCBwYXJzZXMgd2hlbiBzZXQgdG8gMC4KLSAgICBwYXJzZXIuUmVzdG9yZVBvcygwKTsKKyAgICBwYXJzZXIuU2V0UG9zKDApOwogICAgIEVYUEVDVF9FUSgiXHgxMlx4YWIiLCBwYXJzZXIuUmVhZEhleFN0cmluZygpKTsKICAgfQogCkBAIC0xMDMsNDUgKzEwNCw0NSBAQAogICAgIC8vIE1pc3NpbmcgZW5kaW5nID4uCiAgICAgdWludDhfdCBkYXRhW10gPSAiMUEyYiI7CiAgICAgQ1BERl9TeW50YXhQYXJzZXIgcGFyc2VyOwotICAgIHBhcnNlci5Jbml0UGFyc2VyKElGWF9NZW1vcnlTdHJlYW06OkNyZWF0ZShkYXRhLCA0LCBmYWxzZSksIDApOworICAgIHBhcnNlci5Jbml0UGFyc2VyKHBkZml1bTo6TWFrZVJldGFpbjxDRlhfTWVtb3J5U3RyZWFtPihkYXRhLCA0LCBmYWxzZSksIDApOwogICAgIEVYUEVDVF9FUSgiXHgxYVx4MmIiLCBwYXJzZXIuUmVhZEhleFN0cmluZygpKTsKLSAgICBFWFBFQ1RfRVEoNCwgcGFyc2VyLlNhdmVQb3MoKSk7CisgICAgRVhQRUNUX0VRKDQsIHBhcnNlci5HZXRQb3MoKSk7CiAgIH0KIAogICB7CiAgICAgLy8gTWlzc2luZyBlbmRpbmcgPi4KICAgICB1aW50OF90IGRhdGFbXSA9ICIxMmFieiI7CiAgICAgQ1BERl9TeW50YXhQYXJzZXIgcGFyc2VyOwotICAgIHBhcnNlci5Jbml0UGFyc2VyKElGWF9NZW1vcnlTdHJlYW06OkNyZWF0ZShkYXRhLCA1LCBmYWxzZSksIDApOworICAgIHBhcnNlci5Jbml0UGFyc2VyKHBkZml1bTo6TWFrZVJldGFpbjxDRlhfTWVtb3J5U3RyZWFtPihkYXRhLCA1LCBmYWxzZSksIDApOwogICAgIEVYUEVDVF9FUSgiXHgxMlx4YWIiLCBwYXJzZXIuUmVhZEhleFN0cmluZygpKTsKLSAgICBFWFBFQ1RfRVEoNSwgcGFyc2VyLlNhdmVQb3MoKSk7CisgICAgRVhQRUNUX0VRKDUsIHBhcnNlci5HZXRQb3MoKSk7CiAgIH0KIAogICB7CiAgICAgLy8gVW5ldmVuIG51bWJlciBvZiBieXRlcy4KICAgICB1aW50OF90IGRhdGFbXSA9ICIxQTI+YXNkZiI7CiAgICAgQ1BERl9TeW50YXhQYXJzZXIgcGFyc2VyOwotICAgIHBhcnNlci5Jbml0UGFyc2VyKElGWF9NZW1vcnlTdHJlYW06OkNyZWF0ZShkYXRhLCA4LCBmYWxzZSksIDApOworICAgIHBhcnNlci5Jbml0UGFyc2VyKHBkZml1bTo6TWFrZVJldGFpbjxDRlhfTWVtb3J5U3RyZWFtPihkYXRhLCA4LCBmYWxzZSksIDApOwogICAgIEVYUEVDVF9FUSgiXHgxYVx4MjAiLCBwYXJzZXIuUmVhZEhleFN0cmluZygpKTsKLSAgICBFWFBFQ1RfRVEoNCwgcGFyc2VyLlNhdmVQb3MoKSk7CisgICAgRVhQRUNUX0VRKDQsIHBhcnNlci5HZXRQb3MoKSk7CiAgIH0KIAogICB7CiAgICAgLy8gVW5ldmVuIG51bWJlciBvZiBieXRlcy4KICAgICB1aW50OF90IGRhdGFbXSA9ICIxQTJ6YXNkZiI7CiAgICAgQ1BERl9TeW50YXhQYXJzZXIgcGFyc2VyOwotICAgIHBhcnNlci5Jbml0UGFyc2VyKElGWF9NZW1vcnlTdHJlYW06OkNyZWF0ZShkYXRhLCA4LCBmYWxzZSksIDApOworICAgIHBhcnNlci5Jbml0UGFyc2VyKHBkZml1bTo6TWFrZVJldGFpbjxDRlhfTWVtb3J5U3RyZWFtPihkYXRhLCA4LCBmYWxzZSksIDApOwogICAgIEVYUEVDVF9FUSgiXHgxYVx4MmFceGRmIiwgcGFyc2VyLlJlYWRIZXhTdHJpbmcoKSk7Ci0gICAgRVhQRUNUX0VRKDgsIHBhcnNlci5TYXZlUG9zKCkpOworICAgIEVYUEVDVF9FUSg4LCBwYXJzZXIuR2V0UG9zKCkpOwogICB9CiAKICAgewogICAgIC8vIEp1c3QgZW5kaW5nIGNoYXJhY3Rlci4KICAgICB1aW50OF90IGRhdGFbXSA9ICI+IjsKICAgICBDUERGX1N5bnRheFBhcnNlciBwYXJzZXI7Ci0gICAgcGFyc2VyLkluaXRQYXJzZXIoSUZYX01lbW9yeVN0cmVhbTo6Q3JlYXRlKGRhdGEsIDEsIGZhbHNlKSwgMCk7CisgICAgcGFyc2VyLkluaXRQYXJzZXIocGRmaXVtOjpNYWtlUmV0YWluPENGWF9NZW1vcnlTdHJlYW0+KGRhdGEsIDEsIGZhbHNlKSwgMCk7CiAgICAgRVhQRUNUX0VRKCIiLCBwYXJzZXIuUmVhZEhleFN0cmluZygpKTsKLSAgICBFWFBFQ1RfRVEoMSwgcGFyc2VyLlNhdmVQb3MoKSk7CisgICAgRVhQRUNUX0VRKDEsIHBhcnNlci5HZXRQb3MoKSk7CiAgIH0KIH0KIApAQCAtMTQ5LDggKzE1MCwxNiBAQAogICBDUERGX1N5bnRheFBhcnNlciBwYXJzZXI7CiAgIC8vIERhdGEgd2l0aCBhIHJlZmVyZW5jZSB3aXRoIG51bWJlciBDUERGX09iamVjdDo6a0ludmFsaWRPYmpOdW0KICAgdWludDhfdCBkYXRhW10gPSAiNDI5NDk2NzI5NSAwIFIiOwotICBwYXJzZXIuSW5pdFBhcnNlcihJRlhfTWVtb3J5U3RyZWFtOjpDcmVhdGUoZGF0YSwgMTQsIGZhbHNlKSwgMCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gcmVmID0KLSAgICAgIHBhcnNlci5HZXRPYmplY3QobnVsbHB0ciwgQ1BERl9PYmplY3Q6OmtJbnZhbGlkT2JqTnVtLCAwLCBmYWxzZSk7CisgIHBhcnNlci5Jbml0UGFyc2VyKHBkZml1bTo6TWFrZVJldGFpbjxDRlhfTWVtb3J5U3RyZWFtPihkYXRhLCAxNCwgZmFsc2UpLCAwKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiByZWYgPSBwYXJzZXIuR2V0T2JqZWN0Qm9keShudWxscHRyKTsKICAgRVhQRUNUX0ZBTFNFKHJlZik7CiB9CisKK1RFU1QoY3BkZl9zeW50YXhfcGFyc2VyLCBQZWVrTmV4dFdvcmQpIHsKKyAgQ1BERl9TeW50YXhQYXJzZXIgcGFyc2VyOworICB1aW50OF90IGRhdGFbXSA9ICIgICAgV09SRCAiOworICBwYXJzZXIuSW5pdFBhcnNlcigKKyAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDRlhfTWVtb3J5U3RyZWFtPihkYXRhLCBzaXplb2YoZGF0YSksIGZhbHNlKSwgMCk7CisgIEVYUEVDVF9FUSgiV09SRCIsIHBhcnNlci5QZWVrTmV4dFdvcmQobnVsbHB0cikpOworICBFWFBFQ1RfRVEoIldPUkQiLCBwYXJzZXIuR2V0TmV4dFdvcmQobnVsbHB0cikpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGUuY3BwIGIvY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGUuY3BwCmluZGV4IDQ4MGUyYzEuLmQ3MTE0YjYgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZS5jcHAKQEAgLTksNiArOSw3IEBACiAjaW5jbHVkZSA8bGltaXRzLmg+CiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIApAQCAtMTYsMjcgKzE3LDMyIEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2ZwZGZfcGFyc2VyX3V0aWxpdHkuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2ZheG1vZHVsZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfZmxhdGVtb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX3NjYW5saW5lZGVjb2Rlci5oIgogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9meF9jb2RlYy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX21hdGguaCIKIAogbmFtZXNwYWNlIHsKIAogY29uc3QgdWludDMyX3Qga01heFN0cmVhbVNpemUgPSAyMCAqIDEwMjQgKiAxMDI0OwogCit1aW50MTZfdCBHZXRVbmljb2RlRnJvbUJ5dGVzKGNvbnN0IHVpbnQ4X3QqIGJ5dGVzLCBib29sIGJCRSkgeworICByZXR1cm4gYkJFID8gKGJ5dGVzWzBdIDw8IDggfCBieXRlc1sxXSkgOiAoYnl0ZXNbMV0gPDwgOCB8IGJ5dGVzWzBdKTsKK30KKwogYm9vbCBDaGVja0ZsYXRlRGVjb2RlUGFyYW1zKGludCBDb2xvcnMsIGludCBCaXRzUGVyQ29tcG9uZW50LCBpbnQgQ29sdW1ucykgewogICBpZiAoQ29sb3JzIDwgMCB8fCBCaXRzUGVyQ29tcG9uZW50IDwgMCB8fCBDb2x1bW5zIDwgMCkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgaW50IGNoZWNrID0gQ29sdW1uczsKLSAgaWYgKGNoZWNrID4gMCAmJiBDb2xvcnMgPiBJTlRfTUFYIC8gY2hlY2spCi0gICAgcmV0dXJuIGZhbHNlOwotCisgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8aW50PiBjaGVjayA9IENvbHVtbnM7CiAgIGNoZWNrICo9IENvbG9yczsKLSAgaWYgKGNoZWNrID4gMCAmJiBCaXRzUGVyQ29tcG9uZW50ID4gSU5UX01BWCAvIGNoZWNrKQorICBjaGVjayAqPSBCaXRzUGVyQ29tcG9uZW50OworICBpZiAoIWNoZWNrLklzVmFsaWQoKSkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgcmV0dXJuIGNoZWNrICogQml0c1BlckNvbXBvbmVudCA8PSBJTlRfTUFYIC0gNzsKKyAgcmV0dXJuIGNoZWNrLlZhbHVlT3JEaWUoKSA8PSBJTlRfTUFYIC0gNzsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCkBAIC03NCwxMCArODAsMTAgQEAKIAogdWludDMyX3QgQTg1RGVjb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCiAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAotICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBkZXN0X3NpemUpIHsKLSAgZGVzdF9zaXplID0gMDsKLSAgZGVzdF9idWYgPSBudWxscHRyOworICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZGVzdF9zaXplKSB7CisgICpkZXN0X3NpemUgPSAwOworICAqZGVzdF9idWYgPSBudWxscHRyOwogICBpZiAoc3JjX3NpemUgPT0gMCkKICAgICByZXR1cm4gMDsKIApAQCAtMTAxLDY4ICsxMDcsNzIgQEAKICAgLy8gQ291bnQgdGhlIHNwYWNlIG5lZWRlZCB0byBjb250YWluIG5vbi16ZXJvIGNoYXJhY3RlcnMuIFRoZSBlbmNvZGluZyByYXRpbwogICAvLyBvZiBBc2NpaTg1IGlzIDQ6NS4KICAgdWludDMyX3Qgc3BhY2VfZm9yX25vbl96ZXJvZXMgPSAocG9zIC0gemNvdW50KSAvIDUgKiA0ICsgNDsKLSAgaWYgKHpjb3VudCA+IChVSU5UX01BWCAtIHNwYWNlX2Zvcl9ub25femVyb2VzKSAvIDQpIHsKLSAgICByZXR1cm4gKHVpbnQzMl90KS0xOwotICB9Ci0gIGRlc3RfYnVmID0gRlhfQWxsb2ModWludDhfdCwgemNvdW50ICogNCArIHNwYWNlX2Zvcl9ub25femVyb2VzKTsKKyAgaWYgKHpjb3VudCA+IChVSU5UX01BWCAtIHNwYWNlX2Zvcl9ub25femVyb2VzKSAvIDQpCisgICAgcmV0dXJuIEZYX0lOVkFMSURfT0ZGU0VUOworCisgICpkZXN0X2J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHpjb3VudCAqIDQgKyBzcGFjZV9mb3Jfbm9uX3plcm9lcyk7CiAgIHNpemVfdCBzdGF0ZSA9IDA7CiAgIHVpbnQzMl90IHJlcyA9IDA7Ci0gIHBvcyA9IGRlc3Rfc2l6ZSA9IDA7CisgIHBvcyA9IDA7CiAgIHdoaWxlIChwb3MgPCBzcmNfc2l6ZSkgewogICAgIHVpbnQ4X3QgY2ggPSBzcmNfYnVmW3BvcysrXTsKICAgICBpZiAoUERGQ2hhcklzTGluZUVuZGluZyhjaCkgfHwgY2ggPT0gJyAnIHx8IGNoID09ICdcdCcpCiAgICAgICBjb250aW51ZTsKIAogICAgIGlmIChjaCA9PSAneicpIHsKLSAgICAgIEZYU1lTX21lbXNldChkZXN0X2J1ZiArIGRlc3Rfc2l6ZSwgMCwgNCk7CisgICAgICBtZW1zZXQoKmRlc3RfYnVmICsgKmRlc3Rfc2l6ZSwgMCwgNCk7CiAgICAgICBzdGF0ZSA9IDA7CiAgICAgICByZXMgPSAwOwotICAgICAgZGVzdF9zaXplICs9IDQ7Ci0gICAgfSBlbHNlIGlmIChjaCA+PSAnIScgJiYgY2ggPD0gJ3UnKSB7Ci0gICAgICByZXMgPSByZXMgKiA4NSArIGNoIC0gMzM7Ci0gICAgICBzdGF0ZSsrOwotICAgICAgaWYgKHN0YXRlID09IDUpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgICAgICBkZXN0X2J1ZltkZXN0X3NpemUrK10gPSAodWludDhfdCkocmVzID4+ICgzIC0gaSkgKiA4KTsKLSAgICAgICAgfQotICAgICAgICBzdGF0ZSA9IDA7Ci0gICAgICAgIHJlcyA9IDA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFRoZSBlbmQgb3IgaWxsZWdhbCBjaGFyYWN0ZXIuCi0gICAgICBicmVhazsKKyAgICAgICpkZXN0X3NpemUgKz0gNDsKKyAgICAgIGNvbnRpbnVlOwogICAgIH0KKworICAgIC8vIENoZWNrIGZvciB0aGUgZW5kIG9yIGlsbGVnYWwgY2hhcmFjdGVyLgorICAgIGlmIChjaCA8ICchJyB8fCBjaCA+ICd1JykKKyAgICAgIGJyZWFrOworCisgICAgcmVzID0gcmVzICogODUgKyBjaCAtIDMzOworICAgIGlmIChzdGF0ZSA8IDQpIHsKKyAgICAgICsrc3RhdGU7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgKCpkZXN0X2J1ZilbKCpkZXN0X3NpemUpKytdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzID4+ICgzIC0gaSkgKiA4KTsKKyAgICB9CisgICAgc3RhdGUgPSAwOworICAgIHJlcyA9IDA7CiAgIH0KICAgLy8gSGFuZGxlIHBhcnRpYWwgZ3JvdXAuCiAgIGlmIChzdGF0ZSkgewotICAgIGZvciAoc2l6ZV90IGkgPSBzdGF0ZTsgaSA8IDU7IGkrKykKKyAgICBmb3IgKHNpemVfdCBpID0gc3RhdGU7IGkgPCA1OyArK2kpCiAgICAgICByZXMgPSByZXMgKiA4NSArIDg0OwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGUgLSAxOyBpKyspCi0gICAgICBkZXN0X2J1ZltkZXN0X3NpemUrK10gPSAodWludDhfdCkocmVzID4+ICgzIC0gaSkgKiA4KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlIC0gMTsgKytpKQorICAgICAgKCpkZXN0X2J1ZilbKCpkZXN0X3NpemUpKytdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4ocmVzID4+ICgzIC0gaSkgKiA4KTsKICAgfQogICBpZiAocG9zIDwgc3JjX3NpemUgJiYgc3JjX2J1Zltwb3NdID09ICc+JykKLSAgICBwb3MrKzsKKyAgICArK3BvczsKICAgcmV0dXJuIHBvczsKIH0KIAogdWludDMyX3QgSGV4RGVjb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCiAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAotICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBkZXN0X3NpemUpIHsKLSAgZGVzdF9zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICB1aW50OF90KiogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRlc3Rfc2l6ZSkgeworICAqZGVzdF9zaXplID0gMDsKICAgaWYgKHNyY19zaXplID09IDApIHsKLSAgICBkZXN0X2J1ZiA9IG51bGxwdHI7CisgICAgKmRlc3RfYnVmID0gbnVsbHB0cjsKICAgICByZXR1cm4gMDsKICAgfQogCiAgIHVpbnQzMl90IGkgPSAwOwogICAvLyBGaW5kIHRoZSBlbmQgb2YgZGF0YS4KICAgd2hpbGUgKGkgPCBzcmNfc2l6ZSAmJiBzcmNfYnVmW2ldICE9ICc+JykKLSAgICBpKys7CisgICAgKytpOwogCi0gIGRlc3RfYnVmID0gRlhfQWxsb2ModWludDhfdCwgaSAvIDIgKyAxKTsKKyAgKmRlc3RfYnVmID0gRlhfQWxsb2ModWludDhfdCwgaSAvIDIgKyAxKTsKICAgYm9vbCBiRmlyc3QgPSB0cnVlOwotICBmb3IgKGkgPSAwOyBpIDwgc3JjX3NpemU7IGkrKykgeworICBmb3IgKGkgPSAwOyBpIDwgc3JjX3NpemU7ICsraSkgewogICAgIHVpbnQ4X3QgY2ggPSBzcmNfYnVmW2ldOwogICAgIGlmIChQREZDaGFySXNMaW5lRW5kaW5nKGNoKSB8fCBjaCA9PSAnICcgfHwgY2ggPT0gJ1x0JykKICAgICAgIGNvbnRpbnVlOwpAQCAtMTc0LDQ2ICsxODQsNDUgQEAKICAgICBpZiAoIXN0ZDo6aXN4ZGlnaXQoY2gpKQogICAgICAgY29udGludWU7CiAKLSAgICBpbnQgZGlnaXQgPSBGWFNZU190b0hleERpZ2l0KGNoKTsKKyAgICBpbnQgZGlnaXQgPSBGWFNZU19IZXhDaGFyVG9JbnQoY2gpOwogICAgIGlmIChiRmlyc3QpCi0gICAgICBkZXN0X2J1ZltkZXN0X3NpemVdID0gZGlnaXQgKiAxNjsKKyAgICAgICgqZGVzdF9idWYpWypkZXN0X3NpemVdID0gZGlnaXQgKiAxNjsKICAgICBlbHNlCi0gICAgICBkZXN0X2J1ZltkZXN0X3NpemUrK10gKz0gZGlnaXQ7Ci0KKyAgICAgICgqZGVzdF9idWYpWygqZGVzdF9zaXplKSsrXSArPSBkaWdpdDsKICAgICBiRmlyc3QgPSAhYkZpcnN0OwogICB9CiAgIGlmICghYkZpcnN0KQotICAgIGRlc3Rfc2l6ZSsrOworICAgICsrKCpkZXN0X3NpemUpOwogICByZXR1cm4gaTsKIH0KIAogdWludDMyX3QgUnVuTGVuZ3RoRGVjb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBkZXN0X3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRlc3Rfc2l6ZSkgewogICB1aW50MzJfdCBpID0gMDsKLSAgZGVzdF9zaXplID0gMDsKKyAgKmRlc3Rfc2l6ZSA9IDA7CiAgIHdoaWxlIChpIDwgc3JjX3NpemUpIHsKICAgICBpZiAoc3JjX2J1ZltpXSA9PSAxMjgpCiAgICAgICBicmVhazsKIAotICAgIHVpbnQzMl90IG9sZCA9IGRlc3Rfc2l6ZTsKKyAgICB1aW50MzJfdCBvbGQgPSAqZGVzdF9zaXplOwogICAgIGlmIChzcmNfYnVmW2ldIDwgMTI4KSB7Ci0gICAgICBkZXN0X3NpemUgKz0gc3JjX2J1ZltpXSArIDE7Ci0gICAgICBpZiAoZGVzdF9zaXplIDwgb2xkKQorICAgICAgKmRlc3Rfc2l6ZSArPSBzcmNfYnVmW2ldICsgMTsKKyAgICAgIGlmICgqZGVzdF9zaXplIDwgb2xkKQogICAgICAgICByZXR1cm4gRlhfSU5WQUxJRF9PRkZTRVQ7CiAgICAgICBpICs9IHNyY19idWZbaV0gKyAyOwogICAgIH0gZWxzZSB7Ci0gICAgICBkZXN0X3NpemUgKz0gMjU3IC0gc3JjX2J1ZltpXTsKLSAgICAgIGlmIChkZXN0X3NpemUgPCBvbGQpCisgICAgICAqZGVzdF9zaXplICs9IDI1NyAtIHNyY19idWZbaV07CisgICAgICBpZiAoKmRlc3Rfc2l6ZSA8IG9sZCkKICAgICAgICAgcmV0dXJuIEZYX0lOVkFMSURfT0ZGU0VUOwogICAgICAgaSArPSAyOwogICAgIH0KICAgfQotICBpZiAoZGVzdF9zaXplID49IGtNYXhTdHJlYW1TaXplKQorICBpZiAoKmRlc3Rfc2l6ZSA+PSBrTWF4U3RyZWFtU2l6ZSkKICAgICByZXR1cm4gRlhfSU5WQUxJRF9PRkZTRVQ7CiAKLSAgZGVzdF9idWYgPSBGWF9BbGxvYyh1aW50OF90LCBkZXN0X3NpemUpOworICAqZGVzdF9idWYgPSBGWF9BbGxvYyh1aW50OF90LCAqZGVzdF9zaXplKTsKICAgaSA9IDA7CiAgIGludCBkZXN0X2NvdW50ID0gMDsKICAgd2hpbGUgKGkgPCBzcmNfc2l6ZSkgewpAQCAtMjI2LDIyICsyMzUsMjAgQEAKICAgICAgIGlmIChidWZfbGVmdCA8IGNvcHlfbGVuKSB7CiAgICAgICAgIHVpbnQzMl90IGRlbHRhID0gY29weV9sZW4gLSBidWZfbGVmdDsKICAgICAgICAgY29weV9sZW4gPSBidWZfbGVmdDsKLSAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmICsgZGVzdF9jb3VudCArIGNvcHlfbGVuLCAnXDAnLCBkZWx0YSk7CisgICAgICAgIG1lbXNldCgqZGVzdF9idWYgKyBkZXN0X2NvdW50ICsgY29weV9sZW4sICdcMCcsIGRlbHRhKTsKICAgICAgIH0KLSAgICAgIEZYU1lTX21lbWNweShkZXN0X2J1ZiArIGRlc3RfY291bnQsIHNyY19idWYgKyBpICsgMSwgY29weV9sZW4pOworICAgICAgbWVtY3B5KCpkZXN0X2J1ZiArIGRlc3RfY291bnQsIHNyY19idWYgKyBpICsgMSwgY29weV9sZW4pOwogICAgICAgZGVzdF9jb3VudCArPSBzcmNfYnVmW2ldICsgMTsKICAgICAgIGkgKz0gc3JjX2J1ZltpXSArIDI7CiAgICAgfSBlbHNlIHsKICAgICAgIGludCBmaWxsID0gMDsKLSAgICAgIGlmIChpIDwgc3JjX3NpemUgLSAxKSB7CisgICAgICBpZiAoaSA8IHNyY19zaXplIC0gMSkKICAgICAgICAgZmlsbCA9IHNyY19idWZbaSArIDFdOwotICAgICAgfQotICAgICAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmICsgZGVzdF9jb3VudCwgZmlsbCwgMjU3IC0gc3JjX2J1ZltpXSk7CisgICAgICBtZW1zZXQoKmRlc3RfYnVmICsgZGVzdF9jb3VudCwgZmlsbCwgMjU3IC0gc3JjX2J1ZltpXSk7CiAgICAgICBkZXN0X2NvdW50ICs9IDI1NyAtIHNyY19idWZbaV07CiAgICAgICBpICs9IDI7CiAgICAgfQogICB9Ci0KICAgcmV0dXJuIHN0ZDo6bWluKGkgKyAxLCBzcmNfc2l6ZSk7CiB9CiAKQEAgLTI2NCw5ICsyNzEsOCBAQAogICAgIEJsYWNrSXMxID0gISFwUGFyYW1zLT5HZXRJbnRlZ2VyRm9yKCJCbGFja0lzMSIpOwogICAgIENvbHVtbnMgPSBwUGFyYW1zLT5HZXRJbnRlZ2VyRm9yKCJDb2x1bW5zIiwgMTcyOCk7CiAgICAgUm93cyA9IHBQYXJhbXMtPkdldEludGVnZXJGb3IoIlJvd3MiKTsKLSAgICBpZiAoUm93cyA+IFVTSFJUX01BWCkgeworICAgIGlmIChSb3dzID4gVVNIUlRfTUFYKQogICAgICAgUm93cyA9IDA7Ci0gICAgfQogICB9CiAgIHJldHVybiBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEZheE1vZHVsZSgpLT5DcmVhdGVEZWNvZGVyKAogICAgICAgc3JjX2J1Ziwgc3JjX3NpemUsIHdpZHRoLCBoZWlnaHQsIEssIEVuZE9mTGluZSwgQnl0ZUFsaWduLCBCbGFja0lzMSwKQEAgLTI4Miw3ICsyODgsOSBAQAogICAgIGludCBicGMsCiAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zKSB7CiAgIGludCBwcmVkaWN0b3IgPSAwOwotICBpbnQgQ29sb3JzID0gMCwgQml0c1BlckNvbXBvbmVudCA9IDAsIENvbHVtbnMgPSAwOworICBpbnQgQ29sb3JzID0gMDsKKyAgaW50IEJpdHNQZXJDb21wb25lbnQgPSAwOworICBpbnQgQ29sdW1ucyA9IDA7CiAgIGlmIChwUGFyYW1zKSB7CiAgICAgcHJlZGljdG9yID0gcFBhcmFtcy0+R2V0SW50ZWdlckZvcigiUHJlZGljdG9yIik7CiAgICAgQ29sb3JzID0gcFBhcmFtcy0+R2V0SW50ZWdlckZvcigiQ29sb3JzIiwgMSk7CkBAIC0zMDEsOCArMzA5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZXN0aW1hdGVkX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBkZXN0X3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRlc3Rfc2l6ZSkgewogICBpbnQgcHJlZGljdG9yID0gMDsKICAgaW50IENvbG9ycyA9IDA7CiAgIGludCBCaXRzUGVyQ29tcG9uZW50ID0gMDsKQEAgLTMxNSw3ICszMjMsNyBAQAogICAgIEJpdHNQZXJDb21wb25lbnQgPSBwUGFyYW1zLT5HZXRJbnRlZ2VyRm9yKCJCaXRzUGVyQ29tcG9uZW50IiwgOCk7CiAgICAgQ29sdW1ucyA9IHBQYXJhbXMtPkdldEludGVnZXJGb3IoIkNvbHVtbnMiLCAxKTsKICAgICBpZiAoIUNoZWNrRmxhdGVEZWNvZGVQYXJhbXMoQ29sb3JzLCBCaXRzUGVyQ29tcG9uZW50LCBDb2x1bW5zKSkKLSAgICAgIHJldHVybiAodWludDMyX3QpLTE7CisgICAgICByZXR1cm4gRlhfSU5WQUxJRF9PRkZTRVQ7CiAgIH0KICAgcmV0dXJuIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0RmxhdGVNb2R1bGUoKS0+RmxhdGVPckxaV0RlY29kZSgKICAgICAgIGJMWlcsIHNyY19idWYsIHNyY19zaXplLCBiRWFybHlDaGFuZ2UsIHByZWRpY3RvciwgQ29sb3JzLApAQCAtMzI1LDEyICszMzMsMTIgQEAKIGJvb2wgUERGX0RhdGFEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NpemUsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcERpY3QsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIGRlc3Rfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIEltYWdlRW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSomIHBJbWFnZVBhcm1zLAogICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsYXN0X2VzdGltYXRlZF9zaXplLAotICAgICAgICAgICAgICAgICAgICBib29sIGJJbWFnZUFjYykgeworICAgICAgICAgICAgICAgICAgICBib29sIGJJbWFnZUFjYywKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZGVzdF9zaXplLAorICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nKiBJbWFnZUVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqKiBwSW1hZ2VQYXJtcykgewogICBDUERGX09iamVjdCogcERlY29kZXIgPSBwRGljdCA/IHBEaWN0LT5HZXREaXJlY3RPYmplY3RGb3IoIkZpbHRlciIpIDogbnVsbHB0cjsKICAgaWYgKCFwRGVjb2RlciB8fCAoIXBEZWNvZGVyLT5Jc0FycmF5KCkgJiYgIXBEZWNvZGVyLT5Jc05hbWUoKSkpCiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMzM4LDEwICszNDYsMTAgQEAKICAgQ1BERl9PYmplY3QqIHBQYXJhbXMgPQogICAgICAgcERpY3QgPyBwRGljdC0+R2V0RGlyZWN0T2JqZWN0Rm9yKCJEZWNvZGVQYXJtcyIpIDogbnVsbHB0cjsKIAotICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Q0ZYX0J5dGVTdHJpbmcsIENQREZfT2JqZWN0Kj4+IERlY29kZXJBcnJheTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEJ5dGVTdHJpbmcsIENQREZfT2JqZWN0Kj4+IERlY29kZXJBcnJheTsKICAgaWYgKENQREZfQXJyYXkqIHBEZWNvZGVycyA9IHBEZWNvZGVyLT5Bc0FycmF5KCkpIHsKICAgICBDUERGX0FycmF5KiBwUGFyYW1zQXJyYXkgPSBUb0FycmF5KHBQYXJhbXMpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcERlY29kZXJzLT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBEZWNvZGVycy0+R2V0Q291bnQoKTsgKytpKSB7CiAgICAgICBEZWNvZGVyQXJyYXkucHVzaF9iYWNrKAogICAgICAgICAgIHtwRGVjb2RlcnMtPkdldFN0cmluZ0F0KGkpLAogICAgICAgICAgICBwUGFyYW1zQXJyYXkgPyBwUGFyYW1zQXJyYXktPkdldERpY3RBdChpKSA6IG51bGxwdHJ9KTsKQEAgLTM1MiwxNDEgKzM2MCwxMzQgQEAKICAgfQogICB1aW50OF90KiBsYXN0X2J1ZiA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHNyY19idWYpOwogICB1aW50MzJfdCBsYXN0X3NpemUgPSBzcmNfc2l6ZTsKLSAgaW50IG5TaXplID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQ+KERlY29kZXJBcnJheSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgblNpemU7IGkrKykgeworICBzaXplX3QgblNpemUgPSBEZWNvZGVyQXJyYXkuc2l6ZSgpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5TaXplOyArK2kpIHsKICAgICBpbnQgZXN0aW1hdGVkX3NpemUgPSBpID09IG5TaXplIC0gMSA/IGxhc3RfZXN0aW1hdGVkX3NpemUgOiAwOwotICAgIENGWF9CeXRlU3RyaW5nIGRlY29kZXIgPSBEZWNvZGVyQXJyYXlbaV0uZmlyc3Q7CisgICAgQnl0ZVN0cmluZyBkZWNvZGVyID0gRGVjb2RlckFycmF5W2ldLmZpcnN0OwogICAgIENQREZfRGljdGlvbmFyeSogcFBhcmFtID0gVG9EaWN0aW9uYXJ5KERlY29kZXJBcnJheVtpXS5zZWNvbmQpOwogICAgIHVpbnQ4X3QqIG5ld19idWYgPSBudWxscHRyOwotICAgIHVpbnQzMl90IG5ld19zaXplID0gKHVpbnQzMl90KS0xOwotICAgIGludCBvZmZzZXQgPSAtMTsKKyAgICB1aW50MzJfdCBuZXdfc2l6ZSA9IDB4RkZGRkZGRkY7CisgICAgdWludDMyX3Qgb2Zmc2V0ID0gRlhfSU5WQUxJRF9PRkZTRVQ7CisgICAgaWYgKGRlY29kZXIgPT0gIkNyeXB0IikKKyAgICAgIGNvbnRpbnVlOwogICAgIGlmIChkZWNvZGVyID09ICJGbGF0ZURlY29kZSIgfHwgZGVjb2RlciA9PSAiRmwiKSB7CiAgICAgICBpZiAoYkltYWdlQWNjICYmIGkgPT0gblNpemUgLSAxKSB7Ci0gICAgICAgIEltYWdlRW5jb2RpbmcgPSAiRmxhdGVEZWNvZGUiOwotICAgICAgICBkZXN0X2J1ZiA9ICh1aW50OF90KilsYXN0X2J1ZjsKLSAgICAgICAgZGVzdF9zaXplID0gbGFzdF9zaXplOwotICAgICAgICBwSW1hZ2VQYXJtcyA9IHBQYXJhbTsKKyAgICAgICAgKkltYWdlRW5jb2RpbmcgPSAiRmxhdGVEZWNvZGUiOworICAgICAgICAqZGVzdF9idWYgPSBsYXN0X2J1ZjsKKyAgICAgICAgKmRlc3Rfc2l6ZSA9IGxhc3Rfc2l6ZTsKKyAgICAgICAgKnBJbWFnZVBhcm1zID0gcFBhcmFtOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgIH0KICAgICAgIG9mZnNldCA9IEZQREZBUElfRmxhdGVPckxaV0RlY29kZShmYWxzZSwgbGFzdF9idWYsIGxhc3Rfc2l6ZSwgcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdGltYXRlZF9zaXplLCBuZXdfYnVmLCBuZXdfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVkX3NpemUsICZuZXdfYnVmLCAmbmV3X3NpemUpOwogICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSAiTFpXRGVjb2RlIiB8fCBkZWNvZGVyID09ICJMWlciKSB7CiAgICAgICBvZmZzZXQgPSBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUodHJ1ZSwgbGFzdF9idWYsIGxhc3Rfc2l6ZSwgcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzdGltYXRlZF9zaXplLCBuZXdfYnVmLCBuZXdfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVkX3NpemUsICZuZXdfYnVmLCAmbmV3X3NpemUpOwogICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSAiQVNDSUk4NURlY29kZSIgfHwgZGVjb2RlciA9PSAiQTg1IikgewotICAgICAgb2Zmc2V0ID0gQTg1RGVjb2RlKGxhc3RfYnVmLCBsYXN0X3NpemUsIG5ld19idWYsIG5ld19zaXplKTsKKyAgICAgIG9mZnNldCA9IEE4NURlY29kZShsYXN0X2J1ZiwgbGFzdF9zaXplLCAmbmV3X2J1ZiwgJm5ld19zaXplKTsKICAgICB9IGVsc2UgaWYgKGRlY29kZXIgPT0gIkFTQ0lJSGV4RGVjb2RlIiB8fCBkZWNvZGVyID09ICJBSHgiKSB7Ci0gICAgICBvZmZzZXQgPSBIZXhEZWNvZGUobGFzdF9idWYsIGxhc3Rfc2l6ZSwgbmV3X2J1ZiwgbmV3X3NpemUpOworICAgICAgb2Zmc2V0ID0gSGV4RGVjb2RlKGxhc3RfYnVmLCBsYXN0X3NpemUsICZuZXdfYnVmLCAmbmV3X3NpemUpOwogICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSAiUnVuTGVuZ3RoRGVjb2RlIiB8fCBkZWNvZGVyID09ICJSTCIpIHsKICAgICAgIGlmIChiSW1hZ2VBY2MgJiYgaSA9PSBuU2l6ZSAtIDEpIHsKLSAgICAgICAgSW1hZ2VFbmNvZGluZyA9ICJSdW5MZW5ndGhEZWNvZGUiOwotICAgICAgICBkZXN0X2J1ZiA9ICh1aW50OF90KilsYXN0X2J1ZjsKLSAgICAgICAgZGVzdF9zaXplID0gbGFzdF9zaXplOwotICAgICAgICBwSW1hZ2VQYXJtcyA9IHBQYXJhbTsKKyAgICAgICAgKkltYWdlRW5jb2RpbmcgPSAiUnVuTGVuZ3RoRGVjb2RlIjsKKyAgICAgICAgKmRlc3RfYnVmID0gbGFzdF9idWY7CisgICAgICAgICpkZXN0X3NpemUgPSBsYXN0X3NpemU7CisgICAgICAgICpwSW1hZ2VQYXJtcyA9IHBQYXJhbTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICB9Ci0gICAgICBvZmZzZXQgPSBSdW5MZW5ndGhEZWNvZGUobGFzdF9idWYsIGxhc3Rfc2l6ZSwgbmV3X2J1ZiwgbmV3X3NpemUpOwotICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSAiQ3J5cHQiKSB7Ci0gICAgICBjb250aW51ZTsKKyAgICAgIG9mZnNldCA9IFJ1bkxlbmd0aERlY29kZShsYXN0X2J1ZiwgbGFzdF9zaXplLCAmbmV3X2J1ZiwgJm5ld19zaXplKTsKICAgICB9IGVsc2UgewogICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUsIGFzc3VtZSBpdCdzIGFuIGltYWdlIGRlY29kZXIuCi0gICAgICBpZiAoZGVjb2RlciA9PSAiRENUIikgeworICAgICAgaWYgKGRlY29kZXIgPT0gIkRDVCIpCiAgICAgICAgIGRlY29kZXIgPSAiRENURGVjb2RlIjsKLSAgICAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSAiQ0NGIikgeworICAgICAgZWxzZSBpZiAoZGVjb2RlciA9PSAiQ0NGIikKICAgICAgICAgZGVjb2RlciA9ICJDQ0lUVEZheERlY29kZSI7Ci0gICAgICB9Ci0gICAgICBJbWFnZUVuY29kaW5nID0gZGVjb2RlcjsKLSAgICAgIHBJbWFnZVBhcm1zID0gcFBhcmFtOwotICAgICAgZGVzdF9idWYgPSAodWludDhfdCopbGFzdF9idWY7Ci0gICAgICBkZXN0X3NpemUgPSBsYXN0X3NpemU7Ci0gICAgICBpZiAoQ1BERl9BcnJheSogcERlY29kZXJzID0gcERlY29kZXItPkFzQXJyYXkoKSkKLSAgICAgICAgcERlY29kZXJzLT5SZW1vdmVBdChpICsgMSwgcERlY29kZXJzLT5HZXRDb3VudCgpIC0gaSAtIDEpOworICAgICAgKkltYWdlRW5jb2RpbmcgPSBkZWNvZGVyOworICAgICAgKnBJbWFnZVBhcm1zID0gcFBhcmFtOworICAgICAgKmRlc3RfYnVmID0gbGFzdF9idWY7CisgICAgICAqZGVzdF9zaXplID0gbGFzdF9zaXplOwogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIGlmIChsYXN0X2J1ZiAhPSBzcmNfYnVmKSB7CisgICAgaWYgKGxhc3RfYnVmICE9IHNyY19idWYpCiAgICAgICBGWF9GcmVlKGxhc3RfYnVmKTsKLSAgICB9Ci0gICAgaWYgKG9mZnNldCA9PSAtMSkgeworICAgIGlmIChvZmZzZXQgPT0gRlhfSU5WQUxJRF9PRkZTRVQpIHsKICAgICAgIEZYX0ZyZWUobmV3X2J1Zik7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGxhc3RfYnVmID0gbmV3X2J1ZjsKICAgICBsYXN0X3NpemUgPSBuZXdfc2l6ZTsKICAgfQotICBJbWFnZUVuY29kaW5nID0gIiI7Ci0gIHBJbWFnZVBhcm1zID0gbnVsbHB0cjsKLSAgZGVzdF9idWYgPSBsYXN0X2J1ZjsKLSAgZGVzdF9zaXplID0gbGFzdF9zaXplOworICBJbWFnZUVuY29kaW5nLT5jbGVhcigpOworICAqcEltYWdlUGFybXMgPSBudWxscHRyOworICAqZGVzdF9idWYgPSBsYXN0X2J1ZjsKKyAgKmRlc3Rfc2l6ZSA9IGxhc3Rfc2l6ZTsKICAgcmV0dXJuIHRydWU7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIFBERl9EZWNvZGVUZXh0KGNvbnN0IHVpbnQ4X3QqIHNyY19kYXRhLCB1aW50MzJfdCBzcmNfbGVuKSB7Ci0gIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKK1dpZGVTdHJpbmcgUERGX0RlY29kZVRleHQoY29uc3QgdWludDhfdCogc3JjX2RhdGEsIHVpbnQzMl90IHNyY19sZW4pIHsKKyAgV2lkZVN0cmluZyByZXN1bHQ7CiAgIGlmIChzcmNfbGVuID49IDIgJiYgKChzcmNfZGF0YVswXSA9PSAweGZlICYmIHNyY19kYXRhWzFdID09IDB4ZmYpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIChzcmNfZGF0YVswXSA9PSAweGZmICYmIHNyY19kYXRhWzFdID09IDB4ZmUpKSkgewotICAgIGJvb2wgYkJFID0gc3JjX2RhdGFbMF0gPT0gMHhmZTsKICAgICB1aW50MzJfdCBtYXhfY2hhcnMgPSAoc3JjX2xlbiAtIDIpIC8gMjsKLSAgICBpZiAoIW1heF9jaGFycykgeworICAgIGlmICghbWF4X2NoYXJzKQogICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgaWYgKHNyY19kYXRhWzBdID09IDB4ZmYpIHsKLSAgICAgIGJCRSA9ICFzcmNfZGF0YVsyXTsKLSAgICB9Ci0gICAgRlhfV0NIQVIqIGRlc3RfYnVmID0gcmVzdWx0LkdldEJ1ZmZlcihtYXhfY2hhcnMpOworCisgICAgYm9vbCBiQkUgPSBzcmNfZGF0YVswXSA9PSAweGZlIHx8IChzcmNfZGF0YVswXSA9PSAweGZmICYmICFzcmNfZGF0YVsyXSk7CisgICAgd2NoYXJfdCogZGVzdF9idWYgPSByZXN1bHQuR2V0QnVmZmVyKG1heF9jaGFycyk7CiAgICAgY29uc3QgdWludDhfdCogdW5pX3N0ciA9IHNyY19kYXRhICsgMjsKICAgICBpbnQgZGVzdF9wb3MgPSAwOwogICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtYXhfY2hhcnMgKiAyOyBpICs9IDIpIHsKLSAgICAgIHVpbnQxNl90IHVuaWNvZGUgPSBiQkUgPyAodW5pX3N0cltpXSA8PCA4IHwgdW5pX3N0cltpICsgMV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHVuaV9zdHJbaSArIDFdIDw8IDggfCB1bmlfc3RyW2ldKTsKLSAgICAgIGlmICh1bmljb2RlID09IDB4MWIpIHsKLSAgICAgICAgaSArPSAyOwotICAgICAgICB3aGlsZSAoaSA8IG1heF9jaGFycyAqIDIpIHsKLSAgICAgICAgICB1aW50MTZfdCB1bmljb2RlMiA9IGJCRSA/ICh1bmlfc3RyW2ldIDw8IDggfCB1bmlfc3RyW2kgKyAxXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICh1bmlfc3RyW2kgKyAxXSA8PCA4IHwgdW5pX3N0cltpXSk7Ci0gICAgICAgICAgaSArPSAyOwotICAgICAgICAgIGlmICh1bmljb2RlMiA9PSAweDFiKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7CisgICAgICB1aW50MTZfdCB1bmljb2RlID0gR2V0VW5pY29kZUZyb21CeXRlcyh1bmlfc3RyICsgaSwgYkJFKTsKKyAgICAgIGlmICh1bmljb2RlICE9IDB4MWIpIHsKICAgICAgICAgZGVzdF9idWZbZGVzdF9wb3MrK10gPSB1bmljb2RlOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaSArPSAyOworICAgICAgd2hpbGUgKGkgPCBtYXhfY2hhcnMgKiAyKSB7CisgICAgICAgIHVpbnQxNl90IHVuaWNvZGUyID0gR2V0VW5pY29kZUZyb21CeXRlcyh1bmlfc3RyICsgaSwgYkJFKTsKKyAgICAgICAgaSArPSAyOworICAgICAgICBpZiAodW5pY29kZTIgPT0gMHgxYikKKyAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgICAgcmVzdWx0LlJlbGVhc2VCdWZmZXIoZGVzdF9wb3MpOwogICB9IGVsc2UgewotICAgIEZYX1dDSEFSKiBkZXN0X2J1ZiA9IHJlc3VsdC5HZXRCdWZmZXIoc3JjX2xlbik7Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNyY19sZW47IGkrKykKKyAgICB3Y2hhcl90KiBkZXN0X2J1ZiA9IHJlc3VsdC5HZXRCdWZmZXIoc3JjX2xlbik7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNyY19sZW47ICsraSkKICAgICAgIGRlc3RfYnVmW2ldID0gUERGRG9jRW5jb2Rpbmdbc3JjX2RhdGFbaV1dOwogICAgIHJlc3VsdC5SZWxlYXNlQnVmZmVyKHNyY19sZW4pOwogICB9CiAgIHJldHVybiByZXN1bHQ7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIFBERl9EZWNvZGVUZXh0KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic3RyKSB7Ci0gIHJldHVybiBQREZfRGVjb2RlVGV4dCgoY29uc3QgdWludDhfdCopYnN0ci5jX3N0cigpLCBic3RyLkdldExlbmd0aCgpKTsKK1dpZGVTdHJpbmcgUERGX0RlY29kZVRleHQoY29uc3QgQnl0ZVN0cmluZyYgYnN0cikgeworICByZXR1cm4gUERGX0RlY29kZVRleHQocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYnN0ci5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJzdHIuR2V0TGVuZ3RoKCkpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBQREZfRW5jb2RlVGV4dChjb25zdCBGWF9XQ0hBUiogcFN0cmluZywgaW50IGxlbikgewotICBpZiAobGVuID09IC0xKSB7Ci0gICAgbGVuID0gRlhTWVNfd2NzbGVuKHBTdHJpbmcpOwotICB9Ci0gIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsKLSAgRlhfQ0hBUiogZGVzdF9idWYxID0gcmVzdWx0LkdldEJ1ZmZlcihsZW4pOworQnl0ZVN0cmluZyBQREZfRW5jb2RlVGV4dChjb25zdCB3Y2hhcl90KiBwU3RyaW5nLCBpbnQgbGVuKSB7CisgIGlmIChsZW4gPT0gLTEpCisgICAgbGVuID0gd2NzbGVuKHBTdHJpbmcpOworCisgIEJ5dGVTdHJpbmcgcmVzdWx0OworICBjaGFyKiBkZXN0X2J1ZjEgPSByZXN1bHQuR2V0QnVmZmVyKGxlbik7CiAgIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgaW50IGNvZGU7Ci0gICAgZm9yIChjb2RlID0gMDsgY29kZSA8IDI1NjsgY29kZSsrKQotICAgICAgaWYgKFBERkRvY0VuY29kaW5nW2NvZGVdID09IHBTdHJpbmdbaV0pIHsKKyAgICBmb3IgKGNvZGUgPSAwOyBjb2RlIDwgMjU2OyArK2NvZGUpIHsKKyAgICAgIGlmIChQREZEb2NFbmNvZGluZ1tjb2RlXSA9PSBwU3RyaW5nW2ldKQogICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICBpZiAoY29kZSA9PSAyNTYpIHsKLSAgICAgIGJyZWFrOwogICAgIH0KKworICAgIGlmIChjb2RlID09IDI1NikKKyAgICAgIGJyZWFrOworCiAgICAgZGVzdF9idWYxW2ldID0gY29kZTsKICAgfQogICByZXN1bHQuUmVsZWFzZUJ1ZmZlcihpKTsKLSAgaWYgKGkgPT0gbGVuKSB7CisgIGlmIChpID09IGxlbikKICAgICByZXR1cm4gcmVzdWx0OwotICB9CiAKICAgaWYgKGxlbiA+IElOVF9NQVggLyAyIC0gMSkgewogICAgIHJlc3VsdC5SZWxlYXNlQnVmZmVyKDApOwpAQCAtNDk1LDM2ICs0OTYsMzggQEAKIAogICBpbnQgZW5jTGVuID0gbGVuICogMiArIDI7CiAKLSAgdWludDhfdCogZGVzdF9idWYyID0gKHVpbnQ4X3QqKXJlc3VsdC5HZXRCdWZmZXIoZW5jTGVuKTsKKyAgdWludDhfdCogZGVzdF9idWYyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocmVzdWx0LkdldEJ1ZmZlcihlbmNMZW4pKTsKICAgZGVzdF9idWYyWzBdID0gMHhmZTsKICAgZGVzdF9idWYyWzFdID0gMHhmZjsKICAgZGVzdF9idWYyICs9IDI7Ci0gIGZvciAoaW50IGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKyAgZm9yIChpbnQgaiA9IDA7IGogPCBsZW47ICsraikgewogICAgICpkZXN0X2J1ZjIrKyA9IHBTdHJpbmdbal0gPj4gODsKLSAgICAqZGVzdF9idWYyKysgPSAodWludDhfdClwU3RyaW5nW2pdOworICAgICpkZXN0X2J1ZjIrKyA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHBTdHJpbmdbal0pOwogICB9CiAgIHJlc3VsdC5SZWxlYXNlQnVmZmVyKGVuY0xlbik7CiAgIHJldHVybiByZXN1bHQ7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIFBERl9FbmNvZGVUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKK0J5dGVTdHJpbmcgUERGX0VuY29kZVRleHQoY29uc3QgV2lkZVN0cmluZyYgc3RyKSB7CiAgIHJldHVybiBQREZfRW5jb2RlVGV4dChzdHIuY19zdHIoKSwgc3RyLkdldExlbmd0aCgpKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgUERGX0VuY29kZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3JjLCBib29sIGJIZXgpIHsKLSAgQ0ZYX0J5dGVUZXh0QnVmIHJlc3VsdDsKK0J5dGVTdHJpbmcgUERGX0VuY29kZVN0cmluZyhjb25zdCBCeXRlU3RyaW5nJiBzcmMsIGJvb2wgYkhleCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OwogICBpbnQgc3JjbGVuID0gc3JjLkdldExlbmd0aCgpOwogICBpZiAoYkhleCkgewotICAgIHJlc3VsdC5BcHBlbmRDaGFyKCc8Jyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmNsZW47IGkrKykgewotICAgICAgcmVzdWx0LkFwcGVuZENoYXIoIjAxMjM0NTY3ODlBQkNERUYiW3NyY1tpXSAvIDE2XSk7Ci0gICAgICByZXN1bHQuQXBwZW5kQ2hhcigiMDEyMzQ1Njc4OUFCQ0RFRiJbc3JjW2ldICUgMTZdKTsKKyAgICByZXN1bHQgPDwgJzwnOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjbGVuOyArK2kpIHsKKyAgICAgIGNoYXIgYnVmWzJdOworICAgICAgRlhTWVNfSW50VG9Ud29IZXhDaGFycyhzcmNbaV0sIGJ1Zik7CisgICAgICByZXN1bHQgPDwgYnVmWzBdOworICAgICAgcmVzdWx0IDw8IGJ1ZlsxXTsKICAgICB9Ci0gICAgcmVzdWx0LkFwcGVuZENoYXIoJz4nKTsKLSAgICByZXR1cm4gcmVzdWx0Lk1ha2VTdHJpbmcoKTsKKyAgICByZXN1bHQgPDwgJz4nOworICAgIHJldHVybiBCeXRlU3RyaW5nKHJlc3VsdCk7CiAgIH0KLSAgcmVzdWx0LkFwcGVuZENoYXIoJygnKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmNsZW47IGkrKykgeworICByZXN1bHQgPDwgJygnOworICBmb3IgKGludCBpID0gMDsgaSA8IHNyY2xlbjsgKytpKSB7CiAgICAgdWludDhfdCBjaCA9IHNyY1tpXTsKICAgICBpZiAoY2ggPT0gMHgwYSkgewogICAgICAgcmVzdWx0IDw8ICJcXG4iOwpAQCAtNTM1LDExICs1MzgsMTEgQEAKICAgICAgIGNvbnRpbnVlOwogICAgIH0KICAgICBpZiAoY2ggPT0gJyknIHx8IGNoID09ICdcXCcgfHwgY2ggPT0gJygnKQotICAgICAgcmVzdWx0LkFwcGVuZENoYXIoJ1xcJyk7Ci0gICAgcmVzdWx0LkFwcGVuZENoYXIoY2gpOworICAgICAgcmVzdWx0IDw8ICdcXCc7CisgICAgcmVzdWx0IDw8IHN0YXRpY19jYXN0PGNoYXI+KGNoKTsKICAgfQotICByZXN1bHQuQXBwZW5kQ2hhcignKScpOwotICByZXR1cm4gcmVzdWx0Lk1ha2VTdHJpbmcoKTsKKyAgcmVzdWx0IDw8ICcpJzsKKyAgcmV0dXJuIEJ5dGVTdHJpbmcocmVzdWx0KTsKIH0KIAogYm9vbCBGbGF0ZUVuY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLApAQCAtNTQ3LDggKzU1MCw3IEBACiAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBkZXN0X2J1ZiwKICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRlc3Rfc2l6ZSkgewogICBDQ29kZWNfTW9kdWxlTWdyKiBwRW5jb2RlcnMgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldENvZGVjTW9kdWxlKCk7Ci0gIHJldHVybiBwRW5jb2RlcnMgJiYKLSAgICAgICAgIHBFbmNvZGVycy0+R2V0RmxhdGVNb2R1bGUoKS0+RW5jb2RlKHNyY19idWYsIHNyY19zaXplLCBkZXN0X2J1ZiwKKyAgcmV0dXJuIHBFbmNvZGVycy0+R2V0RmxhdGVNb2R1bGUoKS0+RW5jb2RlKHNyY19idWYsIHNyY19zaXplLCBkZXN0X2J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2l6ZSk7CiB9CiAKQEAgLTU1NywxOSArNTU5LDE1IEBACiAgICAgICAgICAgICAgICB1aW50OF90KiogZGVzdF9idWYsCiAgICAgICAgICAgICAgICB1aW50MzJfdCogZGVzdF9zaXplKSB7CiAgIENDb2RlY19Nb2R1bGVNZ3IqIHBFbmNvZGVycyA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKTsKLSAgcmV0dXJuIHBFbmNvZGVycyAmJgotICAgICAgICAgcEVuY29kZXJzLT5HZXRGbGF0ZU1vZHVsZSgpLT5QbmdFbmNvZGUoc3JjX2J1Ziwgc3JjX3NpemUsIGRlc3RfYnVmLAorICByZXR1cm4gcEVuY29kZXJzLT5HZXRGbGF0ZU1vZHVsZSgpLT5QbmdFbmNvZGUoc3JjX2J1Ziwgc3JjX3NpemUsIGRlc3RfYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9zaXplKTsKIH0KIAogdWludDMyX3QgRmxhdGVEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY19zaXplLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIGRlc3Rfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRlc3Rfc2l6ZSkgewogICBDQ29kZWNfTW9kdWxlTWdyKiBwRW5jb2RlcnMgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldENvZGVjTW9kdWxlKCk7Ci0gIGlmIChwRW5jb2RlcnMpIHsKLSAgICByZXR1cm4gcEVuY29kZXJzLT5HZXRGbGF0ZU1vZHVsZSgpLT5GbGF0ZU9yTFpXRGVjb2RlKAotICAgICAgICBmYWxzZSwgc3JjX2J1Ziwgc3JjX3NpemUsIGZhbHNlLCAwLCAwLCAwLCAwLCAwLCBkZXN0X2J1ZiwgZGVzdF9zaXplKTsKLSAgfQotICByZXR1cm4gMDsKKyAgcmV0dXJuIHBFbmNvZGVycy0+R2V0RmxhdGVNb2R1bGUoKS0+RmxhdGVPckxaV0RlY29kZSgKKyAgICAgIGZhbHNlLCBzcmNfYnVmLCBzcmNfc2l6ZSwgZmFsc2UsIDAsIDAsIDAsIDAsIDAsIGRlc3RfYnVmLCBkZXN0X3NpemUpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGUuaCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmgKaW5kZXggZGM4ZWNmMC4uNjY1MGI2OCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGUuaAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZS5oCkBAIC05LDcgKzksNyBAQAogCiAjaW5jbHVkZSA8bWVtb3J5PgogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCiAKIGNsYXNzIENDb2RlY19TY2FubGluZURlY29kZXI7CiBjbGFzcyBDUERGX0RpY3Rpb25hcnk7CkBAIC0xNywxNCArMTcsMTQgQEAKIC8vIEluZGV4ZWQgYnkgOC1iaXQgY2hhciBjb2RlLCBjb250YWlucyB1bmljb2RlIGNvZGUgcG9pbnRzLgogZXh0ZXJuIGNvbnN0IHVpbnQxNl90IFBERkRvY0VuY29kaW5nWzI1Nl07CiAKLUNGWF9CeXRlU3RyaW5nIFBERl9OYW1lRGVjb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3JpZyk7Ci1DRlhfQnl0ZVN0cmluZyBQREZfTmFtZURlY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgb3JpZyk7Ci1DRlhfQnl0ZVN0cmluZyBQREZfTmFtZUVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgb3JpZyk7Ci1DRlhfQnl0ZVN0cmluZyBQREZfRW5jb2RlU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzcmMsIGJvb2wgYkhleCA9IGZhbHNlKTsKLUNGWF9XaWRlU3RyaW5nIFBERl9EZWNvZGVUZXh0KGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCB1aW50MzJfdCBzaXplKTsKLUNGWF9XaWRlU3RyaW5nIFBERl9EZWNvZGVUZXh0KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic3RyKTsKLUNGWF9CeXRlU3RyaW5nIFBERl9FbmNvZGVUZXh0KGNvbnN0IEZYX1dDSEFSKiBwU3RyaW5nLCBpbnQgbGVuID0gLTEpOwotQ0ZYX0J5dGVTdHJpbmcgUERGX0VuY29kZVRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7CitCeXRlU3RyaW5nIFBERl9OYW1lRGVjb2RlKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBvcmlnKTsKK0J5dGVTdHJpbmcgUERGX05hbWVEZWNvZGUoY29uc3QgQnl0ZVN0cmluZyYgb3JpZyk7CitCeXRlU3RyaW5nIFBERl9OYW1lRW5jb2RlKGNvbnN0IEJ5dGVTdHJpbmcmIG9yaWcpOworQnl0ZVN0cmluZyBQREZfRW5jb2RlU3RyaW5nKGNvbnN0IEJ5dGVTdHJpbmcmIHNyYywgYm9vbCBiSGV4KTsKK1dpZGVTdHJpbmcgUERGX0RlY29kZVRleHQoY29uc3QgdWludDhfdCogcERhdGEsIHVpbnQzMl90IHNpemUpOworV2lkZVN0cmluZyBQREZfRGVjb2RlVGV4dChjb25zdCBCeXRlU3RyaW5nJiBic3RyKTsKK0J5dGVTdHJpbmcgUERGX0VuY29kZVRleHQoY29uc3Qgd2NoYXJfdCogcFN0cmluZywgaW50IGxlbik7CitCeXRlU3RyaW5nIFBERl9FbmNvZGVUZXh0KGNvbnN0IFdpZGVTdHJpbmcmIHN0cik7CiAKIGJvb2wgRmxhdGVFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NpemUsCkBAIC00MSwxMiArNDEsMTMgQEAKIAogdWludDMyX3QgRmxhdGVEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY19zaXplLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIGRlc3Rfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZGVzdF9zaXplKTsKKwogdWludDMyX3QgUnVuTGVuZ3RoRGVjb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRlc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBkZXN0X3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZGVzdF9zaXplKTsKIAogc3RkOjp1bmlxdWVfcHRyPENDb2RlY19TY2FubGluZURlY29kZXI+IEZQREZBUElfQ3JlYXRlRmF4RGVjb2RlcigKICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLApAQCAtNjQsMzIgKzY1LDMyIEBACiAgICAgaW50IGJwYywKICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMpOwogCi0vLyBQdWJsaWMgZm9yIHRlc3RpbmcuCiB1aW50MzJfdCBBODVEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCi0gICAgICAgICAgICAgICAgICAgdWludDMyX3QmIGRlc3Rfc2l6ZSk7Ci0vLyBQdWJsaWMgZm9yIHRlc3RpbmcuCisgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkZXN0X3NpemUpOworCiB1aW50MzJfdCBIZXhEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCi0gICAgICAgICAgICAgICAgICAgdWludDMyX3QmIGRlc3Rfc2l6ZSk7Ci0vLyBQdWJsaWMgZm9yIHRlc3RpbmcuCisgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkZXN0X3NpemUpOworCiB1aW50MzJfdCBGUERGQVBJX0ZsYXRlT3JMWldEZWNvZGUoYm9vbCBiTFpXLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGVzdGltYXRlZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgZGVzdF9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRlc3Rfc2l6ZSk7CisKIGJvb2wgUERGX0RhdGFEZWNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NpemUsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcERpY3QsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIGRlc3Rfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIEltYWdlRW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSomIHBJbWFnZVBhcm1zLAogICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBlc3RpbWF0ZWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBiSW1hZ2VBY2MpOworICAgICAgICAgICAgICAgICAgICBib29sIGJJbWFnZUFjYywKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZGVzdF9zaXplLAorICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nKiBJbWFnZUVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqKiBwSW1hZ2VQYXJtcyk7CiAKICNlbmRpZiAgLy8gQ09SRV9GUERGQVBJX1BBUlNFUl9GUERGX1BBUlNFUl9ERUNPREVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlX2VtYmVkZGVydGVzdC5jcHAgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZV9lbWJlZGRlcnRlc3QuY3BwCmluZGV4IDlkZmMyNmUuLmU5NWE0Y2MgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlX2VtYmVkZGVydGVzdC5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGVfZW1iZWRkZXJ0ZXN0LmNwcApAQCAtNywxOSArNywxNyBAQAogI2luY2x1ZGUgPGNzdHJpbmc+CiAjaW5jbHVkZSA8c3RyaW5nPgogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgogI2luY2x1ZGUgInRlc3RpbmcvZW1iZWRkZXJfdGVzdC5oIgotI2luY2x1ZGUgInRlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAjaW5jbHVkZSAidGVzdGluZy90ZXN0X3N1cHBvcnQuaCIKIAotY2xhc3MgRlBERlBhcnNlckRlY29kZUVtYmVkZGVydGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3Qge307Cit1c2luZyBGUERGUGFyc2VyRGVjb2RlRW1iZWRkZXJ0ZXN0ID0gRW1iZWRkZXJUZXN0OwogCiAvLyBOT1RFOiBweXRob24ncyB6bGliLmNvbXByZXNzKCkgYW5kIHpsaWIuZGVjb21wcmVzcygpIG1heSBiZSB1c2VmdWwgZm9yCiAvLyBleHRlcm5hbCB2YWxpZGF0aW9uIG9mIHRoZSBGbGF0ZUVuY29kZS9GbGF0ZURlY29kZSB0ZXN0IGNhc2VzLgogCiBURVNUX0YoRlBERlBhcnNlckRlY29kZUVtYmVkZGVydGVzdCwgRmxhdGVFbmNvZGUpIHsKLSAgcGRmaXVtOjpTdHJGdW5jVGVzdERhdGEgZmxhdGVfZW5jb2RlX2Nhc2VzW10gPSB7CisgIHN0YXRpYyBjb25zdCBwZGZpdW06OlN0ckZ1bmNUZXN0RGF0YSBmbGF0ZV9lbmNvZGVfY2FzZXNbXSA9IHsKICAgICAgIFNUUl9JTl9PVVRfQ0FTRSgiIiwgIlx4NzhceDljXHgwM1x4MDBceDAwXHgwMFx4MDBceDAxIiksCiAgICAgICBTVFJfSU5fT1VUX0NBU0UoIiAiLCAiXHg3OFx4OWNceDUzXHgwMFx4MDBceDAwXHgyMVx4MDBceDIxIiksCiAgICAgICBTVFJfSU5fT1VUX0NBU0UoIjEyMyIsICJceDc4XHg5Y1x4MzNceDM0XHgzMlx4MDZceDAwXDAxXHgyZFx4MDBceDk3IiksCkBAIC0zOSwxOCArMzcsMjAgQEAKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZmxhdGVfZW5jb2RlX2Nhc2VzKTsgKytpKSB7CiAgICAgY29uc3QgcGRmaXVtOjpTdHJGdW5jVGVzdERhdGEmIGRhdGEgPSBmbGF0ZV9lbmNvZGVfY2FzZXNbaV07CiAgICAgdW5zaWduZWQgY2hhciogYnVmID0gbnVsbHB0cjsKLSAgICB1bnNpZ25lZCBpbnQgYnVmX3NpemU7CisgICAgdWludDMyX3QgYnVmX3NpemU7CiAgICAgRVhQRUNUX1RSVUUoRmxhdGVFbmNvZGUoZGF0YS5pbnB1dCwgZGF0YS5pbnB1dF9zaXplLCAmYnVmLCAmYnVmX3NpemUpKTsKICAgICBBU1NFUlRfVFJVRShidWYpOwotICAgIEVYUEVDVF9FUShzdGQ6OnN0cmluZygoY29uc3QgY2hhciopZGF0YS5leHBlY3RlZCwgZGF0YS5leHBlY3RlZF9zaXplKSwKLSAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoKGNvbnN0IGNoYXIqKWJ1ZiwgYnVmX3NpemUpKQorICAgIEVYUEVDVF9FUShkYXRhLmV4cGVjdGVkX3NpemUsIGJ1Zl9zaXplKSA8PCAiIGZvciBjYXNlICIgPDwgaTsKKyAgICBpZiAoZGF0YS5leHBlY3RlZF9zaXplICE9IGJ1Zl9zaXplKQorICAgICAgY29udGludWU7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChkYXRhLmV4cGVjdGVkLCBidWYsIGRhdGEuZXhwZWN0ZWRfc2l6ZSkpCiAgICAgICAgIDw8ICIgZm9yIGNhc2UgIiA8PCBpOwogICAgIEZYX0ZyZWUoYnVmKTsKICAgfQogfQogCiBURVNUX0YoRlBERlBhcnNlckRlY29kZUVtYmVkZGVydGVzdCwgRmxhdGVEZWNvZGUpIHsKLSAgcGRmaXVtOjpEZWNvZGVUZXN0RGF0YSBmbGF0ZV9kZWNvZGVfY2FzZXNbXSA9IHsKKyAgc3RhdGljIGNvbnN0IHBkZml1bTo6RGVjb2RlVGVzdERhdGEgZmxhdGVfZGVjb2RlX2Nhc2VzW10gPSB7CiAgICAgICBTVFJfSU5fT1VUX0NBU0UoIiIsICIiLCAwKSwKICAgICAgIFNUUl9JTl9PVVRfQ0FTRSgicHJlcG9zdGVyb3VzIG5vbnNlbnNlIiwgIiIsIDIpLAogICAgICAgU1RSX0lOX09VVF9DQVNFKCJceDc4XHg5Y1x4MDNceDAwXHgwMFx4MDBceDAwXHgwMSIsICIiLCA4KSwKQEAgLTczLDE2ICs3MywxOCBAQAogCiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGZsYXRlX2RlY29kZV9jYXNlcyk7ICsraSkgewogICAgIGNvbnN0IHBkZml1bTo6RGVjb2RlVGVzdERhdGEmIGRhdGEgPSBmbGF0ZV9kZWNvZGVfY2FzZXNbaV07Ci0gICAgdW5zaWduZWQgY2hhciogcmVzdWx0ID0gbnVsbHB0cjsKLSAgICB1bnNpZ25lZCBpbnQgcmVzdWx0X3NpemU7CisgICAgdW5zaWduZWQgY2hhciogYnVmID0gbnVsbHB0cjsKKyAgICB1aW50MzJfdCBidWZfc2l6ZTsKICAgICBFWFBFQ1RfRVEoZGF0YS5wcm9jZXNzZWRfc2l6ZSwKLSAgICAgICAgICAgICAgRmxhdGVEZWNvZGUoZGF0YS5pbnB1dCwgZGF0YS5pbnB1dF9zaXplLCByZXN1bHQsIHJlc3VsdF9zaXplKSkKKyAgICAgICAgICAgICAgRmxhdGVEZWNvZGUoZGF0YS5pbnB1dCwgZGF0YS5pbnB1dF9zaXplLCAmYnVmLCAmYnVmX3NpemUpKQogICAgICAgICA8PCAiIGZvciBjYXNlICIgPDwgaTsKLSAgICBBU1NFUlRfVFJVRShyZXN1bHQpOwotICAgIEVYUEVDVF9FUShzdGQ6OnN0cmluZygoY29uc3QgY2hhciopZGF0YS5leHBlY3RlZCwgZGF0YS5leHBlY3RlZF9zaXplKSwKLSAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoKGNvbnN0IGNoYXIqKXJlc3VsdCwgcmVzdWx0X3NpemUpKQorICAgIEFTU0VSVF9UUlVFKGJ1Zik7CisgICAgRVhQRUNUX0VRKGRhdGEuZXhwZWN0ZWRfc2l6ZSwgYnVmX3NpemUpIDw8ICIgZm9yIGNhc2UgIiA8PCBpOworICAgIGlmIChkYXRhLmV4cGVjdGVkX3NpemUgIT0gYnVmX3NpemUpCisgICAgICBjb250aW51ZTsKKyAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKGRhdGEuZXhwZWN0ZWQsIGJ1ZiwgZGF0YS5leHBlY3RlZF9zaXplKSkKICAgICAgICAgPDwgIiBmb3IgY2FzZSAiIDw8IGk7Ci0gICAgRlhfRnJlZShyZXN1bHQpOworICAgIEZYX0ZyZWUoYnVmKTsKICAgfQogfQogCkBAIC0xMTQsMTEgKzExNiwxMiBAQAogICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoImJ1Z180NTUxOTkucGRmIikpOwogICBGUERGX1BBR0UgcGFnZSA9IExvYWRQYWdlKDApOwogICBGUERGX0JJVE1BUCBiaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UpOwotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gIC8vIFJlbmRlcmluZyBvbiBNYWMgaXMgaW5jb25zaXN0ZW50LCBzbyBza2lwIHRoaXMgY2hlY2suCi0gIGNvbnN0IGNoYXIqIGNvbnN0IGtFeHBlY3RlZE1kNXN1bSA9IG51bGxwdHI7CisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCisgIGNvbnN0IGNoYXIga0V4cGVjdGVkTWQ1c3VtW10gPSAiYjkwNDc1Y2E2NGQxMzQ4YzNiZjVlMmI3N2FkOTE4N2EiOworI2VsaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KKyAgY29uc3QgY2hhciBrRXhwZWN0ZWRNZDVzdW1bXSA9ICJlNWE2ZmEyODI5OGRiMDc0ODRjZDkyMmYzZTIxMGM4OCI7CiAjZWxzZQotICBjb25zdCBjaGFyIGtFeHBlY3RlZE1kNXN1bVtdID0gIjZmOWYwZmQ5MDNkYTE3N2JhYmIyNGRkNTBhODA2YTU2IjsKKyAgY29uc3QgY2hhciBrRXhwZWN0ZWRNZDVzdW1bXSA9ICIyYmFhNGMwZTE3NThkZWJhMWI5YzkwOGUxZmJkMDRlZCI7CiAjZW5kaWYKICAgQ29tcGFyZUJpdG1hcChiaXRtYXAsIDIwMCwgMjAwLCBrRXhwZWN0ZWRNZDVzdW0pOwogICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlX3VuaXR0ZXN0LmNwcAppbmRleCAzMGQzMGE0Li45YWI0OTU4IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZV91bml0dGVzdC5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGVfdW5pdHRlc3QuY3BwCkBAIC0zMSw3ICszMSw3IEBACiAgICAgdWludDhfdCogcmVzdWx0ID0gbnVsbHB0cjsKICAgICB1aW50MzJfdCByZXN1bHRfc2l6ZSA9IDA7CiAgICAgRVhQRUNUX0VRKHB0ci0+cHJvY2Vzc2VkX3NpemUsCi0gICAgICAgICAgICAgIEE4NURlY29kZShwdHItPmlucHV0LCBwdHItPmlucHV0X3NpemUsIHJlc3VsdCwgcmVzdWx0X3NpemUpKQorICAgICAgICAgICAgICBBODVEZWNvZGUocHRyLT5pbnB1dCwgcHRyLT5pbnB1dF9zaXplLCAmcmVzdWx0LCAmcmVzdWx0X3NpemUpKQogICAgICAgICA8PCAiZm9yIGNhc2UgIiA8PCBpOwogICAgIEFTU0VSVF9FUShwdHItPmV4cGVjdGVkX3NpemUsIHJlc3VsdF9zaXplKTsKICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHJlc3VsdF9zaXplOyArK2opIHsKQEAgLTY2LDcgKzY2LDcgQEAKICAgICB1aW50OF90KiByZXN1bHQgPSBudWxscHRyOwogICAgIHVpbnQzMl90IHJlc3VsdF9zaXplID0gMDsKICAgICBFWFBFQ1RfRVEocHRyLT5wcm9jZXNzZWRfc2l6ZSwKLSAgICAgICAgICAgICAgSGV4RGVjb2RlKHB0ci0+aW5wdXQsIHB0ci0+aW5wdXRfc2l6ZSwgcmVzdWx0LCByZXN1bHRfc2l6ZSkpCisgICAgICAgICAgICAgIEhleERlY29kZShwdHItPmlucHV0LCBwdHItPmlucHV0X3NpemUsICZyZXN1bHQsICZyZXN1bHRfc2l6ZSkpCiAgICAgICAgIDw8ICJmb3IgY2FzZSAiIDw8IGk7CiAgICAgQVNTRVJUX0VRKHB0ci0+ZXhwZWN0ZWRfc2l6ZSwgcmVzdWx0X3NpemUpOwogICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcmVzdWx0X3NpemU7ICsraikgewpAQCAtNzksOSArNzksOSBAQAogCiBURVNUKGZwZGZfcGFyc2VyX2RlY29kZSwgRW5jb2RlVGV4dCkgewogICBzdHJ1Y3QgRW5jb2RlVGVzdERhdGEgewotICAgIGNvbnN0IEZYX1dDSEFSKiBpbnB1dDsKLSAgICBjb25zdCBGWF9DSEFSKiBleHBlY3RlZF9vdXRwdXQ7Ci0gICAgRlhfU1RSU0laRSBleHBlY3RlZF9sZW5ndGg7CisgICAgY29uc3Qgd2NoYXJfdCogaW5wdXQ7CisgICAgY29uc3QgY2hhciogZXhwZWN0ZWRfb3V0cHV0OworICAgIHNpemVfdCBleHBlY3RlZF9sZW5ndGg7CiAgIH0gdGVzdF9kYXRhW10gPSB7CiAgICAgICAvLyBFbXB0eSBzcmMgc3RyaW5nLgogICAgICAge0wiIiwgIiIsIDB9LApAQCAtOTksMTEgKzk5LDExIEBACiAKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdF9kYXRhKTsgKytpKSB7CiAgICAgY29uc3QgYXV0byYgdGVzdF9jYXNlID0gdGVzdF9kYXRhW2ldOwotICAgIENGWF9CeXRlU3RyaW5nIG91dHB1dCA9IFBERl9FbmNvZGVUZXh0KHRlc3RfY2FzZS5pbnB1dCk7CisgICAgQnl0ZVN0cmluZyBvdXRwdXQgPSBQREZfRW5jb2RlVGV4dCh0ZXN0X2Nhc2UuaW5wdXQpOwogICAgIEFTU0VSVF9FUSh0ZXN0X2Nhc2UuZXhwZWN0ZWRfbGVuZ3RoLCBvdXRwdXQuR2V0TGVuZ3RoKCkpIDw8ICJmb3IgY2FzZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaTsKLSAgICBjb25zdCBGWF9DSEFSKiBzdHJfcHRyID0gb3V0cHV0LmNfc3RyKCk7Ci0gICAgZm9yIChGWF9TVFJTSVpFIGogPSAwOyBqIDwgdGVzdF9jYXNlLmV4cGVjdGVkX2xlbmd0aDsgKytqKSB7CisgICAgY29uc3QgY2hhciogc3RyX3B0ciA9IG91dHB1dC5jX3N0cigpOworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgdGVzdF9jYXNlLmV4cGVjdGVkX2xlbmd0aDsgKytqKSB7CiAgICAgICBFWFBFQ1RfRVEodGVzdF9jYXNlLmV4cGVjdGVkX291dHB1dFtqXSwgc3RyX3B0cltqXSkgPDwgImZvciBjYXNlICIgPDwgaQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgY2hhciAiIDw8IGo7CiAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl91dGlsaXR5LmNwcCBiL2NvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfdXRpbGl0eS5jcHAKaW5kZXggOTU4M2VhNy4uNDUyODRhNCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl91dGlsaXR5LmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2ZwZGZfcGFyc2VyX3V0aWxpdHkuY3BwCkBAIC0xNSw3ICsxNSw5IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbV9hY2MuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyaW5nLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGUuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJlYW0uaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2xvZ2dpbmcuaCIKIAogLy8gSW5kZXhlZCBieSA4LWJpdCBjaGFyYWN0ZXIgY29kZSwgY29udGFpbnMgZWl0aGVyOgogLy8gICAnVycgLSBmb3Igd2hpdGVzcGFjZTogTlVMLCBUQUIsIENSLCBMRiwgRkYsIFNQQUNFLCAweDgwLCAweGZmCkBAIC02OSw1MiArNzEsNTAgQEAKICAgICAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1InLAogICAgICdSJywgJ1InLCAnUicsICdSJywgJ1InLCAnUicsICdSJywgJ1cnfTsKIAotaW50MzJfdCBHZXRIZWFkZXJPZmZzZXQoY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGUpIHsKK2ludDMyX3QgR2V0SGVhZGVyT2Zmc2V0KGNvbnN0IFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGUpIHsKICAgY29uc3Qgc2l6ZV90IGtCdWZTaXplID0gNDsKICAgdWludDhfdCBidWZba0J1ZlNpemVdOwogICBmb3IgKGludDMyX3Qgb2Zmc2V0ID0gMDsgb2Zmc2V0IDw9IDEwMjQ7ICsrb2Zmc2V0KSB7CiAgICAgaWYgKCFwRmlsZS0+UmVhZEJsb2NrKGJ1Ziwgb2Zmc2V0LCBrQnVmU2l6ZSkpCi0gICAgICByZXR1cm4gLTE7CisgICAgICByZXR1cm4ga0ludmFsaWRIZWFkZXJPZmZzZXQ7CiAKICAgICBpZiAobWVtY21wKGJ1ZiwgIiVQREYiLCA0KSA9PSAwKQogICAgICAgcmV0dXJuIG9mZnNldDsKICAgfQotICByZXR1cm4gLTE7CisgIHJldHVybiBrSW52YWxpZEhlYWRlck9mZnNldDsKIH0KIAotaW50MzJfdCBHZXREaXJlY3RJbnRlZ2VyKENQREZfRGljdGlvbmFyeSogcERpY3QsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXkpIHsKK2ludDMyX3QgR2V0RGlyZWN0SW50ZWdlcihDUERGX0RpY3Rpb25hcnkqIHBEaWN0LCBjb25zdCBCeXRlU3RyaW5nJiBrZXkpIHsKICAgQ1BERl9OdW1iZXIqIHBPYmogPSBUb051bWJlcihwRGljdC0+R2V0T2JqZWN0Rm9yKGtleSkpOwogICByZXR1cm4gcE9iaiA/IHBPYmotPkdldEludGVnZXIoKSA6IDA7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIFBERl9OYW1lRGVjb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnN0cikgewotICBpZiAoYnN0ci5GaW5kKCcjJykgPT0gLTEpCi0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGJzdHIpOworQnl0ZVN0cmluZyBQREZfTmFtZURlY29kZShjb25zdCBCeXRlU3RyaW5nVmlldyYgYnN0cikgeworICBpZiAoIWJzdHIuQ29udGFpbnMoJyMnKSkKKyAgICByZXR1cm4gQnl0ZVN0cmluZyhic3RyKTsKIAogICBpbnQgc2l6ZSA9IGJzdHIuR2V0TGVuZ3RoKCk7Ci0gIENGWF9CeXRlU3RyaW5nIHJlc3VsdDsKLSAgRlhfQ0hBUiogcERlc3RTdGFydCA9IHJlc3VsdC5HZXRCdWZmZXIoc2l6ZSk7Ci0gIEZYX0NIQVIqIHBEZXN0ID0gcERlc3RTdGFydDsKKyAgQnl0ZVN0cmluZyByZXN1bHQ7CisgIGNoYXIqIHBEZXN0U3RhcnQgPSByZXN1bHQuR2V0QnVmZmVyKHNpemUpOworICBjaGFyKiBwRGVzdCA9IHBEZXN0U3RhcnQ7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgaWYgKGJzdHJbaV0gPT0gJyMnICYmIGkgPCBzaXplIC0gMikgewotICAgICAgKnBEZXN0KysgPQotICAgICAgICAgIEZYU1lTX3RvSGV4RGlnaXQoYnN0cltpICsgMV0pICogMTYgKyBGWFNZU190b0hleERpZ2l0KGJzdHJbaSArIDJdKTsKKyAgICAgICpwRGVzdCsrID0gRlhTWVNfSGV4Q2hhclRvSW50KGJzdHJbaSArIDFdKSAqIDE2ICsKKyAgICAgICAgICAgICAgICAgRlhTWVNfSGV4Q2hhclRvSW50KGJzdHJbaSArIDJdKTsKICAgICAgIGkgKz0gMjsKICAgICB9IGVsc2UgewogICAgICAgKnBEZXN0KysgPSBic3RyW2ldOwogICAgIH0KICAgfQotICByZXN1bHQuUmVsZWFzZUJ1ZmZlcigoRlhfU1RSU0laRSkocERlc3QgLSBwRGVzdFN0YXJ0KSk7CisgIHJlc3VsdC5SZWxlYXNlQnVmZmVyKHN0YXRpY19jYXN0PHNpemVfdD4ocERlc3QgLSBwRGVzdFN0YXJ0KSk7CiAgIHJldHVybiByZXN1bHQ7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIFBERl9OYW1lRGVjb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvcmlnKSB7Ci0gIGlmIChvcmlnLkZpbmQoJyMnKSA9PSAtMSkKLSAgICByZXR1cm4gb3JpZzsKLSAgcmV0dXJuIFBERl9OYW1lRGVjb2RlKG9yaWcuQXNTdHJpbmdDKCkpOworQnl0ZVN0cmluZyBQREZfTmFtZURlY29kZShjb25zdCBCeXRlU3RyaW5nJiBvcmlnKSB7CisgIHJldHVybiBvcmlnLkNvbnRhaW5zKCIjIikgPyBQREZfTmFtZURlY29kZShvcmlnLkFzU3RyaW5nVmlldygpKSA6IG9yaWc7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIFBERl9OYW1lRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvcmlnKSB7CitCeXRlU3RyaW5nIFBERl9OYW1lRW5jb2RlKGNvbnN0IEJ5dGVTdHJpbmcmIG9yaWcpIHsKICAgdWludDhfdCogc3JjX2J1ZiA9ICh1aW50OF90KilvcmlnLmNfc3RyKCk7CiAgIGludCBzcmNfbGVuID0gb3JpZy5HZXRMZW5ndGgoKTsKICAgaW50IGRlc3RfbGVuID0gMDsKQEAgLTEzMSwyNiArMTMxLDI2IEBACiAgIGlmIChkZXN0X2xlbiA9PSBzcmNfbGVuKQogICAgIHJldHVybiBvcmlnOwogCi0gIENGWF9CeXRlU3RyaW5nIHJlczsKLSAgRlhfQ0hBUiogZGVzdF9idWYgPSByZXMuR2V0QnVmZmVyKGRlc3RfbGVuKTsKKyAgQnl0ZVN0cmluZyByZXM7CisgIGNoYXIqIGRlc3RfYnVmID0gcmVzLkdldEJ1ZmZlcihkZXN0X2xlbik7CiAgIGRlc3RfbGVuID0gMDsKICAgZm9yIChpID0gMDsgaSA8IHNyY19sZW47IGkrKykgewogICAgIHVpbnQ4X3QgY2ggPSBzcmNfYnVmW2ldOwogICAgIGlmIChjaCA+PSAweDgwIHx8IFBERkNoYXJJc1doaXRlc3BhY2UoY2gpIHx8IGNoID09ICcjJyB8fAogICAgICAgICBQREZDaGFySXNEZWxpbWl0ZXIoY2gpKSB7CiAgICAgICBkZXN0X2J1ZltkZXN0X2xlbisrXSA9ICcjJzsKLSAgICAgIGRlc3RfYnVmW2Rlc3RfbGVuKytdID0gIjAxMjM0NTY3ODlBQkNERUYiW2NoIC8gMTZdOwotICAgICAgZGVzdF9idWZbZGVzdF9sZW4rK10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiJbY2ggJSAxNl07CisgICAgICBGWFNZU19JbnRUb1R3b0hleENoYXJzKGNoLCBkZXN0X2J1ZiArIGRlc3RfbGVuKTsKKyAgICAgIGRlc3RfbGVuICs9IDI7CiAgICAgfSBlbHNlIHsKICAgICAgIGRlc3RfYnVmW2Rlc3RfbGVuKytdID0gY2g7CiAgICAgfQogICB9CiAgIGRlc3RfYnVmW2Rlc3RfbGVuXSA9IDA7Ci0gIHJlcy5SZWxlYXNlQnVmZmVyKCk7CisgIHJlcy5SZWxlYXNlQnVmZmVyKHJlcy5HZXRTdHJpbmdMZW5ndGgoKSk7CiAgIHJldHVybiByZXM7CiB9CiAKLUNGWF9CeXRlVGV4dEJ1ZiYgb3BlcmF0b3I8PChDRlhfQnl0ZVRleHRCdWYmIGJ1ZiwgY29uc3QgQ1BERl9PYmplY3QqIHBPYmopIHsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIGJ1ZiwgY29uc3QgQ1BERl9PYmplY3QqIHBPYmopIHsKICAgaWYgKCFwT2JqKSB7CiAgICAgYnVmIDw8ICIgbnVsbCI7CiAgICAgcmV0dXJuIGJ1ZjsKQEAgLTE2Nyw3ICsxNjcsNyBAQAogICAgICAgYnVmIDw8IFBERl9FbmNvZGVTdHJpbmcocE9iai0+R2V0U3RyaW5nKCksIHBPYmotPkFzU3RyaW5nKCktPklzSGV4KCkpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBDUERGX09iamVjdDo6TkFNRTogewotICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gcE9iai0+R2V0U3RyaW5nKCk7CisgICAgICBCeXRlU3RyaW5nIHN0ciA9IHBPYmotPkdldFN0cmluZygpOwogICAgICAgYnVmIDw8ICIvIiA8PCBQREZfTmFtZUVuY29kZShzdHIpOwogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMTkzLDcgKzE5Myw3IEBACiAgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHAgPSBwT2JqLT5Bc0RpY3Rpb25hcnkoKTsKICAgICAgIGJ1ZiA8PCAiPDwiOwogICAgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICpwKSB7Ci0gICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXkgPSBpdC5maXJzdDsKKyAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYga2V5ID0gaXQuZmlyc3Q7CiAgICAgICAgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBpdC5zZWNvbmQuZ2V0KCk7CiAgICAgICAgIGJ1ZiA8PCAiLyIgPDwgUERGX05hbWVFbmNvZGUoa2V5KTsKICAgICAgICAgaWYgKHBWYWx1ZSAmJiAhcFZhbHVlLT5Jc0lubGluZSgpKSB7CkBAIC0yMDgsMTQgKzIwOCwxNSBAQAogICAgIGNhc2UgQ1BERl9PYmplY3Q6OlNUUkVBTTogewogICAgICAgY29uc3QgQ1BERl9TdHJlYW0qIHAgPSBwT2JqLT5Bc1N0cmVhbSgpOwogICAgICAgYnVmIDw8IHAtPkdldERpY3QoKSA8PCAic3RyZWFtXHJcbiI7Ci0gICAgICBDUERGX1N0cmVhbUFjYyBhY2M7Ci0gICAgICBhY2MuTG9hZEFsbERhdGEocCwgdHJ1ZSk7Ci0gICAgICBidWYuQXBwZW5kQmxvY2soYWNjLkdldERhdGEoKSwgYWNjLkdldFNpemUoKSk7CisgICAgICBhdXRvIHBBY2MgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERl9TdHJlYW1BY2M+KHApOworICAgICAgcEFjYy0+TG9hZEFsbERhdGFSYXcoKTsKKyAgICAgIGJ1Zi53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwQWNjLT5HZXREYXRhKCkpLAorICAgICAgICAgICAgICAgIHBBY2MtPkdldFNpemUoKSk7CiAgICAgICBidWYgPDwgIlxyXG5lbmRzdHJlYW0iOwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGRlZmF1bHQ6Ci0gICAgICBBU1NFUlQoZmFsc2UpOworICAgICAgTk9UUkVBQ0hFRCgpOwogICAgICAgYnJlYWs7CiAgIH0KICAgcmV0dXJuIGJ1ZjsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfdXRpbGl0eS5oIGIvY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl91dGlsaXR5LmgKaW5kZXggMjlmNTRlZS4uZTRiOTIyYyAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl91dGlsaXR5LmgKKysrIGIvY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl91dGlsaXR5LmgKQEAgLTcsMTIgKzcsMTIgQEAKICNpZm5kZWYgQ09SRV9GUERGQVBJX1BBUlNFUl9GUERGX1BBUlNFUl9VVElMSVRZX0hfCiAjZGVmaW5lIENPUkVfRlBERkFQSV9QQVJTRVJfRlBERl9QQVJTRVJfVVRJTElUWV9IXwogCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfcmV0YWluX3B0ci5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKIAogY2xhc3MgSUZYX1NlZWthYmxlUmVhZFN0cmVhbTsKIGNsYXNzIENQREZfRGljdGlvbmFyeTsKK2NsYXNzIENQREZfT2JqZWN0OwogCiAvLyBVc2UgdGhlIGFjY2Vzc29ycyBiZWxvdyBpbnN0ZWFkIG9mIGRpcmVjdGx5IGFjY2Vzc2luZyBQREZfQ2hhclR5cGUuCiBleHRlcm4gY29uc3QgY2hhciBQREZfQ2hhclR5cGVbMjU2XTsKQEAgLTM0LDcgKzM0LDE1IEBACiAgIHJldHVybiBjID09ICdccicgfHwgYyA9PSAnXG4nOwogfQogCi1pbnQzMl90IEdldEhlYWRlck9mZnNldChjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZSk7Ci1pbnQzMl90IEdldERpcmVjdEludGVnZXIoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGtleSk7Citjb25zdGV4cHIgaW50MzJfdCBrSW52YWxpZEhlYWRlck9mZnNldCA9IC0xOworCisvLyBPbiBzdWNjZXNzLCByZXR1cm4gYSBwb3NpdGl2ZSBvZmZzZXQgdmFsdWUgdG8gdGhlIFBERiBoZWFkZXIuLiBJZiB0aGUgaGVhZGVyCisvLyBjYW5ub3QgYmUgZm91bmQsIG9yIGlmIHRoZXJlIGlzIGFuIGVycm9yIHJlYWRpbmcgZnJvbSB8cEZpbGV8LCB0aGVuIHJldHVybgorLy8gfGtJbnZhbGlkSGVhZGVyT2Zmc2V0fC4KK2ludDMyX3QgR2V0SGVhZGVyT2Zmc2V0KGNvbnN0IFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGUpOworCitpbnQzMl90IEdldERpcmVjdEludGVnZXIoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwgY29uc3QgQnl0ZVN0cmluZyYga2V5KTsKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgYnVmLCBjb25zdCBDUERGX09iamVjdCogcE9iaik7CiAKICNlbmRpZiAgLy8gQ09SRV9GUERGQVBJX1BBUlNFUl9GUERGX1BBUlNFUl9VVElMSVRZX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfY2hhcnBvc2xpc3QuY3BwIGIvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX2NoYXJwb3NsaXN0LmNwcAppbmRleCA2MzliZGNmLi5jMGM3MDBjIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfY2hhcnBvc2xpc3QuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9jaGFycG9zbGlzdC5jcHAKQEAgLTgsNyArOCw2IEBACiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NpZGZvbnQuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2ZvbnQuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCiAKIENQREZfQ2hhclBvc0xpc3Q6OkNQREZfQ2hhclBvc0xpc3QoKSB7CiAgIG1fcENoYXJQb3MgPSBudWxscHRyOwpAQCAtMjAsMTUgKzE5LDE0IEBACiB9CiAKIHZvaWQgQ1BERl9DaGFyUG9zTGlzdDo6TG9hZChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGNoYXJDb2RlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxGWF9GTE9BVD4mIGNoYXJQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiBjaGFyUG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgRm9udFNpemUpIHsKLSAgaW50IG5DaGFycyA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50PihjaGFyQ29kZXMpOwotICBtX3BDaGFyUG9zID0gRlhfQWxsb2MoRlhURVhUX0NIQVJQT1MsIG5DaGFycyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgRm9udFNpemUpIHsKKyAgbV9wQ2hhclBvcyA9IEZYX0FsbG9jKEZYVEVYVF9DSEFSUE9TLCBjaGFyQ29kZXMuc2l6ZSgpKTsKICAgbV9uQ2hhcnMgPSAwOwogICBDUERGX0NJREZvbnQqIHBDSURGb250ID0gcEZvbnQtPkFzQ0lERm9udCgpOwogICBib29sIGJWZXJ0V3JpdGluZyA9IHBDSURGb250ICYmIHBDSURGb250LT5Jc1ZlcnRXcml0aW5nKCk7Ci0gIGZvciAoaW50IGlDaGFyID0gMDsgaUNoYXIgPCBuQ2hhcnM7IGlDaGFyKyspIHsKKyAgZm9yIChzaXplX3QgaUNoYXIgPSAwOyBpQ2hhciA8IGNoYXJDb2Rlcy5zaXplKCk7ICsraUNoYXIpIHsKICAgICB1aW50MzJfdCBDaGFyQ29kZSA9IGNoYXJDb2Rlc1tpQ2hhcl07CiAgICAgaWYgKENoYXJDb2RlID09IHN0YXRpY19jYXN0PHVpbnQzMl90PigtMSkpCiAgICAgICBjb250aW51ZTsKQEAgLTM3LDI4ICszNSw1OSBAQAogICAgIEZYVEVYVF9DSEFSUE9TJiBjaGFycG9zID0gbV9wQ2hhclBvc1ttX25DaGFycysrXTsKICAgICBpZiAocENJREZvbnQpCiAgICAgICBjaGFycG9zLm1fYkZvbnRTdHlsZSA9IHRydWU7Ci0KKyAgICBXaWRlU3RyaW5nIHVuaWNvZGUgPSBwRm9udC0+VW5pY29kZUZyb21DaGFyQ29kZShDaGFyQ29kZSk7CisgICAgY2hhcnBvcy5tX1VuaWNvZGUgPSAhdW5pY29kZS5Jc0VtcHR5KCkgPyB1bmljb2RlWzBdIDogQ2hhckNvZGU7CiAgICAgY2hhcnBvcy5tX0dseXBoSW5kZXggPSBwRm9udC0+R2x5cGhGcm9tQ2hhckNvZGUoQ2hhckNvZGUsICZiVmVydCk7Ci0gICAgaWYgKGNoYXJwb3MubV9HbHlwaEluZGV4ICE9IHN0YXRpY19jYXN0PHVpbnQzMl90PigtMSkpIHsKKyAgICB1aW50MzJfdCBHbHlwaElEID0gY2hhcnBvcy5tX0dseXBoSW5kZXg7CisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCisgICAgY2hhcnBvcy5tX0V4dEdJRCA9IHBGb250LT5HbHlwaEZyb21DaGFyQ29kZUV4dChDaGFyQ29kZSk7CisgICAgR2x5cGhJRCA9IGNoYXJwb3MubV9FeHRHSUQ7CisjZW5kaWYKKyAgICBDRlhfRm9udCogcEN1cnJlbnRGb250OworICAgIGlmIChHbHlwaElEICE9IHN0YXRpY19jYXN0PHVpbnQzMl90PigtMSkpIHsKICAgICAgIGNoYXJwb3MubV9GYWxsYmFja0ZvbnRQb3NpdGlvbiA9IC0xOworICAgICAgcEN1cnJlbnRGb250ID0gcEZvbnQtPkdldEZvbnQoKTsKICAgICB9IGVsc2UgewogICAgICAgY2hhcnBvcy5tX0ZhbGxiYWNrRm9udFBvc2l0aW9uID0KICAgICAgICAgICBwRm9udC0+RmFsbGJhY2tGb250RnJvbUNoYXJjb2RlKENoYXJDb2RlKTsKICAgICAgIGNoYXJwb3MubV9HbHlwaEluZGV4ID0gcEZvbnQtPkZhbGxiYWNrR2x5cGhGcm9tQ2hhcmNvZGUoCiAgICAgICAgICAgY2hhcnBvcy5tX0ZhbGxiYWNrRm9udFBvc2l0aW9uLCBDaGFyQ29kZSk7CisgICAgICBwQ3VycmVudEZvbnQgPSBwRm9udC0+R2V0Rm9udEZhbGxiYWNrKGNoYXJwb3MubV9GYWxsYmFja0ZvbnRQb3NpdGlvbik7CisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCisgICAgICBjaGFycG9zLm1fRXh0R0lEID0gY2hhcnBvcy5tX0dseXBoSW5kZXg7CisjZW5kaWYKICAgICB9CiAKLS8vIFRPRE8obnBtKTogRmlndXJlIG91dCBob3cgdGhpcyBhZmZlY3RzIG1fRXh0R0lECi0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICBjaGFycG9zLm1fRXh0R0lEID0gcEZvbnQtPkdseXBoRnJvbUNoYXJDb2RlRXh0KENoYXJDb2RlKTsKLSNlbmRpZgogICAgIGlmICghcEZvbnQtPklzRW1iZWRkZWQoKSAmJiAhcEZvbnQtPklzQ0lERm9udCgpKQogICAgICAgY2hhcnBvcy5tX0ZvbnRDaGFyV2lkdGggPSBwRm9udC0+R2V0Q2hhcldpZHRoRihDaGFyQ29kZSk7CiAgICAgZWxzZQogICAgICAgY2hhcnBvcy5tX0ZvbnRDaGFyV2lkdGggPSAwOwogCi0gICAgY2hhcnBvcy5tX09yaWdpbiA9IENGWF9Qb2ludEYoaUNoYXIgPyBjaGFyUG9zW2lDaGFyIC0gMV0gOiAwLCAwKTsKKyAgICBjaGFycG9zLm1fT3JpZ2luID0gQ0ZYX1BvaW50RihpQ2hhciA+IDAgPyBjaGFyUG9zW2lDaGFyIC0gMV0gOiAwLCAwKTsKICAgICBjaGFycG9zLm1fYkdseXBoQWRqdXN0ID0gZmFsc2U7CisKKyAgICBmbG9hdCBzY2FsaW5nRmFjdG9yID0gMS4wZjsKKyAgICBpZiAoIXBGb250LT5Jc0VtYmVkZGVkKCkgJiYgcEZvbnQtPkhhc0ZvbnRXaWR0aHMoKSAmJiAhYlZlcnRXcml0aW5nICYmCisgICAgICAgICFwQ3VycmVudEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX2JGbGFnTU0pIHsKKyAgICAgIGludCBwZGZHbHlwaFdpZHRoID0gcEZvbnQtPkdldENoYXJXaWR0aEYoQ2hhckNvZGUpOworICAgICAgaW50IGZ0R2x5cGhXaWR0aCA9CisgICAgICAgICAgcEN1cnJlbnRGb250ID8gcEN1cnJlbnRGb250LT5HZXRHbHlwaFdpZHRoKGNoYXJwb3MubV9HbHlwaEluZGV4KSA6IDA7CisgICAgICBpZiAoZnRHbHlwaFdpZHRoICYmIHBkZkdseXBoV2lkdGggPiBmdEdseXBoV2lkdGggKyAxKSB7CisgICAgICAgIC8vIE1vdmUgdGhlIGluaXRpYWwgeCBwb3NpdGlvbiBieSBoYWxmIG9mIHRoZSBleGNlc3MgKHRyYW5zZm9ybWVkIHRvCisgICAgICAgIC8vIHRleHQgc3BhY2UgY29vcmRpbmF0ZXMpLgorICAgICAgICBjaGFycG9zLm1fT3JpZ2luLnggKz0KKyAgICAgICAgICAgIChwZGZHbHlwaFdpZHRoIC0gZnRHbHlwaFdpZHRoKSAqIEZvbnRTaXplIC8gMjAwMC4wZjsKKyAgICAgIH0gZWxzZSBpZiAocGRmR2x5cGhXaWR0aCAmJiBmdEdseXBoV2lkdGggJiYKKyAgICAgICAgICAgICAgICAgcGRmR2x5cGhXaWR0aCA8IGZ0R2x5cGhXaWR0aCkgeworICAgICAgICBzY2FsaW5nRmFjdG9yID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBkZkdseXBoV2lkdGgpIC8gZnRHbHlwaFdpZHRoOworICAgICAgICBBU1NFUlQoc2NhbGluZ0ZhY3RvciA+PSAwLjBmKTsKKyAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFswXSA9IHNjYWxpbmdGYWN0b3I7CisgICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMV0gPSAwLjBmOworICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzJdID0gMC4wZjsKKyAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFszXSA9IDEuMGY7CisgICAgICAgIGNoYXJwb3MubV9iR2x5cGhBZGp1c3QgPSB0cnVlOworICAgICAgfQorICAgIH0KICAgICBpZiAoIXBDSURGb250KQogICAgICAgY29udGludWU7CiAKQEAgLTc1LDkgKzEwNCwxMSBAQAogCiAgICAgY29uc3QgdWludDhfdCogcFRyYW5zZm9ybSA9IHBDSURGb250LT5HZXRDSURUcmFuc2Zvcm0oQ0lEKTsKICAgICBpZiAocFRyYW5zZm9ybSAmJiAhYlZlcnQpIHsKLSAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMF0gPSBwQ0lERm9udC0+Q0lEVHJhbnNmb3JtVG9GbG9hdChwVHJhbnNmb3JtWzBdKTsKKyAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMF0gPQorICAgICAgICAgIHBDSURGb250LT5DSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bMF0pICogc2NhbGluZ0ZhY3RvcjsKKyAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMV0gPQorICAgICAgICAgIHBDSURGb250LT5DSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bMV0pICogc2NhbGluZ0ZhY3RvcjsKICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMl0gPSBwQ0lERm9udC0+Q0lEVHJhbnNmb3JtVG9GbG9hdChwVHJhbnNmb3JtWzJdKTsKLSAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMV0gPSBwQ0lERm9udC0+Q0lEVHJhbnNmb3JtVG9GbG9hdChwVHJhbnNmb3JtWzFdKTsKICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbM10gPSBwQ0lERm9udC0+Q0lEVHJhbnNmb3JtVG9GbG9hdChwVHJhbnNmb3JtWzNdKTsKICAgICAgIGNoYXJwb3MubV9PcmlnaW4ueCArPQogICAgICAgICAgIHBDSURGb250LT5DSURUcmFuc2Zvcm1Ub0Zsb2F0KHBUcmFuc2Zvcm1bNF0pICogRm9udFNpemU7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfY2hhcnBvc2xpc3QuaCBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9jaGFycG9zbGlzdC5oCmluZGV4IDJmNWE0NGQuLmM0NjM2YmMgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9jaGFycG9zbGlzdC5oCisrKyBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9jaGFycG9zbGlzdC5oCkBAIC0xOSw5ICsxOSw5IEBACiAgIENQREZfQ2hhclBvc0xpc3QoKTsKICAgfkNQREZfQ2hhclBvc0xpc3QoKTsKICAgdm9pZCBMb2FkKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgY2hhckNvZGVzLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8RlhfRkxPQVQ+JiBjaGFyUG9zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiBjaGFyUG9zLAogICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwKLSAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSk7CisgICAgICAgICAgICBmbG9hdCBmb250X3NpemUpOwogICBGWFRFWFRfQ0hBUlBPUyogbV9wQ2hhclBvczsKICAgdWludDMyX3QgbV9uQ2hhcnM7CiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX2RldmljZWJ1ZmZlci5jcHAgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfZGV2aWNlYnVmZmVyLmNwcAppbmRleCBkZWMxMzQzLi5iOTZkMDAyIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfZGV2aWNlYnVmZmVyLmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfZGV2aWNlYnVmZmVyLmNwcApAQCAtOSwxMyArOSwxMyBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW9iamVjdC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9yZW5kZXJjb250ZXh0LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3JlbmRlcm9wdGlvbnMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2Z4Z2VkZXZpY2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2RlZmF1bHRyZW5kZXJkZXZpY2UuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2RpYml0bWFwLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAotQ1BERl9EZXZpY2VCdWZmZXI6OkNQREZfRGV2aWNlQnVmZmVyKCkKLSAgICA6IG1fcERldmljZShudWxscHRyKSwgbV9wQ29udGV4dChudWxscHRyKSwgbV9wT2JqZWN0KG51bGxwdHIpIHt9CitDUERGX0RldmljZUJ1ZmZlcjo6Q1BERl9EZXZpY2VCdWZmZXIoKSB7fQogCiBDUERGX0RldmljZUJ1ZmZlcjo6fkNQREZfRGV2aWNlQnVmZmVyKCkge30KIApAQCAtMjksNyArMjksNyBAQAogICBtX1JlY3QgPSAqcFJlY3Q7CiAgIG1fcE9iamVjdCA9IHBPYmo7CiAgIG1fTWF0cml4LlRyYW5zbGF0ZSgtcFJlY3QtPmxlZnQsIC1wUmVjdC0+dG9wKTsKLSNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX0FQUExFXworI2lmIF9GWF9QTEFURk9STV8gIT0gX0ZYX1BMQVRGT1JNX0FQUExFXwogICBpbnQgaG9yel9zaXplID0gcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX0hPUlpfU0laRSk7CiAgIGludCB2ZXJ0X3NpemUgPSBwRGV2aWNlLT5HZXREZXZpY2VDYXBzKEZYRENfVkVSVF9TSVpFKTsKICAgaWYgKGhvcnpfc2l6ZSAmJiB2ZXJ0X3NpemUgJiYgbWF4X2RwaSkgewpAQCAtMzgsMTkgKzM4LDE3IEBACiAgICAgaW50IGRwaXYgPQogICAgICAgICBwRGV2aWNlLT5HZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSAqIDI1NCAvICh2ZXJ0X3NpemUgKiAxMCk7CiAgICAgaWYgKGRwaWggPiBtYXhfZHBpKQotICAgICAgbV9NYXRyaXguU2NhbGUoKEZYX0ZMT0FUKShtYXhfZHBpKSAvIGRwaWgsIDEuMGYpOworICAgICAgbV9NYXRyaXguU2NhbGUoKGZsb2F0KShtYXhfZHBpKSAvIGRwaWgsIDEuMGYpOwogICAgIGlmIChkcGl2ID4gbWF4X2RwaSkKLSAgICAgIG1fTWF0cml4LlNjYWxlKDEuMGYsIChGWF9GTE9BVCkobWF4X2RwaSkgLyAoRlhfRkxPQVQpZHBpdik7CisgICAgICBtX01hdHJpeC5TY2FsZSgxLjBmLCAoZmxvYXQpKG1heF9kcGkpIC8gKGZsb2F0KWRwaXYpOwogICB9CiAjZW5kaWYKICAgQ0ZYX01hdHJpeCBjdG0gPSBtX3BEZXZpY2UtPkdldENUTSgpOwotICBtX01hdHJpeC5Db25jYXQoQ0ZYX01hdHJpeChGWFNZU19mYWJzKGN0bS5hKSwgMCwgMCwgRlhTWVNfZmFicyhjdG0uZCksIDAsIDApKTsKKyAgbV9NYXRyaXguQ29uY2F0KENGWF9NYXRyaXgoZmFicyhjdG0uYSksIDAsIDAsIGZhYnMoY3RtLmQpLCAwLCAwKSk7CiAKLSAgQ0ZYX0Zsb2F0UmVjdCByZWN0KCpwUmVjdCk7Ci0gIG1fTWF0cml4LlRyYW5zZm9ybVJlY3QocmVjdCk7Ci0KLSAgRlhfUkVDVCBiaXRtYXBfcmVjdCA9IHJlY3QuR2V0T3V0ZXJSZWN0KCk7Ci0gIG1fcEJpdG1hcCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfRElCaXRtYXA+KCk7CisgIEZYX1JFQ1QgYml0bWFwX3JlY3QgPQorICAgICAgbV9NYXRyaXguVHJhbnNmb3JtUmVjdChDRlhfRmxvYXRSZWN0KCpwUmVjdCkpLkdldE91dGVyUmVjdCgpOworICBtX3BCaXRtYXAgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOwogICBtX3BCaXRtYXAtPkNyZWF0ZShiaXRtYXBfcmVjdC5XaWR0aCgpLCBiaXRtYXBfcmVjdC5IZWlnaHQoKSwgRlhESUJfQXJnYik7CiAgIHJldHVybiB0cnVlOwogfQpAQCAtNTgsMTkgKzU2LDE5IEBACiB2b2lkIENQREZfRGV2aWNlQnVmZmVyOjpPdXRwdXRUb0RldmljZSgpIHsKICAgaWYgKG1fcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1JFTkRFUl9DQVBTKSAmIEZYUkNfR0VUX0JJVFMpIHsKICAgICBpZiAobV9NYXRyaXguYSA9PSAxLjBmICYmIG1fTWF0cml4LmQgPT0gMS4wZikgewotICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHMobV9wQml0bWFwLmdldCgpLCBtX1JlY3QubGVmdCwgbV9SZWN0LnRvcCk7CisgICAgICBtX3BEZXZpY2UtPlNldERJQml0cyhtX3BCaXRtYXAsIG1fUmVjdC5sZWZ0LCBtX1JlY3QudG9wKTsKICAgICB9IGVsc2UgewotICAgICAgbV9wRGV2aWNlLT5TdHJldGNoRElCaXRzKG1fcEJpdG1hcC5nZXQoKSwgbV9SZWN0LmxlZnQsIG1fUmVjdC50b3AsCisgICAgICBtX3BEZXZpY2UtPlN0cmV0Y2hESUJpdHMobV9wQml0bWFwLCBtX1JlY3QubGVmdCwgbV9SZWN0LnRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1JlY3QuV2lkdGgoKSwgbV9SZWN0LkhlaWdodCgpKTsKICAgICB9CiAgICAgcmV0dXJuOwogICB9Ci0gIENGWF9ESUJpdG1hcCBidWZmZXI7Ci0gIG1fcERldmljZS0+Q3JlYXRlQ29tcGF0aWJsZUJpdG1hcCgmYnVmZmVyLCBtX3BCaXRtYXAtPkdldFdpZHRoKCksCisgIGF1dG8gcEJ1ZmZlciA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfRElCaXRtYXA+KCk7CisgIG1fcERldmljZS0+Q3JlYXRlQ29tcGF0aWJsZUJpdG1hcChwQnVmZmVyLCBtX3BCaXRtYXAtPkdldFdpZHRoKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BCaXRtYXAtPkdldEhlaWdodCgpKTsKLSAgbV9wQ29udGV4dC0+R2V0QmFja2dyb3VuZCgmYnVmZmVyLCBtX3BPYmplY3QsIG51bGxwdHIsICZtX01hdHJpeCk7Ci0gIGJ1ZmZlci5Db21wb3NpdGVCaXRtYXAoMCwgMCwgYnVmZmVyLkdldFdpZHRoKCksIGJ1ZmZlci5HZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtX3BCaXRtYXAuZ2V0KCksIDAsIDApOwotICBtX3BEZXZpY2UtPlN0cmV0Y2hESUJpdHMoJmJ1ZmZlciwgbV9SZWN0LmxlZnQsIG1fUmVjdC50b3AsIG1fUmVjdC5XaWR0aCgpLAorICBtX3BDb250ZXh0LT5HZXRCYWNrZ3JvdW5kKHBCdWZmZXIsIG1fcE9iamVjdC5HZXQoKSwgbnVsbHB0ciwgJm1fTWF0cml4KTsKKyAgcEJ1ZmZlci0+Q29tcG9zaXRlQml0bWFwKDAsIDAsIHBCdWZmZXItPkdldFdpZHRoKCksIHBCdWZmZXItPkdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQml0bWFwLCAwLCAwKTsKKyAgbV9wRGV2aWNlLT5TdHJldGNoRElCaXRzKHBCdWZmZXIsIG1fUmVjdC5sZWZ0LCBtX1JlY3QudG9wLCBtX1JlY3QuV2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fUmVjdC5IZWlnaHQoKSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfZGV2aWNlYnVmZmVyLmggYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfZGV2aWNlYnVmZmVyLmgKaW5kZXggZTViYmYxZi4uODU0OTA2ZSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX2RldmljZWJ1ZmZlci5oCisrKyBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9kZXZpY2VidWZmZXIuaApAQCAtMTAsNiArMTAsOCBAQAogI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAKIGNsYXNzIENGWF9ESUJpdG1hcDsKIGNsYXNzIENGWF9SZW5kZXJEZXZpY2U7CkBAIC0yMCwyMSArMjIsMjIgQEAKICBwdWJsaWM6CiAgIENQREZfRGV2aWNlQnVmZmVyKCk7CiAgIH5DUERGX0RldmljZUJ1ZmZlcigpOworCiAgIGJvb2wgSW5pdGlhbGl6ZShDUERGX1JlbmRlckNvbnRleHQqIHBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QqIHBSZWN0LAogICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAogICAgICAgICAgICAgICAgICAgaW50IG1heF9kcGkpOwogICB2b2lkIE91dHB1dFRvRGV2aWNlKCk7Ci0gIENGWF9ESUJpdG1hcCogR2V0Qml0bWFwKCkgY29uc3QgeyByZXR1cm4gbV9wQml0bWFwLmdldCgpOyB9CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IEdldEJpdG1hcCgpIGNvbnN0IHsgcmV0dXJuIG1fcEJpdG1hcDsgfQogICBjb25zdCBDRlhfTWF0cml4KiBHZXRNYXRyaXgoKSBjb25zdCB7IHJldHVybiAmbV9NYXRyaXg7IH0KIAogIHByaXZhdGU6Ci0gIENGWF9SZW5kZXJEZXZpY2UqIG1fcERldmljZTsKLSAgQ1BERl9SZW5kZXJDb250ZXh0KiBtX3BDb250ZXh0OworICBVbm93bmVkUHRyPENGWF9SZW5kZXJEZXZpY2U+IG1fcERldmljZTsKKyAgVW5vd25lZFB0cjxDUERGX1JlbmRlckNvbnRleHQ+IG1fcENvbnRleHQ7CisgIFVub3duZWRQdHI8Y29uc3QgQ1BERl9QYWdlT2JqZWN0PiBtX3BPYmplY3Q7CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IG1fcEJpdG1hcDsKICAgRlhfUkVDVCBtX1JlY3Q7Ci0gIGNvbnN0IENQREZfUGFnZU9iamVjdCogbV9wT2JqZWN0OwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBtX3BCaXRtYXA7CiAgIENGWF9NYXRyaXggbV9NYXRyaXg7CiB9OwogCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfZGlic291cmNlLmNwcCBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9kaWJzb3VyY2UuY3BwCmluZGV4IDMzYThkOTMuLmMxYjk2MDcgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9kaWJzb3VyY2UuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9kaWJzb3VyY2UuY3BwCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9jcGRmX21vZHVsZW1nci5oIgpAQCAtMjAsOCArMjEsMTYgQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9wYWdlcmVuZGVyY2FjaGUuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcmVuZGVyc3RhdHVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19iYXNpY21vZHVsZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfamJpZzJtb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2pwZWdtb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2pweG1vZHVsZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfc2NhbmxpbmVkZWNvZGVyLmgiCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2NqcHhfZGVjb2Rlci5oIgogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9meF9jb2RlYy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X2ZpeGVkYnVmZ3Jvdy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc2FmZV90eXBlcy5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2RpYml0bWFwLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogCiBuYW1lc3BhY2UgewpAQCAtNzgsMTYgKzg3LDE3IEBACiAgIGV4cGxpY2l0IEpweEJpdE1hcENvbnRleHQoQ0NvZGVjX0pweE1vZHVsZSoganB4X21vZHVsZSkKICAgICAgIDoganB4X21vZHVsZV8oanB4X21vZHVsZSksIGRlY29kZXJfKG51bGxwdHIpIHt9CiAKLSAgfkpweEJpdE1hcENvbnRleHQoKSB7IGpweF9tb2R1bGVfLT5EZXN0cm95RGVjb2RlcihkZWNvZGVyXyk7IH0KKyAgfkpweEJpdE1hcENvbnRleHQoKSB7fQogCi0gIC8vIFRha2VzIG93bmVyc2hpcCBvZiB8ZGVjb2RlcnwuCi0gIHZvaWQgc2V0X2RlY29kZXIoQ0pQWF9EZWNvZGVyKiBkZWNvZGVyKSB7IGRlY29kZXJfID0gZGVjb2RlcjsgfQorICB2b2lkIHNldF9kZWNvZGVyKHN0ZDo6dW5pcXVlX3B0cjxDSlBYX0RlY29kZXI+IGRlY29kZXIpIHsKKyAgICBkZWNvZGVyXyA9IHN0ZDo6bW92ZShkZWNvZGVyKTsKKyAgfQogCi0gIENKUFhfRGVjb2RlciogZGVjb2RlcigpIHsgcmV0dXJuIGRlY29kZXJfOyB9CisgIENKUFhfRGVjb2RlciogZGVjb2RlcigpIHsgcmV0dXJuIGRlY29kZXJfLmdldCgpOyB9CiAKICBwcml2YXRlOgogICBDQ29kZWNfSnB4TW9kdWxlKiBjb25zdCBqcHhfbW9kdWxlXzsgIC8vIFdlYWsgcG9pbnRlci4KLSAgQ0pQWF9EZWNvZGVyKiBkZWNvZGVyXzsgICAgICAgICAgICAgICAvLyBEZWNvZGVyLCBvd25lZC4KKyAgc3RkOjp1bmlxdWVfcHRyPENKUFhfRGVjb2Rlcj4gZGVjb2Rlcl87CiAKICAgLy8gRGlzYWxsb3cgZXZpbCBjb25zdHJ1Y3RvcnMKICAgSnB4Qml0TWFwQ29udGV4dChjb25zdCBKcHhCaXRNYXBDb250ZXh0Jik7CkBAIC0xMjYsMTEgKzEzNiwxMiBAQAogQ1BERl9ESUJTb3VyY2U6On5DUERGX0RJQlNvdXJjZSgpIHsKICAgRlhfRnJlZShtX3BNYXNrZWRMaW5lKTsKICAgRlhfRnJlZShtX3BMaW5lQnVmKTsKLSAgbV9wQ2FjaGVkQml0bWFwLnJlc2V0KCk7CisgIG1fcENhY2hlZEJpdG1hcC5SZXNldCgpOyAgLy8gVE9ETyh0c2VwZXopOiBkZXRlcm1pbmUgaWYgcmVxdWlyZWQgZWFybHkgaGVyZS4KICAgRlhfRnJlZShtX3BDb21wRGF0YSk7Ci0gIENQREZfQ29sb3JTcGFjZSogcENTID0gbV9wQ29sb3JTcGFjZTsKLSAgaWYgKHBDUyAmJiBtX3BEb2N1bWVudCkgewotICAgIG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlQ29sb3JTcGFjZShwQ1MtPkdldEFycmF5KCkpOworICBpZiAobV9wQ29sb3JTcGFjZSAmJiBtX3BEb2N1bWVudCkgeworICAgIGF1dG8qIHBQYWdlRGF0YSA9IG1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpOworICAgIGlmIChwUGFnZURhdGEpCisgICAgICBwUGFnZURhdGEtPlJlbGVhc2VDb2xvclNwYWNlKG1fcENvbG9yU3BhY2UtPkdldEFycmF5KCkpOwogICB9CiB9CiAKQEAgLTE2Myw4ICsxNzQsOCBAQAogICBpZiAoIXNyY19zaXplLklzVmFsaWQoKSkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgbV9wU3RyZWFtQWNjID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU3RyZWFtQWNjPigpOwotICBtX3BTdHJlYW1BY2MtPkxvYWRBbGxEYXRhKHBTdHJlYW0sIGZhbHNlLCBzcmNfc2l6ZS5WYWx1ZU9yRGllKCksIHRydWUpOworICBtX3BTdHJlYW1BY2MgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERl9TdHJlYW1BY2M+KHBTdHJlYW0pOworICBtX3BTdHJlYW1BY2MtPkxvYWRBbGxEYXRhKGZhbHNlLCBzcmNfc2l6ZS5WYWx1ZU9yRGllKCksIHRydWUpOwogICBpZiAobV9wU3RyZWFtQWNjLT5HZXRTaXplKCkgPT0gMCB8fCAhbV9wU3RyZWFtQWNjLT5HZXREYXRhKCkpCiAgICAgcmV0dXJuIGZhbHNlOwogCkBAIC0yMDIsNyArMjEzLDcgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLWludCBDUERGX0RJQlNvdXJjZTo6Q29udGludWVUb0xvYWRNYXNrKCkgeworYm9vbCBDUERGX0RJQlNvdXJjZTo6Q29udGludWVUb0xvYWRNYXNrKCkgewogICBpZiAobV9iSW1hZ2VNYXNrKSB7CiAgICAgbV9icHAgPSAxOwogICAgIG1fYnBjID0gMTsKQEAgLTIxNiwxMiArMjI3LDEyIEBACiAgICAgbV9icHAgPSAyNDsKICAgfQogICBpZiAoIW1fYnBjIHx8ICFtX25Db21wb25lbnRzKSB7Ci0gICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIEZYX1NBRkVfVUlOVDMyIHBpdGNoID0gQ2FsY3VsYXRlUGl0Y2gzMihtX2JwcCwgbV9XaWR0aCk7Ci0gIGlmICghcGl0Y2guSXNWYWxpZCgpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KKyAgaWYgKCFwaXRjaC5Jc1ZhbGlkKCkpCisgICAgcmV0dXJuIGZhbHNlOworCiAgIG1fcExpbmVCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBwaXRjaC5WYWx1ZU9yRGllKCkpOwogICBpZiAobV9wQ29sb3JTcGFjZSAmJiBtX2JTdGRDUykgewogICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24odHJ1ZSk7CkBAIC0yMzEsMTMgKzI0MiwxMiBAQAogICAgIG1fYnBwID0gMzI7CiAgICAgbV9BbHBoYUZsYWcgPSAyOwogICAgIHBpdGNoID0gQ2FsY3VsYXRlUGl0Y2gzMihtX2JwcCwgbV9XaWR0aCk7Ci0gICAgaWYgKCFwaXRjaC5Jc1ZhbGlkKCkpIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKyAgICBpZiAoIXBpdGNoLklzVmFsaWQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKICAgICBtX3BNYXNrZWRMaW5lID0gRlhfQWxsb2ModWludDhfdCwgcGl0Y2guVmFsdWVPckRpZSgpKTsKICAgfQogICBtX1BpdGNoID0gcGl0Y2guVmFsdWVPckRpZSgpOwotICByZXR1cm4gMTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKIGludCBDUERGX0RJQlNvdXJjZTo6U3RhcnRMb2FkRElCU291cmNlKENQREZfRG9jdW1lbnQqIHBEb2MsCkBAIC0yNDgsOSArMjU4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0ZENTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgR3JvdXBGYW1pbHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJMb2FkTWFzaykgewotICBpZiAoIXBTdHJlYW0pIHsKKyAgaWYgKCFwU3RyZWFtKQogICAgIHJldHVybiAwOwotICB9CisKICAgbV9wRG9jdW1lbnQgPSBwRG9jOwogICBtX3BEaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOwogICBtX3BTdHJlYW0gPSBwU3RyZWFtOwpAQCAtMjY4LDExOCArMjc4LDg4IEBACiAgICAgICAgICAgICAgICAgICAgICBwUGFnZVJlc291cmNlcykpIHsKICAgICByZXR1cm4gMDsKICAgfQotICBpZiAobV9iRG9CcGNDaGVjayAmJiAobV9icGMgPT0gMCB8fCBtX25Db21wb25lbnRzID09IDApKSB7CisgIGlmIChtX2JEb0JwY0NoZWNrICYmIChtX2JwYyA9PSAwIHx8IG1fbkNvbXBvbmVudHMgPT0gMCkpCiAgICAgcmV0dXJuIDA7Ci0gIH0KKwogICBGWF9TQUZFX1VJTlQzMiBzcmNfc2l6ZSA9CiAgICAgICBDYWxjdWxhdGVQaXRjaDgobV9icGMsIG1fbkNvbXBvbmVudHMsIG1fV2lkdGgpICogbV9IZWlnaHQ7Ci0gIGlmICghc3JjX3NpemUuSXNWYWxpZCgpKSB7CisgIGlmICghc3JjX3NpemUuSXNWYWxpZCgpKQogICAgIHJldHVybiAwOwotICB9Ci0gIG1fcFN0cmVhbUFjYyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmVhbUFjYz4oKTsKLSAgbV9wU3RyZWFtQWNjLT5Mb2FkQWxsRGF0YShwU3RyZWFtLCBmYWxzZSwgc3JjX3NpemUuVmFsdWVPckRpZSgpLCB0cnVlKTsKLSAgaWYgKG1fcFN0cmVhbUFjYy0+R2V0U2l6ZSgpID09IDAgfHwgIW1fcFN0cmVhbUFjYy0+R2V0RGF0YSgpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaW50IHJldCA9IENyZWF0ZURlY29kZXIoKTsKLSAgaWYgKCFyZXQpCi0gICAgcmV0dXJuIHJldDsKIAotICBpZiAocmV0ICE9IDEpIHsKLSAgICBpZiAoIUNvbnRpbnVlVG9Mb2FkTWFzaygpKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKG1fYkhhc01hc2spIHsKLSAgICAgIFN0cmF0TG9hZE1hc2soKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotICBpZiAoIUNvbnRpbnVlVG9Mb2FkTWFzaygpKSB7CisgIG1fcFN0cmVhbUFjYyA9IHBkZml1bTo6TWFrZVJldGFpbjxDUERGX1N0cmVhbUFjYz4ocFN0cmVhbSk7CisgIG1fcFN0cmVhbUFjYy0+TG9hZEFsbERhdGEoZmFsc2UsIHNyY19zaXplLlZhbHVlT3JEaWUoKSwgdHJ1ZSk7CisgIGlmIChtX3BTdHJlYW1BY2MtPkdldFNpemUoKSA9PSAwIHx8ICFtX3BTdHJlYW1BY2MtPkdldERhdGEoKSkKICAgICByZXR1cm4gMDsKLSAgfQotICBpZiAobV9iSGFzTWFzaykgewotICAgIHJldCA9IFN0cmF0TG9hZE1hc2soKTsKLSAgfQotICBpZiAocmV0ID09IDIpIHsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0gIGlmIChtX3BDb2xvclNwYWNlICYmIG1fYlN0ZENTKSB7CisKKyAgaW50IGlDcmVhdGVkRGVjb2RlciA9IENyZWF0ZURlY29kZXIoKTsKKyAgaWYgKCFpQ3JlYXRlZERlY29kZXIpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCFDb250aW51ZVRvTG9hZE1hc2soKSkKKyAgICByZXR1cm4gMDsKKworICBpbnQgaUxvYWRlZE1hc2sgPSBtX2JIYXNNYXNrID8gU3RhcnRMb2FkTWFzaygpIDogMTsKKyAgaWYgKGlDcmVhdGVkRGVjb2RlciA9PSAyIHx8IGlMb2FkZWRNYXNrID09IDIpCisgICAgcmV0dXJuIDI7CisKKyAgQVNTRVJUKGlDcmVhdGVkRGVjb2RlciA9PSAxKTsKKyAgQVNTRVJUKGlMb2FkZWRNYXNrID09IDEpOworICBpZiAobV9wQ29sb3JTcGFjZSAmJiBtX2JTdGRDUykKICAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKGZhbHNlKTsKLSAgfQotICByZXR1cm4gcmV0OworICByZXR1cm4gMTsKIH0KIAotaW50IENQREZfRElCU291cmNlOjpDb250aW51ZUxvYWRESUJTb3VyY2UoSUZYX1BhdXNlKiBwUGF1c2UpIHsKLSAgRlhDT0RFQ19TVEFUVVMgcmV0OwotICBpZiAobV9TdGF0dXMgPT0gMSkgewotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBkZWNvZGVyID0gbV9wU3RyZWFtQWNjLT5HZXRJbWFnZURlY29kZXIoKTsKLSAgICBpZiAoZGVjb2RlciA9PSAiSlBYRGVjb2RlIikgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIENDb2RlY19KYmlnMk1vZHVsZSogcEpiaWcyTW9kdWxlID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKYmlnMk1vZHVsZSgpOwotICAgIGlmICghbV9wSmJpZzJDb250ZXh0KSB7Ci0gICAgICBtX3BKYmlnMkNvbnRleHQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0NvZGVjX0piaWcyQ29udGV4dD4oKTsKLSAgICAgIGlmIChtX3BTdHJlYW1BY2MtPkdldEltYWdlUGFyYW0oKSkgewotICAgICAgICBDUERGX1N0cmVhbSogcEdsb2JhbHMgPQotICAgICAgICAgICAgbV9wU3RyZWFtQWNjLT5HZXRJbWFnZVBhcmFtKCktPkdldFN0cmVhbUZvcigiSkJJRzJHbG9iYWxzIik7Ci0gICAgICAgIGlmIChwR2xvYmFscykgewotICAgICAgICAgIG1fcEdsb2JhbFN0cmVhbSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmVhbUFjYz4oKTsKLSAgICAgICAgICBtX3BHbG9iYWxTdHJlYW0tPkxvYWRBbGxEYXRhKHBHbG9iYWxzLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldCA9IHBKYmlnMk1vZHVsZS0+U3RhcnREZWNvZGUoCi0gICAgICAgICAgbV9wSmJpZzJDb250ZXh0LmdldCgpLCBtX3BEb2N1bWVudC0+Q29kZWNDb250ZXh0KCksIG1fV2lkdGgsIG1fSGVpZ2h0LAotICAgICAgICAgIG1fcFN0cmVhbUFjYy5nZXQoKSwgbV9wR2xvYmFsU3RyZWFtLmdldCgpLAotICAgICAgICAgIG1fcENhY2hlZEJpdG1hcC0+R2V0QnVmZmVyKCksIG1fcENhY2hlZEJpdG1hcC0+R2V0UGl0Y2goKSwgcFBhdXNlKTsKLSAgICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIG1fcENhY2hlZEJpdG1hcC5yZXNldCgpOwotICAgICAgICBtX3BHbG9iYWxTdHJlYW0ucmVzZXQoKTsKLSAgICAgICAgbV9wSmJpZzJDb250ZXh0LnJlc2V0KCk7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgICAgaWYgKHJldCA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7Ci0gICAgICAgIHJldHVybiAyOwotICAgICAgfQotICAgICAgaW50IHJldDEgPSAxOwotICAgICAgaWYgKG1fYkhhc01hc2spIHsKLSAgICAgICAgcmV0MSA9IENvbnRpbnVlTG9hZE1hc2tESUIocFBhdXNlKTsKLSAgICAgICAgbV9TdGF0dXMgPSAyOwotICAgICAgfQotICAgICAgaWYgKHJldDEgPT0gMikgewotICAgICAgICByZXR1cm4gcmV0MTsKLSAgICAgIH0KLSAgICAgIGlmIChtX3BDb2xvclNwYWNlICYmIG1fYlN0ZENTKSB7Ci0gICAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oZmFsc2UpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJldDE7Ci0gICAgfQotICAgIHJldCA9IHBKYmlnMk1vZHVsZS0+Q29udGludWVEZWNvZGUobV9wSmJpZzJDb250ZXh0LmdldCgpLCBwUGF1c2UpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICBtX3BDYWNoZWRCaXRtYXAucmVzZXQoKTsKLSAgICAgIG1fcEdsb2JhbFN0cmVhbS5yZXNldCgpOwotICAgICAgbV9wSmJpZzJDb250ZXh0LnJlc2V0KCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHJldCA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci0gICAgaW50IHJldDEgPSAxOwotICAgIGlmIChtX2JIYXNNYXNrKSB7Ci0gICAgICByZXQxID0gQ29udGludWVMb2FkTWFza0RJQihwUGF1c2UpOwotICAgICAgbV9TdGF0dXMgPSAyOwotICAgIH0KLSAgICBpZiAocmV0MSA9PSAyKSB7Ci0gICAgICByZXR1cm4gcmV0MTsKLSAgICB9Ci0gICAgaWYgKG1fcENvbG9yU3BhY2UgJiYgbV9iU3RkQ1MpIHsKLSAgICAgIG1fcENvbG9yU3BhY2UtPkVuYWJsZVN0ZENvbnZlcnNpb24oZmFsc2UpOwotICAgIH0KLSAgICByZXR1cm4gcmV0MTsKLSAgfQotICBpZiAobV9TdGF0dXMgPT0gMikgeworaW50IENQREZfRElCU291cmNlOjpDb250aW51ZUxvYWRESUJTb3VyY2UoSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpIHsKKyAgaWYgKG1fU3RhdHVzID09IDIpCiAgICAgcmV0dXJuIENvbnRpbnVlTG9hZE1hc2tESUIocFBhdXNlKTsKKworICBpZiAobV9TdGF0dXMgIT0gMSkKKyAgICByZXR1cm4gMDsKKworICBjb25zdCBCeXRlU3RyaW5nJiBkZWNvZGVyID0gbV9wU3RyZWFtQWNjLT5HZXRJbWFnZURlY29kZXIoKTsKKyAgaWYgKGRlY29kZXIgPT0gIkpQWERlY29kZSIpCisgICAgcmV0dXJuIDA7CisKKyAgRlhDT0RFQ19TVEFUVVMgaURlY29kZVN0YXR1czsKKyAgQ0NvZGVjX0piaWcyTW9kdWxlKiBwSmJpZzJNb2R1bGUgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpiaWcyTW9kdWxlKCk7CisgIGlmICghbV9wSmJpZzJDb250ZXh0KSB7CisgICAgbV9wSmJpZzJDb250ZXh0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENDb2RlY19KYmlnMkNvbnRleHQ+KCk7CisgICAgaWYgKG1fcFN0cmVhbUFjYy0+R2V0SW1hZ2VQYXJhbSgpKSB7CisgICAgICBDUERGX1N0cmVhbSogcEdsb2JhbHMgPQorICAgICAgICAgIG1fcFN0cmVhbUFjYy0+R2V0SW1hZ2VQYXJhbSgpLT5HZXRTdHJlYW1Gb3IoIkpCSUcyR2xvYmFscyIpOworICAgICAgaWYgKHBHbG9iYWxzKSB7CisgICAgICAgIG1fcEdsb2JhbFN0cmVhbSA9IHBkZml1bTo6TWFrZVJldGFpbjxDUERGX1N0cmVhbUFjYz4ocEdsb2JhbHMpOworICAgICAgICBtX3BHbG9iYWxTdHJlYW0tPkxvYWRBbGxEYXRhRmlsdGVyZWQoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaURlY29kZVN0YXR1cyA9IHBKYmlnMk1vZHVsZS0+U3RhcnREZWNvZGUoCisgICAgICAgIG1fcEpiaWcyQ29udGV4dC5nZXQoKSwgbV9wRG9jdW1lbnQtPkNvZGVjQ29udGV4dCgpLCBtX1dpZHRoLCBtX0hlaWdodCwKKyAgICAgICAgbV9wU3RyZWFtQWNjLCBtX3BHbG9iYWxTdHJlYW0sIG1fcENhY2hlZEJpdG1hcC0+R2V0QnVmZmVyKCksCisgICAgICAgIG1fcENhY2hlZEJpdG1hcC0+R2V0UGl0Y2goKSwgcFBhdXNlKTsKKyAgfSBlbHNlIHsKKyAgICBpRGVjb2RlU3RhdHVzID0gcEpiaWcyTW9kdWxlLT5Db250aW51ZURlY29kZShtX3BKYmlnMkNvbnRleHQuZ2V0KCksIHBQYXVzZSk7CiAgIH0KLSAgcmV0dXJuIDA7CisKKyAgaWYgKGlEZWNvZGVTdGF0dXMgPCAwKSB7CisgICAgbV9wQ2FjaGVkQml0bWFwLlJlc2V0KCk7CisgICAgbV9wR2xvYmFsU3RyZWFtLlJlc2V0KCk7CisgICAgbV9wSmJpZzJDb250ZXh0LnJlc2V0KCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGlEZWNvZGVTdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkKKyAgICByZXR1cm4gMjsKKworICBpbnQgaUNvbnRpbnVlU3RhdHVzID0gMTsKKyAgaWYgKG1fYkhhc01hc2spIHsKKyAgICBpQ29udGludWVTdGF0dXMgPSBDb250aW51ZUxvYWRNYXNrRElCKHBQYXVzZSk7CisgICAgbV9TdGF0dXMgPSAyOworICB9CisgIGlmIChpQ29udGludWVTdGF0dXMgPT0gMikKKyAgICByZXR1cm4gMjsKKworICBpZiAobV9wQ29sb3JTcGFjZSAmJiBtX2JTdGRDUykKKyAgICBtX3BDb2xvclNwYWNlLT5FbmFibGVTdGRDb252ZXJzaW9uKGZhbHNlKTsKKyAgcmV0dXJuIGlDb250aW51ZVN0YXR1czsKIH0KIAogYm9vbCBDUERGX0RJQlNvdXJjZTo6TG9hZENvbG9ySW5mbyhjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2VzLApAQCAtMzkyLDcgKzM3Miw3IEBACiAgICAgaWYgKCFtX2JJbWFnZU1hc2spIHsKICAgICAgIENQREZfT2JqZWN0KiBwRmlsdGVyID0gbV9wRGljdC0+R2V0RGlyZWN0T2JqZWN0Rm9yKCJGaWx0ZXIiKTsKICAgICAgIGlmIChwRmlsdGVyKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGZpbHRlcjsKKyAgICAgICAgQnl0ZVN0cmluZyBmaWx0ZXI7CiAgICAgICAgIGlmIChwRmlsdGVyLT5Jc05hbWUoKSkgewogICAgICAgICAgIGZpbHRlciA9IHBGaWx0ZXItPkdldFN0cmluZygpOwogICAgICAgICB9IGVsc2UgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IHBGaWx0ZXItPkFzQXJyYXkoKSkgewpAQCAtNDI3LDc4ICs0MDcsNzUgQEAKICAgbV9GYW1pbHkgPSBtX3BDb2xvclNwYWNlLT5HZXRGYW1pbHkoKTsKICAgbV9uQ29tcG9uZW50cyA9IG1fcENvbG9yU3BhY2UtPkNvdW50Q29tcG9uZW50cygpOwogICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfSUNDQkFTRUQgJiYgcENTT2JqLT5Jc05hbWUoKSkgewotICAgIENGWF9CeXRlU3RyaW5nIGNzID0gcENTT2JqLT5HZXRTdHJpbmcoKTsKLSAgICBpZiAoY3MgPT0gIkRldmljZUdyYXkiKSB7CisgICAgQnl0ZVN0cmluZyBjcyA9IHBDU09iai0+R2V0U3RyaW5nKCk7CisgICAgaWYgKGNzID09ICJEZXZpY2VHcmF5IikKICAgICAgIG1fbkNvbXBvbmVudHMgPSAxOwotICAgIH0gZWxzZSBpZiAoY3MgPT0gIkRldmljZVJHQiIpIHsKKyAgICBlbHNlIGlmIChjcyA9PSAiRGV2aWNlUkdCIikKICAgICAgIG1fbkNvbXBvbmVudHMgPSAzOwotICAgIH0gZWxzZSBpZiAoY3MgPT0gIkRldmljZUNNWUsiKSB7CisgICAgZWxzZSBpZiAoY3MgPT0gIkRldmljZUNNWUsiKQogICAgICAgbV9uQ29tcG9uZW50cyA9IDQ7Ci0gICAgfQogICB9CiAgIFZhbGlkYXRlRGljdFBhcmFtKCk7Ci0gIG1fcENvbXBEYXRhID0gR2V0RGVjb2RlQW5kTWFza0FycmF5KG1fYkRlZmF1bHREZWNvZGUsIG1fYkNvbG9yS2V5KTsKKyAgbV9wQ29tcERhdGEgPSBHZXREZWNvZGVBbmRNYXNrQXJyYXkoJm1fYkRlZmF1bHREZWNvZGUsICZtX2JDb2xvcktleSk7CiAgIHJldHVybiAhIW1fcENvbXBEYXRhOwogfQogCi1ESUJfQ09NUF9EQVRBKiBDUERGX0RJQlNvdXJjZTo6R2V0RGVjb2RlQW5kTWFza0FycmF5KGJvb2wmIGJEZWZhdWx0RGVjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiQ29sb3JLZXkpIHsKLSAgaWYgKCFtX3BDb2xvclNwYWNlKSB7CitESUJfQ09NUF9EQVRBKiBDUERGX0RJQlNvdXJjZTo6R2V0RGVjb2RlQW5kTWFza0FycmF5KGJvb2wqIGJEZWZhdWx0RGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBiQ29sb3JLZXkpIHsKKyAgaWYgKCFtX3BDb2xvclNwYWNlKQogICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIERJQl9DT01QX0RBVEEqIHBDb21wRGF0YSA9IEZYX0FsbG9jKERJQl9DT01QX0RBVEEsIG1fbkNvbXBvbmVudHMpOworCisgIERJQl9DT01QX0RBVEEqIGNvbnN0IHBDb21wRGF0YSA9IEZYX0FsbG9jKERJQl9DT01QX0RBVEEsIG1fbkNvbXBvbmVudHMpOwogICBpbnQgbWF4X2RhdGEgPSAoMSA8PCBtX2JwYykgLSAxOwogICBDUERGX0FycmF5KiBwRGVjb2RlID0gbV9wRGljdC0+R2V0QXJyYXlGb3IoIkRlY29kZSIpOwogICBpZiAocERlY29kZSkgewogICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX25Db21wb25lbnRzOyBpKyspIHsKICAgICAgIHBDb21wRGF0YVtpXS5tX0RlY29kZU1pbiA9IHBEZWNvZGUtPkdldE51bWJlckF0KGkgKiAyKTsKLSAgICAgIEZYX0ZMT0FUIG1heCA9IHBEZWNvZGUtPkdldE51bWJlckF0KGkgKiAyICsgMSk7CisgICAgICBmbG9hdCBtYXggPSBwRGVjb2RlLT5HZXROdW1iZXJBdChpICogMiArIDEpOwogICAgICAgcENvbXBEYXRhW2ldLm1fRGVjb2RlU3RlcCA9IChtYXggLSBwQ29tcERhdGFbaV0ubV9EZWNvZGVNaW4pIC8gbWF4X2RhdGE7Ci0gICAgICBGWF9GTE9BVCBkZWZfdmFsdWU7Ci0gICAgICBGWF9GTE9BVCBkZWZfbWluOwotICAgICAgRlhfRkxPQVQgZGVmX21heDsKLSAgICAgIG1fcENvbG9yU3BhY2UtPkdldERlZmF1bHRWYWx1ZShpLCBkZWZfdmFsdWUsIGRlZl9taW4sIGRlZl9tYXgpOwotICAgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0lOREVYRUQpIHsKKyAgICAgIGZsb2F0IGRlZl92YWx1ZTsKKyAgICAgIGZsb2F0IGRlZl9taW47CisgICAgICBmbG9hdCBkZWZfbWF4OworICAgICAgbV9wQ29sb3JTcGFjZS0+R2V0RGVmYXVsdFZhbHVlKGksICZkZWZfdmFsdWUsICZkZWZfbWluLCAmZGVmX21heCk7CisgICAgICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfSU5ERVhFRCkKICAgICAgICAgZGVmX21heCA9IG1heF9kYXRhOwotICAgICAgfQotICAgICAgaWYgKGRlZl9taW4gIT0gcENvbXBEYXRhW2ldLm1fRGVjb2RlTWluIHx8IGRlZl9tYXggIT0gbWF4KSB7Ci0gICAgICAgIGJEZWZhdWx0RGVjb2RlID0gZmFsc2U7Ci0gICAgICB9CisgICAgICBpZiAoZGVmX21pbiAhPSBwQ29tcERhdGFbaV0ubV9EZWNvZGVNaW4gfHwgZGVmX21heCAhPSBtYXgpCisgICAgICAgICpiRGVmYXVsdERlY29kZSA9IGZhbHNlOwogICAgIH0KICAgfSBlbHNlIHsKICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9uQ29tcG9uZW50czsgaSsrKSB7Ci0gICAgICBGWF9GTE9BVCBkZWZfdmFsdWU7Ci0gICAgICBtX3BDb2xvclNwYWNlLT5HZXREZWZhdWx0VmFsdWUoaSwgZGVmX3ZhbHVlLCBwQ29tcERhdGFbaV0ubV9EZWNvZGVNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbXBEYXRhW2ldLm1fRGVjb2RlU3RlcCk7Ci0gICAgICBpZiAobV9GYW1pbHkgPT0gUERGQ1NfSU5ERVhFRCkgeworICAgICAgZmxvYXQgZGVmX3ZhbHVlOworICAgICAgbV9wQ29sb3JTcGFjZS0+R2V0RGVmYXVsdFZhbHVlKGksICZkZWZfdmFsdWUsICZwQ29tcERhdGFbaV0ubV9EZWNvZGVNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDb21wRGF0YVtpXS5tX0RlY29kZVN0ZXApOworICAgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0lOREVYRUQpCiAgICAgICAgIHBDb21wRGF0YVtpXS5tX0RlY29kZVN0ZXAgPSBtYXhfZGF0YTsKLSAgICAgIH0KICAgICAgIHBDb21wRGF0YVtpXS5tX0RlY29kZVN0ZXAgPQogICAgICAgICAgIChwQ29tcERhdGFbaV0ubV9EZWNvZGVTdGVwIC0gcENvbXBEYXRhW2ldLm1fRGVjb2RlTWluKSAvIG1heF9kYXRhOwogICAgIH0KICAgfQotICBpZiAoIW1fcERpY3QtPktleUV4aXN0KCJTTWFzayIpKSB7Ci0gICAgQ1BERl9PYmplY3QqIHBNYXNrID0gbV9wRGljdC0+R2V0RGlyZWN0T2JqZWN0Rm9yKCJNYXNrIik7Ci0gICAgaWYgKCFwTWFzaykgewotICAgICAgcmV0dXJuIHBDb21wRGF0YTsKLSAgICB9Ci0gICAgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IHBNYXNrLT5Bc0FycmF5KCkpIHsKLSAgICAgIGlmIChwQXJyYXktPkdldENvdW50KCkgPj0gbV9uQ29tcG9uZW50cyAqIDIpIHsKLSAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fbkNvbXBvbmVudHM7IGkrKykgewotICAgICAgICAgIGludCBtaW5fbnVtID0gcEFycmF5LT5HZXRJbnRlZ2VyQXQoaSAqIDIpOwotICAgICAgICAgIGludCBtYXhfbnVtID0gcEFycmF5LT5HZXRJbnRlZ2VyQXQoaSAqIDIgKyAxKTsKLSAgICAgICAgICBwQ29tcERhdGFbaV0ubV9Db2xvcktleU1pbiA9IHN0ZDo6bWF4KG1pbl9udW0sIDApOwotICAgICAgICAgIHBDb21wRGF0YVtpXS5tX0NvbG9yS2V5TWF4ID0gc3RkOjptaW4obWF4X251bSwgbWF4X2RhdGEpOwotICAgICAgICB9CisgIGlmIChtX3BEaWN0LT5LZXlFeGlzdCgiU01hc2siKSkKKyAgICByZXR1cm4gcENvbXBEYXRhOworCisgIENQREZfT2JqZWN0KiBwTWFzayA9IG1fcERpY3QtPkdldERpcmVjdE9iamVjdEZvcigiTWFzayIpOworICBpZiAoIXBNYXNrKQorICAgIHJldHVybiBwQ29tcERhdGE7CisKKyAgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IHBNYXNrLT5Bc0FycmF5KCkpIHsKKyAgICBpZiAocEFycmF5LT5HZXRDb3VudCgpID49IG1fbkNvbXBvbmVudHMgKiAyKSB7CisgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9uQ29tcG9uZW50czsgaSsrKSB7CisgICAgICAgIGludCBtaW5fbnVtID0gcEFycmF5LT5HZXRJbnRlZ2VyQXQoaSAqIDIpOworICAgICAgICBpbnQgbWF4X251bSA9IHBBcnJheS0+R2V0SW50ZWdlckF0KGkgKiAyICsgMSk7CisgICAgICAgIHBDb21wRGF0YVtpXS5tX0NvbG9yS2V5TWluID0gc3RkOjptYXgobWluX251bSwgMCk7CisgICAgICAgIHBDb21wRGF0YVtpXS5tX0NvbG9yS2V5TWF4ID0gc3RkOjptaW4obWF4X251bSwgbWF4X2RhdGEpOwogICAgICAgfQotICAgICAgYkNvbG9yS2V5ID0gdHJ1ZTsKICAgICB9CisgICAgKmJDb2xvcktleSA9IHRydWU7CiAgIH0KICAgcmV0dXJuIHBDb21wRGF0YTsKIH0KIAogaW50IENQREZfRElCU291cmNlOjpDcmVhdGVEZWNvZGVyKCkgewotICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgZGVjb2RlciA9IG1fcFN0cmVhbUFjYy0+R2V0SW1hZ2VEZWNvZGVyKCk7CisgIGNvbnN0IEJ5dGVTdHJpbmcmIGRlY29kZXIgPSBtX3BTdHJlYW1BY2MtPkdldEltYWdlRGVjb2RlcigpOwogICBpZiAoZGVjb2Rlci5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuIDE7CiAKQEAgLTUxMCwxMCArNDg3LDEwIEBACiAgICAgcmV0dXJuIG1fcENhY2hlZEJpdG1hcCA/IDEgOiAwOwogICB9CiAgIGlmIChkZWNvZGVyID09ICJKQklHMkRlY29kZSIpIHsKLSAgICBtX3BDYWNoZWRCaXRtYXAgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0RJQml0bWFwPigpOworICAgIG1fcENhY2hlZEJpdG1hcCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfRElCaXRtYXA+KCk7CiAgICAgaWYgKCFtX3BDYWNoZWRCaXRtYXAtPkNyZWF0ZSgKICAgICAgICAgICAgIG1fV2lkdGgsIG1fSGVpZ2h0LCBtX2JJbWFnZU1hc2sgPyBGWERJQl8xYnBwTWFzayA6IEZYRElCXzFicHBSZ2IpKSB7Ci0gICAgICBtX3BDYWNoZWRCaXRtYXAucmVzZXQoKTsKKyAgICAgIG1fcENhY2hlZEJpdG1hcC5SZXNldCgpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIG1fU3RhdHVzID0gMTsKQEAgLTUzMCw3MCArNTA3LDEyIEBACiAgICAgbV9wRGVjb2RlciA9IEZQREZBUElfQ3JlYXRlRmxhdGVEZWNvZGVyKAogICAgICAgICBzcmNfZGF0YSwgc3JjX3NpemUsIG1fV2lkdGgsIG1fSGVpZ2h0LCBtX25Db21wb25lbnRzLCBtX2JwYywgcFBhcmFtcyk7CiAgIH0gZWxzZSBpZiAoZGVjb2RlciA9PSAiUnVuTGVuZ3RoRGVjb2RlIikgewotICAgIG1fcERlY29kZXIgPSBDUERGX01vZHVsZU1ncjo6R2V0KCkKLSAgICAgICAgICAgICAgICAgICAgIC0+R2V0Q29kZWNNb2R1bGUoKQotICAgICAgICAgICAgICAgICAgICAgLT5HZXRCYXNpY01vZHVsZSgpCi0gICAgICAgICAgICAgICAgICAgICAtPkNyZWF0ZVJ1bkxlbmd0aERlY29kZXIoc3JjX2RhdGEsIHNyY19zaXplLCBtX1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fSGVpZ2h0LCBtX25Db21wb25lbnRzLCBtX2JwYyk7CisgICAgQ0NvZGVjX01vZHVsZU1nciogcEVuY29kZXJzID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpOworICAgIG1fcERlY29kZXIgPSBwRW5jb2RlcnMtPkdldEJhc2ljTW9kdWxlKCktPkNyZWF0ZVJ1bkxlbmd0aERlY29kZXIoCisgICAgICAgIHNyY19kYXRhLCBzcmNfc2l6ZSwgbV9XaWR0aCwgbV9IZWlnaHQsIG1fbkNvbXBvbmVudHMsIG1fYnBjKTsKICAgfSBlbHNlIGlmIChkZWNvZGVyID09ICJEQ1REZWNvZGUiKSB7Ci0gICAgbV9wRGVjb2RlciA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnBlZ01vZHVsZSgpLT5DcmVhdGVEZWNvZGVyKAotICAgICAgICBzcmNfZGF0YSwgc3JjX3NpemUsIG1fV2lkdGgsIG1fSGVpZ2h0LCBtX25Db21wb25lbnRzLAotICAgICAgICAhcFBhcmFtcyB8fCBwUGFyYW1zLT5HZXRJbnRlZ2VyRm9yKCJDb2xvclRyYW5zZm9ybSIsIDEpKTsKLSAgICBpZiAoIW1fcERlY29kZXIpIHsKLSAgICAgIGJvb2wgYlRyYW5zZm9ybSA9IGZhbHNlOwotICAgICAgaW50IGNvbXBzOwotICAgICAgaW50IGJwYzsKLSAgICAgIENDb2RlY19KcGVnTW9kdWxlKiBwSnBlZ01vZHVsZSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnBlZ01vZHVsZSgpOwotICAgICAgaWYgKHBKcGVnTW9kdWxlLT5Mb2FkSW5mbyhzcmNfZGF0YSwgc3JjX3NpemUsICZtX1dpZHRoLCAmbV9IZWlnaHQsICZjb21wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJwYywgJmJUcmFuc2Zvcm0pKSB7Ci0gICAgICAgIGlmIChtX25Db21wb25lbnRzICE9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb21wcykpIHsKLSAgICAgICAgICBGWF9GcmVlKG1fcENvbXBEYXRhKTsKLSAgICAgICAgICBtX3BDb21wRGF0YSA9IG51bGxwdHI7Ci0gICAgICAgICAgbV9uQ29tcG9uZW50cyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb21wcyk7Ci0gICAgICAgICAgaWYgKG1fcENvbG9yU3BhY2UpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobV9GYW1pbHkpIHsKLSAgICAgICAgICAgICAgY2FzZSBQREZDU19ERVZJQ0VHUkFZOgotICAgICAgICAgICAgICBjYXNlIFBERkNTX0RFVklDRVJHQjoKLSAgICAgICAgICAgICAgY2FzZSBQREZDU19ERVZJQ0VDTVlLOiB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgZHdNaW5Db21wcyA9IENvbXBvbmVudHNGb3JGYW1pbHkobV9GYW1pbHkpOwotICAgICAgICAgICAgICAgIGlmIChtX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSA8IGR3TWluQ29tcHMgfHwKLSAgICAgICAgICAgICAgICAgICAgbV9uQ29tcG9uZW50cyA8IGR3TWluQ29tcHMpIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjYXNlIFBERkNTX0xBQjogewotICAgICAgICAgICAgICAgIGlmIChtX25Db21wb25lbnRzICE9IDMgfHwgbV9wQ29sb3JTcGFjZS0+Q291bnRDb21wb25lbnRzKCkgPCAzKQotICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY2FzZSBQREZDU19JQ0NCQVNFRDogewotICAgICAgICAgICAgICAgIGlmICghSXNBbGxvd2VkSUNDQ29tcG9uZW50cyhtX25Db21wb25lbnRzKSB8fAotICAgICAgICAgICAgICAgICAgICAhSXNBbGxvd2VkSUNDQ29tcG9uZW50cyhtX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgbV9wQ29sb3JTcGFjZS0+Q291bnRDb21wb25lbnRzKCkgPCBtX25Db21wb25lbnRzKSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIGlmIChtX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSAhPSBtX25Db21wb25lbnRzKQotICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0xBQiAmJiBtX25Db21wb25lbnRzICE9IDMpCi0gICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgIH0KLSAgICAgICAgICBtX3BDb21wRGF0YSA9IEdldERlY29kZUFuZE1hc2tBcnJheShtX2JEZWZhdWx0RGVjb2RlLCBtX2JDb2xvcktleSk7Ci0gICAgICAgICAgaWYgKCFtX3BDb21wRGF0YSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIG1fYnBjID0gYnBjOwotICAgICAgICBtX3BEZWNvZGVyID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRKcGVnTW9kdWxlKCktPkNyZWF0ZURlY29kZXIoCi0gICAgICAgICAgICBzcmNfZGF0YSwgc3JjX3NpemUsIG1fV2lkdGgsIG1fSGVpZ2h0LCBtX25Db21wb25lbnRzLCBiVHJhbnNmb3JtKTsKLSAgICAgIH0KLSAgICB9CisgICAgaWYgKCFDcmVhdGVEQ1REZWNvZGVyKHNyY19kYXRhLCBzcmNfc2l6ZSwgcFBhcmFtcykpCisgICAgICByZXR1cm4gMDsKICAgfQogICBpZiAoIW1fcERlY29kZXIpCiAgICAgcmV0dXJuIDA7CkBAIC02MTEsMTIgKzUzMCw4MiBAQAogICByZXR1cm4gMTsKIH0KIAorYm9vbCBDUERGX0RJQlNvdXJjZTo6Q3JlYXRlRENURGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhcmFtcykgeworICBDQ29kZWNfSnBlZ01vZHVsZSogcEpwZWdNb2R1bGUgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldEpwZWdNb2R1bGUoKTsKKyAgbV9wRGVjb2RlciA9IHBKcGVnTW9kdWxlLT5DcmVhdGVEZWNvZGVyKAorICAgICAgc3JjX2RhdGEsIHNyY19zaXplLCBtX1dpZHRoLCBtX0hlaWdodCwgbV9uQ29tcG9uZW50cywKKyAgICAgICFwUGFyYW1zIHx8IHBQYXJhbXMtPkdldEludGVnZXJGb3IoIkNvbG9yVHJhbnNmb3JtIiwgMSkpOworICBpZiAobV9wRGVjb2RlcikKKyAgICByZXR1cm4gdHJ1ZTsKKworICBib29sIGJUcmFuc2Zvcm0gPSBmYWxzZTsKKyAgaW50IGNvbXBzOworICBpbnQgYnBjOworICBpZiAoIXBKcGVnTW9kdWxlLT5Mb2FkSW5mbyhzcmNfZGF0YSwgc3JjX3NpemUsICZtX1dpZHRoLCAmbV9IZWlnaHQsICZjb21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJwYywgJmJUcmFuc2Zvcm0pKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKG1fbkNvbXBvbmVudHMgPT0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbXBzKSkgeworICAgIG1fYnBjID0gYnBjOworICAgIG1fcERlY29kZXIgPSBwSnBlZ01vZHVsZS0+Q3JlYXRlRGVjb2RlcigKKyAgICAgICAgc3JjX2RhdGEsIHNyY19zaXplLCBtX1dpZHRoLCBtX0hlaWdodCwgbV9uQ29tcG9uZW50cywgYlRyYW5zZm9ybSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBtX25Db21wb25lbnRzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbXBzKTsKKyAgRlhfRnJlZShtX3BDb21wRGF0YSk7CisgIG1fcENvbXBEYXRhID0gbnVsbHB0cjsKKyAgaWYgKG1fcENvbG9yU3BhY2UpIHsKKyAgICBzd2l0Y2ggKG1fRmFtaWx5KSB7CisgICAgICBjYXNlIFBERkNTX0RFVklDRUdSQVk6CisgICAgICBjYXNlIFBERkNTX0RFVklDRVJHQjoKKyAgICAgIGNhc2UgUERGQ1NfREVWSUNFQ01ZSzogeworICAgICAgICB1aW50MzJfdCBkd01pbkNvbXBzID0gQ29tcG9uZW50c0ZvckZhbWlseShtX0ZhbWlseSk7CisgICAgICAgIGlmIChtX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSA8IGR3TWluQ29tcHMgfHwKKyAgICAgICAgICAgIG1fbkNvbXBvbmVudHMgPCBkd01pbkNvbXBzKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBQREZDU19MQUI6IHsKKyAgICAgICAgaWYgKG1fbkNvbXBvbmVudHMgIT0gMyB8fCBtX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSA8IDMpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgUERGQ1NfSUNDQkFTRUQ6IHsKKyAgICAgICAgaWYgKCFJc0FsbG93ZWRJQ0NDb21wb25lbnRzKG1fbkNvbXBvbmVudHMpIHx8CisgICAgICAgICAgICAhSXNBbGxvd2VkSUNDQ29tcG9uZW50cyhtX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSkgfHwKKyAgICAgICAgICAgIG1fcENvbG9yU3BhY2UtPkNvdW50Q29tcG9uZW50cygpIDwgbV9uQ29tcG9uZW50cykgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgaWYgKG1fcENvbG9yU3BhY2UtPkNvdW50Q29tcG9uZW50cygpICE9IG1fbkNvbXBvbmVudHMpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0xBQiAmJiBtX25Db21wb25lbnRzICE9IDMpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbV9wQ29tcERhdGEgPSBHZXREZWNvZGVBbmRNYXNrQXJyYXkoJm1fYkRlZmF1bHREZWNvZGUsICZtX2JDb2xvcktleSk7CisgIGlmICghbV9wQ29tcERhdGEpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG1fYnBjID0gYnBjOworICBtX3BEZWNvZGVyID0gcEpwZWdNb2R1bGUtPkNyZWF0ZURlY29kZXIoc3JjX2RhdGEsIHNyY19zaXplLCBtX1dpZHRoLCBtX0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbkNvbXBvbmVudHMsIGJUcmFuc2Zvcm0pOworICByZXR1cm4gdHJ1ZTsKK30KKwogdm9pZCBDUERGX0RJQlNvdXJjZTo6TG9hZEpweEJpdG1hcCgpIHsKICAgQ0NvZGVjX0pweE1vZHVsZSogcEpweE1vZHVsZSA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0SnB4TW9kdWxlKCk7Ci0gIGlmICghcEpweE1vZHVsZSkKLSAgICByZXR1cm47Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPEpweEJpdE1hcENvbnRleHQ+IGNvbnRleHQobmV3IEpweEJpdE1hcENvbnRleHQocEpweE1vZHVsZSkpOworICBhdXRvIGNvbnRleHQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8SnB4Qml0TWFwQ29udGV4dD4ocEpweE1vZHVsZSk7CiAgIGNvbnRleHQtPnNldF9kZWNvZGVyKHBKcHhNb2R1bGUtPkNyZWF0ZURlY29kZXIoCiAgICAgICBtX3BTdHJlYW1BY2MtPkdldERhdGEoKSwgbV9wU3RyZWFtQWNjLT5HZXRTaXplKCksIG1fcENvbG9yU3BhY2UpKTsKICAgaWYgKCFjb250ZXh0LT5kZWNvZGVyKCkpCkBAIC02NTksOSArNjQ4LDkgQEAKICAgICBmb3JtYXQgPSBGWERJQl9SZ2I7CiAgIH0KIAotICBtX3BDYWNoZWRCaXRtYXAgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0RJQml0bWFwPigpOworICBtX3BDYWNoZWRCaXRtYXAgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOwogICBpZiAoIW1fcENhY2hlZEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCkpIHsKLSAgICBtX3BDYWNoZWRCaXRtYXAucmVzZXQoKTsKKyAgICBtX3BDYWNoZWRCaXRtYXAuUmVzZXQoKTsKICAgICByZXR1cm47CiAgIH0KICAgbV9wQ2FjaGVkQml0bWFwLT5DbGVhcigweEZGRkZGRkZGKTsKQEAgLTY3NCw3ICs2NjMsNyBAQAogICB9CiAgIGlmICghcEpweE1vZHVsZS0+RGVjb2RlKGNvbnRleHQtPmRlY29kZXIoKSwgbV9wQ2FjaGVkQml0bWFwLT5HZXRCdWZmZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQ2FjaGVkQml0bWFwLT5HZXRQaXRjaCgpLCBvdXRwdXRfb2Zmc2V0cykpIHsKLSAgICBtX3BDYWNoZWRCaXRtYXAucmVzZXQoKTsKKyAgICBtX3BDYWNoZWRCaXRtYXAuUmVzZXQoKTsKICAgICByZXR1cm47CiAgIH0KICAgaWYgKG1fcENvbG9yU3BhY2UgJiYgbV9wQ29sb3JTcGFjZS0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfSU5ERVhFRCAmJgpAQCAtNjkyLDE5ICs2ODEsMTkgQEAKICAgbV9icGMgPSA4OwogfQogCi1pbnQgQ1BERl9ESUJTb3VyY2U6OlN0cmF0TG9hZE1hc2soKSB7CitpbnQgQ1BERl9ESUJTb3VyY2U6OlN0YXJ0TG9hZE1hc2soKSB7CiAgIG1fTWF0dGVDb2xvciA9IDBYRkZGRkZGRkY7CiAgIG1fcE1hc2tTdHJlYW0gPSBtX3BEaWN0LT5HZXRTdHJlYW1Gb3IoIlNNYXNrIik7CiAgIGlmIChtX3BNYXNrU3RyZWFtKSB7CiAgICAgQ1BERl9BcnJheSogcE1hdHRlID0gbV9wTWFza1N0cmVhbS0+R2V0RGljdCgpLT5HZXRBcnJheUZvcigiTWF0dGUiKTsKICAgICBpZiAocE1hdHRlICYmIG1fcENvbG9yU3BhY2UgJiYKICAgICAgICAgbV9wQ29sb3JTcGFjZS0+Q291bnRDb21wb25lbnRzKCkgPD0gbV9uQ29tcG9uZW50cykgewotICAgICAgRlhfRkxPQVQgUiwgRywgQjsKLSAgICAgIHN0ZDo6dmVjdG9yPEZYX0ZMT0FUPiBjb2xvcnMobV9uQ29tcG9uZW50cyk7Ci0gICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9uQ29tcG9uZW50czsgaSsrKSB7CisgICAgICBmbG9hdCBSLCBHLCBCOworICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGNvbG9ycyhtX25Db21wb25lbnRzKTsKKyAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtX25Db21wb25lbnRzOyBpKyspCiAgICAgICAgIGNvbG9yc1tpXSA9IHBNYXR0ZS0+R2V0RmxvYXRBdChpKTsKLSAgICAgIH0KLSAgICAgIG1fcENvbG9yU3BhY2UtPkdldFJHQihjb2xvcnMuZGF0YSgpLCBSLCBHLCBCKTsKKworICAgICAgbV9wQ29sb3JTcGFjZS0+R2V0UkdCKGNvbG9ycy5kYXRhKCksICZSLCAmRywgJkIpOwogICAgICAgbV9NYXR0ZUNvbG9yID0gRlhBUkdCX01BS0UoMCwgRlhTWVNfcm91bmQoUiAqIDI1NSksIEZYU1lTX3JvdW5kKEcgKiAyNTUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoQiAqIDI1NSkpOwogICAgIH0KQEAgLTcxNSw0MyArNzA0LDM5IEBACiAgIHJldHVybiBtX3BNYXNrU3RyZWFtID8gU3RhcnRMb2FkTWFza0RJQigpIDogMTsKIH0KIAotaW50IENQREZfRElCU291cmNlOjpDb250aW51ZUxvYWRNYXNrRElCKElGWF9QYXVzZSogcFBhdXNlKSB7Ci0gIGlmICghbV9wTWFzaykgeworaW50IENQREZfRElCU291cmNlOjpDb250aW51ZUxvYWRNYXNrRElCKElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKSB7CisgIGlmICghbV9wTWFzaykKICAgICByZXR1cm4gMTsKLSAgfQorCiAgIGludCByZXQgPSBtX3BNYXNrLT5Db250aW51ZUxvYWRESUJTb3VyY2UocFBhdXNlKTsKLSAgaWYgKHJldCA9PSAyKSB7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotICBpZiAobV9wQ29sb3JTcGFjZSAmJiBtX2JTdGRDUykgeworICBpZiAocmV0ID09IDIpCisgICAgcmV0dXJuIDI7CisKKyAgaWYgKG1fcENvbG9yU3BhY2UgJiYgbV9iU3RkQ1MpCiAgICAgbV9wQ29sb3JTcGFjZS0+RW5hYmxlU3RkQ29udmVyc2lvbihmYWxzZSk7Ci0gIH0KKwogICBpZiAoIXJldCkgewotICAgIGRlbGV0ZSBtX3BNYXNrOwotICAgIG1fcE1hc2sgPSBudWxscHRyOwotICAgIHJldHVybiByZXQ7CisgICAgbV9wTWFzay5SZXNldCgpOworICAgIHJldHVybiAwOwogICB9CiAgIHJldHVybiAxOwogfQogCi1DUERGX0RJQlNvdXJjZSogQ1BERl9ESUJTb3VyY2U6OkRldGFjaE1hc2soKSB7Ci0gIENQREZfRElCU291cmNlKiBwRElCU291cmNlID0gbV9wTWFzazsKLSAgbV9wTWFzayA9IG51bGxwdHI7Ci0gIHJldHVybiBwRElCU291cmNlOworUmV0YWluUHRyPENQREZfRElCU291cmNlPiBDUERGX0RJQlNvdXJjZTo6RGV0YWNoTWFzaygpIHsKKyAgcmV0dXJuIHN0ZDo6bW92ZShtX3BNYXNrKTsKIH0KIAogaW50IENQREZfRElCU291cmNlOjpTdGFydExvYWRNYXNrRElCKCkgewotICBtX3BNYXNrID0gbmV3IENQREZfRElCU291cmNlOwotICBpbnQgcmV0ID0gbV9wTWFzay0+U3RhcnRMb2FkRElCU291cmNlKG1fcERvY3VtZW50LCBtX3BNYXNrU3RyZWFtLCBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBudWxscHRyLCB0cnVlKTsKKyAgbV9wTWFzayA9IHBkZml1bTo6TWFrZVJldGFpbjxDUERGX0RJQlNvdXJjZT4oKTsKKyAgaW50IHJldCA9IG1fcE1hc2stPlN0YXJ0TG9hZERJQlNvdXJjZShtX3BEb2N1bWVudC5HZXQoKSwgbV9wTWFza1N0cmVhbS5HZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgbnVsbHB0ciwgbnVsbHB0ciwgdHJ1ZSk7CiAgIGlmIChyZXQgPT0gMikgewogICAgIGlmIChtX1N0YXR1cyA9PSAwKQogICAgICAgbV9TdGF0dXMgPSAyOwogICAgIHJldHVybiAyOwogICB9CiAgIGlmICghcmV0KSB7Ci0gICAgZGVsZXRlIG1fcE1hc2s7Ci0gICAgbV9wTWFzayA9IG51bGxwdHI7CisgICAgbV9wTWFzay5SZXNldCgpOwogICAgIHJldHVybiAxOwogICB9CiAgIHJldHVybiAxOwpAQCAtNzc1LDE3ICs3NjAsMTcgQEAKICAgICBpZiAobV9wQ29sb3JTcGFjZS0+Q291bnRDb21wb25lbnRzKCkgPiAzKSB7CiAgICAgICByZXR1cm47CiAgICAgfQotICAgIEZYX0ZMT0FUIGNvbG9yX3ZhbHVlc1szXTsKKyAgICBmbG9hdCBjb2xvcl92YWx1ZXNbM107CiAgICAgY29sb3JfdmFsdWVzWzBdID0gbV9wQ29tcERhdGFbMF0ubV9EZWNvZGVNaW47CiAgICAgY29sb3JfdmFsdWVzWzFdID0gY29sb3JfdmFsdWVzWzJdID0gY29sb3JfdmFsdWVzWzBdOwotICAgIEZYX0ZMT0FUIFIgPSAwLjBmLCBHID0gMC4wZiwgQiA9IDAuMGY7Ci0gICAgbV9wQ29sb3JTcGFjZS0+R2V0UkdCKGNvbG9yX3ZhbHVlcywgUiwgRywgQik7CisgICAgZmxvYXQgUiA9IDAuMGYsIEcgPSAwLjBmLCBCID0gMC4wZjsKKyAgICBtX3BDb2xvclNwYWNlLT5HZXRSR0IoY29sb3JfdmFsdWVzLCAmUiwgJkcsICZCKTsKICAgICBGWF9BUkdCIGFyZ2IwID0gQXJnYkVuY29kZSgyNTUsIEZYU1lTX3JvdW5kKFIgKiAyNTUpLCBGWFNZU19yb3VuZChHICogMjU1KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChCICogMjU1KSk7CiAgICAgY29sb3JfdmFsdWVzWzBdICs9IG1fcENvbXBEYXRhWzBdLm1fRGVjb2RlU3RlcDsKICAgICBjb2xvcl92YWx1ZXNbMV0gKz0gbV9wQ29tcERhdGFbMF0ubV9EZWNvZGVTdGVwOwogICAgIGNvbG9yX3ZhbHVlc1syXSArPSBtX3BDb21wRGF0YVswXS5tX0RlY29kZVN0ZXA7Ci0gICAgbV9wQ29sb3JTcGFjZS0+R2V0UkdCKGNvbG9yX3ZhbHVlcywgUiwgRywgQik7CisgICAgbV9wQ29sb3JTcGFjZS0+R2V0UkdCKGNvbG9yX3ZhbHVlcywgJlIsICZHLCAmQik7CiAgICAgRlhfQVJHQiBhcmdiMSA9IEFyZ2JFbmNvZGUoMjU1LCBGWFNZU19yb3VuZChSICogMjU1KSwgRlhTWVNfcm91bmQoRyAqIDI1NSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoQiAqIDI1NSkpOwogICAgIGlmIChhcmdiMCAhPSAweEZGMDAwMDAwIHx8IGFyZ2IxICE9IDB4RkZGRkZGRkYpIHsKQEAgLTc5OCw4ICs3ODMsOCBAQAogICAgICAgbV9icGMgPT0gOCAmJiBtX2JEZWZhdWx0RGVjb2RlKSB7CiAgIH0gZWxzZSB7CiAgICAgaW50IHBhbGV0dGVfY291bnQgPSAxIDw8IChtX2JwYyAqIG1fbkNvbXBvbmVudHMpOwotICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiBjb2xvcl92YWx1ZXMobV9uQ29tcG9uZW50cyk7Ci0gICAgRlhfRkxPQVQqIGNvbG9yX3ZhbHVlID0gY29sb3JfdmFsdWVzOworICAgIENGWF9GaXhlZEJ1Zkdyb3c8ZmxvYXQsIDE2PiBjb2xvcl92YWx1ZXMobV9uQ29tcG9uZW50cyk7CisgICAgZmxvYXQqIGNvbG9yX3ZhbHVlID0gY29sb3JfdmFsdWVzOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsZXR0ZV9jb3VudDsgaSsrKSB7CiAgICAgICBpbnQgY29sb3JfZGF0YSA9IGk7CiAgICAgICBmb3IgKHVpbnQzMl90IGogPSAwOyBqIDwgbV9uQ29tcG9uZW50czsgaisrKSB7CkBAIC04MDgsMTcgKzc5MywxNyBAQAogICAgICAgICBjb2xvcl92YWx1ZVtqXSA9IG1fcENvbXBEYXRhW2pdLm1fRGVjb2RlTWluICsKICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDb21wRGF0YVtqXS5tX0RlY29kZVN0ZXAgKiBlbmNvZGVkX2NvbXBvbmVudDsKICAgICAgIH0KLSAgICAgIEZYX0ZMT0FUIFIgPSAwLCBHID0gMCwgQiA9IDA7CisgICAgICBmbG9hdCBSID0gMCwgRyA9IDAsIEIgPSAwOwogICAgICAgaWYgKG1fbkNvbXBvbmVudHMgPT0gMSAmJiBtX0ZhbWlseSA9PSBQREZDU19JQ0NCQVNFRCAmJgogICAgICAgICAgIG1fcENvbG9yU3BhY2UtPkNvdW50Q29tcG9uZW50cygpID4gMSkgewogICAgICAgICBpbnQgbkNvbXBvbmVudHMgPSBtX3BDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8RlhfRkxPQVQ+IHRlbXBfYnVmKG5Db21wb25lbnRzKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHRlbXBfYnVmKG5Db21wb25lbnRzKTsKICAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCBuQ29tcG9uZW50czsgaysrKSB7CiAgICAgICAgICAgdGVtcF9idWZba10gPSAqY29sb3JfdmFsdWU7CiAgICAgICAgIH0KLSAgICAgICAgbV9wQ29sb3JTcGFjZS0+R2V0UkdCKHRlbXBfYnVmLmRhdGEoKSwgUiwgRywgQik7CisgICAgICAgIG1fcENvbG9yU3BhY2UtPkdldFJHQih0ZW1wX2J1Zi5kYXRhKCksICZSLCAmRywgJkIpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgbV9wQ29sb3JTcGFjZS0+R2V0UkdCKGNvbG9yX3ZhbHVlLCBSLCBHLCBCKTsKKyAgICAgICAgbV9wQ29sb3JTcGFjZS0+R2V0UkdCKGNvbG9yX3ZhbHVlLCAmUiwgJkcsICZCKTsKICAgICAgIH0KICAgICAgIFNldFBhbGV0dGVBcmdiKGksIEFyZ2JFbmNvZGUoMjU1LCBGWFNZU19yb3VuZChSICogMjU1KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoRyAqIDI1NSksIEZYU1lTX3JvdW5kKEIgKiAyNTUpKSk7CkBAIC04MzEsNyArODE2LDcgQEAKICAgQ1BERl9PYmplY3QqIHBGaWx0ZXIgPSBtX3BEaWN0LT5HZXREaXJlY3RPYmplY3RGb3IoIkZpbHRlciIpOwogICBpZiAocEZpbHRlcikgewogICAgIGlmIChwRmlsdGVyLT5Jc05hbWUoKSkgewotICAgICAgQ0ZYX0J5dGVTdHJpbmcgZmlsdGVyID0gcEZpbHRlci0+R2V0U3RyaW5nKCk7CisgICAgICBCeXRlU3RyaW5nIGZpbHRlciA9IHBGaWx0ZXItPkdldFN0cmluZygpOwogICAgICAgaWYgKGZpbHRlciA9PSAiQ0NJVFRGYXhEZWNvZGUiIHx8IGZpbHRlciA9PSAiSkJJRzJEZWNvZGUiKSB7CiAgICAgICAgIG1fYnBjID0gMTsKICAgICAgICAgbV9uQ29tcG9uZW50cyA9IDE7CkBAIC04NDMsNyArODI4LDcgQEAKICAgICAgICAgbV9icGMgPSA4OwogICAgICAgfQogICAgIH0gZWxzZSBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcEZpbHRlci0+QXNBcnJheSgpKSB7Ci0gICAgICBDRlhfQnl0ZVN0cmluZyBmaWx0ZXIgPSBwQXJyYXktPkdldFN0cmluZ0F0KHBBcnJheS0+R2V0Q291bnQoKSAtIDEpOworICAgICAgQnl0ZVN0cmluZyBmaWx0ZXIgPSBwQXJyYXktPkdldFN0cmluZ0F0KHBBcnJheS0+R2V0Q291bnQoKSAtIDEpOwogICAgICAgaWYgKGZpbHRlciA9PSAiQ0NJVFRGYXhEZWNvZGUiIHx8IGZpbHRlciA9PSAiSkJJRzJEZWNvZGUiKSB7CiAgICAgICAgIG1fYnBjID0gMTsKICAgICAgICAgbV9uQ29tcG9uZW50cyA9IDE7CkBAIC04NjEsOSArODQ2LDkgQEAKIAogdm9pZCBDUERGX0RJQlNvdXJjZTo6VHJhbnNsYXRlU2NhbmxpbmUyNGJwcCh1aW50OF90KiBkZXN0X3NjYW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuKSBjb25zdCB7Ci0gIGlmIChtX2JwYyA9PSAwKSB7CisgIGlmIChtX2JwYyA9PSAwKQogICAgIHJldHVybjsKLSAgfQorCiAgIHVuc2lnbmVkIGludCBtYXhfZGF0YSA9ICgxIDw8IG1fYnBjKSAtIDE7CiAgIGlmIChtX2JEZWZhdWx0RGVjb2RlKSB7CiAgICAgaWYgKG1fRmFtaWx5ID09IFBERkNTX0RFVklDRVJHQiB8fCBtX0ZhbWlseSA9PSBQREZDU19DQUxSR0IpIHsKQEAgLTg3MiwxNCArODU3LDYgQEAKIAogICAgICAgY29uc3QgdWludDhfdCogc3JjX3BvcyA9IHNyY19zY2FuOwogICAgICAgc3dpdGNoIChtX2JwYykgewotICAgICAgICBjYXNlIDE2OgotICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcG9zWzRdOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3Bvc1syXTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfcG9zOwotICAgICAgICAgICAgc3JjX3BvcyArPSA2OwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSA4OgogICAgICAgICAgIGZvciAoaW50IGNvbHVtbiA9IDA7IGNvbHVtbiA8IG1fV2lkdGg7IGNvbHVtbisrKSB7CiAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcG9zWzJdOwpAQCAtODg4LDYgKzg2NSwxNCBAQAogICAgICAgICAgICAgc3JjX3BvcyArPSAzOwogICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgeworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3Bvc1s0XTsKKyAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19wb3NbMl07CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3BvczsKKyAgICAgICAgICAgIHNyY19wb3MgKz0gNjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgdWludDY0X3Qgc3JjX2JpdF9wb3MgPSAwOwogICAgICAgICAgIHNpemVfdCBkZXN0X2J5dGVfcG9zID0gMDsKQEAgLTkxNyw5ICs5MDIsMTIgQEAKICAgICAgIHJldHVybjsKICAgICB9CiAgIH0KLSAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IGNvbG9yX3ZhbHVlczEobV9uQ29tcG9uZW50cyk7Ci0gIEZYX0ZMT0FUKiBjb2xvcl92YWx1ZXMgPSBjb2xvcl92YWx1ZXMxOwotICBGWF9GTE9BVCBSID0gMC4wZiwgRyA9IDAuMGYsIEIgPSAwLjBmOworCisgIENGWF9GaXhlZEJ1Zkdyb3c8ZmxvYXQsIDE2PiBjb2xvcl92YWx1ZXMxKG1fbkNvbXBvbmVudHMpOworICBmbG9hdCogY29sb3JfdmFsdWVzID0gY29sb3JfdmFsdWVzMTsKKyAgZmxvYXQgUiA9IDAuMGY7CisgIGZsb2F0IEcgPSAwLjBmOworICBmbG9hdCBCID0gMC4wZjsKICAgaWYgKG1fYnBjID09IDgpIHsKICAgICB1aW50NjRfdCBzcmNfYnl0ZV9wb3MgPSAwOwogICAgIHNpemVfdCBkZXN0X2J5dGVfcG9zID0gMDsKQEAgLTkzMCwxMiArOTE4LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDb21wRGF0YVtjb2xvcl0ubV9EZWNvZGVTdGVwICogZGF0YTsKICAgICAgIH0KICAgICAgIGlmIChUcmFuc01hc2soKSkgewotICAgICAgICBGWF9GTE9BVCBrID0gMS4wZiAtIGNvbG9yX3ZhbHVlc1szXTsKKyAgICAgICAgZmxvYXQgayA9IDEuMGYgLSBjb2xvcl92YWx1ZXNbM107CiAgICAgICAgIFIgPSAoMS4wZiAtIGNvbG9yX3ZhbHVlc1swXSkgKiBrOwogICAgICAgICBHID0gKDEuMGYgLSBjb2xvcl92YWx1ZXNbMV0pICogazsKICAgICAgICAgQiA9ICgxLjBmIC0gY29sb3JfdmFsdWVzWzJdKSAqIGs7CiAgICAgICB9IGVsc2UgewotICAgICAgICBtX3BDb2xvclNwYWNlLT5HZXRSR0IoY29sb3JfdmFsdWVzLCBSLCBHLCBCKTsKKyAgICAgICAgbV9wQ29sb3JTcGFjZS0+R2V0UkdCKGNvbG9yX3ZhbHVlcywgJlIsICZHLCAmQik7CiAgICAgICB9CiAgICAgICBSID0gQ2xhbXBWYWx1ZShSLCAxLjBmKTsKICAgICAgIEcgPSBDbGFtcFZhbHVlKEcsIDEuMGYpOwpAQCAtOTU2LDEyICs5NDQsMTIgQEAKICAgICAgICAgc3JjX2JpdF9wb3MgKz0gbV9icGM7CiAgICAgICB9CiAgICAgICBpZiAoVHJhbnNNYXNrKCkpIHsKLSAgICAgICAgRlhfRkxPQVQgayA9IDEuMGYgLSBjb2xvcl92YWx1ZXNbM107CisgICAgICAgIGZsb2F0IGsgPSAxLjBmIC0gY29sb3JfdmFsdWVzWzNdOwogICAgICAgICBSID0gKDEuMGYgLSBjb2xvcl92YWx1ZXNbMF0pICogazsKICAgICAgICAgRyA9ICgxLjBmIC0gY29sb3JfdmFsdWVzWzFdKSAqIGs7CiAgICAgICAgIEIgPSAoMS4wZiAtIGNvbG9yX3ZhbHVlc1syXSkgKiBrOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgbV9wQ29sb3JTcGFjZS0+R2V0UkdCKGNvbG9yX3ZhbHVlcywgUiwgRywgQik7CisgICAgICAgIG1fcENvbG9yU3BhY2UtPkdldFJHQihjb2xvcl92YWx1ZXMsICZSLCAmRywgJkIpOwogICAgICAgfQogICAgICAgUiA9IENsYW1wVmFsdWUoUiwgMS4wZik7CiAgICAgICBHID0gQ2xhbXBWYWx1ZShHLCAxLjBmKTsKQEAgLTEwMDEsNyArOTg5LDcgQEAKICAgfQogICBpZiAoIXBTcmNMaW5lKSB7CiAgICAgdWludDhfdCogcExpbmVCdWYgPSBtX3BNYXNrZWRMaW5lID8gbV9wTWFza2VkTGluZSA6IG1fcExpbmVCdWY7Ci0gICAgRlhTWVNfbWVtc2V0KHBMaW5lQnVmLCAweEZGLCBtX1BpdGNoKTsKKyAgICBtZW1zZXQocExpbmVCdWYsIDB4RkYsIG1fUGl0Y2gpOwogICAgIHJldHVybiBwTGluZUJ1ZjsKICAgfQogICBpZiAobV9icGMgKiBtX25Db21wb25lbnRzID09IDEpIHsKQEAgLTEwMzIsMTMgKzEwMjAsMTMgQEAKICAgICAgIH0KICAgICAgIHJldHVybiBtX3BNYXNrZWRMaW5lOwogICAgIH0gZWxzZSB7Ci0gICAgICBGWFNZU19tZW1jcHkobV9wTGluZUJ1ZiwgcFNyY0xpbmUsIHNyY19waXRjaF92YWx1ZSk7CisgICAgICBtZW1jcHkobV9wTGluZUJ1ZiwgcFNyY0xpbmUsIHNyY19waXRjaF92YWx1ZSk7CiAgICAgfQogICAgIHJldHVybiBtX3BMaW5lQnVmOwogICB9CiAgIGlmIChtX2JwYyAqIG1fbkNvbXBvbmVudHMgPD0gOCkgewogICAgIGlmIChtX2JwYyA9PSA4KSB7Ci0gICAgICBGWFNZU19tZW1jcHkobV9wTGluZUJ1ZiwgcFNyY0xpbmUsIHNyY19waXRjaF92YWx1ZSk7CisgICAgICBtZW1jcHkobV9wTGluZUJ1ZiwgcFNyY0xpbmUsIHNyY19waXRjaF92YWx1ZSk7CiAgICAgfSBlbHNlIHsKICAgICAgIHVpbnQ2NF90IHNyY19iaXRfcG9zID0gMDsKICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CkBAIC0xMDUxLDI5ICsxMDM5LDI5IEBACiAgICAgICAgIG1fcExpbmVCdWZbY29sXSA9IGNvbG9yX2luZGV4OwogICAgICAgfQogICAgIH0KLSAgICBpZiAobV9iQ29sb3JLZXkpIHsKLSAgICAgIHVpbnQ4X3QqIHBEZXN0UGl4ZWwgPSBtX3BNYXNrZWRMaW5lOwotICAgICAgY29uc3QgdWludDhfdCogcFNyY1BpeGVsID0gbV9wTGluZUJ1ZjsKLSAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgaW5kZXggPSAqcFNyY1BpeGVsKys7Ci0gICAgICAgIGlmIChtX3BQYWxldHRlKSB7Ci0gICAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IEZYQVJHQl9CKG1fcFBhbGV0dGUuZ2V0KClbaW5kZXhdKTsKLSAgICAgICAgICAqcERlc3RQaXhlbCsrID0gRlhBUkdCX0cobV9wUGFsZXR0ZS5nZXQoKVtpbmRleF0pOwotICAgICAgICAgICpwRGVzdFBpeGVsKysgPSBGWEFSR0JfUihtX3BQYWxldHRlLmdldCgpW2luZGV4XSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IGluZGV4OwotICAgICAgICAgICpwRGVzdFBpeGVsKysgPSBpbmRleDsKLSAgICAgICAgICAqcERlc3RQaXhlbCsrID0gaW5kZXg7Ci0gICAgICAgIH0KLSAgICAgICAgKnBEZXN0UGl4ZWwgPSAoaW5kZXggPCBtX3BDb21wRGF0YVswXS5tX0NvbG9yS2V5TWluIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID4gbV9wQ29tcERhdGFbMF0ubV9Db2xvcktleU1heCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPyAweEZGCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKLSAgICAgICAgcERlc3RQaXhlbCsrOworICAgIGlmICghbV9iQ29sb3JLZXkpCisgICAgICByZXR1cm4gbV9wTGluZUJ1ZjsKKworICAgIHVpbnQ4X3QqIHBEZXN0UGl4ZWwgPSBtX3BNYXNrZWRMaW5lOworICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNQaXhlbCA9IG1fcExpbmVCdWY7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgIHVpbnQ4X3QgaW5kZXggPSAqcFNyY1BpeGVsKys7CisgICAgICBpZiAobV9wUGFsZXR0ZSkgeworICAgICAgICAqcERlc3RQaXhlbCsrID0gRlhBUkdCX0IobV9wUGFsZXR0ZS5nZXQoKVtpbmRleF0pOworICAgICAgICAqcERlc3RQaXhlbCsrID0gRlhBUkdCX0cobV9wUGFsZXR0ZS5nZXQoKVtpbmRleF0pOworICAgICAgICAqcERlc3RQaXhlbCsrID0gRlhBUkdCX1IobV9wUGFsZXR0ZS5nZXQoKVtpbmRleF0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKnBEZXN0UGl4ZWwrKyA9IGluZGV4OworICAgICAgICAqcERlc3RQaXhlbCsrID0gaW5kZXg7CisgICAgICAgICpwRGVzdFBpeGVsKysgPSBpbmRleDsKICAgICAgIH0KLSAgICAgIHJldHVybiBtX3BNYXNrZWRMaW5lOworICAgICAgKnBEZXN0UGl4ZWwgPSAoaW5kZXggPCBtX3BDb21wRGF0YVswXS5tX0NvbG9yS2V5TWluIHx8CisgICAgICAgICAgICAgICAgICAgICBpbmRleCA+IG1fcENvbXBEYXRhWzBdLm1fQ29sb3JLZXlNYXgpCisgICAgICAgICAgICAgICAgICAgICAgICA/IDB4RkYKKyAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgICAgIHBEZXN0UGl4ZWwrKzsKICAgICB9Ci0gICAgcmV0dXJuIG1fcExpbmVCdWY7CisgICAgcmV0dXJuIG1fcE1hc2tlZExpbmU7CiAgIH0KICAgaWYgKG1fYkNvbG9yS2V5KSB7CiAgICAgaWYgKG1fbkNvbXBvbmVudHMgPT0gMyAmJiBtX2JwYyA9PSA4KSB7CkBAIC0xMDkwLDI4ICsxMDc4LDI5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwOwogICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICBGWFNZU19tZW1zZXQobV9wTWFza2VkTGluZSwgMHhGRiwgbV9QaXRjaCk7CisgICAgICBtZW1zZXQobV9wTWFza2VkTGluZSwgMHhGRiwgbV9QaXRjaCk7CiAgICAgfQogICB9CiAgIGlmIChtX3BDb2xvclNwYWNlKSB7CiAgICAgVHJhbnNsYXRlU2NhbmxpbmUyNGJwcChtX3BMaW5lQnVmLCBwU3JjTGluZSk7CiAgICAgcFNyY0xpbmUgPSBtX3BMaW5lQnVmOwogICB9Ci0gIGlmIChtX2JDb2xvcktleSkgewotICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNQaXhlbCA9IHBTcmNMaW5lOwotICAgIHVpbnQ4X3QqIHBEZXN0UGl4ZWwgPSBtX3BNYXNrZWRMaW5lOwotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7Ci0gICAgICAqcERlc3RQaXhlbCsrID0gKnBTcmNQaXhlbCsrOwotICAgICAgKnBEZXN0UGl4ZWwrKyA9ICpwU3JjUGl4ZWwrKzsKLSAgICAgICpwRGVzdFBpeGVsKysgPSAqcFNyY1BpeGVsKys7Ci0gICAgICBwRGVzdFBpeGVsKys7Ci0gICAgfQotICAgIHJldHVybiBtX3BNYXNrZWRMaW5lOworICBpZiAoIW1fYkNvbG9yS2V5KQorICAgIHJldHVybiBwU3JjTGluZTsKKworICBjb25zdCB1aW50OF90KiBwU3JjUGl4ZWwgPSBwU3JjTGluZTsKKyAgdWludDhfdCogcERlc3RQaXhlbCA9IG1fcE1hc2tlZExpbmU7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgKnBEZXN0UGl4ZWwrKyA9ICpwU3JjUGl4ZWwrKzsKKyAgICAqcERlc3RQaXhlbCsrID0gKnBTcmNQaXhlbCsrOworICAgICpwRGVzdFBpeGVsKysgPSAqcFNyY1BpeGVsKys7CisgICAgcERlc3RQaXhlbCsrOwogICB9Ci0gIHJldHVybiBwU3JjTGluZTsKKyAgcmV0dXJuIG1fcE1hc2tlZExpbmU7CiB9CiAKLWJvb2wgQ1BERl9ESUJTb3VyY2U6OlNraXBUb1NjYW5saW5lKGludCBsaW5lLCBJRlhfUGF1c2UqIHBQYXVzZSkgY29uc3QgeworYm9vbCBDUERGX0RJQlNvdXJjZTo6U2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSkgY29uc3QgewogICByZXR1cm4gbV9wRGVjb2RlciAmJiBtX3BEZWNvZGVyLT5Ta2lwVG9TY2FubGluZShsaW5lLCBwUGF1c2UpOwogfQogCkBAIC0xMTUxLDcgKzExNDAsNyBAQAogICBpbnQgb3JpZ19CcHAgPSBtX2JwYyAqIG1fbkNvbXBvbmVudHMgLyA4OwogICBpbnQgZGVzdF9CcHAgPSBkZXN0X2JwcCAvIDg7CiAgIGlmICghcFNyY0xpbmUpIHsKLSAgICBGWFNZU19tZW1zZXQoZGVzdF9zY2FuLCAweEZGLCBkZXN0X0JwcCAqIGNsaXBfd2lkdGgpOworICAgIG1lbXNldChkZXN0X3NjYW4sIDB4RkYsIGRlc3RfQnBwICogY2xpcF93aWR0aCk7CiAgICAgcmV0dXJuOwogICB9CiAKQEAgLTExODMsMTIgKzExNzIsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmxpcFgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3dpZHRoKSBjb25zdCB7Ci0gIHVpbnQzMl90IHNldF9hcmdiID0gKHVpbnQzMl90KS0xOworICB1aW50MzJfdCBzZXRfYXJnYiA9IDB4RkZGRkZGRkY7CiAgIHVpbnQzMl90IHJlc2V0X2FyZ2IgPSAwOwogICBpZiAobV9iSW1hZ2VNYXNrKSB7CiAgICAgaWYgKG1fYkRlZmF1bHREZWNvZGUpIHsKICAgICAgIHNldF9hcmdiID0gMDsKLSAgICAgIHJlc2V0X2FyZ2IgPSAodWludDMyX3QpLTE7CisgICAgICByZXNldF9hcmdiID0gMHhGRkZGRkZGRjsKICAgICB9CiAgIH0gZWxzZSBpZiAobV9iQ29sb3JLZXkpIHsKICAgICByZXNldF9hcmdiID0gbV9wUGFsZXR0ZSA/IG1fcFBhbGV0dGUuZ2V0KClbMF0gOiAweEZGMDAwMDAwOwpAQCAtMTMzMiw3ICsxMzIxLDcgQEAKICAgLy8gaW4gWzAsIHNyY193aWR0aCkuIFNldCB0aGUgaW5pdGlhbCB2YWx1ZSB0byBiZSBhbiBpbnZhbGlkIHNyY194IHZhbHVlLgogICB1aW50MzJfdCBsYXN0X3NyY194ID0gc3JjX3dpZHRoOwogICBGWF9BUkdCIGxhc3RfYXJnYiA9IEZYQVJHQl9NQUtFKDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYpOwotICBGWF9GTE9BVCB1bml0X1RvOEJwYyA9IDI1NS4wZiAvICgoMSA8PCBtX2JwYykgLSAxKTsKKyAgZmxvYXQgdW5pdF9UbzhCcGMgPSAyNTUuMGYgLyAoKDEgPDwgbV9icGMpIC0gMSk7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xpcF93aWR0aDsgaSsrKSB7CiAgICAgaW50IGRlc3RfeCA9IGNsaXBfbGVmdCArIGk7CiAgICAgdWludDMyX3Qgc3JjX3ggPSAoYkZsaXBYID8gKGRlc3Rfd2lkdGggLSBkZXN0X3ggLSAxKSA6IGRlc3RfeCkgKgpAQCAtMTM0NCw3ICsxMzMzLDcgQEAKICAgICBpZiAoc3JjX3ggPT0gbGFzdF9zcmNfeCkgewogICAgICAgYXJnYiA9IGxhc3RfYXJnYjsKICAgICB9IGVsc2UgewotICAgICAgQ0ZYX0ZpeGVkQnVmR3Jvdzx1aW50OF90LCAxMjg+IGV4dHJhY3RlZF9jb21wb25lbnRzKG1fbkNvbXBvbmVudHMpOworICAgICAgQ0ZYX0ZpeGVkQnVmR3Jvdzx1aW50OF90LCAxNj4gZXh0cmFjdGVkX2NvbXBvbmVudHMobV9uQ29tcG9uZW50cyk7CiAgICAgICBjb25zdCB1aW50OF90KiBwU3JjUGl4ZWwgPSBudWxscHRyOwogICAgICAgaWYgKG1fYnBjICUgOCAhPSAwKSB7CiAgICAgICAgIC8vIE5vIG5lZWQgdG8gY2hlY2sgZm9yIDMyLWJpdCBvdmVyZmxvdywgYXMgfHNyY194fCBpcyBib3VuZGVkIGJ5CkBAIC0xMzcxLDI0ICsxMzYwLDIwIEBACiAgICAgICBpZiAobV9wQ29sb3JTcGFjZSkgewogICAgICAgICB1aW50OF90IGNvbG9yWzRdOwogICAgICAgICBjb25zdCBib29sIGJUcmFuc01hc2sgPSBUcmFuc01hc2soKTsKLSAgICAgICAgaWYgKG1fYkRlZmF1bHREZWNvZGUpIHsKLSAgICAgICAgICBtX3BDb2xvclNwYWNlLT5UcmFuc2xhdGVJbWFnZUxpbmUoY29sb3IsIHBTcmNQaXhlbCwgMSwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlRyYW5zTWFzayk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghbV9iRGVmYXVsdERlY29kZSkgewogICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBtX25Db21wb25lbnRzOyArK2opIHsKLSAgICAgICAgICAgIEZYX0ZMT0FUIGNvbXBvbmVudF92YWx1ZSA9Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KGV4dHJhY3RlZF9jb21wb25lbnRzW2pdKTsKKyAgICAgICAgICAgIGZsb2F0IGNvbXBvbmVudF92YWx1ZSA9IHN0YXRpY19jYXN0PGZsb2F0PihwU3JjUGl4ZWxbal0pOwogICAgICAgICAgICAgaW50IGNvbG9yX3ZhbHVlID0gc3RhdGljX2Nhc3Q8aW50PigKICAgICAgICAgICAgICAgICAobV9wQ29tcERhdGFbal0ubV9EZWNvZGVNaW4gKwogICAgICAgICAgICAgICAgICBtX3BDb21wRGF0YVtqXS5tX0RlY29kZVN0ZXAgKiBjb21wb25lbnRfdmFsdWUpICoKICAgICAgICAgICAgICAgICAgICAgMjU1LjBmICsKICAgICAgICAgICAgICAgICAwLjVmKTsKLSAgICAgICAgICAgIGV4dHJhY3RlZF9jb21wb25lbnRzW2pdID0KLSAgICAgICAgICAgICAgICBjb2xvcl92YWx1ZSA+IDI1NSA/IDI1NSA6IChjb2xvcl92YWx1ZSA8IDAgPyAwIDogY29sb3JfdmFsdWUpOworICAgICAgICAgICAgZXh0cmFjdGVkX2NvbXBvbmVudHNbal0gPSBwZGZpdW06OmNsYW1wKGNvbG9yX3ZhbHVlLCAwLCAyNTUpOwogICAgICAgICAgIH0KLSAgICAgICAgICBtX3BDb2xvclNwYWNlLT5UcmFuc2xhdGVJbWFnZUxpbmUoY29sb3IsIGV4dHJhY3RlZF9jb21wb25lbnRzLCAxLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBiVHJhbnNNYXNrKTsKICAgICAgICAgfQorICAgICAgICBjb25zdCB1aW50OF90KiBwU3JjID0KKyAgICAgICAgICAgIG1fYkRlZmF1bHREZWNvZGUgPyBwU3JjUGl4ZWwgOiBleHRyYWN0ZWRfY29tcG9uZW50czsKKyAgICAgICAgbV9wQ29sb3JTcGFjZS0+VHJhbnNsYXRlSW1hZ2VMaW5lKGNvbG9yLCBwU3JjLCAxLCAwLCAwLCBiVHJhbnNNYXNrKTsKICAgICAgICAgYXJnYiA9IEZYQVJHQl9NQUtFKDB4RkYsIGNvbG9yWzJdLCBjb2xvclsxXSwgY29sb3JbMF0pOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgYXJnYiA9IEZYQVJHQl9NQUtFKDB4RkYsIHBTcmNQaXhlbFsyXSwgcFNyY1BpeGVsWzFdLCBwU3JjUGl4ZWxbMF0pOwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX2RpYnNvdXJjZS5oIGIvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX2RpYnNvdXJjZS5oCmluZGV4IGQ1ODIwZDguLmQzZjY1MTUgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9kaWJzb3VyY2UuaAorKysgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfZGlic291cmNlLmgKQEAgLTE4LDggKzE4LDEwIEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX2ltYWdlbG9hZGVyLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3JlbmRlcmNvbnRleHQuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcmVuZGVyb3B0aW9ucy5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZnhnZWRldmljZS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZGVmYXVsdHJlbmRlcmRldmljZS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2RpYnNvdXJjZS5oIgogCiBjbGFzcyBDQ29kZWNfSmJpZzJDb250ZXh0OwogY2xhc3MgQ0NvZGVjX1NjYW5saW5lRGVjb2RlcjsKQEAgLTI5LDggKzMxLDggQEAKIGNsYXNzIENQREZfU3RyZWFtOwogCiB0eXBlZGVmIHN0cnVjdCB7Ci0gIEZYX0ZMT0FUIG1fRGVjb2RlTWluOwotICBGWF9GTE9BVCBtX0RlY29kZVN0ZXA7CisgIGZsb2F0IG1fRGVjb2RlTWluOworICBmbG9hdCBtX0RlY29kZVN0ZXA7CiAgIGludCBtX0NvbG9yS2V5TWluOwogICBpbnQgbV9Db2xvcktleU1heDsKIH0gRElCX0NPTVBfREFUQTsKQEAgLTM5LDEzICs0MSwxNSBAQAogCiBjbGFzcyBDUERGX0RJQlNvdXJjZSA6IHB1YmxpYyBDRlhfRElCU291cmNlIHsKICBwdWJsaWM6Ci0gIENQREZfRElCU291cmNlKCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgorICBmcmllbmQgUmV0YWluUHRyPFQ+IHBkZml1bTo6TWFrZVJldGFpbihBcmdzJiYuLi4gYXJncyk7CisKICAgfkNQREZfRElCU291cmNlKCkgb3ZlcnJpZGU7CiAKICAgYm9vbCBMb2FkKENQREZfRG9jdW1lbnQqIHBEb2MsIGNvbnN0IENQREZfU3RyZWFtKiBwU3RyZWFtKTsKIAogICAvLyBDRlhfRElCU291cmNlCi0gIGJvb2wgU2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpIGNvbnN0IG92ZXJyaWRlOwogICB1aW50OF90KiBHZXRCdWZmZXIoKSBjb25zdCBvdmVycmlkZTsKICAgY29uc3QgdWludDhfdCogR2V0U2NhbmxpbmUoaW50IGxpbmUpIGNvbnN0IG92ZXJyaWRlOwogICB2b2lkIERvd25TYW1wbGVTY2FubGluZShpbnQgbGluZSwKQEAgLTU2LDYgKzYwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfd2lkdGgpIGNvbnN0IG92ZXJyaWRlOwogCisgIGNvbnN0IENQREZfQ29sb3JTcGFjZSogR2V0Q29sb3JTcGFjZSgpIGNvbnN0IHsgcmV0dXJuIG1fcENvbG9yU3BhY2U7IH0KICAgdWludDMyX3QgR2V0TWF0dGVDb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fTWF0dGVDb2xvcjsgfQogCiAgIGludCBTdGFydExvYWRESUJTb3VyY2UoQ1BERl9Eb2N1bWVudCogcERvYywKQEAgLTY2LDIwICs3MSwyNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0ZENTID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgR3JvdXBGYW1pbHkgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkxvYWRNYXNrID0gZmFsc2UpOwotICBpbnQgQ29udGludWVMb2FkRElCU291cmNlKElGWF9QYXVzZSogcFBhdXNlKTsKLSAgaW50IFN0cmF0TG9hZE1hc2soKTsKKyAgaW50IENvbnRpbnVlTG9hZERJQlNvdXJjZShJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CisgIGludCBTdGFydExvYWRNYXNrKCk7CiAgIGludCBTdGFydExvYWRNYXNrRElCKCk7Ci0gIGludCBDb250aW51ZUxvYWRNYXNrRElCKElGWF9QYXVzZSogcFBhdXNlKTsKLSAgaW50IENvbnRpbnVlVG9Mb2FkTWFzaygpOwotICBDUERGX0RJQlNvdXJjZSogRGV0YWNoTWFzaygpOworICBpbnQgQ29udGludWVMb2FkTWFza0RJQihJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CisgIGJvb2wgQ29udGludWVUb0xvYWRNYXNrKCk7CisgIFJldGFpblB0cjxDUERGX0RJQlNvdXJjZT4gRGV0YWNoTWFzaygpOwogCiAgcHJpdmF0ZToKKyAgQ1BERl9ESUJTb3VyY2UoKTsKKwogICBib29sIExvYWRDb2xvckluZm8oY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMpOwotICBESUJfQ09NUF9EQVRBKiBHZXREZWNvZGVBbmRNYXNrQXJyYXkoYm9vbCYgYkRlZmF1bHREZWNvZGUsIGJvb2wmIGJDb2xvcktleSk7CisgIERJQl9DT01QX0RBVEEqIEdldERlY29kZUFuZE1hc2tBcnJheShib29sKiBiRGVmYXVsdERlY29kZSwgYm9vbCogYkNvbG9yS2V5KTsKICAgdm9pZCBMb2FkSnB4Qml0bWFwKCk7CiAgIHZvaWQgTG9hZFBhbGV0dGUoKTsKICAgaW50IENyZWF0ZURlY29kZXIoKTsKKyAgYm9vbCBDcmVhdGVEQ1REZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXMpOwogICB2b2lkIFRyYW5zbGF0ZVNjYW5saW5lMjRicHAodWludDhfdCogZGVzdF9zY2FuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4pIGNvbnN0OwogICB2b2lkIFZhbGlkYXRlRGljdFBhcmFtKCk7CkBAIC0xMTIsMTAgKzEyMiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3dpZHRoKSBjb25zdDsKICAgYm9vbCBUcmFuc01hc2soKSBjb25zdDsKIAotICBDUERGX0RvY3VtZW50KiBtX3BEb2N1bWVudDsKLSAgY29uc3QgQ1BERl9TdHJlYW0qIG1fcFN0cmVhbTsKLSAgc3RkOjp1bmlxdWVfcHRyPENQREZfU3RyZWFtQWNjPiBtX3BTdHJlYW1BY2M7Ci0gIGNvbnN0IENQREZfRGljdGlvbmFyeSogbV9wRGljdDsKKyAgVW5vd25lZFB0cjxDUERGX0RvY3VtZW50PiBtX3BEb2N1bWVudDsKKyAgVW5vd25lZFB0cjxjb25zdCBDUERGX1N0cmVhbT4gbV9wU3RyZWFtOworICBVbm93bmVkUHRyPGNvbnN0IENQREZfRGljdGlvbmFyeT4gbV9wRGljdDsKKyAgUmV0YWluUHRyPENQREZfU3RyZWFtQWNjPiBtX3BTdHJlYW1BY2M7CiAgIENQREZfQ29sb3JTcGFjZSogbV9wQ29sb3JTcGFjZTsKICAgdWludDMyX3QgbV9GYW1pbHk7CiAgIHVpbnQzMl90IG1fYnBjOwpAQCAtMTMzLDEyICsxNDMsMTIgQEAKICAgRElCX0NPTVBfREFUQSogbV9wQ29tcERhdGE7CiAgIHVpbnQ4X3QqIG1fcExpbmVCdWY7CiAgIHVpbnQ4X3QqIG1fcE1hc2tlZExpbmU7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IG1fcENhY2hlZEJpdG1hcDsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gbV9wQ2FjaGVkQml0bWFwOworICBSZXRhaW5QdHI8Q1BERl9ESUJTb3VyY2U+IG1fcE1hc2s7CisgIFJldGFpblB0cjxDUERGX1N0cmVhbUFjYz4gbV9wR2xvYmFsU3RyZWFtOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjX1NjYW5saW5lRGVjb2Rlcj4gbV9wRGVjb2RlcjsKLSAgQ1BERl9ESUJTb3VyY2UqIG1fcE1hc2s7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1N0cmVhbUFjYz4gbV9wR2xvYmFsU3RyZWFtOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjX0piaWcyQ29udGV4dD4gbV9wSmJpZzJDb250ZXh0OwotICBDUERGX1N0cmVhbSogbV9wTWFza1N0cmVhbTsKKyAgVW5vd25lZFB0cjxDUERGX1N0cmVhbT4gbV9wTWFza1N0cmVhbTsKICAgaW50IG1fU3RhdHVzOwogfTsKIApkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX2RpYnRyYW5zZmVyZnVuYy5jcHAgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfZGlidHJhbnNmZXJmdW5jLmNwcAppbmRleCA0MTU3NWZjLi4zYjBlOGIyIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfZGlidHJhbnNmZXJmdW5jLmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfZGlidHJhbnNmZXJmdW5jLmNwcApAQCAtMTIsMTAgKzEyLDExIEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3RyYW5zZmVyZnVuYy5oIgogCiBDUERGX0RJQlRyYW5zZmVyRnVuYzo6Q1BERl9ESUJUcmFuc2ZlckZ1bmMoCi0gICAgY29uc3QgQ1BERl9UcmFuc2ZlckZ1bmMqIHBUcmFuc2ZlckZ1bmMpIHsKLSAgbV9SYW1wUiA9IHBUcmFuc2ZlckZ1bmMtPm1fU2FtcGxlczsKLSAgbV9SYW1wRyA9ICZwVHJhbnNmZXJGdW5jLT5tX1NhbXBsZXNbMjU2XTsKLSAgbV9SYW1wQiA9ICZwVHJhbnNmZXJGdW5jLT5tX1NhbXBsZXNbNTEyXTsKKyAgICBjb25zdCBSZXRhaW5QdHI8Q1BERl9UcmFuc2ZlckZ1bmM+JiBwVHJhbnNmZXJGdW5jKQorICAgIDogbV9wVHJhbnNmZXJGdW5jKHBUcmFuc2ZlckZ1bmMpIHsKKyAgbV9SYW1wUiA9IHBUcmFuc2ZlckZ1bmMtPkdldFNhbXBsZXMoKTsKKyAgbV9SYW1wRyA9ICZwVHJhbnNmZXJGdW5jLT5HZXRTYW1wbGVzKClbMjU2XTsKKyAgbV9SYW1wQiA9ICZwVHJhbnNmZXJGdW5jLT5HZXRTYW1wbGVzKClbNTEyXTsKIH0KIAogQ1BERl9ESUJUcmFuc2ZlckZ1bmM6On5DUERGX0RJQlRyYW5zZmVyRnVuYygpIHt9CkBAIC0yNCw3ICsyNSw3IEBACiAgIGlmIChtX3BTcmMtPklzQWxwaGFNYXNrKCkpCiAgICAgcmV0dXJuIEZYRElCXzhicHBNYXNrOwogCi0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9BUFBMRV8KICAgcmV0dXJuIChtX3BTcmMtPkhhc0FscGhhKCkpID8gRlhESUJfQXJnYiA6IEZYRElCX1JnYjMyOwogI2Vsc2UKICAgcmV0dXJuIChtX3BTcmMtPkhhc0FscGhhKCkpID8gRlhESUJfQXJnYiA6IEZYRElCX1JnYjsKQEAgLTU4LDcgKzU5LDcgQEAKICAgICAgICAgICAoKmRlc3RfYnVmKVtpbmRleCsrXSA9IGcwOwogICAgICAgICAgICgqZGVzdF9idWYpW2luZGV4KytdID0gcjA7CiAgICAgICAgIH0KLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXwogICAgICAgICBpbmRleCsrOwogI2VuZGlmCiAgICAgICB9CkBAIC05Miw3ICs5Myw3IEBACiAgICAgICAgICAgKCpkZXN0X2J1ZilbaW5kZXgrK10gPSBtX1JhbXBSW3NyY19ieXRlXTsKICAgICAgICAgfQogICAgICAgICBzcmNfYnVmKys7Ci0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9BUFBMRV8KICAgICAgICAgaW5kZXgrKzsKICNlbmRpZgogICAgICAgfQpAQCAtMTEwLDcgKzExMSw3IEBACiAgICAgICAgICgqZGVzdF9idWYpW2luZGV4KytdID0gbV9SYW1wQlsqKHNyY19idWYrKyldOwogICAgICAgICAoKmRlc3RfYnVmKVtpbmRleCsrXSA9IG1fUmFtcEdbKihzcmNfYnVmKyspXTsKICAgICAgICAgKCpkZXN0X2J1ZilbaW5kZXgrK10gPSBtX1JhbXBSWyooc3JjX2J1ZisrKV07Ci0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9BUFBMRV8KICAgICAgICAgaW5kZXgrKzsKICNlbmRpZgogICAgICAgfQpAQCAtMTI2LDcgKzEyNyw3IEBACiAgICAgICAgICgqZGVzdF9idWYpW2luZGV4KytdID0gbV9SYW1wUlsqKHNyY19idWYrKyldOwogICAgICAgICBpZiAoIWJTa2lwKSB7CiAgICAgICAgICAgKCpkZXN0X2J1ZilbaW5kZXgrK10gPSAqc3JjX2J1ZjsKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIGluZGV4Kys7CiAjZW5kaWYKQEAgLTE1NCw3ICsxNTUsNyBAQAogICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBSWyooc3JjX2J1ZisrKV07CiAgICAgfQogICB9IGVsc2UgewotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCiAgICAgaWYgKCFtX3BTcmMtPkhhc0FscGhhKCkpIHsKICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzOyBpKyspIHsKICAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBCWyooc3JjX2J1ZisrKV07CkBAIC0xNzEsNyArMTcyLDcgQEAKICAgICAgICAgKmRlc3RfYnVmKysgPSBtX1JhbXBSWyooc3JjX2J1ZisrKV07CiAgICAgICAgICpkZXN0X2J1ZisrID0gKihzcmNfYnVmKyspOwogICAgICAgfQotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCiAgICAgfQogI2VuZGlmCiAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9kaWJ0cmFuc2ZlcmZ1bmMuaCBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9kaWJ0cmFuc2ZlcmZ1bmMuaAppbmRleCBkMjkwYzAwLi4zNGY1YmIxIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfZGlidHJhbnNmZXJmdW5jLmgKKysrIGIvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX2RpYnRyYW5zZmVyZnVuYy5oCkBAIC05LDEzICs5LDE3IEBACiAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfZmlsdGVyZWRkaWIuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCiAKIGNsYXNzIENQREZfVHJhbnNmZXJGdW5jOwogCiBjbGFzcyBDUERGX0RJQlRyYW5zZmVyRnVuYyA6IHB1YmxpYyBDRlhfRmlsdGVyZWRESUIgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1BERl9ESUJUcmFuc2ZlckZ1bmMoY29uc3QgQ1BERl9UcmFuc2ZlckZ1bmMqIHBUcmFuc2ZlckZ1bmMpOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KKyAgZnJpZW5kIFJldGFpblB0cjxUPiBwZGZpdW06Ok1ha2VSZXRhaW4oQXJncyYmLi4uIGFyZ3MpOworCiAgIH5DUERGX0RJQlRyYW5zZmVyRnVuYygpIG92ZXJyaWRlOwogCiAgIC8vIENGWF9GaWx0ZXJlZERJQgpAQCAtMjksNiArMzMsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwKSBjb25zdCBvdmVycmlkZTsKIAogIHByaXZhdGU6CisgIGV4cGxpY2l0IENQREZfRElCVHJhbnNmZXJGdW5jKAorICAgICAgY29uc3QgUmV0YWluUHRyPENQREZfVHJhbnNmZXJGdW5jPiYgcFRyYW5zZmVyRnVuYyk7CisKKyAgUmV0YWluUHRyPENQREZfVHJhbnNmZXJGdW5jPiBtX3BUcmFuc2ZlckZ1bmM7CiAgIGNvbnN0IHVpbnQ4X3QqIG1fUmFtcFI7CiAgIGNvbnN0IHVpbnQ4X3QqIG1fUmFtcEc7CiAgIGNvbnN0IHVpbnQ4X3QqIG1fUmFtcEI7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfZG9jcmVuZGVyZGF0YS5jcHAgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfZG9jcmVuZGVyZGF0YS5jcHAKaW5kZXggMGU2ZjJkMC4uNjQ4MDY4OCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX2RvY3JlbmRlcmRhdGEuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9kb2NyZW5kZXJkYXRhLmNwcApAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3R5cGUzZm9udC5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL3BhZ2VpbnQuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2Z1bmN0aW9uLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RvY3VtZW50LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX2RpYnNvdXJjZS5oIgpAQCAtMzIsNTkgKzMyLDQzIEBACiB2b2lkIENQREZfRG9jUmVuZGVyRGF0YTo6Q2xlYXIoYm9vbCBiUmVsZWFzZSkgewogICBmb3IgKGF1dG8gaXQgPSBtX1R5cGUzRmFjZU1hcC5iZWdpbigpOyBpdCAhPSBtX1R5cGUzRmFjZU1hcC5lbmQoKTspIHsKICAgICBhdXRvIGN1cnJfaXQgPSBpdCsrOwotICAgIENQREZfQ291bnRlZE9iamVjdDxDUERGX1R5cGUzQ2FjaGU+KiBjYWNoZSA9IGN1cnJfaXQtPnNlY29uZDsKLSAgICBpZiAoYlJlbGVhc2UgfHwgY2FjaGUtPnVzZV9jb3VudCgpIDwgMikgewotICAgICAgZGVsZXRlIGNhY2hlLT5nZXQoKTsKLSAgICAgIGRlbGV0ZSBjYWNoZTsKKyAgICBpZiAoYlJlbGVhc2UgfHwgY3Vycl9pdC0+c2Vjb25kLT5IYXNPbmVSZWYoKSkgewogICAgICAgbV9UeXBlM0ZhY2VNYXAuZXJhc2UoY3Vycl9pdCk7CiAgICAgfQogICB9CiAKICAgZm9yIChhdXRvIGl0ID0gbV9UcmFuc2ZlckZ1bmNNYXAuYmVnaW4oKTsgaXQgIT0gbV9UcmFuc2ZlckZ1bmNNYXAuZW5kKCk7KSB7CiAgICAgYXV0byBjdXJyX2l0ID0gaXQrKzsKLSAgICBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9UcmFuc2ZlckZ1bmM+KiB2YWx1ZSA9IGN1cnJfaXQtPnNlY29uZDsKLSAgICBpZiAoYlJlbGVhc2UgfHwgdmFsdWUtPnVzZV9jb3VudCgpIDwgMikgewotICAgICAgZGVsZXRlIHZhbHVlLT5nZXQoKTsKLSAgICAgIGRlbGV0ZSB2YWx1ZTsKKyAgICBpZiAoYlJlbGVhc2UgfHwgY3Vycl9pdC0+c2Vjb25kLT5IYXNPbmVSZWYoKSkKICAgICAgIG1fVHJhbnNmZXJGdW5jTWFwLmVyYXNlKGN1cnJfaXQpOwotICAgIH0KICAgfQogfQogCi1DUERGX1R5cGUzQ2FjaGUqIENQREZfRG9jUmVuZGVyRGF0YTo6R2V0Q2FjaGVkVHlwZTMoQ1BERl9UeXBlM0ZvbnQqIHBGb250KSB7Ci0gIENQREZfQ291bnRlZE9iamVjdDxDUERGX1R5cGUzQ2FjaGU+KiBwQ2FjaGU7CitSZXRhaW5QdHI8Q1BERl9UeXBlM0NhY2hlPiBDUERGX0RvY1JlbmRlckRhdGE6OkdldENhY2hlZFR5cGUzKAorICAgIENQREZfVHlwZTNGb250KiBwRm9udCkgewogICBhdXRvIGl0ID0gbV9UeXBlM0ZhY2VNYXAuZmluZChwRm9udCk7Ci0gIGlmIChpdCA9PSBtX1R5cGUzRmFjZU1hcC5lbmQoKSkgewotICAgIHBDYWNoZSA9IG5ldyBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9UeXBlM0NhY2hlPigKLSAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfVHlwZTNDYWNoZT4ocEZvbnQpKTsKLSAgICBtX1R5cGUzRmFjZU1hcFtwRm9udF0gPSBwQ2FjaGU7Ci0gIH0gZWxzZSB7Ci0gICAgcENhY2hlID0gaXQtPnNlY29uZDsKLSAgfQotICByZXR1cm4gcENhY2hlLT5BZGRSZWYoKTsKKyAgaWYgKGl0ICE9IG1fVHlwZTNGYWNlTWFwLmVuZCgpKQorICAgIHJldHVybiBpdC0+c2Vjb25kOworCisgIGF1dG8gcENhY2hlID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfVHlwZTNDYWNoZT4ocEZvbnQpOworICBtX1R5cGUzRmFjZU1hcFtwRm9udF0gPSBwQ2FjaGU7CisgIHJldHVybiBwQ2FjaGU7CiB9CiAKLXZvaWQgQ1BERl9Eb2NSZW5kZXJEYXRhOjpSZWxlYXNlQ2FjaGVkVHlwZTMoQ1BERl9UeXBlM0ZvbnQqIHBGb250KSB7Cit2b2lkIENQREZfRG9jUmVuZGVyRGF0YTo6TWF5YmVQdXJnZUNhY2hlZFR5cGUzKENQREZfVHlwZTNGb250KiBwRm9udCkgewogICBhdXRvIGl0ID0gbV9UeXBlM0ZhY2VNYXAuZmluZChwRm9udCk7Ci0gIGlmIChpdCAhPSBtX1R5cGUzRmFjZU1hcC5lbmQoKSkgewotICAgIGl0LT5zZWNvbmQtPlJlbW92ZVJlZigpOwotICAgIGlmIChpdC0+c2Vjb25kLT51c2VfY291bnQoKSA8IDIpIHsKLSAgICAgIGRlbGV0ZSBpdC0+c2Vjb25kLT5nZXQoKTsKLSAgICAgIGRlbGV0ZSBpdC0+c2Vjb25kOwotICAgICAgbV9UeXBlM0ZhY2VNYXAuZXJhc2UoaXQpOwotICAgIH0KLSAgfQorICBpZiAoaXQgIT0gbV9UeXBlM0ZhY2VNYXAuZW5kKCkgJiYgaXQtPnNlY29uZC0+SGFzT25lUmVmKCkpCisgICAgbV9UeXBlM0ZhY2VNYXAuZXJhc2UoaXQpOwogfQogCi1DUERGX1RyYW5zZmVyRnVuYyogQ1BERl9Eb2NSZW5kZXJEYXRhOjpHZXRUcmFuc2ZlckZ1bmMoQ1BERl9PYmplY3QqIHBPYmopIHsKK1JldGFpblB0cjxDUERGX1RyYW5zZmVyRnVuYz4gQ1BERl9Eb2NSZW5kZXJEYXRhOjpHZXRUcmFuc2ZlckZ1bmMoCisgICAgQ1BERl9PYmplY3QqIHBPYmopIHsKICAgaWYgKCFwT2JqKQogICAgIHJldHVybiBudWxscHRyOwogCiAgIGF1dG8gaXQgPSBtX1RyYW5zZmVyRnVuY01hcC5maW5kKHBPYmopOwotICBpZiAoaXQgIT0gbV9UcmFuc2ZlckZ1bmNNYXAuZW5kKCkpIHsKLSAgICBDUERGX0NvdW50ZWRPYmplY3Q8Q1BERl9UcmFuc2ZlckZ1bmM+KiBwVHJhbnNmZXJDb3VudGVyID0gaXQtPnNlY29uZDsKLSAgICByZXR1cm4gcFRyYW5zZmVyQ291bnRlci0+QWRkUmVmKCk7Ci0gIH0KKyAgaWYgKGl0ICE9IG1fVHJhbnNmZXJGdW5jTWFwLmVuZCgpKQorICAgIHJldHVybiBpdC0+c2Vjb25kOwogCiAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0Z1bmN0aW9uPiBwRnVuY3NbM107CiAgIGJvb2wgYlVuaVRyYW5zZmVyID0gdHJ1ZTsKQEAgLTEwNCw1MiArODgsNDQgQEAKICAgICBpZiAoIXBGdW5jc1swXSkKICAgICAgIHJldHVybiBudWxscHRyOwogICB9Ci0gIENQREZfQ291bnRlZE9iamVjdDxDUERGX1RyYW5zZmVyRnVuYz4qIHBUcmFuc2ZlckNvdW50ZXIgPQotICAgICAgbmV3IENQREZfQ291bnRlZE9iamVjdDxDUERGX1RyYW5zZmVyRnVuYz4oCi0gICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfVHJhbnNmZXJGdW5jPihtX3BQREZEb2MpKTsKLSAgQ1BERl9UcmFuc2ZlckZ1bmMqIHBUcmFuc2ZlciA9IHBUcmFuc2ZlckNvdW50ZXItPmdldCgpOwotICBtX1RyYW5zZmVyRnVuY01hcFtwT2JqXSA9IHBUcmFuc2ZlckNvdW50ZXI7Ci0gIEZYX0ZMT0FUIG91dHB1dFtrTWF4T3V0cHV0c107Ci0gIEZYU1lTX21lbXNldChvdXRwdXQsIDAsIHNpemVvZihvdXRwdXQpKTsKLSAgRlhfRkxPQVQgaW5wdXQ7CisgIGF1dG8gcFRyYW5zZmVyID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfVHJhbnNmZXJGdW5jPihtX3BQREZEb2MuR2V0KCkpOworICBtX1RyYW5zZmVyRnVuY01hcFtwT2JqXSA9IHBUcmFuc2ZlcjsKKworICBmbG9hdCBpbnB1dDsKICAgaW50IG5vdXRwdXQ7CisgIGZsb2F0IG91dHB1dFtrTWF4T3V0cHV0c107CisgIG1lbXNldChvdXRwdXQsIDAsIHNpemVvZihvdXRwdXQpKTsKICAgZm9yIChpbnQgdiA9IDA7IHYgPCAyNTY7ICsrdikgewotICAgIGlucHV0ID0gKEZYX0ZMT0FUKXYgLyAyNTUuMGY7CisgICAgaW5wdXQgPSAoZmxvYXQpdiAvIDI1NS4wZjsKICAgICBpZiAoYlVuaVRyYW5zZmVyKSB7CiAgICAgICBpZiAocEZ1bmNzWzBdICYmIHBGdW5jc1swXS0+Q291bnRPdXRwdXRzKCkgPD0ga01heE91dHB1dHMpCi0gICAgICAgIHBGdW5jc1swXS0+Q2FsbCgmaW5wdXQsIDEsIG91dHB1dCwgbm91dHB1dCk7CisgICAgICAgIHBGdW5jc1swXS0+Q2FsbCgmaW5wdXQsIDEsIG91dHB1dCwgJm5vdXRwdXQpOwogICAgICAgaW50IG8gPSBGWFNZU19yb3VuZChvdXRwdXRbMF0gKiAyNTUpOwogICAgICAgaWYgKG8gIT0gdikKICAgICAgICAgYklkZW50aXR5ID0gZmFsc2U7CiAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkKLSAgICAgICAgcFRyYW5zZmVyLT5tX1NhbXBsZXNbaSAqIDI1NiArIHZdID0gbzsKKyAgICAgICAgcFRyYW5zZmVyLT5HZXRTYW1wbGVzKClbaSAqIDI1NiArIHZdID0gbzsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewogICAgICAgaWYgKCFwRnVuY3NbaV0gfHwgcEZ1bmNzW2ldLT5Db3VudE91dHB1dHMoKSA+IGtNYXhPdXRwdXRzKSB7Ci0gICAgICAgIHBUcmFuc2Zlci0+bV9TYW1wbGVzW2kgKiAyNTYgKyB2XSA9IHY7CisgICAgICAgIHBUcmFuc2Zlci0+R2V0U2FtcGxlcygpW2kgKiAyNTYgKyB2XSA9IHY7CiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQotICAgICAgcEZ1bmNzW2ldLT5DYWxsKCZpbnB1dCwgMSwgb3V0cHV0LCBub3V0cHV0KTsKKyAgICAgIHBGdW5jc1tpXS0+Q2FsbCgmaW5wdXQsIDEsIG91dHB1dCwgJm5vdXRwdXQpOwogICAgICAgaW50IG8gPSBGWFNZU19yb3VuZChvdXRwdXRbMF0gKiAyNTUpOwogICAgICAgaWYgKG8gIT0gdikKICAgICAgICAgYklkZW50aXR5ID0gZmFsc2U7Ci0gICAgICBwVHJhbnNmZXItPm1fU2FtcGxlc1tpICogMjU2ICsgdl0gPSBvOworICAgICAgcFRyYW5zZmVyLT5HZXRTYW1wbGVzKClbaSAqIDI1NiArIHZdID0gbzsKICAgICB9CiAgIH0KIAotICBwVHJhbnNmZXItPm1fYklkZW50aXR5ID0gYklkZW50aXR5OwotICByZXR1cm4gcFRyYW5zZmVyQ291bnRlci0+QWRkUmVmKCk7CisgIHBUcmFuc2Zlci0+U2V0SWRlbnRpdHkoYklkZW50aXR5KTsKKyAgcmV0dXJuIHBUcmFuc2ZlcjsKIH0KIAotdm9pZCBDUERGX0RvY1JlbmRlckRhdGE6OlJlbGVhc2VUcmFuc2ZlckZ1bmMoQ1BERl9PYmplY3QqIHBPYmopIHsKK3ZvaWQgQ1BERl9Eb2NSZW5kZXJEYXRhOjpNYXliZVB1cmdlVHJhbnNmZXJGdW5jKENQREZfT2JqZWN0KiBwT2JqKSB7CiAgIGF1dG8gaXQgPSBtX1RyYW5zZmVyRnVuY01hcC5maW5kKHBPYmopOwotICBpZiAoaXQgIT0gbV9UcmFuc2ZlckZ1bmNNYXAuZW5kKCkpIHsKLSAgICBpdC0+c2Vjb25kLT5SZW1vdmVSZWYoKTsKLSAgICBpZiAoaXQtPnNlY29uZC0+dXNlX2NvdW50KCkgPCAyKSB7Ci0gICAgICBkZWxldGUgaXQtPnNlY29uZC0+Z2V0KCk7Ci0gICAgICBkZWxldGUgaXQtPnNlY29uZDsKLSAgICAgIG1fVHJhbnNmZXJGdW5jTWFwLmVyYXNlKGl0KTsKLSAgICB9Ci0gIH0KKyAgaWYgKGl0ICE9IG1fVHJhbnNmZXJGdW5jTWFwLmVuZCgpICYmIGl0LT5zZWNvbmQtPkhhc09uZVJlZigpKQorICAgIG1fVHJhbnNmZXJGdW5jTWFwLmVyYXNlKGl0KTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9kb2NyZW5kZXJkYXRhLmggYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfZG9jcmVuZGVyZGF0YS5oCmluZGV4IGE4ZjQxNjcuLjdiM2UwZWQgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9kb2NyZW5kZXJkYXRhLmgKKysrIGIvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX2RvY3JlbmRlcmRhdGEuaApAQCAtMTAsMTEgKzEwLDEzIEBACiAjaW5jbHVkZSA8bWFwPgogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb3VudGVkb2JqZWN0LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3RyYW5zZmVyZnVuYy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogCiBjbGFzcyBDUERGX0RvY3VtZW50OwogY2xhc3MgQ1BERl9Gb250OwogY2xhc3MgQ1BERl9PYmplY3Q7Ci1jbGFzcyBDUERGX1RyYW5zZmVyRnVuYzsKIGNsYXNzIENQREZfVHlwZTNDYWNoZTsKIGNsYXNzIENQREZfVHlwZTNGb250OwogCkBAIC0yMywyMSArMjUsMTggQEAKICAgZXhwbGljaXQgQ1BERl9Eb2NSZW5kZXJEYXRhKENQREZfRG9jdW1lbnQqIHBQREZEb2MpOwogICB+Q1BERl9Eb2NSZW5kZXJEYXRhKCk7CiAKLSAgQ1BERl9UeXBlM0NhY2hlKiBHZXRDYWNoZWRUeXBlMyhDUERGX1R5cGUzRm9udCogcEZvbnQpOwotICB2b2lkIFJlbGVhc2VDYWNoZWRUeXBlMyhDUERGX1R5cGUzRm9udCogcEZvbnQpOwotICBDUERGX1RyYW5zZmVyRnVuYyogR2V0VHJhbnNmZXJGdW5jKENQREZfT2JqZWN0KiBwT2JqKTsKLSAgdm9pZCBSZWxlYXNlVHJhbnNmZXJGdW5jKENQREZfT2JqZWN0KiBwT2JqKTsKKyAgUmV0YWluUHRyPENQREZfVHlwZTNDYWNoZT4gR2V0Q2FjaGVkVHlwZTMoQ1BERl9UeXBlM0ZvbnQqIHBGb250KTsKKyAgdm9pZCBNYXliZVB1cmdlQ2FjaGVkVHlwZTMoQ1BERl9UeXBlM0ZvbnQqIHBGb250KTsKKworICBSZXRhaW5QdHI8Q1BERl9UcmFuc2ZlckZ1bmM+IEdldFRyYW5zZmVyRnVuYyhDUERGX09iamVjdCogcE9iaik7CisgIHZvaWQgTWF5YmVQdXJnZVRyYW5zZmVyRnVuYyhDUERGX09iamVjdCogcE9iKTsKKwogICB2b2lkIENsZWFyKGJvb2wgYlJlbGVhc2UpOwogCiAgcHJpdmF0ZToKLSAgdXNpbmcgQ1BERl9UeXBlM0NhY2hlTWFwID0KLSAgICAgIHN0ZDo6bWFwPENQREZfRm9udCosIENQREZfQ291bnRlZE9iamVjdDxDUERGX1R5cGUzQ2FjaGU+Kj47Ci0gIHVzaW5nIENQREZfVHJhbnNmZXJGdW5jTWFwID0KLSAgICAgIHN0ZDo6bWFwPENQREZfT2JqZWN0KiwgQ1BERl9Db3VudGVkT2JqZWN0PENQREZfVHJhbnNmZXJGdW5jPio+OwotCi0gIENQREZfRG9jdW1lbnQqIG1fcFBERkRvYzsgIC8vIE5vdCBPd25lZAotICBDUERGX1R5cGUzQ2FjaGVNYXAgbV9UeXBlM0ZhY2VNYXA7Ci0gIENQREZfVHJhbnNmZXJGdW5jTWFwIG1fVHJhbnNmZXJGdW5jTWFwOworICBVbm93bmVkUHRyPENQREZfRG9jdW1lbnQ+IG1fcFBERkRvYzsKKyAgc3RkOjptYXA8Q1BERl9Gb250KiwgUmV0YWluUHRyPENQREZfVHlwZTNDYWNoZT4+IG1fVHlwZTNGYWNlTWFwOworICBzdGQ6Om1hcDxDUERGX09iamVjdCosIFJldGFpblB0cjxDUERGX1RyYW5zZmVyRnVuYz4+IG1fVHJhbnNmZXJGdW5jTWFwOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfUkVOREVSX0NQREZfRE9DUkVOREVSREFUQV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX2ltYWdlY2FjaGVlbnRyeS5jcHAgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfaW1hZ2VjYWNoZWVudHJ5LmNwcAppbmRleCBmMTFjYWU4Li5mNjliZmRhIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfaW1hZ2VjYWNoZWVudHJ5LmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfaW1hZ2VjYWNoZWVudHJ5LmNwcApAQCAtMTcsMTA5ICsxNywxMDkgQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcGFnZXJlbmRlcmNhY2hlLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3JlbmRlcmNvbnRleHQuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcmVuZGVyc3RhdHVzLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfZGliaXRtYXAuaCIKIAogQ1BERl9JbWFnZUNhY2hlRW50cnk6OkNQREZfSW1hZ2VDYWNoZUVudHJ5KENQREZfRG9jdW1lbnQqIHBEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPENQREZfSW1hZ2U+JiBwSW1hZ2UpCiAgICAgOiBtX2R3VGltZUNvdW50KDApLAogICAgICAgbV9NYXR0ZUNvbG9yKDApLAotICAgICAgbV9wUmVuZGVyU3RhdHVzKG51bGxwdHIpLAogICAgICAgbV9wRG9jdW1lbnQocERvYyksCi0gICAgICBtX3BTdHJlYW0ocFN0cmVhbSksCi0gICAgICBtX3BDdXJCaXRtYXAobnVsbHB0ciksCi0gICAgICBtX3BDdXJNYXNrKG51bGxwdHIpLAorICAgICAgbV9wSW1hZ2UocEltYWdlKSwKICAgICAgIG1fZHdDYWNoZVNpemUoMCkge30KIAogQ1BERl9JbWFnZUNhY2hlRW50cnk6On5DUERGX0ltYWdlQ2FjaGVFbnRyeSgpIHt9CiAKLXZvaWQgQ1BERl9JbWFnZUNhY2hlRW50cnk6OlJlc2V0KGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCkgewotICBtX3BDYWNoZWRCaXRtYXAucmVzZXQoKTsKK3ZvaWQgQ1BERl9JbWFnZUNhY2hlRW50cnk6OlJlc2V0KGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwQml0bWFwKSB7CisgIG1fcENhY2hlZEJpdG1hcC5SZXNldCgpOwogICBpZiAocEJpdG1hcCkKLSAgICBtX3BDYWNoZWRCaXRtYXAgPSBwQml0bWFwLT5DbG9uZSgpOworICAgIG1fcENhY2hlZEJpdG1hcCA9IHBCaXRtYXAtPkNsb25lKG51bGxwdHIpOwogICBDYWxjU2l6ZSgpOwogfQogCi1zdGF0aWMgdWludDMyX3QgRlBERl9JbWFnZUNhY2hlX0VzdGltYXRlSW1hZ2VTaXplKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBESUIpIHsKK3N0YXRpYyB1aW50MzJfdCBGUERGX0ltYWdlQ2FjaGVfRXN0aW1hdGVJbWFnZVNpemUoCisgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwRElCKSB7CiAgIHJldHVybiBwRElCICYmIHBESUItPkdldEJ1ZmZlcigpCiAgICAgICAgICAgICAgPyAodWludDMyX3QpcERJQi0+R2V0SGVpZ2h0KCkgKiBwRElCLT5HZXRQaXRjaCgpICsKICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpcERJQi0+R2V0UGFsZXR0ZVNpemUoKSAqIDQKICAgICAgICAgICAgICA6IDA7CiB9CiAKLUNGWF9ESUJTb3VyY2UqIENQREZfSW1hZ2VDYWNoZUVudHJ5OjpEZXRhY2hCaXRtYXAoKSB7Ci0gIENGWF9ESUJTb3VyY2UqIHBESUJTb3VyY2UgPSBtX3BDdXJCaXRtYXA7Ci0gIG1fcEN1ckJpdG1hcCA9IG51bGxwdHI7Ci0gIHJldHVybiBwRElCU291cmNlOworUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+IENQREZfSW1hZ2VDYWNoZUVudHJ5OjpEZXRhY2hCaXRtYXAoKSB7CisgIHJldHVybiBzdGQ6Om1vdmUobV9wQ3VyQml0bWFwKTsKIH0KIAotQ0ZYX0RJQlNvdXJjZSogQ1BERl9JbWFnZUNhY2hlRW50cnk6OkRldGFjaE1hc2soKSB7Ci0gIENGWF9ESUJTb3VyY2UqIHBESUJTb3VyY2UgPSBtX3BDdXJNYXNrOwotICBtX3BDdXJNYXNrID0gbnVsbHB0cjsKLSAgcmV0dXJuIHBESUJTb3VyY2U7CitSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4gQ1BERl9JbWFnZUNhY2hlRW50cnk6OkRldGFjaE1hc2soKSB7CisgIHJldHVybiBzdGQ6Om1vdmUobV9wQ3VyTWFzayk7CiB9CiAKLWludCBDUERGX0ltYWdlQ2FjaGVFbnRyeTo6U3RhcnRHZXRDYWNoZWRCaXRtYXAoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3RkQ1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEdyb3VwRmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJMb2FkTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZG93bnNhbXBsZVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRvd25zYW1wbGVIZWlnaHQpIHsKK2ludCBDUERGX0ltYWdlQ2FjaGVFbnRyeTo6U3RhcnRHZXRDYWNoZWRCaXRtYXAoCisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzLAorICAgIGJvb2wgYlN0ZENTLAorICAgIHVpbnQzMl90IEdyb3VwRmFtaWx5LAorICAgIGJvb2wgYkxvYWRNYXNrLAorICAgIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzKSB7CisgIEFTU0VSVChwUmVuZGVyU3RhdHVzKTsKKwogICBpZiAobV9wQ2FjaGVkQml0bWFwKSB7Ci0gICAgbV9wQ3VyQml0bWFwID0gbV9wQ2FjaGVkQml0bWFwLmdldCgpOwotICAgIG1fcEN1ck1hc2sgPSBtX3BDYWNoZWRNYXNrLmdldCgpOworICAgIG1fcEN1ckJpdG1hcCA9IG1fcENhY2hlZEJpdG1hcDsKKyAgICBtX3BDdXJNYXNrID0gbV9wQ2FjaGVkTWFzazsKICAgICByZXR1cm4gMTsKICAgfQotICBpZiAoIXBSZW5kZXJTdGF0dXMpCi0gICAgcmV0dXJuIDA7CiAKLSAgbV9wUmVuZGVyU3RhdHVzID0gcFJlbmRlclN0YXR1czsKLSAgbV9wQ3VyQml0bWFwID0gbmV3IENQREZfRElCU291cmNlOwotICBpbnQgcmV0ID0KLSAgICAgICgoQ1BERl9ESUJTb3VyY2UqKW1fcEN1ckJpdG1hcCkKLSAgICAgICAgICAtPlN0YXJ0TG9hZERJQlNvdXJjZShtX3BEb2N1bWVudCwgbV9wU3RyZWFtLCB0cnVlLCBwRm9ybVJlc291cmNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFnZVJlc291cmNlcywgYlN0ZENTLCBHcm91cEZhbWlseSwgYkxvYWRNYXNrKTsKKyAgbV9wQ3VyQml0bWFwID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfRElCU291cmNlPigpOworICBpbnQgcmV0ID0gbV9wQ3VyQml0bWFwLkFzPENQREZfRElCU291cmNlPigpLT5TdGFydExvYWRESUJTb3VyY2UoCisgICAgICBtX3BEb2N1bWVudC5HZXQoKSwgbV9wSW1hZ2UtPkdldFN0cmVhbSgpLCB0cnVlLCBwRm9ybVJlc291cmNlcywKKyAgICAgIHBQYWdlUmVzb3VyY2VzLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2spOwogICBpZiAocmV0ID09IDIpCiAgICAgcmV0dXJuIHJldDsKIAogICBpZiAoIXJldCkgewotICAgIGRlbGV0ZSBtX3BDdXJCaXRtYXA7Ci0gICAgbV9wQ3VyQml0bWFwID0gbnVsbHB0cjsKKyAgICBtX3BDdXJCaXRtYXAuUmVzZXQoKTsKICAgICByZXR1cm4gMDsKICAgfQotICBDb250aW51ZUdldENhY2hlZEJpdG1hcCgpOworICBDb250aW51ZUdldENhY2hlZEJpdG1hcChwUmVuZGVyU3RhdHVzKTsKICAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgQ1BERl9JbWFnZUNhY2hlRW50cnk6OkNvbnRpbnVlR2V0Q2FjaGVkQml0bWFwKCkgewotICBtX01hdHRlQ29sb3IgPSAoKENQREZfRElCU291cmNlKiltX3BDdXJCaXRtYXApLT5HZXRNYXR0ZUNvbG9yKCk7Ci0gIG1fcEN1ck1hc2sgPSAoKENQREZfRElCU291cmNlKiltX3BDdXJCaXRtYXApLT5EZXRhY2hNYXNrKCk7Ci0gIENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQgPSBtX3BSZW5kZXJTdGF0dXMtPkdldENvbnRleHQoKTsKK3ZvaWQgQ1BERl9JbWFnZUNhY2hlRW50cnk6OkNvbnRpbnVlR2V0Q2FjaGVkQml0bWFwKAorICAgIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzKSB7CisgIG1fTWF0dGVDb2xvciA9IG1fcEN1ckJpdG1hcC5BczxDUERGX0RJQlNvdXJjZT4oKS0+R2V0TWF0dGVDb2xvcigpOworICBtX3BDdXJNYXNrID0gbV9wQ3VyQml0bWFwLkFzPENQREZfRElCU291cmNlPigpLT5EZXRhY2hNYXNrKCk7CisgIENQREZfUmVuZGVyQ29udGV4dCogcENvbnRleHQgPSBwUmVuZGVyU3RhdHVzLT5HZXRDb250ZXh0KCk7CiAgIENQREZfUGFnZVJlbmRlckNhY2hlKiBwUGFnZVJlbmRlckNhY2hlID0gcENvbnRleHQtPkdldFBhZ2VDYWNoZSgpOwogICBtX2R3VGltZUNvdW50ID0gcFBhZ2VSZW5kZXJDYWNoZS0+R2V0VGltZUNvdW50KCk7Ci0gIG1fcENhY2hlZEJpdG1hcCA9IHBkZml1bTo6V3JhcFVuaXF1ZTxDRlhfRElCU291cmNlPihtX3BDdXJCaXRtYXApOwotICBpZiAobV9wQ3VyTWFzaykKLSAgICBtX3BDYWNoZWRNYXNrID0gcGRmaXVtOjpXcmFwVW5pcXVlPENGWF9ESUJTb3VyY2U+KG1fcEN1ck1hc2spOwotICBlbHNlCi0gICAgbV9wQ3VyTWFzayA9IG1fcENhY2hlZE1hc2suZ2V0KCk7CisgIGlmIChtX3BDdXJCaXRtYXAtPkdldFBpdGNoKCkgKiBtX3BDdXJCaXRtYXAtPkdldEhlaWdodCgpIDwKKyAgICAgIEZQREZfSFVHRV9JTUFHRV9TSVpFKSB7CisgICAgbV9wQ2FjaGVkQml0bWFwID0gbV9wQ3VyQml0bWFwLT5DbG9uZShudWxscHRyKTsKKyAgICBtX3BDdXJCaXRtYXAuUmVzZXQoKTsKKyAgfSBlbHNlIHsKKyAgICBtX3BDYWNoZWRCaXRtYXAgPSBtX3BDdXJCaXRtYXA7CisgIH0KKyAgaWYgKG1fcEN1ck1hc2spIHsKKyAgICBtX3BDYWNoZWRNYXNrID0gbV9wQ3VyTWFzay0+Q2xvbmUobnVsbHB0cik7CisgICAgbV9wQ3VyTWFzay5SZXNldCgpOworICB9CisgIG1fcEN1ckJpdG1hcCA9IG1fcENhY2hlZEJpdG1hcDsKKyAgbV9wQ3VyTWFzayA9IG1fcENhY2hlZE1hc2s7CiAgIENhbGNTaXplKCk7CiB9CiAKLWludCBDUERGX0ltYWdlQ2FjaGVFbnRyeTo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpIHsKLSAgaW50IHJldCA9ICgoQ1BERl9ESUJTb3VyY2UqKW1fcEN1ckJpdG1hcCktPkNvbnRpbnVlTG9hZERJQlNvdXJjZShwUGF1c2UpOworaW50IENQREZfSW1hZ2VDYWNoZUVudHJ5OjpDb250aW51ZShJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMpIHsKKyAgaW50IHJldCA9IG1fcEN1ckJpdG1hcC5BczxDUERGX0RJQlNvdXJjZT4oKS0+Q29udGludWVMb2FkRElCU291cmNlKHBQYXVzZSk7CisgIGlmICghcmV0KSB7CisgICAgbV9wQ3VyQml0bWFwLlJlc2V0KCk7CisgICAgcmV0dXJuIDA7CisgIH0KICAgaWYgKHJldCA9PSAyKQogICAgIHJldHVybiByZXQ7CiAKLSAgaWYgKCFyZXQpIHsKLSAgICBkZWxldGUgbV9wQ3VyQml0bWFwOwotICAgIG1fcEN1ckJpdG1hcCA9IG51bGxwdHI7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgQ29udGludWVHZXRDYWNoZWRCaXRtYXAoKTsKKyAgQ29udGludWVHZXRDYWNoZWRCaXRtYXAocFJlbmRlclN0YXR1cyk7CiAgIHJldHVybiAwOwogfQogCiB2b2lkIENQREZfSW1hZ2VDYWNoZUVudHJ5OjpDYWxjU2l6ZSgpIHsKLSAgbV9kd0NhY2hlU2l6ZSA9IEZQREZfSW1hZ2VDYWNoZV9Fc3RpbWF0ZUltYWdlU2l6ZShtX3BDYWNoZWRCaXRtYXAuZ2V0KCkpICsKLSAgICAgICAgICAgICAgICAgIEZQREZfSW1hZ2VDYWNoZV9Fc3RpbWF0ZUltYWdlU2l6ZShtX3BDYWNoZWRNYXNrLmdldCgpKTsKKyAgbV9kd0NhY2hlU2l6ZSA9IEZQREZfSW1hZ2VDYWNoZV9Fc3RpbWF0ZUltYWdlU2l6ZShtX3BDYWNoZWRCaXRtYXApICsKKyAgICAgICAgICAgICAgICAgIEZQREZfSW1hZ2VDYWNoZV9Fc3RpbWF0ZUltYWdlU2l6ZShtX3BDYWNoZWRNYXNrKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9pbWFnZWNhY2hlZW50cnkuaCBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9pbWFnZWNhY2hlZW50cnkuaAppbmRleCBkMTFmZTk0Li4yYmVkZTIzIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfaW1hZ2VjYWNoZWVudHJ5LmgKKysrIGIvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX2ltYWdlY2FjaGVlbnRyeS5oCkBAIC0xMCw1MSArMTAsNTAgQEAKICNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKIAotY2xhc3MgQ0ZYX0RJQml0bWFwOwogY2xhc3MgQ0ZYX0RJQlNvdXJjZTsKK2NsYXNzIENGWF9ESUJpdG1hcDsKIGNsYXNzIENQREZfRGljdGlvbmFyeTsKIGNsYXNzIENQREZfRG9jdW1lbnQ7CitjbGFzcyBDUERGX0ltYWdlOwogY2xhc3MgQ1BERl9SZW5kZXJTdGF0dXM7Ci1jbGFzcyBDUERGX1N0cmVhbTsKLWNsYXNzIElGWF9QYXVzZTsKK2NsYXNzIElGWF9QYXVzZUluZGljYXRvcjsKIAogY2xhc3MgQ1BERl9JbWFnZUNhY2hlRW50cnkgewogIHB1YmxpYzoKLSAgQ1BERl9JbWFnZUNhY2hlRW50cnkoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9TdHJlYW0qIHBTdHJlYW0pOworICBDUERGX0ltYWdlQ2FjaGVFbnRyeShDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q1BERl9JbWFnZT4mIHBJbWFnZSk7CiAgIH5DUERGX0ltYWdlQ2FjaGVFbnRyeSgpOwogCi0gIHZvaWQgUmVzZXQoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwKTsKKyAgdm9pZCBSZXNldChjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcCk7CiAgIHVpbnQzMl90IEVzdGltYXRlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZHdDYWNoZVNpemU7IH0KICAgdWludDMyX3QgR2V0VGltZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbV9kd1RpbWVDb3VudDsgfQotICBDUERGX1N0cmVhbSogR2V0U3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbV9wU3RyZWFtOyB9Ci0KKyAgQ1BERl9JbWFnZSogR2V0SW1hZ2UoKSBjb25zdCB7IHJldHVybiBtX3BJbWFnZS5HZXQoKTsgfQogICBpbnQgU3RhcnRHZXRDYWNoZWRCaXRtYXAoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybVJlc291cmNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTdGRDUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEdyb3VwRmFtaWx5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTG9hZE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZG93bnNhbXBsZVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0KTsKLSAgaW50IENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKLSAgQ0ZYX0RJQlNvdXJjZSogRGV0YWNoQml0bWFwKCk7Ci0gIENGWF9ESUJTb3VyY2UqIERldGFjaE1hc2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzKTsKKyAgaW50IENvbnRpbnVlKElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyk7CisgIFJldGFpblB0cjxDRlhfRElCU291cmNlPiBEZXRhY2hCaXRtYXAoKTsKKyAgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+IERldGFjaE1hc2soKTsKIAogICBpbnQgbV9kd1RpbWVDb3VudDsKICAgdWludDMyX3QgbV9NYXR0ZUNvbG9yOwogCiAgcHJpdmF0ZToKLSAgdm9pZCBDb250aW51ZUdldENhY2hlZEJpdG1hcCgpOworICB2b2lkIENvbnRpbnVlR2V0Q2FjaGVkQml0bWFwKENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzKTsKICAgdm9pZCBDYWxjU2l6ZSgpOwogCi0gIENQREZfUmVuZGVyU3RhdHVzKiBtX3BSZW5kZXJTdGF0dXM7Ci0gIENQREZfRG9jdW1lbnQqIG1fcERvY3VtZW50OwotICBDUERGX1N0cmVhbSogbV9wU3RyZWFtOwotICBDRlhfRElCU291cmNlKiBtX3BDdXJCaXRtYXA7Ci0gIENGWF9ESUJTb3VyY2UqIG1fcEN1ck1hc2s7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCU291cmNlPiBtX3BDYWNoZWRCaXRtYXA7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCU291cmNlPiBtX3BDYWNoZWRNYXNrOworICBVbm93bmVkUHRyPENQREZfRG9jdW1lbnQ+IGNvbnN0IG1fcERvY3VtZW50OworICBSZXRhaW5QdHI8Q1BERl9JbWFnZT4gY29uc3QgbV9wSW1hZ2U7CisgIFJldGFpblB0cjxDRlhfRElCU291cmNlPiBtX3BDdXJCaXRtYXA7CisgIFJldGFpblB0cjxDRlhfRElCU291cmNlPiBtX3BDdXJNYXNrOworICBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4gbV9wQ2FjaGVkQml0bWFwOworICBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4gbV9wQ2FjaGVkTWFzazsKICAgdWludDMyX3QgbV9kd0NhY2hlU2l6ZTsKIH07CiAKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9pbWFnZWxvYWRlci5jcHAgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfaW1hZ2Vsb2FkZXIuY3BwCmluZGV4IDE4MjEzZWEuLjA4YWE1ZjEgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9pbWFnZWxvYWRlci5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX2ltYWdlbG9hZGVyLmNwcApAQCAtMTIsNTUgKzEyLDQxIEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX2ltYWdlY2FjaGVlbnRyeS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9wYWdlcmVuZGVyY2FjaGUuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcmVuZGVyc3RhdHVzLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgogCiBDUERGX0ltYWdlTG9hZGVyOjpDUERGX0ltYWdlTG9hZGVyKCkKLSAgICA6IG1fcEJpdG1hcChudWxscHRyKSwKLSAgICAgIG1fcE1hc2sobnVsbHB0ciksCi0gICAgICBtX01hdHRlQ29sb3IoMCksCisgICAgOiBtX01hdHRlQ29sb3IoMCksCiAgICAgICBtX2JDYWNoZWQoZmFsc2UpLAotICAgICAgbV9uRG93bnNhbXBsZVdpZHRoKDApLAotICAgICAgbV9uRG93bnNhbXBsZUhlaWdodCgwKSwKICAgICAgIG1fcENhY2hlKG51bGxwdHIpLAotICAgICAgbV9wSW1hZ2UobnVsbHB0cikge30KKyAgICAgIG1fcEltYWdlT2JqZWN0KG51bGxwdHIpIHt9CiAKLUNQREZfSW1hZ2VMb2FkZXI6On5DUERGX0ltYWdlTG9hZGVyKCkgewotICBpZiAoIW1fYkNhY2hlZCkgewotICAgIGRlbGV0ZSBtX3BCaXRtYXA7Ci0gICAgZGVsZXRlIG1fcE1hc2s7Ci0gIH0KLX0KK0NQREZfSW1hZ2VMb2FkZXI6On5DUERGX0ltYWdlTG9hZGVyKCkge30KIAogYm9vbCBDUERGX0ltYWdlTG9hZGVyOjpTdGFydChjb25zdCBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFnZVJlbmRlckNhY2hlKiBwQ2FjaGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0ZENTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBHcm91cEZhbWlseSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTG9hZE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Eb3duc2FtcGxlV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkRvd25zYW1wbGVIZWlnaHQpIHsKLSAgbV9uRG93bnNhbXBsZVdpZHRoID0gbkRvd25zYW1wbGVXaWR0aDsKLSAgbV9uRG93bnNhbXBsZUhlaWdodCA9IG5Eb3duc2FtcGxlSGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cykgewogICBtX3BDYWNoZSA9IHBDYWNoZTsKLSAgbV9wSW1hZ2UgPSBjb25zdF9jYXN0PENQREZfSW1hZ2VPYmplY3QqPihwSW1hZ2UpOworICBtX3BJbWFnZU9iamVjdCA9IGNvbnN0X2Nhc3Q8Q1BERl9JbWFnZU9iamVjdCo+KHBJbWFnZSk7CiAgIGJvb2wgcmV0OwogICBpZiAocENhY2hlKSB7Ci0gICAgcmV0ID0gcENhY2hlLT5TdGFydEdldENhY2hlZEJpdG1hcCgKLSAgICAgICAgbV9wSW1hZ2UtPkdldEltYWdlKCktPkdldFN0cmVhbSgpLCBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2ssCi0gICAgICAgIHBSZW5kZXJTdGF0dXMsIG1fbkRvd25zYW1wbGVXaWR0aCwgbV9uRG93bnNhbXBsZUhlaWdodCk7CisgICAgcmV0ID0gcENhY2hlLT5TdGFydEdldENhY2hlZEJpdG1hcChtX3BJbWFnZU9iamVjdC0+R2V0SW1hZ2UoKSwgYlN0ZENTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBGYW1pbHksIGJMb2FkTWFzaywgcFJlbmRlclN0YXR1cyk7CiAgIH0gZWxzZSB7Ci0gICAgcmV0ID0gbV9wSW1hZ2UtPkdldEltYWdlKCktPlN0YXJ0TG9hZERJQlNvdXJjZSgKLSAgICAgICAgcFJlbmRlclN0YXR1cy0+bV9wRm9ybVJlc291cmNlLCBwUmVuZGVyU3RhdHVzLT5tX3BQYWdlUmVzb3VyY2UsIGJTdGRDUywKLSAgICAgICAgR3JvdXBGYW1pbHksIGJMb2FkTWFzayk7CisgICAgcmV0ID0gbV9wSW1hZ2VPYmplY3QtPkdldEltYWdlKCktPlN0YXJ0TG9hZERJQlNvdXJjZSgKKyAgICAgICAgcFJlbmRlclN0YXR1cy0+R2V0Rm9ybVJlc291cmNlKCksIHBSZW5kZXJTdGF0dXMtPkdldFBhZ2VSZXNvdXJjZSgpLAorICAgICAgICBiU3RkQ1MsIEdyb3VwRmFtaWx5LCBiTG9hZE1hc2spOwogICB9CiAgIGlmICghcmV0KQogICAgIEhhbmRsZUZhaWx1cmUoKTsKICAgcmV0dXJuIHJldDsKIH0KIAotYm9vbCBDUERGX0ltYWdlTG9hZGVyOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkgewotICBib29sIHJldCA9IG1fcENhY2hlID8gbV9wQ2FjaGUtPkNvbnRpbnVlKHBQYXVzZSkKLSAgICAgICAgICAgICAgICAgICAgICA6IG1fcEltYWdlLT5HZXRJbWFnZSgpLT5Db250aW51ZShwUGF1c2UpOworYm9vbCBDUERGX0ltYWdlTG9hZGVyOjpDb250aW51ZShJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMpIHsKKyAgYm9vbCByZXQgPSBtX3BDYWNoZSA/IG1fcENhY2hlLT5Db250aW51ZShwUGF1c2UsIHBSZW5kZXJTdGF0dXMpCisgICAgICAgICAgICAgICAgICAgICAgOiBtX3BJbWFnZU9iamVjdC0+R2V0SW1hZ2UoKS0+Q29udGludWUocFBhdXNlKTsKICAgaWYgKCFyZXQpCiAgICAgSGFuZGxlRmFpbHVyZSgpOwogICByZXR1cm4gcmV0OwpAQCAtNzUsNyArNjEsNyBAQAogICAgIG1fTWF0dGVDb2xvciA9IGVudHJ5LT5tX01hdHRlQ29sb3I7CiAgICAgcmV0dXJuOwogICB9Ci0gIENQREZfSW1hZ2UqIHBJbWFnZSA9IG1fcEltYWdlLT5HZXRJbWFnZSgpOworICBSZXRhaW5QdHI8Q1BERl9JbWFnZT4gcEltYWdlID0gbV9wSW1hZ2VPYmplY3QtPkdldEltYWdlKCk7CiAgIG1fYkNhY2hlZCA9IGZhbHNlOwogICBtX3BCaXRtYXAgPSBwSW1hZ2UtPkRldGFjaEJpdG1hcCgpOwogICBtX3BNYXNrID0gcEltYWdlLT5EZXRhY2hNYXNrKCk7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfaW1hZ2Vsb2FkZXIuaCBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9pbWFnZWxvYWRlci5oCmluZGV4IGEyNzBjNDUuLjQ5N2VmMTUgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9pbWFnZWxvYWRlci5oCisrKyBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9pbWFnZWxvYWRlci5oCkBAIC05LDEyICs5LDE0IEBACiAKICNpbmNsdWRlIDxtZW1vcnk+CiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9meF9kaWIuaCIKIAogY2xhc3MgQ1BERl9JbWFnZU9iamVjdDsKIGNsYXNzIENQREZfUGFnZVJlbmRlckNhY2hlOwogY2xhc3MgQ1BERl9SZW5kZXJTdGF0dXM7CitjbGFzcyBJRlhfUGF1c2VJbmRpY2F0b3I7CiAKIGNsYXNzIENQREZfSW1hZ2VMb2FkZXIgewogIHB1YmxpYzoKQEAgLTI2LDIzICsyOCwxOSBAQAogICAgICAgICAgICAgIGJvb2wgYlN0ZENTLAogICAgICAgICAgICAgIHVpbnQzMl90IEdyb3VwRmFtaWx5LAogICAgICAgICAgICAgIGJvb2wgYkxvYWRNYXNrLAotICAgICAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLAotICAgICAgICAgICAgIGludDMyX3QgbkRvd25zYW1wbGVXaWR0aCwKLSAgICAgICAgICAgICBpbnQzMl90IG5Eb3duc2FtcGxlSGVpZ2h0KTsKLSAgYm9vbCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMpOworICBib29sIENvbnRpbnVlKElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlLCBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyk7CiAKLSAgQ0ZYX0RJQlNvdXJjZSogbV9wQml0bWFwOwotICBDRlhfRElCU291cmNlKiBtX3BNYXNrOworICBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4gbV9wQml0bWFwOworICBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4gbV9wTWFzazsKICAgdWludDMyX3QgbV9NYXR0ZUNvbG9yOwogICBib29sIG1fYkNhY2hlZDsKIAogIHByaXZhdGU6CiAgIHZvaWQgSGFuZGxlRmFpbHVyZSgpOwogCi0gIGludDMyX3QgbV9uRG93bnNhbXBsZVdpZHRoOwotICBpbnQzMl90IG1fbkRvd25zYW1wbGVIZWlnaHQ7Ci0gIENQREZfUGFnZVJlbmRlckNhY2hlKiBtX3BDYWNoZTsKLSAgQ1BERl9JbWFnZU9iamVjdCogbV9wSW1hZ2U7CisgIFVub3duZWRQdHI8Q1BERl9QYWdlUmVuZGVyQ2FjaGU+IG1fcENhY2hlOworICBVbm93bmVkUHRyPENQREZfSW1hZ2VPYmplY3Q+IG1fcEltYWdlT2JqZWN0OwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfUkVOREVSX0NQREZfSU1BR0VMT0FERVJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9pbWFnZXJlbmRlcmVyLmNwcCBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9pbWFnZXJlbmRlcmVyLmNwcAppbmRleCAzNThkMTNlLi4xMzUxNTk3IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfaW1hZ2VyZW5kZXJlci5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX2ltYWdlcmVuZGVyZXIuY3BwCkBAIC0yNSwzMyArMjUsMzMgQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcmVuZGVyc3RhdHVzLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3RyYW5zZmVyZnVuYy5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX29jY29udGV4dC5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X21heWJlX293bmVkLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9meGdlZGV2aWNlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9tYXliZV9vd25lZC5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZGVmYXVsdHJlbmRlcmRldmljZS5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcGF0aGRhdGEuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9kaWJpdG1hcC5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2RpYnNvdXJjZS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2ltYWdlc3RyZXRjaGVyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfaW1hZ2V0cmFuc2Zvcm1lci5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCiAKICNpZmRlZiBfU0tJQV9TVVBQT1JUXwogI2luY2x1ZGUgImNvcmUvZnhnZS9za2lhL2Z4X3NraWFfZGV2aWNlLmgiCiAjZW5kaWYKIAotQ1BERl9JbWFnZVJlbmRlcmVyOjpDUERGX0ltYWdlUmVuZGVyZXIoKSB7Ci0gIG1fcFJlbmRlclN0YXR1cyA9IG51bGxwdHI7Ci0gIG1fcEltYWdlT2JqZWN0ID0gbnVsbHB0cjsKLSAgbV9SZXN1bHQgPSB0cnVlOwotICBtX1N0YXR1cyA9IDA7Ci0gIG1fRGV2aWNlSGFuZGxlID0gbnVsbHB0cjsKLSAgbV9iU3RkQ1MgPSBmYWxzZTsKLSAgbV9iUGF0dGVybkNvbG9yID0gZmFsc2U7Ci0gIG1fQmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMOwotICBtX3BQYXR0ZXJuID0gbnVsbHB0cjsKLSAgbV9wT2JqMkRldmljZSA9IG51bGxwdHI7Ci19CitDUERGX0ltYWdlUmVuZGVyZXI6OkNQREZfSW1hZ2VSZW5kZXJlcigpCisgICAgOiBtX3BSZW5kZXJTdGF0dXMobnVsbHB0ciksCisgICAgICBtX3BJbWFnZU9iamVjdChudWxscHRyKSwKKyAgICAgIG1fU3RhdHVzKDApLAorICAgICAgbV9wT2JqMkRldmljZShudWxscHRyKSwKKyAgICAgIG1fYlBhdHRlcm5Db2xvcihmYWxzZSksCisgICAgICBtX3BQYXR0ZXJuKG51bGxwdHIpLAorICAgICAgbV9iU3RkQ1MoZmFsc2UpLAorICAgICAgbV9CbGVuZFR5cGUoRlhESUJfQkxFTkRfTk9STUFMKSwKKyAgICAgIG1fUmVzdWx0KHRydWUpIHt9CiAKLUNQREZfSW1hZ2VSZW5kZXJlcjo6fkNQREZfSW1hZ2VSZW5kZXJlcigpIHsKLSAgaWYgKG1fRGV2aWNlSGFuZGxlKQotICAgIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5DYW5jZWxESUJpdHMobV9EZXZpY2VIYW5kbGUpOwotfQorQ1BERl9JbWFnZVJlbmRlcmVyOjp+Q1BERl9JbWFnZVJlbmRlcmVyKCkge30KIAogYm9vbCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0TG9hZERJQlNvdXJjZSgpIHsKICAgQ0ZYX0Zsb2F0UmVjdCBpbWFnZV9yZWN0X2YgPSBtX0ltYWdlTWF0cml4LkdldFVuaXRSZWN0KCk7CkBAIC01OSwxNCArNTksMTAgQEAKICAgaWYgKCFpbWFnZV9yZWN0LlZhbGlkKCkpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIGludCBkZXN0X3dpZHRoID0KLSAgICAgIG1fSW1hZ2VNYXRyaXguYSA+PSAwID8gaW1hZ2VfcmVjdC5XaWR0aCgpIDogLWltYWdlX3JlY3QuV2lkdGgoKTsKLSAgaW50IGRlc3RfaGVpZ2h0ID0KLSAgICAgIG1fSW1hZ2VNYXRyaXguZCA8PSAwID8gaW1hZ2VfcmVjdC5IZWlnaHQoKSA6IC1pbWFnZV9yZWN0LkhlaWdodCgpOwotICBpZiAobV9Mb2FkZXIuU3RhcnQoCi0gICAgICAgICAgbV9wSW1hZ2VPYmplY3QsIG1fcFJlbmRlclN0YXR1cy0+bV9wQ29udGV4dC0+R2V0UGFnZUNhY2hlKCksIG1fYlN0ZENTLAotICAgICAgICAgIG1fcFJlbmRlclN0YXR1cy0+bV9Hcm91cEZhbWlseSwgbV9wUmVuZGVyU3RhdHVzLT5tX2JMb2FkTWFzaywKLSAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0KSkgeworICBpZiAobV9Mb2FkZXIuU3RhcnQobV9wSW1hZ2VPYmplY3QuR2V0KCksCisgICAgICAgICAgICAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPkdldENvbnRleHQoKS0+R2V0UGFnZUNhY2hlKCksIG1fYlN0ZENTLAorICAgICAgICAgICAgICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLT5HZXRHcm91cEZhbWlseSgpLAorICAgICAgICAgICAgICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLT5HZXRMb2FkTWFzaygpLCBtX3BSZW5kZXJTdGF0dXMuR2V0KCkpKSB7CiAgICAgbV9TdGF0dXMgPSA0OwogICAgIHJldHVybiB0cnVlOwogICB9CkBAIC03NywyNiArNzMsMjMgQEAKICAgaWYgKCFtX0xvYWRlci5tX3BCaXRtYXApCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIG1fQml0bWFwQWxwaGEgPQotICAgICAgRlhTWVNfcm91bmQoMjU1ICogbV9wSW1hZ2VPYmplY3QtPm1fR2VuZXJhbFN0YXRlLkdldEZpbGxBbHBoYSgpKTsKKyAgQ1BERl9HZW5lcmFsU3RhdGUmIHN0YXRlID0gbV9wSW1hZ2VPYmplY3QtPm1fR2VuZXJhbFN0YXRlOworICBtX0JpdG1hcEFscGhhID0gRlhTWVNfcm91bmQoMjU1ICogc3RhdGUuR2V0RmlsbEFscGhhKCkpOwogICBtX3BESUJTb3VyY2UgPSBtX0xvYWRlci5tX3BCaXRtYXA7Ci0gIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucy5tX0NvbG9yTW9kZSA9PSBSRU5ERVJfQ09MT1JfQUxQSEEgJiYKKyAgaWYgKG1fcFJlbmRlclN0YXR1cy0+R2V0UmVuZGVyT3B0aW9ucygpLT5Db2xvck1vZGVJcygKKyAgICAgICAgICBDUERGX1JlbmRlck9wdGlvbnM6OmtBbHBoYSkgJiYKICAgICAgICFtX0xvYWRlci5tX3BNYXNrKSB7CiAgICAgcmV0dXJuIFN0YXJ0Qml0bWFwQWxwaGEoKTsKICAgfQotICBpZiAobV9wSW1hZ2VPYmplY3QtPm1fR2VuZXJhbFN0YXRlLkdldFRSKCkpIHsKLSAgICBpZiAoIW1fcEltYWdlT2JqZWN0LT5tX0dlbmVyYWxTdGF0ZS5HZXRUcmFuc2ZlckZ1bmMoKSkgewotICAgICAgbV9wSW1hZ2VPYmplY3QtPm1fR2VuZXJhbFN0YXRlLlNldFRyYW5zZmVyRnVuYygKLSAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPkdldFRyYW5zZmVyRnVuYygKLSAgICAgICAgICAgICAgbV9wSW1hZ2VPYmplY3QtPm1fR2VuZXJhbFN0YXRlLkdldFRSKCkpKTsKLSAgICB9Ci0gICAgaWYgKG1fcEltYWdlT2JqZWN0LT5tX0dlbmVyYWxTdGF0ZS5HZXRUcmFuc2ZlckZ1bmMoKSAmJgotICAgICAgICAhbV9wSW1hZ2VPYmplY3QtPm1fR2VuZXJhbFN0YXRlLkdldFRyYW5zZmVyRnVuYygpLT5tX2JJZGVudGl0eSkgeworICBpZiAoc3RhdGUuR2V0VFIoKSkgeworICAgIGlmICghc3RhdGUuR2V0VHJhbnNmZXJGdW5jKCkpCisgICAgICBzdGF0ZS5TZXRUcmFuc2ZlckZ1bmMobV9wUmVuZGVyU3RhdHVzLT5HZXRUcmFuc2ZlckZ1bmMoc3RhdGUuR2V0VFIoKSkpOworCisgICAgaWYgKHN0YXRlLkdldFRyYW5zZmVyRnVuYygpICYmICFzdGF0ZS5HZXRUcmFuc2ZlckZ1bmMoKS0+R2V0SWRlbnRpdHkoKSkgewogICAgICAgbV9wRElCU291cmNlID0gbV9Mb2FkZXIubV9wQml0bWFwID0KLSAgICAgICAgICBtX3BJbWFnZU9iamVjdC0+bV9HZW5lcmFsU3RhdGUuR2V0VHJhbnNmZXJGdW5jKCktPlRyYW5zbGF0ZUltYWdlKAotICAgICAgICAgICAgICBtX0xvYWRlci5tX3BCaXRtYXAsICFtX0xvYWRlci5tX2JDYWNoZWQpOworICAgICAgICAgIHN0YXRlLkdldFRyYW5zZmVyRnVuYygpLT5UcmFuc2xhdGVJbWFnZShtX0xvYWRlci5tX3BCaXRtYXApOwogICAgICAgaWYgKG1fTG9hZGVyLm1fYkNhY2hlZCAmJiBtX0xvYWRlci5tX3BNYXNrKQotICAgICAgICBtX0xvYWRlci5tX3BNYXNrID0gbV9Mb2FkZXIubV9wTWFzay0+Q2xvbmUoKS5yZWxlYXNlKCk7CisgICAgICAgIG1fTG9hZGVyLm1fcE1hc2sgPSBtX0xvYWRlci5tX3BNYXNrLT5DbG9uZShudWxscHRyKTsKICAgICAgIG1fTG9hZGVyLm1fYkNhY2hlZCA9IGZhbHNlOwogICAgIH0KICAgfQpAQCAtMTEwLDY1ICsxMDMsNTEgQEAKICAgICAgIGlmIChtX3BQYXR0ZXJuKQogICAgICAgICBtX2JQYXR0ZXJuQ29sb3IgPSB0cnVlOwogICAgIH0KLSAgICBtX0ZpbGxBcmdiID0gbV9wUmVuZGVyU3RhdHVzLT5HZXRGaWxsQXJnYihtX3BJbWFnZU9iamVjdCk7Ci0gIH0gZWxzZSBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMubV9Db2xvck1vZGUgPT0gUkVOREVSX0NPTE9SX0dSQVkpIHsKLSAgICBtX3BDbG9uZSA9IG1fcERJQlNvdXJjZS0+Q2xvbmUoKTsKLSAgICBtX3BDbG9uZS0+Q29udmVydENvbG9yU2NhbGUobV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMubV9CYWNrQ29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlbmRlclN0YXR1cy0+bV9PcHRpb25zLm1fRm9yZUNvbG9yKTsKLSAgICBtX3BESUJTb3VyY2UgPSBtX3BDbG9uZS5nZXQoKTsKKyAgICBtX0ZpbGxBcmdiID0gbV9wUmVuZGVyU3RhdHVzLT5HZXRGaWxsQXJnYihtX3BJbWFnZU9iamVjdC5HZXQoKSk7CisgIH0gZWxzZSBpZiAobV9wUmVuZGVyU3RhdHVzLT5HZXRSZW5kZXJPcHRpb25zKCktPkNvbG9yTW9kZUlzKAorICAgICAgICAgICAgICAgICBDUERGX1JlbmRlck9wdGlvbnM6OmtHcmF5KSkgeworICAgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBDbG9uZSA9IG1fcERJQlNvdXJjZS0+Q2xvbmUobnVsbHB0cik7CisgICAgaWYgKCFwQ2xvbmUpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBwQ2xvbmUtPkNvbnZlcnRDb2xvclNjYWxlKDB4ZmZmZmZmLCAwKTsKKyAgICBtX3BESUJTb3VyY2UgPSBwQ2xvbmU7CiAgIH0KICAgbV9GbGFncyA9IDA7Ci0gIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX0ZPUkNFX0RPV05TQU1QTEUpCisgIGlmIChtX3BSZW5kZXJTdGF0dXMtPkdldFJlbmRlck9wdGlvbnMoKS0+SGFzRmxhZyhSRU5ERVJfRk9SQ0VfRE9XTlNBTVBMRSkpCiAgICAgbV9GbGFncyB8PSBSRU5ERVJfRk9SQ0VfRE9XTlNBTVBMRTsKLSAgZWxzZSBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9GT1JDRV9IQUxGVE9ORSkKKyAgZWxzZSBpZiAobV9wUmVuZGVyU3RhdHVzLT5HZXRSZW5kZXJPcHRpb25zKCktPkhhc0ZsYWcoUkVOREVSX0ZPUkNFX0hBTEZUT05FKSkKICAgICBtX0ZsYWdzIHw9IFJFTkRFUl9GT1JDRV9IQUxGVE9ORTsKLSAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpICE9IEZYRENfRElTUExBWSkgewotICAgIENQREZfT2JqZWN0KiBwRmlsdGVycyA9Ci0gICAgICAgIG1fcEltYWdlT2JqZWN0LT5HZXRJbWFnZSgpLT5HZXRTdHJlYW0oKS0+R2V0RGljdCgpLT5HZXREaXJlY3RPYmplY3RGb3IoCi0gICAgICAgICAgICAiRmlsdGVyIik7Ci0gICAgaWYgKHBGaWx0ZXJzKSB7Ci0gICAgICBpZiAocEZpbHRlcnMtPklzTmFtZSgpKSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzRGVjb2RlVHlwZSA9IHBGaWx0ZXJzLT5HZXRTdHJpbmcoKTsKLSAgICAgICAgaWYgKGJzRGVjb2RlVHlwZSA9PSAiRENURGVjb2RlIiB8fCBic0RlY29kZVR5cGUgPT0gIkpQWERlY29kZSIpCi0gICAgICAgICAgbV9GbGFncyB8PSBGWFJFTkRFUl9JTUFHRV9MT1NTWTsKLSAgICAgIH0gZWxzZSBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcEZpbHRlcnMtPkFzQXJyYXkoKSkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBBcnJheS0+R2V0Q291bnQoKTsgaSsrKSB7Ci0gICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEZWNvZGVUeXBlID0gcEFycmF5LT5HZXRTdHJpbmdBdChpKTsKLSAgICAgICAgICBpZiAoYnNEZWNvZGVUeXBlID09ICJEQ1REZWNvZGUiIHx8IGJzRGVjb2RlVHlwZSA9PSAiSlBYRGVjb2RlIikgewotICAgICAgICAgICAgbV9GbGFncyB8PSBGWFJFTkRFUl9JTUFHRV9MT1NTWTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9OT0lNQUdFU01PT1RIKQorCisgIGlmIChtX3BSZW5kZXJTdGF0dXMtPkdldFJlbmRlckRldmljZSgpLT5HZXREZXZpY2VDbGFzcygpICE9IEZYRENfRElTUExBWSkKKyAgICBIYW5kbGVGaWx0ZXJzKCk7CisKKyAgaWYgKG1fcFJlbmRlclN0YXR1cy0+R2V0UmVuZGVyT3B0aW9ucygpLT5IYXNGbGFnKFJFTkRFUl9OT0lNQUdFU01PT1RIKSkKICAgICBtX0ZsYWdzIHw9IEZYRElCX05PU01PT1RIOwogICBlbHNlIGlmIChtX3BJbWFnZU9iamVjdC0+R2V0SW1hZ2UoKS0+SXNJbnRlcnBvbCgpKQogICAgIG1fRmxhZ3MgfD0gRlhESUJfSU5URVJQT0w7CisKICAgaWYgKG1fTG9hZGVyLm1fcE1hc2spCiAgICAgcmV0dXJuIERyYXdNYXNrZWRJbWFnZSgpOwogCiAgIGlmIChtX2JQYXR0ZXJuQ29sb3IpCi0gICAgcmV0dXJuIERyYXdQYXR0ZXJuSW1hZ2UobV9wT2JqMkRldmljZSk7CisgICAgcmV0dXJuIERyYXdQYXR0ZXJuSW1hZ2UobV9wT2JqMkRldmljZS5HZXQoKSk7CiAKLSAgaWYgKG1fQml0bWFwQWxwaGEgIT0gMjU1IHx8ICFtX3BJbWFnZU9iamVjdC0+bV9HZW5lcmFsU3RhdGUgfHwKLSAgICAgICFtX3BJbWFnZU9iamVjdC0+bV9HZW5lcmFsU3RhdGUuR2V0RmlsbE9QKCkgfHwKLSAgICAgIG1fcEltYWdlT2JqZWN0LT5tX0dlbmVyYWxTdGF0ZS5HZXRPUE1vZGUoKSAhPSAwIHx8Ci0gICAgICBtX3BJbWFnZU9iamVjdC0+bV9HZW5lcmFsU3RhdGUuR2V0QmxlbmRUeXBlKCkgIT0gRlhESUJfQkxFTkRfTk9STUFMIHx8Ci0gICAgICBtX3BJbWFnZU9iamVjdC0+bV9HZW5lcmFsU3RhdGUuR2V0U3Ryb2tlQWxwaGEoKSAhPSAxLjBmIHx8Ci0gICAgICBtX3BJbWFnZU9iamVjdC0+bV9HZW5lcmFsU3RhdGUuR2V0RmlsbEFscGhhKCkgIT0gMS4wZikgeworICBpZiAobV9CaXRtYXBBbHBoYSAhPSAyNTUgfHwgIXN0YXRlLkhhc1JlZigpIHx8ICFzdGF0ZS5HZXRGaWxsT1AoKSB8fAorICAgICAgc3RhdGUuR2V0T1BNb2RlKCkgIT0gMCB8fCBzdGF0ZS5HZXRCbGVuZFR5cGUoKSAhPSBGWERJQl9CTEVORF9OT1JNQUwgfHwKKyAgICAgIHN0YXRlLkdldFN0cm9rZUFscGhhKCkgIT0gMS4wZiB8fCBzdGF0ZS5HZXRGaWxsQWxwaGEoKSAhPSAxLjBmKSB7CiAgICAgcmV0dXJuIFN0YXJ0RElCU291cmNlKCk7CiAgIH0KICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gbnVsbHB0cjsKICAgQ1BERl9QYWdlKiBwUGFnZSA9IG51bGxwdHI7Ci0gIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fcENvbnRleHQtPkdldFBhZ2VDYWNoZSgpKSB7Ci0gICAgcFBhZ2UgPSBtX3BSZW5kZXJTdGF0dXMtPm1fcENvbnRleHQtPkdldFBhZ2VDYWNoZSgpLT5HZXRQYWdlKCk7Ci0gICAgcERvY3VtZW50ID0gcFBhZ2UtPm1fcERvY3VtZW50OworICBpZiAoYXV0byogcFBhZ2VDYWNoZSA9IG1fcFJlbmRlclN0YXR1cy0+R2V0Q29udGV4dCgpLT5HZXRQYWdlQ2FjaGUoKSkgeworICAgIHBQYWdlID0gcFBhZ2VDYWNoZS0+R2V0UGFnZSgpOworICAgIHBEb2N1bWVudCA9IHBQYWdlLT5tX3BEb2N1bWVudC5HZXQoKTsKICAgfSBlbHNlIHsKICAgICBwRG9jdW1lbnQgPSBtX3BJbWFnZU9iamVjdC0+R2V0SW1hZ2UoKS0+R2V0RG9jdW1lbnQoKTsKICAgfQotICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzID0gcFBhZ2UgPyBwUGFnZS0+bV9wUGFnZVJlc291cmNlcyA6IG51bGxwdHI7CisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VSZXNvdXJjZXMgPQorICAgICAgcFBhZ2UgPyBwUGFnZS0+bV9wUGFnZVJlc291cmNlcy5HZXQoKSA6IG51bGxwdHI7CiAgIENQREZfT2JqZWN0KiBwQ1NPYmogPQogICAgICAgbV9wSW1hZ2VPYmplY3QtPkdldEltYWdlKCktPkdldFN0cmVhbSgpLT5HZXREaWN0KCktPkdldERpcmVjdE9iamVjdEZvcigKICAgICAgICAgICAiQ29sb3JTcGFjZSIpOwpAQCAtMTg2LDE4ICsxNjUsMjAgQEAKIH0KIAogYm9vbCBDUERGX0ltYWdlUmVuZGVyZXI6OlN0YXJ0KENQREZfUmVuZGVyU3RhdHVzKiBwU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFnZU9iamVjdCogcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ltYWdlT2JqZWN0KiBwSW1hZ2VPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3RkQ1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kVHlwZSkgeworICBBU1NFUlQocEltYWdlT2JqZWN0KTsKICAgbV9wUmVuZGVyU3RhdHVzID0gcFN0YXR1czsKICAgbV9iU3RkQ1MgPSBiU3RkQ1M7Ci0gIG1fcEltYWdlT2JqZWN0ID0gcE9iai0+QXNJbWFnZSgpOworICBtX3BJbWFnZU9iamVjdCA9IHBJbWFnZU9iamVjdDsKICAgbV9CbGVuZFR5cGUgPSBibGVuZFR5cGU7CiAgIG1fcE9iajJEZXZpY2UgPSBwT2JqMkRldmljZTsKICAgQ1BERl9EaWN0aW9uYXJ5KiBwT0MgPSBtX3BJbWFnZU9iamVjdC0+R2V0SW1hZ2UoKS0+R2V0T0MoKTsKLSAgaWYgKHBPQyAmJiBtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucy5tX3BPQ0NvbnRleHQgJiYKLSAgICAgICFtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucy5tX3BPQ0NvbnRleHQtPkNoZWNrT0NHVmlzaWJsZShwT0MpKSB7CisgIGlmIChwT0MgJiYgbV9wUmVuZGVyU3RhdHVzLT5HZXRSZW5kZXJPcHRpb25zKCktPkdldE9DQ29udGV4dCgpICYmCisgICAgICAhbV9wUmVuZGVyU3RhdHVzLT5HZXRSZW5kZXJPcHRpb25zKCktPkdldE9DQ29udGV4dCgpLT5DaGVja09DR1Zpc2libGUoCisgICAgICAgICAgcE9DKSkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQogICBtX0ltYWdlTWF0cml4ID0gbV9wSW1hZ2VPYmplY3QtPm1hdHJpeCgpOwpAQCAtMjA4LDcgKzE4OSw3IEBACiB9CiAKIGJvb2wgQ1BERl9JbWFnZVJlbmRlcmVyOjpTdGFydChDUERGX1JlbmRlclN0YXR1cyogcFN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwRElCU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcERJQlNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGJpdG1hcF9hcmdiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcEltYWdlMkRldmljZSwKQEAgLTIyNywxMyArMjA4LDE0IEBACiB9CiAKIGJvb2wgQ1BERl9JbWFnZVJlbmRlcmVyOjpOb3REcmF3aW5nKCkgY29uc3QgewotICByZXR1cm4gbV9wUmVuZGVyU3RhdHVzLT5tX2JQcmludCAmJgotICAgICAgICAgIShtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19CTEVORF9NT0RFKTsKKyAgcmV0dXJuIG1fcFJlbmRlclN0YXR1cy0+SXNQcmludCgpICYmCisgICAgICAgICAhKG1fcFJlbmRlclN0YXR1cy0+R2V0UmVuZGVyRGV2aWNlKCktPkdldFJlbmRlckNhcHMoKSAmCisgICAgICAgICAgIEZYUkNfQkxFTkRfTU9ERSk7CiB9CiAKIEZYX1JFQ1QgQ1BERl9JbWFnZVJlbmRlcmVyOjpHZXREcmF3UmVjdCgpIGNvbnN0IHsKICAgRlhfUkVDVCByZWN0ID0gbV9JbWFnZU1hdHJpeC5HZXRVbml0UmVjdCgpLkdldE91dGVyUmVjdCgpOwotICByZWN0LkludGVyc2VjdChtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+R2V0Q2xpcEJveCgpKTsKKyAgcmVjdC5JbnRlcnNlY3QobV9wUmVuZGVyU3RhdHVzLT5HZXRSZW5kZXJEZXZpY2UoKS0+R2V0Q2xpcEJveCgpKTsKICAgcmV0dXJuIHJlY3Q7CiB9CiAKQEAgLTI0MywxNSArMjI1LDE2IEBACiAgIHJldHVybiBuZXdfbWF0cml4OwogfQogCi12b2lkIENQREZfSW1hZ2VSZW5kZXJlcjo6Q2FsY3VsYXRlRHJhd0ltYWdlKENGWF9GeGdlRGV2aWNlKiBwQml0bWFwRGV2aWNlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0Z4Z2VEZXZpY2UqIHBCaXRtYXBEZXZpY2UyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwRElCU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTmV3TWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUJiByZWN0KSBjb25zdCB7Cit2b2lkIENQREZfSW1hZ2VSZW5kZXJlcjo6Q2FsY3VsYXRlRHJhd0ltYWdlKAorICAgIENGWF9EZWZhdWx0UmVuZGVyRGV2aWNlKiBwQml0bWFwRGV2aWNlMSwKKyAgICBDRlhfRGVmYXVsdFJlbmRlckRldmljZSogcEJpdG1hcERldmljZTIsCisgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwRElCU291cmNlLAorICAgIENGWF9NYXRyaXgqIHBOZXdNYXRyaXgsCisgICAgY29uc3QgRlhfUkVDVCYgcmVjdCkgY29uc3QgewogICBDUERGX1JlbmRlclN0YXR1cyBiaXRtYXBfcmVuZGVyOwotICBiaXRtYXBfcmVuZGVyLkluaXRpYWxpemUobV9wUmVuZGVyU3RhdHVzLT5tX3BDb250ZXh0LCBwQml0bWFwRGV2aWNlMiwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fYkRyb3BPYmplY3RzLCBudWxscHRyLCB0cnVlKTsKKyAgYml0bWFwX3JlbmRlci5Jbml0aWFsaXplKG1fcFJlbmRlclN0YXR1cy0+R2V0Q29udGV4dCgpLCBwQml0bWFwRGV2aWNlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPkdldERyb3BPYmplY3RzKCksIG51bGxwdHIsIHRydWUpOwogICBDUERGX0ltYWdlUmVuZGVyZXIgaW1hZ2VfcmVuZGVyOwogICBpZiAoaW1hZ2VfcmVuZGVyLlN0YXJ0KCZiaXRtYXBfcmVuZGVyLCBwRElCU291cmNlLCAweGZmZmZmZmZmLCAyNTUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcE5ld01hdHJpeCwgbV9GbGFncywgdHJ1ZSwgRlhESUJfQkxFTkRfTk9STUFMKSkgewpAQCAtMjczLDExICsyNTYsMTEgQEAKICAgICAgICAgY29udGludWU7CiAgICAgICB9CiAgICAgICBpbnQgb3JpZyA9ICgqZGVzdF9zY2FuIC0gbWF0dGVfYikgKiAyNTUgLyBhbHBoYSArIG1hdHRlX2I7Ci0gICAgICAqZGVzdF9zY2FuKysgPSBzdGQ6Om1pbihzdGQ6Om1heChvcmlnLCAwKSwgMjU1KTsKKyAgICAgICpkZXN0X3NjYW4rKyA9IHBkZml1bTo6Y2xhbXAob3JpZywgMCwgMjU1KTsKICAgICAgIG9yaWcgPSAoKmRlc3Rfc2NhbiAtIG1hdHRlX2cpICogMjU1IC8gYWxwaGEgKyBtYXR0ZV9nOwotICAgICAgKmRlc3Rfc2NhbisrID0gc3RkOjptaW4oc3RkOjptYXgob3JpZywgMCksIDI1NSk7CisgICAgICAqZGVzdF9zY2FuKysgPSBwZGZpdW06OmNsYW1wKG9yaWcsIDAsIDI1NSk7CiAgICAgICBvcmlnID0gKCpkZXN0X3NjYW4gLSBtYXR0ZV9yKSAqIDI1NSAvIGFscGhhICsgbWF0dGVfcjsKLSAgICAgICpkZXN0X3NjYW4rKyA9IHN0ZDo6bWluKHN0ZDo6bWF4KG9yaWcsIDApLCAyNTUpOworICAgICAgKmRlc3Rfc2NhbisrID0gcGRmaXVtOjpjbGFtcChvcmlnLCAwLCAyNTUpOwogICAgICAgZGVzdF9zY2FuKys7CiAgICAgfQogICB9CkBAIC0yOTQsMjggKzI3NywyOSBAQAogICAgIHJldHVybiBmYWxzZTsKIAogICBDRlhfTWF0cml4IG5ld19tYXRyaXggPSBHZXREcmF3TWF0cml4KHJlY3QpOwotICBDRlhfRnhnZURldmljZSBiaXRtYXBfZGV2aWNlMTsKKyAgQ0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2UgYml0bWFwX2RldmljZTE7CiAgIGlmICghYml0bWFwX2RldmljZTEuQ3JlYXRlKHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgRlhESUJfUmdiMzIsIG51bGxwdHIpKQogICAgIHJldHVybiB0cnVlOwogCiAgIGJpdG1hcF9kZXZpY2UxLkdldEJpdG1hcCgpLT5DbGVhcigweGZmZmZmZik7CiAgIENQREZfUmVuZGVyU3RhdHVzIGJpdG1hcF9yZW5kZXI7Ci0gIGJpdG1hcF9yZW5kZXIuSW5pdGlhbGl6ZShtX3BSZW5kZXJTdGF0dXMtPm1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlMSwKKyAgYml0bWFwX3JlbmRlci5Jbml0aWFsaXplKG1fcFJlbmRlclN0YXR1cy0+R2V0Q29udGV4dCgpLCAmYml0bWFwX2RldmljZTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fcFJlbmRlclN0YXR1cy0+bV9PcHRpb25zLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLT5tX2JEcm9wT2JqZWN0cywgbnVsbHB0ciwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPkdldFJlbmRlck9wdGlvbnMoKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlbmRlclN0YXR1cy0+R2V0RHJvcE9iamVjdHMoKSwgbnVsbHB0ciwgdHJ1ZSk7CiAgIENGWF9NYXRyaXggcGF0dGVybkRldmljZSA9ICpwT2JqMkRldmljZTsKLSAgcGF0dGVybkRldmljZS5UcmFuc2xhdGUoKEZYX0ZMT0FUKS1yZWN0LmxlZnQsIChGWF9GTE9BVCktcmVjdC50b3ApOworICBwYXR0ZXJuRGV2aWNlLlRyYW5zbGF0ZShzdGF0aWNfY2FzdDxmbG9hdD4oLXJlY3QubGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PigtcmVjdC50b3ApKTsKICAgaWYgKENQREZfVGlsaW5nUGF0dGVybiogcFRpbGluZ1BhdHRlcm4gPSBtX3BQYXR0ZXJuLT5Bc1RpbGluZ1BhdHRlcm4oKSkgewotICAgIGJpdG1hcF9yZW5kZXIuRHJhd1RpbGluZ1BhdHRlcm4ocFRpbGluZ1BhdHRlcm4sIG1fcEltYWdlT2JqZWN0LAorICAgIGJpdG1hcF9yZW5kZXIuRHJhd1RpbGluZ1BhdHRlcm4ocFRpbGluZ1BhdHRlcm4sIG1fcEltYWdlT2JqZWN0LkdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdHRlcm5EZXZpY2UsIGZhbHNlKTsKICAgfSBlbHNlIGlmIChDUERGX1NoYWRpbmdQYXR0ZXJuKiBwU2hhZGluZ1BhdHRlcm4gPQogICAgICAgICAgICAgICAgICBtX3BQYXR0ZXJuLT5Bc1NoYWRpbmdQYXR0ZXJuKCkpIHsKLSAgICBiaXRtYXBfcmVuZGVyLkRyYXdTaGFkaW5nUGF0dGVybihwU2hhZGluZ1BhdHRlcm4sIG1fcEltYWdlT2JqZWN0LAorICAgIGJpdG1hcF9yZW5kZXIuRHJhd1NoYWRpbmdQYXR0ZXJuKHBTaGFkaW5nUGF0dGVybiwgbV9wSW1hZ2VPYmplY3QuR2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdHRlcm5EZXZpY2UsIGZhbHNlKTsKICAgfQogCi0gIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2UyOworICBDRlhfRGVmYXVsdFJlbmRlckRldmljZSBiaXRtYXBfZGV2aWNlMjsKICAgaWYgKCFiaXRtYXBfZGV2aWNlMi5DcmVhdGUocmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpLCBGWERJQl84YnBwUmdiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSkgewogICAgIHJldHVybiB0cnVlOwpAQCAtMzI2LDcgKzMxMCw3IEBACiAgIGJpdG1hcF9kZXZpY2UyLkdldEJpdG1hcCgpLT5Db252ZXJ0Rm9ybWF0KEZYRElCXzhicHBNYXNrKTsKICAgYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCktPk11bHRpcGx5QWxwaGEoYml0bWFwX2RldmljZTIuR2V0Qml0bWFwKCkpOwogICBiaXRtYXBfZGV2aWNlMS5HZXRCaXRtYXAoKS0+TXVsdGlwbHlBbHBoYSgyNTUpOwotICBtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+U2V0RElCaXRzV2l0aEJsZW5kKAorICBtX3BSZW5kZXJTdGF0dXMtPkdldFJlbmRlckRldmljZSgpLT5TZXRESUJpdHNXaXRoQmxlbmQoCiAgICAgICBiaXRtYXBfZGV2aWNlMS5HZXRCaXRtYXAoKSwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgbV9CbGVuZFR5cGUpOwogICByZXR1cm4gZmFsc2U7CiB9CkBAIC0zNDIsNyArMzI2LDcgQEAKICAgICByZXR1cm4gZmFsc2U7CiAKICAgQ0ZYX01hdHJpeCBuZXdfbWF0cml4ID0gR2V0RHJhd01hdHJpeChyZWN0KTsKLSAgQ0ZYX0Z4Z2VEZXZpY2UgYml0bWFwX2RldmljZTE7CisgIENGWF9EZWZhdWx0UmVuZGVyRGV2aWNlIGJpdG1hcF9kZXZpY2UxOwogICBpZiAoIWJpdG1hcF9kZXZpY2UxLkNyZWF0ZShyZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCksIEZYRElCX1JnYjMyLCBudWxscHRyKSkKICAgICByZXR1cm4gdHJ1ZTsKIApAQCAtMzUyLDE1ICszMzYsMTUgQEAKICAgYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCktPkNsZWFyKDB4ZmZmZmZmKTsKICNlbmRpZgogICBDUERGX1JlbmRlclN0YXR1cyBiaXRtYXBfcmVuZGVyOwotICBiaXRtYXBfcmVuZGVyLkluaXRpYWxpemUobV9wUmVuZGVyU3RhdHVzLT5tX3BDb250ZXh0LCAmYml0bWFwX2RldmljZTEsCisgIGJpdG1hcF9yZW5kZXIuSW5pdGlhbGl6ZShtX3BSZW5kZXJTdGF0dXMtPkdldENvbnRleHQoKSwgJmJpdG1hcF9kZXZpY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFJlbmRlclN0YXR1cy0+bV9iRHJvcE9iamVjdHMsIG51bGxwdHIsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wUmVuZGVyU3RhdHVzLT5HZXREcm9wT2JqZWN0cygpLCBudWxscHRyLCB0cnVlKTsKICAgQ1BERl9JbWFnZVJlbmRlcmVyIGltYWdlX3JlbmRlcjsKICAgaWYgKGltYWdlX3JlbmRlci5TdGFydCgmYml0bWFwX3JlbmRlciwgbV9wRElCU291cmNlLCAwLCAyNTUsICZuZXdfbWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgIG1fRmxhZ3MsIHRydWUsIEZYRElCX0JMRU5EX05PUk1BTCkpIHsKICAgICBpbWFnZV9yZW5kZXIuQ29udGludWUobnVsbHB0cik7CiAgIH0KLSAgQ0ZYX0Z4Z2VEZXZpY2UgYml0bWFwX2RldmljZTI7CisgIENGWF9EZWZhdWx0UmVuZGVyRGV2aWNlIGJpdG1hcF9kZXZpY2UyOwogICBpZiAoIWJpdG1hcF9kZXZpY2UyLkNyZWF0ZShyZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCksIEZYRElCXzhicHBSZ2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKQogICAgIHJldHVybiB0cnVlOwpAQCAtMzczLDcgKzM1Nyw3IEBACiAgIENhbGN1bGF0ZURyYXdJbWFnZSgmYml0bWFwX2RldmljZTEsICZiaXRtYXBfZGV2aWNlMiwgbV9Mb2FkZXIubV9wTWFzaywKICAgICAgICAgICAgICAgICAgICAgICZuZXdfbWF0cml4LCByZWN0KTsKICNpZmRlZiBfU0tJQV9TVVBQT1JUXwotICBtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+U2V0Qml0c1dpdGhNYXNrKAorICBtX3BSZW5kZXJTdGF0dXMtPkdldFJlbmRlckRldmljZSgpLT5TZXRCaXRzV2l0aE1hc2soCiAgICAgICBiaXRtYXBfZGV2aWNlMS5HZXRCaXRtYXAoKSwgYml0bWFwX2RldmljZTIuR2V0Qml0bWFwKCksIHJlY3QubGVmdCwKICAgICAgIHJlY3QudG9wLCBtX0JpdG1hcEFscGhhLCBtX0JsZW5kVHlwZSk7CiAjZWxzZQpAQCAtMzgxLDcgKzM2NSw3IEBACiAgIGJpdG1hcF9kZXZpY2UxLkdldEJpdG1hcCgpLT5NdWx0aXBseUFscGhhKGJpdG1hcF9kZXZpY2UyLkdldEJpdG1hcCgpKTsKICAgaWYgKG1fQml0bWFwQWxwaGEgPCAyNTUpCiAgICAgYml0bWFwX2RldmljZTEuR2V0Qml0bWFwKCktPk11bHRpcGx5QWxwaGEobV9CaXRtYXBBbHBoYSk7Ci0gIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TZXRESUJpdHNXaXRoQmxlbmQoCisgIG1fcFJlbmRlclN0YXR1cy0+R2V0UmVuZGVyRGV2aWNlKCktPlNldERJQml0c1dpdGhCbGVuZCgKICAgICAgIGJpdG1hcF9kZXZpY2UxLkdldEJpdG1hcCgpLCByZWN0LmxlZnQsIHJlY3QudG9wLCBtX0JsZW5kVHlwZSk7CiAjZW5kaWYgIC8vICBfU0tJQV9TVVBQT1JUXwogICByZXR1cm4gZmFsc2U7CkBAIC00MDIsMTIgKzM4NiwxMiBAQAogICAgIH0KICAgfQogI2lmZGVmIF9TS0lBX1NVUFBPUlRfCi0gIENGWF9ESUJpdG1hcCogcHJlbXVsdGlwbGllZCA9IG1fcERJQlNvdXJjZS0+Q2xvbmUoKS5yZWxlYXNlKCk7CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHByZW11bHRpcGxpZWQgPSBtX3BESUJTb3VyY2UtPkNsb25lKG51bGxwdHIpOwogICBpZiAobV9wRElCU291cmNlLT5IYXNBbHBoYSgpKQogICAgIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpQcmVNdWx0aXBseShwcmVtdWx0aXBsaWVkKTsKLSAgaWYgKG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TdGFydERJQml0c1dpdGhCbGVuZCgKKyAgaWYgKG1fcFJlbmRlclN0YXR1cy0+R2V0UmVuZGVyRGV2aWNlKCktPlN0YXJ0RElCaXRzV2l0aEJsZW5kKAogICAgICAgICAgIHByZW11bHRpcGxpZWQsIG1fQml0bWFwQWxwaGEsIG1fRmlsbEFyZ2IsICZtX0ltYWdlTWF0cml4LCBtX0ZsYWdzLAotICAgICAgICAgIG1fRGV2aWNlSGFuZGxlLCBtX0JsZW5kVHlwZSkpIHsKKyAgICAgICAgICAmbV9EZXZpY2VIYW5kbGUsIG1fQmxlbmRUeXBlKSkgewogICAgIGlmIChtX0RldmljZUhhbmRsZSkgewogICAgICAgbV9TdGF0dXMgPSAzOwogICAgICAgcmV0dXJuIHRydWU7CkBAIC00MTUsOSArMzk5LDkgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KICNlbHNlCi0gIGlmIChtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+U3RhcnRESUJpdHNXaXRoQmxlbmQoCisgIGlmIChtX3BSZW5kZXJTdGF0dXMtPkdldFJlbmRlckRldmljZSgpLT5TdGFydERJQml0c1dpdGhCbGVuZCgKICAgICAgICAgICBtX3BESUJTb3VyY2UsIG1fQml0bWFwQWxwaGEsIG1fRmlsbEFyZ2IsICZtX0ltYWdlTWF0cml4LCBtX0ZsYWdzLAotICAgICAgICAgIG1fRGV2aWNlSGFuZGxlLCBtX0JsZW5kVHlwZSkpIHsKKyAgICAgICAgICAmbV9EZXZpY2VIYW5kbGUsIG1fQmxlbmRUeXBlKSkgewogICAgIGlmIChtX0RldmljZUhhbmRsZSkgewogICAgICAgbV9TdGF0dXMgPSAzOwogICAgICAgcmV0dXJuIHRydWU7CkBAIC00MjksMTkgKzQxMywxOCBAQAogICBGWF9SRUNUIGltYWdlX3JlY3QgPSBpbWFnZV9yZWN0X2YuR2V0T3V0ZXJSZWN0KCk7CiAgIGludCBkZXN0X3dpZHRoID0gaW1hZ2VfcmVjdC5XaWR0aCgpOwogICBpbnQgZGVzdF9oZWlnaHQgPSBpbWFnZV9yZWN0LkhlaWdodCgpOwotICBpZiAoKEZYU1lTX2ZhYnMobV9JbWFnZU1hdHJpeC5iKSA+PSAwLjVmIHx8IG1fSW1hZ2VNYXRyaXguYSA9PSAwKSB8fAotICAgICAgKEZYU1lTX2ZhYnMobV9JbWFnZU1hdHJpeC5jKSA+PSAwLjVmIHx8IG1fSW1hZ2VNYXRyaXguZCA9PSAwKSkgeworICBpZiAoKGZhYnMobV9JbWFnZU1hdHJpeC5iKSA+PSAwLjVmIHx8IG1fSW1hZ2VNYXRyaXguYSA9PSAwKSB8fAorICAgICAgKGZhYnMobV9JbWFnZU1hdHJpeC5jKSA+PSAwLjVmIHx8IG1fSW1hZ2VNYXRyaXguZCA9PSAwKSkgewogICAgIGlmIChOb3REcmF3aW5nKCkpIHsKICAgICAgIG1fUmVzdWx0ID0gZmFsc2U7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgRlhfUkVDVCBjbGlwX2JveCA9IG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7CisgICAgRlhfUkVDVCBjbGlwX2JveCA9IG1fcFJlbmRlclN0YXR1cy0+R2V0UmVuZGVyRGV2aWNlKCktPkdldENsaXBCb3goKTsKICAgICBjbGlwX2JveC5JbnRlcnNlY3QoaW1hZ2VfcmVjdCk7CiAgICAgbV9TdGF0dXMgPSAyOwogICAgIG1fcFRyYW5zZm9ybWVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9JbWFnZVRyYW5zZm9ybWVyPigKICAgICAgICAgbV9wRElCU291cmNlLCAmbV9JbWFnZU1hdHJpeCwgbV9GbGFncywgJmNsaXBfYm94KTsKLSAgICBtX3BUcmFuc2Zvcm1lci0+U3RhcnQoKTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogICBpZiAobV9JbWFnZU1hdHJpeC5hIDwgMCkKQEAgLTQ1Myw3ICs0MzYsNyBAQAogICBpbnQgZGVzdF9sZWZ0ID0gZGVzdF93aWR0aCA+IDAgPyBpbWFnZV9yZWN0LmxlZnQgOiBpbWFnZV9yZWN0LnJpZ2h0OwogICBpbnQgZGVzdF90b3AgPSBkZXN0X2hlaWdodCA+IDAgPyBpbWFnZV9yZWN0LnRvcCA6IGltYWdlX3JlY3QuYm90dG9tOwogICBpZiAobV9wRElCU291cmNlLT5Jc09wYXF1ZUltYWdlKCkgJiYgbV9CaXRtYXBBbHBoYSA9PSAyNTUpIHsKLSAgICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlN0cmV0Y2hESUJpdHNXaXRoRmxhZ3NBbmRCbGVuZCgKKyAgICBpZiAobV9wUmVuZGVyU3RhdHVzLT5HZXRSZW5kZXJEZXZpY2UoKS0+U3RyZXRjaERJQml0c1dpdGhGbGFnc0FuZEJsZW5kKAogICAgICAgICAgICAgbV9wRElCU291cmNlLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgbV9GbGFncywKICAgICAgICAgICAgIG1fQmxlbmRUeXBlKSkgewogICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNDYyLDcgKzQ0NSw3IEBACiAgIGlmIChtX3BESUJTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKICAgICBpZiAobV9CaXRtYXBBbHBoYSAhPSAyNTUpCiAgICAgICBtX0ZpbGxBcmdiID0gRlhBUkdCX01VTF9BTFBIQShtX0ZpbGxBcmdiLCBtX0JpdG1hcEFscGhhKTsKLSAgICBpZiAobV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlN0cmV0Y2hCaXRNYXNrV2l0aEZsYWdzKAorICAgIGlmIChtX3BSZW5kZXJTdGF0dXMtPkdldFJlbmRlckRldmljZSgpLT5TdHJldGNoQml0TWFza1dpdGhGbGFncygKICAgICAgICAgICAgIG1fcERJQlNvdXJjZSwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsCiAgICAgICAgICAgICBtX0ZpbGxBcmdiLCBtX0ZsYWdzKSkgewogICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNDczLDE2ICs0NTYsMTYgQEAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCi0gIEZYX1JFQ1QgY2xpcF9ib3ggPSBtX3BSZW5kZXJTdGF0dXMtPm1fcERldmljZS0+R2V0Q2xpcEJveCgpOworICBGWF9SRUNUIGNsaXBfYm94ID0gbV9wUmVuZGVyU3RhdHVzLT5HZXRSZW5kZXJEZXZpY2UoKS0+R2V0Q2xpcEJveCgpOwogICBGWF9SRUNUIGRlc3RfcmVjdCA9IGNsaXBfYm94OwogICBkZXN0X3JlY3QuSW50ZXJzZWN0KGltYWdlX3JlY3QpOwogICBGWF9SRUNUIGRlc3RfY2xpcCgKICAgICAgIGRlc3RfcmVjdC5sZWZ0IC0gaW1hZ2VfcmVjdC5sZWZ0LCBkZXN0X3JlY3QudG9wIC0gaW1hZ2VfcmVjdC50b3AsCiAgICAgICBkZXN0X3JlY3QucmlnaHQgLSBpbWFnZV9yZWN0LmxlZnQsIGRlc3RfcmVjdC5ib3R0b20gLSBpbWFnZV9yZWN0LnRvcCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IHBTdHJldGNoZWQoCi0gICAgICBtX3BESUJTb3VyY2UtPlN0cmV0Y2hUbyhkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgbV9GbGFncywgJmRlc3RfY2xpcCkpOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwU3RyZXRjaGVkID0KKyAgICAgIG1fcERJQlNvdXJjZS0+U3RyZXRjaFRvKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBtX0ZsYWdzLCAmZGVzdF9jbGlwKTsKICAgaWYgKHBTdHJldGNoZWQpIHsKLSAgICBtX3BSZW5kZXJTdGF0dXMtPkNvbXBvc2l0ZURJQml0bWFwKHBTdHJldGNoZWQuZ2V0KCksIGRlc3RfcmVjdC5sZWZ0LAorICAgIG1fcFJlbmRlclN0YXR1cy0+Q29tcG9zaXRlRElCaXRtYXAocFN0cmV0Y2hlZCwgZGVzdF9yZWN0LmxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3JlY3QudG9wLCBtX0ZpbGxBcmdiLCBtX0JpdG1hcEFscGhhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbGVuZFR5cGUsIGZhbHNlKTsKICAgfQpAQCAtNDk2LDI3ICs0NzksMjYgQEAKICAgICBwYXRoLlRyYW5zZm9ybSgmbV9JbWFnZU1hdHJpeCk7CiAgICAgdWludDMyX3QgZmlsbF9jb2xvciA9CiAgICAgICAgIEFyZ2JFbmNvZGUoMHhmZiwgbV9CaXRtYXBBbHBoYSwgbV9CaXRtYXBBbHBoYSwgbV9CaXRtYXBBbHBoYSk7Ci0gICAgbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBudWxscHRyLCBudWxscHRyLCBmaWxsX2NvbG9yLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfV0lORElORyk7CisgICAgbV9wUmVuZGVyU3RhdHVzLT5HZXRSZW5kZXJEZXZpY2UoKS0+RHJhd1BhdGgoJnBhdGgsIG51bGxwdHIsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9jb2xvciwgMCwgRlhGSUxMX1dJTkRJTkcpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQotICBDRlhfTWF5YmVPd25lZDxDRlhfRElCU291cmNlPiBwQWxwaGFNYXNrOworICBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4gcEFscGhhTWFzazsKICAgaWYgKG1fcERJQlNvdXJjZS0+SXNBbHBoYU1hc2soKSkKLSAgICBwQWxwaGFNYXNrID0gY29uc3RfY2FzdDxDRlhfRElCU291cmNlKj4obV9wRElCU291cmNlKTsKKyAgICBwQWxwaGFNYXNrID0gbV9wRElCU291cmNlOwogICBlbHNlCiAgICAgcEFscGhhTWFzayA9IG1fcERJQlNvdXJjZS0+Q2xvbmVBbHBoYU1hc2soKTsKIAotICBpZiAoRlhTWVNfZmFicyhtX0ltYWdlTWF0cml4LmIpID49IDAuNWYgfHwKLSAgICAgIEZYU1lTX2ZhYnMobV9JbWFnZU1hdHJpeC5jKSA+PSAwLjVmKSB7CisgIGlmIChmYWJzKG1fSW1hZ2VNYXRyaXguYikgPj0gMC41ZiB8fCBmYWJzKG1fSW1hZ2VNYXRyaXguYykgPj0gMC41ZikgewogICAgIGludCBsZWZ0OwogICAgIGludCB0b3A7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gcFRyYW5zZm9ybWVkID0KLSAgICAgICAgcEFscGhhTWFzay0+VHJhbnNmb3JtVG8oJm1fSW1hZ2VNYXRyaXgsIGxlZnQsIHRvcCk7CisgICAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcFRyYW5zZm9ybWVkID0KKyAgICAgICAgcEFscGhhTWFzay0+VHJhbnNmb3JtVG8oJm1fSW1hZ2VNYXRyaXgsICZsZWZ0LCAmdG9wKTsKICAgICBpZiAoIXBUcmFuc2Zvcm1lZCkKICAgICAgIHJldHVybiB0cnVlOwogCi0gICAgbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlNldEJpdE1hc2soCi0gICAgICAgIHBUcmFuc2Zvcm1lZC5nZXQoKSwgbGVmdCwgdG9wLAorICAgIG1fcFJlbmRlclN0YXR1cy0+R2V0UmVuZGVyRGV2aWNlKCktPlNldEJpdE1hc2soCisgICAgICAgIHBUcmFuc2Zvcm1lZCwgbGVmdCwgdG9wLAogICAgICAgICBBcmdiRW5jb2RlKDB4ZmYsIG1fQml0bWFwQWxwaGEsIG1fQml0bWFwQWxwaGEsIG1fQml0bWFwQWxwaGEpKTsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KQEAgLTUyOCw0MSArNTEwLDQzIEBACiAgICAgICBtX0ltYWdlTWF0cml4LmQgPiAwID8gLWltYWdlX3JlY3QuSGVpZ2h0KCkgOiBpbWFnZV9yZWN0LkhlaWdodCgpOwogICBpbnQgbGVmdCA9IGRlc3Rfd2lkdGggPiAwID8gaW1hZ2VfcmVjdC5sZWZ0IDogaW1hZ2VfcmVjdC5yaWdodDsKICAgaW50IHRvcCA9IGRlc3RfaGVpZ2h0ID4gMCA/IGltYWdlX3JlY3QudG9wIDogaW1hZ2VfcmVjdC5ib3R0b207Ci0gIG1fcFJlbmRlclN0YXR1cy0+bV9wRGV2aWNlLT5TdHJldGNoQml0TWFzaygKLSAgICAgIHBBbHBoYU1hc2suR2V0KCksIGxlZnQsIHRvcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsCisgIG1fcFJlbmRlclN0YXR1cy0+R2V0UmVuZGVyRGV2aWNlKCktPlN0cmV0Y2hCaXRNYXNrKAorICAgICAgcEFscGhhTWFzaywgbGVmdCwgdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwKICAgICAgIEFyZ2JFbmNvZGUoMHhmZiwgbV9CaXRtYXBBbHBoYSwgbV9CaXRtYXBBbHBoYSwgbV9CaXRtYXBBbHBoYSkpOwogICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgQ1BERl9JbWFnZVJlbmRlcmVyOjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkgeworYm9vbCBDUERGX0ltYWdlUmVuZGVyZXI6OkNvbnRpbnVlKElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKSB7CiAgIGlmIChtX1N0YXR1cyA9PSAyKSB7CiAgICAgaWYgKG1fcFRyYW5zZm9ybWVyLT5Db250aW51ZShwUGF1c2UpKQogICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBwQml0bWFwKG1fcFRyYW5zZm9ybWVyLT5EZXRhY2hCaXRtYXAoKSk7CisgICAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcEJpdG1hcCA9IG1fcFRyYW5zZm9ybWVyLT5EZXRhY2hCaXRtYXAoKTsKICAgICBpZiAoIXBCaXRtYXApCiAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBpZiAocEJpdG1hcC0+SXNBbHBoYU1hc2soKSkgewogICAgICAgaWYgKG1fQml0bWFwQWxwaGEgIT0gMjU1KQogICAgICAgICBtX0ZpbGxBcmdiID0gRlhBUkdCX01VTF9BTFBIQShtX0ZpbGxBcmdiLCBtX0JpdG1hcEFscGhhKTsKLSAgICAgIG1fUmVzdWx0ID0gbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlNldEJpdE1hc2soCi0gICAgICAgICAgcEJpdG1hcC5nZXQoKSwgbV9wVHJhbnNmb3JtZXItPnJlc3VsdCgpLmxlZnQsCi0gICAgICAgICAgbV9wVHJhbnNmb3JtZXItPnJlc3VsdCgpLnRvcCwgbV9GaWxsQXJnYik7CisgICAgICBtX1Jlc3VsdCA9IG1fcFJlbmRlclN0YXR1cy0+R2V0UmVuZGVyRGV2aWNlKCktPlNldEJpdE1hc2soCisgICAgICAgICAgcEJpdG1hcCwgbV9wVHJhbnNmb3JtZXItPnJlc3VsdCgpLmxlZnQsIG1fcFRyYW5zZm9ybWVyLT5yZXN1bHQoKS50b3AsCisgICAgICAgICAgbV9GaWxsQXJnYik7CiAgICAgfSBlbHNlIHsKICAgICAgIGlmIChtX0JpdG1hcEFscGhhICE9IDI1NSkKICAgICAgICAgcEJpdG1hcC0+TXVsdGlwbHlBbHBoYShtX0JpdG1hcEFscGhhKTsKLSAgICAgIG1fUmVzdWx0ID0gbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPlNldERJQml0c1dpdGhCbGVuZCgKLSAgICAgICAgICBwQml0bWFwLmdldCgpLCBtX3BUcmFuc2Zvcm1lci0+cmVzdWx0KCkubGVmdCwKLSAgICAgICAgICBtX3BUcmFuc2Zvcm1lci0+cmVzdWx0KCkudG9wLCBtX0JsZW5kVHlwZSk7CisgICAgICBtX1Jlc3VsdCA9IG1fcFJlbmRlclN0YXR1cy0+R2V0UmVuZGVyRGV2aWNlKCktPlNldERJQml0c1dpdGhCbGVuZCgKKyAgICAgICAgICBwQml0bWFwLCBtX3BUcmFuc2Zvcm1lci0+cmVzdWx0KCkubGVmdCwgbV9wVHJhbnNmb3JtZXItPnJlc3VsdCgpLnRvcCwKKyAgICAgICAgICBtX0JsZW5kVHlwZSk7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKICAgfQotICBpZiAobV9TdGF0dXMgPT0gMykKLSAgICByZXR1cm4gbV9wUmVuZGVyU3RhdHVzLT5tX3BEZXZpY2UtPkNvbnRpbnVlRElCaXRzKG1fRGV2aWNlSGFuZGxlLCBwUGF1c2UpOworICBpZiAobV9TdGF0dXMgPT0gMykgeworICAgIHJldHVybiBtX3BSZW5kZXJTdGF0dXMtPkdldFJlbmRlckRldmljZSgpLT5Db250aW51ZURJQml0cygKKyAgICAgICAgbV9EZXZpY2VIYW5kbGUuZ2V0KCksIHBQYXVzZSk7CisgIH0KIAogICBpZiAobV9TdGF0dXMgPT0gNCkgewotICAgIGlmIChtX0xvYWRlci5Db250aW51ZShwUGF1c2UpKQorICAgIGlmIChtX0xvYWRlci5Db250aW51ZShwUGF1c2UsIG1fcFJlbmRlclN0YXR1cy5HZXQoKSkpCiAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAgIGlmIChTdGFydFJlbmRlckRJQlNvdXJjZSgpKQpAQCAtNTcwLDMgKzU1NCwzMCBAQAogICB9CiAgIHJldHVybiBmYWxzZTsKIH0KKwordm9pZCBDUERGX0ltYWdlUmVuZGVyZXI6OkhhbmRsZUZpbHRlcnMoKSB7CisgIENQREZfT2JqZWN0KiBwRmlsdGVycyA9CisgICAgICBtX3BJbWFnZU9iamVjdC0+R2V0SW1hZ2UoKS0+R2V0U3RyZWFtKCktPkdldERpY3QoKS0+R2V0RGlyZWN0T2JqZWN0Rm9yKAorICAgICAgICAgICJGaWx0ZXIiKTsKKyAgaWYgKCFwRmlsdGVycykKKyAgICByZXR1cm47CisKKyAgaWYgKHBGaWx0ZXJzLT5Jc05hbWUoKSkgeworICAgIEJ5dGVTdHJpbmcgYnNEZWNvZGVUeXBlID0gcEZpbHRlcnMtPkdldFN0cmluZygpOworICAgIGlmIChic0RlY29kZVR5cGUgPT0gIkRDVERlY29kZSIgfHwgYnNEZWNvZGVUeXBlID09ICJKUFhEZWNvZGUiKQorICAgICAgbV9GbGFncyB8PSBGWFJFTkRFUl9JTUFHRV9MT1NTWTsKKyAgICByZXR1cm47CisgIH0KKworICBDUERGX0FycmF5KiBwQXJyYXkgPSBwRmlsdGVycy0+QXNBcnJheSgpOworICBpZiAoIXBBcnJheSkKKyAgICByZXR1cm47CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkrKykgeworICAgIEJ5dGVTdHJpbmcgYnNEZWNvZGVUeXBlID0gcEFycmF5LT5HZXRTdHJpbmdBdChpKTsKKyAgICBpZiAoYnNEZWNvZGVUeXBlID09ICJEQ1REZWNvZGUiIHx8IGJzRGVjb2RlVHlwZSA9PSAiSlBYRGVjb2RlIikgeworICAgICAgbV9GbGFncyB8PSBGWFJFTkRFUl9JTUFHRV9MT1NTWTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX2ltYWdlcmVuZGVyZXIuaCBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9pbWFnZXJlbmRlcmVyLmgKaW5kZXggZDM1ODcxNi4uYTVkOWJhNyAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX2ltYWdlcmVuZGVyZXIuaAorKysgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfaW1hZ2VyZW5kZXJlci5oCkBAIC0xMCw4ICsxMCwxMyBAQAogI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9pbWFnZWxvYWRlci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfaW1hZ2VyZW5kZXJlci5oIgogCi1jbGFzcyBDRlhfRnhnZURldmljZTsKK2NsYXNzIENGWF9ESUJpdG1hcDsKK2NsYXNzIENGWF9ESUJTb3VyY2U7CitjbGFzcyBDRlhfRGVmYXVsdFJlbmRlckRldmljZTsKIGNsYXNzIENGWF9JbWFnZVRyYW5zZm9ybWVyOwogY2xhc3MgQ1BERl9JbWFnZU9iamVjdDsKIGNsYXNzIENQREZfUGFnZU9iamVjdDsKQEAgLTI0LDEzICsyOSwxMyBAQAogICB+Q1BERl9JbWFnZVJlbmRlcmVyKCk7CiAKICAgYm9vbCBTdGFydChDUERGX1JlbmRlclN0YXR1cyogcFN0YXR1cywKLSAgICAgICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBPYmosCisgICAgICAgICAgICAgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqZWN0LAogICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlLAogICAgICAgICAgICAgIGJvb2wgYlN0ZENTLAogICAgICAgICAgICAgIGludCBibGVuZFR5cGUpOwogCiAgIGJvb2wgU3RhcnQoQ1BERl9SZW5kZXJTdGF0dXMqIHBTdGF0dXMsCi0gICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcERJQlNvdXJjZSwKKyAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBESUJTb3VyY2UsCiAgICAgICAgICAgICAgRlhfQVJHQiBiaXRtYXBfYXJnYiwKICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAogICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBJbWFnZTJEZXZpY2UsCkBAIC0zOCw3ICs0Myw3IEBACiAgICAgICAgICAgICAgYm9vbCBiU3RkQ1MsCiAgICAgICAgICAgICAgaW50IGJsZW5kVHlwZSk7CiAKLSAgYm9vbCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CisgIGJvb2wgQ29udGludWUoSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpOwogICBib29sIEdldFJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuIG1fUmVzdWx0OyB9CiAKICBwcml2YXRlOgpAQCAtNTEsMjcgKzU2LDI3IEBACiAgIGJvb2wgTm90RHJhd2luZygpIGNvbnN0OwogICBGWF9SRUNUIEdldERyYXdSZWN0KCkgY29uc3Q7CiAgIENGWF9NYXRyaXggR2V0RHJhd01hdHJpeChjb25zdCBGWF9SRUNUJiByZWN0KSBjb25zdDsKLSAgdm9pZCBDYWxjdWxhdGVEcmF3SW1hZ2UoQ0ZYX0Z4Z2VEZXZpY2UqIGJpdG1hcF9kZXZpY2UxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRnhnZURldmljZSogYml0bWFwX2RldmljZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBESUJTb3VyY2UsCisgIHZvaWQgQ2FsY3VsYXRlRHJhd0ltYWdlKENGWF9EZWZhdWx0UmVuZGVyRGV2aWNlKiBiaXRtYXBfZGV2aWNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2UqIGJpdG1hcF9kZXZpY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBESUJTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBOZXdNYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QmIHJlY3QpIGNvbnN0OworICB2b2lkIEhhbmRsZUZpbHRlcnMoKTsKIAotICBDUERGX1JlbmRlclN0YXR1cyogbV9wUmVuZGVyU3RhdHVzOwotICBDUERGX0ltYWdlT2JqZWN0KiBtX3BJbWFnZU9iamVjdDsKKyAgVW5vd25lZFB0cjxDUERGX1JlbmRlclN0YXR1cz4gbV9wUmVuZGVyU3RhdHVzOworICBVbm93bmVkUHRyPENQREZfSW1hZ2VPYmplY3Q+IG1fcEltYWdlT2JqZWN0OwogICBpbnQgbV9TdGF0dXM7Ci0gIGNvbnN0IENGWF9NYXRyaXgqIG1fcE9iajJEZXZpY2U7CisgIFVub3duZWRQdHI8Y29uc3QgQ0ZYX01hdHJpeD4gbV9wT2JqMkRldmljZTsKICAgQ0ZYX01hdHJpeCBtX0ltYWdlTWF0cml4OwogICBDUERGX0ltYWdlTG9hZGVyIG1fTG9hZGVyOwotICBjb25zdCBDRlhfRElCU291cmNlKiBtX3BESUJTb3VyY2U7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IG1fcENsb25lOworICBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4gbV9wRElCU291cmNlOwogICBpbnQgbV9CaXRtYXBBbHBoYTsKICAgYm9vbCBtX2JQYXR0ZXJuQ29sb3I7Ci0gIENQREZfUGF0dGVybiogbV9wUGF0dGVybjsKKyAgVW5vd25lZFB0cjxDUERGX1BhdHRlcm4+IG1fcFBhdHRlcm47CiAgIEZYX0FSR0IgbV9GaWxsQXJnYjsKICAgdWludDMyX3QgbV9GbGFnczsKICAgc3RkOjp1bmlxdWVfcHRyPENGWF9JbWFnZVRyYW5zZm9ybWVyPiBtX3BUcmFuc2Zvcm1lcjsKLSAgdm9pZCogbV9EZXZpY2VIYW5kbGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfSW1hZ2VSZW5kZXJlcj4gbV9EZXZpY2VIYW5kbGU7CiAgIGJvb2wgbV9iU3RkQ1M7CiAgIGludCBtX0JsZW5kVHlwZTsKICAgYm9vbCBtX1Jlc3VsdDsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9wYWdlcmVuZGVyY2FjaGUuY3BwIGIvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3BhZ2VyZW5kZXJjYWNoZS5jcHAKaW5kZXggZmFhOTczMi4uMGQwMTU4OSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3BhZ2VyZW5kZXJjYWNoZS5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3BhZ2VyZW5kZXJjYWNoZS5jcHAKQEAgLTYsMjIgKzYsMjQgQEAKIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9wYWdlcmVuZGVyY2FjaGUuaCIKIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2ltYWdlLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX2ltYWdlY2FjaGVlbnRyeS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9yZW5kZXJzdGF0dXMuaCIKIAogbmFtZXNwYWNlIHsKIAotc3RydWN0IENBQ0hFSU5GTyB7CitzdHJ1Y3QgQ2FjaGVJbmZvIHsKKyAgQ2FjaGVJbmZvKHVpbnQzMl90IHQsIENQREZfU3RyZWFtKiBzdHJlYW0pIDogdGltZSh0KSwgcFN0cmVhbShzdHJlYW0pIHt9CisKICAgdWludDMyX3QgdGltZTsKICAgQ1BERl9TdHJlYW0qIHBTdHJlYW07Ci19OwogCi1leHRlcm4gIkMiIHsKLXN0YXRpYyBpbnQgY29tcGFyZShjb25zdCB2b2lkKiBkYXRhMSwgY29uc3Qgdm9pZCogZGF0YTIpIHsKLSAgcmV0dXJuICgoQ0FDSEVJTkZPKilkYXRhMSktPnRpbWUgLSAoKENBQ0hFSU5GTyopZGF0YTIpLT50aW1lOwotfQotfSAgLy8gZXh0ZXJuICJDIgorICBib29sIG9wZXJhdG9yPChjb25zdCBDYWNoZUluZm8mIG90aGVyKSBjb25zdCB7IHJldHVybiB0aW1lIDwgb3RoZXIudGltZTsgfQorfTsKIAogfSAgLy8gbmFtZXNwYWNlCiAKQEAgLTQyLDMxICs0NCwyOSBAQAogICAgIHJldHVybjsKIAogICBzaXplX3QgbkNvdW50ID0gbV9JbWFnZUNhY2hlLnNpemUoKTsKLSAgQ0FDSEVJTkZPKiBwQ0FDSEVJTkZPID0gRlhfQWxsb2MoQ0FDSEVJTkZPLCBuQ291bnQpOwotICBzaXplX3QgaSA9IDA7CisgIHN0ZDo6dmVjdG9yPENhY2hlSW5mbz4gY2FjaGVfaW5mbzsKKyAgY2FjaGVfaW5mby5yZXNlcnZlKG5Db3VudCk7CiAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBtX0ltYWdlQ2FjaGUpIHsKLSAgICBwQ0FDSEVJTkZPW2ldLnRpbWUgPSBpdC5zZWNvbmQtPkdldFRpbWVDb3VudCgpOwotICAgIHBDQUNIRUlORk9baSsrXS5wU3RyZWFtID0gaXQuc2Vjb25kLT5HZXRTdHJlYW0oKTsKKyAgICBjYWNoZV9pbmZvLmVtcGxhY2VfYmFjayhpdC5zZWNvbmQtPkdldFRpbWVDb3VudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LnNlY29uZC0+R2V0SW1hZ2UoKS0+R2V0U3RyZWFtKCkpOwogICB9Ci0gIEZYU1lTX3Fzb3J0KHBDQUNIRUlORk8sIG5Db3VudCwgc2l6ZW9mKENBQ0hFSU5GTyksIGNvbXBhcmUpOwotICB1aW50MzJfdCBuVGltZUNvdW50ID0gbV9uVGltZUNvdW50OworICBzdGQ6OnNvcnQoY2FjaGVfaW5mby5iZWdpbigpLCBjYWNoZV9pbmZvLmVuZCgpKTsKIAogICAvLyBDaGVjayBpZiB0aW1lIHZhbHVlIGlzIGFib3V0IHRvIHJvbGwgb3ZlciBhbmQgcmVzZXQgYWxsIGVudHJpZXMuCiAgIC8vIFRoZSBjb21wYXJpc2lvbiBpcyBsZWdhbCBiZWNhdXNlIHVpbnQzMl90IGlzIGFuIHVuc2lnbmVkIHR5cGUuCisgIHVpbnQzMl90IG5UaW1lQ291bnQgPSBtX25UaW1lQ291bnQ7CiAgIGlmIChuVGltZUNvdW50ICsgMSA8IG5UaW1lQ291bnQpIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbkNvdW50OyBpKyspCi0gICAgICBtX0ltYWdlQ2FjaGVbcENBQ0hFSU5GT1tpXS5wU3RyZWFtXS0+bV9kd1RpbWVDb3VudCA9IGk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykKKyAgICAgIG1fSW1hZ2VDYWNoZVtjYWNoZV9pbmZvW2ldLnBTdHJlYW1dLT5tX2R3VGltZUNvdW50ID0gaTsKICAgICBtX25UaW1lQ291bnQgPSBuQ291bnQ7CiAgIH0KIAotICBpID0gMDsKKyAgc2l6ZV90IGkgPSAwOwogICB3aGlsZSAoaSArIDE1IDwgbkNvdW50KQotICAgIENsZWFySW1hZ2VDYWNoZUVudHJ5KHBDQUNIRUlORk9baSsrXS5wU3RyZWFtKTsKKyAgICBDbGVhckltYWdlQ2FjaGVFbnRyeShjYWNoZV9pbmZvW2krK10ucFN0cmVhbSk7CiAKICAgd2hpbGUgKGkgPCBuQ291bnQgJiYgbV9uQ2FjaGVTaXplID4gKHVpbnQzMl90KWR3TGltaXRDYWNoZVNpemUpCi0gICAgQ2xlYXJJbWFnZUNhY2hlRW50cnkocENBQ0hFSU5GT1tpKytdLnBTdHJlYW0pOwotCi0gIEZYX0ZyZWUocENBQ0hFSU5GTyk7CisgICAgQ2xlYXJJbWFnZUNhY2hlRW50cnkoY2FjaGVfaW5mb1tpKytdLnBTdHJlYW0pOwogfQogCiB2b2lkIENQREZfUGFnZVJlbmRlckNhY2hlOjpDbGVhckltYWdlQ2FjaGVFbnRyeShDUERGX1N0cmVhbSogcFN0cmVhbSkgewpAQCAtODAsMjQgKzgwLDIzIEBACiB9CiAKIGJvb2wgQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OlN0YXJ0R2V0Q2FjaGVkQml0bWFwKAotICAgIENQREZfU3RyZWFtKiBwU3RyZWFtLAorICAgIGNvbnN0IFJldGFpblB0cjxDUERGX0ltYWdlPiYgcEltYWdlLAogICAgIGJvb2wgYlN0ZENTLAogICAgIHVpbnQzMl90IEdyb3VwRmFtaWx5LAogICAgIGJvb2wgYkxvYWRNYXNrLAotICAgIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzLAotICAgIGludDMyX3QgZG93bnNhbXBsZVdpZHRoLAotICAgIGludDMyX3QgZG93bnNhbXBsZUhlaWdodCkgeworICAgIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzKSB7CisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gcEltYWdlLT5HZXRTdHJlYW0oKTsKICAgY29uc3QgYXV0byBpdCA9IG1fSW1hZ2VDYWNoZS5maW5kKHBTdHJlYW0pOwogICBtX2JDdXJGaW5kQ2FjaGUgPSBpdCAhPSBtX0ltYWdlQ2FjaGUuZW5kKCk7CiAgIGlmIChtX2JDdXJGaW5kQ2FjaGUpIHsKICAgICBtX3BDdXJJbWFnZUNhY2hlRW50cnkgPSBpdC0+c2Vjb25kOwogICB9IGVsc2UgewogICAgIG1fcEN1ckltYWdlQ2FjaGVFbnRyeSA9Ci0gICAgICAgIG5ldyBDUERGX0ltYWdlQ2FjaGVFbnRyeShtX3BQYWdlLT5tX3BEb2N1bWVudCwgcFN0cmVhbSk7CisgICAgICAgIG5ldyBDUERGX0ltYWdlQ2FjaGVFbnRyeShtX3BQYWdlLT5tX3BEb2N1bWVudC5HZXQoKSwgcEltYWdlKTsKICAgfQogICBpbnQgcmV0ID0gbV9wQ3VySW1hZ2VDYWNoZUVudHJ5LT5TdGFydEdldENhY2hlZEJpdG1hcCgKLSAgICAgIHBSZW5kZXJTdGF0dXMtPm1fcEZvcm1SZXNvdXJjZSwgbV9wUGFnZS0+bV9wUGFnZVJlc291cmNlcywgYlN0ZENTLAotICAgICAgR3JvdXBGYW1pbHksIGJMb2FkTWFzaywgcFJlbmRlclN0YXR1cywgZG93bnNhbXBsZVdpZHRoLCBkb3duc2FtcGxlSGVpZ2h0KTsKKyAgICAgIHBSZW5kZXJTdGF0dXMtPkdldEZvcm1SZXNvdXJjZSgpLCBtX3BQYWdlLT5tX3BQYWdlUmVzb3VyY2VzLkdldCgpLCBiU3RkQ1MsCisgICAgICBHcm91cEZhbWlseSwgYkxvYWRNYXNrLCBwUmVuZGVyU3RhdHVzKTsKICAgaWYgKHJldCA9PSAyKQogICAgIHJldHVybiB0cnVlOwogCkBAIC0xMTEsMjggKzExMCwzMiBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgQ1BERl9QYWdlUmVuZGVyQ2FjaGU6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKSB7Ci0gIGludCByZXQgPSBtX3BDdXJJbWFnZUNhY2hlRW50cnktPkNvbnRpbnVlKHBQYXVzZSk7Citib29sIENQREZfUGFnZVJlbmRlckNhY2hlOjpDb250aW51ZShJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzKSB7CisgIGludCByZXQgPSBtX3BDdXJJbWFnZUNhY2hlRW50cnktPkNvbnRpbnVlKHBQYXVzZSwgcFJlbmRlclN0YXR1cyk7CiAgIGlmIChyZXQgPT0gMikKICAgICByZXR1cm4gdHJ1ZTsKIAogICBtX25UaW1lQ291bnQrKzsKLSAgaWYgKCFtX2JDdXJGaW5kQ2FjaGUpCi0gICAgbV9JbWFnZUNhY2hlW21fcEN1ckltYWdlQ2FjaGVFbnRyeS0+R2V0U3RyZWFtKCldID0gbV9wQ3VySW1hZ2VDYWNoZUVudHJ5OworICBpZiAoIW1fYkN1ckZpbmRDYWNoZSkgeworICAgIG1fSW1hZ2VDYWNoZVttX3BDdXJJbWFnZUNhY2hlRW50cnktPkdldEltYWdlKCktPkdldFN0cmVhbSgpXSA9CisgICAgICAgIG1fcEN1ckltYWdlQ2FjaGVFbnRyeTsKKyAgfQogICBpZiAoIXJldCkKICAgICBtX25DYWNoZVNpemUgKz0gbV9wQ3VySW1hZ2VDYWNoZUVudHJ5LT5Fc3RpbWF0ZVNpemUoKTsKICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIENQREZfUGFnZVJlbmRlckNhY2hlOjpSZXNldEJpdG1hcChDUERGX1N0cmVhbSogcFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCkgewordm9pZCBDUERGX1BhZ2VSZW5kZXJDYWNoZTo6UmVzZXRCaXRtYXAoY29uc3QgUmV0YWluUHRyPENQREZfSW1hZ2U+JiBwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcCkgewogICBDUERGX0ltYWdlQ2FjaGVFbnRyeSogcEVudHJ5OworICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBJbWFnZS0+R2V0U3RyZWFtKCk7CiAgIGNvbnN0IGF1dG8gaXQgPSBtX0ltYWdlQ2FjaGUuZmluZChwU3RyZWFtKTsKICAgaWYgKGl0ID09IG1fSW1hZ2VDYWNoZS5lbmQoKSkgewogICAgIGlmICghcEJpdG1hcCkKICAgICAgIHJldHVybjsKIAotICAgIHBFbnRyeSA9IG5ldyBDUERGX0ltYWdlQ2FjaGVFbnRyeShtX3BQYWdlLT5tX3BEb2N1bWVudCwgcFN0cmVhbSk7CisgICAgcEVudHJ5ID0gbmV3IENQREZfSW1hZ2VDYWNoZUVudHJ5KG1fcFBhZ2UtPm1fcERvY3VtZW50LkdldCgpLCBwSW1hZ2UpOwogICAgIG1fSW1hZ2VDYWNoZVtwU3RyZWFtXSA9IHBFbnRyeTsKICAgfSBlbHNlIHsKICAgICBwRW50cnkgPSBpdC0+c2Vjb25kOwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3BhZ2VyZW5kZXJjYWNoZS5oIGIvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3BhZ2VyZW5kZXJjYWNoZS5oCmluZGV4IDZjOWVkNzYuLjU4ZjBiYjcgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9wYWdlcmVuZGVyY2FjaGUuaAorKysgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcGFnZXJlbmRlcmNhY2hlLmgKQEAgLTEwLDE0ICsxMCwxNiBAQAogI2luY2x1ZGUgPG1hcD4KIAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogCi1jbGFzcyBDUERGX1N0cmVhbTsKK2NsYXNzIENGWF9ESUJpdG1hcDsKK2NsYXNzIENQREZfSW1hZ2U7CiBjbGFzcyBDUERGX0ltYWdlQ2FjaGVFbnRyeTsKIGNsYXNzIENQREZfUGFnZTsKIGNsYXNzIENQREZfUmVuZGVyU3RhdHVzOwotY2xhc3MgQ0ZYX0RJQml0bWFwOwotY2xhc3MgQ0ZYX0RJQlNvdXJjZTsKLWNsYXNzIElGWF9QYXVzZTsKK2NsYXNzIENQREZfU3RyZWFtOworY2xhc3MgSUZYX1BhdXNlSW5kaWNhdG9yOwogCiBjbGFzcyBDUERGX1BhZ2VSZW5kZXJDYWNoZSB7CiAgcHVibGljOgpAQCAtMjYsMjcgKzI4LDI1IEBACiAKICAgdm9pZCBDYWNoZU9wdGltaXphdGlvbihpbnQzMl90IGR3TGltaXRDYWNoZVNpemUpOwogICB1aW50MzJfdCBHZXRUaW1lQ291bnQoKSBjb25zdCB7IHJldHVybiBtX25UaW1lQ291bnQ7IH0KLQotICB2b2lkIFJlc2V0Qml0bWFwKENQREZfU3RyZWFtKiBwU3RyZWFtLCBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXApOwotICBDUERGX1BhZ2UqIEdldFBhZ2UoKSBjb25zdCB7IHJldHVybiBtX3BQYWdlOyB9CisgIHZvaWQgUmVzZXRCaXRtYXAoY29uc3QgUmV0YWluUHRyPENQREZfSW1hZ2U+JiBwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBCaXRtYXApOworICBDUERGX1BhZ2UqIEdldFBhZ2UoKSBjb25zdCB7IHJldHVybiBtX3BQYWdlLkdldCgpOyB9CiAgIENQREZfSW1hZ2VDYWNoZUVudHJ5KiBHZXRDdXJJbWFnZUNhY2hlRW50cnkoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1fcEN1ckltYWdlQ2FjaGVFbnRyeTsKICAgfQogCi0gIGJvb2wgU3RhcnRHZXRDYWNoZWRCaXRtYXAoQ1BERl9TdHJlYW0qIHBTdHJlYW0sCisgIGJvb2wgU3RhcnRHZXRDYWNoZWRCaXRtYXAoY29uc3QgUmV0YWluUHRyPENQREZfSW1hZ2U+JiBwSW1hZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3RkQ1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgR3JvdXBGYW1pbHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTG9hZE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMqIHBSZW5kZXJTdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkb3duc2FtcGxlV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkb3duc2FtcGxlSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlclN0YXR1cyogcFJlbmRlclN0YXR1cyk7CiAKLSAgYm9vbCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CisgIGJvb2wgQ29udGludWUoSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UsIENQREZfUmVuZGVyU3RhdHVzKiBwUmVuZGVyU3RhdHVzKTsKIAogIHByaXZhdGU6CiAgIHZvaWQgQ2xlYXJJbWFnZUNhY2hlRW50cnkoQ1BERl9TdHJlYW0qIHBTdHJlYW0pOwogCi0gIENQREZfUGFnZSogY29uc3QgbV9wUGFnZTsKKyAgVW5vd25lZFB0cjxDUERGX1BhZ2U+IGNvbnN0IG1fcFBhZ2U7CiAgIENQREZfSW1hZ2VDYWNoZUVudHJ5KiBtX3BDdXJJbWFnZUNhY2hlRW50cnk7CiAgIHN0ZDo6bWFwPENQREZfU3RyZWFtKiwgQ1BERl9JbWFnZUNhY2hlRW50cnkqPiBtX0ltYWdlQ2FjaGU7CiAgIHVpbnQzMl90IG1fblRpbWVDb3VudDsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9wcm9ncmVzc2l2ZXJlbmRlcmVyLmNwcCBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9wcm9ncmVzc2l2ZXJlbmRlcmVyLmNwcAppbmRleCA2YWEzYjhhLi5lNTA5YTI1IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcHJvZ3Jlc3NpdmVyZW5kZXJlci5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3Byb2dyZXNzaXZlcmVuZGVyZXIuY3BwCkBAIC02LDExICs2LDE0IEBACiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcHJvZ3Jlc3NpdmVyZW5kZXJlci5oIgogCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9pbWFnZS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfaW1hZ2VvYmplY3QuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2VvYmplY3QuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2VvYmplY3Rob2xkZXIuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcGFnZXJlbmRlcmNhY2hlLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3JlbmRlcm9wdGlvbnMuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcmVuZGVyc3RhdHVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9pZnhfcGF1c2VpbmRpY2F0b3IuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIApAQCAtMjYsMTEgKzI5LDEzIEBACiAgICAgICBtX3BDdXJyZW50TGF5ZXIobnVsbHB0cikge30KIAogQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjp+Q1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyKCkgewotICBpZiAobV9wUmVuZGVyU3RhdHVzKQorICBpZiAobV9wUmVuZGVyU3RhdHVzKSB7CisgICAgbV9wUmVuZGVyU3RhdHVzLnJlc2V0KCk7ICAvLyBSZWxlYXNlIGZpcnN0LgogICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKGZhbHNlKTsKKyAgfQogfQogCi12b2lkIENQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjo6U3RhcnQoSUZYX1BhdXNlKiBwUGF1c2UpIHsKK3ZvaWQgQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjpTdGFydChJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSkgewogICBpZiAoIW1fcENvbnRleHQgfHwgIW1fcERldmljZSB8fCBtX1N0YXR1cyAhPSBSZWFkeSkgewogICAgIG1fU3RhdHVzID0gRmFpbGVkOwogICAgIHJldHVybjsKQEAgLTM5LDcgKzQ0LDcgQEAKICAgQ29udGludWUocFBhdXNlKTsKIH0KIAotdm9pZCBDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKSB7Cit2b2lkIENQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjo6Q29udGludWUoSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpIHsKICAgd2hpbGUgKG1fU3RhdHVzID09IFRvQmVDb250aW51ZWQpIHsKICAgICBpZiAoIW1fcEN1cnJlbnRMYXllcikgewogICAgICAgaWYgKG1fTGF5ZXJJbmRleCA+PSBtX3BDb250ZXh0LT5Db3VudExheWVycygpKSB7CkBAIC01MSwxMyArNTYsMTIgQEAKICAgICAgICAgICBtX3BDdXJyZW50TGF5ZXItPm1fcE9iamVjdEhvbGRlci0+R2V0UGFnZU9iamVjdExpc3QoKS0+ZW5kKCk7CiAgICAgICBtX3BSZW5kZXJTdGF0dXMgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9SZW5kZXJTdGF0dXM+KCk7CiAgICAgICBtX3BSZW5kZXJTdGF0dXMtPkluaXRpYWxpemUoCi0gICAgICAgICAgbV9wQ29udGV4dCwgbV9wRGV2aWNlLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBtX3BPcHRpb25zLAotICAgICAgICAgIG1fcEN1cnJlbnRMYXllci0+bV9wT2JqZWN0SG9sZGVyLT5tX1RyYW5zcGFyZW5jeSwgZmFsc2UsIG51bGxwdHIpOworICAgICAgICAgIG1fcENvbnRleHQuR2V0KCksIG1fcERldmljZS5HZXQoKSwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwKKyAgICAgICAgICBtX3BPcHRpb25zLCBtX3BDdXJyZW50TGF5ZXItPm1fcE9iamVjdEhvbGRlci0+bV9pVHJhbnNwYXJlbmN5LCBmYWxzZSwKKyAgICAgICAgICBudWxscHRyKTsKICAgICAgIG1fcERldmljZS0+U2F2ZVN0YXRlKCk7Ci0gICAgICBtX0NsaXBSZWN0ID0gQ0ZYX0Zsb2F0UmVjdChtX3BEZXZpY2UtPkdldENsaXBCb3goKSk7Ci0gICAgICBDRlhfTWF0cml4IGRldmljZTJvYmplY3Q7Ci0gICAgICBkZXZpY2Uyb2JqZWN0LlNldFJldmVyc2UobV9wQ3VycmVudExheWVyLT5tX01hdHJpeCk7Ci0gICAgICBkZXZpY2Uyb2JqZWN0LlRyYW5zZm9ybVJlY3QobV9DbGlwUmVjdCk7CisgICAgICBtX0NsaXBSZWN0ID0gbV9wQ3VycmVudExheWVyLT5tX01hdHJpeC5HZXRJbnZlcnNlKCkuVHJhbnNmb3JtUmVjdCgKKyAgICAgICAgICBDRlhfRmxvYXRSZWN0KG1fcERldmljZS0+R2V0Q2xpcEJveCgpKSk7CiAgICAgfQogICAgIENQREZfUGFnZU9iamVjdExpc3Q6Oml0ZXJhdG9yIGl0ZXI7CiAgICAgQ1BERl9QYWdlT2JqZWN0TGlzdDo6aXRlcmF0b3IgaXRlckVuZCA9CkBAIC02OSwyMCArNzMsMzEgQEAKICAgICAgIGl0ZXIgPSBtX3BDdXJyZW50TGF5ZXItPm1fcE9iamVjdEhvbGRlci0+R2V0UGFnZU9iamVjdExpc3QoKS0+YmVnaW4oKTsKICAgICB9CiAgICAgaW50IG5PYmpzVG9HbyA9IGtTdGVwTGltaXQ7CisgICAgYm9vbCBpc19tYXNrID0gZmFsc2U7CiAgICAgd2hpbGUgKGl0ZXIgIT0gaXRlckVuZCkgewogICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwQ3VyT2JqID0gaXRlci0+Z2V0KCk7CiAgICAgICBpZiAocEN1ck9iaiAmJiBwQ3VyT2JqLT5tX0xlZnQgPD0gbV9DbGlwUmVjdC5yaWdodCAmJgogICAgICAgICAgIHBDdXJPYmotPm1fUmlnaHQgPj0gbV9DbGlwUmVjdC5sZWZ0ICYmCiAgICAgICAgICAgcEN1ck9iai0+bV9Cb3R0b20gPD0gbV9DbGlwUmVjdC50b3AgJiYKICAgICAgICAgICBwQ3VyT2JqLT5tX1RvcCA+PSBtX0NsaXBSZWN0LmJvdHRvbSkgeworICAgICAgICBpZiAobV9wT3B0aW9ucy0+SGFzRmxhZyhSRU5ERVJfQlJFQUtGT1JNQVNLUykgJiYgcEN1ck9iai0+SXNJbWFnZSgpICYmCisgICAgICAgICAgICBwQ3VyT2JqLT5Bc0ltYWdlKCktPkdldEltYWdlKCktPklzTWFzaygpKSB7CisgICAgICAgICAgaWYgKG1fcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX0RFVklDRV9DTEFTUykgPT0gRlhEQ19QUklOVEVSKSB7CisgICAgICAgICAgICBtX0xhc3RPYmplY3RSZW5kZXJlZCA9IGl0ZXI7CisgICAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPlByb2Nlc3NDbGlwUGF0aChwQ3VyT2JqLT5tX0NsaXBQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fcEN1cnJlbnRMYXllci0+bV9NYXRyaXgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICBpc19tYXNrID0gdHJ1ZTsKKyAgICAgICAgfQogICAgICAgICBpZiAobV9wUmVuZGVyU3RhdHVzLT5Db250aW51ZVNpbmdsZU9iamVjdCgKICAgICAgICAgICAgICAgICBwQ3VyT2JqLCAmbV9wQ3VycmVudExheWVyLT5tX01hdHJpeCwgcFBhdXNlKSkgewogICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBpZiAocEN1ck9iai0+SXNJbWFnZSgpICYmCi0gICAgICAgICAgICBtX3BSZW5kZXJTdGF0dXMtPm1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX0xJTUlURURJTUFHRUNBQ0hFKSB7CisgICAgICAgIGlmIChwQ3VyT2JqLT5Jc0ltYWdlKCkgJiYgbV9wUmVuZGVyU3RhdHVzLT5HZXRSZW5kZXJPcHRpb25zKCktPkhhc0ZsYWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFTkRFUl9MSU1JVEVESU1BR0VDQUNIRSkpIHsKICAgICAgICAgICBtX3BDb250ZXh0LT5HZXRQYWdlQ2FjaGUoKS0+Q2FjaGVPcHRpbWl6YXRpb24oCi0gICAgICAgICAgICAgIG1fcFJlbmRlclN0YXR1cy0+bV9PcHRpb25zLm1fZHdMaW1pdENhY2hlU2l6ZSk7CisgICAgICAgICAgICAgIG1fcFJlbmRlclN0YXR1cy0+R2V0UmVuZGVyT3B0aW9ucygpLT5HZXRDYWNoZVNpemVMaW1pdCgpKTsKICAgICAgICAgfQogICAgICAgICBpZiAocEN1ck9iai0+SXNGb3JtKCkgfHwgcEN1ck9iai0+SXNTaGFkaW5nKCkpCiAgICAgICAgICAgbk9ianNUb0dvID0gMDsKQEAgLTk2LDE1ICsxMTEsMTkgQEAKICAgICAgICAgbk9ianNUb0dvID0ga1N0ZXBMaW1pdDsKICAgICAgIH0KICAgICAgICsraXRlcjsKKyAgICAgIGlmIChpc19tYXNrICYmIGl0ZXIgIT0gaXRlckVuZCkKKyAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpZiAobV9wQ3VycmVudExheWVyLT5tX3BPYmplY3RIb2xkZXItPklzUGFyc2VkKCkpIHsKICAgICAgIG1fcFJlbmRlclN0YXR1cy5yZXNldCgpOwogICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoZmFsc2UpOwogICAgICAgbV9wQ3VycmVudExheWVyID0gbnVsbHB0cjsKICAgICAgIG1fTGF5ZXJJbmRleCsrOwotICAgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKKyAgICAgIGlmIChpc19tYXNrIHx8IChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSkgewogICAgICAgICByZXR1cm47CiAgICAgICB9CisgICAgfSBlbHNlIGlmIChpc19tYXNrKSB7CisgICAgICByZXR1cm47CiAgICAgfSBlbHNlIHsKICAgICAgIG1fcEN1cnJlbnRMYXllci0+bV9wT2JqZWN0SG9sZGVyLT5Db250aW51ZVBhcnNlKHBQYXVzZSk7CiAgICAgICBpZiAoIW1fcEN1cnJlbnRMYXllci0+bV9wT2JqZWN0SG9sZGVyLT5Jc1BhcnNlZCgpKQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3Byb2dyZXNzaXZlcmVuZGVyZXIuaCBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9wcm9ncmVzc2l2ZXJlbmRlcmVyLmgKaW5kZXggZjBiMTU3OS4uZmZkNjNhOSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3Byb2dyZXNzaXZlcmVuZGVyZXIuaAorKysgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcHJvZ3Jlc3NpdmVyZW5kZXJlci5oCkBAIC0xNyw3ICsxNyw3IEBACiBjbGFzcyBDUERGX1JlbmRlck9wdGlvbnM7CiBjbGFzcyBDUERGX1JlbmRlclN0YXR1czsKIGNsYXNzIENGWF9SZW5kZXJEZXZpY2U7Ci1jbGFzcyBJRlhfUGF1c2U7CitjbGFzcyBJRlhfUGF1c2VJbmRpY2F0b3I7CiAKIGNsYXNzIENQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlciB7CiAgcHVibGljOgpAQCAtMjUsOCArMjUsOCBAQAogICAvLyBjYW5ub3QgI2luY2x1ZGUgdGhhdCBoZWFkZXIuIGZwZGZzZGsvZnBkZl9wcm9ncmVzc2l2ZS5jcHAgaGFzCiAgIC8vIHN0YXRpY19hc3NlcnRzIHRvIG1ha2Ugc3VyZSB0aGUgdHdvIHNldHMgb2YgdmFsdWVzIG1hdGNoLgogICBlbnVtIFN0YXR1cyB7Ci0gICAgUmVhZHksICAgICAgICAgIC8vIEZQREZfUkVOREVSX1JFQURFUgotICAgIFRvQmVDb250aW51ZWQsICAvLyBGUERGX1JFTkRFUl9UT0JFQ09VTlRJTlVFRAorICAgIFJlYWR5LCAgICAgICAgICAvLyBGUERGX1JFTkRFUl9SRUFEWQorICAgIFRvQmVDb250aW51ZWQsICAvLyBGUERGX1JFTkRFUl9UT0JFQ09OVElOVUVECiAgICAgRG9uZSwgICAgICAgICAgIC8vIEZQREZfUkVOREVSX0RPTkUKICAgICBGYWlsZWQgICAgICAgICAgLy8gRlBERl9SRU5ERVJfRkFJTEVECiAgIH07CkBAIC0zOSwxNiArMzksMTYgQEAKICAgfkNQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcigpOwogCiAgIFN0YXR1cyBHZXRTdGF0dXMoKSBjb25zdCB7IHJldHVybiBtX1N0YXR1czsgfQotICB2b2lkIFN0YXJ0KElGWF9QYXVzZSogcFBhdXNlKTsKLSAgdm9pZCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7CisgIHZvaWQgU3RhcnQoSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpOworICB2b2lkIENvbnRpbnVlKElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKTsKIAogIHByaXZhdGU6CiAgIC8vIE1heGltdW0gcGFnZSBvYmplY3RzIHRvIHJlbmRlciBiZWZvcmUgY2hlY2tpbmcgZm9yIHBhdXNlLgogICBzdGF0aWMgY29uc3QgaW50IGtTdGVwTGltaXQgPSAxMDA7CiAKICAgU3RhdHVzIG1fU3RhdHVzOwotICBDUERGX1JlbmRlckNvbnRleHQqIGNvbnN0IG1fcENvbnRleHQ7Ci0gIENGWF9SZW5kZXJEZXZpY2UqIGNvbnN0IG1fcERldmljZTsKKyAgVW5vd25lZFB0cjxDUERGX1JlbmRlckNvbnRleHQ+IGNvbnN0IG1fcENvbnRleHQ7CisgIFVub3duZWRQdHI8Q0ZYX1JlbmRlckRldmljZT4gY29uc3QgbV9wRGV2aWNlOwogICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIGNvbnN0IG1fcE9wdGlvbnM7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1JlbmRlclN0YXR1cz4gbV9wUmVuZGVyU3RhdHVzOwogICBDRlhfRmxvYXRSZWN0IG1fQ2xpcFJlY3Q7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcmVuZGVyY29udGV4dC5jcHAgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcmVuZGVyY29udGV4dC5jcHAKaW5kZXggZDc0ZjcyOS4uMDY1NmVkZCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3JlbmRlcmNvbnRleHQuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9yZW5kZXJjb250ZXh0LmNwcApAQCAtMTcsMTEgKzE3LDEyIEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3JlbmRlcnN0YXR1cy5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl90ZXh0cmVuZGVyZXIuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2RpYml0bWFwLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgogCiBDUERGX1JlbmRlckNvbnRleHQ6OkNQREZfUmVuZGVyQ29udGV4dChDUERGX1BhZ2UqIHBQYWdlKQotICAgIDogbV9wRG9jdW1lbnQocFBhZ2UtPm1fcERvY3VtZW50KSwKLSAgICAgIG1fcFBhZ2VSZXNvdXJjZXMocFBhZ2UtPm1fcFBhZ2VSZXNvdXJjZXMpLAorICAgIDogbV9wRG9jdW1lbnQocFBhZ2UtPm1fcERvY3VtZW50LkdldCgpKSwKKyAgICAgIG1fcFBhZ2VSZXNvdXJjZXMocFBhZ2UtPm1fcFBhZ2VSZXNvdXJjZXMuR2V0KCkpLAogICAgICAgbV9wUGFnZUNhY2hlKHBQYWdlLT5HZXRSZW5kZXJDYWNoZSgpKSB7fQogCiBDUERGX1JlbmRlckNvbnRleHQ6OkNQREZfUmVuZGVyQ29udGV4dChDUERGX0RvY3VtZW50KiBwRG9jLApAQCAtMzAsMTEgKzMxLDExIEBACiAKIENQREZfUmVuZGVyQ29udGV4dDo6fkNQREZfUmVuZGVyQ29udGV4dCgpIHt9CiAKLXZvaWQgQ1BERl9SZW5kZXJDb250ZXh0OjpHZXRCYWNrZ3JvdW5kKENGWF9ESUJpdG1hcCogcEJ1ZmZlciwKK3ZvaWQgQ1BERl9SZW5kZXJDb250ZXh0OjpHZXRCYWNrZ3JvdW5kKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwQnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBGaW5hbE1hdHJpeCkgewotICBDRlhfRnhnZURldmljZSBkZXZpY2U7CisgIENGWF9EZWZhdWx0UmVuZGVyRGV2aWNlIGRldmljZTsKICAgZGV2aWNlLkF0dGFjaChwQnVmZmVyLCBmYWxzZSwgbnVsbHB0ciwgZmFsc2UpOwogCiAgIEZYX1JFQ1QgcmVjdCgwLCAwLCBkZXZpY2UuR2V0V2lkdGgoKSwgZGV2aWNlLkdldEhlaWdodCgpKTsKQEAgLTYzLDM0ICs2NCwzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTGFzdE1hdHJpeCkgewogICBmb3IgKGF1dG8mIGxheWVyIDogbV9MYXllcnMpIHsKLSAgICBwRGV2aWNlLT5TYXZlU3RhdGUoKTsKKyAgICBDRlhfUmVuZGVyRGV2aWNlOjpTdGF0ZVJlc3RvcmVyIHJlc3RvcmVyKHBEZXZpY2UpOworICAgIENQREZfUmVuZGVyU3RhdHVzIHN0YXR1czsKICAgICBpZiAocExhc3RNYXRyaXgpIHsKICAgICAgIENGWF9NYXRyaXggRmluYWxNYXRyaXggPSBsYXllci5tX01hdHJpeDsKICAgICAgIEZpbmFsTWF0cml4LkNvbmNhdCgqcExhc3RNYXRyaXgpOwotICAgICAgQ1BERl9SZW5kZXJTdGF0dXMgc3RhdHVzOwogICAgICAgc3RhdHVzLkluaXRpYWxpemUodGhpcywgcERldmljZSwgcExhc3RNYXRyaXgsIHBTdG9wT2JqLCBudWxscHRyLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgcE9wdGlvbnMsIGxheWVyLm1fcE9iamVjdEhvbGRlci0+bV9UcmFuc3BhcmVuY3ksIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgcE9wdGlvbnMsIGxheWVyLm1fcE9iamVjdEhvbGRlci0+bV9pVHJhbnNwYXJlbmN5LCBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOwotICAgICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QobGF5ZXIubV9wT2JqZWN0SG9sZGVyLCAmRmluYWxNYXRyaXgpOwotICAgICAgaWYgKHN0YXR1cy5tX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9MSU1JVEVESU1BR0VDQUNIRSkKLSAgICAgICAgbV9wUGFnZUNhY2hlLT5DYWNoZU9wdGltaXphdGlvbihzdGF0dXMubV9PcHRpb25zLm1fZHdMaW1pdENhY2hlU2l6ZSk7Ci0gICAgICBpZiAoc3RhdHVzLm1fYlN0b3BwZWQpIHsKLSAgICAgICAgcERldmljZS0+UmVzdG9yZVN0YXRlKGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9CisgICAgICBzdGF0dXMuUmVuZGVyT2JqZWN0TGlzdChsYXllci5tX3BPYmplY3RIb2xkZXIuR2V0KCksICZGaW5hbE1hdHJpeCk7CiAgICAgfSBlbHNlIHsKLSAgICAgIENQREZfUmVuZGVyU3RhdHVzIHN0YXR1czsKICAgICAgIHN0YXR1cy5Jbml0aWFsaXplKHRoaXMsIHBEZXZpY2UsIG51bGxwdHIsIHBTdG9wT2JqLCBudWxscHRyLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgcE9wdGlvbnMsIGxheWVyLm1fcE9iamVjdEhvbGRlci0+bV9UcmFuc3BhcmVuY3ksIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgcE9wdGlvbnMsIGxheWVyLm1fcE9iamVjdEhvbGRlci0+bV9pVHJhbnNwYXJlbmN5LCBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOwotICAgICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QobGF5ZXIubV9wT2JqZWN0SG9sZGVyLCAmbGF5ZXIubV9NYXRyaXgpOwotICAgICAgaWYgKHN0YXR1cy5tX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9MSU1JVEVESU1BR0VDQUNIRSkKLSAgICAgICAgbV9wUGFnZUNhY2hlLT5DYWNoZU9wdGltaXphdGlvbihzdGF0dXMubV9PcHRpb25zLm1fZHdMaW1pdENhY2hlU2l6ZSk7Ci0gICAgICBpZiAoc3RhdHVzLm1fYlN0b3BwZWQpIHsKLSAgICAgICAgcERldmljZS0+UmVzdG9yZVN0YXRlKGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9CisgICAgICBzdGF0dXMuUmVuZGVyT2JqZWN0TGlzdChsYXllci5tX3BPYmplY3RIb2xkZXIuR2V0KCksICZsYXllci5tX01hdHJpeCk7CiAgICAgfQotICAgIHBEZXZpY2UtPlJlc3RvcmVTdGF0ZShmYWxzZSk7CisgICAgaWYgKHN0YXR1cy5HZXRSZW5kZXJPcHRpb25zKCktPkhhc0ZsYWcoUkVOREVSX0xJTUlURURJTUFHRUNBQ0hFKSkgeworICAgICAgbV9wUGFnZUNhY2hlLT5DYWNoZU9wdGltaXphdGlvbigKKyAgICAgICAgICBzdGF0dXMuR2V0UmVuZGVyT3B0aW9ucygpLT5HZXRDYWNoZVNpemVMaW1pdCgpKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cy5Jc1N0b3BwZWQoKSkKKyAgICAgIGJyZWFrOwogICB9CiB9CisKK0NQREZfUmVuZGVyQ29udGV4dDo6TGF5ZXI6OkxheWVyKCkge30KKworQ1BERl9SZW5kZXJDb250ZXh0OjpMYXllcjo6TGF5ZXIoY29uc3QgTGF5ZXImIHRoYXQpID0gZGVmYXVsdDsKKworQ1BERl9SZW5kZXJDb250ZXh0OjpMYXllcjo6fkxheWVyKCkge30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9yZW5kZXJjb250ZXh0LmggYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcmVuZGVyY29udGV4dC5oCmluZGV4IGE5ZmQyZGIuLjYwNmU1YjkgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9yZW5kZXJjb250ZXh0LmgKKysrIGIvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3JlbmRlcmNvbnRleHQuaApAQCAtOSw4ICs5LDkgQEAKIAogI2luY2x1ZGUgPHZlY3Rvcj4KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogCiBjbGFzcyBDUERGX0RpY3Rpb25hcnk7CiBjbGFzcyBDUERGX0RvY3VtZW50OwpAQCAtMjcsNyArMjgsMTEgQEAKICBwdWJsaWM6CiAgIGNsYXNzIExheWVyIHsKICAgIHB1YmxpYzoKLSAgICBDUERGX1BhZ2VPYmplY3RIb2xkZXIqIG1fcE9iamVjdEhvbGRlcjsKKyAgICBMYXllcigpOworICAgIExheWVyKGNvbnN0IExheWVyJiB0aGF0KTsKKyAgICB+TGF5ZXIoKTsKKworICAgIFVub3duZWRQdHI8Q1BERl9QYWdlT2JqZWN0SG9sZGVyPiBtX3BPYmplY3RIb2xkZXI7CiAgICAgQ0ZYX01hdHJpeCBtX01hdHJpeDsKICAgfTsKIApAQCAtNDcsNyArNTIsNyBAQAogICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zLAogICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwRmluYWxNYXRyaXgpOwogCi0gIHZvaWQgR2V0QmFja2dyb3VuZChDRlhfRElCaXRtYXAqIHBCdWZmZXIsCisgIHZvaWQgR2V0QmFja2dyb3VuZChjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwRmluYWxNYXRyaXgpOwpAQCAtNTUsMTQgKzYwLDE0IEBACiAgIHNpemVfdCBDb3VudExheWVycygpIGNvbnN0IHsgcmV0dXJuIG1fTGF5ZXJzLnNpemUoKTsgfQogICBMYXllciogR2V0TGF5ZXIodWludDMyX3QgaW5kZXgpIHsgcmV0dXJuICZtX0xheWVyc1tpbmRleF07IH0KIAotICBDUERGX0RvY3VtZW50KiBHZXREb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcERvY3VtZW50OyB9Ci0gIENQREZfRGljdGlvbmFyeSogR2V0UGFnZVJlc291cmNlcygpIGNvbnN0IHsgcmV0dXJuIG1fcFBhZ2VSZXNvdXJjZXM7IH0KLSAgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIEdldFBhZ2VDYWNoZSgpIGNvbnN0IHsgcmV0dXJuIG1fcFBhZ2VDYWNoZTsgfQorICBDUERGX0RvY3VtZW50KiBHZXREb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcERvY3VtZW50LkdldCgpOyB9CisgIENQREZfRGljdGlvbmFyeSogR2V0UGFnZVJlc291cmNlcygpIGNvbnN0IHsgcmV0dXJuIG1fcFBhZ2VSZXNvdXJjZXMuR2V0KCk7IH0KKyAgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIEdldFBhZ2VDYWNoZSgpIGNvbnN0IHsgcmV0dXJuIG1fcFBhZ2VDYWNoZS5HZXQoKTsgfQogCiAgcHJvdGVjdGVkOgotICBDUERGX0RvY3VtZW50KiBjb25zdCBtX3BEb2N1bWVudDsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BQYWdlUmVzb3VyY2VzOwotICBDUERGX1BhZ2VSZW5kZXJDYWNoZSogbV9wUGFnZUNhY2hlOworICBVbm93bmVkUHRyPENQREZfRG9jdW1lbnQ+IGNvbnN0IG1fcERvY3VtZW50OworICBVbm93bmVkUHRyPENQREZfRGljdGlvbmFyeT4gbV9wUGFnZVJlc291cmNlczsKKyAgVW5vd25lZFB0cjxDUERGX1BhZ2VSZW5kZXJDYWNoZT4gbV9wUGFnZUNhY2hlOwogICBzdGQ6OnZlY3RvcjxMYXllcj4gbV9MYXllcnM7CiB9OwogCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcmVuZGVyb3B0aW9ucy5jcHAgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcmVuZGVyb3B0aW9ucy5jcHAKaW5kZXggNzE3ZTAzNi4uOWFmOTUxMSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3JlbmRlcm9wdGlvbnMuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9yZW5kZXJvcHRpb25zLmNwcApAQCAtNyw1NyArNywzMSBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9yZW5kZXJvcHRpb25zLmgiCiAKIENQREZfUmVuZGVyT3B0aW9uczo6Q1BERl9SZW5kZXJPcHRpb25zKCkKLSAgICA6IG1fQ29sb3JNb2RlKFJFTkRFUl9DT0xPUl9OT1JNQUwpLAorICAgIDogbV9Db2xvck1vZGUoa05vcm1hbCksCiAgICAgICBtX0ZsYWdzKFJFTkRFUl9DTEVBUlRZUEUpLAotICAgICAgbV9JbnRlcnBvbGF0aW9uKDApLAotICAgICAgbV9BZGRGbGFncygwKSwKICAgICAgIG1fZHdMaW1pdENhY2hlU2l6ZSgxMDI0ICogMTAyNCAqIDEwMCksCi0gICAgICBtX0hhbGZ0b25lTGltaXQoLTEpLAogICAgICAgbV9iRHJhd0Fubm90cyhmYWxzZSkge30KIAogQ1BERl9SZW5kZXJPcHRpb25zOjpDUERGX1JlbmRlck9wdGlvbnMoY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zJiByaHMpCiAgICAgOiBtX0NvbG9yTW9kZShyaHMubV9Db2xvck1vZGUpLAotICAgICAgbV9CYWNrQ29sb3IocmhzLm1fQmFja0NvbG9yKSwKLSAgICAgIG1fRm9yZUNvbG9yKHJocy5tX0ZvcmVDb2xvciksCiAgICAgICBtX0ZsYWdzKHJocy5tX0ZsYWdzKSwKLSAgICAgIG1fSW50ZXJwb2xhdGlvbihyaHMubV9JbnRlcnBvbGF0aW9uKSwKLSAgICAgIG1fQWRkRmxhZ3MocmhzLm1fQWRkRmxhZ3MpLAogICAgICAgbV9kd0xpbWl0Q2FjaGVTaXplKHJocy5tX2R3TGltaXRDYWNoZVNpemUpLAotICAgICAgbV9IYWxmdG9uZUxpbWl0KHJocy5tX0hhbGZ0b25lTGltaXQpLAogICAgICAgbV9iRHJhd0Fubm90cyhyaHMubV9iRHJhd0Fubm90cyksCiAgICAgICBtX3BPQ0NvbnRleHQocmhzLm1fcE9DQ29udGV4dCkge30KIAogQ1BERl9SZW5kZXJPcHRpb25zOjp+Q1BERl9SZW5kZXJPcHRpb25zKCkge30KIAogRlhfQVJHQiBDUERGX1JlbmRlck9wdGlvbnM6OlRyYW5zbGF0ZUNvbG9yKEZYX0FSR0IgYXJnYikgY29uc3QgewotICBpZiAobV9Db2xvck1vZGUgPT0gUkVOREVSX0NPTE9SX05PUk1BTCkKKyAgaWYgKENvbG9yTW9kZUlzKGtOb3JtYWwpKQorICAgIHJldHVybiBhcmdiOworICBpZiAoQ29sb3JNb2RlSXMoa0FscGhhKSkKICAgICByZXR1cm4gYXJnYjsKIAotICBpZiAobV9Db2xvck1vZGUgPT0gUkVOREVSX0NPTE9SX0FMUEhBKQotICAgIHJldHVybiBhcmdiOwotCi0gIGludCBhLCByLCBnLCBiOwotICBBcmdiRGVjb2RlKGFyZ2IsIGEsIHIsIGcsIGIpOworICBpbnQgYTsKKyAgaW50IHI7CisgIGludCBnOworICBpbnQgYjsKKyAgc3RkOjp0aWUoYSwgciwgZywgYikgPSBBcmdiRGVjb2RlKGFyZ2IpOwogICBpbnQgZ3JheSA9IEZYUkdCMkdSQVkociwgZywgYik7Ci0gIGlmIChtX0NvbG9yTW9kZSA9PSBSRU5ERVJfQ09MT1JfVFdPQ09MT1IpIHsKLSAgICBpbnQgY29sb3IgPSAociAtIGdyYXkpICogKHIgLSBncmF5KSArIChnIC0gZ3JheSkgKiAoZyAtIGdyYXkpICsKLSAgICAgICAgICAgICAgICAoYiAtIGdyYXkpICogKGIgLSBncmF5KTsKLSAgICBpZiAoZ3JheSA8IDM1ICYmIGNvbG9yIDwgMjApCi0gICAgICByZXR1cm4gQXJnYkVuY29kZShhLCBtX0ZvcmVDb2xvcik7Ci0KLSAgICBpZiAoZ3JheSA+IDIyMSAmJiBjb2xvciA8IDIwKQotICAgICAgcmV0dXJuIEFyZ2JFbmNvZGUoYSwgbV9CYWNrQ29sb3IpOwotCi0gICAgcmV0dXJuIGFyZ2I7Ci0gIH0KLSAgaW50IGZyID0gRlhTWVNfR2V0UlZhbHVlKG1fRm9yZUNvbG9yKTsKLSAgaW50IGZnID0gRlhTWVNfR2V0R1ZhbHVlKG1fRm9yZUNvbG9yKTsKLSAgaW50IGZiID0gRlhTWVNfR2V0QlZhbHVlKG1fRm9yZUNvbG9yKTsKLSAgaW50IGJyID0gRlhTWVNfR2V0UlZhbHVlKG1fQmFja0NvbG9yKTsKLSAgaW50IGJnID0gRlhTWVNfR2V0R1ZhbHVlKG1fQmFja0NvbG9yKTsKLSAgaW50IGJiID0gRlhTWVNfR2V0QlZhbHVlKG1fQmFja0NvbG9yKTsKLSAgciA9IChiciAtIGZyKSAqIGdyYXkgLyAyNTUgKyBmcjsKLSAgZyA9IChiZyAtIGZnKSAqIGdyYXkgLyAyNTUgKyBmZzsKLSAgYiA9IChiYiAtIGZiKSAqIGdyYXkgLyAyNTUgKyBmYjsKLSAgcmV0dXJuIEFyZ2JFbmNvZGUoYSwgciwgZywgYik7CisgIHJldHVybiBBcmdiRW5jb2RlKGEsIGdyYXksIGdyYXksIGdyYXkpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3JlbmRlcm9wdGlvbnMuaCBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9yZW5kZXJvcHRpb25zLmgKaW5kZXggYjkzNDk0MS4uOWRjYTYzMyAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3JlbmRlcm9wdGlvbnMuaAorKysgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcmVuZGVyb3B0aW9ucy5oCkBAIC04LDE0ICs4LDEwIEBACiAjZGVmaW5lIENPUkVfRlBERkFQSV9SRU5ERVJfQ1BERl9SRU5ERVJPUFRJT05TX0hfCiAKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9vY2NvbnRleHQuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCiAKLSNkZWZpbmUgUkVOREVSX0NPTE9SX05PUk1BTCAwCi0jZGVmaW5lIFJFTkRFUl9DT0xPUl9HUkFZIDEKLSNkZWZpbmUgUkVOREVSX0NPTE9SX1RXT0NPTE9SIDIKLSNkZWZpbmUgUkVOREVSX0NPTE9SX0FMUEhBIDMKICNkZWZpbmUgUkVOREVSX0NMRUFSVFlQRSAweDAwMDAwMDAxCiAjZGVmaW5lIFJFTkRFUl9QUklOVEdSQVBISUNURVhUIDB4MDAwMDAwMDIKICNkZWZpbmUgUkVOREVSX0ZPUkNFX0RPV05TQU1QTEUgMHgwMDAwMDAwNApAQCAtMjgsNiArMjQsNyBAQAogI2RlZmluZSBSRU5ERVJfUFJJTlRJTUFHRVRFWFQgMHgwMDAwMDIwMAogI2RlZmluZSBSRU5ERVJfT1ZFUlBSSU5UIDB4MDAwMDA0MDAKICNkZWZpbmUgUkVOREVSX1RISU5MSU5FIDB4MDAwMDA4MDAKKyNkZWZpbmUgUkVOREVSX0JSRUFLRk9STUFTS1MgMHgwMDAwMTAwMAogI2RlZmluZSBSRU5ERVJfTk9URVhUU01PT1RIIDB4MTAwMDAwMDAKICNkZWZpbmUgUkVOREVSX05PUEFUSFNNT09USCAweDIwMDAwMDAwCiAjZGVmaW5lIFJFTkRFUl9OT0lNQUdFU01PT1RIIDB4NDAwMDAwMDAKQEAgLTM1LDIyICszMiwzNyBAQAogCiBjbGFzcyBDUERGX1JlbmRlck9wdGlvbnMgewogIHB1YmxpYzoKKyAgZW51bSBUeXBlIHsga05vcm1hbCA9IDAsIGtHcmF5LCBrQWxwaGEgfTsKKwogICBDUERGX1JlbmRlck9wdGlvbnMoKTsKICAgQ1BERl9SZW5kZXJPcHRpb25zKGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyYgcmhzKTsKICAgfkNQREZfUmVuZGVyT3B0aW9ucygpOwogCiAgIEZYX0FSR0IgVHJhbnNsYXRlQ29sb3IoRlhfQVJHQiBhcmdiKSBjb25zdDsKIAotICBpbnQgbV9Db2xvck1vZGU7Ci0gIEZYX0NPTE9SUkVGIG1fQmFja0NvbG9yOwotICBGWF9DT0xPUlJFRiBtX0ZvcmVDb2xvcjsKKyAgdm9pZCBTZXRDb2xvck1vZGUoVHlwZSBtb2RlKSB7IG1fQ29sb3JNb2RlID0gbW9kZTsgfQorICBib29sIENvbG9yTW9kZUlzKFR5cGUgbW9kZSkgY29uc3QgeyByZXR1cm4gbV9Db2xvck1vZGUgPT0gbW9kZTsgfQorCisgIGJvb2wgSGFzRmxhZyh1aW50MzJfdCBmbGFnKSBjb25zdCB7IHJldHVybiAhIShtX0ZsYWdzICYgZmxhZyk7IH0KKyAgdWludDMyX3QgR2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBtX0ZsYWdzOyB9CisgIHZvaWQgU2V0RmxhZ3ModWludDMyX3QgZmxhZ3MpIHsgbV9GbGFncyA9IGZsYWdzOyB9CisKKyAgdWludDMyX3QgR2V0Q2FjaGVTaXplTGltaXQoKSBjb25zdCB7IHJldHVybiBtX2R3TGltaXRDYWNoZVNpemU7IH0KKworICB2b2lkIFNldERyYXdBbm5vdHMoYm9vbCBkcmF3KSB7IG1fYkRyYXdBbm5vdHMgPSBkcmF3OyB9CisgIGJvb2wgR2V0RHJhd0Fubm90cygpIGNvbnN0IHsgcmV0dXJuIG1fYkRyYXdBbm5vdHM7IH0KKworICB2b2lkIFNldE9DQ29udGV4dChSZXRhaW5QdHI8Q1BERl9PQ0NvbnRleHQ+IGNvbnRleHQpIHsKKyAgICBtX3BPQ0NvbnRleHQgPSBjb250ZXh0OworICB9CisgIENQREZfT0NDb250ZXh0KiBHZXRPQ0NvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX3BPQ0NvbnRleHQuR2V0KCk7IH0KKworIHByaXZhdGU6CisgIFR5cGUgbV9Db2xvck1vZGU7CiAgIHVpbnQzMl90IG1fRmxhZ3M7Ci0gIGludCBtX0ludGVycG9sYXRpb247Ci0gIHVpbnQzMl90IG1fQWRkRmxhZ3M7CiAgIHVpbnQzMl90IG1fZHdMaW1pdENhY2hlU2l6ZTsKLSAgaW50IG1fSGFsZnRvbmVMaW1pdDsKICAgYm9vbCBtX2JEcmF3QW5ub3RzOwotICBDRlhfUmV0YWluUHRyPENQREZfT0NDb250ZXh0PiBtX3BPQ0NvbnRleHQ7CisgIFJldGFpblB0cjxDUERGX09DQ29udGV4dD4gbV9wT0NDb250ZXh0OwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZBUElfUkVOREVSX0NQREZfUkVOREVST1BUSU9OU19IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3JlbmRlcnN0YXR1cy5jcHAgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcmVuZGVyc3RhdHVzLmNwcAppbmRleCA5MDIyMjEyLi44ODk5ODY3IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcmVuZGVyc3RhdHVzLmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcmVuZGVyc3RhdHVzLmNwcApAQCAtNyw2ICs3LDggQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcmVuZGVyc3RhdHVzLmgiCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8bGltaXRzPgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHZlY3Rvcj4KQEAgLTE3LDYgKzE5LDcgQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2RvY3BhZ2VkYXRhLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9mb3JtLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9mb3Jtb2JqZWN0LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9mdW5jdGlvbi5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZ3JhcGhpY3N0YXRlcy5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfaW1hZ2UuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2ltYWdlb2JqZWN0LmgiCkBAIC0yOCw3ICszMSw2IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zaGFkaW5ncGF0dGVybi5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfdGV4dG9iamVjdC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfdGlsaW5ncGF0dGVybi5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL3BhZ2VpbnQuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudC5oIgpAQCAtNDUsMTcgKzQ3LDE4IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3RyYW5zZmVyZnVuYy5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl90eXBlM2NhY2hlLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfb2Njb250ZXh0LmgiCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2Z4X2NvZGVjLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfbWF5YmVfb3duZWQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2F1dG9yZXN0b3Jlci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X2ZpeGVkYnVmZ3Jvdy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc2FmZV90eXBlcy5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZnhnZWRldmljZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvbWF5YmVfb3duZWQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2RlZmF1bHRyZW5kZXJkZXZpY2UuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGVkYXRhLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2lmeF9yZW5kZXJkZXZpY2Vkcml2ZXIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2xvZ2dpbmcuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfbWF0aC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCiAKICNpZmRlZiBfU0tJQV9TVVBQT1JUXwogI2luY2x1ZGUgImNvcmUvZnhnZS9za2lhL2Z4X3NraWFfZGV2aWNlLmgiCkBAIC02NiwxMSArNjksMTIgQEAKIG5hbWVzcGFjZSB7CiAKIHZvaWQgUmVsZWFzZUNhY2hlZFR5cGUzKENQREZfVHlwZTNGb250KiBwRm9udCkgewotICBpZiAoIXBGb250LT5tX3BEb2N1bWVudCkKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IHBGb250LT5HZXREb2N1bWVudCgpOworICBpZiAoIXBEb2MpCiAgICAgcmV0dXJuOwogCi0gIHBGb250LT5tX3BEb2N1bWVudC0+R2V0UmVuZGVyRGF0YSgpLT5SZWxlYXNlQ2FjaGVkVHlwZTMocEZvbnQpOwotICBwRm9udC0+bV9wRG9jdW1lbnQtPkdldFBhZ2VEYXRhKCktPlJlbGVhc2VGb250KHBGb250LT5HZXRGb250RGljdCgpKTsKKyAgcERvYy0+R2V0UmVuZGVyRGF0YSgpLT5NYXliZVB1cmdlQ2FjaGVkVHlwZTMocEZvbnQpOworICBwRG9jLT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlRm9udChwRm9udC0+R2V0Rm9udERpY3QoKSk7CiB9CiAKIGNsYXNzIENQREZfUmVmVHlwZTNDYWNoZSB7CkBAIC04MCwxMSArODQsMTEgQEAKIAogICB+Q1BERl9SZWZUeXBlM0NhY2hlKCkgewogICAgIHdoaWxlIChtX2R3Q291bnQtLSkKLSAgICAgIFJlbGVhc2VDYWNoZWRUeXBlMyhtX3BUeXBlM0ZvbnQpOworICAgICAgUmVsZWFzZUNhY2hlZFR5cGUzKG1fcFR5cGUzRm9udC5HZXQoKSk7CiAgIH0KIAogICB1aW50MzJfdCBtX2R3Q291bnQ7Ci0gIENQREZfVHlwZTNGb250KiBjb25zdCBtX3BUeXBlM0ZvbnQ7CisgIFVub3duZWRQdHI8Q1BERl9UeXBlM0ZvbnQ+IGNvbnN0IG1fcFR5cGUzRm9udDsKIH07CiAKIHVpbnQzMl90IENvdW50T3V0cHV0cygKQEAgLTk3LDcgKzEwMSw3IEBACiAgIHJldHVybiB0b3RhbDsKIH0KIAotdm9pZCBEcmF3QXhpYWxTaGFkaW5nKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKK3ZvaWQgRHJhd0F4aWFsU2hhZGluZyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwT2JqZWN0MkJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDUERGX0Z1bmN0aW9uPj4mIGZ1bmNzLApAQCAtMTA4LDEyICsxMTIsMTIgQEAKICAgaWYgKCFwQ29vcmRzKQogICAgIHJldHVybjsKIAotICBGWF9GTE9BVCBzdGFydF94ID0gcENvb3Jkcy0+R2V0TnVtYmVyQXQoMCk7Ci0gIEZYX0ZMT0FUIHN0YXJ0X3kgPSBwQ29vcmRzLT5HZXROdW1iZXJBdCgxKTsKLSAgRlhfRkxPQVQgZW5kX3ggPSBwQ29vcmRzLT5HZXROdW1iZXJBdCgyKTsKLSAgRlhfRkxPQVQgZW5kX3kgPSBwQ29vcmRzLT5HZXROdW1iZXJBdCgzKTsKLSAgRlhfRkxPQVQgdF9taW4gPSAwOwotICBGWF9GTE9BVCB0X21heCA9IDEuMGY7CisgIGZsb2F0IHN0YXJ0X3ggPSBwQ29vcmRzLT5HZXROdW1iZXJBdCgwKTsKKyAgZmxvYXQgc3RhcnRfeSA9IHBDb29yZHMtPkdldE51bWJlckF0KDEpOworICBmbG9hdCBlbmRfeCA9IHBDb29yZHMtPkdldE51bWJlckF0KDIpOworICBmbG9hdCBlbmRfeSA9IHBDb29yZHMtPkdldE51bWJlckF0KDMpOworICBmbG9hdCB0X21pbiA9IDA7CisgIGZsb2F0IHRfbWF4ID0gMS4wZjsKICAgQ1BERl9BcnJheSogcEFycmF5ID0gcERpY3QtPkdldEFycmF5Rm9yKCJEb21haW4iKTsKICAgaWYgKHBBcnJheSkgewogICAgIHRfbWluID0gcEFycmF5LT5HZXROdW1iZXJBdCgwKTsKQEAgLTEyOCw0MCArMTMyLDQxIEBACiAgIH0KICAgaW50IHdpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKTsKICAgaW50IGhlaWdodCA9IHBCaXRtYXAtPkdldEhlaWdodCgpOwotICBGWF9GTE9BVCB4X3NwYW4gPSBlbmRfeCAtIHN0YXJ0X3g7Ci0gIEZYX0ZMT0FUIHlfc3BhbiA9IGVuZF95IC0gc3RhcnRfeTsKLSAgRlhfRkxPQVQgYXhpc19sZW5fc3F1YXJlID0gKHhfc3BhbiAqIHhfc3BhbikgKyAoeV9zcGFuICogeV9zcGFuKTsKLSAgQ0ZYX01hdHJpeCBtYXRyaXg7Ci0gIG1hdHJpeC5TZXRSZXZlcnNlKCpwT2JqZWN0MkJpdG1hcCk7CisgIGZsb2F0IHhfc3BhbiA9IGVuZF94IC0gc3RhcnRfeDsKKyAgZmxvYXQgeV9zcGFuID0gZW5kX3kgLSBzdGFydF95OworICBmbG9hdCBheGlzX2xlbl9zcXVhcmUgPSAoeF9zcGFuICogeF9zcGFuKSArICh5X3NwYW4gKiB5X3NwYW4pOwogICB1aW50MzJfdCB0b3RhbF9yZXN1bHRzID0KICAgICAgIHN0ZDo6bWF4KENvdW50T3V0cHV0cyhmdW5jcyksIHBDUy0+Q291bnRDb21wb25lbnRzKCkpOwotICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gcmVzdWx0X2FycmF5KHRvdGFsX3Jlc3VsdHMpOwotICBGWF9GTE9BVCogcFJlc3VsdHMgPSByZXN1bHRfYXJyYXk7Ci0gIEZYU1lTX21lbXNldChwUmVzdWx0cywgMCwgdG90YWxfcmVzdWx0cyAqIHNpemVvZihGWF9GTE9BVCkpOworICBDRlhfRml4ZWRCdWZHcm93PGZsb2F0LCAxNj4gcmVzdWx0X2FycmF5KHRvdGFsX3Jlc3VsdHMpOworICBmbG9hdCogcFJlc3VsdHMgPSByZXN1bHRfYXJyYXk7CisgIG1lbXNldChwUmVzdWx0cywgMCwgdG90YWxfcmVzdWx0cyAqIHNpemVvZihmbG9hdCkpOwogICB1aW50MzJfdCByZ2JfYXJyYXlbU0hBRElOR19TVEVQU107CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0hBRElOR19TVEVQUzsgaSsrKSB7Ci0gICAgRlhfRkxPQVQgaW5wdXQgPSAodF9tYXggLSB0X21pbikgKiBpIC8gU0hBRElOR19TVEVQUyArIHRfbWluOworICAgIGZsb2F0IGlucHV0ID0gKHRfbWF4IC0gdF9taW4pICogaSAvIFNIQURJTkdfU1RFUFMgKyB0X21pbjsKICAgICBpbnQgb2Zmc2V0ID0gMDsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGZ1bmMgOiBmdW5jcykgewogICAgICAgaWYgKGZ1bmMpIHsKICAgICAgICAgaW50IG5yZXN1bHRzID0gMDsKLSAgICAgICAgaWYgKGZ1bmMtPkNhbGwoJmlucHV0LCAxLCBwUmVzdWx0cyArIG9mZnNldCwgbnJlc3VsdHMpKQorICAgICAgICBpZiAoZnVuYy0+Q2FsbCgmaW5wdXQsIDEsIHBSZXN1bHRzICsgb2Zmc2V0LCAmbnJlc3VsdHMpKQogICAgICAgICAgIG9mZnNldCArPSBucmVzdWx0czsKICAgICAgIH0KICAgICB9Ci0gICAgRlhfRkxPQVQgUiA9IDAuMGYsIEcgPSAwLjBmLCBCID0gMC4wZjsKLSAgICBwQ1MtPkdldFJHQihwUmVzdWx0cywgUiwgRywgQik7CisgICAgZmxvYXQgUiA9IDAuMGY7CisgICAgZmxvYXQgRyA9IDAuMGY7CisgICAgZmxvYXQgQiA9IDAuMGY7CisgICAgcENTLT5HZXRSR0IocFJlc3VsdHMsICZSLCAmRywgJkIpOwogICAgIHJnYl9hcnJheVtpXSA9CiAgICAgICAgIEZYQVJHQl9UT0RJQihGWEFSR0JfTUFLRShhbHBoYSwgRlhTWVNfcm91bmQoUiAqIDI1NSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChHICogMjU1KSwgRlhTWVNfcm91bmQoQiAqIDI1NSkpKTsKICAgfQogICBpbnQgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOworICBDRlhfTWF0cml4IG1hdHJpeCA9IHBPYmplY3QyQml0bWFwLT5HZXRJbnZlcnNlKCk7CiAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKICAgICB1aW50MzJfdCogZGliX2J1ZiA9ICh1aW50MzJfdCopKHBCaXRtYXAtPkdldEJ1ZmZlcigpICsgcm93ICogcGl0Y2gpOwogICAgIGZvciAoaW50IGNvbHVtbiA9IDA7IGNvbHVtbiA8IHdpZHRoOyBjb2x1bW4rKykgewotICAgICAgQ0ZYX1BvaW50RiBwb3MgPSBtYXRyaXguVHJhbnNmb3JtKENGWF9Qb2ludEYoCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KGNvbHVtbiksIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihyb3cpKSk7Ci0gICAgICBGWF9GTE9BVCBzY2FsZSA9CisgICAgICBDRlhfUG9pbnRGIHBvcyA9IG1hdHJpeC5UcmFuc2Zvcm0oCisgICAgICAgICAgQ0ZYX1BvaW50RihzdGF0aWNfY2FzdDxmbG9hdD4oY29sdW1uKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHJvdykpKTsKKyAgICAgIGZsb2F0IHNjYWxlID0KICAgICAgICAgICAoKChwb3MueCAtIHN0YXJ0X3gpICogeF9zcGFuKSArICgocG9zLnkgLSBzdGFydF95KSAqIHlfc3BhbikpIC8KICAgICAgICAgICBheGlzX2xlbl9zcXVhcmU7CiAgICAgICBpbnQgaW5kZXggPSAoaW50MzJfdCkoc2NhbGUgKiAoU0hBRElOR19TVEVQUyAtIDEpKTsKQEAgLTE4MSw3ICsxODYsNyBAQAogICB9CiB9CiAKLXZvaWQgRHJhd1JhZGlhbFNoYWRpbmcoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAordm9pZCBEcmF3UmFkaWFsU2hhZGluZyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE9iamVjdDJCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDUERGX0Z1bmN0aW9uPj4mIGZ1bmNzLApAQCAtMTkyLDE2ICsxOTcsMTQgQEAKICAgaWYgKCFwQ29vcmRzKQogICAgIHJldHVybjsKIAotICBGWF9GTE9BVCBzdGFydF94ID0gcENvb3Jkcy0+R2V0TnVtYmVyQXQoMCk7Ci0gIEZYX0ZMT0FUIHN0YXJ0X3kgPSBwQ29vcmRzLT5HZXROdW1iZXJBdCgxKTsKLSAgRlhfRkxPQVQgc3RhcnRfciA9IHBDb29yZHMtPkdldE51bWJlckF0KDIpOwotICBGWF9GTE9BVCBlbmRfeCA9IHBDb29yZHMtPkdldE51bWJlckF0KDMpOwotICBGWF9GTE9BVCBlbmRfeSA9IHBDb29yZHMtPkdldE51bWJlckF0KDQpOwotICBGWF9GTE9BVCBlbmRfciA9IHBDb29yZHMtPkdldE51bWJlckF0KDUpOwotICBDRlhfTWF0cml4IG1hdHJpeDsKLSAgbWF0cml4LlNldFJldmVyc2UoKnBPYmplY3QyQml0bWFwKTsKLSAgRlhfRkxPQVQgdF9taW4gPSAwOwotICBGWF9GTE9BVCB0X21heCA9IDEuMGY7CisgIGZsb2F0IHN0YXJ0X3ggPSBwQ29vcmRzLT5HZXROdW1iZXJBdCgwKTsKKyAgZmxvYXQgc3RhcnRfeSA9IHBDb29yZHMtPkdldE51bWJlckF0KDEpOworICBmbG9hdCBzdGFydF9yID0gcENvb3Jkcy0+R2V0TnVtYmVyQXQoMik7CisgIGZsb2F0IGVuZF94ID0gcENvb3Jkcy0+R2V0TnVtYmVyQXQoMyk7CisgIGZsb2F0IGVuZF95ID0gcENvb3Jkcy0+R2V0TnVtYmVyQXQoNCk7CisgIGZsb2F0IGVuZF9yID0gcENvb3Jkcy0+R2V0TnVtYmVyQXQoNSk7CisgIGZsb2F0IHRfbWluID0gMDsKKyAgZmxvYXQgdF9tYXggPSAxLjBmOwogICBDUERGX0FycmF5KiBwQXJyYXkgPSBwRGljdC0+R2V0QXJyYXlGb3IoIkRvbWFpbiIpOwogICBpZiAocEFycmF5KSB7CiAgICAgdF9taW4gPSBwQXJyYXktPkdldE51bWJlckF0KDApOwpAQCAtMjE2LDYxICsyMTksNjMgQEAKICAgfQogICB1aW50MzJfdCB0b3RhbF9yZXN1bHRzID0KICAgICAgIHN0ZDo6bWF4KENvdW50T3V0cHV0cyhmdW5jcyksIHBDUy0+Q291bnRDb21wb25lbnRzKCkpOwotICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gcmVzdWx0X2FycmF5KHRvdGFsX3Jlc3VsdHMpOwotICBGWF9GTE9BVCogcFJlc3VsdHMgPSByZXN1bHRfYXJyYXk7Ci0gIEZYU1lTX21lbXNldChwUmVzdWx0cywgMCwgdG90YWxfcmVzdWx0cyAqIHNpemVvZihGWF9GTE9BVCkpOworICBDRlhfRml4ZWRCdWZHcm93PGZsb2F0LCAxNj4gcmVzdWx0X2FycmF5KHRvdGFsX3Jlc3VsdHMpOworICBmbG9hdCogcFJlc3VsdHMgPSByZXN1bHRfYXJyYXk7CisgIG1lbXNldChwUmVzdWx0cywgMCwgdG90YWxfcmVzdWx0cyAqIHNpemVvZihmbG9hdCkpOwogICB1aW50MzJfdCByZ2JfYXJyYXlbU0hBRElOR19TVEVQU107CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0hBRElOR19TVEVQUzsgaSsrKSB7Ci0gICAgRlhfRkxPQVQgaW5wdXQgPSAodF9tYXggLSB0X21pbikgKiBpIC8gU0hBRElOR19TVEVQUyArIHRfbWluOworICAgIGZsb2F0IGlucHV0ID0gKHRfbWF4IC0gdF9taW4pICogaSAvIFNIQURJTkdfU1RFUFMgKyB0X21pbjsKICAgICBpbnQgb2Zmc2V0ID0gMDsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGZ1bmMgOiBmdW5jcykgewogICAgICAgaWYgKGZ1bmMpIHsKICAgICAgICAgaW50IG5yZXN1bHRzOwotICAgICAgICBpZiAoZnVuYy0+Q2FsbCgmaW5wdXQsIDEsIHBSZXN1bHRzICsgb2Zmc2V0LCBucmVzdWx0cykpCisgICAgICAgIGlmIChmdW5jLT5DYWxsKCZpbnB1dCwgMSwgcFJlc3VsdHMgKyBvZmZzZXQsICZucmVzdWx0cykpCiAgICAgICAgICAgb2Zmc2V0ICs9IG5yZXN1bHRzOwogICAgICAgfQogICAgIH0KLSAgICBGWF9GTE9BVCBSID0gMC4wZiwgRyA9IDAuMGYsIEIgPSAwLjBmOwotICAgIHBDUy0+R2V0UkdCKHBSZXN1bHRzLCBSLCBHLCBCKTsKKyAgICBmbG9hdCBSID0gMC4wZjsKKyAgICBmbG9hdCBHID0gMC4wZjsKKyAgICBmbG9hdCBCID0gMC4wZjsKKyAgICBwQ1MtPkdldFJHQihwUmVzdWx0cywgJlIsICZHLCAmQik7CiAgICAgcmdiX2FycmF5W2ldID0KICAgICAgICAgRlhBUkdCX1RPRElCKEZYQVJHQl9NQUtFKGFscGhhLCBGWFNZU19yb3VuZChSICogMjU1KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKEcgKiAyNTUpLCBGWFNZU19yb3VuZChCICogMjU1KSkpOwogICB9Ci0gIEZYX0ZMT0FUIGEgPSAoKHN0YXJ0X3ggLSBlbmRfeCkgKiAoc3RhcnRfeCAtIGVuZF94KSkgKwotICAgICAgICAgICAgICAgKChzdGFydF95IC0gZW5kX3kpICogKHN0YXJ0X3kgLSBlbmRfeSkpIC0KLSAgICAgICAgICAgICAgICgoc3RhcnRfciAtIGVuZF9yKSAqIChzdGFydF9yIC0gZW5kX3IpKTsKKyAgZmxvYXQgYSA9ICgoc3RhcnRfeCAtIGVuZF94KSAqIChzdGFydF94IC0gZW5kX3gpKSArCisgICAgICAgICAgICAoKHN0YXJ0X3kgLSBlbmRfeSkgKiAoc3RhcnRfeSAtIGVuZF95KSkgLQorICAgICAgICAgICAgKChzdGFydF9yIC0gZW5kX3IpICogKHN0YXJ0X3IgLSBlbmRfcikpOwogICBpbnQgd2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOwogICBpbnQgaGVpZ2h0ID0gcEJpdG1hcC0+R2V0SGVpZ2h0KCk7CiAgIGludCBwaXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCk7CiAgIGJvb2wgYkRlY3JlYXNpbmcgPSBmYWxzZTsKICAgaWYgKHN0YXJ0X3IgPiBlbmRfcikgewotICAgIGludCBsZW5ndGggPSAoaW50KUZYU1lTX3NxcnQoKCgoc3RhcnRfeCAtIGVuZF94KSAqIChzdGFydF94IC0gZW5kX3gpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzdGFydF95IC0gZW5kX3kpICogKHN0YXJ0X3kgLSBlbmRfeSkpKSk7CisgICAgaW50IGxlbmd0aCA9IChpbnQpc3FydCgoKChzdGFydF94IC0gZW5kX3gpICogKHN0YXJ0X3ggLSBlbmRfeCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHN0YXJ0X3kgLSBlbmRfeSkgKiAoc3RhcnRfeSAtIGVuZF95KSkpKTsKICAgICBpZiAobGVuZ3RoIDwgc3RhcnRfciAtIGVuZF9yKSB7CiAgICAgICBiRGVjcmVhc2luZyA9IHRydWU7CiAgICAgfQogICB9CisgIENGWF9NYXRyaXggbWF0cml4ID0gcE9iamVjdDJCaXRtYXAtPkdldEludmVyc2UoKTsKICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgewogICAgIHVpbnQzMl90KiBkaWJfYnVmID0gKHVpbnQzMl90KikocEJpdG1hcC0+R2V0QnVmZmVyKCkgKyByb3cgKiBwaXRjaCk7CiAgICAgZm9yIChpbnQgY29sdW1uID0gMDsgY29sdW1uIDwgd2lkdGg7IGNvbHVtbisrKSB7Ci0gICAgICBDRlhfUG9pbnRGIHBvcyA9IG1hdHJpeC5UcmFuc2Zvcm0oQ0ZYX1BvaW50RigKLSAgICAgICAgICBzdGF0aWNfY2FzdDxGWF9GTE9BVD4oY29sdW1uKSwgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHJvdykpKTsKLSAgICAgIEZYX0ZMT0FUIGIgPSAtMiAqICgoKHBvcy54IC0gc3RhcnRfeCkgKiAoZW5kX3ggLSBzdGFydF94KSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICgocG9zLnkgLSBzdGFydF95KSAqIChlbmRfeSAtIHN0YXJ0X3kpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXJ0X3IgKiAoZW5kX3IgLSBzdGFydF9yKSkpOwotICAgICAgRlhfRkxPQVQgYyA9ICgocG9zLnggLSBzdGFydF94KSAqIChwb3MueCAtIHN0YXJ0X3gpKSArCi0gICAgICAgICAgICAgICAgICAgKChwb3MueSAtIHN0YXJ0X3kpICogKHBvcy55IC0gc3RhcnRfeSkpIC0KLSAgICAgICAgICAgICAgICAgICAoc3RhcnRfciAqIHN0YXJ0X3IpOwotICAgICAgRlhfRkxPQVQgczsKKyAgICAgIENGWF9Qb2ludEYgcG9zID0gbWF0cml4LlRyYW5zZm9ybSgKKyAgICAgICAgICBDRlhfUG9pbnRGKHN0YXRpY19jYXN0PGZsb2F0Pihjb2x1bW4pLCBzdGF0aWNfY2FzdDxmbG9hdD4ocm93KSkpOworICAgICAgZmxvYXQgYiA9IC0yICogKCgocG9zLnggLSBzdGFydF94KSAqIChlbmRfeCAtIHN0YXJ0X3gpKSArCisgICAgICAgICAgICAgICAgICAgICAgKChwb3MueSAtIHN0YXJ0X3kpICogKGVuZF95IC0gc3RhcnRfeSkpICsKKyAgICAgICAgICAgICAgICAgICAgICAoc3RhcnRfciAqIChlbmRfciAtIHN0YXJ0X3IpKSk7CisgICAgICBmbG9hdCBjID0gKChwb3MueCAtIHN0YXJ0X3gpICogKHBvcy54IC0gc3RhcnRfeCkpICsKKyAgICAgICAgICAgICAgICAoKHBvcy55IC0gc3RhcnRfeSkgKiAocG9zLnkgLSBzdGFydF95KSkgLSAoc3RhcnRfciAqIHN0YXJ0X3IpOworICAgICAgZmxvYXQgczsKICAgICAgIGlmIChhID09IDApIHsKICAgICAgICAgcyA9IC1jIC8gYjsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYX0ZMT0FUIGIyXzRhYyA9IChiICogYikgLSA0ICogKGEgKiBjKTsKKyAgICAgICAgZmxvYXQgYjJfNGFjID0gKGIgKiBiKSAtIDQgKiAoYSAqIGMpOwogICAgICAgICBpZiAoYjJfNGFjIDwgMCkgewogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIEZYX0ZMT0FUIHJvb3QgPSBGWFNZU19zcXJ0KGIyXzRhYyk7Ci0gICAgICAgIEZYX0ZMT0FUIHMxLCBzMjsKKyAgICAgICAgZmxvYXQgcm9vdCA9IHNxcnQoYjJfNGFjKTsKKyAgICAgICAgZmxvYXQgczEsIHMyOwogICAgICAgICBpZiAoYSA+IDApIHsKICAgICAgICAgICBzMSA9ICgtYiAtIHJvb3QpIC8gKDIgKiBhKTsKICAgICAgICAgICBzMiA9ICgtYiArIHJvb3QpIC8gKDIgKiBhKTsKQEAgLTMxMyw3ICszMTgsNyBAQAogICB9CiB9CiAKLXZvaWQgRHJhd0Z1bmNTaGFkaW5nKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKK3ZvaWQgRHJhd0Z1bmNTaGFkaW5nKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwQml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE9iamVjdDJCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAogICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENQREZfRnVuY3Rpb24+PiYgZnVuY3MsCkBAIC0zMjEsNyArMzI2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSkgewogICBBU1NFUlQocEJpdG1hcC0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYik7CiAgIENQREZfQXJyYXkqIHBEb21haW4gPSBwRGljdC0+R2V0QXJyYXlGb3IoIkRvbWFpbiIpOwotICBGWF9GTE9BVCB4bWluID0gMCwgeW1pbiA9IDAsIHhtYXggPSAxLjBmLCB5bWF4ID0gMS4wZjsKKyAgZmxvYXQgeG1pbiA9IDAsIHltaW4gPSAwLCB4bWF4ID0gMS4wZiwgeW1heCA9IDEuMGY7CiAgIGlmIChwRG9tYWluKSB7CiAgICAgeG1pbiA9IHBEb21haW4tPkdldE51bWJlckF0KDApOwogICAgIHhtYXggPSBwRG9tYWluLT5HZXROdW1iZXJBdCgxKTsKQEAgLTMyOSw0MiArMzM0LDM4IEBACiAgICAgeW1heCA9IHBEb21haW4tPkdldE51bWJlckF0KDMpOwogICB9CiAgIENGWF9NYXRyaXggbXREb21haW4yVGFyZ2V0ID0gcERpY3QtPkdldE1hdHJpeEZvcigiTWF0cml4Iik7Ci0gIENGWF9NYXRyaXggbWF0cml4OwotICBtYXRyaXguU2V0UmV2ZXJzZSgqcE9iamVjdDJCaXRtYXApOwotCi0gIENGWF9NYXRyaXggcmV2ZXJzZV9tYXRyaXg7Ci0gIHJldmVyc2VfbWF0cml4LlNldFJldmVyc2UobXREb21haW4yVGFyZ2V0KTsKLSAgbWF0cml4LkNvbmNhdChyZXZlcnNlX21hdHJpeCk7CisgIENGWF9NYXRyaXggbWF0cml4ID0gcE9iamVjdDJCaXRtYXAtPkdldEludmVyc2UoKTsKKyAgbWF0cml4LkNvbmNhdChtdERvbWFpbjJUYXJnZXQuR2V0SW52ZXJzZSgpKTsKICAgaW50IHdpZHRoID0gcEJpdG1hcC0+R2V0V2lkdGgoKTsKICAgaW50IGhlaWdodCA9IHBCaXRtYXAtPkdldEhlaWdodCgpOwogICBpbnQgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOwogICB1aW50MzJfdCB0b3RhbF9yZXN1bHRzID0KICAgICAgIHN0ZDo6bWF4KENvdW50T3V0cHV0cyhmdW5jcyksIHBDUy0+Q291bnRDb21wb25lbnRzKCkpOwotICBDRlhfRml4ZWRCdWZHcm93PEZYX0ZMT0FULCAxNj4gcmVzdWx0X2FycmF5KHRvdGFsX3Jlc3VsdHMpOwotICBGWF9GTE9BVCogcFJlc3VsdHMgPSByZXN1bHRfYXJyYXk7Ci0gIEZYU1lTX21lbXNldChwUmVzdWx0cywgMCwgdG90YWxfcmVzdWx0cyAqIHNpemVvZihGWF9GTE9BVCkpOworICBDRlhfRml4ZWRCdWZHcm93PGZsb2F0LCAxNj4gcmVzdWx0X2FycmF5KHRvdGFsX3Jlc3VsdHMpOworICBmbG9hdCogcFJlc3VsdHMgPSByZXN1bHRfYXJyYXk7CisgIG1lbXNldChwUmVzdWx0cywgMCwgdG90YWxfcmVzdWx0cyAqIHNpemVvZihmbG9hdCkpOwogICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CiAgICAgdWludDMyX3QqIGRpYl9idWYgPSAodWludDMyX3QqKShwQml0bWFwLT5HZXRCdWZmZXIoKSArIHJvdyAqIHBpdGNoKTsKICAgICBmb3IgKGludCBjb2x1bW4gPSAwOyBjb2x1bW4gPCB3aWR0aDsgY29sdW1uKyspIHsKLSAgICAgIENGWF9Qb2ludEYgcG9zID0gbWF0cml4LlRyYW5zZm9ybShDRlhfUG9pbnRGKAotICAgICAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihjb2x1bW4pLCBzdGF0aWNfY2FzdDxGWF9GTE9BVD4ocm93KSkpOworICAgICAgQ0ZYX1BvaW50RiBwb3MgPSBtYXRyaXguVHJhbnNmb3JtKAorICAgICAgICAgIENGWF9Qb2ludEYoc3RhdGljX2Nhc3Q8ZmxvYXQ+KGNvbHVtbiksIHN0YXRpY19jYXN0PGZsb2F0Pihyb3cpKSk7CiAgICAgICBpZiAocG9zLnggPCB4bWluIHx8IHBvcy54ID4geG1heCB8fCBwb3MueSA8IHltaW4gfHwgcG9zLnkgPiB5bWF4KQogICAgICAgICBjb250aW51ZTsKIAotICAgICAgRlhfRkxPQVQgaW5wdXRbXSA9IHtwb3MueCwgcG9zLnl9OworICAgICAgZmxvYXQgaW5wdXRbXSA9IHtwb3MueCwgcG9zLnl9OwogICAgICAgaW50IG9mZnNldCA9IDA7CiAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGZ1bmMgOiBmdW5jcykgewogICAgICAgICBpZiAoZnVuYykgewogICAgICAgICAgIGludCBucmVzdWx0czsKLSAgICAgICAgICBpZiAoZnVuYy0+Q2FsbChpbnB1dCwgMiwgcFJlc3VsdHMgKyBvZmZzZXQsIG5yZXN1bHRzKSkKKyAgICAgICAgICBpZiAoZnVuYy0+Q2FsbChpbnB1dCwgMiwgcFJlc3VsdHMgKyBvZmZzZXQsICZucmVzdWx0cykpCiAgICAgICAgICAgICBvZmZzZXQgKz0gbnJlc3VsdHM7CiAgICAgICAgIH0KICAgICAgIH0KIAotICAgICAgRlhfRkxPQVQgUiA9IDAuMGY7Ci0gICAgICBGWF9GTE9BVCBHID0gMC4wZjsKLSAgICAgIEZYX0ZMT0FUIEIgPSAwLjBmOwotICAgICAgcENTLT5HZXRSR0IocFJlc3VsdHMsIFIsIEcsIEIpOworICAgICAgZmxvYXQgUiA9IDAuMGY7CisgICAgICBmbG9hdCBHID0gMC4wZjsKKyAgICAgIGZsb2F0IEIgPSAwLjBmOworICAgICAgcENTLT5HZXRSR0IocFJlc3VsdHMsICZSLCAmRywgJkIpOwogICAgICAgZGliX2J1Zltjb2x1bW5dID0gRlhBUkdCX1RPRElCKEZYQVJHQl9NQUtFKAogICAgICAgICAgIGFscGhhLCAoaW50MzJfdCkoUiAqIDI1NSksIChpbnQzMl90KShHICogMjU1KSwgKGludDMyX3QpKEIgKiAyNTUpKSk7CiAgICAgfQpAQCAtMzc0LDcgKzM3NSw3IEBACiBib29sIEdldFNjYW5saW5lSW50ZXJzZWN0KGludCB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBmaXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgc2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogeCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogeCkgewogICBpZiAoZmlyc3QueSA9PSBzZWNvbmQueSkKICAgICByZXR1cm4gZmFsc2U7CiAKQEAgLTM4OCwxMSArMzg5LDExIEBACiAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIERyYXdHb3VyYXVkKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKK3ZvaWQgRHJhd0dvdXJhdWQoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgIGludCBhbHBoYSwKICAgICAgICAgICAgICAgICAgQ1BERl9NZXNoVmVydGV4IHRyaWFuZ2xlWzNdKSB7Ci0gIEZYX0ZMT0FUIG1pbl95ID0gdHJpYW5nbGVbMF0ucG9zaXRpb24ueTsKLSAgRlhfRkxPQVQgbWF4X3kgPSB0cmlhbmdsZVswXS5wb3NpdGlvbi55OworICBmbG9hdCBtaW5feSA9IHRyaWFuZ2xlWzBdLnBvc2l0aW9uLnk7CisgIGZsb2F0IG1heF95ID0gdHJpYW5nbGVbMF0ucG9zaXRpb24ueTsKICAgZm9yIChpbnQgaSA9IDE7IGkgPCAzOyBpKyspIHsKICAgICBtaW5feSA9IHN0ZDo6bWluKG1pbl95LCB0cmlhbmdsZVtpXS5wb3NpdGlvbi55KTsKICAgICBtYXhfeSA9IHN0ZDo6bWF4KG1heF95LCB0cmlhbmdsZVtpXS5wb3NpdGlvbi55KTsKQEAgLTQwMCwxOCArNDAxLDE4IEBACiAgIGlmIChtaW5feSA9PSBtYXhfeSkKICAgICByZXR1cm47CiAKLSAgaW50IG1pbl95aSA9IHN0ZDo6bWF4KHN0YXRpY19jYXN0PGludD4oRlhTWVNfZmxvb3IobWluX3kpKSwgMCk7Ci0gIGludCBtYXhfeWkgPSBzdGF0aWNfY2FzdDxpbnQ+KEZYU1lTX2NlaWwobWF4X3kpKTsKKyAgaW50IG1pbl95aSA9IHN0ZDo6bWF4KHN0YXRpY19jYXN0PGludD4oZmxvb3IobWluX3kpKSwgMCk7CisgIGludCBtYXhfeWkgPSBzdGF0aWNfY2FzdDxpbnQ+KGNlaWwobWF4X3kpKTsKIAogICBpZiAobWF4X3lpID49IHBCaXRtYXAtPkdldEhlaWdodCgpKQogICAgIG1heF95aSA9IHBCaXRtYXAtPkdldEhlaWdodCgpIC0gMTsKIAogICBmb3IgKGludCB5ID0gbWluX3lpOyB5IDw9IG1heF95aTsgeSsrKSB7CiAgICAgaW50IG5JbnRlcnNlY3RzID0gMDsKLSAgICBGWF9GTE9BVCBpbnRlcl94WzNdOwotICAgIEZYX0ZMT0FUIHJbM107Ci0gICAgRlhfRkxPQVQgZ1szXTsKLSAgICBGWF9GTE9BVCBiWzNdOworICAgIGZsb2F0IGludGVyX3hbM107CisgICAgZmxvYXQgclszXTsKKyAgICBmbG9hdCBnWzNdOworICAgIGZsb2F0IGJbM107CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICAgIENQREZfTWVzaFZlcnRleCYgdmVydGV4MSA9IHRyaWFuZ2xlW2ldOwogICAgICAgQ1BERl9NZXNoVmVydGV4JiB2ZXJ0ZXgyID0gdHJpYW5nbGVbKGkgKyAxKSAlIDNdOwpAQCAtNDIyLDcgKzQyMyw3IEBACiAgICAgICBpZiAoIWJJbnRlcnNlY3QpCiAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICBGWF9GTE9BVCB5X2Rpc3QgPSAoeSAtIHBvc2l0aW9uMS55KSAvIChwb3NpdGlvbjIueSAtIHBvc2l0aW9uMS55KTsKKyAgICAgIGZsb2F0IHlfZGlzdCA9ICh5IC0gcG9zaXRpb24xLnkpIC8gKHBvc2l0aW9uMi55IC0gcG9zaXRpb24xLnkpOwogICAgICAgcltuSW50ZXJzZWN0c10gPSB2ZXJ0ZXgxLnIgKyAoKHZlcnRleDIuciAtIHZlcnRleDEucikgKiB5X2Rpc3QpOwogICAgICAgZ1tuSW50ZXJzZWN0c10gPSB2ZXJ0ZXgxLmcgKyAoKHZlcnRleDIuZyAtIHZlcnRleDEuZykgKiB5X2Rpc3QpOwogICAgICAgYltuSW50ZXJzZWN0c10gPSB2ZXJ0ZXgxLmIgKyAoKHZlcnRleDIuYiAtIHZlcnRleDEuYikgKiB5X2Rpc3QpOwpAQCAtNDMzLDEzICs0MzQsMTMgQEAKIAogICAgIGludCBtaW5feCwgbWF4X3gsIHN0YXJ0X2luZGV4LCBlbmRfaW5kZXg7CiAgICAgaWYgKGludGVyX3hbMF0gPCBpbnRlcl94WzFdKSB7Ci0gICAgICBtaW5feCA9IChpbnQpRlhTWVNfZmxvb3IoaW50ZXJfeFswXSk7Ci0gICAgICBtYXhfeCA9IChpbnQpRlhTWVNfY2VpbChpbnRlcl94WzFdKTsKKyAgICAgIG1pbl94ID0gKGludClmbG9vcihpbnRlcl94WzBdKTsKKyAgICAgIG1heF94ID0gKGludCljZWlsKGludGVyX3hbMV0pOwogICAgICAgc3RhcnRfaW5kZXggPSAwOwogICAgICAgZW5kX2luZGV4ID0gMTsKICAgICB9IGVsc2UgewotICAgICAgbWluX3ggPSAoaW50KUZYU1lTX2Zsb29yKGludGVyX3hbMV0pOwotICAgICAgbWF4X3ggPSAoaW50KUZYU1lTX2NlaWwoaW50ZXJfeFswXSk7CisgICAgICBtaW5feCA9IChpbnQpZmxvb3IoaW50ZXJfeFsxXSk7CisgICAgICBtYXhfeCA9IChpbnQpY2VpbChpbnRlcl94WzBdKTsKICAgICAgIHN0YXJ0X2luZGV4ID0gMTsKICAgICAgIGVuZF9pbmRleCA9IDA7CiAgICAgfQpAQCAtNDUxLDEyICs0NTIsMTIgQEAKIAogICAgIHVpbnQ4X3QqIGRpYl9idWYgPQogICAgICAgICBwQml0bWFwLT5HZXRCdWZmZXIoKSArIHkgKiBwQml0bWFwLT5HZXRQaXRjaCgpICsgc3RhcnRfeCAqIDQ7Ci0gICAgRlhfRkxPQVQgcl91bml0ID0gKHJbZW5kX2luZGV4XSAtIHJbc3RhcnRfaW5kZXhdKSAvIChtYXhfeCAtIG1pbl94KTsKLSAgICBGWF9GTE9BVCBnX3VuaXQgPSAoZ1tlbmRfaW5kZXhdIC0gZ1tzdGFydF9pbmRleF0pIC8gKG1heF94IC0gbWluX3gpOwotICAgIEZYX0ZMT0FUIGJfdW5pdCA9IChiW2VuZF9pbmRleF0gLSBiW3N0YXJ0X2luZGV4XSkgLyAobWF4X3ggLSBtaW5feCk7Ci0gICAgRlhfRkxPQVQgUiA9IHJbc3RhcnRfaW5kZXhdICsgKHN0YXJ0X3ggLSBtaW5feCkgKiByX3VuaXQ7Ci0gICAgRlhfRkxPQVQgRyA9IGdbc3RhcnRfaW5kZXhdICsgKHN0YXJ0X3ggLSBtaW5feCkgKiBnX3VuaXQ7Ci0gICAgRlhfRkxPQVQgQiA9IGJbc3RhcnRfaW5kZXhdICsgKHN0YXJ0X3ggLSBtaW5feCkgKiBiX3VuaXQ7CisgICAgZmxvYXQgcl91bml0ID0gKHJbZW5kX2luZGV4XSAtIHJbc3RhcnRfaW5kZXhdKSAvIChtYXhfeCAtIG1pbl94KTsKKyAgICBmbG9hdCBnX3VuaXQgPSAoZ1tlbmRfaW5kZXhdIC0gZ1tzdGFydF9pbmRleF0pIC8gKG1heF94IC0gbWluX3gpOworICAgIGZsb2F0IGJfdW5pdCA9IChiW2VuZF9pbmRleF0gLSBiW3N0YXJ0X2luZGV4XSkgLyAobWF4X3ggLSBtaW5feCk7CisgICAgZmxvYXQgUiA9IHJbc3RhcnRfaW5kZXhdICsgKHN0YXJ0X3ggLSBtaW5feCkgKiByX3VuaXQ7CisgICAgZmxvYXQgRyA9IGdbc3RhcnRfaW5kZXhdICsgKHN0YXJ0X3ggLSBtaW5feCkgKiBnX3VuaXQ7CisgICAgZmxvYXQgQiA9IGJbc3RhcnRfaW5kZXhdICsgKHN0YXJ0X3ggLSBtaW5feCkgKiBiX3VuaXQ7CiAgICAgZm9yIChpbnQgeCA9IHN0YXJ0X3g7IHggPCBlbmRfeDsgeCsrKSB7CiAgICAgICBSICs9IHJfdW5pdDsKICAgICAgIEcgKz0gZ191bml0OwpAQCAtNDcwLDcgKzQ3MSw3IEBACiB9CiAKIHZvaWQgRHJhd0ZyZWVHb3VyYXVkU2hhZGluZygKLSAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBCaXRtYXAsCiAgICAgQ0ZYX01hdHJpeCogcE9iamVjdDJCaXRtYXAsCiAgICAgQ1BERl9TdHJlYW0qIHBTaGFkaW5nU3RyZWFtLAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDUERGX0Z1bmN0aW9uPj4mIGZ1bmNzLApAQCAtNDg0LDcgKzQ4NSw3IEBACiAgICAgcmV0dXJuOwogCiAgIENQREZfTWVzaFZlcnRleCB0cmlhbmdsZVszXTsKLSAgRlhTWVNfbWVtc2V0KHRyaWFuZ2xlLCAwLCBzaXplb2YodHJpYW5nbGUpKTsKKyAgbWVtc2V0KHRyaWFuZ2xlLCAwLCBzaXplb2YodHJpYW5nbGUpKTsKIAogICB3aGlsZSAoIXN0cmVhbS5CaXRTdHJlYW0oKS0+SXNFT0YoKSkgewogICAgIENQREZfTWVzaFZlcnRleCB2ZXJ0ZXg7CkBAIC01MTEsNyArNTEyLDcgQEAKIH0KIAogdm9pZCBEcmF3TGF0dGljZUdvdXJhdWRTaGFkaW5nKAotICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcCwKICAgICBDRlhfTWF0cml4KiBwT2JqZWN0MkJpdG1hcCwKICAgICBDUERGX1N0cmVhbSogcFNoYWRpbmdTdHJlYW0sCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENQREZfRnVuY3Rpb24+PiYgZnVuY3MsCkBAIC01MjgsMjUgKzUyOSwyNCBAQAogICBpZiAoIXN0cmVhbS5Mb2FkKCkpCiAgICAgcmV0dXJuOwogCi0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX01lc2hWZXJ0ZXgsIEZ4RnJlZURlbGV0ZXI+IHZlcnRleCgKLSAgICAgIEZYX0FsbG9jMkQoQ1BERl9NZXNoVmVydGV4LCByb3dfdmVydHMsIDIpKTsKLSAgaWYgKCFzdHJlYW0uUmVhZFZlcnRleFJvdygqcE9iamVjdDJCaXRtYXAsIHJvd192ZXJ0cywgdmVydGV4LmdldCgpKSkKKyAgc3RkOjp2ZWN0b3I8Q1BERl9NZXNoVmVydGV4PiB2ZXJ0aWNlc1syXTsKKyAgdmVydGljZXNbMF0gPSBzdHJlYW0uUmVhZFZlcnRleFJvdygqcE9iamVjdDJCaXRtYXAsIHJvd192ZXJ0cyk7CisgIGlmICh2ZXJ0aWNlc1swXS5lbXB0eSgpKQogICAgIHJldHVybjsKIAogICBpbnQgbGFzdF9pbmRleCA9IDA7CiAgIHdoaWxlICgxKSB7Ci0gICAgQ1BERl9NZXNoVmVydGV4KiBsYXN0X3JvdyA9IHZlcnRleC5nZXQoKSArIGxhc3RfaW5kZXggKiByb3dfdmVydHM7Ci0gICAgQ1BERl9NZXNoVmVydGV4KiB0aGlzX3JvdyA9IHZlcnRleC5nZXQoKSArICgxIC0gbGFzdF9pbmRleCkgKiByb3dfdmVydHM7Ci0gICAgaWYgKCFzdHJlYW0uUmVhZFZlcnRleFJvdygqcE9iamVjdDJCaXRtYXAsIHJvd192ZXJ0cywgdGhpc19yb3cpKQorICAgIHZlcnRpY2VzWzEgLSBsYXN0X2luZGV4XSA9IHN0cmVhbS5SZWFkVmVydGV4Um93KCpwT2JqZWN0MkJpdG1hcCwgcm93X3ZlcnRzKTsKKyAgICBpZiAodmVydGljZXNbMSAtIGxhc3RfaW5kZXhdLmVtcHR5KCkpCiAgICAgICByZXR1cm47CiAKICAgICBDUERGX01lc2hWZXJ0ZXggdHJpYW5nbGVbM107Ci0gICAgZm9yIChpbnQgaSA9IDE7IGkgPCByb3dfdmVydHM7IGkrKykgewotICAgICAgdHJpYW5nbGVbMF0gPSBsYXN0X3Jvd1tpXTsKLSAgICAgIHRyaWFuZ2xlWzFdID0gdGhpc19yb3dbaSAtIDFdOwotICAgICAgdHJpYW5nbGVbMl0gPSBsYXN0X3Jvd1tpIC0gMV07CisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCByb3dfdmVydHM7ICsraSkgeworICAgICAgdHJpYW5nbGVbMF0gPSB2ZXJ0aWNlc1tsYXN0X2luZGV4XVtpXTsKKyAgICAgIHRyaWFuZ2xlWzFdID0gdmVydGljZXNbMSAtIGxhc3RfaW5kZXhdW2kgLSAxXTsKKyAgICAgIHRyaWFuZ2xlWzJdID0gdmVydGljZXNbbGFzdF9pbmRleF1baSAtIDFdOwogICAgICAgRHJhd0dvdXJhdWQocEJpdG1hcCwgYWxwaGEsIHRyaWFuZ2xlKTsKLSAgICAgIHRyaWFuZ2xlWzJdID0gdGhpc19yb3dbaV07CisgICAgICB0cmlhbmdsZVsyXSA9IHZlcnRpY2VzWzEgLSBsYXN0X2luZGV4XVtpXTsKICAgICAgIERyYXdHb3VyYXVkKHBCaXRtYXAsIGFscGhhLCB0cmlhbmdsZSk7CiAgICAgfQogICAgIGxhc3RfaW5kZXggPSAxIC0gbGFzdF9pbmRleDsKQEAgLTY2OCw2ICs2NjgsMTcgQEAKICAgZmxvYXQgRGlzdGFuY2UoKSB7IHJldHVybiB4LkRpc3RhbmNlKCkgKyB5LkRpc3RhbmNlKCk7IH0KIH07CiAKK2ludCBJbnRlcnBvbGF0ZShpbnQgcDEsIGludCBwMiwgaW50IGRlbHRhMSwgaW50IGRlbHRhMiwgYm9vbCogb3ZlcmZsb3cpIHsKKyAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQ+IHAgPSBwMjsKKyAgcCAtPSBwMTsKKyAgcCAqPSBkZWx0YTE7CisgIHAgLz0gZGVsdGEyOworICBwICs9IHAxOworICBpZiAoIXAuSXNWYWxpZCgpKQorICAgICpvdmVyZmxvdyA9IHRydWU7CisgIHJldHVybiBwLlZhbHVlT3JEZWZhdWx0KDApOworfQorCiBpbnQgQmlJbnRlcnBvbEltcGwoaW50IGMwLAogICAgICAgICAgICAgICAgICAgIGludCBjMSwKICAgICAgICAgICAgICAgICAgICBpbnQgYzIsCkBAIC02NzUsMzIgKzY4NiwzNSBAQAogICAgICAgICAgICAgICAgICAgIGludCB4LAogICAgICAgICAgICAgICAgICAgIGludCB5LAogICAgICAgICAgICAgICAgICAgIGludCB4X3NjYWxlLAotICAgICAgICAgICAgICAgICAgIGludCB5X3NjYWxlKSB7Ci0gIGludCB4MSA9IGMwICsgKGMzIC0gYzApICogeCAvIHhfc2NhbGU7Ci0gIGludCB4MiA9IGMxICsgKGMyIC0gYzEpICogeCAvIHhfc2NhbGU7Ci0gIHJldHVybiB4MSArICh4MiAtIHgxKSAqIHkgLyB5X3NjYWxlOworICAgICAgICAgICAgICAgICAgIGludCB5X3NjYWxlLAorICAgICAgICAgICAgICAgICAgIGJvb2wqIG92ZXJmbG93KSB7CisgIGludCB4MSA9IEludGVycG9sYXRlKGMwLCBjMywgeCwgeF9zY2FsZSwgb3ZlcmZsb3cpOworICBpbnQgeDIgPSBJbnRlcnBvbGF0ZShjMSwgYzIsIHgsIHhfc2NhbGUsIG92ZXJmbG93KTsKKyAgcmV0dXJuIEludGVycG9sYXRlKHgxLCB4MiwgeSwgeV9zY2FsZSwgb3ZlcmZsb3cpOwogfQogCiBzdHJ1Y3QgQ29vbl9Db2xvciB7Ci0gIENvb25fQ29sb3IoKSB7IEZYU1lTX21lbXNldChjb21wLCAwLCBzaXplb2YoaW50KSAqIDMpOyB9CisgIENvb25fQ29sb3IoKSB7IG1lbXNldChjb21wLCAwLCBzaXplb2YoaW50KSAqIDMpOyB9CiAgIGludCBjb21wWzNdOwogCi0gIHZvaWQgQmlJbnRlcnBvbChDb29uX0NvbG9yIGNvbG9yc1s0XSwKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIGlmIG92ZXJmbG93IGRldGVjdGVkLgorICBib29sIEJpSW50ZXJwb2woQ29vbl9Db2xvciBjb2xvcnNbNF0sCiAgICAgICAgICAgICAgICAgICBpbnQgeCwKICAgICAgICAgICAgICAgICAgIGludCB5LAogICAgICAgICAgICAgICAgICAgaW50IHhfc2NhbGUsCiAgICAgICAgICAgICAgICAgICBpbnQgeV9zY2FsZSkgeworICAgIGJvb2wgb3ZlcmZsb3cgPSBmYWxzZTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewogICAgICAgY29tcFtpXSA9IEJpSW50ZXJwb2xJbXBsKGNvbG9yc1swXS5jb21wW2ldLCBjb2xvcnNbMV0uY29tcFtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnNbMl0uY29tcFtpXSwgY29sb3JzWzNdLmNvbXBbaV0sIHgsIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9zY2FsZSwgeV9zY2FsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9zY2FsZSwgeV9zY2FsZSwgJm92ZXJmbG93KTsKICAgICB9CisgICAgcmV0dXJuICFvdmVyZmxvdzsKICAgfQogCiAgIGludCBEaXN0YW5jZShDb29uX0NvbG9yJiBvKSB7Ci0gICAgcmV0dXJuIHN0ZDo6bWF4KHtGWFNZU19hYnMoY29tcFswXSAtIG8uY29tcFswXSksCi0gICAgICAgICAgICAgICAgICAgICBGWFNZU19hYnMoY29tcFsxXSAtIG8uY29tcFsxXSksCi0gICAgICAgICAgICAgICAgICAgICBGWFNZU19hYnMoY29tcFsyXSAtIG8uY29tcFsyXSl9KTsKKyAgICByZXR1cm4gc3RkOjptYXgoe2Ficyhjb21wWzBdIC0gby5jb21wWzBdKSwgYWJzKGNvbXBbMV0gLSBvLmNvbXBbMV0pLAorICAgICAgICAgICAgICAgICAgICAgYWJzKGNvbXBbMl0gLSBvLmNvbXBbMl0pfSk7CiAgIH0KIH07CiAKQEAgLTcyNywxNCArNzQxLDIzIEBACiAgICAgaW50IGRfbGVmdCA9IDA7CiAgICAgaW50IGRfdG9wID0gMDsKICAgICBpbnQgZF9yaWdodCA9IDA7Ci0gICAgZGl2X2NvbG9yc1swXS5CaUludGVycG9sKHBhdGNoX2NvbG9ycywgbGVmdCwgYm90dG9tLCB4X3NjYWxlLCB5X3NjYWxlKTsKKyAgICBpZiAoIWRpdl9jb2xvcnNbMF0uQmlJbnRlcnBvbChwYXRjaF9jb2xvcnMsIGxlZnQsIGJvdHRvbSwgeF9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X3NjYWxlKSkgeworICAgICAgcmV0dXJuOworICAgIH0KICAgICBpZiAoIWJTbWFsbCkgewotICAgICAgZGl2X2NvbG9yc1sxXS5CaUludGVycG9sKHBhdGNoX2NvbG9ycywgbGVmdCwgYm90dG9tICsgMSwgeF9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X3NjYWxlKTsKLSAgICAgIGRpdl9jb2xvcnNbMl0uQmlJbnRlcnBvbChwYXRjaF9jb2xvcnMsIGxlZnQgKyAxLCBib3R0b20gKyAxLCB4X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfc2NhbGUpOwotICAgICAgZGl2X2NvbG9yc1szXS5CaUludGVycG9sKHBhdGNoX2NvbG9ycywgbGVmdCArIDEsIGJvdHRvbSwgeF9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X3NjYWxlKTsKKyAgICAgIGlmICghZGl2X2NvbG9yc1sxXS5CaUludGVycG9sKHBhdGNoX2NvbG9ycywgbGVmdCwgYm90dG9tICsgMSwgeF9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfc2NhbGUpKSB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmICghZGl2X2NvbG9yc1syXS5CaUludGVycG9sKHBhdGNoX2NvbG9ycywgbGVmdCArIDEsIGJvdHRvbSArIDEsIHhfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X3NjYWxlKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAoIWRpdl9jb2xvcnNbM10uQmlJbnRlcnBvbChwYXRjaF9jb2xvcnMsIGxlZnQgKyAxLCBib3R0b20sIHhfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5X3NjYWxlKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CiAgICAgICBkX2JvdHRvbSA9IGRpdl9jb2xvcnNbM10uRGlzdGFuY2UoZGl2X2NvbG9yc1swXSk7CiAgICAgICBkX2xlZnQgPSBkaXZfY29sb3JzWzFdLkRpc3RhbmNlKGRpdl9jb2xvcnNbMF0pOwogICAgICAgZF90b3AgPSBkaXZfY29sb3JzWzFdLkRpc3RhbmNlKGRpdl9jb2xvcnNbMl0pOwpAQCAtODA1LDcgKzgyOCw3IEBACiAKIHZvaWQgRHJhd0Nvb25QYXRjaE1lc2hlcygKICAgICBTaGFkaW5nVHlwZSB0eXBlLAotICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcCwKICAgICBDRlhfTWF0cml4KiBwT2JqZWN0MkJpdG1hcCwKICAgICBDUERGX1N0cmVhbSogcFNoYWRpbmdTdHJlYW0sCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENQREZfRnVuY3Rpb24+PiYgZnVuY3MsCkBAIC04MTYsNyArODM5LDcgQEAKICAgQVNTRVJUKHR5cGUgPT0ga0Nvb25zUGF0Y2hNZXNoU2hhZGluZyB8fAogICAgICAgICAgdHlwZSA9PSBrVGVuc29yUHJvZHVjdFBhdGNoTWVzaFNoYWRpbmcpOwogCi0gIENGWF9GeGdlRGV2aWNlIGRldmljZTsKKyAgQ0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2UgZGV2aWNlOwogICBkZXZpY2UuQXR0YWNoKHBCaXRtYXAsIGZhbHNlLCBudWxscHRyLCBmYWxzZSk7CiAgIENQREZfTWVzaFN0cmVhbSBzdHJlYW0odHlwZSwgZnVuY3MsIHBTaGFkaW5nU3RyZWFtLCBwQ1MpOwogICBpZiAoIXN0cmVhbS5Mb2FkKCkpCkBAIC04NDYsMTEgKzg2OSwxMSBAQAogICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgICB0ZW1wQ29vcmRzW2ldID0gY29vcmRzWyhmbGFnICogMyArIGkpICUgMTJdOwogICAgICAgfQotICAgICAgRlhTWVNfbWVtY3B5KGNvb3JkcywgdGVtcENvb3Jkcywgc2l6ZW9mKHRlbXBDb29yZHMpKTsKKyAgICAgIG1lbWNweShjb29yZHMsIHRlbXBDb29yZHMsIHNpemVvZih0ZW1wQ29vcmRzKSk7CiAgICAgICBDb29uX0NvbG9yIHRlbXBDb2xvcnNbMl07CiAgICAgICB0ZW1wQ29sb3JzWzBdID0gcGF0Y2gucGF0Y2hfY29sb3JzW2ZsYWddOwogICAgICAgdGVtcENvbG9yc1sxXSA9IHBhdGNoLnBhdGNoX2NvbG9yc1soZmxhZyArIDEpICUgNF07Ci0gICAgICBGWFNZU19tZW1jcHkocGF0Y2gucGF0Y2hfY29sb3JzLCB0ZW1wQ29sb3JzLCBzaXplb2YoQ29vbl9Db2xvcikgKiAyKTsKKyAgICAgIG1lbWNweShwYXRjaC5wYXRjaF9jb2xvcnMsIHRlbXBDb2xvcnMsIHNpemVvZihDb29uX0NvbG9yKSAqIDIpOwogICAgIH0KICAgICBmb3IgKGkgPSBpU3RhcnRQb2ludDsgaSA8IHBvaW50X2NvdW50OyBpKyspIHsKICAgICAgIGlmICghc3RyZWFtLkNhblJlYWRDb29yZHMoKSkKQEAgLTg2Miw5ICs4ODUsOSBAQAogICAgICAgaWYgKCFzdHJlYW0uQ2FuUmVhZENvbG9yKCkpCiAgICAgICAgIGJyZWFrOwogCi0gICAgICBGWF9GTE9BVCByOwotICAgICAgRlhfRkxPQVQgZzsKLSAgICAgIEZYX0ZMT0FUIGI7CisgICAgICBmbG9hdCByOworICAgICAgZmxvYXQgZzsKKyAgICAgIGZsb2F0IGI7CiAgICAgICBzdGQ6OnRpZShyLCBnLCBiKSA9IHN0cmVhbS5SZWFkQ29sb3IoKTsKIAogICAgICAgcGF0Y2gucGF0Y2hfY29sb3JzW2ldLmNvbXBbMF0gPSAoaW50MzJfdCkociAqIDI1NSk7CkBAIC04NzIsOCArODk1LDggQEAKICAgICAgIHBhdGNoLnBhdGNoX2NvbG9yc1tpXS5jb21wWzJdID0gKGludDMyX3QpKGIgKiAyNTUpOwogICAgIH0KICAgICBDRlhfRmxvYXRSZWN0IGJib3ggPSBDRlhfRmxvYXRSZWN0OjpHZXRCQm94KGNvb3JkcywgcG9pbnRfY291bnQpOwotICAgIGlmIChiYm94LnJpZ2h0IDw9IDAgfHwgYmJveC5sZWZ0ID49IChGWF9GTE9BVClwQml0bWFwLT5HZXRXaWR0aCgpIHx8Ci0gICAgICAgIGJib3gudG9wIDw9IDAgfHwgYmJveC5ib3R0b20gPj0gKEZYX0ZMT0FUKXBCaXRtYXAtPkdldEhlaWdodCgpKSB7CisgICAgaWYgKGJib3gucmlnaHQgPD0gMCB8fCBiYm94LmxlZnQgPj0gKGZsb2F0KXBCaXRtYXAtPkdldFdpZHRoKCkgfHwKKyAgICAgICAgYmJveC50b3AgPD0gMCB8fCBiYm94LmJvdHRvbSA+PSAoZmxvYXQpcEJpdG1hcC0+R2V0SGVpZ2h0KCkpIHsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KICAgICBDb29uX0JlemllciBDMSwgQzIsIEQxLCBEMjsKQEAgLTg4OSwyNiArOTEyLDI1IEBACiAgIH0KIH0KIAotc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gRHJhd1BhdHRlcm5CaXRtYXAoCi0gICAgQ1BERl9Eb2N1bWVudCogcERvYywKLSAgICBDUERGX1BhZ2VSZW5kZXJDYWNoZSogcENhY2hlLAotICAgIENQREZfVGlsaW5nUGF0dGVybiogcFBhdHRlcm4sCi0gICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQsCi0gICAgaW50IGZsYWdzKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IHBCaXRtYXAobmV3IENGWF9ESUJpdG1hcCk7CitSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBEcmF3UGF0dGVybkJpdG1hcChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlUmVuZGVyQ2FjaGUqIHBDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfVGlsaW5nUGF0dGVybiogcFBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpIHsKKyAgYXV0byBwQml0bWFwID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKTsKICAgaWYgKCFwQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgcFBhdHRlcm4tPmNvbG9yZWQoKSA/IEZYRElCX0FyZ2IgOiBGWERJQl84YnBwTWFzaykpIHsKICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQotICBDRlhfRnhnZURldmljZSBiaXRtYXBfZGV2aWNlOwotICBiaXRtYXBfZGV2aWNlLkF0dGFjaChwQml0bWFwLmdldCgpLCBmYWxzZSwgbnVsbHB0ciwgZmFsc2UpOworICBDRlhfRGVmYXVsdFJlbmRlckRldmljZSBiaXRtYXBfZGV2aWNlOworICBiaXRtYXBfZGV2aWNlLkF0dGFjaChwQml0bWFwLCBmYWxzZSwgbnVsbHB0ciwgZmFsc2UpOwogICBwQml0bWFwLT5DbGVhcigwKTsKLSAgQ0ZYX0Zsb2F0UmVjdCBjZWxsX2Jib3ggPSBwUGF0dGVybi0+YmJveCgpOwotICBwUGF0dGVybi0+cGF0dGVybl90b19mb3JtKCktPlRyYW5zZm9ybVJlY3QoY2VsbF9iYm94KTsKLSAgcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybVJlY3QoY2VsbF9iYm94KTsKLSAgQ0ZYX0Zsb2F0UmVjdCBiaXRtYXBfcmVjdCgwLjBmLCAwLjBmLCAoRlhfRkxPQVQpd2lkdGgsIChGWF9GTE9BVCloZWlnaHQpOworICBDRlhfRmxvYXRSZWN0IGNlbGxfYmJveCA9CisgICAgICBwUGF0dGVybi0+cGF0dGVybl90b19mb3JtKCktPlRyYW5zZm9ybVJlY3QocFBhdHRlcm4tPmJib3goKSk7CisgIGNlbGxfYmJveCA9IHBPYmplY3QyRGV2aWNlLT5UcmFuc2Zvcm1SZWN0KGNlbGxfYmJveCk7CisgIENGWF9GbG9hdFJlY3QgYml0bWFwX3JlY3QoMC4wZiwgMC4wZiwgKGZsb2F0KXdpZHRoLCAoZmxvYXQpaGVpZ2h0KTsKICAgQ0ZYX01hdHJpeCBtdEFkanVzdDsKICAgbXRBZGp1c3QuTWF0Y2hSZWN0KGJpdG1hcF9yZWN0LCBjZWxsX2Jib3gpOwogCkBAIC05MTYsMTUgKzkzOCwxNiBAQAogICBtdFBhdHRlcm4yQml0bWFwLkNvbmNhdChtdEFkanVzdCk7CiAgIENQREZfUmVuZGVyT3B0aW9ucyBvcHRpb25zOwogICBpZiAoIXBQYXR0ZXJuLT5jb2xvcmVkKCkpCi0gICAgb3B0aW9ucy5tX0NvbG9yTW9kZSA9IFJFTkRFUl9DT0xPUl9BTFBIQTsKKyAgICBvcHRpb25zLlNldENvbG9yTW9kZShDUERGX1JlbmRlck9wdGlvbnM6OmtBbHBoYSk7CiAKICAgZmxhZ3MgfD0gUkVOREVSX0ZPUkNFX0hBTEZUT05FOwotICBvcHRpb25zLm1fRmxhZ3MgPSBmbGFnczsKKyAgb3B0aW9ucy5TZXRGbGFncyhmbGFncyk7CisKICAgQ1BERl9SZW5kZXJDb250ZXh0IGNvbnRleHQocERvYywgcENhY2hlKTsKICAgY29udGV4dC5BcHBlbmRMYXllcihwUGF0dGVybi0+Zm9ybSgpLCAmbXRQYXR0ZXJuMkJpdG1hcCk7CiAgIGNvbnRleHQuUmVuZGVyKCZiaXRtYXBfZGV2aWNlLCAmb3B0aW9ucywgbnVsbHB0cik7CiAjaWYgZGVmaW5lZCBfU0tJQV9TVVBQT1JUX1BBVEhTXwotICBiaXRtYXBfZGV2aWNlLkZsdXNoKCk7CisgIGJpdG1hcF9kZXZpY2UuRmx1c2godHJ1ZSk7CiAgIHBCaXRtYXAtPlVuUHJlTXVsdGlwbHkoKTsKICNlbmRpZgogICByZXR1cm4gcEJpdG1hcDsKQEAgLTk0MCw2ICs5NjMsMjYgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgTWlzc2luZ0ZpbGxDb2xvcihjb25zdCBDUERGX0NvbG9yU3RhdGUqIHBDb2xvclN0YXRlKSB7CisgIHJldHVybiAhcENvbG9yU3RhdGUtPkhhc1JlZigpIHx8IHBDb2xvclN0YXRlLT5HZXRGaWxsQ29sb3IoKS0+SXNOdWxsKCk7Cit9CisKK2Jvb2wgTWlzc2luZ1N0cm9rZUNvbG9yKGNvbnN0IENQREZfQ29sb3JTdGF0ZSogcENvbG9yU3RhdGUpIHsKKyAgcmV0dXJuICFwQ29sb3JTdGF0ZS0+SGFzUmVmKCkgfHwgcENvbG9yU3RhdGUtPkdldFN0cm9rZUNvbG9yKCktPklzTnVsbCgpOworfQorCitib29sIFR5cGUzQ2hhck1pc3NpbmdGaWxsQ29sb3IoY29uc3QgQ1BERl9UeXBlM0NoYXIqIHBDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfQ29sb3JTdGF0ZSogcENvbG9yU3RhdGUpIHsKKyAgcmV0dXJuIHBDaGFyICYmICghcENoYXItPmNvbG9yZWQoKSB8fAorICAgICAgICAgICAgICAgICAgIChwQ2hhci0+Y29sb3JlZCgpICYmIE1pc3NpbmdGaWxsQ29sb3IocENvbG9yU3RhdGUpKSk7Cit9CisKK2Jvb2wgVHlwZTNDaGFyTWlzc2luZ1N0cm9rZUNvbG9yKGNvbnN0IENQREZfVHlwZTNDaGFyKiBwQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfQ29sb3JTdGF0ZSogcENvbG9yU3RhdGUpIHsKKyAgcmV0dXJuIHBDaGFyICYmICghcENoYXItPmNvbG9yZWQoKSB8fAorICAgICAgICAgICAgICAgICAgIChwQ2hhci0+Y29sb3JlZCgpICYmIE1pc3NpbmdTdHJva2VDb2xvcihwQ29sb3JTdGF0ZSkpKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlCiAKIC8vIHN0YXRpYwpAQCAtOTU0LDcgKzk5Nyw3IEBACiAgICAgICBtX3BDdXJPYmoobnVsbHB0ciksCiAgICAgICBtX3BTdG9wT2JqKG51bGxwdHIpLAogICAgICAgbV9iUHJpbnQoZmFsc2UpLAotICAgICAgbV9UcmFuc3BhcmVuY3koMCksCisgICAgICBtX2lUcmFuc3BhcmVuY3koMCksCiAgICAgICBtX2JEcm9wT2JqZWN0cyhmYWxzZSksCiAgICAgICBtX2JTdGRDUyhmYWxzZSksCiAgICAgICBtX0dyb3VwRmFtaWx5KDApLApAQCAtMTAxOCw3ICsxMDYxLDcgQEAKICAgICBtX0luaXRpYWxTdGF0ZXMuRGVmYXVsdFN0YXRlcygpOwogICB9CiAgIG1fcEltYWdlUmVuZGVyZXIucmVzZXQoKTsKLSAgbV9UcmFuc3BhcmVuY3kgPSB0cmFuc3BhcmVuY3k7CisgIG1faVRyYW5zcGFyZW5jeSA9IHRyYW5zcGFyZW5jeTsKICAgcmV0dXJuIHRydWU7CiB9CiAKQEAgLTEwMjgsMTEgKzEwNzEsOCBAQAogI2lmIGRlZmluZWQgX1NLSUFfU1VQUE9SVF8KICAgRGVidWdWZXJpZnlEZXZpY2VJc1ByZU11bHRpcGxpZWQoKTsKICNlbmRpZgotICBDRlhfRmxvYXRSZWN0IGNsaXBfcmVjdChtX3BEZXZpY2UtPkdldENsaXBCb3goKSk7Ci0gIENGWF9NYXRyaXggZGV2aWNlMm9iamVjdDsKLSAgZGV2aWNlMm9iamVjdC5TZXRSZXZlcnNlKCpwT2JqMkRldmljZSk7Ci0gIGRldmljZTJvYmplY3QuVHJhbnNmb3JtUmVjdChjbGlwX3JlY3QpOwotCisgIENGWF9GbG9hdFJlY3QgY2xpcF9yZWN0ID0gcE9iajJEZXZpY2UtPkdldEludmVyc2UoKS5UcmFuc2Zvcm1SZWN0KAorICAgICAgQ0ZYX0Zsb2F0UmVjdChtX3BEZXZpY2UtPkdldENsaXBCb3goKSkpOwogICBmb3IgKGNvbnN0IGF1dG8mIHBDdXJPYmogOiAqcE9iamVjdEhvbGRlci0+R2V0UGFnZU9iamVjdExpc3QoKSkgewogICAgIGlmIChwQ3VyT2JqLmdldCgpID09IG1fcFN0b3BPYmopIHsKICAgICAgIG1fYlN0b3BwZWQgPSB0cnVlOwpAQCAtMTA2MSwxMyArMTEwMSwxMyBAQAogI2lmIGRlZmluZWQgX1NLSUFfU1VQUE9SVF8KICAgRGVidWdWZXJpZnlEZXZpY2VJc1ByZU11bHRpcGxpZWQoKTsKICNlbmRpZgotICBDRlhfQXV0b1Jlc3RvcmVyPGludD4gcmVzdG9yZXIoJnNfQ3VycmVudFJlY3Vyc2lvbkRlcHRoKTsKKyAgQXV0b1Jlc3RvcmVyPGludD4gcmVzdG9yZXIoJnNfQ3VycmVudFJlY3Vyc2lvbkRlcHRoKTsKICAgaWYgKCsrc19DdXJyZW50UmVjdXJzaW9uRGVwdGggPiBrUmVuZGVyTWF4UmVjdXJzaW9uRGVwdGgpIHsKICAgICByZXR1cm47CiAgIH0KICAgbV9wQ3VyT2JqID0gcE9iajsKLSAgaWYgKG1fT3B0aW9ucy5tX3BPQ0NvbnRleHQgJiYgcE9iai0+bV9Db250ZW50TWFyaykgewotICAgIGlmICghbV9PcHRpb25zLm1fcE9DQ29udGV4dC0+Q2hlY2tPYmplY3RWaXNpYmxlKHBPYmopKSB7CisgIGlmIChtX09wdGlvbnMuR2V0T0NDb250ZXh0KCkgJiYgcE9iai0+bV9Db250ZW50TWFyay5IYXNSZWYoKSkgeworICAgIGlmICghbV9PcHRpb25zLkdldE9DQ29udGV4dCgpLT5DaGVja09iamVjdFZpc2libGUocE9iaikpIHsKICAgICAgIHJldHVybjsKICAgICB9CiAgIH0KQEAgLTEwODMsNyArMTEyMyw3IEBACiAKIGJvb2wgQ1BERl9SZW5kZXJTdGF0dXM6OkNvbnRpbnVlU2luZ2xlT2JqZWN0KENQREZfUGFnZU9iamVjdCogcE9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKSB7CiAgIGlmIChtX3BJbWFnZVJlbmRlcmVyKSB7CiAgICAgaWYgKG1fcEltYWdlUmVuZGVyZXItPkNvbnRpbnVlKHBQYXVzZSkpCiAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTEwOTUsOCArMTEzNSw4IEBACiAgIH0KIAogICBtX3BDdXJPYmogPSBwT2JqOwotICBpZiAobV9PcHRpb25zLm1fcE9DQ29udGV4dCAmJiBwT2JqLT5tX0NvbnRlbnRNYXJrICYmCi0gICAgICAhbV9PcHRpb25zLm1fcE9DQ29udGV4dC0+Q2hlY2tPYmplY3RWaXNpYmxlKHBPYmopKSB7CisgIGlmIChtX09wdGlvbnMuR2V0T0NDb250ZXh0KCkgJiYgcE9iai0+bV9Db250ZW50TWFyay5IYXNSZWYoKSAmJgorICAgICAgIW1fT3B0aW9ucy5HZXRPQ0NvbnRleHQoKS0+Q2hlY2tPYmplY3RWaXNpYmxlKHBPYmopKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKQEAgLTExMDQsMjAgKzExNDQsMjAgQEAKICAgaWYgKFByb2Nlc3NUcmFuc3BhcmVuY3kocE9iaiwgcE9iajJEZXZpY2UpKQogICAgIHJldHVybiBmYWxzZTsKIAotICBpZiAocE9iai0+SXNJbWFnZSgpKSB7Ci0gICAgbV9wSW1hZ2VSZW5kZXJlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0ltYWdlUmVuZGVyZXI+KCk7Ci0gICAgaWYgKCFtX3BJbWFnZVJlbmRlcmVyLT5TdGFydCh0aGlzLCBwT2JqLCBwT2JqMkRldmljZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9CTEVORF9OT1JNQUwpKSB7Ci0gICAgICBpZiAoIW1fcEltYWdlUmVuZGVyZXItPkdldFJlc3VsdCgpKQotICAgICAgICBEcmF3T2JqV2l0aEJhY2tncm91bmQocE9iaiwgcE9iajJEZXZpY2UpOwotICAgICAgbV9wSW1hZ2VSZW5kZXJlci5yZXNldCgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gQ29udGludWVTaW5nbGVPYmplY3QocE9iaiwgcE9iajJEZXZpY2UsIHBQYXVzZSk7CisgIGlmICghcE9iai0+SXNJbWFnZSgpKSB7CisgICAgUHJvY2Vzc09iamVjdE5vQ2xpcChwT2JqLCBwT2JqMkRldmljZSk7CisgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgUHJvY2Vzc09iamVjdE5vQ2xpcChwT2JqLCBwT2JqMkRldmljZSk7Ci0gIHJldHVybiBmYWxzZTsKKyAgbV9wSW1hZ2VSZW5kZXJlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0ltYWdlUmVuZGVyZXI+KCk7CisgIGlmICghbV9wSW1hZ2VSZW5kZXJlci0+U3RhcnQodGhpcywgcE9iai0+QXNJbWFnZSgpLCBwT2JqMkRldmljZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfQkxFTkRfTk9STUFMKSkgeworICAgIGlmICghbV9wSW1hZ2VSZW5kZXJlci0+R2V0UmVzdWx0KCkpCisgICAgICBEcmF3T2JqV2l0aEJhY2tncm91bmQocE9iaiwgcE9iajJEZXZpY2UpOworICAgIG1fcEltYWdlUmVuZGVyZXIucmVzZXQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIENvbnRpbnVlU2luZ2xlT2JqZWN0KHBPYmosIHBPYmoyRGV2aWNlLCBwUGF1c2UpOwogfQogCiBib29sIENQREZfUmVuZGVyU3RhdHVzOjpHZXRPYmplY3RDbGlwcGVkUmVjdChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosCkBAIC0xMTI4LDE1ICsxMTY4LDEzIEBACiAgIEZYX1JFQ1QgcnRDbGlwID0gbV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7CiAgIGlmICghYkxvZ2ljYWwpIHsKICAgICBDRlhfTWF0cml4IGRDVE0gPSBtX3BEZXZpY2UtPkdldENUTSgpOwotICAgIEZYX0ZMT0FUIGEgPSBGWFNZU19mYWJzKGRDVE0uYSk7Ci0gICAgRlhfRkxPQVQgZCA9IEZYU1lTX2ZhYnMoZENUTS5kKTsKKyAgICBmbG9hdCBhID0gZmFicyhkQ1RNLmEpOworICAgIGZsb2F0IGQgPSBmYWJzKGRDVE0uZCk7CiAgICAgaWYgKGEgIT0gMS4wZiB8fCBkICE9IDEuMGYpIHsKLSAgICAgIHJlY3QucmlnaHQgPSByZWN0LmxlZnQgKyAoaW50MzJfdClGWFNZU19jZWlsKChGWF9GTE9BVClyZWN0LldpZHRoKCkgKiBhKTsKLSAgICAgIHJlY3QuYm90dG9tID0gcmVjdC50b3AgKyAoaW50MzJfdClGWFNZU19jZWlsKChGWF9GTE9BVClyZWN0LkhlaWdodCgpICogZCk7Ci0gICAgICBydENsaXAucmlnaHQgPQotICAgICAgICAgIHJ0Q2xpcC5sZWZ0ICsgKGludDMyX3QpRlhTWVNfY2VpbCgoRlhfRkxPQVQpcnRDbGlwLldpZHRoKCkgKiBhKTsKLSAgICAgIHJ0Q2xpcC5ib3R0b20gPQotICAgICAgICAgIHJ0Q2xpcC50b3AgKyAoaW50MzJfdClGWFNZU19jZWlsKChGWF9GTE9BVClydENsaXAuSGVpZ2h0KCkgKiBkKTsKKyAgICAgIHJlY3QucmlnaHQgPSByZWN0LmxlZnQgKyAoaW50MzJfdCljZWlsKChmbG9hdClyZWN0LldpZHRoKCkgKiBhKTsKKyAgICAgIHJlY3QuYm90dG9tID0gcmVjdC50b3AgKyAoaW50MzJfdCljZWlsKChmbG9hdClyZWN0LkhlaWdodCgpICogZCk7CisgICAgICBydENsaXAucmlnaHQgPSBydENsaXAubGVmdCArIChpbnQzMl90KWNlaWwoKGZsb2F0KXJ0Q2xpcC5XaWR0aCgpICogYSk7CisgICAgICBydENsaXAuYm90dG9tID0gcnRDbGlwLnRvcCArIChpbnQzMl90KWNlaWwoKGZsb2F0KXJ0Q2xpcC5IZWlnaHQoKSAqIGQpOwogICAgIH0KICAgfQogICByZWN0LkludGVyc2VjdChydENsaXApOwpAQCAtMTE5NCw4ICsxMjMyLDggQEAKIAogdm9pZCBDUERGX1JlbmRlclN0YXR1czo6R2V0U2NhbGVkTWF0cml4KENGWF9NYXRyaXgmIG1hdHJpeCkgY29uc3QgewogICBDRlhfTWF0cml4IGRDVE0gPSBtX3BEZXZpY2UtPkdldENUTSgpOwotICBtYXRyaXguYSAqPSBGWFNZU19mYWJzKGRDVE0uYSk7Ci0gIG1hdHJpeC5kICo9IEZYU1lTX2ZhYnMoZENUTS5kKTsKKyAgbWF0cml4LmEgKj0gZmFicyhkQ1RNLmEpOworICBtYXRyaXguZCAqPSBmYWJzKGRDVE0uZCk7CiB9CiAKIHZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdPYmpXaXRoQmFja2dyb3VuZChDUERGX1BhZ2VPYmplY3QqIHBPYmosCkBAIC0xMjEwLDIyICsxMjQ4LDIzIEBACiAgICAgcmVzID0gMDsKICAgfQogICBDUERGX1NjYWxlZFJlbmRlckJ1ZmZlciBidWZmZXI7Ci0gIGlmICghYnVmZmVyLkluaXRpYWxpemUobV9wQ29udGV4dCwgbV9wRGV2aWNlLCByZWN0LCBwT2JqLCAmbV9PcHRpb25zLCByZXMpKSB7CisgIGlmICghYnVmZmVyLkluaXRpYWxpemUobV9wQ29udGV4dC5HZXQoKSwgbV9wRGV2aWNlLCByZWN0LCBwT2JqLCAmbV9PcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlcykpIHsKICAgICByZXR1cm47CiAgIH0KICAgQ0ZYX01hdHJpeCBtYXRyaXggPSAqcE9iajJEZXZpY2U7CiAgIG1hdHJpeC5Db25jYXQoKmJ1ZmZlci5HZXRNYXRyaXgoKSk7CiAgIEdldFNjYWxlZE1hdHJpeChtYXRyaXgpOwogICBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UgPSBudWxscHRyOwotICBpZiAocE9iai0+SXNGb3JtKCkpIHsKLSAgICBjb25zdCBDUERGX0Zvcm1PYmplY3QqIHBGb3JtT2JqID0gcE9iai0+QXNGb3JtKCk7Ci0gICAgaWYgKHBGb3JtT2JqLT5tX3BGb3JtICYmIHBGb3JtT2JqLT5tX3BGb3JtLT5tX3BGb3JtRGljdCkgewotICAgICAgcEZvcm1SZXNvdXJjZSA9IHBGb3JtT2JqLT5tX3BGb3JtLT5tX3BGb3JtRGljdC0+R2V0RGljdEZvcigiUmVzb3VyY2VzIik7Ci0gICAgfQorICBjb25zdCBDUERGX0Zvcm1PYmplY3QqIHBGb3JtT2JqID0gcE9iai0+QXNGb3JtKCk7CisgIGlmIChwRm9ybU9iaikgeworICAgIGNvbnN0IGF1dG8mIHBGb3JtRGljdCA9IHBGb3JtT2JqLT5mb3JtKCktPm1fcEZvcm1EaWN0OworICAgIGlmIChwRm9ybURpY3QpCisgICAgICBwRm9ybVJlc291cmNlID0gcEZvcm1EaWN0LT5HZXREaWN0Rm9yKCJSZXNvdXJjZXMiKTsKICAgfQogICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7Ci0gIHN0YXR1cy5Jbml0aWFsaXplKG1fcENvbnRleHQsIGJ1ZmZlci5HZXREZXZpY2UoKSwgYnVmZmVyLkdldE1hdHJpeCgpLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBudWxscHRyLCAmbV9PcHRpb25zLCBtX1RyYW5zcGFyZW5jeSwKKyAgc3RhdHVzLkluaXRpYWxpemUobV9wQ29udGV4dC5HZXQoKSwgYnVmZmVyLkdldERldmljZSgpLCBidWZmZXIuR2V0TWF0cml4KCksCisgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsICZtX09wdGlvbnMsIG1faVRyYW5zcGFyZW5jeSwKICAgICAgICAgICAgICAgICAgICAgbV9iRHJvcE9iamVjdHMsIHBGb3JtUmVzb3VyY2UpOwogICBzdGF0dXMuUmVuZGVyU2luZ2xlT2JqZWN0KHBPYmosICZtYXRyaXgpOwogICBidWZmZXIuT3V0cHV0VG9EZXZpY2UoKTsKQEAgLTEyMzYsMjYgKzEyNzUsMjYgQEAKICNpZiBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfCiAgIERlYnVnVmVyaWZ5RGV2aWNlSXNQcmVNdWx0aXBsaWVkKCk7CiAjZW5kaWYKLSAgQ1BERl9EaWN0aW9uYXJ5KiBwT0MgPSBwRm9ybU9iai0+bV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3RGb3IoIk9DIik7Ci0gIGlmIChwT0MgJiYgbV9PcHRpb25zLm1fcE9DQ29udGV4dCAmJgotICAgICAgIW1fT3B0aW9ucy5tX3BPQ0NvbnRleHQtPkNoZWNrT0NHVmlzaWJsZShwT0MpKSB7CisgIENQREZfRGljdGlvbmFyeSogcE9DID0gcEZvcm1PYmotPmZvcm0oKS0+bV9wRm9ybURpY3QtPkdldERpY3RGb3IoIk9DIik7CisgIGlmIChwT0MgJiYgbV9PcHRpb25zLkdldE9DQ29udGV4dCgpICYmCisgICAgICAhbV9PcHRpb25zLkdldE9DQ29udGV4dCgpLT5DaGVja09DR1Zpc2libGUocE9DKSkgewogICAgIHJldHVybiB0cnVlOwogICB9Ci0gIENGWF9NYXRyaXggbWF0cml4ID0gcEZvcm1PYmotPm1fRm9ybU1hdHJpeDsKKyAgQ0ZYX01hdHJpeCBtYXRyaXggPSBwRm9ybU9iai0+Zm9ybV9tYXRyaXgoKTsKICAgbWF0cml4LkNvbmNhdCgqcE9iajJEZXZpY2UpOwotICBDUERGX0RpY3Rpb25hcnkqIHBSZXNvdXJjZXMgPSBudWxscHRyOwotICBpZiAocEZvcm1PYmotPm1fcEZvcm0gJiYgcEZvcm1PYmotPm1fcEZvcm0tPm1fcEZvcm1EaWN0KSB7Ci0gICAgcFJlc291cmNlcyA9IHBGb3JtT2JqLT5tX3BGb3JtLT5tX3BGb3JtRGljdC0+R2V0RGljdEZvcigiUmVzb3VyY2VzIik7Ci0gIH0KKyAgY29uc3QgYXV0byYgcEZvcm1EaWN0ID0gcEZvcm1PYmotPmZvcm0oKS0+bV9wRm9ybURpY3Q7CisgIENQREZfRGljdGlvbmFyeSogcFJlc291cmNlcyA9CisgICAgICBwRm9ybURpY3QgPyBwRm9ybURpY3QtPkdldERpY3RGb3IoIlJlc291cmNlcyIpIDogbnVsbHB0cjsKICAgQ1BERl9SZW5kZXJTdGF0dXMgc3RhdHVzOwotICBzdGF0dXMuSW5pdGlhbGl6ZShtX3BDb250ZXh0LCBtX3BEZXZpY2UsIG51bGxwdHIsIG1fcFN0b3BPYmosIHRoaXMsIHBGb3JtT2JqLAotICAgICAgICAgICAgICAgICAgICAmbV9PcHRpb25zLCBtX1RyYW5zcGFyZW5jeSwgbV9iRHJvcE9iamVjdHMsIHBSZXNvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgc3RhdHVzLkluaXRpYWxpemUobV9wQ29udGV4dC5HZXQoKSwgbV9wRGV2aWNlLCBudWxscHRyLCBtX3BTdG9wT2JqLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICBwRm9ybU9iaiwgJm1fT3B0aW9ucywgbV9pVHJhbnNwYXJlbmN5LCBtX2JEcm9wT2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgcFJlc291cmNlcywgZmFsc2UpOwogICBzdGF0dXMubV9jdXJCbGVuZCA9IG1fY3VyQmxlbmQ7Ci0gIG1fcERldmljZS0+U2F2ZVN0YXRlKCk7Ci0gIHN0YXR1cy5SZW5kZXJPYmplY3RMaXN0KHBGb3JtT2JqLT5tX3BGb3JtLmdldCgpLCAmbWF0cml4KTsKLSAgbV9iU3RvcHBlZCA9IHN0YXR1cy5tX2JTdG9wcGVkOwotICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZShmYWxzZSk7CisgIHsKKyAgICBDRlhfUmVuZGVyRGV2aWNlOjpTdGF0ZVJlc3RvcmVyIHJlc3RvcmVyKG1fcERldmljZSk7CisgICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QocEZvcm1PYmotPmZvcm0oKSwgJm1hdHJpeCk7CisgICAgbV9iU3RvcHBlZCA9IHN0YXR1cy5tX2JTdG9wcGVkOworICB9CiAjaWYgZGVmaW5lZCBfU0tJQV9TVVBQT1JUXwogICBEZWJ1Z1ZlcmlmeURldmljZUlzUHJlTXVsdGlwbGllZCgpOwogI2VuZGlmCkBAIC0xMjc3LDExICsxMzE2LDExIEBACiAgIGlmICghSXNBdmFpbGFibGVNYXRyaXgocGF0aF9tYXRyaXgpKQogICAgIHJldHVybiB0cnVlOwogCi0gIGlmIChGaWxsVHlwZSAmJiAobV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfUkVDVF9BQSkpCisgIGlmIChGaWxsVHlwZSAmJiAobV9PcHRpb25zLkhhc0ZsYWcoUkVOREVSX1JFQ1RfQUEpKSkKICAgICBGaWxsVHlwZSB8PSBGWEZJTExfUkVDVF9BQTsKLSAgaWYgKG1fT3B0aW9ucy5tX0ZsYWdzICYgUkVOREVSX0ZJTExfRlVMTENPVkVSKQorICBpZiAobV9PcHRpb25zLkhhc0ZsYWcoUkVOREVSX0ZJTExfRlVMTENPVkVSKSkKICAgICBGaWxsVHlwZSB8PSBGWEZJTExfRlVMTENPVkVSOwotICBpZiAobV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfTk9QQVRIU01PT1RIKQorICBpZiAobV9PcHRpb25zLkhhc0ZsYWcoUkVOREVSX05PUEFUSFNNT09USCkpCiAgICAgRmlsbFR5cGUgfD0gRlhGSUxMX05PUEFUSFNNT09USDsKICAgaWYgKGJTdHJva2UpCiAgICAgRmlsbFR5cGUgfD0gRlhfRklMTF9TVFJPS0U7CkBAIC0xMjk0LDE0ICsxMzMzLDE1IEBACiAgICAgRmlsbFR5cGUgfD0gRlhfRklMTF9URVhUX01PREU7CiAKICAgQ0ZYX0dyYXBoU3RhdGUgZ3JhcGhTdGF0ZSA9IHBQYXRoT2JqLT5tX0dyYXBoU3RhdGU7Ci0gIGlmIChtX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9USElOTElORSkKKyAgaWYgKG1fT3B0aW9ucy5IYXNGbGFnKFJFTkRFUl9USElOTElORSkpCiAgICAgZ3JhcGhTdGF0ZS5TZXRMaW5lV2lkdGgoMCk7CiAgIHJldHVybiBtX3BEZXZpY2UtPkRyYXdQYXRoV2l0aEJsZW5kKAogICAgICAgcFBhdGhPYmotPm1fUGF0aC5HZXRPYmplY3QoKSwgJnBhdGhfbWF0cml4LCBncmFwaFN0YXRlLkdldE9iamVjdCgpLAogICAgICAgZmlsbF9hcmdiLCBzdHJva2VfYXJnYiwgRmlsbFR5cGUsIG1fY3VyQmxlbmQpOwogfQogCi1DUERGX1RyYW5zZmVyRnVuYyogQ1BERl9SZW5kZXJTdGF0dXM6OkdldFRyYW5zZmVyRnVuYyhDUERGX09iamVjdCogcE9iaikgY29uc3QgeworUmV0YWluUHRyPENQREZfVHJhbnNmZXJGdW5jPiBDUERGX1JlbmRlclN0YXR1czo6R2V0VHJhbnNmZXJGdW5jKAorICAgIENQREZfT2JqZWN0KiBwT2JqKSBjb25zdCB7CiAgIEFTU0VSVChwT2JqKTsKICAgQ1BERl9Eb2NSZW5kZXJEYXRhKiBwRG9jQ2FjaGUgPSBtX3BDb250ZXh0LT5HZXREb2N1bWVudCgpLT5HZXRSZW5kZXJEYXRhKCk7CiAgIHJldHVybiBwRG9jQ2FjaGUgPyBwRG9jQ2FjaGUtPkdldFRyYW5zZmVyRnVuYyhwT2JqKSA6IG51bGxwdHI7CkBAIC0xMzEwLDEzICsxMzUwLDEwIEBACiBGWF9BUkdCIENQREZfUmVuZGVyU3RhdHVzOjpHZXRGaWxsQXJnYihDUERGX1BhZ2VPYmplY3QqIHBPYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJUeXBlMykgY29uc3QgewogICBjb25zdCBDUERGX0NvbG9yU3RhdGUqIHBDb2xvclN0YXRlID0gJnBPYmotPm1fQ29sb3JTdGF0ZTsKLSAgaWYgKG1fcFR5cGUzQ2hhciAmJiAhYlR5cGUzICYmCi0gICAgICAoIW1fcFR5cGUzQ2hhci0+bV9iQ29sb3JlZCB8fAotICAgICAgIChtX3BUeXBlM0NoYXItPm1fYkNvbG9yZWQgJiYKLSAgICAgICAgKCEqcENvbG9yU3RhdGUgfHwgcENvbG9yU3RhdGUtPkdldEZpbGxDb2xvcigpLT5Jc051bGwoKSkpKSkgeworICBpZiAoIWJUeXBlMyAmJiBUeXBlM0NoYXJNaXNzaW5nRmlsbENvbG9yKG1fcFR5cGUzQ2hhci5HZXQoKSwgcENvbG9yU3RhdGUpKQogICAgIHJldHVybiBtX1QzRmlsbENvbG9yOwotICB9Ci0gIGlmICghKnBDb2xvclN0YXRlIHx8IHBDb2xvclN0YXRlLT5HZXRGaWxsQ29sb3IoKS0+SXNOdWxsKCkpCisKKyAgaWYgKE1pc3NpbmdGaWxsQ29sb3IocENvbG9yU3RhdGUpKQogICAgIHBDb2xvclN0YXRlID0gJm1fSW5pdGlhbFN0YXRlcy5tX0NvbG9yU3RhdGU7CiAKICAgRlhfQ09MT1JSRUYgcmdiID0gcENvbG9yU3RhdGUtPkdldEZpbGxSR0IoKTsKQEAgLTEzMzgsMTMgKzEzNzUsMTAgQEAKIAogRlhfQVJHQiBDUERGX1JlbmRlclN0YXR1czo6R2V0U3Ryb2tlQXJnYihDUERGX1BhZ2VPYmplY3QqIHBPYmopIGNvbnN0IHsKICAgY29uc3QgQ1BERl9Db2xvclN0YXRlKiBwQ29sb3JTdGF0ZSA9ICZwT2JqLT5tX0NvbG9yU3RhdGU7Ci0gIGlmIChtX3BUeXBlM0NoYXIgJiYKLSAgICAgICghbV9wVHlwZTNDaGFyLT5tX2JDb2xvcmVkIHx8Ci0gICAgICAgKG1fcFR5cGUzQ2hhci0+bV9iQ29sb3JlZCAmJgotICAgICAgICAoISpwQ29sb3JTdGF0ZSB8fCBwQ29sb3JTdGF0ZS0+R2V0U3Ryb2tlQ29sb3IoKS0+SXNOdWxsKCkpKSkpIHsKKyAgaWYgKFR5cGUzQ2hhck1pc3NpbmdTdHJva2VDb2xvcihtX3BUeXBlM0NoYXIuR2V0KCksIHBDb2xvclN0YXRlKSkKICAgICByZXR1cm4gbV9UM0ZpbGxDb2xvcjsKLSAgfQotICBpZiAoISpwQ29sb3JTdGF0ZSB8fCBwQ29sb3JTdGF0ZS0+R2V0U3Ryb2tlQ29sb3IoKS0+SXNOdWxsKCkpCisKKyAgaWYgKE1pc3NpbmdTdHJva2VDb2xvcihwQ29sb3JTdGF0ZSkpCiAgICAgcENvbG9yU3RhdGUgPSAmbV9Jbml0aWFsU3RhdGVzLm1fQ29sb3JTdGF0ZTsKIAogICBGWF9DT0xPUlJFRiByZ2IgPSBwQ29sb3JTdGF0ZS0+R2V0U3Ryb2tlUkdCKCk7CkBAIC0xMzY0LDEwICsxMzk4LDEwIEBACiAgIHJldHVybiBtX09wdGlvbnMuVHJhbnNsYXRlQ29sb3IoQXJnYkVuY29kZShhbHBoYSwgcmdiKSk7CiB9CiAKLXZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OlByb2Nlc3NDbGlwUGF0aChDUERGX0NsaXBQYXRoIENsaXBQYXRoLAordm9pZCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc0NsaXBQYXRoKGNvbnN0IENQREZfQ2xpcFBhdGgmIENsaXBQYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlKSB7Ci0gIGlmICghQ2xpcFBhdGgpIHsKLSAgICBpZiAobV9MYXN0Q2xpcFBhdGgpIHsKKyAgaWYgKCFDbGlwUGF0aC5IYXNSZWYoKSkgeworICAgIGlmIChtX0xhc3RDbGlwUGF0aC5IYXNSZWYoKSkgewogICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUodHJ1ZSk7CiAgICAgICBtX0xhc3RDbGlwUGF0aC5TZXROdWxsKCk7CiAgICAgfQpAQCAtMTM3OCw4ICsxNDEyLDcgQEAKIAogICBtX0xhc3RDbGlwUGF0aCA9IENsaXBQYXRoOwogICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZSh0cnVlKTsKLSAgaW50IG5DbGlwUGF0aCA9IENsaXBQYXRoLkdldFBhdGhDb3VudCgpOwotICBmb3IgKGludCBpID0gMDsgaSA8IG5DbGlwUGF0aDsgKytpKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQ2xpcFBhdGguR2V0UGF0aENvdW50KCk7ICsraSkgewogICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhID0gQ2xpcFBhdGguR2V0UGF0aChpKS5HZXRPYmplY3QoKTsKICAgICBpZiAoIXBQYXRoRGF0YSkKICAgICAgIGNvbnRpbnVlOwpAQCAtMTM4NywxNSArMTQyMCwxNCBAQAogICAgIGlmIChwUGF0aERhdGEtPkdldFBvaW50cygpLmVtcHR5KCkpIHsKICAgICAgIENGWF9QYXRoRGF0YSBFbXB0eVBhdGg7CiAgICAgICBFbXB0eVBhdGguQXBwZW5kUmVjdCgtMSwgLTEsIDAsIDApOwotICAgICAgaW50IGZpbGxfbW9kZSA9IEZYRklMTF9XSU5ESU5HOwotICAgICAgbV9wRGV2aWNlLT5TZXRDbGlwX1BhdGhGaWxsKCZFbXB0eVBhdGgsIG51bGxwdHIsIGZpbGxfbW9kZSk7CisgICAgICBtX3BEZXZpY2UtPlNldENsaXBfUGF0aEZpbGwoJkVtcHR5UGF0aCwgbnVsbHB0ciwgRlhGSUxMX1dJTkRJTkcpOwogICAgIH0gZWxzZSB7Ci0gICAgICBpbnQgQ2xpcFR5cGUgPSBDbGlwUGF0aC5HZXRDbGlwVHlwZShpKTsKLSAgICAgIG1fcERldmljZS0+U2V0Q2xpcF9QYXRoRmlsbChwUGF0aERhdGEsIHBPYmoyRGV2aWNlLCBDbGlwVHlwZSk7CisgICAgICBtX3BEZXZpY2UtPlNldENsaXBfUGF0aEZpbGwocFBhdGhEYXRhLCBwT2JqMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGlwUGF0aC5HZXRDbGlwVHlwZShpKSk7CiAgICAgfQogICB9Ci0gIGludCB0ZXh0Y291bnQgPSBDbGlwUGF0aC5HZXRUZXh0Q291bnQoKTsKLSAgaWYgKHRleHRjb3VudCA9PSAwKQorCisgIGlmIChDbGlwUGF0aC5HZXRUZXh0Q291bnQoKSA9PSAwKQogICAgIHJldHVybjsKIAogICBpZiAobV9wRGV2aWNlLT5HZXREZXZpY2VDbGFzcygpID09IEZYRENfRElTUExBWSAmJgpAQCAtMTQwNCw3ICsxNDM2LDcgQEAKICAgfQogCiAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfUGF0aERhdGE+IHBUZXh0Q2xpcHBpbmdQYXRoOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRleHRjb3VudDsgKytpKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQ2xpcFBhdGguR2V0VGV4dENvdW50KCk7ICsraSkgewogICAgIENQREZfVGV4dE9iamVjdCogcFRleHQgPSBDbGlwUGF0aC5HZXRUZXh0KGkpOwogICAgIGlmIChwVGV4dCkgewogICAgICAgaWYgKCFwVGV4dENsaXBwaW5nUGF0aCkKQEAgLTE0MTcsNyArMTQ0OSw3IEBACiAgICAgICBjb250aW51ZTsKIAogICAgIGludCBmaWxsX21vZGUgPSBGWEZJTExfV0lORElORzsKLSAgICBpZiAobV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfTk9URVhUU01PT1RIKQorICAgIGlmIChtX09wdGlvbnMuSGFzRmxhZyhSRU5ERVJfTk9URVhUU01PT1RIKSkKICAgICAgIGZpbGxfbW9kZSB8PSBGWEZJTExfTk9QQVRIU01PT1RIOwogICAgIG1fcERldmljZS0+U2V0Q2xpcF9QYXRoRmlsbChwVGV4dENsaXBwaW5nUGF0aC5nZXQoKSwgbnVsbHB0ciwgZmlsbF9tb2RlKTsKICAgICBwVGV4dENsaXBwaW5nUGF0aC5yZXNldCgpOwpAQCAtMTQzMSwxMyArMTQ2MywxMyBAQAogICBwYXRoX21hdHJpeC5Db25jYXQoKnBPYmoyRGV2aWNlKTsKICAgaWYgKGJTdHJva2UpIHsKICAgICBDRlhfR3JhcGhTdGF0ZSBncmFwaFN0YXRlID0gcFBhdGhPYmotPm1fR3JhcGhTdGF0ZTsKLSAgICBpZiAobV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfVEhJTkxJTkUpCisgICAgaWYgKG1fT3B0aW9ucy5IYXNGbGFnKFJFTkRFUl9USElOTElORSkpCiAgICAgICBncmFwaFN0YXRlLlNldExpbmVXaWR0aCgwKTsKICAgICByZXR1cm4gbV9wRGV2aWNlLT5TZXRDbGlwX1BhdGhTdHJva2UocFBhdGhPYmotPm1fUGF0aC5HZXRPYmplY3QoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhdGhfbWF0cml4LCBncmFwaFN0YXRlLkdldE9iamVjdCgpKTsKICAgfQogICBpbnQgZmlsbF9tb2RlID0gcFBhdGhPYmotPm1fRmlsbFR5cGU7Ci0gIGlmIChtX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9OT1BBVEhTTU9PVEgpIHsKKyAgaWYgKG1fT3B0aW9ucy5IYXNGbGFnKFJFTkRFUl9OT1BBVEhTTU9PVEgpKSB7CiAgICAgZmlsbF9tb2RlIHw9IEZYRklMTF9OT1BBVEhTTU9PVEg7CiAgIH0KICAgcmV0dXJuIG1fcERldmljZS0+U2V0Q2xpcF9QYXRoRmlsbChwUGF0aE9iai0+bV9QYXRoLkdldE9iamVjdCgpLCAmcGF0aF9tYXRyaXgsCkBAIC0xNDYyLDM0ICsxNDk0LDM2IEBACiAgICAgfQogICB9CiAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSA9IG51bGxwdHI7Ci0gIEZYX0ZMT0FUIGdyb3VwX2FscGhhID0gMS4wZjsKLSAgaW50IFRyYW5zcGFyZW5jeSA9IG1fVHJhbnNwYXJlbmN5OworICBmbG9hdCBncm91cF9hbHBoYSA9IDEuMGY7CisgIGludCBpVHJhbnNwYXJlbmN5ID0gbV9pVHJhbnNwYXJlbmN5OwogICBib29sIGJHcm91cFRyYW5zcGFyZW50ID0gZmFsc2U7Ci0gIGlmIChwUGFnZU9iai0+SXNGb3JtKCkpIHsKLSAgICBjb25zdCBDUERGX0Zvcm1PYmplY3QqIHBGb3JtT2JqID0gcFBhZ2VPYmotPkFzRm9ybSgpOworICBjb25zdCBDUERGX0Zvcm1PYmplY3QqIHBGb3JtT2JqID0gcFBhZ2VPYmotPkFzRm9ybSgpOworICBpZiAocEZvcm1PYmopIHsKICAgICBncm91cF9hbHBoYSA9IHBGb3JtT2JqLT5tX0dlbmVyYWxTdGF0ZS5HZXRGaWxsQWxwaGEoKTsKLSAgICBUcmFuc3BhcmVuY3kgPSBwRm9ybU9iai0+bV9wRm9ybS0+bV9UcmFuc3BhcmVuY3k7Ci0gICAgYkdyb3VwVHJhbnNwYXJlbnQgPSAhIShUcmFuc3BhcmVuY3kgJiBQREZUUkFOU19JU09MQVRFRCk7Ci0gICAgaWYgKHBGb3JtT2JqLT5tX3BGb3JtLT5tX3BGb3JtRGljdCkgewotICAgICAgcEZvcm1SZXNvdXJjZSA9IHBGb3JtT2JqLT5tX3BGb3JtLT5tX3BGb3JtRGljdC0+R2V0RGljdEZvcigiUmVzb3VyY2VzIik7Ci0gICAgfQorICAgIGlUcmFuc3BhcmVuY3kgPSBwRm9ybU9iai0+Zm9ybSgpLT5tX2lUcmFuc3BhcmVuY3k7CisgICAgYkdyb3VwVHJhbnNwYXJlbnQgPSAhIShpVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQpOworICAgIGNvbnN0IGF1dG8mIHBGb3JtRGljdCA9IHBGb3JtT2JqLT5mb3JtKCktPm1fcEZvcm1EaWN0OworICAgIGlmIChwRm9ybURpY3QpCisgICAgICBwRm9ybVJlc291cmNlID0gcEZvcm1EaWN0LT5HZXREaWN0Rm9yKCJSZXNvdXJjZXMiKTsKICAgfQogICBib29sIGJUZXh0Q2xpcCA9Ci0gICAgICAocFBhZ2VPYmotPm1fQ2xpcFBhdGggJiYgcFBhZ2VPYmotPm1fQ2xpcFBhdGguR2V0VGV4dENvdW50KCkgJiYKKyAgICAgIChwUGFnZU9iai0+bV9DbGlwUGF0aC5IYXNSZWYoKSAmJgorICAgICAgIHBQYWdlT2JqLT5tX0NsaXBQYXRoLkdldFRleHRDb3VudCgpID4gMCAmJgogICAgICAgIG1fcERldmljZS0+R2V0RGV2aWNlQ2xhc3MoKSA9PSBGWERDX0RJU1BMQVkgJiYKICAgICAgICAhKG1fcERldmljZS0+R2V0RGV2aWNlQ2FwcyhGWERDX1JFTkRFUl9DQVBTKSAmIEZYUkNfU09GVF9DTElQKSk7Ci0gIGlmICgobV9PcHRpb25zLm1fRmxhZ3MgJiBSRU5ERVJfT1ZFUlBSSU5UKSAmJiBwUGFnZU9iai0+SXNJbWFnZSgpICYmCisgIGlmICgobV9PcHRpb25zLkhhc0ZsYWcoUkVOREVSX09WRVJQUklOVCkpICYmIHBQYWdlT2JqLT5Jc0ltYWdlKCkgJiYKICAgICAgIHBQYWdlT2JqLT5tX0dlbmVyYWxTdGF0ZS5HZXRGaWxsT1AoKSAmJgogICAgICAgcFBhZ2VPYmotPm1fR2VuZXJhbFN0YXRlLkdldFN0cm9rZU9QKCkpIHsKICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBudWxscHRyOwogICAgIENQREZfUGFnZSogcFBhZ2UgPSBudWxscHRyOwogICAgIGlmIChtX3BDb250ZXh0LT5HZXRQYWdlQ2FjaGUoKSkgewogICAgICAgcFBhZ2UgPSBtX3BDb250ZXh0LT5HZXRQYWdlQ2FjaGUoKS0+R2V0UGFnZSgpOwotICAgICAgcERvY3VtZW50ID0gcFBhZ2UtPm1fcERvY3VtZW50OworICAgICAgcERvY3VtZW50ID0gcFBhZ2UtPm1fcERvY3VtZW50LkdldCgpOwogICAgIH0gZWxzZSB7CiAgICAgICBwRG9jdW1lbnQgPSBwUGFnZU9iai0+QXNJbWFnZSgpLT5HZXRJbWFnZSgpLT5HZXREb2N1bWVudCgpOwogICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlUmVzb3VyY2VzID0gcFBhZ2UgPyBwUGFnZS0+bV9wUGFnZVJlc291cmNlcyA6IG51bGxwdHI7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZVJlc291cmNlcyA9CisgICAgICAgIHBQYWdlID8gcFBhZ2UtPm1fcFBhZ2VSZXNvdXJjZXMuR2V0KCkgOiBudWxscHRyOwogICAgIENQREZfT2JqZWN0KiBwQ1NPYmogPSBwUGFnZU9iai0+QXNJbWFnZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldEltYWdlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0U3RyZWFtKCkKQEAgLTE1MTAsMTEgKzE1NDQsMTEgQEAKICAgICAgICFiVGV4dENsaXAgJiYgIWJHcm91cFRyYW5zcGFyZW50KSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIGJvb2wgaXNvbGF0ZWQgPSAhIShUcmFuc3BhcmVuY3kgJiBQREZUUkFOU19JU09MQVRFRCk7CisgIGJvb2wgaXNvbGF0ZWQgPSAhIShpVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQpOwogICBpZiAobV9iUHJpbnQpIHsKICAgICBib29sIGJSZXQgPSBmYWxzZTsKICAgICBpbnQgcmVuZENhcHMgPSBtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKTsKLSAgICBpZiAoISgoVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQpIHx8IHBTTWFza0RpY3QgfHwgYlRleHRDbGlwKSAmJgorICAgIGlmICghKChpVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQpIHx8IHBTTWFza0RpY3QgfHwgYlRleHRDbGlwKSAmJgogICAgICAgICAocmVuZENhcHMgJiBGWFJDX0JMRU5EX01PREUpKSB7CiAgICAgICBpbnQgb2xkQmxlbmQgPSBtX2N1ckJsZW5kOwogICAgICAgbV9jdXJCbGVuZCA9IGJsZW5kX3R5cGU7CkBAIC0xNTI4LDExMyArMTU2MiwxMTYgQEAKICAgfQogICBGWF9SRUNUIHJlY3QgPSBwUGFnZU9iai0+R2V0QkJveChwT2JqMkRldmljZSk7CiAgIHJlY3QuSW50ZXJzZWN0KG1fcERldmljZS0+R2V0Q2xpcEJveCgpKTsKLSAgaWYgKHJlY3QuSXNFbXB0eSgpKSB7CisgIGlmIChyZWN0LklzRW1wdHkoKSkKICAgICByZXR1cm4gdHJ1ZTsKLSAgfQorCiAgIENGWF9NYXRyaXggZGV2aWNlQ1RNID0gbV9wRGV2aWNlLT5HZXRDVE0oKTsKLSAgRlhfRkxPQVQgc2NhbGVYID0gRlhTWVNfZmFicyhkZXZpY2VDVE0uYSk7Ci0gIEZYX0ZMT0FUIHNjYWxlWSA9IEZYU1lTX2ZhYnMoZGV2aWNlQ1RNLmQpOwotICBpbnQgd2lkdGggPSBGWFNZU19yb3VuZCgoRlhfRkxPQVQpcmVjdC5XaWR0aCgpICogc2NhbGVYKTsKLSAgaW50IGhlaWdodCA9IEZYU1lTX3JvdW5kKChGWF9GTE9BVClyZWN0LkhlaWdodCgpICogc2NhbGVZKTsKLSAgQ0ZYX0Z4Z2VEZXZpY2UgYml0bWFwX2RldmljZTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gb3JpRGV2aWNlOworICBmbG9hdCBzY2FsZVggPSBmYWJzKGRldmljZUNUTS5hKTsKKyAgZmxvYXQgc2NhbGVZID0gZmFicyhkZXZpY2VDVE0uZCk7CisgIGludCB3aWR0aCA9IEZYU1lTX3JvdW5kKChmbG9hdClyZWN0LldpZHRoKCkgKiBzY2FsZVgpOworICBpbnQgaGVpZ2h0ID0gRlhTWVNfcm91bmQoKGZsb2F0KXJlY3QuSGVpZ2h0KCkgKiBzY2FsZVkpOworICBDRlhfRGVmYXVsdFJlbmRlckRldmljZSBiaXRtYXBfZGV2aWNlOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBvcmlEZXZpY2U7CiAgIGlmICghaXNvbGF0ZWQgJiYgKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19HRVRfQklUUykpIHsKLSAgICBvcmlEZXZpY2UgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0RJQml0bWFwPigpOwotICAgIGlmICghbV9wRGV2aWNlLT5DcmVhdGVDb21wYXRpYmxlQml0bWFwKG9yaURldmljZS5nZXQoKSwgd2lkdGgsIGhlaWdodCkpCisgICAgb3JpRGV2aWNlID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKTsKKyAgICBpZiAoIW1fcERldmljZS0+Q3JlYXRlQ29tcGF0aWJsZUJpdG1hcChvcmlEZXZpY2UsIHdpZHRoLCBoZWlnaHQpKQogICAgICAgcmV0dXJuIHRydWU7Ci0gICAgbV9wRGV2aWNlLT5HZXRESUJpdHMob3JpRGV2aWNlLmdldCgpLCByZWN0LmxlZnQsIHJlY3QudG9wKTsKKyAgICBtX3BEZXZpY2UtPkdldERJQml0cyhvcmlEZXZpY2UsIHJlY3QubGVmdCwgcmVjdC50b3ApOwogICB9Ci0gIGlmICghYml0bWFwX2RldmljZS5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfQXJnYiwgb3JpRGV2aWNlLmdldCgpKSkKKyAgaWYgKCFiaXRtYXBfZGV2aWNlLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9BcmdiLCBvcmlEZXZpY2UpKQogICAgIHJldHVybiB0cnVlOwotICBDRlhfRElCaXRtYXAqIGJpdG1hcCA9IGJpdG1hcF9kZXZpY2UuR2V0Qml0bWFwKCk7CisKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gYml0bWFwID0gYml0bWFwX2RldmljZS5HZXRCaXRtYXAoKTsKICAgYml0bWFwLT5DbGVhcigwKTsKKwogICBDRlhfTWF0cml4IG5ld19tYXRyaXggPSAqcE9iajJEZXZpY2U7CiAgIG5ld19tYXRyaXguVHJhbnNsYXRlKC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7CiAgIG5ld19tYXRyaXguU2NhbGUoc2NhbGVYLCBzY2FsZVkpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBwVGV4dE1hc2s7CisKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcFRleHRNYXNrOwogICBpZiAoYlRleHRDbGlwKSB7Ci0gICAgcFRleHRNYXNrID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9ESUJpdG1hcD4oKTsKKyAgICBwVGV4dE1hc2sgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOwogICAgIGlmICghcFRleHRNYXNrLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfOGJwcE1hc2spKQogICAgICAgcmV0dXJuIHRydWU7CiAKICAgICBwVGV4dE1hc2stPkNsZWFyKDApOwotICAgIENGWF9GeGdlRGV2aWNlIHRleHRfZGV2aWNlOwotICAgIHRleHRfZGV2aWNlLkF0dGFjaChwVGV4dE1hc2suZ2V0KCksIGZhbHNlLCBudWxscHRyLCBmYWxzZSk7Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHBQYWdlT2JqLT5tX0NsaXBQYXRoLkdldFRleHRDb3VudCgpOyBpKyspIHsKKyAgICBDRlhfRGVmYXVsdFJlbmRlckRldmljZSB0ZXh0X2RldmljZTsKKyAgICB0ZXh0X2RldmljZS5BdHRhY2gocFRleHRNYXNrLCBmYWxzZSwgbnVsbHB0ciwgZmFsc2UpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcFBhZ2VPYmotPm1fQ2xpcFBhdGguR2V0VGV4dENvdW50KCk7ICsraSkgewogICAgICAgQ1BERl9UZXh0T2JqZWN0KiB0ZXh0b2JqID0gcFBhZ2VPYmotPm1fQ2xpcFBhdGguR2V0VGV4dChpKTsKICAgICAgIGlmICghdGV4dG9iaikKICAgICAgICAgYnJlYWs7CiAKICAgICAgIENGWF9NYXRyaXggdGV4dF9tYXRyaXggPSB0ZXh0b2JqLT5HZXRUZXh0TWF0cml4KCk7CiAgICAgICBDUERGX1RleHRSZW5kZXJlcjo6RHJhd1RleHRQYXRoKAotICAgICAgICAgICZ0ZXh0X2RldmljZSwgdGV4dG9iai0+bV9DaGFyQ29kZXMsIHRleHRvYmotPm1fQ2hhclBvcywKKyAgICAgICAgICAmdGV4dF9kZXZpY2UsIHRleHRvYmotPkdldENoYXJDb2RlcygpLCB0ZXh0b2JqLT5HZXRDaGFyUG9zaXRpb25zKCksCiAgICAgICAgICAgdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udCgpLCB0ZXh0b2JqLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZSgpLAogICAgICAgICAgICZ0ZXh0X21hdHJpeCwgJm5ld19tYXRyaXgsIHRleHRvYmotPm1fR3JhcGhTdGF0ZS5HZXRPYmplY3QoKSwKICAgICAgICAgICAoRlhfQVJHQiktMSwgMCwgbnVsbHB0ciwgMCk7CiAgICAgfQogICB9CiAgIENQREZfUmVuZGVyU3RhdHVzIGJpdG1hcF9yZW5kZXI7Ci0gIGJpdG1hcF9yZW5kZXIuSW5pdGlhbGl6ZShtX3BDb250ZXh0LCAmYml0bWFwX2RldmljZSwgbnVsbHB0ciwgbV9wU3RvcE9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIsICZtX09wdGlvbnMsIDAsIG1fYkRyb3BPYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1SZXNvdXJjZSwgdHJ1ZSk7CisgIGJpdG1hcF9yZW5kZXIuSW5pdGlhbGl6ZShtX3BDb250ZXh0LkdldCgpLCAmYml0bWFwX2RldmljZSwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFN0b3BPYmosIG51bGxwdHIsIG51bGxwdHIsICZtX09wdGlvbnMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2JEcm9wT2JqZWN0cywgcEZvcm1SZXNvdXJjZSwgdHJ1ZSk7CiAgIGJpdG1hcF9yZW5kZXIuUHJvY2Vzc09iamVjdE5vQ2xpcChwUGFnZU9iaiwgJm5ld19tYXRyaXgpOwogI2lmIGRlZmluZWQgX1NLSUFfU1VQUE9SVF9QQVRIU18KLSAgYml0bWFwX2RldmljZS5GbHVzaCgpOworICBiaXRtYXBfZGV2aWNlLkZsdXNoKHRydWUpOwogICBiaXRtYXAtPlVuUHJlTXVsdGlwbHkoKTsKICNlbmRpZgogICBtX2JTdG9wcGVkID0gYml0bWFwX3JlbmRlci5tX2JTdG9wcGVkOwogICBpZiAocFNNYXNrRGljdCkgewogICAgIENGWF9NYXRyaXggc21hc2tfbWF0cml4ID0gKnBQYWdlT2JqLT5tX0dlbmVyYWxTdGF0ZS5HZXRTTWFza01hdHJpeCgpOwogICAgIHNtYXNrX21hdHJpeC5Db25jYXQoKnBPYmoyRGV2aWNlKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQlNvdXJjZT4gcFNNYXNrU291cmNlID0KKyAgICBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4gcFNNYXNrU291cmNlID0KICAgICAgICAgTG9hZFNNYXNrKHBTTWFza0RpY3QsICZyZWN0LCAmc21hc2tfbWF0cml4KTsKICAgICBpZiAocFNNYXNrU291cmNlKQotICAgICAgYml0bWFwLT5NdWx0aXBseUFscGhhKHBTTWFza1NvdXJjZS5nZXQoKSk7CisgICAgICBiaXRtYXAtPk11bHRpcGx5QWxwaGEocFNNYXNrU291cmNlKTsKICAgfQogICBpZiAocFRleHRNYXNrKSB7Ci0gICAgYml0bWFwLT5NdWx0aXBseUFscGhhKHBUZXh0TWFzay5nZXQoKSk7Ci0gICAgcFRleHRNYXNrLnJlc2V0KCk7CisgICAgYml0bWFwLT5NdWx0aXBseUFscGhhKHBUZXh0TWFzayk7CisgICAgcFRleHRNYXNrLlJlc2V0KCk7CiAgIH0KICAgaW50MzJfdCBibGl0QWxwaGEgPSAyNTU7Ci0gIGlmIChUcmFuc3BhcmVuY3kgJiBQREZUUkFOU19HUk9VUCAmJiBncm91cF9hbHBoYSAhPSAxLjBmKSB7CisgIGlmIChpVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfR1JPVVAgJiYgZ3JvdXBfYWxwaGEgIT0gMS4wZikgewogICAgIGJsaXRBbHBoYSA9IChpbnQzMl90KShncm91cF9hbHBoYSAqIDI1NSk7CiAjaWZuZGVmIF9TS0lBX1NVUFBPUlRfCiAgICAgYml0bWFwLT5NdWx0aXBseUFscGhhKGJsaXRBbHBoYSk7CiAgICAgYmxpdEFscGhhID0gMjU1OwogI2VuZGlmCiAgIH0KLSAgVHJhbnNwYXJlbmN5ID0gbV9UcmFuc3BhcmVuY3k7CisgIGlUcmFuc3BhcmVuY3kgPSBtX2lUcmFuc3BhcmVuY3k7CiAgIGlmIChwUGFnZU9iai0+SXNGb3JtKCkpIHsKLSAgICBUcmFuc3BhcmVuY3kgfD0gUERGVFJBTlNfR1JPVVA7CisgICAgaVRyYW5zcGFyZW5jeSB8PSBQREZUUkFOU19HUk9VUDsKICAgfQogICBDb21wb3NpdGVESUJpdG1hcChiaXRtYXAsIHJlY3QubGVmdCwgcmVjdC50b3AsIDAsIGJsaXRBbHBoYSwgYmxlbmRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgVHJhbnNwYXJlbmN5KTsKKyAgICAgICAgICAgICAgICAgICAgaVRyYW5zcGFyZW5jeSk7CiAjaWYgZGVmaW5lZCBfU0tJQV9TVVBQT1JUXwogICBEZWJ1Z1ZlcmlmeURldmljZUlzUHJlTXVsdGlwbGllZCgpOwogI2VuZGlmCiAgIHJldHVybiB0cnVlOwogfQogCi1zdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBDUERGX1JlbmRlclN0YXR1czo6R2V0QmFja2Ryb3AoCitSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBDUERGX1JlbmRlclN0YXR1czo6R2V0QmFja2Ryb3AoCiAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwT2JqLAogICAgIGNvbnN0IEZYX1JFQ1QmIHJlY3QsCi0gICAgaW50JiBsZWZ0LAotICAgIGludCYgdG9wLAotICAgIGJvb2wgYkJhY2tBbHBoYVJlcXVpcmVkKSB7CisgICAgYm9vbCBiQmFja0FscGhhUmVxdWlyZWQsCisgICAgaW50KiBsZWZ0LAorICAgIGludCogdG9wKSB7CiAgIEZYX1JFQ1QgYmJveCA9IHJlY3Q7CiAgIGJib3guSW50ZXJzZWN0KG1fcERldmljZS0+R2V0Q2xpcEJveCgpKTsKLSAgbGVmdCA9IGJib3gubGVmdDsKLSAgdG9wID0gYmJveC50b3A7CisgICpsZWZ0ID0gYmJveC5sZWZ0OworICAqdG9wID0gYmJveC50b3A7CiAgIENGWF9NYXRyaXggZGV2aWNlQ1RNID0gbV9wRGV2aWNlLT5HZXRDVE0oKTsKLSAgRlhfRkxPQVQgc2NhbGVYID0gRlhTWVNfZmFicyhkZXZpY2VDVE0uYSk7Ci0gIEZYX0ZMT0FUIHNjYWxlWSA9IEZYU1lTX2ZhYnMoZGV2aWNlQ1RNLmQpOworICBmbG9hdCBzY2FsZVggPSBmYWJzKGRldmljZUNUTS5hKTsKKyAgZmxvYXQgc2NhbGVZID0gZmFicyhkZXZpY2VDVE0uZCk7CiAgIGludCB3aWR0aCA9IEZYU1lTX3JvdW5kKGJib3guV2lkdGgoKSAqIHNjYWxlWCk7CiAgIGludCBoZWlnaHQgPSBGWFNZU19yb3VuZChiYm94LkhlaWdodCgpICogc2NhbGVZKTsKLSAgYXV0byBwQmFja2Ryb3AgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0RJQml0bWFwPigpOworICBhdXRvIHBCYWNrZHJvcCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfRElCaXRtYXA+KCk7CiAgIGlmIChiQmFja0FscGhhUmVxdWlyZWQgJiYgIW1fYkRyb3BPYmplY3RzKQogICAgIHBCYWNrZHJvcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX0FyZ2IpOwogICBlbHNlCi0gICAgbV9wRGV2aWNlLT5DcmVhdGVDb21wYXRpYmxlQml0bWFwKHBCYWNrZHJvcC5nZXQoKSwgd2lkdGgsIGhlaWdodCk7CisgICAgbV9wRGV2aWNlLT5DcmVhdGVDb21wYXRpYmxlQml0bWFwKHBCYWNrZHJvcCwgd2lkdGgsIGhlaWdodCk7CiAKICAgaWYgKCFwQmFja2Ryb3AtPkdldEJ1ZmZlcigpKQogICAgIHJldHVybiBudWxscHRyOwpAQCAtMTY0NiwyNyArMTY4MywyNyBAQAogICAgIGJOZWVkRHJhdyA9ICEobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0dFVF9CSVRTKTsKIAogICBpZiAoIWJOZWVkRHJhdykgewotICAgIG1fcERldmljZS0+R2V0RElCaXRzKHBCYWNrZHJvcC5nZXQoKSwgbGVmdCwgdG9wKTsKKyAgICBtX3BEZXZpY2UtPkdldERJQml0cyhwQmFja2Ryb3AsICpsZWZ0LCAqdG9wKTsKICAgICByZXR1cm4gcEJhY2tkcm9wOwogICB9Ci0KICAgQ0ZYX01hdHJpeCBGaW5hbE1hdHJpeCA9IG1fRGV2aWNlTWF0cml4OwotICBGaW5hbE1hdHJpeC5UcmFuc2xhdGUoLWxlZnQsIC10b3ApOworICBGaW5hbE1hdHJpeC5UcmFuc2xhdGUoLSpsZWZ0LCAtKnRvcCk7CiAgIEZpbmFsTWF0cml4LlNjYWxlKHNjYWxlWCwgc2NhbGVZKTsKICAgcEJhY2tkcm9wLT5DbGVhcihwQmFja2Ryb3AtPkhhc0FscGhhKCkgPyAwIDogMHhmZmZmZmZmZik7Ci0gIENGWF9GeGdlRGV2aWNlIGRldmljZTsKLSAgZGV2aWNlLkF0dGFjaChwQmFja2Ryb3AuZ2V0KCksIGZhbHNlLCBudWxscHRyLCBmYWxzZSk7CisKKyAgQ0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2UgZGV2aWNlOworICBkZXZpY2UuQXR0YWNoKHBCYWNrZHJvcCwgZmFsc2UsIG51bGxwdHIsIGZhbHNlKTsKICAgbV9wQ29udGV4dC0+UmVuZGVyKCZkZXZpY2UsIHBPYmosICZtX09wdGlvbnMsICZGaW5hbE1hdHJpeCk7CiAgIHJldHVybiBwQmFja2Ryb3A7CiB9CiAKLUNQREZfR3JhcGhpY1N0YXRlcyogQ1BERl9SZW5kZXJTdGF0dXM6OkNsb25lT2JqU3RhdGVzKAorc3RkOjp1bmlxdWVfcHRyPENQREZfR3JhcGhpY1N0YXRlcz4gQ1BERl9SZW5kZXJTdGF0dXM6OkNsb25lT2JqU3RhdGVzKAogICAgIGNvbnN0IENQREZfR3JhcGhpY1N0YXRlcyogcFNyY1N0YXRlcywKICAgICBib29sIGJTdHJva2UpIHsKICAgaWYgKCFwU3JjU3RhdGVzKQogICAgIHJldHVybiBudWxscHRyOwogCi0gIENQREZfR3JhcGhpY1N0YXRlcyogcFN0YXRlcyA9IG5ldyBDUERGX0dyYXBoaWNTdGF0ZXM7CisgIGF1dG8gcFN0YXRlcyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0dyYXBoaWNTdGF0ZXM+KCk7CiAgIHBTdGF0ZXMtPkNvcHlTdGF0ZXMoKnBTcmNTdGF0ZXMpOwogICBjb25zdCBDUERGX0NvbG9yKiBwT2JqQ29sb3IgPSBiU3Ryb2tlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBTcmNTdGF0ZXMtPm1fQ29sb3JTdGF0ZS5HZXRTdHJva2VDb2xvcigpCkBAIC0xNjg5LDcgKzE3MjYsNyBAQAogYm9vbCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1RleHQoQ1BERl9UZXh0T2JqZWN0KiB0ZXh0b2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEqIHBDbGlwcGluZ1BhdGgpIHsKLSAgaWYgKHRleHRvYmotPm1fQ2hhckNvZGVzLmVtcHR5KCkpCisgIGlmICh0ZXh0b2JqLT5HZXRDaGFyQ29kZXMoKS5lbXB0eSgpKQogICAgIHJldHVybiB0cnVlOwogCiAgIGNvbnN0IFRleHRSZW5kZXJpbmdNb2RlIHRleHRfcmVuZGVyX21vZGUgPSB0ZXh0b2JqLT5tX1RleHRTdGF0ZS5HZXRUZXh0TW9kZSgpOwpAQCAtMTcyNyw3ICsxNzY0LDcgQEAKICAgICAgIGNhc2UgVGV4dFJlbmRlcmluZ01vZGU6Ok1PREVfSU5WSVNJQkxFOgogICAgICAgICAvLyBBbHJlYWR5IGhhbmRsZWQgYWJvdmUsIGJ1dCB0aGUgY29tcGlsZXIgaXMgbm90IHNtYXJ0IGVub3VnaCB0bwogICAgICAgICAvLyByZWFsaXplIGl0LiBGYWxsIHRocm91Z2guCi0gICAgICAgIEFTU0VSVChmYWxzZSk7CisgICAgICAgIE5PVFJFQUNIRUQoKTsKICAgICAgIGNhc2UgVGV4dFJlbmRlcmluZ01vZGU6Ok1PREVfQ0xJUDoKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtMTc1Myw3ICsxNzkwLDcgQEAKICAgaWYgKCFJc0F2YWlsYWJsZU1hdHJpeCh0ZXh0X21hdHJpeCkpCiAgICAgcmV0dXJuIHRydWU7CiAKLSAgRlhfRkxPQVQgZm9udF9zaXplID0gdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKTsKKyAgZmxvYXQgZm9udF9zaXplID0gdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKTsKICAgaWYgKGJQYXR0ZXJuKSB7CiAgICAgRHJhd1RleHRQYXRoV2l0aFBhdHRlcm4odGV4dG9iaiwgcE9iajJEZXZpY2UsIHBGb250LCBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRfbWF0cml4LCBiRmlsbCwgYlN0cm9rZSk7CkBAIC0xNzYzLDcgKzE4MDAsNyBAQAogICAgIGNvbnN0IENGWF9NYXRyaXgqIHBEZXZpY2VNYXRyaXggPSBwT2JqMkRldmljZTsKICAgICBDRlhfTWF0cml4IGRldmljZV9tYXRyaXg7CiAgICAgaWYgKGJTdHJva2UpIHsKLSAgICAgIGNvbnN0IEZYX0ZMT0FUKiBwQ1RNID0gdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0Q1RNKCk7CisgICAgICBjb25zdCBmbG9hdCogcENUTSA9IHRleHRvYmotPm1fVGV4dFN0YXRlLkdldENUTSgpOwogICAgICAgaWYgKHBDVE1bMF0gIT0gMS4wZiB8fCBwQ1RNWzNdICE9IDEuMGYpIHsKICAgICAgICAgQ0ZYX01hdHJpeCBjdG0ocENUTVswXSwgcENUTVsxXSwgcENUTVsyXSwgcENUTVszXSwgMCwgMCk7CiAgICAgICAgIHRleHRfbWF0cml4LkNvbmNhdEludmVyc2UoY3RtKTsKQEAgLTE3NzksMjUgKzE4MTYsMjggQEAKICAgICB9CiAgICAgaWYgKHRleHRvYmotPm1fR2VuZXJhbFN0YXRlLkdldFN0cm9rZUFkanVzdCgpKQogICAgICAgZmxhZyB8PSBGWF9TVFJPS0VfQURKVVNUOwotICAgIGlmIChtX09wdGlvbnMubV9GbGFncyAmIFJFTkRFUl9OT1RFWFRTTU9PVEgpCisgICAgaWYgKG1fT3B0aW9ucy5IYXNGbGFnKFJFTkRFUl9OT1RFWFRTTU9PVEgpKQogICAgICAgZmxhZyB8PSBGWEZJTExfTk9QQVRIU01PT1RIOwogICAgIHJldHVybiBDUERGX1RleHRSZW5kZXJlcjo6RHJhd1RleHRQYXRoKAotICAgICAgICBtX3BEZXZpY2UsIHRleHRvYmotPm1fQ2hhckNvZGVzLCB0ZXh0b2JqLT5tX0NoYXJQb3MsIHBGb250LCBmb250X3NpemUsCi0gICAgICAgICZ0ZXh0X21hdHJpeCwgcERldmljZU1hdHJpeCwgdGV4dG9iai0+bV9HcmFwaFN0YXRlLkdldE9iamVjdCgpLAotICAgICAgICBmaWxsX2FyZ2IsIHN0cm9rZV9hcmdiLCBwQ2xpcHBpbmdQYXRoLCBmbGFnKTsKKyAgICAgICAgbV9wRGV2aWNlLCB0ZXh0b2JqLT5HZXRDaGFyQ29kZXMoKSwgdGV4dG9iai0+R2V0Q2hhclBvc2l0aW9ucygpLCBwRm9udCwKKyAgICAgICAgZm9udF9zaXplLCAmdGV4dF9tYXRyaXgsIHBEZXZpY2VNYXRyaXgsCisgICAgICAgIHRleHRvYmotPm1fR3JhcGhTdGF0ZS5HZXRPYmplY3QoKSwgZmlsbF9hcmdiLCBzdHJva2VfYXJnYiwKKyAgICAgICAgcENsaXBwaW5nUGF0aCwgZmxhZyk7CiAgIH0KICAgdGV4dF9tYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7Ci0gIHJldHVybiBDUERGX1RleHRSZW5kZXJlcjo6RHJhd05vcm1hbFRleHQobV9wRGV2aWNlLCB0ZXh0b2JqLT5tX0NoYXJDb2RlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0b2JqLT5tX0NoYXJQb3MsIHBGb250LCBmb250X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRleHRfbWF0cml4LCBmaWxsX2FyZ2IsICZtX09wdGlvbnMpOworICByZXR1cm4gQ1BERl9UZXh0UmVuZGVyZXI6OkRyYXdOb3JtYWxUZXh0KAorICAgICAgbV9wRGV2aWNlLCB0ZXh0b2JqLT5HZXRDaGFyQ29kZXMoKSwgdGV4dG9iai0+R2V0Q2hhclBvc2l0aW9ucygpLCBwRm9udCwKKyAgICAgIGZvbnRfc2l6ZSwgJnRleHRfbWF0cml4LCBmaWxsX2FyZ2IsICZtX09wdGlvbnMpOwogfQogCi1DUERGX1R5cGUzQ2FjaGUqIENQREZfUmVuZGVyU3RhdHVzOjpHZXRDYWNoZWRUeXBlMyhDUERGX1R5cGUzRm9udCogcEZvbnQpIHsKLSAgaWYgKCFwRm9udC0+bV9wRG9jdW1lbnQpIHsKK1JldGFpblB0cjxDUERGX1R5cGUzQ2FjaGU+IENQREZfUmVuZGVyU3RhdHVzOjpHZXRDYWNoZWRUeXBlMygKKyAgICBDUERGX1R5cGUzRm9udCogcEZvbnQpIHsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IHBGb250LT5HZXREb2N1bWVudCgpOworICBpZiAoIXBEb2MpCiAgICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgcEZvbnQtPm1fcERvY3VtZW50LT5HZXRQYWdlRGF0YSgpLT5HZXRGb250KHBGb250LT5HZXRGb250RGljdCgpKTsKLSAgcmV0dXJuIHBGb250LT5tX3BEb2N1bWVudC0+R2V0UmVuZGVyRGF0YSgpLT5HZXRDYWNoZWRUeXBlMyhwRm9udCk7CisKKyAgcERvYy0+R2V0UGFnZURhdGEoKS0+R2V0Rm9udChwRm9udC0+R2V0Rm9udERpY3QoKSk7CisgIHJldHVybiBwRG9jLT5HZXRSZW5kZXJEYXRhKCktPkdldENhY2hlZFR5cGUzKHBGb250KTsKIH0KIAogLy8gVE9ETyhucG0pOiBGb250IGZhbGxiYWNrIGZvciB0eXBlIDMgZm9udHM/IChDb21wbGV0ZWx5IHNlcGFyYXRlIGNvZGUhISkKQEAgLTE4MDgsMjUgKzE4NDgsMjQgQEAKICAgICByZXR1cm4gdHJ1ZTsKIAogICBDRlhfTWF0cml4IGRDVE0gPSBtX3BEZXZpY2UtPkdldENUTSgpOwotICBGWF9GTE9BVCBzYSA9IEZYU1lTX2ZhYnMoZENUTS5hKTsKLSAgRlhfRkxPQVQgc2QgPSBGWFNZU19mYWJzKGRDVE0uZCk7CisgIGZsb2F0IHNhID0gZmFicyhkQ1RNLmEpOworICBmbG9hdCBzZCA9IGZhYnMoZENUTS5kKTsKICAgQ0ZYX01hdHJpeCB0ZXh0X21hdHJpeCA9IHRleHRvYmotPkdldFRleHRNYXRyaXgoKTsKICAgQ0ZYX01hdHJpeCBjaGFyX21hdHJpeCA9IHBUeXBlM0ZvbnQtPkdldEZvbnRNYXRyaXgoKTsKLSAgRlhfRkxPQVQgZm9udF9zaXplID0gdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKTsKKyAgZmxvYXQgZm9udF9zaXplID0gdGV4dG9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemUoKTsKICAgY2hhcl9tYXRyaXguU2NhbGUoZm9udF9zaXplLCBmb250X3NpemUpOwogICBGWF9BUkdCIGZpbGxfYXJnYiA9IEdldEZpbGxBcmdiKHRleHRvYmosIHRydWUpOwogICBpbnQgZmlsbF9hbHBoYSA9IEZYQVJHQl9BKGZpbGxfYXJnYik7CiAgIGludCBkZXZpY2VfY2xhc3MgPSBtX3BEZXZpY2UtPkdldERldmljZUNsYXNzKCk7CiAgIHN0ZDo6dmVjdG9yPEZYVEVYVF9HTFlQSFBPUz4gZ2x5cGhzOwogICBpZiAoZGV2aWNlX2NsYXNzID09IEZYRENfRElTUExBWSkKLSAgICBnbHlwaHMucmVzaXplKHRleHRvYmotPm1fQ2hhckNvZGVzLnNpemUoKSk7CisgICAgZ2x5cGhzLnJlc2l6ZSh0ZXh0b2JqLT5HZXRDaGFyQ29kZXMoKS5zaXplKCkpOwogICBlbHNlIGlmIChmaWxsX2FscGhhIDwgMjU1KQogICAgIHJldHVybiBmYWxzZTsKIAogICBDUERGX1JlZlR5cGUzQ2FjaGUgcmVmVHlwZUNhY2hlKHBUeXBlM0ZvbnQpOwotICBmb3IgKGludCBpQ2hhciA9IDA7IGlDaGFyIDwgcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQ+KHRleHRvYmotPm1fQ2hhckNvZGVzKTsKLSAgICAgICBpQ2hhcisrKSB7Ci0gICAgdWludDMyX3QgY2hhcmNvZGUgPSB0ZXh0b2JqLT5tX0NoYXJDb2Rlc1tpQ2hhcl07CisgIGZvciAoc2l6ZV90IGlDaGFyID0gMDsgaUNoYXIgPCB0ZXh0b2JqLT5HZXRDaGFyQ29kZXMoKS5zaXplKCk7ICsraUNoYXIpIHsKKyAgICB1aW50MzJfdCBjaGFyY29kZSA9IHRleHRvYmotPkdldENoYXJDb2RlcygpW2lDaGFyXTsKICAgICBpZiAoY2hhcmNvZGUgPT0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KC0xKSkKICAgICAgIGNvbnRpbnVlOwogCkBAIC0xODM1LDQ5ICsxODc0LDUzIEBACiAgICAgICBjb250aW51ZTsKIAogICAgIENGWF9NYXRyaXggbWF0cml4ID0gY2hhcl9tYXRyaXg7Ci0gICAgbWF0cml4LmUgKz0gaUNoYXIgPyB0ZXh0b2JqLT5tX0NoYXJQb3NbaUNoYXIgLSAxXSA6IDA7CisgICAgbWF0cml4LmUgKz0gaUNoYXIgPiAwID8gdGV4dG9iai0+R2V0Q2hhclBvc2l0aW9ucygpW2lDaGFyIC0gMV0gOiAwOwogICAgIG1hdHJpeC5Db25jYXQodGV4dF9tYXRyaXgpOwogICAgIG1hdHJpeC5Db25jYXQoKnBPYmoyRGV2aWNlKTsKLSAgICBpZiAoIXBUeXBlM0NoYXItPkxvYWRCaXRtYXAobV9wQ29udGV4dCkpIHsKKyAgICBpZiAoIXBUeXBlM0NoYXItPkxvYWRCaXRtYXAobV9wQ29udGV4dC5HZXQoKSkpIHsKICAgICAgIGlmICghZ2x5cGhzLmVtcHR5KCkpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ2hhcjsgaSsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaUNoYXI7ICsraSkgewogICAgICAgICAgIGNvbnN0IEZYVEVYVF9HTFlQSFBPUyYgZ2x5cGggPSBnbHlwaHNbaV07CiAgICAgICAgICAgaWYgKCFnbHlwaC5tX3BHbHlwaCkKICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgICAgbV9wRGV2aWNlLT5TZXRCaXRNYXNrKCZnbHlwaC5tX3BHbHlwaC0+bV9CaXRtYXAsCisgICAgICAgICAgbV9wRGV2aWNlLT5TZXRCaXRNYXNrKGdseXBoLm1fcEdseXBoLT5tX3BCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLm1fT3JpZ2luLnggKyBnbHlwaC5tX3BHbHlwaC0+bV9MZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaC5tX09yaWdpbi55IC0gZ2x5cGgubV9wR2x5cGgtPm1fVG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2FyZ2IpOwogICAgICAgICB9CiAgICAgICAgIGdseXBocy5jbGVhcigpOwogICAgICAgfQotICAgICAgQ1BERl9HcmFwaGljU3RhdGVzKiBwU3RhdGVzID0gQ2xvbmVPYmpTdGF0ZXModGV4dG9iaiwgZmFsc2UpOwotICAgICAgQ1BERl9SZW5kZXJPcHRpb25zIE9wdGlvbnMgPSBtX09wdGlvbnM7Ci0gICAgICBPcHRpb25zLm1fRmxhZ3MgfD0gUkVOREVSX0ZPUkNFX0hBTEZUT05FIHwgUkVOREVSX1JFQ1RfQUE7Ci0gICAgICBPcHRpb25zLm1fRmxhZ3MgJj0gflJFTkRFUl9GT1JDRV9ET1dOU0FNUExFOworCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9HcmFwaGljU3RhdGVzPiBwU3RhdGVzID0KKyAgICAgICAgICBDbG9uZU9ialN0YXRlcyh0ZXh0b2JqLCBmYWxzZSk7CisgICAgICBDUERGX1JlbmRlck9wdGlvbnMgb3B0aW9ucyA9IG1fT3B0aW9uczsKKyAgICAgIHVpbnQzMl90IG9wdGlvbl9mbGFncyA9IG9wdGlvbnMuR2V0RmxhZ3MoKTsKKyAgICAgIG9wdGlvbl9mbGFncyB8PSBSRU5ERVJfRk9SQ0VfSEFMRlRPTkUgfCBSRU5ERVJfUkVDVF9BQTsKKyAgICAgIG9wdGlvbl9mbGFncyAmPSB+UkVOREVSX0ZPUkNFX0RPV05TQU1QTEU7CisgICAgICBvcHRpb25zLlNldEZsYWdzKG9wdGlvbl9mbGFncyk7CisKICAgICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSA9IG51bGxwdHI7Ci0gICAgICBpZiAocFR5cGUzQ2hhci0+bV9wRm9ybSAmJiBwVHlwZTNDaGFyLT5tX3BGb3JtLT5tX3BGb3JtRGljdCkgeworICAgICAgaWYgKHBUeXBlM0NoYXItPmZvcm0oKSAmJiBwVHlwZTNDaGFyLT5mb3JtKCktPm1fcEZvcm1EaWN0KSB7CiAgICAgICAgIHBGb3JtUmVzb3VyY2UgPQotICAgICAgICAgICAgcFR5cGUzQ2hhci0+bV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3RGb3IoIlJlc291cmNlcyIpOworICAgICAgICAgICAgcFR5cGUzQ2hhci0+Zm9ybSgpLT5tX3BGb3JtRGljdC0+R2V0RGljdEZvcigiUmVzb3VyY2VzIik7CiAgICAgICB9CiAgICAgICBpZiAoZmlsbF9hbHBoYSA9PSAyNTUpIHsKICAgICAgICAgQ1BERl9SZW5kZXJTdGF0dXMgc3RhdHVzOwotICAgICAgICBzdGF0dXMuSW5pdGlhbGl6ZShtX3BDb250ZXh0LCBtX3BEZXZpY2UsIG51bGxwdHIsIG51bGxwdHIsIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGF0ZXMsICZPcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwVHlwZTNDaGFyLT5tX3BGb3JtLT5tX1RyYW5zcGFyZW5jeSwgbV9iRHJvcE9iamVjdHMsCisgICAgICAgIHN0YXR1cy5Jbml0aWFsaXplKG1fcENvbnRleHQuR2V0KCksIG1fcERldmljZSwgbnVsbHB0ciwgbnVsbHB0ciwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0YXRlcy5nZXQoKSwgJm9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBUeXBlM0NoYXItPmZvcm0oKS0+bV9pVHJhbnNwYXJlbmN5LCBtX2JEcm9wT2JqZWN0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1SZXNvdXJjZSwgZmFsc2UsIHBUeXBlM0NoYXIsIGZpbGxfYXJnYik7CiAgICAgICAgIHN0YXR1cy5tX1R5cGUzRm9udENhY2hlID0gbV9UeXBlM0ZvbnRDYWNoZTsKICAgICAgICAgc3RhdHVzLm1fVHlwZTNGb250Q2FjaGUucHVzaF9iYWNrKHBUeXBlM0ZvbnQpOwotICAgICAgICBtX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOwotICAgICAgICBzdGF0dXMuUmVuZGVyT2JqZWN0TGlzdChwVHlwZTNDaGFyLT5tX3BGb3JtLmdldCgpLCAmbWF0cml4KTsKLSAgICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoZmFsc2UpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0X2YgPSBwVHlwZTNDaGFyLT5tX3BGb3JtLT5DYWxjQm91bmRpbmdCb3goKTsKLSAgICAgICAgbWF0cml4LlRyYW5zZm9ybVJlY3QocmVjdF9mKTsKIAotICAgICAgICBGWF9SRUNUIHJlY3QgPSByZWN0X2YuR2V0T3V0ZXJSZWN0KCk7Ci0gICAgICAgIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2U7CisgICAgICAgIENGWF9SZW5kZXJEZXZpY2U6OlN0YXRlUmVzdG9yZXIgcmVzdG9yZXIobV9wRGV2aWNlKTsKKyAgICAgICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QocFR5cGUzQ2hhci0+Zm9ybSgpLCAmbWF0cml4KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZYX1JFQ1QgcmVjdCA9CisgICAgICAgICAgICBtYXRyaXguVHJhbnNmb3JtUmVjdChwVHlwZTNDaGFyLT5mb3JtKCktPkNhbGNCb3VuZGluZ0JveCgpKQorICAgICAgICAgICAgICAgIC5HZXRPdXRlclJlY3QoKTsKKyAgICAgICAgQ0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2UgYml0bWFwX2RldmljZTsKICAgICAgICAgaWYgKCFiaXRtYXBfZGV2aWNlLkNyZWF0ZSgoaW50KShyZWN0LldpZHRoKCkgKiBzYSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkocmVjdC5IZWlnaHQoKSAqIHNkKSwgRlhESUJfQXJnYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSkgewpAQCAtMTg4NSwyMSArMTkyOCwyMCBAQAogICAgICAgICB9CiAgICAgICAgIGJpdG1hcF9kZXZpY2UuR2V0Qml0bWFwKCktPkNsZWFyKDApOwogICAgICAgICBDUERGX1JlbmRlclN0YXR1cyBzdGF0dXM7Ci0gICAgICAgIHN0YXR1cy5Jbml0aWFsaXplKG1fcENvbnRleHQsICZiaXRtYXBfZGV2aWNlLCBudWxscHRyLCBudWxscHRyLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhdGVzLCAmT3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcFR5cGUzQ2hhci0+bV9wRm9ybS0+bV9UcmFuc3BhcmVuY3ksIG1fYkRyb3BPYmplY3RzLAorICAgICAgICBzdGF0dXMuSW5pdGlhbGl6ZShtX3BDb250ZXh0LkdldCgpLCAmYml0bWFwX2RldmljZSwgbnVsbHB0ciwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgcFN0YXRlcy5nZXQoKSwgJm9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBUeXBlM0NoYXItPmZvcm0oKS0+bV9pVHJhbnNwYXJlbmN5LCBtX2JEcm9wT2JqZWN0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1SZXNvdXJjZSwgZmFsc2UsIHBUeXBlM0NoYXIsIGZpbGxfYXJnYik7CiAgICAgICAgIHN0YXR1cy5tX1R5cGUzRm9udENhY2hlID0gbV9UeXBlM0ZvbnRDYWNoZTsKICAgICAgICAgc3RhdHVzLm1fVHlwZTNGb250Q2FjaGUucHVzaF9iYWNrKHBUeXBlM0ZvbnQpOwogICAgICAgICBtYXRyaXguVHJhbnNsYXRlKC1yZWN0LmxlZnQsIC1yZWN0LnRvcCk7CiAgICAgICAgIG1hdHJpeC5TY2FsZShzYSwgc2QpOwotICAgICAgICBzdGF0dXMuUmVuZGVyT2JqZWN0TGlzdChwVHlwZTNDaGFyLT5tX3BGb3JtLmdldCgpLCAmbWF0cml4KTsKKyAgICAgICAgc3RhdHVzLlJlbmRlck9iamVjdExpc3QocFR5cGUzQ2hhci0+Zm9ybSgpLCAmbWF0cml4KTsKICAgICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHMoYml0bWFwX2RldmljZS5HZXRCaXRtYXAoKSwgcmVjdC5sZWZ0LCByZWN0LnRvcCk7CiAgICAgICB9Ci0gICAgICBkZWxldGUgcFN0YXRlczsKLSAgICB9IGVsc2UgaWYgKHBUeXBlM0NoYXItPm1fcEJpdG1hcCkgeworICAgIH0gZWxzZSBpZiAocFR5cGUzQ2hhci0+R2V0Qml0bWFwKCkpIHsKICAgICAgIGlmIChkZXZpY2VfY2xhc3MgPT0gRlhEQ19ESVNQTEFZKSB7Ci0gICAgICAgIENQREZfVHlwZTNDYWNoZSogcENhY2hlID0gR2V0Q2FjaGVkVHlwZTMocFR5cGUzRm9udCk7CisgICAgICAgIFJldGFpblB0cjxDUERGX1R5cGUzQ2FjaGU+IHBDYWNoZSA9IEdldENhY2hlZFR5cGUzKHBUeXBlM0ZvbnQpOwogICAgICAgICByZWZUeXBlQ2FjaGUubV9kd0NvdW50Kys7CiAgICAgICAgIENGWF9HbHlwaEJpdG1hcCogcEJpdG1hcCA9IHBDYWNoZS0+TG9hZEdseXBoKGNoYXJjb2RlLCAmbWF0cml4LCBzYSwgc2QpOwogICAgICAgICBpZiAoIXBCaXRtYXApCkBAIC0xOTA3LDE3ICsxOTQ5LDE3IEBACiAKICAgICAgICAgQ0ZYX1BvaW50IG9yaWdpbihGWFNZU19yb3VuZChtYXRyaXguZSksIEZYU1lTX3JvdW5kKG1hdHJpeC5mKSk7CiAgICAgICAgIGlmIChnbHlwaHMuZW1wdHkoKSkgewotICAgICAgICAgIG1fcERldmljZS0+U2V0Qml0TWFzaygmcEJpdG1hcC0+bV9CaXRtYXAsIG9yaWdpbi54ICsgcEJpdG1hcC0+bV9MZWZ0LAorICAgICAgICAgIG1fcERldmljZS0+U2V0Qml0TWFzayhwQml0bWFwLT5tX3BCaXRtYXAsIG9yaWdpbi54ICsgcEJpdG1hcC0+bV9MZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW4ueSAtIHBCaXRtYXAtPm1fVG9wLCBmaWxsX2FyZ2IpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIGdseXBoc1tpQ2hhcl0ubV9wR2x5cGggPSBwQml0bWFwOwogICAgICAgICAgIGdseXBoc1tpQ2hhcl0ubV9PcmlnaW4gPSBvcmlnaW47CiAgICAgICAgIH0KICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIENGWF9NYXRyaXggaW1hZ2VfbWF0cml4ID0gcFR5cGUzQ2hhci0+bV9JbWFnZU1hdHJpeDsKKyAgICAgICAgQ0ZYX01hdHJpeCBpbWFnZV9tYXRyaXggPSBwVHlwZTNDaGFyLT5tYXRyaXgoKTsKICAgICAgICAgaW1hZ2VfbWF0cml4LkNvbmNhdChtYXRyaXgpOwogICAgICAgICBDUERGX0ltYWdlUmVuZGVyZXIgcmVuZGVyZXI7Ci0gICAgICAgIGlmIChyZW5kZXJlci5TdGFydCh0aGlzLCBwVHlwZTNDaGFyLT5tX3BCaXRtYXAuZ2V0KCksIGZpbGxfYXJnYiwgMjU1LAorICAgICAgICBpZiAocmVuZGVyZXIuU3RhcnQodGhpcywgcFR5cGUzQ2hhci0+R2V0Qml0bWFwKCksIGZpbGxfYXJnYiwgMjU1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJmltYWdlX21hdHJpeCwgMCwgZmFsc2UsIEZYRElCX0JMRU5EX05PUk1BTCkpIHsKICAgICAgICAgICByZW5kZXJlci5Db250aW51ZShudWxscHRyKTsKICAgICAgICAgfQpAQCAtMTkzMSwxMiArMTk3MywxMiBAQAogICAgIHJldHVybiB0cnVlOwogCiAgIEZYX1JFQ1QgcmVjdCA9IEZYR0VfR2V0R2x5cGhzQkJveChnbHlwaHMsIDAsIHNhLCBzZCk7Ci0gIENGWF9ESUJpdG1hcCBiaXRtYXA7Ci0gIGlmICghYml0bWFwLkNyZWF0ZShzdGF0aWNfY2FzdDxpbnQ+KHJlY3QuV2lkdGgoKSAqIHNhKSwKLSAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4ocmVjdC5IZWlnaHQoKSAqIHNkKSwgRlhESUJfOGJwcE1hc2spKSB7CisgIGF1dG8gcEJpdG1hcCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfRElCaXRtYXA+KCk7CisgIGlmICghcEJpdG1hcC0+Q3JlYXRlKHN0YXRpY19jYXN0PGludD4ocmVjdC5XaWR0aCgpICogc2EpLAorICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHJlY3QuSGVpZ2h0KCkgKiBzZCksIEZYRElCXzhicHBNYXNrKSkgewogICAgIHJldHVybiB0cnVlOwogICB9Ci0gIGJpdG1hcC5DbGVhcigwKTsKKyAgcEJpdG1hcC0+Q2xlYXIoMCk7CiAgIGZvciAoY29uc3QgRlhURVhUX0dMWVBIUE9TJiBnbHlwaCA6IGdseXBocykgewogICAgIGlmICghZ2x5cGgubV9wR2x5cGgpCiAgICAgICBjb250aW51ZTsKQEAgLTE5NTUsMjAgKzE5OTcsMjAgQEAKICAgICBpZiAoIXRvcC5Jc1ZhbGlkKCkpCiAgICAgICBjb250aW51ZTsKIAotICAgIGJpdG1hcC5Db21wb3NpdGVNYXNrKGxlZnQuVmFsdWVPckRpZSgpLCB0b3AuVmFsdWVPckRpZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLm1fcEdseXBoLT5tX0JpdG1hcC5HZXRXaWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLm1fcEdseXBoLT5tX0JpdG1hcC5HZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmZ2x5cGgubV9wR2x5cGgtPm1fQml0bWFwLCBmaWxsX2FyZ2IsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfQkxFTkRfTk9STUFMLCBudWxscHRyLCBmYWxzZSwgMCwgbnVsbHB0cik7CisgICAgcEJpdG1hcC0+Q29tcG9zaXRlTWFzayhsZWZ0LlZhbHVlT3JEaWUoKSwgdG9wLlZhbHVlT3JEaWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLm1fcEdseXBoLT5tX3BCaXRtYXAtPkdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaC5tX3BHbHlwaC0+bV9wQml0bWFwLT5HZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLm1fcEdseXBoLT5tX3BCaXRtYXAsIGZpbGxfYXJnYiwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0JMRU5EX05PUk1BTCwgbnVsbHB0ciwgZmFsc2UsIDApOwogICB9Ci0gIG1fcERldmljZS0+U2V0Qml0TWFzaygmYml0bWFwLCByZWN0LmxlZnQsIHJlY3QudG9wLCBmaWxsX2FyZ2IpOworICBtX3BEZXZpY2UtPlNldEJpdE1hc2socEJpdG1hcCwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgZmlsbF9hcmdiKTsKICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdUZXh0UGF0aFdpdGhQYXR0ZXJuKGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZvbnRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBUZXh0TWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmlsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0cm9rZSkgewpAQCAtMTk5MCwxMyArMjAzMiwxMyBAQAogICAgIHJldHVybjsKICAgfQogICBDUERGX0NoYXJQb3NMaXN0IENoYXJQb3NMaXN0OwotICBDaGFyUG9zTGlzdC5Mb2FkKHRleHRvYmotPm1fQ2hhckNvZGVzLCB0ZXh0b2JqLT5tX0NoYXJQb3MsIHBGb250LCBmb250X3NpemUpOworICBDaGFyUG9zTGlzdC5Mb2FkKHRleHRvYmotPkdldENoYXJDb2RlcygpLCB0ZXh0b2JqLT5HZXRDaGFyUG9zaXRpb25zKCksIHBGb250LAorICAgICAgICAgICAgICAgICAgIGZvbnRfc2l6ZSk7CiAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBDaGFyUG9zTGlzdC5tX25DaGFyczsgaSsrKSB7CiAgICAgRlhURVhUX0NIQVJQT1MmIGNoYXJwb3MgPSBDaGFyUG9zTGlzdC5tX3BDaGFyUG9zW2ldOwotICAgIGF1dG8gZm9udCA9Ci0gICAgICAgIGNoYXJwb3MubV9GYWxsYmFja0ZvbnRQb3NpdGlvbiA9PSAtMQotICAgICAgICAgICAgPyAmcEZvbnQtPm1fRm9udAotICAgICAgICAgICAgOiBwRm9udC0+bV9Gb250RmFsbGJhY2tzW2NoYXJwb3MubV9GYWxsYmFja0ZvbnRQb3NpdGlvbl0uZ2V0KCk7CisgICAgYXV0byogZm9udCA9IGNoYXJwb3MubV9GYWxsYmFja0ZvbnRQb3NpdGlvbiA9PSAtMQorICAgICAgICAgICAgICAgICAgICAgPyBwRm9udC0+R2V0Rm9udCgpCisgICAgICAgICAgICAgICAgICAgICA6IHBGb250LT5HZXRGb250RmFsbGJhY2soY2hhcnBvcy5tX0ZhbGxiYWNrRm9udFBvc2l0aW9uKTsKICAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoID0KICAgICAgICAgZm9udC0+TG9hZEdseXBoUGF0aChjaGFycG9zLm1fR2x5cGhJbmRleCwgY2hhcnBvcy5tX0ZvbnRDaGFyV2lkdGgpOwogICAgIGlmICghcFBhdGgpCkBAIC0yMDIzLDcgKzIwNjUsNyBAQAogICB9CiB9CiAKLXZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdTaGFkaW5nKENQREZfU2hhZGluZ1BhdHRlcm4qIHBQYXR0ZXJuLAordm9pZCBDUERGX1JlbmRlclN0YXR1czo6RHJhd1NoYWRpbmcoY29uc3QgQ1BERl9TaGFkaW5nUGF0dGVybiogcFBhdHRlcm4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfUkVDVCYgY2xpcF9yZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhLApAQCAtMjAzOSwxOSArMjA4MSwyMCBAQAogICAgIENQREZfQXJyYXkqIHBCYWNrQ29sb3IgPSBwRGljdC0+R2V0QXJyYXlGb3IoIkJhY2tncm91bmQiKTsKICAgICBpZiAocEJhY2tDb2xvciAmJgogICAgICAgICBwQmFja0NvbG9yLT5HZXRDb3VudCgpID49IHBDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSkgewotICAgICAgQ0ZYX0ZpeGVkQnVmR3JvdzxGWF9GTE9BVCwgMTY+IGNvbXBzKHBDb2xvclNwYWNlLT5Db3VudENvbXBvbmVudHMoKSk7CisgICAgICBDRlhfRml4ZWRCdWZHcm93PGZsb2F0LCAxNj4gY29tcHMocENvbG9yU3BhY2UtPkNvdW50Q29tcG9uZW50cygpKTsKICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ29sb3JTcGFjZS0+Q291bnRDb21wb25lbnRzKCk7IGkrKykKICAgICAgICAgY29tcHNbaV0gPSBwQmFja0NvbG9yLT5HZXROdW1iZXJBdChpKTsKLSAgICAgIEZYX0ZMT0FUIFIgPSAwLjBmLCBHID0gMC4wZiwgQiA9IDAuMGY7Ci0gICAgICBwQ29sb3JTcGFjZS0+R2V0UkdCKGNvbXBzLCBSLCBHLCBCKTsKKyAgICAgIGZsb2F0IFIgPSAwLjBmOworICAgICAgZmxvYXQgRyA9IDAuMGY7CisgICAgICBmbG9hdCBCID0gMC4wZjsKKyAgICAgIHBDb2xvclNwYWNlLT5HZXRSR0IoY29tcHMsICZSLCAmRywgJkIpOwogICAgICAgYmFja2dyb3VuZCA9IEFyZ2JFbmNvZGUoMjU1LCAoaW50MzJfdCkoUiAqIDI1NSksIChpbnQzMl90KShHICogMjU1KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KShCICogMjU1KSk7CiAgICAgfQogICB9CiAgIGlmIChwRGljdC0+S2V5RXhpc3QoIkJCb3giKSkgewotICAgIENGWF9GbG9hdFJlY3QgcmVjdCA9IHBEaWN0LT5HZXRSZWN0Rm9yKCJCQm94Iik7Ci0gICAgcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChyZWN0KTsKLSAgICBjbGlwX3JlY3QuSW50ZXJzZWN0KHJlY3QuR2V0T3V0ZXJSZWN0KCkpOworICAgIGNsaXBfcmVjdC5JbnRlcnNlY3QoCisgICAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybVJlY3QocERpY3QtPkdldFJlY3RGb3IoIkJCb3giKSkuR2V0T3V0ZXJSZWN0KCkpOwogICB9CiAgIGlmIChtX3BEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19SRU5ERVJfQ0FQUykgJiBGWFJDX1NIQURJTkcgJiYKICAgICAgIG1fcERldmljZS0+R2V0RGV2aWNlRHJpdmVyKCktPkRyYXdTaGFkaW5nKHBQYXR0ZXJuLCBwTWF0cml4LCBjbGlwX3JlY3QsCkBAIC0yMDU5LDE1ICsyMTAyLDE0IEBACiAgICAgcmV0dXJuOwogICB9CiAgIENQREZfRGV2aWNlQnVmZmVyIGJ1ZmZlcjsKLSAgYnVmZmVyLkluaXRpYWxpemUobV9wQ29udGV4dCwgbV9wRGV2aWNlLCAmY2xpcF9yZWN0LCBtX3BDdXJPYmosIDE1MCk7CisgIGJ1ZmZlci5Jbml0aWFsaXplKG1fcENvbnRleHQuR2V0KCksIG1fcERldmljZSwgJmNsaXBfcmVjdCwgbV9wQ3VyT2JqLCAxNTApOwogICBDRlhfTWF0cml4IEZpbmFsTWF0cml4ID0gKnBNYXRyaXg7CiAgIEZpbmFsTWF0cml4LkNvbmNhdCgqYnVmZmVyLkdldE1hdHJpeCgpKTsKLSAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gYnVmZmVyLkdldEJpdG1hcCgpOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwQml0bWFwID0gYnVmZmVyLkdldEJpdG1hcCgpOwogICBpZiAoIXBCaXRtYXAtPkdldEJ1ZmZlcigpKQogICAgIHJldHVybjsKIAogICBwQml0bWFwLT5DbGVhcihiYWNrZ3JvdW5kKTsKLSAgaW50IGZpbGxfbW9kZSA9IG1fT3B0aW9ucy5tX0ZsYWdzOwogICBzd2l0Y2ggKHBQYXR0ZXJuLT5HZXRTaGFkaW5nVHlwZSgpKSB7CiAgICAgY2FzZSBrSW52YWxpZFNoYWRpbmc6CiAgICAgY2FzZSBrTWF4U2hhZGluZzoKQEAgLTIxMDQsMTUgKzIxNDYsMTYgQEAKICAgICAgIC8vIHRoZSBjYXNlIG9mIGRpY3Rpb25hcnkgYXQgdGhlIG1vbWVudC4KICAgICAgIGlmIChDUERGX1N0cmVhbSogcFN0cmVhbSA9IFRvU3RyZWFtKHBQYXR0ZXJuLT5HZXRTaGFkaW5nT2JqZWN0KCkpKSB7CiAgICAgICAgIERyYXdDb29uUGF0Y2hNZXNoZXMocFBhdHRlcm4tPkdldFNoYWRpbmdUeXBlKCksIHBCaXRtYXAsICZGaW5hbE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLCBmdW5jcywgcENvbG9yU3BhY2UsIGZpbGxfbW9kZSwgYWxwaGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW0sIGZ1bmNzLCBwQ29sb3JTcGFjZSwgbV9PcHRpb25zLkdldEZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEpOwogICAgICAgfQogICAgIH0gYnJlYWs7CiAgIH0KICAgaWYgKGJBbHBoYU1vZGUpCiAgICAgcEJpdG1hcC0+TG9hZENoYW5uZWwoRlhESUJfUmVkLCBwQml0bWFwLCBGWERJQl9BbHBoYSk7CiAKLSAgaWYgKG1fT3B0aW9ucy5tX0NvbG9yTW9kZSA9PSBSRU5ERVJfQ09MT1JfR1JBWSkKLSAgICBwQml0bWFwLT5Db252ZXJ0Q29sb3JTY2FsZShtX09wdGlvbnMubV9Gb3JlQ29sb3IsIG1fT3B0aW9ucy5tX0JhY2tDb2xvcik7CisgIGlmIChtX09wdGlvbnMuQ29sb3JNb2RlSXMoQ1BERl9SZW5kZXJPcHRpb25zOjprR3JheSkpCisgICAgcEJpdG1hcC0+Q29udmVydENvbG9yU2NhbGUoMCwgMHhmZmZmZmYpOwogICBidWZmZXIuT3V0cHV0VG9EZXZpY2UoKTsKIH0KIApAQCAtMjEyMywyMiArMjE2NiwxOSBAQAogICBpZiAoIXBhdHRlcm4tPkxvYWQoKSkKICAgICByZXR1cm47CiAKLSAgbV9wRGV2aWNlLT5TYXZlU3RhdGUoKTsKKyAgQ0ZYX1JlbmRlckRldmljZTo6U3RhdGVSZXN0b3JlciByZXN0b3JlcihtX3BEZXZpY2UpOwogICBpZiAocFBhZ2VPYmotPklzUGF0aCgpKSB7Ci0gICAgaWYgKCFTZWxlY3RDbGlwUGF0aChwUGFnZU9iai0+QXNQYXRoKCksIHBPYmoyRGV2aWNlLCBiU3Ryb2tlKSkgewotICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoZmFsc2UpOworICAgIGlmICghU2VsZWN0Q2xpcFBhdGgocFBhZ2VPYmotPkFzUGF0aCgpLCBwT2JqMkRldmljZSwgYlN0cm9rZSkpCiAgICAgICByZXR1cm47Ci0gICAgfQogICB9IGVsc2UgaWYgKHBQYWdlT2JqLT5Jc0ltYWdlKCkpIHsKICAgICBtX3BEZXZpY2UtPlNldENsaXBfUmVjdChwUGFnZU9iai0+R2V0QkJveChwT2JqMkRldmljZSkpOwogICB9IGVsc2UgewogICAgIHJldHVybjsKICAgfQogICBGWF9SRUNUIHJlY3Q7Ci0gIGlmIChHZXRPYmplY3RDbGlwcGVkUmVjdChwUGFnZU9iaiwgcE9iajJEZXZpY2UsIGZhbHNlLCByZWN0KSkgewotICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKGZhbHNlKTsKKyAgaWYgKEdldE9iamVjdENsaXBwZWRSZWN0KHBQYWdlT2JqLCBwT2JqMkRldmljZSwgZmFsc2UsIHJlY3QpKQogICAgIHJldHVybjsKLSAgfQorCiAgIENGWF9NYXRyaXggbWF0cml4ID0gKnBhdHRlcm4tPnBhdHRlcm5fdG9fZm9ybSgpOwogICBtYXRyaXguQ29uY2F0KCpwT2JqMkRldmljZSk7CiAgIEdldFNjYWxlZE1hdHJpeChtYXRyaXgpOwpAQCAtMjE0Niw4ICsyMTg2LDcgQEAKICAgICAgIEZYU1lTX3JvdW5kKDI1NSAqIChiU3Ryb2tlID8gcFBhZ2VPYmotPm1fR2VuZXJhbFN0YXRlLkdldFN0cm9rZUFscGhhKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcFBhZ2VPYmotPm1fR2VuZXJhbFN0YXRlLkdldEZpbGxBbHBoYSgpKSk7CiAgIERyYXdTaGFkaW5nKHBhdHRlcm4sICZtYXRyaXgsIHJlY3QsIGFscGhhLAotICAgICAgICAgICAgICBtX09wdGlvbnMubV9Db2xvck1vZGUgPT0gUkVOREVSX0NPTE9SX0FMUEhBKTsKLSAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoZmFsc2UpOworICAgICAgICAgICAgICBtX09wdGlvbnMuQ29sb3JNb2RlSXMoQ1BERl9SZW5kZXJPcHRpb25zOjprQWxwaGEpKTsKIH0KIAogdm9pZCBDUERGX1JlbmRlclN0YXR1czo6UHJvY2Vzc1NoYWRpbmcoY29uc3QgQ1BERl9TaGFkaW5nT2JqZWN0KiBwU2hhZGluZ09iaiwKQEAgLTIxNTgsMTU1ICsyMTk3LDE1NiBAQAogICBpZiAocmVjdC5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuOwogCi0gIENGWF9NYXRyaXggbWF0cml4ID0gcFNoYWRpbmdPYmotPm1fTWF0cml4OworICBDRlhfTWF0cml4IG1hdHJpeCA9IHBTaGFkaW5nT2JqLT5tYXRyaXgoKTsKICAgbWF0cml4LkNvbmNhdCgqcE9iajJEZXZpY2UpOwotICBEcmF3U2hhZGluZyhwU2hhZGluZ09iai0+bV9wU2hhZGluZywgJm1hdHJpeCwgcmVjdCwKKyAgRHJhd1NoYWRpbmcocFNoYWRpbmdPYmotPnBhdHRlcm4oKSwgJm1hdHJpeCwgcmVjdCwKICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoMjU1ICogcFNoYWRpbmdPYmotPm1fR2VuZXJhbFN0YXRlLkdldEZpbGxBbHBoYSgpKSwKLSAgICAgICAgICAgICAgbV9PcHRpb25zLm1fQ29sb3JNb2RlID09IFJFTkRFUl9DT0xPUl9BTFBIQSk7CisgICAgICAgICAgICAgIG1fT3B0aW9ucy5Db2xvck1vZGVJcyhDUERGX1JlbmRlck9wdGlvbnM6OmtBbHBoYSkpOwogfQogCiB2b2lkIENQREZfUmVuZGVyU3RhdHVzOjpEcmF3VGlsaW5nUGF0dGVybihDUERGX1RpbGluZ1BhdHRlcm4qIHBQYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3Ryb2tlKSB7Ci0gIGlmICghcFBhdHRlcm4tPkxvYWQoKSkgeworICBpZiAoIXBQYXR0ZXJuLT5Mb2FkKCkpCiAgICAgcmV0dXJuOwotICB9Ci0gIG1fcERldmljZS0+U2F2ZVN0YXRlKCk7CisKKyAgQ0ZYX1JlbmRlckRldmljZTo6U3RhdGVSZXN0b3JlciByZXN0b3JlcihtX3BEZXZpY2UpOwogICBpZiAocFBhZ2VPYmotPklzUGF0aCgpKSB7Ci0gICAgaWYgKCFTZWxlY3RDbGlwUGF0aChwUGFnZU9iai0+QXNQYXRoKCksIHBPYmoyRGV2aWNlLCBiU3Ryb2tlKSkgewotICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoZmFsc2UpOworICAgIGlmICghU2VsZWN0Q2xpcFBhdGgocFBhZ2VPYmotPkFzUGF0aCgpLCBwT2JqMkRldmljZSwgYlN0cm9rZSkpCiAgICAgICByZXR1cm47Ci0gICAgfQogICB9IGVsc2UgaWYgKHBQYWdlT2JqLT5Jc0ltYWdlKCkpIHsKICAgICBtX3BEZXZpY2UtPlNldENsaXBfUmVjdChwUGFnZU9iai0+R2V0QkJveChwT2JqMkRldmljZSkpOwogICB9IGVsc2UgewogICAgIHJldHVybjsKICAgfQorCiAgIEZYX1JFQ1QgY2xpcF9ib3ggPSBtX3BEZXZpY2UtPkdldENsaXBCb3goKTsKLSAgaWYgKGNsaXBfYm94LklzRW1wdHkoKSkgewotICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKGZhbHNlKTsKKyAgaWYgKGNsaXBfYm94LklzRW1wdHkoKSkKICAgICByZXR1cm47Ci0gIH0KKwogICBDRlhfTWF0cml4IGRDVE0gPSBtX3BEZXZpY2UtPkdldENUTSgpOwotICBGWF9GTE9BVCBzYSA9IEZYU1lTX2ZhYnMoZENUTS5hKTsKLSAgRlhfRkxPQVQgc2QgPSBGWFNZU19mYWJzKGRDVE0uZCk7Ci0gIGNsaXBfYm94LnJpZ2h0ID0gY2xpcF9ib3gubGVmdCArIChpbnQzMl90KUZYU1lTX2NlaWwoY2xpcF9ib3guV2lkdGgoKSAqIHNhKTsKLSAgY2xpcF9ib3guYm90dG9tID0gY2xpcF9ib3gudG9wICsgKGludDMyX3QpRlhTWVNfY2VpbChjbGlwX2JveC5IZWlnaHQoKSAqIHNkKTsKKyAgZmxvYXQgc2EgPSBmYWJzKGRDVE0uYSk7CisgIGZsb2F0IHNkID0gZmFicyhkQ1RNLmQpOworICBjbGlwX2JveC5yaWdodCA9IGNsaXBfYm94LmxlZnQgKyAoaW50MzJfdCljZWlsKGNsaXBfYm94LldpZHRoKCkgKiBzYSk7CisgIGNsaXBfYm94LmJvdHRvbSA9IGNsaXBfYm94LnRvcCArIChpbnQzMl90KWNlaWwoY2xpcF9ib3guSGVpZ2h0KCkgKiBzZCk7CisKICAgQ0ZYX01hdHJpeCBtdFBhdHRlcm4yRGV2aWNlID0gKnBQYXR0ZXJuLT5wYXR0ZXJuX3RvX2Zvcm0oKTsKICAgbXRQYXR0ZXJuMkRldmljZS5Db25jYXQoKnBPYmoyRGV2aWNlKTsKICAgR2V0U2NhbGVkTWF0cml4KG10UGF0dGVybjJEZXZpY2UpOwotICBib29sIGJBbGlnbmVkID0gZmFsc2U7Ci0gIGlmIChwUGF0dGVybi0+YmJveCgpLmxlZnQgPT0gMCAmJiBwUGF0dGVybi0+YmJveCgpLmJvdHRvbSA9PSAwICYmCisKKyAgYm9vbCBiQWxpZ25lZCA9CisgICAgICBwUGF0dGVybi0+YmJveCgpLmxlZnQgPT0gMCAmJiBwUGF0dGVybi0+YmJveCgpLmJvdHRvbSA9PSAwICYmCiAgICAgICBwUGF0dGVybi0+YmJveCgpLnJpZ2h0ID09IHBQYXR0ZXJuLT54X3N0ZXAoKSAmJgogICAgICAgcFBhdHRlcm4tPmJib3goKS50b3AgPT0gcFBhdHRlcm4tPnlfc3RlcCgpICYmCi0gICAgICAobXRQYXR0ZXJuMkRldmljZS5Jc1NjYWxlZCgpIHx8IG10UGF0dGVybjJEZXZpY2UuSXM5MFJvdGF0ZWQoKSkpIHsKLSAgICBiQWxpZ25lZCA9IHRydWU7CisgICAgICAobXRQYXR0ZXJuMkRldmljZS5Jc1NjYWxlZCgpIHx8IG10UGF0dGVybjJEZXZpY2UuSXM5MFJvdGF0ZWQoKSk7CisKKyAgQ0ZYX0Zsb2F0UmVjdCBjZWxsX2Jib3ggPSBtdFBhdHRlcm4yRGV2aWNlLlRyYW5zZm9ybVJlY3QocFBhdHRlcm4tPmJib3goKSk7CisKKyAgZmxvYXQgY2VpbF9oZWlnaHQgPSBzdGQ6OmNlaWwoY2VsbF9iYm94LkhlaWdodCgpKTsKKyAgZmxvYXQgY2VpbF93aWR0aCA9IHN0ZDo6Y2VpbChjZWxsX2Jib3guV2lkdGgoKSk7CisKKyAgLy8gVmFsaWRhdGUgdGhlIGZsb2F0IHdpbGwgZml0IGludG8gdGhlIGludCB3aGVuIHRoZSBjb252ZXJzaW9uIGlzIGRvbmUuCisgIGlmICghcGRmaXVtOjpiYXNlOjpJc1ZhbHVlSW5SYW5nZUZvck51bWVyaWNUeXBlPGludD4oY2VpbF9oZWlnaHQpIHx8CisgICAgICAhcGRmaXVtOjpiYXNlOjpJc1ZhbHVlSW5SYW5nZUZvck51bWVyaWNUeXBlPGludD4oY2VpbF93aWR0aCkpIHsKKyAgICByZXR1cm47CiAgIH0KLSAgQ0ZYX0Zsb2F0UmVjdCBjZWxsX2Jib3ggPSBwUGF0dGVybi0+YmJveCgpOwotICBtdFBhdHRlcm4yRGV2aWNlLlRyYW5zZm9ybVJlY3QoY2VsbF9iYm94KTsKLSAgaW50IHdpZHRoID0gKGludClGWFNZU19jZWlsKGNlbGxfYmJveC5XaWR0aCgpKTsKLSAgaW50IGhlaWdodCA9IChpbnQpRlhTWVNfY2VpbChjZWxsX2Jib3guSGVpZ2h0KCkpOwotICBpZiAod2lkdGggPT0gMCkgeworCisgIGludCB3aWR0aCA9IHN0YXRpY19jYXN0PGludD4oY2VpbF93aWR0aCk7CisgIGludCBoZWlnaHQgPSBzdGF0aWNfY2FzdDxpbnQ+KGNlaWxfaGVpZ2h0KTsKKyAgaWYgKHdpZHRoIDw9IDApCiAgICAgd2lkdGggPSAxOwotICB9Ci0gIGlmIChoZWlnaHQgPT0gMCkgeworICBpZiAoaGVpZ2h0IDw9IDApCiAgICAgaGVpZ2h0ID0gMTsKLSAgfQotICBpbnQgbWluX2NvbCwgbWF4X2NvbCwgbWluX3JvdywgbWF4X3JvdzsKLSAgQ0ZYX01hdHJpeCBtdERldmljZTJQYXR0ZXJuOwotICBtdERldmljZTJQYXR0ZXJuLlNldFJldmVyc2UobXRQYXR0ZXJuMkRldmljZSk7CiAKLSAgQ0ZYX0Zsb2F0UmVjdCBjbGlwX2JveF9wKGNsaXBfYm94KTsKLSAgbXREZXZpY2UyUGF0dGVybi5UcmFuc2Zvcm1SZWN0KGNsaXBfYm94X3ApOworICBDRlhfRmxvYXRSZWN0IGNsaXBfYm94X3AgPQorICAgICAgbXRQYXR0ZXJuMkRldmljZS5HZXRJbnZlcnNlKCkuVHJhbnNmb3JtUmVjdChDRlhfRmxvYXRSZWN0KGNsaXBfYm94KSk7CisgIGludCBtaW5fY29sID0gKGludCljZWlsKChjbGlwX2JveF9wLmxlZnQgLSBwUGF0dGVybi0+YmJveCgpLnJpZ2h0KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXR0ZXJuLT54X3N0ZXAoKSk7CisgIGludCBtYXhfY29sID0gKGludClmbG9vcigoY2xpcF9ib3hfcC5yaWdodCAtIHBQYXR0ZXJuLT5iYm94KCkubGVmdCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhdHRlcm4tPnhfc3RlcCgpKTsKKyAgaW50IG1pbl9yb3cgPSAoaW50KWNlaWwoKGNsaXBfYm94X3AuYm90dG9tIC0gcFBhdHRlcm4tPmJib3goKS50b3ApIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhdHRlcm4tPnlfc3RlcCgpKTsKKyAgaW50IG1heF9yb3cgPSAoaW50KWZsb29yKChjbGlwX2JveF9wLnRvcCAtIHBQYXR0ZXJuLT5iYm94KCkuYm90dG9tKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGF0dGVybi0+eV9zdGVwKCkpOwogCi0gIG1pbl9jb2wgPSAoaW50KUZYU1lTX2NlaWwoKGNsaXBfYm94X3AubGVmdCAtIHBQYXR0ZXJuLT5iYm94KCkucmlnaHQpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGF0dGVybi0+eF9zdGVwKCkpOwotICBtYXhfY29sID0gKGludClGWFNZU19mbG9vcigoY2xpcF9ib3hfcC5yaWdodCAtIHBQYXR0ZXJuLT5iYm94KCkubGVmdCkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGF0dGVybi0+eF9zdGVwKCkpOwotICBtaW5fcm93ID0gKGludClGWFNZU19jZWlsKChjbGlwX2JveF9wLmJvdHRvbSAtIHBQYXR0ZXJuLT5iYm94KCkudG9wKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhdHRlcm4tPnlfc3RlcCgpKTsKLSAgbWF4X3JvdyA9IChpbnQpRlhTWVNfZmxvb3IoKGNsaXBfYm94X3AudG9wIC0gcFBhdHRlcm4tPmJib3goKS5ib3R0b20pIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhdHRlcm4tPnlfc3RlcCgpKTsKKyAgLy8gTWFrZSBzdXJlIHdlIGNhbiBmaXQgdGhlIG5lZWRlZCB3aWR0aCAqIGhlaWdodCBpbnRvIGFuIGludC4KKyAgaWYgKGhlaWdodCA+IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkgLyB3aWR0aCkKKyAgICByZXR1cm47CiAKICAgaWYgKHdpZHRoID4gY2xpcF9ib3guV2lkdGgoKSB8fCBoZWlnaHQgPiBjbGlwX2JveC5IZWlnaHQoKSB8fAogICAgICAgd2lkdGggKiBoZWlnaHQgPiBjbGlwX2JveC5XaWR0aCgpICogY2xpcF9ib3guSGVpZ2h0KCkpIHsKLSAgICBDUERGX0dyYXBoaWNTdGF0ZXMqIHBTdGF0ZXMgPSBudWxscHRyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0dyYXBoaWNTdGF0ZXM+IHBTdGF0ZXM7CiAgICAgaWYgKCFwUGF0dGVybi0+Y29sb3JlZCgpKQogICAgICAgcFN0YXRlcyA9IENsb25lT2JqU3RhdGVzKHBQYWdlT2JqLCBiU3Ryb2tlKTsKIAotICAgIENQREZfRGljdGlvbmFyeSogcEZvcm1SZXNvdXJjZSA9IG51bGxwdHI7Ci0gICAgaWYgKHBQYXR0ZXJuLT5mb3JtKCktPm1fcEZvcm1EaWN0KQotICAgICAgcEZvcm1SZXNvdXJjZSA9IHBQYXR0ZXJuLT5mb3JtKCktPm1fcEZvcm1EaWN0LT5HZXREaWN0Rm9yKCJSZXNvdXJjZXMiKTsKLQotICAgIGZvciAoaW50IGNvbCA9IG1pbl9jb2w7IGNvbCA8PSBtYXhfY29sOyBjb2wrKykKKyAgICBhdXRvJiBwRm9ybURpY3QgPSBwUGF0dGVybi0+Zm9ybSgpLT5tX3BGb3JtRGljdDsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBGb3JtUmVzb3VyY2UgPQorICAgICAgICBwRm9ybURpY3QgPyBwRm9ybURpY3QtPkdldERpY3RGb3IoIlJlc291cmNlcyIpIDogbnVsbHB0cjsKKyAgICBmb3IgKGludCBjb2wgPSBtaW5fY29sOyBjb2wgPD0gbWF4X2NvbDsgY29sKyspIHsKICAgICAgIGZvciAoaW50IHJvdyA9IG1pbl9yb3c7IHJvdyA8PSBtYXhfcm93OyByb3crKykgewogICAgICAgICBDRlhfUG9pbnRGIG9yaWdpbmFsID0gbXRQYXR0ZXJuMkRldmljZS5UcmFuc2Zvcm0oCiAgICAgICAgICAgICBDRlhfUG9pbnRGKGNvbCAqIHBQYXR0ZXJuLT54X3N0ZXAoKSwgcm93ICogcFBhdHRlcm4tPnlfc3RlcCgpKSk7CiAgICAgICAgIENGWF9NYXRyaXggbWF0cml4ID0gKnBPYmoyRGV2aWNlOwogICAgICAgICBtYXRyaXguVHJhbnNsYXRlKG9yaWdpbmFsLnggLSBtdFBhdHRlcm4yRGV2aWNlLmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWwueSAtIG10UGF0dGVybjJEZXZpY2UuZik7Ci0gICAgICAgIG1fcERldmljZS0+U2F2ZVN0YXRlKCk7CisgICAgICAgIENGWF9SZW5kZXJEZXZpY2U6OlN0YXRlUmVzdG9yZXIgcmVzdG9yZXIyKG1fcERldmljZSk7CiAgICAgICAgIENQREZfUmVuZGVyU3RhdHVzIHN0YXR1czsKLSAgICAgICAgc3RhdHVzLkluaXRpYWxpemUobV9wQ29udGV4dCwgbV9wRGV2aWNlLCBudWxscHRyLCBudWxscHRyLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RhdGVzLCAmbV9PcHRpb25zLCBwUGF0dGVybi0+Zm9ybSgpLT5tX1RyYW5zcGFyZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbV9iRHJvcE9iamVjdHMsIHBGb3JtUmVzb3VyY2UpOworICAgICAgICBzdGF0dXMuSW5pdGlhbGl6ZShtX3BDb250ZXh0LkdldCgpLCBtX3BEZXZpY2UsIG51bGxwdHIsIG51bGxwdHIsIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGF0ZXMuZ2V0KCksICZtX09wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXR0ZXJuLT5mb3JtKCktPm1faVRyYW5zcGFyZW5jeSwgbV9iRHJvcE9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtUmVzb3VyY2UpOwogICAgICAgICBzdGF0dXMuUmVuZGVyT2JqZWN0TGlzdChwUGF0dGVybi0+Zm9ybSgpLCAmbWF0cml4KTsKLSAgICAgICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoZmFsc2UpOwogICAgICAgfQotICAgIG1fcERldmljZS0+UmVzdG9yZVN0YXRlKGZhbHNlKTsKLSAgICBkZWxldGUgcFN0YXRlczsKKyAgICB9CiAgICAgcmV0dXJuOwogICB9CiAgIGlmIChiQWxpZ25lZCkgewogICAgIGludCBvcmlnX3ggPSBGWFNZU19yb3VuZChtdFBhdHRlcm4yRGV2aWNlLmUpOwogICAgIGludCBvcmlnX3kgPSBGWFNZU19yb3VuZChtdFBhdHRlcm4yRGV2aWNlLmYpOwogICAgIG1pbl9jb2wgPSAoY2xpcF9ib3gubGVmdCAtIG9yaWdfeCkgLyB3aWR0aDsKLSAgICBpZiAoY2xpcF9ib3gubGVmdCA8IG9yaWdfeCkgeworICAgIGlmIChjbGlwX2JveC5sZWZ0IDwgb3JpZ194KQogICAgICAgbWluX2NvbC0tOwotICAgIH0KKwogICAgIG1heF9jb2wgPSAoY2xpcF9ib3gucmlnaHQgLSBvcmlnX3gpIC8gd2lkdGg7Ci0gICAgaWYgKGNsaXBfYm94LnJpZ2h0IDw9IG9yaWdfeCkgeworICAgIGlmIChjbGlwX2JveC5yaWdodCA8PSBvcmlnX3gpCiAgICAgICBtYXhfY29sLS07Ci0gICAgfQorCiAgICAgbWluX3JvdyA9IChjbGlwX2JveC50b3AgLSBvcmlnX3kpIC8gaGVpZ2h0OwotICAgIGlmIChjbGlwX2JveC50b3AgPCBvcmlnX3kpIHsKKyAgICBpZiAoY2xpcF9ib3gudG9wIDwgb3JpZ195KQogICAgICAgbWluX3Jvdy0tOwotICAgIH0KKwogICAgIG1heF9yb3cgPSAoY2xpcF9ib3guYm90dG9tIC0gb3JpZ195KSAvIGhlaWdodDsKLSAgICBpZiAoY2xpcF9ib3guYm90dG9tIDw9IG9yaWdfeSkgeworICAgIGlmIChjbGlwX2JveC5ib3R0b20gPD0gb3JpZ195KQogICAgICAgbWF4X3Jvdy0tOwotICAgIH0KICAgfQotICBGWF9GTE9BVCBsZWZ0X29mZnNldCA9IGNlbGxfYmJveC5sZWZ0IC0gbXRQYXR0ZXJuMkRldmljZS5lOwotICBGWF9GTE9BVCB0b3Bfb2Zmc2V0ID0gY2VsbF9iYm94LmJvdHRvbSAtIG10UGF0dGVybjJEZXZpY2UuZjsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gcFBhdHRlcm5CaXRtYXA7CisgIGZsb2F0IGxlZnRfb2Zmc2V0ID0gY2VsbF9iYm94LmxlZnQgLSBtdFBhdHRlcm4yRGV2aWNlLmU7CisgIGZsb2F0IHRvcF9vZmZzZXQgPSBjZWxsX2Jib3guYm90dG9tIC0gbXRQYXR0ZXJuMkRldmljZS5mOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwUGF0dGVybkJpdG1hcDsKICAgaWYgKHdpZHRoICogaGVpZ2h0IDwgMTYpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBwRW5sYXJnZWRCaXRtYXAgPQorICAgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBFbmxhcmdlZEJpdG1hcCA9CiAgICAgICAgIERyYXdQYXR0ZXJuQml0bWFwKG1fcENvbnRleHQtPkdldERvY3VtZW50KCksIG1fcENvbnRleHQtPkdldFBhZ2VDYWNoZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwUGF0dGVybiwgcE9iajJEZXZpY2UsIDgsIDgsIG1fT3B0aW9ucy5tX0ZsYWdzKTsKLSAgICBwUGF0dGVybkJpdG1hcCA9IHBFbmxhcmdlZEJpdG1hcC0+U3RyZXRjaFRvKHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICBwUGF0dGVybiwgcE9iajJEZXZpY2UsIDgsIDgsIG1fT3B0aW9ucy5HZXRGbGFncygpKTsKKyAgICBwUGF0dGVybkJpdG1hcCA9IHBFbmxhcmdlZEJpdG1hcC0+U3RyZXRjaFRvKHdpZHRoLCBoZWlnaHQsIDAsIG51bGxwdHIpOwogICB9IGVsc2UgewogICAgIHBQYXR0ZXJuQml0bWFwID0gRHJhd1BhdHRlcm5CaXRtYXAoCiAgICAgICAgIG1fcENvbnRleHQtPkdldERvY3VtZW50KCksIG1fcENvbnRleHQtPkdldFBhZ2VDYWNoZSgpLCBwUGF0dGVybiwKLSAgICAgICAgcE9iajJEZXZpY2UsIHdpZHRoLCBoZWlnaHQsIG1fT3B0aW9ucy5tX0ZsYWdzKTsKKyAgICAgICAgcE9iajJEZXZpY2UsIHdpZHRoLCBoZWlnaHQsIG1fT3B0aW9ucy5HZXRGbGFncygpKTsKICAgfQotICBpZiAoIXBQYXR0ZXJuQml0bWFwKSB7Ci0gICAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoZmFsc2UpOworICBpZiAoIXBQYXR0ZXJuQml0bWFwKQogICAgIHJldHVybjsKLSAgfQotICBpZiAobV9PcHRpb25zLm1fQ29sb3JNb2RlID09IFJFTkRFUl9DT0xPUl9HUkFZKSB7Ci0gICAgcFBhdHRlcm5CaXRtYXAtPkNvbnZlcnRDb2xvclNjYWxlKG1fT3B0aW9ucy5tX0ZvcmVDb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9PcHRpb25zLm1fQmFja0NvbG9yKTsKLSAgfQorCisgIGlmIChtX09wdGlvbnMuQ29sb3JNb2RlSXMoQ1BERl9SZW5kZXJPcHRpb25zOjprR3JheSkpCisgICAgcFBhdHRlcm5CaXRtYXAtPkNvbnZlcnRDb2xvclNjYWxlKDAsIDB4ZmZmZmZmKTsKKwogICBGWF9BUkdCIGZpbGxfYXJnYiA9IEdldEZpbGxBcmdiKHBQYWdlT2JqKTsKICAgaW50IGNsaXBfd2lkdGggPSBjbGlwX2JveC5yaWdodCAtIGNsaXBfYm94LmxlZnQ7CiAgIGludCBjbGlwX2hlaWdodCA9IGNsaXBfYm94LmJvdHRvbSAtIGNsaXBfYm94LnRvcDsKLSAgQ0ZYX0RJQml0bWFwIHNjcmVlbjsKLSAgaWYgKCFzY3JlZW4uQ3JlYXRlKGNsaXBfd2lkdGgsIGNsaXBfaGVpZ2h0LCBGWERJQl9BcmdiKSkgeworICBhdXRvIHBTY3JlZW4gPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOworICBpZiAoIXBTY3JlZW4tPkNyZWF0ZShjbGlwX3dpZHRoLCBjbGlwX2hlaWdodCwgRlhESUJfQXJnYikpCiAgICAgcmV0dXJuOwotICB9Ci0gIHNjcmVlbi5DbGVhcigwKTsKKworICBwU2NyZWVuLT5DbGVhcigwKTsKICAgdWludDMyX3QqIHNyY19idWYgPSAodWludDMyX3QqKXBQYXR0ZXJuQml0bWFwLT5HZXRCdWZmZXIoKTsKICAgZm9yIChpbnQgY29sID0gbWluX2NvbDsgY29sIDw9IG1heF9jb2w7IGNvbCsrKSB7CiAgICAgZm9yIChpbnQgcm93ID0gbWluX3Jvdzsgcm93IDw9IG1heF9yb3c7IHJvdysrKSB7CkBAIC0yMzM3LDcgKzIzNzcsNyBAQAogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIHVpbnQzMl90KiBkZXN0X2J1ZiA9Ci0gICAgICAgICAgICAodWludDMyX3QqKShzY3JlZW4uR2V0QnVmZmVyKCkgKyBzY3JlZW4uR2V0UGl0Y2goKSAqIHN0YXJ0X3kgKworICAgICAgICAgICAgKHVpbnQzMl90KikocFNjcmVlbi0+R2V0QnVmZmVyKCkgKyBwU2NyZWVuLT5HZXRQaXRjaCgpICogc3RhcnRfeSArCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF94ICogNCk7CiAgICAgICAgIGlmIChwUGF0dGVybi0+Y29sb3JlZCgpKQogICAgICAgICAgICpkZXN0X2J1ZiA9ICpzcmNfYnVmOwpAQCAtMjM0NSwxOCArMjM4NSwxNyBAQAogICAgICAgICAgICpkZXN0X2J1ZiA9ICgqKHVpbnQ4X3QqKXNyY19idWYgPDwgMjQpIHwgKGZpbGxfYXJnYiAmIDB4ZmZmZmZmKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChwUGF0dGVybi0+Y29sb3JlZCgpKSB7Ci0gICAgICAgICAgc2NyZWVuLkNvbXBvc2l0ZUJpdG1hcChzdGFydF94LCBzdGFydF95LCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhdHRlcm5CaXRtYXAuZ2V0KCksIDAsIDApOworICAgICAgICAgIHBTY3JlZW4tPkNvbXBvc2l0ZUJpdG1hcChzdGFydF94LCBzdGFydF95LCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGF0dGVybkJpdG1hcCwgMCwgMCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc2NyZWVuLkNvbXBvc2l0ZU1hc2soc3RhcnRfeCwgc3RhcnRfeSwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGF0dGVybkJpdG1hcC5nZXQoKSwgZmlsbF9hcmdiLCAwLCAwKTsKKyAgICAgICAgICBwU2NyZWVuLT5Db21wb3NpdGVNYXNrKHN0YXJ0X3gsIHN0YXJ0X3ksIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGF0dGVybkJpdG1hcCwgZmlsbF9hcmdiLCAwLCAwKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQotICBDb21wb3NpdGVESUJpdG1hcCgmc2NyZWVuLCBjbGlwX2JveC5sZWZ0LCBjbGlwX2JveC50b3AsIDAsIDI1NSwKKyAgQ29tcG9zaXRlRElCaXRtYXAocFNjcmVlbiwgY2xpcF9ib3gubGVmdCwgY2xpcF9ib3gudG9wLCAwLCAyNTUsCiAgICAgICAgICAgICAgICAgICAgIEZYRElCX0JMRU5EX05PUk1BTCwgZmFsc2UpOwotICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZShmYWxzZSk7CiB9CiAKIHZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkRyYXdQYXRoV2l0aFBhdHRlcm4oQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiwKQEAgLTI0MDEsMjQgKzI0NDAsMjUgQEAKICAgcmV0dXJuIHJlbmRlci5HZXRSZXN1bHQoKTsKIH0KIAotdm9pZCBDUERGX1JlbmRlclN0YXR1czo6Q29tcG9zaXRlRElCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIG1hc2tfYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBUcmFuc3BhcmVuY3kpIHsKLSAgaWYgKCFwRElCaXRtYXApIHsKK3ZvaWQgQ1BERl9SZW5kZXJTdGF0dXM6OkNvbXBvc2l0ZURJQml0bWFwKAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwRElCaXRtYXAsCisgICAgaW50IGxlZnQsCisgICAgaW50IHRvcCwKKyAgICBGWF9BUkdCIG1hc2tfYXJnYiwKKyAgICBpbnQgYml0bWFwX2FscGhhLAorICAgIGludCBibGVuZF9tb2RlLAorICAgIGludCBpVHJhbnNwYXJlbmN5KSB7CisgIGlmICghcERJQml0bWFwKQogICAgIHJldHVybjsKLSAgfQorCiAgIGlmIChibGVuZF9tb2RlID09IEZYRElCX0JMRU5EX05PUk1BTCkgewogICAgIGlmICghcERJQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7CiAgICAgICBpZiAoYml0bWFwX2FscGhhIDwgMjU1KSB7CiAjaWZkZWYgX1NLSUFfU1VQUE9SVF8KLSAgICAgICAgdm9pZCogZHVtbXk7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfSW1hZ2VSZW5kZXJlcj4gZHVtbXk7CiAgICAgICAgIENGWF9NYXRyaXggbShwRElCaXRtYXAtPkdldFdpZHRoKCksIDAsIDAsIC1wRElCaXRtYXAtPkdldEhlaWdodCgpLCBsZWZ0LAogICAgICAgICAgICAgICAgICAgICAgdG9wICsgcERJQml0bWFwLT5HZXRIZWlnaHQoKSk7Ci0gICAgICAgIG1fcERldmljZS0+U3RhcnRESUJpdHMocERJQml0bWFwLCBiaXRtYXBfYWxwaGEsIDAsICZtLCAwLCBkdW1teSk7CisgICAgICAgIG1fcERldmljZS0+U3RhcnRESUJpdHMocERJQml0bWFwLCBiaXRtYXBfYWxwaGEsIDAsICZtLCAwLCAmZHVtbXkpOwogICAgICAgICByZXR1cm47CiAjZWxzZQogICAgICAgICBwRElCaXRtYXAtPk11bHRpcGx5QWxwaGEoYml0bWFwX2FscGhhKTsKQEAgLTI0MzMsMTYgKzI0NzMsMTYgQEAKICAgICB9IGVsc2UgewogICAgICAgdWludDMyX3QgZmlsbF9hcmdiID0gbV9PcHRpb25zLlRyYW5zbGF0ZUNvbG9yKG1hc2tfYXJnYik7CiAgICAgICBpZiAoYml0bWFwX2FscGhhIDwgMjU1KSB7Ci0gICAgICAgICgodWludDhfdCopJmZpbGxfYXJnYilbM10gPQotICAgICAgICAgICAgKCh1aW50OF90KikmZmlsbF9hcmdiKVszXSAqIGJpdG1hcF9hbHBoYSAvIDI1NTsKKyAgICAgICAgdWludDhfdCogZmlsbF9hcmdiOCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZmaWxsX2FyZ2IpOworICAgICAgICBmaWxsX2FyZ2I4WzNdICo9IGJpdG1hcF9hbHBoYSAvIDI1NTsKICAgICAgIH0KICAgICAgIGlmIChtX3BEZXZpY2UtPlNldEJpdE1hc2socERJQml0bWFwLCBsZWZ0LCB0b3AsIGZpbGxfYXJnYikpIHsKICAgICAgICAgcmV0dXJuOwogICAgICAgfQogICAgIH0KICAgfQotICBib29sIGJJc29sYXRlZCA9ICEhKFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0lTT0xBVEVEKTsKLSAgYm9vbCBiR3JvdXAgPSAhIShUcmFuc3BhcmVuY3kgJiBQREZUUkFOU19HUk9VUCk7CisgIGJvb2wgYklzb2xhdGVkID0gISEoaVRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0lTT0xBVEVEKTsKKyAgYm9vbCBiR3JvdXAgPSAhIShpVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfR1JPVVApOwogICBib29sIGJCYWNrQWxwaGFSZXF1aXJlZCA9IGJsZW5kX21vZGUgJiYgYklzb2xhdGVkICYmICFtX2JEcm9wT2JqZWN0czsKICAgYm9vbCBiR2V0QmFja0dyb3VuZCA9CiAgICAgICAoKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19BTFBIQV9PVVRQVVQpKSB8fApAQCAtMjQ1MCw3MiArMjQ5MCw3NiBAQAogICAgICAgIChtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfR0VUX0JJVFMpICYmICFiQmFja0FscGhhUmVxdWlyZWQpOwogICBpZiAoYkdldEJhY2tHcm91bmQpIHsKICAgICBpZiAoYklzb2xhdGVkIHx8ICFiR3JvdXApIHsKLSAgICAgIGlmIChwRElCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKKyAgICAgIGlmICghcERJQml0bWFwLT5Jc0FscGhhTWFzaygpKQorICAgICAgICBtX3BEZXZpY2UtPlNldERJQml0c1dpdGhCbGVuZChwRElCaXRtYXAsIGxlZnQsIHRvcCwgYmxlbmRfbW9kZSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgRlhfUkVDVCByZWN0KGxlZnQsIHRvcCwgbGVmdCArIHBESUJpdG1hcC0+R2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgdG9wICsgcERJQml0bWFwLT5HZXRIZWlnaHQoKSk7CisgICAgcmVjdC5JbnRlcnNlY3QobV9wRGV2aWNlLT5HZXRDbGlwQm94KCkpOworICAgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBDbG9uZTsKKyAgICBpZiAobV9wRGV2aWNlLT5HZXRCYWNrRHJvcCgpICYmIG1fcERldmljZS0+R2V0Qml0bWFwKCkpIHsKKyAgICAgIHBDbG9uZSA9IG1fcERldmljZS0+R2V0QmFja0Ryb3AoKS0+Q2xvbmUoJnJlY3QpOworICAgICAgaWYgKCFwQ2xvbmUpCiAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIG1fcERldmljZS0+U2V0RElCaXRzV2l0aEJsZW5kKHBESUJpdG1hcCwgbGVmdCwgdG9wLCBibGVuZF9tb2RlKTsKLSAgICB9IGVsc2UgewotICAgICAgRlhfUkVDVCByZWN0KGxlZnQsIHRvcCwgbGVmdCArIHBESUJpdG1hcC0+R2V0V2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICB0b3AgKyBwRElCaXRtYXAtPkdldEhlaWdodCgpKTsKLSAgICAgIHJlY3QuSW50ZXJzZWN0KG1fcERldmljZS0+R2V0Q2xpcEJveCgpKTsKLSAgICAgIENGWF9NYXliZU93bmVkPENGWF9ESUJpdG1hcD4gcENsb25lOwotICAgICAgaWYgKG1fcERldmljZS0+R2V0QmFja0Ryb3AoKSAmJiBtX3BEZXZpY2UtPkdldEJpdG1hcCgpKSB7Ci0gICAgICAgIHBDbG9uZSA9IG1fcERldmljZS0+R2V0QmFja0Ryb3AoKS0+Q2xvbmUoJnJlY3QpOwotICAgICAgICBDRlhfRElCaXRtYXAqIHBGb3JlQml0bWFwID0gbV9wRGV2aWNlLT5HZXRCaXRtYXAoKTsKKworICAgICAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcEZvcmVCaXRtYXAgPSBtX3BEZXZpY2UtPkdldEJpdG1hcCgpOworICAgICAgcENsb25lLT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgcENsb25lLT5HZXRXaWR0aCgpLCBwQ2xvbmUtPkdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcmVCaXRtYXAsIHJlY3QubGVmdCwgcmVjdC50b3ApOworICAgICAgbGVmdCA9IHN0ZDo6bWluKGxlZnQsIDApOworICAgICAgdG9wID0gc3RkOjptaW4odG9wLCAwKTsKKyAgICAgIGlmIChwRElCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKKyAgICAgICAgcENsb25lLT5Db21wb3NpdGVNYXNrKDAsIDAsIHBDbG9uZS0+R2V0V2lkdGgoKSwgcENsb25lLT5HZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBESUJpdG1hcCwgbWFza19hcmdiLCBsZWZ0LCB0b3AsIGJsZW5kX21vZGUpOworICAgICAgfSBlbHNlIHsKICAgICAgICAgcENsb25lLT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgcENsb25lLT5HZXRXaWR0aCgpLCBwQ2xvbmUtPkdldEhlaWdodCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9yZUJpdG1hcCwgcmVjdC5sZWZ0LCByZWN0LnRvcCk7Ci0gICAgICAgIGxlZnQgPSBsZWZ0ID49IDAgPyAwIDogbGVmdDsKLSAgICAgICAgdG9wID0gdG9wID49IDAgPyAwIDogdG9wOwotICAgICAgICBpZiAoIXBESUJpdG1hcC0+SXNBbHBoYU1hc2soKSkKLSAgICAgICAgICBwQ2xvbmUtPkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCBwQ2xvbmUtPkdldFdpZHRoKCksIHBDbG9uZS0+R2V0SGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERJQml0bWFwLCBsZWZ0LCB0b3AsIGJsZW5kX21vZGUpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcENsb25lLT5Db21wb3NpdGVNYXNrKDAsIDAsIHBDbG9uZS0+R2V0V2lkdGgoKSwgcENsb25lLT5HZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERJQml0bWFwLCBtYXNrX2FyZ2IsIGxlZnQsIHRvcCwgYmxlbmRfbW9kZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwQ2xvbmUgPSBwRElCaXRtYXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBESUJpdG1hcCwgbGVmdCwgdG9wLCBibGVuZF9tb2RlKTsKICAgICAgIH0KLSAgICAgIGlmIChtX3BEZXZpY2UtPkdldEJhY2tEcm9wKCkpIHsKLSAgICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHMocENsb25lLkdldCgpLCByZWN0LmxlZnQsIHJlY3QudG9wKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwRElCaXRtYXAtPklzQWxwaGFNYXNrKCkpCi0gICAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICBwQ2xvbmUgPSBwRElCaXRtYXA7CisgICAgfQorICAgIGlmIChtX3BEZXZpY2UtPkdldEJhY2tEcm9wKCkpIHsKKyAgICAgIG1fcERldmljZS0+U2V0RElCaXRzKHBDbG9uZSwgcmVjdC5sZWZ0LCByZWN0LnRvcCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghcERJQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7CiAgICAgICAgIG1fcERldmljZS0+U2V0RElCaXRzV2l0aEJsZW5kKHBESUJpdG1hcCwgcmVjdC5sZWZ0LCByZWN0LnRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRfbW9kZSk7CiAgICAgICB9CiAgICAgfQogICAgIHJldHVybjsKICAgfQotICBpbnQgYmFja19sZWZ0LCBiYWNrX3RvcDsKKyAgaW50IGJhY2tfbGVmdDsKKyAgaW50IGJhY2tfdG9wOwogICBGWF9SRUNUIHJlY3QobGVmdCwgdG9wLCBsZWZ0ICsgcERJQml0bWFwLT5HZXRXaWR0aCgpLAogICAgICAgICAgICAgICAgdG9wICsgcERJQml0bWFwLT5HZXRIZWlnaHQoKSk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IHBCYWNrZHJvcCA9Ci0gICAgICBHZXRCYWNrZHJvcChtX3BDdXJPYmosIHJlY3QsIGJhY2tfbGVmdCwgYmFja190b3AsCi0gICAgICAgICAgICAgICAgICBibGVuZF9tb2RlID4gRlhESUJfQkxFTkRfTk9STUFMICYmIGJJc29sYXRlZCk7CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBCYWNrZHJvcCA9CisgICAgICBHZXRCYWNrZHJvcChtX3BDdXJPYmosIHJlY3QsIGJsZW5kX21vZGUgPiBGWERJQl9CTEVORF9OT1JNQUwgJiYgYklzb2xhdGVkLAorICAgICAgICAgICAgICAgICAgJmJhY2tfbGVmdCwgJmJhY2tfdG9wKTsKICAgaWYgKCFwQmFja2Ryb3ApCiAgICAgcmV0dXJuOwogCi0gIGlmICghcERJQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgcEJhY2tkcm9wLT5Db21wb3NpdGVCaXRtYXAobGVmdCAtIGJhY2tfbGVmdCwgdG9wIC0gYmFja190b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERJQml0bWFwLT5HZXRXaWR0aCgpLCBwRElCaXRtYXAtPkdldEhlaWdodCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBESUJpdG1hcCwgMCwgMCwgYmxlbmRfbW9kZSk7Ci0gIH0gZWxzZSB7CisgIGlmIChwRElCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKICAgICBwQmFja2Ryb3AtPkNvbXBvc2l0ZU1hc2sobGVmdCAtIGJhY2tfbGVmdCwgdG9wIC0gYmFja190b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBESUJpdG1hcC0+R2V0V2lkdGgoKSwgcERJQml0bWFwLT5HZXRIZWlnaHQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERJQml0bWFwLCBtYXNrX2FyZ2IsIDAsIDAsIGJsZW5kX21vZGUpOworICB9IGVsc2UgeworICAgIHBCYWNrZHJvcC0+Q29tcG9zaXRlQml0bWFwKGxlZnQgLSBiYWNrX2xlZnQsIHRvcCAtIGJhY2tfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBESUJpdG1hcC0+R2V0V2lkdGgoKSwgcERJQml0bWFwLT5HZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRElCaXRtYXAsIDAsIDAsIGJsZW5kX21vZGUpOwogICB9CiAKLSAgYXV0byBwQmFja2Ryb3AxID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9ESUJpdG1hcD4oKTsKKyAgYXV0byBwQmFja2Ryb3AxID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKTsKICAgcEJhY2tkcm9wMS0+Q3JlYXRlKHBCYWNrZHJvcC0+R2V0V2lkdGgoKSwgcEJhY2tkcm9wLT5HZXRIZWlnaHQoKSwKICAgICAgICAgICAgICAgICAgICAgIEZYRElCX1JnYjMyKTsKICAgcEJhY2tkcm9wMS0+Q2xlYXIoKHVpbnQzMl90KS0xKTsKICAgcEJhY2tkcm9wMS0+Q29tcG9zaXRlQml0bWFwKDAsIDAsIHBCYWNrZHJvcC0+R2V0V2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCYWNrZHJvcC0+R2V0SGVpZ2h0KCksIHBCYWNrZHJvcC5nZXQoKSwgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQmFja2Ryb3AtPkdldEhlaWdodCgpLCBwQmFja2Ryb3AsIDAsIDApOwogICBwQmFja2Ryb3AgPSBzdGQ6Om1vdmUocEJhY2tkcm9wMSk7Ci0gIG1fcERldmljZS0+U2V0RElCaXRzKHBCYWNrZHJvcC5nZXQoKSwgYmFja19sZWZ0LCBiYWNrX3RvcCk7CisgIG1fcERldmljZS0+U2V0RElCaXRzKHBCYWNrZHJvcCwgYmFja19sZWZ0LCBiYWNrX3RvcCk7CiB9CiAKLXN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IENQREZfUmVuZGVyU3RhdHVzOjpMb2FkU01hc2soCitSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBDUERGX1JlbmRlclN0YXR1czo6TG9hZFNNYXNrKAogICAgIENQREZfRGljdGlvbmFyeSogcFNNYXNrRGljdCwKICAgICBGWF9SRUNUKiBwQ2xpcFJlY3QsCiAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewpAQCAtMjUzNiwxNCArMjU4MCwxNCBAQAogCiAgIENQREZfRm9ybSBmb3JtKG1fcENvbnRleHQtPkdldERvY3VtZW50KCksIG1fcENvbnRleHQtPkdldFBhZ2VSZXNvdXJjZXMoKSwKICAgICAgICAgICAgICAgICAgcEdyb3VwKTsKLSAgZm9ybS5QYXJzZUNvbnRlbnQobnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cik7CisgIGZvcm0uUGFyc2VDb250ZW50KCk7CiAKLSAgQ0ZYX0Z4Z2VEZXZpY2UgYml0bWFwX2RldmljZTsKKyAgQ0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2UgYml0bWFwX2RldmljZTsKICAgYm9vbCBiTHVtaW5vc2l0eSA9IHBTTWFza0RpY3QtPkdldFN0cmluZ0ZvcigiUyIpICE9ICJBbHBoYSI7CiAgIGludCB3aWR0aCA9IHBDbGlwUmVjdC0+cmlnaHQgLSBwQ2xpcFJlY3QtPmxlZnQ7CiAgIGludCBoZWlnaHQgPSBwQ2xpcFJlY3QtPmJvdHRvbSAtIHBDbGlwUmVjdC0+dG9wOwogICBGWERJQl9Gb3JtYXQgZm9ybWF0OwotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfIHx8IGRlZmluZWQgX1NLSUFfU1VQUE9SVF8gfHwgXAorI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXyB8fCBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfIHx8IFwKICAgICBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfUEFUSFNfCiAgIGZvcm1hdCA9IGJMdW1pbm9zaXR5ID8gRlhESUJfUmdiMzIgOiBGWERJQl84YnBwTWFzazsKICNlbHNlCkBAIC0yNTY5LDI0ICsyNjEzLDI0IEBACiAgICAgICAgIC8vIFN0b3JlIENvbG9yIFNwYWNlIEZhbWlseSB0byB1c2UgaW4gQ1BERl9SZW5kZXJTdGF0dXM6OkluaXRpYWxpemUuCiAgICAgICAgIGNvbG9yX3NwYWNlX2ZhbWlseSA9IHBDUy0+R2V0RmFtaWx5KCk7CiAKLSAgICAgICAgRlhfRkxPQVQgUiwgRywgQjsKKyAgICAgICAgZmxvYXQgUiwgRywgQjsKICAgICAgICAgdWludDMyX3QgY29tcHMgPSA4OwogICAgICAgICBpZiAocENTLT5Db3VudENvbXBvbmVudHMoKSA+IGNvbXBzKSB7CiAgICAgICAgICAgY29tcHMgPSBwQ1MtPkNvdW50Q29tcG9uZW50cygpOwogICAgICAgICB9Ci0gICAgICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDg+IGZsb2F0X2FycmF5KGNvbXBzKTsKLSAgICAgICAgRlhfRkxPQVQqIHBGbG9hdHMgPSBmbG9hdF9hcnJheTsKKyAgICAgICAgQ0ZYX0ZpeGVkQnVmR3JvdzxmbG9hdCwgOD4gZmxvYXRfYXJyYXkoY29tcHMpOworICAgICAgICBmbG9hdCogcEZsb2F0cyA9IGZsb2F0X2FycmF5OwogICAgICAgICBGWF9TQUZFX1VJTlQzMiBudW1fZmxvYXRzID0gY29tcHM7Ci0gICAgICAgIG51bV9mbG9hdHMgKj0gc2l6ZW9mKEZYX0ZMT0FUKTsKKyAgICAgICAgbnVtX2Zsb2F0cyAqPSBzaXplb2YoZmxvYXQpOwogICAgICAgICBpZiAoIW51bV9mbG9hdHMuSXNWYWxpZCgpKSB7CiAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgICAgIH0KLSAgICAgICAgRlhTWVNfbWVtc2V0KHBGbG9hdHMsIDAsIG51bV9mbG9hdHMuVmFsdWVPckRpZSgpKTsKKyAgICAgICAgbWVtc2V0KHBGbG9hdHMsIDAsIG51bV9mbG9hdHMuVmFsdWVPckRpZSgpKTsKICAgICAgICAgc2l6ZV90IGNvdW50ID0gcEJDLT5HZXRDb3VudCgpID4gOCA/IDggOiBwQkMtPkdldENvdW50KCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgIHBGbG9hdHNbaV0gPSBwQkMtPkdldE51bWJlckF0KGkpOwogICAgICAgICB9Ci0gICAgICAgIHBDUy0+R2V0UkdCKHBGbG9hdHMsIFIsIEcsIEIpOworICAgICAgICBwQ1MtPkdldFJHQihwRmxvYXRzLCAmUiwgJkcsICZCKTsKICAgICAgICAgYmFja19jb2xvciA9IDB4ZmYwMDAwMDAgfCAoKGludDMyX3QpKFIgKiAyNTUpIDw8IDE2KSB8CiAgICAgICAgICAgICAgICAgICAgICAoKGludDMyX3QpKEcgKiAyNTUpIDw8IDgpIHwgKGludDMyX3QpKEIgKiAyNTUpOwogICAgICAgICBtX3BDb250ZXh0LT5HZXREb2N1bWVudCgpLT5HZXRQYWdlRGF0YSgpLT5SZWxlYXNlQ29sb3JTcGFjZShwQ1NPYmopOwpAQCAtMjYwMSwxNCArMjY0NSwxNSBAQAogICAgIHBGb3JtUmVzb3VyY2UgPSBmb3JtLm1fcEZvcm1EaWN0LT5HZXREaWN0Rm9yKCJSZXNvdXJjZXMiKTsKICAgfQogICBDUERGX1JlbmRlck9wdGlvbnMgb3B0aW9uczsKLSAgb3B0aW9ucy5tX0NvbG9yTW9kZSA9IGJMdW1pbm9zaXR5ID8gUkVOREVSX0NPTE9SX05PUk1BTCA6IFJFTkRFUl9DT0xPUl9BTFBIQTsKKyAgb3B0aW9ucy5TZXRDb2xvck1vZGUoYkx1bWlub3NpdHkgPyBDUERGX1JlbmRlck9wdGlvbnM6OmtOb3JtYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDUERGX1JlbmRlck9wdGlvbnM6OmtBbHBoYSk7CiAgIENQREZfUmVuZGVyU3RhdHVzIHN0YXR1czsKLSAgc3RhdHVzLkluaXRpYWxpemUobV9wQ29udGV4dCwgJmJpdG1hcF9kZXZpY2UsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsCisgIHN0YXR1cy5Jbml0aWFsaXplKG1fcENvbnRleHQuR2V0KCksICZiaXRtYXBfZGV2aWNlLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLAogICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAmb3B0aW9ucywgMCwgbV9iRHJvcE9iamVjdHMsIHBGb3JtUmVzb3VyY2UsIHRydWUsCiAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIDAsIGNvbG9yX3NwYWNlX2ZhbWlseSwgYkx1bWlub3NpdHkpOwogICBzdGF0dXMuUmVuZGVyT2JqZWN0TGlzdCgmZm9ybSwgJm1hdHJpeCk7CiAKLSAgYXV0byBwTWFzayA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfRElCaXRtYXA+KCk7CisgIGF1dG8gcE1hc2sgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOwogICBpZiAoIXBNYXNrLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfOGJwcE1hc2spKQogICAgIHJldHVybiBudWxscHRyOwogCkBAIC0yNjE4LDExICsyNjYzLDExIEBACiAgIGludCBzcmNfcGl0Y2ggPSBiaXRtYXAuR2V0UGl0Y2goKTsKICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdHJhbnNmZXJzKDI1Nik7CiAgIGlmIChwRnVuYykgewotICAgIENGWF9GaXhlZEJ1Zkdyb3c8RlhfRkxPQVQsIDE2PiByZXN1bHRzKHBGdW5jLT5Db3VudE91dHB1dHMoKSk7CisgICAgQ0ZYX0ZpeGVkQnVmR3JvdzxmbG9hdCwgMTY+IHJlc3VsdHMocEZ1bmMtPkNvdW50T3V0cHV0cygpKTsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0gICAgICBGWF9GTE9BVCBpbnB1dCA9IChGWF9GTE9BVClpIC8gMjU1LjBmOworICAgICAgZmxvYXQgaW5wdXQgPSAoZmxvYXQpaSAvIDI1NS4wZjsKICAgICAgIGludCBucmVzdWx0OwotICAgICAgcEZ1bmMtPkNhbGwoJmlucHV0LCAxLCByZXN1bHRzLCBucmVzdWx0KTsKKyAgICAgIHBGdW5jLT5DYWxsKCZpbnB1dCwgMSwgcmVzdWx0cywgJm5yZXN1bHQpOwogICAgICAgdHJhbnNmZXJzW2ldID0gRlhTWVNfcm91bmQocmVzdWx0c1swXSAqIDI1NSk7CiAgICAgfQogICB9IGVsc2UgewpAQCAtMjY0Niw3ICsyNjkxLDcgQEAKICAgICAgIGRlc3RfYnVmW2ldID0gdHJhbnNmZXJzW3NyY19idWZbaV1dOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICBGWFNZU19tZW1jcHkoZGVzdF9idWYsIHNyY19idWYsIGRlc3RfcGl0Y2ggKiBoZWlnaHQpOworICAgIG1lbWNweShkZXN0X2J1Ziwgc3JjX2J1ZiwgZGVzdF9waXRjaCAqIGhlaWdodCk7CiAgIH0KICAgcmV0dXJuIHBNYXNrOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3JlbmRlcnN0YXR1cy5oIGIvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3JlbmRlcnN0YXR1cy5oCmluZGV4IDI1ZGRmYjAuLmM4YjdiMDkgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9yZW5kZXJzdGF0dXMuaAorKysgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcmVuZGVyc3RhdHVzLmgKQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NsaXBwYXRoLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9ncmFwaGljc3RhdGVzLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3JlbmRlcm9wdGlvbnMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaCIKIAogY2xhc3MgQ0ZYX1BhdGhEYXRhOwpAQCAtNjAsMjMgKzYxLDQ0IEBACiAgIHZvaWQgUmVuZGVyU2luZ2xlT2JqZWN0KENQREZfUGFnZU9iamVjdCogcE9iaiwgY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UpOwogICBib29sIENvbnRpbnVlU2luZ2xlT2JqZWN0KENQREZfUGFnZU9iamVjdCogcE9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gIENQREZfUmVuZGVyQ29udGV4dCogR2V0Q29udGV4dCgpIHsgcmV0dXJuIG1fcENvbnRleHQ7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CisgIHZvaWQgUHJvY2Vzc0NsaXBQYXRoKGNvbnN0IENQREZfQ2xpcFBhdGgmIENsaXBQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSk7CisKKyAgdWludDMyX3QgR2V0R3JvdXBGYW1pbHkoKSBjb25zdCB7IHJldHVybiBtX0dyb3VwRmFtaWx5OyB9CisgIGJvb2wgR2V0TG9hZE1hc2soKSBjb25zdCB7IHJldHVybiBtX2JMb2FkTWFzazsgfQorICBib29sIEdldERyb3BPYmplY3RzKCkgY29uc3QgeyByZXR1cm4gbV9iRHJvcE9iamVjdHM7IH0KKyAgYm9vbCBJc1ByaW50KCkgY29uc3QgeyByZXR1cm4gbV9iUHJpbnQ7IH0KKyAgYm9vbCBJc1N0b3BwZWQoKSBjb25zdCB7IHJldHVybiBtX2JTdG9wcGVkOyB9CisgIENQREZfUmVuZGVyQ29udGV4dCogR2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fcENvbnRleHQuR2V0KCk7IH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRGb3JtUmVzb3VyY2UoKSBjb25zdCB7IHJldHVybiBtX3BGb3JtUmVzb3VyY2UuR2V0KCk7IH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRQYWdlUmVzb3VyY2UoKSBjb25zdCB7IHJldHVybiBtX3BQYWdlUmVzb3VyY2UuR2V0KCk7IH0KKyAgQ0ZYX1JlbmRlckRldmljZSogR2V0UmVuZGVyRGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbV9wRGV2aWNlOyB9CisgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogR2V0UmVuZGVyT3B0aW9ucygpIGNvbnN0IHsgcmV0dXJuICZtX09wdGlvbnM7IH0KIAogI2lmIGRlZmluZWQgX1NLSUFfU1VQUE9SVF8KICAgdm9pZCBEZWJ1Z1ZlcmlmeURldmljZUlzUHJlTXVsdGlwbGllZCgpIGNvbnN0OwogI2VuZGlmCiAKLSAgQ1BERl9SZW5kZXJPcHRpb25zIG1fT3B0aW9uczsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BGb3JtUmVzb3VyY2U7Ci0gIENQREZfRGljdGlvbmFyeSogbV9wUGFnZVJlc291cmNlOwotICBzdGQ6OnZlY3RvcjxDUERGX1R5cGUzRm9udCo+IG1fVHlwZTNGb250Q2FjaGU7CisgIFJldGFpblB0cjxDUERGX1RyYW5zZmVyRnVuYz4gR2V0VHJhbnNmZXJGdW5jKENQREZfT2JqZWN0KiBwT2JqZWN0KSBjb25zdDsKKyAgRlhfQVJHQiBHZXRGaWxsQXJnYihDUERGX1BhZ2VPYmplY3QqIHBPYmosIGJvb2wgYlR5cGUzID0gZmFsc2UpIGNvbnN0OworICB2b2lkIERyYXdUaWxpbmdQYXR0ZXJuKENQREZfVGlsaW5nUGF0dGVybiogcFBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTdHJva2UpOworICB2b2lkIERyYXdTaGFkaW5nUGF0dGVybihDUERGX1NoYWRpbmdQYXR0ZXJuKiBwUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0cm9rZSk7CisgIHZvaWQgQ29tcG9zaXRlRElCaXRtYXAoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBESUJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgbWFza19hcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlUcmFuc3BhcmVuY3kpOwogCiAgcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIENQREZfSW1hZ2VSZW5kZXJlcjsKLSAgZnJpZW5kIGNsYXNzIENQREZfUmVuZGVyQ29udGV4dDsKLQotICB2b2lkIFByb2Nlc3NDbGlwUGF0aChDUERGX0NsaXBQYXRoIENsaXBQYXRoLCBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSk7CiAgIGJvb2wgUHJvY2Vzc1RyYW5zcGFyZW5jeShDUERGX1BhZ2VPYmplY3QqIFBhZ2VPYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSk7CiAgIHZvaWQgUHJvY2Vzc09iamVjdE5vQ2xpcChDUERGX1BhZ2VPYmplY3QqIFBhZ2VPYmosCkBAIC05MywyOCArMTE1LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfQ29sb3IqIHBDb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0cm9rZSk7Ci0gIHZvaWQgRHJhd1RpbGluZ1BhdHRlcm4oQ1BERl9UaWxpbmdQYXR0ZXJuKiBwUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0cm9rZSk7Ci0gIHZvaWQgRHJhd1NoYWRpbmdQYXR0ZXJuKENQREZfU2hhZGluZ1BhdHRlcm4qIHBQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3Ryb2tlKTsKICAgYm9vbCBTZWxlY3RDbGlwUGF0aChjb25zdCBDUERGX1BhdGhPYmplY3QqIHBQYXRoT2JqLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0cm9rZSk7CiAgIGJvb2wgUHJvY2Vzc0ltYWdlKENQREZfSW1hZ2VPYmplY3QqIHBJbWFnZU9iaiwgY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UpOwotICB2b2lkIENvbXBvc2l0ZURJQml0bWFwKENGWF9ESUJpdG1hcCogcERJQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBtYXNrX2FyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYklzb2xhdGVkKTsKICAgdm9pZCBQcm9jZXNzU2hhZGluZyhjb25zdCBDUERGX1NoYWRpbmdPYmplY3QqIHBTaGFkaW5nT2JqLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmoyRGV2aWNlKTsKLSAgdm9pZCBEcmF3U2hhZGluZyhDUERGX1NoYWRpbmdQYXR0ZXJuKiBwUGF0dGVybiwKKyAgdm9pZCBEcmF3U2hhZGluZyhjb25zdCBDUERGX1NoYWRpbmdQYXR0ZXJuKiBwUGF0dGVybiwKICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAogICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QmIGNsaXBfcmVjdCwKICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEsCkBAIC0xMjcsMjUgKzEzNCwyNCBAQAogICB2b2lkIERyYXdUZXh0UGF0aFdpdGhQYXR0ZXJuKGNvbnN0IENQREZfVGV4dE9iamVjdCogdGV4dG9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFRleHRNYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmlsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTdHJva2UpOwogICBib29sIFByb2Nlc3NGb3JtKGNvbnN0IENQREZfRm9ybU9iamVjdCogcEZvcm1PYmosCiAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iajJEZXZpY2UpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBHZXRCYWNrZHJvcChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QmIHJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkJhY2tBbHBoYVJlcXVpcmVkKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gTG9hZFNNYXNrKENQREZfRGljdGlvbmFyeSogcFNNYXNrRGljdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QqIHBDbGlwUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOwotICBzdGF0aWMgQ1BERl9UeXBlM0NhY2hlKiBHZXRDYWNoZWRUeXBlMyhDUERGX1R5cGUzRm9udCogcEZvbnQpOwotICBzdGF0aWMgQ1BERl9HcmFwaGljU3RhdGVzKiBDbG9uZU9ialN0YXRlcyhjb25zdCBDUERGX0dyYXBoaWNTdGF0ZXMqIHBQYXRoT2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTdHJva2UpOwotICBDUERGX1RyYW5zZmVyRnVuYyogR2V0VHJhbnNmZXJGdW5jKENQREZfT2JqZWN0KiBwT2JqZWN0KSBjb25zdDsKLSAgRlhfQVJHQiBHZXRGaWxsQXJnYihDUERGX1BhZ2VPYmplY3QqIHBPYmosIGJvb2wgYlR5cGUzID0gZmFsc2UpIGNvbnN0OworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBHZXRCYWNrZHJvcChjb25zdCBDUERGX1BhZ2VPYmplY3QqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkJhY2tBbHBoYVJlcXVpcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogdG9wKTsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gTG9hZFNNYXNrKENQREZfRGljdGlvbmFyeSogcFNNYXNrRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOworICBzdGF0aWMgUmV0YWluUHRyPENQREZfVHlwZTNDYWNoZT4gR2V0Q2FjaGVkVHlwZTMoQ1BERl9UeXBlM0ZvbnQqIHBGb250KTsKKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0dyYXBoaWNTdGF0ZXM+IENsb25lT2JqU3RhdGVzKAorICAgICAgY29uc3QgQ1BERl9HcmFwaGljU3RhdGVzKiBwUGF0aE9iaiwKKyAgICAgIGJvb2wgYlN0cm9rZSk7CiAgIEZYX0FSR0IgR2V0U3Ryb2tlQXJnYihDUERGX1BhZ2VPYmplY3QqIHBPYmopIGNvbnN0OwogICBib29sIEdldE9iamVjdENsaXBwZWRSZWN0KGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqMkRldmljZSwKQEAgLTE1Niw3ICsxNjIsMTEgQEAKICAgc3RhdGljIGNvbnN0IGludCBrUmVuZGVyTWF4UmVjdXJzaW9uRGVwdGggPSA2NDsKICAgc3RhdGljIGludCBzX0N1cnJlbnRSZWN1cnNpb25EZXB0aDsKIAotICBDUERGX1JlbmRlckNvbnRleHQqIG1fcENvbnRleHQ7CisgIENQREZfUmVuZGVyT3B0aW9ucyBtX09wdGlvbnM7CisgIFVub3duZWRQdHI8Q1BERl9EaWN0aW9uYXJ5PiBtX3BGb3JtUmVzb3VyY2U7CisgIFVub3duZWRQdHI8Q1BERl9EaWN0aW9uYXJ5PiBtX3BQYWdlUmVzb3VyY2U7CisgIHN0ZDo6dmVjdG9yPENQREZfVHlwZTNGb250Kj4gbV9UeXBlM0ZvbnRDYWNoZTsKKyAgVW5vd25lZFB0cjxDUERGX1JlbmRlckNvbnRleHQ+IG1fcENvbnRleHQ7CiAgIGJvb2wgbV9iU3RvcHBlZDsKICAgQ0ZYX1JlbmRlckRldmljZSogbV9wRGV2aWNlOwogICBDRlhfTWF0cml4IG1fRGV2aWNlTWF0cml4OwpAQCAtMTY2LDEyICsxNzYsMTIgQEAKICAgQ1BERl9HcmFwaGljU3RhdGVzIG1fSW5pdGlhbFN0YXRlczsKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfSW1hZ2VSZW5kZXJlcj4gbV9wSW1hZ2VSZW5kZXJlcjsKICAgYm9vbCBtX2JQcmludDsKLSAgaW50IG1fVHJhbnNwYXJlbmN5OworICBpbnQgbV9pVHJhbnNwYXJlbmN5OwogICBib29sIG1fYkRyb3BPYmplY3RzOwogICBib29sIG1fYlN0ZENTOwogICB1aW50MzJfdCBtX0dyb3VwRmFtaWx5OwogICBib29sIG1fYkxvYWRNYXNrOwotICBDUERGX1R5cGUzQ2hhciogbV9wVHlwZTNDaGFyOworICBVbm93bmVkUHRyPENQREZfVHlwZTNDaGFyPiBtX3BUeXBlM0NoYXI7CiAgIEZYX0FSR0IgbV9UM0ZpbGxDb2xvcjsKICAgaW50IG1fY3VyQmxlbmQ7CiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3NjYWxlZHJlbmRlcmJ1ZmZlci5jcHAgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfc2NhbGVkcmVuZGVyYnVmZmVyLmNwcAppbmRleCBkZTYwZTczLi4yZDg2MDI0IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfc2NhbGVkcmVuZGVyYnVmZmVyLmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfc2NhbGVkcmVuZGVyYnVmZmVyLmNwcApAQCAtOCw4ICs4LDggQEAKIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9yZW5kZXJjb250ZXh0LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3JlbmRlcm9wdGlvbnMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2Z4Z2VkZXZpY2UuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZGVmYXVsdHJlbmRlcmRldmljZS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2RpYml0bWFwLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogCiAjZGVmaW5lIF9GUERGQVBJX0lNQUdFU0laRV9MSU1JVF8gKDMwICogMTAyNCAqIDEwMjQpCkBAIC00MCwxMSArNDAsMTEgQEAKICAgICBpbnQgZHBpdiA9CiAgICAgICAgIHBEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpICogMjU0IC8gKHZlcnRfc2l6ZSAqIDEwKTsKICAgICBpZiAoZHBpaCA+IG1heF9kcGkpCi0gICAgICBtX01hdHJpeC5TY2FsZSgoRlhfRkxPQVQpKG1heF9kcGkpIC8gZHBpaCwgMS4wZik7CisgICAgICBtX01hdHJpeC5TY2FsZSgoZmxvYXQpKG1heF9kcGkpIC8gZHBpaCwgMS4wZik7CiAgICAgaWYgKGRwaXYgPiBtYXhfZHBpKQotICAgICAgbV9NYXRyaXguU2NhbGUoMS4wZiwgKEZYX0ZMT0FUKShtYXhfZHBpKSAvIChGWF9GTE9BVClkcGl2KTsKKyAgICAgIG1fTWF0cml4LlNjYWxlKDEuMGYsIChmbG9hdCkobWF4X2RwaSkgLyAoZmxvYXQpZHBpdik7CiAgIH0KLSAgbV9wQml0bWFwRGV2aWNlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9GeGdlRGV2aWNlPigpOworICBtX3BCaXRtYXBEZXZpY2UgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2U+KCk7CiAgIEZYRElCX0Zvcm1hdCBkaWJGb3JtYXQgPSBGWERJQl9SZ2I7CiAgIGludDMyX3QgYnBwID0gMjQ7CiAgIGlmIChtX3BEZXZpY2UtPkdldERldmljZUNhcHMoRlhEQ19SRU5ERVJfQ0FQUykgJiBGWFJDX0FMUEhBX09VVFBVVCkgewpAQCAtNTIsOSArNTIsOCBAQAogICAgIGJwcCA9IDMyOwogICB9CiAgIHdoaWxlICgxKSB7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByZWN0KHBSZWN0KTsKLSAgICBtX01hdHJpeC5UcmFuc2Zvcm1SZWN0KHJlY3QpOwotICAgIEZYX1JFQ1QgYml0bWFwX3JlY3QgPSByZWN0LkdldE91dGVyUmVjdCgpOworICAgIEZYX1JFQ1QgYml0bWFwX3JlY3QgPQorICAgICAgICBtX01hdHJpeC5UcmFuc2Zvcm1SZWN0KENGWF9GbG9hdFJlY3QocFJlY3QpKS5HZXRPdXRlclJlY3QoKTsKICAgICBpbnQzMl90IGlXaWR0aCA9IGJpdG1hcF9yZWN0LldpZHRoKCk7CiAgICAgaW50MzJfdCBpSGVpZ2h0ID0gYml0bWFwX3JlY3QuSGVpZ2h0KCk7CiAgICAgaW50MzJfdCBpUGl0Y2ggPSAoaVdpZHRoICogYnBwICsgMzEpIC8gMzIgKiA0OwpAQCAtNjcsOCArNjYsOCBAQAogICAgIH0KICAgICBtX01hdHJpeC5TY2FsZSgwLjVmLCAwLjVmKTsKICAgfQotICBtX3BDb250ZXh0LT5HZXRCYWNrZ3JvdW5kKG1fcEJpdG1hcERldmljZS0+R2V0Qml0bWFwKCksIG1fcE9iamVjdCwgcE9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fTWF0cml4KTsKKyAgbV9wQ29udGV4dC0+R2V0QmFja2dyb3VuZChtX3BCaXRtYXBEZXZpY2UtPkdldEJpdG1hcCgpLCBtX3BPYmplY3QuR2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9wdGlvbnMsICZtX01hdHJpeCk7CiAgIHJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfc2NhbGVkcmVuZGVyYnVmZmVyLmggYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfc2NhbGVkcmVuZGVyYnVmZmVyLmgKaW5kZXggZjgwMjM0OS4uYjc3ZTRiNiAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3NjYWxlZHJlbmRlcmJ1ZmZlci5oCisrKyBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9zY2FsZWRyZW5kZXJidWZmZXIuaApAQCAtMTAsNyArMTAsOCBAQAogI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2Z4Z2VkZXZpY2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9kZWZhdWx0cmVuZGVyZGV2aWNlLmgiCiAKIGNsYXNzIENGWF9SZW5kZXJEZXZpY2U7CiBjbGFzcyBDUERGX1BhZ2VPYmplY3Q7CkBAIC0yOCwxOCArMjksMTkgQEAKICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaiwKICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2RwaSk7Ci0gIENGWF9SZW5kZXJEZXZpY2UqIEdldERldmljZSgpIHsKLSAgICByZXR1cm4gbV9wQml0bWFwRGV2aWNlID8gbV9wQml0bWFwRGV2aWNlLmdldCgpIDogbV9wRGV2aWNlOworCisgIENGWF9SZW5kZXJEZXZpY2UqIEdldERldmljZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9wQml0bWFwRGV2aWNlID8gbV9wQml0bWFwRGV2aWNlLmdldCgpIDogbV9wRGV2aWNlLkdldCgpOwogICB9CiAgIENGWF9NYXRyaXgqIEdldE1hdHJpeCgpIHsgcmV0dXJuICZtX01hdHJpeDsgfQogICB2b2lkIE91dHB1dFRvRGV2aWNlKCk7CiAKICBwcml2YXRlOgotICBDRlhfUmVuZGVyRGV2aWNlKiBtX3BEZXZpY2U7Ci0gIENQREZfUmVuZGVyQ29udGV4dCogbV9wQ29udGV4dDsKKyAgVW5vd25lZFB0cjxDRlhfUmVuZGVyRGV2aWNlPiBtX3BEZXZpY2U7CisgIFVub3duZWRQdHI8Q1BERl9SZW5kZXJDb250ZXh0PiBtX3BDb250ZXh0OwogICBGWF9SRUNUIG1fUmVjdDsKLSAgY29uc3QgQ1BERl9QYWdlT2JqZWN0KiBtX3BPYmplY3Q7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRnhnZURldmljZT4gbV9wQml0bWFwRGV2aWNlOworICBVbm93bmVkUHRyPGNvbnN0IENQREZfUGFnZU9iamVjdD4gbV9wT2JqZWN0OworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2U+IG1fcEJpdG1hcERldmljZTsKICAgQ0ZYX01hdHJpeCBtX01hdHJpeDsKIH07CiAKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl90ZXh0cmVuZGVyZXIuY3BwIGIvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3RleHRyZW5kZXJlci5jcHAKaW5kZXggOTVhZjg2My4uNzExZGJmYSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3RleHRyZW5kZXJlci5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3RleHRyZW5kZXJlci5jcHAKQEAgLTE1LDEyICsxNSwyMCBAQAogI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcGF0aGRhdGEuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgogCituYW1lc3BhY2UgeworCitDRlhfRm9udCogR2V0Rm9udChDUERGX0ZvbnQqIHBGb250LCBpbnQzMl90IHBvc2l0aW9uKSB7CisgIHJldHVybiBwb3NpdGlvbiA9PSAtMSA/IHBGb250LT5HZXRGb250KCkgOiBwRm9udC0+R2V0Rm9udEZhbGxiYWNrKHBvc2l0aW9uKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKIC8vIHN0YXRpYwogYm9vbCBDUERGX1RleHRSZW5kZXJlcjo6RHJhd1RleHRQYXRoKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBjaGFyQ29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8RlhfRkxPQVQ+JiBjaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiYgY2hhclBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFRleHQyVXNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKQEAgLTQwLDkgKzQ4LDggQEAKICAgICBpbnQzMl90IGN1ckZvbnRQb3NpdGlvbiA9IENoYXJQb3NMaXN0Lm1fcENoYXJQb3NbaV0ubV9GYWxsYmFja0ZvbnRQb3NpdGlvbjsKICAgICBpZiAoZm9udFBvc2l0aW9uID09IGN1ckZvbnRQb3NpdGlvbikKICAgICAgIGNvbnRpbnVlOwotICAgIGF1dG8qIGZvbnQgPSBmb250UG9zaXRpb24gPT0gLTEKLSAgICAgICAgICAgICAgICAgICAgID8gJnBGb250LT5tX0ZvbnQKLSAgICAgICAgICAgICAgICAgICAgIDogcEZvbnQtPm1fRm9udEZhbGxiYWNrc1tmb250UG9zaXRpb25dLmdldCgpOworCisgICAgQ0ZYX0ZvbnQqIGZvbnQgPSBHZXRGb250KHBGb250LCBmb250UG9zaXRpb24pOwogICAgIGlmICghcERldmljZS0+RHJhd1RleHRQYXRoKGkgLSBzdGFydEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJQb3NMaXN0Lm1fcENoYXJQb3MgKyBzdGFydEluZGV4LCBmb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRfc2l6ZSwgcFRleHQyVXNlciwgcFVzZXIyRGV2aWNlLCBwR3JhcGhTdGF0ZSwKQEAgLTUyLDggKzU5LDcgQEAKICAgICBmb250UG9zaXRpb24gPSBjdXJGb250UG9zaXRpb247CiAgICAgc3RhcnRJbmRleCA9IGk7CiAgIH0KLSAgYXV0byogZm9udCA9IGZvbnRQb3NpdGlvbiA9PSAtMSA/ICZwRm9udC0+bV9Gb250Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwRm9udC0+bV9Gb250RmFsbGJhY2tzW2ZvbnRQb3NpdGlvbl0uZ2V0KCk7CisgIENGWF9Gb250KiBmb250ID0gR2V0Rm9udChwRm9udCwgZm9udFBvc2l0aW9uKTsKICAgaWYgKCFwRGV2aWNlLT5EcmF3VGV4dFBhdGgoQ2hhclBvc0xpc3QubV9uQ2hhcnMgLSBzdGFydEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyUG9zTGlzdC5tX3BDaGFyUG9zICsgc3RhcnRJbmRleCwgZm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udF9zaXplLCBwVGV4dDJVc2VyLCBwVXNlcjJEZXZpY2UsIHBHcmFwaFN0YXRlLApAQCAtNjUsMTIgKzcxLDEyIEBACiAKIC8vIHN0YXRpYwogdm9pZCBDUERGX1RleHRSZW5kZXJlcjo6RHJhd1RleHRTdHJpbmcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG9yaWdpbl94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgb3JpZ2luX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBvcmlnaW5feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG9yaWdpbl95LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZvbnRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBmaWxsX2FyZ2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykgewpAQCAtODMsMTAgKzg5LDEwIEBACiAKICAgaW50IG9mZnNldCA9IDA7CiAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBjb2RlczsKLSAgc3RkOjp2ZWN0b3I8RlhfRkxPQVQ+IHBvc2l0aW9uczsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHBvc2l0aW9uczsKICAgY29kZXMucmVzaXplKG5DaGFycyk7CiAgIHBvc2l0aW9ucy5yZXNpemUobkNoYXJzIC0gMSk7Ci0gIEZYX0ZMT0FUIGN1cl9wb3MgPSAwOworICBmbG9hdCBjdXJfcG9zID0gMDsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hhcnM7IGkrKykgewogICAgIGNvZGVzW2ldID0gcEZvbnQtPkdldE5leHRDaGFyKHN0ci5jX3N0cigpLCBzdHIuR2V0TGVuZ3RoKCksIG9mZnNldCk7CiAgICAgaWYgKGkpCkBAIC0xMDcsOSArMTEzLDkgQEAKIC8vIHN0YXRpYwogYm9vbCBDUERGX1RleHRSZW5kZXJlcjo6RHJhd05vcm1hbFRleHQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgY2hhckNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8RlhfRkxPQVQ+JiBjaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiBjaGFyUG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZvbnRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBUZXh0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZmlsbF9hcmdiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykgewpAQCAtMTE5LDE5ICsxMjUsMTggQEAKICAgICByZXR1cm4gdHJ1ZTsKICAgaW50IEZYR0VfZmxhZ3MgPSAwOwogICBpZiAocE9wdGlvbnMpIHsKLSAgICB1aW50MzJfdCBkd0ZsYWdzID0gcE9wdGlvbnMtPm1fRmxhZ3M7Ci0gICAgaWYgKGR3RmxhZ3MgJiBSRU5ERVJfQ0xFQVJUWVBFKSB7CisgICAgaWYgKHBPcHRpb25zLT5IYXNGbGFnKFJFTkRFUl9DTEVBUlRZUEUpKSB7CiAgICAgICBGWEdFX2ZsYWdzIHw9IEZYVEVYVF9DTEVBUlRZUEU7Ci0gICAgICBpZiAoZHdGbGFncyAmIFJFTkRFUl9CR1JfU1RSSVBFKQorICAgICAgaWYgKHBPcHRpb25zLT5IYXNGbGFnKFJFTkRFUl9CR1JfU1RSSVBFKSkKICAgICAgICAgRlhHRV9mbGFncyB8PSBGWFRFWFRfQkdSX1NUUklQRTsKICAgICB9Ci0gICAgaWYgKGR3RmxhZ3MgJiBSRU5ERVJfTk9URVhUU01PT1RIKQorICAgIGlmIChwT3B0aW9ucy0+SGFzRmxhZyhSRU5ERVJfTk9URVhUU01PT1RIKSkKICAgICAgIEZYR0VfZmxhZ3MgfD0gRlhURVhUX05PU01PT1RIOwotICAgIGlmIChkd0ZsYWdzICYgUkVOREVSX1BSSU5UR1JBUEhJQ1RFWFQpCisgICAgaWYgKHBPcHRpb25zLT5IYXNGbGFnKFJFTkRFUl9QUklOVEdSQVBISUNURVhUKSkKICAgICAgIEZYR0VfZmxhZ3MgfD0gRlhURVhUX1BSSU5UR1JBUEhJQ1RFWFQ7Ci0gICAgaWYgKGR3RmxhZ3MgJiBSRU5ERVJfTk9fTkFUSVZFVEVYVCkKKyAgICBpZiAocE9wdGlvbnMtPkhhc0ZsYWcoUkVOREVSX05PX05BVElWRVRFWFQpKQogICAgICAgRlhHRV9mbGFncyB8PSBGWFRFWFRfTk9fTkFUSVZFVEVYVDsKLSAgICBpZiAoZHdGbGFncyAmIFJFTkRFUl9QUklOVElNQUdFVEVYVCkKKyAgICBpZiAocE9wdGlvbnMtPkhhc0ZsYWcoUkVOREVSX1BSSU5USU1BR0VURVhUKSkKICAgICAgIEZYR0VfZmxhZ3MgfD0gRlhURVhUX1BSSU5USU1BR0VURVhUOwogICB9IGVsc2UgewogICAgIEZYR0VfZmxhZ3MgPSBGWFRFWFRfQ0xFQVJUWVBFOwpAQCAtMTQ1LDkgKzE1MCw4IEBACiAgICAgaW50MzJfdCBjdXJGb250UG9zaXRpb24gPSBDaGFyUG9zTGlzdC5tX3BDaGFyUG9zW2ldLm1fRmFsbGJhY2tGb250UG9zaXRpb247CiAgICAgaWYgKGZvbnRQb3NpdGlvbiA9PSBjdXJGb250UG9zaXRpb24pCiAgICAgICBjb250aW51ZTsKLSAgICBhdXRvKiBmb250ID0gZm9udFBvc2l0aW9uID09IC0xCi0gICAgICAgICAgICAgICAgICAgICA/ICZwRm9udC0+bV9Gb250Ci0gICAgICAgICAgICAgICAgICAgICA6IHBGb250LT5tX0ZvbnRGYWxsYmFja3NbZm9udFBvc2l0aW9uXS5nZXQoKTsKKworICAgIENGWF9Gb250KiBmb250ID0gR2V0Rm9udChwRm9udCwgZm9udFBvc2l0aW9uKTsKICAgICBpZiAoIXBEZXZpY2UtPkRyYXdOb3JtYWxUZXh0KAogICAgICAgICAgICAgaSAtIHN0YXJ0SW5kZXgsIENoYXJQb3NMaXN0Lm1fcENoYXJQb3MgKyBzdGFydEluZGV4LCBmb250LAogICAgICAgICAgICAgZm9udF9zaXplLCBwVGV4dDJEZXZpY2UsIGZpbGxfYXJnYiwgRlhHRV9mbGFncykpIHsKQEAgLTE1Niw4ICsxNjAsNyBAQAogICAgIGZvbnRQb3NpdGlvbiA9IGN1ckZvbnRQb3NpdGlvbjsKICAgICBzdGFydEluZGV4ID0gaTsKICAgfQotICBhdXRvKiBmb250ID0gZm9udFBvc2l0aW9uID09IC0xID8gJnBGb250LT5tX0ZvbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBGb250LT5tX0ZvbnRGYWxsYmFja3NbZm9udFBvc2l0aW9uXS5nZXQoKTsKKyAgQ0ZYX0ZvbnQqIGZvbnQgPSBHZXRGb250KHBGb250LCBmb250UG9zaXRpb24pOwogICBpZiAoIXBEZXZpY2UtPkRyYXdOb3JtYWxUZXh0KENoYXJQb3NMaXN0Lm1fbkNoYXJzIC0gc3RhcnRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyUG9zTGlzdC5tX3BDaGFyUG9zICsgc3RhcnRJbmRleCwgZm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X3NpemUsIHBUZXh0MkRldmljZSwgZmlsbF9hcmdiLApkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3RleHRyZW5kZXJlci5oIGIvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3RleHRyZW5kZXJlci5oCmluZGV4IDU0ZTlkMWIuLmFjOGM4YzUgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl90ZXh0cmVuZGVyZXIuaAorKysgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfdGV4dHJlbmRlcmVyLmgKQEAgLTIzLDIxICsyMywyMSBAQAogY2xhc3MgQ1BERl9UZXh0UmVuZGVyZXIgewogIHB1YmxpYzoKICAgc3RhdGljIHZvaWQgRHJhd1RleHRTdHJpbmcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgb3JpZ2luX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG9yaWdpbl95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBvcmlnaW5feCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgb3JpZ2luX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZm9udF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIHN0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBmaWxsX2FyZ2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpOwogCiAgIHN0YXRpYyBib29sIERyYXdUZXh0UGF0aChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBjaGFyQ29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxGWF9GTE9BVD4mIGNoYXJQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxmbG9hdD4mIGNoYXJQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZm9udF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFRleHQyVXNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCkBAIC00OCw5ICs0OCw5IEBACiAKICAgc3RhdGljIGJvb2wgRHJhd05vcm1hbFRleHQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBjaGFyQ29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEZYX0ZMT0FUPiYgY2hhclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiBjaGFyUG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZvbnRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFRleHQyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxfYXJnYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfdHJhbnNmZXJmdW5jLmNwcCBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl90cmFuc2ZlcmZ1bmMuY3BwCmluZGV4IGJlNDgzNmQuLjk4NTI4YzMgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl90cmFuc2ZlcmZ1bmMuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl90cmFuc2ZlcmZ1bmMuY3BwCkBAIC04LDE4ICs4LDIyIEBACiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfZGlidHJhbnNmZXJmdW5jLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfZGlic291cmNlLmgiCiAKIENQREZfVHJhbnNmZXJGdW5jOjpDUERGX1RyYW5zZmVyRnVuYyhDUERGX0RvY3VtZW50KiBwRG9jKSA6IG1fcFBERkRvYyhwRG9jKSB7fQogCitDUERGX1RyYW5zZmVyRnVuYzo6fkNQREZfVHJhbnNmZXJGdW5jKCkge30KKwogRlhfQ09MT1JSRUYgQ1BERl9UcmFuc2ZlckZ1bmM6OlRyYW5zbGF0ZUNvbG9yKEZYX0NPTE9SUkVGIHJnYikgY29uc3QgewogICByZXR1cm4gRlhTWVNfUkdCKG1fU2FtcGxlc1tGWFNZU19HZXRSVmFsdWUocmdiKV0sCiAgICAgICAgICAgICAgICAgICAgbV9TYW1wbGVzWzI1NiArIEZYU1lTX0dldEdWYWx1ZShyZ2IpXSwKICAgICAgICAgICAgICAgICAgICBtX1NhbXBsZXNbNTEyICsgRlhTWVNfR2V0QlZhbHVlKHJnYildKTsKIH0KIAotQ0ZYX0RJQlNvdXJjZSogQ1BERl9UcmFuc2ZlckZ1bmM6OlRyYW5zbGF0ZUltYWdlKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQXV0b0Ryb3BTcmMpIHsKLSAgQ1BERl9ESUJUcmFuc2ZlckZ1bmMqIHBEZXN0ID0gbmV3IENQREZfRElCVHJhbnNmZXJGdW5jKHRoaXMpOwotICBwRGVzdC0+TG9hZFNyYyhwU3JjLCBiQXV0b0Ryb3BTcmMpOworUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+IENQREZfVHJhbnNmZXJGdW5jOjpUcmFuc2xhdGVJbWFnZSgKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTcmMpIHsKKyAgUmV0YWluUHRyPENQREZfVHJhbnNmZXJGdW5jPiBwSG9sZGVyKHRoaXMpOworICBhdXRvIHBEZXN0ID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfRElCVHJhbnNmZXJGdW5jPihwSG9sZGVyKTsKKyAgcERlc3QtPkxvYWRTcmMocFNyYyk7CiAgIHJldHVybiBwRGVzdDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl90cmFuc2ZlcmZ1bmMuaCBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl90cmFuc2ZlcmZ1bmMuaAppbmRleCA4MjliMjc0Li5kN2UyMWZjIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfdHJhbnNmZXJmdW5jLmgKKysrIGIvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3RyYW5zZmVyZnVuYy5oCkBAIC03LDE4ICs3LDM0IEBACiAjaWZuZGVmIENPUkVfRlBERkFQSV9SRU5ERVJfQ1BERl9UUkFOU0ZFUkZVTkNfSF8KICNkZWZpbmUgQ09SRV9GUERGQVBJX1JFTkRFUl9DUERGX1RSQU5TRkVSRlVOQ19IXwogCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9meF9kaWIuaCIKIAogY2xhc3MgQ1BERl9Eb2N1bWVudDsKK2NsYXNzIENGWF9ESUJTb3VyY2U7CiAKLWNsYXNzIENQREZfVHJhbnNmZXJGdW5jIHsKK2NsYXNzIENQREZfVHJhbnNmZXJGdW5jIDogcHVibGljIFJldGFpbmFibGUgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1BERl9UcmFuc2ZlckZ1bmMoQ1BERl9Eb2N1bWVudCogcERvYyk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgorICBmcmllbmQgUmV0YWluUHRyPFQ+IHBkZml1bTo6TWFrZVJldGFpbihBcmdzJiYuLi4gYXJncyk7CiAKICAgRlhfQ09MT1JSRUYgVHJhbnNsYXRlQ29sb3IoRlhfQ09MT1JSRUYgc3JjKSBjb25zdDsKLSAgQ0ZYX0RJQlNvdXJjZSogVHJhbnNsYXRlSW1hZ2UoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYywgYm9vbCBiQXV0b0Ryb3BTcmMpOworICBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4gVHJhbnNsYXRlSW1hZ2UoY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwU3JjKTsKIAotICBDUERGX0RvY3VtZW50KiBjb25zdCBtX3BQREZEb2M7CisgIGNvbnN0IENQREZfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9wUERGRG9jLkdldCgpOyB9CisKKyAgY29uc3QgdWludDhfdCogR2V0U2FtcGxlcygpIGNvbnN0IHsgcmV0dXJuIG1fU2FtcGxlczsgfQorICB1aW50OF90KiBHZXRTYW1wbGVzKCkgeyByZXR1cm4gbV9TYW1wbGVzOyB9CisKKyAgYm9vbCBHZXRJZGVudGl0eSgpIGNvbnN0IHsgcmV0dXJuIG1fYklkZW50aXR5OyB9CisgIHZvaWQgU2V0SWRlbnRpdHkoYm9vbCBpZGVudGl0eSkgeyBtX2JJZGVudGl0eSA9IGlkZW50aXR5OyB9CisKKyBwcml2YXRlOgorICBleHBsaWNpdCBDUERGX1RyYW5zZmVyRnVuYyhDUERGX0RvY3VtZW50KiBwRG9jKTsKKyAgfkNQREZfVHJhbnNmZXJGdW5jKCkgb3ZlcnJpZGU7CisKKyAgVW5vd25lZFB0cjxDUERGX0RvY3VtZW50PiBjb25zdCBtX3BQREZEb2M7CiAgIGJvb2wgbV9iSWRlbnRpdHk7CiAgIHVpbnQ4X3QgbV9TYW1wbGVzWzI1NiAqIDNdOwogfTsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl90eXBlM2NhY2hlLmNwcCBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl90eXBlM2NhY2hlLmNwcAppbmRleCA2M2NjNzgwLi5mZTlkZmJmIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfdHlwZTNjYWNoZS5jcHAKKysrIGIvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3R5cGUzY2FjaGUuY3BwCkBAIC04LDE4ICs4LDIwIEBACiAKICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3R5cGUzY2hhci5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfdHlwZTNmb250LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3R5cGUzZ2x5cGhzLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mb250LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogCiBuYW1lc3BhY2UgewogCiBzdHJ1Y3QgQ1BERl9VbmlxdWVLZXlHZW4gewogICB2b2lkIEdlbmVyYXRlKGludCBjb3VudCwgLi4uKTsKLSAgRlhfQ0hBUiBtX0tleVsxMjhdOworICBjaGFyIG1fS2V5WzEyOF07CiAgIGludCBtX0tleUxlbjsKIH07CiAKQEAgLTUxLDcgKzUzLDcgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCi1pbnQgRGV0ZWN0Rmlyc3RMYXN0U2Nhbihjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGJvb2wgYkZpcnN0KSB7CitpbnQgRGV0ZWN0Rmlyc3RMYXN0U2Nhbihjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcCwgYm9vbCBiRmlyc3QpIHsKICAgaW50IGhlaWdodCA9IHBCaXRtYXAtPkdldEhlaWdodCgpOwogICBpbnQgcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOwogICBpbnQgd2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOwpAQCAtNzksNzQgKzgxLDc1IEBACiAKIENQREZfVHlwZTNDYWNoZTo6Q1BERl9UeXBlM0NhY2hlKENQREZfVHlwZTNGb250KiBwRm9udCkgOiBtX3BGb250KHBGb250KSB7fQogCi1DUERGX1R5cGUzQ2FjaGU6On5DUERGX1R5cGUzQ2FjaGUoKSB7Ci0gIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1fU2l6ZU1hcCkKLSAgICBkZWxldGUgcGFpci5zZWNvbmQ7Ci0gIG1fU2l6ZU1hcC5jbGVhcigpOwotfQorQ1BERl9UeXBlM0NhY2hlOjp+Q1BERl9UeXBlM0NhY2hlKCkge30KIAogQ0ZYX0dseXBoQml0bWFwKiBDUERGX1R5cGUzQ2FjaGU6OkxvYWRHbHlwaCh1aW50MzJfdCBjaGFyY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcmV0aW5hU2NhbGVYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCByZXRpbmFTY2FsZVkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcmV0aW5hU2NhbGVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByZXRpbmFTY2FsZVkpIHsKICAgQ1BERl9VbmlxdWVLZXlHZW4ga2V5Z2VuOwogICBrZXlnZW4uR2VuZXJhdGUoCiAgICAgICA0LCBGWFNZU19yb3VuZChwTWF0cml4LT5hICogMTAwMDApLCBGWFNZU19yb3VuZChwTWF0cml4LT5iICogMTAwMDApLAogICAgICAgRlhTWVNfcm91bmQocE1hdHJpeC0+YyAqIDEwMDAwKSwgRlhTWVNfcm91bmQocE1hdHJpeC0+ZCAqIDEwMDAwKSk7Ci0gIENGWF9CeXRlU3RyaW5nIEZhY2VHbHlwaHNLZXkoa2V5Z2VuLm1fS2V5LCBrZXlnZW4ubV9LZXlMZW4pOworICBCeXRlU3RyaW5nIEZhY2VHbHlwaHNLZXkoa2V5Z2VuLm1fS2V5LCBrZXlnZW4ubV9LZXlMZW4pOwogICBDUERGX1R5cGUzR2x5cGhzKiBwU2l6ZUNhY2hlOwogICBhdXRvIGl0ID0gbV9TaXplTWFwLmZpbmQoRmFjZUdseXBoc0tleSk7CiAgIGlmIChpdCA9PSBtX1NpemVNYXAuZW5kKCkpIHsKLSAgICBwU2l6ZUNhY2hlID0gbmV3IENQREZfVHlwZTNHbHlwaHM7Ci0gICAgbV9TaXplTWFwW0ZhY2VHbHlwaHNLZXldID0gcFNpemVDYWNoZTsKKyAgICBhdXRvIHBOZXcgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9UeXBlM0dseXBocz4oKTsKKyAgICBwU2l6ZUNhY2hlID0gcE5ldy5nZXQoKTsKKyAgICBtX1NpemVNYXBbRmFjZUdseXBoc0tleV0gPSBzdGQ6Om1vdmUocE5ldyk7CiAgIH0gZWxzZSB7Ci0gICAgcFNpemVDYWNoZSA9IGl0LT5zZWNvbmQ7CisgICAgcFNpemVDYWNoZSA9IGl0LT5zZWNvbmQuZ2V0KCk7CiAgIH0KICAgYXV0byBpdDIgPSBwU2l6ZUNhY2hlLT5tX0dseXBoTWFwLmZpbmQoY2hhcmNvZGUpOwogICBpZiAoaXQyICE9IHBTaXplQ2FjaGUtPm1fR2x5cGhNYXAuZW5kKCkpCi0gICAgcmV0dXJuIGl0Mi0+c2Vjb25kOworICAgIHJldHVybiBpdDItPnNlY29uZC5nZXQoKTsKIAotICBDRlhfR2x5cGhCaXRtYXAqIHBHbHlwaEJpdG1hcCA9CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfR2x5cGhCaXRtYXA+IHBOZXdCaXRtYXAgPQogICAgICAgUmVuZGVyR2x5cGgocFNpemVDYWNoZSwgY2hhcmNvZGUsIHBNYXRyaXgsIHJldGluYVNjYWxlWCwgcmV0aW5hU2NhbGVZKTsKLSAgcFNpemVDYWNoZS0+bV9HbHlwaE1hcFtjaGFyY29kZV0gPSBwR2x5cGhCaXRtYXA7CisgIENGWF9HbHlwaEJpdG1hcCogcEdseXBoQml0bWFwID0gcE5ld0JpdG1hcC5nZXQoKTsKKyAgcFNpemVDYWNoZS0+bV9HbHlwaE1hcFtjaGFyY29kZV0gPSBzdGQ6Om1vdmUocE5ld0JpdG1hcCk7CiAgIHJldHVybiBwR2x5cGhCaXRtYXA7CiB9CiAKLUNGWF9HbHlwaEJpdG1hcCogQ1BERl9UeXBlM0NhY2hlOjpSZW5kZXJHbHlwaChDUERGX1R5cGUzR2x5cGhzKiBwU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFyY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJldGluYVNjYWxlWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCByZXRpbmFTY2FsZVkpIHsKK3N0ZDo6dW5pcXVlX3B0cjxDRlhfR2x5cGhCaXRtYXA+IENQREZfVHlwZTNDYWNoZTo6UmVuZGVyR2x5cGgoCisgICAgQ1BERl9UeXBlM0dseXBocyogcFNpemUsCisgICAgdWludDMyX3QgY2hhcmNvZGUsCisgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICBmbG9hdCByZXRpbmFTY2FsZVgsCisgICAgZmxvYXQgcmV0aW5hU2NhbGVZKSB7CiAgIGNvbnN0IENQREZfVHlwZTNDaGFyKiBwQ2hhciA9IG1fcEZvbnQtPkxvYWRDaGFyKGNoYXJjb2RlKTsKLSAgaWYgKCFwQ2hhciB8fCAhcENoYXItPm1fcEJpdG1hcCkKKyAgaWYgKCFwQ2hhciB8fCAhcENoYXItPkdldEJpdG1hcCgpKQogICAgIHJldHVybiBudWxscHRyOwogCi0gIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHBDaGFyLT5tX3BCaXRtYXAuZ2V0KCk7Ci0gIENGWF9NYXRyaXggaW1hZ2VfbWF0cml4ID0gcENoYXItPm1fSW1hZ2VNYXRyaXg7CiAgIENGWF9NYXRyaXggdGV4dF9tYXRyaXgocE1hdHJpeC0+YSwgcE1hdHJpeC0+YiwgcE1hdHJpeC0+YywgcE1hdHJpeC0+ZCwgMCwgMCk7CisgIENGWF9NYXRyaXggaW1hZ2VfbWF0cml4ID0gcENoYXItPm1hdHJpeCgpOwogICBpbWFnZV9tYXRyaXguQ29uY2F0KHRleHRfbWF0cml4KTsKIAotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBwUmVzQml0bWFwOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwQml0bWFwID0gcENoYXItPkdldEJpdG1hcCgpOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwUmVzQml0bWFwOwogICBpbnQgbGVmdCA9IDA7CiAgIGludCB0b3AgPSAwOwotICBpZiAoRlhTWVNfZmFicyhpbWFnZV9tYXRyaXguYikgPCBGWFNZU19mYWJzKGltYWdlX21hdHJpeC5hKSAvIDEwMCAmJgotICAgICAgRlhTWVNfZmFicyhpbWFnZV9tYXRyaXguYykgPCBGWFNZU19mYWJzKGltYWdlX21hdHJpeC5kKSAvIDEwMCkgeworICBpZiAoZmFicyhpbWFnZV9tYXRyaXguYikgPCBmYWJzKGltYWdlX21hdHJpeC5hKSAvIDEwMCAmJgorICAgICAgZmFicyhpbWFnZV9tYXRyaXguYykgPCBmYWJzKGltYWdlX21hdHJpeC5kKSAvIDEwMCkgewogICAgIGludCB0b3BfbGluZSA9IERldGVjdEZpcnN0TGFzdFNjYW4ocEJpdG1hcCwgdHJ1ZSk7CiAgICAgaW50IGJvdHRvbV9saW5lID0gRGV0ZWN0Rmlyc3RMYXN0U2NhbihwQml0bWFwLCBmYWxzZSk7CiAgICAgaWYgKHRvcF9saW5lID09IDAgJiYgYm90dG9tX2xpbmUgPT0gcEJpdG1hcC0+R2V0SGVpZ2h0KCkgLSAxKSB7Ci0gICAgICBGWF9GTE9BVCB0b3BfeSA9IGltYWdlX21hdHJpeC5kICsgaW1hZ2VfbWF0cml4LmY7Ci0gICAgICBGWF9GTE9BVCBib3R0b21feSA9IGltYWdlX21hdHJpeC5mOworICAgICAgZmxvYXQgdG9wX3kgPSBpbWFnZV9tYXRyaXguZCArIGltYWdlX21hdHJpeC5mOworICAgICAgZmxvYXQgYm90dG9tX3kgPSBpbWFnZV9tYXRyaXguZjsKICAgICAgIGJvb2wgYkZsaXBwZWQgPSB0b3BfeSA+IGJvdHRvbV95OwogICAgICAgaWYgKGJGbGlwcGVkKSB7Ci0gICAgICAgIEZYX0ZMT0FUIHRlbXAgPSB0b3BfeTsKKyAgICAgICAgZmxvYXQgdGVtcCA9IHRvcF95OwogICAgICAgICB0b3BfeSA9IGJvdHRvbV95OwogICAgICAgICBib3R0b21feSA9IHRlbXA7CiAgICAgICB9CiAgICAgICBwU2l6ZS0+QWRqdXN0Qmx1ZSh0b3BfeSwgYm90dG9tX3ksIHRvcF9saW5lLCBib3R0b21fbGluZSk7CiAgICAgICBwUmVzQml0bWFwID0gcEJpdG1hcC0+U3RyZXRjaFRvKAotICAgICAgICAgIChpbnQpKEZYU1lTX3JvdW5kKGltYWdlX21hdHJpeC5hKSAqIHJldGluYVNjYWxlWCksCi0gICAgICAgICAgKGludCkoKGJGbGlwcGVkID8gdG9wX2xpbmUgLSBib3R0b21fbGluZSA6IGJvdHRvbV9saW5lIC0gdG9wX2xpbmUpICoKLSAgICAgICAgICAgICAgICByZXRpbmFTY2FsZVkpKTsKKyAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KEZYU1lTX3JvdW5kKGltYWdlX21hdHJpeC5hKSAqIHJldGluYVNjYWxlWCksCisgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PigKKyAgICAgICAgICAgICAgKGJGbGlwcGVkID8gdG9wX2xpbmUgLSBib3R0b21fbGluZSA6IGJvdHRvbV9saW5lIC0gdG9wX2xpbmUpICoKKyAgICAgICAgICAgICAgcmV0aW5hU2NhbGVZKSwKKyAgICAgICAgICAwLCBudWxscHRyKTsKICAgICAgIHRvcCA9IHRvcF9saW5lOwogICAgICAgaWYgKGltYWdlX21hdHJpeC5hIDwgMCkgewogICAgICAgICBpbWFnZV9tYXRyaXguU2NhbGUocmV0aW5hU2NhbGVYLCByZXRpbmFTY2FsZVkpOwpAQCAtMTU4LDE0ICsxNjEsMTQgQEAKICAgfQogICBpZiAoIXBSZXNCaXRtYXApIHsKICAgICBpbWFnZV9tYXRyaXguU2NhbGUocmV0aW5hU2NhbGVYLCByZXRpbmFTY2FsZVkpOwotICAgIHBSZXNCaXRtYXAgPSBwQml0bWFwLT5UcmFuc2Zvcm1UbygmaW1hZ2VfbWF0cml4LCBsZWZ0LCB0b3ApOworICAgIHBSZXNCaXRtYXAgPSBwQml0bWFwLT5UcmFuc2Zvcm1UbygmaW1hZ2VfbWF0cml4LCAmbGVmdCwgJnRvcCk7CiAgIH0KICAgaWYgKCFwUmVzQml0bWFwKQogICAgIHJldHVybiBudWxscHRyOwogCi0gIENGWF9HbHlwaEJpdG1hcCogcEdseXBoID0gbmV3IENGWF9HbHlwaEJpdG1hcDsKKyAgYXV0byBwR2x5cGggPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0dseXBoQml0bWFwPigpOwogICBwR2x5cGgtPm1fTGVmdCA9IGxlZnQ7CiAgIHBHbHlwaC0+bV9Ub3AgPSAtdG9wOwotICBwR2x5cGgtPm1fQml0bWFwLlRha2VPdmVyKHBSZXNCaXRtYXAuZ2V0KCkpOworICBwR2x5cGgtPm1fcEJpdG1hcC0+VGFrZU92ZXIoc3RkOjptb3ZlKHBSZXNCaXRtYXApKTsKICAgcmV0dXJuIHBHbHlwaDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl90eXBlM2NhY2hlLmggYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfdHlwZTNjYWNoZS5oCmluZGV4IGY3NGE0M2EuLjc5MTE3ODUgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl90eXBlM2NhY2hlLmgKKysrIGIvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3R5cGUzY2FjaGUuaApAQCAtOCwzMyArOCwzOCBAQAogI2RlZmluZSBDT1JFX0ZQREZBUElfUkVOREVSX0NQREZfVFlQRTNDQUNIRV9IXwogCiAjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfdHlwZTNmb250LmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKIAogY2xhc3MgQ1BERl9UeXBlM0dseXBoczsKIAotY2xhc3MgQ1BERl9UeXBlM0NhY2hlIHsKK2NsYXNzIENQREZfVHlwZTNDYWNoZSA6IHB1YmxpYyBSZXRhaW5hYmxlIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IENQREZfVHlwZTNDYWNoZShDUERGX1R5cGUzRm9udCogcEZvbnQpOwotICB+Q1BERl9UeXBlM0NhY2hlKCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgorICBmcmllbmQgUmV0YWluUHRyPFQ+IHBkZml1bTo6TWFrZVJldGFpbihBcmdzJiYuLi4gYXJncyk7CiAKICAgQ0ZYX0dseXBoQml0bWFwKiBMb2FkR2x5cGgodWludDMyX3QgY2hhcmNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJldGluYVNjYWxlWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcmV0aW5hU2NhbGVZKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcmV0aW5hU2NhbGVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByZXRpbmFTY2FsZVkpOwogCiAgcHJpdmF0ZToKLSAgQ0ZYX0dseXBoQml0bWFwKiBSZW5kZXJHbHlwaChDUERGX1R5cGUzR2x5cGhzKiBwU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjaGFyY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJldGluYVNjYWxlWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCByZXRpbmFTY2FsZVkpOworICBleHBsaWNpdCBDUERGX1R5cGUzQ2FjaGUoQ1BERl9UeXBlM0ZvbnQqIHBGb250KTsKKyAgfkNQREZfVHlwZTNDYWNoZSgpIG92ZXJyaWRlOwogCi0gIENQREZfVHlwZTNGb250KiBjb25zdCBtX3BGb250OwotICBzdGQ6Om1hcDxDRlhfQnl0ZVN0cmluZywgQ1BERl9UeXBlM0dseXBocyo+IG1fU2l6ZU1hcDsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWF9HbHlwaEJpdG1hcD4gUmVuZGVyR2x5cGgoQ1BERl9UeXBlM0dseXBocyogcFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoYXJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByZXRpbmFTY2FsZVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJldGluYVNjYWxlWSk7CisKKyAgVW5vd25lZFB0cjxDUERGX1R5cGUzRm9udD4gY29uc3QgbV9wRm9udDsKKyAgc3RkOjptYXA8Qnl0ZVN0cmluZywgc3RkOjp1bmlxdWVfcHRyPENQREZfVHlwZTNHbHlwaHM+PiBtX1NpemVNYXA7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkFQSV9SRU5ERVJfQ1BERl9UWVBFM0NBQ0hFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfdHlwZTNnbHlwaHMuY3BwIGIvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3R5cGUzZ2x5cGhzLmNwcAppbmRleCAxODlmYzI0Li4wMWI2ODlmIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfdHlwZTNnbHlwaHMuY3BwCisrKyBiL2NvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl90eXBlM2dseXBocy5jcHAKQEAgLTEzLDE2ICsxMywxMyBAQAogQ1BERl9UeXBlM0dseXBoczo6Q1BERl9UeXBlM0dseXBocygpCiAgICAgOiBtX1RvcEJsdWVDb3VudCgwKSwgbV9Cb3R0b21CbHVlQ291bnQoMCkge30KIAotQ1BERl9UeXBlM0dseXBoczo6fkNQREZfVHlwZTNHbHlwaHMoKSB7Ci0gIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1fR2x5cGhNYXApCi0gICAgZGVsZXRlIHBhaXIuc2Vjb25kOwotfQorQ1BERl9UeXBlM0dseXBoczo6fkNQREZfVHlwZTNHbHlwaHMoKSB7fQogCi1zdGF0aWMgaW50IF9BZGp1c3RCbHVlKEZYX0ZMT0FUIHBvcywgaW50JiBjb3VudCwgaW50IGJsdWVzW10pIHsKLSAgRlhfRkxPQVQgbWluX2Rpc3RhbmNlID0gMTAwMDAwMC4wZjsKK3N0YXRpYyBpbnQgX0FkanVzdEJsdWUoZmxvYXQgcG9zLCBpbnQmIGNvdW50LCBpbnQgYmx1ZXNbXSkgeworICBmbG9hdCBtaW5fZGlzdGFuY2UgPSAxMDAwMDAwLjBmOwogICBpbnQgY2xvc2VzdF9wb3MgPSAtMTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgRlhfRkxPQVQgZGlzdGFuY2UgPSBGWFNZU19mYWJzKHBvcyAtIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihibHVlc1tpXSkpOworICAgIGZsb2F0IGRpc3RhbmNlID0gZmFicyhwb3MgLSBzdGF0aWNfY2FzdDxmbG9hdD4oYmx1ZXNbaV0pKTsKICAgICBpZiAoZGlzdGFuY2UgPCAxLjBmICogODAuMGYgLyAxMDAuMGYgJiYgZGlzdGFuY2UgPCBtaW5fZGlzdGFuY2UpIHsKICAgICAgIG1pbl9kaXN0YW5jZSA9IGRpc3RhbmNlOwogICAgICAgY2xvc2VzdF9wb3MgPSBpOwpAQCAtMzcsOCArMzQsOCBAQAogICByZXR1cm4gbmV3X3BvczsKIH0KIAotdm9pZCBDUERGX1R5cGUzR2x5cGhzOjpBZGp1c3RCbHVlKEZYX0ZMT0FUIHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBib3R0b20sCit2b2lkIENQREZfVHlwZTNHbHlwaHM6OkFkanVzdEJsdWUoZmxvYXQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJvdHRvbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHRvcF9saW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgYm90dG9tX2xpbmUpIHsKICAgdG9wX2xpbmUgPSBfQWRqdXN0Qmx1ZSh0b3AsIG1fVG9wQmx1ZUNvdW50LCBtX1RvcEJsdWUpOwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3R5cGUzZ2x5cGhzLmggYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfdHlwZTNnbHlwaHMuaAppbmRleCAwMDgxNGQ1Li43NzhiNjM5IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfdHlwZTNnbHlwaHMuaAorKysgYi9jb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfdHlwZTNnbHlwaHMuaApAQCAtOCw2ICs4LDcgQEAKICNkZWZpbmUgQ09SRV9GUERGQVBJX1JFTkRFUl9DUERGX1RZUEUzR0xZUEhTX0hfCiAKICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgogCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKIApAQCAtMjAsMTIgKzIxLDkgQEAKICAgQ1BERl9UeXBlM0dseXBocygpOwogICB+Q1BERl9UeXBlM0dseXBocygpOwogCi0gIHZvaWQgQWRqdXN0Qmx1ZShGWF9GTE9BVCB0b3AsCi0gICAgICAgICAgICAgICAgICBGWF9GTE9BVCBib3R0b20sCi0gICAgICAgICAgICAgICAgICBpbnQmIHRvcF9saW5lLAotICAgICAgICAgICAgICAgICAgaW50JiBib3R0b21fbGluZSk7CisgIHZvaWQgQWRqdXN0Qmx1ZShmbG9hdCB0b3AsIGZsb2F0IGJvdHRvbSwgaW50JiB0b3BfbGluZSwgaW50JiBib3R0b21fbGluZSk7CiAKLSAgc3RkOjptYXA8dWludDMyX3QsIENGWF9HbHlwaEJpdG1hcCo+IG1fR2x5cGhNYXA7CisgIHN0ZDo6bWFwPHVpbnQzMl90LCBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0dseXBoQml0bWFwPj4gbV9HbHlwaE1hcDsKICAgaW50IG1fVG9wQmx1ZVtUWVBFM19NQVhfQkxVRVNdOwogICBpbnQgbV9Cb3R0b21CbHVlW1RZUEUzX01BWF9CTFVFU107CiAgIGludCBtX1RvcEJsdWVDb3VudDsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jbGluZS5jcHAgYi9jb3JlL2ZwZGZkb2MvY2xpbmUuY3BwCmluZGV4IDJlODQ3N2MuLmEyNGI4MTkgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jbGluZS5jcHAKKysrIGIvY29yZS9mcGRmZG9jL2NsaW5lLmNwcApAQCAtOCw2ICs4LDggQEAKIAogQ0xpbmU6OkNMaW5lKCkge30KIAorQ0xpbmU6OkNMaW5lKGNvbnN0IENQVlRfTGluZUluZm8mIGxpbmVpbmZvKSA6IG1fTGluZUluZm8obGluZWluZm8pIHt9CisKIENMaW5lOjp+Q0xpbmUoKSB7fQogCiBDUFZUX1dvcmRQbGFjZSBDTGluZTo6R2V0QmVnaW5Xb3JkUGxhY2UoKSBjb25zdCB7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY2xpbmUuaCBiL2NvcmUvZnBkZmRvYy9jbGluZS5oCmluZGV4IDZmOTViZWIuLjY3YmYwNmIgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jbGluZS5oCisrKyBiL2NvcmUvZnBkZmRvYy9jbGluZS5oCkBAIC0xMCw5ICsxMCwxMCBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcHZ0X2xpbmVpbmZvLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwdnRfd29yZHBsYWNlLmgiCiAKLWNsYXNzIENMaW5lIGZpbmFsIHsKK2NsYXNzIENMaW5lIHsKICBwdWJsaWM6CiAgIENMaW5lKCk7CisgIGV4cGxpY2l0IENMaW5lKGNvbnN0IENQVlRfTGluZUluZm8mIGxpbmVpbmZvKTsKICAgfkNMaW5lKCk7CiAKICAgQ1BWVF9Xb3JkUGxhY2UgR2V0QmVnaW5Xb3JkUGxhY2UoKSBjb25zdDsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jbGluZXMuY3BwIGIvY29yZS9mcGRmZG9jL2NsaW5lcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNDI1ZWEuLjAwMDAwMDAKLS0tIGEvY29yZS9mcGRmZG9jL2NsaW5lcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY2xpbmVzLmgiCi0KLSNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY2xpbmUuaCIKLQotQ0xpbmVzOjpDTGluZXMoKSA6IG1fblRvdGFsKDApIHt9Ci0KLUNMaW5lczo6fkNMaW5lcygpIHsKLSAgUmVtb3ZlQWxsKCk7Ci19Ci0KLWludDMyX3QgQ0xpbmVzOjpHZXRTaXplKCkgY29uc3QgewotICByZXR1cm4gbV9MaW5lcy5HZXRTaXplKCk7Ci19Ci0KLUNMaW5lKiBDTGluZXM6OkdldEF0KGludDMyX3QgbkluZGV4KSBjb25zdCB7Ci0gIHJldHVybiBtX0xpbmVzLkdldEF0KG5JbmRleCk7Ci19Ci0KLXZvaWQgQ0xpbmVzOjpFbXB0eSgpIHsKLSAgbV9uVG90YWwgPSAwOwotfQotCi12b2lkIENMaW5lczo6UmVtb3ZlQWxsKCkgewotICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKLSAgICBkZWxldGUgR2V0QXQoaSk7Ci0gIG1fTGluZXMuUmVtb3ZlQWxsKCk7Ci0gIG1fblRvdGFsID0gMDsKLX0KLQotaW50MzJfdCBDTGluZXM6OkFkZChjb25zdCBDUFZUX0xpbmVJbmZvJiBsaW5laW5mbykgewotICBpZiAobV9uVG90YWwgPj0gR2V0U2l6ZSgpKSB7Ci0gICAgQ0xpbmUqIHBMaW5lID0gbmV3IENMaW5lOwotICAgIHBMaW5lLT5tX0xpbmVJbmZvID0gbGluZWluZm87Ci0gICAgbV9MaW5lcy5BZGQocExpbmUpOwotICB9IGVsc2UgaWYgKENMaW5lKiBwTGluZSA9IEdldEF0KG1fblRvdGFsKSkgewotICAgIHBMaW5lLT5tX0xpbmVJbmZvID0gbGluZWluZm87Ci0gIH0KLSAgcmV0dXJuIG1fblRvdGFsKys7Ci19Ci0KLXZvaWQgQ0xpbmVzOjpDbGVhcigpIHsKLSAgZm9yIChpbnQzMl90IGkgPSBHZXRTaXplKCkgLSAxOyBpID49IG1fblRvdGFsOyBpLS0pIHsKLSAgICBkZWxldGUgR2V0QXQoaSk7Ci0gICAgbV9MaW5lcy5SZW1vdmVBdChpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NsaW5lcy5oIGIvY29yZS9mcGRmZG9jL2NsaW5lcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGRiMGUzLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnBkZmRvYy9jbGluZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBDT1JFX0ZQREZET0NfQ0xJTkVTX0hfCi0jZGVmaW5lIENPUkVfRlBERkRPQ19DTElORVNfSF8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwdnRfYXJyYXl0ZW1wbGF0ZS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcHZ0X2xpbmVpbmZvLmgiCi0KLWNsYXNzIENMaW5lOwotCi1jbGFzcyBDTGluZXMgZmluYWwgewotIHB1YmxpYzoKLSAgQ0xpbmVzKCk7Ci0gIH5DTGluZXMoKTsKLQotICBpbnQzMl90IEdldFNpemUoKSBjb25zdDsKLSAgQ0xpbmUqIEdldEF0KGludDMyX3QgbkluZGV4KSBjb25zdDsKLQotICB2b2lkIEVtcHR5KCk7Ci0gIHZvaWQgUmVtb3ZlQWxsKCk7Ci0gIGludDMyX3QgQWRkKGNvbnN0IENQVlRfTGluZUluZm8mIGxpbmVpbmZvKTsKLSAgdm9pZCBDbGVhcigpOwotCi0gcHJpdmF0ZToKLSAgQ1BWVF9BcnJheVRlbXBsYXRlPENMaW5lKj4gbV9MaW5lczsKLSAgaW50MzJfdCBtX25Ub3RhbDsKLX07Ci0KLSNlbmRpZiAgLy8gQ09SRV9GUERGRE9DX0NMSU5FU19IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwZGZfYWFjdGlvbi5jcHAgYi9jb3JlL2ZwZGZkb2MvY3BkZl9hYWN0aW9uLmNwcAppbmRleCAzOTEyMGZjLi4yNjI4Y2EwIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZkb2MvY3BkZl9hYWN0aW9uLmNwcAorKysgYi9jb3JlL2ZwZGZkb2MvY3BkZl9hYWN0aW9uLmNwcApAQCAtOCwxNyArOCw0NyBAQAogCiBuYW1lc3BhY2UgewogCi1jb25zdCBGWF9DSEFSKiBnX3NBQVR5cGVzW10gPSB7IkUiLCAgIlgiLCAgIkQiLCAgIlUiLCAgIkZvIiwgIkJsIiwgIlBPIiwgIlBDIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUFYiLCAiUEkiLCAiTyIsICAiQyIsICAiSyIsICAiRiIsICAiViIsICAiQyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldDIiwgIldTIiwgIkRTIiwgIldQIiwgIkRQIiwgIiJ9OworY29uc3RleHByIGNvbnN0IGNoYXIqIGdfc0FBVHlwZXNbXSA9IHsKKyAgICAiRSIsICAgLy8gQ3Vyc29yRW50ZXIKKyAgICAiWCIsICAgLy8gQ3Vyc29yRXhpdAorICAgICJEIiwgICAvLyBCdXR0b25Eb3duCisgICAgIlUiLCAgIC8vIEJ1dHRvblVwCisgICAgIkZvIiwgIC8vIEdldEZvY3VzCisgICAgIkJsIiwgIC8vIExvc2VGb2N1cworICAgICJQTyIsICAvLyBQYWdlT3BlbgorICAgICJQQyIsICAvLyBQYWdlQ2xvc2UKKyAgICAiUFYiLCAgLy8gUGFnZVZpc2libGUKKyAgICAiUEkiLCAgLy8gUGFnZUludmlzaWJsZQorICAgICJPIiwgICAvLyBPcGVuUGFnZQorICAgICJDIiwgICAvLyBDbG9zZVBhZ2UKKyAgICAiSyIsICAgLy8gS2V5U3Ryb2tlCisgICAgIkYiLCAgIC8vIEZvcm1hdAorICAgICJWIiwgICAvLyBWYWxpZGF0ZQorICAgICJDIiwgICAvLyBDYWxjdWxhdGUKKyAgICAiV0MiLCAgLy8gQ2xvc2VEb2N1bWVudAorICAgICJXUyIsICAvLyBTYXZlRG9jdW1lbnQKKyAgICAiRFMiLCAgLy8gRG9jdW1lbnRTYXZlZAorICAgICJXUCIsICAvLyBQcmludERvY3VtZW50CisgICAgIkRQIiwgIC8vIERvY3VtZW50UHJpbnRlZAorfTsKKworLy8gfGdfc0FBVHlwZXN8IHNob3VsZCBoYXZlIGFzIG1hbnkgZWxlbWVudHMgYXMgZW51bSBBQWN0aW9uVHlwZS4KK3N0YXRpY19hc3NlcnQoRlhfQXJyYXlTaXplKGdfc0FBVHlwZXMpID09IENQREZfQUFjdGlvbjo6TnVtYmVyT2ZBY3Rpb25zLAorICAgICAgICAgICAgICAiZ19zQUFUeXBlcyBjb3VudCBtaXNtYXRjaCIpOwogCiB9ICAvLyBuYW1lc3BhY2UKIAorQ1BERl9BQWN0aW9uOjpDUERGX0FBY3Rpb24oQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgOiBtX3BEaWN0KHBEaWN0KSB7fQorCitDUERGX0FBY3Rpb246OkNQREZfQUFjdGlvbihjb25zdCBDUERGX0FBY3Rpb24mIHRoYXQpID0gZGVmYXVsdDsKKworQ1BERl9BQWN0aW9uOjp+Q1BERl9BQWN0aW9uKCkge30KKwogYm9vbCBDUERGX0FBY3Rpb246OkFjdGlvbkV4aXN0KEFBY3Rpb25UeXBlIGVUeXBlKSBjb25zdCB7CiAgIHJldHVybiBtX3BEaWN0ICYmIG1fcERpY3QtPktleUV4aXN0KGdfc0FBVHlwZXNbZVR5cGVdKTsKIH0KIAogQ1BERl9BY3Rpb24gQ1BERl9BQWN0aW9uOjpHZXRBY3Rpb24oQUFjdGlvblR5cGUgZVR5cGUpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcERpY3QgPyBDUERGX0FjdGlvbihtX3BEaWN0LT5HZXREaWN0Rm9yKGdfc0FBVHlwZXNbZVR5cGVdKSkKLSAgICAgICAgICAgICAgICAgOiBDUERGX0FjdGlvbigpOworICByZXR1cm4gQ1BERl9BY3Rpb24obV9wRGljdCA/IG1fcERpY3QtPkdldERpY3RGb3IoZ19zQUFUeXBlc1tlVHlwZV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cik7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3BkZl9hYWN0aW9uLmggYi9jb3JlL2ZwZGZkb2MvY3BkZl9hYWN0aW9uLmgKaW5kZXggZDYxNTkxNS4uYTViMGQyNSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfYWFjdGlvbi5oCisrKyBiL2NvcmUvZnBkZmRvYy9jcGRmX2FhY3Rpb24uaApAQCAtMzQsMTggKzM0LDIwIEBACiAgICAgU2F2ZURvY3VtZW50LAogICAgIERvY3VtZW50U2F2ZWQsCiAgICAgUHJpbnREb2N1bWVudCwKLSAgICBEb2N1bWVudFByaW50ZWQKKyAgICBEb2N1bWVudFByaW50ZWQsCisgICAgTnVtYmVyT2ZBY3Rpb25zICAvLyBNdXN0IGJlIGxhc3QuCiAgIH07CiAKLSAgQ1BERl9BQWN0aW9uKCkgOiBtX3BEaWN0KG51bGxwdHIpIHt9Ci0gIGV4cGxpY2l0IENQREZfQUFjdGlvbihDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSA6IG1fcERpY3QocERpY3QpIHt9CisgIGV4cGxpY2l0IENQREZfQUFjdGlvbihDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKKyAgQ1BERl9BQWN0aW9uKGNvbnN0IENQREZfQUFjdGlvbiYgdGhhdCk7CisgIH5DUERGX0FBY3Rpb24oKTsKIAogICBib29sIEFjdGlvbkV4aXN0KEFBY3Rpb25UeXBlIGVUeXBlKSBjb25zdDsKICAgQ1BERl9BY3Rpb24gR2V0QWN0aW9uKEFBY3Rpb25UeXBlIGVUeXBlKSBjb25zdDsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBHZXREaWN0KCkgY29uc3QgeyByZXR1cm4gbV9wRGljdDsgfQorICBDUERGX0RpY3Rpb25hcnkqIEdldERpY3QoKSBjb25zdCB7IHJldHVybiBtX3BEaWN0LkdldCgpOyB9CiAKICBwcml2YXRlOgotICBDUERGX0RpY3Rpb25hcnkqIGNvbnN0IG1fcERpY3Q7CisgIFVub3duZWRQdHI8Q1BERl9EaWN0aW9uYXJ5PiBjb25zdCBtX3BEaWN0OwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZET0NfQ1BERl9BQUNUSU9OX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3BkZl9hY3Rpb24uY3BwIGIvY29yZS9mcGRmZG9jL2NwZGZfYWN0aW9uLmNwcAppbmRleCBkYWJjMGJiLi4zODNmMzI4IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZkb2MvY3BkZl9hY3Rpb24uY3BwCisrKyBiL2NvcmUvZnBkZmRvYy9jcGRmX2FjdGlvbi5jcHAKQEAgLTEzLDcgKzEzLDcgQEAKIAogbmFtZXNwYWNlIHsKIAotY29uc3QgRlhfQ0hBUiogY29uc3QgZ19zQVR5cGVzW10gPSB7Citjb25zdCBjaGFyKiBjb25zdCBnX3NBVHlwZXNbXSA9IHsKICAgICAiVW5rbm93biIsICAgICAiR29UbyIsICAgICAgICJHb1RvUiIsICAgICAiR29Ub0UiLCAgICAgICJMYXVuY2giLAogICAgICJUaHJlYWQiLCAgICAgICJVUkkiLCAgICAgICAgIlNvdW5kIiwgICAgICJNb3ZpZSIsICAgICAgIkhpZGUiLAogICAgICJOYW1lZCIsICAgICAgICJTdWJtaXRGb3JtIiwgIlJlc2V0Rm9ybSIsICJJbXBvcnREYXRhIiwgIkphdmFTY3JpcHQiLApAQCAtMjEsMTEgKzIxLDE3IEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCitDUERGX0FjdGlvbjo6Q1BERl9BY3Rpb24oQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgOiBtX3BEaWN0KHBEaWN0KSB7fQorCitDUERGX0FjdGlvbjo6Q1BERl9BY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIHRoYXQpID0gZGVmYXVsdDsKKworQ1BERl9BY3Rpb246On5DUERGX0FjdGlvbigpIHt9CisKIENQREZfRGVzdCBDUERGX0FjdGlvbjo6R2V0RGVzdChDUERGX0RvY3VtZW50KiBwRG9jKSBjb25zdCB7CiAgIGlmICghbV9wRGljdCkKICAgICByZXR1cm4gQ1BERl9EZXN0KCk7CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgdHlwZSA9IG1fcERpY3QtPkdldFN0cmluZ0ZvcigiUyIpOworICBCeXRlU3RyaW5nIHR5cGUgPSBtX3BEaWN0LT5HZXRTdHJpbmdGb3IoIlMiKTsKICAgaWYgKHR5cGUgIT0gIkdvVG8iICYmIHR5cGUgIT0gIkdvVG9SIikKICAgICByZXR1cm4gQ1BERl9EZXN0KCk7CiAKQEAgLTM0LDcgKzQwLDcgQEAKICAgICByZXR1cm4gQ1BERl9EZXN0KCk7CiAgIGlmIChwRGVzdC0+SXNTdHJpbmcoKSB8fCBwRGVzdC0+SXNOYW1lKCkpIHsKICAgICBDUERGX05hbWVUcmVlIG5hbWVfdHJlZShwRG9jLCAiRGVzdHMiKTsKLSAgICByZXR1cm4gQ1BERl9EZXN0KG5hbWVfdHJlZS5Mb29rdXBOYW1lZERlc3QocERvYywgcERlc3QtPkdldFN0cmluZygpKSk7CisgICAgcmV0dXJuIENQREZfRGVzdChuYW1lX3RyZWUuTG9va3VwTmFtZWREZXN0KHBEb2MsIHBEZXN0LT5HZXRVbmljb2RlVGV4dCgpKSk7CiAgIH0KICAgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IHBEZXN0LT5Bc0FycmF5KCkpCiAgICAgcmV0dXJuIENQREZfRGVzdChwQXJyYXkpOwpAQCAtNDYsNyArNTIsNyBAQAogICBpZiAoIW1fcERpY3QpCiAgICAgcmV0dXJuIFVua25vd247CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgY3NUeXBlID0gbV9wRGljdC0+R2V0U3RyaW5nRm9yKCJTIik7CisgIEJ5dGVTdHJpbmcgY3NUeXBlID0gbV9wRGljdC0+R2V0U3RyaW5nRm9yKCJTIik7CiAgIGlmIChjc1R5cGUuSXNFbXB0eSgpKQogICAgIHJldHVybiBVbmtub3duOwogCkBAIC01Nyw1MCArNjMsNDYgQEAKICAgcmV0dXJuIFVua25vd247CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQREZfQWN0aW9uOjpHZXRGaWxlUGF0aCgpIGNvbnN0IHsKLSAgQ0ZYX0J5dGVTdHJpbmcgdHlwZSA9IG1fcERpY3QtPkdldFN0cmluZ0ZvcigiUyIpOworV2lkZVN0cmluZyBDUERGX0FjdGlvbjo6R2V0RmlsZVBhdGgoKSBjb25zdCB7CisgIEJ5dGVTdHJpbmcgdHlwZSA9IG1fcERpY3QtPkdldFN0cmluZ0ZvcigiUyIpOwogICBpZiAodHlwZSAhPSAiR29Ub1IiICYmIHR5cGUgIT0gIkxhdW5jaCIgJiYgdHlwZSAhPSAiU3VibWl0Rm9ybSIgJiYKICAgICAgIHR5cGUgIT0gIkltcG9ydERhdGEiKSB7Ci0gICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CisgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKICAgfQogCiAgIENQREZfT2JqZWN0KiBwRmlsZSA9IG1fcERpY3QtPkdldERpcmVjdE9iamVjdEZvcigiRiIpOwotICBDRlhfV2lkZVN0cmluZyBwYXRoOwotICBpZiAoIXBGaWxlKSB7Ci0gICAgaWYgKHR5cGUgPT0gIkxhdW5jaCIpIHsKLSAgICAgIENQREZfRGljdGlvbmFyeSogcFdpbkRpY3QgPSBtX3BEaWN0LT5HZXREaWN0Rm9yKCJXaW4iKTsKLSAgICAgIGlmIChwV2luRGljdCkgewotICAgICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbCgKLSAgICAgICAgICAgIHBXaW5EaWN0LT5HZXRTdHJpbmdGb3IoIkYiKS5Bc1N0cmluZ0MoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwYXRoOwotICB9CisgIGlmIChwRmlsZSkKKyAgICByZXR1cm4gQ1BERl9GaWxlU3BlYyhwRmlsZSkuR2V0RmlsZU5hbWUoKTsKIAotICBDUERGX0ZpbGVTcGVjIGZpbGVzcGVjKHBGaWxlKTsKLSAgZmlsZXNwZWMuR2V0RmlsZU5hbWUoJnBhdGgpOwotICByZXR1cm4gcGF0aDsKKyAgaWYgKHR5cGUgPT0gIkxhdW5jaCIpIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBXaW5EaWN0ID0gbV9wRGljdC0+R2V0RGljdEZvcigiV2luIik7CisgICAgaWYgKHBXaW5EaWN0KSB7CisgICAgICByZXR1cm4gV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBXaW5EaWN0LT5HZXRTdHJpbmdGb3IoIkYiKS5Bc1N0cmluZ1ZpZXcoKSk7CisgICAgfQorICB9CisgIHJldHVybiBXaWRlU3RyaW5nKCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQREZfQWN0aW9uOjpHZXRVUkkoQ1BERl9Eb2N1bWVudCogcERvYykgY29uc3QgewotICBDRlhfQnl0ZVN0cmluZyBjc1VSSTsKK0J5dGVTdHJpbmcgQ1BERl9BY3Rpb246OkdldFVSSShjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jKSBjb25zdCB7CisgIEJ5dGVTdHJpbmcgY3NVUkk7CiAgIGlmICghbV9wRGljdCkKICAgICByZXR1cm4gY3NVUkk7CiAgIGlmIChtX3BEaWN0LT5HZXRTdHJpbmdGb3IoIlMiKSAhPSAiVVJJIikKICAgICByZXR1cm4gY3NVUkk7CiAKICAgY3NVUkkgPSBtX3BEaWN0LT5HZXRTdHJpbmdGb3IoIlVSSSIpOwotICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gcERvYy0+R2V0Um9vdCgpOworICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gcERvYy0+R2V0Um9vdCgpOwogICBDUERGX0RpY3Rpb25hcnkqIHBVUkkgPSBwUm9vdC0+R2V0RGljdEZvcigiVVJJIik7CiAgIGlmIChwVVJJKSB7Ci0gICAgaWYgKGNzVVJJLkZpbmQoIjoiLCAwKSA8IDEpCisgICAgYXV0byByZXN1bHQgPSBjc1VSSS5GaW5kKCI6Iik7CisgICAgaWYgKCFyZXN1bHQuaGFzX3ZhbHVlKCkgfHwgcmVzdWx0LnZhbHVlKCkgPT0gMCkKICAgICAgIGNzVVJJID0gcFVSSS0+R2V0U3RyaW5nRm9yKCJCYXNlIikgKyBjc1VSSTsKICAgfQogICByZXR1cm4gY3NVUkk7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQREZfQWN0aW9uOjpHZXRKYXZhU2NyaXB0KCkgY29uc3QgewotICBDRlhfV2lkZVN0cmluZyBjc0pTOworV2lkZVN0cmluZyBDUERGX0FjdGlvbjo6R2V0SmF2YVNjcmlwdCgpIGNvbnN0IHsKKyAgV2lkZVN0cmluZyBjc0pTOwogICBpZiAoIW1fcERpY3QpCiAgICAgcmV0dXJuIGNzSlM7CiAKQEAgLTEyNCwxNCArMTI2LDE0IEBACiAKIENQREZfQWN0aW9uIENQREZfQWN0aW9uOjpHZXRTdWJBY3Rpb24oc2l6ZV90IGlJbmRleCkgY29uc3QgewogICBpZiAoIW1fcERpY3QgfHwgIW1fcERpY3QtPktleUV4aXN0KCJOZXh0IikpCi0gICAgcmV0dXJuIENQREZfQWN0aW9uKCk7CisgICAgcmV0dXJuIENQREZfQWN0aW9uKG51bGxwdHIpOwogCiAgIENQREZfT2JqZWN0KiBwTmV4dCA9IG1fcERpY3QtPkdldERpcmVjdE9iamVjdEZvcigiTmV4dCIpOworICBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gVG9BcnJheShwTmV4dCkpCisgICAgcmV0dXJuIENQREZfQWN0aW9uKHBBcnJheS0+R2V0RGljdEF0KGlJbmRleCkpOwogICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IFRvRGljdGlvbmFyeShwTmV4dCkpIHsKICAgICBpZiAoaUluZGV4ID09IDApCiAgICAgICByZXR1cm4gQ1BERl9BY3Rpb24ocERpY3QpOwotICB9IGVsc2UgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IFRvQXJyYXkocE5leHQpKSB7Ci0gICAgcmV0dXJuIENQREZfQWN0aW9uKHBBcnJheS0+R2V0RGljdEF0KGlJbmRleCkpOwogICB9Ci0gIHJldHVybiBDUERGX0FjdGlvbigpOworICByZXR1cm4gQ1BERl9BY3Rpb24obnVsbHB0cik7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3BkZl9hY3Rpb24uaCBiL2NvcmUvZnBkZmRvYy9jcGRmX2FjdGlvbi5oCmluZGV4IDQyNmVkYjEuLjFkOWI3MjIgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jcGRmX2FjdGlvbi5oCisrKyBiL2NvcmUvZnBkZmRvYy9jcGRmX2FjdGlvbi5oCkBAIC0zNywyMyArMzcsMjQgQEAKICAgICBHb1RvM0RWaWV3CiAgIH07CiAKLSAgQ1BERl9BY3Rpb24oKSA6IG1fcERpY3QobnVsbHB0cikge30KLSAgZXhwbGljaXQgQ1BERl9BY3Rpb24oQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgOiBtX3BEaWN0KHBEaWN0KSB7fQorICBleHBsaWNpdCBDUERGX0FjdGlvbihDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKKyAgQ1BERl9BY3Rpb24oY29uc3QgQ1BERl9BY3Rpb24mIHRoYXQpOworICB+Q1BERl9BY3Rpb24oKTsKIAotICBDUERGX0RpY3Rpb25hcnkqIEdldERpY3QoKSBjb25zdCB7IHJldHVybiBtX3BEaWN0OyB9CisgIENQREZfRGljdGlvbmFyeSogR2V0RGljdCgpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3QuR2V0KCk7IH0KICAgQWN0aW9uVHlwZSBHZXRUeXBlKCkgY29uc3Q7CiAgIENQREZfRGVzdCBHZXREZXN0KENQREZfRG9jdW1lbnQqIHBEb2MpIGNvbnN0OwotICBDRlhfV2lkZVN0cmluZyBHZXRGaWxlUGF0aCgpIGNvbnN0OwotICBDRlhfQnl0ZVN0cmluZyBHZXRVUkkoQ1BERl9Eb2N1bWVudCogcERvYykgY29uc3Q7CisgIFdpZGVTdHJpbmcgR2V0RmlsZVBhdGgoKSBjb25zdDsKKyAgQnl0ZVN0cmluZyBHZXRVUkkoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvYykgY29uc3Q7CiAgIGJvb2wgR2V0SGlkZVN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3QtPkdldEJvb2xlYW5Gb3IoIkgiLCB0cnVlKTsgfQotICBDRlhfQnl0ZVN0cmluZyBHZXROYW1lZEFjdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3QtPkdldFN0cmluZ0ZvcigiTiIpOyB9CisgIEJ5dGVTdHJpbmcgR2V0TmFtZWRBY3Rpb24oKSBjb25zdCB7IHJldHVybiBtX3BEaWN0LT5HZXRTdHJpbmdGb3IoIk4iKTsgfQogICB1aW50MzJfdCBHZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3QtPkdldEludGVnZXJGb3IoIkZsYWdzIik7IH0KLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0SmF2YVNjcmlwdCgpIGNvbnN0OworICBXaWRlU3RyaW5nIEdldEphdmFTY3JpcHQoKSBjb25zdDsKICAgc2l6ZV90IEdldFN1YkFjdGlvbnNDb3VudCgpIGNvbnN0OwogICBDUERGX0FjdGlvbiBHZXRTdWJBY3Rpb24oc2l6ZV90IGlJbmRleCkgY29uc3Q7CiAKICBwcml2YXRlOgotICBDUERGX0RpY3Rpb25hcnkqIGNvbnN0IG1fcERpY3Q7CisgIFVub3duZWRQdHI8Q1BERl9EaWN0aW9uYXJ5PiBjb25zdCBtX3BEaWN0OwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZET0NfQ1BERl9BQ1RJT05fSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jcGRmX2FjdGlvbmZpZWxkcy5jcHAgYi9jb3JlL2ZwZGZkb2MvY3BkZl9hY3Rpb25maWVsZHMuY3BwCmluZGV4IDM1ZWM5MmMuLmNlZTI1NmQgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jcGRmX2FjdGlvbmZpZWxkcy5jcHAKKysrIGIvY29yZS9mcGRmZG9jL2NwZGZfYWN0aW9uZmllbGRzLmNwcApAQCAtMTAsNiArMTAsMTEgQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2FjdGlvbi5oIgogCitDUERGX0FjdGlvbkZpZWxkczo6Q1BERl9BY3Rpb25GaWVsZHMoY29uc3QgQ1BERl9BY3Rpb24qIHBBY3Rpb24pCisgICAgOiBtX3BBY3Rpb24ocEFjdGlvbikge30KKworQ1BERl9BY3Rpb25GaWVsZHM6On5DUERGX0FjdGlvbkZpZWxkcygpIHt9CisKIHNpemVfdCBDUERGX0FjdGlvbkZpZWxkczo6R2V0RmllbGRzQ291bnQoKSBjb25zdCB7CiAgIGlmICghbV9wQWN0aW9uKQogICAgIHJldHVybiAwOwpAQCAtMTgsNyArMjMsNyBAQAogICBpZiAoIXBEaWN0KQogICAgIHJldHVybiAwOwogCi0gIENGWF9CeXRlU3RyaW5nIGNzVHlwZSA9IHBEaWN0LT5HZXRTdHJpbmdGb3IoIlMiKTsKKyAgQnl0ZVN0cmluZyBjc1R5cGUgPSBwRGljdC0+R2V0U3RyaW5nRm9yKCJTIik7CiAgIENQREZfT2JqZWN0KiBwRmllbGRzID0gbnVsbHB0cjsKICAgaWYgKGNzVHlwZSA9PSAiSGlkZSIpCiAgICAgcEZpZWxkcyA9IHBEaWN0LT5HZXREaXJlY3RPYmplY3RGb3IoIlQiKTsKQEAgLTQ1LDcgKzUwLDcgQEAKICAgaWYgKCFwRGljdCkKICAgICByZXR1cm4gZmllbGRzOwogCi0gIENGWF9CeXRlU3RyaW5nIGNzVHlwZSA9IHBEaWN0LT5HZXRTdHJpbmdGb3IoIlMiKTsKKyAgQnl0ZVN0cmluZyBjc1R5cGUgPSBwRGljdC0+R2V0U3RyaW5nRm9yKCJTIik7CiAgIENQREZfT2JqZWN0KiBwRmllbGRzOwogICBpZiAoY3NUeXBlID09ICJIaWRlIikKICAgICBwRmllbGRzID0gcERpY3QtPkdldERpcmVjdE9iamVjdEZvcigiVCIpOwpAQCAtNzUsNyArODAsNyBAQAogICBpZiAoIXBEaWN0KQogICAgIHJldHVybiBudWxscHRyOwogCi0gIENGWF9CeXRlU3RyaW5nIGNzVHlwZSA9IHBEaWN0LT5HZXRTdHJpbmdGb3IoIlMiKTsKKyAgQnl0ZVN0cmluZyBjc1R5cGUgPSBwRGljdC0+R2V0U3RyaW5nRm9yKCJTIik7CiAgIENQREZfT2JqZWN0KiBwRmllbGRzID0gbnVsbHB0cjsKICAgaWYgKGNzVHlwZSA9PSAiSGlkZSIpCiAgICAgcEZpZWxkcyA9IHBEaWN0LT5HZXREaXJlY3RPYmplY3RGb3IoIlQiKTsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jcGRmX2FjdGlvbmZpZWxkcy5oIGIvY29yZS9mcGRmZG9jL2NwZGZfYWN0aW9uZmllbGRzLmgKaW5kZXggOWUwNjY0Yy4uODNjNzBmNiAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfYWN0aW9uZmllbGRzLmgKKysrIGIvY29yZS9mcGRmZG9jL2NwZGZfYWN0aW9uZmllbGRzLmgKQEAgLTExLDE5ICsxMSwyMiBAQAogCiAjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgorCiBjbGFzcyBDUERGX0FjdGlvbjsKIGNsYXNzIENQREZfT2JqZWN0OwogCiBjbGFzcyBDUERGX0FjdGlvbkZpZWxkcyB7CiAgcHVibGljOgotICBleHBsaWNpdCBDUERGX0FjdGlvbkZpZWxkcyhjb25zdCBDUERGX0FjdGlvbiogcEFjdGlvbikgOiBtX3BBY3Rpb24ocEFjdGlvbikge30KKyAgZXhwbGljaXQgQ1BERl9BY3Rpb25GaWVsZHMoY29uc3QgQ1BERl9BY3Rpb24qIHBBY3Rpb24pOworICB+Q1BERl9BY3Rpb25GaWVsZHMoKTsKIAogICBzaXplX3QgR2V0RmllbGRzQ291bnQoKSBjb25zdDsKICAgc3RkOjp2ZWN0b3I8Q1BERl9PYmplY3QqPiBHZXRBbGxGaWVsZHMoKSBjb25zdDsKICAgQ1BERl9PYmplY3QqIEdldEZpZWxkKHNpemVfdCBpSW5kZXgpIGNvbnN0OwogCiAgcHJpdmF0ZToKLSAgY29uc3QgQ1BERl9BY3Rpb24qIGNvbnN0IG1fcEFjdGlvbjsKKyAgVW5vd25lZFB0cjxjb25zdCBDUERGX0FjdGlvbj4gY29uc3QgbV9wQWN0aW9uOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZET0NfQ1BERl9BQ1RJT05GSUVMRFNfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jcGRmX2Fubm90LmNwcCBiL2NvcmUvZnBkZmRvYy9jcGRmX2Fubm90LmNwcAppbmRleCA4OWM0Nzg1Li4wMmRmM2NmIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZkb2MvY3BkZl9hbm5vdC5jcHAKKysrIGIvY29yZS9mcGRmZG9jL2NwZGZfYW5ub3QuY3BwCkBAIC0zNCw5ICszNCwxMCBAQAogfQogCiBib29sIFNob3VsZEdlbmVyYXRlQVBGb3JBbm5vdGF0aW9uKENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkgewotICAvLyBJZiBBUCBkaWN0aW9uYXJ5IGV4aXN0cywgd2UgdXNlIHRoZSBhcHBlYXJhbmNlIGRlZmluZWQgaW4gdGhlCi0gIC8vIGV4aXN0aW5nIEFQIGRpY3Rpb25hcnkuCi0gIGlmIChwQW5ub3REaWN0LT5LZXlFeGlzdCgiQVAiKSkKKyAgLy8gSWYgQVAgZGljdGlvbmFyeSBleGlzdHMgYW5kIGRlZmluZXMgYW4gYXBwZWFyYW5jZSBmb3Igbm9ybWFsIG1vZGUsIHdlIHVzZQorICAvLyB0aGUgYXBwZWFyYW5jZSBkZWZpbmVkIGluIHRoZSBleGlzdGluZyBBUCBkaWN0aW9uYXJ5LgorICBDUERGX0RpY3Rpb25hcnkqIHBBUCA9IHBBbm5vdERpY3QtPkdldERpY3RGb3IoIkFQIik7CisgIGlmIChwQVAgJiYgcEFQLT5HZXREaWN0Rm9yKCJOIikpCiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIHJldHVybiAhQ1BERl9Bbm5vdDo6SXNBbm5vdGF0aW9uSGlkZGVuKHBBbm5vdERpY3QpOwpAQCAtNTEsMTQgKzUyLDUxIEBACiAgIGlmICghcEZvcm0pCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgQ0ZYX0Zsb2F0UmVjdCBmb3JtX2Jib3ggPSBwRm9ybS0+bV9wRm9ybURpY3QtPkdldFJlY3RGb3IoIkJCb3giKTsKICAgQ0ZYX01hdHJpeCBmb3JtX21hdHJpeCA9IHBGb3JtLT5tX3BGb3JtRGljdC0+R2V0TWF0cml4Rm9yKCJNYXRyaXgiKTsKLSAgZm9ybV9tYXRyaXguVHJhbnNmb3JtUmVjdChmb3JtX2Jib3gpOworICBDRlhfRmxvYXRSZWN0IGZvcm1fYmJveCA9CisgICAgICBmb3JtX21hdHJpeC5UcmFuc2Zvcm1SZWN0KHBGb3JtLT5tX3BGb3JtRGljdC0+R2V0UmVjdEZvcigiQkJveCIpKTsKICAgbWF0cml4LT5NYXRjaFJlY3QocEFubm90LT5HZXRSZWN0KCksIGZvcm1fYmJveCk7CiAgIG1hdHJpeC0+Q29uY2F0KCpwVXNlcjJEZXZpY2UpOwogICByZXR1cm4gcEZvcm07CiB9CiAKK0NQREZfU3RyZWFtKiBGUERGRE9DX0dldEFubm90QVBJbnRlcm5hbChjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmFsbGJhY2tUb05vcm1hbCkgeworICBDUERGX0RpY3Rpb25hcnkqIHBBUCA9IHBBbm5vdERpY3QtPkdldERpY3RGb3IoIkFQIik7CisgIGlmICghcEFQKQorICAgIHJldHVybiBudWxscHRyOworCisgIGNvbnN0IGNoYXIqIGFwX2VudHJ5ID0gIk4iOworICBpZiAoZU1vZGUgPT0gQ1BERl9Bbm5vdDo6RG93bikKKyAgICBhcF9lbnRyeSA9ICJEIjsKKyAgZWxzZSBpZiAoZU1vZGUgPT0gQ1BERl9Bbm5vdDo6Um9sbG92ZXIpCisgICAgYXBfZW50cnkgPSAiUiI7CisgIGlmIChiRmFsbGJhY2tUb05vcm1hbCAmJiAhcEFQLT5LZXlFeGlzdChhcF9lbnRyeSkpCisgICAgYXBfZW50cnkgPSAiTiI7CisKKyAgQ1BERl9PYmplY3QqIHBzdWIgPSBwQVAtPkdldERpcmVjdE9iamVjdEZvcihhcF9lbnRyeSk7CisgIGlmICghcHN1YikKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgaWYgKENQREZfU3RyZWFtKiBwU3RyZWFtID0gcHN1Yi0+QXNTdHJlYW0oKSkKKyAgICByZXR1cm4gcFN0cmVhbTsKKworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcHN1Yi0+QXNEaWN0aW9uYXJ5KCk7CisgIGlmICghcERpY3QpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQnl0ZVN0cmluZyBhcyA9IHBBbm5vdERpY3QtPkdldFN0cmluZ0ZvcigiQVMiKTsKKyAgaWYgKGFzLklzRW1wdHkoKSkgeworICAgIEJ5dGVTdHJpbmcgdmFsdWUgPSBwQW5ub3REaWN0LT5HZXRTdHJpbmdGb3IoIlYiKTsKKyAgICBpZiAodmFsdWUuSXNFbXB0eSgpKSB7CisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYXJlbnREaWN0ID0gcEFubm90RGljdC0+R2V0RGljdEZvcigiUGFyZW50Iik7CisgICAgICB2YWx1ZSA9IHBQYXJlbnREaWN0ID8gcFBhcmVudERpY3QtPkdldFN0cmluZ0ZvcigiViIpIDogQnl0ZVN0cmluZygpOworICAgIH0KKyAgICBhcyA9ICghdmFsdWUuSXNFbXB0eSgpICYmIHBEaWN0LT5LZXlFeGlzdCh2YWx1ZSkpID8gdmFsdWUgOiAiT2ZmIjsKKyAgfQorICByZXR1cm4gcERpY3QtPkdldFN0cmVhbUZvcihhcyk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZQogCiBDUERGX0Fubm90OjpDUERGX0Fubm90KHN0ZDo6dW5pcXVlX3B0cjxDUERGX0RpY3Rpb25hcnk+IHBEaWN0LApAQCAtODYsMzIgKzEyNCwxMyBAQAogdm9pZCBDUERGX0Fubm90OjpHZW5lcmF0ZUFQSWZOZWVkZWQoKSB7CiAgIGlmICghU2hvdWxkR2VuZXJhdGVBUEZvckFubm90YXRpb24obV9wQW5ub3REaWN0LkdldCgpKSkKICAgICByZXR1cm47Ci0KLSAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcEFubm90RGljdC5HZXQoKTsKLSAgYm9vbCByZXN1bHQgPSBmYWxzZTsKLSAgaWYgKG1fblN1YnR5cGUgPT0gQ1BERl9Bbm5vdDo6U3VidHlwZTo6Q0lSQ0xFKQotICAgIHJlc3VsdCA9IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDaXJjbGVBUChtX3BEb2N1bWVudCwgcERpY3QpOwotICBlbHNlIGlmIChtX25TdWJ0eXBlID09IENQREZfQW5ub3Q6OlN1YnR5cGU6OkhJR0hMSUdIVCkKLSAgICByZXN1bHQgPSBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlSGlnaGxpZ2h0QVAobV9wRG9jdW1lbnQsIHBEaWN0KTsKLSAgZWxzZSBpZiAobV9uU3VidHlwZSA9PSBDUERGX0Fubm90OjpTdWJ0eXBlOjpJTkspCi0gICAgcmVzdWx0ID0gQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUlua0FQKG1fcERvY3VtZW50LCBwRGljdCk7Ci0gIGVsc2UgaWYgKG1fblN1YnR5cGUgPT0gQ1BERl9Bbm5vdDo6U3VidHlwZTo6UE9QVVApCi0gICAgcmVzdWx0ID0gQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZVBvcHVwQVAobV9wRG9jdW1lbnQsIHBEaWN0KTsKLSAgZWxzZSBpZiAobV9uU3VidHlwZSA9PSBDUERGX0Fubm90OjpTdWJ0eXBlOjpTUVVBUkUpCi0gICAgcmVzdWx0ID0gQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZVNxdWFyZUFQKG1fcERvY3VtZW50LCBwRGljdCk7Ci0gIGVsc2UgaWYgKG1fblN1YnR5cGUgPT0gQ1BERl9Bbm5vdDo6U3VidHlwZTo6U1FVSUdHTFkpCi0gICAgcmVzdWx0ID0gQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZVNxdWlnZ2x5QVAobV9wRG9jdW1lbnQsIHBEaWN0KTsKLSAgZWxzZSBpZiAobV9uU3VidHlwZSA9PSBDUERGX0Fubm90OjpTdWJ0eXBlOjpTVFJJS0VPVVQpCi0gICAgcmVzdWx0ID0gQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZVN0cmlrZU91dEFQKG1fcERvY3VtZW50LCBwRGljdCk7Ci0gIGVsc2UgaWYgKG1fblN1YnR5cGUgPT0gQ1BERl9Bbm5vdDo6U3VidHlwZTo6VEVYVCkKLSAgICByZXN1bHQgPSBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlVGV4dEFQKG1fcERvY3VtZW50LCBwRGljdCk7Ci0gIGVsc2UgaWYgKG1fblN1YnR5cGUgPT0gQ1BERl9Bbm5vdDo6U3VidHlwZTo6VU5ERVJMSU5FKQotICAgIHJlc3VsdCA9IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVVbmRlcmxpbmVBUChtX3BEb2N1bWVudCwgcERpY3QpOwotCi0gIGlmIChyZXN1bHQpIHsKLSAgICBtX3BBbm5vdERpY3QtPlNldE5ld0ZvcjxDUERGX0Jvb2xlYW4+KGtQREZpdW1LZXlfSGFzR2VuZXJhdGVkQVAsIHJlc3VsdCk7Ci0gICAgbV9iSGFzR2VuZXJhdGVkQVAgPSByZXN1bHQ7CisgIGlmICghQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUFubm90QVAobV9uU3VidHlwZSwgbV9wRG9jdW1lbnQuR2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wQW5ub3REaWN0LkdldCgpKSkgeworICAgIHJldHVybjsKICAgfQorCisgIG1fcEFubm90RGljdC0+U2V0TmV3Rm9yPENQREZfQm9vbGVhbj4oa1BERml1bUtleV9IYXNHZW5lcmF0ZWRBUCwgdHJ1ZSk7CisgIG1fYkhhc0dlbmVyYXRlZEFQID0gdHJ1ZTsKIH0KIAogYm9vbCBDUERGX0Fubm90OjpTaG91bGREcmF3QW5ub3RhdGlvbigpIHsKQEAgLTE1Nyw0MiArMTc2LDE0IEBACiAgIHJldHVybiBtX3BBbm5vdERpY3QtPkdldEludGVnZXJGb3IoIkYiKTsKIH0KIAotQ1BERl9TdHJlYW0qIEZQREZET0NfR2V0QW5ub3RBUChDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUpIHsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBwQVAgPSBwQW5ub3REaWN0LT5HZXREaWN0Rm9yKCJBUCIpOwotICBpZiAoIXBBUCkgewotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIGNvbnN0IEZYX0NIQVIqIGFwX2VudHJ5ID0gIk4iOwotICBpZiAobW9kZSA9PSBDUERGX0Fubm90OjpEb3duKQotICAgIGFwX2VudHJ5ID0gIkQiOwotICBlbHNlIGlmIChtb2RlID09IENQREZfQW5ub3Q6OlJvbGxvdmVyKQotICAgIGFwX2VudHJ5ID0gIlIiOwotICBpZiAoIXBBUC0+S2V5RXhpc3QoYXBfZW50cnkpKQotICAgIGFwX2VudHJ5ID0gIk4iOworQ1BERl9TdHJlYW0qIEZQREZET0NfR2V0QW5ub3RBUChjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIGVNb2RlKSB7CisgIHJldHVybiBGUERGRE9DX0dldEFubm90QVBJbnRlcm5hbChwQW5ub3REaWN0LCBlTW9kZSwgdHJ1ZSk7Cit9CiAKLSAgQ1BERl9PYmplY3QqIHBzdWIgPSBwQVAtPkdldERpcmVjdE9iamVjdEZvcihhcF9lbnRyeSk7Ci0gIGlmICghcHN1YikKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgaWYgKENQREZfU3RyZWFtKiBwU3RyZWFtID0gcHN1Yi0+QXNTdHJlYW0oKSkKLSAgICByZXR1cm4gcFN0cmVhbTsKLQotICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBzdWItPkFzRGljdGlvbmFyeSgpKSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYXMgPSBwQW5ub3REaWN0LT5HZXRTdHJpbmdGb3IoIkFTIik7Ci0gICAgaWYgKGFzLklzRW1wdHkoKSkgewotICAgICAgQ0ZYX0J5dGVTdHJpbmcgdmFsdWUgPSBwQW5ub3REaWN0LT5HZXRTdHJpbmdGb3IoIlYiKTsKLSAgICAgIGlmICh2YWx1ZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50RGljdCA9IHBBbm5vdERpY3QtPkdldERpY3RGb3IoIlBhcmVudCIpOwotICAgICAgICB2YWx1ZSA9IHBQYXJlbnREaWN0ID8gcFBhcmVudERpY3QtPkdldFN0cmluZ0ZvcigiViIpIDogQ0ZYX0J5dGVTdHJpbmcoKTsKLSAgICAgIH0KLSAgICAgIGlmICh2YWx1ZS5Jc0VtcHR5KCkgfHwgIXBEaWN0LT5LZXlFeGlzdCh2YWx1ZSkpCi0gICAgICAgIGFzID0gIk9mZiI7Ci0gICAgICBlbHNlCi0gICAgICAgIGFzID0gdmFsdWU7Ci0gICAgfQotICAgIHJldHVybiBwRGljdC0+R2V0U3RyZWFtRm9yKGFzKTsKLSAgfQotICByZXR1cm4gbnVsbHB0cjsKK0NQREZfU3RyZWFtKiBGUERGRE9DX0dldEFubm90QVBOb0ZhbGxiYWNrKGNvbnN0IENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIGVNb2RlKSB7CisgIHJldHVybiBGUERGRE9DX0dldEFubm90QVBJbnRlcm5hbChwQW5ub3REaWN0LCBlTW9kZSwgZmFsc2UpOwogfQogCiBDUERGX0Zvcm0qIENQREZfQW5ub3Q6OkdldEFQRm9ybShjb25zdCBDUERGX1BhZ2UqIHBQYWdlLCBBcHBlYXJhbmNlTW9kZSBtb2RlKSB7CkBAIC0yMDQsOSArMTk1LDkgQEAKICAgaWYgKGl0ICE9IG1fQVBNYXAuZW5kKCkpCiAgICAgcmV0dXJuIGl0LT5zZWNvbmQuZ2V0KCk7CiAKLSAgYXV0byBwTmV3Rm9ybSA9Ci0gICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9Gb3JtPihtX3BEb2N1bWVudCwgcFBhZ2UtPm1fcFJlc291cmNlcywgcFN0cmVhbSk7Ci0gIHBOZXdGb3JtLT5QYXJzZUNvbnRlbnQobnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cik7CisgIGF1dG8gcE5ld0Zvcm0gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9Gb3JtPigKKyAgICAgIG1fcERvY3VtZW50LkdldCgpLCBwUGFnZS0+bV9wUmVzb3VyY2VzLkdldCgpLCBwU3RyZWFtKTsKKyAgcE5ld0Zvcm0tPlBhcnNlQ29udGVudCgpOwogCiAgIENQREZfRm9ybSogcFJlc3VsdCA9IHBOZXdGb3JtLmdldCgpOwogICBtX0FQTWFwW3BTdHJlYW1dID0gc3RkOjptb3ZlKHBOZXdGb3JtKTsKQEAgLTI0MCw3ICsyMzEsNyBAQAogCiAvLyBTdGF0aWMuCiBDUERGX0Fubm90OjpTdWJ0eXBlIENQREZfQW5ub3Q6OlN0cmluZ1RvQW5ub3RTdWJ0eXBlKAotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzU3VidHlwZSkgeworICAgIGNvbnN0IEJ5dGVTdHJpbmcmIHNTdWJ0eXBlKSB7CiAgIGlmIChzU3VidHlwZSA9PSAiVGV4dCIpCiAgICAgcmV0dXJuIENQREZfQW5ub3Q6OlN1YnR5cGU6OlRFWFQ7CiAgIGlmIChzU3VidHlwZSA9PSAiTGluayIpCkBAIC0yOTksNyArMjkwLDcgQEAKIH0KIAogLy8gU3RhdGljLgotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9Bbm5vdDo6QW5ub3RTdWJ0eXBlVG9TdHJpbmcoQ1BERl9Bbm5vdDo6U3VidHlwZSBuU3VidHlwZSkgeworQnl0ZVN0cmluZyBDUERGX0Fubm90OjpBbm5vdFN1YnR5cGVUb1N0cmluZyhDUERGX0Fubm90OjpTdWJ0eXBlIG5TdWJ0eXBlKSB7CiAgIGlmIChuU3VidHlwZSA9PSBDUERGX0Fubm90OjpTdWJ0eXBlOjpURVhUKQogICAgIHJldHVybiAiVGV4dCI7CiAgIGlmIChuU3VidHlwZSA9PSBDUERGX0Fubm90OjpTdWJ0eXBlOjpMSU5LKQpAQCAtMzU5LDcgKzM1MCw3IEBACiAKIGJvb2wgQ1BERl9Bbm5vdDo6RHJhd0FwcGVhcmFuY2UoQ1BERl9QYWdlKiBwUGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtdFVzZXIyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBlYXJhbmNlTW9kZSBtb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKSB7CiAgIGlmICghU2hvdWxkRHJhd0Fubm90YXRpb24oKSkKQEAgLTM3Myw3ICszNjQsNyBAQAogICBHZW5lcmF0ZUFQSWZOZWVkZWQoKTsKIAogICBDRlhfTWF0cml4IG1hdHJpeDsKLSAgQ1BERl9Gb3JtKiBwRm9ybSA9IEFubm90R2V0TWF0cml4KHBQYWdlLCB0aGlzLCBtb2RlLCBwVXNlcjJEZXZpY2UsICZtYXRyaXgpOworICBDUERGX0Zvcm0qIHBGb3JtID0gQW5ub3RHZXRNYXRyaXgocFBhZ2UsIHRoaXMsIG1vZGUsICZtdFVzZXIyRGV2aWNlLCAmbWF0cml4KTsKICAgaWYgKCFwRm9ybSkKICAgICByZXR1cm4gZmFsc2U7CiAKQEAgLTQxNyw3ICs0MDgsNyBAQAogICAgIHJldHVybjsKICAgfQogICBib29sIGJQcmludGluZyA9IHBEZXZpY2UtPkdldERldmljZUNsYXNzKCkgPT0gRlhEQ19QUklOVEVSIHx8Ci0gICAgICAgICAgICAgICAgICAgKHBPcHRpb25zICYmIChwT3B0aW9ucy0+bV9GbGFncyAmIFJFTkRFUl9QUklOVFBSRVZJRVcpKTsKKyAgICAgICAgICAgICAgICAgICAocE9wdGlvbnMgJiYgKHBPcHRpb25zLT5IYXNGbGFnKFJFTkRFUl9QUklOVFBSRVZJRVcpKSk7CiAgIGlmIChiUHJpbnRpbmcgJiYgKGFubm90X2ZsYWdzICYgQU5OT1RGTEFHX1BSSU5UKSA9PSAwKSB7CiAgICAgcmV0dXJuOwogICB9CkBAIC00MjYsNyArNDE3LDcgQEAKICAgfQogICBDUERGX0RpY3Rpb25hcnkqIHBCUyA9IG1fcEFubm90RGljdC0+R2V0RGljdEZvcigiQlMiKTsKICAgY2hhciBzdHlsZV9jaGFyOwotICBGWF9GTE9BVCB3aWR0aDsKKyAgZmxvYXQgd2lkdGg7CiAgIENQREZfQXJyYXkqIHBEYXNoQXJyYXkgPSBudWxscHRyOwogICBpZiAoIXBCUykgewogICAgIENQREZfQXJyYXkqIHBCb3JkZXJBcnJheSA9IG1fcEFubm90RGljdC0+R2V0QXJyYXlGb3IoIkJvcmRlciIpOwpAQCAtNDU1LDcgKzQ0Niw3IEBACiAgICAgICB3aWR0aCA9IDE7CiAgICAgfQogICB9IGVsc2UgewotICAgIENGWF9CeXRlU3RyaW5nIHN0eWxlID0gcEJTLT5HZXRTdHJpbmdGb3IoIlMiKTsKKyAgICBCeXRlU3RyaW5nIHN0eWxlID0gcEJTLT5HZXRTdHJpbmdGb3IoIlMiKTsKICAgICBwRGFzaEFycmF5ID0gcEJTLT5HZXRBcnJheUZvcigiRCIpOwogICAgIHN0eWxlX2NoYXIgPSBzdHlsZVsxXTsKICAgICB3aWR0aCA9IHBCUy0+R2V0TnVtYmVyRm9yKCJXIik7CkBAIC00NzksNyArNDcwLDcgQEAKICAgICAgIGlmIChkYXNoX2NvdW50ICUgMikgewogICAgICAgICBkYXNoX2NvdW50Kys7CiAgICAgICB9Ci0gICAgICBncmFwaF9zdGF0ZS5tX0Rhc2hBcnJheSA9IEZYX0FsbG9jKEZYX0ZMT0FULCBkYXNoX2NvdW50KTsKKyAgICAgIGdyYXBoX3N0YXRlLm1fRGFzaEFycmF5ID0gRlhfQWxsb2MoZmxvYXQsIGRhc2hfY291bnQpOwogICAgICAgZ3JhcGhfc3RhdGUubV9EYXNoQ291bnQgPSBkYXNoX2NvdW50OwogICAgICAgc2l6ZV90IGk7CiAgICAgICBmb3IgKGkgPSAwOyBpIDwgcERhc2hBcnJheS0+R2V0Q291bnQoKTsgKytpKSB7CkBAIC00ODksNyArNDgwLDcgQEAKICAgICAgICAgZ3JhcGhfc3RhdGUubV9EYXNoQXJyYXlbaV0gPSBncmFwaF9zdGF0ZS5tX0Rhc2hBcnJheVtpIC0gMV07CiAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgIGdyYXBoX3N0YXRlLm1fRGFzaEFycmF5ID0gRlhfQWxsb2MoRlhfRkxPQVQsIDIpOworICAgICAgZ3JhcGhfc3RhdGUubV9EYXNoQXJyYXkgPSBGWF9BbGxvYyhmbG9hdCwgMik7CiAgICAgICBncmFwaF9zdGF0ZS5tX0Rhc2hDb3VudCA9IDI7CiAgICAgICBncmFwaF9zdGF0ZS5tX0Rhc2hBcnJheVswXSA9IGdyYXBoX3N0YXRlLm1fRGFzaEFycmF5WzFdID0gMyAqIDEuMGY7CiAgICAgfQpAQCAtNTAwLDcgKzQ5MSw3IEBACiAgIHBhdGguQXBwZW5kUmVjdChyZWN0LmxlZnQgKyB3aWR0aCwgcmVjdC5ib3R0b20gKyB3aWR0aCwgcmVjdC5yaWdodCAtIHdpZHRoLAogICAgICAgICAgICAgICAgICAgcmVjdC50b3AgLSB3aWR0aCk7CiAgIGludCBmaWxsX3R5cGUgPSAwOwotICBpZiAocE9wdGlvbnMgJiYgKHBPcHRpb25zLT5tX0ZsYWdzICYgUkVOREVSX05PUEFUSFNNT09USCkpCisgIGlmIChwT3B0aW9ucyAmJiAocE9wdGlvbnMtPkhhc0ZsYWcoUkVOREVSX05PUEFUSFNNT09USCkpKQogICAgIGZpbGxfdHlwZSB8PSBGWEZJTExfTk9QQVRIU01PT1RIOwogCiAgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsICZncmFwaF9zdGF0ZSwgYXJnYiwgYXJnYiwgZmlsbF90eXBlKTsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jcGRmX2Fubm90LmggYi9jb3JlL2ZwZGZkb2MvY3BkZl9hbm5vdC5oCmluZGV4IDE4ODEwNmEuLjQ5OWM2MmQgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jcGRmX2Fubm90LmgKKysrIGIvY29yZS9mcGRmZG9jL2NwZGZfYW5ub3QuaApAQCAtMTAsMTAgKzEwLDEwIEBACiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPG1lbW9yeT4KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X21heWJlX293bmVkLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L21heWJlX293bmVkLmgiCiAKIGNsYXNzIENGWF9SZW5kZXJEZXZpY2U7CiBjbGFzcyBDUERGX0RpY3Rpb25hcnk7CkBAIC0yNywxMiArMjcsNyBAQAogI2RlZmluZSBBTk5PVEZMQUdfSU5WSVNJQkxFIDB4MDAwMQogI2RlZmluZSBBTk5PVEZMQUdfSElEREVOIDB4MDAwMgogI2RlZmluZSBBTk5PVEZMQUdfUFJJTlQgMHgwMDA0Ci0jZGVmaW5lIEFOTk9URkxBR19OT1pPT00gMHgwMDA4Ci0jZGVmaW5lIEFOTk9URkxBR19OT1JPVEFURSAweDAwMTAKICNkZWZpbmUgQU5OT1RGTEFHX05PVklFVyAweDAwMjAKLSNkZWZpbmUgQU5OT1RGTEFHX1JFQURPTkxZIDB4MDA0MAotI2RlZmluZSBBTk5PVEZMQUdfTE9DS0VEIDB4MDA4MAotI2RlZmluZSBBTk5PVEZMQUdfVE9HR0xFTk9WSUVXIDB4MDEwMAogCiBjbGFzcyBDUERGX0Fubm90IHsKICBwdWJsaWM6CkBAIC02OSw5ICs2NCw4IEBACiAgIH07CiAKICAgc3RhdGljIGJvb2wgSXNBbm5vdGF0aW9uSGlkZGVuKENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCk7Ci0gIHN0YXRpYyBDUERGX0Fubm90OjpTdWJ0eXBlIFN0cmluZ1RvQW5ub3RTdWJ0eXBlKAotICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNTdWJ0eXBlKTsKLSAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEFubm90U3VidHlwZVRvU3RyaW5nKENQREZfQW5ub3Q6OlN1YnR5cGUgblN1YnR5cGUpOworICBzdGF0aWMgQ1BERl9Bbm5vdDo6U3VidHlwZSBTdHJpbmdUb0Fubm90U3VidHlwZShjb25zdCBCeXRlU3RyaW5nJiBzU3VidHlwZSk7CisgIHN0YXRpYyBCeXRlU3RyaW5nIEFubm90U3VidHlwZVRvU3RyaW5nKENQREZfQW5ub3Q6OlN1YnR5cGUgblN1YnR5cGUpOwogICBzdGF0aWMgQ0ZYX0Zsb2F0UmVjdCBSZWN0RnJvbVF1YWRQb2ludHMoQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKIAogICAvLyBUaGUgc2Vjb25kIGNvbnN0cnVjdG9yIGRvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIHRoZSBkaWN0aW9uYXJ5LgpAQCAtODIsMTIgKzc2LDEyIEBACiAgIENQREZfQW5ub3Q6OlN1YnR5cGUgR2V0U3VidHlwZSgpIGNvbnN0OwogICB1aW50MzJfdCBHZXRGbGFncygpIGNvbnN0OwogICBDRlhfRmxvYXRSZWN0IEdldFJlY3QoKSBjb25zdDsKLSAgQ1BERl9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BEb2N1bWVudDsgfQorICBDUERGX0RvY3VtZW50KiBHZXREb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcERvY3VtZW50LkdldCgpOyB9CiAgIENQREZfRGljdGlvbmFyeSogR2V0QW5ub3REaWN0KCkgY29uc3QgeyByZXR1cm4gbV9wQW5ub3REaWN0LkdldCgpOyB9CiAKICAgYm9vbCBEcmF3QXBwZWFyYW5jZShDUERGX1BhZ2UqIHBQYWdlLAogICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG10VXNlcjJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgQXBwZWFyYW5jZU1vZGUgbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKTsKICAgYm9vbCBEcmF3SW5Db250ZXh0KGNvbnN0IENQREZfUGFnZSogcFBhZ2UsCkBAIC0xMTEsOCArMTA1LDggQEAKIAogICBDRlhfRmxvYXRSZWN0IFJlY3RGb3JEcmF3aW5nKCkgY29uc3Q7CiAKLSAgQ0ZYX01heWJlT3duZWQ8Q1BERl9EaWN0aW9uYXJ5PiBtX3BBbm5vdERpY3Q7Ci0gIENQREZfRG9jdW1lbnQqIGNvbnN0IG1fcERvY3VtZW50OworICBNYXliZU93bmVkPENQREZfRGljdGlvbmFyeT4gbV9wQW5ub3REaWN0OworICBVbm93bmVkUHRyPENQREZfRG9jdW1lbnQ+IGNvbnN0IG1fcERvY3VtZW50OwogICBDUERGX0Fubm90OjpTdWJ0eXBlIG1fblN1YnR5cGU7CiAgIHN0ZDo6bWFwPENQREZfU3RyZWFtKiwgc3RkOjp1bmlxdWVfcHRyPENQREZfRm9ybT4+IG1fQVBNYXA7CiAgIC8vIHxtX2JPcGVuU3RhdGV8IGlzIG9ubHkgc2V0IGZvciBwb3B1cCBhbm5vdGF0aW9ucy4KQEAgLTEyNCw3ICsxMTgsMTUgQEAKICAgQ1BERl9Bbm5vdCogbV9wUG9wdXBBbm5vdCA9IG51bGxwdHI7CiB9OwogCi1DUERGX1N0cmVhbSogRlBERkRPQ19HZXRBbm5vdEFQKENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSk7CisvLyBHZXQgdGhlIEFQIGluIGFuIGFubm90YXRpb24gZGljdCBmb3IgYSBnaXZlbiBhcHBlYXJhbmNlIG1vZGUuCisvLyBJZiB8ZU1vZGV8IGlzIG5vdCBOb3JtYWwgYW5kIHRoZXJlIGlzIG5vdCBBUCBmb3IgdGhhdCBtb2RlLCBmYWxscyBiYWNrIHRvCisvLyB0aGUgTm9ybWFsIEFQLgorQ1BERl9TdHJlYW0qIEZQREZET0NfR2V0QW5ub3RBUChjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIGVNb2RlKTsKKworLy8gR2V0IHRoZSBBUCBpbiBhbiBhbm5vdGF0aW9uIGRpY3QgZm9yIGEgZ2l2ZW4gYXBwZWFyYW5jZSBtb2RlLgorLy8gTm8gZmFsbGJhY2tzIHRvIE5vcm1hbCBsaWtlIGluIEZQREZET0NfR2V0QW5ub3RBUC4KK0NQREZfU3RyZWFtKiBGUERGRE9DX0dldEFubm90QVBOb0ZhbGxiYWNrKGNvbnN0IENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIGVNb2RlKTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZET0NfQ1BERl9BTk5PVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwZGZfYW5ub3RsaXN0LmNwcCBiL2NvcmUvZnBkZmRvYy9jcGRmX2Fubm90bGlzdC5jcHAKaW5kZXggZWQxYjYwYy4uMTkyNjQ5ZCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfYW5ub3RsaXN0LmNwcAorKysgYi9jb3JlL2ZwZGZkb2MvY3BkZl9hbm5vdGxpc3QuY3BwCkBAIC02LDEwICs2LDEyIEBACiAKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9hbm5vdGxpc3QuaCIKIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dXRpbGl0eT4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9uYW1lLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bWJlci5oIgpAQCAtMjYsMTQgKzI4LDE1IEBACiBuYW1lc3BhY2UgewogCiBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Bbm5vdD4gQ3JlYXRlUG9wdXBBbm5vdChDUERGX0Fubm90KiBwQW5ub3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFnZSogcFBhZ2UpIHsKICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50RGljdCA9IHBBbm5vdC0+R2V0QW5ub3REaWN0KCk7CiAgIGlmICghcFBhcmVudERpY3QpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKICAgLy8gVE9ETyhqYWVwYXJrKTogV2Ugc2hvdWxkbid0IHN0cmlwIEJPTSBmb3Igc29tZSBzdHJpbmdzIGFuZCBub3QgZm9yIG90aGVycy4KICAgLy8gU2VlIHBkZml1bTo1OTMuCi0gIENGWF9XaWRlU3RyaW5nIHNDb250ZW50cyA9IHBQYXJlbnREaWN0LT5HZXRVbmljb2RlVGV4dEZvcigiQ29udGVudHMiKTsKKyAgV2lkZVN0cmluZyBzQ29udGVudHMgPSBwUGFyZW50RGljdC0+R2V0VW5pY29kZVRleHRGb3IoIkNvbnRlbnRzIik7CiAgIGlmIChzQ29udGVudHMuSXNFbXB0eSgpKQogICAgIHJldHVybiBudWxscHRyOwogCkBAIC00OCw3ICs1MSwyMCBAQAogICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBwUGFyZW50RGljdC0+R2V0UmVjdEZvcigiUmVjdCIpOwogICByZWN0Lk5vcm1hbGl6ZSgpOwogICBDRlhfRmxvYXRSZWN0IHBvcHVwUmVjdCgwLCAwLCAyMDAsIDIwMCk7Ci0gIHBvcHVwUmVjdC5UcmFuc2xhdGUocmVjdC5sZWZ0LCByZWN0LmJvdHRvbSAtIHBvcHVwUmVjdC5IZWlnaHQoKSk7CisgIC8vIE5vdGUgdGhhdCBpZiB0aGUgcG9wdXAgY2FuIHNldCBpdHMgb3duIGRpbWVuc2lvbnMsIHRoZW4gd2Ugd2lsbCBuZWVkIHRvCisgIC8vIG1ha2Ugc3VyZSB0aGF0IGl0IGlzbid0IGxhcmdlciB0aGFuIHRoZSBwYWdlIHNpemUuCisgIGlmIChyZWN0LmxlZnQgKyBwb3B1cFJlY3QuV2lkdGgoKSA+IHBQYWdlLT5HZXRQYWdlV2lkdGgoKSAmJgorICAgICAgcmVjdC5ib3R0b20gLSBwb3B1cFJlY3QuSGVpZ2h0KCkgPCAwKSB7CisgICAgLy8gSWYgdGhlIGFubm90YXRpb24gaXMgb24gdGhlIGJvdHRvbS1yaWdodCBjb3JuZXIgb2YgdGhlIHBhZ2UsIHRoZW4gcGxhY2UKKyAgICAvLyB0aGUgcG9wdXAgYWJvdmUgYW5kIHRvIHRoZSBsZWZ0IG9mIHRoZSBhbm5vdGF0aW9uLgorICAgIHBvcHVwUmVjdC5UcmFuc2xhdGUocmVjdC5yaWdodCAtIHBvcHVwUmVjdC5XaWR0aCgpLCByZWN0LnRvcCk7CisgIH0gZWxzZSB7CisgICAgLy8gUGxhY2UgdGhlIHBvcHVwIGJlbG93IGFuZCB0byB0aGUgcmlnaHQgb2YgdGhlIGFubm90YXRpb24gd2l0aG91dCBnZXR0aW5nCisgICAgLy8gY2xpcHBlZCBieSBwYWdlIGVkZ2VzLgorICAgIHBvcHVwUmVjdC5UcmFuc2xhdGUoCisgICAgICAgIHN0ZDo6bWluKHJlY3QubGVmdCwgcFBhZ2UtPkdldFBhZ2VXaWR0aCgpIC0gcG9wdXBSZWN0LldpZHRoKCkpLAorICAgICAgICBzdGQ6Om1heChyZWN0LmJvdHRvbSAtIHBvcHVwUmVjdC5IZWlnaHQoKSwgMC5mKSk7CisgIH0KIAogICBwQW5ub3REaWN0LT5TZXRSZWN0Rm9yKCJSZWN0IiwgcG9wdXBSZWN0KTsKICAgcEFubm90RGljdC0+U2V0TmV3Rm9yPENQREZfTnVtYmVyPigiRiIsIDApOwpAQCAtNTksMTAgKzc1LDUxIEBACiAgIHJldHVybiBwUG9wdXBBbm5vdDsKIH0KIAordm9pZCBHZW5lcmF0ZUFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkgeworICBpZiAoIXBBbm5vdERpY3QgfHwgcEFubm90RGljdC0+R2V0U3RyaW5nRm9yKCJTdWJ0eXBlIikgIT0gIldpZGdldCIpCisgICAgcmV0dXJuOworCisgIENQREZfT2JqZWN0KiBwRmllbGRUeXBlT2JqID0gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkZUIik7CisgIGlmICghcEZpZWxkVHlwZU9iaikKKyAgICByZXR1cm47CisKKyAgQnl0ZVN0cmluZyBmaWVsZF90eXBlID0gcEZpZWxkVHlwZU9iai0+R2V0U3RyaW5nKCk7CisgIGlmIChmaWVsZF90eXBlID09ICJUeCIpIHsKKyAgICBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlRm9ybUFQKENQVlRfR2VuZXJhdGVBUDo6a1RleHRGaWVsZCwgcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbm5vdERpY3QpOworICAgIHJldHVybjsKKyAgfQorCisgIENQREZfT2JqZWN0KiBwRmllbGRGbGFnc09iaiA9IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJGZiIpOworICB1aW50MzJfdCBmbGFncyA9IHBGaWVsZEZsYWdzT2JqID8gcEZpZWxkRmxhZ3NPYmotPkdldEludGVnZXIoKSA6IDA7CisgIGlmIChmaWVsZF90eXBlID09ICJDaCIpIHsKKyAgICBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlRm9ybUFQKChmbGFncyAmICgxIDw8IDE3KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IENQVlRfR2VuZXJhdGVBUDo6a0NvbWJvQm94CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDUFZUX0dlbmVyYXRlQVA6OmtMaXN0Qm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERvYywgcEFubm90RGljdCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGZpZWxkX3R5cGUgIT0gIkJ0biIpCisgICAgcmV0dXJuOworICBpZiAoZmxhZ3MgJiAoMSA8PCAxNikpCisgICAgcmV0dXJuOworICBpZiAocEFubm90RGljdC0+S2V5RXhpc3QoIkFTIikpCisgICAgcmV0dXJuOworCisgIENQREZfRGljdGlvbmFyeSogcFBhcmVudERpY3QgPSBwQW5ub3REaWN0LT5HZXREaWN0Rm9yKCJQYXJlbnQiKTsKKyAgaWYgKCFwUGFyZW50RGljdCB8fCAhcFBhcmVudERpY3QtPktleUV4aXN0KCJBUyIpKQorICAgIHJldHVybjsKKworICBwQW5ub3REaWN0LT5TZXROZXdGb3I8Q1BERl9TdHJpbmc+KCJBUyIsIHBQYXJlbnREaWN0LT5HZXRTdHJpbmdGb3IoIkFTIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICByZXR1cm47Cit9CisKIH0gIC8vIG5hbWVzcGFjZQogCiBDUERGX0Fubm90TGlzdDo6Q1BERl9Bbm5vdExpc3QoQ1BERl9QYWdlKiBwUGFnZSkKLSAgICA6IG1fcERvY3VtZW50KHBQYWdlLT5tX3BEb2N1bWVudCkgeworICAgIDogbV9wRG9jdW1lbnQocFBhZ2UtPm1fcERvY3VtZW50LkdldCgpKSB7CiAgIGlmICghcFBhZ2UtPm1fcEZvcm1EaWN0KQogICAgIHJldHVybjsKIApAQCAtNzAsMTQgKzEyNywxNCBAQAogICBpZiAoIXBBbm5vdHMpCiAgICAgcmV0dXJuOwogCi0gIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOworICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKICAgQ1BERl9EaWN0aW9uYXJ5KiBwQWNyb0Zvcm0gPSBwUm9vdC0+R2V0RGljdEZvcigiQWNyb0Zvcm0iKTsKICAgYm9vbCBiUmVnZW5lcmF0ZUFQID0gcEFjcm9Gb3JtICYmIHBBY3JvRm9ybS0+R2V0Qm9vbGVhbkZvcigiTmVlZEFwcGVhcmFuY2VzIik7CiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcEFubm90cy0+R2V0Q291bnQoKTsgKytpKSB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IFRvRGljdGlvbmFyeShwQW5ub3RzLT5HZXREaXJlY3RPYmplY3RBdChpKSk7CiAgICAgaWYgKCFwRGljdCkKICAgICAgIGNvbnRpbnVlOwotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nIHN1YnR5cGUgPSBwRGljdC0+R2V0U3RyaW5nRm9yKCJTdWJ0eXBlIik7CisgICAgY29uc3QgQnl0ZVN0cmluZyBzdWJ0eXBlID0gcERpY3QtPkdldFN0cmluZ0ZvcigiU3VidHlwZSIpOwogICAgIGlmIChzdWJ0eXBlID09ICJQb3B1cCIpIHsKICAgICAgIC8vIFNraXAgY3JlYXRpbmcgUG9wdXAgYW5ub3RhdGlvbnMgaW4gdGhlIFBERiBkb2N1bWVudCBzaW5jZSBQREZpdW0KICAgICAgIC8vIHByb3ZpZGVzIGl0cyBvd24gUG9wdXAgYW5ub3RhdGlvbnMuCkBAIC04NiwxNSArMTQzLDE1IEBACiAgICAgcEFubm90cy0+Q29udmVydFRvSW5kaXJlY3RPYmplY3RBdChpLCBtX3BEb2N1bWVudCk7CiAgICAgbV9Bbm5vdExpc3QucHVzaF9iYWNrKHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0Fubm90PihwRGljdCwgbV9wRG9jdW1lbnQpKTsKICAgICBpZiAoYlJlZ2VuZXJhdGVBUCAmJiBzdWJ0eXBlID09ICJXaWRnZXQiICYmCi0gICAgICAgIENQREZfSW50ZXJGb3JtOjpJc1VwZGF0ZUFQRW5hYmxlZCgpKSB7Ci0gICAgICBGUERGX0dlbmVyYXRlQVAobV9wRG9jdW1lbnQsIHBEaWN0KTsKKyAgICAgICAgQ1BERl9JbnRlckZvcm06OklzVXBkYXRlQVBFbmFibGVkKCkgJiYgIXBEaWN0LT5HZXREaWN0Rm9yKCJBUCIpKSB7CisgICAgICBHZW5lcmF0ZUFQKG1fcERvY3VtZW50LCBwRGljdCk7CiAgICAgfQogICB9CiAKICAgc2l6ZV90IG5Bbm5vdExpc3RTaXplID0gbV9Bbm5vdExpc3Quc2l6ZSgpOwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5Bbm5vdExpc3RTaXplOyArK2kpIHsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Bbm5vdD4gcFBvcHVwQW5ub3QoCi0gICAgICAgIENyZWF0ZVBvcHVwQW5ub3QobV9Bbm5vdExpc3RbaV0uZ2V0KCksIG1fcERvY3VtZW50KSk7CisgICAgICAgIENyZWF0ZVBvcHVwQW5ub3QobV9Bbm5vdExpc3RbaV0uZ2V0KCksIG1fcERvY3VtZW50LCBwUGFnZSkpOwogICAgIGlmIChwUG9wdXBBbm5vdCkKICAgICAgIG1fQW5ub3RMaXN0LnB1c2hfYmFjayhzdGQ6Om1vdmUocFBvcHVwQW5ub3QpKTsKICAgfQpAQCAtMTI2LDI2ICsxODMsMjUgQEAKICAgICAgIGNvbnRpbnVlOwogCiAgICAgaWYgKHBPcHRpb25zKSB7Ci0gICAgICBDRlhfUmV0YWluUHRyPENQREZfT0NDb250ZXh0PiBwT0NDb250ZXh0ID0gcE9wdGlvbnMtPm1fcE9DQ29udGV4dDsKICAgICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCA9IHBBbm5vdC0+R2V0QW5ub3REaWN0KCk7Ci0gICAgICBpZiAocE9DQ29udGV4dCAmJiBwQW5ub3REaWN0ICYmCi0gICAgICAgICAgIXBPQ0NvbnRleHQtPkNoZWNrT0NHVmlzaWJsZShwQW5ub3REaWN0LT5HZXREaWN0Rm9yKCJPQyIpKSkgeworICAgICAgaWYgKHBPcHRpb25zLT5HZXRPQ0NvbnRleHQoKSAmJiBwQW5ub3REaWN0ICYmCisgICAgICAgICAgIXBPcHRpb25zLT5HZXRPQ0NvbnRleHQoKS0+Q2hlY2tPQ0dWaXNpYmxlKAorICAgICAgICAgICAgICBwQW5ub3REaWN0LT5HZXREaWN0Rm9yKCJPQyIpKSkgewogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KICAgICB9Ci0gICAgQ0ZYX0Zsb2F0UmVjdCBhbm5vdF9yZWN0X2YgPSBwQW5ub3QtPkdldFJlY3QoKTsKKwogICAgIENGWF9NYXRyaXggbWF0cml4ID0gKnBNYXRyaXg7CiAgICAgaWYgKGNsaXBfcmVjdCkgewotICAgICAgbWF0cml4LlRyYW5zZm9ybVJlY3QoYW5ub3RfcmVjdF9mKTsKLQotICAgICAgRlhfUkVDVCBhbm5vdF9yZWN0ID0gYW5ub3RfcmVjdF9mLkdldE91dGVyUmVjdCgpOworICAgICAgRlhfUkVDVCBhbm5vdF9yZWN0ID0KKyAgICAgICAgICBtYXRyaXguVHJhbnNmb3JtUmVjdChwQW5ub3QtPkdldFJlY3QoKSkuR2V0T3V0ZXJSZWN0KCk7CiAgICAgICBhbm5vdF9yZWN0LkludGVyc2VjdCgqY2xpcF9yZWN0KTsKICAgICAgIGlmIChhbm5vdF9yZWN0LklzRW1wdHkoKSkKICAgICAgICAgY29udGludWU7CiAgICAgfQogICAgIGlmIChwQ29udGV4dCkgewogICAgICAgcEFubm90LT5EcmF3SW5Db250ZXh0KHBQYWdlLCBwQ29udGV4dCwgJm1hdHJpeCwgQ1BERl9Bbm5vdDo6Tm9ybWFsKTsKLSAgICB9IGVsc2UgaWYgKCFwQW5ub3QtPkRyYXdBcHBlYXJhbmNlKHBQYWdlLCBwRGV2aWNlLCAmbWF0cml4LAorICAgIH0gZWxzZSBpZiAoIXBBbm5vdC0+RHJhd0FwcGVhcmFuY2UocFBhZ2UsIHBEZXZpY2UsIG1hdHJpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQW5ub3Q6Ok5vcm1hbCwgcE9wdGlvbnMpKSB7CiAgICAgICBwQW5ub3QtPkRyYXdCb3JkZXIocERldmljZSwgJm1hdHJpeCwgcE9wdGlvbnMpOwogICAgIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jcGRmX2Fwc2V0dGluZ3MuY3BwIGIvY29yZS9mcGRmZG9jL2NwZGZfYXBzZXR0aW5ncy5jcHAKaW5kZXggOWZjOWMxYS4uMDc2Y2RkOSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfYXBzZXR0aW5ncy5jcHAKKysrIGIvY29yZS9mcGRmZG9jL2NwZGZfYXBzZXR0aW5ncy5jcHAKQEAgLTEwLDExICsxMCwxNSBAQAogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9mb3JtY29udHJvbC5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfY29sb3IuaCIKIAogQ1BERl9BcFNldHRpbmdzOjpDUERGX0FwU2V0dGluZ3MoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgOiBtX3BEaWN0KHBEaWN0KSB7fQogCi1ib29sIENQREZfQXBTZXR0aW5nczo6SGFzTUtFbnRyeShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NFbnRyeSkgY29uc3QgeworQ1BERl9BcFNldHRpbmdzOjpDUERGX0FwU2V0dGluZ3MoY29uc3QgQ1BERl9BcFNldHRpbmdzJiB0aGF0KSA9IGRlZmF1bHQ7CisKK0NQREZfQXBTZXR0aW5nczo6fkNQREZfQXBTZXR0aW5ncygpIHt9CisKK2Jvb2wgQ1BERl9BcFNldHRpbmdzOjpIYXNNS0VudHJ5KGNvbnN0IEJ5dGVTdHJpbmcmIGNzRW50cnkpIGNvbnN0IHsKICAgcmV0dXJuIG1fcERpY3QgJiYgbV9wRGljdC0+S2V5RXhpc3QoY3NFbnRyeSk7CiB9CiAKQEAgLTIzLDggKzI3LDggQEAKIH0KIAogRlhfQVJHQiBDUERGX0FwU2V0dGluZ3M6OkdldENvbG9yKGludCYgaUNvbG9yVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NFbnRyeSkgY29uc3QgewotICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIGNzRW50cnkpIGNvbnN0IHsKKyAgaUNvbG9yVHlwZSA9IENGWF9Db2xvcjo6a1RyYW5zcGFyZW50OwogICBpZiAoIW1fcERpY3QpCiAgICAgcmV0dXJuIDA7CiAKQEAgLTM1LDM0ICszOSwzMyBAQAogICBGWF9BUkdCIGNvbG9yID0gMDsKICAgc2l6ZV90IGR3Q291bnQgPSBwRW50cnktPkdldENvdW50KCk7CiAgIGlmIChkd0NvdW50ID09IDEpIHsKLSAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX0dSQVk7Ci0gICAgRlhfRkxPQVQgZyA9IHBFbnRyeS0+R2V0TnVtYmVyQXQoMCkgKiAyNTU7CisgICAgaUNvbG9yVHlwZSA9IENGWF9Db2xvcjo6a0dyYXk7CisgICAgZmxvYXQgZyA9IHBFbnRyeS0+R2V0TnVtYmVyQXQoMCkgKiAyNTU7CiAgICAgcmV0dXJuIEFyZ2JFbmNvZGUoMjU1LCAoaW50KWcsIChpbnQpZywgKGludClnKTsKICAgfQogICBpZiAoZHdDb3VudCA9PSAzKSB7Ci0gICAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9SR0I7Ci0gICAgRlhfRkxPQVQgciA9IHBFbnRyeS0+R2V0TnVtYmVyQXQoMCkgKiAyNTU7Ci0gICAgRlhfRkxPQVQgZyA9IHBFbnRyeS0+R2V0TnVtYmVyQXQoMSkgKiAyNTU7Ci0gICAgRlhfRkxPQVQgYiA9IHBFbnRyeS0+R2V0TnVtYmVyQXQoMikgKiAyNTU7CisgICAgaUNvbG9yVHlwZSA9IENGWF9Db2xvcjo6a1JHQjsKKyAgICBmbG9hdCByID0gcEVudHJ5LT5HZXROdW1iZXJBdCgwKSAqIDI1NTsKKyAgICBmbG9hdCBnID0gcEVudHJ5LT5HZXROdW1iZXJBdCgxKSAqIDI1NTsKKyAgICBmbG9hdCBiID0gcEVudHJ5LT5HZXROdW1iZXJBdCgyKSAqIDI1NTsKICAgICByZXR1cm4gQXJnYkVuY29kZSgyNTUsIChpbnQpciwgKGludClnLCAoaW50KWIpOwogICB9CiAgIGlmIChkd0NvdW50ID09IDQpIHsKLSAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX0NNWUs7Ci0gICAgRlhfRkxPQVQgYyA9IHBFbnRyeS0+R2V0TnVtYmVyQXQoMCk7Ci0gICAgRlhfRkxPQVQgbSA9IHBFbnRyeS0+R2V0TnVtYmVyQXQoMSk7Ci0gICAgRlhfRkxPQVQgeSA9IHBFbnRyeS0+R2V0TnVtYmVyQXQoMik7Ci0gICAgRlhfRkxPQVQgayA9IHBFbnRyeS0+R2V0TnVtYmVyQXQoMyk7Ci0gICAgRlhfRkxPQVQgciA9IDEuMGYgLSBzdGQ6Om1pbigxLjBmLCBjICsgayk7Ci0gICAgRlhfRkxPQVQgZyA9IDEuMGYgLSBzdGQ6Om1pbigxLjBmLCBtICsgayk7Ci0gICAgRlhfRkxPQVQgYiA9IDEuMGYgLSBzdGQ6Om1pbigxLjBmLCB5ICsgayk7CisgICAgaUNvbG9yVHlwZSA9IENGWF9Db2xvcjo6a0NNWUs7CisgICAgZmxvYXQgYyA9IHBFbnRyeS0+R2V0TnVtYmVyQXQoMCk7CisgICAgZmxvYXQgbSA9IHBFbnRyeS0+R2V0TnVtYmVyQXQoMSk7CisgICAgZmxvYXQgeSA9IHBFbnRyeS0+R2V0TnVtYmVyQXQoMik7CisgICAgZmxvYXQgayA9IHBFbnRyeS0+R2V0TnVtYmVyQXQoMyk7CisgICAgZmxvYXQgciA9IDEuMGYgLSBzdGQ6Om1pbigxLjBmLCBjICsgayk7CisgICAgZmxvYXQgZyA9IDEuMGYgLSBzdGQ6Om1pbigxLjBmLCBtICsgayk7CisgICAgZmxvYXQgYiA9IDEuMGYgLSBzdGQ6Om1pbigxLjBmLCB5ICsgayk7CiAgICAgcmV0dXJuIEFyZ2JFbmNvZGUoMjU1LCAoaW50KShyICogMjU1KSwgKGludCkoZyAqIDI1NSksIChpbnQpKGIgKiAyNTUpKTsKICAgfQogICByZXR1cm4gY29sb3I7CiB9CiAKLUZYX0ZMT0FUIENQREZfQXBTZXR0aW5nczo6R2V0T3JpZ2luYWxDb2xvcigKLSAgICBpbnQgaW5kZXgsCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzRW50cnkpIGNvbnN0IHsKK2Zsb2F0IENQREZfQXBTZXR0aW5nczo6R2V0T3JpZ2luYWxDb2xvcihpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgY3NFbnRyeSkgY29uc3QgewogICBpZiAoIW1fcERpY3QpCiAgICAgcmV0dXJuIDA7CiAKQEAgLTcxLDkgKzc0LDkgQEAKIH0KIAogdm9pZCBDUERGX0FwU2V0dGluZ3M6OkdldE9yaWdpbmFsQ29sb3IoaW50JiBpQ29sb3JUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZmNbNF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NFbnRyeSkgY29uc3QgewotICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZmNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBjc0VudHJ5KSBjb25zdCB7CisgIGlDb2xvclR5cGUgPSBDRlhfQ29sb3I6OmtUcmFuc3BhcmVudDsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspCiAgICAgZmNbaV0gPSAwOwogCkBAIC04NiwxNSArODksMTUgQEAKIAogICBzaXplX3QgZHdDb3VudCA9IHBFbnRyeS0+R2V0Q291bnQoKTsKICAgaWYgKGR3Q291bnQgPT0gMSkgewotICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfR1JBWTsKKyAgICBpQ29sb3JUeXBlID0gQ0ZYX0NvbG9yOjprR3JheTsKICAgICBmY1swXSA9IHBFbnRyeS0+R2V0TnVtYmVyQXQoMCk7CiAgIH0gZWxzZSBpZiAoZHdDb3VudCA9PSAzKSB7Ci0gICAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9SR0I7CisgICAgaUNvbG9yVHlwZSA9IENGWF9Db2xvcjo6a1JHQjsKICAgICBmY1swXSA9IHBFbnRyeS0+R2V0TnVtYmVyQXQoMCk7CiAgICAgZmNbMV0gPSBwRW50cnktPkdldE51bWJlckF0KDEpOwogICAgIGZjWzJdID0gcEVudHJ5LT5HZXROdW1iZXJBdCgyKTsKICAgfSBlbHNlIGlmIChkd0NvdW50ID09IDQpIHsKLSAgICBpQ29sb3JUeXBlID0gQ09MT1JUWVBFX0NNWUs7CisgICAgaUNvbG9yVHlwZSA9IENGWF9Db2xvcjo6a0NNWUs7CiAgICAgZmNbMF0gPSBwRW50cnktPkdldE51bWJlckF0KDApOwogICAgIGZjWzFdID0gcEVudHJ5LT5HZXROdW1iZXJBdCgxKTsKICAgICBmY1syXSA9IHBFbnRyeS0+R2V0TnVtYmVyQXQoMik7CkBAIC0xMDIsMTIgKzEwNSwxMSBAQAogICB9CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQREZfQXBTZXR0aW5nczo6R2V0Q2FwdGlvbigKLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NFbnRyeSkgY29uc3QgewotICByZXR1cm4gbV9wRGljdCA/IG1fcERpY3QtPkdldFVuaWNvZGVUZXh0Rm9yKGNzRW50cnkpIDogQ0ZYX1dpZGVTdHJpbmcoKTsKK1dpZGVTdHJpbmcgQ1BERl9BcFNldHRpbmdzOjpHZXRDYXB0aW9uKGNvbnN0IEJ5dGVTdHJpbmcmIGNzRW50cnkpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcERpY3QgPyBtX3BEaWN0LT5HZXRVbmljb2RlVGV4dEZvcihjc0VudHJ5KSA6IFdpZGVTdHJpbmcoKTsKIH0KIAotQ1BERl9TdHJlYW0qIENQREZfQXBTZXR0aW5nczo6R2V0SWNvbihjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NFbnRyeSkgY29uc3QgeworQ1BERl9TdHJlYW0qIENQREZfQXBTZXR0aW5nczo6R2V0SWNvbihjb25zdCBCeXRlU3RyaW5nJiBjc0VudHJ5KSBjb25zdCB7CiAgIHJldHVybiBtX3BEaWN0ID8gbV9wRGljdC0+R2V0U3RyZWFtRm9yKGNzRW50cnkpIDogbnVsbHB0cjsKIH0KIApkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwZGZfYXBzZXR0aW5ncy5oIGIvY29yZS9mcGRmZG9jL2NwZGZfYXBzZXR0aW5ncy5oCmluZGV4IGZmZGRmZmQuLmE4MDdjMmIgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jcGRmX2Fwc2V0dGluZ3MuaAorKysgYi9jb3JlL2ZwZGZkb2MvY3BkZl9hcHNldHRpbmdzLmgKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9pY29uZml0LmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCiAKIGNsYXNzIENQREZfRGljdGlvbmFyeTsKQEAgLTE5LDE5ICsyMCwyMSBAQAogY2xhc3MgQ1BERl9BcFNldHRpbmdzIHsKICBwdWJsaWM6CiAgIGV4cGxpY2l0IENQREZfQXBTZXR0aW5ncyhDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKKyAgQ1BERl9BcFNldHRpbmdzKGNvbnN0IENQREZfQXBTZXR0aW5ncyYgdGhhdCk7CisgIH5DUERGX0FwU2V0dGluZ3MoKTsKIAotICBib29sIEhhc01LRW50cnkoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzRW50cnkpIGNvbnN0OworICBib29sIEhhc01LRW50cnkoY29uc3QgQnl0ZVN0cmluZyYgY3NFbnRyeSkgY29uc3Q7CiAgIGludCBHZXRSb3RhdGlvbigpIGNvbnN0OwogCiAgIEZYX0FSR0IgR2V0Qm9yZGVyQ29sb3IoaW50JiBpQ29sb3JUeXBlKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldENvbG9yKGlDb2xvclR5cGUsICJCQyIpOwogICB9CiAKLSAgRlhfRkxPQVQgR2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgZmxvYXQgR2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpbnQgaW5kZXgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0T3JpZ2luYWxDb2xvcihpbmRleCwgIkJDIik7CiAgIH0KIAotICB2b2lkIEdldE9yaWdpbmFsQm9yZGVyQ29sb3IoaW50JiBpQ29sb3JUeXBlLCBGWF9GTE9BVCBmY1s0XSkgY29uc3QgeworICB2b2lkIEdldE9yaWdpbmFsQm9yZGVyQ29sb3IoaW50JiBpQ29sb3JUeXBlLCBmbG9hdCBmY1s0XSkgY29uc3QgewogICAgIEdldE9yaWdpbmFsQ29sb3IoaUNvbG9yVHlwZSwgZmMsICJCQyIpOwogICB9CiAKQEAgLTM5LDM2ICs0MiwzNCBAQAogICAgIHJldHVybiBHZXRDb2xvcihpQ29sb3JUeXBlLCAiQkciKTsKICAgfQogCi0gIEZYX0ZMT0FUIEdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKGludCBpbmRleCkgY29uc3QgeworICBmbG9hdCBHZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcihpbnQgaW5kZXgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0T3JpZ2luYWxDb2xvcihpbmRleCwgIkJHIik7CiAgIH0KIAotICB2b2lkIEdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKGludCYgaUNvbG9yVHlwZSwgRlhfRkxPQVQgZmNbNF0pIGNvbnN0IHsKKyAgdm9pZCBHZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcihpbnQmIGlDb2xvclR5cGUsIGZsb2F0IGZjWzRdKSBjb25zdCB7CiAgICAgR2V0T3JpZ2luYWxDb2xvcihpQ29sb3JUeXBlLCBmYywgIkJHIik7CiAgIH0KIAotICBDRlhfV2lkZVN0cmluZyBHZXROb3JtYWxDYXB0aW9uKCkgY29uc3QgeyByZXR1cm4gR2V0Q2FwdGlvbigiQ0EiKTsgfQotICBDRlhfV2lkZVN0cmluZyBHZXRSb2xsb3ZlckNhcHRpb24oKSBjb25zdCB7IHJldHVybiBHZXRDYXB0aW9uKCJSQyIpOyB9Ci0gIENGWF9XaWRlU3RyaW5nIEdldERvd25DYXB0aW9uKCkgY29uc3QgeyByZXR1cm4gR2V0Q2FwdGlvbigiQUMiKTsgfQorICBXaWRlU3RyaW5nIEdldE5vcm1hbENhcHRpb24oKSBjb25zdCB7IHJldHVybiBHZXRDYXB0aW9uKCJDQSIpOyB9CisgIFdpZGVTdHJpbmcgR2V0Um9sbG92ZXJDYXB0aW9uKCkgY29uc3QgeyByZXR1cm4gR2V0Q2FwdGlvbigiUkMiKTsgfQorICBXaWRlU3RyaW5nIEdldERvd25DYXB0aW9uKCkgY29uc3QgeyByZXR1cm4gR2V0Q2FwdGlvbigiQUMiKTsgfQogICBDUERGX1N0cmVhbSogR2V0Tm9ybWFsSWNvbigpIGNvbnN0IHsgcmV0dXJuIEdldEljb24oIkkiKTsgfQogICBDUERGX1N0cmVhbSogR2V0Um9sbG92ZXJJY29uKCkgY29uc3QgeyByZXR1cm4gR2V0SWNvbigiUkkiKTsgfQogICBDUERGX1N0cmVhbSogR2V0RG93bkljb24oKSBjb25zdCB7IHJldHVybiBHZXRJY29uKCJJWCIpOyB9CiAgIENQREZfSWNvbkZpdCBHZXRJY29uRml0KCkgY29uc3Q7CiAgIGludCBHZXRUZXh0UG9zaXRpb24oKSBjb25zdDsKIAotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBDUERGX0Zvcm1Db250cm9sOwotCi0gIEZYX0FSR0IgR2V0Q29sb3IoaW50JiBpQ29sb3JUeXBlLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NFbnRyeSkgY29uc3Q7Ci0gIEZYX0ZMT0FUIEdldE9yaWdpbmFsQ29sb3IoaW50IGluZGV4LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NFbnRyeSkgY29uc3Q7CisgIEZYX0FSR0IgR2V0Q29sb3IoaW50JiBpQ29sb3JUeXBlLCBjb25zdCBCeXRlU3RyaW5nJiBjc0VudHJ5KSBjb25zdDsKKyAgZmxvYXQgR2V0T3JpZ2luYWxDb2xvcihpbnQgaW5kZXgsIGNvbnN0IEJ5dGVTdHJpbmcmIGNzRW50cnkpIGNvbnN0OwogICB2b2lkIEdldE9yaWdpbmFsQ29sb3IoaW50JiBpQ29sb3JUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZmNbNF0sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NFbnRyeSkgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmY1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIGNzRW50cnkpIGNvbnN0OwogCi0gIENGWF9XaWRlU3RyaW5nIEdldENhcHRpb24oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzRW50cnkpIGNvbnN0OwotICBDUERGX1N0cmVhbSogR2V0SWNvbihjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NFbnRyeSkgY29uc3Q7CisgIFdpZGVTdHJpbmcgR2V0Q2FwdGlvbihjb25zdCBCeXRlU3RyaW5nJiBjc0VudHJ5KSBjb25zdDsKKyAgQ1BERl9TdHJlYW0qIEdldEljb24oY29uc3QgQnl0ZVN0cmluZyYgY3NFbnRyeSkgY29uc3Q7CiAKLSAgQ1BERl9EaWN0aW9uYXJ5KiBjb25zdCBtX3BEaWN0OworIHByaXZhdGU6CisgIFVub3duZWRQdHI8Q1BERl9EaWN0aW9uYXJ5PiBjb25zdCBtX3BEaWN0OwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZET0NfQ1BERl9BUFNFVFRJTkdTX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3BkZl9ib29rbWFyay5jcHAgYi9jb3JlL2ZwZGZkb2MvY3BkZl9ib29rbWFyay5jcHAKaW5kZXggYzJjMzcwNS4uY2M3ZTEyNyAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfYm9va21hcmsuY3BwCisrKyBiL2NvcmUvZnBkZmRvYy9jcGRmX2Jvb2ttYXJrLmNwcApAQCAtNywxMiArNywyMSBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2Jvb2ttYXJrLmgiCiAKICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmluZy5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX25hbWV0cmVlLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgogCitDUERGX0Jvb2ttYXJrOjpDUERGX0Jvb2ttYXJrKCkge30KKworQ1BERl9Cb29rbWFyazo6Q1BERl9Cb29rbWFyayhjb25zdCBDUERGX0Jvb2ttYXJrJiB0aGF0KSA9IGRlZmF1bHQ7CisKK0NQREZfQm9va21hcms6OkNQREZfQm9va21hcmsoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgOiBtX3BEaWN0KHBEaWN0KSB7fQorCitDUERGX0Jvb2ttYXJrOjp+Q1BERl9Cb29rbWFyaygpIHt9CisKIHVpbnQzMl90IENQREZfQm9va21hcms6OkdldENvbG9yUmVmKCkgY29uc3QgewogICBpZiAoIW1fcERpY3QpCiAgICAgcmV0dXJuIEZYU1lTX1JHQigwLCAwLCAwKTsKQEAgLTMxLDI1ICs0MCwyNSBAQAogICByZXR1cm4gbV9wRGljdCA/IG1fcERpY3QtPkdldEludGVnZXJGb3IoIkYiKSA6IDA7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQREZfQm9va21hcms6OkdldFRpdGxlKCkgY29uc3QgeworV2lkZVN0cmluZyBDUERGX0Jvb2ttYXJrOjpHZXRUaXRsZSgpIGNvbnN0IHsKICAgaWYgKCFtX3BEaWN0KQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CiAKICAgQ1BERl9TdHJpbmcqIHBTdHJpbmcgPSBUb1N0cmluZyhtX3BEaWN0LT5HZXREaXJlY3RPYmplY3RGb3IoIlRpdGxlIikpOwogICBpZiAoIXBTdHJpbmcpCi0gICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CisgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKIAotICBDRlhfV2lkZVN0cmluZyB0aXRsZSA9IHBTdHJpbmctPkdldFVuaWNvZGVUZXh0KCk7CisgIFdpZGVTdHJpbmcgdGl0bGUgPSBwU3RyaW5nLT5HZXRVbmljb2RlVGV4dCgpOwogICBpbnQgbGVuID0gdGl0bGUuR2V0TGVuZ3RoKCk7CiAgIGlmICghbGVuKQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CiAKLSAgc3RkOjp1bmlxdWVfcHRyPEZYX1dDSEFSW10+IGJ1ZihuZXcgRlhfV0NIQVJbbGVuXSk7CisgIHN0ZDo6dmVjdG9yPHdjaGFyX3Q+IGJ1ZihsZW4pOwogICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgRlhfV0NIQVIgdyA9IHRpdGxlW2ldOworICAgIHdjaGFyX3QgdyA9IHRpdGxlW2ldOwogICAgIGJ1ZltpXSA9IHcgPiAweDIwID8gdyA6IDB4MjA7CiAgIH0KLSAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKGJ1Zi5nZXQoKSwgbGVuKTsKKyAgcmV0dXJuIFdpZGVTdHJpbmcoYnVmLmRhdGEoKSwgbGVuKTsKIH0KIAogQ1BERl9EZXN0IENQREZfQm9va21hcms6OkdldERlc3QoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KSBjb25zdCB7CkBAIC02MSw3ICs3MCw4IEBACiAgICAgcmV0dXJuIENQREZfRGVzdCgpOwogICBpZiAocERlc3QtPklzU3RyaW5nKCkgfHwgcERlc3QtPklzTmFtZSgpKSB7CiAgICAgQ1BERl9OYW1lVHJlZSBuYW1lX3RyZWUocERvY3VtZW50LCAiRGVzdHMiKTsKLSAgICByZXR1cm4gQ1BERl9EZXN0KG5hbWVfdHJlZS5Mb29rdXBOYW1lZERlc3QocERvY3VtZW50LCBwRGVzdC0+R2V0U3RyaW5nKCkpKTsKKyAgICByZXR1cm4gQ1BERl9EZXN0KAorICAgICAgICBuYW1lX3RyZWUuTG9va3VwTmFtZWREZXN0KHBEb2N1bWVudCwgcERlc3QtPkdldFVuaWNvZGVUZXh0KCkpKTsKICAgfQogICBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcERlc3QtPkFzQXJyYXkoKSkKICAgICByZXR1cm4gQ1BERl9EZXN0KHBBcnJheSk7CkBAIC02OSw1ICs3OSw1IEBACiB9CiAKIENQREZfQWN0aW9uIENQREZfQm9va21hcms6OkdldEFjdGlvbigpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcERpY3QgPyBDUERGX0FjdGlvbihtX3BEaWN0LT5HZXREaWN0Rm9yKCJBIikpIDogQ1BERl9BY3Rpb24oKTsKKyAgcmV0dXJuIENQREZfQWN0aW9uKG1fcERpY3QgPyBtX3BEaWN0LT5HZXREaWN0Rm9yKCJBIikgOiBudWxscHRyKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jcGRmX2Jvb2ttYXJrLmggYi9jb3JlL2ZwZGZkb2MvY3BkZl9ib29rbWFyay5oCmluZGV4IDMwYThhNTEuLjYwYzg2ZGQgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jcGRmX2Jvb2ttYXJrLmgKKysrIGIvY29yZS9mcGRmZG9jL2NwZGZfYm9va21hcmsuaApAQCAtMTAsMjQgKzEwLDI3IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfYWN0aW9uLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfZGVzdC5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogCiBjbGFzcyBDUERGX0RpY3Rpb25hcnk7CiBjbGFzcyBDUERGX0RvY3VtZW50OwogCiBjbGFzcyBDUERGX0Jvb2ttYXJrIHsKICBwdWJsaWM6Ci0gIENQREZfQm9va21hcmsoKSA6IG1fcERpY3QobnVsbHB0cikge30KLSAgZXhwbGljaXQgQ1BERl9Cb29rbWFyayhDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSA6IG1fcERpY3QocERpY3QpIHt9CisgIENQREZfQm9va21hcmsoKTsKKyAgQ1BERl9Cb29rbWFyayhjb25zdCBDUERGX0Jvb2ttYXJrJiB0aGF0KTsKKyAgZXhwbGljaXQgQ1BERl9Cb29rbWFyayhDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKKyAgfkNQREZfQm9va21hcmsoKTsKIAotICBDUERGX0RpY3Rpb25hcnkqIEdldERpY3QoKSBjb25zdCB7IHJldHVybiBtX3BEaWN0OyB9CisgIENQREZfRGljdGlvbmFyeSogR2V0RGljdCgpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3QuR2V0KCk7IH0KICAgdWludDMyX3QgR2V0Q29sb3JSZWYoKSBjb25zdDsKICAgdWludDMyX3QgR2V0Rm9udFN0eWxlKCkgY29uc3Q7Ci0gIENGWF9XaWRlU3RyaW5nIEdldFRpdGxlKCkgY29uc3Q7CisgIFdpZGVTdHJpbmcgR2V0VGl0bGUoKSBjb25zdDsKICAgQ1BERl9EZXN0IEdldERlc3QoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KSBjb25zdDsKICAgQ1BERl9BY3Rpb24gR2V0QWN0aW9uKCkgY29uc3Q7CiAKICBwcml2YXRlOgotICBDUERGX0RpY3Rpb25hcnkqIG1fcERpY3Q7CisgIFVub3duZWRQdHI8Q1BERl9EaWN0aW9uYXJ5PiBtX3BEaWN0OwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZET0NfQ1BERl9CT09LTUFSS19IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwZGZfYm9va21hcmt0cmVlLmNwcCBiL2NvcmUvZnBkZmRvYy9jcGRmX2Jvb2ttYXJrdHJlZS5jcHAKaW5kZXggMmE0MzE0NS4uMzNjOWYzZCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfYm9va21hcmt0cmVlLmNwcAorKysgYi9jb3JlL2ZwZGZkb2MvY3BkZl9ib29rbWFya3RyZWUuY3BwCkBAIC04LDEzICs4LDE3IEBACiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaCIKIAorQ1BERl9Cb29rbWFya1RyZWU6OkNQREZfQm9va21hcmtUcmVlKENQREZfRG9jdW1lbnQqIHBEb2MpIDogbV9wRG9jdW1lbnQocERvYykge30KKworQ1BERl9Cb29rbWFya1RyZWU6On5DUERGX0Jvb2ttYXJrVHJlZSgpIHt9CisKIENQREZfQm9va21hcmsgQ1BERl9Cb29rbWFya1RyZWU6OkdldEZpcnN0Q2hpbGQoCiAgICAgY29uc3QgQ1BERl9Cb29rbWFyayYgcGFyZW50KSBjb25zdCB7CiAgIENQREZfRGljdGlvbmFyeSogcFBhcmVudERpY3QgPSBwYXJlbnQuR2V0RGljdCgpOwogICBpZiAocFBhcmVudERpY3QpCiAgICAgcmV0dXJuIENQREZfQm9va21hcmsocFBhcmVudERpY3QtPkdldERpY3RGb3IoIkZpcnN0IikpOwogCi0gIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOworICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKICAgaWYgKCFwUm9vdCkKICAgICByZXR1cm4gQ1BERl9Cb29rbWFyaygpOwogCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3BkZl9ib29rbWFya3RyZWUuaCBiL2NvcmUvZnBkZmRvYy9jcGRmX2Jvb2ttYXJrdHJlZS5oCmluZGV4IDcyMDczNTcuLjM3MjlkZmMgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jcGRmX2Jvb2ttYXJrdHJlZS5oCisrKyBiL2NvcmUvZnBkZmRvYy9jcGRmX2Jvb2ttYXJrdHJlZS5oCkBAIC04LDE5ICs4LDIxIEBACiAjZGVmaW5lIENPUkVfRlBERkRPQ19DUERGX0JPT0tNQVJLVFJFRV9IXwogCiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfYm9va21hcmsuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAKIGNsYXNzIENQREZfRG9jdW1lbnQ7CiAKIGNsYXNzIENQREZfQm9va21hcmtUcmVlIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IENQREZfQm9va21hcmtUcmVlKENQREZfRG9jdW1lbnQqIHBEb2MpIDogbV9wRG9jdW1lbnQocERvYykge30KKyAgZXhwbGljaXQgQ1BERl9Cb29rbWFya1RyZWUoQ1BERl9Eb2N1bWVudCogcERvYyk7CisgIH5DUERGX0Jvb2ttYXJrVHJlZSgpOwogCiAgIENQREZfQm9va21hcmsgR2V0Rmlyc3RDaGlsZChjb25zdCBDUERGX0Jvb2ttYXJrJiBwYXJlbnQpIGNvbnN0OwogICBDUERGX0Jvb2ttYXJrIEdldE5leHRTaWJsaW5nKGNvbnN0IENQREZfQm9va21hcmsmIGJvb2ttYXJrKSBjb25zdDsKLSAgQ1BERl9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BEb2N1bWVudDsgfQorICBDUERGX0RvY3VtZW50KiBHZXREb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcERvY3VtZW50LkdldCgpOyB9CiAKICBwcml2YXRlOgotICBDUERGX0RvY3VtZW50KiBjb25zdCBtX3BEb2N1bWVudDsKKyAgVW5vd25lZFB0cjxDUERGX0RvY3VtZW50PiBjb25zdCBtX3BEb2N1bWVudDsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9GUERGRE9DX0NQREZfQk9PS01BUktUUkVFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3BkZl9kZWZhdWx0YXBwZWFyYW5jZS5jcHAgYi9jb3JlL2ZwZGZkb2MvY3BkZl9kZWZhdWx0YXBwZWFyYW5jZS5jcHAKaW5kZXggMTk3Njc2NS4uMDJkNmVlYSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfZGVmYXVsdGFwcGVhcmFuY2UuY3BwCisrKyBiL2NvcmUvZnBkZmRvYy9jcGRmX2RlZmF1bHRhcHBlYXJhbmNlLmNwcApAQCAtMTAsMjIgKzEwLDIyIEBACiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc2ltcGxlX3BhcnNlci5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfZm9ybWNvbnRyb2wuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2NvbG9yLmgiCiAKIGJvb2wgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6SGFzRm9udCgpIHsKICAgaWYgKG1fY3NEQS5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChtX2NzREEuQXNTdHJpbmdDKCkpOworICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBLkFzU3RyaW5nVmlldygpKTsKICAgcmV0dXJuIHN5bnRheC5GaW5kVGFnUGFyYW1Gcm9tU3RhcnQoIlRmIiwgMik7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6OkdldEZvbnRTdHJpbmcoKSB7Ci0gIENGWF9CeXRlU3RyaW5nIGNzRm9udDsKK0J5dGVTdHJpbmcgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6R2V0Rm9udFN0cmluZygpIHsKKyAgQnl0ZVN0cmluZyBjc0ZvbnQ7CiAgIGlmIChtX2NzREEuSXNFbXB0eSgpKQogICAgIHJldHVybiBjc0ZvbnQ7CiAKLSAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQS5Bc1N0cmluZ0MoKSk7CisgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChtX2NzREEuQXNTdHJpbmdWaWV3KCkpOwogICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbUZyb21TdGFydCgiVGYiLCAyKSkgewogICAgIGNzRm9udCArPSBzeW50YXguR2V0V29yZCgpOwogICAgIGNzRm9udCArPSAiICI7CkBAIC0zNiwyNyArMzYsMjYgQEAKICAgcmV0dXJuIGNzRm9udDsKIH0KIAotdm9pZCBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRGb250KENGWF9CeXRlU3RyaW5nJiBjc0ZvbnROYW1lVGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmRm9udFNpemUpIHsKLSAgY3NGb250TmFtZVRhZyA9ICIiOwotICBmRm9udFNpemUgPSAwOworQnl0ZVN0cmluZyBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRGb250KGZsb2F0KiBmRm9udFNpemUpIHsKKyAgKmZGb250U2l6ZSA9IDAuMGY7CiAgIGlmIChtX2NzREEuSXNFbXB0eSgpKQotICAgIHJldHVybjsKKyAgICByZXR1cm4gQnl0ZVN0cmluZygpOwogCi0gIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChtX2NzREEuQXNTdHJpbmdDKCkpOworICBCeXRlU3RyaW5nIGNzRm9udE5hbWVUYWc7CisgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChtX2NzREEuQXNTdHJpbmdWaWV3KCkpOwogICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbUZyb21TdGFydCgiVGYiLCAyKSkgewotICAgIGNzRm9udE5hbWVUYWcgPSBDRlhfQnl0ZVN0cmluZyhzeW50YXguR2V0V29yZCgpKTsKKyAgICBjc0ZvbnROYW1lVGFnID0gQnl0ZVN0cmluZyhzeW50YXguR2V0V29yZCgpKTsKICAgICBjc0ZvbnROYW1lVGFnLkRlbGV0ZSgwLCAxKTsKLSAgICBmRm9udFNpemUgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOworICAgICpmRm9udFNpemUgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOwogICB9Ci0gIGNzRm9udE5hbWVUYWcgPSBQREZfTmFtZURlY29kZShjc0ZvbnROYW1lVGFnKTsKKyAgcmV0dXJuIFBERl9OYW1lRGVjb2RlKGNzRm9udE5hbWVUYWcpOwogfQogCiBib29sIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6Okhhc0NvbG9yKFBhaW50T3BlcmF0aW9uIG5PcGVyYXRpb24pIHsKICAgaWYgKG1fY3NEQS5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChtX2NzREEuQXNTdHJpbmdDKCkpOworICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBLkFzU3RyaW5nVmlldygpKTsKICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW1Gcm9tU3RhcnQoCiAgICAgICAgICAgKG5PcGVyYXRpb24gPT0gUGFpbnRPcGVyYXRpb246OlNUUk9LRSA/ICJHIiA6ICJnIiksIDEpKSB7CiAgICAgcmV0dXJuIHRydWU7CkBAIC02OSwxMyArNjgsMTIgQEAKICAgICAgIChuT3BlcmF0aW9uID09IFBhaW50T3BlcmF0aW9uOjpTVFJPS0UgPyAiSyIgOiAiayIpLCA0KTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6R2V0Q29sb3JTdHJpbmcoCi0gICAgUGFpbnRPcGVyYXRpb24gbk9wZXJhdGlvbikgewotICBDRlhfQnl0ZVN0cmluZyBjc0NvbG9yOworQnl0ZVN0cmluZyBDUERGX0RlZmF1bHRBcHBlYXJhbmNlOjpHZXRDb2xvclN0cmluZyhQYWludE9wZXJhdGlvbiBuT3BlcmF0aW9uKSB7CisgIEJ5dGVTdHJpbmcgY3NDb2xvcjsKICAgaWYgKG1fY3NEQS5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuIGNzQ29sb3I7CiAKLSAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQS5Bc1N0cmluZ0MoKSk7CisgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChtX2NzREEuQXNTdHJpbmdWaWV3KCkpOwogICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbUZyb21TdGFydCgKICAgICAgICAgICAobk9wZXJhdGlvbiA9PSBQYWludE9wZXJhdGlvbjo6U1RST0tFID8gIkciIDogImciKSwgMSkpIHsKICAgICBjc0NvbG9yICs9IHN5bnRheC5HZXRXb3JkKCk7CkBAIC0xMTAsMjUgKzEwOCwyNSBAQAogfQogCiB2b2lkIENQREZfRGVmYXVsdEFwcGVhcmFuY2U6OkdldENvbG9yKGludCYgaUNvbG9yVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZmNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZjWzRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludE9wZXJhdGlvbiBuT3BlcmF0aW9uKSB7Ci0gIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ7CisgIGlDb2xvclR5cGUgPSBDRlhfQ29sb3I6OmtUcmFuc3BhcmVudDsKICAgZm9yIChpbnQgYyA9IDA7IGMgPCA0OyBjKyspCiAgICAgZmNbY10gPSAwOwogCiAgIGlmIChtX2NzREEuSXNFbXB0eSgpKQogICAgIHJldHVybjsKIAotICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBLkFzU3RyaW5nQygpKTsKKyAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQS5Bc1N0cmluZ1ZpZXcoKSk7CiAgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtRnJvbVN0YXJ0KAogICAgICAgICAgIChuT3BlcmF0aW9uID09IFBhaW50T3BlcmF0aW9uOjpTVFJPS0UgPyAiRyIgOiAiZyIpLCAxKSkgewotICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfR1JBWTsKKyAgICBpQ29sb3JUeXBlID0gQ0ZYX0NvbG9yOjprR3JheTsKICAgICBmY1swXSA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7CiAgICAgcmV0dXJuOwogICB9CiAgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtRnJvbVN0YXJ0KAogICAgICAgICAgIChuT3BlcmF0aW9uID09IFBhaW50T3BlcmF0aW9uOjpTVFJPS0UgPyAiUkciIDogInJnIiksIDMpKSB7Ci0gICAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9SR0I7CisgICAgaUNvbG9yVHlwZSA9IENGWF9Db2xvcjo6a1JHQjsKICAgICBmY1swXSA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7CiAgICAgZmNbMV0gPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOwogICAgIGZjWzJdID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKQEAgLTEzNiw3ICsxMzQsNyBAQAogICB9CiAgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtRnJvbVN0YXJ0KAogICAgICAgICAgIChuT3BlcmF0aW9uID09IFBhaW50T3BlcmF0aW9uOjpTVFJPS0UgPyAiSyIgOiAiayIpLCA0KSkgewotICAgIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfQ01ZSzsKKyAgICBpQ29sb3JUeXBlID0gQ0ZYX0NvbG9yOjprQ01ZSzsKICAgICBmY1swXSA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7CiAgICAgZmNbMV0gPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOwogICAgIGZjWzJdID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKQEAgLTE0OCwzNyArMTQ2LDM3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgaUNvbG9yVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnRPcGVyYXRpb24gbk9wZXJhdGlvbikgewogICBjb2xvciA9IDA7Ci0gIGlDb2xvclR5cGUgPSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ7CisgIGlDb2xvclR5cGUgPSBDRlhfQ29sb3I6OmtUcmFuc3BhcmVudDsKICAgaWYgKG1fY3NEQS5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuOwogCi0gIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChtX2NzREEuQXNTdHJpbmdDKCkpOworICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBLkFzU3RyaW5nVmlldygpKTsKICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW1Gcm9tU3RhcnQoCiAgICAgICAgICAgKG5PcGVyYXRpb24gPT0gUGFpbnRPcGVyYXRpb246OlNUUk9LRSA/ICJHIiA6ICJnIiksIDEpKSB7Ci0gICAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9HUkFZOwotICAgIEZYX0ZMT0FUIGcgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpICogMjU1ICsgMC41ZjsKKyAgICBpQ29sb3JUeXBlID0gQ0ZYX0NvbG9yOjprR3JheTsKKyAgICBmbG9hdCBnID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKSAqIDI1NSArIDAuNWY7CiAgICAgY29sb3IgPSBBcmdiRW5jb2RlKDI1NSwgKGludClnLCAoaW50KWcsIChpbnQpZyk7CiAgICAgcmV0dXJuOwogICB9CiAgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtRnJvbVN0YXJ0KAogICAgICAgICAgIChuT3BlcmF0aW9uID09IFBhaW50T3BlcmF0aW9uOjpTVFJPS0UgPyAiUkciIDogInJnIiksIDMpKSB7Ci0gICAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9SR0I7Ci0gICAgRlhfRkxPQVQgciA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSkgKiAyNTUgKyAwLjVmOwotICAgIEZYX0ZMT0FUIGcgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpICogMjU1ICsgMC41ZjsKLSAgICBGWF9GTE9BVCBiID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKSAqIDI1NSArIDAuNWY7CisgICAgaUNvbG9yVHlwZSA9IENGWF9Db2xvcjo6a1JHQjsKKyAgICBmbG9hdCByID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKSAqIDI1NSArIDAuNWY7CisgICAgZmxvYXQgZyA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSkgKiAyNTUgKyAwLjVmOworICAgIGZsb2F0IGIgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpICogMjU1ICsgMC41ZjsKICAgICBjb2xvciA9IEFyZ2JFbmNvZGUoMjU1LCAoaW50KXIsIChpbnQpZywgKGludCliKTsKICAgICByZXR1cm47CiAgIH0KICAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW1Gcm9tU3RhcnQoCiAgICAgICAgICAgKG5PcGVyYXRpb24gPT0gUGFpbnRPcGVyYXRpb246OlNUUk9LRSA/ICJLIiA6ICJrIiksIDQpKSB7Ci0gICAgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9DTVlLOwotICAgIEZYX0ZMT0FUIGMgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOwotICAgIEZYX0ZMT0FUIG0gPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOwotICAgIEZYX0ZMT0FUIHkgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOwotICAgIEZYX0ZMT0FUIGsgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOwotICAgIEZYX0ZMT0FUIHIgPSAxLjBmIC0gc3RkOjptaW4oMS4wZiwgYyArIGspOwotICAgIEZYX0ZMT0FUIGcgPSAxLjBmIC0gc3RkOjptaW4oMS4wZiwgbSArIGspOwotICAgIEZYX0ZMT0FUIGIgPSAxLjBmIC0gc3RkOjptaW4oMS4wZiwgeSArIGspOworICAgIGlDb2xvclR5cGUgPSBDRlhfQ29sb3I6OmtDTVlLOworICAgIGZsb2F0IGMgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOworICAgIGZsb2F0IG0gPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOworICAgIGZsb2F0IHkgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOworICAgIGZsb2F0IGsgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOworICAgIGZsb2F0IHIgPSAxLjBmIC0gc3RkOjptaW4oMS4wZiwgYyArIGspOworICAgIGZsb2F0IGcgPSAxLjBmIC0gc3RkOjptaW4oMS4wZiwgbSArIGspOworICAgIGZsb2F0IGIgPSAxLjBmIC0gc3RkOjptaW4oMS4wZiwgeSArIGspOwogICAgIGNvbG9yID0gQXJnYkVuY29kZSgyNTUsIChpbnQpKHIgKiAyNTUgKyAwLjVmKSwgKGludCkoZyAqIDI1NSArIDAuNWYpLAogICAgICAgICAgICAgICAgICAgICAgICAoaW50KShiICogMjU1ICsgMC41ZikpOwogICB9CkBAIC0xODgsMTYgKzE4NiwxNiBAQAogICBpZiAobV9jc0RBLklzRW1wdHkoKSkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQS5Bc1N0cmluZ0MoKSk7CisgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChtX2NzREEuQXNTdHJpbmdWaWV3KCkpOwogICByZXR1cm4gc3ludGF4LkZpbmRUYWdQYXJhbUZyb21TdGFydCgiVG0iLCA2KTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6R2V0VGV4dE1hdHJpeFN0cmluZygpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgY3NUTTsKK0J5dGVTdHJpbmcgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZTo6R2V0VGV4dE1hdHJpeFN0cmluZygpIHsKKyAgQnl0ZVN0cmluZyBjc1RNOwogICBpZiAobV9jc0RBLklzRW1wdHkoKSkKICAgICByZXR1cm4gY3NUTTsKIAotICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgobV9jc0RBLkFzU3RyaW5nQygpKTsKKyAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQS5Bc1N0cmluZ1ZpZXcoKSk7CiAgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtRnJvbVN0YXJ0KCJUbSIsIDYpKSB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKICAgICAgIGNzVE0gKz0gc3ludGF4LkdldFdvcmQoKTsKQEAgLTIxMiwxMSArMjEwLDExIEBACiAgIGlmIChtX2NzREEuSXNFbXB0eSgpKQogICAgIHJldHVybiBDRlhfTWF0cml4KCk7CiAKLSAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KG1fY3NEQS5Bc1N0cmluZ0MoKSk7CisgIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChtX2NzREEuQXNTdHJpbmdWaWV3KCkpOwogICBpZiAoIXN5bnRheC5GaW5kVGFnUGFyYW1Gcm9tU3RhcnQoIlRtIiwgNikpCiAgICAgcmV0dXJuIENGWF9NYXRyaXgoKTsKIAotICBGWF9GTE9BVCBmWzZdOworICBmbG9hdCBmWzZdOwogICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykKICAgICBmW2ldID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKICAgcmV0dXJuIENGWF9NYXRyaXgoZik7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3BkZl9kZWZhdWx0YXBwZWFyYW5jZS5oIGIvY29yZS9mcGRmZG9jL2NwZGZfZGVmYXVsdGFwcGVhcmFuY2UuaAppbmRleCA0ZmQzMmViLi4zM2Q0YmZkIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZkb2MvY3BkZl9kZWZhdWx0YXBwZWFyYW5jZS5oCisrKyBiL2NvcmUvZnBkZmRvYy9jcGRmX2RlZmF1bHRhcHBlYXJhbmNlLmgKQEAgLTE5LDM0ICsxOSwzMyBAQAogY2xhc3MgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSB7CiAgcHVibGljOgogICBDUERGX0RlZmF1bHRBcHBlYXJhbmNlKCkge30KLSAgZXhwbGljaXQgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NEQSkgOiBtX2NzREEoY3NEQSkge30KKyAgZXhwbGljaXQgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZShjb25zdCBCeXRlU3RyaW5nJiBjc0RBKSA6IG1fY3NEQShjc0RBKSB7fQogCiAgIENQREZfRGVmYXVsdEFwcGVhcmFuY2UoY29uc3QgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSYgY0RBKSB7CiAgICAgbV9jc0RBID0gY0RBLkdldFN0cigpOwogICB9CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0U3RyKCkgY29uc3QgeyByZXR1cm4gbV9jc0RBOyB9CisgIEJ5dGVTdHJpbmcgR2V0U3RyKCkgY29uc3QgeyByZXR1cm4gbV9jc0RBOyB9CiAKICAgYm9vbCBIYXNGb250KCk7Ci0gIENGWF9CeXRlU3RyaW5nIEdldEZvbnRTdHJpbmcoKTsKLSAgdm9pZCBHZXRGb250KENGWF9CeXRlU3RyaW5nJiBjc0ZvbnROYW1lVGFnLCBGWF9GTE9BVCYgZkZvbnRTaXplKTsKKyAgQnl0ZVN0cmluZyBHZXRGb250U3RyaW5nKCk7CisgIEJ5dGVTdHJpbmcgR2V0Rm9udChmbG9hdCogZkZvbnRTaXplKTsKIAogICBib29sIEhhc0NvbG9yKFBhaW50T3BlcmF0aW9uIG5PcGVyYXRpb24gPSBQYWludE9wZXJhdGlvbjo6RklMTCk7Ci0gIENGWF9CeXRlU3RyaW5nIEdldENvbG9yU3RyaW5nKAotICAgICAgUGFpbnRPcGVyYXRpb24gbk9wZXJhdGlvbiA9IFBhaW50T3BlcmF0aW9uOjpGSUxMKTsKKyAgQnl0ZVN0cmluZyBHZXRDb2xvclN0cmluZyhQYWludE9wZXJhdGlvbiBuT3BlcmF0aW9uID0gUGFpbnRPcGVyYXRpb246OkZJTEwpOwogICB2b2lkIEdldENvbG9yKGludCYgaUNvbG9yVHlwZSwKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBmY1s0XSwKKyAgICAgICAgICAgICAgICBmbG9hdCBmY1s0XSwKICAgICAgICAgICAgICAgICBQYWludE9wZXJhdGlvbiBuT3BlcmF0aW9uID0gUGFpbnRPcGVyYXRpb246OkZJTEwpOwogICB2b2lkIEdldENvbG9yKEZYX0FSR0ImIGNvbG9yLAogICAgICAgICAgICAgICAgIGludCYgaUNvbG9yVHlwZSwKICAgICAgICAgICAgICAgICBQYWludE9wZXJhdGlvbiBuT3BlcmF0aW9uID0gUGFpbnRPcGVyYXRpb246OkZJTEwpOwogCiAgIGJvb2wgSGFzVGV4dE1hdHJpeCgpOwotICBDRlhfQnl0ZVN0cmluZyBHZXRUZXh0TWF0cml4U3RyaW5nKCk7CisgIEJ5dGVTdHJpbmcgR2V0VGV4dE1hdHJpeFN0cmluZygpOwogICBDRlhfTWF0cml4IEdldFRleHRNYXRyaXgoKTsKIAogIHByaXZhdGU6Ci0gIENGWF9CeXRlU3RyaW5nIG1fY3NEQTsKKyAgQnl0ZVN0cmluZyBtX2NzREE7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkRPQ19DUERGX0RFRkFVTFRBUFBFQVJBTkNFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3BkZl9kZXN0LmNwcCBiL2NvcmUvZnBkZmRvYy9jcGRmX2Rlc3QuY3BwCmluZGV4IDUxZTJkMGIuLjAwOThmNzMgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jcGRmX2Rlc3QuY3BwCisrKyBiL2NvcmUvZnBkZmRvYy9jcGRmX2Rlc3QuY3BwCkBAIC02LDYgKzYsOCBAQAogCiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfZGVzdC5oIgogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RvY3VtZW50LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX25hbWUuaCIKQEAgLTEzLDEzICsxNSwzMSBAQAogCiBuYW1lc3BhY2UgewogCi1jb25zdCBGWF9DSEFSKiBjb25zdCBnX3Nab29tTW9kZXNbXSA9IHsiWFlaIiwgICJGaXQiLCAgICJGaXRIIiwgICJGaXRWIiwgIkZpdFIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpdEIiLCAiRml0QkgiLCAiRml0QlYiLCBudWxscHRyfTsKKy8vIFRoZXNlIGFycmF5cyBhcmUgaW5kZXhlZCBieSB0aGUgUERGREVTVF9WSUVXXyogY29uc3RhbnRzLgorCisvLyBMYXN0IGVsZW1lbnQgaXMgYSBzZW50aW5lbC4KK2NvbnN0IGNoYXIqIGNvbnN0IGdfc1pvb21Nb2Rlc1tdID0geyJVbmtub3duIiwgIlhZWiIsICAiRml0IiwgICJGaXRIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaXRWIiwgICAgIkZpdFIiLCAiRml0QiIsICJGaXRCSCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRml0QlYiLCAgIG51bGxwdHJ9OworCitjb25zdCB1aW50OF90IGdfc1pvb21Nb2RlTWF4UGFyYW1Db3VudFtdID0gezAsIDMsIDAsIDEsIDEsIDQsIDAsIDEsIDEsIDB9OworCitzdGF0aWNfYXNzZXJ0KEZYX0FycmF5U2l6ZShnX3Nab29tTW9kZXMpID09CisgICAgICAgICAgICAgICAgICBGWF9BcnJheVNpemUoZ19zWm9vbU1vZGVNYXhQYXJhbUNvdW50KSwKKyAgICAgICAgICAgICAgIlpvb20gbW9kZSBjb3VudCBNaXNtYXRjaCIpOwogCiB9ICAvLyBuYW1lc3BhY2UKIAotaW50IENQREZfRGVzdDo6R2V0UGFnZUluZGV4KENQREZfRG9jdW1lbnQqIHBEb2MpIHsKLSAgQ1BERl9BcnJheSogcEFycmF5ID0gVG9BcnJheShtX3BPYmopOworQ1BERl9EZXN0OjpDUERGX0Rlc3QoKSB7fQorCitDUERGX0Rlc3Q6OkNQREZfRGVzdChjb25zdCBDUERGX0Rlc3QmIHBPYmopID0gZGVmYXVsdDsKKworQ1BERl9EZXN0OjpDUERGX0Rlc3QoQ1BERl9PYmplY3QqIHBPYmopIDogbV9wT2JqKHBPYmopIHt9CisKK0NQREZfRGVzdDo6fkNQREZfRGVzdCgpIHt9CisKK2ludCBDUERGX0Rlc3Q6OkdldFBhZ2VJbmRleChDUERGX0RvY3VtZW50KiBwRG9jKSBjb25zdCB7CisgIENQREZfQXJyYXkqIHBBcnJheSA9IFRvQXJyYXkobV9wT2JqLkdldCgpKTsKICAgaWYgKCFwQXJyYXkpCiAgICAgcmV0dXJuIDA7CiAKQEAgLTMzLDggKzUzLDggQEAKICAgcmV0dXJuIHBEb2MtPkdldFBhZ2VJbmRleChwUGFnZS0+R2V0T2JqTnVtKCkpOwogfQogCi11aW50MzJfdCBDUERGX0Rlc3Q6OkdldFBhZ2VPYmpOdW0oKSB7Ci0gIENQREZfQXJyYXkqIHBBcnJheSA9IFRvQXJyYXkobV9wT2JqKTsKK3VpbnQzMl90IENQREZfRGVzdDo6R2V0UGFnZU9iak51bSgpIGNvbnN0IHsKKyAgQ1BERl9BcnJheSogcEFycmF5ID0gVG9BcnJheShtX3BPYmouR2V0KCkpOwogICBpZiAoIXBBcnJheSkKICAgICByZXR1cm4gMDsKIApAQCAtNDgsOCArNjgsOCBAQAogICByZXR1cm4gMDsKIH0KIAotaW50IENQREZfRGVzdDo6R2V0Wm9vbU1vZGUoKSB7Ci0gIENQREZfQXJyYXkqIHBBcnJheSA9IFRvQXJyYXkobV9wT2JqKTsKK2ludCBDUERGX0Rlc3Q6OkdldFpvb21Nb2RlKCkgY29uc3QgeworICBDUERGX0FycmF5KiBwQXJyYXkgPSBUb0FycmF5KG1fcE9iai5HZXQoKSk7CiAgIGlmICghcEFycmF5KQogICAgIHJldHVybiAwOwogCkBAIC01NywxMCArNzcsMTAgQEAKICAgaWYgKCFwT2JqKQogICAgIHJldHVybiAwOwogCi0gIENGWF9CeXRlU3RyaW5nIG1vZGUgPSBwT2JqLT5HZXRTdHJpbmcoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGdfc1pvb21Nb2Rlc1tpXTsgKytpKSB7CisgIEJ5dGVTdHJpbmcgbW9kZSA9IHBPYmotPkdldFN0cmluZygpOworICBmb3IgKGludCBpID0gMTsgZ19zWm9vbU1vZGVzW2ldOyArK2kpIHsKICAgICBpZiAobW9kZSA9PSBnX3Nab29tTW9kZXNbaV0pCi0gICAgICByZXR1cm4gaSArIDE7CisgICAgICByZXR1cm4gaTsKICAgfQogCiAgIHJldHVybiAwOwpAQCAtNzYsNyArOTYsNyBAQAogICAqcEhhc1kgPSBmYWxzZTsKICAgKnBIYXNab29tID0gZmFsc2U7CiAKLSAgQ1BERl9BcnJheSogcEFycmF5ID0gVG9BcnJheShtX3BPYmopOworICBDUERGX0FycmF5KiBwQXJyYXkgPSBUb0FycmF5KG1fcE9iai5HZXQoKSk7CiAgIGlmICghcEFycmF5KQogICAgIHJldHVybiBmYWxzZTsKIApAQCAtMTEzLDExICsxMzMsMjEgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLUZYX0ZMT0FUIENQREZfRGVzdDo6R2V0UGFyYW0oaW50IGluZGV4KSB7Ci0gIENQREZfQXJyYXkqIHBBcnJheSA9IFRvQXJyYXkobV9wT2JqKTsKK3Vuc2lnbmVkIGxvbmcgQ1BERl9EZXN0OjpHZXROdW1QYXJhbXMoKSBjb25zdCB7CisgIENQREZfQXJyYXkqIHBBcnJheSA9IFRvQXJyYXkobV9wT2JqLkdldCgpKTsKKyAgaWYgKCFwQXJyYXkgfHwgcEFycmF5LT5HZXRDb3VudCgpIDwgMikKKyAgICByZXR1cm4gMDsKKworICB1bnNpZ25lZCBsb25nIG1heFBhcmFtc0ZvckZpdFR5cGUgPSBnX3Nab29tTW9kZU1heFBhcmFtQ291bnRbR2V0Wm9vbU1vZGUoKV07CisgIHVuc2lnbmVkIGxvbmcgbnVtUGFyYW1zSW5BcnJheSA9IHBBcnJheS0+R2V0Q291bnQoKSAtIDI7CisgIHJldHVybiBzdGQ6Om1pbihtYXhQYXJhbXNGb3JGaXRUeXBlLCBudW1QYXJhbXNJbkFycmF5KTsKK30KKworZmxvYXQgQ1BERl9EZXN0OjpHZXRQYXJhbShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgQ1BERl9BcnJheSogcEFycmF5ID0gVG9BcnJheShtX3BPYmouR2V0KCkpOwogICByZXR1cm4gcEFycmF5ID8gcEFycmF5LT5HZXROdW1iZXJBdCgyICsgaW5kZXgpIDogMDsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9EZXN0OjpHZXRSZW1vdGVOYW1lKCkgewotICByZXR1cm4gbV9wT2JqID8gbV9wT2JqLT5HZXRTdHJpbmcoKSA6IENGWF9CeXRlU3RyaW5nKCk7CitCeXRlU3RyaW5nIENQREZfRGVzdDo6R2V0UmVtb3RlTmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcE9iaiA/IG1fcE9iai0+R2V0U3RyaW5nKCkgOiBCeXRlU3RyaW5nKCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3BkZl9kZXN0LmggYi9jb3JlL2ZwZGZkb2MvY3BkZl9kZXN0LmgKaW5kZXggNTI3ZDFkYy4uNTg0NjY5YSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfZGVzdC5oCisrKyBiL2NvcmUvZnBkZmRvYy9jcGRmX2Rlc3QuaApAQCAtOSwyMSArOSwyOCBAQAogCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKIAogY2xhc3MgQ1BERl9Eb2N1bWVudDsKIGNsYXNzIENQREZfT2JqZWN0OwogCiBjbGFzcyBDUERGX0Rlc3QgewogIHB1YmxpYzoKLSAgQ1BERl9EZXN0KCkgOiBtX3BPYmoobnVsbHB0cikge30KLSAgZXhwbGljaXQgQ1BERl9EZXN0KENQREZfT2JqZWN0KiBwT2JqKSA6IG1fcE9iaihwT2JqKSB7fQorICBDUERGX0Rlc3QoKTsKKyAgQ1BERl9EZXN0KGNvbnN0IENQREZfRGVzdCYgdGhhdCk7CisgIGV4cGxpY2l0IENQREZfRGVzdChDUERGX09iamVjdCogcE9iaik7CisgIH5DUERGX0Rlc3QoKTsKIAotICBDUERGX09iamVjdCogR2V0T2JqZWN0KCkgY29uc3QgeyByZXR1cm4gbV9wT2JqOyB9Ci0gIENGWF9CeXRlU3RyaW5nIEdldFJlbW90ZU5hbWUoKTsKLSAgaW50IEdldFBhZ2VJbmRleChDUERGX0RvY3VtZW50KiBwRG9jKTsKLSAgdWludDMyX3QgR2V0UGFnZU9iak51bSgpOwotICBpbnQgR2V0Wm9vbU1vZGUoKTsKLSAgRlhfRkxPQVQgR2V0UGFyYW0oaW50IGluZGV4KTsKKyAgQ1BERl9PYmplY3QqIEdldE9iamVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fcE9iai5HZXQoKTsgfQorICBCeXRlU3RyaW5nIEdldFJlbW90ZU5hbWUoKSBjb25zdDsKKyAgaW50IEdldFBhZ2VJbmRleChDUERGX0RvY3VtZW50KiBwRG9jKSBjb25zdDsKKyAgdWludDMyX3QgR2V0UGFnZU9iak51bSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdGhlIHpvb20gbW9kZSwgYXMgb25lIG9mIHRoZSBQREZERVNUX1ZJRVdfKiB2YWx1ZXMgaW4gZnBkZl9kb2MuaC4KKyAgaW50IEdldFpvb21Nb2RlKCkgY29uc3Q7CisKKyAgdW5zaWduZWQgbG9uZyBHZXROdW1QYXJhbXMoKSBjb25zdDsKKyAgZmxvYXQgR2V0UGFyYW0oaW50IGluZGV4KSBjb25zdDsKIAogICBib29sIEdldFhZWihib29sKiBwSGFzWCwKICAgICAgICAgICAgICAgYm9vbCogcEhhc1ksCkBAIC0zMyw3ICs0MCw3IEBACiAgICAgICAgICAgICAgIGZsb2F0KiBwWm9vbSkgY29uc3Q7CiAKICBwcml2YXRlOgotICBDUERGX09iamVjdCogbV9wT2JqOworICBVbm93bmVkUHRyPENQREZfT2JqZWN0PiBtX3BPYmo7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkRPQ19DUERGX0RFU1RfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jcGRmX2Rlc3RfdW5pdHRlc3QuY3BwIGIvY29yZS9mcGRmZG9jL2NwZGZfZGVzdF91bml0dGVzdC5jcHAKaW5kZXggN2MzNTM3MS4uMmIzYzg2YSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfZGVzdF91bml0dGVzdC5jcHAKKysrIGIvY29yZS9mcGRmZG9jL2NwZGZfZGVzdF91bml0dGVzdC5jcHAKQEAgLTE5LDQzICsxOSw0OCBAQAogICBmbG9hdCB5OwogICBmbG9hdCB6b29tOwogCi0gIGF1dG8gZGVzdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0Rlc3Q+KCk7Ci0gIEVYUEVDVF9GQUxTRShkZXN0LT5HZXRYWVooJmhhc1gsICZoYXNZLCAmaGFzWm9vbSwgJngsICZ5LCAmem9vbSkpOwotCisgIC8vIHxhcnJheXwgbXVzdCBvdXRsaXZlIHxkZXN0fC4KICAgYXV0byBhcnJheSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0FycmF5PigpOwogICBhcnJheS0+QWRkTmV3PENQREZfTnVtYmVyPigwKTsgIC8vIFBhZ2UgSW5kZXguCiAgIGFycmF5LT5BZGROZXc8Q1BERl9OYW1lPigiWFlaIik7CiAgIGFycmF5LT5BZGROZXc8Q1BERl9OdW1iZXI+KDQpOyAgLy8gWAotCi0gIC8vIE5vdCBlbm91Z2ggZW50cmllcy4KLSAgZGVzdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0Rlc3Q+KGFycmF5LmdldCgpKTsKLSAgRVhQRUNUX0ZBTFNFKGRlc3QtPkdldFhZWigmaGFzWCwgJmhhc1ksICZoYXNab29tLCAmeCwgJnksICZ6b29tKSk7Ci0KKyAgeworICAgIGF1dG8gZGVzdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0Rlc3Q+KCk7CisgICAgRVhQRUNUX0ZBTFNFKGRlc3QtPkdldFhZWigmaGFzWCwgJmhhc1ksICZoYXNab29tLCAmeCwgJnksICZ6b29tKSk7CisgIH0KKyAgeworICAgIC8vIE5vdCBlbm91Z2ggZW50cmllcy4KKyAgICBhdXRvIGRlc3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EZXN0PihhcnJheS5nZXQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGRlc3QtPkdldFhZWigmaGFzWCwgJmhhc1ksICZoYXNab29tLCAmeCwgJnksICZ6b29tKSk7CisgIH0KICAgYXJyYXktPkFkZE5ldzxDUERGX051bWJlcj4oNSk7ICAvLyBZCiAgIGFycmF5LT5BZGROZXc8Q1BERl9OdW1iZXI+KDYpOyAgLy8gWm9vbS4KLQotICBkZXN0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGVzdD4oYXJyYXkuZ2V0KCkpOwotICBFWFBFQ1RfVFJVRShkZXN0LT5HZXRYWVooJmhhc1gsICZoYXNZLCAmaGFzWm9vbSwgJngsICZ5LCAmem9vbSkpOwotICBFWFBFQ1RfVFJVRShoYXNYKTsKLSAgRVhQRUNUX1RSVUUoaGFzWSk7Ci0gIEVYUEVDVF9UUlVFKGhhc1pvb20pOwotICBFWFBFQ1RfRVEoNCwgeCk7Ci0gIEVYUEVDVF9FUSg1LCB5KTsKLSAgRVhQRUNUX0VRKDYsIHpvb20pOwotCisgIHsKKyAgICBhdXRvIGRlc3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EZXN0PihhcnJheS5nZXQoKSk7CisgICAgRVhQRUNUX1RSVUUoZGVzdC0+R2V0WFlaKCZoYXNYLCAmaGFzWSwgJmhhc1pvb20sICZ4LCAmeSwgJnpvb20pKTsKKyAgICBFWFBFQ1RfVFJVRShoYXNYKTsKKyAgICBFWFBFQ1RfVFJVRShoYXNZKTsKKyAgICBFWFBFQ1RfVFJVRShoYXNab29tKTsKKyAgICBFWFBFQ1RfRVEoNCwgeCk7CisgICAgRVhQRUNUX0VRKDUsIHkpOworICAgIEVYUEVDVF9FUSg2LCB6b29tKTsKKyAgfQogICAvLyBTZXQgem9vbSB0byAwLgogICBhcnJheS0+U2V0TmV3QXQ8Q1BERl9OdW1iZXI+KDQsIDApOwotICBkZXN0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGVzdD4oYXJyYXkuZ2V0KCkpOwotICBFWFBFQ1RfVFJVRShkZXN0LT5HZXRYWVooJmhhc1gsICZoYXNZLCAmaGFzWm9vbSwgJngsICZ5LCAmem9vbSkpOwotICBFWFBFQ1RfRkFMU0UoaGFzWm9vbSk7Ci0KKyAgeworICAgIGF1dG8gZGVzdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0Rlc3Q+KGFycmF5LmdldCgpKTsKKyAgICBFWFBFQ1RfVFJVRShkZXN0LT5HZXRYWVooJmhhc1gsICZoYXNZLCAmaGFzWm9vbSwgJngsICZ5LCAmem9vbSkpOworICAgIEVYUEVDVF9GQUxTRShoYXNab29tKTsKKyAgfQogICAvLyBTZXQgdmFsdWVzIHRvIG51bGwuCiAgIGFycmF5LT5TZXROZXdBdDxDUERGX051bGw+KDIpOwogICBhcnJheS0+U2V0TmV3QXQ8Q1BERl9OdWxsPigzKTsKICAgYXJyYXktPlNldE5ld0F0PENQREZfTnVsbD4oNCk7Ci0gIGRlc3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EZXN0PihhcnJheS5nZXQoKSk7Ci0gIEVYUEVDVF9UUlVFKGRlc3QtPkdldFhZWigmaGFzWCwgJmhhc1ksICZoYXNab29tLCAmeCwgJnksICZ6b29tKSk7Ci0gIEVYUEVDVF9GQUxTRShoYXNYKTsKLSAgRVhQRUNUX0ZBTFNFKGhhc1kpOwotICBFWFBFQ1RfRkFMU0UoaGFzWm9vbSk7CisgIHsKKyAgICBhdXRvIGRlc3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EZXN0PihhcnJheS5nZXQoKSk7CisgICAgRVhQRUNUX1RSVUUoZGVzdC0+R2V0WFlaKCZoYXNYLCAmaGFzWSwgJmhhc1pvb20sICZ4LCAmeSwgJnpvb20pKTsKKyAgICBFWFBFQ1RfRkFMU0UoaGFzWCk7CisgICAgRVhQRUNUX0ZBTFNFKGhhc1kpOworICAgIEVYUEVDVF9GQUxTRShoYXNab29tKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwZGZfZG9janNhY3Rpb25zLmNwcCBiL2NvcmUvZnBkZmRvYy9jcGRmX2RvY2pzYWN0aW9ucy5jcHAKaW5kZXggYTdmY2RmZC4uOTFkYjJiMCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfZG9janNhY3Rpb25zLmNwcAorKysgYi9jb3JlL2ZwZGZkb2MvY3BkZl9kb2Nqc2FjdGlvbnMuY3BwCkBAIC0xMCwzMSArMTAsMjkgQEAKIAogQ1BERl9Eb2NKU0FjdGlvbnM6OkNQREZfRG9jSlNBY3Rpb25zKENQREZfRG9jdW1lbnQqIHBEb2MpIDogbV9wRG9jdW1lbnQocERvYykge30KIAorQ1BERl9Eb2NKU0FjdGlvbnM6On5DUERGX0RvY0pTQWN0aW9ucygpIHt9CisKIGludCBDUERGX0RvY0pTQWN0aW9uczo6Q291bnRKU0FjdGlvbnMoKSBjb25zdCB7CiAgIEFTU0VSVChtX3BEb2N1bWVudCk7Ci0gIENQREZfTmFtZVRyZWUgbmFtZV90cmVlKG1fcERvY3VtZW50LCAiSmF2YVNjcmlwdCIpOworICBDUERGX05hbWVUcmVlIG5hbWVfdHJlZShtX3BEb2N1bWVudC5HZXQoKSwgIkphdmFTY3JpcHQiKTsKICAgcmV0dXJuIG5hbWVfdHJlZS5HZXRDb3VudCgpOwogfQogCi1DUERGX0FjdGlvbiBDUERGX0RvY0pTQWN0aW9uczo6R2V0SlNBY3Rpb24oaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0IHsKK0NQREZfQWN0aW9uIENQREZfRG9jSlNBY3Rpb25zOjpHZXRKU0FjdGlvbkFuZE5hbWUoaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nKiBjc05hbWUpIGNvbnN0IHsKICAgQVNTRVJUKG1fcERvY3VtZW50KTsKLSAgQ1BERl9OYW1lVHJlZSBuYW1lX3RyZWUobV9wRG9jdW1lbnQsICJKYXZhU2NyaXB0Iik7Ci0gIENQREZfT2JqZWN0KiBwQWN0aW9uID0gbmFtZV90cmVlLkxvb2t1cFZhbHVlKGluZGV4LCBjc05hbWUpOwotICByZXR1cm4gVG9EaWN0aW9uYXJ5KHBBY3Rpb24pID8gQ1BERl9BY3Rpb24ocEFjdGlvbi0+R2V0RGljdCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ1BERl9BY3Rpb24oKTsKKyAgQ1BERl9OYW1lVHJlZSBuYW1lX3RyZWUobV9wRG9jdW1lbnQuR2V0KCksICJKYXZhU2NyaXB0Iik7CisgIHJldHVybiBDUERGX0FjdGlvbihUb0RpY3Rpb25hcnkobmFtZV90cmVlLkxvb2t1cFZhbHVlQW5kTmFtZShpbmRleCwgY3NOYW1lKSkpOwogfQogCi1DUERGX0FjdGlvbiBDUERGX0RvY0pTQWN0aW9uczo6R2V0SlNBY3Rpb24oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSkgY29uc3QgeworQ1BERl9BY3Rpb24gQ1BERl9Eb2NKU0FjdGlvbnM6OkdldEpTQWN0aW9uKGNvbnN0IFdpZGVTdHJpbmcmIGNzTmFtZSkgY29uc3QgewogICBBU1NFUlQobV9wRG9jdW1lbnQpOwotICBDUERGX05hbWVUcmVlIG5hbWVfdHJlZShtX3BEb2N1bWVudCwgIkphdmFTY3JpcHQiKTsKLSAgQ1BERl9PYmplY3QqIHBBY3Rpb24gPSBuYW1lX3RyZWUuTG9va3VwVmFsdWUoY3NOYW1lKTsKLSAgcmV0dXJuIFRvRGljdGlvbmFyeShwQWN0aW9uKSA/IENQREZfQWN0aW9uKHBBY3Rpb24tPkdldERpY3QoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENQREZfQWN0aW9uKCk7CisgIENQREZfTmFtZVRyZWUgbmFtZV90cmVlKG1fcERvY3VtZW50LkdldCgpLCAiSmF2YVNjcmlwdCIpOworICByZXR1cm4gQ1BERl9BY3Rpb24oVG9EaWN0aW9uYXJ5KG5hbWVfdHJlZS5Mb29rdXBWYWx1ZShjc05hbWUpKSk7CiB9CiAKLWludCBDUERGX0RvY0pTQWN0aW9uczo6RmluZEpTQWN0aW9uKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0IHsKK2ludCBDUERGX0RvY0pTQWN0aW9uczo6RmluZEpTQWN0aW9uKGNvbnN0IFdpZGVTdHJpbmcmIGNzTmFtZSkgY29uc3QgewogICBBU1NFUlQobV9wRG9jdW1lbnQpOwotICBDUERGX05hbWVUcmVlIG5hbWVfdHJlZShtX3BEb2N1bWVudCwgIkphdmFTY3JpcHQiKTsKKyAgQ1BERl9OYW1lVHJlZSBuYW1lX3RyZWUobV9wRG9jdW1lbnQuR2V0KCksICJKYXZhU2NyaXB0Iik7CiAgIHJldHVybiBuYW1lX3RyZWUuR2V0SW5kZXgoY3NOYW1lKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jcGRmX2RvY2pzYWN0aW9ucy5oIGIvY29yZS9mcGRmZG9jL2NwZGZfZG9janNhY3Rpb25zLmgKaW5kZXggOGE4ZDAzZC4uMzlhYWZiOCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfZG9janNhY3Rpb25zLmgKKysrIGIvY29yZS9mcGRmZG9jL2NwZGZfZG9janNhY3Rpb25zLmgKQEAgLTksMjEgKzksMjMgQEAKIAogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2FjdGlvbi5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogCiBjbGFzcyBDUERGX0RvY3VtZW50OwogCiBjbGFzcyBDUERGX0RvY0pTQWN0aW9ucyB7CiAgcHVibGljOgogICBleHBsaWNpdCBDUERGX0RvY0pTQWN0aW9ucyhDUERGX0RvY3VtZW50KiBwRG9jKTsKKyAgfkNQREZfRG9jSlNBY3Rpb25zKCk7CiAKICAgaW50IENvdW50SlNBY3Rpb25zKCkgY29uc3Q7Ci0gIENQREZfQWN0aW9uIEdldEpTQWN0aW9uKGludCBpbmRleCwgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSkgY29uc3Q7Ci0gIENQREZfQWN0aW9uIEdldEpTQWN0aW9uKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0OwotICBpbnQgRmluZEpTQWN0aW9uKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0OwotICBDUERGX0RvY3VtZW50KiBHZXREb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcERvY3VtZW50OyB9CisgIENQREZfQWN0aW9uIEdldEpTQWN0aW9uQW5kTmFtZShpbnQgaW5kZXgsIFdpZGVTdHJpbmcqIGNzTmFtZSkgY29uc3Q7CisgIENQREZfQWN0aW9uIEdldEpTQWN0aW9uKGNvbnN0IFdpZGVTdHJpbmcmIGNzTmFtZSkgY29uc3Q7CisgIGludCBGaW5kSlNBY3Rpb24oY29uc3QgV2lkZVN0cmluZyYgY3NOYW1lKSBjb25zdDsKKyAgQ1BERl9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BEb2N1bWVudC5HZXQoKTsgfQogCiAgcHJpdmF0ZToKLSAgQ1BERl9Eb2N1bWVudCogY29uc3QgbV9wRG9jdW1lbnQ7CisgIFVub3duZWRQdHI8Q1BERl9Eb2N1bWVudD4gY29uc3QgbV9wRG9jdW1lbnQ7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkRPQ19DUERGX0RPQ0pTQUNUSU9OU19IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwZGZfZmlsZXNwZWMuY3BwIGIvY29yZS9mcGRmZG9jL2NwZGZfZmlsZXNwZWMuY3BwCmluZGV4IGNlNmY5YTIuLjJmOTk5YmMgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jcGRmX2ZpbGVzcGVjLmNwcAorKysgYi9jb3JlL2ZwZGZkb2MvY3BkZl9maWxlc3BlYy5jcHAKQEAgLTYsMjUgKzYsMjggQEAKIAogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2ZpbGVzcGVjLmgiCiAKKyNpbmNsdWRlIDx2ZWN0b3I+CisKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9uYW1lLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdC5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyaW5nLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGUuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgogCiBuYW1lc3BhY2UgewogCi0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8gfHwgXAotICAgIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLUNGWF9XaWRlU3RyaW5nIENoYW5nZVNsYXNoVG9QbGF0Zm9ybShjb25zdCBGWF9XQ0hBUiogc3RyKSB7Ci0gIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9BUFBMRV8gfHwgXAorICAgIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCitXaWRlU3RyaW5nIENoYW5nZVNsYXNoVG9QbGF0Zm9ybShjb25zdCB3Y2hhcl90KiBzdHIpIHsKKyAgV2lkZVN0cmluZyByZXN1bHQ7CiAgIHdoaWxlICgqc3RyKSB7CiAgICAgaWYgKCpzdHIgPT0gJy8nKSB7Ci0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICAgIHJlc3VsdCArPSAnOic7CisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCisgICAgICByZXN1bHQgKz0gTCc6JzsKICNlbHNlCi0gICAgICByZXN1bHQgKz0gJ1xcJzsKKyAgICAgIHJlc3VsdCArPSBMJ1xcJzsKICNlbmRpZgogICAgIH0gZWxzZSB7CiAgICAgICByZXN1bHQgKz0gKnN0cjsKQEAgLTM0LDExICszNywxMSBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCi1DRlhfV2lkZVN0cmluZyBDaGFuZ2VTbGFzaFRvUERGKGNvbnN0IEZYX1dDSEFSKiBzdHIpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OworV2lkZVN0cmluZyBDaGFuZ2VTbGFzaFRvUERGKGNvbnN0IHdjaGFyX3QqIHN0cikgeworICBXaWRlU3RyaW5nIHJlc3VsdDsKICAgd2hpbGUgKCpzdHIpIHsKICAgICBpZiAoKnN0ciA9PSAnXFwnIHx8ICpzdHIgPT0gJzonKQotICAgICAgcmVzdWx0ICs9ICcvJzsKKyAgICAgIHJlc3VsdCArPSBMJy8nOwogICAgIGVsc2UKICAgICAgIHJlc3VsdCArPSAqc3RyOwogCkBAIC00NiwxMjUgKzQ5LDE0NSBAQAogICB9CiAgIHJldHVybiByZXN1bHQ7CiB9Ci0jZW5kaWYgIC8vIF9GWE1fUExBVEZPUk1fQVBQTEVfIHx8IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNlbmRpZiAgLy8gX0ZYX1BMQVRGT1JNX0FQUExFXyB8fCBfRlhfUExBVEZPUk1fV0lORE9XU18KIAogfSAgLy8gbmFtZXNwYWNlCiAKLUNGWF9XaWRlU3RyaW5nIENQREZfRmlsZVNwZWM6OkRlY29kZUZpbGVOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZXBhdGgpIHsKLSAgaWYgKGZpbGVwYXRoLkdldExlbmd0aCgpIDw9IDEpCi0gICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CitDUERGX0ZpbGVTcGVjOjpDUERGX0ZpbGVTcGVjKENQREZfT2JqZWN0KiBwT2JqKSA6IG1fcE9iaihwT2JqKSB7CisgIEFTU0VSVChtX3BPYmopOworfQogCi0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgaWYgKGZpbGVwYXRoLkxlZnQoc2l6ZW9mKCIvTWFjIikgLSAxKSA9PSBDRlhfV2lkZVN0cmluZ0MoTCIvTWFjIikpCitDUERGX0ZpbGVTcGVjOjp+Q1BERl9GaWxlU3BlYygpIHt9CisKK1dpZGVTdHJpbmcgQ1BERl9GaWxlU3BlYzo6RGVjb2RlRmlsZU5hbWUoY29uc3QgV2lkZVN0cmluZyYgZmlsZXBhdGgpIHsKKyAgaWYgKGZpbGVwYXRoLkdldExlbmd0aCgpIDw9IDEpCisgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKKworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXworICBpZiAoZmlsZXBhdGguTGVmdChzaXplb2YoIi9NYWMiKSAtIDEpID09IFdpZGVTdHJpbmdWaWV3KEwiL01hYyIpKQogICAgIHJldHVybiBDaGFuZ2VTbGFzaFRvUGxhdGZvcm0oZmlsZXBhdGguY19zdHIoKSArIDEpOwogICByZXR1cm4gQ2hhbmdlU2xhc2hUb1BsYXRmb3JtKGZpbGVwYXRoLmNfc3RyKCkpOwotI2VsaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXworI2VsaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KIAotICBpZiAoZmlsZXBhdGguR2V0QXQoMCkgIT0gJy8nKQorICBpZiAoZmlsZXBhdGhbMF0gIT0gTCcvJykKICAgICByZXR1cm4gQ2hhbmdlU2xhc2hUb1BsYXRmb3JtKGZpbGVwYXRoLmNfc3RyKCkpOwotICBpZiAoZmlsZXBhdGguR2V0QXQoMSkgPT0gJy8nKQorICBpZiAoZmlsZXBhdGhbMV0gPT0gTCcvJykKICAgICByZXR1cm4gQ2hhbmdlU2xhc2hUb1BsYXRmb3JtKGZpbGVwYXRoLmNfc3RyKCkgKyAxKTsKLSAgaWYgKGZpbGVwYXRoLkdldEF0KDIpID09ICcvJykgewotICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKLSAgICByZXN1bHQgKz0gZmlsZXBhdGguR2V0QXQoMSk7Ci0gICAgcmVzdWx0ICs9ICc6JzsKKyAgaWYgKGZpbGVwYXRoWzJdID09IEwnLycpIHsKKyAgICBXaWRlU3RyaW5nIHJlc3VsdDsKKyAgICByZXN1bHQgKz0gZmlsZXBhdGhbMV07CisgICAgcmVzdWx0ICs9IEwnOic7CiAgICAgcmVzdWx0ICs9IENoYW5nZVNsYXNoVG9QbGF0Zm9ybShmaWxlcGF0aC5jX3N0cigpICsgMik7CiAgICAgcmV0dXJuIHJlc3VsdDsKICAgfQotICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7Ci0gIHJlc3VsdCArPSAnXFwnOworICBXaWRlU3RyaW5nIHJlc3VsdDsKKyAgcmVzdWx0ICs9IEwnXFwnOwogICByZXN1bHQgKz0gQ2hhbmdlU2xhc2hUb1BsYXRmb3JtKGZpbGVwYXRoLmNfc3RyKCkpOwogICByZXR1cm4gcmVzdWx0OwogI2Vsc2UKLSAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKGZpbGVwYXRoKTsKKyAgcmV0dXJuIFdpZGVTdHJpbmcoZmlsZXBhdGgpOwogI2VuZGlmCiB9CiAKLWJvb2wgQ1BERl9GaWxlU3BlYzo6R2V0RmlsZU5hbWUoQ0ZYX1dpZGVTdHJpbmcqIGNzRmlsZU5hbWUpIGNvbnN0IHsKK1dpZGVTdHJpbmcgQ1BERl9GaWxlU3BlYzo6R2V0RmlsZU5hbWUoKSBjb25zdCB7CisgIFdpZGVTdHJpbmcgY3NGaWxlTmFtZTsKICAgaWYgKENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BPYmotPkFzRGljdGlvbmFyeSgpKSB7Ci0gICAgKmNzRmlsZU5hbWUgPSBwRGljdC0+R2V0VW5pY29kZVRleHRGb3IoIlVGIik7Ci0gICAgaWYgKGNzRmlsZU5hbWUtPklzRW1wdHkoKSkgewotICAgICAgKmNzRmlsZU5hbWUgPQotICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwocERpY3QtPkdldFN0cmluZ0ZvcigiRiIpLkFzU3RyaW5nQygpKTsKKyAgICBjc0ZpbGVOYW1lID0gcERpY3QtPkdldFVuaWNvZGVUZXh0Rm9yKCJVRiIpOworICAgIGlmIChjc0ZpbGVOYW1lLklzRW1wdHkoKSkgeworICAgICAgY3NGaWxlTmFtZSA9CisgICAgICAgICAgV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBEaWN0LT5HZXRTdHJpbmdGb3IoIkYiKS5Bc1N0cmluZ1ZpZXcoKSk7CiAgICAgfQogICAgIGlmIChwRGljdC0+R2V0U3RyaW5nRm9yKCJGUyIpID09ICJVUkwiKQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGNzRmlsZU5hbWUtPklzRW1wdHkoKSkgewotICAgICAgaWYgKHBEaWN0LT5LZXlFeGlzdCgiRE9TIikpIHsKLSAgICAgICAgKmNzRmlsZU5hbWUgPQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwRGljdC0+R2V0U3RyaW5nRm9yKCJET1MiKS5Bc1N0cmluZ0MoKSk7Ci0gICAgICB9IGVsc2UgaWYgKHBEaWN0LT5LZXlFeGlzdCgiTWFjIikpIHsKLSAgICAgICAgKmNzRmlsZU5hbWUgPQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChwRGljdC0+R2V0U3RyaW5nRm9yKCJNYWMiKS5Bc1N0cmluZ0MoKSk7Ci0gICAgICB9IGVsc2UgaWYgKHBEaWN0LT5LZXlFeGlzdCgiVW5peCIpKSB7Ci0gICAgICAgICpjc0ZpbGVOYW1lID0KLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwocERpY3QtPkdldFN0cmluZ0ZvcigiVW5peCIpLkFzU3RyaW5nQygpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiBjc0ZpbGVOYW1lOworCisgICAgaWYgKGNzRmlsZU5hbWUuSXNFbXB0eSgpKSB7CisgICAgICBjb25zdGV4cHIgY29uc3QgY2hhcioga2V5c1tdID0geyJET1MiLCAiTWFjIiwgIlVuaXgifTsKKyAgICAgIGZvciAoY29uc3QgYXV0byoga2V5IDoga2V5cykgeworICAgICAgICBpZiAocERpY3QtPktleUV4aXN0KGtleSkpIHsKKyAgICAgICAgICBjc0ZpbGVOYW1lID0KKyAgICAgICAgICAgICAgV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBEaWN0LT5HZXRTdHJpbmdGb3Ioa2V5KS5Bc1N0cmluZ1ZpZXcoKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0gZWxzZSBpZiAobV9wT2JqLT5Jc1N0cmluZygpKSB7Ci0gICAgKmNzRmlsZU5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKG1fcE9iai0+R2V0U3RyaW5nKCkuQXNTdHJpbmdDKCkpOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKKyAgICBjc0ZpbGVOYW1lID0gV2lkZVN0cmluZzo6RnJvbUxvY2FsKG1fcE9iai0+R2V0U3RyaW5nKCkuQXNTdHJpbmdWaWV3KCkpOwogICB9Ci0gICpjc0ZpbGVOYW1lID0gRGVjb2RlRmlsZU5hbWUoY3NGaWxlTmFtZS0+QXNTdHJpbmdDKCkpOwotICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIERlY29kZUZpbGVOYW1lKGNzRmlsZU5hbWUpOwogfQogCi1DUERGX0ZpbGVTcGVjOjpDUERGX0ZpbGVTcGVjKGNvbnN0IENGWF9XZWFrUHRyPENGWF9CeXRlU3RyaW5nUG9vbD4mIHBQb29sKSB7Ci0gIG1fcE9iaiA9IG5ldyBDUERGX0RpY3Rpb25hcnkocFBvb2wpOwotICBtX3BPYmotPkFzRGljdGlvbmFyeSgpLT5TZXROZXdGb3I8Q1BERl9OYW1lPigiVHlwZSIsICJGaWxlc3BlYyIpOworQ1BERl9TdHJlYW0qIENQREZfRmlsZVNwZWM6OkdldEZpbGVTdHJlYW0oKSBjb25zdCB7CisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BPYmotPkFzRGljdGlvbmFyeSgpOworICBpZiAoIXBEaWN0KQorICAgIHJldHVybiBudWxscHRyOworCisgIC8vIEdldCB0aGUgZW1iZWRkZWQgZmlsZXMgZGljdGlvbmFyeS4KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRmlsZXMgPSBwRGljdC0+R2V0RGljdEZvcigiRUYiKTsKKyAgaWYgKCFwRmlsZXMpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgLy8gR2V0IHRoZSBmaWxlIHN0cmVhbSBvZiB0aGUgaGlnaGVzdCBwcmVjZWRlbmNlIHdpdGggaXRzIGZpbGUgc3BlY2lmaWNhdGlvbgorICAvLyBzdHJpbmcgYXZhaWxhYmxlLiBGb2xsb3dzIHRoZSBzYW1lIHByZWNlZGVuY2Ugb3JkZXIgYXMgR2V0RmlsZU5hbWUoKS4KKyAgY29uc3RleHByIGNvbnN0IGNoYXIqIGtleXNbXSA9IHsiVUYiLCAiRiIsICJET1MiLCAiTWFjIiwgIlVuaXgifTsKKyAgc2l6ZV90IGVuZCA9IHBEaWN0LT5HZXRTdHJpbmdGb3IoIkZTIikgPT0gIlVSTCIgPyAyIDogRlhfQXJyYXlTaXplKGtleXMpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVuZDsgKytpKSB7CisgICAgY29uc3QgQnl0ZVN0cmluZyYga2V5ID0ga2V5c1tpXTsKKyAgICBpZiAoIXBEaWN0LT5HZXRVbmljb2RlVGV4dEZvcihrZXkpLklzRW1wdHkoKSkgeworICAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwRmlsZXMtPkdldFN0cmVhbUZvcihrZXkpOworICAgICAgaWYgKHBTdHJlYW0pCisgICAgICAgIHJldHVybiBwU3RyZWFtOworICAgIH0KKyAgfQorICByZXR1cm4gbnVsbHB0cjsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9GaWxlU3BlYzo6RW5jb2RlRmlsZU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlcGF0aCkgeworQ1BERl9EaWN0aW9uYXJ5KiBDUERGX0ZpbGVTcGVjOjpHZXRQYXJhbXNEaWN0KCkgY29uc3QgeworICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IEdldEZpbGVTdHJlYW0oKTsKKyAgaWYgKCFwU3RyZWFtKQorICAgIHJldHVybiBudWxscHRyOworCisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7CisgIGlmICghcERpY3QpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgcmV0dXJuIHBEaWN0LT5HZXREaWN0Rm9yKCJQYXJhbXMiKTsKK30KKworV2lkZVN0cmluZyBDUERGX0ZpbGVTcGVjOjpFbmNvZGVGaWxlTmFtZShjb25zdCBXaWRlU3RyaW5nJiBmaWxlcGF0aCkgewogICBpZiAoZmlsZXBhdGguR2V0TGVuZ3RoKCkgPD0gMSkKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgICByZXR1cm4gV2lkZVN0cmluZygpOwogCi0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotICBpZiAoZmlsZXBhdGguR2V0QXQoMSkgPT0gJzonKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OwotICAgIHJlc3VsdCA9ICcvJzsKLSAgICByZXN1bHQgKz0gZmlsZXBhdGguR2V0QXQoMCk7Ci0gICAgaWYgKGZpbGVwYXRoLkdldEF0KDIpICE9ICdcXCcpCi0gICAgICByZXN1bHQgKz0gJy8nOworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisgIGlmIChmaWxlcGF0aFsxXSA9PSBMJzonKSB7CisgICAgV2lkZVN0cmluZyByZXN1bHQoTCcvJyk7CisgICAgcmVzdWx0ICs9IGZpbGVwYXRoWzBdOworICAgIGlmIChmaWxlcGF0aFsyXSAhPSBMJ1xcJykKKyAgICAgIHJlc3VsdCArPSBMJy8nOwogCiAgICAgcmVzdWx0ICs9IENoYW5nZVNsYXNoVG9QREYoZmlsZXBhdGguY19zdHIoKSArIDIpOwogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KLSAgaWYgKGZpbGVwYXRoLkdldEF0KDApID09ICdcXCcgJiYgZmlsZXBhdGguR2V0QXQoMSkgPT0gJ1xcJykKKyAgaWYgKGZpbGVwYXRoWzBdID09IEwnXFwnICYmIGZpbGVwYXRoWzFdID09IEwnXFwnKQogICAgIHJldHVybiBDaGFuZ2VTbGFzaFRvUERGKGZpbGVwYXRoLmNfc3RyKCkgKyAxKTsKIAotICBpZiAoZmlsZXBhdGguR2V0QXQoMCkgPT0gJ1xcJykgewotICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKLSAgICByZXN1bHQgPSAnLyc7Ci0gICAgcmVzdWx0ICs9IENoYW5nZVNsYXNoVG9QREYoZmlsZXBhdGguY19zdHIoKSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQorICBpZiAoZmlsZXBhdGhbMF0gPT0gTCdcXCcpCisgICAgcmV0dXJuIEwnLycgKyBDaGFuZ2VTbGFzaFRvUERGKGZpbGVwYXRoLmNfc3RyKCkpOwogICByZXR1cm4gQ2hhbmdlU2xhc2hUb1BERihmaWxlcGF0aC5jX3N0cigpKTsKLSNlbGlmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gIGlmIChmaWxlcGF0aC5MZWZ0KHNpemVvZigiTWFjIikgLSAxKSA9PSBMIk1hYyIpIHsKLSAgICBDRlhfV2lkZVN0cmluZyByZXN1bHQ7Ci0gICAgcmVzdWx0ID0gJy8nOwotICAgIHJlc3VsdCArPSBDaGFuZ2VTbGFzaFRvUERGKGZpbGVwYXRoLmNfc3RyKCkpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KKyNlbGlmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXworICBpZiAoZmlsZXBhdGguTGVmdChzaXplb2YoIk1hYyIpIC0gMSkgPT0gTCJNYWMiKQorICAgIHJldHVybiBMJy8nICsgQ2hhbmdlU2xhc2hUb1BERihmaWxlcGF0aC5jX3N0cigpKTsKICAgcmV0dXJuIENoYW5nZVNsYXNoVG9QREYoZmlsZXBhdGguY19zdHIoKSk7CiAjZWxzZQotICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoZmlsZXBhdGgpOworICByZXR1cm4gV2lkZVN0cmluZyhmaWxlcGF0aCk7CiAjZW5kaWYKIH0KIAotdm9pZCBDUERGX0ZpbGVTcGVjOjpTZXRGaWxlTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRmlsZU5hbWUpIHsKLSAgaWYgKCFtX3BPYmopCi0gICAgcmV0dXJuOwotCi0gIENGWF9XaWRlU3RyaW5nIHdzU3RyID0gRW5jb2RlRmlsZU5hbWUod3NGaWxlTmFtZSk7Cit2b2lkIENQREZfRmlsZVNwZWM6OlNldEZpbGVOYW1lKGNvbnN0IFdpZGVTdHJpbmcmIHdzRmlsZU5hbWUpIHsKKyAgV2lkZVN0cmluZyB3c1N0ciA9IEVuY29kZUZpbGVOYW1lKHdzRmlsZU5hbWUpOwogICBpZiAobV9wT2JqLT5Jc1N0cmluZygpKSB7Ci0gICAgbV9wT2JqLT5TZXRTdHJpbmcoQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHdzU3RyKSk7CisgICAgbV9wT2JqLT5TZXRTdHJpbmcoQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUod3NTdHIpKTsKICAgfSBlbHNlIGlmIChDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wT2JqLT5Bc0RpY3Rpb25hcnkoKSkgewotICAgIHBEaWN0LT5TZXROZXdGb3I8Q1BERl9TdHJpbmc+KCJGIiwgQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHdzU3RyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgcERpY3QtPlNldE5ld0ZvcjxDUERGX1N0cmluZz4oIkYiLCBCeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh3c1N0ciksIGZhbHNlKTsKICAgICBwRGljdC0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigiVUYiLCBQREZfRW5jb2RlVGV4dCh3c1N0ciksIGZhbHNlKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwZGZfZmlsZXNwZWMuaCBiL2NvcmUvZnBkZmRvYy9jcGRmX2ZpbGVzcGVjLmgKaW5kZXggNjI2NmMzNy4uZGVlY2NiOSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfZmlsZXNwZWMuaAorKysgYi9jb3JlL2ZwZGZkb2MvY3BkZl9maWxlc3BlYy5oCkBAIC03LDMxICs3LDM2IEBACiAjaWZuZGVmIENPUkVfRlBERkRPQ19DUERGX0ZJTEVTUEVDX0hfCiAjZGVmaW5lIENPUkVfRlBERkRPQ19DUERGX0ZJTEVTUEVDX0hfCiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9zdHJpbmdfcG9vbF90ZW1wbGF0ZS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3dlYWtfcHRyLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3N0cmluZ19wb29sX3RlbXBsYXRlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvd2Vha19wdHIuaCIKIAorY2xhc3MgQ1BERl9EaWN0aW9uYXJ5OwogY2xhc3MgQ1BERl9PYmplY3Q7CitjbGFzcyBDUERGX1N0cmVhbTsKIAogY2xhc3MgQ1BERl9GaWxlU3BlYyB7CiAgcHVibGljOgotICBleHBsaWNpdCBDUERGX0ZpbGVTcGVjKGNvbnN0IENGWF9XZWFrUHRyPENGWF9CeXRlU3RyaW5nUG9vbD4mIHBQb29sKTsKLSAgZXhwbGljaXQgQ1BERl9GaWxlU3BlYyhDUERGX09iamVjdCogcE9iaikgOiBtX3BPYmoocE9iaikge30KKyAgZXhwbGljaXQgQ1BERl9GaWxlU3BlYyhDUERGX09iamVjdCogcE9iaik7CisgIH5DUERGX0ZpbGVTcGVjKCk7CiAKICAgLy8gQ29udmVydCBhIHBsYXRmb3JtIGRlcGVuZGVudCBmaWxlIG5hbWUgaW50byBwZGYgZm9ybWF0LgotICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgRW5jb2RlRmlsZU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlcGF0aCk7CisgIHN0YXRpYyBXaWRlU3RyaW5nIEVuY29kZUZpbGVOYW1lKGNvbnN0IFdpZGVTdHJpbmcmIGZpbGVwYXRoKTsKIAogICAvLyBDb252ZXJ0IGEgcGRmIGZpbGUgbmFtZSBpbnRvIHBsYXRmb3JtIGRlcGVuZGVudCBmb3JtYXQuCi0gIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBEZWNvZGVGaWxlTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVwYXRoKTsKKyAgc3RhdGljIFdpZGVTdHJpbmcgRGVjb2RlRmlsZU5hbWUoY29uc3QgV2lkZVN0cmluZyYgZmlsZXBhdGgpOwogCi0gIENQREZfT2JqZWN0KiBHZXRPYmooKSBjb25zdCB7IHJldHVybiBtX3BPYmo7IH0KLSAgYm9vbCBHZXRGaWxlTmFtZShDRlhfV2lkZVN0cmluZyogd3NGaWxlTmFtZSkgY29uc3Q7CisgIENQREZfT2JqZWN0KiBHZXRPYmooKSBjb25zdCB7IHJldHVybiBtX3BPYmouR2V0KCk7IH0KKyAgV2lkZVN0cmluZyBHZXRGaWxlTmFtZSgpIGNvbnN0OworICBDUERGX1N0cmVhbSogR2V0RmlsZVN0cmVhbSgpIGNvbnN0OworICBDUERGX0RpY3Rpb25hcnkqIEdldFBhcmFtc0RpY3QoKSBjb25zdDsKIAogICAvLyBTZXQgdGhpcyBmaWxlIHNwZWMgdG8gcmVmZXIgdG8gYSBmaWxlIG5hbWUgKG5vdCBhIHVybCkuCi0gIHZvaWQgU2V0RmlsZU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZpbGVOYW1lKTsKKyAgdm9pZCBTZXRGaWxlTmFtZShjb25zdCBXaWRlU3RyaW5nJiB3c0ZpbGVOYW1lKTsKIAogIHByaXZhdGU6Ci0gIENQREZfT2JqZWN0KiBtX3BPYmo7CisgIFVub3duZWRQdHI8Q1BERl9PYmplY3Q+IGNvbnN0IG1fcE9iajsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9GUERGRE9DX0NQREZfRklMRVNQRUNfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jcGRmX2ZpbGVzcGVjX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnBkZmRvYy9jcGRmX2ZpbGVzcGVjX3VuaXR0ZXN0LmNwcAppbmRleCBkMTY0MTY1Li43M2ZjOGE0IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZkb2MvY3BkZl9maWxlc3BlY191bml0dGVzdC5jcHAKKysrIGIvY29yZS9mcGRmZG9jL2NwZGZfZmlsZXNwZWNfdW5pdHRlc3QuY3BwCkBAIC0zLDIyICszLDI2IEBACiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbmFtZS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9udW1iZXIuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmluZy5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2ZpbGVzcGVjLmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAjaW5jbHVkZSAidGVzdGluZy90ZXN0X3N1cHBvcnQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKIFRFU1QoY3BkZl9maWxlc3BlYywgRW5jb2RlRGVjb2RlRmlsZU5hbWUpIHsKLSAgc3RkOjp2ZWN0b3I8cGRmaXVtOjpOdWxsVGVybVdzdHJGdW5jVGVzdERhdGE+IHRlc3RfZGF0YSA9IHsKKyAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPHBkZml1bTo6TnVsbFRlcm1Xc3RyRnVuY1Rlc3REYXRhPiB0ZXN0X2RhdGEgPSB7CiAgICAgLy8gRW1wdHkgc3JjIHN0cmluZy4KICAgICB7TCIiLCBMIiJ9LAogICAgIC8vIG9ubHkgZmlsZSBuYW1lLgogICAgIHtMInRlc3QucGRmIiwgTCJ0ZXN0LnBkZiJ9LAotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXwogICAgIC8vIFdpdGggZHJpdmUgaWRlbnRpZmllci4KICAgICB7TCJyOlxccGRmZG9jc1xcc3BlYy5wZGYiLCBMIi9yL3BkZmRvY3Mvc3BlYy5wZGYifSwKICAgICAvLyBSZWxhdGl2ZSBwYXRoLgpAQCAtMjksNyArMzMsNyBAQAogICAgIHtMIlxcXFxwZGZkb2NzXFxzcGVjLnBkZiIsIEwiL3BkZmRvY3Mvc3BlYy5wZGYifSwKIC8vIE5ldHdvcmsgcmVzb3VyY2UgbmFtZS4gSXQgaXMgbm90IHN1cHBvcnRlZCB5ZXQuCiAvLyB7TCJwY2xpYi9lbmc6XFxwZGZkb2NzXFxzcGVjLnBkZiIsIEwiL3BjbGliL2VuZy9wZGZkb2NzL3NwZWMucGRmIn0sCi0jZWxpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworI2VsaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCiAgICAgLy8gQWJzb2x1dGUgcGF0aCB3aXRoIGNvbG9uIHNlcGFyYXRvci4KICAgICB7TCJNYWMgSEQ6UERGRG9jczpzcGVjLnBkZiIsIEwiL01hYyBIRC9QREZEb2NzL3NwZWMucGRmIn0sCiAgICAgLy8gUmVsYXRpdmUgcGF0aCB3aXRoIGNvbG9uIHNlcGFyYXRvci4KQEAgLTQ0LDIyICs0OCwyMiBAQAogI2VuZGlmCiAgIH07CiAgIGZvciAoY29uc3QgYXV0byYgZGF0YSA6IHRlc3RfZGF0YSkgewotICAgIENGWF9XaWRlU3RyaW5nIGVuY29kZWRfc3RyID0gQ1BERl9GaWxlU3BlYzo6RW5jb2RlRmlsZU5hbWUoZGF0YS5pbnB1dCk7Ci0gICAgRVhQRUNUX1RSVUUoZW5jb2RlZF9zdHIgPT0gZGF0YS5leHBlY3RlZCk7CisgICAgRVhQRUNUX1NUUkVRKGRhdGEuZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgIENQREZfRmlsZVNwZWM6OkVuY29kZUZpbGVOYW1lKGRhdGEuaW5wdXQpLmNfc3RyKCkpOwogICAgIC8vIERlY29kZUZpbGVOYW1lIGlzIHRoZSByZXZlcnNlIHByb2NlZHVyZSBvZiBFbmNvZGVGaWxlTmFtZS4KLSAgICBDRlhfV2lkZVN0cmluZyBkZWNvZGVkX3N0ciA9IENQREZfRmlsZVNwZWM6OkRlY29kZUZpbGVOYW1lKGRhdGEuZXhwZWN0ZWQpOwotICAgIEVYUEVDVF9UUlVFKGRlY29kZWRfc3RyID09IGRhdGEuaW5wdXQpOworICAgIEVYUEVDVF9TVFJFUShkYXRhLmlucHV0LAorICAgICAgICAgICAgICAgICBDUERGX0ZpbGVTcGVjOjpEZWNvZGVGaWxlTmFtZShkYXRhLmV4cGVjdGVkKS5jX3N0cigpKTsKICAgfQogfQogCiBURVNUKGNwZGZfZmlsZXNwZWMsIEdldEZpbGVOYW1lKSB7CiAgIHsKICAgICAvLyBTdHJpbmcgb2JqZWN0LgotICAgIHBkZml1bTo6TnVsbFRlcm1Xc3RyRnVuY1Rlc3REYXRhIHRlc3RfZGF0YSA9IHsKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisgICAgc3RhdGljIGNvbnN0IHBkZml1bTo6TnVsbFRlcm1Xc3RyRnVuY1Rlc3REYXRhIHRlc3RfZGF0YSA9IHsKKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXwogICAgICAgTCIvQy9kb2NzL3Rlc3QucGRmIiwKICAgICAgIEwiQzpcXGRvY3NcXHRlc3QucGRmIgotI2VsaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyNlbGlmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXwogICAgICAgTCIvTWFjIEhEL2RvY3MvdGVzdC5wZGYiLAogICAgICAgTCJNYWMgSEQ6ZG9jczp0ZXN0LnBkZiIKICNlbHNlCkBAIC02NywyMyArNzEsMjAgQEAKICAgICAgIEwiL2RvY3MvdGVzdC5wZGYiCiAjZW5kaWYKICAgICB9OwotICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gc3RyX29iaigKLSAgICAgICAgbmV3IENQREZfU3RyaW5nKG51bGxwdHIsIHRlc3RfZGF0YS5pbnB1dCkpOworICAgIGF1dG8gc3RyX29iaiA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmluZz4obnVsbHB0ciwgdGVzdF9kYXRhLmlucHV0KTsKICAgICBDUERGX0ZpbGVTcGVjIGZpbGVfc3BlYyhzdHJfb2JqLmdldCgpKTsKLSAgICBDRlhfV2lkZVN0cmluZyBmaWxlX25hbWU7Ci0gICAgRVhQRUNUX1RSVUUoZmlsZV9zcGVjLkdldEZpbGVOYW1lKCZmaWxlX25hbWUpKTsKLSAgICBFWFBFQ1RfVFJVRShmaWxlX25hbWUgPT0gdGVzdF9kYXRhLmV4cGVjdGVkKTsKKyAgICBFWFBFQ1RfU1RSRVEodGVzdF9kYXRhLmV4cGVjdGVkLCBmaWxlX3NwZWMuR2V0RmlsZU5hbWUoKS5jX3N0cigpKTsKICAgfQogICB7CiAgICAgLy8gRGljdGlvbmFyeSBvYmplY3QuCi0gICAgcGRmaXVtOjpOdWxsVGVybVdzdHJGdW5jVGVzdERhdGEgdGVzdF9kYXRhWzVdID0gewotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyAgICBzdGF0aWMgY29uc3QgcGRmaXVtOjpOdWxsVGVybVdzdHJGdW5jVGVzdERhdGEgdGVzdF9kYXRhW10gPSB7CisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KICAgICAgIHtMIi9DL2RvY3MvdGVzdC5wZGYiLCBMIkM6XFxkb2NzXFx0ZXN0LnBkZiJ9LAogICAgICAge0wiL0QvZG9jcy90ZXN0LnBkZiIsIEwiRDpcXGRvY3NcXHRlc3QucGRmIn0sCiAgICAgICB7TCIvRS9kb2NzL3Rlc3QucGRmIiwgTCJFOlxcZG9jc1xcdGVzdC5wZGYifSwKICAgICAgIHtMIi9GL2RvY3MvdGVzdC5wZGYiLCBMIkY6XFxkb2NzXFx0ZXN0LnBkZiJ9LAogICAgICAge0wiL0cvZG9jcy90ZXN0LnBkZiIsIEwiRzpcXGRvY3NcXHRlc3QucGRmIn0sCi0jZWxpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworI2VsaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCiAgICAgICB7TCIvTWFjIEhEL2RvY3MxL3Rlc3QucGRmIiwgTCJNYWMgSEQ6ZG9jczE6dGVzdC5wZGYifSwKICAgICAgIHtMIi9NYWMgSEQvZG9jczIvdGVzdC5wZGYiLCBMIk1hYyBIRDpkb2NzMjp0ZXN0LnBkZiJ9LAogICAgICAge0wiL01hYyBIRC9kb2NzMy90ZXN0LnBkZiIsIEwiTWFjIEhEOmRvY3MzOnRlc3QucGRmIn0sCkBAIC05OCwzNyArOTksMzYgQEAKICNlbmRpZgogICAgIH07CiAgICAgLy8gS2V5d29yZCBmaWVsZHMgaW4gcmV2ZXJzZSBvcmRlciBvZiBwcmVjZWRlbmNlIHRvIHJldHJpZXZlIHRoZSBmaWxlIG5hbWUuCi0gICAgY29uc3QgY2hhciogY29uc3Qga2V5d29yZHNbNV0gPSB7IlVuaXgiLCAiTWFjIiwgIkRPUyIsICJGIiwgIlVGIn07Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeT4gZGljdF9vYmoobmV3IENQREZfRGljdGlvbmFyeSgpKTsKKyAgICBjb25zdCBjaGFyKiBjb25zdCBrZXl3b3Jkc1tdID0geyJVbml4IiwgIk1hYyIsICJET1MiLCAiRiIsICJVRiJ9OworICAgIHN0YXRpY19hc3NlcnQoRlhfQXJyYXlTaXplKHRlc3RfZGF0YSkgPT0gRlhfQXJyYXlTaXplKGtleXdvcmRzKSwKKyAgICAgICAgICAgICAgICAgICJzaXplIG1pc21hdGNoIik7CisgICAgYXV0byBkaWN0X29iaiA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCk7CiAgICAgQ1BERl9GaWxlU3BlYyBmaWxlX3NwZWMoZGljdF9vYmouZ2V0KCkpOwotICAgIENGWF9XaWRlU3RyaW5nIGZpbGVfbmFtZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKGZpbGVfc3BlYy5HZXRGaWxlTmFtZSgpLklzRW1wdHkoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoa2V5d29yZHMpOyArK2kpIHsKICAgICAgIGRpY3Rfb2JqLT5TZXROZXdGb3I8Q1BERl9TdHJpbmc+KGtleXdvcmRzW2ldLCB0ZXN0X2RhdGFbaV0uaW5wdXQpOwotICAgICAgRVhQRUNUX1RSVUUoZmlsZV9zcGVjLkdldEZpbGVOYW1lKCZmaWxlX25hbWUpKTsKLSAgICAgIEVYUEVDVF9UUlVFKGZpbGVfbmFtZSA9PSB0ZXN0X2RhdGFbaV0uZXhwZWN0ZWQpOworICAgICAgRVhQRUNUX1NUUkVRKHRlc3RfZGF0YVtpXS5leHBlY3RlZCwgZmlsZV9zcGVjLkdldEZpbGVOYW1lKCkuY19zdHIoKSk7CiAgICAgfQogCiAgICAgLy8gV2l0aCBhbGwgdGhlIGZvcm1lciBmaWVsZHMgYW5kICdGUycgZmllbGQgc3VnZ2VzdHMgJ1VSTCcgdHlwZS4KICAgICBkaWN0X29iai0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigiRlMiLCAiVVJMIiwgZmFsc2UpOwotICAgIEVYUEVDVF9UUlVFKGZpbGVfc3BlYy5HZXRGaWxlTmFtZSgmZmlsZV9uYW1lKSk7CiAgICAgLy8gVXJsIHN0cmluZyBpcyBub3QgZGVjb2RlZC4KLSAgICBFWFBFQ1RfVFJVRShmaWxlX25hbWUgPT0gdGVzdF9kYXRhWzRdLmlucHV0KTsKKyAgICBFWFBFQ1RfU1RSRVEodGVzdF9kYXRhWzRdLmlucHV0LCBmaWxlX3NwZWMuR2V0RmlsZU5hbWUoKS5jX3N0cigpKTsKICAgfQogICB7CiAgICAgLy8gSW52YWxpZCBvYmplY3QuCi0gICAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBuYW1lX29iaihuZXcgQ1BERl9OYW1lKG51bGxwdHIsICJ0ZXN0LnBkZiIpKTsKKyAgICBhdXRvIG5hbWVfb2JqID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfTmFtZT4obnVsbHB0ciwgInRlc3QucGRmIik7CiAgICAgQ1BERl9GaWxlU3BlYyBmaWxlX3NwZWMobmFtZV9vYmouZ2V0KCkpOwotICAgIENGWF9XaWRlU3RyaW5nIGZpbGVfbmFtZTsKLSAgICBFWFBFQ1RfRkFMU0UoZmlsZV9zcGVjLkdldEZpbGVOYW1lKCZmaWxlX25hbWUpKTsKKyAgICBFWFBFQ1RfVFJVRShmaWxlX3NwZWMuR2V0RmlsZU5hbWUoKS5Jc0VtcHR5KCkpOwogICB9CiB9CiAKIFRFU1QoY3BkZl9maWxlc3BlYywgU2V0RmlsZU5hbWUpIHsKLSAgcGRmaXVtOjpOdWxsVGVybVdzdHJGdW5jVGVzdERhdGEgdGVzdF9kYXRhID0gewotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyAgc3RhdGljIGNvbnN0IHBkZml1bTo6TnVsbFRlcm1Xc3RyRnVuY1Rlc3REYXRhIHRlc3RfZGF0YSA9IHsKKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXwogICAgIEwiQzpcXGRvY3NcXHRlc3QucGRmIiwKICAgICBMIi9DL2RvY3MvdGVzdC5wZGYiCi0jZWxpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworI2VsaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCiAgICAgTCJNYWMgSEQ6ZG9jczp0ZXN0LnBkZiIsCiAgICAgTCIvTWFjIEhEL2RvY3MvdGVzdC5wZGYiCiAjZWxzZQpAQCAtMTM3LDI3ICsxMzcsMTE3IEBACiAjZW5kaWYKICAgfTsKICAgLy8gU3RyaW5nIG9iamVjdC4KLSAgc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBzdHJfb2JqKG5ldyBDUERGX1N0cmluZyhudWxscHRyLCBMImJhYmFiYWJhIikpOworICBhdXRvIHN0cl9vYmogPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJpbmc+KG51bGxwdHIsIEwiYmFiYWJhYmEiKTsKICAgQ1BERl9GaWxlU3BlYyBmaWxlX3NwZWMxKHN0cl9vYmouZ2V0KCkpOwogICBmaWxlX3NwZWMxLlNldEZpbGVOYW1lKHRlc3RfZGF0YS5pbnB1dCk7CiAgIC8vIENoZWNrIGludGVybmFsIG9iamVjdCB2YWx1ZS4KLSAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHRlc3RfZGF0YS5leHBlY3RlZCk7Ci0gIEVYUEVDVF9UUlVFKHN0ciA9PSBzdHJfb2JqLT5HZXRTdHJpbmcoKSk7CisgIEVYUEVDVF9TVFJFUSh0ZXN0X2RhdGEuZXhwZWN0ZWQsIHN0cl9vYmotPkdldFVuaWNvZGVUZXh0KCkuY19zdHIoKSk7CiAgIC8vIENoZWNrIHdlIGNhbiBnZXQgdGhlIGZpbGUgbmFtZSBiYWNrLgotICBDRlhfV2lkZVN0cmluZyBmaWxlX25hbWU7Ci0gIEVYUEVDVF9UUlVFKGZpbGVfc3BlYzEuR2V0RmlsZU5hbWUoJmZpbGVfbmFtZSkpOwotICBFWFBFQ1RfVFJVRShmaWxlX25hbWUgPT0gdGVzdF9kYXRhLmlucHV0KTsKKyAgRVhQRUNUX1NUUkVRKHRlc3RfZGF0YS5pbnB1dCwgZmlsZV9zcGVjMS5HZXRGaWxlTmFtZSgpLmNfc3RyKCkpOwogCiAgIC8vIERpY3Rpb25hcnkgb2JqZWN0LgotICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5PiBkaWN0X29iaihuZXcgQ1BERl9EaWN0aW9uYXJ5KCkpOworICBhdXRvIGRpY3Rfb2JqID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4oKTsKICAgQ1BERl9GaWxlU3BlYyBmaWxlX3NwZWMyKGRpY3Rfb2JqLmdldCgpKTsKICAgZmlsZV9zcGVjMi5TZXRGaWxlTmFtZSh0ZXN0X2RhdGEuaW5wdXQpOwogICAvLyBDaGVjayBpbnRlcm5hbCBvYmplY3QgdmFsdWUuCi0gIGZpbGVfbmFtZSA9IGRpY3Rfb2JqLT5HZXRVbmljb2RlVGV4dEZvcigiRiIpOwotICBFWFBFQ1RfVFJVRShmaWxlX25hbWUgPT0gdGVzdF9kYXRhLmV4cGVjdGVkKTsKLSAgZmlsZV9uYW1lID0gZGljdF9vYmotPkdldFVuaWNvZGVUZXh0Rm9yKCJVRiIpOwotICBFWFBFQ1RfVFJVRShmaWxlX25hbWUgPT0gdGVzdF9kYXRhLmV4cGVjdGVkKTsKKyAgRVhQRUNUX1NUUkVRKHRlc3RfZGF0YS5leHBlY3RlZCwgZGljdF9vYmotPkdldFVuaWNvZGVUZXh0Rm9yKCJGIikuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUSh0ZXN0X2RhdGEuZXhwZWN0ZWQsIGRpY3Rfb2JqLT5HZXRVbmljb2RlVGV4dEZvcigiVUYiKS5jX3N0cigpKTsKICAgLy8gQ2hlY2sgd2UgY2FuIGdldCB0aGUgZmlsZSBuYW1lIGJhY2suCi0gIEVYUEVDVF9UUlVFKGZpbGVfc3BlYzIuR2V0RmlsZU5hbWUoJmZpbGVfbmFtZSkpOwotICBFWFBFQ1RfVFJVRShmaWxlX25hbWUgPT0gdGVzdF9kYXRhLmlucHV0KTsKKyAgRVhQRUNUX1NUUkVRKHRlc3RfZGF0YS5pbnB1dCwgZmlsZV9zcGVjMi5HZXRGaWxlTmFtZSgpLmNfc3RyKCkpOworfQorCitURVNUKGNwZGZfZmlsZXNwZWMsIEdldEZpbGVTdHJlYW0pIHsKKyAgeworICAgIC8vIEludmFsaWQgb2JqZWN0LgorICAgIGF1dG8gbmFtZV9vYmogPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9OYW1lPihudWxscHRyLCAidGVzdC5wZGYiKTsKKyAgICBDUERGX0ZpbGVTcGVjIGZpbGVfc3BlYyhuYW1lX29iai5nZXQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGZpbGVfc3BlYy5HZXRGaWxlU3RyZWFtKCkpOworICB9CisgIHsKKyAgICAvLyBEaWN0aW9uYXJ5IG9iamVjdCBtaXNzaW5nIGl0cyBlbWJlZGRlZCBmaWxlcyBkaWN0aW9uYXJ5LgorICAgIGF1dG8gZGljdF9vYmogPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigpOworICAgIENQREZfRmlsZVNwZWMgZmlsZV9zcGVjKGRpY3Rfb2JqLmdldCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoZmlsZV9zcGVjLkdldEZpbGVTdHJlYW0oKSk7CisgIH0KKyAgeworICAgIC8vIERpY3Rpb25hcnkgb2JqZWN0IHdpdGggYW4gZW1wdHkgZW1iZWRkZWQgZmlsZXMgZGljdGlvbmFyeS4KKyAgICBhdXRvIGRpY3Rfb2JqID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4oKTsKKyAgICBkaWN0X29iai0+U2V0TmV3Rm9yPENQREZfRGljdGlvbmFyeT4oIkVGIik7CisgICAgQ1BERl9GaWxlU3BlYyBmaWxlX3NwZWMoZGljdF9vYmouZ2V0KCkpOworICAgIEVYUEVDVF9GQUxTRShmaWxlX3NwZWMuR2V0RmlsZVN0cmVhbSgpKTsKKyAgfQorICB7CisgICAgLy8gRGljdGlvbmFyeSBvYmplY3Qgd2l0aCBhIG5vbi1lbXB0eSBlbWJlZGRlZCBmaWxlcyBkaWN0aW9uYXJ5LgorICAgIGF1dG8gZGljdF9vYmogPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigpOworICAgIGRpY3Rfb2JqLT5TZXROZXdGb3I8Q1BERl9EaWN0aW9uYXJ5PigiRUYiKTsKKyAgICBDUERGX0ZpbGVTcGVjIGZpbGVfc3BlYyhkaWN0X29iai5nZXQoKSk7CisKKyAgICBjb25zdCB3Y2hhcl90IGZpbGVfbmFtZVtdID0gTCJ0ZXN0LnBkZiI7CisgICAgY29uc3QgY2hhciogY29uc3Qga2V5c1tdID0geyJVbml4IiwgIk1hYyIsICJET1MiLCAiRiIsICJVRiJ9OworICAgIGNvbnN0IGNoYXIqIGNvbnN0IHN0cmVhbXNbXSA9IHsidGVzdDEiLCAidGVzdDIiLCAidGVzdDMiLCAidGVzdDQiLCAidGVzdDUifTsKKyAgICBzdGF0aWNfYXNzZXJ0KEZYX0FycmF5U2l6ZShrZXlzKSA9PSBGWF9BcnJheVNpemUoc3RyZWFtcyksICJzaXplIG1pc21hdGNoIik7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBmaWxlX2RpY3QgPQorICAgICAgICBmaWxlX3NwZWMuR2V0T2JqKCktPkFzRGljdGlvbmFyeSgpLT5HZXREaWN0Rm9yKCJFRiIpOworCisgICAgLy8gS2V5cyBpbiByZXZlcnNlIG9yZGVyIG9mIHByZWNlZGVuY2UgdG8gcmV0cmlldmUgdGhlIGZpbGUgY29udGVudCBzdHJlYW0uCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoa2V5cyk7ICsraSkgeworICAgICAgLy8gU2V0IHRoZSBmaWxlIG5hbWUuCisgICAgICBkaWN0X29iai0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPihrZXlzW2ldLCBmaWxlX25hbWUpOworCisgICAgICAvLyBTZXQgdGhlIGZpbGUgc3RyZWFtLgorICAgICAgYXV0byBwRGljdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCk7CisgICAgICBzaXplX3QgYnVmX2xlbiA9IHN0cmxlbihzdHJlYW1zW2ldKSArIDE7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4gYnVmKEZYX0FsbG9jKHVpbnQ4X3QsIGJ1Zl9sZW4pKTsKKyAgICAgIG1lbWNweShidWYuZ2V0KCksIHN0cmVhbXNbaV0sIGJ1Zl9sZW4pOworICAgICAgZmlsZV9kaWN0LT5TZXROZXdGb3I8Q1BERl9TdHJlYW0+KGtleXNbaV0sIHN0ZDo6bW92ZShidWYpLCBidWZfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwRGljdCkpOworCisgICAgICAvLyBDaGVjayB0aGF0IHRoZSBmaWxlIGNvbnRlbnQgc3RyZWFtIGlzIGFzIGV4cGVjdGVkLgorICAgICAgRVhQRUNUX1NUUkVRKAorICAgICAgICAgIHN0cmVhbXNbaV0sCisgICAgICAgICAgZmlsZV9zcGVjLkdldEZpbGVTdHJlYW0oKS0+R2V0VW5pY29kZVRleHQoKS5VVEY4RW5jb2RlKCkuY19zdHIoKSk7CisKKyAgICAgIGlmIChpID09IDIpIHsKKyAgICAgICAgZGljdF9vYmotPlNldE5ld0ZvcjxDUERGX1N0cmluZz4oIkZTIiwgIlVSTCIsIGZhbHNlKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGZpbGVfc3BlYy5HZXRGaWxlU3RyZWFtKCkpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitURVNUKGNwZGZfZmlsZXNwZWMsIEdldFBhcmFtc0RpY3QpIHsKKyAgeworICAgIC8vIEludmFsaWQgb2JqZWN0LgorICAgIGF1dG8gbmFtZV9vYmogPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9OYW1lPihudWxscHRyLCAidGVzdC5wZGYiKTsKKyAgICBDUERGX0ZpbGVTcGVjIGZpbGVfc3BlYyhuYW1lX29iai5nZXQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGZpbGVfc3BlYy5HZXRQYXJhbXNEaWN0KCkpOworICB9CisgIHsKKyAgICAvLyBEaWN0aW9uYXJ5IG9iamVjdC4KKyAgICBhdXRvIGRpY3Rfb2JqID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4oKTsKKyAgICBkaWN0X29iai0+U2V0TmV3Rm9yPENQREZfRGljdGlvbmFyeT4oIkVGIik7CisgICAgZGljdF9vYmotPlNldE5ld0ZvcjxDUERGX1N0cmluZz4oIlVGIiwgTCJ0ZXN0LnBkZiIpOworICAgIENQREZfRmlsZVNwZWMgZmlsZV9zcGVjKGRpY3Rfb2JqLmdldCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoZmlsZV9zcGVjLkdldFBhcmFtc0RpY3QoKSk7CisKKyAgICAvLyBBZGQgYSBmaWxlIHN0cmVhbSB0byB0aGUgZW1iZWRkZWQgZmlsZXMgZGljdGlvbmFyeS4KKyAgICBDUERGX0RpY3Rpb25hcnkqIGZpbGVfZGljdCA9CisgICAgICAgIGZpbGVfc3BlYy5HZXRPYmooKS0+QXNEaWN0aW9uYXJ5KCktPkdldERpY3RGb3IoIkVGIik7CisgICAgYXV0byBwRGljdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IGJ1ZihGWF9BbGxvYyh1aW50OF90LCA2KSk7CisgICAgbWVtY3B5KGJ1Zi5nZXQoKSwgImhlbGxvIiwgNik7CisgICAgZmlsZV9kaWN0LT5TZXROZXdGb3I8Q1BERl9TdHJlYW0+KCJVRiIsIHN0ZDo6bW92ZShidWYpLCA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocERpY3QpKTsKKworICAgIC8vIEFkZCBhIHBhcmFtcyBkaWN0aW9uYXJ5IHRvIHRoZSBmaWxlIHN0cmVhbS4KKyAgICBDUERGX1N0cmVhbSogc3RyZWFtID0gZmlsZV9kaWN0LT5HZXRTdHJlYW1Gb3IoIlVGIik7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBzdHJlYW1fZGljdCA9IHN0cmVhbS0+R2V0RGljdCgpOworICAgIHN0cmVhbV9kaWN0LT5TZXROZXdGb3I8Q1BERl9EaWN0aW9uYXJ5PigiUGFyYW1zIik7CisgICAgRVhQRUNUX1RSVUUoZmlsZV9zcGVjLkdldFBhcmFtc0RpY3QoKSk7CisKKyAgICAvLyBBZGQgYSBwYXJhbWV0ZXIgdG8gdGhlIHBhcmFtcyBkaWN0aW9uYXJ5LgorICAgIENQREZfRGljdGlvbmFyeSogcGFyYW1zX2RpY3QgPSBzdHJlYW1fZGljdC0+R2V0RGljdEZvcigiUGFyYW1zIik7CisgICAgcGFyYW1zX2RpY3QtPlNldE5ld0ZvcjxDUERGX051bWJlcj4oIlNpemUiLCA2KTsKKyAgICBFWFBFQ1RfRVEoNiwgZmlsZV9zcGVjLkdldFBhcmFtc0RpY3QoKS0+R2V0SW50ZWdlckZvcigiU2l6ZSIpKTsKKyAgfQogfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwZGZfZm9ybWNvbnRyb2wuY3BwIGIvY29yZS9mcGRmZG9jL2NwZGZfZm9ybWNvbnRyb2wuY3BwCmluZGV4IDU0ZWRiNDkuLjM4NGMzNWUgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jcGRmX2Zvcm1jb250cm9sLmNwcAorKysgYi9jb3JlL2ZwZGZkb2MvY3BkZl9mb3JtY29udHJvbC5jcHAKQEAgLTIwLDcgKzIwLDcgQEAKIAogbmFtZXNwYWNlIHsKIAotY29uc3QgRlhfQ0hBUiogY29uc3QgZ19zSGlnaGxpZ2h0aW5nTW9kZVtdID0geworY29uc3QgY2hhciogY29uc3QgZ19zSGlnaGxpZ2h0aW5nTW9kZVtdID0gewogICAgIC8vIE11c3QgbWF0Y2ggb3JkZXIgb2YgSGlnaGxpZ2h0aW5nTW9kZSBlbnVtLgogICAgICJOIiwgIkkiLCAiTyIsICJQIiwgIlQifTsKIApAQCAtMzAsMTIgKzMwLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFdpZGdldERpY3QpCiAgICAgOiBtX3BGaWVsZChwRmllbGQpLAogICAgICAgbV9wV2lkZ2V0RGljdChwV2lkZ2V0RGljdCksCi0gICAgICBtX3BGb3JtKG1fcEZpZWxkLT5tX3BGb3JtKSB7fQorICAgICAgbV9wRm9ybShtX3BGaWVsZC0+R2V0Rm9ybSgpKSB7fQogCi1DRlhfQnl0ZVN0cmluZyBDUERGX0Zvcm1Db250cm9sOjpHZXRPblN0YXRlTmFtZSgpIGNvbnN0IHsKK0NQREZfRm9ybUNvbnRyb2w6On5DUERGX0Zvcm1Db250cm9sKCkge30KKworQnl0ZVN0cmluZyBDUERGX0Zvcm1Db250cm9sOjpHZXRPblN0YXRlTmFtZSgpIGNvbnN0IHsKICAgQVNTRVJUKEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6Q2hlY2tCb3ggfHwKICAgICAgICAgIEdldFR5cGUoKSA9PSBDUERGX0Zvcm1GaWVsZDo6UmFkaW9CdXR0b24pOwotICBDRlhfQnl0ZVN0cmluZyBjc09uOworICBCeXRlU3RyaW5nIGNzT247CiAgIENQREZfRGljdGlvbmFyeSogcEFQID0gbV9wV2lkZ2V0RGljdC0+R2V0RGljdEZvcigiQVAiKTsKICAgaWYgKCFwQVApCiAgICAgcmV0dXJuIGNzT247CkBAIC00OCwxOSArNTAsMTkgQEAKICAgICBpZiAoaXQuZmlyc3QgIT0gIk9mZiIpCiAgICAgICByZXR1cm4gaXQuZmlyc3Q7CiAgIH0KLSAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CisgIHJldHVybiBCeXRlU3RyaW5nKCk7CiB9CiAKLXZvaWQgQ1BERl9Gb3JtQ29udHJvbDo6U2V0T25TdGF0ZU5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzT24pIHsKK3ZvaWQgQ1BERl9Gb3JtQ29udHJvbDo6U2V0T25TdGF0ZU5hbWUoY29uc3QgQnl0ZVN0cmluZyYgY3NPbikgewogICBBU1NFUlQoR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCB8fAogICAgICAgICAgR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpSYWRpb0J1dHRvbik7Ci0gIENGWF9CeXRlU3RyaW5nIGNzVmFsdWUgPSBjc09uOworICBCeXRlU3RyaW5nIGNzVmFsdWUgPSBjc09uOwogICBpZiAoY3NWYWx1ZS5Jc0VtcHR5KCkpCiAgICAgY3NWYWx1ZSA9ICJZZXMiOwogICBlbHNlIGlmIChjc1ZhbHVlID09ICJPZmYiKQogICAgIGNzVmFsdWUgPSAiWWVzIjsKIAotICBDRlhfQnl0ZVN0cmluZyBjc0FTID0gbV9wV2lkZ2V0RGljdC0+R2V0U3RyaW5nRm9yKCJBUyIsICJPZmYiKTsKKyAgQnl0ZVN0cmluZyBjc0FTID0gbV9wV2lkZ2V0RGljdC0+R2V0U3RyaW5nRm9yKCJBUyIsICJPZmYiKTsKICAgaWYgKGNzQVMgIT0gIk9mZiIpCiAgICAgbV9wV2lkZ2V0RGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIkFTIiwgY3NWYWx1ZSk7CiAKQEAgLTgwLDcgKzgyLDcgQEAKIAogICAgIGF1dG8gc3ViZGljdF9pdCA9IHBTdWJEaWN0LT5iZWdpbigpOwogICAgIHdoaWxlIChzdWJkaWN0X2l0ICE9IHBTdWJEaWN0LT5lbmQoKSkgewotICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzS2V5MiA9IHN1YmRpY3RfaXQtPmZpcnN0OworICAgICAgY29uc3QgQnl0ZVN0cmluZyYgY3NLZXkyID0gc3ViZGljdF9pdC0+Zmlyc3Q7CiAgICAgICBDUERGX09iamVjdCogcE9iajIgPSBzdWJkaWN0X2l0LT5zZWNvbmQuZ2V0KCk7CiAgICAgICArK3N1YmRpY3RfaXQ7CiAgICAgICBpZiAoIXBPYmoyKQpAQCAtOTMsMzAgKzk1LDI4IEBACiAgIH0KIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9Gb3JtQ29udHJvbDo6R2V0Q2hlY2tlZEFQU3RhdGUoKSB7CitCeXRlU3RyaW5nIENQREZfRm9ybUNvbnRyb2w6OkdldENoZWNrZWRBUFN0YXRlKCkgewogICBBU1NFUlQoR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCB8fAogICAgICAgICAgR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpSYWRpb0J1dHRvbik7Ci0gIENGWF9CeXRlU3RyaW5nIGNzT24gPSBHZXRPblN0YXRlTmFtZSgpOworICBCeXRlU3RyaW5nIGNzT24gPSBHZXRPblN0YXRlTmFtZSgpOwogICBpZiAoR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpSYWRpb0J1dHRvbiB8fAogICAgICAgR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCkgewotICAgIGlmIChUb0FycmF5KEZQREZfR2V0RmllbGRBdHRyKG1fcEZpZWxkLT5tX3BEaWN0LCAiT3B0IikpKSB7Ci0gICAgICBpbnQgaUluZGV4ID0gbV9wRmllbGQtPkdldENvbnRyb2xJbmRleCh0aGlzKTsKLSAgICAgIGNzT24uRm9ybWF0KCIlZCIsIGlJbmRleCk7Ci0gICAgfQorICAgIGlmIChUb0FycmF5KEZQREZfR2V0RmllbGRBdHRyKG1fcEZpZWxkLT5HZXREaWN0KCksICJPcHQiKSkpCisgICAgICBjc09uID0gQnl0ZVN0cmluZzo6Rm9ybWF0KCIlZCIsIG1fcEZpZWxkLT5HZXRDb250cm9sSW5kZXgodGhpcykpOwogICB9CiAgIGlmIChjc09uLklzRW1wdHkoKSkKICAgICBjc09uID0gIlllcyI7CiAgIHJldHVybiBjc09uOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUERGX0Zvcm1Db250cm9sOjpHZXRFeHBvcnRWYWx1ZSgpIGNvbnN0IHsKK1dpZGVTdHJpbmcgQ1BERl9Gb3JtQ29udHJvbDo6R2V0RXhwb3J0VmFsdWUoKSBjb25zdCB7CiAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8CiAgICAgICAgICBHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgY3NPbiA9IEdldE9uU3RhdGVOYW1lKCk7CisgIEJ5dGVTdHJpbmcgY3NPbiA9IEdldE9uU3RhdGVOYW1lKCk7CiAgIGlmIChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uIHx8CiAgICAgICBHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94KSB7CiAgICAgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9Ci0gICAgICAgICAgICBUb0FycmF5KEZQREZfR2V0RmllbGRBdHRyKG1fcEZpZWxkLT5tX3BEaWN0LCAiT3B0IikpKSB7CisgICAgICAgICAgICBUb0FycmF5KEZQREZfR2V0RmllbGRBdHRyKG1fcEZpZWxkLT5HZXREaWN0KCksICJPcHQiKSkpIHsKICAgICAgIGludCBpSW5kZXggPSBtX3BGaWVsZC0+R2V0Q29udHJvbEluZGV4KHRoaXMpOwogICAgICAgY3NPbiA9IHBBcnJheS0+R2V0U3RyaW5nQXQoaUluZGV4KTsKICAgICB9CkBAIC0xMjksMjkgKzEyOSwyOSBAQAogYm9vbCBDUERGX0Zvcm1Db250cm9sOjpJc0NoZWNrZWQoKSBjb25zdCB7CiAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8CiAgICAgICAgICBHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgY3NPbiA9IEdldE9uU3RhdGVOYW1lKCk7Ci0gIENGWF9CeXRlU3RyaW5nIGNzQVMgPSBtX3BXaWRnZXREaWN0LT5HZXRTdHJpbmdGb3IoIkFTIik7CisgIEJ5dGVTdHJpbmcgY3NPbiA9IEdldE9uU3RhdGVOYW1lKCk7CisgIEJ5dGVTdHJpbmcgY3NBUyA9IG1fcFdpZGdldERpY3QtPkdldFN0cmluZ0ZvcigiQVMiKTsKICAgcmV0dXJuIGNzQVMgPT0gY3NPbjsKIH0KIAogYm9vbCBDUERGX0Zvcm1Db250cm9sOjpJc0RlZmF1bHRDaGVja2VkKCkgY29uc3QgewogICBBU1NFUlQoR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpDaGVja0JveCB8fAogICAgICAgICAgR2V0VHlwZSgpID09IENQREZfRm9ybUZpZWxkOjpSYWRpb0J1dHRvbik7Ci0gIENQREZfT2JqZWN0KiBwRFYgPSBGUERGX0dldEZpZWxkQXR0cihtX3BGaWVsZC0+bV9wRGljdCwgIkRWIik7CisgIENQREZfT2JqZWN0KiBwRFYgPSBGUERGX0dldEZpZWxkQXR0cihtX3BGaWVsZC0+R2V0RGljdCgpLCAiRFYiKTsKICAgaWYgKCFwRFYpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIENGWF9CeXRlU3RyaW5nIGNzRFYgPSBwRFYtPkdldFN0cmluZygpOwotICBDRlhfQnl0ZVN0cmluZyBjc09uID0gR2V0T25TdGF0ZU5hbWUoKTsKKyAgQnl0ZVN0cmluZyBjc0RWID0gcERWLT5HZXRTdHJpbmcoKTsKKyAgQnl0ZVN0cmluZyBjc09uID0gR2V0T25TdGF0ZU5hbWUoKTsKICAgcmV0dXJuIChjc0RWID09IGNzT24pOwogfQogCiB2b2lkIENQREZfRm9ybUNvbnRyb2w6OkNoZWNrQ29udHJvbChib29sIGJDaGVja2VkKSB7CiAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8CiAgICAgICAgICBHZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgY3NPbiA9IEdldE9uU3RhdGVOYW1lKCk7Ci0gIENGWF9CeXRlU3RyaW5nIGNzT2xkQVMgPSBtX3BXaWRnZXREaWN0LT5HZXRTdHJpbmdGb3IoIkFTIiwgIk9mZiIpOwotICBDRlhfQnl0ZVN0cmluZyBjc0FTID0gIk9mZiI7CisgIEJ5dGVTdHJpbmcgY3NPbiA9IEdldE9uU3RhdGVOYW1lKCk7CisgIEJ5dGVTdHJpbmcgY3NPbGRBUyA9IG1fcFdpZGdldERpY3QtPkdldFN0cmluZ0ZvcigiQVMiLCAiT2ZmIik7CisgIEJ5dGVTdHJpbmcgY3NBUyA9ICJPZmYiOwogICBpZiAoYkNoZWNrZWQpCiAgICAgY3NBUyA9IGNzT247CiAgIGlmIChjc09sZEFTID09IGNzQVMpCkBAIC0xNjcsMjAgKzE2NywyMCBAQAogICBpZiAobV9wV2lkZ2V0RGljdC0+R2V0SW50ZWdlckZvcigiRiIpICYgQU5OT1RGTEFHX0hJRERFTikKICAgICByZXR1cm47CiAKLSAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBGUERGRE9DX0dldEFubm90QVAobV9wV2lkZ2V0RGljdCwgbW9kZSk7CisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gRlBERkRPQ19HZXRBbm5vdEFQKG1fcFdpZGdldERpY3QuR2V0KCksIG1vZGUpOwogICBpZiAoIXBTdHJlYW0pCiAgICAgcmV0dXJuOwogCi0gIENGWF9GbG9hdFJlY3QgZm9ybV9iYm94ID0gcFN0cmVhbS0+R2V0RGljdCgpLT5HZXRSZWN0Rm9yKCJCQm94Iik7CiAgIENGWF9NYXRyaXggZm9ybV9tYXRyaXggPSBwU3RyZWFtLT5HZXREaWN0KCktPkdldE1hdHJpeEZvcigiTWF0cml4Iik7Ci0gIGZvcm1fbWF0cml4LlRyYW5zZm9ybVJlY3QoZm9ybV9iYm94KTsKKyAgQ0ZYX0Zsb2F0UmVjdCBmb3JtX2Jib3ggPQorICAgICAgZm9ybV9tYXRyaXguVHJhbnNmb3JtUmVjdChwU3RyZWFtLT5HZXREaWN0KCktPkdldFJlY3RGb3IoIkJCb3giKSk7CiAgIENGWF9GbG9hdFJlY3QgYXJlY3QgPSBtX3BXaWRnZXREaWN0LT5HZXRSZWN0Rm9yKCJSZWN0Iik7CiAgIENGWF9NYXRyaXggbWF0cml4OwogICBtYXRyaXguTWF0Y2hSZWN0KGFyZWN0LCBmb3JtX2Jib3gpOwogICBtYXRyaXguQ29uY2F0KCpwTWF0cml4KTsKLSAgQ1BERl9Gb3JtIGZvcm0obV9wRmllbGQtPm1fcEZvcm0tPm1fcERvY3VtZW50LAotICAgICAgICAgICAgICAgICBtX3BGaWVsZC0+bV9wRm9ybS0+bV9wRm9ybURpY3QtPkdldERpY3RGb3IoIkRSIiksIHBTdHJlYW0pOwotICBmb3JtLlBhcnNlQ29udGVudChudWxscHRyLCBudWxscHRyLCBudWxscHRyKTsKKyAgQ1BERl9Gb3JtIGZvcm0obV9wRmllbGQtPkdldEZvcm0oKS0+R2V0RG9jdW1lbnQoKSwKKyAgICAgICAgICAgICAgICAgbV9wRmllbGQtPkdldEZvcm0oKS0+R2V0Rm9ybURpY3QoKS0+R2V0RGljdEZvcigiRFIiKSwgcFN0cmVhbSk7CisgIGZvcm0uUGFyc2VDb250ZW50KCk7CiAgIENQREZfUmVuZGVyQ29udGV4dCBjb250ZXh0KHBQYWdlKTsKICAgY29udGV4dC5BcHBlbmRMYXllcigmZm9ybSwgJm1hdHJpeCk7CiAgIGNvbnRleHQuUmVuZGVyKHBEZXZpY2UsIHBPcHRpb25zLCBudWxscHRyKTsKQEAgLTE5MCw3ICsxOTAsNyBAQAogICBpZiAoIW1fcFdpZGdldERpY3QpCiAgICAgcmV0dXJuIEludmVydDsKIAotICBDRlhfQnl0ZVN0cmluZyBjc0ggPSBtX3BXaWRnZXREaWN0LT5HZXRTdHJpbmdGb3IoIkgiLCAiSSIpOworICBCeXRlU3RyaW5nIGNzSCA9IG1fcFdpZGdldERpY3QtPkdldFN0cmluZ0ZvcigiSCIsICJJIik7CiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGdfc0hpZ2hsaWdodGluZ01vZGUpOyArK2kpIHsKICAgICBpZiAoY3NIID09IGdfc0hpZ2hsaWdodGluZ01vZGVbaV0pCiAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SGlnaGxpZ2h0aW5nTW9kZT4oaSk7CkBAIC0yMDMsNyArMjAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cik7CiB9CiAKLWJvb2wgQ1BERl9Gb3JtQ29udHJvbDo6SGFzTUtFbnRyeShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NFbnRyeSkgY29uc3QgeworYm9vbCBDUERGX0Zvcm1Db250cm9sOjpIYXNNS0VudHJ5KGNvbnN0IEJ5dGVTdHJpbmcmIGNzRW50cnkpIGNvbnN0IHsKICAgcmV0dXJuIEdldE1LKCkuSGFzTUtFbnRyeShjc0VudHJ5KTsKIH0KIApAQCAtMjExLDI3ICsyMTEsMjUgQEAKICAgcmV0dXJuIEdldE1LKCkuR2V0Um90YXRpb24oKTsKIH0KIAotRlhfQVJHQiBDUERGX0Zvcm1Db250cm9sOjpHZXRDb2xvcihpbnQmIGlDb2xvclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc0VudHJ5KSB7CitGWF9BUkdCIENQREZfRm9ybUNvbnRyb2w6OkdldENvbG9yKGludCYgaUNvbG9yVHlwZSwgY29uc3QgQnl0ZVN0cmluZyYgY3NFbnRyeSkgewogICByZXR1cm4gR2V0TUsoKS5HZXRDb2xvcihpQ29sb3JUeXBlLCBjc0VudHJ5KTsKIH0KIAotRlhfRkxPQVQgQ1BERl9Gb3JtQ29udHJvbDo6R2V0T3JpZ2luYWxDb2xvcihpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc0VudHJ5KSB7CitmbG9hdCBDUERGX0Zvcm1Db250cm9sOjpHZXRPcmlnaW5hbENvbG9yKGludCBpbmRleCwgY29uc3QgQnl0ZVN0cmluZyYgY3NFbnRyeSkgewogICByZXR1cm4gR2V0TUsoKS5HZXRPcmlnaW5hbENvbG9yKGluZGV4LCBjc0VudHJ5KTsKIH0KIAogdm9pZCBDUERGX0Zvcm1Db250cm9sOjpHZXRPcmlnaW5hbENvbG9yKGludCYgaUNvbG9yVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmY1s0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NFbnRyeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZjWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIGNzRW50cnkpIHsKICAgR2V0TUsoKS5HZXRPcmlnaW5hbENvbG9yKGlDb2xvclR5cGUsIGZjLCBjc0VudHJ5KTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtQ29udHJvbDo6R2V0Q2FwdGlvbihjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NFbnRyeSkgeworV2lkZVN0cmluZyBDUERGX0Zvcm1Db250cm9sOjpHZXRDYXB0aW9uKGNvbnN0IEJ5dGVTdHJpbmcmIGNzRW50cnkpIHsKICAgcmV0dXJuIEdldE1LKCkuR2V0Q2FwdGlvbihjc0VudHJ5KTsKIH0KIAotQ1BERl9TdHJlYW0qIENQREZfRm9ybUNvbnRyb2w6OkdldEljb24oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzRW50cnkpIHsKK0NQREZfU3RyZWFtKiBDUERGX0Zvcm1Db250cm9sOjpHZXRJY29uKGNvbnN0IEJ5dGVTdHJpbmcmIGNzRW50cnkpIHsKICAgcmV0dXJuIEdldE1LKCkuR2V0SWNvbihjc0VudHJ5KTsKIH0KIApAQCAtMjQ1LDIxICsyNDMsMTggQEAKIAogQ1BERl9BY3Rpb24gQ1BERl9Gb3JtQ29udHJvbDo6R2V0QWN0aW9uKCkgewogICBpZiAoIW1fcFdpZGdldERpY3QpCi0gICAgcmV0dXJuIENQREZfQWN0aW9uKCk7CisgICAgcmV0dXJuIENQREZfQWN0aW9uKG51bGxwdHIpOwogCiAgIGlmIChtX3BXaWRnZXREaWN0LT5LZXlFeGlzdCgiQSIpKQogICAgIHJldHVybiBDUERGX0FjdGlvbihtX3BXaWRnZXREaWN0LT5HZXREaWN0Rm9yKCJBIikpOwogCi0gIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRmllbGQtPm1fcERpY3QsICJBIik7Ci0gIGlmICghcE9iaikKLSAgICByZXR1cm4gQ1BERl9BY3Rpb24oKTsKLQotICByZXR1cm4gQ1BERl9BY3Rpb24ocE9iai0+R2V0RGljdCgpKTsKKyAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BGaWVsZC0+R2V0RGljdCgpLCAiQSIpOworICByZXR1cm4gQ1BERl9BY3Rpb24ocE9iaiA/IHBPYmotPkdldERpY3QoKSA6IG51bGxwdHIpOwogfQogCiBDUERGX0FBY3Rpb24gQ1BERl9Gb3JtQ29udHJvbDo6R2V0QWRkaXRpb25hbEFjdGlvbigpIHsKICAgaWYgKCFtX3BXaWRnZXREaWN0KQotICAgIHJldHVybiBDUERGX0FBY3Rpb24oKTsKKyAgICByZXR1cm4gQ1BERl9BQWN0aW9uKG51bGxwdHIpOwogCiAgIGlmIChtX3BXaWRnZXREaWN0LT5LZXlFeGlzdCgiQUEiKSkKICAgICByZXR1cm4gQ1BERl9BQWN0aW9uKG1fcFdpZGdldERpY3QtPkdldERpY3RGb3IoIkFBIikpOwpAQCAtMjczLDMzICsyNjgsMzMgQEAKICAgaWYgKG1fcFdpZGdldERpY3QtPktleUV4aXN0KCJEQSIpKQogICAgIHJldHVybiBDUERGX0RlZmF1bHRBcHBlYXJhbmNlKG1fcFdpZGdldERpY3QtPkdldFN0cmluZ0ZvcigiREEiKSk7CiAKLSAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BGaWVsZC0+bV9wRGljdCwgIkRBIik7CisgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRmllbGQtPkdldERpY3QoKSwgIkRBIik7CiAgIGlmIChwT2JqKQogICAgIHJldHVybiBDUERGX0RlZmF1bHRBcHBlYXJhbmNlKHBPYmotPkdldFN0cmluZygpKTsKLSAgcmV0dXJuIG1fcEZpZWxkLT5tX3BGb3JtLT5HZXREZWZhdWx0QXBwZWFyYW5jZSgpOworICByZXR1cm4gbV9wRmllbGQtPkdldEZvcm0oKS0+R2V0RGVmYXVsdEFwcGVhcmFuY2UoKTsKIH0KIAogQ1BERl9Gb250KiBDUERGX0Zvcm1Db250cm9sOjpHZXREZWZhdWx0Q29udHJvbEZvbnQoKSB7CisgIGZsb2F0IGZGb250U2l6ZTsKICAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBjREEgPSBHZXREZWZhdWx0QXBwZWFyYW5jZSgpOwotICBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lVGFnOwotICBGWF9GTE9BVCBmRm9udFNpemU7Ci0gIGNEQS5HZXRGb250KGNzRm9udE5hbWVUYWcsIGZGb250U2l6ZSk7CisgIEJ5dGVTdHJpbmcgY3NGb250TmFtZVRhZyA9IGNEQS5HZXRGb250KCZmRm9udFNpemUpOwogICBpZiAoY3NGb250TmFtZVRhZy5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BXaWRnZXREaWN0LCAiRFIiKTsKKyAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BXaWRnZXREaWN0LkdldCgpLCAiRFIiKTsKICAgaWYgKENQREZfRGljdGlvbmFyeSogcERpY3QgPSBUb0RpY3Rpb25hcnkocE9iaikpIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250cyA9IHBEaWN0LT5HZXREaWN0Rm9yKCJGb250Iik7CiAgICAgaWYgKHBGb250cykgewogICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRWxlbWVudCA9IHBGb250cy0+R2V0RGljdEZvcihjc0ZvbnROYW1lVGFnKTsKICAgICAgIGlmIChwRWxlbWVudCkgewotICAgICAgICBDUERGX0ZvbnQqIHBGb250ID0gbV9wRmllbGQtPm1fcEZvcm0tPm1fcERvY3VtZW50LT5Mb2FkRm9udChwRWxlbWVudCk7CisgICAgICAgIENQREZfRm9udCogcEZvbnQgPQorICAgICAgICAgICAgbV9wRmllbGQtPkdldEZvcm0oKS0+R2V0RG9jdW1lbnQoKS0+TG9hZEZvbnQocEVsZW1lbnQpOwogICAgICAgICBpZiAocEZvbnQpCiAgICAgICAgICAgcmV0dXJuIHBGb250OwogICAgICAgfQogICAgIH0KICAgfQotICBpZiAoQ1BERl9Gb250KiBwRm9ybUZvbnQgPSBtX3BGaWVsZC0+bV9wRm9ybS0+R2V0Rm9ybUZvbnQoY3NGb250TmFtZVRhZykpCisgIGlmIChDUERGX0ZvbnQqIHBGb3JtRm9udCA9IG1fcEZpZWxkLT5HZXRGb3JtKCktPkdldEZvcm1Gb250KGNzRm9udE5hbWVUYWcpKQogICAgIHJldHVybiBwRm9ybUZvbnQ7CiAKICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBtX3BXaWRnZXREaWN0LT5HZXREaWN0Rm9yKCJQIik7CkBAIC0zMDksNyArMzA0LDggQEAKICAgICBpZiAocEZvbnRzKSB7CiAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBFbGVtZW50ID0gcEZvbnRzLT5HZXREaWN0Rm9yKGNzRm9udE5hbWVUYWcpOwogICAgICAgaWYgKHBFbGVtZW50KSB7Ci0gICAgICAgIENQREZfRm9udCogcEZvbnQgPSBtX3BGaWVsZC0+bV9wRm9ybS0+bV9wRG9jdW1lbnQtPkxvYWRGb250KHBFbGVtZW50KTsKKyAgICAgICAgQ1BERl9Gb250KiBwRm9udCA9CisgICAgICAgICAgICBtX3BGaWVsZC0+R2V0Rm9ybSgpLT5HZXREb2N1bWVudCgpLT5Mb2FkRm9udChwRWxlbWVudCk7CiAgICAgICAgIGlmIChwRm9udCkKICAgICAgICAgICByZXR1cm4gcEZvbnQ7CiAgICAgICB9CkBAIC0zMjQsOCArMzIwLDggQEAKICAgaWYgKG1fcFdpZGdldERpY3QtPktleUV4aXN0KCJRIikpCiAgICAgcmV0dXJuIG1fcFdpZGdldERpY3QtPkdldEludGVnZXJGb3IoIlEiLCAwKTsKIAotICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcEZpZWxkLT5tX3BEaWN0LCAiUSIpOworICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcEZpZWxkLT5HZXREaWN0KCksICJRIik7CiAgIGlmIChwT2JqKQogICAgIHJldHVybiBwT2JqLT5HZXRJbnRlZ2VyKCk7Ci0gIHJldHVybiBtX3BGaWVsZC0+bV9wRm9ybS0+R2V0Rm9ybUFsaWdubWVudCgpOworICByZXR1cm4gbV9wRmllbGQtPkdldEZvcm0oKS0+R2V0Rm9ybUFsaWdubWVudCgpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwZGZfZm9ybWNvbnRyb2wuaCBiL2NvcmUvZnBkZmRvYy9jcGRmX2Zvcm1jb250cm9sLmgKaW5kZXggYzBkYWQzOS4uNjQ4NWFmMCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfZm9ybWNvbnRyb2wuaAorKysgYi9jb3JlL2ZwZGZkb2MvY3BkZl9mb3JtY29udHJvbC5oCkBAIC0yOCwxMSArMjgsNiBAQAogI2RlZmluZSBURVhUUE9TX0xFRlQgNQogI2RlZmluZSBURVhUUE9TX09WRVJMQUlEIDYKIAotI2RlZmluZSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQgMAotI2RlZmluZSBDT0xPUlRZUEVfR1JBWSAxCi0jZGVmaW5lIENPTE9SVFlQRV9SR0IgMgotI2RlZmluZSBDT0xPUlRZUEVfQ01ZSyAzCi0KIGNsYXNzIENGWF9SZW5kZXJEZXZpY2U7CiBjbGFzcyBDUERGX0RpY3Rpb25hcnk7CiBjbGFzcyBDUERGX0ZvbnQ7CkBAIC00NywxMSArNDIsMTIgQEAKICAgZW51bSBIaWdobGlnaHRpbmdNb2RlIHsgTm9uZSA9IDAsIEludmVydCwgT3V0bGluZSwgUHVzaCwgVG9nZ2xlIH07CiAKICAgQ1BERl9Gb3JtQ29udHJvbChDUERGX0Zvcm1GaWVsZCogcEZpZWxkLCBDUERGX0RpY3Rpb25hcnkqIHBXaWRnZXREaWN0KTsKKyAgfkNQREZfRm9ybUNvbnRyb2woKTsKIAogICBDUERGX0Zvcm1GaWVsZDo6VHlwZSBHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9wRmllbGQtPkdldFR5cGUoKTsgfQotICBDUERGX0ludGVyRm9ybSogR2V0SW50ZXJGb3JtKCkgY29uc3QgeyByZXR1cm4gbV9wRm9ybTsgfQorICBjb25zdCBDUERGX0ludGVyRm9ybSogR2V0SW50ZXJGb3JtKCkgY29uc3QgeyByZXR1cm4gbV9wRm9ybS5HZXQoKTsgfQogICBDUERGX0Zvcm1GaWVsZCogR2V0RmllbGQoKSBjb25zdCB7IHJldHVybiBtX3BGaWVsZDsgfQotICBDUERGX0RpY3Rpb25hcnkqIEdldFdpZGdldCgpIGNvbnN0IHsgcmV0dXJuIG1fcFdpZGdldERpY3Q7IH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRXaWRnZXQoKSBjb25zdCB7IHJldHVybiBtX3BXaWRnZXREaWN0LkdldCgpOyB9CiAgIENGWF9GbG9hdFJlY3QgR2V0UmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fcFdpZGdldERpY3QtPkdldFJlY3RGb3IoIlJlY3QiKTsgfQogCiAgIHZvaWQgRHJhd0NvbnRyb2woQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKQEAgLTYwLDIzICs1NiwyMyBAQAogICAgICAgICAgICAgICAgICAgIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyA9IG51bGxwdHIpOwogCi0gIENGWF9CeXRlU3RyaW5nIEdldENoZWNrZWRBUFN0YXRlKCk7Ci0gIENGWF9XaWRlU3RyaW5nIEdldEV4cG9ydFZhbHVlKCkgY29uc3Q7CisgIEJ5dGVTdHJpbmcgR2V0Q2hlY2tlZEFQU3RhdGUoKTsKKyAgV2lkZVN0cmluZyBHZXRFeHBvcnRWYWx1ZSgpIGNvbnN0OwogCiAgIGJvb2wgSXNDaGVja2VkKCkgY29uc3Q7CiAgIGJvb2wgSXNEZWZhdWx0Q2hlY2tlZCgpIGNvbnN0OwogCiAgIEhpZ2hsaWdodGluZ01vZGUgR2V0SGlnaGxpZ2h0aW5nTW9kZSgpOwotICBib29sIEhhc01LRW50cnkoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzRW50cnkpIGNvbnN0OworICBib29sIEhhc01LRW50cnkoY29uc3QgQnl0ZVN0cmluZyYgY3NFbnRyeSkgY29uc3Q7CiAgIGludCBHZXRSb3RhdGlvbigpOwogCiAgIEZYX0FSR0IgR2V0Qm9yZGVyQ29sb3IoaW50JiBpQ29sb3JUeXBlKSB7IHJldHVybiBHZXRDb2xvcihpQ29sb3JUeXBlLCAiQkMiKTsgfQogCi0gIEZYX0ZMT0FUIEdldE9yaWdpbmFsQm9yZGVyQ29sb3IoaW50IGluZGV4KSB7CisgIGZsb2F0IEdldE9yaWdpbmFsQm9yZGVyQ29sb3IoaW50IGluZGV4KSB7CiAgICAgcmV0dXJuIEdldE9yaWdpbmFsQ29sb3IoaW5kZXgsICJCQyIpOwogICB9CiAKLSAgdm9pZCBHZXRPcmlnaW5hbEJvcmRlckNvbG9yKGludCYgaUNvbG9yVHlwZSwgRlhfRkxPQVQgZmNbNF0pIHsKKyAgdm9pZCBHZXRPcmlnaW5hbEJvcmRlckNvbG9yKGludCYgaUNvbG9yVHlwZSwgZmxvYXQgZmNbNF0pIHsKICAgICBHZXRPcmlnaW5hbENvbG9yKGlDb2xvclR5cGUsIGZjLCAiQkMiKTsKICAgfQogCkBAIC04NCwxNyArODAsMTcgQEAKICAgICByZXR1cm4gR2V0Q29sb3IoaUNvbG9yVHlwZSwgIkJHIik7CiAgIH0KIAotICBGWF9GTE9BVCBHZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcihpbnQgaW5kZXgpIHsKKyAgZmxvYXQgR2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoaW50IGluZGV4KSB7CiAgICAgcmV0dXJuIEdldE9yaWdpbmFsQ29sb3IoaW5kZXgsICJCRyIpOwogICB9CiAKLSAgdm9pZCBHZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcihpbnQmIGlDb2xvclR5cGUsIEZYX0ZMT0FUIGZjWzRdKSB7CisgIHZvaWQgR2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoaW50JiBpQ29sb3JUeXBlLCBmbG9hdCBmY1s0XSkgewogICAgIEdldE9yaWdpbmFsQ29sb3IoaUNvbG9yVHlwZSwgZmMsICJCRyIpOwogICB9CiAKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0Tm9ybWFsQ2FwdGlvbigpIHsgcmV0dXJuIEdldENhcHRpb24oIkNBIik7IH0KLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0Um9sbG92ZXJDYXB0aW9uKCkgeyByZXR1cm4gR2V0Q2FwdGlvbigiUkMiKTsgfQotICBDRlhfV2lkZVN0cmluZyBHZXREb3duQ2FwdGlvbigpIHsgcmV0dXJuIEdldENhcHRpb24oIkFDIik7IH0KKyAgV2lkZVN0cmluZyBHZXROb3JtYWxDYXB0aW9uKCkgeyByZXR1cm4gR2V0Q2FwdGlvbigiQ0EiKTsgfQorICBXaWRlU3RyaW5nIEdldFJvbGxvdmVyQ2FwdGlvbigpIHsgcmV0dXJuIEdldENhcHRpb24oIlJDIik7IH0KKyAgV2lkZVN0cmluZyBHZXREb3duQ2FwdGlvbigpIHsgcmV0dXJuIEdldENhcHRpb24oIkFDIik7IH0KIAogICBDUERGX1N0cmVhbSogR2V0Tm9ybWFsSWNvbigpIHsgcmV0dXJuIEdldEljb24oIkkiKTsgfQogICBDUERGX1N0cmVhbSogR2V0Um9sbG92ZXJJY29uKCkgeyByZXR1cm4gR2V0SWNvbigiUkkiKTsgfQpAQCAtMTA5LDI2ICsxMDUsMjQgQEAKICAgQ1BERl9Gb250KiBHZXREZWZhdWx0Q29udHJvbEZvbnQoKTsKICAgaW50IEdldENvbnRyb2xBbGlnbm1lbnQoKTsKIAotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBDUERGX0ludGVyRm9ybTsKLSAgZnJpZW5kIGNsYXNzIENQREZfRm9ybUZpZWxkOwotCi0gIENGWF9CeXRlU3RyaW5nIEdldE9uU3RhdGVOYW1lKCkgY29uc3Q7Ci0gIHZvaWQgU2V0T25TdGF0ZU5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzT24pOworICBCeXRlU3RyaW5nIEdldE9uU3RhdGVOYW1lKCkgY29uc3Q7CiAgIHZvaWQgQ2hlY2tDb250cm9sKGJvb2wgYkNoZWNrZWQpOwotICBGWF9BUkdCIEdldENvbG9yKGludCYgaUNvbG9yVHlwZSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzRW50cnkpOwotICBGWF9GTE9BVCBHZXRPcmlnaW5hbENvbG9yKGludCBpbmRleCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzRW50cnkpOwotICB2b2lkIEdldE9yaWdpbmFsQ29sb3IoaW50JiBpQ29sb3JUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZmNbNF0sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NFbnRyeSk7CiAKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0Q2FwdGlvbihjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NFbnRyeSk7Ci0gIENQREZfU3RyZWFtKiBHZXRJY29uKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc0VudHJ5KTsKKyBwcml2YXRlOgorICB2b2lkIFNldE9uU3RhdGVOYW1lKGNvbnN0IEJ5dGVTdHJpbmcmIGNzT24pOworICBGWF9BUkdCIEdldENvbG9yKGludCYgaUNvbG9yVHlwZSwgY29uc3QgQnl0ZVN0cmluZyYgY3NFbnRyeSk7CisgIGZsb2F0IEdldE9yaWdpbmFsQ29sb3IoaW50IGluZGV4LCBjb25zdCBCeXRlU3RyaW5nJiBjc0VudHJ5KTsKKyAgdm9pZCBHZXRPcmlnaW5hbENvbG9yKGludCYgaUNvbG9yVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZjWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgY3NFbnRyeSk7CisKKyAgV2lkZVN0cmluZyBHZXRDYXB0aW9uKGNvbnN0IEJ5dGVTdHJpbmcmIGNzRW50cnkpOworICBDUERGX1N0cmVhbSogR2V0SWNvbihjb25zdCBCeXRlU3RyaW5nJiBjc0VudHJ5KTsKICAgQ1BERl9BcFNldHRpbmdzIEdldE1LKCkgY29uc3Q7CiAKICAgQ1BERl9Gb3JtRmllbGQqIGNvbnN0IG1fcEZpZWxkOwotICBDUERGX0RpY3Rpb25hcnkqIGNvbnN0IG1fcFdpZGdldERpY3Q7Ci0gIENQREZfSW50ZXJGb3JtKiBjb25zdCBtX3BGb3JtOworICBVbm93bmVkUHRyPENQREZfRGljdGlvbmFyeT4gY29uc3QgbV9wV2lkZ2V0RGljdDsKKyAgVW5vd25lZFB0cjxjb25zdCBDUERGX0ludGVyRm9ybT4gY29uc3QgbV9wRm9ybTsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9GUERGRE9DX0NQREZfRk9STUNPTlRST0xfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jcGRmX2Zvcm1maWVsZC5jcHAgYi9jb3JlL2ZwZGZkb2MvY3BkZl9mb3JtZmllbGQuY3BwCmluZGV4IGI0YWE5MGUuLmRmNTkzNjkgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jcGRmX2Zvcm1maWVsZC5jcHAKKysrIGIvY29yZS9mcGRmZG9jL2NwZGZfZm9ybWZpZWxkLmNwcApAQCAtMjUsOCArMjUsNiBAQAogCiBuYW1lc3BhY2UgewogCi1jb25zdCBpbnQga01heFJlY3Vyc2lvbiA9IDMyOwotCiBjb25zdCBpbnQga0Zvcm1MaXN0TXVsdGlTZWxlY3QgPSAweDEwMDsKIAogY29uc3QgaW50IGtGb3JtQ29tYm9FZGl0ID0gMHgxMDA7CkBAIC00NywxMiArNDUsMTkgQEAKIAogfSAgLy8gbmFtZXNwYWNlCiAKLUNQREZfT2JqZWN0KiBGUERGX0dldEZpZWxkQXR0cihDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogbmFtZSwKK09wdGlvbmFsPEZvcm1GaWVsZFR5cGU+IEludFRvRm9ybUZpZWxkVHlwZShpbnQgdmFsdWUpIHsKKyAgaWYgKHZhbHVlID49IHN0YXRpY19jYXN0PGludD4oRm9ybUZpZWxkVHlwZTo6a1Vua25vd24pICYmCisgICAgICB2YWx1ZSA8IHN0YXRpY19jYXN0PGludD4oa0Zvcm1GaWVsZFR5cGVDb3VudCkpIHsKKyAgICByZXR1cm4ge3N0YXRpY19jYXN0PEZvcm1GaWVsZFR5cGU+KHZhbHVlKX07CisgIH0KKyAgcmV0dXJuIHt9OworfQorCitDUERGX09iamVjdCogRlBERl9HZXRGaWVsZEF0dHIoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5MZXZlbCkgewotICBpZiAobkxldmVsID4ga01heFJlY3Vyc2lvbikKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgaWYgKCFwRmllbGREaWN0KQorICBzdGF0aWMgY29uc3RleHByIGludCBrR2V0RmllbGRNYXhSZWN1cnNpb24gPSAzMjsKKyAgaWYgKCFwRmllbGREaWN0IHx8IG5MZXZlbCA+IGtHZXRGaWVsZE1heFJlY3Vyc2lvbikKICAgICByZXR1cm4gbnVsbHB0cjsKIAogICBDUERGX09iamVjdCogcEF0dHIgPSBwRmllbGREaWN0LT5HZXREaXJlY3RPYmplY3RGb3IobmFtZSk7CkBAIC02MCwxOCArNjUsMTYgQEAKICAgICByZXR1cm4gcEF0dHI7CiAKICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50ID0gcEZpZWxkRGljdC0+R2V0RGljdEZvcigiUGFyZW50Iik7Ci0gIGlmICghcFBhcmVudCkKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIEZQREZfR2V0RmllbGRBdHRyKHBQYXJlbnQsIG5hbWUsIG5MZXZlbCArIDEpOworICByZXR1cm4gcFBhcmVudCA/IEZQREZfR2V0RmllbGRBdHRyKHBQYXJlbnQsIG5hbWUsIG5MZXZlbCArIDEpIDogbnVsbHB0cjsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgRlBERl9HZXRGdWxsTmFtZShDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgZnVsbF9uYW1lOworV2lkZVN0cmluZyBGUERGX0dldEZ1bGxOYW1lKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCkgeworICBXaWRlU3RyaW5nIGZ1bGxfbmFtZTsKICAgc3RkOjpzZXQ8Q1BERl9EaWN0aW9uYXJ5Kj4gdmlzaXRlZDsKICAgQ1BERl9EaWN0aW9uYXJ5KiBwTGV2ZWwgPSBwRmllbGREaWN0OwogICB3aGlsZSAocExldmVsKSB7CiAgICAgdmlzaXRlZC5pbnNlcnQocExldmVsKTsKLSAgICBDRlhfV2lkZVN0cmluZyBzaG9ydF9uYW1lID0gcExldmVsLT5HZXRVbmljb2RlVGV4dEZvcigiVCIpOworICAgIFdpZGVTdHJpbmcgc2hvcnRfbmFtZSA9IHBMZXZlbC0+R2V0VW5pY29kZVRleHRGb3IoIlQiKTsKICAgICBpZiAoIXNob3J0X25hbWUuSXNFbXB0eSgpKSB7CiAgICAgICBpZiAoZnVsbF9uYW1lLklzRW1wdHkoKSkKICAgICAgICAgZnVsbF9uYW1lID0gc2hvcnRfbmFtZTsKQEAgLTk3LDEyICsxMDAsMTAgQEAKIENQREZfRm9ybUZpZWxkOjp+Q1BERl9Gb3JtRmllbGQoKSB7fQogCiB2b2lkIENQREZfRm9ybUZpZWxkOjpTeW5jRmllbGRGbGFncygpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgdHlwZV9uYW1lID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkZUIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkZUIiktPkdldFN0cmluZygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENGWF9CeXRlU3RyaW5nKCk7Ci0gIHVpbnQzMl90IGZsYWdzID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkZmIikKLSAgICAgICAgICAgICAgICAgICAgICAgPyBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiRmYiKS0+R2V0SW50ZWdlcigpCi0gICAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgQ1BERl9PYmplY3QqIGZ0X2F0dHIgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LkdldCgpLCAiRlQiKTsKKyAgQnl0ZVN0cmluZyB0eXBlX25hbWUgPSBmdF9hdHRyID8gZnRfYXR0ci0+R2V0U3RyaW5nKCkgOiBCeXRlU3RyaW5nKCk7CisgIENQREZfT2JqZWN0KiBmZl9hdHRyID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdC5HZXQoKSwgIkZmIik7CisgIHVpbnQzMl90IGZsYWdzID0gZmZfYXR0ciA/IGZmX2F0dHItPkdldEludGVnZXIoKSA6IDA7CiAgIG1fRmxhZ3MgPSAwOwogICBpZiAoZmxhZ3MgJiBGT1JNRkxBR19SRUFET05MWSkKICAgICBtX0ZsYWdzIHw9IEZPUk1GTEFHX1JFQURPTkxZOwpAQCAtMTU2LDggKzE1Nyw4IEBACiAgIH0KIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldEZ1bGxOYW1lKCkgY29uc3QgewotICByZXR1cm4gRlBERl9HZXRGdWxsTmFtZShtX3BEaWN0KTsKK1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldEZ1bGxOYW1lKCkgY29uc3QgeworICByZXR1cm4gRlBERl9HZXRGdWxsTmFtZShtX3BEaWN0LkdldCgpKTsKIH0KIAogYm9vbCBDUERGX0Zvcm1GaWVsZDo6UmVzZXRGaWVsZChib29sIGJOb3RpZnkpIHsKQEAgLTE3NiwxMyArMTc3LDEzIEBACiAgICAgICAgICAgICBDaGVja0NvbnRyb2woaSwgR2V0Q29udHJvbChpKS0+SXNEZWZhdWx0Q2hlY2tlZCgpLCBmYWxzZSk7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkpCi0gICAgICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyQ2hlY2tlZFN0YXR1c0NoYW5nZSh0aGlzKTsKKyAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPkdldEZvcm1Ob3RpZnkoKSkKKyAgICAgICAgbV9wRm9ybS0+R2V0Rm9ybU5vdGlmeSgpLT5BZnRlckNoZWNrZWRTdGF0dXNDaGFuZ2UodGhpcyk7CiAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBDUERGX0Zvcm1GaWVsZDo6Q29tYm9Cb3g6CiAgICAgY2FzZSBDUERGX0Zvcm1GaWVsZDo6TGlzdEJveDogewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZTsKKyAgICAgIFdpZGVTdHJpbmcgY3NWYWx1ZTsKICAgICAgIENsZWFyU2VsZWN0aW9uKCk7CiAgICAgICBpbnQgaUluZGV4ID0gR2V0RGVmYXVsdFNlbGVjdGVkSXRlbSgpOwogICAgICAgaWYgKGlJbmRleCA+PSAwKQpAQCAtMjAwLDE3ICsyMDEsMTcgQEAKICAgICBjYXNlIENQREZfRm9ybUZpZWxkOjpSaWNoVGV4dDoKICAgICBjYXNlIENQREZfRm9ybUZpZWxkOjpGaWxlOgogICAgIGRlZmF1bHQ6IHsKLSAgICAgIENQREZfT2JqZWN0KiBwRFYgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiRFYiKTsKLSAgICAgIENGWF9XaWRlU3RyaW5nIGNzRFZhbHVlOworICAgICAgQ1BERl9PYmplY3QqIHBEViA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QuR2V0KCksICJEViIpOworICAgICAgV2lkZVN0cmluZyBjc0RWYWx1ZTsKICAgICAgIGlmIChwRFYpCiAgICAgICAgIGNzRFZhbHVlID0gcERWLT5HZXRVbmljb2RlVGV4dCgpOwogCi0gICAgICBDUERGX09iamVjdCogcFYgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiViIpOwotICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZTsKKyAgICAgIENQREZfT2JqZWN0KiBwViA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QuR2V0KCksICJWIik7CisgICAgICBXaWRlU3RyaW5nIGNzVmFsdWU7CiAgICAgICBpZiAocFYpCiAgICAgICAgIGNzVmFsdWUgPSBwVi0+R2V0VW5pY29kZVRleHQoKTsKIAotICAgICAgQ1BERl9PYmplY3QqIHBSViA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJSViIpOworICAgICAgQ1BERl9PYmplY3QqIHBSViA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QuR2V0KCksICJSViIpOwogICAgICAgaWYgKCFwUlYgJiYgKGNzRFZhbHVlID09IGNzVmFsdWUpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKQEAgLTI0NSw3NCArMjQ2LDczIEBACiAgIHJldHVybiBpdCAhPSBtX0NvbnRyb2xMaXN0LmVuZCgpID8gaXQgLSBtX0NvbnRyb2xMaXN0LmJlZ2luKCkgOiAtMTsKIH0KIAotaW50IENQREZfRm9ybUZpZWxkOjpHZXRGaWVsZFR5cGUoKSBjb25zdCB7CitGb3JtRmllbGRUeXBlIENQREZfRm9ybUZpZWxkOjpHZXRGaWVsZFR5cGUoKSBjb25zdCB7CiAgIHN3aXRjaCAobV9UeXBlKSB7CiAgICAgY2FzZSBQdXNoQnV0dG9uOgotICAgICAgcmV0dXJuIEZJRUxEVFlQRV9QVVNIQlVUVE9OOworICAgICAgcmV0dXJuIEZvcm1GaWVsZFR5cGU6OmtQdXNoQnV0dG9uOwogICAgIGNhc2UgQ2hlY2tCb3g6Ci0gICAgICByZXR1cm4gRklFTERUWVBFX0NIRUNLQk9YOworICAgICAgcmV0dXJuIEZvcm1GaWVsZFR5cGU6OmtDaGVja0JveDsKICAgICBjYXNlIFJhZGlvQnV0dG9uOgotICAgICAgcmV0dXJuIEZJRUxEVFlQRV9SQURJT0JVVFRPTjsKKyAgICAgIHJldHVybiBGb3JtRmllbGRUeXBlOjprUmFkaW9CdXR0b247CiAgICAgY2FzZSBDb21ib0JveDoKLSAgICAgIHJldHVybiBGSUVMRFRZUEVfQ09NQk9CT1g7CisgICAgICByZXR1cm4gRm9ybUZpZWxkVHlwZTo6a0NvbWJvQm94OwogICAgIGNhc2UgTGlzdEJveDoKLSAgICAgIHJldHVybiBGSUVMRFRZUEVfTElTVEJPWDsKKyAgICAgIHJldHVybiBGb3JtRmllbGRUeXBlOjprTGlzdEJveDsKICAgICBjYXNlIFRleHQ6CiAgICAgY2FzZSBSaWNoVGV4dDoKICAgICBjYXNlIEZpbGU6Ci0gICAgICByZXR1cm4gRklFTERUWVBFX1RFWFRGSUVMRDsKKyAgICAgIHJldHVybiBGb3JtRmllbGRUeXBlOjprVGV4dEZpZWxkOwogICAgIGNhc2UgU2lnbjoKLSAgICAgIHJldHVybiBGSUVMRFRZUEVfU0lHTkFUVVJFOworICAgICAgcmV0dXJuIEZvcm1GaWVsZFR5cGU6OmtTaWduYXR1cmU7CiAgICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIEZvcm1GaWVsZFR5cGU6OmtVbmtub3duOwogICB9Ci0gIHJldHVybiBGSUVMRFRZUEVfVU5LTk9XTjsKIH0KIAogQ1BERl9BQWN0aW9uIENQREZfRm9ybUZpZWxkOjpHZXRBZGRpdGlvbmFsQWN0aW9uKCkgY29uc3QgewotICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJBQSIpOworICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QuR2V0KCksICJBQSIpOwogICByZXR1cm4gQ1BERl9BQWN0aW9uKHBPYmogPyBwT2JqLT5HZXREaWN0KCkgOiBudWxscHRyKTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldEFsdGVybmF0ZU5hbWUoKSBjb25zdCB7Ci0gIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlRVIik7CitXaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXRBbHRlcm5hdGVOYW1lKCkgY29uc3QgeworICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QuR2V0KCksICJUVSIpOwogICByZXR1cm4gcE9iaiA/IHBPYmotPkdldFVuaWNvZGVUZXh0KCkgOiBMIiI7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXRNYXBwaW5nTmFtZSgpIGNvbnN0IHsKLSAgQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiVE0iKTsKK1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldE1hcHBpbmdOYW1lKCkgY29uc3QgeworICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QuR2V0KCksICJUTSIpOwogICByZXR1cm4gcE9iaiA/IHBPYmotPkdldFVuaWNvZGVUZXh0KCkgOiBMIiI7CiB9CiAKIHVpbnQzMl90IENQREZfRm9ybUZpZWxkOjpHZXRGaWVsZEZsYWdzKCkgY29uc3QgewotICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJGZiIpOworICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QuR2V0KCksICJGZiIpOwogICByZXR1cm4gcE9iaiA/IHBPYmotPkdldEludGVnZXIoKSA6IDA7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXREZWZhdWx0U3R5bGUoKSBjb25zdCB7Ci0gIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkRTIik7CitCeXRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXREZWZhdWx0U3R5bGUoKSBjb25zdCB7CisgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdC5HZXQoKSwgIkRTIik7CiAgIHJldHVybiBwT2JqID8gcE9iai0+R2V0U3RyaW5nKCkgOiAiIjsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldFJpY2hUZXh0U3RyaW5nKCkgY29uc3QgewotICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJSViIpOworV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0UmljaFRleHRTdHJpbmcoKSBjb25zdCB7CisgIENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdC5HZXQoKSwgIlJWIik7CiAgIHJldHVybiBwT2JqID8gcE9iai0+R2V0VW5pY29kZVRleHQoKSA6IEwiIjsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldFZhbHVlKGJvb2wgYkRlZmF1bHQpIGNvbnN0IHsKK1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldFZhbHVlKGJvb2wgYkRlZmF1bHQpIGNvbnN0IHsKICAgaWYgKEdldFR5cGUoKSA9PSBDaGVja0JveCB8fCBHZXRUeXBlKCkgPT0gUmFkaW9CdXR0b24pCiAgICAgcmV0dXJuIEdldENoZWNrVmFsdWUoYkRlZmF1bHQpOwogCi0gIENQREZfT2JqZWN0KiBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCBiRGVmYXVsdCA/ICJEViIgOiAiViIpOworICBDUERGX09iamVjdCogcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdC5HZXQoKSwgYkRlZmF1bHQgPyAiRFYiIDogIlYiKTsKICAgaWYgKCFwVmFsdWUpIHsKICAgICBpZiAoIWJEZWZhdWx0KSB7CiAgICAgICBpZiAobV9UeXBlID09IFJpY2hUZXh0KQotICAgICAgICBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiViIpOworICAgICAgICBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LkdldCgpLCAiViIpOwogICAgICAgaWYgKCFwVmFsdWUgJiYgbV9UeXBlICE9IFRleHQpCi0gICAgICAgIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJEViIpOworICAgICAgICBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LkdldCgpLCAiRFYiKTsKICAgICB9CiAgICAgaWYgKCFwVmFsdWUpCi0gICAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CiAgIH0KIAogICBzd2l0Y2ggKHBWYWx1ZS0+R2V0VHlwZSgpKSB7CkBAIC0zMjcsMTggKzMyNywxOCBAQAogICAgIGRlZmF1bHQ6CiAgICAgICBicmVhazsKICAgfQotICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldFZhbHVlKCkgY29uc3QgeworV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0VmFsdWUoKSBjb25zdCB7CiAgIHJldHVybiBHZXRWYWx1ZShmYWxzZSk7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXREZWZhdWx0VmFsdWUoKSBjb25zdCB7CitXaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXREZWZhdWx0VmFsdWUoKSBjb25zdCB7CiAgIHJldHVybiBHZXRWYWx1ZSh0cnVlKTsKIH0KIAotYm9vbCBDUERGX0Zvcm1GaWVsZDo6U2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLAorYm9vbCBDUERGX0Zvcm1GaWVsZDo6U2V0VmFsdWUoY29uc3QgV2lkZVN0cmluZyYgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJEZWZhdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5KSB7CiAgIHN3aXRjaCAobV9UeXBlKSB7CkBAIC0zNTEsMTQgKzM1MSwxNCBAQAogICAgIGNhc2UgUmljaFRleHQ6CiAgICAgY2FzZSBUZXh0OgogICAgIGNhc2UgQ29tYm9Cb3g6IHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIGNzVmFsdWUgPSB2YWx1ZTsKKyAgICAgIFdpZGVTdHJpbmcgY3NWYWx1ZSA9IHZhbHVlOwogICAgICAgaWYgKGJOb3RpZnkgJiYgIU5vdGlmeUJlZm9yZVZhbHVlQ2hhbmdlKGNzVmFsdWUpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgIENGWF9CeXRlU3RyaW5nIGtleShiRGVmYXVsdCA/ICJEViIgOiAiViIpOworICAgICAgQnl0ZVN0cmluZyBrZXkoYkRlZmF1bHQgPyAiRFYiIDogIlYiKTsKICAgICAgIGludCBpSW5kZXggPSBGaW5kT3B0aW9uVmFsdWUoY3NWYWx1ZSk7CiAgICAgICBpZiAoaUluZGV4IDwgMCkgewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0VuY29kZVRleHQgPSBQREZfRW5jb2RlVGV4dChjc1ZhbHVlKTsKKyAgICAgICAgQnl0ZVN0cmluZyBic0VuY29kZVRleHQgPSBQREZfRW5jb2RlVGV4dChjc1ZhbHVlKTsKICAgICAgICAgbV9wRGljdC0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPihrZXksIGJzRW5jb2RlVGV4dCwgZmFsc2UpOwogICAgICAgICBpZiAobV9UeXBlID09IFJpY2hUZXh0ICYmICFiRGVmYXVsdCkKICAgICAgICAgICBtX3BEaWN0LT5TZXROZXdGb3I8Q1BERl9TdHJpbmc+KCJSViIsIGJzRW5jb2RlVGV4dCwgZmFsc2UpOwpAQCAtMzk5LDE4ICszOTksMTggQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQ1BERl9Gb3JtRmllbGQ6OlNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwgYm9vbCBiTm90aWZ5KSB7Citib29sIENQREZfRm9ybUZpZWxkOjpTZXRWYWx1ZShjb25zdCBXaWRlU3RyaW5nJiB2YWx1ZSwgYm9vbCBiTm90aWZ5KSB7CiAgIHJldHVybiBTZXRWYWx1ZSh2YWx1ZSwgZmFsc2UsIGJOb3RpZnkpOwogfQogCiBpbnQgQ1BERl9Gb3JtRmllbGQ6OkdldE1heExlbigpIGNvbnN0IHsKLSAgaWYgKENQREZfT2JqZWN0KiBwT2JqID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIk1heExlbiIpKQorICBpZiAoQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LkdldCgpLCAiTWF4TGVuIikpCiAgICAgcmV0dXJuIHBPYmotPkdldEludGVnZXIoKTsKIAotICBmb3IgKGNvbnN0IGF1dG8mIHBDb250cm9sIDogbV9Db250cm9sTGlzdCkgeworICBmb3IgKGF1dG8mIHBDb250cm9sIDogbV9Db250cm9sTGlzdCkgewogICAgIGlmICghcENvbnRyb2wpCiAgICAgICBjb250aW51ZTsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBXaWRnZXREaWN0ID0gcENvbnRyb2wtPm1fcFdpZGdldERpY3Q7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwV2lkZ2V0RGljdCA9IHBDb250cm9sLT5HZXRXaWRnZXQoKTsKICAgICBpZiAocFdpZGdldERpY3QtPktleUV4aXN0KCJNYXhMZW4iKSkKICAgICAgIHJldHVybiBwV2lkZ2V0RGljdC0+R2V0SW50ZWdlckZvcigiTWF4TGVuIik7CiAgIH0KQEAgLTQxOCw5ICs0MTgsOSBAQAogfQogCiBpbnQgQ1BERl9Gb3JtRmllbGQ6OkNvdW50U2VsZWN0ZWRJdGVtcygpIGNvbnN0IHsKLSAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJWIik7CisgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LkdldCgpLCAiViIpOwogICBpZiAoIXBWYWx1ZSkgewotICAgIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJJIik7CisgICAgcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdC5HZXQoKSwgIkkiKTsKICAgICBpZiAoIXBWYWx1ZSkKICAgICAgIHJldHVybiAwOwogICB9CkBAIC00MzMsMTYgKzQzMywxNiBAQAogfQogCiBpbnQgQ1BERl9Gb3JtRmllbGQ6OkdldFNlbGVjdGVkSW5kZXgoaW50IGluZGV4KSBjb25zdCB7Ci0gIENQREZfT2JqZWN0KiBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiViIpOworICBDUERGX09iamVjdCogcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdC5HZXQoKSwgIlYiKTsKICAgaWYgKCFwVmFsdWUpIHsKLSAgICBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiSSIpOworICAgIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QuR2V0KCksICJJIik7CiAgICAgaWYgKCFwVmFsdWUpCiAgICAgICByZXR1cm4gLTE7CiAgIH0KICAgaWYgKHBWYWx1ZS0+SXNOdW1iZXIoKSkKICAgICByZXR1cm4gcFZhbHVlLT5HZXRJbnRlZ2VyKCk7CiAKLSAgQ0ZYX1dpZGVTdHJpbmcgc2VsX3ZhbHVlOworICBXaWRlU3RyaW5nIHNlbF92YWx1ZTsKICAgaWYgKHBWYWx1ZS0+SXNTdHJpbmcoKSkgewogICAgIGlmIChpbmRleCAhPSAwKQogICAgICAgcmV0dXJuIC0xOwpAQCAtNDUzLDEyICs0NTMsMTEgQEAKICAgICAgIHJldHVybiAtMTsKIAogICAgIENQREZfT2JqZWN0KiBlbGVtZW50VmFsdWUgPSBwQXJyYXktPkdldERpcmVjdE9iamVjdEF0KGluZGV4KTsKLSAgICBzZWxfdmFsdWUgPQotICAgICAgICBlbGVtZW50VmFsdWUgPyBlbGVtZW50VmFsdWUtPkdldFVuaWNvZGVUZXh0KCkgOiBDRlhfV2lkZVN0cmluZygpOworICAgIHNlbF92YWx1ZSA9IGVsZW1lbnRWYWx1ZSA/IGVsZW1lbnRWYWx1ZS0+R2V0VW5pY29kZVRleHQoKSA6IFdpZGVTdHJpbmcoKTsKICAgfQogICBpZiAoaW5kZXggPCBDb3VudFNlbGVjdGVkT3B0aW9ucygpKSB7CiAgICAgaW50IGlPcHRJbmRleCA9IEdldFNlbGVjdGVkT3B0aW9uSW5kZXgoaW5kZXgpOwotICAgIENGWF9XaWRlU3RyaW5nIGNzT3B0ID0gR2V0T3B0aW9uVmFsdWUoaU9wdEluZGV4KTsKKyAgICBXaWRlU3RyaW5nIGNzT3B0ID0gR2V0T3B0aW9uVmFsdWUoaU9wdEluZGV4KTsKICAgICBpZiAoY3NPcHQgPT0gc2VsX3ZhbHVlKQogICAgICAgcmV0dXJuIGlPcHRJbmRleDsKICAgfQpAQCAtNDcwLDggKzQ2OSw4IEBACiB9CiAKIGJvb2wgQ1BERl9Gb3JtRmllbGQ6OkNsZWFyU2VsZWN0aW9uKGJvb2wgYk5vdGlmeSkgewotICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5KSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZTsKKyAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+R2V0Rm9ybU5vdGlmeSgpKSB7CisgICAgV2lkZVN0cmluZyBjc1ZhbHVlOwogICAgIGludCBpSW5kZXggPSBHZXRTZWxlY3RlZEluZGV4KDApOwogICAgIGlmIChpSW5kZXggPj0gMCkKICAgICAgIGNzVmFsdWUgPSBHZXRPcHRpb25MYWJlbChpSW5kZXgpOwpAQCAtNDkzLDEwICs0OTIsMTAgQEAKICAgaWYgKElzT3B0aW9uU2VsZWN0ZWQoaW5kZXgpKQogICAgIHJldHVybiB0cnVlOwogCi0gIENGWF9XaWRlU3RyaW5nIG9wdF92YWx1ZSA9IEdldE9wdGlvblZhbHVlKGluZGV4KTsKLSAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJWIik7CisgIFdpZGVTdHJpbmcgb3B0X3ZhbHVlID0gR2V0T3B0aW9uVmFsdWUoaW5kZXgpOworICBDUERGX09iamVjdCogcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdC5HZXQoKSwgIlYiKTsKICAgaWYgKCFwVmFsdWUpIHsKLSAgICBwVmFsdWUgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiSSIpOworICAgIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QuR2V0KCksICJJIik7CiAgICAgaWYgKCFwVmFsdWUpCiAgICAgICByZXR1cm4gZmFsc2U7CiAgIH0KQEAgLTUzNCw3ICs1MzMsNyBAQAogICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IENvdW50T3B0aW9ucygpKQogICAgIHJldHVybiBmYWxzZTsKIAotICBDRlhfV2lkZVN0cmluZyBvcHRfdmFsdWUgPSBHZXRPcHRpb25WYWx1ZShpbmRleCk7CisgIFdpZGVTdHJpbmcgb3B0X3ZhbHVlID0gR2V0T3B0aW9uVmFsdWUoaW5kZXgpOwogICBpZiAoYk5vdGlmeSAmJiAhTm90aWZ5TGlzdE9yQ29tYm9Cb3hCZWZvcmVDaGFuZ2Uob3B0X3ZhbHVlKSkKICAgICByZXR1cm4gZmFsc2U7CiAKQEAgLTU1OCw3ICs1NTcsNyBAQAogICAgICAgcEktPkFkZE5ldzxDUERGX051bWJlcj4oaW5kZXgpOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICBDUERGX09iamVjdCogcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIlYiKTsKKyAgICBDUERGX09iamVjdCogcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdC5HZXQoKSwgIlYiKTsKICAgICBpZiAocFZhbHVlKSB7CiAgICAgICBpZiAoR2V0VHlwZSgpID09IExpc3RCb3gpIHsKICAgICAgICAgU2VsZWN0T3B0aW9uKGluZGV4LCBmYWxzZSk7CkBAIC01NjYsNyArNTY1LDcgQEAKICAgICAgICAgICBpZiAocFZhbHVlLT5HZXRVbmljb2RlVGV4dCgpID09IG9wdF92YWx1ZSkKICAgICAgICAgICAgIG1fcERpY3QtPlJlbW92ZUZvcigiViIpOwogICAgICAgICB9IGVsc2UgaWYgKHBWYWx1ZS0+SXNBcnJheSgpKSB7Ci0gICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENQREZfQXJyYXk+IHBBcnJheShuZXcgQ1BERl9BcnJheSk7CisgICAgICAgICAgYXV0byBwQXJyYXkgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9BcnJheT4oKTsKICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IENvdW50T3B0aW9ucygpOyBpKyspIHsKICAgICAgICAgICAgIGlmIChpICE9IGluZGV4ICYmIElzSXRlbVNlbGVjdGVkKGkpKSB7CiAgICAgICAgICAgICAgIG9wdF92YWx1ZSA9IEdldE9wdGlvblZhbHVlKGkpOwpAQCAtNTk3LDEwICs1OTYsMTAgQEAKIAogaW50IENQREZfRm9ybUZpZWxkOjpHZXREZWZhdWx0U2VsZWN0ZWRJdGVtKCkgY29uc3QgewogICBBU1NFUlQoR2V0VHlwZSgpID09IENvbWJvQm94IHx8IEdldFR5cGUoKSA9PSBMaXN0Qm94KTsKLSAgQ1BERl9PYmplY3QqIHBWYWx1ZSA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJEViIpOworICBDUERGX09iamVjdCogcFZhbHVlID0gRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdC5HZXQoKSwgIkRWIik7CiAgIGlmICghcFZhbHVlKQogICAgIHJldHVybiAtMTsKLSAgQ0ZYX1dpZGVTdHJpbmcgY3NEViA9IHBWYWx1ZS0+R2V0VW5pY29kZVRleHQoKTsKKyAgV2lkZVN0cmluZyBjc0RWID0gcFZhbHVlLT5HZXRVbmljb2RlVGV4dCgpOwogICBpZiAoY3NEVi5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuIC0xOwogICBmb3IgKGludCBpID0gMDsgaSA8IENvdW50T3B0aW9ucygpOyBpKyspIHsKQEAgLTYxMSwzNCArNjEwLDM0IEBACiB9CiAKIGludCBDUERGX0Zvcm1GaWVsZDo6Q291bnRPcHRpb25zKCkgY29uc3QgewotICBDUERGX0FycmF5KiBwQXJyYXkgPSBUb0FycmF5KEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJPcHQiKSk7CisgIENQREZfQXJyYXkqIHBBcnJheSA9IFRvQXJyYXkoRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdC5HZXQoKSwgIk9wdCIpKTsKICAgcmV0dXJuIHBBcnJheSA/IHBBcnJheS0+R2V0Q291bnQoKSA6IDA7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXRPcHRpb25UZXh0KGludCBpbmRleCwgaW50IHN1Yl9pbmRleCkgY29uc3QgewotICBDUERGX0FycmF5KiBwQXJyYXkgPSBUb0FycmF5KEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJPcHQiKSk7CitXaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXRPcHRpb25UZXh0KGludCBpbmRleCwgaW50IHN1Yl9pbmRleCkgY29uc3QgeworICBDUERGX0FycmF5KiBwQXJyYXkgPSBUb0FycmF5KEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QuR2V0KCksICJPcHQiKSk7CiAgIGlmICghcEFycmF5KQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CiAKICAgQ1BERl9PYmplY3QqIHBPcHRpb24gPSBwQXJyYXktPkdldERpcmVjdE9iamVjdEF0KGluZGV4KTsKICAgaWYgKCFwT3B0aW9uKQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CiAgIGlmIChDUERGX0FycmF5KiBwT3B0aW9uQXJyYXkgPSBwT3B0aW9uLT5Bc0FycmF5KCkpCiAgICAgcE9wdGlvbiA9IHBPcHRpb25BcnJheS0+R2V0RGlyZWN0T2JqZWN0QXQoc3ViX2luZGV4KTsKIAogICBDUERGX1N0cmluZyogcFN0cmluZyA9IFRvU3RyaW5nKHBPcHRpb24pOwotICByZXR1cm4gcFN0cmluZyA/IHBTdHJpbmctPkdldFVuaWNvZGVUZXh0KCkgOiBDRlhfV2lkZVN0cmluZygpOworICByZXR1cm4gcFN0cmluZyA/IHBTdHJpbmctPkdldFVuaWNvZGVUZXh0KCkgOiBXaWRlU3RyaW5nKCk7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXRPcHRpb25MYWJlbChpbnQgaW5kZXgpIGNvbnN0IHsKK1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldE9wdGlvbkxhYmVsKGludCBpbmRleCkgY29uc3QgewogICByZXR1cm4gR2V0T3B0aW9uVGV4dChpbmRleCwgMSk7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQREZfRm9ybUZpZWxkOjpHZXRPcHRpb25WYWx1ZShpbnQgaW5kZXgpIGNvbnN0IHsKK1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldE9wdGlvblZhbHVlKGludCBpbmRleCkgY29uc3QgewogICByZXR1cm4gR2V0T3B0aW9uVGV4dChpbmRleCwgMCk7CiB9CiAKLWludCBDUERGX0Zvcm1GaWVsZDo6RmluZE9wdGlvbihDRlhfV2lkZVN0cmluZyBjc09wdExhYmVsKSBjb25zdCB7CitpbnQgQ1BERl9Gb3JtRmllbGQ6OkZpbmRPcHRpb24oV2lkZVN0cmluZyBjc09wdExhYmVsKSBjb25zdCB7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ291bnRPcHRpb25zKCk7IGkrKykgewogICAgIGlmIChHZXRPcHRpb25WYWx1ZShpKSA9PSBjc09wdExhYmVsKQogICAgICAgcmV0dXJuIGk7CkBAIC02NDYsNyArNjQ1LDcgQEAKICAgcmV0dXJuIC0xOwogfQogCi1pbnQgQ1BERl9Gb3JtRmllbGQ6OkZpbmRPcHRpb25WYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NPcHRWYWx1ZSkgY29uc3QgeworaW50IENQREZfRm9ybUZpZWxkOjpGaW5kT3B0aW9uVmFsdWUoY29uc3QgV2lkZVN0cmluZyYgY3NPcHRWYWx1ZSkgY29uc3QgewogICBmb3IgKGludCBpID0gMDsgaSA8IENvdW50T3B0aW9ucygpOyBpKyspIHsKICAgICBpZiAoR2V0T3B0aW9uVmFsdWUoaSkgPT0gY3NPcHRWYWx1ZSkKICAgICAgIHJldHVybiBpOwpAQCAtNjU1LDcgKzY1NCw3IEBACiB9CiAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQotaW50IENQREZfRm9ybUZpZWxkOjpJbnNlcnRPcHRpb24oQ0ZYX1dpZGVTdHJpbmcgY3NPcHRMYWJlbCwKK2ludCBDUERGX0Zvcm1GaWVsZDo6SW5zZXJ0T3B0aW9uKFdpZGVTdHJpbmcgY3NPcHRMYWJlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk5vdGlmeSkgewogICBpZiAoY3NPcHRMYWJlbC5Jc0VtcHR5KCkpCkBAIC02NjQsOSArNjYzLDggQEAKICAgaWYgKGJOb3RpZnkgJiYgIU5vdGlmeUxpc3RPckNvbWJvQm94QmVmb3JlQ2hhbmdlKGNzT3B0TGFiZWwpKQogICAgIHJldHVybiAtMTsKIAotICBDRlhfQnl0ZVN0cmluZyBjc1N0ciA9Ci0gICAgICBQREZfRW5jb2RlVGV4dChjc09wdExhYmVsLmNfc3RyKCksIGNzT3B0TGFiZWwuR2V0TGVuZ3RoKCkpOwotICBDUERGX0FycmF5KiBwT3B0ID0gVG9BcnJheShGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiT3B0IikpOworICBCeXRlU3RyaW5nIGNzU3RyID0gUERGX0VuY29kZVRleHQoY3NPcHRMYWJlbCk7CisgIENQREZfQXJyYXkqIHBPcHQgPSBUb0FycmF5KEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QuR2V0KCksICJPcHQiKSk7CiAgIGlmICghcE9wdCkKICAgICBwT3B0ID0gbV9wRGljdC0+U2V0TmV3Rm9yPENQREZfQXJyYXk+KCJPcHQiKTsKIApAQCAtNjg0LDggKzY4Miw4IEBACiB9CiAKIGJvb2wgQ1BERl9Gb3JtRmllbGQ6OkNsZWFyT3B0aW9ucyhib29sIGJOb3RpZnkpIHsKLSAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSkgewotICAgIENGWF9XaWRlU3RyaW5nIGNzVmFsdWU7CisgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPkdldEZvcm1Ob3RpZnkoKSkgeworICAgIFdpZGVTdHJpbmcgY3NWYWx1ZTsKICAgICBpbnQgaUluZGV4ID0gR2V0U2VsZWN0ZWRJbmRleCgwKTsKICAgICBpZiAoaUluZGV4ID49IDApCiAgICAgICBjc1ZhbHVlID0gR2V0T3B0aW9uTGFiZWwoaUluZGV4KTsKQEAgLTcxNiwxNCArNzE0LDE0IEBACiAgIGlmICghYkNoZWNrZWQgJiYgcENvbnRyb2wtPklzQ2hlY2tlZCgpID09IGJDaGVja2VkKQogICAgIHJldHVybiBmYWxzZTsKIAotICBDRlhfV2lkZVN0cmluZyBjc1dFeHBvcnQgPSBwQ29udHJvbC0+R2V0RXhwb3J0VmFsdWUoKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgY3NCRXhwb3J0ID0gUERGX0VuY29kZVRleHQoY3NXRXhwb3J0KTsKKyAgV2lkZVN0cmluZyBjc1dFeHBvcnQgPSBwQ29udHJvbC0+R2V0RXhwb3J0VmFsdWUoKTsKKyAgQnl0ZVN0cmluZyBjc0JFeHBvcnQgPSBQREZfRW5jb2RlVGV4dChjc1dFeHBvcnQpOwogICBpbnQgaUNvdW50ID0gQ291bnRDb250cm9scygpOwogICBib29sIGJVbmlzb24gPSBJc1VuaXNvbih0aGlzKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgewogICAgIENQREZfRm9ybUNvbnRyb2wqIHBDdHJsID0gR2V0Q29udHJvbChpKTsKICAgICBpZiAoYlVuaXNvbikgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NFVmFsdWUgPSBwQ3RybC0+R2V0RXhwb3J0VmFsdWUoKTsKKyAgICAgIFdpZGVTdHJpbmcgY3NFVmFsdWUgPSBwQ3RybC0+R2V0RXhwb3J0VmFsdWUoKTsKICAgICAgIGlmIChjc0VWYWx1ZSA9PSBjc1dFeHBvcnQpIHsKICAgICAgICAgaWYgKHBDdHJsLT5HZXRPblN0YXRlTmFtZSgpID09IHBDb250cm9sLT5HZXRPblN0YXRlTmFtZSgpKQogICAgICAgICAgIHBDdHJsLT5DaGVja0NvbnRyb2woYkNoZWNrZWQpOwpAQCAtNzQwLDMxICs3MzgsMjkgQEAKICAgICB9CiAgIH0KIAotICBDUERGX09iamVjdCogcE9wdCA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJPcHQiKTsKKyAgQ1BERl9PYmplY3QqIHBPcHQgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LkdldCgpLCAiT3B0Iik7CiAgIGlmICghVG9BcnJheShwT3B0KSkgewogICAgIGlmIChiQ2hlY2tlZCkgewogICAgICAgbV9wRGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIlYiLCBjc0JFeHBvcnQpOwogICAgIH0gZWxzZSB7Ci0gICAgICBDRlhfQnl0ZVN0cmluZyBjc1Y7Ci0gICAgICBDUERGX09iamVjdCogcFYgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LCAiViIpOworICAgICAgQnl0ZVN0cmluZyBjc1Y7CisgICAgICBDUERGX09iamVjdCogcFYgPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LkdldCgpLCAiViIpOwogICAgICAgaWYgKHBWKQogICAgICAgICBjc1YgPSBwVi0+R2V0U3RyaW5nKCk7CiAgICAgICBpZiAoY3NWID09IGNzQkV4cG9ydCkKICAgICAgICAgbV9wRGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIlYiLCAiT2ZmIik7CiAgICAgfQogICB9IGVsc2UgaWYgKGJDaGVja2VkKSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NJbmRleDsKLSAgICBjc0luZGV4LkZvcm1hdCgiJWQiLCBpQ29udHJvbEluZGV4KTsKLSAgICBtX3BEaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiViIsIGNzSW5kZXgpOworICAgIG1fcERpY3QtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJWIiwgQnl0ZVN0cmluZzo6Rm9ybWF0KCIlZCIsIGlDb250cm9sSW5kZXgpKTsKICAgfQotICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5KQotICAgIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnktPkFmdGVyQ2hlY2tlZFN0YXR1c0NoYW5nZSh0aGlzKTsKKyAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+R2V0Rm9ybU5vdGlmeSgpKQorICAgIG1fcEZvcm0tPkdldEZvcm1Ob3RpZnkoKS0+QWZ0ZXJDaGVja2VkU3RhdHVzQ2hhbmdlKHRoaXMpOwogICByZXR1cm4gdHJ1ZTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERl9Gb3JtRmllbGQ6OkdldENoZWNrVmFsdWUoYm9vbCBiRGVmYXVsdCkgY29uc3QgeworV2lkZVN0cmluZyBDUERGX0Zvcm1GaWVsZDo6R2V0Q2hlY2tWYWx1ZShib29sIGJEZWZhdWx0KSBjb25zdCB7CiAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ2hlY2tCb3ggfHwgR2V0VHlwZSgpID09IFJhZGlvQnV0dG9uKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgY3NFeHBvcnQgPSBMIk9mZiI7CisgIFdpZGVTdHJpbmcgY3NFeHBvcnQgPSBMIk9mZiI7CiAgIGludCBpQ291bnQgPSBDb3VudENvbnRyb2xzKCk7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKICAgICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldENvbnRyb2woaSk7CkBAIC03NzgsMzcgKzc3NCwzNyBAQAogICByZXR1cm4gY3NFeHBvcnQ7CiB9CiAKLWJvb2wgQ1BERl9Gb3JtRmllbGQ6OlNldENoZWNrVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLAorYm9vbCBDUERGX0Zvcm1GaWVsZDo6U2V0Q2hlY2tWYWx1ZShjb25zdCBXaWRlU3RyaW5nJiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRGVmYXVsdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5KSB7CiAgIEFTU0VSVChHZXRUeXBlKCkgPT0gQ2hlY2tCb3ggfHwgR2V0VHlwZSgpID09IFJhZGlvQnV0dG9uKTsKICAgaW50IGlDb3VudCA9IENvdW50Q29udHJvbHMoKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgewogICAgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Q29udHJvbChpKTsKLSAgICBDRlhfV2lkZVN0cmluZyBjc0V4cG9ydCA9IHBDb250cm9sLT5HZXRFeHBvcnRWYWx1ZSgpOworICAgIFdpZGVTdHJpbmcgY3NFeHBvcnQgPSBwQ29udHJvbC0+R2V0RXhwb3J0VmFsdWUoKTsKICAgICBib29sIHZhbCA9IGNzRXhwb3J0ID09IHZhbHVlOwogICAgIGlmICghYkRlZmF1bHQpCiAgICAgICBDaGVja0NvbnRyb2woR2V0Q29udHJvbEluZGV4KHBDb250cm9sKSwgdmFsKTsKICAgICBpZiAodmFsKQogICAgICAgYnJlYWs7CiAgIH0KLSAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSkKLSAgICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlckNoZWNrZWRTdGF0dXNDaGFuZ2UodGhpcyk7CisgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPkdldEZvcm1Ob3RpZnkoKSkKKyAgICBtX3BGb3JtLT5HZXRGb3JtTm90aWZ5KCktPkFmdGVyQ2hlY2tlZFN0YXR1c0NoYW5nZSh0aGlzKTsKICAgcmV0dXJuIHRydWU7CiB9CiAKIGludCBDUERGX0Zvcm1GaWVsZDo6R2V0VG9wVmlzaWJsZUluZGV4KCkgY29uc3QgewotICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJUSSIpOworICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QuR2V0KCksICJUSSIpOwogICByZXR1cm4gcE9iaiA/IHBPYmotPkdldEludGVnZXIoKSA6IDA7CiB9CiAKIGludCBDUERGX0Zvcm1GaWVsZDo6Q291bnRTZWxlY3RlZE9wdGlvbnMoKSBjb25zdCB7Ci0gIENQREZfQXJyYXkqIHBBcnJheSA9IFRvQXJyYXkoRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkkiKSk7CisgIENQREZfQXJyYXkqIHBBcnJheSA9IFRvQXJyYXkoRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdC5HZXQoKSwgIkkiKSk7CiAgIHJldHVybiBwQXJyYXkgPyBwQXJyYXktPkdldENvdW50KCkgOiAwOwogfQogCiBpbnQgQ1BERl9Gb3JtRmllbGQ6OkdldFNlbGVjdGVkT3B0aW9uSW5kZXgoaW50IGluZGV4KSBjb25zdCB7Ci0gIENQREZfQXJyYXkqIHBBcnJheSA9IFRvQXJyYXkoRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdCwgIkkiKSk7CisgIENQREZfQXJyYXkqIHBBcnJheSA9IFRvQXJyYXkoRlBERl9HZXRGaWVsZEF0dHIobV9wRGljdC5HZXQoKSwgIkkiKSk7CiAgIGlmICghcEFycmF5KQogICAgIHJldHVybiAtMTsKIApAQCAtODE5LDcgKzgxNSw3IEBACiB9CiAKIGJvb2wgQ1BERl9Gb3JtRmllbGQ6OklzT3B0aW9uU2VsZWN0ZWQoaW50IGlPcHRJbmRleCkgY29uc3QgewotICBDUERGX0FycmF5KiBwQXJyYXkgPSBUb0FycmF5KEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJJIikpOworICBDUERGX0FycmF5KiBwQXJyYXkgPSBUb0FycmF5KEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QuR2V0KCksICJJIikpOwogICBpZiAoIXBBcnJheSkKICAgICByZXR1cm4gZmFsc2U7CiAKQEAgLTg0Niw4ICs4NDIsOCBAQAogICAgICAgaWYgKGJTZWxlY3RlZCkKICAgICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkpIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NWYWx1ZSA9IEdldE9wdGlvbkxhYmVsKGlPcHRJbmRleCk7CisgICAgICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtLT5HZXRGb3JtTm90aWZ5KCkpIHsKKyAgICAgICAgV2lkZVN0cmluZyBjc1ZhbHVlID0gR2V0T3B0aW9uTGFiZWwoaU9wdEluZGV4KTsKICAgICAgICAgaWYgKCFOb3RpZnlMaXN0T3JDb21ib0JveEJlZm9yZUNoYW5nZShjc1ZhbHVlKSkKICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICB9CkBAIC04NjAsOCArODU2LDggQEAKICAgICAgIGlmICghYlNlbGVjdGVkKQogICAgICAgICBjb250aW51ZTsKIAotICAgICAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSkgewotICAgICAgICBDRlhfV2lkZVN0cmluZyBjc1ZhbHVlID0gR2V0T3B0aW9uTGFiZWwoaU9wdEluZGV4KTsKKyAgICAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPkdldEZvcm1Ob3RpZnkoKSkgeworICAgICAgICBXaWRlU3RyaW5nIGNzVmFsdWUgPSBHZXRPcHRpb25MYWJlbChpT3B0SW5kZXgpOwogICAgICAgICBpZiAoIU5vdGlmeUxpc3RPckNvbWJvQm94QmVmb3JlQ2hhbmdlKGNzVmFsdWUpKQogICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIH0KQEAgLTg4NCw4ICs4ODAsOCBAQAogfQogCiBib29sIENQREZfRm9ybUZpZWxkOjpDbGVhclNlbGVjdGVkT3B0aW9ucyhib29sIGJOb3RpZnkpIHsKLSAgaWYgKGJOb3RpZnkgJiYgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSkgewotICAgIENGWF9XaWRlU3RyaW5nIGNzVmFsdWU7CisgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm0tPkdldEZvcm1Ob3RpZnkoKSkgeworICAgIFdpZGVTdHJpbmcgY3NWYWx1ZTsKICAgICBpbnQgaUluZGV4ID0gR2V0U2VsZWN0ZWRJbmRleCgwKTsKICAgICBpZiAoaUluZGV4ID49IDApCiAgICAgICBjc1ZhbHVlID0gR2V0T3B0aW9uTGFiZWwoaUluZGV4KTsKQEAgLTkwMSwxMiArODk3LDEyIEBACiB9CiAKIHZvaWQgQ1BERl9Gb3JtRmllbGQ6OkxvYWREQSgpIHsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QgPSBtX3BGb3JtLT5tX3BGb3JtRGljdDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QgPSBtX3BGb3JtLT5HZXRGb3JtRGljdCgpOwogICBpZiAoIXBGb3JtRGljdCkKICAgICByZXR1cm47CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgREE7Ci0gIGlmIChDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcERpY3QsICJEQSIpKQorICBCeXRlU3RyaW5nIERBOworICBpZiAoQ1BERl9PYmplY3QqIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihtX3BEaWN0LkdldCgpLCAiREEiKSkKICAgICBEQSA9IHBPYmotPkdldFN0cmluZygpOwogCiAgIGlmIChEQS5Jc0VtcHR5KCkpCkBAIC05MjMsNDMgKzkxOSw0MiBAQAogICBpZiAoIXBGb250KQogICAgIHJldHVybjsKIAotICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgoREEuQXNTdHJpbmdDKCkpOworICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgoREEuQXNTdHJpbmdWaWV3KCkpOwogICBzeW50YXguRmluZFRhZ1BhcmFtRnJvbVN0YXJ0KCJUZiIsIDIpOwotICBDRlhfQnl0ZVN0cmluZyBmb250X25hbWUoc3ludGF4LkdldFdvcmQoKSk7CisgIEJ5dGVTdHJpbmcgZm9udF9uYW1lKHN5bnRheC5HZXRXb3JkKCkpOwogICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCA9IHBGb250LT5HZXREaWN0Rm9yKGZvbnRfbmFtZSk7CiAgIGlmICghcEZvbnREaWN0KQogICAgIHJldHVybjsKIAotICBtX3BGb250ID0gbV9wRm9ybS0+bV9wRG9jdW1lbnQtPkxvYWRGb250KHBGb250RGljdCk7CisgIG1fcEZvbnQgPSBtX3BGb3JtLT5HZXREb2N1bWVudCgpLT5Mb2FkRm9udChwRm9udERpY3QpOwogICBtX0ZvbnRTaXplID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKIH0KIAotYm9vbCBDUERGX0Zvcm1GaWVsZDo6Tm90aWZ5QmVmb3JlU2VsZWN0aW9uQ2hhbmdlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSkgewotICBpZiAoIW1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkpCitib29sIENQREZfRm9ybUZpZWxkOjpOb3RpZnlCZWZvcmVTZWxlY3Rpb25DaGFuZ2UoY29uc3QgV2lkZVN0cmluZyYgdmFsdWUpIHsKKyAgaWYgKCFtX3BGb3JtLT5HZXRGb3JtTm90aWZ5KCkpCiAgICAgcmV0dXJuIHRydWU7Ci0gIHJldHVybiBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5CZWZvcmVTZWxlY3Rpb25DaGFuZ2UodGhpcywgdmFsdWUpID49IDA7CisgIHJldHVybiBtX3BGb3JtLT5HZXRGb3JtTm90aWZ5KCktPkJlZm9yZVNlbGVjdGlvbkNoYW5nZSh0aGlzLCB2YWx1ZSkgPj0gMDsKIH0KIAogdm9pZCBDUERGX0Zvcm1GaWVsZDo6Tm90aWZ5QWZ0ZXJTZWxlY3Rpb25DaGFuZ2UoKSB7Ci0gIGlmICghbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSkKKyAgaWYgKCFtX3BGb3JtLT5HZXRGb3JtTm90aWZ5KCkpCiAgICAgcmV0dXJuOwotICBtX3BGb3JtLT5tX3BGb3JtTm90aWZ5LT5BZnRlclNlbGVjdGlvbkNoYW5nZSh0aGlzKTsKKyAgbV9wRm9ybS0+R2V0Rm9ybU5vdGlmeSgpLT5BZnRlclNlbGVjdGlvbkNoYW5nZSh0aGlzKTsKIH0KIAotYm9vbCBDUERGX0Zvcm1GaWVsZDo6Tm90aWZ5QmVmb3JlVmFsdWVDaGFuZ2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlKSB7Ci0gIGlmICghbV9wRm9ybS0+bV9wRm9ybU5vdGlmeSkKK2Jvb2wgQ1BERl9Gb3JtRmllbGQ6Ok5vdGlmeUJlZm9yZVZhbHVlQ2hhbmdlKGNvbnN0IFdpZGVTdHJpbmcmIHZhbHVlKSB7CisgIGlmICghbV9wRm9ybS0+R2V0Rm9ybU5vdGlmeSgpKQogICAgIHJldHVybiB0cnVlOwotICByZXR1cm4gbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UodGhpcywgdmFsdWUpID49IDA7CisgIHJldHVybiBtX3BGb3JtLT5HZXRGb3JtTm90aWZ5KCktPkJlZm9yZVZhbHVlQ2hhbmdlKHRoaXMsIHZhbHVlKSA+PSAwOwogfQogCiB2b2lkIENQREZfRm9ybUZpZWxkOjpOb3RpZnlBZnRlclZhbHVlQ2hhbmdlKCkgewotICBpZiAoIW1fcEZvcm0tPm1fcEZvcm1Ob3RpZnkpCisgIGlmICghbV9wRm9ybS0+R2V0Rm9ybU5vdGlmeSgpKQogICAgIHJldHVybjsKLSAgbV9wRm9ybS0+bV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZSh0aGlzKTsKKyAgbV9wRm9ybS0+R2V0Rm9ybU5vdGlmeSgpLT5BZnRlclZhbHVlQ2hhbmdlKHRoaXMpOwogfQogCi1ib29sIENQREZfRm9ybUZpZWxkOjpOb3RpZnlMaXN0T3JDb21ib0JveEJlZm9yZUNoYW5nZSgKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUpIHsKK2Jvb2wgQ1BERl9Gb3JtRmllbGQ6Ok5vdGlmeUxpc3RPckNvbWJvQm94QmVmb3JlQ2hhbmdlKGNvbnN0IFdpZGVTdHJpbmcmIHZhbHVlKSB7CiAgIHN3aXRjaCAoR2V0VHlwZSgpKSB7CiAgICAgY2FzZSBMaXN0Qm94OgogICAgICAgcmV0dXJuIE5vdGlmeUJlZm9yZVNlbGVjdGlvbkNoYW5nZSh2YWx1ZSk7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3BkZl9mb3JtZmllbGQuaCBiL2NvcmUvZnBkZmRvYy9jcGRmX2Zvcm1maWVsZC5oCmluZGV4IDQyNjA4YjEuLjRmMjU0NjUgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jcGRmX2Zvcm1maWVsZC5oCisrKyBiL2NvcmUvZnBkZmRvYy9jcGRmX2Zvcm1maWVsZC5oCkBAIC03LDIzICs3LDY3IEBACiAjaWZuZGVmIENPUkVfRlBERkRPQ19DUERGX0ZPUk1GSUVMRF9IXwogI2RlZmluZSBDT1JFX0ZQREZET0NfQ1BERl9GT1JNRklFTERfSF8KIAorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2FhY3Rpb24uaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9mb3JtZmllbGQuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCiAKLSNkZWZpbmUgRklFTERUWVBFX1VOS05PV04gMAotI2RlZmluZSBGSUVMRFRZUEVfUFVTSEJVVFRPTiAxCi0jZGVmaW5lIEZJRUxEVFlQRV9DSEVDS0JPWCAyCi0jZGVmaW5lIEZJRUxEVFlQRV9SQURJT0JVVFRPTiAzCi0jZGVmaW5lIEZJRUxEVFlQRV9DT01CT0JPWCA0Ci0jZGVmaW5lIEZJRUxEVFlQRV9MSVNUQk9YIDUKLSNkZWZpbmUgRklFTERUWVBFX1RFWFRGSUVMRCA2Ci0jZGVmaW5lIEZJRUxEVFlQRV9TSUdOQVRVUkUgNworZW51bSBjbGFzcyBGb3JtRmllbGRUeXBlIDogdWludDhfdCB7CisgIGtVbmtub3duID0gMCwKKyAga1B1c2hCdXR0b24gPSAxLAorICBrQ2hlY2tCb3ggPSAyLAorICBrUmFkaW9CdXR0b24gPSAzLAorICBrQ29tYm9Cb3ggPSA0LAorICBrTGlzdEJveCA9IDUsCisgIGtUZXh0RmllbGQgPSA2LAorICBrU2lnbmF0dXJlID0gNywKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBrWEZBID0gOCwgIC8vIEdlbmVyaWMgWEZBIGZpZWxkLCBzaG91bGQgdXNlIHZhbHVlIGJlbG93IGlmIHBvc3NpYmxlLgorICBrWEZBX0NoZWNrQm94ID0gOSwKKyAga1hGQV9Db21ib0JveCA9IDEwLAorICBrWEZBX0ltYWdlRmllbGQgPSAxMSwKKyAga1hGQV9MaXN0Qm94ID0gMTIsCisgIGtYRkFfUHVzaEJ1dHRvbiA9IDEzLAorICBrWEZBX1NpZ25hdHVyZSA9IDE0LAorICBrWEZBX1RleHRGaWVsZCA9IDE1CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCit9OworCitPcHRpb25hbDxGb3JtRmllbGRUeXBlPiBJbnRUb0Zvcm1GaWVsZFR5cGUoaW50IHZhbHVlKTsKKworLy8gSWYgdmFsdWVzIGFyZSBhZGRlZCB0byBGb3JtRmllbGRUeXBlLCB0aGVzZSB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZC4KKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorY29uc3RleHByIHNpemVfdCBrRm9ybUZpZWxkVHlwZUNvdW50ID0gMTY7CisjZWxzZQorY29uc3RleHByIHNpemVfdCBrRm9ybUZpZWxkVHlwZUNvdW50ID0gODsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworY29uc3RleHByIEZvcm1GaWVsZFR5cGUga0Zvcm1GaWVsZFR5cGVzW2tGb3JtRmllbGRUeXBlQ291bnRdID0geworICAgIEZvcm1GaWVsZFR5cGU6OmtVbmtub3duLAorICAgIEZvcm1GaWVsZFR5cGU6OmtQdXNoQnV0dG9uLAorICAgIEZvcm1GaWVsZFR5cGU6OmtDaGVja0JveCwKKyAgICBGb3JtRmllbGRUeXBlOjprUmFkaW9CdXR0b24sCisgICAgRm9ybUZpZWxkVHlwZTo6a0NvbWJvQm94LAorICAgIEZvcm1GaWVsZFR5cGU6OmtMaXN0Qm94LAorICAgIEZvcm1GaWVsZFR5cGU6OmtUZXh0RmllbGQsCisgICAgRm9ybUZpZWxkVHlwZTo6a1NpZ25hdHVyZSwKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICAgIEZvcm1GaWVsZFR5cGU6OmtYRkEsCisgICAgRm9ybUZpZWxkVHlwZTo6a1hGQV9DaGVja0JveCwKKyAgICBGb3JtRmllbGRUeXBlOjprWEZBX0NvbWJvQm94LAorICAgIEZvcm1GaWVsZFR5cGU6OmtYRkFfSW1hZ2VGaWVsZCwKKyAgICBGb3JtRmllbGRUeXBlOjprWEZBX0xpc3RCb3gsCisgICAgRm9ybUZpZWxkVHlwZTo6a1hGQV9QdXNoQnV0dG9uLAorICAgIEZvcm1GaWVsZFR5cGU6OmtYRkFfU2lnbmF0dXJlLAorICAgIEZvcm1GaWVsZFR5cGU6OmtYRkFfVGV4dEZpZWxkCisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCit9OwogCiAjZGVmaW5lIEZPUk1GTEFHX1JFQURPTkxZIDB4MDEKICNkZWZpbmUgRk9STUZMQUdfUkVRVUlSRUQgMHgwMgpAQCAtMzUsMTAgKzc5LDEwIEBACiBjbGFzcyBDUERGX0ludGVyRm9ybTsKIGNsYXNzIENQREZfU3RyaW5nOwogCi1DUERGX09iamVjdCogRlBERl9HZXRGaWVsZEF0dHIoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIG5hbWUsCitDUERGX09iamVjdCogRlBERl9HZXRGaWVsZEF0dHIoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5MZXZlbCA9IDApOwotQ0ZYX1dpZGVTdHJpbmcgRlBERl9HZXRGdWxsTmFtZShDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpOworV2lkZVN0cmluZyBGUERGX0dldEZ1bGxOYW1lKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCk7CiAKIGNsYXNzIENQREZfRm9ybUZpZWxkIHsKICBwdWJsaWM6CkBAIC01NSwxMiArOTksMTUgQEAKICAgICBTaWduCiAgIH07CiAKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0RnVsbE5hbWUoKSBjb25zdDsKKyAgQ1BERl9Gb3JtRmllbGQoQ1BERl9JbnRlckZvcm0qIHBGb3JtLCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKKyAgfkNQREZfRm9ybUZpZWxkKCk7CisKKyAgV2lkZVN0cmluZyBHZXRGdWxsTmFtZSgpIGNvbnN0OwogCiAgIFR5cGUgR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fVHlwZTsgfQogICB1aW50MzJfdCBHZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIG1fRmxhZ3M7IH0KIAotICBDUERGX0RpY3Rpb25hcnkqIEdldEZpZWxkRGljdCgpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3Q7IH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRGaWVsZERpY3QoKSBjb25zdCB7IHJldHVybiBtX3BEaWN0LkdldCgpOyB9CiAgIHZvaWQgU2V0RmllbGREaWN0KENQREZfRGljdGlvbmFyeSogcERpY3QpIHsgbV9wRGljdCA9IHBEaWN0OyB9CiAKICAgYm9vbCBSZXNldEZpZWxkKGJvb2wgYk5vdGlmeSA9IGZhbHNlKTsKQEAgLTY5LDIyICsxMTYsMjQgQEAKICAgICByZXR1cm4gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQ+KG1fQ29udHJvbExpc3QpOwogICB9CiAKLSAgQ1BERl9Gb3JtQ29udHJvbCogR2V0Q29udHJvbChpbnQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fQ29udHJvbExpc3RbaW5kZXhdOyB9CisgIENQREZfRm9ybUNvbnRyb2wqIEdldENvbnRyb2woaW50IGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1fQ29udHJvbExpc3RbaW5kZXhdLkdldCgpOworICB9CiAKICAgaW50IEdldENvbnRyb2xJbmRleChjb25zdCBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCkgY29uc3Q7Ci0gIGludCBHZXRGaWVsZFR5cGUoKSBjb25zdDsKKyAgRm9ybUZpZWxkVHlwZSBHZXRGaWVsZFR5cGUoKSBjb25zdDsKIAogICBDUERGX0FBY3Rpb24gR2V0QWRkaXRpb25hbEFjdGlvbigpIGNvbnN0OwotICBDRlhfV2lkZVN0cmluZyBHZXRBbHRlcm5hdGVOYW1lKCkgY29uc3Q7Ci0gIENGWF9XaWRlU3RyaW5nIEdldE1hcHBpbmdOYW1lKCkgY29uc3Q7CisgIFdpZGVTdHJpbmcgR2V0QWx0ZXJuYXRlTmFtZSgpIGNvbnN0OworICBXaWRlU3RyaW5nIEdldE1hcHBpbmdOYW1lKCkgY29uc3Q7CiAKICAgdWludDMyX3QgR2V0RmllbGRGbGFncygpIGNvbnN0OwotICBDRlhfQnl0ZVN0cmluZyBHZXREZWZhdWx0U3R5bGUoKSBjb25zdDsKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0UmljaFRleHRTdHJpbmcoKSBjb25zdDsKKyAgQnl0ZVN0cmluZyBHZXREZWZhdWx0U3R5bGUoKSBjb25zdDsKKyAgV2lkZVN0cmluZyBHZXRSaWNoVGV4dFN0cmluZygpIGNvbnN0OwogCi0gIENGWF9XaWRlU3RyaW5nIEdldFZhbHVlKCkgY29uc3Q7Ci0gIENGWF9XaWRlU3RyaW5nIEdldERlZmF1bHRWYWx1ZSgpIGNvbnN0OwotICBib29sIFNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwgYm9vbCBiTm90aWZ5ID0gZmFsc2UpOworICBXaWRlU3RyaW5nIEdldFZhbHVlKCkgY29uc3Q7CisgIFdpZGVTdHJpbmcgR2V0RGVmYXVsdFZhbHVlKCkgY29uc3Q7CisgIGJvb2wgU2V0VmFsdWUoY29uc3QgV2lkZVN0cmluZyYgdmFsdWUsIGJvb2wgYk5vdGlmeSA9IGZhbHNlKTsKIAogICBpbnQgR2V0TWF4TGVuKCkgY29uc3Q7CiAgIGludCBDb3VudFNlbGVjdGVkSXRlbXMoKSBjb25zdDsKQEAgLTk5LDExICsxNDgsMTEgQEAKICAgaW50IEdldERlZmF1bHRTZWxlY3RlZEl0ZW0oKSBjb25zdDsKICAgaW50IENvdW50T3B0aW9ucygpIGNvbnN0OwogCi0gIENGWF9XaWRlU3RyaW5nIEdldE9wdGlvbkxhYmVsKGludCBpbmRleCkgY29uc3Q7Ci0gIENGWF9XaWRlU3RyaW5nIEdldE9wdGlvblZhbHVlKGludCBpbmRleCkgY29uc3Q7CisgIFdpZGVTdHJpbmcgR2V0T3B0aW9uTGFiZWwoaW50IGluZGV4KSBjb25zdDsKKyAgV2lkZVN0cmluZyBHZXRPcHRpb25WYWx1ZShpbnQgaW5kZXgpIGNvbnN0OwogCi0gIGludCBGaW5kT3B0aW9uKENGWF9XaWRlU3RyaW5nIGNzT3B0TGFiZWwpIGNvbnN0OwotICBpbnQgRmluZE9wdGlvblZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc09wdFZhbHVlKSBjb25zdDsKKyAgaW50IEZpbmRPcHRpb24oV2lkZVN0cmluZyBjc09wdExhYmVsKSBjb25zdDsKKyAgaW50IEZpbmRPcHRpb25WYWx1ZShjb25zdCBXaWRlU3RyaW5nJiBjc09wdFZhbHVlKSBjb25zdDsKIAogICBib29sIENoZWNrQ29udHJvbChpbnQgaUNvbnRyb2xJbmRleCwgYm9vbCBiQ2hlY2tlZCwgYm9vbCBiTm90aWZ5ID0gZmFsc2UpOwogCkBAIC0xMjAsNDggKzE2OSw1MyBAQAogI2lmZGVmIFBERl9FTkFCTEVfWEZBCiAgIGJvb2wgQ2xlYXJPcHRpb25zKGJvb2wgYk5vdGlmeSA9IGZhbHNlKTsKIAotICBpbnQgSW5zZXJ0T3B0aW9uKENGWF9XaWRlU3RyaW5nIGNzT3B0TGFiZWwsCi0gICAgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gLTEsCi0gICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5ID0gZmFsc2UpOworICBpbnQgSW5zZXJ0T3B0aW9uKFdpZGVTdHJpbmcgY3NPcHRMYWJlbCwgaW50IGluZGV4ID0gLTEsIGJvb2wgYk5vdGlmeSA9IGZhbHNlKTsKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotICBGWF9GTE9BVCBHZXRGb250U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fRm9udFNpemU7IH0KLSAgQ1BERl9Gb250KiBHZXRGb250KCkgY29uc3QgeyByZXR1cm4gbV9wRm9udDsgfQorICBmbG9hdCBHZXRGb250U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fRm9udFNpemU7IH0KKyAgQ1BERl9Gb250KiBHZXRGb250KCkgY29uc3QgeyByZXR1cm4gbV9wRm9udC5HZXQoKTsgfQorCisgIGNvbnN0IENQREZfRGljdGlvbmFyeSogR2V0RGljdCgpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3QuR2V0KCk7IH0KKyAgY29uc3QgQ1BERl9JbnRlckZvcm0qIEdldEZvcm0oKSBjb25zdCB7IHJldHVybiBtX3BGb3JtLkdldCgpOyB9CisKKyAgV2lkZVN0cmluZyBHZXRDaGVja1ZhbHVlKGJvb2wgYkRlZmF1bHQpIGNvbnN0OworCisgIHZvaWQgQWRkRm9ybUNvbnRyb2woQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sKSB7CisgICAgbV9Db250cm9sTGlzdC5lbXBsYWNlX2JhY2socEZvcm1Db250cm9sKTsKKyAgfQorCisgIHZvaWQgU2V0T3B0KHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gcE9wdCkgeworICAgIG1fcERpY3QtPlNldEZvcigiT3B0Iiwgc3RkOjptb3ZlKHBPcHQpKTsKKyAgfQogCiAgcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIENQREZfSW50ZXJGb3JtOwotICBmcmllbmQgY2xhc3MgQ1BERl9Gb3JtQ29udHJvbDsKLQotICBDUERGX0Zvcm1GaWVsZChDUERGX0ludGVyRm9ybSogcEZvcm0sIENQREZfRGljdGlvbmFyeSogcERpY3QpOwotICB+Q1BERl9Gb3JtRmllbGQoKTsKLQotICBDRlhfV2lkZVN0cmluZyBHZXRWYWx1ZShib29sIGJEZWZhdWx0KSBjb25zdDsKLSAgYm9vbCBTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsIGJvb2wgYkRlZmF1bHQsIGJvb2wgYk5vdGlmeSk7CisgIFdpZGVTdHJpbmcgR2V0VmFsdWUoYm9vbCBiRGVmYXVsdCkgY29uc3Q7CisgIGJvb2wgU2V0VmFsdWUoY29uc3QgV2lkZVN0cmluZyYgdmFsdWUsIGJvb2wgYkRlZmF1bHQsIGJvb2wgYk5vdGlmeSk7CiAKICAgdm9pZCBTeW5jRmllbGRGbGFncygpOwogICBpbnQgRmluZExpc3RTZWwoQ1BERl9TdHJpbmcqIHN0cik7Ci0gIENGWF9XaWRlU3RyaW5nIEdldE9wdGlvblRleHQoaW50IGluZGV4LCBpbnQgc3ViX2luZGV4KSBjb25zdDsKKyAgV2lkZVN0cmluZyBHZXRPcHRpb25UZXh0KGludCBpbmRleCwgaW50IHN1Yl9pbmRleCkgY29uc3Q7CiAKICAgdm9pZCBMb2FkREEoKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0Q2hlY2tWYWx1ZShib29sIGJEZWZhdWx0KSBjb25zdDsKLSAgYm9vbCBTZXRDaGVja1ZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwgYm9vbCBiRGVmYXVsdCwgYm9vbCBiTm90aWZ5KTsKKyAgYm9vbCBTZXRDaGVja1ZhbHVlKGNvbnN0IFdpZGVTdHJpbmcmIHZhbHVlLCBib29sIGJEZWZhdWx0LCBib29sIGJOb3RpZnkpOwogCi0gIGJvb2wgTm90aWZ5QmVmb3JlU2VsZWN0aW9uQ2hhbmdlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSk7CisgIGJvb2wgTm90aWZ5QmVmb3JlU2VsZWN0aW9uQ2hhbmdlKGNvbnN0IFdpZGVTdHJpbmcmIHZhbHVlKTsKICAgdm9pZCBOb3RpZnlBZnRlclNlbGVjdGlvbkNoYW5nZSgpOwogCi0gIGJvb2wgTm90aWZ5QmVmb3JlVmFsdWVDaGFuZ2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlKTsKKyAgYm9vbCBOb3RpZnlCZWZvcmVWYWx1ZUNoYW5nZShjb25zdCBXaWRlU3RyaW5nJiB2YWx1ZSk7CiAgIHZvaWQgTm90aWZ5QWZ0ZXJWYWx1ZUNoYW5nZSgpOwogCi0gIGJvb2wgTm90aWZ5TGlzdE9yQ29tYm9Cb3hCZWZvcmVDaGFuZ2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlKTsKKyAgYm9vbCBOb3RpZnlMaXN0T3JDb21ib0JveEJlZm9yZUNoYW5nZShjb25zdCBXaWRlU3RyaW5nJiB2YWx1ZSk7CiAgIHZvaWQgTm90aWZ5TGlzdE9yQ29tYm9Cb3hBZnRlckNoYW5nZSgpOwogCiAgIENQREZfRm9ybUZpZWxkOjpUeXBlIG1fVHlwZTsKICAgdWludDMyX3QgbV9GbGFnczsKLSAgQ1BERl9JbnRlckZvcm0qIGNvbnN0IG1fcEZvcm07Ci0gIENQREZfRGljdGlvbmFyeSogbV9wRGljdDsKLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtQ29udHJvbCo+IG1fQ29udHJvbExpc3Q7ICAvLyBPd25lZCBieSBJbnRlckZvcm0gcGFyZW50LgotICBGWF9GTE9BVCBtX0ZvbnRTaXplOwotICBDUERGX0ZvbnQqIG1fcEZvbnQ7CisgIFVub3duZWRQdHI8Q1BERl9JbnRlckZvcm0+IGNvbnN0IG1fcEZvcm07CisgIFVub3duZWRQdHI8Q1BERl9EaWN0aW9uYXJ5PiBtX3BEaWN0OworICAvLyBPd25lZCBieSBJbnRlckZvcm0gcGFyZW50LgorICBzdGQ6OnZlY3RvcjxVbm93bmVkUHRyPENQREZfRm9ybUNvbnRyb2w+PiBtX0NvbnRyb2xMaXN0OworICBmbG9hdCBtX0ZvbnRTaXplOworICBVbm93bmVkUHRyPENQREZfRm9udD4gbV9wRm9udDsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9GUERGRE9DX0NQREZfRk9STUZJRUxEX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3BkZl9mb3JtZmllbGRfdW5pdHRlc3QuY3BwIGIvY29yZS9mcGRmZG9jL2NwZGZfZm9ybWZpZWxkX3VuaXR0ZXN0LmNwcAppbmRleCA0YWVkYTg0Li5hZjVkMTVkIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZkb2MvY3BkZl9mb3JtZmllbGRfdW5pdHRlc3QuY3BwCisrKyBiL2NvcmUvZnBkZmRvYy9jcGRmX2Zvcm1maWVsZF91bml0dGVzdC5jcHAKQEAgLTEwLDcgKzEwLDcgQEAKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKIAogVEVTVChjcGRmX2Zvcm1maWVsZCwgRlBERl9HZXRGdWxsTmFtZSkgewotICBDRlhfV2lkZVN0cmluZyBuYW1lID0gRlBERl9HZXRGdWxsTmFtZShudWxscHRyKTsKKyAgV2lkZVN0cmluZyBuYW1lID0gRlBERl9HZXRGdWxsTmFtZShudWxscHRyKTsKICAgRVhQRUNUX1RSVUUobmFtZS5Jc0VtcHR5KCkpOwogCiAgIENQREZfSW5kaXJlY3RPYmplY3RIb2xkZXIgb2JqX2hvbGRlcjsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jcGRmX2ljb25maXQuY3BwIGIvY29yZS9mcGRmZG9jL2NwZGZfaWNvbmZpdC5jcHAKaW5kZXggYWVkYjc4NS4uMjBlZDk2MyAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfaWNvbmZpdC5jcHAKKysrIGIvY29yZS9mcGRmZG9jL2NwZGZfaWNvbmZpdC5jcHAKQEAgLTEwLDExICsxMCwxNyBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKIAorQ1BERl9JY29uRml0OjpDUERGX0ljb25GaXQoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgOiBtX3BEaWN0KHBEaWN0KSB7fQorCitDUERGX0ljb25GaXQ6OkNQREZfSWNvbkZpdChjb25zdCBDUERGX0ljb25GaXQmIHRoYXQpID0gZGVmYXVsdDsKKworQ1BERl9JY29uRml0Ojp+Q1BERl9JY29uRml0KCkge30KKwogQ1BERl9JY29uRml0OjpTY2FsZU1ldGhvZCBDUERGX0ljb25GaXQ6OkdldFNjYWxlTWV0aG9kKCkgewogICBpZiAoIW1fcERpY3QpCiAgICAgcmV0dXJuIEFsd2F5czsKIAotICBDRlhfQnl0ZVN0cmluZyBjc1NXID0gbV9wRGljdC0+R2V0U3RyaW5nRm9yKCJTVyIsICJBIik7CisgIEJ5dGVTdHJpbmcgY3NTVyA9IG1fcERpY3QtPkdldFN0cmluZ0ZvcigiU1ciLCAiQSIpOwogICBpZiAoY3NTVyA9PSAiQiIpCiAgICAgcmV0dXJuIEJpZ2dlcjsKICAgaWYgKGNzU1cgPT0gIlMiKQpAQCAtMjgsNyArMzQsNyBAQAogICByZXR1cm4gbV9wRGljdCA/IG1fcERpY3QtPkdldFN0cmluZ0ZvcigiUyIsICJQIikgIT0gIkEiIDogdHJ1ZTsKIH0KIAotdm9pZCBDUERGX0ljb25GaXQ6OkdldEljb25Qb3NpdGlvbihGWF9GTE9BVCYgZkxlZnQsIEZYX0ZMT0FUJiBmQm90dG9tKSB7Cit2b2lkIENQREZfSWNvbkZpdDo6R2V0SWNvblBvc2l0aW9uKGZsb2F0JiBmTGVmdCwgZmxvYXQmIGZCb3R0b20pIHsKICAgZkxlZnQgPSBmQm90dG9tID0gMC41OwogICBpZiAoIW1fcERpY3QpCiAgICAgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwZGZfaWNvbmZpdC5oIGIvY29yZS9mcGRmZG9jL2NwZGZfaWNvbmZpdC5oCmluZGV4IDM3ZGY0OGQuLmU2YWFmYjYgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jcGRmX2ljb25maXQuaAorKysgYi9jb3JlL2ZwZGZkb2MvY3BkZl9pY29uZml0LmgKQEAgLTgsNiArOCw3IEBACiAjZGVmaW5lIENPUkVfRlBERkRPQ19DUERGX0lDT05GSVRfSF8KIAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogCiBjbGFzcyBDUERGX0RpY3Rpb25hcnk7CiAKQEAgLTE1LDE2ICsxNiwxOCBAQAogIHB1YmxpYzoKICAgZW51bSBTY2FsZU1ldGhvZCB7IEFsd2F5cyA9IDAsIEJpZ2dlciwgU21hbGxlciwgTmV2ZXIgfTsKIAotICBleHBsaWNpdCBDUERGX0ljb25GaXQoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgOiBtX3BEaWN0KHBEaWN0KSB7fQorICBleHBsaWNpdCBDUERGX0ljb25GaXQoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCk7CisgIENQREZfSWNvbkZpdChjb25zdCBDUERGX0ljb25GaXQmIHRoYXQpOworICB+Q1BERl9JY29uRml0KCk7CiAKICAgU2NhbGVNZXRob2QgR2V0U2NhbGVNZXRob2QoKTsKICAgYm9vbCBJc1Byb3BvcnRpb25hbFNjYWxlKCk7Ci0gIHZvaWQgR2V0SWNvblBvc2l0aW9uKEZYX0ZMT0FUJiBmTGVmdCwgRlhfRkxPQVQmIGZCb3R0b20pOworICB2b2lkIEdldEljb25Qb3NpdGlvbihmbG9hdCYgZkxlZnQsIGZsb2F0JiBmQm90dG9tKTsKICAgYm9vbCBHZXRGaXR0aW5nQm91bmRzKCk7Ci0gIGNvbnN0IENQREZfRGljdGlvbmFyeSogR2V0RGljdCgpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3Q7IH0KKyAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBHZXREaWN0KCkgY29uc3QgeyByZXR1cm4gbV9wRGljdC5HZXQoKTsgfQogCiAgcHJpdmF0ZToKLSAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBjb25zdCBtX3BEaWN0OworICBVbm93bmVkUHRyPGNvbnN0IENQREZfRGljdGlvbmFyeT4gY29uc3QgbV9wRGljdDsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9GUERGRE9DX0NQREZfSUNPTkZJVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwZGZfaW50ZXJmb3JtLmNwcCBiL2NvcmUvZnBkZmRvYy9jcGRmX2ludGVyZm9ybS5jcHAKaW5kZXggZDlmMGRiOS4uMTU5NmIxNyAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfaW50ZXJmb3JtLmNwcAorKysgYi9jb3JlL2ZwZGZkb2MvY3BkZl9pbnRlcmZvcm0uY3BwCkBAIC0yMCw4ICsyMCwxMCBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJpbmcuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9maWxlc3BlYy5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2Zvcm1jb250cm9sLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb2RlcGFnZS5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfc3Vic3Rmb250LmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZvbnQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgogCiBuYW1lc3BhY2UgewpAQCAtMjksNyArMzEsNyBAQAogY29uc3QgaW50IG5NYXhSZWN1cnNpb24gPSAzMjsKIAogY29uc3Qgc3RydWN0IFN1cHBvcnRGaWVsZEVuY29kaW5nIHsKLSAgY29uc3QgRlhfQ0hBUiogbV9uYW1lOworICBjb25zdCBjaGFyKiBtX25hbWU7CiAgIHVpbnQxNl90IG1fY29kZVBhZ2U7CiB9IGdfZmllbGRFbmNvZGluZ1tdID0gewogICAgIHsiQmlnRml2ZSIsIDk1MH0sCkBAIC0zOCwyNCArNDAsMjQgQEAKICAgICB7IlVIQyIsIDk0OX0sCiB9OwogCi1DRlhfV2lkZVN0cmluZyBHZXRGaWVsZFZhbHVlKGNvbnN0IENQREZfRGljdGlvbmFyeSYgcEZpZWxkRGljdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzRW5jb2RpbmcpIHsKLSAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgY3NCVmFsdWUgPSBwRmllbGREaWN0LkdldFN0cmluZ0ZvcigiViIpOworV2lkZVN0cmluZyBHZXRGaWVsZFZhbHVlKGNvbnN0IENQREZfRGljdGlvbmFyeSYgcEZpZWxkRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBic0VuY29kaW5nKSB7CisgIGNvbnN0IEJ5dGVTdHJpbmcgY3NCVmFsdWUgPSBwRmllbGREaWN0LkdldFN0cmluZ0ZvcigiViIpOwogICBmb3IgKGNvbnN0IGF1dG8mIGVuY29kaW5nIDogZ19maWVsZEVuY29kaW5nKSB7CiAgICAgaWYgKGJzRW5jb2RpbmcgPT0gZW5jb2RpbmcubV9uYW1lKQotICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nOjpGcm9tQ29kZVBhZ2UoY3NCVmFsdWUuQXNTdHJpbmdDKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZy5tX2NvZGVQYWdlKTsKKyAgICAgIHJldHVybiBXaWRlU3RyaW5nOjpGcm9tQ29kZVBhZ2UoY3NCVmFsdWUuQXNTdHJpbmdWaWV3KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nLm1fY29kZVBhZ2UpOwogICB9Ci0gIENGWF9CeXRlU3RyaW5nIGNzVGVtcCA9IGNzQlZhbHVlLkxlZnQoMik7CisgIEJ5dGVTdHJpbmcgY3NUZW1wID0gY3NCVmFsdWUuTGVmdCgyKTsKICAgaWYgKGNzVGVtcCA9PSAiXHhGRlx4RkUiIHx8IGNzVGVtcCA9PSAiXHhGRVx4RkYiKQogICAgIHJldHVybiBQREZfRGVjb2RlVGV4dChjc0JWYWx1ZSk7Ci0gIHJldHVybiBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKGNzQlZhbHVlLkFzU3RyaW5nQygpKTsKKyAgcmV0dXJuIFdpZGVTdHJpbmc6OkZyb21Mb2NhbChjc0JWYWx1ZS5Bc1N0cmluZ1ZpZXcoKSk7CiB9CiAKIHZvaWQgQWRkRm9udChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsCiAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAogICAgICAgICAgICAgIGNvbnN0IENQREZfRm9udCogcEZvbnQsCi0gICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CisgICAgICAgICAgICAgQnl0ZVN0cmluZyogY3NOYW1lVGFnKTsKIAogdm9pZCBJbml0RGljdChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCkgewogICBpZiAoIXBEb2N1bWVudCkKQEAgLTY3LDMwICs2OSwyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtRGljdC0+R2V0T2JqTnVtKCkpOwogICB9CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgY3NEQTsKKyAgQnl0ZVN0cmluZyBjc0RBOwogICBpZiAoIXBGb3JtRGljdC0+S2V5RXhpc3QoIkRSIikpIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc0Jhc2VOYW1lOwotICAgIENGWF9CeXRlU3RyaW5nIGNzRGVmYXVsdDsKKyAgICBCeXRlU3RyaW5nIGNzQmFzZU5hbWU7CiAgICAgdWludDhfdCBjaGFyU2V0ID0gQ1BERl9JbnRlckZvcm06OkdldE5hdGl2ZUNoYXJTZXQoKTsKICAgICBDUERGX0ZvbnQqIHBGb250ID0gQ1BERl9JbnRlckZvcm06OkFkZFN0YW5kYXJkRm9udChwRG9jdW1lbnQsICJIZWx2ZXRpY2EiKTsKLSAgICBpZiAocEZvbnQpIHsKLSAgICAgIEFkZEZvbnQocEZvcm1EaWN0LCBwRG9jdW1lbnQsIHBGb250LCBjc0Jhc2VOYW1lKTsKLSAgICAgIGNzRGVmYXVsdCA9IGNzQmFzZU5hbWU7Ci0gICAgfQotICAgIGlmIChjaGFyU2V0ICE9IEZYRk9OVF9BTlNJX0NIQVJTRVQpIHsKLSAgICAgIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUgPQotICAgICAgICAgIENQREZfSW50ZXJGb3JtOjpHZXROYXRpdmVGb250KGNoYXJTZXQsIG51bGxwdHIpOworICAgIGlmIChwRm9udCkKKyAgICAgIEFkZEZvbnQocEZvcm1EaWN0LCBwRG9jdW1lbnQsIHBGb250LCAmY3NCYXNlTmFtZSk7CisKKyAgICBpZiAoY2hhclNldCAhPSBGWF9DSEFSU0VUX0FOU0kpIHsKKyAgICAgIEJ5dGVTdHJpbmcgY3NGb250TmFtZSA9IENQREZfSW50ZXJGb3JtOjpHZXROYXRpdmVGb250KGNoYXJTZXQsIG51bGxwdHIpOwogICAgICAgaWYgKCFwRm9udCB8fCBjc0ZvbnROYW1lICE9ICJIZWx2ZXRpY2EiKSB7CiAgICAgICAgIHBGb250ID0gQ1BERl9JbnRlckZvcm06OkFkZE5hdGl2ZUZvbnQocERvY3VtZW50KTsKICAgICAgICAgaWYgKHBGb250KSB7Ci0gICAgICAgICAgY3NCYXNlTmFtZSA9ICIiOwotICAgICAgICAgIEFkZEZvbnQocEZvcm1EaWN0LCBwRG9jdW1lbnQsIHBGb250LCBjc0Jhc2VOYW1lKTsKLSAgICAgICAgICBjc0RlZmF1bHQgPSBjc0Jhc2VOYW1lOworICAgICAgICAgIGNzQmFzZU5hbWUuY2xlYXIoKTsKKyAgICAgICAgICBBZGRGb250KHBGb3JtRGljdCwgcERvY3VtZW50LCBwRm9udCwgJmNzQmFzZU5hbWUpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICAgIGlmIChwRm9udCkKLSAgICAgIGNzREEgPSAiLyIgKyBQREZfTmFtZUVuY29kZShjc0RlZmF1bHQpICsgIiAwIFRmIjsKKyAgICAgIGNzREEgPSAiLyIgKyBQREZfTmFtZUVuY29kZShjc0Jhc2VOYW1lKSArICIgMCBUZiI7CiAgIH0KICAgaWYgKCFjc0RBLklzRW1wdHkoKSkKICAgICBjc0RBICs9ICIgIjsKQEAgLTEwMiw4ICsxMDAsOCBAQAogCiBDUERGX0ZvbnQqIEdldEZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsCiAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAotICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZykgewotICBDRlhfQnl0ZVN0cmluZyBjc0FsaWFzID0gUERGX05hbWVEZWNvZGUoY3NOYW1lVGFnKTsKKyAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBjc05hbWVUYWcpIHsKKyAgQnl0ZVN0cmluZyBjc0FsaWFzID0gUERGX05hbWVEZWNvZGUoY3NOYW1lVGFnKTsKICAgaWYgKCFwRm9ybURpY3QgfHwgY3NBbGlhcy5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKQEAgLTEyNyw3ICsxMjUsNyBAQAogQ1BERl9Gb250KiBHZXROYXRpdmVGb250KENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNoYXJTZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykgeworICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHJpbmcqIGNzTmFtZVRhZykgewogICBpZiAoIXBGb3JtRGljdCkKICAgICByZXR1cm4gbnVsbHB0cjsKIApAQCAtMTQwLDcgKzEzOCw3IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiAKICAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICpwRm9udHMpIHsKLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NLZXkgPSBpdC5maXJzdDsKKyAgICBjb25zdCBCeXRlU3RyaW5nJiBjc0tleSA9IGl0LmZpcnN0OwogICAgIGlmICghaXQuc2Vjb25kKQogICAgICAgY29udGludWU7CiAKQEAgLTE1Nyw4ICsxNTUsOCBAQAogICAgIGlmICghcFN1YnN0KQogICAgICAgY29udGludWU7CiAKLSAgICBpZiAocFN1YnN0LT5tX0NoYXJzZXQgPT0gKGludCljaGFyU2V0KSB7Ci0gICAgICBjc05hbWVUYWcgPSBjc0tleTsKKyAgICBpZiAocFN1YnN0LT5tX0NoYXJzZXQgPT0gc3RhdGljX2Nhc3Q8aW50PihjaGFyU2V0KSkgeworICAgICAgKmNzTmFtZVRhZyA9IGNzS2V5OwogICAgICAgcmV0dXJuIHBGaW5kOwogICAgIH0KICAgfQpAQCAtMTY3LDcgKzE2NSw3IEBACiAKIGJvb2wgRmluZEZvbnQoQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QsCiAgICAgICAgICAgICAgIGNvbnN0IENQREZfRm9udCogcEZvbnQsCi0gICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpIHsKKyAgICAgICAgICAgICAgQnl0ZVN0cmluZyogY3NOYW1lVGFnKSB7CiAgIGlmICghcEZvcm1EaWN0IHx8ICFwRm9udCkKICAgICByZXR1cm4gZmFsc2U7CiAKQEAgLTE4MCw3ICsxNzgsNyBAQAogICAgIHJldHVybiBmYWxzZTsKIAogICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogKnBGb250cykgewotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc0tleSA9IGl0LmZpcnN0OworICAgIGNvbnN0IEJ5dGVTdHJpbmcmIGNzS2V5ID0gaXQuZmlyc3Q7CiAgICAgaWYgKCFpdC5zZWNvbmQpCiAgICAgICBjb250aW51ZTsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBFbGVtZW50ID0gVG9EaWN0aW9uYXJ5KGl0LnNlY29uZC0+R2V0RGlyZWN0KCkpOwpAQCAtMTg5LDcgKzE4Nyw3IEBACiAgICAgaWYgKHBFbGVtZW50LT5HZXRTdHJpbmdGb3IoIlR5cGUiKSAhPSAiRm9udCIpCiAgICAgICBjb250aW51ZTsKICAgICBpZiAocEZvbnQtPkdldEZvbnREaWN0KCkgPT0gcEVsZW1lbnQpIHsKLSAgICAgIGNzTmFtZVRhZyA9IGNzS2V5OworICAgICAgKmNzTmFtZVRhZyA9IGNzS2V5OwogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICB9CkBAIC0xOTgsOSArMTk2LDkgQEAKIAogYm9vbCBGaW5kRm9udChDUERGX0RpY3Rpb25hcnkqIHBGb3JtRGljdCwKICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAotICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lLAorICAgICAgICAgICAgICBCeXRlU3RyaW5nIGNzRm9udE5hbWUsCiAgICAgICAgICAgICAgIENQREZfRm9udComIHBGb250LAotICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKSB7CisgICAgICAgICAgICAgIEJ5dGVTdHJpbmcqIGNzTmFtZVRhZykgewogICBpZiAoIXBGb3JtRGljdCkKICAgICByZXR1cm4gZmFsc2U7CiAKQEAgLTIxMSwxMSArMjA5LDEyIEBACiAgIENQREZfRGljdGlvbmFyeSogcEZvbnRzID0gcERSLT5HZXREaWN0Rm9yKCJGb250Iik7CiAgIGlmICghcEZvbnRzKQogICAgIHJldHVybiBmYWxzZTsKKwogICBpZiAoY3NGb250TmFtZS5HZXRMZW5ndGgoKSA+IDApCiAgICAgY3NGb250TmFtZS5SZW1vdmUoJyAnKTsKIAogICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogKnBGb250cykgewotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc0tleSA9IGl0LmZpcnN0OworICAgIGNvbnN0IEJ5dGVTdHJpbmcmIGNzS2V5ID0gaXQuZmlyc3Q7CiAgICAgaWYgKCFpdC5zZWNvbmQpCiAgICAgICBjb250aW51ZTsKIApAQCAtMjI4LDExICsyMjcsMTEgQEAKICAgICBpZiAoIXBGb250KQogICAgICAgY29udGludWU7CiAKLSAgICBDRlhfQnl0ZVN0cmluZyBjc0Jhc2VGb250OworICAgIEJ5dGVTdHJpbmcgY3NCYXNlRm9udDsKICAgICBjc0Jhc2VGb250ID0gcEZvbnQtPkdldEJhc2VGb250KCk7CiAgICAgY3NCYXNlRm9udC5SZW1vdmUoJyAnKTsKICAgICBpZiAoY3NCYXNlRm9udCA9PSBjc0ZvbnROYW1lKSB7Ci0gICAgICBjc05hbWVUYWcgPSBjc0tleTsKKyAgICAgICpjc05hbWVUYWcgPSBjc0tleTsKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgfQpAQCAtMjQyLDE1ICsyNDEsMTUgQEAKIHZvaWQgQWRkRm9udChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsCiAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAogICAgICAgICAgICAgIGNvbnN0IENQREZfRm9udCogcEZvbnQsCi0gICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykgeworICAgICAgICAgICAgIEJ5dGVTdHJpbmcqIGNzTmFtZVRhZykgewogICBpZiAoIXBGb250KQogICAgIHJldHVybjsKICAgaWYgKCFwRm9ybURpY3QpCiAgICAgSW5pdERpY3QocEZvcm1EaWN0LCBwRG9jdW1lbnQpOwogCi0gIENGWF9CeXRlU3RyaW5nIGNzVGFnOwotICBpZiAoRmluZEZvbnQocEZvcm1EaWN0LCBwRm9udCwgY3NUYWcpKSB7Ci0gICAgY3NOYW1lVGFnID0gY3NUYWc7CisgIEJ5dGVTdHJpbmcgY3NUYWc7CisgIGlmIChGaW5kRm9udChwRm9ybURpY3QsIHBGb250LCAmY3NUYWcpKSB7CisgICAgKmNzTmFtZVRhZyA9IGNzVGFnOwogICAgIHJldHVybjsKICAgfQogICBpZiAoIXBGb3JtRGljdCkKQEAgLTI2NCwzMCArMjYzLDMwIEBACiAgIGlmICghcEZvbnRzKQogICAgIHBGb250cyA9IHBEUi0+U2V0TmV3Rm9yPENQREZfRGljdGlvbmFyeT4oIkZvbnQiKTsKIAotICBpZiAoY3NOYW1lVGFnLklzRW1wdHkoKSkKLSAgICBjc05hbWVUYWcgPSBwRm9udC0+R2V0QmFzZUZvbnQoKTsKKyAgaWYgKGNzTmFtZVRhZy0+SXNFbXB0eSgpKQorICAgICpjc05hbWVUYWcgPSBwRm9udC0+R2V0QmFzZUZvbnQoKTsKIAotICBjc05hbWVUYWcuUmVtb3ZlKCcgJyk7Ci0gIGNzTmFtZVRhZyA9IENQREZfSW50ZXJGb3JtOjpHZW5lcmF0ZU5ld1Jlc291cmNlTmFtZShwRFIsICJGb250IiwgNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzTmFtZVRhZy5jX3N0cigpKTsKLSAgcEZvbnRzLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KGNzTmFtZVRhZywgcERvY3VtZW50LAorICBjc05hbWVUYWctPlJlbW92ZSgnICcpOworICAqY3NOYW1lVGFnID0gQ1BERl9JbnRlckZvcm06OkdlbmVyYXRlTmV3UmVzb3VyY2VOYW1lKHBEUiwgIkZvbnQiLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzTmFtZVRhZy0+Y19zdHIoKSk7CisgIHBGb250cy0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigqY3NOYW1lVGFnLCBwRG9jdW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9udC0+R2V0Rm9udERpY3QoKS0+R2V0T2JqTnVtKCkpOwogfQogCiBDUERGX0ZvbnQqIEFkZE5hdGl2ZUZvbnQoQ1BERl9EaWN0aW9uYXJ5KiYgcEZvcm1EaWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNoYXJTZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZykgeworICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHJpbmcqIGNzTmFtZVRhZykgewogICBpZiAoIXBGb3JtRGljdCkKICAgICBJbml0RGljdChwRm9ybURpY3QsIHBEb2N1bWVudCk7CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgY3NUZW1wOwotICBDUERGX0ZvbnQqIHBGb250ID0gR2V0TmF0aXZlRm9udChwRm9ybURpY3QsIHBEb2N1bWVudCwgY2hhclNldCwgY3NUZW1wKTsKKyAgQnl0ZVN0cmluZyBjc1RlbXA7CisgIENQREZfRm9udCogcEZvbnQgPSBHZXROYXRpdmVGb250KHBGb3JtRGljdCwgcERvY3VtZW50LCBjaGFyU2V0LCAmY3NUZW1wKTsKICAgaWYgKHBGb250KSB7Ci0gICAgY3NOYW1lVGFnID0gY3NUZW1wOworICAgICpjc05hbWVUYWcgPSBjc1RlbXA7CiAgICAgcmV0dXJuIHBGb250OwogICB9Ci0gIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWUgPSBDUERGX0ludGVyRm9ybTo6R2V0TmF0aXZlRm9udChjaGFyU2V0LCBudWxscHRyKTsKKyAgQnl0ZVN0cmluZyBjc0ZvbnROYW1lID0gQ1BERl9JbnRlckZvcm06OkdldE5hdGl2ZUZvbnQoY2hhclNldCwgbnVsbHB0cik7CiAgIGlmICghY3NGb250TmFtZS5Jc0VtcHR5KCkgJiYKICAgICAgIEZpbmRGb250KHBGb3JtRGljdCwgcERvY3VtZW50LCBjc0ZvbnROYW1lLCBwRm9udCwgY3NOYW1lVGFnKSkgewogICAgIHJldHVybiBwRm9udDsKQEAgLTMwMSwyOSArMzAwLDI5IEBACiAKIGNsYXNzIENGaWVsZE5hbWVFeHRyYWN0b3IgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0ZpZWxkTmFtZUV4dHJhY3Rvcihjb25zdCBDRlhfV2lkZVN0cmluZyYgZnVsbF9uYW1lKQorICBleHBsaWNpdCBDRmllbGROYW1lRXh0cmFjdG9yKGNvbnN0IFdpZGVTdHJpbmcmIGZ1bGxfbmFtZSkKICAgICAgIDogbV9GdWxsTmFtZShmdWxsX25hbWUpIHsKICAgICBtX3BDdXIgPSBtX0Z1bGxOYW1lLmNfc3RyKCk7CiAgICAgbV9wRW5kID0gbV9wQ3VyICsgbV9GdWxsTmFtZS5HZXRMZW5ndGgoKTsKICAgfQogCi0gIHZvaWQgR2V0TmV4dChjb25zdCBGWF9XQ0hBUiomIHBTdWJOYW1lLCBGWF9TVFJTSVpFJiBzaXplKSB7CisgIHZvaWQgR2V0TmV4dChjb25zdCB3Y2hhcl90KiYgcFN1Yk5hbWUsIHNpemVfdCYgc2l6ZSkgewogICAgIHBTdWJOYW1lID0gbV9wQ3VyOwogICAgIHdoaWxlIChtX3BDdXIgPCBtX3BFbmQgJiYgbV9wQ3VyWzBdICE9IEwnLicpCiAgICAgICBtX3BDdXIrKzsKIAotICAgIHNpemUgPSAoRlhfU1RSU0laRSkobV9wQ3VyIC0gcFN1Yk5hbWUpOworICAgIHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG1fcEN1ciAtIHBTdWJOYW1lKTsKICAgICBpZiAobV9wQ3VyIDwgbV9wRW5kICYmIG1fcEN1clswXSA9PSBMJy4nKQogICAgICAgbV9wQ3VyKys7CiAgIH0KIAogIHByb3RlY3RlZDoKLSAgQ0ZYX1dpZGVTdHJpbmcgbV9GdWxsTmFtZTsKLSAgY29uc3QgRlhfV0NIQVIqIG1fcEN1cjsKLSAgY29uc3QgRlhfV0NIQVIqIG1fcEVuZDsKKyAgV2lkZVN0cmluZyBtX0Z1bGxOYW1lOworICBjb25zdCB3Y2hhcl90KiBtX3BDdXI7CisgIGNvbnN0IHdjaGFyX3QqIG1fcEVuZDsKIH07CiAKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KIHR5cGVkZWYgc3RydWN0IHsKICAgYm9vbCBiRmluZDsKICAgTE9HRk9OVEEgbGY7CkBAIC0zNjksMjMgKzM2OCw3IEBACiAgIH0KICAgcmV0dXJuIFJldHJpZXZlU3BlY2lmaWNGb250KGxmKTsKIH0KLSNlbmRpZiAgLy8gX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotCi1pbnQgQ29tcGFyZUZpZWxkTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgbmFtZTEsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBuYW1lMikgewotICBjb25zdCBGWF9XQ0hBUiogcHRyMSA9IG5hbWUxLmNfc3RyKCk7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwdHIyID0gbmFtZTIuY19zdHIoKTsKLSAgaWYgKG5hbWUxLkdldExlbmd0aCgpID09IG5hbWUyLkdldExlbmd0aCgpKQotICAgIHJldHVybiBuYW1lMSA9PSBuYW1lMiA/IDEgOiAwOwotCi0gIGludCBpID0gMDsKLSAgd2hpbGUgKHB0cjFbaV0gPT0gcHRyMltpXSkKLSAgICBpKys7Ci0gIGlmIChpID09IG5hbWUxLkdldExlbmd0aCgpKQotICAgIHJldHVybiAyOwotICBpZiAoaSA9PSBuYW1lMi5HZXRMZW5ndGgoKSkKLSAgICByZXR1cm4gMzsKLSAgcmV0dXJuIDA7Ci19CisjZW5kaWYgIC8vIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCiAKIH0gIC8vIG5hbWVzcGFjZQogCkBAIC0zOTMsMzcgKzM3Niw0MiBAQAogIHB1YmxpYzoKICAgY2xhc3MgTm9kZSB7CiAgICBwdWJsaWM6Ci0gICAgTm9kZSgpIDogbV9wRmllbGQobnVsbHB0cikge30KLSAgICBOb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzaG9ydF9uYW1lLCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkKQotICAgICAgICA6IG1fU2hvcnROYW1lKHNob3J0X25hbWUpLCBtX3BGaWVsZChwRmllbGQpIHt9CisgICAgTm9kZSgpIDogbV9wRmllbGQobnVsbHB0ciksIG1fbGV2ZWwoMCkge30KKyAgICBOb2RlKGNvbnN0IFdpZGVTdHJpbmcmIHNob3J0X25hbWUsIGludCBsZXZlbCkKKyAgICAgICAgOiBtX1Nob3J0TmFtZShzaG9ydF9uYW1lKSwgbV9sZXZlbChsZXZlbCkge30KICAgICB+Tm9kZSgpIHt9CiAKLSAgICB2b2lkIEFkZENoaWxkTm9kZShOb2RlKiBwTm9kZSkgeyBtX0NoaWxkcmVuLnB1c2hfYmFjayhwTm9kZSk7IH0KKyAgICB2b2lkIEFkZENoaWxkTm9kZShzdGQ6OnVuaXF1ZV9wdHI8Tm9kZT4gcE5vZGUpIHsKKyAgICAgIG1fQ2hpbGRyZW4ucHVzaF9iYWNrKHN0ZDo6bW92ZShwTm9kZSkpOworICAgIH0KIAogICAgIHNpemVfdCBHZXRDaGlsZHJlbkNvdW50KCkgY29uc3QgeyByZXR1cm4gbV9DaGlsZHJlbi5zaXplKCk7IH0KIAotICAgIE5vZGUqIEdldENoaWxkQXQoc2l6ZV90IGkpIHsgcmV0dXJuIG1fQ2hpbGRyZW5baV07IH0KLSAgICBjb25zdCBOb2RlKiBHZXRDaGlsZEF0KHNpemVfdCBpKSBjb25zdCB7IHJldHVybiBtX0NoaWxkcmVuW2ldOyB9CisgICAgTm9kZSogR2V0Q2hpbGRBdChzaXplX3QgaSkgeyByZXR1cm4gbV9DaGlsZHJlbltpXS5nZXQoKTsgfQorICAgIGNvbnN0IE5vZGUqIEdldENoaWxkQXQoc2l6ZV90IGkpIGNvbnN0IHsgcmV0dXJuIG1fQ2hpbGRyZW5baV0uZ2V0KCk7IH0KIAogICAgIENQREZfRm9ybUZpZWxkKiBHZXRGaWVsZEF0SW5kZXgoc2l6ZV90IGluZGV4KSB7CiAgICAgICBzaXplX3QgbkZpZWxkc1RvR28gPSBpbmRleDsKICAgICAgIHJldHVybiBHZXRGaWVsZEludGVybmFsKCZuRmllbGRzVG9Hbyk7CiAgICAgfQogCi0gICAgc2l6ZV90IENvdW50RmllbGRzKCkgY29uc3QgeyByZXR1cm4gQ291bnRGaWVsZHNJbnRlcm5hbCgwKTsgfQorICAgIHNpemVfdCBDb3VudEZpZWxkcygpIGNvbnN0IHsgcmV0dXJuIENvdW50RmllbGRzSW50ZXJuYWwoKTsgfQogCi0gICAgdm9pZCBTZXRGaWVsZChDUERGX0Zvcm1GaWVsZCogcEZpZWxkKSB7IG1fcEZpZWxkID0gcEZpZWxkOyB9CisgICAgdm9pZCBTZXRGaWVsZChzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Gb3JtRmllbGQ+IHBGaWVsZCkgeworICAgICAgbV9wRmllbGQgPSBzdGQ6Om1vdmUocEZpZWxkKTsKKyAgICB9CiAKLSAgICBDUERGX0Zvcm1GaWVsZCogR2V0RmllbGQoKSB7IHJldHVybiBtX3BGaWVsZDsgfQotICAgIGNvbnN0IENQREZfRm9ybUZpZWxkKiBHZXRGaWVsZCgpIGNvbnN0IHsgcmV0dXJuIG1fcEZpZWxkOyB9CisgICAgQ1BERl9Gb3JtRmllbGQqIEdldEZpZWxkKCkgY29uc3QgeyByZXR1cm4gbV9wRmllbGQuZ2V0KCk7IH0KIAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBHZXRTaG9ydE5hbWUoKSBjb25zdCB7IHJldHVybiBtX1Nob3J0TmFtZTsgfQorICAgIGNvbnN0IFdpZGVTdHJpbmcmIEdldFNob3J0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fU2hvcnROYW1lOyB9CisKKyAgICBpbnQgR2V0TGV2ZWwoKSBjb25zdCB7IHJldHVybiBtX2xldmVsOyB9CiAKICAgIHByaXZhdGU6CiAgICAgQ1BERl9Gb3JtRmllbGQqIEdldEZpZWxkSW50ZXJuYWwoc2l6ZV90KiBwRmllbGRzVG9HbykgewogICAgICAgaWYgKG1fcEZpZWxkKSB7CiAgICAgICAgIGlmICgqcEZpZWxkc1RvR28gPT0gMCkKLSAgICAgICAgICByZXR1cm4gbV9wRmllbGQ7CisgICAgICAgICAgcmV0dXJuIG1fcEZpZWxkLmdldCgpOwogCiAgICAgICAgIC0tKnBGaWVsZHNUb0dvOwogICAgICAgfQpAQCAtNDM1LDcyICs0MjMsNTggQEAKICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KIAotICAgIHNpemVfdCBDb3VudEZpZWxkc0ludGVybmFsKGludCBuTGV2ZWwpIGNvbnN0IHsKLSAgICAgIGlmIChuTGV2ZWwgPiBuTWF4UmVjdXJzaW9uKQotICAgICAgICByZXR1cm4gMDsKLQorICAgIHNpemVfdCBDb3VudEZpZWxkc0ludGVybmFsKCkgY29uc3QgewogICAgICAgc2l6ZV90IGNvdW50ID0gMDsKICAgICAgIGlmIChtX3BGaWVsZCkKICAgICAgICAgKytjb3VudDsKIAogICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBHZXRDaGlsZHJlbkNvdW50KCk7ICsraSkKLSAgICAgICAgY291bnQgKz0gR2V0Q2hpbGRBdChpKS0+Q291bnRGaWVsZHNJbnRlcm5hbChuTGV2ZWwgKyAxKTsKKyAgICAgICAgY291bnQgKz0gR2V0Q2hpbGRBdChpKS0+Q291bnRGaWVsZHNJbnRlcm5hbCgpOwogICAgICAgcmV0dXJuIGNvdW50OwogICAgIH0KIAotICAgIHN0ZDo6dmVjdG9yPE5vZGUqPiBtX0NoaWxkcmVuOwotICAgIENGWF9XaWRlU3RyaW5nIG1fU2hvcnROYW1lOwotICAgIENQREZfRm9ybUZpZWxkKiBtX3BGaWVsZDsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Tm9kZT4+IG1fQ2hpbGRyZW47CisgICAgV2lkZVN0cmluZyBtX1Nob3J0TmFtZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Gb3JtRmllbGQ+IG1fcEZpZWxkOworICAgIGNvbnN0IGludCBtX2xldmVsOwogICB9OwogCiAgIENGaWVsZFRyZWUoKTsKICAgfkNGaWVsZFRyZWUoKTsKIAotICB2b2lkIFNldEZpZWxkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmdWxsX25hbWUsIENQREZfRm9ybUZpZWxkKiBwRmllbGQpOwotICBDUERGX0Zvcm1GaWVsZCogR2V0RmllbGQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZ1bGxfbmFtZSk7Ci0gIHZvaWQgUmVtb3ZlQWxsKCk7CisgIGJvb2wgU2V0RmllbGQoY29uc3QgV2lkZVN0cmluZyYgZnVsbF9uYW1lLAorICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0Zvcm1GaWVsZD4gcEZpZWxkKTsKKyAgQ1BERl9Gb3JtRmllbGQqIEdldEZpZWxkKGNvbnN0IFdpZGVTdHJpbmcmIGZ1bGxfbmFtZSk7CiAKLSAgTm9kZSogRmluZE5vZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZ1bGxfbmFtZSk7Ci0gIE5vZGUqIEFkZENoaWxkKE5vZGUqIHBQYXJlbnQsCi0gICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzaG9ydF9uYW1lLAotICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkKTsKLSAgdm9pZCBSZW1vdmVOb2RlKE5vZGUqIHBOb2RlLCBpbnQgbkxldmVsID0gMCk7CisgIE5vZGUqIEZpbmROb2RlKGNvbnN0IFdpZGVTdHJpbmcmIGZ1bGxfbmFtZSk7CisgIE5vZGUqIEFkZENoaWxkKE5vZGUqIHBQYXJlbnQsIGNvbnN0IFdpZGVTdHJpbmcmIHNob3J0X25hbWUpOwogCi0gIE5vZGUqIExvb2t1cChOb2RlKiBwUGFyZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2hvcnRfbmFtZSk7CisgIE5vZGUqIExvb2t1cChOb2RlKiBwUGFyZW50LCBjb25zdCBXaWRlU3RyaW5nJiBzaG9ydF9uYW1lKTsKIAogICBOb2RlIG1fUm9vdDsKIH07CiAKIENGaWVsZFRyZWU6OkNGaWVsZFRyZWUoKSB7fQogCi1DRmllbGRUcmVlOjp+Q0ZpZWxkVHJlZSgpIHsKLSAgUmVtb3ZlQWxsKCk7Ci19CitDRmllbGRUcmVlOjp+Q0ZpZWxkVHJlZSgpIHt9CiAKIENGaWVsZFRyZWU6Ok5vZGUqIENGaWVsZFRyZWU6OkFkZENoaWxkKE5vZGUqIHBQYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2hvcnRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHNob3J0X25hbWUpIHsKICAgaWYgKCFwUGFyZW50KQogICAgIHJldHVybiBudWxscHRyOwogCi0gIE5vZGUqIHBOb2RlID0gbmV3IE5vZGUoc2hvcnRfbmFtZSwgcEZpZWxkKTsKLSAgcFBhcmVudC0+QWRkQ2hpbGROb2RlKHBOb2RlKTsKLSAgcmV0dXJuIHBOb2RlOwotfQorICBpbnQgbGV2ZWwgPSBwUGFyZW50LT5HZXRMZXZlbCgpICsgMTsKKyAgaWYgKGxldmVsID4gbk1heFJlY3Vyc2lvbikKKyAgICByZXR1cm4gbnVsbHB0cjsKIAotdm9pZCBDRmllbGRUcmVlOjpSZW1vdmVOb2RlKE5vZGUqIHBOb2RlLCBpbnQgbkxldmVsKSB7Ci0gIGlmICghcE5vZGUpCi0gICAgcmV0dXJuOwotCi0gIGlmIChuTGV2ZWwgPD0gbk1heFJlY3Vyc2lvbikgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcE5vZGUtPkdldENoaWxkcmVuQ291bnQoKTsgKytpKQotICAgICAgUmVtb3ZlTm9kZShwTm9kZS0+R2V0Q2hpbGRBdChpKSwgbkxldmVsICsgMSk7Ci0gIH0KLSAgZGVsZXRlIHBOb2RlOworICBhdXRvIHBOZXcgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Tm9kZT4oc2hvcnRfbmFtZSwgcFBhcmVudC0+R2V0TGV2ZWwoKSArIDEpOworICBOb2RlKiBwQ2hpbGQgPSBwTmV3LmdldCgpOworICBwUGFyZW50LT5BZGRDaGlsZE5vZGUoc3RkOjptb3ZlKHBOZXcpKTsKKyAgcmV0dXJuIHBDaGlsZDsKIH0KIAogQ0ZpZWxkVHJlZTo6Tm9kZSogQ0ZpZWxkVHJlZTo6TG9va3VwKE5vZGUqIHBQYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNob3J0X25hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzaG9ydF9uYW1lKSB7CiAgIGlmICghcFBhcmVudCkKICAgICByZXR1cm4gbnVsbHB0cjsKIApAQCAtNTEyLDY3ICs0ODYsNjcgQEAKICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXZvaWQgQ0ZpZWxkVHJlZTo6UmVtb3ZlQWxsKCkgewotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fUm9vdC5HZXRDaGlsZHJlbkNvdW50KCk7ICsraSkKLSAgICBSZW1vdmVOb2RlKG1fUm9vdC5HZXRDaGlsZEF0KGkpKTsKLX0KLQotdm9pZCBDRmllbGRUcmVlOjpTZXRGaWVsZChjb25zdCBDRlhfV2lkZVN0cmluZyYgZnVsbF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkKSB7Citib29sIENGaWVsZFRyZWU6OlNldEZpZWxkKGNvbnN0IFdpZGVTdHJpbmcmIGZ1bGxfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENQREZfRm9ybUZpZWxkPiBwRmllbGQpIHsKICAgaWYgKGZ1bGxfbmFtZS5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuOworICAgIHJldHVybiBmYWxzZTsKIAogICBDRmllbGROYW1lRXh0cmFjdG9yIG5hbWVfZXh0cmFjdG9yKGZ1bGxfbmFtZSk7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwTmFtZTsKLSAgRlhfU1RSU0laRSBuTGVuZ3RoOworICBjb25zdCB3Y2hhcl90KiBwTmFtZTsKKyAgc2l6ZV90IG5MZW5ndGg7CiAgIG5hbWVfZXh0cmFjdG9yLkdldE5leHQocE5hbWUsIG5MZW5ndGgpOwogICBOb2RlKiBwTm9kZSA9ICZtX1Jvb3Q7CiAgIE5vZGUqIHBMYXN0ID0gbnVsbHB0cjsKICAgd2hpbGUgKG5MZW5ndGggPiAwKSB7CiAgICAgcExhc3QgPSBwTm9kZTsKLSAgICBDRlhfV2lkZVN0cmluZyBuYW1lID0gQ0ZYX1dpZGVTdHJpbmcocE5hbWUsIG5MZW5ndGgpOworICAgIFdpZGVTdHJpbmcgbmFtZSA9IFdpZGVTdHJpbmcocE5hbWUsIG5MZW5ndGgpOwogICAgIHBOb2RlID0gTG9va3VwKHBMYXN0LCBuYW1lKTsKICAgICBpZiAoIXBOb2RlKQotICAgICAgcE5vZGUgPSBBZGRDaGlsZChwTGFzdCwgbmFtZSwgbnVsbHB0cik7CisgICAgICBwTm9kZSA9IEFkZENoaWxkKHBMYXN0LCBuYW1lKTsKKyAgICBpZiAoIXBOb2RlKQorICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgbmFtZV9leHRyYWN0b3IuR2V0TmV4dChwTmFtZSwgbkxlbmd0aCk7CiAgIH0KLSAgaWYgKHBOb2RlICE9ICZtX1Jvb3QpCi0gICAgcE5vZGUtPlNldEZpZWxkKHBGaWVsZCk7CisgIGlmIChwTm9kZSA9PSAmbV9Sb290KQorICAgIHJldHVybiBmYWxzZTsKKworICBwTm9kZS0+U2V0RmllbGQoc3RkOjptb3ZlKHBGaWVsZCkpOworICByZXR1cm4gdHJ1ZTsKIH0KIAotQ1BERl9Gb3JtRmllbGQqIENGaWVsZFRyZWU6OkdldEZpZWxkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmdWxsX25hbWUpIHsKK0NQREZfRm9ybUZpZWxkKiBDRmllbGRUcmVlOjpHZXRGaWVsZChjb25zdCBXaWRlU3RyaW5nJiBmdWxsX25hbWUpIHsKICAgaWYgKGZ1bGxfbmFtZS5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKICAgQ0ZpZWxkTmFtZUV4dHJhY3RvciBuYW1lX2V4dHJhY3RvcihmdWxsX25hbWUpOwotICBjb25zdCBGWF9XQ0hBUiogcE5hbWU7Ci0gIEZYX1NUUlNJWkUgbkxlbmd0aDsKKyAgY29uc3Qgd2NoYXJfdCogcE5hbWU7CisgIHNpemVfdCBuTGVuZ3RoOwogICBuYW1lX2V4dHJhY3Rvci5HZXROZXh0KHBOYW1lLCBuTGVuZ3RoKTsKICAgTm9kZSogcE5vZGUgPSAmbV9Sb290OwogICBOb2RlKiBwTGFzdCA9IG51bGxwdHI7CiAgIHdoaWxlIChuTGVuZ3RoID4gMCAmJiBwTm9kZSkgewogICAgIHBMYXN0ID0gcE5vZGU7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgbmFtZSA9IENGWF9XaWRlU3RyaW5nKHBOYW1lLCBuTGVuZ3RoKTsKKyAgICBXaWRlU3RyaW5nIG5hbWUgPSBXaWRlU3RyaW5nKHBOYW1lLCBuTGVuZ3RoKTsKICAgICBwTm9kZSA9IExvb2t1cChwTGFzdCwgbmFtZSk7CiAgICAgbmFtZV9leHRyYWN0b3IuR2V0TmV4dChwTmFtZSwgbkxlbmd0aCk7CiAgIH0KICAgcmV0dXJuIHBOb2RlID8gcE5vZGUtPkdldEZpZWxkKCkgOiBudWxscHRyOwogfQogCi1DRmllbGRUcmVlOjpOb2RlKiBDRmllbGRUcmVlOjpGaW5kTm9kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgZnVsbF9uYW1lKSB7CitDRmllbGRUcmVlOjpOb2RlKiBDRmllbGRUcmVlOjpGaW5kTm9kZShjb25zdCBXaWRlU3RyaW5nJiBmdWxsX25hbWUpIHsKICAgaWYgKGZ1bGxfbmFtZS5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKICAgQ0ZpZWxkTmFtZUV4dHJhY3RvciBuYW1lX2V4dHJhY3RvcihmdWxsX25hbWUpOwotICBjb25zdCBGWF9XQ0hBUiogcE5hbWU7Ci0gIEZYX1NUUlNJWkUgbkxlbmd0aDsKKyAgY29uc3Qgd2NoYXJfdCogcE5hbWU7CisgIHNpemVfdCBuTGVuZ3RoOwogICBuYW1lX2V4dHJhY3Rvci5HZXROZXh0KHBOYW1lLCBuTGVuZ3RoKTsKICAgTm9kZSogcE5vZGUgPSAmbV9Sb290OwogICBOb2RlKiBwTGFzdCA9IG51bGxwdHI7CiAgIHdoaWxlIChuTGVuZ3RoID4gMCAmJiBwTm9kZSkgewogICAgIHBMYXN0ID0gcE5vZGU7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgbmFtZSA9IENGWF9XaWRlU3RyaW5nKHBOYW1lLCBuTGVuZ3RoKTsKKyAgICBXaWRlU3RyaW5nIG5hbWUgPSBXaWRlU3RyaW5nKHBOYW1lLCBuTGVuZ3RoKTsKICAgICBwTm9kZSA9IExvb2t1cChwTGFzdCwgbmFtZSk7CiAgICAgbmFtZV9leHRyYWN0b3IuR2V0TmV4dChwTmFtZSwgbkxlbmd0aCk7CiAgIH0KQEAgLTU4MSw2NCArNTU1LDY0IEBACiAKIENQREZfRm9udCogQWRkTmF0aXZlSW50ZXJGb3JtRm9udChDUERGX0RpY3Rpb25hcnkqJiBwRm9ybURpY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWVUYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nKiBjc05hbWVUYWcpIHsKICAgdWludDhfdCBjaGFyU2V0ID0gQ1BERl9JbnRlckZvcm06OkdldE5hdGl2ZUNoYXJTZXQoKTsKICAgcmV0dXJuIEFkZE5hdGl2ZUZvbnQocEZvcm1EaWN0LCBwRG9jdW1lbnQsIGNoYXJTZXQsIGNzTmFtZVRhZyk7CiB9CiAKIC8vIHN0YXRpYwogdWludDhfdCBDUERGX0ludGVyRm9ybTo6R2V0TmF0aXZlQ2hhclNldCgpIHsKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0gIHVpbnQ4X3QgY2hhclNldCA9IEZYRk9OVF9BTlNJX0NIQVJTRVQ7CisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KKyAgdWludDhfdCBjaGFyU2V0ID0gRlhfQ0hBUlNFVF9BTlNJOwogICBVSU5UIGlDb2RlUGFnZSA9IDo6R2V0QUNQKCk7CiAgIHN3aXRjaCAoaUNvZGVQYWdlKSB7Ci0gICAgY2FzZSA5MzI6Ci0gICAgICBjaGFyU2V0ID0gRlhGT05UX1NISUZUSklTX0NIQVJTRVQ7CisgICAgY2FzZSBGWF9DT0RFUEFHRV9TaGlmdEpJUzoKKyAgICAgIGNoYXJTZXQgPSBGWF9DSEFSU0VUX1NoaWZ0SklTOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5MzY6Ci0gICAgICBjaGFyU2V0ID0gRlhGT05UX0dCMjMxMl9DSEFSU0VUOworICAgIGNhc2UgRlhfQ09ERVBBR0VfQ2hpbmVzZVNpbXBsaWZpZWQ6CisgICAgICBjaGFyU2V0ID0gRlhfQ0hBUlNFVF9DaGluZXNlU2ltcGxpZmllZDsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgOTUwOgotICAgICAgY2hhclNldCA9IEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUOworICAgIGNhc2UgRlhfQ09ERVBBR0VfQ2hpbmVzZVRyYWRpdGlvbmFsOgorICAgICAgY2hhclNldCA9IEZYX0NIQVJTRVRfQ2hpbmVzZVRyYWRpdGlvbmFsOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjUyOgotICAgICAgY2hhclNldCA9IEZYRk9OVF9BTlNJX0NIQVJTRVQ7CisgICAgY2FzZSBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW46CisgICAgICBjaGFyU2V0ID0gRlhfQ0hBUlNFVF9BTlNJOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4NzQ6Ci0gICAgICBjaGFyU2V0ID0gRlhGT05UX1RIQUlfQ0hBUlNFVDsKKyAgICBjYXNlIEZYX0NPREVQQUdFX01TRE9TX1RoYWk6CisgICAgICBjaGFyU2V0ID0gRlhfQ0hBUlNFVF9UaGFpOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5NDk6Ci0gICAgICBjaGFyU2V0ID0gRlhGT05UX0hBTkdVTF9DSEFSU0VUOworICAgIGNhc2UgRlhfQ09ERVBBR0VfSGFuZ3VsOgorICAgICAgY2hhclNldCA9IEZYX0NIQVJTRVRfSGFuZ3VsOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjAwOgotICAgICAgY2hhclNldCA9IEZYRk9OVF9BTlNJX0NIQVJTRVQ7CisgICAgY2FzZSBGWF9DT0RFUEFHRV9VVEYxNkxFOgorICAgICAgY2hhclNldCA9IEZYX0NIQVJTRVRfQU5TSTsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI1MDoKLSAgICAgIGNoYXJTZXQgPSBGWEZPTlRfRUFTVEVVUk9QRV9DSEFSU0VUOworICAgIGNhc2UgRlhfQ09ERVBBR0VfTVNXaW5fRWFzdGVybkV1cm9wZWFuOgorICAgICAgY2hhclNldCA9IEZYX0NIQVJTRVRfTVNXaW5fRWFzdGVybkV1cm9wZWFuOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjUxOgotICAgICAgY2hhclNldCA9IEZYRk9OVF9SVVNTSUFOX0NIQVJTRVQ7CisgICAgY2FzZSBGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpYzoKKyAgICAgIGNoYXJTZXQgPSBGWF9DSEFSU0VUX01TV2luX0N5cmlsbGljOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjUzOgotICAgICAgY2hhclNldCA9IEZYRk9OVF9HUkVFS19DSEFSU0VUOworICAgIGNhc2UgRlhfQ09ERVBBR0VfTVNXaW5fR3JlZWs6CisgICAgICBjaGFyU2V0ID0gRlhfQ0hBUlNFVF9NU1dpbl9HcmVlazsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI1NDoKLSAgICAgIGNoYXJTZXQgPSBGWEZPTlRfVFVSS0lTSF9DSEFSU0VUOworICAgIGNhc2UgRlhfQ09ERVBBR0VfTVNXaW5fVHVya2lzaDoKKyAgICAgIGNoYXJTZXQgPSBGWF9DSEFSU0VUX01TV2luX1R1cmtpc2g7CiAgICAgICBicmVhazsKLSAgICBjYXNlIDEyNTU6Ci0gICAgICBjaGFyU2V0ID0gRlhGT05UX0hFQlJFV19DSEFSU0VUOworICAgIGNhc2UgRlhfQ09ERVBBR0VfTVNXaW5fSGVicmV3OgorICAgICAgY2hhclNldCA9IEZYX0NIQVJTRVRfTVNXaW5fSGVicmV3OwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjU2OgotICAgICAgY2hhclNldCA9IEZYRk9OVF9BUkFCSUNfQ0hBUlNFVDsKKyAgICBjYXNlIEZYX0NPREVQQUdFX01TV2luX0FyYWJpYzoKKyAgICAgIGNoYXJTZXQgPSBGWF9DSEFSU0VUX01TV2luX0FyYWJpYzsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI1NzoKLSAgICAgIGNoYXJTZXQgPSBGWEZPTlRfQkFMVElDX0NIQVJTRVQ7CisgICAgY2FzZSBGWF9DT0RFUEFHRV9NU1dpbl9CYWx0aWM6CisgICAgICBjaGFyU2V0ID0gRlhfQ0hBUlNFVF9NU1dpbl9CYWx0aWM7CiAgICAgICBicmVhazsKLSAgICBjYXNlIDEyNTg6Ci0gICAgICBjaGFyU2V0ID0gRlhGT05UX1ZJRVROQU1FU0VfQ0hBUlNFVDsKKyAgICBjYXNlIEZYX0NPREVQQUdFX01TV2luX1ZpZXRuYW1lc2U6CisgICAgICBjaGFyU2V0ID0gRlhfQ0hBUlNFVF9NU1dpbl9WaWV0bmFtZXNlOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMzYxOgotICAgICAgY2hhclNldCA9IEZYRk9OVF9KT0hBQl9DSEFSU0VUOworICAgIGNhc2UgRlhfQ09ERVBBR0VfSm9oYWI6CisgICAgICBjaGFyU2V0ID0gRlhfQ0hBUlNFVF9Kb2hhYjsKICAgICAgIGJyZWFrOwogICB9CiAgIHJldHVybiBjaGFyU2V0OwpAQCAtNjUwLDcgKzYyNCw3IEBACiBDUERGX0ludGVyRm9ybTo6Q1BERl9JbnRlckZvcm0oQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KQogICAgIDogbV9wRG9jdW1lbnQocERvY3VtZW50KSwKICAgICAgIG1fcEZvcm1EaWN0KG51bGxwdHIpLAotICAgICAgbV9wRmllbGRUcmVlKG5ldyBDRmllbGRUcmVlKSwKKyAgICAgIG1fcEZpZWxkVHJlZShwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZpZWxkVHJlZT4oKSksCiAgICAgICBtX3BGb3JtTm90aWZ5KG51bGxwdHIpIHsKICAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7CiAgIGlmICghcFJvb3QpCkBAIC02NjgsMTIgKzY0Miw3IEBACiAgICAgTG9hZEZpZWxkKHBGaWVsZHMtPkdldERpY3RBdChpKSwgMCk7CiB9CiAKLUNQREZfSW50ZXJGb3JtOjp+Q1BERl9JbnRlckZvcm0oKSB7Ci0gIG1fQ29udHJvbE1hcC5jbGVhcigpOwotICBzaXplX3QgbkNvdW50ID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuQ291bnRGaWVsZHMoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuQ291bnQ7ICsraSkKLSAgICBkZWxldGUgbV9wRmllbGRUcmVlLT5tX1Jvb3QuR2V0RmllbGRBdEluZGV4KGkpOwotfQorQ1BERl9JbnRlckZvcm06On5DUERGX0ludGVyRm9ybSgpIHt9CiAKIGJvb2wgQ1BERl9JbnRlckZvcm06OnNfYlVwZGF0ZUFQID0gdHJ1ZTsKIApAQCAtNjg1LDEzICs2NTQsMTMgQEAKICAgc19iVXBkYXRlQVAgPSBiVXBkYXRlQVA7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQREZfSW50ZXJGb3JtOjpHZW5lcmF0ZU5ld1Jlc291cmNlTmFtZSgKK0J5dGVTdHJpbmcgQ1BERl9JbnRlckZvcm06OkdlbmVyYXRlTmV3UmVzb3VyY2VOYW1lKAogICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJlc0RpY3QsCi0gICAgY29uc3QgRlhfQ0hBUiogY3NUeXBlLAorICAgIGNvbnN0IGNoYXIqIGNzVHlwZSwKICAgICBpbnQgaU1pbkxlbiwKLSAgICBjb25zdCBGWF9DSEFSKiBjc1ByZWZpeCkgewotICBDRlhfQnl0ZVN0cmluZyBjc1N0ciA9IGNzUHJlZml4OwotICBDRlhfQnl0ZVN0cmluZyBjc0JUeXBlID0gY3NUeXBlOworICAgIGNvbnN0IGNoYXIqIGNzUHJlZml4KSB7CisgIEJ5dGVTdHJpbmcgY3NTdHIgPSBjc1ByZWZpeDsKKyAgQnl0ZVN0cmluZyBjc0JUeXBlID0gY3NUeXBlOwogICBpZiAoY3NTdHIuSXNFbXB0eSgpKSB7CiAgICAgaWYgKGNzQlR5cGUgPT0gIkV4dEdTdGF0ZSIpCiAgICAgICBjc1N0ciA9ICJHUyI7CkBAIC03MDIsMTEgKzY3MSwxMSBAQAogICAgIGVsc2UKICAgICAgIGNzU3RyID0gIlJlcyI7CiAgIH0KLSAgQ0ZYX0J5dGVTdHJpbmcgY3NUbXAgPSBjc1N0cjsKKyAgQnl0ZVN0cmluZyBjc1RtcCA9IGNzU3RyOwogICBpbnQgaUNvdW50ID0gY3NTdHIuR2V0TGVuZ3RoKCk7CiAgIGludCBtID0gMDsKICAgaWYgKGlNaW5MZW4gPiAwKSB7Ci0gICAgY3NUbXAgPSAiIjsKKyAgICBjc1RtcC5jbGVhcigpOwogICAgIHdoaWxlIChtIDwgaU1pbkxlbiAmJiBtIDwgaUNvdW50KQogICAgICAgY3NUbXAgKz0gY3NTdHJbbSsrXTsKICAgICB3aGlsZSAobSA8IGlNaW5MZW4pIHsKQEAgLTcyNCwxNSArNjkzLDE1IEBACiAgICAgcmV0dXJuIGNzVG1wOwogCiAgIGludCBudW0gPSAwOwotICBDRlhfQnl0ZVN0cmluZyBic051bTsKKyAgQnl0ZVN0cmluZyBic051bTsKICAgd2hpbGUgKHRydWUpIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc0tleSA9IGNzVG1wICsgYnNOdW07CisgICAgQnl0ZVN0cmluZyBjc0tleSA9IGNzVG1wICsgYnNOdW07CiAgICAgaWYgKCFwRGljdC0+S2V5RXhpc3QoY3NLZXkpKQogICAgICAgcmV0dXJuIGNzS2V5OwogICAgIGlmIChtIDwgaUNvdW50KQogICAgICAgY3NUbXAgKz0gY3NTdHJbbSsrXTsKICAgICBlbHNlCi0gICAgICBic051bS5Gb3JtYXQoIiVkIiwgbnVtKyspOworICAgICAgYnNOdW0gPSBCeXRlU3RyaW5nOjpGb3JtYXQoIiVkIiwgbnVtKyspOwogCiAgICAgbSsrOwogICB9CkBAIC03NDAsNyArNzA5LDcgQEAKIH0KIAogQ1BERl9Gb250KiBDUERGX0ludGVyRm9ybTo6QWRkU3RhbmRhcmRGb250KENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0cmluZyBjc0ZvbnROYW1lKSB7CiAgIGlmICghcERvY3VtZW50IHx8IGNzRm9udE5hbWUuSXNFbXB0eSgpKQogICAgIHJldHVybiBudWxscHRyOwogCkBAIC03NTEsMjIgKzcyMCwyMiBAQAogICByZXR1cm4gcERvY3VtZW50LT5BZGRTdGFuZGFyZEZvbnQoY3NGb250TmFtZS5jX3N0cigpLCAmZW5jb2RpbmcpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUERGX0ludGVyRm9ybTo6R2V0TmF0aXZlRm9udCh1aW50OF90IGNoYXJTZXQsIHZvaWQqIHBMb2dGb250KSB7Ci0gIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWU7Ci0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXworQnl0ZVN0cmluZyBDUERGX0ludGVyRm9ybTo6R2V0TmF0aXZlRm9udCh1aW50OF90IGNoYXJTZXQsIHZvaWQqIHBMb2dGb250KSB7CisgIEJ5dGVTdHJpbmcgY3NGb250TmFtZTsKKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXwogICBMT0dGT05UQSBsZiA9IHt9OwotICBpZiAoY2hhclNldCA9PSBGWEZPTlRfQU5TSV9DSEFSU0VUKSB7CisgIGlmIChjaGFyU2V0ID09IEZYX0NIQVJTRVRfQU5TSSkgewogICAgIGNzRm9udE5hbWUgPSAiSGVsdmV0aWNhIjsKICAgICByZXR1cm4gY3NGb250TmFtZTsKICAgfQogICBib29sIGJSZXQgPSBmYWxzZTsKLSAgaWYgKGNoYXJTZXQgPT0gRlhGT05UX1NISUZUSklTX0NIQVJTRVQpIHsKKyAgaWYgKGNoYXJTZXQgPT0gRlhfQ0hBUlNFVF9TaGlmdEpJUykgewogICAgIGJSZXQgPSBSZXRyaWV2ZVNwZWNpZmljRm9udChjaGFyU2V0LCBERUZBVUxUX1BJVENIIHwgRkZfRE9OVENBUkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNUyBNaW5jaG8iLCBsZik7Ci0gIH0gZWxzZSBpZiAoY2hhclNldCA9PSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQpIHsKKyAgfSBlbHNlIGlmIChjaGFyU2V0ID09IEZYX0NIQVJTRVRfQ2hpbmVzZVNpbXBsaWZpZWQpIHsKICAgICBiUmV0ID0gUmV0cmlldmVTcGVjaWZpY0ZvbnQoY2hhclNldCwgREVGQVVMVF9QSVRDSCB8IEZGX0RPTlRDQVJFLCAiU2ltU3VuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGYpOwotICB9IGVsc2UgaWYgKGNoYXJTZXQgPT0gRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQpIHsKKyAgfSBlbHNlIGlmIChjaGFyU2V0ID09IEZYX0NIQVJTRVRfQ2hpbmVzZVRyYWRpdGlvbmFsKSB7CiAgICAgYlJldCA9IFJldHJpZXZlU3BlY2lmaWNGb250KGNoYXJTZXQsIERFRkFVTFRfUElUQ0ggfCBGRl9ET05UQ0FSRSwgIk1pbmdMaVUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZik7CiAgIH0KQEAgLTc5OCw5ICs3NjcsOSBAQAogICBpZiAoIXBEb2N1bWVudCkKICAgICByZXR1cm4gbnVsbHB0cjsKIAotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXwogICBMT0dGT05UQSBsZjsKLSAgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSA9IEdldE5hdGl2ZUZvbnQoY2hhclNldCwgJmxmKTsKKyAgQnl0ZVN0cmluZyBjc0ZvbnROYW1lID0gR2V0TmF0aXZlRm9udChjaGFyU2V0LCAmbGYpOwogICBpZiAoIWNzRm9udE5hbWUuSXNFbXB0eSgpKSB7CiAgICAgaWYgKGNzRm9udE5hbWUgPT0gIkhlbHZldGljYSIpCiAgICAgICByZXR1cm4gQWRkU3RhbmRhcmRGb250KHBEb2N1bWVudCwgY3NGb250TmFtZSk7CkBAIC04MTQsNjUgKzc4Myw3IEBACiAgIHJldHVybiBwRG9jdW1lbnQgPyBBZGROYXRpdmVGb250KEdldE5hdGl2ZUNoYXJTZXQoKSwgcERvY3VtZW50KSA6IG51bGxwdHI7CiB9CiAKLWJvb2wgQ1BERl9JbnRlckZvcm06OlZhbGlkYXRlRmllbGROYW1lKAotICAgIENGWF9XaWRlU3RyaW5nJiBjc05ld0ZpZWxkTmFtZSwKLSAgICBpbnQgaVR5cGUsCi0gICAgY29uc3QgQ1BERl9Gb3JtRmllbGQqIHBFeGNsdWRlZEZpZWxkLAotICAgIGNvbnN0IENQREZfRm9ybUNvbnRyb2wqIHBFeGNsdWRlZENvbnRyb2wpIGNvbnN0IHsKLSAgaWYgKGNzTmV3RmllbGROYW1lLklzRW1wdHkoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW50IGlQb3MgPSAwOwotICBpbnQgaUxlbmd0aCA9IGNzTmV3RmllbGROYW1lLkdldExlbmd0aCgpOwotICBDRlhfV2lkZVN0cmluZyBjc1N1YjsKLSAgd2hpbGUgKHRydWUpIHsKLSAgICB3aGlsZSAoaVBvcyA8IGlMZW5ndGggJiYKLSAgICAgICAgICAgKGNzTmV3RmllbGROYW1lW2lQb3NdID09IEwnLicgfHwgY3NOZXdGaWVsZE5hbWVbaVBvc10gPT0gTCcgJykpIHsKLSAgICAgIGlQb3MrKzsKLSAgICB9Ci0gICAgaWYgKGlQb3MgPCBpTGVuZ3RoICYmICFjc1N1Yi5Jc0VtcHR5KCkpCi0gICAgICBjc1N1YiArPSBMJy4nOwotICAgIHdoaWxlIChpUG9zIDwgaUxlbmd0aCAmJiBjc05ld0ZpZWxkTmFtZVtpUG9zXSAhPSBMJy4nKQotICAgICAgY3NTdWIgKz0gY3NOZXdGaWVsZE5hbWVbaVBvcysrXTsKLSAgICBmb3IgKGludCBpID0gY3NTdWIuR2V0TGVuZ3RoKCkgLSAxOyBpID4gLTE7IGktLSkgewotICAgICAgaWYgKGNzU3ViW2ldICE9IEwnICcgJiYgY3NTdWJbaV0gIT0gTCcuJykKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNzU3ViLlNldEF0KGksIEwnXDAnKTsKLSAgICB9Ci0gICAgc2l6ZV90IGR3Q291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOwotICAgIGZvciAoc2l6ZV90IG0gPSAwOyBtIDwgZHdDb3VudDsgKyttKSB7Ci0gICAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gbV9wRmllbGRUcmVlLT5tX1Jvb3QuR2V0RmllbGRBdEluZGV4KG0pOwotICAgICAgaWYgKCFwRmllbGQpCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgaWYgKHBGaWVsZCA9PSBwRXhjbHVkZWRGaWVsZCkgewotICAgICAgICBpZiAoIXBFeGNsdWRlZENvbnRyb2wgfHwgcEZpZWxkLT5Db3VudENvbnRyb2xzKCkgPCAyKQotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NGdWxsTmFtZSA9IHBGaWVsZC0+R2V0RnVsbE5hbWUoKTsKLSAgICAgIGludCBpUmV0ID0gQ29tcGFyZUZpZWxkTmFtZShjc1N1YiwgY3NGdWxsTmFtZSk7Ci0gICAgICBpZiAoaVJldCA9PSAxKSB7Ci0gICAgICAgIGlmIChwRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IGlUeXBlKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0gZWxzZSBpZiAoaVJldCA9PSAyICYmIGNzU3ViID09IGNzTmV3RmllbGROYW1lKSB7Ci0gICAgICAgIGlmIChjc0Z1bGxOYW1lW2lQb3NdID09IEwnLicpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSBlbHNlIGlmIChpUmV0ID09IDMgJiYgY3NTdWIgPT0gY3NOZXdGaWVsZE5hbWUpIHsKLSAgICAgICAgaWYgKGNzTmV3RmllbGROYW1lW2NzRnVsbE5hbWUuR2V0TGVuZ3RoKCldID09IEwnLicpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoaVBvcyA+PSBpTGVuZ3RoKQotICAgICAgYnJlYWs7Ci0gIH0KLSAgaWYgKGNzU3ViLklzRW1wdHkoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgY3NOZXdGaWVsZE5hbWUgPSBjc1N1YjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXNpemVfdCBDUERGX0ludGVyRm9ybTo6Q291bnRGaWVsZHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKSBjb25zdCB7CitzaXplX3QgQ1BERl9JbnRlckZvcm06OkNvdW50RmllbGRzKGNvbnN0IFdpZGVTdHJpbmcmIGNzRmllbGROYW1lKSBjb25zdCB7CiAgIGlmIChjc0ZpZWxkTmFtZS5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuIG1fcEZpZWxkVHJlZS0+bV9Sb290LkNvdW50RmllbGRzKCk7CiAKQEAgLTg4MCw5ICs3OTEsOCBAQAogICByZXR1cm4gcE5vZGUgPyBwTm9kZS0+Q291bnRGaWVsZHMoKSA6IDA7CiB9CiAKLUNQREZfRm9ybUZpZWxkKiBDUERGX0ludGVyRm9ybTo6R2V0RmllbGQoCi0gICAgdWludDMyX3QgaW5kZXgsCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKSBjb25zdCB7CitDUERGX0Zvcm1GaWVsZCogQ1BERl9JbnRlckZvcm06OkdldEZpZWxkKHVpbnQzMl90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSkgY29uc3QgewogICBpZiAoY3NGaWVsZE5hbWUuSXNFbXB0eSgpKQogICAgIHJldHVybiBtX3BGaWVsZFRyZWUtPm1fUm9vdC5HZXRGaWVsZEF0SW5kZXgoaW5kZXgpOwogCkBAIC04OTUsNyArODA1LDcgQEAKICAgaWYgKCFwRmllbGREaWN0KQogICAgIHJldHVybiBudWxscHRyOwogCi0gIENGWF9XaWRlU3RyaW5nIGNzV05hbWUgPSBGUERGX0dldEZ1bGxOYW1lKHBGaWVsZERpY3QpOworICBXaWRlU3RyaW5nIGNzV05hbWUgPSBGUERGX0dldEZ1bGxOYW1lKHBGaWVsZERpY3QpOwogICByZXR1cm4gbV9wRmllbGRUcmVlLT5HZXRGaWVsZChjc1dOYW1lKTsKIH0KIApAQCAtOTY4LDE0ICs4NzgsMTQgQEAKIAogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBBcnJheS0+R2V0Q291bnQoKTsgaSsrKSB7CiAgICAgQ1BERl9PYmplY3QqIHBFbGVtZW50ID0gcEFycmF5LT5HZXREaXJlY3RPYmplY3RBdChpKTsKLSAgICBpZiAocEVsZW1lbnQgPT0gcEZpZWxkLT5tX3BEaWN0KQorICAgIGlmIChwRWxlbWVudCA9PSBwRmllbGQtPkdldERpY3QoKSkKICAgICAgIHJldHVybiBpOwogICB9CiAgIHJldHVybiAtMTsKIH0KIAotQ1BERl9Gb250KiBDUERGX0ludGVyRm9ybTo6R2V0Rm9ybUZvbnQoQ0ZYX0J5dGVTdHJpbmcgY3NOYW1lVGFnKSB7Ci0gIHJldHVybiBHZXRGb250KG1fcEZvcm1EaWN0LCBtX3BEb2N1bWVudCwgY3NOYW1lVGFnKTsKK0NQREZfRm9udCogQ1BERl9JbnRlckZvcm06OkdldEZvcm1Gb250KEJ5dGVTdHJpbmcgY3NOYW1lVGFnKSBjb25zdCB7CisgIHJldHVybiBHZXRGb250KG1fcEZvcm1EaWN0LkdldCgpLCBtX3BEb2N1bWVudC5HZXQoKSwgY3NOYW1lVGFnKTsKIH0KIAogQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBDUERGX0ludGVyRm9ybTo6R2V0RGVmYXVsdEFwcGVhcmFuY2UoKSBjb25zdCB7CkBAIC0xMDYwLDcgKzk3MCw3IEBACiB9CiAKIHZvaWQgQ1BERl9JbnRlckZvcm06OkZpeFBhZ2VGaWVsZHMoY29uc3QgQ1BERl9QYWdlKiBwUGFnZSkgewotICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBQYWdlLT5tX3BGb3JtRGljdDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBwUGFnZS0+bV9wRm9ybURpY3QuR2V0KCk7CiAgIGlmICghcFBhZ2VEaWN0KQogICAgIHJldHVybjsKIApAQCAtMTA3NSwxOCArOTg1LDE4IEBACiAgIH0KIH0KIAotQ1BERl9Gb3JtRmllbGQqIENQREZfSW50ZXJGb3JtOjpBZGRUZXJtaW5hbEZpZWxkKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCkgewordm9pZCBDUERGX0ludGVyRm9ybTo6QWRkVGVybWluYWxGaWVsZChDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpIHsKICAgaWYgKCFwRmllbGREaWN0LT5LZXlFeGlzdCgiRlQiKSkgewogICAgIC8vIEtleSAiRlQiIGlzIHJlcXVpcmVkIGZvciB0ZXJtaW5hbCBmaWVsZHMsIGl0IGlzIGFsc28gaW5oZXJpdGFibGUuCiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50RGljdCA9IHBGaWVsZERpY3QtPkdldERpY3RGb3IoIlBhcmVudCIpOwogICAgIGlmICghcFBhcmVudERpY3QgfHwgIXBQYXJlbnREaWN0LT5LZXlFeGlzdCgiRlQiKSkKLSAgICAgIHJldHVybiBudWxscHRyOworICAgICAgcmV0dXJuOwogICB9CiAKICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IHBGaWVsZERpY3Q7Ci0gIENGWF9XaWRlU3RyaW5nIGNzV05hbWUgPSBGUERGX0dldEZ1bGxOYW1lKHBGaWVsZERpY3QpOworICBXaWRlU3RyaW5nIGNzV05hbWUgPSBGUERGX0dldEZ1bGxOYW1lKHBGaWVsZERpY3QpOwogICBpZiAoY3NXTmFtZS5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuOwogCiAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBudWxscHRyOwogICBwRmllbGQgPSBtX3BGaWVsZFRyZWUtPkdldEZpZWxkKGNzV05hbWUpOwpAQCAtMTExMyw3ICsxMDIzLDggQEAKICAgICAgIH0KICAgICB9CiAKLSAgICBwRmllbGQgPSBuZXcgQ1BERl9Gb3JtRmllbGQodGhpcywgcFBhcmVudCk7CisgICAgYXV0byBuZXdGaWVsZCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0Zvcm1GaWVsZD4odGhpcywgcFBhcmVudCk7CisgICAgcEZpZWxkID0gbmV3RmllbGQuZ2V0KCk7CiAgICAgQ1BERl9PYmplY3QqIHBUT2JqID0gcERpY3QtPkdldE9iamVjdEZvcigiVCIpOwogICAgIGlmIChUb1JlZmVyZW5jZShwVE9iaikpIHsKICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gcENsb25lID0gcFRPYmotPkNsb25lRGlyZWN0T2JqZWN0KCk7CkBAIC0xMTIyLDcgKzEwMzMsOCBAQAogICAgICAgZWxzZQogICAgICAgICBwRGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIlQiLCAiIik7CiAgICAgfQotICAgIG1fcEZpZWxkVHJlZS0+U2V0RmllbGQoY3NXTmFtZSwgcEZpZWxkKTsKKyAgICBpZiAoIW1fcEZpZWxkVHJlZS0+U2V0RmllbGQoY3NXTmFtZSwgc3RkOjptb3ZlKG5ld0ZpZWxkKSkpCisgICAgICByZXR1cm47CiAgIH0KIAogICBDUERGX0FycmF5KiBwS2lkcyA9IHBGaWVsZERpY3QtPkdldEFycmF5Rm9yKCJLaWRzIik7CkBAIC0xMTQwLDcgKzEwNTIsNiBAQAogICAgIGlmIChwRmllbGREaWN0LT5HZXRTdHJpbmdGb3IoIlN1YnR5cGUiKSA9PSAiV2lkZ2V0IikKICAgICAgIEFkZENvbnRyb2wocEZpZWxkLCBwRmllbGREaWN0KTsKICAgfQotICByZXR1cm4gcEZpZWxkOwogfQogCiBDUERGX0Zvcm1Db250cm9sKiBDUERGX0ludGVyRm9ybTo6QWRkQ29udHJvbChDUERGX0Zvcm1GaWVsZCogcEZpZWxkLApAQCAtMTE1Miw3ICsxMDYzLDcgQEAKICAgYXV0byBwTmV3ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRm9ybUNvbnRyb2w+KHBGaWVsZCwgcFdpZGdldERpY3QpOwogICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IHBOZXcuZ2V0KCk7CiAgIG1fQ29udHJvbE1hcFtwV2lkZ2V0RGljdF0gPSBzdGQ6Om1vdmUocE5ldyk7Ci0gIHBGaWVsZC0+bV9Db250cm9sTGlzdC5wdXNoX2JhY2socENvbnRyb2wpOworICBwRmllbGQtPkFkZEZvcm1Db250cm9sKHBDb250cm9sKTsKICAgcmV0dXJuIHBDb250cm9sOwogfQogCkBAIC0xMTc5LDcgKzEwOTAsNyBAQAogICAgIGlmIChmaWVsZHMpCiAgICAgICBiRmluZCA9IHBkZml1bTo6Q29udGFpbnNWYWx1ZSgqZmllbGRzLCBwRmllbGQpOwogICAgIGlmIChiSW5jbHVkZU9yRXhjbHVkZSA9PSBiRmluZCkgewotICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0ID0gcEZpZWxkLT5tX3BEaWN0OworICAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0ID0gcEZpZWxkLT5HZXREaWN0KCk7CiAgICAgICBpZiAoKGR3RmxhZ3MgJiBGT1JNRkxBR19SRVFVSVJFRCkgIT0gMCAmJgogICAgICAgICAgIHBGaWVsZERpY3QtPkdldFN0cmluZ0ZvcigiViIpLklzRW1wdHkoKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMTkwLDcgKzExMDEsNyBAQAogfQogCiBzdGQ6OnVuaXF1ZV9wdHI8Q0ZERl9Eb2N1bWVudD4gQ1BERl9JbnRlckZvcm06OkV4cG9ydFRvRkRGKAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcGRmX3BhdGgsCisgICAgY29uc3QgV2lkZVN0cmluZyYgcGRmX3BhdGgsCiAgICAgYm9vbCBiU2ltcGxlRmlsZVNwZWMpIGNvbnN0IHsKICAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBmaWVsZHM7CiAgIHNpemVfdCBuQ291bnQgPSBtX3BGaWVsZFRyZWUtPm1fUm9vdC5Db3VudEZpZWxkcygpOwpAQCAtMTIwMCw3ICsxMTExLDcgQEAKIH0KIAogc3RkOjp1bmlxdWVfcHRyPENGREZfRG9jdW1lbnQ+IENQREZfSW50ZXJGb3JtOjpFeHBvcnRUb0ZERigKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHBkZl9wYXRoLAorICAgIGNvbnN0IFdpZGVTdHJpbmcmIHBkZl9wYXRoLAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4mIGZpZWxkcywKICAgICBib29sIGJJbmNsdWRlT3JFeGNsdWRlLAogICAgIGJvb2wgYlNpbXBsZUZpbGVTcGVjKSBjb25zdCB7CkBAIC0xMjExLDE1ICsxMTIyLDE4IEBACiAgIENQREZfRGljdGlvbmFyeSogcE1haW5EaWN0ID0gcERvYy0+R2V0Um9vdCgpLT5HZXREaWN0Rm9yKCJGREYiKTsKICAgaWYgKCFwZGZfcGF0aC5Jc0VtcHR5KCkpIHsKICAgICBpZiAoYlNpbXBsZUZpbGVTcGVjKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c0ZpbGVQYXRoID0gQ1BERl9GaWxlU3BlYzo6RW5jb2RlRmlsZU5hbWUocGRmX3BhdGgpOworICAgICAgV2lkZVN0cmluZyB3c0ZpbGVQYXRoID0gQ1BERl9GaWxlU3BlYzo6RW5jb2RlRmlsZU5hbWUocGRmX3BhdGgpOwogICAgICAgcE1haW5EaWN0LT5TZXROZXdGb3I8Q1BERl9TdHJpbmc+KAotICAgICAgICAgICJGIiwgQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHdzRmlsZVBhdGgpLCBmYWxzZSk7CisgICAgICAgICAgIkYiLCBCeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh3c0ZpbGVQYXRoKSwgZmFsc2UpOwogICAgICAgcE1haW5EaWN0LT5TZXROZXdGb3I8Q1BERl9TdHJpbmc+KCJVRiIsIFBERl9FbmNvZGVUZXh0KHdzRmlsZVBhdGgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKICAgICB9IGVsc2UgewotICAgICAgQ1BERl9GaWxlU3BlYyBmaWxlc3BlYyhwRG9jLT5HZXRCeXRlU3RyaW5nUG9vbCgpKTsKKyAgICAgIGF1dG8gcE5ld0RpY3QgPQorICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KHBEb2MtPkdldEJ5dGVTdHJpbmdQb29sKCkpOworICAgICAgcE5ld0RpY3QtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJUeXBlIiwgIkZpbGVzcGVjIik7CisgICAgICBDUERGX0ZpbGVTcGVjIGZpbGVzcGVjKHBOZXdEaWN0LmdldCgpKTsKICAgICAgIGZpbGVzcGVjLlNldEZpbGVOYW1lKHBkZl9wYXRoKTsKLSAgICAgIHBNYWluRGljdC0+U2V0Rm9yKCJGIiwgcGRmaXVtOjpXcmFwVW5pcXVlKGZpbGVzcGVjLkdldE9iaigpKSk7CisgICAgICBwTWFpbkRpY3QtPlNldEZvcigiRiIsIHN0ZDo6bW92ZShwTmV3RGljdCkpOwogICAgIH0KICAgfQogCkBAIC0xMjM1LDI0ICsxMTQ5LDI2IEBACiAgICAgICBjb250aW51ZTsKIAogICAgIGlmIChiSW5jbHVkZU9yRXhjbHVkZSA9PSBwZGZpdW06OkNvbnRhaW5zVmFsdWUoZmllbGRzLCBwRmllbGQpKSB7Ci0gICAgICBpZiAoKGR3RmxhZ3MgJiAweDAyKSAhPSAwICYmIHBGaWVsZC0+bV9wRGljdC0+R2V0U3RyaW5nRm9yKCJWIikuSXNFbXB0eSgpKQorICAgICAgaWYgKChkd0ZsYWdzICYgMHgwMikgIT0gMCAmJgorICAgICAgICAgIHBGaWVsZC0+R2V0RGljdCgpLT5HZXRTdHJpbmdGb3IoIlYiKS5Jc0VtcHR5KCkpIHsKICAgICAgICAgY29udGludWU7CisgICAgICB9CiAKLSAgICAgIENGWF9XaWRlU3RyaW5nIGZ1bGxuYW1lID0gRlBERl9HZXRGdWxsTmFtZShwRmllbGQtPkdldEZpZWxkRGljdCgpKTsKKyAgICAgIFdpZGVTdHJpbmcgZnVsbG5hbWUgPSBGUERGX0dldEZ1bGxOYW1lKHBGaWVsZC0+R2V0RmllbGREaWN0KCkpOwogICAgICAgYXV0byBwRmllbGREaWN0ID0KICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PihwRG9jLT5HZXRCeXRlU3RyaW5nUG9vbCgpKTsKICAgICAgIHBGaWVsZERpY3QtPlNldE5ld0ZvcjxDUERGX1N0cmluZz4oIlQiLCBmdWxsbmFtZSk7CiAgICAgICBpZiAocEZpZWxkLT5HZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OkNoZWNrQm94IHx8CiAgICAgICAgICAgcEZpZWxkLT5HZXRUeXBlKCkgPT0gQ1BERl9Gb3JtRmllbGQ6OlJhZGlvQnV0dG9uKSB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIGNzRXhwb3J0ID0gcEZpZWxkLT5HZXRDaGVja1ZhbHVlKGZhbHNlKTsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NCRXhwb3J0ID0gUERGX0VuY29kZVRleHQoY3NFeHBvcnQpOwotICAgICAgICBDUERGX09iamVjdCogcE9wdCA9IEZQREZfR2V0RmllbGRBdHRyKHBGaWVsZC0+bV9wRGljdCwgIk9wdCIpOworICAgICAgICBXaWRlU3RyaW5nIGNzRXhwb3J0ID0gcEZpZWxkLT5HZXRDaGVja1ZhbHVlKGZhbHNlKTsKKyAgICAgICAgQnl0ZVN0cmluZyBjc0JFeHBvcnQgPSBQREZfRW5jb2RlVGV4dChjc0V4cG9ydCk7CisgICAgICAgIENQREZfT2JqZWN0KiBwT3B0ID0gRlBERl9HZXRGaWVsZEF0dHIocEZpZWxkLT5HZXREaWN0KCksICJPcHQiKTsKICAgICAgICAgaWYgKHBPcHQpCiAgICAgICAgICAgcEZpZWxkRGljdC0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigiViIsIGNzQkV4cG9ydCwgZmFsc2UpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgcEZpZWxkRGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIlYiLCBjc0JFeHBvcnQpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgQ1BERl9PYmplY3QqIHBWID0gRlBERl9HZXRGaWVsZEF0dHIocEZpZWxkLT5tX3BEaWN0LCAiViIpOworICAgICAgICBDUERGX09iamVjdCogcFYgPSBGUERGX0dldEZpZWxkQXR0cihwRmllbGQtPkdldERpY3QoKSwgIlYiKTsKICAgICAgICAgaWYgKHBWKQogICAgICAgICAgIHBGaWVsZERpY3QtPlNldEZvcigiViIsIHBWLT5DbG9uZURpcmVjdE9iamVjdCgpKTsKICAgICAgIH0KQEAgLTEyNjMsMTAgKzExNzksMTAgQEAKIH0KIAogdm9pZCBDUERGX0ludGVyRm9ybTo6RkRGX0ltcG9ydEZpZWxkKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgcGFyZW50X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgcGFyZW50X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuTGV2ZWwpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgbmFtZTsKKyAgV2lkZVN0cmluZyBuYW1lOwogICBpZiAoIXBhcmVudF9uYW1lLklzRW1wdHkoKSkKICAgICBuYW1lID0gcGFyZW50X25hbWUgKyBMIi4iOwogCkBAIC0xMjg5LDEzICsxMjA1LDE0IEBACiAgIGlmICghcEZpZWxkKQogICAgIHJldHVybjsKIAotICBDRlhfV2lkZVN0cmluZyBjc1dWYWx1ZSA9IEdldEZpZWxkVmFsdWUoKnBGaWVsZERpY3QsIG1fYnNFbmNvZGluZyk7Ci0gIGludCBpVHlwZSA9IHBGaWVsZC0+R2V0RmllbGRUeXBlKCk7CisgIFdpZGVTdHJpbmcgY3NXVmFsdWUgPSBHZXRGaWVsZFZhbHVlKCpwRmllbGREaWN0LCBtX2JzRW5jb2RpbmcpOworICBGb3JtRmllbGRUeXBlIGZpZWxkVHlwZSA9IHBGaWVsZC0+R2V0RmllbGRUeXBlKCk7CiAgIGlmIChiTm90aWZ5ICYmIG1fcEZvcm1Ob3RpZnkpIHsKLSAgICBpZiAoaVR5cGUgPT0gRklFTERUWVBFX0xJU1RCT1gpIHsKKyAgICBpZiAoZmllbGRUeXBlID09IEZvcm1GaWVsZFR5cGU6OmtMaXN0Qm94KSB7CiAgICAgICBpZiAobV9wRm9ybU5vdGlmeS0+QmVmb3JlU2VsZWN0aW9uQ2hhbmdlKHBGaWVsZCwgY3NXVmFsdWUpIDwgMCkKICAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAoaVR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YIHx8IGlUeXBlID09IEZJRUxEVFlQRV9URVhURklFTEQpIHsKKyAgICB9IGVsc2UgaWYgKGZpZWxkVHlwZSA9PSBGb3JtRmllbGRUeXBlOjprQ29tYm9Cb3ggfHwKKyAgICAgICAgICAgICAgIGZpZWxkVHlwZSA9PSBGb3JtRmllbGRUeXBlOjprVGV4dEZpZWxkKSB7CiAgICAgICBpZiAobV9wRm9ybU5vdGlmeS0+QmVmb3JlVmFsdWVDaGFuZ2UocEZpZWxkLCBjc1dWYWx1ZSkgPCAwKQogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTMwNCwxNyArMTIyMSwxOSBAQAogICBDUERGX0Zvcm1GaWVsZDo6VHlwZSBlVHlwZSA9IHBGaWVsZC0+R2V0VHlwZSgpOwogICBpZiAoKGVUeXBlID09IENQREZfRm9ybUZpZWxkOjpMaXN0Qm94IHx8IGVUeXBlID09IENQREZfRm9ybUZpZWxkOjpDb21ib0JveCkgJiYKICAgICAgIHBGaWVsZERpY3QtPktleUV4aXN0KCJPcHQiKSkgewotICAgIHBGaWVsZC0+bV9wRGljdC0+U2V0Rm9yKAotICAgICAgICAiT3B0IiwgcEZpZWxkRGljdC0+R2V0RGlyZWN0T2JqZWN0Rm9yKCJPcHQiKS0+Q2xvbmVEaXJlY3RPYmplY3QoKSk7CisgICAgcEZpZWxkLT5TZXRPcHQocEZpZWxkRGljdC0+R2V0RGlyZWN0T2JqZWN0Rm9yKCJPcHQiKS0+Q2xvbmVEaXJlY3RPYmplY3QoKSk7CiAgIH0KIAogICBpZiAoYk5vdGlmeSAmJiBtX3BGb3JtTm90aWZ5KSB7Ci0gICAgaWYgKGlUeXBlID09IEZJRUxEVFlQRV9DSEVDS0JPWCB8fCBpVHlwZSA9PSBGSUVMRFRZUEVfUkFESU9CVVRUT04pCisgICAgaWYgKGZpZWxkVHlwZSA9PSBGb3JtRmllbGRUeXBlOjprQ2hlY2tCb3ggfHwKKyAgICAgICAgZmllbGRUeXBlID09IEZvcm1GaWVsZFR5cGU6OmtSYWRpb0J1dHRvbikgewogICAgICAgbV9wRm9ybU5vdGlmeS0+QWZ0ZXJDaGVja2VkU3RhdHVzQ2hhbmdlKHBGaWVsZCk7Ci0gICAgZWxzZSBpZiAoaVR5cGUgPT0gRklFTERUWVBFX0xJU1RCT1gpCisgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUgPT0gRm9ybUZpZWxkVHlwZTo6a0xpc3RCb3gpIHsKICAgICAgIG1fcEZvcm1Ob3RpZnktPkFmdGVyU2VsZWN0aW9uQ2hhbmdlKHBGaWVsZCk7Ci0gICAgZWxzZSBpZiAoaVR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YIHx8IGlUeXBlID09IEZJRUxEVFlQRV9URVhURklFTEQpCisgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUgPT0gRm9ybUZpZWxkVHlwZTo6a0NvbWJvQm94IHx8CisgICAgICAgICAgICAgICBmaWVsZFR5cGUgPT0gRm9ybUZpZWxkVHlwZTo6a1RleHRGaWVsZCkgewogICAgICAgbV9wRm9ybU5vdGlmeS0+QWZ0ZXJWYWx1ZUNoYW5nZShwRmllbGQpOworICAgIH0KICAgfQogfQogCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3BkZl9pbnRlcmZvcm0uaCBiL2NvcmUvZnBkZmRvYy9jcGRmX2ludGVyZm9ybS5oCmluZGV4IGNiYWFhN2IuLmUyNjczODQgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jcGRmX2ludGVyZm9ybS5oCisrKyBiL2NvcmUvZnBkZmRvYy9jcGRmX2ludGVyZm9ybS5oCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfZGVmYXVsdGFwcGVhcmFuY2UuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogCiBjbGFzcyBDRmllbGRUcmVlOwogY2xhc3MgQ0ZERl9Eb2N1bWVudDsKQEAgLTI5LDcgKzMwLDcgQEAKIAogQ1BERl9Gb250KiBBZGROYXRpdmVJbnRlckZvcm1Gb250KENQREZfRGljdGlvbmFyeSomIHBGb3JtRGljdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZVRhZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0cmluZyogY3NOYW1lVGFnKTsKIAogY2xhc3MgQ1BERl9JbnRlckZvcm0gewogIHB1YmxpYzoKQEAgLTM4LDIwICszOSwxOSBAQAogCiAgIHN0YXRpYyB2b2lkIFNldFVwZGF0ZUFQKGJvb2wgYlVwZGF0ZUFQKTsKICAgc3RhdGljIGJvb2wgSXNVcGRhdGVBUEVuYWJsZWQoKTsKLSAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdlbmVyYXRlTmV3UmVzb3VyY2VOYW1lKGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJlc0RpY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBjc1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaU1pbkxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGNzUHJlZml4KTsKKyAgc3RhdGljIEJ5dGVTdHJpbmcgR2VuZXJhdGVOZXdSZXNvdXJjZU5hbWUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY3NUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaU1pbkxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY3NQcmVmaXgpOwogICBzdGF0aWMgQ1BERl9Gb250KiBBZGRTdGFuZGFyZEZvbnQoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY3NGb250TmFtZSk7Ci0gIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXROYXRpdmVGb250KHVpbnQ4X3QgaUNoYXJTZXQsIHZvaWQqIHBMb2dGb250KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHJpbmcgY3NGb250TmFtZSk7CisgIHN0YXRpYyBCeXRlU3RyaW5nIEdldE5hdGl2ZUZvbnQodWludDhfdCBpQ2hhclNldCwgdm9pZCogcExvZ0ZvbnQpOwogICBzdGF0aWMgdWludDhfdCBHZXROYXRpdmVDaGFyU2V0KCk7CiAgIHN0YXRpYyBDUERGX0ZvbnQqIEFkZE5hdGl2ZUZvbnQodWludDhfdCBpQ2hhclNldCwgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50KTsKICAgc3RhdGljIENQREZfRm9udCogQWRkTmF0aXZlRm9udChDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpOwogCi0gIHNpemVfdCBDb3VudEZpZWxkcyhjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NGaWVsZE5hbWUpIGNvbnN0OwotICBDUERGX0Zvcm1GaWVsZCogR2V0RmllbGQodWludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NGaWVsZE5hbWUpIGNvbnN0OworICBzaXplX3QgQ291bnRGaWVsZHMoY29uc3QgV2lkZVN0cmluZyYgY3NGaWVsZE5hbWUpIGNvbnN0OworICBDUERGX0Zvcm1GaWVsZCogR2V0RmllbGQodWludDMyX3QgaW5kZXgsIGNvbnN0IFdpZGVTdHJpbmcmIGNzRmllbGROYW1lKSBjb25zdDsKICAgQ1BERl9Gb3JtRmllbGQqIEdldEZpZWxkQnlEaWN0KENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCkgY29uc3Q7CiAKICAgQ1BERl9Gb3JtQ29udHJvbCogR2V0Q29udHJvbEF0UG9pbnQoQ1BERl9QYWdlKiBwUGFnZSwKQEAgLTY0LDE4ICs2NCwxOCBAQAogICBDUERGX0Zvcm1GaWVsZCogR2V0RmllbGRJbkNhbGN1bGF0aW9uT3JkZXIoaW50IGluZGV4KTsKICAgaW50IEZpbmRGaWVsZEluQ2FsY3VsYXRpb25PcmRlcihjb25zdCBDUERGX0Zvcm1GaWVsZCogcEZpZWxkKTsKIAotICBDUERGX0ZvbnQqIEdldEZvcm1Gb250KENGWF9CeXRlU3RyaW5nIGNzTmFtZVRhZyk7CisgIENQREZfRm9udCogR2V0Rm9ybUZvbnQoQnl0ZVN0cmluZyBjc05hbWVUYWcpIGNvbnN0OwogICBDUERGX0RlZmF1bHRBcHBlYXJhbmNlIEdldERlZmF1bHRBcHBlYXJhbmNlKCkgY29uc3Q7CiAgIGludCBHZXRGb3JtQWxpZ25tZW50KCkgY29uc3Q7CiAKICAgYm9vbCBDaGVja1JlcXVpcmVkRmllbGRzKGNvbnN0IHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4qIGZpZWxkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkluY2x1ZGVPckV4Y2x1ZGUpIGNvbnN0OwogCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRkRGX0RvY3VtZW50PiBFeHBvcnRUb0ZERihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHBkZl9wYXRoLAorICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZERl9Eb2N1bWVudD4gRXhwb3J0VG9GREYoY29uc3QgV2lkZVN0cmluZyYgcGRmX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaW1wbGVGaWxlU3BlYykgY29uc3Q7CiAKICAgc3RkOjp1bmlxdWVfcHRyPENGREZfRG9jdW1lbnQ+IEV4cG9ydFRvRkRGKAotICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwZGZfcGF0aCwKKyAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHBkZl9wYXRoLAogICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiYgZmllbGRzLAogICAgICAgYm9vbCBiSW5jbHVkZU9yRXhjbHVkZSwKICAgICAgIGJvb2wgYlNpbXBsZUZpbGVTcGVjKSBjb25zdDsKQEAgLTg5LDMyICs4OSwyOSBAQAogICBib29sIEhhc1hGQUZvcm0oKSBjb25zdDsKICAgdm9pZCBGaXhQYWdlRmllbGRzKGNvbnN0IENQREZfUGFnZSogcFBhZ2UpOwogCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIENQREZfRm9ybUNvbnRyb2w7Ci0gIGZyaWVuZCBjbGFzcyBDUERGX0Zvcm1GaWVsZDsKKyAgSVBERl9Gb3JtTm90aWZ5KiBHZXRGb3JtTm90aWZ5KCkgY29uc3QgeyByZXR1cm4gbV9wRm9ybU5vdGlmeS5HZXQoKTsgfQorICBDUERGX0RvY3VtZW50KiBHZXREb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcERvY3VtZW50LkdldCgpOyB9CisgIENQREZfRGljdGlvbmFyeSogR2V0Rm9ybURpY3QoKSBjb25zdCB7IHJldHVybiBtX3BGb3JtRGljdC5HZXQoKTsgfQogCisgcHJpdmF0ZToKICAgdm9pZCBMb2FkRmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0LCBpbnQgbkxldmVsKTsKLSAgQ1BERl9Gb3JtRmllbGQqIEFkZFRlcm1pbmFsRmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGREaWN0KTsKKyAgdm9pZCBBZGRUZXJtaW5hbEZpZWxkKENQREZfRGljdGlvbmFyeSogcEZpZWxkRGljdCk7CiAgIENQREZfRm9ybUNvbnRyb2wqIEFkZENvbnRyb2woQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBXaWRnZXREaWN0KTsKICAgdm9pZCBGREZfSW1wb3J0RmllbGQoQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBwYXJlbnRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgcGFyZW50X25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk5vdGlmeSA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkxldmVsID0gMCk7Ci0gIGJvb2wgVmFsaWRhdGVGaWVsZE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIGNzTmV3RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0Zvcm1GaWVsZCogcEV4Y2x1ZGVkRmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9Gb3JtQ29udHJvbCogcEV4Y2x1ZGVkQ29udHJvbCkgY29uc3Q7CiAKICAgc3RhdGljIGJvb2wgc19iVXBkYXRlQVA7CiAKLSAgQ1BERl9Eb2N1bWVudCogY29uc3QgbV9wRG9jdW1lbnQ7Ci0gIENQREZfRGljdGlvbmFyeSogbV9wRm9ybURpY3Q7CisgIFVub3duZWRQdHI8Q1BERl9Eb2N1bWVudD4gY29uc3QgbV9wRG9jdW1lbnQ7CisgIFVub3duZWRQdHI8Q1BERl9EaWN0aW9uYXJ5PiBtX3BGb3JtRGljdDsKICAgc3RkOjptYXA8Y29uc3QgQ1BERl9EaWN0aW9uYXJ5Kiwgc3RkOjp1bmlxdWVfcHRyPENQREZfRm9ybUNvbnRyb2w+PgogICAgICAgbV9Db250cm9sTWFwOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZpZWxkVHJlZT4gbV9wRmllbGRUcmVlOwotICBDRlhfQnl0ZVN0cmluZyBtX2JzRW5jb2Rpbmc7Ci0gIElQREZfRm9ybU5vdGlmeSogbV9wRm9ybU5vdGlmeTsKKyAgQnl0ZVN0cmluZyBtX2JzRW5jb2Rpbmc7CisgIFVub3duZWRQdHI8SVBERl9Gb3JtTm90aWZ5PiBtX3BGb3JtTm90aWZ5OwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZET0NfQ1BERl9JTlRFUkZPUk1fSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jcGRmX2xpbmsuY3BwIGIvY29yZS9mcGRmZG9jL2NwZGZfbGluay5jcHAKaW5kZXggMjBlYzQ4Ni4uZjdhZWM0MCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfbGluay5jcHAKKysrIGIvY29yZS9mcGRmZG9jL2NwZGZfbGluay5jcHAKQEAgLTksNiArOSwxNCBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX25hbWV0cmVlLmgiCiAKK0NQREZfTGluazo6Q1BERl9MaW5rKCkge30KKworQ1BERl9MaW5rOjpDUERGX0xpbmsoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgOiBtX3BEaWN0KHBEaWN0KSB7fQorCitDUERGX0xpbms6OkNQREZfTGluayhjb25zdCBDUERGX0xpbmsmIHRoYXQpID0gZGVmYXVsdDsKKworQ1BERl9MaW5rOjp+Q1BERl9MaW5rKCkge30KKwogQ0ZYX0Zsb2F0UmVjdCBDUERGX0xpbms6OkdldFJlY3QoKSB7CiAgIHJldHVybiBtX3BEaWN0LT5HZXRSZWN0Rm9yKCJSZWN0Iik7CiB9CkBAIC0yMCw3ICsyOCw3IEBACiAKICAgaWYgKHBEZXN0LT5Jc1N0cmluZygpIHx8IHBEZXN0LT5Jc05hbWUoKSkgewogICAgIENQREZfTmFtZVRyZWUgbmFtZV90cmVlKHBEb2MsICJEZXN0cyIpOwotICAgIHJldHVybiBDUERGX0Rlc3QobmFtZV90cmVlLkxvb2t1cE5hbWVkRGVzdChwRG9jLCBwRGVzdC0+R2V0U3RyaW5nKCkpKTsKKyAgICByZXR1cm4gQ1BERl9EZXN0KG5hbWVfdHJlZS5Mb29rdXBOYW1lZERlc3QocERvYywgcERlc3QtPkdldFVuaWNvZGVUZXh0KCkpKTsKICAgfQogICBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcERlc3QtPkFzQXJyYXkoKSkKICAgICByZXR1cm4gQ1BERl9EZXN0KHBBcnJheSk7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3BkZl9saW5rLmggYi9jb3JlL2ZwZGZkb2MvY3BkZl9saW5rLmgKaW5kZXggMTYyNjMwZC4uMTgyMDBjYyAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfbGluay5oCisrKyBiL2NvcmUvZnBkZmRvYy9jcGRmX2xpbmsuaApAQCAtMTAsMjIgKzEwLDI0IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfYWN0aW9uLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfZGVzdC5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAKIGNsYXNzIENQREZfRGljdGlvbmFyeTsKIAogY2xhc3MgQ1BERl9MaW5rIHsKICBwdWJsaWM6Ci0gIENQREZfTGluaygpIDogbV9wRGljdChudWxscHRyKSB7fQotICBleHBsaWNpdCBDUERGX0xpbmsoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCkgOiBtX3BEaWN0KHBEaWN0KSB7fQorICBDUERGX0xpbmsoKTsKKyAgZXhwbGljaXQgQ1BERl9MaW5rKENQREZfRGljdGlvbmFyeSogcERpY3QpOworICBDUERGX0xpbmsoY29uc3QgQ1BERl9MaW5rJiB0aGF0KTsKKyAgfkNQREZfTGluaygpOwogCi0gIENQREZfRGljdGlvbmFyeSogR2V0RGljdCgpIGNvbnN0IHsgcmV0dXJuIG1fcERpY3Q7IH0KLQorICBDUERGX0RpY3Rpb25hcnkqIEdldERpY3QoKSBjb25zdCB7IHJldHVybiBtX3BEaWN0LkdldCgpOyB9CiAgIENGWF9GbG9hdFJlY3QgR2V0UmVjdCgpOwogICBDUERGX0Rlc3QgR2V0RGVzdChDUERGX0RvY3VtZW50KiBwRG9jKTsKICAgQ1BERl9BY3Rpb24gR2V0QWN0aW9uKCk7CiAKICBwcml2YXRlOgotICBDUERGX0RpY3Rpb25hcnkqIG1fcERpY3Q7CisgIFVub3duZWRQdHI8Q1BERl9EaWN0aW9uYXJ5PiBtX3BEaWN0OwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZET0NfQ1BERl9MSU5LX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3BkZl9tZXRhZGF0YS5jcHAgYi9jb3JlL2ZwZGZkb2MvY3BkZl9tZXRhZGF0YS5jcHAKaW5kZXggNWUzYWNiZS4uZWZlM2MyOSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfbWV0YWRhdGEuY3BwCisrKyBiL2NvcmUvZnBkZmRvYy9jcGRmX21ldGFkYXRhLmNwcApAQCAtOSwxMCArOSwxMCBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtX2FjYy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfeG1sLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY3htbF9lbGVtZW50LmgiCiAKLUNQREZfTWV0YWRhdGE6OkNQREZfTWV0YWRhdGEoQ1BERl9Eb2N1bWVudCogcERvYykgewotICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gcERvYy0+R2V0Um9vdCgpOworQ1BERl9NZXRhZGF0YTo6Q1BERl9NZXRhZGF0YShjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jKSB7CisgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBwRG9jLT5HZXRSb290KCk7CiAgIGlmICghcFJvb3QpCiAgICAgcmV0dXJuOwogCkBAIC0yMCw5ICsyMCw5IEBACiAgIGlmICghcFN0cmVhbSkKICAgICByZXR1cm47CiAKLSAgQ1BERl9TdHJlYW1BY2MgYWNjOwotICBhY2MuTG9hZEFsbERhdGEocFN0cmVhbSwgZmFsc2UpOwotICBtX3BYbWxFbGVtZW50ID0gQ1hNTF9FbGVtZW50OjpQYXJzZShhY2MuR2V0RGF0YSgpLCBhY2MuR2V0U2l6ZSgpKTsKKyAgYXV0byBwQWNjID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfU3RyZWFtQWNjPihwU3RyZWFtKTsKKyAgcEFjYy0+TG9hZEFsbERhdGFGaWx0ZXJlZCgpOworICBtX3BYbWxFbGVtZW50ID0gQ1hNTF9FbGVtZW50OjpQYXJzZShwQWNjLT5HZXREYXRhKCksIHBBY2MtPkdldFNpemUoKSk7CiB9CiAKIENQREZfTWV0YWRhdGE6On5DUERGX01ldGFkYXRhKCkge30KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jcGRmX21ldGFkYXRhLmggYi9jb3JlL2ZwZGZkb2MvY3BkZl9tZXRhZGF0YS5oCmluZGV4IGRkNjhkZGEuLmZhOTU4MTUgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jcGRmX21ldGFkYXRhLmgKKysrIGIvY29yZS9mcGRmZG9jL2NwZGZfbWV0YWRhdGEuaApAQCAtMTQsNyArMTQsNyBAQAogCiBjbGFzcyBDUERGX01ldGFkYXRhIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IENQREZfTWV0YWRhdGEoQ1BERl9Eb2N1bWVudCogcERvYyk7CisgIGV4cGxpY2l0IENQREZfTWV0YWRhdGEoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvYyk7CiAgIH5DUERGX01ldGFkYXRhKCk7CiAKICAgY29uc3QgQ1hNTF9FbGVtZW50KiBHZXRSb290KCkgY29uc3Q7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3BkZl9uYW1ldHJlZS5jcHAgYi9jb3JlL2ZwZGZkb2MvY3BkZl9uYW1ldHJlZS5jcHAKaW5kZXggYjhkMWViMC4uM2M1YjA4ZCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfbmFtZXRyZWUuY3BwCisrKyBiL2NvcmUvZnBkZmRvYy9jcGRmX25hbWV0cmVlLmNwcApAQCAtNiw1OCArNiwyMDcgQEAKIAogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX25hbWV0cmVlLmgiCiAKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKwogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RvY3VtZW50LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmgiCiAKIG5hbWVzcGFjZSB7CiAKLWNvbnN0IGludCBuTWF4UmVjdXJzaW9uID0gMzI7Citjb25zdGV4cHIgaW50IGtOYW1lVHJlZU1heFJlY3Vyc2lvbiA9IDMyOwogCi1DUERGX09iamVjdCogU2VhcmNoTmFtZU5vZGUoQ1BERl9EaWN0aW9uYXJ5KiBwTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCYgbkluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQXJyYXkqKiBwcEZpbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5MZXZlbCA9IDApIHsKLSAgaWYgKG5MZXZlbCA+IG5NYXhSZWN1cnNpb24pCitzdGQ6OnBhaXI8V2lkZVN0cmluZywgV2lkZVN0cmluZz4gR2V0Tm9kZUxpbWl0c01heWJlU3dhcChDUERGX0FycmF5KiBwTGltaXRzKSB7CisgIEFTU0VSVChwTGltaXRzKTsKKyAgV2lkZVN0cmluZyBjc0xlZnQgPSBwTGltaXRzLT5HZXRVbmljb2RlVGV4dEF0KDApOworICBXaWRlU3RyaW5nIGNzUmlnaHQgPSBwTGltaXRzLT5HZXRVbmljb2RlVGV4dEF0KDEpOworICAvLyBJZiB0aGUgbG93ZXIgbGltaXQgaXMgZ3JlYXRlciB0aGFuIHRoZSB1cHBlciBsaW1pdCwgc3dhcCB0aGVtLgorICBpZiAoY3NMZWZ0LkNvbXBhcmUoY3NSaWdodCkgPiAwKSB7CisgICAgcExpbWl0cy0+U2V0TmV3QXQ8Q1BERl9TdHJpbmc+KDAsIGNzUmlnaHQpOworICAgIHBMaW1pdHMtPlNldE5ld0F0PENQREZfU3RyaW5nPigxLCBjc0xlZnQpOworICAgIGNzTGVmdCA9IHBMaW1pdHMtPkdldFVuaWNvZGVUZXh0QXQoMCk7CisgICAgY3NSaWdodCA9IHBMaW1pdHMtPkdldFVuaWNvZGVUZXh0QXQoMSk7CisgIH0KKyAgcmV0dXJuIHtjc0xlZnQsIGNzUmlnaHR9OworfQorCisvLyBHZXQgdGhlIGxpbWl0IGFycmF5cyB0aGF0IGxlYWYgYXJyYXkgfHBGaW5kfCBpcyB1bmRlciBpbiB0aGUgdHJlZSB3aXRoIHJvb3QKKy8vIHxwTm9kZXwuIHxwTGltaXRzfCB3aWxsIGhvbGQgYWxsIHRoZSBsaW1pdCBhcnJheXMgZnJvbSB0aGUgbGVhZiB1cCB0byBiZWZvcmUKKy8vIHRoZSByb290LiBSZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLgorYm9vbCBHZXROb2RlQW5jZXN0b3JzTGltaXRzKGNvbnN0IENQREZfRGljdGlvbmFyeSogcE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9BcnJheSogcEZpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDUERGX0FycmF5Kj4qIHBMaW1pdHMpIHsKKyAgaWYgKG5MZXZlbCA+IGtOYW1lVHJlZU1heFJlY3Vyc2lvbikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKHBOb2RlLT5HZXRBcnJheUZvcigiTmFtZXMiKSA9PSBwRmluZCkgeworICAgIHBMaW1pdHMtPnB1c2hfYmFjayhwTm9kZS0+R2V0QXJyYXlGb3IoIkxpbWl0cyIpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIENQREZfQXJyYXkqIHBLaWRzID0gcE5vZGUtPkdldEFycmF5Rm9yKCJLaWRzIik7CisgIGlmICghcEtpZHMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcEtpZHMtPkdldENvdW50KCk7ICsraSkgeworICAgIENQREZfRGljdGlvbmFyeSogcEtpZCA9IHBLaWRzLT5HZXREaWN0QXQoaSk7CisgICAgaWYgKCFwS2lkKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoR2V0Tm9kZUFuY2VzdG9yc0xpbWl0cyhwS2lkLCBwRmluZCwgbkxldmVsICsgMSwgcExpbWl0cykpIHsKKyAgICAgIHBMaW1pdHMtPnB1c2hfYmFjayhwTm9kZS0+R2V0QXJyYXlGb3IoIkxpbWl0cyIpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFVwb24gdGhlIGRlbGV0aW9uIG9mIHxjc05hbWV8IGZyb20gbGVhZiBhcnJheSB8cEZpbmR8LCB1cGRhdGUgdGhlIGFuY2VzdG9ycworLy8gb2YgfHBGaW5kfC4gU3BlY2lmaWNhbGx5LCB0aGUgbGltaXRzIG9mIHxwRmluZHwncyBhbmNlc3RvcnMgd2lsbCBiZSB1cGRhdGVkCisvLyBpZiBuZWVkZWQsIGFuZCBhbnkgYW5jZXN0b3JzIHRoYXQgYXJlIG5vdyBlbXB0eSB3aWxsIGJlIHJlbW92ZWQuCitib29sIFVwZGF0ZU5vZGVzQW5kTGltaXRzVXBvbkRlbGV0aW9uKENQREZfRGljdGlvbmFyeSogcE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfQXJyYXkqIHBGaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBjc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuTGV2ZWwpIHsKKyAgaWYgKG5MZXZlbCA+IGtOYW1lVHJlZU1heFJlY3Vyc2lvbikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQ1BERl9BcnJheSogcExpbWl0cyA9IHBOb2RlLT5HZXRBcnJheUZvcigiTGltaXRzIik7CisgIFdpZGVTdHJpbmcgY3NMZWZ0OworICBXaWRlU3RyaW5nIGNzUmlnaHQ7CisgIGlmIChwTGltaXRzKQorICAgIHN0ZDo6dGllKGNzTGVmdCwgY3NSaWdodCkgPSBHZXROb2RlTGltaXRzTWF5YmVTd2FwKHBMaW1pdHMpOworCisgIENQREZfQXJyYXkqIHBOYW1lcyA9IHBOb2RlLT5HZXRBcnJheUZvcigiTmFtZXMiKTsKKyAgaWYgKHBOYW1lcykgeworICAgIGlmIChwTmFtZXMgIT0gcEZpbmQpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHBOYW1lcy0+SXNFbXB0eSgpIHx8ICFwTGltaXRzKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKGNzTGVmdCAhPSBjc05hbWUgJiYgY3NSaWdodCAhPSBjc05hbWUpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIFNpbmNlIHxjc05hbWV8IGRlZmluZXMgfHBOb2RlfCdzIGxpbWl0cywgd2UgbmVlZCB0byBsb29wIHRocm91Z2ggdGhlCisgICAgLy8gbmFtZXMgdG8gZmluZCB0aGUgbmV3IGxvd2VyIGFuZCB1cHBlciBsaW1pdHMuCisgICAgV2lkZVN0cmluZyBjc05ld0xlZnQgPSBjc1JpZ2h0OworICAgIFdpZGVTdHJpbmcgY3NOZXdSaWdodCA9IGNzTGVmdDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBOYW1lcy0+R2V0Q291bnQoKSAvIDI7ICsraSkgeworICAgICAgV2lkZVN0cmluZyB3c05hbWUgPSBwTmFtZXMtPkdldFVuaWNvZGVUZXh0QXQoaSAqIDIpOworICAgICAgaWYgKHdzTmFtZS5Db21wYXJlKGNzTmV3TGVmdCkgPCAwKQorICAgICAgICBjc05ld0xlZnQgPSB3c05hbWU7CisgICAgICBpZiAod3NOYW1lLkNvbXBhcmUoY3NOZXdSaWdodCkgPiAwKQorICAgICAgICBjc05ld1JpZ2h0ID0gd3NOYW1lOworICAgIH0KKyAgICBwTGltaXRzLT5TZXROZXdBdDxDUERGX1N0cmluZz4oMCwgY3NOZXdMZWZ0KTsKKyAgICBwTGltaXRzLT5TZXROZXdBdDxDUERGX1N0cmluZz4oMSwgY3NOZXdSaWdodCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBDUERGX0FycmF5KiBwS2lkcyA9IHBOb2RlLT5HZXRBcnJheUZvcigiS2lkcyIpOworICBpZiAoIXBLaWRzKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBMb29wIHRocm91Z2ggdGhlIGtpZHMgdG8gZmluZCB0aGUgbGVhZiBhcnJheSB8cEZpbmR8LgorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBLaWRzLT5HZXRDb3VudCgpOyArK2kpIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBLaWQgPSBwS2lkcy0+R2V0RGljdEF0KGkpOworICAgIGlmICghcEtpZCkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmICghVXBkYXRlTm9kZXNBbmRMaW1pdHNVcG9uRGVsZXRpb24ocEtpZCwgcEZpbmQsIGNzTmFtZSwgbkxldmVsICsgMSkpCisgICAgICBjb250aW51ZTsKKworICAgIC8vIFJlbW92ZSB0aGlzIGNoaWxkIG5vZGUgaWYgaXQncyBlbXB0eS4KKyAgICBpZiAoKHBLaWQtPktleUV4aXN0KCJOYW1lcyIpICYmIHBLaWQtPkdldEFycmF5Rm9yKCJOYW1lcyIpLT5Jc0VtcHR5KCkpIHx8CisgICAgICAgIChwS2lkLT5LZXlFeGlzdCgiS2lkcyIpICYmIHBLaWQtPkdldEFycmF5Rm9yKCJLaWRzIiktPklzRW1wdHkoKSkpIHsKKyAgICAgIHBLaWRzLT5SZW1vdmVBdChpKTsKKyAgICB9CisgICAgaWYgKHBLaWRzLT5Jc0VtcHR5KCkgfHwgIXBMaW1pdHMpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoY3NMZWZ0ICE9IGNzTmFtZSAmJiBjc1JpZ2h0ICE9IGNzTmFtZSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gU2luY2UgfGNzTmFtZXwgZGVmaW5lcyB8cE5vZGV8J3MgbGltaXRzLCB3ZSBuZWVkIHRvIGxvb3AgdGhyb3VnaCB0aGUKKyAgICAvLyBraWRzIHRvIGZpbmQgdGhlIG5ldyBsb3dlciBhbmQgdXBwZXIgbGltaXRzLgorICAgIFdpZGVTdHJpbmcgY3NOZXdMZWZ0ID0gY3NSaWdodDsKKyAgICBXaWRlU3RyaW5nIGNzTmV3UmlnaHQgPSBjc0xlZnQ7CisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwS2lkcy0+R2V0Q291bnQoKTsgKytqKSB7CisgICAgICBDUERGX0FycmF5KiBwS2lkTGltaXRzID0gcEtpZHMtPkdldERpY3RBdChqKS0+R2V0QXJyYXlGb3IoIkxpbWl0cyIpOworICAgICAgQVNTRVJUKHBLaWRMaW1pdHMpOworICAgICAgaWYgKHBLaWRMaW1pdHMtPkdldFVuaWNvZGVUZXh0QXQoMCkuQ29tcGFyZShjc05ld0xlZnQpIDwgMCkKKyAgICAgICAgY3NOZXdMZWZ0ID0gcEtpZExpbWl0cy0+R2V0VW5pY29kZVRleHRBdCgwKTsKKyAgICAgIGlmIChwS2lkTGltaXRzLT5HZXRVbmljb2RlVGV4dEF0KDEpLkNvbXBhcmUoY3NOZXdSaWdodCkgPiAwKQorICAgICAgICBjc05ld1JpZ2h0ID0gcEtpZExpbWl0cy0+R2V0VW5pY29kZVRleHRBdCgxKTsKKyAgICB9CisgICAgcExpbWl0cy0+U2V0TmV3QXQ8Q1BERl9TdHJpbmc+KDAsIGNzTmV3TGVmdCk7CisgICAgcExpbWl0cy0+U2V0TmV3QXQ8Q1BERl9TdHJpbmc+KDEsIGNzTmV3UmlnaHQpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gU2VhcmNoIGZvciB8Y3NOYW1lfCBpbiB0aGUgdHJlZSB3aXRoIHJvb3QgfHBOb2RlfC4gSWYgc3VjY2Vzc2Z1bCwgcmV0dXJuIHRoZQorLy8gdmFsdWUgdGhhdCB8Y3NOYW1lfCBwb2ludHMgdG87IHxuSW5kZXh8IHdpbGwgYmUgdGhlIGluZGV4IG9mIHxjc05hbWV8LAorLy8gfHBwRmluZHwgd2lsbCBiZSB0aGUgbGVhZiBhcnJheSB0aGF0IHxjc05hbWV8IGlzIGZvdW5kIGluLCBhbmQgfHBGaW5kSW5kZXh8CisvLyB3aWxsIGJlIHRoZSBpbmRleCBvZiB8Y3NOYW1lfCBpbiB8cHBGaW5kfC4gSWYgfGNzTmFtZXwgaXMgbm90IGZvdW5kLCB8cHBGaW5kfAorLy8gd2lsbCBiZSB0aGUgbGVhZiBhcnJheSB0aGF0IHxjc05hbWV8IHNob3VsZCBiZSBhZGRlZCB0bywgYW5kIHxwRmluZEluZGV4fAorLy8gd2lsbCBiZSB0aGUgaW5kZXggdGhhdCBpdCBzaG91bGQgYmUgYWRkZWQgYXQuCitDUERGX09iamVjdCogU2VhcmNoTmFtZU5vZGVCeU5hbWUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBjc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIG5JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0FycmF5KiogcHBGaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcEZpbmRJbmRleCkgeworICBpZiAobkxldmVsID4ga05hbWVUcmVlTWF4UmVjdXJzaW9uKQogICAgIHJldHVybiBudWxscHRyOwogCiAgIENQREZfQXJyYXkqIHBMaW1pdHMgPSBwTm9kZS0+R2V0QXJyYXlGb3IoIkxpbWl0cyIpOworICBDUERGX0FycmF5KiBwTmFtZXMgPSBwTm9kZS0+R2V0QXJyYXlGb3IoIk5hbWVzIik7CiAgIGlmIChwTGltaXRzKSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NMZWZ0ID0gcExpbWl0cy0+R2V0U3RyaW5nQXQoMCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NSaWdodCA9IHBMaW1pdHMtPkdldFN0cmluZ0F0KDEpOwotICAgIGlmIChjc0xlZnQuQ29tcGFyZShjc1JpZ2h0LkFzU3RyaW5nQygpKSA+IDApIHsKLSAgICAgIENGWF9CeXRlU3RyaW5nIGNzVG1wID0gY3NSaWdodDsKLSAgICAgIGNzUmlnaHQgPSBjc0xlZnQ7Ci0gICAgICBjc0xlZnQgPSBjc1RtcDsKLSAgICB9Ci0gICAgaWYgKGNzTmFtZS5Db21wYXJlKGNzTGVmdC5Bc1N0cmluZ0MoKSkgPCAwIHx8Ci0gICAgICAgIGNzTmFtZS5Db21wYXJlKGNzUmlnaHQuQXNTdHJpbmdDKCkpID4gMCkgeworICAgIFdpZGVTdHJpbmcgY3NMZWZ0OworICAgIFdpZGVTdHJpbmcgY3NSaWdodDsKKyAgICBzdGQ6OnRpZShjc0xlZnQsIGNzUmlnaHQpID0gR2V0Tm9kZUxpbWl0c01heWJlU3dhcChwTGltaXRzKTsKKyAgICAvLyBTa2lwIHRoaXMgbm9kZSBpZiB0aGUgbmFtZSB0byBsb29rIGZvciBpcyBzbWFsbGVyIHRoYW4gaXRzIGxvd2VyIGxpbWl0LgorICAgIGlmIChjc05hbWUuQ29tcGFyZShjc0xlZnQpIDwgMCkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgLy8gU2tpcCB0aGlzIG5vZGUgaWYgdGhlIG5hbWUgdG8gbG9vayBmb3IgaXMgZ3JlYXRlciB0aGFuIGl0cyBoaWdoZXIgbGltaXQsCisgICAgLy8gYW5kIHRoZSBub2RlIGl0c2VsZiBpcyBhIGxlYWYgbm9kZS4KKyAgICBpZiAoY3NOYW1lLkNvbXBhcmUoY3NSaWdodCkgPiAwICYmIHBOYW1lcykgeworICAgICAgaWYgKHBwRmluZCkKKyAgICAgICAgKnBwRmluZCA9IHBOYW1lczsKKyAgICAgIGlmIChwRmluZEluZGV4KQorICAgICAgICAqcEZpbmRJbmRleCA9IHBOYW1lcy0+R2V0Q291bnQoKSAvIDIgLSAxOworCiAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9CiAgIH0KIAotICBDUERGX0FycmF5KiBwTmFtZXMgPSBwTm9kZS0+R2V0QXJyYXlGb3IoIk5hbWVzIik7CisgIC8vIElmIHRoZSBub2RlIGlzIGEgbGVhZiBub2RlLCBsb29rIGZvciB0aGUgbmFtZSBpbiBpdHMgbmFtZXMgYXJyYXkuCiAgIGlmIChwTmFtZXMpIHsKICAgICBzaXplX3QgZHdDb3VudCA9IHBOYW1lcy0+R2V0Q291bnQoKSAvIDI7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkd0NvdW50OyBpKyspIHsKLSAgICAgIENGWF9CeXRlU3RyaW5nIGNzVmFsdWUgPSBwTmFtZXMtPkdldFN0cmluZ0F0KGkgKiAyKTsKLSAgICAgIGludDMyX3QgaUNvbXBhcmUgPSBjc1ZhbHVlLkNvbXBhcmUoY3NOYW1lLkFzU3RyaW5nQygpKTsKLSAgICAgIGlmIChpQ29tcGFyZSA8PSAwKSB7Ci0gICAgICAgIGlmIChwcEZpbmQpCi0gICAgICAgICAgKnBwRmluZCA9IHBOYW1lczsKLSAgICAgICAgaWYgKGlDb21wYXJlIDwgMCkKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgIH0gZWxzZSB7CisgICAgICBXaWRlU3RyaW5nIGNzVmFsdWUgPSBwTmFtZXMtPkdldFVuaWNvZGVUZXh0QXQoaSAqIDIpOworICAgICAgaW50MzJfdCBpQ29tcGFyZSA9IGNzVmFsdWUuQ29tcGFyZShjc05hbWUpOworICAgICAgaWYgKGlDb21wYXJlID4gMCkKICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBuSW5kZXggKz0gaTsKKyAgICAgIGlmIChwcEZpbmQpCisgICAgICAgICpwcEZpbmQgPSBwTmFtZXM7CisgICAgICBpZiAocEZpbmRJbmRleCkKKyAgICAgICAgKnBGaW5kSW5kZXggPSBpOworICAgICAgaWYgKGlDb21wYXJlIDwgMCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgICpuSW5kZXggKz0gaTsKICAgICAgIHJldHVybiBwTmFtZXMtPkdldERpcmVjdE9iamVjdEF0KGkgKiAyICsgMSk7CiAgICAgfQotICAgIG5JbmRleCArPSBkd0NvdW50OworICAgICpuSW5kZXggKz0gZHdDb3VudDsKICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQogCisgIC8vIFNlYXJjaCB0aHJvdWdoIHRoZSBub2RlJ3MgY2hpbGRyZW4uCiAgIENQREZfQXJyYXkqIHBLaWRzID0gcE5vZGUtPkdldEFycmF5Rm9yKCJLaWRzIik7CiAgIGlmICghcEtpZHMpCiAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC02Nyw1MiArMjE2LDYzIEBACiAgICAgaWYgKCFwS2lkKQogICAgICAgY29udGludWU7CiAKLSAgICBDUERGX09iamVjdCogcEZvdW5kID0KLSAgICAgICAgU2VhcmNoTmFtZU5vZGUocEtpZCwgY3NOYW1lLCBuSW5kZXgsIHBwRmluZCwgbkxldmVsICsgMSk7CisgICAgQ1BERl9PYmplY3QqIHBGb3VuZCA9IFNlYXJjaE5hbWVOb2RlQnlOYW1lKHBLaWQsIGNzTmFtZSwgbkxldmVsICsgMSwgbkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcEZpbmQsIHBGaW5kSW5kZXgpOwogICAgIGlmIChwRm91bmQpCiAgICAgICByZXR1cm4gcEZvdW5kOwogICB9CiAgIHJldHVybiBudWxscHRyOwogfQogCi1DUERGX09iamVjdCogU2VhcmNoTmFtZU5vZGUoQ1BERl9EaWN0aW9uYXJ5KiBwTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbkluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCYgbkN1ckluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSoqIHBwRmluZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkxldmVsID0gMCkgewotICBpZiAobkxldmVsID4gbk1heFJlY3Vyc2lvbikKKy8vIEdldCB0aGUga2V5LXZhbHVlIHBhaXIgYXQgfG5JbmRleHwgaW4gdGhlIHRyZWUgd2l0aCByb290IHxwTm9kZXwuIElmCisvLyBzdWNjZXNzZnVsLCByZXR1cm4gdGhlIHZhbHVlIG9iamVjdDsgfGNzTmFtZXwgd2lsbCBiZSB0aGUga2V5LCB8cHBGaW5kfAorLy8gd2lsbCBiZSB0aGUgbGVhZiBhcnJheSB0aGF0IHRoaXMgcGFpciBpcyBpbiwgYW5kIHxwRmluZEluZGV4fCB3aWxsIGJlIHRoZQorLy8gaW5kZXggb2YgdGhlIHBhaXIgaW4gfHBGaW5kfC4KK0NQREZfT2JqZWN0KiBTZWFyY2hOYW1lTm9kZUJ5SW5kZXgoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBuQ3VySW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcqIGNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BcnJheSoqIHBwRmluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwRmluZEluZGV4KSB7CisgIGlmIChuTGV2ZWwgPiBrTmFtZVRyZWVNYXhSZWN1cnNpb24pCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKICAgQ1BERl9BcnJheSogcE5hbWVzID0gcE5vZGUtPkdldEFycmF5Rm9yKCJOYW1lcyIpOwogICBpZiAocE5hbWVzKSB7CiAgICAgc2l6ZV90IG5Db3VudCA9IHBOYW1lcy0+R2V0Q291bnQoKSAvIDI7Ci0gICAgaWYgKG5JbmRleCA+PSBuQ3VySW5kZXggKyBuQ291bnQpIHsKLSAgICAgIG5DdXJJbmRleCArPSBuQ291bnQ7CisgICAgaWYgKG5JbmRleCA+PSAqbkN1ckluZGV4ICsgbkNvdW50KSB7CisgICAgICAqbkN1ckluZGV4ICs9IG5Db3VudDsKICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KICAgICBpZiAocHBGaW5kKQogICAgICAgKnBwRmluZCA9IHBOYW1lczsKLSAgICBjc05hbWUgPSBwTmFtZXMtPkdldFN0cmluZ0F0KChuSW5kZXggLSBuQ3VySW5kZXgpICogMik7Ci0gICAgcmV0dXJuIHBOYW1lcy0+R2V0RGlyZWN0T2JqZWN0QXQoKG5JbmRleCAtIG5DdXJJbmRleCkgKiAyICsgMSk7CisgICAgaWYgKHBGaW5kSW5kZXgpCisgICAgICAqcEZpbmRJbmRleCA9IG5JbmRleCAtICpuQ3VySW5kZXg7CisKKyAgICAqY3NOYW1lID0gcE5hbWVzLT5HZXRVbmljb2RlVGV4dEF0KChuSW5kZXggLSAqbkN1ckluZGV4KSAqIDIpOworICAgIHJldHVybiBwTmFtZXMtPkdldERpcmVjdE9iamVjdEF0KChuSW5kZXggLSAqbkN1ckluZGV4KSAqIDIgKyAxKTsKICAgfQorCiAgIENQREZfQXJyYXkqIHBLaWRzID0gcE5vZGUtPkdldEFycmF5Rm9yKCJLaWRzIik7CiAgIGlmICghcEtpZHMpCiAgICAgcmV0dXJuIG51bGxwdHI7CisKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwS2lkcy0+R2V0Q291bnQoKTsgaSsrKSB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkID0gcEtpZHMtPkdldERpY3RBdChpKTsKICAgICBpZiAoIXBLaWQpCiAgICAgICBjb250aW51ZTsKLSAgICBDUERGX09iamVjdCogcEZvdW5kID0KLSAgICAgICAgU2VhcmNoTmFtZU5vZGUocEtpZCwgbkluZGV4LCBuQ3VySW5kZXgsIGNzTmFtZSwgcHBGaW5kLCBuTGV2ZWwgKyAxKTsKKyAgICBDUERGX09iamVjdCogcEZvdW5kID0gU2VhcmNoTmFtZU5vZGVCeUluZGV4KAorICAgICAgICBwS2lkLCBuSW5kZXgsIG5MZXZlbCArIDEsIG5DdXJJbmRleCwgY3NOYW1lLCBwcEZpbmQsIHBGaW5kSW5kZXgpOwogICAgIGlmIChwRm91bmQpCiAgICAgICByZXR1cm4gcEZvdW5kOwogICB9CiAgIHJldHVybiBudWxscHRyOwogfQogCi1zaXplX3QgQ291bnROYW1lcyhDUERGX0RpY3Rpb25hcnkqIHBOb2RlLCBpbnQgbkxldmVsID0gMCkgewotICBpZiAobkxldmVsID4gbk1heFJlY3Vyc2lvbikKKy8vIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIGtleS12YWx1ZSBwYWlycyBpbiB0aGUgdHJlZSB3aXRoIHJvb3QgfHBOb2RlfC4KK3NpemVfdCBDb3VudE5hbWVzSW50ZXJuYWwoQ1BERl9EaWN0aW9uYXJ5KiBwTm9kZSwgaW50IG5MZXZlbCkgeworICBpZiAobkxldmVsID4ga05hbWVUcmVlTWF4UmVjdXJzaW9uKQogICAgIHJldHVybiAwOwogCiAgIENQREZfQXJyYXkqIHBOYW1lcyA9IHBOb2RlLT5HZXRBcnJheUZvcigiTmFtZXMiKTsKQEAgLTEyOSwxNyArMjg5LDE5IEBACiAgICAgaWYgKCFwS2lkKQogICAgICAgY29udGludWU7CiAKLSAgICBuQ291bnQgKz0gQ291bnROYW1lcyhwS2lkLCBuTGV2ZWwgKyAxKTsKKyAgICBuQ291bnQgKz0gQ291bnROYW1lc0ludGVybmFsKHBLaWQsIG5MZXZlbCArIDEpOwogICB9CiAgIHJldHVybiBuQ291bnQ7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZQogCi1DUERGX05hbWVUcmVlOjpDUERGX05hbWVUcmVlKENQREZfRG9jdW1lbnQqIHBEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjYXRlZ29yeSkKK0NQREZfTmFtZVRyZWU6OkNQREZfTmFtZVRyZWUoQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCkgOiBtX3BSb290KHBSb290KSB7fQorCitDUERGX05hbWVUcmVlOjpDUERGX05hbWVUcmVlKGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIGNhdGVnb3J5KQogICAgIDogbV9wUm9vdChudWxscHRyKSB7Ci0gIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBwRG9jLT5HZXRSb290KCk7CisgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBwRG9jLT5HZXRSb290KCk7CiAgIGlmICghcFJvb3QpCiAgICAgcmV0dXJuOwogCkBAIC0xNTAsNDMgKzMxMiwxMjUgQEAKICAgbV9wUm9vdCA9IHBOYW1lcy0+R2V0RGljdEZvcihjYXRlZ29yeSk7CiB9CiAKK0NQREZfTmFtZVRyZWU6On5DUERGX05hbWVUcmVlKCkge30KKwogc2l6ZV90IENQREZfTmFtZVRyZWU6OkdldENvdW50KCkgY29uc3QgewotICByZXR1cm4gbV9wUm9vdCA/IDo6Q291bnROYW1lcyhtX3BSb290KSA6IDA7CisgIHJldHVybiBtX3BSb290ID8gQ291bnROYW1lc0ludGVybmFsKG1fcFJvb3QuR2V0KCksIDApIDogMDsKIH0KIAotaW50IENQREZfTmFtZVRyZWU6OkdldEluZGV4KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0IHsKK2ludCBDUERGX05hbWVUcmVlOjpHZXRJbmRleChjb25zdCBXaWRlU3RyaW5nJiBjc05hbWUpIGNvbnN0IHsKICAgaWYgKCFtX3BSb290KQogICAgIHJldHVybiAtMTsKIAogICBzaXplX3QgbkluZGV4ID0gMDsKLSAgaWYgKCFTZWFyY2hOYW1lTm9kZShtX3BSb290LCBjc05hbWUsIG5JbmRleCwgbnVsbHB0cikpCisgIGlmICghU2VhcmNoTmFtZU5vZGVCeU5hbWUobV9wUm9vdC5HZXQoKSwgY3NOYW1lLCAwLCAmbkluZGV4LCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKSB7CiAgICAgcmV0dXJuIC0xOworICB9CiAgIHJldHVybiBuSW5kZXg7CiB9CiAKLUNQREZfT2JqZWN0KiBDUERGX05hbWVUcmVlOjpMb29rdXBWYWx1ZShpbnQgbkluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0IHsKK2Jvb2wgQ1BERl9OYW1lVHJlZTo6QWRkVmFsdWVBbmROYW1lKHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gcE9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIG5hbWUpIHsKICAgaWYgKCFtX3BSb290KQotICAgIHJldHVybiBudWxscHRyOwotICBzaXplX3QgbkN1ckluZGV4ID0gMDsKLSAgcmV0dXJuIFNlYXJjaE5hbWVOb2RlKG1fcFJvb3QsIG5JbmRleCwgbkN1ckluZGV4LCBjc05hbWUsIG51bGxwdHIpOworICAgIHJldHVybiBmYWxzZTsKKworICBzaXplX3QgbkluZGV4ID0gMDsKKyAgQ1BERl9BcnJheSogcEZpbmQgPSBudWxscHRyOworICBpbnQgbkZpbmRJbmRleCA9IC0xOworICAvLyBGYWlsIGlmIHRoZSB0cmVlIGFscmVhZHkgY29udGFpbnMgdGhpcyBuYW1lIG9yIGlmIHRoZSB0cmVlIGlzIHRvbyBkZWVwLgorICBpZiAoU2VhcmNoTmFtZU5vZGVCeU5hbWUobV9wUm9vdC5HZXQoKSwgbmFtZSwgMCwgJm5JbmRleCwgJnBGaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5GaW5kSW5kZXgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gSWYgdGhlIHJldHVybmVkIHxwRmluZHwgaXMgYSBudWxscHRyLCB0aGVuIHxuYW1lfCBpcyBzbWFsbGVyIHRoYW4gYWxsCisgIC8vIGV4aXN0aW5nIGVudHJpZXMgaW4gdGhlIHRyZWUsIGFuZCB3ZSBkaWQgbm90IGZpbmQgYSBsZWFmIGFycmF5IHRvIHBsYWNlCisgIC8vIHxuYW1lfCBpbnRvLiBXZSBpbnN0ZWFkIHdpbGwgZmluZCB0aGUgbGVmdG1vc3QgbGVhZiBhcnJheSBpbiB3aGljaCB0byBwbGFjZQorICAvLyB8bmFtZXwgYW5kIHxwT2JqfC4KKyAgaWYgKCFwRmluZCkgeworICAgIHNpemVfdCBuQ3VySW5kZXggPSAwOworICAgIFdpZGVTdHJpbmcgY3NOYW1lOworICAgIFNlYXJjaE5hbWVOb2RlQnlJbmRleChtX3BSb290LkdldCgpLCAwLCAwLCAmbkN1ckluZGV4LCAmY3NOYW1lLCAmcEZpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICB9CisgIEFTU0VSVChwRmluZCk7CisKKyAgLy8gSW5zZXJ0IHRoZSBuYW1lIGFuZCB0aGUgb2JqZWN0IGludG8gdGhlIGxlYWYgYXJyYXkgZm91bmQuIE5vdGUgdGhhdCB0aGUKKyAgLy8gaW5zZXJ0aW9uIHBvc2l0aW9uIGlzIHJpZ2h0IGFmdGVyIHRoZSBrZXktdmFsdWUgcGFpciByZXR1cm5lZCBieSB8aW5kZXh8LgorICBzaXplX3Qgbk5hbWVJbmRleCA9IChuRmluZEluZGV4ICsgMSkgKiAyOworICBzaXplX3QgblZhbHVlSW5kZXggPSBuTmFtZUluZGV4ICsgMTsKKyAgcEZpbmQtPkluc2VydE5ld0F0PENQREZfU3RyaW5nPihuTmFtZUluZGV4LCBuYW1lKTsKKyAgcEZpbmQtPkluc2VydEF0KG5WYWx1ZUluZGV4LCBzdGQ6Om1vdmUocE9iaikpOworCisgIC8vIEV4cGFuZCB0aGUgbGltaXRzIHRoYXQgdGhlIG5ld2x5IGFkZGVkIG5hbWUgaXMgdW5kZXIsIGlmIHRoZSBuYW1lIGZhbGxzCisgIC8vIG91dHNpZGUgb2YgdGhlIGxpbWl0cyBvZiBpdHMgbGVhZiBhcnJheSBvciBhbnkgYXJyYXlzIGFib3ZlIGl0LgorICBzdGQ6OnZlY3RvcjxDUERGX0FycmF5Kj4gcExpbWl0czsKKyAgR2V0Tm9kZUFuY2VzdG9yc0xpbWl0cyhtX3BSb290LkdldCgpLCBwRmluZCwgMCwgJnBMaW1pdHMpOworICBmb3IgKGF1dG8qIHBMaW1pdCA6IHBMaW1pdHMpIHsKKyAgICBpZiAoIXBMaW1pdCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKG5hbWUuQ29tcGFyZShwTGltaXQtPkdldFVuaWNvZGVUZXh0QXQoMCkpIDwgMCkKKyAgICAgIHBMaW1pdC0+U2V0TmV3QXQ8Q1BERl9TdHJpbmc+KDAsIG5hbWUpOworCisgICAgaWYgKG5hbWUuQ29tcGFyZShwTGltaXQtPkdldFVuaWNvZGVUZXh0QXQoMSkpID4gMCkKKyAgICAgIHBMaW1pdC0+U2V0TmV3QXQ8Q1BERl9TdHJpbmc+KDEsIG5hbWUpOworICB9CisgIHJldHVybiB0cnVlOwogfQogCi1DUERGX09iamVjdCogQ1BERl9OYW1lVHJlZTo6TG9va3VwVmFsdWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzTmFtZSkgY29uc3QgeworYm9vbCBDUERGX05hbWVUcmVlOjpEZWxldGVWYWx1ZUFuZE5hbWUoaW50IG5JbmRleCkgeworICBpZiAoIW1fcFJvb3QpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHNpemVfdCBuQ3VySW5kZXggPSAwOworICBXaWRlU3RyaW5nIGNzTmFtZTsKKyAgQ1BERl9BcnJheSogcEZpbmQgPSBudWxscHRyOworICBpbnQgbkZpbmRJbmRleCA9IC0xOworICAvLyBGYWlsIGlmIHRoZSB0cmVlIGRvZXMgbm90IGNvbnRhaW4gfG5JbmRleHwuCisgIGlmICghU2VhcmNoTmFtZU5vZGVCeUluZGV4KG1fcFJvb3QuR2V0KCksIG5JbmRleCwgMCwgJm5DdXJJbmRleCwgJmNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBGaW5kLCAmbkZpbmRJbmRleCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBSZW1vdmUgdGhlIG5hbWUgYW5kIHRoZSBvYmplY3QgZnJvbSB0aGUgbGVhZiBhcnJheSB8cEZpbmR8LgorICBwRmluZC0+UmVtb3ZlQXQobkZpbmRJbmRleCAqIDIpOworICBwRmluZC0+UmVtb3ZlQXQobkZpbmRJbmRleCAqIDIpOworCisgIC8vIERlbGV0ZSBlbXB0eSBub2RlcyBhbmQgdXBkYXRlIHRoZSBsaW1pdHMgb2YgfHBGaW5kfCdzIGFuY2VzdG9ycyBhcyBuZWVkZWQuCisgIFVwZGF0ZU5vZGVzQW5kTGltaXRzVXBvbkRlbGV0aW9uKG1fcFJvb3QuR2V0KCksIHBGaW5kLCBjc05hbWUsIDApOworICByZXR1cm4gdHJ1ZTsKK30KKworQ1BERl9PYmplY3QqIENQREZfTmFtZVRyZWU6Okxvb2t1cFZhbHVlQW5kTmFtZShpbnQgbkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nKiBjc05hbWUpIGNvbnN0IHsKKyAgY3NOYW1lLT5jbGVhcigpOwogICBpZiAoIW1fcFJvb3QpCiAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgc2l6ZV90IG5DdXJJbmRleCA9IDA7CisgIHJldHVybiBTZWFyY2hOYW1lTm9kZUJ5SW5kZXgobV9wUm9vdC5HZXQoKSwgbkluZGV4LCAwLCAmbkN1ckluZGV4LCBjc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0cik7Cit9CisKK0NQREZfT2JqZWN0KiBDUERGX05hbWVUcmVlOjpMb29rdXBWYWx1ZShjb25zdCBXaWRlU3RyaW5nJiBjc05hbWUpIGNvbnN0IHsKKyAgaWYgKCFtX3BSb290KQorICAgIHJldHVybiBudWxscHRyOworCiAgIHNpemVfdCBuSW5kZXggPSAwOwotICByZXR1cm4gU2VhcmNoTmFtZU5vZGUobV9wUm9vdCwgY3NOYW1lLCBuSW5kZXgsIG51bGxwdHIpOworICByZXR1cm4gU2VhcmNoTmFtZU5vZGVCeU5hbWUobV9wUm9vdC5HZXQoKSwgY3NOYW1lLCAwLCAmbkluZGV4LCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CiB9CiAKIENQREZfQXJyYXkqIENQREZfTmFtZVRyZWU6Okxvb2t1cE5hbWVkRGVzdChDUERGX0RvY3VtZW50KiBwRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzTmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHNOYW1lKSB7CiAgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBMb29rdXBWYWx1ZShzTmFtZSk7CiAgIGlmICghcFZhbHVlKSB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGVzdHMgPSBwRG9jLT5HZXRSb290KCktPkdldERpY3RGb3IoIkRlc3RzIik7CiAgICAgaWYgKCFwRGVzdHMpCiAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICBwVmFsdWUgPSBwRGVzdHMtPkdldERpcmVjdE9iamVjdEZvcihzTmFtZSk7CisgICAgcFZhbHVlID0gcERlc3RzLT5HZXREaXJlY3RPYmplY3RGb3IoUERGX0VuY29kZVRleHQoc05hbWUpKTsKICAgfQogICBpZiAoIXBWYWx1ZSkKICAgICByZXR1cm4gbnVsbHB0cjsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jcGRmX25hbWV0cmVlLmggYi9jb3JlL2ZwZGZkb2MvY3BkZl9uYW1ldHJlZS5oCmluZGV4IGQ2NzYzYWQuLjcyZDBkNjYgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jcGRmX25hbWV0cmVlLmgKKysrIGIvY29yZS9mcGRmZG9jL2NwZGZfbmFtZXRyZWUuaApAQCAtNyw3ICs3LDEwIEBACiAjaWZuZGVmIENPUkVfRlBERkRPQ19DUERGX05BTUVUUkVFX0hfCiAjZGVmaW5lIENPUkVfRlBERkRPQ19DUERGX05BTUVUUkVFX0hfCiAKKyNpbmNsdWRlIDxtZW1vcnk+CisKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKIAogY2xhc3MgQ1BERl9BcnJheTsKIGNsYXNzIENQREZfRGljdGlvbmFyeTsKQEAgLTE2LDE5ICsxOSwyNCBAQAogCiBjbGFzcyBDUERGX05hbWVUcmVlIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IENQREZfTmFtZVRyZWUoQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCkgOiBtX3BSb290KHBSb290KSB7fQotICBDUERGX05hbWVUcmVlKENQREZfRG9jdW1lbnQqIHBEb2MsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjYXRlZ29yeSk7CisgIGV4cGxpY2l0IENQREZfTmFtZVRyZWUoQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCk7CisgIENQREZfTmFtZVRyZWUoY29uc3QgQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQnl0ZVN0cmluZyYgY2F0ZWdvcnkpOworICB+Q1BERl9OYW1lVHJlZSgpOwogCi0gIENQREZfT2JqZWN0KiBMb29rdXBWYWx1ZShpbnQgbkluZGV4LCBDRlhfQnl0ZVN0cmluZyYgY3NOYW1lKSBjb25zdDsKLSAgQ1BERl9PYmplY3QqIExvb2t1cFZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0OwotICBDUERGX0FycmF5KiBMb29rdXBOYW1lZERlc3QoQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNOYW1lKTsKKyAgYm9vbCBBZGRWYWx1ZUFuZE5hbWUoc3RkOjp1bmlxdWVfcHRyPENQREZfT2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBuYW1lKTsKKyAgYm9vbCBEZWxldGVWYWx1ZUFuZE5hbWUoaW50IG5JbmRleCk7CiAKLSAgaW50IEdldEluZGV4KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc05hbWUpIGNvbnN0OworICBDUERGX09iamVjdCogTG9va3VwVmFsdWVBbmROYW1lKGludCBuSW5kZXgsIFdpZGVTdHJpbmcqIGNzTmFtZSkgY29uc3Q7CisgIENQREZfT2JqZWN0KiBMb29rdXBWYWx1ZShjb25zdCBXaWRlU3RyaW5nJiBjc05hbWUpIGNvbnN0OworICBDUERGX0FycmF5KiBMb29rdXBOYW1lZERlc3QoQ1BERl9Eb2N1bWVudCogcERvYywgY29uc3QgV2lkZVN0cmluZyYgc05hbWUpOworCisgIGludCBHZXRJbmRleChjb25zdCBXaWRlU3RyaW5nJiBjc05hbWUpIGNvbnN0OwogICBzaXplX3QgR2V0Q291bnQoKSBjb25zdDsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRSb290KCkgY29uc3QgeyByZXR1cm4gbV9wUm9vdDsgfQorICBDUERGX0RpY3Rpb25hcnkqIEdldFJvb3QoKSBjb25zdCB7IHJldHVybiBtX3BSb290LkdldCgpOyB9CiAKICBwcml2YXRlOgotICBDUERGX0RpY3Rpb25hcnkqIG1fcFJvb3Q7CisgIFVub3duZWRQdHI8Q1BERl9EaWN0aW9uYXJ5PiBtX3BSb290OwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZET0NfQ1BERl9OQU1FVFJFRV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwZGZfbmFtZXRyZWVfdW5pdHRlc3QuY3BwIGIvY29yZS9mcGRmZG9jL2NwZGZfbmFtZXRyZWVfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YzMxNDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZkb2MvY3BkZl9uYW1ldHJlZV91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwyOTcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX25hbWV0cmVlLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbnVtYmVyLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmluZy5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworCit2b2lkIEFkZE5hbWVLZXlWYWx1ZShDUERGX0FycmF5KiBwTmFtZXMsIGNvbnN0IGNoYXIqIGtleSwgY29uc3QgaW50IHZhbHVlKSB7CisgIHBOYW1lcy0+QWRkTmV3PENQREZfU3RyaW5nPihrZXksIGZhbHNlKTsKKyAgcE5hbWVzLT5BZGROZXc8Q1BERl9OdW1iZXI+KHZhbHVlKTsKK30KKwordm9pZCBDaGVja05hbWVLZXlWYWx1ZShDUERGX0FycmF5KiBwTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioga2V5LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgdmFsdWUpIHsKKyAgRVhQRUNUX1NUUkVRKGtleSwgcE5hbWVzLT5HZXRTdHJpbmdBdChpbmRleCAqIDIpLmNfc3RyKCkpOworICBFWFBFQ1RfRVEodmFsdWUsIHBOYW1lcy0+R2V0SW50ZWdlckF0KGluZGV4ICogMiArIDEpKTsKK30KKwordm9pZCBBZGRMaW1pdHNBcnJheShDUERGX0RpY3Rpb25hcnkqIHBOb2RlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBsZWFzdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZ3JlYXRlc3QpIHsKKyAgQ1BERl9BcnJheSogcExpbWl0cyA9IHBOb2RlLT5TZXROZXdGb3I8Q1BERl9BcnJheT4oIkxpbWl0cyIpOworICBwTGltaXRzLT5BZGROZXc8Q1BERl9TdHJpbmc+KGxlYXN0LCBmYWxzZSk7CisgIHBMaW1pdHMtPkFkZE5ldzxDUERGX1N0cmluZz4oZ3JlYXRlc3QsIGZhbHNlKTsKK30KKwordm9pZCBDaGVja0xpbWl0c0FycmF5KENQREZfRGljdGlvbmFyeSogcE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGVhc3QsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZ3JlYXRlc3QpIHsKKyAgQ1BERl9BcnJheSogcExpbWl0cyA9IHBOb2RlLT5HZXRBcnJheUZvcigiTGltaXRzIik7CisgIEFTU0VSVF9UUlVFKHBMaW1pdHMpOworICBFWFBFQ1RfU1RSRVEobGVhc3QsIHBMaW1pdHMtPkdldFN0cmluZ0F0KDApLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoZ3JlYXRlc3QsIHBMaW1pdHMtPkdldFN0cmluZ0F0KDEpLmNfc3RyKCkpOworfQorCit2b2lkIEZpbGxOYW1lVHJlZURpY3QoQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdERpY3QpIHsKKyAgQ1BERl9BcnJheSogcEtpZHMgPSBwUm9vdERpY3QtPlNldE5ld0ZvcjxDUERGX0FycmF5PigiS2lkcyIpOworICBDUERGX0RpY3Rpb25hcnkqIHBLaWQxID0gcEtpZHMtPkFkZE5ldzxDUERGX0RpY3Rpb25hcnk+KCk7CisKKyAgLy8gTWFrZSB0aGUgbG93ZXIgYW5kIHVwcGVyIGxpbWl0IG91dCBvZiBvcmRlciBvbiBwdXJwb3NlLgorICBBZGRMaW1pdHNBcnJheShwS2lkMSwgIjkudHh0IiwgIjEudHh0Iik7CisgIHBLaWRzID0gcEtpZDEtPlNldE5ld0ZvcjxDUERGX0FycmF5PigiS2lkcyIpOworICBDUERGX0RpY3Rpb25hcnkqIHBLaWQyID0gcEtpZHMtPkFkZE5ldzxDUERGX0RpY3Rpb25hcnk+KCk7CisgIENQREZfRGljdGlvbmFyeSogcEtpZDMgPSBwS2lkcy0+QWRkTmV3PENQREZfRGljdGlvbmFyeT4oKTsKKworICBBZGRMaW1pdHNBcnJheShwS2lkMiwgIjEudHh0IiwgIjUudHh0Iik7CisgIHBLaWRzID0gcEtpZDItPlNldE5ld0ZvcjxDUERGX0FycmF5PigiS2lkcyIpOworICBDUERGX0RpY3Rpb25hcnkqIHBLaWQ0ID0gcEtpZHMtPkFkZE5ldzxDUERGX0RpY3Rpb25hcnk+KCk7CisgIENQREZfRGljdGlvbmFyeSogcEtpZDUgPSBwS2lkcy0+QWRkTmV3PENQREZfRGljdGlvbmFyeT4oKTsKKworICBBZGRMaW1pdHNBcnJheShwS2lkMywgIjkudHh0IiwgIjkudHh0Iik7CisgIENQREZfQXJyYXkqIHBOYW1lcyA9IHBLaWQzLT5TZXROZXdGb3I8Q1BERl9BcnJheT4oIk5hbWVzIik7CisgIEFkZE5hbWVLZXlWYWx1ZShwTmFtZXMsICI5LnR4dCIsIDk5OSk7CisKKyAgLy8gTWFrZSB0aGUgbG93ZXIgYW5kIHVwcGVyIGxpbWl0IG91dCBvZiBvcmRlciBvbiBwdXJwb3NlLgorICBBZGRMaW1pdHNBcnJheShwS2lkNCwgIjIudHh0IiwgIjEudHh0Iik7CisgIHBOYW1lcyA9IHBLaWQ0LT5TZXROZXdGb3I8Q1BERl9BcnJheT4oIk5hbWVzIik7CisgIEFkZE5hbWVLZXlWYWx1ZShwTmFtZXMsICIxLnR4dCIsIDExMSk7CisgIEFkZE5hbWVLZXlWYWx1ZShwTmFtZXMsICIyLnR4dCIsIDIyMik7CisKKyAgQWRkTGltaXRzQXJyYXkocEtpZDUsICIzLnR4dCIsICI1LnR4dCIpOworICBwTmFtZXMgPSBwS2lkNS0+U2V0TmV3Rm9yPENQREZfQXJyYXk+KCJOYW1lcyIpOworICBBZGROYW1lS2V5VmFsdWUocE5hbWVzLCAiMy50eHQiLCAzMzMpOworICBBZGROYW1lS2V5VmFsdWUocE5hbWVzLCAiNS50eHQiLCA1NTUpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVChjcGRmX25hbWV0cmVlLCBHZXRVbmljb2RlTmFtZVdpdGhCT00pIHsKKyAgLy8gU2V0IHVwIHRoZSByb290IGRpY3Rpb25hcnkgd2l0aCBhIE5hbWVzIGFycmF5LgorICBhdXRvIHBSb290RGljdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCk7CisgIENQREZfQXJyYXkqIHBOYW1lcyA9IHBSb290RGljdC0+U2V0TmV3Rm9yPENQREZfQXJyYXk+KCJOYW1lcyIpOworCisgIC8vIEFkZCB0aGUga2V5ICIxIiAod2l0aCBCT00pIGFuZCB2YWx1ZSAxMDAgaW50byB0aGUgYXJyYXkuCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBidWY7CisgIGNvbnN0ZXhwciBjaGFyIGtEYXRhW10gPSAiXHhGRVx4RkZceDAwXHgzMSI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGtEYXRhKTsgKytpKQorICAgIGJ1Zi5wdXQoa0RhdGFbaV0pOworICBwTmFtZXMtPkFkZE5ldzxDUERGX1N0cmluZz4oQnl0ZVN0cmluZyhidWYpLCB0cnVlKTsKKyAgcE5hbWVzLT5BZGROZXc8Q1BERl9OdW1iZXI+KDEwMCk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUga2V5IGlzIGFzIGV4cGVjdGVkLgorICBDUERGX05hbWVUcmVlIG5hbWVUcmVlKHBSb290RGljdC5nZXQoKSk7CisgIFdpZGVTdHJpbmcgc3RvcmVkTmFtZTsKKyAgbmFtZVRyZWUuTG9va3VwVmFsdWVBbmROYW1lKDAsICZzdG9yZWROYW1lKTsKKyAgRVhQRUNUX1NUUkVRKEwiMSIsIHN0b3JlZE5hbWUuY19zdHIoKSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgY29ycmVjdCB2YWx1ZSBvYmplY3QgY2FuIGJlIG9idGFpbmVkIGJ5IGxvb2tpbmcgdXAgIjEiLgorICBXaWRlU3RyaW5nIG1hdGNoTmFtZSA9IEwiMSI7CisgIENQREZfT2JqZWN0KiBwT2JqID0gbmFtZVRyZWUuTG9va3VwVmFsdWUobWF0Y2hOYW1lKTsKKyAgQVNTRVJUX1RSVUUocE9iai0+SXNOdW1iZXIoKSk7CisgIEVYUEVDVF9FUSgxMDAsIHBPYmotPkFzTnVtYmVyKCktPkdldEludGVnZXIoKSk7Cit9CisKK1RFU1QoY3BkZl9uYW1ldHJlZSwgQWRkSW50b05hbWVzKSB7CisgIC8vIFNldCB1cCBhIG5hbWUgdHJlZSB3aXRoIGEgc2luZ2xlIE5hbWVzIGFycmF5LgorICBhdXRvIHBSb290RGljdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCk7CisgIENQREZfQXJyYXkqIHBOYW1lcyA9IHBSb290RGljdC0+U2V0TmV3Rm9yPENQREZfQXJyYXk+KCJOYW1lcyIpOworICBBZGROYW1lS2V5VmFsdWUocE5hbWVzLCAiMi50eHQiLCAyMjIpOworICBBZGROYW1lS2V5VmFsdWUocE5hbWVzLCAiNy50eHQiLCA3NzcpOworCisgIENQREZfTmFtZVRyZWUgbmFtZVRyZWUocFJvb3REaWN0LmdldCgpKTsKKyAgcE5hbWVzID0gbmFtZVRyZWUuR2V0Um9vdCgpLT5HZXRBcnJheUZvcigiTmFtZXMiKTsKKworICAvLyBJbnNlcnQgYSBuYW1lIHRoYXQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIG5hbWVzIGFycmF5LgorICBFWFBFQ1RfRkFMU0UoCisgICAgICBuYW1lVHJlZS5BZGRWYWx1ZUFuZE5hbWUocGRmaXVtOjpNYWtlVW5pcXVlPENQREZfTnVtYmVyPigxMTEpLCBMIjIudHh0IikpOworCisgIC8vIEluc2VydCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuYW1lcyBhcnJheS4KKyAgRVhQRUNUX1RSVUUoCisgICAgICBuYW1lVHJlZS5BZGRWYWx1ZUFuZE5hbWUocGRmaXVtOjpNYWtlVW5pcXVlPENQREZfTnVtYmVyPigxMTEpLCBMIjEudHh0IikpOworCisgIC8vIEluc2VydCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBuYW1lcyBhcnJheS4KKyAgRVhQRUNUX1RSVUUoCisgICAgICBuYW1lVHJlZS5BZGRWYWx1ZUFuZE5hbWUocGRmaXVtOjpNYWtlVW5pcXVlPENQREZfTnVtYmVyPig1NTUpLCBMIjUudHh0IikpOworCisgIC8vIEluc2VydCBhdCB0aGUgZW5kIG9mIHRoZSBuYW1lcyBhcnJheS4KKyAgRVhQRUNUX1RSVUUoCisgICAgICBuYW1lVHJlZS5BZGRWYWx1ZUFuZE5hbWUocGRmaXVtOjpNYWtlVW5pcXVlPENQREZfTnVtYmVyPig5OTkpLCBMIjkudHh0IikpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIG5hbWVzIGFycmF5IGhhcyB0aGUgZXhwZWN0ZWQga2V5LXZhbHVlIHBhaXJzLgorICBDaGVja05hbWVLZXlWYWx1ZShwTmFtZXMsIDAsICIxLnR4dCIsIDExMSk7CisgIENoZWNrTmFtZUtleVZhbHVlKHBOYW1lcywgMSwgIjIudHh0IiwgMjIyKTsKKyAgQ2hlY2tOYW1lS2V5VmFsdWUocE5hbWVzLCAyLCAiNS50eHQiLCA1NTUpOworICBDaGVja05hbWVLZXlWYWx1ZShwTmFtZXMsIDMsICI3LnR4dCIsIDc3Nyk7CisgIENoZWNrTmFtZUtleVZhbHVlKHBOYW1lcywgNCwgIjkudHh0IiwgOTk5KTsKK30KKworVEVTVChjcGRmX25hbWV0cmVlLCBBZGRJbnRvS2lkcykgeworICAvLyBTZXQgdXAgYSBuYW1lIHRyZWUgd2l0aCBmaXZlIG5vZGVzIG9mIHRocmVlIGxldmVscy4KKyAgYXV0byBwUm9vdERpY3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigpOworICBGaWxsTmFtZVRyZWVEaWN0KHBSb290RGljdC5nZXQoKSk7CisgIENQREZfTmFtZVRyZWUgbmFtZVRyZWUocFJvb3REaWN0LmdldCgpKTsKKworICAvLyBDaGVjayB0aGF0IGFkZGluZyBhbiBleGlzdGluZyBuYW1lIHdvdWxkIGZhaWwuCisgIEVYUEVDVF9GQUxTRSgKKyAgICAgIG5hbWVUcmVlLkFkZFZhbHVlQW5kTmFtZShwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9OdW1iZXI+KDQ0NCksIEwiOS50eHQiKSk7CisKKyAgLy8gQWRkIGEgbmFtZSB3aXRoaW4gdGhlIGxpbWl0cyBvZiBhIGxlYWYgbm9kZS4KKyAgRVhQRUNUX1RSVUUoCisgICAgICBuYW1lVHJlZS5BZGRWYWx1ZUFuZE5hbWUocGRmaXVtOjpNYWtlVW5pcXVlPENQREZfTnVtYmVyPig0NDQpLCBMIjQudHh0IikpOworICBBU1NFUlRfVFJVRShuYW1lVHJlZS5Mb29rdXBWYWx1ZShMIjQudHh0IikpOworICBFWFBFQ1RfRVEoNDQ0LCBuYW1lVHJlZS5Mb29rdXBWYWx1ZShMIjQudHh0IiktPkdldEludGVnZXIoKSk7CisKKyAgLy8gQWRkIGEgbmFtZSB0aGF0IHJlcXVpcmVzIGNoYW5naW5nIHRoZSBsaW1pdHMgb2YgdHdvIGJvdHRvbSBsZXZlbHMuCisgIEVYUEVDVF9UUlVFKAorICAgICAgbmFtZVRyZWUuQWRkVmFsdWVBbmROYW1lKHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX051bWJlcj4oNjY2KSwgTCI2LnR4dCIpKTsKKyAgQVNTRVJUX1RSVUUobmFtZVRyZWUuTG9va3VwVmFsdWUoTCI2LnR4dCIpKTsKKyAgRVhQRUNUX0VRKDY2NiwgbmFtZVRyZWUuTG9va3VwVmFsdWUoTCI2LnR4dCIpLT5HZXRJbnRlZ2VyKCkpOworCisgIC8vIEFkZCBhIG5hbWUgdGhhdCByZXF1aXJlcyBjaGFuZ2luZyB0aGUgbGltaXRzIG9mIHR3byB0b3AgbGV2ZWxzLgorICBFWFBFQ1RfVFJVRSgKKyAgICAgIG5hbWVUcmVlLkFkZFZhbHVlQW5kTmFtZShwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9OdW1iZXI+KDk5KSwgTCI5OS50eHQiKSk7CisgIEFTU0VSVF9UUlVFKG5hbWVUcmVlLkxvb2t1cFZhbHVlKEwiOTkudHh0IikpOworICBFWFBFQ1RfRVEoOTksIG5hbWVUcmVlLkxvb2t1cFZhbHVlKEwiOTkudHh0IiktPkdldEludGVnZXIoKSk7CisKKyAgLy8gQWRkIGEgbmFtZSB0aGF0IHJlcXVpcmVzIGNoYW5naW5nIHRoZSBsb3dlciBsaW1pdCBvZiBhbGwgbGV2ZWxzLgorICBFWFBFQ1RfVFJVRSgKKyAgICAgIG5hbWVUcmVlLkFkZFZhbHVlQW5kTmFtZShwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9OdW1iZXI+KC01KSwgTCIwLnR4dCIpKTsKKyAgQVNTRVJUX1RSVUUobmFtZVRyZWUuTG9va3VwVmFsdWUoTCIwLnR4dCIpKTsKKyAgRVhQRUNUX0VRKC01LCBuYW1lVHJlZS5Mb29rdXBWYWx1ZShMIjAudHh0IiktPkdldEludGVnZXIoKSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgbm9kZSBvbiB0aGUgZmlyc3QgbGV2ZWwgaGFzIHRoZSBleHBlY3RlZCBsaW1pdHMuCisgIENQREZfRGljdGlvbmFyeSogcEtpZDEgPQorICAgICAgbmFtZVRyZWUuR2V0Um9vdCgpLT5HZXRBcnJheUZvcigiS2lkcyIpLT5HZXREaWN0QXQoMCk7CisgIEFTU0VSVF9UUlVFKHBLaWQxKTsKKyAgQ2hlY2tMaW1pdHNBcnJheShwS2lkMSwgIjAudHh0IiwgIjk5LnR4dCIpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIG5vZGVzIG9uIHRoZSBzZWNvbmQgbGV2ZWwgaGFzIHRoZSBleHBlY3RlZCBsaW1pdHMgYW5kIG5hbWVzLgorICBDUERGX0RpY3Rpb25hcnkqIHBLaWQyID0gcEtpZDEtPkdldEFycmF5Rm9yKCJLaWRzIiktPkdldERpY3RBdCgwKTsKKyAgQVNTRVJUX1RSVUUocEtpZDIpOworICBDaGVja0xpbWl0c0FycmF5KHBLaWQyLCAiMC50eHQiLCAiNi50eHQiKTsKKworICBDUERGX0RpY3Rpb25hcnkqIHBLaWQzID0gcEtpZDEtPkdldEFycmF5Rm9yKCJLaWRzIiktPkdldERpY3RBdCgxKTsKKyAgQVNTRVJUX1RSVUUocEtpZDMpOworICBDaGVja0xpbWl0c0FycmF5KHBLaWQzLCAiOS50eHQiLCAiOTkudHh0Iik7CisgIENQREZfQXJyYXkqIHBOYW1lcyA9IHBLaWQzLT5HZXRBcnJheUZvcigiTmFtZXMiKTsKKyAgQVNTRVJUX1RSVUUocE5hbWVzKTsKKyAgQ2hlY2tOYW1lS2V5VmFsdWUocE5hbWVzLCAwLCAiOS50eHQiLCA5OTkpOworICBDaGVja05hbWVLZXlWYWx1ZShwTmFtZXMsIDEsICI5OS50eHQiLCA5OSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgbm9kZXMgb24gdGhlIHRoaXJkIGxldmVsIGhhcyB0aGUgZXhwZWN0ZWQgbGltaXRzIGFuZCBuYW1lcy4KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkNCA9IHBLaWQyLT5HZXRBcnJheUZvcigiS2lkcyIpLT5HZXREaWN0QXQoMCk7CisgIEFTU0VSVF9UUlVFKHBLaWQ0KTsKKyAgQ2hlY2tMaW1pdHNBcnJheShwS2lkNCwgIjAudHh0IiwgIjIudHh0Iik7CisgIHBOYW1lcyA9IHBLaWQ0LT5HZXRBcnJheUZvcigiTmFtZXMiKTsKKyAgQVNTRVJUX1RSVUUocE5hbWVzKTsKKyAgQ2hlY2tOYW1lS2V5VmFsdWUocE5hbWVzLCAwLCAiMC50eHQiLCAtNSk7CisgIENoZWNrTmFtZUtleVZhbHVlKHBOYW1lcywgMSwgIjEudHh0IiwgMTExKTsKKyAgQ2hlY2tOYW1lS2V5VmFsdWUocE5hbWVzLCAyLCAiMi50eHQiLCAyMjIpOworCisgIENQREZfRGljdGlvbmFyeSogcEtpZDUgPSBwS2lkMi0+R2V0QXJyYXlGb3IoIktpZHMiKS0+R2V0RGljdEF0KDEpOworICBBU1NFUlRfVFJVRShwS2lkNSk7CisgIENoZWNrTGltaXRzQXJyYXkocEtpZDUsICIzLnR4dCIsICI2LnR4dCIpOworICBwTmFtZXMgPSBwS2lkNS0+R2V0QXJyYXlGb3IoIk5hbWVzIik7CisgIEFTU0VSVF9UUlVFKHBOYW1lcyk7CisgIENoZWNrTmFtZUtleVZhbHVlKHBOYW1lcywgMCwgIjMudHh0IiwgMzMzKTsKKyAgQ2hlY2tOYW1lS2V5VmFsdWUocE5hbWVzLCAxLCAiNC50eHQiLCA0NDQpOworICBDaGVja05hbWVLZXlWYWx1ZShwTmFtZXMsIDIsICI1LnR4dCIsIDU1NSk7CisgIENoZWNrTmFtZUtleVZhbHVlKHBOYW1lcywgMywgIjYudHh0IiwgNjY2KTsKK30KKworVEVTVChjcGRmX25hbWV0cmVlLCBEZWxldGVGcm9tS2lkcykgeworICAvLyBTZXQgdXAgYSBuYW1lIHRyZWUgd2l0aCBmaXZlIG5vZGVzIG9mIHRocmVlIGxldmVscy4KKyAgYXV0byBwUm9vdERpY3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigpOworICBGaWxsTmFtZVRyZWVEaWN0KHBSb290RGljdC5nZXQoKSk7CisgIENQREZfTmFtZVRyZWUgbmFtZVRyZWUocFJvb3REaWN0LmdldCgpKTsKKworICAvLyBSZXRyaWV2ZSB0aGUga2lkIGRpY3Rpb25hcmllcy4KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkMSA9CisgICAgICBuYW1lVHJlZS5HZXRSb290KCktPkdldEFycmF5Rm9yKCJLaWRzIiktPkdldERpY3RBdCgwKTsKKyAgQVNTRVJUX1RSVUUocEtpZDEpOworICBDUERGX0RpY3Rpb25hcnkqIHBLaWQyID0gcEtpZDEtPkdldEFycmF5Rm9yKCJLaWRzIiktPkdldERpY3RBdCgwKTsKKyAgQVNTRVJUX1RSVUUocEtpZDIpOworICBDUERGX0RpY3Rpb25hcnkqIHBLaWQzID0gcEtpZDEtPkdldEFycmF5Rm9yKCJLaWRzIiktPkdldERpY3RBdCgxKTsKKyAgQVNTRVJUX1RSVUUocEtpZDMpOworICBDUERGX0RpY3Rpb25hcnkqIHBLaWQ0ID0gcEtpZDItPkdldEFycmF5Rm9yKCJLaWRzIiktPkdldERpY3RBdCgwKTsKKyAgQVNTRVJUX1RSVUUocEtpZDQpOworICBDUERGX0RpY3Rpb25hcnkqIHBLaWQ1ID0gcEtpZDItPkdldEFycmF5Rm9yKCJLaWRzIiktPkdldERpY3RBdCgxKTsKKyAgQVNTRVJUX1RSVUUocEtpZDUpOworCisgIC8vIENoZWNrIHRoYXQgZGVsZXRpbmcgYW4gb3V0LW9mLWJvdW5kIGluZGV4IHdvdWxkIGZhaWwuCisgIEVYUEVDVF9GQUxTRShuYW1lVHJlZS5EZWxldGVWYWx1ZUFuZE5hbWUoNSkpOworCisgIC8vIERlbGV0ZSB0aGUgbmFtZSAiOS50eHQiLCBhbmQgY2hlY2sgdGhhdCBpdHMgbm9kZSBnZXRzIGRlbGV0ZWQgYW5kIGl0cworICAvLyBwYXJlbnQgbm9kZSdzIGxpbWl0cyBnZXQgdXBkYXRlZC4KKyAgV2lkZVN0cmluZyBjc05hbWU7CisgIEFTU0VSVF9UUlVFKG5hbWVUcmVlLkxvb2t1cFZhbHVlKEwiOS50eHQiKSk7CisgIEVYUEVDVF9FUSg5OTksIG5hbWVUcmVlLkxvb2t1cFZhbHVlKEwiOS50eHQiKS0+R2V0SW50ZWdlcigpKTsKKyAgRVhQRUNUX1RSVUUobmFtZVRyZWUuTG9va3VwVmFsdWVBbmROYW1lKDQsICZjc05hbWUpKTsKKyAgRVhQRUNUX1NUUkVRKEwiOS50eHQiLCBjc05hbWUuY19zdHIoKSk7CisgIEVYUEVDVF9FUSgydSwgcEtpZDEtPkdldEFycmF5Rm9yKCJLaWRzIiktPkdldENvdW50KCkpOworICBFWFBFQ1RfVFJVRShuYW1lVHJlZS5EZWxldGVWYWx1ZUFuZE5hbWUoNCkpOworICBFWFBFQ1RfRVEoMXUsIHBLaWQxLT5HZXRBcnJheUZvcigiS2lkcyIpLT5HZXRDb3VudCgpKTsKKyAgQ2hlY2tMaW1pdHNBcnJheShwS2lkMSwgIjEudHh0IiwgIjUudHh0Iik7CisKKyAgLy8gRGVsZXRlIHRoZSBuYW1lICIyLnR4dCIsIGFuZCBjaGVjayB0aGF0IGl0cyBub2RlIGRvZXMgbm90IGdldCBkZWxldGVkLCBpdHMKKyAgLy8gbm9kZSdzIGxpbWl0cyBnZXQgdXBkYXRlZCwgYW5kIG5vIG90aGVyIGxpbWl0cyBnZXQgdXBkYXRlZC4KKyAgQVNTRVJUX1RSVUUobmFtZVRyZWUuTG9va3VwVmFsdWUoTCIyLnR4dCIpKTsKKyAgRVhQRUNUX0VRKDIyMiwgbmFtZVRyZWUuTG9va3VwVmFsdWUoTCIyLnR4dCIpLT5HZXRJbnRlZ2VyKCkpOworICBFWFBFQ1RfVFJVRShuYW1lVHJlZS5Mb29rdXBWYWx1ZUFuZE5hbWUoMSwgJmNzTmFtZSkpOworICBFWFBFQ1RfU1RSRVEoTCIyLnR4dCIsIGNzTmFtZS5jX3N0cigpKTsKKyAgRVhQRUNUX0VRKDR1LCBwS2lkNC0+R2V0QXJyYXlGb3IoIk5hbWVzIiktPkdldENvdW50KCkpOworICBFWFBFQ1RfVFJVRShuYW1lVHJlZS5EZWxldGVWYWx1ZUFuZE5hbWUoMSkpOworICBFWFBFQ1RfRVEoMnUsIHBLaWQ0LT5HZXRBcnJheUZvcigiTmFtZXMiKS0+R2V0Q291bnQoKSk7CisgIENoZWNrTGltaXRzQXJyYXkocEtpZDQsICIxLnR4dCIsICIxLnR4dCIpOworICBDaGVja0xpbWl0c0FycmF5KHBLaWQyLCAiMS50eHQiLCAiNS50eHQiKTsKKyAgQ2hlY2tMaW1pdHNBcnJheShwS2lkMSwgIjEudHh0IiwgIjUudHh0Iik7CisKKyAgLy8gRGVsZXRlIHRoZSBuYW1lICIxLnR4dCIsIGFuZCBjaGVjayB0aGF0IGl0cyBub2RlIGdldHMgZGVsZXRlZCwgYW5kIGl0cworICAvLyBwYXJlbnQncyBhbmQgZ3JhZHBhcmVudCdzIGxpbWl0cyBnZXQgdXBkYXRlZC4KKyAgQVNTRVJUX1RSVUUobmFtZVRyZWUuTG9va3VwVmFsdWUoTCIxLnR4dCIpKTsKKyAgRVhQRUNUX0VRKDExMSwgbmFtZVRyZWUuTG9va3VwVmFsdWUoTCIxLnR4dCIpLT5HZXRJbnRlZ2VyKCkpOworICBFWFBFQ1RfVFJVRShuYW1lVHJlZS5Mb29rdXBWYWx1ZUFuZE5hbWUoMCwgJmNzTmFtZSkpOworICBFWFBFQ1RfU1RSRVEoTCIxLnR4dCIsIGNzTmFtZS5jX3N0cigpKTsKKyAgRVhQRUNUX0VRKDJ1LCBwS2lkMi0+R2V0QXJyYXlGb3IoIktpZHMiKS0+R2V0Q291bnQoKSk7CisgIEVYUEVDVF9UUlVFKG5hbWVUcmVlLkRlbGV0ZVZhbHVlQW5kTmFtZSgwKSk7CisgIEVYUEVDVF9FUSgxdSwgcEtpZDItPkdldEFycmF5Rm9yKCJLaWRzIiktPkdldENvdW50KCkpOworICBDaGVja0xpbWl0c0FycmF5KHBLaWQyLCAiMy50eHQiLCAiNS50eHQiKTsKKyAgQ2hlY2tMaW1pdHNBcnJheShwS2lkMSwgIjMudHh0IiwgIjUudHh0Iik7CisKKyAgLy8gRGVsZXRlIHRoZSBuYW1lICIzLnR4dCIsIGFuZCBjaGVjayB0aGF0IGl0cyBub2RlIGRvZXMgbm90IGdldCBkZWxldGVkLCBhbmQKKyAgLy8gaXRzIG5vZGUncywgaXRzIHBhcmVudCdzLCBhbmQgaXRzIGdyYW5kcGFyZW50J3MgbGltaXRzIGdldCB1cGRhdGVkLgorICBBU1NFUlRfVFJVRShuYW1lVHJlZS5Mb29rdXBWYWx1ZShMIjMudHh0IikpOworICBFWFBFQ1RfRVEoMzMzLCBuYW1lVHJlZS5Mb29rdXBWYWx1ZShMIjMudHh0IiktPkdldEludGVnZXIoKSk7CisgIEVYUEVDVF9UUlVFKG5hbWVUcmVlLkxvb2t1cFZhbHVlQW5kTmFtZSgwLCAmY3NOYW1lKSk7CisgIEVYUEVDVF9TVFJFUShMIjMudHh0IiwgY3NOYW1lLmNfc3RyKCkpOworICBFWFBFQ1RfRVEoNHUsIHBLaWQ1LT5HZXRBcnJheUZvcigiTmFtZXMiKS0+R2V0Q291bnQoKSk7CisgIEVYUEVDVF9UUlVFKG5hbWVUcmVlLkRlbGV0ZVZhbHVlQW5kTmFtZSgwKSk7CisgIEVYUEVDVF9FUSgydSwgcEtpZDUtPkdldEFycmF5Rm9yKCJOYW1lcyIpLT5HZXRDb3VudCgpKTsKKyAgQ2hlY2tMaW1pdHNBcnJheShwS2lkNSwgIjUudHh0IiwgIjUudHh0Iik7CisgIENoZWNrTGltaXRzQXJyYXkocEtpZDIsICI1LnR4dCIsICI1LnR4dCIpOworICBDaGVja0xpbWl0c0FycmF5KHBLaWQxLCAiNS50eHQiLCAiNS50eHQiKTsKKworICAvLyBEZWxldGUgdGhlIG5hbWUgIjUudHh0IiwgYW5kIGNoZWNrIHRoYXQgYWxsIG5vZGVzIGluIHRoZSB0cmVlIGdldCBkZWxldGVkCisgIC8vIHNpbmNlIHRoZXkgYXJlIG5vdyBhbGwgZW1wdHkuCisgIEFTU0VSVF9UUlVFKG5hbWVUcmVlLkxvb2t1cFZhbHVlKEwiNS50eHQiKSk7CisgIEVYUEVDVF9FUSg1NTUsIG5hbWVUcmVlLkxvb2t1cFZhbHVlKEwiNS50eHQiKS0+R2V0SW50ZWdlcigpKTsKKyAgRVhQRUNUX1RSVUUobmFtZVRyZWUuTG9va3VwVmFsdWVBbmROYW1lKDAsICZjc05hbWUpKTsKKyAgRVhQRUNUX1NUUkVRKEwiNS50eHQiLCBjc05hbWUuY19zdHIoKSk7CisgIEVYUEVDVF9FUSgxdSwgbmFtZVRyZWUuR2V0Um9vdCgpLT5HZXRBcnJheUZvcigiS2lkcyIpLT5HZXRDb3VudCgpKTsKKyAgRVhQRUNUX1RSVUUobmFtZVRyZWUuRGVsZXRlVmFsdWVBbmROYW1lKDApKTsKKyAgRVhQRUNUX0VRKDB1LCBuYW1lVHJlZS5HZXRSb290KCktPkdldEFycmF5Rm9yKCJLaWRzIiktPkdldENvdW50KCkpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIHRyZWUgaXMgbm93IGVtcHR5LgorICBFWFBFQ1RfRVEoMHUsIG5hbWVUcmVlLkdldENvdW50KCkpOworICBFWFBFQ1RfRkFMU0UobmFtZVRyZWUuTG9va3VwVmFsdWVBbmROYW1lKDAsICZjc05hbWUpKTsKKyAgRVhQRUNUX0ZBTFNFKG5hbWVUcmVlLkRlbGV0ZVZhbHVlQW5kTmFtZSgwKSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3BkZl9udW1iZXJ0cmVlLmNwcCBiL2NvcmUvZnBkZmRvYy9jcGRmX251bWJlcnRyZWUuY3BwCmluZGV4IDVmMmJjMDYuLjk1MmZiNGUgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jcGRmX251bWJlcnRyZWUuY3BwCisrKyBiL2NvcmUvZnBkZmRvYy9jcGRmX251bWJlcnRyZWUuY3BwCkBAIC00Nyw2ICs0NywxMCBAQAogCiB9ICAvLyBuYW1lc3BhY2UKIAorQ1BERl9OdW1iZXJUcmVlOjpDUERGX051bWJlclRyZWUoQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCkgOiBtX3BSb290KHBSb290KSB7fQorCitDUERGX051bWJlclRyZWU6On5DUERGX051bWJlclRyZWUoKSB7fQorCiBDUERGX09iamVjdCogQ1BERl9OdW1iZXJUcmVlOjpMb29rdXBWYWx1ZShpbnQgbnVtKSBjb25zdCB7Ci0gIHJldHVybiBTZWFyY2hOdW1iZXJOb2RlKG1fcFJvb3QsIG51bSk7CisgIHJldHVybiBTZWFyY2hOdW1iZXJOb2RlKG1fcFJvb3QuR2V0KCksIG51bSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3BkZl9udW1iZXJ0cmVlLmggYi9jb3JlL2ZwZGZkb2MvY3BkZl9udW1iZXJ0cmVlLmgKaW5kZXggYmZlNDRmZC4uNDdjNDBiOSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfbnVtYmVydHJlZS5oCisrKyBiL2NvcmUvZnBkZmRvYy9jcGRmX251bWJlcnRyZWUuaApAQCAtNywxNyArNywyMCBAQAogI2lmbmRlZiBDT1JFX0ZQREZET0NfQ1BERl9OVU1CRVJUUkVFX0hfCiAjZGVmaW5lIENPUkVfRlBERkRPQ19DUERGX05VTUJFUlRSRUVfSF8KIAorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKKwogY2xhc3MgQ1BERl9EaWN0aW9uYXJ5OwogY2xhc3MgQ1BERl9PYmplY3Q7CiAKIGNsYXNzIENQREZfTnVtYmVyVHJlZSB7CiAgcHVibGljOgotICBleHBsaWNpdCBDUERGX051bWJlclRyZWUoQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCkgOiBtX3BSb290KHBSb290KSB7fQorICBleHBsaWNpdCBDUERGX051bWJlclRyZWUoQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCk7CisgIH5DUERGX051bWJlclRyZWUoKTsKIAogICBDUERGX09iamVjdCogTG9va3VwVmFsdWUoaW50IG51bSkgY29uc3Q7CiAKICBwcm90ZWN0ZWQ6Ci0gIENQREZfRGljdGlvbmFyeSogY29uc3QgbV9wUm9vdDsKKyAgVW5vd25lZFB0cjxDUERGX0RpY3Rpb25hcnk+IGNvbnN0IG1fcFJvb3Q7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkRPQ19DUERGX05VTUJFUlRSRUVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jcGRmX29jY29udGV4dC5jcHAgYi9jb3JlL2ZwZGZkb2MvY3BkZl9vY2NvbnRleHQuY3BwCmluZGV4IGM0MjcyZjQuLmU1OTY5MDkgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jcGRmX29jY29udGV4dC5jcHAKKysrIGIvY29yZS9mcGRmZG9jL2NwZGZfb2Njb250ZXh0LmNwcApAQCAtMjQsMTMgKzI0LDEzIEBACiB9CiAKIGJvb2wgSGFzSW50ZW50KGNvbnN0IENQREZfRGljdGlvbmFyeSogcERpY3QsCi0gICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGNzRWxlbWVudCwKLSAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgY3NEZWYpIHsKKyAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBjc0VsZW1lbnQsCisgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgY3NEZWYpIHsKICAgQ1BERl9PYmplY3QqIHBJbnRlbnQgPSBwRGljdC0+R2V0RGlyZWN0T2JqZWN0Rm9yKCJJbnRlbnQiKTsKICAgaWYgKCFwSW50ZW50KQogICAgIHJldHVybiBjc0VsZW1lbnQgPT0gY3NEZWY7CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgYnNJbnRlbnQ7CisgIEJ5dGVTdHJpbmcgYnNJbnRlbnQ7CiAgIGlmIChDUERGX0FycmF5KiBwQXJyYXkgPSBwSW50ZW50LT5Bc0FycmF5KCkpIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBBcnJheS0+R2V0Q291bnQoKTsgaSsrKSB7CiAgICAgICBic0ludGVudCA9IHBBcnJheS0+R2V0U3RyaW5nQXQoaSk7CkBAIC03MCw4ICs3MCw4IEBACiAgIHJldHVybiBwQ29uZmlnOwogfQogCi1DRlhfQnl0ZVN0cmluZyBHZXRVc2FnZVR5cGVTdHJpbmcoQ1BERl9PQ0NvbnRleHQ6OlVzYWdlVHlwZSBlVHlwZSkgewotICBDRlhfQnl0ZVN0cmluZyBjc1N0YXRlOworQnl0ZVN0cmluZyBHZXRVc2FnZVR5cGVTdHJpbmcoQ1BERl9PQ0NvbnRleHQ6OlVzYWdlVHlwZSBlVHlwZSkgeworICBCeXRlU3RyaW5nIGNzU3RhdGU7CiAgIHN3aXRjaCAoZVR5cGUpIHsKICAgICBjYXNlIENQREZfT0NDb250ZXh0OjpEZXNpZ246CiAgICAgICBjc1N0YXRlID0gIkRlc2lnbiI7CkBAIC05OSw5ICs5OSw5IEBACiBDUERGX09DQ29udGV4dDo6fkNQREZfT0NDb250ZXh0KCkge30KIAogYm9vbCBDUERGX09DQ29udGV4dDo6TG9hZE9DR1N0YXRlRnJvbUNvbmZpZygKLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgY3NDb25maWcsCisgICAgY29uc3QgQnl0ZVN0cmluZyYgY3NDb25maWcsCiAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwT0NHRGljdCkgY29uc3QgewotICBDUERGX0RpY3Rpb25hcnkqIHBDb25maWcgPSBHZXRDb25maWcobV9wRG9jdW1lbnQsIHBPQ0dEaWN0KTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQ29uZmlnID0gR2V0Q29uZmlnKG1fcERvY3VtZW50LkdldCgpLCBwT0NHRGljdCk7CiAgIGlmICghcENvbmZpZykKICAgICByZXR1cm4gdHJ1ZTsKIApAQCAtMTIwLDcgKzEyMCw3IEBACiAgIGlmICghcEFycmF5KQogICAgIHJldHVybiBiU3RhdGU7CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgY3NGaW5kID0gY3NDb25maWcgKyAiU3RhdGUiOworICBCeXRlU3RyaW5nIGNzRmluZCA9IGNzQ29uZmlnICsgIlN0YXRlIjsKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkrKykgewogICAgIENQREZfRGljdGlvbmFyeSogcFVzYWdlID0gcEFycmF5LT5HZXREaWN0QXQoaSk7CiAgICAgaWYgKCFwVXNhZ2UpCkBAIC0xNDksMTIgKzE0OSwxMiBAQAogICBpZiAoIUhhc0ludGVudChwT0NHRGljdCwgIlZpZXciLCAiVmlldyIpKQogICAgIHJldHVybiB0cnVlOwogCi0gIENGWF9CeXRlU3RyaW5nIGNzU3RhdGUgPSBHZXRVc2FnZVR5cGVTdHJpbmcobV9lVXNhZ2VUeXBlKTsKKyAgQnl0ZVN0cmluZyBjc1N0YXRlID0gR2V0VXNhZ2VUeXBlU3RyaW5nKG1fZVVzYWdlVHlwZSk7CiAgIENQREZfRGljdGlvbmFyeSogcFVzYWdlID0gcE9DR0RpY3QtPkdldERpY3RGb3IoIlVzYWdlIik7CiAgIGlmIChwVXNhZ2UpIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBTdGF0ZSA9IHBVc2FnZS0+R2V0RGljdEZvcihjc1N0YXRlKTsKICAgICBpZiAocFN0YXRlKSB7Ci0gICAgICBDRlhfQnl0ZVN0cmluZyBjc0ZpbmQgPSBjc1N0YXRlICsgIlN0YXRlIjsKKyAgICAgIEJ5dGVTdHJpbmcgY3NGaW5kID0gY3NTdGF0ZSArICJTdGF0ZSI7CiAgICAgICBpZiAocFN0YXRlLT5LZXlFeGlzdChjc0ZpbmQpKQogICAgICAgICByZXR1cm4gcFN0YXRlLT5HZXRTdHJpbmdGb3IoY3NGaW5kKSAhPSAiT0ZGIjsKICAgICB9CkBAIC0xODEsNyArMTgxLDcgQEAKIH0KIAogYm9vbCBDUERGX09DQ29udGV4dDo6Q2hlY2tPYmplY3RWaXNpYmxlKGNvbnN0IENQREZfUGFnZU9iamVjdCogcE9iaikgewotICBmb3IgKGludCBpID0gMDsgaSA8IHBPYmotPm1fQ29udGVudE1hcmsuQ291bnRJdGVtcygpOyBpKyspIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwT2JqLT5tX0NvbnRlbnRNYXJrLkNvdW50SXRlbXMoKTsgKytpKSB7CiAgICAgY29uc3QgQ1BERl9Db250ZW50TWFya0l0ZW0mIGl0ZW0gPSBwT2JqLT5tX0NvbnRlbnRNYXJrLkdldEl0ZW0oaSk7CiAgICAgaWYgKGl0ZW0uR2V0TmFtZSgpID09ICJPQyIgJiYKICAgICAgICAgaXRlbS5HZXRQYXJhbVR5cGUoKSA9PSBDUERGX0NvbnRlbnRNYXJrSXRlbTo6UHJvcGVydGllc0RpY3QgJiYKQEAgLTE5Niw3ICsxOTYsNyBAQAogICBpZiAobkxldmVsID4gMzIgfHwgIXBFeHByZXNzaW9uKQogICAgIHJldHVybiBmYWxzZTsKIAotICBDRlhfQnl0ZVN0cmluZyBjc09wZXJhdG9yID0gcEV4cHJlc3Npb24tPkdldFN0cmluZ0F0KDApOworICBCeXRlU3RyaW5nIGNzT3BlcmF0b3IgPSBwRXhwcmVzc2lvbi0+R2V0U3RyaW5nQXQoMCk7CiAgIGlmIChjc09wZXJhdG9yID09ICJOb3QiKSB7CiAgICAgQ1BERl9PYmplY3QqIHBPQ0dPYmogPSBwRXhwcmVzc2lvbi0+R2V0RGlyZWN0T2JqZWN0QXQoMSk7CiAgICAgaWYgKCFwT0NHT2JqKQpAQCAtMjQxLDcgKzI0MSw3IEBACiAgIGlmIChwVkUpCiAgICAgcmV0dXJuIEdldE9DR1ZFKHBWRSwgMCk7CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgY3NQID0gcE9DTUREaWN0LT5HZXRTdHJpbmdGb3IoIlAiLCAiQW55T24iKTsKKyAgQnl0ZVN0cmluZyBjc1AgPSBwT0NNRERpY3QtPkdldFN0cmluZ0ZvcigiUCIsICJBbnlPbiIpOwogICBDUERGX09iamVjdCogcE9DR09iaiA9IHBPQ01ERGljdC0+R2V0RGlyZWN0T2JqZWN0Rm9yKCJPQ0dzIik7CiAgIGlmICghcE9DR09iaikKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTI1NCwyNSArMjU0LDMyIEBACiAgICAgcmV0dXJuIHRydWU7CiAKICAgYm9vbCBiU3RhdGUgPSAoY3NQID09ICJBbGxPbiIgfHwgY3NQID09ICJBbGxPZmYiKTsKKyAgLy8gQXQgbGVhc3Qgb25lIGVudHJ5IG9mIE9DR3MgbmVlZHMgdG8gYmUgYSB2YWxpZCBkaWN0aW9uYXJ5IGZvciBpdCB0byBiZQorICAvLyBjb25zaWRlcmVkIHByZXNlbnQuIFNlZSAiT0NHcyIgaW4gdGFibGUgNC40OSBpbiB0aGUgUERGIDEuNyBzcGVjLgorICBib29sIGJWYWxpZEVudHJ5U2VlbiA9IGZhbHNlOwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBBcnJheS0+R2V0Q291bnQoKTsgaSsrKSB7CiAgICAgYm9vbCBiSXRlbSA9IHRydWU7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwSXRlbURpY3QgPSBwQXJyYXktPkdldERpY3RBdChpKTsKLSAgICBpZiAocEl0ZW1EaWN0KQotICAgICAgYkl0ZW0gPSBHZXRPQ0dWaXNpYmxlKHBJdGVtRGljdCk7CisgICAgaWYgKCFwSXRlbURpY3QpCisgICAgICBjb250aW51ZTsKKworICAgIGJWYWxpZEVudHJ5U2VlbiA9IHRydWU7CisgICAgYkl0ZW0gPSBHZXRPQ0dWaXNpYmxlKHBJdGVtRGljdCk7CiAKICAgICBpZiAoKGNzUCA9PSAiQW55T24iICYmIGJJdGVtKSB8fCAoY3NQID09ICJBbnlPZmYiICYmICFiSXRlbSkpCiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICBpZiAoKGNzUCA9PSAiQWxsT24iICYmICFiSXRlbSkgfHwgKGNzUCA9PSAiQWxsT2ZmIiAmJiBiSXRlbSkpCiAgICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLSAgcmV0dXJuIGJTdGF0ZTsKKworICByZXR1cm4gIWJWYWxpZEVudHJ5U2VlbiB8fCBiU3RhdGU7CiB9CiAKIGJvb2wgQ1BERl9PQ0NvbnRleHQ6OkNoZWNrT0NHVmlzaWJsZShjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBPQ0dEaWN0KSB7CiAgIGlmICghcE9DR0RpY3QpCiAgICAgcmV0dXJuIHRydWU7CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgY3NUeXBlID0gcE9DR0RpY3QtPkdldFN0cmluZ0ZvcigiVHlwZSIsICJPQ0ciKTsKKyAgQnl0ZVN0cmluZyBjc1R5cGUgPSBwT0NHRGljdC0+R2V0U3RyaW5nRm9yKCJUeXBlIiwgIk9DRyIpOwogICBpZiAoY3NUeXBlID09ICJPQ0ciKQogICAgIHJldHVybiBHZXRPQ0dWaXNpYmxlKHBPQ0dEaWN0KTsKICAgcmV0dXJuIExvYWRPQ01EU3RhdGUocE9DR0RpY3QpOwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwZGZfb2Njb250ZXh0LmggYi9jb3JlL2ZwZGZkb2MvY3BkZl9vY2NvbnRleHQuaAppbmRleCBlY2RjZmFlLi4wN2I0MWNjIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZkb2MvY3BkZl9vY2NvbnRleHQuaAorKysgYi9jb3JlL2ZwZGZkb2MvY3BkZl9vY2NvbnRleHQuaApAQCAtNywyMCArNywyMCBAQAogI2lmbmRlZiBDT1JFX0ZQREZET0NfQ1BERl9PQ0NPTlRFWFRfSF8KICNkZWZpbmUgQ09SRV9GUERGRE9DX0NQREZfT0NDT05URVhUX0hfCiAKLSNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPG1hcD4KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3JldGFpbl9wdHIuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgogCiBjbGFzcyBDUERGX0FycmF5OwogY2xhc3MgQ1BERl9EaWN0aW9uYXJ5OwogY2xhc3MgQ1BERl9Eb2N1bWVudDsKIGNsYXNzIENQREZfUGFnZU9iamVjdDsKIAotY2xhc3MgQ1BERl9PQ0NvbnRleHQgOiBwdWJsaWMgQ0ZYX1JldGFpbmFibGUgeworY2xhc3MgQ1BERl9PQ0NvbnRleHQgOiBwdWJsaWMgUmV0YWluYWJsZSB7CiAgcHVibGljOgogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KLSAgZnJpZW5kIENGWF9SZXRhaW5QdHI8VD4gcGRmaXVtOjpNYWtlUmV0YWluKEFyZ3MmJi4uLiBhcmdzKTsKKyAgZnJpZW5kIFJldGFpblB0cjxUPiBwZGZpdW06Ok1ha2VSZXRhaW4oQXJncyYmLi4uIGFyZ3MpOwogCiAgIGVudW0gVXNhZ2VUeXBlIHsgVmlldyA9IDAsIERlc2lnbiwgUHJpbnQsIEV4cG9ydCB9OwogCkBAIC0zMSwxNiArMzEsMTYgQEAKICAgQ1BERl9PQ0NvbnRleHQoQ1BERl9Eb2N1bWVudCogcERvYywgVXNhZ2VUeXBlIGVVc2FnZVR5cGUpOwogICB+Q1BERl9PQ0NvbnRleHQoKSBvdmVycmlkZTsKIAotICBib29sIExvYWRPQ0dTdGF0ZUZyb21Db25maWcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNzQ29uZmlnLAorICBib29sIExvYWRPQ0dTdGF0ZUZyb21Db25maWcoY29uc3QgQnl0ZVN0cmluZyYgY3NDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBPQ0dEaWN0KSBjb25zdDsKICAgYm9vbCBMb2FkT0NHU3RhdGUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwT0NHRGljdCkgY29uc3Q7CiAgIGJvb2wgR2V0T0NHVmlzaWJsZShjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBPQ0dEaWN0KTsKICAgYm9vbCBHZXRPQ0dWRShDUERGX0FycmF5KiBwRXhwcmVzc2lvbiwgaW50IG5MZXZlbCk7CiAgIGJvb2wgTG9hZE9DTURTdGF0ZShjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBPQ01ERGljdCk7CiAKLSAgQ1BERl9Eb2N1bWVudCogY29uc3QgbV9wRG9jdW1lbnQ7CisgIFVub3duZWRQdHI8Q1BERl9Eb2N1bWVudD4gY29uc3QgbV9wRG9jdW1lbnQ7CiAgIGNvbnN0IFVzYWdlVHlwZSBtX2VVc2FnZVR5cGU7Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDxjb25zdCBDUERGX0RpY3Rpb25hcnkqLCBib29sPiBtX09DR1N0YXRlczsKKyAgc3RkOjptYXA8Y29uc3QgQ1BERl9EaWN0aW9uYXJ5KiwgYm9vbD4gbV9PQ0dTdGF0ZXM7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkRPQ19DUERGX09DQ09OVEVYVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwZGZfcGFnZWxhYmVsLmNwcCBiL2NvcmUvZnBkZmRvYy9jcGRmX3BhZ2VsYWJlbC5jcHAKaW5kZXggMmE3OWQ3Ny4uZjA2ZTQwMSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfcGFnZWxhYmVsLmNwcAorKysgYi9jb3JlL2ZwZGZkb2MvY3BkZl9wYWdlbGFiZWwuY3BwCkBAIC0xMywxNiArMTMsMTUgQEAKIAogbmFtZXNwYWNlIHsKIAotQ0ZYX1dpZGVTdHJpbmcgTWFrZVJvbWFuKGludCBudW0pIHsKK1dpZGVTdHJpbmcgTWFrZVJvbWFuKGludCBudW0pIHsKICAgY29uc3QgaW50IGtBcmFiaWNbXSA9IHsxMDAwLCA5MDAsIDUwMCwgNDAwLCAxMDAsIDkwLCA1MCwgNDAsIDEwLCA5LCA1LCA0LCAxfTsKLSAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcga1JvbWFuW10gPSB7TCJtIiwgIEwiY20iLCBMImQiLCAgTCJjZCIsIEwiYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwieGMiLCBMImwiLCAgTCJ4bCIsIEwieCIsICBMIml4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJ2IiwgIEwiaXYiLCBMImkifTsKKyAgY29uc3QgV2lkZVN0cmluZyBrUm9tYW5bXSA9IHtMIm0iLCAgTCJjbSIsIEwiZCIsICBMImNkIiwgTCJjIiwgIEwieGMiLCBMImwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwieGwiLCBMIngiLCAgTCJpeCIsIEwidiIsICBMIml2IiwgTCJpIn07CiAgIGNvbnN0IGludCBrTWF4TnVtID0gMTAwMDAwMDsKIAogICBudW0gJT0ga01heE51bTsKICAgaW50IGkgPSAwOwotICBDRlhfV2lkZVN0cmluZyB3c1JvbWFuTnVtYmVyOworICBXaWRlU3RyaW5nIHdzUm9tYW5OdW1iZXI7CiAgIHdoaWxlIChudW0gPiAwKSB7CiAgICAgd2hpbGUgKG51bSA+PSBrQXJhYmljW2ldKSB7CiAgICAgICBudW0gPSBudW0gLSBrQXJhYmljW2ldOwpAQCAtMzMsNDEgKzMyLDQzIEBACiAgIHJldHVybiB3c1JvbWFuTnVtYmVyOwogfQogCi1DRlhfV2lkZVN0cmluZyBNYWtlTGV0dGVycyhpbnQgbnVtKSB7CitXaWRlU3RyaW5nIE1ha2VMZXR0ZXJzKGludCBudW0pIHsKICAgaWYgKG51bSA9PSAwKQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CiAKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NMZXR0ZXJzOworICBXaWRlU3RyaW5nIHdzTGV0dGVyczsKICAgY29uc3QgaW50IG5NYXhDb3VudCA9IDEwMDA7CiAgIGNvbnN0IGludCBuTGV0dGVyQ291bnQgPSAyNjsKICAgLS1udW07CiAKICAgaW50IGNvdW50ID0gbnVtIC8gbkxldHRlckNvdW50ICsgMTsKICAgY291bnQgJT0gbk1heENvdW50OwotICBGWF9XQ0hBUiBjaCA9IEwnYScgKyBudW0gJSBuTGV0dGVyQ291bnQ7CisgIHdjaGFyX3QgY2ggPSBMJ2EnICsgbnVtICUgbkxldHRlckNvdW50OwogICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCiAgICAgd3NMZXR0ZXJzICs9IGNoOwogICByZXR1cm4gd3NMZXR0ZXJzOwogfQogCi1DRlhfV2lkZVN0cmluZyBHZXRMYWJlbE51bVBvcnRpb24oaW50IG51bSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzU3R5bGUpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NOdW1Qb3J0aW9uOworV2lkZVN0cmluZyBHZXRMYWJlbE51bVBvcnRpb24oaW50IG51bSwgY29uc3QgQnl0ZVN0cmluZyYgYnNTdHlsZSkgewogICBpZiAoYnNTdHlsZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIEwiIjsKKyAgaWYgKGJzU3R5bGUgPT0gIkQiKQorICAgIHJldHVybiBXaWRlU3RyaW5nOjpGb3JtYXQoTCIlZCIsIG51bSk7CisgIGlmIChic1N0eWxlID09ICJSIikgeworICAgIFdpZGVTdHJpbmcgd3NOdW1Qb3J0aW9uID0gTWFrZVJvbWFuKG51bSk7CisgICAgd3NOdW1Qb3J0aW9uLk1ha2VVcHBlcigpOwogICAgIHJldHVybiB3c051bVBvcnRpb247Ci0gIGlmIChic1N0eWxlID09ICJEIikgewotICAgIHdzTnVtUG9ydGlvbi5Gb3JtYXQoTCIlZCIsIG51bSk7Ci0gIH0gZWxzZSBpZiAoYnNTdHlsZSA9PSAiUiIpIHsKLSAgICB3c051bVBvcnRpb24gPSBNYWtlUm9tYW4obnVtKTsKLSAgICB3c051bVBvcnRpb24uTWFrZVVwcGVyKCk7Ci0gIH0gZWxzZSBpZiAoYnNTdHlsZSA9PSAiciIpIHsKLSAgICB3c051bVBvcnRpb24gPSBNYWtlUm9tYW4obnVtKTsKLSAgfSBlbHNlIGlmIChic1N0eWxlID09ICJBIikgewotICAgIHdzTnVtUG9ydGlvbiA9IE1ha2VMZXR0ZXJzKG51bSk7Ci0gICAgd3NOdW1Qb3J0aW9uLk1ha2VVcHBlcigpOwotICB9IGVsc2UgaWYgKGJzU3R5bGUgPT0gImEiKSB7Ci0gICAgd3NOdW1Qb3J0aW9uID0gTWFrZUxldHRlcnMobnVtKTsKICAgfQotICByZXR1cm4gd3NOdW1Qb3J0aW9uOworICBpZiAoYnNTdHlsZSA9PSAiciIpCisgICAgcmV0dXJuIE1ha2VSb21hbihudW0pOworICBpZiAoYnNTdHlsZSA9PSAiQSIpIHsKKyAgICBXaWRlU3RyaW5nIHdzTnVtUG9ydGlvbiA9IE1ha2VMZXR0ZXJzKG51bSk7CisgICAgd3NOdW1Qb3J0aW9uLk1ha2VVcHBlcigpOworICAgIHJldHVybiB3c051bVBvcnRpb247CisgIH0KKyAgaWYgKGJzU3R5bGUgPT0gImEiKQorICAgIHJldHVybiBNYWtlTGV0dGVycyhudW0pOworICByZXR1cm4gTCIiOwogfQogCiB9ICAvLyBuYW1lc3BhY2UKQEAgLTc1LDIwICs3NiwyMiBAQAogQ1BERl9QYWdlTGFiZWw6OkNQREZfUGFnZUxhYmVsKENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCkKICAgICA6IG1fcERvY3VtZW50KHBEb2N1bWVudCkge30KIAotYm9vbCBDUERGX1BhZ2VMYWJlbDo6R2V0TGFiZWwoaW50IG5QYWdlLCBDRlhfV2lkZVN0cmluZyogd3NMYWJlbCkgY29uc3QgeworQ1BERl9QYWdlTGFiZWw6On5DUERGX1BhZ2VMYWJlbCgpIHt9CisKK09wdGlvbmFsPFdpZGVTdHJpbmc+IENQREZfUGFnZUxhYmVsOjpHZXRMYWJlbChpbnQgblBhZ2UpIGNvbnN0IHsKICAgaWYgKCFtX3BEb2N1bWVudCkKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHt9OwogCiAgIGlmIChuUGFnZSA8IDAgfHwgblBhZ2UgPj0gbV9wRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpKQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4ge307CiAKLSAgQ1BERl9EaWN0aW9uYXJ5KiBwUERGUm9vdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7CisgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBERlJvb3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOwogICBpZiAoIXBQREZSb290KQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4ge307CiAKICAgQ1BERl9EaWN0aW9uYXJ5KiBwTGFiZWxzID0gcFBERlJvb3QtPkdldERpY3RGb3IoIlBhZ2VMYWJlbHMiKTsKICAgaWYgKCFwTGFiZWxzKQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4ge307CiAKICAgQ1BERl9OdW1iZXJUcmVlIG51bWJlclRyZWUocExhYmVscyk7CiAgIENQREZfT2JqZWN0KiBwVmFsdWUgPSBudWxscHRyOwpAQCAtMTAwLDQ1ICsxMDMsNDcgQEAKICAgICBuLS07CiAgIH0KIAorICBXaWRlU3RyaW5nIGxhYmVsOwogICBpZiAocFZhbHVlKSB7CiAgICAgcFZhbHVlID0gcFZhbHVlLT5HZXREaXJlY3QoKTsKICAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwTGFiZWwgPSBwVmFsdWUtPkFzRGljdGlvbmFyeSgpKSB7CiAgICAgICBpZiAocExhYmVsLT5LZXlFeGlzdCgiUCIpKQotICAgICAgICAqd3NMYWJlbCArPSBwTGFiZWwtPkdldFVuaWNvZGVUZXh0Rm9yKCJQIik7CisgICAgICAgIGxhYmVsICs9IHBMYWJlbC0+R2V0VW5pY29kZVRleHRGb3IoIlAiKTsKIAotICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNOdW1iZXJpbmdTdHlsZSA9IHBMYWJlbC0+R2V0U3RyaW5nRm9yKCJTIiwgIiIpOworICAgICAgQnl0ZVN0cmluZyBic051bWJlcmluZ1N0eWxlID0gcExhYmVsLT5HZXRTdHJpbmdGb3IoIlMiLCAiIik7CiAgICAgICBpbnQgbkxhYmVsTnVtID0gblBhZ2UgLSBuICsgcExhYmVsLT5HZXRJbnRlZ2VyRm9yKCJTdCIsIDEpOwotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOdW1Qb3J0aW9uID0KLSAgICAgICAgICBHZXRMYWJlbE51bVBvcnRpb24obkxhYmVsTnVtLCBic051bWJlcmluZ1N0eWxlKTsKLSAgICAgICp3c0xhYmVsICs9IHdzTnVtUG9ydGlvbjsKLSAgICAgIHJldHVybiB0cnVlOworICAgICAgV2lkZVN0cmluZyB3c051bVBvcnRpb24gPSBHZXRMYWJlbE51bVBvcnRpb24obkxhYmVsTnVtLCBic051bWJlcmluZ1N0eWxlKTsKKyAgICAgIGxhYmVsICs9IHdzTnVtUG9ydGlvbjsKKyAgICAgIHJldHVybiB7bGFiZWx9OwogICAgIH0KICAgfQotICB3c0xhYmVsLT5Gb3JtYXQoTCIlZCIsIG5QYWdlICsgMSk7Ci0gIHJldHVybiB0cnVlOworICBsYWJlbCA9IFdpZGVTdHJpbmc6OkZvcm1hdChMIiVkIiwgblBhZ2UgKyAxKTsKKyAgcmV0dXJuIHtsYWJlbH07CiB9CiAKLWludDMyX3QgQ1BERl9QYWdlTGFiZWw6OkdldFBhZ2VCeUxhYmVsKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNMYWJlbCkgY29uc3QgeworaW50MzJfdCBDUERGX1BhZ2VMYWJlbDo6R2V0UGFnZUJ5TGFiZWwoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzTGFiZWwpIGNvbnN0IHsKICAgaWYgKCFtX3BEb2N1bWVudCkKICAgICByZXR1cm4gLTE7CiAKLSAgQ1BERl9EaWN0aW9uYXJ5KiBwUERGUm9vdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCk7CisgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBERlJvb3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOwogICBpZiAoIXBQREZSb290KQogICAgIHJldHVybiAtMTsKIAogICBpbnQgblBhZ2VzID0gbV9wRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpOwogICBmb3IgKGludCBpID0gMDsgaSA8IG5QYWdlczsgaSsrKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3RyOwotICAgIGlmICghR2V0TGFiZWwoaSwgJnN0cikpCisgICAgT3B0aW9uYWw8V2lkZVN0cmluZz4gc3RyID0gR2V0TGFiZWwoaSk7CisgICAgaWYgKCFzdHIuaGFzX3ZhbHVlKCkpCiAgICAgICBjb250aW51ZTsKLSAgICBpZiAoUERGX0VuY29kZVRleHQoc3RyKS5Db21wYXJlKGJzTGFiZWwpKQorICAgIGlmIChQREZfRW5jb2RlVGV4dChzdHIudmFsdWUoKSkuQ29tcGFyZShic0xhYmVsKSkKICAgICAgIHJldHVybiBpOwogICB9CiAKLSAgaW50IG5QYWdlID0gRlhTWVNfYXRvaShDRlhfQnl0ZVN0cmluZyhic0xhYmVsKS5jX3N0cigpKTsgIC8vIE5VTCB0ZXJtaW5hdGUuCisgIGludCBuUGFnZSA9IEZYU1lTX2F0b2koQnl0ZVN0cmluZyhic0xhYmVsKS5jX3N0cigpKTsgIC8vIE5VTCB0ZXJtaW5hdGUuCiAgIHJldHVybiBuUGFnZSA+IDAgJiYgblBhZ2UgPD0gblBhZ2VzID8gblBhZ2UgOiAtMTsKIH0KIAotaW50MzJfdCBDUERGX1BhZ2VMYWJlbDo6R2V0UGFnZUJ5TGFiZWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0xhYmVsKSBjb25zdCB7Ci0gIHJldHVybiBHZXRQYWdlQnlMYWJlbChQREZfRW5jb2RlVGV4dCh3c0xhYmVsLmNfc3RyKCkpLkFzU3RyaW5nQygpKTsKK2ludDMyX3QgQ1BERl9QYWdlTGFiZWw6OkdldFBhZ2VCeUxhYmVsKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c0xhYmVsKSBjb25zdCB7CisgIC8vIFRPRE8odHNlcGV6KTogY2hlY2sgdXNhZ2Ugb2YgY19zdHIoKSBiZWxvdy4KKyAgcmV0dXJuIEdldFBhZ2VCeUxhYmVsKAorICAgICAgUERGX0VuY29kZVRleHQod3NMYWJlbC51bnRlcm1pbmF0ZWRfY19zdHIoKSkuQXNTdHJpbmdWaWV3KCkpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwZGZfcGFnZWxhYmVsLmggYi9jb3JlL2ZwZGZkb2MvY3BkZl9wYWdlbGFiZWwuaAppbmRleCAwZjkxZjYxLi40NTcwZTk3IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZkb2MvY3BkZl9wYWdlbGFiZWwuaAorKysgYi9jb3JlL2ZwZGZkb2MvY3BkZl9wYWdlbGFiZWwuaApAQCAtOCwxOSArOCwyMSBAQAogI2RlZmluZSBDT1JFX0ZQREZET0NfQ1BERl9QQUdFTEFCRUxfSF8KIAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9vcHRpb25hbC5oIgogCiBjbGFzcyBDUERGX0RvY3VtZW50OwogCiBjbGFzcyBDUERGX1BhZ2VMYWJlbCB7CiAgcHVibGljOgogICBleHBsaWNpdCBDUERGX1BhZ2VMYWJlbChDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICB+Q1BERl9QYWdlTGFiZWwoKTsKIAotICBib29sIEdldExhYmVsKGludCBuUGFnZSwgQ0ZYX1dpZGVTdHJpbmcqIHdzTGFiZWwpIGNvbnN0OwotICBpbnQzMl90IEdldFBhZ2VCeUxhYmVsKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNMYWJlbCkgY29uc3Q7Ci0gIGludDMyX3QgR2V0UGFnZUJ5TGFiZWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0xhYmVsKSBjb25zdDsKKyAgT3B0aW9uYWw8V2lkZVN0cmluZz4gR2V0TGFiZWwoaW50IG5QYWdlKSBjb25zdDsKKyAgaW50MzJfdCBHZXRQYWdlQnlMYWJlbChjb25zdCBCeXRlU3RyaW5nVmlldyYgYnNMYWJlbCkgY29uc3Q7CisgIGludDMyX3QgR2V0UGFnZUJ5TGFiZWwoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzTGFiZWwpIGNvbnN0OwogCiAgcHJpdmF0ZToKLSAgQ1BERl9Eb2N1bWVudCogY29uc3QgbV9wRG9jdW1lbnQ7CisgIFVub3duZWRQdHI8Q1BERl9Eb2N1bWVudD4gY29uc3QgbV9wRG9jdW1lbnQ7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkRPQ19DUERGX1BBR0VMQUJFTF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwZGZfc3RydWN0ZWxlbWVudC5jcHAgYi9jb3JlL2ZwZGZkb2MvY3BkZl9zdHJ1Y3RlbGVtZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzk4NWI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmZG9jL2NwZGZfc3RydWN0ZWxlbWVudC5jcHAKQEAgLTAsMCArMSwxMzYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX3N0cnVjdGVsZW1lbnQuaCIKKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX25hbWUuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbnVtYmVyLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX29iamVjdC5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9yZWZlcmVuY2UuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfc3RydWN0dHJlZS5oIgorCitDUERGX1N0cnVjdEtpZDo6Q1BERl9TdHJ1Y3RLaWQoKQorICAgIDogbV9UeXBlKEludmFsaWQpLAorICAgICAgbV9wRGljdChudWxscHRyKSwKKyAgICAgIG1fUGFnZU9iak51bSgwKSwKKyAgICAgIG1fUmVmT2JqTnVtKDApLAorICAgICAgbV9Db250ZW50SWQoMCkge30KKworQ1BERl9TdHJ1Y3RLaWQ6OkNQREZfU3RydWN0S2lkKGNvbnN0IENQREZfU3RydWN0S2lkJiB0aGF0KSA9IGRlZmF1bHQ7CisKK0NQREZfU3RydWN0S2lkOjp+Q1BERl9TdHJ1Y3RLaWQoKSA9IGRlZmF1bHQ7CisKK0NQREZfU3RydWN0RWxlbWVudDo6Q1BERl9TdHJ1Y3RFbGVtZW50KENQREZfU3RydWN0VHJlZSogcFRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1N0cnVjdEVsZW1lbnQqIHBQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0KQorICAgIDogbV9wVHJlZShwVHJlZSksCisgICAgICBtX3BQYXJlbnQocFBhcmVudCksCisgICAgICBtX3BEaWN0KHBEaWN0KSwKKyAgICAgIG1fVHlwZShwRGljdC0+R2V0U3RyaW5nRm9yKCJTIikpLAorICAgICAgbV9UaXRsZShwRGljdC0+R2V0U3RyaW5nRm9yKCJUIikpIHsKKyAgaWYgKHBUcmVlLT5HZXRSb2xlTWFwKCkpIHsKKyAgICBCeXRlU3RyaW5nIG1hcHBlZCA9IHBUcmVlLT5HZXRSb2xlTWFwKCktPkdldFN0cmluZ0ZvcihtX1R5cGUpOworICAgIGlmICghbWFwcGVkLklzRW1wdHkoKSkKKyAgICAgIG1fVHlwZSA9IG1hcHBlZDsKKyAgfQorICBMb2FkS2lkcyhwRGljdCk7Cit9CisKK0NQREZfU3RydWN0RWxlbWVudDo6fkNQREZfU3RydWN0RWxlbWVudCgpID0gZGVmYXVsdDsKKworc2l6ZV90IENQREZfU3RydWN0RWxlbWVudDo6Q291bnRLaWRzKCkgY29uc3QgeworICByZXR1cm4gbV9LaWRzLnNpemUoKTsKK30KKworQ1BERl9TdHJ1Y3RFbGVtZW50KiBDUERGX1N0cnVjdEVsZW1lbnQ6OkdldEtpZElmRWxlbWVudChzaXplX3QgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fS2lkc1tpbmRleF0ubV9UeXBlID09IENQREZfU3RydWN0S2lkOjpFbGVtZW50CisgICAgICAgICAgICAgPyBtX0tpZHNbaW5kZXhdLm1fcEVsZW1lbnQuR2V0KCkKKyAgICAgICAgICAgICA6IG51bGxwdHI7Cit9CisKK3ZvaWQgQ1BERl9TdHJ1Y3RFbGVtZW50OjpMb2FkS2lkcyhDUERGX0RpY3Rpb25hcnkqIHBEaWN0KSB7CisgIENQREZfT2JqZWN0KiBwT2JqID0gcERpY3QtPkdldE9iamVjdEZvcigiUGciKTsKKyAgdWludDMyX3QgUGFnZU9iak51bSA9IDA7CisgIGlmIChDUERGX1JlZmVyZW5jZSogcFJlZiA9IFRvUmVmZXJlbmNlKHBPYmopKQorICAgIFBhZ2VPYmpOdW0gPSBwUmVmLT5HZXRSZWZPYmpOdW0oKTsKKworICBDUERGX09iamVjdCogcEtpZHMgPSBwRGljdC0+R2V0RGlyZWN0T2JqZWN0Rm9yKCJLIik7CisgIGlmICghcEtpZHMpCisgICAgcmV0dXJuOworCisgIG1fS2lkcy5jbGVhcigpOworICBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcEtpZHMtPkFzQXJyYXkoKSkgeworICAgIG1fS2lkcy5yZXNpemUocEFycmF5LT5HZXRDb3VudCgpKTsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpKyspIHsKKyAgICAgIENQREZfT2JqZWN0KiBwS2lkID0gcEFycmF5LT5HZXREaXJlY3RPYmplY3RBdChpKTsKKyAgICAgIExvYWRLaWQoUGFnZU9iak51bSwgcEtpZCwgJm1fS2lkc1tpXSk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIG1fS2lkcy5yZXNpemUoMSk7CisgIExvYWRLaWQoUGFnZU9iak51bSwgcEtpZHMsICZtX0tpZHNbMF0pOworfQorCit2b2lkIENQREZfU3RydWN0RWxlbWVudDo6TG9hZEtpZCh1aW50MzJfdCBQYWdlT2JqTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9PYmplY3QqIHBLaWRPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1N0cnVjdEtpZCogcEtpZCkgeworICBwS2lkLT5tX1R5cGUgPSBDUERGX1N0cnVjdEtpZDo6SW52YWxpZDsKKyAgaWYgKCFwS2lkT2JqKQorICAgIHJldHVybjsKKworICBpZiAocEtpZE9iai0+SXNOdW1iZXIoKSkgeworICAgIGlmIChtX3BUcmVlLT5HZXRQYWdlKCkgJiYgbV9wVHJlZS0+R2V0UGFnZSgpLT5HZXRPYmpOdW0oKSAhPSBQYWdlT2JqTnVtKQorICAgICAgcmV0dXJuOworCisgICAgcEtpZC0+bV9UeXBlID0gQ1BERl9TdHJ1Y3RLaWQ6OlBhZ2VDb250ZW50OworICAgIHBLaWQtPm1fQ29udGVudElkID0gcEtpZE9iai0+R2V0SW50ZWdlcigpOworICAgIHBLaWQtPm1fUGFnZU9iak51bSA9IFBhZ2VPYmpOdW07CisgICAgcmV0dXJuOworICB9CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwS2lkRGljdCA9IHBLaWRPYmotPkFzRGljdGlvbmFyeSgpOworICBpZiAoIXBLaWREaWN0KQorICAgIHJldHVybjsKKyAgaWYgKENQREZfUmVmZXJlbmNlKiBwUmVmID0gVG9SZWZlcmVuY2UocEtpZERpY3QtPkdldE9iamVjdEZvcigiUGciKSkpCisgICAgUGFnZU9iak51bSA9IHBSZWYtPkdldFJlZk9iak51bSgpOworCisgIEJ5dGVTdHJpbmcgdHlwZSA9IHBLaWREaWN0LT5HZXRTdHJpbmdGb3IoIlR5cGUiKTsKKyAgaWYgKCh0eXBlID09ICJNQ1IiIHx8IHR5cGUgPT0gIk9CSlIiKSAmJiBtX3BUcmVlLT5HZXRQYWdlKCkgJiYKKyAgICAgIG1fcFRyZWUtPkdldFBhZ2UoKS0+R2V0T2JqTnVtKCkgIT0gUGFnZU9iak51bSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmICh0eXBlID09ICJNQ1IiKSB7CisgICAgcEtpZC0+bV9UeXBlID0gQ1BERl9TdHJ1Y3RLaWQ6OlN0cmVhbUNvbnRlbnQ7CisgICAgQ1BERl9SZWZlcmVuY2UqIHBSZWYgPSBUb1JlZmVyZW5jZShwS2lkRGljdC0+R2V0T2JqZWN0Rm9yKCJTdG0iKSk7CisgICAgcEtpZC0+bV9SZWZPYmpOdW0gPSBwUmVmID8gcFJlZi0+R2V0UmVmT2JqTnVtKCkgOiAwOworICAgIHBLaWQtPm1fUGFnZU9iak51bSA9IFBhZ2VPYmpOdW07CisgICAgcEtpZC0+bV9Db250ZW50SWQgPSBwS2lkRGljdC0+R2V0SW50ZWdlckZvcigiTUNJRCIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmICh0eXBlID09ICJPQkpSIikgeworICAgIHBLaWQtPm1fVHlwZSA9IENQREZfU3RydWN0S2lkOjpPYmplY3Q7CisgICAgQ1BERl9SZWZlcmVuY2UqIHBPYmogPSBUb1JlZmVyZW5jZShwS2lkRGljdC0+R2V0T2JqZWN0Rm9yKCJPYmoiKSk7CisgICAgcEtpZC0+bV9SZWZPYmpOdW0gPSBwT2JqID8gcE9iai0+R2V0UmVmT2JqTnVtKCkgOiAwOworICAgIHBLaWQtPm1fUGFnZU9iak51bSA9IFBhZ2VPYmpOdW07CisgICAgcmV0dXJuOworICB9CisKKyAgcEtpZC0+bV9UeXBlID0gQ1BERl9TdHJ1Y3RLaWQ6OkVsZW1lbnQ7CisgIHBLaWQtPm1fcERpY3QgPSBwS2lkRGljdDsKKyAgaWYgKG1fcFRyZWUtPkdldFBhZ2UoKSkgeworICAgIHBLaWQtPm1fcEVsZW1lbnQgPSBudWxscHRyOworICAgIHJldHVybjsKKyAgfQorCisgIHBLaWQtPm1fcEVsZW1lbnQgPQorICAgICAgcGRmaXVtOjpNYWtlUmV0YWluPENQREZfU3RydWN0RWxlbWVudD4obV9wVHJlZS5HZXQoKSwgdGhpcywgcEtpZERpY3QpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwZGZfc3RydWN0ZWxlbWVudC5oIGIvY29yZS9mcGRmZG9jL2NwZGZfc3RydWN0ZWxlbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZWU5M2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZkb2MvY3BkZl9zdHJ1Y3RlbGVtZW50LmgKQEAgLTAsMCArMSw2NyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlBERkRPQ19DUERGX1NUUlVDVEVMRU1FTlRfSF8KKyNkZWZpbmUgQ09SRV9GUERGRE9DX0NQREZfU1RSVUNURUxFTUVOVF9IXworCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorCitjbGFzcyBDUERGX0RpY3Rpb25hcnk7CitjbGFzcyBDUERGX09iamVjdDsKK2NsYXNzIENQREZfU3RydWN0RWxlbWVudDsKK2NsYXNzIENQREZfU3RydWN0VHJlZTsKKworY2xhc3MgQ1BERl9TdHJ1Y3RLaWQgeworIHB1YmxpYzoKKyAgQ1BERl9TdHJ1Y3RLaWQoKTsKKyAgQ1BERl9TdHJ1Y3RLaWQoY29uc3QgQ1BERl9TdHJ1Y3RLaWQmIHRoYXQpOworICB+Q1BERl9TdHJ1Y3RLaWQoKTsKKworICBlbnVtIHsgSW52YWxpZCwgRWxlbWVudCwgUGFnZUNvbnRlbnQsIFN0cmVhbUNvbnRlbnQsIE9iamVjdCB9IG1fVHlwZTsKKworICBSZXRhaW5QdHI8Q1BERl9TdHJ1Y3RFbGVtZW50PiBtX3BFbGVtZW50OyAgICAgIC8vIEZvciBFbGVtZW50LgorICBVbm93bmVkUHRyPENQREZfRGljdGlvbmFyeT4gbV9wRGljdDsgICAgICAgICAgIC8vIEZvciBFbGVtZW50LgorICB1aW50MzJfdCBtX1BhZ2VPYmpOdW07ICAvLyBGb3IgUGFnZUNvbnRlbnQsIFN0cmVhbUNvbnRlbnQsIE9iamVjdC4KKyAgdWludDMyX3QgbV9SZWZPYmpOdW07ICAgLy8gRm9yIFN0cmVhbUNvbnRlbnQsIE9iamVjdC4KKyAgdWludDMyX3QgbV9Db250ZW50SWQ7ICAgLy8gRm9yIFBhZ2VDb250ZW50LCBTdHJlYW1Db250ZW50LgorfTsKKworY2xhc3MgQ1BERl9TdHJ1Y3RFbGVtZW50IDogcHVibGljIFJldGFpbmFibGUgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3M+CisgIGZyaWVuZCBSZXRhaW5QdHI8VD4gcGRmaXVtOjpNYWtlUmV0YWluKEFyZ3MmJi4uLiBhcmdzKTsKKworICBjb25zdCBCeXRlU3RyaW5nJiBHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9UeXBlOyB9CisgIGNvbnN0IEJ5dGVTdHJpbmcmIEdldFRpdGxlKCkgY29uc3QgeyByZXR1cm4gbV9UaXRsZTsgfQorICBDUERGX0RpY3Rpb25hcnkqIEdldERpY3QoKSBjb25zdCB7IHJldHVybiBtX3BEaWN0LkdldCgpOyB9CisKKyAgc2l6ZV90IENvdW50S2lkcygpIGNvbnN0OworICBDUERGX1N0cnVjdEVsZW1lbnQqIEdldEtpZElmRWxlbWVudChzaXplX3QgaW5kZXgpIGNvbnN0OworICBzdGQ6OnZlY3RvcjxDUERGX1N0cnVjdEtpZD4qIEdldEtpZHMoKSB7IHJldHVybiAmbV9LaWRzOyB9CisKKyBwcml2YXRlOgorICBDUERGX1N0cnVjdEVsZW1lbnQoQ1BERl9TdHJ1Y3RUcmVlKiBwVHJlZSwKKyAgICAgICAgICAgICAgICAgICAgIENQREZfU3RydWN0RWxlbWVudCogcFBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QpOworICB+Q1BERl9TdHJ1Y3RFbGVtZW50KCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBMb2FkS2lkcyhDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKKyAgdm9pZCBMb2FkS2lkKHVpbnQzMl90IFBhZ2VPYmpOdW0sIENQREZfT2JqZWN0KiBwT2JqLCBDUERGX1N0cnVjdEtpZCogcEtpZCk7CisKKyAgVW5vd25lZFB0cjxDUERGX1N0cnVjdFRyZWU+IGNvbnN0IG1fcFRyZWU7CisgIFVub3duZWRQdHI8Q1BERl9TdHJ1Y3RFbGVtZW50PiBjb25zdCBtX3BQYXJlbnQ7CisgIFVub3duZWRQdHI8Q1BERl9EaWN0aW9uYXJ5PiBjb25zdCBtX3BEaWN0OworICBCeXRlU3RyaW5nIG1fVHlwZTsKKyAgQnl0ZVN0cmluZyBtX1RpdGxlOworICBzdGQ6OnZlY3RvcjxDUERGX1N0cnVjdEtpZD4gbV9LaWRzOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZQREZET0NfQ1BERl9TVFJVQ1RFTEVNRU5UX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3BkZl9zdHJ1Y3R0cmVlLmNwcCBiL2NvcmUvZnBkZmRvYy9jcGRmX3N0cnVjdHRyZWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZGI2OTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2ZwZGZkb2MvY3BkZl9zdHJ1Y3R0cmVlLmNwcApAQCAtMCwwICsxLDE0NSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfc3RydWN0dHJlZS5oIgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RvY3VtZW50LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bWJlci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9yZWZlcmVuY2UuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9udW1iZXJ0cmVlLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfc3RydWN0ZWxlbWVudC5oIgorCituYW1lc3BhY2UgeworCitib29sIElzVGFnZ2VkKGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2MpIHsKKyAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwQ2F0YWxvZyA9IHBEb2MtPkdldFJvb3QoKTsKKyAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwTWFya0luZm8gPSBwQ2F0YWxvZy0+R2V0RGljdEZvcigiTWFya0luZm8iKTsKKyAgcmV0dXJuIHBNYXJrSW5mbyAmJiBwTWFya0luZm8tPkdldEludGVnZXJGb3IoIk1hcmtlZCIpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9TdHJ1Y3RUcmVlPiBDUERGX1N0cnVjdFRyZWU6OkxvYWRQYWdlKAorICAgIGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QpIHsKKyAgaWYgKCFJc1RhZ2dlZChwRG9jKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBhdXRvIHBUcmVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU3RydWN0VHJlZT4ocERvYyk7CisgIHBUcmVlLT5Mb2FkUGFnZVRyZWUocFBhZ2VEaWN0KTsKKyAgcmV0dXJuIHBUcmVlOworfQorCitDUERGX1N0cnVjdFRyZWU6OkNQREZfU3RydWN0VHJlZShjb25zdCBDUERGX0RvY3VtZW50KiBwRG9jKQorICAgIDogbV9wVHJlZVJvb3QocERvYy0+R2V0Um9vdCgpLT5HZXREaWN0Rm9yKCJTdHJ1Y3RUcmVlUm9vdCIpKSwKKyAgICAgIG1fcFJvbGVNYXAobV9wVHJlZVJvb3QgPyBtX3BUcmVlUm9vdC0+R2V0RGljdEZvcigiUm9sZU1hcCIpIDogbnVsbHB0ciksCisgICAgICBtX3BQYWdlKG51bGxwdHIpIHt9CisKK0NQREZfU3RydWN0VHJlZTo6fkNQREZfU3RydWN0VHJlZSgpIHt9CisKK3ZvaWQgQ1BERl9TdHJ1Y3RUcmVlOjpMb2FkUGFnZVRyZWUoY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QpIHsKKyAgbV9wUGFnZSA9IHBQYWdlRGljdDsKKyAgaWYgKCFtX3BUcmVlUm9vdCkKKyAgICByZXR1cm47CisKKyAgQ1BERl9PYmplY3QqIHBLaWRzID0gbV9wVHJlZVJvb3QtPkdldERpcmVjdE9iamVjdEZvcigiSyIpOworICBpZiAoIXBLaWRzKQorICAgIHJldHVybjsKKworICB1aW50MzJfdCBkd0tpZHMgPSAwOworICBpZiAocEtpZHMtPklzRGljdGlvbmFyeSgpKQorICAgIGR3S2lkcyA9IDE7CisgIGVsc2UgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IHBLaWRzLT5Bc0FycmF5KCkpCisgICAgZHdLaWRzID0gcEFycmF5LT5HZXRDb3VudCgpOworICBlbHNlCisgICAgcmV0dXJuOworCisgIG1fS2lkcy5jbGVhcigpOworICBtX0tpZHMucmVzaXplKGR3S2lkcyk7CisgIENQREZfRGljdGlvbmFyeSogcFBhcmVudFRyZWUgPSBtX3BUcmVlUm9vdC0+R2V0RGljdEZvcigiUGFyZW50VHJlZSIpOworICBpZiAoIXBQYXJlbnRUcmVlKQorICAgIHJldHVybjsKKworICBDUERGX051bWJlclRyZWUgcGFyZW50X3RyZWUocFBhcmVudFRyZWUpOworICBpbnQgcGFyZW50c19pZCA9IHBQYWdlRGljdC0+R2V0SW50ZWdlckZvcigiU3RydWN0UGFyZW50cyIsIC0xKTsKKyAgaWYgKHBhcmVudHNfaWQgPCAwKQorICAgIHJldHVybjsKKworICBDUERGX0FycmF5KiBwUGFyZW50QXJyYXkgPSBUb0FycmF5KHBhcmVudF90cmVlLkxvb2t1cFZhbHVlKHBhcmVudHNfaWQpKTsKKyAgaWYgKCFwUGFyZW50QXJyYXkpCisgICAgcmV0dXJuOworCisgIHN0ZDo6bWFwPENQREZfRGljdGlvbmFyeSosIFJldGFpblB0cjxDUERGX1N0cnVjdEVsZW1lbnQ+PiBlbGVtZW50X21hcDsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwUGFyZW50QXJyYXktPkdldENvdW50KCk7IGkrKykgeworICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBQYXJlbnQgPSBwUGFyZW50QXJyYXktPkdldERpY3RBdChpKSkKKyAgICAgIEFkZFBhZ2VOb2RlKHBQYXJlbnQsICZlbGVtZW50X21hcCwgMCk7CisgIH0KK30KKworUmV0YWluUHRyPENQREZfU3RydWN0RWxlbWVudD4gQ1BERl9TdHJ1Y3RUcmVlOjpBZGRQYWdlTm9kZSgKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAorICAgIHN0ZDo6bWFwPENQREZfRGljdGlvbmFyeSosIFJldGFpblB0cjxDUERGX1N0cnVjdEVsZW1lbnQ+PiogbWFwLAorICAgIGludCBuTGV2ZWwpIHsKKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQga1N0cnVjdFRyZWVNYXhSZWN1cnNpb24gPSAzMjsKKyAgaWYgKG5MZXZlbCA+IGtTdHJ1Y3RUcmVlTWF4UmVjdXJzaW9uKQorICAgIHJldHVybiBudWxscHRyOworCisgIGF1dG8gaXQgPSBtYXAtPmZpbmQocERpY3QpOworICBpZiAoaXQgIT0gbWFwLT5lbmQoKSkKKyAgICByZXR1cm4gaXQtPnNlY29uZDsKKworICBhdXRvIHBFbGVtZW50ID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfU3RydWN0RWxlbWVudD4odGhpcywgbnVsbHB0ciwgcERpY3QpOworICAoKm1hcClbcERpY3RdID0gcEVsZW1lbnQ7CisgIENQREZfRGljdGlvbmFyeSogcFBhcmVudCA9IHBEaWN0LT5HZXREaWN0Rm9yKCJQIik7CisgIGlmICghcFBhcmVudCB8fCBwUGFyZW50LT5HZXRTdHJpbmdGb3IoIlR5cGUiKSA9PSAiU3RydWN0VHJlZVJvb3QiKSB7CisgICAgaWYgKCFBZGRUb3BMZXZlbE5vZGUocERpY3QsIHBFbGVtZW50KSkKKyAgICAgIG1hcC0+ZXJhc2UocERpY3QpOworICAgIHJldHVybiBwRWxlbWVudDsKKyAgfQorCisgIFJldGFpblB0cjxDUERGX1N0cnVjdEVsZW1lbnQ+IHBQYXJlbnRFbGVtZW50ID0KKyAgICAgIEFkZFBhZ2VOb2RlKHBQYXJlbnQsIG1hcCwgbkxldmVsICsgMSk7CisgIGJvb2wgYlNhdmUgPSBmYWxzZTsKKyAgZm9yIChDUERGX1N0cnVjdEtpZCYga2lkIDogKnBQYXJlbnRFbGVtZW50LT5HZXRLaWRzKCkpIHsKKyAgICBpZiAoa2lkLm1fVHlwZSA9PSBDUERGX1N0cnVjdEtpZDo6RWxlbWVudCAmJiBraWQubV9wRGljdCA9PSBwRGljdCkgeworICAgICAga2lkLm1fcEVsZW1lbnQgPSBwRWxlbWVudDsKKyAgICAgIGJTYXZlID0gdHJ1ZTsKKyAgICB9CisgIH0KKyAgaWYgKCFiU2F2ZSkKKyAgICBtYXAtPmVyYXNlKHBEaWN0KTsKKyAgcmV0dXJuIHBFbGVtZW50OworfQorCitib29sIENQREZfU3RydWN0VHJlZTo6QWRkVG9wTGV2ZWxOb2RlKAorICAgIENQREZfRGljdGlvbmFyeSogcERpY3QsCisgICAgY29uc3QgUmV0YWluUHRyPENQREZfU3RydWN0RWxlbWVudD4mIHBFbGVtZW50KSB7CisgIENQREZfT2JqZWN0KiBwT2JqID0gbV9wVHJlZVJvb3QtPkdldERpcmVjdE9iamVjdEZvcigiSyIpOworICBpZiAoIXBPYmopCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChwT2JqLT5Jc0RpY3Rpb25hcnkoKSkgeworICAgIGlmIChwT2JqLT5HZXRPYmpOdW0oKSAhPSBwRGljdC0+R2V0T2JqTnVtKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgbV9LaWRzWzBdID0gcEVsZW1lbnQ7CisgIH0KKworICBDUERGX0FycmF5KiBwVG9wS2lkcyA9IHBPYmotPkFzQXJyYXkoKTsKKyAgaWYgKCFwVG9wS2lkcykKKyAgICByZXR1cm4gdHJ1ZTsKKworICBib29sIGJTYXZlID0gZmFsc2U7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcFRvcEtpZHMtPkdldENvdW50KCk7IGkrKykgeworICAgIENQREZfUmVmZXJlbmNlKiBwS2lkUmVmID0gVG9SZWZlcmVuY2UocFRvcEtpZHMtPkdldE9iamVjdEF0KGkpKTsKKyAgICBpZiAocEtpZFJlZiAmJiBwS2lkUmVmLT5HZXRSZWZPYmpOdW0oKSA9PSBwRGljdC0+R2V0T2JqTnVtKCkpIHsKKyAgICAgIG1fS2lkc1tpXSA9IHBFbGVtZW50OworICAgICAgYlNhdmUgPSB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gYlNhdmU7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3BkZl9zdHJ1Y3R0cmVlLmggYi9jb3JlL2ZwZGZkb2MvY3BkZl9zdHJ1Y3R0cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzNDJmYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnBkZmRvYy9jcGRmX3N0cnVjdHRyZWUuaApAQCAtMCwwICsxLDUxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GUERGRE9DX0NQREZfU1RSVUNUVFJFRV9IXworI2RlZmluZSBDT1JFX0ZQREZET0NfQ1BERl9TVFJVQ1RUUkVFX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKKworY2xhc3MgQ1BERl9EaWN0aW9uYXJ5OworY2xhc3MgQ1BERl9Eb2N1bWVudDsKK2NsYXNzIENQREZfU3RydWN0RWxlbWVudDsKKworY2xhc3MgQ1BERl9TdHJ1Y3RUcmVlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9TdHJ1Y3RUcmVlPiBMb2FkUGFnZSgKKyAgICAgIGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCk7CisKKyAgZXhwbGljaXQgQ1BERl9TdHJ1Y3RUcmVlKGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2MpOworICB+Q1BERl9TdHJ1Y3RUcmVlKCk7CisKKyAgc2l6ZV90IENvdW50VG9wRWxlbWVudHMoKSBjb25zdCB7IHJldHVybiBtX0tpZHMuc2l6ZSgpOyB9CisgIENQREZfU3RydWN0RWxlbWVudCogR2V0VG9wRWxlbWVudChzaXplX3QgaSkgY29uc3QgeyByZXR1cm4gbV9LaWRzW2ldLkdldCgpOyB9CisgIGNvbnN0IENQREZfRGljdGlvbmFyeSogR2V0Um9sZU1hcCgpIGNvbnN0IHsgcmV0dXJuIG1fcFJvbGVNYXAuR2V0KCk7IH0KKyAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBHZXRQYWdlKCkgY29uc3QgeyByZXR1cm4gbV9wUGFnZS5HZXQoKTsgfQorICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIEdldFRyZWVSb290KCkgY29uc3QgeyByZXR1cm4gbV9wVHJlZVJvb3QuR2V0KCk7IH0KKworIHByaXZhdGU6CisgIHZvaWQgTG9hZFBhZ2VUcmVlKGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0KTsKKyAgUmV0YWluUHRyPENQREZfU3RydWN0RWxlbWVudD4gQWRkUGFnZU5vZGUoCisgICAgICBDUERGX0RpY3Rpb25hcnkqIHBFbGVtZW50LAorICAgICAgc3RkOjptYXA8Q1BERl9EaWN0aW9uYXJ5KiwgUmV0YWluUHRyPENQREZfU3RydWN0RWxlbWVudD4+KiBtYXAsCisgICAgICBpbnQgbkxldmVsKTsKKyAgYm9vbCBBZGRUb3BMZXZlbE5vZGUoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPENQREZfU3RydWN0RWxlbWVudD4mIHBFbGVtZW50KTsKKworICBVbm93bmVkUHRyPGNvbnN0IENQREZfRGljdGlvbmFyeT4gY29uc3QgbV9wVHJlZVJvb3Q7CisgIFVub3duZWRQdHI8Y29uc3QgQ1BERl9EaWN0aW9uYXJ5PiBjb25zdCBtX3BSb2xlTWFwOworICBVbm93bmVkUHRyPGNvbnN0IENQREZfRGljdGlvbmFyeT4gbV9wUGFnZTsKKyAgc3RkOjp2ZWN0b3I8UmV0YWluUHRyPENQREZfU3RydWN0RWxlbWVudD4+IG1fS2lkczsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GUERGRE9DX0NQREZfU1RSVUNUVFJFRV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwZGZfdmFyaWFibGV0ZXh0LmNwcCBiL2NvcmUvZnBkZmRvYy9jcGRmX3ZhcmlhYmxldGV4dC5jcHAKaW5kZXggOTRiMzQyNS4uNzRlYTIzOSAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwZGZfdmFyaWFibGV0ZXh0LmNwcAorKysgYi9jb3JlL2ZwZGZkb2MvY3BkZl92YXJpYWJsZXRleHQuY3BwCkBAIC03LDE1ICs3LDE3IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfdmFyaWFibGV0ZXh0LmgiCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dXRpbGl0eT4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jbGluZS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcHZ0X3NlY3Rpb24uaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3B2dF93b3JkLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwdnRfd29yZGluZm8uaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3NlY3Rpb24uaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvaXB2dF9mb250bWFwLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb2RlcGFnZS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCiAKIG5hbWVzcGFjZSB7CiAKQEAgLTExMiw1MSArMTE0LDE4IEBACiB9CiAKIGJvb2wgQ1BERl9WYXJpYWJsZVRleHQ6Okl0ZXJhdG9yOjpOZXh0TGluZSgpIHsKLSAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRBdChtX0N1clBvcy5uU2VjSW5kZXgpKSB7Ci0gICAgaWYgKG1fQ3VyUG9zLm5MaW5lSW5kZXggPCBwU2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0U2l6ZSgpIC0gMSkgewotICAgICAgbV9DdXJQb3MgPQotICAgICAgICAgIENQVlRfV29yZFBsYWNlKG1fQ3VyUG9zLm5TZWNJbmRleCwgbV9DdXJQb3MubkxpbmVJbmRleCArIDEsIC0xKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAobV9DdXJQb3MublNlY0luZGV4IDwgbV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldFNpemUoKSAtIDEpIHsKLSAgICAgIG1fQ3VyUG9zID0gQ1BWVF9Xb3JkUGxhY2UobV9DdXJQb3MublNlY0luZGV4ICsgMSwgMCwgLTEpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KKyAgaWYgKCFwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9wVlQtPm1fU2VjdGlvbkFycmF5LCBtX0N1clBvcy5uU2VjSW5kZXgpKQorICAgIHJldHVybiBmYWxzZTsKIAotYm9vbCBDUERGX1ZhcmlhYmxlVGV4dDo6SXRlcmF0b3I6OlByZXZMaW5lKCkgewotICBpZiAobV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldEF0KG1fQ3VyUG9zLm5TZWNJbmRleCkpIHsKLSAgICBpZiAobV9DdXJQb3MubkxpbmVJbmRleCA+IDApIHsKLSAgICAgIG1fQ3VyUG9zID0KLSAgICAgICAgICBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXgsIG1fQ3VyUG9zLm5MaW5lSW5kZXggLSAxLCAtMSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKG1fQ3VyUG9zLm5TZWNJbmRleCA+IDApIHsKLSAgICAgIGlmIChDU2VjdGlvbiogcExhc3RTZWN0aW9uID0KLSAgICAgICAgICAgICAgbV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldEF0KG1fQ3VyUG9zLm5TZWNJbmRleCAtIDEpKSB7Ci0gICAgICAgIG1fQ3VyUG9zID0gQ1BWVF9Xb3JkUGxhY2UobV9DdXJQb3MublNlY0luZGV4IC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGFzdFNlY3Rpb24tPm1fTGluZUFycmF5LkdldFNpemUoKSAtIDEsIC0xKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDUERGX1ZhcmlhYmxlVGV4dDo6SXRlcmF0b3I6Ok5leHRTZWN0aW9uKCkgewotICBpZiAobV9DdXJQb3MublNlY0luZGV4IDwgbV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldFNpemUoKSAtIDEpIHsKLSAgICBtX0N1clBvcyA9IENQVlRfV29yZFBsYWNlKG1fQ3VyUG9zLm5TZWNJbmRleCArIDEsIDAsIC0xKTsKKyAgQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9wVlQtPm1fU2VjdGlvbkFycmF5W21fQ3VyUG9zLm5TZWNJbmRleF0uZ2V0KCk7CisgIGlmIChtX0N1clBvcy5uTGluZUluZGV4IDwKKyAgICAgIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4ocFNlY3Rpb24tPm1fTGluZUFycmF5KSAtIDEpIHsKKyAgICBtX0N1clBvcyA9IENQVlRfV29yZFBsYWNlKG1fQ3VyUG9zLm5TZWNJbmRleCwgbV9DdXJQb3MubkxpbmVJbmRleCArIDEsIC0xKTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1BERl9WYXJpYWJsZVRleHQ6Okl0ZXJhdG9yOjpQcmV2U2VjdGlvbigpIHsKLSAgQVNTRVJUKG1fcFZUKTsKLSAgaWYgKG1fQ3VyUG9zLm5TZWNJbmRleCA+IDApIHsKLSAgICBtX0N1clBvcyA9IENQVlRfV29yZFBsYWNlKG1fQ3VyUG9zLm5TZWNJbmRleCAtIDEsIDAsIC0xKTsKKyAgaWYgKG1fQ3VyUG9zLm5TZWNJbmRleCA8CisgICAgICBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fcFZULT5tX1NlY3Rpb25BcnJheSkgLSAxKSB7CisgICAgbV9DdXJQb3MgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXggKyAxLCAwLCAtMSk7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KICAgcmV0dXJuIGZhbHNlOwpAQCAtMTY0LDgyICsxMzMsNDggQEAKIAogYm9vbCBDUERGX1ZhcmlhYmxlVGV4dDo6SXRlcmF0b3I6OkdldFdvcmQoQ1BWVF9Xb3JkJiB3b3JkKSBjb25zdCB7CiAgIHdvcmQuV29yZFBsYWNlID0gbV9DdXJQb3M7Ci0gIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX3BWVC0+bV9TZWN0aW9uQXJyYXkuR2V0QXQobV9DdXJQb3MublNlY0luZGV4KSkgewotICAgIGlmIChwU2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0QXQobV9DdXJQb3MubkxpbmVJbmRleCkpIHsKLSAgICAgIGlmIChDUFZUX1dvcmRJbmZvKiBwV29yZCA9Ci0gICAgICAgICAgICAgIHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdChtX0N1clBvcy5uV29yZEluZGV4KSkgewotICAgICAgICB3b3JkLldvcmQgPSBwV29yZC0+V29yZDsKLSAgICAgICAgd29yZC5uQ2hhcnNldCA9IHBXb3JkLT5uQ2hhcnNldDsKLSAgICAgICAgd29yZC5mV2lkdGggPSBtX3BWVC0+R2V0V29yZFdpZHRoKCpwV29yZCk7Ci0gICAgICAgIHdvcmQucHRXb3JkID0gbV9wVlQtPkluVG9PdXQoCi0gICAgICAgICAgICBDRlhfUG9pbnRGKHBXb3JkLT5mV29yZFggKyBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi5sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICBwV29yZC0+ZldvcmRZICsgcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24udG9wKSk7Ci0gICAgICAgIHdvcmQuZkFzY2VudCA9IG1fcFZULT5HZXRXb3JkQXNjZW50KCpwV29yZCk7Ci0gICAgICAgIHdvcmQuZkRlc2NlbnQgPSBtX3BWVC0+R2V0V29yZERlc2NlbnQoKnBXb3JkKTsKLSAgICAgICAgaWYgKHBXb3JkLT5wV29yZFByb3BzKQotICAgICAgICAgIHdvcmQuV29yZFByb3BzID0gKnBXb3JkLT5wV29yZFByb3BzOworICBpZiAoIXBkZml1bTo6SW5kZXhJbkJvdW5kcyhtX3BWVC0+bV9TZWN0aW9uQXJyYXksIG1fQ3VyUG9zLm5TZWNJbmRleCkpCisgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIHdvcmQubkZvbnRJbmRleCA9IG1fcFZULT5HZXRXb3JkRm9udEluZGV4KCpwV29yZCk7Ci0gICAgICAgIHdvcmQuZkZvbnRTaXplID0gbV9wVlQtPkdldFdvcmRGb250U2l6ZSgqcFdvcmQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9CisgIENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fcFZULT5tX1NlY3Rpb25BcnJheVttX0N1clBvcy5uU2VjSW5kZXhdLmdldCgpOworICBpZiAoIXBkZml1bTo6SW5kZXhJbkJvdW5kcyhwU2VjdGlvbi0+bV9MaW5lQXJyYXksIG1fQ3VyUG9zLm5MaW5lSW5kZXgpIHx8CisgICAgICAhcGRmaXVtOjpJbmRleEluQm91bmRzKHBTZWN0aW9uLT5tX1dvcmRBcnJheSwgbV9DdXJQb3MubldvcmRJbmRleCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CiAgIH0KLSAgcmV0dXJuIGZhbHNlOwotfQogCi1ib29sIENQREZfVmFyaWFibGVUZXh0OjpJdGVyYXRvcjo6U2V0V29yZChjb25zdCBDUFZUX1dvcmQmIHdvcmQpIHsKLSAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRBdChtX0N1clBvcy5uU2VjSW5kZXgpKSB7Ci0gICAgaWYgKENQVlRfV29yZEluZm8qIHBXb3JkID0KLSAgICAgICAgICAgIHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdChtX0N1clBvcy5uV29yZEluZGV4KSkgewotICAgICAgaWYgKHBXb3JkLT5wV29yZFByb3BzKQotICAgICAgICAqcFdvcmQtPnBXb3JkUHJvcHMgPSB3b3JkLldvcmRQcm9wczsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7CisgIENQVlRfV29yZEluZm8qIHBXb3JkID0gcFNlY3Rpb24tPm1fV29yZEFycmF5W21fQ3VyUG9zLm5Xb3JkSW5kZXhdLmdldCgpOworICB3b3JkLldvcmQgPSBwV29yZC0+V29yZDsKKyAgd29yZC5uQ2hhcnNldCA9IHBXb3JkLT5uQ2hhcnNldDsKKyAgd29yZC5mV2lkdGggPSBtX3BWVC0+R2V0V29yZFdpZHRoKCpwV29yZCk7CisgIHdvcmQucHRXb3JkID0KKyAgICAgIG1fcFZULT5JblRvT3V0KENGWF9Qb2ludEYocFdvcmQtPmZXb3JkWCArIHBTZWN0aW9uLT5tX1JlY3QubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdvcmQtPmZXb3JkWSArIHBTZWN0aW9uLT5tX1JlY3QudG9wKSk7CisgIHdvcmQuZkFzY2VudCA9IG1fcFZULT5HZXRXb3JkQXNjZW50KCpwV29yZCk7CisgIHdvcmQuZkRlc2NlbnQgPSBtX3BWVC0+R2V0V29yZERlc2NlbnQoKnBXb3JkKTsKKyAgd29yZC5uRm9udEluZGV4ID0gbV9wVlQtPkdldFdvcmRGb250SW5kZXgoKnBXb3JkKTsKKyAgd29yZC5mRm9udFNpemUgPSBtX3BWVC0+R2V0V29yZEZvbnRTaXplKCk7CisgIHJldHVybiB0cnVlOwogfQogCiBib29sIENQREZfVmFyaWFibGVUZXh0OjpJdGVyYXRvcjo6R2V0TGluZShDUFZUX0xpbmUmIGxpbmUpIGNvbnN0IHsKICAgQVNTRVJUKG1fcFZUKTsKICAgbGluZS5saW5lcGxhY2UgPSBDUFZUX1dvcmRQbGFjZShtX0N1clBvcy5uU2VjSW5kZXgsIG1fQ3VyUG9zLm5MaW5lSW5kZXgsIC0xKTsKLSAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fcFZULT5tX1NlY3Rpb25BcnJheS5HZXRBdChtX0N1clBvcy5uU2VjSW5kZXgpKSB7Ci0gICAgaWYgKENMaW5lKiBwTGluZSA9IHBTZWN0aW9uLT5tX0xpbmVBcnJheS5HZXRBdChtX0N1clBvcy5uTGluZUluZGV4KSkgewotICAgICAgbGluZS5wdExpbmUgPSBtX3BWVC0+SW5Ub091dChDRlhfUG9pbnRGKAotICAgICAgICAgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWCArIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLmxlZnQsCi0gICAgICAgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVZICsgcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24udG9wKSk7Ci0gICAgICBsaW5lLmZMaW5lV2lkdGggPSBwTGluZS0+bV9MaW5lSW5mby5mTGluZVdpZHRoOwotICAgICAgbGluZS5mTGluZUFzY2VudCA9IHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lQXNjZW50OwotICAgICAgbGluZS5mTGluZURlc2NlbnQgPSBwTGluZS0+bV9MaW5lSW5mby5mTGluZURlc2NlbnQ7Ci0gICAgICBsaW5lLmxpbmVFbmQgPSBwTGluZS0+R2V0RW5kV29yZFBsYWNlKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQorICBpZiAoIXBkZml1bTo6SW5kZXhJbkJvdW5kcyhtX3BWVC0+bV9TZWN0aW9uQXJyYXksIG1fQ3VyUG9zLm5TZWNJbmRleCkpCisgICAgcmV0dXJuIGZhbHNlOwogCi1ib29sIENQREZfVmFyaWFibGVUZXh0OjpJdGVyYXRvcjo6R2V0U2VjdGlvbihDUFZUX1NlY3Rpb24mIHNlY3Rpb24pIGNvbnN0IHsKLSAgc2VjdGlvbi5zZWNwbGFjZSA9IENQVlRfV29yZFBsYWNlKG1fQ3VyUG9zLm5TZWNJbmRleCwgMCwgLTEpOwotICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldEF0KG1fQ3VyUG9zLm5TZWNJbmRleCkpIHsKLSAgICBzZWN0aW9uLnJjU2VjdGlvbiA9IG1fcFZULT5JblRvT3V0KHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uKTsKLSAgICBpZiAocFNlY3Rpb24tPm1fU2VjSW5mby5wU2VjUHJvcHMpCi0gICAgICBzZWN0aW9uLlNlY1Byb3BzID0gKnBTZWN0aW9uLT5tX1NlY0luZm8ucFNlY1Byb3BzOwotICAgIGlmIChwU2VjdGlvbi0+bV9TZWNJbmZvLnBXb3JkUHJvcHMpCi0gICAgICBzZWN0aW9uLldvcmRQcm9wcyA9ICpwU2VjdGlvbi0+bV9TZWNJbmZvLnBXb3JkUHJvcHM7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQorICBDU2VjdGlvbiogcFNlY3Rpb24gPSBtX3BWVC0+bV9TZWN0aW9uQXJyYXlbbV9DdXJQb3MublNlY0luZGV4XS5nZXQoKTsKKyAgaWYgKCFwZGZpdW06OkluZGV4SW5Cb3VuZHMocFNlY3Rpb24tPm1fTGluZUFycmF5LCBtX0N1clBvcy5uTGluZUluZGV4KSkKKyAgICByZXR1cm4gZmFsc2U7CiAKLWJvb2wgQ1BERl9WYXJpYWJsZVRleHQ6Okl0ZXJhdG9yOjpTZXRTZWN0aW9uKGNvbnN0IENQVlRfU2VjdGlvbiYgc2VjdGlvbikgewotICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9wVlQtPm1fU2VjdGlvbkFycmF5LkdldEF0KG1fQ3VyUG9zLm5TZWNJbmRleCkpIHsKLSAgICBpZiAocFNlY3Rpb24tPm1fU2VjSW5mby5wU2VjUHJvcHMpCi0gICAgICAqcFNlY3Rpb24tPm1fU2VjSW5mby5wU2VjUHJvcHMgPSBzZWN0aW9uLlNlY1Byb3BzOwotICAgIGlmIChwU2VjdGlvbi0+bV9TZWNJbmZvLnBXb3JkUHJvcHMpCi0gICAgICAqcFNlY3Rpb24tPm1fU2VjSW5mby5wV29yZFByb3BzID0gc2VjdGlvbi5Xb3JkUHJvcHM7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOworICBDTGluZSogcExpbmUgPSBwU2VjdGlvbi0+bV9MaW5lQXJyYXlbbV9DdXJQb3MubkxpbmVJbmRleF0uZ2V0KCk7CisgIGxpbmUucHRMaW5lID0gbV9wVlQtPkluVG9PdXQoCisgICAgICBDRlhfUG9pbnRGKHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWCArIHBTZWN0aW9uLT5tX1JlY3QubGVmdCwKKyAgICAgICAgICAgICAgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVZICsgcFNlY3Rpb24tPm1fUmVjdC50b3ApKTsKKyAgbGluZS5mTGluZVdpZHRoID0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVXaWR0aDsKKyAgbGluZS5mTGluZUFzY2VudCA9IHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lQXNjZW50OworICBsaW5lLmZMaW5lRGVzY2VudCA9IHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lRGVzY2VudDsKKyAgbGluZS5saW5lRW5kID0gcExpbmUtPkdldEVuZFdvcmRQbGFjZSgpOworICByZXR1cm4gdHJ1ZTsKIH0KIAogQ1BERl9WYXJpYWJsZVRleHQ6OkNQREZfVmFyaWFibGVUZXh0KCkKQEAgLTI1NCw0NCArMTg5LDM3IEBACiAgICAgICBtX25Ib3J6U2NhbGUoMTAwKSwKICAgICAgIG1fd1N1YldvcmQoMCksCiAgICAgICBtX2ZGb250U2l6ZSgwLjBmKSwKLSAgICAgIG1fYkluaXRpYWwoZmFsc2UpLAorICAgICAgbV9iSW5pdGlhbGl6ZWQoZmFsc2UpLAogICAgICAgbV9wVlRQcm92aWRlcihudWxscHRyKSB7fQogCi1DUERGX1ZhcmlhYmxlVGV4dDo6fkNQREZfVmFyaWFibGVUZXh0KCkgewotICBSZXNldEFsbCgpOwotfQorQ1BERl9WYXJpYWJsZVRleHQ6On5DUERGX1ZhcmlhYmxlVGV4dCgpIHt9CiAKIHZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OkluaXRpYWxpemUoKSB7Ci0gIGlmICghbV9iSW5pdGlhbCkgewotICAgIENQVlRfU2VjdGlvbkluZm8gc2VjaW5mbzsKLSAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZTsKLSAgICBwbGFjZS5uU2VjSW5kZXggPSAwOwotICAgIEFkZFNlY3Rpb24ocGxhY2UsIHNlY2luZm8pOwotICAgIENQVlRfTGluZUluZm8gbGluZWluZm87Ci0gICAgbGluZWluZm8uZkxpbmVBc2NlbnQgPSBHZXRGb250QXNjZW50KEdldERlZmF1bHRGb250SW5kZXgoKSwgR2V0Rm9udFNpemUoKSk7Ci0gICAgbGluZWluZm8uZkxpbmVEZXNjZW50ID0KLSAgICAgICAgR2V0Rm9udERlc2NlbnQoR2V0RGVmYXVsdEZvbnRJbmRleCgpLCBHZXRGb250U2l6ZSgpKTsKLSAgICBBZGRMaW5lKHBsYWNlLCBsaW5laW5mbyk7Ci0gICAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KDApKQotICAgICAgcFNlY3Rpb24tPlJlc2V0TGluZVBsYWNlKCk7CisgIGlmIChtX2JJbml0aWFsaXplZCkKKyAgICByZXR1cm47CiAKLSAgICBtX2JJbml0aWFsID0gdHJ1ZTsKLSAgfQotfQorICBDUFZUX1dvcmRQbGFjZSBwbGFjZTsKKyAgcGxhY2UublNlY0luZGV4ID0gMDsKKyAgQWRkU2VjdGlvbihwbGFjZSk7CiAKLXZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OlJlc2V0QWxsKCkgewotICBtX2JJbml0aWFsID0gZmFsc2U7Ci0gIFJlc2V0U2VjdGlvbkFycmF5KCk7CisgIENQVlRfTGluZUluZm8gbGluZWluZm87CisgIGxpbmVpbmZvLmZMaW5lQXNjZW50ID0gR2V0Rm9udEFzY2VudChHZXREZWZhdWx0Rm9udEluZGV4KCksIEdldEZvbnRTaXplKCkpOworICBsaW5laW5mby5mTGluZURlc2NlbnQgPSBHZXRGb250RGVzY2VudChHZXREZWZhdWx0Rm9udEluZGV4KCksIEdldEZvbnRTaXplKCkpOworICBBZGRMaW5lKHBsYWNlLCBsaW5laW5mbyk7CisKKyAgaWYgKCFtX1NlY3Rpb25BcnJheS5lbXB0eSgpKQorICAgIG1fU2VjdGlvbkFycmF5LmZyb250KCktPlJlc2V0TGluZVBsYWNlKCk7CisKKyAgbV9iSW5pdGlhbGl6ZWQgPSB0cnVlOwogfQogCiBDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6SW5zZXJ0V29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB3b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMpIHsKLSAgaW50MzJfdCBuVG90bGFXb3JkcyA9IEdldFRvdGFsV29yZHMoKTsKLSAgaWYgKG1fbkxpbWl0Q2hhciA+IDAgJiYgblRvdGxhV29yZHMgPj0gbV9uTGltaXRDaGFyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0KSB7CisgIGludDMyX3QgblRvdGFsV29yZHMgPSBHZXRUb3RhbFdvcmRzKCk7CisgIGlmIChtX25MaW1pdENoYXIgPiAwICYmIG5Ub3RhbFdvcmRzID49IG1fbkxpbWl0Q2hhcikKICAgICByZXR1cm4gcGxhY2U7Ci0gIGlmIChtX25DaGFyQXJyYXkgPiAwICYmIG5Ub3RsYVdvcmRzID49IG1fbkNoYXJBcnJheSkKKyAgaWYgKG1fbkNoYXJBcnJheSA+IDAgJiYgblRvdGFsV29yZHMgPj0gbV9uQ2hhckFycmF5KQogICAgIHJldHVybiBwbGFjZTsKIAogICBDUFZUX1dvcmRQbGFjZSBuZXdwbGFjZSA9IHBsYWNlOwpAQCAtMjk5LDg1ICsyMjcsNDUgQEAKICAgaW50MzJfdCBuRm9udEluZGV4ID0KICAgICAgIEdldFN1YldvcmQoKSA+IDAgPyBHZXREZWZhdWx0Rm9udEluZGV4KCkKICAgICAgICAgICAgICAgICAgICAgICAgOiBHZXRXb3JkRm9udEluZGV4KHdvcmQsIGNoYXJzZXQsIEdldERlZmF1bHRGb250SW5kZXgoKSk7Ci0gIHJldHVybiBBZGRXb3JkKG5ld3BsYWNlLCBDUFZUX1dvcmRJbmZvKHdvcmQsIGNoYXJzZXQsIG5Gb250SW5kZXgsIG51bGxwdHIpKTsKKyAgcmV0dXJuIEFkZFdvcmQobmV3cGxhY2UsIENQVlRfV29yZEluZm8od29yZCwgY2hhcnNldCwgbkZvbnRJbmRleCkpOwogfQogCi1DUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6SW5zZXJ0U2VjdGlvbigKLSAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCi0gICAgY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzLAotICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzKSB7Ci0gIGludDMyX3QgblRvdGxhV29yZHMgPSBHZXRUb3RhbFdvcmRzKCk7Ci0gIGlmIChtX25MaW1pdENoYXIgPiAwICYmIG5Ub3RsYVdvcmRzID49IG1fbkxpbWl0Q2hhcikKK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpJbnNlcnRTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgeworICBpbnQzMl90IG5Ub3RhbFdvcmRzID0gR2V0VG90YWxXb3JkcygpOworICBpZiAobV9uTGltaXRDaGFyID4gMCAmJiBuVG90YWxXb3JkcyA+PSBtX25MaW1pdENoYXIpCiAgICAgcmV0dXJuIHBsYWNlOwotICBpZiAobV9uQ2hhckFycmF5ID4gMCAmJiBuVG90bGFXb3JkcyA+PSBtX25DaGFyQXJyYXkpCisgIGlmIChtX25DaGFyQXJyYXkgPiAwICYmIG5Ub3RhbFdvcmRzID49IG1fbkNoYXJBcnJheSkKICAgICByZXR1cm4gcGxhY2U7CiAgIGlmICghbV9iTXVsdGlMaW5lKQogICAgIHJldHVybiBwbGFjZTsKIAogICBDUFZUX1dvcmRQbGFjZSB3b3JkcGxhY2UgPSBwbGFjZTsKICAgVXBkYXRlV29yZFBsYWNlKHdvcmRwbGFjZSk7Ci0gIENQVlRfV29yZFBsYWNlIG5ld3BsYWNlID0gcGxhY2U7Ci0gIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdCh3b3JkcGxhY2UublNlY0luZGV4KSkgewotICAgIENQVlRfV29yZFBsYWNlIE5ld1BsYWNlKHdvcmRwbGFjZS5uU2VjSW5kZXggKyAxLCAwLCAtMSk7Ci0gICAgQ1BWVF9TZWN0aW9uSW5mbyBzZWNpbmZvOwotICAgIEFkZFNlY3Rpb24oTmV3UGxhY2UsIHNlY2luZm8pOwotICAgIG5ld3BsYWNlID0gTmV3UGxhY2U7Ci0gICAgaWYgKENTZWN0aW9uKiBwTmV3U2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KE5ld1BsYWNlLm5TZWNJbmRleCkpIHsKLSAgICAgIGZvciAoaW50MzJfdCB3ID0gd29yZHBsYWNlLm5Xb3JkSW5kZXggKyAxLAotICAgICAgICAgICAgICAgICAgIHN6ID0gcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKTsKLSAgICAgICAgICAgdyA8IHN6OyB3KyspIHsKLSAgICAgICAgaWYgKENQVlRfV29yZEluZm8qIHBXb3JkID0gcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldEF0KHcpKSB7Ci0gICAgICAgICAgTmV3UGxhY2UubldvcmRJbmRleCsrOwotICAgICAgICAgIHBOZXdTZWN0aW9uLT5BZGRXb3JkKE5ld1BsYWNlLCAqcFdvcmQpOwotICAgICAgICB9Ci0gICAgICB9CisgIGlmICghcGRmaXVtOjpJbmRleEluQm91bmRzKG1fU2VjdGlvbkFycmF5LCB3b3JkcGxhY2UublNlY0luZGV4KSkKKyAgICByZXR1cm4gcGxhY2U7CisKKyAgQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXlbd29yZHBsYWNlLm5TZWNJbmRleF0uZ2V0KCk7CisgIENQVlRfV29yZFBsYWNlIE5ld1BsYWNlKHdvcmRwbGFjZS5uU2VjSW5kZXggKyAxLCAwLCAtMSk7CisgIEFkZFNlY3Rpb24oTmV3UGxhY2UpOworICBDUFZUX1dvcmRQbGFjZSByZXN1bHQgPSBOZXdQbGFjZTsKKyAgaWYgKHBkZml1bTo6SW5kZXhJbkJvdW5kcyhtX1NlY3Rpb25BcnJheSwgTmV3UGxhY2UublNlY0luZGV4KSkgeworICAgIENTZWN0aW9uKiBwTmV3U2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5W05ld1BsYWNlLm5TZWNJbmRleF0uZ2V0KCk7CisgICAgZm9yIChpbnQzMl90IHcgPSB3b3JkcGxhY2UubldvcmRJbmRleCArIDE7CisgICAgICAgICB3IDwgcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihwU2VjdGlvbi0+bV9Xb3JkQXJyYXkpOyArK3cpIHsKKyAgICAgIE5ld1BsYWNlLm5Xb3JkSW5kZXgrKzsKKyAgICAgIHBOZXdTZWN0aW9uLT5BZGRXb3JkKE5ld1BsYWNlLCAqcFNlY3Rpb24tPm1fV29yZEFycmF5W3ddKTsKICAgICB9Ci0gICAgQ2xlYXJTZWN0aW9uUmlnaHRXb3Jkcyh3b3JkcGxhY2UpOwogICB9Ci0gIHJldHVybiBuZXdwbGFjZTsKLX0KLQotQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6Okluc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHRleHQpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgc3dUZXh0ID0gdGV4dDsKLSAgQ1BWVF9Xb3JkUGxhY2Ugd3AgPSBwbGFjZTsKLSAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IHN3VGV4dC5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspIHsKLSAgICBDUFZUX1dvcmRQbGFjZSBvbGR3cCA9IHdwOwotICAgIHVpbnQxNl90IHdvcmQgPSBzd1RleHQuR2V0QXQoaSk7Ci0gICAgc3dpdGNoICh3b3JkKSB7Ci0gICAgICBjYXNlIDB4MEQ6Ci0gICAgICAgIGlmIChtX2JNdWx0aUxpbmUpIHsKLSAgICAgICAgICBpZiAoc3dUZXh0LkdldEF0KGkgKyAxKSA9PSAweDBBKQotICAgICAgICAgICAgaSArPSAxOwotCi0gICAgICAgICAgd3AgPSBJbnNlcnRTZWN0aW9uKHdwLCBudWxscHRyLCBudWxscHRyKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMHgwQToKLSAgICAgICAgaWYgKG1fYk11bHRpTGluZSkgewotICAgICAgICAgIGlmIChzd1RleHQuR2V0QXQoaSArIDEpID09IDB4MEQpCi0gICAgICAgICAgICBpICs9IDE7Ci0KLSAgICAgICAgICB3cCA9IEluc2VydFNlY3Rpb24od3AsIG51bGxwdHIsIG51bGxwdHIpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAweDA5OgotICAgICAgICB3b3JkID0gMHgyMDsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHdwID0gSW5zZXJ0V29yZCh3cCwgd29yZCwgRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCwgbnVsbHB0cik7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAod3AgPT0gb2xkd3ApCi0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gd3A7CisgIENsZWFyU2VjdGlvblJpZ2h0V29yZHMod29yZHBsYWNlKTsKKyAgcmV0dXJuIHJlc3VsdDsKIH0KIAogQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkRlbGV0ZVdvcmRzKAogICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiBQbGFjZVJhbmdlKSB7Ci0gIGJvb2wgYkxhc3RTZWNQb3MgPSBmYWxzZTsKLSAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KFBsYWNlUmFuZ2UuRW5kUG9zLm5TZWNJbmRleCkpCi0gICAgYkxhc3RTZWNQb3MgPSAoUGxhY2VSYW5nZS5FbmRQb3MgPT0gcFNlY3Rpb24tPkdldEVuZFdvcmRQbGFjZSgpKTsKKyAgYm9vbCBiTGFzdFNlY1BvcyA9CisgICAgICBwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9TZWN0aW9uQXJyYXksIFBsYWNlUmFuZ2UuRW5kUG9zLm5TZWNJbmRleCkgJiYKKyAgICAgIFBsYWNlUmFuZ2UuRW5kUG9zID09CisgICAgICAgICAgbV9TZWN0aW9uQXJyYXlbUGxhY2VSYW5nZS5FbmRQb3MublNlY0luZGV4XS0+R2V0RW5kV29yZFBsYWNlKCk7CiAKICAgQ2xlYXJXb3JkcyhQbGFjZVJhbmdlKTsKICAgaWYgKFBsYWNlUmFuZ2UuQmVnaW5Qb3MublNlY0luZGV4ICE9IFBsYWNlUmFuZ2UuRW5kUG9zLm5TZWNJbmRleCkgewpAQCAtMzk2LDEyICsyODQsMTEgQEAKICAgcmV0dXJuIENsZWFyTGVmdFdvcmQoQWRqdXN0TGluZUhlYWRlcihwbGFjZSwgdHJ1ZSkpOwogfQogCi12b2lkIENQREZfVmFyaWFibGVUZXh0OjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd1RleHQpIHsKK3ZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OlNldFRleHQoY29uc3QgV2lkZVN0cmluZyYgc3dUZXh0KSB7CiAgIERlbGV0ZVdvcmRzKENQVlRfV29yZFJhbmdlKEdldEJlZ2luV29yZFBsYWNlKCksIEdldEVuZFdvcmRQbGFjZSgpKSk7CiAgIENQVlRfV29yZFBsYWNlIHdwKDAsIDAsIC0xKTsKLSAgQ1BWVF9TZWN0aW9uSW5mbyBzZWNpbmZvOwotICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQoMCkpCi0gICAgcFNlY3Rpb24tPm1fU2VjSW5mbyA9IHNlY2luZm87CisgIGlmICghbV9TZWN0aW9uQXJyYXkuZW1wdHkoKSkKKyAgICBtX1NlY3Rpb25BcnJheS5mcm9udCgpLT5tX1JlY3QgPSBDUFZUX0Zsb2F0UmVjdCgpOwogCiAgIGludDMyX3QgbkNoYXJDb3VudCA9IDA7CiAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBzd1RleHQuR2V0TGVuZ3RoKCk7IGkgPCBzejsgaSsrKSB7CkBAIC00MTAsMzQgKzI5NywyOCBAQAogICAgIGlmIChtX25DaGFyQXJyYXkgPiAwICYmIG5DaGFyQ291bnQgPj0gbV9uQ2hhckFycmF5KQogICAgICAgYnJlYWs7CiAKLSAgICB1aW50MTZfdCB3b3JkID0gc3dUZXh0LkdldEF0KGkpOworICAgIHVpbnQxNl90IHdvcmQgPSBzd1RleHRbaV07CiAgICAgc3dpdGNoICh3b3JkKSB7CiAgICAgICBjYXNlIDB4MEQ6CiAgICAgICAgIGlmIChtX2JNdWx0aUxpbmUpIHsKLSAgICAgICAgICBpZiAoc3dUZXh0LkdldEF0KGkgKyAxKSA9PSAweDBBKQotICAgICAgICAgICAgaSArPSAxOwotCi0gICAgICAgICAgd3AublNlY0luZGV4Kys7Ci0gICAgICAgICAgd3AubkxpbmVJbmRleCA9IDA7Ci0gICAgICAgICAgd3AubldvcmRJbmRleCA9IC0xOwotICAgICAgICAgIEFkZFNlY3Rpb24od3AsIHNlY2luZm8pOworICAgICAgICAgIGlmIChpICsgMSA8IHN6ICYmIHN3VGV4dFtpICsgMV0gPT0gMHgwQSkKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICB3cC5BZHZhbmNlU2VjdGlvbigpOworICAgICAgICAgIEFkZFNlY3Rpb24od3ApOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSAweDBBOgogICAgICAgICBpZiAobV9iTXVsdGlMaW5lKSB7Ci0gICAgICAgICAgaWYgKHN3VGV4dC5HZXRBdChpICsgMSkgPT0gMHgwRCkKLSAgICAgICAgICAgIGkgKz0gMTsKLQotICAgICAgICAgIHdwLm5TZWNJbmRleCsrOwotICAgICAgICAgIHdwLm5MaW5lSW5kZXggPSAwOwotICAgICAgICAgIHdwLm5Xb3JkSW5kZXggPSAtMTsKLSAgICAgICAgICBBZGRTZWN0aW9uKHdwLCBzZWNpbmZvKTsKKyAgICAgICAgICBpZiAoaSArIDEgPCBzeiAmJiBzd1RleHRbaSArIDFdID09IDB4MEQpCisgICAgICAgICAgICBpKys7CisgICAgICAgICAgd3AuQWR2YW5jZVNlY3Rpb24oKTsKKyAgICAgICAgICBBZGRTZWN0aW9uKHdwKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgMHgwOToKICAgICAgICAgd29yZCA9IDB4MjA7CiAgICAgICBkZWZhdWx0OgotICAgICAgICB3cCA9IEluc2VydFdvcmQod3AsIHdvcmQsIEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQsIG51bGxwdHIpOworICAgICAgICB3cCA9IEluc2VydFdvcmQod3AsIHdvcmQsIEZYX0NIQVJTRVRfRGVmYXVsdCk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBuQ2hhckNvdW50Kys7CkBAIC00NDcsMTIgKzMyOCwxMiBAQAogdm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6VXBkYXRlV29yZFBsYWNlKENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgewogICBpZiAocGxhY2UublNlY0luZGV4IDwgMCkKICAgICBwbGFjZSA9IEdldEJlZ2luV29yZFBsYWNlKCk7Ci0gIGlmIChwbGFjZS5uU2VjSW5kZXggPj0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpKQorICBpZiAocGxhY2UublNlY0luZGV4ID49IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9TZWN0aW9uQXJyYXkpKQogICAgIHBsYWNlID0gR2V0RW5kV29yZFBsYWNlKCk7CiAKICAgcGxhY2UgPSBBZGp1c3RMaW5lSGVhZGVyKHBsYWNlLCB0cnVlKTsKLSAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpCi0gICAgcFNlY3Rpb24tPlVwZGF0ZVdvcmRQbGFjZShwbGFjZSk7CisgIGlmIChwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9TZWN0aW9uQXJyYXksIHBsYWNlLm5TZWNJbmRleCkpCisgICAgbV9TZWN0aW9uQXJyYXlbcGxhY2UublNlY0luZGV4XS0+VXBkYXRlV29yZFBsYWNlKHBsYWNlKTsKIH0KIAogaW50MzJfdCBDUERGX1ZhcmlhYmxlVGV4dDo6V29yZFBsYWNlVG9Xb3JkSW5kZXgoCkBAIC00NjIsODkgKzM0Myw4NiBAQAogICBpbnQzMl90IG5JbmRleCA9IDA7CiAgIGludDMyX3QgaSA9IDA7CiAgIGludDMyX3Qgc3ogPSAwOwotICBmb3IgKGkgPSAwLCBzeiA9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKTsgaSA8IHN6ICYmIGkgPCBuZXdwbGFjZS5uU2VjSW5kZXg7Ci0gICAgICAgaSsrKSB7Ci0gICAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KGkpKSB7Ci0gICAgICBuSW5kZXggKz0gcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKTsKLSAgICAgIGlmIChpICE9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSAtIDEpCi0gICAgICAgIG5JbmRleCArPSBrUmV0dXJuTGVuZ3RoOwotICAgIH0KKyAgZm9yIChpID0gMCwgc3ogPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fU2VjdGlvbkFycmF5KTsKKyAgICAgICBpIDwgc3ogJiYgaSA8IG5ld3BsYWNlLm5TZWNJbmRleDsgaSsrKSB7CisgICAgQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXlbaV0uZ2V0KCk7CisgICAgbkluZGV4ICs9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4ocFNlY3Rpb24tPm1fV29yZEFycmF5KTsKKyAgICBpZiAoaSAhPSBzeiAtIDEpCisgICAgICBuSW5kZXggKz0ga1JldHVybkxlbmd0aDsKICAgfQotICBpZiAoaSA+PSAwICYmIGkgPCBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkpCisgIGlmIChwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9TZWN0aW9uQXJyYXksIGkpKQogICAgIG5JbmRleCArPSBuZXdwbGFjZS5uV29yZEluZGV4ICsga1JldHVybkxlbmd0aDsKICAgcmV0dXJuIG5JbmRleDsKIH0KIAogQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OldvcmRJbmRleFRvV29yZFBsYWNlKGludDMyX3QgaW5kZXgpIGNvbnN0IHsKICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBHZXRCZWdpbldvcmRQbGFjZSgpOwotICBpbnQzMl90IG5PbGRJbmRleCA9IDAsIG5JbmRleCA9IDA7Ci0gIGJvb2wgYkZpbmQgPSBmYWxzZTsKLSAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKLSAgICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQoaSkpIHsKLSAgICAgIG5JbmRleCArPSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpOwotICAgICAgaWYgKG5JbmRleCA9PSBpbmRleCkgewotICAgICAgICBwbGFjZSA9IHBTZWN0aW9uLT5HZXRFbmRXb3JkUGxhY2UoKTsKLSAgICAgICAgYkZpbmQgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSBpZiAobkluZGV4ID4gaW5kZXgpIHsKLSAgICAgICAgcGxhY2UublNlY0luZGV4ID0gaTsKLSAgICAgICAgcGxhY2UubldvcmRJbmRleCA9IGluZGV4IC0gbk9sZEluZGV4IC0gMTsKLSAgICAgICAgcFNlY3Rpb24tPlVwZGF0ZVdvcmRQbGFjZShwbGFjZSk7Ci0gICAgICAgIGJGaW5kID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoaSAhPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLSAxKQotICAgICAgICBuSW5kZXggKz0ga1JldHVybkxlbmd0aDsKLSAgICAgIG5PbGRJbmRleCA9IG5JbmRleDsKKyAgaW50MzJfdCBuT2xkSW5kZXggPSAwOworICBpbnQzMl90IG5JbmRleCA9IDA7CisgIGJvb2wgYkZvdW5kID0gZmFsc2U7CisgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fU2VjdGlvbkFycmF5KTsKKyAgICAgICBpIDwgc3o7IGkrKykgeworICAgIENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5W2ldLmdldCgpOworICAgIG5JbmRleCArPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHBTZWN0aW9uLT5tX1dvcmRBcnJheSk7CisgICAgaWYgKG5JbmRleCA9PSBpbmRleCkgeworICAgICAgcGxhY2UgPSBwU2VjdGlvbi0+R2V0RW5kV29yZFBsYWNlKCk7CisgICAgICBiRm91bmQgPSB0cnVlOworICAgICAgYnJlYWs7CiAgICAgfQorICAgIGlmIChuSW5kZXggPiBpbmRleCkgeworICAgICAgcGxhY2UublNlY0luZGV4ID0gaTsKKyAgICAgIHBsYWNlLm5Xb3JkSW5kZXggPSBpbmRleCAtIG5PbGRJbmRleCAtIDE7CisgICAgICBwU2VjdGlvbi0+VXBkYXRlV29yZFBsYWNlKHBsYWNlKTsKKyAgICAgIGJGb3VuZCA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGkgIT0gc3ogLSAxKQorICAgICAgbkluZGV4ICs9IGtSZXR1cm5MZW5ndGg7CisgICAgbk9sZEluZGV4ID0gbkluZGV4OwogICB9Ci0gIGlmICghYkZpbmQpCisgIGlmICghYkZvdW5kKQogICAgIHBsYWNlID0gR2V0RW5kV29yZFBsYWNlKCk7CiAgIHJldHVybiBwbGFjZTsKIH0KIAogQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkdldEJlZ2luV29yZFBsYWNlKCkgY29uc3QgewotICByZXR1cm4gbV9iSW5pdGlhbCA/IENQVlRfV29yZFBsYWNlKDAsIDAsIC0xKSA6IENQVlRfV29yZFBsYWNlKCk7CisgIHJldHVybiBtX2JJbml0aWFsaXplZCA/IENQVlRfV29yZFBsYWNlKDAsIDAsIC0xKSA6IENQVlRfV29yZFBsYWNlKCk7CiB9CiAKIENQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpHZXRFbmRXb3JkUGxhY2UoKSBjb25zdCB7Ci0gIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLSAxKSkKLSAgICByZXR1cm4gcFNlY3Rpb24tPkdldEVuZFdvcmRQbGFjZSgpOwotICByZXR1cm4gQ1BWVF9Xb3JkUGxhY2UoKTsKKyAgaWYgKG1fU2VjdGlvbkFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIENQVlRfV29yZFBsYWNlKCk7CisgIHJldHVybiBtX1NlY3Rpb25BcnJheS5iYWNrKCktPkdldEVuZFdvcmRQbGFjZSgpOwogfQogCiBDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0UHJldldvcmRQbGFjZSgKICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IHsKICAgaWYgKHBsYWNlLm5TZWNJbmRleCA8IDApCiAgICAgcmV0dXJuIEdldEJlZ2luV29yZFBsYWNlKCk7Ci0gIGlmIChwbGFjZS5uU2VjSW5kZXggPj0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpKQorICBpZiAocGxhY2UublNlY0luZGV4ID49IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9TZWN0aW9uQXJyYXkpKQogICAgIHJldHVybiBHZXRFbmRXb3JkUGxhY2UoKTsKLSAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKLSAgICBpZiAocGxhY2UuV29yZENtcChwU2VjdGlvbi0+R2V0QmVnaW5Xb3JkUGxhY2UoKSkgPD0gMCkgewotICAgICAgaWYgKENTZWN0aW9uKiBwUHJldlNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXggLSAxKSkKLSAgICAgICAgcmV0dXJuIHBQcmV2U2VjdGlvbi0+R2V0RW5kV29yZFBsYWNlKCk7Ci0gICAgICByZXR1cm4gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKLSAgICB9CisKKyAgQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXlbcGxhY2UublNlY0luZGV4XS5nZXQoKTsKKyAgaWYgKHBsYWNlID4gcFNlY3Rpb24tPkdldEJlZ2luV29yZFBsYWNlKCkpCiAgICAgcmV0dXJuIHBTZWN0aW9uLT5HZXRQcmV2V29yZFBsYWNlKHBsYWNlKTsKLSAgfQotICByZXR1cm4gcGxhY2U7CisgIGlmICghcGRmaXVtOjpJbmRleEluQm91bmRzKG1fU2VjdGlvbkFycmF5LCBwbGFjZS5uU2VjSW5kZXggLSAxKSkKKyAgICByZXR1cm4gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKKyAgcmV0dXJuIG1fU2VjdGlvbkFycmF5W3BsYWNlLm5TZWNJbmRleCAtIDFdLT5HZXRFbmRXb3JkUGxhY2UoKTsKIH0KIAogQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkdldE5leHRXb3JkUGxhY2UoCiAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCB7CiAgIGlmIChwbGFjZS5uU2VjSW5kZXggPCAwKQogICAgIHJldHVybiBHZXRCZWdpbldvcmRQbGFjZSgpOwotICBpZiAocGxhY2UublNlY0luZGV4ID49IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSkKKyAgaWYgKHBsYWNlLm5TZWNJbmRleCA+PSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fU2VjdGlvbkFycmF5KSkKICAgICByZXR1cm4gR2V0RW5kV29yZFBsYWNlKCk7Ci0gIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7Ci0gICAgaWYgKHBsYWNlLldvcmRDbXAocFNlY3Rpb24tPkdldEVuZFdvcmRQbGFjZSgpKSA+PSAwKSB7Ci0gICAgICBpZiAoQ1NlY3Rpb24qIHBOZXh0U2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCArIDEpKQotICAgICAgICByZXR1cm4gcE5leHRTZWN0aW9uLT5HZXRCZWdpbldvcmRQbGFjZSgpOwotICAgICAgcmV0dXJuIEdldEVuZFdvcmRQbGFjZSgpOwotICAgIH0KKworICBDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheVtwbGFjZS5uU2VjSW5kZXhdLmdldCgpOworICBpZiAocGxhY2UgPCBwU2VjdGlvbi0+R2V0RW5kV29yZFBsYWNlKCkpCiAgICAgcmV0dXJuIHBTZWN0aW9uLT5HZXROZXh0V29yZFBsYWNlKHBsYWNlKTsKLSAgfQotICByZXR1cm4gcGxhY2U7CisgIGlmICghcGRmaXVtOjpJbmRleEluQm91bmRzKG1fU2VjdGlvbkFycmF5LCBwbGFjZS5uU2VjSW5kZXggKyAxKSkKKyAgICByZXR1cm4gR2V0RW5kV29yZFBsYWNlKCk7CisgIHJldHVybiBtX1NlY3Rpb25BcnJheVtwbGFjZS5uU2VjSW5kZXggKyAxXS0+R2V0QmVnaW5Xb3JkUGxhY2UoKTsKIH0KIAogQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OlNlYXJjaFdvcmRQbGFjZSgKQEAgLTU1MiwzNiArNDMwLDMyIEBACiAgIENGWF9Qb2ludEYgcHQgPSBPdXRUb0luKHBvaW50KTsKICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBHZXRCZWdpbldvcmRQbGFjZSgpOwogICBpbnQzMl90IG5MZWZ0ID0gMDsKLSAgaW50MzJfdCBuUmlnaHQgPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLSAxOwotICBpbnQzMl90IG5NaWQgPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLyAyOworICBpbnQzMl90IG5SaWdodCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9TZWN0aW9uQXJyYXkpIC0gMTsKKyAgaW50MzJfdCBuTWlkID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX1NlY3Rpb25BcnJheSkgLyAyOwogICBib29sIGJVcCA9IHRydWU7CiAgIGJvb2wgYkRvd24gPSB0cnVlOwogICB3aGlsZSAobkxlZnQgPD0gblJpZ2h0KSB7Ci0gICAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KG5NaWQpKSB7Ci0gICAgICBpZiAoSXNGbG9hdEJpZ2dlcihwdC55LCBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi50b3ApKSB7Ci0gICAgICAgIGJVcCA9IGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKElzRmxvYXRCaWdnZXIocFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24uYm90dG9tLCBwdC55KSkgewotICAgICAgICBiRG93biA9IGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKElzRmxvYXRTbWFsbGVyKHB0LnksIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLnRvcCkpIHsKLSAgICAgICAgblJpZ2h0ID0gbk1pZCAtIDE7Ci0gICAgICAgIG5NaWQgPSAobkxlZnQgKyBuUmlnaHQpIC8gMjsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9IGVsc2UgaWYgKElzRmxvYXRCaWdnZXIocHQueSwgcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24uYm90dG9tKSkgewotICAgICAgICBuTGVmdCA9IG5NaWQgKyAxOwotICAgICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcGxhY2UgPSBwU2VjdGlvbi0+U2VhcmNoV29yZFBsYWNlKAotICAgICAgICAgICAgQ0ZYX1BvaW50RihwdC54IC0gcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24ubGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgcHQueSAtIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLnRvcCkpOwotICAgICAgICBwbGFjZS5uU2VjSW5kZXggPSBuTWlkOwotICAgICAgICByZXR1cm4gcGxhY2U7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAoIXBkZml1bTo6SW5kZXhJbkJvdW5kcyhtX1NlY3Rpb25BcnJheSwgbk1pZCkpCiAgICAgICBicmVhazsKKyAgICBDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheVtuTWlkXS5nZXQoKTsKKyAgICBpZiAoSXNGbG9hdEJpZ2dlcihwdC55LCBwU2VjdGlvbi0+bV9SZWN0LnRvcCkpCisgICAgICBiVXAgPSBmYWxzZTsKKyAgICBpZiAoSXNGbG9hdEJpZ2dlcihwU2VjdGlvbi0+bV9SZWN0LmJvdHRvbSwgcHQueSkpCisgICAgICBiRG93biA9IGZhbHNlOworICAgIGlmIChJc0Zsb2F0U21hbGxlcihwdC55LCBwU2VjdGlvbi0+bV9SZWN0LnRvcCkpIHsKKyAgICAgIG5SaWdodCA9IG5NaWQgLSAxOworICAgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOworICAgICAgY29udGludWU7CiAgICAgfQorICAgIGlmIChJc0Zsb2F0QmlnZ2VyKHB0LnksIHBTZWN0aW9uLT5tX1JlY3QuYm90dG9tKSkgeworICAgICAgbkxlZnQgPSBuTWlkICsgMTsKKyAgICAgIG5NaWQgPSAobkxlZnQgKyBuUmlnaHQpIC8gMjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBwbGFjZSA9IHBTZWN0aW9uLT5TZWFyY2hXb3JkUGxhY2UoCisgICAgICAgIENGWF9Qb2ludEYocHQueCAtIHBTZWN0aW9uLT5tX1JlY3QubGVmdCwgcHQueSAtIHBTZWN0aW9uLT5tX1JlY3QudG9wKSk7CisgICAgcGxhY2UublNlY0luZGV4ID0gbk1pZDsKKyAgICByZXR1cm4gcGxhY2U7CiAgIH0KICAgaWYgKGJVcCkKICAgICBwbGFjZSA9IEdldEJlZ2luV29yZFBsYWNlKCk7CkBAIC01OTMsMTkgKzQ2NywyMiBAQAogQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFVwV29yZFBsYWNlKAogICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3QgewotICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewotICAgIENQVlRfV29yZFBsYWNlIHRlbXAgPSBwbGFjZTsKLSAgICBDRlhfUG9pbnRGIHB0ID0gT3V0VG9Jbihwb2ludCk7Ci0gICAgaWYgKHRlbXAubkxpbmVJbmRleC0tID4gMCkgewotICAgICAgcmV0dXJuIHBTZWN0aW9uLT5TZWFyY2hXb3JkUGxhY2UoCi0gICAgICAgICAgcHQueCAtIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLmxlZnQsIHRlbXApOwotICAgIH0KLSAgICBpZiAodGVtcC5uU2VjSW5kZXgtLSA+IDApIHsKLSAgICAgIGlmIChDU2VjdGlvbiogcExhc3RTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQodGVtcC5uU2VjSW5kZXgpKSB7Ci0gICAgICAgIHRlbXAubkxpbmVJbmRleCA9IHBMYXN0U2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0U2l6ZSgpIC0gMTsKLSAgICAgICAgcmV0dXJuIHBMYXN0U2VjdGlvbi0+U2VhcmNoV29yZFBsYWNlKAotICAgICAgICAgICAgcHQueCAtIHBMYXN0U2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi5sZWZ0LCB0ZW1wKTsKLSAgICAgIH0KKyAgaWYgKCFwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9TZWN0aW9uQXJyYXksIHBsYWNlLm5TZWNJbmRleCkpCisgICAgcmV0dXJuIHBsYWNlOworCisgIENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5W3BsYWNlLm5TZWNJbmRleF0uZ2V0KCk7CisgIENQVlRfV29yZFBsYWNlIHRlbXAgPSBwbGFjZTsKKyAgQ0ZYX1BvaW50RiBwdCA9IE91dFRvSW4ocG9pbnQpOworICBpZiAodGVtcC5uTGluZUluZGV4LS0gPiAwKSB7CisgICAgcmV0dXJuIHBTZWN0aW9uLT5TZWFyY2hXb3JkUGxhY2UocHQueCAtIHBTZWN0aW9uLT5tX1JlY3QubGVmdCwgdGVtcCk7CisgIH0KKyAgaWYgKHRlbXAublNlY0luZGV4LS0gPiAwKSB7CisgICAgaWYgKHBkZml1bTo6SW5kZXhJbkJvdW5kcyhtX1NlY3Rpb25BcnJheSwgdGVtcC5uU2VjSW5kZXgpKSB7CisgICAgICBDU2VjdGlvbiogcExhc3RTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXlbdGVtcC5uU2VjSW5kZXhdLmdldCgpOworICAgICAgdGVtcC5uTGluZUluZGV4ID0KKyAgICAgICAgICBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHBMYXN0U2VjdGlvbi0+bV9MaW5lQXJyYXkpIC0gMTsKKyAgICAgIHJldHVybiBwTGFzdFNlY3Rpb24tPlNlYXJjaFdvcmRQbGFjZShwdC54IC0gcExhc3RTZWN0aW9uLT5tX1JlY3QubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wKTsKICAgICB9CiAgIH0KICAgcmV0dXJuIHBsYWNlOwpAQCAtNjE0LDIyICs0OTEsMjIgQEAKIENQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpHZXREb3duV29yZFBsYWNlKAogICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3QgewotICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewotICAgIENQVlRfV29yZFBsYWNlIHRlbXAgPSBwbGFjZTsKLSAgICBDRlhfUG9pbnRGIHB0ID0gT3V0VG9Jbihwb2ludCk7Ci0gICAgaWYgKHRlbXAubkxpbmVJbmRleCsrIDwgcFNlY3Rpb24tPm1fTGluZUFycmF5LkdldFNpemUoKSAtIDEpIHsKLSAgICAgIHJldHVybiBwU2VjdGlvbi0+U2VhcmNoV29yZFBsYWNlKAotICAgICAgICAgIHB0LnggLSBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbi5sZWZ0LCB0ZW1wKTsKLSAgICB9Ci0gICAgaWYgKHRlbXAublNlY0luZGV4KysgPCBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCkgLSAxKSB7Ci0gICAgICBpZiAoQ1NlY3Rpb24qIHBOZXh0U2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHRlbXAublNlY0luZGV4KSkgewotICAgICAgICB0ZW1wLm5MaW5lSW5kZXggPSAwOwotICAgICAgICByZXR1cm4gcE5leHRTZWN0aW9uLT5TZWFyY2hXb3JkUGxhY2UoCi0gICAgICAgICAgICBwdC54IC0gcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24ubGVmdCwgdGVtcCk7Ci0gICAgICB9Ci0gICAgfQorICBpZiAoIXBkZml1bTo6SW5kZXhJbkJvdW5kcyhtX1NlY3Rpb25BcnJheSwgcGxhY2UublNlY0luZGV4KSkKKyAgICByZXR1cm4gcGxhY2U7CisKKyAgQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXlbcGxhY2UublNlY0luZGV4XS5nZXQoKTsKKyAgQ1BWVF9Xb3JkUGxhY2UgdGVtcCA9IHBsYWNlOworICBDRlhfUG9pbnRGIHB0ID0gT3V0VG9Jbihwb2ludCk7CisgIGlmICh0ZW1wLm5MaW5lSW5kZXgrKyA8CisgICAgICBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHBTZWN0aW9uLT5tX0xpbmVBcnJheSkgLSAxKSB7CisgICAgcmV0dXJuIHBTZWN0aW9uLT5TZWFyY2hXb3JkUGxhY2UocHQueCAtIHBTZWN0aW9uLT5tX1JlY3QubGVmdCwgdGVtcCk7CiAgIH0KLSAgcmV0dXJuIHBsYWNlOworICB0ZW1wLkFkdmFuY2VTZWN0aW9uKCk7CisgIGlmICghcGRmaXVtOjpJbmRleEluQm91bmRzKG1fU2VjdGlvbkFycmF5LCB0ZW1wLm5TZWNJbmRleCkpCisgICAgcmV0dXJuIHBsYWNlOworCisgIHJldHVybiBtX1NlY3Rpb25BcnJheVt0ZW1wLm5TZWNJbmRleF0tPlNlYXJjaFdvcmRQbGFjZSgKKyAgICAgIHB0LnggLSBwU2VjdGlvbi0+bV9SZWN0LmxlZnQsIHRlbXApOwogfQogCiBDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0TGluZUJlZ2luUGxhY2UoCkBAIC02MzksMTEgKzUxNiwxNCBAQAogCiBDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0TGluZUVuZFBsYWNlKAogICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgewotICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewotICAgIGlmIChDTGluZSogcExpbmUgPSBwU2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0QXQocGxhY2UubkxpbmVJbmRleCkpCi0gICAgICByZXR1cm4gcExpbmUtPkdldEVuZFdvcmRQbGFjZSgpOwotICB9Ci0gIHJldHVybiBwbGFjZTsKKyAgaWYgKCFwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9TZWN0aW9uQXJyYXksIHBsYWNlLm5TZWNJbmRleCkpCisgICAgcmV0dXJuIHBsYWNlOworCisgIENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5W3BsYWNlLm5TZWNJbmRleF0uZ2V0KCk7CisgIGlmICghcGRmaXVtOjpJbmRleEluQm91bmRzKHBTZWN0aW9uLT5tX0xpbmVBcnJheSwgcGxhY2UubkxpbmVJbmRleCkpCisgICAgcmV0dXJuIHBsYWNlOworCisgIHJldHVybiBwU2VjdGlvbi0+bV9MaW5lQXJyYXlbcGxhY2UubkxpbmVJbmRleF0tPkdldEVuZFdvcmRQbGFjZSgpOwogfQogCiBDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0U2VjdGlvbkJlZ2luUGxhY2UoCkBAIC02NTMsMTA4ICs1MzMsOTMgQEAKIAogQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFNlY3Rpb25FbmRQbGFjZSgKICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IHsKLSAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpCi0gICAgcmV0dXJuIHBTZWN0aW9uLT5HZXRFbmRXb3JkUGxhY2UoKTsKLSAgcmV0dXJuIHBsYWNlOworICBpZiAoIXBkZml1bTo6SW5kZXhJbkJvdW5kcyhtX1NlY3Rpb25BcnJheSwgcGxhY2UublNlY0luZGV4KSkKKyAgICByZXR1cm4gcGxhY2U7CisKKyAgcmV0dXJuIG1fU2VjdGlvbkFycmF5W3BsYWNlLm5TZWNJbmRleF0tPkdldEVuZFdvcmRQbGFjZSgpOwogfQogCiBpbnQzMl90IENQREZfVmFyaWFibGVUZXh0OjpHZXRUb3RhbFdvcmRzKCkgY29uc3QgewogICBpbnQzMl90IG5Ub3RhbCA9IDA7Ci0gIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX1NlY3Rpb25BcnJheS5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7Ci0gICAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KGkpKQotICAgICAgblRvdGFsICs9IChwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpICsga1JldHVybkxlbmd0aCk7CisgIGZvciAoY29uc3QgYXV0byYgcFNlY3Rpb24gOiBtX1NlY3Rpb25BcnJheSkgeworICAgIG5Ub3RhbCArPQorICAgICAgICBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHBTZWN0aW9uLT5tX1dvcmRBcnJheSkgKyBrUmV0dXJuTGVuZ3RoOwogICB9Ci0KICAgcmV0dXJuIG5Ub3RhbCAtIGtSZXR1cm5MZW5ndGg7CiB9CiAKLXZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OlJlc2V0U2VjdGlvbkFycmF5KCkgewotICBmb3IgKGludDMyX3QgcyA9IDAsIHN6ID0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpOyBzIDwgc3o7IHMrKykKLSAgICBkZWxldGUgbV9TZWN0aW9uQXJyYXkuR2V0QXQocyk7Ci0KLSAgbV9TZWN0aW9uQXJyYXkuUmVtb3ZlQWxsKCk7Ci19Ci0KLUNQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpBZGRTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjdGlvbkluZm8mIHNlY2luZm8pIHsKK0NQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpBZGRTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgewogICBpZiAoSXNWYWxpZCgpICYmICFtX2JNdWx0aUxpbmUpCiAgICAgcmV0dXJuIHBsYWNlOwogCi0gIGludDMyX3QgblNlY0luZGV4ID0KLSAgICAgIHN0ZDo6bWF4KHN0ZDo6bWluKHBsYWNlLm5TZWNJbmRleCwgbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpKSwgMCk7Ci0gIENTZWN0aW9uKiBwU2VjdGlvbiA9IG5ldyBDU2VjdGlvbih0aGlzKTsKLSAgcFNlY3Rpb24tPm1fU2VjSW5mbyA9IHNlY2luZm87Ci0gIHBTZWN0aW9uLT5TZWNQbGFjZS5uU2VjSW5kZXggPSBuU2VjSW5kZXg7Ci0gIGlmIChuU2VjSW5kZXggPT0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpKQotICAgIG1fU2VjdGlvbkFycmF5LkFkZChwU2VjdGlvbik7Ci0gIGVsc2UKLSAgICBtX1NlY3Rpb25BcnJheS5JbnNlcnRBdChuU2VjSW5kZXgsIHBTZWN0aW9uKTsKKyAgaW50MzJfdCBuU2VjSW5kZXggPSBwZGZpdW06OmNsYW1wKAorICAgICAgcGxhY2UublNlY0luZGV4LCAwLCBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fU2VjdGlvbkFycmF5KSk7CiAKKyAgYXV0byBwU2VjdGlvbiA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDU2VjdGlvbj4odGhpcyk7CisgIHBTZWN0aW9uLT5tX1JlY3QgPSBDUFZUX0Zsb2F0UmVjdCgpOworICBwU2VjdGlvbi0+U2VjUGxhY2UublNlY0luZGV4ID0gblNlY0luZGV4OworICBtX1NlY3Rpb25BcnJheS5pbnNlcnQobV9TZWN0aW9uQXJyYXkuYmVnaW4oKSArIG5TZWNJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwU2VjdGlvbikpOwogICByZXR1cm4gcGxhY2U7CiB9CiAKIENQVlRfV29yZFBsYWNlIENQREZfVmFyaWFibGVUZXh0OjpBZGRMaW5lKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfTGluZUluZm8mIGxpbmVpbmZvKSB7Ci0gIGlmIChtX1NlY3Rpb25BcnJheS5Jc0VtcHR5KCkpCisgIGlmICghcGRmaXVtOjpJbmRleEluQm91bmRzKG1fU2VjdGlvbkFycmF5LCBwbGFjZS5uU2VjSW5kZXgpKQogICAgIHJldHVybiBwbGFjZTsKLSAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpCi0gICAgcmV0dXJuIHBTZWN0aW9uLT5BZGRMaW5lKGxpbmVpbmZvKTsKLSAgcmV0dXJuIHBsYWNlOworCisgIHJldHVybiBtX1NlY3Rpb25BcnJheVtwbGFjZS5uU2VjSW5kZXhdLT5BZGRMaW5lKGxpbmVpbmZvKTsKIH0KIAogQ1BWVF9Xb3JkUGxhY2UgQ1BERl9WYXJpYWJsZVRleHQ6OkFkZFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkSW5mbyYgd29yZGluZm8pIHsKLSAgaWYgKG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSA8PSAwKSB7CisgIGlmIChtX1NlY3Rpb25BcnJheS5lbXB0eSgpKQogICAgIHJldHVybiBwbGFjZTsKLSAgfQorCiAgIENQVlRfV29yZFBsYWNlIG5ld3BsYWNlID0gcGxhY2U7CiAgIG5ld3BsYWNlLm5TZWNJbmRleCA9Ci0gICAgICBzdGQ6Om1heChzdGQ6Om1pbihuZXdwbGFjZS5uU2VjSW5kZXgsIG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSAtIDEpLCAwKTsKLSAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KG5ld3BsYWNlLm5TZWNJbmRleCkpCi0gICAgcmV0dXJuIHBTZWN0aW9uLT5BZGRXb3JkKG5ld3BsYWNlLCB3b3JkaW5mbyk7Ci0gIHJldHVybiBwbGFjZTsKKyAgICAgIHBkZml1bTo6Y2xhbXAobmV3cGxhY2UublNlY0luZGV4LCAwLAorICAgICAgICAgICAgICAgICAgICBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fU2VjdGlvbkFycmF5KSAtIDEpOworICByZXR1cm4gbV9TZWN0aW9uQXJyYXlbbmV3cGxhY2UublNlY0luZGV4XS0+QWRkV29yZChuZXdwbGFjZSwgd29yZGluZm8pOwogfQogCiBib29sIENQREZfVmFyaWFibGVUZXh0OjpHZXRXb3JkSW5mbyhjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFZUX1dvcmRJbmZvJiB3b3JkaW5mbykgewotICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewotICAgIGlmIChDUFZUX1dvcmRJbmZvKiBwV29yZCA9IHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdChwbGFjZS5uV29yZEluZGV4KSkgewotICAgICAgd29yZGluZm8gPSAqcFdvcmQ7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOworICBpZiAoIXBkZml1bTo6SW5kZXhJbkJvdW5kcyhtX1NlY3Rpb25BcnJheSwgcGxhY2UublNlY0luZGV4KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXlbcGxhY2UublNlY0luZGV4XS5nZXQoKTsKKyAgaWYgKCFwZGZpdW06OkluZGV4SW5Cb3VuZHMocFNlY3Rpb24tPm1fV29yZEFycmF5LCBwbGFjZS5uV29yZEluZGV4KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgd29yZGluZm8gPSAqcFNlY3Rpb24tPm1fV29yZEFycmF5W3BsYWNlLm5Xb3JkSW5kZXhdOworICByZXR1cm4gdHJ1ZTsKIH0KIAogYm9vbCBDUERGX1ZhcmlhYmxlVGV4dDo6U2V0V29yZEluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkSW5mbyYgd29yZGluZm8pIHsKLSAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKLSAgICBpZiAoQ1BWVF9Xb3JkSW5mbyogcFdvcmQgPSBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQocGxhY2UubldvcmRJbmRleCkpIHsKLSAgICAgICpwV29yZCA9IHdvcmRpbmZvOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKKyAgaWYgKCFwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9TZWN0aW9uQXJyYXksIHBsYWNlLm5TZWNJbmRleCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5W3BsYWNlLm5TZWNJbmRleF0uZ2V0KCk7CisgIGlmICghcGRmaXVtOjpJbmRleEluQm91bmRzKHBTZWN0aW9uLT5tX1dvcmRBcnJheSwgcGxhY2UubldvcmRJbmRleCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgICpwU2VjdGlvbi0+bV9Xb3JkQXJyYXlbcGxhY2UubldvcmRJbmRleF0gPSB3b3JkaW5mbzsKKyAgcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgQ1BERl9WYXJpYWJsZVRleHQ6OkdldExpbmVJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVlRfTGluZUluZm8mIGxpbmVpbmZvKSB7Ci0gIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7Ci0gICAgaWYgKENMaW5lKiBwTGluZSA9IHBTZWN0aW9uLT5tX0xpbmVBcnJheS5HZXRBdChwbGFjZS5uTGluZUluZGV4KSkgewotICAgICAgbGluZWluZm8gPSBwTGluZS0+bV9MaW5lSW5mbzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19CisgIGlmICghcGRmaXVtOjpJbmRleEluQm91bmRzKG1fU2VjdGlvbkFycmF5LCBwbGFjZS5uU2VjSW5kZXgpKQorICAgIHJldHVybiBmYWxzZTsKIAotYm9vbCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0U2VjdGlvbkluZm8oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BWVF9TZWN0aW9uSW5mbyYgc2VjaW5mbykgewotICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewotICAgIHNlY2luZm8gPSBwU2VjdGlvbi0+bV9TZWNJbmZvOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKKyAgQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXlbcGxhY2UublNlY0luZGV4XS5nZXQoKTsKKyAgaWYgKCFwZGZpdW06OkluZGV4SW5Cb3VuZHMocFNlY3Rpb24tPm1fTGluZUFycmF5LCBwbGFjZS5uTGluZUluZGV4KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbGluZWluZm8gPSBwU2VjdGlvbi0+bV9MaW5lQXJyYXlbcGxhY2UubkxpbmVJbmRleF0tPm1fTGluZUluZm87CisgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIENQREZfVmFyaWFibGVUZXh0OjpTZXRQbGF0ZVJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgewpAQCAtNzczLDcgKzYzOCw3IEBACiAgIHJldHVybiBtX3JjUGxhdGU7CiB9CiAKLUZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRXb3JkRm9udFNpemUoY29uc3QgQ1BWVF9Xb3JkSW5mbyYgV29yZEluZm8pIHsKK2Zsb2F0IENQREZfVmFyaWFibGVUZXh0OjpHZXRXb3JkRm9udFNpemUoKSB7CiAgIHJldHVybiBHZXRGb250U2l6ZSgpOwogfQogCkBAIC03ODEsOTAgKzY0Niw4MyBAQAogICByZXR1cm4gV29yZEluZm8ubkZvbnRJbmRleDsKIH0KIAotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRXaWR0aChpbnQzMl90IG5Gb250SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFdvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFN1YldvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDaGFyU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkhvcnpTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV29yZFRhaWwpIHsKK2Zsb2F0IENQREZfVmFyaWFibGVUZXh0OjpHZXRXb3JkV2lkdGgoaW50MzJfdCBuRm9udEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBXb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBTdWJXb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmQ2hhclNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Ib3J6U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZGb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZldvcmRUYWlsKSB7CiAgIHJldHVybiAoR2V0Q2hhcldpZHRoKG5Gb250SW5kZXgsIFdvcmQsIFN1YldvcmQpICogZkZvbnRTaXplICoga0ZvbnRTY2FsZSArCiAgICAgICAgICAgZkNoYXJTcGFjZSkgKgogICAgICAgICAgICAgIG5Ib3J6U2NhbGUgKiBrU2NhbGVQZXJjZW50ICsKICAgICAgICAgIGZXb3JkVGFpbDsKIH0KIAotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRXaWR0aChjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbykgeworZmxvYXQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRXaWR0aChjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbykgewogICByZXR1cm4gR2V0V29yZFdpZHRoKEdldFdvcmRGb250SW5kZXgoV29yZEluZm8pLCBXb3JkSW5mby5Xb3JkLCBHZXRTdWJXb3JkKCksCi0gICAgICAgICAgICAgICAgICAgICAgR2V0Q2hhclNwYWNlKFdvcmRJbmZvKSwgR2V0SG9yelNjYWxlKFdvcmRJbmZvKSwKLSAgICAgICAgICAgICAgICAgICAgICBHZXRXb3JkRm9udFNpemUoV29yZEluZm8pLCBXb3JkSW5mby5mV29yZFRhaWwpOworICAgICAgICAgICAgICAgICAgICAgIEdldENoYXJTcGFjZSgpLCBHZXRIb3J6U2NhbGUoKSwgR2V0V29yZEZvbnRTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgV29yZEluZm8uZldvcmRUYWlsKTsKIH0KIAotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldExpbmVBc2NlbnQoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyYgU2VjSW5mbykgeworZmxvYXQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldExpbmVBc2NlbnQoKSB7CiAgIHJldHVybiBHZXRGb250QXNjZW50KEdldERlZmF1bHRGb250SW5kZXgoKSwgR2V0Rm9udFNpemUoKSk7CiB9CiAKLUZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRMaW5lRGVzY2VudChjb25zdCBDUFZUX1NlY3Rpb25JbmZvJiBTZWNJbmZvKSB7CitmbG9hdCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0TGluZURlc2NlbnQoKSB7CiAgIHJldHVybiBHZXRGb250RGVzY2VudChHZXREZWZhdWx0Rm9udEluZGV4KCksIEdldEZvbnRTaXplKCkpOwogfQogCi1GWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0Rm9udEFzY2VudChpbnQzMl90IG5Gb250SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUpIHsKLSAgcmV0dXJuIChGWF9GTE9BVClHZXRUeXBlQXNjZW50KG5Gb250SW5kZXgpICogZkZvbnRTaXplICoga0ZvbnRTY2FsZTsKK2Zsb2F0IENQREZfVmFyaWFibGVUZXh0OjpHZXRGb250QXNjZW50KGludDMyX3QgbkZvbnRJbmRleCwgZmxvYXQgZkZvbnRTaXplKSB7CisgIHJldHVybiAoZmxvYXQpR2V0VHlwZUFzY2VudChuRm9udEluZGV4KSAqIGZGb250U2l6ZSAqIGtGb250U2NhbGU7CiB9CiAKLUZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRGb250RGVzY2VudChpbnQzMl90IG5Gb250SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplKSB7Ci0gIHJldHVybiAoRlhfRkxPQVQpR2V0VHlwZURlc2NlbnQobkZvbnRJbmRleCkgKiBmRm9udFNpemUgKiBrRm9udFNjYWxlOworZmxvYXQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldEZvbnREZXNjZW50KGludDMyX3QgbkZvbnRJbmRleCwgZmxvYXQgZkZvbnRTaXplKSB7CisgIHJldHVybiAoZmxvYXQpR2V0VHlwZURlc2NlbnQobkZvbnRJbmRleCkgKiBmRm9udFNpemUgKiBrRm9udFNjYWxlOwogfQogCi1GWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZEFzY2VudChjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSkgeworZmxvYXQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldFdvcmRBc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyYgV29yZEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmRm9udFNpemUpIHsKICAgcmV0dXJuIEdldEZvbnRBc2NlbnQoR2V0V29yZEZvbnRJbmRleChXb3JkSW5mbyksIGZGb250U2l6ZSk7CiB9CiAKLUZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRXb3JkRGVzY2VudChjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUpIHsKK2Zsb2F0IENQREZfVmFyaWFibGVUZXh0OjpHZXRXb3JkRGVzY2VudChjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmRm9udFNpemUpIHsKICAgcmV0dXJuIEdldEZvbnREZXNjZW50KEdldFdvcmRGb250SW5kZXgoV29yZEluZm8pLCBmRm9udFNpemUpOwogfQogCi1GWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZEFzY2VudChjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbykgewotICByZXR1cm4gR2V0Rm9udEFzY2VudChHZXRXb3JkRm9udEluZGV4KFdvcmRJbmZvKSwgR2V0V29yZEZvbnRTaXplKFdvcmRJbmZvKSk7CitmbG9hdCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZEFzY2VudChjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbykgeworICByZXR1cm4gR2V0Rm9udEFzY2VudChHZXRXb3JkRm9udEluZGV4KFdvcmRJbmZvKSwgR2V0V29yZEZvbnRTaXplKCkpOwogfQogCi1GWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0V29yZERlc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyYgV29yZEluZm8pIHsKLSAgcmV0dXJuIEdldEZvbnREZXNjZW50KEdldFdvcmRGb250SW5kZXgoV29yZEluZm8pLCBHZXRXb3JkRm9udFNpemUoV29yZEluZm8pKTsKK2Zsb2F0IENQREZfVmFyaWFibGVUZXh0OjpHZXRXb3JkRGVzY2VudChjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbykgeworICByZXR1cm4gR2V0Rm9udERlc2NlbnQoR2V0V29yZEZvbnRJbmRleChXb3JkSW5mbyksIEdldFdvcmRGb250U2l6ZSgpKTsKIH0KIAotRlhfRkxPQVQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldExpbmVMZWFkaW5nKGNvbnN0IENQVlRfU2VjdGlvbkluZm8mIFNlY0luZm8pIHsKK2Zsb2F0IENQREZfVmFyaWFibGVUZXh0OjpHZXRMaW5lTGVhZGluZygpIHsKICAgcmV0dXJuIG1fZkxpbmVMZWFkaW5nOwogfQogCi1GWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0TGluZUluZGVudChjb25zdCBDUFZUX1NlY3Rpb25JbmZvJiBTZWNJbmZvKSB7CitmbG9hdCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0TGluZUluZGVudCgpIHsKICAgcmV0dXJuIDAuMGY7CiB9CiAKLWludDMyX3QgQ1BERl9WYXJpYWJsZVRleHQ6OkdldEFsaWdubWVudChjb25zdCBDUFZUX1NlY3Rpb25JbmZvJiBTZWNJbmZvKSB7CitpbnQzMl90IENQREZfVmFyaWFibGVUZXh0OjpHZXRBbGlnbm1lbnQoKSB7CiAgIHJldHVybiBtX25BbGlnbm1lbnQ7CiB9CiAKLUZYX0ZMT0FUIENQREZfVmFyaWFibGVUZXh0OjpHZXRDaGFyU3BhY2UoY29uc3QgQ1BWVF9Xb3JkSW5mbyYgV29yZEluZm8pIHsKLSAgcmV0dXJuIG1fZkNoYXJTcGFjZTsKLX0KLQotaW50MzJfdCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0SG9yelNjYWxlKGNvbnN0IENQVlRfV29yZEluZm8mIFdvcmRJbmZvKSB7Ci0gIHJldHVybiBtX25Ib3J6U2NhbGU7Ci19Ci0KIHZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OkNsZWFyU2VjdGlvblJpZ2h0V29yZHMoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSB7CiAgIENQVlRfV29yZFBsYWNlIHdvcmRwbGFjZSA9IEFkanVzdExpbmVIZWFkZXIocGxhY2UsIHRydWUpOwotICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewotICAgIGZvciAoaW50MzJfdCB3ID0gcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKSAtIDE7Ci0gICAgICAgICB3ID4gd29yZHBsYWNlLm5Xb3JkSW5kZXg7IHctLSkgewotICAgICAgZGVsZXRlIHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdCh3KTsKLSAgICAgIHBTZWN0aW9uLT5tX1dvcmRBcnJheS5SZW1vdmVBdCh3KTsKLSAgICB9Ci0gIH0KKyAgaWYgKCFwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9TZWN0aW9uQXJyYXksIHBsYWNlLm5TZWNJbmRleCkpCisgICAgcmV0dXJuOworCisgIENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5W3BsYWNlLm5TZWNJbmRleF0uZ2V0KCk7CisgIGlmICghcGRmaXVtOjpJbmRleEluQm91bmRzKHBTZWN0aW9uLT5tX1dvcmRBcnJheSwgd29yZHBsYWNlLm5Xb3JkSW5kZXggKyAxKSkKKyAgICByZXR1cm47CisKKyAgcFNlY3Rpb24tPm1fV29yZEFycmF5LmVyYXNlKAorICAgICAgcFNlY3Rpb24tPm1fV29yZEFycmF5LmJlZ2luKCkgKyB3b3JkcGxhY2UubldvcmRJbmRleCArIDEsCisgICAgICBwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuZW5kKCkpOwogfQogCiBDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6QWRqdXN0TGluZUhlYWRlcihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCkBAIC04NzUsMTYgKzczMywxNyBAQAogfQogCiBib29sIENQREZfVmFyaWFibGVUZXh0OjpDbGVhckVtcHR5U2VjdGlvbihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIHsKLSAgaWYgKHBsYWNlLm5TZWNJbmRleCA9PSAwICYmIG1fU2VjdGlvbkFycmF5LkdldFNpemUoKSA9PSAxKQorICBpZiAocGxhY2UublNlY0luZGV4ID09IDAgJiYgbV9TZWN0aW9uQXJyYXkuc2l6ZSgpID09IDEpCiAgICAgcmV0dXJuIGZhbHNlOwotICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocGxhY2UublNlY0luZGV4KSkgewotICAgIGlmIChwU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpID09IDApIHsKLSAgICAgIGRlbGV0ZSBwU2VjdGlvbjsKLSAgICAgIG1fU2VjdGlvbkFycmF5LlJlbW92ZUF0KHBsYWNlLm5TZWNJbmRleCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOworCisgIGlmICghcGRmaXVtOjpJbmRleEluQm91bmRzKG1fU2VjdGlvbkFycmF5LCBwbGFjZS5uU2VjSW5kZXgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoIW1fU2VjdGlvbkFycmF5W3BsYWNlLm5TZWNJbmRleF0tPm1fV29yZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG1fU2VjdGlvbkFycmF5LmVyYXNlKG1fU2VjdGlvbkFycmF5LmJlZ2luKCkgKyBwbGFjZS5uU2VjSW5kZXgpOworICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBDUERGX1ZhcmlhYmxlVGV4dDo6Q2xlYXJFbXB0eVNlY3Rpb25zKGNvbnN0IENQVlRfV29yZFJhbmdlJiBQbGFjZVJhbmdlKSB7CkBAIC04OTgsMTkgKzc1NywxOCBAQAogCiB2b2lkIENQREZfVmFyaWFibGVUZXh0OjpMaW5rTGF0dGVyU2VjdGlvbihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIHsKICAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2UgPSBBZGp1c3RMaW5lSGVhZGVyKHBsYWNlLCB0cnVlKTsKLSAgaWYgKENTZWN0aW9uKiBwTmV4dFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXggKyAxKSkgewotICAgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChvbGRwbGFjZS5uU2VjSW5kZXgpKSB7Ci0gICAgICBmb3IgKGludDMyX3QgdyA9IDAsIHN6ID0gcE5leHRTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCk7IHcgPCBzejsKLSAgICAgICAgICAgdysrKSB7Ci0gICAgICAgIGlmIChDUFZUX1dvcmRJbmZvKiBwV29yZCA9IHBOZXh0U2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQodykpIHsKLSAgICAgICAgICBvbGRwbGFjZS5uV29yZEluZGV4Kys7Ci0gICAgICAgICAgcFNlY3Rpb24tPkFkZFdvcmQob2xkcGxhY2UsICpwV29yZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KKyAgaWYgKCFwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9TZWN0aW9uQXJyYXksIHBsYWNlLm5TZWNJbmRleCArIDEpKQorICAgIHJldHVybjsKKworICBDU2VjdGlvbiogcE5leHRTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXlbcGxhY2UublNlY0luZGV4ICsgMV0uZ2V0KCk7CisgIGlmIChwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9TZWN0aW9uQXJyYXksIG9sZHBsYWNlLm5TZWNJbmRleCkpIHsKKyAgICBDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheVtvbGRwbGFjZS5uU2VjSW5kZXhdLmdldCgpOworICAgIGZvciAoYXV0byYgcFdvcmQgOiBwTmV4dFNlY3Rpb24tPm1fV29yZEFycmF5KSB7CisgICAgICBvbGRwbGFjZS5uV29yZEluZGV4Kys7CisgICAgICBwU2VjdGlvbi0+QWRkV29yZChvbGRwbGFjZSwgKnBXb3JkKTsKICAgICB9Ci0gICAgZGVsZXRlIHBOZXh0U2VjdGlvbjsKLSAgICBtX1NlY3Rpb25BcnJheS5SZW1vdmVBdChwbGFjZS5uU2VjSW5kZXggKyAxKTsKICAgfQorICBtX1NlY3Rpb25BcnJheS5lcmFzZShtX1NlY3Rpb25BcnJheS5iZWdpbigpICsgcGxhY2UublNlY0luZGV4ICsgMSk7CiB9CiAKIHZvaWQgQ1BERl9WYXJpYWJsZVRleHQ6OkNsZWFyV29yZHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIFBsYWNlUmFuZ2UpIHsKQEAgLTkxOSw0MCArNzc3LDQ0IEBACiAgIE5ld1JhbmdlLkVuZFBvcyA9IEFkanVzdExpbmVIZWFkZXIoUGxhY2VSYW5nZS5FbmRQb3MsIHRydWUpOwogICBmb3IgKGludDMyX3QgcyA9IE5ld1JhbmdlLkVuZFBvcy5uU2VjSW5kZXg7IHMgPj0gTmV3UmFuZ2UuQmVnaW5Qb3MublNlY0luZGV4OwogICAgICAgIHMtLSkgewotICAgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChzKSkKLSAgICAgIHBTZWN0aW9uLT5DbGVhcldvcmRzKE5ld1JhbmdlKTsKKyAgICBpZiAocGRmaXVtOjpJbmRleEluQm91bmRzKG1fU2VjdGlvbkFycmF5LCBzKSkKKyAgICAgIG1fU2VjdGlvbkFycmF5W3NdLT5DbGVhcldvcmRzKE5ld1JhbmdlKTsKICAgfQogfQogCiBDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6Q2xlYXJMZWZ0V29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIHsKLSAgaWYgKENTZWN0aW9uKiBwU2VjdGlvbiA9IG1fU2VjdGlvbkFycmF5LkdldEF0KHBsYWNlLm5TZWNJbmRleCkpIHsKLSAgICBDUFZUX1dvcmRQbGFjZSBsZWZ0cGxhY2UgPSBHZXRQcmV2V29yZFBsYWNlKHBsYWNlKTsKLSAgICBpZiAobGVmdHBsYWNlICE9IHBsYWNlKSB7Ci0gICAgICBpZiAobGVmdHBsYWNlLm5TZWNJbmRleCAhPSBwbGFjZS5uU2VjSW5kZXgpIHsKLSAgICAgICAgaWYgKHBTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCkgPT0gMCkKLSAgICAgICAgICBDbGVhckVtcHR5U2VjdGlvbihwbGFjZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBMaW5rTGF0dGVyU2VjdGlvbihsZWZ0cGxhY2UpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcFNlY3Rpb24tPkNsZWFyV29yZChwbGFjZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsZWZ0cGxhY2U7CisgIGlmICghcGRmaXVtOjpJbmRleEluQm91bmRzKG1fU2VjdGlvbkFycmF5LCBwbGFjZS5uU2VjSW5kZXgpKQorICAgIHJldHVybiBwbGFjZTsKKworICBDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheVtwbGFjZS5uU2VjSW5kZXhdLmdldCgpOworICBDUFZUX1dvcmRQbGFjZSBsZWZ0cGxhY2UgPSBHZXRQcmV2V29yZFBsYWNlKHBsYWNlKTsKKyAgaWYgKGxlZnRwbGFjZSA9PSBwbGFjZSkKKyAgICByZXR1cm4gcGxhY2U7CisKKyAgaWYgKGxlZnRwbGFjZS5uU2VjSW5kZXggIT0gcGxhY2UublNlY0luZGV4KSB7CisgICAgaWYgKHBTZWN0aW9uLT5tX1dvcmRBcnJheS5lbXB0eSgpKQorICAgICAgQ2xlYXJFbXB0eVNlY3Rpb24ocGxhY2UpOworICAgIGVsc2UKKyAgICAgIExpbmtMYXR0ZXJTZWN0aW9uKGxlZnRwbGFjZSk7CisgIH0gZWxzZSB7CisgICAgcFNlY3Rpb24tPkNsZWFyV29yZChwbGFjZSk7CiAgIH0KLSAgcmV0dXJuIHBsYWNlOworICByZXR1cm4gbGVmdHBsYWNlOwogfQogCiBDUFZUX1dvcmRQbGFjZSBDUERGX1ZhcmlhYmxlVGV4dDo6Q2xlYXJSaWdodFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSB7Ci0gIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChwbGFjZS5uU2VjSW5kZXgpKSB7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UgcmlnaHRwbGFjZSA9Ci0gICAgICAgIEFkanVzdExpbmVIZWFkZXIoR2V0TmV4dFdvcmRQbGFjZShwbGFjZSksIGZhbHNlKTsKLSAgICBpZiAocmlnaHRwbGFjZSAhPSBwbGFjZSkgewotICAgICAgaWYgKHJpZ2h0cGxhY2UublNlY0luZGV4ICE9IHBsYWNlLm5TZWNJbmRleCkKLSAgICAgICAgTGlua0xhdHRlclNlY3Rpb24ocGxhY2UpOwotICAgICAgZWxzZQotICAgICAgICBwU2VjdGlvbi0+Q2xlYXJXb3JkKHJpZ2h0cGxhY2UpOwotICAgIH0KLSAgfQorICBpZiAoIXBkZml1bTo6SW5kZXhJbkJvdW5kcyhtX1NlY3Rpb25BcnJheSwgcGxhY2UublNlY0luZGV4KSkKKyAgICByZXR1cm4gcGxhY2U7CisKKyAgQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXlbcGxhY2UublNlY0luZGV4XS5nZXQoKTsKKyAgQ1BWVF9Xb3JkUGxhY2UgcmlnaHRwbGFjZSA9IEFkanVzdExpbmVIZWFkZXIoR2V0TmV4dFdvcmRQbGFjZShwbGFjZSksIGZhbHNlKTsKKyAgaWYgKHJpZ2h0cGxhY2UgPT0gcGxhY2UpCisgICAgcmV0dXJuIHBsYWNlOworCisgIGlmIChyaWdodHBsYWNlLm5TZWNJbmRleCAhPSBwbGFjZS5uU2VjSW5kZXgpCisgICAgTGlua0xhdHRlclNlY3Rpb24ocGxhY2UpOworICBlbHNlCisgICAgcFNlY3Rpb24tPkNsZWFyV29yZChyaWdodHBsYWNlKTsKICAgcmV0dXJuIHBsYWNlOwogfQogCkBAIC05NzksNyArODQxLDcgQEAKICAgcmV0dXJuIHJjUmV0OwogfQogCi1GWF9GTE9BVCBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0QXV0b0ZvbnRTaXplKCkgeworZmxvYXQgQ1BERl9WYXJpYWJsZVRleHQ6OkdldEF1dG9Gb250U2l6ZSgpIHsKICAgaW50MzJfdCBuVG90YWwgPSBzaXplb2YoZ0ZvbnRTaXplU3RlcHMpIC8gc2l6ZW9mKHVpbnQ4X3QpOwogICBpZiAoSXNNdWx0aUxpbmUoKSkKICAgICBuVG90YWwgLz0gNDsKQEAgLTk5MiwzMCArODU0LDI0IEBACiAgIGludDMyX3QgblJpZ2h0ID0gblRvdGFsIC0gMTsKICAgaW50MzJfdCBuTWlkID0gblRvdGFsIC8gMjsKICAgd2hpbGUgKG5MZWZ0IDw9IG5SaWdodCkgewotICAgIGlmIChJc0JpZ2dlcihnRm9udFNpemVTdGVwc1tuTWlkXSkpIHsKKyAgICBpZiAoSXNCaWdnZXIoZ0ZvbnRTaXplU3RlcHNbbk1pZF0pKQogICAgICAgblJpZ2h0ID0gbk1pZCAtIDE7Ci0gICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7Ci0gICAgICBjb250aW51ZTsKLSAgICB9IGVsc2UgeworICAgIGVsc2UKICAgICAgIG5MZWZ0ID0gbk1pZCArIDE7Ci0gICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7Ci0gICAgICBjb250aW51ZTsKLSAgICB9CisgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOwogICB9Ci0gIHJldHVybiAoRlhfRkxPQVQpZ0ZvbnRTaXplU3RlcHNbbk1pZF07CisgIHJldHVybiAoZmxvYXQpZ0ZvbnRTaXplU3RlcHNbbk1pZF07CiB9CiAKLWJvb2wgQ1BERl9WYXJpYWJsZVRleHQ6OklzQmlnZ2VyKEZYX0ZMT0FUIGZGb250U2l6ZSkgY29uc3QgeworYm9vbCBDUERGX1ZhcmlhYmxlVGV4dDo6SXNCaWdnZXIoZmxvYXQgZkZvbnRTaXplKSBjb25zdCB7CiAgIENGWF9TaXplRiBzelRvdGFsOwotICBmb3IgKGludDMyX3QgcyA9IDAsIHN6ID0gbV9TZWN0aW9uQXJyYXkuR2V0U2l6ZSgpOyBzIDwgc3o7IHMrKykgewotICAgIGlmIChDU2VjdGlvbiogcFNlY3Rpb24gPSBtX1NlY3Rpb25BcnJheS5HZXRBdChzKSkgewotICAgICAgQ0ZYX1NpemVGIHNpemUgPSBwU2VjdGlvbi0+R2V0U2VjdGlvblNpemUoZkZvbnRTaXplKTsKLSAgICAgIHN6VG90YWwud2lkdGggPSBzdGQ6Om1heChzaXplLndpZHRoLCBzelRvdGFsLndpZHRoKTsKLSAgICAgIHN6VG90YWwuaGVpZ2h0ICs9IHNpemUuaGVpZ2h0OwotICAgICAgaWYgKElzRmxvYXRCaWdnZXIoc3pUb3RhbC53aWR0aCwgR2V0UGxhdGVXaWR0aCgpKSB8fAotICAgICAgICAgIElzRmxvYXRCaWdnZXIoc3pUb3RhbC5oZWlnaHQsIEdldFBsYXRlSGVpZ2h0KCkpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQorICBmb3IgKGNvbnN0IGF1dG8mIHBTZWN0aW9uIDogbV9TZWN0aW9uQXJyYXkpIHsKKyAgICBDRlhfU2l6ZUYgc2l6ZSA9IHBTZWN0aW9uLT5HZXRTZWN0aW9uU2l6ZShmRm9udFNpemUpOworICAgIHN6VG90YWwud2lkdGggPSBzdGQ6Om1heChzaXplLndpZHRoLCBzelRvdGFsLndpZHRoKTsKKyAgICBzelRvdGFsLmhlaWdodCArPSBzaXplLmhlaWdodDsKKyAgICBpZiAoSXNGbG9hdEJpZ2dlcihzelRvdGFsLndpZHRoLCBHZXRQbGF0ZVdpZHRoKCkpIHx8CisgICAgICAgIElzRmxvYXRCaWdnZXIoc3pUb3RhbC5oZWlnaHQsIEdldFBsYXRlSGVpZ2h0KCkpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgIH0KICAgcmV0dXJuIGZhbHNlOwpAQCAtMTAyNCw0MCArODgwLDM5IEBACiBDUFZUX0Zsb2F0UmVjdCBDUERGX1ZhcmlhYmxlVGV4dDo6UmVhcnJhbmdlU2VjdGlvbnMoCiAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIFBsYWNlUmFuZ2UpIHsKICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2U7Ci0gIEZYX0ZMT0FUIGZQb3NZID0gMDsKLSAgRlhfRkxPQVQgZk9sZEhlaWdodDsKKyAgZmxvYXQgZlBvc1kgPSAwOworICBmbG9hdCBmT2xkSGVpZ2h0OwogICBpbnQzMl90IG5TU2VjSW5kZXggPSBQbGFjZVJhbmdlLkJlZ2luUG9zLm5TZWNJbmRleDsKICAgaW50MzJfdCBuRVNlY0luZGV4ID0gUGxhY2VSYW5nZS5FbmRQb3MublNlY0luZGV4OwogICBDUFZUX0Zsb2F0UmVjdCByY1JldDsKLSAgZm9yIChpbnQzMl90IHMgPSAwLCBzeiA9IG1fU2VjdGlvbkFycmF5LkdldFNpemUoKTsgcyA8IHN6OyBzKyspIHsKKyAgZm9yIChpbnQzMl90IHMgPSAwLCBzeiA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9TZWN0aW9uQXJyYXkpOworICAgICAgIHMgPCBzejsgcysrKSB7CiAgICAgcGxhY2UublNlY0luZGV4ID0gczsKLSAgICBpZiAoQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXkuR2V0QXQocykpIHsKLSAgICAgIHBTZWN0aW9uLT5TZWNQbGFjZSA9IHBsYWNlOwotICAgICAgQ1BWVF9GbG9hdFJlY3QgcmNTZWMgPSBwU2VjdGlvbi0+bV9TZWNJbmZvLnJjU2VjdGlvbjsKLSAgICAgIGlmIChzID49IG5TU2VjSW5kZXgpIHsKLSAgICAgICAgaWYgKHMgPD0gbkVTZWNJbmRleCkgewotICAgICAgICAgIHJjU2VjID0gcFNlY3Rpb24tPlJlYXJyYW5nZSgpOwotICAgICAgICAgIHJjU2VjLnRvcCArPSBmUG9zWTsKLSAgICAgICAgICByY1NlYy5ib3R0b20gKz0gZlBvc1k7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZk9sZEhlaWdodCA9IHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLmJvdHRvbSAtCi0gICAgICAgICAgICAgICAgICAgICAgIHBTZWN0aW9uLT5tX1NlY0luZm8ucmNTZWN0aW9uLnRvcDsKLSAgICAgICAgICByY1NlYy50b3AgPSBmUG9zWTsKLSAgICAgICAgICByY1NlYy5ib3R0b20gPSBmUG9zWSArIGZPbGRIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcFNlY3Rpb24tPm1fU2VjSW5mby5yY1NlY3Rpb24gPSByY1NlYzsKLSAgICAgICAgcFNlY3Rpb24tPlJlc2V0TGluZVBsYWNlKCk7Ci0gICAgICB9Ci0gICAgICBpZiAocyA9PSAwKSB7Ci0gICAgICAgIHJjUmV0ID0gcmNTZWM7CisgICAgQ1NlY3Rpb24qIHBTZWN0aW9uID0gbV9TZWN0aW9uQXJyYXlbc10uZ2V0KCk7CisgICAgcFNlY3Rpb24tPlNlY1BsYWNlID0gcGxhY2U7CisgICAgQ1BWVF9GbG9hdFJlY3QgcmNTZWMgPSBwU2VjdGlvbi0+bV9SZWN0OworICAgIGlmIChzID49IG5TU2VjSW5kZXgpIHsKKyAgICAgIGlmIChzIDw9IG5FU2VjSW5kZXgpIHsKKyAgICAgICAgcmNTZWMgPSBwU2VjdGlvbi0+UmVhcnJhbmdlKCk7CisgICAgICAgIHJjU2VjLnRvcCArPSBmUG9zWTsKKyAgICAgICAgcmNTZWMuYm90dG9tICs9IGZQb3NZOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmNSZXQubGVmdCA9IHN0ZDo6bWluKHJjU2VjLmxlZnQsIHJjUmV0LmxlZnQpOwotICAgICAgICByY1JldC50b3AgPSBzdGQ6Om1pbihyY1NlYy50b3AsIHJjUmV0LnRvcCk7Ci0gICAgICAgIHJjUmV0LnJpZ2h0ID0gc3RkOjptYXgocmNTZWMucmlnaHQsIHJjUmV0LnJpZ2h0KTsKLSAgICAgICAgcmNSZXQuYm90dG9tID0gc3RkOjptYXgocmNTZWMuYm90dG9tLCByY1JldC5ib3R0b20pOworICAgICAgICBmT2xkSGVpZ2h0ID0gcFNlY3Rpb24tPm1fUmVjdC5ib3R0b20gLSBwU2VjdGlvbi0+bV9SZWN0LnRvcDsKKyAgICAgICAgcmNTZWMudG9wID0gZlBvc1k7CisgICAgICAgIHJjU2VjLmJvdHRvbSA9IGZQb3NZICsgZk9sZEhlaWdodDsKICAgICAgIH0KLSAgICAgIGZQb3NZICs9IHJjU2VjLkhlaWdodCgpOworICAgICAgcFNlY3Rpb24tPm1fUmVjdCA9IHJjU2VjOworICAgICAgcFNlY3Rpb24tPlJlc2V0TGluZVBsYWNlKCk7CiAgICAgfQorICAgIGlmIChzID09IDApIHsKKyAgICAgIHJjUmV0ID0gcmNTZWM7CisgICAgfSBlbHNlIHsKKyAgICAgIHJjUmV0LmxlZnQgPSBzdGQ6Om1pbihyY1NlYy5sZWZ0LCByY1JldC5sZWZ0KTsKKyAgICAgIHJjUmV0LnRvcCA9IHN0ZDo6bWluKHJjU2VjLnRvcCwgcmNSZXQudG9wKTsKKyAgICAgIHJjUmV0LnJpZ2h0ID0gc3RkOjptYXgocmNTZWMucmlnaHQsIHJjUmV0LnJpZ2h0KTsKKyAgICAgIHJjUmV0LmJvdHRvbSA9IHN0ZDo6bWF4KHJjU2VjLmJvdHRvbSwgcmNSZXQuYm90dG9tKTsKKyAgICB9CisgICAgZlBvc1kgKz0gcmNTZWMuSGVpZ2h0KCk7CiAgIH0KICAgcmV0dXJuIHJjUmV0OwogfQpAQCAtMTEwNSwxMCArOTYwLDYgQEAKICAgbV9wVlRQcm92aWRlciA9IHBQcm92aWRlcjsKIH0KIAotQ0ZYX1NpemVGIENQREZfVmFyaWFibGVUZXh0OjpHZXRQbGF0ZVNpemUoKSBjb25zdCB7Ci0gIHJldHVybiBDRlhfU2l6ZUYoR2V0UGxhdGVXaWR0aCgpLCBHZXRQbGF0ZUhlaWdodCgpKTsKLX0KLQogQ0ZYX1BvaW50RiBDUERGX1ZhcmlhYmxlVGV4dDo6R2V0QlRQb2ludCgpIGNvbnN0IHsKICAgcmV0dXJuIENGWF9Qb2ludEYobV9yY1BsYXRlLmxlZnQsIG1fcmNQbGF0ZS50b3ApOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwZGZfdmFyaWFibGV0ZXh0LmggYi9jb3JlL2ZwZGZkb2MvY3BkZl92YXJpYWJsZXRleHQuaAppbmRleCA4ZTdjMGM5Li5hOTM5ZGNiIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZkb2MvY3BkZl92YXJpYWJsZXRleHQuaAorKysgYi9jb3JlL2ZwZGZkb2MvY3BkZl92YXJpYWJsZXRleHQuaApAQCAtOCw4ICs4LDggQEAKICNkZWZpbmUgQ09SRV9GUERGRE9DX0NQREZfVkFSSUFCTEVURVhUX0hfCiAKICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwdnRfYXJyYXl0ZW1wbGF0ZS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcHZ0X2Zsb2F0cmVjdC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcHZ0X2xpbmUuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3B2dF9saW5laW5mby5oIgpAQCAtMTgsMjMgKzE4LDE2IEBACiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZm9udC5oIgogCiBjbGFzcyBDUFZUX1dvcmQ7CiBjbGFzcyBDU2VjdGlvbjsKIGNsYXNzIElQVlRfRm9udE1hcDsKLXN0cnVjdCBDUFZUX1NlY1Byb3BzOwotc3RydWN0IENQVlRfU2VjdGlvbjsKLXN0cnVjdCBDUFZUX1NlY3Rpb25JbmZvOwotCiBzdHJ1Y3QgQ1BWVF9Xb3JkSW5mbzsKLXN0cnVjdCBDUFZUX1dvcmRQcm9wczsKIAogI2RlZmluZSBWQVJJQUJMRVRFWFRfSEFMRiAwLjVmCiAKIGNsYXNzIENQREZfVmFyaWFibGVUZXh0IHsKICBwdWJsaWM6Ci0gIGVudW0gY2xhc3MgU2NyaXB0VHlwZSB7IE5vcm1hbCwgU3VwZXIsIFN1YiB9OwogCiAgIGNsYXNzIEl0ZXJhdG9yIHsKICAgIHB1YmxpYzoKQEAgLTQ0LDIxICszNywxNSBAQAogICAgIGJvb2wgTmV4dFdvcmQoKTsKICAgICBib29sIFByZXZXb3JkKCk7CiAgICAgYm9vbCBOZXh0TGluZSgpOwotICAgIGJvb2wgUHJldkxpbmUoKTsKLSAgICBib29sIE5leHRTZWN0aW9uKCk7Ci0gICAgYm9vbCBQcmV2U2VjdGlvbigpOwotICAgIGJvb2wgU2V0V29yZChjb25zdCBDUFZUX1dvcmQmIHdvcmQpOwogICAgIGJvb2wgR2V0V29yZChDUFZUX1dvcmQmIHdvcmQpIGNvbnN0OwogICAgIGJvb2wgR2V0TGluZShDUFZUX0xpbmUmIGxpbmUpIGNvbnN0OwotICAgIGJvb2wgR2V0U2VjdGlvbihDUFZUX1NlY3Rpb24mIHNlY3Rpb24pIGNvbnN0OwotICAgIGJvb2wgU2V0U2VjdGlvbihjb25zdCBDUFZUX1NlY3Rpb24mIHNlY3Rpb24pOwogICAgIHZvaWQgU2V0QXQoaW50MzJfdCBuV29yZEluZGV4KTsKICAgICB2b2lkIFNldEF0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSk7Ci0gICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIEdldEF0KCkgY29uc3QgeyByZXR1cm4gbV9DdXJQb3M7IH0KKyAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgR2V0V29yZFBsYWNlKCkgY29uc3QgeyByZXR1cm4gbV9DdXJQb3M7IH0KIAogICAgcHJpdmF0ZToKICAgICBDUFZUX1dvcmRQbGFjZSBtX0N1clBvczsKLSAgICBDUERGX1ZhcmlhYmxlVGV4dCogY29uc3QgbV9wVlQ7CisgICAgVW5vd25lZFB0cjxDUERGX1ZhcmlhYmxlVGV4dD4gY29uc3QgbV9wVlQ7CiAgIH07CiAKICAgY2xhc3MgUHJvdmlkZXIgewpAQCAtOTMsNDEgKzgwLDM4IEBACiAgIHZvaWQgU2V0QWxpZ25tZW50KGludDMyX3QgbkZvcm1hdCkgeyBtX25BbGlnbm1lbnQgPSBuRm9ybWF0OyB9CiAgIHZvaWQgU2V0UGFzc3dvcmRDaGFyKHVpbnQxNl90IHdTdWJXb3JkKSB7IG1fd1N1YldvcmQgPSB3U3ViV29yZDsgfQogICB2b2lkIFNldExpbWl0Q2hhcihpbnQzMl90IG5MaW1pdENoYXIpIHsgbV9uTGltaXRDaGFyID0gbkxpbWl0Q2hhcjsgfQotICB2b2lkIFNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKSB7IG1fZkNoYXJTcGFjZSA9IGZDaGFyU3BhY2U7IH0KKyAgdm9pZCBTZXRDaGFyU3BhY2UoZmxvYXQgZkNoYXJTcGFjZSkgeyBtX2ZDaGFyU3BhY2UgPSBmQ2hhclNwYWNlOyB9CiAgIHZvaWQgU2V0TXVsdGlMaW5lKGJvb2wgYk11bHRpTGluZSkgeyBtX2JNdWx0aUxpbmUgPSBiTXVsdGlMaW5lOyB9CiAgIHZvaWQgU2V0QXV0b1JldHVybihib29sIGJBdXRvKSB7IG1fYkxpbWl0V2lkdGggPSBiQXV0bzsgfQotICB2b2lkIFNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgeyBtX2ZGb250U2l6ZSA9IGZGb250U2l6ZTsgfQorICB2b2lkIFNldEZvbnRTaXplKGZsb2F0IGZGb250U2l6ZSkgeyBtX2ZGb250U2l6ZSA9IGZGb250U2l6ZTsgfQogICB2b2lkIFNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXkpIHsgbV9uQ2hhckFycmF5ID0gbkNoYXJBcnJheTsgfQogICB2b2lkIFNldEF1dG9Gb250U2l6ZShib29sIGJBdXRvKSB7IG1fYkF1dG9Gb250U2l6ZSA9IGJBdXRvOyB9CiAgIHZvaWQgSW5pdGlhbGl6ZSgpOwogCi0gIGJvb2wgSXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1fYkluaXRpYWw7IH0KKyAgYm9vbCBJc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbV9iSW5pdGlhbGl6ZWQ7IH0KIAogICB2b2lkIFJlYXJyYW5nZUFsbCgpOwogICB2b2lkIFJlYXJyYW5nZVBhcnQoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIFBsYWNlUmFuZ2UpOwotICB2b2lkIFJlc2V0QWxsKCk7Ci0gIHZvaWQgU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgdGV4dCk7CisgIHZvaWQgU2V0VGV4dChjb25zdCBXaWRlU3RyaW5nJiB0ZXh0KTsKICAgQ1BWVF9Xb3JkUGxhY2UgSW5zZXJ0V29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMpOwotICBDUFZUX1dvcmRQbGFjZSBJbnNlcnRTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMpOwotICBDUFZUX1dvcmRQbGFjZSBJbnNlcnRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgRlhfV0NIQVIqIHRleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCk7CisgIENQVlRfV29yZFBsYWNlIEluc2VydFNlY3Rpb24oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKICAgQ1BWVF9Xb3JkUGxhY2UgRGVsZXRlV29yZHMoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIFBsYWNlUmFuZ2UpOwogICBDUFZUX1dvcmRQbGFjZSBEZWxldGVXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSk7CiAgIENQVlRfV29yZFBsYWNlIEJhY2tTcGFjZVdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKIAogICBpbnQzMl90IEdldFRvdGFsV29yZHMoKSBjb25zdDsKLSAgRlhfRkxPQVQgR2V0Rm9udFNpemUoKSBjb25zdCB7IHJldHVybiBtX2ZGb250U2l6ZTsgfQorICBmbG9hdCBHZXRGb250U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZkZvbnRTaXplOyB9CiAgIGludDMyX3QgR2V0QWxpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gbV9uQWxpZ25tZW50OyB9CiAgIHVpbnQxNl90IEdldFBhc3N3b3JkQ2hhcigpIGNvbnN0IHsgcmV0dXJuIEdldFN1YldvcmQoKTsgfQogICBpbnQzMl90IEdldENoYXJBcnJheSgpIGNvbnN0IHsgcmV0dXJuIG1fbkNoYXJBcnJheTsgfQogICBpbnQzMl90IEdldExpbWl0Q2hhcigpIGNvbnN0IHsgcmV0dXJuIG1fbkxpbWl0Q2hhcjsgfQogICBib29sIElzTXVsdGlMaW5lKCkgY29uc3QgeyByZXR1cm4gbV9iTXVsdGlMaW5lOyB9CiAgIGludDMyX3QgR2V0SG9yelNjYWxlKCkgY29uc3QgeyByZXR1cm4gbV9uSG9yelNjYWxlOyB9Ci0gIEZYX0ZMT0FUIEdldENoYXJTcGFjZSgpIGNvbnN0IHsgcmV0dXJuIG1fZkNoYXJTcGFjZTsgfQorICBmbG9hdCBHZXRDaGFyU3BhY2UoKSBjb25zdCB7IHJldHVybiBtX2ZDaGFyU3BhY2U7IH0KKyAgYm9vbCBJc0F1dG9SZXR1cm4oKSBjb25zdCB7IHJldHVybiBtX2JMaW1pdFdpZHRoOyB9CisKICAgQ1BWVF9Xb3JkUGxhY2UgR2V0QmVnaW5Xb3JkUGxhY2UoKSBjb25zdDsKICAgQ1BWVF9Xb3JkUGxhY2UgR2V0RW5kV29yZFBsYWNlKCkgY29uc3Q7CiAgIENQVlRfV29yZFBsYWNlIEdldFByZXZXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdDsKQEAgLTE0OSw5ICsxMzMsOCBAQAogCiAgIHVpbnQxNl90IEdldFN1YldvcmQoKSBjb25zdCB7IHJldHVybiBtX3dTdWJXb3JkOyB9CiAKLSAgRlhfRkxPQVQgR2V0UGxhdGVXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fcmNQbGF0ZS5yaWdodCAtIG1fcmNQbGF0ZS5sZWZ0OyB9Ci0gIEZYX0ZMT0FUIEdldFBsYXRlSGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9yY1BsYXRlLnRvcCAtIG1fcmNQbGF0ZS5ib3R0b207IH0KLSAgQ0ZYX1NpemVGIEdldFBsYXRlU2l6ZSgpIGNvbnN0OworICBmbG9hdCBHZXRQbGF0ZVdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9yY1BsYXRlLnJpZ2h0IC0gbV9yY1BsYXRlLmxlZnQ7IH0KKyAgZmxvYXQgR2V0UGxhdGVIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX3JjUGxhdGUudG9wIC0gbV9yY1BsYXRlLmJvdHRvbTsgfQogICBDRlhfUG9pbnRGIEdldEJUUG9pbnQoKSBjb25zdDsKICAgQ0ZYX1BvaW50RiBHZXRFVFBvaW50KCkgY29uc3Q7CiAKQEAgLTE2MCwxOSArMTQzLDM1IEBACiAgIENGWF9GbG9hdFJlY3QgSW5Ub091dChjb25zdCBDUFZUX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3Q7CiAgIENQVlRfRmxvYXRSZWN0IE91dFRvSW4oY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3Q7CiAKLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgQ1R5cGVzZXQ7Ci0gIGZyaWVuZCBjbGFzcyBDU2VjdGlvbjsKKyAgZmxvYXQgR2V0Rm9udEFzY2VudChpbnQzMl90IG5Gb250SW5kZXgsIGZsb2F0IGZGb250U2l6ZSk7CisgIGZsb2F0IEdldEZvbnREZXNjZW50KGludDMyX3QgbkZvbnRJbmRleCwgZmxvYXQgZkZvbnRTaXplKTsKKyAgaW50MzJfdCBHZXREZWZhdWx0Rm9udEluZGV4KCk7CisgIGZsb2F0IEdldExpbmVMZWFkaW5nKCk7CisgIGludDMyX3QgR2V0QWxpZ25tZW50KCk7CisgIGZsb2F0IEdldFdvcmRXaWR0aChjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbyk7CisgIGZsb2F0IEdldFdvcmRXaWR0aChpbnQzMl90IG5Gb250SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBXb3JkLAorICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgU3ViV29yZCwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZDaGFyU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Ib3J6U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmRm9udFNpemUsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmV29yZFRhaWwpOworICBmbG9hdCBHZXRXb3JkQXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8mIFdvcmRJbmZvKTsKKyAgZmxvYXQgR2V0V29yZERlc2NlbnQoY29uc3QgQ1BWVF9Xb3JkSW5mbyYgV29yZEluZm8pOworICBmbG9hdCBHZXRXb3JkQXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8mIFdvcmRJbmZvLCBmbG9hdCBmRm9udFNpemUpOworICBmbG9hdCBHZXRXb3JkRGVzY2VudChjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbywgZmxvYXQgZkZvbnRTaXplKTsKKyAgZmxvYXQgR2V0TGluZUFzY2VudCgpOworICBmbG9hdCBHZXRMaW5lRGVzY2VudCgpOworICBmbG9hdCBHZXRMaW5lSW5kZW50KCk7CiAKKyBwcml2YXRlOgogICBpbnQzMl90IEdldENoYXJXaWR0aChpbnQzMl90IG5Gb250SW5kZXgsIHVpbnQxNl90IFdvcmQsIHVpbnQxNl90IFN1YldvcmQpOwogICBpbnQzMl90IEdldFR5cGVBc2NlbnQoaW50MzJfdCBuRm9udEluZGV4KTsKICAgaW50MzJfdCBHZXRUeXBlRGVzY2VudChpbnQzMl90IG5Gb250SW5kZXgpOwogICBpbnQzMl90IEdldFdvcmRGb250SW5kZXgodWludDE2X3Qgd29yZCwgaW50MzJfdCBjaGFyc2V0LCBpbnQzMl90IG5Gb250SW5kZXgpOwotICBpbnQzMl90IEdldERlZmF1bHRGb250SW5kZXgoKTsKICAgYm9vbCBJc0xhdGluV29yZCh1aW50MTZfdCB3b3JkKTsKIAotICBDUFZUX1dvcmRQbGFjZSBBZGRTZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY3Rpb25JbmZvJiBzZWNpbmZvKTsKKyAgQ1BWVF9Xb3JkUGxhY2UgQWRkU2VjdGlvbihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpOwogICBDUFZUX1dvcmRQbGFjZSBBZGRMaW5lKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX0xpbmVJbmZvJiBsaW5laW5mbyk7CiAgIENQVlRfV29yZFBsYWNlIEFkZFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLApAQCAtMTgwLDMwICsxNzksOCBAQAogICBib29sIEdldFdvcmRJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgQ1BWVF9Xb3JkSW5mbyYgd29yZGluZm8pOwogICBib29sIFNldFdvcmRJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkSW5mbyYgd29yZGluZm8pOwogICBib29sIEdldExpbmVJbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgQ1BWVF9MaW5lSW5mbyYgbGluZWluZm8pOwotICBib29sIEdldFNlY3Rpb25JbmZvKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgQ1BWVF9TZWN0aW9uSW5mbyYgc2VjaW5mbyk7Ci0gIEZYX0ZMT0FUIEdldFdvcmRGb250U2l6ZShjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbyk7Ci0gIEZYX0ZMT0FUIEdldFdvcmRXaWR0aChpbnQzMl90IG5Gb250SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBXb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgU3ViV29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDaGFyU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Ib3J6U2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV29yZFRhaWwpOwotICBGWF9GTE9BVCBHZXRXb3JkV2lkdGgoY29uc3QgQ1BWVF9Xb3JkSW5mbyYgV29yZEluZm8pOwotICBGWF9GTE9BVCBHZXRXb3JkQXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8mIFdvcmRJbmZvLCBGWF9GTE9BVCBmRm9udFNpemUpOwotICBGWF9GTE9BVCBHZXRXb3JkRGVzY2VudChjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbywgRlhfRkxPQVQgZkZvbnRTaXplKTsKLSAgRlhfRkxPQVQgR2V0V29yZEFzY2VudChjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbyk7Ci0gIEZYX0ZMT0FUIEdldFdvcmREZXNjZW50KGNvbnN0IENQVlRfV29yZEluZm8mIFdvcmRJbmZvKTsKLSAgRlhfRkxPQVQgR2V0TGluZUFzY2VudChjb25zdCBDUFZUX1NlY3Rpb25JbmZvJiBTZWNJbmZvKTsKLSAgRlhfRkxPQVQgR2V0TGluZURlc2NlbnQoY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyYgU2VjSW5mbyk7Ci0gIEZYX0ZMT0FUIEdldEZvbnRBc2NlbnQoaW50MzJfdCBuRm9udEluZGV4LCBGWF9GTE9BVCBmRm9udFNpemUpOwotICBGWF9GTE9BVCBHZXRGb250RGVzY2VudChpbnQzMl90IG5Gb250SW5kZXgsIEZYX0ZMT0FUIGZGb250U2l6ZSk7CisgIGZsb2F0IEdldFdvcmRGb250U2l6ZSgpOwogICBpbnQzMl90IEdldFdvcmRGb250SW5kZXgoY29uc3QgQ1BWVF9Xb3JkSW5mbyYgV29yZEluZm8pOwotICBGWF9GTE9BVCBHZXRDaGFyU3BhY2UoY29uc3QgQ1BWVF9Xb3JkSW5mbyYgV29yZEluZm8pOwotICBpbnQzMl90IEdldEhvcnpTY2FsZShjb25zdCBDUFZUX1dvcmRJbmZvJiBXb3JkSW5mbyk7Ci0gIEZYX0ZMT0FUIEdldExpbmVMZWFkaW5nKGNvbnN0IENQVlRfU2VjdGlvbkluZm8mIFNlY0luZm8pOwotICBGWF9GTE9BVCBHZXRMaW5lSW5kZW50KGNvbnN0IENQVlRfU2VjdGlvbkluZm8mIFNlY0luZm8pOwotICBpbnQzMl90IEdldEFsaWdubWVudChjb25zdCBDUFZUX1NlY3Rpb25JbmZvJiBTZWNJbmZvKTsKIAogICB2b2lkIENsZWFyU2VjdGlvblJpZ2h0V29yZHMoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKIApAQCAtMjE1LDI1ICsxOTIsMjMgQEAKICAgQ1BWVF9Xb3JkUGxhY2UgQ2xlYXJSaWdodFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKIAogICBDUFZUX0Zsb2F0UmVjdCBSZWFycmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIFBsYWNlUmFuZ2UpOwotICBGWF9GTE9BVCBHZXRBdXRvRm9udFNpemUoKTsKLSAgYm9vbCBJc0JpZ2dlcihGWF9GTE9BVCBmRm9udFNpemUpIGNvbnN0OworICBmbG9hdCBHZXRBdXRvRm9udFNpemUoKTsKKyAgYm9vbCBJc0JpZ2dlcihmbG9hdCBmRm9udFNpemUpIGNvbnN0OwogICBDUFZUX0Zsb2F0UmVjdCBSZWFycmFuZ2VTZWN0aW9ucyhjb25zdCBDUFZUX1dvcmRSYW5nZSYgUGxhY2VSYW5nZSk7CiAKLSAgdm9pZCBSZXNldFNlY3Rpb25BcnJheSgpOwotCi0gIENQVlRfQXJyYXlUZW1wbGF0ZTxDU2VjdGlvbio+IG1fU2VjdGlvbkFycmF5OworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1NlY3Rpb24+PiBtX1NlY3Rpb25BcnJheTsKICAgaW50MzJfdCBtX25MaW1pdENoYXI7CiAgIGludDMyX3QgbV9uQ2hhckFycmF5OwogICBib29sIG1fYk11bHRpTGluZTsKICAgYm9vbCBtX2JMaW1pdFdpZHRoOwogICBib29sIG1fYkF1dG9Gb250U2l6ZTsKICAgaW50MzJfdCBtX25BbGlnbm1lbnQ7Ci0gIEZYX0ZMT0FUIG1fZkxpbmVMZWFkaW5nOwotICBGWF9GTE9BVCBtX2ZDaGFyU3BhY2U7CisgIGZsb2F0IG1fZkxpbmVMZWFkaW5nOworICBmbG9hdCBtX2ZDaGFyU3BhY2U7CiAgIGludDMyX3QgbV9uSG9yelNjYWxlOwogICB1aW50MTZfdCBtX3dTdWJXb3JkOwotICBGWF9GTE9BVCBtX2ZGb250U2l6ZTsKLSAgYm9vbCBtX2JJbml0aWFsOworICBmbG9hdCBtX2ZGb250U2l6ZTsKKyAgYm9vbCBtX2JJbml0aWFsaXplZDsKICAgQ1BERl9WYXJpYWJsZVRleHQ6OlByb3ZpZGVyKiBtX3BWVFByb3ZpZGVyOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9WYXJpYWJsZVRleHQ6Okl0ZXJhdG9yPiBtX3BWVEl0ZXJhdG9yOwogICBDRlhfRmxvYXRSZWN0IG1fcmNQbGF0ZTsKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jcGRmX3ZpZXdlcnByZWZlcmVuY2VzLmNwcCBiL2NvcmUvZnBkZmRvYy9jcGRmX3ZpZXdlcnByZWZlcmVuY2VzLmNwcAppbmRleCBmMWZjNGIwLi5lN2ZiMTQxIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZkb2MvY3BkZl92aWV3ZXJwcmVmZXJlbmNlcy5jcHAKKysrIGIvY29yZS9mcGRmZG9jL2NwZGZfdmlld2VycHJlZmVyZW5jZXMuY3BwCkBAIC0zNCwxMyArMzQsMTMgQEAKICAgcmV0dXJuIHBEaWN0ID8gcERpY3QtPkdldEFycmF5Rm9yKCJQcmludFBhZ2VSYW5nZSIpIDogbnVsbHB0cjsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlczo6RHVwbGV4KCkgY29uc3QgeworQnl0ZVN0cmluZyBDUERGX1ZpZXdlclByZWZlcmVuY2VzOjpEdXBsZXgoKSBjb25zdCB7CiAgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBHZXRWaWV3ZXJQcmVmZXJlbmNlcygpOwotICByZXR1cm4gcERpY3QgPyBwRGljdC0+R2V0U3RyaW5nRm9yKCJEdXBsZXgiKSA6IENGWF9CeXRlU3RyaW5nKCJOb25lIik7CisgIHJldHVybiBwRGljdCA/IHBEaWN0LT5HZXRTdHJpbmdGb3IoIkR1cGxleCIpIDogQnl0ZVN0cmluZygiTm9uZSIpOwogfQogCi1ib29sIENQREZfVmlld2VyUHJlZmVyZW5jZXM6OkdlbmVyaWNOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic0tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcqIGJzVmFsKSBjb25zdCB7Citib29sIENQREZfVmlld2VyUHJlZmVyZW5jZXM6OkdlbmVyaWNOYW1lKGNvbnN0IEJ5dGVTdHJpbmcmIGJzS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nKiBic1ZhbCkgY29uc3QgewogICBBU1NFUlQoYnNWYWwpOwogICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gR2V0Vmlld2VyUHJlZmVyZW5jZXMoKTsKICAgaWYgKCFwRGljdCkKQEAgLTU1LDYgKzU1LDYgQEAKIH0KIAogQ1BERl9EaWN0aW9uYXJ5KiBDUERGX1ZpZXdlclByZWZlcmVuY2VzOjpHZXRWaWV3ZXJQcmVmZXJlbmNlcygpIGNvbnN0IHsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcERvYy0+R2V0Um9vdCgpOworICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gbV9wRG9jLT5HZXRSb290KCk7CiAgIHJldHVybiBwRGljdCA/IHBEaWN0LT5HZXREaWN0Rm9yKCJWaWV3ZXJQcmVmZXJlbmNlcyIpIDogbnVsbHB0cjsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jcGRmX3ZpZXdlcnByZWZlcmVuY2VzLmggYi9jb3JlL2ZwZGZkb2MvY3BkZl92aWV3ZXJwcmVmZXJlbmNlcy5oCmluZGV4IGM3ZTkxMTIuLmExODg0NzQgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jcGRmX3ZpZXdlcnByZWZlcmVuY2VzLmgKKysrIGIvY29yZS9mcGRmZG9jL2NwZGZfdmlld2VycHJlZmVyZW5jZXMuaApAQCAtOSw2ICs5LDcgQEAKIAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAKIGNsYXNzIENQREZfQXJyYXk7CiBjbGFzcyBDUERGX0RpY3Rpb25hcnk7CkBAIC0yMywxNyArMjQsMTcgQEAKICAgYm9vbCBQcmludFNjYWxpbmcoKSBjb25zdDsKICAgaW50MzJfdCBOdW1Db3BpZXMoKSBjb25zdDsKICAgQ1BERl9BcnJheSogUHJpbnRQYWdlUmFuZ2UoKSBjb25zdDsKLSAgQ0ZYX0J5dGVTdHJpbmcgRHVwbGV4KCkgY29uc3Q7CisgIEJ5dGVTdHJpbmcgRHVwbGV4KCkgY29uc3Q7CiAKICAgLy8gR2V0cyB0aGUgZW50cnkgZm9yIHxic0tleXwuIElmIHRoZSBlbnRyeSBleGlzdHMgYW5kIGl0IGlzIG9mIHR5cGUgbmFtZSwKICAgLy8gdGhlbiB0aGlzIG1ldGhvZCB3cml0ZXMgdGhlIHZhbHVlIGludG8gfGJzVmFsfCBhbmQgcmV0dXJucyB0cnVlLiBPdGhlcndpc2UKICAgLy8gcmV0dXJucyBmYWxzZSBhbmQgfGJzVmFsfCBpcyB1bnRvdWNoZWQuIHxic1ZhbHwgbXVzdCBub3QgYmUgTlVMTC4KLSAgYm9vbCBHZW5lcmljTmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgYnNLZXksIENGWF9CeXRlU3RyaW5nKiBic1ZhbCkgY29uc3Q7CisgIGJvb2wgR2VuZXJpY05hbWUoY29uc3QgQnl0ZVN0cmluZyYgYnNLZXksIEJ5dGVTdHJpbmcqIGJzVmFsKSBjb25zdDsKIAogIHByaXZhdGU6CiAgIENQREZfRGljdGlvbmFyeSogR2V0Vmlld2VyUHJlZmVyZW5jZXMoKSBjb25zdDsKIAotICBDUERGX0RvY3VtZW50KiBjb25zdCBtX3BEb2M7CisgIFVub3duZWRQdHI8Q1BERl9Eb2N1bWVudD4gY29uc3QgbV9wRG9jOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZQREZET0NfQ1BERl9WSUVXRVJQUkVGRVJFTkNFU19IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwdnRfYXJyYXl0ZW1wbGF0ZS5oIGIvY29yZS9mcGRmZG9jL2NwdnRfYXJyYXl0ZW1wbGF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mjc0YmQ5Li4wMDAwMDAwCi0tLSBhL2NvcmUvZnBkZmRvYy9jcHZ0X2FycmF5dGVtcGxhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBDT1JFX0ZQREZET0NfQ1BWVF9BUlJBWVRFTVBMQVRFX0hfCi0jZGVmaW5lIENPUkVfRlBERkRPQ19DUFZUX0FSUkFZVEVNUExBVEVfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotCi10ZW1wbGF0ZSA8Y2xhc3MgVFlQRT4KLWNsYXNzIENQVlRfQXJyYXlUZW1wbGF0ZSA6IHB1YmxpYyBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPiB7Ci0gcHVibGljOgotICBib29sIElzRW1wdHkoKSB7IHJldHVybiBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpIDw9IDA7IH0KLQotICBUWVBFIEdldEF0KGludCBuSW5kZXgpIGNvbnN0IHsKLSAgICBpZiAobkluZGV4ID49IDAgJiYgbkluZGV4IDwgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OkdldFNpemUoKSkKLSAgICAgIHJldHVybiBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0QXQobkluZGV4KTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotCi0gIHZvaWQgUmVtb3ZlQXQoaW50IG5JbmRleCkgewotICAgIGlmIChuSW5kZXggPj0gMCAmJiBuSW5kZXggPCBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0U2l6ZSgpKQotICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OlJlbW92ZUF0KG5JbmRleCk7Ci0gIH0KLX07Ci0KLSNlbmRpZiAgLy8gQ09SRV9GUERGRE9DX0NQVlRfQVJSQVlURU1QTEFURV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwdnRfY29sb3IuY3BwIGIvY29yZS9mcGRmZG9jL2NwdnRfY29sb3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMGU2YTI2Li4wMDAwMDAwCi0tLSBhL2NvcmUvZnBkZmRvYy9jcHZ0X2NvbG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcHZ0X2NvbG9yLmgiCi0KLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc2ltcGxlX3BhcnNlci5oIgotCi0vLyBTdGF0aWMuCi1DUFZUX0NvbG9yIENQVlRfQ29sb3I6OlBhcnNlQ29sb3IoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikgewotICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgoc3RyLkFzU3RyaW5nQygpKTsKLSAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW1Gcm9tU3RhcnQoImciLCAxKSkKLSAgICByZXR1cm4gQ1BWVF9Db2xvcihDUFZUX0NvbG9yOjprR3JheSwgRlhfYXRvZihzeW50YXguR2V0V29yZCgpKSk7Ci0KLSAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW1Gcm9tU3RhcnQoInJnIiwgMykpIHsKLSAgICBGWF9GTE9BVCBmMSA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7Ci0gICAgRlhfRkxPQVQgZjIgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOwotICAgIEZYX0ZMT0FUIGYzID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKLSAgICByZXR1cm4gQ1BWVF9Db2xvcihDUFZUX0NvbG9yOjprUkdCLCBmMSwgZjIsIGYzKTsKLSAgfQotICBpZiAoc3ludGF4LkZpbmRUYWdQYXJhbUZyb21TdGFydCgiayIsIDQpKSB7Ci0gICAgRlhfRkxPQVQgZjEgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOwotICAgIEZYX0ZMT0FUIGYyID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKLSAgICBGWF9GTE9BVCBmMyA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7Ci0gICAgRlhfRkxPQVQgZjQgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOwotICAgIHJldHVybiBDUFZUX0NvbG9yKENQVlRfQ29sb3I6OmtDTVlLLCBmMSwgZjIsIGYzLCBmNCk7Ci0gIH0KLSAgcmV0dXJuIENQVlRfQ29sb3IoQ1BWVF9Db2xvcjo6a1RyYW5zcGFyZW50KTsKLX0KLQotLy8gU3RhdGljLgotQ1BWVF9Db2xvciBDUFZUX0NvbG9yOjpQYXJzZUNvbG9yKGNvbnN0IENQREZfQXJyYXkmIGFycmF5KSB7Ci0gIENQVlRfQ29sb3IgcnQ7Ci0gIHN3aXRjaCAoYXJyYXkuR2V0Q291bnQoKSkgewotICAgIGNhc2UgMToKLSAgICAgIHJ0ID0gQ1BWVF9Db2xvcihDUFZUX0NvbG9yOjprR3JheSwgYXJyYXkuR2V0RmxvYXRBdCgwKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBydCA9IENQVlRfQ29sb3IoQ1BWVF9Db2xvcjo6a1JHQiwgYXJyYXkuR2V0RmxvYXRBdCgwKSwKLSAgICAgICAgICAgICAgICAgICAgICBhcnJheS5HZXRGbG9hdEF0KDEpLCBhcnJheS5HZXRGbG9hdEF0KDIpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIHJ0ID0gQ1BWVF9Db2xvcihDUFZUX0NvbG9yOjprQ01ZSywgYXJyYXkuR2V0RmxvYXRBdCgwKSwKLSAgICAgICAgICAgICAgICAgICAgICBhcnJheS5HZXRGbG9hdEF0KDEpLCBhcnJheS5HZXRGbG9hdEF0KDIpLAotICAgICAgICAgICAgICAgICAgICAgIGFycmF5LkdldEZsb2F0QXQoMykpOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIHJ0OwotfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwdnRfY29sb3IuaCBiL2NvcmUvZnBkZmRvYy9jcHZ0X2NvbG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNDk0MmQuLjAwMDAwMDAKLS0tIGEvY29yZS9mcGRmZG9jL2NwdnRfY29sb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBDT1JFX0ZQREZET0NfQ1BWVF9DT0xPUl9IXwotI2RlZmluZSBDT1JFX0ZQREZET0NfQ1BWVF9DT0xPUl9IXwotCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotCi1zdHJ1Y3QgQ1BWVF9Db2xvciB7Ci0gIGVudW0gVHlwZSB7IGtUcmFuc3BhcmVudCA9IDAsIGtHcmF5LCBrUkdCLCBrQ01ZSyB9OwotCi0gIENQVlRfQ29sb3IoVHlwZSB0eXBlID0ga1RyYW5zcGFyZW50LAotICAgICAgICAgICAgIEZYX0ZMT0FUIGNvbG9yMSA9IDAuMGYsCi0gICAgICAgICAgICAgRlhfRkxPQVQgY29sb3IyID0gMC4wZiwKLSAgICAgICAgICAgICBGWF9GTE9BVCBjb2xvcjMgPSAwLjBmLAotICAgICAgICAgICAgIEZYX0ZMT0FUIGNvbG9yNCA9IDAuMGYpCi0gICAgICA6IG5Db2xvclR5cGUodHlwZSksCi0gICAgICAgIGZDb2xvcjEoY29sb3IxKSwKLSAgICAgICAgZkNvbG9yMihjb2xvcjIpLAotICAgICAgICBmQ29sb3IzKGNvbG9yMyksCi0gICAgICAgIGZDb2xvcjQoY29sb3I0KSB7fQotCi0gIFR5cGUgbkNvbG9yVHlwZTsKLSAgRlhfRkxPQVQgZkNvbG9yMTsKLSAgRlhfRkxPQVQgZkNvbG9yMjsKLSAgRlhfRkxPQVQgZkNvbG9yMzsKLSAgRlhfRkxPQVQgZkNvbG9yNDsKLQotICBzdGF0aWMgQ1BWVF9Db2xvciBQYXJzZUNvbG9yKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpOwotICBzdGF0aWMgQ1BWVF9Db2xvciBQYXJzZUNvbG9yKGNvbnN0IENQREZfQXJyYXkmIGFycmF5KTsKLX07Ci0KLSNlbmRpZiAgLy8gQ09SRV9GUERGRE9DX0NQVlRfQ09MT1JfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jcHZ0X2Rhc2guaCBiL2NvcmUvZnBkZmRvYy9jcHZ0X2Rhc2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgwZDEwNC4uMDAwMDAwMAotLS0gYS9jb3JlL2ZwZGZkb2MvY3B2dF9kYXNoLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgQ09SRV9GUERGRE9DX0NQVlRfREFTSF9IXwotI2RlZmluZSBDT1JFX0ZQREZET0NfQ1BWVF9EQVNIX0hfCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotc3RydWN0IENQVlRfRGFzaCB7Ci0gIENQVlRfRGFzaChpbnQzMl90IGRhc2gsIGludDMyX3QgZ2FwLCBpbnQzMl90IHBoYXNlKQotICAgICAgOiBuRGFzaChkYXNoKSwgbkdhcChnYXApLCBuUGhhc2UocGhhc2UpIHt9Ci0KLSAgaW50MzJfdCBuRGFzaDsKLSAgaW50MzJfdCBuR2FwOwotICBpbnQzMl90IG5QaGFzZTsKLX07Ci0KLSNlbmRpZiAgLy8gQ09SRV9GUERGRE9DX0NQVlRfREFTSF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwdnRfZmxvYXRyZWN0LmggYi9jb3JlL2ZwZGZkb2MvY3B2dF9mbG9hdHJlY3QuaAppbmRleCA2ZmM0YjhlLi5jNWViMjIwIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZkb2MvY3B2dF9mbG9hdHJlY3QuaAorKysgYi9jb3JlL2ZwZGZkb2MvY3B2dF9mbG9hdHJlY3QuaApAQCAtMTMsMTAgKzEzLDEwIEBACiAgcHVibGljOgogICBDUFZUX0Zsb2F0UmVjdCgpIHsgbGVmdCA9IHRvcCA9IHJpZ2h0ID0gYm90dG9tID0gMC4wZjsgfQogCi0gIENQVlRfRmxvYXRSZWN0KEZYX0ZMT0FUIG90aGVyX2xlZnQsCi0gICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX3RvcCwKLSAgICAgICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfcmlnaHQsCi0gICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX2JvdHRvbSkgeworICBDUFZUX0Zsb2F0UmVjdChmbG9hdCBvdGhlcl9sZWZ0LAorICAgICAgICAgICAgICAgICBmbG9hdCBvdGhlcl90b3AsCisgICAgICAgICAgICAgICAgIGZsb2F0IG90aGVyX3JpZ2h0LAorICAgICAgICAgICAgICAgICBmbG9hdCBvdGhlcl9ib3R0b20pIHsKICAgICBsZWZ0ID0gb3RoZXJfbGVmdDsKICAgICB0b3AgPSBvdGhlcl90b3A7CiAgICAgcmlnaHQgPSBvdGhlcl9yaWdodDsKQEAgLTMwLDkgKzMwLDcgQEAKICAgICBib3R0b20gPSByZWN0LmJvdHRvbTsKICAgfQogCi0gIHZvaWQgRGVmYXVsdCgpIHsgbGVmdCA9IHRvcCA9IHJpZ2h0ID0gYm90dG9tID0gMC4wZjsgfQotCi0gIEZYX0ZMT0FUIEhlaWdodCgpIGNvbnN0IHsKKyAgZmxvYXQgSGVpZ2h0KCkgY29uc3QgewogICAgIGlmICh0b3AgPiBib3R0b20pCiAgICAgICByZXR1cm4gdG9wIC0gYm90dG9tOwogICAgIHJldHVybiBib3R0b20gLSB0b3A7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3B2dF9mb250bWFwLmNwcCBiL2NvcmUvZnBkZmRvYy9jcHZ0X2ZvbnRtYXAuY3BwCmluZGV4IDI4M2Y2MDAuLmFhZjg2NjEgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jcHZ0X2ZvbnRtYXAuY3BwCisrKyBiL2NvcmUvZnBkZmRvYy9jcHZ0X2ZvbnRtYXAuY3BwCkBAIC0xMSw4NCArMTEsODIgQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcmVmZXJlbmNlLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfaW50ZXJmb3JtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb2RlcGFnZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgogCiBDUFZUX0ZvbnRNYXA6OkNQVlRfRm9udE1hcChDUERGX0RvY3VtZW50KiBwRG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzRGljdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcERlZkZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0RlZkZvbnRBbGlhcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIHNEZWZGb250QWxpYXMpCiAgICAgOiBtX3BEb2N1bWVudChwRG9jKSwKICAgICAgIG1fcFJlc0RpY3QocFJlc0RpY3QpLAogICAgICAgbV9wRGVmRm9udChwRGVmRm9udCksCi0gICAgICBtX3NEZWZGb250QWxpYXMoc0RlZkZvbnRBbGlhcyksCi0gICAgICBtX3BTeXNGb250KG51bGxwdHIpLAotICAgICAgbV9zU3lzRm9udEFsaWFzKCkge30KKyAgICAgIG1fc0RlZkZvbnRBbGlhcyhzRGVmRm9udEFsaWFzKSB7fQogCiBDUFZUX0ZvbnRNYXA6On5DUFZUX0ZvbnRNYXAoKSB7fQogCi12b2lkIENQVlRfRm9udE1hcDo6R2V0QW5ub3RTeXNQREZGb250KENQREZfRG9jdW1lbnQqIHBEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJlc0RpY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udComIHBTeXNGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc1N5c0ZvbnRBbGlhcykgeworQ1BERl9Gb250KiBDUFZUX0ZvbnRNYXA6OkdldEFubm90U3lzUERGRm9udChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBSZXNEaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nKiBzU3lzRm9udEFsaWFzKSB7CiAgIGlmICghcERvYyB8fCAhcFJlc0RpY3QpCi0gICAgcmV0dXJuOworICAgIHJldHVybiBudWxscHRyOwogCi0gIENGWF9CeXRlU3RyaW5nIHNGb250QWxpYXM7CiAgIENQREZfRGljdGlvbmFyeSogcEZvcm1EaWN0ID0gcERvYy0+R2V0Um9vdCgpLT5HZXREaWN0Rm9yKCJBY3JvRm9ybSIpOwogICBDUERGX0ZvbnQqIHBQREZGb250ID0gQWRkTmF0aXZlSW50ZXJGb3JtRm9udChwRm9ybURpY3QsIHBEb2MsIHNTeXNGb250QWxpYXMpOwogICBpZiAoIXBQREZGb250KQotICAgIHJldHVybjsKKyAgICByZXR1cm4gbnVsbHB0cjsKIAogICBDUERGX0RpY3Rpb25hcnkqIHBGb250TGlzdCA9IHBSZXNEaWN0LT5HZXREaWN0Rm9yKCJGb250Iik7Ci0gIGlmIChwRm9udExpc3QgJiYgIXBGb250TGlzdC0+S2V5RXhpc3Qoc1N5c0ZvbnRBbGlhcykpIHsKLSAgICBwRm9udExpc3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oc1N5c0ZvbnRBbGlhcywgcERvYywKKyAgaWYgKHBGb250TGlzdCAmJiAhcEZvbnRMaXN0LT5LZXlFeGlzdCgqc1N5c0ZvbnRBbGlhcykpIHsKKyAgICBwRm9udExpc3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oKnNTeXNGb250QWxpYXMsIHBEb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQREZGb250LT5HZXRGb250RGljdCgpLT5HZXRPYmpOdW0oKSk7CiAgIH0KLSAgcFN5c0ZvbnQgPSBwUERGRm9udDsKKyAgcmV0dXJuIHBQREZGb250OwogfQogCiBDUERGX0ZvbnQqIENQVlRfRm9udE1hcDo6R2V0UERGRm9udChpbnQzMl90IG5Gb250SW5kZXgpIHsKICAgc3dpdGNoIChuRm9udEluZGV4KSB7CiAgICAgY2FzZSAwOgotICAgICAgcmV0dXJuIG1fcERlZkZvbnQ7CisgICAgICByZXR1cm4gbV9wRGVmRm9udC5HZXQoKTsKICAgICBjYXNlIDE6CiAgICAgICBpZiAoIW1fcFN5c0ZvbnQpIHsKLSAgICAgICAgR2V0QW5ub3RTeXNQREZGb250KG1fcERvY3VtZW50LCBtX3BSZXNEaWN0LCBtX3BTeXNGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zU3lzRm9udEFsaWFzKTsKKyAgICAgICAgbV9wU3lzRm9udCA9IEdldEFubm90U3lzUERGRm9udChtX3BEb2N1bWVudC5HZXQoKSwgbV9wUmVzRGljdC5HZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9zU3lzRm9udEFsaWFzKTsKICAgICAgIH0KLSAgICAgIHJldHVybiBtX3BTeXNGb250OworICAgICAgcmV0dXJuIG1fcFN5c0ZvbnQuR2V0KCk7CiAgICAgZGVmYXVsdDoKICAgICAgIHJldHVybiBudWxscHRyOwogICB9CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENQVlRfRm9udE1hcDo6R2V0UERGRm9udEFsaWFzKGludDMyX3QgbkZvbnRJbmRleCkgeworQnl0ZVN0cmluZyBDUFZUX0ZvbnRNYXA6OkdldFBERkZvbnRBbGlhcyhpbnQzMl90IG5Gb250SW5kZXgpIHsKICAgc3dpdGNoIChuRm9udEluZGV4KSB7CiAgICAgY2FzZSAwOgogICAgICAgcmV0dXJuIG1fc0RlZkZvbnRBbGlhczsKICAgICBjYXNlIDE6CiAgICAgICBpZiAoIW1fcFN5c0ZvbnQpIHsKLSAgICAgICAgR2V0QW5ub3RTeXNQREZGb250KG1fcERvY3VtZW50LCBtX3BSZXNEaWN0LCBtX3BTeXNGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zU3lzRm9udEFsaWFzKTsKKyAgICAgICAgbV9wU3lzRm9udCA9IEdldEFubm90U3lzUERGRm9udChtX3BEb2N1bWVudC5HZXQoKSwgbV9wUmVzRGljdC5HZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9zU3lzRm9udEFsaWFzKTsKICAgICAgIH0KICAgICAgIHJldHVybiBtX3NTeXNGb250QWxpYXM7CiAgICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAiIjsKKyAgICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CiAgIH0KIH0KIAogaW50MzJfdCBDUFZUX0ZvbnRNYXA6OkdldFdvcmRGb250SW5kZXgodWludDE2X3Qgd29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZvbnRJbmRleCkgewotICBBU1NFUlQoZmFsc2UpOworICBOT1RSRUFDSEVEKCk7CiAgIHJldHVybiAwOwogfQogCiBpbnQzMl90IENQVlRfRm9udE1hcDo6Q2hhckNvZGVGcm9tVW5pY29kZShpbnQzMl90IG5Gb250SW5kZXgsIHVpbnQxNl90IHdvcmQpIHsKLSAgQVNTRVJUKGZhbHNlKTsKKyAgTk9UUkVBQ0hFRCgpOwogICByZXR1cm4gMDsKIH0KIAogaW50MzJfdCBDUFZUX0ZvbnRNYXA6OkNoYXJTZXRGcm9tVW5pY29kZSh1aW50MTZfdCB3b3JkLCBpbnQzMl90IG5PbGRDaGFyc2V0KSB7Ci0gIEFTU0VSVChmYWxzZSk7Ci0gIHJldHVybiBGWEZPTlRfQU5TSV9DSEFSU0VUOworICBOT1RSRUFDSEVEKCk7CisgIHJldHVybiBGWF9DSEFSU0VUX0FOU0k7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3B2dF9mb250bWFwLmggYi9jb3JlL2ZwZGZkb2MvY3B2dF9mb250bWFwLmgKaW5kZXggOThlMzkwZi4uYTBiOTRjZiAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwdnRfZm9udG1hcC5oCisrKyBiL2NvcmUvZnBkZmRvYy9jcHZ0X2ZvbnRtYXAuaApAQCAtMTEsNiArMTEsNyBAQAogCiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2lwdnRfZm9udG1hcC5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogCiBjbGFzcyBDUERGX0RvY3VtZW50OwogY2xhc3MgQ1BERl9EaWN0aW9uYXJ5OwpAQCAtMjEsMzAgKzIyLDI5IEBACiAgIENQVlRfRm9udE1hcChDUERGX0RvY3VtZW50KiBwRG9jLAogICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzRGljdCwKICAgICAgICAgICAgICAgIENQREZfRm9udCogcERlZkZvbnQsCi0gICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0RlZkZvbnRBbGlhcyk7CisgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBzRGVmRm9udEFsaWFzKTsKICAgfkNQVlRfRm9udE1hcCgpIG92ZXJyaWRlOwogCiAgIC8vIElQVlRfRm9udE1hcDoKICAgQ1BERl9Gb250KiBHZXRQREZGb250KGludDMyX3QgbkZvbnRJbmRleCkgb3ZlcnJpZGU7Ci0gIENGWF9CeXRlU3RyaW5nIEdldFBERkZvbnRBbGlhcyhpbnQzMl90IG5Gb250SW5kZXgpIG92ZXJyaWRlOworICBCeXRlU3RyaW5nIEdldFBERkZvbnRBbGlhcyhpbnQzMl90IG5Gb250SW5kZXgpIG92ZXJyaWRlOwogICBpbnQzMl90IEdldFdvcmRGb250SW5kZXgodWludDE2X3Qgd29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZvbnRJbmRleCkgb3ZlcnJpZGU7CiAgIGludDMyX3QgQ2hhckNvZGVGcm9tVW5pY29kZShpbnQzMl90IG5Gb250SW5kZXgsIHVpbnQxNl90IHdvcmQpIG92ZXJyaWRlOwogICBpbnQzMl90IENoYXJTZXRGcm9tVW5pY29kZSh1aW50MTZfdCB3b3JkLCBpbnQzMl90IG5PbGRDaGFyc2V0KSBvdmVycmlkZTsKIAotICBzdGF0aWMgdm9pZCBHZXRBbm5vdFN5c1BERkZvbnQoQ1BERl9Eb2N1bWVudCogcERvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJlc0RpY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqJiBwU3lzRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzU3lzRm9udEFsaWFzKTsKKyAgc3RhdGljIENQREZfRm9udCogR2V0QW5ub3RTeXNQREZGb250KENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBSZXNEaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0cmluZyogc1N5c0ZvbnRBbGlhcyk7CiAKICBwcml2YXRlOgotICBDUERGX0RvY3VtZW50KiBjb25zdCBtX3BEb2N1bWVudDsKLSAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBjb25zdCBtX3BSZXNEaWN0OwotICBDUERGX0ZvbnQqIGNvbnN0IG1fcERlZkZvbnQ7Ci0gIGNvbnN0IENGWF9CeXRlU3RyaW5nIG1fc0RlZkZvbnRBbGlhczsKLSAgQ1BERl9Gb250KiBtX3BTeXNGb250OwotICBDRlhfQnl0ZVN0cmluZyBtX3NTeXNGb250QWxpYXM7CisgIFVub3duZWRQdHI8Q1BERl9Eb2N1bWVudD4gY29uc3QgbV9wRG9jdW1lbnQ7CisgIFVub3duZWRQdHI8Q1BERl9EaWN0aW9uYXJ5PiBjb25zdCBtX3BSZXNEaWN0OworICBVbm93bmVkUHRyPENQREZfRm9udD4gY29uc3QgbV9wRGVmRm9udDsKKyAgVW5vd25lZFB0cjxDUERGX0ZvbnQ+IG1fcFN5c0ZvbnQ7CisgIGNvbnN0IEJ5dGVTdHJpbmcgbV9zRGVmRm9udEFsaWFzOworICBCeXRlU3RyaW5nIG1fc1N5c0ZvbnRBbGlhczsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9GUERGRE9DX0NQVlRfRk9OVE1BUF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwdnRfZ2VuZXJhdGVhcC5jcHAgYi9jb3JlL2ZwZGZkb2MvY3B2dF9nZW5lcmF0ZWFwLmNwcAppbmRleCAxNTUxNTE1Li4xYjk0ZjdlIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZkb2MvY3B2dF9nZW5lcmF0ZWFwLmNwcAorKysgYi9jb3JlL2ZwZGZkb2MvY3B2dF9nZW5lcmF0ZWFwLmNwcApAQCAtOCw5ICs4LDExIEBACiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8dXRpbGl0eT4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udC5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9ib29sZWFuLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaCIKQEAgLTIzLDEwOTAgKzI1LDczIEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGUuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9hbm5vdC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2Zvcm1maWVsZC5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcHZ0X2NvbG9yLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwdnRfZm9udG1hcC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcHZ0X3dvcmQuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKK3N0cnVjdCBDUFZUX0Rhc2ggeworICBDUFZUX0Rhc2goaW50MzJfdCBkYXNoLCBpbnQzMl90IGdhcCwgaW50MzJfdCBwaGFzZSkKKyAgICAgIDogbkRhc2goZGFzaCksIG5HYXAoZ2FwKSwgblBoYXNlKHBoYXNlKSB7fQorCisgIGludDMyX3QgbkRhc2g7CisgIGludDMyX3QgbkdhcDsKKyAgaW50MzJfdCBuUGhhc2U7Cit9OworCiBuYW1lc3BhY2UgewogCi1ib29sIEdlbmVyYXRlV2lkZ2V0QVAoQ1BERl9Eb2N1bWVudCogcERvYywKLSAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCYgbldpZGdldFR5cGUpIHsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QgPSBudWxscHRyOwotICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdERpY3QgPSBwRG9jLT5HZXRSb290KCkpCi0gICAgcEZvcm1EaWN0ID0gcFJvb3REaWN0LT5HZXREaWN0Rm9yKCJBY3JvRm9ybSIpOwotICBpZiAoIXBGb3JtRGljdCkKLSAgICByZXR1cm4gZmFsc2U7CitCeXRlU3RyaW5nIEdldFBERldvcmRTdHJpbmcoSVBWVF9Gb250TWFwKiBwRm9udE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Gb250SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgV29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBTdWJXb3JkKSB7CisgIGlmIChTdWJXb3JkID4gMCkKKyAgICByZXR1cm4gQnl0ZVN0cmluZzo6Rm9ybWF0KCIlYyIsIFN1YldvcmQpOwogCi0gIENGWF9CeXRlU3RyaW5nIERBOwotICBpZiAoQ1BERl9PYmplY3QqIHBEQU9iaiA9IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJEQSIpKQotICAgIERBID0gcERBT2JqLT5HZXRTdHJpbmcoKTsKLSAgaWYgKERBLklzRW1wdHkoKSkKLSAgICBEQSA9IHBGb3JtRGljdC0+R2V0U3RyaW5nRm9yKCJEQSIpOwotICBpZiAoREEuSXNFbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFwRm9udE1hcCkKKyAgICByZXR1cm4gIiI7CiAKLSAgQ1BERl9TaW1wbGVQYXJzZXIgc3ludGF4KERBLkFzU3RyaW5nQygpKTsKLSAgc3ludGF4LkZpbmRUYWdQYXJhbUZyb21TdGFydCgiVGYiLCAyKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnROYW1lKHN5bnRheC5HZXRXb3JkKCkpOwotICBzRm9udE5hbWUgPSBQREZfTmFtZURlY29kZShzRm9udE5hbWUpOwotICBpZiAoc0ZvbnROYW1lLklzRW1wdHkoKSkKLSAgICByZXR1cm4gZmFsc2U7CisgIENQREZfRm9udCogcFBERkZvbnQgPSBwRm9udE1hcC0+R2V0UERGRm9udChuRm9udEluZGV4KTsKKyAgaWYgKCFwUERGRm9udCkKKyAgICByZXR1cm4gIiI7CiAKLSAgRlhfRkxPQVQgZkZvbnRTaXplID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKLSAgQ1BWVF9Db2xvciBjclRleHQgPSBDUFZUX0NvbG9yOjpQYXJzZUNvbG9yKERBKTsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBwRFJEaWN0ID0gcEZvcm1EaWN0LT5HZXREaWN0Rm9yKCJEUiIpOwotICBpZiAoIXBEUkRpY3QpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfRGljdGlvbmFyeSogcERSRm9udERpY3QgPSBwRFJEaWN0LT5HZXREaWN0Rm9yKCJGb250Iik7Ci0gIGlmICghcERSRm9udERpY3QpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0ID0gcERSRm9udERpY3QtPkdldERpY3RGb3Ioc0ZvbnROYW1lLk1pZCgxKSk7Ci0gIGlmICghcEZvbnREaWN0KSB7Ci0gICAgcEZvbnREaWN0ID0gcERvYy0+TmV3SW5kaXJlY3Q8Q1BERl9EaWN0aW9uYXJ5PigpOwotICAgIHBGb250RGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIlR5cGUiLCAiRm9udCIpOwotICAgIHBGb250RGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIlN1YnR5cGUiLCAiVHlwZTEiKTsKLSAgICBwRm9udERpY3QtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJCYXNlRm9udCIsICJIZWx2ZXRpY2EiKTsKLSAgICBwRm9udERpY3QtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJFbmNvZGluZyIsICJXaW5BbnNpRW5jb2RpbmciKTsKLSAgICBwRFJGb250RGljdC0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPihzRm9udE5hbWUuTWlkKDEpLCBwRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb250RGljdC0+R2V0T2JqTnVtKCkpOwotICB9Ci0gIENQREZfRm9udCogcERlZkZvbnQgPSBwRG9jLT5Mb2FkRm9udChwRm9udERpY3QpOwotICBpZiAoIXBEZWZGb250KQotICAgIHJldHVybiBmYWxzZTsKLQotICBDRlhfRmxvYXRSZWN0IHJjQW5ub3QgPSBwQW5ub3REaWN0LT5HZXRSZWN0Rm9yKCJSZWN0Iik7Ci0gIGludDMyX3QgblJvdGF0ZSA9IDA7Ci0gIGlmIChDUERGX0RpY3Rpb25hcnkqIHBNS0RpY3QgPSBwQW5ub3REaWN0LT5HZXREaWN0Rm9yKCJNSyIpKQotICAgIG5Sb3RhdGUgPSBwTUtEaWN0LT5HZXRJbnRlZ2VyRm9yKCJSIik7Ci0KLSAgQ0ZYX0Zsb2F0UmVjdCByY0JCb3g7Ci0gIENGWF9NYXRyaXggbWF0cml4OwotICBzd2l0Y2ggKG5Sb3RhdGUgJSAzNjApIHsKLSAgICBjYXNlIDA6Ci0gICAgICByY0JCb3ggPSBDRlhfRmxvYXRSZWN0KDAsIDAsIHJjQW5ub3QucmlnaHQgLSByY0Fubm90LmxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQW5ub3QudG9wIC0gcmNBbm5vdC5ib3R0b20pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5MDoKLSAgICAgIG1hdHJpeCA9IENGWF9NYXRyaXgoMCwgMSwgLTEsIDAsIHJjQW5ub3QucmlnaHQgLSByY0Fubm90LmxlZnQsIDApOwotICAgICAgcmNCQm94ID0gQ0ZYX0Zsb2F0UmVjdCgwLCAwLCByY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTgwOgotICAgICAgbWF0cml4ID0gQ0ZYX01hdHJpeCgtMSwgMCwgMCwgLTEsIHJjQW5ub3QucmlnaHQgLSByY0Fubm90LmxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJjQW5ub3QudG9wIC0gcmNBbm5vdC5ib3R0b20pOwotICAgICAgcmNCQm94ID0gQ0ZYX0Zsb2F0UmVjdCgwLCAwLCByY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjcwOgotICAgICAgbWF0cml4ID0gQ0ZYX01hdHJpeCgwLCAtMSwgMSwgMCwgMCwgcmNBbm5vdC50b3AgLSByY0Fubm90LmJvdHRvbSk7Ci0gICAgICByY0JCb3ggPSBDRlhfRmxvYXRSZWN0KDAsIDAsIHJjQW5ub3QudG9wIC0gcmNBbm5vdC5ib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQW5ub3QucmlnaHQgLSByY0Fubm90LmxlZnQpOwotICAgICAgYnJlYWs7CisgIGlmIChwUERGRm9udC0+R2V0QmFzZUZvbnQoKS5Db21wYXJlKCJTeW1ib2wiKSA9PSAwIHx8CisgICAgICBwUERGRm9udC0+R2V0QmFzZUZvbnQoKS5Db21wYXJlKCJaYXBmRGluZ2JhdHMiKSA9PSAwKSB7CisgICAgcmV0dXJuIEJ5dGVTdHJpbmc6OkZvcm1hdCgiJWMiLCBXb3JkKTsKICAgfQogCi0gIEJvcmRlclN0eWxlIG5Cb3JkZXJTdHlsZSA9IEJvcmRlclN0eWxlOjpTT0xJRDsKLSAgRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gMTsKLSAgQ1BWVF9EYXNoIGRzQm9yZGVyKDMsIDAsIDApOwotICBDUFZUX0NvbG9yIGNyTGVmdFRvcCwgY3JSaWdodEJvdHRvbTsKLSAgaWYgKENQREZfRGljdGlvbmFyeSogcEJTRGljdCA9IHBBbm5vdERpY3QtPkdldERpY3RGb3IoIkJTIikpIHsKLSAgICBpZiAocEJTRGljdC0+S2V5RXhpc3QoIlciKSkKLSAgICAgIGZCb3JkZXJXaWR0aCA9IHBCU0RpY3QtPkdldE51bWJlckZvcigiVyIpOworICBCeXRlU3RyaW5nIHNXb3JkOworICB1aW50MzJfdCBkd0NoYXJDb2RlID0gcFBERkZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUoV29yZCk7CisgIGlmIChkd0NoYXJDb2RlICE9IENQREZfRm9udDo6a0ludmFsaWRDaGFyQ29kZSkKKyAgICBwUERGRm9udC0+QXBwZW5kQ2hhcigmc1dvcmQsIGR3Q2hhckNvZGUpOworICByZXR1cm4gc1dvcmQ7Cit9CiAKLSAgICBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcEJTRGljdC0+R2V0QXJyYXlGb3IoIkQiKSkgewotICAgICAgZHNCb3JkZXIgPSBDUFZUX0Rhc2gocEFycmF5LT5HZXRJbnRlZ2VyQXQoMCksIHBBcnJheS0+R2V0SW50ZWdlckF0KDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFycmF5LT5HZXRJbnRlZ2VyQXQoMikpOwotICAgIH0KLSAgICBzd2l0Y2ggKHBCU0RpY3QtPkdldFN0cmluZ0ZvcigiUyIpLkdldEF0KDApKSB7Ci0gICAgICBjYXNlICdTJzoKLSAgICAgICAgbkJvcmRlclN0eWxlID0gQm9yZGVyU3R5bGU6OlNPTElEOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ0QnOgotICAgICAgICBuQm9yZGVyU3R5bGUgPSBCb3JkZXJTdHlsZTo6REFTSDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdCJzoKLSAgICAgICAgbkJvcmRlclN0eWxlID0gQm9yZGVyU3R5bGU6OkJFVkVMRUQ7Ci0gICAgICAgIGZCb3JkZXJXaWR0aCAqPSAyOwotICAgICAgICBjckxlZnRUb3AgPSBDUFZUX0NvbG9yKENQVlRfQ29sb3I6OmtHcmF5LCAxKTsKLSAgICAgICAgY3JSaWdodEJvdHRvbSA9IENQVlRfQ29sb3IoQ1BWVF9Db2xvcjo6a0dyYXksIDAuNSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnSSc6Ci0gICAgICAgIG5Cb3JkZXJTdHlsZSA9IEJvcmRlclN0eWxlOjpJTlNFVDsKLSAgICAgICAgZkJvcmRlcldpZHRoICo9IDI7Ci0gICAgICAgIGNyTGVmdFRvcCA9IENQVlRfQ29sb3IoQ1BWVF9Db2xvcjo6a0dyYXksIDAuNSk7Ci0gICAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFZUX0NvbG9yKENQVlRfQ29sb3I6OmtHcmF5LCAwLjc1KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdVJzoKLSAgICAgICAgbkJvcmRlclN0eWxlID0gQm9yZGVyU3R5bGU6OlVOREVSTElORTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQorQnl0ZVN0cmluZyBHZXRXb3JkUmVuZGVyU3RyaW5nKGNvbnN0IEJ5dGVTdHJpbmcmIHN0cldvcmRzKSB7CisgIGlmIChzdHJXb3Jkcy5HZXRMZW5ndGgoKSA+IDApCisgICAgcmV0dXJuIFBERl9FbmNvZGVTdHJpbmcoc3RyV29yZHMsIGZhbHNlKSArICIgVGpcbiI7CisgIHJldHVybiAiIjsKK30KKworQnl0ZVN0cmluZyBHZXRGb250U2V0U3RyaW5nKElQVlRfRm9udE1hcCogcEZvbnRNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRm9udEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZGb250U2l6ZSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc1JldDsKKyAgaWYgKHBGb250TWFwKSB7CisgICAgQnl0ZVN0cmluZyBzRm9udEFsaWFzID0gcEZvbnRNYXAtPkdldFBERkZvbnRBbGlhcyhuRm9udEluZGV4KTsKKyAgICBpZiAoc0ZvbnRBbGlhcy5HZXRMZW5ndGgoKSA+IDAgJiYgZkZvbnRTaXplID4gMCkKKyAgICAgIHNSZXQgPDwgIi8iIDw8IHNGb250QWxpYXMgPDwgIiAiIDw8IGZGb250U2l6ZSA8PCAiIFRmXG4iOwogICB9Ci0gIENQVlRfQ29sb3IgY3JCb3JkZXIsIGNyQkc7Ci0gIGlmIChDUERGX0RpY3Rpb25hcnkqIHBNS0RpY3QgPSBwQW5ub3REaWN0LT5HZXREaWN0Rm9yKCJNSyIpKSB7Ci0gICAgaWYgKENQREZfQXJyYXkqIHBBcnJheSA9IHBNS0RpY3QtPkdldEFycmF5Rm9yKCJCQyIpKQotICAgICAgY3JCb3JkZXIgPSBDUFZUX0NvbG9yOjpQYXJzZUNvbG9yKCpwQXJyYXkpOwotICAgIGlmIChDUERGX0FycmF5KiBwQXJyYXkgPSBwTUtEaWN0LT5HZXRBcnJheUZvcigiQkciKSkKLSAgICAgIGNyQkcgPSBDUFZUX0NvbG9yOjpQYXJzZUNvbG9yKCpwQXJyYXkpOwotICB9Ci0gIENGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtOwotICBDRlhfQnl0ZVN0cmluZyBzQkcgPQotICAgICAgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY3JCRywgUGFpbnRPcGVyYXRpb246OkZJTEwpOwotICBpZiAoc0JHLkdldExlbmd0aCgpID4gMCkgewotICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgc0JHIDw8IHJjQkJveC5sZWZ0IDw8ICIgIiA8PCByY0JCb3guYm90dG9tIDw8ICIgIgotICAgICAgICAgICAgICAgPDwgcmNCQm94LldpZHRoKCkgPDwgIiAiIDw8IHJjQkJveC5IZWlnaHQoKSA8PCAiIHJlIGZcbiIKLSAgICAgICAgICAgICAgIDw8ICJRXG4iOwotICB9Ci0gIENGWF9CeXRlU3RyaW5nIHNCb3JkZXJTdHJlYW0gPSBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQm9yZGVyQVAoCi0gICAgICByY0JCb3gsIGZCb3JkZXJXaWR0aCwgY3JCb3JkZXIsIGNyTGVmdFRvcCwgY3JSaWdodEJvdHRvbSwgbkJvcmRlclN0eWxlLAotICAgICAgZHNCb3JkZXIpOwotICBpZiAoc0JvcmRlclN0cmVhbS5HZXRMZW5ndGgoKSA+IDApCi0gICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQm9yZGVyU3RyZWFtIDw8ICJRXG4iOwotCi0gIENGWF9GbG9hdFJlY3QgcmNCb2R5ID0KLSAgICAgIENGWF9GbG9hdFJlY3QocmNCQm94LmxlZnQgKyBmQm9yZGVyV2lkdGgsIHJjQkJveC5ib3R0b20gKyBmQm9yZGVyV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIHJjQkJveC5yaWdodCAtIGZCb3JkZXJXaWR0aCwgcmNCQm94LnRvcCAtIGZCb3JkZXJXaWR0aCk7Ci0gIHJjQm9keS5Ob3JtYWxpemUoKTsKLQotICBDUERGX0RpY3Rpb25hcnkqIHBBUERpY3QgPSBwQW5ub3REaWN0LT5HZXREaWN0Rm9yKCJBUCIpOwotICBpZiAoIXBBUERpY3QpCi0gICAgcEFQRGljdCA9IHBBbm5vdERpY3QtPlNldE5ld0ZvcjxDUERGX0RpY3Rpb25hcnk+KCJBUCIpOwotCi0gIENQREZfU3RyZWFtKiBwTm9ybWFsU3RyZWFtID0gcEFQRGljdC0+R2V0U3RyZWFtRm9yKCJOIik7Ci0gIGlmICghcE5vcm1hbFN0cmVhbSkgewotICAgIHBOb3JtYWxTdHJlYW0gPSBwRG9jLT5OZXdJbmRpcmVjdDxDUERGX1N0cmVhbT4oKTsKLSAgICBwQVBEaWN0LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJOIiwgcERvYywgcE5vcm1hbFN0cmVhbS0+R2V0T2JqTnVtKCkpOwotICB9Ci0gIENQREZfRGljdGlvbmFyeSogcFN0cmVhbURpY3QgPSBwTm9ybWFsU3RyZWFtLT5HZXREaWN0KCk7Ci0gIGlmIChwU3RyZWFtRGljdCkgewotICAgIHBTdHJlYW1EaWN0LT5TZXRNYXRyaXhGb3IoIk1hdHJpeCIsIG1hdHJpeCk7Ci0gICAgcFN0cmVhbURpY3QtPlNldFJlY3RGb3IoIkJCb3giLCByY0JCb3gpOwotICAgIENQREZfRGljdGlvbmFyeSogcFN0cmVhbVJlc0xpc3QgPSBwU3RyZWFtRGljdC0+R2V0RGljdEZvcigiUmVzb3VyY2VzIik7Ci0gICAgaWYgKHBTdHJlYW1SZXNMaXN0KSB7Ci0gICAgICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1SZXNGb250TGlzdCA9IHBTdHJlYW1SZXNMaXN0LT5HZXREaWN0Rm9yKCJGb250Iik7Ci0gICAgICBpZiAoIXBTdHJlYW1SZXNGb250TGlzdCkKLSAgICAgICAgcFN0cmVhbVJlc0ZvbnRMaXN0ID0gcFN0cmVhbVJlc0xpc3QtPlNldE5ld0ZvcjxDUERGX0RpY3Rpb25hcnk+KCJGb250Iik7Ci0gICAgICBpZiAoIXBTdHJlYW1SZXNGb250TGlzdC0+S2V5RXhpc3Qoc0ZvbnROYW1lKSkgewotICAgICAgICBwU3RyZWFtUmVzRm9udExpc3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oc0ZvbnROYW1lLCBwRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvbnREaWN0LT5HZXRPYmpOdW0oKSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBTdHJlYW1EaWN0LT5TZXRGb3IoIlJlc291cmNlcyIsIHBGb3JtRGljdC0+R2V0RGljdEZvcigiRFIiKS0+Q2xvbmUoKSk7Ci0gICAgICBwU3RyZWFtUmVzTGlzdCA9IHBTdHJlYW1EaWN0LT5HZXREaWN0Rm9yKCJSZXNvdXJjZXMiKTsKLSAgICB9Ci0gIH0KLSAgc3dpdGNoIChuV2lkZ2V0VHlwZSkgewotICAgIGNhc2UgMDogewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dWYWx1ZSA9Ci0gICAgICAgICAgRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIlYiKQotICAgICAgICAgICAgICA/IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJWIiktPkdldFVuaWNvZGVUZXh0KCkKLSAgICAgICAgICAgICAgOiBDRlhfV2lkZVN0cmluZygpOwotICAgICAgaW50MzJfdCBuQWxpZ24gPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiUSIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA/IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJRIiktPkdldEludGVnZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwOwotICAgICAgdWludDMyX3QgZHdGbGFncyA9IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJGZiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkZmIiktPkdldEludGVnZXIoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDA7Ci0gICAgICB1aW50MzJfdCBkd01heExlbiA9Ci0gICAgICAgICAgRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIk1heExlbiIpCi0gICAgICAgICAgICAgID8gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIk1heExlbiIpLT5HZXRJbnRlZ2VyKCkKLSAgICAgICAgICAgICAgOiAwOwotICAgICAgQ1BWVF9Gb250TWFwIG1hcCgKLSAgICAgICAgICBwRG9jLCBwU3RyZWFtRGljdCA/IHBTdHJlYW1EaWN0LT5HZXREaWN0Rm9yKCJSZXNvdXJjZXMiKSA6IG51bGxwdHIsCi0gICAgICAgICAgcERlZkZvbnQsIHNGb250TmFtZS5SaWdodChzRm9udE5hbWUuR2V0TGVuZ3RoKCkgLSAxKSk7Ci0gICAgICBDUERGX1ZhcmlhYmxlVGV4dDo6UHJvdmlkZXIgcHJkKCZtYXApOwotICAgICAgQ1BERl9WYXJpYWJsZVRleHQgdnQ7Ci0gICAgICB2dC5TZXRQcm92aWRlcigmcHJkKTsKLSAgICAgIHZ0LlNldFBsYXRlUmVjdChyY0JvZHkpOwotICAgICAgdnQuU2V0QWxpZ25tZW50KG5BbGlnbik7Ci0gICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkKLSAgICAgICAgdnQuU2V0QXV0b0ZvbnRTaXplKHRydWUpOwotICAgICAgZWxzZQotICAgICAgICB2dC5TZXRGb250U2l6ZShmRm9udFNpemUpOwotCi0gICAgICBib29sIGJNdWx0aUxpbmUgPSAoZHdGbGFncyA+PiAxMikgJiAxOwotICAgICAgaWYgKGJNdWx0aUxpbmUpIHsKLSAgICAgICAgdnQuU2V0TXVsdGlMaW5lKHRydWUpOwotICAgICAgICB2dC5TZXRBdXRvUmV0dXJuKHRydWUpOwotICAgICAgfQotICAgICAgdWludDE2X3Qgc3ViV29yZCA9IDA7Ci0gICAgICBpZiAoKGR3RmxhZ3MgPj4gMTMpICYgMSkgewotICAgICAgICBzdWJXb3JkID0gJyonOwotICAgICAgICB2dC5TZXRQYXNzd29yZENoYXIoc3ViV29yZCk7Ci0gICAgICB9Ci0gICAgICBib29sIGJDaGFyQXJyYXkgPSAoZHdGbGFncyA+PiAyNCkgJiAxOwotICAgICAgaWYgKGJDaGFyQXJyYXkpCi0gICAgICAgIHZ0LlNldENoYXJBcnJheShkd01heExlbik7Ci0gICAgICBlbHNlCi0gICAgICAgIHZ0LlNldExpbWl0Q2hhcihkd01heExlbik7Ci0KLSAgICAgIHZ0LkluaXRpYWxpemUoKTsKLSAgICAgIHZ0LlNldFRleHQoc3dWYWx1ZSk7Ci0gICAgICB2dC5SZWFycmFuZ2VBbGwoKTsKLSAgICAgIENGWF9GbG9hdFJlY3QgcmNDb250ZW50ID0gdnQuR2V0Q29udGVudFJlY3QoKTsKLSAgICAgIENGWF9Qb2ludEYgcHRPZmZzZXQ7Ci0gICAgICBpZiAoIWJNdWx0aUxpbmUpIHsKLSAgICAgICAgcHRPZmZzZXQgPQotICAgICAgICAgICAgQ0ZYX1BvaW50RigwLjBmLCAocmNDb250ZW50LkhlaWdodCgpIC0gcmNCb2R5LkhlaWdodCgpKSAvIDIuMGYpOwotICAgICAgfQotICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0JvZHkgPSBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlRWRpdEFQKAotICAgICAgICAgICZtYXAsIHZ0LkdldEl0ZXJhdG9yKCksIHB0T2Zmc2V0LCAhYkNoYXJBcnJheSwgc3ViV29yZCk7Ci0gICAgICBpZiAoc0JvZHkuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIHNBcHBTdHJlYW0gPDwgIi9UeCBCTUNcbiIKLSAgICAgICAgICAgICAgICAgICA8PCAicVxuIjsKLSAgICAgICAgaWYgKHJjQ29udGVudC5XaWR0aCgpID4gcmNCb2R5LldpZHRoKCkgfHwKLSAgICAgICAgICAgIHJjQ29udGVudC5IZWlnaHQoKSA+IHJjQm9keS5IZWlnaHQoKSkgewotICAgICAgICAgIHNBcHBTdHJlYW0gPDwgcmNCb2R5LmxlZnQgPDwgIiAiIDw8IHJjQm9keS5ib3R0b20gPDwgIiAiCi0gICAgICAgICAgICAgICAgICAgICA8PCByY0JvZHkuV2lkdGgoKSA8PCAiICIgPDwgcmNCb2R5LkhlaWdodCgpCi0gICAgICAgICAgICAgICAgICAgICA8PCAiIHJlXG5XXG5uXG4iOwotICAgICAgICB9Ci0gICAgICAgIHNBcHBTdHJlYW0gPDwgIkJUXG4iCi0gICAgICAgICAgICAgICAgICAgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY3JUZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50T3BlcmF0aW9uOjpGSUxMKQotICAgICAgICAgICAgICAgICAgIDw8IHNCb2R5IDw8ICJFVFxuIgotICAgICAgICAgICAgICAgICAgIDw8ICJRXG5FTUNcbiI7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIDE6IHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHN3VmFsdWUgPQotICAgICAgICAgIEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJWIikKLSAgICAgICAgICAgICAgPyBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiViIpLT5HZXRVbmljb2RlVGV4dCgpCi0gICAgICAgICAgICAgIDogQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgICAgIENQVlRfRm9udE1hcCBtYXAoCi0gICAgICAgICAgcERvYywgcFN0cmVhbURpY3QgPyBwU3RyZWFtRGljdC0+R2V0RGljdEZvcigiUmVzb3VyY2VzIikgOiBudWxscHRyLAotICAgICAgICAgIHBEZWZGb250LCBzRm9udE5hbWUuUmlnaHQoc0ZvbnROYW1lLkdldExlbmd0aCgpIC0gMSkpOwotICAgICAgQ1BERl9WYXJpYWJsZVRleHQ6OlByb3ZpZGVyIHByZCgmbWFwKTsKLSAgICAgIENQREZfVmFyaWFibGVUZXh0IHZ0OwotICAgICAgdnQuU2V0UHJvdmlkZXIoJnByZCk7Ci0gICAgICBDRlhfRmxvYXRSZWN0IHJjQnV0dG9uID0gcmNCb2R5OwotICAgICAgcmNCdXR0b24ubGVmdCA9IHJjQnV0dG9uLnJpZ2h0IC0gMTM7Ci0gICAgICByY0J1dHRvbi5Ob3JtYWxpemUoKTsKLSAgICAgIENGWF9GbG9hdFJlY3QgcmNFZGl0ID0gcmNCb2R5OwotICAgICAgcmNFZGl0LnJpZ2h0ID0gcmNCdXR0b24ubGVmdDsKLSAgICAgIHJjRWRpdC5Ob3JtYWxpemUoKTsKLSAgICAgIHZ0LlNldFBsYXRlUmVjdChyY0VkaXQpOwotICAgICAgaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpCi0gICAgICAgIHZ0LlNldEF1dG9Gb250U2l6ZSh0cnVlKTsKLSAgICAgIGVsc2UKLSAgICAgICAgdnQuU2V0Rm9udFNpemUoZkZvbnRTaXplKTsKLQotICAgICAgdnQuSW5pdGlhbGl6ZSgpOwotICAgICAgdnQuU2V0VGV4dChzd1ZhbHVlKTsKLSAgICAgIHZ0LlJlYXJyYW5nZUFsbCgpOwotICAgICAgQ0ZYX0Zsb2F0UmVjdCByY0NvbnRlbnQgPSB2dC5HZXRDb250ZW50UmVjdCgpOwotICAgICAgQ0ZYX1BvaW50RiBwdE9mZnNldCA9Ci0gICAgICAgICAgQ0ZYX1BvaW50RigwLjBmLCAocmNDb250ZW50LkhlaWdodCgpIC0gcmNFZGl0LkhlaWdodCgpKSAvIDIuMGYpOwotICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0VkaXQgPSBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlRWRpdEFQKAotICAgICAgICAgICZtYXAsIHZ0LkdldEl0ZXJhdG9yKCksIHB0T2Zmc2V0LCB0cnVlLCAwKTsKLSAgICAgIGlmIChzRWRpdC5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgc0FwcFN0cmVhbSA8PCAiL1R4IEJNQ1xuIgotICAgICAgICAgICAgICAgICAgIDw8ICJxXG4iOwotICAgICAgICBzQXBwU3RyZWFtIDw8IHJjRWRpdC5sZWZ0IDw8ICIgIiA8PCByY0VkaXQuYm90dG9tIDw8ICIgIgotICAgICAgICAgICAgICAgICAgIDw8IHJjRWRpdC5XaWR0aCgpIDw8ICIgIiA8PCByY0VkaXQuSGVpZ2h0KCkgPDwgIiByZVxuV1xublxuIjsKLSAgICAgICAgc0FwcFN0cmVhbSA8PCAiQlRcbiIKLSAgICAgICAgICAgICAgICAgICA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChjclRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnRPcGVyYXRpb246OkZJTEwpCi0gICAgICAgICAgICAgICAgICAgPDwgc0VkaXQgPDwgIkVUXG4iCi0gICAgICAgICAgICAgICAgICAgPDwgIlFcbkVNQ1xuIjsKLSAgICAgIH0KLSAgICAgIENGWF9CeXRlU3RyaW5nIHNCdXR0b24gPSBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUCgKLSAgICAgICAgICBDUFZUX0NvbG9yKENQVlRfQ29sb3I6OmtSR0IsIDIyMC4wZiAvIDI1NS4wZiwgMjIwLjBmIC8gMjU1LjBmLAotICAgICAgICAgICAgICAgICAgICAgMjIwLjBmIC8gMjU1LjBmKSwKLSAgICAgICAgICBQYWludE9wZXJhdGlvbjo6RklMTCk7Ci0gICAgICBpZiAoc0J1dHRvbi5HZXRMZW5ndGgoKSA+IDAgJiYgIXJjQnV0dG9uLklzRW1wdHkoKSkgewotICAgICAgICBzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IHNCdXR0b247Ci0gICAgICAgIHNBcHBTdHJlYW0gPDwgcmNCdXR0b24ubGVmdCA8PCAiICIgPDwgcmNCdXR0b24uYm90dG9tIDw8ICIgIgotICAgICAgICAgICAgICAgICAgIDw8IHJjQnV0dG9uLldpZHRoKCkgPDwgIiAiIDw8IHJjQnV0dG9uLkhlaWdodCgpIDw8ICIgcmUgZlxuIjsKLSAgICAgICAgc0FwcFN0cmVhbSA8PCAiUVxuIjsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0J1dHRvbkJvcmRlciA9IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVCb3JkZXJBUCgKLSAgICAgICAgICAgIHJjQnV0dG9uLCAyLCBDUFZUX0NvbG9yKENQVlRfQ29sb3I6OmtHcmF5LCAwKSwKLSAgICAgICAgICAgIENQVlRfQ29sb3IoQ1BWVF9Db2xvcjo6a0dyYXksIDEpLAotICAgICAgICAgICAgQ1BWVF9Db2xvcihDUFZUX0NvbG9yOjprR3JheSwgMC41KSwgQm9yZGVyU3R5bGU6OkJFVkVMRUQsCi0gICAgICAgICAgICBDUFZUX0Rhc2goMywgMCwgMCkpOwotICAgICAgICBpZiAoc0J1dHRvbkJvcmRlci5HZXRMZW5ndGgoKSA+IDApCi0gICAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQnV0dG9uQm9yZGVyIDw8ICJRXG4iOwotCi0gICAgICAgIENGWF9Qb2ludEYgcHRDZW50ZXIgPSBDRlhfUG9pbnRGKChyY0J1dHRvbi5sZWZ0ICsgcmNCdXR0b24ucmlnaHQpIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJjQnV0dG9uLnRvcCArIHJjQnV0dG9uLmJvdHRvbSkgLyAyKTsKLSAgICAgICAgaWYgKElzRmxvYXRCaWdnZXIocmNCdXR0b24uV2lkdGgoKSwgNikgJiYKLSAgICAgICAgICAgIElzRmxvYXRCaWdnZXIocmNCdXR0b24uSGVpZ2h0KCksIDYpKSB7Ci0gICAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIgotICAgICAgICAgICAgICAgICAgICAgPDwgIiAwIGdcbiI7Ci0gICAgICAgICAgc0FwcFN0cmVhbSA8PCBwdENlbnRlci54IC0gMyA8PCAiICIgPDwgcHRDZW50ZXIueSArIDEuNWYgPDwgIiBtXG4iOwotICAgICAgICAgIHNBcHBTdHJlYW0gPDwgcHRDZW50ZXIueCArIDMgPDwgIiAiIDw8IHB0Q2VudGVyLnkgKyAxLjVmIDw8ICIgbFxuIjsKLSAgICAgICAgICBzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggPDwgIiAiIDw8IHB0Q2VudGVyLnkgLSAxLjVmIDw8ICIgbFxuIjsKLSAgICAgICAgICBzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggLSAzIDw8ICIgIiA8PCBwdENlbnRlci55ICsgMS41ZiA8PCAiIGwgZlxuIjsKLSAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNCdXR0b24gPDwgIlFcbiI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGJyZWFrOwotICAgIGNhc2UgMjogewotICAgICAgQ1BWVF9Gb250TWFwIG1hcCgKLSAgICAgICAgICBwRG9jLCBwU3RyZWFtRGljdCA/IHBTdHJlYW1EaWN0LT5HZXREaWN0Rm9yKCJSZXNvdXJjZXMiKSA6IG51bGxwdHIsCi0gICAgICAgICAgcERlZkZvbnQsIHNGb250TmFtZS5SaWdodChzRm9udE5hbWUuR2V0TGVuZ3RoKCkgLSAxKSk7Ci0gICAgICBDUERGX1ZhcmlhYmxlVGV4dDo6UHJvdmlkZXIgcHJkKCZtYXApOwotICAgICAgQ1BERl9BcnJheSogcE9wdHMgPSBUb0FycmF5KEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJPcHQiKSk7Ci0gICAgICBDUERGX0FycmF5KiBwU2VscyA9IFRvQXJyYXkoRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkkiKSk7Ci0gICAgICBDUERGX09iamVjdCogcFRpID0gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIlRJIik7Ci0gICAgICBpbnQzMl90IG5Ub3AgPSBwVGkgPyBwVGktPkdldEludGVnZXIoKSA6IDA7Ci0gICAgICBDRlhfQnl0ZVRleHRCdWYgc0JvZHk7Ci0gICAgICBpZiAocE9wdHMpIHsKLSAgICAgICAgRlhfRkxPQVQgZnkgPSByY0JvZHkudG9wOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gblRvcCwgc3ogPSBwT3B0cy0+R2V0Q291bnQoKTsgaSA8IHN6OyBpKyspIHsKLSAgICAgICAgICBpZiAoSXNGbG9hdFNtYWxsZXIoZnksIHJjQm9keS5ib3R0b20pKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBpZiAoQ1BERl9PYmplY3QqIHBPcHQgPSBwT3B0cy0+R2V0RGlyZWN0T2JqZWN0QXQoaSkpIHsKLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHN3SXRlbTsKLSAgICAgICAgICAgIGlmIChwT3B0LT5Jc1N0cmluZygpKQotICAgICAgICAgICAgICBzd0l0ZW0gPSBwT3B0LT5HZXRVbmljb2RlVGV4dCgpOwotICAgICAgICAgICAgZWxzZSBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcE9wdC0+QXNBcnJheSgpKQotICAgICAgICAgICAgICBzd0l0ZW0gPSBwQXJyYXktPkdldERpcmVjdE9iamVjdEF0KDEpLT5HZXRVbmljb2RlVGV4dCgpOwotCi0gICAgICAgICAgICBib29sIGJTZWxlY3RlZCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKHBTZWxzKSB7Ci0gICAgICAgICAgICAgIGZvciAoc2l6ZV90IHMgPSAwLCBzc3ogPSBwU2Vscy0+R2V0Q291bnQoKTsgcyA8IHNzejsgcysrKSB7Ci0gICAgICAgICAgICAgICAgaW50IHZhbHVlID0gcFNlbHMtPkdldEludGVnZXJBdChzKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPj0gMCAmJiBpID09IHN0YXRpY19jYXN0PHNpemVfdD4odmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICBiU2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDUERGX1ZhcmlhYmxlVGV4dCB2dDsKLSAgICAgICAgICAgIHZ0LlNldFByb3ZpZGVyKCZwcmQpOwotICAgICAgICAgICAgdnQuU2V0UGxhdGVSZWN0KAotICAgICAgICAgICAgICAgIENGWF9GbG9hdFJlY3QocmNCb2R5LmxlZnQsIDAuMGYsIHJjQm9keS5yaWdodCwgMC4wZikpOwotICAgICAgICAgICAgdnQuU2V0Rm9udFNpemUoSXNGbG9hdFplcm8oZkZvbnRTaXplKSA/IDEyLjBmIDogZkZvbnRTaXplKTsKLQotICAgICAgICAgICAgdnQuSW5pdGlhbGl6ZSgpOwotICAgICAgICAgICAgdnQuU2V0VGV4dChzd0l0ZW0pOwotICAgICAgICAgICAgdnQuUmVhcnJhbmdlQWxsKCk7Ci0gICAgICAgICAgICBGWF9GTE9BVCBmSXRlbUhlaWdodCA9IHZ0LkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7Ci0gICAgICAgICAgICBpZiAoYlNlbGVjdGVkKSB7Ci0gICAgICAgICAgICAgIENGWF9GbG9hdFJlY3QgcmNJdGVtID0gQ0ZYX0Zsb2F0UmVjdCgKLSAgICAgICAgICAgICAgICAgIHJjQm9keS5sZWZ0LCBmeSAtIGZJdGVtSGVpZ2h0LCByY0JvZHkucmlnaHQsIGZ5KTsKLSAgICAgICAgICAgICAgc0JvZHkgPDwgInFcbiIKLSAgICAgICAgICAgICAgICAgICAgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDUFZUX0NvbG9yKENQVlRfQ29sb3I6OmtSR0IsIDAsIDUxLjBmIC8gMjU1LjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTMuMGYgLyAyNTUuMGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnRPcGVyYXRpb246OkZJTEwpCi0gICAgICAgICAgICAgICAgICAgIDw8IHJjSXRlbS5sZWZ0IDw8ICIgIiA8PCByY0l0ZW0uYm90dG9tIDw8ICIgIgotICAgICAgICAgICAgICAgICAgICA8PCByY0l0ZW0uV2lkdGgoKSA8PCAiICIgPDwgcmNJdGVtLkhlaWdodCgpIDw8ICIgcmUgZlxuIgotICAgICAgICAgICAgICAgICAgICA8PCAiUVxuIjsKLSAgICAgICAgICAgICAgc0JvZHkgPDwgIkJUXG4iCi0gICAgICAgICAgICAgICAgICAgIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BWVF9Db2xvcihDUFZUX0NvbG9yOjprR3JheSwgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludE9wZXJhdGlvbjo6RklMTCkKLSAgICAgICAgICAgICAgICAgICAgPDwgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUVkaXRBUCgmbWFwLCB2dC5HZXRJdGVyYXRvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYoMC4wZiwgZnkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIDApCi0gICAgICAgICAgICAgICAgICAgIDw8ICJFVFxuIjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHNCb2R5IDw8ICJCVFxuIgotICAgICAgICAgICAgICAgICAgICA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChjclRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50T3BlcmF0aW9uOjpGSUxMKQotICAgICAgICAgICAgICAgICAgICA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlRWRpdEFQKCZtYXAsIHZ0LkdldEl0ZXJhdG9yKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RigwLjBmLCBmeSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgMCkKLSAgICAgICAgICAgICAgICAgICAgPDwgIkVUXG4iOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnkgLT0gZkl0ZW1IZWlnaHQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoc0JvZHkuR2V0U2l6ZSgpID4gMCkgewotICAgICAgICBzQXBwU3RyZWFtIDw8ICIvVHggQk1DXG5xXG4iCi0gICAgICAgICAgICAgICAgICAgPDwgcmNCb2R5LmxlZnQgPDwgIiAiIDw8IHJjQm9keS5ib3R0b20gPDwgIiAiCi0gICAgICAgICAgICAgICAgICAgPDwgcmNCb2R5LldpZHRoKCkgPDwgIiAiIDw8IHJjQm9keS5IZWlnaHQoKSA8PCAiIHJlXG5XXG5uXG4iCi0gICAgICAgICAgICAgICAgICAgPDwgc0JvZHkuQXNTdHJpbmdDKCkgPDwgIlFcbkVNQ1xuIjsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotICB9Ci0gIGlmIChwTm9ybWFsU3RyZWFtKSB7Ci0gICAgcE5vcm1hbFN0cmVhbS0+U2V0RGF0YShzQXBwU3RyZWFtLkdldEJ1ZmZlcigpLCBzQXBwU3RyZWFtLkdldFNpemUoKSk7Ci0gICAgcFN0cmVhbURpY3QgPSBwTm9ybWFsU3RyZWFtLT5HZXREaWN0KCk7Ci0gICAgaWYgKHBTdHJlYW1EaWN0KSB7Ci0gICAgICBwU3RyZWFtRGljdC0+U2V0TWF0cml4Rm9yKCJNYXRyaXgiLCBtYXRyaXgpOwotICAgICAgcFN0cmVhbURpY3QtPlNldFJlY3RGb3IoIkJCb3giLCByY0JCb3gpOwotICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3RyZWFtUmVzTGlzdCA9IHBTdHJlYW1EaWN0LT5HZXREaWN0Rm9yKCJSZXNvdXJjZXMiKTsKLSAgICAgIGlmIChwU3RyZWFtUmVzTGlzdCkgewotICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1SZXNGb250TGlzdCA9Ci0gICAgICAgICAgICBwU3RyZWFtUmVzTGlzdC0+R2V0RGljdEZvcigiRm9udCIpOwotICAgICAgICBpZiAoIXBTdHJlYW1SZXNGb250TGlzdCkgewotICAgICAgICAgIHBTdHJlYW1SZXNGb250TGlzdCA9Ci0gICAgICAgICAgICAgIHBTdHJlYW1SZXNMaXN0LT5TZXROZXdGb3I8Q1BERl9EaWN0aW9uYXJ5PigiRm9udCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcFN0cmVhbVJlc0ZvbnRMaXN0LT5LZXlFeGlzdChzRm9udE5hbWUpKSB7Ci0gICAgICAgICAgcFN0cmVhbVJlc0ZvbnRMaXN0LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KHNGb250TmFtZSwgcERvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvbnREaWN0LT5HZXRPYmpOdW0oKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBTdHJlYW1EaWN0LT5TZXRGb3IoIlJlc291cmNlcyIsIHBGb3JtRGljdC0+R2V0RGljdEZvcigiRFIiKS0+Q2xvbmUoKSk7Ci0gICAgICAgIHBTdHJlYW1SZXNMaXN0ID0gcFN0cmVhbURpY3QtPkdldERpY3RGb3IoIlJlc291cmNlcyIpOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIEJ5dGVTdHJpbmcoc1JldCk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIEdldENvbG9yU3RyaW5nV2l0aERlZmF1bHQoQ1BERl9BcnJheSogcENvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX0NvbG9yJiBjckRlZmF1bHRDb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnRPcGVyYXRpb24gbk9wZXJhdGlvbikgewotICBpZiAocENvbG9yKSB7Ci0gICAgQ1BWVF9Db2xvciBjb2xvciA9IENQVlRfQ29sb3I6OlBhcnNlQ29sb3IoKnBDb2xvcik7Ci0gICAgcmV0dXJuIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKGNvbG9yLCBuT3BlcmF0aW9uKTsKLSAgfQotCi0gIHJldHVybiBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUChjckRlZmF1bHRDb2xvciwgbk9wZXJhdGlvbik7Ci19Ci0KLUZYX0ZMT0FUIEdldEJvcmRlcldpZHRoKGNvbnN0IENQREZfRGljdGlvbmFyeSYgcEFubm90RGljdCkgewotICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwQm9yZGVyU3R5bGVEaWN0ID0gcEFubm90RGljdC5HZXREaWN0Rm9yKCJCUyIpKSB7Ci0gICAgaWYgKHBCb3JkZXJTdHlsZURpY3QtPktleUV4aXN0KCJXIikpCi0gICAgICByZXR1cm4gcEJvcmRlclN0eWxlRGljdC0+R2V0TnVtYmVyRm9yKCJXIik7Ci0gIH0KLQotICBpZiAoQ1BERl9BcnJheSogcEJvcmRlckFycmF5ID0gcEFubm90RGljdC5HZXRBcnJheUZvcigiQm9yZGVyIikpIHsKLSAgICBpZiAocEJvcmRlckFycmF5LT5HZXRDb3VudCgpID4gMikKLSAgICAgIHJldHVybiBwQm9yZGVyQXJyYXktPkdldE51bWJlckF0KDIpOwotICB9Ci0KLSAgcmV0dXJuIDE7Ci19Ci0KLUNQREZfQXJyYXkqIEdldERhc2hBcnJheShjb25zdCBDUERGX0RpY3Rpb25hcnkmIHBBbm5vdERpY3QpIHsKLSAgaWYgKENQREZfRGljdGlvbmFyeSogcEJvcmRlclN0eWxlRGljdCA9IHBBbm5vdERpY3QuR2V0RGljdEZvcigiQlMiKSkgewotICAgIGlmIChwQm9yZGVyU3R5bGVEaWN0LT5HZXRTdHJpbmdGb3IoIlMiKSA9PSAiRCIpCi0gICAgICByZXR1cm4gcEJvcmRlclN0eWxlRGljdC0+R2V0QXJyYXlGb3IoIkQiKTsKLSAgfQotCi0gIGlmIChDUERGX0FycmF5KiBwQm9yZGVyQXJyYXkgPSBwQW5ub3REaWN0LkdldEFycmF5Rm9yKCJCb3JkZXIiKSkgewotICAgIGlmIChwQm9yZGVyQXJyYXktPkdldENvdW50KCkgPT0gNCkKLSAgICAgIHJldHVybiBwQm9yZGVyQXJyYXktPkdldEFycmF5QXQoMyk7Ci0gIH0KLQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgR2V0RGFzaFBhdHRlcm5TdHJpbmcoY29uc3QgQ1BERl9EaWN0aW9uYXJ5JiBwQW5ub3REaWN0KSB7Ci0gIENQREZfQXJyYXkqIHBEYXNoQXJyYXkgPSBHZXREYXNoQXJyYXkocEFubm90RGljdCk7Ci0gIGlmICghcERhc2hBcnJheSB8fCBwRGFzaEFycmF5LT5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0KLSAgLy8gU3VwcG9ydCBtYXhpbXVtIG9mIHRlbiBlbGVtZW50cyBpbiB0aGUgZGFzaCBhcnJheS4KLSAgc2l6ZV90IHBEYXNoQXJyYXlDb3VudCA9IHN0ZDo6bWluPHNpemVfdD4ocERhc2hBcnJheS0+R2V0Q291bnQoKSwgMTApOwotICBDRlhfQnl0ZVRleHRCdWYgc0Rhc2hTdHJlYW07Ci0KLSAgc0Rhc2hTdHJlYW0gPDwgIlsiOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBEYXNoQXJyYXlDb3VudDsgKytpKQotICAgIHNEYXNoU3RyZWFtIDw8IHBEYXNoQXJyYXktPkdldE51bWJlckF0KGkpIDw8ICIgIjsKLSAgc0Rhc2hTdHJlYW0gPDwgIl0gMCBkXG4iOwotCi0gIHJldHVybiBzRGFzaFN0cmVhbS5NYWtlU3RyaW5nKCk7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIEdldFBvcHVwQ29udGVudHNTdHJpbmcoQ1BERl9Eb2N1bWVudCogcERvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5JiBwQW5ub3REaWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBEZWZGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lKSB7Ci0gIENGWF9XaWRlU3RyaW5nIHN3VmFsdWUocEFubm90RGljdC5HZXRVbmljb2RlVGV4dEZvcigiVCIpKTsKLSAgc3dWYWx1ZSArPSBMJ1xuJzsKLSAgc3dWYWx1ZSArPSBwQW5ub3REaWN0LkdldFVuaWNvZGVUZXh0Rm9yKCJDb250ZW50cyIpOwotICBDUFZUX0ZvbnRNYXAgbWFwKHBEb2MsIG51bGxwdHIsIHBEZWZGb250LCBzRm9udE5hbWUpOwotCi0gIENQREZfVmFyaWFibGVUZXh0OjpQcm92aWRlciBwcmQoJm1hcCk7Ci0gIENQREZfVmFyaWFibGVUZXh0IHZ0OwotICB2dC5TZXRQcm92aWRlcigmcHJkKTsKLSAgdnQuU2V0UGxhdGVSZWN0KHBBbm5vdERpY3QuR2V0UmVjdEZvcigiUmVjdCIpKTsKLSAgdnQuU2V0Rm9udFNpemUoMTIpOwotICB2dC5TZXRBdXRvUmV0dXJuKHRydWUpOwotICB2dC5TZXRNdWx0aUxpbmUodHJ1ZSk7Ci0KLSAgdnQuSW5pdGlhbGl6ZSgpOwotICB2dC5TZXRUZXh0KHN3VmFsdWUpOwotICB2dC5SZWFycmFuZ2VBbGwoKTsKLSAgQ0ZYX1BvaW50RiBwdE9mZnNldCgzLjBmLCAtMy4wZik7Ci0gIENGWF9CeXRlU3RyaW5nIHNDb250ZW50ID0gQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUVkaXRBUCgKLSAgICAgICZtYXAsIHZ0LkdldEl0ZXJhdG9yKCksIHB0T2Zmc2V0LCBmYWxzZSwgMCk7Ci0KLSAgaWYgKHNDb250ZW50LklzRW1wdHkoKSkKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKLQotICBDRlhfQnl0ZVRleHRCdWYgc0FwcFN0cmVhbTsKLSAgc0FwcFN0cmVhbSA8PCAiQlRcbiIKLSAgICAgICAgICAgICA8PCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQ29sb3JBUCgKLSAgICAgICAgICAgICAgICAgICAgQ1BWVF9Db2xvcihDUFZUX0NvbG9yOjprUkdCLCAwLCAwLCAwKSwgUGFpbnRPcGVyYXRpb246OkZJTEwpCi0gICAgICAgICAgICAgPDwgc0NvbnRlbnQgPDwgIkVUXG4iCi0gICAgICAgICAgICAgPDwgIlFcbiI7Ci0gIHJldHVybiBzQXBwU3RyZWFtLk1ha2VTdHJpbmcoKTsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeT4gR2VuZXJhdGVFeHRHU3RhdGVEaWN0KAotICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSYgcEFubm90RGljdCwKLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0V4dEdTRGljdE5hbWUsCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNCbGVuZE1vZGUpIHsKLSAgYXV0byBwR1NEaWN0ID0KLSAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KHBBbm5vdERpY3QuR2V0Qnl0ZVN0cmluZ1Bvb2woKSk7Ci0gIHBHU0RpY3QtPlNldE5ld0ZvcjxDUERGX1N0cmluZz4oIlR5cGUiLCAiRXh0R1N0YXRlIiwgZmFsc2UpOwotCi0gIEZYX0ZMT0FUIGZPcGFjaXR5ID0KLSAgICAgIHBBbm5vdERpY3QuS2V5RXhpc3QoIkNBIikgPyBwQW5ub3REaWN0LkdldE51bWJlckZvcigiQ0EiKSA6IDE7Ci0gIHBHU0RpY3QtPlNldE5ld0ZvcjxDUERGX051bWJlcj4oIkNBIiwgZk9wYWNpdHkpOwotICBwR1NEaWN0LT5TZXROZXdGb3I8Q1BERl9OdW1iZXI+KCJjYSIsIGZPcGFjaXR5KTsKLSAgcEdTRGljdC0+U2V0TmV3Rm9yPENQREZfQm9vbGVhbj4oIkFJUyIsIGZhbHNlKTsKLSAgcEdTRGljdC0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigiQk0iLCBzQmxlbmRNb2RlLCBmYWxzZSk7Ci0KLSAgYXV0byBwRXh0R1N0YXRlRGljdCA9Ci0gICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PihwQW5ub3REaWN0LkdldEJ5dGVTdHJpbmdQb29sKCkpOwotICBwRXh0R1N0YXRlRGljdC0+U2V0Rm9yKHNFeHRHU0RpY3ROYW1lLCBzdGQ6Om1vdmUocEdTRGljdCkpOwotICByZXR1cm4gcEV4dEdTdGF0ZURpY3Q7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxDUERGX0RpY3Rpb25hcnk+IEdlbmVyYXRlUmVzb3VyY2VGb250RGljdCgKLSAgICBDUERGX0RvY3VtZW50KiBwRG9jLAotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udERpY3ROYW1lKSB7Ci0gIENQREZfRGljdGlvbmFyeSogcEZvbnREaWN0ID0gcERvYy0+TmV3SW5kaXJlY3Q8Q1BERl9EaWN0aW9uYXJ5PigpOwotICBwRm9udERpY3QtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJUeXBlIiwgIkZvbnQiKTsKLSAgcEZvbnREaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiU3VidHlwZSIsICJUeXBlMSIpOwotICBwRm9udERpY3QtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJCYXNlRm9udCIsICJIZWx2ZXRpY2EiKTsKLSAgcEZvbnREaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiRW5jb2RpbmciLCAiV2luQW5zaUVuY29kaW5nIik7Ci0KLSAgYXV0byBwUmVzb3VyY2VGb250RGljdCA9Ci0gICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PihwRG9jLT5HZXRCeXRlU3RyaW5nUG9vbCgpKTsKLSAgcFJlc291cmNlRm9udERpY3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oc0ZvbnREaWN0TmFtZSwgcERvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvbnREaWN0LT5HZXRPYmpOdW0oKSk7Ci0gIHJldHVybiBwUmVzb3VyY2VGb250RGljdDsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeT4gR2VuZXJhdGVSZXNvdXJjZURpY3QoCi0gICAgQ1BERl9Eb2N1bWVudCogcERvYywKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5PiBwRXh0R1N0YXRlRGljdCwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5PiBwUmVzb3VyY2VGb250RGljdCkgewotICBhdXRvIHBSZXNvdXJjZURpY3QgPQotICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4ocERvYy0+R2V0Qnl0ZVN0cmluZ1Bvb2woKSk7Ci0gIGlmIChwRXh0R1N0YXRlRGljdCkKLSAgICBwUmVzb3VyY2VEaWN0LT5TZXRGb3IoIkV4dEdTdGF0ZSIsIHN0ZDo6bW92ZShwRXh0R1N0YXRlRGljdCkpOwotICBpZiAocFJlc291cmNlRm9udERpY3QpCi0gICAgcFJlc291cmNlRGljdC0+U2V0Rm9yKCJGb250Iiwgc3RkOjptb3ZlKHBSZXNvdXJjZUZvbnREaWN0KSk7Ci0gIHJldHVybiBwUmVzb3VyY2VEaWN0OwotfQotCi12b2lkIEdlbmVyYXRlQW5kU2V0QVBEaWN0KENQREZfRG9jdW1lbnQqIHBEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5PiBwUmVzb3VyY2VEaWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJc1RleHRNYXJrdXBBbm5vdGF0aW9uKSB7Ci0gIENQREZfU3RyZWFtKiBwTm9ybWFsU3RyZWFtID0gcERvYy0+TmV3SW5kaXJlY3Q8Q1BERl9TdHJlYW0+KCk7Ci0gIHBOb3JtYWxTdHJlYW0tPlNldERhdGEoc0FwcFN0cmVhbS5HZXRCdWZmZXIoKSwgc0FwcFN0cmVhbS5HZXRTaXplKCkpOwotCi0gIENQREZfRGljdGlvbmFyeSogcEFQRGljdCA9IHBBbm5vdERpY3QtPlNldE5ld0ZvcjxDUERGX0RpY3Rpb25hcnk+KCJBUCIpOwotICBwQVBEaWN0LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJOIiwgcERvYywgcE5vcm1hbFN0cmVhbS0+R2V0T2JqTnVtKCkpOwotCi0gIENQREZfRGljdGlvbmFyeSogcFN0cmVhbURpY3QgPSBwTm9ybWFsU3RyZWFtLT5HZXREaWN0KCk7Ci0gIHBTdHJlYW1EaWN0LT5TZXROZXdGb3I8Q1BERl9OdW1iZXI+KCJGb3JtVHlwZSIsIDEpOwotICBwU3RyZWFtRGljdC0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigiU3VidHlwZSIsICJGb3JtIiwgZmFsc2UpOwotICBwU3RyZWFtRGljdC0+U2V0TWF0cml4Rm9yKCJNYXRyaXgiLCBDRlhfTWF0cml4KCkpOwotCi0gIENGWF9GbG9hdFJlY3QgcmVjdCA9IGJJc1RleHRNYXJrdXBBbm5vdGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA/IENQREZfQW5ub3Q6OlJlY3RGcm9tUXVhZFBvaW50cyhwQW5ub3REaWN0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwQW5ub3REaWN0LT5HZXRSZWN0Rm9yKCJSZWN0Iik7Ci0gIHBTdHJlYW1EaWN0LT5TZXRSZWN0Rm9yKCJCQm94IiwgcmVjdCk7Ci0gIHBTdHJlYW1EaWN0LT5TZXRGb3IoIlJlc291cmNlcyIsIHN0ZDo6bW92ZShwUmVzb3VyY2VEaWN0KSk7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIEdldFBhaW50T3BlcmF0b3JTdHJpbmcoYm9vbCBiSXNTdHJva2VSZWN0LCBib29sIGJJc0ZpbGxSZWN0KSB7Ci0gIGlmIChiSXNTdHJva2VSZWN0KQotICAgIHJldHVybiBiSXNGaWxsUmVjdCA/ICJiIiA6ICJzIjsKLSAgcmV0dXJuIGJJc0ZpbGxSZWN0ID8gImYiIDogIm4iOwotfQotCi1DRlhfQnl0ZVN0cmluZyBHZW5lcmF0ZVRleHRTeW1ib2xBUChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KSB7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtOwotICBzQXBwU3RyZWFtIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKAotICAgICAgQ1BWVF9Db2xvcihDUFZUX0NvbG9yOjprUkdCLCAxLCAxLCAwKSwgUGFpbnRPcGVyYXRpb246OkZJTEwpOwotICBzQXBwU3RyZWFtIDw8IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb2xvckFQKAotICAgICAgQ1BWVF9Db2xvcihDUFZUX0NvbG9yOjprUkdCLCAwLCAwLCAwKSwgUGFpbnRPcGVyYXRpb246OlNUUk9LRSk7Ci0KLSAgY29uc3QgRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gMTsKLSAgc0FwcFN0cmVhbSA8PCBmQm9yZGVyV2lkdGggPDwgIiB3XG4iOwotCi0gIGNvbnN0IEZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmQm9yZGVyV2lkdGggLyAyOwotICBjb25zdCBGWF9GTE9BVCBmVGlwRGVsdGEgPSA0OwotCi0gIENGWF9GbG9hdFJlY3Qgb3V0ZXJSZWN0MSA9IHJlY3Q7Ci0gIG91dGVyUmVjdDEuRGVmbGF0ZShmSGFsZldpZHRoLCBmSGFsZldpZHRoKTsKLSAgb3V0ZXJSZWN0MS5ib3R0b20gKz0gZlRpcERlbHRhOwotCi0gIENGWF9GbG9hdFJlY3Qgb3V0ZXJSZWN0MiA9IG91dGVyUmVjdDE7Ci0gIG91dGVyUmVjdDIubGVmdCArPSBmVGlwRGVsdGE7Ci0gIG91dGVyUmVjdDIucmlnaHQgPSBvdXRlclJlY3QyLmxlZnQgKyBmVGlwRGVsdGE7Ci0gIG91dGVyUmVjdDIudG9wID0gb3V0ZXJSZWN0Mi5ib3R0b20gLSBmVGlwRGVsdGE7Ci0gIEZYX0ZMT0FUIG91dGVyUmVjdDJNaWRkbGUgPSAob3V0ZXJSZWN0Mi5sZWZ0ICsgb3V0ZXJSZWN0Mi5yaWdodCkgLyAyOwotCi0gIC8vIERyYXcgb3V0ZXIgYm94ZXMuCi0gIHNBcHBTdHJlYW0gPDwgb3V0ZXJSZWN0MS5sZWZ0IDw8ICIgIiA8PCBvdXRlclJlY3QxLmJvdHRvbSA8PCAiIG1cbiIKLSAgICAgICAgICAgICA8PCBvdXRlclJlY3QxLmxlZnQgPDwgIiAiIDw8IG91dGVyUmVjdDEudG9wIDw8ICIgbFxuIgotICAgICAgICAgICAgIDw8IG91dGVyUmVjdDEucmlnaHQgPDwgIiAiIDw8IG91dGVyUmVjdDEudG9wIDw8ICIgbFxuIgotICAgICAgICAgICAgIDw8IG91dGVyUmVjdDEucmlnaHQgPDwgIiAiIDw8IG91dGVyUmVjdDEuYm90dG9tIDw8ICIgbFxuIgotICAgICAgICAgICAgIDw8IG91dGVyUmVjdDIucmlnaHQgPDwgIiAiIDw8IG91dGVyUmVjdDIuYm90dG9tIDw8ICIgbFxuIgotICAgICAgICAgICAgIDw8IG91dGVyUmVjdDJNaWRkbGUgPDwgIiAiIDw8IG91dGVyUmVjdDIudG9wIDw8ICIgbFxuIgotICAgICAgICAgICAgIDw8IG91dGVyUmVjdDIubGVmdCA8PCAiICIgPDwgb3V0ZXJSZWN0Mi5ib3R0b20gPDwgIiBsXG4iCi0gICAgICAgICAgICAgPDwgb3V0ZXJSZWN0MS5sZWZ0IDw8ICIgIiA8PCBvdXRlclJlY3QxLmJvdHRvbSA8PCAiIGxcbiI7Ci0KLSAgLy8gRHJhdyBpbm5lciBsaW5lcy4KLSAgQ0ZYX0Zsb2F0UmVjdCBsaW5lUmVjdCA9IG91dGVyUmVjdDE7Ci0gIGNvbnN0IEZYX0ZMT0FUIGZYRGVsdGEgPSAyOwotICBjb25zdCBGWF9GTE9BVCBmWURlbHRhID0gKGxpbmVSZWN0LnRvcCAtIGxpbmVSZWN0LmJvdHRvbSkgLyA0OwotCi0gIGxpbmVSZWN0LmxlZnQgKz0gZlhEZWx0YTsKLSAgbGluZVJlY3QucmlnaHQgLT0gZlhEZWx0YTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKLSAgICBsaW5lUmVjdC50b3AgLT0gZllEZWx0YTsKLSAgICBzQXBwU3RyZWFtIDw8IGxpbmVSZWN0LmxlZnQgPDwgIiAiIDw8IGxpbmVSZWN0LnRvcCA8PCAiIG1cbiIKLSAgICAgICAgICAgICAgIDw8IGxpbmVSZWN0LnJpZ2h0IDw8ICIgIiA8PCBsaW5lUmVjdC50b3AgPDwgIiBsXG4iOwotICB9Ci0gIHNBcHBTdHJlYW0gPDwgIkIqXG4iOwotCi0gIHJldHVybiBzQXBwU3RyZWFtLk1ha2VTdHJpbmcoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLWJvb2wgRlBERl9HZW5lcmF0ZUFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkgewotICBpZiAoIXBBbm5vdERpY3QgfHwgcEFubm90RGljdC0+R2V0U3RyaW5nRm9yKCJTdWJ0eXBlIikgIT0gIldpZGdldCIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfT2JqZWN0KiBwRmllbGRUeXBlT2JqID0gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkZUIik7Ci0gIGlmICghcEZpZWxkVHlwZU9iaikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgZmllbGRfdHlwZSA9IHBGaWVsZFR5cGVPYmotPkdldFN0cmluZygpOwotICBpZiAoZmllbGRfdHlwZSA9PSAiVHgiKQotICAgIHJldHVybiBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlVGV4dEZpZWxkQVAocERvYywgcEFubm90RGljdCk7Ci0KLSAgQ1BERl9PYmplY3QqIHBGaWVsZEZsYWdzT2JqID0gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIkZmIik7Ci0gIHVpbnQzMl90IGZsYWdzID0gcEZpZWxkRmxhZ3NPYmogPyBwRmllbGRGbGFnc09iai0+R2V0SW50ZWdlcigpIDogMDsKLSAgaWYgKGZpZWxkX3R5cGUgPT0gIkNoIikgewotICAgIHJldHVybiAoZmxhZ3MgJiAoMSA8PCAxNykpCi0gICAgICAgICAgICAgICA/IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb21ib0JveEFQKHBEb2MsIHBBbm5vdERpY3QpCi0gICAgICAgICAgICAgICA6IENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVMaXN0Qm94QVAocERvYywgcEFubm90RGljdCk7Ci0gIH0KLQotICBpZiAoZmllbGRfdHlwZSA9PSAiQnRuIikgewotICAgIGlmICghKGZsYWdzICYgKDEgPDwgMTYpKSkgewotICAgICAgaWYgKCFwQW5ub3REaWN0LT5LZXlFeGlzdCgiQVMiKSkgewotICAgICAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50RGljdCA9IHBBbm5vdERpY3QtPkdldERpY3RGb3IoIlBhcmVudCIpKSB7Ci0gICAgICAgICAgaWYgKHBQYXJlbnREaWN0LT5LZXlFeGlzdCgiQVMiKSkgewotICAgICAgICAgICAgcEFubm90RGljdC0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigKLSAgICAgICAgICAgICAgICAiQVMiLCBwUGFyZW50RGljdC0+R2V0U3RyaW5nRm9yKCJBUyIpLCBmYWxzZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBTdGF0aWMuCi1ib29sIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDb21ib0JveEFQKENQREZfRG9jdW1lbnQqIHBEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkgewotICByZXR1cm4gR2VuZXJhdGVXaWRnZXRBUChwRG9jLCBwQW5ub3REaWN0LCAxKTsKLX0KLQotLy8gU3RhdGljLgotYm9vbCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlTGlzdEJveEFQKENQREZfRG9jdW1lbnQqIHBEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KSB7Ci0gIHJldHVybiBHZW5lcmF0ZVdpZGdldEFQKHBEb2MsIHBBbm5vdERpY3QsIDIpOwotfQotCi0vLyBTdGF0aWMuCi1ib29sIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVUZXh0RmllbGRBUChDUERGX0RvY3VtZW50KiBwRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KSB7Ci0gIHJldHVybiBHZW5lcmF0ZVdpZGdldEFQKHBEb2MsIHBBbm5vdERpY3QsIDApOwotfQotCi1ib29sIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVDaXJjbGVBUChDUERGX0RvY3VtZW50KiBwRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KSB7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtOwotICBDRlhfQnl0ZVN0cmluZyBzRXh0R1NEaWN0TmFtZSA9ICJHUyI7Ci0gIHNBcHBTdHJlYW0gPDwgIi8iIDw8IHNFeHRHU0RpY3ROYW1lIDw8ICIgZ3MgIjsKLQotICBDUERGX0FycmF5KiBwSW50ZXJpb3JDb2xvciA9IHBBbm5vdERpY3QtPkdldEFycmF5Rm9yKCJJQyIpOwotICBzQXBwU3RyZWFtIDw8IEdldENvbG9yU3RyaW5nV2l0aERlZmF1bHQocEludGVyaW9yQ29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFZUX0NvbG9yKENQVlRfQ29sb3I6OmtUcmFuc3BhcmVudCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludE9wZXJhdGlvbjo6RklMTCk7Ci0KLSAgc0FwcFN0cmVhbSA8PCBHZXRDb2xvclN0cmluZ1dpdGhEZWZhdWx0KHBBbm5vdERpY3QtPkdldEFycmF5Rm9yKCJDIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFZUX0NvbG9yKENQVlRfQ29sb3I6OmtSR0IsIDAsIDAsIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnRPcGVyYXRpb246OlNUUk9LRSk7Ci0KLSAgRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gR2V0Qm9yZGVyV2lkdGgoKnBBbm5vdERpY3QpOwotICBib29sIGJJc1N0cm9rZVJlY3QgPSBmQm9yZGVyV2lkdGggPiAwOwotCi0gIGlmIChiSXNTdHJva2VSZWN0KSB7Ci0gICAgc0FwcFN0cmVhbSA8PCBmQm9yZGVyV2lkdGggPDwgIiB3ICI7Ci0gICAgc0FwcFN0cmVhbSA8PCBHZXREYXNoUGF0dGVyblN0cmluZygqcEFubm90RGljdCk7Ci0gIH0KLQotICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBwQW5ub3REaWN0LT5HZXRSZWN0Rm9yKCJSZWN0Iik7Ci0gIHJlY3QuTm9ybWFsaXplKCk7Ci0KLSAgaWYgKGJJc1N0cm9rZVJlY3QpIHsKLSAgICAvLyBEZWZsYXRpbmcgcmVjdCBiZWNhdXNlIHN0cm9raW5nIGEgcGF0aCBlbnRhaWxzIHBhaW50aW5nIGFsbCBwb2ludHMgd2hvc2UKLSAgICAvLyBwZXJwZW5kaWN1bGFyIGRpc3RhbmNlIGZyb20gdGhlIHBhdGggaW4gdXNlciBzcGFjZSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwKLSAgICAvLyB0byBoYWxmIHRoZSBsaW5lIHdpZHRoLgotICAgIHJlY3QuRGVmbGF0ZShmQm9yZGVyV2lkdGggLyAyLCBmQm9yZGVyV2lkdGggLyAyKTsKLSAgfQotCi0gIGNvbnN0IEZYX0ZMT0FUIGZNaWRkbGVYID0gKHJlY3QubGVmdCArIHJlY3QucmlnaHQpIC8gMjsKLSAgY29uc3QgRlhfRkxPQVQgZk1pZGRsZVkgPSAocmVjdC50b3AgKyByZWN0LmJvdHRvbSkgLyAyOwotCi0gIC8vIHxmTHwgaXMgcHJlY2FsY3VsYXRlZCBhcHByb3hpbWF0ZSB2YWx1ZSBvZiA0ICogdGFuKCgzLjE0IC8gMikgLyA0KSAvIDMsCi0gIC8vIHdoZXJlIHxmTHwgKiByYWRpdXMgaXMgYSBnb29kIGFwcHJveGltYXRpb24gb2YgY29udHJvbCBwb2ludHMgZm9yCi0gIC8vIGFyYyB3aXRoIDkwIGRlZ3JlZXMuCi0gIGNvbnN0IEZYX0ZMT0FUIGZMID0gMC41NTIzZjsKLSAgY29uc3QgRlhfRkxPQVQgZkRlbHRhWCA9IGZMICogcmVjdC5XaWR0aCgpIC8gMi4wOwotICBjb25zdCBGWF9GTE9BVCBmRGVsdGFZID0gZkwgKiByZWN0LkhlaWdodCgpIC8gMi4wOwotCi0gIC8vIFN0YXJ0aW5nIHBvaW50Ci0gIHNBcHBTdHJlYW0gPDwgZk1pZGRsZVggPDwgIiAiIDw8IHJlY3QudG9wIDw8ICIgbVxuIjsKLSAgLy8gRmlyc3QgQmV6aWVyIEN1cnZlCi0gIHNBcHBTdHJlYW0gPDwgZk1pZGRsZVggKyBmRGVsdGFYIDw8ICIgIiA8PCByZWN0LnRvcCA8PCAiICIgPDwgcmVjdC5yaWdodAotICAgICAgICAgICAgIDw8ICIgIiA8PCBmTWlkZGxlWSArIGZEZWx0YVkgPDwgIiAiIDw8IHJlY3QucmlnaHQgPDwgIiAiCi0gICAgICAgICAgICAgPDwgZk1pZGRsZVkgPDwgIiBjXG4iOwotICAvLyBTZWNvbmQgQmV6aWVyIEN1cnZlCi0gIHNBcHBTdHJlYW0gPDwgcmVjdC5yaWdodCA8PCAiICIgPDwgZk1pZGRsZVkgLSBmRGVsdGFZIDw8ICIgIgotICAgICAgICAgICAgIDw8IGZNaWRkbGVYICsgZkRlbHRhWCA8PCAiICIgPDwgcmVjdC5ib3R0b20gPDwgIiAiIDw8IGZNaWRkbGVYCi0gICAgICAgICAgICAgPDwgIiAiIDw8IHJlY3QuYm90dG9tIDw8ICIgY1xuIjsKLSAgLy8gVGhpcmQgQmV6aWVyIEN1cnZlCi0gIHNBcHBTdHJlYW0gPDwgZk1pZGRsZVggLSBmRGVsdGFYIDw8ICIgIiA8PCByZWN0LmJvdHRvbSA8PCAiICIgPDwgcmVjdC5sZWZ0Ci0gICAgICAgICAgICAgPDwgIiAiIDw8IGZNaWRkbGVZIC0gZkRlbHRhWSA8PCAiICIgPDwgcmVjdC5sZWZ0IDw8ICIgIiA8PCBmTWlkZGxlWQotICAgICAgICAgICAgIDw8ICIgY1xuIjsKLSAgLy8gRm91cnRoIEJlemllciBDdXJ2ZQotICBzQXBwU3RyZWFtIDw8IHJlY3QubGVmdCA8PCAiICIgPDwgZk1pZGRsZVkgKyBmRGVsdGFZIDw8ICIgIgotICAgICAgICAgICAgIDw8IGZNaWRkbGVYIC0gZkRlbHRhWCA8PCAiICIgPDwgcmVjdC50b3AgPDwgIiAiIDw8IGZNaWRkbGVYIDw8ICIgIgotICAgICAgICAgICAgIDw8IHJlY3QudG9wIDw8ICIgY1xuIjsKLQotICBib29sIGJJc0ZpbGxSZWN0ID0gcEludGVyaW9yQ29sb3IgJiYgIXBJbnRlcmlvckNvbG9yLT5Jc0VtcHR5KCk7Ci0gIHNBcHBTdHJlYW0gPDwgR2V0UGFpbnRPcGVyYXRvclN0cmluZyhiSXNTdHJva2VSZWN0LCBiSXNGaWxsUmVjdCkgPDwgIlxuIjsKLQotICBhdXRvIHBFeHRHU3RhdGVEaWN0ID0KLSAgICAgIEdlbmVyYXRlRXh0R1N0YXRlRGljdCgqcEFubm90RGljdCwgc0V4dEdTRGljdE5hbWUsICJOb3JtYWwiKTsKLSAgYXV0byBwUmVzb3VyY2VEaWN0ID0KLSAgICAgIEdlbmVyYXRlUmVzb3VyY2VEaWN0KHBEb2MsIHN0ZDo6bW92ZShwRXh0R1N0YXRlRGljdCksIG51bGxwdHIpOwotICBHZW5lcmF0ZUFuZFNldEFQRGljdChwRG9jLCBwQW5ub3REaWN0LCBzQXBwU3RyZWFtLCBzdGQ6Om1vdmUocFJlc291cmNlRGljdCksCi0gICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qSXNUZXh0TWFya3VwQW5ub3RhdGlvbiovKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUhpZ2hsaWdodEFQKENQREZfRG9jdW1lbnQqIHBEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpIHsKLSAgQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07Ci0gIENGWF9CeXRlU3RyaW5nIHNFeHRHU0RpY3ROYW1lID0gIkdTIjsKLSAgc0FwcFN0cmVhbSA8PCAiLyIgPDwgc0V4dEdTRGljdE5hbWUgPDwgIiBncyAiOwotCi0gIHNBcHBTdHJlYW0gPDwgR2V0Q29sb3JTdHJpbmdXaXRoRGVmYXVsdChwQW5ub3REaWN0LT5HZXRBcnJheUZvcigiQyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BWVF9Db2xvcihDUFZUX0NvbG9yOjprUkdCLCAxLCAxLCAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50T3BlcmF0aW9uOjpGSUxMKTsKLQotICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBDUERGX0Fubm90OjpSZWN0RnJvbVF1YWRQb2ludHMocEFubm90RGljdCk7Ci0gIHJlY3QuTm9ybWFsaXplKCk7Ci0KLSAgc0FwcFN0cmVhbSA8PCByZWN0LmxlZnQgPDwgIiAiIDw8IHJlY3QudG9wIDw8ICIgbSAiIDw8IHJlY3QucmlnaHQgPDwgIiAiCi0gICAgICAgICAgICAgPDwgcmVjdC50b3AgPDwgIiBsICIgPDwgcmVjdC5yaWdodCA8PCAiICIgPDwgcmVjdC5ib3R0b20gPDwgIiBsICIKLSAgICAgICAgICAgICA8PCByZWN0LmxlZnQgPDwgIiAiIDw8IHJlY3QuYm90dG9tIDw8ICIgbCAiCi0gICAgICAgICAgICAgPDwgImggZlxuIjsKLQotICBhdXRvIHBFeHRHU3RhdGVEaWN0ID0KLSAgICAgIEdlbmVyYXRlRXh0R1N0YXRlRGljdCgqcEFubm90RGljdCwgc0V4dEdTRGljdE5hbWUsICJNdWx0aXBseSIpOwotICBhdXRvIHBSZXNvdXJjZURpY3QgPQotICAgICAgR2VuZXJhdGVSZXNvdXJjZURpY3QocERvYywgc3RkOjptb3ZlKHBFeHRHU3RhdGVEaWN0KSwgbnVsbHB0cik7Ci0gIEdlbmVyYXRlQW5kU2V0QVBEaWN0KHBEb2MsIHBBbm5vdERpY3QsIHNBcHBTdHJlYW0sIHN0ZDo6bW92ZShwUmVzb3VyY2VEaWN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKklzVGV4dE1hcmt1cEFubm90YXRpb24qLyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUlua0FQKENQREZfRG9jdW1lbnQqIHBEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpIHsKLSAgRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gR2V0Qm9yZGVyV2lkdGgoKnBBbm5vdERpY3QpOwotICBib29sIGJJc1N0cm9rZSA9IGZCb3JkZXJXaWR0aCA+IDA7Ci0KLSAgaWYgKCFiSXNTdHJva2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfQXJyYXkqIHBJbmtMaXN0ID0gcEFubm90RGljdC0+R2V0QXJyYXlGb3IoIklua0xpc3QiKTsKLSAgaWYgKCFwSW5rTGlzdCB8fCBwSW5rTGlzdC0+SXNFbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDRlhfQnl0ZVRleHRCdWYgc0FwcFN0cmVhbTsKLSAgQ0ZYX0J5dGVTdHJpbmcgc0V4dEdTRGljdE5hbWUgPSAiR1MiOwotICBzQXBwU3RyZWFtIDw8ICIvIiA8PCBzRXh0R1NEaWN0TmFtZSA8PCAiIGdzICI7Ci0KLSAgc0FwcFN0cmVhbSA8PCBHZXRDb2xvclN0cmluZ1dpdGhEZWZhdWx0KHBBbm5vdERpY3QtPkdldEFycmF5Rm9yKCJDIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFZUX0NvbG9yKENQVlRfQ29sb3I6OmtSR0IsIDAsIDAsIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnRPcGVyYXRpb246OlNUUk9LRSk7Ci0KLSAgc0FwcFN0cmVhbSA8PCBmQm9yZGVyV2lkdGggPDwgIiB3ICI7Ci0gIHNBcHBTdHJlYW0gPDwgR2V0RGFzaFBhdHRlcm5TdHJpbmcoKnBBbm5vdERpY3QpOwotCi0gIC8vIFNldCBpbmZsYXRlZCByZWN0IGFzIGEgbmV3IHJlY3QgYmVjYXVzZSBwYXRocyBuZWFyIHRoZSBib3JkZXIgd2l0aCBsYXJnZQotICAvLyB3aWR0aCBzaG91bGQgbm90IGJlIGNsaXBwZWQgdG8gdGhlIG9yaWdpbmFsIHJlY3QuCi0gIENGWF9GbG9hdFJlY3QgcmVjdCA9IHBBbm5vdERpY3QtPkdldFJlY3RGb3IoIlJlY3QiKTsKLSAgcmVjdC5JbmZsYXRlKGZCb3JkZXJXaWR0aCAvIDIsIGZCb3JkZXJXaWR0aCAvIDIpOwotICBwQW5ub3REaWN0LT5TZXRSZWN0Rm9yKCJSZWN0IiwgcmVjdCk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwSW5rTGlzdC0+R2V0Q291bnQoKTsgaSsrKSB7Ci0gICAgQ1BERl9BcnJheSogcElua0Nvb3JkTGlzdCA9IHBJbmtMaXN0LT5HZXRBcnJheUF0KGkpOwotICAgIGlmICghcElua0Nvb3JkTGlzdCB8fCBwSW5rQ29vcmRMaXN0LT5HZXRDb3VudCgpIDwgMikKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgc0FwcFN0cmVhbSA8PCBwSW5rQ29vcmRMaXN0LT5HZXROdW1iZXJBdCgwKSA8PCAiICIKLSAgICAgICAgICAgICAgIDw8IHBJbmtDb29yZExpc3QtPkdldE51bWJlckF0KDEpIDw8ICIgbSAiOwotCi0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwSW5rQ29vcmRMaXN0LT5HZXRDb3VudCgpIC0gMTsgaiArPSAyKSB7Ci0gICAgICBzQXBwU3RyZWFtIDw8IHBJbmtDb29yZExpc3QtPkdldE51bWJlckF0KGopIDw8ICIgIgotICAgICAgICAgICAgICAgICA8PCBwSW5rQ29vcmRMaXN0LT5HZXROdW1iZXJBdChqICsgMSkgPDwgIiBsICI7Ci0gICAgfQotCi0gICAgc0FwcFN0cmVhbSA8PCAiU1xuIjsKLSAgfQotCi0gIGF1dG8gcEV4dEdTdGF0ZURpY3QgPQotICAgICAgR2VuZXJhdGVFeHRHU3RhdGVEaWN0KCpwQW5ub3REaWN0LCBzRXh0R1NEaWN0TmFtZSwgIk5vcm1hbCIpOwotICBhdXRvIHBSZXNvdXJjZURpY3QgPQotICAgICAgR2VuZXJhdGVSZXNvdXJjZURpY3QocERvYywgc3RkOjptb3ZlKHBFeHRHU3RhdGVEaWN0KSwgbnVsbHB0cik7Ci0gIEdlbmVyYXRlQW5kU2V0QVBEaWN0KHBEb2MsIHBBbm5vdERpY3QsIHNBcHBTdHJlYW0sIHN0ZDo6bW92ZShwUmVzb3VyY2VEaWN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLypJc1RleHRNYXJrdXBBbm5vdGF0aW9uKi8pOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlVGV4dEFQKENQREZfRG9jdW1lbnQqIHBEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KSB7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtOwotICBDRlhfQnl0ZVN0cmluZyBzRXh0R1NEaWN0TmFtZSA9ICJHUyI7Ci0gIHNBcHBTdHJlYW0gPDwgIi8iIDw8IHNFeHRHU0RpY3ROYW1lIDw8ICIgZ3MgIjsKLQotICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBwQW5ub3REaWN0LT5HZXRSZWN0Rm9yKCJSZWN0Iik7Ci0gIGNvbnN0IEZYX0ZMT0FUIGZOb3RlTGVuZ3RoID0gMjA7Ci0gIENGWF9GbG9hdFJlY3Qgbm90ZVJlY3QocmVjdC5sZWZ0LCByZWN0LmJvdHRvbSwgcmVjdC5sZWZ0ICsgZk5vdGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5ib3R0b20gKyBmTm90ZUxlbmd0aCk7Ci0gIHBBbm5vdERpY3QtPlNldFJlY3RGb3IoIlJlY3QiLCBub3RlUmVjdCk7Ci0KLSAgc0FwcFN0cmVhbSA8PCBHZW5lcmF0ZVRleHRTeW1ib2xBUChub3RlUmVjdCk7Ci0KLSAgYXV0byBwRXh0R1N0YXRlRGljdCA9Ci0gICAgICBHZW5lcmF0ZUV4dEdTdGF0ZURpY3QoKnBBbm5vdERpY3QsIHNFeHRHU0RpY3ROYW1lLCAiTm9ybWFsIik7Ci0gIGF1dG8gcFJlc291cmNlRGljdCA9Ci0gICAgICBHZW5lcmF0ZVJlc291cmNlRGljdChwRG9jLCBzdGQ6Om1vdmUocEV4dEdTdGF0ZURpY3QpLCBudWxscHRyKTsKLSAgR2VuZXJhdGVBbmRTZXRBUERpY3QocERvYywgcEFubm90RGljdCwgc0FwcFN0cmVhbSwgc3RkOjptb3ZlKHBSZXNvdXJjZURpY3QpLAotICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKklzVGV4dE1hcmt1cEFubm90YXRpb24qLyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVVbmRlcmxpbmVBUChDUERGX0RvY3VtZW50KiBwRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KSB7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtOwotICBDRlhfQnl0ZVN0cmluZyBzRXh0R1NEaWN0TmFtZSA9ICJHUyI7Ci0gIHNBcHBTdHJlYW0gPDwgIi8iIDw8IHNFeHRHU0RpY3ROYW1lIDw8ICIgZ3MgIjsKLQotICBzQXBwU3RyZWFtIDw8IEdldENvbG9yU3RyaW5nV2l0aERlZmF1bHQocEFubm90RGljdC0+R2V0QXJyYXlGb3IoIkMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVlRfQ29sb3IoQ1BWVF9Db2xvcjo6a1JHQiwgMCwgMCwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludE9wZXJhdGlvbjo6U1RST0tFKTsKLQotICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBDUERGX0Fubm90OjpSZWN0RnJvbVF1YWRQb2ludHMocEFubm90RGljdCk7Ci0gIHJlY3QuTm9ybWFsaXplKCk7Ci0KLSAgRlhfRkxPQVQgZkxpbmVXaWR0aCA9IDEuMDsKLSAgc0FwcFN0cmVhbSA8PCBmTGluZVdpZHRoIDw8ICIgdyAiIDw8IHJlY3QubGVmdCA8PCAiICIKLSAgICAgICAgICAgICA8PCByZWN0LmJvdHRvbSArIGZMaW5lV2lkdGggPDwgIiBtICIgPDwgcmVjdC5yaWdodCA8PCAiICIKLSAgICAgICAgICAgICA8PCByZWN0LmJvdHRvbSArIGZMaW5lV2lkdGggPDwgIiBsIFNcbiI7Ci0KLSAgYXV0byBwRXh0R1N0YXRlRGljdCA9Ci0gICAgICBHZW5lcmF0ZUV4dEdTdGF0ZURpY3QoKnBBbm5vdERpY3QsIHNFeHRHU0RpY3ROYW1lLCAiTm9ybWFsIik7Ci0gIGF1dG8gcFJlc291cmNlRGljdCA9Ci0gICAgICBHZW5lcmF0ZVJlc291cmNlRGljdChwRG9jLCBzdGQ6Om1vdmUocEV4dEdTdGF0ZURpY3QpLCBudWxscHRyKTsKLSAgR2VuZXJhdGVBbmRTZXRBUERpY3QocERvYywgcEFubm90RGljdCwgc0FwcFN0cmVhbSwgc3RkOjptb3ZlKHBSZXNvdXJjZURpY3QpLAotICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qSXNUZXh0TWFya3VwQW5ub3RhdGlvbiovKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZVBvcHVwQVAoQ1BERl9Eb2N1bWVudCogcERvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KSB7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtOwotICBDRlhfQnl0ZVN0cmluZyBzRXh0R1NEaWN0TmFtZSA9ICJHUyI7Ci0gIHNBcHBTdHJlYW0gPDwgIi8iIDw8IHNFeHRHU0RpY3ROYW1lIDw8ICIgZ3NcbiI7Ci0KLSAgc0FwcFN0cmVhbSA8PCBHZW5lcmF0ZUNvbG9yQVAoQ1BWVF9Db2xvcihDUFZUX0NvbG9yOjprUkdCLCAxLCAxLCAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnRPcGVyYXRpb246OkZJTEwpOwotICBzQXBwU3RyZWFtIDw8IEdlbmVyYXRlQ29sb3JBUChDUFZUX0NvbG9yKENQVlRfQ29sb3I6OmtSR0IsIDAsIDAsIDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludE9wZXJhdGlvbjo6U1RST0tFKTsKLQotICBjb25zdCBGWF9GTE9BVCBmQm9yZGVyV2lkdGggPSAxOwotICBzQXBwU3RyZWFtIDw8IGZCb3JkZXJXaWR0aCA8PCAiIHdcbiI7Ci0KLSAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gcEFubm90RGljdC0+R2V0UmVjdEZvcigiUmVjdCIpOwotICByZWN0Lk5vcm1hbGl6ZSgpOwotICByZWN0LkRlZmxhdGUoZkJvcmRlcldpZHRoIC8gMiwgZkJvcmRlcldpZHRoIC8gMik7Ci0KLSAgc0FwcFN0cmVhbSA8PCByZWN0LmxlZnQgPDwgIiAiIDw8IHJlY3QuYm90dG9tIDw8ICIgIiA8PCByZWN0LldpZHRoKCkgPDwgIiAiCi0gICAgICAgICAgICAgPDwgcmVjdC5IZWlnaHQoKSA8PCAiIHJlIGJcbiI7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnROYW1lID0gIkZPTlQiOwotICBhdXRvIHBSZXNvdXJjZUZvbnREaWN0ID0gR2VuZXJhdGVSZXNvdXJjZUZvbnREaWN0KHBEb2MsIHNGb250TmFtZSk7Ci0gIENQREZfRm9udCogcERlZkZvbnQgPSBwRG9jLT5Mb2FkRm9udChwUmVzb3VyY2VGb250RGljdC5nZXQoKSk7Ci0gIGlmICghcERlZkZvbnQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGF1dG8gcEV4dEdTdGF0ZURpY3QgPQotICAgICAgR2VuZXJhdGVFeHRHU3RhdGVEaWN0KCpwQW5ub3REaWN0LCBzRXh0R1NEaWN0TmFtZSwgIk5vcm1hbCIpOwotICBhdXRvIHBSZXNvdXJjZURpY3QgPSBHZW5lcmF0ZVJlc291cmNlRGljdChwRG9jLCBzdGQ6Om1vdmUocFJlc291cmNlRm9udERpY3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocEV4dEdTdGF0ZURpY3QpKTsKLQotICBzQXBwU3RyZWFtIDw8IEdldFBvcHVwQ29udGVudHNTdHJpbmcocERvYywgKnBBbm5vdERpY3QsIHBEZWZGb250LCBzRm9udE5hbWUpOwotICBHZW5lcmF0ZUFuZFNldEFQRGljdChwRG9jLCBwQW5ub3REaWN0LCBzQXBwU3RyZWFtLCBzdGQ6Om1vdmUocFJlc291cmNlRGljdCksCi0gICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qSXNUZXh0TWFya3VwQW5ub3RhdGlvbiovKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZVNxdWFyZUFQKENQREZfRG9jdW1lbnQqIHBEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpIHsKLSAgQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07Ci0gIENGWF9CeXRlU3RyaW5nIHNFeHRHU0RpY3ROYW1lID0gIkdTIjsKLSAgc0FwcFN0cmVhbSA8PCAiLyIgPDwgc0V4dEdTRGljdE5hbWUgPDwgIiBncyAiOwotCi0gIENQREZfQXJyYXkqIHBJbnRlcmlvckNvbG9yID0gcEFubm90RGljdC0+R2V0QXJyYXlGb3IoIklDIik7Ci0gIHNBcHBTdHJlYW0gPDwgR2V0Q29sb3JTdHJpbmdXaXRoRGVmYXVsdChwSW50ZXJpb3JDb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVlRfQ29sb3IoQ1BWVF9Db2xvcjo6a1RyYW5zcGFyZW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50T3BlcmF0aW9uOjpGSUxMKTsKLQotICBzQXBwU3RyZWFtIDw8IEdldENvbG9yU3RyaW5nV2l0aERlZmF1bHQocEFubm90RGljdC0+R2V0QXJyYXlGb3IoIkMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVlRfQ29sb3IoQ1BWVF9Db2xvcjo6a1JHQiwgMCwgMCwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludE9wZXJhdGlvbjo6U1RST0tFKTsKLQotICBGWF9GTE9BVCBmQm9yZGVyV2lkdGggPSBHZXRCb3JkZXJXaWR0aCgqcEFubm90RGljdCk7Ci0gIGJvb2wgYklzU3Ryb2tlUmVjdCA9IGZCb3JkZXJXaWR0aCA+IDA7Ci0KLSAgaWYgKGJJc1N0cm9rZVJlY3QpIHsKLSAgICBzQXBwU3RyZWFtIDw8IGZCb3JkZXJXaWR0aCA8PCAiIHcgIjsKLSAgICBzQXBwU3RyZWFtIDw8IEdldERhc2hQYXR0ZXJuU3RyaW5nKCpwQW5ub3REaWN0KTsKLSAgfQotCi0gIENGWF9GbG9hdFJlY3QgcmVjdCA9IHBBbm5vdERpY3QtPkdldFJlY3RGb3IoIlJlY3QiKTsKLSAgcmVjdC5Ob3JtYWxpemUoKTsKLQotICBpZiAoYklzU3Ryb2tlUmVjdCkgewotICAgIC8vIERlZmxhdGluZyByZWN0IGJlY2F1c2Ugc3Ryb2tpbmcgYSBwYXRoIGVudGFpbHMgcGFpbnRpbmcgYWxsIHBvaW50cyB3aG9zZQotICAgIC8vIHBlcnBlbmRpY3VsYXIgZGlzdGFuY2UgZnJvbSB0aGUgcGF0aCBpbiB1c2VyIHNwYWNlIGlzIGxlc3MgdGhhbiBvciBlcXVhbAotICAgIC8vIHRvIGhhbGYgdGhlIGxpbmUgd2lkdGguCi0gICAgcmVjdC5EZWZsYXRlKGZCb3JkZXJXaWR0aCAvIDIsIGZCb3JkZXJXaWR0aCAvIDIpOwotICB9Ci0KLSAgYm9vbCBiSXNGaWxsUmVjdCA9IHBJbnRlcmlvckNvbG9yICYmIChwSW50ZXJpb3JDb2xvci0+R2V0Q291bnQoKSA+IDApOwotCi0gIHNBcHBTdHJlYW0gPDwgcmVjdC5sZWZ0IDw8ICIgIiA8PCByZWN0LmJvdHRvbSA8PCAiICIgPDwgcmVjdC5XaWR0aCgpIDw8ICIgIgotICAgICAgICAgICAgIDw8IHJlY3QuSGVpZ2h0KCkgPDwgIiByZSAiCi0gICAgICAgICAgICAgPDwgR2V0UGFpbnRPcGVyYXRvclN0cmluZyhiSXNTdHJva2VSZWN0LCBiSXNGaWxsUmVjdCkgPDwgIlxuIjsKLQotICBhdXRvIHBFeHRHU3RhdGVEaWN0ID0KLSAgICAgIEdlbmVyYXRlRXh0R1N0YXRlRGljdCgqcEFubm90RGljdCwgc0V4dEdTRGljdE5hbWUsICJOb3JtYWwiKTsKLSAgYXV0byBwUmVzb3VyY2VEaWN0ID0KLSAgICAgIEdlbmVyYXRlUmVzb3VyY2VEaWN0KHBEb2MsIHN0ZDo6bW92ZShwRXh0R1N0YXRlRGljdCksIG51bGxwdHIpOwotICBHZW5lcmF0ZUFuZFNldEFQRGljdChwRG9jLCBwQW5ub3REaWN0LCBzQXBwU3RyZWFtLCBzdGQ6Om1vdmUocFJlc291cmNlRGljdCksCi0gICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qSXNUZXh0TWFya3VwQW5ub3RhdGlvbiovKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZVNxdWlnZ2x5QVAoQ1BERl9Eb2N1bWVudCogcERvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KSB7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtOwotICBDRlhfQnl0ZVN0cmluZyBzRXh0R1NEaWN0TmFtZSA9ICJHUyI7Ci0gIHNBcHBTdHJlYW0gPDwgIi8iIDw8IHNFeHRHU0RpY3ROYW1lIDw8ICIgZ3MgIjsKLQotICBzQXBwU3RyZWFtIDw8IEdldENvbG9yU3RyaW5nV2l0aERlZmF1bHQocEFubm90RGljdC0+R2V0QXJyYXlGb3IoIkMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVlRfQ29sb3IoQ1BWVF9Db2xvcjo6a1JHQiwgMCwgMCwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludE9wZXJhdGlvbjo6U1RST0tFKTsKLQotICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBDUERGX0Fubm90OjpSZWN0RnJvbVF1YWRQb2ludHMocEFubm90RGljdCk7Ci0gIHJlY3QuTm9ybWFsaXplKCk7Ci0KLSAgRlhfRkxPQVQgZkxpbmVXaWR0aCA9IDEuMDsKLSAgc0FwcFN0cmVhbSA8PCBmTGluZVdpZHRoIDw8ICIgdyAiOwotCi0gIGNvbnN0IEZYX0ZMT0FUIGZEZWx0YSA9IDIuMDsKLSAgY29uc3QgRlhfRkxPQVQgZlRvcCA9IHJlY3QuYm90dG9tICsgZkRlbHRhOwotICBjb25zdCBGWF9GTE9BVCBmQm90dG9tID0gcmVjdC5ib3R0b207Ci0KLSAgc0FwcFN0cmVhbSA8PCByZWN0LmxlZnQgPDwgIiAiIDw8IGZUb3AgPDwgIiBtICI7Ci0KLSAgRlhfRkxPQVQgZlggPSByZWN0LmxlZnQgKyBmRGVsdGE7Ci0gIGJvb2wgaXNVcHdhcmRzID0gZmFsc2U7Ci0KLSAgd2hpbGUgKGZYIDwgcmVjdC5yaWdodCkgewotICAgIHNBcHBTdHJlYW0gPDwgZlggPDwgIiAiIDw8IChpc1Vwd2FyZHMgPyBmVG9wIDogZkJvdHRvbSkgPDwgIiBsICI7Ci0KLSAgICBmWCArPSBmRGVsdGE7Ci0gICAgaXNVcHdhcmRzID0gIWlzVXB3YXJkczsKLSAgfQotCi0gIEZYX0ZMT0FUIGZSZW1haW5kZXIgPSByZWN0LnJpZ2h0IC0gKGZYIC0gZkRlbHRhKTsKLSAgaWYgKGlzVXB3YXJkcykKLSAgICBzQXBwU3RyZWFtIDw8IHJlY3QucmlnaHQgPDwgIiAiIDw8IGZCb3R0b20gKyBmUmVtYWluZGVyIDw8ICIgbCAiOwotICBlbHNlCi0gICAgc0FwcFN0cmVhbSA8PCByZWN0LnJpZ2h0IDw8ICIgIiA8PCBmVG9wIC0gZlJlbWFpbmRlciA8PCAiIGwgIjsKLQotICBzQXBwU3RyZWFtIDw8ICJTXG4iOwotCi0gIGF1dG8gcEV4dEdTdGF0ZURpY3QgPQotICAgICAgR2VuZXJhdGVFeHRHU3RhdGVEaWN0KCpwQW5ub3REaWN0LCBzRXh0R1NEaWN0TmFtZSwgIk5vcm1hbCIpOwotICBhdXRvIHBSZXNvdXJjZURpY3QgPQotICAgICAgR2VuZXJhdGVSZXNvdXJjZURpY3QocERvYywgc3RkOjptb3ZlKHBFeHRHU3RhdGVEaWN0KSwgbnVsbHB0cik7Ci0gIEdlbmVyYXRlQW5kU2V0QVBEaWN0KHBEb2MsIHBBbm5vdERpY3QsIHNBcHBTdHJlYW0sIHN0ZDo6bW92ZShwUmVzb3VyY2VEaWN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKklzVGV4dE1hcmt1cEFubm90YXRpb24qLyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVTdHJpa2VPdXRBUChDUERGX0RvY3VtZW50KiBwRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KSB7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtOwotICBDRlhfQnl0ZVN0cmluZyBzRXh0R1NEaWN0TmFtZSA9ICJHUyI7Ci0gIHNBcHBTdHJlYW0gPDwgIi8iIDw8IHNFeHRHU0RpY3ROYW1lIDw8ICIgZ3MgIjsKLQotICBzQXBwU3RyZWFtIDw8IEdldENvbG9yU3RyaW5nV2l0aERlZmF1bHQocEFubm90RGljdC0+R2V0QXJyYXlGb3IoIkMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVlRfQ29sb3IoQ1BWVF9Db2xvcjo6a1JHQiwgMCwgMCwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludE9wZXJhdGlvbjo6U1RST0tFKTsKLQotICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBDUERGX0Fubm90OjpSZWN0RnJvbVF1YWRQb2ludHMocEFubm90RGljdCk7Ci0gIHJlY3QuTm9ybWFsaXplKCk7Ci0KLSAgRlhfRkxPQVQgZkxpbmVXaWR0aCA9IDEuMDsKLSAgRlhfRkxPQVQgZlkgPSAocmVjdC50b3AgKyByZWN0LmJvdHRvbSkgLyAyOwotICBzQXBwU3RyZWFtIDw8IGZMaW5lV2lkdGggPDwgIiB3ICIgPDwgcmVjdC5sZWZ0IDw8ICIgIiA8PCBmWSA8PCAiIG0gIgotICAgICAgICAgICAgIDw8IHJlY3QucmlnaHQgPDwgIiAiIDw8IGZZIDw8ICIgbCBTXG4iOwotCi0gIGF1dG8gcEV4dEdTdGF0ZURpY3QgPQotICAgICAgR2VuZXJhdGVFeHRHU3RhdGVEaWN0KCpwQW5ub3REaWN0LCBzRXh0R1NEaWN0TmFtZSwgIk5vcm1hbCIpOwotICBhdXRvIHBSZXNvdXJjZURpY3QgPQotICAgICAgR2VuZXJhdGVSZXNvdXJjZURpY3QocERvYywgc3RkOjptb3ZlKHBFeHRHU3RhdGVEaWN0KSwgbnVsbHB0cik7Ci0gIEdlbmVyYXRlQW5kU2V0QVBEaWN0KHBEb2MsIHBBbm5vdERpY3QsIHNBcHBTdHJlYW0sIHN0ZDo6bW92ZShwUmVzb3VyY2VEaWN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKklzVGV4dE1hcmt1cEFubm90YXRpb24qLyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBTdGF0aWMuCi1DRlhfQnl0ZVN0cmluZyBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlRWRpdEFQKAotICAgIElQVlRfRm9udE1hcCogcEZvbnRNYXAsCi0gICAgQ1BERl9WYXJpYWJsZVRleHQ6Okl0ZXJhdG9yKiBwSXRlcmF0b3IsCi0gICAgY29uc3QgQ0ZYX1BvaW50RiYgcHRPZmZzZXQsCi0gICAgYm9vbCBiQ29udGludW91cywKLSAgICB1aW50MTZfdCBTdWJXb3JkKSB7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBzRWRpdFN0cmVhbTsKLSAgQ0ZYX0J5dGVUZXh0QnVmIHNMaW5lU3RyZWFtOwotICBDRlhfQnl0ZVRleHRCdWYgc1dvcmRzOworQnl0ZVN0cmluZyBHZW5lcmF0ZUVkaXRBUChJUFZUX0ZvbnRNYXAqIHBGb250TWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1ZhcmlhYmxlVGV4dDo6SXRlcmF0b3IqIHBJdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNvbnRpbnVvdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFN1YldvcmQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNFZGl0U3RyZWFtOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc0xpbmVTdHJlYW07CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzV29yZHM7CiAgIENGWF9Qb2ludEYgcHRPbGQ7CiAgIENGWF9Qb2ludEYgcHROZXc7CiAgIGludDMyX3QgbkN1ckZvbnRJbmRleCA9IC0xOwpAQCAtMTExNCwxNCArOTksMTQgQEAKIAogICBwSXRlcmF0b3ItPlNldEF0KDApOwogICB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKSB7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldFdvcmRQbGFjZSgpOwogICAgIGlmIChiQ29udGludW91cykgewogICAgICAgaWYgKHBsYWNlLkxpbmVDbXAob2xkcGxhY2UpICE9IDApIHsKLSAgICAgICAgaWYgKHNXb3Jkcy5HZXRTaXplKCkgPiAwKSB7Ci0gICAgICAgICAgc0xpbmVTdHJlYW0gPDwgR2V0V29yZFJlbmRlclN0cmluZyhzV29yZHMuTWFrZVN0cmluZygpKTsKLSAgICAgICAgICBzRWRpdFN0cmVhbSA8PCBzTGluZVN0cmVhbTsKLSAgICAgICAgICBzTGluZVN0cmVhbS5DbGVhcigpOwotICAgICAgICAgIHNXb3Jkcy5DbGVhcigpOworICAgICAgICBpZiAoc1dvcmRzLnRlbGxwKCkgPiAwKSB7CisgICAgICAgICAgc0xpbmVTdHJlYW0gPDwgR2V0V29yZFJlbmRlclN0cmluZyhCeXRlU3RyaW5nKHNXb3JkcykpOworICAgICAgICAgIHNFZGl0U3RyZWFtIDw8IHNMaW5lU3RyZWFtLnN0cigpOworICAgICAgICAgIHNMaW5lU3RyZWFtLnN0cigiIik7CisgICAgICAgICAgc1dvcmRzLnN0cigiIik7CiAgICAgICAgIH0KICAgICAgICAgQ1BWVF9Xb3JkIHdvcmQ7CiAgICAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKQEAgLTExNDIsOSArMTI3LDkgQEAKICAgICAgIENQVlRfV29yZCB3b3JkOwogICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgewogICAgICAgICBpZiAod29yZC5uRm9udEluZGV4ICE9IG5DdXJGb250SW5kZXgpIHsKLSAgICAgICAgICBpZiAoc1dvcmRzLkdldFNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHNMaW5lU3RyZWFtIDw8IEdldFdvcmRSZW5kZXJTdHJpbmcoc1dvcmRzLk1ha2VTdHJpbmcoKSk7Ci0gICAgICAgICAgICBzV29yZHMuQ2xlYXIoKTsKKyAgICAgICAgICBpZiAoc1dvcmRzLnRlbGxwKCkgPiAwKSB7CisgICAgICAgICAgICBzTGluZVN0cmVhbSA8PCBHZXRXb3JkUmVuZGVyU3RyaW5nKEJ5dGVTdHJpbmcoc1dvcmRzKSk7CisgICAgICAgICAgICBzV29yZHMuc3RyKCIiKTsKICAgICAgICAgICB9CiAgICAgICAgICAgc0xpbmVTdHJlYW0gPDwgR2V0Rm9udFNldFN0cmluZyhwRm9udE1hcCwgd29yZC5uRm9udEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZC5mRm9udFNpemUpOwpAQCAtMTE3MywzMSArMTU4LDU1IEBACiAgICAgICB9CiAgICAgfQogICB9Ci0gIGlmIChzV29yZHMuR2V0U2l6ZSgpID4gMCkgewotICAgIHNMaW5lU3RyZWFtIDw8IEdldFdvcmRSZW5kZXJTdHJpbmcoc1dvcmRzLk1ha2VTdHJpbmcoKSk7Ci0gICAgc0VkaXRTdHJlYW0gPDwgc0xpbmVTdHJlYW07Ci0gICAgc1dvcmRzLkNsZWFyKCk7CisgIGlmIChzV29yZHMudGVsbHAoKSA+IDApIHsKKyAgICBzTGluZVN0cmVhbSA8PCBHZXRXb3JkUmVuZGVyU3RyaW5nKEJ5dGVTdHJpbmcoc1dvcmRzKSk7CisgICAgc0VkaXRTdHJlYW0gPDwgc0xpbmVTdHJlYW0uc3RyKCk7CisgICAgc1dvcmRzLnN0cigiIik7CiAgIH0KLSAgcmV0dXJuIHNFZGl0U3RyZWFtLk1ha2VTdHJpbmcoKTsKKyAgcmV0dXJuIEJ5dGVTdHJpbmcoc0VkaXRTdHJlYW0pOwogfQogCi0vLyBTdGF0aWMuCi1DRlhfQnl0ZVN0cmluZyBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlQm9yZGVyQVAoCi0gICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwKLSAgICBGWF9GTE9BVCBmV2lkdGgsCi0gICAgY29uc3QgQ1BWVF9Db2xvciYgY29sb3IsCi0gICAgY29uc3QgQ1BWVF9Db2xvciYgY3JMZWZ0VG9wLAotICAgIGNvbnN0IENQVlRfQ29sb3ImIGNyUmlnaHRCb3R0b20sCi0gICAgQm9yZGVyU3R5bGUgblN0eWxlLAotICAgIGNvbnN0IENQVlRfRGFzaCYgZGFzaCkgewotICBDRlhfQnl0ZVRleHRCdWYgc0FwcFN0cmVhbTsKLSAgQ0ZYX0J5dGVTdHJpbmcgc0NvbG9yOwotICBGWF9GTE9BVCBmTGVmdCA9IHJlY3QubGVmdDsKLSAgRlhfRkxPQVQgZlJpZ2h0ID0gcmVjdC5yaWdodDsKLSAgRlhfRkxPQVQgZlRvcCA9IHJlY3QudG9wOwotICBGWF9GTE9BVCBmQm90dG9tID0gcmVjdC5ib3R0b207CitCeXRlU3RyaW5nIEdlbmVyYXRlQ29sb3JBUChjb25zdCBDRlhfQ29sb3ImIGNvbG9yLCBQYWludE9wZXJhdGlvbiBuT3BlcmF0aW9uKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzQ29sb3JTdHJlYW07CisgIHN3aXRjaCAoY29sb3IubkNvbG9yVHlwZSkgeworICAgIGNhc2UgQ0ZYX0NvbG9yOjprUkdCOgorICAgICAgc0NvbG9yU3RyZWFtIDw8IGNvbG9yLmZDb2xvcjEgPDwgIiAiIDw8IGNvbG9yLmZDb2xvcjIgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgPDwgY29sb3IuZkNvbG9yMyA8PCAiICIKKyAgICAgICAgICAgICAgICAgICA8PCAobk9wZXJhdGlvbiA9PSBQYWludE9wZXJhdGlvbjo6U1RST0tFID8gIlJHIiA6ICJyZyIpCisgICAgICAgICAgICAgICAgICAgPDwgIlxuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0ZYX0NvbG9yOjprR3JheToKKyAgICAgIHNDb2xvclN0cmVhbSA8PCBjb2xvci5mQ29sb3IxIDw8ICIgIgorICAgICAgICAgICAgICAgICAgIDw8IChuT3BlcmF0aW9uID09IFBhaW50T3BlcmF0aW9uOjpTVFJPS0UgPyAiRyIgOiAiZyIpCisgICAgICAgICAgICAgICAgICAgPDwgIlxuIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0ZYX0NvbG9yOjprQ01ZSzoKKyAgICAgIHNDb2xvclN0cmVhbSA8PCBjb2xvci5mQ29sb3IxIDw8ICIgIiA8PCBjb2xvci5mQ29sb3IyIDw8ICIgIgorICAgICAgICAgICAgICAgICAgIDw8IGNvbG9yLmZDb2xvcjMgPDwgIiAiIDw8IGNvbG9yLmZDb2xvcjQgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgPDwgKG5PcGVyYXRpb24gPT0gUGFpbnRPcGVyYXRpb246OlNUUk9LRSA/ICJLIiA6ICJrIikKKyAgICAgICAgICAgICAgICAgICA8PCAiXG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDRlhfQ29sb3I6OmtUcmFuc3BhcmVudDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBCeXRlU3RyaW5nKHNDb2xvclN0cmVhbSk7Cit9CisKK0J5dGVTdHJpbmcgR2VuZXJhdGVCb3JkZXJBUChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ29sb3ImIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Db2xvciYgY3JMZWZ0VG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Db2xvciYgY3JSaWdodEJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3JkZXJTdHlsZSBuU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9EYXNoJiBkYXNoKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzQXBwU3RyZWFtOworICBCeXRlU3RyaW5nIHNDb2xvcjsKKyAgZmxvYXQgZkxlZnQgPSByZWN0LmxlZnQ7CisgIGZsb2F0IGZSaWdodCA9IHJlY3QucmlnaHQ7CisgIGZsb2F0IGZUb3AgPSByZWN0LnRvcDsKKyAgZmxvYXQgZkJvdHRvbSA9IHJlY3QuYm90dG9tOwogICBpZiAoZldpZHRoID4gMC4wZikgewotICAgIEZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmV2lkdGggLyAyLjBmOworICAgIGZsb2F0IGZIYWxmV2lkdGggPSBmV2lkdGggLyAyLjBmOwogICAgIHN3aXRjaCAoblN0eWxlKSB7CiAgICAgICBkZWZhdWx0OgogICAgICAgY2FzZSBCb3JkZXJTdHlsZTo6U09MSUQ6CkBAIC0xMjg2LDgxICsyOTUsMTA1NiBAQAogICAgICAgICBicmVhazsKICAgICB9CiAgIH0KLSAgcmV0dXJuIHNBcHBTdHJlYW0uTWFrZVN0cmluZygpOworICByZXR1cm4gQnl0ZVN0cmluZyhzQXBwU3RyZWFtKTsKIH0KIAotLy8gU3RhdGljLgotQ0ZYX0J5dGVTdHJpbmcgQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZUNvbG9yQVAoY29uc3QgQ1BWVF9Db2xvciYgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludE9wZXJhdGlvbiBuT3BlcmF0aW9uKSB7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBzQ29sb3JTdHJlYW07Ci0gIHN3aXRjaCAoY29sb3IubkNvbG9yVHlwZSkgewotICAgIGNhc2UgQ1BWVF9Db2xvcjo6a1JHQjoKLSAgICAgIHNDb2xvclN0cmVhbSA8PCBjb2xvci5mQ29sb3IxIDw8ICIgIiA8PCBjb2xvci5mQ29sb3IyIDw8ICIgIgotICAgICAgICAgICAgICAgICAgIDw8IGNvbG9yLmZDb2xvcjMgPDwgIiAiCi0gICAgICAgICAgICAgICAgICAgPDwgKG5PcGVyYXRpb24gPT0gUGFpbnRPcGVyYXRpb246OlNUUk9LRSA/ICJSRyIgOiAicmciKQotICAgICAgICAgICAgICAgICAgIDw8ICJcbiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENQVlRfQ29sb3I6OmtHcmF5OgotICAgICAgc0NvbG9yU3RyZWFtIDw8IGNvbG9yLmZDb2xvcjEgPDwgIiAiCi0gICAgICAgICAgICAgICAgICAgPDwgKG5PcGVyYXRpb24gPT0gUGFpbnRPcGVyYXRpb246OlNUUk9LRSA/ICJHIiA6ICJnIikKLSAgICAgICAgICAgICAgICAgICA8PCAiXG4iOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDUFZUX0NvbG9yOjprQ01ZSzoKLSAgICAgIHNDb2xvclN0cmVhbSA8PCBjb2xvci5mQ29sb3IxIDw8ICIgIiA8PCBjb2xvci5mQ29sb3IyIDw8ICIgIgotICAgICAgICAgICAgICAgICAgIDw8IGNvbG9yLmZDb2xvcjMgPDwgIiAiIDw8IGNvbG9yLmZDb2xvcjQgPDwgIiAiCi0gICAgICAgICAgICAgICAgICAgPDwgKG5PcGVyYXRpb24gPT0gUGFpbnRPcGVyYXRpb246OlNUUk9LRSA/ICJLIiA6ICJrIikKLSAgICAgICAgICAgICAgICAgICA8PCAiXG4iOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDUFZUX0NvbG9yOjprVHJhbnNwYXJlbnQ6Ci0gICAgICBicmVhazsKK0J5dGVTdHJpbmcgR2V0Q29sb3JTdHJpbmdXaXRoRGVmYXVsdChDUERGX0FycmF5KiBwQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NvbG9yJiBjckRlZmF1bHRDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludE9wZXJhdGlvbiBuT3BlcmF0aW9uKSB7CisgIGlmIChwQ29sb3IpIHsKKyAgICBDRlhfQ29sb3IgY29sb3IgPSBDRlhfQ29sb3I6OlBhcnNlQ29sb3IoKnBDb2xvcik7CisgICAgcmV0dXJuIEdlbmVyYXRlQ29sb3JBUChjb2xvciwgbk9wZXJhdGlvbik7CiAgIH0KLSAgcmV0dXJuIHNDb2xvclN0cmVhbS5NYWtlU3RyaW5nKCk7CisKKyAgcmV0dXJuIEdlbmVyYXRlQ29sb3JBUChjckRlZmF1bHRDb2xvciwgbk9wZXJhdGlvbik7CiB9CiAKLS8vIFN0YXRpYy4KLUNGWF9CeXRlU3RyaW5nIENQVlRfR2VuZXJhdGVBUDo6R2V0UERGV29yZFN0cmluZyhJUFZUX0ZvbnRNYXAqIHBGb250TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZvbnRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBXb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFN1YldvcmQpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgc1dvcmQ7Ci0gIGlmIChTdWJXb3JkID4gMCkgewotICAgIHNXb3JkLkZvcm1hdCgiJWMiLCBTdWJXb3JkKTsKLSAgICByZXR1cm4gc1dvcmQ7CitmbG9hdCBHZXRCb3JkZXJXaWR0aChjb25zdCBDUERGX0RpY3Rpb25hcnkmIHBBbm5vdERpY3QpIHsKKyAgaWYgKENQREZfRGljdGlvbmFyeSogcEJvcmRlclN0eWxlRGljdCA9IHBBbm5vdERpY3QuR2V0RGljdEZvcigiQlMiKSkgeworICAgIGlmIChwQm9yZGVyU3R5bGVEaWN0LT5LZXlFeGlzdCgiVyIpKQorICAgICAgcmV0dXJuIHBCb3JkZXJTdHlsZURpY3QtPkdldE51bWJlckZvcigiVyIpOwogICB9CiAKLSAgaWYgKCFwRm9udE1hcCkKLSAgICByZXR1cm4gc1dvcmQ7CisgIGlmIChDUERGX0FycmF5KiBwQm9yZGVyQXJyYXkgPSBwQW5ub3REaWN0LkdldEFycmF5Rm9yKCJCb3JkZXIiKSkgeworICAgIGlmIChwQm9yZGVyQXJyYXktPkdldENvdW50KCkgPiAyKQorICAgICAgcmV0dXJuIHBCb3JkZXJBcnJheS0+R2V0TnVtYmVyQXQoMik7CisgIH0KIAotICBpZiAoQ1BERl9Gb250KiBwUERGRm9udCA9IHBGb250TWFwLT5HZXRQREZGb250KG5Gb250SW5kZXgpKSB7Ci0gICAgaWYgKHBQREZGb250LT5HZXRCYXNlRm9udCgpLkNvbXBhcmUoIlN5bWJvbCIpID09IDAgfHwKLSAgICAgICAgcFBERkZvbnQtPkdldEJhc2VGb250KCkuQ29tcGFyZSgiWmFwZkRpbmdiYXRzIikgPT0gMCkgewotICAgICAgc1dvcmQuRm9ybWF0KCIlYyIsIFdvcmQpOwotICAgIH0gZWxzZSB7Ci0gICAgICB1aW50MzJfdCBkd0NoYXJDb2RlID0gcFBERkZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUoV29yZCk7Ci0gICAgICBpZiAoZHdDaGFyQ29kZSAhPSBDUERGX0ZvbnQ6OmtJbnZhbGlkQ2hhckNvZGUpCi0gICAgICAgIHBQREZGb250LT5BcHBlbmRDaGFyKHNXb3JkLCBkd0NoYXJDb2RlKTsKKyAgcmV0dXJuIDE7Cit9CisKK0NQREZfQXJyYXkqIEdldERhc2hBcnJheShjb25zdCBDUERGX0RpY3Rpb25hcnkmIHBBbm5vdERpY3QpIHsKKyAgaWYgKENQREZfRGljdGlvbmFyeSogcEJvcmRlclN0eWxlRGljdCA9IHBBbm5vdERpY3QuR2V0RGljdEZvcigiQlMiKSkgeworICAgIGlmIChwQm9yZGVyU3R5bGVEaWN0LT5HZXRTdHJpbmdGb3IoIlMiKSA9PSAiRCIpCisgICAgICByZXR1cm4gcEJvcmRlclN0eWxlRGljdC0+R2V0QXJyYXlGb3IoIkQiKTsKKyAgfQorCisgIGlmIChDUERGX0FycmF5KiBwQm9yZGVyQXJyYXkgPSBwQW5ub3REaWN0LkdldEFycmF5Rm9yKCJCb3JkZXIiKSkgeworICAgIGlmIChwQm9yZGVyQXJyYXktPkdldENvdW50KCkgPT0gNCkKKyAgICAgIHJldHVybiBwQm9yZGVyQXJyYXktPkdldEFycmF5QXQoMyk7CisgIH0KKworICByZXR1cm4gbnVsbHB0cjsKK30KKworQnl0ZVN0cmluZyBHZXREYXNoUGF0dGVyblN0cmluZyhjb25zdCBDUERGX0RpY3Rpb25hcnkmIHBBbm5vdERpY3QpIHsKKyAgQ1BERl9BcnJheSogcERhc2hBcnJheSA9IEdldERhc2hBcnJheShwQW5ub3REaWN0KTsKKyAgaWYgKCFwRGFzaEFycmF5IHx8IHBEYXNoQXJyYXktPklzRW1wdHkoKSkKKyAgICByZXR1cm4gQnl0ZVN0cmluZygpOworCisgIC8vIFN1cHBvcnQgbWF4aW11bSBvZiB0ZW4gZWxlbWVudHMgaW4gdGhlIGRhc2ggYXJyYXkuCisgIHNpemVfdCBwRGFzaEFycmF5Q291bnQgPSBzdGQ6Om1pbjxzaXplX3Q+KHBEYXNoQXJyYXktPkdldENvdW50KCksIDEwKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNEYXNoU3RyZWFtOworCisgIHNEYXNoU3RyZWFtIDw8ICJbIjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwRGFzaEFycmF5Q291bnQ7ICsraSkKKyAgICBzRGFzaFN0cmVhbSA8PCBwRGFzaEFycmF5LT5HZXROdW1iZXJBdChpKSA8PCAiICI7CisgIHNEYXNoU3RyZWFtIDw8ICJdIDAgZFxuIjsKKworICByZXR1cm4gQnl0ZVN0cmluZyhzRGFzaFN0cmVhbSk7Cit9CisKK0J5dGVTdHJpbmcgR2V0UG9wdXBDb250ZW50c1N0cmluZyhDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSYgcEFubm90RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHBEZWZGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIHNGb250TmFtZSkgeworICBXaWRlU3RyaW5nIHN3VmFsdWUocEFubm90RGljdC5HZXRVbmljb2RlVGV4dEZvcigiVCIpKTsKKyAgc3dWYWx1ZSArPSBMJ1xuJzsKKyAgc3dWYWx1ZSArPSBwQW5ub3REaWN0LkdldFVuaWNvZGVUZXh0Rm9yKCJDb250ZW50cyIpOworICBDUFZUX0ZvbnRNYXAgbWFwKHBEb2MsIG51bGxwdHIsIHBEZWZGb250LCBzRm9udE5hbWUpOworCisgIENQREZfVmFyaWFibGVUZXh0OjpQcm92aWRlciBwcmQoJm1hcCk7CisgIENQREZfVmFyaWFibGVUZXh0IHZ0OworICB2dC5TZXRQcm92aWRlcigmcHJkKTsKKyAgdnQuU2V0UGxhdGVSZWN0KHBBbm5vdERpY3QuR2V0UmVjdEZvcigiUmVjdCIpKTsKKyAgdnQuU2V0Rm9udFNpemUoMTIpOworICB2dC5TZXRBdXRvUmV0dXJuKHRydWUpOworICB2dC5TZXRNdWx0aUxpbmUodHJ1ZSk7CisKKyAgdnQuSW5pdGlhbGl6ZSgpOworICB2dC5TZXRUZXh0KHN3VmFsdWUpOworICB2dC5SZWFycmFuZ2VBbGwoKTsKKyAgQ0ZYX1BvaW50RiBwdE9mZnNldCgzLjBmLCAtMy4wZik7CisgIEJ5dGVTdHJpbmcgc0NvbnRlbnQgPQorICAgICAgR2VuZXJhdGVFZGl0QVAoJm1hcCwgdnQuR2V0SXRlcmF0b3IoKSwgcHRPZmZzZXQsIGZhbHNlLCAwKTsKKworICBpZiAoc0NvbnRlbnQuSXNFbXB0eSgpKQorICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNBcHBTdHJlYW07CisgIHNBcHBTdHJlYW0gPDwgIkJUXG4iCisgICAgICAgICAgICAgPDwgR2VuZXJhdGVDb2xvckFQKENGWF9Db2xvcihDRlhfQ29sb3I6OmtSR0IsIDAsIDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludE9wZXJhdGlvbjo6RklMTCkKKyAgICAgICAgICAgICA8PCBzQ29udGVudCA8PCAiRVRcbiIKKyAgICAgICAgICAgICA8PCAiUVxuIjsKKyAgcmV0dXJuIEJ5dGVTdHJpbmcoc0FwcFN0cmVhbSk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxDUERGX0RpY3Rpb25hcnk+IEdlbmVyYXRlUmVzb3VyY2VGb250RGljdCgKKyAgICBDUERGX0RvY3VtZW50KiBwRG9jLAorICAgIGNvbnN0IEJ5dGVTdHJpbmcmIHNGb250RGljdE5hbWUpIHsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QgPSBwRG9jLT5OZXdJbmRpcmVjdDxDUERGX0RpY3Rpb25hcnk+KCk7CisgIHBGb250RGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIlR5cGUiLCAiRm9udCIpOworICBwRm9udERpY3QtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJTdWJ0eXBlIiwgIlR5cGUxIik7CisgIHBGb250RGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIkJhc2VGb250IiwgIkhlbHZldGljYSIpOworICBwRm9udERpY3QtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJFbmNvZGluZyIsICJXaW5BbnNpRW5jb2RpbmciKTsKKworICBhdXRvIHBSZXNvdXJjZUZvbnREaWN0ID0KKyAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KHBEb2MtPkdldEJ5dGVTdHJpbmdQb29sKCkpOworICBwUmVzb3VyY2VGb250RGljdC0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPihzRm9udERpY3ROYW1lLCBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9udERpY3QtPkdldE9iak51bSgpKTsKKyAgcmV0dXJuIHBSZXNvdXJjZUZvbnREaWN0OworfQorCitCeXRlU3RyaW5nIEdldFBhaW50T3BlcmF0b3JTdHJpbmcoYm9vbCBiSXNTdHJva2VSZWN0LCBib29sIGJJc0ZpbGxSZWN0KSB7CisgIGlmIChiSXNTdHJva2VSZWN0KQorICAgIHJldHVybiBiSXNGaWxsUmVjdCA/ICJiIiA6ICJzIjsKKyAgcmV0dXJuIGJJc0ZpbGxSZWN0ID8gImYiIDogIm4iOworfQorCitCeXRlU3RyaW5nIEdlbmVyYXRlVGV4dFN5bWJvbEFQKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNBcHBTdHJlYW07CisgIHNBcHBTdHJlYW0gPDwgR2VuZXJhdGVDb2xvckFQKENGWF9Db2xvcihDRlhfQ29sb3I6OmtSR0IsIDEsIDEsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludE9wZXJhdGlvbjo6RklMTCk7CisgIHNBcHBTdHJlYW0gPDwgR2VuZXJhdGVDb2xvckFQKENGWF9Db2xvcihDRlhfQ29sb3I6OmtSR0IsIDAsIDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludE9wZXJhdGlvbjo6U1RST0tFKTsKKworICBjb25zdCBmbG9hdCBmQm9yZGVyV2lkdGggPSAxOworICBzQXBwU3RyZWFtIDw8IGZCb3JkZXJXaWR0aCA8PCAiIHdcbiI7CisKKyAgY29uc3QgZmxvYXQgZkhhbGZXaWR0aCA9IGZCb3JkZXJXaWR0aCAvIDI7CisgIGNvbnN0IGZsb2F0IGZUaXBEZWx0YSA9IDQ7CisKKyAgQ0ZYX0Zsb2F0UmVjdCBvdXRlclJlY3QxID0gcmVjdDsKKyAgb3V0ZXJSZWN0MS5EZWZsYXRlKGZIYWxmV2lkdGgsIGZIYWxmV2lkdGgpOworICBvdXRlclJlY3QxLmJvdHRvbSArPSBmVGlwRGVsdGE7CisKKyAgQ0ZYX0Zsb2F0UmVjdCBvdXRlclJlY3QyID0gb3V0ZXJSZWN0MTsKKyAgb3V0ZXJSZWN0Mi5sZWZ0ICs9IGZUaXBEZWx0YTsKKyAgb3V0ZXJSZWN0Mi5yaWdodCA9IG91dGVyUmVjdDIubGVmdCArIGZUaXBEZWx0YTsKKyAgb3V0ZXJSZWN0Mi50b3AgPSBvdXRlclJlY3QyLmJvdHRvbSAtIGZUaXBEZWx0YTsKKyAgZmxvYXQgb3V0ZXJSZWN0Mk1pZGRsZSA9IChvdXRlclJlY3QyLmxlZnQgKyBvdXRlclJlY3QyLnJpZ2h0KSAvIDI7CisKKyAgLy8gRHJhdyBvdXRlciBib3hlcy4KKyAgc0FwcFN0cmVhbSA8PCBvdXRlclJlY3QxLmxlZnQgPDwgIiAiIDw8IG91dGVyUmVjdDEuYm90dG9tIDw8ICIgbVxuIgorICAgICAgICAgICAgIDw8IG91dGVyUmVjdDEubGVmdCA8PCAiICIgPDwgb3V0ZXJSZWN0MS50b3AgPDwgIiBsXG4iCisgICAgICAgICAgICAgPDwgb3V0ZXJSZWN0MS5yaWdodCA8PCAiICIgPDwgb3V0ZXJSZWN0MS50b3AgPDwgIiBsXG4iCisgICAgICAgICAgICAgPDwgb3V0ZXJSZWN0MS5yaWdodCA8PCAiICIgPDwgb3V0ZXJSZWN0MS5ib3R0b20gPDwgIiBsXG4iCisgICAgICAgICAgICAgPDwgb3V0ZXJSZWN0Mi5yaWdodCA8PCAiICIgPDwgb3V0ZXJSZWN0Mi5ib3R0b20gPDwgIiBsXG4iCisgICAgICAgICAgICAgPDwgb3V0ZXJSZWN0Mk1pZGRsZSA8PCAiICIgPDwgb3V0ZXJSZWN0Mi50b3AgPDwgIiBsXG4iCisgICAgICAgICAgICAgPDwgb3V0ZXJSZWN0Mi5sZWZ0IDw8ICIgIiA8PCBvdXRlclJlY3QyLmJvdHRvbSA8PCAiIGxcbiIKKyAgICAgICAgICAgICA8PCBvdXRlclJlY3QxLmxlZnQgPDwgIiAiIDw8IG91dGVyUmVjdDEuYm90dG9tIDw8ICIgbFxuIjsKKworICAvLyBEcmF3IGlubmVyIGxpbmVzLgorICBDRlhfRmxvYXRSZWN0IGxpbmVSZWN0ID0gb3V0ZXJSZWN0MTsKKyAgY29uc3QgZmxvYXQgZlhEZWx0YSA9IDI7CisgIGNvbnN0IGZsb2F0IGZZRGVsdGEgPSAobGluZVJlY3QudG9wIC0gbGluZVJlY3QuYm90dG9tKSAvIDQ7CisKKyAgbGluZVJlY3QubGVmdCArPSBmWERlbHRhOworICBsaW5lUmVjdC5yaWdodCAtPSBmWERlbHRhOworICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgIGxpbmVSZWN0LnRvcCAtPSBmWURlbHRhOworICAgIHNBcHBTdHJlYW0gPDwgbGluZVJlY3QubGVmdCA8PCAiICIgPDwgbGluZVJlY3QudG9wIDw8ICIgbVxuIgorICAgICAgICAgICAgICAgPDwgbGluZVJlY3QucmlnaHQgPDwgIiAiIDw8IGxpbmVSZWN0LnRvcCA8PCAiIGxcbiI7CisgIH0KKyAgc0FwcFN0cmVhbSA8PCAiQipcbiI7CisKKyAgcmV0dXJuIEJ5dGVTdHJpbmcoc0FwcFN0cmVhbSk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxDUERGX0RpY3Rpb25hcnk+IEdlbmVyYXRlRXh0R1N0YXRlRGljdCgKKyAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkmIHBBbm5vdERpY3QsCisgICAgY29uc3QgQnl0ZVN0cmluZyYgc0V4dEdTRGljdE5hbWUsCisgICAgY29uc3QgQnl0ZVN0cmluZyYgc0JsZW5kTW9kZSkgeworICBhdXRvIHBHU0RpY3QgPQorICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4ocEFubm90RGljdC5HZXRCeXRlU3RyaW5nUG9vbCgpKTsKKyAgcEdTRGljdC0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigiVHlwZSIsICJFeHRHU3RhdGUiLCBmYWxzZSk7CisKKyAgZmxvYXQgZk9wYWNpdHkgPQorICAgICAgcEFubm90RGljdC5LZXlFeGlzdCgiQ0EiKSA/IHBBbm5vdERpY3QuR2V0TnVtYmVyRm9yKCJDQSIpIDogMTsKKyAgcEdTRGljdC0+U2V0TmV3Rm9yPENQREZfTnVtYmVyPigiQ0EiLCBmT3BhY2l0eSk7CisgIHBHU0RpY3QtPlNldE5ld0ZvcjxDUERGX051bWJlcj4oImNhIiwgZk9wYWNpdHkpOworICBwR1NEaWN0LT5TZXROZXdGb3I8Q1BERl9Cb29sZWFuPigiQUlTIiwgZmFsc2UpOworICBwR1NEaWN0LT5TZXROZXdGb3I8Q1BERl9TdHJpbmc+KCJCTSIsIHNCbGVuZE1vZGUsIGZhbHNlKTsKKworICBhdXRvIHBFeHRHU3RhdGVEaWN0ID0KKyAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KHBBbm5vdERpY3QuR2V0Qnl0ZVN0cmluZ1Bvb2woKSk7CisgIHBFeHRHU3RhdGVEaWN0LT5TZXRGb3Ioc0V4dEdTRGljdE5hbWUsIHN0ZDo6bW92ZShwR1NEaWN0KSk7CisgIHJldHVybiBwRXh0R1N0YXRlRGljdDsKK30KKworc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeT4gR2VuZXJhdGVSZXNvdXJjZURpY3QoCisgICAgQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5PiBwRXh0R1N0YXRlRGljdCwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5PiBwUmVzb3VyY2VGb250RGljdCkgeworICBhdXRvIHBSZXNvdXJjZURpY3QgPQorICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4ocERvYy0+R2V0Qnl0ZVN0cmluZ1Bvb2woKSk7CisgIGlmIChwRXh0R1N0YXRlRGljdCkKKyAgICBwUmVzb3VyY2VEaWN0LT5TZXRGb3IoIkV4dEdTdGF0ZSIsIHN0ZDo6bW92ZShwRXh0R1N0YXRlRGljdCkpOworICBpZiAocFJlc291cmNlRm9udERpY3QpCisgICAgcFJlc291cmNlRGljdC0+U2V0Rm9yKCJGb250Iiwgc3RkOjptb3ZlKHBSZXNvdXJjZUZvbnREaWN0KSk7CisgIHJldHVybiBwUmVzb3VyY2VEaWN0OworfQorCit2b2lkIEdlbmVyYXRlQW5kU2V0QVBEaWN0KENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtKiBwc0FwcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeT4gcFJlc291cmNlRGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXNUZXh0TWFya3VwQW5ub3RhdGlvbikgeworICBDUERGX1N0cmVhbSogcE5vcm1hbFN0cmVhbSA9IHBEb2MtPk5ld0luZGlyZWN0PENQREZfU3RyZWFtPigpOworICBwTm9ybWFsU3RyZWFtLT5TZXREYXRhKHBzQXBwU3RyZWFtKTsKKworICBDUERGX0RpY3Rpb25hcnkqIHBBUERpY3QgPSBwQW5ub3REaWN0LT5HZXREaWN0Rm9yKCJBUCIpOworICBpZiAoIXBBUERpY3QpCisgICAgcEFQRGljdCA9IHBBbm5vdERpY3QtPlNldE5ld0ZvcjxDUERGX0RpY3Rpb25hcnk+KCJBUCIpOworCisgIHBBUERpY3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIk4iLCBwRG9jLCBwTm9ybWFsU3RyZWFtLT5HZXRPYmpOdW0oKSk7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwU3RyZWFtRGljdCA9IHBOb3JtYWxTdHJlYW0tPkdldERpY3QoKTsKKyAgcFN0cmVhbURpY3QtPlNldE5ld0ZvcjxDUERGX051bWJlcj4oIkZvcm1UeXBlIiwgMSk7CisgIHBTdHJlYW1EaWN0LT5TZXROZXdGb3I8Q1BERl9TdHJpbmc+KCJTdWJ0eXBlIiwgIkZvcm0iLCBmYWxzZSk7CisgIHBTdHJlYW1EaWN0LT5TZXRNYXRyaXhGb3IoIk1hdHJpeCIsIENGWF9NYXRyaXgoKSk7CisKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gYklzVGV4dE1hcmt1cEFubm90YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ1BERl9Bbm5vdDo6UmVjdEZyb21RdWFkUG9pbnRzKHBBbm5vdERpY3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBBbm5vdERpY3QtPkdldFJlY3RGb3IoIlJlY3QiKTsKKyAgcFN0cmVhbURpY3QtPlNldFJlY3RGb3IoIkJCb3giLCByZWN0KTsKKyAgcFN0cmVhbURpY3QtPlNldEZvcigiUmVzb3VyY2VzIiwgc3RkOjptb3ZlKHBSZXNvdXJjZURpY3QpKTsKK30KKworYm9vbCBHZW5lcmF0ZUNpcmNsZUFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc0FwcFN0cmVhbTsKKyAgQnl0ZVN0cmluZyBzRXh0R1NEaWN0TmFtZSA9ICJHUyI7CisgIHNBcHBTdHJlYW0gPDwgIi8iIDw8IHNFeHRHU0RpY3ROYW1lIDw8ICIgZ3MgIjsKKworICBDUERGX0FycmF5KiBwSW50ZXJpb3JDb2xvciA9IHBBbm5vdERpY3QtPkdldEFycmF5Rm9yKCJJQyIpOworICBzQXBwU3RyZWFtIDw8IEdldENvbG9yU3RyaW5nV2l0aERlZmF1bHQoCisgICAgICBwSW50ZXJpb3JDb2xvciwgQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a1RyYW5zcGFyZW50KSwgUGFpbnRPcGVyYXRpb246OkZJTEwpOworCisgIHNBcHBTdHJlYW0gPDwgR2V0Q29sb3JTdHJpbmdXaXRoRGVmYXVsdChwQW5ub3REaWN0LT5HZXRBcnJheUZvcigiQyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a1JHQiwgMCwgMCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludE9wZXJhdGlvbjo6U1RST0tFKTsKKworICBmbG9hdCBmQm9yZGVyV2lkdGggPSBHZXRCb3JkZXJXaWR0aCgqcEFubm90RGljdCk7CisgIGJvb2wgYklzU3Ryb2tlUmVjdCA9IGZCb3JkZXJXaWR0aCA+IDA7CisKKyAgaWYgKGJJc1N0cm9rZVJlY3QpIHsKKyAgICBzQXBwU3RyZWFtIDw8IGZCb3JkZXJXaWR0aCA8PCAiIHcgIjsKKyAgICBzQXBwU3RyZWFtIDw8IEdldERhc2hQYXR0ZXJuU3RyaW5nKCpwQW5ub3REaWN0KTsKKyAgfQorCisgIENGWF9GbG9hdFJlY3QgcmVjdCA9IHBBbm5vdERpY3QtPkdldFJlY3RGb3IoIlJlY3QiKTsKKyAgcmVjdC5Ob3JtYWxpemUoKTsKKworICBpZiAoYklzU3Ryb2tlUmVjdCkgeworICAgIC8vIERlZmxhdGluZyByZWN0IGJlY2F1c2Ugc3Ryb2tpbmcgYSBwYXRoIGVudGFpbHMgcGFpbnRpbmcgYWxsIHBvaW50cyB3aG9zZQorICAgIC8vIHBlcnBlbmRpY3VsYXIgZGlzdGFuY2UgZnJvbSB0aGUgcGF0aCBpbiB1c2VyIHNwYWNlIGlzIGxlc3MgdGhhbiBvciBlcXVhbAorICAgIC8vIHRvIGhhbGYgdGhlIGxpbmUgd2lkdGguCisgICAgcmVjdC5EZWZsYXRlKGZCb3JkZXJXaWR0aCAvIDIsIGZCb3JkZXJXaWR0aCAvIDIpOworICB9CisKKyAgY29uc3QgZmxvYXQgZk1pZGRsZVggPSAocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCkgLyAyOworICBjb25zdCBmbG9hdCBmTWlkZGxlWSA9IChyZWN0LnRvcCArIHJlY3QuYm90dG9tKSAvIDI7CisKKyAgLy8gfGZMfCBpcyBwcmVjYWxjdWxhdGVkIGFwcHJveGltYXRlIHZhbHVlIG9mIDQgKiB0YW4oKDMuMTQgLyAyKSAvIDQpIC8gMywKKyAgLy8gd2hlcmUgfGZMfCAqIHJhZGl1cyBpcyBhIGdvb2QgYXBwcm94aW1hdGlvbiBvZiBjb250cm9sIHBvaW50cyBmb3IKKyAgLy8gYXJjIHdpdGggOTAgZGVncmVlcy4KKyAgY29uc3QgZmxvYXQgZkwgPSAwLjU1MjNmOworICBjb25zdCBmbG9hdCBmRGVsdGFYID0gZkwgKiByZWN0LldpZHRoKCkgLyAyLjA7CisgIGNvbnN0IGZsb2F0IGZEZWx0YVkgPSBmTCAqIHJlY3QuSGVpZ2h0KCkgLyAyLjA7CisKKyAgLy8gU3RhcnRpbmcgcG9pbnQKKyAgc0FwcFN0cmVhbSA8PCBmTWlkZGxlWCA8PCAiICIgPDwgcmVjdC50b3AgPDwgIiBtXG4iOworICAvLyBGaXJzdCBCZXppZXIgQ3VydmUKKyAgc0FwcFN0cmVhbSA8PCBmTWlkZGxlWCArIGZEZWx0YVggPDwgIiAiIDw8IHJlY3QudG9wIDw8ICIgIiA8PCByZWN0LnJpZ2h0CisgICAgICAgICAgICAgPDwgIiAiIDw8IGZNaWRkbGVZICsgZkRlbHRhWSA8PCAiICIgPDwgcmVjdC5yaWdodCA8PCAiICIKKyAgICAgICAgICAgICA8PCBmTWlkZGxlWSA8PCAiIGNcbiI7CisgIC8vIFNlY29uZCBCZXppZXIgQ3VydmUKKyAgc0FwcFN0cmVhbSA8PCByZWN0LnJpZ2h0IDw8ICIgIiA8PCBmTWlkZGxlWSAtIGZEZWx0YVkgPDwgIiAiCisgICAgICAgICAgICAgPDwgZk1pZGRsZVggKyBmRGVsdGFYIDw8ICIgIiA8PCByZWN0LmJvdHRvbSA8PCAiICIgPDwgZk1pZGRsZVgKKyAgICAgICAgICAgICA8PCAiICIgPDwgcmVjdC5ib3R0b20gPDwgIiBjXG4iOworICAvLyBUaGlyZCBCZXppZXIgQ3VydmUKKyAgc0FwcFN0cmVhbSA8PCBmTWlkZGxlWCAtIGZEZWx0YVggPDwgIiAiIDw8IHJlY3QuYm90dG9tIDw8ICIgIiA8PCByZWN0LmxlZnQKKyAgICAgICAgICAgICA8PCAiICIgPDwgZk1pZGRsZVkgLSBmRGVsdGFZIDw8ICIgIiA8PCByZWN0LmxlZnQgPDwgIiAiIDw8IGZNaWRkbGVZCisgICAgICAgICAgICAgPDwgIiBjXG4iOworICAvLyBGb3VydGggQmV6aWVyIEN1cnZlCisgIHNBcHBTdHJlYW0gPDwgcmVjdC5sZWZ0IDw8ICIgIiA8PCBmTWlkZGxlWSArIGZEZWx0YVkgPDwgIiAiCisgICAgICAgICAgICAgPDwgZk1pZGRsZVggLSBmRGVsdGFYIDw8ICIgIiA8PCByZWN0LnRvcCA8PCAiICIgPDwgZk1pZGRsZVggPDwgIiAiCisgICAgICAgICAgICAgPDwgcmVjdC50b3AgPDwgIiBjXG4iOworCisgIGJvb2wgYklzRmlsbFJlY3QgPSBwSW50ZXJpb3JDb2xvciAmJiAhcEludGVyaW9yQ29sb3ItPklzRW1wdHkoKTsKKyAgc0FwcFN0cmVhbSA8PCBHZXRQYWludE9wZXJhdG9yU3RyaW5nKGJJc1N0cm9rZVJlY3QsIGJJc0ZpbGxSZWN0KSA8PCAiXG4iOworCisgIGF1dG8gcEV4dEdTdGF0ZURpY3QgPQorICAgICAgR2VuZXJhdGVFeHRHU3RhdGVEaWN0KCpwQW5ub3REaWN0LCBzRXh0R1NEaWN0TmFtZSwgIk5vcm1hbCIpOworICBhdXRvIHBSZXNvdXJjZURpY3QgPQorICAgICAgR2VuZXJhdGVSZXNvdXJjZURpY3QocERvYywgc3RkOjptb3ZlKHBFeHRHU3RhdGVEaWN0KSwgbnVsbHB0cik7CisgIEdlbmVyYXRlQW5kU2V0QVBEaWN0KHBEb2MsIHBBbm5vdERpY3QsICZzQXBwU3RyZWFtLCBzdGQ6Om1vdmUocFJlc291cmNlRGljdCksCisgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qSXNUZXh0TWFya3VwQW5ub3RhdGlvbiovKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgR2VuZXJhdGVIaWdobGlnaHRBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNBcHBTdHJlYW07CisgIEJ5dGVTdHJpbmcgc0V4dEdTRGljdE5hbWUgPSAiR1MiOworICBzQXBwU3RyZWFtIDw8ICIvIiA8PCBzRXh0R1NEaWN0TmFtZSA8PCAiIGdzICI7CisKKyAgc0FwcFN0cmVhbSA8PCBHZXRDb2xvclN0cmluZ1dpdGhEZWZhdWx0KHBBbm5vdERpY3QtPkdldEFycmF5Rm9yKCJDIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprUkdCLCAxLCAxLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50T3BlcmF0aW9uOjpGSUxMKTsKKworICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBDUERGX0Fubm90OjpSZWN0RnJvbVF1YWRQb2ludHMocEFubm90RGljdCk7CisgIHJlY3QuTm9ybWFsaXplKCk7CisKKyAgc0FwcFN0cmVhbSA8PCByZWN0LmxlZnQgPDwgIiAiIDw8IHJlY3QudG9wIDw8ICIgbSAiIDw8IHJlY3QucmlnaHQgPDwgIiAiCisgICAgICAgICAgICAgPDwgcmVjdC50b3AgPDwgIiBsICIgPDwgcmVjdC5yaWdodCA8PCAiICIgPDwgcmVjdC5ib3R0b20gPDwgIiBsICIKKyAgICAgICAgICAgICA8PCByZWN0LmxlZnQgPDwgIiAiIDw8IHJlY3QuYm90dG9tIDw8ICIgbCAiCisgICAgICAgICAgICAgPDwgImggZlxuIjsKKworICBhdXRvIHBFeHRHU3RhdGVEaWN0ID0KKyAgICAgIEdlbmVyYXRlRXh0R1N0YXRlRGljdCgqcEFubm90RGljdCwgc0V4dEdTRGljdE5hbWUsICJNdWx0aXBseSIpOworICBhdXRvIHBSZXNvdXJjZURpY3QgPQorICAgICAgR2VuZXJhdGVSZXNvdXJjZURpY3QocERvYywgc3RkOjptb3ZlKHBFeHRHU3RhdGVEaWN0KSwgbnVsbHB0cik7CisgIEdlbmVyYXRlQW5kU2V0QVBEaWN0KHBEb2MsIHBBbm5vdERpY3QsICZzQXBwU3RyZWFtLCBzdGQ6Om1vdmUocFJlc291cmNlRGljdCksCisgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLypJc1RleHRNYXJrdXBBbm5vdGF0aW9uKi8pOworCisgIHJldHVybiB0cnVlOworfQorCitib29sIEdlbmVyYXRlSW5rQVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KSB7CisgIGZsb2F0IGZCb3JkZXJXaWR0aCA9IEdldEJvcmRlcldpZHRoKCpwQW5ub3REaWN0KTsKKyAgYm9vbCBiSXNTdHJva2UgPSBmQm9yZGVyV2lkdGggPiAwOworCisgIGlmICghYklzU3Ryb2tlKQorICAgIHJldHVybiBmYWxzZTsKKworICBDUERGX0FycmF5KiBwSW5rTGlzdCA9IHBBbm5vdERpY3QtPkdldEFycmF5Rm9yKCJJbmtMaXN0Iik7CisgIGlmICghcElua0xpc3QgfHwgcElua0xpc3QtPklzRW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNBcHBTdHJlYW07CisgIEJ5dGVTdHJpbmcgc0V4dEdTRGljdE5hbWUgPSAiR1MiOworICBzQXBwU3RyZWFtIDw8ICIvIiA8PCBzRXh0R1NEaWN0TmFtZSA8PCAiIGdzICI7CisKKyAgc0FwcFN0cmVhbSA8PCBHZXRDb2xvclN0cmluZ1dpdGhEZWZhdWx0KHBBbm5vdERpY3QtPkdldEFycmF5Rm9yKCJDIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprUkdCLCAwLCAwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50T3BlcmF0aW9uOjpTVFJPS0UpOworCisgIHNBcHBTdHJlYW0gPDwgZkJvcmRlcldpZHRoIDw8ICIgdyAiOworICBzQXBwU3RyZWFtIDw8IEdldERhc2hQYXR0ZXJuU3RyaW5nKCpwQW5ub3REaWN0KTsKKworICAvLyBTZXQgaW5mbGF0ZWQgcmVjdCBhcyBhIG5ldyByZWN0IGJlY2F1c2UgcGF0aHMgbmVhciB0aGUgYm9yZGVyIHdpdGggbGFyZ2UKKyAgLy8gd2lkdGggc2hvdWxkIG5vdCBiZSBjbGlwcGVkIHRvIHRoZSBvcmlnaW5hbCByZWN0LgorICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBwQW5ub3REaWN0LT5HZXRSZWN0Rm9yKCJSZWN0Iik7CisgIHJlY3QuSW5mbGF0ZShmQm9yZGVyV2lkdGggLyAyLCBmQm9yZGVyV2lkdGggLyAyKTsKKyAgcEFubm90RGljdC0+U2V0UmVjdEZvcigiUmVjdCIsIHJlY3QpOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcElua0xpc3QtPkdldENvdW50KCk7IGkrKykgeworICAgIENQREZfQXJyYXkqIHBJbmtDb29yZExpc3QgPSBwSW5rTGlzdC0+R2V0QXJyYXlBdChpKTsKKyAgICBpZiAoIXBJbmtDb29yZExpc3QgfHwgcElua0Nvb3JkTGlzdC0+R2V0Q291bnQoKSA8IDIpCisgICAgICBjb250aW51ZTsKKworICAgIHNBcHBTdHJlYW0gPDwgcElua0Nvb3JkTGlzdC0+R2V0TnVtYmVyQXQoMCkgPDwgIiAiCisgICAgICAgICAgICAgICA8PCBwSW5rQ29vcmRMaXN0LT5HZXROdW1iZXJBdCgxKSA8PCAiIG0gIjsKKworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcElua0Nvb3JkTGlzdC0+R2V0Q291bnQoKSAtIDE7IGogKz0gMikgeworICAgICAgc0FwcFN0cmVhbSA8PCBwSW5rQ29vcmRMaXN0LT5HZXROdW1iZXJBdChqKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgPDwgcElua0Nvb3JkTGlzdC0+R2V0TnVtYmVyQXQoaiArIDEpIDw8ICIgbCAiOworICAgIH0KKworICAgIHNBcHBTdHJlYW0gPDwgIlNcbiI7CisgIH0KKworICBhdXRvIHBFeHRHU3RhdGVEaWN0ID0KKyAgICAgIEdlbmVyYXRlRXh0R1N0YXRlRGljdCgqcEFubm90RGljdCwgc0V4dEdTRGljdE5hbWUsICJOb3JtYWwiKTsKKyAgYXV0byBwUmVzb3VyY2VEaWN0ID0KKyAgICAgIEdlbmVyYXRlUmVzb3VyY2VEaWN0KHBEb2MsIHN0ZDo6bW92ZShwRXh0R1N0YXRlRGljdCksIG51bGxwdHIpOworICBHZW5lcmF0ZUFuZFNldEFQRGljdChwRG9jLCBwQW5ub3REaWN0LCAmc0FwcFN0cmVhbSwgc3RkOjptb3ZlKHBSZXNvdXJjZURpY3QpLAorICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKklzVGV4dE1hcmt1cEFubm90YXRpb24qLyk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIEdlbmVyYXRlVGV4dEFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc0FwcFN0cmVhbTsKKyAgQnl0ZVN0cmluZyBzRXh0R1NEaWN0TmFtZSA9ICJHUyI7CisgIHNBcHBTdHJlYW0gPDwgIi8iIDw8IHNFeHRHU0RpY3ROYW1lIDw8ICIgZ3MgIjsKKworICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBwQW5ub3REaWN0LT5HZXRSZWN0Rm9yKCJSZWN0Iik7CisgIGNvbnN0IGZsb2F0IGZOb3RlTGVuZ3RoID0gMjA7CisgIENGWF9GbG9hdFJlY3Qgbm90ZVJlY3QocmVjdC5sZWZ0LCByZWN0LmJvdHRvbSwgcmVjdC5sZWZ0ICsgZk5vdGVMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5ib3R0b20gKyBmTm90ZUxlbmd0aCk7CisgIHBBbm5vdERpY3QtPlNldFJlY3RGb3IoIlJlY3QiLCBub3RlUmVjdCk7CisKKyAgc0FwcFN0cmVhbSA8PCBHZW5lcmF0ZVRleHRTeW1ib2xBUChub3RlUmVjdCk7CisKKyAgYXV0byBwRXh0R1N0YXRlRGljdCA9CisgICAgICBHZW5lcmF0ZUV4dEdTdGF0ZURpY3QoKnBBbm5vdERpY3QsIHNFeHRHU0RpY3ROYW1lLCAiTm9ybWFsIik7CisgIGF1dG8gcFJlc291cmNlRGljdCA9CisgICAgICBHZW5lcmF0ZVJlc291cmNlRGljdChwRG9jLCBzdGQ6Om1vdmUocEV4dEdTdGF0ZURpY3QpLCBudWxscHRyKTsKKyAgR2VuZXJhdGVBbmRTZXRBUERpY3QocERvYywgcEFubm90RGljdCwgJnNBcHBTdHJlYW0sIHN0ZDo6bW92ZShwUmVzb3VyY2VEaWN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLypJc1RleHRNYXJrdXBBbm5vdGF0aW9uKi8pOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBHZW5lcmF0ZVVuZGVybGluZUFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc0FwcFN0cmVhbTsKKyAgQnl0ZVN0cmluZyBzRXh0R1NEaWN0TmFtZSA9ICJHUyI7CisgIHNBcHBTdHJlYW0gPDwgIi8iIDw8IHNFeHRHU0RpY3ROYW1lIDw8ICIgZ3MgIjsKKworICBzQXBwU3RyZWFtIDw8IEdldENvbG9yU3RyaW5nV2l0aERlZmF1bHQocEFubm90RGljdC0+R2V0QXJyYXlGb3IoIkMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Db2xvcihDRlhfQ29sb3I6OmtSR0IsIDAsIDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnRPcGVyYXRpb246OlNUUk9LRSk7CisKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gQ1BERl9Bbm5vdDo6UmVjdEZyb21RdWFkUG9pbnRzKHBBbm5vdERpY3QpOworICByZWN0Lk5vcm1hbGl6ZSgpOworCisgIGZsb2F0IGZMaW5lV2lkdGggPSAxLjA7CisgIHNBcHBTdHJlYW0gPDwgZkxpbmVXaWR0aCA8PCAiIHcgIiA8PCByZWN0LmxlZnQgPDwgIiAiCisgICAgICAgICAgICAgPDwgcmVjdC5ib3R0b20gKyBmTGluZVdpZHRoIDw8ICIgbSAiIDw8IHJlY3QucmlnaHQgPDwgIiAiCisgICAgICAgICAgICAgPDwgcmVjdC5ib3R0b20gKyBmTGluZVdpZHRoIDw8ICIgbCBTXG4iOworCisgIGF1dG8gcEV4dEdTdGF0ZURpY3QgPQorICAgICAgR2VuZXJhdGVFeHRHU3RhdGVEaWN0KCpwQW5ub3REaWN0LCBzRXh0R1NEaWN0TmFtZSwgIk5vcm1hbCIpOworICBhdXRvIHBSZXNvdXJjZURpY3QgPQorICAgICAgR2VuZXJhdGVSZXNvdXJjZURpY3QocERvYywgc3RkOjptb3ZlKHBFeHRHU3RhdGVEaWN0KSwgbnVsbHB0cik7CisgIEdlbmVyYXRlQW5kU2V0QVBEaWN0KHBEb2MsIHBBbm5vdERpY3QsICZzQXBwU3RyZWFtLCBzdGQ6Om1vdmUocFJlc291cmNlRGljdCksCisgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLypJc1RleHRNYXJrdXBBbm5vdGF0aW9uKi8pOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBHZW5lcmF0ZVBvcHVwQVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzQXBwU3RyZWFtOworICBCeXRlU3RyaW5nIHNFeHRHU0RpY3ROYW1lID0gIkdTIjsKKyAgc0FwcFN0cmVhbSA8PCAiLyIgPDwgc0V4dEdTRGljdE5hbWUgPDwgIiBnc1xuIjsKKworICBzQXBwU3RyZWFtIDw8IEdlbmVyYXRlQ29sb3JBUChDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprUkdCLCAxLCAxLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnRPcGVyYXRpb246OkZJTEwpOworICBzQXBwU3RyZWFtIDw8IEdlbmVyYXRlQ29sb3JBUChDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprUkdCLCAwLCAwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnRPcGVyYXRpb246OlNUUk9LRSk7CisKKyAgY29uc3QgZmxvYXQgZkJvcmRlcldpZHRoID0gMTsKKyAgc0FwcFN0cmVhbSA8PCBmQm9yZGVyV2lkdGggPDwgIiB3XG4iOworCisgIENGWF9GbG9hdFJlY3QgcmVjdCA9IHBBbm5vdERpY3QtPkdldFJlY3RGb3IoIlJlY3QiKTsKKyAgcmVjdC5Ob3JtYWxpemUoKTsKKyAgcmVjdC5EZWZsYXRlKGZCb3JkZXJXaWR0aCAvIDIsIGZCb3JkZXJXaWR0aCAvIDIpOworCisgIHNBcHBTdHJlYW0gPDwgcmVjdC5sZWZ0IDw8ICIgIiA8PCByZWN0LmJvdHRvbSA8PCAiICIgPDwgcmVjdC5XaWR0aCgpIDw8ICIgIgorICAgICAgICAgICAgIDw8IHJlY3QuSGVpZ2h0KCkgPDwgIiByZSBiXG4iOworCisgIEJ5dGVTdHJpbmcgc0ZvbnROYW1lID0gIkZPTlQiOworICBhdXRvIHBSZXNvdXJjZUZvbnREaWN0ID0gR2VuZXJhdGVSZXNvdXJjZUZvbnREaWN0KHBEb2MsIHNGb250TmFtZSk7CisgIENQREZfRm9udCogcERlZkZvbnQgPSBwRG9jLT5Mb2FkRm9udChwUmVzb3VyY2VGb250RGljdC5nZXQoKSk7CisgIGlmICghcERlZkZvbnQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGF1dG8gcEV4dEdTdGF0ZURpY3QgPQorICAgICAgR2VuZXJhdGVFeHRHU3RhdGVEaWN0KCpwQW5ub3REaWN0LCBzRXh0R1NEaWN0TmFtZSwgIk5vcm1hbCIpOworICBhdXRvIHBSZXNvdXJjZURpY3QgPSBHZW5lcmF0ZVJlc291cmNlRGljdChwRG9jLCBzdGQ6Om1vdmUocFJlc291cmNlRm9udERpY3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocEV4dEdTdGF0ZURpY3QpKTsKKworICBzQXBwU3RyZWFtIDw8IEdldFBvcHVwQ29udGVudHNTdHJpbmcocERvYywgKnBBbm5vdERpY3QsIHBEZWZGb250LCBzRm9udE5hbWUpOworICBHZW5lcmF0ZUFuZFNldEFQRGljdChwRG9jLCBwQW5ub3REaWN0LCAmc0FwcFN0cmVhbSwgc3RkOjptb3ZlKHBSZXNvdXJjZURpY3QpLAorICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKklzVGV4dE1hcmt1cEFubm90YXRpb24qLyk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIEdlbmVyYXRlU3F1YXJlQVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzQXBwU3RyZWFtOworICBCeXRlU3RyaW5nIHNFeHRHU0RpY3ROYW1lID0gIkdTIjsKKyAgc0FwcFN0cmVhbSA8PCAiLyIgPDwgc0V4dEdTRGljdE5hbWUgPDwgIiBncyAiOworCisgIENQREZfQXJyYXkqIHBJbnRlcmlvckNvbG9yID0gcEFubm90RGljdC0+R2V0QXJyYXlGb3IoIklDIik7CisgIHNBcHBTdHJlYW0gPDwgR2V0Q29sb3JTdHJpbmdXaXRoRGVmYXVsdCgKKyAgICAgIHBJbnRlcmlvckNvbG9yLCBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprVHJhbnNwYXJlbnQpLCBQYWludE9wZXJhdGlvbjo6RklMTCk7CisKKyAgc0FwcFN0cmVhbSA8PCBHZXRDb2xvclN0cmluZ1dpdGhEZWZhdWx0KHBBbm5vdERpY3QtPkdldEFycmF5Rm9yKCJDIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprUkdCLCAwLCAwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50T3BlcmF0aW9uOjpTVFJPS0UpOworCisgIGZsb2F0IGZCb3JkZXJXaWR0aCA9IEdldEJvcmRlcldpZHRoKCpwQW5ub3REaWN0KTsKKyAgYm9vbCBiSXNTdHJva2VSZWN0ID0gZkJvcmRlcldpZHRoID4gMDsKKworICBpZiAoYklzU3Ryb2tlUmVjdCkgeworICAgIHNBcHBTdHJlYW0gPDwgZkJvcmRlcldpZHRoIDw8ICIgdyAiOworICAgIHNBcHBTdHJlYW0gPDwgR2V0RGFzaFBhdHRlcm5TdHJpbmcoKnBBbm5vdERpY3QpOworICB9CisKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gcEFubm90RGljdC0+R2V0UmVjdEZvcigiUmVjdCIpOworICByZWN0Lk5vcm1hbGl6ZSgpOworCisgIGlmIChiSXNTdHJva2VSZWN0KSB7CisgICAgLy8gRGVmbGF0aW5nIHJlY3QgYmVjYXVzZSBzdHJva2luZyBhIHBhdGggZW50YWlscyBwYWludGluZyBhbGwgcG9pbnRzIHdob3NlCisgICAgLy8gcGVycGVuZGljdWxhciBkaXN0YW5jZSBmcm9tIHRoZSBwYXRoIGluIHVzZXIgc3BhY2UgaXMgbGVzcyB0aGFuIG9yIGVxdWFsCisgICAgLy8gdG8gaGFsZiB0aGUgbGluZSB3aWR0aC4KKyAgICByZWN0LkRlZmxhdGUoZkJvcmRlcldpZHRoIC8gMiwgZkJvcmRlcldpZHRoIC8gMik7CisgIH0KKworICBib29sIGJJc0ZpbGxSZWN0ID0gcEludGVyaW9yQ29sb3IgJiYgKHBJbnRlcmlvckNvbG9yLT5HZXRDb3VudCgpID4gMCk7CisKKyAgc0FwcFN0cmVhbSA8PCByZWN0LmxlZnQgPDwgIiAiIDw8IHJlY3QuYm90dG9tIDw8ICIgIiA8PCByZWN0LldpZHRoKCkgPDwgIiAiCisgICAgICAgICAgICAgPDwgcmVjdC5IZWlnaHQoKSA8PCAiIHJlICIKKyAgICAgICAgICAgICA8PCBHZXRQYWludE9wZXJhdG9yU3RyaW5nKGJJc1N0cm9rZVJlY3QsIGJJc0ZpbGxSZWN0KSA8PCAiXG4iOworCisgIGF1dG8gcEV4dEdTdGF0ZURpY3QgPQorICAgICAgR2VuZXJhdGVFeHRHU3RhdGVEaWN0KCpwQW5ub3REaWN0LCBzRXh0R1NEaWN0TmFtZSwgIk5vcm1hbCIpOworICBhdXRvIHBSZXNvdXJjZURpY3QgPQorICAgICAgR2VuZXJhdGVSZXNvdXJjZURpY3QocERvYywgc3RkOjptb3ZlKHBFeHRHU3RhdGVEaWN0KSwgbnVsbHB0cik7CisgIEdlbmVyYXRlQW5kU2V0QVBEaWN0KHBEb2MsIHBBbm5vdERpY3QsICZzQXBwU3RyZWFtLCBzdGQ6Om1vdmUocFJlc291cmNlRGljdCksCisgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qSXNUZXh0TWFya3VwQW5ub3RhdGlvbiovKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgR2VuZXJhdGVTcXVpZ2dseUFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc0FwcFN0cmVhbTsKKyAgQnl0ZVN0cmluZyBzRXh0R1NEaWN0TmFtZSA9ICJHUyI7CisgIHNBcHBTdHJlYW0gPDwgIi8iIDw8IHNFeHRHU0RpY3ROYW1lIDw8ICIgZ3MgIjsKKworICBzQXBwU3RyZWFtIDw8IEdldENvbG9yU3RyaW5nV2l0aERlZmF1bHQocEFubm90RGljdC0+R2V0QXJyYXlGb3IoIkMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Db2xvcihDRlhfQ29sb3I6OmtSR0IsIDAsIDAsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnRPcGVyYXRpb246OlNUUk9LRSk7CisKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gQ1BERl9Bbm5vdDo6UmVjdEZyb21RdWFkUG9pbnRzKHBBbm5vdERpY3QpOworICByZWN0Lk5vcm1hbGl6ZSgpOworCisgIGZsb2F0IGZMaW5lV2lkdGggPSAxLjA7CisgIHNBcHBTdHJlYW0gPDwgZkxpbmVXaWR0aCA8PCAiIHcgIjsKKworICBjb25zdCBmbG9hdCBmRGVsdGEgPSAyLjA7CisgIGNvbnN0IGZsb2F0IGZUb3AgPSByZWN0LmJvdHRvbSArIGZEZWx0YTsKKyAgY29uc3QgZmxvYXQgZkJvdHRvbSA9IHJlY3QuYm90dG9tOworCisgIHNBcHBTdHJlYW0gPDwgcmVjdC5sZWZ0IDw8ICIgIiA8PCBmVG9wIDw8ICIgbSAiOworCisgIGZsb2F0IGZYID0gcmVjdC5sZWZ0ICsgZkRlbHRhOworICBib29sIGlzVXB3YXJkcyA9IGZhbHNlOworCisgIHdoaWxlIChmWCA8IHJlY3QucmlnaHQpIHsKKyAgICBzQXBwU3RyZWFtIDw8IGZYIDw8ICIgIiA8PCAoaXNVcHdhcmRzID8gZlRvcCA6IGZCb3R0b20pIDw8ICIgbCAiOworCisgICAgZlggKz0gZkRlbHRhOworICAgIGlzVXB3YXJkcyA9ICFpc1Vwd2FyZHM7CisgIH0KKworICBmbG9hdCBmUmVtYWluZGVyID0gcmVjdC5yaWdodCAtIChmWCAtIGZEZWx0YSk7CisgIGlmIChpc1Vwd2FyZHMpCisgICAgc0FwcFN0cmVhbSA8PCByZWN0LnJpZ2h0IDw8ICIgIiA8PCBmQm90dG9tICsgZlJlbWFpbmRlciA8PCAiIGwgIjsKKyAgZWxzZQorICAgIHNBcHBTdHJlYW0gPDwgcmVjdC5yaWdodCA8PCAiICIgPDwgZlRvcCAtIGZSZW1haW5kZXIgPDwgIiBsICI7CisKKyAgc0FwcFN0cmVhbSA8PCAiU1xuIjsKKworICBhdXRvIHBFeHRHU3RhdGVEaWN0ID0KKyAgICAgIEdlbmVyYXRlRXh0R1N0YXRlRGljdCgqcEFubm90RGljdCwgc0V4dEdTRGljdE5hbWUsICJOb3JtYWwiKTsKKyAgYXV0byBwUmVzb3VyY2VEaWN0ID0KKyAgICAgIEdlbmVyYXRlUmVzb3VyY2VEaWN0KHBEb2MsIHN0ZDo6bW92ZShwRXh0R1N0YXRlRGljdCksIG51bGxwdHIpOworICBHZW5lcmF0ZUFuZFNldEFQRGljdChwRG9jLCBwQW5ub3REaWN0LCAmc0FwcFN0cmVhbSwgc3RkOjptb3ZlKHBSZXNvdXJjZURpY3QpLAorICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qSXNUZXh0TWFya3VwQW5ub3RhdGlvbiovKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgR2VuZXJhdGVTdHJpa2VPdXRBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNBcHBTdHJlYW07CisgIEJ5dGVTdHJpbmcgc0V4dEdTRGljdE5hbWUgPSAiR1MiOworICBzQXBwU3RyZWFtIDw8ICIvIiA8PCBzRXh0R1NEaWN0TmFtZSA8PCAiIGdzICI7CisKKyAgc0FwcFN0cmVhbSA8PCBHZXRDb2xvclN0cmluZ1dpdGhEZWZhdWx0KHBBbm5vdERpY3QtPkdldEFycmF5Rm9yKCJDIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprUkdCLCAwLCAwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50T3BlcmF0aW9uOjpTVFJPS0UpOworCisgIENGWF9GbG9hdFJlY3QgcmVjdCA9IENQREZfQW5ub3Q6OlJlY3RGcm9tUXVhZFBvaW50cyhwQW5ub3REaWN0KTsKKyAgcmVjdC5Ob3JtYWxpemUoKTsKKworICBmbG9hdCBmTGluZVdpZHRoID0gMS4wOworICBmbG9hdCBmWSA9IChyZWN0LnRvcCArIHJlY3QuYm90dG9tKSAvIDI7CisgIHNBcHBTdHJlYW0gPDwgZkxpbmVXaWR0aCA8PCAiIHcgIiA8PCByZWN0LmxlZnQgPDwgIiAiIDw8IGZZIDw8ICIgbSAiCisgICAgICAgICAgICAgPDwgcmVjdC5yaWdodCA8PCAiICIgPDwgZlkgPDwgIiBsIFNcbiI7CisKKyAgYXV0byBwRXh0R1N0YXRlRGljdCA9CisgICAgICBHZW5lcmF0ZUV4dEdTdGF0ZURpY3QoKnBBbm5vdERpY3QsIHNFeHRHU0RpY3ROYW1lLCAiTm9ybWFsIik7CisgIGF1dG8gcFJlc291cmNlRGljdCA9CisgICAgICBHZW5lcmF0ZVJlc291cmNlRGljdChwRG9jLCBzdGQ6Om1vdmUocEV4dEdTdGF0ZURpY3QpLCBudWxscHRyKTsKKyAgR2VuZXJhdGVBbmRTZXRBUERpY3QocERvYywgcEFubm90RGljdCwgJnNBcHBTdHJlYW0sIHN0ZDo6bW92ZShwUmVzb3VyY2VEaWN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKklzVGV4dE1hcmt1cEFubm90YXRpb24qLyk7CisgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCit2b2lkIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVGb3JtQVAoVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KSB7CisgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJvb3REaWN0ID0gcERvYy0+R2V0Um9vdCgpOworICBpZiAoIXBSb290RGljdCkKKyAgICByZXR1cm47CisKKyAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwRm9ybURpY3QgPSBwUm9vdERpY3QtPkdldERpY3RGb3IoIkFjcm9Gb3JtIik7CisgIGlmICghcEZvcm1EaWN0KQorICAgIHJldHVybjsKKworICBCeXRlU3RyaW5nIERBOworICBpZiAoQ1BERl9PYmplY3QqIHBEQU9iaiA9IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJEQSIpKQorICAgIERBID0gcERBT2JqLT5HZXRTdHJpbmcoKTsKKyAgaWYgKERBLklzRW1wdHkoKSkKKyAgICBEQSA9IHBGb3JtRGljdC0+R2V0U3RyaW5nRm9yKCJEQSIpOworICBpZiAoREEuSXNFbXB0eSgpKQorICAgIHJldHVybjsKKworICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgoREEuQXNTdHJpbmdWaWV3KCkpOworICBzeW50YXguRmluZFRhZ1BhcmFtRnJvbVN0YXJ0KCJUZiIsIDIpOworICBCeXRlU3RyaW5nIHNGb250TmFtZShzeW50YXguR2V0V29yZCgpKTsKKyAgc0ZvbnROYW1lID0gUERGX05hbWVEZWNvZGUoc0ZvbnROYW1lKTsKKyAgaWYgKHNGb250TmFtZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuOworCisgIGZsb2F0IGZGb250U2l6ZSA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7CisgIENGWF9Db2xvciBjclRleHQgPSBDRlhfQ29sb3I6OlBhcnNlQ29sb3IoREEpOworICBDUERGX0RpY3Rpb25hcnkqIHBEUkRpY3QgPSBwRm9ybURpY3QtPkdldERpY3RGb3IoIkRSIik7CisgIGlmICghcERSRGljdCkKKyAgICByZXR1cm47CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRFJGb250RGljdCA9IHBEUkRpY3QtPkdldERpY3RGb3IoIkZvbnQiKTsKKyAgaWYgKCFwRFJGb250RGljdCkKKyAgICByZXR1cm47CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QgPQorICAgICAgcERSRm9udERpY3QtPkdldERpY3RGb3Ioc0ZvbnROYW1lLlJpZ2h0KHNGb250TmFtZS5HZXRMZW5ndGgoKSAtIDEpKTsKKyAgaWYgKCFwRm9udERpY3QpIHsKKyAgICBwRm9udERpY3QgPSBwRG9jLT5OZXdJbmRpcmVjdDxDUERGX0RpY3Rpb25hcnk+KCk7CisgICAgcEZvbnREaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiVHlwZSIsICJGb250Iik7CisgICAgcEZvbnREaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiU3VidHlwZSIsICJUeXBlMSIpOworICAgIHBGb250RGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIkJhc2VGb250IiwgIkhlbHZldGljYSIpOworICAgIHBGb250RGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIkVuY29kaW5nIiwgIldpbkFuc2lFbmNvZGluZyIpOworICAgIHBEUkZvbnREaWN0LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KAorICAgICAgICBzRm9udE5hbWUuUmlnaHQoc0ZvbnROYW1lLkdldExlbmd0aCgpIC0gMSksIHBEb2MsCisgICAgICAgIHBGb250RGljdC0+R2V0T2JqTnVtKCkpOworICB9CisgIENQREZfRm9udCogcERlZkZvbnQgPSBwRG9jLT5Mb2FkRm9udChwRm9udERpY3QpOworICBpZiAoIXBEZWZGb250KQorICAgIHJldHVybjsKKworICBDRlhfRmxvYXRSZWN0IHJjQW5ub3QgPSBwQW5ub3REaWN0LT5HZXRSZWN0Rm9yKCJSZWN0Iik7CisgIGludDMyX3QgblJvdGF0ZSA9IDA7CisgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBNS0RpY3QgPSBwQW5ub3REaWN0LT5HZXREaWN0Rm9yKCJNSyIpKQorICAgIG5Sb3RhdGUgPSBwTUtEaWN0LT5HZXRJbnRlZ2VyRm9yKCJSIik7CisKKyAgQ0ZYX0Zsb2F0UmVjdCByY0JCb3g7CisgIENGWF9NYXRyaXggbWF0cml4OworICBzd2l0Y2ggKG5Sb3RhdGUgJSAzNjApIHsKKyAgICBjYXNlIDA6CisgICAgICByY0JCb3ggPSBDRlhfRmxvYXRSZWN0KDAsIDAsIHJjQW5ub3QucmlnaHQgLSByY0Fubm90LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQW5ub3QudG9wIC0gcmNBbm5vdC5ib3R0b20pOworICAgICAgYnJlYWs7CisgICAgY2FzZSA5MDoKKyAgICAgIG1hdHJpeCA9IENGWF9NYXRyaXgoMCwgMSwgLTEsIDAsIHJjQW5ub3QucmlnaHQgLSByY0Fubm90LmxlZnQsIDApOworICAgICAgcmNCQm94ID0gQ0ZYX0Zsb2F0UmVjdCgwLCAwLCByY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTgwOgorICAgICAgbWF0cml4ID0gQ0ZYX01hdHJpeCgtMSwgMCwgMCwgLTEsIHJjQW5ub3QucmlnaHQgLSByY0Fubm90LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQW5ub3QudG9wIC0gcmNBbm5vdC5ib3R0b20pOworICAgICAgcmNCQm94ID0gQ0ZYX0Zsb2F0UmVjdCgwLCAwLCByY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0Fubm90LnRvcCAtIHJjQW5ub3QuYm90dG9tKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjcwOgorICAgICAgbWF0cml4ID0gQ0ZYX01hdHJpeCgwLCAtMSwgMSwgMCwgMCwgcmNBbm5vdC50b3AgLSByY0Fubm90LmJvdHRvbSk7CisgICAgICByY0JCb3ggPSBDRlhfRmxvYXRSZWN0KDAsIDAsIHJjQW5ub3QudG9wIC0gcmNBbm5vdC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQW5ub3QucmlnaHQgLSByY0Fubm90LmxlZnQpOworICAgICAgYnJlYWs7CisgIH0KKworICBCb3JkZXJTdHlsZSBuQm9yZGVyU3R5bGUgPSBCb3JkZXJTdHlsZTo6U09MSUQ7CisgIGZsb2F0IGZCb3JkZXJXaWR0aCA9IDE7CisgIENQVlRfRGFzaCBkc0JvcmRlcigzLCAwLCAwKTsKKyAgQ0ZYX0NvbG9yIGNyTGVmdFRvcDsKKyAgQ0ZYX0NvbG9yIGNyUmlnaHRCb3R0b207CisgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBCU0RpY3QgPSBwQW5ub3REaWN0LT5HZXREaWN0Rm9yKCJCUyIpKSB7CisgICAgaWYgKHBCU0RpY3QtPktleUV4aXN0KCJXIikpCisgICAgICBmQm9yZGVyV2lkdGggPSBwQlNEaWN0LT5HZXROdW1iZXJGb3IoIlciKTsKKworICAgIGlmIChDUERGX0FycmF5KiBwQXJyYXkgPSBwQlNEaWN0LT5HZXRBcnJheUZvcigiRCIpKSB7CisgICAgICBkc0JvcmRlciA9IENQVlRfRGFzaChwQXJyYXktPkdldEludGVnZXJBdCgwKSwgcEFycmF5LT5HZXRJbnRlZ2VyQXQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXJyYXktPkdldEludGVnZXJBdCgyKSk7CisgICAgfQorICAgIGlmIChwQlNEaWN0LT5HZXRTdHJpbmdGb3IoIlMiKS5HZXRMZW5ndGgoKSkgeworICAgICAgc3dpdGNoIChwQlNEaWN0LT5HZXRTdHJpbmdGb3IoIlMiKVswXSkgeworICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICBuQm9yZGVyU3R5bGUgPSBCb3JkZXJTdHlsZTo6U09MSUQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgIG5Cb3JkZXJTdHlsZSA9IEJvcmRlclN0eWxlOjpEQVNIOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdCJzoKKyAgICAgICAgICBuQm9yZGVyU3R5bGUgPSBCb3JkZXJTdHlsZTo6QkVWRUxFRDsKKyAgICAgICAgICBmQm9yZGVyV2lkdGggKj0gMjsKKyAgICAgICAgICBjckxlZnRUb3AgPSBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprR3JheSwgMSk7CisgICAgICAgICAgY3JSaWdodEJvdHRvbSA9IENGWF9Db2xvcihDRlhfQ29sb3I6OmtHcmF5LCAwLjUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdJJzoKKyAgICAgICAgICBuQm9yZGVyU3R5bGUgPSBCb3JkZXJTdHlsZTo6SU5TRVQ7CisgICAgICAgICAgZkJvcmRlcldpZHRoICo9IDI7CisgICAgICAgICAgY3JMZWZ0VG9wID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIDAuNSk7CisgICAgICAgICAgY3JSaWdodEJvdHRvbSA9IENGWF9Db2xvcihDRlhfQ29sb3I6OmtHcmF5LCAwLjc1KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnVSc6CisgICAgICAgICAgbkJvcmRlclN0eWxlID0gQm9yZGVyU3R5bGU6OlVOREVSTElORTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KICAgICB9CiAgIH0KLSAgcmV0dXJuIHNXb3JkOwotfQotCi0vLyBTdGF0aWMuCi1DRlhfQnl0ZVN0cmluZyBDUFZUX0dlbmVyYXRlQVA6OkdldFdvcmRSZW5kZXJTdHJpbmcoCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cldvcmRzKSB7Ci0gIGlmIChzdHJXb3Jkcy5HZXRMZW5ndGgoKSA+IDApCi0gICAgcmV0dXJuIFBERl9FbmNvZGVTdHJpbmcoc3RyV29yZHMpICsgIiBUalxuIjsKLSAgcmV0dXJuICIiOwotfQotCi0vLyBTdGF0aWMuCi1DRlhfQnl0ZVN0cmluZyBDUFZUX0dlbmVyYXRlQVA6OkdldEZvbnRTZXRTdHJpbmcoSVBWVF9Gb250TWFwKiBwRm9udE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Gb250SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplKSB7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBzUmV0OwotICBpZiAocEZvbnRNYXApIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBzRm9udEFsaWFzID0gcEZvbnRNYXAtPkdldFBERkZvbnRBbGlhcyhuRm9udEluZGV4KTsKLSAgICBpZiAoc0ZvbnRBbGlhcy5HZXRMZW5ndGgoKSA+IDAgJiYgZkZvbnRTaXplID4gMCkKLSAgICAgIHNSZXQgPDwgIi8iIDw8IHNGb250QWxpYXMgPDwgIiAiIDw8IGZGb250U2l6ZSA8PCAiIFRmXG4iOworICBDRlhfQ29sb3IgY3JCb3JkZXI7CisgIENGWF9Db2xvciBjckJHOworICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwTUtEaWN0ID0gcEFubm90RGljdC0+R2V0RGljdEZvcigiTUsiKSkgeworICAgIGlmIChDUERGX0FycmF5KiBwQXJyYXkgPSBwTUtEaWN0LT5HZXRBcnJheUZvcigiQkMiKSkKKyAgICAgIGNyQm9yZGVyID0gQ0ZYX0NvbG9yOjpQYXJzZUNvbG9yKCpwQXJyYXkpOworICAgIGlmIChDUERGX0FycmF5KiBwQXJyYXkgPSBwTUtEaWN0LT5HZXRBcnJheUZvcigiQkciKSkKKyAgICAgIGNyQkcgPSBDRlhfQ29sb3I6OlBhcnNlQ29sb3IoKnBBcnJheSk7CiAgIH0KLSAgcmV0dXJuIHNSZXQuTWFrZVN0cmluZygpOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc0FwcFN0cmVhbTsKKyAgQnl0ZVN0cmluZyBzQkcgPSBHZW5lcmF0ZUNvbG9yQVAoY3JCRywgUGFpbnRPcGVyYXRpb246OkZJTEwpOworICBpZiAoc0JHLkdldExlbmd0aCgpID4gMCkgeworICAgIHNBcHBTdHJlYW0gPDwgInFcbiIKKyAgICAgICAgICAgICAgIDw8IHNCRyA8PCByY0JCb3gubGVmdCA8PCAiICIgPDwgcmNCQm94LmJvdHRvbSA8PCAiICIKKyAgICAgICAgICAgICAgIDw8IHJjQkJveC5XaWR0aCgpIDw8ICIgIiA8PCByY0JCb3guSGVpZ2h0KCkgPDwgIiByZSBmXG4iCisgICAgICAgICAgICAgICA8PCAiUVxuIjsKKyAgfQorICBCeXRlU3RyaW5nIHNCb3JkZXJTdHJlYW0gPQorICAgICAgR2VuZXJhdGVCb3JkZXJBUChyY0JCb3gsIGZCb3JkZXJXaWR0aCwgY3JCb3JkZXIsIGNyTGVmdFRvcCwgY3JSaWdodEJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgbkJvcmRlclN0eWxlLCBkc0JvcmRlcik7CisgIGlmIChzQm9yZGVyU3RyZWFtLkdldExlbmd0aCgpID4gMCkKKyAgICBzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IHNCb3JkZXJTdHJlYW0gPDwgIlFcbiI7CisKKyAgQ0ZYX0Zsb2F0UmVjdCByY0JvZHkgPQorICAgICAgQ0ZYX0Zsb2F0UmVjdChyY0JCb3gubGVmdCArIGZCb3JkZXJXaWR0aCwgcmNCQm94LmJvdHRvbSArIGZCb3JkZXJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgcmNCQm94LnJpZ2h0IC0gZkJvcmRlcldpZHRoLCByY0JCb3gudG9wIC0gZkJvcmRlcldpZHRoKTsKKyAgcmNCb2R5Lk5vcm1hbGl6ZSgpOworCisgIENQREZfRGljdGlvbmFyeSogcEFQRGljdCA9IHBBbm5vdERpY3QtPkdldERpY3RGb3IoIkFQIik7CisgIGlmICghcEFQRGljdCkKKyAgICBwQVBEaWN0ID0gcEFubm90RGljdC0+U2V0TmV3Rm9yPENQREZfRGljdGlvbmFyeT4oIkFQIik7CisKKyAgQ1BERl9TdHJlYW0qIHBOb3JtYWxTdHJlYW0gPSBwQVBEaWN0LT5HZXRTdHJlYW1Gb3IoIk4iKTsKKyAgaWYgKCFwTm9ybWFsU3RyZWFtKSB7CisgICAgcE5vcm1hbFN0cmVhbSA9IHBEb2MtPk5ld0luZGlyZWN0PENQREZfU3RyZWFtPigpOworICAgIHBBUERpY3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIk4iLCBwRG9jLCBwTm9ybWFsU3RyZWFtLT5HZXRPYmpOdW0oKSk7CisgIH0KKyAgQ1BERl9EaWN0aW9uYXJ5KiBwU3RyZWFtRGljdCA9IHBOb3JtYWxTdHJlYW0tPkdldERpY3QoKTsKKyAgaWYgKHBTdHJlYW1EaWN0KSB7CisgICAgcFN0cmVhbURpY3QtPlNldE1hdHJpeEZvcigiTWF0cml4IiwgbWF0cml4KTsKKyAgICBwU3RyZWFtRGljdC0+U2V0UmVjdEZvcigiQkJveCIsIHJjQkJveCk7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3RyZWFtUmVzTGlzdCA9IHBTdHJlYW1EaWN0LT5HZXREaWN0Rm9yKCJSZXNvdXJjZXMiKTsKKyAgICBpZiAocFN0cmVhbVJlc0xpc3QpIHsKKyAgICAgIENQREZfRGljdGlvbmFyeSogcFN0cmVhbVJlc0ZvbnRMaXN0ID0gcFN0cmVhbVJlc0xpc3QtPkdldERpY3RGb3IoIkZvbnQiKTsKKyAgICAgIGlmICghcFN0cmVhbVJlc0ZvbnRMaXN0KQorICAgICAgICBwU3RyZWFtUmVzRm9udExpc3QgPSBwU3RyZWFtUmVzTGlzdC0+U2V0TmV3Rm9yPENQREZfRGljdGlvbmFyeT4oIkZvbnQiKTsKKyAgICAgIGlmICghcFN0cmVhbVJlc0ZvbnRMaXN0LT5LZXlFeGlzdChzRm9udE5hbWUpKSB7CisgICAgICAgIHBTdHJlYW1SZXNGb250TGlzdC0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPihzRm9udE5hbWUsIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9udERpY3QtPkdldE9iak51bSgpKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcFN0cmVhbURpY3QtPlNldEZvcigiUmVzb3VyY2VzIiwgcEZvcm1EaWN0LT5HZXREaWN0Rm9yKCJEUiIpLT5DbG9uZSgpKTsKKyAgICAgIHBTdHJlYW1SZXNMaXN0ID0gcFN0cmVhbURpY3QtPkdldERpY3RGb3IoIlJlc291cmNlcyIpOworICAgIH0KKyAgfQorICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIENQVlRfR2VuZXJhdGVBUDo6a1RleHRGaWVsZDogeworICAgICAgV2lkZVN0cmluZyBzd1ZhbHVlID0KKyAgICAgICAgICBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiViIpCisgICAgICAgICAgICAgID8gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIlYiKS0+R2V0VW5pY29kZVRleHQoKQorICAgICAgICAgICAgICA6IFdpZGVTdHJpbmcoKTsKKyAgICAgIGludDMyX3QgbkFsaWduID0gRlBERl9HZXRGaWVsZEF0dHIocEFubm90RGljdCwgIlEiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiUSIpLT5HZXRJbnRlZ2VyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgICAgIHVpbnQzMl90IGR3RmxhZ3MgPSBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiRmYiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJGZiIpLT5HZXRJbnRlZ2VyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwOworICAgICAgdWludDMyX3QgZHdNYXhMZW4gPQorICAgICAgICAgIEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJNYXhMZW4iKQorICAgICAgICAgICAgICA/IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJNYXhMZW4iKS0+R2V0SW50ZWdlcigpCisgICAgICAgICAgICAgIDogMDsKKyAgICAgIENQVlRfRm9udE1hcCBtYXAoCisgICAgICAgICAgcERvYywgcFN0cmVhbURpY3QgPyBwU3RyZWFtRGljdC0+R2V0RGljdEZvcigiUmVzb3VyY2VzIikgOiBudWxscHRyLAorICAgICAgICAgIHBEZWZGb250LCBzRm9udE5hbWUuUmlnaHQoc0ZvbnROYW1lLkdldExlbmd0aCgpIC0gMSkpOworICAgICAgQ1BERl9WYXJpYWJsZVRleHQ6OlByb3ZpZGVyIHByZCgmbWFwKTsKKyAgICAgIENQREZfVmFyaWFibGVUZXh0IHZ0OworICAgICAgdnQuU2V0UHJvdmlkZXIoJnByZCk7CisgICAgICB2dC5TZXRQbGF0ZVJlY3QocmNCb2R5KTsKKyAgICAgIHZ0LlNldEFsaWdubWVudChuQWxpZ24pOworICAgICAgaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpCisgICAgICAgIHZ0LlNldEF1dG9Gb250U2l6ZSh0cnVlKTsKKyAgICAgIGVsc2UKKyAgICAgICAgdnQuU2V0Rm9udFNpemUoZkZvbnRTaXplKTsKKworICAgICAgYm9vbCBiTXVsdGlMaW5lID0gKGR3RmxhZ3MgPj4gMTIpICYgMTsKKyAgICAgIGlmIChiTXVsdGlMaW5lKSB7CisgICAgICAgIHZ0LlNldE11bHRpTGluZSh0cnVlKTsKKyAgICAgICAgdnQuU2V0QXV0b1JldHVybih0cnVlKTsKKyAgICAgIH0KKyAgICAgIHVpbnQxNl90IHN1YldvcmQgPSAwOworICAgICAgaWYgKChkd0ZsYWdzID4+IDEzKSAmIDEpIHsKKyAgICAgICAgc3ViV29yZCA9ICcqJzsKKyAgICAgICAgdnQuU2V0UGFzc3dvcmRDaGFyKHN1YldvcmQpOworICAgICAgfQorICAgICAgYm9vbCBiQ2hhckFycmF5ID0gKGR3RmxhZ3MgPj4gMjQpICYgMTsKKyAgICAgIGlmIChiQ2hhckFycmF5KQorICAgICAgICB2dC5TZXRDaGFyQXJyYXkoZHdNYXhMZW4pOworICAgICAgZWxzZQorICAgICAgICB2dC5TZXRMaW1pdENoYXIoZHdNYXhMZW4pOworCisgICAgICB2dC5Jbml0aWFsaXplKCk7CisgICAgICB2dC5TZXRUZXh0KHN3VmFsdWUpOworICAgICAgdnQuUmVhcnJhbmdlQWxsKCk7CisgICAgICBDRlhfRmxvYXRSZWN0IHJjQ29udGVudCA9IHZ0LkdldENvbnRlbnRSZWN0KCk7CisgICAgICBDRlhfUG9pbnRGIHB0T2Zmc2V0OworICAgICAgaWYgKCFiTXVsdGlMaW5lKSB7CisgICAgICAgIHB0T2Zmc2V0ID0KKyAgICAgICAgICAgIENGWF9Qb2ludEYoMC4wZiwgKHJjQ29udGVudC5IZWlnaHQoKSAtIHJjQm9keS5IZWlnaHQoKSkgLyAyLjBmKTsKKyAgICAgIH0KKyAgICAgIEJ5dGVTdHJpbmcgc0JvZHkgPSBHZW5lcmF0ZUVkaXRBUCgmbWFwLCB2dC5HZXRJdGVyYXRvcigpLCBwdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhYkNoYXJBcnJheSwgc3ViV29yZCk7CisgICAgICBpZiAoc0JvZHkuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIHNBcHBTdHJlYW0gPDwgIi9UeCBCTUNcbiIKKyAgICAgICAgICAgICAgICAgICA8PCAicVxuIjsKKyAgICAgICAgaWYgKHJjQ29udGVudC5XaWR0aCgpID4gcmNCb2R5LldpZHRoKCkgfHwKKyAgICAgICAgICAgIHJjQ29udGVudC5IZWlnaHQoKSA+IHJjQm9keS5IZWlnaHQoKSkgeworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgcmNCb2R5LmxlZnQgPDwgIiAiIDw8IHJjQm9keS5ib3R0b20gPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCByY0JvZHkuV2lkdGgoKSA8PCAiICIgPDwgcmNCb2R5LkhlaWdodCgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiIHJlXG5XXG5uXG4iOworICAgICAgICB9CisgICAgICAgIHNBcHBTdHJlYW0gPDwgIkJUXG4iCisgICAgICAgICAgICAgICAgICAgPDwgR2VuZXJhdGVDb2xvckFQKGNyVGV4dCwgUGFpbnRPcGVyYXRpb246OkZJTEwpIDw8IHNCb2R5CisgICAgICAgICAgICAgICAgICAgPDwgIkVUXG4iCisgICAgICAgICAgICAgICAgICAgPDwgIlFcbkVNQ1xuIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIENQVlRfR2VuZXJhdGVBUDo6a0NvbWJvQm94OiB7CisgICAgICBXaWRlU3RyaW5nIHN3VmFsdWUgPQorICAgICAgICAgIEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJWIikKKyAgICAgICAgICAgICAgPyBGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiViIpLT5HZXRVbmljb2RlVGV4dCgpCisgICAgICAgICAgICAgIDogV2lkZVN0cmluZygpOworICAgICAgQ1BWVF9Gb250TWFwIG1hcCgKKyAgICAgICAgICBwRG9jLCBwU3RyZWFtRGljdCA/IHBTdHJlYW1EaWN0LT5HZXREaWN0Rm9yKCJSZXNvdXJjZXMiKSA6IG51bGxwdHIsCisgICAgICAgICAgcERlZkZvbnQsIHNGb250TmFtZS5SaWdodChzRm9udE5hbWUuR2V0TGVuZ3RoKCkgLSAxKSk7CisgICAgICBDUERGX1ZhcmlhYmxlVGV4dDo6UHJvdmlkZXIgcHJkKCZtYXApOworICAgICAgQ1BERl9WYXJpYWJsZVRleHQgdnQ7CisgICAgICB2dC5TZXRQcm92aWRlcigmcHJkKTsKKyAgICAgIENGWF9GbG9hdFJlY3QgcmNCdXR0b24gPSByY0JvZHk7CisgICAgICByY0J1dHRvbi5sZWZ0ID0gcmNCdXR0b24ucmlnaHQgLSAxMzsKKyAgICAgIHJjQnV0dG9uLk5vcm1hbGl6ZSgpOworICAgICAgQ0ZYX0Zsb2F0UmVjdCByY0VkaXQgPSByY0JvZHk7CisgICAgICByY0VkaXQucmlnaHQgPSByY0J1dHRvbi5sZWZ0OworICAgICAgcmNFZGl0Lk5vcm1hbGl6ZSgpOworICAgICAgdnQuU2V0UGxhdGVSZWN0KHJjRWRpdCk7CisgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkKKyAgICAgICAgdnQuU2V0QXV0b0ZvbnRTaXplKHRydWUpOworICAgICAgZWxzZQorICAgICAgICB2dC5TZXRGb250U2l6ZShmRm9udFNpemUpOworCisgICAgICB2dC5Jbml0aWFsaXplKCk7CisgICAgICB2dC5TZXRUZXh0KHN3VmFsdWUpOworICAgICAgdnQuUmVhcnJhbmdlQWxsKCk7CisgICAgICBDRlhfRmxvYXRSZWN0IHJjQ29udGVudCA9IHZ0LkdldENvbnRlbnRSZWN0KCk7CisgICAgICBDRlhfUG9pbnRGIHB0T2Zmc2V0ID0KKyAgICAgICAgICBDRlhfUG9pbnRGKDAuMGYsIChyY0NvbnRlbnQuSGVpZ2h0KCkgLSByY0VkaXQuSGVpZ2h0KCkpIC8gMi4wZik7CisgICAgICBCeXRlU3RyaW5nIHNFZGl0ID0KKyAgICAgICAgICBHZW5lcmF0ZUVkaXRBUCgmbWFwLCB2dC5HZXRJdGVyYXRvcigpLCBwdE9mZnNldCwgdHJ1ZSwgMCk7CisgICAgICBpZiAoc0VkaXQuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgIHNBcHBTdHJlYW0gPDwgIi9UeCBCTUNcbiIKKyAgICAgICAgICAgICAgICAgICA8PCAicVxuIjsKKyAgICAgICAgc0FwcFN0cmVhbSA8PCByY0VkaXQubGVmdCA8PCAiICIgPDwgcmNFZGl0LmJvdHRvbSA8PCAiICIKKyAgICAgICAgICAgICAgICAgICA8PCByY0VkaXQuV2lkdGgoKSA8PCAiICIgPDwgcmNFZGl0LkhlaWdodCgpIDw8ICIgcmVcbldcbm5cbiI7CisgICAgICAgIHNBcHBTdHJlYW0gPDwgIkJUXG4iCisgICAgICAgICAgICAgICAgICAgPDwgR2VuZXJhdGVDb2xvckFQKGNyVGV4dCwgUGFpbnRPcGVyYXRpb246OkZJTEwpIDw8IHNFZGl0CisgICAgICAgICAgICAgICAgICAgPDwgIkVUXG4iCisgICAgICAgICAgICAgICAgICAgPDwgIlFcbkVNQ1xuIjsKKyAgICAgIH0KKyAgICAgIEJ5dGVTdHJpbmcgc0J1dHRvbiA9CisgICAgICAgICAgR2VuZXJhdGVDb2xvckFQKENGWF9Db2xvcihDRlhfQ29sb3I6OmtSR0IsIDIyMC4wZiAvIDI1NS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMC4wZiAvIDI1NS4wZiwgMjIwLjBmIC8gMjU1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnRPcGVyYXRpb246OkZJTEwpOworICAgICAgaWYgKHNCdXR0b24uR2V0TGVuZ3RoKCkgPiAwICYmICFyY0J1dHRvbi5Jc0VtcHR5KCkpIHsKKyAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQnV0dG9uOworICAgICAgICBzQXBwU3RyZWFtIDw8IHJjQnV0dG9uLmxlZnQgPDwgIiAiIDw8IHJjQnV0dG9uLmJvdHRvbSA8PCAiICIKKyAgICAgICAgICAgICAgICAgICA8PCByY0J1dHRvbi5XaWR0aCgpIDw8ICIgIiA8PCByY0J1dHRvbi5IZWlnaHQoKSA8PCAiIHJlIGZcbiI7CisgICAgICAgIHNBcHBTdHJlYW0gPDwgIlFcbiI7CisgICAgICAgIEJ5dGVTdHJpbmcgc0J1dHRvbkJvcmRlciA9IEdlbmVyYXRlQm9yZGVyQVAoCisgICAgICAgICAgICByY0J1dHRvbiwgMiwgQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIDApLAorICAgICAgICAgICAgQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIDEpLCBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprR3JheSwgMC41KSwKKyAgICAgICAgICAgIEJvcmRlclN0eWxlOjpCRVZFTEVELCBDUFZUX0Rhc2goMywgMCwgMCkpOworICAgICAgICBpZiAoc0J1dHRvbkJvcmRlci5HZXRMZW5ndGgoKSA+IDApCisgICAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQnV0dG9uQm9yZGVyIDw8ICJRXG4iOworCisgICAgICAgIENGWF9Qb2ludEYgcHRDZW50ZXIgPSBDRlhfUG9pbnRGKChyY0J1dHRvbi5sZWZ0ICsgcmNCdXR0b24ucmlnaHQpIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJjQnV0dG9uLnRvcCArIHJjQnV0dG9uLmJvdHRvbSkgLyAyKTsKKyAgICAgICAgaWYgKElzRmxvYXRCaWdnZXIocmNCdXR0b24uV2lkdGgoKSwgNikgJiYKKyAgICAgICAgICAgIElzRmxvYXRCaWdnZXIocmNCdXR0b24uSGVpZ2h0KCksIDYpKSB7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIgorICAgICAgICAgICAgICAgICAgICAgPDwgIiAwIGdcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBwdENlbnRlci54IC0gMyA8PCAiICIgPDwgcHRDZW50ZXIueSArIDEuNWYgPDwgIiBtXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgcHRDZW50ZXIueCArIDMgPDwgIiAiIDw8IHB0Q2VudGVyLnkgKyAxLjVmIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggPDwgIiAiIDw8IHB0Q2VudGVyLnkgLSAxLjVmIDw8ICIgbFxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggLSAzIDw8ICIgIiA8PCBwdENlbnRlci55ICsgMS41ZiA8PCAiIGwgZlxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNCdXR0b24gPDwgIlFcbiI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIENQVlRfR2VuZXJhdGVBUDo6a0xpc3RCb3g6IHsKKyAgICAgIENQVlRfRm9udE1hcCBtYXAoCisgICAgICAgICAgcERvYywgcFN0cmVhbURpY3QgPyBwU3RyZWFtRGljdC0+R2V0RGljdEZvcigiUmVzb3VyY2VzIikgOiBudWxscHRyLAorICAgICAgICAgIHBEZWZGb250LCBzRm9udE5hbWUuUmlnaHQoc0ZvbnROYW1lLkdldExlbmd0aCgpIC0gMSkpOworICAgICAgQ1BERl9WYXJpYWJsZVRleHQ6OlByb3ZpZGVyIHByZCgmbWFwKTsKKyAgICAgIENQREZfQXJyYXkqIHBPcHRzID0gVG9BcnJheShGUERGX0dldEZpZWxkQXR0cihwQW5ub3REaWN0LCAiT3B0IikpOworICAgICAgQ1BERl9BcnJheSogcFNlbHMgPSBUb0FycmF5KEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJJIikpOworICAgICAgQ1BERl9PYmplY3QqIHBUaSA9IEZQREZfR2V0RmllbGRBdHRyKHBBbm5vdERpY3QsICJUSSIpOworICAgICAgaW50MzJfdCBuVG9wID0gcFRpID8gcFRpLT5HZXRJbnRlZ2VyKCkgOiAwOworICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHNCb2R5OworICAgICAgaWYgKHBPcHRzKSB7CisgICAgICAgIGZsb2F0IGZ5ID0gcmNCb2R5LnRvcDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IG5Ub3AsIHN6ID0gcE9wdHMtPkdldENvdW50KCk7IGkgPCBzejsgaSsrKSB7CisgICAgICAgICAgaWYgKElzRmxvYXRTbWFsbGVyKGZ5LCByY0JvZHkuYm90dG9tKSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgaWYgKENQREZfT2JqZWN0KiBwT3B0ID0gcE9wdHMtPkdldERpcmVjdE9iamVjdEF0KGkpKSB7CisgICAgICAgICAgICBXaWRlU3RyaW5nIHN3SXRlbTsKKyAgICAgICAgICAgIGlmIChwT3B0LT5Jc1N0cmluZygpKQorICAgICAgICAgICAgICBzd0l0ZW0gPSBwT3B0LT5HZXRVbmljb2RlVGV4dCgpOworICAgICAgICAgICAgZWxzZSBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcE9wdC0+QXNBcnJheSgpKQorICAgICAgICAgICAgICBzd0l0ZW0gPSBwQXJyYXktPkdldERpcmVjdE9iamVjdEF0KDEpLT5HZXRVbmljb2RlVGV4dCgpOworCisgICAgICAgICAgICBib29sIGJTZWxlY3RlZCA9IGZhbHNlOworICAgICAgICAgICAgaWYgKHBTZWxzKSB7CisgICAgICAgICAgICAgIGZvciAoc2l6ZV90IHMgPSAwLCBzc3ogPSBwU2Vscy0+R2V0Q291bnQoKTsgcyA8IHNzejsgcysrKSB7CisgICAgICAgICAgICAgICAgaW50IHZhbHVlID0gcFNlbHMtPkdldEludGVnZXJBdChzKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPj0gMCAmJiBpID09IHN0YXRpY19jYXN0PHNpemVfdD4odmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICBiU2VsZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDUERGX1ZhcmlhYmxlVGV4dCB2dDsKKyAgICAgICAgICAgIHZ0LlNldFByb3ZpZGVyKCZwcmQpOworICAgICAgICAgICAgdnQuU2V0UGxhdGVSZWN0KAorICAgICAgICAgICAgICAgIENGWF9GbG9hdFJlY3QocmNCb2R5LmxlZnQsIDAuMGYsIHJjQm9keS5yaWdodCwgMC4wZikpOworICAgICAgICAgICAgdnQuU2V0Rm9udFNpemUoSXNGbG9hdFplcm8oZkZvbnRTaXplKSA/IDEyLjBmIDogZkZvbnRTaXplKTsKKworICAgICAgICAgICAgdnQuSW5pdGlhbGl6ZSgpOworICAgICAgICAgICAgdnQuU2V0VGV4dChzd0l0ZW0pOworICAgICAgICAgICAgdnQuUmVhcnJhbmdlQWxsKCk7CisgICAgICAgICAgICBmbG9hdCBmSXRlbUhlaWdodCA9IHZ0LkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7CisgICAgICAgICAgICBpZiAoYlNlbGVjdGVkKSB7CisgICAgICAgICAgICAgIENGWF9GbG9hdFJlY3QgcmNJdGVtID0gQ0ZYX0Zsb2F0UmVjdCgKKyAgICAgICAgICAgICAgICAgIHJjQm9keS5sZWZ0LCBmeSAtIGZJdGVtSGVpZ2h0LCByY0JvZHkucmlnaHQsIGZ5KTsKKyAgICAgICAgICAgICAgc0JvZHkgPDwgInFcbiIKKyAgICAgICAgICAgICAgICAgICAgPDwgR2VuZXJhdGVDb2xvckFQKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a1JHQiwgMCwgNTEuMGYgLyAyNTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEzLjBmIC8gMjU1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhaW50T3BlcmF0aW9uOjpGSUxMKQorICAgICAgICAgICAgICAgICAgICA8PCByY0l0ZW0ubGVmdCA8PCAiICIgPDwgcmNJdGVtLmJvdHRvbSA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgPDwgcmNJdGVtLldpZHRoKCkgPDwgIiAiIDw8IHJjSXRlbS5IZWlnaHQoKSA8PCAiIHJlIGZcbiIKKyAgICAgICAgICAgICAgICAgICAgPDwgIlFcbiI7CisgICAgICAgICAgICAgIHNCb2R5IDw8ICJCVFxuIgorICAgICAgICAgICAgICAgICAgICA8PCBHZW5lcmF0ZUNvbG9yQVAoQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFpbnRPcGVyYXRpb246OkZJTEwpCisgICAgICAgICAgICAgICAgICAgIDw8IEdlbmVyYXRlRWRpdEFQKCZtYXAsIHZ0LkdldEl0ZXJhdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYoMC4wZiwgZnkpLCB0cnVlLCAwKQorICAgICAgICAgICAgICAgICAgICA8PCAiRVRcbiI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzQm9keSA8PCAiQlRcbiIKKyAgICAgICAgICAgICAgICAgICAgPDwgR2VuZXJhdGVDb2xvckFQKGNyVGV4dCwgUGFpbnRPcGVyYXRpb246OkZJTEwpCisgICAgICAgICAgICAgICAgICAgIDw8IEdlbmVyYXRlRWRpdEFQKCZtYXAsIHZ0LkdldEl0ZXJhdG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYoMC4wZiwgZnkpLCB0cnVlLCAwKQorICAgICAgICAgICAgICAgICAgICA8PCAiRVRcbiI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmeSAtPSBmSXRlbUhlaWdodDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzQm9keS50ZWxscCgpID4gMCkgeworICAgICAgICBzQXBwU3RyZWFtIDw8ICIvVHggQk1DXG5xXG4iCisgICAgICAgICAgICAgICAgICAgPDwgcmNCb2R5LmxlZnQgPDwgIiAiIDw8IHJjQm9keS5ib3R0b20gPDwgIiAiCisgICAgICAgICAgICAgICAgICAgPDwgcmNCb2R5LldpZHRoKCkgPDwgIiAiIDw8IHJjQm9keS5IZWlnaHQoKSA8PCAiIHJlXG5XXG5uXG4iCisgICAgICAgICAgICAgICAgICAgPDwgc0JvZHkuc3RyKCkgPDwgIlFcbkVNQ1xuIjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChwTm9ybWFsU3RyZWFtKSB7CisgICAgcE5vcm1hbFN0cmVhbS0+U2V0RGF0YUFuZFJlbW92ZUZpbHRlcigmc0FwcFN0cmVhbSk7CisgICAgcFN0cmVhbURpY3QgPSBwTm9ybWFsU3RyZWFtLT5HZXREaWN0KCk7CisgICAgaWYgKHBTdHJlYW1EaWN0KSB7CisgICAgICBwU3RyZWFtRGljdC0+U2V0TWF0cml4Rm9yKCJNYXRyaXgiLCBtYXRyaXgpOworICAgICAgcFN0cmVhbURpY3QtPlNldFJlY3RGb3IoIkJCb3giLCByY0JCb3gpOworICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3RyZWFtUmVzTGlzdCA9IHBTdHJlYW1EaWN0LT5HZXREaWN0Rm9yKCJSZXNvdXJjZXMiKTsKKyAgICAgIGlmIChwU3RyZWFtUmVzTGlzdCkgeworICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1SZXNGb250TGlzdCA9CisgICAgICAgICAgICBwU3RyZWFtUmVzTGlzdC0+R2V0RGljdEZvcigiRm9udCIpOworICAgICAgICBpZiAoIXBTdHJlYW1SZXNGb250TGlzdCkgeworICAgICAgICAgIHBTdHJlYW1SZXNGb250TGlzdCA9CisgICAgICAgICAgICAgIHBTdHJlYW1SZXNMaXN0LT5TZXROZXdGb3I8Q1BERl9EaWN0aW9uYXJ5PigiRm9udCIpOworICAgICAgICB9CisgICAgICAgIGlmICghcFN0cmVhbVJlc0ZvbnRMaXN0LT5LZXlFeGlzdChzRm9udE5hbWUpKSB7CisgICAgICAgICAgcFN0cmVhbVJlc0ZvbnRMaXN0LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KHNGb250TmFtZSwgcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvbnREaWN0LT5HZXRPYmpOdW0oKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBTdHJlYW1EaWN0LT5TZXRGb3IoIlJlc291cmNlcyIsIHBGb3JtRGljdC0+R2V0RGljdEZvcigiRFIiKS0+Q2xvbmUoKSk7CisgICAgICAgIHBTdHJlYW1SZXNMaXN0ID0gcFN0cmVhbURpY3QtPkdldERpY3RGb3IoIlJlc291cmNlcyIpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm47Cit9CisKKy8vIHN0YXRpYwordm9pZCBDUFZUX0dlbmVyYXRlQVA6OkdlbmVyYXRlRW1wdHlBUChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpIHsKKyAgYXV0byBwRXh0R1N0YXRlRGljdCA9IEdlbmVyYXRlRXh0R1N0YXRlRGljdCgqcEFubm90RGljdCwgIkdTIiwgIk5vcm1hbCIpOworICBhdXRvIHBSZXNvdXJjZURpY3QgPQorICAgICAgR2VuZXJhdGVSZXNvdXJjZURpY3QocERvYywgc3RkOjptb3ZlKHBFeHRHU3RhdGVEaWN0KSwgbnVsbHB0cik7CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNTdHJlYW07CisgIEdlbmVyYXRlQW5kU2V0QVBEaWN0KHBEb2MsIHBBbm5vdERpY3QsICZzU3RyZWFtLCBzdGQ6Om1vdmUocFJlc291cmNlRGljdCksCisgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKK30KKworLy8gc3RhdGljCitib29sIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVBbm5vdEFQKENQREZfQW5ub3Q6OlN1YnR5cGUgc3VidHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KSB7CisgIHN3aXRjaCAoc3VidHlwZSkgeworICAgIGNhc2UgQ1BERl9Bbm5vdDo6U3VidHlwZTo6Q0lSQ0xFOgorICAgICAgcmV0dXJuIEdlbmVyYXRlQ2lyY2xlQVAocERvYywgcEFubm90RGljdCk7CisgICAgY2FzZSBDUERGX0Fubm90OjpTdWJ0eXBlOjpISUdITElHSFQ6CisgICAgICByZXR1cm4gR2VuZXJhdGVIaWdobGlnaHRBUChwRG9jLCBwQW5ub3REaWN0KTsKKyAgICBjYXNlIENQREZfQW5ub3Q6OlN1YnR5cGU6OklOSzoKKyAgICAgIHJldHVybiBHZW5lcmF0ZUlua0FQKHBEb2MsIHBBbm5vdERpY3QpOworICAgIGNhc2UgQ1BERl9Bbm5vdDo6U3VidHlwZTo6UE9QVVA6CisgICAgICByZXR1cm4gR2VuZXJhdGVQb3B1cEFQKHBEb2MsIHBBbm5vdERpY3QpOworICAgIGNhc2UgQ1BERl9Bbm5vdDo6U3VidHlwZTo6U1FVQVJFOgorICAgICAgcmV0dXJuIEdlbmVyYXRlU3F1YXJlQVAocERvYywgcEFubm90RGljdCk7CisgICAgY2FzZSBDUERGX0Fubm90OjpTdWJ0eXBlOjpTUVVJR0dMWToKKyAgICAgIHJldHVybiBHZW5lcmF0ZVNxdWlnZ2x5QVAocERvYywgcEFubm90RGljdCk7CisgICAgY2FzZSBDUERGX0Fubm90OjpTdWJ0eXBlOjpTVFJJS0VPVVQ6CisgICAgICByZXR1cm4gR2VuZXJhdGVTdHJpa2VPdXRBUChwRG9jLCBwQW5ub3REaWN0KTsKKyAgICBjYXNlIENQREZfQW5ub3Q6OlN1YnR5cGU6OlRFWFQ6CisgICAgICByZXR1cm4gR2VuZXJhdGVUZXh0QVAocERvYywgcEFubm90RGljdCk7CisgICAgY2FzZSBDUERGX0Fubm90OjpTdWJ0eXBlOjpVTkRFUkxJTkU6CisgICAgICByZXR1cm4gR2VuZXJhdGVVbmRlcmxpbmVBUChwRG9jLCBwQW5ub3REaWN0KTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9CiB9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3B2dF9nZW5lcmF0ZWFwLmggYi9jb3JlL2ZwZGZkb2MvY3B2dF9nZW5lcmF0ZWFwLmgKaW5kZXggNjJhODQ1My4uNmY1Njk5MyAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwdnRfZ2VuZXJhdGVhcC5oCisrKyBiL2NvcmUvZnBkZmRvYy9jcHZ0X2dlbmVyYXRlYXAuaApAQCAtNyw2OCArNywzMSBAQAogI2lmbmRlZiBDT1JFX0ZQREZET0NfQ1BWVF9HRU5FUkFURUFQX0hfCiAjZGVmaW5lIENPUkVfRlBERkRPQ19DUFZUX0dFTkVSQVRFQVBfSF8KIAorI2luY2x1ZGUgPG1lbW9yeT4KKwogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2RlZmF1bHRhcHBlYXJhbmNlLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfdmFyaWFibGV0ZXh0LmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwdnRfY29sb3IuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3B2dF9kYXNoLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2NvbG9yLmgiCiAKIGNsYXNzIENQREZfRGljdGlvbmFyeTsKIGNsYXNzIENQREZfRG9jdW1lbnQ7Ci1jbGFzcyBJUFZUX0ZvbnRNYXA7Ci0KLXN0cnVjdCBDUFZUX1dvcmRSYW5nZTsKLQotYm9vbCBGUERGX0dlbmVyYXRlQVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKK3N0cnVjdCBDUFZUX0Rhc2g7CiAKIGNsYXNzIENQVlRfR2VuZXJhdGVBUCB7CiAgcHVibGljOgotICBzdGF0aWMgYm9vbCBHZW5lcmF0ZUNpcmNsZUFQKENQREZfRG9jdW1lbnQqIHBEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKLSAgc3RhdGljIGJvb2wgR2VuZXJhdGVDb21ib0JveEFQKENQREZfRG9jdW1lbnQqIHBEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpOwotICBzdGF0aWMgYm9vbCBHZW5lcmF0ZUhpZ2hsaWdodEFQKENQREZfRG9jdW1lbnQqIHBEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKLSAgc3RhdGljIGJvb2wgR2VuZXJhdGVJbmtBUChDUERGX0RvY3VtZW50KiBwRG9jLCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpOwotICBzdGF0aWMgYm9vbCBHZW5lcmF0ZUxpc3RCb3hBUChDUERGX0RvY3VtZW50KiBwRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpOwotICBzdGF0aWMgYm9vbCBHZW5lcmF0ZVBvcHVwQVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKLSAgc3RhdGljIGJvb2wgR2VuZXJhdGVTcXVhcmVBUChDUERGX0RvY3VtZW50KiBwRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCk7Ci0gIHN0YXRpYyBib29sIEdlbmVyYXRlU3F1aWdnbHlBUChDUERGX0RvY3VtZW50KiBwRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKLSAgc3RhdGljIGJvb2wgR2VuZXJhdGVTdHJpa2VPdXRBUChDUERGX0RvY3VtZW50KiBwRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCk7Ci0gIHN0YXRpYyBib29sIEdlbmVyYXRlVGV4dEFQKENQREZfRG9jdW1lbnQqIHBEb2MsIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCk7Ci0gIHN0YXRpYyBib29sIEdlbmVyYXRlVGV4dEZpZWxkQVAoQ1BERl9Eb2N1bWVudCogcERvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpOwotICBzdGF0aWMgYm9vbCBHZW5lcmF0ZVVuZGVybGluZUFQKENQREZfRG9jdW1lbnQqIHBEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKLSAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdlbmVyYXRlRWRpdEFQKElQVlRfRm9udE1hcCogcEZvbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1ZhcmlhYmxlVGV4dDo6SXRlcmF0b3IqIHBJdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ29udGludW91cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFN1YldvcmQpOwotICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2VuZXJhdGVCb3JkZXJBUChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfQ29sb3ImIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX0NvbG9yJiBjckxlZnRUb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfQ29sb3ImIGNyUmlnaHRCb3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvcmRlclN0eWxlIG5TdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9EYXNoJiBkYXNoKTsKLSAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdlbmVyYXRlQ29sb3JBUChjb25zdCBDUFZUX0NvbG9yJiBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYWludE9wZXJhdGlvbiBuT3BlcmF0aW9uKTsKKyAgZW51bSBUeXBlIHsga1RleHRGaWVsZCwga0NvbWJvQm94LCBrTGlzdEJveCB9OwogCi0gIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRQREZXb3JkU3RyaW5nKElQVlRfRm9udE1hcCogcEZvbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZvbnRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgV29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgU3ViV29yZCk7Ci0gIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRXb3JkUmVuZGVyU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJXb3Jkcyk7Ci0gIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRGb250U2V0U3RyaW5nKElQVlRfRm9udE1hcCogcEZvbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZvbnRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplKTsKKyAgc3RhdGljIHZvaWQgR2VuZXJhdGVGb3JtQVAoVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpOworICBzdGF0aWMgdm9pZCBHZW5lcmF0ZUVtcHR5QVAoQ1BERl9Eb2N1bWVudCogcERvYywgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KTsKKworICBzdGF0aWMgYm9vbCBHZW5lcmF0ZUFubm90QVAoQ1BERl9Bbm5vdDo6U3VidHlwZSBzdWJ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCk7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlBERkRPQ19DUFZUX0dFTkVSQVRFQVBfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jcHZ0X2xpbmUuaCBiL2NvcmUvZnBkZmRvYy9jcHZ0X2xpbmUuaAppbmRleCA0N2MzZTg0Li4wODcwMzRkIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZkb2MvY3B2dF9saW5lLmgKKysrIGIvY29yZS9mcGRmZG9jL2NwdnRfbGluZS5oCkBAIC0xOCw5ICsxOCw5IEBACiAgIENQVlRfV29yZFBsYWNlIGxpbmVwbGFjZTsKICAgQ1BWVF9Xb3JkUGxhY2UgbGluZUVuZDsKICAgQ0ZYX1BvaW50RiBwdExpbmU7Ci0gIEZYX0ZMT0FUIGZMaW5lV2lkdGg7Ci0gIEZYX0ZMT0FUIGZMaW5lQXNjZW50OwotICBGWF9GTE9BVCBmTGluZURlc2NlbnQ7CisgIGZsb2F0IGZMaW5lV2lkdGg7CisgIGZsb2F0IGZMaW5lQXNjZW50OworICBmbG9hdCBmTGluZURlc2NlbnQ7CiB9OwogCiBpbmxpbmUgQ1BWVF9MaW5lOjpDUFZUX0xpbmUoKQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwdnRfbGluZWluZm8uaCBiL2NvcmUvZnBkZmRvYy9jcHZ0X2xpbmVpbmZvLmgKaW5kZXggOGZiMTBkZS4uOTZhMzIzNCAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwdnRfbGluZWluZm8uaAorKysgYi9jb3JlL2ZwZGZkb2MvY3B2dF9saW5laW5mby5oCkBAIC0xNiwxMSArMTYsMTEgQEAKICAgaW50MzJfdCBuVG90YWxXb3JkOwogICBpbnQzMl90IG5CZWdpbldvcmRJbmRleDsKICAgaW50MzJfdCBuRW5kV29yZEluZGV4OwotICBGWF9GTE9BVCBmTGluZVg7Ci0gIEZYX0ZMT0FUIGZMaW5lWTsKLSAgRlhfRkxPQVQgZkxpbmVXaWR0aDsKLSAgRlhfRkxPQVQgZkxpbmVBc2NlbnQ7Ci0gIEZYX0ZMT0FUIGZMaW5lRGVzY2VudDsKKyAgZmxvYXQgZkxpbmVYOworICBmbG9hdCBmTGluZVk7CisgIGZsb2F0IGZMaW5lV2lkdGg7CisgIGZsb2F0IGZMaW5lQXNjZW50OworICBmbG9hdCBmTGluZURlc2NlbnQ7CiB9OwogCiBpbmxpbmUgQ1BWVF9MaW5lSW5mbzo6Q1BWVF9MaW5lSW5mbygpCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3B2dF9zZWNwcm9wcy5oIGIvY29yZS9mcGRmZG9jL2NwdnRfc2VjcHJvcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFjNGI1OC4uMDAwMDAwMAotLS0gYS9jb3JlL2ZwZGZkb2MvY3B2dF9zZWNwcm9wcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlBERkRPQ19DUFZUX1NFQ1BST1BTX0hfCi0jZGVmaW5lIENPUkVfRlBERkRPQ19DUFZUX1NFQ1BST1BTX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotCi1zdHJ1Y3QgQ1BWVF9TZWNQcm9wcyB7Ci0gIENQVlRfU2VjUHJvcHMoKSA6IGZMaW5lTGVhZGluZygwLjBmKSwgZkxpbmVJbmRlbnQoMC4wZiksIG5BbGlnbm1lbnQoMCkge30KLQotICBDUFZUX1NlY1Byb3BzKEZYX0ZMT0FUIGxpbmVMZWFkaW5nLCBGWF9GTE9BVCBsaW5lSW5kZW50LCBpbnQzMl90IGFsaWdubWVudCkKLSAgICAgIDogZkxpbmVMZWFkaW5nKGxpbmVMZWFkaW5nKSwKLSAgICAgICAgZkxpbmVJbmRlbnQobGluZUluZGVudCksCi0gICAgICAgIG5BbGlnbm1lbnQoYWxpZ25tZW50KSB7fQotCi0gIENQVlRfU2VjUHJvcHMoY29uc3QgQ1BWVF9TZWNQcm9wcyYgb3RoZXIpCi0gICAgICA6IGZMaW5lTGVhZGluZyhvdGhlci5mTGluZUxlYWRpbmcpLAotICAgICAgICBmTGluZUluZGVudChvdGhlci5mTGluZUluZGVudCksCi0gICAgICAgIG5BbGlnbm1lbnQob3RoZXIubkFsaWdubWVudCkge30KLQotICBGWF9GTE9BVCBmTGluZUxlYWRpbmc7Ci0gIEZYX0ZMT0FUIGZMaW5lSW5kZW50OwotICBpbnQzMl90IG5BbGlnbm1lbnQ7Ci19OwotCi0jZW5kaWYgIC8vIENPUkVfRlBERkRPQ19DUFZUX1NFQ1BST1BTX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3B2dF9zZWN0aW9uLmggYi9jb3JlL2ZwZGZkb2MvY3B2dF9zZWN0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYjE2ZmQuLjAwMDAwMDAKLS0tIGEvY29yZS9mcGRmZG9jL2NwdnRfc2VjdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlBERkRPQ19DUFZUX1NFQ1RJT05fSF8KLSNkZWZpbmUgQ09SRV9GUERGRE9DX0NQVlRfU0VDVElPTl9IXwotCi0jaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwdnRfc2VjcHJvcHMuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3B2dF93b3JkcGxhY2UuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3B2dF93b3JkcHJvcHMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCi0KLXN0cnVjdCBDUFZUX1NlY3Rpb24gewotICBDUFZUX1dvcmRQbGFjZSBzZWNwbGFjZTsKLSAgQ0ZYX0Zsb2F0UmVjdCByY1NlY3Rpb247Ci0gIENQVlRfU2VjUHJvcHMgU2VjUHJvcHM7Ci0gIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKLX07Ci0KLSNlbmRpZiAgLy8gQ09SRV9GUERGRE9DX0NQVlRfU0VDVElPTl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwdnRfc2VjdGlvbmluZm8uY3BwIGIvY29yZS9mcGRmZG9jL2NwdnRfc2VjdGlvbmluZm8uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzAyNjJjLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnBkZmRvYy9jcHZ0X3NlY3Rpb25pbmZvLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLS8vCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwdnRfc2VjdGlvbmluZm8uaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0KLUNQVlRfU2VjdGlvbkluZm86OkNQVlRfU2VjdGlvbkluZm8oKSA6IHJjU2VjdGlvbigpLCBuVG90YWxMaW5lKDApIHt9Ci0KLUNQVlRfU2VjdGlvbkluZm86On5DUFZUX1NlY3Rpb25JbmZvKCkge30KLQotQ1BWVF9TZWN0aW9uSW5mbzo6Q1BWVF9TZWN0aW9uSW5mbyhjb25zdCBDUFZUX1NlY3Rpb25JbmZvJiBvdGhlcikgewotICBvcGVyYXRvcj0ob3RoZXIpOwotfQotCi12b2lkIENQVlRfU2VjdGlvbkluZm86Om9wZXJhdG9yPShjb25zdCBDUFZUX1NlY3Rpb25JbmZvJiBvdGhlcikgewotICBpZiAodGhpcyA9PSAmb3RoZXIpCi0gICAgcmV0dXJuOwotCi0gIHJjU2VjdGlvbiA9IG90aGVyLnJjU2VjdGlvbjsKLSAgblRvdGFsTGluZSA9IG90aGVyLm5Ub3RhbExpbmU7Ci0gIGlmIChvdGhlci5wU2VjUHJvcHMpCi0gICAgcFNlY1Byb3BzID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQVlRfU2VjUHJvcHM+KCpvdGhlci5wU2VjUHJvcHMpOwotICBlbHNlCi0gICAgcFNlY1Byb3BzLnJlc2V0KCk7Ci0KLSAgaWYgKG90aGVyLnBXb3JkUHJvcHMpCi0gICAgcFdvcmRQcm9wcyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUFZUX1dvcmRQcm9wcz4oKm90aGVyLnBXb3JkUHJvcHMpOwotICBlbHNlCi0gICAgcFdvcmRQcm9wcy5yZXNldCgpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwdnRfc2VjdGlvbmluZm8uaCBiL2NvcmUvZnBkZmRvYy9jcHZ0X3NlY3Rpb25pbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MjJlZmUuLjAwMDAwMDAKLS0tIGEvY29yZS9mcGRmZG9jL2NwdnRfc2VjdGlvbmluZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBDT1JFX0ZQREZET0NfQ1BWVF9TRUNUSU9OSU5GT19IXwotI2RlZmluZSBDT1JFX0ZQREZET0NfQ1BWVF9TRUNUSU9OSU5GT19IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwdnRfZmxvYXRyZWN0LmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwdnRfc2VjcHJvcHMuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3B2dF93b3JkcHJvcHMuaCIKLQotc3RydWN0IENQVlRfU2VjdGlvbkluZm8gewotICBDUFZUX1NlY3Rpb25JbmZvKCk7Ci0gIENQVlRfU2VjdGlvbkluZm8oY29uc3QgQ1BWVF9TZWN0aW9uSW5mbyYgb3RoZXIpOwotICB+Q1BWVF9TZWN0aW9uSW5mbygpOwotCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENQVlRfU2VjdGlvbkluZm8mIG90aGVyKTsKLQotICBDUFZUX0Zsb2F0UmVjdCByY1NlY3Rpb247Ci0gIGludDMyX3QgblRvdGFsTGluZTsKLSAgc3RkOjp1bmlxdWVfcHRyPENQVlRfU2VjUHJvcHM+IHBTZWNQcm9wczsKLSAgc3RkOjp1bmlxdWVfcHRyPENQVlRfV29yZFByb3BzPiBwV29yZFByb3BzOwotfTsKLQotI2VuZGlmICAvLyBDT1JFX0ZQREZET0NfQ1BWVF9TRUNUSU9OSU5GT19IXwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NwdnRfd29yZC5oIGIvY29yZS9mcGRmZG9jL2NwdnRfd29yZC5oCmluZGV4IDU0MGYwNDEuLmFkMGJhNzQgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jcHZ0X3dvcmQuaAorKysgYi9jb3JlL2ZwZGZkb2MvY3B2dF93b3JkLmgKQEAgLTgsNyArOCw2IEBACiAjZGVmaW5lIENPUkVfRlBERkRPQ19DUFZUX1dPUkRfSF8KIAogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcHZ0X3dvcmRwbGFjZS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcHZ0X3dvcmRwcm9wcy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCiAKIGNsYXNzIENQVlRfV29yZCB7CkBAIC0xOSwxMiArMTgsMTEgQEAKICAgaW50MzJfdCBuQ2hhcnNldDsKICAgQ1BWVF9Xb3JkUGxhY2UgV29yZFBsYWNlOwogICBDRlhfUG9pbnRGIHB0V29yZDsKLSAgRlhfRkxPQVQgZkFzY2VudDsKLSAgRlhfRkxPQVQgZkRlc2NlbnQ7Ci0gIEZYX0ZMT0FUIGZXaWR0aDsKKyAgZmxvYXQgZkFzY2VudDsKKyAgZmxvYXQgZkRlc2NlbnQ7CisgIGZsb2F0IGZXaWR0aDsKICAgaW50MzJfdCBuRm9udEluZGV4OwotICBGWF9GTE9BVCBmRm9udFNpemU7Ci0gIENQVlRfV29yZFByb3BzIFdvcmRQcm9wczsKKyAgZmxvYXQgZkZvbnRTaXplOwogfTsKIAogaW5saW5lIENQVlRfV29yZDo6Q1BWVF9Xb3JkKCkKZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jcHZ0X3dvcmRpbmZvLmNwcCBiL2NvcmUvZnBkZmRvYy9jcHZ0X3dvcmRpbmZvLmNwcAppbmRleCBmMWVhMTE5Li4yNGFkNGI4IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZkb2MvY3B2dF93b3JkaW5mby5jcHAKKysrIGIvY29yZS9mcGRmZG9jL2NwdnRfd29yZGluZm8uY3BwCkBAIC01LDIwICs1LDE4IEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwdnRfd29yZGluZm8uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2NvZGVwYWdlLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogCiBDUFZUX1dvcmRJbmZvOjpDUFZUX1dvcmRJbmZvKCkKICAgICA6IFdvcmQoMCksCi0gICAgICBuQ2hhcnNldChGWEZPTlRfQU5TSV9DSEFSU0VUKSwKKyAgICAgIG5DaGFyc2V0KEZYX0NIQVJTRVRfQU5TSSksCiAgICAgICBmV29yZFgoMC4wZiksCiAgICAgICBmV29yZFkoMC4wZiksCiAgICAgICBmV29yZFRhaWwoMC4wZiksCiAgICAgICBuRm9udEluZGV4KC0xKSB7fQogCi1DUFZUX1dvcmRJbmZvOjpDUFZUX1dvcmRJbmZvKHVpbnQxNl90IHdvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmb250SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQVlRfV29yZFByb3BzKiBwUHJvcHMpCitDUFZUX1dvcmRJbmZvOjpDUFZUX1dvcmRJbmZvKHVpbnQxNl90IHdvcmQsIGludDMyX3QgY2hhcnNldCwgaW50MzJfdCBmb250SW5kZXgpCiAgICAgOiBXb3JkKHdvcmQpLAogICAgICAgbkNoYXJzZXQoY2hhcnNldCksCiAgICAgICBmV29yZFgoMC4wZiksCkBAIC0yOCw3ICsyNiw3IEBACiAKIENQVlRfV29yZEluZm86OkNQVlRfV29yZEluZm8oY29uc3QgQ1BWVF9Xb3JkSW5mbyYgd29yZCkKICAgICA6IFdvcmQoMCksCi0gICAgICBuQ2hhcnNldChGWEZPTlRfQU5TSV9DSEFSU0VUKSwKKyAgICAgIG5DaGFyc2V0KEZYX0NIQVJTRVRfQU5TSSksCiAgICAgICBmV29yZFgoMC4wZiksCiAgICAgICBmV29yZFkoMC4wZiksCiAgICAgICBmV29yZFRhaWwoMC4wZiksCkBAIC00OCw4ICs0Niw0IEBACiAgIGZXb3JkWCA9IHdvcmQuZldvcmRYOwogICBmV29yZFkgPSB3b3JkLmZXb3JkWTsKICAgZldvcmRUYWlsID0gd29yZC5mV29yZFRhaWw7Ci0gIGlmICh3b3JkLnBXb3JkUHJvcHMpCi0gICAgcFdvcmRQcm9wcyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUFZUX1dvcmRQcm9wcz4oKndvcmQucFdvcmRQcm9wcyk7Ci0gIGVsc2UKLSAgICBwV29yZFByb3BzLnJlc2V0KCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3B2dF93b3JkaW5mby5oIGIvY29yZS9mcGRmZG9jL2NwdnRfd29yZGluZm8uaAppbmRleCA4NjE1MzRiLi45YjJlYzhhIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZkb2MvY3B2dF93b3JkaW5mby5oCisrKyBiL2NvcmUvZnBkZmRvYy9jcHZ0X3dvcmRpbmZvLmgKQEAgLTksMTUgKzksMTEgQEAKIAogI2luY2x1ZGUgPG1lbW9yeT4KIAotI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcHZ0X3dvcmRwcm9wcy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCiAKIHN0cnVjdCBDUFZUX1dvcmRJbmZvIHsKICAgQ1BWVF9Xb3JkSW5mbygpOwotICBDUFZUX1dvcmRJbmZvKHVpbnQxNl90IHdvcmQsCi0gICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAotICAgICAgICAgICAgICAgIGludDMyX3QgZm9udEluZGV4LAotICAgICAgICAgICAgICAgIENQVlRfV29yZFByb3BzKiBwUHJvcHMpOworICBDUFZUX1dvcmRJbmZvKHVpbnQxNl90IHdvcmQsIGludDMyX3QgY2hhcnNldCwgaW50MzJfdCBmb250SW5kZXgpOwogICBDUFZUX1dvcmRJbmZvKGNvbnN0IENQVlRfV29yZEluZm8mIHdvcmQpOwogICB+Q1BWVF9Xb3JkSW5mbygpOwogCkBAIC0yNSwxMSArMjEsMTAgQEAKIAogICB1aW50MTZfdCBXb3JkOwogICBpbnQzMl90IG5DaGFyc2V0OwotICBGWF9GTE9BVCBmV29yZFg7Ci0gIEZYX0ZMT0FUIGZXb3JkWTsKLSAgRlhfRkxPQVQgZldvcmRUYWlsOworICBmbG9hdCBmV29yZFg7CisgIGZsb2F0IGZXb3JkWTsKKyAgZmxvYXQgZldvcmRUYWlsOwogICBpbnQzMl90IG5Gb250SW5kZXg7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDUFZUX1dvcmRQcm9wcz4gcFdvcmRQcm9wczsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9GUERGRE9DX0NQVlRfV09SRElORk9fSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jcHZ0X3dvcmRwbGFjZS5oIGIvY29yZS9mcGRmZG9jL2NwdnRfd29yZHBsYWNlLmgKaW5kZXggZjRhNmIwOC4uYzBhMWE5YyAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NwdnRfd29yZHBsYWNlLmgKKysrIGIvY29yZS9mcGRmZG9jL2NwdnRfd29yZHBsYWNlLmgKQEAgLTE0LDU1ICsxNCw1NSBAQAogCiAgIENQVlRfV29yZFBsYWNlKGludDMyX3Qgb3RoZXJfblNlY0luZGV4LAogICAgICAgICAgICAgICAgICBpbnQzMl90IG90aGVyX25MaW5lSW5kZXgsCi0gICAgICAgICAgICAgICAgIGludDMyX3Qgb3RoZXJfbldvcmRJbmRleCkgewotICAgIG5TZWNJbmRleCA9IG90aGVyX25TZWNJbmRleDsKLSAgICBuTGluZUluZGV4ID0gb3RoZXJfbkxpbmVJbmRleDsKLSAgICBuV29yZEluZGV4ID0gb3RoZXJfbldvcmRJbmRleDsKKyAgICAgICAgICAgICAgICAgaW50MzJfdCBvdGhlcl9uV29yZEluZGV4KQorICAgICAgOiBuU2VjSW5kZXgob3RoZXJfblNlY0luZGV4KSwKKyAgICAgICAgbkxpbmVJbmRleChvdGhlcl9uTGluZUluZGV4KSwKKyAgICAgICAgbldvcmRJbmRleChvdGhlcl9uV29yZEluZGV4KSB7fQorCisgIHZvaWQgUmVzZXQoKSB7CisgICAgblNlY0luZGV4ID0gLTE7CisgICAgbkxpbmVJbmRleCA9IC0xOworICAgIG5Xb3JkSW5kZXggPSAtMTsKICAgfQogCi0gIHZvaWQgRGVmYXVsdCgpIHsgblNlY0luZGV4ID0gbkxpbmVJbmRleCA9IG5Xb3JkSW5kZXggPSAtMTsgfQorICB2b2lkIEFkdmFuY2VTZWN0aW9uKCkgeworICAgIG5TZWNJbmRleCsrOworICAgIG5MaW5lSW5kZXggPSAwOworICAgIG5Xb3JkSW5kZXggPSAtMTsKKyAgfQogCi0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3ApIGNvbnN0IHsKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3ApIGNvbnN0IHsKICAgICByZXR1cm4gd3AublNlY0luZGV4ID09IG5TZWNJbmRleCAmJiB3cC5uTGluZUluZGV4ID09IG5MaW5lSW5kZXggJiYKICAgICAgICAgICAgd3AubldvcmRJbmRleCA9PSBuV29yZEluZGV4OwogICB9Ci0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cCkgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSB3cCk7IH0KLQotICBpbmxpbmUgaW50MzJfdCBXb3JkQ21wKGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cCkgY29uc3QgewotICAgIGlmIChuU2VjSW5kZXggPiB3cC5uU2VjSW5kZXgpCi0gICAgICByZXR1cm4gMTsKLSAgICBpZiAoblNlY0luZGV4IDwgd3AublNlY0luZGV4KQotICAgICAgcmV0dXJuIC0xOwotICAgIGlmIChuTGluZUluZGV4ID4gd3AubkxpbmVJbmRleCkKLSAgICAgIHJldHVybiAxOwotICAgIGlmIChuTGluZUluZGV4IDwgd3AubkxpbmVJbmRleCkKLSAgICAgIHJldHVybiAtMTsKLSAgICBpZiAobldvcmRJbmRleCA+IHdwLm5Xb3JkSW5kZXgpCi0gICAgICByZXR1cm4gMTsKLSAgICBpZiAobldvcmRJbmRleCA8IHdwLm5Xb3JkSW5kZXgpCi0gICAgICByZXR1cm4gLTE7Ci0gICAgcmV0dXJuIDA7CisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gd3ApOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3ApIGNvbnN0IHsKKyAgICBpZiAoblNlY0luZGV4ICE9IHdwLm5TZWNJbmRleCkKKyAgICAgIHJldHVybiBuU2VjSW5kZXggPCB3cC5uU2VjSW5kZXg7CisgICAgaWYgKG5MaW5lSW5kZXggIT0gd3AubkxpbmVJbmRleCkKKyAgICAgIHJldHVybiBuTGluZUluZGV4IDwgd3AubkxpbmVJbmRleDsKKyAgICByZXR1cm4gbldvcmRJbmRleCA8IHdwLm5Xb3JkSW5kZXg7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cCkgY29uc3QgeworICAgIGlmIChuU2VjSW5kZXggIT0gd3AublNlY0luZGV4KQorICAgICAgcmV0dXJuIG5TZWNJbmRleCA+IHdwLm5TZWNJbmRleDsKKyAgICBpZiAobkxpbmVJbmRleCAhPSB3cC5uTGluZUluZGV4KQorICAgICAgcmV0dXJuIG5MaW5lSW5kZXggPiB3cC5uTGluZUluZGV4OworICAgIHJldHVybiBuV29yZEluZGV4ID4gd3AubldvcmRJbmRleDsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cCkgY29uc3QgeworICAgIHJldHVybiAqdGhpcyA8IHdwIHx8ICp0aGlzID09IHdwOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwKSBjb25zdCB7CisgICAgcmV0dXJuICp0aGlzID4gd3AgfHwgKnRoaXMgPT0gd3A7CiAgIH0KIAogICBpbmxpbmUgaW50MzJfdCBMaW5lQ21wKGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cCkgY29uc3QgewotICAgIGlmIChuU2VjSW5kZXggPiB3cC5uU2VjSW5kZXgpCi0gICAgICByZXR1cm4gMTsKLSAgICBpZiAoblNlY0luZGV4IDwgd3AublNlY0luZGV4KQotICAgICAgcmV0dXJuIC0xOwotICAgIGlmIChuTGluZUluZGV4ID4gd3AubkxpbmVJbmRleCkKLSAgICAgIHJldHVybiAxOwotICAgIGlmIChuTGluZUluZGV4IDwgd3AubkxpbmVJbmRleCkKLSAgICAgIHJldHVybiAtMTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGlubGluZSBpbnQzMl90IFNlY0NtcChjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3ApIGNvbnN0IHsKLSAgICBpZiAoblNlY0luZGV4ID4gd3AublNlY0luZGV4KQotICAgICAgcmV0dXJuIDE7Ci0gICAgaWYgKG5TZWNJbmRleCA8IHdwLm5TZWNJbmRleCkKLSAgICAgIHJldHVybiAtMTsKLSAgICByZXR1cm4gMDsKKyAgICBpZiAoblNlY0luZGV4ICE9IHdwLm5TZWNJbmRleCkKKyAgICAgIHJldHVybiBuU2VjSW5kZXggLSB3cC5uU2VjSW5kZXg7CisgICAgcmV0dXJuIG5MaW5lSW5kZXggLSB3cC5uTGluZUluZGV4OwogICB9CiAKICAgaW50MzJfdCBuU2VjSW5kZXg7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3B2dF93b3JkcHJvcHMuaCBiL2NvcmUvZnBkZmRvYy9jcHZ0X3dvcmRwcm9wcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjcwODQxLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnBkZmRvYy9jcHZ0X3dvcmRwcm9wcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlBERkRPQ19DUFZUX1dPUkRQUk9QU19IXwotI2RlZmluZSBDT1JFX0ZQREZET0NfQ1BWVF9XT1JEUFJPUFNfSF8KLQotI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX3ZhcmlhYmxldGV4dC5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgotCi1zdHJ1Y3QgQ1BWVF9Xb3JkUHJvcHMgewotICBDUFZUX1dvcmRQcm9wcygpCi0gICAgICA6IG5Gb250SW5kZXgoLTEpLAotICAgICAgICBmRm9udFNpemUoMC4wZiksCi0gICAgICAgIGR3V29yZENvbG9yKDApLAotICAgICAgICBuU2NyaXB0VHlwZShDUERGX1ZhcmlhYmxlVGV4dDo6U2NyaXB0VHlwZTo6Tm9ybWFsKSwKLSAgICAgICAgbldvcmRTdHlsZSgwKSwKLSAgICAgICAgZkNoYXJTcGFjZSgwLjBmKSwKLSAgICAgICAgbkhvcnpTY2FsZSgwKSB7fQotCi0gIENQVlRfV29yZFByb3BzKGludDMyX3QgZm9udEluZGV4LAotICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250U2l6ZSwKLSAgICAgICAgICAgICAgICAgRlhfQ09MT1JSRUYgd29yZENvbG9yID0gMCwKLSAgICAgICAgICAgICAgICAgQ1BERl9WYXJpYWJsZVRleHQ6OlNjcmlwdFR5cGUgc2NyaXB0VHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICBDUERGX1ZhcmlhYmxlVGV4dDo6U2NyaXB0VHlwZTo6Tm9ybWFsLAotICAgICAgICAgICAgICAgICBpbnQzMl90IHdvcmRTdHlsZSA9IDAsCi0gICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGNoYXJTcGFjZSA9IDAsCi0gICAgICAgICAgICAgICAgIGludDMyX3QgaG9yelNjYWxlID0gMTAwKQotICAgICAgOiBuRm9udEluZGV4KGZvbnRJbmRleCksCi0gICAgICAgIGZGb250U2l6ZShmb250U2l6ZSksCi0gICAgICAgIGR3V29yZENvbG9yKHdvcmRDb2xvciksCi0gICAgICAgIG5TY3JpcHRUeXBlKHNjcmlwdFR5cGUpLAotICAgICAgICBuV29yZFN0eWxlKHdvcmRTdHlsZSksCi0gICAgICAgIGZDaGFyU3BhY2UoY2hhclNwYWNlKSwKLSAgICAgICAgbkhvcnpTY2FsZShob3J6U2NhbGUpIHt9Ci0KLSAgQ1BWVF9Xb3JkUHJvcHMoY29uc3QgQ1BWVF9Xb3JkUHJvcHMmIG90aGVyKQotICAgICAgOiBuRm9udEluZGV4KG90aGVyLm5Gb250SW5kZXgpLAotICAgICAgICBmRm9udFNpemUob3RoZXIuZkZvbnRTaXplKSwKLSAgICAgICAgZHdXb3JkQ29sb3Iob3RoZXIuZHdXb3JkQ29sb3IpLAotICAgICAgICBuU2NyaXB0VHlwZShvdGhlci5uU2NyaXB0VHlwZSksCi0gICAgICAgIG5Xb3JkU3R5bGUob3RoZXIubldvcmRTdHlsZSksCi0gICAgICAgIGZDaGFyU3BhY2Uob3RoZXIuZkNoYXJTcGFjZSksCi0gICAgICAgIG5Ib3J6U2NhbGUob3RoZXIubkhvcnpTY2FsZSkge30KLQotICBpbnQzMl90IG5Gb250SW5kZXg7Ci0gIEZYX0ZMT0FUIGZGb250U2l6ZTsKLSAgRlhfQ09MT1JSRUYgZHdXb3JkQ29sb3I7Ci0gIENQREZfVmFyaWFibGVUZXh0OjpTY3JpcHRUeXBlIG5TY3JpcHRUeXBlOwotICBpbnQzMl90IG5Xb3JkU3R5bGU7Ci0gIEZYX0ZMT0FUIGZDaGFyU3BhY2U7Ci0gIGludDMyX3QgbkhvcnpTY2FsZTsKLX07Ci0KLSNlbmRpZiAgLy8gQ09SRV9GUERGRE9DX0NQVlRfV09SRFBST1BTX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3B2dF93b3JkcmFuZ2UuaCBiL2NvcmUvZnBkZmRvYy9jcHZ0X3dvcmRyYW5nZS5oCmluZGV4IGIyOTFlNTAuLjYzOGY2YzEgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9jcHZ0X3dvcmRyYW5nZS5oCisrKyBiL2NvcmUvZnBkZmRvYy9jcHZ0X3dvcmRyYW5nZS5oCkBAIC03LDQ5ICs3LDYyIEBACiAjaWZuZGVmIENPUkVfRlBERkRPQ19DUFZUX1dPUkRSQU5HRV9IXwogI2RlZmluZSBDT1JFX0ZQREZET0NfQ1BWVF9XT1JEUkFOR0VfSF8KIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwdnRfd29yZHBsYWNlLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKIAogc3RydWN0IENQVlRfV29yZFJhbmdlIHsKICAgQ1BWVF9Xb3JkUmFuZ2UoKSB7fQogCi0gIENQVlRfV29yZFJhbmdlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBiZWdpbiwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGVuZCkgewotICAgIFNldChiZWdpbiwgZW5kKTsKKyAgQ1BWVF9Xb3JkUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGJlZ2luLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgZW5kKQorICAgICAgOiBCZWdpblBvcyhiZWdpbiksIEVuZFBvcyhlbmQpIHsKKyAgICBOb3JtYWxpemUoKTsKICAgfQogCi0gIHZvaWQgRGVmYXVsdCgpIHsKLSAgICBCZWdpblBvcy5EZWZhdWx0KCk7Ci0gICAgRW5kUG9zLkRlZmF1bHQoKTsKKyAgdm9pZCBSZXNldCgpIHsKKyAgICBCZWdpblBvcy5SZXNldCgpOworICAgIEVuZFBvcy5SZXNldCgpOwogICB9CiAKICAgdm9pZCBTZXQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGJlZ2luLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgZW5kKSB7CiAgICAgQmVnaW5Qb3MgPSBiZWdpbjsKICAgICBFbmRQb3MgPSBlbmQ7Ci0gICAgU3dhcFdvcmRQbGFjZSgpOworICAgIE5vcm1hbGl6ZSgpOwogICB9CiAKICAgdm9pZCBTZXRCZWdpblBvcyhjb25zdCBDUFZUX1dvcmRQbGFjZSYgYmVnaW4pIHsKICAgICBCZWdpblBvcyA9IGJlZ2luOwotICAgIFN3YXBXb3JkUGxhY2UoKTsKKyAgICBOb3JtYWxpemUoKTsKICAgfQogCiAgIHZvaWQgU2V0RW5kUG9zKGNvbnN0IENQVlRfV29yZFBsYWNlJiBlbmQpIHsKICAgICBFbmRQb3MgPSBlbmQ7Ci0gICAgU3dhcFdvcmRQbGFjZSgpOworICAgIE5vcm1hbGl6ZSgpOwogICB9CiAKLSAgYm9vbCBJc0V4aXN0KCkgY29uc3QgeyByZXR1cm4gQmVnaW5Qb3MgIT0gRW5kUG9zOyB9Ci0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cikgY29uc3QgewotICAgIHJldHVybiB3ci5CZWdpblBvcyAhPSBCZWdpblBvcyB8fCB3ci5FbmRQb3MgIT0gRW5kUG9zOwotICB9Ci0KLSAgdm9pZCBTd2FwV29yZFBsYWNlKCkgewotICAgIGlmIChCZWdpblBvcy5Xb3JkQ21wKEVuZFBvcykgPiAwKSB7Ci0gICAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IEVuZFBvczsKLSAgICAgIEVuZFBvcyA9IEJlZ2luUG9zOwotICAgICAgQmVnaW5Qb3MgPSBwbGFjZTsKKyAgQ1BWVF9Xb3JkUmFuZ2UgSW50ZXJzZWN0KGNvbnN0IENQVlRfV29yZFJhbmdlJiB0aGF0KSBjb25zdCB7CisgICAgaWYgKHRoYXQuRW5kUG9zIDwgQmVnaW5Qb3MgfHwgdGhhdC5CZWdpblBvcyA+IEVuZFBvcyB8fAorICAgICAgICBFbmRQb3MgPCB0aGF0LkJlZ2luUG9zIHx8IEJlZ2luUG9zID4gdGhhdC5FbmRQb3MpIHsKKyAgICAgIHJldHVybiBDUFZUX1dvcmRSYW5nZSgpOwogICAgIH0KKworICAgIHJldHVybiBDUFZUX1dvcmRSYW5nZShzdGQ6Om1heChCZWdpblBvcywgdGhhdC5CZWdpblBvcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKEVuZFBvcywgdGhhdC5FbmRQb3MpKTsKKyAgfQorCisgIGlubGluZSBib29sIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBCZWdpblBvcyA9PSBFbmRQb3M7IH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IpIGNvbnN0IHsKKyAgICByZXR1cm4gd3IuQmVnaW5Qb3MgPT0gQmVnaW5Qb3MgJiYgd3IuRW5kUG9zID09IEVuZFBvczsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cikgY29uc3QgeworICAgIHJldHVybiAhKCp0aGlzID09IHdyKTsKKyAgfQorCisgIHZvaWQgTm9ybWFsaXplKCkgeworICAgIGlmIChCZWdpblBvcyA+IEVuZFBvcykKKyAgICAgIHN0ZDo6c3dhcChCZWdpblBvcywgRW5kUG9zKTsKICAgfQogCiAgIENQVlRfV29yZFBsYWNlIEJlZ2luUG9zOwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2NzZWN0aW9uLmNwcCBiL2NvcmUvZnBkZmRvYy9jc2VjdGlvbi5jcHAKaW5kZXggNDkwZWYxYi4uNDVjYmY2YiAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NzZWN0aW9uLmNwcAorKysgYi9jb3JlL2ZwZGZkb2MvY3NlY3Rpb24uY3BwCkBAIC05LDEzOSArOSwxMTYgQEAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY2xpbmUuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl92YXJpYWJsZXRleHQuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3B2dF93b3JkaW5mby5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCiAKIENTZWN0aW9uOjpDU2VjdGlvbihDUERGX1ZhcmlhYmxlVGV4dCogcFZUKSA6IG1fcFZUKHBWVCkge30KIAotQ1NlY3Rpb246On5DU2VjdGlvbigpIHsKLSAgUmVzZXRBbGwoKTsKLX0KK0NTZWN0aW9uOjp+Q1NlY3Rpb24oKSB7fQogCiB2b2lkIENTZWN0aW9uOjpSZXNldEFsbCgpIHsKLSAgUmVzZXRXb3JkQXJyYXkoKTsKLSAgUmVzZXRMaW5lQXJyYXkoKTsKLX0KLQotdm9pZCBDU2VjdGlvbjo6UmVzZXRMaW5lQXJyYXkoKSB7Ci0gIG1fTGluZUFycmF5LlJlbW92ZUFsbCgpOwotfQotCi12b2lkIENTZWN0aW9uOjpSZXNldFdvcmRBcnJheSgpIHsKLSAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fV29yZEFycmF5LkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKLSAgICBkZWxldGUgbV9Xb3JkQXJyYXkuR2V0QXQoaSk7Ci0gIH0KLSAgbV9Xb3JkQXJyYXkuUmVtb3ZlQWxsKCk7CisgIG1fV29yZEFycmF5LmNsZWFyKCk7CisgIG1fTGluZUFycmF5LmNsZWFyKCk7CiB9CiAKIHZvaWQgQ1NlY3Rpb246OlJlc2V0TGluZVBsYWNlKCkgewotICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9MaW5lQXJyYXkuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgewotICAgIGlmIChDTGluZSogcExpbmUgPSBtX0xpbmVBcnJheS5HZXRBdChpKSkgewotICAgICAgcExpbmUtPkxpbmVQbGFjZSA9IENQVlRfV29yZFBsYWNlKFNlY1BsYWNlLm5TZWNJbmRleCwgaSwgLTEpOwotICAgIH0KKyAgaW50MzJfdCBpID0gMDsKKyAgZm9yIChhdXRvJiBwTGluZSA6IG1fTGluZUFycmF5KSB7CisgICAgcExpbmUtPkxpbmVQbGFjZSA9IENQVlRfV29yZFBsYWNlKFNlY1BsYWNlLm5TZWNJbmRleCwgaSwgLTEpOworICAgICsraTsKICAgfQogfQogCiBDUFZUX1dvcmRQbGFjZSBDU2VjdGlvbjo6QWRkV29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRJbmZvJiB3b3JkaW5mbykgewotICBDUFZUX1dvcmRJbmZvKiBwV29yZCA9IG5ldyBDUFZUX1dvcmRJbmZvKHdvcmRpbmZvKTsKLSAgaW50MzJfdCBuV29yZEluZGV4ID0KLSAgICAgIHN0ZDo6bWF4KHN0ZDo6bWluKHBsYWNlLm5Xb3JkSW5kZXgsIG1fV29yZEFycmF5LkdldFNpemUoKSksIDApOwotICBpZiAobldvcmRJbmRleCA9PSBtX1dvcmRBcnJheS5HZXRTaXplKCkpIHsKLSAgICBtX1dvcmRBcnJheS5BZGQocFdvcmQpOwotICB9IGVsc2UgewotICAgIG1fV29yZEFycmF5Lkluc2VydEF0KG5Xb3JkSW5kZXgsIHBXb3JkKTsKLSAgfQorICBpbnQzMl90IG5Xb3JkSW5kZXggPSBwZGZpdW06OmNsYW1wKAorICAgICAgcGxhY2UubldvcmRJbmRleCwgMCwgcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX1dvcmRBcnJheSkpOworICBtX1dvcmRBcnJheS5pbnNlcnQobV9Xb3JkQXJyYXkuYmVnaW4oKSArIG5Xb3JkSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BWVF9Xb3JkSW5mbz4od29yZGluZm8pKTsKICAgcmV0dXJuIHBsYWNlOwogfQogCiBDUFZUX1dvcmRQbGFjZSBDU2VjdGlvbjo6QWRkTGluZShjb25zdCBDUFZUX0xpbmVJbmZvJiBsaW5laW5mbykgewotICByZXR1cm4gQ1BWVF9Xb3JkUGxhY2UoU2VjUGxhY2UublNlY0luZGV4LCBtX0xpbmVBcnJheS5BZGQobGluZWluZm8pLCAtMSk7CisgIG1fTGluZUFycmF5LnB1c2hfYmFjayhwZGZpdW06Ok1ha2VVbmlxdWU8Q0xpbmU+KGxpbmVpbmZvKSk7CisgIHJldHVybiBDUFZUX1dvcmRQbGFjZShTZWNQbGFjZS5uU2VjSW5kZXgsIG1fTGluZUFycmF5LnNpemUoKSAtIDEsIC0xKTsKIH0KIAogQ1BWVF9GbG9hdFJlY3QgQ1NlY3Rpb246OlJlYXJyYW5nZSgpIHsKLSAgaWYgKG1fcFZULT5tX25DaGFyQXJyYXkgPiAwKSB7CisgIGlmIChtX3BWVC0+R2V0Q2hhckFycmF5KCkgPiAwKQogICAgIHJldHVybiBDVHlwZXNldCh0aGlzKS5DaGFyQXJyYXkoKTsKLSAgfQogICByZXR1cm4gQ1R5cGVzZXQodGhpcykuVHlwZXNldCgpOwogfQogCi1DRlhfU2l6ZUYgQ1NlY3Rpb246OkdldFNlY3Rpb25TaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgeworQ0ZYX1NpemVGIENTZWN0aW9uOjpHZXRTZWN0aW9uU2l6ZShmbG9hdCBmRm9udFNpemUpIHsKICAgcmV0dXJuIENUeXBlc2V0KHRoaXMpLkdldEVkaXRTaXplKGZGb250U2l6ZSk7CiB9CiAKIENQVlRfV29yZFBsYWNlIENTZWN0aW9uOjpHZXRCZWdpbldvcmRQbGFjZSgpIGNvbnN0IHsKLSAgaWYgKENMaW5lKiBwTGluZSA9IG1fTGluZUFycmF5LkdldEF0KDApKSB7Ci0gICAgcmV0dXJuIHBMaW5lLT5HZXRCZWdpbldvcmRQbGFjZSgpOwotICB9Ci0gIHJldHVybiBTZWNQbGFjZTsKKyAgaWYgKG1fTGluZUFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIFNlY1BsYWNlOworICByZXR1cm4gbV9MaW5lQXJyYXkuZnJvbnQoKS0+R2V0QmVnaW5Xb3JkUGxhY2UoKTsKIH0KIAogQ1BWVF9Xb3JkUGxhY2UgQ1NlY3Rpb246OkdldEVuZFdvcmRQbGFjZSgpIGNvbnN0IHsKLSAgaWYgKENMaW5lKiBwTGluZSA9IG1fTGluZUFycmF5LkdldEF0KG1fTGluZUFycmF5LkdldFNpemUoKSAtIDEpKSB7Ci0gICAgcmV0dXJuIHBMaW5lLT5HZXRFbmRXb3JkUGxhY2UoKTsKLSAgfQotICByZXR1cm4gU2VjUGxhY2U7CisgIGlmIChtX0xpbmVBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBTZWNQbGFjZTsKKyAgcmV0dXJuIG1fTGluZUFycmF5LmJhY2soKS0+R2V0RW5kV29yZFBsYWNlKCk7CiB9CiAKIENQVlRfV29yZFBsYWNlIENTZWN0aW9uOjpHZXRQcmV2V29yZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgewotICBpZiAocGxhY2UubkxpbmVJbmRleCA8IDApIHsKKyAgaWYgKHBsYWNlLm5MaW5lSW5kZXggPCAwKQogICAgIHJldHVybiBHZXRCZWdpbldvcmRQbGFjZSgpOwotICB9Ci0gIGlmIChwbGFjZS5uTGluZUluZGV4ID49IG1fTGluZUFycmF5LkdldFNpemUoKSkgeworCisgIGlmIChwbGFjZS5uTGluZUluZGV4ID49IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9MaW5lQXJyYXkpKQogICAgIHJldHVybiBHZXRFbmRXb3JkUGxhY2UoKTsKLSAgfQotICBpZiAoQ0xpbmUqIHBMaW5lID0gbV9MaW5lQXJyYXkuR2V0QXQocGxhY2UubkxpbmVJbmRleCkpIHsKLSAgICBpZiAocGxhY2UubldvcmRJbmRleCA9PSBwTGluZS0+bV9MaW5lSW5mby5uQmVnaW5Xb3JkSW5kZXgpIHsKLSAgICAgIHJldHVybiBDUFZUX1dvcmRQbGFjZShwbGFjZS5uU2VjSW5kZXgsIHBsYWNlLm5MaW5lSW5kZXgsIC0xKTsKLSAgICB9Ci0gICAgaWYgKHBsYWNlLm5Xb3JkSW5kZXggPCBwTGluZS0+bV9MaW5lSW5mby5uQmVnaW5Xb3JkSW5kZXgpIHsKLSAgICAgIGlmIChDTGluZSogcFByZXZMaW5lID0gbV9MaW5lQXJyYXkuR2V0QXQocGxhY2UubkxpbmVJbmRleCAtIDEpKSB7Ci0gICAgICAgIHJldHVybiBwUHJldkxpbmUtPkdldEVuZFdvcmRQbGFjZSgpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gcExpbmUtPkdldFByZXZXb3JkUGxhY2UocGxhY2UpOwotICAgIH0KLSAgfQotICByZXR1cm4gcGxhY2U7CisKKyAgQ0xpbmUqIHBMaW5lID0gbV9MaW5lQXJyYXlbcGxhY2UubkxpbmVJbmRleF0uZ2V0KCk7CisgIGlmIChwbGFjZS5uV29yZEluZGV4ID09IHBMaW5lLT5tX0xpbmVJbmZvLm5CZWdpbldvcmRJbmRleCkKKyAgICByZXR1cm4gQ1BWVF9Xb3JkUGxhY2UocGxhY2UublNlY0luZGV4LCBwbGFjZS5uTGluZUluZGV4LCAtMSk7CisKKyAgaWYgKHBsYWNlLm5Xb3JkSW5kZXggPj0gcExpbmUtPm1fTGluZUluZm8ubkJlZ2luV29yZEluZGV4KQorICAgIHJldHVybiBwTGluZS0+R2V0UHJldldvcmRQbGFjZShwbGFjZSk7CisKKyAgaWYgKCFwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9MaW5lQXJyYXksIHBsYWNlLm5MaW5lSW5kZXggLSAxKSkKKyAgICByZXR1cm4gcGxhY2U7CisKKyAgcmV0dXJuIG1fTGluZUFycmF5W3BsYWNlLm5MaW5lSW5kZXggLSAxXS0+R2V0RW5kV29yZFBsYWNlKCk7CiB9CiAKIENQVlRfV29yZFBsYWNlIENTZWN0aW9uOjpHZXROZXh0V29yZFBsYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3QgewotICBpZiAocGxhY2UubkxpbmVJbmRleCA8IDApIHsKKyAgaWYgKHBsYWNlLm5MaW5lSW5kZXggPCAwKQogICAgIHJldHVybiBHZXRCZWdpbldvcmRQbGFjZSgpOwotICB9Ci0gIGlmIChwbGFjZS5uTGluZUluZGV4ID49IG1fTGluZUFycmF5LkdldFNpemUoKSkgeworCisgIGlmIChwbGFjZS5uTGluZUluZGV4ID49IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9MaW5lQXJyYXkpKQogICAgIHJldHVybiBHZXRFbmRXb3JkUGxhY2UoKTsKLSAgfQotICBpZiAoQ0xpbmUqIHBMaW5lID0gbV9MaW5lQXJyYXkuR2V0QXQocGxhY2UubkxpbmVJbmRleCkpIHsKLSAgICBpZiAocGxhY2UubldvcmRJbmRleCA+PSBwTGluZS0+bV9MaW5lSW5mby5uRW5kV29yZEluZGV4KSB7Ci0gICAgICBpZiAoQ0xpbmUqIHBOZXh0TGluZSA9IG1fTGluZUFycmF5LkdldEF0KHBsYWNlLm5MaW5lSW5kZXggKyAxKSkgewotICAgICAgICByZXR1cm4gcE5leHRMaW5lLT5HZXRCZWdpbldvcmRQbGFjZSgpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gcExpbmUtPkdldE5leHRXb3JkUGxhY2UocGxhY2UpOwotICAgIH0KLSAgfQotICByZXR1cm4gcGxhY2U7CisKKyAgQ0xpbmUqIHBMaW5lID0gbV9MaW5lQXJyYXlbcGxhY2UubkxpbmVJbmRleF0uZ2V0KCk7CisgIGlmIChwbGFjZS5uV29yZEluZGV4IDwgcExpbmUtPm1fTGluZUluZm8ubkVuZFdvcmRJbmRleCkKKyAgICByZXR1cm4gcExpbmUtPkdldE5leHRXb3JkUGxhY2UocGxhY2UpOworCisgIGlmICghcGRmaXVtOjpJbmRleEluQm91bmRzKG1fTGluZUFycmF5LCBwbGFjZS5uTGluZUluZGV4ICsgMSkpCisgICAgcmV0dXJuIHBsYWNlOworCisgIHJldHVybiBtX0xpbmVBcnJheVtwbGFjZS5uTGluZUluZGV4ICsgMV0tPkdldEJlZ2luV29yZFBsYWNlKCk7CiB9CiAKIHZvaWQgQ1NlY3Rpb246OlVwZGF0ZVdvcmRQbGFjZShDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IHsKICAgaW50MzJfdCBuTGVmdCA9IDA7Ci0gIGludDMyX3QgblJpZ2h0ID0gbV9MaW5lQXJyYXkuR2V0U2l6ZSgpIC0gMTsKKyAgaW50MzJfdCBuUmlnaHQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fTGluZUFycmF5KSAtIDE7CiAgIGludDMyX3Qgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOwogICB3aGlsZSAobkxlZnQgPD0gblJpZ2h0KSB7Ci0gICAgaWYgKENMaW5lKiBwTGluZSA9IG1fTGluZUFycmF5LkdldEF0KG5NaWQpKSB7Ci0gICAgICBpZiAocGxhY2UubldvcmRJbmRleCA8IHBMaW5lLT5tX0xpbmVJbmZvLm5CZWdpbldvcmRJbmRleCkgewotICAgICAgICBuUmlnaHQgPSBuTWlkIC0gMTsKLSAgICAgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOwotICAgICAgfSBlbHNlIGlmIChwbGFjZS5uV29yZEluZGV4ID4gcExpbmUtPm1fTGluZUluZm8ubkVuZFdvcmRJbmRleCkgewotICAgICAgICBuTGVmdCA9IG5NaWQgKyAxOwotICAgICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwbGFjZS5uTGluZUluZGV4ID0gbk1pZDsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQorICAgIENMaW5lKiBwTGluZSA9IG1fTGluZUFycmF5W25NaWRdLmdldCgpOworICAgIGlmIChwbGFjZS5uV29yZEluZGV4IDwgcExpbmUtPm1fTGluZUluZm8ubkJlZ2luV29yZEluZGV4KSB7CisgICAgICBuUmlnaHQgPSBuTWlkIC0gMTsKKyAgICAgIG5NaWQgPSAobkxlZnQgKyBuUmlnaHQpIC8gMjsKKyAgICB9IGVsc2UgaWYgKHBsYWNlLm5Xb3JkSW5kZXggPiBwTGluZS0+bV9MaW5lSW5mby5uRW5kV29yZEluZGV4KSB7CisgICAgICBuTGVmdCA9IG5NaWQgKyAxOworICAgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOwogICAgIH0gZWxzZSB7Ci0gICAgICBicmVhazsKKyAgICAgIHBsYWNlLm5MaW5lSW5kZXggPSBuTWlkOworICAgICAgcmV0dXJuOwogICAgIH0KICAgfQogfQpAQCAtMTUyLDYxICsxMjksNTUgQEAKICAgYm9vbCBiVXAgPSB0cnVlOwogICBib29sIGJEb3duID0gdHJ1ZTsKICAgaW50MzJfdCBuTGVmdCA9IDA7Ci0gIGludDMyX3QgblJpZ2h0ID0gbV9MaW5lQXJyYXkuR2V0U2l6ZSgpIC0gMTsKLSAgaW50MzJfdCBuTWlkID0gbV9MaW5lQXJyYXkuR2V0U2l6ZSgpIC8gMjsKLSAgRlhfRkxPQVQgZlRvcCA9IDA7Ci0gIEZYX0ZMT0FUIGZCb3R0b20gPSAwOworICBpbnQzMl90IG5SaWdodCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9MaW5lQXJyYXkpIC0gMTsKKyAgaW50MzJfdCBuTWlkID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX0xpbmVBcnJheSkgLyAyOwogICB3aGlsZSAobkxlZnQgPD0gblJpZ2h0KSB7Ci0gICAgaWYgKENMaW5lKiBwTGluZSA9IG1fTGluZUFycmF5LkdldEF0KG5NaWQpKSB7Ci0gICAgICBmVG9wID0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVZIC0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVBc2NlbnQgLQotICAgICAgICAgICAgIG1fcFZULT5HZXRMaW5lTGVhZGluZyhtX1NlY0luZm8pOwotICAgICAgZkJvdHRvbSA9IHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWSAtIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lRGVzY2VudDsKLSAgICAgIGlmIChJc0Zsb2F0QmlnZ2VyKHBvaW50LnksIGZUb3ApKSB7Ci0gICAgICAgIGJVcCA9IGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKElzRmxvYXRTbWFsbGVyKHBvaW50LnksIGZCb3R0b20pKSB7Ci0gICAgICAgIGJEb3duID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoSXNGbG9hdFNtYWxsZXIocG9pbnQueSwgZlRvcCkpIHsKLSAgICAgICAgblJpZ2h0ID0gbk1pZCAtIDE7Ci0gICAgICAgIG5NaWQgPSAobkxlZnQgKyBuUmlnaHQpIC8gMjsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9IGVsc2UgaWYgKElzRmxvYXRCaWdnZXIocG9pbnQueSwgZkJvdHRvbSkpIHsKLSAgICAgICAgbkxlZnQgPSBuTWlkICsgMTsKLSAgICAgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBsYWNlID0gU2VhcmNoV29yZFBsYWNlKAotICAgICAgICAgICAgcG9pbnQueCwKLSAgICAgICAgICAgIENQVlRfV29yZFJhbmdlKHBMaW5lLT5HZXROZXh0V29yZFBsYWNlKHBMaW5lLT5HZXRCZWdpbldvcmRQbGFjZSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5lLT5HZXRFbmRXb3JkUGxhY2UoKSkpOwotICAgICAgICBwbGFjZS5uTGluZUluZGV4ID0gbk1pZDsKLSAgICAgICAgcmV0dXJuIHBsYWNlOwotICAgICAgfQorICAgIENMaW5lKiBwTGluZSA9IG1fTGluZUFycmF5W25NaWRdLmdldCgpOworICAgIGZsb2F0IGZUb3AgPSBwTGluZS0+bV9MaW5lSW5mby5mTGluZVkgLSBwTGluZS0+bV9MaW5lSW5mby5mTGluZUFzY2VudCAtCisgICAgICAgICAgICAgICAgIG1fcFZULT5HZXRMaW5lTGVhZGluZygpOworICAgIGZsb2F0IGZCb3R0b20gPSBwTGluZS0+bV9MaW5lSW5mby5mTGluZVkgLSBwTGluZS0+bV9MaW5lSW5mby5mTGluZURlc2NlbnQ7CisgICAgaWYgKElzRmxvYXRCaWdnZXIocG9pbnQueSwgZlRvcCkpCisgICAgICBiVXAgPSBmYWxzZTsKKyAgICBpZiAoSXNGbG9hdFNtYWxsZXIocG9pbnQueSwgZkJvdHRvbSkpCisgICAgICBiRG93biA9IGZhbHNlOworICAgIGlmIChJc0Zsb2F0U21hbGxlcihwb2ludC55LCBmVG9wKSkgeworICAgICAgblJpZ2h0ID0gbk1pZCAtIDE7CisgICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7CisgICAgICBjb250aW51ZTsKICAgICB9CisgICAgaWYgKElzRmxvYXRCaWdnZXIocG9pbnQueSwgZkJvdHRvbSkpIHsKKyAgICAgIG5MZWZ0ID0gbk1pZCArIDE7CisgICAgICBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgcGxhY2UgPSBTZWFyY2hXb3JkUGxhY2UoCisgICAgICAgIHBvaW50LngsCisgICAgICAgIENQVlRfV29yZFJhbmdlKHBMaW5lLT5HZXROZXh0V29yZFBsYWNlKHBMaW5lLT5HZXRCZWdpbldvcmRQbGFjZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcExpbmUtPkdldEVuZFdvcmRQbGFjZSgpKSk7CisgICAgcGxhY2UubkxpbmVJbmRleCA9IG5NaWQ7CisgICAgcmV0dXJuIHBsYWNlOwogICB9Ci0gIGlmIChiVXApIHsKKyAgaWYgKGJVcCkKICAgICBwbGFjZSA9IEdldEJlZ2luV29yZFBsYWNlKCk7Ci0gIH0KLSAgaWYgKGJEb3duKSB7CisgIGlmIChiRG93bikKICAgICBwbGFjZSA9IEdldEVuZFdvcmRQbGFjZSgpOwotICB9CiAgIHJldHVybiBwbGFjZTsKIH0KIAogQ1BWVF9Xb3JkUGxhY2UgQ1NlY3Rpb246OlNlYXJjaFdvcmRQbGFjZSgKLSAgICBGWF9GTE9BVCBmeCwKKyAgICBmbG9hdCBmeCwKICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgbGluZXBsYWNlKSBjb25zdCB7Ci0gIGlmIChDTGluZSogcExpbmUgPSBtX0xpbmVBcnJheS5HZXRBdChsaW5lcGxhY2UubkxpbmVJbmRleCkpIHsKLSAgICByZXR1cm4gU2VhcmNoV29yZFBsYWNlKAotICAgICAgICBmeCAtIG1fU2VjSW5mby5yY1NlY3Rpb24ubGVmdCwKLSAgICAgICAgQ1BWVF9Xb3JkUmFuZ2UocExpbmUtPkdldE5leHRXb3JkUGxhY2UocExpbmUtPkdldEJlZ2luV29yZFBsYWNlKCkpLAotICAgICAgICAgICAgICAgICAgICAgICBwTGluZS0+R2V0RW5kV29yZFBsYWNlKCkpKTsKLSAgfQotICByZXR1cm4gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKKyAgaWYgKCFwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9MaW5lQXJyYXksIGxpbmVwbGFjZS5uTGluZUluZGV4KSkKKyAgICByZXR1cm4gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKKworICBDTGluZSogcExpbmUgPSBtX0xpbmVBcnJheVtsaW5lcGxhY2UubkxpbmVJbmRleF0uZ2V0KCk7CisgIHJldHVybiBTZWFyY2hXb3JkUGxhY2UoCisgICAgICBmeCAtIG1fUmVjdC5sZWZ0LAorICAgICAgQ1BWVF9Xb3JkUmFuZ2UocExpbmUtPkdldE5leHRXb3JkUGxhY2UocExpbmUtPkdldEJlZ2luV29yZFBsYWNlKCkpLAorICAgICAgICAgICAgICAgICAgICAgcExpbmUtPkdldEVuZFdvcmRQbGFjZSgpKSk7CiB9CiAKLUNQVlRfV29yZFBsYWNlIENTZWN0aW9uOjpTZWFyY2hXb3JkUGxhY2UoRlhfRkxPQVQgZngsCitDUFZUX1dvcmRQbGFjZSBDU2VjdGlvbjo6U2VhcmNoV29yZFBsYWNlKGZsb2F0IGZ4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSYgcmFuZ2UpIGNvbnN0IHsKICAgQ1BWVF9Xb3JkUGxhY2Ugd29yZHBsYWNlID0gcmFuZ2UuQmVnaW5Qb3M7CiAgIHdvcmRwbGFjZS5uV29yZEluZGV4ID0gLTE7CkBAIC0yMTcsNzUgKzE4OCw3MSBAQAogICBpbnQzMl90IG5SaWdodCA9IHJhbmdlLkVuZFBvcy5uV29yZEluZGV4ICsgMTsKICAgaW50MzJfdCBuTWlkID0gKG5MZWZ0ICsgblJpZ2h0KSAvIDI7CiAgIHdoaWxlIChuTGVmdCA8IG5SaWdodCkgewotICAgIGlmIChuTWlkID09IG5MZWZ0KSB7CisgICAgaWYgKG5NaWQgPT0gbkxlZnQpCiAgICAgICBicmVhazsKLSAgICB9CiAgICAgaWYgKG5NaWQgPT0gblJpZ2h0KSB7CiAgICAgICBuTWlkLS07CiAgICAgICBicmVhazsKICAgICB9Ci0gICAgaWYgKENQVlRfV29yZEluZm8qIHBXb3JkID0gbV9Xb3JkQXJyYXkuR2V0QXQobk1pZCkpIHsKLSAgICAgIGlmIChmeCA+Ci0gICAgICAgICAgcFdvcmQtPmZXb3JkWCArIG1fcFZULT5HZXRXb3JkV2lkdGgoKnBXb3JkKSAqIFZBUklBQkxFVEVYVF9IQUxGKSB7Ci0gICAgICAgIG5MZWZ0ID0gbk1pZDsKLSAgICAgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG5SaWdodCA9IG5NaWQ7Ci0gICAgICAgIG5NaWQgPSAobkxlZnQgKyBuUmlnaHQpIC8gMjsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAoIXBkZml1bTo6SW5kZXhJbkJvdW5kcyhtX1dvcmRBcnJheSwgbk1pZCkpCiAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgaWYgKENQVlRfV29yZEluZm8qIHBXb3JkID0gbV9Xb3JkQXJyYXkuR2V0QXQobk1pZCkpIHsKKyAgICBDUFZUX1dvcmRJbmZvKiBwV29yZCA9IG1fV29yZEFycmF5W25NaWRdLmdldCgpOwogICAgIGlmIChmeCA+IHBXb3JkLT5mV29yZFggKyBtX3BWVC0+R2V0V29yZFdpZHRoKCpwV29yZCkgKiBWQVJJQUJMRVRFWFRfSEFMRikgewotICAgICAgd29yZHBsYWNlLm5Xb3JkSW5kZXggPSBuTWlkOworICAgICAgbkxlZnQgPSBuTWlkOworICAgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOworICAgICAgY29udGludWU7CiAgICAgfQorICAgIG5SaWdodCA9IG5NaWQ7CisgICAgbk1pZCA9IChuTGVmdCArIG5SaWdodCkgLyAyOworICB9CisgIGlmIChwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9Xb3JkQXJyYXksIG5NaWQpKSB7CisgICAgQ1BWVF9Xb3JkSW5mbyogcFdvcmQgPSBtX1dvcmRBcnJheVtuTWlkXS5nZXQoKTsKKyAgICBpZiAoZnggPiBwV29yZC0+ZldvcmRYICsgbV9wVlQtPkdldFdvcmRXaWR0aCgqcFdvcmQpICogVkFSSUFCTEVURVhUX0hBTEYpCisgICAgICB3b3JkcGxhY2UubldvcmRJbmRleCA9IG5NaWQ7CiAgIH0KICAgcmV0dXJuIHdvcmRwbGFjZTsKIH0KIAogdm9pZCBDU2VjdGlvbjo6Q2xlYXJMZWZ0V29yZHMoaW50MzJfdCBuV29yZEluZGV4KSB7CiAgIGZvciAoaW50MzJfdCBpID0gbldvcmRJbmRleDsgaSA+PSAwOyBpLS0pIHsKLSAgICBkZWxldGUgbV9Xb3JkQXJyYXkuR2V0QXQoaSk7Ci0gICAgbV9Xb3JkQXJyYXkuUmVtb3ZlQXQoaSk7CisgICAgaWYgKHBkZml1bTo6SW5kZXhJbkJvdW5kcyhtX1dvcmRBcnJheSwgaSkpCisgICAgICBtX1dvcmRBcnJheS5lcmFzZShtX1dvcmRBcnJheS5iZWdpbigpICsgaSk7CiAgIH0KIH0KIAogdm9pZCBDU2VjdGlvbjo6Q2xlYXJSaWdodFdvcmRzKGludDMyX3QgbldvcmRJbmRleCkgewotICBmb3IgKGludDMyX3QgaSA9IG1fV29yZEFycmF5LkdldFNpemUoKSAtIDE7IGkgPiBuV29yZEluZGV4OyBpLS0pIHsKLSAgICBkZWxldGUgbV9Xb3JkQXJyYXkuR2V0QXQoaSk7Ci0gICAgbV9Xb3JkQXJyYXkuUmVtb3ZlQXQoaSk7CisgIGludDMyX3Qgc3ogPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fV29yZEFycmF5KTsKKyAgZm9yIChpbnQzMl90IGkgPSBzeiAtIDE7IGkgPiBuV29yZEluZGV4OyBpLS0pIHsKKyAgICBpZiAocGRmaXVtOjpJbmRleEluQm91bmRzKG1fV29yZEFycmF5LCBpKSkKKyAgICAgIG1fV29yZEFycmF5LmVyYXNlKG1fV29yZEFycmF5LmJlZ2luKCkgKyBpKTsKICAgfQogfQogCiB2b2lkIENTZWN0aW9uOjpDbGVhck1pZFdvcmRzKGludDMyX3QgbkJlZ2luSW5kZXgsIGludDMyX3QgbkVuZEluZGV4KSB7CiAgIGZvciAoaW50MzJfdCBpID0gbkVuZEluZGV4OyBpID4gbkJlZ2luSW5kZXg7IGktLSkgewotICAgIGRlbGV0ZSBtX1dvcmRBcnJheS5HZXRBdChpKTsKLSAgICBtX1dvcmRBcnJheS5SZW1vdmVBdChpKTsKKyAgICBpZiAocGRmaXVtOjpJbmRleEluQm91bmRzKG1fV29yZEFycmF5LCBpKSkKKyAgICAgIG1fV29yZEFycmF5LmVyYXNlKG1fV29yZEFycmF5LmJlZ2luKCkgKyBpKTsKICAgfQogfQogCiB2b2lkIENTZWN0aW9uOjpDbGVhcldvcmRzKGNvbnN0IENQVlRfV29yZFJhbmdlJiBQbGFjZVJhbmdlKSB7CiAgIENQVlRfV29yZFBsYWNlIFNlY0JlZ2luUG9zID0gR2V0QmVnaW5Xb3JkUGxhY2UoKTsKICAgQ1BWVF9Xb3JkUGxhY2UgU2VjRW5kUG9zID0gR2V0RW5kV29yZFBsYWNlKCk7Ci0gIGlmIChQbGFjZVJhbmdlLkJlZ2luUG9zLldvcmRDbXAoU2VjQmVnaW5Qb3MpID49IDApIHsKLSAgICBpZiAoUGxhY2VSYW5nZS5FbmRQb3MuV29yZENtcChTZWNFbmRQb3MpIDw9IDApIHsKKyAgaWYgKFBsYWNlUmFuZ2UuQmVnaW5Qb3MgPj0gU2VjQmVnaW5Qb3MpIHsKKyAgICBpZiAoUGxhY2VSYW5nZS5FbmRQb3MgPD0gU2VjRW5kUG9zKSB7CiAgICAgICBDbGVhck1pZFdvcmRzKFBsYWNlUmFuZ2UuQmVnaW5Qb3MubldvcmRJbmRleCwKICAgICAgICAgICAgICAgICAgICAgUGxhY2VSYW5nZS5FbmRQb3MubldvcmRJbmRleCk7CiAgICAgfSBlbHNlIHsKICAgICAgIENsZWFyUmlnaHRXb3JkcyhQbGFjZVJhbmdlLkJlZ2luUG9zLm5Xb3JkSW5kZXgpOwogICAgIH0KLSAgfSBlbHNlIGlmIChQbGFjZVJhbmdlLkVuZFBvcy5Xb3JkQ21wKFNlY0VuZFBvcykgPD0gMCkgeworICB9IGVsc2UgaWYgKFBsYWNlUmFuZ2UuRW5kUG9zIDw9IFNlY0VuZFBvcykgewogICAgIENsZWFyTGVmdFdvcmRzKFBsYWNlUmFuZ2UuRW5kUG9zLm5Xb3JkSW5kZXgpOwogICB9IGVsc2UgewotICAgIFJlc2V0V29yZEFycmF5KCk7CisgICAgbV9Xb3JkQXJyYXkuY2xlYXIoKTsKICAgfQogfQogCiB2b2lkIENTZWN0aW9uOjpDbGVhcldvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSB7Ci0gIGRlbGV0ZSBtX1dvcmRBcnJheS5HZXRBdChwbGFjZS5uV29yZEluZGV4KTsKLSAgbV9Xb3JkQXJyYXkuUmVtb3ZlQXQocGxhY2UubldvcmRJbmRleCk7CisgIGlmIChwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9Xb3JkQXJyYXksIHBsYWNlLm5Xb3JkSW5kZXgpKQorICAgIG1fV29yZEFycmF5LmVyYXNlKG1fV29yZEFycmF5LmJlZ2luKCkgKyBwbGFjZS5uV29yZEluZGV4KTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9jc2VjdGlvbi5oIGIvY29yZS9mcGRmZG9jL2NzZWN0aW9uLmgKaW5kZXggYTJhYzQzYi4uYThhZGU4NiAxMDA2NDQKLS0tIGEvY29yZS9mcGRmZG9jL2NzZWN0aW9uLmgKKysrIGIvY29yZS9mcGRmZG9jL2NzZWN0aW9uLmgKQEAgLTcsOCArNywxMiBAQAogI2lmbmRlZiBDT1JFX0ZQREZET0NfQ1NFQ1RJT05fSF8KICNkZWZpbmUgQ09SRV9GUERGRE9DX0NTRUNUSU9OX0hfCiAKLSNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY2xpbmVzLmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwdnRfc2VjdGlvbmluZm8uaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NsaW5lLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwdnRfd29yZGluZm8uaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3B2dF93b3JkcmFuZ2UuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3R5cGVzZXQuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKQEAgLTI0LDggKzI4LDYgQEAKICAgfkNTZWN0aW9uKCk7CiAKICAgdm9pZCBSZXNldEFsbCgpOwotICB2b2lkIFJlc2V0TGluZUFycmF5KCk7Ci0gIHZvaWQgUmVzZXRXb3JkQXJyYXkoKTsKICAgdm9pZCBSZXNldExpbmVQbGFjZSgpOwogICBDUFZUX1dvcmRQbGFjZSBBZGRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRJbmZvJiB3b3JkaW5mbyk7CkBAIC0zMywyMiArMzUsMjEgQEAKICAgdm9pZCBDbGVhcldvcmRzKGNvbnN0IENQVlRfV29yZFJhbmdlJiBQbGFjZVJhbmdlKTsKICAgdm9pZCBDbGVhcldvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKICAgQ1BWVF9GbG9hdFJlY3QgUmVhcnJhbmdlKCk7Ci0gIENGWF9TaXplRiBHZXRTZWN0aW9uU2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOworICBDRlhfU2l6ZUYgR2V0U2VjdGlvblNpemUoZmxvYXQgZkZvbnRTaXplKTsKICAgQ1BWVF9Xb3JkUGxhY2UgR2V0QmVnaW5Xb3JkUGxhY2UoKSBjb25zdDsKICAgQ1BWVF9Xb3JkUGxhY2UgR2V0RW5kV29yZFBsYWNlKCkgY29uc3Q7CiAgIENQVlRfV29yZFBsYWNlIEdldFByZXZXb3JkUGxhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdDsKICAgQ1BWVF9Xb3JkUGxhY2UgR2V0TmV4dFdvcmRQbGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0OwogICB2b2lkIFVwZGF0ZVdvcmRQbGFjZShDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0OwogICBDUFZUX1dvcmRQbGFjZSBTZWFyY2hXb3JkUGxhY2UoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIGNvbnN0OwotICBDUFZUX1dvcmRQbGFjZSBTZWFyY2hXb3JkUGxhY2UoRlhfRkxPQVQgZngsCisgIENQVlRfV29yZFBsYWNlIFNlYXJjaFdvcmRQbGFjZShmbG9hdCBmeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBsaW5lcGxhY2UpIGNvbnN0OwotICBDUFZUX1dvcmRQbGFjZSBTZWFyY2hXb3JkUGxhY2UoRlhfRkxPQVQgZngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSYgcmFuZ2UpIGNvbnN0OworICBDUFZUX1dvcmRQbGFjZSBTZWFyY2hXb3JkUGxhY2UoZmxvYXQgZngsIGNvbnN0IENQVlRfV29yZFJhbmdlJiByYW5nZSkgY29uc3Q7CiAKICAgQ1BWVF9Xb3JkUGxhY2UgU2VjUGxhY2U7Ci0gIENQVlRfU2VjdGlvbkluZm8gbV9TZWNJbmZvOwotICBDTGluZXMgbV9MaW5lQXJyYXk7Ci0gIENQVlRfQXJyYXlUZW1wbGF0ZTxDUFZUX1dvcmRJbmZvKj4gbV9Xb3JkQXJyYXk7CisgIENQVlRfRmxvYXRSZWN0IG1fUmVjdDsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENMaW5lPj4gbV9MaW5lQXJyYXk7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDUFZUX1dvcmRJbmZvPj4gbV9Xb3JkQXJyYXk7CiAKICBwcml2YXRlOgogICBmcmllbmQgY2xhc3MgQ1R5cGVzZXQ7CkBAIC01Nyw3ICs1OCw3IEBACiAgIHZvaWQgQ2xlYXJSaWdodFdvcmRzKGludDMyX3QgbldvcmRJbmRleCk7CiAgIHZvaWQgQ2xlYXJNaWRXb3JkcyhpbnQzMl90IG5CZWdpbkluZGV4LCBpbnQzMl90IG5FbmRJbmRleCk7CiAKLSAgQ1BERl9WYXJpYWJsZVRleHQqIGNvbnN0IG1fcFZUOworICBVbm93bmVkUHRyPENQREZfVmFyaWFibGVUZXh0PiBjb25zdCBtX3BWVDsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9GUERGRE9DX0NTRUNUSU9OX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvY3R5cGVzZXQuY3BwIGIvY29yZS9mcGRmZG9jL2N0eXBlc2V0LmNwcAppbmRleCA0NTIxNDNlLi4yOTBiOTVlIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZkb2MvY3R5cGVzZXQuY3BwCisrKyBiL2NvcmUvZnBkZmRvYy9jdHlwZXNldC5jcHAKQEAgLTksOCArOSwxMCBAQAogI2luY2x1ZGUgPGFsZ29yaXRobT4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jbGluZS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX3ZhcmlhYmxldGV4dC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcHZ0X3dvcmRpbmZvLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NzZWN0aW9uLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgogCiBuYW1lc3BhY2UgewogCkBAIC0xNzksODMgKzE4MSw4NiBAQAogQ1R5cGVzZXQ6On5DVHlwZXNldCgpIHt9CiAKIENQVlRfRmxvYXRSZWN0IENUeXBlc2V0OjpDaGFyQXJyYXkoKSB7Ci0gIEFTU0VSVChtX3BTZWN0aW9uKTsKLSAgRlhfRkxPQVQgZkxpbmVBc2NlbnQgPQorICBtX3JjUmV0ID0gQ1BWVF9GbG9hdFJlY3QoMCwgMCwgMCwgMCk7CisgIGlmIChtX3BTZWN0aW9uLT5tX0xpbmVBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBtX3JjUmV0OworCisgIGZsb2F0IGZOb2RlV2lkdGggPSBtX3BWVC0+R2V0UGxhdGVXaWR0aCgpIC8KKyAgICAgICAgICAgICAgICAgICAgIChtX3BWVC0+R2V0Q2hhckFycmF5KCkgPD0gMCA/IDEgOiBtX3BWVC0+R2V0Q2hhckFycmF5KCkpOworICBmbG9hdCBmTGluZUFzY2VudCA9CiAgICAgICBtX3BWVC0+R2V0Rm9udEFzY2VudChtX3BWVC0+R2V0RGVmYXVsdEZvbnRJbmRleCgpLCBtX3BWVC0+R2V0Rm9udFNpemUoKSk7Ci0gIEZYX0ZMT0FUIGZMaW5lRGVzY2VudCA9CisgIGZsb2F0IGZMaW5lRGVzY2VudCA9CiAgICAgICBtX3BWVC0+R2V0Rm9udERlc2NlbnQobV9wVlQtPkdldERlZmF1bHRGb250SW5kZXgoKSwgbV9wVlQtPkdldEZvbnRTaXplKCkpOwotICBtX3JjUmV0LkRlZmF1bHQoKTsKLSAgRlhfRkxPQVQgeCA9IDAuMGYsIHkgPSAwLjBmOwotICBGWF9GTE9BVCBmTmV4dFdpZHRoOworICBmbG9hdCB4ID0gMC4wZjsKKyAgZmxvYXQgeSA9IG1fcFZULT5HZXRMaW5lTGVhZGluZygpICsgZkxpbmVBc2NlbnQ7CiAgIGludDMyX3QgblN0YXJ0ID0gMDsKLSAgRlhfRkxPQVQgZk5vZGVXaWR0aCA9IG1fcFZULT5HZXRQbGF0ZVdpZHRoKCkgLwotICAgICAgICAgICAgICAgICAgICAgICAgKG1fcFZULT5tX25DaGFyQXJyYXkgPD0gMCA/IDEgOiBtX3BWVC0+bV9uQ2hhckFycmF5KTsKLSAgaWYgKENMaW5lKiBwTGluZSA9IG1fcFNlY3Rpb24tPm1fTGluZUFycmF5LkdldEF0KDApKSB7Ci0gICAgeCA9IDAuMGY7Ci0gICAgeSArPSBtX3BWVC0+R2V0TGluZUxlYWRpbmcobV9wU2VjdGlvbi0+bV9TZWNJbmZvKTsKLSAgICB5ICs9IGZMaW5lQXNjZW50OwotICAgIG5TdGFydCA9IDA7Ci0gICAgc3dpdGNoIChtX3BWVC0+R2V0QWxpZ25tZW50KG1fcFNlY3Rpb24tPm1fU2VjSW5mbykpIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVYID0gZk5vZGVXaWR0aCAqIFZBUklBQkxFVEVYVF9IQUxGOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgblN0YXJ0ID0gKG1fcFZULT5tX25DaGFyQXJyYXkgLSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCkpIC8gMjsKLSAgICAgICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVYID0KLSAgICAgICAgICAgIGZOb2RlV2lkdGggKiBuU3RhcnQgLSBmTm9kZVdpZHRoICogVkFSSUFCTEVURVhUX0hBTEY7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgICBuU3RhcnQgPSBtX3BWVC0+bV9uQ2hhckFycmF5IC0gbV9wU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpOwotICAgICAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZVggPQotICAgICAgICAgICAgZk5vZGVXaWR0aCAqIG5TdGFydCAtIGZOb2RlV2lkdGggKiBWQVJJQUJMRVRFWFRfSEFMRjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGZvciAoaW50MzJfdCB3ID0gMCwgc3ogPSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRTaXplKCk7IHcgPCBzejsgdysrKSB7Ci0gICAgICBpZiAodyA+PSBtX3BWVC0+bV9uQ2hhckFycmF5KSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZk5leHRXaWR0aCA9IDA7Ci0gICAgICBpZiAoQ1BWVF9Xb3JkSW5mbyogcE5leHRXb3JkID0gbV9wU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQodyArIDEpKSB7Ci0gICAgICAgIHBOZXh0V29yZC0+ZldvcmRUYWlsID0gMDsKLSAgICAgICAgZk5leHRXaWR0aCA9IG1fcFZULT5HZXRXb3JkV2lkdGgoKnBOZXh0V29yZCk7Ci0gICAgICB9Ci0gICAgICBpZiAoQ1BWVF9Xb3JkSW5mbyogcFdvcmQgPSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdCh3KSkgewotICAgICAgICBwV29yZC0+ZldvcmRUYWlsID0gMDsKLSAgICAgICAgRlhfRkxPQVQgZldvcmRXaWR0aCA9IG1fcFZULT5HZXRXb3JkV2lkdGgoKnBXb3JkKTsKLSAgICAgICAgRlhfRkxPQVQgZldvcmRBc2NlbnQgPSBtX3BWVC0+R2V0V29yZEFzY2VudCgqcFdvcmQpOwotICAgICAgICBGWF9GTE9BVCBmV29yZERlc2NlbnQgPSBtX3BWVC0+R2V0V29yZERlc2NlbnQoKnBXb3JkKTsKLSAgICAgICAgeCA9IChGWF9GTE9BVCkoZk5vZGVXaWR0aCAqICh3ICsgblN0YXJ0ICsgMC41KSAtCi0gICAgICAgICAgICAgICAgICAgICAgIGZXb3JkV2lkdGggKiBWQVJJQUJMRVRFWFRfSEFMRik7Ci0gICAgICAgIHBXb3JkLT5mV29yZFggPSB4OwotICAgICAgICBwV29yZC0+ZldvcmRZID0geTsKLSAgICAgICAgaWYgKHcgPT0gMCkgewotICAgICAgICAgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWCA9IHg7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHcgIT0gbV9wU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0U2l6ZSgpIC0gMSkgewotICAgICAgICAgIHBXb3JkLT5mV29yZFRhaWwgPQotICAgICAgICAgICAgICAoZk5vZGVXaWR0aCAtIChmV29yZFdpZHRoICsgZk5leHRXaWR0aCkgKiBWQVJJQUJMRVRFWFRfSEFMRiA+IDAKLSAgICAgICAgICAgICAgICAgICA/IGZOb2RlV2lkdGggLSAoZldvcmRXaWR0aCArIGZOZXh0V2lkdGgpICogVkFSSUFCTEVURVhUX0hBTEYKLSAgICAgICAgICAgICAgICAgICA6IDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBXb3JkLT5mV29yZFRhaWwgPSAwOwotICAgICAgICB9Ci0gICAgICAgIHggKz0gZldvcmRXaWR0aDsKLSAgICAgICAgZkxpbmVBc2NlbnQgPSBzdGQ6Om1heChmTGluZUFzY2VudCwgZldvcmRBc2NlbnQpOwotICAgICAgICBmTGluZURlc2NlbnQgPSBzdGQ6Om1pbihmTGluZURlc2NlbnQsIGZXb3JkRGVzY2VudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHBMaW5lLT5tX0xpbmVJbmZvLm5CZWdpbldvcmRJbmRleCA9IDA7Ci0gICAgcExpbmUtPm1fTGluZUluZm8ubkVuZFdvcmRJbmRleCA9IG1fcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKSAtIDE7Ci0gICAgcExpbmUtPm1fTGluZUluZm8uZkxpbmVZID0geTsKLSAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZVdpZHRoID0geCAtIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWDsKLSAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZUFzY2VudCA9IGZMaW5lQXNjZW50OwotICAgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lRGVzY2VudCA9IGZMaW5lRGVzY2VudDsKLSAgICB5IC09IGZMaW5lRGVzY2VudDsKKyAgQ0xpbmUqIHBMaW5lID0gbV9wU2VjdGlvbi0+bV9MaW5lQXJyYXkuZnJvbnQoKS5nZXQoKTsKKyAgc3dpdGNoIChtX3BWVC0+R2V0QWxpZ25tZW50KCkpIHsKKyAgICBjYXNlIDA6CisgICAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZVggPSBmTm9kZVdpZHRoICogVkFSSUFCTEVURVhUX0hBTEY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBuU3RhcnQgPSAobV9wVlQtPkdldENoYXJBcnJheSgpIC0KKyAgICAgICAgICAgICAgICBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fcFNlY3Rpb24tPm1fV29yZEFycmF5KSkgLworICAgICAgICAgICAgICAgMjsKKyAgICAgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWCA9CisgICAgICAgICAgZk5vZGVXaWR0aCAqIG5TdGFydCAtIGZOb2RlV2lkdGggKiBWQVJJQUJMRVRFWFRfSEFMRjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIG5TdGFydCA9IG1fcFZULT5HZXRDaGFyQXJyYXkoKSAtCisgICAgICAgICAgICAgICBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fcFNlY3Rpb24tPm1fV29yZEFycmF5KTsKKyAgICAgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWCA9CisgICAgICAgICAgZk5vZGVXaWR0aCAqIG5TdGFydCAtIGZOb2RlV2lkdGggKiBWQVJJQUJMRVRFWFRfSEFMRjsKKyAgICAgIGJyZWFrOwogICB9Ci0gIHJldHVybiBtX3JjUmV0ID0gQ1BWVF9GbG9hdFJlY3QoMCwgMCwgeCwgeSk7CisgIGZvciAoaW50MzJfdCB3ID0gMCwKKyAgICAgICAgICAgICAgIHN6ID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX3BTZWN0aW9uLT5tX1dvcmRBcnJheSk7CisgICAgICAgdyA8IHN6OyB3KyspIHsKKyAgICBpZiAodyA+PSBtX3BWVC0+R2V0Q2hhckFycmF5KCkpCisgICAgICBicmVhazsKKworICAgIGZsb2F0IGZOZXh0V2lkdGggPSAwOworICAgIGlmIChwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9wU2VjdGlvbi0+bV9Xb3JkQXJyYXksIHcgKyAxKSkgeworICAgICAgQ1BWVF9Xb3JkSW5mbyogcE5leHRXb3JkID0gbV9wU2VjdGlvbi0+bV9Xb3JkQXJyYXlbdyArIDFdLmdldCgpOworICAgICAgcE5leHRXb3JkLT5mV29yZFRhaWwgPSAwOworICAgICAgZk5leHRXaWR0aCA9IG1fcFZULT5HZXRXb3JkV2lkdGgoKnBOZXh0V29yZCk7CisgICAgfQorICAgIENQVlRfV29yZEluZm8qIHBXb3JkID0gbV9wU2VjdGlvbi0+bV9Xb3JkQXJyYXlbd10uZ2V0KCk7CisgICAgcFdvcmQtPmZXb3JkVGFpbCA9IDA7CisgICAgZmxvYXQgZldvcmRXaWR0aCA9IG1fcFZULT5HZXRXb3JkV2lkdGgoKnBXb3JkKTsKKyAgICBmbG9hdCBmV29yZEFzY2VudCA9IG1fcFZULT5HZXRXb3JkQXNjZW50KCpwV29yZCk7CisgICAgZmxvYXQgZldvcmREZXNjZW50ID0gbV9wVlQtPkdldFdvcmREZXNjZW50KCpwV29yZCk7CisgICAgeCA9IChmbG9hdCkoZk5vZGVXaWR0aCAqICh3ICsgblN0YXJ0ICsgMC41KSAtCisgICAgICAgICAgICAgICAgZldvcmRXaWR0aCAqIFZBUklBQkxFVEVYVF9IQUxGKTsKKyAgICBwV29yZC0+ZldvcmRYID0geDsKKyAgICBwV29yZC0+ZldvcmRZID0geTsKKyAgICBpZiAodyA9PSAwKSB7CisgICAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZVggPSB4OworICAgIH0KKyAgICBpZiAodyAhPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fcFNlY3Rpb24tPm1fV29yZEFycmF5KSAtIDEpIHsKKyAgICAgIHBXb3JkLT5mV29yZFRhaWwgPQorICAgICAgICAgIChmTm9kZVdpZHRoIC0gKGZXb3JkV2lkdGggKyBmTmV4dFdpZHRoKSAqIFZBUklBQkxFVEVYVF9IQUxGID4gMAorICAgICAgICAgICAgICAgPyBmTm9kZVdpZHRoIC0gKGZXb3JkV2lkdGggKyBmTmV4dFdpZHRoKSAqIFZBUklBQkxFVEVYVF9IQUxGCisgICAgICAgICAgICAgICA6IDApOworICAgIH0gZWxzZSB7CisgICAgICBwV29yZC0+ZldvcmRUYWlsID0gMDsKKyAgICB9CisgICAgeCArPSBmV29yZFdpZHRoOworICAgIGZMaW5lQXNjZW50ID0gc3RkOjptYXgoZkxpbmVBc2NlbnQsIGZXb3JkQXNjZW50KTsKKyAgICBmTGluZURlc2NlbnQgPSBzdGQ6Om1pbihmTGluZURlc2NlbnQsIGZXb3JkRGVzY2VudCk7CisgIH0KKyAgcExpbmUtPm1fTGluZUluZm8ubkJlZ2luV29yZEluZGV4ID0gMDsKKyAgcExpbmUtPm1fTGluZUluZm8ubkVuZFdvcmRJbmRleCA9CisgICAgICBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fcFNlY3Rpb24tPm1fV29yZEFycmF5KSAtIDE7CisgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWSA9IHk7CisgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lV2lkdGggPSB4IC0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVYOworICBwTGluZS0+bV9MaW5lSW5mby5mTGluZUFzY2VudCA9IGZMaW5lQXNjZW50OworICBwTGluZS0+bV9MaW5lSW5mby5mTGluZURlc2NlbnQgPSBmTGluZURlc2NlbnQ7CisgIG1fcmNSZXQgPSBDUFZUX0Zsb2F0UmVjdCgwLCAwLCB4LCB5IC0gZkxpbmVEZXNjZW50KTsKKyAgcmV0dXJuIG1fcmNSZXQ7CiB9CiAKLUNGWF9TaXplRiBDVHlwZXNldDo6R2V0RWRpdFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSB7CitDRlhfU2l6ZUYgQ1R5cGVzZXQ6OkdldEVkaXRTaXplKGZsb2F0IGZGb250U2l6ZSkgewogICBBU1NFUlQobV9wU2VjdGlvbik7CiAgIEFTU0VSVChtX3BWVCk7CiAgIFNwbGl0TGluZXMoZmFsc2UsIGZGb250U2l6ZSk7CkBAIC0yNjQsNDAgKzI2OSwzOSBAQAogCiBDUFZUX0Zsb2F0UmVjdCBDVHlwZXNldDo6VHlwZXNldCgpIHsKICAgQVNTRVJUKG1fcFZUKTsKLSAgbV9wU2VjdGlvbi0+bV9MaW5lQXJyYXkuRW1wdHkoKTsKKyAgbV9wU2VjdGlvbi0+bV9MaW5lQXJyYXkuY2xlYXIoKTsKICAgU3BsaXRMaW5lcyh0cnVlLCAwLjBmKTsKLSAgbV9wU2VjdGlvbi0+bV9MaW5lQXJyYXkuQ2xlYXIoKTsKICAgT3V0cHV0TGluZXMoKTsKICAgcmV0dXJuIG1fcmNSZXQ7CiB9CiAKLXZvaWQgQ1R5cGVzZXQ6OlNwbGl0TGluZXMoYm9vbCBiVHlwZXNldCwgRlhfRkxPQVQgZkZvbnRTaXplKSB7Cit2b2lkIENUeXBlc2V0OjpTcGxpdExpbmVzKGJvb2wgYlR5cGVzZXQsIGZsb2F0IGZGb250U2l6ZSkgewogICBBU1NFUlQobV9wVlQpOwogICBBU1NFUlQobV9wU2VjdGlvbik7CiAgIGludDMyX3QgbkxpbmVIZWFkID0gMDsKICAgaW50MzJfdCBuTGluZVRhaWwgPSAwOwotICBGWF9GTE9BVCBmTWF4WCA9IDAuMGYsIGZNYXhZID0gMC4wZjsKLSAgRlhfRkxPQVQgZkxpbmVXaWR0aCA9IDAuMGYsIGZCYWNrdXBMaW5lV2lkdGggPSAwLjBmOwotICBGWF9GTE9BVCBmTGluZUFzY2VudCA9IDAuMGYsIGZCYWNrdXBMaW5lQXNjZW50ID0gMC4wZjsKLSAgRlhfRkxPQVQgZkxpbmVEZXNjZW50ID0gMC4wZiwgZkJhY2t1cExpbmVEZXNjZW50ID0gMC4wZjsKKyAgZmxvYXQgZk1heFggPSAwLjBmLCBmTWF4WSA9IDAuMGY7CisgIGZsb2F0IGZMaW5lV2lkdGggPSAwLjBmLCBmQmFja3VwTGluZVdpZHRoID0gMC4wZjsKKyAgZmxvYXQgZkxpbmVBc2NlbnQgPSAwLjBmLCBmQmFja3VwTGluZUFzY2VudCA9IDAuMGY7CisgIGZsb2F0IGZMaW5lRGVzY2VudCA9IDAuMGYsIGZCYWNrdXBMaW5lRGVzY2VudCA9IDAuMGY7CiAgIGludDMyX3QgbldvcmRTdGFydFBvcyA9IDA7CiAgIGJvb2wgYkZ1bGxXb3JkID0gZmFsc2U7CiAgIGludDMyX3QgbkxpbmVGdWxsV29yZEluZGV4ID0gMDsKICAgaW50MzJfdCBuQ2hhckluZGV4ID0gMDsKICAgQ1BWVF9MaW5lSW5mbyBsaW5lOwotICBGWF9GTE9BVCBmV29yZFdpZHRoID0gMDsKLSAgRlhfRkxPQVQgZlR5cGVzZXRXaWR0aCA9IHN0ZDo6bWF4KAotICAgICAgbV9wVlQtPkdldFBsYXRlV2lkdGgoKSAtIG1fcFZULT5HZXRMaW5lSW5kZW50KG1fcFNlY3Rpb24tPm1fU2VjSW5mbyksCi0gICAgICAwLjBmKTsKLSAgaW50MzJfdCBuVG90YWxXb3JkcyA9IG1fcFNlY3Rpb24tPm1fV29yZEFycmF5LkdldFNpemUoKTsKKyAgZmxvYXQgZldvcmRXaWR0aCA9IDA7CisgIGZsb2F0IGZUeXBlc2V0V2lkdGggPQorICAgICAgc3RkOjptYXgobV9wVlQtPkdldFBsYXRlV2lkdGgoKSAtIG1fcFZULT5HZXRMaW5lSW5kZW50KCksIDAuMGYpOworICBpbnQzMl90IG5Ub3RhbFdvcmRzID0KKyAgICAgIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9wU2VjdGlvbi0+bV9Xb3JkQXJyYXkpOwogICBib29sIGJPcGVuZWQgPSBmYWxzZTsKICAgaWYgKG5Ub3RhbFdvcmRzID4gMCkgewogICAgIGludDMyX3QgaSA9IDA7CiAgICAgd2hpbGUgKGkgPCBuVG90YWxXb3JkcykgewotICAgICAgQ1BWVF9Xb3JkSW5mbyogcFdvcmQgPSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheS5HZXRBdChpKTsKKyAgICAgIENQVlRfV29yZEluZm8qIHBXb3JkID0gbV9wU2VjdGlvbi0+bV9Xb3JkQXJyYXlbaV0uZ2V0KCk7CiAgICAgICBDUFZUX1dvcmRJbmZvKiBwT2xkV29yZCA9IHBXb3JkOwogICAgICAgaWYgKGkgPiAwKSB7Ci0gICAgICAgIHBPbGRXb3JkID0gbV9wU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQoaSAtIDEpOworICAgICAgICBwT2xkV29yZCA9IG1fcFNlY3Rpb24tPm1fV29yZEFycmF5W2kgLSAxXS5nZXQoKTsKICAgICAgIH0KICAgICAgIGlmIChwV29yZCkgewogICAgICAgICBpZiAoYlR5cGVzZXQpIHsKQEAgLTMxMCw4ICszMTQsOCBAQAogICAgICAgICAgIGZMaW5lRGVzY2VudCA9CiAgICAgICAgICAgICAgIHN0ZDo6bWluKGZMaW5lRGVzY2VudCwgbV9wVlQtPkdldFdvcmREZXNjZW50KCpwV29yZCwgZkZvbnRTaXplKSk7CiAgICAgICAgICAgZldvcmRXaWR0aCA9IG1fcFZULT5HZXRXb3JkV2lkdGgoCi0gICAgICAgICAgICAgIHBXb3JkLT5uRm9udEluZGV4LCBwV29yZC0+V29yZCwgbV9wVlQtPm1fd1N1YldvcmQsCi0gICAgICAgICAgICAgIG1fcFZULT5tX2ZDaGFyU3BhY2UsIG1fcFZULT5tX25Ib3J6U2NhbGUsIGZGb250U2l6ZSwKKyAgICAgICAgICAgICAgcFdvcmQtPm5Gb250SW5kZXgsIHBXb3JkLT5Xb3JkLCBtX3BWVC0+R2V0U3ViV29yZCgpLAorICAgICAgICAgICAgICBtX3BWVC0+R2V0Q2hhclNwYWNlKCksIG1fcFZULT5HZXRIb3J6U2NhbGUoKSwgZkZvbnRTaXplLAogICAgICAgICAgICAgICBwV29yZC0+ZldvcmRUYWlsKTsKICAgICAgICAgfQogICAgICAgICBpZiAoIWJPcGVuZWQpIHsKQEAgLTM0MCw3ICszNDQsNyBAQAogICAgICAgICB9CiAgICAgICAgIG5DaGFySW5kZXgrKzsKICAgICAgIH0KLSAgICAgIGlmIChtX3BWVC0+bV9iTGltaXRXaWR0aCAmJiBmVHlwZXNldFdpZHRoID4gMCAmJgorICAgICAgaWYgKG1fcFZULT5Jc0F1dG9SZXR1cm4oKSAmJiBmVHlwZXNldFdpZHRoID4gMCAmJgogICAgICAgICAgIGZMaW5lV2lkdGggKyBmV29yZFdpZHRoID4gZlR5cGVzZXRXaWR0aCkgewogICAgICAgICBpZiAobkxpbmVGdWxsV29yZEluZGV4ID4gMCkgewogICAgICAgICAgIGkgPSBuV29yZFN0YXJ0UG9zOwpAQCAtMzYyLDcgKzM2Niw3IEBACiAgICAgICAgICAgbGluZS5mTGluZURlc2NlbnQgPSBmTGluZURlc2NlbnQ7CiAgICAgICAgICAgbV9wU2VjdGlvbi0+QWRkTGluZShsaW5lKTsKICAgICAgICAgfQotICAgICAgICBmTWF4WSArPSAoZkxpbmVBc2NlbnQgKyBtX3BWVC0+R2V0TGluZUxlYWRpbmcobV9wU2VjdGlvbi0+bV9TZWNJbmZvKSk7CisgICAgICAgIGZNYXhZICs9IChmTGluZUFzY2VudCArIG1fcFZULT5HZXRMaW5lTGVhZGluZygpKTsKICAgICAgICAgZk1heFkgLT0gZkxpbmVEZXNjZW50OwogICAgICAgICBmTWF4WCA9IHN0ZDo6bWF4KGZMaW5lV2lkdGgsIGZNYXhYKTsKICAgICAgICAgbkxpbmVIZWFkID0gaTsKQEAgLTM4OCwxNCArMzkyLDE0IEBACiAgICAgICAgIGxpbmUuZkxpbmVEZXNjZW50ID0gZkxpbmVEZXNjZW50OwogICAgICAgICBtX3BTZWN0aW9uLT5BZGRMaW5lKGxpbmUpOwogICAgICAgfQotICAgICAgZk1heFkgKz0gKGZMaW5lQXNjZW50ICsgbV9wVlQtPkdldExpbmVMZWFkaW5nKG1fcFNlY3Rpb24tPm1fU2VjSW5mbykpOworICAgICAgZk1heFkgKz0gKGZMaW5lQXNjZW50ICsgbV9wVlQtPkdldExpbmVMZWFkaW5nKCkpOwogICAgICAgZk1heFkgLT0gZkxpbmVEZXNjZW50OwogICAgICAgZk1heFggPSBzdGQ6Om1heChmTGluZVdpZHRoLCBmTWF4WCk7CiAgICAgfQogICB9IGVsc2UgewogICAgIGlmIChiVHlwZXNldCkgewotICAgICAgZkxpbmVBc2NlbnQgPSBtX3BWVC0+R2V0TGluZUFzY2VudChtX3BTZWN0aW9uLT5tX1NlY0luZm8pOwotICAgICAgZkxpbmVEZXNjZW50ID0gbV9wVlQtPkdldExpbmVEZXNjZW50KG1fcFNlY3Rpb24tPm1fU2VjSW5mbyk7CisgICAgICBmTGluZUFzY2VudCA9IG1fcFZULT5HZXRMaW5lQXNjZW50KCk7CisgICAgICBmTGluZURlc2NlbnQgPSBtX3BWVC0+R2V0TGluZURlc2NlbnQoKTsKICAgICB9IGVsc2UgewogICAgICAgZkxpbmVBc2NlbnQgPQogICAgICAgICAgIG1fcFZULT5HZXRGb250QXNjZW50KG1fcFZULT5HZXREZWZhdWx0Rm9udEluZGV4KCksIGZGb250U2l6ZSk7CkBAIC00MTEsOCArNDE1LDcgQEAKICAgICAgIGxpbmUuZkxpbmVEZXNjZW50ID0gZkxpbmVEZXNjZW50OwogICAgICAgbV9wU2VjdGlvbi0+QWRkTGluZShsaW5lKTsKICAgICB9Ci0gICAgZk1heFkgKz0gbV9wVlQtPkdldExpbmVMZWFkaW5nKG1fcFNlY3Rpb24tPm1fU2VjSW5mbykgKyBmTGluZUFzY2VudCAtCi0gICAgICAgICAgICAgZkxpbmVEZXNjZW50OworICAgIGZNYXhZICs9IG1fcFZULT5HZXRMaW5lTGVhZGluZygpICsgZkxpbmVBc2NlbnQgLSBmTGluZURlc2NlbnQ7CiAgIH0KICAgbV9yY1JldCA9IENQVlRfRmxvYXRSZWN0KDAsIDAsIGZNYXhYLCBmTWF4WSk7CiB9CkBAIC00MjAsMTEgKzQyMywxMSBAQAogdm9pZCBDVHlwZXNldDo6T3V0cHV0TGluZXMoKSB7CiAgIEFTU0VSVChtX3BWVCk7CiAgIEFTU0VSVChtX3BTZWN0aW9uKTsKLSAgRlhfRkxPQVQgZk1pblggPSAwLjBmLCBmTWluWSA9IDAuMGYsIGZNYXhYID0gMC4wZiwgZk1heFkgPSAwLjBmOwotICBGWF9GTE9BVCBmUG9zWCA9IDAuMGYsIGZQb3NZID0gMC4wZjsKLSAgRlhfRkxPQVQgZkxpbmVJbmRlbnQgPSBtX3BWVC0+R2V0TGluZUluZGVudChtX3BTZWN0aW9uLT5tX1NlY0luZm8pOwotICBGWF9GTE9BVCBmVHlwZXNldFdpZHRoID0gc3RkOjptYXgobV9wVlQtPkdldFBsYXRlV2lkdGgoKSAtIGZMaW5lSW5kZW50LCAwLjBmKTsKLSAgc3dpdGNoIChtX3BWVC0+R2V0QWxpZ25tZW50KG1fcFNlY3Rpb24tPm1fU2VjSW5mbykpIHsKKyAgZmxvYXQgZk1pblggPSAwLjBmLCBmTWluWSA9IDAuMGYsIGZNYXhYID0gMC4wZiwgZk1heFkgPSAwLjBmOworICBmbG9hdCBmUG9zWCA9IDAuMGYsIGZQb3NZID0gMC4wZjsKKyAgZmxvYXQgZkxpbmVJbmRlbnQgPSBtX3BWVC0+R2V0TGluZUluZGVudCgpOworICBmbG9hdCBmVHlwZXNldFdpZHRoID0gc3RkOjptYXgobV9wVlQtPkdldFBsYXRlV2lkdGgoKSAtIGZMaW5lSW5kZW50LCAwLjBmKTsKKyAgc3dpdGNoIChtX3BWVC0+R2V0QWxpZ25tZW50KCkpIHsKICAgICBkZWZhdWx0OgogICAgIGNhc2UgMDoKICAgICAgIGZNaW5YID0gMC4wZjsKQEAgLTQzOSw1NCArNDQyLDQwIEBACiAgIGZNYXhYID0gZk1pblggKyBtX3JjUmV0LldpZHRoKCk7CiAgIGZNaW5ZID0gMC4wZjsKICAgZk1heFkgPSBtX3JjUmV0LkhlaWdodCgpOwotICBpbnQzMl90IG5Ub3RhbExpbmVzID0gbV9wU2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0U2l6ZSgpOworICBpbnQzMl90IG5Ub3RhbExpbmVzID0KKyAgICAgIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9wU2VjdGlvbi0+bV9MaW5lQXJyYXkpOwogICBpZiAoblRvdGFsTGluZXMgPiAwKSB7Ci0gICAgbV9wU2VjdGlvbi0+bV9TZWNJbmZvLm5Ub3RhbExpbmUgPSBuVG90YWxMaW5lczsKICAgICBmb3IgKGludDMyX3QgbCA9IDA7IGwgPCBuVG90YWxMaW5lczsgbCsrKSB7Ci0gICAgICBpZiAoQ0xpbmUqIHBMaW5lID0gbV9wU2VjdGlvbi0+bV9MaW5lQXJyYXkuR2V0QXQobCkpIHsKLSAgICAgICAgc3dpdGNoIChtX3BWVC0+R2V0QWxpZ25tZW50KG1fcFNlY3Rpb24tPm1fU2VjSW5mbykpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgIGZQb3NYID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIGZQb3NYID0gKGZUeXBlc2V0V2lkdGggLSBwTGluZS0+bV9MaW5lSW5mby5mTGluZVdpZHRoKSAqCi0gICAgICAgICAgICAgICAgICAgIFZBUklBQkxFVEVYVF9IQUxGOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgZlBvc1ggPSBmVHlwZXNldFdpZHRoIC0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVXaWR0aDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGZQb3NYICs9IGZMaW5lSW5kZW50OwotICAgICAgICBmUG9zWSArPSBtX3BWVC0+R2V0TGluZUxlYWRpbmcobV9wU2VjdGlvbi0+bV9TZWNJbmZvKTsKLSAgICAgICAgZlBvc1kgKz0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVBc2NlbnQ7Ci0gICAgICAgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWCA9IGZQb3NYIC0gZk1pblg7Ci0gICAgICAgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWSA9IGZQb3NZIC0gZk1pblk7Ci0gICAgICAgIGZvciAoaW50MzJfdCB3ID0gcExpbmUtPm1fTGluZUluZm8ubkJlZ2luV29yZEluZGV4OwotICAgICAgICAgICAgIHcgPD0gcExpbmUtPm1fTGluZUluZm8ubkVuZFdvcmRJbmRleDsgdysrKSB7Ci0gICAgICAgICAgaWYgKENQVlRfV29yZEluZm8qIHBXb3JkID0gbV9wU2VjdGlvbi0+bV9Xb3JkQXJyYXkuR2V0QXQodykpIHsKLSAgICAgICAgICAgIHBXb3JkLT5mV29yZFggPSBmUG9zWCAtIGZNaW5YOwotICAgICAgICAgICAgaWYgKHBXb3JkLT5wV29yZFByb3BzKSB7Ci0gICAgICAgICAgICAgIHN3aXRjaCAocFdvcmQtPnBXb3JkUHJvcHMtPm5TY3JpcHRUeXBlKSB7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBjYXNlIENQREZfVmFyaWFibGVUZXh0OjpTY3JpcHRUeXBlOjpOb3JtYWw6Ci0gICAgICAgICAgICAgICAgICBwV29yZC0+ZldvcmRZID0gZlBvc1kgLSBmTWluWTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQ1BERl9WYXJpYWJsZVRleHQ6OlNjcmlwdFR5cGU6OlN1cGVyOgotICAgICAgICAgICAgICAgICAgcFdvcmQtPmZXb3JkWSA9IGZQb3NZIC0gbV9wVlQtPkdldFdvcmRBc2NlbnQoKnBXb3JkKSAtIGZNaW5ZOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBDUERGX1ZhcmlhYmxlVGV4dDo6U2NyaXB0VHlwZTo6U3ViOgotICAgICAgICAgICAgICAgICAgcFdvcmQtPmZXb3JkWSA9IGZQb3NZIC0gbV9wVlQtPkdldFdvcmREZXNjZW50KCpwV29yZCkgLSBmTWluWTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBwV29yZC0+ZldvcmRZID0gZlBvc1kgLSBmTWluWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZQb3NYICs9IG1fcFZULT5HZXRXb3JkV2lkdGgoKnBXb3JkKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZlBvc1kgLT0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVEZXNjZW50OworICAgICAgQ0xpbmUqIHBMaW5lID0gbV9wU2VjdGlvbi0+bV9MaW5lQXJyYXlbbF0uZ2V0KCk7CisgICAgICBzd2l0Y2ggKG1fcFZULT5HZXRBbGlnbm1lbnQoKSkgeworICAgICAgICBkZWZhdWx0OgorICAgICAgICBjYXNlIDA6CisgICAgICAgICAgZlBvc1ggPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgZlBvc1ggPSAoZlR5cGVzZXRXaWR0aCAtIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lV2lkdGgpICoKKyAgICAgICAgICAgICAgICAgIFZBUklBQkxFVEVYVF9IQUxGOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgZlBvc1ggPSBmVHlwZXNldFdpZHRoIC0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVXaWR0aDsKKyAgICAgICAgICBicmVhazsKICAgICAgIH0KKyAgICAgIGZQb3NYICs9IGZMaW5lSW5kZW50OworICAgICAgZlBvc1kgKz0gbV9wVlQtPkdldExpbmVMZWFkaW5nKCk7CisgICAgICBmUG9zWSArPSBwTGluZS0+bV9MaW5lSW5mby5mTGluZUFzY2VudDsKKyAgICAgIHBMaW5lLT5tX0xpbmVJbmZvLmZMaW5lWCA9IGZQb3NYIC0gZk1pblg7CisgICAgICBwTGluZS0+bV9MaW5lSW5mby5mTGluZVkgPSBmUG9zWSAtIGZNaW5ZOworICAgICAgZm9yIChpbnQzMl90IHcgPSBwTGluZS0+bV9MaW5lSW5mby5uQmVnaW5Xb3JkSW5kZXg7CisgICAgICAgICAgIHcgPD0gcExpbmUtPm1fTGluZUluZm8ubkVuZFdvcmRJbmRleDsgdysrKSB7CisgICAgICAgIGlmIChwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9wU2VjdGlvbi0+bV9Xb3JkQXJyYXksIHcpKSB7CisgICAgICAgICAgQ1BWVF9Xb3JkSW5mbyogcFdvcmQgPSBtX3BTZWN0aW9uLT5tX1dvcmRBcnJheVt3XS5nZXQoKTsKKyAgICAgICAgICBwV29yZC0+ZldvcmRYID0gZlBvc1ggLSBmTWluWDsKKyAgICAgICAgICBwV29yZC0+ZldvcmRZID0gZlBvc1kgLSBmTWluWTsKKworICAgICAgICAgIGZQb3NYICs9IG1fcFZULT5HZXRXb3JkV2lkdGgoKnBXb3JkKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZlBvc1kgLT0gcExpbmUtPm1fTGluZUluZm8uZkxpbmVEZXNjZW50OwogICAgIH0KICAgfQogICBtX3JjUmV0ID0gQ1BWVF9GbG9hdFJlY3QoZk1pblgsIGZNaW5ZLCBmTWF4WCwgZk1heFkpOwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2N0eXBlc2V0LmggYi9jb3JlL2ZwZGZkb2MvY3R5cGVzZXQuaAppbmRleCA0MTYxYzAzLi4zZDU2YTNiIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZkb2MvY3R5cGVzZXQuaAorKysgYi9jb3JlL2ZwZGZkb2MvY3R5cGVzZXQuaApAQCAtOSw2ICs5LDcgQEAKIAogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcHZ0X2Zsb2F0cmVjdC5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogCiBjbGFzcyBDUERGX1ZhcmlhYmxlVGV4dDsKIGNsYXNzIENTZWN0aW9uOwpAQCAtMTgsMTYgKzE5LDE2IEBACiAgIGV4cGxpY2l0IENUeXBlc2V0KENTZWN0aW9uKiBwU2VjdGlvbik7CiAgIH5DVHlwZXNldCgpOwogCi0gIENGWF9TaXplRiBHZXRFZGl0U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOworICBDRlhfU2l6ZUYgR2V0RWRpdFNpemUoZmxvYXQgZkZvbnRTaXplKTsKICAgQ1BWVF9GbG9hdFJlY3QgVHlwZXNldCgpOwogICBDUFZUX0Zsb2F0UmVjdCBDaGFyQXJyYXkoKTsKIAogIHByaXZhdGU6Ci0gIHZvaWQgU3BsaXRMaW5lcyhib29sIGJUeXBlc2V0LCBGWF9GTE9BVCBmRm9udFNpemUpOworICB2b2lkIFNwbGl0TGluZXMoYm9vbCBiVHlwZXNldCwgZmxvYXQgZkZvbnRTaXplKTsKICAgdm9pZCBPdXRwdXRMaW5lcygpOwogCiAgIENQVlRfRmxvYXRSZWN0IG1fcmNSZXQ7Ci0gIENQREZfVmFyaWFibGVUZXh0KiBjb25zdCBtX3BWVDsKKyAgVW5vd25lZFB0cjxDUERGX1ZhcmlhYmxlVGV4dD4gY29uc3QgbV9wVlQ7CiAgIENTZWN0aW9uKiBjb25zdCBtX3BTZWN0aW9uOwogfTsKIApkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2RvY190YWdnZWQuY3BwIGIvY29yZS9mcGRmZG9jL2RvY190YWdnZWQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjVjZjg1Li4wMDAwMDAwCi0tLSBhL2NvcmUvZnBkZmRvYy9kb2NfdGFnZ2VkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQxOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudC5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9uYW1lLmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bWJlci5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9yZWZlcmVuY2UuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtLmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfbnVtYmVydHJlZS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9mcGRmX3RhZ2dlZC5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmRvYy90YWdnZWRfaW50LmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotCi1uYW1lc3BhY2UgewotCi1jb25zdCBpbnQgbk1heFJlY3Vyc2lvbiA9IDMyOwotCi1ib29sIElzVGFnZ2VkKGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2MpIHsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBwQ2F0YWxvZyA9IHBEb2MtPkdldFJvb3QoKTsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBwTWFya0luZm8gPSBwQ2F0YWxvZy0+R2V0RGljdEZvcigiTWFya0luZm8iKTsKLSAgcmV0dXJuIHBNYXJrSW5mbyAmJiBwTWFya0luZm8tPkdldEludGVnZXJGb3IoIk1hcmtlZCIpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotQ1BERl9TdHJ1Y3RLaWQ6OkNQREZfU3RydWN0S2lkKCkKLSAgICA6IG1fVHlwZShJbnZhbGlkKSwKLSAgICAgIG1fcERpY3QobnVsbHB0ciksCi0gICAgICBtX1BhZ2VPYmpOdW0oMCksCi0gICAgICBtX1JlZk9iak51bSgwKSwKLSAgICAgIG1fQ29udGVudElkKDApIHt9Ci0KLUNQREZfU3RydWN0S2lkOjpDUERGX1N0cnVjdEtpZChjb25zdCBDUERGX1N0cnVjdEtpZCYgdGhhdCkgPSBkZWZhdWx0OwotCi1DUERGX1N0cnVjdEtpZDo6fkNQREZfU3RydWN0S2lkKCkge30KLQotLy8gc3RhdGljCi1zdGQ6OnVuaXF1ZV9wdHI8SVBERl9TdHJ1Y3RUcmVlPiBJUERGX1N0cnVjdFRyZWU6OkxvYWRQYWdlKAotICAgIGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2MsCi0gICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QpIHsKLSAgaWYgKCFJc1RhZ2dlZChwRG9jKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBhdXRvIHBUcmVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU3RydWN0VHJlZT4ocERvYyk7Ci0gIHBUcmVlLT5Mb2FkUGFnZVRyZWUocFBhZ2VEaWN0KTsKLSAgcmV0dXJuIHN0ZDo6bW92ZShwVHJlZSk7Ci19Ci0KLUNQREZfU3RydWN0VHJlZTo6Q1BERl9TdHJ1Y3RUcmVlKGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2MpCi0gICAgOiBtX3BUcmVlUm9vdChwRG9jLT5HZXRSb290KCktPkdldERpY3RGb3IoIlN0cnVjdFRyZWVSb290IikpLAotICAgICAgbV9wUm9sZU1hcChtX3BUcmVlUm9vdCA/IG1fcFRyZWVSb290LT5HZXREaWN0Rm9yKCJSb2xlTWFwIikgOiBudWxscHRyKSwKLSAgICAgIG1fcFBhZ2UobnVsbHB0cikge30KLQotQ1BERl9TdHJ1Y3RUcmVlOjp+Q1BERl9TdHJ1Y3RUcmVlKCkge30KLQotaW50IENQREZfU3RydWN0VHJlZTo6Q291bnRUb3BFbGVtZW50cygpIGNvbnN0IHsKLSAgcmV0dXJuIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50PihtX0tpZHMpOwotfQotCi1JUERGX1N0cnVjdEVsZW1lbnQqIENQREZfU3RydWN0VHJlZTo6R2V0VG9wRWxlbWVudChpbnQgaSkgY29uc3QgewotICByZXR1cm4gbV9LaWRzW2ldLkdldCgpOwotfQotCi12b2lkIENQREZfU3RydWN0VHJlZTo6TG9hZFBhZ2VUcmVlKGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0KSB7Ci0gIG1fcFBhZ2UgPSBwUGFnZURpY3Q7Ci0gIGlmICghbV9wVHJlZVJvb3QpCi0gICAgcmV0dXJuOwotCi0gIENQREZfT2JqZWN0KiBwS2lkcyA9IG1fcFRyZWVSb290LT5HZXREaXJlY3RPYmplY3RGb3IoIksiKTsKLSAgaWYgKCFwS2lkcykKLSAgICByZXR1cm47Ci0KLSAgdWludDMyX3QgZHdLaWRzID0gMDsKLSAgaWYgKHBLaWRzLT5Jc0RpY3Rpb25hcnkoKSkKLSAgICBkd0tpZHMgPSAxOwotICBlbHNlIGlmIChDUERGX0FycmF5KiBwQXJyYXkgPSBwS2lkcy0+QXNBcnJheSgpKQotICAgIGR3S2lkcyA9IHBBcnJheS0+R2V0Q291bnQoKTsKLSAgZWxzZQotICAgIHJldHVybjsKLQotICBtX0tpZHMuY2xlYXIoKTsKLSAgbV9LaWRzLnJlc2l6ZShkd0tpZHMpOwotICBDUERGX0RpY3Rpb25hcnkqIHBQYXJlbnRUcmVlID0gbV9wVHJlZVJvb3QtPkdldERpY3RGb3IoIlBhcmVudFRyZWUiKTsKLSAgaWYgKCFwUGFyZW50VHJlZSkKLSAgICByZXR1cm47Ci0KLSAgQ1BERl9OdW1iZXJUcmVlIHBhcmVudF90cmVlKHBQYXJlbnRUcmVlKTsKLSAgaW50IHBhcmVudHNfaWQgPSBwUGFnZURpY3QtPkdldEludGVnZXJGb3IoIlN0cnVjdFBhcmVudHMiLCAtMSk7Ci0gIGlmIChwYXJlbnRzX2lkIDwgMCkKLSAgICByZXR1cm47Ci0KLSAgQ1BERl9BcnJheSogcFBhcmVudEFycmF5ID0gVG9BcnJheShwYXJlbnRfdHJlZS5Mb29rdXBWYWx1ZShwYXJlbnRzX2lkKSk7Ci0gIGlmICghcFBhcmVudEFycmF5KQotICAgIHJldHVybjsKLQotICBzdGQ6Om1hcDxDUERGX0RpY3Rpb25hcnkqLCBDRlhfUmV0YWluUHRyPENQREZfU3RydWN0RWxlbWVudD4+IGVsZW1lbnRfbWFwOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBQYXJlbnRBcnJheS0+R2V0Q291bnQoKTsgaSsrKSB7Ci0gICAgaWYgKENQREZfRGljdGlvbmFyeSogcFBhcmVudCA9IHBQYXJlbnRBcnJheS0+R2V0RGljdEF0KGkpKQotICAgICAgQWRkUGFnZU5vZGUocFBhcmVudCwgJmVsZW1lbnRfbWFwKTsKLSAgfQotfQotCi1DRlhfUmV0YWluUHRyPENQREZfU3RydWN0RWxlbWVudD4gQ1BERl9TdHJ1Y3RUcmVlOjpBZGRQYWdlTm9kZSgKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAotICAgIHN0ZDo6bWFwPENQREZfRGljdGlvbmFyeSosIENGWF9SZXRhaW5QdHI8Q1BERl9TdHJ1Y3RFbGVtZW50Pj4qIG1hcCwKLSAgICBpbnQgbkxldmVsKSB7Ci0gIGlmIChuTGV2ZWwgPiBuTWF4UmVjdXJzaW9uKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIGF1dG8gaXQgPSBtYXAtPmZpbmQocERpY3QpOwotICBpZiAoaXQgIT0gbWFwLT5lbmQoKSkKLSAgICByZXR1cm4gaXQtPnNlY29uZDsKLQotICBhdXRvIHBFbGVtZW50ID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfU3RydWN0RWxlbWVudD4odGhpcywgbnVsbHB0ciwgcERpY3QpOwotICAoKm1hcClbcERpY3RdID0gcEVsZW1lbnQ7Ci0gIENQREZfRGljdGlvbmFyeSogcFBhcmVudCA9IHBEaWN0LT5HZXREaWN0Rm9yKCJQIik7Ci0gIGlmICghcFBhcmVudCB8fCBwUGFyZW50LT5HZXRTdHJpbmdGb3IoIlR5cGUiKSA9PSAiU3RydWN0VHJlZVJvb3QiKSB7Ci0gICAgaWYgKCFBZGRUb3BMZXZlbE5vZGUocERpY3QsIHBFbGVtZW50KSkKLSAgICAgIG1hcC0+ZXJhc2UocERpY3QpOwotICAgIHJldHVybiBwRWxlbWVudDsKLSAgfQotCi0gIENGWF9SZXRhaW5QdHI8Q1BERl9TdHJ1Y3RFbGVtZW50PiBwUGFyZW50RWxlbWVudCA9Ci0gICAgICBBZGRQYWdlTm9kZShwUGFyZW50LCBtYXAsIG5MZXZlbCArIDEpOwotICBib29sIGJTYXZlID0gZmFsc2U7Ci0gIGZvciAoQ1BERl9TdHJ1Y3RLaWQmIGtpZCA6ICpwUGFyZW50RWxlbWVudC0+R2V0S2lkcygpKSB7Ci0gICAgaWYgKGtpZC5tX1R5cGUgPT0gQ1BERl9TdHJ1Y3RLaWQ6OkVsZW1lbnQgJiYga2lkLm1fcERpY3QgPT0gcERpY3QpIHsKLSAgICAgIGtpZC5tX3BFbGVtZW50ID0gcEVsZW1lbnQ7Ci0gICAgICBiU2F2ZSA9IHRydWU7Ci0gICAgfQotICB9Ci0gIGlmICghYlNhdmUpCi0gICAgbWFwLT5lcmFzZShwRGljdCk7Ci0gIHJldHVybiBwRWxlbWVudDsKLX0KLQotYm9vbCBDUERGX1N0cnVjdFRyZWU6OkFkZFRvcExldmVsTm9kZSgKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAotICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8Q1BERl9TdHJ1Y3RFbGVtZW50PiYgcEVsZW1lbnQpIHsKLSAgQ1BERl9PYmplY3QqIHBPYmogPSBtX3BUcmVlUm9vdC0+R2V0RGlyZWN0T2JqZWN0Rm9yKCJLIik7Ci0gIGlmICghcE9iaikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHBPYmotPklzRGljdGlvbmFyeSgpKSB7Ci0gICAgaWYgKHBPYmotPkdldE9iak51bSgpICE9IHBEaWN0LT5HZXRPYmpOdW0oKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBtX0tpZHNbMF0gPSBwRWxlbWVudDsKLSAgfQotICBpZiAoQ1BERl9BcnJheSogcFRvcEtpZHMgPSBwT2JqLT5Bc0FycmF5KCkpIHsKLSAgICBib29sIGJTYXZlID0gZmFsc2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwVG9wS2lkcy0+R2V0Q291bnQoKTsgaSsrKSB7Ci0gICAgICBDUERGX1JlZmVyZW5jZSogcEtpZFJlZiA9IFRvUmVmZXJlbmNlKHBUb3BLaWRzLT5HZXRPYmplY3RBdChpKSk7Ci0gICAgICBpZiAocEtpZFJlZiAmJiBwS2lkUmVmLT5HZXRSZWZPYmpOdW0oKSA9PSBwRGljdC0+R2V0T2JqTnVtKCkpIHsKLSAgICAgICAgbV9LaWRzW2ldID0gcEVsZW1lbnQ7Ci0gICAgICAgIGJTYXZlID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFiU2F2ZSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotQ1BERl9TdHJ1Y3RFbGVtZW50OjpDUERGX1N0cnVjdEVsZW1lbnQoQ1BERl9TdHJ1Y3RUcmVlKiBwVHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RydWN0RWxlbWVudCogcFBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QpCi0gICAgOiBtX3BUcmVlKHBUcmVlKSwKLSAgICAgIG1fcFBhcmVudChwUGFyZW50KSwKLSAgICAgIG1fcERpY3QocERpY3QpLAotICAgICAgbV9UeXBlKHBEaWN0LT5HZXRTdHJpbmdGb3IoIlMiKSkgewotICBpZiAocFRyZWUtPm1fcFJvbGVNYXApIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBtYXBwZWQgPSBwVHJlZS0+bV9wUm9sZU1hcC0+R2V0U3RyaW5nRm9yKG1fVHlwZSk7Ci0gICAgaWYgKCFtYXBwZWQuSXNFbXB0eSgpKQotICAgICAgbV9UeXBlID0gbWFwcGVkOwotICB9Ci0gIExvYWRLaWRzKHBEaWN0KTsKLX0KLQotSVBERl9TdHJ1Y3RUcmVlKiBDUERGX1N0cnVjdEVsZW1lbnQ6OkdldFRyZWUoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BUcmVlOwotfQotCi1jb25zdCBDRlhfQnl0ZVN0cmluZyYgQ1BERl9TdHJ1Y3RFbGVtZW50OjpHZXRUeXBlKCkgY29uc3QgewotICByZXR1cm4gbV9UeXBlOwotfQotCi1JUERGX1N0cnVjdEVsZW1lbnQqIENQREZfU3RydWN0RWxlbWVudDo6R2V0UGFyZW50KCkgY29uc3QgewotICByZXR1cm4gbV9wUGFyZW50OwotfQotCi1DUERGX0RpY3Rpb25hcnkqIENQREZfU3RydWN0RWxlbWVudDo6R2V0RGljdCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcERpY3Q7Ci19Ci0KLWludCBDUERGX1N0cnVjdEVsZW1lbnQ6OkNvdW50S2lkcygpIGNvbnN0IHsKLSAgcmV0dXJuIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50PihtX0tpZHMpOwotfQotCi1JUERGX1N0cnVjdEVsZW1lbnQqIENQREZfU3RydWN0RWxlbWVudDo6R2V0S2lkSWZFbGVtZW50KGludCBpbmRleCkgY29uc3QgewotICBpZiAobV9LaWRzW2luZGV4XS5tX1R5cGUgIT0gQ1BERl9TdHJ1Y3RLaWQ6OkVsZW1lbnQpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgcmV0dXJuIG1fS2lkc1tpbmRleF0ubV9wRWxlbWVudC5HZXQoKTsKLX0KLQotQ1BERl9TdHJ1Y3RFbGVtZW50Ojp+Q1BERl9TdHJ1Y3RFbGVtZW50KCkge30KLQotdm9pZCBDUERGX1N0cnVjdEVsZW1lbnQ6OkxvYWRLaWRzKENQREZfRGljdGlvbmFyeSogcERpY3QpIHsKLSAgQ1BERl9PYmplY3QqIHBPYmogPSBwRGljdC0+R2V0T2JqZWN0Rm9yKCJQZyIpOwotICB1aW50MzJfdCBQYWdlT2JqTnVtID0gMDsKLSAgaWYgKENQREZfUmVmZXJlbmNlKiBwUmVmID0gVG9SZWZlcmVuY2UocE9iaikpCi0gICAgUGFnZU9iak51bSA9IHBSZWYtPkdldFJlZk9iak51bSgpOwotCi0gIENQREZfT2JqZWN0KiBwS2lkcyA9IHBEaWN0LT5HZXREaXJlY3RPYmplY3RGb3IoIksiKTsKLSAgaWYgKCFwS2lkcykKLSAgICByZXR1cm47Ci0KLSAgbV9LaWRzLmNsZWFyKCk7Ci0gIGlmIChDUERGX0FycmF5KiBwQXJyYXkgPSBwS2lkcy0+QXNBcnJheSgpKSB7Ci0gICAgbV9LaWRzLnJlc2l6ZShwQXJyYXktPkdldENvdW50KCkpOwotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkrKykgewotICAgICAgQ1BERl9PYmplY3QqIHBLaWQgPSBwQXJyYXktPkdldERpcmVjdE9iamVjdEF0KGkpOwotICAgICAgTG9hZEtpZChQYWdlT2JqTnVtLCBwS2lkLCAmbV9LaWRzW2ldKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgbV9LaWRzLnJlc2l6ZSgxKTsKLSAgICBMb2FkS2lkKFBhZ2VPYmpOdW0sIHBLaWRzLCAmbV9LaWRzWzBdKTsKLSAgfQotfQotdm9pZCBDUERGX1N0cnVjdEVsZW1lbnQ6OkxvYWRLaWQodWludDMyX3QgUGFnZU9iak51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfT2JqZWN0KiBwS2lkT2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9TdHJ1Y3RLaWQqIHBLaWQpIHsKLSAgcEtpZC0+bV9UeXBlID0gQ1BERl9TdHJ1Y3RLaWQ6OkludmFsaWQ7Ci0gIGlmICghcEtpZE9iaikKLSAgICByZXR1cm47Ci0KLSAgaWYgKHBLaWRPYmotPklzTnVtYmVyKCkpIHsKLSAgICBpZiAobV9wVHJlZS0+bV9wUGFnZSAmJiBtX3BUcmVlLT5tX3BQYWdlLT5HZXRPYmpOdW0oKSAhPSBQYWdlT2JqTnVtKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHBLaWQtPm1fVHlwZSA9IENQREZfU3RydWN0S2lkOjpQYWdlQ29udGVudDsKLSAgICBwS2lkLT5tX0NvbnRlbnRJZCA9IHBLaWRPYmotPkdldEludGVnZXIoKTsKLSAgICBwS2lkLT5tX1BhZ2VPYmpOdW0gPSBQYWdlT2JqTnVtOwotICAgIHJldHVybjsKLSAgfQotCi0gIENQREZfRGljdGlvbmFyeSogcEtpZERpY3QgPSBwS2lkT2JqLT5Bc0RpY3Rpb25hcnkoKTsKLSAgaWYgKCFwS2lkRGljdCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKENQREZfUmVmZXJlbmNlKiBwUmVmID0gVG9SZWZlcmVuY2UocEtpZERpY3QtPkdldE9iamVjdEZvcigiUGciKSkpCi0gICAgUGFnZU9iak51bSA9IHBSZWYtPkdldFJlZk9iak51bSgpOwotCi0gIENGWF9CeXRlU3RyaW5nIHR5cGUgPSBwS2lkRGljdC0+R2V0U3RyaW5nRm9yKCJUeXBlIik7Ci0gIGlmICh0eXBlID09ICJNQ1IiKSB7Ci0gICAgaWYgKG1fcFRyZWUtPm1fcFBhZ2UgJiYgbV9wVHJlZS0+bV9wUGFnZS0+R2V0T2JqTnVtKCkgIT0gUGFnZU9iak51bSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwS2lkLT5tX1R5cGUgPSBDUERGX1N0cnVjdEtpZDo6U3RyZWFtQ29udGVudDsKLSAgICBDUERGX1JlZmVyZW5jZSogcFJlZiA9IFRvUmVmZXJlbmNlKHBLaWREaWN0LT5HZXRPYmplY3RGb3IoIlN0bSIpKTsKLSAgICBwS2lkLT5tX1JlZk9iak51bSA9IHBSZWYgPyBwUmVmLT5HZXRSZWZPYmpOdW0oKSA6IDA7Ci0gICAgcEtpZC0+bV9QYWdlT2JqTnVtID0gUGFnZU9iak51bTsKLSAgICBwS2lkLT5tX0NvbnRlbnRJZCA9IHBLaWREaWN0LT5HZXRJbnRlZ2VyRm9yKCJNQ0lEIik7Ci0gIH0gZWxzZSBpZiAodHlwZSA9PSAiT0JKUiIpIHsKLSAgICBpZiAobV9wVHJlZS0+bV9wUGFnZSAmJiBtX3BUcmVlLT5tX3BQYWdlLT5HZXRPYmpOdW0oKSAhPSBQYWdlT2JqTnVtKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHBLaWQtPm1fVHlwZSA9IENQREZfU3RydWN0S2lkOjpPYmplY3Q7Ci0gICAgQ1BERl9SZWZlcmVuY2UqIHBPYmogPSBUb1JlZmVyZW5jZShwS2lkRGljdC0+R2V0T2JqZWN0Rm9yKCJPYmoiKSk7Ci0gICAgcEtpZC0+bV9SZWZPYmpOdW0gPSBwT2JqID8gcE9iai0+R2V0UmVmT2JqTnVtKCkgOiAwOwotICAgIHBLaWQtPm1fUGFnZU9iak51bSA9IFBhZ2VPYmpOdW07Ci0gIH0gZWxzZSB7Ci0gICAgcEtpZC0+bV9UeXBlID0gQ1BERl9TdHJ1Y3RLaWQ6OkVsZW1lbnQ7Ci0gICAgcEtpZC0+bV9wRGljdCA9IHBLaWREaWN0OwotICAgIGlmICghbV9wVHJlZS0+bV9wUGFnZSkgewotICAgICAgcEtpZC0+bV9wRWxlbWVudCA9Ci0gICAgICAgICAgcGRmaXVtOjpNYWtlUmV0YWluPENQREZfU3RydWN0RWxlbWVudD4obV9wVHJlZSwgdGhpcywgcEtpZERpY3QpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwS2lkLT5tX3BFbGVtZW50ID0gbnVsbHB0cjsKLSAgICB9Ci0gIH0KLX0KLXN0YXRpYyBDUERGX0RpY3Rpb25hcnkqIEZpbmRBdHRyRGljdChDUERGX09iamVjdCogcEF0dHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbkxldmVsID0gMC4wRikgewotICBpZiAobkxldmVsID4gbk1heFJlY3Vyc2lvbikKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgaWYgKCFwQXR0cnMpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG51bGxwdHI7Ci0gIGlmIChwQXR0cnMtPklzRGljdGlvbmFyeSgpKSB7Ci0gICAgcERpY3QgPSBwQXR0cnMtPkFzRGljdGlvbmFyeSgpOwotICB9IGVsc2UgaWYgKENQREZfU3RyZWFtKiBwU3RyZWFtID0gcEF0dHJzLT5Bc1N0cmVhbSgpKSB7Ci0gICAgcERpY3QgPSBwU3RyZWFtLT5HZXREaWN0KCk7Ci0gIH0gZWxzZSBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcEF0dHJzLT5Bc0FycmF5KCkpIHsKLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpKyspIHsKLSAgICAgIENQREZfT2JqZWN0KiBwRWxlbWVudCA9IHBBcnJheS0+R2V0RGlyZWN0T2JqZWN0QXQoaSk7Ci0gICAgICBwRGljdCA9IEZpbmRBdHRyRGljdChwRWxlbWVudCwgb3duZXIsIG5MZXZlbCArIDEpOwotICAgICAgaWYgKHBEaWN0KQotICAgICAgICByZXR1cm4gcERpY3Q7Ci0gICAgfQotICB9Ci0gIGlmIChwRGljdCAmJiBwRGljdC0+R2V0U3RyaW5nRm9yKCJPIikgPT0gb3duZXIpCi0gICAgcmV0dXJuIHBEaWN0OwotICByZXR1cm4gbnVsbHB0cjsKLX0KLUNQREZfT2JqZWN0KiBDUERGX1N0cnVjdEVsZW1lbnQ6OkdldEF0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJbmhlcml0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkxldmVsKSB7Ci0gIGlmIChmTGV2ZWwgPiBuTWF4UmVjdXJzaW9uKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgaWYgKGJJbmhlcml0YWJsZSkgewotICAgIENQREZfT2JqZWN0KiBwQXR0ciA9IEdldEF0dHIob3duZXIsIG5hbWUsIGZhbHNlKTsKLSAgICBpZiAocEF0dHIpIHsKLSAgICAgIHJldHVybiBwQXR0cjsKLSAgICB9Ci0gICAgaWYgKCFtX3BQYXJlbnQpIHsKLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICByZXR1cm4gbV9wUGFyZW50LT5HZXRBdHRyKG93bmVyLCBuYW1lLCB0cnVlLCBmTGV2ZWwgKyAxKTsKLSAgfQotICBDUERGX09iamVjdCogcEEgPSBtX3BEaWN0LT5HZXREaXJlY3RPYmplY3RGb3IoIkEiKTsKLSAgaWYgKHBBKSB7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQXR0ckRpY3QgPSBGaW5kQXR0ckRpY3QocEEsIG93bmVyKTsKLSAgICBpZiAocEF0dHJEaWN0KSB7Ci0gICAgICBDUERGX09iamVjdCogcEF0dHIgPSBwQXR0ckRpY3QtPkdldERpcmVjdE9iamVjdEZvcihDRlhfQnl0ZVN0cmluZyhuYW1lKSk7Ci0gICAgICBpZiAocEF0dHIpIHsKLSAgICAgICAgcmV0dXJuIHBBdHRyOwotICAgICAgfQotICAgIH0KLSAgfQotICBDUERGX09iamVjdCogcEMgPSBtX3BEaWN0LT5HZXREaXJlY3RPYmplY3RGb3IoIkMiKTsKLSAgaWYgKCFwQykKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBDUERGX0RpY3Rpb25hcnkqIHBDbGFzc01hcCA9IG1fcFRyZWUtPm1fcFRyZWVSb290LT5HZXREaWN0Rm9yKCJDbGFzc01hcCIpOwotICBpZiAoIXBDbGFzc01hcCkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gcEMtPkFzQXJyYXkoKSkgewotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkrKykgewotICAgICAgQ0ZYX0J5dGVTdHJpbmcgY2xhc3NfbmFtZSA9IHBBcnJheS0+R2V0U3RyaW5nQXQoaSk7Ci0gICAgICBDUERGX0RpY3Rpb25hcnkqIHBDbGFzc0RpY3QgPSBwQ2xhc3NNYXAtPkdldERpY3RGb3IoY2xhc3NfbmFtZSk7Ci0gICAgICBpZiAocENsYXNzRGljdCAmJiBwQ2xhc3NEaWN0LT5HZXRTdHJpbmdGb3IoIk8iKSA9PSBvd25lcikKLSAgICAgICAgcmV0dXJuIHBDbGFzc0RpY3QtPkdldERpcmVjdE9iamVjdEZvcihDRlhfQnl0ZVN0cmluZyhuYW1lKSk7Ci0gICAgfQotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIENGWF9CeXRlU3RyaW5nIGNsYXNzX25hbWUgPSBwQy0+R2V0U3RyaW5nKCk7Ci0gIENQREZfRGljdGlvbmFyeSogcENsYXNzRGljdCA9IHBDbGFzc01hcC0+R2V0RGljdEZvcihjbGFzc19uYW1lKTsKLSAgaWYgKHBDbGFzc0RpY3QgJiYgcENsYXNzRGljdC0+R2V0U3RyaW5nRm9yKCJPIikgPT0gb3duZXIpCi0gICAgcmV0dXJuIHBDbGFzc0RpY3QtPkdldERpcmVjdE9iamVjdEZvcihDRlhfQnl0ZVN0cmluZyhuYW1lKSk7Ci0gIHJldHVybiBudWxscHRyOwotfQotQ1BERl9PYmplY3QqIENQREZfU3RydWN0RWxlbWVudDo6R2V0QXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkluaGVyaXRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ViaW5kZXgpIHsKLSAgQ1BERl9PYmplY3QqIHBBdHRyID0gR2V0QXR0cihvd25lciwgbmFtZSwgYkluaGVyaXRhYmxlKTsKLSAgQ1BERl9BcnJheSogcEFycmF5ID0gVG9BcnJheShwQXR0cik7Ci0gIGlmICghcEFycmF5IHx8IHN1YmluZGV4ID09IC0xKQotICAgIHJldHVybiBwQXR0cjsKLQotICBpZiAoc3ViaW5kZXggPj0gc3RhdGljX2Nhc3Q8aW50PihwQXJyYXktPkdldENvdW50KCkpKQotICAgIHJldHVybiBwQXR0cjsKLSAgcmV0dXJuIHBBcnJheS0+R2V0RGlyZWN0T2JqZWN0QXQoc3ViaW5kZXgpOwotfQotQ0ZYX0J5dGVTdHJpbmcgQ1BERl9TdHJ1Y3RFbGVtZW50OjpHZXROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZGVmYXVsdF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJbmhlcml0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ViaW5kZXgpIHsKLSAgQ1BERl9PYmplY3QqIHBBdHRyID0gR2V0QXR0cihvd25lciwgbmFtZSwgYkluaGVyaXRhYmxlLCBzdWJpbmRleCk7Ci0gIGlmIChUb05hbWUocEF0dHIpKQotICAgIHJldHVybiBwQXR0ci0+R2V0U3RyaW5nKCk7Ci0gIHJldHVybiBDRlhfQnl0ZVN0cmluZyhkZWZhdWx0X3ZhbHVlKTsKLX0KLQotRlhfQVJHQiBDUERGX1N0cnVjdEVsZW1lbnQ6OkdldENvbG9yKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZGVmYXVsdF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJbmhlcml0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ViaW5kZXgpIHsKLSAgQ1BERl9BcnJheSogcEFycmF5ID0gVG9BcnJheShHZXRBdHRyKG93bmVyLCBuYW1lLCBiSW5oZXJpdGFibGUsIHN1YmluZGV4KSk7Ci0gIGlmICghcEFycmF5KQotICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOwotICByZXR1cm4gMHhmZjAwMDAwMCB8ICgoaW50KShwQXJyYXktPkdldE51bWJlckF0KDApICogMjU1KSA8PCAxNikgfAotICAgICAgICAgKChpbnQpKHBBcnJheS0+R2V0TnVtYmVyQXQoMSkgKiAyNTUpIDw8IDgpIHwKLSAgICAgICAgIChpbnQpKHBBcnJheS0+R2V0TnVtYmVyQXQoMikgKiAyNTUpOwotfQotRlhfRkxPQVQgQ1BERl9TdHJ1Y3RFbGVtZW50OjpHZXROdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGRlZmF1bHRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJbmhlcml0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJpbmRleCkgewotICBDUERGX09iamVjdCogcEF0dHIgPSBHZXRBdHRyKG93bmVyLCBuYW1lLCBiSW5oZXJpdGFibGUsIHN1YmluZGV4KTsKLSAgcmV0dXJuIFRvTnVtYmVyKHBBdHRyKSA/IHBBdHRyLT5HZXROdW1iZXIoKSA6IGRlZmF1bHRfdmFsdWU7Ci19Ci1pbnQgQ1BERl9TdHJ1Y3RFbGVtZW50OjpHZXRJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkluaGVyaXRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ViaW5kZXgpIHsKLSAgQ1BERl9PYmplY3QqIHBBdHRyID0gR2V0QXR0cihvd25lciwgbmFtZSwgYkluaGVyaXRhYmxlLCBzdWJpbmRleCk7Ci0gIHJldHVybiBUb051bWJlcihwQXR0cikgPyBwQXR0ci0+R2V0SW50ZWdlcigpIDogZGVmYXVsdF92YWx1ZTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9mcGRmX3RhZ2dlZC5oIGIvY29yZS9mcGRmZG9jL2ZwZGZfdGFnZ2VkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYmI0OWYuLjAwMDAwMDAKLS0tIGEvY29yZS9mcGRmZG9jL2ZwZGZfdGFnZ2VkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgQ09SRV9GUERGRE9DX0ZQREZfVEFHR0VEX0hfCi0jZGVmaW5lIENPUkVfRlBERkRPQ19GUERGX1RBR0dFRF9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgotCi1jbGFzcyBDUERGX0RpY3Rpb25hcnk7Ci1jbGFzcyBDUERGX0RvY3VtZW50OwotY2xhc3MgSVBERl9TdHJ1Y3RFbGVtZW50OwotCi1jbGFzcyBJUERGX1N0cnVjdFRyZWUgewotIHB1YmxpYzoKLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxJUERGX1N0cnVjdFRyZWU+IExvYWRQYWdlKAotICAgICAgY29uc3QgQ1BERl9Eb2N1bWVudCogcERvYywKLSAgICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0KTsKLQotCi0gIHZpcnR1YWwgaW50IENvdW50VG9wRWxlbWVudHMoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgSVBERl9TdHJ1Y3RFbGVtZW50KiBHZXRUb3BFbGVtZW50KGludCBpKSBjb25zdCA9IDA7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGZyaWVuZCBzdGQ6OmRlZmF1bHRfZGVsZXRlPElQREZfU3RydWN0VHJlZT47Ci0gIHZpcnR1YWwgfklQREZfU3RydWN0VHJlZSgpIHt9Ci19OwotCi1jbGFzcyBJUERGX1N0cnVjdEVsZW1lbnQgewotIHB1YmxpYzoKLSAgdmlydHVhbCBJUERGX1N0cnVjdFRyZWUqIEdldFRyZWUoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIEdldFR5cGUoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgSVBERl9TdHJ1Y3RFbGVtZW50KiBHZXRQYXJlbnQoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgQ1BERl9EaWN0aW9uYXJ5KiBHZXREaWN0KCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIGludCBDb3VudEtpZHMoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgSVBERl9TdHJ1Y3RFbGVtZW50KiBHZXRLaWRJZkVsZW1lbnQoaW50IGluZGV4KSBjb25zdCA9IDA7Ci0KLSAgdmlydHVhbCBDUERGX09iamVjdCogR2V0QXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJbmhlcml0YWJsZSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZMZXZlbCA9IDAuMEYpID0gMDsKLQotICB2aXJ0dWFsIENGWF9CeXRlU3RyaW5nIEdldE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZGVmYXVsdF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkluaGVyaXRhYmxlID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ViaW5kZXggPSAtMSkgPSAwOwotCi0gIHZpcnR1YWwgRlhfQVJHQiBHZXRDb2xvcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG93bmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBkZWZhdWx0X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSW5oZXJpdGFibGUgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJpbmRleCA9IC0xKSA9IDA7Ci0KLSAgdmlydHVhbCBGWF9GTE9BVCBHZXROdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkZWZhdWx0X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJbmhlcml0YWJsZSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ViaW5kZXggPSAtMSkgPSAwOwotCi0gIHZpcnR1YWwgaW50IEdldEludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSW5oZXJpdGFibGUgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ViaW5kZXggPSAtMSkgPSAwOwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIH5JUERGX1N0cnVjdEVsZW1lbnQoKSB7fQotfTsKLQotI2VuZGlmICAvLyBDT1JFX0ZQREZET0NfRlBERl9UQUdHRURfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmRvYy9pcGRmX2Zvcm1ub3RpZnkuaCBiL2NvcmUvZnBkZmRvYy9pcGRmX2Zvcm1ub3RpZnkuaAppbmRleCBiZjYxMjdkLi41MmU1Y2M5IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZkb2MvaXBkZl9mb3Jtbm90aWZ5LmgKKysrIGIvY29yZS9mcGRmZG9jL2lwZGZfZm9ybW5vdGlmeS5oCkBAIC0xNywxMCArMTcsMTAgQEAKICAgdmlydHVhbCB+SVBERl9Gb3JtTm90aWZ5KCkge30KIAogICB2aXJ0dWFsIGludCBCZWZvcmVWYWx1ZUNoYW5nZShDUERGX0Zvcm1GaWVsZCogcEZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBjc1ZhbHVlKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCBBZnRlclZhbHVlQ2hhbmdlKENQREZfRm9ybUZpZWxkKiBwRmllbGQpID0gMDsKICAgdmlydHVhbCBpbnQgQmVmb3JlU2VsZWN0aW9uQ2hhbmdlKENQREZfRm9ybUZpZWxkKiBwRmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgY3NWYWx1ZSkgPSAwOwogICB2aXJ0dWFsIHZvaWQgQWZ0ZXJTZWxlY3Rpb25DaGFuZ2UoQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCkgPSAwOwogICB2aXJ0dWFsIHZvaWQgQWZ0ZXJDaGVja2VkU3RhdHVzQ2hhbmdlKENQREZfRm9ybUZpZWxkKiBwRmllbGQpID0gMDsKICAgdmlydHVhbCBpbnQgQmVmb3JlRm9ybVJlc2V0KENQREZfSW50ZXJGb3JtKiBwRm9ybSkgPSAwOwpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmZG9jL2lwdnRfZm9udG1hcC5oIGIvY29yZS9mcGRmZG9jL2lwdnRfZm9udG1hcC5oCmluZGV4IDc0MGNiMTkuLjMxYWE3M2IgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmRvYy9pcHZ0X2ZvbnRtYXAuaAorKysgYi9jb3JlL2ZwZGZkb2MvaXB2dF9mb250bWFwLmgKQEAgLTE4LDcgKzE4LDcgQEAKICAgdmlydHVhbCB+SVBWVF9Gb250TWFwKCkge30KIAogICB2aXJ0dWFsIENQREZfRm9udCogR2V0UERGRm9udChpbnQzMl90IG5Gb250SW5kZXgpID0gMDsKLSAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBHZXRQREZGb250QWxpYXMoaW50MzJfdCBuRm9udEluZGV4KSA9IDA7CisgIHZpcnR1YWwgQnl0ZVN0cmluZyBHZXRQREZGb250QWxpYXMoaW50MzJfdCBuRm9udEluZGV4KSA9IDA7CiAgIHZpcnR1YWwgaW50MzJfdCBHZXRXb3JkRm9udEluZGV4KHVpbnQxNl90IHdvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRm9udEluZGV4KSA9IDA7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZkb2MvdGFnZ2VkX2ludC5oIGIvY29yZS9mcGRmZG9jL3RhZ2dlZF9pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UyNDYwMi4uMDAwMDAwMAotLS0gYS9jb3JlL2ZwZGZkb2MvdGFnZ2VkX2ludC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBDT1JFX0ZQREZET0NfVEFHR0VEX0lOVF9IXwotI2RlZmluZSBDT1JFX0ZQREZET0NfVEFHR0VEX0lOVF9IXwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvZnBkZl90YWdnZWQuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgotCi1jbGFzcyBDUERGX1N0cnVjdEVsZW1lbnQ7Ci0KLXN0cnVjdCBDUERGX1N0cnVjdEtpZCB7Ci0gIENQREZfU3RydWN0S2lkKCk7Ci0gIENQREZfU3RydWN0S2lkKGNvbnN0IENQREZfU3RydWN0S2lkJiB0aGF0KTsKLSAgfkNQREZfU3RydWN0S2lkKCk7Ci0KLSAgZW51bSB7IEludmFsaWQsIEVsZW1lbnQsIFBhZ2VDb250ZW50LCBTdHJlYW1Db250ZW50LCBPYmplY3QgfSBtX1R5cGU7Ci0KLSAgQ0ZYX1JldGFpblB0cjxDUERGX1N0cnVjdEVsZW1lbnQ+IG1fcEVsZW1lbnQ7ICAvLyBGb3IgRWxlbWVudC4KLSAgQ1BERl9EaWN0aW9uYXJ5KiBtX3BEaWN0OyAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgRWxlbWVudC4KLSAgdWludDMyX3QgbV9QYWdlT2JqTnVtOyAgLy8gRm9yIFBhZ2VDb250ZW50LCBTdHJlYW1Db250ZW50LCBPYmplY3QuCi0gIHVpbnQzMl90IG1fUmVmT2JqTnVtOyAgIC8vIEZvciBTdHJlYW1Db250ZW50LCBPYmplY3QuCi0gIHVpbnQzMl90IG1fQ29udGVudElkOyAgIC8vIEZvciBQYWdlQ29udGVudCwgU3RyZWFtQ29udGVudC4KLX07Ci0KLWNsYXNzIENQREZfU3RydWN0VHJlZSBmaW5hbCA6IHB1YmxpYyBJUERGX1N0cnVjdFRyZWUgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1BERl9TdHJ1Y3RUcmVlKGNvbnN0IENQREZfRG9jdW1lbnQqIHBEb2MpOwotICB+Q1BERl9TdHJ1Y3RUcmVlKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gSVBERl9TdHJ1Y3RUcmVlOgotICBpbnQgQ291bnRUb3BFbGVtZW50cygpIGNvbnN0IG92ZXJyaWRlOwotICBJUERGX1N0cnVjdEVsZW1lbnQqIEdldFRvcEVsZW1lbnQoaW50IGkpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZvaWQgTG9hZFBhZ2VUcmVlKGNvbnN0IENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0KTsKLSAgQ0ZYX1JldGFpblB0cjxDUERGX1N0cnVjdEVsZW1lbnQ+IEFkZFBhZ2VOb2RlKAotICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRWxlbWVudCwKLSAgICAgIHN0ZDo6bWFwPENQREZfRGljdGlvbmFyeSosIENGWF9SZXRhaW5QdHI8Q1BERl9TdHJ1Y3RFbGVtZW50Pj4qIG1hcCwKLSAgICAgIGludCBuTGV2ZWwgPSAwKTsKLSAgYm9vbCBBZGRUb3BMZXZlbE5vZGUoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JldGFpblB0cjxDUERGX1N0cnVjdEVsZW1lbnQ+JiBwRWxlbWVudCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGNvbnN0IENQREZfRGljdGlvbmFyeSogY29uc3QgbV9wVHJlZVJvb3Q7Ci0gIGNvbnN0IENQREZfRGljdGlvbmFyeSogY29uc3QgbV9wUm9sZU1hcDsKLSAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBtX3BQYWdlOwotICBzdGQ6OnZlY3RvcjxDRlhfUmV0YWluUHRyPENQREZfU3RydWN0RWxlbWVudD4+IG1fS2lkczsKLQotICBmcmllbmQgY2xhc3MgQ1BERl9TdHJ1Y3RFbGVtZW50OwotfTsKLQotY2xhc3MgQ1BERl9TdHJ1Y3RFbGVtZW50IGZpbmFsIDogcHVibGljIENGWF9SZXRhaW5hYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElQREZfU3RydWN0RWxlbWVudCB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KLSAgZnJpZW5kIENGWF9SZXRhaW5QdHI8VD4gcGRmaXVtOjpNYWtlUmV0YWluKEFyZ3MmJi4uLiBhcmdzKTsKLQotICAvLyBJUERGX1N0cnVjdEVsZW1lbnQKLSAgSVBERl9TdHJ1Y3RUcmVlKiBHZXRUcmVlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBHZXRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIElQREZfU3RydWN0RWxlbWVudCogR2V0UGFyZW50KCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIENQREZfRGljdGlvbmFyeSogR2V0RGljdCgpIGNvbnN0IG92ZXJyaWRlOwotICBpbnQgQ291bnRLaWRzKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIElQREZfU3RydWN0RWxlbWVudCogR2V0S2lkSWZFbGVtZW50KGludCBpbmRleCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIENQREZfT2JqZWN0KiBHZXRBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSW5oZXJpdGFibGUgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkxldmVsID0gMC4wRikgb3ZlcnJpZGU7Ci0gIENGWF9CeXRlU3RyaW5nIEdldE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBkZWZhdWx0X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkluaGVyaXRhYmxlID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YmluZGV4ID0gLTEpIG92ZXJyaWRlOwotICBGWF9BUkdCIEdldENvbG9yKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAotICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZGVmYXVsdF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICBib29sIGJJbmhlcml0YWJsZSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgIGludCBzdWJpbmRleCA9IC0xKSBvdmVycmlkZTsKLSAgRlhfRkxPQVQgR2V0TnVtYmVyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkZWZhdWx0X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSW5oZXJpdGFibGUgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBzdWJpbmRleCA9IC0xKSBvdmVycmlkZTsKLSAgaW50IEdldEludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBvd25lciwKLSAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAotICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgYm9vbCBiSW5oZXJpdGFibGUgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgaW50IHN1YmluZGV4ID0gLTEpIG92ZXJyaWRlOwotCi0gIHN0ZDo6dmVjdG9yPENQREZfU3RydWN0S2lkPiogR2V0S2lkcygpIHsgcmV0dXJuICZtX0tpZHM7IH0KLSAgdm9pZCBMb2FkS2lkcyhDUERGX0RpY3Rpb25hcnkqIHBEaWN0KTsKLSAgdm9pZCBMb2FkS2lkKHVpbnQzMl90IFBhZ2VPYmpOdW0sIENQREZfT2JqZWN0KiBwT2JqLCBDUERGX1N0cnVjdEtpZCogcEtpZCk7Ci0gIENQREZfT2JqZWN0KiBHZXRBdHRyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgb3duZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSW5oZXJpdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJpbmRleCk7Ci0KLSBwcml2YXRlOgotICBDUERGX1N0cnVjdEVsZW1lbnQoQ1BERl9TdHJ1Y3RUcmVlKiBwVHJlZSwKLSAgICAgICAgICAgICAgICAgICAgIENQREZfU3RydWN0RWxlbWVudCogcFBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcERpY3QpOwotICB+Q1BERl9TdHJ1Y3RFbGVtZW50KCkgb3ZlcnJpZGU7Ci0KLSAgQ1BERl9TdHJ1Y3RUcmVlKiBjb25zdCBtX3BUcmVlOwotICBDUERGX1N0cnVjdEVsZW1lbnQqIGNvbnN0IG1fcFBhcmVudDsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBjb25zdCBtX3BEaWN0OwotICBDRlhfQnl0ZVN0cmluZyBtX1R5cGU7Ci0gIHN0ZDo6dmVjdG9yPENQREZfU3RydWN0S2lkPiBtX0tpZHM7Ci19OwotCi0jZW5kaWYgIC8vIENPUkVfRlBERkRPQ19UQUdHRURfSU5UX0hfCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZ0ZXh0L2NwZGZfbGlua2V4dHJhY3QuY3BwIGIvY29yZS9mcGRmdGV4dC9jcGRmX2xpbmtleHRyYWN0LmNwcAppbmRleCBhMWZjOTNlLi4wNWNiZGZiIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZ0ZXh0L2NwZGZfbGlua2V4dHJhY3QuY3BwCisrKyBiL2NvcmUvZnBkZnRleHQvY3BkZl9saW5rZXh0cmFjdC5jcHAKQEAgLTksMTAgKzksMTAxIEBACiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiY29yZS9mcGRmdGV4dC9jcGRmX3RleHRwYWdlLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9leHQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKIAorbmFtZXNwYWNlIHsKKworLy8gRmluZCB0aGUgZW5kIG9mIGEgd2ViIGxpbmsgc3RhcnRpbmcgZnJvbSBvZmZzZXQgfHN0YXJ0fCBhbmQgZW5kaW5nIGF0IG9mZnNldAorLy8gfGVuZHwuIFRoZSBwdXJwb3NlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gc2VwYXJhdGUgdXJsIGZyb20gdGhlIHN1cnJvdW5kaW5nCisvLyBjb250ZXh0IGNoYXJhY3RlcnMsIHdlIGRvIG5vdCBpbnRlbmQgdG8gZnVsbHkgdmFsaWRhdGUgdGhlIHVybC4gfHN0cnwKKy8vIGNvbnRhaW5zIGxvd2VyIGNhc2UgY2hhcmFjdGVycyBvbmx5Lgorc2l6ZV90IEZpbmRXZWJMaW5rRW5kaW5nKGNvbnN0IFdpZGVTdHJpbmcmIHN0ciwgc2l6ZV90IHN0YXJ0LCBzaXplX3QgZW5kKSB7CisgIGlmIChzdHIuQ29udGFpbnMoTCcvJywgc3RhcnQpKSB7CisgICAgLy8gV2hlbiB0aGVyZSBpcyBhIHBhdGggYW5kIHF1ZXJ5IGFmdGVyICcvJywgbW9zdCBBU0NJSSBjaGFycyBhcmUgYWxsb3dlZC4KKyAgICAvLyBXZSBkb24ndCBzYW5pdGl6ZSBpbiB0aGlzIGNhc2UuCisgICAgcmV0dXJuIGVuZDsKKyAgfQorCisgIC8vIFdoZW4gdGhlcmUgaXMgbm8gcGF0aCwgaXQgb25seSBoYXMgSVAgYWRkcmVzcyBvciBob3N0IG5hbWUuCisgIC8vIFBvcnQgaXMgb3B0aW9uYWwgYXQgdGhlIGVuZC4KKyAgaWYgKHN0cltzdGFydF0gPT0gTCdbJykgeworICAgIC8vIElQdjYgcmVmZXJlbmNlLgorICAgIC8vIEZpbmQgdGhlIGVuZCBvZiB0aGUgcmVmZXJlbmNlLgorICAgIGF1dG8gcmVzdWx0ID0gc3RyLkZpbmQoTCddJywgc3RhcnQgKyAxKTsKKyAgICBpZiAocmVzdWx0Lmhhc192YWx1ZSgpKSB7CisgICAgICBlbmQgPSByZXN1bHQudmFsdWUoKTsKKyAgICAgIGlmIChlbmQgPiBzdGFydCArIDEpIHsgIC8vIEhhcyBjb250ZW50IGluc2lkZSBicmFja2V0cy4KKyAgICAgICAgc2l6ZV90IGxlbiA9IHN0ci5HZXRMZW5ndGgoKTsKKyAgICAgICAgc2l6ZV90IG9mZiA9IGVuZCArIDE7CisgICAgICAgIGlmIChvZmYgPCBsZW4gJiYgc3RyW29mZl0gPT0gTCc6JykgeworICAgICAgICAgIG9mZisrOworICAgICAgICAgIHdoaWxlIChvZmYgPCBsZW4gJiYgc3RyW29mZl0gPj0gTCcwJyAmJiBzdHJbb2ZmXSA8PSBMJzknKQorICAgICAgICAgICAgb2ZmKys7CisgICAgICAgICAgaWYgKG9mZiA+IGVuZCArIDIgJiYKKyAgICAgICAgICAgICAgb2ZmIDw9IGxlbikgICAvLyBBdCBsZWFzdCBvbmUgZGlnaXQgaW4gcG9ydCBudW1iZXIuCisgICAgICAgICAgICBlbmQgPSBvZmYgLSAxOyAgLy8gfG9mZnwgaXMgb2Zmc2V0IG9mIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXIuCisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVuZDsKKyAgfQorCisgIC8vIEFjY29yZGluZyB0byBSRkMxMTIzLCBob3N0IG5hbWUgb25seSBoYXMgYWxwaGFudW1lcmljIGNoYXJzLCBoeXBoZW5zLAorICAvLyBhbmQgcGVyaW9kcy4gSHlwaGVuIHNob3VsZCBub3QgYXQgdGhlIGVuZCB0aG91Z2guCisgIC8vIE5vbi1BU0NJSSBjaGFycyBhcmUgaWdub3JlZCBkdXJpbmcgY2hlY2tpbmcuCisgIHdoaWxlIChlbmQgPiBzdGFydCAmJiBzdHJbZW5kXSA8IDB4ODApIHsKKyAgICBpZiAoKHN0cltlbmRdID49IEwnMCcgJiYgc3RyW2VuZF0gPD0gTCc5JykgfHwKKyAgICAgICAgKHN0cltlbmRdID49IEwnYScgJiYgc3RyW2VuZF0gPD0gTCd6JykgfHwgc3RyW2VuZF0gPT0gTCcuJykKKyAgICAgIGJyZWFrOworICAgIGVuZC0tOworICB9CisgIHJldHVybiBlbmQ7Cit9CisKKy8vIFJlbW92ZSBjaGFyYWN0ZXJzIGZyb20gdGhlIGVuZCBvZiB8c3RyfCwgZGVsaW1pdGVkIGJ5IHxzdGFydHwgYW5kIHxlbmR8LCB1cAorLy8gdG8gYW5kIGluY2x1ZGluZyB8Y2hhclRvRmluZHwuIE5vLW9wIGlmIHxjaGFyVG9GaW5kfCBpcyBub3QgcHJlc2VudC4gVXBkYXRlcworLy8gfGVuZHwgaWYgY2hhcmFjdGVycyB3ZXJlIHJlbW92ZWQuCit2b2lkIFRyaW1CYWNrd2FyZHNUb0NoYXIoY29uc3QgV2lkZVN0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QgY2hhclRvRmluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBlbmQpIHsKKyAgZm9yIChzaXplX3QgcG9zID0gKmVuZDsgcG9zID49IHN0YXJ0OyBwb3MtLSkgeworICAgIGlmIChzdHJbcG9zXSA9PSBjaGFyVG9GaW5kKSB7CisgICAgICAqZW5kID0gcG9zIC0gMTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisvLyBGaW5kcyBvcGVuaW5nIGJyYWNrZXRzICgpW117fTw+IGFuZCBxdW90ZXMgIicgIGJlZm9yZSB0aGUgVVJMIGRlbGltaXRlZCBieQorLy8gfHN0YXJ0fCBhbmQgfGVuZHwgaW4gfHN0cnwuIE1hdGNoZXMgYSBjbG9zaW5nIGJyYWNrZXQgb3IgcXVvdGUgZm9yIGVhY2gKKy8vIG9wZW5pbmcgY2hhcmFjdGVyIGFuZCwgaWYgcHJlc2VudCwgcmVtb3ZlcyBldmVyeXRoaW5nIGFmdGVyd2FyZHMuIFJldHVybnMgdGhlCisvLyBuZXcgZW5kIHBvc2l0aW9uIGZvciB0aGUgc3RyaW5nLgorc2l6ZV90IFRyaW1FeHRlcm5hbEJyYWNrZXRzRnJvbVdlYkxpbmsoY29uc3QgV2lkZVN0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGVuZCkgeworICBmb3IgKHNpemVfdCBwb3MgPSAwOyBwb3MgPCBzdGFydDsgcG9zKyspIHsKKyAgICBpZiAoc3RyW3Bvc10gPT0gJygnKSB7CisgICAgICBUcmltQmFja3dhcmRzVG9DaGFyKHN0ciwgJyknLCBzdGFydCwgJmVuZCk7CisgICAgfSBlbHNlIGlmIChzdHJbcG9zXSA9PSAnWycpIHsKKyAgICAgIFRyaW1CYWNrd2FyZHNUb0NoYXIoc3RyLCAnXScsIHN0YXJ0LCAmZW5kKTsKKyAgICB9IGVsc2UgaWYgKHN0cltwb3NdID09ICd7JykgeworICAgICAgVHJpbUJhY2t3YXJkc1RvQ2hhcihzdHIsICd9Jywgc3RhcnQsICZlbmQpOworICAgIH0gZWxzZSBpZiAoc3RyW3Bvc10gPT0gJzwnKSB7CisgICAgICBUcmltQmFja3dhcmRzVG9DaGFyKHN0ciwgJz4nLCBzdGFydCwgJmVuZCk7CisgICAgfSBlbHNlIGlmIChzdHJbcG9zXSA9PSAnIicpIHsKKyAgICAgIFRyaW1CYWNrd2FyZHNUb0NoYXIoc3RyLCAnIicsIHN0YXJ0LCAmZW5kKTsKKyAgICB9IGVsc2UgaWYgKHN0cltwb3NdID09ICdcJycpIHsKKyAgICAgIFRyaW1CYWNrd2FyZHNUb0NoYXIoc3RyLCAnXCcnLCBzdGFydCwgJmVuZCk7CisgICAgfQorICB9CisgIHJldHVybiBlbmQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCiBDUERGX0xpbmtFeHRyYWN0OjpDUERGX0xpbmtFeHRyYWN0KGNvbnN0IENQREZfVGV4dFBhZ2UqIHBUZXh0UGFnZSkKICAgICA6IG1fcFRleHRQYWdlKHBUZXh0UGFnZSkge30KIApAQCAtMjMsNyArMTE0LDcgQEAKICAgaWYgKCFtX3BUZXh0UGFnZS0+SXNQYXJzZWQoKSkKICAgICByZXR1cm47CiAKLSAgbV9zdHJQYWdlVGV4dCA9IG1fcFRleHRQYWdlLT5HZXRQYWdlVGV4dCgwLCAtMSk7CisgIG1fc3RyUGFnZVRleHQgPSBtX3BUZXh0UGFnZS0+R2V0QWxsUGFnZVRleHQoKTsKICAgaWYgKG1fc3RyUGFnZVRleHQuSXNFbXB0eSgpKQogICAgIHJldHVybjsKIApAQCAtMzEsMTIyICsxMjIsMTc0IEBACiB9CiAKIHZvaWQgQ1BERl9MaW5rRXh0cmFjdDo6UGFyc2VMaW5rKCkgewotICBpbnQgc3RhcnQgPSAwLCBwb3MgPSAwOwotICBpbnQgVG90YWxDaGFyID0gbV9wVGV4dFBhZ2UtPkNvdW50Q2hhcnMoKTsKLSAgd2hpbGUgKHBvcyA8IFRvdGFsQ2hhcikgeworICBpbnQgc3RhcnQgPSAwOworICBpbnQgcG9zID0gMDsKKyAgaW50IG5Ub3RhbENoYXIgPSBtX3BUZXh0UGFnZS0+Q291bnRDaGFycygpOworICBib29sIGJBZnRlckh5cGhlbiA9IGZhbHNlOworICBib29sIGJMaW5lQnJlYWsgPSBmYWxzZTsKKyAgd2hpbGUgKHBvcyA8IG5Ub3RhbENoYXIpIHsKICAgICBGUERGX0NIQVJfSU5GTyBwYWdlQ2hhcjsKICAgICBtX3BUZXh0UGFnZS0+R2V0Q2hhckluZm8ocG9zLCAmcGFnZUNoYXIpOwogICAgIGlmIChwYWdlQ2hhci5tX0ZsYWcgPT0gRlBERlRFWFRfQ0hBUl9HRU5FUkFURUQgfHwKLSAgICAgICAgcGFnZUNoYXIubV9Vbmljb2RlID09IDB4MjAgfHwgcG9zID09IFRvdGFsQ2hhciAtIDEpIHsKKyAgICAgICAgcGFnZUNoYXIubV9Vbmljb2RlID09IFRFWFRfU1BBQ0VfQ0hBUiB8fCBwb3MgPT0gblRvdGFsQ2hhciAtIDEpIHsKICAgICAgIGludCBuQ291bnQgPSBwb3MgLSBzdGFydDsKLSAgICAgIGlmIChwb3MgPT0gVG90YWxDaGFyIC0gMSkKKyAgICAgIGlmIChwb3MgPT0gblRvdGFsQ2hhciAtIDEpIHsKICAgICAgICAgbkNvdW50Kys7Ci0gICAgICBDRlhfV2lkZVN0cmluZyBzdHJCZUNoZWNrOworICAgICAgfSBlbHNlIGlmIChiQWZ0ZXJIeXBoZW4gJiYgKHBhZ2VDaGFyLm1fVW5pY29kZSA9PSBURVhUX0xJTkVGRUVEX0NIQVIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlQ2hhci5tX1VuaWNvZGUgPT0gVEVYVF9SRVRVUk5fQ0hBUikpIHsKKyAgICAgICAgLy8gSGFuZGxlIHRleHQgYnJlYWtzIHdpdGggYSBoeXBoZW4gdG8gdGhlIG5leHQgbGluZS4KKyAgICAgICAgYkxpbmVCcmVhayA9IHRydWU7CisgICAgICAgIHBvcysrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIFdpZGVTdHJpbmcgc3RyQmVDaGVjazsKICAgICAgIHN0ckJlQ2hlY2sgPSBtX3BUZXh0UGFnZS0+R2V0UGFnZVRleHQoc3RhcnQsIG5Db3VudCk7CisgICAgICBpZiAoYkxpbmVCcmVhaykgeworICAgICAgICBzdHJCZUNoZWNrLlJlbW92ZShURVhUX0xJTkVGRUVEX0NIQVIpOworICAgICAgICBzdHJCZUNoZWNrLlJlbW92ZShURVhUX1JFVFVSTl9DSEFSKTsKKyAgICAgICAgYkxpbmVCcmVhayA9IGZhbHNlOworICAgICAgfQorICAgICAgLy8gUmVwbGFjZSB0aGUgZ2VuZXJhdGVkIGNvZGUgd2l0aCB0aGUgaHlwaGVuIGNoYXIuCisgICAgICBzdHJCZUNoZWNrLlJlcGxhY2UoTCJceGZmZmUiLCBURVhUX0hZUEhFTik7CisKICAgICAgIGlmIChzdHJCZUNoZWNrLkdldExlbmd0aCgpID4gNSkgewogICAgICAgICB3aGlsZSAoc3RyQmVDaGVjay5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICBGWF9XQ0hBUiBjaCA9IHN0ckJlQ2hlY2suR2V0QXQoc3RyQmVDaGVjay5HZXRMZW5ndGgoKSAtIDEpOworICAgICAgICAgIHdjaGFyX3QgY2ggPSBzdHJCZUNoZWNrW3N0ckJlQ2hlY2suR2V0TGVuZ3RoKCkgLSAxXTsKICAgICAgICAgICBpZiAoY2ggPT0gTCcpJyB8fCBjaCA9PSBMJywnIHx8IGNoID09IEwnPicgfHwgY2ggPT0gTCcuJykgewotICAgICAgICAgICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suTWlkKDAsIHN0ckJlQ2hlY2suR2V0TGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgIHN0ckJlQ2hlY2sgPSBzdHJCZUNoZWNrLkxlZnQoc3RyQmVDaGVjay5HZXRMZW5ndGgoKSAtIDEpOwogICAgICAgICAgICAgbkNvdW50LS07CiAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAobkNvdW50ID4gNSAmJgotICAgICAgICAgICAgKENoZWNrV2ViTGluayhzdHJCZUNoZWNrKSB8fCBDaGVja01haWxMaW5rKHN0ckJlQ2hlY2spKSkgewotICAgICAgICAgIG1fTGlua0FycmF5LnB1c2hfYmFjayh7c3RhcnQsIG5Db3VudCwgc3RyQmVDaGVja30pOworICAgICAgICAvLyBDaGVjayBmb3IgcG90ZW50aWFsIHdlYiBVUkxzIGFuZCBlbWFpbCBhZGRyZXNzZXMuCisgICAgICAgIC8vIEZ0cCBhZGRyZXNzLCBmaWxlIHN5c3RlbSBsaW5rcywgZGF0YSwgYmxvYiBldGMuIGFyZSBub3QgY2hlY2tlZC4KKyAgICAgICAgaWYgKG5Db3VudCA+IDUpIHsKKyAgICAgICAgICBpbnQzMl90IG5TdGFydE9mZnNldDsKKyAgICAgICAgICBpbnQzMl90IG5Db3VudE92ZXJsb2FkOworICAgICAgICAgIGlmIChDaGVja1dlYkxpbmsoJnN0ckJlQ2hlY2ssICZuU3RhcnRPZmZzZXQsICZuQ291bnRPdmVybG9hZCkpIHsKKyAgICAgICAgICAgIG1fTGlua0FycmF5LnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICB7c3RhcnQgKyBuU3RhcnRPZmZzZXQsIG5Db3VudE92ZXJsb2FkLCBzdHJCZUNoZWNrfSk7CisgICAgICAgICAgfSBlbHNlIGlmIChDaGVja01haWxMaW5rKCZzdHJCZUNoZWNrKSkgeworICAgICAgICAgICAgbV9MaW5rQXJyYXkucHVzaF9iYWNrKHtzdGFydCwgbkNvdW50LCBzdHJCZUNoZWNrfSk7CisgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAgICAgICBzdGFydCA9ICsrcG9zOwogICAgIH0gZWxzZSB7CisgICAgICBiQWZ0ZXJIeXBoZW4gPSAocGFnZUNoYXIubV9GbGFnID09IEZQREZURVhUX0NIQVJfSFlQSEVOIHx8CisgICAgICAgICAgICAgICAgICAgICAgKHBhZ2VDaGFyLm1fRmxhZyA9PSBGUERGVEVYVF9DSEFSX05PUk1BTCAmJgorICAgICAgICAgICAgICAgICAgICAgICBwYWdlQ2hhci5tX1VuaWNvZGUgPT0gVEVYVF9IWVBIRU5fQ0hBUikpOwogICAgICAgcG9zKys7CiAgICAgfQogICB9CiB9CiAKLWJvb2wgQ1BERl9MaW5rRXh0cmFjdDo6Q2hlY2tXZWJMaW5rKENGWF9XaWRlU3RyaW5nJiBzdHJCZUNoZWNrKSB7Ci0gIENGWF9XaWRlU3RyaW5nIHN0ciA9IHN0ckJlQ2hlY2s7Citib29sIENQREZfTGlua0V4dHJhY3Q6OkNoZWNrV2ViTGluayhXaWRlU3RyaW5nKiBzdHJCZUNoZWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogbkNvdW50KSB7CisgIHN0YXRpYyBjb25zdCB3Y2hhcl90IGtIdHRwU2NoZW1lW10gPSBMImh0dHAiOworICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtIdHRwU2NoZW1lTGVuID0gRlhTWVNfbGVuKGtIdHRwU2NoZW1lKTsKKyAgc3RhdGljIGNvbnN0IHdjaGFyX3Qga1dXV0FkZHJTdGFydFtdID0gTCJ3d3cuIjsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrV1dXQWRkclN0YXJ0TGVuID0gRlhTWVNfbGVuKGtXV1dBZGRyU3RhcnQpOworCisgIFdpZGVTdHJpbmcgc3RyID0gKnN0ckJlQ2hlY2s7CiAgIHN0ci5NYWtlTG93ZXIoKTsKLSAgaWYgKHN0ci5GaW5kKEwiaHR0cDovL3d3dy4iKSAhPSAtMSkgewotICAgIHN0ckJlQ2hlY2sgPSBzdHJCZUNoZWNrLlJpZ2h0KHN0ci5HZXRMZW5ndGgoKSAtIHN0ci5GaW5kKEwiaHR0cDovL3d3dy4iKSk7Ci0gICAgcmV0dXJuIHRydWU7CisKKyAgc2l6ZV90IGxlbiA9IHN0ci5HZXRMZW5ndGgoKTsKKyAgLy8gRmlyc3QsIHRyeSB0byBmaW5kIHRoZSBzY2hlbWUuCisgIGF1dG8gc3RhcnQgPSBzdHIuRmluZChrSHR0cFNjaGVtZSk7CisgIGlmIChzdGFydC5oYXNfdmFsdWUoKSkgeworICAgIHNpemVfdCBvZmYgPSBzdGFydC52YWx1ZSgpICsga0h0dHBTY2hlbWVMZW47ICAvLyBtb3ZlIGFmdGVyICJodHRwIi4KKyAgICBpZiAobGVuID4gb2ZmICsgNCkgeyAgICAgICAgICAgICAgICAgICAgICAvLyBBdCBsZWFzdCAiOi8vPGNoYXI+IiBmb2xsb3dzLgorICAgICAgaWYgKHN0cltvZmZdID09IEwncycpICAgICAgICAgICAgICAgICAgIC8vICJodHRwcyIgc2NoZW1lIGlzIGFjY2VwdGVkLgorICAgICAgICBvZmYrKzsKKyAgICAgIGlmIChzdHJbb2ZmXSA9PSBMJzonICYmIHN0cltvZmYgKyAxXSA9PSBMJy8nICYmIHN0cltvZmYgKyAyXSA9PSBMJy8nKSB7CisgICAgICAgIG9mZiArPSAzOworICAgICAgICBzaXplX3QgZW5kID0gVHJpbUV4dGVybmFsQnJhY2tldHNGcm9tV2ViTGluayhzdHIsIHN0YXJ0LnZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ci5HZXRMZW5ndGgoKSAtIDEpOworICAgICAgICBlbmQgPSBGaW5kV2ViTGlua0VuZGluZyhzdHIsIG9mZiwgZW5kKTsKKyAgICAgICAgaWYgKGVuZCA+IG9mZikgeyAgLy8gTm9uLWVtcHR5IGhvc3QgbmFtZS4KKyAgICAgICAgICAqblN0YXJ0ID0gc3RhcnQudmFsdWUoKTsKKyAgICAgICAgICAqbkNvdW50ID0gZW5kIC0gc3RhcnQudmFsdWUoKSArIDE7CisgICAgICAgICAgKnN0ckJlQ2hlY2sgPSBzdHJCZUNoZWNrLT5NaWQoKm5TdGFydCwgKm5Db3VudCk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CiAgIH0KLSAgaWYgKHN0ci5GaW5kKEwiaHR0cDovLyIpICE9IC0xKSB7Ci0gICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gc3RyLkZpbmQoTCJodHRwOi8vIikpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChzdHIuRmluZChMImh0dHBzOi8vd3d3LiIpICE9IC0xKSB7Ci0gICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gc3RyLkZpbmQoTCJodHRwczovL3d3dy4iKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKHN0ci5GaW5kKEwiaHR0cHM6Ly8iKSAhPSAtMSkgewotICAgIHN0ckJlQ2hlY2sgPSBzdHJCZUNoZWNrLlJpZ2h0KHN0ci5HZXRMZW5ndGgoKSAtIHN0ci5GaW5kKEwiaHR0cHM6Ly8iKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKHN0ci5GaW5kKEwid3d3LiIpICE9IC0xKSB7Ci0gICAgc3RyQmVDaGVjayA9IHN0ckJlQ2hlY2suUmlnaHQoc3RyLkdldExlbmd0aCgpIC0gc3RyLkZpbmQoTCJ3d3cuIikpOwotICAgIHN0ckJlQ2hlY2sgPSBMImh0dHA6Ly8iICsgc3RyQmVDaGVjazsKLSAgICByZXR1cm4gdHJ1ZTsKKworICAvLyBXaGVuIHRoZXJlIGlzIG5vIHNjaGVtZSwgdHJ5IHRvIGZpbmQgdXJsIHN0YXJ0aW5nIHdpdGggInd3dy4iLgorICBzdGFydCA9IHN0ci5GaW5kKGtXV1dBZGRyU3RhcnQpOworICBpZiAoc3RhcnQuaGFzX3ZhbHVlKCkgJiYgbGVuID4gc3RhcnQudmFsdWUoKSArIGtXV1dBZGRyU3RhcnRMZW4pIHsKKyAgICBzaXplX3QgZW5kID0gVHJpbUV4dGVybmFsQnJhY2tldHNGcm9tV2ViTGluayhzdHIsIHN0YXJ0LnZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLkdldExlbmd0aCgpIC0gMSk7CisgICAgZW5kID0gRmluZFdlYkxpbmtFbmRpbmcoc3RyLCBzdGFydC52YWx1ZSgpLCBlbmQpOworICAgIGlmIChlbmQgPiBzdGFydC52YWx1ZSgpICsga1dXV0FkZHJTdGFydExlbikgeworICAgICAgKm5TdGFydCA9IHN0YXJ0LnZhbHVlKCk7CisgICAgICAqbkNvdW50ID0gZW5kIC0gc3RhcnQudmFsdWUoKSArIDE7CisgICAgICAqc3RyQmVDaGVjayA9IEwiaHR0cDovLyIgKyBzdHJCZUNoZWNrLT5NaWQoKm5TdGFydCwgKm5Db3VudCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CiAgIH0KICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIENQREZfTGlua0V4dHJhY3Q6OkNoZWNrTWFpbExpbmsoQ0ZYX1dpZGVTdHJpbmcmIHN0cikgewotICBpbnQgYVBvcyA9IHN0ci5GaW5kKEwnQCcpOwotICAvLyBJbnZhbGlkIHdoZW4gbm8gJ0AnLgotICBpZiAoYVBvcyA8IDEpCitib29sIENQREZfTGlua0V4dHJhY3Q6OkNoZWNrTWFpbExpbmsoV2lkZVN0cmluZyogc3RyKSB7CisgIGF1dG8gYVBvcyA9IHN0ci0+RmluZChMJ0AnKTsKKyAgLy8gSW52YWxpZCB3aGVuIG5vICdAJyBvciB3aGVuIHN0YXJ0cy9lbmRzIHdpdGggJ0AnLgorICBpZiAoIWFQb3MuaGFzX3ZhbHVlKCkgfHwgYVBvcy52YWx1ZSgpID09IDAgfHwgYVBvcyA9PSBzdHItPkdldExlbmd0aCgpIC0gMSkKICAgICByZXR1cm4gZmFsc2U7CiAKICAgLy8gQ2hlY2sgdGhlIGxvY2FsIHBhcnQuCi0gIGludCBwUG9zID0gYVBvczsgIC8vIFVzZWQgdG8gdHJhY2sgdGhlIHBvc2l0aW9uIG9mICdAJyBvciAnLicuCi0gIGZvciAoaW50IGkgPSBhUG9zIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICBGWF9XQ0hBUiBjaCA9IHN0ci5HZXRBdChpKTsKKyAgc2l6ZV90IHBQb3MgPSBhUG9zLnZhbHVlKCk7ICAvLyBVc2VkIHRvIHRyYWNrIHRoZSBwb3NpdGlvbiBvZiAnQCcgb3IgJy4nLgorICBmb3IgKHNpemVfdCBpID0gYVBvcy52YWx1ZSgpOyBpID4gMDsgaS0tKSB7CisgICAgd2NoYXJfdCBjaCA9ICgqc3RyKVtpIC0gMV07CiAgICAgaWYgKGNoID09IEwnXycgfHwgY2ggPT0gTCctJyB8fCBGWFNZU19pc3dhbG51bShjaCkpCiAgICAgICBjb250aW51ZTsKIAotICAgIGlmIChjaCAhPSBMJy4nIHx8IGkgPT0gcFBvcyAtIDEgfHwgaSA9PSAwKSB7Ci0gICAgICBpZiAoaSA9PSBhUG9zIC0gMSkgeworICAgIGlmIChjaCAhPSBMJy4nIHx8IGkgPT0gcFBvcyB8fCBpID09IDEpIHsKKyAgICAgIGlmIChpID09IGFQb3MudmFsdWUoKSkgewogICAgICAgICAvLyBUaGVyZSBpcyAnLicgb3IgaW52YWxpZCBjaGFyIGJlZm9yZSAnQCcuCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIH0KICAgICAgIC8vIEVuZCBleHRyYWN0aW5nIGZvciBvdGhlciBpbnZhbGlkIGNoYXJzLCAnLicgYXQgdGhlIGJlZ2lubmluZywgb3IKICAgICAgIC8vIGNvbnNlY3V0aXZlICcuJy4KLSAgICAgIGludCByZW1vdmVkX2xlbiA9IGkgPT0gcFBvcyAtIDEgPyBpICsgMiA6IGkgKyAxOwotICAgICAgc3RyID0gc3RyLlJpZ2h0KHN0ci5HZXRMZW5ndGgoKSAtIHJlbW92ZWRfbGVuKTsKKyAgICAgIHNpemVfdCByZW1vdmVkX2xlbiA9IGkgPT0gcFBvcyA/IGkgKyAxIDogaTsKKyAgICAgICpzdHIgPSBzdHItPlJpZ2h0KHN0ci0+R2V0TGVuZ3RoKCkgLSByZW1vdmVkX2xlbik7CiAgICAgICBicmVhazsKICAgICB9CiAgICAgLy8gRm91bmQgYSB2YWxpZCAnLicuCi0gICAgcFBvcyA9IGk7CisgICAgcFBvcyA9IGkgLSAxOwogICB9CiAKICAgLy8gQ2hlY2sgdGhlIGRvbWFpbiBuYW1lIHBhcnQuCi0gIGFQb3MgPSBzdHIuRmluZChMJ0AnKTsKLSAgaWYgKGFQb3MgPCAxKQorICBhUG9zID0gc3RyLT5GaW5kKEwnQCcpOworICBpZiAoIWFQb3MuaGFzX3ZhbHVlKCkgfHwgYVBvcy52YWx1ZSgpID09IDApCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIHN0ci5UcmltUmlnaHQoTCcuJyk7CisgIHN0ci0+VHJpbVJpZ2h0KEwnLicpOwogICAvLyBBdCBsZWFzdCBvbmUgJy4nIGluIGRvbWFpbiBuYW1lLCBidXQgbm90IGF0IHRoZSBiZWdpbm5pbmcuCiAgIC8vIFRPRE8od2VpbGkpOiBSRkM1MzIyIGFsbG93cyBkb21haW4gbmFtZXMgdG8gYmUgYSBsb2NhbCBuYW1lIHdpdGhvdXQgJy4nLgogICAvLyBDaGVjayB3aGV0aGVyIHdlIHNob3VsZCByZW1vdmUgdGhpcyBjaGVjay4KLSAgaW50IGVQb3MgPSBzdHIuRmluZChMJy4nLCBhUG9zICsgMSk7Ci0gIGlmIChlUG9zID09IC0xIHx8IGVQb3MgPT0gYVBvcyArIDEpCisgIGF1dG8gZVBvcyA9IHN0ci0+RmluZChMJy4nLCBhUG9zLnZhbHVlKCkgKyAxKTsKKyAgaWYgKCFlUG9zLmhhc192YWx1ZSgpIHx8IGVQb3MudmFsdWUoKSA9PSBhUG9zLnZhbHVlKCkgKyAxKQogICAgIHJldHVybiBmYWxzZTsKIAogICAvLyBWYWxpZGF0ZSBhbGwgb3RoZXIgY2hhcnMgaW4gZG9tYWluIG5hbWUuCi0gIGludCBuTGVuID0gc3RyLkdldExlbmd0aCgpOworICBzaXplX3QgbkxlbiA9IHN0ci0+R2V0TGVuZ3RoKCk7CiAgIHBQb3MgPSAwOyAgLy8gVXNlZCB0byB0cmFjayB0aGUgcG9zaXRpb24gb2YgJy4nLgotICBmb3IgKGludCBpID0gYVBvcyArIDE7IGkgPCBuTGVuOyBpKyspIHsKLSAgICBGWF9XQ0hBUiB3Y2ggPSBzdHIuR2V0QXQoaSk7CisgIGZvciAoc2l6ZV90IGkgPSBhUG9zLnZhbHVlKCkgKyAxOyBpIDwgbkxlbjsgaSsrKSB7CisgICAgd2NoYXJfdCB3Y2ggPSAoKnN0cilbaV07CiAgICAgaWYgKHdjaCA9PSBMJy0nIHx8IEZYU1lTX2lzd2FsbnVtKHdjaCkpCiAgICAgICBjb250aW51ZTsKIAogICAgIGlmICh3Y2ggIT0gTCcuJyB8fCBpID09IHBQb3MgKyAxKSB7CiAgICAgICAvLyBEb21haW4gbmFtZSBzaG91bGQgZW5kIGJlZm9yZSBpbnZhbGlkIGNoYXIuCi0gICAgICBpbnQgaG9zdF9lbmQgPSBpID09IHBQb3MgKyAxID8gaSAtIDIgOiBpIC0gMTsKLSAgICAgIGlmIChwUG9zID4gMCAmJiBob3N0X2VuZCAtIGFQb3MgPj0gMykgeworICAgICAgc2l6ZV90IGhvc3RfZW5kID0gaSA9PSBwUG9zICsgMSA/IGkgLSAyIDogaSAtIDE7CisgICAgICBpZiAocFBvcyA+IDAgJiYgaG9zdF9lbmQgLSBhUG9zLnZhbHVlKCkgPj0gMykgewogICAgICAgICAvLyBUcmltIHRoZSBlbmRpbmcgaW52YWxpZCBjaGFycyBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgJy4nIGFuZCBuYW1lLgotICAgICAgICBzdHIgPSBzdHIuTGVmdChob3N0X2VuZCArIDEpOworICAgICAgICAqc3RyID0gc3RyLT5MZWZ0KGhvc3RfZW5kICsgMSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTU0LDEzICsyOTcsMTMgQEAKICAgICBwUG9zID0gaTsKICAgfQogCi0gIGlmIChzdHIuRmluZChMIm1haWx0bzoiKSA9PSAtMSkKLSAgICBzdHIgPSBMIm1haWx0bzoiICsgc3RyOworICBpZiAoIXN0ci0+Q29udGFpbnMoTCJtYWlsdG86IikpCisgICAgKnN0ciA9IEwibWFpbHRvOiIgKyAqc3RyOwogCiAgIHJldHVybiB0cnVlOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUERGX0xpbmtFeHRyYWN0OjpHZXRVUkwoc2l6ZV90IGluZGV4KSBjb25zdCB7CitXaWRlU3RyaW5nIENQREZfTGlua0V4dHJhY3Q6OkdldFVSTChzaXplX3QgaW5kZXgpIGNvbnN0IHsKICAgcmV0dXJuIGluZGV4IDwgbV9MaW5rQXJyYXkuc2l6ZSgpID8gbV9MaW5rQXJyYXlbaW5kZXhdLm1fc3RyVXJsIDogTCIiOwogfQogCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZ0ZXh0L2NwZGZfbGlua2V4dHJhY3QuaCBiL2NvcmUvZnBkZnRleHQvY3BkZl9saW5rZXh0cmFjdC5oCmluZGV4IDQzMzA2Y2YuLjcxM2Y2NTggMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZnRleHQvY3BkZl9saW5rZXh0cmFjdC5oCisrKyBiL2NvcmUvZnBkZnRleHQvY3BkZl9saW5rZXh0cmFjdC5oCkBAIC05LDcgKzksNiBAQAogCiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCkBAIC0yMywyMyArMjIsMjMgQEAKIAogICB2b2lkIEV4dHJhY3RMaW5rcygpOwogICBzaXplX3QgQ291bnRMaW5rcygpIGNvbnN0IHsgcmV0dXJuIG1fTGlua0FycmF5LnNpemUoKTsgfQotICBDRlhfV2lkZVN0cmluZyBHZXRVUkwoc2l6ZV90IGluZGV4KSBjb25zdDsKKyAgV2lkZVN0cmluZyBHZXRVUkwoc2l6ZV90IGluZGV4KSBjb25zdDsKICAgc3RkOjp2ZWN0b3I8Q0ZYX0Zsb2F0UmVjdD4gR2V0UmVjdHMoc2l6ZV90IGluZGV4KSBjb25zdDsKIAogIHByb3RlY3RlZDoKICAgdm9pZCBQYXJzZUxpbmsoKTsKLSAgYm9vbCBDaGVja1dlYkxpbmsoQ0ZYX1dpZGVTdHJpbmcmIHN0cik7Ci0gIGJvb2wgQ2hlY2tNYWlsTGluayhDRlhfV2lkZVN0cmluZyYgc3RyKTsKKyAgYm9vbCBDaGVja1dlYkxpbmsoV2lkZVN0cmluZyogc3RyLCBpbnQzMl90KiBuU3RhcnQsIGludDMyX3QqIG5Db3VudCk7CisgIGJvb2wgQ2hlY2tNYWlsTGluayhXaWRlU3RyaW5nKiBzdHIpOwogCiAgcHJpdmF0ZToKICAgc3RydWN0IExpbmsgewogICAgIGludCBtX1N0YXJ0OwogICAgIGludCBtX0NvdW50OwotICAgIENGWF9XaWRlU3RyaW5nIG1fc3RyVXJsOworICAgIFdpZGVTdHJpbmcgbV9zdHJVcmw7CiAgIH07CiAKLSAgY29uc3QgQ1BERl9UZXh0UGFnZSogY29uc3QgbV9wVGV4dFBhZ2U7Ci0gIENGWF9XaWRlU3RyaW5nIG1fc3RyUGFnZVRleHQ7CisgIFVub3duZWRQdHI8Y29uc3QgQ1BERl9UZXh0UGFnZT4gY29uc3QgbV9wVGV4dFBhZ2U7CisgIFdpZGVTdHJpbmcgbV9zdHJQYWdlVGV4dDsKICAgc3RkOjp2ZWN0b3I8TGluaz4gbV9MaW5rQXJyYXk7CiB9OwogCmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZ0ZXh0L2NwZGZfbGlua2V4dHJhY3RfdW5pdHRlc3QuY3BwIGIvY29yZS9mcGRmdGV4dC9jcGRmX2xpbmtleHRyYWN0X3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDQzOGU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9mcGRmdGV4dC9jcGRmX2xpbmtleHRyYWN0X3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDE4NyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY29yZS9mcGRmdGV4dC9jcGRmX2xpbmtleHRyYWN0LmgiCisKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworLy8gQ2xhc3MgdG8gaGVscCB0ZXN0IGZ1bmN0aW9ucyBpbiBDUERGX0xpbmtFeHRyYWN0IGNsYXNzLgorY2xhc3MgQ1BERl9UZXN0TGlua0V4dHJhY3QgOiBwdWJsaWMgQ1BERl9MaW5rRXh0cmFjdCB7CisgcHVibGljOgorICBDUERGX1Rlc3RMaW5rRXh0cmFjdCgpIDogQ1BERl9MaW5rRXh0cmFjdChudWxscHRyKSB7fQorCisgcHJpdmF0ZToKKyAgLy8gQWRkIHRlc3QgY2FzZXMgYXMgZnJpZW5kcyB0byBhY2Nlc3MgcHJvdGVjdGVkIG1lbWJlciBmdW5jdGlvbnMuCisgIC8vIEFjY2VzcyBDaGVja01haWxMaW5rIGFuZCBDaGVja1dlYkxpbmsuCisgIEZSSUVORF9URVNUKENQREZfTGlua0V4dHJhY3RUZXN0LCBDaGVja01haWxMaW5rKTsKKyAgRlJJRU5EX1RFU1QoQ1BERl9MaW5rRXh0cmFjdFRlc3QsIENoZWNrV2ViTGluayk7Cit9OworCitURVNUKENQREZfTGlua0V4dHJhY3RUZXN0LCBDaGVja01haWxMaW5rKSB7CisgIENQREZfVGVzdExpbmtFeHRyYWN0IGV4dHJhY3RvcjsKKyAgLy8gQ2hlY2sgY2FzZXMgdGhhdCBmYWlsIHRvIGV4dHJhY3QgdmFsaWQgbWFpbCBsaW5rLgorICBjb25zdCB3Y2hhcl90KiBjb25zdCBpbnZhbGlkX3N0cnNbXSA9IHsKKyAgICAgIEwiIiwKKyAgICAgIEwicGV0ZXIucGFuIiwgICAgICAgLy8gJ0AnIGlzIHJlcXVpcmVkLgorICAgICAgTCJhYmNAc2VydmVyIiwgICAgICAvLyBEb21haW4gbmFtZSBuZWVkcyBhdCBsZWFzdCBvbmUgJy4nLgorICAgICAgTCJhYmMuQGdtYWlsLmNvbSIsICAvLyAnLicgY2FuIG5vdCBpbW1lZGlhdGVseSBwcmVjZWRlICdAJy4KKyAgICAgIEwiYWJjQHh5eiZxLm9yZyIsICAgLy8gRG9tYWluIG5hbWUgc2hvdWxkIG5vdCBjb250YWluICcmJy4KKyAgICAgIEwiYWJjQC54eXoub3JnIiwgICAgLy8gRG9tYWluIG5hbWUgc2hvdWxkIG5vdCBzdGFydCB3aXRoICcuJy4KKyAgICAgIEwiZmFuQGcuLmNvbSIgICAgICAgLy8gRG9tYWluIG5hbWUgc2hvdWxkIG5vdCBoYXZlIGNvbnNlY3V0aXZlICcuJworICB9OworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShpbnZhbGlkX3N0cnMpOyArK2kpIHsKKyAgICBjb25zdCB3Y2hhcl90KiBjb25zdCBpbnB1dCA9IGludmFsaWRfc3Ryc1tpXTsKKyAgICBXaWRlU3RyaW5nIHRleHRfc3RyKGlucHV0KTsKKyAgICBFWFBFQ1RfRkFMU0UoZXh0cmFjdG9yLkNoZWNrTWFpbExpbmsoJnRleHRfc3RyKSkgPDwgaW5wdXQ7CisgIH0KKworICAvLyBDaGVjayBjYXNlcyB0aGF0IGNhbiBleHRyYWN0IHZhbGlkIG1haWwgbGluay4KKyAgLy8gQW4gYXJyYXkgb2Yge2lucHV0X3N0cmluZywgZXhwZWN0ZWRfZXh0cmFjdGVkX2VtYWlsX2FkZHJlc3N9LgorICBjb25zdCB3Y2hhcl90KiBjb25zdCB2YWxpZF9zdHJzW11bMl0gPSB7CisgICAgICB7TCJwZXRlckBhYmMuZCIsIEwicGV0ZXJAYWJjLmQifSwKKyAgICAgIHtMInJlZC50ZWRkeS5iQGFiYy5jb20iLCBMInJlZC50ZWRkeS5iQGFiYy5jb20ifSwKKyAgICAgIHtMImFiY19AZ21haWwuY29tIiwgTCJhYmNfQGdtYWlsLmNvbSJ9LCAgLy8gJ18nIGlzIG9rIGJlZm9yZSAnQCcuCisgICAgICB7TCJkdW1teS1oaUBnbWFpbC5jb20iLAorICAgICAgIEwiZHVtbXktaGlAZ21haWwuY29tIn0sICAgICAgICAgICAgICAgICAgLy8gJy0nIGlzIG9rIGluIHVzZXIgbmFtZS4KKyAgICAgIHtMImEuLmRmQGdtYWlsLmNvbSIsIEwiZGZAZ21haWwuY29tIn0sICAgIC8vIFN0b3AgYXQgY29uc2VjdXRpdmUgJy4nLgorICAgICAge0wiLmpvaG5AeWFob28uY29tIiwgTCJqb2huQHlhaG9vLmNvbSJ9LCAgLy8gUmVtb3ZlIGhlYWRpbmcgJy4nLgorICAgICAge0wiYWJjQHh5ei5vcmc/LyIsIEwiYWJjQHh5ei5vcmcifSwgICAgICAgLy8gVHJpbSBlbmRpbmcgaW52YWxpZCBjaGFycy4KKyAgICAgIHtMImZhbnthYmNAeHl6Lm9yZyIsIEwiYWJjQHh5ei5vcmcifSwgICAgIC8vIFRyaW0gYmVnaW5uaW5nIGludmFsaWQgY2hhcnMuCisgICAgICB7TCJmYW5AZy5jb20uLiIsIEwiZmFuQGcuY29tIn0sICAgICAgICAgICAvLyBUcmltIHRoZSBlbmRpbmcgcGVyaW9kcy4KKyAgICAgIHtMIkNBUC5jYXBAR21haWwuQ29tIiwgTCJDQVAuY2FwQEdtYWlsLkNvbSJ9LCAgLy8gS2VlcCB0aGUgb3JpZ2luYWwgY2FzZS4KKyAgfTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodmFsaWRfc3Rycyk7ICsraSkgeworICAgIGNvbnN0IHdjaGFyX3QqIGNvbnN0IGlucHV0ID0gdmFsaWRfc3Ryc1tpXVswXTsKKyAgICBXaWRlU3RyaW5nIHRleHRfc3RyKGlucHV0KTsKKyAgICBXaWRlU3RyaW5nIGV4cGVjdGVkX3N0cihMIm1haWx0bzoiKTsKKyAgICBleHBlY3RlZF9zdHIgKz0gdmFsaWRfc3Ryc1tpXVsxXTsKKyAgICBFWFBFQ1RfVFJVRShleHRyYWN0b3IuQ2hlY2tNYWlsTGluaygmdGV4dF9zdHIpKSA8PCBpbnB1dDsKKyAgICBFWFBFQ1RfU1RSRVEoZXhwZWN0ZWRfc3RyLmNfc3RyKCksIHRleHRfc3RyLmNfc3RyKCkpOworICB9Cit9CisKK1RFU1QoQ1BERl9MaW5rRXh0cmFjdFRlc3QsIENoZWNrV2ViTGluaykgeworICBDUERGX1Rlc3RMaW5rRXh0cmFjdCBleHRyYWN0b3I7CisgIC8vIENoZWNrIGNhc2VzIHRoYXQgZmFpbCB0byBleHRyYWN0IHZhbGlkIHdlYiBsaW5rLgorICAvLyBUaGUgbGFzdCBmZXcgYXJlIGxlZ2l0IHdlYiBhZGRyZXNzZXMgdGhhdCB3ZSBkb24ndCBoYW5kbGUgbm93LgorICBjb25zdCB3Y2hhcl90KiBjb25zdCBpbnZhbGlkX2Nhc2VzW10gPSB7CisgICAgICBMIiIsIEwiaHR0cCIsIEwid3d3LiIsIEwiaHR0cHMtYW5kLXd3dyIsCisgICAgICBMImh0dHA6L2FiYy5jb20iLCAgICAgICAgICAgICAvLyBNaXNzaW5nIHNsYXNoLgorICAgICAgTCJodHRwOi8vKCgoKSksIiwgICAgICAgICAgICAgLy8gT25seSBpbnZhbGlkIGNoYXJzIGluIGhvc3QgbmFtZS4KKyAgICAgIEwiZnRwOi8vZXhhbXBsZS5jb20iLCAgICAgICAgIC8vIEZ0cCBzY2hlbWUgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgIEwiaHR0cDpleGFtcGxlLmNvbSIsICAgICAgICAgIC8vIE1pc3Npbmcgc2xhc2hlcy4KKyAgICAgIEwiaHR0cC8vW2V4YW1wbGUuY29tIiwgICAgICAgIC8vIEludmFsaWQgSVB2NiBhZGRyZXNzLgorICAgICAgTCJodHRwLy9bMDA6MDA6MDA6MDA6MDA6MDAiLCAgLy8gSW52YWxpZCBJUHY2IGFkZHJlc3MuCisgICAgICBMImh0dHAvL1tdIiwgICAgICAgICAgICAgICAgICAvLyBFbXB0eSBJUHY2IGFkZHJlc3MuCisgICAgICAvLyBXZWIgYWRkcmVzc2VzIHRoYXQgaW4gY29ycmVjdCBmb3JtYXQgdGhhdCB3ZSBkb24ndCBoYW5kbGUuCisgICAgICBMImFiYy5leGFtcGxlLmNvbSIsICAvLyBVUkwgd2l0aG91dCBzY2hlbWUuCisgIH07CisgIGNvbnN0IGludDMyX3QgREVGQVVMVF9WQUxVRSA9IC00MjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoaW52YWxpZF9jYXNlcyk7ICsraSkgeworICAgIGNvbnN0IHdjaGFyX3QqIGNvbnN0IGlucHV0ID0gaW52YWxpZF9jYXNlc1tpXTsKKyAgICBXaWRlU3RyaW5nIHRleHRfc3RyKGlucHV0KTsKKyAgICBpbnQzMl90IHN0YXJ0X29mZnNldCA9IERFRkFVTFRfVkFMVUU7CisgICAgaW50MzJfdCBjb3VudCA9IERFRkFVTFRfVkFMVUU7CisgICAgRVhQRUNUX0ZBTFNFKGV4dHJhY3Rvci5DaGVja1dlYkxpbmsoJnRleHRfc3RyLCAmc3RhcnRfb2Zmc2V0LCAmY291bnQpKQorICAgICAgICA8PCBpbnB1dDsKKyAgICBFWFBFQ1RfRVEoREVGQVVMVF9WQUxVRSwgc3RhcnRfb2Zmc2V0KSA8PCBpbnB1dDsKKyAgICBFWFBFQ1RfRVEoREVGQVVMVF9WQUxVRSwgY291bnQpIDw8IGlucHV0OworICB9CisKKyAgLy8gQ2hlY2sgY2FzZXMgdGhhdCBjYW4gZXh0cmFjdCB2YWxpZCB3ZWIgbGluay4KKyAgLy8gQW4gYXJyYXkgb2Yge2lucHV0X3N0cmluZywgZXhwZWN0ZWRfZXh0cmFjdGVkX3dlYl9saW5rfS4KKyAgc3RydWN0IFZhbGlkQ2FzZSB7CisgICAgY29uc3Qgd2NoYXJfdCogY29uc3QgaW5wdXRfc3RyaW5nOworICAgIGNvbnN0IHdjaGFyX3QqIGNvbnN0IHVybF9leHRyYWN0ZWQ7CisgICAgY29uc3QgaW50MzJfdCBzdGFydF9vZmZzZXQ7CisgICAgY29uc3QgaW50MzJfdCBjb3VudDsKKyAgfTsKKyAgY29uc3QgVmFsaWRDYXNlIHZhbGlkX2Nhc2VzW10gPSB7CisgICAgICB7TCJodHRwOi8vd3d3LmV4YW1wbGUuY29tIiwgTCJodHRwOi8vd3d3LmV4YW1wbGUuY29tIiwgMCwKKyAgICAgICAyMn0sICAvLyBzdGFuZGFyZCBVUkwuCisgICAgICB7TCJodHRwOi8vd3d3LmV4YW1wbGUuY29tOjg4IiwgTCJodHRwOi8vd3d3LmV4YW1wbGUuY29tOjg4IiwgMCwKKyAgICAgICAyNX0sICAvLyBVUkwgd2l0aCBwb3J0IG51bWJlci4KKyAgICAgIHtMImh0dHA6Ly90ZXN0QHd3dy5leGFtcGxlLmNvbSIsIEwiaHR0cDovL3Rlc3RAd3d3LmV4YW1wbGUuY29tIiwgMCwKKyAgICAgICAyN30sICAvLyBVUkwgd2l0aCB1c2VybmFtZS4KKyAgICAgIHtMImh0dHA6Ly90ZXN0OnRlc3RAZXhhbXBsZS5jb20iLCBMImh0dHA6Ly90ZXN0OnRlc3RAZXhhbXBsZS5jb20iLCAwLAorICAgICAgIDI4fSwgIC8vIFVSTCB3aXRoIHVzZXJuYW1lIGFuZCBwYXNzd29yZC4KKyAgICAgIHtMImh0dHA6Ly9leGFtcGxlIiwgTCJodHRwOi8vZXhhbXBsZSIsIDAsCisgICAgICAgMTR9LCAgLy8gVVJMIHdpdGggc2hvcnQgZG9tYWluIG5hbWUuCisgICAgICB7TCJodHRwLy8vL3d3dy5zZXJ2ZXIiLCBMImh0dHA6Ly93d3cuc2VydmVyIiwgOCwKKyAgICAgICAxMH0sICAvLyBVUkwgc3RhcnRzIHdpdGggInd3dy4iLgorICAgICAge0wiaHR0cDovd3d3LmFiYy5jb20iLCBMImh0dHA6Ly93d3cuYWJjLmNvbSIsIDYsCisgICAgICAgMTF9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVSTCBzdGFydHMgd2l0aCAid3d3LiIuCisgICAgICB7TCJ3d3cuYS5iLmMiLCBMImh0dHA6Ly93d3cuYS5iLmMiLCAwLCA5fSwgIC8vIFVSTCBzdGFydHMgd2l0aCAid3d3LiIuCisgICAgICB7TCJodHRwczovL2EudXMiLCBMImh0dHBzOi8vYS51cyIsIDAsIDEyfSwgIC8vIFNlY3VyZSBodHRwIFVSTC4KKyAgICAgIHtMImh0dHBzOi8vd3d3LnQudXMiLCBMImh0dHBzOi8vd3d3LnQudXMiLCAwLCAxNn0sICAvLyBTZWN1cmUgaHR0cCBVUkwuCisgICAgICB7TCJ3d3cuZXhhbXBsZS10ZXN0LmNvbSIsIEwiaHR0cDovL3d3dy5leGFtcGxlLXRlc3QuY29tIiwgMCwKKyAgICAgICAyMH0sICAvLyAnLScgaW4gaG9zdCBpcyBvay4KKyAgICAgIHtMInd3dy5leGFtcGxlLmNvbSwiLCBMImh0dHA6Ly93d3cuZXhhbXBsZS5jb20iLCAwLAorICAgICAgIDE1fSwgIC8vIFRyaW0gZW5kaW5nIGludmFsaWQgY2hhcnMuCisgICAgICB7TCJ3d3cuZXhhbXBsZS5jb207KCIsIEwiaHR0cDovL3d3dy5leGFtcGxlLmNvbSIsIDAsCisgICAgICAgMTV9LCAgLy8gVHJpbSBlbmRpbmcgaW52YWxpZCBjaGFycy4KKyAgICAgIHtMInRlc3Q6d3d3LmFiYy5jb20iLCBMImh0dHA6Ly93d3cuYWJjLmNvbSIsIDUsCisgICAgICAgMTF9LCAgLy8gVHJpbSBjaGFycyBiZWZvcmUgVVJMLgorICAgICAge0wiKGh0dHA6Ly93d3cuYWJjLmNvbSkiLCBMImh0dHA6Ly93d3cuYWJjLmNvbSIsIDEsCisgICAgICAgMTh9LCAgLy8gVHJpbSBleHRlcm5hbCBicmFja2V0cy4KKyAgICAgIHtMIjAoaHR0cDovL3d3dy5hYmMuY29tKTAiLCBMImh0dHA6Ly93d3cuYWJjLmNvbSIsIDIsCisgICAgICAgMTh9LCAgLy8gVHJpbSBjaGFycyBvdXRzaWRlIGJyYWNrZXRzIGFzIHdlbGwuCisgICAgICB7TCIwKHd3dy5hYmMuY29tKTAiLCBMImh0dHA6Ly93d3cuYWJjLmNvbSIsIDIsCisgICAgICAgMTF9LCAgLy8gTGlua3Mgd2l0aG91dCBodHRwIHNob3VsZCBhbHNvIGhhdmUgYnJhY2tldHMgdHJpbW1lZC4KKyAgICAgIHtMImh0dHA6Ly93d3cuYWJjLmNvbSkwIiwgTCJodHRwOi8vd3d3LmFiYy5jb20pMCIsIDAsCisgICAgICAgMjB9LCAgLy8gRG8gbm90IHRyaW0gYnJhY2tldHMgdGhhdCB3ZXJlIG5vdCBvcGVuZWQuCisgICAgICB7TCJ7KDxodHRwOi8vd3d3LmFiYy5jb20+KX0iLCBMImh0dHA6Ly93d3cuYWJjLmNvbSIsIDMsCisgICAgICAgMTh9LCAgLy8gVHJpbSBjaGFycyB3aXRoIG11bHRpcGxlIGxldmVscyBvZiBicmFja2V0cy4KKyAgICAgIHtMIltodHRwOi8vd3d3LmFiYy5jb20veigxKV0iLCBMImh0dHA6Ly93d3cuYWJjLmNvbS96KDEpIiwgMSwKKyAgICAgICAyM30sICAvLyBCcmFja2V0cyBvcGVuZWQgaW5zaWRlIHRoZSBVUkwgc2hvdWxkIG5vdCBiZSB0cmltbWVkLgorICAgICAge0wiKGh0dHA6Ly93d3cuYWJjLmNvbS96KDEpKSIsIEwiaHR0cDovL3d3dy5hYmMuY29tL3ooMSkiLCAxLAorICAgICAgIDIzfSwgIC8vIEJyYWNrZXRzIG9wZW5lZCBpbnNpZGUgdGhlIFVSTCBzaG91bGQgbm90IGJlIHRyaW1tZWQuCisgICAgICB7TCJcImh0dHA6Ly93d3cuYWJjLmNvbVwiIiwgTCJodHRwOi8vd3d3LmFiYy5jb20iLCAxLAorICAgICAgIDE4fSwgIC8vIEV4dGVybmFsIHF1b3RlcyBjYW4gYWxzbyBiZSBlc2NhcGVkCisgICAgICB7TCJ3d3cuZy5jb20uLiIsIEwiaHR0cDovL3d3dy5nLmNvbS4uIiwgMCwgMTF9LCAgLy8gTGVhdmUgZW5kaW5nIHBlcmlvZHMuCisKKyAgICAgIC8vIFdlYiBsaW5rcyBjYW4gY29udGFpbiBJUCBhZGRyZXNzZXMgdG9vLgorICAgICAge0wiaHR0cDovLzE5Mi4xNjguMC4xIiwgTCJodHRwOi8vMTkyLjE2OC4wLjEiLCAwLCAxOH0sICAvLyBJUHY0IGFkZHJlc3MuCisgICAgICB7TCJodHRwOi8vMTkyLjE2OC4wLjE6ODAiLCBMImh0dHA6Ly8xOTIuMTY4LjAuMTo4MCIsIDAsCisgICAgICAgMjF9LCAgLy8gSVB2NCBhZGRyZXNzIHdpdGggcG9ydC4KKyAgICAgIHtMImh0dHA6Ly9bYWE6OjAwOmJiOjowMDpjYzowMF0iLCBMImh0dHA6Ly9bYWE6OjAwOmJiOjowMDpjYzowMF0iLCAwLAorICAgICAgIDI4fSwgIC8vIElQdjYgcmVmZXJlbmNlLgorICAgICAge0wiaHR0cDovL1thYTo6MDA6YmI6OjAwOmNjOjAwXToxMiIsIEwiaHR0cDovL1thYTo6MDA6YmI6OjAwOmNjOjAwXToxMiIsCisgICAgICAgMCwgMzF9LCAgLy8gSVB2NiByZWZlcmVuY2Ugd2l0aCBwb3J0LgorICAgICAge0wiaHR0cDovL1thYV06MTIiLCBMImh0dHA6Ly9bYWFdOjEyIiwgMCwKKyAgICAgICAxNH0sICAvLyBOb3QgdmFsaWRhdGUgSVAgYWRkcmVzcy4KKyAgICAgIHtMImh0dHA6Ly9bYWFdOjEyYWJjIiwgTCJodHRwOi8vW2FhXToxMiIsIDAsCisgICAgICAgMTR9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJpbSBmb3IgSVB2NiBhZGRyZXNzLgorICAgICAge0wiaHR0cDovL1thYV06IiwgTCJodHRwOi8vW2FhXSIsIDAsIDExfSwgIC8vIFRyaW0gZm9yIElQdjYgYWRkcmVzcy4KKworICAgICAgLy8gUGF0aCBhbmQgcXVlcnkgcGFydHMgY2FuIGJlIGFueXRoaW5nLgorICAgICAge0wid3d3LmFiYy5jb20vIyUlXiYmKigiLCBMImh0dHA6Ly93d3cuYWJjLmNvbS8jJSVeJiYqKCIsIDAsIDIwfSwKKyAgICAgIHtMInd3dy5hLmNvbS8jYT1AP3E9cnImcj15IiwgTCJodHRwOi8vd3d3LmEuY29tLyNhPUA/cT1yciZyPXkiLCAwLCAyM30sCisgICAgICB7TCJodHRwOi8vYS5jb20vMS8yLzMvNFw1XDYiLCBMImh0dHA6Ly9hLmNvbS8xLzIvMy80XDVcNiIsIDAsIDIyfSwKKyAgICAgIHtMImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vZm9vO2JhciIsIEwiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9mb287YmFyIiwgMCwKKyAgICAgICAzMH0sCisKKyAgICAgIC8vIEludmFsaWQgY2hhcnMgaW5zaWRlIGhvc3QgbmFtZSBhcmUgb2sgYXMgd2UgZG9uJ3QgdmFsaWRhdGUgdGhlbS4KKyAgICAgIHtMImh0dHA6Ly9leFthbV1wbGUiLCBMImh0dHA6Ly9leFthbV1wbGUiLCAwLCAxNn0sCisgICAgICB7TCJodHRwOi8vOmV4YW1wbGUuY29tIiwgTCJodHRwOi8vOmV4YW1wbGUuY29tIiwgMCwgMTl9LAorICAgICAge0wiaHR0cDovLygoKCkpL3BhdGg/IiwgTCJodHRwOi8vKCgoKSkvcGF0aD8iLCAwLCAxOH0sCisgICAgICB7TCJodHRwOi8vLy9hYmMuc2VydmVyIiwgTCJodHRwOi8vLy9hYmMuc2VydmVyIiwgMCwgMTl9LAorCisgICAgICAvLyBOb24tQVNDSUkgY2hhcnMgYXJlIG5vdCB2YWxpZGF0ZWQgZWl0aGVyLgorICAgICAge0wid3d3Lua1i+ivlS5uZXQiLCBMImh0dHA6Ly93d3cu5rWL6K+VLm5ldCIsIDAsIDEwfSwKKyAgICAgIHtMInd3dy7mtYvor5XjgIJuZXTjgIIiLCBMImh0dHA6Ly93d3cu5rWL6K+V44CCbmV044CCIiwgMCwgMTF9LAorICAgICAge0wid3d3Lua1i+ivlS5uZXTvvJsiLCBMImh0dHA6Ly93d3cu5rWL6K+VLm5ldO+8myIsIDAsIDExfSwKKyAgfTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodmFsaWRfY2FzZXMpOyArK2kpIHsKKyAgICBjb25zdCB3Y2hhcl90KiBjb25zdCBpbnB1dCA9IHZhbGlkX2Nhc2VzW2ldLmlucHV0X3N0cmluZzsKKyAgICBXaWRlU3RyaW5nIHRleHRfc3RyKGlucHV0KTsKKyAgICBpbnQzMl90IHN0YXJ0X29mZnNldCA9IERFRkFVTFRfVkFMVUU7CisgICAgaW50MzJfdCBjb3VudCA9IERFRkFVTFRfVkFMVUU7CisgICAgRVhQRUNUX1RSVUUoZXh0cmFjdG9yLkNoZWNrV2ViTGluaygmdGV4dF9zdHIsICZzdGFydF9vZmZzZXQsICZjb3VudCkpCisgICAgICAgIDw8IGlucHV0OworICAgIEVYUEVDVF9TVFJFUSh2YWxpZF9jYXNlc1tpXS51cmxfZXh0cmFjdGVkLCB0ZXh0X3N0ci5jX3N0cigpKTsKKyAgICBFWFBFQ1RfRVEodmFsaWRfY2FzZXNbaV0uc3RhcnRfb2Zmc2V0LCBzdGFydF9vZmZzZXQpIDw8IGlucHV0OworICAgIEVYUEVDVF9FUSh2YWxpZF9jYXNlc1tpXS5jb3VudCwgY291bnQpIDw8IGlucHV0OworICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZ0ZXh0L2NwZGZfdGV4dHBhZ2UuY3BwIGIvY29yZS9mcGRmdGV4dC9jcGRmX3RleHRwYWdlLmNwcAppbmRleCA3M2ExYTdlLi5iNDQ4YTU5IDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZ0ZXh0L2NwZGZfdGV4dHBhZ2UuY3BwCisrKyBiL2NvcmUvZnBkZnRleHQvY3BkZl90ZXh0cGFnZS5jcHAKQEAgLTIwLDE4ICsyMCwxOCBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJpbmcuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZ0ZXh0L3VuaWNvZGVub3JtYWxpemF0aW9uZGF0YS5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmlkaS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF91Y2QuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfdW5pY29kZS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKIAogbmFtZXNwYWNlIHsKIAotY29uc3QgRlhfRkxPQVQga0RlZmF1bHRGb250U2l6ZSA9IDEuMGY7Citjb25zdCBmbG9hdCBrRGVmYXVsdEZvbnRTaXplID0gMS4wZjsKIGNvbnN0IHVpbnQxNl90KiBjb25zdCBnX1VuaWNvZGVEYXRhX05vcm1hbGl6YXRpb25fTWFwc1s1XSA9IHsKICAgICBudWxscHRyLCBnX1VuaWNvZGVEYXRhX05vcm1hbGl6YXRpb25fTWFwMSwgZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uX01hcDIsCiAgICAgZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uX01hcDMsIGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvbl9NYXA0fTsKIAotRlhfRkxPQVQgTm9ybWFsaXplVGhyZXNob2xkKEZYX0ZMT0FUIHRocmVzaG9sZCkgeworZmxvYXQgTm9ybWFsaXplVGhyZXNob2xkKGZsb2F0IHRocmVzaG9sZCkgewogICBpZiAodGhyZXNob2xkIDwgMzAwKQogICAgIHJldHVybiB0aHJlc2hvbGQgLyAyLjBmOwogICBpZiAodGhyZXNob2xkIDwgNTAwKQpAQCAtNDEsMjEgKzQxLDIxIEBACiAgIHJldHVybiB0aHJlc2hvbGQgLyA2LjBmOwogfQogCi1GWF9GTE9BVCBDYWxjdWxhdGVCYXNlU3BhY2UoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKLSAgRlhfRkxPQVQgYmFzZVNwYWNlID0gMC4wOwotICBjb25zdCBpbnQgbkl0ZW1zID0gcFRleHRPYmotPkNvdW50SXRlbXMoKTsKK2Zsb2F0IENhbGN1bGF0ZUJhc2VTcGFjZShjb25zdCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBmbG9hdCBiYXNlU3BhY2UgPSAwLjA7CisgIGNvbnN0IHNpemVfdCBuSXRlbXMgPSBwVGV4dE9iai0+Q291bnRJdGVtcygpOwogICBpZiAocFRleHRPYmotPm1fVGV4dFN0YXRlLkdldENoYXJTcGFjZSgpICYmIG5JdGVtcyA+PSAzKSB7CiAgICAgYm9vbCBiQWxsQ2hhciA9IHRydWU7Ci0gICAgRlhfRkxPQVQgc3BhY2luZyA9CisgICAgZmxvYXQgc3BhY2luZyA9CiAgICAgICAgIG1hdHJpeC5UcmFuc2Zvcm1EaXN0YW5jZShwVGV4dE9iai0+bV9UZXh0U3RhdGUuR2V0Q2hhclNwYWNlKCkpOwogICAgIGJhc2VTcGFjZSA9IHNwYWNpbmc7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuSXRlbXM7IGkrKykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpIHsKICAgICAgIENQREZfVGV4dE9iamVjdEl0ZW0gaXRlbTsKICAgICAgIHBUZXh0T2JqLT5HZXRJdGVtSW5mbyhpLCAmaXRlbSk7CiAgICAgICBpZiAoaXRlbS5tX0NoYXJDb2RlID09IHN0YXRpY19jYXN0PHVpbnQzMl90PigtMSkpIHsKLSAgICAgICAgRlhfRkxPQVQgZm9udHNpemVfaCA9IHBUZXh0T2JqLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZUgoKTsKLSAgICAgICAgRlhfRkxPQVQga2VybmluZyA9IC1mb250c2l6ZV9oICogaXRlbS5tX09yaWdpbi54IC8gMTAwMDsKKyAgICAgICAgZmxvYXQgZm9udHNpemVfaCA9IHBUZXh0T2JqLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZUgoKTsKKyAgICAgICAgZmxvYXQga2VybmluZyA9IC1mb250c2l6ZV9oICogaXRlbS5tX09yaWdpbi54IC8gMTAwMDsKICAgICAgICAgYmFzZVNwYWNlID0gc3RkOjptaW4oYmFzZVNwYWNlLCBrZXJuaW5nICsgc3BhY2luZyk7CiAgICAgICAgIGJBbGxDaGFyID0gZmFsc2U7CiAgICAgICB9CkBAIC02Niw5ICs2Niw5IEBACiAgIHJldHVybiBiYXNlU3BhY2U7CiB9CiAKLUZYX1NUUlNJWkUgVW5pY29kZV9HZXROb3JtYWxpemF0aW9uKEZYX1dDSEFSIHdjaCwgRlhfV0NIQVIqIHBEc3QpIHsKK3NpemVfdCBVbmljb2RlX0dldE5vcm1hbGl6YXRpb24od2NoYXJfdCB3Y2gsIHdjaGFyX3QqIHBEc3QpIHsKICAgd2NoID0gd2NoICYgMHhGRkZGOwotICBGWF9XQ0hBUiB3RmluZCA9IGdfVW5pY29kZURhdGFfTm9ybWFsaXphdGlvblt3Y2hdOworICB3Y2hhcl90IHdGaW5kID0gZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uW3djaF07CiAgIGlmICghd0ZpbmQpIHsKICAgICBpZiAocERzdCkKICAgICAgICpwRHN0ID0gd2NoOwpAQCAtODQsMTYgKzg0LDE2IEBACiAgIGNvbnN0IHVpbnQxNl90KiBwTWFwID0gZ19Vbmljb2RlRGF0YV9Ob3JtYWxpemF0aW9uX01hcHNbd0ZpbmRdOwogICBpZiAocE1hcCA9PSBnX1VuaWNvZGVEYXRhX05vcm1hbGl6YXRpb25fTWFwNCkgewogICAgIHBNYXAgPSBnX1VuaWNvZGVEYXRhX05vcm1hbGl6YXRpb25fTWFwNCArIHdjaDsKLSAgICB3RmluZCA9IChGWF9XQ0hBUikoKnBNYXArKyk7CisgICAgd0ZpbmQgPSAod2NoYXJfdCkoKnBNYXArKyk7CiAgIH0gZWxzZSB7CiAgICAgcE1hcCArPSB3Y2g7CiAgIH0KICAgaWYgKHBEc3QpIHsKLSAgICBGWF9XQ0hBUiBuID0gd0ZpbmQ7CisgICAgd2NoYXJfdCBuID0gd0ZpbmQ7CiAgICAgd2hpbGUgKG4tLSkKICAgICAgICpwRHN0KysgPSAqcE1hcCsrOwogICB9Ci0gIHJldHVybiAoRlhfU1RSU0laRSl3RmluZDsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4od0ZpbmQpOwogfQogCiBmbG9hdCBNYXNrUGVyY2VudEZpbGxlZChjb25zdCBzdGQ6OnZlY3Rvcjxib29sPiYgbWFzaywKQEAgLTEwNiw4ICsxMDYsMTggQEAKICAgcmV0dXJuIGNvdW50IC8gKGVuZCAtIHN0YXJ0KTsKIH0KIAorYm9vbCBJc0h5cGhlbkNvZGUod2NoYXJfdCBjKSB7CisgIHJldHVybiBjID09IDB4MkQgfHwgYyA9PSAweEFEOworfQorCiB9ICAvLyBuYW1lc3BhY2UKIAorUERGVEVYVF9PYmo6OlBERlRFWFRfT2JqKCkge30KKworUERGVEVYVF9PYmo6OlBERlRFWFRfT2JqKGNvbnN0IFBERlRFWFRfT2JqJiB0aGF0KSA9IGRlZmF1bHQ7CisKK1BERlRFWFRfT2JqOjp+UERGVEVYVF9PYmooKSB7fQorCiBGUERGX0NIQVJfSU5GTzo6RlBERl9DSEFSX0lORk8oKQogICAgIDogbV9Vbmljb2RlKDApLAogICAgICAgbV9DaGFyY29kZSgwKSwKQEAgLTI0OCwyMCArMjU4LDE3IEBACiAgICAgICBjb250aW51ZTsKICAgICB9CiAgICAgaWYgKCFwQ3VyT2JqKQotICAgICAgcEN1ck9iaiA9IGluZm9fY3VyY2hhci5tX3BUZXh0T2JqOworICAgICAgcEN1ck9iaiA9IGluZm9fY3VyY2hhci5tX3BUZXh0T2JqLkdldCgpOwogICAgIGlmIChwQ3VyT2JqICE9IGluZm9fY3VyY2hhci5tX3BUZXh0T2JqKSB7CiAgICAgICByZWN0QXJyYXkucHVzaF9iYWNrKHJlY3QpOwotICAgICAgcEN1ck9iaiA9IGluZm9fY3VyY2hhci5tX3BUZXh0T2JqOworICAgICAgcEN1ck9iaiA9IGluZm9fY3VyY2hhci5tX3BUZXh0T2JqLkdldCgpOwogICAgICAgYkZsYWdOZXdSZWN0ID0gdHJ1ZTsKICAgICB9CiAgICAgaWYgKGJGbGFnTmV3UmVjdCkgewogICAgICAgQ0ZYX01hdHJpeCBtYXRyaXggPSBpbmZvX2N1cmNoYXIubV9wVGV4dE9iai0+R2V0VGV4dE1hdHJpeCgpOwogICAgICAgbWF0cml4LkNvbmNhdChpbmZvX2N1cmNoYXIubV9NYXRyaXgpOwogCi0gICAgICBDRlhfTWF0cml4IG1hdHJpeF9yZXZlcnNlOwotICAgICAgbWF0cml4X3JldmVyc2UuU2V0UmV2ZXJzZShtYXRyaXgpOwotCi0gICAgICBDRlhfUG9pbnRGIG9yaWdpbiA9IG1hdHJpeF9yZXZlcnNlLlRyYW5zZm9ybShpbmZvX2N1cmNoYXIubV9PcmlnaW4pOworICAgICAgQ0ZYX1BvaW50RiBvcmlnaW4gPSBtYXRyaXguR2V0SW52ZXJzZSgpLlRyYW5zZm9ybShpbmZvX2N1cmNoYXIubV9PcmlnaW4pOwogICAgICAgcmVjdC5sZWZ0ID0gaW5mb19jdXJjaGFyLm1fQ2hhckJveC5sZWZ0OwogICAgICAgcmVjdC5yaWdodCA9IGluZm9fY3VyY2hhci5tX0NoYXJCb3gucmlnaHQ7CiAgICAgICBpZiAocEN1ck9iai0+R2V0Rm9udCgpLT5HZXRUeXBlRGVzY2VudCgpKSB7CkBAIC0yNzcsNyArMjg0LDcgQEAKICAgICAgICAgcmVjdC50b3AgPQogICAgICAgICAgICAgb3JpZ2luLnkgKwogICAgICAgICAgICAgcEN1ck9iai0+R2V0Rm9udCgpLT5HZXRUeXBlQXNjZW50KCkgKiBwQ3VyT2JqLT5HZXRGb250U2l6ZSgpIC8gMTAwMDsKLSAgICAgICAgRlhfRkxPQVQgeFBvc1RlbXAgPQorICAgICAgICBmbG9hdCB4UG9zVGVtcCA9CiAgICAgICAgICAgICBvcmlnaW4ueCArCiAgICAgICAgICAgICBHZXRDaGFyV2lkdGgoaW5mb19jdXJjaGFyLm1fQ2hhckNvZGUsIHBDdXJPYmotPkdldEZvbnQoKSkgKgogICAgICAgICAgICAgICAgIHBDdXJPYmotPkdldEZvbnRTaXplKCkgLyAxMDAwOwpAQCAtMzIzLDE0ICszMzAsMTIgQEAKICAgICAgIGNoYXJSZWN0RXh0LmJvdHRvbSA9IGNoYXJyZWN0LmJvdHRvbSAtIHRvbGVyYW5jZS5oZWlnaHQgLyAyOwogICAgICAgaWYgKGNoYXJSZWN0RXh0LkNvbnRhaW5zKHBvaW50KSkgewogICAgICAgICBkb3VibGUgY3VyWGRpZiwgY3VyWWRpZjsKLSAgICAgICAgY3VyWGRpZiA9IEZYU1lTX2ZhYnMocG9pbnQueCAtIGNoYXJyZWN0LmxlZnQpIDwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfZmFicyhwb2ludC54IC0gY2hhcnJlY3QucmlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgPyBGWFNZU19mYWJzKHBvaW50LnggLSBjaGFycmVjdC5sZWZ0KQotICAgICAgICAgICAgICAgICAgICAgIDogRlhTWVNfZmFicyhwb2ludC54IC0gY2hhcnJlY3QucmlnaHQpOwotICAgICAgICBjdXJZZGlmID0gRlhTWVNfZmFicyhwb2ludC55IC0gY2hhcnJlY3QuYm90dG9tKSA8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2ZhYnMocG9pbnQueSAtIGNoYXJyZWN0LnRvcCkKLSAgICAgICAgICAgICAgICAgICAgICA/IEZYU1lTX2ZhYnMocG9pbnQueSAtIGNoYXJyZWN0LmJvdHRvbSkKLSAgICAgICAgICAgICAgICAgICAgICA6IEZYU1lTX2ZhYnMocG9pbnQueSAtIGNoYXJyZWN0LnRvcCk7CisgICAgICAgIGN1clhkaWYgPSBmYWJzKHBvaW50LnggLSBjaGFycmVjdC5sZWZ0KSA8IGZhYnMocG9pbnQueCAtIGNoYXJyZWN0LnJpZ2h0KQorICAgICAgICAgICAgICAgICAgICAgID8gZmFicyhwb2ludC54IC0gY2hhcnJlY3QubGVmdCkKKyAgICAgICAgICAgICAgICAgICAgICA6IGZhYnMocG9pbnQueCAtIGNoYXJyZWN0LnJpZ2h0KTsKKyAgICAgICAgY3VyWWRpZiA9IGZhYnMocG9pbnQueSAtIGNoYXJyZWN0LmJvdHRvbSkgPCBmYWJzKHBvaW50LnkgLSBjaGFycmVjdC50b3ApCisgICAgICAgICAgICAgICAgICAgICAgPyBmYWJzKHBvaW50LnkgLSBjaGFycmVjdC5ib3R0b20pCisgICAgICAgICAgICAgICAgICAgICAgOiBmYWJzKHBvaW50LnkgLSBjaGFycmVjdC50b3ApOwogICAgICAgICBpZiAoY3VyWWRpZiArIGN1clhkaWYgPCB4ZGlmICsgeWRpZikgewogICAgICAgICAgIHlkaWYgPSBjdXJZZGlmOwogICAgICAgICAgIHhkaWYgPSBjdXJYZGlmOwpAQCAtMzQzLDE3ICszNDgsMTcgQEAKICAgcmV0dXJuIHBvcyA8IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50PihtX0NoYXJMaXN0KSA/IHBvcyA6IE5lYXJQb3M7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQREZfVGV4dFBhZ2U6OkdldFRleHRCeVJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3QgeworV2lkZVN0cmluZyBDUERGX1RleHRQYWdlOjpHZXRUZXh0QnlSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0IHsKICAgaWYgKCFtX2JJc1BhcnNlZCkKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgICByZXR1cm4gV2lkZVN0cmluZygpOwogCi0gIEZYX0ZMT0FUIHBvc3kgPSAwOworICBmbG9hdCBwb3N5ID0gMDsKICAgYm9vbCBJc0NvbnRhaW5QcmVDaGFyID0gZmFsc2U7CiAgIGJvb2wgSXNBZGRMaW5lRmVlZCA9IGZhbHNlOwotICBDRlhfV2lkZVN0cmluZyBzdHJUZXh0OworICBXaWRlU3RyaW5nIHN0clRleHQ7CiAgIGZvciAoY29uc3QgYXV0byYgY2hhcmluZm8gOiBtX0NoYXJMaXN0KSB7CiAgICAgaWYgKElzUmVjdEludGVyc2VjdChyZWN0LCBjaGFyaW5mby5tX0NoYXJCb3gpKSB7Ci0gICAgICBpZiAoRlhTWVNfZmFicyhwb3N5IC0gY2hhcmluZm8ubV9PcmlnaW4ueSkgPiAwICYmICFJc0NvbnRhaW5QcmVDaGFyICYmCisgICAgICBpZiAoZmFicyhwb3N5IC0gY2hhcmluZm8ubV9PcmlnaW4ueSkgPiAwICYmICFJc0NvbnRhaW5QcmVDaGFyICYmCiAgICAgICAgICAgSXNBZGRMaW5lRmVlZCkgewogICAgICAgICBwb3N5ID0gY2hhcmluZm8ubV9PcmlnaW4ueTsKICAgICAgICAgaWYgKCFzdHJUZXh0LklzRW1wdHkoKSkKQEAgLTM3OCwxMCArMzgzLDcgQEAKIH0KIAogdm9pZCBDUERGX1RleHRQYWdlOjpHZXRDaGFySW5mbyhpbnQgaW5kZXgsIEZQREZfQ0hBUl9JTkZPKiBpbmZvKSBjb25zdCB7Ci0gIGlmICghbV9iSXNQYXJzZWQpCi0gICAgcmV0dXJuOwotCi0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQ+KG1fQ2hhckxpc3QpKQorICBpZiAoIW1fYklzUGFyc2VkIHx8ICFwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9DaGFyTGlzdCwgaW5kZXgpKQogICAgIHJldHVybjsKIAogICBjb25zdCBQQUdFQ0hBUl9JTkZPJiBjaGFyaW5mbyA9IG1fQ2hhckxpc3RbaW5kZXhdOwpAQCAtNDM0LDQ5ICs0MzYsMjcgQEAKICAgfQogfQogCi1DRlhfV2lkZVN0cmluZyBDUERGX1RleHRQYWdlOjpHZXRQYWdlVGV4dChpbnQgc3RhcnQsIGludCBuQ291bnQpIGNvbnN0IHsKLSAgaWYgKCFtX2JJc1BhcnNlZCB8fCBuQ291bnQgPT0gMCkKK1dpZGVTdHJpbmcgQ1BERl9UZXh0UGFnZTo6R2V0UGFnZVRleHQoaW50IHN0YXJ0LCBpbnQgY291bnQpIGNvbnN0IHsKKyAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSBDb3VudENoYXJzKCkgfHwgY291bnQgPD0gMCB8fCAhbV9iSXNQYXJzZWQgfHwKKyAgICAgIG1fQ2hhckxpc3QuZW1wdHkoKSB8fCBtX1RleHRCdWYuR2V0TGVuZ3RoKCkgPT0gMCkgeworICAgIHJldHVybiBMIiI7CisgIH0KKworICBpbnQgdGV4dF9zdGFydCA9IFRleHRJbmRleEZyb21DaGFySW5kZXgoc3RhcnQpOworICBpZiAodGV4dF9zdGFydCA8IDApCiAgICAgcmV0dXJuIEwiIjsKIAotICBpZiAoc3RhcnQgPCAwKQotICAgIHN0YXJ0ID0gMDsKKyAgY291bnQgPSBzdGQ6Om1pbihjb3VudCwgQ291bnRDaGFycygpIC0gc3RhcnQpOwogCi0gIGlmIChuQ291bnQgPT0gLTEpIHsKLSAgICBuQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludD4obV9DaGFyTGlzdCkgLSBzdGFydDsKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoCi0gICAgICAgIG1fVGV4dEJ1Zi5Bc1N0cmluZ0MoKS5NaWQoc3RhcnQsIG1fVGV4dEJ1Zi5Bc1N0cmluZ0MoKS5HZXRMZW5ndGgoKSkpOwotICB9Ci0gIGlmIChuQ291bnQgPD0gMCB8fCBtX0NoYXJMaXN0LmVtcHR5KCkpCisgIGludCBsYXN0ID0gc3RhcnQgKyBjb3VudCAtIDE7CisgIGludCB0ZXh0X2xhc3QgPSBUZXh0SW5kZXhGcm9tQ2hhckluZGV4KGxhc3QpOworICBpZiAodGV4dF9sYXN0IDwgMCB8fCB0ZXh0X2xhc3QgPCB0ZXh0X3N0YXJ0KQogICAgIHJldHVybiBMIiI7Ci0gIGlmIChuQ291bnQgKyBzdGFydCA+IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50PihtX0NoYXJMaXN0KSAtIDEpCi0gICAgbkNvdW50ID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQ+KG1fQ2hhckxpc3QpIC0gc3RhcnQ7Ci0gIGlmIChuQ291bnQgPD0gMCkKLSAgICByZXR1cm4gTCIiOwotICBDaGVja01hcmtlZENvbnRlbnRPYmplY3Qoc3RhcnQsIG5Db3VudCk7Ci0gIGludCBzdGFydGluZGV4ID0gMDsKLSAgUEFHRUNIQVJfSU5GTyBjaGFyaW5mbyA9IG1fQ2hhckxpc3Rbc3RhcnRdOwotICBpbnQgc3RhcnRPZmZzZXQgPSAwOwotICB3aGlsZSAoY2hhcmluZm8ubV9JbmRleCA9PSAtMSkgewotICAgIHN0YXJ0T2Zmc2V0Kys7Ci0gICAgaWYgKHN0YXJ0T2Zmc2V0ID4gbkNvdW50IHx8Ci0gICAgICAgIHN0YXJ0ICsgc3RhcnRPZmZzZXQgPj0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQ+KG1fQ2hhckxpc3QpKSB7Ci0gICAgICByZXR1cm4gTCIiOwotICAgIH0KLSAgICBjaGFyaW5mbyA9IG1fQ2hhckxpc3Rbc3RhcnQgKyBzdGFydE9mZnNldF07Ci0gIH0KLSAgc3RhcnRpbmRleCA9IGNoYXJpbmZvLm1fSW5kZXg7Ci0gIGNoYXJpbmZvID0gbV9DaGFyTGlzdFtzdGFydCArIG5Db3VudCAtIDFdOwotICBpbnQgbkNvdW50T2Zmc2V0ID0gMDsKLSAgd2hpbGUgKGNoYXJpbmZvLm1fSW5kZXggPT0gLTEpIHsKLSAgICBuQ291bnRPZmZzZXQrKzsKLSAgICBpZiAobkNvdW50T2Zmc2V0ID49IG5Db3VudCkKLSAgICAgIHJldHVybiBMIiI7Ci0gICAgY2hhcmluZm8gPSBtX0NoYXJMaXN0W3N0YXJ0ICsgbkNvdW50IC0gbkNvdW50T2Zmc2V0IC0gMV07Ci0gIH0KLSAgbkNvdW50ID0gc3RhcnQgKyBuQ291bnQgLSBuQ291bnRPZmZzZXQgLSBzdGFydGluZGV4OwotICBpZiAobkNvdW50IDw9IDApCi0gICAgcmV0dXJuIEwiIjsKLSAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKG1fVGV4dEJ1Zi5Bc1N0cmluZ0MoKS5NaWQoc3RhcnRpbmRleCwgbkNvdW50KSk7CisKKyAgaW50IHRleHRfY291bnQgPSB0ZXh0X2xhc3QgLSB0ZXh0X3N0YXJ0ICsgMTsKKworICByZXR1cm4gV2lkZVN0cmluZyhtX1RleHRCdWYuQXNTdHJpbmdWaWV3KCkuTWlkKAorICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90Pih0ZXh0X3N0YXJ0KSwgc3RhdGljX2Nhc3Q8c2l6ZV90Pih0ZXh0X2NvdW50KSkpOwogfQogCiBpbnQgQ1BERl9UZXh0UGFnZTo6Q291bnRSZWN0cyhpbnQgc3RhcnQsIGludCBuQ291bnQpIHsKQEAgLTQ5MSwyMSArNDcxLDEyIEBACiAgIHJldHVybiBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludD4obV9TZWxSZWN0cyk7CiB9CiAKLXZvaWQgQ1BERl9UZXh0UGFnZTo6R2V0UmVjdChpbnQgcmVjdEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBib3R0b20pIGNvbnN0IHsKLSAgaWYgKCFtX2JJc1BhcnNlZCkKLSAgICByZXR1cm47Citib29sIENQREZfVGV4dFBhZ2U6OkdldFJlY3QoaW50IHJlY3RJbmRleCwgQ0ZYX0Zsb2F0UmVjdCogcFJlY3QpIGNvbnN0IHsKKyAgaWYgKCFtX2JJc1BhcnNlZCB8fCAhcGRmaXVtOjpJbmRleEluQm91bmRzKG1fU2VsUmVjdHMsIHJlY3RJbmRleCkpCisgICAgcmV0dXJuIGZhbHNlOwogCi0gIGlmIChyZWN0SW5kZXggPCAwIHx8IHJlY3RJbmRleCA+PSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludD4obV9TZWxSZWN0cykpCi0gICAgcmV0dXJuOwotCi0gIGxlZnQgPSBtX1NlbFJlY3RzW3JlY3RJbmRleF0ubGVmdDsKLSAgdG9wID0gbV9TZWxSZWN0c1tyZWN0SW5kZXhdLnRvcDsKLSAgcmlnaHQgPSBtX1NlbFJlY3RzW3JlY3RJbmRleF0ucmlnaHQ7Ci0gIGJvdHRvbSA9IG1fU2VsUmVjdHNbcmVjdEluZGV4XS5ib3R0b207CisgICpwUmVjdCA9IG1fU2VsUmVjdHNbcmVjdEluZGV4XTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKIENQREZfVGV4dFBhZ2U6OlRleHRPcmllbnRhdGlvbiBDUERGX1RleHRQYWdlOjpGaW5kVGV4dGxpbmVGbG93T3JpZW50YXRpb24oKQpAQCAtNTIwLDcgKzQ5MSw3IEBACiAKICAgc3RkOjp2ZWN0b3I8Ym9vbD4gbkhvcml6b250YWxNYXNrKG5QYWdlV2lkdGgpOwogICBzdGQ6OnZlY3Rvcjxib29sPiBuVmVydGljYWxNYXNrKG5QYWdlSGVpZ2h0KTsKLSAgRlhfRkxPQVQgZkxpbmVIZWlnaHQgPSAwLjBmOworICBmbG9hdCBmTGluZUhlaWdodCA9IDAuMGY7CiAgIGludDMyX3QgblN0YXJ0SCA9IG5QYWdlV2lkdGg7CiAgIGludDMyX3QgbkVuZEggPSAwOwogICBpbnQzMl90IG5TdGFydFYgPSBuUGFnZUhlaWdodDsKQEAgLTU1NiwxMSArNTI3LDExIEBACiAgIGlmICgobkVuZEggLSBuU3RhcnRIKSA8IG5Eb3VibGVMaW5lSGVpZ2h0KQogICAgIHJldHVybiBUZXh0T3JpZW50YXRpb246OlZlcnRpY2FsOwogCi0gIGNvbnN0IEZYX0ZMT0FUIG5TdW1IID0gTWFza1BlcmNlbnRGaWxsZWQobkhvcml6b250YWxNYXNrLCBuU3RhcnRILCBuRW5kSCk7CisgIGNvbnN0IGZsb2F0IG5TdW1IID0gTWFza1BlcmNlbnRGaWxsZWQobkhvcml6b250YWxNYXNrLCBuU3RhcnRILCBuRW5kSCk7CiAgIGlmIChuU3VtSCA+IDAuOGYpCiAgICAgcmV0dXJuIFRleHRPcmllbnRhdGlvbjo6SG9yaXpvbnRhbDsKIAotICBjb25zdCBGWF9GTE9BVCBuU3VtViA9IE1hc2tQZXJjZW50RmlsbGVkKG5WZXJ0aWNhbE1hc2ssIG5TdGFydFYsIG5FbmRWKTsKKyAgY29uc3QgZmxvYXQgblN1bVYgPSBNYXNrUGVyY2VudEZpbGxlZChuVmVydGljYWxNYXNrLCBuU3RhcnRWLCBuRW5kVik7CiAgIGlmIChuU3VtSCA+IG5TdW1WKQogICAgIHJldHVybiBUZXh0T3JpZW50YXRpb246Okhvcml6b250YWw7CiAgIGlmIChuU3VtSCA8IG5TdW1WKQpAQCAtNTY4LDcgKzUzOSw3IEBACiAgIHJldHVybiBUZXh0T3JpZW50YXRpb246OlVua25vd247CiB9CiAKLXZvaWQgQ1BERl9UZXh0UGFnZTo6QXBwZW5kR2VuZXJhdGVkQ2hhcmFjdGVyKEZYX1dDSEFSIHVuaWNvZGUsCit2b2lkIENQREZfVGV4dFBhZ2U6OkFwcGVuZEdlbmVyYXRlZENoYXJhY3Rlcih3Y2hhcl90IHVuaWNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBmb3JtTWF0cml4KSB7CiAgIFBBR0VDSEFSX0lORk8gZ2VuZXJhdGVDaGFyOwogICBpZiAoIUdlbmVyYXRlQ2hhckluZm8odW5pY29kZSwgZ2VuZXJhdGVDaGFyKSkKQEAgLTU5Miw3ICs1NjMsNyBAQAogICAgICAgICBDRlhfTWF0cml4IG1hdHJpeDsKICAgICAgICAgUHJvY2Vzc1RleHRPYmplY3QocE9iai0+QXNUZXh0KCksIG1hdHJpeCwgcE9iakxpc3QsIGl0KTsKICAgICAgIH0gZWxzZSBpZiAocE9iai0+SXNGb3JtKCkpIHsKLSAgICAgICAgQ0ZYX01hdHJpeCBmb3JtTWF0cml4KDEsIDAsIDAsIDEsIDAsIDApOworICAgICAgICBDRlhfTWF0cml4IGZvcm1NYXRyaXg7CiAgICAgICAgIFByb2Nlc3NGb3JtT2JqZWN0KHBPYmotPkFzRm9ybSgpLCBmb3JtTWF0cml4KTsKICAgICAgIH0KICAgICB9CkBAIC02MDYsMTIgKzU3NywxMiBAQAogCiB2b2lkIENQREZfVGV4dFBhZ2U6OlByb2Nlc3NGb3JtT2JqZWN0KENQREZfRm9ybU9iamVjdCogcEZvcm1PYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIGZvcm1NYXRyaXgpIHsKLSAgQ1BERl9QYWdlT2JqZWN0TGlzdCogcE9iamVjdExpc3QgPSBwRm9ybU9iai0+bV9wRm9ybS0+R2V0UGFnZU9iamVjdExpc3QoKTsKKyAgY29uc3QgQ1BERl9QYWdlT2JqZWN0TGlzdCogcE9iamVjdExpc3QgPQorICAgICAgcEZvcm1PYmotPmZvcm0oKS0+R2V0UGFnZU9iamVjdExpc3QoKTsKICAgaWYgKHBPYmplY3RMaXN0LT5lbXB0eSgpKQogICAgIHJldHVybjsKIAotICBDRlhfTWF0cml4IGN1ckZvcm1NYXRyaXg7Ci0gIGN1ckZvcm1NYXRyaXggPSBwRm9ybU9iai0+bV9Gb3JtTWF0cml4OworICBDRlhfTWF0cml4IGN1ckZvcm1NYXRyaXggPSBwRm9ybU9iai0+Zm9ybV9tYXRyaXgoKTsKICAgY3VyRm9ybU1hdHJpeC5Db25jYXQoZm9ybU1hdHJpeCk7CiAKICAgZm9yIChhdXRvIGl0ID0gcE9iamVjdExpc3QtPmJlZ2luKCk7IGl0ICE9IHBPYmplY3RMaXN0LT5lbmQoKTsgKytpdCkgewpAQCAtNjMxLDE1ICs2MDIsMTUgQEAKICAgaWYgKGludCB3ID0gcEZvbnQtPkdldENoYXJXaWR0aEYoY2hhckNvZGUpKQogICAgIHJldHVybiB3OwogCi0gIENGWF9CeXRlU3RyaW5nIHN0cjsKLSAgcEZvbnQtPkFwcGVuZENoYXIoc3RyLCBjaGFyQ29kZSk7CisgIEJ5dGVTdHJpbmcgc3RyOworICBwRm9udC0+QXBwZW5kQ2hhcigmc3RyLCBjaGFyQ29kZSk7CiAgIGlmIChpbnQgdyA9IHBGb250LT5HZXRTdHJpbmdXaWR0aChzdHIuY19zdHIoKSwgMSkpCiAgICAgcmV0dXJuIHc7CiAKICAgcmV0dXJuIHBGb250LT5HZXRDaGFyQkJveChjaGFyQ29kZSkuV2lkdGgoKTsKIH0KIAotdm9pZCBDUERGX1RleHRQYWdlOjpBZGRDaGFySW5mb0J5TFJEaXJlY3Rpb24oRlhfV0NIQVIgd0NoYXIsCit2b2lkIENQREZfVGV4dFBhZ2U6OkFkZENoYXJJbmZvQnlMUkRpcmVjdGlvbih3Y2hhcl90IHdDaGFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFHRUNIQVJfSU5GTyBpbmZvKSB7CiAgIGlmIChJc0NvbnRyb2xDaGFyKGluZm8pKSB7CiAgICAgaW5mby5tX0luZGV4ID0gLTE7CkBAIC02NDksMTIgKzYyMCwxMiBAQAogCiAgIGluZm8ubV9JbmRleCA9IG1fVGV4dEJ1Zi5HZXRMZW5ndGgoKTsKICAgaWYgKHdDaGFyID49IDB4RkIwMCAmJiB3Q2hhciA8PSAweEZCMDYpIHsKLSAgICBGWF9XQ0hBUiogcERzdCA9IG51bGxwdHI7Ci0gICAgRlhfU1RSU0laRSBuQ291bnQgPSBVbmljb2RlX0dldE5vcm1hbGl6YXRpb24od0NoYXIsIHBEc3QpOworICAgIHdjaGFyX3QqIHBEc3QgPSBudWxscHRyOworICAgIHNpemVfdCBuQ291bnQgPSBVbmljb2RlX0dldE5vcm1hbGl6YXRpb24od0NoYXIsIHBEc3QpOwogICAgIGlmIChuQ291bnQgPj0gMSkgewotICAgICAgcERzdCA9IEZYX0FsbG9jKEZYX1dDSEFSLCBuQ291bnQpOworICAgICAgcERzdCA9IEZYX0FsbG9jKHdjaGFyX3QsIG5Db3VudCk7CiAgICAgICBVbmljb2RlX0dldE5vcm1hbGl6YXRpb24od0NoYXIsIHBEc3QpOwotICAgICAgZm9yIChpbnQgbkluZGV4ID0gMDsgbkluZGV4IDwgbkNvdW50OyBuSW5kZXgrKykgeworICAgICAgZm9yIChzaXplX3QgbkluZGV4ID0gMDsgbkluZGV4IDwgbkNvdW50OyBuSW5kZXgrKykgewogICAgICAgICBQQUdFQ0hBUl9JTkZPIGluZm8yID0gaW5mbzsKICAgICAgICAgaW5mbzIubV9Vbmljb2RlID0gcERzdFtuSW5kZXhdOwogICAgICAgICBpbmZvMi5tX0ZsYWcgPSBGUERGVEVYVF9DSEFSX1BJRUNFOwpAQCAtNjY5LDcgKzY0MCw3IEBACiAgIG1fQ2hhckxpc3QucHVzaF9iYWNrKGluZm8pOwogfQogCi12b2lkIENQREZfVGV4dFBhZ2U6OkFkZENoYXJJbmZvQnlSTERpcmVjdGlvbihGWF9XQ0hBUiB3Q2hhciwKK3ZvaWQgQ1BERl9UZXh0UGFnZTo6QWRkQ2hhckluZm9CeVJMRGlyZWN0aW9uKHdjaGFyX3Qgd0NoYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFQ0hBUl9JTkZPIGluZm8pIHsKICAgaWYgKElzQ29udHJvbENoYXIoaW5mbykpIHsKICAgICBpbmZvLm1fSW5kZXggPSAtMTsKQEAgLTY3OCwxMyArNjQ5LDEzIEBACiAgIH0KIAogICBpbmZvLm1fSW5kZXggPSBtX1RleHRCdWYuR2V0TGVuZ3RoKCk7Ci0gIHdDaGFyID0gRlhfR2V0TWlycm9yQ2hhcih3Q2hhciwgdHJ1ZSwgZmFsc2UpOwotICBGWF9XQ0hBUiogcERzdCA9IG51bGxwdHI7Ci0gIEZYX1NUUlNJWkUgbkNvdW50ID0gVW5pY29kZV9HZXROb3JtYWxpemF0aW9uKHdDaGFyLCBwRHN0KTsKKyAgd0NoYXIgPSBGWF9HZXRNaXJyb3JDaGFyKHdDaGFyKTsKKyAgd2NoYXJfdCogcERzdCA9IG51bGxwdHI7CisgIHNpemVfdCBuQ291bnQgPSBVbmljb2RlX0dldE5vcm1hbGl6YXRpb24od0NoYXIsIHBEc3QpOwogICBpZiAobkNvdW50ID49IDEpIHsKLSAgICBwRHN0ID0gRlhfQWxsb2MoRlhfV0NIQVIsIG5Db3VudCk7CisgICAgcERzdCA9IEZYX0FsbG9jKHdjaGFyX3QsIG5Db3VudCk7CiAgICAgVW5pY29kZV9HZXROb3JtYWxpemF0aW9uKHdDaGFyLCBwRHN0KTsKLSAgICBmb3IgKGludCBuSW5kZXggPSAwOyBuSW5kZXggPCBuQ291bnQ7IG5JbmRleCsrKSB7CisgICAgZm9yIChzaXplX3QgbkluZGV4ID0gMDsgbkluZGV4IDwgbkNvdW50OyBuSW5kZXgrKykgewogICAgICAgUEFHRUNIQVJfSU5GTyBpbmZvMiA9IGluZm87CiAgICAgICBpbmZvMi5tX1VuaWNvZGUgPSBwRHN0W25JbmRleF07CiAgICAgICBpbmZvMi5tX0ZsYWcgPSBGUERGVEVYVF9DSEFSX1BJRUNFOwpAQCAtNzAzLDEwICs2NzQsMTAgQEAKICAgaWYgKG1fVGVtcENoYXJMaXN0LmVtcHR5KCkpCiAgICAgcmV0dXJuOwogCi0gIENGWF9XaWRlU3RyaW5nIHN0ciA9IG1fVGVtcFRleHRCdWYuTWFrZVN0cmluZygpOworICBXaWRlU3RyaW5nIHN0ciA9IG1fVGVtcFRleHRCdWYuTWFrZVN0cmluZygpOwogICBib29sIGJQcmV2U3BhY2UgPSBmYWxzZTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIuR2V0TGVuZ3RoKCk7IGkrKykgewotICAgIGlmIChzdHIuR2V0QXQoaSkgIT0gJyAnKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyLkdldExlbmd0aCgpOyBpKyspIHsKKyAgICBpZiAoc3RyW2ldICE9ICcgJykgewogICAgICAgYlByZXZTcGFjZSA9IGZhbHNlOwogICAgICAgY29udGludWU7CiAgICAgfQpAQCAtNzQ0LDcgKzcxNSw3IEBACiAgICAgY29uc3QgQ0ZYX01hdHJpeCYgZm9ybU1hdHJpeCwKICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3RMaXN0KiBwT2JqTGlzdCwKICAgICBDUERGX1BhZ2VPYmplY3RMaXN0Ojpjb25zdF9pdGVyYXRvciBPYmpQb3MpIHsKLSAgaWYgKEZYU1lTX2ZhYnMocFRleHRPYmotPm1fUmlnaHQgLSBwVGV4dE9iai0+bV9MZWZ0KSA8IDAuMDFmKQorICBpZiAoZmFicyhwVGV4dE9iai0+bV9SaWdodCAtIHBUZXh0T2JqLT5tX0xlZnQpIDwgMC4wMWYpCiAgICAgcmV0dXJuOwogCiAgIHNpemVfdCBjb3VudCA9IG1fTGluZU9iai5zaXplKCk7CkBAIC03NTksMzQgKzczMCwzNiBAQAogICAgIHJldHVybjsKIAogICBQREZURVhUX09iaiBwcmV2X09iaiA9IG1fTGluZU9ialtjb3VudCAtIDFdOworICBzaXplX3Qgbkl0ZW0gPSBwcmV2X09iai5tX3BUZXh0T2JqLT5Db3VudEl0ZW1zKCk7CisgIGlmIChuSXRlbSA9PSAwKQorICAgIHJldHVybjsKKwogICBDUERGX1RleHRPYmplY3RJdGVtIGl0ZW07Ci0gIGludCBuSXRlbSA9IHByZXZfT2JqLm1fcFRleHRPYmotPkNvdW50SXRlbXMoKTsKICAgcHJldl9PYmoubV9wVGV4dE9iai0+R2V0SXRlbUluZm8obkl0ZW0gLSAxLCAmaXRlbSk7Ci0gIEZYX0ZMT0FUIHByZXZfd2lkdGggPQorICBmbG9hdCBwcmV2X3dpZHRoID0KICAgICAgIEdldENoYXJXaWR0aChpdGVtLm1fQ2hhckNvZGUsIHByZXZfT2JqLm1fcFRleHRPYmotPkdldEZvbnQoKSkgKgogICAgICAgcHJldl9PYmoubV9wVGV4dE9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDA7CiAKICAgQ0ZYX01hdHJpeCBwcmV2X21hdHJpeCA9IHByZXZfT2JqLm1fcFRleHRPYmotPkdldFRleHRNYXRyaXgoKTsKLSAgcHJldl93aWR0aCA9IEZYU1lTX2ZhYnMocHJldl93aWR0aCk7CisgIHByZXZfd2lkdGggPSBmYWJzKHByZXZfd2lkdGgpOwogICBwcmV2X21hdHJpeC5Db25jYXQocHJldl9PYmoubV9mb3JtTWF0cml4KTsKICAgcHJldl93aWR0aCA9IHByZXZfbWF0cml4LlRyYW5zZm9ybURpc3RhbmNlKHByZXZfd2lkdGgpOwogICBwVGV4dE9iai0+R2V0SXRlbUluZm8oMCwgJml0ZW0pOwotICBGWF9GTE9BVCB0aGlzX3dpZHRoID0gR2V0Q2hhcldpZHRoKGl0ZW0ubV9DaGFyQ29kZSwgcFRleHRPYmotPkdldEZvbnQoKSkgKgotICAgICAgICAgICAgICAgICAgICAgICAgcFRleHRPYmotPkdldEZvbnRTaXplKCkgLyAxMDAwOwotICB0aGlzX3dpZHRoID0gRlhTWVNfZmFicyh0aGlzX3dpZHRoKTsKKyAgZmxvYXQgdGhpc193aWR0aCA9IEdldENoYXJXaWR0aChpdGVtLm1fQ2hhckNvZGUsIHBUZXh0T2JqLT5HZXRGb250KCkpICoKKyAgICAgICAgICAgICAgICAgICAgIHBUZXh0T2JqLT5HZXRGb250U2l6ZSgpIC8gMTAwMDsKKyAgdGhpc193aWR0aCA9IGZhYnModGhpc193aWR0aCk7CiAKICAgQ0ZYX01hdHJpeCB0aGlzX21hdHJpeCA9IHBUZXh0T2JqLT5HZXRUZXh0TWF0cml4KCk7Ci0gIHRoaXNfd2lkdGggPSBGWFNZU19mYWJzKHRoaXNfd2lkdGgpOworICB0aGlzX3dpZHRoID0gZmFicyh0aGlzX3dpZHRoKTsKICAgdGhpc19tYXRyaXguQ29uY2F0KGZvcm1NYXRyaXgpOwogICB0aGlzX3dpZHRoID0gdGhpc19tYXRyaXguVHJhbnNmb3JtRGlzdGFuY2UodGhpc193aWR0aCk7CiAKLSAgRlhfRkxPQVQgdGhyZXNob2xkID0KLSAgICAgIHByZXZfd2lkdGggPiB0aGlzX3dpZHRoID8gcHJldl93aWR0aCAvIDQgOiB0aGlzX3dpZHRoIC8gNDsKKyAgZmxvYXQgdGhyZXNob2xkID0gcHJldl93aWR0aCA+IHRoaXNfd2lkdGggPyBwcmV2X3dpZHRoIC8gNCA6IHRoaXNfd2lkdGggLyA0OwogICBDRlhfUG9pbnRGIHByZXZfcG9zID0gbV9EaXNwbGF5TWF0cml4LlRyYW5zZm9ybSgKICAgICAgIHByZXZfT2JqLm1fZm9ybU1hdHJpeC5UcmFuc2Zvcm0ocHJldl9PYmoubV9wVGV4dE9iai0+R2V0UG9zKCkpKTsKICAgQ0ZYX1BvaW50RiB0aGlzX3BvcyA9CiAgICAgICBtX0Rpc3BsYXlNYXRyaXguVHJhbnNmb3JtKGZvcm1NYXRyaXguVHJhbnNmb3JtKHBUZXh0T2JqLT5HZXRQb3MoKSkpOwotICBpZiAoRlhTWVNfZmFicyh0aGlzX3Bvcy55IC0gcHJldl9wb3MueSkgPiB0aHJlc2hvbGQgKiAyKSB7CisgIGlmIChmYWJzKHRoaXNfcG9zLnkgLSBwcmV2X3Bvcy55KSA+IHRocmVzaG9sZCAqIDIpIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspCiAgICAgICBQcm9jZXNzVGV4dE9iamVjdChtX0xpbmVPYmpbaV0pOwogICAgIG1fTGluZU9iai5jbGVhcigpOwpAQCAtODA4LDIwICs3ODEsMTkgQEAKIH0KIAogRlBERlRleHRfTWFya2VkQ29udGVudCBDUERGX1RleHRQYWdlOjpQcmVNYXJrZWRDb250ZW50KFBERlRFWFRfT2JqIE9iaikgewotICBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqID0gT2JqLm1fcFRleHRPYmo7Ci0gIGlmICghcFRleHRPYmotPm1fQ29udGVudE1hcmspCisgIENQREZfVGV4dE9iamVjdCogcFRleHRPYmogPSBPYmoubV9wVGV4dE9iai5HZXQoKTsKKyAgaWYgKCFwVGV4dE9iai0+bV9Db250ZW50TWFyay5IYXNSZWYoKSkKICAgICByZXR1cm4gRlBERlRleHRfTWFya2VkQ29udGVudDo6UGFzczsKIAotICBpbnQgbkNvbnRlbnRNYXJrID0gcFRleHRPYmotPm1fQ29udGVudE1hcmsuQ291bnRJdGVtcygpOwotICBpZiAobkNvbnRlbnRNYXJrIDwgMSkKKyAgc2l6ZV90IG5Db250ZW50TWFyayA9IHBUZXh0T2JqLT5tX0NvbnRlbnRNYXJrLkNvdW50SXRlbXMoKTsKKyAgaWYgKG5Db250ZW50TWFyayA9PSAwKQogICAgIHJldHVybiBGUERGVGV4dF9NYXJrZWRDb250ZW50OjpQYXNzOwogCi0gIENGWF9XaWRlU3RyaW5nIGFjdFRleHQ7CisgIFdpZGVTdHJpbmcgYWN0VGV4dDsKICAgYm9vbCBiRXhpc3QgPSBmYWxzZTsKICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG51bGxwdHI7Ci0gIGludCBuID0gMDsKLSAgZm9yIChuID0gMDsgbiA8IG5Db250ZW50TWFyazsgbisrKSB7Ci0gICAgY29uc3QgQ1BERl9Db250ZW50TWFya0l0ZW0mIGl0ZW0gPSBwVGV4dE9iai0+bV9Db250ZW50TWFyay5HZXRJdGVtKG4pOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5Db250ZW50TWFyazsgKytpKSB7CisgICAgY29uc3QgQ1BERl9Db250ZW50TWFya0l0ZW0mIGl0ZW0gPSBwVGV4dE9iai0+bV9Db250ZW50TWFyay5HZXRJdGVtKGkpOwogICAgIHBEaWN0ID0gaXRlbS5HZXRQYXJhbSgpOwogICAgIGlmICghcERpY3QpCiAgICAgICBjb250aW51ZTsKQEAgLTgzNCwyMSArODA2LDIxIEBACiAgIGlmICghYkV4aXN0KQogICAgIHJldHVybiBGUERGVGV4dF9NYXJrZWRDb250ZW50OjpQYXNzOwogCi0gIGlmIChtX3BQcmVUZXh0T2JqICYmIG1fcFByZVRleHRPYmotPm1fQ29udGVudE1hcmsgJiYKLSAgICAgIG1fcFByZVRleHRPYmotPm1fQ29udGVudE1hcmsuQ291bnRJdGVtcygpID09IG4gJiYKLSAgICAgIHBEaWN0ID09IG1fcFByZVRleHRPYmotPm1fQ29udGVudE1hcmsuR2V0SXRlbShuIC0gMSkuR2V0UGFyYW0oKSkgewotICAgIHJldHVybiBGUERGVGV4dF9NYXJrZWRDb250ZW50OjpEb25lOworICBpZiAobV9wUHJlVGV4dE9iaikgeworICAgIGNvbnN0IENQREZfQ29udGVudE1hcmsmIG1hcmsgPSBtX3BQcmVUZXh0T2JqLT5tX0NvbnRlbnRNYXJrOworICAgIGlmIChtYXJrLkhhc1JlZigpICYmIG1hcmsuQ291bnRJdGVtcygpID09IG5Db250ZW50TWFyayAmJgorICAgICAgICBtYXJrLkdldEl0ZW0obkNvbnRlbnRNYXJrIC0gMSkuR2V0UGFyYW0oKSA9PSBwRGljdCkgeworICAgICAgcmV0dXJuIEZQREZUZXh0X01hcmtlZENvbnRlbnQ6OkRvbmU7CisgICAgfQogICB9CiAKLSAgRlhfU1RSU0laRSBuSXRlbXMgPSBhY3RUZXh0LkdldExlbmd0aCgpOwotICBpZiAobkl0ZW1zIDwgMSkKKyAgaWYgKGFjdFRleHQuSXNFbXB0eSgpKQogICAgIHJldHVybiBGUERGVGV4dF9NYXJrZWRDb250ZW50OjpQYXNzOwogCiAgIENQREZfRm9udCogcEZvbnQgPSBwVGV4dE9iai0+R2V0Rm9udCgpOwogICBiRXhpc3QgPSBmYWxzZTsKLSAgZm9yIChGWF9TVFJTSVpFIGkgPSAwOyBpIDwgbkl0ZW1zOyBpKyspIHsKLSAgICBpZiAocEZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUoYWN0VGV4dC5HZXRBdChpKSkgIT0KLSAgICAgICAgQ1BERl9Gb250OjprSW52YWxpZENoYXJDb2RlKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0VGV4dC5HZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgaWYgKHBGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKGFjdFRleHRbaV0pICE9IENQREZfRm9udDo6a0ludmFsaWRDaGFyQ29kZSkgewogICAgICAgYkV4aXN0ID0gdHJ1ZTsKICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTg1Nyw4ICs4MjksOCBAQAogICAgIHJldHVybiBGUERGVGV4dF9NYXJrZWRDb250ZW50OjpQYXNzOwogCiAgIGJFeGlzdCA9IGZhbHNlOwotICBmb3IgKEZYX1NUUlNJWkUgaSA9IDA7IGkgPCBuSXRlbXM7IGkrKykgewotICAgIEZYX1dDSEFSIHdDaGFyID0gYWN0VGV4dC5HZXRBdChpKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3RUZXh0LkdldExlbmd0aCgpOyBpKyspIHsKKyAgICB3Y2hhcl90IHdDaGFyID0gYWN0VGV4dFtpXTsKICAgICBpZiAoKHdDaGFyID4gMHg4MCAmJiB3Q2hhciA8IDB4RkZGRCkgfHwgKHdDaGFyIDw9IDB4ODAgJiYgaXNwcmludCh3Q2hhcikpKSB7CiAgICAgICBiRXhpc3QgPSB0cnVlOwogICAgICAgYnJlYWs7CkBAIC04NzEsMzEgKzg0MywzMCBAQAogfQogCiB2b2lkIENQREZfVGV4dFBhZ2U6OlByb2Nlc3NNYXJrZWRDb250ZW50KFBERlRFWFRfT2JqIE9iaikgewotICBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqID0gT2JqLm1fcFRleHRPYmo7Ci0gIGlmICghcFRleHRPYmotPm1fQ29udGVudE1hcmspCisgIENQREZfVGV4dE9iamVjdCogcFRleHRPYmogPSBPYmoubV9wVGV4dE9iai5HZXQoKTsKKyAgaWYgKCFwVGV4dE9iai0+bV9Db250ZW50TWFyay5IYXNSZWYoKSkKICAgICByZXR1cm47CiAKICAgaW50IG5Db250ZW50TWFyayA9IHBUZXh0T2JqLT5tX0NvbnRlbnRNYXJrLkNvdW50SXRlbXMoKTsKICAgaWYgKG5Db250ZW50TWFyayA8IDEpCiAgICAgcmV0dXJuOwogCi0gIENGWF9XaWRlU3RyaW5nIGFjdFRleHQ7CisgIFdpZGVTdHJpbmcgYWN0VGV4dDsKICAgZm9yIChpbnQgbiA9IDA7IG4gPCBuQ29udGVudE1hcms7IG4rKykgewogICAgIGNvbnN0IENQREZfQ29udGVudE1hcmtJdGVtJiBpdGVtID0gcFRleHRPYmotPm1fQ29udGVudE1hcmsuR2V0SXRlbShuKTsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gaXRlbS5HZXRQYXJhbSgpOwogICAgIGlmIChwRGljdCkKICAgICAgIGFjdFRleHQgPSBwRGljdC0+R2V0VW5pY29kZVRleHRGb3IoIkFjdHVhbFRleHQiKTsKICAgfQotICBGWF9TVFJTSVpFIG5JdGVtcyA9IGFjdFRleHQuR2V0TGVuZ3RoKCk7Ci0gIGlmIChuSXRlbXMgPCAxKQorICBpZiAoYWN0VGV4dC5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuOwogCiAgIENQREZfRm9udCogcEZvbnQgPSBwVGV4dE9iai0+R2V0Rm9udCgpOwogICBDRlhfTWF0cml4IG1hdHJpeCA9IHBUZXh0T2JqLT5HZXRUZXh0TWF0cml4KCk7CiAgIG1hdHJpeC5Db25jYXQoT2JqLm1fZm9ybU1hdHJpeCk7CiAKLSAgZm9yIChGWF9TVFJTSVpFIGsgPSAwOyBrIDwgbkl0ZW1zOyBrKyspIHsKLSAgICBGWF9XQ0hBUiB3Q2hhciA9IGFjdFRleHQuR2V0QXQoayk7CisgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgYWN0VGV4dC5HZXRMZW5ndGgoKTsgaysrKSB7CisgICAgd2NoYXJfdCB3Q2hhciA9IGFjdFRleHRba107CiAgICAgaWYgKHdDaGFyIDw9IDB4ODAgJiYgIWlzcHJpbnQod0NoYXIpKQogICAgICAgd0NoYXIgPSAweDIwOwogICAgIGlmICh3Q2hhciA+PSAweEZGRkQpCkBAIC05MzQsNyArOTA1LDcgQEAKICAgICBzdGQ6OnN3YXAobV9UZW1wQ2hhckxpc3RbaV0sIG1fVGVtcENoYXJMaXN0W2pdKTsKICAgICBzdGQ6OnN3YXAobV9UZW1wQ2hhckxpc3RbaV0ubV9JbmRleCwgbV9UZW1wQ2hhckxpc3Rbal0ubV9JbmRleCk7CiAgIH0KLSAgRlhfV0NIQVIqIHBUZW1wQnVmZmVyID0gbV9UZW1wVGV4dEJ1Zi5HZXRCdWZmZXIoKTsKKyAgd2NoYXJfdCogcFRlbXBCdWZmZXIgPSBtX1RlbXBUZXh0QnVmLkdldEJ1ZmZlcigpOwogICBpID0gaUJ1ZlN0YXJ0QXBwZW5kOwogICBqID0gbV9UZW1wVGV4dEJ1Zi5HZXRMZW5ndGgoKSAtIDE7CiAgIGZvciAoOyBpIDwgajsgaSsrLCBqLS0pCkBAIC05NDMsMTcgKzkxNCwxNyBAQAogCiBib29sIENQREZfVGV4dFBhZ2U6OklzUmlnaHRUb0xlZnQoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuSXRlbXMpIGNvbnN0IHsKLSAgQ0ZYX1dpZGVTdHJpbmcgc3RyOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuSXRlbXM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuSXRlbXMpIGNvbnN0IHsKKyAgV2lkZVN0cmluZyBzdHI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbkl0ZW1zOyArK2kpIHsKICAgICBDUERGX1RleHRPYmplY3RJdGVtIGl0ZW07CiAgICAgcFRleHRPYmotPkdldEl0ZW1JbmZvKGksICZpdGVtKTsKICAgICBpZiAoaXRlbS5tX0NoYXJDb2RlID09IHN0YXRpY19jYXN0PHVpbnQzMl90PigtMSkpCiAgICAgICBjb250aW51ZTsKLSAgICBDRlhfV2lkZVN0cmluZyB3c3RySXRlbSA9IHBGb250LT5Vbmljb2RlRnJvbUNoYXJDb2RlKGl0ZW0ubV9DaGFyQ29kZSk7Ci0gICAgRlhfV0NIQVIgd0NoYXIgPSB3c3RySXRlbS5HZXRBdCgwKTsKLSAgICBpZiAoKHdzdHJJdGVtLklzRW1wdHkoKSB8fCB3Q2hhciA9PSAwKSAmJiBpdGVtLm1fQ2hhckNvZGUpCi0gICAgICB3Q2hhciA9IChGWF9XQ0hBUilpdGVtLm1fQ2hhckNvZGU7CisgICAgV2lkZVN0cmluZyB3c3RySXRlbSA9IHBGb250LT5Vbmljb2RlRnJvbUNoYXJDb2RlKGl0ZW0ubV9DaGFyQ29kZSk7CisgICAgd2NoYXJfdCB3Q2hhciA9ICF3c3RySXRlbS5Jc0VtcHR5KCkgPyB3c3RySXRlbVswXSA6IDA7CisgICAgaWYgKHdDaGFyID09IDApCisgICAgICB3Q2hhciA9IGl0ZW0ubV9DaGFyQ29kZTsKICAgICBpZiAod0NoYXIpCiAgICAgICBzdHIgKz0gd0NoYXI7CiAgIH0KQEAgLTk2MSw4ICs5MzIsOCBAQAogfQogCiB2b2lkIENQREZfVGV4dFBhZ2U6OlByb2Nlc3NUZXh0T2JqZWN0KFBERlRFWFRfT2JqIE9iaikgewotICBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqID0gT2JqLm1fcFRleHRPYmo7Ci0gIGlmIChGWFNZU19mYWJzKHBUZXh0T2JqLT5tX1JpZ2h0IC0gcFRleHRPYmotPm1fTGVmdCkgPCAwLjAxZikKKyAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiA9IE9iai5tX3BUZXh0T2JqLkdldCgpOworICBpZiAoZmFicyhwVGV4dE9iai0+bV9SaWdodCAtIHBUZXh0T2JqLT5tX0xlZnQpIDwgMC4wMWYpCiAgICAgcmV0dXJuOwogICBDRlhfTWF0cml4IGZvcm1NYXRyaXggPSBPYmoubV9mb3JtTWF0cml4OwogICBDUERGX0ZvbnQqIHBGb250ID0gcFRleHRPYmotPkdldEZvbnQoKTsKQEAgLTEwMDcsMTYgKzk3OCwxNiBAQAogICAgICAgICBpZiAocFRleHRPYmotPkNvdW50Q2hhcnMoKSA9PSAxKSB7CiAgICAgICAgICAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtOwogICAgICAgICAgIHBUZXh0T2JqLT5HZXRDaGFySW5mbygwLCAmaXRlbSk7Ci0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0ckl0ZW0gPQorICAgICAgICAgIFdpZGVTdHJpbmcgd3N0ckl0ZW0gPQogICAgICAgICAgICAgICBwVGV4dE9iai0+R2V0Rm9udCgpLT5Vbmljb2RlRnJvbUNoYXJDb2RlKGl0ZW0ubV9DaGFyQ29kZSk7CiAgICAgICAgICAgaWYgKHdzdHJJdGVtLklzRW1wdHkoKSkKLSAgICAgICAgICAgIHdzdHJJdGVtICs9IChGWF9XQ0hBUilpdGVtLm1fQ2hhckNvZGU7Ci0gICAgICAgICAgRlhfV0NIQVIgY3VyQ2hhciA9IHdzdHJJdGVtLkdldEF0KDApOworICAgICAgICAgICAgd3N0ckl0ZW0gKz0gKHdjaGFyX3QpaXRlbS5tX0NoYXJDb2RlOworICAgICAgICAgIHdjaGFyX3QgY3VyQ2hhciA9IHdzdHJJdGVtWzBdOwogICAgICAgICAgIGlmIChjdXJDaGFyID09IDB4MkQgfHwgY3VyQ2hhciA9PSAweEFEKQogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIHdoaWxlIChtX1RlbXBUZXh0QnVmLkdldFNpemUoKSA+IDAgJiYKLSAgICAgICAgICAgICAgIG1fVGVtcFRleHRCdWYuQXNTdHJpbmdDKCkuR2V0QXQobV9UZW1wVGV4dEJ1Zi5HZXRMZW5ndGgoKSAtIDEpID09CisgICAgICAgICAgICAgICBtX1RlbXBUZXh0QnVmLkFzU3RyaW5nVmlldygpW21fVGVtcFRleHRCdWYuR2V0TGVuZ3RoKCkgLSAxXSA9PQogICAgICAgICAgICAgICAgICAgIDB4MjApIHsKICAgICAgICAgICBtX1RlbXBUZXh0QnVmLkRlbGV0ZShtX1RlbXBUZXh0QnVmLkdldExlbmd0aCgpIC0gMSwgMSk7CiAgICAgICAgICAgbV9UZW1wQ2hhckxpc3QucG9wX2JhY2soKTsKQEAgLTEwNDAsOCArMTAxMSw4IEBACiAgIH0KICAgbV9wUHJlVGV4dE9iaiA9IHBUZXh0T2JqOwogICBtX3Blck1hdHJpeCA9IGZvcm1NYXRyaXg7Ci0gIGludCBuSXRlbXMgPSBwVGV4dE9iai0+Q291bnRJdGVtcygpOwotICBGWF9GTE9BVCBiYXNlU3BhY2UgPSBDYWxjdWxhdGVCYXNlU3BhY2UocFRleHRPYmosIG1hdHJpeCk7CisgIHNpemVfdCBuSXRlbXMgPSBwVGV4dE9iai0+Q291bnRJdGVtcygpOworICBmbG9hdCBiYXNlU3BhY2UgPSBDYWxjdWxhdGVCYXNlU3BhY2UocFRleHRPYmosIG1hdHJpeCk7CiAKICAgY29uc3QgYm9vbCBiUjJMID0gSXNSaWdodFRvTGVmdChwVGV4dE9iaiwgcEZvbnQsIG5JdGVtcyk7CiAgIGNvbnN0IGJvb2wgYklzQmlkaUFuZE1pcnJvckludmVyc2UgPQpAQCAtMTA1MCwzMyArMTAyMSwzMyBAQAogICBpbnQzMl90IGlDaGFyTGlzdFN0YXJ0QXBwZW5kID0KICAgICAgIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9UZW1wQ2hhckxpc3QpOwogCi0gIEZYX0ZMT0FUIHNwYWNpbmcgPSAwOwotICBmb3IgKGludCBpID0gMDsgaSA8IG5JdGVtczsgaSsrKSB7CisgIGZsb2F0IHNwYWNpbmcgPSAwOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5JdGVtczsgKytpKSB7CiAgICAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtOwogICAgIFBBR0VDSEFSX0lORk8gY2hhcmluZm87CiAgICAgcFRleHRPYmotPkdldEl0ZW1JbmZvKGksICZpdGVtKTsKICAgICBpZiAoaXRlbS5tX0NoYXJDb2RlID09IHN0YXRpY19jYXN0PHVpbnQzMl90PigtMSkpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHN0ciA9IG1fVGVtcFRleHRCdWYuTWFrZVN0cmluZygpOworICAgICAgV2lkZVN0cmluZyBzdHIgPSBtX1RlbXBUZXh0QnVmLk1ha2VTdHJpbmcoKTsKICAgICAgIGlmIChzdHIuSXNFbXB0eSgpKQotICAgICAgICBzdHIgPSBtX1RleHRCdWYuQXNTdHJpbmdDKCk7Ci0gICAgICBpZiAoc3RyLklzRW1wdHkoKSB8fCBzdHIuR2V0QXQoc3RyLkdldExlbmd0aCgpIC0gMSkgPT0gVEVYVF9TUEFDRV9DSEFSKQorICAgICAgICBzdHIgPSBtX1RleHRCdWYuQXNTdHJpbmdWaWV3KCk7CisgICAgICBpZiAoc3RyLklzRW1wdHkoKSB8fCBzdHJbc3RyLkdldExlbmd0aCgpIC0gMV0gPT0gVEVYVF9TUEFDRV9DSEFSKQogICAgICAgICBjb250aW51ZTsKIAotICAgICAgRlhfRkxPQVQgZm9udHNpemVfaCA9IHBUZXh0T2JqLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZUgoKTsKKyAgICAgIGZsb2F0IGZvbnRzaXplX2ggPSBwVGV4dE9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemVIKCk7CiAgICAgICBzcGFjaW5nID0gLWZvbnRzaXplX2ggKiBpdGVtLm1fT3JpZ2luLnggLyAxMDAwOwogICAgICAgY29udGludWU7CiAgICAgfQotICAgIEZYX0ZMT0FUIGNoYXJTcGFjZSA9IHBUZXh0T2JqLT5tX1RleHRTdGF0ZS5HZXRDaGFyU3BhY2UoKTsKKyAgICBmbG9hdCBjaGFyU3BhY2UgPSBwVGV4dE9iai0+bV9UZXh0U3RhdGUuR2V0Q2hhclNwYWNlKCk7CiAgICAgaWYgKGNoYXJTcGFjZSA+IDAuMDAxKQogICAgICAgc3BhY2luZyArPSBtYXRyaXguVHJhbnNmb3JtRGlzdGFuY2UoY2hhclNwYWNlKTsKICAgICBlbHNlIGlmIChjaGFyU3BhY2UgPCAtMC4wMDEpCi0gICAgICBzcGFjaW5nIC09IG1hdHJpeC5UcmFuc2Zvcm1EaXN0YW5jZShGWFNZU19mYWJzKGNoYXJTcGFjZSkpOworICAgICAgc3BhY2luZyAtPSBtYXRyaXguVHJhbnNmb3JtRGlzdGFuY2UoZmFicyhjaGFyU3BhY2UpKTsKICAgICBzcGFjaW5nIC09IGJhc2VTcGFjZTsKICAgICBpZiAoc3BhY2luZyAmJiBpID4gMCkgewogICAgICAgaW50IGxhc3Rfd2lkdGggPSAwOwotICAgICAgRlhfRkxPQVQgZm9udHNpemVfaCA9IHBUZXh0T2JqLT5tX1RleHRTdGF0ZS5HZXRGb250U2l6ZUgoKTsKKyAgICAgIGZsb2F0IGZvbnRzaXplX2ggPSBwVGV4dE9iai0+bV9UZXh0U3RhdGUuR2V0Rm9udFNpemVIKCk7CiAgICAgICB1aW50MzJfdCBzcGFjZV9jaGFyY29kZSA9IHBGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKCcgJyk7Ci0gICAgICBGWF9GTE9BVCB0aHJlc2hvbGQgPSAwOworICAgICAgZmxvYXQgdGhyZXNob2xkID0gMDsKICAgICAgIGlmIChzcGFjZV9jaGFyY29kZSAhPSBDUERGX0ZvbnQ6OmtJbnZhbGlkQ2hhckNvZGUpCiAgICAgICAgIHRocmVzaG9sZCA9IGZvbnRzaXplX2ggKiBwRm9udC0+R2V0Q2hhcldpZHRoRihzcGFjZV9jaGFyY29kZSkgLyAxMDAwOwogICAgICAgaWYgKHRocmVzaG9sZCA+IGZvbnRzaXplX2ggLyAzKQpAQCAtMTA4NSw5ICsxMDU2LDkgQEAKICAgICAgICAgdGhyZXNob2xkIC89IDI7CiAgICAgICBpZiAodGhyZXNob2xkID09IDApIHsKICAgICAgICAgdGhyZXNob2xkID0gZm9udHNpemVfaDsKLSAgICAgICAgaW50IHRoaXNfd2lkdGggPSBGWFNZU19hYnMoR2V0Q2hhcldpZHRoKGl0ZW0ubV9DaGFyQ29kZSwgcEZvbnQpKTsKLSAgICAgICAgdGhyZXNob2xkID0gdGhpc193aWR0aCA+IGxhc3Rfd2lkdGggPyAoRlhfRkxPQVQpdGhpc193aWR0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChGWF9GTE9BVClsYXN0X3dpZHRoOworICAgICAgICBpbnQgdGhpc193aWR0aCA9IGFicyhHZXRDaGFyV2lkdGgoaXRlbS5tX0NoYXJDb2RlLCBwRm9udCkpOworICAgICAgICB0aHJlc2hvbGQgPQorICAgICAgICAgICAgdGhpc193aWR0aCA+IGxhc3Rfd2lkdGggPyAoZmxvYXQpdGhpc193aWR0aCA6IChmbG9hdClsYXN0X3dpZHRoOwogICAgICAgICB0aHJlc2hvbGQgPSBOb3JtYWxpemVUaHJlc2hvbGQodGhyZXNob2xkKTsKICAgICAgICAgdGhyZXNob2xkID0gZm9udHNpemVfaCAqIHRocmVzaG9sZCAvIDEwMDA7CiAgICAgICB9CkBAIC0xMTA5LDEwICsxMDgwLDEwIEBACiAgICAgICAgIGNvbnRpbnVlOwogICAgIH0KICAgICBzcGFjaW5nID0gMDsKLSAgICBDRlhfV2lkZVN0cmluZyB3c3RySXRlbSA9IHBGb250LT5Vbmljb2RlRnJvbUNoYXJDb2RlKGl0ZW0ubV9DaGFyQ29kZSk7CisgICAgV2lkZVN0cmluZyB3c3RySXRlbSA9IHBGb250LT5Vbmljb2RlRnJvbUNoYXJDb2RlKGl0ZW0ubV9DaGFyQ29kZSk7CiAgICAgYm9vbCBiTm9Vbmljb2RlID0gZmFsc2U7CiAgICAgaWYgKHdzdHJJdGVtLklzRW1wdHkoKSAmJiBpdGVtLm1fQ2hhckNvZGUpIHsKLSAgICAgIHdzdHJJdGVtICs9IHN0YXRpY19jYXN0PEZYX1dDSEFSPihpdGVtLm1fQ2hhckNvZGUpOworICAgICAgd3N0ckl0ZW0gKz0gc3RhdGljX2Nhc3Q8d2NoYXJfdD4oaXRlbS5tX0NoYXJDb2RlKTsKICAgICAgIGJOb1VuaWNvZGUgPSB0cnVlOwogICAgIH0KICAgICBjaGFyaW5mby5tX0luZGV4ID0gLTE7CkBAIC0xMTQzLDQ5ICsxMTE0LDQ2IEBACiAgICAgICBjaGFyaW5mby5tX0NoYXJCb3gucmlnaHQgPQogICAgICAgICAgIGNoYXJpbmZvLm1fQ2hhckJveC5sZWZ0ICsgcFRleHRPYmotPkdldENoYXJXaWR0aChjaGFyaW5mby5tX0NoYXJDb2RlKTsKICAgICB9Ci0gICAgbWF0cml4LlRyYW5zZm9ybVJlY3QoY2hhcmluZm8ubV9DaGFyQm94KTsKKyAgICBjaGFyaW5mby5tX0NoYXJCb3ggPSBtYXRyaXguVHJhbnNmb3JtUmVjdChjaGFyaW5mby5tX0NoYXJCb3gpOwogICAgIGNoYXJpbmZvLm1fTWF0cml4ID0gbWF0cml4OwogICAgIGlmICh3c3RySXRlbS5Jc0VtcHR5KCkpIHsKICAgICAgIGNoYXJpbmZvLm1fVW5pY29kZSA9IDA7CiAgICAgICBtX1RlbXBDaGFyTGlzdC5wdXNoX2JhY2soY2hhcmluZm8pOwogICAgICAgbV9UZW1wVGV4dEJ1Zi5BcHBlbmRDaGFyKDB4ZmZmZSk7CiAgICAgICBjb250aW51ZTsKLSAgICB9IGVsc2UgewotICAgICAgaW50IG5Ub3RhbCA9IHdzdHJJdGVtLkdldExlbmd0aCgpOwotICAgICAgYm9vbCBiRGVsID0gZmFsc2U7Ci0gICAgICBjb25zdCBpbnQgY291bnQgPQotICAgICAgICAgIHN0ZDo6bWluKHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50PihtX1RlbXBDaGFyTGlzdCksIDcpOwotICAgICAgRlhfRkxPQVQgdGhyZXNob2xkID0gY2hhcmluZm8ubV9NYXRyaXguVHJhbnNmb3JtWERpc3RhbmNlKAotICAgICAgICAgIChGWF9GTE9BVClURVhUX0NIQVJSQVRJT19HQVBERUxUQSAqIHBUZXh0T2JqLT5HZXRGb250U2l6ZSgpKTsKLSAgICAgIGZvciAoaW50IG4gPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludD4obV9UZW1wQ2hhckxpc3QpOwotICAgICAgICAgICBuID4gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQ+KG1fVGVtcENoYXJMaXN0KSAtIGNvdW50OyBuLS0pIHsKLSAgICAgICAgY29uc3QgUEFHRUNIQVJfSU5GTyYgY2hhcmluZm8xID0gbV9UZW1wQ2hhckxpc3RbbiAtIDFdOwotICAgICAgICBDRlhfUG9pbnRGIGRpZmYgPSBjaGFyaW5mbzEubV9PcmlnaW4gLSBjaGFyaW5mby5tX09yaWdpbjsKLSAgICAgICAgaWYgKGNoYXJpbmZvMS5tX0NoYXJDb2RlID09IGNoYXJpbmZvLm1fQ2hhckNvZGUgJiYKLSAgICAgICAgICAgIGNoYXJpbmZvMS5tX3BUZXh0T2JqLT5HZXRGb250KCkgPT0gY2hhcmluZm8ubV9wVGV4dE9iai0+R2V0Rm9udCgpICYmCi0gICAgICAgICAgICBGWFNZU19mYWJzKGRpZmYueCkgPCB0aHJlc2hvbGQgJiYgRlhTWVNfZmFicyhkaWZmLnkpIDwgdGhyZXNob2xkKSB7Ci0gICAgICAgICAgYkRlbCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKyAgICB9CisgICAgaW50IG5Ub3RhbCA9IHdzdHJJdGVtLkdldExlbmd0aCgpOworICAgIGJvb2wgYkRlbCA9IGZhbHNlOworICAgIGNvbnN0IGludCBjb3VudCA9IHN0ZDo6bWluKHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50PihtX1RlbXBDaGFyTGlzdCksIDcpOworICAgIGZsb2F0IHRocmVzaG9sZCA9IGNoYXJpbmZvLm1fTWF0cml4LlRyYW5zZm9ybVhEaXN0YW5jZSgKKyAgICAgICAgKGZsb2F0KVRFWFRfQ0hBUlJBVElPX0dBUERFTFRBICogcFRleHRPYmotPkdldEZvbnRTaXplKCkpOworICAgIGZvciAoaW50IG4gPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludD4obV9UZW1wQ2hhckxpc3QpOworICAgICAgICAgbiA+IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50PihtX1RlbXBDaGFyTGlzdCkgLSBjb3VudDsgbi0tKSB7CisgICAgICBjb25zdCBQQUdFQ0hBUl9JTkZPJiBjaGFyaW5mbzEgPSBtX1RlbXBDaGFyTGlzdFtuIC0gMV07CisgICAgICBDRlhfUG9pbnRGIGRpZmYgPSBjaGFyaW5mbzEubV9PcmlnaW4gLSBjaGFyaW5mby5tX09yaWdpbjsKKyAgICAgIGlmIChjaGFyaW5mbzEubV9DaGFyQ29kZSA9PSBjaGFyaW5mby5tX0NoYXJDb2RlICYmCisgICAgICAgICAgY2hhcmluZm8xLm1fcFRleHRPYmotPkdldEZvbnQoKSA9PSBjaGFyaW5mby5tX3BUZXh0T2JqLT5HZXRGb250KCkgJiYKKyAgICAgICAgICBmYWJzKGRpZmYueCkgPCB0aHJlc2hvbGQgJiYgZmFicyhkaWZmLnkpIDwgdGhyZXNob2xkKSB7CisgICAgICAgIGJEZWwgPSB0cnVlOworICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIGlmICghYkRlbCkgewotICAgICAgICBmb3IgKGludCBuSW5kZXggPSAwOyBuSW5kZXggPCBuVG90YWw7IG5JbmRleCsrKSB7Ci0gICAgICAgICAgY2hhcmluZm8ubV9Vbmljb2RlID0gd3N0ckl0ZW0uR2V0QXQobkluZGV4KTsKLSAgICAgICAgICBpZiAoY2hhcmluZm8ubV9Vbmljb2RlKSB7Ci0gICAgICAgICAgICBjaGFyaW5mby5tX0luZGV4ID0gbV9UZXh0QnVmLkdldExlbmd0aCgpOwotICAgICAgICAgICAgbV9UZW1wVGV4dEJ1Zi5BcHBlbmRDaGFyKGNoYXJpbmZvLm1fVW5pY29kZSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fVGVtcFRleHRCdWYuQXBwZW5kQ2hhcigweGZmZmUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBtX1RlbXBDaGFyTGlzdC5wdXNoX2JhY2soY2hhcmluZm8pOworICAgIH0KKyAgICBpZiAoIWJEZWwpIHsKKyAgICAgIGZvciAoaW50IG5JbmRleCA9IDA7IG5JbmRleCA8IG5Ub3RhbDsgbkluZGV4KyspIHsKKyAgICAgICAgY2hhcmluZm8ubV9Vbmljb2RlID0gd3N0ckl0ZW1bbkluZGV4XTsKKyAgICAgICAgaWYgKGNoYXJpbmZvLm1fVW5pY29kZSkgeworICAgICAgICAgIGNoYXJpbmZvLm1fSW5kZXggPSBtX1RleHRCdWYuR2V0TGVuZ3RoKCk7CisgICAgICAgICAgbV9UZW1wVGV4dEJ1Zi5BcHBlbmRDaGFyKGNoYXJpbmZvLm1fVW5pY29kZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbV9UZW1wVGV4dEJ1Zi5BcHBlbmRDaGFyKDB4ZmZmZSk7CiAgICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoaSA9PSAwKSB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHN0ciA9IG1fVGVtcFRleHRCdWYuTWFrZVN0cmluZygpOwotICAgICAgICBpZiAoIXN0ci5Jc0VtcHR5KCkgJiYKLSAgICAgICAgICAgIHN0ci5HZXRBdChzdHIuR2V0TGVuZ3RoKCkgLSAxKSA9PSBURVhUX1NQQUNFX0NIQVIpIHsKLSAgICAgICAgICBtX1RlbXBUZXh0QnVmLkRlbGV0ZShtX1RlbXBUZXh0QnVmLkdldExlbmd0aCgpIC0gMSwgMSk7Ci0gICAgICAgICAgbV9UZW1wQ2hhckxpc3QucG9wX2JhY2soKTsKLSAgICAgICAgfQorICAgICAgICBtX1RlbXBDaGFyTGlzdC5wdXNoX2JhY2soY2hhcmluZm8pOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoaSA9PSAwKSB7CisgICAgICBXaWRlU3RyaW5nIHN0ciA9IG1fVGVtcFRleHRCdWYuTWFrZVN0cmluZygpOworICAgICAgaWYgKCFzdHIuSXNFbXB0eSgpICYmIHN0cltzdHIuR2V0TGVuZ3RoKCkgLSAxXSA9PSBURVhUX1NQQUNFX0NIQVIpIHsKKyAgICAgICAgbV9UZW1wVGV4dEJ1Zi5EZWxldGUobV9UZW1wVGV4dEJ1Zi5HZXRMZW5ndGgoKSAtIDEsIDEpOworICAgICAgICBtX1RlbXBDaGFyTGlzdC5wb3BfYmFjaygpOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtMTE5NSw4ICsxMTYzLDggQEAKIAogQ1BERl9UZXh0UGFnZTo6VGV4dE9yaWVudGF0aW9uIENQREZfVGV4dFBhZ2U6OkdldFRleHRPYmplY3RXcml0aW5nTW9kZSgKICAgICBjb25zdCBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqKSBjb25zdCB7Ci0gIGludDMyX3QgbkNoYXJzID0gcFRleHRPYmotPkNvdW50Q2hhcnMoKTsKLSAgaWYgKG5DaGFycyA9PSAxKQorICBzaXplX3QgbkNoYXJzID0gcFRleHRPYmotPkNvdW50Q2hhcnMoKTsKKyAgaWYgKG5DaGFycyA8PSAxKQogICAgIHJldHVybiBtX1RleHRsaW5lRGlyOwogCiAgIENQREZfVGV4dE9iamVjdEl0ZW0gZmlyc3QsIGxhc3Q7CkBAIC0xMjA3LDggKzExNzUsOCBAQAogICBmaXJzdC5tX09yaWdpbiA9IHRleHRNYXRyaXguVHJhbnNmb3JtKGZpcnN0Lm1fT3JpZ2luKTsKICAgbGFzdC5tX09yaWdpbiA9IHRleHRNYXRyaXguVHJhbnNmb3JtKGxhc3QubV9PcmlnaW4pOwogCi0gIEZYX0ZMT0FUIGRYID0gRlhTWVNfZmFicyhsYXN0Lm1fT3JpZ2luLnggLSBmaXJzdC5tX09yaWdpbi54KTsKLSAgRlhfRkxPQVQgZFkgPSBGWFNZU19mYWJzKGxhc3QubV9PcmlnaW4ueSAtIGZpcnN0Lm1fT3JpZ2luLnkpOworICBmbG9hdCBkWCA9IGZhYnMobGFzdC5tX09yaWdpbi54IC0gZmlyc3QubV9PcmlnaW4ueCk7CisgIGZsb2F0IGRZID0gZmFicyhsYXN0Lm1fT3JpZ2luLnkgLSBmaXJzdC5tX09yaWdpbi55KTsKICAgaWYgKGRYIDw9IDAuMDAwMWYgJiYgZFkgPD0gMC4wMDAxZikKICAgICByZXR1cm4gVGV4dE9yaWVudGF0aW9uOjpVbmtub3duOwogCkBAIC0xMjIzLDM4ICsxMTkxLDM4IEBACiAgIHJldHVybiBtX1RleHRsaW5lRGlyOwogfQogCi1ib29sIENQREZfVGV4dFBhZ2U6OklzSHlwaGVuKEZYX1dDSEFSIGN1ckNoYXIpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgc3RyQ3VyVGV4dCA9IG1fVGVtcFRleHRCdWYuTWFrZVN0cmluZygpOwotICBpZiAoc3RyQ3VyVGV4dC5Jc0VtcHR5KCkpCi0gICAgc3RyQ3VyVGV4dCA9IG1fVGV4dEJ1Zi5Bc1N0cmluZ0MoKTsKLSAgRlhfU1RSU0laRSBuQ291bnQgPSBzdHJDdXJUZXh0LkdldExlbmd0aCgpOwotICBpbnQgbkluZGV4ID0gbkNvdW50IC0gMTsKLSAgRlhfV0NIQVIgd2NUbXAgPSBzdHJDdXJUZXh0LkdldEF0KG5JbmRleCk7Ci0gIHdoaWxlICh3Y1RtcCA9PSAweDIwICYmIG5JbmRleCA8PSBuQ291bnQgLSAxICYmIG5JbmRleCA+PSAwKQotICAgIHdjVG1wID0gc3RyQ3VyVGV4dC5HZXRBdCgtLW5JbmRleCk7Ci0gIGlmICgweDJEID09IHdjVG1wIHx8IDB4QUQgPT0gd2NUbXApIHsKLSAgICBpZiAoLS1uSW5kZXggPiAwKSB7Ci0gICAgICBGWF9XQ0hBUiBwcmVDaGFyID0gc3RyQ3VyVGV4dC5HZXRBdCgobkluZGV4KSk7Ci0gICAgICBpZiAoKChwcmVDaGFyID49IEwnQScgJiYgcHJlQ2hhciA8PSBMJ1onKSB8fAotICAgICAgICAgICAocHJlQ2hhciA+PSBMJ2EnICYmIHByZUNoYXIgPD0gTCd6JykpICYmCi0gICAgICAgICAgKChjdXJDaGFyID49IEwnQScgJiYgY3VyQ2hhciA8PSBMJ1onKSB8fAotICAgICAgICAgICAoY3VyQ2hhciA+PSBMJ2EnICYmIGN1ckNoYXIgPD0gTCd6JykpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBjb25zdCBQQUdFQ0hBUl9JTkZPKiBwcmVJbmZvOwotICAgIGlmICghbV9UZW1wQ2hhckxpc3QuZW1wdHkoKSkKLSAgICAgIHByZUluZm8gPSAmbV9UZW1wQ2hhckxpc3QuYmFjaygpOwotICAgIGVsc2UgaWYgKCFtX0NoYXJMaXN0LmVtcHR5KCkpCi0gICAgICBwcmVJbmZvID0gJm1fQ2hhckxpc3QuYmFjaygpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoRlBERlRFWFRfQ0hBUl9QSUVDRSA9PSBwcmVJbmZvLT5tX0ZsYWcgJiYKLSAgICAgICAgKDB4QUQgPT0gcHJlSW5mby0+bV9Vbmljb2RlIHx8IDB4MkQgPT0gcHJlSW5mby0+bV9Vbmljb2RlKSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQorYm9vbCBDUERGX1RleHRQYWdlOjpJc0h5cGhlbih3Y2hhcl90IGN1ckNoYXIpIGNvbnN0IHsKKyAgV2lkZVN0cmluZ1ZpZXcgY3VyVGV4dCA9IG1fVGVtcFRleHRCdWYuQXNTdHJpbmdWaWV3KCk7CisgIGlmIChjdXJUZXh0LklzRW1wdHkoKSkKKyAgICBjdXJUZXh0ID0gbV9UZXh0QnVmLkFzU3RyaW5nVmlldygpOworCisgIGlmIChjdXJUZXh0LklzRW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYXV0byBpdGVyID0gY3VyVGV4dC5yYmVnaW4oKTsKKyAgZm9yICg7IChpdGVyICsgMSkgIT0gY3VyVGV4dC5yZW5kKCkgJiYgKml0ZXIgPT0gMHgyMDsgaXRlcisrKSB7CisgICAgLy8gRG8gbm90aGluZwogICB9Ci0gIHJldHVybiBmYWxzZTsKKworICBpZiAoIUlzSHlwaGVuQ29kZSgqaXRlcikpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICgoaXRlciArIDEpICE9IGN1clRleHQucmVuZCgpKSB7CisgICAgaXRlcisrOworICAgIGlmIChGWFNZU19pc3dhbHBoYSgqaXRlcikgJiYgRlhTWVNfaXN3YWxwaGEoKml0ZXIpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBjb25zdCBQQUdFQ0hBUl9JTkZPKiBwcmVJbmZvOworICBpZiAoIW1fVGVtcENoYXJMaXN0LmVtcHR5KCkpCisgICAgcHJlSW5mbyA9ICZtX1RlbXBDaGFyTGlzdC5iYWNrKCk7CisgIGVsc2UgaWYgKCFtX0NoYXJMaXN0LmVtcHR5KCkpCisgICAgcHJlSW5mbyA9ICZtX0NoYXJMaXN0LmJhY2soKTsKKyAgZWxzZQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gRlBERlRFWFRfQ0hBUl9QSUVDRSA9PSBwcmVJbmZvLT5tX0ZsYWcgJiYKKyAgICAgICAgIElzSHlwaGVuQ29kZShwcmVJbmZvLT5tX1VuaWNvZGUpOwogfQogCiBDUERGX1RleHRQYWdlOjpHZW5lcmF0ZUNoYXJhY3RlciBDUERGX1RleHRQYWdlOjpQcm9jZXNzSW5zZXJ0T2JqZWN0KApAQCAtMTI2MywyNiArMTIzMSwzMCBAQAogICBGaW5kUHJldmlvdXNUZXh0T2JqZWN0KCk7CiAgIFRleHRPcmllbnRhdGlvbiBXcml0aW5nTW9kZSA9IEdldFRleHRPYmplY3RXcml0aW5nTW9kZShwT2JqKTsKICAgaWYgKFdyaXRpbmdNb2RlID09IFRleHRPcmllbnRhdGlvbjo6VW5rbm93bikKLSAgICBXcml0aW5nTW9kZSA9IEdldFRleHRPYmplY3RXcml0aW5nTW9kZShtX3BQcmVUZXh0T2JqKTsKKyAgICBXcml0aW5nTW9kZSA9IEdldFRleHRPYmplY3RXcml0aW5nTW9kZShtX3BQcmVUZXh0T2JqLkdldCgpKTsKKworICBzaXplX3Qgbkl0ZW0gPSBtX3BQcmVUZXh0T2JqLT5Db3VudEl0ZW1zKCk7CisgIGlmIChuSXRlbSA9PSAwKQorICAgIHJldHVybiBHZW5lcmF0ZUNoYXJhY3Rlcjo6Tm9uZTsKKworICBDUERGX1RleHRPYmplY3RJdGVtIFByZXZJdGVtOworICBtX3BQcmVUZXh0T2JqLT5HZXRJdGVtSW5mbyhuSXRlbSAtIDEsICZQcmV2SXRlbSk7CisKKyAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtOworICBwT2JqLT5HZXRJdGVtSW5mbygwLCAmaXRlbSk7CiAKICAgQ0ZYX0Zsb2F0UmVjdCB0aGlzX3JlY3QgPSBwT2JqLT5HZXRSZWN0KCk7CiAgIENGWF9GbG9hdFJlY3QgcHJldl9yZWN0ID0gbV9wUHJlVGV4dE9iai0+R2V0UmVjdCgpOwotICBDUERGX1RleHRPYmplY3RJdGVtIFByZXZJdGVtOwotICBDUERGX1RleHRPYmplY3RJdGVtIGl0ZW07Ci0gIGludCBuSXRlbSA9IG1fcFByZVRleHRPYmotPkNvdW50SXRlbXMoKTsKLSAgbV9wUHJlVGV4dE9iai0+R2V0SXRlbUluZm8obkl0ZW0gLSAxLCAmUHJldkl0ZW0pOwotICBwT2JqLT5HZXRJdGVtSW5mbygwLCAmaXRlbSk7Ci0gIENGWF9XaWRlU3RyaW5nIHdzdHJJdGVtID0KLSAgICAgIHBPYmotPkdldEZvbnQoKS0+VW5pY29kZUZyb21DaGFyQ29kZShpdGVtLm1fQ2hhckNvZGUpOworCisgIFdpZGVTdHJpbmcgd3N0ckl0ZW0gPSBwT2JqLT5HZXRGb250KCktPlVuaWNvZGVGcm9tQ2hhckNvZGUoaXRlbS5tX0NoYXJDb2RlKTsKICAgaWYgKHdzdHJJdGVtLklzRW1wdHkoKSkKLSAgICB3c3RySXRlbSArPSBzdGF0aWNfY2FzdDxGWF9XQ0hBUj4oaXRlbS5tX0NoYXJDb2RlKTsKLSAgRlhfV0NIQVIgY3VyQ2hhciA9IHdzdHJJdGVtLkdldEF0KDApOworICAgIHdzdHJJdGVtICs9IHN0YXRpY19jYXN0PHdjaGFyX3Q+KGl0ZW0ubV9DaGFyQ29kZSk7CisgIHdjaGFyX3QgY3VyQ2hhciA9IHdzdHJJdGVtWzBdOwogICBpZiAoV3JpdGluZ01vZGUgPT0gVGV4dE9yaWVudGF0aW9uOjpIb3Jpem9udGFsKSB7CiAgICAgaWYgKHRoaXNfcmVjdC5IZWlnaHQoKSA+IDQuNSAmJiBwcmV2X3JlY3QuSGVpZ2h0KCkgPiA0LjUpIHsKLSAgICAgIEZYX0ZMT0FUIHRvcCA9Ci0gICAgICAgICAgdGhpc19yZWN0LnRvcCA8IHByZXZfcmVjdC50b3AgPyB0aGlzX3JlY3QudG9wIDogcHJldl9yZWN0LnRvcDsKLSAgICAgIEZYX0ZMT0FUIGJvdHRvbSA9IHRoaXNfcmVjdC5ib3R0b20gPiBwcmV2X3JlY3QuYm90dG9tID8gdGhpc19yZWN0LmJvdHRvbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwcmV2X3JlY3QuYm90dG9tOworICAgICAgZmxvYXQgdG9wID0gdGhpc19yZWN0LnRvcCA8IHByZXZfcmVjdC50b3AgPyB0aGlzX3JlY3QudG9wIDogcHJldl9yZWN0LnRvcDsKKyAgICAgIGZsb2F0IGJvdHRvbSA9IHRoaXNfcmVjdC5ib3R0b20gPiBwcmV2X3JlY3QuYm90dG9tID8gdGhpc19yZWN0LmJvdHRvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwcmV2X3JlY3QuYm90dG9tOwogICAgICAgaWYgKGJvdHRvbSA+PSB0b3ApIHsKICAgICAgICAgcmV0dXJuIElzSHlwaGVuKGN1ckNoYXIpID8gR2VuZXJhdGVDaGFyYWN0ZXI6Okh5cGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHZW5lcmF0ZUNoYXJhY3Rlcjo6TGluZUJyZWFrOwpAQCAtMTI5MSwxMSArMTI2MywxMCBAQAogICB9IGVsc2UgaWYgKFdyaXRpbmdNb2RlID09IFRleHRPcmllbnRhdGlvbjo6VmVydGljYWwpIHsKICAgICBpZiAodGhpc19yZWN0LldpZHRoKCkgPiBwT2JqLT5HZXRGb250U2l6ZSgpICogMC4xZiAmJgogICAgICAgICBwcmV2X3JlY3QuV2lkdGgoKSA+IG1fcFByZVRleHRPYmotPkdldEZvbnRTaXplKCkgKiAwLjFmKSB7Ci0gICAgICBGWF9GTE9BVCBsZWZ0ID0gdGhpc19yZWN0LmxlZnQgPiBtX0N1cmxpbmVSZWN0LmxlZnQgPyB0aGlzX3JlY3QubGVmdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbV9DdXJsaW5lUmVjdC5sZWZ0OwotICAgICAgRlhfRkxPQVQgcmlnaHQgPSB0aGlzX3JlY3QucmlnaHQgPCBtX0N1cmxpbmVSZWN0LnJpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXNfcmVjdC5yaWdodAotICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX0N1cmxpbmVSZWN0LnJpZ2h0OworICAgICAgZmxvYXQgbGVmdCA9IHRoaXNfcmVjdC5sZWZ0ID4gbV9DdXJsaW5lUmVjdC5sZWZ0ID8gdGhpc19yZWN0LmxlZnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fQ3VybGluZVJlY3QubGVmdDsKKyAgICAgIGZsb2F0IHJpZ2h0ID0gdGhpc19yZWN0LnJpZ2h0IDwgbV9DdXJsaW5lUmVjdC5yaWdodCA/IHRoaXNfcmVjdC5yaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbV9DdXJsaW5lUmVjdC5yaWdodDsKICAgICAgIGlmIChyaWdodCA8PSBsZWZ0KSB7CiAgICAgICAgIHJldHVybiBJc0h5cGhlbihjdXJDaGFyKSA/IEdlbmVyYXRlQ2hhcmFjdGVyOjpIeXBoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogR2VuZXJhdGVDaGFyYWN0ZXI6OkxpbmVCcmVhazsKQEAgLTEzMDMsMjEgKzEyNzQsMTkgQEAKICAgICB9CiAgIH0KIAotICBGWF9GTE9BVCBsYXN0X3BvcyA9IFByZXZJdGVtLm1fT3JpZ2luLng7CisgIGZsb2F0IGxhc3RfcG9zID0gUHJldkl0ZW0ubV9PcmlnaW4ueDsKICAgaW50IG5MYXN0V2lkdGggPSBHZXRDaGFyV2lkdGgoUHJldkl0ZW0ubV9DaGFyQ29kZSwgbV9wUHJlVGV4dE9iai0+R2V0Rm9udCgpKTsKLSAgRlhfRkxPQVQgbGFzdF93aWR0aCA9IG5MYXN0V2lkdGggKiBtX3BQcmVUZXh0T2JqLT5HZXRGb250U2l6ZSgpIC8gMTAwMDsKLSAgbGFzdF93aWR0aCA9IEZYU1lTX2ZhYnMobGFzdF93aWR0aCk7CisgIGZsb2F0IGxhc3Rfd2lkdGggPSBuTGFzdFdpZHRoICogbV9wUHJlVGV4dE9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDA7CisgIGxhc3Rfd2lkdGggPSBmYWJzKGxhc3Rfd2lkdGgpOwogICBpbnQgblRoaXNXaWR0aCA9IEdldENoYXJXaWR0aChpdGVtLm1fQ2hhckNvZGUsIHBPYmotPkdldEZvbnQoKSk7Ci0gIEZYX0ZMT0FUIHRoaXNfd2lkdGggPSBuVGhpc1dpZHRoICogcE9iai0+R2V0Rm9udFNpemUoKSAvIDEwMDA7Ci0gIHRoaXNfd2lkdGggPSBGWFNZU19mYWJzKHRoaXNfd2lkdGgpOwotICBGWF9GTE9BVCB0aHJlc2hvbGQgPQotICAgICAgbGFzdF93aWR0aCA+IHRoaXNfd2lkdGggPyBsYXN0X3dpZHRoIC8gNCA6IHRoaXNfd2lkdGggLyA0OworICBmbG9hdCB0aGlzX3dpZHRoID0gblRoaXNXaWR0aCAqIHBPYmotPkdldEZvbnRTaXplKCkgLyAxMDAwOworICB0aGlzX3dpZHRoID0gZmFicyh0aGlzX3dpZHRoKTsKKyAgZmxvYXQgdGhyZXNob2xkID0gbGFzdF93aWR0aCA+IHRoaXNfd2lkdGggPyBsYXN0X3dpZHRoIC8gNCA6IHRoaXNfd2lkdGggLyA0OwogCiAgIENGWF9NYXRyaXggcHJldl9tYXRyaXggPSBtX3BQcmVUZXh0T2JqLT5HZXRUZXh0TWF0cml4KCk7CiAgIHByZXZfbWF0cml4LkNvbmNhdChtX3Blck1hdHJpeCk7CiAKLSAgQ0ZYX01hdHJpeCBwcmV2X3JldmVyc2U7Ci0gIHByZXZfcmV2ZXJzZS5TZXRSZXZlcnNlKHByZXZfbWF0cml4KTsKKyAgQ0ZYX01hdHJpeCBwcmV2X3JldmVyc2UgPSBwcmV2X21hdHJpeC5HZXRJbnZlcnNlKCk7CiAKICAgQ0ZYX1BvaW50RiBwb3MgPSBwcmV2X3JldmVyc2UuVHJhbnNmb3JtKGZvcm1NYXRyaXguVHJhbnNmb3JtKHBPYmotPkdldFBvcygpKSk7CiAgIGlmIChsYXN0X3dpZHRoIDwgdGhpc193aWR0aCkKQEAgLTEzMzIsOCArMTMwMSw3IEBACiAgICAgcmVjdDEuSW50ZXJzZWN0KHJlY3QyKTsKICAgICBpZiAoKHJlY3QxLklzRW1wdHkoKSAmJiByZWN0Mi5IZWlnaHQoKSA+IDUgJiYgcmVjdDMuSGVpZ2h0KCkgPiA1KSB8fAogICAgICAgICAoKHBvcy55ID4gdGhyZXNob2xkICogMiB8fCBwb3MueSA8IHRocmVzaG9sZCAqIC0zKSAmJgotICAgICAgICAgKEZYU1lTX2ZhYnMocG9zLnkpIDwgMSA/IEZYU1lTX2ZhYnMocG9zLngpIDwgRlhTWVNfZmFicyhwb3MueSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0cnVlKSkpIHsKKyAgICAgICAgIChmYWJzKHBvcy55KSA8IDEgPyBmYWJzKHBvcy54KSA8IGZhYnMocG9zLnkpIDogdHJ1ZSkpKSB7CiAgICAgICBiTmV3bGluZSA9IHRydWU7CiAgICAgICBpZiAobkl0ZW0gPiAxKSB7CiAgICAgICAgIENQREZfVGV4dE9iamVjdEl0ZW0gdGVtcEl0ZW07CkBAIC0xMzYxLDI3ICsxMzI5LDI2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogR2VuZXJhdGVDaGFyYWN0ZXI6OkxpbmVCcmVhazsKICAgfQogCi0gIGludDMyX3QgbkNoYXJzID0gcE9iai0+Q291bnRDaGFycygpOwotICBpZiAobkNoYXJzID09IDEgJiYgKDB4MkQgPT0gY3VyQ2hhciB8fCAweEFEID09IGN1ckNoYXIpICYmCisgIGlmIChwT2JqLT5Db3VudENoYXJzKCkgPT0gMSAmJiAoMHgyRCA9PSBjdXJDaGFyIHx8IDB4QUQgPT0gY3VyQ2hhcikgJiYKICAgICAgIElzSHlwaGVuKGN1ckNoYXIpKSB7CiAgICAgcmV0dXJuIEdlbmVyYXRlQ2hhcmFjdGVyOjpIeXBoZW47CiAgIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgUHJldlN0ciA9CisgIFdpZGVTdHJpbmcgUHJldlN0ciA9CiAgICAgICBtX3BQcmVUZXh0T2JqLT5HZXRGb250KCktPlVuaWNvZGVGcm9tQ2hhckNvZGUoUHJldkl0ZW0ubV9DaGFyQ29kZSk7Ci0gIEZYX1dDSEFSIHByZUNoYXIgPSBQcmV2U3RyLkdldEF0KFByZXZTdHIuR2V0TGVuZ3RoKCkgLSAxKTsKKyAgd2NoYXJfdCBwcmVDaGFyID0gUHJldlN0ci5MYXN0KCk7CiAgIENGWF9NYXRyaXggbWF0cml4ID0gcE9iai0+R2V0VGV4dE1hdHJpeCgpOwogICBtYXRyaXguQ29uY2F0KGZvcm1NYXRyaXgpOwogCi0gIHRocmVzaG9sZCA9IChGWF9GTE9BVCkobkxhc3RXaWR0aCA+IG5UaGlzV2lkdGggPyBuTGFzdFdpZHRoIDogblRoaXNXaWR0aCk7CisgIHRocmVzaG9sZCA9IChmbG9hdCkobkxhc3RXaWR0aCA+IG5UaGlzV2lkdGggPyBuTGFzdFdpZHRoIDogblRoaXNXaWR0aCk7CiAgIHRocmVzaG9sZCA9IHRocmVzaG9sZCA+IDQwMAogICAgICAgICAgICAgICAgICAgPyAodGhyZXNob2xkIDwgNzAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aHJlc2hvbGQgLyA0CiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAodGhyZXNob2xkID4gODAwID8gdGhyZXNob2xkIC8gNiA6IHRocmVzaG9sZCAvIDUpKQogICAgICAgICAgICAgICAgICAgOiAodGhyZXNob2xkIC8gMik7CiAgIGlmIChuTGFzdFdpZHRoID49IG5UaGlzV2lkdGgpIHsKLSAgICB0aHJlc2hvbGQgKj0gRlhTWVNfZmFicyhtX3BQcmVUZXh0T2JqLT5HZXRGb250U2l6ZSgpKTsKKyAgICB0aHJlc2hvbGQgKj0gZmFicyhtX3BQcmVUZXh0T2JqLT5HZXRGb250U2l6ZSgpKTsKICAgfSBlbHNlIHsKLSAgICB0aHJlc2hvbGQgKj0gRlhTWVNfZmFicyhwT2JqLT5HZXRGb250U2l6ZSgpKTsKKyAgICB0aHJlc2hvbGQgKj0gZmFicyhwT2JqLT5HZXRGb250U2l6ZSgpKTsKICAgICB0aHJlc2hvbGQgPSBtYXRyaXguVHJhbnNmb3JtRGlzdGFuY2UodGhyZXNob2xkKTsKICAgICB0aHJlc2hvbGQgPSBwcmV2X3JldmVyc2UuVHJhbnNmb3JtRGlzdGFuY2UodGhyZXNob2xkKTsKICAgfQpAQCAtMTM5MCw4ICsxMzU3LDggQEAKICAgICAgICh0aHJlc2hvbGQgPCAxLjM5MDAxICYmIHRocmVzaG9sZCA+IDEuMzg5OTkpKSB7CiAgICAgdGhyZXNob2xkICo9IDEuNTsKICAgfQotICBpZiAoRlhTWVNfZmFicyhsYXN0X3BvcyArIGxhc3Rfd2lkdGggLSBwb3MueCkgPiB0aHJlc2hvbGQgJiYKLSAgICAgIGN1ckNoYXIgIT0gTCcgJyAmJiBwcmVDaGFyICE9IEwnICcpIHsKKyAgaWYgKGZhYnMobGFzdF9wb3MgKyBsYXN0X3dpZHRoIC0gcG9zLngpID4gdGhyZXNob2xkICYmIGN1ckNoYXIgIT0gTCcgJyAmJgorICAgICAgcHJlQ2hhciAhPSBMJyAnKSB7CiAgICAgaWYgKGN1ckNoYXIgIT0gTCcgJyAmJiBwcmVDaGFyICE9IEwnICcpIHsKICAgICAgIGlmICgocG9zLnggLSBsYXN0X3BvcyAtIGxhc3Rfd2lkdGgpID4gdGhyZXNob2xkIHx8CiAgICAgICAgICAgKGxhc3RfcG9zIC0gcG9zLnggLSBsYXN0X3dpZHRoKSA+IHRocmVzaG9sZCkgewpAQCAtMTQxNiwxMSArMTM4MywxMSBAQAogICBDRlhfRmxvYXRSZWN0IHJjUHJlT2JqID0gcFRleHRPYmoyLT5HZXRSZWN0KCk7CiAgIENGWF9GbG9hdFJlY3QgcmNDdXJPYmogPSBwVGV4dE9iajEtPkdldFJlY3QoKTsKICAgaWYgKHJjUHJlT2JqLklzRW1wdHkoKSAmJiByY0N1ck9iai5Jc0VtcHR5KCkpIHsKLSAgICBGWF9GTE9BVCBkYlhkaWYgPSBGWFNZU19mYWJzKHJjUHJlT2JqLmxlZnQgLSByY0N1ck9iai5sZWZ0KTsKKyAgICBmbG9hdCBkYlhkaWYgPSBmYWJzKHJjUHJlT2JqLmxlZnQgLSByY0N1ck9iai5sZWZ0KTsKICAgICBzaXplX3QgbkNvdW50ID0gbV9DaGFyTGlzdC5zaXplKCk7CiAgICAgaWYgKG5Db3VudCA+PSAyKSB7CiAgICAgICBQQUdFQ0hBUl9JTkZPIHBlckNoYXJUZW1wID0gbV9DaGFyTGlzdFtuQ291bnQgLSAyXTsKLSAgICAgIEZYX0ZMT0FUIGRiU3BhY2UgPSBwZXJDaGFyVGVtcC5tX0NoYXJCb3guV2lkdGgoKTsKKyAgICAgIGZsb2F0IGRiU3BhY2UgPSBwZXJDaGFyVGVtcC5tX0NoYXJCb3guV2lkdGgoKTsKICAgICAgIGlmIChkYlhkaWYgPiBkYlNwYWNlKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQpAQCAtMTQyOSwyNCArMTM5NiwyNCBAQAogICAgIHJjUHJlT2JqLkludGVyc2VjdChyY0N1ck9iaik7CiAgICAgaWYgKHJjUHJlT2JqLklzRW1wdHkoKSkKICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAoRlhTWVNfZmFicyhyY1ByZU9iai5XaWR0aCgpIC0gcmNDdXJPYmouV2lkdGgoKSkgPgotICAgICAgICByY0N1ck9iai5XaWR0aCgpIC8gMikgeworICAgIGlmIChmYWJzKHJjUHJlT2JqLldpZHRoKCkgLSByY0N1ck9iai5XaWR0aCgpKSA+IHJjQ3VyT2JqLldpZHRoKCkgLyAyKSB7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmIChwVGV4dE9iajItPkdldEZvbnRTaXplKCkgIT0gcFRleHRPYmoxLT5HZXRGb250U2l6ZSgpKQogICAgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIGludCBuUHJlQ291bnQgPSBwVGV4dE9iajItPkNvdW50SXRlbXMoKTsKLSAgaW50IG5DdXJDb3VudCA9IHBUZXh0T2JqMS0+Q291bnRJdGVtcygpOwotICBpZiAoblByZUNvdW50ICE9IG5DdXJDb3VudCkKKworICBzaXplX3QgblByZUNvdW50ID0gcFRleHRPYmoyLT5Db3VudEl0ZW1zKCk7CisgIGlmIChuUHJlQ291bnQgIT0gcFRleHRPYmoxLT5Db3VudEl0ZW1zKCkpCiAgICAgcmV0dXJuIGZhbHNlOworCiAgIC8vIElmIGJvdGggb2JqZWN0cyBoYXZlIG5vIGl0ZW1zLCBjb25zaWRlciB0aGVtIHNhbWUuCi0gIGlmICghblByZUNvdW50KQorICBpZiAoblByZUNvdW50ID09IDApCiAgICAgcmV0dXJuIHRydWU7CiAKICAgQ1BERl9UZXh0T2JqZWN0SXRlbSBpdGVtUGVyOwogICBDUERGX1RleHRPYmplY3RJdGVtIGl0ZW1DdXI7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgblByZUNvdW50OyBpKyspIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuUHJlQ291bnQ7ICsraSkgewogICAgIHBUZXh0T2JqMi0+R2V0SXRlbUluZm8oaSwgJml0ZW1QZXIpOwogICAgIHBUZXh0T2JqMS0+R2V0SXRlbUluZm8oaSwgJml0ZW1DdXIpOwogICAgIGlmIChpdGVtQ3VyLm1fQ2hhckNvZGUgIT0gaXRlbVBlci5tX0NoYXJDb2RlKQpAQCAtMTQ1NCwxMiArMTQyMSwxMiBAQAogICB9CiAKICAgQ0ZYX1BvaW50RiBkaWZmID0gcFRleHRPYmoxLT5HZXRQb3MoKSAtIHBUZXh0T2JqMi0+R2V0UG9zKCk7Ci0gIEZYX0ZMT0FUIGZvbnRfc2l6ZSA9IHBUZXh0T2JqMi0+R2V0Rm9udFNpemUoKTsKLSAgRlhfRkxPQVQgY2hhcl9zaXplID0gR2V0Q2hhcldpZHRoKGl0ZW1QZXIubV9DaGFyQ29kZSwgcFRleHRPYmoyLT5HZXRGb250KCkpOwotICBGWF9GTE9BVCBtYXhfcHJlX3NpemUgPQorICBmbG9hdCBmb250X3NpemUgPSBwVGV4dE9iajItPkdldEZvbnRTaXplKCk7CisgIGZsb2F0IGNoYXJfc2l6ZSA9IEdldENoYXJXaWR0aChpdGVtUGVyLm1fQ2hhckNvZGUsIHBUZXh0T2JqMi0+R2V0Rm9udCgpKTsKKyAgZmxvYXQgbWF4X3ByZV9zaXplID0KICAgICAgIHN0ZDo6bWF4KHN0ZDo6bWF4KHJjUHJlT2JqLkhlaWdodCgpLCByY1ByZU9iai5XaWR0aCgpKSwgZm9udF9zaXplKTsKLSAgaWYgKEZYU1lTX2ZhYnMoZGlmZi54KSA+IGNoYXJfc2l6ZSAqIGZvbnRfc2l6ZSAvIDEwMDAgKiAwLjkgfHwKLSAgICAgIEZYU1lTX2ZhYnMoZGlmZi55KSA+IG1heF9wcmVfc2l6ZSAvIDgpIHsKKyAgaWYgKGZhYnMoZGlmZi54KSA+IGNoYXJfc2l6ZSAqIGZvbnRfc2l6ZSAvIDEwMDAgKiAwLjkgfHwKKyAgICAgIGZhYnMoZGlmZi55KSA+IG1heF9wcmVfc2l6ZSAvIDgpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KICAgcmV0dXJuIHRydWU7CkBAIC0xNDgyLDcgKzE0NDksNyBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgQ1BERl9UZXh0UGFnZTo6R2VuZXJhdGVDaGFySW5mbyhGWF9XQ0hBUiB1bmljb2RlLCBQQUdFQ0hBUl9JTkZPJiBpbmZvKSB7Citib29sIENQREZfVGV4dFBhZ2U6OkdlbmVyYXRlQ2hhckluZm8od2NoYXJfdCB1bmljb2RlLCBQQUdFQ0hBUl9JTkZPJiBpbmZvKSB7CiAgIGNvbnN0IFBBR0VDSEFSX0lORk8qIHByZUNoYXI7CiAgIGlmICghbV9UZW1wQ2hhckxpc3QuZW1wdHkoKSkKICAgICBwcmVDaGFyID0gJm1fVGVtcENoYXJMaXN0LmJhY2soKTsKQEAgLTE1MDMsOCArMTQ3MCw4IEBACiAgICAgICAgIEdldENoYXJXaWR0aChwcmVDaGFyLT5tX0NoYXJDb2RlLCBwcmVDaGFyLT5tX3BUZXh0T2JqLT5HZXRGb250KCkpOwogICB9CiAKLSAgRlhfRkxPQVQgZkZvbnRTaXplID0gcHJlQ2hhci0+bV9wVGV4dE9iaiA/IHByZUNoYXItPm1fcFRleHRPYmotPkdldEZvbnRTaXplKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHByZUNoYXItPm1fQ2hhckJveC5IZWlnaHQoKTsKKyAgZmxvYXQgZkZvbnRTaXplID0gcHJlQ2hhci0+bV9wVGV4dE9iaiA/IHByZUNoYXItPm1fcFRleHRPYmotPkdldEZvbnRTaXplKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHByZUNoYXItPm1fQ2hhckJveC5IZWlnaHQoKTsKICAgaWYgKCFmRm9udFNpemUpCiAgICAgZkZvbnRTaXplID0ga0RlZmF1bHRGb250U2l6ZTsKIApkaWZmIC0tZ2l0IGEvY29yZS9mcGRmdGV4dC9jcGRmX3RleHRwYWdlLmggYi9jb3JlL2ZwZGZ0ZXh0L2NwZGZfdGV4dHBhZ2UuaAppbmRleCA5MTk0MmQxLi41MWQwNjYwIDEwMDY0NAotLS0gYS9jb3JlL2ZwZGZ0ZXh0L2NwZGZfdGV4dHBhZ2UuaAorKysgYi9jb3JlL2ZwZGZ0ZXh0L2NwZGZfdGV4dHBhZ2UuaApAQCAtMTEsOSArMTEsMTAgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2VvYmplY3RsaXN0LmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3dpZGV0ZXh0YnVmLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogCiBjbGFzcyBDUERGX0ZvbnQ7CiBjbGFzcyBDUERGX0Zvcm1PYmplY3Q7CkBAIC0yNCw3ICsyNSw2IEBACiAjZGVmaW5lIEZQREZURVhUX01BVENIV0hPTEVXT1JEIDB4MDAwMDAwMDIKICNkZWZpbmUgRlBERlRFWFRfQ09OU0VDVVRJVkUgMHgwMDAwMDAwNAogCi0jZGVmaW5lIEZQREZURVhUX0NIQVJfRVJST1IgLTEKICNkZWZpbmUgRlBERlRFWFRfQ0hBUl9OT1JNQUwgMAogI2RlZmluZSBGUERGVEVYVF9DSEFSX0dFTkVSQVRFRCAxCiAjZGVmaW5lIEZQREZURVhUX0NIQVJfVU5VTklDT0RFIDIKQEAgLTM0LDEwICszNCw5IEBACiAjZGVmaW5lIFRFWFRfU1BBQ0VfQ0hBUiBMJyAnCiAjZGVmaW5lIFRFWFRfTElORUZFRURfQ0hBUiBMJ1xuJwogI2RlZmluZSBURVhUX1JFVFVSTl9DSEFSIEwnXHInCisjZGVmaW5lIFRFWFRfSFlQSEVOX0NIQVIgTCctJwogI2RlZmluZSBURVhUX0VNUFRZIEwiIgotI2RlZmluZSBURVhUX1NQQUNFIEwiICIKLSNkZWZpbmUgVEVYVF9SRVRVUk5fTElORUZFRUQgTCJcclxuIgotI2RlZmluZSBURVhUX0xJTkVGRUVEIEwiXG4iCisjZGVmaW5lIFRFWFRfSFlQSEVOIEwiLSIKICNkZWZpbmUgVEVYVF9DSEFSUkFUSU9fR0FQREVMVEEgMC4wNzAKIAogZW51bSBjbGFzcyBGUERGVGV4dF9NYXJrZWRDb250ZW50IHsgUGFzcyA9IDAsIERvbmUsIERlbGF5IH07CkBAIC00OSwxMyArNDgsMTMgQEAKICAgRlBERl9DSEFSX0lORk8oKTsKICAgfkZQREZfQ0hBUl9JTkZPKCk7CiAKLSAgRlhfV0NIQVIgbV9Vbmljb2RlOwotICBGWF9XQ0hBUiBtX0NoYXJjb2RlOworICB3Y2hhcl90IG1fVW5pY29kZTsKKyAgd2NoYXJfdCBtX0NoYXJjb2RlOwogICBpbnQzMl90IG1fRmxhZzsKLSAgRlhfRkxPQVQgbV9Gb250U2l6ZTsKKyAgZmxvYXQgbV9Gb250U2l6ZTsKICAgQ0ZYX1BvaW50RiBtX09yaWdpbjsKICAgQ0ZYX0Zsb2F0UmVjdCBtX0NoYXJCb3g7Ci0gIENQREZfVGV4dE9iamVjdCogbV9wVGV4dE9iajsKKyAgVW5vd25lZFB0cjxDUERGX1RleHRPYmplY3Q+IG1fcFRleHRPYmo7CiAgIENGWF9NYXRyaXggbV9NYXRyaXg7CiB9OwogCkBAIC03MiwxNiArNzEsMjAgQEAKIAogICBpbnQgbV9JbmRleDsKICAgaW50IG1fQ2hhckNvZGU7Ci0gIEZYX1dDSEFSIG1fVW5pY29kZTsKKyAgd2NoYXJfdCBtX1VuaWNvZGU7CiAgIGludDMyX3QgbV9GbGFnOwogICBDRlhfUG9pbnRGIG1fT3JpZ2luOwogICBDRlhfRmxvYXRSZWN0IG1fQ2hhckJveDsKLSAgQ1BERl9UZXh0T2JqZWN0KiBtX3BUZXh0T2JqOworICBVbm93bmVkUHRyPENQREZfVGV4dE9iamVjdD4gbV9wVGV4dE9iajsKICAgQ0ZYX01hdHJpeCBtX01hdHJpeDsKIH07CiAKIHN0cnVjdCBQREZURVhUX09iaiB7Ci0gIENQREZfVGV4dE9iamVjdCogbV9wVGV4dE9iajsKKyAgUERGVEVYVF9PYmooKTsKKyAgUERGVEVYVF9PYmooY29uc3QgUERGVEVYVF9PYmomIHRoYXQpOworICB+UERGVEVYVF9PYmooKTsKKworICBVbm93bmVkUHRyPENQREZfVGV4dE9iamVjdD4gbV9wVGV4dE9iajsKICAgQ0ZYX01hdHJpeCBtX2Zvcm1NYXRyaXg7CiB9OwogCkBAIC05OSwxNCArMTAyLDE2IEBACiAgIHZvaWQgR2V0Q2hhckluZm8oaW50IGluZGV4LCBGUERGX0NIQVJfSU5GTyogaW5mbykgY29uc3Q7CiAgIHN0ZDo6dmVjdG9yPENGWF9GbG9hdFJlY3Q+IEdldFJlY3RBcnJheShpbnQgc3RhcnQsIGludCBuQ291bnQpIGNvbnN0OwogICBpbnQgR2V0SW5kZXhBdFBvcyhjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgY29uc3QgQ0ZYX1NpemVGJiB0b2xlcmFuY2UpIGNvbnN0OwotICBDRlhfV2lkZVN0cmluZyBHZXRUZXh0QnlSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0OwotICBDRlhfV2lkZVN0cmluZyBHZXRQYWdlVGV4dChpbnQgc3RhcnQgPSAwLCBpbnQgbkNvdW50ID0gLTEpIGNvbnN0OworICBXaWRlU3RyaW5nIEdldFRleHRCeVJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyBzdHJpbmcgd2l0aCB0aGUgdGV4dCBmcm9tIHxtX1RleHRCdWZ8IHRoYXQgYXJlIGNvdmVyZWQgYnkgdGhlIGlucHV0CisgIC8vIHJhbmdlLiB8c3RhcnR8IGFuZCB8Y291bnR8IGFyZSBpbiB0ZXJtcyBvZiB0aGUgbV9DaGFySW5kZXgsIHNvIHRoZSByYW5nZQorICAvLyB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIGFwcHJvcHJpYXRlIGluZGljZXMuCisgIFdpZGVTdHJpbmcgR2V0UGFnZVRleHQoaW50IHN0YXJ0LCBpbnQgY291bnQpIGNvbnN0OworICBXaWRlU3RyaW5nIEdldEFsbFBhZ2VUZXh0KCkgY29uc3QgeyByZXR1cm4gR2V0UGFnZVRleHQoMCwgQ291bnRDaGFycygpKTsgfQorCiAgIGludCBDb3VudFJlY3RzKGludCBzdGFydCwgaW50IG5Db3VudCk7Ci0gIHZvaWQgR2V0UmVjdChpbnQgcmVjdEluZGV4LAotICAgICAgICAgICAgICAgRlhfRkxPQVQmIGxlZnQsCi0gICAgICAgICAgICAgICBGWF9GTE9BVCYgdG9wLAotICAgICAgICAgICAgICAgRlhfRkxPQVQmIHJpZ2h0LAotICAgICAgICAgICAgICAgRlhfRkxPQVQmIGJvdHRvbSkgY29uc3Q7CisgIGJvb2wgR2V0UmVjdChpbnQgcmVjdEluZGV4LCBDRlhfRmxvYXRSZWN0KiBwUmVjdCkgY29uc3Q7CiAKICAgc3RhdGljIGJvb2wgSXNSZWN0SW50ZXJzZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdDIpOwpAQCAtMTI1LDcgKzEzMCw3IEBACiAgICAgSHlwaGVuLAogICB9OwogCi0gIGJvb2wgSXNIeXBoZW4oRlhfV0NIQVIgY3VyQ2hhcik7CisgIGJvb2wgSXNIeXBoZW4od2NoYXJfdCBjdXJDaGFyKSBjb25zdDsKICAgYm9vbCBJc0NvbnRyb2xDaGFyKGNvbnN0IFBBR0VDSEFSX0lORk8mIGNoYXJJbmZvKTsKICAgdm9pZCBQcm9jZXNzT2JqZWN0KCk7CiAgIHZvaWQgUHJvY2Vzc0Zvcm1PYmplY3QoQ1BERl9Gb3JtT2JqZWN0KiBwRm9ybU9iaiwKQEAgLTEzNyw3ICsxNDIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUGFnZU9iamVjdExpc3Q6OmNvbnN0X2l0ZXJhdG9yIE9ialBvcyk7CiAgIEdlbmVyYXRlQ2hhcmFjdGVyIFByb2Nlc3NJbnNlcnRPYmplY3QoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwT2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIGZvcm1NYXRyaXgpOwotICBib29sIEdlbmVyYXRlQ2hhckluZm8oRlhfV0NIQVIgdW5pY29kZSwgUEFHRUNIQVJfSU5GTyYgaW5mbyk7CisgIGJvb2wgR2VuZXJhdGVDaGFySW5mbyh3Y2hhcl90IHVuaWNvZGUsIFBBR0VDSEFSX0lORk8mIGluZm8pOwogICBib29sIElzU2FtZUFzUHJlVGV4dE9iamVjdChDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUERGX1BhZ2VPYmplY3RMaXN0KiBwT2JqTGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlT2JqZWN0TGlzdDo6Y29uc3RfaXRlcmF0b3IgT2JqUG9zKTsKQEAgLTE0OCwyNiArMTUzLDI2IEBACiAgIHZvaWQgUHJvY2Vzc01hcmtlZENvbnRlbnQoUERGVEVYVF9PYmogcE9iaik7CiAgIHZvaWQgQ2hlY2tNYXJrZWRDb250ZW50T2JqZWN0KGludDMyX3QmIHN0YXJ0LCBpbnQzMl90JiBuQ291bnQpIGNvbnN0OwogICB2b2lkIEZpbmRQcmV2aW91c1RleHRPYmplY3QoKTsKLSAgdm9pZCBBZGRDaGFySW5mb0J5TFJEaXJlY3Rpb24oRlhfV0NIQVIgd0NoYXIsIFBBR0VDSEFSX0lORk8gaW5mbyk7Ci0gIHZvaWQgQWRkQ2hhckluZm9CeVJMRGlyZWN0aW9uKEZYX1dDSEFSIHdDaGFyLCBQQUdFQ0hBUl9JTkZPIGluZm8pOworICB2b2lkIEFkZENoYXJJbmZvQnlMUkRpcmVjdGlvbih3Y2hhcl90IHdDaGFyLCBQQUdFQ0hBUl9JTkZPIGluZm8pOworICB2b2lkIEFkZENoYXJJbmZvQnlSTERpcmVjdGlvbih3Y2hhcl90IHdDaGFyLCBQQUdFQ0hBUl9JTkZPIGluZm8pOwogICBUZXh0T3JpZW50YXRpb24gR2V0VGV4dE9iamVjdFdyaXRpbmdNb2RlKAogICAgICAgY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaikgY29uc3Q7CiAgIFRleHRPcmllbnRhdGlvbiBGaW5kVGV4dGxpbmVGbG93T3JpZW50YXRpb24oKSBjb25zdDsKLSAgdm9pZCBBcHBlbmRHZW5lcmF0ZWRDaGFyYWN0ZXIoRlhfV0NIQVIgdW5pY29kZSwgY29uc3QgQ0ZYX01hdHJpeCYgZm9ybU1hdHJpeCk7CisgIHZvaWQgQXBwZW5kR2VuZXJhdGVkQ2hhcmFjdGVyKHdjaGFyX3QgdW5pY29kZSwgY29uc3QgQ0ZYX01hdHJpeCYgZm9ybU1hdHJpeCk7CiAKICAgdm9pZCBTd2FwVGVtcFRleHRCdWYoaW50MzJfdCBpQ2hhckxpc3RTdGFydEFwcGVuZCwgaW50MzJfdCBpQnVmU3RhcnRBcHBlbmQpOwogICBib29sIElzUmlnaHRUb0xlZnQoY29uc3QgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRm9udCogcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgbkl0ZW1zKSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuSXRlbXMpIGNvbnN0OwogCi0gIGNvbnN0IENQREZfUGFnZSogY29uc3QgbV9wUGFnZTsKKyAgVW5vd25lZFB0cjxjb25zdCBDUERGX1BhZ2U+IGNvbnN0IG1fcFBhZ2U7CiAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBtX0NoYXJJbmRleDsKICAgc3RkOjpkZXF1ZTxQQUdFQ0hBUl9JTkZPPiBtX0NoYXJMaXN0OwogICBzdGQ6OmRlcXVlPFBBR0VDSEFSX0lORk8+IG1fVGVtcENoYXJMaXN0OwogICBDRlhfV2lkZVRleHRCdWYgbV9UZXh0QnVmOwogICBDRlhfV2lkZVRleHRCdWYgbV9UZW1wVGV4dEJ1ZjsKICAgY29uc3QgRlBERlRleHRfRGlyZWN0aW9uIG1fcGFyc2VyZmxhZzsKLSAgQ1BERl9UZXh0T2JqZWN0KiBtX3BQcmVUZXh0T2JqOworICBVbm93bmVkUHRyPENQREZfVGV4dE9iamVjdD4gbV9wUHJlVGV4dE9iajsKICAgQ0ZYX01hdHJpeCBtX3Blck1hdHJpeDsKICAgYm9vbCBtX2JJc1BhcnNlZDsKICAgQ0ZYX01hdHJpeCBtX0Rpc3BsYXlNYXRyaXg7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZ0ZXh0L2NwZGZfdGV4dHBhZ2VmaW5kLmNwcCBiL2NvcmUvZnBkZnRleHQvY3BkZl90ZXh0cGFnZWZpbmQuY3BwCmluZGV4IGE3OWI1ZTcuLjUyZmRiNGEgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZnRleHQvY3BkZl90ZXh0cGFnZWZpbmQuY3BwCisrKyBiL2NvcmUvZnBkZnRleHQvY3BkZl90ZXh0cGFnZWZpbmQuY3BwCkBAIC0xNyw3ICsxNyw3IEBACiAKIG5hbWVzcGFjZSB7CiAKLWJvb2wgSXNJZ25vcmVTcGFjZUNoYXJhY3RlcihGWF9XQ0hBUiBjdXJDaGFyKSB7Citib29sIElzSWdub3JlU3BhY2VDaGFyYWN0ZXIod2NoYXJfdCBjdXJDaGFyKSB7CiAgIGlmIChjdXJDaGFyIDwgMjU1IHx8IChjdXJDaGFyID49IDB4MDYwMCAmJiBjdXJDaGFyIDw9IDB4MDZGRikgfHwKICAgICAgIChjdXJDaGFyID49IDB4RkU3MCAmJiBjdXJDaGFyIDw9IDB4RkVGRikgfHwKICAgICAgIChjdXJDaGFyID49IDB4RkI1MCAmJiBjdXJDaGFyIDw9IDB4RkRGRikgfHwKQEAgLTM2LDE0ICszNiwxMiBAQAogQ1BERl9UZXh0UGFnZUZpbmQ6OkNQREZfVGV4dFBhZ2VGaW5kKGNvbnN0IENQREZfVGV4dFBhZ2UqIHBUZXh0UGFnZSkKICAgICA6IG1fcFRleHRQYWdlKHBUZXh0UGFnZSksCiAgICAgICBtX2ZsYWdzKDApLAotICAgICAgbV9maW5kTmV4dFN0YXJ0KC0xKSwKLSAgICAgIG1fZmluZFByZVN0YXJ0KC0xKSwKICAgICAgIG1fYk1hdGNoQ2FzZShmYWxzZSksCiAgICAgICBtX2JNYXRjaFdob2xlV29yZChmYWxzZSksCiAgICAgICBtX3Jlc1N0YXJ0KDApLAogICAgICAgbV9yZXNFbmQoLTEpLAogICAgICAgbV9Jc0ZpbmQoZmFsc2UpIHsKLSAgbV9zdHJUZXh0ID0gbV9wVGV4dFBhZ2UtPkdldFBhZ2VUZXh0KCk7CisgIG1fc3RyVGV4dCA9IG1fcFRleHRQYWdlLT5HZXRBbGxQYWdlVGV4dCgpOwogICBpbnQgbkNvdW50ID0gcFRleHRQYWdlLT5Db3VudENoYXJzKCk7CiAgIGlmIChuQ291bnQpCiAgICAgbV9DaGFySW5kZXgucHVzaF9iYWNrKDApOwpAQCAtODEsMTQgKzc5LDE0IEBACiAgIHJldHVybiBtX3BUZXh0UGFnZS0+Q2hhckluZGV4RnJvbVRleHRJbmRleChpbmRleCk7CiB9CiAKLWJvb2wgQ1BERl9UZXh0UGFnZUZpbmQ6OkZpbmRGaXJzdChjb25zdCBDRlhfV2lkZVN0cmluZyYgZmluZHdoYXQsCitib29sIENQREZfVGV4dFBhZ2VGaW5kOjpGaW5kRmlyc3QoY29uc3QgV2lkZVN0cmluZyYgZmluZHdoYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydFBvcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPHNpemVfdD4gc3RhcnRQb3MpIHsKICAgaWYgKCFtX3BUZXh0UGFnZSkKICAgICByZXR1cm4gZmFsc2U7CiAgIGlmIChtX3N0clRleHQuSXNFbXB0eSgpIHx8IG1fYk1hdGNoQ2FzZSAhPSAoZmxhZ3MgJiBGUERGVEVYVF9NQVRDSENBU0UpKQotICAgIG1fc3RyVGV4dCA9IG1fcFRleHRQYWdlLT5HZXRQYWdlVGV4dCgpOwotICBDRlhfV2lkZVN0cmluZyBmaW5kd2hhdFN0ciA9IGZpbmR3aGF0OworICAgIG1fc3RyVGV4dCA9IG1fcFRleHRQYWdlLT5HZXRBbGxQYWdlVGV4dCgpOworICBXaWRlU3RyaW5nIGZpbmR3aGF0U3RyID0gZmluZHdoYXQ7CiAgIG1fZmluZFdoYXQgPSBmaW5kd2hhdFN0cjsKICAgbV9mbGFncyA9IGZsYWdzOwogICBtX2JNYXRjaENhc2UgPSBmbGFncyAmIEZQREZURVhUX01BVENIQ0FTRTsKQEAgLTk2LDMwICs5NCwzMiBAQAogICAgIG1fSXNGaW5kID0gZmFsc2U7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KLSAgRlhfU1RSU0laRSBsZW4gPSBmaW5kd2hhdFN0ci5HZXRMZW5ndGgoKTsKKyAgc2l6ZV90IGxlbiA9IGZpbmR3aGF0U3RyLkdldExlbmd0aCgpOwogICBpZiAoIW1fYk1hdGNoQ2FzZSkgewogICAgIGZpbmR3aGF0U3RyLk1ha2VMb3dlcigpOwogICAgIG1fc3RyVGV4dC5NYWtlTG93ZXIoKTsKICAgfQogICBtX2JNYXRjaFdob2xlV29yZCA9ICEhKGZsYWdzICYgRlBERlRFWFRfTUFUQ0hXSE9MRVdPUkQpOwogICBtX2ZpbmROZXh0U3RhcnQgPSBzdGFydFBvczsKLSAgaWYgKHN0YXJ0UG9zID09IC0xKQotICAgIG1fZmluZFByZVN0YXJ0ID0gbV9zdHJUZXh0LkdldExlbmd0aCgpIC0gMTsKLSAgZWxzZQorICBpZiAoIXN0YXJ0UG9zLmhhc192YWx1ZSgpKSB7CisgICAgaWYgKCFtX3N0clRleHQuSXNFbXB0eSgpKQorICAgICAgbV9maW5kUHJlU3RhcnQgPSBtX3N0clRleHQuR2V0TGVuZ3RoKCkgLSAxOworICB9IGVsc2UgewogICAgIG1fZmluZFByZVN0YXJ0ID0gc3RhcnRQb3M7Ci0gIG1fY3NGaW5kV2hhdEFycmF5LmNsZWFyKCk7Ci0gIGludCBpID0gMDsKLSAgd2hpbGUgKGkgPCBsZW4pIHsKLSAgICBpZiAoZmluZHdoYXRTdHIuR2V0QXQoaSkgIT0gJyAnKQotICAgICAgYnJlYWs7Ci0gICAgaSsrOwogICB9CisKKyAgbV9jc0ZpbmRXaGF0QXJyYXkuY2xlYXIoKTsKKyAgc2l6ZV90IGkgPSAwOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpCisgICAgaWYgKGZpbmR3aGF0U3RyW2ldICE9ICcgJykKKyAgICAgIGJyZWFrOwogICBpZiAoaSA8IGxlbikKICAgICBFeHRyYWN0RmluZFdoYXQoZmluZHdoYXRTdHIpOwogICBlbHNlCiAgICAgbV9jc0ZpbmRXaGF0QXJyYXkucHVzaF9iYWNrKGZpbmR3aGF0U3RyKTsKICAgaWYgKG1fY3NGaW5kV2hhdEFycmF5LmVtcHR5KCkpCiAgICAgcmV0dXJuIGZhbHNlOworCiAgIG1fSXNGaW5kID0gdHJ1ZTsKICAgbV9yZXNTdGFydCA9IDA7CiAgIG1fcmVzRW5kID0gLTE7CkBAIC0xMzAsMjcgKzEzMCwyNiBAQAogICBpZiAoIW1fcFRleHRQYWdlKQogICAgIHJldHVybiBmYWxzZTsKICAgbV9yZXNBcnJheS5jbGVhcigpOwotICBpZiAobV9maW5kTmV4dFN0YXJ0ID09IC0xKQorICBpZiAoIW1fZmluZE5leHRTdGFydC5oYXNfdmFsdWUoKSkKICAgICByZXR1cm4gZmFsc2U7CiAgIGlmIChtX3N0clRleHQuSXNFbXB0eSgpKSB7CiAgICAgbV9Jc0ZpbmQgPSBmYWxzZTsKICAgICByZXR1cm4gbV9Jc0ZpbmQ7CiAgIH0KLSAgaW50IHN0ckxlbiA9IG1fc3RyVGV4dC5HZXRMZW5ndGgoKTsKLSAgaWYgKG1fZmluZE5leHRTdGFydCA+IHN0ckxlbiAtIDEpIHsKKyAgc2l6ZV90IHN0ckxlbiA9IG1fc3RyVGV4dC5HZXRMZW5ndGgoKTsKKyAgaWYgKG1fZmluZE5leHRTdGFydC52YWx1ZSgpID4gc3RyTGVuIC0gMSkgewogICAgIG1fSXNGaW5kID0gZmFsc2U7CiAgICAgcmV0dXJuIG1fSXNGaW5kOwogICB9CiAgIGludCBuQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludD4obV9jc0ZpbmRXaGF0QXJyYXkpOwotICBpbnQgblJlc3VsdFBvcyA9IDA7Ci0gIGludCBuU3RhcnRQb3MgPSAwOwotICBuU3RhcnRQb3MgPSBtX2ZpbmROZXh0U3RhcnQ7CisgIE9wdGlvbmFsPHNpemVfdD4gblJlc3VsdFBvcyA9IDA7CisgIHNpemVfdCBuU3RhcnRQb3MgPSBtX2ZpbmROZXh0U3RhcnQudmFsdWUoKTsKICAgYm9vbCBiU3BhY2VTdGFydCA9IGZhbHNlOwogICBmb3IgKGludCBpV29yZCA9IDA7IGlXb3JkIDwgbkNvdW50OyBpV29yZCsrKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgY3NXb3JkID0gbV9jc0ZpbmRXaGF0QXJyYXlbaVdvcmRdOworICAgIFdpZGVTdHJpbmcgY3NXb3JkID0gbV9jc0ZpbmRXaGF0QXJyYXlbaVdvcmRdOwogICAgIGlmIChjc1dvcmQuSXNFbXB0eSgpKSB7CiAgICAgICBpZiAoaVdvcmQgPT0gbkNvdW50IC0gMSkgewotICAgICAgICBGWF9XQ0hBUiBzdHJJbnNlcnQgPSBtX3N0clRleHQuR2V0QXQoblN0YXJ0UG9zKTsKKyAgICAgICAgd2NoYXJfdCBzdHJJbnNlcnQgPSBtX3N0clRleHRbblN0YXJ0UG9zXTsKICAgICAgICAgaWYgKHN0ckluc2VydCA9PSBURVhUX0xJTkVGRUVEX0NIQVIgfHwgc3RySW5zZXJ0ID09IFRFWFRfU1BBQ0VfQ0hBUiB8fAogICAgICAgICAgICAgc3RySW5zZXJ0ID09IFRFWFRfUkVUVVJOX0NIQVIgfHwgc3RySW5zZXJ0ID09IDE2MCkgewogICAgICAgICAgIG5SZXN1bHRQb3MgPSBuU3RhcnRQb3MgKyAxOwpAQCAtMTYyLDI4ICsxNjEsMjcgQEAKICAgICAgIH0KICAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBpbnQgZW5kSW5kZXg7CiAgICAgblJlc3VsdFBvcyA9IG1fc3RyVGV4dC5GaW5kKGNzV29yZC5jX3N0cigpLCBuU3RhcnRQb3MpOwotICAgIGlmIChuUmVzdWx0UG9zID09IC0xKSB7CisgICAgaWYgKCFuUmVzdWx0UG9zLmhhc192YWx1ZSgpKSB7CiAgICAgICBtX0lzRmluZCA9IGZhbHNlOwogICAgICAgcmV0dXJuIG1fSXNGaW5kOwogICAgIH0KLSAgICBlbmRJbmRleCA9IG5SZXN1bHRQb3MgKyBjc1dvcmQuR2V0TGVuZ3RoKCkgLSAxOworICAgIHNpemVfdCBlbmRJbmRleCA9IG5SZXN1bHRQb3MudmFsdWUoKSArIGNzV29yZC5HZXRMZW5ndGgoKSAtIDE7CiAgICAgaWYgKGlXb3JkID09IDApCi0gICAgICBtX3Jlc1N0YXJ0ID0gblJlc3VsdFBvczsKKyAgICAgIG1fcmVzU3RhcnQgPSBuUmVzdWx0UG9zLnZhbHVlKCk7CiAgICAgYm9vbCBiTWF0Y2ggPSB0cnVlOwogICAgIGlmIChpV29yZCAhPSAwICYmICFiU3BhY2VTdGFydCkgewotICAgICAgaW50IFByZVJlc0VuZFBvcyA9IG5TdGFydFBvczsKLSAgICAgIGludCBjdXJDaGFyID0gY3NXb3JkLkdldEF0KDApOwotICAgICAgQ0ZYX1dpZGVTdHJpbmcgbGFzdFdvcmQgPSBtX2NzRmluZFdoYXRBcnJheVtpV29yZCAtIDFdOwotICAgICAgaW50IGxhc3RDaGFyID0gbGFzdFdvcmQuR2V0QXQobGFzdFdvcmQuR2V0TGVuZ3RoKCkgLSAxKTsKLSAgICAgIGlmIChuU3RhcnRQb3MgPT0gblJlc3VsdFBvcyAmJgorICAgICAgc2l6ZV90IFByZVJlc0VuZFBvcyA9IG5TdGFydFBvczsKKyAgICAgIGludCBjdXJDaGFyID0gY3NXb3JkWzBdOworICAgICAgV2lkZVN0cmluZyBsYXN0V29yZCA9IG1fY3NGaW5kV2hhdEFycmF5W2lXb3JkIC0gMV07CisgICAgICBpbnQgbGFzdENoYXIgPSBsYXN0V29yZFtsYXN0V29yZC5HZXRMZW5ndGgoKSAtIDFdOworICAgICAgaWYgKG5TdGFydFBvcyA9PSBuUmVzdWx0UG9zLnZhbHVlKCkgJiYKICAgICAgICAgICAhKElzSWdub3JlU3BhY2VDaGFyYWN0ZXIobGFzdENoYXIpIHx8CiAgICAgICAgICAgICBJc0lnbm9yZVNwYWNlQ2hhcmFjdGVyKGN1ckNoYXIpKSkgewogICAgICAgICBiTWF0Y2ggPSBmYWxzZTsKICAgICAgIH0KLSAgICAgIGZvciAoaW50IGQgPSBQcmVSZXNFbmRQb3M7IGQgPCBuUmVzdWx0UG9zOyBkKyspIHsKLSAgICAgICAgRlhfV0NIQVIgc3RySW5zZXJ0ID0gbV9zdHJUZXh0LkdldEF0KGQpOworICAgICAgZm9yIChzaXplX3QgZCA9IFByZVJlc0VuZFBvczsgZCA8IG5SZXN1bHRQb3MudmFsdWUoKTsgZCsrKSB7CisgICAgICAgIHdjaGFyX3Qgc3RySW5zZXJ0ID0gbV9zdHJUZXh0W2RdOwogICAgICAgICBpZiAoc3RySW5zZXJ0ICE9IFRFWFRfTElORUZFRURfQ0hBUiAmJiBzdHJJbnNlcnQgIT0gVEVYVF9TUEFDRV9DSEFSICYmCiAgICAgICAgICAgICBzdHJJbnNlcnQgIT0gVEVYVF9SRVRVUk5fQ0hBUiAmJiBzdHJJbnNlcnQgIT0gMTYwKSB7CiAgICAgICAgICAgYk1hdGNoID0gZmFsc2U7CkBAIC0xOTEsMTkgKzE4OSwxOSBAQAogICAgICAgICB9CiAgICAgICB9CiAgICAgfSBlbHNlIGlmIChiU3BhY2VTdGFydCkgewotICAgICAgaWYgKG5SZXN1bHRQb3MgPiAwKSB7Ci0gICAgICAgIEZYX1dDSEFSIHN0ckluc2VydCA9IG1fc3RyVGV4dC5HZXRBdChuUmVzdWx0UG9zIC0gMSk7CisgICAgICBpZiAoblJlc3VsdFBvcy52YWx1ZSgpID4gMCkgeworICAgICAgICB3Y2hhcl90IHN0ckluc2VydCA9IG1fc3RyVGV4dFtuUmVzdWx0UG9zLnZhbHVlKCkgLSAxXTsKICAgICAgICAgaWYgKHN0ckluc2VydCAhPSBURVhUX0xJTkVGRUVEX0NIQVIgJiYgc3RySW5zZXJ0ICE9IFRFWFRfU1BBQ0VfQ0hBUiAmJgogICAgICAgICAgICAgc3RySW5zZXJ0ICE9IFRFWFRfUkVUVVJOX0NIQVIgJiYgc3RySW5zZXJ0ICE9IDE2MCkgewogICAgICAgICAgIGJNYXRjaCA9IGZhbHNlOwotICAgICAgICAgIG1fcmVzU3RhcnQgPSBuUmVzdWx0UG9zOworICAgICAgICAgIG1fcmVzU3RhcnQgPSBuUmVzdWx0UG9zLnZhbHVlKCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbV9yZXNTdGFydCA9IG5SZXN1bHRQb3MgLSAxOworICAgICAgICAgIG1fcmVzU3RhcnQgPSBuUmVzdWx0UG9zLnZhbHVlKCkgLSAxOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICAgIGlmIChtX2JNYXRjaFdob2xlV29yZCAmJiBiTWF0Y2gpIHsKLSAgICAgIGJNYXRjaCA9IElzTWF0Y2hXaG9sZVdvcmQobV9zdHJUZXh0LCBuUmVzdWx0UG9zLCBlbmRJbmRleCk7CisgICAgICBiTWF0Y2ggPSBJc01hdGNoV2hvbGVXb3JkKG1fc3RyVGV4dCwgblJlc3VsdFBvcy52YWx1ZSgpLCBlbmRJbmRleCk7CiAgICAgfQogICAgIG5TdGFydFBvcyA9IGVuZEluZGV4ICsgMTsKICAgICBpZiAoIWJNYXRjaCkgewpAQCAtMjE0LDcgKzIxMiw3IEBACiAgICAgICAgIG5TdGFydFBvcyA9IG1fcmVzU3RhcnQgKyBtX2NzRmluZFdoYXRBcnJheVswXS5HZXRMZW5ndGgoKTsKICAgICB9CiAgIH0KLSAgbV9yZXNFbmQgPSBuUmVzdWx0UG9zICsgbV9jc0ZpbmRXaGF0QXJyYXkuYmFjaygpLkdldExlbmd0aCgpIC0gMTsKKyAgbV9yZXNFbmQgPSBuUmVzdWx0UG9zLnZhbHVlKCkgKyBtX2NzRmluZFdoYXRBcnJheS5iYWNrKCkuR2V0TGVuZ3RoKCkgLSAxOwogICBtX0lzRmluZCA9IHRydWU7CiAgIGludCByZXNTdGFydCA9IEdldENoYXJJbmRleChtX3Jlc1N0YXJ0KTsKICAgaW50IHJlc0VuZCA9IEdldENoYXJJbmRleChtX3Jlc0VuZCk7CkBAIC0yMzMsMjMgKzIzMSwyNSBAQAogICBpZiAoIW1fcFRleHRQYWdlKQogICAgIHJldHVybiBmYWxzZTsKICAgbV9yZXNBcnJheS5jbGVhcigpOwotICBpZiAobV9zdHJUZXh0LklzRW1wdHkoKSB8fCBtX2ZpbmRQcmVTdGFydCA8IDApIHsKKyAgaWYgKG1fc3RyVGV4dC5Jc0VtcHR5KCkgfHwgIW1fZmluZFByZVN0YXJ0Lmhhc192YWx1ZSgpKSB7CiAgICAgbV9Jc0ZpbmQgPSBmYWxzZTsKICAgICByZXR1cm4gbV9Jc0ZpbmQ7CiAgIH0KLSAgQ1BERl9UZXh0UGFnZUZpbmQgZmluZEVuZ2luZShtX3BUZXh0UGFnZSk7Ci0gIGJvb2wgcmV0ID0gZmluZEVuZ2luZS5GaW5kRmlyc3QobV9maW5kV2hhdCwgbV9mbGFncyk7CisgIENQREZfVGV4dFBhZ2VGaW5kIGZpbmRFbmdpbmUobV9wVGV4dFBhZ2UuR2V0KCkpOworICBib29sIHJldCA9IGZpbmRFbmdpbmUuRmluZEZpcnN0KG1fZmluZFdoYXQsIG1fZmxhZ3MsIE9wdGlvbmFsPHNpemVfdD4oMCkpOwogICBpZiAoIXJldCkgewogICAgIG1fSXNGaW5kID0gZmFsc2U7CiAgICAgcmV0dXJuIG1fSXNGaW5kOwogICB9Ci0gIGludCBvcmRlciA9IC0xLCBNYXRjaGVkQ291bnQgPSAwOworICBpbnQgb3JkZXIgPSAtMTsKKyAgaW50IE1hdGNoZWRDb3VudCA9IDA7CiAgIHdoaWxlIChyZXQpIHsKICAgICByZXQgPSBmaW5kRW5naW5lLkZpbmROZXh0KCk7CiAgICAgaWYgKHJldCkgewogICAgICAgaW50IG9yZGVyMSA9IGZpbmRFbmdpbmUuR2V0Q3VyT3JkZXIoKTsKICAgICAgIGludCBNYXRjaGVkQ291bnQxID0gZmluZEVuZ2luZS5HZXRNYXRjaGVkQ291bnQoKTsKLSAgICAgIGlmICgoKG9yZGVyMSArIE1hdGNoZWRDb3VudDEpIC0gMSkgPiBtX2ZpbmRQcmVTdGFydCkKKyAgICAgIGludCB0ZW1wID0gb3JkZXIxICsgTWF0Y2hlZENvdW50MTsKKyAgICAgIGlmICh0ZW1wIDwgMCB8fCBzdGF0aWNfY2FzdDxzaXplX3Q+KHRlbXApID4gbV9maW5kUHJlU3RhcnQudmFsdWUoKSArIDEpCiAgICAgICAgIGJyZWFrOwogICAgICAgb3JkZXIgPSBvcmRlcjE7CiAgICAgICBNYXRjaGVkQ291bnQgPSBNYXRjaGVkQ291bnQxOwpAQCAtMjczLDY1ICsyNzMsNjcgQEAKICAgcmV0dXJuIG1fSXNGaW5kOwogfQogCi12b2lkIENQREZfVGV4dFBhZ2VGaW5kOjpFeHRyYWN0RmluZFdoYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZpbmR3aGF0KSB7Cit2b2lkIENQREZfVGV4dFBhZ2VGaW5kOjpFeHRyYWN0RmluZFdoYXQoY29uc3QgV2lkZVN0cmluZyYgZmluZHdoYXQpIHsKICAgaWYgKGZpbmR3aGF0LklzRW1wdHkoKSkKICAgICByZXR1cm47CiAgIGludCBpbmRleCA9IDA7CiAgIHdoaWxlICgxKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgY3NXb3JkID0gVEVYVF9FTVBUWTsKLSAgICBpbnQgcmV0ID0KLSAgICAgICAgRXh0cmFjdFN1YlN0cmluZyhjc1dvcmQsIGZpbmR3aGF0LmNfc3RyKCksIGluZGV4LCBURVhUX1NQQUNFX0NIQVIpOwotICAgIGlmIChjc1dvcmQuSXNFbXB0eSgpKSB7Ci0gICAgICBpZiAocmV0KSB7Ci0gICAgICAgIG1fY3NGaW5kV2hhdEFycmF5LnB1c2hfYmFjayhMIiIpOwotICAgICAgICBpbmRleCsrOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQorICAgIE9wdGlvbmFsPFdpZGVTdHJpbmc+IHdvcmQgPQorICAgICAgICBFeHRyYWN0U3ViU3RyaW5nKGZpbmR3aGF0LmNfc3RyKCksIGluZGV4LCBURVhUX1NQQUNFX0NIQVIpOworICAgIGlmICghd29yZCkKKyAgICAgIGJyZWFrOworCisgICAgaWYgKHdvcmQtPklzRW1wdHkoKSkgeworICAgICAgbV9jc0ZpbmRXaGF0QXJyYXkucHVzaF9iYWNrKEwiIik7CisgICAgICBpbmRleCsrOworICAgICAgY29udGludWU7CiAgICAgfQotICAgIGludCBwb3MgPSAwOwotICAgIHdoaWxlIChwb3MgPCBjc1dvcmQuR2V0TGVuZ3RoKCkpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIGN1clN0ciA9IGNzV29yZC5NaWQocG9zLCAxKTsKLSAgICAgIEZYX1dDSEFSIGN1ckNoYXIgPSBjc1dvcmQuR2V0QXQocG9zKTsKKworICAgIHNpemVfdCBwb3MgPSAwOworICAgIHdoaWxlIChwb3MgPCB3b3JkLT5HZXRMZW5ndGgoKSkgeworICAgICAgV2lkZVN0cmluZyBjdXJTdHIgPSB3b3JkLT5NaWQocG9zLCAxKTsKKyAgICAgIHdjaGFyX3QgY3VyQ2hhciA9IHdvcmQtPm9wZXJhdG9yW10ocG9zKTsKICAgICAgIGlmIChJc0lnbm9yZVNwYWNlQ2hhcmFjdGVyKGN1ckNoYXIpKSB7CiAgICAgICAgIGlmIChwb3MgPiAwICYmIGN1ckNoYXIgPT0gMHgyMDE5KSB7CiAgICAgICAgICAgcG9zKys7CiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgaWYgKHBvcyA+IDApCi0gICAgICAgICAgbV9jc0ZpbmRXaGF0QXJyYXkucHVzaF9iYWNrKGNzV29yZC5NaWQoMCwgcG9zKSk7CisgICAgICAgICAgbV9jc0ZpbmRXaGF0QXJyYXkucHVzaF9iYWNrKHdvcmQtPkxlZnQocG9zKSk7CiAgICAgICAgIG1fY3NGaW5kV2hhdEFycmF5LnB1c2hfYmFjayhjdXJTdHIpOwotICAgICAgICBpZiAocG9zID09IGNzV29yZC5HZXRMZW5ndGgoKSAtIDEpIHsKLSAgICAgICAgICBjc1dvcmQuY2xlYXIoKTsKKyAgICAgICAgaWYgKHBvcyA9PSB3b3JkLT5HZXRMZW5ndGgoKSAtIDEpIHsKKyAgICAgICAgICB3b3JkLT5jbGVhcigpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNzV29yZCA9IGNzV29yZC5SaWdodChjc1dvcmQuR2V0TGVuZ3RoKCkgLSBwb3MgLSAxKTsKKyAgICAgICAgd29yZC5lbXBsYWNlKHdvcmQtPlJpZ2h0KHdvcmQtPkdldExlbmd0aCgpIC0gcG9zIC0gMSkpOwogICAgICAgICBwb3MgPSAwOwogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KICAgICAgIHBvcysrOwogICAgIH0KLSAgICBpZiAoIWNzV29yZC5Jc0VtcHR5KCkpCi0gICAgICBtX2NzRmluZFdoYXRBcnJheS5wdXNoX2JhY2soY3NXb3JkKTsKKworICAgIGlmICghd29yZC0+SXNFbXB0eSgpKQorICAgICAgbV9jc0ZpbmRXaGF0QXJyYXkucHVzaF9iYWNrKHdvcmQudmFsdWUoKSk7CiAgICAgaW5kZXgrKzsKICAgfQogfQogCi1ib29sIENQREZfVGV4dFBhZ2VGaW5kOjpJc01hdGNoV2hvbGVXb3JkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc1BhZ2VUZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmRQb3MpIHsKLSAgRlhfV0NIQVIgY2hhcl9sZWZ0ID0gMDsKLSAgRlhfV0NIQVIgY2hhcl9yaWdodCA9IDA7Ci0gIGludCBjaGFyX2NvdW50ID0gZW5kUG9zIC0gc3RhcnRQb3MgKyAxOwotICBpZiAoY2hhcl9jb3VudCA8IDEpCitib29sIENQREZfVGV4dFBhZ2VGaW5kOjpJc01hdGNoV2hvbGVXb3JkKGNvbnN0IFdpZGVTdHJpbmcmIGNzUGFnZVRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzdGFydFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGVuZFBvcykgeworICBpZiAoc3RhcnRQb3MgPiBlbmRQb3MpCiAgICAgcmV0dXJuIGZhbHNlOwotICBpZiAoY2hhcl9jb3VudCA9PSAxICYmIGNzUGFnZVRleHQuR2V0QXQoc3RhcnRQb3MpID4gMjU1KQorICB3Y2hhcl90IGNoYXJfbGVmdCA9IDA7CisgIHdjaGFyX3QgY2hhcl9yaWdodCA9IDA7CisgIHNpemVfdCBjaGFyX2NvdW50ID0gZW5kUG9zIC0gc3RhcnRQb3MgKyAxOworICBpZiAoY2hhcl9jb3VudCA9PSAwKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKGNoYXJfY291bnQgPT0gMSAmJiBjc1BhZ2VUZXh0W3N0YXJ0UG9zXSA+IDI1NSkKICAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKHN0YXJ0UG9zIC0gMSA+PSAwKQotICAgIGNoYXJfbGVmdCA9IGNzUGFnZVRleHQuR2V0QXQoc3RhcnRQb3MgLSAxKTsKKyAgaWYgKHN0YXJ0UG9zID49IDEpCisgICAgY2hhcl9sZWZ0ID0gY3NQYWdlVGV4dFtzdGFydFBvcyAtIDFdOwogICBpZiAoc3RhcnRQb3MgKyBjaGFyX2NvdW50IDwgY3NQYWdlVGV4dC5HZXRMZW5ndGgoKSkKLSAgICBjaGFyX3JpZ2h0ID0gY3NQYWdlVGV4dC5HZXRBdChzdGFydFBvcyArIGNoYXJfY291bnQpOworICAgIGNoYXJfcmlnaHQgPSBjc1BhZ2VUZXh0W3N0YXJ0UG9zICsgY2hhcl9jb3VudF07CiAgIGlmICgoY2hhcl9sZWZ0ID4gJ0EnICYmIGNoYXJfbGVmdCA8ICdhJykgfHwKICAgICAgIChjaGFyX2xlZnQgPiAnYScgJiYgY2hhcl9sZWZ0IDwgJ3onKSB8fAogICAgICAgKGNoYXJfbGVmdCA+IDB4ZmIwMCAmJiBjaGFyX2xlZnQgPCAweGZiMDYpIHx8IHN0ZDo6aXN3ZGlnaXQoY2hhcl9sZWZ0KSB8fApAQCAtMzQ4LDUyICszNTAsMzggQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KICAgaWYgKGNoYXJfY291bnQgPiAwKSB7Ci0gICAgaWYgKGNzUGFnZVRleHQuR2V0QXQoc3RhcnRQb3MpID49IEwnMCcgJiYKLSAgICAgICAgY3NQYWdlVGV4dC5HZXRBdChzdGFydFBvcykgPD0gTCc5JyAmJiBjaGFyX2xlZnQgPj0gTCcwJyAmJgotICAgICAgICBjaGFyX2xlZnQgPD0gTCc5JykgeworICAgIGlmIChzdGQ6Omlzd2RpZ2l0KGNoYXJfbGVmdCkgJiYgc3RkOjppc3dkaWdpdChjc1BhZ2VUZXh0W3N0YXJ0UG9zXSkpCiAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChjc1BhZ2VUZXh0LkdldEF0KGVuZFBvcykgPj0gTCcwJyAmJiBjc1BhZ2VUZXh0LkdldEF0KGVuZFBvcykgPD0gTCc5JyAmJgotICAgICAgICBjaGFyX3JpZ2h0ID49IEwnMCcgJiYgY2hhcl9yaWdodCA8PSBMJzknKSB7CisgICAgaWYgKHN0ZDo6aXN3ZGlnaXQoY2hhcl9yaWdodCkgJiYgc3RkOjppc3dkaWdpdChjc1BhZ2VUZXh0W2VuZFBvc10pKQogICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KICAgfQogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDUERGX1RleHRQYWdlRmluZDo6RXh0cmFjdFN1YlN0cmluZyhDRlhfV2lkZVN0cmluZyYgclN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwc3pGdWxsU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaVN1YlN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgY2hTZXApIHsKK09wdGlvbmFsPFdpZGVTdHJpbmc+IENQREZfVGV4dFBhZ2VGaW5kOjpFeHRyYWN0U3ViU3RyaW5nKAorICAgIGNvbnN0IHdjaGFyX3QqIGxwc3pGdWxsU3RyaW5nLAorICAgIGludCBpU3ViU3RyaW5nLAorICAgIHdjaGFyX3QgY2hTZXApIHsKICAgaWYgKCFscHN6RnVsbFN0cmluZykKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHt9OworCiAgIHdoaWxlIChpU3ViU3RyaW5nLS0pIHsKICAgICBscHN6RnVsbFN0cmluZyA9IHN0ZDo6d2NzY2hyKGxwc3pGdWxsU3RyaW5nLCBjaFNlcCk7Ci0gICAgaWYgKCFscHN6RnVsbFN0cmluZykgewotICAgICAgclN0cmluZy5jbGVhcigpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKyAgICBpZiAoIWxwc3pGdWxsU3RyaW5nKQorICAgICAgcmV0dXJuIHt9OworCiAgICAgbHBzekZ1bGxTdHJpbmcrKzsKICAgICB3aGlsZSAoKmxwc3pGdWxsU3RyaW5nID09IGNoU2VwKQogICAgICAgbHBzekZ1bGxTdHJpbmcrKzsKICAgfQotICBjb25zdCBGWF9XQ0hBUiogbHBjaEVuZCA9IHN0ZDo6d2NzY2hyKGxwc3pGdWxsU3RyaW5nLCBjaFNlcCk7Ci0gIGludCBuTGVuID0gbHBjaEVuZCA/IChpbnQpKGxwY2hFbmQgLSBscHN6RnVsbFN0cmluZykKLSAgICAgICAgICAgICAgICAgICAgIDogKGludClGWFNZU193Y3NsZW4obHBzekZ1bGxTdHJpbmcpOwotICBBU1NFUlQobkxlbiA+PSAwKTsKLSAgRlhTWVNfbWVtY3B5KHJTdHJpbmcuR2V0QnVmZmVyKG5MZW4pLCBscHN6RnVsbFN0cmluZywKLSAgICAgICAgICAgICAgIG5MZW4gKiBzaXplb2YoRlhfV0NIQVIpKTsKLSAgclN0cmluZy5SZWxlYXNlQnVmZmVyKCk7Ci0gIHJldHVybiB0cnVlOwotfQogCi1DRlhfV2lkZVN0cmluZyBDUERGX1RleHRQYWdlRmluZDo6TWFrZVJldmVyc2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikgewotICBDRlhfV2lkZVN0cmluZyBzdHIyOwotICBzdHIyLmNsZWFyKCk7Ci0gIGludCBubGVuID0gc3RyLkdldExlbmd0aCgpOwotICBmb3IgKGludCBpID0gbmxlbiAtIDE7IGkgPj0gMDsgaS0tKQotICAgIHN0cjIgKz0gc3RyLkdldEF0KGkpOwotICByZXR1cm4gc3RyMjsKKyAgY29uc3Qgd2NoYXJfdCogbHBjaEVuZCA9IHN0ZDo6d2NzY2hyKGxwc3pGdWxsU3RyaW5nLCBjaFNlcCk7CisgIGludCBuTGVuID0gbHBjaEVuZCA/IHN0YXRpY19jYXN0PGludD4obHBjaEVuZCAtIGxwc3pGdWxsU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgOiBzdGF0aWNfY2FzdDxpbnQ+KHdjc2xlbihscHN6RnVsbFN0cmluZykpOworICBpZiAobkxlbiA8IDApCisgICAgcmV0dXJuIHt9OworCisgIHJldHVybiB7V2lkZVN0cmluZyhscHN6RnVsbFN0cmluZywgc3RhdGljX2Nhc3Q8c2l6ZV90PihuTGVuKSl9OwogfQogCiBpbnQgQ1BERl9UZXh0UGFnZUZpbmQ6OkdldEN1ck9yZGVyKCkgY29uc3QgewpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmdGV4dC9jcGRmX3RleHRwYWdlZmluZC5oIGIvY29yZS9mcGRmdGV4dC9jcGRmX3RleHRwYWdlZmluZC5oCmluZGV4IGM2MGNiNTcuLmY3NDE5Y2YgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZnRleHQvY3BkZl90ZXh0cGFnZWZpbmQuaAorKysgYi9jb3JlL2ZwZGZ0ZXh0L2NwZGZfdGV4dHBhZ2VmaW5kLmgKQEAgLTEyLDYgKzEyLDggQEAKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL29wdGlvbmFsLmgiCiAKIGNsYXNzIENQREZfVGV4dFBhZ2U7CiAKQEAgLTIwLDMzICsyMiwzMyBAQAogICBleHBsaWNpdCBDUERGX1RleHRQYWdlRmluZChjb25zdCBDUERGX1RleHRQYWdlKiBwVGV4dFBhZ2UpOwogICB+Q1BERl9UZXh0UGFnZUZpbmQoKTsKIAotICBib29sIEZpbmRGaXJzdChjb25zdCBDRlhfV2lkZVN0cmluZyYgZmluZHdoYXQsIGludCBmbGFncywgaW50IHN0YXJ0UG9zID0gMCk7CisgIGJvb2wgRmluZEZpcnN0KGNvbnN0IFdpZGVTdHJpbmcmIGZpbmR3aGF0LAorICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgIE9wdGlvbmFsPHNpemVfdD4gc3RhcnRQb3MpOwogICBib29sIEZpbmROZXh0KCk7CiAgIGJvb2wgRmluZFByZXYoKTsKICAgaW50IEdldEN1ck9yZGVyKCkgY29uc3Q7CiAgIGludCBHZXRNYXRjaGVkQ291bnQoKSBjb25zdDsKIAogIHByb3RlY3RlZDoKLSAgdm9pZCBFeHRyYWN0RmluZFdoYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZpbmR3aGF0KTsKLSAgYm9vbCBJc01hdGNoV2hvbGVXb3JkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc1BhZ2VUZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0UG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZFBvcyk7Ci0gIGJvb2wgRXh0cmFjdFN1YlN0cmluZyhDRlhfV2lkZVN0cmluZyYgclN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBscHN6RnVsbFN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpU3ViU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgY2hTZXApOwotICBDRlhfV2lkZVN0cmluZyBNYWtlUmV2ZXJzZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKTsKKyAgdm9pZCBFeHRyYWN0RmluZFdoYXQoY29uc3QgV2lkZVN0cmluZyYgZmluZHdoYXQpOworICBib29sIElzTWF0Y2hXaG9sZVdvcmQoY29uc3QgV2lkZVN0cmluZyYgY3NQYWdlVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzdGFydFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlbmRQb3MpOworICBPcHRpb25hbDxXaWRlU3RyaW5nPiBFeHRyYWN0U3ViU3RyaW5nKGNvbnN0IHdjaGFyX3QqIGxwc3pGdWxsU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpU3ViU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QgY2hTZXApOwogICBpbnQgR2V0Q2hhckluZGV4KGludCBpbmRleCkgY29uc3Q7CiAKICBwcml2YXRlOgogICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4gbV9DaGFySW5kZXg7Ci0gIGNvbnN0IENQREZfVGV4dFBhZ2UqIG1fcFRleHRQYWdlOwotICBDRlhfV2lkZVN0cmluZyBtX3N0clRleHQ7Ci0gIENGWF9XaWRlU3RyaW5nIG1fZmluZFdoYXQ7CisgIFVub3duZWRQdHI8Y29uc3QgQ1BERl9UZXh0UGFnZT4gbV9wVGV4dFBhZ2U7CisgIFdpZGVTdHJpbmcgbV9zdHJUZXh0OworICBXaWRlU3RyaW5nIG1fZmluZFdoYXQ7CiAgIGludCBtX2ZsYWdzOwotICBzdGQ6OnZlY3RvcjxDRlhfV2lkZVN0cmluZz4gbV9jc0ZpbmRXaGF0QXJyYXk7Ci0gIGludCBtX2ZpbmROZXh0U3RhcnQ7Ci0gIGludCBtX2ZpbmRQcmVTdGFydDsKKyAgc3RkOjp2ZWN0b3I8V2lkZVN0cmluZz4gbV9jc0ZpbmRXaGF0QXJyYXk7CisgIE9wdGlvbmFsPHNpemVfdD4gbV9maW5kTmV4dFN0YXJ0OworICBPcHRpb25hbDxzaXplX3Q+IG1fZmluZFByZVN0YXJ0OwogICBib29sIG1fYk1hdGNoQ2FzZTsKICAgYm9vbCBtX2JNYXRjaFdob2xlV29yZDsKICAgaW50IG1fcmVzU3RhcnQ7CmRpZmYgLS1naXQgYS9jb3JlL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9pbnRfdW5pdHRlc3QuY3BwIGIvY29yZS9mcGRmdGV4dC9mcGRmX3RleHRfaW50X3VuaXR0ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdlNDg3Ni4uMDAwMDAwMAotLS0gYS9jb3JlL2ZwZGZ0ZXh0L2ZwZGZfdGV4dF9pbnRfdW5pdHRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiY29yZS9mcGRmdGV4dC9jcGRmX2xpbmtleHRyYWN0LmgiCi0KLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotLy8gQ2xhc3MgdG8gaGVscCB0ZXN0IGZ1bmN0aW9ucyBpbiBDUERGX0xpbmtFeHRyYWN0IGNsYXNzLgotY2xhc3MgQ1BERl9UZXN0TGlua0V4dHJhY3QgOiBwdWJsaWMgQ1BERl9MaW5rRXh0cmFjdCB7Ci0gcHVibGljOgotICBDUERGX1Rlc3RMaW5rRXh0cmFjdCgpIDogQ1BERl9MaW5rRXh0cmFjdChudWxscHRyKSB7fQotCi0gcHJpdmF0ZToKLSAgLy8gQWRkIHRlc3QgY2FzZXMgYXMgZnJpZW5kcyB0byBhY2Nlc3MgcHJvdGVjdGVkIG1lbWJlciBmdW5jdGlvbnMuCi0gIC8vIEFjY2VzcyBDaGVja01haWxMaW5rLgotICBGUklFTkRfVEVTVChmcGRmX3RleHRfaW50LCBDaGVja01haWxMaW5rKTsKLX07Ci0KLVRFU1QoZnBkZl90ZXh0X2ludCwgQ2hlY2tNYWlsTGluaykgewotICBDUERGX1Rlc3RMaW5rRXh0cmFjdCBleHRyYWN0b3I7Ci0gIC8vIENoZWNrIGNhc2VzIHRoYXQgZmFpbCB0byBleHRyYWN0IHZhbGlkIG1haWwgbGluay4KLSAgY29uc3Qgd2NoYXJfdCogaW52YWxpZF9zdHJzW10gPSB7Ci0gICAgICBMIiIsCi0gICAgICBMInBldGVyLnBhbiIsICAgICAgIC8vICdAJyBpcyByZXF1aXJlZC4KLSAgICAgIEwiYWJjQHNlcnZlciIsICAgICAgLy8gRG9tYWluIG5hbWUgbmVlZHMgYXQgbGVhc3Qgb25lICcuJy4KLSAgICAgIEwiYWJjLkBnbWFpbC5jb20iLCAgLy8gJy4nIGNhbiBub3QgaW1tZWRpYXRlbHkgcHJlY2VkZSAnQCcuCi0gICAgICBMImFiY0B4eXomcS5vcmciLCAgIC8vIERvbWFpbiBuYW1lIHNob3VsZCBub3QgY29udGFpbiAnJicuCi0gICAgICBMImFiY0AueHl6Lm9yZyIsICAgIC8vIERvbWFpbiBuYW1lIHNob3VsZCBub3Qgc3RhcnQgd2l0aCAnLicuCi0gICAgICBMImZhbkBnLi5jb20iICAgICAgIC8vIERvbWFpbiBuYW1lIHNob3VsZCBub3QgaGF2ZSBjb25zZWN1dGl2ZSAnLicKLSAgfTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoaW52YWxpZF9zdHJzKTsgKytpKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgdGV4dF9zdHIoaW52YWxpZF9zdHJzW2ldKTsKLSAgICBFWFBFQ1RfRkFMU0UoZXh0cmFjdG9yLkNoZWNrTWFpbExpbmsodGV4dF9zdHIpKTsKLSAgfQotCi0gIC8vIENoZWNrIGNhc2VzIHRoYXQgY2FuIGV4dHJhY3QgdmFsaWQgbWFpbCBsaW5rLgotICAvLyBBbiBhcnJheSBvZiB7aW5wdXRfc3RyaW5nLCBleHBlY3RlZF9leHRyYWN0ZWRfZW1haWxfYWRkcmVzc30uCi0gIGNvbnN0IHdjaGFyX3QqIHZhbGlkX3N0cnNbXVsyXSA9IHsKLSAgICAgIHtMInBldGVyQGFiYy5kIiwgTCJwZXRlckBhYmMuZCJ9LAotICAgICAge0wicmVkLnRlZGR5LmJAYWJjLmNvbSIsIEwicmVkLnRlZGR5LmJAYWJjLmNvbSJ9LAotICAgICAge0wiYWJjX0BnbWFpbC5jb20iLCBMImFiY19AZ21haWwuY29tIn0sICAvLyAnXycgaXMgb2sgYmVmb3JlICdAJy4KLSAgICAgIHtMImR1bW15LWhpQGdtYWlsLmNvbSIsCi0gICAgICAgTCJkdW1teS1oaUBnbWFpbC5jb20ifSwgICAgICAgICAgICAgICAgICAvLyAnLScgaXMgb2sgaW4gdXNlciBuYW1lLgotICAgICAge0wiYS4uZGZAZ21haWwuY29tIiwgTCJkZkBnbWFpbC5jb20ifSwgICAgLy8gU3RvcCBhdCBjb25zZWN1dGl2ZSAnLicuCi0gICAgICB7TCIuam9obkB5YWhvby5jb20iLCBMImpvaG5AeWFob28uY29tIn0sICAvLyBSZW1vdmUgaGVhZGluZyAnLicuCi0gICAgICB7TCJhYmNAeHl6Lm9yZz8vIiwgTCJhYmNAeHl6Lm9yZyJ9LCAgICAgICAvLyBUcmltIGVuZGluZyBpbnZhbGlkIGNoYXJzLgotICAgICAge0wiZmFue2FiY0B4eXoub3JnIiwgTCJhYmNAeHl6Lm9yZyJ9LCAgICAgLy8gVHJpbSBiZWdpbm5pbmcgaW52YWxpZCBjaGFycy4KLSAgICAgIHtMImZhbkBnLmNvbS4uIiwgTCJmYW5AZy5jb20ifSwgICAgICAgICAgIC8vIFRyaW0gdGhlIGVuZGluZyBwZXJpb2RzLgotICAgICAge0wiQ0FQLmNhcEBHbWFpbC5Db20iLCBMIkNBUC5jYXBAR21haWwuQ29tIn0sICAvLyBLZWVwIHRoZSBvcmlnaW5hbCBjYXNlLgotICB9OwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh2YWxpZF9zdHJzKTsgKytpKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgdGV4dF9zdHIodmFsaWRfc3Ryc1tpXVswXSk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgZXhwZWN0ZWRfc3RyKEwibWFpbHRvOiIpOwotICAgIGV4cGVjdGVkX3N0ciArPSB2YWxpZF9zdHJzW2ldWzFdOwotICAgIEVYUEVDVF9UUlVFKGV4dHJhY3Rvci5DaGVja01haWxMaW5rKHRleHRfc3RyKSk7Ci0gICAgRVhQRUNUX1NUUkVRKHRleHRfc3RyLmNfc3RyKCksIGV4cGVjdGVkX3N0ci5jX3N0cigpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL0RFUFMgYi9jb3JlL2Z4Y29kZWMvREVQUwppbmRleCBhODhiMzI5Li45OTE5NDc4IDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvREVQUworKysgYi9jb3JlL2Z4Y29kZWMvREVQUwpAQCAtMSw4ICsxLDggQEAKIGluY2x1ZGVfcnVsZXMgPSBbCi0gICcrdGhpcmRfcGFydHkvbGNtczItMi42JywKKyAgJyt0aGlyZF9wYXJ0eS9sY21zJywKICAgJyt0aGlyZF9wYXJ0eS9saWJqcGVnL2pwZWdsaWIuaCcsCiAgICMgRm9yIG5vbi1zdGFuZGFsb25lIGJ1aWxkcyB0aGF0IG1heSB1c2UgbGlianBlZ190dXJiby4KICAgJyt0aGlyZF9wYXJ0eS9saWJqcGVnX3R1cmJvL2pwZWdsaWIuaCcsCiAgICcrdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMCcsCi0gICcrdGhpcmRfcGFydHkvemxpYl92MTI4JywKKyAgJyt0aGlyZF9wYXJ0eS96bGliJywKIF0KZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfYm1wbW9kdWxlLmNwcCBiL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfYm1wbW9kdWxlLmNwcAppbmRleCA5ZDY0MTk5Li5iMmZjY2E4IDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2JtcG1vZHVsZS5jcHAKKysrIGIvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19ibXBtb2R1bGUuY3BwCkBAIC05LDEyMyArOSw3NiBAQAogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jb2RlY19pbnQuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvZnhfY29kZWMuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvbGJtcC9meF9ibXAuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAotc3RydWN0IEZYQk1QX0NvbnRleHQgewotICBibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyOwotICB2b2lkKiBwYXJlbnRfcHRyOwotCi0gIHZvaWQqICgqbV9BbGxvY0Z1bmMpKHVuc2lnbmVkIGludCk7Ci0gIHZvaWQgKCptX0ZyZWVGdW5jKSh2b2lkKik7Ci19OwotZXh0ZXJuICJDIiB7Ci1zdGF0aWMgdm9pZCogYm1wX2FsbG9jX2Z1bmModW5zaWduZWQgaW50IHNpemUpIHsKLSAgcmV0dXJuIEZYX0FsbG9jKGNoYXIsIHNpemUpOwotfQotc3RhdGljIHZvaWQgYm1wX2ZyZWVfZnVuYyh2b2lkKiBwKSB7Ci0gIEZYX0ZyZWUocCk7Ci19Ci19Owotc3RhdGljIHZvaWQgYm1wX2Vycm9yX2RhdGEoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGVycl9tc2cpIHsKLSAgRlhTWVNfc3RybmNweSgoY2hhciopYm1wX3B0ci0+ZXJyX3B0ciwgZXJyX21zZywgQk1QX01BWF9FUlJPUl9TSVpFIC0gMSk7Ci0gIGxvbmdqbXAoYm1wX3B0ci0+am1wYnVmLCAxKTsKLX0KLXN0YXRpYyB2b2lkIGJtcF9yZWFkX3NjYW5saW5lKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJvd19udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByb3dfYnVmKSB7Ci0gIEZYQk1QX0NvbnRleHQqIHAgPSAoRlhCTVBfQ29udGV4dCopYm1wX3B0ci0+Y29udGV4dF9wdHI7Ci0gIENDb2RlY19CbXBNb2R1bGUqIHBNb2R1bGUgPSAoQ0NvZGVjX0JtcE1vZHVsZSopcC0+cGFyZW50X3B0cjsKLSAgcE1vZHVsZS0+R2V0RGVsZWdhdGUoKS0+Qm1wUmVhZFNjYW5saW5lKHJvd19udW0sIHJvd19idWYpOwotfQotc3RhdGljIGJvb2wgYm1wX2dldF9kYXRhX3Bvc2l0aW9uKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmNkX3BvcykgewotICBGWEJNUF9Db250ZXh0KiBwID0gKEZYQk1QX0NvbnRleHQqKWJtcF9wdHItPmNvbnRleHRfcHRyOwotICBDQ29kZWNfQm1wTW9kdWxlKiBwTW9kdWxlID0gKENDb2RlY19CbXBNb2R1bGUqKXAtPnBhcmVudF9wdHI7Ci0gIHJldHVybiBwTW9kdWxlLT5HZXREZWxlZ2F0ZSgpLT5CbXBJbnB1dEltYWdlUG9zaXRpb25CdWYocmNkX3Bvcyk7CitDQm1wQ29udGV4dDo6Q0JtcENvbnRleHQoQ0NvZGVjX0JtcE1vZHVsZSogcE1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDQ29kZWNfQm1wTW9kdWxlOjpEZWxlZ2F0ZSogcERlbGVnYXRlKQorICAgIDogbV9wTW9kdWxlKHBNb2R1bGUpLCBtX3BEZWxlZ2F0ZShwRGVsZWdhdGUpIHsKIH0KIAotQ0NvZGVjX0JtcE1vZHVsZTo6Q0NvZGVjX0JtcE1vZHVsZSgpIHsKLSAgbWVtc2V0KG1fc3pMYXN0RXJyb3IsIDAsIHNpemVvZihtX3N6TGFzdEVycm9yKSk7Ci19CitDQm1wQ29udGV4dDo6fkNCbXBDb250ZXh0KCkge30KKworQ0NvZGVjX0JtcE1vZHVsZTo6Q0NvZGVjX0JtcE1vZHVsZSgpIHt9CiAKIENDb2RlY19CbXBNb2R1bGU6On5DQ29kZWNfQm1wTW9kdWxlKCkge30KIAotRlhCTVBfQ29udGV4dCogQ0NvZGVjX0JtcE1vZHVsZTo6U3RhcnQoKSB7Ci0gIEZYQk1QX0NvbnRleHQqIHAgPSBGWF9BbGxvYyhGWEJNUF9Db250ZXh0LCAxKTsKLSAgaWYgKCFwKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIEZYU1lTX21lbXNldChwLCAwLCBzaXplb2YoRlhCTVBfQ29udGV4dCkpOwotICBpZiAoIXApCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgcC0+bV9BbGxvY0Z1bmMgPSBibXBfYWxsb2NfZnVuYzsKLSAgcC0+bV9GcmVlRnVuYyA9IGJtcF9mcmVlX2Z1bmM7Ci0gIHAtPmJtcF9wdHIgPSBudWxscHRyOwotICBwLT5wYXJlbnRfcHRyID0gKHZvaWQqKXRoaXM7Ci0gIHAtPmJtcF9wdHIgPSBibXBfY3JlYXRlX2RlY29tcHJlc3MoKTsKLSAgaWYgKCFwLT5ibXBfcHRyKSB7Ci0gICAgRlhfRnJlZShwKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBwLT5ibXBfcHRyLT5jb250ZXh0X3B0ciA9ICh2b2lkKilwOwotICBwLT5ibXBfcHRyLT5lcnJfcHRyID0gbV9zekxhc3RFcnJvcjsKLSAgcC0+Ym1wX3B0ci0+Ym1wX2Vycm9yX2ZuID0gYm1wX2Vycm9yX2RhdGE7Ci0gIHAtPmJtcF9wdHItPmJtcF9nZXRfcm93X2ZuID0gYm1wX3JlYWRfc2NhbmxpbmU7Ci0gIHAtPmJtcF9wdHItPmJtcF9nZXRfZGF0YV9wb3NpdGlvbl9mbiA9IGJtcF9nZXRfZGF0YV9wb3NpdGlvbjsKK3N0ZDo6dW5pcXVlX3B0cjxDQ29kZWNfQm1wTW9kdWxlOjpDb250ZXh0PiBDQ29kZWNfQm1wTW9kdWxlOjpTdGFydCgKKyAgICBEZWxlZ2F0ZSogcERlbGVnYXRlKSB7CisgIGF1dG8gcCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDQm1wQ29udGV4dD4odGhpcywgcERlbGVnYXRlKTsKKyAgcC0+bV9CbXAuY29udGV4dF9wdHIgPSBwLmdldCgpOwogICByZXR1cm4gcDsKIH0KIAotdm9pZCBDQ29kZWNfQm1wTW9kdWxlOjpGaW5pc2goRlhCTVBfQ29udGV4dCogY3R4KSB7Ci0gIGlmIChjdHgpIHsKLSAgICBibXBfZGVzdHJveV9kZWNvbXByZXNzKCZjdHgtPmJtcF9wdHIpOwotICAgIGN0eC0+bV9GcmVlRnVuYyhjdHgpOwotICB9Ci19Ci1pbnQzMl90IENDb2RlY19CbXBNb2R1bGU6OlJlYWRIZWFkZXIoRlhCTVBfQ29udGV4dCogY3R4LAoraW50MzJfdCBDQ29kZWNfQm1wTW9kdWxlOjpSZWFkSGVhZGVyKENvbnRleHQqIHBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiB0Yl9mbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGNvbXBvbmVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcGFsX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCoqIHBhbF9wcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4qIHBhbGV0dGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkgewotICBpZiAoc2V0am1wKGN0eC0+Ym1wX3B0ci0+am1wYnVmKSkgeworICBhdXRvKiBjdHggPSBzdGF0aWNfY2FzdDxDQm1wQ29udGV4dCo+KHBDb250ZXh0KTsKKyAgaWYgKHNldGptcChjdHgtPm1fQm1wLmptcGJ1ZikpCiAgICAgcmV0dXJuIDA7Ci0gIH0KLSAgaW50MzJfdCByZXQgPSBibXBfcmVhZF9oZWFkZXIoY3R4LT5ibXBfcHRyKTsKLSAgaWYgKHJldCAhPSAxKSB7CisKKyAgaW50MzJfdCByZXQgPSBjdHgtPm1fQm1wLlJlYWRIZWFkZXIoKTsKKyAgaWYgKHJldCAhPSAxKQogICAgIHJldHVybiByZXQ7Ci0gIH0KLSAgKndpZHRoID0gY3R4LT5ibXBfcHRyLT53aWR0aDsKLSAgKmhlaWdodCA9IGN0eC0+Ym1wX3B0ci0+aGVpZ2h0OwotICAqdGJfZmxhZyA9IGN0eC0+Ym1wX3B0ci0+aW1nVEJfZmxhZzsKLSAgKmNvbXBvbmVudHMgPSBjdHgtPmJtcF9wdHItPmNvbXBvbmVudHM7Ci0gICpwYWxfbnVtID0gY3R4LT5ibXBfcHRyLT5wYWxfbnVtOwotICAqcGFsX3BwID0gY3R4LT5ibXBfcHRyLT5wYWxfcHRyOworCisgICp3aWR0aCA9IGN0eC0+bV9CbXAud2lkdGg7CisgICpoZWlnaHQgPSBjdHgtPm1fQm1wLmhlaWdodDsKKyAgKnRiX2ZsYWcgPSBjdHgtPm1fQm1wLmltZ1RCX2ZsYWc7CisgICpjb21wb25lbnRzID0gY3R4LT5tX0JtcC5jb21wb25lbnRzOworICAqcGFsX251bSA9IGN0eC0+bV9CbXAucGFsX251bTsKKyAgKnBhbGV0dGUgPSBjdHgtPm1fQm1wLnBhbGV0dGU7CiAgIGlmIChwQXR0cmlidXRlKSB7CiAgICAgcEF0dHJpYnV0ZS0+bV93RFBJVW5pdCA9IEZYQ09ERUNfUkVTVU5JVF9NRVRFUjsKLSAgICBwQXR0cmlidXRlLT5tX25YRFBJID0gY3R4LT5ibXBfcHRyLT5kcGlfeDsKLSAgICBwQXR0cmlidXRlLT5tX25ZRFBJID0gY3R4LT5ibXBfcHRyLT5kcGlfeTsKLSAgICBwQXR0cmlidXRlLT5tX25CbXBDb21wcmVzc1R5cGUgPSBjdHgtPmJtcF9wdHItPmNvbXByZXNzX2ZsYWc7CisgICAgcEF0dHJpYnV0ZS0+bV9uWERQSSA9IGN0eC0+bV9CbXAuZHBpX3g7CisgICAgcEF0dHJpYnV0ZS0+bV9uWURQSSA9IGN0eC0+bV9CbXAuZHBpX3k7CisgICAgcEF0dHJpYnV0ZS0+bV9uQm1wQ29tcHJlc3NUeXBlID0gY3R4LT5tX0JtcC5jb21wcmVzc19mbGFnOwogICB9CiAgIHJldHVybiAxOwogfQogCi1pbnQzMl90IENDb2RlY19CbXBNb2R1bGU6OkxvYWRJbWFnZShGWEJNUF9Db250ZXh0KiBjdHgpIHsKLSAgaWYgKHNldGptcChjdHgtPmJtcF9wdHItPmptcGJ1ZikpCitpbnQzMl90IENDb2RlY19CbXBNb2R1bGU6OkxvYWRJbWFnZShDb250ZXh0KiBwQ29udGV4dCkgeworICBhdXRvKiBjdHggPSBzdGF0aWNfY2FzdDxDQm1wQ29udGV4dCo+KHBDb250ZXh0KTsKKyAgaWYgKHNldGptcChjdHgtPm1fQm1wLmptcGJ1ZikpCiAgICAgcmV0dXJuIDA7Ci0gIHJldHVybiBibXBfZGVjb2RlX2ltYWdlKGN0eC0+Ym1wX3B0cik7CisKKyAgcmV0dXJuIGN0eC0+bV9CbXAuRGVjb2RlSW1hZ2UoKTsKIH0KIAotdWludDMyX3QgQ0NvZGVjX0JtcE1vZHVsZTo6R2V0QXZhaWxJbnB1dChGWEJNUF9Db250ZXh0KiBjdHgsCit1aW50MzJfdCBDQ29kZWNfQm1wTW9kdWxlOjpHZXRBdmFpbElucHV0KENvbnRleHQqIHBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogYXZhaWxfYnVmX3B0cikgewotICByZXR1cm4gYm1wX2dldF9hdmFpbF9pbnB1dChjdHgtPmJtcF9wdHIsIGF2YWlsX2J1Zl9wdHIpOworICBhdXRvKiBjdHggPSBzdGF0aWNfY2FzdDxDQm1wQ29udGV4dCo+KHBDb250ZXh0KTsKKyAgcmV0dXJuIGN0eC0+bV9CbXAuR2V0QXZhaWxJbnB1dChhdmFpbF9idWZfcHRyKTsKIH0KIAotdm9pZCBDQ29kZWNfQm1wTW9kdWxlOjpJbnB1dChGWEJNUF9Db250ZXh0KiBjdHgsCit2b2lkIENDb2RlY19CbXBNb2R1bGU6OklucHV0KENvbnRleHQqIHBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc2l6ZSkgewotICBibXBfaW5wdXRfYnVmZmVyKGN0eC0+Ym1wX3B0ciwgKHVpbnQ4X3QqKXNyY19idWYsIHNyY19zaXplKTsKKyAgYXV0byogY3R4ID0gc3RhdGljX2Nhc3Q8Q0JtcENvbnRleHQqPihwQ29udGV4dCk7CisgIGN0eC0+bV9CbXAuU2V0SW5wdXRCdWZmZXIoY29uc3RfY2FzdDx1aW50OF90Kj4oc3JjX2J1ZiksIHNyY19zaXplKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfYm1wbW9kdWxlLmggYi9jb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2JtcG1vZHVsZS5oCmluZGV4IDExZDU5MzEuLjhhMzNmNjYgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfYm1wbW9kdWxlLmgKKysrIGIvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19ibXBtb2R1bGUuaApAQCAtNywzMyArNyw0MyBAQAogI2lmbmRlZiBDT1JFX0ZYQ09ERUNfQ09ERUNfQ0NPREVDX0JNUE1PRFVMRV9IXwogI2RlZmluZSBDT1JFX0ZYQ09ERUNfQ09ERUNfQ0NPREVDX0JNUE1PRFVMRV9IXwogCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2ljb2RlY19ibXBtb2R1bGUuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAKLWNsYXNzIENDb2RlY19CbXBNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0JtcE1vZHVsZSB7CitjbGFzcyBDRlhfRElCQXR0cmlidXRlOworCitjbGFzcyBDQ29kZWNfQm1wTW9kdWxlIHsKICBwdWJsaWM6Ci0gIENDb2RlY19CbXBNb2R1bGUoKTsKLSAgfkNDb2RlY19CbXBNb2R1bGUoKSBvdmVycmlkZTsKKyAgY2xhc3MgQ29udGV4dCB7CisgICBwdWJsaWM6CisgICAgdmlydHVhbCB+Q29udGV4dCgpIHt9CisgIH07CiAKLSAgRlhCTVBfQ29udGV4dCogU3RhcnQoKSBvdmVycmlkZTsKLSAgdm9pZCBGaW5pc2goRlhCTVBfQ29udGV4dCogcENvbnRleHQpIG92ZXJyaWRlOwotICB1aW50MzJfdCBHZXRBdmFpbElucHV0KEZYQk1QX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBhdmFpbF9idWZfcHRyKSBvdmVycmlkZTsKLSAgdm9pZCBJbnB1dChGWEJNUF9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAotICAgICAgICAgICAgIHVpbnQzMl90IHNyY19zaXplKSBvdmVycmlkZTsKLSAgaW50MzJfdCBSZWFkSGVhZGVyKEZYQk1QX0NvbnRleHQqIHBDb250ZXh0LAorICBjbGFzcyBEZWxlZ2F0ZSB7CisgICBwdWJsaWM6CisgICAgdmlydHVhbCBib29sIEJtcElucHV0SW1hZ2VQb3NpdGlvbkJ1Zih1aW50MzJfdCByY2RfcG9zKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIEJtcFJlYWRTY2FubGluZSh1aW50MzJfdCByb3dfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHJvd19idWYpID0gMDsKKyAgfTsKKworICBDQ29kZWNfQm1wTW9kdWxlKCk7CisgIH5DQ29kZWNfQm1wTW9kdWxlKCk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPENvbnRleHQ+IFN0YXJ0KERlbGVnYXRlKiBwRGVsZWdhdGUpOworICB1aW50MzJfdCBHZXRBdmFpbElucHV0KENvbnRleHQqIHBDb250ZXh0LCB1aW50OF90KiogYXZhaWxfYnVmX3B0cik7CisgIHZvaWQgSW5wdXQoQ29udGV4dCogcENvbnRleHQsIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIHVpbnQzMl90IHNyY19zaXplKTsKKyAgaW50MzJfdCBSZWFkSGVhZGVyKENvbnRleHQqIHBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICBib29sKiB0Yl9mbGFnLAogICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogY29tcG9uZW50cywKICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBhbF9udW0sCi0gICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCoqIHBhbF9wcCwKLSAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpIG92ZXJyaWRlOwotICBpbnQzMl90IExvYWRJbWFnZShGWEJNUF9Db250ZXh0KiBwQ29udGV4dCkgb3ZlcnJpZGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIEZYX0NIQVIgbV9zekxhc3RFcnJvclsyNTZdOworICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+KiBwYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSk7CisgIGludDMyX3QgTG9hZEltYWdlKENvbnRleHQqIHBDb250ZXh0KTsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9GWENPREVDX0NPREVDX0NDT0RFQ19CTVBNT0RVTEVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfZmF4bW9kdWxlLmggYi9jb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2ZheG1vZHVsZS5oCmluZGV4IDkyZTQ1ZTYuLjRmOGFiNzggMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfZmF4bW9kdWxlLmgKKysrIGIvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19mYXhtb2R1bGUuaApAQCAtMjYsMTQgKzI2LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQmxhY2tJczEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgUm93cyk7Ci0jaWYgX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lONjRfREVTS1RPUF8KKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXwogICBzdGF0aWMgdm9pZCBGYXhFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4qIGRlc3RfYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRlc3Rfc2l6ZSk7Ci0jZW5kaWYKKyNlbmRpZiAgLy8gX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KIH07CiAKICNlbmRpZiAgLy8gQ09SRV9GWENPREVDX0NPREVDX0NDT0RFQ19GQVhNT0RVTEVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfZmxhdGVtb2R1bGUuaCBiL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfZmxhdGVtb2R1bGUuaAppbmRleCA1MTc4OTQzLi5hZTM0MTAzIDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2ZsYXRlbW9kdWxlLmgKKysrIGIvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19mbGF0ZW1vZHVsZS5oCkBAIC0zNCwxMiArMzQsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQml0c1BlckNvbXBvbmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ29sdW1ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBlc3RpbWF0ZWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZGVzdF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIGRlc3Rfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkZXN0X3NpemUpOworCiAgIGJvb2wgRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCiAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY19zaXplLAogICAgICAgICAgICAgICB1aW50OF90KiogZGVzdF9idWYsCiAgICAgICAgICAgICAgIHVpbnQzMl90KiBkZXN0X3NpemUpOworCiAgIGJvb2wgUG5nRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCiAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY19zaXplLAogICAgICAgICAgICAgICAgICB1aW50OF90KiogZGVzdF9idWYsCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2dpZm1vZHVsZS5jcHAgYi9jb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2dpZm1vZHVsZS5jcHAKaW5kZXggYTg1YmM1ZS4uZDZhYjEwZCAxMDA2NDQKLS0tIGEvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19naWZtb2R1bGUuY3BwCisrKyBiL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfZ2lmbW9kdWxlLmNwcApAQCAtOCwxOTEgKzgsODMgQEAKIAogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jb2RlY19pbnQuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvZnhfY29kZWMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvbGdpZi9meF9naWYuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvZ2lmL2NmeF9naWYuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvZ2lmL2NmeF9naWZjb250ZXh0LmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAotc3RydWN0IEZYR0lGX0NvbnRleHQgewotICBnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyOwotICB2b2lkKiBwYXJlbnRfcHRyOwotCi0gIHZvaWQqICgqbV9BbGxvY0Z1bmMpKHVuc2lnbmVkIGludCk7Ci0gIHZvaWQgKCptX0ZyZWVGdW5jKSh2b2lkKik7Ci19OwotCi1leHRlcm4gIkMiIHsKLXN0YXRpYyB2b2lkKiBnaWZfYWxsb2NfZnVuYyh1bnNpZ25lZCBpbnQgc2l6ZSkgewotICByZXR1cm4gRlhfQWxsb2MoY2hhciwgc2l6ZSk7Ci19Ci1zdGF0aWMgdm9pZCBnaWZfZnJlZV9mdW5jKHZvaWQqIHApIHsKLSAgRlhfRnJlZShwKTsKLX0KLX07Ci0KLXN0YXRpYyB2b2lkIGdpZl9lcnJvcl9kYXRhKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBlcnJfbXNnKSB7Ci0gIEZYU1lTX3N0cm5jcHkoKGNoYXIqKWdpZl9wdHItPmVycl9wdHIsIGVycl9tc2csIEdJRl9NQVhfRVJST1JfU0laRSAtIDEpOwotICBsb25nam1wKGdpZl9wdHItPmptcGJ1ZiwgMSk7Ci19Ci0KLXN0YXRpYyB1aW50OF90KiBnaWZfYXNrX2J1Zl9mb3JfcGFsKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBhbF9zaXplKSB7Ci0gIEZYR0lGX0NvbnRleHQqIHAgPSAoRlhHSUZfQ29udGV4dCopZ2lmX3B0ci0+Y29udGV4dF9wdHI7Ci0gIENDb2RlY19HaWZNb2R1bGUqIHBNb2R1bGUgPSAoQ0NvZGVjX0dpZk1vZHVsZSopcC0+cGFyZW50X3B0cjsKLSAgcmV0dXJuIHBNb2R1bGUtPkdldERlbGVnYXRlKCktPkdpZkFza0xvY2FsUGFsZXR0ZUJ1ZigKLSAgICAgIGdpZl9nZXRfZnJhbWVfbnVtKGdpZl9wdHIpLCBwYWxfc2l6ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGdpZl9yZWNvcmRfY3VycmVudF9wb3NpdGlvbihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjdXJfcG9zX3B0cikgewotICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKWdpZl9wdHItPmNvbnRleHRfcHRyOwotICBDQ29kZWNfR2lmTW9kdWxlKiBwTW9kdWxlID0gKENDb2RlY19HaWZNb2R1bGUqKXAtPnBhcmVudF9wdHI7Ci0gIHBNb2R1bGUtPkdldERlbGVnYXRlKCktPkdpZlJlY29yZEN1cnJlbnRQb3NpdGlvbigqY3VyX3Bvc19wdHIpOwotfQotCi1zdGF0aWMgdm9pZCBnaWZfcmVhZF9zY2FubGluZShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByb3dfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcm93X2J1ZikgewotICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKWdpZl9wdHItPmNvbnRleHRfcHRyOwotICBDQ29kZWNfR2lmTW9kdWxlKiBwTW9kdWxlID0gKENDb2RlY19HaWZNb2R1bGUqKXAtPnBhcmVudF9wdHI7Ci0gIHBNb2R1bGUtPkdldERlbGVnYXRlKCktPkdpZlJlYWRTY2FubGluZShyb3dfbnVtLCByb3dfYnVmKTsKLX0KLQotc3RhdGljIGJvb2wgZ2lmX2dldF9yZWNvcmRfcG9zaXRpb24oZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGN1cl9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGFsX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhbF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlbGF5X3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZXJfaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRyYW5zX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkaXNwb3NhbF9tZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGludGVybGFjZSkgewotICBGWEdJRl9Db250ZXh0KiBwID0gKEZYR0lGX0NvbnRleHQqKWdpZl9wdHItPmNvbnRleHRfcHRyOwotICBDQ29kZWNfR2lmTW9kdWxlKiBwTW9kdWxlID0gKENDb2RlY19HaWZNb2R1bGUqKXAtPnBhcmVudF9wdHI7Ci0gIHJldHVybiBwTW9kdWxlLT5HZXREZWxlZ2F0ZSgpLT5HaWZJbnB1dFJlY29yZFBvc2l0aW9uQnVmKAotICAgICAgY3VyX3BvcywgRlhfUkVDVChsZWZ0LCB0b3AsIGxlZnQgKyB3aWR0aCwgdG9wICsgaGVpZ2h0KSwgcGFsX251bSwgcGFsX3B0ciwKLSAgICAgIGRlbGF5X3RpbWUsIHVzZXJfaW5wdXQsIHRyYW5zX2luZGV4LCBkaXNwb3NhbF9tZXRob2QsIGludGVybGFjZSk7Ci19Ci0KLUNDb2RlY19HaWZNb2R1bGU6OkNDb2RlY19HaWZNb2R1bGUoKSB7Ci0gIG1lbXNldChtX3N6TGFzdEVycm9yLCAwLCBzaXplb2YobV9zekxhc3RFcnJvcikpOwotfQorQ0NvZGVjX0dpZk1vZHVsZTo6Q0NvZGVjX0dpZk1vZHVsZSgpIHt9CiAKIENDb2RlY19HaWZNb2R1bGU6On5DQ29kZWNfR2lmTW9kdWxlKCkge30KIAotRlhHSUZfQ29udGV4dCogQ0NvZGVjX0dpZk1vZHVsZTo6U3RhcnQoKSB7Ci0gIEZYR0lGX0NvbnRleHQqIHAgPSBGWF9BbGxvYyhGWEdJRl9Db250ZXh0LCAxKTsKLSAgaWYgKCFwKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIEZYU1lTX21lbXNldChwLCAwLCBzaXplb2YoRlhHSUZfQ29udGV4dCkpOwotICBwLT5tX0FsbG9jRnVuYyA9IGdpZl9hbGxvY19mdW5jOwotICBwLT5tX0ZyZWVGdW5jID0gZ2lmX2ZyZWVfZnVuYzsKLSAgcC0+Z2lmX3B0ciA9IG51bGxwdHI7Ci0gIHAtPnBhcmVudF9wdHIgPSAodm9pZCopdGhpczsKLSAgcC0+Z2lmX3B0ciA9IGdpZl9jcmVhdGVfZGVjb21wcmVzcygpOwotICBpZiAoIXAtPmdpZl9wdHIpIHsKLSAgICBGWF9GcmVlKHApOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHAtPmdpZl9wdHItPmNvbnRleHRfcHRyID0gKHZvaWQqKXA7Ci0gIHAtPmdpZl9wdHItPmVycl9wdHIgPSBtX3N6TGFzdEVycm9yOwotICBwLT5naWZfcHRyLT5naWZfZXJyb3JfZm4gPSBnaWZfZXJyb3JfZGF0YTsKLSAgcC0+Z2lmX3B0ci0+Z2lmX2Fza19idWZfZm9yX3BhbF9mbiA9IGdpZl9hc2tfYnVmX2Zvcl9wYWw7Ci0gIHAtPmdpZl9wdHItPmdpZl9yZWNvcmRfY3VycmVudF9wb3NpdGlvbl9mbiA9IGdpZl9yZWNvcmRfY3VycmVudF9wb3NpdGlvbjsKLSAgcC0+Z2lmX3B0ci0+Z2lmX2dldF9yb3dfZm4gPSBnaWZfcmVhZF9zY2FubGluZTsKLSAgcC0+Z2lmX3B0ci0+Z2lmX2dldF9yZWNvcmRfcG9zaXRpb25fZm4gPSBnaWZfZ2V0X3JlY29yZF9wb3NpdGlvbjsKLSAgcmV0dXJuIHA7CitzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjX0dpZk1vZHVsZTo6Q29udGV4dD4gQ0NvZGVjX0dpZk1vZHVsZTo6U3RhcnQoCisgICAgRGVsZWdhdGUqIHBEZWxlZ2F0ZSkgeworICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9HaWZDb250ZXh0Pih0aGlzLCBwRGVsZWdhdGUpOwogfQogCi12b2lkIENDb2RlY19HaWZNb2R1bGU6OkZpbmlzaChGWEdJRl9Db250ZXh0KiBjdHgpIHsKLSAgaWYgKGN0eCkgewotICAgIGdpZl9kZXN0cm95X2RlY29tcHJlc3MoJmN0eC0+Z2lmX3B0cik7Ci0gICAgY3R4LT5tX0ZyZWVGdW5jKGN0eCk7Ci0gIH0KLX0KLQotaW50MzJfdCBDQ29kZWNfR2lmTW9kdWxlOjpSZWFkSGVhZGVyKEZYR0lGX0NvbnRleHQqIGN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcGFsX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogcGFsX3BwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogYmdfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkgewotICBpZiAoc2V0am1wKGN0eC0+Z2lmX3B0ci0+am1wYnVmKSkKLSAgICByZXR1cm4gMDsKLQotICBpbnQzMl90IHJldCA9IGdpZl9yZWFkX2hlYWRlcihjdHgtPmdpZl9wdHIpOwotICBpZiAocmV0ICE9IDEpCitDRlhfR2lmRGVjb2RlU3RhdHVzIENDb2RlY19HaWZNb2R1bGU6OlJlYWRIZWFkZXIoQ29udGV4dCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBhbF9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIHBhbF9wcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGJnX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpIHsKKyAgYXV0byogY29udGV4dCA9IHN0YXRpY19jYXN0PENGWF9HaWZDb250ZXh0Kj4ocENvbnRleHQpOworICBDRlhfR2lmRGVjb2RlU3RhdHVzIHJldCA9IGNvbnRleHQtPlJlYWRIZWFkZXIoKTsKKyAgaWYgKHJldCAhPSBDRlhfR2lmRGVjb2RlU3RhdHVzOjpTdWNjZXNzKQogICAgIHJldHVybiByZXQ7CiAKLSAgKndpZHRoID0gY3R4LT5naWZfcHRyLT53aWR0aDsKLSAgKmhlaWdodCA9IGN0eC0+Z2lmX3B0ci0+aGVpZ2h0OwotICAqcGFsX251bSA9IGN0eC0+Z2lmX3B0ci0+Z2xvYmFsX3BhbF9udW07Ci0gICpwYWxfcHAgPSBjdHgtPmdpZl9wdHItPmdsb2JhbF9wYWxfcHRyOwotICAqYmdfaW5kZXggPSBjdHgtPmdpZl9wdHItPmJjX2luZGV4OwotICByZXR1cm4gMTsKKyAgKndpZHRoID0gY29udGV4dC0+d2lkdGhfOworICAqaGVpZ2h0ID0gY29udGV4dC0+aGVpZ2h0XzsKKyAgKnBhbF9udW0gPSAoMiA8PCBjb250ZXh0LT5nbG9iYWxfcGFsX2V4cF8pOworICAqcGFsX3BwID0gY29udGV4dC0+Z2xvYmFsX3BhbGV0dGVfLmVtcHR5KCkgPyBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbnRleHQtPmdsb2JhbF9wYWxldHRlXy5kYXRhKCk7CisgICpiZ19pbmRleCA9IGNvbnRleHQtPmJjX2luZGV4XzsKKyAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OlN1Y2Nlc3M7CiB9CiAKLWludDMyX3QgQ0NvZGVjX0dpZk1vZHVsZTo6TG9hZEZyYW1lSW5mbyhGWEdJRl9Db250ZXh0KiBjdHgsIGludCogZnJhbWVfbnVtKSB7Ci0gIGlmIChzZXRqbXAoY3R4LT5naWZfcHRyLT5qbXBidWYpKQotICAgIHJldHVybiAwOworc3RkOjpwYWlyPENGWF9HaWZEZWNvZGVTdGF0dXMsIHNpemVfdD4gQ0NvZGVjX0dpZk1vZHVsZTo6TG9hZEZyYW1lSW5mbygKKyAgICBDb250ZXh0KiBwQ29udGV4dCkgeworICBhdXRvKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0ZYX0dpZkNvbnRleHQqPihwQ29udGV4dCk7CisgIENGWF9HaWZEZWNvZGVTdGF0dXMgcmV0ID0gY29udGV4dC0+R2V0RnJhbWUoKTsKKyAgaWYgKHJldCAhPSBDRlhfR2lmRGVjb2RlU3RhdHVzOjpTdWNjZXNzKQorICAgIHJldHVybiB7cmV0LCAwfTsKKyAgcmV0dXJuIHtDRlhfR2lmRGVjb2RlU3RhdHVzOjpTdWNjZXNzLCBjb250ZXh0LT5HZXRGcmFtZU51bSgpfTsKK30KIAotICBpbnQzMl90IHJldCA9IGdpZl9nZXRfZnJhbWUoY3R4LT5naWZfcHRyKTsKLSAgaWYgKHJldCAhPSAxKQorQ0ZYX0dpZkRlY29kZVN0YXR1cyBDQ29kZWNfR2lmTW9kdWxlOjpMb2FkRnJhbWUoQ29udGV4dCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkgeworICBhdXRvKiBjb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q0ZYX0dpZkNvbnRleHQqPihwQ29udGV4dCk7CisgIENGWF9HaWZEZWNvZGVTdGF0dXMgcmV0ID0gY29udGV4dC0+TG9hZEZyYW1lKGZyYW1lX251bSk7CisgIGlmIChyZXQgIT0gQ0ZYX0dpZkRlY29kZVN0YXR1czo6U3VjY2VzcyB8fCAhcEF0dHJpYnV0ZSkKICAgICByZXR1cm4gcmV0OwogCi0gICpmcmFtZV9udW0gPSBnaWZfZ2V0X2ZyYW1lX251bShjdHgtPmdpZl9wdHIpOwotICByZXR1cm4gMTsKLX0KLQotaW50MzJfdCBDQ29kZWNfR2lmTW9kdWxlOjpMb2FkRnJhbWUoRlhHSUZfQ29udGV4dCogY3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpIHsKLSAgaWYgKHNldGptcChjdHgtPmdpZl9wdHItPmptcGJ1ZikpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaW50MzJfdCByZXQgPSBnaWZfbG9hZF9mcmFtZShjdHgtPmdpZl9wdHIsIGZyYW1lX251bSk7Ci0gIGlmIChyZXQgPT0gMSkgewotICAgIGlmIChwQXR0cmlidXRlKSB7Ci0gICAgICBwQXR0cmlidXRlLT5tX25HaWZMZWZ0ID0KLSAgICAgICAgICAoKmN0eC0+Z2lmX3B0ci0+aW1nX3B0cl9hcnJfcHRyKVtmcmFtZV9udW1dLT5pbWFnZV9pbmZvX3B0ci0+bGVmdDsKLSAgICAgIHBBdHRyaWJ1dGUtPm1fbkdpZlRvcCA9Ci0gICAgICAgICAgKCpjdHgtPmdpZl9wdHItPmltZ19wdHJfYXJyX3B0cilbZnJhbWVfbnVtXS0+aW1hZ2VfaW5mb19wdHItPnRvcDsKLSAgICAgIHBBdHRyaWJ1dGUtPm1fZkFzcGVjdFJhdGlvID0gY3R4LT5naWZfcHRyLT5waXhlbF9hc3BlY3Q7Ci0gICAgICBpZiAoY3R4LT5naWZfcHRyLT5jbXRfZGF0YV9wdHIpIHsKLSAgICAgICAgY29uc3QgdWludDhfdCogYnVmID0KLSAgICAgICAgICAgIChjb25zdCB1aW50OF90KiljdHgtPmdpZl9wdHItPmNtdF9kYXRhX3B0ci0+R2V0QnVmZmVyKDApOwotICAgICAgICB1aW50MzJfdCBsZW4gPSBjdHgtPmdpZl9wdHItPmNtdF9kYXRhX3B0ci0+R2V0TGVuZ3RoKCk7Ci0gICAgICAgIGlmIChsZW4gPiAyMSkgewotICAgICAgICAgIHVpbnQ4X3Qgc2l6ZSA9ICpidWYrKzsKLSAgICAgICAgICBpZiAoc2l6ZSkgewotICAgICAgICAgICAgcEF0dHJpYnV0ZS0+bV9zdHJBdXRob3IgPSBDRlhfQnl0ZVN0cmluZyhidWYsIHNpemUpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwQXR0cmlidXRlLT5tX3N0ckF1dGhvci5jbGVhcigpOwotICAgICAgICAgIH0KLSAgICAgICAgICBidWYgKz0gc2l6ZTsKLSAgICAgICAgICBzaXplID0gKmJ1ZisrOwotICAgICAgICAgIGlmIChzaXplID09IDIwKSB7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkocEF0dHJpYnV0ZS0+bV9zdHJUaW1lLCBidWYsIHNpemUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KKyAgcEF0dHJpYnV0ZS0+bV9uR2lmTGVmdCA9IGNvbnRleHQtPmltYWdlc19bZnJhbWVfbnVtXS0+aW1hZ2VfaW5mby5sZWZ0OworICBwQXR0cmlidXRlLT5tX25HaWZUb3AgPSBjb250ZXh0LT5pbWFnZXNfW2ZyYW1lX251bV0tPmltYWdlX2luZm8udG9wOworICBwQXR0cmlidXRlLT5tX2ZBc3BlY3RSYXRpbyA9IGNvbnRleHQtPnBpeGVsX2FzcGVjdF87CisgIGNvbnN0IHVpbnQ4X3QqIGJ1ZiA9CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihjb250ZXh0LT5jbXRfZGF0YV8uR2V0QnVmZmVyKDApKTsKKyAgdWludDMyX3QgbGVuID0gY29udGV4dC0+Y210X2RhdGFfLkdldExlbmd0aCgpOworICBpZiAobGVuID4gMjEpIHsKKyAgICB1aW50OF90IHNpemUgPSAqYnVmKys7CisgICAgaWYgKHNpemUgIT0gMCkKKyAgICAgIHBBdHRyaWJ1dGUtPm1fc3RyQXV0aG9yID0gQnl0ZVN0cmluZyhidWYsIHNpemUpOworICAgIGVsc2UKKyAgICAgIHBBdHRyaWJ1dGUtPm1fc3RyQXV0aG9yLmNsZWFyKCk7CiAgIH0KLSAgcmV0dXJuIHJldDsKKyAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OlN1Y2Nlc3M7CiB9CiAKLXVpbnQzMl90IENDb2RlY19HaWZNb2R1bGU6OkdldEF2YWlsSW5wdXQoRlhHSUZfQ29udGV4dCogY3R4LAordWludDMyX3QgQ0NvZGVjX0dpZk1vZHVsZTo6R2V0QXZhaWxJbnB1dChDb250ZXh0KiBwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGF2YWlsX2J1Zl9wdHIpIHsKLSAgcmV0dXJuIGdpZl9nZXRfYXZhaWxfaW5wdXQoY3R4LT5naWZfcHRyLCBhdmFpbF9idWZfcHRyKTsKKyAgYXV0byogY29udGV4dCA9IHN0YXRpY19jYXN0PENGWF9HaWZDb250ZXh0Kj4ocENvbnRleHQpOworICByZXR1cm4gY29udGV4dC0+R2V0QXZhaWxJbnB1dChhdmFpbF9idWZfcHRyKTsKIH0KIAotdm9pZCBDQ29kZWNfR2lmTW9kdWxlOjpJbnB1dChGWEdJRl9Db250ZXh0KiBjdHgsCit2b2lkIENDb2RlY19HaWZNb2R1bGU6OklucHV0KENvbnRleHQqIHBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc2l6ZSkgewotICBnaWZfaW5wdXRfYnVmZmVyKGN0eC0+Z2lmX3B0ciwgKHVpbnQ4X3QqKXNyY19idWYsIHNyY19zaXplKTsKKyAgYXV0byogY29udGV4dCA9IHN0YXRpY19jYXN0PENGWF9HaWZDb250ZXh0Kj4ocENvbnRleHQpOworICBjb250ZXh0LT5TZXRJbnB1dEJ1ZmZlcigodWludDhfdCopc3JjX2J1Ziwgc3JjX3NpemUpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19naWZtb2R1bGUuaCBiL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfZ2lmbW9kdWxlLmgKaW5kZXggNzcyMWQ3YS4uNWNlZmY3YiAxMDA2NDQKLS0tIGEvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19naWZtb2R1bGUuaAorKysgYi9jb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2dpZm1vZHVsZS5oCkBAIC03LDM5ICs3LDU0IEBACiAjaWZuZGVmIENPUkVfRlhDT0RFQ19DT0RFQ19DQ09ERUNfR0lGTU9EVUxFX0hfCiAjZGVmaW5lIENPUkVfRlhDT0RFQ19DT0RFQ19DQ09ERUNfR0lGTU9EVUxFX0hfCiAKLSNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvaWNvZGVjX2dpZm1vZHVsZS5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2dpZi9jZnhfZ2lmLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCiAKLWNsYXNzIENDb2RlY19HaWZNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX0dpZk1vZHVsZSB7CitjbGFzcyBDRlhfRElCQXR0cmlidXRlOworCitjbGFzcyBDQ29kZWNfR2lmTW9kdWxlIHsKICBwdWJsaWM6CisgIGNsYXNzIENvbnRleHQgeworICAgcHVibGljOgorICAgIHZpcnR1YWwgfkNvbnRleHQoKSB7fQorICB9OworCisgIGNsYXNzIERlbGVnYXRlIHsKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgR2lmUmVjb3JkQ3VycmVudFBvc2l0aW9uKHVpbnQzMl90JiBjdXJfcG9zKSA9IDA7CisgICAgdmlydHVhbCBib29sIEdpZklucHV0UmVjb3JkUG9zaXRpb25CdWYodWludDMyX3QgcmNkX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUJiBpbWdfcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwYWxfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhbF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWxheV90aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlcl9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRyYW5zX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGlzcG9zYWxfbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW50ZXJsYWNlKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIEdpZlJlYWRTY2FubGluZShpbnQzMl90IHJvd19udW0sIHVpbnQ4X3QqIHJvd19idWYpID0gMDsKKyAgfTsKKwogICBDQ29kZWNfR2lmTW9kdWxlKCk7Ci0gIH5DQ29kZWNfR2lmTW9kdWxlKCkgb3ZlcnJpZGU7CisgIH5DQ29kZWNfR2lmTW9kdWxlKCk7CiAKLSAgRlhHSUZfQ29udGV4dCogU3RhcnQoKSBvdmVycmlkZTsKLSAgdm9pZCBGaW5pc2goRlhHSUZfQ29udGV4dCogcENvbnRleHQpIG92ZXJyaWRlOwotICB1aW50MzJfdCBHZXRBdmFpbElucHV0KEZYR0lGX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBhdmFpbF9idWZfcHRyID0gbnVsbHB0cikgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBJbnB1dChGWEdJRl9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAotICAgICAgICAgICAgIHVpbnQzMl90IHNyY19zaXplKSBvdmVycmlkZTsKLQotICBpbnQzMl90IFJlYWRIZWFkZXIoRlhHSUZfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgaW50KiBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICBpbnQqIHBhbF9udW0sCi0gICAgICAgICAgICAgICAgICAgICB2b2lkKiogcGFsX3BwLAotICAgICAgICAgICAgICAgICAgICAgaW50KiBiZ19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpIG92ZXJyaWRlOwotCi0gIGludDMyX3QgTG9hZEZyYW1lSW5mbyhGWEdJRl9Db250ZXh0KiBwQ29udGV4dCwgaW50KiBmcmFtZV9udW0pIG92ZXJyaWRlOwotICBpbnQzMl90IExvYWRGcmFtZShGWEdJRl9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX251bSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkgb3ZlcnJpZGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIEZYX0NIQVIgbV9zekxhc3RFcnJvclsyNTZdOworICBzdGQ6OnVuaXF1ZV9wdHI8Q29udGV4dD4gU3RhcnQoRGVsZWdhdGUqIHBEZWxlZ2F0ZSk7CisgIHVpbnQzMl90IEdldEF2YWlsSW5wdXQoQ29udGV4dCogY29udGV4dCwgdWludDhfdCoqIGF2YWlsX2J1Zl9wdHIgPSBudWxscHRyKTsKKyAgdm9pZCBJbnB1dChDb250ZXh0KiBjb250ZXh0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCB1aW50MzJfdCBzcmNfc2l6ZSk7CisgIENGWF9HaWZEZWNvZGVTdGF0dXMgUmVhZEhlYWRlcihDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwYWxfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIHBhbF9wcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogYmdfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKTsKKyAgc3RkOjpwYWlyPENGWF9HaWZEZWNvZGVTdGF0dXMsIHNpemVfdD4gTG9hZEZyYW1lSW5mbyhDb250ZXh0KiBjb250ZXh0KTsKKyAgQ0ZYX0dpZkRlY29kZVN0YXR1cyBMb2FkRnJhbWUoQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSk7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlhDT0RFQ19DT0RFQ19DQ09ERUNfR0lGTU9EVUxFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2ljY21vZHVsZS5oIGIvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19pY2Ntb2R1bGUuaAppbmRleCAxZjg1NmZhLi5jMzA0YjRiIDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2ljY21vZHVsZS5oCisrKyBiL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfaWNjbW9kdWxlLmgKQEAgLTcsMjMgKzcsNDEgQEAKICNpZm5kZWYgQ09SRV9GWENPREVDX0NPREVDX0NDT0RFQ19JQ0NNT0RVTEVfSF8KICNkZWZpbmUgQ09SRV9GWENPREVDX0NPREVDX0NDT0RFQ19JQ0NNT0RVTEVfSF8KIAorI2luY2x1ZGUgPG1lbW9yeT4KKwogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9meF9jb2RlY19kZWYuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCisjaWYgZGVmaW5lZChVU0VfU1lTVEVNX0xDTVMyKQorI2luY2x1ZGUgPGxjbXMyLmg+CisjZWxzZQorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xjbXMvaW5jbHVkZS9sY21zMi5oIgorI2VuZGlmCisKK2NsYXNzIENMY21zQ21tIHsKKyBwdWJsaWM6CisgIENMY21zQ21tKGludCBzcmNDb21wb25lbnRzLCBjbXNIVFJBTlNGT1JNIHRyYW5zZm9ybSwgYm9vbCBpc0xhYik7CisgIH5DTGNtc0NtbSgpOworCisgIGNtc0hUUkFOU0ZPUk0gbV9oVHJhbnNmb3JtOworICBpbnQgbV9uU3JjQ29tcG9uZW50czsKKyAgYm9vbCBtX2JMYWI7Cit9OwogCiBjbGFzcyBDQ29kZWNfSWNjTW9kdWxlIHsKICBwdWJsaWM6CiAgIENDb2RlY19JY2NNb2R1bGUoKTsKICAgfkNDb2RlY19JY2NNb2R1bGUoKTsKIAotICB2b2lkKiBDcmVhdGVUcmFuc2Zvcm1fc1JHQihjb25zdCB1aW50OF90KiBwUHJvZmlsZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3UHJvZmlsZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBuQ29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbnRlbnQgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1NyY0Zvcm1hdCA9IEljY19GT1JNQVRfREVGQVVMVCk7Ci0gIHZvaWQgRGVzdHJveVRyYW5zZm9ybSh2b2lkKiBwVHJhbnNmb3JtKTsKLSAgdm9pZCBUcmFuc2xhdGUodm9pZCogcFRyYW5zZm9ybSwgRlhfRkxPQVQqIHBTcmNWYWx1ZXMsIEZYX0ZMT0FUKiBwRGVzdFZhbHVlcyk7Ci0gIHZvaWQgVHJhbnNsYXRlU2NhbmxpbmUodm9pZCogcFRyYW5zZm9ybSwKKyAgc3RkOjp1bmlxdWVfcHRyPENMY21zQ21tPiBDcmVhdGVUcmFuc2Zvcm1fc1JHQihjb25zdCB1aW50OF90KiBwUHJvZmlsZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdQcm9maWxlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogbkNvbXBvbmVudHMpOworICB2b2lkIFRyYW5zbGF0ZShDTGNtc0NtbSogcFRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHBTcmNWYWx1ZXMsCisgICAgICAgICAgICAgICAgIGZsb2F0KiBwRGVzdFZhbHVlcyk7CisgIHZvaWQgVHJhbnNsYXRlU2NhbmxpbmUoQ0xjbXNDbW0qIHBUcmFuc2Zvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcERlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzKTsKZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfamJpZzJtb2R1bGUuaCBiL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfamJpZzJtb2R1bGUuaAppbmRleCBjNzRlZDVmLi40ZmE0YTgxIDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2piaWcybW9kdWxlLmgKKysrIGIvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19qYmlnMm1vZHVsZS5oCkBAIC0xMCwxMiArMTAsMTIgQEAKICNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvZnhfY29kZWNfZGVmLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgogCiBjbGFzcyBDSkJpZzJfQ29udGV4dDsKIGNsYXNzIENKQmlnMl9JbWFnZTsKIGNsYXNzIENQREZfU3RyZWFtQWNjOwotY2xhc3MgSUZYX1BhdXNlOworY2xhc3MgSUZYX1BhdXNlSW5kaWNhdG9yOwogY2xhc3MgSkJpZzJfRG9jdW1lbnRDb250ZXh0OwogCiBjbGFzcyBDQ29kZWNfSmJpZzJDb250ZXh0IHsKQEAgLTI1LDExICsyNSwxMCBAQAogCiAgIHVpbnQzMl90IG1fd2lkdGg7CiAgIHVpbnQzMl90IG1faGVpZ2h0OwotICBDUERGX1N0cmVhbUFjYyogbV9wR2xvYmFsU3RyZWFtOwotICBDUERGX1N0cmVhbUFjYyogbV9wU3JjU3RyZWFtOworICBSZXRhaW5QdHI8Q1BERl9TdHJlYW1BY2M+IG1fcEdsb2JhbFN0cmVhbTsKKyAgUmV0YWluUHRyPENQREZfU3RyZWFtQWNjPiBtX3BTcmNTdHJlYW07CiAgIHVpbnQ4X3QqIG1fZGVzdF9idWY7CiAgIHVpbnQzMl90IG1fZGVzdF9waXRjaDsKLSAgSUZYX1BhdXNlKiBtX3BQYXVzZTsKICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Db250ZXh0PiBtX3BDb250ZXh0OwogfTsKIApAQCAtNDMsMTMgKzQyLDE2IEBACiAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SkJpZzJfRG9jdW1lbnRDb250ZXh0PiogcENvbnRleHRIb2xkZXIsCiAgICAgICB1aW50MzJfdCB3aWR0aCwKICAgICAgIHVpbnQzMl90IGhlaWdodCwKLSAgICAgIENQREZfU3RyZWFtQWNjKiBzcmNfc3RyZWFtLAotICAgICAgQ1BERl9TdHJlYW1BY2MqIGdsb2JhbF9zdHJlYW0sCisgICAgICBjb25zdCBSZXRhaW5QdHI8Q1BERl9TdHJlYW1BY2M+JiBzcmNfc3RyZWFtLAorICAgICAgY29uc3QgUmV0YWluUHRyPENQREZfU3RyZWFtQWNjPiYgZ2xvYmFsX3N0cmVhbSwKICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAogICAgICAgdWludDMyX3QgZGVzdF9waXRjaCwKLSAgICAgIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgICAgIElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKTsKICAgRlhDT0RFQ19TVEFUVVMgQ29udGludWVEZWNvZGUoQ0NvZGVjX0piaWcyQ29udGV4dCogcEpiaWcyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CisKKyBwcml2YXRlOgorICBGWENPREVDX1NUQVRVUyBEZWNvZGUoQ0NvZGVjX0piaWcyQ29udGV4dCogcEpiaWcyQ29udGV4dCwgaW50IHJlc3VsdCk7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlhDT0RFQ19DT0RFQ19DQ09ERUNfSkJJRzJNT0RVTEVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfanBlZ21vZHVsZS5oIGIvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19qcGVnbW9kdWxlLmgKaW5kZXggYmFkNmZhNi4uYWVkMDFiZCAxMDA2NDQKLS0tIGEvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19qcGVnbW9kdWxlLmgKKysrIGIvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19qcGVnbW9kdWxlLmgKQEAgLTcsMTMgKzcsMTQgQEAKICNpZm5kZWYgQ09SRV9GWENPREVDX0NPREVDX0NDT0RFQ19KUEVHTU9EVUxFX0hfCiAjZGVmaW5lIENPUkVfRlhDT0RFQ19DT0RFQ19DQ09ERUNfSlBFR01PRFVMRV9IXwogCisjaW5jbHVkZSA8Y3NldGptcD4KICNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgogCiBjbGFzcyBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyOwogY2xhc3MgQ0ZYX0RJQlNvdXJjZTsKLXN0cnVjdCBGWEpQRUdfQ29udGV4dDsKIAogI2lmZGVmIFBERl9FTkFCTEVfWEZBCiBjbGFzcyBDRlhfRElCQXR0cmlidXRlOwpAQCAtMjEsNyArMjIsMTEgQEAKIAogY2xhc3MgQ0NvZGVjX0pwZWdNb2R1bGUgewogIHB1YmxpYzoKLSAgQ0NvZGVjX0pwZWdNb2R1bGUoKSB7fQorICBjbGFzcyBDb250ZXh0IHsKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5Db250ZXh0KCkge30KKyAgICB2aXJ0dWFsIGptcF9idWYqIEdldEp1bXBNYXJrKCkgPSAwOworICB9OwogCiAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNfU2NhbmxpbmVEZWNvZGVyPiBDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY19zaXplLApAQCAtMzYsMzQgKzQxLDI5IEBACiAgICAgICAgICAgICAgICAgaW50KiBudW1fY29tcG9uZW50cywKICAgICAgICAgICAgICAgICBpbnQqIGJpdHNfcGVyX2NvbXBvbmVudHMsCiAgICAgICAgICAgICAgICAgYm9vbCogY29sb3JfdHJhbnNmb3JtKTsKLSAgRlhKUEVHX0NvbnRleHQqIFN0YXJ0KCk7Ci0gIHZvaWQgRmluaXNoKEZYSlBFR19Db250ZXh0KiBwQ29udGV4dCk7Ci0gIHZvaWQgSW5wdXQoRlhKUEVHX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCi0gICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NpemUpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDb250ZXh0PiBTdGFydCgpOworICB2b2lkIElucHV0KENvbnRleHQqIHBDb250ZXh0LCBjb25zdCB1aW50OF90KiBzcmNfYnVmLCB1aW50MzJfdCBzcmNfc2l6ZSk7CiAKICNpZm5kZWYgUERGX0VOQUJMRV9YRkEKLSAgaW50IFJlYWRIZWFkZXIoRlhKUEVHX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLAotICAgICAgICAgICAgICAgICBpbnQqIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgaW50KiBuQ29tcHMpOworICBpbnQgUmVhZEhlYWRlcihDb250ZXh0KiBwQ29udGV4dCwgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQsIGludCogbkNvbXBzKTsKICNlbHNlICAgLy8gUERGX0VOQUJMRV9YRkEKLSAgaW50IFJlYWRIZWFkZXIoRlhKUEVHX0NvbnRleHQqIHBDb250ZXh0LAorICBpbnQgUmVhZEhlYWRlcihDb250ZXh0KiBwQ29udGV4dCwKICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwKICAgICAgICAgICAgICAgICAgaW50KiBoZWlnaHQsCiAgICAgICAgICAgICAgICAgIGludCogbkNvbXBzLAogICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKTsKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotICBib29sIFN0YXJ0U2NhbmxpbmUoRlhKUEVHX0NvbnRleHQqIHBDb250ZXh0LCBpbnQgZG93bl9zY2FsZSk7Ci0gIGJvb2wgUmVhZFNjYW5saW5lKEZYSlBFR19Db250ZXh0KiBwQ29udGV4dCwgdWludDhfdCogZGVzdF9idWYpOwotICB1aW50MzJfdCBHZXRBdmFpbElucHV0KEZYSlBFR19Db250ZXh0KiBwQ29udGV4dCwgdWludDhfdCoqIGF2YWlsX2J1Zl9wdHIpOworICBib29sIFN0YXJ0U2NhbmxpbmUoQ29udGV4dCogcENvbnRleHQsIGludCBkb3duX3NjYWxlKTsKKyAgYm9vbCBSZWFkU2NhbmxpbmUoQ29udGV4dCogcENvbnRleHQsIHVpbnQ4X3QqIGRlc3RfYnVmKTsKKyAgdWludDMyX3QgR2V0QXZhaWxJbnB1dChDb250ZXh0KiBwQ29udGV4dCwgdWludDhfdCoqIGF2YWlsX2J1Zl9wdHIpOwogCi0jaWYgX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lONjRfREVTS1RPUF8KLSAgc3RhdGljIGJvb2wgSnBlZ0VuY29kZShjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisgIHN0YXRpYyBib29sIEpwZWdFbmNvZGUoY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBkZXN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFKiBkZXN0X3NpemUpOwotI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBkZXN0X3NpemUpOworI2VuZGlmICAvLyBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZYQ09ERUNfQ09ERUNfQ0NPREVDX0pQRUdNT0RVTEVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfanB4bW9kdWxlLmggYi9jb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2pweG1vZHVsZS5oCmluZGV4IGZkOTE5ZDkuLmM1NzAwMjcgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfanB4bW9kdWxlLmgKKysrIGIvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19qcHhtb2R1bGUuaApAQCAtNyw2ICs3LDcgQEAKICNpZm5kZWYgQ09SRV9GWENPREVDX0NPREVDX0NDT0RFQ19KUFhNT0RVTEVfSF8KICNkZWZpbmUgQ09SRV9GWENPREVDX0NPREVDX0NDT0RFQ19KUFhNT0RVTEVfSF8KIAorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgpAQCAtMTksOSArMjAsOSBAQAogICBDQ29kZWNfSnB4TW9kdWxlKCk7CiAgIH5DQ29kZWNfSnB4TW9kdWxlKCk7CiAKLSAgQ0pQWF9EZWNvZGVyKiBDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ29sb3JTcGFjZSogY3MpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pQWF9EZWNvZGVyPiBDcmVhdGVEZWNvZGVyKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Db2xvclNwYWNlKiBjcyk7CiAgIHZvaWQgR2V0SW1hZ2VJbmZvKENKUFhfRGVjb2RlciogcERlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGhlaWdodCwKQEAgLTMwLDcgKzMxLDYgQEAKICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9kYXRhLAogICAgICAgICAgICAgICBpbnQgcGl0Y2gsCiAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBvZmZzZXRzKTsKLSAgdm9pZCBEZXN0cm95RGVjb2RlcihDSlBYX0RlY29kZXIqIHBEZWNvZGVyKTsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9GWENPREVDX0NPREVDX0NDT0RFQ19KUFhNT0RVTEVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfcG5nbW9kdWxlLmNwcCBiL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfcG5nbW9kdWxlLmNwcAppbmRleCAwMjg1MTNiLi4zN2U4M2Y3IDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX3BuZ21vZHVsZS5jcHAKKysrIGIvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19wbmdtb2R1bGUuY3BwCkBAIC0xMCwyMSArMTAsNDMgQEAKIAogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jb2RlY19pbnQuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvZnhfY29kZWMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworI2lmZGVmIFVTRV9TWVNURU1fTElCUE5HCisjaW5jbHVkZSA8cG5nLmg+CisjZWxzZQorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYnBuZzE2L3BuZy5oIgorI2VuZGlmCisKKyNkZWZpbmUgUE5HX0VSUk9SX1NJWkUgMjU2CisKK2NsYXNzIENQbmdDb250ZXh0IDogcHVibGljIENDb2RlY19QbmdNb2R1bGU6OkNvbnRleHQgeworIHB1YmxpYzoKKyAgQ1BuZ0NvbnRleHQoQ0NvZGVjX1BuZ01vZHVsZSogcE1vZHVsZSwgQ0NvZGVjX1BuZ01vZHVsZTo6RGVsZWdhdGUqIHBEZWxlZ2F0ZSk7CisgIH5DUG5nQ29udGV4dCgpIG92ZXJyaWRlOworCisgIHBuZ19zdHJ1Y3RwIG1fcFBuZzsKKyAgcG5nX2luZm9wIG1fcEluZm87CisgIFVub3duZWRQdHI8Q0NvZGVjX1BuZ01vZHVsZT4gbV9wTW9kdWxlOworICBVbm93bmVkUHRyPENDb2RlY19QbmdNb2R1bGU6OkRlbGVnYXRlPiBtX3BEZWxlZ2F0ZTsKKyAgdm9pZCogKCptX0FsbG9jRnVuYykodW5zaWduZWQgaW50KTsKKyAgdm9pZCAoKm1fRnJlZUZ1bmMpKHZvaWQqKTsKKyAgY2hhciBtX3N6TGFzdEVycm9yW1BOR19FUlJPUl9TSVpFXTsKK307CiAKIGV4dGVybiAiQyIgewotI3VuZGVmIEZBUgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYnBuZzE2L3BuZy5oIgotfQogCiBzdGF0aWMgdm9pZCBfcG5nX2Vycm9yX2RhdGEocG5nX3N0cnVjdHAgcG5nX3B0ciwgcG5nX2NvbnN0X2NoYXJwIGVycm9yX21zZykgewotICBpZiAocG5nX2dldF9lcnJvcl9wdHIocG5nX3B0cikpIHsKLSAgICBGWFNZU19zdHJuY3B5KChjaGFyKilwbmdfZ2V0X2Vycm9yX3B0cihwbmdfcHRyKSwgZXJyb3JfbXNnLAotICAgICAgICAgICAgICAgICAgUE5HX0VSUk9SX1NJWkUgLSAxKTsKLSAgfQorICBpZiAocG5nX2dldF9lcnJvcl9wdHIocG5nX3B0cikpCisgICAgc3RybmNweSgoY2hhciopcG5nX2dldF9lcnJvcl9wdHIocG5nX3B0ciksIGVycm9yX21zZywgUE5HX0VSUk9SX1NJWkUgLSAxKTsKKwogICBsb25nam1wKHBuZ19qbXBidWYocG5nX3B0ciksIDEpOwogfQorCiBzdGF0aWMgdm9pZCBfcG5nX3dhcm5pbmdfZGF0YShwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfY29uc3RfY2hhcnAgZXJyb3JfbXNnKSB7fQorCiBzdGF0aWMgdm9pZCBfcG5nX2xvYWRfYm1wX2F0dHJpYnV0ZShwbmdfc3RydWN0cCBwbmdfcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2luZm9wIGluZm9fcHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkgewpAQCAtNTEsMTAzICs3Myw3NiBAQAogICAgIHBuZ19nZXRfaUNDUChwbmdfcHRyLCBpbmZvX3B0ciwgJmljY19uYW1lLCAmY29tcHJlc3NfdHlwZSwgJmljY19wcm9maWxlLAogICAgICAgICAgICAgICAgICAmaWNjX3Byb2ZsZW4pOwogI2VuZGlmCi0gICAgaW50IGJUaW1lID0gMDsKLSNpZiBkZWZpbmVkKFBOR190SU1FX1NVUFBPUlRFRCkKLSAgICBwbmdfdGltZXAgdCA9IG51bGxwdHI7Ci0gICAgcG5nX2dldF90SU1FKHBuZ19wdHIsIGluZm9fcHRyLCAmdCk7Ci0gICAgaWYgKHQpIHsKLSAgICAgIEZYU1lTX21lbXNldChwQXR0cmlidXRlLT5tX3N0clRpbWUsIDAsIHNpemVvZihwQXR0cmlidXRlLT5tX3N0clRpbWUpKTsKLSAgICAgIEZYU1lTX3NucHJpbnRmKChGWF9DSEFSKilwQXR0cmlidXRlLT5tX3N0clRpbWUsCi0gICAgICAgICAgICAgICAgICAgICBzaXplb2YocEF0dHJpYnV0ZS0+bV9zdHJUaW1lKSwgIiU0dTolMnU6JTJ1ICUydTolMnU6JTJ1IiwKLSAgICAgICAgICAgICAgICAgICAgIHQtPnllYXIsIHQtPm1vbnRoLCB0LT5kYXksIHQtPmhvdXIsIHQtPm1pbnV0ZSwgdC0+c2Vjb25kKTsKLSAgICAgIHBBdHRyaWJ1dGUtPm1fc3RyVGltZVtzaXplb2YocEF0dHJpYnV0ZS0+bV9zdHJUaW1lKSAtIDFdID0gMDsKLSAgICAgIGJUaW1lID0gMTsKLSAgICB9Ci0jZW5kaWYKICNpZiBkZWZpbmVkKFBOR19URVhUX1NVUFBPUlRFRCkKICAgICBpbnQgaTsKLSAgICBGWF9TVFJTSVpFIGxlbjsKLSAgICBjb25zdCBGWF9DSEFSKiBidWY7CisgICAgc2l6ZV90IGxlbjsKKyAgICBjb25zdCBjaGFyKiBidWY7CiAgICAgaW50IG51bV90ZXh0OwogICAgIHBuZ190ZXh0cCB0ZXh0ID0gbnVsbHB0cjsKICAgICBwbmdfZ2V0X3RleHQocG5nX3B0ciwgaW5mb19wdHIsICZ0ZXh0LCAmbnVtX3RleHQpOwogICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdGV4dDsgaSsrKSB7Ci0gICAgICBsZW4gPSBGWFNZU19zdHJsZW4odGV4dFtpXS5rZXkpOworICAgICAgbGVuID0gc3RybGVuKHRleHRbaV0ua2V5KTsKICAgICAgIGJ1ZiA9ICJUaW1lIjsKLSAgICAgIGlmICghRlhTWVNfbWVtY21wKGJ1ZiwgdGV4dFtpXS5rZXksIHN0ZDo6bWluKGxlbiwgRlhTWVNfc3RybGVuKGJ1ZikpKSkgewotICAgICAgICBpZiAoIWJUaW1lKSB7Ci0gICAgICAgICAgRlhTWVNfbWVtc2V0KHBBdHRyaWJ1dGUtPm1fc3RyVGltZSwgMCwgc2l6ZW9mKHBBdHRyaWJ1dGUtPm1fc3RyVGltZSkpOwotICAgICAgICAgIEZYU1lTX21lbWNweSgKLSAgICAgICAgICAgICAgcEF0dHJpYnV0ZS0+bV9zdHJUaW1lLCB0ZXh0W2ldLnRleHQsCi0gICAgICAgICAgICAgIHN0ZDo6bWluKHNpemVvZihwQXR0cmlidXRlLT5tX3N0clRpbWUpIC0gMSwgdGV4dFtpXS50ZXh0X2xlbmd0aCkpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgeworICAgICAgaWYgKG1lbWNtcChidWYsIHRleHRbaV0ua2V5LCBzdGQ6Om1pbihsZW4sIHN0cmxlbihidWYpKSkpIHsKICAgICAgICAgYnVmID0gIkF1dGhvciI7Ci0gICAgICAgIGlmICghRlhTWVNfbWVtY21wKGJ1ZiwgdGV4dFtpXS5rZXksIHN0ZDo6bWluKGxlbiwgRlhTWVNfc3RybGVuKGJ1ZikpKSkgeworICAgICAgICBpZiAoIW1lbWNtcChidWYsIHRleHRbaV0ua2V5LCBzdGQ6Om1pbihsZW4sIHN0cmxlbihidWYpKSkpIHsKICAgICAgICAgICBwQXR0cmlidXRlLT5tX3N0ckF1dGhvciA9Ci0gICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHRleHRbaV0udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZYX1NUUlNJWkU+KHRleHRbaV0udGV4dF9sZW5ndGgpKTsKKyAgICAgICAgICAgICAgdGV4dFtpXS50ZXh0X2xlbmd0aCA+IDAKKyAgICAgICAgICAgICAgICAgID8gQnl0ZVN0cmluZyhyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPih0ZXh0W2ldLnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4odGV4dFtpXS50ZXh0X2xlbmd0aCkpCisgICAgICAgICAgICAgICAgICA6IEJ5dGVTdHJpbmcoKTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KICNlbmRpZgogICB9CiB9Ci1zdHJ1Y3QgRlhQTkdfQ29udGV4dCB7Ci0gIHBuZ19zdHJ1Y3RwIHBuZ19wdHI7Ci0gIHBuZ19pbmZvcCBpbmZvX3B0cjsKLSAgdm9pZCogcGFyZW50X3B0cjsKIAotICB2b2lkKiAoKm1fQWxsb2NGdW5jKSh1bnNpZ25lZCBpbnQpOwotICB2b2lkICgqbV9GcmVlRnVuYykodm9pZCopOwotfTsKLWV4dGVybiAiQyIgewogc3RhdGljIHZvaWQqIF9wbmdfYWxsb2NfZnVuYyh1bnNpZ25lZCBpbnQgc2l6ZSkgewogICByZXR1cm4gRlhfQWxsb2MoY2hhciwgc2l6ZSk7CiB9CisKIHN0YXRpYyB2b2lkIF9wbmdfZnJlZV9mdW5jKHZvaWQqIHApIHsKICAgRlhfRnJlZShwKTsKIH0KLX07CisKIHN0YXRpYyB2b2lkIF9wbmdfZ2V0X2hlYWRlcl9mdW5jKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikgewotICBGWFBOR19Db250ZXh0KiBwID0gKEZYUE5HX0NvbnRleHQqKXBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKHBuZ19wdHIpOwotICBpZiAoIXApCisgIGF1dG8qIHBDb250ZXh0ID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q1BuZ0NvbnRleHQqPihwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwbmdfcHRyKSk7CisgIGlmICghcENvbnRleHQpCiAgICAgcmV0dXJuOwogCi0gIENDb2RlY19QbmdNb2R1bGUqIHBNb2R1bGUgPSAoQ0NvZGVjX1BuZ01vZHVsZSopcC0+cGFyZW50X3B0cjsKLSAgaWYgKCFwTW9kdWxlKQotICAgIHJldHVybjsKLQotICBwbmdfdWludF8zMiB3aWR0aCA9IDAsIGhlaWdodCA9IDA7Ci0gIGludCBicGMgPSAwLCBjb2xvcl90eXBlID0gMCwgY29sb3JfdHlwZTEgPSAwLCBwYXNzID0gMDsKLSAgZG91YmxlIGdhbW1hID0gMS4wOworICBwbmdfdWludF8zMiB3aWR0aCA9IDA7CisgIHBuZ191aW50XzMyIGhlaWdodCA9IDA7CisgIGludCBicGMgPSAwOworICBpbnQgY29sb3JfdHlwZSA9IDA7CiAgIHBuZ19nZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgJndpZHRoLCAmaGVpZ2h0LCAmYnBjLCAmY29sb3JfdHlwZSwgbnVsbHB0ciwKICAgICAgICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIpOwotICBjb2xvcl90eXBlMSA9IGNvbG9yX3R5cGU7Ci0gIGlmIChicGMgPiA4KSB7CisgIGludCBjb2xvcl90eXBlMSA9IGNvbG9yX3R5cGU7CisgIGlmIChicGMgPiA4KQogICAgIHBuZ19zZXRfc3RyaXBfMTYocG5nX3B0cik7Ci0gIH0gZWxzZSBpZiAoYnBjIDwgOCkgeworICBlbHNlIGlmIChicGMgPCA4KQogICAgIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOChwbmdfcHRyKTsKLSAgfQorCiAgIGJwYyA9IDg7Ci0gIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpIHsKKyAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSkKICAgICBwbmdfc2V0X3BhbGV0dGVfdG9fcmdiKHBuZ19wdHIpOwotICB9Ci0gIHBhc3MgPSBwbmdfc2V0X2ludGVybGFjZV9oYW5kbGluZyhwbmdfcHRyKTsKLSAgaWYgKCFwTW9kdWxlLT5HZXREZWxlZ2F0ZSgpLT5QbmdSZWFkSGVhZGVyKHdpZHRoLCBoZWlnaHQsIGJwYywgcGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvcl90eXBlLCAmZ2FtbWEpKSB7Ci0gICAgcG5nX2Vycm9yKHAtPnBuZ19wdHIsICJSZWFkIEhlYWRlciBDYWxsYmFjayBFcnJvciIpOworCisgIGludCBwYXNzID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7CisgIGRvdWJsZSBnYW1tYSA9IDEuMDsKKyAgaWYgKCFwQ29udGV4dC0+bV9wRGVsZWdhdGUtPlBuZ1JlYWRIZWFkZXIod2lkdGgsIGhlaWdodCwgYnBjLCBwYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sb3JfdHlwZSwgJmdhbW1hKSkgeworICAgIHBuZ19lcnJvcihwQ29udGV4dC0+bV9wUG5nLCAiUmVhZCBIZWFkZXIgQ2FsbGJhY2sgRXJyb3IiKTsKICAgfQogICBpbnQgaW50ZW50OwogICBpZiAocG5nX2dldF9zUkdCKHBuZ19wdHIsIGluZm9fcHRyLCAmaW50ZW50KSkgewogICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgZ2FtbWEsIDAuNDU0NTUpOwogICB9IGVsc2UgewogICAgIGRvdWJsZSBpbWFnZV9nYW1tYTsKLSAgICBpZiAocG5nX2dldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCAmaW1hZ2VfZ2FtbWEpKSB7CisgICAgaWYgKHBuZ19nZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgJmltYWdlX2dhbW1hKSkKICAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgZ2FtbWEsIGltYWdlX2dhbW1hKTsKLSAgICB9IGVsc2UgeworICAgIGVsc2UKICAgICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwgZ2FtbWEsIDAuNDU0NTUpOwotICAgIH0KICAgfQogICBzd2l0Y2ggKGNvbG9yX3R5cGUpIHsKICAgICBjYXNlIFBOR19DT0xPUl9UWVBFX0dSQVk6CkBAIC0xNTgsNyArMTUzLDcgQEAKICAgICB9IGJyZWFrOwogICAgIGNhc2UgUE5HX0NPTE9SX1RZUEVfUEFMRVRURToKICAgICAgIGlmIChjb2xvcl90eXBlMSAhPSBQTkdfQ09MT1JfVFlQRV9QQUxFVFRFKSB7Ci0gICAgICAgIHBuZ19lcnJvcihwLT5wbmdfcHRyLCAiTm90IFN1cHBvcnQgT3V0cHV0IFBhbGV0dGUgTm93Iik7CisgICAgICAgIHBuZ19lcnJvcihwQ29udGV4dC0+bV9wUG5nLCAiTm90IFN1cHBvcnQgT3V0cHV0IFBhbGV0dGUgTm93Iik7CiAgICAgICB9CiAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0I6CiAgICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE6CkBAIC0xNjgsOTUgKzE2Myw4OSBAQAogICAgICAgcG5nX3NldF9iZ3IocG5nX3B0cik7CiAgICAgICBicmVhazsKICAgfQotICBpZiAoIShjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEpKSB7CisgIGlmICghKGNvbG9yX3R5cGUgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkpCiAgICAgcG5nX3NldF9zdHJpcF9hbHBoYShwbmdfcHRyKTsKLSAgfQorCiAgIGlmIChjb2xvcl90eXBlICYgUE5HX0NPTE9SX01BU0tfQUxQSEEgJiYKICAgICAgICEoY29sb3JfdHlwZTEgJiBQTkdfQ09MT1JfTUFTS19BTFBIQSkpIHsKICAgICBwbmdfc2V0X2ZpbGxlcihwbmdfcHRyLCAweGZmLCBQTkdfRklMTEVSX0FGVEVSKTsKICAgfQogICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7CiB9CisKIHN0YXRpYyB2b2lkIF9wbmdfZ2V0X2VuZF9mdW5jKHBuZ19zdHJ1Y3RwIHBuZ19wdHIsIHBuZ19pbmZvcCBpbmZvX3B0cikge30KKwogc3RhdGljIHZvaWQgX3BuZ19nZXRfcm93X2Z1bmMocG5nX3N0cnVjdHAgcG5nX3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlcCBuZXdfcm93LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X251bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXNzKSB7Ci0gIEZYUE5HX0NvbnRleHQqIHAgPSAoRlhQTkdfQ29udGV4dCopcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocG5nX3B0cik7Ci0gIGlmICghcCkKKyAgYXV0byogcENvbnRleHQgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxDUG5nQ29udGV4dCo+KHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKHBuZ19wdHIpKTsKKyAgaWYgKCFwQ29udGV4dCkKICAgICByZXR1cm47CiAKLSAgQ0NvZGVjX1BuZ01vZHVsZSogcE1vZHVsZSA9IChDQ29kZWNfUG5nTW9kdWxlKilwLT5wYXJlbnRfcHRyOwotICB1aW50OF90KiBzcmNfYnVmID0gbnVsbHB0cjsKLSAgaWYgKCFwTW9kdWxlLT5HZXREZWxlZ2F0ZSgpLT5QbmdBc2tTY2FubGluZUJ1Zihyb3dfbnVtLCBzcmNfYnVmKSkgeworICB1aW50OF90KiBzcmNfYnVmOworICBpZiAoIXBDb250ZXh0LT5tX3BEZWxlZ2F0ZS0+UG5nQXNrU2NhbmxpbmVCdWYocm93X251bSwgJnNyY19idWYpKQogICAgIHBuZ19lcnJvcihwbmdfcHRyLCAiQXNrIFNjYW5saW5lIGJ1ZmZlciBDYWxsYmFjayBFcnJvciIpOwotICB9Ci0gIGlmIChzcmNfYnVmKSB7CisKKyAgaWYgKHNyY19idWYpCiAgICAgcG5nX3Byb2dyZXNzaXZlX2NvbWJpbmVfcm93KHBuZ19wdHIsIHNyY19idWYsIG5ld19yb3cpOwotICB9Ci0gIHBNb2R1bGUtPkdldERlbGVnYXRlKCktPlBuZ0ZpbGxTY2FubGluZUJ1ZkNvbXBsZXRlZChwYXNzLCByb3dfbnVtKTsKKworICBwQ29udGV4dC0+bV9wRGVsZWdhdGUtPlBuZ0ZpbGxTY2FubGluZUJ1ZkNvbXBsZXRlZChwYXNzLCByb3dfbnVtKTsKIH0KIAotQ0NvZGVjX1BuZ01vZHVsZTo6Q0NvZGVjX1BuZ01vZHVsZSgpIHsKK30gIC8vIGV4dGVybiAiQyIKKworQ1BuZ0NvbnRleHQ6OkNQbmdDb250ZXh0KENDb2RlY19QbmdNb2R1bGUqIHBNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0NvZGVjX1BuZ01vZHVsZTo6RGVsZWdhdGUqIHBEZWxlZ2F0ZSkKKyAgICA6IG1fcFBuZyhudWxscHRyKSwKKyAgICAgIG1fcEluZm8obnVsbHB0ciksCisgICAgICBtX3BNb2R1bGUocE1vZHVsZSksCisgICAgICBtX3BEZWxlZ2F0ZShwRGVsZWdhdGUpLAorICAgICAgbV9BbGxvY0Z1bmMoX3BuZ19hbGxvY19mdW5jKSwKKyAgICAgIG1fRnJlZUZ1bmMoX3BuZ19mcmVlX2Z1bmMpIHsKICAgbWVtc2V0KG1fc3pMYXN0RXJyb3IsIDAsIHNpemVvZihtX3N6TGFzdEVycm9yKSk7CiB9CiAKLUNDb2RlY19QbmdNb2R1bGU6On5DQ29kZWNfUG5nTW9kdWxlKCkge30KK0NQbmdDb250ZXh0Ojp+Q1BuZ0NvbnRleHQoKSB7CisgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KG1fcFBuZyA/ICZtX3BQbmcgOiBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BJbmZvID8gJm1fcEluZm8gOiBudWxscHRyLCBudWxscHRyKTsKK30KIAotRlhQTkdfQ29udGV4dCogQ0NvZGVjX1BuZ01vZHVsZTo6U3RhcnQoKSB7Ci0gIEZYUE5HX0NvbnRleHQqIHAgPSBGWF9BbGxvYyhGWFBOR19Db250ZXh0LCAxKTsKLSAgaWYgKCFwKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIHAtPm1fQWxsb2NGdW5jID0gX3BuZ19hbGxvY19mdW5jOwotICBwLT5tX0ZyZWVGdW5jID0gX3BuZ19mcmVlX2Z1bmM7Ci0gIHAtPnBuZ19wdHIgPSBudWxscHRyOwotICBwLT5pbmZvX3B0ciA9IG51bGxwdHI7Ci0gIHAtPnBhcmVudF9wdHIgPSAodm9pZCopdGhpczsKLSAgcC0+cG5nX3B0ciA9CitzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjX1BuZ01vZHVsZTo6Q29udGV4dD4gQ0NvZGVjX1BuZ01vZHVsZTo6U3RhcnQoCisgICAgRGVsZWdhdGUqIHBEZWxlZ2F0ZSkgeworICBhdXRvIHAgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BuZ0NvbnRleHQ+KHRoaXMsIHBEZWxlZ2F0ZSk7CisgIHAtPm1fcFBuZyA9CiAgICAgICBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cik7Ci0gIGlmICghcC0+cG5nX3B0cikgewotICAgIEZYX0ZyZWUocCk7CisgIGlmICghcC0+bV9wUG5nKQogICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHAtPmluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwLT5wbmdfcHRyKTsKLSAgaWYgKCFwLT5pbmZvX3B0cikgewotICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCYocC0+cG5nX3B0ciksIG51bGxwdHIsIG51bGxwdHIpOwotICAgIEZYX0ZyZWUocCk7CisKKyAgcC0+bV9wSW5mbyA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocC0+bV9wUG5nKTsKKyAgaWYgKCFwLT5tX3BJbmZvKQogICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwLT5wbmdfcHRyKSkpIHsKLSAgICBpZiAocCkgewotICAgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoJihwLT5wbmdfcHRyKSwgJihwLT5pbmZvX3B0ciksIG51bGxwdHIpOwotICAgICAgRlhfRnJlZShwKTsKLSAgICB9CisKKyAgaWYgKHNldGptcChwbmdfam1wYnVmKHAtPm1fcFBuZykpKQogICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHBuZ19zZXRfcHJvZ3Jlc3NpdmVfcmVhZF9mbihwLT5wbmdfcHRyLCBwLCBfcG5nX2dldF9oZWFkZXJfZnVuYywKKworICBwbmdfc2V0X3Byb2dyZXNzaXZlX3JlYWRfZm4ocC0+bV9wUG5nLCBwLmdldCgpLCBfcG5nX2dldF9oZWFkZXJfZnVuYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wbmdfZ2V0X3Jvd19mdW5jLCBfcG5nX2dldF9lbmRfZnVuYyk7Ci0gIHBuZ19zZXRfZXJyb3JfZm4ocC0+cG5nX3B0ciwgbV9zekxhc3RFcnJvciwgKHBuZ19lcnJvcl9wdHIpX3BuZ19lcnJvcl9kYXRhLAotICAgICAgICAgICAgICAgICAgIChwbmdfZXJyb3JfcHRyKV9wbmdfd2FybmluZ19kYXRhKTsKKyAgcG5nX3NldF9lcnJvcl9mbihwLT5tX3BQbmcsIHAtPm1fc3pMYXN0RXJyb3IsIF9wbmdfZXJyb3JfZGF0YSwKKyAgICAgICAgICAgICAgICAgICBfcG5nX3dhcm5pbmdfZGF0YSk7CiAgIHJldHVybiBwOwogfQogCi12b2lkIENDb2RlY19QbmdNb2R1bGU6OkZpbmlzaChGWFBOR19Db250ZXh0KiBjdHgpIHsKLSAgaWYgKGN0eCkgewotICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCYoY3R4LT5wbmdfcHRyKSwgJihjdHgtPmluZm9fcHRyKSwgbnVsbHB0cik7Ci0gICAgY3R4LT5tX0ZyZWVGdW5jKGN0eCk7Ci0gIH0KLX0KLQotYm9vbCBDQ29kZWNfUG5nTW9kdWxlOjpJbnB1dChGWFBOR19Db250ZXh0KiBjdHgsCitib29sIENDb2RlY19QbmdNb2R1bGU6OklucHV0KENvbnRleHQqIHBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkgewotICBpZiAoc2V0am1wKHBuZ19qbXBidWYoY3R4LT5wbmdfcHRyKSkpIHsKKyAgYXV0byogY3R4ID0gc3RhdGljX2Nhc3Q8Q1BuZ0NvbnRleHQqPihwQ29udGV4dCk7CisgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihjdHgtPm1fcFBuZykpKSB7CiAgICAgaWYgKHBBdHRyaWJ1dGUgJiYKLSAgICAgICAgMCA9PSBGWFNZU19zdHJjbXAobV9zekxhc3RFcnJvciwgIlJlYWQgSGVhZGVyIENhbGxiYWNrIEVycm9yIikpIHsKLSAgICAgIF9wbmdfbG9hZF9ibXBfYXR0cmlidXRlKGN0eC0+cG5nX3B0ciwgY3R4LT5pbmZvX3B0ciwgcEF0dHJpYnV0ZSk7CisgICAgICAgIHN0cmNtcChjdHgtPm1fc3pMYXN0RXJyb3IsICJSZWFkIEhlYWRlciBDYWxsYmFjayBFcnJvciIpID09IDApIHsKKyAgICAgIF9wbmdfbG9hZF9ibXBfYXR0cmlidXRlKGN0eC0+bV9wUG5nLCBjdHgtPm1fcEluZm8sIHBBdHRyaWJ1dGUpOwogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLSAgcG5nX3Byb2Nlc3NfZGF0YShjdHgtPnBuZ19wdHIsIGN0eC0+aW5mb19wdHIsICh1aW50OF90KilzcmNfYnVmLCBzcmNfc2l6ZSk7CisgIHBuZ19wcm9jZXNzX2RhdGEoY3R4LT5tX3BQbmcsIGN0eC0+bV9wSW5mbywgKHVpbnQ4X3QqKXNyY19idWYsIHNyY19zaXplKTsKICAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX3BuZ21vZHVsZS5oIGIvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19wbmdtb2R1bGUuaAppbmRleCAxZjNhM2Q5Li44NDdmNjdlIDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX3BuZ21vZHVsZS5oCisrKyBiL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfcG5nbW9kdWxlLmgKQEAgLTcsMjUgKzcsNDAgQEAKICNpZm5kZWYgQ09SRV9GWENPREVDX0NPREVDX0NDT0RFQ19QTkdNT0RVTEVfSF8KICNkZWZpbmUgQ09SRV9GWENPREVDX0NPREVDX0NDT0RFQ19QTkdNT0RVTEVfSF8KIAotI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9pY29kZWNfcG5nbW9kdWxlLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKIAotI2RlZmluZSBQTkdfRVJST1JfU0laRSAyNTYKK2NsYXNzIENGWF9ESUJBdHRyaWJ1dGU7CiAKLWNsYXNzIENDb2RlY19QbmdNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX1BuZ01vZHVsZSB7CitjbGFzcyBDQ29kZWNfUG5nTW9kdWxlIHsKICBwdWJsaWM6Ci0gIENDb2RlY19QbmdNb2R1bGUoKTsKLSAgfkNDb2RlY19QbmdNb2R1bGUoKSBvdmVycmlkZTsKKyAgY2xhc3MgQ29udGV4dCB7CisgICBwdWJsaWM6CisgICAgdmlydHVhbCB+Q29udGV4dCgpIHt9CisgIH07CiAKLSAgRlhQTkdfQ29udGV4dCogU3RhcnQoKSBvdmVycmlkZTsKLSAgdm9pZCBGaW5pc2goRlhQTkdfQ29udGV4dCogcENvbnRleHQpIG92ZXJyaWRlOwotICBib29sIElucHV0KEZYUE5HX0NvbnRleHQqIHBDb250ZXh0LAorICBjbGFzcyBEZWxlZ2F0ZSB7CisgICBwdWJsaWM6CisgICAgdmlydHVhbCBib29sIFBuZ1JlYWRIZWFkZXIoaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbG9yX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBnYW1tYSkgPSAwOworCisgICAgLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuIHxwU3JjQnVmfCB3aWxsIGJlIHNldCBpZiB0aGlzIHN1Y2NlZWRzLgorICAgIC8vIHxwU3JjQnVmfCBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgYnVmZmVyLgorICAgIHZpcnR1YWwgYm9vbCBQbmdBc2tTY2FubGluZUJ1ZihpbnQgbGluZSwgdWludDhfdCoqIHBTcmNCdWYpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBQbmdGaWxsU2NhbmxpbmVCdWZDb21wbGV0ZWQoaW50IHBhc3MsIGludCBsaW5lKSA9IDA7CisgIH07CisKKyAgc3RkOjp1bmlxdWVfcHRyPENvbnRleHQ+IFN0YXJ0KERlbGVnYXRlKiBwRGVsZWdhdGUpOworICBib29sIElucHV0KENvbnRleHQqIHBDb250ZXh0LAogICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCiAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NpemUsCi0gICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkgb3ZlcnJpZGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIEZYX0NIQVIgbV9zekxhc3RFcnJvcltQTkdfRVJST1JfU0laRV07CisgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSk7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlhDT0RFQ19DT0RFQ19DQ09ERUNfUE5HTU9EVUxFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX3Byb2dyZXNzaXZlZGVjb2Rlci5oIGIvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19wcm9ncmVzc2l2ZWRlY29kZXIuaAppbmRleCA2MTcwM2RkLi40MWUxMGU2IDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX3Byb2dyZXNzaXZlZGVjb2Rlci5oCisrKyBiL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfcHJvZ3Jlc3NpdmVkZWNvZGVyLmgKQEAgLTcsMjcgKzcsMjggQEAKICNpZm5kZWYgQ09SRV9GWENPREVDX0NPREVDX0NDT0RFQ19QUk9HUkVTU0lWRURFQ09ERVJfSF8KICNkZWZpbmUgQ09SRV9GWENPREVDX0NPREVDX0NDT0RFQ19QUk9HUkVTU0lWRURFQ09ERVJfSF8KIAorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAotI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9pY29kZWNfYm1wbW9kdWxlLmgiCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2ljb2RlY19naWZtb2R1bGUuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvaWNvZGVjX3BuZ21vZHVsZS5oIgotI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9pY29kZWNfdGlmZm1vZHVsZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfYm1wbW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19naWZtb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2pwZWdtb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX3BuZ21vZHVsZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfdGlmZm1vZHVsZS5oIgogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9meF9jb2RlY19kZWYuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgogCi1jbGFzcyBDQ29kZWNfSnBlZ01vZHVsZTsKIGNsYXNzIENDb2RlY19Nb2R1bGVNZ3I7CiBjbGFzcyBDRlhfRElCQXR0cmlidXRlOwogY2xhc3MgSUZYX1NlZWthYmxlUmVhZFN0cmVhbTsKLWNsYXNzIElGWF9QYXVzZTsKLXN0cnVjdCBGWEpQRUdfQ29udGV4dDsKIAotY2xhc3MgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlciA6IHB1YmxpYyBJQ29kZWNfQm1wTW9kdWxlOjpEZWxlZ2F0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSUNvZGVjX0dpZk1vZHVsZTo6RGVsZWdhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElDb2RlY19QbmdNb2R1bGU6OkRlbGVnYXRlIHsKK2NsYXNzIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIgOiBwdWJsaWMgQ0NvZGVjX0JtcE1vZHVsZTo6RGVsZWdhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIENDb2RlY19HaWZNb2R1bGU6OkRlbGVnYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDQ29kZWNfUG5nTW9kdWxlOjpEZWxlZ2F0ZSB7CiAgcHVibGljOgogICBlbnVtIEZYQ29kZWNfRm9ybWF0IHsKICAgICBGWENvZGVjX0ludmFsaWQgPSAwLApAQCAtNDQsMTEgKzQ1LDEwIEBACiAgIGV4cGxpY2l0IENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIoQ0NvZGVjX01vZHVsZU1nciogcENvZGVjTWdyKTsKICAgdmlydHVhbCB+Q0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlcigpOwogCi0gIEZYQ09ERUNfU1RBVFVTIExvYWRJbWFnZUluZm8oCi0gICAgICBjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZSwKLSAgICAgIEZYQ09ERUNfSU1BR0VfVFlQRSBpbWFnZVR5cGUsCi0gICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlLAotICAgICAgYm9vbCBiU2tpcEltYWdlVHlwZUNoZWNrKTsKKyAgRlhDT0RFQ19TVEFUVVMgTG9hZEltYWdlSW5mbyhjb25zdCBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQ09ERUNfSU1BR0VfVFlQRSBpbWFnZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTa2lwSW1hZ2VUeXBlQ2hlY2spOwogCiAgIEZYQ09ERUNfSU1BR0VfVFlQRSBHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9pbWFnVHlwZTsgfQogICBpbnQzMl90IEdldFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9TcmNXaWR0aDsgfQpAQCAtNTcsMTYgKzU3LDE0IEBACiAgIGludDMyX3QgR2V0QlBDKCkgY29uc3QgeyByZXR1cm4gbV9TcmNCUEM7IH0KICAgdm9pZCBTZXRDbGlwQm94KEZYX1JFQ1QqIGNsaXApOwogCi0gIEZYQ09ERUNfU1RBVFVTIEdldEZyYW1lcyhpbnQzMl90JiBmcmFtZXMsIElGWF9QYXVzZSogcFBhdXNlID0gbnVsbHB0cik7Ci0gIEZYQ09ERUNfU1RBVFVTIFN0YXJ0RGVjb2RlKENGWF9ESUJpdG1hcCogcERJQml0bWFwLAorICBzdGQ6OnBhaXI8RlhDT0RFQ19TVEFUVVMsIHNpemVfdD4gR2V0RnJhbWVzKCk7CisgIEZYQ09ERUNfU1RBVFVTIFN0YXJ0RGVjb2RlKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwRElCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJbnRlcnBvbCA9IHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95KTsKIAotICBGWENPREVDX1NUQVRVUyBDb250aW51ZURlY29kZShJRlhfUGF1c2UqIHBQYXVzZSA9IG51bGxwdHIpOworICBGWENPREVDX1NUQVRVUyBDb250aW51ZURlY29kZSgpOwogCiAgIHN0cnVjdCBQaXhlbFdlaWdodCB7CiAgICAgaW50IG1fU3JjU3RhcnQ7CkBAIC04NCw4ICs4Miw3IEBACiAgICAgICAgICAgICAgIGludCBkZXN0X21heCwKICAgICAgICAgICAgICAgaW50IHNyY19sZW4sCiAgICAgICAgICAgICAgIGludCBzcmNfbWluLAotICAgICAgICAgICAgICBpbnQgc3JjX21heCwKLSAgICAgICAgICAgICAgYm9vbCBiSW50ZXJwb2wpOworICAgICAgICAgICAgICBpbnQgc3JjX21heCk7CiAgICAgUGl4ZWxXZWlnaHQqIEdldFBpeGVsV2VpZ2h0KGludCBwaXhlbCkgewogICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UGl4ZWxXZWlnaHQqPihtX3BXZWlnaHRUYWJsZXMuZGF0YSgpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBpeGVsIC0gbV9EZXN0TWluKSAqIG1fSXRlbVNpemUpOwpAQCAtMTAxLDcgKzk4LDcgQEAKICAgICBDRlhDT0RFQ19Ib3J6VGFibGUoKTsKICAgICB+Q0ZYQ09ERUNfSG9yelRhYmxlKCk7CiAKLSAgICB2b2lkIENhbGMoaW50IGRlc3RfbGVuLCBpbnQgc3JjX2xlbiwgYm9vbCBiSW50ZXJwb2wpOworICAgIHZvaWQgQ2FsYyhpbnQgZGVzdF9sZW4sIGludCBzcmNfbGVuKTsKICAgICBQaXhlbFdlaWdodCogR2V0UGl4ZWxXZWlnaHQoaW50IHBpeGVsKSB7CiAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQaXhlbFdlaWdodCo+KG1fcFdlaWdodFRhYmxlcy5kYXRhKCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbCAqIG1fSXRlbVNpemUpOwpAQCAtMTI1LDIxICsxMjIsOTkgQEAKICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtX3BXZWlnaHRUYWJsZXM7CiAgIH07CiAKLSAgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBtX3BGaWxlOwotICBDQ29kZWNfTW9kdWxlTWdyKiBtX3BDb2RlY01ncjsKLSAgRlhKUEVHX0NvbnRleHQqIG1fcEpwZWdDb250ZXh0OwotICBGWFBOR19Db250ZXh0KiBtX3BQbmdDb250ZXh0OwotICBGWEdJRl9Db250ZXh0KiBtX3BHaWZDb250ZXh0OwotICBGWEJNUF9Db250ZXh0KiBtX3BCbXBDb250ZXh0OwotICBDQ29kZWNfVGlmZkNvbnRleHQqIG1fcFRpZmZDb250ZXh0OworICAvLyBDQ29kZWNfUG5nTW9kdWxlOjpEZWxlZ2F0ZQorICBib29sIFBuZ1JlYWRIZWFkZXIoaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBicGMsCisgICAgICAgICAgICAgICAgICAgICBpbnQgcGFzcywKKyAgICAgICAgICAgICAgICAgICAgIGludCogY29sb3JfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZ2FtbWEpIG92ZXJyaWRlOworICBib29sIFBuZ0Fza1NjYW5saW5lQnVmKGludCBsaW5lLCB1aW50OF90KiogcFNyY0J1Zikgb3ZlcnJpZGU7CisgIHZvaWQgUG5nRmlsbFNjYW5saW5lQnVmQ29tcGxldGVkKGludCBwYXNzLCBpbnQgbGluZSkgb3ZlcnJpZGU7CisKKyAgLy8gQ0NvZGVjX0dpZk1vZHVsZTo6RGVsZWdhdGUKKyAgdm9pZCBHaWZSZWNvcmRDdXJyZW50UG9zaXRpb24odWludDMyX3QmIGN1cl9wb3MpIG92ZXJyaWRlOworICBib29sIEdpZklucHV0UmVjb3JkUG9zaXRpb25CdWYodWludDMyX3QgcmNkX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QmIGltZ19yYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGFsX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhbF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlbGF5X3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZXJfaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRyYW5zX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkaXNwb3NhbF9tZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGludGVybGFjZSkgb3ZlcnJpZGU7CisgIHZvaWQgR2lmUmVhZFNjYW5saW5lKGludDMyX3Qgcm93X251bSwgdWludDhfdCogcm93X2J1Zikgb3ZlcnJpZGU7CisKKyAgLy8gQ0NvZGVjX0JtcE1vZHVsZTo6RGVsZWdhdGUKKyAgYm9vbCBCbXBJbnB1dEltYWdlUG9zaXRpb25CdWYodWludDMyX3QgcmNkX3Bvcykgb3ZlcnJpZGU7CisgIHZvaWQgQm1wUmVhZFNjYW5saW5lKHVpbnQzMl90IHJvd19udW0sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiByb3dfYnVmKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIGJvb2wgQm1wUmVhZE1vcmVEYXRhKENDb2RlY19CbXBNb2R1bGUqIHBCbXBNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgIEZYQ09ERUNfU1RBVFVTJiBlcnJfc3RhdHVzKTsKKyAgYm9vbCBHaWZSZWFkTW9yZURhdGEoQ0NvZGVjX0dpZk1vZHVsZSogcEdpZk1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRlhDT0RFQ19TVEFUVVMmIGVycl9zdGF0dXMpOworICBib29sIEpwZWdSZWFkTW9yZURhdGEoQ0NvZGVjX0pwZWdNb2R1bGUqIHBKcGVnTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhDT0RFQ19TVEFUVVMmIGVycl9zdGF0dXMpOworICB2b2lkIFBuZ09uZU9uZU1hcFJlc2FtcGxlSG9yeihjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcERldmljZUJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZXNfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQ29kZWNfRm9ybWF0IHNyY19mb3JtYXQpOworICBib29sIERldGVjdEltYWdlVHlwZShGWENPREVDX0lNQUdFX1RZUEUgaW1hZ2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKTsKKyAgYm9vbCBCbXBEZXRlY3RJbWFnZVR5cGUoQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSwgdWludDMyX3Qgc2l6ZSk7CisgIGJvb2wgSnBlZ0RldGVjdEltYWdlVHlwZShDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlLCB1aW50MzJfdCBzaXplKTsKKyAgYm9vbCBQbmdEZXRlY3RJbWFnZVR5cGUoQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSwgdWludDMyX3Qgc2l6ZSk7CisgIGJvb2wgR2lmRGV0ZWN0SW1hZ2VUeXBlKENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUsIHVpbnQzMl90IHNpemUpOworICBib29sIFRpZkRldGVjdEltYWdlVHlwZShDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlLCB1aW50MzJfdCBzaXplKTsKKworICB2b2lkIEdldERvd25TY2FsZShpbnQmIGRvd25fc2NhbGUpOworICB2b2lkIEdldFRyYW5zTWV0aG9kKEZYRElCX0Zvcm1hdCBkZXNfZm9ybWF0LCBGWENvZGVjX0Zvcm1hdCBzcmNfZm9ybWF0KTsKKworICB2b2lkIFJlU2FtcGxlU2NhbmxpbmUoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBEZXZpY2VCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlc19saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICBGWENvZGVjX0Zvcm1hdCBzcmNfZm9ybWF0KTsKKyAgdm9pZCBSZXNhbXBsZShjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcERldmljZUJpdG1hcCwKKyAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19saW5lLAorICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgIEZYQ29kZWNfRm9ybWF0IHNyY19mb3JtYXQpOworICB2b2lkIFJlc2FtcGxlVmVydChjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcERldmljZUJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNjYWxlX3ksCisgICAgICAgICAgICAgICAgICAgIGludCBkZXNfcm93KTsKKyAgdm9pZCBSZXNhbXBsZVZlcnRCVChjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcERldmljZUJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc2NhbGVfeSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzX3Jvdyk7CisgIHZvaWQgR2lmRG91YmxlTGluZVJlc2FtcGxlVmVydChjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcERldmljZUJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzY2FsZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc19yb3cpOworCisgIEZYQ09ERUNfU1RBVFVTIEpwZWdTdGFydERlY29kZShjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcERJQml0bWFwKTsKKyAgRlhDT0RFQ19TVEFUVVMgUG5nU3RhcnREZWNvZGUoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBESUJpdG1hcCk7CisgIEZYQ09ERUNfU1RBVFVTIEdpZlN0YXJ0RGVjb2RlKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwRElCaXRtYXApOworICBGWENPREVDX1NUQVRVUyBCbXBTdGFydERlY29kZShjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcERJQml0bWFwKTsKKworICBGWENPREVDX1NUQVRVUyBKcGVnQ29udGludWVEZWNvZGUoKTsKKyAgRlhDT0RFQ19TVEFUVVMgUG5nQ29udGludWVEZWNvZGUoKTsKKyAgRlhDT0RFQ19TVEFUVVMgR2lmQ29udGludWVEZWNvZGUoKTsKKyAgRlhDT0RFQ19TVEFUVVMgQm1wQ29udGludWVEZWNvZGUoKTsKKyAgRlhDT0RFQ19TVEFUVVMgVGlmQ29udGludWVEZWNvZGUoKTsKKworICBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gbV9wRmlsZTsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gbV9wRGV2aWNlQml0bWFwOworICBVbm93bmVkUHRyPENDb2RlY19Nb2R1bGVNZ3I+IG1fcENvZGVjTWdyOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjX0pwZWdNb2R1bGU6OkNvbnRleHQ+IG1fcEpwZWdDb250ZXh0OworICBzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjX1BuZ01vZHVsZTo6Q29udGV4dD4gbV9wUG5nQ29udGV4dDsKKyAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY19HaWZNb2R1bGU6OkNvbnRleHQ+IG1fcEdpZkNvbnRleHQ7CisgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNfQm1wTW9kdWxlOjpDb250ZXh0PiBtX3BCbXBDb250ZXh0OworICBzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjX1RpZmZNb2R1bGU6OkNvbnRleHQ+IG1fcFRpZmZDb250ZXh0OwogICBGWENPREVDX0lNQUdFX1RZUEUgbV9pbWFnVHlwZTsKICAgdWludDMyX3QgbV9vZmZTZXQ7CiAgIHVpbnQ4X3QqIG1fcFNyY0J1ZjsKICAgdWludDMyX3QgbV9TcmNTaXplOwogICB1aW50OF90KiBtX3BEZWNvZGVCdWY7CiAgIGludCBtX1NjYW5saW5lU2l6ZTsKLSAgQ0ZYX0RJQml0bWFwKiBtX3BEZXZpY2VCaXRtYXA7Ci0gIGJvb2wgbV9iSW50ZXJwb2w7CiAgIENGWENPREVDX1dlaWdodFRhYmxlIG1fV2VpZ2h0SG9yejsKICAgQ0ZYQ09ERUNfVmVydFRhYmxlIG1fV2VpZ2h0VmVydDsKICAgQ0ZYQ09ERUNfSG9yelRhYmxlIG1fV2VpZ2h0SG9yek9POwpAQCAtMTU4LDggKzIzMyw4IEBACiAgIGludCBtX1NyY1JvdzsKICAgRlhDb2RlY19Gb3JtYXQgbV9TcmNGb3JtYXQ7CiAgIGludCBtX1NyY1Bhc3NOdW1iZXI7Ci0gIGludCBtX0ZyYW1lTnVtYmVyOwotICBpbnQgbV9GcmFtZUN1cjsKKyAgc2l6ZV90IG1fRnJhbWVOdW1iZXI7CisgIHNpemVfdCBtX0ZyYW1lQ3VyOwogICBpbnQgbV9HaWZCZ0luZGV4OwogICB1aW50OF90KiBtX3BHaWZQYWxldHRlOwogICBpbnQzMl90IG1fR2lmUGx0TnVtYmVyOwpAQCAtMTY3LDYzICsyNDIsNiBAQAogICBGWF9SRUNUIG1fR2lmRnJhbWVSZWN0OwogICBib29sIG1fQm1wSXNUb3BCb3R0b207CiAgIEZYQ09ERUNfU1RBVFVTIG1fc3RhdHVzOwotCi0gIC8vIElDb2RlY19QbmdNb2R1bGU6OkRlbGVnYXRlCi0gIGJvb2wgUG5nUmVhZEhlYWRlcihpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgaW50IGJwYywKLSAgICAgICAgICAgICAgICAgICAgIGludCBwYXNzLAotICAgICAgICAgICAgICAgICAgICAgaW50KiBjb2xvcl90eXBlLAotICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBnYW1tYSkgb3ZlcnJpZGU7Ci0gIGJvb2wgUG5nQXNrU2NhbmxpbmVCdWYoaW50IGxpbmUsIHVpbnQ4X3QqJiBzcmNfYnVmKSBvdmVycmlkZTsKLSAgdm9pZCBQbmdGaWxsU2NhbmxpbmVCdWZDb21wbGV0ZWQoaW50IHBhc3MsIGludCBsaW5lKSBvdmVycmlkZTsKLQotICAvLyBJQ29kZWNfR2lmTW9kdWxlOjpEZWxlZ2F0ZQotICB2b2lkIEdpZlJlY29yZEN1cnJlbnRQb3NpdGlvbih1aW50MzJfdCYgY3VyX3Bvcykgb3ZlcnJpZGU7Ci0gIHVpbnQ4X3QqIEdpZkFza0xvY2FsUGFsZXR0ZUJ1ZihpbnQzMl90IGZyYW1lX251bSwgaW50MzJfdCBwYWxfc2l6ZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgR2lmSW5wdXRSZWNvcmRQb3NpdGlvbkJ1Zih1aW50MzJfdCByY2RfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCYgaW1nX3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwYWxfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFsX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGVsYXlfdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlcl9pbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHJhbnNfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRpc3Bvc2FsX21ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW50ZXJsYWNlKSBvdmVycmlkZTsKLSAgdm9pZCBHaWZSZWFkU2NhbmxpbmUoaW50MzJfdCByb3dfbnVtLCB1aW50OF90KiByb3dfYnVmKSBvdmVycmlkZTsKLQotICAvLyBJQ29kZWNfQm1wTW9kdWxlOjpEZWxlZ2F0ZQotICBib29sIEJtcElucHV0SW1hZ2VQb3NpdGlvbkJ1Zih1aW50MzJfdCByY2RfcG9zKSBvdmVycmlkZTsKLSAgdm9pZCBCbXBSZWFkU2NhbmxpbmUoaW50MzJfdCByb3dfbnVtLCB1aW50OF90KiByb3dfYnVmKSBvdmVycmlkZTsKLQotIHByb3RlY3RlZDoKLSAgYm9vbCBCbXBSZWFkTW9yZURhdGEoSUNvZGVjX0JtcE1vZHVsZSogcEJtcE1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhDT0RFQ19TVEFUVVMmIGVycl9zdGF0dXMpOwotICBib29sIEdpZlJlYWRNb3JlRGF0YShJQ29kZWNfR2lmTW9kdWxlKiBwR2lmTW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICBGWENPREVDX1NUQVRVUyYgZXJyX3N0YXR1cyk7Ci0gIHZvaWQgR2lmRG91YmxlTGluZVJlc2FtcGxlVmVydChDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc2NhbGVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXNfcm93KTsKLSAgdm9pZCBQbmdPbmVPbmVNYXBSZXNhbXBsZUhvcnooQ0ZYX0RJQml0bWFwKiBwRGV2aWNlQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlc19saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhDb2RlY19Gb3JtYXQgc3JjX2Zvcm1hdCk7Ci0gIGJvb2wgRGV0ZWN0SW1hZ2VUeXBlKEZYQ09ERUNfSU1BR0VfVFlQRSBpbWFnZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpOwotICB2b2lkIEdldERvd25TY2FsZShpbnQmIGRvd25fc2NhbGUpOwotICB2b2lkIEdldFRyYW5zTWV0aG9kKEZYRElCX0Zvcm1hdCBkZXNfZm9ybWF0LCBGWENvZGVjX0Zvcm1hdCBzcmNfZm9ybWF0KTsKLSAgdm9pZCBSZVNhbXBsZVNjYW5saW5lKENGWF9ESUJpdG1hcCogcERldmljZUJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGVzX2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYQ29kZWNfRm9ybWF0IHNyY19mb3JtYXQpOwotICB2b2lkIFJlc2FtcGxlKENGWF9ESUJpdG1hcCogcERldmljZUJpdG1hcCwKLSAgICAgICAgICAgICAgICBpbnQzMl90IHNyY19saW5lLAotICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgIEZYQ29kZWNfRm9ybWF0IHNyY19mb3JtYXQpOwotICB2b2lkIFJlc2FtcGxlVmVydChDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsIGRvdWJsZSBzY2FsZV95LCBpbnQgZGVzX3Jvdyk7Ci0gIGJvb2wgSnBlZ1JlYWRNb3JlRGF0YShDQ29kZWNfSnBlZ01vZHVsZSogcEpwZWdNb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGWENPREVDX1NUQVRVUyYgZXJyX3N0YXR1cyk7Ci0gIHZvaWQgUmVzYW1wbGVWZXJ0QlQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlQml0bWFwLCBkb3VibGUgc2NhbGVfeSwgaW50IGRlc19yb3cpOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZYQ09ERUNfQ09ERUNfQ0NPREVDX1BST0dSRVNTSVZFREVDT0RFUl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19zY2FubGluZWRlY29kZXIuY3BwIGIvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19zY2FubGluZWRlY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YjlhMmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX3NjYW5saW5lZGVjb2Rlci5jcHAKQEAgLTAsMCArMSw3MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19zY2FubGluZWRlY29kZXIuaCIKKworI2luY2x1ZGUgImNvcmUvZnhjcnQvaWZ4X3BhdXNlaW5kaWNhdG9yLmgiCisKK0NDb2RlY19TY2FubGluZURlY29kZXI6OkNDb2RlY19TY2FubGluZURlY29kZXIoKQorICAgIDogQ0NvZGVjX1NjYW5saW5lRGVjb2RlcigwLCAwLCAwLCAwLCAwLCAwLCAwKSB7fQorCitDQ29kZWNfU2NhbmxpbmVEZWNvZGVyOjpDQ29kZWNfU2NhbmxpbmVEZWNvZGVyKGludCBuT3JpZ1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbk9yaWdIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuT3V0cHV0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuT3V0cHV0SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkJwYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgblBpdGNoKQorICAgIDogbV9PcmlnV2lkdGgobk9yaWdXaWR0aCksCisgICAgICBtX09yaWdIZWlnaHQobk9yaWdIZWlnaHQpLAorICAgICAgbV9PdXRwdXRXaWR0aChuT3V0cHV0V2lkdGgpLAorICAgICAgbV9PdXRwdXRIZWlnaHQobk91dHB1dEhlaWdodCksCisgICAgICBtX25Db21wcyhuQ29tcHMpLAorICAgICAgbV9icGMobkJwYyksCisgICAgICBtX1BpdGNoKG5QaXRjaCksCisgICAgICBtX05leHRMaW5lKC0xKSwKKyAgICAgIG1fcExhc3RTY2FubGluZShudWxscHRyKSB7fQorCitDQ29kZWNfU2NhbmxpbmVEZWNvZGVyOjp+Q0NvZGVjX1NjYW5saW5lRGVjb2RlcigpIHt9CisKK2NvbnN0IHVpbnQ4X3QqIENDb2RlY19TY2FubGluZURlY29kZXI6OkdldFNjYW5saW5lKGludCBsaW5lKSB7CisgIGlmIChtX05leHRMaW5lID09IGxpbmUgKyAxKQorICAgIHJldHVybiBtX3BMYXN0U2NhbmxpbmU7CisKKyAgaWYgKG1fTmV4dExpbmUgPCAwIHx8IG1fTmV4dExpbmUgPiBsaW5lKSB7CisgICAgaWYgKCF2X1Jld2luZCgpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgbV9OZXh0TGluZSA9IDA7CisgIH0KKyAgd2hpbGUgKG1fTmV4dExpbmUgPCBsaW5lKSB7CisgICAgUmVhZE5leHRMaW5lKCk7CisgICAgbV9OZXh0TGluZSsrOworICB9CisgIG1fcExhc3RTY2FubGluZSA9IFJlYWROZXh0TGluZSgpOworICBtX05leHRMaW5lKys7CisgIHJldHVybiBtX3BMYXN0U2NhbmxpbmU7Cit9CisKK2Jvb2wgQ0NvZGVjX1NjYW5saW5lRGVjb2Rlcjo6U2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKSB7CisgIGlmIChtX05leHRMaW5lID09IGxpbmUgfHwgbV9OZXh0TGluZSA9PSBsaW5lICsgMSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKG1fTmV4dExpbmUgPCAwIHx8IG1fTmV4dExpbmUgPiBsaW5lKSB7CisgICAgdl9SZXdpbmQoKTsKKyAgICBtX05leHRMaW5lID0gMDsKKyAgfQorICBtX3BMYXN0U2NhbmxpbmUgPSBudWxscHRyOworICB3aGlsZSAobV9OZXh0TGluZSA8IGxpbmUpIHsKKyAgICBtX3BMYXN0U2NhbmxpbmUgPSBSZWFkTmV4dExpbmUoKTsKKyAgICBtX05leHRMaW5lKys7CisgICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3VpbnQ4X3QqIENDb2RlY19TY2FubGluZURlY29kZXI6OlJlYWROZXh0TGluZSgpIHsKKyAgcmV0dXJuIHZfR2V0TmV4dExpbmUoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfc2NhbmxpbmVkZWNvZGVyLmggYi9jb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX3NjYW5saW5lZGVjb2Rlci5oCmluZGV4IDA2YmI2ZDUuLjA1ZDVlYWIgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfc2NhbmxpbmVkZWNvZGVyLmgKKysrIGIvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19zY2FubGluZWRlY29kZXIuaApAQCAtOSw3ICs5LDcgQEAKIAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCiAKLWNsYXNzIElGWF9QYXVzZTsKK2NsYXNzIElGWF9QYXVzZUluZGljYXRvcjsKIAogY2xhc3MgQ0NvZGVjX1NjYW5saW5lRGVjb2RlciB7CiAgcHVibGljOgpAQCAtMjQsNyArMjQsNyBAQAogICB2aXJ0dWFsIH5DQ29kZWNfU2NhbmxpbmVEZWNvZGVyKCk7CiAKICAgY29uc3QgdWludDhfdCogR2V0U2NhbmxpbmUoaW50IGxpbmUpOwotICBib29sIFNraXBUb1NjYW5saW5lKGludCBsaW5lLCBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIGJvb2wgU2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKTsKIAogICBpbnQgR2V0V2lkdGgoKSB7IHJldHVybiBtX091dHB1dFdpZHRoOyB9CiAgIGludCBHZXRIZWlnaHQoKSB7IHJldHVybiBtX091dHB1dEhlaWdodDsgfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY190aWZmbW9kdWxlLmNwcCBiL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfdGlmZm1vZHVsZS5jcHAKaW5kZXggNzM2NzcyOC4uMGJmMDA0NSAxMDA2NDQKLS0tIGEvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY190aWZmbW9kdWxlLmNwcAorKysgYi9jb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX3RpZmZtb2R1bGUuY3BwCkBAIC0xMCw3OSArMTAsODcgQEAKIAogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jb2RlY19pbnQuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvZnhfY29kZWMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJlYW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9kaWJpdG1hcC5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9meF9kaWIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2xvZ2dpbmcuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKIGV4dGVybiAiQyIgewogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYnRpZmYvdGlmZmlvcC5oIgogfQogCi1jbGFzcyBDQ29kZWNfVGlmZkNvbnRleHQgeworY2xhc3MgQ1RpZmZDb250ZXh0IDogcHVibGljIENDb2RlY19UaWZmTW9kdWxlOjpDb250ZXh0IHsKICBwdWJsaWM6Ci0gIENDb2RlY19UaWZmQ29udGV4dCgpOwotICB+Q0NvZGVjX1RpZmZDb250ZXh0KCk7CisgIENUaWZmQ29udGV4dCgpOworICB+Q1RpZmZDb250ZXh0KCkgb3ZlcnJpZGU7CiAKLSAgYm9vbCBJbml0RGVjb2Rlcihjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBmaWxlX3B0cik7CisgIGJvb2wgSW5pdERlY29kZXIoY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBmaWxlX3B0cik7CiAgIGJvb2wgTG9hZEZyYW1lSW5mbyhpbnQzMl90IGZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBjb21wcywKICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGJwYywKICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpOwotICBib29sIERlY29kZShDRlhfRElCaXRtYXAqIHBESUJpdG1hcCk7CisgIGJvb2wgRGVjb2RlKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwRElCaXRtYXApOwogCi0gIENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gaW9faW4oKSBjb25zdCB7IHJldHVybiBtX2lvX2luOyB9CisgIFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBpb19pbigpIGNvbnN0IHsgcmV0dXJuIG1faW9faW47IH0KICAgdWludDMyX3Qgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbV9vZmZzZXQ7IH0KICAgdm9pZCBzZXRfb2Zmc2V0KHVpbnQzMl90IG9mZnNldCkgeyBtX29mZnNldCA9IG9mZnNldDsgfQogCiAgcHJpdmF0ZToKLSAgYm9vbCBJc1N1cHBvcnQoY29uc3QgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXApIGNvbnN0OwotICB2b2lkIFNldFBhbGV0dGUoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsIHVpbnQxNl90IGJwcyk7Ci0gIGJvb2wgRGVjb2RlMWJwcFJHQihDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwKKyAgYm9vbCBJc1N1cHBvcnQoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBESUJpdG1hcCkgY29uc3Q7CisgIHZvaWQgU2V0UGFsZXR0ZShjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcERJQml0bWFwLCB1aW50MTZfdCBicHMpOworICBib29sIERlY29kZTFicHBSR0IoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBESUJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJwcywKICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNwcCk7Ci0gIGJvb2wgRGVjb2RlOGJwcFJHQihDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwKKyAgYm9vbCBEZWNvZGU4YnBwUkdCKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwRElCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBicHMsCiAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzcHApOwotICBib29sIERlY29kZTI0YnBwUkdCKENGWF9ESUJpdG1hcCogcERJQml0bWFwLAorICBib29sIERlY29kZTI0YnBwUkdCKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwRElCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBicHMsCiAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3BwKTsKIAotICBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IG1faW9faW47CisgIFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBtX2lvX2luOwogICB1aW50MzJfdCBtX29mZnNldDsKICAgVElGRiogbV90aWZfY3R4OwogfTsKIAordm9pZCogX1RJRkZjYWxsb2ModG1zaXplX3Qgbm1lbWIsIHRtc2l6ZV90IHNpeikgeworICByZXR1cm4gRlhNRU1fRGVmYXVsdENhbGxvYyhubWVtYiwgc2l6KTsKK30KKwogdm9pZCogX1RJRkZtYWxsb2ModG1zaXplX3Qgc2l6ZSkgewotICByZXR1cm4gRlhNRU1fRGVmYXVsdEFsbG9jKHNpemUsIDApOworICByZXR1cm4gRlhNRU1fRGVmYXVsdEFsbG9jKHNpemUpOwogfQogCiB2b2lkIF9USUZGZnJlZSh2b2lkKiBwdHIpIHsKLSAgRlhNRU1fRGVmYXVsdEZyZWUocHRyLCAwKTsKKyAgaWYgKHB0cikKKyAgICBGWE1FTV9EZWZhdWx0RnJlZShwdHIpOwogfQogCiB2b2lkKiBfVElGRnJlYWxsb2Modm9pZCogcHRyLCB0bXNpemVfdCBzaXplKSB7Ci0gIHJldHVybiBGWE1FTV9EZWZhdWx0UmVhbGxvYyhwdHIsIHNpemUsIDApOworICByZXR1cm4gRlhNRU1fRGVmYXVsdFJlYWxsb2MocHRyLCBzaXplKTsKIH0KIAogdm9pZCBfVElGRm1lbXNldCh2b2lkKiBwdHIsIGludCB2YWwsIHRtc2l6ZV90IHNpemUpIHsKLSAgRlhTWVNfbWVtc2V0KHB0ciwgdmFsLCAoc2l6ZV90KXNpemUpOworICBtZW1zZXQocHRyLCB2YWwsIHN0YXRpY19jYXN0PHNpemVfdD4oc2l6ZSkpOwogfQogCiB2b2lkIF9USUZGbWVtY3B5KHZvaWQqIGRlcywgY29uc3Qgdm9pZCogc3JjLCB0bXNpemVfdCBzaXplKSB7Ci0gIEZYU1lTX21lbWNweShkZXMsIHNyYywgKHNpemVfdClzaXplKTsKKyAgbWVtY3B5KGRlcywgc3JjLCBzdGF0aWNfY2FzdDxzaXplX3Q+KHNpemUpKTsKIH0KIAogaW50IF9USUZGbWVtY21wKGNvbnN0IHZvaWQqIHB0cjEsIGNvbnN0IHZvaWQqIHB0cjIsIHRtc2l6ZV90IHNpemUpIHsKLSAgcmV0dXJuIEZYU1lTX21lbWNtcChwdHIxLCBwdHIyLCAoc2l6ZV90KXNpemUpOworICByZXR1cm4gbWVtY21wKHB0cjEsIHB0cjIsIHN0YXRpY19jYXN0PHNpemVfdD4oc2l6ZSkpOwogfQogCiBpbnQgX1RJRkZJZk11bHRpcGxpY2F0aW9uT3ZlcmZsb3codG1zaXplX3Qgb3AxLCB0bXNpemVfdCBvcDIpIHsKQEAgLTk1LDggKzEwMyw3IEBACiBuYW1lc3BhY2UgewogCiB0c2l6ZV90IHRpZmZfcmVhZCh0aGFuZGxlX3QgY29udGV4dCwgdGRhdGFfdCBidWYsIHRzaXplX3QgbGVuZ3RoKSB7Ci0gIENDb2RlY19UaWZmQ29udGV4dCogcFRpZmZDb250ZXh0ID0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q0NvZGVjX1RpZmZDb250ZXh0Kj4oY29udGV4dCk7CisgIENUaWZmQ29udGV4dCogcFRpZmZDb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDVGlmZkNvbnRleHQqPihjb250ZXh0KTsKICAgRlhfU0FGRV9VSU5UMzIgaW5jcmVtZW50ID0gcFRpZmZDb250ZXh0LT5vZmZzZXQoKTsKICAgaW5jcmVtZW50ICs9IGxlbmd0aDsKICAgaWYgKCFpbmNyZW1lbnQuSXNWYWxpZCgpKQpAQCAtMTE0LDEzICsxMjEsMTIgQEAKIH0KIAogdHNpemVfdCB0aWZmX3dyaXRlKHRoYW5kbGVfdCBjb250ZXh0LCB0ZGF0YV90IGJ1ZiwgdHNpemVfdCBsZW5ndGgpIHsKLSAgQVNTRVJUKGZhbHNlKTsKKyAgTk9UUkVBQ0hFRCgpOwogICByZXR1cm4gMDsKIH0KIAogdG9mZl90IHRpZmZfc2Vlayh0aGFuZGxlX3QgY29udGV4dCwgdG9mZl90IG9mZnNldCwgaW50IHdoZW5jZSkgewotICBDQ29kZWNfVGlmZkNvbnRleHQqIHBUaWZmQ29udGV4dCA9Ci0gICAgICByZWludGVycHJldF9jYXN0PENDb2RlY19UaWZmQ29udGV4dCo+KGNvbnRleHQpOworICBDVGlmZkNvbnRleHQqIHBUaWZmQ29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q1RpZmZDb250ZXh0Kj4oY29udGV4dCk7CiAgIEZYX1NBRkVfRklMRVNJWkUgc2FmZV9vZmZzZXQgPSBvZmZzZXQ7CiAgIGlmICghc2FmZV9vZmZzZXQuSXNWYWxpZCgpKQogICAgIHJldHVybiBzdGF0aWNfY2FzdDx0b2ZmX3Q+KC0xKTsKQEAgLTE1Nyw4ICsxNjMsNyBAQAogfQogCiB0b2ZmX3QgdGlmZl9nZXRfc2l6ZSh0aGFuZGxlX3QgY29udGV4dCkgewotICBDQ29kZWNfVGlmZkNvbnRleHQqIHBUaWZmQ29udGV4dCA9Ci0gICAgICByZWludGVycHJldF9jYXN0PENDb2RlY19UaWZmQ29udGV4dCo+KGNvbnRleHQpOworICBDVGlmZkNvbnRleHQqIHBUaWZmQ29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q1RpZmZDb250ZXh0Kj4oY29udGV4dCk7CiAgIHJldHVybiBzdGF0aWNfY2FzdDx0b2ZmX3Q+KHBUaWZmQ29udGV4dC0+aW9faW4oKS0+R2V0U2l6ZSgpKTsKIH0KIApAQCAtMTg2LDIwICsxOTEsMjAgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIFQqIHB0ciA9IEZYX0FsbG9jKFQsIDEpOwogICAqcHRyID0gdmFsOwotICBwQXR0ci0+bV9FeGlmW3RhZ10gPSAodm9pZCopcHRyOworICBwQXR0ci0+bV9FeGlmW3RhZ10gPSBwdHI7CiAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIFRpZmZfRXhpZl9HZXRTdHJpbmdJbmZvKFRJRkYqIHRpZl9jdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0YWdfdCB0YWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyKSB7Ci0gIEZYX0NIQVIqIGJ1ZiA9IG51bGxwdHI7CisgIGNoYXIqIGJ1ZiA9IG51bGxwdHI7CiAgIFRJRkZHZXRGaWVsZCh0aWZfY3R4LCB0YWcsICZidWYpOwogICBpZiAoIWJ1ZikKICAgICByZXR1cm47Ci0gIEZYX1NUUlNJWkUgc2l6ZSA9IEZYU1lTX3N0cmxlbihidWYpOworICBzaXplX3Qgc2l6ZSA9IHN0cmxlbihidWYpOwogICB1aW50OF90KiBwdHIgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplICsgMSk7Ci0gIEZYU1lTX21lbWNweShwdHIsIGJ1Ziwgc2l6ZSk7CisgIG1lbWNweShwdHIsIGJ1Ziwgc2l6ZSk7CiAgIHB0cltzaXplXSA9IDA7CiAgIHBBdHRyLT5tX0V4aWZbdGFnXSA9IHB0cjsKIH0KQEAgLTIxNSwyNyArMjIwLDI3IEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCi1DQ29kZWNfVGlmZkNvbnRleHQ6OkNDb2RlY19UaWZmQ29udGV4dCgpCitDVGlmZkNvbnRleHQ6OkNUaWZmQ29udGV4dCgpCiAgICAgOiBtX2lvX2luKG51bGxwdHIpLCBtX29mZnNldCgwKSwgbV90aWZfY3R4KG51bGxwdHIpIHt9CiAKLUNDb2RlY19UaWZmQ29udGV4dDo6fkNDb2RlY19UaWZmQ29udGV4dCgpIHsKK0NUaWZmQ29udGV4dDo6fkNUaWZmQ29udGV4dCgpIHsKICAgaWYgKG1fdGlmX2N0eCkKICAgICBUSUZGQ2xvc2UobV90aWZfY3R4KTsKIH0KIAotYm9vbCBDQ29kZWNfVGlmZkNvbnRleHQ6OkluaXREZWNvZGVyKAotICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIGZpbGVfcHRyKSB7Citib29sIENUaWZmQ29udGV4dDo6SW5pdERlY29kZXIoCisgICAgY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBmaWxlX3B0cikgewogICBtX2lvX2luID0gZmlsZV9wdHI7CiAgIG1fdGlmX2N0eCA9IHRpZmZfb3Blbih0aGlzLCAiciIpOwogICByZXR1cm4gISFtX3RpZl9jdHg7CiB9CiAKLWJvb2wgQ0NvZGVjX1RpZmZDb250ZXh0OjpMb2FkRnJhbWVJbmZvKGludDMyX3QgZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGNvbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkgeworYm9vbCBDVGlmZkNvbnRleHQ6OkxvYWRGcmFtZUluZm8oaW50MzJfdCBmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBicGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKSB7CiAgIGlmICghVElGRlNldERpcmVjdG9yeShtX3RpZl9jdHgsICh1aW50MTYpZnJhbWUpKQogICAgIHJldHVybiBmYWxzZTsKIApAQCAtMjU3LDE2ICsyNjIsMTQgQEAKICAgICAgIHBBdHRyaWJ1dGUtPm1fd0RQSVVuaXQtLTsKICAgICB9CiAgICAgVGlmZl9FeGlmX0dldEluZm88dWludDE2X3Q+KG1fdGlmX2N0eCwgVElGRlRBR19PUklFTlRBVElPTiwgcEF0dHJpYnV0ZSk7Ci0gICAgaWYgKFRpZmZfRXhpZl9HZXRJbmZvPEZYX0ZMT0FUPihtX3RpZl9jdHgsIFRJRkZUQUdfWFJFU09MVVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQXR0cmlidXRlKSkgeworICAgIGlmIChUaWZmX0V4aWZfR2V0SW5mbzxmbG9hdD4obV90aWZfY3R4LCBUSUZGVEFHX1hSRVNPTFVUSU9OLCBwQXR0cmlidXRlKSkgewogICAgICAgdm9pZCogdmFsID0gcEF0dHJpYnV0ZS0+bV9FeGlmW1RJRkZUQUdfWFJFU09MVVRJT05dOwotICAgICAgRlhfRkxPQVQgZkRwaSA9IHZhbCA/ICpyZWludGVycHJldF9jYXN0PEZYX0ZMT0FUKj4odmFsKSA6IDA7CisgICAgICBmbG9hdCBmRHBpID0gdmFsID8gKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPih2YWwpIDogMDsKICAgICAgIHBBdHRyaWJ1dGUtPm1fblhEUEkgPSAoaW50MzJfdCkoZkRwaSArIDAuNWYpOwogICAgIH0KLSAgICBpZiAoVGlmZl9FeGlmX0dldEluZm88RlhfRkxPQVQ+KG1fdGlmX2N0eCwgVElGRlRBR19ZUkVTT0xVVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBdHRyaWJ1dGUpKSB7CisgICAgaWYgKFRpZmZfRXhpZl9HZXRJbmZvPGZsb2F0PihtX3RpZl9jdHgsIFRJRkZUQUdfWVJFU09MVVRJT04sIHBBdHRyaWJ1dGUpKSB7CiAgICAgICB2b2lkKiB2YWwgPSBwQXR0cmlidXRlLT5tX0V4aWZbVElGRlRBR19ZUkVTT0xVVElPTl07Ci0gICAgICBGWF9GTE9BVCBmRHBpID0gdmFsID8gKnJlaW50ZXJwcmV0X2Nhc3Q8RlhfRkxPQVQqPih2YWwpIDogMDsKKyAgICAgIGZsb2F0IGZEcGkgPSB2YWwgPyAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KHZhbCkgOiAwOwogICAgICAgcEF0dHJpYnV0ZS0+bV9uWURQSSA9IChpbnQzMl90KShmRHBpICsgMC41Zik7CiAgICAgfQogICAgIFRpZmZfRXhpZl9HZXRTdHJpbmdJbmZvKG1fdGlmX2N0eCwgVElGRlRBR19JTUFHRURFU0NSSVBUSU9OLCBwQXR0cmlidXRlKTsKQEAgLTI4OSw3ICsyOTIsNyBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDQ29kZWNfVGlmZkNvbnRleHQ6OklzU3VwcG9ydChjb25zdCBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCkgY29uc3QgeworYm9vbCBDVGlmZkNvbnRleHQ6OklzU3VwcG9ydChjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcERJQml0bWFwKSBjb25zdCB7CiAgIGlmIChUSUZGSXNUaWxlZChtX3RpZl9jdHgpKQogICAgIHJldHVybiBmYWxzZTsKIApAQCAtMzE5LDcgKzMyMiw4IEBACiAgIHJldHVybiBwbGFuYXJjb25maWcgIT0gUExBTkFSQ09ORklHX1NFUEFSQVRFOwogfQogCi12b2lkIENDb2RlY19UaWZmQ29udGV4dDo6U2V0UGFsZXR0ZShDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwgdWludDE2X3QgYnBzKSB7Cit2b2lkIENUaWZmQ29udGV4dDo6U2V0UGFsZXR0ZShjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcERJQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYnBzKSB7CiAgIHVpbnQxNl90KiByZWRfb3JpZyA9IG51bGxwdHI7CiAgIHVpbnQxNl90KiBncmVlbl9vcmlnID0gbnVsbHB0cjsKICAgdWludDE2X3QqIGJsdWVfb3JpZyA9IG51bGxwdHI7CkBAIC0zMzgsMTUgKzM0MiwxNSBAQAogICAgIHVpbnQzMl90IGIgPSBibHVlX29yaWdbaW5kZXhdICYgMHhGRjsKICAgICB1aW50MzJfdCBjb2xvciA9ICh1aW50MzJfdCliIHwgKCh1aW50MzJfdClnIDw8IDgpIHwgKCh1aW50MzJfdClyIDw8IDE2KSB8CiAgICAgICAgICAgICAgICAgICAgICAoKCh1aW50MzIpMHhmZkwpIDw8IDI0KTsKLSAgICBwRElCaXRtYXAtPlNldFBhbGV0dGVFbnRyeShpbmRleCwgY29sb3IpOworICAgIHBESUJpdG1hcC0+U2V0UGFsZXR0ZUFyZ2IoaW5kZXgsIGNvbG9yKTsKICAgfQogfQogCi1ib29sIENDb2RlY19UaWZmQ29udGV4dDo6RGVjb2RlMWJwcFJHQihDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNwcCkgeworYm9vbCBDVGlmZkNvbnRleHQ6OkRlY29kZTFicHBSR0IoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBESUJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGJwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNwcCkgewogICBpZiAocERJQml0bWFwLT5HZXRCUFAoKSAhPSAxIHx8IHNwcCAhPSAxIHx8IGJwcyAhPSAxIHx8CiAgICAgICAhSXNTdXBwb3J0KHBESUJpdG1hcCkpIHsKICAgICByZXR1cm4gZmFsc2U7CkBAIC0zNzAsMTEgKzM3NCwxMSBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDQ29kZWNfVGlmZkNvbnRleHQ6OkRlY29kZThicHBSR0IoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBicHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzcHApIHsKK2Jvb2wgQ1RpZmZDb250ZXh0OjpEZWNvZGU4YnBwUkdCKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwRElCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBicHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBzcHApIHsKICAgaWYgKHBESUJpdG1hcC0+R2V0QlBQKCkgIT0gOCB8fCBzcHAgIT0gMSB8fCAoYnBzICE9IDQgJiYgYnBzICE9IDgpIHx8CiAgICAgICAhSXNTdXBwb3J0KHBESUJpdG1hcCkpIHsKICAgICByZXR1cm4gZmFsc2U7CkBAIC00MDYsMTEgKzQxMCwxMSBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDQ29kZWNfVGlmZkNvbnRleHQ6OkRlY29kZTI0YnBwUkdCKENGWF9ESUJpdG1hcCogcERJQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgYnBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHNwcCkgeworYm9vbCBDVGlmZkNvbnRleHQ6OkRlY29kZTI0YnBwUkdCKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwRElCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBicHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc3BwKSB7CiAgIGlmIChwRElCaXRtYXAtPkdldEJQUCgpICE9IDI0IHx8ICFJc1N1cHBvcnQocERJQml0bWFwKSkKICAgICByZXR1cm4gZmFsc2U7CiAKQEAgLTQzNCw3ICs0MzgsNyBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDQ29kZWNfVGlmZkNvbnRleHQ6OkRlY29kZShDRlhfRElCaXRtYXAqIHBESUJpdG1hcCkgeworYm9vbCBDVGlmZkNvbnRleHQ6OkRlY29kZShjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcERJQml0bWFwKSB7CiAgIHVpbnQzMl90IGltZ193aWQgPSBwRElCaXRtYXAtPkdldFdpZHRoKCk7CiAgIHVpbnQzMl90IGltZ19oZWkgPSBwRElCaXRtYXAtPkdldEhlaWdodCgpOwogICB1aW50MzJfdCB3aWR0aCA9IDA7CkBAIC00NzUsMzAgKzQ3OSwyOCBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKLUNDb2RlY19UaWZmQ29udGV4dCogQ0NvZGVjX1RpZmZNb2R1bGU6OkNyZWF0ZURlY29kZXIoCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgZmlsZV9wdHIpIHsKLSAgYXV0byBwRGVjb2RlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDQ29kZWNfVGlmZkNvbnRleHQ+KCk7CitzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjX1RpZmZNb2R1bGU6OkNvbnRleHQ+IENDb2RlY19UaWZmTW9kdWxlOjpDcmVhdGVEZWNvZGVyKAorICAgIGNvbnN0IFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgZmlsZV9wdHIpIHsKKyAgYXV0byBwRGVjb2RlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDVGlmZkNvbnRleHQ+KCk7CiAgIGlmICghcERlY29kZXItPkluaXREZWNvZGVyKGZpbGVfcHRyKSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAotICByZXR1cm4gcERlY29kZXIucmVsZWFzZSgpOworICByZXR1cm4gcERlY29kZXI7CiB9CiAKLWJvb2wgQ0NvZGVjX1RpZmZNb2R1bGU6OkxvYWRGcmFtZUluZm8oQ0NvZGVjX1RpZmZDb250ZXh0KiBjdHgsCitib29sIENDb2RlY19UaWZmTW9kdWxlOjpMb2FkRnJhbWVJbmZvKENvbnRleHQqIHBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBjb21wcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnBjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKSB7CisgIGF1dG8qIGN0eCA9IHN0YXRpY19jYXN0PENUaWZmQ29udGV4dCo+KHBDb250ZXh0KTsKICAgcmV0dXJuIGN0eC0+TG9hZEZyYW1lSW5mbyhmcmFtZSwgd2lkdGgsIGhlaWdodCwgY29tcHMsIGJwYywgcEF0dHJpYnV0ZSk7CiB9CiAKLWJvb2wgQ0NvZGVjX1RpZmZNb2R1bGU6OkRlY29kZShDQ29kZWNfVGlmZkNvbnRleHQqIGN0eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCkgeworYm9vbCBDQ29kZWNfVGlmZk1vZHVsZTo6RGVjb2RlKENvbnRleHQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwRElCaXRtYXApIHsKKyAgYXV0byogY3R4ID0gc3RhdGljX2Nhc3Q8Q1RpZmZDb250ZXh0Kj4ocENvbnRleHQpOwogICByZXR1cm4gY3R4LT5EZWNvZGUocERJQml0bWFwKTsKIH0KLQotdm9pZCBDQ29kZWNfVGlmZk1vZHVsZTo6RGVzdHJveURlY29kZXIoQ0NvZGVjX1RpZmZDb250ZXh0KiBjdHgpIHsKLSAgZGVsZXRlIGN0eDsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfdGlmZm1vZHVsZS5oIGIvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY190aWZmbW9kdWxlLmgKaW5kZXggYTg4MjBmNC4uOGQzYmVkNyAxMDA2NDQKLS0tIGEvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY190aWZmbW9kdWxlLmgKKysrIGIvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY190aWZmbW9kdWxlLmgKQEAgLTcsMjUgKzcsMzIgQEAKICNpZm5kZWYgQ09SRV9GWENPREVDX0NPREVDX0NDT0RFQ19USUZGTU9EVUxFX0hfCiAjZGVmaW5lIENPUkVfRlhDT0RFQ19DT0RFQ19DQ09ERUNfVElGRk1PRFVMRV9IXwogCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2ljb2RlY190aWZmbW9kdWxlLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfcmV0YWluX3B0ci5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKwogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfZGliaXRtYXAuaCIKIAotY2xhc3MgQ0NvZGVjX1RpZmZNb2R1bGUgOiBwdWJsaWMgSUNvZGVjX1RpZmZNb2R1bGUgeworY2xhc3MgQ0ZYX0RJQkF0dHJpYnV0ZTsKK2NsYXNzIElGWF9TZWVrYWJsZVJlYWRTdHJlYW07CisKK2NsYXNzIENDb2RlY19UaWZmTW9kdWxlIHsKICBwdWJsaWM6Ci0gIH5DQ29kZWNfVGlmZk1vZHVsZSgpIG92ZXJyaWRlIHt9CisgIGNsYXNzIENvbnRleHQgeworICAgcHVibGljOgorICAgIHZpcnR1YWwgfkNvbnRleHQoKSB7fQorICB9OwogCi0gIENDb2RlY19UaWZmQ29udGV4dCogQ3JlYXRlRGVjb2RlcigKLSAgICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIGZpbGVfcHRyKSBvdmVycmlkZTsKLSAgYm9vbCBMb2FkRnJhbWVJbmZvKENDb2RlY19UaWZmQ29udGV4dCogY3R4LAorICBzdGQ6OnVuaXF1ZV9wdHI8Q29udGV4dD4gQ3JlYXRlRGVjb2RlcigKKyAgICAgIGNvbnN0IFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgZmlsZV9wdHIpOworICBib29sIExvYWRGcmFtZUluZm8oQ29udGV4dCogY3R4LAogICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZSwKICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogY29tcHMsCiAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBicGMsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKSBvdmVycmlkZTsKLSAgYm9vbCBEZWNvZGUoQ0NvZGVjX1RpZmZDb250ZXh0KiBjdHgsIGNsYXNzIENGWF9ESUJpdG1hcCogcERJQml0bWFwKSBvdmVycmlkZTsKLSAgdm9pZCBEZXN0cm95RGVjb2RlcihDQ29kZWNfVGlmZkNvbnRleHQqIGN0eCkgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKTsKKyAgYm9vbCBEZWNvZGUoQ29udGV4dCogY3R4LCBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcERJQml0bWFwKTsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9GWENPREVDX0NPREVDX0NDT0RFQ19USUZGTU9EVUxFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvY29kZWMvY2pweF9kZWNvZGVyLmggYi9jb3JlL2Z4Y29kZWMvY29kZWMvY2pweF9kZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY4OTY5MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjb2RlYy9jb2RlYy9janB4X2RlY29kZXIuaApAQCAtMCwwICsxLDQyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENPREVDX0NPREVDX0NKUFhfREVDT0RFUl9IXworI2RlZmluZSBDT1JFX0ZYQ09ERUNfQ09ERUNfQ0pQWF9ERUNPREVSX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2NvZGVjX2ludC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wZW5qcGVnLmgiCisKK2NsYXNzIENQREZfQ29sb3JTcGFjZTsKKworY2xhc3MgQ0pQWF9EZWNvZGVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKUFhfRGVjb2RlcihDUERGX0NvbG9yU3BhY2UqIGNzKTsKKyAgfkNKUFhfRGVjb2RlcigpOworCisgIGJvb2wgSW5pdChjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmNfZGF0YSwgdWludDMyX3Qgc3JjX3NpemUpOworICB2b2lkIEdldEluZm8odWludDMyX3QqIHdpZHRoLCB1aW50MzJfdCogaGVpZ2h0LCB1aW50MzJfdCogY29tcG9uZW50cyk7CisgIGJvb2wgRGVjb2RlKHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICBpbnQgcGl0Y2gsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBvZmZzZXRzKTsKKworIHByaXZhdGU6CisgIGNvbnN0IHVpbnQ4X3QqIG1fU3JjRGF0YTsKKyAgdWludDMyX3QgbV9TcmNTaXplOworICAvLyBUT0RPKHJoYXJyaXNvbik6IENvbnZlcnQgdGhlc2UgdG8gdW5vd25lZCBwdHJzLCBpZiBwb3NzaWJsZS4KKyAgb3BqX2ltYWdlX3QqIG1fSW1hZ2U7CisgIG9wal9jb2RlY190KiBtX0NvZGVjOworICBzdGQ6OnVuaXF1ZV9wdHI8RGVjb2RlRGF0YT4gbV9EZWNvZGVEYXRhOworICBvcGpfc3RyZWFtX3QqIG1fU3RyZWFtOworICBvcGpfZHBhcmFtZXRlcnNfdCBtX1BhcmFtZXRlcnM7CisgIFVub3duZWRQdHI8Y29uc3QgQ1BERl9Db2xvclNwYWNlPiBjb25zdCBtX0NvbG9yU3BhY2U7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhDT0RFQ19DT0RFQ19DSlBYX0RFQ09ERVJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9jb2RlYy9jb2RlY19pbnQuaCBiL2NvcmUvZnhjb2RlYy9jb2RlYy9jb2RlY19pbnQuaAppbmRleCBlZGQ1YTY3Li5kZjJlNzU4IDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvY29kZWMvY29kZWNfaW50LmgKKysrIGIvY29yZS9meGNvZGVjL2NvZGVjL2NvZGVjX2ludC5oCkBAIC0xNCwxNyArMTQsMTYgQEAKICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2Z4X2NvZGVjLmgiCiAjaW5jbHVkZSAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0NvbnRleHQuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wZW5qcGVnLmgiCiAKIGNsYXNzIENQREZfQ29sb3JTcGFjZTsKIAogc3RydWN0IERlY29kZURhdGEgewotIHB1YmxpYzoKLSAgRGVjb2RlRGF0YSh1aW50OF90KiBkYXRhLCBPUEpfU0laRV9UIHNpemUpCisgIERlY29kZURhdGEoY29uc3QgdWludDhfdCogZGF0YSwgT1BKX1NJWkVfVCBzaXplKQogICAgICAgOiBzcmNfZGF0YShkYXRhKSwgc3JjX3NpemUoc2l6ZSksIG9mZnNldCgwKSB7fQotICB1aW50OF90KiBzcmNfZGF0YTsKKworICBjb25zdCB1aW50OF90KiBzcmNfZGF0YTsKICAgT1BKX1NJWkVfVCBzcmNfc2l6ZTsKICAgT1BKX1NJWkVfVCBvZmZzZXQ7CiB9OwpAQCAtMzUsOSArMzQsNiBAQAogT1BKX1NJWkVfVCBvcGpfcmVhZF9mcm9tX21lbW9yeSh2b2lkKiBwX2J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1NJWkVfVCBuYl9ieXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF91c2VyX2RhdGEpOwotT1BKX1NJWkVfVCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkodm9pZCogcF9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfU0laRV9UIG5iX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcF91c2VyX2RhdGEpOwogT1BKX09GRl9UIG9wal9za2lwX2Zyb21fbWVtb3J5KE9QSl9PRkZfVCBuYl9ieXRlcywgdm9pZCogcF91c2VyX2RhdGEpOwogT1BKX0JPT0wgb3BqX3NlZWtfZnJvbV9tZW1vcnkoT1BKX09GRl9UIG5iX2J5dGVzLCB2b2lkKiBwX3VzZXJfZGF0YSk7CiAKZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9jb2RlYy9meF9jb2RlYy5jcHAgYi9jb3JlL2Z4Y29kZWMvY29kZWMvZnhfY29kZWMuY3BwCmluZGV4IDBkODg2YjQuLjRkMDk0ZTUgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjb2RlYy9jb2RlYy9meF9jb2RlYy5jcHAKKysrIGIvY29yZS9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjLmNwcApAQCAtOSw4OSArOSwxMzgwIEBACiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGNtYXRoPgogI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0dXBsZT4KICNpbmNsdWRlIDx1dGlsaXR5PgogCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19iYXNpY21vZHVsZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfZmF4bW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19mbGF0ZW1vZHVsZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfaWNjbW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19qYmlnMm1vZHVsZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfanBlZ21vZHVsZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfanB4bW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19zY2FubGluZWRlY29kZXIuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY29kZWNfaW50LmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9leHQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc2FmZV90eXBlcy5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAorI2lmZGVmIFBERl9FTkFCTEVfWEZBCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19ibXBtb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2dpZm1vZHVsZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfcG5nbW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY190aWZmbW9kdWxlLmgiCisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IHVpbnQ4X3QgZ19DTVlLWzgxICogODEgKiAzXSA9IHsKKyAgICAyNTUsIDI1NSwgMjU1LCAyMjUsIDIyNiwgMjI4LCAxOTksIDIwMCwgMjAyLCAxNzMsIDE3NCwgMTc4LCAxNDcsIDE0OSwgMTUyLAorICAgIDEyMywgMTI1LCAxMjgsIDk5LCAgOTksICAxMDIsIDY5LCAgNzAsICA3MSwgIDM0LCAgMzAsICAzMSwgIDI1NSwgMjUzLCAyMjksCisgICAgMjI2LCAyMjQsIDIwMywgMjAwLCAxOTksIDE4MiwgMTczLCAxNzMsIDE1OCwgMTQ5LCAxNDgsIDEzNSwgMTI1LCAxMjQsIDExMywKKyAgICA5OSwgIDk5LCAgOTAsICA3MCwgIDY5LCAgNjMsICAzMywgIDI5LCAgMjQsICAyNTUsIDI1MSwgMjA0LCAyMjgsIDIyMywgMTgyLAorICAgIDIwMSwgMTk4LCAxNjMsIDE3NCwgMTcyLCAxNDIsIDE1MCwgMTQ3LCAxMjIsIDEyNSwgMTIzLCAxMDEsIDk5LCAgOTgsICA4MCwKKyAgICA3MCwgIDY4LCAgNTQsICAzMiwgIDI4LCAgMTYsICAyNTUsIDI0OSwgMTc5LCAyMzAsIDIyMiwgMTYwLCAyMDMsIDE5NywgMTQ0LAorICAgIDE3NCwgMTcwLCAxMjQsIDE1MCwgMTQ1LCAxMDUsIDEyNSwgMTIyLCA4OCwgIDk5LCAgOTcsICA2OSwgIDcwLCAgNjgsICA0NiwKKyAgICAzMSwgIDI4LCAgNiwgICAyNTUsIDI0NywgMTU0LCAyMjksIDIyMCwgMTM4LCAyMDMsIDE5NSwgMTIyLCAxNzYsIDE2OSwgMTA3LAorICAgIDE1MCwgMTQ1LCA5MSwgIDEyNSwgMTIxLCA3NCwgIDEwMCwgOTYsICA1NywgIDcwLCAgNjcsICAzNSwgIDI5LCAgMjYsICAwLAorICAgIDI1NSwgMjQ2LCAxMjgsIDIzMSwgMjE3LCAxMTQsIDIwNSwgMTk0LCAxMDEsIDE3NiwgMTY3LCA4OCwgIDE1MCwgMTQ0LCA3NSwKKyAgICAxMjUsIDEyMCwgNjAsICAxMDAsIDk2LCAgNDQsICA3MCwgIDY2LCAgMjQsICAyOCwgIDI2LCAgMCwgICAyNTUsIDI0NCwgOTYsCisgICAgMjMxLCAyMTcsIDg3LCAgMjAzLCAxOTIsIDc4LCAgMTc1LCAxNjcsIDY2LCAgMTUwLCAxNDMsIDU2LCAgMTI1LCAxMTksIDQzLAorICAgIDEwMCwgOTUsICAyOSwgIDY5LCAgNjYsICA3LCAgIDI2LCAgMjYsICAwLCAgIDI1NSwgMjQzLCA1MSwgIDIzMiwgMjE1LCA1MSwKKyAgICAyMDQsIDE5MSwgNDMsICAxNzYsIDE2NSwgMzgsICAxNTAsIDE0MiwgMjgsICAxMjUsIDExOCwgMTcsICA5OSwgIDk0LCAgMCwKKyAgICA2OCwgIDY1LCAgMCwgICAyNCwgIDI1LCAgMCwgICAyNTUsIDI0MSwgMCwgICAyMzEsIDIxNSwgMCwgICAyMDMsIDE5MCwgMCwKKyAgICAxNzYsIDE2NCwgMCwgICAxNTAsIDE0MSwgMCwgICAxMjYsIDExNywgMCwgICA5OSwgIDkzLCAgMCwgICA2OCwgIDY1LCAgMCwKKyAgICAyNCwgIDI1LCAgMCwgICAyNTIsIDIyOCwgMjM4LCAyMjIsIDIwMSwgMjExLCAxOTcsIDE4MCwgMTkwLCAxNzEsIDE1NiwgMTY2LAorICAgIDE0NywgMTMzLCAxNDMsIDEyMywgMTExLCAxMTksIDk5LCAgODgsICA5NCwgIDcxLCAgNjEsICA2NiwgIDM0LCAgMjIsICAyNiwKKyAgICAyNTQsIDIyNiwgMjEzLCAyMjQsIDIwMSwgMTkxLCAxOTksIDE3OSwgMTcxLCAxNzIsIDE1NSwgMTQ4LCAxNDcsIDEzMywgMTI4LAorICAgIDEyMywgMTEwLCAxMDYsIDk4LCAgODcsICA4MywgIDcwLCAgNTksICA1NywgIDMzLCAgMjEsICAxOCwgIDI1NCwgMjI0LCAxOTEsCisgICAgMjI0LCAxOTksIDE3MiwgMjAwLCAxNzcsIDE1MywgMTczLCAxNTQsIDEzMywgMTQ3LCAxMzIsIDExNSwgMTIzLCAxMDksIDk0LAorICAgIDk4LCAgODYsICA3NCwgIDcwLCAgNTksICA0OSwgIDMyLCAgMjEsICA5LCAgIDI1NSwgMjIyLCAxNjgsIDIyNywgMTk4LCAxNTAsCisgICAgMjAwLCAxNzUsIDEzNSwgMTczLCAxNTMsIDExOCwgMTQ4LCAxMzAsIDk5LCAgMTIzLCAxMDksIDgyLCAgOTgsICA4NiwgIDY0LAorICAgIDY5LCAgNTgsICA0MCwgIDMxLCAgMTksICAwLCAgIDI1NSwgMjIxLCAxNDUsIDIyNywgMTk2LCAxMjksIDIwMSwgMTc0LCAxMTUsCisgICAgMTczLCAxNTEsIDk5LCAgMTQ4LCAxMjksIDg1LCAgMTI0LCAxMDgsIDY5LCAgOTgsICA4NSwgIDUyLCAgNjksICA1OCwgIDMwLAorICAgIDMwLCAgMTksICAwLCAgIDI1NSwgMjE5LCAxMjEsIDIyNywgMTk1LCAxMDksIDIwMSwgMTc0LCA5NywgIDE3NCwgMTUwLCA4MywKKyAgICAxNDgsIDEyOSwgNzAsICAxMjQsIDEwNywgNTUsICA5OCwgIDg0LCAgNDAsICA2OSwgIDU4LCAgMTksICAyOCwgIDE4LCAgMCwKKyAgICAyNTUsIDIxOCwgOTIsICAyMjksIDE5NCwgODIsICAyMDIsIDE3MywgNzUsICAxNzQsIDE1MCwgNjMsICAxNDksIDEyOCwgNTEsCisgICAgMTI0LCAxMDYsIDM5LCAgOTgsICA4NCwgIDI0LCAgNjgsICA1NywgIDMsICAgMjYsICAxOCwgIDAsICAgMjU1LCAyMTcsIDU0LAorICAgIDIyOCwgMTkzLCA1MiwgIDIwMSwgMTcyLCA0NiwgIDE3NCwgMTQ4LCAzNiwgIDE0OCwgMTI3LCAyNywgIDEyMywgMTA1LCAxNCwKKyAgICA5OCwgIDgzLCAgMCwgICA2OCwgIDU2LCAgMCwgICAyNSwgIDE4LCAgMCwgICAyNTUsIDIxNiwgMCwgICAyMjksIDE5MiwgMiwKKyAgICAyMDIsIDE3MSwgNCwgICAxNzMsIDE0OCwgMCwgICAxNDgsIDEyNiwgMCwgICAxMjQsIDEwNSwgMCwgICA5OCwgIDgzLCAgMCwKKyAgICA2OCwgIDU2LCAgMCwgICAyNCwgIDE3LCAgMCwgICAyNDksIDIwNCwgMjIzLCAyMTksIDE4MSwgMTk5LCAxOTUsIDE2MCwgMTc4LAorICAgIDE3MCwgMTQwLCAxNTYsIDE0NiwgMTE5LCAxMzQsIDEyMywgOTksICAxMTIsIDk4LCAgNzcsICA4OCwgIDcwLCAgNTIsICA2MSwKKyAgICAzNCwgIDExLCAgMjAsICAyNTAsIDIwMSwgMjAwLCAyMjEsIDE4MCwgMTc4LCAxOTcsIDE1OSwgMTYxLCAxNzEsIDEzOSwgMTM5LAorICAgIDE0NywgMTE5LCAxMjAsIDEyMywgOTgsICA5OSwgIDk4LCAgNzcsICA3OCwgIDY5LCAgNTEsICA1MiwgIDM0LCAgMTEsICAxMCwKKyAgICAyNTIsIDIwMSwgMTgwLCAyMjMsIDE3OSwgMTYyLCAxOTcsIDE1OSwgMTQ0LCAxNzAsIDEzOCwgMTI1LCAxNDYsIDExNywgMTA3LAorICAgIDEyMiwgOTcsICA4OSwgIDk4LCAgNzYsICA2OSwgIDY5LCAgNTAsICA0NCwgIDMyLCAgMTEsICAyLCAgIDI1MiwgMTk5LCAxNTgsCisgICAgMjIyLCAxNzcsIDE0MywgMTk5LCAxNTgsIDEyNywgMTcxLCAxMzcsIDExMCwgMTQ3LCAxMTcsIDkzLCAgMTIyLCA5NiwgIDc2LAorICAgIDk3LCAgNzUsICA1OCwgIDY5LCAgNTAsICAzNiwgIDMyLCAgMTAsICAwLCAgIDI1MywgMTk4LCAxMzcsIDIyMywgMTc3LCAxMjMsCisgICAgMTk4LCAxNTYsIDExMCwgMTcxLCAxMzYsIDk1LCAgMTQ2LCAxMTYsIDgwLCAgMTIyLCA5NiwgIDY1LCAgOTcsICA3NSwgIDQ3LAorICAgIDY5LCAgNTAsICAyNSwgIDMwLCAgMTAsICAwLCAgIDI1NCwgMTk3LCAxMTUsIDIyNSwgMTc1LCAxMDQsIDE5OCwgMTU2LCA5MiwKKyAgICAxNzIsIDEzNSwgNzksICAxNDcsIDExNSwgNjYsICAxMjMsIDk1LCAgNTIsICA5OCwgIDc0LCAgMzcsICA2OSwgIDQ5LCAgMTUsCisgICAgMjksICAxMCwgIDAsICAgMjU0LCAxOTYsIDg5LCAgMjI0LCAxNzUsIDgwLCAgMTk5LCAxNTQsIDcwLCAgMTcyLCAxMzQsIDU5LAorICAgIDE0NiwgMTE0LCA0OCwgIDEyMiwgOTUsICAzNiwgIDk3LCAgNzQsICAyMSwgIDY4LCAgNDksICAwLCAgIDI3LCAgOSwgICAwLAorICAgIDI1NSwgMTk1LCA1NywgIDIyNSwgMTczLCA1MiwgIDE5OCwgMTU0LCA0NCwgIDE3MiwgMTMzLCAzNiwgIDE0NywgMTEzLCAyNiwKKyAgICAxMjMsIDk0LCAgMTQsICA5OCwgIDc0LCAgMCwgICA2OCwgIDQ5LCAgMCwgICAyNiwgIDEwLCAgMCwgICAyNTQsIDE5NCwgMTUsCisgICAgMjI1LCAxNzIsIDEyLCAgMTk4LCAxNTMsIDcsICAgMTcyLCAxMzIsIDMsICAgMTQ2LCAxMTMsIDAsICAgMTIzLCA5MywgIDAsCisgICAgOTgsICA3MywgIDAsICAgNjgsICA0OSwgIDAsICAgMjYsICA5LCAgIDAsICAgMjQ2LCAxNzgsIDIwOSwgMjE4LCAxNTksIDE4NiwKKyAgICAxOTQsIDE0MCwgMTY2LCAxNjgsIDEyMiwgMTQ1LCAxNDQsIDEwNCwgMTI1LCAxMjEsIDg1LCAgMTAzLCA5NywgIDY1LCAgODEsCisgICAgNjksICA0MSwgIDU1LCAgMzQsICAwLCAgIDEyLCAgMjQ4LCAxNzYsIDE4NiwgMjE5LCAxNTcsIDE2NiwgMTk1LCAxMzksIDE0OSwKKyAgICAxNjgsIDEyMSwgMTMwLCAxNDQsIDEwMywgMTExLCAxMjEsIDg1LCAgOTEsICA5NywgIDY1LCAgNzEsICA2OSwgIDQxLCAgNDYsCisgICAgMzQsICAwLCAgIDQsICAgMjQ5LCAxNzUsIDE2OCwgMjIwLCAxNTYsIDE1MCwgMTk2LCAxMzksIDEzNSwgMTY5LCAxMjEsIDExNiwKKyAgICAxNDQsIDEwMywgMTAwLCAxMjIsIDg0LCAgODMsICA5OCwgIDY1LCAgNjMsICA3MCwgIDQxLCAgMzksICAzMywgIDAsICAgMCwKKyAgICAyNDksIDE3NSwgMTQ4LCAyMjAsIDE1NSwgMTMzLCAxOTYsIDEzOCwgMTE5LCAxNjksIDEyMCwgMTAzLCAxNDUsIDEwMSwgODcsCisgICAgMTIxLCA4MywgIDcxLCAgOTcsICA2NSwgIDU0LCAgNjksICA0MSwgIDMxLCAgMzIsICAwLCAgIDAsICAgMjQ5LCAxNzMsIDEyOCwKKyAgICAyMjIsIDE1NCwgMTE1LCAxOTUsIDEzNywgMTAyLCAxNzAsIDExOSwgODgsICAxNDUsIDEwMSwgNzQsICAxMjIsIDgzLCAgNTksCisgICAgOTcsICA2NCwgIDQzLCAgNjgsICA0MCwgIDIwLCAgMzAsICAwLCAgIDAsICAgMjUwLCAxNzIsIDEwOCwgMjIxLCAxNTQsIDk4LAorICAgIDE5NSwgMTM2LCA4NiwgIDE3MCwgMTE4LCA3MywgIDE0NSwgMTAwLCA2MSwgIDEyMiwgODIsICA0OCwgIDk3LCAgNjMsICAzMiwKKyAgICA2OSwgIDQwLCAgMTEsICAyOCwgIDAsICAgMCwgICAyNTAsIDE3MSwgODUsICAyMjEsIDE1MywgNzYsICAxOTYsIDEzNiwgNjcsCisgICAgMTcwLCAxMTcsIDU2LCAgMTQ1LCA5OSwgIDQ0LCAgMTIxLCA4MiwgIDMzLCAgOTcsICA2MywgIDE3LCAgNjgsICA0MCwgIDAsCisgICAgMjgsICAwLCAgIDAsICAgMjUxLCAxNzEsIDU4LCAgMjIyLCAxNTIsIDUwLCAgMTk3LCAxMzUsIDQzLCAgMTY5LCAxMTcsIDM0LAorICAgIDE0NiwgOTksICAyNSwgIDEyMSwgODEsICAxMCwgIDk2LCAgNjMsICAwLCAgIDY4LCAgNDAsICAwLCAgIDI3LCAgMCwgICAwLAorICAgIDI1MCwgMTcwLCAyNiwgIDIyMiwgMTUxLCAxOSwgIDE5NiwgMTM0LCAxMywgIDE2OSwgMTE2LCA0LCAgIDE0NSwgOTksICAwLAorICAgIDEyMiwgODEsICAwLCAgIDk3LCAgNjMsICAwLCAgIDY3LCAgNDAsICAwLCAgIDI2LCAgMCwgICAwLCAgIDI0NCwgMTUzLCAxOTQsCisgICAgMjE1LCAxMzYsIDE3MywgMTkyLCAxMjEsIDE1NSwgMTY3LCAxMDQsIDEzNSwgMTQzLCA4OSwgIDExNSwgMTIxLCA3MiwgIDk2LAorICAgIDk3LCAgNTQsICA3NSwgIDcwLCAgMzEsICA0OSwgIDM0LCAgMCwgICA2LCAgIDI0NSwgMTUzLCAxNzMsIDIxNiwgMTM2LCAxNTUsCisgICAgMTkyLCAxMjAsIDEzOCwgMTY3LCAxMDQsIDEyMSwgMTQ0LCA4OCwgIDEwMywgMTIxLCA3MSwgIDg1LCAgOTcsICA1NCwgIDY2LAorICAgIDY5LCAgMzEsICA0MiwgIDM0LCAgMCwgICAwLCAgIDI0NiwgMTUyLCAxNTcsIDIxNywgMTM1LCAxNDAsIDE5MywgMTIwLCAxMjYsCisgICAgMTY3LCAxMDMsIDEwOSwgMTQzLCA4OCwgIDkyLCAgMTIxLCA3MiwgIDc2LCAgOTcsICA1NCwgIDU4LCAgNjksICAzMSwgIDM1LAorICAgIDMzLCAgMCwgICAwLCAgIDI0NSwgMTUwLCAxMzksIDIxOCwgMTM0LCAxMjUsIDE5MywgMTE5LCAxMTEsIDE2NywgMTAzLCA5NiwKKyAgICAxNDQsIDg3LCAgODAsICAxMjEsIDcxLCAgNjYsICA5NiwgIDUzLCAgNDksICA2OCwgIDMxLCAgMjYsICAzMiwgIDAsICAgMCwKKyAgICAyNDYsIDE1MSwgMTIyLCAyMTgsIDEzMywgMTA4LCAxOTQsIDExOCwgOTYsICAxNjgsIDEwMiwgODEsICAxNDQsIDg2LCAgNjksCisgICAgMTIwLCA3MSwgIDU1LCAgOTUsICA1MywgIDM5LCAgNjgsICAzMCwgIDE3LCAgMzEsICAwLCAgIDAsICAgMjQ4LCAxNTAsIDEwMywKKyAgICAyMTgsIDEzMywgOTEsICAxOTMsIDExOCwgODEsICAxNjgsIDEwMiwgNjksICAxNDMsIDg2LCAgNTYsICAxMjAsIDcwLCAgNDMsCisgICAgOTYsICA1MywgIDI4LCAgNjgsICAzMSwgIDYsICAgMjksICAwLCAgIDAsICAgMjQ3LCAxNDksIDgxLCAgMjE4LCAxMzIsIDcyLAorICAgIDE5NCwgMTE3LCA2MiwgIDE2OCwgMTAxLCA1MiwgIDE0NCwgODYsICA0MiwgIDEyMSwgNzAsICAyOSwgIDk2LCAgNTIsICAxMywKKyAgICA2OCwgIDMwLCAgMCwgICAyOCwgIDAsICAgMCwgICAyNDcsIDE0OCwgNTUsICAyMTksIDEzMSwgNTAsICAxOTQsIDExNywgNDMsCisgICAgMTY3LCAxMDEsIDMyLCAgMTQ0LCA4NSwgIDIyLCAgMTIwLCA2OSwgIDgsICAgOTYsICA1MiwgIDAsICAgNjcsICAzMCwgIDAsCisgICAgMjcsICAwLCAgIDAsICAgMjQ3LCAxNDcsIDI5LCAgMjE4LCAxMzEsIDI0LCAgMTk0LCAxMTYsIDIwLCAgMTY4LCAxMDAsIDExLAorICAgIDE0NCwgODUsICAwLCAgIDEyMCwgNjksICAwLCAgIDk2LCAgNTIsICAwLCAgIDY3LCAgMzAsICAwLCAgIDI2LCAgMCwgICAwLAorICAgIDI0MiwgMTMwLCAxNzksIDIxNCwgMTE0LCAxNjAsIDE5MCwgMTAxLCAxNDMsIDE2NiwgODcsICAxMjUsIDE0MywgNzIsICAxMDcsCisgICAgMTIwLCA1OCwgIDg4LCAgOTYsICA0MiwgIDY4LCAgNjksICAxNywgIDQ0LCAgMzUsICAwLCAgIDAsICAgMjQzLCAxMjksIDE2MSwKKyAgICAyMTUsIDExNCwgMTQzLCAxOTEsIDEwMSwgMTI4LCAxNjYsIDg3LCAgMTEzLCAxNDMsIDczLCAgOTYsICAxMjAsIDU4LCAgNzksCisgICAgOTYsICA0MSwgIDYwLCAgNjksICAxOCwgIDM3LCAgMzMsICAwLCAgIDAsICAgMjQzLCAxMjksIDE0NiwgMjE2LCAxMTQsIDEzMCwKKyAgICAxOTIsIDEwMSwgMTE3LCAxNjYsIDg3LCAgMTAxLCAxNDMsIDcyLCAgODYsICAxMjEsIDU4LCAgNjksICA5NiwgIDQyLCAgNTIsCisgICAgNjksICAxOCwgIDI5LCAgMzEsICAwLCAgIDAsICAgMjQzLCAxMjgsIDEzMCwgMjE2LCAxMTQsIDExNSwgMTkxLCAxMDEsIDEwMiwKKyAgICAxNjUsIDg2LCAgODgsICAxNDIsIDcyLCAgNzUsICAxMjAsIDU4LCAgNjAsICA5NSwgIDQyLCAgNDMsICA2OCwgIDE5LCAgMjEsCisgICAgMzAsICAwLCAgIDAsICAgMjQ0LCAxMjcsIDExMiwgMjE3LCAxMTMsIDEwMSwgMTkyLCA5OSwgIDg5LCAgMTY2LCA4NSwgIDc1LAorICAgIDE0MiwgNzIsICA2MywgIDExOSwgNTcsICA1MCwgIDk2LCAgNDEsICAzNSwgIDY4LCAgMTksICAxMywgIDMwLCAgMCwgICAwLAorICAgIDI0NCwgMTI3LCA5NiwgIDIxNiwgMTEyLCA4NiwgIDE5MSwgOTksICA3NSwgIDE2NiwgODYsICA2NCwgIDE0MywgNzIsICA1MiwKKyAgICAxMjAsIDU3LCAgNDAsICA5NSwgIDQxLCAgMjQsICA2NywgIDIwLCAgMSwgICAyOSwgIDAsICAgMCwgICAyNDUsIDEyNiwgNzcsCisgICAgMjE2LCAxMTMsIDY4LCAgMTkxLCAxMDAsIDU5LCAgMTY2LCA4NSwgIDQ5LCAgMTQyLCA3MSwgIDM4LCAgMTE5LCA1NywgIDI2LAorICAgIDk1LCAgNDEsICAxMCwgIDY3LCAgMjAsICAwLCAgIDI4LCAgMCwgICAwLCAgIDI0NCwgMTI2LCA1NSwgIDIxNiwgMTEyLCA0OCwKKyAgICAxOTEsIDk5LCAgNDAsICAxNjYsIDg1LCAgMzEsICAxNDMsIDcxLCAgMjAsICAxMTksIDU3LCAgNiwgICA5NSwgIDQyLCAgMCwKKyAgICA2NywgIDIwLCAgMCwgICAyOCwgIDAsICAgMCwgICAyNDUsIDEyNiwgMzMsICAyMTcsIDExMiwgMjYsICAxOTIsIDk5LCAgMjIsCisgICAgMTY2LCA4NCwgIDExLCAgMTQyLCA3MCwgIDAsICAgMTE5LCA1NywgIDAsICAgOTUsICA0MSwgIDAsICAgNjYsICAyMCwgIDAsCisgICAgMjcsICAwLCAgIDAsICAgMjQxLCAxMDIsIDE2NywgMjEzLCA5MCwgIDE0OSwgMTg5LCA3OSwgIDEzMywgMTY1LCA2NiwgIDExNSwKKyAgICAxNDEsIDU0LCAgOTgsICAxMTksIDQxLCAgODEsICA5NiwgIDI1LCAgNjMsICA2OSwgIDAsICAgMzgsICAzMCwgIDAsICAgMCwKKyAgICAyNDEsIDEwMiwgMTQ5LCAyMTMsIDkwLCAgMTMzLCAxODksIDc5LCAgMTE5LCAxNjUsIDY2LCAgMTAzLCAxNDIsIDU1LCAgODgsCisgICAgMTE5LCA0MSwgIDcxLCAgOTYsICAyNSwgIDUzLCAgNjksICAwLCAgIDMxLCAgMjgsICAwLCAgIDAsICAgMjQxLCAxMDIsIDEzNSwKKyAgICAyMTQsIDkwLCAgMTIxLCAxOTAsIDc5LCAgMTA4LCAxNjUsIDY2LCAgOTIsICAxNDEsIDU1LCAgNzgsICAxMTksIDQyLCAgNjMsCisgICAgOTYsICAyNiwgIDQ2LCAgNjksICAwLCAgIDI0LCAgMjgsICAwLCAgIDAsICAgMjQxLCAxMDEsIDEyMCwgMjE0LCA5MCwgIDEwNywKKyAgICAxODksIDc5LCAgOTUsICAxNjUsIDY3LCAgODMsICAxNDEsIDU0LCAgNjgsICAxMTgsIDQxLCAgNTQsICA5NSwgIDI3LCAgMzksCisgICAgNjgsICAwLCAgIDE2LCAgMjcsICAwLCAgIDAsICAgMjQxLCAxMDIsIDEwNiwgMjEzLCA5MCwgIDkzLCAgMTg5LCA3OCwgIDgyLAorICAgIDE2NCwgNjcsICA3MCwgIDE0MSwgNTUsICA1OCwgIDExOCwgNDIsICA0NSwgIDk0LCAgMjcsICAyOSwgIDY3LCAgMiwgICA2LAorICAgIDI3LCAgMCwgICAwLCAgIDI0MiwgMTAxLCA5MCwgIDIxNCwgODksICA3OSwgIDE5MCwgNzksICA2OSwgIDE2NiwgNjcsICA1OSwKKyAgICAxNDEsIDU1LCAgNDcsICAxMTgsIDQxLCAgMzUsICA5NSwgIDI3LCAgMTksICA2NywgIDMsICAgMCwgICAyNiwgIDAsICAgMCwKKyAgICAyNDIsIDEwMiwgNzIsICAyMTMsIDg5LCAgNjMsICAxOTEsIDc5LCAgNTYsICAxNjQsIDY3LCAgNDUsICAxNDEsIDU1LCAgMzQsCisgICAgMTE4LCA0MiwgIDIyLCAgOTQsICAyOCwgIDYsICAgNjcsICAzLCAgIDAsICAgMjYsICAwLCAgIDAsICAgMjQyLCAxMDAsIDUxLAorICAgIDIxNCwgODksICA0NSwgIDE5MCwgNzgsICAzOCwgIDE2NCwgNjcsICAzMCwgIDE0MSwgNTUsICAxOCwgIDExOCwgNDIsICAzLAorICAgIDk1LCAgMjgsICAwLCAgIDY2LCAgNCwgICAwLCAgIDI2LCAgMCwgICAwLCAgIDI0MywgMTAwLCAzMywgIDIxNCwgOTAsICAyNywKKyAgICAxOTAsIDc4LCAgMjIsICAxNjUsIDY3LCAgMTMsICAxNDEsIDU1LCAgMCwgICAxMTgsIDQzLCAgMCwgICA5NCwgIDI5LCAgMCwKKyAgICA2NiwgIDUsICAgMCwgICAyNiwgIDAsICAgMCwgICAyMzcsIDY5LCAgMTUzLCAyMTEsIDU4LCAgMTM1LCAxODcsIDUxLCAgMTIxLAorICAgIDE2MywgNDEsICAxMDUsIDE0MSwgMjgsICA5MCwgIDExOCwgMTUsICA3MywgIDk2LCAgMCwgICA1NiwgIDY4LCAgMCwgICAzMywKKyAgICAyNSwgIDAsICAgMCwgICAyMzksIDY3LCAgMTM3LCAyMTIsIDYwLCAgMTIzLCAxODksIDUwLCAgMTEwLCAxNjMsIDQxLCAgOTQsCisgICAgMTQxLCAyOSwgIDc5LCAgMTE4LCAxNywgIDY1LCAgOTUsICAwLCAgIDQ4LCAgNjksICAwLCAgIDI2LCAgMjUsICAwLCAgIDAsCisgICAgMjQwLCA2OSwgIDEyNCwgMjExLCA2MCwgIDExMSwgMTg4LCA1MCwgIDk4LCAgMTYzLCA0MiwgIDg1LCAgMTQxLCAzMSwgIDcyLAorICAgIDExOCwgMTgsICA1NywgIDk0LCAgMCwgICA0MSwgIDY4LCAgMCwgICAxOSwgIDI1LCAgMCwgICAwLCAgIDI0MCwgNzAsICAxMTIsCisgICAgMjEyLCA2MSwgIDk5LCAgMTg4LCA1MiwgIDg3LCAgMTYzLCA0MSwgIDc0LCAgMTQwLCAzMSwgIDYyLCAgMTE4LCAyMCwgIDQ4LAorICAgIDk0LCAgMiwgICAzMiwgIDY4LCAgMCwgICAxMSwgIDI0LCAgMCwgICAwLCAgIDIzOSwgNzAsICA5OCwgIDIxMiwgNjIsICA4NiwKKyAgICAxODgsIDUzLCAgNzcsICAxNjQsIDQyLCAgNjQsICAxNDAsIDMyLCAgNTIsICAxMTgsIDIwLCAgNDAsICA5NCwgIDMsICAgMjQsCisgICAgNjcsICAwLCAgIDMsICAgMjMsICAwLCAgIDAsICAgMjM5LCA3MSwgIDg1LCAgMjEyLCA2MSwgIDc0LCAgMTg3LCA1MywgIDY1LAorICAgIDE2MywgNDQsICA1NCwgIDE0MCwgMzQsICA0MywgIDExOCwgMjIsICAzMCwgIDk1LCAgMywgICAxNCwgIDY3LCAgMCwgICAwLAorICAgIDIzLCAgMCwgICAwLCAgIDIzOSwgNzAsICA2NywgIDIxMiwgNjIsICA1OSwgIDE4OCwgNTMsICA1MSwgIDE2MywgNDUsICA0MiwKKyAgICAxNDEsIDM0LCAgMzEsICAxMTcsIDIyLCAgMTcsICA5NCwgIDUsICAgMiwgICA2NiwgIDAsICAgMCwgICAyMywgIDAsICAgMCwKKyAgICAyMzksIDcxLCAgNTAsICAyMTMsIDYyLCAgNDMsICAxODgsIDU0LCAgMzcsICAxNjQsIDQ1LCAgMjgsICAxMzksIDM0LCAgMTYsCisgICAgMTE3LCAyMiwgIDIsICAgOTQsICA3LCAgIDAsICAgNjUsICAwLCAgIDAsICAgMjMsICAwLCAgIDAsICAgMjQwLCA3MSwgIDM0LAorICAgIDIxMiwgNjMsICAyOSwgIDE4OSwgNTQsICAyNCwgIDE2MywgNDYsICAxNSwgIDEzOSwgMzYsICAyLCAgIDExNywgMjUsICAwLAorICAgIDk0LCAgOCwgICAwLCAgIDY2LCAgMCwgICAwLCAgIDIzLCAgMCwgICAwLCAgIDIzNywgMCwgICAxNDAsIDIwOSwgMCwgICAxMjQsCisgICAgMTg2LCAwLCAgIDExMiwgMTYyLCAwLCAgIDk3LCAgMTQxLCAwLCAgIDgyLCAgMTE4LCAwLCAgIDY3LCAgOTUsICAwLCAgIDQ5LAorICAgIDY4LCAgMCwgICAyNywgIDIwLCAgMCwgICAwLCAgIDIzNywgMCwgICAxMjYsIDIxMCwgMCwgICAxMTMsIDE4NywgMCwgICA5OSwKKyAgICAxNjMsIDAsICAgODYsICAxMzksIDAsICAgNzIsICAxMTgsIDAsICAgNTgsICA5NSwgIDAsICAgNDIsICA2NywgIDAsICAgMjAsCisgICAgMjAsICAwLCAgIDAsICAgMjM3LCAxLCAgIDExNCwgMjA5LCAxLCAgIDEwMiwgMTg3LCAwLCAgIDkwLCAgMTYzLCAwLCAgIDc4LAorICAgIDEzOSwgMCwgICA2NCwgIDExOCwgMCwgICA1MCwgIDk1LCAgMCwgICAzNSwgIDY3LCAgMCwgICAxMywgIDIwLCAgMCwgICAwLAorICAgIDIzNiwgMTYsICAxMDIsIDIwOSwgNywgICA5MSwgIDE4NiwgMCwgICA4MCwgIDE2MiwgMCwgICA2OCwgIDEzOSwgMCwgICA1NiwKKyAgICAxMTcsIDAsICAgNDMsICA5NCwgIDAsICAgMjcsICA2NywgIDAsICAgNiwgICAyMCwgIDAsICAgMCwgICAyMzgsIDE1LCAgODksCisgICAgMjA5LCAxMywgIDc5LCAgMTg2LCA2LCAgIDY5LCAgMTYyLCAwLCAgIDU4LCAgMTM5LCAwLCAgIDQ3LCAgMTE3LCAwLCAgIDM0LAorICAgIDkzLCAgMCwgICAyMCwgIDY2LCAgMCwgICAyLCAgIDIwLCAgMCwgICAwLCAgIDIzNywgMjAsICA3OCwgIDIxMCwgMTIsICA2OCwKKyAgICAxODcsIDQsICAgNTksICAxNjMsIDAsICAgNDksICAxMzksIDAsICAgMzgsICAxMTYsIDAsICAgMjYsICA5NCwgIDAsICAgMTEsCisgICAgNjYsICAwLCAgIDAsICAgMjAsICAwLCAgIDAsICAgMjM3LCAyNSwgIDY0LCAgMjEwLCAxOCwgIDU2LCAgMTg2LCAxMSwgIDQ4LAorICAgIDE2MiwgNCwgICAzOSwgIDEzOCwgMCwgICAyNywgIDExNywgMCwgICAxNCwgIDkzLCAgMCwgICAwLCAgIDY2LCAgMCwgICAwLAorICAgIDIwLCAgMCwgICAwLCAgIDIzOCwgMjUsICA0OCwgIDIxMCwgMjIsICA0MywgIDE4NiwgMTUsICAzNSwgIDE2MiwgOCwgICAyNiwKKyAgICAxNDAsIDAsICAgMTQsICAxMTcsIDAsICAgMCwgICA5MywgIDAsICAgMCwgICA2NSwgIDAsICAgMCwgICAyMCwgIDAsICAgMCwKKyAgICAyMzgsIDI4LCAgMzUsICAyMTAsIDIxLCAgMzAsICAxODcsIDE1LCAgMjQsICAxNjIsIDgsICAgMTYsICAxMzksIDEsICAgMiwKKyAgICAxMTcsIDAsICAgMCwgICA5MywgIDAsICAgMCwgICA2NSwgIDAsICAgMCwgICAyMiwgIDAsICAgMCwgICAyMTksIDI0MiwgMjUyLAorICAgIDE5NSwgMjE0LCAyMjUsIDE3MiwgMTkxLCAyMDEsIDE0OCwgMTY1LCAxNzUsIDEyNywgMTQyLCAxNTAsIDEwNiwgMTE5LCAxMjYsCisgICAgODQsICA5NSwgIDEwMSwgNTgsICA2NiwgIDcyLCAgMjQsICAyNywgIDMyLCAgMjIyLCAyMzksIDIyNiwgMTk2LCAyMTMsIDIwMiwKKyAgICAxNzMsIDE4OSwgMTgwLCAxNTAsIDE2NSwgMTU4LCAxMjksIDE0MSwgMTM1LCAxMDcsIDExOCwgMTEzLCA4NSwgIDk0LCAgOTAsCisgICAgNTgsICA2NiwgIDYzLCAgMjEsICAyNiwgIDI0LCAgMjIzLCAyMzcsIDIwMywgMTk4LCAyMTEsIDE4MiwgMTc1LCAxODgsIDE2MywKKyAgICAxNTIsIDE2NCwgMTQxLCAxMjksIDE0MCwgMTIxLCAxMDcsIDExNywgMTAxLCA4NSwgIDkzLCAgODAsICA1OCwgIDY0LCAgNTQsCisgICAgMjEsICAyNiwgIDE4LCAgMjI2LCAyMzYsIDE3OSwgMjAxLCAyMTAsIDE2MCwgMTc3LCAxODcsIDE0MywgMTUzLCAxNjIsIDEyNSwKKyAgICAxMzAsIDEzOSwgMTA2LCAxMDgsIDExNiwgODksICA4NSwgIDkyLCAgNjksICA1OCwgIDY0LCAgNDUsICAyMCwgIDI1LCAgOCwKKyAgICAyMjcsIDIzNCwgMTUzLCAyMDEsIDIwOCwgMTM5LCAxNzgsIDE4NSwgMTI0LCAxNTQsIDE2MSwgMTA3LCAxMzEsIDEzOCwgOTEsCisgICAgMTA4LCAxMTUsIDc1LCAgODUsICA5MSwgIDU4LCAgNTgsICA2MywgIDM1LCAgMTcsICAyNSwgIDAsICAgMjI5LCAyMzMsIDEzMCwKKyAgICAyMDMsIDIwNywgMTE2LCAxNzgsIDE4NCwgMTA0LCAxNTQsIDE2MCwgOTAsICAxMzEsIDEzNywgNzYsICAxMDksIDExNCwgNjIsCisgICAgODUsICA5MCwgIDQ2LCAgNTgsICA2MywgIDI1LCAgMTYsICAyNCwgIDAsICAgMjMwLCAyMzEsIDEwMCwgMjAyLCAyMDUsIDkwLAorICAgIDE3OSwgMTgzLCA4MCwgIDE1NCwgMTU5LCA2OSwgIDEzMSwgMTM2LCA1NywgIDEwOSwgMTEzLCA0NiwgIDg2LCAgOTAsICAzMiwKKyAgICA1OCwgIDYzLCAgMTAsICAxNCwgIDI0LCAgMCwgICAyMzAsIDIzMCwgNjUsICAyMDQsIDIwNCwgNTgsICAxODAsIDE4MiwgNTIsCisgICAgMTU1LCAxNTcsIDQ0LCAgMTMyLCAxMzUsIDM1LCAgMTEwLCAxMTMsIDI0LCAgODYsICA4OSwgIDksICAgNTcsICA2MiwgIDAsCisgICAgMTEsICAyNCwgIDAsICAgMjMyLCAyMzAsIDE5LCAgMjA0LCAyMDQsIDE5LCAgMTgwLCAxODEsIDE3LCAgMTU1LCAxNTcsIDEwLAorICAgIDEzMSwgMTM0LCAyLCAgIDEwOSwgMTEyLCAwLCAgIDg1LCAgODksICAwLCAgIDU3LCAgNjIsICAwLCAgIDEwLCAgMjMsICAwLAorICAgIDIxOCwgMjE2LCAyMzYsIDE5NCwgMTkyLCAyMTEsIDE3MiwgMTcxLCAxODgsIDE0OSwgMTQ5LCAxNjQsIDEyOCwgMTI3LCAxNDEsCisgICAgMTA2LCAxMDYsIDExOSwgODQsICA4NCwgIDk0LCAgNTksICA1NywgIDY2LCAgMjUsICAxOCwgIDI2LCAgMjIxLCAyMTQsIDIxMSwKKyAgICAxOTYsIDE5MSwgMTkwLCAxNzQsIDE3MCwgMTcwLCAxNTAsIDE0OCwgMTQ4LCAxMjgsIDEyNiwgMTI3LCAxMDcsIDEwNSwgMTA2LAorICAgIDg1LCAgODMsICA4NCwgIDU5LCAgNTYsICA1OCwgIDIzLCAgMTcsICAxOCwgIDIyMiwgMjEzLCAxOTAsIDE5NywgMTg5LCAxNzAsCisgICAgMTc1LCAxNjksIDE1MywgMTUxLCAxNDcsIDEzMywgMTI5LCAxMjYsIDExMywgMTA4LCAxMDUsIDk0LCAgODUsICA4MiwgIDc0LAorICAgIDU5LCAgNTYsICA0OSwgIDIyLCAgMTcsICAxMSwgIDIyNCwgMjExLCAxNjgsIDE5OSwgMTg4LCAxNTEsIDE3NSwgMTY4LCAxMzUsCisgICAgMTUyLCAxNDYsIDExNywgMTI5LCAxMjQsIDk5LCAgMTA3LCAxMDMsIDgyLCAgODQsICA4MiwgIDY0LCAgNTksICA1NSwgIDQxLAorICAgIDIxLCAgMTcsICAxLCAgIDIyNCwgMjEwLCAxNDUsIDE5OSwgMTg3LCAxMzAsIDE3NiwgMTY2LCAxMTcsIDE1MiwgMTQ1LCAxMDEsCisgICAgMTI5LCAxMjMsIDg2LCAgMTA3LCAxMDMsIDcwLCAgODUsICA4MSwgIDUzLCAgNTgsICA1NSwgIDMxLCAgMTksICAxNywgIDAsCisgICAgMjI3LCAyMDgsIDEyMywgMjAwLCAxODYsIDExMCwgMTc3LCAxNjUsIDk4LCAgMTUzLCAxNDMsIDg0LCAgMTMwLCAxMjIsIDcwLAorICAgIDEwOCwgMTAyLCA1NywgIDg1LCAgODAsICA0MSwgIDU4LCAgNTQsICAyMCwgIDE4LCAgMTYsICAwLCAgIDIyNywgMjA4LCA5NywKKyAgICAyMDIsIDE4NSwgODYsICAxNzcsIDE2NCwgNzcsICAxNTMsIDE0MiwgNjUsICAxMzAsIDEyMiwgNTQsICAxMDgsIDEwMSwgNDIsCisgICAgODUsICA4MCwgIDI3LCAgNTgsICA1NCwgIDcsICAgMTYsICAxNiwgIDAsICAgMjI4LCAyMDYsIDY2LCAgMjAyLCAxODQsIDU4LAorICAgIDE3OCwgMTYzLCA1MCwgIDE1NCwgMTQxLCA0MiwgIDEzMSwgMTIxLCAzMywgIDEwOSwgMTAxLCAyMSwgIDg2LCAgNzksICA1LAorICAgIDU4LCAgNTQsICAwLCAgIDEzLCAgMTYsICAwLCAgIDIyOCwgMjA2LCAyOSwgIDIwMiwgMTgzLCAyNSwgIDE3OCwgMTYzLCAyMCwKKyAgICAxNTQsIDE0MSwgMTUsICAxMzEsIDEyMSwgNSwgICAxMDgsIDEwMCwgMCwgICA4NSwgIDc5LCAgMCwgICA1OCwgIDUzLCAgMCwKKyAgICAxMywgIDE2LCAgMCwgICAyMTcsIDE5MywgMjIxLCAxOTMsIDE3MiwgMTk4LCAxNzIsIDE1MywgMTc4LCAxNDksIDEzMywgMTU0LAorICAgIDEyOCwgMTE0LCAxMzIsIDEwNywgOTQsICAxMTEsIDg1LCAgNzQsICA4OSwgIDU5LCAgNDksICA2MSwgIDI1LCAgOCwgICAyMiwKKyAgICAyMTksIDE5MSwgMTk4LCAxOTUsIDE3MSwgMTc4LCAxNzMsIDE1MywgMTU5LCAxNDksIDEzMiwgMTM5LCAxMjgsIDExMywgMTE5LAorICAgIDEwNywgOTQsICAxMDAsIDg1LCAgNzMsICA3OSwgIDU5LCAgNDgsICA1MiwgIDI1LCAgNywgICAxNCwgIDIyMSwgMTkxLCAxODAsCisgICAgMTk2LCAxNzAsIDE2MCwgMTc0LCAxNTIsIDE0NCwgMTUwLCAxMzIsIDEyNSwgMTI5LCAxMTMsIDEwNywgMTA3LCA5MywgIDg5LAorICAgIDg1LCAgNzMsICA2OSwgIDU5LCAgNDgsICA0NSwgIDIzLCAgNywgICA0LCAgIDIyMiwgMTg5LCAxNTksIDE5NywgMTY5LCAxNDIsCisgICAgMTc0LCAxNTEsIDEyNywgMTUxLCAxMzEsIDExMCwgMTI5LCAxMTIsIDk0LCAgMTA4LCA5MywgIDc4LCAgODUsICA3MiwgIDYwLAorICAgIDU4LCAgNDcsICAzNywgIDIyLCAgNywgICAwLCAgIDIyMywgMTg4LCAxMzgsIDE5NywgMTY4LCAxMjMsIDE3NSwgMTUwLCAxMDksCisgICAgMTUxLCAxMzAsIDk1LCAgMTMwLCAxMTEsIDgxLCAgMTA4LCA5MiwgIDY1LCAgODUsICA3MiwgIDQ5LCAgNTksICA0NywgIDI3LAorICAgIDIxLCAgNywgICAwLCAgIDIyNCwgMTg3LCAxMTgsIDE5OCwgMTY3LCAxMDUsIDE3NiwgMTQ5LCA5MywgIDE1MiwgMTI5LCA3OSwKKyAgICAxMzAsIDExMCwgNjgsICAxMDgsIDkxLCAgNTQsICA4NSwgIDcxLCAgMzgsICA1OSwgIDQ3LCAgMTcsICAxOCwgIDcsICAgMCwKKyAgICAyMjQsIDE4NywgOTMsICAxOTksIDE2NiwgODMsICAxNzYsIDE0OCwgNzMsICAxNTIsIDEyOCwgNjIsICAxMjksIDEwOSwgNTEsCisgICAgMTA4LCA5MCwgIDM5LCAgODUsICA3MSwgIDI1LCAgNTgsICA0NiwgIDMsICAgMTYsICA4LCAgIDAsICAgMjI2LCAxODYsIDY0LAorICAgIDIwMCwgMTY1LCA1NywgIDE3NywgMTQ3LCA1MCwgIDE1MywgMTI3LCA0MCwgIDEzMCwgMTA4LCAzMSwgIDEwOCwgOTAsICAxOSwKKyAgICA4NSwgIDcwLCAgMywgICA1OCwgIDQ2LCAgMCwgICAxNiwgIDgsICAgMCwgICAyMjcsIDE4NSwgMzUsICAyMDAsIDE2NSwgMzAsCisgICAgMTc2LCAxNDYsIDI1LCAgMTUyLCAxMjcsIDE4LCAgMTMwLCAxMDgsIDcsICAgMTA4LCA4OSwgIDAsICAgODUsICA3MCwgIDAsCisgICAgNTcsICA0NiwgIDAsICAgMTQsICA4LCAgIDAsICAgMjE2LCAxNjksIDIwNSwgMTkyLCAxNTAsIDE4NCwgMTcxLCAxMzQsIDE2NCwKKyAgICAxNDksIDExNiwgMTQ0LCAxMjgsIDk5LCAgMTI0LCAxMDcsIDgxLCAgMTAzLCA4NSwgIDYzLCAgODEsICA2MCwgIDM5LCAgNTUsCisgICAgMjYsICAwLCAgIDE1LCAgMjE3LCAxNjgsIDE4NiwgMTkzLCAxNTAsIDE2NSwgMTcyLCAxMzQsIDE0OSwgMTUwLCAxMTYsIDEzMCwKKyAgICAxMjgsIDk5LCAgMTExLCAxMDcsIDgxLCAgOTIsICA4NSwgIDYyLCAgNzIsICA1OSwgIDM5LCAgNDcsICAyNSwgIDAsICAgNiwKKyAgICAyMTksIDE2OCwgMTY4LCAxOTQsIDE0OSwgMTUwLCAxNzMsIDEzMywgMTM1LCAxNTAsIDExNiwgMTE3LCAxMjgsIDk4LCAgOTksCisgICAgMTA3LCA4MCwgIDgyLCAgODYsICA2MiwgIDYzLCAgNTksICAzOCwgIDM5LCAgMjQsICAwLCAgIDAsICAgMjE5LCAxNjYsIDE0OCwKKyAgICAxOTUsIDE0OSwgMTMzLCAxNzMsIDEzMywgMTE5LCAxNTAsIDExNSwgMTAzLCAxMjgsIDk4LCAgODgsICAxMDcsIDgwLCAgNzIsCisgICAgODUsICA2MSwgIDU0LCAgNTksICAzOCwgIDMyLCAgMjMsICAwLCAgIDAsICAgMjIwLCAxNjYsIDEyOSwgMTk2LCAxNDgsIDExNiwKKyAgICAxNzQsIDEzMiwgMTAzLCAxNTEsIDExNCwgODksICAxMjksIDk3LCAgNzUsICAxMDcsIDc5LCAgNjAsICA4NSwgIDYxLCAgNDQsCisgICAgNTksICAzOCwgIDIyLCAgMjEsICAwLCAgIDAsICAgMjIyLCAxNjQsIDExMCwgMTk3LCAxNDcsIDk5LCAgMTc1LCAxMzEsIDg3LAorICAgIDE1MSwgMTEzLCA3NSwgIDEyOSwgOTYsICA2MywgIDEwNywgNzksICA0OSwgIDg1LCAgNjEsICAzMywgIDU4LCAgMzgsICAxMiwKKyAgICAxOSwgIDAsICAgMCwgICAyMjIsIDE2NCwgODgsICAxOTcsIDE0NiwgNzksICAxNzQsIDEzMCwgNjksICAxNTEsIDExMywgNTgsCisgICAgMTI5LCA5NSwgIDQ3LCAgMTA3LCA3OCwgIDM1LCAgODUsICA2MCwgIDIwLCAgNTgsICAzOCwgIDAsICAgMTgsICAwLCAgIDAsCisgICAgMjIzLCAxNjQsIDYzLCAgMTk4LCAxNDUsIDU1LCAgMTc1LCAxMjksIDQ4LCAgMTUxLCAxMTIsIDM5LCAgMTI5LCA5NSwgIDI5LAorICAgIDEwNywgNzgsICAxNiwgIDg1LCAgNjAsICAxLCAgIDU4LCAgMzgsICAwLCAgIDE3LCAgMCwgICAwLCAgIDIyMywgMTYzLCAzNiwKKyAgICAxOTgsIDE0NSwgMzIsICAxNzQsIDEyOSwgMjYsICAxNTEsIDExMSwgMTcsICAxMjksIDk1LCAgNywgICAxMDcsIDc4LCAgMCwKKyAgICA4NCwgIDYwLCAgMCwgICA1NywgIDM3LCAgMCwgICAxNSwgIDAsICAgMCwgICAyMTUsIDE0NywgMTkyLCAxOTEsIDEzMCwgMTcyLAorICAgIDE3MCwgMTE2LCAxNTMsIDE0OCwgMTAwLCAxMzMsIDEyNywgODUsICAxMTUsIDEwNywgNjksICA5NiwgIDg1LCAgNTEsICA3NSwKKyAgICA2MCwgIDI4LCAgNTAsICAyNSwgIDAsICAgOCwgICAyMTcsIDE0NiwgMTczLCAxOTIsIDEzMCwgMTU0LCAxNzEsIDExNSwgMTM4LAorICAgIDE0OSwgMTAwLCAxMjEsIDEyOCwgODQsICAxMDMsIDEwNywgNjgsICA4NSwgIDg1LCAgNTEsICA2NiwgIDYwLCAgMjgsICA0MiwKKyAgICAyNSwgIDAsICAgMCwgICAyMTcsIDE0NSwgMTU3LCAxOTMsIDEyOSwgMTQwLCAxNzMsIDExNSwgMTI1LCAxNDksIDEwMCwgMTA5LAorICAgIDEyOCwgODQsICA5MiwgIDEwNywgNjgsICA3NiwgIDg1LCAgNTEsICA1OCwgIDU5LCAgMjgsICAzNSwgIDIzLCAgMCwgICAwLAorICAgIDIxOCwgMTQ1LCAxNDAsIDE5MywgMTI5LCAxMjUsIDE3MiwgMTE0LCAxMTAsIDE0OSwgOTksICA5NiwgIDEyOCwgODMsICA4MSwKKyAgICAxMDcsIDY3LCAgNjUsICA4NCwgIDUxLCAgNDksICA1OSwgIDI5LCAgMjcsICAyMiwgIDAsICAgMCwgICAyMTksIDE0NCwgMTIxLAorICAgIDE5NCwgMTI4LCAxMDgsIDE3MiwgMTEzLCA5NiwgIDE0OSwgOTgsICA4MywgIDEyOCwgODMsICA2OSwgIDEwNywgNjgsICA1NSwKKyAgICA4NSwgIDUwLCAgNDAsICA1OSwgIDI4LCAgMTgsICAyMCwgIDAsICAgMCwgICAyMjAsIDE0MywgMTA0LCAxOTUsIDEyOCwgOTMsCisgICAgMTczLCAxMTQsIDgyLCAgMTUwLCA5OCwgIDY5LCAgMTI3LCA4MiwgIDU4LCAgMTA3LCA2NywgIDQ1LCAgODUsICA1MCwgIDMwLAorICAgIDU5LCAgMjgsICA3LCAgIDE5LCAgMCwgICAwLCAgIDIyMCwgMTQzLCA4NCwgIDE5NSwgMTI3LCA3NCwgIDE3MywgMTEzLCA2NSwKKyAgICAxNDksIDk3LCAgNTUsICAxMjgsIDgyLCAgNDQsICAxMDYsIDY3LCAgMzIsICA4NCwgIDUwLCAgMTYsICA1OCwgIDI4LCAgMCwKKyAgICAxOCwgIDAsICAgMCwgICAyMjEsIDE0MiwgNjIsICAxOTYsIDEyNiwgNTMsICAxNzMsIDExMiwgNDYsICAxNTAsIDk3LCAgMzcsCisgICAgMTI4LCA4MiwgIDI2LCAgMTA3LCA2NiwgIDE0LCAgODQsICA1MCwgIDAsICAgNTgsICAyOCwgIDAsICAgMTYsICAwLCAgIDAsCisgICAgMjIyLCAxNDIsIDM4LCAgMTk2LCAxMjYsIDM0LCAgMTc0LCAxMTIsIDI3LCAgMTUwLCA5NiwgIDE3LCAgMTI4LCA4MiwgIDYsCisgICAgMTA2LCA2NiwgIDAsICAgODQsICA1MCwgIDAsICAgNTcsICAyOSwgIDAsICAgMTYsICAwLCAgIDAsICAgMjE0LCAxMjMsIDE3OSwKKyAgICAxOTEsIDExMCwgMTU5LCAxNjksIDk4LCAgMTQzLCAxNDcsIDg0LCAgMTI0LCAxMjYsIDcwLCAgMTA2LCAxMDcsIDU1LCAgODgsCisgICAgODUsICAzOSwgIDY5LCAgNjAsICAxNSwgIDQ1LCAgMjMsICAwLCAgIDIsICAgMjE2LCAxMjMsIDE2MSwgMTkyLCAxMTAsIDE0NCwKKyAgICAxNzAsIDk4LCAgMTI5LCAxNDgsIDg0LCAgMTEyLCAxMjcsIDcwLCAgOTUsICAxMDcsIDU1LCAgNzksICA4NSwgIDM5LCAgNjEsCisgICAgNjAsICAxNSwgIDM3LCAgMjAsICAwLCAgIDAsICAgMjE3LCAxMjIsIDE0NSwgMTkyLCAxMTAsIDEzMCwgMTcwLCA5NywgIDExNiwKKyAgICAxNDksIDg0LCAgMTAxLCAxMjcsIDcwLCAgODUsICAxMDYsIDU1LCAgNzAsICA4NSwgIDM5LCAgNTMsICA1OSwgIDE2LCAgMzAsCisgICAgMTksICAwLCAgIDAsICAgMjE3LCAxMjMsIDEzMSwgMTkyLCAxMDksIDExNiwgMTcxLCA5NiwgIDEwMywgMTQ5LCA4MywgIDg5LAorICAgIDEyNywgNzAsICA3NSwgIDEwNiwgNTUsICA2MCwgIDg1LCAgNDAsICA0NSwgIDU5LCAgMTYsICAyMywgIDE3LCAgMCwgICAwLAorICAgIDIxNywgMTIyLCAxMTQsIDE5MywgMTA5LCAxMDEsIDE3MiwgOTYsICA5MSwgIDE0OSwgODIsICA3NywgIDEyOCwgNjksICA2NCwKKyAgICAxMDYsIDU1LCAgNTAsICA4NCwgIDM5LCAgMzUsICA1OSwgIDE3LCAgMTQsICAxNywgIDAsICAgMCwgICAyMTgsIDEyMiwgOTgsCisgICAgMTk0LCAxMDgsIDg3LCAgMTcxLCA5NiwgIDc3LCAgMTQ5LCA4MiwgIDY1LCAgMTI3LCA2OSwgIDUyLCAgMTA2LCA1NSwgIDQwLAorICAgIDg0LCAgNDAsICAyNSwgIDU5LCAgMTgsICAzLCAgIDE1LCAgMCwgICAwLCAgIDIxOSwgMTIyLCA4MCwgIDE5MywgMTA4LCA3MCwKKyAgICAxNzIsIDk1LCAgNjEsICAxNDksIDgyLCAgNTEsICAxMjcsIDY5LCAgNDAsICAxMDYsIDU1LCAgMjgsICA4NCwgIDM5LCAgMTIsCisgICAgNTgsICAxNywgIDAsICAgMTMsICAwLCAgIDAsICAgMjE5LCAxMjEsIDU5LCAgMTk0LCAxMDgsIDUyLCAgMTcyLCA5NiwgIDQ0LAorICAgIDE0OSwgODIsICAzNSwgIDEyNywgNjgsICAyNCwgIDEwNiwgNTUsICAxMSwgIDg0LCAgNDAsICAwLCAgIDU3LCAgMTgsICAwLAorICAgIDEzLCAgMCwgICAwLCAgIDIxOSwgMTIxLCA0MCwgIDE5MywgMTA4LCAzMywgIDE3MiwgOTUsICAyNiwgIDE0OSwgODEsICAxOSwKKyAgICAxMjgsIDY4LCAgNiwgICAxMDYsIDU0LCAgMCwgICA4NCwgIDM5LCAgMCwgICA1NywgIDE4LCAgMCwgICAxMywgIDAsICAgMCwKKyAgICAyMTMsIDk5LCAgMTY1LCAxODksIDg3LCAgMTQ4LCAxNjksIDc2LCAgMTMyLCAxNDcsIDY0LCAgMTE1LCAxMjYsIDUyLCAgOTgsCisgICAgMTA2LCAzOSwgIDgxLCAgODUsICAyMywgIDYzLCAgNjAsICAwLCAgIDM5LCAgMTYsICAwLCAgIDAsICAgMjE0LCA5OCwgIDE0OSwKKyAgICAxOTEsIDg3LCAgMTMzLCAxNzAsIDc2LCAgMTE5LCAxNDgsIDY1LCAgMTAzLCAxMjcsIDUzLCAgODgsICAxMDYsIDM5LCAgNzIsCisgICAgODUsICAyNCwgIDU1LCAgNjAsICAwLCAgIDMyLCAgMTUsICAwLCAgIDAsICAgMjE1LCA5OSwgIDEzNiwgMTkxLCA4NywgIDEyMSwKKyAgICAxNzAsIDc3LCAgMTA4LCAxNDgsIDY1LCAgOTMsICAxMjYsIDUzLCAgNzksICAxMDYsIDQwLCAgNjQsICA4NSwgIDI0LCAgNDcsCisgICAgNTksICAwLCAgIDI1LCAgMTQsICAwLCAgIDAsICAgMjE1LCA5OSwgIDEyMSwgMTkyLCA4NywgIDEwOCwgMTcwLCA3NywgIDk2LAorICAgIDE0OCwgNjUsICA4MiwgIDEyNiwgNTMsICA2OSwgIDEwNiwgNDAsICA1NSwgIDg1LCAgMjUsICAzOSwgIDU5LCAgMCwgICAxOCwKKyAgICAxMywgIDAsICAgMCwgICAyMTYsIDk5LCAgMTA2LCAxOTEsIDg3LCAgOTUsICAxNzAsIDc2LCAgODMsICAxNDgsIDY1LCAgNzEsCisgICAgMTI2LCA1MywgIDU4LCAgMTA2LCA0MSwgIDQ1LCAgODUsICAyNiwgIDMwLCAgNTksICAwLCAgIDgsICAgMTEsICAwLCAgIDAsCisgICAgMjE2LCA5OCwgIDkxLCAgMTkyLCA4OCwgIDgyLCAgMTcwLCA3NywgIDcxLCAgMTQ4LCA2NSwgIDYwLCAgMTI3LCA1MywgIDQ4LAorICAgIDEwNSwgNDEsICAzNiwgIDgzLCAgMjYsICAyMSwgIDU4LCAgMSwgICAyLCAgIDExLCAgMCwgICAwLCAgIDIxNywgOTksICA3NSwKKyAgICAxOTIsIDg3LCAgNjYsICAxNzAsIDc2LCAgNTcsICAxNDgsIDY1LCAgNDcsICAxMjYsIDUzLCAgMzYsICAxMDUsIDQxLCAgMjQsCisgICAgODMsICAyNiwgIDgsICAgNTcsICAyLCAgIDAsICAgOSwgICAwLCAgIDAsICAgMjE3LCA5OCwgIDU3LCAgMTkyLCA4NywgIDQ5LAorICAgIDE3MSwgNzcsICA0MSwgIDE0NywgNjUsICAzMiwgIDEyNiwgNTMsICAyMSwgIDEwNSwgNDEsICA4LCAgIDg0LCAgMjcsICAwLAorICAgIDU3LCAgMywgICAwLCAgIDksICAgMCwgICAwLCAgIDIxNywgOTgsICA0MCwgIDE5MywgODcsICAzNCwgIDE3MSwgNzYsICAyNywKKyAgICAxNDgsIDY1LCAgMTksICAxMjYsIDUzLCAgNiwgICAxMDUsIDQxLCAgMCwgICA4MywgIDI3LCAgMCwgICA1NywgIDQsICAgMCwKKyAgICA5LCAgIDAsICAgMCwgICAyMTEsIDY3LCAgMTUyLCAxODksIDU4LCAgMTM2LCAxNjgsIDUwLCAgMTIyLCAxNDcsIDM5LCAgMTA1LAorICAgIDEyNywgMjgsICA4OSwgIDEwNiwgMTQsICA3NCwgIDg1LCAgMCwgICA1NiwgIDU5LCAgMCwgICAzMywgIDksICAgMCwgICAwLAorICAgIDIxMywgNjgsICAxMzgsIDE5MCwgNTksICAxMjMsIDE2OSwgNTEsICAxMDksIDE0OCwgNDAsICA5NSwgIDEyNiwgMzAsICA4MCwKKyAgICAxMDYsIDE2LCAgNjUsICA4NSwgIDAsICAgNDgsICA1OSwgIDAsICAgMjcsICA5LCAgIDAsICAgMCwgICAyMTQsIDY5LCAgMTI1LAorICAgIDE5MCwgNTksICAxMTEsIDE2OCwgNTEsICA5OSwgIDE0OCwgNDEsICA4NiwgIDEyNiwgMzEsICA3MiwgIDEwNiwgMTgsICA1OCwKKyAgICA4NSwgIDAsICAgNDEsICA1OSwgIDAsICAgMjAsICA3LCAgIDAsICAgMCwgICAyMTUsIDcwLCAgMTEyLCAxOTAsIDYxLCAgMTAwLAorICAgIDE2OSwgNTIsICA4OCwgIDE0NywgNDIsICA3NiwgIDEyNiwgMzIsICA2MywgIDEwNiwgMTksICA0OSwgIDg0LCAgMSwgICAzNCwKKyAgICA1OCwgIDAsICAgMTMsICA3LCAgIDAsICAgMCwgICAyMTQsIDcwLCAgOTksICAxOTAsIDYyLCAgODgsICAxNjksIDUzLCAgNzcsCisgICAgMTQ3LCA0MywgIDY1LCAgMTI1LCAzMiwgIDUzLCAgMTA2LCAyMCwgIDQwLCAgODQsICAzLCAgIDI2LCAgNTgsICAwLCAgIDQsCisgICAgNywgICAwLCAgIDAsICAgMjE0LCA3MSwgIDg2LCAgMTkwLCA2MSwgIDc1LCAgMTY5LCA1MywgIDY1LCAgMTQ2LCA0MywgIDU0LAorICAgIDEyNiwgMzMsICA0NCwgIDEwNSwgMjEsICAzMSwgIDgzLCAgNCwgICAxNywgIDU3LCAgMCwgICAwLCAgIDcsICAgMCwgICAwLAorICAgIDIxNSwgNzEsICA3MSwgIDE5MSwgNjIsICA2MiwgIDE2OSwgNTMsICA1MywgIDE0NywgNDQsICA0NCwgIDEyNiwgMzQsICAzMywKKyAgICAxMDUsIDIyLCAgMjAsICA4MywgIDUsICAgNCwgICA1NywgIDAsICAgMCwgICA3LCAgIDAsICAgMCwgICAyMTUsIDcxLCAgNTQsCisgICAgMTkxLCA2MiwgIDQ3LCAgMTY5LCA1NCwgIDM5LCAgMTQ3LCA0NCwgIDMwLCAgMTI2LCAzNSwgIDIwLCAgMTA1LCAyMywgIDYsCisgICAgODMsICA2LCAgIDAsICAgNTYsICAwLCAgIDAsICAgNSwgICAwLCAgIDAsICAgMjE1LCA3MSwgIDQxLCAgMTkxLCA2MywgIDM0LAorICAgIDE3MCwgNTQsICAyNywgIDE0NywgNDUsICAxNywgIDEyNiwgMzUsICA2LCAgIDEwNSwgMjMsICAwLCAgIDgzLCAgOCwgICAwLAorICAgIDU2LCAgMCwgICAwLCAgIDUsICAgMCwgICAwLCAgIDIxMCwgMTMsICAxNDAsIDE4OSwgMSwgICAxMjUsIDE2NywgMCwgICAxMTAsCisgICAgMTQ2LCAwLCAgIDk2LCAgMTI2LCAwLCAgIDgxLCAgMTA2LCAwLCAgIDY3LCAgODUsICAwLCAgIDUxLCAgNTksICAwLCAgIDI4LAorICAgIDQsICAgMCwgICAwLCAgIDIxMiwgMTgsICAxMjYsIDE5MCwgNywgICAxMTMsIDE2OCwgMCwgICAxMDAsIDE0NiwgMCwgICA4NiwKKyAgICAxMjYsIDAsICAgNzMsICAxMDYsIDAsICAgNTksICA4NCwgIDAsICAgNDMsICA1OSwgIDAsICAgMjIsICA0LCAgIDAsICAgMCwKKyAgICAyMTIsIDIxLCAgMTE1LCAxOTAsIDEzLCAgMTAzLCAxNjgsIDMsICAgOTEsICAxNDYsIDAsICAgNzgsICAxMjUsIDAsICAgNjUsCisgICAgMTA1LCAwLCAgIDUyLCAgODQsICAwLCAgIDM2LCAgNTgsICAwLCAgIDE2LCAgNCwgICAwLCAgIDAsICAgMjEzLCAyNCwgIDEwMywKKyAgICAxODksIDE5LCAgOTEsICAxNjgsIDksICAgODIsICAxNDYsIDAsICAgNjksICAxMjUsIDAsICAgNTcsICAxMDUsIDAsICAgNDQsCisgICAgODQsICAwLCAgIDI5LCAgNTgsICAwLCAgIDcsICAgNCwgICAwLCAgIDAsICAgMjEzLCAyNywgIDkyLCAgMTg4LCAyMSwgIDgxLAorICAgIDE2OCwgMTQsICA3MSwgIDE0NiwgMSwgICA1OSwgIDEyNSwgMCwgICA0OCwgIDEwNSwgMCwgICAzNiwgIDg0LCAgMCwgICAyMSwKKyAgICA1OCwgIDAsICAgNCwgICA0LCAgIDAsICAgMCwgICAyMTMsIDMwLCAgODAsICAxODksIDIyLCAgNjksICAxNjgsIDE3LCAgNjEsCisgICAgMTQ2LCA1LCAgIDUwLCAgMTI1LCAwLCAgIDM5LCAgMTA0LCAwLCAgIDI3LCAgODMsICAwLCAgIDEyLCAgNTcsICAwLCAgIDAsCisgICAgNCwgICAwLCAgIDAsICAgMjE0LCAzMCwgIDY3LCAgMTg5LCAyNSwgIDU3LCAgMTY4LCAyMCwgIDUwLCAgMTQ2LCA5LCAgIDQwLAorICAgIDEyNSwgMCwgICAyOSwgIDEwNCwgMCwgICAxNywgIDgzLCAgMCwgICAyLCAgIDU2LCAgMCwgICAwLCAgIDQsICAgMCwgICAwLAorICAgIDIxNCwgMzIsICA1MywgIDE4OSwgMjcsICA0NCwgIDE2OSwgMjAsICAzOCwgIDE0NiwgMTMsICAyOCwgIDEyNCwgMiwgICAxNywKKyAgICAxMDQsIDAsICAgNCwgICA4MywgIDAsICAgMCwgICA1NiwgIDAsICAgMCwgICA0LCAgIDAsICAgMCwgICAyMTQsIDMzLCAgNDEsCisgICAgMTkwLCAyNywgIDMzLCAgMTY4LCAyMywgIDI3LCAgMTQ2LCAxMywgIDE4LCAgMTI1LCAzLCAgIDUsICAgMTA1LCAwLCAgIDAsCisgICAgODMsICAwLCAgIDAsICAgNTYsICAwLCAgIDAsICAgNCwgICAwLCAgIDAsICAgMTg1LCAyMjksIDI1MCwgMTY0LCAyMDQsIDIyMywKKyAgICAxNDYsIDE4MiwgMTk5LCAxMjcsIDE1OCwgMTc0LCAxMDgsIDEzNiwgMTQ5LCA4OSwgIDExMywgMTI1LCA3MCwgIDkwLCAgMTAwLAorICAgIDQ2LCAgNjIsICA3MSwgIDEwLCAgMjUsICAzMywgIDE4OSwgMjI3LCAyMjUsIDE2OCwgMjAyLCAyMDEsIDE0OCwgMTgxLCAxNzksCisgICAgMTI5LCAxNTcsIDE1NiwgMTA5LCAxMzUsIDEzNCwgOTAsICAxMTMsIDExMywgNzAsICA4OSwgIDkwLCAgNDYsICA2MiwgIDYyLAorICAgIDgsICAgMjQsICAyNSwgIDE5MiwgMjI2LCAyMDIsIDE3MCwgMjAyLCAxODIsIDE1MSwgMTc5LCAxNjIsIDEzMCwgMTU2LCAxNDEsCisgICAgMTEwLCAxMzMsIDEyMSwgOTEsICAxMTIsIDEwMSwgNzEsICA4OSwgIDgwLCAgNDYsICA2MSwgIDU0LCAgNywgICAyNCwgIDE5LAorICAgIDE5NCwgMjI0LCAxNzksIDE3MywgMjAwLCAxNjAsIDE1MywgMTc4LCAxNDQsIDEzMiwgMTU1LCAxMjUsIDExMiwgMTMzLCAxMDcsCisgICAgOTIsICAxMTEsIDg5LCAgNzEsICA4OCwgIDY5LCAgNDYsICA2MSwgIDQ1LCAgNiwgICAyMywgIDEwLCAgMTk2LCAyMjMsIDE1NSwKKyAgICAxNzQsIDE5OCwgMTM5LCAxNTQsIDE3NiwgMTI0LCAxMzIsIDE1MywgMTA3LCAxMTMsIDEzMSwgOTEsICA5MiwgIDExMCwgNzUsCisgICAgNzIsICA4NywgIDU4LCAgNDcsICA2MCwgIDM3LCAgNCwgICAyMywgIDAsICAgMTk4LCAyMjEsIDEzMSwgMTc1LCAxOTcsIDExNywKKyAgICAxNTUsIDE3NSwgMTA1LCAxMzMsIDE1MiwgOTEsICAxMTMsIDEzMCwgNzYsICA5MiwgIDEwOSwgNjMsICA3MiwgIDg2LCAgNDcsCisgICAgNDYsICA2MCwgIDI2LCAgMywgICAyMywgIDAsICAgMjAwLCAyMjAsIDEwNCwgMTc2LCAxOTYsIDk0LCAgMTU2LCAxNzUsIDg0LAorICAgIDEzNCwgMTUxLCA3MiwgIDExMywgMTI5LCA1OSwgIDkzLCAgMTA4LCA0NywgIDcyLCAgODUsICAzMywgIDQ2LCAgNTksICAxMywKKyAgICAwLCAgIDIzLCAgMCwgICAyMDEsIDIxOSwgNzMsICAxNzksIDE5NSwgNjUsICAxNTcsIDE3MywgNTcsICAxMzUsIDE1MCwgNDgsCisgICAgMTE0LCAxMjksIDM5LCAgOTQsICAxMDgsIDI4LCAgNzIsICA4NSwgIDE1LCAgNDcsICA1OSwgIDAsICAgMCwgICAyMiwgIDAsCisgICAgMjAzLCAyMTksIDQyLCAgMTc4LCAxOTUsIDM3LCAgMTU3LCAxNzMsIDMyLCAgMTM1LCAxNTAsIDI2LCAgMTE0LCAxMjgsIDE2LAorICAgIDk0LCAgMTA3LCA2LCAgIDczLCAgODUsICAwLCAgIDQ2LCAgNTgsICAwLCAgIDAsICAgMjIsICAwLCAgIDE4NiwgMjA1LCAyMzMsCisgICAgMTY1LCAxODMsIDIwOSwgMTQ4LCAxNjMsIDE4NywgMTI4LCAxNDIsIDE2MywgMTA5LCAxMjEsIDE0MCwgOTEsICAxMDEsIDExOCwKKyAgICA3MSwgIDgwLCAgOTQsICA0OCwgIDU0LCAgNjYsICAxMiwgIDE1LCAgMjcsICAxODksIDIwNCwgMjExLCAxNjksIDE4MiwgMTg5LAorICAgIDE1MSwgMTYzLCAxNjksIDEzMSwgMTQxLCAxNDcsIDExMSwgMTIxLCAxMjYsIDkyLCAgMTAxLCAxMDUsIDcyLCAgNzksICA4NCwKKyAgICA0OCwgIDU0LCAgNTgsICAxMSwgIDE1LCAgMTksICAxOTIsIDIwMiwgMTkwLCAxNzEsIDE4MSwgMTcwLCAxNTIsIDE2MSwgMTUyLAorICAgIDEzMSwgMTQxLCAxMzMsIDExMiwgMTIwLCAxMTMsIDkzLCAgMTAwLCA5NCwgIDcyLCAgNzksICA3NCwgIDQ4LCAgNTMsICA1MCwKKyAgICAxMCwgIDE1LCAgMTEsICAxOTUsIDIwMSwgMTY5LCAxNzIsIDE3OSwgMTUxLCAxNTMsIDE2MCwgMTM1LCAxMzIsIDEzOSwgMTE3LAorICAgIDExMywgMTE5LCAxMDAsIDkzLCAgOTksICA4MiwgIDcyLCAgNzgsICA2NCwgIDQ4LCAgNTMsICA0MSwgIDksICAgMTQsICAzLAorICAgIDE5NSwgMjAwLCAxNDYsIDE3NCwgMTc5LCAxMzEsIDE1NCwgMTU5LCAxMTcsIDEzMywgMTM4LCAxMDEsIDExMywgMTE4LCA4NiwKKyAgICA5MywgIDk4LCAgNzAsICA3MywgIDc3LCAgNTMsICA0OCwgIDUyLCAgMzIsICA4LCAgIDE1LCAgMCwgICAxOTgsIDE5OSwgMTI1LAorICAgIDE3NSwgMTc3LCAxMTEsIDE1NSwgMTU4LCAxMDAsIDEzMywgMTM3LCA4NSwgIDExMywgMTE3LCA3MSwgIDkzLCAgOTcsICA1NywKKyAgICA3MiwgIDc3LCAgNDIsICA0NywgIDUyLCAgMjIsICA1LCAgIDE0LCAgMCwgICAxOTksIDE5OCwgMTAxLCAxNzYsIDE3NywgODksCisgICAgMTU1LCAxNTcsIDc5LCAgMTM0LCAxMzYsIDY4LCAgMTEzLCAxMTYsIDU2LCAgOTQsICA5NywgIDQ0LCAgNzMsICA3NiwgIDMwLAorICAgIDQ3LCAgNTIsICAxMCwgIDIsICAgMTUsICAwLCAgIDIwMCwgMTk3LCA3MiwgIDE3OCwgMTc2LCA2MywgIDE1NywgMTU2LCA1NiwKKyAgICAxMzUsIDEzNiwgNDYsICAxMTQsIDExNiwgMzcsICA5NCwgIDk2LCAgMjYsICA3MywgIDc2LCAgMTEsICA0NywgIDUxLCAgMCwKKyAgICAwLCAgIDE0LCAgMCwgICAyMDEsIDE5NywgNDUsICAxNzcsIDE3NSwgMzgsICAxNTYsIDE1NSwgMzEsICAxMzUsIDEzNSwgMjUsCisgICAgMTE0LCAxMTUsIDE3LCAgOTQsICA5NiwgIDUsICAgNzMsICA3NSwgIDAsICAgNDYsICA1MSwgIDAsICAgMCwgICAxNCwgIDAsCisgICAgMTg3LCAxODMsIDIxOCwgMTY3LCAxNjUsIDE5NywgMTQ5LCAxNDcsIDE3NiwgMTI5LCAxMjcsIDE1MywgMTExLCAxMDksIDEzMiwKKyAgICA5MiwgIDkwLCAgMTExLCA3MywgIDcwLCAgODksICA0OSwgIDQ2LCAgNjIsICAxNSwgIDQsICAgMjIsICAxOTAsIDE4MywgMTk3LAorICAgIDE3MCwgMTY0LCAxNzcsIDE1MSwgMTQ2LCAxNTksIDEzMCwgMTI3LCAxMzksIDExMiwgMTA5LCAxMTksIDkzLCAgOTAsICA5OSwKKyAgICA3MiwgIDcwLCAgNzgsICA0OSwgIDQ1LCAgNTMsICAxNCwgIDQsICAgMTUsICAxOTIsIDE4MiwgMTc5LCAxNzEsIDE2MywgMTYxLAorICAgIDE1MywgMTQ1LCAxNDQsIDEzMiwgMTI2LCAxMjUsIDExMywgMTA4LCAxMDcsIDkzLCAgODksICA4OCwgIDczLCAgNzAsICA2OSwKKyAgICA0OSwgIDQ1LCAgNDUsICAxMywgIDUsICAgNiwgICAxOTUsIDE4MSwgMTU5LCAxNzIsIDE2MiwgMTQyLCAxNTIsIDE0NSwgMTI3LAorICAgIDEzMiwgMTI1LCAxMTEsIDExMywgMTA3LCA5NCwgIDkzLCAgODgsICA3NywgIDczLCAgNjksICA1OSwgIDQ4LCAgNDUsICAzNywKKyAgICAxMSwgIDUsICAgMCwgICAxOTUsIDE4MCwgMTM5LCAxNzMsIDE2MSwgMTI0LCAxNTMsIDE0MywgMTEwLCAxMzMsIDEyNSwgOTYsCisgICAgMTEzLCAxMDYsIDgxLCAgOTQsICA4OCwgIDY2LCAgNzMsICA2OCwgIDQ5LCAgNDksICA0NCwgIDI4LCAgOSwgICA2LCAgIDAsCisgICAgMTk2LCAxNzksIDExOCwgMTc0LCAxNjAsIDEwNiwgMTU0LCAxNDIsIDk0LCAgMTMzLCAxMjQsIDgxLCAgMTEzLCAxMDUsIDY4LAorICAgIDk0LCAgODcsICA1NCwgIDczLCAgNjgsICAzOSwgIDQ4LCAgNDQsICAxOCwgIDUsICAgNSwgICAwLCAgIDE5NywgMTc4LCA5NiwKKyAgICAxNzYsIDE1OSwgODYsICAxNTUsIDE0MSwgNzUsICAxMzQsIDEyMywgNjQsICAxMTQsIDEwNSwgNTMsICA5NCwgIDg3LCAgNDAsCisgICAgNzMsICA2OCwgIDI2LCAgNDgsICA0NCwgIDUsICAgMiwgICA2LCAgIDAsICAgMTk5LCAxNzgsIDcwLCAgMTc2LCAxNTgsIDYyLAorICAgIDE1NiwgMTQxLCA1NCwgIDEzNCwgMTIyLCA0NCwgIDExNCwgMTA0LCAzNSwgIDk0LCAgODYsICAyMywgIDczLCAgNjcsICA4LAorICAgIDQ3LCAgNDQsICAwLCAgIDIsICAgNiwgICAwLCAgIDE5OSwgMTc3LCA0NSwgIDE3OCwgMTU4LCA0MCwgIDE1NiwgMTQwLCAzMiwKKyAgICAxMzUsIDEyMiwgMjYsICAxMTQsIDEwNCwgMTYsICA5NCwgIDg2LCAgNCwgICA3MywgIDY3LCAgMCwgICA0NywgIDQ0LCAgMCwKKyAgICAwLCAgIDcsICAgMCwgICAxODgsIDE2MSwgMjA0LCAxNjgsIDE0NCwgMTgzLCAxNDksIDEyOSwgMTY0LCAxMzAsIDExMiwgMTQ0LAorICAgIDExMiwgOTUsICAxMjMsIDkzLCAgNzgsICAxMDMsIDc0LCAgNjAsICA4MSwgIDUwLCAgMzYsICA1NiwgIDE2LCAgMCwgICAxNiwKKyAgICAxOTAsIDE2MCwgMTg1LCAxNzAsIDE0NCwgMTY1LCAxNTEsIDEyOCwgMTQ4LCAxMzIsIDExMSwgMTMwLCAxMTIsIDk1LCAgMTEwLAorICAgIDkzLCAgNzgsICA5MiwgIDc0LCAgNTksICA3MiwgIDUwLCAgMzYsICA0OCwgIDE2LCAgMCwgICA4LCAgIDE5MiwgMTYwLCAxNjcsCisgICAgMTcxLCAxNDMsIDE1MCwgMTUzLCAxMjgsIDEzNCwgMTMyLCAxMTEsIDExNywgMTEyLCA5NCwgIDEwMCwgOTQsICA3NywgIDgyLAorICAgIDc0LCAgNTksICA2MywgIDUwLCAgMzYsICA0MCwgIDE0LCAgMCwgICAwLCAgIDE5MywgMTU5LCAxNDksIDE3MiwgMTQzLCAxMzQsCisgICAgMTUzLCAxMjcsIDExOSwgMTMzLCAxMTAsIDEwMywgMTEzLCA5NCwgIDg3LCAgOTMsICA3NywgIDcyLCAgNzMsICA1OSwgIDU0LAorICAgIDUwLCAgMzYsICAzMiwgIDEyLCAgMCwgICAwLCAgIDE5NSwgMTU5LCAxMzEsIDE3MywgMTQyLCAxMTcsIDE1MywgMTI3LCAxMDQsCisgICAgMTMyLCAxMTAsIDkwLCAgMTEzLCA5MywgIDc2LCAgOTMsICA3NiwgIDYxLCAgNzQsICA1OSwgIDQ1LCAgNDksICAzNiwgIDIzLAorICAgIDksICAgMCwgICAwLCAgIDE5NiwgMTU4LCAxMTMsIDE3NCwgMTQxLCAxMDEsIDE1NSwgMTI2LCA4OSwgIDEzMywgMTA5LCA3NiwKKyAgICAxMTMsIDkzLCAgNjQsICA5NCwgIDc2LCAgNTEsICA3NCwgIDU4LCAgMzUsICA0OSwgIDM2LCAgMTQsICA2LCAgIDAsICAgMCwKKyAgICAxOTcsIDE1NywgOTIsICAxNzQsIDE0MSwgODAsICAxNTQsIDEyNSwgNzEsICAxMzQsIDEwOCwgNjAsICAxMTQsIDkyLCAgNTAsCisgICAgOTQsICA3NSwgIDM3LCAgNzMsICA1OCwgIDIyLCAgNDgsICAzNiwgIDEsICAgNSwgICAwLCAgIDAsICAgMTk3LCAxNTcsIDY4LAorICAgIDE3NSwgMTQwLCA1OSwgIDE1NSwgMTI0LCA1MSwgIDEzNCwgMTA4LCA0MSwgIDExMywgOTEsICAzMiwgIDk0LCAgNzUsICAyMSwKKyAgICA3MywgIDU3LCAgNSwgICA0OCwgIDM1LCAgMCwgICA1LCAgIDAsICAgMCwgICAxOTgsIDE1NiwgNDYsICAxNzYsIDE0MCwgNDAsCisgICAgMTU1LCAxMjQsIDMyLCAgMTM0LCAxMDcsIDI0LCAgMTE0LCA5MSwgIDE0LCAgOTQsICA3NSwgIDIsICAgNzMsICA1NywgIDAsCisgICAgNDgsICAzNiwgIDAsICAgMywgICAwLCAgIDAsICAgMTg5LCAxNDAsIDE5MSwgMTY4LCAxMjYsIDE3MiwgMTUwLCAxMTIsIDE1NCwKKyAgICAxMzEsIDk3LCAgMTM0LCAxMTIsIDgyLCAgMTE1LCA5NCwgIDY2LCAgOTYsICA3NCwgIDQ5LCAgNzUsICA1MSwgIDI1LCAgNTAsCisgICAgMTIsICAwLCAgIDEwLCAgMTkxLCAxMzksIDE3MywgMTcwLCAxMjUsIDE1NCwgMTUyLCAxMTEsIDEzOCwgMTMyLCA5NiwgIDEyMSwKKyAgICAxMTMsIDgxLCAgMTAzLCA5NCwgIDY2LCAgODUsICA3NCwgIDQ4LCAgNjYsICA1MCwgIDI2LCAgNDIsICAxMiwgIDAsICAgMSwKKyAgICAxOTIsIDEzOSwgMTU3LCAxNzEsIDEyNSwgMTQwLCAxNTIsIDExMSwgMTI1LCAxMzIsIDk2LCAgMTA5LCAxMTMsIDgxLCAgOTIsCisgICAgOTQsICA2NSwgIDc2LCAgNzQsICA0OCwgIDU4LCAgNTAsICAyNiwgIDM1LCAgOSwgICAwLCAgIDAsICAgMTkzLCAxMzksIDE0MCwKKyAgICAxNzIsIDEyNCwgMTI1LCAxNTMsIDExMCwgMTEyLCAxMzMsIDk1LCAgOTYsICAxMTMsIDgwLCAgODIsICA5NCwgIDY1LCAgNjYsCisgICAgNzQsICA0OSwgIDUwLCAgNTAsICAyNiwgIDI4LCAgNywgICAwLCAgIDAsICAgMTk0LCAxMzgsIDEyMywgMTcyLCAxMjMsIDEwOSwKKyAgICAxNTMsIDExMCwgOTcsICAxMzMsIDk1LCAgODQsICAxMTMsIDgwLCAgNzAsICA5NCwgIDY1LCAgNTYsICA3NCwgIDQ4LCAgNDAsCisgICAgNTAsICAyNiwgIDIwLCAgNiwgICAwLCAgIDAsICAgMTk0LCAxMzgsIDEwNSwgMTczLCAxMjMsIDk0LCAgMTUzLCAxMDksIDgzLAorICAgIDEzMywgOTQsICA3MCwgIDExMiwgNzksICA1OSwgIDk0LCAgNjQsICA0NiwgIDc0LCAgNDgsICAzMSwgIDUwLCAgMjYsICA5LAorICAgIDQsICAgMCwgICAwLCAgIDE5NiwgMTM4LCA4NywgIDE3NCwgMTIyLCA3NywgIDE1MywgMTA5LCA2NywgIDEzMywgOTMsICA1NiwKKyAgICAxMTMsIDc5LCAgNDYsICA5NCwgIDY0LCAgMzQsICA3MywgIDQ4LCAgMTgsICA0OSwgIDI3LCAgMCwgICA0LCAgIDAsICAgMCwKKyAgICAxOTYsIDEzNywgNjUsICAxNzQsIDEyMiwgNTcsICAxNTQsIDEwOCwgNDksICAxMzMsIDkzLCAgMzksICAxMTMsIDc5LCAgMjksCisgICAgOTQsICA2NCwgIDE4LCAgNzQsICA0OCwgIDMsICAgNDksICAyNywgIDAsICAgMiwgICAwLCAgIDAsICAgMTk3LCAxMzcsIDQ3LAorICAgIDE3NSwgMTIyLCA0MCwgIDE1NSwgMTA4LCAzMiwgIDEzMywgOTMsICAyMywgIDExNCwgNzksICAxNCwgIDk0LCAgNjQsICAxLAorICAgIDczLCAgNDgsICAwLCAgIDQ4LCAgMjcsICAwLCAgIDIsICAgMCwgICAwLCAgIDE4OSwgMTE5LCAxNzcsIDE2OCwgMTA2LCAxNTksCisgICAgMTUwLCA5NCwgIDE0MiwgMTMxLCA4MSwgIDEyNCwgMTEzLCA2NywgIDEwNywgOTQsICA1MywgIDg5LCAgNzQsICAzNywgIDY5LAorICAgIDUxLCAgMTEsICA0NSwgIDYsICAgMCwgICAzLCAgIDE5MSwgMTE5LCAxNjEsIDE3MCwgMTA2LCAxNDQsIDE1MiwgOTQsICAxMjksCisgICAgMTMyLCA4MSwgIDExMiwgMTEzLCA2NywgIDk2LCAgOTQsICA1MywgIDc5LCAgNzQsICAzNywgIDYxLCAgNTEsICAxMywgIDM4LAorICAgIDYsICAgMCwgICAwLCAgIDE5MiwgMTE5LCAxNDYsIDE3MCwgMTA2LCAxMzEsIDE1MiwgOTQsICAxMTcsIDEzMiwgODAsICAxMDEsCisgICAgMTEyLCA2NywgIDg1LCAgOTQsICA1MywgIDcwLCAgNzQsICAzNywgIDUzLCAgNTAsICAxNCwgIDMxLCAgNCwgICAwLCAgIDAsCisgICAgMTkyLCAxMTksIDEzMSwgMTcxLCAxMDYsIDExNywgMTUzLCA5NCwgIDEwNSwgMTMyLCA4MCwgIDg5LCAgMTEzLCA2NywgIDc1LAorICAgIDk0LCAgNTQsICA2MSwgIDc0LCAgMzgsICA0NSwgIDUxLCAgMTQsICAyMywgIDMsICAgMCwgICAwLCAgIDE5MywgMTE4LCAxMTQsCisgICAgMTcxLCAxMDYsIDEwMiwgMTUzLCA5MywgIDkwLCAgMTMyLCA4MCwgIDc4LCAgMTEzLCA2NywgIDY1LCAgOTQsICA1MywgIDUyLAorICAgIDc0LCAgMzcsICAzNiwgIDUwLCAgMTUsICAxNiwgIDEsICAgMCwgICAwLCAgIDE5NCwgMTE4LCA5OSwgIDE3MiwgMTA1LCA4OSwKKyAgICAxNTMsIDkzLCAgNzgsICAxMzIsIDgwLCAgNjYsICAxMTMsIDY3LCAgNTQsICA5NCwgIDUzLCAgNDIsICA3NCwgIDM4LCAgMjcsCisgICAgNTAsICAxNiwgIDUsICAgMSwgICAwLCAgIDAsICAgMTk0LCAxMTgsIDgyLCAgMTczLCAxMDUsIDcyLCAgMTUzLCA5MywgIDYzLAorICAgIDEzMiwgNzksICA1MywgIDExMywgNjcsICA0MiwgIDk0LCAgNTMsICAzMCwgIDc0LCAgMzgsICAxNSwgIDQ5LCAgMTYsICAwLAorICAgIDAsICAgMCwgICAwLCAgIDE5NSwgMTE3LCA2MywgIDE3MywgMTA1LCA1NSwgIDE1NCwgOTMsICA0NywgIDEzMywgNzksICAzNywKKyAgICAxMTMsIDY2LCAgMjcsICA5NCwgIDUzLCAgMTUsICA3MywgIDM4LCAgMCwgICA0OCwgIDE2LCAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAxOTUsIDExNywgNDYsICAxNzMsIDEwNCwgMzksICAxNTQsIDkyLCAgMzIsICAxMzMsIDc5LCAgMjIsICAxMTMsIDY2LCAgMTMsCisgICAgOTQsICA1MywgIDAsICAgNzMsICAzOCwgIDAsICAgNDgsICAxNywgIDAsICAgMCwgICAwLCAgIDAsICAgMTg5LCA5NiwgIDE2NiwKKyAgICAxNjgsIDg1LCAgMTQ3LCAxNTAsIDc0LCAgMTMyLCAxMzEsIDYyLCAgMTE1LCAxMTMsIDUxLCAgOTksICA5NCwgIDM4LCAgODIsCisgICAgNzQsICAyMSwgIDYzLCAgNTEsICAwLCAgIDQwLCAgMSwgICAwLCAgIDAsICAgMTkwLCA5NiwgIDE1MCwgMTcwLCA4NSwgIDEzMywKKyAgICAxNTIsIDc1LCAgMTE5LCAxMzIsIDYzLCAgMTA0LCAxMTMsIDUxLCAgODgsICA5NCwgIDM4LCAgNzIsICA3NSwgIDIyLCAgNTUsCisgICAgNTEsICAwLCAgIDMzLCAgMSwgICAwLCAgIDAsICAgMTkyLCA5NiwgIDEzNywgMTcwLCA4NSwgIDEyMSwgMTUyLCA3NCwgIDEwOCwKKyAgICAxMzIsIDY0LCAgOTQsICAxMTMsIDUyLCAgNzksICA5NCwgIDM5LCAgNjQsICA3NCwgIDIzLCAgNDgsICA1MCwgIDAsICAgMjYsCisgICAgMCwgICAwLCAgIDAsICAgMTkyLCA5NiwgIDEyMiwgMTcxLCA4NiwgIDEwOSwgMTUyLCA3NSwgIDk2LCAgMTMyLCA2MywgIDgzLAorICAgIDExMywgNTIsICA2OSwgIDk0LCAgMzksICA1NiwgIDc0LCAgMjQsICA0MSwgIDUwLCAgMCwgICAxOSwgIDAsICAgMCwgICAwLAorICAgIDE5MywgOTYsICAxMDcsIDE3MSwgODUsICA5NiwgIDE1MiwgNzUsICA4NCwgIDEzMiwgNjQsICA3MiwgIDExMywgNTIsICA2MCwKKyAgICA5NCwgIDM5LCAgNDcsICA3NCwgIDI0LCAgMzIsICA1MCwgIDEsICAgMTAsICAwLCAgIDAsICAgMCwgICAxOTMsIDk2LCAgOTMsCisgICAgMTcyLCA4NSwgIDgyLCAgMTUyLCA3NSwgIDcyLCAgMTMzLCA2MywgIDYxLCAgMTEzLCA1MSwgIDQ5LCAgOTQsICAzOSwgIDM3LAorICAgIDczLCAgMjUsICAyMywgIDQ5LCAgMiwgICAyLCAgIDAsICAgMCwgICAwLCAgIDE5NCwgOTYsICA3OCwgIDE3MiwgODUsICA2OCwKKyAgICAxNTIsIDc1LCAgNTksICAxMzIsIDYzLCAgNDksICAxMTMsIDUyLCAgMzksICA5NCwgIDQwLCAgMjYsICA3MywgIDI1LCAgMTEsCisgICAgNDgsICAzLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTk0LCA5NiwgIDYwLCAgMTczLCA4NSwgIDUyLCAgMTUzLCA3NSwgIDQ0LAorICAgIDEzMiwgNjQsICAzNSwgIDExMiwgNTIsICAyNSwgIDk0LCAgNDAsICAxMiwgIDczLCAgMjYsICAwLCAgIDQ4LCAgNCwgICAwLAorICAgIDAsICAgMCwgICAwLCAgIDE5NSwgOTYsICA0NiwgIDE3MywgODUsICAzOCwgIDE1NCwgNzQsICAzMSwgIDEzMywgNjMsICAyMiwKKyAgICAxMTMsIDUyLCAgMTEsICA5MywgIDQwLCAgMCwgICA3MywgIDI2LCAgMCwgICA0NywgIDUsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAxODgsIDY3LCAgMTUzLCAxNjgsIDU4LCAgMTM3LCAxNTEsIDQ5LCAgMTIyLCAxMzEsIDM5LCAgMTA2LCAxMTMsIDI4LCAgOTAsCisgICAgOTQsICAxMywgIDc1LCAgNzUsICAwLCAgIDU3LCAgNTEsICAwLCAgIDM1LCAgMCwgICAwLCAgIDAsICAgMTkwLCA2OCwgIDEzOCwKKyAgICAxNzAsIDU5LCAgMTIzLCAxNTIsIDUwLCAgMTEwLCAxMzIsIDQxLCAgOTYsICAxMTMsIDI5LCAgODAsICA5NCwgIDE2LCAgNjYsCisgICAgNzUsICAwLCAgIDQ5LCAgNTAsICAwLCAgIDI3LCAgMCwgICAwLCAgIDAsICAgMTkxLCA2OSwgIDEyNiwgMTcwLCA1OSwgIDExMiwKKyAgICAxNTEsIDUyLCAgMTAwLCAxMzIsIDQyLCAgODYsICAxMTMsIDMwLCAgNzMsICA5NSwgIDE3LCAgNTgsICA3NSwgIDAsICAgNDIsCisgICAgNTAsICAwLCAgIDIxLCAgMCwgICAwLCAgIDAsICAgMTkyLCA3MCwgIDExMywgMTcwLCA2MSwgIDEwMCwgMTUxLCA1MiwgIDg5LAorICAgIDEzMiwgNDIsICA3NywgIDExMywgMzEsICA2NCwgIDk0LCAgMTksICA1MCwgIDc0LCAgMSwgICAzNSwgIDUwLCAgMCwgICAxNCwKKyAgICAwLCAgIDAsICAgMCwgICAxOTIsIDcwLCAgMTAwLCAxNzAsIDYyLCAgODksICAxNTEsIDUzLCAgNzcsICAxMzEsIDQzLCAgNjYsCisgICAgMTEyLCAzMiwgIDU0LCAgOTQsICAyMCwgIDQyLCAgNzQsICAyLCAgIDI3LCAgNDksICAwLCAgIDUsICAgMCwgICAwLCAgIDAsCisgICAgMTkyLCA3MSwgIDg3LCAgMTcxLCA2MSwgIDc3LCAgMTUyLCA1MywgIDY3LCAgMTMxLCA0NCwgIDU3LCAgMTEyLCAzMywgIDQ1LAorICAgIDk0LCAgMjEsICAzMywgIDc0LCAgNCwgICAxOSwgIDQ5LCAgMCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDE5MywgNzEsICA3NCwKKyAgICAxNzEsIDYyLCAgNjQsICAxNTIsIDUzLCAgNTUsICAxMzIsIDQ0LCAgNDUsICAxMTMsIDM0LCAgMzQsICA5NCwgIDIyLCAgMjMsCisgICAgNzMsICA1LCAgIDcsICAgNDgsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTkzLCA3MCwgIDU4LCAgMTcyLCA2MiwgIDUwLAorICAgIDE1MiwgNTQsICA0MiwgIDEzMiwgNDQsICAzMiwgIDExMiwgMzUsICAyMiwgIDkzLCAgMjMsICAxMCwgIDczLCAgNiwgICAwLAorICAgIDQ3LCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDE5MywgNzAsICA0NSwgIDE3MiwgNjIsICAzOCwgIDE1MywgNTQsICAzMSwKKyAgICAxMzIsIDQ0LCAgMjEsICAxMTIsIDM1LCAgOSwgICA5NCwgIDIzLCAgMCwgICA3MywgIDcsICAgMCwgICA0NywgIDAsICAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAxODksIDI2LCAgMTQxLCAxNjksIDE1LCAgMTI2LCAxNTAsIDIsICAgMTEyLCAxMzEsIDAsICAgOTcsCisgICAgMTEzLCAwLCAgIDgyLCAgOTQsICAwLCAgIDY3LCAgNzUsICAwLCAgIDUxLCAgNTAsICAwLCAgIDI5LCAgMCwgICAwLCAgIDAsCisgICAgMTkwLCAyOCwgIDEyOCwgMTcwLCAxOCwgIDExNCwgMTUxLCA4LCAgIDEwMSwgMTMyLCAwLCAgIDg4LCAgMTEzLCAwLCAgIDc0LAorICAgIDk0LCAgMCwgICA2MCwgIDc1LCAgMCwgICA0NCwgIDUwLCAgMCwgICAyMywgIDAsICAgMCwgICAwLCAgIDE5MSwgMzAsICAxMTcsCisgICAgMTcwLCAyMywgIDEwNCwgMTUyLCAxMSwgIDkyLCAgMTMyLCAxLCAgIDc5LCAgMTEzLCAwLCAgIDY3LCAgOTUsICAwLCAgIDUzLAorICAgIDc1LCAgMCwgICAzNywgIDUwLCAgMCwgICAxNywgIDAsICAgMCwgICAwLCAgIDE5MSwgMzMsICAxMDUsIDE3MCwgMjYsICA5MywKKyAgICAxNTEsIDE4LCAgODMsICAxMzIsIDYsICAgNzAsICAxMTIsIDAsICAgNTgsICA5NCwgIDAsICAgNDUsICA3NSwgIDAsICAgMzAsCisgICAgNDksICAwLCAgIDgsICAgMCwgICAwLCAgIDAsICAgMTkxLCAzNCwgIDkzLCAgMTcwLCAyNywgIDgyLCAgMTUxLCAyMCwgIDcyLAorICAgIDEzMSwgOCwgICA2MSwgIDExMiwgMCwgICA0OSwgIDk0LCAgMCwgICAzOCwgIDc0LCAgMCwgICAyMywgIDQ5LCAgMCwgICA0LAorICAgIDAsICAgMCwgICAwLCAgIDE5MSwgMzYsICA4MiwgIDE3MCwgMjksICA3MSwgIDE1MSwgMjIsICA2MywgIDEzMSwgMTEsICA1MiwKKyAgICAxMTIsIDAsICAgNDEsICA5MywgIDAsICAgMjksICA3NCwgIDAsICAgMTQsICA0OCwgIDAsICAgMSwgICAwLCAgIDAsICAgMCwKKyAgICAxOTEsIDM4LCAgNjksICAxNzAsIDMxLCAgNjAsICAxNTEsIDI0LCAgNTEsICAxMzEsIDE0LCAgNDEsICAxMTIsIDEsICAgMzEsCisgICAgOTMsICAwLCAgIDE5LCAgNzMsICAwLCAgIDMsICAgNDgsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTkyLCAzNywgIDU2LAorICAgIDE3MSwgMzEsICA0NywgIDE1MiwgMjUsICA0MCwgIDEzMSwgMTcsICAzMCwgIDExMiwgNCwgICAxOSwgIDkzLCAgMCwgICA3LAorICAgIDczLCAgMCwgICAwLCAgIDQ3LCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDE5MiwgMzgsICA0NSwgIDE3MSwgMzMsICAzNiwKKyAgICAxNTIsIDI2LCAgMzAsICAxMzEsIDE4LCAgMjEsICAxMTEsIDcsICAgOSwgICA5MywgIDAsICAgMCwgICA3MywgIDAsICAgMCwKKyAgICA0NywgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxNDksIDIxOCwgMjQ4LCAxMzMsIDE5NCwgMjIyLCAxMTksIDE3MywgMTk4LAorICAgIDEwMiwgMTUxLCAxNzMsIDg2LCAgMTMwLCAxNDgsIDcwLCAgMTA4LCAxMjUsIDUzLCAgODUsICAxMDAsIDMyLCAgNTksICA3MSwKKyAgICAwLCAgIDIyLCAgMzMsICAxNTQsIDIxNiwgMjIzLCAxMzcsIDE5MywgMjAwLCAxMjIsIDE3MiwgMTc4LCAxMDYsIDE1MCwgMTU2LAorICAgIDg5LCAgMTI4LCAxMzMsIDczLCAgMTA3LCAxMTIsIDU0LCAgODUsICA4OSwgIDMxLCAgNTksICA2MywgIDAsICAgMjIsICAyNiwKKyAgICAxNTksIDIxNSwgMjAyLCAxNDEsIDE5MiwgMTgxLCAxMjYsIDE3MSwgMTYxLCAxMDgsIDE0OSwgMTQxLCA5MCwgIDEyOCwgMTIxLAorICAgIDc0LCAgMTA3LCAxMDAsIDU1LCAgODUsICA4MCwgIDMyLCAgNTgsICA1NSwgIDAsICAgMjIsICAxOSwgIDE2MSwgMjEzLCAxNzksCisgICAgMTQ0LCAxOTAsIDE2MCwgMTI2LCAxNzAsIDE0MywgMTA5LCAxNDgsIDEyNSwgOTIsICAxMjcsIDEwNywgNzQsICAxMDYsIDg5LAorICAgIDU2LCAgODQsICA2OSwgIDMyLCAgNTgsICA0NiwgIDAsICAgMjEsICAxMSwgIDE2MywgMjExLCAxNTYsIDE0NCwgMTg5LCAxMzksCisgICAgMTI5LCAxNjgsIDEyNSwgMTEwLCAxNDcsIDEwOCwgOTMsICAxMjYsIDkyLCAgNzUsICAxMDUsIDc2LCAgNTcsICA4MywgIDU4LAorICAgIDMzLCAgNTgsICAzNywgIDAsICAgMjEsICAxLCAgIDE2NywgMjExLCAxMzMsIDE0NywgMTg4LCAxMjAsIDEzMCwgMTY3LCAxMDUsCisgICAgMTEwLCAxNDUsIDkyLCAgOTMsICAxMjUsIDc4LCAgNzYsICAxMDQsIDY0LCAgNTgsICA4MywgIDQ4LCAgMzMsICA1NywgIDI3LAorICAgIDAsICAgMjEsICAwLCAgIDE2OSwgMjEwLCAxMDgsIDE0OSwgMTg3LCA5NiwgIDEzMSwgMTY2LCA4NiwgIDExMiwgMTQ0LCA3NCwKKyAgICA5NCwgIDEyNCwgNjIsICA3NywgIDEwMywgNDksICA1OCwgIDgyLCAgMzUsICAzMywgIDU3LCAgMTUsICAwLCAgIDIxLCAgMCwKKyAgICAxNzAsIDIwOSwgODAsICAxNTEsIDE4NiwgNzEsICAxMzMsIDE2NSwgNjIsICAxMTQsIDE0MywgNTIsICA5NSwgIDEyMywgNDIsCisgICAgNzcsICAxMDMsIDMyLCAgNTgsICA4MSwgIDE4LCAgMzMsICA1NiwgIDAsICAgMCwgICAyMSwgIDAsICAgMTczLCAyMDgsIDU1LAorICAgIDE1MiwgMTg2LCA0OSwgIDEzNCwgMTY1LCA0MSwgIDExNCwgMTQzLCAzNCwgIDk1LCAgMTIyLCAyNSwgIDc3LCAgMTAyLCAxNCwKKyAgICA1OCwgIDgxLCAgMCwgICAzMywgIDU2LCAgMCwgICAwLCAgIDIxLCAgMCwgICAxNTQsIDE5NSwgMjMyLCAxMzcsIDE3NCwgMjA3LAorICAgIDEyMiwgMTU2LCAxODUsIDEwNSwgMTM2LCAxNjMsIDg5LCAgMTE2LCAxNDAsIDczLCAgOTcsICAxMTcsIDU2LCAgNzYsICA5NCwKKyAgICAzNSwgIDUxLCAgNjYsICAwLCAgIDEzLCAgMjgsICAxNTgsIDE5NCwgMjA5LCAxNDEsIDE3NCwgMTg3LCAxMjUsIDE1NSwgMTY3LAorICAgIDEwOSwgMTM1LCAxNDYsIDkxLCAgMTE2LCAxMjUsIDc1LCAgOTYsICAxMDUsIDU3LCAgNzUsICA4MywgIDM1LCAgNTAsICA1NywKKyAgICAwLCAgIDEyLCAgMjEsICAxNjEsIDE5MywgMTg5LCAxNDQsIDE3MywgMTY5LCAxMjgsIDE1NCwgMTUxLCAxMTAsIDEzNCwgMTMyLAorICAgIDkzLCAgMTE1LCAxMTMsIDc3LCAgOTUsICA5NCwgIDU4LCAgNzUsICA3NCwgIDM1LCAgNTAsICA1MCwgIDAsICAgMTIsICAxMywKKyAgICAxNjQsIDE5MiwgMTY4LCAxNDUsIDE3MSwgMTUxLCAxMjksIDE1MywgMTM0LCAxMTEsIDEzMywgMTE3LCA5NCwgIDExNCwgMTAwLAorICAgIDc2LCAgOTUsICA4MiwgIDU4LCAgNzUsICA2NCwgIDM2LCAgNTAsICA0MiwgIDAsICAgMTIsICA1LCAgIDE2NSwgMTkxLCAxNDcsCisgICAgMTQ3LCAxNzAsIDEzMSwgMTMwLCAxNTIsIDExNywgMTEzLCAxMzIsIDEwMiwgOTUsICAxMTMsIDg2LCAgNzcsICA5NCwgIDcxLAorICAgIDU4LCAgNzQsICA1NCwgIDM1LCAgNTAsICAzMywgIDAsICAgMTMsICAwLCAgIDE2NywgMTg5LCAxMjYsIDE0OCwgMTY5LCAxMTMsCisgICAgMTMyLCAxNTEsIDEwMCwgMTEzLCAxMzEsIDg2LCAgOTYsICAxMTIsIDczLCAgNzcsICA5MywgIDU5LCAgNTksICA3MywgIDQzLAorICAgIDM1LCAgNDksICAyMywgIDAsICAgMTIsICAwLCAgIDE3MCwgMTg5LCAxMDQsIDE1MCwgMTY4LCA5MSwgIDEzMywgMTUwLCA4MSwKKyAgICAxMTQsIDEzMCwgNjksICA5NiwgIDExMSwgNTcsICA3OCwgIDkyLCAgNDYsICA1OSwgIDczLCAgMzEsICAzNSwgIDQ5LCAgMTEsCisgICAgMCwgICAxMywgIDAsICAgMTcxLCAxODgsIDc4LCAgMTUyLCAxNjgsIDY4LCAgMTM0LCAxNDksIDYwLCAgMTE1LCAxMzAsIDUwLAorICAgIDk2LCAgMTExLCA0MSwgIDc4LCAgOTIsICAyOSwgIDYwLCAgNzMsICAxNSwgIDM1LCAgNDksICAwLCAgIDAsICAgMTIsICAwLAorICAgIDE3MywgMTg3LCA1NSwgIDE1MywgMTY3LCA0NywgIDEzNCwgMTQ5LCAzOSwgIDExNSwgMTI5LCAzMywgIDk3LCAgMTEwLCAyNCwKKyAgICA3OSwgIDkyLCAgMTMsICA2MCwgIDcyLCAgMCwgICAzNSwgIDQ4LCAgMCwgICAwLCAgIDEyLCAgMCwgICAxNTcsIDE3NSwgMjE3LAorICAgIDEzOSwgMTU3LCAxOTYsIDEyNSwgMTQxLCAxNzUsIDEwOSwgMTIyLCAxNTMsIDkyLCAgMTA0LCAxMzIsIDc2LCAgODYsICAxMTAsCisgICAgNTksICA2NywgIDg4LCAgMzcsICA0MywgIDYxLCAgMSwgICAxLCAgIDIzLCAgMTYxLCAxNzQsIDE5NiwgMTQ0LCAxNTYsIDE3NiwKKyAgICAxMjcsIDE0MCwgMTU4LCAxMTAsIDEyMSwgMTM3LCA5NCwgIDEwNCwgMTE4LCA3NywgIDg1LCAgOTgsICA1OSwgIDY3LCAgNzgsCisgICAgMzcsICA0MywgIDUzLCAgMCwgICAyLCAgIDE2LCAgMTYzLCAxNzQsIDE3OCwgMTQ2LCAxNTYsIDE2MCwgMTMwLCAxMzksIDE0MywKKyAgICAxMTIsIDEyMSwgMTI0LCA5NSwgIDEwMywgMTA2LCA3OCwgIDg1LCAgODgsICA2MCwgIDY2LCAgNjksICAzNywgIDQyLCAgNDYsCisgICAgMCwgICAyLCAgIDcsICAgMTY2LCAxNzMsIDE1OSwgMTQ3LCAxNTQsIDE0MiwgMTMwLCAxMzgsIDEyNywgMTEzLCAxMjAsIDExMSwKKyAgICA5NiwgIDEwMywgOTUsICA3OCwgIDg0LCAgNzcsICA2MCwgIDY2LCAgNTksICAzNywgIDQzLCAgMzcsICAwLCAgIDIsICAgMCwKKyAgICAxNjYsIDE3MiwgMTM5LCAxNDgsIDE1NCwgMTI1LCAxMzEsIDEzNywgMTEyLCAxMTMsIDEyMCwgOTYsICA5NiwgIDEwMiwgODEsCisgICAgNzgsICA4NCwgIDY2LCAgNjAsICA2NSwgIDUwLCAgMzcsICA0MiwgIDI5LCAgMCwgICAzLCAgIDAsICAgMTY3LCAxNzEsIDEyMCwKKyAgICAxNDksIDE1MywgMTA3LCAxMzMsIDEzNywgOTUsICAxMTQsIDExOCwgODEsICA5NywgIDEwMSwgNjksICA3OSwgIDg0LCAgNTYsCisgICAgNjAsICA2NSwgIDQwLCAgMzcsICA0MiwgIDE5LCAgMCwgICAzLCAgIDAsICAgMTcwLCAxNzAsIDk5LCAgMTUxLCAxNTIsIDg3LAorICAgIDEzNCwgMTM2LCA3NywgIDExNSwgMTE4LCA2NiwgIDk3LCAgMTAxLCA1NSwgIDc5LCAgODMsICA0MiwgIDYxLCAgNjUsICAyOCwKKyAgICAzNywgIDQyLCAgNywgICAwLCAgIDMsICAgMCwgICAxNzIsIDE3MCwgNzUsICAxNTIsIDE1MSwgNjUsICAxMzQsIDEzNSwgNTcsCisgICAgMTE1LCAxMTcsIDQ4LCAgOTcsICAxMDAsIDM4LCAgNzksICA4MywgIDI3LCAgNjEsICA2NCwgIDEyLCAgMzYsICA0MiwgIDAsCisgICAgMCwgICAzLCAgIDAsICAgMTcyLCAxNjksIDU1LCAgMTU0LCAxNTEsIDQ2LCAgMTM1LCAxMzQsIDQwLCAgMTE2LCAxMTYsIDMyLAorICAgIDk3LCAgOTksICAyMSwgIDgwLCAgODIsICAxMCwgIDYxLCAgNjQsICAwLCAgIDM2LCAgNDEsICAwLCAgIDAsICAgMywgICAwLAorICAgIDE2MCwgMTU0LCAyMDMsIDE0MywgMTM5LCAxODIsIDEyNywgMTI0LCAxNjQsIDExMSwgMTA3LCAxNDMsIDk1LCAgOTEsICAxMjIsCisgICAgNzgsICA3NSwgIDEwMywgNjAsICA1NywgIDgxLCAgMzksICAzMywgIDU2LCAgMSwgICAwLCAgIDE4LCAgMTYzLCAxNTQsIDE4NCwKKyAgICAxNDYsIDEzOCwgMTY1LCAxMzAsIDEyMywgMTQ4LCAxMTMsIDEwNywgMTI5LCA5NiwgIDkwLCAgMTEwLCA3OSwgIDc0LCAgOTIsCisgICAgNjEsICA1NiwgIDcyLCAgMzksICAzNCwgIDQ4LCAgMiwgICAwLCAgIDksICAgMTY1LCAxNTQsIDE2NywgMTQ3LCAxMzcsIDE0OSwKKyAgICAxMzEsIDEyMiwgMTM0LCAxMTQsIDEwNiwgMTE3LCA5NiwgIDkwLCAgMTAwLCA3OSwgIDc0LCAgODIsICA2MSwgIDU2LCAgNjQsCisgICAgMzksICAzMywgIDQwLCAgMiwgICAwLCAgIDEsICAgMTY2LCAxNTMsIDE1MCwgMTQ5LCAxMzcsIDEzMywgMTMyLCAxMjIsIDExOSwKKyAgICAxMTQsIDEwNiwgMTA0LCA5NywgIDkwLCAgODgsICA3OSwgIDc0LCAgNzIsICA2MSwgIDU2LCAgNTUsICAzOSwgIDM0LCAgMzMsCisgICAgMCwgICAwLCAgIDAsICAgMTY4LCAxNTIsIDEzMiwgMTQ5LCAxMzYsIDExNywgMTMyLCAxMjEsIDEwNCwgMTE0LCAxMDUsIDkwLAorICAgIDk3LCAgODksICA3NiwgIDc5LCAgNzMsICA2MiwgIDYxLCAgNTYsICA0NiwgIDM4LCAgMzQsICAyNSwgIDAsICAgMCwgICAwLAorICAgIDE2OSwgMTUxLCAxMTQsIDE1MCwgMTM1LCAxMDEsIDEzMywgMTIxLCA5MCwgIDExNCwgMTA0LCA3NywgIDk3LCAgODksICA2NSwKKyAgICA4MCwgIDczLCAgNTEsICA2MSwgIDU2LCAgMzYsICAzOCwgIDM0LCAgMTYsICAwLCAgIDAsICAgMCwgICAxNzAsIDE1MCwgOTQsCisgICAgMTUxLCAxMzUsIDgzLCAgMTM0LCAxMjAsIDczLCAgMTE1LCAxMDQsIDYyLCAgOTgsICA4OCwgIDUxLCAgODAsICA3MiwgIDM5LAorICAgIDYxLCAgNTYsICAyNCwgIDM4LCAgMzQsICAzLCAgIDAsICAgMCwgICAwLCAgIDE3MiwgMTUwLCA3MiwgIDE1MywgMTM0LCA2MywKKyAgICAxMzUsIDExOSwgNTUsICAxMTUsIDEwMywgNDUsICA5OCwgIDg4LCAgMzYsICA4MCwgIDcyLCAgMjQsICA2MSwgIDU1LCAgOSwKKyAgICAzOCwgIDM0LCAgMCwgICAwLCAgIDAsICAgMCwgICAxNzIsIDE1MCwgNTQsICAxNTMsIDEzNCwgNDcsICAxMzUsIDExOSwgMzgsCisgICAgMTE2LCAxMDMsIDMwLCAgOTgsICA4NywgIDIxLCAgODAsICA3MiwgIDgsICAgNjIsICA1NSwgIDAsICAgMzcsICAzNCwgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMTYyLCAxMzQsIDE5MCwgMTQ1LCAxMjAsIDE3MSwgMTI5LCAxMDgsIDE1MywgMTEzLCA5MywgIDEzNCwKKyAgICA5NywgIDc4LCAgMTE1LCA4MCwgIDYzLCAgOTYsICA2MiwgIDQ2LCAgNzUsICA0MSwgIDIzLCAgNTEsICAwLCAgIDAsICAgMTEsCisgICAgMTY1LCAxMzQsIDE3MywgMTQ3LCAxMjAsIDE1NCwgMTMxLCAxMDcsIDEzOCwgMTE0LCA5MiwgIDEyMCwgOTcsICA3OCwgIDEwMywKKyAgICA4MCwgIDYzLCAgODUsICA2MiwgIDQ2LCAgNjYsICA0MCwgIDIzLCAgNDMsICAwLCAgIDAsICAgMiwgICAxNjYsIDEzNCwgMTU3LAorICAgIDE0OCwgMTIwLCAxNDAsIDEzMiwgMTA2LCAxMjUsIDExNCwgOTIsICAxMDksIDk3LCAgNzcsICA5MywgIDgxLCAgNjMsICA3NywKKyAgICA2MiwgIDQ2LCAgNTgsICA0MCwgIDI0LCAgMzYsICAwLCAgIDAsICAgMCwgICAxNjgsIDEzMywgMTQwLCAxNDksIDExOSwgMTI1LAorICAgIDEzMiwgMTA2LCAxMTIsIDExNSwgOTIsICA5NywgIDk4LCAgNzcsICA4MiwgIDgxLCAgNjIsICA2NywgIDYyLCAgNDYsICA1MCwKKyAgICA0MCwgIDI0LCAgMjksICAwLCAgIDAsICAgMCwgICAxNjgsIDEzMywgMTIzLCAxNTAsIDExOSwgMTEwLCAxMzMsIDEwNiwgOTcsCisgICAgMTE1LCA5MSwgIDg0LCAgOTgsICA3NywgIDcwLCAgODEsICA2MiwgIDU3LCAgNjIsICA0NiwgIDQxLCAgNDAsICAyNCwgIDIwLAorICAgIDAsICAgMCwgICAwLCAgIDE2OSwgMTMyLCAxMDcsIDE1MCwgMTE4LCA5NCwgIDEzMywgMTA1LCA4NCwgIDExNSwgOTEsICA3MiwKKyAgICA5OCwgIDc2LCAgNjAsICA4MCwgIDYyLCAgNDcsICA2MiwgIDQ2LCAgMzIsICAzOSwgIDI1LCAgMTEsICAwLCAgIDAsICAgMCwKKyAgICAxNzEsIDEzMiwgODksICAxNTIsIDExOCwgNzksICAxMzUsIDEwNSwgNjksICAxMTUsIDkwLCAgNTgsICA5OCwgIDc2LCAgNDcsCisgICAgODAsICA2MiwgIDM2LCAgNjIsICA0NiwgIDIxLCAgMzksICAyNSwgIDAsICAgMCwgICAwLCAgIDAsICAgMTcxLCAxMzIsIDY5LAorICAgIDE1MywgMTE3LCA2MCwgIDEzNSwgMTA0LCA1MiwgIDExNiwgOTAsICA0MiwgIDk4LCAgNzYsICAzMywgIDgxLCAgNjEsICAyMSwKKyAgICA2MiwgIDQ2LCAgNiwgICAzOCwgIDI1LCAgMCwgICAwLCAgIDAsICAgMCwgICAxNzIsIDEzMiwgNTQsICAxNTMsIDExOCwgNDUsCisgICAgMTM1LCAxMDQsIDM4LCAgMTE2LCA5MCwgIDI4LCAgOTgsICA3NiwgIDE4LCAgODEsICA2MSwgIDYsICAgNjIsICA0NiwgIDAsCisgICAgMzgsICAyNSwgIDAsICAgMCwgICAwLCAgIDAsICAgMTY0LCAxMTUsIDE3NywgMTQ2LCAxMDMsIDE1OSwgMTMwLCA5MSwgIDE0MywKKyAgICAxMTQsIDc4LCAgMTI1LCA5NywgIDY1LCAgMTA3LCA4MSwgIDUxLCAgODksICA2MywgIDM0LCAgNjksICA0MSwgIDksICAgNDYsCisgICAgMCwgICAwLCAgIDQsICAgMTY2LCAxMTUsIDE2MSwgMTQ4LCAxMDMsIDE0NCwgMTMyLCA5MSwgIDEyOSwgMTE1LCA3OCwgIDExMiwKKyAgICA5OCwgIDY1LCAgOTYsICA4MSwgIDUxLCAgNzksICA2MywgIDM1LCAgNjEsICA0MSwgIDExLCAgMzgsICAwLCAgIDAsICAgMCwKKyAgICAxNjcsIDExNSwgMTQ2LCAxNTAsIDEwMiwgMTMxLCAxMzIsIDkxLCAgMTE3LCAxMTUsIDc4LCAgMTAxLCA5OCwgIDY1LCAgODYsCisgICAgODEsICA1MSwgIDcxLCAgNjMsICAzNSwgIDU0LCAgNDEsICAxMiwgIDMyLCAgMCwgICAwLCAgIDAsICAgMTY4LCAxMTQsIDEzMiwKKyAgICAxNTAsIDEwMywgMTE4LCAxMzMsIDkxLCAgMTA1LCAxMTYsIDc4LCAgOTEsICA5OCwgIDY0LCAgNzYsICA4MiwgIDUxLCAgNjEsCisgICAgNjMsICAzNiwgIDQ2LCAgNDEsICAxMywgIDI0LCAgMCwgICAwLCAgIDAsICAgMTY5LCAxMTQsIDExNiwgMTUwLCAxMDIsIDEwMywKKyAgICAxMzQsIDkwLCAgOTEsICAxMTYsIDc4LCAgNzksICA5OCwgIDY1LCAgNjYsICA4MSwgIDUxLCAgNTMsICA2MywgIDM2LCAgMzcsCisgICAgNDAsICAxNCwgIDE3LCAgMCwgICAwLCAgIDAsICAgMTY5LCAxMTQsIDEwMSwgMTUxLCAxMDEsIDg5LCAgMTM0LCA5MCwgIDc5LAorICAgIDExNiwgNzcsICA2NywgIDk4LCAgNjQsICA1NiwgIDgxLCAgNTEsICA0NCwgIDYzLCAgMzYsICAyOSwgIDQwLCAgMTUsICA3LAorICAgIDAsICAgMCwgICAwLCAgIDE3MCwgMTE0LCA4NSwgIDE1MiwgMTAxLCA3NSwgIDEzNSwgOTAsICA2NSwgIDExNiwgNzcsICA1NCwKKyAgICA5OCwgIDY0LCAgNDQsICA4MSwgIDUxLCAgMzIsICA2MywgIDM2LCAgMTcsICAzOSwgIDE1LCAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAxNzIsIDExMywgNjYsICAxNTIsIDEwMSwgNTgsICAxMzUsIDg5LCAgNDksICAxMTYsIDc3LCAgNDAsICA5OSwgIDY0LCAgMzAsCisgICAgODEsICA1MSwgIDE4LCAgNjIsICAzNiwgIDMsICAgMzgsICAxNiwgIDAsICAgMCwgICAwLCAgIDAsICAgMTcxLCAxMTMsIDUxLAorICAgIDE1MywgMTAxLCA0NCwgIDEzNiwgODksICAzNiwgIDExNiwgNzcsICAyOCwgIDk5LCAgNjQsICAxOCwgIDgxLCAgNTEsICA1LAorICAgIDYyLCAgMzYsICAwLCAgIDM4LCAgMTYsICAwLCAgIDAsICAgMCwgICAwLCAgIDE2NSwgOTQsICAxNjYsIDE0NywgODIsICAxNDcsCisgICAgMTMyLCA3MiwgIDEzMiwgMTE1LCA2MSwgIDExNSwgOTgsICA0OSwgIDk5LCAgODIsICAzNiwgIDgyLCAgNjQsICAxOSwgIDY0LAorICAgIDQyLCAgMCwgICA0MSwgIDAsICAgMCwgICAwLCAgIDE2NywgOTMsICAxNTAsIDE1MCwgODMsICAxMzQsIDEzMywgNzMsICAxMjAsCisgICAgMTE2LCA2MiwgIDEwNCwgOTksICA0OSwgIDg4LCAgODIsICAzNiwgIDcyLCAgNjQsICAyMCwgIDU1LCAgNDEsICAwLCAgIDMzLAorICAgIDAsICAgMCwgICAwLCAgIDE2OSwgOTMsICAxMzcsIDE1MCwgODMsICAxMjIsIDEzNCwgNzMsICAxMDksIDExNiwgNjEsICA5NCwKKyAgICA5OSwgIDUwLCAgODAsICA4MiwgIDM3LCAgNjUsICA2NCwgIDIxLCAgNDksICA0MSwgIDAsICAgMjcsICAwLCAgIDAsICAgMCwKKyAgICAxNjksIDk0LCAgMTIzLCAxNTAsIDgzLCAgMTEwLCAxMzMsIDczLCAgOTcsICAxMTYsIDYxLCAgODMsICA5OSwgIDUwLCAgNzAsCisgICAgODIsICAzOCwgIDU3LCAgNjMsICAyMywgIDQyLCAgNDEsICAwLCAgIDIwLCAgMCwgICAwLCAgIDAsICAgMTY5LCA5NCwgIDEwOSwKKyAgICAxNTAsIDg0LCAgOTcsICAxMzQsIDczLCAgODUsICAxMTYsIDYyLCAgNzMsICA5OSwgIDUxLCAgNjEsICA4MSwgIDM4LCAgNDgsCisgICAgNjMsICAyMywgIDMzLCAgNDEsICAxLCAgIDExLCAgMCwgICAwLCAgIDAsICAgMTcwLCA5NCwgIDk2LCAgMTUwLCA4MywgIDg0LAorICAgIDEzNCwgNzMsICA3NCwgIDExNiwgNjEsICA2MiwgIDk5LCAgNTAsICA1MSwgIDgyLCAgMzgsICAzOSwgIDY0LCAgMjMsICAyNCwKKyAgICA0MCwgIDMsICAgNCwgICAwLCAgIDAsICAgMCwgICAxNzEsIDkzLCAgNzksICAxNTIsIDgyLCAgNzAsICAxMzUsIDczLCAgNjEsCisgICAgMTE2LCA2MiwgIDUxLCAgOTgsICA1MSwgIDQwLCAgODEsICAzOCwgIDI4LCAgNjMsICAyNCwgIDE0LCAgMzksICA0LCAgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMTcxLCA5NCwgIDY0LCAgMTUyLCA4MywgIDU1LCAgMTM1LCA3MywgIDQ3LCAgMTE2LCA2MiwgIDM3LAorICAgIDk4LCAgNTAsICAyNywgIDgxLCAgMzgsICAxNSwgIDYzLCAgMjQsICAxLCAgIDM5LCAgNCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDE3MiwgOTMsICA1MSwgIDE1MywgODIsICA0MiwgIDEzNSwgNzMsICAzNSwgIDExNywgNjIsICAyNiwgIDk5LCAgNTEsICAxNiwKKyAgICA4MSwgIDM5LCAgMywgICA2MywgIDI1LCAgMCwgICAzOCwgIDUsICAgMCwgICAwLCAgIDAsICAgMCwgICAxNjYsIDY4LCAgMTUzLAorICAgIDE0OCwgNTksICAxMzcsIDEzMywgNDksICAxMjEsIDExNSwgMzksICAxMDYsIDk5LCAgMjgsICA5MSwgIDgyLCAgMTMsICA3NSwKKyAgICA2NSwgIDAsICAgNTgsICA0MiwgIDAsICAgMzYsICAwLCAgIDAsICAgMCwgICAxNjgsIDY4LCAgMTM5LCAxNTAsIDU5LCAgMTI0LAorICAgIDEzNCwgNTAsICAxMTAsIDExNiwgNDAsICA5NiwgIDk5LCAgMzAsICA4MSwgIDgyLCAgMTYsICA2NiwgIDY0LCAgMCwgICA1MCwKKyAgICA0MSwgIDAsICAgMjksICAwLCAgIDAsICAgMCwgICAxNjksIDY5LCAgMTI2LCAxNTAsIDU5LCAgMTEzLCAxMzQsIDUxLCAgMTAxLAorICAgIDExNywgNDIsICA4NywgIDEwMCwgMzAsICA3MywgIDgyLCAgMTcsICA1OSwgIDY1LCAgMCwgICA0MywgIDQxLCAgMCwgICAyMywKKyAgICAwLCAgIDAsICAgMCwgICAxNjksIDcwLCAgMTE1LCAxNTAsIDYxLCAgMTAyLCAxMzQsIDUyLCAgODksICAxMTYsIDQyLCAgNzcsCisgICAgOTksICAzMiwgIDY1LCAgODIsICAxOSwgIDUyLCAgNjQsICAwLCAgIDM2LCAgNDEsICAwLCAgIDE1LCAgMCwgICAwLCAgIDAsCisgICAgMTY5LCA3MCwgIDEwMSwgMTUwLCA2MSwgIDkwLCAgMTM0LCA1MiwgIDc5LCAgMTE2LCA0MywgIDY4LCAgOTksICAzMiwgIDU1LAorICAgIDgyLCAgMjEsICA0MywgIDY0LCAgMiwgICAyOCwgIDQxLCAgMCwgICA2LCAgIDAsICAgMCwgICAwLCAgIDE3MCwgNzAsICA4OSwKKyAgICAxNTEsIDYyLCAgNzksICAxMzQsIDUzLCAgNjksICAxMTYsIDQ0LCAgNTgsICA5OSwgIDMzLCAgNDYsICA4MSwgIDIxLCAgMzQsCisgICAgNjQsICAzLCAgIDIwLCAgNDEsICAwLCAgIDIsICAgMCwgICAwLCAgIDAsICAgMTcwLCA3MSwgIDc2LCAgMTUyLCA2MiwgIDY2LAorICAgIDEzNCwgNTMsICA1NywgIDExNiwgNDMsICA0NiwgIDk5LCAgMzMsICAzNiwgIDgyLCAgMjIsICAyNCwgIDY0LCAgNSwgICAxMCwKKyAgICA0MCwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxNzEsIDcwLCAgNjEsICAxNTIsIDYyLCAgNTIsICAxMzUsIDUzLCAgNDQsCisgICAgMTE2LCA0NCwgIDM1LCAgOTksICAzNCwgIDI0LCAgODIsICAyMiwgIDEyLCAgNjMsICA2LCAgIDAsICAgMzksICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMTcxLCA3MSwgIDQ5LCAgMTUzLCA2MiwgIDQxLCAgMTM1LCA1NCwgIDMzLCAgMTE3LCA0NSwgIDI1LAorICAgIDk4LCAgMzQsICAxMywgIDgxLCAgMjMsICAwLCAgIDYzLCAgNywgICAwLCAgIDM5LCAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDE2NywgMzMsICAxNDIsIDE0OSwgMjQsICAxMjcsIDEzNCwgMTAsICAxMTMsIDExNiwgMCwgICA5NywgIDEwMCwgMCwgICA4MywKKyAgICA4MywgIDAsICAgNjgsICA2NSwgIDAsICAgNTIsICA0MCwgIDAsICAgMzAsICAwLCAgIDAsICAgMCwgICAxNjksIDMzLCAgMTI5LAorICAgIDE1MCwgMjYsICAxMTUsIDEzNCwgMTcsICAxMDIsIDExNiwgMywgICA4OSwgIDEwMCwgMCwgICA3NSwgIDgzLCAgMCwgICA2MCwKKyAgICA2NSwgIDAsICAgNDUsICA0MCwgIDAsICAgMjQsICAwLCAgIDAsICAgMCwgICAxNjksIDM2LCAgMTE4LCAxNTEsIDI3LCAgMTA0LAorICAgIDEzNCwgMTksICA5MywgIDExNiwgNywgICA4MCwgIDEwMCwgMCwgICA2NywgIDgzLCAgMCwgICA1NCwgIDY1LCAgMCwgICAzOCwKKyAgICA0MSwgIDAsICAgMTcsICAwLCAgIDAsICAgMCwgICAxNjksIDM5LCAgMTA3LCAxNTAsIDMwLCAgOTQsICAxMzQsIDIyLCAgODQsCisgICAgMTE2LCAxMSwgIDcxLCAgOTksICAwLCAgIDU5LCAgODMsICAwLCAgIDQ2LCAgNjQsICAwLCAgIDMxLCAgNDAsICAwLCAgIDksCisgICAgMCwgICAwLCAgIDAsICAgMTY5LCAzOSwgIDk1LCAgMTUxLCAzMSwgIDgzLCAgMTM0LCAyNCwgIDczLCAgMTE2LCAxNSwgIDYyLAorICAgIDEwMCwgMSwgICA1MSwgIDgzLCAgMCwgICAzOCwgIDY0LCAgMCwgICAyNCwgIDQwLCAgMCwgICA1LCAgIDAsICAgMCwgICAwLAorICAgIDE2OSwgNDEsICA4MywgIDE1MSwgMzMsICA3MywgIDEzNCwgMjYsICA2NCwgIDExNywgMTcsICA1NCwgIDk5LCAgNCwgICA0MiwKKyAgICA4MiwgIDAsICAgMzAsICA2NCwgIDAsICAgMTYsICA0MCwgIDAsICAgMSwgICAwLCAgIDAsICAgMCwgICAxNzAsIDQyLCAgNzEsCisgICAgMTUyLCAzNCwgIDYyLCAgMTM0LCAyOCwgIDUzLCAgMTE3LCAxOSwgIDQ0LCAgOTksICA2LCAgIDMzLCAgODIsICAwLCAgIDIxLAorICAgIDYzLCAgMCwgICA0LCAgIDM5LCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDE3MSwgNDIsICA1OSwgIDE1MiwgMzUsICA1MCwKKyAgICAxMzQsIDI5LCAgNDIsICAxMTcsIDIxLCAgMzIsICA5OSwgIDksICAgMjIsICA4MiwgIDAsICAgOSwgICA2MywgIDAsICAgMCwKKyAgICAzOCwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxNzIsIDQyLCAgNDgsICAxNTIsIDM2LCAgNDAsICAxMzUsIDI5LCAgMzIsCisgICAgMTE3LCAyMSwgIDIzLCAgOTksICAxMCwgIDEyLCAgODIsICAwLCAgIDAsICAgNjMsICAwLCAgIDAsICAgMzgsICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMTA3LCAyMDcsIDI0NiwgOTYsICAxODUsIDIyMCwgODYsICAxNjUsIDE5NiwgNzMsICAxNDQsIDE3MSwKKyAgICA2MCwgIDEyMywgMTQ3LCA0NiwgIDEwMywgMTI1LCAzMiwgIDgyLCAgMTAwLCA5LCAgIDU2LCAgNzEsICAwLCAgIDIwLCAgMzMsCisgICAgMTE1LCAyMDYsIDIyMSwgMTA0LCAxODQsIDE5OCwgOTIsICAxNjQsIDE3OCwgNzgsICAxNDMsIDE1NCwgNjQsICAxMjMsIDEzMywKKyAgICA1MSwgIDEwMiwgMTExLCAzNCwgIDgxLCAgODksICAxMCwgIDU2LCAgNjMsICAwLCAgIDIwLCAgMjcsICAxMjIsIDIwNCwgMjAwLAorICAgIDEwOCwgMTgzLCAxODAsIDk1LCAgMTYzLCAxNjEsIDgyLCAgMTQyLCAxNDAsIDY4LCAgMTIyLCAxMjAsIDU0LCAgMTAyLCAxMDEsCisgICAgMzYsICA4MSwgIDc5LCAgMTEsICA1NiwgIDU1LCAgMCwgICAyMCwgIDIwLCAgMTI1LCAyMDMsIDE3OSwgMTExLCAxODEsIDE2MCwKKyAgICA5NywgIDE2MiwgMTQzLCA4NSwgIDE0MSwgMTI0LCA3MCwgIDEyMSwgMTA3LCA1NSwgIDEwMSwgODksICAzOCwgIDgwLCAgNjksCisgICAgMTQsICA1NSwgIDQ2LCAgMCwgICAxOSwgIDEwLCAgMTI4LCAyMDIsIDE1NiwgMTEzLCAxODAsIDE0MCwgMTAyLCAxNjEsIDEyNSwKKyAgICA4NywgIDE0MCwgMTA4LCA3MSwgIDEyMCwgOTIsICA1NiwgIDEwMCwgNzYsICAzOSwgIDc5LCAgNTksICAxNCwgIDU1LCAgMzgsCisgICAgMCwgICAyMCwgIDMsICAgMTMyLCAyMDAsIDEzNSwgMTE3LCAxNzksIDEyMSwgMTAzLCAxNTksIDEwNiwgODgsICAxMzksIDkzLAorICAgIDczLCAgMTE5LCA3OSwgIDU3LCAgMTAwLCA2NSwgIDQxLCAgNzksICA0OSwgIDE1LCAgNTQsICAyOCwgIDAsICAgMTksICAwLAorICAgIDEzNCwgMjAwLCAxMTEsIDExOSwgMTc4LCA5OCwgIDEwNSwgMTU4LCA4NywgIDg5LCAgMTM4LCA3NiwgIDc0LCAgMTE4LCA2NCwKKyAgICA1OCwgIDk5LCAgNTEsICA0MSwgIDc4LCAgMzcsICAxNiwgIDU0LCAgMTcsICAwLCAgIDE5LCAgMCwgICAxMzcsIDE5OSwgODUsCisgICAgMTIyLCAxNzcsIDc1LCAgMTA4LCAxNTgsIDY2LCAgOTEsICAxMzcsIDU2LCAgNzUsICAxMTgsIDQ2LCAgNTksICA5OCwgIDM1LAorICAgIDQyLCAgNzgsICAyMiwgIDE2LCAgNTQsICAzLCAgIDAsICAgMTksICAwLCAgIDE0MCwgMTk4LCA2MiwgIDEyNSwgMTc3LCA1NSwKKyAgICAxMDksIDE1OCwgNDcsICA5MiwgIDEzNywgNDAsICA3NiwgIDExNywgMzIsICA1OSwgIDk4LCAgMjEsICA0MiwgIDc4LCAgNiwKKyAgICAxNiwgIDU0LCAgMCwgICAwLCAgIDE4LCAgMCwgICAxMTgsIDE4NiwgMjMxLCAxMDYsIDE2NywgMjA2LCA5MywgIDE0OSwgMTg0LAorICAgIDgxLCAgMTMwLCAxNjEsIDY3LCAgMTExLCAxMzksIDU0LCAgOTIsICAxMTcsIDM5LCAgNzIsICA5MywgIDE3LCAgNDgsICA2NiwKKyAgICAwLCAgIDEwLCAgMjksICAxMjMsIDE4NSwgMjA3LCAxMTAsIDE2NiwgMTg2LCA5OCwgIDE0OCwgMTY3LCA4NSwgIDEyOSwgMTQ1LAorICAgIDcxLCAgMTExLCAxMjUsIDU2LCAgOTIsICAxMDQsIDQwLCAgNzIsICA4MywgIDE4LCAgNDgsICA1NywgIDAsICAgMTAsICAyMiwKKyAgICAxMjgsIDE4NCwgMTg4LCAxMTMsIDE2NSwgMTY4LCAxMDIsIDE0NywgMTUxLCA4OCwgIDEyOCwgMTMxLCA3MywgIDExMCwgMTEzLAorICAgIDU4LCAgOTEsICA5NCwgIDQyLCAgNzEsICA3NCwgIDE5LCAgNDgsICA1MCwgIDAsICAgOSwgICAxNSwgIDEzMSwgMTgzLCAxNjgsCisgICAgMTE2LCAxNjQsIDE1MSwgMTA0LCAxNDYsIDEzNCwgODksICAxMjcsIDExNywgNzMsICAxMDksIDEwMCwgNTgsICA5MCwgIDgzLAorICAgIDQyLCAgNzEsICA2NSwgIDIwLCAgNDgsICA0MiwgIDAsICAgOSwgICA1LCAgIDEzNCwgMTgyLCAxNDgsIDEyMCwgMTYzLCAxMzEsCisgICAgMTA1LCAxNDUsIDExOCwgOTAsICAxMjYsIDEwMiwgNzUsICAxMDgsIDg2LCAgNTksICA5MCwgIDcyLCAgNDMsICA3MSwgIDU1LAorICAgIDE5LCAgNDcsICAzNCwgIDAsICAgOSwgICAwLCAgIDEzNiwgMTgxLCAxMjgsIDEyMiwgMTYyLCAxMTUsIDEwNywgMTQ0LCAxMDIsCisgICAgOTIsICAxMjUsIDg3LCAgNzYsICAxMDcsIDc0LCAgNjEsICA4OSwgIDYwLCAgNDQsICA3MCwgIDQ1LCAgMjAsICA0NywgIDI0LAorICAgIDAsICAgOCwgICAwLCAgIDEzOSwgMTgwLCAxMDYsIDEyNCwgMTYxLCA5NSwgIDEwOSwgMTQ0LCA4MywgIDkzLCAgMTI0LCA3MSwKKyAgICA3NywgIDEwNywgNjAsICA2MSwgIDg5LCAgNDcsICA0NCwgIDcwLCAgMzMsICAyMCwgIDQ3LCAgMTMsICAwLCAgIDgsICAgMCwKKyAgICAxNDIsIDE3OSwgODIsICAxMjUsIDE2MCwgNzIsICAxMTEsIDE0MywgNjMsICA5NCwgIDEyNCwgNTQsICA3NywgIDEwNiwgNDQsCisgICAgNjEsICA4OCwgIDMyLCAgNDQsICA2OSwgIDE4LCAgMjAsICA0NiwgIDAsICAgMCwgICA4LCAgIDAsICAgMTQzLCAxNzksIDYyLAorICAgIDEyNywgMTYwLCA1NCwgIDExMSwgMTQyLCA0NywgIDk0LCAgMTI0LCAzOSwgIDc4LCAgMTA2LCAyOSwgIDYyLCAgODgsICAxOCwKKyAgICA0NSwgIDY5LCAgMywgICAyMCwgIDQ2LCAgMCwgICAwLCAgIDgsICAgMCwgICAxMjQsIDE2NywgMjE2LCAxMTIsIDE1MCwgMTk0LAorICAgIDk5LCAgMTM0LCAxNzQsIDg3LCAgMTE3LCAxNTMsIDczLCAgMTAwLCAxMzEsIDU4LCAgODIsICAxMTAsIDQzLCAgNjQsICA4OCwKKyAgICAyMywgIDQwLCAgNjEsICAwLCAgIDAsICAgMjQsICAxMjksIDE2NiwgMTk1LCAxMTYsIDE1MCwgMTc1LCAxMDMsIDEzNCwgMTU4LAorICAgIDg5LCAgMTE2LCAxMzcsIDc1LCAgOTksICAxMTgsIDYwLCAgODIsICA5OCwgIDQ0LCAgNjMsICA3OCwgIDIzLCAgNDAsICA1MywKKyAgICAwLCAgIDAsICAgMTcsICAxMzIsIDE2NiwgMTc3LCAxMTksIDE0OSwgMTYwLCAxMDYsIDEzMywgMTQzLCA5MCwgIDExNSwgMTI0LAorICAgIDc2LCAgOTksICAxMDcsIDYxLCAgODEsICA4OCwgIDQ1LCAgNjMsICA2OSwgIDI0LCAgNDAsICA0NiwgIDAsICAgMCwgICA5LAorICAgIDEzNiwgMTY2LCAxNTksIDEyMSwgMTQ4LCAxNDMsIDEwNywgMTMyLCAxMjYsIDkyLCAgMTE1LCAxMTEsIDc3LCAgOTgsICA5NCwKKyAgICA2MiwgIDgxLCAgNzgsICA0NiwgIDYzLCAgNjAsICAyMywgIDQwLCAgMzgsICAwLCAgIDAsICAgMCwgICAxMzgsIDE2NCwgMTQwLAorICAgIDEyMiwgMTQ3LCAxMjUsIDEwOCwgMTMxLCAxMTEsIDkzLCAgMTE0LCA5NywgIDc5LCAgOTgsICA4MiwgIDYzLCAgODAsICA2NywKKyAgICA0NiwgIDYyLCAgNTAsICAyNCwgIDQwLCAgMjksICAwLCAgIDAsICAgMCwgICAxMzksIDE2MywgMTIyLCAxMjQsIDE0NiwgMTA5LAorICAgIDExMCwgMTMxLCA5NiwgIDk0LCAgMTE0LCA4MywgIDc5LCAgOTcsICA3MCwgIDYzLCAgODEsICA1NywgIDQ2LCAgNjIsICA0MSwKKyAgICAyNCwgIDQwLCAgMjEsICAwLCAgIDAsICAgMCwgICAxNDEsIDE2MywgMTAxLCAxMjYsIDE0NSwgOTAsICAxMTEsIDEzMCwgNzksCisgICAgOTUsICAxMTMsIDY4LCAgNzksICA5NiwgIDU2LCAgNjMsICA4MCwgIDQ0LCAgNDcsICA2MiwgIDMwLCAgMjMsICA0MCwgIDEwLAorICAgIDAsICAgMCwgICAwLCAgIDE0NCwgMTYyLCA3OSwgIDEyNywgMTQ1LCA3MCwgIDExMiwgMTI5LCA2MCwgIDk1LCAgMTEyLCA1MSwKKyAgICA3OSwgIDk2LCAgNDEsICA2NCwgIDc5LCAgMzAsICA0NywgIDYxLCAgMTUsICAyMywgIDQwLCAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAxNDUsIDE2MiwgNjAsICAxMjksIDE0NSwgNTIsICAxMTMsIDEyOSwgNDYsICA5NiwgIDExMiwgMzcsICA3OSwgIDk1LCAgMjcsCisgICAgNjQsICA3OSwgIDE2LCAgNDcsICA2MSwgIDEsICAgMjMsICAzOSwgIDAsICAgMCwgICAwLCAgIDAsICAgMTMxLCAxNDcsIDIwMiwKKyAgICAxMTcsIDEzMywgMTgxLCAxMDUsIDExOSwgMTYyLCA5MSwgIDEwMywgMTQyLCA3NywgIDg3LCAgMTIyLCA2MiwgIDcxLCAgMTAyLAorICAgIDQ3LCAgNTQsICA4MSwgIDI2LCAgMzEsICA1NiwgIDAsICAgMCwgICAxOCwgIDEzNSwgMTQ3LCAxODMsIDEyMCwgMTMyLCAxNjQsCisgICAgMTA3LCAxMTgsIDE0NywgOTMsICAxMDIsIDEyOCwgNzgsICA4NywgIDExMCwgNjMsICA3MSwgIDkyLCAgNDcsICA1NCwgIDcyLAorICAgIDI2LCAgMzEsICA0OCwgIDAsICAgMCwgICAxMCwgIDEzOCwgMTQ3LCAxNjYsIDEyMywgMTMxLCAxNDksIDEwOCwgMTE4LCAxMzMsCisgICAgOTQsICAxMDIsIDExNiwgNzksICA4NiwgIDEwMCwgNjQsICA3MSwgIDgyLCAgNDgsICA1NCwgIDY0LCAgMjcsICAzMSwgIDQxLAorICAgIDAsICAgMCwgICAyLCAgIDEzOSwgMTQ2LCAxNDksIDEyNCwgMTMxLCAxMzQsIDExMSwgMTE3LCAxMTksIDk0LCAgMTAxLCAxMDMsCisgICAgNzksICA4NiwgIDg4LCAgNjQsICA3MCwgIDcyLCAgNDgsICA1MywgIDU1LCAgMjcsICAzMSwgIDMzLCAgMCwgICAwLCAgIDAsCisgICAgMTQxLCAxNDYsIDEzMiwgMTI1LCAxMzEsIDExNywgMTExLCAxMTcsIDEwNCwgOTUsICAxMDEsIDkxLCAgODAsICA4NiwgIDc3LAorICAgIDY1LCAgNzAsICA2MiwgIDQ4LCAgNTMsICA0NiwgIDI2LCAgMzEsICAyNSwgIDAsICAgMCwgICAwLCAgIDE0MywgMTQ1LCAxMTUsCisgICAgMTI2LCAxMzAsIDEwMSwgMTEyLCAxMTYsIDkwLCAgOTYsICAxMDAsIDc4LCAgODAsICA4NSwgIDY1LCAgNjUsICA3MCwgIDUyLAorICAgIDQ5LCAgNTMsICAzNywgIDI3LCAgMzIsICAxNywgIDAsICAgMCwgICAwLCAgIDE0NCwgMTQ0LCA5NiwgIDEyOCwgMTI5LCA4NSwKKyAgICAxMTIsIDExNSwgNzUsICA5NywgIDEwMCwgNjQsICA4MSwgIDg1LCAgNTIsICA2NSwgIDY5LCAgNDAsICA0OSwgIDUzLCAgMjYsCisgICAgMjYsICAzMSwgIDUsICAgMCwgICAwLCAgIDAsICAgMTQ2LCAxNDQsIDc2LCAgMTI5LCAxMjksIDY3LCAgMTE0LCAxMTUsIDU4LAorICAgIDk3LCAgOTksICA0OCwgIDgyLCAgODQsICAzOCwgIDY2LCAgNjksICAyNywgIDQ5LCAgNTMsICAxMiwgIDI2LCAgMzIsICAwLAorICAgIDAsICAgMCwgICAwLCAgIDE0NiwgMTQ0LCA1OSwgIDEzMCwgMTI4LCA1MSwgIDExNCwgMTE0LCA0MywgIDk4LCAgOTksICAzNSwKKyAgICA4MiwgIDg0LCAgMjUsICA2NiwgIDY5LCAgMTMsICA0OSwgIDUzLCAgMCwgICAyNiwgIDMyLCAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAxMzUsIDEyOSwgMTg5LCAxMjIsIDExNSwgMTcwLCAxMDcsIDEwMywgMTUyLCA5NCwgIDg5LCAgMTMzLCA3OSwgIDc0LCAgMTE0LAorICAgIDY0LCAgNjAsICA5NSwgIDQ5LCAgNDMsICA3NSwgIDI5LCAgMjAsICA1MSwgIDAsICAgMCwgICAxMiwgIDEzOCwgMTI5LCAxNzEsCisgICAgMTI0LCAxMTUsIDE1MywgMTEwLCAxMDMsIDEzOCwgOTUsICA4OSwgIDEyMCwgODEsICA3NCwgIDEwMywgNjYsICA2MCwgIDg2LAorICAgIDUwLCAgNDQsICA2NywgIDI4LCAgMjEsICA0MywgIDAsICAgMCwgICAzLCAgIDE0MCwgMTI5LCAxNTYsIDEyNSwgMTE1LCAxNDAsCisgICAgMTExLCAxMDMsIDEyNSwgOTYsICA4OSwgIDEwOSwgODEsICA3NCwgIDkzLCAgNjcsICA2MCwgIDc2LCAgNTAsICA0NCwgIDU5LAorICAgIDI5LCAgMjIsICAzNiwgIDAsICAgMCwgICAwLCAgIDE0MiwgMTI4LCAxNDAsIDEyNywgMTE1LCAxMjUsIDExMiwgMTAyLCAxMTIsCisgICAgOTcsICA4OCwgIDk3LCAgODIsICA3NCwgIDgzLCAgNjcsICA2MCwgIDY3LCAgNTAsICA0NCwgIDUxLCAgMjksICAyMiwgIDI5LAorICAgIDAsICAgMCwgICAwLCAgIDE0MiwgMTI4LCAxMjQsIDEyNywgMTE0LCAxMTEsIDExMywgMTAyLCA5OCwgIDk4LCAgODgsICA4NSwKKyAgICA4MiwgIDc0LCAgNzEsICA2NiwgIDYwLCAgNTgsICA1MCwgIDQ0LCAgNDIsICAyOSwgIDIyLCAgMjEsICAwLCAgIDAsICAgMCwKKyAgICAxNDQsIDEyNywgMTA4LCAxMjgsIDExNCwgOTYsICAxMTMsIDEwMSwgODUsICA5OCwgIDg3LCAgNzMsICA4MiwgIDc0LCAgNjEsCisgICAgNjcsICA2MCwgIDQ4LCAgNTAsICA0NCwgIDMzLCAgMjgsICAyMywgIDEyLCAgMCwgICAwLCAgIDAsICAgMTQ1LCAxMjcsIDkxLAorICAgIDEyOSwgMTE0LCA4MSwgIDExNSwgMTAxLCA3MSwgIDk4LCAgODcsICA2MCwgIDgyLCAgNzMsICA0OCwgIDY3LCAgNTksICAzNywKKyAgICA1MCwgIDQ0LCAgMjIsICAyOSwgIDIzLCAgMSwgICAwLCAgIDAsICAgMCwgICAxNDcsIDEyNywgNzMsICAxMzAsIDExMywgNjMsCisgICAgMTE1LCAxMDEsIDU1LCAgOTgsICA4NywgIDQ1LCAgODMsICA3MywgIDM1LCAgNjcsICA1OSwgIDI0LCAgNTAsICA0NCwgIDEwLAorICAgIDI4LCAgMjQsICAwLCAgIDAsICAgMCwgICAwLCAgIDE0NywgMTI3LCA1OCwgIDEzMSwgMTEzLCA0OSwgIDExNSwgMTAwLCA0MiwKKyAgICA5OSwgIDg2LCAgMzMsICA4MywgIDczLCAgMjMsICA2NywgIDU5LCAgMTAsICA1MCwgIDQ0LCAgMCwgICAyNywgIDI0LCAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAxMzgsIDExMCwgMTc3LCAxMjQsIDk5LCAgMTU5LCAxMTAsIDg4LCAgMTQyLCA5NiwgIDc1LCAgMTI1LAorICAgIDgyLCAgNjIsICAxMDcsIDY2LCAgNDgsICA4OSwgIDUxLCAgMzMsICA3MCwgIDMwLCAgOCwgICA0NiwgIDAsICAgMCwgICA1LAorICAgIDE0MiwgMTExLCAxNjAsIDEyNywgOTksICAxNDQsIDExMywgODgsICAxMzAsIDk4LCAgNzUsICAxMTIsIDgyLCAgNjIsICA5NiwKKyAgICA2OCwgIDQ5LCAgODAsICA1MSwgIDMzLCAgNjEsICAzMCwgIDEwLCAgMzksICAwLCAgIDAsICAgMCwgICAxNDMsIDExMSwgMTQ2LAorICAgIDEyOCwgOTksICAxMzEsIDExNCwgODgsICAxMTgsIDk4LCAgNzUsICAxMDEsIDgzLCAgNjIsICA4NiwgIDY4LCAgNDksICA3MSwKKyAgICA1MiwgIDMzLCAgNTQsICAzMCwgIDExLCAgMzIsICAwLCAgIDAsICAgMCwgICAxNDQsIDExMSwgMTMyLCAxMjgsIDk5LCAgMTE4LAorICAgIDExMywgODgsICAxMDYsIDk5LCAgNzUsICA5MSwgIDgzLCAgNjIsICA3NywgIDY4LCAgNDksICA2MiwgIDUyLCAgMzQsICA0NiwKKyAgICAzMCwgIDEyLCAgMjUsICAwLCAgIDAsICAgMCwgICAxNDQsIDExMSwgMTE3LCAxMjksIDk4LCAgMTA0LCAxMTQsIDg3LCAgOTIsCisgICAgOTksICA3NSwgIDgwLCAgODMsICA2MiwgIDY3LCAgNjgsICA0OSwgIDUzLCAgNTEsICAzNCwgIDM4LCAgMzAsICAxMywgIDE4LAorICAgIDAsICAgMCwgICAwLCAgIDE0NSwgMTExLCAxMDMsIDEzMCwgOTgsICA5MSwgIDExNCwgODcsICA4MCwgIDk5LCAgNzUsICA2OCwKKyAgICA4MywgIDYzLCAgNTcsICA2OCwgIDUwLCAgNDUsICA1MSwgIDM0LCAgMzAsICAzMCwgIDE0LCAgOCwgICAwLCAgIDAsICAgMCwKKyAgICAxNDYsIDExMCwgODcsICAxMzEsIDk4LCAgNzYsICAxMTUsIDg3LCAgNjcsICA5OSwgIDc1LCAgNTYsICA4MywgIDYyLCAgNDUsCisgICAgNjgsICA0OSwgIDMzLCAgNTIsICAzNSwgIDE5LCAgMzAsICAxNSwgIDIsICAgMCwgICAwLCAgIDAsICAgMTQ4LCAxMTAsIDcwLAorICAgIDEzMSwgOTgsICA2MCwgIDExNiwgODYsICA1MiwgIDk5LCAgNzQsICA0MywgIDg0LCAgNjIsICAzMywgIDY5LCAgNDksICAyMSwKKyAgICA1MiwgIDM1LCAgNiwgICAyOSwgIDE1LCAgMCwgICAwLCAgIDAsICAgMCwgICAxNDgsIDExMCwgNTYsICAxMzIsIDk3LCAgNDgsCisgICAgMTE3LCA4NywgIDQwLCAgMTAwLCA3NSwgIDMxLCAgODQsICA2MiwgIDIyLCAgNjgsICA0OSwgIDksICAgNTEsICAzNSwgIDAsCisgICAgMjgsICAxNSwgIDAsICAgMCwgICAwLCAgIDAsICAgMTQyLCA5MSwgIDE2NiwgMTI2LCA4MCwgIDE0OCwgMTEzLCA3MSwgIDEzMiwKKyAgICA5OCwgIDU5LCAgMTE1LCA4MywgIDQ3LCAgOTksICA2OSwgIDM0LCAgODIsICA1MywgIDE3LCAgNjQsICAzMiwgIDAsICAgNDEsCisgICAgMCwgICAwLCAgIDAsICAgMTQzLCA5MSwgIDE1MCwgMTI4LCA4MSwgIDEzNSwgMTE0LCA3MSwgIDEyMCwgOTksICA2MCwgIDEwNCwKKyAgICA4NSwgIDQ4LCAgODksICA2OSwgIDM1LCAgNzMsICA1MywgIDE5LCAgNTYsICAzMiwgIDAsICAgMzQsICAwLCAgIDAsICAgMCwKKyAgICAxNDUsIDkxLCAgMTM3LCAxMjksIDgxLCAgMTIyLCAxMTUsIDcxLCAgMTA5LCAxMDAsIDYwLCAgOTQsICA4NSwgIDQ4LCAgODEsCisgICAgNjksICAzNSwgIDY1LCAgNTMsICAxOSwgIDQ5LCAgMzIsICAwLCAgIDI4LCAgMCwgICAwLCAgIDAsICAgMTQ2LCA5MiwgIDEyNCwKKyAgICAxMzAsIDgxLCAgMTEwLCAxMTUsIDcxLCAgOTgsICAxMDAsIDYwLCAgODQsICA4NSwgIDQ5LCAgNzEsICA2OSwgIDM2LCAgNTcsCisgICAgNTMsICAyMSwgIDQyLCAgMzIsICAwLCAgIDIxLCAgMCwgICAwLCAgIDAsICAgMTQ3LCA5MSwgIDExMCwgMTMwLCA4MSwgIDk3LAorICAgIDExNSwgNzEsICA4NiwgIDEwMCwgNjAsICA3NCwgIDg0LCAgNDksICA2MiwgIDY5LCAgMzYsICA0OCwgIDUzLCAgMjIsICAzNCwKKyAgICAzMiwgIDAsICAgMTMsICAwLCAgIDAsICAgMCwgICAxNDcsIDkyLCAgOTcsICAxMzAsIDgxLCAgODUsICAxMTYsIDcyLCAgNzYsCisgICAgMTAwLCA2MCwgIDYzLCAgODUsICA0OSwgIDUyLCAgNjksICAzNywgIDQwLCAgNTMsICAyMiwgIDI2LCAgMzEsICAxLCAgIDUsCisgICAgMCwgICAwLCAgIDAsICAgMTQ4LCA5MiwgIDgyLCAgMTMxLCA4MSwgIDcxLCAgMTE2LCA3MSwgIDYyLCAgMTAwLCA2MCwgIDUzLAorICAgIDg0LCAgNDksICA0MiwgIDY5LCAgMzcsICAzMCwgIDUyLCAgMjMsICAxNiwgIDMxLCAgMiwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDE0OCwgOTEsICA2NywgIDEzMiwgODEsICA1NywgIDExNywgNzEsICA0OSwgIDEwMCwgNjAsICAzOSwgIDg0LCAgNDksICAzMCwKKyAgICA2OSwgIDM3LCAgMTgsICA1MiwgIDIzLCAgMiwgICAzMCwgIDIsICAgMCwgICAwLCAgIDAsICAgMCwgICAxNDksIDkxLCAgNTQsCisgICAgMTMyLCA4MSwgIDQ2LCAgMTE4LCA3MSwgIDM5LCAgMTAxLCA2MCwgIDI5LCAgODUsICA0OSwgIDE5LCAgNjksICAzNywgIDYsCisgICAgNTIsICAyMywgIDAsICAgMjksICAzLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTQzLCA2OCwgIDE1MywgMTI4LCA1OSwgIDEzNywKKyAgICAxMTUsIDQ5LCAgMTIyLCA5OSwgIDM5LCAgMTA3LCA4NSwgIDI4LCAgOTEsICA3MCwgIDEzLCAgNzUsICA1NCwgIDAsICAgNTgsCisgICAgMzIsICAwLCAgIDM2LCAgMCwgICAwLCAgIDAsICAgMTQ2LCA2OCwgIDE0MCwgMTMxLCA1OSwgIDEyNSwgMTE2LCA1MSwgIDExMSwKKyAgICAxMDAsIDQwLCAgOTcsICA4NSwgIDI5LCAgODIsICA3MCwgIDE1LCAgNjcsICA1NCwgIDAsICAgNTAsICAzMiwgIDAsICAgMjksCisgICAgMCwgICAwLCAgIDAsICAgMTQ3LCA2OCwgIDEyNywgMTMxLCA1OSwgIDExNCwgMTE3LCA1MSwgIDEwMiwgMTAxLCA0MSwgIDg4LAorICAgIDg2LCAgMzAsICA3NCwgIDcwLCAgMTcsICA2MCwgIDU0LCAgMCwgICA0NCwgIDMyLCAgMCwgICAyMywgIDAsICAgMCwgICAwLAorICAgIDE0NywgNzAsICAxMTUsIDEzMSwgNjAsICAxMDMsIDExNiwgNTIsICA5MSwgIDEwMCwgNDIsICA3OCwgIDg1LCAgMzIsICA2NSwKKyAgICA3MCwgIDE5LCAgNTMsICA1NCwgIDEsICAgMzgsICAzMiwgIDAsICAgMTcsICAwLCAgIDAsICAgMCwgICAxNDcsIDcwLCAgMTAzLAorICAgIDEzMSwgNjEsICA5MSwgIDExNywgNTMsICA4MSwgIDEwMSwgNDMsICA2OSwgIDg2LCAgMzIsICA1NywgIDcwLCAgMjAsICA0NCwKKyAgICA1NCwgIDIsICAgMzAsICAzMiwgIDAsICAgNywgICAwLCAgIDAsICAgMCwgICAxNDgsIDcwLCAgOTEsICAxMzIsIDYxLCAgODAsCisgICAgMTE3LCA1MiwgIDcwLCAgMTAxLCA0MywgIDU5LCAgODUsICAzMywgIDQ4LCAgNzAsICAyMSwgIDM2LCAgNTMsICA0LCAgIDIyLAorICAgIDMyLCAgMCwgICAzLCAgIDAsICAgMCwgICAwLCAgIDE0OCwgNzAsICA3OCwgIDEzMiwgNjIsICA2OCwgIDExNywgNTMsICA1OCwKKyAgICAxMDEsIDQzLCAgNDgsICA4NSwgIDM0LCAgMzgsICA3MCwgIDIyLCAgMjYsICA1MywgIDYsICAgMTIsICAzMSwgIDAsICAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAxNDksIDcxLCAgNjQsICAxMzIsIDYyLCAgNTQsICAxMTgsIDU0LCAgNDYsICAxMDEsIDQ0LCAgMzcsCisgICAgODUsICAzNCwgIDI3LCAgNjksICAyMywgIDE1LCAgNTMsICA3LCAgIDEsICAgMzAsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMTUwLCA3MCwgIDUzLCAgMTM0LCA2MSwgIDQ0LCAgMTE4LCA1NCwgIDM2LCAgMTAxLCA0NCwgIDI4LCAgODUsICAzNSwgIDE3LAorICAgIDY5LCAgMjMsICA0LCAgIDUyLCAgOCwgICAwLCAgIDMwLCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDE0NSwgMzgsICAxNDMsCisgICAgMTMwLCAyOSwgIDEyOCwgMTE3LCAxOCwgIDExNCwgMTAxLCAzLCAgIDk4LCAgODcsICAwLCAgIDg0LCAgNzIsICAwLCAgIDY5LAorICAgIDU0LCAgMCwgICA1MywgIDMwLCAgMCwgICAzMSwgIDAsICAgMCwgICAwLCAgIDE0NywgMzgsICAxMzAsIDEzMiwgMzAsICAxMTYsCisgICAgMTE3LCAyMiwgIDEwMywgMTAxLCA4LCAgIDg5LCAgODcsICAwLCAgIDc2LCAgNzIsICAwLCAgIDYyLCAgNTQsICAwLCAgIDQ2LAorICAgIDMwLCAgMCwgICAyNCwgIDAsICAgMCwgICAwLCAgIDE0OCwgNDAsICAxMTksIDEzMiwgMzEsICAxMDUsIDExNywgMjMsICA5NCwKKyAgICAxMDEsIDEzLCAgODEsICA4NywgIDAsICAgNjgsICA3MSwgIDAsICAgNTUsICA1NCwgIDAsICAgMzksICAzMCwgIDAsICAgMTgsCisgICAgMCwgICAwLCAgIDAsICAgMTQ4LCA0MiwgIDEwOCwgMTMyLCAzNCwgIDk2LCAgMTE3LCAyNSwgIDg1LCAgMTAyLCAxNSwgIDczLAorICAgIDg2LCAgMiwgICA2MCwgIDcxLCAgMCwgICA0NywgIDU0LCAgMCwgICAzMywgIDMwLCAgMCwgICAxMSwgIDAsICAgMCwgICAwLAorICAgIDE0OCwgNDMsICA5NiwgIDEzMywgMzUsICA4NSwgIDExNywgMjgsICA3NSwgIDEwMiwgMTgsICA2NCwgIDg3LCAgNSwgICA1MiwKKyAgICA3MSwgIDAsICAgNDAsICA1NCwgIDAsICAgMjUsICAzMCwgIDAsICAgNSwgICAwLCAgIDAsICAgMCwgICAxNDksIDQ0LCAgODUsCisgICAgMTMyLCAzNiwgIDc1LCAgMTE4LCAyOSwgIDY2LCAgMTAxLCAyMCwgIDU1LCAgODYsICA4LCAgIDQ0LCAgNzAsICAwLCAgIDMyLAorICAgIDUzLCAgMCwgICAxOCwgIDI5LCAgMCwgICAyLCAgIDAsICAgMCwgICAwLCAgIDE0OSwgNDUsICA3NCwgIDEzMywgMzcsICA2NCwKKyAgICAxMTgsIDMxLCAgNTUsICAxMDIsIDIxLCAgNDUsICA4NSwgIDEwLCAgMzQsICA3MCwgIDAsICAgMjIsICA1MywgIDAsICAgNiwKKyAgICAyOCwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxNTAsIDQ2LCAgNjEsICAxMzMsIDM5LCAgNTIsICAxMTgsIDMxLCAgNDQsCisgICAgMTAyLCAyMywgIDM0LCAgODUsICAxMiwgIDI0LCAgNzAsICAwLCAgIDEyLCAgNTIsICAwLCAgIDAsICAgMjgsICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMTUwLCA0NiwgIDUxLCAgMTMzLCA0MCwgIDQyLCAgMTE5LCAzMiwgIDM1LCAgMTAyLCAyNCwgIDI1LAorICAgIDg1LCAgMTMsICAxNCwgIDcwLCAgMCwgICAxLCAgIDUyLCAgMCwgICAwLCAgIDI3LCAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDUzLCAgMTk4LCAyNDQsIDQ5LCAgMTc3LCAyMTgsIDQxLCAgMTU4LCAxOTUsIDMyLCAgMTM4LCAxNzEsIDIyLCAgMTE4LCAxNDcsCisgICAgMTEsICA5OCwgIDEyNCwgMCwgICA3OCwgIDEwMCwgMCwgICA1NCwgIDcxLCAgMCwgICAxOCwgIDM0LCAgNjksICAxOTYsIDIyMCwKKyAgICA2NCwgIDE3NSwgMTk2LCA1NCwgIDE1NywgMTc2LCA0NSwgIDEzNywgMTU0LCAzMiwgIDExNywgMTMzLCAxOSwgIDk4LCAgMTExLAorICAgIDAsICAgNzgsICA4OSwgIDAsICAgNTMsICA2MywgIDAsICAgMTcsICAyNywgIDgwLCAgMTk1LCAxOTgsIDY5LCAgMTc1LCAxNzksCisgICAgNjAsICAxNTYsIDE1OSwgNTAsICAxMzYsIDEzOSwgMzgsICAxMTYsIDEyMCwgMjUsICA5OCwgIDEwMSwgNCwgICA3NywgIDgwLAorICAgIDAsICAgNTMsICA1NSwgIDAsICAgMTcsICAyMSwgIDg0LCAgMTkzLCAxNzcsIDc1LCAgMTczLCAxNTksIDY0LCAgMTU1LCAxNDIsCisgICAgNTUsICAxMzUsIDEyNCwgNDEsICAxMTYsIDEwNywgMjcsICA5NywgIDg5LCAgOSwgICA3NiwgIDcwLCAgMCwgICA1MywgIDQ3LAorICAgIDAsICAgMTcsICAxMSwgIDg5LCAgMTkzLCAxNTcsIDc5LCAgMTcyLCAxNDAsIDcwLCAgMTU0LCAxMjUsIDU3LCAgMTM0LCAxMDksCisgICAgNDQsICAxMTUsIDkyLCAgMzIsICA5NiwgIDc2LCAgMTMsICA3NiwgIDU5LCAgMCwgICA1MiwgIDM5LCAgMCwgICAxNiwgIDQsCisgICAgOTQsICAxOTEsIDEzNSwgODUsICAxNzEsIDEyMSwgNzIsICAxNTIsIDEwOCwgNjAsICAxMzMsIDk0LCAgNDcsICAxMTQsIDgwLAorICAgIDMyLCAgOTUsICA2NSwgIDE1LCAgNzYsICA0OSwgIDAsICAgNTIsICAyOSwgIDAsICAgMTYsICAwLCAgIDk4LCAgMTkwLCAxMTMsCisgICAgODcsICAxNzAsIDEwMCwgNzYsICAxNTIsIDg5LCAgNjIsICAxMzIsIDc3LCAgNDksICAxMTMsIDY1LCAgMzUsICA5NSwgIDUyLAorICAgIDE4LCAgNzUsICAzNywgIDAsICAgNTIsICAxOCwgIDAsICAgMTUsICAwLCAgIDEwMywgMTkwLCA4OSwgIDkwLCAgMTY5LCA4MCwKKyAgICA3OCwgIDE1MSwgNzAsICA2NCwgIDEzMiwgNjAsICA1MSwgIDExMywgNDksICAzNywgIDk0LCAgMzgsICAyMCwgIDc1LCAgMjUsCisgICAgMCwgICA1MiwgIDUsICAgMCwgICAxNSwgIDAsICAgMTA2LCAxODksIDY5LCAgOTMsICAxNjksIDYxLCAgODAsICAxNTEsIDUzLAorICAgIDY2LCAgMTMxLCA0NSwgIDUyLCAgMTEzLCAzNiwgIDM3LCAgOTQsICAyNSwgIDE5LCAgNzQsICAxMSwgIDAsICAgNTEsICAwLAorICAgIDAsICAgMTUsICAwLCAgIDc2LCAgMTc4LCAyMjksIDY4LCAgMTU5LCAyMDUsIDYxLCAgMTQyLCAxODMsIDUwLCAgMTI0LCAxNjAsCisgICAgNDAsICAxMDYsIDEzOCwgMjgsICA4OCwgIDExNiwgMTIsICA2OSwgIDkzLCAgMCwgICA0NSwgIDY2LCAgMCwgICA1LCAgIDI5LAorICAgIDg2LCAgMTc3LCAyMDcsIDc4LCAgMTU4LCAxODQsIDY3LCAgMTQyLCAxNjYsIDU2LCAgMTIzLCAxNDUsIDQ1LCAgMTA2LCAxMjUsCisgICAgMzEsICA4OCwgIDEwNSwgMTYsICA2OSwgIDgzLCAgMCwgICA0NSwgIDU4LCAgMCwgICA2LCAgIDIyLCAgOTMsICAxNzYsIDE4NywKKyAgICA4MSwgIDE1OCwgMTY4LCA3MSwgIDE0MSwgMTUwLCA2MSwgIDEyMywgMTMxLCA0NywgIDEwNSwgMTEzLCAzNSwgIDg3LCAgOTQsCisgICAgMjAsICA2OCwgIDc0LCAgMCwgICA0NSwgIDUxLCAgMCwgICA1LCAgIDE2LCAgOTgsICAxNzUsIDE2OCwgODQsICAxNTcsIDE1MCwKKyAgICA3NSwgIDE0MCwgMTM0LCA2MywgIDEyMiwgMTE3LCA1MCwgIDEwNCwgMTAwLCAzNywgIDg3LCAgODMsICAyMSwgIDY4LCAgNjUsCisgICAgMCwgICA0NSwgIDQyLCAgMCwgICA0LCAgIDcsICAgMTAwLCAxNzQsIDE0OSwgODksICAxNTUsIDEzMiwgNzYsICAxMzksIDExNywKKyAgICA2NSwgIDEyMSwgMTAyLCA1MywgIDEwNCwgODcsICAzOSwgIDg2LCAgNzIsICAyMywgIDY3LCAgNTUsICAwLCAgIDQ1LCAgMzQsCisgICAgMCwgICAzLCAgIDAsICAgMTAzLCAxNzMsIDEzMCwgOTIsICAxNTUsIDExNSwgODAsICAxMzgsIDEwMiwgNjgsICAxMjAsIDg4LAorICAgIDUzLCAgMTAzLCA3NSwgIDQwLCAgODYsICA2MSwgIDI0LCAgNjcsICA0NSwgIDAsICAgNDUsICAyNSwgIDAsICAgMywgICAwLAorICAgIDEwNywgMTcyLCAxMDgsIDk1LCAgMTU0LCA5NiwgIDgyLCAgMTM3LCA4NSwgIDcwLCAgMTE5LCA3MywgIDU1LCAgMTAyLCA2MSwKKyAgICA0MiwgIDg1LCAgNDksICAyNSwgIDY3LCAgMzQsICAwLCAgIDQ1LCAgMTQsICAwLCAgIDMsICAgMCwgICAxMTAsIDE3MiwgODYsCisgICAgOTcsICAxNTMsIDc2LCAgODUsICAxMzcsIDY3LCAgNzAsICAxMTksIDU3LCAgNTYsICAxMDIsIDQ2LCAgNDIsICA4NCwgIDM1LAorICAgIDI2LCAgNjYsICAyMSwgIDAsICAgNDQsICAxLCAgIDAsICAgMywgICAwLCAgIDExMiwgMTcxLCA2NywgIDk4LCAgMTUzLCA1OSwKKyAgICA4NiwgIDEzNywgNTIsICA3MSwgIDExOSwgNDQsICA1OCwgIDEwMiwgMzQsICA0NCwgIDg1LCAgMjIsICAyNywgIDY2LCAgNywKKyAgICAwLCAgIDQ0LCAgMCwgICAwLCAgIDMsICAgMCwgICA5MCwgIDE2MCwgMjE1LCA4MSwgIDE0NCwgMTkzLCA3MCwgIDEyOSwgMTczLAorICAgIDYxLCAgMTEyLCAxNTEsIDQ5LCAgOTUsICAxMzEsIDM3LCAgNzksICAxMDksIDIyLCAgNjEsICA4NywgIDAsICAgMzgsICA2MSwKKyAgICAwLCAgIDAsICAgMjUsICA5NiwgIDE2MCwgMTk0LCA4NiwgIDE0MywgMTc0LCA3NSwgIDEyOCwgMTU3LCA2NSwgIDExMiwgMTM3LAorICAgIDUzLCAgOTUsICAxMTcsIDQwLCAgNzgsICA5OCwgIDI1LCAgNjAsICA3OCwgIDAsICAgMzgsICA1MywgIDAsICAgMCwgICAxNywKKyAgICAxMDAsIDE1OSwgMTc3LCA4OSwgIDE0MywgMTU5LCA3OSwgIDEyOCwgMTQzLCA2NywgIDExMSwgMTI0LCA1NSwgIDk1LCAgMTA3LAorICAgIDQyLCAgNzgsICA4OSwgIDI3LCAgNjAsICA3MCwgIDIsICAgMzgsICA0NiwgIDAsICAgMCwgICA5LCAgIDEwNCwgMTU4LCAxNTksCisgICAgOTIsICAxNDIsIDE0MywgODEsICAxMjcsIDEyNywgNjksICAxMTAsIDExMCwgNTYsICA5NCwgIDk0LCAgNDMsICA3OCwgIDc4LAorICAgIDI4LCAgNjAsICA2MCwgIDIsICAgMzgsICAzOCwgIDAsICAgMCwgICAxLCAgIDEwNywgMTU3LCAxNDAsIDk0LCAgMTQxLCAxMjUsCisgICAgODIsICAxMjYsIDExMiwgNzEsICAxMTAsIDk3LCAgNTksICA5NCwgIDgyLCAgNDUsICA3NywgIDY3LCAgMjksICA1OSwgIDUxLAorICAgIDQsICAgMzcsICAzMCwgIDAsICAgMCwgICAwLCAgIDExMCwgMTU2LCAxMjIsIDk3LCAgMTQwLCAxMDksIDg1LCAgMTI1LCA5NywKKyAgICA3MiwgIDEwOSwgODMsICA1OCwgIDkzLCAgNzEsICA0NSwgIDc3LCAgNTcsICAyOSwgIDYwLCAgNDIsICA1LCAgIDM4LCAgMjIsCisgICAgMCwgICAwLCAgIDAsICAgMTExLCAxNTYsIDEwMywgOTksICAxMzksIDkxLCAgODcsICAxMjUsIDgxLCAgNzMsICAxMDgsIDY5LAorICAgIDYwLCAgOTIsICA1OCwgIDQ2LCAgNzcsICA0NSwgIDMwLCAgNTksICAzMSwgIDUsICAgMzgsICAxMiwgIDAsICAgMCwgICAwLAorICAgIDExNSwgMTU2LCA4MiwgIDEwMSwgMTQwLCA3MywgIDg4LCAgMTI0LCA2MywgIDc0LCAgMTA4LCA1MywgIDYwLCAgOTIsICA0NCwKKyAgICA0NiwgIDc2LCAgMzIsICAzMSwgIDU5LCAgMTgsICA2LCAgIDM3LCAgMCwgICAwLCAgIDAsICAgMCwgICAxMTYsIDE1NSwgNjUsCisgICAgMTAyLCAxMzksIDU4LCAgODksICAxMjQsIDQ5LCAgNzUsICAxMDgsIDQxLCAgNjEsICA5MiwgIDMyLCAgNDgsICA3NiwgIDIxLAorICAgIDMxLCAgNTksICA2LCAgIDUsICAgMzcsICAwLCAgIDAsICAgMCwgICAwLCAgIDEwMCwgMTQxLCAyMDEsIDg4LCAgMTI3LCAxODEsCisgICAgNzksICAxMTQsIDE2MiwgNjksICA5OSwgIDE0MiwgNTcsICA4MywgIDEyMiwgNDQsICA2OCwgIDEwMiwgMzAsICA1MSwgIDgxLAorICAgIDcsICAgMjgsICA1NiwgIDAsICAgMCwgICAxOSwgIDEwNSwgMTQxLCAxODIsIDk0LCAgMTI3LCAxNjMsIDgzLCAgMTE0LCAxNDYsCisgICAgNzEsICA5OCwgIDEyOCwgNTksICA4MywgIDExMCwgNDYsICA2OCwgIDkxLCAgMzEsICA1MSwgIDcyLCAgMTAsICAyOCwgIDQ4LAorICAgIDAsICAgMCwgICAxMSwgIDEwOCwgMTQxLCAxNjYsIDk2LCAgMTI3LCAxNDksIDg1LCAgMTEzLCAxMzMsIDczLCAgOTgsICAxMTYsCisgICAgNjAsICA4MywgIDk5LCAgNDYsICA2OCwgIDgyLCAgMzIsICA1MSwgIDY0LCAgMTEsICAyOSwgIDQxLCAgMCwgICAwLCAgIDIsCisgICAgMTExLCAxNDEsIDE0OSwgOTgsICAxMjYsIDEzNCwgODgsICAxMTIsIDExOSwgNzQsICA5NywgIDEwMywgNjEsICA4MywgIDg4LAorICAgIDQ4LCAgNjcsICA3MiwgIDMzLCAgNTEsICA1NiwgIDExLCAgMjksICAzNCwgIDAsICAgMCwgICAwLCAgIDExMiwgMTQwLCAxMzIsCisgICAgMTAwLCAxMjUsIDExOCwgODksICAxMTIsIDEwNSwgNzUsICA5NywgIDkxLCAgNjIsICA4MiwgIDc3LCAgNDksICA2OCwgIDYyLAorICAgIDMzLCAgNTEsICA0NywgIDEyLCAgMjksICAyNiwgIDAsICAgMCwgICAwLCAgIDExNSwgMTQwLCAxMTYsIDEwMiwgMTI1LCAxMDMsCisgICAgOTAsICAxMTEsIDkxLCAgNzYsICA5NiwgIDc4LCAgNjIsICA4MiwgIDY1LCAgNDksICA2NywgIDUyLCAgMzQsICA1MSwgIDM4LAorICAgIDEzLCAgMjksICAxOCwgIDAsICAgMCwgICAwLCAgIDExNywgMTM5LCA5NywgIDEwMywgMTI0LCA4NywgIDkxLCAgMTExLCA3NywKKyAgICA3OCwgIDk2LCAgNjUsICA2MywgIDgxLCAgNTQsICA0OSwgIDY3LCAgNDEsICAzNCwgIDUxLCAgMjcsICAxMiwgIDI5LCAgNywKKyAgICAwLCAgIDAsICAgMCwgICAxMTksIDEzOCwgNzgsICAxMDUsIDEyNCwgNjksICA5MiwgIDExMCwgNjAsICA3OCwgIDk1LCAgNTAsCisgICAgNjUsICA4MSwgIDQwLCAgNTAsICA2NywgIDI5LCAgMzQsICA1MSwgIDE1LCAgMTMsICAzMCwgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMTIwLCAxMzgsIDY0LCAgMTA2LCAxMjQsIDU0LCAgOTMsICAxMTAsIDQ3LCAgNzgsICA5NSwgIDM4LCAgNjUsICA4MSwgIDI5LAorICAgIDUwLCAgNjYsICAxNywgIDM0LCAgNTAsICAyLCAgIDEzLCAgMjksICAwLCAgIDAsICAgMCwgICAwLCAgIDEwNywgMTI0LCAxODksCisgICAgOTYsICAxMTEsIDE2OSwgODUsICA5OSwgIDE1MiwgNzMsICA4NSwgIDEzMiwgNjEsICA3MSwgIDExNCwgNDgsICA1NywgIDk1LAorICAgIDM0LCAgNDEsICA3NSwgIDE0LCAgMTgsICA1MSwgIDAsICAgMCwgICAxMywgIDExMSwgMTI0LCAxNzEsIDEwMCwgMTExLCAxNTMsCisgICAgODgsICA5OSwgIDEzNywgNzUsICA4NSwgIDEyMCwgNjMsICA3MiwgIDEwMywgNTAsICA1OCwgIDg1LCAgMzYsICA0MSwgIDY2LAorICAgIDE1LCAgMTksICA0MywgIDAsICAgMCwgICA0LCAgIDExMywgMTI0LCAxNTYsIDEwMSwgMTExLCAxMzksIDkwLCAgOTksICAxMjUsCisgICAgNzcsICA4NSwgIDEwOSwgNjQsICA3MSwgIDkzLCAgNTEsICA1NywgIDc3LCAgMzYsICA0MiwgIDU5LCAgMTcsICAyMCwgIDM3LAorICAgIDAsICAgMCwgICAwLCAgIDExNSwgMTI0LCAxNDAsIDEwMywgMTExLCAxMjUsIDkwLCAgOTksICAxMTIsIDc4LCAgODUsICA5NywKKyAgICA2NCwgIDcxLCAgODIsICA1MiwgIDU3LCAgNjcsICAzNiwgIDQyLCAgNTAsICAxNiwgIDIwLCAgMzAsICAwLCAgIDAsICAgMCwKKyAgICAxMTcsIDEyMywgMTI1LCAxMDQsIDExMCwgMTExLCA5MiwgIDk4LCAgOTksICA3OSwgIDg1LCAgODYsICA2NSwgIDcxLCAgNzIsCisgICAgNTEsICA1OCwgIDU5LCAgMzcsICA0MiwgIDQzLCAgMTcsICAyMSwgIDIyLCAgMCwgICAwLCAgIDAsICAgMTE4LCAxMjMsIDExMCwKKyAgICAxMDUsIDExMCwgOTcsICA5MywgIDk4LCAgODYsICA3OCwgIDg0LCAgNzQsICA2NiwgIDcxLCAgNjIsICA1MiwgIDU3LCAgNDksCisgICAgMzcsICA0MiwgIDM0LCAgMTcsICAyMiwgIDE0LCAgMCwgICAwLCAgIDAsICAgMTIwLCAxMjMsIDkzLCAgMTA2LCAxMDksIDgyLAorICAgIDk0LCAgOTcsICA3MiwgIDgwLCAgODQsICA2MSwgIDY2LCAgNzEsICA1MCwgIDUyLCAgNTcsICAzOCwgIDM3LCAgNDIsICAyNCwKKyAgICAxNywgIDIyLCAgMiwgICAwLCAgIDAsICAgMCwgICAxMjEsIDEyMiwgNzUsICAxMDgsIDEwOSwgNjYsICA5NSwgIDk3LCAgNTgsCisgICAgODAsICA4NCwgIDQ4LCAgNjYsICA3MSwgIDM3LCAgNTIsICA1NywgIDI2LCAgMzcsICA0MiwgIDEyLCAgMTYsICAyMiwgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMTIyLCAxMjMsIDYyLCAgMTA4LCAxMDksIDUyLCAgOTUsICA5NywgIDQ1LCAgODEsICA4NCwgIDM2LAorICAgIDY3LCAgNzAsICAyNiwgIDUyLCAgNTcsICAxNCwgIDM3LCAgNDIsICAwLCAgIDE1LCAgMjIsICAwLCAgIDAsICAgMCwgICAwLAorICAgIDExMywgMTA3LCAxNzcsIDEwMiwgOTYsICAxNTksIDg5LCAgODUsICAxNDEsIDc4LCAgNzIsICAxMjQsIDY1LCAgNjAsICAxMDcsCisgICAgNTIsICA0NiwgIDg5LCAgMzcsICAzMCwgIDcwLCAgMTgsICA1LCAgIDQ2LCAgMCwgICAwLCAgIDYsICAgMTE2LCAxMDcsIDE2MCwKKyAgICAxMDQsIDk2LCAgMTQ0LCA5MiwgIDg1LCAgMTI5LCA4MCwgIDcyLCAgMTEyLCA2NywgIDYwLCAgOTYsICA1MywgIDQ3LCAgODAsCisgICAgMzgsICAzMSwgIDYyLCAgMTksICA3LCAgIDM5LCAgMCwgICAwLCAgIDAsICAgMTE4LCAxMDcsIDE0NywgMTA1LCA5NiwgIDEzMSwKKyAgICA5MywgIDg1LCAgMTE4LCA4MCwgIDcyLCAgMTAxLCA2NywgIDYwLCAgODcsICA1NCwgIDQ3LCAgNzEsICAzOSwgIDMxLCAgNTQsCisgICAgMTksICA4LCAgIDMyLCAgMCwgICAwLCAgIDAsICAgMTE5LCAxMDcsIDEzMiwgMTA2LCA5NiwgIDExOCwgOTQsICA4NSwgIDEwNiwKKyAgICA4MSwgIDczLCAgOTEsICA2NywgIDYwLCAgNzcsICA1NCwgIDQ3LCAgNjMsICAzOSwgIDMyLCAgNDcsICAyMCwgIDksICAgMjUsCisgICAgMCwgICAwLCAgIDAsICAgMTE5LCAxMDcsIDExOCwgMTA2LCA5NSwgIDEwNSwgOTQsICA4NSwgIDkzLCAgODEsICA3MiwgIDgwLAorICAgIDY4LCAgNjAsICA2OCwgIDU0LCAgNDcsICA1NCwgIDM5LCAgMzIsICAzOSwgIDIwLCAgMTEsICAxOCwgIDAsICAgMCwgICAwLAorICAgIDEyMSwgMTA3LCAxMDQsIDEwNywgOTYsICA5MiwgIDk1LCAgODQsICA4MCwgIDgxLCAgNzIsICA2OSwgIDY4LCAgNjEsICA1OCwKKyAgICA1NCwgIDQ4LCAgNDYsICAzOSwgIDMzLCAgMzEsICAyMCwgIDEyLCAgOSwgICAwLCAgIDAsICAgMCwgICAxMjMsIDEwNywgODgsCisgICAgMTA4LCA5NSwgIDc3LCAgOTYsICA4NCwgIDY4LCAgODIsICA3MiwgIDU3LCAgNjgsICA2MCwgIDQ2LCAgNTQsICA0NywgIDM1LAorICAgIDM5LCAgMzMsICAyMCwgIDE5LCAgMTMsICAyLCAgIDAsICAgMCwgICAwLCAgIDEyMywgMTA2LCA3MiwgIDExMCwgOTUsICA2MywKKyAgICA5NiwgIDg0LCAgNTQsICA4MiwgIDcyLCAgNDUsICA2OSwgIDYwLCAgMzUsICA1NSwgIDQ4LCAgMjMsICAzOSwgIDMzLCAgOSwKKyAgICAxOCwgIDE0LCAgMCwgICAwLCAgIDAsICAgMCwgICAxMjUsIDEwNiwgNjAsICAxMTAsIDk0LCAgNTAsICA5OCwgIDg0LCAgNDIsCisgICAgODMsICA3MiwgIDM0LCAgNjksICA2MCwgIDI1LCAgNTUsICA0OCwgIDEyLCAgMzksICAzMywgIDAsICAgMTcsICAxMywgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMTE4LCA4OSwgIDE2NSwgMTA1LCA3OSwgIDE0OCwgOTMsICA2OSwgIDEzMiwgODEsICA1NywgIDExNSwKKyAgICA2OCwgIDQ1LCAgOTksICA1NSwgIDMyLCAgODIsICA0MSwgIDE1LCAgNjQsICAyMSwgIDAsICAgNDEsICAwLCAgIDAsICAgMCwKKyAgICAxMjAsIDg5LCAgMTUwLCAxMDcsIDc5LCAgMTM1LCA5NiwgIDY5LCAgMTIxLCA4MiwgIDU4LCAgMTA1LCA3MCwgIDQ2LCAgODksCisgICAgNTYsICAzNCwgIDczLCAgNDEsICAxNywgIDU2LCAgMjEsICAwLCAgIDM0LCAgMCwgICAwLCAgIDAsICAgMTIxLCA4OSwgIDEzNywKKyAgICAxMDgsIDc5LCAgMTIzLCA5NiwgIDY5LCAgMTA5LCA4MiwgIDU4LCAgOTUsICA3MCwgIDQ3LCAgODEsICA1NiwgIDM0LCAgNjYsCisgICAgNDEsICAxOCwgIDQ5LCAgMjEsICAwLCAgIDI4LCAgMCwgICAwLCAgIDAsICAgMTIyLCA5MCwgIDEyNCwgMTA5LCA3OSwgIDExMCwKKyAgICA5NiwgIDY5LCAgOTksICA4MywgIDU4LCAgODUsICA3MCwgIDQ3LCAgNzIsICA1NiwgIDM1LCAgNTgsICA0MSwgIDE5LCAgNDIsCisgICAgMjEsICAwLCAgIDIyLCAgMCwgICAwLCAgIDAsICAgMTIzLCA5MCwgIDExMSwgMTEwLCA3OSwgIDk4LCAgOTcsICA2OSwgIDg3LAorICAgIDgzLCAgNTksICA3NSwgIDcwLCAgNDcsICA2MywgIDU2LCAgMzUsICA1MCwgIDQxLCAgMjAsICAzNSwgIDIxLCAgMCwgICAxNCwKKyAgICAwLCAgIDAsICAgMCwgICAxMjMsIDkwLCAgOTgsICAxMTAsIDc5LCAgODcsICA5NywgIDcwLCAgNzYsICA4NCwgIDU4LCAgNjQsCisgICAgNzAsICA0OCwgIDUzLCAgNTYsICAzNiwgIDQxLCAgNDAsICAyMSwgIDI2LCAgMjEsICAwLCAgIDUsICAgMCwgICAwLCAgIDAsCisgICAgMTI1LCA4OSwgIDg0LCAgMTExLCA3OSwgIDczLCAgOTcsICA2OSwgIDY0LCAgODQsICA1OSwgIDU0LCAgNzAsICA0OCwgIDQzLAorICAgIDU2LCAgMzYsICAzMSwgIDQwLCAgMjIsICAxNywgIDIwLCAgMSwgICAxLCAgIDAsICAgMCwgICAwLCAgIDEyNSwgODksICA2OSwKKyAgICAxMTIsIDc5LCAgNjAsICA5OCwgIDcwLCAgNTEsICA4NCwgIDU5LCAgNDIsICA3MCwgIDQ4LCAgMzIsICA1NiwgIDM2LCAgMjAsCisgICAgNDEsICAyMiwgIDUsICAgMTksICAyLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTI2LCA4OSwgIDU3LCAgMTEyLCA3OSwgIDQ5LAorICAgIDk5LCAgNzAsICA0MSwgIDg0LCAgNTksICAzMiwgIDcwLCAgNDgsICAyMiwgIDU2LCAgMzYsICAxMCwgIDQwLCAgMjIsICAwLAorICAgIDE4LCAgMiwgICAwLCAgIDAsICAgMCwgICAwLCAgIDEyMSwgNjcsICAxNTQsIDEwOCwgNTgsICAxMzgsIDk3LCAgNTAsICAxMjQsCisgICAgODQsICAzOSwgIDEwNywgNzEsICAyOCwgIDkyLCAgNTgsICAxMiwgIDc2LCAgNDMsICAwLCAgIDU5LCAgMjAsICAwLCAgIDM3LAorICAgIDAsICAgMCwgICAwLCAgIDEyNCwgNjgsICAxNDAsIDExMSwgNTksICAxMjYsIDk4LCAgNTAsICAxMTIsIDg0LCAgNDAsICA5OCwKKyAgICA3MSwgIDI5LCAgODMsICA1OCwgIDE1LCAgNjcsICA0MiwgIDAsICAgNTEsICAyMCwgIDAsICAgMzAsICAwLCAgIDAsICAgMCwKKyAgICAxMjQsIDY4LCAgMTI5LCAxMTEsIDU5LCAgMTE0LCA5OSwgIDUxLCAgMTAyLCA4NiwgIDQxLCAgODgsICA3MSwgIDMwLCAgNzUsCisgICAgNTgsICAxNywgIDYwLCAgNDIsICAwLCAgIDQ1LCAgMjAsICAwLCAgIDI0LCAgMCwgICAwLCAgIDAsICAgMTI1LCA3MCwgIDExNiwKKyAgICAxMTEsIDYwLCAgMTAzLCA5OSwgIDUxLCAgOTIsICA4NSwgIDQxLCAgNzksICA3MSwgIDMxLCAgNjYsICA1OCwgIDE5LCAgNTMsCisgICAgNDIsICAzLCAgIDM4LCAgMjAsICAwLCAgIDE3LCAgMCwgICAwLCAgIDAsICAgMTI1LCA3MCwgIDEwNCwgMTExLCA2MSwgIDkzLAorICAgIDk5LCAgNTIsICA4MSwgIDg1LCAgNDMsICA2OSwgIDcyLCAgMzIsICA1OCwgIDU4LCAgMjAsICA0NSwgIDQyLCAgNCwgICAzMSwKKyAgICAyMCwgIDAsICAgOCwgICAwLCAgIDAsICAgMCwgICAxMjYsIDcwLCAgOTIsICAxMTEsIDYxLCAgODEsICA5OSwgIDUyLCAgNzEsCisgICAgODUsICA0MiwgIDYwLCAgNzEsICAzMywgIDQ5LCAgNTcsICAyMSwgIDM3LCAgNDIsICA2LCAgIDIzLCAgMjAsICAwLCAgIDMsCisgICAgMCwgICAwLCAgIDAsICAgMTI2LCA3MCwgIDc5LCAgMTEyLCA2MSwgIDcwLCAgOTksICA1MywgIDYwLCAgODUsICA0MywgIDUwLAorICAgIDcxLCAgMzMsICAzOSwgIDU3LCAgMjIsICAyOCwgIDQxLCAgNywgICAxMywgIDE5LCAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDEyNywgNzEsICA2NiwgIDExMywgNjIsICA1NiwgIDEwMCwgNTMsICA0OCwgIDg2LCAgNDQsICAzOSwgIDcxLCAgMzQsICAyOSwKKyAgICA1NywgIDIzLCAgMTgsICA0MSwgIDgsICAgMiwgICAxOCwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxMjgsIDcwLCAgNTUsCisgICAgMTE0LCA2MiwgIDQ2LCAgMTAwLCA1NCwgIDM5LCAgODYsICA0NCwgIDMwLCAgNzEsICAzNCwgIDIwLCAgNTcsICAyMywgIDcsCisgICAgNDEsICA5LCAgIDAsICAgMTgsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTI0LCA0MSwgIDE0NSwgMTExLCAzMiwgIDEyOCwKKyAgICA5OSwgIDIzLCAgMTE0LCA4NiwgIDEwLCAgMTAwLCA3MywgIDAsICAgODUsICA2MCwgIDAsICAgNzEsICA0MywgIDAsICAgNTQsCisgICAgMTcsICAwLCAgIDMyLCAgMCwgICAwLCAgIDAsICAgMTI2LCA0MiwgIDEzMSwgMTEzLCAzMywgIDExNywgMTAwLCAyNSwgIDEwNCwKKyAgICA4NiwgIDE0LCAgOTAsICA3MywgIDAsICAgNzcsICA2MCwgIDAsICAgNjMsICA0NCwgIDAsICAgNDcsICAxOCwgIDAsICAgMjUsCisgICAgMCwgICAwLCAgIDAsICAgMTI3LCA0MywgIDEyMCwgMTEzLCAzNCwgIDEwNiwgMTAxLCAyNiwgIDk1LCAgODYsICAxNywgIDgyLAorICAgIDczLCAgMiwgICA2OSwgIDU5LCAgMCwgICA1NiwgIDQzLCAgMCwgICA0MSwgIDE4LCAgMCwgICAxOSwgIDAsICAgMCwgICAwLAorICAgIDEyNywgNDUsICAxMDksIDExMywgMzcsICA5NywgIDEwMSwgMjgsICA4NSwgIDg2LCAgMTksICA3NCwgIDczLCAgNSwgICA2MSwKKyAgICA1OSwgIDAsICAgNDgsICA0MywgIDAsICAgMzQsICAxOSwgIDAsICAgMTEsICAwLCAgIDAsICAgMCwgICAxMjcsIDQ2LCAgOTgsCisgICAgMTE0LCAzOCwgIDg2LCAgMTAwLCAzMCwgIDc2LCAgODcsICAyMSwgIDY1LCAgNzMsICA5LCAgIDU0LCAgNTksICAwLCAgIDQxLAorICAgIDQzLCAgMCwgICAyNiwgIDE4LCAgMCwgICA1LCAgIDAsICAgMCwgICAwLCAgIDEyNywgNDcsICA4NywgIDExMywgMzksICA3NiwKKyAgICAxMDEsIDMxLCAgNjcsICA4NiwgIDIyLCAgNTYsICA3MiwgIDExLCAgNDUsICA1OSwgIDAsICAgMzMsICA0MywgIDAsICAgMTksCisgICAgMTgsICAwLCAgIDIsICAgMCwgICAwLCAgIDAsICAgMTI4LCA0OCwgIDc1LCAgMTE0LCAzOSwgIDY1LCAgMTAxLCAzMywgIDU2LAorICAgIDg2LCAgMjMsICA0NiwgIDcyLCAgMTIsICAzNiwgIDU4LCAgMCwgICAyNCwgIDQyLCAgMCwgICA5LCAgIDE3LCAgMCwgICAwLAorICAgIDAsICAgMCwgICAwLCAgIDEyOSwgNDgsICA2MywgIDExNCwgNDEsICA1NCwgIDEwMiwgMzMsICA0NiwgIDg3LCAgMjQsICAzNiwKKyAgICA3MiwgIDE0LCAgMjYsICA1OCwgIDEsICAgMTQsICA0MiwgIDAsICAgMiwgICAxNiwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAxMjgsIDQ4LCAgNTMsICAxMTQsIDQxLCAgNDQsICAxMDIsIDM0LCAgMzcsICA4NywgIDI1LCAgMjcsICA3MiwgIDE1LCAgMTcsCisgICAgNTgsICAxLCAgIDMsICAgNDEsICAwLCAgIDAsICAgMTUsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxODksIDI0MiwKKyAgICAwLCAgIDE2OSwgMjE3LCAwLCAgIDE1MSwgMTk0LCAwLCAgIDEzMiwgMTcwLCAwLCAgIDExMywgMTQ3LCAwLCAgIDk0LCAgMTIzLAorICAgIDAsICAgNzQsICA5OSwgIDAsICAgNTEsICA3MSwgIDAsICAgMTUsICAzNCwgIDEsICAgMTg3LCAyMTksIDEsICAgMTY3LCAxOTUsCisgICAgMCwgICAxNTAsIDE3NSwgMCwgICAxMzEsIDE1MywgMCwgICAxMTMsIDEzMiwgMCwgICA5NCwgIDExMSwgMCwgICA3NCwgIDg5LAorICAgIDAsICAgNTAsICA2MywgIDAsICAgMTMsICAyOCwgIDEsICAgMTg2LCAxOTgsIDEsICAgMTY3LCAxNzgsIDAsICAgMTQ5LCAxNTgsCisgICAgMCwgICAxMzAsIDEzOSwgMCwgICAxMTEsIDExOSwgMCwgICA5MywgIDEwMCwgMCwgICA3NCwgIDgwLCAgMCwgICA1MCwgIDU1LAorICAgIDAsICAgMTMsICAyMiwgIDEsICAgMTg1LCAxNzYsIDEsICAgMTY1LCAxNTksIDEsICAgMTQ4LCAxNDIsIDAsICAgMTI5LCAxMjMsCisgICAgMCwgICAxMTEsIDEwNiwgMCwgICA5MywgIDg5LCAgMCwgICA3MywgIDcwLCAgMCwgICA1MCwgIDQ3LCAgMCwgICAxMywgIDEzLAorICAgIDEsICAgMTg0LCAxNTcsIDEsICAgMTY0LCAxNDEsIDEsICAgMTQ3LCAxMjUsIDAsICAgMTI4LCAxMTAsIDAsICAgMTEwLCA5MywKKyAgICAwLCAgIDkyLCAgNzcsICAwLCAgIDczLCAgNjAsICAwLCAgIDUwLCAgMzksICAwLCAgIDEyLCAgNSwgICAyNSwgIDE4MiwgMTM3LAorICAgIDI1LCAgMTYzLCAxMjIsIDE3LCAgMTQ2LCAxMDksIDAsICAgMTI4LCA5NiwgIDAsICAgMTEwLCA4MSwgIDAsICAgOTIsICA2NiwKKyAgICAwLCAgIDczLCAgNTEsICAwLCAgIDUwLCAgMzAsICAwLCAgIDEwLCAgMCwgICA0MiwgIDE4MSwgMTE0LCAzNSwgIDE2MywgMTAyLAorICAgIDMwLCAgMTQ1LCA5MSwgIDE0LCAgMTI3LCA4MCwgIDAsICAgMTA5LCA2NywgIDAsICAgOTEsICA1MywgIDAsICAgNzIsICAzOSwKKyAgICAwLCAgIDUwLCAgMTksICAwLCAgIDEwLCAgMCwgICA1MiwgIDE4MSwgOTIsICA0MywgIDE2MiwgODMsICAzMiwgIDE0NSwgNzMsCisgICAgMTksICAxMjYsIDYzLCAgMCwgICAxMDgsIDUyLCAgMCwgICA5MCwgIDQwLCAgMCwgICA3MiwgIDI3LCAgMCwgICA1MCwgIDcsCisgICAgMCwgICAxMCwgIDAsICAgNTcsICAxODEsIDc0LCAgNDgsICAxNjIsIDY2LCAgMzcsICAxNDQsIDU3LCAgMjQsICAxMjYsIDQ5LAorICAgIDcsICAgMTA4LCA0MCwgIDAsICAgOTAsICAyOSwgIDAsICAgNzIsICAxNSwgIDAsICAgNDksICAwLCAgIDAsICAgMTAsICAwLAorICAgIDEsICAgMTcwLCAyMjcsIDEsICAgMTUyLCAyMDMsIDAsICAgMTM2LCAxODIsIDAsICAgMTE5LCAxNTksIDAsICAgMTAxLCAxMzcsCisgICAgMCwgICA4NCwgIDExNSwgMCwgICA2NSwgIDkyLCAgMCwgICA0MywgIDY2LCAgMCwgICAxLCAgIDI5LCAgMSwgICAxNjksIDIwNiwKKyAgICAxLCAgIDE1MSwgMTg0LCAxLCAgIDEzNiwgMTY1LCAwLCAgIDExOCwgMTQ0LCAwLCAgIDEwMiwgMTI1LCAwLCAgIDg0LCAgMTA1LAorICAgIDAsICAgNjUsICA4MywgIDAsICAgNDMsICA1OCwgIDAsICAgMCwgICAyMiwgIDI5LCAgMTY4LCAxODYsIDIxLCAgMTUxLCAxNjcsCisgICAgMTQsICAxMzUsIDE1MCwgNCwgICAxMTgsIDEzMSwgMCwgICAxMDEsIDExMiwgMCwgICA4MywgIDk0LCAgMCwgICA2NSwgIDc1LAorICAgIDAsICAgNDMsICA1MSwgIDAsICAgMCwgICAxNiwgIDQxLCAgMTY3LCAxNjcsIDMzLCAgMTUwLCAxNTAsIDMxLCAgMTM0LCAxMzQsCisgICAgMTksICAxMTcsIDExNywgNCwgICAxMDAsIDEwMCwgMCwgICA4MywgIDgzLCAgMCwgICA2NSwgIDY1LCAgMCwgICA0MiwgIDQzLAorICAgIDAsICAgMCwgICA4LCAgIDQ4LCAgMTY3LCAxNDksIDQxLCAgMTQ5LCAxMzMsIDMzLCAgMTMzLCAxMTgsIDI1LCAgMTE2LCAxMDMsCisgICAgMTMsICA5OSwgIDg4LCAgMCwgICA4MywgIDczLCAgMCwgICA2NSwgIDU2LCAgMCwgICA0MiwgIDM1LCAgMCwgICAwLCAgIDAsCisgICAgNTgsICAxNjUsIDEzMCwgNDksICAxNDgsIDExNSwgNDIsICAxMzIsIDEwMywgMzEsICAxMTUsIDg5LCAgMTgsICA5OSwgIDc1LAorICAgIDAsICAgODIsICA2MSwgIDAsICAgNjQsICA0NiwgIDAsICAgNDIsICAyNiwgIDAsICAgMCwgICAwLCAgIDYyLCAgMTY0LCAxMTAsCisgICAgNTUsICAxNDcsIDk3LCAgNDUsICAxMzIsIDg3LCAgMzUsICAxMTUsIDc1LCAgMjIsICA5OCwgIDYzLCAgNSwgICA4MiwgIDUwLAorICAgIDAsICAgNjQsICAzNiwgIDAsICAgNDIsICAxNiwgIDAsICAgMCwgICAwLCAgIDY5LCAgMTY0LCA4OSwgIDYwLCAgMTQ3LCA3OCwKKyAgICA1MCwgIDEzMSwgNzAsICAzNywgIDExNCwgNTksICAyNiwgIDk4LCAgNDksICAxMCwgIDgxLCAgMzcsICAwLCAgIDY0LCAgMjQsCisgICAgMCwgICA0MiwgIDQsICAgMCwgICAwLCAgIDAsICAgNzEsICAxNjQsIDcxLCAgNjMsICAxNDcsIDYzLCAgNTMsICAxMzEsIDU1LAorICAgIDQwLCAgMTE0LCA0NywgIDI4LCAgOTgsICAzOCwgIDEzLCAgODEsICAyNiwgIDAsICAgNjQsICAxMiwgIDAsICAgNDIsICAwLAorICAgIDAsICAgMCwgICAwLCAgIDI4LCAgMTUzLCAyMTQsIDI0LCAgMTM4LCAxOTMsIDIzLCAgMTIzLCAxNzEsIDE2LCAgMTA3LCAxNTAsCisgICAgMCwgICA5MSwgIDEzMCwgMCwgICA3NSwgIDEwOSwgMCwgICA1OCwgIDg3LCAgMCwgICAzNSwgIDYxLCAgMCwgICAwLCAgIDI1LAorICAgIDQ4LCAgMTUzLCAxOTQsIDQxLCAgMTM4LCAxNzQsIDM0LCAgMTIzLCAxNTYsIDI3LCAgMTA3LCAxMzYsIDE2LCAgOTEsICAxMTcsCisgICAgMSwgICA3NSwgIDk4LCAgMCwgICA1NywgIDc4LCAgMCwgICAzNSwgIDUzLCAgMCwgICAwLCAgIDE3LCAgNTUsICAxNTMsIDE3NywKKyAgICA0NywgIDEzNywgMTU4LCA0MiwgIDEyMiwgMTQyLCAzMywgIDEwNywgMTI0LCAyMiwgIDkxLCAgMTA2LCA2LCAgIDc1LCAgODgsCisgICAgMCwgICA1NywgIDcwLCAgMCwgICAzNSwgIDQ2LCAgMCwgICAwLCAgIDksICAgNjEsICAxNTIsIDE1OCwgNTMsICAxMzYsIDE0MywKKyAgICA0NSwgIDEyMiwgMTI3LCAzNiwgIDEwNiwgMTExLCAyNCwgIDkwLCAgOTQsICAxMCwgIDc0LCAgNzgsICAwLCAgIDU3LCAgNjEsCisgICAgMCwgICAzNSwgIDM5LCAgMCwgICAwLCAgIDIsICAgNjcsICAxNTEsIDE0MSwgNTksICAxMzUsIDEyNiwgNDksICAxMjEsIDExMiwKKyAgICAzOSwgIDEwNSwgOTgsICAyOSwgIDkwLCAgODMsICAxNCwgIDc0LCAgNjgsICAwLCAgIDU3LCAgNTIsICAwLCAgIDM1LCAgMzEsCisgICAgMCwgICAwLCAgIDAsICAgNzEsICAxNTAsIDEyMywgNjIsICAxMzUsIDExMCwgNTQsICAxMjAsIDk4LCAgNDIsICAxMDUsIDg0LAorICAgIDMxLCAgODksICA3MSwgIDE2LCAgNzQsICA1OCwgIDAsICAgNTcsICA0MywgIDAsICAgMzUsICAyMiwgIDAsICAgMCwgICAwLAorICAgIDc0LCAgMTUwLCAxMDUsIDY0LCAgMTM0LCA5MiwgIDU1LCAgMTIwLCA4MywgIDQ1LCAgMTA0LCA3MSwgIDM0LCAgODksICA1OSwKKyAgICAyMCwgIDczLCAgNDcsICAwLCAgIDU3LCAgMzIsICAwLCAgIDM1LCAgMTMsICAwLCAgIDAsICAgMCwgICA3OCwgIDE0OSwgODQsCisgICAgNjksICAxMzQsIDc1LCAgNTksICAxMjAsIDY2LCAgNDcsICAxMDMsIDU2LCAgMzQsICA4OCwgIDQ2LCAgMjIsICA3MywgIDM0LAorICAgIDEsICAgNTcsICAyMCwgIDAsICAgMzUsICAxLCAgIDAsICAgMCwgICAwLCAgIDgwLCAgMTQ5LCA2OSwgIDcwLCAgMTMzLCA2MSwKKyAgICA2MCwgIDExOSwgNTMsICA0OSwgIDEwMywgNDQsICAzNiwgIDg4LCAgMzUsICAyMywgIDczLCAgMjQsICAyLCAgIDU2LCAgMTAsCisgICAgMCwgICAzNSwgIDAsICAgMCwgICAwLCAgIDAsICAgNTgsICAxMzYsIDIwMCwgNTAsICAxMjIsIDE4MCwgNDUsICAxMDksIDE2MiwKKyAgICAzOCwgIDk0LCAgMTQxLCAyNywgIDgwLCAgMTIxLCAxNSwgIDY1LCAgMTAyLCAwLCAgIDQ4LCAgODEsICAwLCAgIDI2LCAgNTYsCisgICAgMCwgICAwLCAgIDE5LCAgNjYsICAxMzYsIDE4MiwgNTksICAxMjIsIDE2MywgNTIsICAxMDksIDE0NiwgNDIsICA5NCwgIDEyOCwKKyAgICAzMiwgIDgwLCAgMTA5LCAyMCwgIDY1LCAgOTEsICAyLCAgIDQ4LCAgNzIsICAwLCAgIDI2LCAgNDksICAwLCAgIDAsICAgMTEsCisgICAgNzAsICAxMzYsIDE2NSwgNjIsICAxMjIsIDE0OSwgNTUsICAxMDgsIDEzMywgNDYsICA5NCwgIDExNiwgMzUsICA4MCwgIDk5LAorICAgIDIxLCAgNjUsICA4MiwgIDQsICAgNDksICA2NCwgIDAsICAgMjYsICA0MSwgIDAsICAgMCwgICAzLCAgIDc2LCAgMTM1LCAxNDksCisgICAgNjYsICAxMjEsIDEzMywgNTgsICAxMDgsIDExOSwgNDgsICA5NCwgIDEwMywgMzYsICA3OSwgIDg4LCAgMjMsICA2NSwgIDczLAorICAgIDcsICAgNDksICA1NiwgIDAsICAgMjcsICAzNCwgIDAsICAgMCwgICAwLCAgIDc4LCAgMTM1LCAxMzMsIDY5LCAgMTIwLCAxMTgsCisgICAgNjAsICAxMDcsIDEwNiwgNTAsICA5MywgIDkyLCAgMzksICA3OSwgIDc3LCAgMjYsICA2NSwgIDYzLCAgOCwgICA0OSwgIDQ3LAorICAgIDAsICAgMjcsICAyNiwgIDAsICAgMCwgICAwLCAgIDgyLCAgMTM0LCAxMTcsIDcxLCAgMTIwLCAxMDQsIDYyLCAgMTA3LCA5MiwKKyAgICA1MSwgIDkzLCAgNzksICAzOSwgIDc4LCAgNjYsICAyNywgIDY0LCAgNTMsICAxMCwgIDQ4LCAgMzksICAwLCAgIDI3LCAgMTgsCisgICAgMCwgICAwLCAgIDAsICAgODQsICAxMzQsIDk5LCAgNzMsICAxMTksIDg3LCAgNjQsICAxMDYsIDc3LCAgNTMsICA5MiwgIDY2LAorICAgIDQyLCAgNzgsICA1NSwgIDI4LCAgNjQsICA0MiwgIDExLCAgNDgsICAyOSwgIDAsICAgMjgsICA5LCAgIDAsICAgMCwgICAwLAorICAgIDg3LCAgMTMzLCA4MSwgIDc2LCAgMTE5LCA3MiwgIDY2LCAgMTA2LCA2MiwgIDU1LCAgOTIsICA1MiwgIDQzLCAgNzgsICA0MiwKKyAgICAyOSwgIDY0LCAgMzEsICAxMiwgIDQ4LCAgMTcsICAwLCAgIDI4LCAgMCwgICAwLCAgIDAsICAgMCwgICA4OCwgIDEzNCwgNjcsCisgICAgNzcsICAxMTksIDU4LCAgNjgsICAxMDYsIDUxLCAgNTYsICA5MiwgIDQyLCAgNDQsICA3OCwgIDMyLCAgMzAsICA2NCwgIDIwLAorICAgIDEyLCAgNDgsICA2LCAgIDAsICAgMjgsICAwLCAgIDAsICAgMCwgICAwLCAgIDczLCAgMTIwLCAxODksIDY0LCAgMTA3LCAxNjgsCisgICAgNTcsICA5NiwgIDE1MSwgNDcsICA4MiwgIDEzMywgMzgsICA2OSwgIDExNCwgMjYsICA1NSwgIDk1LCAgMTEsICAzOSwgIDc1LAorICAgIDAsICAgMTYsICA1MSwgIDAsICAgMCwgICAxNCwgIDc4LCAgMTIwLCAxNzEsIDY5LCAgMTA3LCAxNTMsIDYyLCAgOTUsICAxMzcsCisgICAgNTEsICA4MiwgIDExOSwgNDAsICA2OSwgIDEwMiwgMjksICA1NSwgIDg1LCAgMTUsICAzOSwgIDY2LCAgMCwgICAxNywgIDQ0LAorICAgIDAsICAgMCwgICA0LCAgIDgxLCAgMTIwLCAxNTYsIDcxLCAgMTA3LCAxNDAsIDY0LCAgOTUsICAxMjUsIDUzLCAgODIsICAxMDksCisgICAgNDIsICA2OSwgIDkzLCAgMzEsICA1NSwgIDc3LCAgMTYsICAzOSwgIDU5LCAgMCwgICAxOCwgIDM3LCAgMCwgICAwLCAgIDAsCisgICAgODUsICAxMjAsIDE0MSwgNzQsICAxMDcsIDEyNiwgNjUsICA5NSwgIDExMiwgNTQsICA4MiwgIDk3LCAgNDMsICA2OSwgIDgyLAorICAgIDMyLCAgNTUsICA2NywgIDE3LCAgMzksICA1MSwgIDAsICAgMTksICAzMCwgIDAsICAgMCwgICAwLCAgIDg2LCAgMTE5LCAxMjYsCisgICAgNzYsICAxMDYsIDExMiwgNjYsICA5NSwgIDEwMCwgNTYsICA4MSwgIDg1LCAgNDUsICA2OSwgIDcyLCAgMzMsICA1NSwgIDU5LAorICAgIDE4LCAgNDAsICA0MywgIDAsICAgMTksICAyMiwgIDAsICAgMCwgICAwLCAgIDg5LCAgMTE5LCAxMTAsIDc4LCAgMTA2LCA5OCwKKyAgICA2OSwgIDk0LCAgODcsICA1NiwgIDgxLCAgNzUsICA0NiwgIDY4LCAgNjIsICAzMywgIDU1LCAgNDksICAxOCwgIDQwLCAgMzUsCisgICAgMCwgICAyMCwgIDE1LCAgMCwgICAwLCAgIDAsICAgODksICAxMTksIDk1LCAgODAsICAxMDYsIDgzLCAgNzAsICA5NCwgIDczLAorICAgIDU4LCAgODEsICA2MywgIDQ2LCAgNjgsICA1MSwgIDM0LCAgNTUsICAzOSwgIDE5LCAgNDAsICAyNSwgIDAsICAgMjAsICA0LAorICAgIDAsICAgMCwgICAwLCAgIDkyLCAgMTE4LCA3OCwgIDgyLCAgMTA2LCA2OCwgIDcwLCAgOTMsICA1OSwgIDU5LCAgODEsICA0OSwKKyAgICA0NywgIDY4LCAgMzksICAzNCwgIDU1LCAgMjgsICAxOSwgIDQwLCAgMTQsICAwLCAgIDIwLCAgMCwgICAwLCAgIDAsICAgMCwKKyAgICA5MywgIDExOCwgNjUsICA4MiwgIDEwNSwgNTUsICA3MiwgIDkzLCAgNDgsICA2MCwgIDgxLCAgMzksICA0NywgIDY4LCAgMjksCisgICAgMzQsICA1NSwgIDE4LCAgMjAsICA0MCwgIDIsICAgMCwgICAyMCwgIDAsICAgMCwgICAwLCAgIDAsICAgODMsICAxMDQsIDE3NywKKyAgICA3NCwgIDkzLCAgMTU5LCA2NSwgIDgyLCAgMTQyLCA1NiwgIDcwLCAgMTI0LCA0NSwgIDU3LCAgMTA2LCAzMywgIDQ0LCAgODksCisgICAgMjAsICAyOCwgIDcwLCAgMSwgICA0LCAgIDQ2LCAgMCwgICAwLCAgIDgsICAgODYsICAxMDQsIDE2MSwgNzgsICA5MywgIDE0NSwKKyAgICA2OCwgIDgyLCAgMTI4LCA1OCwgIDcwLCAgMTEyLCA0OCwgIDU4LCAgOTYsICAzNSwgIDQ1LCAgODAsICAyMSwgIDI5LCAgNjIsCisgICAgMSwgICA2LCAgIDQwLCAgMCwgICAwLCAgIDAsICAgODksICAxMDQsIDE0NywgNzksICA5MywgIDEzMSwgNjksICA4MiwgIDExOCwKKyAgICA1OSwgIDcwLCAgMTAyLCA0NywgIDU4LCAgODcsICAzNiwgIDQ1LCAgNzIsICAyMywgIDI5LCAgNTUsICAzLCAgIDcsICAgMzMsCisgICAgMCwgICAwLCAgIDAsICAgOTAsICAxMDQsIDEzMiwgODAsICA5MywgIDExOSwgNzEsICA4MiwgIDEwNiwgNjAsICA3MCwgIDkxLAorICAgIDQ4LCAgNTgsICA3NywgIDM3LCAgNDUsICA2MiwgIDIzLCAgMzAsICA0NywgIDQsICAgNywgICAyNiwgIDAsICAgMCwgICAwLAorICAgIDkyLCAgMTA0LCAxMTgsIDgyLCAgOTMsICAxMDUsIDcyLCAgODIsICA5MywgIDYxLCAgNjksICA4MCwgIDUwLCAgNTgsICA2OCwKKyAgICAzNywgIDQ1LCAgNTUsICAyMywgIDMwLCAgMzksICA0LCAgIDgsICAgMTgsICAwLCAgIDAsICAgMCwgICA5NCwgIDEwNCwgMTA1LAorICAgIDgyLCAgOTIsICA5MywgIDcyLCAgODIsICA4MiwgIDYxLCAgNzAsICA3MCwgIDUwLCAgNTgsICA1OCwgIDM4LCAgNDYsICA0NiwKKyAgICAyMywgIDMxLCAgMzEsICA2LCAgIDEwLCAgMTEsICAwLCAgIDAsICAgMCwgICA5NSwgIDEwNCwgOTAsICA4NCwgIDkyLCAgNzksCisgICAgNzQsICA4MiwgIDcwLCAgNjIsICA3MCwgIDU4LCAgNTAsICA1OCwgIDQ4LCAgMzcsICA0NiwgIDM2LCAgMjMsICAzMSwgIDIyLAorICAgIDQsICAgMTEsICAzLCAgIDAsICAgMCwgICAwLCAgIDk2LCAgMTAzLCA3NCwgIDg1LCAgOTIsICA2NSwgIDc1LCAgODEsICA1NiwKKyAgICA2MywgIDcwLCAgNDcsICA1MCwgIDU4LCAgMzcsICAzOCwgIDQ2LCAgMjUsICAyNCwgIDMxLCAgMTEsICAzLCAgIDExLCAgMCwKKyAgICAwLCAgIDAsICAgMCwgICA5NywgIDEwMywgNjIsICA4NiwgIDkyLCAgNTMsICA3NiwgIDgxLCAgNDUsICA2MywgIDY5LCAgMzYsCisgICAgNTEsICA1OCwgIDI3LCAgMzgsICA0NiwgIDE1LCAgMjMsICAzMSwgIDAsICAgMywgICAxMSwgIDAsICAgMCwgICAwLCAgIDAsCisgICAgOTAsICA4NywgIDE2NSwgODEsICA3NywgIDE0OCwgNzIsICA2NywgIDEzMiwgNjIsICA1NSwgIDExNiwgNTAsICA0NCwgIDk5LAorICAgIDM5LCAgMzEsICA4MiwgIDI1LCAgMTQsICA2NCwgIDEsICAgMCwgICA0MiwgIDAsICAgMCwgICAxLCAgIDkzLCAgODcsICAxNTAsCisgICAgODMsICA3NywgIDEzNSwgNzQsICA2NywgIDEyMSwgNjMsICA1NiwgIDEwNSwgNTIsICA0NSwgIDkwLCAgNDAsICAzMiwgIDc0LAorICAgIDI1LCAgMTYsICA1NywgIDMsICAgMCwgICAzNSwgIDAsICAgMCwgICAwLCAgIDk1LCAgODcsICAxMzgsIDg1LCAgNzcsICAxMjMsCisgICAgNzUsICA2NywgIDEwOSwgNjMsICA1NywgIDk1LCAgNTMsICA0NSwgIDgxLCAgNDEsICAzMywgIDY2LCAgMjYsICAxNywgIDUwLAorICAgIDQsICAgMCwgICAyOCwgIDAsICAgMCwgICAwLCAgIDk1LCAgODgsICAxMjQsIDg1LCAgNzcsICAxMTEsIDc1LCAgNjcsICA5OSwKKyAgICA2MywgIDU3LCAgODYsICA1MywgIDQ1LCAgNzIsICA0MSwgIDMzLCAgNTgsICAyNiwgIDE4LCAgNDMsICA1LCAgIDEsICAgMjIsCisgICAgMCwgICAwLCAgIDAsICAgOTcsICA4OCwgIDExMiwgODcsICA3NywgIDEwMCwgNzYsICA2OCwgIDg4LCAgNjQsICA1NywgIDc2LAorICAgIDUzLCAgNDYsICA2MywgIDQxLCAgMzQsICA1MCwgIDI2LCAgMTksICAzNSwgIDUsICAgMiwgICAxNCwgIDAsICAgMCwgICAwLAorICAgIDk5LCAgODcsICA5OSwgIDg3LCAgNzgsICA4OCwgIDc2LCAgNjgsICA3NywgIDY1LCAgNTcsICA2NSwgIDUzLCAgNDYsICA1NCwKKyAgICA0MSwgIDM1LCAgNDIsICAyNywgIDIwLCAgMjcsICA2LCAgIDIsICAgNSwgICAwLCAgIDAsICAgMCwgICAxMDAsIDg3LCAgODUsCisgICAgODgsICA3NywgIDc1LCAgNzcsICA2OCwgIDY1LCAgNjUsICA1NywgIDU0LCAgNTMsICA0NiwgIDQ0LCAgNDEsICAzNSwgIDMyLAorICAgIDI3LCAgMjEsICAxOSwgIDUsICAgMywgICAyLCAgIDAsICAgMCwgICAwLCAgIDEwMCwgODgsICA3MSwgIDg5LCAgNzcsICA2MSwKKyAgICA3OCwgIDY4LCAgNTMsICA2NiwgIDU3LCAgNDQsICA1MywgIDQ3LCAgMzMsICA0MSwgIDM1LCAgMjIsICAyNywgIDIxLCAgNywKKyAgICA1LCAgIDMsICAgMCwgICAwLCAgIDAsICAgMCwgICAxMDEsIDg3LCAgNjAsICA5MCwgIDc3LCAgNTIsICA3OSwgIDY4LCAgNDQsCisgICAgNjYsICA1OCwgIDM0LCAgNTMsICA0NywgIDI1LCAgNDEsICAzNSwgIDEzLCAgMjYsICAyMiwgIDAsICAgNSwgICAzLCAgIDAsCisgICAgMCwgICAwLCAgIDAsICAgOTcsICA2NywgIDE1NSwgODYsICA1OCwgIDEzOCwgNzcsICA1MCwgIDEyNSwgNjYsICAzOSwgIDEwOCwKKyAgICA1NSwgIDI4LCAgOTIsICA0MywgIDEyLCAgNzYsICAyOSwgIDAsICAgNTksICAyLCAgIDAsICAgMzcsICAwLCAgIDAsICAgMCwKKyAgICA5OSwgIDY3LCAgMTQxLCA4OCwgIDU5LCAgMTI3LCA3OCwgIDUwLCAgMTEzLCA2OCwgIDQwLCAgOTgsICA1NiwgIDI5LCAgODMsCisgICAgNDQsICAxNSwgIDY4LCAgMjksICAwLCAgIDUyLCAgMywgICAwLCAgIDMwLCAgMCwgICAwLCAgIDAsICAgMTAwLCA2OCwgIDEyOSwKKyAgICA4OSwgIDU5LCAgMTE1LCA4MCwgIDUxLCAgMTAzLCA2OCwgIDQxLCAgODksICA1NiwgIDMwLCAgNzUsICA0NCwgIDE2LCAgNjEsCisgICAgMzAsICAwLCAgIDQ1LCAgNCwgICAwLCAgIDI0LCAgMCwgICAwLCAgIDAsICAgMTAwLCA2OSwgIDExOCwgOTAsICA2MCwgIDEwNCwKKyAgICA4MCwgIDUxLCAgOTIsICA2NywgIDQxLCAgNzksICA1NiwgIDMxLCAgNjYsICA0NCwgIDE4LCAgNTMsICAyOSwgIDIsICAgMzgsCisgICAgNCwgICAwLCAgIDE4LCAgMCwgICAwLCAgIDAsICAgMTAxLCA2OSwgIDEwNCwgOTAsICA2MSwgIDkzLCAgNzksICA1MSwgIDgyLAorICAgIDY3LCAgNDIsICA3MCwgIDU2LCAgMzIsICA1OSwgIDQ0LCAgMjAsICA0NiwgIDI5LCAgNCwgICAzMSwgIDYsICAgMCwgICA5LAorICAgIDAsICAgMCwgICAwLCAgIDEwMiwgNjksICA5MywgIDkwLCAgNjEsICA4MywgIDgwLCAgNTIsICA3MiwgIDY4LCAgNDIsICA2MSwKKyAgICA1NiwgIDMzLCAgNTAsICA0MywgIDIwLCAgMzgsICAyOSwgIDUsICAgMjMsICA3LCAgIDAsICAgNCwgICAwLCAgIDAsICAgMCwKKyAgICAxMDIsIDcwLCAgODAsICA5MSwgIDYxLCAgNzEsICA4MCwgIDUyLCAgNjEsICA2OCwgIDQzLCAgNTEsICA1NiwgIDMyLCAgNDAsCisgICAgNDQsICAyMSwgIDI5LCAgMzAsICA2LCAgIDE0LCAgNywgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTAzLCA3MCwgIDY4LAorICAgIDkyLCAgNjEsICA1OCwgIDgxLCAgNTMsICA1MCwgIDY5LCAgNDMsICA0MSwgIDU2LCAgMzQsICAzMSwgIDQzLCAgMjIsICAxOSwKKyAgICAyOSwgIDcsICAgMywgICA3LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxMDQsIDcwLCAgNTcsICA5MiwgIDYxLCAgNDgsCisgICAgODIsICA1MywgIDQwLCAgNjksICA0MywgIDMyLCAgNTYsICAzNCwgIDIyLCAgNDMsICAyMywgIDEwLCAgMjksICA4LCAgIDAsCisgICAgNiwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTAxLCA0NSwgIDE0NSwgOTEsICAzNSwgIDEyOSwgODAsICAyNiwgIDExNiwKKyAgICA2OSwgIDE1LCAgMTAxLCA1OSwgIDAsICAgODYsICA0NiwgIDAsICAgNzEsICAzMSwgIDAsICAgNTUsICAwLCAgIDAsICAgMzMsCisgICAgMCwgICAwLCAgIDAsICAgMTA0LCA0NCwgIDEzMiwgOTIsICAzNiwgIDExOCwgODIsICAyOCwgIDEwNSwgNzEsICAxNywgIDkxLAorICAgIDU4LCAgMywgICA3NywgIDQ2LCAgMCwgICA2MywgIDMxLCAgMCwgICA0OCwgIDIsICAgMCwgICAyNiwgIDAsICAgMCwgICAwLAorICAgIDEwNCwgNDYsICAxMjEsIDkzLCAgMzcsICAxMDcsIDgyLCAgMzAsICA5NiwgIDcwLCAgMjAsICA4MywgIDU4LCAgNiwgICA3MCwKKyAgICA0NiwgIDAsICAgNTcsICAzMiwgIDAsICAgNDEsICA0LCAgIDAsICAgMjAsICAwLCAgIDAsICAgMCwgICAxMDQsIDQ4LCAgMTEwLAorICAgIDkzLCAgNDAsICA5OCwgIDgyLCAgMzEsICA4NywgIDcwLCAgMjIsICA3NCwgIDU5LCAgOSwgICA2MiwgIDQ1LCAgMCwgICA0OSwKKyAgICAzMSwgIDAsICAgMzUsICA2LCAgIDAsICAgMTMsICAwLCAgIDAsICAgMCwgICAxMDQsIDQ4LCAgOTksICA5MiwgIDQxLCAgODgsCisgICAgODIsICAzMiwgIDc3LCAgNzAsICAyMywgIDY1LCAgNTgsICAxMSwgIDU0LCAgNDYsICAwLCAgIDQyLCAgMzIsICAwLCAgIDI3LAorICAgIDcsICAgMCwgICA1LCAgIDAsICAgMCwgICAwLCAgIDEwNSwgNTAsICA4OCwgIDkzLCAgNDEsICA3NywgIDgyLCAgMzQsICA2OCwKKyAgICA3MSwgIDI0LCAgNTcsICA1OCwgIDEzLCAgNDYsICA0NSwgIDEsICAgMzUsICAzMSwgIDAsICAgMjEsICA3LCAgIDAsICAgMiwKKyAgICAwLCAgIDAsICAgMCwgICAxMDUsIDUwLCAgNzYsICA5NCwgIDQxLCAgNjYsICA4MywgIDM0LCAgNTcsICA3MSwgIDI1LCAgNDcsCisgICAgNTgsICAxNSwgIDM3LCAgNDUsICAyLCAgIDI1LCAgMzIsICAwLCAgIDExLCAgNywgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMTA2LCA1MCwgIDY0LCAgOTQsICA0MiwgIDU1LCAgODMsICAzNSwgIDQ3LCAgNzEsICAyNiwgIDM4LCAgNTgsICAxNiwgIDI3LAorICAgIDQ1LCAgNCwgICAxNywgIDMxLCAgMCwgICA0LCAgIDcsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDEwNiwgNTEsICA1NCwKKyAgICA5NSwgIDQyLCAgNDUsICA4MywgIDM1LCAgMzgsICA3MSwgIDI3LCAgMzAsICA1OCwgIDE2LCAgMTksICA0NSwgIDUsICAgNywKKyAgICAzMCwgIDAsICAgMCwgICA2LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDE4MSwgMjQwLCAwLCAgIDE2MiwgMjE2LAorICAgIDAsICAgMTQ0LCAxOTMsIDAsICAgMTI2LCAxNjgsIDAsICAgMTA5LCAxNDYsIDAsICAgOTEsICAxMjMsIDAsICAgNzEsICA5OCwKKyAgICAwLCAgIDQ4LCAgNzEsICAwLCAgIDksICAgMzQsICAwLCAgIDE3OSwgMjE4LCAwLCAgIDE2MSwgMTk1LCAwLCAgIDE0NCwgMTc0LAorICAgIDAsICAgMTI2LCAxNTMsIDAsICAgMTA4LCAxMzIsIDAsICAgOTAsICAxMTAsIDAsICAgNzEsICA4OCwgIDAsICAgNDgsICA2MywKKyAgICAwLCAgIDgsICAgMjksICAwLCAgIDE3OCwgMTk3LCAwLCAgIDE1OSwgMTc3LCAwLCAgIDE0MywgMTU5LCAwLCAgIDEyNSwgMTM5LAorICAgIDAsICAgMTA3LCAxMTksIDAsICAgOTAsICA5OSwgIDAsICAgNzEsICA3OSwgIDAsICAgNDgsICA1NSwgIDAsICAgOCwgICAyMiwKKyAgICAwLCAgIDE3NywgMTc3LCAwLCAgIDE1OCwgMTU4LCAwLCAgIDE0MiwgMTQxLCAwLCAgIDEyNCwgMTIzLCAwLCAgIDEwNywgMTA2LAorICAgIDAsICAgODksICA4OCwgIDAsICAgNzEsICA3MCwgIDAsICAgNDgsICA0NywgIDAsICAgOCwgICAxNCwgIDAsICAgMTc2LCAxNTcsCisgICAgMCwgICAxNTgsIDE0MSwgMCwgICAxNDEsIDEyNiwgMCwgICAxMjMsIDEwOSwgMCwgICAxMDYsIDkzLCAgMCwgICA4OSwgIDc4LAorICAgIDAsICAgNzAsICA2MCwgIDAsICAgNDcsICAzOSwgIDAsICAgNywgICA1LCAgIDAsICAgMTc1LCAxMzgsIDAsICAgMTU3LCAxMjMsCisgICAgMCwgICAxNDEsIDExMCwgMCwgICAxMjMsIDk2LCAgMCwgICAxMDUsIDgxLCAgMCwgICA4OCwgIDY3LCAgMCwgICA3MCwgIDUxLAorICAgIDAsICAgNDgsICAzMCwgIDAsICAgNiwgICAwLCAgIDAsICAgMTczLCAxMTUsIDAsICAgMTU1LCAxMDQsIDAsICAgMTQwLCA5MiwKKyAgICAwLCAgIDEyMiwgODAsICAwLCAgIDEwNSwgNjcsICAwLCAgIDg4LCAgNTUsICAwLCAgIDY5LCAgNDAsICAwLCAgIDQ3LCAgMjAsCisgICAgMCwgICA2LCAgIDAsICAgMCwgICAxNzMsIDk0LCAgMCwgICAxNTUsIDg1LCAgMCwgICAxMzksIDc1LCAgMCwgICAxMjEsIDY0LAorICAgIDAsICAgMTA0LCA1MywgIDAsICAgODgsICA0MiwgIDAsICAgNzAsICAyOCwgIDAsICAgNDcsICA5LCAgIDAsICAgNiwgICAwLAorICAgIDAsICAgMTczLCA3NiwgIDAsICAgMTU1LCA3MCwgIDAsICAgMTM4LCA2MSwgIDAsICAgMTIyLCA1MywgIDAsICAgMTA0LCA0NCwKKyAgICAwLCAgIDg3LCAgMzIsICAwLCAgIDY5LCAgMTgsICAwLCAgIDQ3LCAgMCwgICAwLCAgIDYsICAgMCwgICAwLCAgIDE2NCwgMjI2LAorICAgIDAsICAgMTQ3LCAyMDMsIDAsICAgMTMxLCAxODEsIDAsICAgMTE0LCAxNTgsIDAsICAgOTcsICAxMzYsIDAsICAgODAsICAxMTUsCisgICAgMCwgICA2MywgIDkyLCAgMCwgICA0MCwgIDY1LCAgMCwgICAwLCAgIDMwLCAgMCwgICAxNjIsIDIwNSwgMCwgICAxNDUsIDE4NCwKKyAgICAwLCAgIDEzMCwgMTY0LCAwLCAgIDExNCwgMTQzLCAwLCAgIDk3LCAgMTI0LCAwLCAgIDgxLCAgMTA0LCAwLCAgIDYzLCAgODMsCisgICAgMCwgICA0MCwgIDU4LCAgMCwgICAwLCAgIDIzLCAgMCwgICAxNjIsIDE4NywgMCwgICAxNDUsIDE2NywgMCwgICAxMzAsIDE1MCwKKyAgICAwLCAgIDExMywgMTMxLCAwLCAgIDk2LCAgMTEyLCAwLCAgIDgwLCAgOTMsICAwLCAgIDYyLCAgNzQsICAwLCAgIDQwLCAgNTAsCisgICAgMCwgICAwLCAgIDE2LCAgMCwgICAxNjAsIDE2NywgMCwgICAxNDQsIDE1MCwgMCwgICAxMjksIDEzNCwgMCwgICAxMTIsIDExNiwKKyAgICAwLCAgIDk2LCAgMTAwLCAwLCAgIDgwLCAgODIsICAwLCAgIDYyLCAgNjUsICAwLCAgIDQwLCAgNDMsICAwLCAgIDAsICAgNywKKyAgICAwLCAgIDE2MCwgMTQ4LCAwLCAgIDE0MywgMTMzLCAwLCAgIDEyOCwgMTE4LCAwLCAgIDExMSwgMTAzLCAwLCAgIDk2LCAgODgsCisgICAgMCwgICA4MCwgIDczLCAgMCwgICA2MiwgIDU2LCAgMCwgICA0MCwgIDM1LCAgMCwgICAwLCAgIDAsICAgMCwgICAxNTgsIDEzMCwKKyAgICAwLCAgIDE0MiwgMTE3LCAwLCAgIDEyNywgMTA0LCAwLCAgIDExMSwgODksICAwLCAgIDk1LCAgNzYsICAwLCAgIDc5LCAgNjIsCisgICAgMCwgICA2MiwgIDQ2LCAgMCwgICA0MCwgIDI2LCAgMCwgICAwLCAgIDAsICAgMCwgICAxNTgsIDExMSwgMCwgICAxNDEsIDk5LAorICAgIDAsICAgMTI3LCA4OCwgIDAsICAgMTExLCA3NiwgIDAsICAgOTUsICA2MywgIDAsICAgNzksICA1MSwgIDAsICAgNjIsICAzNywKKyAgICAwLCAgIDQwLCAgMTgsICAwLCAgIDAsICAgMCwgICAwLCAgIDE1OCwgOTEsICAwLCAgIDE0MSwgODEsICAwLCAgIDEyNiwgNzIsCisgICAgMCwgICAxMTAsIDYyLCAgMCwgICA5NCwgIDUwLCAgMCwgICA3OSwgIDM5LCAgMCwgICA2MiwgIDI1LCAgMCwgICA0MCwgIDUsCisgICAgMCwgICAwLCAgIDAsICAgMCwgICAxNTcsIDc0LCAgMCwgICAxNDEsIDY2LCAgMCwgICAxMjYsIDU5LCAgMCwgICAxMTAsIDQ5LAorICAgIDAsICAgOTQsICA0MCwgIDAsICAgNzgsICAyOSwgIDAsICAgNjEsICAxNSwgIDAsICAgNDAsICAwLCAgIDAsICAgMCwgICAwLAorICAgIDAsICAgMTQ4LCAyMTQsIDAsICAgMTMzLCAxOTIsIDAsICAgMTE5LCAxNzEsIDAsICAgMTAzLCAxNTAsIDAsICAgODcsICAxMjksCisgICAgMCwgICA3MiwgIDEwOCwgMCwgICA1NSwgIDg2LCAgMCwgICAzMiwgIDYxLCAgMCwgICAwLCAgIDI1LCAgMCwgICAxNDcsIDE5MywKKyAgICAwLCAgIDEzMiwgMTczLCAwLCAgIDExOCwgMTU1LCAwLCAgIDEwMywgMTM2LCAwLCAgIDg3LCAgMTE2LCAwLCAgIDcyLCAgOTgsCisgICAgMCwgICA1NSwgIDc4LCAgMCwgICAzMiwgIDUzLCAgMCwgICAwLCAgIDE3LCAgMCwgICAxNDcsIDE3NiwgMCwgICAxMzIsIDE1OCwKKyAgICAwLCAgIDExOCwgMTQyLCAwLCAgIDEwMiwgMTI0LCAwLCAgIDg3LCAgMTA2LCAwLCAgIDcyLCAgODgsICAwLCAgIDU1LCAgNjksCisgICAgMCwgICAzMywgIDQ2LCAgMCwgICAwLCAgIDksICAgMCwgICAxNDYsIDE1OSwgMCwgICAxMzEsIDE0MiwgMCwgICAxMTcsIDEyNywKKyAgICAwLCAgIDEwMiwgMTExLCAwLCAgIDg3LCAgOTUsICAwLCAgIDcxLCAgNzksICAwLCAgIDU1LCAgNjEsICAwLCAgIDMzLCAgMzksCisgICAgMCwgICAwLCAgIDIsICAgMCwgICAxNDUsIDE0MCwgMCwgICAxMzAsIDEyNiwgMCwgICAxMTcsIDExMiwgMCwgICAxMDEsIDk4LAorICAgIDAsICAgODYsICA4MywgIDAsICAgNzEsICA2OCwgIDAsICAgNTUsICA1MiwgIDAsICAgMzMsICAzMSwgIDAsICAgMCwgICAwLAorICAgIDAsICAgMTQ0LCAxMjQsIDAsICAgMTMwLCAxMTEsIDAsICAgMTE2LCA5OSwgIDAsICAgMTAxLCA4NCwgIDAsICAgODYsICA3MiwKKyAgICAwLCAgIDcxLCAgNTksICAwLCAgIDU1LCAgNDMsICAwLCAgIDMzLCAgMjMsICAwLCAgIDAsICAgMCwgICAwLCAgIDE0NCwgMTA2LAorICAgIDAsICAgMTI5LCA5NCwgIDAsICAgMTE1LCA4MywgIDAsICAgMTAxLCA3MiwgIDAsICAgODUsICA2MCwgIDAsICAgNzEsICA0OCwKKyAgICAwLCAgIDU1LCAgMzQsICAwLCAgIDMzLCAgMTQsICAwLCAgIDAsICAgMCwgICAzLCAgIDE0MywgODYsICAwLCAgIDEyOSwgNzcsCisgICAgMCwgICAxMTUsIDY4LCAgMCwgICAxMDAsIDU4LCAgMCwgICA4NSwgIDQ4LCAgMCwgICA3MCwgIDM2LCAgMCwgICA1NCwgIDIyLAorICAgIDAsICAgMzMsICAzLCAgIDAsICAgMCwgICAwLCAgIDE4LCAgMTQzLCA3MiwgIDEzLCAgMTI4LCA2MywgIDAsICAgMTE1LCA1NywKKyAgICAwLCAgIDEwMCwgNDcsICAwLCAgIDg1LCAgMzcsICAwLCAgIDcwLCAgMjYsICAwLCAgIDU0LCAgMTMsICAwLCAgIDMzLCAgMCwKKyAgICAwLCAgIDAsICAgMCwgICAwLCAgIDEzMiwgMjAwLCAwLCAgIDExOCwgMTc5LCAwLCAgIDEwNSwgMTYxLCAwLCAgIDkxLCAgMTQwLAorICAgIDAsICAgNzYsICAxMjEsIDAsICAgNjIsICAxMDEsIDAsICAgNDYsICA4MSwgIDAsICAgMjQsICA1NiwgIDAsICAgMCwgICAxOSwKKyAgICAwLCAgIDEzMSwgMTgyLCAwLCAgIDExOCwgMTYzLCAwLCAgIDEwNSwgMTQ2LCAwLCAgIDkxLCAgMTI4LCAwLCAgIDc3LCAgMTEwLAorICAgIDAsICAgNjIsICA5MSwgIDAsICAgNDYsICA3MiwgIDAsICAgMjUsICA0OCwgIDAsICAgMCwgICAxMSwgIDAsICAgMTMxLCAxNjUsCisgICAgMCwgICAxMTcsIDE0OSwgMCwgICAxMDQsIDEzMywgMCwgICA5MSwgIDExNiwgMCwgICA3NywgIDk5LCAgMCwgICA2MiwgIDgyLAorICAgIDAsICAgNDYsICA2NCwgIDAsICAgMjUsICA0MSwgIDAsICAgMCwgICA0LCAgIDAsICAgMTMxLCAxNDksIDAsICAgMTE2LCAxMzQsCisgICAgMCwgICAxMDQsIDExOSwgMCwgICA5MSwgIDEwNCwgMCwgICA3NywgIDg5LCAgMCwgICA2MiwgIDczLCAgMCwgICA0NiwgIDU2LAorICAgIDAsICAgMjUsICAzNCwgIDAsICAgMCwgICAwLCAgIDEwLCAgMTMwLCAxMzMsIDIsICAgMTE2LCAxMTksIDAsICAgMTA0LCAxMDYsCisgICAgMCwgICA5MCwgIDkxLCAgMCwgICA3NiwgIDc4LCAgMCwgICA2MiwgIDY0LCAgMCwgICA0NiwgIDQ4LCAgMCwgICAyNiwgIDI3LAorICAgIDAsICAgMCwgICAwLCAgIDIzLCAgMTMwLCAxMTgsIDIwLCAgMTE2LCAxMDQsIDEzLCAgMTAzLCA5MywgIDMsICAgODksICA3OSwKKyAgICAwLCAgIDc2LCAgNjcsICAwLCAgIDYyLCAgNTQsICAwLCAgIDQ2LCAgMzksICAwLCAgIDI2LCAgMTksICAwLCAgIDAsICAgMCwKKyAgICAzMywgIDEyOSwgMTAxLCAyNywgIDExNSwgODksICAxOSwgIDEwMywgNzksICA5LCAgIDg5LCAgNjcsICAwLCAgIDc1LCAgNTYsCisgICAgMCwgICA2MSwgIDQzLCAgMCwgICA0NiwgIDI5LCAgMCwgICAyNiwgIDEwLCAgMCwgICAwLCAgIDAsICAgNDEsICAxMjgsIDgzLAorICAgIDM1LCAgMTE1LCA3MywgIDI3LCAgMTAyLCA2NCwgIDE1LCAgODksICA1NSwgIDAsICAgNzYsICA0NSwgIDAsICAgNjIsICAzMywKKyAgICAwLCAgIDQ2LCAgMTgsICAwLCAgIDI2LCAgMCwgICAwLCAgIDAsICAgMCwgICA0MywgIDEyOSwgNjksICAzOCwgIDExNSwgNjEsCisgICAgMzAsICAxMDIsIDU0LCAgMTcsICA4OSwgIDQ1LCAgMiwgICA3NSwgIDM0LCAgMCwgICA2MSwgIDIzLCAgMCwgICA0NiwgIDksCisgICAgMCwgICAyNiwgIDAsICAgMCwgICAwLCAgIDAsICAgMSwgICAxMTYsIDE4OCwgMSwgICAxMDQsIDE2OCwgMCwgICA5MiwgIDE1MSwKKyAgICAwLCAgIDc5LCAgMTMyLCAwLCAgIDY2LCAgMTEzLCAwLCAgIDUyLCAgOTQsICAwLCAgIDM2LCAgNzUsICAwLCAgIDE0LCAgNTIsCisgICAgMCwgICAwLCAgIDE0LCAgMTcsICAxMTYsIDE3MSwgMTYsICAxMDQsIDE1MywgMTQsICA5MiwgIDEzNywgOCwgICA3OSwgIDExOSwKKyAgICAwLCAgIDY3LCAgMTAyLCAwLCAgIDUzLCAgODUsICAwLCAgIDM3LCAgNjcsICAwLCAgIDE2LCAgNDQsICAwLCAgIDAsICAgNCwKKyAgICAzMSwgIDExNiwgMTU1LCAyNywgIDEwNCwgMTQwLCAyMSwgIDkyLCAgMTI1LCAxMywgIDc5LCAgMTA5LCAzLCAgIDY2LCAgOTMsCisgICAgMCwgICA1MywgIDc3LCAgMCwgICAzNywgIDU5LCAgMCwgICAxNiwgIDM4LCAgMCwgICAwLCAgIDAsICAgMzcsICAxMTUsIDE0MSwKKyAgICAzMCwgIDEwMywgMTI2LCAyNiwgIDkyLCAgMTEyLCAxNiwgIDc5LCAgOTgsICA1LCAgIDY2LCAgODMsICAwLCAgIDUzLCAgNjcsCisgICAgMCwgICAzOCwgIDUxLCAgMCwgICAxNywgIDMxLCAgMCwgICAwLCAgIDAsICAgNDEsICAxMTUsIDEyNiwgMzcsICAxMDMsIDExMiwKKyAgICAzMSwgIDkyLCAgMTAwLCAyMiwgIDc5LCAgODYsICAxMCwgIDY2LCAgNzIsICAwLCAgIDUzLCAgNTksICAwLCAgIDM4LCAgNDQsCisgICAgMCwgICAxNywgIDIzLCAgMCwgICAwLCAgIDAsICAgNDgsICAxMTUsIDExMSwgNDEsICAxMDIsIDk5LCAgMzQsICA5MSwgIDg4LAorICAgIDI0LCAgNzgsICA3NiwgIDE0LCAgNjYsICA2MywgIDAsICAgNTMsICA1MCwgIDAsICAgMzgsICAzNiwgIDAsICAgMTgsICAxNSwKKyAgICAwLCAgIDAsICAgMCwgICA1MSwgIDExNSwgOTUsICA0NiwgIDEwMiwgODUsICAzNywgIDkxLCAgNzQsICAyNiwgIDc4LCAgNjMsCisgICAgMTYsICA2NiwgIDUyLCAgMCwgICA1MywgIDQwLCAgMCwgICAzOCwgIDI2LCAgMCwgICAxOCwgIDUsICAgMCwgICAwLCAgIDAsCisgICAgNTUsICAxMTQsIDgwLCAgNDcsICAxMDIsIDY5LCAgNDAsICA5MCwgIDYwLCAgMzAsICA3OCwgIDUxLCAgMTksICA2NiwgIDQxLAorICAgIDMsICAgNTMsICAyOSwgIDAsICAgMzgsICAxNSwgIDAsICAgMTcsICAwLCAgIDAsICAgMCwgICAwLCAgIDU2LCAgMTE0LCA2NiwKKyAgICA1MCwgIDEwMiwgNTgsICA0MCwgIDkxLCAgNTAsICAzMiwgIDc4LCAgNDEsICAxOCwgIDY2LCAgMzIsICA0LCAgIDUzLCAgMjEsCisgICAgMCwgICAzOCwgIDUsICAgMCwgICAxNywgIDAsICAgMCwgICAwLCAgIDAsICAgMzksICAxMDIsIDE3OCwgMzcsICA5MCwgIDE1OSwKKyAgICAzMCwgIDc5LCAgMTQyLCAyMSwgIDY4LCAgMTI0LCAxNCwgIDU1LCAgMTA2LCAwLCAgIDQyLCAgODksICAwLCAgIDI2LCAgNzAsCisgICAgMCwgICA0LCAgIDQ2LCAgMCwgICAwLCAgIDgsICAgNDgsICAxMDIsIDE2MSwgNDIsICA5MCwgIDE0NSwgMzUsICA3OSwgIDEyOCwKKyAgICAyNiwgIDY4LCAgMTEyLCAxOSwgIDU1LCAgOTYsICAzLCAgIDQzLCAgNzksICAwLCAgIDI3LCAgNjIsICAwLCAgIDYsICAgNDAsCisgICAgMCwgICAwLCAgIDAsICAgNTAsICAxMDIsIDE0NywgNDQsICA5MCwgIDEzMiwgMzcsICA3OSwgIDExOCwgMzAsICA2OCwgIDEwMiwKKyAgICAyMCwgIDU2LCAgODcsICA3LCAgIDQzLCAgNzIsICAwLCAgIDI4LCAgNTUsICAwLCAgIDYsICAgMzQsICAwLCAgIDAsICAgMCwKKyAgICA1MywgIDEwMSwgMTMzLCA0NywgIDkwLCAgMTE4LCA0MSwgIDc5LCAgMTA2LCAzMiwgIDY4LCAgOTEsICAyMSwgIDU2LCAgNzgsCisgICAgOSwgICA0MywgIDYzLCAgMCwgICAyOCwgIDQ3LCAgMCwgICA2LCAgIDI2LCAgMCwgICAwLCAgIDAsICAgNTcsICAxMDEsIDExOSwKKyAgICA1MCwgIDg5LCAgMTA2LCA0MiwgIDc5LCAgOTQsICAzNCwgIDY3LCAgODEsICAyNCwgIDU2LCAgNjgsICA5LCAgIDQ0LCAgNTUsCisgICAgMCwgICAyOSwgIDQwLCAgMCwgICA2LCAgIDE5LCAgMCwgICAwLCAgIDAsICAgNjAsICAxMDAsIDEwNSwgNTAsICA5MCwgIDk0LAorICAgIDQ1LCAgODAsICA4MywgIDM2LCAgNjgsICA3MSwgIDI0LCAgNTYsICA1OSwgIDExLCAgNDQsICA0NiwgIDAsICAgMjksICAzMiwKKyAgICAwLCAgIDcsICAgMTIsICAwLCAgIDAsICAgMCwgICA2MywgIDEwMSwgOTEsICA1NSwgIDkwLCAgODAsICA0NiwgIDc5LCAgNzAsCisgICAgMzcsICA2OCwgIDU5LCAgMjYsICA1NiwgIDQ5LCAgMTIsICA0NCwgIDM3LCAgMSwgICAyOSwgIDIzLCAgMCwgICA3LCAgIDMsCisgICAgMCwgICAwLCAgIDAsICAgNjQsICAxMDEsIDc1LCAgNTYsICA4OSwgIDY3LCAgNDgsICA3OSwgIDU3LCAgMzcsICA2OCwgIDQ4LAorICAgIDI3LCAgNTYsICAzNywgIDE1LCAgNDQsICAyNiwgIDAsICAgMjksICAxMiwgIDAsICAgNywgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDY2LCAgMTAxLCA2NCwgIDU4LCAgODksICA1NSwgIDQ5LCAgNzksICA0NywgIDM5LCAgNjgsICAzOCwgIDI3LCAgNTYsICAyOSwKKyAgICAxNCwgIDQ0LCAgMTgsICAxLCAgIDMwLCAgMiwgICAwLCAgIDcsICAgMCwgICAwLCAgIDAsICAgMCwgICA1NywgIDg2LCAgMTY1LAorICAgIDUxLCAgNzUsICAxNDgsIDQ1LCAgNjUsICAxMzMsIDM4LCAgNTQsICAxMTYsIDI4LCAgNDMsICAxMDAsIDE2LCAgMjksICA4MywKKyAgICAwLCAgIDEzLCAgNjQsICAwLCAgIDAsICAgNDIsICAwLCAgIDAsICAgMywgICA2MCwgIDg2LCAgMTUxLCA1NSwgIDc1LCAgMTM1LAorICAgIDQ3LCAgNjYsICAxMjEsIDM5LCAgNTUsICAxMDUsIDMwLCAgNDQsICA5MCwgIDE4LCAgMzEsICA3NCwgIDMsICAgMTYsICA1NywKKyAgICAwLCAgIDEsICAgMzUsICAwLCAgIDAsICAgMCwgICA2MiwgIDg2LCAgMTM5LCA1NiwgIDc1LCAgMTIzLCA0OSwgIDY2LCAgMTEwLAorICAgIDQwLCAgNTUsICA5NSwgIDMwLCAgNDQsICA4MSwgIDE5LCAgMzEsICA2NiwgIDQsICAgMTcsICA1MSwgIDAsICAgMSwgICAyOSwKKyAgICAwLCAgIDAsICAgMCwgICA2NSwgIDg2LCAgMTI1LCA1NiwgIDc2LCAgMTEyLCA0OSwgIDY2LCAgOTksICAzOSwgIDU1LCAgODYsCisgICAgMzEsICA0NCwgIDcyLCAgMTksICAzMiwgIDU5LCAgNSwgICAxOCwgIDQ0LCAgMCwgICAxLCAgIDIzLCAgMCwgICAwLCAgIDAsCisgICAgNjcsICA4NiwgIDExMywgNTgsICA3NSwgIDEwMCwgNTEsICA2NiwgIDg4LCAgNDEsICA1NiwgIDc3LCAgMzEsICA0NSwgIDY0LAorICAgIDIwLCAgMzIsICA1MSwgIDYsICAgMTgsICAzNSwgIDAsICAgMSwgICAxNCwgIDAsICAgMCwgICAwLCAgIDY5LCAgODYsICA5OSwKKyAgICA2MSwgIDc2LCAgODgsICA1MiwgIDY2LCAgNzgsICA0MywgIDU2LCAgNjYsICAzMiwgIDQ1LCAgNTUsICAyMCwgIDMzLCAgNDIsCisgICAgNywgICAxOSwgIDI3LCAgMCwgICAxLCAgIDYsICAgMCwgICAwLCAgIDAsICAgNjksICA4NiwgIDg2LCAgNjEsICA3NiwgIDc1LAorICAgIDUzLCAgNjcsICA2NiwgIDQzLCAgNTYsICA1NSwgIDMzLCAgNDUsICA0NSwgIDIxLCAgMzQsICAzNCwgIDgsICAgMjAsICAyMCwKKyAgICAwLCAgIDIsICAgMiwgICAwLCAgIDAsICAgMCwgICA3MSwgIDg2LCAgNzIsICA2MywgIDc1LCAgNjIsICA1NCwgIDY2LCAgNTUsCisgICAgNDUsICA1NiwgIDQ1LCAgMzMsICA0NSwgIDM1LCAgMjIsICAzNCwgIDIzLCAgNywgICAyMCwgIDgsICAgMCwgICAyLCAgIDAsCisgICAgMCwgICAwLCAgIDAsICAgNzEsICA4NiwgIDYyLCAgNjQsICA3NSwgIDUzLCAgNTUsICA2NiwgIDQ2LCAgNDUsICA1NiwgIDM2LAorICAgIDMzLCAgNDYsICAyNywgIDIyLCAgMzQsICAxNSwgIDgsICAgMjAsICAwLCAgIDAsICAgMiwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDY5LCAgNjcsICAxNTYsIDYxLCAgNTgsICAxNDAsIDUzLCAgNTAsICAxMjUsIDQ1LCAgMzksICAxMDgsIDM1LCAgMjgsICA5MywKKyAgICAyNSwgIDEyLCAgNzcsICAxMiwgIDAsICAgNTksICAwLCAgIDAsICAgMzcsICAwLCAgIDAsICAgMCwgICA3MSwgIDY4LCAgMTQyLAorICAgIDYzLCAgNTksICAxMjYsIDU2LCAgNTAsICAxMTQsIDQ3LCAgNDAsICA5OCwgIDM3LCAgMjgsICA4NCwgIDI2LCAgMTUsICA2OCwKKyAgICAxMiwgIDAsICAgNTMsICAwLCAgIDAsICAgMzAsICAwLCAgIDAsICAgMCwgICA3MiwgIDY4LCAgMTMwLCA2MywgIDU5LCAgMTE2LAorICAgIDU2LCAgNTAsICAxMDQsIDQ3LCAgNDAsICA5MCwgIDM4LCAgMzAsICA3NSwgIDI3LCAgMTYsICA2MSwgIDEzLCAgMCwgICA0NiwKKyAgICAwLCAgIDAsICAgMjQsICAwLCAgIDAsICAgMCwgICA3MywgIDY5LCAgMTE4LCA2NSwgIDU5LCAgMTA1LCA1NywgIDUxLCAgOTIsCisgICAgNDcsICA0MSwgIDgwLCAgMzcsICAzMCwgIDY3LCAgMjYsICAxOCwgIDUzLCAgMTQsICAxLCAgIDM5LCAgMCwgICAwLCAgIDE4LAorICAgIDAsICAgMCwgICAwLCAgIDc0LCAgNjksICAxMDYsIDY1LCAgNjAsICA5MywgIDU3LCAgNTEsICA4MiwgIDQ4LCAgNDEsICA3MCwKKyAgICAzOCwgIDMxLCAgNTksICAyNiwgIDE5LCAgNDYsICAxMywgIDIsICAgMzIsICAwLCAgIDAsICAgMTAsICAwLCAgIDAsICAgMCwKKyAgICA3NiwgIDY5LCAgOTUsICA2NiwgIDYxLCAgODQsICA1OCwgIDUyLCAgNzMsICA0OCwgIDQyLCAgNjEsICAzNywgIDMyLCAgNTAsCisgICAgMjYsICAyMCwgIDM4LCAgMTQsICA0LCAgIDI0LCAgMCwgICAwLCAgIDQsICAgMCwgICAwLCAgIDAsICAgNzYsICA2OSwgIDgxLAorICAgIDY4LCAgNjAsICA3MiwgIDU4LCAgNTIsICA2MiwgIDQ4LCAgNDIsICA1MSwgIDM4LCAgMzIsICA0MSwgIDI3LCAgMjEsICAzMCwKKyAgICAxNCwgIDQsICAgMTYsICAwLCAgIDAsICAgMSwgICAwLCAgIDAsICAgMCwgICA3NiwgIDY5LCAgNjgsICA2OCwgIDYxLCAgNjAsCisgICAgNjAsICA1MiwgIDUxLCAgNDksICA0MywgIDQxLCAgMzgsICAzMywgIDMyLCAgMjcsICAyMSwgIDIwLCAgMTQsICA1LCAgIDUsCisgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgNzgsICA3MCwgIDU5LCAgNjksICA2MSwgIDUwLCAgNjAsICA1MiwgIDQyLAorICAgIDQ5LCAgNDMsICAzNCwgIDM5LCAgMzMsICAyNCwgIDI3LCAgMjIsICAxMywgIDE0LCAgNywgICAxLCAgIDAsICAgMCwgICAwLAorICAgIDAsICAgMCwgICAwLCAgIDc1LCAgNDYsICAxNDYsIDY4LCAgMzgsICAxMzEsIDYwLCAgMzAsICAxMTcsIDUwLCAgMTksICAxMDIsCisgICAgNDEsICA0LCAgIDg3LCAgMjksICAwLCAgIDcyLCAgMTMsICAwLCAgIDU1LCAgMCwgICAwLCAgIDMzLCAgMCwgICAwLCAgIDAsCisgICAgNzgsICA0NywgIDEzMiwgNzAsICAzOSwgIDExOSwgNjEsICAzMCwgIDEwNSwgNTMsICAyMCwgIDkyLCAgNDIsICA1LCAgIDc4LAorICAgIDMwLCAgMCwgICA2NCwgIDEzLCAgMCwgICA0OSwgIDAsICAgMCwgICAyNywgIDAsICAgMCwgICAwLCAgIDc5LCAgNDgsICAxMjIsCisgICAgNzAsICA0MCwgIDEwOCwgNjIsICAzMiwgIDk2LCAgNTIsICAyMiwgIDg0LCAgNDIsICA5LCAgIDcxLCAgMzAsICAwLCAgIDU4LAorICAgIDE0LCAgMCwgICA0MiwgIDAsICAgMCwgICAyMCwgIDAsICAgMCwgICAwLCAgIDc5LCAgNTAsICAxMTEsIDcwLCAgNDIsICA5OSwKKyAgICA2MiwgIDMzLCAgODgsICA1MiwgIDIzLCAgNzQsICA0MSwgIDExLCAgNjMsICAyOSwgIDAsICAgNTAsICAxNCwgIDAsICAgMzYsCisgICAgMCwgICAwLCAgIDE0LCAgMCwgICAwLCAgIDAsICAgODAsICA1MCwgIDk5LCAgNzAsICA0MiwgIDg5LCAgNjEsICAzNCwgIDc4LAorICAgIDUyLCAgMjUsICA2NywgIDQxLCAgMTQsICA1NSwgIDMwLCAgMCwgICA0MiwgIDE1LCAgMCwgICAyOCwgIDAsICAgMCwgICA2LAorICAgIDAsICAgMCwgICAwLCAgIDgxLCAgNTEsICA4OSwgIDcxLCAgNDMsICA3OCwgIDYyLCAgMzUsICA2OSwgIDUyLCAgMjUsICA1OCwKKyAgICA0MiwgIDE1LCAgNDcsICAzMCwgIDMsICAgMzYsICAxNSwgIDAsICAgMjIsICAwLCAgIDAsICAgMywgICAwLCAgIDAsICAgMCwKKyAgICA4MSwgIDUxLCAgNzcsICA3MSwgIDQ0LCAgNjgsICA2MywgIDM2LCAgNTksICA1MywgIDI2LCAgNDksICA0MSwgIDE2LCAgMzgsCisgICAgMzEsICA0LCAgIDI3LCAgMTYsICAwLCAgIDEyLCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgODEsICA1MiwgIDY1LAorICAgIDcyLCAgNDMsICA1NiwgIDYzLCAgMzYsICA0OCwgIDUzLCAgMjcsICAzOSwgIDQxLCAgMTcsICAyOSwgIDMwLCAgNCwgICAxOCwKKyAgICAxNCwgIDAsICAgMywgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICA4MSwgIDUyLCAgNTUsICA3MywgIDQ0LCAgNDcsCisgICAgNjQsICAzNiwgIDM5LCAgNTMsICAyOCwgIDMyLCAgNDIsICAxOCwgIDIxLCAgMzEsICA2LCAgIDksICAgMTQsICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxNzQsIDIzOSwgMCwgICAxNTYsIDIxNCwgMCwgICAxMzksIDE5MiwKKyAgICAwLCAgIDEyMSwgMTY4LCAwLCAgIDEwNSwgMTQ1LCAwLCAgIDg3LCAgMTIzLCAwLCAgIDY4LCAgOTgsICAwLCAgIDQ2LCAgNzAsCisgICAgMCwgICAzLCAgIDM1LCAgMCwgICAxNzIsIDIxNywgMCwgICAxNTUsIDE5NCwgMCwgICAxMzksIDE3MywgMCwgICAxMjEsIDE1MiwKKyAgICAwLCAgIDEwNCwgMTMwLCAwLCAgIDg3LCAgMTEwLCAwLCAgIDY5LCAgODgsICAwLCAgIDQ2LCAgNjMsICAwLCAgIDQsICAgMjgsCisgICAgMCwgICAxNzEsIDE5NywgMCwgICAxNTMsIDE3NSwgMCwgICAxMzgsIDE1OCwgMCwgICAxMjEsIDEzOSwgMCwgICAxMDMsIDExOCwKKyAgICAwLCAgIDg2LCAgMTAwLCAwLCAgIDY4LCAgNzksICAwLCAgIDQ2LCAgNTUsICAwLCAgIDQsICAgMjIsICAwLCAgIDE3MCwgMTc3LAorICAgIDAsICAgMTUyLCAxNTgsIDAsICAgMTM2LCAxNDEsIDAsICAgMTE5LCAxMjQsIDAsICAgMTAzLCAxMDYsIDAsICAgODYsICA4OCwKKyAgICAwLCAgIDY4LCAgNzAsICAwLCAgIDQ1LCAgNDcsICAwLCAgIDMsICAgMTQsICAwLCAgIDE2OSwgMTU3LCAwLCAgIDE1MiwgMTQxLAorICAgIDAsICAgMTM2LCAxMjYsIDAsICAgMTE5LCAxMDksIDAsICAgMTAyLCA5NCwgIDAsICAgODYsICA3OCwgIDAsICAgNjgsICA2MCwKKyAgICAwLCAgIDQ2LCAgMzksICAwLCAgIDMsICAgNSwgICAwLCAgIDE2NywgMTM4LCAwLCAgIDE1MCwgMTI0LCAwLCAgIDEzNSwgMTExLAorICAgIDAsICAgMTE4LCA5NywgIDAsICAgMTAyLCA4MiwgIDAsICAgODUsICA2OCwgIDAsICAgNjgsICA1MiwgIDAsICAgNDYsICAzMSwKKyAgICAwLCAgIDMsICAgMCwgICAwLCAgIDE2NywgMTE4LCAwLCAgIDE1MCwgMTA0LCAwLCAgIDEzNSwgOTQsICAwLCAgIDExOCwgODEsCisgICAgMCwgICAxMDEsIDY5LCAgMCwgICA4NCwgIDU2LCAgMCwgICA2NywgIDQxLCAgMCwgICA0NSwgIDIxLCAgMCwgICAzLCAgIDAsCisgICAgMCwgICAxNjYsIDk3LCAgMCwgICAxNDksIDg3LCAgMCwgICAxMzQsIDc3LCAgMCwgICAxMTcsIDY3LCAgMCwgICAxMDEsIDU2LAorICAgIDAsICAgODUsICA0NCwgIDAsICAgNjcsICAzMCwgIDAsICAgNDUsICAxMCwgIDAsICAgMywgICAwLCAgIDAsICAgMTY1LCA3OSwKKyAgICAwLCAgIDE0OSwgNzMsICAwLCAgIDEzMywgNjQsICAwLCAgIDExNywgNTYsICAwLCAgIDEwMSwgNDYsICAwLCAgIDg1LCAgMzQsCisgICAgMCwgICA2OCwgIDIxLCAgMCwgICA0NiwgIDEsICAgMCwgICAzLCAgIDAsICAgMCwgICAxNTgsIDIyNSwgMCwgICAxNDEsIDIwMSwKKyAgICAwLCAgIDEyNiwgMTgwLCAwLCAgIDEwOSwgMTU4LCAwLCAgIDk0LCAgMTM2LCAwLCAgIDc4LCAgMTE0LCAwLCAgIDYwLCAgOTEsCisgICAgMCwgICAzOCwgIDY2LCAgMCwgICAwLCAgIDMwLCAgMCwgICAxNTYsIDIwMywgMCwgICAxNDAsIDE4MywgMCwgICAxMjUsIDE2NCwKKyAgICAwLCAgIDEwOSwgMTQzLCAwLCAgIDk0LCAgMTI0LCAwLCAgIDc4LCAgMTA0LCAwLCAgIDYxLCAgODMsICAwLCAgIDM4LCAgNTcsCisgICAgMCwgICAwLCAgIDIzLCAgMCwgICAxNTYsIDE4NiwgMCwgICAxNDAsIDE2NiwgMCwgICAxMjUsIDE1MCwgMCwgICAxMDksIDEzMCwKKyAgICAwLCAgIDkzLCAgMTExLCAwLCAgIDc3LCAgOTMsICAwLCAgIDYwLCAgNzQsICAwLCAgIDM4LCAgNTAsICAwLCAgIDAsICAgMTcsCisgICAgMCwgICAxNTUsIDE2NywgMCwgICAxMzgsIDE0OSwgMCwgICAxMjQsIDEzNCwgMCwgICAxMDksIDExNywgMCwgICA5MywgIDEwMCwKKyAgICAwLCAgIDc2LCAgODMsICAwLCAgIDYwLCAgNjUsICAwLCAgIDM4LCAgNDMsICAwLCAgIDAsICAgOSwgICAwLCAgIDE1MywgMTQ3LAorICAgIDAsICAgMTM4LCAxMzQsIDAsICAgMTI0LCAxMjAsIDAsICAgMTA3LCAxMDMsIDAsICAgOTIsICA4OCwgIDAsICAgNzcsICA3MywKKyAgICAwLCAgIDYwLCAgNTYsICAwLCAgIDM4LCAgMzUsICAwLCAgIDAsICAgMCwgICAwLCAgIDE1MywgMTMxLCAwLCAgIDEzNywgMTE4LAorICAgIDAsICAgMTIyLCAxMDUsIDAsICAgMTA3LCA5MCwgIDAsICAgOTEsICA3NiwgIDAsICAgNzYsICA2MywgIDAsICAgNjAsICA0NywKKyAgICAwLCAgIDM5LCAgMjgsICAwLCAgIDAsICAgMCwgICAwLCAgIDE1MywgMTExLCAwLCAgIDEzNiwgMTAwLCAwLCAgIDEyMywgOTAsCisgICAgMCwgICAxMDcsIDc3LCAgMCwgICA5MiwgIDY1LCAgMCwgICA3NiwgIDUyLCAgMCwgICA2MCwgIDM3LCAgMCwgICAzOCwgIDE4LAorICAgIDAsICAgMCwgICAwLCAgIDAsICAgMTUyLCA5MywgIDAsICAgMTM2LCA4MiwgIDAsICAgMTIyLCA3NCwgIDAsICAgMTA2LCA2MywKKyAgICAwLCAgIDkxLCAgNTIsICAwLCAgIDc2LCAgNDAsICAwLCAgIDU5LCAgMjYsICAwLCAgIDM4LCAgNiwgICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDE1MSwgNzgsICAwLCAgIDEzNiwgNjksICAwLCAgIDEyMSwgNjEsICAwLCAgIDEwNiwgNTIsICAwLCAgIDkxLCAgNDMsCisgICAgMCwgICA3NiwgIDMyLCAgMCwgICA1OSwgIDE3LCAgMCwgICAzOCwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxNDMsIDIxMywKKyAgICAwLCAgIDEyOCwgMTkxLCAwLCAgIDExNSwgMTcxLCAwLCAgIDEwMCwgMTQ5LCAwLCAgIDg0LCAgMTI4LCAwLCAgIDY5LCAgMTA4LAorICAgIDAsICAgNTIsICA4NiwgIDAsICAgMzAsICA2MSwgIDAsICAgMCwgICAyNSwgIDAsICAgMTQyLCAxOTMsIDAsICAgMTI3LCAxNzMsCisgICAgMCwgICAxMTQsIDE1NCwgMCwgICA5OSwgIDEzNCwgMCwgICA4NCwgIDExNiwgMCwgICA2OSwgIDk4LCAgMCwgICA1MiwgIDc3LAorICAgIDAsICAgMzEsICA1MywgIDAsICAgMCwgICAxOCwgIDAsICAgMTQxLCAxNzYsIDAsICAgMTI3LCAxNTgsIDAsICAgMTE0LCAxNDEsCisgICAgMCwgICA5OCwgIDEyMiwgMCwgICA4NCwgIDEwNSwgMCwgICA2OSwgIDg4LCAgMCwgICA1MywgIDY5LCAgMCwgICAzMSwgIDQ2LAorICAgIDAsICAgMCwgICA5LCAgIDAsICAgMTQxLCAxNTksIDAsICAgMTI2LCAxNDIsIDAsICAgMTEzLCAxMjcsIDAsICAgOTgsICAxMTAsCisgICAgMCwgICA4MywgIDk1LCAgMCwgICA2OSwgIDc4LCAgMCwgICA1MywgIDYwLCAgMCwgICAzMiwgIDM5LCAgMCwgICAwLCAgIDIsCisgICAgMCwgICAxNDAsIDE0MCwgMCwgICAxMjYsIDEyNiwgMCwgICAxMTIsIDExMiwgMCwgICA5OCwgIDk4LCAgMCwgICA4MywgIDgzLAorICAgIDAsICAgNjgsICA2OSwgIDAsICAgNTIsICA1MiwgIDAsICAgMzEsICAzMSwgIDAsICAgMCwgICAwLCAgIDAsICAgMTQwLCAxMjQsCisgICAgMCwgICAxMjUsIDExMiwgMCwgICAxMTIsIDEwMCwgMCwgICA5NywgIDg2LCAgMCwgICA4MywgIDcyLCAgMCwgICA2OCwgIDU5LAorICAgIDAsICAgNTIsICA0NCwgIDAsICAgMzEsICAyMywgIDAsICAgMCwgICAwLCAgIDAsICAgMTM5LCAxMDYsIDAsICAgMTI1LCA5NiwKKyAgICAwLCAgIDExMSwgODUsICAwLCAgIDk3LCAgNzIsICAwLCAgIDgzLCAgNjIsICAwLCAgIDY4LCAgNDksICAwLCAgIDUyLCAgMzUsCisgICAgMCwgICAzMSwgIDE1LCAgMCwgICAwLCAgIDAsICAgMCwgICAxMzgsIDg4LCAgMCwgICAxMjQsIDc5LCAgMCwgICAxMTEsIDcwLAorICAgIDAsICAgOTYsICA1OSwgIDAsICAgODIsICA0OCwgIDAsICAgNjgsICAzOCwgIDAsICAgNTIsICAyNCwgIDAsICAgMzEsICA0LAorICAgIDAsICAgMCwgICAwLCAgIDAsICAgMTM5LCA3NiwgIDAsICAgMTI0LCA2NiwgIDAsICAgMTExLCA1OCwgIDAsICAgOTYsICA1MCwKKyAgICAwLCAgIDgyLCAgNDAsICAwLCAgIDY4LCAgMjksICAwLCAgIDUyLCAgMTUsICAwLCAgIDMxLCAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDEyOSwgMjAwLCAwLCAgIDExNCwgMTc5LCAwLCAgIDEwMiwgMTYwLCAwLCAgIDg3LCAgMTM5LCAwLCAgIDc0LCAgMTIwLAorICAgIDAsICAgNjAsICAxMDEsIDAsICAgNDQsICA4MSwgIDAsICAgMjIsICA1NiwgIDAsICAgMCwgICAxOSwgIDAsICAgMTI3LCAxODEsCisgICAgMCwgICAxMTQsIDE2MywgMCwgICAxMDIsIDE0NiwgMCwgICA4OCwgIDEyNywgMCwgICA3NCwgIDEwOSwgMCwgICA2MCwgIDkxLAorICAgIDAsICAgNDQsICA3MiwgIDAsICAgMjMsICA0OCwgIDAsICAgMCwgICAxMSwgIDAsICAgMTI3LCAxNjYsIDAsICAgMTEzLCAxNDgsCisgICAgMCwgICAxMDEsIDEzMywgMCwgICA4NywgIDExNSwgMCwgICA3NCwgIDk5LCAgMCwgICA2MCwgIDgyLCAgMCwgICA0NCwgIDY0LAorICAgIDAsICAgMjMsICA0MiwgIDAsICAgMCwgICA0LCAgIDAsICAgMTI3LCAxNTAsIDAsICAgMTEzLCAxMzQsIDAsICAgMTAxLCAxMTksCisgICAgMCwgICA4NywgIDEwNCwgMCwgICA3NCwgIDg5LCAgMCwgICA2MCwgIDczLCAgMCwgICA0NCwgIDU2LCAgMCwgICAyMywgIDM1LAorICAgIDAsICAgMCwgICAwLCAgIDAsICAgMTI1LCAxMzQsIDAsICAgMTEyLCAxMTgsIDAsICAgMTAwLCAxMDYsIDAsICAgODcsICA5MiwKKyAgICAwLCAgIDczLCAgNzgsICAwLCAgIDYwLCAgNjQsICAwLCAgIDQ0LCAgNDgsICAwLCAgIDIzLCAgMjcsICAwLCAgIDAsICAgMCwKKyAgICAwLCAgIDEyNSwgMTE4LCAwLCAgIDExMiwgMTA1LCAwLCAgIDEwMCwgOTQsICAwLCAgIDg2LCAgODAsICAwLCAgIDczLCAgNjgsCisgICAgMCwgICA2MCwgIDU0LCAgMCwgICA0NCwgIDM5LCAgMCwgICAyMywgIDIwLCAgMCwgICAwLCAgIDAsICAgMCwgICAxMjUsIDEwMSwKKyAgICAwLCAgIDExMSwgOTAsICAwLCAgIDk5LCAgODAsICAwLCAgIDg2LCAgNjksICAwLCAgIDczLCAgNTgsICAwLCAgIDU5LCAgNDUsCisgICAgMCwgICA0NCwgIDMwLCAgMCwgICAyMywgIDExLCAgMCwgICAwLCAgIDAsICAgMCwgICAxMjQsIDg1LCAgMCwgICAxMTEsIDc1LAorICAgIDAsICAgOTksICA2NiwgIDAsICAgODYsICA1NiwgIDAsICAgNzMsICA0NSwgIDAsICAgNTksICAzNCwgIDAsICAgNDQsICAyMCwKKyAgICAwLCAgIDIzLCAgMSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDEyNSwgNzIsICAwLCAgIDExMSwgNjIsICAwLCAgIDk5LCAgNTYsCisgICAgMCwgICA4NiwgIDQ2LCAgMCwgICA3MywgIDM2LCAgMCwgICA2MCwgIDI2LCAgMCwgICA0NCwgIDEyLCAgMCwgICAyMywgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMCwgICAxMTQsIDE4OCwgMCwgICAxMDEsIDE2NywgMCwgICA4OSwgIDE1MCwgMCwgICA3NywgIDEzMSwKKyAgICAwLCAgIDY0LCAgMTEzLCAwLCAgIDUwLCAgOTUsICAwLCAgIDM0LCAgNzUsICAwLCAgIDEyLCAgNTIsICAwLCAgIDAsICAgMTQsCisgICAgMCwgICAxMTMsIDE3MCwgMCwgICAxMDEsIDE1MywgMCwgICA4OSwgIDEzNywgMCwgICA3NywgIDEyMCwgMCwgICA2NCwgIDEwMiwKKyAgICAwLCAgIDUwLCAgODUsICAwLCAgIDM1LCAgNjcsICAwLCAgIDEyLCAgNDQsICAwLCAgIDAsICAgNCwgICAwLCAgIDExMywgMTU2LAorICAgIDAsICAgMTAwLCAxMzksIDAsICAgODksICAxMjUsIDAsICAgNzcsICAxMDksIDAsICAgNjQsICA5MiwgIDAsICAgNTEsICA3NywKKyAgICAwLCAgIDM1LCAgNjAsICAwLCAgIDEyLCAgMzgsICAwLCAgIDAsICAgMCwgICAwLCAgIDExMiwgMTQxLCAwLCAgIDEwMCwgMTI2LAorICAgIDAsICAgODksICAxMTMsIDAsICAgNzcsICA5OCwgIDAsICAgNjQsICA4MywgIDAsICAgNTEsICA2OCwgIDAsICAgMzUsICA1MSwKKyAgICAwLCAgIDEyLCAgMzAsICAwLCAgIDAsICAgMCwgICAwLCAgIDExMiwgMTI3LCAwLCAgIDEwMCwgMTEyLCAwLCAgIDg5LCAgMTAwLAorICAgIDAsICAgNzYsICA4NywgIDAsICAgNjQsICA3NCwgIDAsICAgNTEsICA1OSwgIDAsICAgMzUsICA0NCwgIDAsICAgMTMsICAyNCwKKyAgICAwLCAgIDAsICAgMCwgICAwLCAgIDExMiwgMTExLCAwLCAgIDEwMCwgMTAwLCAwLCAgIDg4LCAgODgsICAwLCAgIDc2LCAgNzYsCisgICAgMCwgICA2NCwgIDY0LCAgMCwgICA1MSwgIDUyLCAgMCwgICAzNiwgIDM3LCAgMCwgICAxMywgIDE3LCAgMCwgICAwLCAgIDAsCisgICAgMCwgICAxMTEsIDk2LCAgMCwgICA5OSwgIDg1LCAgMCwgICA4OCwgIDc2LCAgMCwgICA3NiwgIDY0LCAgMCwgICA2NCwgIDUzLAorICAgIDAsICAgNTEsICA0MSwgIDAsICAgMzYsICAyNywgIDAsICAgMTMsICA2LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTExLCA4MSwKKyAgICAwLCAgIDk5LCAgNzEsICAwLCAgIDg4LCAgNjIsICAwLCAgIDc2LCAgNTIsICAwLCAgIDY0LCAgNDMsICAwLCAgIDUxLCAgMzEsCisgICAgMCwgICAzNiwgIDE3LCAgMCwgICAxMywgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxMTEsIDY5LCAgMCwgICA5OSwgIDYwLAorICAgIDAsICAgODgsICA1MiwgIDAsICAgNzUsICA0MywgIDAsICAgNjMsICAzNCwgIDAsICAgNTEsICAyMSwgIDAsICAgMzYsICA3LAorICAgIDAsICAgMTMsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgOTksICAxNzcsIDAsICAgODgsICAxNTgsIDAsICAgNzcsICAxNDEsCisgICAgMCwgICA2NiwgIDEyMywgMCwgICA1MywgIDEwNiwgMCwgICA0MCwgIDg5LCAgMCwgICAyNSwgIDcxLCAgMCwgICA1LCAgIDQ3LAorICAgIDAsICAgMCwgICA4LCAgIDAsICAgOTksICAxNjAsIDAsICAgODgsICAxNDQsIDAsICAgNzcsICAxMjksIDAsICAgNjYsICAxMTIsCisgICAgMCwgICA1NCwgIDk3LCAgMCwgICA0MSwgIDgwLCAgMCwgICAyNiwgIDYyLCAgMCwgICA1LCAgIDQwLCAgMCwgICAwLCAgIDAsCisgICAgMCwgICA5OSwgIDE0NywgMCwgICA4NywgIDEzMiwgMCwgICA3OCwgIDExNywgMCwgICA2NiwgIDEwMiwgMCwgICA1NCwgIDg3LAorICAgIDAsICAgNDIsICA3MiwgIDAsICAgMjYsICA1NSwgIDAsICAgNSwgICAzNCwgIDAsICAgMCwgICAwLCAgIDAsICAgOTksICAxMzQsCisgICAgMCwgICA4OCwgIDExOSwgMCwgICA3NywgIDEwNywgMCwgICA2NiwgIDkyLCAgMCwgICA1NCwgIDc4LCAgMCwgICA0MiwgIDY0LAorICAgIDAsICAgMjcsICA0OCwgIDAsICAgNSwgICAyNywgIDAsICAgMCwgICAwLCAgIDAsICAgOTksICAxMjAsIDAsICAgODcsICAxMDcsCisgICAgMCwgICA3OCwgIDk0LCAgMCwgICA2NiwgIDgxLCAgMCwgICA1NCwgIDY4LCAgMCwgICA0MiwgIDU1LCAgMCwgICAyNywgIDQwLAorICAgIDAsICAgNiwgICAyMCwgIDAsICAgMCwgICAwLCAgIDAsICAgOTgsICAxMDUsIDAsICAgODcsICA5NCwgIDAsICAgNzcsICA4NCwKKyAgICAwLCAgIDY1LCAgNzEsICAwLCAgIDU1LCAgNTksICAwLCAgIDQyLCAgNDcsICAwLCAgIDI4LCAgMzMsICAwLCAgIDYsICAgMTIsCisgICAgMCwgICAwLCAgIDAsICAgMCwgICA5OCwgIDkzLCAgMCwgICA4NywgIDgxLCAgMCwgICA3NywgIDcyLCAgMCwgICA2NiwgIDYxLAorICAgIDAsICAgNTQsICA0OSwgIDAsICAgNDIsICAzNywgIDAsICAgMjgsICAyNCwgIDAsICAgNiwgICA0LCAgIDAsICAgMCwgICAwLAorICAgIDAsICAgOTgsICA3NywgIDAsICAgODcsICA2OCwgIDAsICAgNzcsICA1OSwgIDAsICAgNjUsICA0OSwgIDAsICAgNTQsICAzOSwKKyAgICAwLCAgIDQyLCAgMjcsICAwLCAgIDI5LCAgMTQsICAwLCAgIDYsICAgMCwgICAwLCAgIDAsICAgMCwgICAxLCAgIDk4LCAgNjUsCisgICAgNywgICA4NywgIDU2LCAgMCwgICA3NywgIDQ5LCAgMCwgICA2NiwgIDQxLCAgMCwgICA1NCwgIDMwLCAgMCwgICA0MiwgIDE5LAorICAgIDAsICAgMjksICAzLCAgIDAsICAgNiwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgODQsICAxNjYsIDAsICAgNzQsICAxNDksCisgICAgMCwgICA2NCwgIDEzNCwgMCwgICA1MywgIDExNywgMCwgICA0MSwgIDEwMCwgMCwgICAyOCwgIDgzLCAgMCwgICAxMSwgIDY0LAorICAgIDAsICAgMCwgICA0MiwgIDAsICAgMCwgICAzLCAgIDAsICAgODQsICAxNTEsIDAsICAgNzQsICAxMzUsIDAsICAgNjQsICAxMjEsCisgICAgMCwgICA1MywgIDEwNSwgMCwgICA0MiwgIDkwLCAgMCwgICAzMCwgIDc1LCAgMCwgICAxNCwgIDU4LCAgMCwgICAwLCAgIDM2LAorICAgIDAsICAgMCwgICAwLCAgIDAsICAgODQsICAxMzgsIDAsICAgNzQsICAxMjQsIDEsICAgNjQsICAxMTAsIDAsICAgNTQsICA5NSwKKyAgICAwLCAgIDQzLCAgODEsICAwLCAgIDMwLCAgNjcsICAwLCAgIDE1LCAgNTEsICAwLCAgIDEsICAgMjksICAwLCAgIDAsICAgMCwKKyAgICAxNCwgIDg0LCAgMTI2LCAxMiwgIDc0LCAgMTEyLCAyLCAgIDY1LCAgOTksICAwLCAgIDU0LCAgODUsICAwLCAgIDQ0LCAgNzMsCisgICAgMCwgICAzMSwgIDU5LCAgMCwgICAxNiwgIDQ0LCAgMCwgICAxLCAgIDIzLCAgMCwgICAwLCAgIDAsICAgMTYsICA4NCwgIDExMywKKyAgICAxMywgIDc0LCAgMTAwLCA2LCAgIDY1LCAgODksICAwLCAgIDU0LCAgNzcsICAwLCAgIDQ0LCAgNjUsICAwLCAgIDMxLCAgNTEsCisgICAgMCwgICAxNywgIDM2LCAgMCwgICAxLCAgIDE2LCAgMCwgICAwLCAgIDAsICAgMjQsICA4NCwgIDEwMCwgMTgsICA3NCwgIDg4LAorICAgIDEzLCAgNjUsICA3OCwgIDIsICAgNTUsICA2OCwgIDAsICAgNDQsICA1NSwgIDAsICAgMzIsICA0MywgIDAsICAgMTgsICAyOCwKKyAgICAwLCAgIDEsICAgNiwgICAwLCAgIDAsICAgMCwgICAyNiwgIDg0LCAgODcsICAyNCwgIDc0LCAgNzYsICAxNywgIDY1LCAgNjcsCisgICAgNywgICA1NCwgIDU3LCAgMCwgICA0NCwgIDQ2LCAgMCwgICAzMiwgIDM1LCAgMCwgICAxOSwgIDIxLCAgMCwgICAyLCAgIDMsCisgICAgMCwgICAwLCAgIDAsICAgMzAsICA4NCwgIDc0LCAgMjgsICA3NCwgIDY0LCAgMjAsICA2NSwgIDU1LCAgMTIsICA1NSwgIDQ2LAorICAgIDAsICAgNDQsICAzNSwgIDAsICAgMzIsICAyNCwgIDAsICAgMTgsICA5LCAgIDAsICAgMSwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDMyLCAgODQsICA2MywgIDI4LCAgNzQsICA1NCwgIDIxLCAgNjUsICA0NywgIDEzLCAgNTQsICAzOCwgIDAsICAgNDQsICAyOCwKKyAgICAwLCAgIDMyLCAgMTYsICAwLCAgIDE4LCAgMSwgICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgICAzMCwgIDY3LCAgMTU1LAorICAgIDIwLCAgNTgsICAxMzksIDIwLCAgNDksICAxMjYsIDEyLCAgMzksICAxMTAsIDAsICAgMjcsICA5NCwgIDAsICAgMTMsICA3NywKKyAgICAwLCAgIDAsICAgNjAsICAwLCAgIDAsICAgMzcsICAwLCAgIDAsICAgMCwgICAzNSwgIDY3LCAgMTQyLCAzMCwgIDU4LCAgMTI2LAorICAgIDIzLCAgNTAsICAxMTQsIDE2LCAgNDAsICA5OSwgIDcsICAgMjksICA4NSwgIDAsICAgMTUsICA2OSwgIDAsICAgMCwgICA1MiwKKyAgICAwLCAgIDAsICAgMzAsICAwLCAgIDAsICAgMCwgICAzNSwgIDY4LCAgMTMxLCAzMCwgIDU5LCAgMTE2LCAyNywgIDUwLCAgMTA0LAorICAgIDE4LCAgNDAsICA5MCwgIDksICAgMjksICA3NiwgIDAsICAgMTcsICA2MiwgIDAsICAgMiwgICA0NiwgIDAsICAgMCwgICAyNCwKKyAgICAwLCAgIDAsICAgMCwgICAzNywgIDY5LCAgMTE5LCAzMywgIDU5LCAgMTA2LCAyNywgIDUxLCAgOTQsICAyMSwgIDQxLCAgODAsCisgICAgOSwgICAzMCwgIDY3LCAgMCwgICAxOCwgIDU0LCAgMCwgICAzLCAgIDM5LCAgMCwgICAwLCAgIDE4LCAgMCwgICAwLCAgIDAsCisgICAgNDAsICA2OSwgIDEwNywgMzYsICA1OSwgIDk0LCAgMjgsICA1MSwgIDg0LCAgMTgsICA0MSwgIDcyLCAgMTAsICAzMSwgIDYwLAorICAgIDAsICAgMTksICA0NywgIDAsICAgNCwgICAzMiwgIDAsICAgMCwgICAxMCwgIDAsICAgMCwgICAwLCAgIDQyLCAgNjksICA5NSwKKyAgICAzNiwgIDU5LCAgODQsICAyOSwgIDUxLCAgNzQsICAxOSwgIDQxLCAgNjMsICAxMCwgIDMxLCAgNTIsICAwLCAgIDIwLCAgMzksCisgICAgMCwgICA0LCAgIDI1LCAgMCwgICAwLCAgIDQsICAgMCwgICAwLCAgIDAsICAgNDMsICA2OSwgIDgzLCAgMzgsICA2MCwgIDczLAorICAgIDMyLCAgNTEsICA2MiwgIDIzLCAgNDIsICA1MywgIDExLCAgMzEsICA0MiwgIDAsICAgMjAsICAzMSwgIDAsICAgNSwgICAxNywKKyAgICAwLCAgIDAsICAgMSwgICAwLCAgIDAsICAgMCwgICA0NSwgIDY5LCAgNzAsICAzOSwgIDYwLCAgNjAsICAzMywgIDUxLCAgNTIsCisgICAgMjQsICA0MiwgIDQzLCAgMTMsICAzMiwgIDMzLCAgMCwgICAyMSwgIDIxLCAgMCwgICA1LCAgIDYsICAgMCwgICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDAsICAgNDcsICA2OSwgIDU5LCAgNDEsICA2MCwgIDUxLCAgMzQsICA1MSwgIDQzLCAgMjQsICA0MiwgIDM1LAorICAgIDEyLCAgMzMsICAyNiwgIDEsICAgMjIsICAxNCwgIDAsICAgNSwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDQ2LCAgNDgsICAxNDYsIDQyLCAgNDAsICAxMzEsIDM2LCAgMzIsICAxMTgsIDI3LCAgMjIsICAxMDMsIDE3LCAgNiwgICA4OCwKKyAgICA1LCAgIDAsICAgNzMsICAwLCAgIDAsICAgNTUsICAwLCAgIDAsICAgMzMsICAwLCAgIDAsICAgMCwgICA0OCwgIDQ4LCAgMTMzLAorICAgIDQ0LCAgNDAsICAxMTksIDM3LCAgMzIsICAxMDcsIDI4LCAgMjIsICA5MywgIDIwLCAgOCwgICA3OSwgIDcsICAgMCwgICA2NSwKKyAgICAwLCAgIDAsICAgNDksICAwLCAgIDAsICAgMjcsICAwLCAgIDAsICAgMCwgICA0OCwgIDUwLCAgMTIzLCA0NCwgIDQxLCAgMTA5LAorICAgIDM3LCAgMzMsICA5NywgIDMwLCAgMjMsICA4MywgIDIxLCAgMTEsICA3MSwgIDgsICAgMCwgICA1OCwgIDAsICAgMCwgICA0MiwKKyAgICAwLCAgIDAsICAgMjEsICAwLCAgIDAsICAgMCwgICA0OSwgIDUxLCAgMTExLCA0NSwgIDQyLCAgOTksICAzOCwgIDM0LCAgODcsCisgICAgMjksICAyNSwgIDc1LCAgMjAsICAxMywgIDYzLCAgOCwgICAwLCAgIDUxLCAgMCwgICAwLCAgIDM2LCAgMCwgICAwLCAgIDE0LAorICAgIDAsICAgMCwgICAwLCAgIDUyLCAgNTIsICAxMDAsIDQ0LCAgNDMsICA4OSwgIDM4LCAgMzUsICA3OSwgIDI5LCAgMjYsICA2OCwKKyAgICAxOSwgIDE1LCAgNTYsICAxMCwgIDEsICAgNDMsICAwLCAgIDAsICAgMjgsICAwLCAgIDAsICAgNiwgICAwLCAgIDAsICAgMCwKKyAgICA1MiwgIDUyLCAgOTAsICA0NywgIDQ0LCAgNzksICAzOSwgIDM2LCAgNzAsICAzMCwgIDI3LCAgNTksICAyMCwgIDE2LCAgNDcsCisgICAgOSwgICAyLCAgIDM2LCAgMCwgICAwLCAgIDIyLCAgMCwgICAwLCAgIDIsICAgMCwgICAwLCAgIDAsICAgNTIsICA1MywgIDc4LAorICAgIDQ2LCAgNDQsICA2OCwgIDM5LCAgMzcsICA2MCwgIDMyLCAgMjcsICA0OSwgIDIyLCAgMTcsICAzOSwgIDEwLCAgMywgICAyOCwKKyAgICAwLCAgIDAsICAgMTIsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICA1MywgIDUzLCAgNjYsICA0NywgIDQ0LCAgNTcsCisgICAgNDAsICAzNiwgIDQ4LCAgMzIsICAyNywgIDM5LCAgMjIsICAxOCwgIDMwLCAgOSwgICA0LCAgIDE4LCAgMCwgICAwLCAgIDMsCisgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgNTQsICA1MywgIDU3LCAgNDgsICA0NSwgIDQ5LCAgNDEsICAzNywgIDQxLAorICAgIDMzLCAgMjgsICAzMiwgIDIyLCAgMTksICAyMywgIDExLCAgNiwgICAxMCwgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgIDAsICAgMCwgICAwLAorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKIENDb2RlY19Nb2R1bGVNZ3I6OkNDb2RlY19Nb2R1bGVNZ3IoKQotICAgIDogbV9wQmFzaWNNb2R1bGUobmV3IENDb2RlY19CYXNpY01vZHVsZSksCi0gICAgICBtX3BGYXhNb2R1bGUobmV3IENDb2RlY19GYXhNb2R1bGUpLAotICAgICAgbV9wSnBlZ01vZHVsZShuZXcgQ0NvZGVjX0pwZWdNb2R1bGUpLAotICAgICAgbV9wSnB4TW9kdWxlKG5ldyBDQ29kZWNfSnB4TW9kdWxlKSwKLSAgICAgIG1fcEpiaWcyTW9kdWxlKG5ldyBDQ29kZWNfSmJpZzJNb2R1bGUpLAotICAgICAgbV9wSWNjTW9kdWxlKG5ldyBDQ29kZWNfSWNjTW9kdWxlKSwKLSAgICAgIG1fcEZsYXRlTW9kdWxlKG5ldyBDQ29kZWNfRmxhdGVNb2R1bGUpIHsKLX0KKyAgICA6IG1fcEJhc2ljTW9kdWxlKHBkZml1bTo6TWFrZVVuaXF1ZTxDQ29kZWNfQmFzaWNNb2R1bGU+KCkpLAorICAgICAgbV9wRmF4TW9kdWxlKHBkZml1bTo6TWFrZVVuaXF1ZTxDQ29kZWNfRmF4TW9kdWxlPigpKSwKKyAgICAgIG1fcEpwZWdNb2R1bGUocGRmaXVtOjpNYWtlVW5pcXVlPENDb2RlY19KcGVnTW9kdWxlPigpKSwKKyAgICAgIG1fcEpweE1vZHVsZShwZGZpdW06Ok1ha2VVbmlxdWU8Q0NvZGVjX0pweE1vZHVsZT4oKSksCisgICAgICBtX3BKYmlnMk1vZHVsZShwZGZpdW06Ok1ha2VVbmlxdWU8Q0NvZGVjX0piaWcyTW9kdWxlPigpKSwKKyAgICAgIG1fcEljY01vZHVsZShwZGZpdW06Ok1ha2VVbmlxdWU8Q0NvZGVjX0ljY01vZHVsZT4oKSksCisgICAgICBtX3BGbGF0ZU1vZHVsZShwZGZpdW06Ok1ha2VVbmlxdWU8Q0NvZGVjX0ZsYXRlTW9kdWxlPigpKSB7fQogCiBDQ29kZWNfTW9kdWxlTWdyOjp+Q0NvZGVjX01vZHVsZU1ncigpIHt9CiAKLUNDb2RlY19TY2FubGluZURlY29kZXI6OkNDb2RlY19TY2FubGluZURlY29kZXIoKQotICAgIDogQ0NvZGVjX1NjYW5saW5lRGVjb2RlcigwLCAwLCAwLCAwLCAwLCAwLCAwKSB7fQotCi1DQ29kZWNfU2NhbmxpbmVEZWNvZGVyOjpDQ29kZWNfU2NhbmxpbmVEZWNvZGVyKGludCBuT3JpZ1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbk9yaWdIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuT3V0cHV0V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuT3V0cHV0SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkJwYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgblBpdGNoKQotICAgIDogbV9PcmlnV2lkdGgobk9yaWdXaWR0aCksCi0gICAgICBtX09yaWdIZWlnaHQobk9yaWdIZWlnaHQpLAotICAgICAgbV9PdXRwdXRXaWR0aChuT3V0cHV0V2lkdGgpLAotICAgICAgbV9PdXRwdXRIZWlnaHQobk91dHB1dEhlaWdodCksCi0gICAgICBtX25Db21wcyhuQ29tcHMpLAotICAgICAgbV9icGMobkJwYyksCi0gICAgICBtX1BpdGNoKG5QaXRjaCksCi0gICAgICBtX05leHRMaW5lKC0xKSwKLSAgICAgIG1fcExhc3RTY2FubGluZShudWxscHRyKSB7fQotCi1DQ29kZWNfU2NhbmxpbmVEZWNvZGVyOjp+Q0NvZGVjX1NjYW5saW5lRGVjb2RlcigpIHt9Ci0KLWNvbnN0IHVpbnQ4X3QqIENDb2RlY19TY2FubGluZURlY29kZXI6OkdldFNjYW5saW5lKGludCBsaW5lKSB7Ci0gIGlmIChtX05leHRMaW5lID09IGxpbmUgKyAxKQotICAgIHJldHVybiBtX3BMYXN0U2NhbmxpbmU7Ci0KLSAgaWYgKG1fTmV4dExpbmUgPCAwIHx8IG1fTmV4dExpbmUgPiBsaW5lKSB7Ci0gICAgaWYgKCF2X1Jld2luZCgpKQotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgbV9OZXh0TGluZSA9IDA7Ci0gIH0KLSAgd2hpbGUgKG1fTmV4dExpbmUgPCBsaW5lKSB7Ci0gICAgUmVhZE5leHRMaW5lKCk7Ci0gICAgbV9OZXh0TGluZSsrOwotICB9Ci0gIG1fcExhc3RTY2FubGluZSA9IFJlYWROZXh0TGluZSgpOwotICBtX05leHRMaW5lKys7Ci0gIHJldHVybiBtX3BMYXN0U2NhbmxpbmU7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK3ZvaWQgQ0NvZGVjX01vZHVsZU1ncjo6U2V0Qm1wTW9kdWxlKHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNfQm1wTW9kdWxlPiBtb2R1bGUpIHsKKyAgbV9wQm1wTW9kdWxlID0gc3RkOjptb3ZlKG1vZHVsZSk7CiB9CiAKLWJvb2wgQ0NvZGVjX1NjYW5saW5lRGVjb2Rlcjo6U2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKSB7Ci0gIGlmIChtX05leHRMaW5lID09IGxpbmUgfHwgbV9OZXh0TGluZSA9PSBsaW5lICsgMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKG1fTmV4dExpbmUgPCAwIHx8IG1fTmV4dExpbmUgPiBsaW5lKSB7Ci0gICAgdl9SZXdpbmQoKTsKLSAgICBtX05leHRMaW5lID0gMDsKLSAgfQotICBtX3BMYXN0U2NhbmxpbmUgPSBudWxscHRyOwotICB3aGlsZSAobV9OZXh0TGluZSA8IGxpbmUpIHsKLSAgICBtX3BMYXN0U2NhbmxpbmUgPSBSZWFkTmV4dExpbmUoKTsKLSAgICBtX05leHRMaW5lKys7Ci0gICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Cit2b2lkIENDb2RlY19Nb2R1bGVNZ3I6OlNldEdpZk1vZHVsZShzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjX0dpZk1vZHVsZT4gbW9kdWxlKSB7CisgIG1fcEdpZk1vZHVsZSA9IHN0ZDo6bW92ZShtb2R1bGUpOwogfQogCi11aW50OF90KiBDQ29kZWNfU2NhbmxpbmVEZWNvZGVyOjpSZWFkTmV4dExpbmUoKSB7Ci0gIHJldHVybiB2X0dldE5leHRMaW5lKCk7Cit2b2lkIENDb2RlY19Nb2R1bGVNZ3I6OlNldFBuZ01vZHVsZShzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjX1BuZ01vZHVsZT4gbW9kdWxlKSB7CisgIG1fcFBuZ01vZHVsZSA9IHN0ZDo6bW92ZShtb2R1bGUpOwogfQogCit2b2lkIENDb2RlY19Nb2R1bGVNZ3I6OlNldFRpZmZNb2R1bGUoCisgICAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY19UaWZmTW9kdWxlPiBtb2R1bGUpIHsKKyAgbV9wVGlmZk1vZHVsZSA9IHN0ZDo6bW92ZShtb2R1bGUpOworfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCiBib29sIENDb2RlY19CYXNpY01vZHVsZTo6UnVuTGVuZ3RoRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY19zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogZGVzdF9idWYsCkBAIC0yNTMsOSArMTU0NCw4IEBACiAgICAgICBtX25HaWZUb3AoMCksCiAgICAgICBtX3BHaWZMb2NhbFBhbGV0dGUobnVsbHB0ciksCiAgICAgICBtX25HaWZMb2NhbFBhbE51bSgwKSwKLSAgICAgIG1fbkJtcENvbXByZXNzVHlwZSgwKSB7Ci0gIEZYU1lTX21lbXNldChtX3N0clRpbWUsIDAsIHNpemVvZihtX3N0clRpbWUpKTsKLX0KKyAgICAgIG1fbkJtcENvbXByZXNzVHlwZSgwKSB7fQorCiBDRlhfRElCQXR0cmlidXRlOjp+Q0ZYX0RJQkF0dHJpYnV0ZSgpIHsKICAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbV9FeGlmKQogICAgIEZYX0ZyZWUocGFpci5zZWNvbmQpOwpAQCAtMzYxLDcgKzE2NTEsNyBAQAogICByZXR1cm4gQ2hlY2tEZXN0U2l6ZSgpOwogfQogYm9vbCBDQ29kZWNfUkxTY2FubGluZURlY29kZXI6OnZfUmV3aW5kKCkgewotICBGWFNZU19tZW1zZXQobV9wU2NhbmxpbmUsIDAsIG1fUGl0Y2gpOworICBtZW1zZXQobV9wU2NhbmxpbmUsIDAsIG1fUGl0Y2gpOwogICBtX1NyY09mZnNldCA9IDA7CiAgIG1fYkVPRCA9IGZhbHNlOwogICBtX09wZXJhdG9yID0gMDsKQEAgLTM3NSw3ICsxNjY1LDcgQEAKICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KICAgfQotICBGWFNZU19tZW1zZXQobV9wU2NhbmxpbmUsIDAsIG1fUGl0Y2gpOworICBtZW1zZXQobV9wU2NhbmxpbmUsIDAsIG1fUGl0Y2gpOwogICB1aW50MzJfdCBjb2xfcG9zID0gMDsKICAgYm9vbCBlb2wgPSBmYWxzZTsKICAgd2hpbGUgKG1fU3JjT2Zmc2V0IDwgbV9TcmNTaXplICYmICFlb2wpIHsKQEAgLTM4OSw3ICsxNjc5LDcgQEAKICAgICAgICAgY29weV9sZW4gPSBtX1NyY1NpemUgLSBtX1NyY09mZnNldDsKICAgICAgICAgbV9iRU9EID0gdHJ1ZTsKICAgICAgIH0KLSAgICAgIEZYU1lTX21lbWNweShtX3BTY2FubGluZSArIGNvbF9wb3MsIG1fcFNyY0J1ZiArIG1fU3JjT2Zmc2V0LCBjb3B5X2xlbik7CisgICAgICBtZW1jcHkobV9wU2NhbmxpbmUgKyBjb2xfcG9zLCBtX3BTcmNCdWYgKyBtX1NyY09mZnNldCwgY29weV9sZW4pOwogICAgICAgY29sX3BvcyArPSBjb3B5X2xlbjsKICAgICAgIFVwZGF0ZU9wZXJhdG9yKCh1aW50OF90KWNvcHlfbGVuKTsKICAgICB9IGVsc2UgaWYgKG1fT3BlcmF0b3IgPiAxMjgpIHsKQEAgLTQwMiw3ICsxNjkyLDcgQEAKICAgICAgICAgZHVwbGljYXRlX2xlbiA9IG1fZHdMaW5lQnl0ZXMgLSBjb2xfcG9zOwogICAgICAgICBlb2wgPSB0cnVlOwogICAgICAgfQotICAgICAgRlhTWVNfbWVtc2V0KG1fcFNjYW5saW5lICsgY29sX3BvcywgZmlsbCwgZHVwbGljYXRlX2xlbik7CisgICAgICBtZW1zZXQobV9wU2NhbmxpbmUgKyBjb2xfcG9zLCBmaWxsLCBkdXBsaWNhdGVfbGVuKTsKICAgICAgIGNvbF9wb3MgKz0gZHVwbGljYXRlX2xlbjsKICAgICAgIFVwZGF0ZU9wZXJhdG9yKCh1aW50OF90KWR1cGxpY2F0ZV9sZW4pOwogICAgIH0gZWxzZSB7CkBAIC00NjIsMyArMTc1Miw5MCBAQAogCiAgIHJldHVybiBzdGQ6Om1vdmUocERlY29kZXIpOwogfQorCitzdGQ6OnR1cGxlPHVpbnQ4X3QsIHVpbnQ4X3QsIHVpbnQ4X3Q+IEFkb2JlQ01ZS190b19zUkdCMSh1aW50OF90IGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGspIHsKKyAgaW50IGZpeF9jID0gYyA8PCA4OworICBpbnQgZml4X20gPSBtIDw8IDg7CisgIGludCBmaXhfeSA9IHkgPDwgODsKKyAgaW50IGZpeF9rID0gayA8PCA4OworICBpbnQgY19pbmRleCA9IChmaXhfYyArIDQwOTYpID4+IDEzOworICBpbnQgbV9pbmRleCA9IChmaXhfbSArIDQwOTYpID4+IDEzOworICBpbnQgeV9pbmRleCA9IChmaXhfeSArIDQwOTYpID4+IDEzOworICBpbnQga19pbmRleCA9IChmaXhfayArIDQwOTYpID4+IDEzOworICBpbnQgcG9zID0gKGNfaW5kZXggKiA5ICogOSAqIDkgKyBtX2luZGV4ICogOSAqIDkgKyB5X2luZGV4ICogOSArIGtfaW5kZXgpICogMzsKKyAgaW50IGZpeF9yID0gZ19DTVlLW3Bvc10gPDwgODsKKyAgaW50IGZpeF9nID0gZ19DTVlLW3BvcyArIDFdIDw8IDg7CisgIGludCBmaXhfYiA9IGdfQ01ZS1twb3MgKyAyXSA8PCA4OworICBpbnQgYzFfaW5kZXggPSBmaXhfYyA+PiAxMzsKKyAgaWYgKGMxX2luZGV4ID09IGNfaW5kZXgpCisgICAgYzFfaW5kZXggPSBjMV9pbmRleCA9PSA4ID8gYzFfaW5kZXggLSAxIDogYzFfaW5kZXggKyAxOworICBpbnQgbTFfaW5kZXggPSBmaXhfbSA+PiAxMzsKKyAgaWYgKG0xX2luZGV4ID09IG1faW5kZXgpCisgICAgbTFfaW5kZXggPSBtMV9pbmRleCA9PSA4ID8gbTFfaW5kZXggLSAxIDogbTFfaW5kZXggKyAxOworICBpbnQgeTFfaW5kZXggPSBmaXhfeSA+PiAxMzsKKyAgaWYgKHkxX2luZGV4ID09IHlfaW5kZXgpCisgICAgeTFfaW5kZXggPSB5MV9pbmRleCA9PSA4ID8geTFfaW5kZXggLSAxIDogeTFfaW5kZXggKyAxOworICBpbnQgazFfaW5kZXggPSBmaXhfayA+PiAxMzsKKyAgaWYgKGsxX2luZGV4ID09IGtfaW5kZXgpCisgICAgazFfaW5kZXggPSBrMV9pbmRleCA9PSA4ID8gazFfaW5kZXggLSAxIDogazFfaW5kZXggKyAxOworICBpbnQgYzFfcG9zID0gcG9zICsgKGMxX2luZGV4IC0gY19pbmRleCkgKiA5ICogOSAqIDkgKiAzOworICBpbnQgbTFfcG9zID0gcG9zICsgKG0xX2luZGV4IC0gbV9pbmRleCkgKiA5ICogOSAqIDM7CisgIGludCB5MV9wb3MgPSBwb3MgKyAoeTFfaW5kZXggLSB5X2luZGV4KSAqIDkgKiAzOworICBpbnQgazFfcG9zID0gcG9zICsgKGsxX2luZGV4IC0ga19pbmRleCkgKiAzOworICBpbnQgY19yYXRlID0gKGZpeF9jIC0gKGNfaW5kZXggPDwgMTMpKSAqIChjX2luZGV4IC0gYzFfaW5kZXgpOworICBmaXhfciArPSAoZ19DTVlLW3Bvc10gLSBnX0NNWUtbYzFfcG9zXSkgKiBjX3JhdGUgLyAzMjsKKyAgZml4X2cgKz0gKGdfQ01ZS1twb3MgKyAxXSAtIGdfQ01ZS1tjMV9wb3MgKyAxXSkgKiBjX3JhdGUgLyAzMjsKKyAgZml4X2IgKz0gKGdfQ01ZS1twb3MgKyAyXSAtIGdfQ01ZS1tjMV9wb3MgKyAyXSkgKiBjX3JhdGUgLyAzMjsKKyAgaW50IG1fcmF0ZSA9IChmaXhfbSAtIChtX2luZGV4IDw8IDEzKSkgKiAobV9pbmRleCAtIG0xX2luZGV4KTsKKyAgZml4X3IgKz0gKGdfQ01ZS1twb3NdIC0gZ19DTVlLW20xX3Bvc10pICogbV9yYXRlIC8gMzI7CisgIGZpeF9nICs9IChnX0NNWUtbcG9zICsgMV0gLSBnX0NNWUtbbTFfcG9zICsgMV0pICogbV9yYXRlIC8gMzI7CisgIGZpeF9iICs9IChnX0NNWUtbcG9zICsgMl0gLSBnX0NNWUtbbTFfcG9zICsgMl0pICogbV9yYXRlIC8gMzI7CisgIGludCB5X3JhdGUgPSAoZml4X3kgLSAoeV9pbmRleCA8PCAxMykpICogKHlfaW5kZXggLSB5MV9pbmRleCk7CisgIGZpeF9yICs9IChnX0NNWUtbcG9zXSAtIGdfQ01ZS1t5MV9wb3NdKSAqIHlfcmF0ZSAvIDMyOworICBmaXhfZyArPSAoZ19DTVlLW3BvcyArIDFdIC0gZ19DTVlLW3kxX3BvcyArIDFdKSAqIHlfcmF0ZSAvIDMyOworICBmaXhfYiArPSAoZ19DTVlLW3BvcyArIDJdIC0gZ19DTVlLW3kxX3BvcyArIDJdKSAqIHlfcmF0ZSAvIDMyOworICBpbnQga19yYXRlID0gKGZpeF9rIC0gKGtfaW5kZXggPDwgMTMpKSAqIChrX2luZGV4IC0gazFfaW5kZXgpOworICBmaXhfciArPSAoZ19DTVlLW3Bvc10gLSBnX0NNWUtbazFfcG9zXSkgKiBrX3JhdGUgLyAzMjsKKyAgZml4X2cgKz0gKGdfQ01ZS1twb3MgKyAxXSAtIGdfQ01ZS1trMV9wb3MgKyAxXSkgKiBrX3JhdGUgLyAzMjsKKyAgZml4X2IgKz0gKGdfQ01ZS1twb3MgKyAyXSAtIGdfQ01ZS1trMV9wb3MgKyAyXSkgKiBrX3JhdGUgLyAzMjsKKyAgZml4X3IgPSBzdGQ6Om1heChmaXhfciwgMCk7CisgIGZpeF9nID0gc3RkOjptYXgoZml4X2csIDApOworICBmaXhfYiA9IHN0ZDo6bWF4KGZpeF9iLCAwKTsKKyAgcmV0dXJuIHN0ZDo6bWFrZV90dXBsZShmaXhfciA+PiA4LCBmaXhfZyA+PiA4LCBmaXhfYiA+PiA4KTsKK30KKworc3RkOjp0dXBsZTxmbG9hdCwgZmxvYXQsIGZsb2F0PiBBZG9iZUNNWUtfdG9fc1JHQihmbG9hdCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBrKSB7CisgIC8vIENvbnZlcnQgdG8gdWludDhfdCB3aXRoIHJvdW5kLXRvLW5lYXJlc3QuIEF2b2lkIHVzaW5nIEZYU1lTX3JvdW5kIGJlY2F1c2UKKyAgLy8gaXQgaXMgaW5jcmVkaWJseSBleHBlbnNpdmUgd2l0aCBWQysrICh0ZXN0ZWQgb24gVkMrKyAyMDE1KSBiZWNhdXNlIHJvdW5kKCkKKyAgLy8gaXMgdmVyeSBleHBlbnNpdmUuCisgIC8vIFRoZSAnbWFnaWMnIHZhbHVlIG9mIDAuNDk5OTk5OTdmLCB0aGUgZmxvYXQgdGhhdCBwcmVjZWRlcyAwLjVmLCB3YXMgY2hvc2VuCisgIC8vIGJlY2F1c2UgaXQgZ2l2ZXMgaWRlbnRpY2FsIHJlc3VsdHMgdG8gRlhTWVNfcm91bmQoKS4gVXNpbmcgdGhlIGNvbnN0YW50CisgIC8vIDAuNWYgZ2l2ZXMgZGlmZmVyZW50IHJlc3VsdHMgKDEgaW5zdGVhZCBvZiAwKSBmb3Igb25lIHZhbHVlLCAwLjAwMTk2MDc4NDIuCisgIC8vIFRoYXQgdmFsdWUgaXMgY2xvc2UgdG8gdGhlIGN1c3AgYnV0IHplcm8gaXMgdGhlIGNvcnJlY3QgYW5zd2VyLCBhbmQKKyAgLy8gZ2V0dGluZyB0aGUgc2FtZSBhbnN3ZXIgYXMgYmVmb3JlIGlzIGRlc2lyYWJsZS4KKyAgLy8gQWxsIGZsb2F0cyBmcm9tIDAuMCB0byAxLjAgd2VyZSB0ZXN0ZWQgYW5kIG5vdyBnaXZlIHRoZSBzYW1lIHJlc3VsdHMuCisgIGNvbnN0IGZsb2F0IHJvdW5kaW5nX29mZnNldCA9IDAuNDk5OTk5OTdmOworICB1aW50OF90IGMxID0gaW50KGMgKiAyNTUuZiArIHJvdW5kaW5nX29mZnNldCk7CisgIHVpbnQ4X3QgbTEgPSBpbnQobSAqIDI1NS5mICsgcm91bmRpbmdfb2Zmc2V0KTsKKyAgdWludDhfdCB5MSA9IGludCh5ICogMjU1LmYgKyByb3VuZGluZ19vZmZzZXQpOworICB1aW50OF90IGsxID0gaW50KGsgKiAyNTUuZiArIHJvdW5kaW5nX29mZnNldCk7CisKKyAgQVNTRVJUKGMxID09IEZYU1lTX3JvdW5kKGMgKiAyNTUpKTsKKyAgQVNTRVJUKG0xID09IEZYU1lTX3JvdW5kKG0gKiAyNTUpKTsKKyAgQVNTRVJUKHkxID09IEZYU1lTX3JvdW5kKHkgKiAyNTUpKTsKKyAgQVNTRVJUKGsxID09IEZYU1lTX3JvdW5kKGsgKiAyNTUpKTsKKworICB1aW50OF90IHI7CisgIHVpbnQ4X3QgZzsKKyAgdWludDhfdCBiOworICBzdGQ6OnRpZShyLCBnLCBiKSA9IEFkb2JlQ01ZS190b19zUkdCMShjMSwgbTEsIHkxLCBrMSk7CisgIC8vIE11bHRpcGx5IGJ5IGEgY29uc3RhbnQgcmF0aGVyIHRoYW4gZGl2aWRpbmcgYmVjYXVzZSBkaXZpc2lvbiBpcyBtdWNoCisgIC8vIG1vcmUgZXhwZW5zaXZlLgorICByZXR1cm4gc3RkOjptYWtlX3R1cGxlKHIgKiAoMS4wZiAvIDI1NSksIGcgKiAoMS4wZiAvIDI1NSksIGIgKiAoMS4wZiAvIDI1NSkpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2E4NV91bml0dGVzdC5jcHAgYi9jb3JlL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfYTg1X3VuaXR0ZXN0LmNwcAppbmRleCA3OGY5YmQ4Li41ZTQwNTQ4IDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfYTg1X3VuaXR0ZXN0LmNwcAorKysgYi9jb3JlL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfYTg1X3VuaXR0ZXN0LmNwcApAQCAtOCw3ICs4LDYgQEAKIAogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfYmFzaWNtb2R1bGUuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvZnhfY29kZWMuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2Z4X3N0cmluZ190ZXN0aGVscGVycy5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogCiBURVNUKGZ4Y29kZWMsIEE4NVRlc3RCYWRJbnB1dHMpIHsKZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19mYXguY3BwIGIvY29yZS9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZheC5jcHAKaW5kZXggOGE5YzNlZi4uYzgwMGZkYSAxMDA2NDQKLS0tIGEvY29yZS9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZheC5jcHAKKysrIGIvY29yZS9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZheC5jcHAKQEAgLTgsMTAgKzgsMTMgQEAKICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19mYXhtb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX3NjYW5saW5lZGVjb2Rlci5oIgogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jb2RlY19pbnQuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvZnhfY29kZWMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9iaW5hcnlidWYuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCiAKIG5hbWVzcGFjZSB7CiAKQEAgLTEwNCw3ICsxMDcsNyBAQAogCiB2b2lkIEZheEZpbGxCaXRzKHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQgY29sdW1ucywgaW50IHN0YXJ0cG9zLCBpbnQgZW5kcG9zKSB7CiAgIHN0YXJ0cG9zID0gc3RkOjptYXgoc3RhcnRwb3MsIDApOwotICBlbmRwb3MgPSBzdGQ6Om1pbihzdGQ6Om1heChlbmRwb3MsIDApLCBjb2x1bW5zKTsKKyAgZW5kcG9zID0gcGRmaXVtOjpjbGFtcChlbmRwb3MsIDAsIGNvbHVtbnMpOwogICBpZiAoc3RhcnRwb3MgPj0gZW5kcG9zKQogICAgIHJldHVybjsKIApAQCAtMTIyLDcgKzEyNSw3IEBACiAgICAgZGVzdF9idWZbbGFzdF9ieXRlXSAtPSAxIDw8ICg3IC0gaSk7CiAKICAgaWYgKGxhc3RfYnl0ZSA+IGZpcnN0X2J5dGUgKyAxKQotICAgIEZYU1lTX21lbXNldChkZXN0X2J1ZiArIGZpcnN0X2J5dGUgKyAxLCAwLCBsYXN0X2J5dGUgLSBmaXJzdF9ieXRlIC0gMSk7CisgICAgbWVtc2V0KGRlc3RfYnVmICsgZmlyc3RfYnl0ZSArIDEsIDAsIGxhc3RfYnl0ZSAtIGZpcnN0X2J5dGUgLSAxKTsKIH0KIAogaW5saW5lIGJvb2wgTmV4dEJpdChjb25zdCB1aW50OF90KiBzcmNfYnVmLCBpbnQqIGJpdHBvcykgewpAQCAtMjY2LDE0ICsyNjksMTMgQEAKICAgICArKygqYml0cG9zKTsKICAgICBpbnQgbmV4dF9vZmYgPSBpbnNfb2ZmICsgaW5zICogMzsKICAgICBmb3IgKDsgaW5zX29mZiA8IG5leHRfb2ZmOyBpbnNfb2ZmICs9IDMpIHsKLSAgICAgIGlmIChpbnNfYXJyYXlbaW5zX29mZl0gPT0gY29kZSkgeworICAgICAgaWYgKGluc19hcnJheVtpbnNfb2ZmXSA9PSBjb2RlKQogICAgICAgICByZXR1cm4gaW5zX2FycmF5W2luc19vZmYgKyAxXSArIGluc19hcnJheVtpbnNfb2ZmICsgMl0gKiAyNTY7Ci0gICAgICB9CiAgICAgfQogICB9CiB9CiAKLWJvb2wgRmF4RzRHZXRSb3coY29uc3QgdWludDhfdCogc3JjX2J1ZiwKK3ZvaWQgRmF4RzRHZXRSb3coY29uc3QgdWludDhfdCogc3JjX2J1ZiwKICAgICAgICAgICAgICAgICAgaW50IGJpdHNpemUsCiAgICAgICAgICAgICAgICAgIGludCogYml0cG9zLAogICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwKQEAgLTI4Myw3ICsyODUsNyBAQAogICBib29sIGEwY29sb3IgPSB0cnVlOwogICB3aGlsZSAoMSkgewogICAgIGlmICgqYml0cG9zID49IGJpdHNpemUpCi0gICAgICByZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm47CiAKICAgICBpbnQgYTE7CiAgICAgaW50IGEyOwpAQCAtMjk0LDExICsyOTYsMTEgQEAKICAgICBpbnQgdl9kZWx0YSA9IDA7CiAgICAgaWYgKCFOZXh0Qml0KHNyY19idWYsIGJpdHBvcykpIHsKICAgICAgIGlmICgqYml0cG9zID49IGJpdHNpemUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuOwogCiAgICAgICBib29sIGJpdDEgPSBOZXh0Qml0KHNyY19idWYsIGJpdHBvcyk7CiAgICAgICBpZiAoKmJpdHBvcyA+PSBiaXRzaXplKQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybjsKIAogICAgICAgYm9vbCBiaXQyID0gTmV4dEJpdChzcmNfYnVmLCBiaXRwb3MpOwogICAgICAgaWYgKGJpdDEpIHsKQEAgLTMwOSwxMiArMzExLDEzIEBACiAgICAgICAgICAgaW50IHJ1biA9IEZheEdldFJ1bihhMGNvbG9yID8gRmF4V2hpdGVSdW5JbnMgOiBGYXhCbGFja1J1bklucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19idWYsIGJpdHBvcywgYml0c2l6ZSk7CiAgICAgICAgICAgcnVuX2xlbjEgKz0gcnVuOwotICAgICAgICAgIGlmIChydW4gPCA2NCkgeworICAgICAgICAgIGlmIChydW4gPCA2NCkKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoYTAgPCAwKQogICAgICAgICAgICsrcnVuX2xlbjE7CisgICAgICAgIGlmIChydW5fbGVuMSA8IDApCisgICAgICAgICAgcmV0dXJuOwogCiAgICAgICAgIGExID0gYTAgKyBydW5fbGVuMTsKICAgICAgICAgaWYgKCFhMGNvbG9yKQpAQCAtMzI1LDEwICszMjgsMTEgQEAKICAgICAgICAgICBpbnQgcnVuID0gRmF4R2V0UnVuKGEwY29sb3IgPyBGYXhCbGFja1J1bklucyA6IEZheFdoaXRlUnVuSW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2J1ZiwgYml0cG9zLCBiaXRzaXplKTsKICAgICAgICAgICBydW5fbGVuMiArPSBydW47Ci0gICAgICAgICAgaWYgKHJ1biA8IDY0KSB7CisgICAgICAgICAgaWYgKHJ1biA8IDY0KQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIGlmIChydW5fbGVuMiA8IDApCisgICAgICAgICAgcmV0dXJuOwogICAgICAgICBhMiA9IGExICsgcnVuX2xlbjI7CiAgICAgICAgIGlmIChhMGNvbG9yKQogICAgICAgICAgIEZheEZpbGxCaXRzKGRlc3RfYnVmLCBjb2x1bW5zLCBhMSwgYTIpOwpAQCAtMzM3LDQ3ICszNDEsNDcgQEAKICAgICAgICAgaWYgKGEwIDwgY29sdW1ucykKICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKCpiaXRwb3MgPj0gYml0c2l6ZSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgcmV0dXJuOwogCiAgICAgICAgIGlmIChOZXh0Qml0KHNyY19idWYsIGJpdHBvcykpIHsKICAgICAgICAgICBpZiAoIWEwY29sb3IpCiAgICAgICAgICAgICBGYXhGaWxsQml0cyhkZXN0X2J1ZiwgY29sdW1ucywgYTAsIGIyKTsKIAogICAgICAgICAgIGlmIChiMiA+PSBjb2x1bW5zKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICByZXR1cm47CiAKICAgICAgICAgICBhMCA9IGIyOwogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCpiaXRwb3MgPj0gYml0c2l6ZSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgcmV0dXJuOwogCiAgICAgICAgIGJvb2wgbmV4dF9iaXQxID0gTmV4dEJpdChzcmNfYnVmLCBiaXRwb3MpOwogICAgICAgICBpZiAoKmJpdHBvcyA+PSBiaXRzaXplKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICByZXR1cm47CiAKICAgICAgICAgYm9vbCBuZXh0X2JpdDIgPSBOZXh0Qml0KHNyY19idWYsIGJpdHBvcyk7CiAgICAgICAgIGlmIChuZXh0X2JpdDEpIHsKICAgICAgICAgICB2X2RlbHRhID0gbmV4dF9iaXQyID8gMiA6IC0yOwogICAgICAgICB9IGVsc2UgaWYgKG5leHRfYml0MikgewogICAgICAgICAgIGlmICgqYml0cG9zID49IGJpdHNpemUpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm47CiAKICAgICAgICAgICB2X2RlbHRhID0gTmV4dEJpdChzcmNfYnVmLCBiaXRwb3MpID8gMyA6IC0zOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIGlmICgqYml0cG9zID49IGJpdHNpemUpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm47CiAKICAgICAgICAgICBpZiAoTmV4dEJpdChzcmNfYnVmLCBiaXRwb3MpKSB7CiAgICAgICAgICAgICAqYml0cG9zICs9IDM7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICB9CiAgICAgICAgICAgKmJpdHBvcyArPSA1OwotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTM4NiwzMCArMzkwLDI5IEBACiAgICAgICBGYXhGaWxsQml0cyhkZXN0X2J1ZiwgY29sdW1ucywgYTAsIGExKTsKIAogICAgIGlmIChhMSA+PSBjb2x1bW5zKQotICAgICAgcmV0dXJuIHRydWU7CisgICAgICByZXR1cm47CiAKICAgICAvLyBUaGUgcG9zaXRpb24gb2YgcGljdHVyZSBlbGVtZW50IG11c3QgYmUgbW9ub3RvbmljIGluY3JlYXNpbmcuCiAgICAgaWYgKGEwID49IGExKQotICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuOwogCiAgICAgYTAgPSBhMTsKICAgICBhMGNvbG9yID0gIWEwY29sb3I7CiAgIH0KIH0KIAotYm9vbCBGYXhTa2lwRU9MKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCBiaXRzaXplLCBpbnQqIGJpdHBvcykgewordm9pZCBGYXhTa2lwRU9MKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsIGludCBiaXRzaXplLCBpbnQqIGJpdHBvcykgewogICBpbnQgc3RhcnRiaXQgPSAqYml0cG9zOwogICB3aGlsZSAoKmJpdHBvcyA8IGJpdHNpemUpIHsKICAgICBpZiAoIU5leHRCaXQoc3JjX2J1ZiwgYml0cG9zKSkKICAgICAgIGNvbnRpbnVlOwogICAgIGlmICgqYml0cG9zIC0gc3RhcnRiaXQgPD0gMTEpCiAgICAgICAqYml0cG9zID0gc3RhcnRiaXQ7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuOwogICB9Ci0gIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBGYXhHZXQxRExpbmUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKK3ZvaWQgRmF4R2V0MURMaW5lKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCiAgICAgICAgICAgICAgICAgICBpbnQgYml0c2l6ZSwKICAgICAgICAgICAgICAgICAgIGludCogYml0cG9zLAogICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGRlc3RfYnVmLApAQCAtNDE4LDcgKzQyMSw3IEBACiAgIGludCBzdGFydHBvcyA9IDA7CiAgIHdoaWxlICgxKSB7CiAgICAgaWYgKCpiaXRwb3MgPj0gYml0c2l6ZSkKLSAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybjsKIAogICAgIGludCBydW5fbGVuID0gMDsKICAgICB3aGlsZSAoMSkgewpAQCAtNDI3LDE0ICs0MzAsMTMgQEAKICAgICAgIGlmIChydW4gPCAwKSB7CiAgICAgICAgIHdoaWxlICgqYml0cG9zIDwgYml0c2l6ZSkgewogICAgICAgICAgIGlmIChOZXh0Qml0KHNyY19idWYsIGJpdHBvcykpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybjsKICAgICAgIH0KICAgICAgIHJ1bl9sZW4gKz0gcnVuOwotICAgICAgaWYgKHJ1biA8IDY0KSB7CisgICAgICBpZiAocnVuIDwgNjQpCiAgICAgICAgIGJyZWFrOwotICAgICAgfQogICAgIH0KICAgICBpZiAoIWNvbG9yKQogICAgICAgRmF4RmlsbEJpdHMoZGVzdF9idWYtPmRhdGEoKSwgY29sdW1ucywgc3RhcnRwb3MsIHN0YXJ0cG9zICsgcnVuX2xlbik7CkBAIC00NDUsNyArNDQ3LDYgQEAKIAogICAgIGNvbG9yID0gIWNvbG9yOwogICB9Ci0gIHJldHVybiB0cnVlOwogfQogCiB9ICAvLyBuYW1lc3BhY2UKQEAgLTUwMyw3ICs1MDQsNyBAQAogQ0NvZGVjX0ZheERlY29kZXI6On5DQ29kZWNfRmF4RGVjb2RlcigpIHt9CiAKIGJvb2wgQ0NvZGVjX0ZheERlY29kZXI6OnZfUmV3aW5kKCkgewotICBGWFNZU19tZW1zZXQobV9SZWZCdWYuZGF0YSgpLCAweGZmLCBtX1JlZkJ1Zi5zaXplKCkpOworICBtZW1zZXQobV9SZWZCdWYuZGF0YSgpLCAweGZmLCBtX1JlZkJ1Zi5zaXplKCkpOwogICBtX2JpdHBvcyA9IDA7CiAgIHJldHVybiB0cnVlOwogfQpAQCAtNTE0LDcgKzUxNSw3IEBACiAgIGlmIChtX2JpdHBvcyA+PSBiaXRzaXplKQogICAgIHJldHVybiBudWxscHRyOwogCi0gIEZYU1lTX21lbXNldChtX1NjYW5saW5lQnVmLmRhdGEoKSwgMHhmZiwgbV9TY2FubGluZUJ1Zi5zaXplKCkpOworICBtZW1zZXQobV9TY2FubGluZUJ1Zi5kYXRhKCksIDB4ZmYsIG1fU2NhbmxpbmVCdWYuc2l6ZSgpKTsKICAgaWYgKG1fRW5jb2RpbmcgPCAwKSB7CiAgICAgRmF4RzRHZXRSb3cobV9wU3JjQnVmLCBiaXRzaXplLCAmbV9iaXRwb3MsIG1fU2NhbmxpbmVCdWYuZGF0YSgpLCBtX1JlZkJ1ZiwKICAgICAgICAgICAgICAgICBtX09yaWdXaWR0aCk7CkBAIC01MzgsMTkgKzUzOSwxNyBAQAogICAgIGludCBiaXRwb3MxID0gKG1fYml0cG9zICsgNykgLyA4ICogODsKICAgICB3aGlsZSAobV9iQnl0ZUFsaWduICYmIGJpdHBvczAgPCBiaXRwb3MxKSB7CiAgICAgICBpbnQgYml0ID0gbV9wU3JjQnVmW2JpdHBvczAgLyA4XSAmICgxIDw8ICg3IC0gYml0cG9zMCAlIDgpKTsKLSAgICAgIGlmIChiaXQgIT0gMCkgeworICAgICAgaWYgKGJpdCAhPSAwKQogICAgICAgICBtX2JCeXRlQWxpZ24gPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7CisgICAgICBlbHNlCiAgICAgICAgICsrYml0cG9zMDsKLSAgICAgIH0KICAgICB9CiAgICAgaWYgKG1fYkJ5dGVBbGlnbikKICAgICAgIG1fYml0cG9zID0gYml0cG9zMTsKICAgfQogICBpZiAobV9iQmxhY2spIHsKLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbV9QaXRjaDsgKytpKSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fUGl0Y2g7ICsraSkKICAgICAgIG1fU2NhbmxpbmVCdWZbaV0gPSB+bV9TY2FubGluZUJ1ZltpXTsKLSAgICB9CiAgIH0KICAgcmV0dXJuIG1fU2NhbmxpbmVCdWYuZGF0YSgpOwogfQpAQCAtNTczLDkgKzU3Miw5IEBACiAgIGludCBiaXRwb3MgPSAqcGJpdHBvczsKICAgZm9yIChpbnQgaVJvdyA9IDA7IGlSb3cgPCBoZWlnaHQ7IGlSb3crKykgewogICAgIHVpbnQ4X3QqIGxpbmVfYnVmID0gZGVzdF9idWYgKyBpUm93ICogcGl0Y2g7Ci0gICAgRlhTWVNfbWVtc2V0KGxpbmVfYnVmLCAweGZmLCBwaXRjaCk7CisgICAgbWVtc2V0KGxpbmVfYnVmLCAweGZmLCBwaXRjaCk7CiAgICAgRmF4RzRHZXRSb3coc3JjX2J1Ziwgc3JjX3NpemUgPDwgMywgJmJpdHBvcywgbGluZV9idWYsIHJlZl9idWYsIHdpZHRoKTsKLSAgICBGWFNZU19tZW1jcHkocmVmX2J1Zi5kYXRhKCksIGxpbmVfYnVmLCBwaXRjaCk7CisgICAgbWVtY3B5KHJlZl9idWYuZGF0YSgpLCBsaW5lX2J1ZiwgcGl0Y2gpOwogICB9CiAgICpwYml0cG9zID0gYml0cG9zOwogfQpAQCAtNjA4LDcgKzYwNyw3IEBACiAgICAgICBFbmNvZGVkQnl0ZUFsaWduLCBCbGFja0lzMSk7CiB9CiAKLSNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF9ERVNLVE9QXworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCiBuYW1lc3BhY2UgewogY29uc3QgdWludDhfdCBCbGFja1J1blRlcm1pbmF0b3JbMTI4XSA9IHsKICAgICAweDM3LCAxMCwgMHgwMiwgMywgIDB4MDMsIDIsICAweDAyLCAyLCAgMHgwMywgMywgIDB4MDMsIDQsICAweDAyLCA0LApAQCAtNjU0LDkgKzY1Myw4IEBACiAKIHZvaWQgQWRkQml0U3RyZWFtKHVpbnQ4X3QqIGRlc3RfYnVmLCBpbnQqIGRlc3RfYml0cG9zLCBpbnQgZGF0YSwgaW50IGJpdGxlbikgewogICBmb3IgKGludCBpID0gYml0bGVuIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICBpZiAoZGF0YSAmICgxIDw8IGkpKSB7CisgICAgaWYgKGRhdGEgJiAoMSA8PCBpKSkKICAgICAgIGRlc3RfYnVmWypkZXN0X2JpdHBvcyAvIDhdIHw9IDEgPDwgKDcgLSAqZGVzdF9iaXRwb3MgJSA4KTsKLSAgICB9CiAgICAgKCpkZXN0X2JpdHBvcykrKzsKICAgfQogfQpAQCAtNzI2LDE2ICs3MjQsMTQgQEAKICAgICAgICgqZGVzdF9iaXRwb3MpKys7CiAgICAgICBkZXN0X2J1ZlsqZGVzdF9iaXRwb3MgLyA4XSB8PSAxIDw8ICg3IC0gKmRlc3RfYml0cG9zICUgOCk7CiAgICAgICAoKmRlc3RfYml0cG9zKSsrOwotICAgICAgaWYgKGEwIDwgMCkgeworICAgICAgaWYgKGEwIDwgMCkKICAgICAgICAgYTAgPSAwOwotICAgICAgfQogICAgICAgRmF4RW5jb2RlUnVuKGRlc3RfYnVmLCBkZXN0X2JpdHBvcywgYTEgLSBhMCwgYTBjb2xvcik7CiAgICAgICBGYXhFbmNvZGVSdW4oZGVzdF9idWYsIGRlc3RfYml0cG9zLCBhMiAtIGExLCAhYTBjb2xvcik7CiAgICAgICBhMCA9IGEyOwogICAgIH0KLSAgICBpZiAoYTAgPj0gY29scykgeworICAgIGlmIChhMCA+PSBjb2xzKQogICAgICAgcmV0dXJuOwotICAgIH0KICAgfQogfQogCkBAIC03NjIsNyArNzU4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2gpCiAgICAgOiBtX0NvbHMod2lkdGgpLCBtX1Jvd3MoaGVpZ2h0KSwgbV9QaXRjaChwaXRjaCksIG1fcFNyY0J1ZihzcmNfYnVmKSB7CiAgIG1fUmVmTGluZS5yZXNpemUobV9QaXRjaCk7Ci0gIEZYU1lTX21lbXNldChtX1JlZkxpbmUuZGF0YSgpLCAweGZmLCBtX1BpdGNoKTsKKyAgbWVtc2V0KG1fUmVmTGluZS5kYXRhKCksIDB4ZmYsIG1fUGl0Y2gpOwogICBtX3BMaW5lQnVmID0gRlhfQWxsb2MyRCh1aW50OF90LCBtX1BpdGNoLCA4KTsKICAgbV9EZXN0QnVmLkVzdGltYXRlU2l6ZSgwLCAxMDI0MCk7CiB9CkBAIC03NzgsMTcgKzc3NCwxNiBAQAogICB1aW50OF90IGxhc3RfYnl0ZSA9IDA7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9Sb3dzOyBpKyspIHsKICAgICBjb25zdCB1aW50OF90KiBzY2FuX2xpbmUgPSBtX3BTcmNCdWYgKyBpICogbV9QaXRjaDsKLSAgICBGWFNZU19tZW1zZXQobV9wTGluZUJ1ZiwgMCwgbV9QaXRjaCAqIDgpOworICAgIG1lbXNldChtX3BMaW5lQnVmLCAwLCBtX1BpdGNoICogOCk7CiAgICAgbV9wTGluZUJ1ZlswXSA9IGxhc3RfYnl0ZTsKICAgICBGYXhFbmNvZGUyRExpbmUobV9wTGluZUJ1ZiwgJmRlc3RfYml0cG9zLCBzY2FuX2xpbmUsIG1fUmVmTGluZSwgbV9Db2xzKTsKICAgICBtX0Rlc3RCdWYuQXBwZW5kQmxvY2sobV9wTGluZUJ1ZiwgZGVzdF9iaXRwb3MgLyA4KTsKICAgICBsYXN0X2J5dGUgPSBtX3BMaW5lQnVmW2Rlc3RfYml0cG9zIC8gOF07CiAgICAgZGVzdF9iaXRwb3MgJT0gODsKLSAgICBGWFNZU19tZW1jcHkobV9SZWZMaW5lLmRhdGEoKSwgc2Nhbl9saW5lLCBtX1BpdGNoKTsKKyAgICBtZW1jcHkobV9SZWZMaW5lLmRhdGEoKSwgc2Nhbl9saW5lLCBtX1BpdGNoKTsKICAgfQotICBpZiAoZGVzdF9iaXRwb3MpIHsKKyAgaWYgKGRlc3RfYml0cG9zKQogICAgIG1fRGVzdEJ1Zi5BcHBlbmRCeXRlKGxhc3RfYnl0ZSk7Ci0gIH0KICAgKmRlc3Rfc2l6ZSA9IG1fRGVzdEJ1Zi5HZXRTaXplKCk7CiAgICpkZXN0X2J1ZiA9IG1fRGVzdEJ1Zi5EZXRhY2hCdWZmZXIoKTsKIH0KQEAgLTgwNiw0ICs4MDEsNCBAQAogICBlbmNvZGVyLkVuY29kZShkZXN0X2J1ZiwgZGVzdF9zaXplKTsKIH0KIAotI2VuZGlmCisjZW5kaWYgIC8vIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmxhdGUuY3BwIGIvY29yZS9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ZsYXRlLmNwcAppbmRleCAzY2ZmYzBiLi45NTkwMmJiIDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfZmxhdGUuY3BwCisrKyBiL2NvcmUvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19mbGF0ZS5jcHAKQEAgLTExLDg2ICsxMSw5NSBAQAogI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2Z4X2NvZGVjLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9leHQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2ZsYXRlbW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19zY2FubGluZWRlY29kZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9jb252ZXJzaW9ucy5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS96bGliX3YxMjgvemxpYi5oIgorCisjaWYgZGVmaW5lZChVU0VfU1lTVEVNX1pMSUIpCisjaW5jbHVkZSA8emxpYi5oPgorI2Vsc2UKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS96bGliL3psaWIuaCIKKyNlbmRpZgogCiBleHRlcm4gIkMiIHsKKwogc3RhdGljIHZvaWQqIG15X2FsbG9jX2Z1bmModm9pZCogb3BhcXVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGl0ZW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNpemUpIHsKICAgcmV0dXJuIEZYX0FsbG9jMkQodWludDhfdCwgaXRlbXMsIHNpemUpOwogfQorCiBzdGF0aWMgdm9pZCBteV9mcmVlX2Z1bmModm9pZCogb3BhcXVlLCB2b2lkKiBhZGRyZXNzKSB7CiAgIEZYX0ZyZWUoYWRkcmVzcyk7CiB9Ci1zdGF0aWMgaW50IEZQREZBUElfRmxhdGVHZXRUb3RhbE91dCh2b2lkKiBjb250ZXh0KSB7Ci0gIHJldHVybiAoKHpfc3RyZWFtKiljb250ZXh0KS0+dG90YWxfb3V0OwotfQotc3RhdGljIGludCBGUERGQVBJX0ZsYXRlR2V0VG90YWxJbih2b2lkKiBjb250ZXh0KSB7Ci0gIHJldHVybiAoKHpfc3RyZWFtKiljb250ZXh0KS0+dG90YWxfaW47Ci19Ci0KLXN0YXRpYyBib29sIEZQREZBUElfRmxhdGVDb21wcmVzcyh1bnNpZ25lZCBjaGFyKiBkZXN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nKiBkZXN0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogc3JjX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNyY19zaXplKSB7Ci0gIHJldHVybiBjb21wcmVzcyhkZXN0X2J1ZiwgZGVzdF9zaXplLCBzcmNfYnVmLCBzcmNfc2l6ZSkgPT0gWl9PSzsKLX0KLQotdm9pZCogRlBERkFQSV9GbGF0ZUluaXQodm9pZCogKCphbGxvY19mdW5jKSh2b2lkKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmZyZWVfZnVuYykodm9pZCosIHZvaWQqKSkgewotICB6X3N0cmVhbSogcCA9ICh6X3N0cmVhbSopYWxsb2NfZnVuYygwLCAxLCBzaXplb2Yoel9zdHJlYW0pKTsKLSAgaWYgKCFwKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIEZYU1lTX21lbXNldChwLCAwLCBzaXplb2Yoel9zdHJlYW0pKTsKLSAgcC0+emFsbG9jID0gYWxsb2NfZnVuYzsKLSAgcC0+emZyZWUgPSBmcmVlX2Z1bmM7Ci0gIGluZmxhdGVJbml0KHApOwotICByZXR1cm4gcDsKLX0KLQotdm9pZCBGUERGQVBJX0ZsYXRlSW5wdXQodm9pZCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyY19idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3JjX3NpemUpIHsKLSAgKCh6X3N0cmVhbSopY29udGV4dCktPm5leHRfaW4gPSAodW5zaWduZWQgY2hhciopc3JjX2J1ZjsKLSAgKCh6X3N0cmVhbSopY29udGV4dCktPmF2YWlsX2luID0gc3JjX3NpemU7Ci19Ci0KLWludCBGUERGQVBJX0ZsYXRlT3V0cHV0KHZvaWQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBkZXN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZXN0X3NpemUpIHsKLSAgKCh6X3N0cmVhbSopY29udGV4dCktPm5leHRfb3V0ID0gZGVzdF9idWY7Ci0gICgoel9zdHJlYW0qKWNvbnRleHQpLT5hdmFpbF9vdXQgPSBkZXN0X3NpemU7Ci0gIHVuc2lnbmVkIGludCBwcmVfcG9zID0gKHVuc2lnbmVkIGludClGUERGQVBJX0ZsYXRlR2V0VG90YWxPdXQoY29udGV4dCk7Ci0gIGludCByZXQgPSBpbmZsYXRlKCh6X3N0cmVhbSopY29udGV4dCwgWl9TWU5DX0ZMVVNIKTsKLSAgdW5zaWduZWQgaW50IHBvc3RfcG9zID0gKHVuc2lnbmVkIGludClGUERGQVBJX0ZsYXRlR2V0VG90YWxPdXQoY29udGV4dCk7Ci0gIHVuc2lnbmVkIGludCB3cml0dGVuID0gcG9zdF9wb3MgLSBwcmVfcG9zOwotICBpZiAod3JpdHRlbiA8IGRlc3Rfc2l6ZSkgewotICAgIEZYU1lTX21lbXNldChkZXN0X2J1ZiArIHdyaXR0ZW4sICdcMCcsIGRlc3Rfc2l6ZSAtIHdyaXR0ZW4pOwotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWludCBGUERGQVBJX0ZsYXRlR2V0QXZhaWxJbih2b2lkKiBjb250ZXh0KSB7Ci0gIHJldHVybiAoKHpfc3RyZWFtKiljb250ZXh0KS0+YXZhaWxfaW47Ci19Ci0KLWludCBGUERGQVBJX0ZsYXRlR2V0QXZhaWxPdXQodm9pZCogY29udGV4dCkgewotICByZXR1cm4gKCh6X3N0cmVhbSopY29udGV4dCktPmF2YWlsX291dDsKLX0KLQotdm9pZCBGUERGQVBJX0ZsYXRlRW5kKHZvaWQqIGNvbnRleHQpIHsKLSAgaW5mbGF0ZUVuZCgoel9zdHJlYW0qKWNvbnRleHQpOwotICAoKHpfc3RyZWFtKiljb250ZXh0KS0+emZyZWUoMCwgY29udGV4dCk7Ci19CiAKIH0gIC8vIGV4dGVybiAiQyIKIAogbmFtZXNwYWNlIHsKIAordWludDMyX3QgRmxhdGVHZXRQb3NzaWJseVRydW5jYXRlZFRvdGFsT3V0KHZvaWQqIGNvbnRleHQpIHsKKyAgcmV0dXJuIHBkZml1bTo6YmFzZTo6c2F0dXJhdGVkX2Nhc3Q8dWludDMyX3Q+KAorICAgICAgc3RhdGljX2Nhc3Q8el9zdHJlYW0qPihjb250ZXh0KS0+dG90YWxfb3V0KTsKK30KKwordWludDMyX3QgRmxhdGVHZXRQb3NzaWJseVRydW5jYXRlZFRvdGFsSW4odm9pZCogY29udGV4dCkgeworICByZXR1cm4gcGRmaXVtOjpiYXNlOjpzYXR1cmF0ZWRfY2FzdDx1aW50MzJfdD4oCisgICAgICBzdGF0aWNfY2FzdDx6X3N0cmVhbSo+KGNvbnRleHQpLT50b3RhbF9pbik7Cit9CisKK2Jvb2wgRmxhdGVDb21wcmVzcyh1bnNpZ25lZCBjaGFyKiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nKiBkZXN0X3NpemUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc2l6ZSkgeworICByZXR1cm4gY29tcHJlc3MoZGVzdF9idWYsIGRlc3Rfc2l6ZSwgc3JjX2J1Ziwgc3JjX3NpemUpID09IFpfT0s7Cit9CisKK3ZvaWQqIEZsYXRlSW5pdCgpIHsKKyAgel9zdHJlYW0qIHAgPSBGWF9BbGxvYyh6X3N0cmVhbSwgMSk7CisgIG1lbXNldChwLCAwLCBzaXplb2Yoel9zdHJlYW0pKTsKKyAgcC0+emFsbG9jID0gbXlfYWxsb2NfZnVuYzsKKyAgcC0+emZyZWUgPSBteV9mcmVlX2Z1bmM7CisgIGluZmxhdGVJbml0KHApOworICByZXR1cm4gcDsKK30KKwordm9pZCBGbGF0ZUlucHV0KHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc2l6ZSkgeworICBzdGF0aWNfY2FzdDx6X3N0cmVhbSo+KGNvbnRleHQpLT5uZXh0X2luID0KKyAgICAgIGNvbnN0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KHNyY19idWYpOworICBzdGF0aWNfY2FzdDx6X3N0cmVhbSo+KGNvbnRleHQpLT5hdmFpbF9pbiA9IHNyY19zaXplOworfQorCit1aW50MzJfdCBGbGF0ZU91dHB1dCh2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZXN0X3NpemUpIHsKKyAgc3RhdGljX2Nhc3Q8el9zdHJlYW0qPihjb250ZXh0KS0+bmV4dF9vdXQgPSBkZXN0X2J1ZjsKKyAgc3RhdGljX2Nhc3Q8el9zdHJlYW0qPihjb250ZXh0KS0+YXZhaWxfb3V0ID0gZGVzdF9zaXplOworICB1aW50MzJfdCBwcmVfcG9zID0gRmxhdGVHZXRQb3NzaWJseVRydW5jYXRlZFRvdGFsT3V0KGNvbnRleHQpOworICBpbnQgcmV0ID0gaW5mbGF0ZShzdGF0aWNfY2FzdDx6X3N0cmVhbSo+KGNvbnRleHQpLCBaX1NZTkNfRkxVU0gpOworCisgIHVpbnQzMl90IHBvc3RfcG9zID0gRmxhdGVHZXRQb3NzaWJseVRydW5jYXRlZFRvdGFsT3V0KGNvbnRleHQpOworICBBU1NFUlQocG9zdF9wb3MgPj0gcHJlX3Bvcyk7CisKKyAgdWludDMyX3Qgd3JpdHRlbiA9IHBvc3RfcG9zIC0gcHJlX3BvczsKKyAgaWYgKHdyaXR0ZW4gPCBkZXN0X3NpemUpCisgICAgbWVtc2V0KGRlc3RfYnVmICsgd3JpdHRlbiwgJ1wwJywgZGVzdF9zaXplIC0gd3JpdHRlbik7CisKKyAgcmV0dXJuIHJldDsKK30KKwordWludDMyX3QgRmxhdGVHZXRBdmFpbE91dCh2b2lkKiBjb250ZXh0KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDx6X3N0cmVhbSo+KGNvbnRleHQpLT5hdmFpbF9vdXQ7Cit9CisKK3ZvaWQgRmxhdGVFbmQodm9pZCogY29udGV4dCkgeworICBpbmZsYXRlRW5kKHN0YXRpY19jYXN0PHpfc3RyZWFtKj4oY29udGV4dCkpOworICBzdGF0aWNfY2FzdDx6X3N0cmVhbSo+KGNvbnRleHQpLT56ZnJlZSgwLCBjb250ZXh0KTsKK30KKwogY2xhc3MgQ0xaV0RlY29kZXIgewogIHB1YmxpYzoKICAgaW50IERlY29kZSh1aW50OF90KiBvdXRwdXQsCkBAIC0xNTgsNyArMTY3LDcgQEAKICAgbV9wT3V0cHV0ID0gZGVzdF9idWY7CiAgIG1fRWFybHkgPSBiRWFybHlDaGFuZ2UgPyAxIDogMDsKICAgbV9uQ29kZXMgPSAwOwotICB1aW50MzJfdCBvbGRfY29kZSA9ICh1aW50MzJfdCktMTsKKyAgdWludDMyX3Qgb2xkX2NvZGUgPSAweEZGRkZGRkZGOwogICB1aW50OF90IGxhc3RfY2hhciA9IDA7CiAgIHdoaWxlICgxKSB7CiAgICAgaWYgKG1fSW5Qb3MgKyBtX0NvZGVMZW4gPiBzcmNfc2l6ZSAqIDgpIHsKQEAgLTE4MSw2ICsxOTAsOCBAQAogICAgICAgfQogICAgIH0KICAgICBtX0luUG9zICs9IG1fQ29kZUxlbjsKKyAgICBpZiAoY29kZSA9PSAyNTcpCisgICAgICBicmVhazsKICAgICBpZiAoY29kZSA8IDI1NikgewogICAgICAgaWYgKG1fT3V0UG9zID09IGRlc3Rfc2l6ZSkgewogICAgICAgICByZXR1cm4gLTU7CkBAIC0xOTAsMjAgKzIwMSwxOCBAQAogICAgICAgfQogICAgICAgbV9PdXRQb3MrKzsKICAgICAgIGxhc3RfY2hhciA9ICh1aW50OF90KWNvZGU7Ci0gICAgICBpZiAob2xkX2NvZGUgIT0gKHVpbnQzMl90KS0xKSB7CisgICAgICBpZiAob2xkX2NvZGUgIT0gMHhGRkZGRkZGRikKICAgICAgICAgQWRkQ29kZShvbGRfY29kZSwgbGFzdF9jaGFyKTsKLSAgICAgIH0KICAgICAgIG9sZF9jb2RlID0gY29kZTsKICAgICB9IGVsc2UgaWYgKGNvZGUgPT0gMjU2KSB7CiAgICAgICBtX0NvZGVMZW4gPSA5OwogICAgICAgbV9uQ29kZXMgPSAwOwotICAgICAgb2xkX2NvZGUgPSAodWludDMyX3QpLTE7Ci0gICAgfSBlbHNlIGlmIChjb2RlID09IDI1NykgewotICAgICAgYnJlYWs7CisgICAgICBvbGRfY29kZSA9IDB4RkZGRkZGRkY7CiAgICAgfSBlbHNlIHsKLSAgICAgIGlmIChvbGRfY29kZSA9PSAodWludDMyX3QpLTEpIHsKKyAgICAgIC8vIEVsc2UgMjU3IG9yIGdyZWF0ZXIuCisgICAgICBpZiAob2xkX2NvZGUgPT0gMHhGRkZGRkZGRikKICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICB9CisKICAgICAgIG1fU3RhY2tMZW4gPSAwOwogICAgICAgaWYgKGNvZGUgPj0gbV9uQ29kZXMgKyAyNTgpIHsKICAgICAgICAgaWYgKG1fU3RhY2tMZW4gPCBzaXplb2YobV9EZWNvZGVTdGFjaykpIHsKQEAgLTI0Miw5ICsyNTEsOSBAQAogCiB1aW50OF90IFBhdGhQcmVkaWN0b3IoaW50IGEsIGludCBiLCBpbnQgYykgewogICBpbnQgcCA9IGEgKyBiIC0gYzsKLSAgaW50IHBhID0gRlhTWVNfYWJzKHAgLSBhKTsKLSAgaW50IHBiID0gRlhTWVNfYWJzKHAgLSBiKTsKLSAgaW50IHBjID0gRlhTWVNfYWJzKHAgLSBjKTsKKyAgaW50IHBhID0gYWJzKHAgLSBhKTsKKyAgaW50IHBiID0gYWJzKHAgLSBiKTsKKyAgaW50IHBjID0gYWJzKHAgLSBjKTsKICAgaWYgKHBhIDw9IHBiICYmIHBhIDw9IHBjKQogICAgIHJldHVybiAodWludDhfdClhOwogICBpZiAocGIgPD0gcGMpCkBAIC0yODgsNyArMjk3LDcgQEAKICAgaW50IEJ5dGVzUGVyUGl4ZWwgPSAoYnBjICogbkNvbG9ycyArIDcpIC8gODsKICAgdWludDhfdCB0YWcgPSBwU3JjRGF0YVswXTsKICAgaWYgKHRhZyA9PSAwKSB7Ci0gICAgRlhTWVNfbWVtbW92ZShwRGVzdERhdGEsIHBTcmNEYXRhICsgMSwgcm93X3NpemUpOworICAgIG1lbW1vdmUocERlc3REYXRhLCBwU3JjRGF0YSArIDEsIHJvd19zaXplKTsKICAgICByZXR1cm47CiAgIH0KICAgZm9yIChpbnQgYnl0ZSA9IDA7IGJ5dGUgPCByb3dfc2l6ZTsgYnl0ZSsrKSB7CkBAIC0zNzAsNyArMzc5LDcgQEAKICAgICAgIGlmICgocm93ICsgMSkgKiAobW92ZV9zaXplICsgMSkgPiAoaW50KWRhdGFfc2l6ZSkgewogICAgICAgICBtb3ZlX3NpemUgPSBsYXN0X3Jvd19zaXplIC0gMTsKICAgICAgIH0KLSAgICAgIEZYU1lTX21lbW1vdmUocERlc3REYXRhLCBwU3JjRGF0YSArIDEsIG1vdmVfc2l6ZSk7CisgICAgICBtZW1tb3ZlKHBEZXN0RGF0YSwgcFNyY0RhdGEgKyAxLCBtb3ZlX3NpemUpOwogICAgICAgcFNyY0RhdGEgKz0gbW92ZV9zaXplICsgMTsKICAgICAgIHBEZXN0RGF0YSArPSBtb3ZlX3NpemU7CiAgICAgICBieXRlX2NudCArPSBtb3ZlX3NpemU7CkBAIC00NjUsNyArNDc0LDcgQEAKICAgfQogICBpbnQgQnl0ZXNQZXJQaXhlbCA9IEJpdHNQZXJDb21wb25lbnQgKiBDb2xvcnMgLyA4OwogICBpZiAoQml0c1BlckNvbXBvbmVudCA9PSAxNikgewotICAgIGZvciAodWludDMyX3QgaSA9IEJ5dGVzUGVyUGl4ZWw7IGkgPCByb3dfc2l6ZTsgaSArPSAyKSB7CisgICAgZm9yICh1aW50MzJfdCBpID0gQnl0ZXNQZXJQaXhlbDsgaSArIDEgPCByb3dfc2l6ZTsgaSArPSAyKSB7CiAgICAgICB1aW50MTZfdCBwaXhlbCA9CiAgICAgICAgICAgKGRlc3RfYnVmW2kgLSBCeXRlc1BlclBpeGVsXSA8PCA4KSB8IGRlc3RfYnVmW2kgLSBCeXRlc1BlclBpeGVsICsgMV07CiAgICAgICBwaXhlbCArPSAoZGVzdF9idWZbaV0gPDwgOCkgfCBkZXN0X2J1ZltpICsgMV07CkBAIC01MDUsMTA5ICs1MTQsNjYgQEAKICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBkZXN0X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgb2Zmc2V0KSB7Ci0gIHVpbnQzMl90IGd1ZXNzX3NpemUgPSBvcmlnX3NpemUgPyBvcmlnX3NpemUgOiBzcmNfc2l6ZSAqIDI7Ci0gIGNvbnN0IHVpbnQzMl90IGtTdGVwU2l6ZSA9IDEwMjQwOwotICB1aW50MzJfdCBhbGxvY19zdGVwID0gb3JpZ19zaXplID8ga1N0ZXBTaXplIDogc3RkOjptaW4oc3JjX3NpemUsIGtTdGVwU2l6ZSk7Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4SW5pdGlhbEFsbG9jU2l6ZSA9IDEwMDAwMDAwOwotICBpZiAoZ3Vlc3Nfc2l6ZSA+IGtNYXhJbml0aWFsQWxsb2NTaXplKSB7Ci0gICAgZ3Vlc3Nfc2l6ZSA9IGtNYXhJbml0aWFsQWxsb2NTaXplOwotICAgIGFsbG9jX3N0ZXAgPSBrTWF4SW5pdGlhbEFsbG9jU2l6ZTsKLSAgfQotICB1aW50MzJfdCBidWZfc2l6ZSA9IGd1ZXNzX3NpemU7Ci0gIHVpbnQzMl90IGxhc3RfYnVmX3NpemUgPSBidWZfc2l6ZTsKLQogICBkZXN0X2J1ZiA9IG51bGxwdHI7CiAgIGRlc3Rfc2l6ZSA9IDA7Ci0gIHZvaWQqIGNvbnRleHQgPSBGUERGQVBJX0ZsYXRlSW5pdChteV9hbGxvY19mdW5jLCBteV9mcmVlX2Z1bmMpOworICB2b2lkKiBjb250ZXh0ID0gRmxhdGVJbml0KCk7CiAgIGlmICghY29udGV4dCkKICAgICByZXR1cm47CiAKKyAgRmxhdGVJbnB1dChjb250ZXh0LCBzcmNfYnVmLCBzcmNfc2l6ZSk7CisKKyAgY29uc3QgdWludDMyX3Qga01heEluaXRpYWxBbGxvY1NpemUgPSAxMDAwMDAwMDsKKyAgdWludDMyX3QgZ3Vlc3Nfc2l6ZSA9IG9yaWdfc2l6ZSA/IG9yaWdfc2l6ZSA6IHNyY19zaXplICogMjsKKyAgZ3Vlc3Nfc2l6ZSA9IHN0ZDo6bWluKGd1ZXNzX3NpemUsIGtNYXhJbml0aWFsQWxsb2NTaXplKTsKKworICB1aW50MzJfdCBidWZfc2l6ZSA9IGd1ZXNzX3NpemU7CisgIHVpbnQzMl90IGxhc3RfYnVmX3NpemUgPSBidWZfc2l6ZTsKICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IGd1ZXNzX2J1ZigKICAgICAgIEZYX0FsbG9jKHVpbnQ4X3QsIGd1ZXNzX3NpemUgKyAxKSk7CiAgIGd1ZXNzX2J1Zi5nZXQoKVtndWVzc19zaXplXSA9ICdcMCc7CiAKLSAgRlBERkFQSV9GbGF0ZUlucHV0KGNvbnRleHQsIHNyY19idWYsIHNyY19zaXplKTsKLQotICBpZiAoc3JjX3NpemUgPCBrU3RlcFNpemUpIHsKLSAgICAvLyBUaGlzIGlzIHRoZSBvbGQgaW1wbGVtZW50YXRpb24uCi0gICAgdWludDhfdCogY3VyX2J1ZiA9IGd1ZXNzX2J1Zi5nZXQoKTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgaW50MzJfdCByZXQgPSBGUERGQVBJX0ZsYXRlT3V0cHV0KGNvbnRleHQsIGN1cl9idWYsIGJ1Zl9zaXplKTsKLSAgICAgIGlmIChyZXQgIT0gWl9PSykKLSAgICAgICAgYnJlYWs7Ci0gICAgICBpbnQzMl90IGF2YWlsX2J1Zl9zaXplID0gRlBERkFQSV9GbGF0ZUdldEF2YWlsT3V0KGNvbnRleHQpOwotICAgICAgaWYgKGF2YWlsX2J1Zl9zaXplICE9IDApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICB1aW50MzJfdCBvbGRfc2l6ZSA9IGd1ZXNzX3NpemU7Ci0gICAgICBndWVzc19zaXplICs9IGFsbG9jX3N0ZXA7Ci0gICAgICBpZiAoZ3Vlc3Nfc2l6ZSA8IG9sZF9zaXplIHx8IGd1ZXNzX3NpemUgKyAxIDwgZ3Vlc3Nfc2l6ZSkgewotICAgICAgICBGUERGQVBJX0ZsYXRlRW5kKGNvbnRleHQpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgdWludDhfdCogbmV3X2J1ZiA9Ci0gICAgICAgICAgICBGWF9SZWFsbG9jKHVpbnQ4X3QsIGd1ZXNzX2J1Zi5yZWxlYXNlKCksIGd1ZXNzX3NpemUgKyAxKTsKLSAgICAgICAgZ3Vlc3NfYnVmLnJlc2V0KG5ld19idWYpOwotICAgICAgfQotICAgICAgZ3Vlc3NfYnVmLmdldCgpW2d1ZXNzX3NpemVdID0gJ1wwJzsKLSAgICAgIGN1cl9idWYgPSBndWVzc19idWYuZ2V0KCkgKyBvbGRfc2l6ZTsKLSAgICAgIGJ1Zl9zaXplID0gZ3Vlc3Nfc2l6ZSAtIG9sZF9zaXplOwotICAgIH0KLSAgICBkZXN0X3NpemUgPSBGUERGQVBJX0ZsYXRlR2V0VG90YWxPdXQoY29udGV4dCk7Ci0gICAgb2Zmc2V0ID0gRlBERkFQSV9GbGF0ZUdldFRvdGFsSW4oY29udGV4dCk7Ci0gICAgaWYgKGd1ZXNzX3NpemUgLyAyID4gZGVzdF9zaXplKSB7Ci0gICAgICB7Ci0gICAgICAgIHVpbnQ4X3QqIG5ld19idWYgPQotICAgICAgICAgICAgRlhfUmVhbGxvYyh1aW50OF90LCBndWVzc19idWYucmVsZWFzZSgpLCBkZXN0X3NpemUgKyAxKTsKLSAgICAgICAgZ3Vlc3NfYnVmLnJlc2V0KG5ld19idWYpOwotICAgICAgfQotICAgICAgZ3Vlc3Nfc2l6ZSA9IGRlc3Rfc2l6ZTsKLSAgICAgIGd1ZXNzX2J1Zi5nZXQoKVtndWVzc19zaXplXSA9ICdcMCc7Ci0gICAgfQotICAgIGRlc3RfYnVmID0gZ3Vlc3NfYnVmLnJlbGVhc2UoKTsKLSAgfSBlbHNlIHsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90Kj4gcmVzdWx0X3RtcF9idWZzOwotICAgIHVpbnQ4X3QqIGN1cl9idWYgPSBndWVzc19idWYucmVsZWFzZSgpOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICBpbnQzMl90IHJldCA9IEZQREZBUElfRmxhdGVPdXRwdXQoY29udGV4dCwgY3VyX2J1ZiwgYnVmX3NpemUpOwotICAgICAgaW50MzJfdCBhdmFpbF9idWZfc2l6ZSA9IEZQREZBUElfRmxhdGVHZXRBdmFpbE91dChjb250ZXh0KTsKLSAgICAgIGlmIChyZXQgIT0gWl9PSykgewotICAgICAgICBsYXN0X2J1Zl9zaXplID0gYnVmX3NpemUgLSBhdmFpbF9idWZfc2l6ZTsKLSAgICAgICAgcmVzdWx0X3RtcF9idWZzLnB1c2hfYmFjayhjdXJfYnVmKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoYXZhaWxfYnVmX3NpemUgIT0gMCkgewotICAgICAgICBsYXN0X2J1Zl9zaXplID0gYnVmX3NpemUgLSBhdmFpbF9idWZfc2l6ZTsKLSAgICAgICAgcmVzdWx0X3RtcF9idWZzLnB1c2hfYmFjayhjdXJfYnVmKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3QqPiByZXN1bHRfdG1wX2J1ZnM7CisgIHVpbnQ4X3QqIGN1cl9idWYgPSBndWVzc19idWYucmVsZWFzZSgpOworICB3aGlsZSAoMSkgeworICAgIHVpbnQzMl90IHJldCA9IEZsYXRlT3V0cHV0KGNvbnRleHQsIGN1cl9idWYsIGJ1Zl9zaXplKTsKKyAgICB1aW50MzJfdCBhdmFpbF9idWZfc2l6ZSA9IEZsYXRlR2V0QXZhaWxPdXQoY29udGV4dCk7CisgICAgaWYgKHJldCAhPSBaX09LIHx8IGF2YWlsX2J1Zl9zaXplICE9IDApIHsKKyAgICAgIGxhc3RfYnVmX3NpemUgPSBidWZfc2l6ZSAtIGF2YWlsX2J1Zl9zaXplOwogICAgICAgcmVzdWx0X3RtcF9idWZzLnB1c2hfYmFjayhjdXJfYnVmKTsKLSAgICAgIGN1cl9idWYgPSBGWF9BbGxvYyh1aW50OF90LCBidWZfc2l6ZSArIDEpOwotICAgICAgY3VyX2J1ZltidWZfc2l6ZV0gPSAnXDAnOworICAgICAgYnJlYWs7CiAgICAgfQotICAgIGRlc3Rfc2l6ZSA9IEZQREZBUElfRmxhdGVHZXRUb3RhbE91dChjb250ZXh0KTsKLSAgICBvZmZzZXQgPSBGUERGQVBJX0ZsYXRlR2V0VG90YWxJbihjb250ZXh0KTsKLSAgICBpZiAocmVzdWx0X3RtcF9idWZzLnNpemUoKSA9PSAxKSB7Ci0gICAgICBkZXN0X2J1ZiA9IHJlc3VsdF90bXBfYnVmc1swXTsKLSAgICB9IGVsc2UgewotICAgICAgdWludDhfdCogcmVzdWx0X2J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIGRlc3Rfc2l6ZSk7Ci0gICAgICB1aW50MzJfdCByZXN1bHRfcG9zID0gMDsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzdWx0X3RtcF9idWZzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHVpbnQ4X3QqIHRtcF9idWYgPSByZXN1bHRfdG1wX2J1ZnNbaV07Ci0gICAgICAgIHVpbnQzMl90IHRtcF9idWZfc2l6ZSA9IGJ1Zl9zaXplOwotICAgICAgICBpZiAoaSA9PSByZXN1bHRfdG1wX2J1ZnMuc2l6ZSgpIC0gMSkgewotICAgICAgICAgIHRtcF9idWZfc2l6ZSA9IGxhc3RfYnVmX3NpemU7Ci0gICAgICAgIH0KLSAgICAgICAgRlhTWVNfbWVtY3B5KHJlc3VsdF9idWYgKyByZXN1bHRfcG9zLCB0bXBfYnVmLCB0bXBfYnVmX3NpemUpOwotICAgICAgICByZXN1bHRfcG9zICs9IHRtcF9idWZfc2l6ZTsKLSAgICAgICAgRlhfRnJlZShyZXN1bHRfdG1wX2J1ZnNbaV0pOwotICAgICAgfQotICAgICAgZGVzdF9idWYgPSByZXN1bHRfYnVmOwotICAgIH0KKyAgICByZXN1bHRfdG1wX2J1ZnMucHVzaF9iYWNrKGN1cl9idWYpOworICAgIGN1cl9idWYgPSBGWF9BbGxvYyh1aW50OF90LCBidWZfc2l6ZSArIDEpOworICAgIGN1cl9idWZbYnVmX3NpemVdID0gJ1wwJzsKICAgfQotICBGUERGQVBJX0ZsYXRlRW5kKGNvbnRleHQpOworCisgIC8vIFRoZSBUb3RhbE91dCBzaXplIHJldHVybmVkIGZyb20gdGhlIGxpYnJhcnkgbWF5IG5vdCBiZSBiaWcgZW5vdWdoIHRvCisgIC8vIGhhbmRsZSB0aGUgY29udGVudCB0aGUgbGlicmFyeSByZXR1cm5zLiBXZSBjYW4gb25seSBoYW5kbGUgaXRlbXMKKyAgLy8gdXAgdG8gNEdCIGluIHNpemUuCisgIGRlc3Rfc2l6ZSA9IEZsYXRlR2V0UG9zc2libHlUcnVuY2F0ZWRUb3RhbE91dChjb250ZXh0KTsKKyAgb2Zmc2V0ID0gRmxhdGVHZXRQb3NzaWJseVRydW5jYXRlZFRvdGFsSW4oY29udGV4dCk7CisgIGlmIChyZXN1bHRfdG1wX2J1ZnMuc2l6ZSgpID09IDEpIHsKKyAgICBkZXN0X2J1ZiA9IHJlc3VsdF90bXBfYnVmc1swXTsKKyAgfSBlbHNlIHsKKyAgICB1aW50OF90KiByZXN1bHRfYnVmID0gRlhfQWxsb2ModWludDhfdCwgZGVzdF9zaXplKTsKKyAgICB1aW50MzJfdCByZXN1bHRfcG9zID0gMDsKKyAgICB1aW50MzJfdCByZW1haW5pbmcgPSBkZXN0X3NpemU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXN1bHRfdG1wX2J1ZnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIHVpbnQ4X3QqIHRtcF9idWYgPSByZXN1bHRfdG1wX2J1ZnNbaV07CisgICAgICB1aW50MzJfdCB0bXBfYnVmX3NpemUgPSBidWZfc2l6ZTsKKyAgICAgIGlmIChpID09IHJlc3VsdF90bXBfYnVmcy5zaXplKCkgLSAxKQorICAgICAgICB0bXBfYnVmX3NpemUgPSBsYXN0X2J1Zl9zaXplOworCisgICAgICB1aW50MzJfdCBjcF9zaXplID0gc3RkOjptaW4odG1wX2J1Zl9zaXplLCByZW1haW5pbmcpOworICAgICAgbWVtY3B5KHJlc3VsdF9idWYgKyByZXN1bHRfcG9zLCB0bXBfYnVmLCBjcF9zaXplKTsKKyAgICAgIHJlc3VsdF9wb3MgKz0gY3Bfc2l6ZTsKKyAgICAgIHJlbWFpbmluZyAtPSBjcF9zaXplOworCisgICAgICBGWF9GcmVlKHJlc3VsdF90bXBfYnVmc1tpXSk7CisgICAgfQorICAgIGRlc3RfYnVmID0gcmVzdWx0X2J1ZjsKKyAgfQorICBGbGF0ZUVuZChjb250ZXh0KTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCkBAIC02NTYsMTUgKzYyMiwxNiBAQAogICBtX3BQcmVkaWN0UmF3ID0gbnVsbHB0cjsKICAgbV9MZWZ0T3ZlciA9IDA7CiB9CisKIENDb2RlY19GbGF0ZVNjYW5saW5lRGVjb2Rlcjo6fkNDb2RlY19GbGF0ZVNjYW5saW5lRGVjb2RlcigpIHsKICAgRlhfRnJlZShtX3BTY2FubGluZSk7CiAgIEZYX0ZyZWUobV9wTGFzdExpbmUpOwogICBGWF9GcmVlKG1fcFByZWRpY3RCdWZmZXIpOwogICBGWF9GcmVlKG1fcFByZWRpY3RSYXcpOwotICBpZiAobV9wRmxhdGUpIHsKLSAgICBGUERGQVBJX0ZsYXRlRW5kKG1fcEZsYXRlKTsKLSAgfQorICBpZiAobV9wRmxhdGUpCisgICAgRmxhdGVFbmQobV9wRmxhdGUpOwogfQorCiB2b2lkIENDb2RlY19GbGF0ZVNjYW5saW5lRGVjb2Rlcjo6Q3JlYXRlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY19zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCkBAIC03MDksMjggKzY3NiwzMCBAQAogICAgIH0KICAgfQogfQorCiBib29sIENDb2RlY19GbGF0ZVNjYW5saW5lRGVjb2Rlcjo6dl9SZXdpbmQoKSB7Ci0gIGlmIChtX3BGbGF0ZSkgewotICAgIEZQREZBUElfRmxhdGVFbmQobV9wRmxhdGUpOwotICB9Ci0gIG1fcEZsYXRlID0gRlBERkFQSV9GbGF0ZUluaXQobXlfYWxsb2NfZnVuYywgbXlfZnJlZV9mdW5jKTsKLSAgaWYgKCFtX3BGbGF0ZSkgeworICBpZiAobV9wRmxhdGUpCisgICAgRmxhdGVFbmQobV9wRmxhdGUpOworCisgIG1fcEZsYXRlID0gRmxhdGVJbml0KCk7CisgIGlmICghbV9wRmxhdGUpCiAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEZQREZBUElfRmxhdGVJbnB1dChtX3BGbGF0ZSwgbV9TcmNCdWYsIG1fU3JjU2l6ZSk7CisKKyAgRmxhdGVJbnB1dChtX3BGbGF0ZSwgbV9TcmNCdWYsIG1fU3JjU2l6ZSk7CiAgIG1fTGVmdE92ZXIgPSAwOwogICByZXR1cm4gdHJ1ZTsKIH0KKwogdWludDhfdCogQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyOjp2X0dldE5leHRMaW5lKCkgewogICBpZiAobV9QcmVkaWN0b3IpIHsKICAgICBpZiAobV9QaXRjaCA9PSBtX1ByZWRpY3RQaXRjaCkgewogICAgICAgaWYgKG1fUHJlZGljdG9yID09IDIpIHsKLSAgICAgICAgRlBERkFQSV9GbGF0ZU91dHB1dChtX3BGbGF0ZSwgbV9wUHJlZGljdFJhdywgbV9QcmVkaWN0UGl0Y2ggKyAxKTsKKyAgICAgICAgRmxhdGVPdXRwdXQobV9wRmxhdGUsIG1fcFByZWRpY3RSYXcsIG1fUHJlZGljdFBpdGNoICsgMSk7CiAgICAgICAgIFBOR19QcmVkaWN0TGluZShtX3BTY2FubGluZSwgbV9wUHJlZGljdFJhdywgbV9wTGFzdExpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICBtX0JpdHNQZXJDb21wb25lbnQsIG1fQ29sb3JzLCBtX0NvbHVtbnMpOwotICAgICAgICBGWFNZU19tZW1jcHkobV9wTGFzdExpbmUsIG1fcFNjYW5saW5lLCBtX1ByZWRpY3RQaXRjaCk7CisgICAgICAgIG1lbWNweShtX3BMYXN0TGluZSwgbV9wU2NhbmxpbmUsIG1fUHJlZGljdFBpdGNoKTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEZQREZBUElfRmxhdGVPdXRwdXQobV9wRmxhdGUsIG1fcFNjYW5saW5lLCBtX1BpdGNoKTsKKyAgICAgICAgRmxhdGVPdXRwdXQobV9wRmxhdGUsIG1fcFNjYW5saW5lLCBtX1BpdGNoKTsKICAgICAgICAgVElGRl9QcmVkaWN0TGluZShtX3BTY2FubGluZSwgbV9QcmVkaWN0UGl0Y2gsIG1fYnBjLCBtX25Db21wcywKICAgICAgICAgICAgICAgICAgICAgICAgICBtX091dHB1dFdpZHRoKTsKICAgICAgIH0KQEAgLTczOSwzOCArNzA4LDM4IEBACiAgICAgICBzaXplX3QgcmVhZF9sZWZ0b3ZlciA9CiAgICAgICAgICAgbV9MZWZ0T3ZlciA+IGJ5dGVzX3RvX2dvID8gYnl0ZXNfdG9fZ28gOiBtX0xlZnRPdmVyOwogICAgICAgaWYgKHJlYWRfbGVmdG92ZXIpIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5KG1fcFNjYW5saW5lLAotICAgICAgICAgICAgICAgICAgICAgbV9wUHJlZGljdEJ1ZmZlciArIG1fUHJlZGljdFBpdGNoIC0gbV9MZWZ0T3ZlciwKLSAgICAgICAgICAgICAgICAgICAgIHJlYWRfbGVmdG92ZXIpOworICAgICAgICBtZW1jcHkobV9wU2NhbmxpbmUsIG1fcFByZWRpY3RCdWZmZXIgKyBtX1ByZWRpY3RQaXRjaCAtIG1fTGVmdE92ZXIsCisgICAgICAgICAgICAgICByZWFkX2xlZnRvdmVyKTsKICAgICAgICAgbV9MZWZ0T3ZlciAtPSByZWFkX2xlZnRvdmVyOwogICAgICAgICBieXRlc190b19nbyAtPSByZWFkX2xlZnRvdmVyOwogICAgICAgfQogICAgICAgd2hpbGUgKGJ5dGVzX3RvX2dvKSB7CiAgICAgICAgIGlmIChtX1ByZWRpY3RvciA9PSAyKSB7Ci0gICAgICAgICAgRlBERkFQSV9GbGF0ZU91dHB1dChtX3BGbGF0ZSwgbV9wUHJlZGljdFJhdywgbV9QcmVkaWN0UGl0Y2ggKyAxKTsKKyAgICAgICAgICBGbGF0ZU91dHB1dChtX3BGbGF0ZSwgbV9wUHJlZGljdFJhdywgbV9QcmVkaWN0UGl0Y2ggKyAxKTsKICAgICAgICAgICBQTkdfUHJlZGljdExpbmUobV9wUHJlZGljdEJ1ZmZlciwgbV9wUHJlZGljdFJhdywgbV9wTGFzdExpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQml0c1BlckNvbXBvbmVudCwgbV9Db2xvcnMsIG1fQ29sdW1ucyk7Ci0gICAgICAgICAgRlhTWVNfbWVtY3B5KG1fcExhc3RMaW5lLCBtX3BQcmVkaWN0QnVmZmVyLCBtX1ByZWRpY3RQaXRjaCk7CisgICAgICAgICAgbWVtY3B5KG1fcExhc3RMaW5lLCBtX3BQcmVkaWN0QnVmZmVyLCBtX1ByZWRpY3RQaXRjaCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgRlBERkFQSV9GbGF0ZU91dHB1dChtX3BGbGF0ZSwgbV9wUHJlZGljdEJ1ZmZlciwgbV9QcmVkaWN0UGl0Y2gpOworICAgICAgICAgIEZsYXRlT3V0cHV0KG1fcEZsYXRlLCBtX3BQcmVkaWN0QnVmZmVyLCBtX1ByZWRpY3RQaXRjaCk7CiAgICAgICAgICAgVElGRl9QcmVkaWN0TGluZShtX3BQcmVkaWN0QnVmZmVyLCBtX1ByZWRpY3RQaXRjaCwgbV9CaXRzUGVyQ29tcG9uZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9Db2xvcnMsIG1fQ29sdW1ucyk7CiAgICAgICAgIH0KICAgICAgICAgc2l6ZV90IHJlYWRfYnl0ZXMgPQogICAgICAgICAgICAgbV9QcmVkaWN0UGl0Y2ggPiBieXRlc190b19nbyA/IGJ5dGVzX3RvX2dvIDogbV9QcmVkaWN0UGl0Y2g7Ci0gICAgICAgIEZYU1lTX21lbWNweShtX3BTY2FubGluZSArIG1fUGl0Y2ggLSBieXRlc190b19nbywgbV9wUHJlZGljdEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgIHJlYWRfYnl0ZXMpOworICAgICAgICBtZW1jcHkobV9wU2NhbmxpbmUgKyBtX1BpdGNoIC0gYnl0ZXNfdG9fZ28sIG1fcFByZWRpY3RCdWZmZXIsCisgICAgICAgICAgICAgICByZWFkX2J5dGVzKTsKICAgICAgICAgbV9MZWZ0T3ZlciArPSBtX1ByZWRpY3RQaXRjaCAtIHJlYWRfYnl0ZXM7CiAgICAgICAgIGJ5dGVzX3RvX2dvIC09IHJlYWRfYnl0ZXM7CiAgICAgICB9CiAgICAgfQogICB9IGVsc2UgewotICAgIEZQREZBUElfRmxhdGVPdXRwdXQobV9wRmxhdGUsIG1fcFNjYW5saW5lLCBtX1BpdGNoKTsKKyAgICBGbGF0ZU91dHB1dChtX3BGbGF0ZSwgbV9wU2NhbmxpbmUsIG1fUGl0Y2gpOwogICB9CiAgIHJldHVybiBtX3BTY2FubGluZTsKIH0KKwogdWludDMyX3QgQ0NvZGVjX0ZsYXRlU2NhbmxpbmVEZWNvZGVyOjpHZXRTcmNPZmZzZXQoKSB7Ci0gIHJldHVybiBGUERGQVBJX0ZsYXRlR2V0VG90YWxJbihtX3BGbGF0ZSk7CisgIHJldHVybiBGbGF0ZUdldFBvc3NpYmx5VHJ1bmNhdGVkVG90YWxJbihtX3BGbGF0ZSk7CiB9CiAKIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNfU2NhbmxpbmVEZWNvZGVyPiBDQ29kZWNfRmxhdGVNb2R1bGU6OkNyZWF0ZURlY29kZXIoCkBAIC03OTksNDggKzc2OCw0NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCaXRzUGVyQ29tcG9uZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDb2x1bW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGVzdGltYXRlZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkZXN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgZGVzdF9zaXplKSB7Ci0gIGRlc3RfYnVmID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRlc3Rfc2l6ZSkgeworICAqZGVzdF9idWYgPSBudWxscHRyOwogICB1aW50MzJfdCBvZmZzZXQgPSAwOwogICBpbnQgcHJlZGljdG9yX3R5cGUgPSAwOwogICBpZiAocHJlZGljdG9yKSB7Ci0gICAgaWYgKHByZWRpY3RvciA+PSAxMCkgeworICAgIGlmIChwcmVkaWN0b3IgPj0gMTApCiAgICAgICBwcmVkaWN0b3JfdHlwZSA9IDI7Ci0gICAgfSBlbHNlIGlmIChwcmVkaWN0b3IgPT0gMikgeworICAgIGVsc2UgaWYgKHByZWRpY3RvciA9PSAyKQogICAgICAgcHJlZGljdG9yX3R5cGUgPSAxOwotICAgIH0KICAgfQogICBpZiAoYkxaVykgewotICAgIHsKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDTFpXRGVjb2Rlcj4gZGVjb2RlcihuZXcgQ0xaV0RlY29kZXIpOwotICAgICAgZGVzdF9zaXplID0gKHVpbnQzMl90KS0xOwotICAgICAgb2Zmc2V0ID0gc3JjX3NpemU7Ci0gICAgICBpbnQgZXJyID0KLSAgICAgICAgICBkZWNvZGVyLT5EZWNvZGUobnVsbHB0ciwgZGVzdF9zaXplLCBzcmNfYnVmLCBvZmZzZXQsIGJFYXJseUNoYW5nZSk7Ci0gICAgICBpZiAoZXJyIHx8IGRlc3Rfc2l6ZSA9PSAwIHx8IGRlc3Rfc2l6ZSArIDEgPCBkZXN0X3NpemUpIHsKLSAgICAgICAgcmV0dXJuIEZYX0lOVkFMSURfT0ZGU0VUOwotICAgICAgfQotICAgIH0KLSAgICB7Ci0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0xaV0RlY29kZXI+IGRlY29kZXIobmV3IENMWldEZWNvZGVyKTsKLSAgICAgIGRlc3RfYnVmID0gRlhfQWxsb2ModWludDhfdCwgZGVzdF9zaXplICsgMSk7Ci0gICAgICBkZXN0X2J1ZltkZXN0X3NpemVdID0gJ1wwJzsKLSAgICAgIGRlY29kZXItPkRlY29kZShkZXN0X2J1ZiwgZGVzdF9zaXplLCBzcmNfYnVmLCBvZmZzZXQsIGJFYXJseUNoYW5nZSk7Ci0gICAgfQorICAgIGF1dG8gZGVjb2RlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDTFpXRGVjb2Rlcj4oKTsKKyAgICAqZGVzdF9zaXplID0gMHhGRkZGRkZGRjsKKyAgICBvZmZzZXQgPSBzcmNfc2l6ZTsKKyAgICBpbnQgZXJyID0KKyAgICAgICAgZGVjb2Rlci0+RGVjb2RlKG51bGxwdHIsICpkZXN0X3NpemUsIHNyY19idWYsIG9mZnNldCwgYkVhcmx5Q2hhbmdlKTsKKyAgICBpZiAoZXJyIHx8ICpkZXN0X3NpemUgPT0gMCB8fCAqZGVzdF9zaXplICsgMSA8ICpkZXN0X3NpemUpCisgICAgICByZXR1cm4gRlhfSU5WQUxJRF9PRkZTRVQ7CisKKyAgICBkZWNvZGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENMWldEZWNvZGVyPigpOworICAgICpkZXN0X2J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsICpkZXN0X3NpemUgKyAxKTsKKyAgICAoKmRlc3RfYnVmKVsqZGVzdF9zaXplXSA9ICdcMCc7CisgICAgZGVjb2Rlci0+RGVjb2RlKCpkZXN0X2J1ZiwgKmRlc3Rfc2l6ZSwgc3JjX2J1Ziwgb2Zmc2V0LCBiRWFybHlDaGFuZ2UpOwogICB9IGVsc2UgewotICAgIEZsYXRlVW5jb21wcmVzcyhzcmNfYnVmLCBzcmNfc2l6ZSwgZXN0aW1hdGVkX3NpemUsIGRlc3RfYnVmLCBkZXN0X3NpemUsCisgICAgRmxhdGVVbmNvbXByZXNzKHNyY19idWYsIHNyY19zaXplLCBlc3RpbWF0ZWRfc2l6ZSwgKmRlc3RfYnVmLCAqZGVzdF9zaXplLAogICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOwogICB9Ci0gIGlmIChwcmVkaWN0b3JfdHlwZSA9PSAwKSB7CisgIGlmIChwcmVkaWN0b3JfdHlwZSA9PSAwKQogICAgIHJldHVybiBvZmZzZXQ7Ci0gIH0KKwogICBib29sIHJldCA9IHRydWU7CiAgIGlmIChwcmVkaWN0b3JfdHlwZSA9PSAyKSB7Ci0gICAgcmV0ID0gUE5HX1ByZWRpY3RvcihkZXN0X2J1ZiwgZGVzdF9zaXplLCBDb2xvcnMsIEJpdHNQZXJDb21wb25lbnQsIENvbHVtbnMpOwotICB9IGVsc2UgaWYgKHByZWRpY3Rvcl90eXBlID09IDEpIHsKICAgICByZXQgPQotICAgICAgICBUSUZGX1ByZWRpY3RvcihkZXN0X2J1ZiwgZGVzdF9zaXplLCBDb2xvcnMsIEJpdHNQZXJDb21wb25lbnQsIENvbHVtbnMpOworICAgICAgICBQTkdfUHJlZGljdG9yKCpkZXN0X2J1ZiwgKmRlc3Rfc2l6ZSwgQ29sb3JzLCBCaXRzUGVyQ29tcG9uZW50LCBDb2x1bW5zKTsKKyAgfSBlbHNlIGlmIChwcmVkaWN0b3JfdHlwZSA9PSAxKSB7CisgICAgcmV0ID0gVElGRl9QcmVkaWN0b3IoKmRlc3RfYnVmLCAqZGVzdF9zaXplLCBDb2xvcnMsIEJpdHNQZXJDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ29sdW1ucyk7CiAgIH0KICAgcmV0dXJuIHJldCA/IG9mZnNldCA6IEZYX0lOVkFMSURfT0ZGU0VUOwogfQpAQCAtODUyLDcgKzgxNyw3IEBACiAgICpkZXN0X3NpemUgPSBzcmNfc2l6ZSArIHNyY19zaXplIC8gMTAwMCArIDEyOwogICAqZGVzdF9idWYgPSBGWF9BbGxvYyh1aW50OF90LCAqZGVzdF9zaXplKTsKICAgdW5zaWduZWQgbG9uZyB0ZW1wX3NpemUgPSAqZGVzdF9zaXplOwotICBpZiAoIUZQREZBUElfRmxhdGVDb21wcmVzcygqZGVzdF9idWYsICZ0ZW1wX3NpemUsIHNyY19idWYsIHNyY19zaXplKSkKKyAgaWYgKCFGbGF0ZUNvbXByZXNzKCpkZXN0X2J1ZiwgJnRlbXBfc2l6ZSwgc3JjX2J1Ziwgc3JjX3NpemUpKQogICAgIHJldHVybiBmYWxzZTsKIAogICAqZGVzdF9zaXplID0gKHVpbnQzMl90KXRlbXBfc2l6ZTsKQEAgLTg2NCw3ICs4MjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogZGVzdF9idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkZXN0X3NpemUpIHsKICAgdWludDhfdCogcFNyY0J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNyY19zaXplKTsKLSAgRlhTWVNfbWVtY3B5KHBTcmNCdWYsIHNyY19idWYsIHNyY19zaXplKTsKKyAgbWVtY3B5KHBTcmNCdWYsIHNyY19idWYsIHNyY19zaXplKTsKICAgUE5HX1ByZWRpY3RvckVuY29kZSgmcFNyY0J1ZiwgJnNyY19zaXplKTsKICAgYm9vbCByZXQgPSBFbmNvZGUocFNyY0J1Ziwgc3JjX3NpemUsIGRlc3RfYnVmLCBkZXN0X3NpemUpOwogICBGWF9GcmVlKHBTcmNCdWYpOwpkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2ljYy5jcHAgYi9jb3JlL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfaWNjLmNwcAppbmRleCBmNzdjODUwLi4yOWIzN2QxIDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfaWNjLmNwcAorKysgYi9jb3JlL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfaWNjLmNwcApAQCAtNCw3NSArNCw1NyBAQAogCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2NvZGVjX2ludC5oIgotI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9meF9jb2RlYy5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xjbXMyLTIuNi9pbmNsdWRlL2xjbXMyLmgiCisjaW5jbHVkZSA8bWVtb3J5PgogCi1zdHJ1Y3QgQ0xjbXNDbW0gewotICBjbXNIVFJBTlNGT1JNIG1faFRyYW5zZm9ybTsKLSAgaW50IG1fblNyY0NvbXBvbmVudHM7Ci0gIGludCBtX25Ec3RDb21wb25lbnRzOwotICBib29sIG1fYkxhYjsKLX07Ci1ib29sIENoZWNrQ29tcG9uZW50cyhjbXNDb2xvclNwYWNlU2lnbmF0dXJlIGNzLCBpbnQgbkNvbXBvbmVudHMsIGJvb2wgYkRzdCkgewotICBpZiAobkNvbXBvbmVudHMgPD0gMCB8fCBuQ29tcG9uZW50cyA+IDE1KSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9CisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19pY2Ntb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY29kZWNfaW50LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfZml4ZWRidWZncm93LmgiCisKK25hbWVzcGFjZSB7CisKK2Jvb2wgQ2hlY2szQ29tcG9uZW50cyhjbXNDb2xvclNwYWNlU2lnbmF0dXJlIGNzLCBib29sIGJEc3QpIHsKICAgc3dpdGNoIChjcykgewotICAgIGNhc2UgY21zU2lnTGFiRGF0YToKLSAgICAgIGlmIChuQ29tcG9uZW50cyA8IDMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7CiAgICAgY2FzZSBjbXNTaWdHcmF5RGF0YToKLSAgICAgIGlmIChiRHN0ICYmIG5Db21wb25lbnRzICE9IDEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKCFiRHN0ICYmIG5Db21wb25lbnRzID4gMikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGNtc1NpZ1JnYkRhdGE6Ci0gICAgICBpZiAoYkRzdCAmJiBuQ29tcG9uZW50cyAhPSAzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOworICAgICAgcmV0dXJuIGZhbHNlOwogICAgIGNhc2UgY21zU2lnQ215a0RhdGE6Ci0gICAgICBpZiAoYkRzdCAmJiBuQ29tcG9uZW50cyAhPSA0KSB7CisgICAgICBpZiAoYkRzdCkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQogICAgICAgYnJlYWs7CisgICAgY2FzZSBjbXNTaWdMYWJEYXRhOgorICAgIGNhc2UgY21zU2lnUmdiRGF0YToKICAgICBkZWZhdWx0OgotICAgICAgaWYgKG5Db21wb25lbnRzICE9IDMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQogICAgICAgYnJlYWs7CiAgIH0KICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQqIEljY0xpYl9DcmVhdGVUcmFuc2Zvcm0oY29uc3QgdW5zaWduZWQgY2hhciogcFNyY1Byb2ZpbGVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1NyY1Byb2ZpbGVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgblNyY0NvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHBEc3RQcm9maWxlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdEc3RQcm9maWxlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRHN0Q29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTcmNGb3JtYXQgPSBJY2NfRk9STUFUX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RHN0Rm9ybWF0ID0gSWNjX0ZPUk1BVF9ERUZBVUxUKSB7Ci0gIG5TcmNDb21wb25lbnRzID0gMDsKK30gIC8vIG5hbWVzcGFjZQorCitDTGNtc0NtbTo6Q0xjbXNDbW0oaW50IHNyY0NvbXBvbmVudHMsIGNtc0hUUkFOU0ZPUk0gaFRyYW5zZm9ybSwgYm9vbCBpc0xhYikKKyAgICA6IG1faFRyYW5zZm9ybShoVHJhbnNmb3JtKSwKKyAgICAgIG1fblNyY0NvbXBvbmVudHMoc3JjQ29tcG9uZW50cyksCisgICAgICBtX2JMYWIoaXNMYWIpIHt9CisKK0NMY21zQ21tOjp+Q0xjbXNDbW0oKSB7CisgIGNtc0RlbGV0ZVRyYW5zZm9ybShtX2hUcmFuc2Zvcm0pOworfQorCitDQ29kZWNfSWNjTW9kdWxlOjpDQ29kZWNfSWNjTW9kdWxlKCkgOiBtX25Db21wb25lbnRzKDApIHt9CisKK0NDb2RlY19JY2NNb2R1bGU6On5DQ29kZWNfSWNjTW9kdWxlKCkge30KKworc3RkOjp1bmlxdWVfcHRyPENMY21zQ21tPiBDQ29kZWNfSWNjTW9kdWxlOjpDcmVhdGVUcmFuc2Zvcm1fc1JHQigKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBwU3JjUHJvZmlsZURhdGEsCisgICAgdWludDMyX3QgZHdTcmNQcm9maWxlU2l6ZSwKKyAgICB1aW50MzJfdCogblNyY0NvbXBvbmVudHMpIHsKKyAgKm5TcmNDb21wb25lbnRzID0gMDsKICAgY21zSFBST0ZJTEUgc3JjUHJvZmlsZSA9Ci0gICAgICBjbXNPcGVuUHJvZmlsZUZyb21NZW0oKHZvaWQqKXBTcmNQcm9maWxlRGF0YSwgZHdTcmNQcm9maWxlU2l6ZSk7CisgICAgICBjbXNPcGVuUHJvZmlsZUZyb21NZW0ocFNyY1Byb2ZpbGVEYXRhLCBkd1NyY1Byb2ZpbGVTaXplKTsKICAgaWYgKCFzcmNQcm9maWxlKQogICAgIHJldHVybiBudWxscHRyOwogCiAgIGNtc0hQUk9GSUxFIGRzdFByb2ZpbGU7Ci0gIGlmICghcERzdFByb2ZpbGVEYXRhICYmIGR3RHN0UHJvZmlsZVNpemUgPT0gMCAmJiBuRHN0Q29tcG9uZW50cyA9PSAzKSB7Ci0gICAgZHN0UHJvZmlsZSA9IGNtc0NyZWF0ZV9zUkdCUHJvZmlsZSgpOwotICB9IGVsc2UgewotICAgIGRzdFByb2ZpbGUgPQotICAgICAgICBjbXNPcGVuUHJvZmlsZUZyb21NZW0oKHZvaWQqKXBEc3RQcm9maWxlRGF0YSwgZHdEc3RQcm9maWxlU2l6ZSk7Ci0gIH0KKyAgZHN0UHJvZmlsZSA9IGNtc0NyZWF0ZV9zUkdCUHJvZmlsZSgpOwogICBpZiAoIWRzdFByb2ZpbGUpIHsKICAgICBjbXNDbG9zZVByb2ZpbGUoc3JjUHJvZmlsZSk7CiAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC04MSw5ICs2Myw5IEBACiAgIGJvb2wgYkxhYiA9IGZhbHNlOwogICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIHNyY0NTID0gY21zR2V0Q29sb3JTcGFjZShzcmNQcm9maWxlKTsKIAotICBuU3JjQ29tcG9uZW50cyA9IGNtc0NoYW5uZWxzT2Yoc3JjQ1MpOworICAqblNyY0NvbXBvbmVudHMgPSBjbXNDaGFubmVsc09mKHNyY0NTKTsKICAgLy8gQWNjb3JkaW5nIHRvIFBERiBzcGVjLCBudW1iZXIgb2YgY29tcG9uZW50cyBtdXN0IGJlIDEsIDMsIG9yIDQuCi0gIGlmIChuU3JjQ29tcG9uZW50cyAhPSAxICYmIG5TcmNDb21wb25lbnRzICE9IDMgJiYgblNyY0NvbXBvbmVudHMgIT0gNCkgeworICBpZiAoKm5TcmNDb21wb25lbnRzICE9IDEgJiYgKm5TcmNDb21wb25lbnRzICE9IDMgJiYgKm5TcmNDb21wb25lbnRzICE9IDQpIHsKICAgICBjbXNDbG9zZVByb2ZpbGUoc3JjUHJvZmlsZSk7CiAgICAgY21zQ2xvc2VQcm9maWxlKGRzdFByb2ZpbGUpOwogICAgIHJldHVybiBudWxscHRyOwpAQCAtOTEsMjMgKzczLDIxIEBACiAKICAgaWYgKHNyY0NTID09IGNtc1NpZ0xhYkRhdGEpIHsKICAgICBzcmNGb3JtYXQgPQotICAgICAgICBDT0xPUlNQQUNFX1NIKFBUX0xhYikgfCBDSEFOTkVMU19TSChuU3JjQ29tcG9uZW50cykgfCBCWVRFU19TSCgwKTsKKyAgICAgICAgQ09MT1JTUEFDRV9TSChQVF9MYWIpIHwgQ0hBTk5FTFNfU0goKm5TcmNDb21wb25lbnRzKSB8IEJZVEVTX1NIKDApOwogICAgIGJMYWIgPSB0cnVlOwogICB9IGVsc2UgewogICAgIHNyY0Zvcm1hdCA9Ci0gICAgICAgIENPTE9SU1BBQ0VfU0goUFRfQU5ZKSB8IENIQU5ORUxTX1NIKG5TcmNDb21wb25lbnRzKSB8IEJZVEVTX1NIKDEpOwotICAgIGlmIChzcmNDUyA9PSBjbXNTaWdSZ2JEYXRhICYmIFRfRE9TV0FQKGR3U3JjRm9ybWF0KSkgewotICAgICAgc3JjRm9ybWF0IHw9IERPU1dBUF9TSCgxKTsKLSAgICB9CisgICAgICAgIENPTE9SU1BBQ0VfU0goUFRfQU5ZKSB8IENIQU5ORUxTX1NIKCpuU3JjQ29tcG9uZW50cykgfCBCWVRFU19TSCgxKTsKICAgfQogICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIGRzdENTID0gY21zR2V0Q29sb3JTcGFjZShkc3RQcm9maWxlKTsKLSAgaWYgKCFDaGVja0NvbXBvbmVudHMoZHN0Q1MsIG5Ec3RDb21wb25lbnRzLCB0cnVlKSkgeworICBpZiAoIUNoZWNrM0NvbXBvbmVudHMoZHN0Q1MsIHRydWUpKSB7CiAgICAgY21zQ2xvc2VQcm9maWxlKHNyY1Byb2ZpbGUpOwogICAgIGNtc0Nsb3NlUHJvZmlsZShkc3RQcm9maWxlKTsKICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQogCiAgIGNtc0hUUkFOU0ZPUk0gaFRyYW5zZm9ybSA9IG51bGxwdHI7CisgIGludCBpbnRlbnQgPSAwOwogICBzd2l0Y2ggKGRzdENTKSB7CiAgICAgY2FzZSBjbXNTaWdHcmF5RGF0YToKICAgICAgIGhUcmFuc2Zvcm0gPSBjbXNDcmVhdGVUcmFuc2Zvcm0oc3JjUHJvZmlsZSwgc3JjRm9ybWF0LCBkc3RQcm9maWxlLApAQCAtMTE4LDkgKzk4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFlQRV9CR1JfOCwgaW50ZW50LCAwKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgY21zU2lnQ215a0RhdGE6Ci0gICAgICBoVHJhbnNmb3JtID0gY21zQ3JlYXRlVHJhbnNmb3JtKAotICAgICAgICAgIHNyY1Byb2ZpbGUsIHNyY0Zvcm1hdCwgZHN0UHJvZmlsZSwKLSAgICAgICAgICBUX0RPU1dBUChkd0RzdEZvcm1hdCkgPyBUWVBFX0tZTUNfOCA6IFRZUEVfQ01ZS184LCBpbnRlbnQsIDApOworICAgICAgaFRyYW5zZm9ybSA9IGNtc0NyZWF0ZVRyYW5zZm9ybShzcmNQcm9maWxlLCBzcmNGb3JtYXQsIGRzdFByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfQ01ZS184LCBpbnRlbnQsIDApOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIGJyZWFrOwpAQCAtMTMwLDE1MzkgKzEwOSw0NCBAQAogICAgIGNtc0Nsb3NlUHJvZmlsZShkc3RQcm9maWxlKTsKICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQotICBDTGNtc0NtbSogcENtbSA9IG5ldyBDTGNtc0NtbTsKLSAgcENtbS0+bV9uU3JjQ29tcG9uZW50cyA9IG5TcmNDb21wb25lbnRzOwotICBwQ21tLT5tX25Ec3RDb21wb25lbnRzID0gbkRzdENvbXBvbmVudHM7Ci0gIHBDbW0tPm1faFRyYW5zZm9ybSA9IGhUcmFuc2Zvcm07Ci0gIHBDbW0tPm1fYkxhYiA9IGJMYWI7CisgIGF1dG8gcENtbSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDTGNtc0NtbT4oKm5TcmNDb21wb25lbnRzLCBoVHJhbnNmb3JtLCBiTGFiKTsKICAgY21zQ2xvc2VQcm9maWxlKHNyY1Byb2ZpbGUpOwogICBjbXNDbG9zZVByb2ZpbGUoZHN0UHJvZmlsZSk7CiAgIHJldHVybiBwQ21tOwogfQotdm9pZCogSWNjTGliX0NyZWF0ZVRyYW5zZm9ybV9zUkdCKGNvbnN0IHVuc2lnbmVkIGNoYXIqIHBQcm9maWxlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1Byb2ZpbGVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBuQ29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGludGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1NyY0Zvcm1hdCkgewotICByZXR1cm4gSWNjTGliX0NyZWF0ZVRyYW5zZm9ybShwUHJvZmlsZURhdGEsIGR3UHJvZmlsZVNpemUsIG5Db21wb25lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAwLCAzLCBpbnRlbnQsIGR3U3JjRm9ybWF0KTsKLX0KLXZvaWQgSWNjTGliX0Rlc3Ryb3lUcmFuc2Zvcm0odm9pZCogcFRyYW5zZm9ybSkgewotICBpZiAoIXBUcmFuc2Zvcm0pIHsKKwordm9pZCBDQ29kZWNfSWNjTW9kdWxlOjpUcmFuc2xhdGUoQ0xjbXNDbW0qIHBUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogcFNyY1ZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwRGVzdFZhbHVlcykgeworICBpZiAoIXBUcmFuc2Zvcm0pCiAgICAgcmV0dXJuOwotICB9Ci0gIGNtc0RlbGV0ZVRyYW5zZm9ybSgoKENMY21zQ21tKilwVHJhbnNmb3JtKS0+bV9oVHJhbnNmb3JtKTsKLSAgZGVsZXRlIChDTGNtc0NtbSopcFRyYW5zZm9ybTsKLX0KLXZvaWQgSWNjTGliX1RyYW5zbGF0ZSh2b2lkKiBwVHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5TcmNDb21wb25lbnRzLAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwU3JjVmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBwRGVzdFZhbHVlcykgewotICBpZiAoIXBUcmFuc2Zvcm0pIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ0xjbXNDbW0qIHAgPSAoQ0xjbXNDbW0qKXBUcmFuc2Zvcm07CisKKyAgdWludDMyX3QgblNyY0NvbXBvbmVudHMgPSBtX25Db21wb25lbnRzOwogICB1aW50OF90IG91dHB1dFs0XTsKLSAgaWYgKHAtPm1fYkxhYikgeworICBpZiAocFRyYW5zZm9ybS0+bV9iTGFiKSB7CiAgICAgQ0ZYX0ZpeGVkQnVmR3Jvdzxkb3VibGUsIDE2PiBpbnB1dHMoblNyY0NvbXBvbmVudHMpOwogICAgIGRvdWJsZSogaW5wdXQgPSBpbnB1dHM7Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5TcmNDb21wb25lbnRzOyBpKyspIHsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgblNyY0NvbXBvbmVudHM7ICsraSkKICAgICAgIGlucHV0W2ldID0gcFNyY1ZhbHVlc1tpXTsKLSAgICB9Ci0gICAgY21zRG9UcmFuc2Zvcm0ocC0+bV9oVHJhbnNmb3JtLCBpbnB1dCwgb3V0cHV0LCAxKTsKKyAgICBjbXNEb1RyYW5zZm9ybShwVHJhbnNmb3JtLT5tX2hUcmFuc2Zvcm0sIGlucHV0LCBvdXRwdXQsIDEpOwogICB9IGVsc2UgewogICAgIENGWF9GaXhlZEJ1Zkdyb3c8dWludDhfdCwgMTY+IGlucHV0cyhuU3JjQ29tcG9uZW50cyk7CiAgICAgdWludDhfdCogaW5wdXQgPSBpbnB1dHM7Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5TcmNDb21wb25lbnRzOyBpKyspIHsKLSAgICAgIGlmIChwU3JjVmFsdWVzW2ldID4gMS4wZikgewotICAgICAgICBpbnB1dFtpXSA9IDI1NTsKLSAgICAgIH0gZWxzZSBpZiAocFNyY1ZhbHVlc1tpXSA8IDApIHsKLSAgICAgICAgaW5wdXRbaV0gPSAwOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW5wdXRbaV0gPSAoaW50KShwU3JjVmFsdWVzW2ldICogMjU1LjBmKTsKLSAgICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgblNyY0NvbXBvbmVudHM7ICsraSkgeworICAgICAgaW5wdXRbaV0gPQorICAgICAgICAgIHBkZml1bTo6Y2xhbXAoc3RhdGljX2Nhc3Q8aW50PihwU3JjVmFsdWVzW2ldICogMjU1LjBmKSwgMCwgMjU1KTsKICAgICB9Ci0gICAgY21zRG9UcmFuc2Zvcm0ocC0+bV9oVHJhbnNmb3JtLCBpbnB1dCwgb3V0cHV0LCAxKTsKKyAgICBjbXNEb1RyYW5zZm9ybShwVHJhbnNmb3JtLT5tX2hUcmFuc2Zvcm0sIGlucHV0LCBvdXRwdXQsIDEpOwogICB9Ci0gIHN3aXRjaCAocC0+bV9uRHN0Q29tcG9uZW50cykgewotICAgIGNhc2UgMToKLSAgICAgIHBEZXN0VmFsdWVzWzBdID0gb3V0cHV0WzBdIC8gMjU1LjBmOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgcERlc3RWYWx1ZXNbMF0gPSBvdXRwdXRbMl0gLyAyNTUuMGY7Ci0gICAgICBwRGVzdFZhbHVlc1sxXSA9IG91dHB1dFsxXSAvIDI1NS4wZjsKLSAgICAgIHBEZXN0VmFsdWVzWzJdID0gb3V0cHV0WzBdIC8gMjU1LjBmOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgcERlc3RWYWx1ZXNbMF0gPSBvdXRwdXRbMF0gLyAyNTUuMGY7Ci0gICAgICBwRGVzdFZhbHVlc1sxXSA9IG91dHB1dFsxXSAvIDI1NS4wZjsKLSAgICAgIHBEZXN0VmFsdWVzWzJdID0gb3V0cHV0WzJdIC8gMjU1LjBmOwotICAgICAgcERlc3RWYWx1ZXNbM10gPSBvdXRwdXRbM10gLyAyNTUuMGY7Ci0gICAgICBicmVhazsKLSAgfQotfQotdm9pZCBJY2NMaWJfVHJhbnNsYXRlSW1hZ2Uodm9pZCogcFRyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHBEZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogcFNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGl4ZWxzKSB7Ci0gIGNtc0RvVHJhbnNmb3JtKCgoQ0xjbXNDbW0qKXBUcmFuc2Zvcm0pLT5tX2hUcmFuc2Zvcm0sICh2b2lkKilwU3JjLCBwRGVzdCwKLSAgICAgICAgICAgICAgICAgcGl4ZWxzKTsKKyAgcERlc3RWYWx1ZXNbMF0gPSBvdXRwdXRbMl0gLyAyNTUuMGY7CisgIHBEZXN0VmFsdWVzWzFdID0gb3V0cHV0WzFdIC8gMjU1LjBmOworICBwRGVzdFZhbHVlc1syXSA9IG91dHB1dFswXSAvIDI1NS4wZjsKIH0KIAotQ0NvZGVjX0ljY01vZHVsZTo6Q0NvZGVjX0ljY01vZHVsZSgpIDogbV9uQ29tcG9uZW50cygwKSB7fQotCi1DQ29kZWNfSWNjTW9kdWxlOjp+Q0NvZGVjX0ljY01vZHVsZSgpIHsKLX0KLXZvaWQqIENDb2RlY19JY2NNb2R1bGU6OkNyZWF0ZVRyYW5zZm9ybV9zUkdCKGNvbnN0IHVpbnQ4X3QqIHBQcm9maWxlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3UHJvZmlsZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgbkNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGludGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3JjRm9ybWF0KSB7Ci0gIHJldHVybiBJY2NMaWJfQ3JlYXRlVHJhbnNmb3JtX3NSR0IocFByb2ZpbGVEYXRhLCBkd1Byb2ZpbGVTaXplLCBuQ29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQsIGR3U3JjRm9ybWF0KTsKLX0KLQotdm9pZCBDQ29kZWNfSWNjTW9kdWxlOjpEZXN0cm95VHJhbnNmb3JtKHZvaWQqIHBUcmFuc2Zvcm0pIHsKLSAgSWNjTGliX0Rlc3Ryb3lUcmFuc2Zvcm0ocFRyYW5zZm9ybSk7Ci19Ci12b2lkIENDb2RlY19JY2NNb2R1bGU6OlRyYW5zbGF0ZSh2b2lkKiBwVHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIHBTcmNWYWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogcERlc3RWYWx1ZXMpIHsKLSAgSWNjTGliX1RyYW5zbGF0ZShwVHJhbnNmb3JtLCBtX25Db21wb25lbnRzLCBwU3JjVmFsdWVzLCBwRGVzdFZhbHVlcyk7Ci19Ci12b2lkIENDb2RlY19JY2NNb2R1bGU6OlRyYW5zbGF0ZVNjYW5saW5lKHZvaWQqIHBUcmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBEZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwU3JjLAordm9pZCBDQ29kZWNfSWNjTW9kdWxlOjpUcmFuc2xhdGVTY2FubGluZShDTGNtc0NtbSogcFRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogcERlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHBTcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGl4ZWxzKSB7Ci0gIEljY0xpYl9UcmFuc2xhdGVJbWFnZShwVHJhbnNmb3JtLCBwRGVzdCwgcFNyYywgcGl4ZWxzKTsKLX0KLWNvbnN0IHVpbnQ4X3QgZ19DTVlLU2FtcGxlc1s4MSAqIDgxICogM10gPSB7Ci0gICAgMjU1LCAyNTUsIDI1NSwgMjI1LCAyMjYsIDIyOCwgMTk5LCAyMDAsIDIwMiwgMTczLCAxNzQsIDE3OCwgMTQ3LCAxNDksIDE1MiwKLSAgICAxMjMsIDEyNSwgMTI4LCA5OSwgIDk5LCAgMTAyLCA2OSwgIDcwLCAgNzEsICAzNCwgIDMwLCAgMzEsICAyNTUsIDI1MywgMjI5LAotICAgIDIyNiwgMjI0LCAyMDMsIDIwMCwgMTk5LCAxODIsIDE3MywgMTczLCAxNTgsIDE0OSwgMTQ4LCAxMzUsIDEyNSwgMTI0LCAxMTMsCi0gICAgOTksICA5OSwgIDkwLCAgNzAsICA2OSwgIDYzLCAgMzMsICAyOSwgIDI0LCAgMjU1LCAyNTEsIDIwNCwgMjI4LCAyMjMsIDE4MiwKLSAgICAyMDEsIDE5OCwgMTYzLCAxNzQsIDE3MiwgMTQyLCAxNTAsIDE0NywgMTIyLCAxMjUsIDEyMywgMTAxLCA5OSwgIDk4LCAgODAsCi0gICAgNzAsICA2OCwgIDU0LCAgMzIsICAyOCwgIDE2LCAgMjU1LCAyNDksIDE3OSwgMjMwLCAyMjIsIDE2MCwgMjAzLCAxOTcsIDE0NCwKLSAgICAxNzQsIDE3MCwgMTI0LCAxNTAsIDE0NSwgMTA1LCAxMjUsIDEyMiwgODgsICA5OSwgIDk3LCAgNjksICA3MCwgIDY4LCAgNDYsCi0gICAgMzEsICAyOCwgIDYsICAgMjU1LCAyNDcsIDE1NCwgMjI5LCAyMjAsIDEzOCwgMjAzLCAxOTUsIDEyMiwgMTc2LCAxNjksIDEwNywKLSAgICAxNTAsIDE0NSwgOTEsICAxMjUsIDEyMSwgNzQsICAxMDAsIDk2LCAgNTcsICA3MCwgIDY3LCAgMzUsICAyOSwgIDI2LCAgMCwKLSAgICAyNTUsIDI0NiwgMTI4LCAyMzEsIDIxNywgMTE0LCAyMDUsIDE5NCwgMTAxLCAxNzYsIDE2NywgODgsICAxNTAsIDE0NCwgNzUsCi0gICAgMTI1LCAxMjAsIDYwLCAgMTAwLCA5NiwgIDQ0LCAgNzAsICA2NiwgIDI0LCAgMjgsICAyNiwgIDAsICAgMjU1LCAyNDQsIDk2LAotICAgIDIzMSwgMjE3LCA4NywgIDIwMywgMTkyLCA3OCwgIDE3NSwgMTY3LCA2NiwgIDE1MCwgMTQzLCA1NiwgIDEyNSwgMTE5LCA0MywKLSAgICAxMDAsIDk1LCAgMjksICA2OSwgIDY2LCAgNywgICAyNiwgIDI2LCAgMCwgICAyNTUsIDI0MywgNTEsICAyMzIsIDIxNSwgNTEsCi0gICAgMjA0LCAxOTEsIDQzLCAgMTc2LCAxNjUsIDM4LCAgMTUwLCAxNDIsIDI4LCAgMTI1LCAxMTgsIDE3LCAgOTksICA5NCwgIDAsCi0gICAgNjgsICA2NSwgIDAsICAgMjQsICAyNSwgIDAsICAgMjU1LCAyNDEsIDAsICAgMjMxLCAyMTUsIDAsICAgMjAzLCAxOTAsIDAsCi0gICAgMTc2LCAxNjQsIDAsICAgMTUwLCAxNDEsIDAsICAgMTI2LCAxMTcsIDAsICAgOTksICA5MywgIDAsICAgNjgsICA2NSwgIDAsCi0gICAgMjQsICAyNSwgIDAsICAgMjUyLCAyMjgsIDIzOCwgMjIyLCAyMDEsIDIxMSwgMTk3LCAxODAsIDE5MCwgMTcxLCAxNTYsIDE2NiwKLSAgICAxNDcsIDEzMywgMTQzLCAxMjMsIDExMSwgMTE5LCA5OSwgIDg4LCAgOTQsICA3MSwgIDYxLCAgNjYsICAzNCwgIDIyLCAgMjYsCi0gICAgMjU0LCAyMjYsIDIxMywgMjI0LCAyMDEsIDE5MSwgMTk5LCAxNzksIDE3MSwgMTcyLCAxNTUsIDE0OCwgMTQ3LCAxMzMsIDEyOCwKLSAgICAxMjMsIDExMCwgMTA2LCA5OCwgIDg3LCAgODMsICA3MCwgIDU5LCAgNTcsICAzMywgIDIxLCAgMTgsICAyNTQsIDIyNCwgMTkxLAotICAgIDIyNCwgMTk5LCAxNzIsIDIwMCwgMTc3LCAxNTMsIDE3MywgMTU0LCAxMzMsIDE0NywgMTMyLCAxMTUsIDEyMywgMTA5LCA5NCwKLSAgICA5OCwgIDg2LCAgNzQsICA3MCwgIDU5LCAgNDksICAzMiwgIDIxLCAgOSwgICAyNTUsIDIyMiwgMTY4LCAyMjcsIDE5OCwgMTUwLAotICAgIDIwMCwgMTc1LCAxMzUsIDE3MywgMTUzLCAxMTgsIDE0OCwgMTMwLCA5OSwgIDEyMywgMTA5LCA4MiwgIDk4LCAgODYsICA2NCwKLSAgICA2OSwgIDU4LCAgNDAsICAzMSwgIDE5LCAgMCwgICAyNTUsIDIyMSwgMTQ1LCAyMjcsIDE5NiwgMTI5LCAyMDEsIDE3NCwgMTE1LAotICAgIDE3MywgMTUxLCA5OSwgIDE0OCwgMTI5LCA4NSwgIDEyNCwgMTA4LCA2OSwgIDk4LCAgODUsICA1MiwgIDY5LCAgNTgsICAzMCwKLSAgICAzMCwgIDE5LCAgMCwgICAyNTUsIDIxOSwgMTIxLCAyMjcsIDE5NSwgMTA5LCAyMDEsIDE3NCwgOTcsICAxNzQsIDE1MCwgODMsCi0gICAgMTQ4LCAxMjksIDcwLCAgMTI0LCAxMDcsIDU1LCAgOTgsICA4NCwgIDQwLCAgNjksICA1OCwgIDE5LCAgMjgsICAxOCwgIDAsCi0gICAgMjU1LCAyMTgsIDkyLCAgMjI5LCAxOTQsIDgyLCAgMjAyLCAxNzMsIDc1LCAgMTc0LCAxNTAsIDYzLCAgMTQ5LCAxMjgsIDUxLAotICAgIDEyNCwgMTA2LCAzOSwgIDk4LCAgODQsICAyNCwgIDY4LCAgNTcsICAzLCAgIDI2LCAgMTgsICAwLCAgIDI1NSwgMjE3LCA1NCwKLSAgICAyMjgsIDE5MywgNTIsICAyMDEsIDE3MiwgNDYsICAxNzQsIDE0OCwgMzYsICAxNDgsIDEyNywgMjcsICAxMjMsIDEwNSwgMTQsCi0gICAgOTgsICA4MywgIDAsICAgNjgsICA1NiwgIDAsICAgMjUsICAxOCwgIDAsICAgMjU1LCAyMTYsIDAsICAgMjI5LCAxOTIsIDIsCi0gICAgMjAyLCAxNzEsIDQsICAgMTczLCAxNDgsIDAsICAgMTQ4LCAxMjYsIDAsICAgMTI0LCAxMDUsIDAsICAgOTgsICA4MywgIDAsCi0gICAgNjgsICA1NiwgIDAsICAgMjQsICAxNywgIDAsICAgMjQ5LCAyMDQsIDIyMywgMjE5LCAxODEsIDE5OSwgMTk1LCAxNjAsIDE3OCwKLSAgICAxNzAsIDE0MCwgMTU2LCAxNDYsIDExOSwgMTM0LCAxMjMsIDk5LCAgMTEyLCA5OCwgIDc3LCAgODgsICA3MCwgIDUyLCAgNjEsCi0gICAgMzQsICAxMSwgIDIwLCAgMjUwLCAyMDEsIDIwMCwgMjIxLCAxODAsIDE3OCwgMTk3LCAxNTksIDE2MSwgMTcxLCAxMzksIDEzOSwKLSAgICAxNDcsIDExOSwgMTIwLCAxMjMsIDk4LCAgOTksICA5OCwgIDc3LCAgNzgsICA2OSwgIDUxLCAgNTIsICAzNCwgIDExLCAgMTAsCi0gICAgMjUyLCAyMDEsIDE4MCwgMjIzLCAxNzksIDE2MiwgMTk3LCAxNTksIDE0NCwgMTcwLCAxMzgsIDEyNSwgMTQ2LCAxMTcsIDEwNywKLSAgICAxMjIsIDk3LCAgODksICA5OCwgIDc2LCAgNjksICA2OSwgIDUwLCAgNDQsICAzMiwgIDExLCAgMiwgICAyNTIsIDE5OSwgMTU4LAotICAgIDIyMiwgMTc3LCAxNDMsIDE5OSwgMTU4LCAxMjcsIDE3MSwgMTM3LCAxMTAsIDE0NywgMTE3LCA5MywgIDEyMiwgOTYsICA3NiwKLSAgICA5NywgIDc1LCAgNTgsICA2OSwgIDUwLCAgMzYsICAzMiwgIDEwLCAgMCwgICAyNTMsIDE5OCwgMTM3LCAyMjMsIDE3NywgMTIzLAotICAgIDE5OCwgMTU2LCAxMTAsIDE3MSwgMTM2LCA5NSwgIDE0NiwgMTE2LCA4MCwgIDEyMiwgOTYsICA2NSwgIDk3LCAgNzUsICA0NywKLSAgICA2OSwgIDUwLCAgMjUsICAzMCwgIDEwLCAgMCwgICAyNTQsIDE5NywgMTE1LCAyMjUsIDE3NSwgMTA0LCAxOTgsIDE1NiwgOTIsCi0gICAgMTcyLCAxMzUsIDc5LCAgMTQ3LCAxMTUsIDY2LCAgMTIzLCA5NSwgIDUyLCAgOTgsICA3NCwgIDM3LCAgNjksICA0OSwgIDE1LAotICAgIDI5LCAgMTAsICAwLCAgIDI1NCwgMTk2LCA4OSwgIDIyNCwgMTc1LCA4MCwgIDE5OSwgMTU0LCA3MCwgIDE3MiwgMTM0LCA1OSwKLSAgICAxNDYsIDExNCwgNDgsICAxMjIsIDk1LCAgMzYsICA5NywgIDc0LCAgMjEsICA2OCwgIDQ5LCAgMCwgICAyNywgIDksICAgMCwKLSAgICAyNTUsIDE5NSwgNTcsICAyMjUsIDE3MywgNTIsICAxOTgsIDE1NCwgNDQsICAxNzIsIDEzMywgMzYsICAxNDcsIDExMywgMjYsCi0gICAgMTIzLCA5NCwgIDE0LCAgOTgsICA3NCwgIDAsICAgNjgsICA0OSwgIDAsICAgMjYsICAxMCwgIDAsICAgMjU0LCAxOTQsIDE1LAotICAgIDIyNSwgMTcyLCAxMiwgIDE5OCwgMTUzLCA3LCAgIDE3MiwgMTMyLCAzLCAgIDE0NiwgMTEzLCAwLCAgIDEyMywgOTMsICAwLAotICAgIDk4LCAgNzMsICAwLCAgIDY4LCAgNDksICAwLCAgIDI2LCAgOSwgICAwLCAgIDI0NiwgMTc4LCAyMDksIDIxOCwgMTU5LCAxODYsCi0gICAgMTk0LCAxNDAsIDE2NiwgMTY4LCAxMjIsIDE0NSwgMTQ0LCAxMDQsIDEyNSwgMTIxLCA4NSwgIDEwMywgOTcsICA2NSwgIDgxLAotICAgIDY5LCAgNDEsICA1NSwgIDM0LCAgMCwgICAxMiwgIDI0OCwgMTc2LCAxODYsIDIxOSwgMTU3LCAxNjYsIDE5NSwgMTM5LCAxNDksCi0gICAgMTY4LCAxMjEsIDEzMCwgMTQ0LCAxMDMsIDExMSwgMTIxLCA4NSwgIDkxLCAgOTcsICA2NSwgIDcxLCAgNjksICA0MSwgIDQ2LAotICAgIDM0LCAgMCwgICA0LCAgIDI0OSwgMTc1LCAxNjgsIDIyMCwgMTU2LCAxNTAsIDE5NiwgMTM5LCAxMzUsIDE2OSwgMTIxLCAxMTYsCi0gICAgMTQ0LCAxMDMsIDEwMCwgMTIyLCA4NCwgIDgzLCAgOTgsICA2NSwgIDYzLCAgNzAsICA0MSwgIDM5LCAgMzMsICAwLCAgIDAsCi0gICAgMjQ5LCAxNzUsIDE0OCwgMjIwLCAxNTUsIDEzMywgMTk2LCAxMzgsIDExOSwgMTY5LCAxMjAsIDEwMywgMTQ1LCAxMDEsIDg3LAotICAgIDEyMSwgODMsICA3MSwgIDk3LCAgNjUsICA1NCwgIDY5LCAgNDEsICAzMSwgIDMyLCAgMCwgICAwLCAgIDI0OSwgMTczLCAxMjgsCi0gICAgMjIyLCAxNTQsIDExNSwgMTk1LCAxMzcsIDEwMiwgMTcwLCAxMTksIDg4LCAgMTQ1LCAxMDEsIDc0LCAgMTIyLCA4MywgIDU5LAotICAgIDk3LCAgNjQsICA0MywgIDY4LCAgNDAsICAyMCwgIDMwLCAgMCwgICAwLCAgIDI1MCwgMTcyLCAxMDgsIDIyMSwgMTU0LCA5OCwKLSAgICAxOTUsIDEzNiwgODYsICAxNzAsIDExOCwgNzMsICAxNDUsIDEwMCwgNjEsICAxMjIsIDgyLCAgNDgsICA5NywgIDYzLCAgMzIsCi0gICAgNjksICA0MCwgIDExLCAgMjgsICAwLCAgIDAsICAgMjUwLCAxNzEsIDg1LCAgMjIxLCAxNTMsIDc2LCAgMTk2LCAxMzYsIDY3LAotICAgIDE3MCwgMTE3LCA1NiwgIDE0NSwgOTksICA0NCwgIDEyMSwgODIsICAzMywgIDk3LCAgNjMsICAxNywgIDY4LCAgNDAsICAwLAotICAgIDI4LCAgMCwgICAwLCAgIDI1MSwgMTcxLCA1OCwgIDIyMiwgMTUyLCA1MCwgIDE5NywgMTM1LCA0MywgIDE2OSwgMTE3LCAzNCwKLSAgICAxNDYsIDk5LCAgMjUsICAxMjEsIDgxLCAgMTAsICA5NiwgIDYzLCAgMCwgICA2OCwgIDQwLCAgMCwgICAyNywgIDAsICAgMCwKLSAgICAyNTAsIDE3MCwgMjYsICAyMjIsIDE1MSwgMTksICAxOTYsIDEzNCwgMTMsICAxNjksIDExNiwgNCwgICAxNDUsIDk5LCAgMCwKLSAgICAxMjIsIDgxLCAgMCwgICA5NywgIDYzLCAgMCwgICA2NywgIDQwLCAgMCwgICAyNiwgIDAsICAgMCwgICAyNDQsIDE1MywgMTk0LAotICAgIDIxNSwgMTM2LCAxNzMsIDE5MiwgMTIxLCAxNTUsIDE2NywgMTA0LCAxMzUsIDE0MywgODksICAxMTUsIDEyMSwgNzIsICA5NiwKLSAgICA5NywgIDU0LCAgNzUsICA3MCwgIDMxLCAgNDksICAzNCwgIDAsICAgNiwgICAyNDUsIDE1MywgMTczLCAyMTYsIDEzNiwgMTU1LAotICAgIDE5MiwgMTIwLCAxMzgsIDE2NywgMTA0LCAxMjEsIDE0NCwgODgsICAxMDMsIDEyMSwgNzEsICA4NSwgIDk3LCAgNTQsICA2NiwKLSAgICA2OSwgIDMxLCAgNDIsICAzNCwgIDAsICAgMCwgICAyNDYsIDE1MiwgMTU3LCAyMTcsIDEzNSwgMTQwLCAxOTMsIDEyMCwgMTI2LAotICAgIDE2NywgMTAzLCAxMDksIDE0MywgODgsICA5MiwgIDEyMSwgNzIsICA3NiwgIDk3LCAgNTQsICA1OCwgIDY5LCAgMzEsICAzNSwKLSAgICAzMywgIDAsICAgMCwgICAyNDUsIDE1MCwgMTM5LCAyMTgsIDEzNCwgMTI1LCAxOTMsIDExOSwgMTExLCAxNjcsIDEwMywgOTYsCi0gICAgMTQ0LCA4NywgIDgwLCAgMTIxLCA3MSwgIDY2LCAgOTYsICA1MywgIDQ5LCAgNjgsICAzMSwgIDI2LCAgMzIsICAwLCAgIDAsCi0gICAgMjQ2LCAxNTEsIDEyMiwgMjE4LCAxMzMsIDEwOCwgMTk0LCAxMTgsIDk2LCAgMTY4LCAxMDIsIDgxLCAgMTQ0LCA4NiwgIDY5LAotICAgIDEyMCwgNzEsICA1NSwgIDk1LCAgNTMsICAzOSwgIDY4LCAgMzAsICAxNywgIDMxLCAgMCwgICAwLCAgIDI0OCwgMTUwLCAxMDMsCi0gICAgMjE4LCAxMzMsIDkxLCAgMTkzLCAxMTgsIDgxLCAgMTY4LCAxMDIsIDY5LCAgMTQzLCA4NiwgIDU2LCAgMTIwLCA3MCwgIDQzLAotICAgIDk2LCAgNTMsICAyOCwgIDY4LCAgMzEsICA2LCAgIDI5LCAgMCwgICAwLCAgIDI0NywgMTQ5LCA4MSwgIDIxOCwgMTMyLCA3MiwKLSAgICAxOTQsIDExNywgNjIsICAxNjgsIDEwMSwgNTIsICAxNDQsIDg2LCAgNDIsICAxMjEsIDcwLCAgMjksICA5NiwgIDUyLCAgMTMsCi0gICAgNjgsICAzMCwgIDAsICAgMjgsICAwLCAgIDAsICAgMjQ3LCAxNDgsIDU1LCAgMjE5LCAxMzEsIDUwLCAgMTk0LCAxMTcsIDQzLAotICAgIDE2NywgMTAxLCAzMiwgIDE0NCwgODUsICAyMiwgIDEyMCwgNjksICA4LCAgIDk2LCAgNTIsICAwLCAgIDY3LCAgMzAsICAwLAotICAgIDI3LCAgMCwgICAwLCAgIDI0NywgMTQ3LCAyOSwgIDIxOCwgMTMxLCAyNCwgIDE5NCwgMTE2LCAyMCwgIDE2OCwgMTAwLCAxMSwKLSAgICAxNDQsIDg1LCAgMCwgICAxMjAsIDY5LCAgMCwgICA5NiwgIDUyLCAgMCwgICA2NywgIDMwLCAgMCwgICAyNiwgIDAsICAgMCwKLSAgICAyNDIsIDEzMCwgMTc5LCAyMTQsIDExNCwgMTYwLCAxOTAsIDEwMSwgMTQzLCAxNjYsIDg3LCAgMTI1LCAxNDMsIDcyLCAgMTA3LAotICAgIDEyMCwgNTgsICA4OCwgIDk2LCAgNDIsICA2OCwgIDY5LCAgMTcsICA0NCwgIDM1LCAgMCwgICAwLCAgIDI0MywgMTI5LCAxNjEsCi0gICAgMjE1LCAxMTQsIDE0MywgMTkxLCAxMDEsIDEyOCwgMTY2LCA4NywgIDExMywgMTQzLCA3MywgIDk2LCAgMTIwLCA1OCwgIDc5LAotICAgIDk2LCAgNDEsICA2MCwgIDY5LCAgMTgsICAzNywgIDMzLCAgMCwgICAwLCAgIDI0MywgMTI5LCAxNDYsIDIxNiwgMTE0LCAxMzAsCi0gICAgMTkyLCAxMDEsIDExNywgMTY2LCA4NywgIDEwMSwgMTQzLCA3MiwgIDg2LCAgMTIxLCA1OCwgIDY5LCAgOTYsICA0MiwgIDUyLAotICAgIDY5LCAgMTgsICAyOSwgIDMxLCAgMCwgICAwLCAgIDI0MywgMTI4LCAxMzAsIDIxNiwgMTE0LCAxMTUsIDE5MSwgMTAxLCAxMDIsCi0gICAgMTY1LCA4NiwgIDg4LCAgMTQyLCA3MiwgIDc1LCAgMTIwLCA1OCwgIDYwLCAgOTUsICA0MiwgIDQzLCAgNjgsICAxOSwgIDIxLAotICAgIDMwLCAgMCwgICAwLCAgIDI0NCwgMTI3LCAxMTIsIDIxNywgMTEzLCAxMDEsIDE5MiwgOTksICA4OSwgIDE2NiwgODUsICA3NSwKLSAgICAxNDIsIDcyLCAgNjMsICAxMTksIDU3LCAgNTAsICA5NiwgIDQxLCAgMzUsICA2OCwgIDE5LCAgMTMsICAzMCwgIDAsICAgMCwKLSAgICAyNDQsIDEyNywgOTYsICAyMTYsIDExMiwgODYsICAxOTEsIDk5LCAgNzUsICAxNjYsIDg2LCAgNjQsICAxNDMsIDcyLCAgNTIsCi0gICAgMTIwLCA1NywgIDQwLCAgOTUsICA0MSwgIDI0LCAgNjcsICAyMCwgIDEsICAgMjksICAwLCAgIDAsICAgMjQ1LCAxMjYsIDc3LAotICAgIDIxNiwgMTEzLCA2OCwgIDE5MSwgMTAwLCA1OSwgIDE2NiwgODUsICA0OSwgIDE0MiwgNzEsICAzOCwgIDExOSwgNTcsICAyNiwKLSAgICA5NSwgIDQxLCAgMTAsICA2NywgIDIwLCAgMCwgICAyOCwgIDAsICAgMCwgICAyNDQsIDEyNiwgNTUsICAyMTYsIDExMiwgNDgsCi0gICAgMTkxLCA5OSwgIDQwLCAgMTY2LCA4NSwgIDMxLCAgMTQzLCA3MSwgIDIwLCAgMTE5LCA1NywgIDYsICAgOTUsICA0MiwgIDAsCi0gICAgNjcsICAyMCwgIDAsICAgMjgsICAwLCAgIDAsICAgMjQ1LCAxMjYsIDMzLCAgMjE3LCAxMTIsIDI2LCAgMTkyLCA5OSwgIDIyLAotICAgIDE2NiwgODQsICAxMSwgIDE0MiwgNzAsICAwLCAgIDExOSwgNTcsICAwLCAgIDk1LCAgNDEsICAwLCAgIDY2LCAgMjAsICAwLAotICAgIDI3LCAgMCwgICAwLCAgIDI0MSwgMTAyLCAxNjcsIDIxMywgOTAsICAxNDksIDE4OSwgNzksICAxMzMsIDE2NSwgNjYsICAxMTUsCi0gICAgMTQxLCA1NCwgIDk4LCAgMTE5LCA0MSwgIDgxLCAgOTYsICAyNSwgIDYzLCAgNjksICAwLCAgIDM4LCAgMzAsICAwLCAgIDAsCi0gICAgMjQxLCAxMDIsIDE0OSwgMjEzLCA5MCwgIDEzMywgMTg5LCA3OSwgIDExOSwgMTY1LCA2NiwgIDEwMywgMTQyLCA1NSwgIDg4LAotICAgIDExOSwgNDEsICA3MSwgIDk2LCAgMjUsICA1MywgIDY5LCAgMCwgICAzMSwgIDI4LCAgMCwgICAwLCAgIDI0MSwgMTAyLCAxMzUsCi0gICAgMjE0LCA5MCwgIDEyMSwgMTkwLCA3OSwgIDEwOCwgMTY1LCA2NiwgIDkyLCAgMTQxLCA1NSwgIDc4LCAgMTE5LCA0MiwgIDYzLAotICAgIDk2LCAgMjYsICA0NiwgIDY5LCAgMCwgICAyNCwgIDI4LCAgMCwgICAwLCAgIDI0MSwgMTAxLCAxMjAsIDIxNCwgOTAsICAxMDcsCi0gICAgMTg5LCA3OSwgIDk1LCAgMTY1LCA2NywgIDgzLCAgMTQxLCA1NCwgIDY4LCAgMTE4LCA0MSwgIDU0LCAgOTUsICAyNywgIDM5LAotICAgIDY4LCAgMCwgICAxNiwgIDI3LCAgMCwgICAwLCAgIDI0MSwgMTAyLCAxMDYsIDIxMywgOTAsICA5MywgIDE4OSwgNzgsICA4MiwKLSAgICAxNjQsIDY3LCAgNzAsICAxNDEsIDU1LCAgNTgsICAxMTgsIDQyLCAgNDUsICA5NCwgIDI3LCAgMjksICA2NywgIDIsICAgNiwKLSAgICAyNywgIDAsICAgMCwgICAyNDIsIDEwMSwgOTAsICAyMTQsIDg5LCAgNzksICAxOTAsIDc5LCAgNjksICAxNjYsIDY3LCAgNTksCi0gICAgMTQxLCA1NSwgIDQ3LCAgMTE4LCA0MSwgIDM1LCAgOTUsICAyNywgIDE5LCAgNjcsICAzLCAgIDAsICAgMjYsICAwLCAgIDAsCi0gICAgMjQyLCAxMDIsIDcyLCAgMjEzLCA4OSwgIDYzLCAgMTkxLCA3OSwgIDU2LCAgMTY0LCA2NywgIDQ1LCAgMTQxLCA1NSwgIDM0LAotICAgIDExOCwgNDIsICAyMiwgIDk0LCAgMjgsICA2LCAgIDY3LCAgMywgICAwLCAgIDI2LCAgMCwgICAwLCAgIDI0MiwgMTAwLCA1MSwKLSAgICAyMTQsIDg5LCAgNDUsICAxOTAsIDc4LCAgMzgsICAxNjQsIDY3LCAgMzAsICAxNDEsIDU1LCAgMTgsICAxMTgsIDQyLCAgMywKLSAgICA5NSwgIDI4LCAgMCwgICA2NiwgIDQsICAgMCwgICAyNiwgIDAsICAgMCwgICAyNDMsIDEwMCwgMzMsICAyMTQsIDkwLCAgMjcsCi0gICAgMTkwLCA3OCwgIDIyLCAgMTY1LCA2NywgIDEzLCAgMTQxLCA1NSwgIDAsICAgMTE4LCA0MywgIDAsICAgOTQsICAyOSwgIDAsCi0gICAgNjYsICA1LCAgIDAsICAgMjYsICAwLCAgIDAsICAgMjM3LCA2OSwgIDE1MywgMjExLCA1OCwgIDEzNSwgMTg3LCA1MSwgIDEyMSwKLSAgICAxNjMsIDQxLCAgMTA1LCAxNDEsIDI4LCAgOTAsICAxMTgsIDE1LCAgNzMsICA5NiwgIDAsICAgNTYsICA2OCwgIDAsICAgMzMsCi0gICAgMjUsICAwLCAgIDAsICAgMjM5LCA2NywgIDEzNywgMjEyLCA2MCwgIDEyMywgMTg5LCA1MCwgIDExMCwgMTYzLCA0MSwgIDk0LAotICAgIDE0MSwgMjksICA3OSwgIDExOCwgMTcsICA2NSwgIDk1LCAgMCwgICA0OCwgIDY5LCAgMCwgICAyNiwgIDI1LCAgMCwgICAwLAotICAgIDI0MCwgNjksICAxMjQsIDIxMSwgNjAsICAxMTEsIDE4OCwgNTAsICA5OCwgIDE2MywgNDIsICA4NSwgIDE0MSwgMzEsICA3MiwKLSAgICAxMTgsIDE4LCAgNTcsICA5NCwgIDAsICAgNDEsICA2OCwgIDAsICAgMTksICAyNSwgIDAsICAgMCwgICAyNDAsIDcwLCAgMTEyLAotICAgIDIxMiwgNjEsICA5OSwgIDE4OCwgNTIsICA4NywgIDE2MywgNDEsICA3NCwgIDE0MCwgMzEsICA2MiwgIDExOCwgMjAsICA0OCwKLSAgICA5NCwgIDIsICAgMzIsICA2OCwgIDAsICAgMTEsICAyNCwgIDAsICAgMCwgICAyMzksIDcwLCAgOTgsICAyMTIsIDYyLCAgODYsCi0gICAgMTg4LCA1MywgIDc3LCAgMTY0LCA0MiwgIDY0LCAgMTQwLCAzMiwgIDUyLCAgMTE4LCAyMCwgIDQwLCAgOTQsICAzLCAgIDI0LAotICAgIDY3LCAgMCwgICAzLCAgIDIzLCAgMCwgICAwLCAgIDIzOSwgNzEsICA4NSwgIDIxMiwgNjEsICA3NCwgIDE4NywgNTMsICA2NSwKLSAgICAxNjMsIDQ0LCAgNTQsICAxNDAsIDM0LCAgNDMsICAxMTgsIDIyLCAgMzAsICA5NSwgIDMsICAgMTQsICA2NywgIDAsICAgMCwKLSAgICAyMywgIDAsICAgMCwgICAyMzksIDcwLCAgNjcsICAyMTIsIDYyLCAgNTksICAxODgsIDUzLCAgNTEsICAxNjMsIDQ1LCAgNDIsCi0gICAgMTQxLCAzNCwgIDMxLCAgMTE3LCAyMiwgIDE3LCAgOTQsICA1LCAgIDIsICAgNjYsICAwLCAgIDAsICAgMjMsICAwLCAgIDAsCi0gICAgMjM5LCA3MSwgIDUwLCAgMjEzLCA2MiwgIDQzLCAgMTg4LCA1NCwgIDM3LCAgMTY0LCA0NSwgIDI4LCAgMTM5LCAzNCwgIDE2LAotICAgIDExNywgMjIsICAyLCAgIDk0LCAgNywgICAwLCAgIDY1LCAgMCwgICAwLCAgIDIzLCAgMCwgICAwLCAgIDI0MCwgNzEsICAzNCwKLSAgICAyMTIsIDYzLCAgMjksICAxODksIDU0LCAgMjQsICAxNjMsIDQ2LCAgMTUsICAxMzksIDM2LCAgMiwgICAxMTcsIDI1LCAgMCwKLSAgICA5NCwgIDgsICAgMCwgICA2NiwgIDAsICAgMCwgICAyMywgIDAsICAgMCwgICAyMzcsIDAsICAgMTQwLCAyMDksIDAsICAgMTI0LAotICAgIDE4NiwgMCwgICAxMTIsIDE2MiwgMCwgICA5NywgIDE0MSwgMCwgICA4MiwgIDExOCwgMCwgICA2NywgIDk1LCAgMCwgICA0OSwKLSAgICA2OCwgIDAsICAgMjcsICAyMCwgIDAsICAgMCwgICAyMzcsIDAsICAgMTI2LCAyMTAsIDAsICAgMTEzLCAxODcsIDAsICAgOTksCi0gICAgMTYzLCAwLCAgIDg2LCAgMTM5LCAwLCAgIDcyLCAgMTE4LCAwLCAgIDU4LCAgOTUsICAwLCAgIDQyLCAgNjcsICAwLCAgIDIwLAotICAgIDIwLCAgMCwgICAwLCAgIDIzNywgMSwgICAxMTQsIDIwOSwgMSwgICAxMDIsIDE4NywgMCwgICA5MCwgIDE2MywgMCwgICA3OCwKLSAgICAxMzksIDAsICAgNjQsICAxMTgsIDAsICAgNTAsICA5NSwgIDAsICAgMzUsICA2NywgIDAsICAgMTMsICAyMCwgIDAsICAgMCwKLSAgICAyMzYsIDE2LCAgMTAyLCAyMDksIDcsICAgOTEsICAxODYsIDAsICAgODAsICAxNjIsIDAsICAgNjgsICAxMzksIDAsICAgNTYsCi0gICAgMTE3LCAwLCAgIDQzLCAgOTQsICAwLCAgIDI3LCAgNjcsICAwLCAgIDYsICAgMjAsICAwLCAgIDAsICAgMjM4LCAxNSwgIDg5LAotICAgIDIwOSwgMTMsICA3OSwgIDE4NiwgNiwgICA2OSwgIDE2MiwgMCwgICA1OCwgIDEzOSwgMCwgICA0NywgIDExNywgMCwgICAzNCwKLSAgICA5MywgIDAsICAgMjAsICA2NiwgIDAsICAgMiwgICAyMCwgIDAsICAgMCwgICAyMzcsIDIwLCAgNzgsICAyMTAsIDEyLCAgNjgsCi0gICAgMTg3LCA0LCAgIDU5LCAgMTYzLCAwLCAgIDQ5LCAgMTM5LCAwLCAgIDM4LCAgMTE2LCAwLCAgIDI2LCAgOTQsICAwLCAgIDExLAotICAgIDY2LCAgMCwgICAwLCAgIDIwLCAgMCwgICAwLCAgIDIzNywgMjUsICA2NCwgIDIxMCwgMTgsICA1NiwgIDE4NiwgMTEsICA0OCwKLSAgICAxNjIsIDQsICAgMzksICAxMzgsIDAsICAgMjcsICAxMTcsIDAsICAgMTQsICA5MywgIDAsICAgMCwgICA2NiwgIDAsICAgMCwKLSAgICAyMCwgIDAsICAgMCwgICAyMzgsIDI1LCAgNDgsICAyMTAsIDIyLCAgNDMsICAxODYsIDE1LCAgMzUsICAxNjIsIDgsICAgMjYsCi0gICAgMTQwLCAwLCAgIDE0LCAgMTE3LCAwLCAgIDAsICAgOTMsICAwLCAgIDAsICAgNjUsICAwLCAgIDAsICAgMjAsICAwLCAgIDAsCi0gICAgMjM4LCAyOCwgIDM1LCAgMjEwLCAyMSwgIDMwLCAgMTg3LCAxNSwgIDI0LCAgMTYyLCA4LCAgIDE2LCAgMTM5LCAxLCAgIDIsCi0gICAgMTE3LCAwLCAgIDAsICAgOTMsICAwLCAgIDAsICAgNjUsICAwLCAgIDAsICAgMjIsICAwLCAgIDAsICAgMjE5LCAyNDIsIDI1MiwKLSAgICAxOTUsIDIxNCwgMjI1LCAxNzIsIDE5MSwgMjAxLCAxNDgsIDE2NSwgMTc1LCAxMjcsIDE0MiwgMTUwLCAxMDYsIDExOSwgMTI2LAotICAgIDg0LCAgOTUsICAxMDEsIDU4LCAgNjYsICA3MiwgIDI0LCAgMjcsICAzMiwgIDIyMiwgMjM5LCAyMjYsIDE5NiwgMjEzLCAyMDIsCi0gICAgMTczLCAxODksIDE4MCwgMTUwLCAxNjUsIDE1OCwgMTI5LCAxNDEsIDEzNSwgMTA3LCAxMTgsIDExMywgODUsICA5NCwgIDkwLAotICAgIDU4LCAgNjYsICA2MywgIDIxLCAgMjYsICAyNCwgIDIyMywgMjM3LCAyMDMsIDE5OCwgMjExLCAxODIsIDE3NSwgMTg4LCAxNjMsCi0gICAgMTUyLCAxNjQsIDE0MSwgMTI5LCAxNDAsIDEyMSwgMTA3LCAxMTcsIDEwMSwgODUsICA5MywgIDgwLCAgNTgsICA2NCwgIDU0LAotICAgIDIxLCAgMjYsICAxOCwgIDIyNiwgMjM2LCAxNzksIDIwMSwgMjEwLCAxNjAsIDE3NywgMTg3LCAxNDMsIDE1MywgMTYyLCAxMjUsCi0gICAgMTMwLCAxMzksIDEwNiwgMTA4LCAxMTYsIDg5LCAgODUsICA5MiwgIDY5LCAgNTgsICA2NCwgIDQ1LCAgMjAsICAyNSwgIDgsCi0gICAgMjI3LCAyMzQsIDE1MywgMjAxLCAyMDgsIDEzOSwgMTc4LCAxODUsIDEyNCwgMTU0LCAxNjEsIDEwNywgMTMxLCAxMzgsIDkxLAotICAgIDEwOCwgMTE1LCA3NSwgIDg1LCAgOTEsICA1OCwgIDU4LCAgNjMsICAzNSwgIDE3LCAgMjUsICAwLCAgIDIyOSwgMjMzLCAxMzAsCi0gICAgMjAzLCAyMDcsIDExNiwgMTc4LCAxODQsIDEwNCwgMTU0LCAxNjAsIDkwLCAgMTMxLCAxMzcsIDc2LCAgMTA5LCAxMTQsIDYyLAotICAgIDg1LCAgOTAsICA0NiwgIDU4LCAgNjMsICAyNSwgIDE2LCAgMjQsICAwLCAgIDIzMCwgMjMxLCAxMDAsIDIwMiwgMjA1LCA5MCwKLSAgICAxNzksIDE4MywgODAsICAxNTQsIDE1OSwgNjksICAxMzEsIDEzNiwgNTcsICAxMDksIDExMywgNDYsICA4NiwgIDkwLCAgMzIsCi0gICAgNTgsICA2MywgIDEwLCAgMTQsICAyNCwgIDAsICAgMjMwLCAyMzAsIDY1LCAgMjA0LCAyMDQsIDU4LCAgMTgwLCAxODIsIDUyLAotICAgIDE1NSwgMTU3LCA0NCwgIDEzMiwgMTM1LCAzNSwgIDExMCwgMTEzLCAyNCwgIDg2LCAgODksICA5LCAgIDU3LCAgNjIsICAwLAotICAgIDExLCAgMjQsICAwLCAgIDIzMiwgMjMwLCAxOSwgIDIwNCwgMjA0LCAxOSwgIDE4MCwgMTgxLCAxNywgIDE1NSwgMTU3LCAxMCwKLSAgICAxMzEsIDEzNCwgMiwgICAxMDksIDExMiwgMCwgICA4NSwgIDg5LCAgMCwgICA1NywgIDYyLCAgMCwgICAxMCwgIDIzLCAgMCwKLSAgICAyMTgsIDIxNiwgMjM2LCAxOTQsIDE5MiwgMjExLCAxNzIsIDE3MSwgMTg4LCAxNDksIDE0OSwgMTY0LCAxMjgsIDEyNywgMTQxLAotICAgIDEwNiwgMTA2LCAxMTksIDg0LCAgODQsICA5NCwgIDU5LCAgNTcsICA2NiwgIDI1LCAgMTgsICAyNiwgIDIyMSwgMjE0LCAyMTEsCi0gICAgMTk2LCAxOTEsIDE5MCwgMTc0LCAxNzAsIDE3MCwgMTUwLCAxNDgsIDE0OCwgMTI4LCAxMjYsIDEyNywgMTA3LCAxMDUsIDEwNiwKLSAgICA4NSwgIDgzLCAgODQsICA1OSwgIDU2LCAgNTgsICAyMywgIDE3LCAgMTgsICAyMjIsIDIxMywgMTkwLCAxOTcsIDE4OSwgMTcwLAotICAgIDE3NSwgMTY5LCAxNTMsIDE1MSwgMTQ3LCAxMzMsIDEyOSwgMTI2LCAxMTMsIDEwOCwgMTA1LCA5NCwgIDg1LCAgODIsICA3NCwKLSAgICA1OSwgIDU2LCAgNDksICAyMiwgIDE3LCAgMTEsICAyMjQsIDIxMSwgMTY4LCAxOTksIDE4OCwgMTUxLCAxNzUsIDE2OCwgMTM1LAotICAgIDE1MiwgMTQ2LCAxMTcsIDEyOSwgMTI0LCA5OSwgIDEwNywgMTAzLCA4MiwgIDg0LCAgODIsICA2NCwgIDU5LCAgNTUsICA0MSwKLSAgICAyMSwgIDE3LCAgMSwgICAyMjQsIDIxMCwgMTQ1LCAxOTksIDE4NywgMTMwLCAxNzYsIDE2NiwgMTE3LCAxNTIsIDE0NSwgMTAxLAotICAgIDEyOSwgMTIzLCA4NiwgIDEwNywgMTAzLCA3MCwgIDg1LCAgODEsICA1MywgIDU4LCAgNTUsICAzMSwgIDE5LCAgMTcsICAwLAotICAgIDIyNywgMjA4LCAxMjMsIDIwMCwgMTg2LCAxMTAsIDE3NywgMTY1LCA5OCwgIDE1MywgMTQzLCA4NCwgIDEzMCwgMTIyLCA3MCwKLSAgICAxMDgsIDEwMiwgNTcsICA4NSwgIDgwLCAgNDEsICA1OCwgIDU0LCAgMjAsICAxOCwgIDE2LCAgMCwgICAyMjcsIDIwOCwgOTcsCi0gICAgMjAyLCAxODUsIDg2LCAgMTc3LCAxNjQsIDc3LCAgMTUzLCAxNDIsIDY1LCAgMTMwLCAxMjIsIDU0LCAgMTA4LCAxMDEsIDQyLAotICAgIDg1LCAgODAsICAyNywgIDU4LCAgNTQsICA3LCAgIDE2LCAgMTYsICAwLCAgIDIyOCwgMjA2LCA2NiwgIDIwMiwgMTg0LCA1OCwKLSAgICAxNzgsIDE2MywgNTAsICAxNTQsIDE0MSwgNDIsICAxMzEsIDEyMSwgMzMsICAxMDksIDEwMSwgMjEsICA4NiwgIDc5LCAgNSwKLSAgICA1OCwgIDU0LCAgMCwgICAxMywgIDE2LCAgMCwgICAyMjgsIDIwNiwgMjksICAyMDIsIDE4MywgMjUsICAxNzgsIDE2MywgMjAsCi0gICAgMTU0LCAxNDEsIDE1LCAgMTMxLCAxMjEsIDUsICAgMTA4LCAxMDAsIDAsICAgODUsICA3OSwgIDAsICAgNTgsICA1MywgIDAsCi0gICAgMTMsICAxNiwgIDAsICAgMjE3LCAxOTMsIDIyMSwgMTkzLCAxNzIsIDE5OCwgMTcyLCAxNTMsIDE3OCwgMTQ5LCAxMzMsIDE1NCwKLSAgICAxMjgsIDExNCwgMTMyLCAxMDcsIDk0LCAgMTExLCA4NSwgIDc0LCAgODksICA1OSwgIDQ5LCAgNjEsICAyNSwgIDgsICAgMjIsCi0gICAgMjE5LCAxOTEsIDE5OCwgMTk1LCAxNzEsIDE3OCwgMTczLCAxNTMsIDE1OSwgMTQ5LCAxMzIsIDEzOSwgMTI4LCAxMTMsIDExOSwKLSAgICAxMDcsIDk0LCAgMTAwLCA4NSwgIDczLCAgNzksICA1OSwgIDQ4LCAgNTIsICAyNSwgIDcsICAgMTQsICAyMjEsIDE5MSwgMTgwLAotICAgIDE5NiwgMTcwLCAxNjAsIDE3NCwgMTUyLCAxNDQsIDE1MCwgMTMyLCAxMjUsIDEyOSwgMTEzLCAxMDcsIDEwNywgOTMsICA4OSwKLSAgICA4NSwgIDczLCAgNjksICA1OSwgIDQ4LCAgNDUsICAyMywgIDcsICAgNCwgICAyMjIsIDE4OSwgMTU5LCAxOTcsIDE2OSwgMTQyLAotICAgIDE3NCwgMTUxLCAxMjcsIDE1MSwgMTMxLCAxMTAsIDEyOSwgMTEyLCA5NCwgIDEwOCwgOTMsICA3OCwgIDg1LCAgNzIsICA2MCwKLSAgICA1OCwgIDQ3LCAgMzcsICAyMiwgIDcsICAgMCwgICAyMjMsIDE4OCwgMTM4LCAxOTcsIDE2OCwgMTIzLCAxNzUsIDE1MCwgMTA5LAotICAgIDE1MSwgMTMwLCA5NSwgIDEzMCwgMTExLCA4MSwgIDEwOCwgOTIsICA2NSwgIDg1LCAgNzIsICA0OSwgIDU5LCAgNDcsICAyNywKLSAgICAyMSwgIDcsICAgMCwgICAyMjQsIDE4NywgMTE4LCAxOTgsIDE2NywgMTA1LCAxNzYsIDE0OSwgOTMsICAxNTIsIDEyOSwgNzksCi0gICAgMTMwLCAxMTAsIDY4LCAgMTA4LCA5MSwgIDU0LCAgODUsICA3MSwgIDM4LCAgNTksICA0NywgIDE3LCAgMTgsICA3LCAgIDAsCi0gICAgMjI0LCAxODcsIDkzLCAgMTk5LCAxNjYsIDgzLCAgMTc2LCAxNDgsIDczLCAgMTUyLCAxMjgsIDYyLCAgMTI5LCAxMDksIDUxLAotICAgIDEwOCwgOTAsICAzOSwgIDg1LCAgNzEsICAyNSwgIDU4LCAgNDYsICAzLCAgIDE2LCAgOCwgICAwLCAgIDIyNiwgMTg2LCA2NCwKLSAgICAyMDAsIDE2NSwgNTcsICAxNzcsIDE0NywgNTAsICAxNTMsIDEyNywgNDAsICAxMzAsIDEwOCwgMzEsICAxMDgsIDkwLCAgMTksCi0gICAgODUsICA3MCwgIDMsICAgNTgsICA0NiwgIDAsICAgMTYsICA4LCAgIDAsICAgMjI3LCAxODUsIDM1LCAgMjAwLCAxNjUsIDMwLAotICAgIDE3NiwgMTQ2LCAyNSwgIDE1MiwgMTI3LCAxOCwgIDEzMCwgMTA4LCA3LCAgIDEwOCwgODksICAwLCAgIDg1LCAgNzAsICAwLAotICAgIDU3LCAgNDYsICAwLCAgIDE0LCAgOCwgICAwLCAgIDIxNiwgMTY5LCAyMDUsIDE5MiwgMTUwLCAxODQsIDE3MSwgMTM0LCAxNjQsCi0gICAgMTQ5LCAxMTYsIDE0NCwgMTI4LCA5OSwgIDEyNCwgMTA3LCA4MSwgIDEwMywgODUsICA2MywgIDgxLCAgNjAsICAzOSwgIDU1LAotICAgIDI2LCAgMCwgICAxNSwgIDIxNywgMTY4LCAxODYsIDE5MywgMTUwLCAxNjUsIDE3MiwgMTM0LCAxNDksIDE1MCwgMTE2LCAxMzAsCi0gICAgMTI4LCA5OSwgIDExMSwgMTA3LCA4MSwgIDkyLCAgODUsICA2MiwgIDcyLCAgNTksICAzOSwgIDQ3LCAgMjUsICAwLCAgIDYsCi0gICAgMjE5LCAxNjgsIDE2OCwgMTk0LCAxNDksIDE1MCwgMTczLCAxMzMsIDEzNSwgMTUwLCAxMTYsIDExNywgMTI4LCA5OCwgIDk5LAotICAgIDEwNywgODAsICA4MiwgIDg2LCAgNjIsICA2MywgIDU5LCAgMzgsICAzOSwgIDI0LCAgMCwgICAwLCAgIDIxOSwgMTY2LCAxNDgsCi0gICAgMTk1LCAxNDksIDEzMywgMTczLCAxMzMsIDExOSwgMTUwLCAxMTUsIDEwMywgMTI4LCA5OCwgIDg4LCAgMTA3LCA4MCwgIDcyLAotICAgIDg1LCAgNjEsICA1NCwgIDU5LCAgMzgsICAzMiwgIDIzLCAgMCwgICAwLCAgIDIyMCwgMTY2LCAxMjksIDE5NiwgMTQ4LCAxMTYsCi0gICAgMTc0LCAxMzIsIDEwMywgMTUxLCAxMTQsIDg5LCAgMTI5LCA5NywgIDc1LCAgMTA3LCA3OSwgIDYwLCAgODUsICA2MSwgIDQ0LAotICAgIDU5LCAgMzgsICAyMiwgIDIxLCAgMCwgICAwLCAgIDIyMiwgMTY0LCAxMTAsIDE5NywgMTQ3LCA5OSwgIDE3NSwgMTMxLCA4NywKLSAgICAxNTEsIDExMywgNzUsICAxMjksIDk2LCAgNjMsICAxMDcsIDc5LCAgNDksICA4NSwgIDYxLCAgMzMsICA1OCwgIDM4LCAgMTIsCi0gICAgMTksICAwLCAgIDAsICAgMjIyLCAxNjQsIDg4LCAgMTk3LCAxNDYsIDc5LCAgMTc0LCAxMzAsIDY5LCAgMTUxLCAxMTMsIDU4LAotICAgIDEyOSwgOTUsICA0NywgIDEwNywgNzgsICAzNSwgIDg1LCAgNjAsICAyMCwgIDU4LCAgMzgsICAwLCAgIDE4LCAgMCwgICAwLAotICAgIDIyMywgMTY0LCA2MywgIDE5OCwgMTQ1LCA1NSwgIDE3NSwgMTI5LCA0OCwgIDE1MSwgMTEyLCAzOSwgIDEyOSwgOTUsICAyOSwKLSAgICAxMDcsIDc4LCAgMTYsICA4NSwgIDYwLCAgMSwgICA1OCwgIDM4LCAgMCwgICAxNywgIDAsICAgMCwgICAyMjMsIDE2MywgMzYsCi0gICAgMTk4LCAxNDUsIDMyLCAgMTc0LCAxMjksIDI2LCAgMTUxLCAxMTEsIDE3LCAgMTI5LCA5NSwgIDcsICAgMTA3LCA3OCwgIDAsCi0gICAgODQsICA2MCwgIDAsICAgNTcsICAzNywgIDAsICAgMTUsICAwLCAgIDAsICAgMjE1LCAxNDcsIDE5MiwgMTkxLCAxMzAsIDE3MiwKLSAgICAxNzAsIDExNiwgMTUzLCAxNDgsIDEwMCwgMTMzLCAxMjcsIDg1LCAgMTE1LCAxMDcsIDY5LCAgOTYsICA4NSwgIDUxLCAgNzUsCi0gICAgNjAsICAyOCwgIDUwLCAgMjUsICAwLCAgIDgsICAgMjE3LCAxNDYsIDE3MywgMTkyLCAxMzAsIDE1NCwgMTcxLCAxMTUsIDEzOCwKLSAgICAxNDksIDEwMCwgMTIxLCAxMjgsIDg0LCAgMTAzLCAxMDcsIDY4LCAgODUsICA4NSwgIDUxLCAgNjYsICA2MCwgIDI4LCAgNDIsCi0gICAgMjUsICAwLCAgIDAsICAgMjE3LCAxNDUsIDE1NywgMTkzLCAxMjksIDE0MCwgMTczLCAxMTUsIDEyNSwgMTQ5LCAxMDAsIDEwOSwKLSAgICAxMjgsIDg0LCAgOTIsICAxMDcsIDY4LCAgNzYsICA4NSwgIDUxLCAgNTgsICA1OSwgIDI4LCAgMzUsICAyMywgIDAsICAgMCwKLSAgICAyMTgsIDE0NSwgMTQwLCAxOTMsIDEyOSwgMTI1LCAxNzIsIDExNCwgMTEwLCAxNDksIDk5LCAgOTYsICAxMjgsIDgzLCAgODEsCi0gICAgMTA3LCA2NywgIDY1LCAgODQsICA1MSwgIDQ5LCAgNTksICAyOSwgIDI3LCAgMjIsICAwLCAgIDAsICAgMjE5LCAxNDQsIDEyMSwKLSAgICAxOTQsIDEyOCwgMTA4LCAxNzIsIDExMywgOTYsICAxNDksIDk4LCAgODMsICAxMjgsIDgzLCAgNjksICAxMDcsIDY4LCAgNTUsCi0gICAgODUsICA1MCwgIDQwLCAgNTksICAyOCwgIDE4LCAgMjAsICAwLCAgIDAsICAgMjIwLCAxNDMsIDEwNCwgMTk1LCAxMjgsIDkzLAotICAgIDE3MywgMTE0LCA4MiwgIDE1MCwgOTgsICA2OSwgIDEyNywgODIsICA1OCwgIDEwNywgNjcsICA0NSwgIDg1LCAgNTAsICAzMCwKLSAgICA1OSwgIDI4LCAgNywgICAxOSwgIDAsICAgMCwgICAyMjAsIDE0MywgODQsICAxOTUsIDEyNywgNzQsICAxNzMsIDExMywgNjUsCi0gICAgMTQ5LCA5NywgIDU1LCAgMTI4LCA4MiwgIDQ0LCAgMTA2LCA2NywgIDMyLCAgODQsICA1MCwgIDE2LCAgNTgsICAyOCwgIDAsCi0gICAgMTgsICAwLCAgIDAsICAgMjIxLCAxNDIsIDYyLCAgMTk2LCAxMjYsIDUzLCAgMTczLCAxMTIsIDQ2LCAgMTUwLCA5NywgIDM3LAotICAgIDEyOCwgODIsICAyNiwgIDEwNywgNjYsICAxNCwgIDg0LCAgNTAsICAwLCAgIDU4LCAgMjgsICAwLCAgIDE2LCAgMCwgICAwLAotICAgIDIyMiwgMTQyLCAzOCwgIDE5NiwgMTI2LCAzNCwgIDE3NCwgMTEyLCAyNywgIDE1MCwgOTYsICAxNywgIDEyOCwgODIsICA2LAotICAgIDEwNiwgNjYsICAwLCAgIDg0LCAgNTAsICAwLCAgIDU3LCAgMjksICAwLCAgIDE2LCAgMCwgICAwLCAgIDIxNCwgMTIzLCAxNzksCi0gICAgMTkxLCAxMTAsIDE1OSwgMTY5LCA5OCwgIDE0MywgMTQ3LCA4NCwgIDEyNCwgMTI2LCA3MCwgIDEwNiwgMTA3LCA1NSwgIDg4LAotICAgIDg1LCAgMzksICA2OSwgIDYwLCAgMTUsICA0NSwgIDIzLCAgMCwgICAyLCAgIDIxNiwgMTIzLCAxNjEsIDE5MiwgMTEwLCAxNDQsCi0gICAgMTcwLCA5OCwgIDEyOSwgMTQ4LCA4NCwgIDExMiwgMTI3LCA3MCwgIDk1LCAgMTA3LCA1NSwgIDc5LCAgODUsICAzOSwgIDYxLAotICAgIDYwLCAgMTUsICAzNywgIDIwLCAgMCwgICAwLCAgIDIxNywgMTIyLCAxNDUsIDE5MiwgMTEwLCAxMzAsIDE3MCwgOTcsICAxMTYsCi0gICAgMTQ5LCA4NCwgIDEwMSwgMTI3LCA3MCwgIDg1LCAgMTA2LCA1NSwgIDcwLCAgODUsICAzOSwgIDUzLCAgNTksICAxNiwgIDMwLAotICAgIDE5LCAgMCwgICAwLCAgIDIxNywgMTIzLCAxMzEsIDE5MiwgMTA5LCAxMTYsIDE3MSwgOTYsICAxMDMsIDE0OSwgODMsICA4OSwKLSAgICAxMjcsIDcwLCAgNzUsICAxMDYsIDU1LCAgNjAsICA4NSwgIDQwLCAgNDUsICA1OSwgIDE2LCAgMjMsICAxNywgIDAsICAgMCwKLSAgICAyMTcsIDEyMiwgMTE0LCAxOTMsIDEwOSwgMTAxLCAxNzIsIDk2LCAgOTEsICAxNDksIDgyLCAgNzcsICAxMjgsIDY5LCAgNjQsCi0gICAgMTA2LCA1NSwgIDUwLCAgODQsICAzOSwgIDM1LCAgNTksICAxNywgIDE0LCAgMTcsICAwLCAgIDAsICAgMjE4LCAxMjIsIDk4LAotICAgIDE5NCwgMTA4LCA4NywgIDE3MSwgOTYsICA3NywgIDE0OSwgODIsICA2NSwgIDEyNywgNjksICA1MiwgIDEwNiwgNTUsICA0MCwKLSAgICA4NCwgIDQwLCAgMjUsICA1OSwgIDE4LCAgMywgICAxNSwgIDAsICAgMCwgICAyMTksIDEyMiwgODAsICAxOTMsIDEwOCwgNzAsCi0gICAgMTcyLCA5NSwgIDYxLCAgMTQ5LCA4MiwgIDUxLCAgMTI3LCA2OSwgIDQwLCAgMTA2LCA1NSwgIDI4LCAgODQsICAzOSwgIDEyLAotICAgIDU4LCAgMTcsICAwLCAgIDEzLCAgMCwgICAwLCAgIDIxOSwgMTIxLCA1OSwgIDE5NCwgMTA4LCA1MiwgIDE3MiwgOTYsICA0NCwKLSAgICAxNDksIDgyLCAgMzUsICAxMjcsIDY4LCAgMjQsICAxMDYsIDU1LCAgMTEsICA4NCwgIDQwLCAgMCwgICA1NywgIDE4LCAgMCwKLSAgICAxMywgIDAsICAgMCwgICAyMTksIDEyMSwgNDAsICAxOTMsIDEwOCwgMzMsICAxNzIsIDk1LCAgMjYsICAxNDksIDgxLCAgMTksCi0gICAgMTI4LCA2OCwgIDYsICAgMTA2LCA1NCwgIDAsICAgODQsICAzOSwgIDAsICAgNTcsICAxOCwgIDAsICAgMTMsICAwLCAgIDAsCi0gICAgMjEzLCA5OSwgIDE2NSwgMTg5LCA4NywgIDE0OCwgMTY5LCA3NiwgIDEzMiwgMTQ3LCA2NCwgIDExNSwgMTI2LCA1MiwgIDk4LAotICAgIDEwNiwgMzksICA4MSwgIDg1LCAgMjMsICA2MywgIDYwLCAgMCwgICAzOSwgIDE2LCAgMCwgICAwLCAgIDIxNCwgOTgsICAxNDksCi0gICAgMTkxLCA4NywgIDEzMywgMTcwLCA3NiwgIDExOSwgMTQ4LCA2NSwgIDEwMywgMTI3LCA1MywgIDg4LCAgMTA2LCAzOSwgIDcyLAotICAgIDg1LCAgMjQsICA1NSwgIDYwLCAgMCwgICAzMiwgIDE1LCAgMCwgICAwLCAgIDIxNSwgOTksICAxMzYsIDE5MSwgODcsICAxMjEsCi0gICAgMTcwLCA3NywgIDEwOCwgMTQ4LCA2NSwgIDkzLCAgMTI2LCA1MywgIDc5LCAgMTA2LCA0MCwgIDY0LCAgODUsICAyNCwgIDQ3LAotICAgIDU5LCAgMCwgICAyNSwgIDE0LCAgMCwgICAwLCAgIDIxNSwgOTksICAxMjEsIDE5MiwgODcsICAxMDgsIDE3MCwgNzcsICA5NiwKLSAgICAxNDgsIDY1LCAgODIsICAxMjYsIDUzLCAgNjksICAxMDYsIDQwLCAgNTUsICA4NSwgIDI1LCAgMzksICA1OSwgIDAsICAgMTgsCi0gICAgMTMsICAwLCAgIDAsICAgMjE2LCA5OSwgIDEwNiwgMTkxLCA4NywgIDk1LCAgMTcwLCA3NiwgIDgzLCAgMTQ4LCA2NSwgIDcxLAotICAgIDEyNiwgNTMsICA1OCwgIDEwNiwgNDEsICA0NSwgIDg1LCAgMjYsICAzMCwgIDU5LCAgMCwgICA4LCAgIDExLCAgMCwgICAwLAotICAgIDIxNiwgOTgsICA5MSwgIDE5MiwgODgsICA4MiwgIDE3MCwgNzcsICA3MSwgIDE0OCwgNjUsICA2MCwgIDEyNywgNTMsICA0OCwKLSAgICAxMDUsIDQxLCAgMzYsICA4MywgIDI2LCAgMjEsICA1OCwgIDEsICAgMiwgICAxMSwgIDAsICAgMCwgICAyMTcsIDk5LCAgNzUsCi0gICAgMTkyLCA4NywgIDY2LCAgMTcwLCA3NiwgIDU3LCAgMTQ4LCA2NSwgIDQ3LCAgMTI2LCA1MywgIDM2LCAgMTA1LCA0MSwgIDI0LAotICAgIDgzLCAgMjYsICA4LCAgIDU3LCAgMiwgICAwLCAgIDksICAgMCwgICAwLCAgIDIxNywgOTgsICA1NywgIDE5MiwgODcsICA0OSwKLSAgICAxNzEsIDc3LCAgNDEsICAxNDcsIDY1LCAgMzIsICAxMjYsIDUzLCAgMjEsICAxMDUsIDQxLCAgOCwgICA4NCwgIDI3LCAgMCwKLSAgICA1NywgIDMsICAgMCwgICA5LCAgIDAsICAgMCwgICAyMTcsIDk4LCAgNDAsICAxOTMsIDg3LCAgMzQsICAxNzEsIDc2LCAgMjcsCi0gICAgMTQ4LCA2NSwgIDE5LCAgMTI2LCA1MywgIDYsICAgMTA1LCA0MSwgIDAsICAgODMsICAyNywgIDAsICAgNTcsICA0LCAgIDAsCi0gICAgOSwgICAwLCAgIDAsICAgMjExLCA2NywgIDE1MiwgMTg5LCA1OCwgIDEzNiwgMTY4LCA1MCwgIDEyMiwgMTQ3LCAzOSwgIDEwNSwKLSAgICAxMjcsIDI4LCAgODksICAxMDYsIDE0LCAgNzQsICA4NSwgIDAsICAgNTYsICA1OSwgIDAsICAgMzMsICA5LCAgIDAsICAgMCwKLSAgICAyMTMsIDY4LCAgMTM4LCAxOTAsIDU5LCAgMTIzLCAxNjksIDUxLCAgMTA5LCAxNDgsIDQwLCAgOTUsICAxMjYsIDMwLCAgODAsCi0gICAgMTA2LCAxNiwgIDY1LCAgODUsICAwLCAgIDQ4LCAgNTksICAwLCAgIDI3LCAgOSwgICAwLCAgIDAsICAgMjE0LCA2OSwgIDEyNSwKLSAgICAxOTAsIDU5LCAgMTExLCAxNjgsIDUxLCAgOTksICAxNDgsIDQxLCAgODYsICAxMjYsIDMxLCAgNzIsICAxMDYsIDE4LCAgNTgsCi0gICAgODUsICAwLCAgIDQxLCAgNTksICAwLCAgIDIwLCAgNywgICAwLCAgIDAsICAgMjE1LCA3MCwgIDExMiwgMTkwLCA2MSwgIDEwMCwKLSAgICAxNjksIDUyLCAgODgsICAxNDcsIDQyLCAgNzYsICAxMjYsIDMyLCAgNjMsICAxMDYsIDE5LCAgNDksICA4NCwgIDEsICAgMzQsCi0gICAgNTgsICAwLCAgIDEzLCAgNywgICAwLCAgIDAsICAgMjE0LCA3MCwgIDk5LCAgMTkwLCA2MiwgIDg4LCAgMTY5LCA1MywgIDc3LAotICAgIDE0NywgNDMsICA2NSwgIDEyNSwgMzIsICA1MywgIDEwNiwgMjAsICA0MCwgIDg0LCAgMywgICAyNiwgIDU4LCAgMCwgICA0LAotICAgIDcsICAgMCwgICAwLCAgIDIxNCwgNzEsICA4NiwgIDE5MCwgNjEsICA3NSwgIDE2OSwgNTMsICA2NSwgIDE0NiwgNDMsICA1NCwKLSAgICAxMjYsIDMzLCAgNDQsICAxMDUsIDIxLCAgMzEsICA4MywgIDQsICAgMTcsICA1NywgIDAsICAgMCwgICA3LCAgIDAsICAgMCwKLSAgICAyMTUsIDcxLCAgNzEsICAxOTEsIDYyLCAgNjIsICAxNjksIDUzLCAgNTMsICAxNDcsIDQ0LCAgNDQsICAxMjYsIDM0LCAgMzMsCi0gICAgMTA1LCAyMiwgIDIwLCAgODMsICA1LCAgIDQsICAgNTcsICAwLCAgIDAsICAgNywgICAwLCAgIDAsICAgMjE1LCA3MSwgIDU0LAotICAgIDE5MSwgNjIsICA0NywgIDE2OSwgNTQsICAzOSwgIDE0NywgNDQsICAzMCwgIDEyNiwgMzUsICAyMCwgIDEwNSwgMjMsICA2LAotICAgIDgzLCAgNiwgICAwLCAgIDU2LCAgMCwgICAwLCAgIDUsICAgMCwgICAwLCAgIDIxNSwgNzEsICA0MSwgIDE5MSwgNjMsICAzNCwKLSAgICAxNzAsIDU0LCAgMjcsICAxNDcsIDQ1LCAgMTcsICAxMjYsIDM1LCAgNiwgICAxMDUsIDIzLCAgMCwgICA4MywgIDgsICAgMCwKLSAgICA1NiwgIDAsICAgMCwgICA1LCAgIDAsICAgMCwgICAyMTAsIDEzLCAgMTQwLCAxODksIDEsICAgMTI1LCAxNjcsIDAsICAgMTEwLAotICAgIDE0NiwgMCwgICA5NiwgIDEyNiwgMCwgICA4MSwgIDEwNiwgMCwgICA2NywgIDg1LCAgMCwgICA1MSwgIDU5LCAgMCwgICAyOCwKLSAgICA0LCAgIDAsICAgMCwgICAyMTIsIDE4LCAgMTI2LCAxOTAsIDcsICAgMTEzLCAxNjgsIDAsICAgMTAwLCAxNDYsIDAsICAgODYsCi0gICAgMTI2LCAwLCAgIDczLCAgMTA2LCAwLCAgIDU5LCAgODQsICAwLCAgIDQzLCAgNTksICAwLCAgIDIyLCAgNCwgICAwLCAgIDAsCi0gICAgMjEyLCAyMSwgIDExNSwgMTkwLCAxMywgIDEwMywgMTY4LCAzLCAgIDkxLCAgMTQ2LCAwLCAgIDc4LCAgMTI1LCAwLCAgIDY1LAotICAgIDEwNSwgMCwgICA1MiwgIDg0LCAgMCwgICAzNiwgIDU4LCAgMCwgICAxNiwgIDQsICAgMCwgICAwLCAgIDIxMywgMjQsICAxMDMsCi0gICAgMTg5LCAxOSwgIDkxLCAgMTY4LCA5LCAgIDgyLCAgMTQ2LCAwLCAgIDY5LCAgMTI1LCAwLCAgIDU3LCAgMTA1LCAwLCAgIDQ0LAotICAgIDg0LCAgMCwgICAyOSwgIDU4LCAgMCwgICA3LCAgIDQsICAgMCwgICAwLCAgIDIxMywgMjcsICA5MiwgIDE4OCwgMjEsICA4MSwKLSAgICAxNjgsIDE0LCAgNzEsICAxNDYsIDEsICAgNTksICAxMjUsIDAsICAgNDgsICAxMDUsIDAsICAgMzYsICA4NCwgIDAsICAgMjEsCi0gICAgNTgsICAwLCAgIDQsICAgNCwgICAwLCAgIDAsICAgMjEzLCAzMCwgIDgwLCAgMTg5LCAyMiwgIDY5LCAgMTY4LCAxNywgIDYxLAotICAgIDE0NiwgNSwgICA1MCwgIDEyNSwgMCwgICAzOSwgIDEwNCwgMCwgICAyNywgIDgzLCAgMCwgICAxMiwgIDU3LCAgMCwgICAwLAotICAgIDQsICAgMCwgICAwLCAgIDIxNCwgMzAsICA2NywgIDE4OSwgMjUsICA1NywgIDE2OCwgMjAsICA1MCwgIDE0NiwgOSwgICA0MCwKLSAgICAxMjUsIDAsICAgMjksICAxMDQsIDAsICAgMTcsICA4MywgIDAsICAgMiwgICA1NiwgIDAsICAgMCwgICA0LCAgIDAsICAgMCwKLSAgICAyMTQsIDMyLCAgNTMsICAxODksIDI3LCAgNDQsICAxNjksIDIwLCAgMzgsICAxNDYsIDEzLCAgMjgsICAxMjQsIDIsICAgMTcsCi0gICAgMTA0LCAwLCAgIDQsICAgODMsICAwLCAgIDAsICAgNTYsICAwLCAgIDAsICAgNCwgICAwLCAgIDAsICAgMjE0LCAzMywgIDQxLAotICAgIDE5MCwgMjcsICAzMywgIDE2OCwgMjMsICAyNywgIDE0NiwgMTMsICAxOCwgIDEyNSwgMywgICA1LCAgIDEwNSwgMCwgICAwLAotICAgIDgzLCAgMCwgICAwLCAgIDU2LCAgMCwgICAwLCAgIDQsICAgMCwgICAwLCAgIDE4NSwgMjI5LCAyNTAsIDE2NCwgMjA0LCAyMjMsCi0gICAgMTQ2LCAxODIsIDE5OSwgMTI3LCAxNTgsIDE3NCwgMTA4LCAxMzYsIDE0OSwgODksICAxMTMsIDEyNSwgNzAsICA5MCwgIDEwMCwKLSAgICA0NiwgIDYyLCAgNzEsICAxMCwgIDI1LCAgMzMsICAxODksIDIyNywgMjI1LCAxNjgsIDIwMiwgMjAxLCAxNDgsIDE4MSwgMTc5LAotICAgIDEyOSwgMTU3LCAxNTYsIDEwOSwgMTM1LCAxMzQsIDkwLCAgMTEzLCAxMTMsIDcwLCAgODksICA5MCwgIDQ2LCAgNjIsICA2MiwKLSAgICA4LCAgIDI0LCAgMjUsICAxOTIsIDIyNiwgMjAyLCAxNzAsIDIwMiwgMTgyLCAxNTEsIDE3OSwgMTYyLCAxMzAsIDE1NiwgMTQxLAotICAgIDExMCwgMTMzLCAxMjEsIDkxLCAgMTEyLCAxMDEsIDcxLCAgODksICA4MCwgIDQ2LCAgNjEsICA1NCwgIDcsICAgMjQsICAxOSwKLSAgICAxOTQsIDIyNCwgMTc5LCAxNzMsIDIwMCwgMTYwLCAxNTMsIDE3OCwgMTQ0LCAxMzIsIDE1NSwgMTI1LCAxMTIsIDEzMywgMTA3LAotICAgIDkyLCAgMTExLCA4OSwgIDcxLCAgODgsICA2OSwgIDQ2LCAgNjEsICA0NSwgIDYsICAgMjMsICAxMCwgIDE5NiwgMjIzLCAxNTUsCi0gICAgMTc0LCAxOTgsIDEzOSwgMTU0LCAxNzYsIDEyNCwgMTMyLCAxNTMsIDEwNywgMTEzLCAxMzEsIDkxLCAgOTIsICAxMTAsIDc1LAotICAgIDcyLCAgODcsICA1OCwgIDQ3LCAgNjAsICAzNywgIDQsICAgMjMsICAwLCAgIDE5OCwgMjIxLCAxMzEsIDE3NSwgMTk3LCAxMTcsCi0gICAgMTU1LCAxNzUsIDEwNSwgMTMzLCAxNTIsIDkxLCAgMTEzLCAxMzAsIDc2LCAgOTIsICAxMDksIDYzLCAgNzIsICA4NiwgIDQ3LAotICAgIDQ2LCAgNjAsICAyNiwgIDMsICAgMjMsICAwLCAgIDIwMCwgMjIwLCAxMDQsIDE3NiwgMTk2LCA5NCwgIDE1NiwgMTc1LCA4NCwKLSAgICAxMzQsIDE1MSwgNzIsICAxMTMsIDEyOSwgNTksICA5MywgIDEwOCwgNDcsICA3MiwgIDg1LCAgMzMsICA0NiwgIDU5LCAgMTMsCi0gICAgMCwgICAyMywgIDAsICAgMjAxLCAyMTksIDczLCAgMTc5LCAxOTUsIDY1LCAgMTU3LCAxNzMsIDU3LCAgMTM1LCAxNTAsIDQ4LAotICAgIDExNCwgMTI5LCAzOSwgIDk0LCAgMTA4LCAyOCwgIDcyLCAgODUsICAxNSwgIDQ3LCAgNTksICAwLCAgIDAsICAgMjIsICAwLAotICAgIDIwMywgMjE5LCA0MiwgIDE3OCwgMTk1LCAzNywgIDE1NywgMTczLCAzMiwgIDEzNSwgMTUwLCAyNiwgIDExNCwgMTI4LCAxNiwKLSAgICA5NCwgIDEwNywgNiwgICA3MywgIDg1LCAgMCwgICA0NiwgIDU4LCAgMCwgICAwLCAgIDIyLCAgMCwgICAxODYsIDIwNSwgMjMzLAotICAgIDE2NSwgMTgzLCAyMDksIDE0OCwgMTYzLCAxODcsIDEyOCwgMTQyLCAxNjMsIDEwOSwgMTIxLCAxNDAsIDkxLCAgMTAxLCAxMTgsCi0gICAgNzEsICA4MCwgIDk0LCAgNDgsICA1NCwgIDY2LCAgMTIsICAxNSwgIDI3LCAgMTg5LCAyMDQsIDIxMSwgMTY5LCAxODIsIDE4OSwKLSAgICAxNTEsIDE2MywgMTY5LCAxMzEsIDE0MSwgMTQ3LCAxMTEsIDEyMSwgMTI2LCA5MiwgIDEwMSwgMTA1LCA3MiwgIDc5LCAgODQsCi0gICAgNDgsICA1NCwgIDU4LCAgMTEsICAxNSwgIDE5LCAgMTkyLCAyMDIsIDE5MCwgMTcxLCAxODEsIDE3MCwgMTUyLCAxNjEsIDE1MiwKLSAgICAxMzEsIDE0MSwgMTMzLCAxMTIsIDEyMCwgMTEzLCA5MywgIDEwMCwgOTQsICA3MiwgIDc5LCAgNzQsICA0OCwgIDUzLCAgNTAsCi0gICAgMTAsICAxNSwgIDExLCAgMTk1LCAyMDEsIDE2OSwgMTcyLCAxNzksIDE1MSwgMTUzLCAxNjAsIDEzNSwgMTMyLCAxMzksIDExNywKLSAgICAxMTMsIDExOSwgMTAwLCA5MywgIDk5LCAgODIsICA3MiwgIDc4LCAgNjQsICA0OCwgIDUzLCAgNDEsICA5LCAgIDE0LCAgMywKLSAgICAxOTUsIDIwMCwgMTQ2LCAxNzQsIDE3OSwgMTMxLCAxNTQsIDE1OSwgMTE3LCAxMzMsIDEzOCwgMTAxLCAxMTMsIDExOCwgODYsCi0gICAgOTMsICA5OCwgIDcwLCAgNzMsICA3NywgIDUzLCAgNDgsICA1MiwgIDMyLCAgOCwgICAxNSwgIDAsICAgMTk4LCAxOTksIDEyNSwKLSAgICAxNzUsIDE3NywgMTExLCAxNTUsIDE1OCwgMTAwLCAxMzMsIDEzNywgODUsICAxMTMsIDExNywgNzEsICA5MywgIDk3LCAgNTcsCi0gICAgNzIsICA3NywgIDQyLCAgNDcsICA1MiwgIDIyLCAgNSwgICAxNCwgIDAsICAgMTk5LCAxOTgsIDEwMSwgMTc2LCAxNzcsIDg5LAotICAgIDE1NSwgMTU3LCA3OSwgIDEzNCwgMTM2LCA2OCwgIDExMywgMTE2LCA1NiwgIDk0LCAgOTcsICA0NCwgIDczLCAgNzYsICAzMCwKLSAgICA0NywgIDUyLCAgMTAsICAyLCAgIDE1LCAgMCwgICAyMDAsIDE5NywgNzIsICAxNzgsIDE3NiwgNjMsICAxNTcsIDE1NiwgNTYsCi0gICAgMTM1LCAxMzYsIDQ2LCAgMTE0LCAxMTYsIDM3LCAgOTQsICA5NiwgIDI2LCAgNzMsICA3NiwgIDExLCAgNDcsICA1MSwgIDAsCi0gICAgMCwgICAxNCwgIDAsICAgMjAxLCAxOTcsIDQ1LCAgMTc3LCAxNzUsIDM4LCAgMTU2LCAxNTUsIDMxLCAgMTM1LCAxMzUsIDI1LAotICAgIDExNCwgMTE1LCAxNywgIDk0LCAgOTYsICA1LCAgIDczLCAgNzUsICAwLCAgIDQ2LCAgNTEsICAwLCAgIDAsICAgMTQsICAwLAotICAgIDE4NywgMTgzLCAyMTgsIDE2NywgMTY1LCAxOTcsIDE0OSwgMTQ3LCAxNzYsIDEyOSwgMTI3LCAxNTMsIDExMSwgMTA5LCAxMzIsCi0gICAgOTIsICA5MCwgIDExMSwgNzMsICA3MCwgIDg5LCAgNDksICA0NiwgIDYyLCAgMTUsICA0LCAgIDIyLCAgMTkwLCAxODMsIDE5NywKLSAgICAxNzAsIDE2NCwgMTc3LCAxNTEsIDE0NiwgMTU5LCAxMzAsIDEyNywgMTM5LCAxMTIsIDEwOSwgMTE5LCA5MywgIDkwLCAgOTksCi0gICAgNzIsICA3MCwgIDc4LCAgNDksICA0NSwgIDUzLCAgMTQsICA0LCAgIDE1LCAgMTkyLCAxODIsIDE3OSwgMTcxLCAxNjMsIDE2MSwKLSAgICAxNTMsIDE0NSwgMTQ0LCAxMzIsIDEyNiwgMTI1LCAxMTMsIDEwOCwgMTA3LCA5MywgIDg5LCAgODgsICA3MywgIDcwLCAgNjksCi0gICAgNDksICA0NSwgIDQ1LCAgMTMsICA1LCAgIDYsICAgMTk1LCAxODEsIDE1OSwgMTcyLCAxNjIsIDE0MiwgMTUyLCAxNDUsIDEyNywKLSAgICAxMzIsIDEyNSwgMTExLCAxMTMsIDEwNywgOTQsICA5MywgIDg4LCAgNzcsICA3MywgIDY5LCAgNTksICA0OCwgIDQ1LCAgMzcsCi0gICAgMTEsICA1LCAgIDAsICAgMTk1LCAxODAsIDEzOSwgMTczLCAxNjEsIDEyNCwgMTUzLCAxNDMsIDExMCwgMTMzLCAxMjUsIDk2LAotICAgIDExMywgMTA2LCA4MSwgIDk0LCAgODgsICA2NiwgIDczLCAgNjgsICA0OSwgIDQ5LCAgNDQsICAyOCwgIDksICAgNiwgICAwLAotICAgIDE5NiwgMTc5LCAxMTgsIDE3NCwgMTYwLCAxMDYsIDE1NCwgMTQyLCA5NCwgIDEzMywgMTI0LCA4MSwgIDExMywgMTA1LCA2OCwKLSAgICA5NCwgIDg3LCAgNTQsICA3MywgIDY4LCAgMzksICA0OCwgIDQ0LCAgMTgsICA1LCAgIDUsICAgMCwgICAxOTcsIDE3OCwgOTYsCi0gICAgMTc2LCAxNTksIDg2LCAgMTU1LCAxNDEsIDc1LCAgMTM0LCAxMjMsIDY0LCAgMTE0LCAxMDUsIDUzLCAgOTQsICA4NywgIDQwLAotICAgIDczLCAgNjgsICAyNiwgIDQ4LCAgNDQsICA1LCAgIDIsICAgNiwgICAwLCAgIDE5OSwgMTc4LCA3MCwgIDE3NiwgMTU4LCA2MiwKLSAgICAxNTYsIDE0MSwgNTQsICAxMzQsIDEyMiwgNDQsICAxMTQsIDEwNCwgMzUsICA5NCwgIDg2LCAgMjMsICA3MywgIDY3LCAgOCwKLSAgICA0NywgIDQ0LCAgMCwgICAyLCAgIDYsICAgMCwgICAxOTksIDE3NywgNDUsICAxNzgsIDE1OCwgNDAsICAxNTYsIDE0MCwgMzIsCi0gICAgMTM1LCAxMjIsIDI2LCAgMTE0LCAxMDQsIDE2LCAgOTQsICA4NiwgIDQsICAgNzMsICA2NywgIDAsICAgNDcsICA0NCwgIDAsCi0gICAgMCwgICA3LCAgIDAsICAgMTg4LCAxNjEsIDIwNCwgMTY4LCAxNDQsIDE4MywgMTQ5LCAxMjksIDE2NCwgMTMwLCAxMTIsIDE0NCwKLSAgICAxMTIsIDk1LCAgMTIzLCA5MywgIDc4LCAgMTAzLCA3NCwgIDYwLCAgODEsICA1MCwgIDM2LCAgNTYsICAxNiwgIDAsICAgMTYsCi0gICAgMTkwLCAxNjAsIDE4NSwgMTcwLCAxNDQsIDE2NSwgMTUxLCAxMjgsIDE0OCwgMTMyLCAxMTEsIDEzMCwgMTEyLCA5NSwgIDExMCwKLSAgICA5MywgIDc4LCAgOTIsICA3NCwgIDU5LCAgNzIsICA1MCwgIDM2LCAgNDgsICAxNiwgIDAsICAgOCwgICAxOTIsIDE2MCwgMTY3LAotICAgIDE3MSwgMTQzLCAxNTAsIDE1MywgMTI4LCAxMzQsIDEzMiwgMTExLCAxMTcsIDExMiwgOTQsICAxMDAsIDk0LCAgNzcsICA4MiwKLSAgICA3NCwgIDU5LCAgNjMsICA1MCwgIDM2LCAgNDAsICAxNCwgIDAsICAgMCwgICAxOTMsIDE1OSwgMTQ5LCAxNzIsIDE0MywgMTM0LAotICAgIDE1MywgMTI3LCAxMTksIDEzMywgMTEwLCAxMDMsIDExMywgOTQsICA4NywgIDkzLCAgNzcsICA3MiwgIDczLCAgNTksICA1NCwKLSAgICA1MCwgIDM2LCAgMzIsICAxMiwgIDAsICAgMCwgICAxOTUsIDE1OSwgMTMxLCAxNzMsIDE0MiwgMTE3LCAxNTMsIDEyNywgMTA0LAotICAgIDEzMiwgMTEwLCA5MCwgIDExMywgOTMsICA3NiwgIDkzLCAgNzYsICA2MSwgIDc0LCAgNTksICA0NSwgIDQ5LCAgMzYsICAyMywKLSAgICA5LCAgIDAsICAgMCwgICAxOTYsIDE1OCwgMTEzLCAxNzQsIDE0MSwgMTAxLCAxNTUsIDEyNiwgODksICAxMzMsIDEwOSwgNzYsCi0gICAgMTEzLCA5MywgIDY0LCAgOTQsICA3NiwgIDUxLCAgNzQsICA1OCwgIDM1LCAgNDksICAzNiwgIDE0LCAgNiwgICAwLCAgIDAsCi0gICAgMTk3LCAxNTcsIDkyLCAgMTc0LCAxNDEsIDgwLCAgMTU0LCAxMjUsIDcxLCAgMTM0LCAxMDgsIDYwLCAgMTE0LCA5MiwgIDUwLAotICAgIDk0LCAgNzUsICAzNywgIDczLCAgNTgsICAyMiwgIDQ4LCAgMzYsICAxLCAgIDUsICAgMCwgICAwLCAgIDE5NywgMTU3LCA2OCwKLSAgICAxNzUsIDE0MCwgNTksICAxNTUsIDEyNCwgNTEsICAxMzQsIDEwOCwgNDEsICAxMTMsIDkxLCAgMzIsICA5NCwgIDc1LCAgMjEsCi0gICAgNzMsICA1NywgIDUsICAgNDgsICAzNSwgIDAsICAgNSwgICAwLCAgIDAsICAgMTk4LCAxNTYsIDQ2LCAgMTc2LCAxNDAsIDQwLAotICAgIDE1NSwgMTI0LCAzMiwgIDEzNCwgMTA3LCAyNCwgIDExNCwgOTEsICAxNCwgIDk0LCAgNzUsICAyLCAgIDczLCAgNTcsICAwLAotICAgIDQ4LCAgMzYsICAwLCAgIDMsICAgMCwgICAwLCAgIDE4OSwgMTQwLCAxOTEsIDE2OCwgMTI2LCAxNzIsIDE1MCwgMTEyLCAxNTQsCi0gICAgMTMxLCA5NywgIDEzNCwgMTEyLCA4MiwgIDExNSwgOTQsICA2NiwgIDk2LCAgNzQsICA0OSwgIDc1LCAgNTEsICAyNSwgIDUwLAotICAgIDEyLCAgMCwgICAxMCwgIDE5MSwgMTM5LCAxNzMsIDE3MCwgMTI1LCAxNTQsIDE1MiwgMTExLCAxMzgsIDEzMiwgOTYsICAxMjEsCi0gICAgMTEzLCA4MSwgIDEwMywgOTQsICA2NiwgIDg1LCAgNzQsICA0OCwgIDY2LCAgNTAsICAyNiwgIDQyLCAgMTIsICAwLCAgIDEsCi0gICAgMTkyLCAxMzksIDE1NywgMTcxLCAxMjUsIDE0MCwgMTUyLCAxMTEsIDEyNSwgMTMyLCA5NiwgIDEwOSwgMTEzLCA4MSwgIDkyLAotICAgIDk0LCAgNjUsICA3NiwgIDc0LCAgNDgsICA1OCwgIDUwLCAgMjYsICAzNSwgIDksICAgMCwgICAwLCAgIDE5MywgMTM5LCAxNDAsCi0gICAgMTcyLCAxMjQsIDEyNSwgMTUzLCAxMTAsIDExMiwgMTMzLCA5NSwgIDk2LCAgMTEzLCA4MCwgIDgyLCAgOTQsICA2NSwgIDY2LAotICAgIDc0LCAgNDksICA1MCwgIDUwLCAgMjYsICAyOCwgIDcsICAgMCwgICAwLCAgIDE5NCwgMTM4LCAxMjMsIDE3MiwgMTIzLCAxMDksCi0gICAgMTUzLCAxMTAsIDk3LCAgMTMzLCA5NSwgIDg0LCAgMTEzLCA4MCwgIDcwLCAgOTQsICA2NSwgIDU2LCAgNzQsICA0OCwgIDQwLAotICAgIDUwLCAgMjYsICAyMCwgIDYsICAgMCwgICAwLCAgIDE5NCwgMTM4LCAxMDUsIDE3MywgMTIzLCA5NCwgIDE1MywgMTA5LCA4MywKLSAgICAxMzMsIDk0LCAgNzAsICAxMTIsIDc5LCAgNTksICA5NCwgIDY0LCAgNDYsICA3NCwgIDQ4LCAgMzEsICA1MCwgIDI2LCAgOSwKLSAgICA0LCAgIDAsICAgMCwgICAxOTYsIDEzOCwgODcsICAxNzQsIDEyMiwgNzcsICAxNTMsIDEwOSwgNjcsICAxMzMsIDkzLCAgNTYsCi0gICAgMTEzLCA3OSwgIDQ2LCAgOTQsICA2NCwgIDM0LCAgNzMsICA0OCwgIDE4LCAgNDksICAyNywgIDAsICAgNCwgICAwLCAgIDAsCi0gICAgMTk2LCAxMzcsIDY1LCAgMTc0LCAxMjIsIDU3LCAgMTU0LCAxMDgsIDQ5LCAgMTMzLCA5MywgIDM5LCAgMTEzLCA3OSwgIDI5LAotICAgIDk0LCAgNjQsICAxOCwgIDc0LCAgNDgsICAzLCAgIDQ5LCAgMjcsICAwLCAgIDIsICAgMCwgICAwLCAgIDE5NywgMTM3LCA0NywKLSAgICAxNzUsIDEyMiwgNDAsICAxNTUsIDEwOCwgMzIsICAxMzMsIDkzLCAgMjMsICAxMTQsIDc5LCAgMTQsICA5NCwgIDY0LCAgMSwKLSAgICA3MywgIDQ4LCAgMCwgICA0OCwgIDI3LCAgMCwgICAyLCAgIDAsICAgMCwgICAxODksIDExOSwgMTc3LCAxNjgsIDEwNiwgMTU5LAotICAgIDE1MCwgOTQsICAxNDIsIDEzMSwgODEsICAxMjQsIDExMywgNjcsICAxMDcsIDk0LCAgNTMsICA4OSwgIDc0LCAgMzcsICA2OSwKLSAgICA1MSwgIDExLCAgNDUsICA2LCAgIDAsICAgMywgICAxOTEsIDExOSwgMTYxLCAxNzAsIDEwNiwgMTQ0LCAxNTIsIDk0LCAgMTI5LAotICAgIDEzMiwgODEsICAxMTIsIDExMywgNjcsICA5NiwgIDk0LCAgNTMsICA3OSwgIDc0LCAgMzcsICA2MSwgIDUxLCAgMTMsICAzOCwKLSAgICA2LCAgIDAsICAgMCwgICAxOTIsIDExOSwgMTQ2LCAxNzAsIDEwNiwgMTMxLCAxNTIsIDk0LCAgMTE3LCAxMzIsIDgwLCAgMTAxLAotICAgIDExMiwgNjcsICA4NSwgIDk0LCAgNTMsICA3MCwgIDc0LCAgMzcsICA1MywgIDUwLCAgMTQsICAzMSwgIDQsICAgMCwgICAwLAotICAgIDE5MiwgMTE5LCAxMzEsIDE3MSwgMTA2LCAxMTcsIDE1MywgOTQsICAxMDUsIDEzMiwgODAsICA4OSwgIDExMywgNjcsICA3NSwKLSAgICA5NCwgIDU0LCAgNjEsICA3NCwgIDM4LCAgNDUsICA1MSwgIDE0LCAgMjMsICAzLCAgIDAsICAgMCwgICAxOTMsIDExOCwgMTE0LAotICAgIDE3MSwgMTA2LCAxMDIsIDE1MywgOTMsICA5MCwgIDEzMiwgODAsICA3OCwgIDExMywgNjcsICA2NSwgIDk0LCAgNTMsICA1MiwKLSAgICA3NCwgIDM3LCAgMzYsICA1MCwgIDE1LCAgMTYsICAxLCAgIDAsICAgMCwgICAxOTQsIDExOCwgOTksICAxNzIsIDEwNSwgODksCi0gICAgMTUzLCA5MywgIDc4LCAgMTMyLCA4MCwgIDY2LCAgMTEzLCA2NywgIDU0LCAgOTQsICA1MywgIDQyLCAgNzQsICAzOCwgIDI3LAotICAgIDUwLCAgMTYsICA1LCAgIDEsICAgMCwgICAwLCAgIDE5NCwgMTE4LCA4MiwgIDE3MywgMTA1LCA3MiwgIDE1MywgOTMsICA2MywKLSAgICAxMzIsIDc5LCAgNTMsICAxMTMsIDY3LCAgNDIsICA5NCwgIDUzLCAgMzAsICA3NCwgIDM4LCAgMTUsICA0OSwgIDE2LCAgMCwKLSAgICAwLCAgIDAsICAgMCwgICAxOTUsIDExNywgNjMsICAxNzMsIDEwNSwgNTUsICAxNTQsIDkzLCAgNDcsICAxMzMsIDc5LCAgMzcsCi0gICAgMTEzLCA2NiwgIDI3LCAgOTQsICA1MywgIDE1LCAgNzMsICAzOCwgIDAsICAgNDgsICAxNiwgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgMTk1LCAxMTcsIDQ2LCAgMTczLCAxMDQsIDM5LCAgMTU0LCA5MiwgIDMyLCAgMTMzLCA3OSwgIDIyLCAgMTEzLCA2NiwgIDEzLAotICAgIDk0LCAgNTMsICAwLCAgIDczLCAgMzgsICAwLCAgIDQ4LCAgMTcsICAwLCAgIDAsICAgMCwgICAwLCAgIDE4OSwgOTYsICAxNjYsCi0gICAgMTY4LCA4NSwgIDE0NywgMTUwLCA3NCwgIDEzMiwgMTMxLCA2MiwgIDExNSwgMTEzLCA1MSwgIDk5LCAgOTQsICAzOCwgIDgyLAotICAgIDc0LCAgMjEsICA2MywgIDUxLCAgMCwgICA0MCwgIDEsICAgMCwgICAwLCAgIDE5MCwgOTYsICAxNTAsIDE3MCwgODUsICAxMzMsCi0gICAgMTUyLCA3NSwgIDExOSwgMTMyLCA2MywgIDEwNCwgMTEzLCA1MSwgIDg4LCAgOTQsICAzOCwgIDcyLCAgNzUsICAyMiwgIDU1LAotICAgIDUxLCAgMCwgICAzMywgIDEsICAgMCwgICAwLCAgIDE5MiwgOTYsICAxMzcsIDE3MCwgODUsICAxMjEsIDE1MiwgNzQsICAxMDgsCi0gICAgMTMyLCA2NCwgIDk0LCAgMTEzLCA1MiwgIDc5LCAgOTQsICAzOSwgIDY0LCAgNzQsICAyMywgIDQ4LCAgNTAsICAwLCAgIDI2LAotICAgIDAsICAgMCwgICAwLCAgIDE5MiwgOTYsICAxMjIsIDE3MSwgODYsICAxMDksIDE1MiwgNzUsICA5NiwgIDEzMiwgNjMsICA4MywKLSAgICAxMTMsIDUyLCAgNjksICA5NCwgIDM5LCAgNTYsICA3NCwgIDI0LCAgNDEsICA1MCwgIDAsICAgMTksICAwLCAgIDAsICAgMCwKLSAgICAxOTMsIDk2LCAgMTA3LCAxNzEsIDg1LCAgOTYsICAxNTIsIDc1LCAgODQsICAxMzIsIDY0LCAgNzIsICAxMTMsIDUyLCAgNjAsCi0gICAgOTQsICAzOSwgIDQ3LCAgNzQsICAyNCwgIDMyLCAgNTAsICAxLCAgIDEwLCAgMCwgICAwLCAgIDAsICAgMTkzLCA5NiwgIDkzLAotICAgIDE3MiwgODUsICA4MiwgIDE1MiwgNzUsICA3MiwgIDEzMywgNjMsICA2MSwgIDExMywgNTEsICA0OSwgIDk0LCAgMzksICAzNywKLSAgICA3MywgIDI1LCAgMjMsICA0OSwgIDIsICAgMiwgICAwLCAgIDAsICAgMCwgICAxOTQsIDk2LCAgNzgsICAxNzIsIDg1LCAgNjgsCi0gICAgMTUyLCA3NSwgIDU5LCAgMTMyLCA2MywgIDQ5LCAgMTEzLCA1MiwgIDM5LCAgOTQsICA0MCwgIDI2LCAgNzMsICAyNSwgIDExLAotICAgIDQ4LCAgMywgICAwLCAgIDAsICAgMCwgICAwLCAgIDE5NCwgOTYsICA2MCwgIDE3MywgODUsICA1MiwgIDE1MywgNzUsICA0NCwKLSAgICAxMzIsIDY0LCAgMzUsICAxMTIsIDUyLCAgMjUsICA5NCwgIDQwLCAgMTIsICA3MywgIDI2LCAgMCwgICA0OCwgIDQsICAgMCwKLSAgICAwLCAgIDAsICAgMCwgICAxOTUsIDk2LCAgNDYsICAxNzMsIDg1LCAgMzgsICAxNTQsIDc0LCAgMzEsICAxMzMsIDYzLCAgMjIsCi0gICAgMTEzLCA1MiwgIDExLCAgOTMsICA0MCwgIDAsICAgNzMsICAyNiwgIDAsICAgNDcsICA1LCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgMTg4LCA2NywgIDE1MywgMTY4LCA1OCwgIDEzNywgMTUxLCA0OSwgIDEyMiwgMTMxLCAzOSwgIDEwNiwgMTEzLCAyOCwgIDkwLAotICAgIDk0LCAgMTMsICA3NSwgIDc1LCAgMCwgICA1NywgIDUxLCAgMCwgICAzNSwgIDAsICAgMCwgICAwLCAgIDE5MCwgNjgsICAxMzgsCi0gICAgMTcwLCA1OSwgIDEyMywgMTUyLCA1MCwgIDExMCwgMTMyLCA0MSwgIDk2LCAgMTEzLCAyOSwgIDgwLCAgOTQsICAxNiwgIDY2LAotICAgIDc1LCAgMCwgICA0OSwgIDUwLCAgMCwgICAyNywgIDAsICAgMCwgICAwLCAgIDE5MSwgNjksICAxMjYsIDE3MCwgNTksICAxMTIsCi0gICAgMTUxLCA1MiwgIDEwMCwgMTMyLCA0MiwgIDg2LCAgMTEzLCAzMCwgIDczLCAgOTUsICAxNywgIDU4LCAgNzUsICAwLCAgIDQyLAotICAgIDUwLCAgMCwgICAyMSwgIDAsICAgMCwgICAwLCAgIDE5MiwgNzAsICAxMTMsIDE3MCwgNjEsICAxMDAsIDE1MSwgNTIsICA4OSwKLSAgICAxMzIsIDQyLCAgNzcsICAxMTMsIDMxLCAgNjQsICA5NCwgIDE5LCAgNTAsICA3NCwgIDEsICAgMzUsICA1MCwgIDAsICAgMTQsCi0gICAgMCwgICAwLCAgIDAsICAgMTkyLCA3MCwgIDEwMCwgMTcwLCA2MiwgIDg5LCAgMTUxLCA1MywgIDc3LCAgMTMxLCA0MywgIDY2LAotICAgIDExMiwgMzIsICA1NCwgIDk0LCAgMjAsICA0MiwgIDc0LCAgMiwgICAyNywgIDQ5LCAgMCwgICA1LCAgIDAsICAgMCwgICAwLAotICAgIDE5MiwgNzEsICA4NywgIDE3MSwgNjEsICA3NywgIDE1MiwgNTMsICA2NywgIDEzMSwgNDQsICA1NywgIDExMiwgMzMsICA0NSwKLSAgICA5NCwgIDIxLCAgMzMsICA3NCwgIDQsICAgMTksICA0OSwgIDAsICAgMSwgICAwLCAgIDAsICAgMCwgICAxOTMsIDcxLCAgNzQsCi0gICAgMTcxLCA2MiwgIDY0LCAgMTUyLCA1MywgIDU1LCAgMTMyLCA0NCwgIDQ1LCAgMTEzLCAzNCwgIDM0LCAgOTQsICAyMiwgIDIzLAotICAgIDczLCAgNSwgICA3LCAgIDQ4LCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDE5MywgNzAsICA1OCwgIDE3MiwgNjIsICA1MCwKLSAgICAxNTIsIDU0LCAgNDIsICAxMzIsIDQ0LCAgMzIsICAxMTIsIDM1LCAgMjIsICA5MywgIDIzLCAgMTAsICA3MywgIDYsICAgMCwKLSAgICA0NywgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxOTMsIDcwLCAgNDUsICAxNzIsIDYyLCAgMzgsICAxNTMsIDU0LCAgMzEsCi0gICAgMTMyLCA0NCwgIDIxLCAgMTEyLCAzNSwgIDksICAgOTQsICAyMywgIDAsICAgNzMsICA3LCAgIDAsICAgNDcsICAwLCAgIDAsCi0gICAgMCwgICAwLCAgIDAsICAgMTg5LCAyNiwgIDE0MSwgMTY5LCAxNSwgIDEyNiwgMTUwLCAyLCAgIDExMiwgMTMxLCAwLCAgIDk3LAotICAgIDExMywgMCwgICA4MiwgIDk0LCAgMCwgICA2NywgIDc1LCAgMCwgICA1MSwgIDUwLCAgMCwgICAyOSwgIDAsICAgMCwgICAwLAotICAgIDE5MCwgMjgsICAxMjgsIDE3MCwgMTgsICAxMTQsIDE1MSwgOCwgICAxMDEsIDEzMiwgMCwgICA4OCwgIDExMywgMCwgICA3NCwKLSAgICA5NCwgIDAsICAgNjAsICA3NSwgIDAsICAgNDQsICA1MCwgIDAsICAgMjMsICAwLCAgIDAsICAgMCwgICAxOTEsIDMwLCAgMTE3LAotICAgIDE3MCwgMjMsICAxMDQsIDE1MiwgMTEsICA5MiwgIDEzMiwgMSwgICA3OSwgIDExMywgMCwgICA2NywgIDk1LCAgMCwgICA1MywKLSAgICA3NSwgIDAsICAgMzcsICA1MCwgIDAsICAgMTcsICAwLCAgIDAsICAgMCwgICAxOTEsIDMzLCAgMTA1LCAxNzAsIDI2LCAgOTMsCi0gICAgMTUxLCAxOCwgIDgzLCAgMTMyLCA2LCAgIDcwLCAgMTEyLCAwLCAgIDU4LCAgOTQsICAwLCAgIDQ1LCAgNzUsICAwLCAgIDMwLAotICAgIDQ5LCAgMCwgICA4LCAgIDAsICAgMCwgICAwLCAgIDE5MSwgMzQsICA5MywgIDE3MCwgMjcsICA4MiwgIDE1MSwgMjAsICA3MiwKLSAgICAxMzEsIDgsICAgNjEsICAxMTIsIDAsICAgNDksICA5NCwgIDAsICAgMzgsICA3NCwgIDAsICAgMjMsICA0OSwgIDAsICAgNCwKLSAgICAwLCAgIDAsICAgMCwgICAxOTEsIDM2LCAgODIsICAxNzAsIDI5LCAgNzEsICAxNTEsIDIyLCAgNjMsICAxMzEsIDExLCAgNTIsCi0gICAgMTEyLCAwLCAgIDQxLCAgOTMsICAwLCAgIDI5LCAgNzQsICAwLCAgIDE0LCAgNDgsICAwLCAgIDEsICAgMCwgICAwLCAgIDAsCi0gICAgMTkxLCAzOCwgIDY5LCAgMTcwLCAzMSwgIDYwLCAgMTUxLCAyNCwgIDUxLCAgMTMxLCAxNCwgIDQxLCAgMTEyLCAxLCAgIDMxLAotICAgIDkzLCAgMCwgICAxOSwgIDczLCAgMCwgICAzLCAgIDQ4LCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDE5MiwgMzcsICA1NiwKLSAgICAxNzEsIDMxLCAgNDcsICAxNTIsIDI1LCAgNDAsICAxMzEsIDE3LCAgMzAsICAxMTIsIDQsICAgMTksICA5MywgIDAsICAgNywKLSAgICA3MywgIDAsICAgMCwgICA0NywgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxOTIsIDM4LCAgNDUsICAxNzEsIDMzLCAgMzYsCi0gICAgMTUyLCAyNiwgIDMwLCAgMTMxLCAxOCwgIDIxLCAgMTExLCA3LCAgIDksICAgOTMsICAwLCAgIDAsICAgNzMsICAwLCAgIDAsCi0gICAgNDcsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTQ5LCAyMTgsIDI0OCwgMTMzLCAxOTQsIDIyMiwgMTE5LCAxNzMsIDE5OCwKLSAgICAxMDIsIDE1MSwgMTczLCA4NiwgIDEzMCwgMTQ4LCA3MCwgIDEwOCwgMTI1LCA1MywgIDg1LCAgMTAwLCAzMiwgIDU5LCAgNzEsCi0gICAgMCwgICAyMiwgIDMzLCAgMTU0LCAyMTYsIDIyMywgMTM3LCAxOTMsIDIwMCwgMTIyLCAxNzIsIDE3OCwgMTA2LCAxNTAsIDE1NiwKLSAgICA4OSwgIDEyOCwgMTMzLCA3MywgIDEwNywgMTEyLCA1NCwgIDg1LCAgODksICAzMSwgIDU5LCAgNjMsICAwLCAgIDIyLCAgMjYsCi0gICAgMTU5LCAyMTUsIDIwMiwgMTQxLCAxOTIsIDE4MSwgMTI2LCAxNzEsIDE2MSwgMTA4LCAxNDksIDE0MSwgOTAsICAxMjgsIDEyMSwKLSAgICA3NCwgIDEwNywgMTAwLCA1NSwgIDg1LCAgODAsICAzMiwgIDU4LCAgNTUsICAwLCAgIDIyLCAgMTksICAxNjEsIDIxMywgMTc5LAotICAgIDE0NCwgMTkwLCAxNjAsIDEyNiwgMTcwLCAxNDMsIDEwOSwgMTQ4LCAxMjUsIDkyLCAgMTI3LCAxMDcsIDc0LCAgMTA2LCA4OSwKLSAgICA1NiwgIDg0LCAgNjksICAzMiwgIDU4LCAgNDYsICAwLCAgIDIxLCAgMTEsICAxNjMsIDIxMSwgMTU2LCAxNDQsIDE4OSwgMTM5LAotICAgIDEyOSwgMTY4LCAxMjUsIDExMCwgMTQ3LCAxMDgsIDkzLCAgMTI2LCA5MiwgIDc1LCAgMTA1LCA3NiwgIDU3LCAgODMsICA1OCwKLSAgICAzMywgIDU4LCAgMzcsICAwLCAgIDIxLCAgMSwgICAxNjcsIDIxMSwgMTMzLCAxNDcsIDE4OCwgMTIwLCAxMzAsIDE2NywgMTA1LAotICAgIDExMCwgMTQ1LCA5MiwgIDkzLCAgMTI1LCA3OCwgIDc2LCAgMTA0LCA2NCwgIDU4LCAgODMsICA0OCwgIDMzLCAgNTcsICAyNywKLSAgICAwLCAgIDIxLCAgMCwgICAxNjksIDIxMCwgMTA4LCAxNDksIDE4NywgOTYsICAxMzEsIDE2NiwgODYsICAxMTIsIDE0NCwgNzQsCi0gICAgOTQsICAxMjQsIDYyLCAgNzcsICAxMDMsIDQ5LCAgNTgsICA4MiwgIDM1LCAgMzMsICA1NywgIDE1LCAgMCwgICAyMSwgIDAsCi0gICAgMTcwLCAyMDksIDgwLCAgMTUxLCAxODYsIDcxLCAgMTMzLCAxNjUsIDYyLCAgMTE0LCAxNDMsIDUyLCAgOTUsICAxMjMsIDQyLAotICAgIDc3LCAgMTAzLCAzMiwgIDU4LCAgODEsICAxOCwgIDMzLCAgNTYsICAwLCAgIDAsICAgMjEsICAwLCAgIDE3MywgMjA4LCA1NSwKLSAgICAxNTIsIDE4NiwgNDksICAxMzQsIDE2NSwgNDEsICAxMTQsIDE0MywgMzQsICA5NSwgIDEyMiwgMjUsICA3NywgIDEwMiwgMTQsCi0gICAgNTgsICA4MSwgIDAsICAgMzMsICA1NiwgIDAsICAgMCwgICAyMSwgIDAsICAgMTU0LCAxOTUsIDIzMiwgMTM3LCAxNzQsIDIwNywKLSAgICAxMjIsIDE1NiwgMTg1LCAxMDUsIDEzNiwgMTYzLCA4OSwgIDExNiwgMTQwLCA3MywgIDk3LCAgMTE3LCA1NiwgIDc2LCAgOTQsCi0gICAgMzUsICA1MSwgIDY2LCAgMCwgICAxMywgIDI4LCAgMTU4LCAxOTQsIDIwOSwgMTQxLCAxNzQsIDE4NywgMTI1LCAxNTUsIDE2NywKLSAgICAxMDksIDEzNSwgMTQ2LCA5MSwgIDExNiwgMTI1LCA3NSwgIDk2LCAgMTA1LCA1NywgIDc1LCAgODMsICAzNSwgIDUwLCAgNTcsCi0gICAgMCwgICAxMiwgIDIxLCAgMTYxLCAxOTMsIDE4OSwgMTQ0LCAxNzMsIDE2OSwgMTI4LCAxNTQsIDE1MSwgMTEwLCAxMzQsIDEzMiwKLSAgICA5MywgIDExNSwgMTEzLCA3NywgIDk1LCAgOTQsICA1OCwgIDc1LCAgNzQsICAzNSwgIDUwLCAgNTAsICAwLCAgIDEyLCAgMTMsCi0gICAgMTY0LCAxOTIsIDE2OCwgMTQ1LCAxNzEsIDE1MSwgMTI5LCAxNTMsIDEzNCwgMTExLCAxMzMsIDExNywgOTQsICAxMTQsIDEwMCwKLSAgICA3NiwgIDk1LCAgODIsICA1OCwgIDc1LCAgNjQsICAzNiwgIDUwLCAgNDIsICAwLCAgIDEyLCAgNSwgICAxNjUsIDE5MSwgMTQ3LAotICAgIDE0NywgMTcwLCAxMzEsIDEzMCwgMTUyLCAxMTcsIDExMywgMTMyLCAxMDIsIDk1LCAgMTEzLCA4NiwgIDc3LCAgOTQsICA3MSwKLSAgICA1OCwgIDc0LCAgNTQsICAzNSwgIDUwLCAgMzMsICAwLCAgIDEzLCAgMCwgICAxNjcsIDE4OSwgMTI2LCAxNDgsIDE2OSwgMTEzLAotICAgIDEzMiwgMTUxLCAxMDAsIDExMywgMTMxLCA4NiwgIDk2LCAgMTEyLCA3MywgIDc3LCAgOTMsICA1OSwgIDU5LCAgNzMsICA0MywKLSAgICAzNSwgIDQ5LCAgMjMsICAwLCAgIDEyLCAgMCwgICAxNzAsIDE4OSwgMTA0LCAxNTAsIDE2OCwgOTEsICAxMzMsIDE1MCwgODEsCi0gICAgMTE0LCAxMzAsIDY5LCAgOTYsICAxMTEsIDU3LCAgNzgsICA5MiwgIDQ2LCAgNTksICA3MywgIDMxLCAgMzUsICA0OSwgIDExLAotICAgIDAsICAgMTMsICAwLCAgIDE3MSwgMTg4LCA3OCwgIDE1MiwgMTY4LCA2OCwgIDEzNCwgMTQ5LCA2MCwgIDExNSwgMTMwLCA1MCwKLSAgICA5NiwgIDExMSwgNDEsICA3OCwgIDkyLCAgMjksICA2MCwgIDczLCAgMTUsICAzNSwgIDQ5LCAgMCwgICAwLCAgIDEyLCAgMCwKLSAgICAxNzMsIDE4NywgNTUsICAxNTMsIDE2NywgNDcsICAxMzQsIDE0OSwgMzksICAxMTUsIDEyOSwgMzMsICA5NywgIDExMCwgMjQsCi0gICAgNzksICA5MiwgIDEzLCAgNjAsICA3MiwgIDAsICAgMzUsICA0OCwgIDAsICAgMCwgICAxMiwgIDAsICAgMTU3LCAxNzUsIDIxNywKLSAgICAxMzksIDE1NywgMTk2LCAxMjUsIDE0MSwgMTc1LCAxMDksIDEyMiwgMTUzLCA5MiwgIDEwNCwgMTMyLCA3NiwgIDg2LCAgMTEwLAotICAgIDU5LCAgNjcsICA4OCwgIDM3LCAgNDMsICA2MSwgIDEsICAgMSwgICAyMywgIDE2MSwgMTc0LCAxOTYsIDE0NCwgMTU2LCAxNzYsCi0gICAgMTI3LCAxNDAsIDE1OCwgMTEwLCAxMjEsIDEzNywgOTQsICAxMDQsIDExOCwgNzcsICA4NSwgIDk4LCAgNTksICA2NywgIDc4LAotICAgIDM3LCAgNDMsICA1MywgIDAsICAgMiwgICAxNiwgIDE2MywgMTc0LCAxNzgsIDE0NiwgMTU2LCAxNjAsIDEzMCwgMTM5LCAxNDMsCi0gICAgMTEyLCAxMjEsIDEyNCwgOTUsICAxMDMsIDEwNiwgNzgsICA4NSwgIDg4LCAgNjAsICA2NiwgIDY5LCAgMzcsICA0MiwgIDQ2LAotICAgIDAsICAgMiwgICA3LCAgIDE2NiwgMTczLCAxNTksIDE0NywgMTU0LCAxNDIsIDEzMCwgMTM4LCAxMjcsIDExMywgMTIwLCAxMTEsCi0gICAgOTYsICAxMDMsIDk1LCAgNzgsICA4NCwgIDc3LCAgNjAsICA2NiwgIDU5LCAgMzcsICA0MywgIDM3LCAgMCwgICAyLCAgIDAsCi0gICAgMTY2LCAxNzIsIDEzOSwgMTQ4LCAxNTQsIDEyNSwgMTMxLCAxMzcsIDExMiwgMTEzLCAxMjAsIDk2LCAgOTYsICAxMDIsIDgxLAotICAgIDc4LCAgODQsICA2NiwgIDYwLCAgNjUsICA1MCwgIDM3LCAgNDIsICAyOSwgIDAsICAgMywgICAwLCAgIDE2NywgMTcxLCAxMjAsCi0gICAgMTQ5LCAxNTMsIDEwNywgMTMzLCAxMzcsIDk1LCAgMTE0LCAxMTgsIDgxLCAgOTcsICAxMDEsIDY5LCAgNzksICA4NCwgIDU2LAotICAgIDYwLCAgNjUsICA0MCwgIDM3LCAgNDIsICAxOSwgIDAsICAgMywgICAwLCAgIDE3MCwgMTcwLCA5OSwgIDE1MSwgMTUyLCA4NywKLSAgICAxMzQsIDEzNiwgNzcsICAxMTUsIDExOCwgNjYsICA5NywgIDEwMSwgNTUsICA3OSwgIDgzLCAgNDIsICA2MSwgIDY1LCAgMjgsCi0gICAgMzcsICA0MiwgIDcsICAgMCwgICAzLCAgIDAsICAgMTcyLCAxNzAsIDc1LCAgMTUyLCAxNTEsIDY1LCAgMTM0LCAxMzUsIDU3LAotICAgIDExNSwgMTE3LCA0OCwgIDk3LCAgMTAwLCAzOCwgIDc5LCAgODMsICAyNywgIDYxLCAgNjQsICAxMiwgIDM2LCAgNDIsICAwLAotICAgIDAsICAgMywgICAwLCAgIDE3MiwgMTY5LCA1NSwgIDE1NCwgMTUxLCA0NiwgIDEzNSwgMTM0LCA0MCwgIDExNiwgMTE2LCAzMiwKLSAgICA5NywgIDk5LCAgMjEsICA4MCwgIDgyLCAgMTAsICA2MSwgIDY0LCAgMCwgICAzNiwgIDQxLCAgMCwgICAwLCAgIDMsICAgMCwKLSAgICAxNjAsIDE1NCwgMjAzLCAxNDMsIDEzOSwgMTgyLCAxMjcsIDEyNCwgMTY0LCAxMTEsIDEwNywgMTQzLCA5NSwgIDkxLCAgMTIyLAotICAgIDc4LCAgNzUsICAxMDMsIDYwLCAgNTcsICA4MSwgIDM5LCAgMzMsICA1NiwgIDEsICAgMCwgICAxOCwgIDE2MywgMTU0LCAxODQsCi0gICAgMTQ2LCAxMzgsIDE2NSwgMTMwLCAxMjMsIDE0OCwgMTEzLCAxMDcsIDEyOSwgOTYsICA5MCwgIDExMCwgNzksICA3NCwgIDkyLAotICAgIDYxLCAgNTYsICA3MiwgIDM5LCAgMzQsICA0OCwgIDIsICAgMCwgICA5LCAgIDE2NSwgMTU0LCAxNjcsIDE0NywgMTM3LCAxNDksCi0gICAgMTMxLCAxMjIsIDEzNCwgMTE0LCAxMDYsIDExNywgOTYsICA5MCwgIDEwMCwgNzksICA3NCwgIDgyLCAgNjEsICA1NiwgIDY0LAotICAgIDM5LCAgMzMsICA0MCwgIDIsICAgMCwgICAxLCAgIDE2NiwgMTUzLCAxNTAsIDE0OSwgMTM3LCAxMzMsIDEzMiwgMTIyLCAxMTksCi0gICAgMTE0LCAxMDYsIDEwNCwgOTcsICA5MCwgIDg4LCAgNzksICA3NCwgIDcyLCAgNjEsICA1NiwgIDU1LCAgMzksICAzNCwgIDMzLAotICAgIDAsICAgMCwgICAwLCAgIDE2OCwgMTUyLCAxMzIsIDE0OSwgMTM2LCAxMTcsIDEzMiwgMTIxLCAxMDQsIDExNCwgMTA1LCA5MCwKLSAgICA5NywgIDg5LCAgNzYsICA3OSwgIDczLCAgNjIsICA2MSwgIDU2LCAgNDYsICAzOCwgIDM0LCAgMjUsICAwLCAgIDAsICAgMCwKLSAgICAxNjksIDE1MSwgMTE0LCAxNTAsIDEzNSwgMTAxLCAxMzMsIDEyMSwgOTAsICAxMTQsIDEwNCwgNzcsICA5NywgIDg5LCAgNjUsCi0gICAgODAsICA3MywgIDUxLCAgNjEsICA1NiwgIDM2LCAgMzgsICAzNCwgIDE2LCAgMCwgICAwLCAgIDAsICAgMTcwLCAxNTAsIDk0LAotICAgIDE1MSwgMTM1LCA4MywgIDEzNCwgMTIwLCA3MywgIDExNSwgMTA0LCA2MiwgIDk4LCAgODgsICA1MSwgIDgwLCAgNzIsICAzOSwKLSAgICA2MSwgIDU2LCAgMjQsICAzOCwgIDM0LCAgMywgICAwLCAgIDAsICAgMCwgICAxNzIsIDE1MCwgNzIsICAxNTMsIDEzNCwgNjMsCi0gICAgMTM1LCAxMTksIDU1LCAgMTE1LCAxMDMsIDQ1LCAgOTgsICA4OCwgIDM2LCAgODAsICA3MiwgIDI0LCAgNjEsICA1NSwgIDksCi0gICAgMzgsICAzNCwgIDAsICAgMCwgICAwLCAgIDAsICAgMTcyLCAxNTAsIDU0LCAgMTUzLCAxMzQsIDQ3LCAgMTM1LCAxMTksIDM4LAotICAgIDExNiwgMTAzLCAzMCwgIDk4LCAgODcsICAyMSwgIDgwLCAgNzIsICA4LCAgIDYyLCAgNTUsICAwLCAgIDM3LCAgMzQsICAwLAotICAgIDAsICAgMCwgICAwLCAgIDE2MiwgMTM0LCAxOTAsIDE0NSwgMTIwLCAxNzEsIDEyOSwgMTA4LCAxNTMsIDExMywgOTMsICAxMzQsCi0gICAgOTcsICA3OCwgIDExNSwgODAsICA2MywgIDk2LCAgNjIsICA0NiwgIDc1LCAgNDEsICAyMywgIDUxLCAgMCwgICAwLCAgIDExLAotICAgIDE2NSwgMTM0LCAxNzMsIDE0NywgMTIwLCAxNTQsIDEzMSwgMTA3LCAxMzgsIDExNCwgOTIsICAxMjAsIDk3LCAgNzgsICAxMDMsCi0gICAgODAsICA2MywgIDg1LCAgNjIsICA0NiwgIDY2LCAgNDAsICAyMywgIDQzLCAgMCwgICAwLCAgIDIsICAgMTY2LCAxMzQsIDE1NywKLSAgICAxNDgsIDEyMCwgMTQwLCAxMzIsIDEwNiwgMTI1LCAxMTQsIDkyLCAgMTA5LCA5NywgIDc3LCAgOTMsICA4MSwgIDYzLCAgNzcsCi0gICAgNjIsICA0NiwgIDU4LCAgNDAsICAyNCwgIDM2LCAgMCwgICAwLCAgIDAsICAgMTY4LCAxMzMsIDE0MCwgMTQ5LCAxMTksIDEyNSwKLSAgICAxMzIsIDEwNiwgMTEyLCAxMTUsIDkyLCAgOTcsICA5OCwgIDc3LCAgODIsICA4MSwgIDYyLCAgNjcsICA2MiwgIDQ2LCAgNTAsCi0gICAgNDAsICAyNCwgIDI5LCAgMCwgICAwLCAgIDAsICAgMTY4LCAxMzMsIDEyMywgMTUwLCAxMTksIDExMCwgMTMzLCAxMDYsIDk3LAotICAgIDExNSwgOTEsICA4NCwgIDk4LCAgNzcsICA3MCwgIDgxLCAgNjIsICA1NywgIDYyLCAgNDYsICA0MSwgIDQwLCAgMjQsICAyMCwKLSAgICAwLCAgIDAsICAgMCwgICAxNjksIDEzMiwgMTA3LCAxNTAsIDExOCwgOTQsICAxMzMsIDEwNSwgODQsICAxMTUsIDkxLCAgNzIsCi0gICAgOTgsICA3NiwgIDYwLCAgODAsICA2MiwgIDQ3LCAgNjIsICA0NiwgIDMyLCAgMzksICAyNSwgIDExLCAgMCwgICAwLCAgIDAsCi0gICAgMTcxLCAxMzIsIDg5LCAgMTUyLCAxMTgsIDc5LCAgMTM1LCAxMDUsIDY5LCAgMTE1LCA5MCwgIDU4LCAgOTgsICA3NiwgIDQ3LAotICAgIDgwLCAgNjIsICAzNiwgIDYyLCAgNDYsICAyMSwgIDM5LCAgMjUsICAwLCAgIDAsICAgMCwgICAwLCAgIDE3MSwgMTMyLCA2OSwKLSAgICAxNTMsIDExNywgNjAsICAxMzUsIDEwNCwgNTIsICAxMTYsIDkwLCAgNDIsICA5OCwgIDc2LCAgMzMsICA4MSwgIDYxLCAgMjEsCi0gICAgNjIsICA0NiwgIDYsICAgMzgsICAyNSwgIDAsICAgMCwgICAwLCAgIDAsICAgMTcyLCAxMzIsIDU0LCAgMTUzLCAxMTgsIDQ1LAotICAgIDEzNSwgMTA0LCAzOCwgIDExNiwgOTAsICAyOCwgIDk4LCAgNzYsICAxOCwgIDgxLCAgNjEsICA2LCAgIDYyLCAgNDYsICAwLAotICAgIDM4LCAgMjUsICAwLCAgIDAsICAgMCwgICAwLCAgIDE2NCwgMTE1LCAxNzcsIDE0NiwgMTAzLCAxNTksIDEzMCwgOTEsICAxNDMsCi0gICAgMTE0LCA3OCwgIDEyNSwgOTcsICA2NSwgIDEwNywgODEsICA1MSwgIDg5LCAgNjMsICAzNCwgIDY5LCAgNDEsICA5LCAgIDQ2LAotICAgIDAsICAgMCwgICA0LCAgIDE2NiwgMTE1LCAxNjEsIDE0OCwgMTAzLCAxNDQsIDEzMiwgOTEsICAxMjksIDExNSwgNzgsICAxMTIsCi0gICAgOTgsICA2NSwgIDk2LCAgODEsICA1MSwgIDc5LCAgNjMsICAzNSwgIDYxLCAgNDEsICAxMSwgIDM4LCAgMCwgICAwLCAgIDAsCi0gICAgMTY3LCAxMTUsIDE0NiwgMTUwLCAxMDIsIDEzMSwgMTMyLCA5MSwgIDExNywgMTE1LCA3OCwgIDEwMSwgOTgsICA2NSwgIDg2LAotICAgIDgxLCAgNTEsICA3MSwgIDYzLCAgMzUsICA1NCwgIDQxLCAgMTIsICAzMiwgIDAsICAgMCwgICAwLCAgIDE2OCwgMTE0LCAxMzIsCi0gICAgMTUwLCAxMDMsIDExOCwgMTMzLCA5MSwgIDEwNSwgMTE2LCA3OCwgIDkxLCAgOTgsICA2NCwgIDc2LCAgODIsICA1MSwgIDYxLAotICAgIDYzLCAgMzYsICA0NiwgIDQxLCAgMTMsICAyNCwgIDAsICAgMCwgICAwLCAgIDE2OSwgMTE0LCAxMTYsIDE1MCwgMTAyLCAxMDMsCi0gICAgMTM0LCA5MCwgIDkxLCAgMTE2LCA3OCwgIDc5LCAgOTgsICA2NSwgIDY2LCAgODEsICA1MSwgIDUzLCAgNjMsICAzNiwgIDM3LAotICAgIDQwLCAgMTQsICAxNywgIDAsICAgMCwgICAwLCAgIDE2OSwgMTE0LCAxMDEsIDE1MSwgMTAxLCA4OSwgIDEzNCwgOTAsICA3OSwKLSAgICAxMTYsIDc3LCAgNjcsICA5OCwgIDY0LCAgNTYsICA4MSwgIDUxLCAgNDQsICA2MywgIDM2LCAgMjksICA0MCwgIDE1LCAgNywKLSAgICAwLCAgIDAsICAgMCwgICAxNzAsIDExNCwgODUsICAxNTIsIDEwMSwgNzUsICAxMzUsIDkwLCAgNjUsICAxMTYsIDc3LCAgNTQsCi0gICAgOTgsICA2NCwgIDQ0LCAgODEsICA1MSwgIDMyLCAgNjMsICAzNiwgIDE3LCAgMzksICAxNSwgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgMTcyLCAxMTMsIDY2LCAgMTUyLCAxMDEsIDU4LCAgMTM1LCA4OSwgIDQ5LCAgMTE2LCA3NywgIDQwLCAgOTksICA2NCwgIDMwLAotICAgIDgxLCAgNTEsICAxOCwgIDYyLCAgMzYsICAzLCAgIDM4LCAgMTYsICAwLCAgIDAsICAgMCwgICAwLCAgIDE3MSwgMTEzLCA1MSwKLSAgICAxNTMsIDEwMSwgNDQsICAxMzYsIDg5LCAgMzYsICAxMTYsIDc3LCAgMjgsICA5OSwgIDY0LCAgMTgsICA4MSwgIDUxLCAgNSwKLSAgICA2MiwgIDM2LCAgMCwgICAzOCwgIDE2LCAgMCwgICAwLCAgIDAsICAgMCwgICAxNjUsIDk0LCAgMTY2LCAxNDcsIDgyLCAgMTQ3LAotICAgIDEzMiwgNzIsICAxMzIsIDExNSwgNjEsICAxMTUsIDk4LCAgNDksICA5OSwgIDgyLCAgMzYsICA4MiwgIDY0LCAgMTksICA2NCwKLSAgICA0MiwgIDAsICAgNDEsICAwLCAgIDAsICAgMCwgICAxNjcsIDkzLCAgMTUwLCAxNTAsIDgzLCAgMTM0LCAxMzMsIDczLCAgMTIwLAotICAgIDExNiwgNjIsICAxMDQsIDk5LCAgNDksICA4OCwgIDgyLCAgMzYsICA3MiwgIDY0LCAgMjAsICA1NSwgIDQxLCAgMCwgICAzMywKLSAgICAwLCAgIDAsICAgMCwgICAxNjksIDkzLCAgMTM3LCAxNTAsIDgzLCAgMTIyLCAxMzQsIDczLCAgMTA5LCAxMTYsIDYxLCAgOTQsCi0gICAgOTksICA1MCwgIDgwLCAgODIsICAzNywgIDY1LCAgNjQsICAyMSwgIDQ5LCAgNDEsICAwLCAgIDI3LCAgMCwgICAwLCAgIDAsCi0gICAgMTY5LCA5NCwgIDEyMywgMTUwLCA4MywgIDExMCwgMTMzLCA3MywgIDk3LCAgMTE2LCA2MSwgIDgzLCAgOTksICA1MCwgIDcwLAotICAgIDgyLCAgMzgsICA1NywgIDYzLCAgMjMsICA0MiwgIDQxLCAgMCwgICAyMCwgIDAsICAgMCwgICAwLCAgIDE2OSwgOTQsICAxMDksCi0gICAgMTUwLCA4NCwgIDk3LCAgMTM0LCA3MywgIDg1LCAgMTE2LCA2MiwgIDczLCAgOTksICA1MSwgIDYxLCAgODEsICAzOCwgIDQ4LAotICAgIDYzLCAgMjMsICAzMywgIDQxLCAgMSwgICAxMSwgIDAsICAgMCwgICAwLCAgIDE3MCwgOTQsICA5NiwgIDE1MCwgODMsICA4NCwKLSAgICAxMzQsIDczLCAgNzQsICAxMTYsIDYxLCAgNjIsICA5OSwgIDUwLCAgNTEsICA4MiwgIDM4LCAgMzksICA2NCwgIDIzLCAgMjQsCi0gICAgNDAsICAzLCAgIDQsICAgMCwgICAwLCAgIDAsICAgMTcxLCA5MywgIDc5LCAgMTUyLCA4MiwgIDcwLCAgMTM1LCA3MywgIDYxLAotICAgIDExNiwgNjIsICA1MSwgIDk4LCAgNTEsICA0MCwgIDgxLCAgMzgsICAyOCwgIDYzLCAgMjQsICAxNCwgIDM5LCAgNCwgICAwLAotICAgIDAsICAgMCwgICAwLCAgIDE3MSwgOTQsICA2NCwgIDE1MiwgODMsICA1NSwgIDEzNSwgNzMsICA0NywgIDExNiwgNjIsICAzNywKLSAgICA5OCwgIDUwLCAgMjcsICA4MSwgIDM4LCAgMTUsICA2MywgIDI0LCAgMSwgICAzOSwgIDQsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAxNzIsIDkzLCAgNTEsICAxNTMsIDgyLCAgNDIsICAxMzUsIDczLCAgMzUsICAxMTcsIDYyLCAgMjYsICA5OSwgIDUxLCAgMTYsCi0gICAgODEsICAzOSwgIDMsICAgNjMsICAyNSwgIDAsICAgMzgsICA1LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTY2LCA2OCwgIDE1MywKLSAgICAxNDgsIDU5LCAgMTM3LCAxMzMsIDQ5LCAgMTIxLCAxMTUsIDM5LCAgMTA2LCA5OSwgIDI4LCAgOTEsICA4MiwgIDEzLCAgNzUsCi0gICAgNjUsICAwLCAgIDU4LCAgNDIsICAwLCAgIDM2LCAgMCwgICAwLCAgIDAsICAgMTY4LCA2OCwgIDEzOSwgMTUwLCA1OSwgIDEyNCwKLSAgICAxMzQsIDUwLCAgMTEwLCAxMTYsIDQwLCAgOTYsICA5OSwgIDMwLCAgODEsICA4MiwgIDE2LCAgNjYsICA2NCwgIDAsICAgNTAsCi0gICAgNDEsICAwLCAgIDI5LCAgMCwgICAwLCAgIDAsICAgMTY5LCA2OSwgIDEyNiwgMTUwLCA1OSwgIDExMywgMTM0LCA1MSwgIDEwMSwKLSAgICAxMTcsIDQyLCAgODcsICAxMDAsIDMwLCAgNzMsICA4MiwgIDE3LCAgNTksICA2NSwgIDAsICAgNDMsICA0MSwgIDAsICAgMjMsCi0gICAgMCwgICAwLCAgIDAsICAgMTY5LCA3MCwgIDExNSwgMTUwLCA2MSwgIDEwMiwgMTM0LCA1MiwgIDg5LCAgMTE2LCA0MiwgIDc3LAotICAgIDk5LCAgMzIsICA2NSwgIDgyLCAgMTksICA1MiwgIDY0LCAgMCwgICAzNiwgIDQxLCAgMCwgICAxNSwgIDAsICAgMCwgICAwLAotICAgIDE2OSwgNzAsICAxMDEsIDE1MCwgNjEsICA5MCwgIDEzNCwgNTIsICA3OSwgIDExNiwgNDMsICA2OCwgIDk5LCAgMzIsICA1NSwKLSAgICA4MiwgIDIxLCAgNDMsICA2NCwgIDIsICAgMjgsICA0MSwgIDAsICAgNiwgICAwLCAgIDAsICAgMCwgICAxNzAsIDcwLCAgODksCi0gICAgMTUxLCA2MiwgIDc5LCAgMTM0LCA1MywgIDY5LCAgMTE2LCA0NCwgIDU4LCAgOTksICAzMywgIDQ2LCAgODEsICAyMSwgIDM0LAotICAgIDY0LCAgMywgICAyMCwgIDQxLCAgMCwgICAyLCAgIDAsICAgMCwgICAwLCAgIDE3MCwgNzEsICA3NiwgIDE1MiwgNjIsICA2NiwKLSAgICAxMzQsIDUzLCAgNTcsICAxMTYsIDQzLCAgNDYsICA5OSwgIDMzLCAgMzYsICA4MiwgIDIyLCAgMjQsICA2NCwgIDUsICAgMTAsCi0gICAgNDAsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTcxLCA3MCwgIDYxLCAgMTUyLCA2MiwgIDUyLCAgMTM1LCA1MywgIDQ0LAotICAgIDExNiwgNDQsICAzNSwgIDk5LCAgMzQsICAyNCwgIDgyLCAgMjIsICAxMiwgIDYzLCAgNiwgICAwLCAgIDM5LCAgMCwgICAwLAotICAgIDAsICAgMCwgICAwLCAgIDE3MSwgNzEsICA0OSwgIDE1MywgNjIsICA0MSwgIDEzNSwgNTQsICAzMywgIDExNywgNDUsICAyNSwKLSAgICA5OCwgIDM0LCAgMTMsICA4MSwgIDIzLCAgMCwgICA2MywgIDcsICAgMCwgICAzOSwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAxNjcsIDMzLCAgMTQyLCAxNDksIDI0LCAgMTI3LCAxMzQsIDEwLCAgMTEzLCAxMTYsIDAsICAgOTcsICAxMDAsIDAsICAgODMsCi0gICAgODMsICAwLCAgIDY4LCAgNjUsICAwLCAgIDUyLCAgNDAsICAwLCAgIDMwLCAgMCwgICAwLCAgIDAsICAgMTY5LCAzMywgIDEyOSwKLSAgICAxNTAsIDI2LCAgMTE1LCAxMzQsIDE3LCAgMTAyLCAxMTYsIDMsICAgODksICAxMDAsIDAsICAgNzUsICA4MywgIDAsICAgNjAsCi0gICAgNjUsICAwLCAgIDQ1LCAgNDAsICAwLCAgIDI0LCAgMCwgICAwLCAgIDAsICAgMTY5LCAzNiwgIDExOCwgMTUxLCAyNywgIDEwNCwKLSAgICAxMzQsIDE5LCAgOTMsICAxMTYsIDcsICAgODAsICAxMDAsIDAsICAgNjcsICA4MywgIDAsICAgNTQsICA2NSwgIDAsICAgMzgsCi0gICAgNDEsICAwLCAgIDE3LCAgMCwgICAwLCAgIDAsICAgMTY5LCAzOSwgIDEwNywgMTUwLCAzMCwgIDk0LCAgMTM0LCAyMiwgIDg0LAotICAgIDExNiwgMTEsICA3MSwgIDk5LCAgMCwgICA1OSwgIDgzLCAgMCwgICA0NiwgIDY0LCAgMCwgICAzMSwgIDQwLCAgMCwgICA5LAotICAgIDAsICAgMCwgICAwLCAgIDE2OSwgMzksICA5NSwgIDE1MSwgMzEsICA4MywgIDEzNCwgMjQsICA3MywgIDExNiwgMTUsICA2MiwKLSAgICAxMDAsIDEsICAgNTEsICA4MywgIDAsICAgMzgsICA2NCwgIDAsICAgMjQsICA0MCwgIDAsICAgNSwgICAwLCAgIDAsICAgMCwKLSAgICAxNjksIDQxLCAgODMsICAxNTEsIDMzLCAgNzMsICAxMzQsIDI2LCAgNjQsICAxMTcsIDE3LCAgNTQsICA5OSwgIDQsICAgNDIsCi0gICAgODIsICAwLCAgIDMwLCAgNjQsICAwLCAgIDE2LCAgNDAsICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMTcwLCA0MiwgIDcxLAotICAgIDE1MiwgMzQsICA2MiwgIDEzNCwgMjgsICA1MywgIDExNywgMTksICA0NCwgIDk5LCAgNiwgICAzMywgIDgyLCAgMCwgICAyMSwKLSAgICA2MywgIDAsICAgNCwgICAzOSwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxNzEsIDQyLCAgNTksICAxNTIsIDM1LCAgNTAsCi0gICAgMTM0LCAyOSwgIDQyLCAgMTE3LCAyMSwgIDMyLCAgOTksICA5LCAgIDIyLCAgODIsICAwLCAgIDksICAgNjMsICAwLCAgIDAsCi0gICAgMzgsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTcyLCA0MiwgIDQ4LCAgMTUyLCAzNiwgIDQwLCAgMTM1LCAyOSwgIDMyLAotICAgIDExNywgMjEsICAyMywgIDk5LCAgMTAsICAxMiwgIDgyLCAgMCwgICAwLCAgIDYzLCAgMCwgICAwLCAgIDM4LCAgMCwgICAwLAotICAgIDAsICAgMCwgICAwLCAgIDEwNywgMjA3LCAyNDYsIDk2LCAgMTg1LCAyMjAsIDg2LCAgMTY1LCAxOTYsIDczLCAgMTQ0LCAxNzEsCi0gICAgNjAsICAxMjMsIDE0NywgNDYsICAxMDMsIDEyNSwgMzIsICA4MiwgIDEwMCwgOSwgICA1NiwgIDcxLCAgMCwgICAyMCwgIDMzLAotICAgIDExNSwgMjA2LCAyMjEsIDEwNCwgMTg0LCAxOTgsIDkyLCAgMTY0LCAxNzgsIDc4LCAgMTQzLCAxNTQsIDY0LCAgMTIzLCAxMzMsCi0gICAgNTEsICAxMDIsIDExMSwgMzQsICA4MSwgIDg5LCAgMTAsICA1NiwgIDYzLCAgMCwgICAyMCwgIDI3LCAgMTIyLCAyMDQsIDIwMCwKLSAgICAxMDgsIDE4MywgMTgwLCA5NSwgIDE2MywgMTYxLCA4MiwgIDE0MiwgMTQwLCA2OCwgIDEyMiwgMTIwLCA1NCwgIDEwMiwgMTAxLAotICAgIDM2LCAgODEsICA3OSwgIDExLCAgNTYsICA1NSwgIDAsICAgMjAsICAyMCwgIDEyNSwgMjAzLCAxNzksIDExMSwgMTgxLCAxNjAsCi0gICAgOTcsICAxNjIsIDE0MywgODUsICAxNDEsIDEyNCwgNzAsICAxMjEsIDEwNywgNTUsICAxMDEsIDg5LCAgMzgsICA4MCwgIDY5LAotICAgIDE0LCAgNTUsICA0NiwgIDAsICAgMTksICAxMCwgIDEyOCwgMjAyLCAxNTYsIDExMywgMTgwLCAxNDAsIDEwMiwgMTYxLCAxMjUsCi0gICAgODcsICAxNDAsIDEwOCwgNzEsICAxMjAsIDkyLCAgNTYsICAxMDAsIDc2LCAgMzksICA3OSwgIDU5LCAgMTQsICA1NSwgIDM4LAotICAgIDAsICAgMjAsICAzLCAgIDEzMiwgMjAwLCAxMzUsIDExNywgMTc5LCAxMjEsIDEwMywgMTU5LCAxMDYsIDg4LCAgMTM5LCA5MywKLSAgICA3MywgIDExOSwgNzksICA1NywgIDEwMCwgNjUsICA0MSwgIDc5LCAgNDksICAxNSwgIDU0LCAgMjgsICAwLCAgIDE5LCAgMCwKLSAgICAxMzQsIDIwMCwgMTExLCAxMTksIDE3OCwgOTgsICAxMDUsIDE1OCwgODcsICA4OSwgIDEzOCwgNzYsICA3NCwgIDExOCwgNjQsCi0gICAgNTgsICA5OSwgIDUxLCAgNDEsICA3OCwgIDM3LCAgMTYsICA1NCwgIDE3LCAgMCwgICAxOSwgIDAsICAgMTM3LCAxOTksIDg1LAotICAgIDEyMiwgMTc3LCA3NSwgIDEwOCwgMTU4LCA2NiwgIDkxLCAgMTM3LCA1NiwgIDc1LCAgMTE4LCA0NiwgIDU5LCAgOTgsICAzNSwKLSAgICA0MiwgIDc4LCAgMjIsICAxNiwgIDU0LCAgMywgICAwLCAgIDE5LCAgMCwgICAxNDAsIDE5OCwgNjIsICAxMjUsIDE3NywgNTUsCi0gICAgMTA5LCAxNTgsIDQ3LCAgOTIsICAxMzcsIDQwLCAgNzYsICAxMTcsIDMyLCAgNTksICA5OCwgIDIxLCAgNDIsICA3OCwgIDYsCi0gICAgMTYsICA1NCwgIDAsICAgMCwgICAxOCwgIDAsICAgMTE4LCAxODYsIDIzMSwgMTA2LCAxNjcsIDIwNiwgOTMsICAxNDksIDE4NCwKLSAgICA4MSwgIDEzMCwgMTYxLCA2NywgIDExMSwgMTM5LCA1NCwgIDkyLCAgMTE3LCAzOSwgIDcyLCAgOTMsICAxNywgIDQ4LCAgNjYsCi0gICAgMCwgICAxMCwgIDI5LCAgMTIzLCAxODUsIDIwNywgMTEwLCAxNjYsIDE4NiwgOTgsICAxNDgsIDE2NywgODUsICAxMjksIDE0NSwKLSAgICA3MSwgIDExMSwgMTI1LCA1NiwgIDkyLCAgMTA0LCA0MCwgIDcyLCAgODMsICAxOCwgIDQ4LCAgNTcsICAwLCAgIDEwLCAgMjIsCi0gICAgMTI4LCAxODQsIDE4OCwgMTEzLCAxNjUsIDE2OCwgMTAyLCAxNDcsIDE1MSwgODgsICAxMjgsIDEzMSwgNzMsICAxMTAsIDExMywKLSAgICA1OCwgIDkxLCAgOTQsICA0MiwgIDcxLCAgNzQsICAxOSwgIDQ4LCAgNTAsICAwLCAgIDksICAgMTUsICAxMzEsIDE4MywgMTY4LAotICAgIDExNiwgMTY0LCAxNTEsIDEwNCwgMTQ2LCAxMzQsIDg5LCAgMTI3LCAxMTcsIDczLCAgMTA5LCAxMDAsIDU4LCAgOTAsICA4MywKLSAgICA0MiwgIDcxLCAgNjUsICAyMCwgIDQ4LCAgNDIsICAwLCAgIDksICAgNSwgICAxMzQsIDE4MiwgMTQ4LCAxMjAsIDE2MywgMTMxLAotICAgIDEwNSwgMTQ1LCAxMTgsIDkwLCAgMTI2LCAxMDIsIDc1LCAgMTA4LCA4NiwgIDU5LCAgOTAsICA3MiwgIDQzLCAgNzEsICA1NSwKLSAgICAxOSwgIDQ3LCAgMzQsICAwLCAgIDksICAgMCwgICAxMzYsIDE4MSwgMTI4LCAxMjIsIDE2MiwgMTE1LCAxMDcsIDE0NCwgMTAyLAotICAgIDkyLCAgMTI1LCA4NywgIDc2LCAgMTA3LCA3NCwgIDYxLCAgODksICA2MCwgIDQ0LCAgNzAsICA0NSwgIDIwLCAgNDcsICAyNCwKLSAgICAwLCAgIDgsICAgMCwgICAxMzksIDE4MCwgMTA2LCAxMjQsIDE2MSwgOTUsICAxMDksIDE0NCwgODMsICA5MywgIDEyNCwgNzEsCi0gICAgNzcsICAxMDcsIDYwLCAgNjEsICA4OSwgIDQ3LCAgNDQsICA3MCwgIDMzLCAgMjAsICA0NywgIDEzLCAgMCwgICA4LCAgIDAsCi0gICAgMTQyLCAxNzksIDgyLCAgMTI1LCAxNjAsIDcyLCAgMTExLCAxNDMsIDYzLCAgOTQsICAxMjQsIDU0LCAgNzcsICAxMDYsIDQ0LAotICAgIDYxLCAgODgsICAzMiwgIDQ0LCAgNjksICAxOCwgIDIwLCAgNDYsICAwLCAgIDAsICAgOCwgICAwLCAgIDE0MywgMTc5LCA2MiwKLSAgICAxMjcsIDE2MCwgNTQsICAxMTEsIDE0MiwgNDcsICA5NCwgIDEyNCwgMzksICA3OCwgIDEwNiwgMjksICA2MiwgIDg4LCAgMTgsCi0gICAgNDUsICA2OSwgIDMsICAgMjAsICA0NiwgIDAsICAgMCwgICA4LCAgIDAsICAgMTI0LCAxNjcsIDIxNiwgMTEyLCAxNTAsIDE5NCwKLSAgICA5OSwgIDEzNCwgMTc0LCA4NywgIDExNywgMTUzLCA3MywgIDEwMCwgMTMxLCA1OCwgIDgyLCAgMTEwLCA0MywgIDY0LCAgODgsCi0gICAgMjMsICA0MCwgIDYxLCAgMCwgICAwLCAgIDI0LCAgMTI5LCAxNjYsIDE5NSwgMTE2LCAxNTAsIDE3NSwgMTAzLCAxMzQsIDE1OCwKLSAgICA4OSwgIDExNiwgMTM3LCA3NSwgIDk5LCAgMTE4LCA2MCwgIDgyLCAgOTgsICA0NCwgIDYzLCAgNzgsICAyMywgIDQwLCAgNTMsCi0gICAgMCwgICAwLCAgIDE3LCAgMTMyLCAxNjYsIDE3NywgMTE5LCAxNDksIDE2MCwgMTA2LCAxMzMsIDE0MywgOTAsICAxMTUsIDEyNCwKLSAgICA3NiwgIDk5LCAgMTA3LCA2MSwgIDgxLCAgODgsICA0NSwgIDYzLCAgNjksICAyNCwgIDQwLCAgNDYsICAwLCAgIDAsICAgOSwKLSAgICAxMzYsIDE2NiwgMTU5LCAxMjEsIDE0OCwgMTQzLCAxMDcsIDEzMiwgMTI2LCA5MiwgIDExNSwgMTExLCA3NywgIDk4LCAgOTQsCi0gICAgNjIsICA4MSwgIDc4LCAgNDYsICA2MywgIDYwLCAgMjMsICA0MCwgIDM4LCAgMCwgICAwLCAgIDAsICAgMTM4LCAxNjQsIDE0MCwKLSAgICAxMjIsIDE0NywgMTI1LCAxMDgsIDEzMSwgMTExLCA5MywgIDExNCwgOTcsICA3OSwgIDk4LCAgODIsICA2MywgIDgwLCAgNjcsCi0gICAgNDYsICA2MiwgIDUwLCAgMjQsICA0MCwgIDI5LCAgMCwgICAwLCAgIDAsICAgMTM5LCAxNjMsIDEyMiwgMTI0LCAxNDYsIDEwOSwKLSAgICAxMTAsIDEzMSwgOTYsICA5NCwgIDExNCwgODMsICA3OSwgIDk3LCAgNzAsICA2MywgIDgxLCAgNTcsICA0NiwgIDYyLCAgNDEsCi0gICAgMjQsICA0MCwgIDIxLCAgMCwgICAwLCAgIDAsICAgMTQxLCAxNjMsIDEwMSwgMTI2LCAxNDUsIDkwLCAgMTExLCAxMzAsIDc5LAotICAgIDk1LCAgMTEzLCA2OCwgIDc5LCAgOTYsICA1NiwgIDYzLCAgODAsICA0NCwgIDQ3LCAgNjIsICAzMCwgIDIzLCAgNDAsICAxMCwKLSAgICAwLCAgIDAsICAgMCwgICAxNDQsIDE2MiwgNzksICAxMjcsIDE0NSwgNzAsICAxMTIsIDEyOSwgNjAsICA5NSwgIDExMiwgNTEsCi0gICAgNzksICA5NiwgIDQxLCAgNjQsICA3OSwgIDMwLCAgNDcsICA2MSwgIDE1LCAgMjMsICA0MCwgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgMTQ1LCAxNjIsIDYwLCAgMTI5LCAxNDUsIDUyLCAgMTEzLCAxMjksIDQ2LCAgOTYsICAxMTIsIDM3LCAgNzksICA5NSwgIDI3LAotICAgIDY0LCAgNzksICAxNiwgIDQ3LCAgNjEsICAxLCAgIDIzLCAgMzksICAwLCAgIDAsICAgMCwgICAwLCAgIDEzMSwgMTQ3LCAyMDIsCi0gICAgMTE3LCAxMzMsIDE4MSwgMTA1LCAxMTksIDE2MiwgOTEsICAxMDMsIDE0MiwgNzcsICA4NywgIDEyMiwgNjIsICA3MSwgIDEwMiwKLSAgICA0NywgIDU0LCAgODEsICAyNiwgIDMxLCAgNTYsICAwLCAgIDAsICAgMTgsICAxMzUsIDE0NywgMTgzLCAxMjAsIDEzMiwgMTY0LAotICAgIDEwNywgMTE4LCAxNDcsIDkzLCAgMTAyLCAxMjgsIDc4LCAgODcsICAxMTAsIDYzLCAgNzEsICA5MiwgIDQ3LCAgNTQsICA3MiwKLSAgICAyNiwgIDMxLCAgNDgsICAwLCAgIDAsICAgMTAsICAxMzgsIDE0NywgMTY2LCAxMjMsIDEzMSwgMTQ5LCAxMDgsIDExOCwgMTMzLAotICAgIDk0LCAgMTAyLCAxMTYsIDc5LCAgODYsICAxMDAsIDY0LCAgNzEsICA4MiwgIDQ4LCAgNTQsICA2NCwgIDI3LCAgMzEsICA0MSwKLSAgICAwLCAgIDAsICAgMiwgICAxMzksIDE0NiwgMTQ5LCAxMjQsIDEzMSwgMTM0LCAxMTEsIDExNywgMTE5LCA5NCwgIDEwMSwgMTAzLAotICAgIDc5LCAgODYsICA4OCwgIDY0LCAgNzAsICA3MiwgIDQ4LCAgNTMsICA1NSwgIDI3LCAgMzEsICAzMywgIDAsICAgMCwgICAwLAotICAgIDE0MSwgMTQ2LCAxMzIsIDEyNSwgMTMxLCAxMTcsIDExMSwgMTE3LCAxMDQsIDk1LCAgMTAxLCA5MSwgIDgwLCAgODYsICA3NywKLSAgICA2NSwgIDcwLCAgNjIsICA0OCwgIDUzLCAgNDYsICAyNiwgIDMxLCAgMjUsICAwLCAgIDAsICAgMCwgICAxNDMsIDE0NSwgMTE1LAotICAgIDEyNiwgMTMwLCAxMDEsIDExMiwgMTE2LCA5MCwgIDk2LCAgMTAwLCA3OCwgIDgwLCAgODUsICA2NSwgIDY1LCAgNzAsICA1MiwKLSAgICA0OSwgIDUzLCAgMzcsICAyNywgIDMyLCAgMTcsICAwLCAgIDAsICAgMCwgICAxNDQsIDE0NCwgOTYsICAxMjgsIDEyOSwgODUsCi0gICAgMTEyLCAxMTUsIDc1LCAgOTcsICAxMDAsIDY0LCAgODEsICA4NSwgIDUyLCAgNjUsICA2OSwgIDQwLCAgNDksICA1MywgIDI2LAotICAgIDI2LCAgMzEsICA1LCAgIDAsICAgMCwgICAwLCAgIDE0NiwgMTQ0LCA3NiwgIDEyOSwgMTI5LCA2NywgIDExNCwgMTE1LCA1OCwKLSAgICA5NywgIDk5LCAgNDgsICA4MiwgIDg0LCAgMzgsICA2NiwgIDY5LCAgMjcsICA0OSwgIDUzLCAgMTIsICAyNiwgIDMyLCAgMCwKLSAgICAwLCAgIDAsICAgMCwgICAxNDYsIDE0NCwgNTksICAxMzAsIDEyOCwgNTEsICAxMTQsIDExNCwgNDMsICA5OCwgIDk5LCAgMzUsCi0gICAgODIsICA4NCwgIDI1LCAgNjYsICA2OSwgIDEzLCAgNDksICA1MywgIDAsICAgMjYsICAzMiwgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgMTM1LCAxMjksIDE4OSwgMTIyLCAxMTUsIDE3MCwgMTA3LCAxMDMsIDE1MiwgOTQsICA4OSwgIDEzMywgNzksICA3NCwgIDExNCwKLSAgICA2NCwgIDYwLCAgOTUsICA0OSwgIDQzLCAgNzUsICAyOSwgIDIwLCAgNTEsICAwLCAgIDAsICAgMTIsICAxMzgsIDEyOSwgMTcxLAotICAgIDEyNCwgMTE1LCAxNTMsIDExMCwgMTAzLCAxMzgsIDk1LCAgODksICAxMjAsIDgxLCAgNzQsICAxMDMsIDY2LCAgNjAsICA4NiwKLSAgICA1MCwgIDQ0LCAgNjcsICAyOCwgIDIxLCAgNDMsICAwLCAgIDAsICAgMywgICAxNDAsIDEyOSwgMTU2LCAxMjUsIDExNSwgMTQwLAotICAgIDExMSwgMTAzLCAxMjUsIDk2LCAgODksICAxMDksIDgxLCAgNzQsICA5MywgIDY3LCAgNjAsICA3NiwgIDUwLCAgNDQsICA1OSwKLSAgICAyOSwgIDIyLCAgMzYsICAwLCAgIDAsICAgMCwgICAxNDIsIDEyOCwgMTQwLCAxMjcsIDExNSwgMTI1LCAxMTIsIDEwMiwgMTEyLAotICAgIDk3LCAgODgsICA5NywgIDgyLCAgNzQsICA4MywgIDY3LCAgNjAsICA2NywgIDUwLCAgNDQsICA1MSwgIDI5LCAgMjIsICAyOSwKLSAgICAwLCAgIDAsICAgMCwgICAxNDIsIDEyOCwgMTI0LCAxMjcsIDExNCwgMTExLCAxMTMsIDEwMiwgOTgsICA5OCwgIDg4LCAgODUsCi0gICAgODIsICA3NCwgIDcxLCAgNjYsICA2MCwgIDU4LCAgNTAsICA0NCwgIDQyLCAgMjksICAyMiwgIDIxLCAgMCwgICAwLCAgIDAsCi0gICAgMTQ0LCAxMjcsIDEwOCwgMTI4LCAxMTQsIDk2LCAgMTEzLCAxMDEsIDg1LCAgOTgsICA4NywgIDczLCAgODIsICA3NCwgIDYxLAotICAgIDY3LCAgNjAsICA0OCwgIDUwLCAgNDQsICAzMywgIDI4LCAgMjMsICAxMiwgIDAsICAgMCwgICAwLCAgIDE0NSwgMTI3LCA5MSwKLSAgICAxMjksIDExNCwgODEsICAxMTUsIDEwMSwgNzEsICA5OCwgIDg3LCAgNjAsICA4MiwgIDczLCAgNDgsICA2NywgIDU5LCAgMzcsCi0gICAgNTAsICA0NCwgIDIyLCAgMjksICAyMywgIDEsICAgMCwgICAwLCAgIDAsICAgMTQ3LCAxMjcsIDczLCAgMTMwLCAxMTMsIDYzLAotICAgIDExNSwgMTAxLCA1NSwgIDk4LCAgODcsICA0NSwgIDgzLCAgNzMsICAzNSwgIDY3LCAgNTksICAyNCwgIDUwLCAgNDQsICAxMCwKLSAgICAyOCwgIDI0LCAgMCwgICAwLCAgIDAsICAgMCwgICAxNDcsIDEyNywgNTgsICAxMzEsIDExMywgNDksICAxMTUsIDEwMCwgNDIsCi0gICAgOTksICA4NiwgIDMzLCAgODMsICA3MywgIDIzLCAgNjcsICA1OSwgIDEwLCAgNTAsICA0NCwgIDAsICAgMjcsICAyNCwgIDAsCi0gICAgMCwgICAwLCAgIDAsICAgMTM4LCAxMTAsIDE3NywgMTI0LCA5OSwgIDE1OSwgMTEwLCA4OCwgIDE0MiwgOTYsICA3NSwgIDEyNSwKLSAgICA4MiwgIDYyLCAgMTA3LCA2NiwgIDQ4LCAgODksICA1MSwgIDMzLCAgNzAsICAzMCwgIDgsICAgNDYsICAwLCAgIDAsICAgNSwKLSAgICAxNDIsIDExMSwgMTYwLCAxMjcsIDk5LCAgMTQ0LCAxMTMsIDg4LCAgMTMwLCA5OCwgIDc1LCAgMTEyLCA4MiwgIDYyLCAgOTYsCi0gICAgNjgsICA0OSwgIDgwLCAgNTEsICAzMywgIDYxLCAgMzAsICAxMCwgIDM5LCAgMCwgICAwLCAgIDAsICAgMTQzLCAxMTEsIDE0NiwKLSAgICAxMjgsIDk5LCAgMTMxLCAxMTQsIDg4LCAgMTE4LCA5OCwgIDc1LCAgMTAxLCA4MywgIDYyLCAgODYsICA2OCwgIDQ5LCAgNzEsCi0gICAgNTIsICAzMywgIDU0LCAgMzAsICAxMSwgIDMyLCAgMCwgICAwLCAgIDAsICAgMTQ0LCAxMTEsIDEzMiwgMTI4LCA5OSwgIDExOCwKLSAgICAxMTMsIDg4LCAgMTA2LCA5OSwgIDc1LCAgOTEsICA4MywgIDYyLCAgNzcsICA2OCwgIDQ5LCAgNjIsICA1MiwgIDM0LCAgNDYsCi0gICAgMzAsICAxMiwgIDI1LCAgMCwgICAwLCAgIDAsICAgMTQ0LCAxMTEsIDExNywgMTI5LCA5OCwgIDEwNCwgMTE0LCA4NywgIDkyLAotICAgIDk5LCAgNzUsICA4MCwgIDgzLCAgNjIsICA2NywgIDY4LCAgNDksICA1MywgIDUxLCAgMzQsICAzOCwgIDMwLCAgMTMsICAxOCwKLSAgICAwLCAgIDAsICAgMCwgICAxNDUsIDExMSwgMTAzLCAxMzAsIDk4LCAgOTEsICAxMTQsIDg3LCAgODAsICA5OSwgIDc1LCAgNjgsCi0gICAgODMsICA2MywgIDU3LCAgNjgsICA1MCwgIDQ1LCAgNTEsICAzNCwgIDMwLCAgMzAsICAxNCwgIDgsICAgMCwgICAwLCAgIDAsCi0gICAgMTQ2LCAxMTAsIDg3LCAgMTMxLCA5OCwgIDc2LCAgMTE1LCA4NywgIDY3LCAgOTksICA3NSwgIDU2LCAgODMsICA2MiwgIDQ1LAotICAgIDY4LCAgNDksICAzMywgIDUyLCAgMzUsICAxOSwgIDMwLCAgMTUsICAyLCAgIDAsICAgMCwgICAwLCAgIDE0OCwgMTEwLCA3MCwKLSAgICAxMzEsIDk4LCAgNjAsICAxMTYsIDg2LCAgNTIsICA5OSwgIDc0LCAgNDMsICA4NCwgIDYyLCAgMzMsICA2OSwgIDQ5LCAgMjEsCi0gICAgNTIsICAzNSwgIDYsICAgMjksICAxNSwgIDAsICAgMCwgICAwLCAgIDAsICAgMTQ4LCAxMTAsIDU2LCAgMTMyLCA5NywgIDQ4LAotICAgIDExNywgODcsICA0MCwgIDEwMCwgNzUsICAzMSwgIDg0LCAgNjIsICAyMiwgIDY4LCAgNDksICA5LCAgIDUxLCAgMzUsICAwLAotICAgIDI4LCAgMTUsICAwLCAgIDAsICAgMCwgICAwLCAgIDE0MiwgOTEsICAxNjYsIDEyNiwgODAsICAxNDgsIDExMywgNzEsICAxMzIsCi0gICAgOTgsICA1OSwgIDExNSwgODMsICA0NywgIDk5LCAgNjksICAzNCwgIDgyLCAgNTMsICAxNywgIDY0LCAgMzIsICAwLCAgIDQxLAotICAgIDAsICAgMCwgICAwLCAgIDE0MywgOTEsICAxNTAsIDEyOCwgODEsICAxMzUsIDExNCwgNzEsICAxMjAsIDk5LCAgNjAsICAxMDQsCi0gICAgODUsICA0OCwgIDg5LCAgNjksICAzNSwgIDczLCAgNTMsICAxOSwgIDU2LCAgMzIsICAwLCAgIDM0LCAgMCwgICAwLCAgIDAsCi0gICAgMTQ1LCA5MSwgIDEzNywgMTI5LCA4MSwgIDEyMiwgMTE1LCA3MSwgIDEwOSwgMTAwLCA2MCwgIDk0LCAgODUsICA0OCwgIDgxLAotICAgIDY5LCAgMzUsICA2NSwgIDUzLCAgMTksICA0OSwgIDMyLCAgMCwgICAyOCwgIDAsICAgMCwgICAwLCAgIDE0NiwgOTIsICAxMjQsCi0gICAgMTMwLCA4MSwgIDExMCwgMTE1LCA3MSwgIDk4LCAgMTAwLCA2MCwgIDg0LCAgODUsICA0OSwgIDcxLCAgNjksICAzNiwgIDU3LAotICAgIDUzLCAgMjEsICA0MiwgIDMyLCAgMCwgICAyMSwgIDAsICAgMCwgICAwLCAgIDE0NywgOTEsICAxMTAsIDEzMCwgODEsICA5NywKLSAgICAxMTUsIDcxLCAgODYsICAxMDAsIDYwLCAgNzQsICA4NCwgIDQ5LCAgNjIsICA2OSwgIDM2LCAgNDgsICA1MywgIDIyLCAgMzQsCi0gICAgMzIsICAwLCAgIDEzLCAgMCwgICAwLCAgIDAsICAgMTQ3LCA5MiwgIDk3LCAgMTMwLCA4MSwgIDg1LCAgMTE2LCA3MiwgIDc2LAotICAgIDEwMCwgNjAsICA2MywgIDg1LCAgNDksICA1MiwgIDY5LCAgMzcsICA0MCwgIDUzLCAgMjIsICAyNiwgIDMxLCAgMSwgICA1LAotICAgIDAsICAgMCwgICAwLCAgIDE0OCwgOTIsICA4MiwgIDEzMSwgODEsICA3MSwgIDExNiwgNzEsICA2MiwgIDEwMCwgNjAsICA1MywKLSAgICA4NCwgIDQ5LCAgNDIsICA2OSwgIDM3LCAgMzAsICA1MiwgIDIzLCAgMTYsICAzMSwgIDIsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAxNDgsIDkxLCAgNjcsICAxMzIsIDgxLCAgNTcsICAxMTcsIDcxLCAgNDksICAxMDAsIDYwLCAgMzksICA4NCwgIDQ5LCAgMzAsCi0gICAgNjksICAzNywgIDE4LCAgNTIsICAyMywgIDIsICAgMzAsICAyLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTQ5LCA5MSwgIDU0LAotICAgIDEzMiwgODEsICA0NiwgIDExOCwgNzEsICAzOSwgIDEwMSwgNjAsICAyOSwgIDg1LCAgNDksICAxOSwgIDY5LCAgMzcsICA2LAotICAgIDUyLCAgMjMsICAwLCAgIDI5LCAgMywgICAwLCAgIDAsICAgMCwgICAwLCAgIDE0MywgNjgsICAxNTMsIDEyOCwgNTksICAxMzcsCi0gICAgMTE1LCA0OSwgIDEyMiwgOTksICAzOSwgIDEwNywgODUsICAyOCwgIDkxLCAgNzAsICAxMywgIDc1LCAgNTQsICAwLCAgIDU4LAotICAgIDMyLCAgMCwgICAzNiwgIDAsICAgMCwgICAwLCAgIDE0NiwgNjgsICAxNDAsIDEzMSwgNTksICAxMjUsIDExNiwgNTEsICAxMTEsCi0gICAgMTAwLCA0MCwgIDk3LCAgODUsICAyOSwgIDgyLCAgNzAsICAxNSwgIDY3LCAgNTQsICAwLCAgIDUwLCAgMzIsICAwLCAgIDI5LAotICAgIDAsICAgMCwgICAwLCAgIDE0NywgNjgsICAxMjcsIDEzMSwgNTksICAxMTQsIDExNywgNTEsICAxMDIsIDEwMSwgNDEsICA4OCwKLSAgICA4NiwgIDMwLCAgNzQsICA3MCwgIDE3LCAgNjAsICA1NCwgIDAsICAgNDQsICAzMiwgIDAsICAgMjMsICAwLCAgIDAsICAgMCwKLSAgICAxNDcsIDcwLCAgMTE1LCAxMzEsIDYwLCAgMTAzLCAxMTYsIDUyLCAgOTEsICAxMDAsIDQyLCAgNzgsICA4NSwgIDMyLCAgNjUsCi0gICAgNzAsICAxOSwgIDUzLCAgNTQsICAxLCAgIDM4LCAgMzIsICAwLCAgIDE3LCAgMCwgICAwLCAgIDAsICAgMTQ3LCA3MCwgIDEwMywKLSAgICAxMzEsIDYxLCAgOTEsICAxMTcsIDUzLCAgODEsICAxMDEsIDQzLCAgNjksICA4NiwgIDMyLCAgNTcsICA3MCwgIDIwLCAgNDQsCi0gICAgNTQsICAyLCAgIDMwLCAgMzIsICAwLCAgIDcsICAgMCwgICAwLCAgIDAsICAgMTQ4LCA3MCwgIDkxLCAgMTMyLCA2MSwgIDgwLAotICAgIDExNywgNTIsICA3MCwgIDEwMSwgNDMsICA1OSwgIDg1LCAgMzMsICA0OCwgIDcwLCAgMjEsICAzNiwgIDUzLCAgNCwgICAyMiwKLSAgICAzMiwgIDAsICAgMywgICAwLCAgIDAsICAgMCwgICAxNDgsIDcwLCAgNzgsICAxMzIsIDYyLCAgNjgsICAxMTcsIDUzLCAgNTgsCi0gICAgMTAxLCA0MywgIDQ4LCAgODUsICAzNCwgIDM4LCAgNzAsICAyMiwgIDI2LCAgNTMsICA2LCAgIDEyLCAgMzEsICAwLCAgIDAsCi0gICAgMCwgICAwLCAgIDAsICAgMTQ5LCA3MSwgIDY0LCAgMTMyLCA2MiwgIDU0LCAgMTE4LCA1NCwgIDQ2LCAgMTAxLCA0NCwgIDM3LAotICAgIDg1LCAgMzQsICAyNywgIDY5LCAgMjMsICAxNSwgIDUzLCAgNywgICAxLCAgIDMwLCAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgIDE1MCwgNzAsICA1MywgIDEzNCwgNjEsICA0NCwgIDExOCwgNTQsICAzNiwgIDEwMSwgNDQsICAyOCwgIDg1LCAgMzUsICAxNywKLSAgICA2OSwgIDIzLCAgNCwgICA1MiwgIDgsICAgMCwgICAzMCwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxNDUsIDM4LCAgMTQzLAotICAgIDEzMCwgMjksICAxMjgsIDExNywgMTgsICAxMTQsIDEwMSwgMywgICA5OCwgIDg3LCAgMCwgICA4NCwgIDcyLCAgMCwgICA2OSwKLSAgICA1NCwgIDAsICAgNTMsICAzMCwgIDAsICAgMzEsICAwLCAgIDAsICAgMCwgICAxNDcsIDM4LCAgMTMwLCAxMzIsIDMwLCAgMTE2LAotICAgIDExNywgMjIsICAxMDMsIDEwMSwgOCwgICA4OSwgIDg3LCAgMCwgICA3NiwgIDcyLCAgMCwgICA2MiwgIDU0LCAgMCwgICA0NiwKLSAgICAzMCwgIDAsICAgMjQsICAwLCAgIDAsICAgMCwgICAxNDgsIDQwLCAgMTE5LCAxMzIsIDMxLCAgMTA1LCAxMTcsIDIzLCAgOTQsCi0gICAgMTAxLCAxMywgIDgxLCAgODcsICAwLCAgIDY4LCAgNzEsICAwLCAgIDU1LCAgNTQsICAwLCAgIDM5LCAgMzAsICAwLCAgIDE4LAotICAgIDAsICAgMCwgICAwLCAgIDE0OCwgNDIsICAxMDgsIDEzMiwgMzQsICA5NiwgIDExNywgMjUsICA4NSwgIDEwMiwgMTUsICA3MywKLSAgICA4NiwgIDIsICAgNjAsICA3MSwgIDAsICAgNDcsICA1NCwgIDAsICAgMzMsICAzMCwgIDAsICAgMTEsICAwLCAgIDAsICAgMCwKLSAgICAxNDgsIDQzLCAgOTYsICAxMzMsIDM1LCAgODUsICAxMTcsIDI4LCAgNzUsICAxMDIsIDE4LCAgNjQsICA4NywgIDUsICAgNTIsCi0gICAgNzEsICAwLCAgIDQwLCAgNTQsICAwLCAgIDI1LCAgMzAsICAwLCAgIDUsICAgMCwgICAwLCAgIDAsICAgMTQ5LCA0NCwgIDg1LAotICAgIDEzMiwgMzYsICA3NSwgIDExOCwgMjksICA2NiwgIDEwMSwgMjAsICA1NSwgIDg2LCAgOCwgICA0NCwgIDcwLCAgMCwgICAzMiwKLSAgICA1MywgIDAsICAgMTgsICAyOSwgIDAsICAgMiwgICAwLCAgIDAsICAgMCwgICAxNDksIDQ1LCAgNzQsICAxMzMsIDM3LCAgNjQsCi0gICAgMTE4LCAzMSwgIDU1LCAgMTAyLCAyMSwgIDQ1LCAgODUsICAxMCwgIDM0LCAgNzAsICAwLCAgIDIyLCAgNTMsICAwLCAgIDYsCi0gICAgMjgsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTUwLCA0NiwgIDYxLCAgMTMzLCAzOSwgIDUyLCAgMTE4LCAzMSwgIDQ0LAotICAgIDEwMiwgMjMsICAzNCwgIDg1LCAgMTIsICAyNCwgIDcwLCAgMCwgICAxMiwgIDUyLCAgMCwgICAwLCAgIDI4LCAgMCwgICAwLAotICAgIDAsICAgMCwgICAwLCAgIDE1MCwgNDYsICA1MSwgIDEzMywgNDAsICA0MiwgIDExOSwgMzIsICAzNSwgIDEwMiwgMjQsICAyNSwKLSAgICA4NSwgIDEzLCAgMTQsICA3MCwgIDAsICAgMSwgICA1MiwgIDAsICAgMCwgICAyNywgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICA1MywgIDE5OCwgMjQ0LCA0OSwgIDE3NywgMjE4LCA0MSwgIDE1OCwgMTk1LCAzMiwgIDEzOCwgMTcxLCAyMiwgIDExOCwgMTQ3LAotICAgIDExLCAgOTgsICAxMjQsIDAsICAgNzgsICAxMDAsIDAsICAgNTQsICA3MSwgIDAsICAgMTgsICAzNCwgIDY5LCAgMTk2LCAyMjAsCi0gICAgNjQsICAxNzUsIDE5NiwgNTQsICAxNTcsIDE3NiwgNDUsICAxMzcsIDE1NCwgMzIsICAxMTcsIDEzMywgMTksICA5OCwgIDExMSwKLSAgICAwLCAgIDc4LCAgODksICAwLCAgIDUzLCAgNjMsICAwLCAgIDE3LCAgMjcsICA4MCwgIDE5NSwgMTk4LCA2OSwgIDE3NSwgMTc5LAotICAgIDYwLCAgMTU2LCAxNTksIDUwLCAgMTM2LCAxMzksIDM4LCAgMTE2LCAxMjAsIDI1LCAgOTgsICAxMDEsIDQsICAgNzcsICA4MCwKLSAgICAwLCAgIDUzLCAgNTUsICAwLCAgIDE3LCAgMjEsICA4NCwgIDE5MywgMTc3LCA3NSwgIDE3MywgMTU5LCA2NCwgIDE1NSwgMTQyLAotICAgIDU1LCAgMTM1LCAxMjQsIDQxLCAgMTE2LCAxMDcsIDI3LCAgOTcsICA4OSwgIDksICAgNzYsICA3MCwgIDAsICAgNTMsICA0NywKLSAgICAwLCAgIDE3LCAgMTEsICA4OSwgIDE5MywgMTU3LCA3OSwgIDE3MiwgMTQwLCA3MCwgIDE1NCwgMTI1LCA1NywgIDEzNCwgMTA5LAotICAgIDQ0LCAgMTE1LCA5MiwgIDMyLCAgOTYsICA3NiwgIDEzLCAgNzYsICA1OSwgIDAsICAgNTIsICAzOSwgIDAsICAgMTYsICA0LAotICAgIDk0LCAgMTkxLCAxMzUsIDg1LCAgMTcxLCAxMjEsIDcyLCAgMTUyLCAxMDgsIDYwLCAgMTMzLCA5NCwgIDQ3LCAgMTE0LCA4MCwKLSAgICAzMiwgIDk1LCAgNjUsICAxNSwgIDc2LCAgNDksICAwLCAgIDUyLCAgMjksICAwLCAgIDE2LCAgMCwgICA5OCwgIDE5MCwgMTEzLAotICAgIDg3LCAgMTcwLCAxMDAsIDc2LCAgMTUyLCA4OSwgIDYyLCAgMTMyLCA3NywgIDQ5LCAgMTEzLCA2NSwgIDM1LCAgOTUsICA1MiwKLSAgICAxOCwgIDc1LCAgMzcsICAwLCAgIDUyLCAgMTgsICAwLCAgIDE1LCAgMCwgICAxMDMsIDE5MCwgODksICA5MCwgIDE2OSwgODAsCi0gICAgNzgsICAxNTEsIDcwLCAgNjQsICAxMzIsIDYwLCAgNTEsICAxMTMsIDQ5LCAgMzcsICA5NCwgIDM4LCAgMjAsICA3NSwgIDI1LAotICAgIDAsICAgNTIsICA1LCAgIDAsICAgMTUsICAwLCAgIDEwNiwgMTg5LCA2OSwgIDkzLCAgMTY5LCA2MSwgIDgwLCAgMTUxLCA1MywKLSAgICA2NiwgIDEzMSwgNDUsICA1MiwgIDExMywgMzYsICAzNywgIDk0LCAgMjUsICAxOSwgIDc0LCAgMTEsICAwLCAgIDUxLCAgMCwKLSAgICAwLCAgIDE1LCAgMCwgICA3NiwgIDE3OCwgMjI5LCA2OCwgIDE1OSwgMjA1LCA2MSwgIDE0MiwgMTgzLCA1MCwgIDEyNCwgMTYwLAotICAgIDQwLCAgMTA2LCAxMzgsIDI4LCAgODgsICAxMTYsIDEyLCAgNjksICA5MywgIDAsICAgNDUsICA2NiwgIDAsICAgNSwgICAyOSwKLSAgICA4NiwgIDE3NywgMjA3LCA3OCwgIDE1OCwgMTg0LCA2NywgIDE0MiwgMTY2LCA1NiwgIDEyMywgMTQ1LCA0NSwgIDEwNiwgMTI1LAotICAgIDMxLCAgODgsICAxMDUsIDE2LCAgNjksICA4MywgIDAsICAgNDUsICA1OCwgIDAsICAgNiwgICAyMiwgIDkzLCAgMTc2LCAxODcsCi0gICAgODEsICAxNTgsIDE2OCwgNzEsICAxNDEsIDE1MCwgNjEsICAxMjMsIDEzMSwgNDcsICAxMDUsIDExMywgMzUsICA4NywgIDk0LAotICAgIDIwLCAgNjgsICA3NCwgIDAsICAgNDUsICA1MSwgIDAsICAgNSwgICAxNiwgIDk4LCAgMTc1LCAxNjgsIDg0LCAgMTU3LCAxNTAsCi0gICAgNzUsICAxNDAsIDEzNCwgNjMsICAxMjIsIDExNywgNTAsICAxMDQsIDEwMCwgMzcsICA4NywgIDgzLCAgMjEsICA2OCwgIDY1LAotICAgIDAsICAgNDUsICA0MiwgIDAsICAgNCwgICA3LCAgIDEwMCwgMTc0LCAxNDksIDg5LCAgMTU1LCAxMzIsIDc2LCAgMTM5LCAxMTcsCi0gICAgNjUsICAxMjEsIDEwMiwgNTMsICAxMDQsIDg3LCAgMzksICA4NiwgIDcyLCAgMjMsICA2NywgIDU1LCAgMCwgICA0NSwgIDM0LAotICAgIDAsICAgMywgICAwLCAgIDEwMywgMTczLCAxMzAsIDkyLCAgMTU1LCAxMTUsIDgwLCAgMTM4LCAxMDIsIDY4LCAgMTIwLCA4OCwKLSAgICA1MywgIDEwMywgNzUsICA0MCwgIDg2LCAgNjEsICAyNCwgIDY3LCAgNDUsICAwLCAgIDQ1LCAgMjUsICAwLCAgIDMsICAgMCwKLSAgICAxMDcsIDE3MiwgMTA4LCA5NSwgIDE1NCwgOTYsICA4MiwgIDEzNywgODUsICA3MCwgIDExOSwgNzMsICA1NSwgIDEwMiwgNjEsCi0gICAgNDIsICA4NSwgIDQ5LCAgMjUsICA2NywgIDM0LCAgMCwgICA0NSwgIDE0LCAgMCwgICAzLCAgIDAsICAgMTEwLCAxNzIsIDg2LAotICAgIDk3LCAgMTUzLCA3NiwgIDg1LCAgMTM3LCA2NywgIDcwLCAgMTE5LCA1NywgIDU2LCAgMTAyLCA0NiwgIDQyLCAgODQsICAzNSwKLSAgICAyNiwgIDY2LCAgMjEsICAwLCAgIDQ0LCAgMSwgICAwLCAgIDMsICAgMCwgICAxMTIsIDE3MSwgNjcsICA5OCwgIDE1MywgNTksCi0gICAgODYsICAxMzcsIDUyLCAgNzEsICAxMTksIDQ0LCAgNTgsICAxMDIsIDM0LCAgNDQsICA4NSwgIDIyLCAgMjcsICA2NiwgIDcsCi0gICAgMCwgICA0NCwgIDAsICAgMCwgICAzLCAgIDAsICAgOTAsICAxNjAsIDIxNSwgODEsICAxNDQsIDE5MywgNzAsICAxMjksIDE3MywKLSAgICA2MSwgIDExMiwgMTUxLCA0OSwgIDk1LCAgMTMxLCAzNywgIDc5LCAgMTA5LCAyMiwgIDYxLCAgODcsICAwLCAgIDM4LCAgNjEsCi0gICAgMCwgICAwLCAgIDI1LCAgOTYsICAxNjAsIDE5NCwgODYsICAxNDMsIDE3NCwgNzUsICAxMjgsIDE1NywgNjUsICAxMTIsIDEzNywKLSAgICA1MywgIDk1LCAgMTE3LCA0MCwgIDc4LCAgOTgsICAyNSwgIDYwLCAgNzgsICAwLCAgIDM4LCAgNTMsICAwLCAgIDAsICAgMTcsCi0gICAgMTAwLCAxNTksIDE3NywgODksICAxNDMsIDE1OSwgNzksICAxMjgsIDE0MywgNjcsICAxMTEsIDEyNCwgNTUsICA5NSwgIDEwNywKLSAgICA0MiwgIDc4LCAgODksICAyNywgIDYwLCAgNzAsICAyLCAgIDM4LCAgNDYsICAwLCAgIDAsICAgOSwgICAxMDQsIDE1OCwgMTU5LAotICAgIDkyLCAgMTQyLCAxNDMsIDgxLCAgMTI3LCAxMjcsIDY5LCAgMTEwLCAxMTAsIDU2LCAgOTQsICA5NCwgIDQzLCAgNzgsICA3OCwKLSAgICAyOCwgIDYwLCAgNjAsICAyLCAgIDM4LCAgMzgsICAwLCAgIDAsICAgMSwgICAxMDcsIDE1NywgMTQwLCA5NCwgIDE0MSwgMTI1LAotICAgIDgyLCAgMTI2LCAxMTIsIDcxLCAgMTEwLCA5NywgIDU5LCAgOTQsICA4MiwgIDQ1LCAgNzcsICA2NywgIDI5LCAgNTksICA1MSwKLSAgICA0LCAgIDM3LCAgMzAsICAwLCAgIDAsICAgMCwgICAxMTAsIDE1NiwgMTIyLCA5NywgIDE0MCwgMTA5LCA4NSwgIDEyNSwgOTcsCi0gICAgNzIsICAxMDksIDgzLCAgNTgsICA5MywgIDcxLCAgNDUsICA3NywgIDU3LCAgMjksICA2MCwgIDQyLCAgNSwgICAzOCwgIDIyLAotICAgIDAsICAgMCwgICAwLCAgIDExMSwgMTU2LCAxMDMsIDk5LCAgMTM5LCA5MSwgIDg3LCAgMTI1LCA4MSwgIDczLCAgMTA4LCA2OSwKLSAgICA2MCwgIDkyLCAgNTgsICA0NiwgIDc3LCAgNDUsICAzMCwgIDU5LCAgMzEsICA1LCAgIDM4LCAgMTIsICAwLCAgIDAsICAgMCwKLSAgICAxMTUsIDE1NiwgODIsICAxMDEsIDE0MCwgNzMsICA4OCwgIDEyNCwgNjMsICA3NCwgIDEwOCwgNTMsICA2MCwgIDkyLCAgNDQsCi0gICAgNDYsICA3NiwgIDMyLCAgMzEsICA1OSwgIDE4LCAgNiwgICAzNywgIDAsICAgMCwgICAwLCAgIDAsICAgMTE2LCAxNTUsIDY1LAotICAgIDEwMiwgMTM5LCA1OCwgIDg5LCAgMTI0LCA0OSwgIDc1LCAgMTA4LCA0MSwgIDYxLCAgOTIsICAzMiwgIDQ4LCAgNzYsICAyMSwKLSAgICAzMSwgIDU5LCAgNiwgICA1LCAgIDM3LCAgMCwgICAwLCAgIDAsICAgMCwgICAxMDAsIDE0MSwgMjAxLCA4OCwgIDEyNywgMTgxLAotICAgIDc5LCAgMTE0LCAxNjIsIDY5LCAgOTksICAxNDIsIDU3LCAgODMsICAxMjIsIDQ0LCAgNjgsICAxMDIsIDMwLCAgNTEsICA4MSwKLSAgICA3LCAgIDI4LCAgNTYsICAwLCAgIDAsICAgMTksICAxMDUsIDE0MSwgMTgyLCA5NCwgIDEyNywgMTYzLCA4MywgIDExNCwgMTQ2LAotICAgIDcxLCAgOTgsICAxMjgsIDU5LCAgODMsICAxMTAsIDQ2LCAgNjgsICA5MSwgIDMxLCAgNTEsICA3MiwgIDEwLCAgMjgsICA0OCwKLSAgICAwLCAgIDAsICAgMTEsICAxMDgsIDE0MSwgMTY2LCA5NiwgIDEyNywgMTQ5LCA4NSwgIDExMywgMTMzLCA3MywgIDk4LCAgMTE2LAotICAgIDYwLCAgODMsICA5OSwgIDQ2LCAgNjgsICA4MiwgIDMyLCAgNTEsICA2NCwgIDExLCAgMjksICA0MSwgIDAsICAgMCwgICAyLAotICAgIDExMSwgMTQxLCAxNDksIDk4LCAgMTI2LCAxMzQsIDg4LCAgMTEyLCAxMTksIDc0LCAgOTcsICAxMDMsIDYxLCAgODMsICA4OCwKLSAgICA0OCwgIDY3LCAgNzIsICAzMywgIDUxLCAgNTYsICAxMSwgIDI5LCAgMzQsICAwLCAgIDAsICAgMCwgICAxMTIsIDE0MCwgMTMyLAotICAgIDEwMCwgMTI1LCAxMTgsIDg5LCAgMTEyLCAxMDUsIDc1LCAgOTcsICA5MSwgIDYyLCAgODIsICA3NywgIDQ5LCAgNjgsICA2MiwKLSAgICAzMywgIDUxLCAgNDcsICAxMiwgIDI5LCAgMjYsICAwLCAgIDAsICAgMCwgICAxMTUsIDE0MCwgMTE2LCAxMDIsIDEyNSwgMTAzLAotICAgIDkwLCAgMTExLCA5MSwgIDc2LCAgOTYsICA3OCwgIDYyLCAgODIsICA2NSwgIDQ5LCAgNjcsICA1MiwgIDM0LCAgNTEsICAzOCwKLSAgICAxMywgIDI5LCAgMTgsICAwLCAgIDAsICAgMCwgICAxMTcsIDEzOSwgOTcsICAxMDMsIDEyNCwgODcsICA5MSwgIDExMSwgNzcsCi0gICAgNzgsICA5NiwgIDY1LCAgNjMsICA4MSwgIDU0LCAgNDksICA2NywgIDQxLCAgMzQsICA1MSwgIDI3LCAgMTIsICAyOSwgIDcsCi0gICAgMCwgICAwLCAgIDAsICAgMTE5LCAxMzgsIDc4LCAgMTA1LCAxMjQsIDY5LCAgOTIsICAxMTAsIDYwLCAgNzgsICA5NSwgIDUwLAotICAgIDY1LCAgODEsICA0MCwgIDUwLCAgNjcsICAyOSwgIDM0LCAgNTEsICAxNSwgIDEzLCAgMzAsICAwLCAgIDAsICAgMCwgICAwLAotICAgIDEyMCwgMTM4LCA2NCwgIDEwNiwgMTI0LCA1NCwgIDkzLCAgMTEwLCA0NywgIDc4LCAgOTUsICAzOCwgIDY1LCAgODEsICAyOSwKLSAgICA1MCwgIDY2LCAgMTcsICAzNCwgIDUwLCAgMiwgICAxMywgIDI5LCAgMCwgICAwLCAgIDAsICAgMCwgICAxMDcsIDEyNCwgMTg5LAotICAgIDk2LCAgMTExLCAxNjksIDg1LCAgOTksICAxNTIsIDczLCAgODUsICAxMzIsIDYxLCAgNzEsICAxMTQsIDQ4LCAgNTcsICA5NSwKLSAgICAzNCwgIDQxLCAgNzUsICAxNCwgIDE4LCAgNTEsICAwLCAgIDAsICAgMTMsICAxMTEsIDEyNCwgMTcxLCAxMDAsIDExMSwgMTUzLAotICAgIDg4LCAgOTksICAxMzcsIDc1LCAgODUsICAxMjAsIDYzLCAgNzIsICAxMDMsIDUwLCAgNTgsICA4NSwgIDM2LCAgNDEsICA2NiwKLSAgICAxNSwgIDE5LCAgNDMsICAwLCAgIDAsICAgNCwgICAxMTMsIDEyNCwgMTU2LCAxMDEsIDExMSwgMTM5LCA5MCwgIDk5LCAgMTI1LAotICAgIDc3LCAgODUsICAxMDksIDY0LCAgNzEsICA5MywgIDUxLCAgNTcsICA3NywgIDM2LCAgNDIsICA1OSwgIDE3LCAgMjAsICAzNywKLSAgICAwLCAgIDAsICAgMCwgICAxMTUsIDEyNCwgMTQwLCAxMDMsIDExMSwgMTI1LCA5MCwgIDk5LCAgMTEyLCA3OCwgIDg1LCAgOTcsCi0gICAgNjQsICA3MSwgIDgyLCAgNTIsICA1NywgIDY3LCAgMzYsICA0MiwgIDUwLCAgMTYsICAyMCwgIDMwLCAgMCwgICAwLCAgIDAsCi0gICAgMTE3LCAxMjMsIDEyNSwgMTA0LCAxMTAsIDExMSwgOTIsICA5OCwgIDk5LCAgNzksICA4NSwgIDg2LCAgNjUsICA3MSwgIDcyLAotICAgIDUxLCAgNTgsICA1OSwgIDM3LCAgNDIsICA0MywgIDE3LCAgMjEsICAyMiwgIDAsICAgMCwgICAwLCAgIDExOCwgMTIzLCAxMTAsCi0gICAgMTA1LCAxMTAsIDk3LCAgOTMsICA5OCwgIDg2LCAgNzgsICA4NCwgIDc0LCAgNjYsICA3MSwgIDYyLCAgNTIsICA1NywgIDQ5LAotICAgIDM3LCAgNDIsICAzNCwgIDE3LCAgMjIsICAxNCwgIDAsICAgMCwgICAwLCAgIDEyMCwgMTIzLCA5MywgIDEwNiwgMTA5LCA4MiwKLSAgICA5NCwgIDk3LCAgNzIsICA4MCwgIDg0LCAgNjEsICA2NiwgIDcxLCAgNTAsICA1MiwgIDU3LCAgMzgsICAzNywgIDQyLCAgMjQsCi0gICAgMTcsICAyMiwgIDIsICAgMCwgICAwLCAgIDAsICAgMTIxLCAxMjIsIDc1LCAgMTA4LCAxMDksIDY2LCAgOTUsICA5NywgIDU4LAotICAgIDgwLCAgODQsICA0OCwgIDY2LCAgNzEsICAzNywgIDUyLCAgNTcsICAyNiwgIDM3LCAgNDIsICAxMiwgIDE2LCAgMjIsICAwLAotICAgIDAsICAgMCwgICAwLCAgIDEyMiwgMTIzLCA2MiwgIDEwOCwgMTA5LCA1MiwgIDk1LCAgOTcsICA0NSwgIDgxLCAgODQsICAzNiwKLSAgICA2NywgIDcwLCAgMjYsICA1MiwgIDU3LCAgMTQsICAzNywgIDQyLCAgMCwgICAxNSwgIDIyLCAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAxMTMsIDEwNywgMTc3LCAxMDIsIDk2LCAgMTU5LCA4OSwgIDg1LCAgMTQxLCA3OCwgIDcyLCAgMTI0LCA2NSwgIDYwLCAgMTA3LAotICAgIDUyLCAgNDYsICA4OSwgIDM3LCAgMzAsICA3MCwgIDE4LCAgNSwgICA0NiwgIDAsICAgMCwgICA2LCAgIDExNiwgMTA3LCAxNjAsCi0gICAgMTA0LCA5NiwgIDE0NCwgOTIsICA4NSwgIDEyOSwgODAsICA3MiwgIDExMiwgNjcsICA2MCwgIDk2LCAgNTMsICA0NywgIDgwLAotICAgIDM4LCAgMzEsICA2MiwgIDE5LCAgNywgICAzOSwgIDAsICAgMCwgICAwLCAgIDExOCwgMTA3LCAxNDcsIDEwNSwgOTYsICAxMzEsCi0gICAgOTMsICA4NSwgIDExOCwgODAsICA3MiwgIDEwMSwgNjcsICA2MCwgIDg3LCAgNTQsICA0NywgIDcxLCAgMzksICAzMSwgIDU0LAotICAgIDE5LCAgOCwgICAzMiwgIDAsICAgMCwgICAwLCAgIDExOSwgMTA3LCAxMzIsIDEwNiwgOTYsICAxMTgsIDk0LCAgODUsICAxMDYsCi0gICAgODEsICA3MywgIDkxLCAgNjcsICA2MCwgIDc3LCAgNTQsICA0NywgIDYzLCAgMzksICAzMiwgIDQ3LCAgMjAsICA5LCAgIDI1LAotICAgIDAsICAgMCwgICAwLCAgIDExOSwgMTA3LCAxMTgsIDEwNiwgOTUsICAxMDUsIDk0LCAgODUsICA5MywgIDgxLCAgNzIsICA4MCwKLSAgICA2OCwgIDYwLCAgNjgsICA1NCwgIDQ3LCAgNTQsICAzOSwgIDMyLCAgMzksICAyMCwgIDExLCAgMTgsICAwLCAgIDAsICAgMCwKLSAgICAxMjEsIDEwNywgMTA0LCAxMDcsIDk2LCAgOTIsICA5NSwgIDg0LCAgODAsICA4MSwgIDcyLCAgNjksICA2OCwgIDYxLCAgNTgsCi0gICAgNTQsICA0OCwgIDQ2LCAgMzksICAzMywgIDMxLCAgMjAsICAxMiwgIDksICAgMCwgICAwLCAgIDAsICAgMTIzLCAxMDcsIDg4LAotICAgIDEwOCwgOTUsICA3NywgIDk2LCAgODQsICA2OCwgIDgyLCAgNzIsICA1NywgIDY4LCAgNjAsICA0NiwgIDU0LCAgNDcsICAzNSwKLSAgICAzOSwgIDMzLCAgMjAsICAxOSwgIDEzLCAgMiwgICAwLCAgIDAsICAgMCwgICAxMjMsIDEwNiwgNzIsICAxMTAsIDk1LCAgNjMsCi0gICAgOTYsICA4NCwgIDU0LCAgODIsICA3MiwgIDQ1LCAgNjksICA2MCwgIDM1LCAgNTUsICA0OCwgIDIzLCAgMzksICAzMywgIDksCi0gICAgMTgsICAxNCwgIDAsICAgMCwgICAwLCAgIDAsICAgMTI1LCAxMDYsIDYwLCAgMTEwLCA5NCwgIDUwLCAgOTgsICA4NCwgIDQyLAotICAgIDgzLCAgNzIsICAzNCwgIDY5LCAgNjAsICAyNSwgIDU1LCAgNDgsICAxMiwgIDM5LCAgMzMsICAwLCAgIDE3LCAgMTMsICAwLAotICAgIDAsICAgMCwgICAwLCAgIDExOCwgODksICAxNjUsIDEwNSwgNzksICAxNDgsIDkzLCAgNjksICAxMzIsIDgxLCAgNTcsICAxMTUsCi0gICAgNjgsICA0NSwgIDk5LCAgNTUsICAzMiwgIDgyLCAgNDEsICAxNSwgIDY0LCAgMjEsICAwLCAgIDQxLCAgMCwgICAwLCAgIDAsCi0gICAgMTIwLCA4OSwgIDE1MCwgMTA3LCA3OSwgIDEzNSwgOTYsICA2OSwgIDEyMSwgODIsICA1OCwgIDEwNSwgNzAsICA0NiwgIDg5LAotICAgIDU2LCAgMzQsICA3MywgIDQxLCAgMTcsICA1NiwgIDIxLCAgMCwgICAzNCwgIDAsICAgMCwgICAwLCAgIDEyMSwgODksICAxMzcsCi0gICAgMTA4LCA3OSwgIDEyMywgOTYsICA2OSwgIDEwOSwgODIsICA1OCwgIDk1LCAgNzAsICA0NywgIDgxLCAgNTYsICAzNCwgIDY2LAotICAgIDQxLCAgMTgsICA0OSwgIDIxLCAgMCwgICAyOCwgIDAsICAgMCwgICAwLCAgIDEyMiwgOTAsICAxMjQsIDEwOSwgNzksICAxMTAsCi0gICAgOTYsICA2OSwgIDk5LCAgODMsICA1OCwgIDg1LCAgNzAsICA0NywgIDcyLCAgNTYsICAzNSwgIDU4LCAgNDEsICAxOSwgIDQyLAotICAgIDIxLCAgMCwgICAyMiwgIDAsICAgMCwgICAwLCAgIDEyMywgOTAsICAxMTEsIDExMCwgNzksICA5OCwgIDk3LCAgNjksICA4NywKLSAgICA4MywgIDU5LCAgNzUsICA3MCwgIDQ3LCAgNjMsICA1NiwgIDM1LCAgNTAsICA0MSwgIDIwLCAgMzUsICAyMSwgIDAsICAgMTQsCi0gICAgMCwgICAwLCAgIDAsICAgMTIzLCA5MCwgIDk4LCAgMTEwLCA3OSwgIDg3LCAgOTcsICA3MCwgIDc2LCAgODQsICA1OCwgIDY0LAotICAgIDcwLCAgNDgsICA1MywgIDU2LCAgMzYsICA0MSwgIDQwLCAgMjEsICAyNiwgIDIxLCAgMCwgICA1LCAgIDAsICAgMCwgICAwLAotICAgIDEyNSwgODksICA4NCwgIDExMSwgNzksICA3MywgIDk3LCAgNjksICA2NCwgIDg0LCAgNTksICA1NCwgIDcwLCAgNDgsICA0MywKLSAgICA1NiwgIDM2LCAgMzEsICA0MCwgIDIyLCAgMTcsICAyMCwgIDEsICAgMSwgICAwLCAgIDAsICAgMCwgICAxMjUsIDg5LCAgNjksCi0gICAgMTEyLCA3OSwgIDYwLCAgOTgsICA3MCwgIDUxLCAgODQsICA1OSwgIDQyLCAgNzAsICA0OCwgIDMyLCAgNTYsICAzNiwgIDIwLAotICAgIDQxLCAgMjIsICA1LCAgIDE5LCAgMiwgICAwLCAgIDAsICAgMCwgICAwLCAgIDEyNiwgODksICA1NywgIDExMiwgNzksICA0OSwKLSAgICA5OSwgIDcwLCAgNDEsICA4NCwgIDU5LCAgMzIsICA3MCwgIDQ4LCAgMjIsICA1NiwgIDM2LCAgMTAsICA0MCwgIDIyLCAgMCwKLSAgICAxOCwgIDIsICAgMCwgICAwLCAgIDAsICAgMCwgICAxMjEsIDY3LCAgMTU0LCAxMDgsIDU4LCAgMTM4LCA5NywgIDUwLCAgMTI0LAotICAgIDg0LCAgMzksICAxMDcsIDcxLCAgMjgsICA5MiwgIDU4LCAgMTIsICA3NiwgIDQzLCAgMCwgICA1OSwgIDIwLCAgMCwgICAzNywKLSAgICAwLCAgIDAsICAgMCwgICAxMjQsIDY4LCAgMTQwLCAxMTEsIDU5LCAgMTI2LCA5OCwgIDUwLCAgMTEyLCA4NCwgIDQwLCAgOTgsCi0gICAgNzEsICAyOSwgIDgzLCAgNTgsICAxNSwgIDY3LCAgNDIsICAwLCAgIDUxLCAgMjAsICAwLCAgIDMwLCAgMCwgICAwLCAgIDAsCi0gICAgMTI0LCA2OCwgIDEyOSwgMTExLCA1OSwgIDExNCwgOTksICA1MSwgIDEwMiwgODYsICA0MSwgIDg4LCAgNzEsICAzMCwgIDc1LAotICAgIDU4LCAgMTcsICA2MCwgIDQyLCAgMCwgICA0NSwgIDIwLCAgMCwgICAyNCwgIDAsICAgMCwgICAwLCAgIDEyNSwgNzAsICAxMTYsCi0gICAgMTExLCA2MCwgIDEwMywgOTksICA1MSwgIDkyLCAgODUsICA0MSwgIDc5LCAgNzEsICAzMSwgIDY2LCAgNTgsICAxOSwgIDUzLAotICAgIDQyLCAgMywgICAzOCwgIDIwLCAgMCwgICAxNywgIDAsICAgMCwgICAwLCAgIDEyNSwgNzAsICAxMDQsIDExMSwgNjEsICA5MywKLSAgICA5OSwgIDUyLCAgODEsICA4NSwgIDQzLCAgNjksICA3MiwgIDMyLCAgNTgsICA1OCwgIDIwLCAgNDUsICA0MiwgIDQsICAgMzEsCi0gICAgMjAsICAwLCAgIDgsICAgMCwgICAwLCAgIDAsICAgMTI2LCA3MCwgIDkyLCAgMTExLCA2MSwgIDgxLCAgOTksICA1MiwgIDcxLAotICAgIDg1LCAgNDIsICA2MCwgIDcxLCAgMzMsICA0OSwgIDU3LCAgMjEsICAzNywgIDQyLCAgNiwgICAyMywgIDIwLCAgMCwgICAzLAotICAgIDAsICAgMCwgICAwLCAgIDEyNiwgNzAsICA3OSwgIDExMiwgNjEsICA3MCwgIDk5LCAgNTMsICA2MCwgIDg1LCAgNDMsICA1MCwKLSAgICA3MSwgIDMzLCAgMzksICA1NywgIDIyLCAgMjgsICA0MSwgIDcsICAgMTMsICAxOSwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAxMjcsIDcxLCAgNjYsICAxMTMsIDYyLCAgNTYsICAxMDAsIDUzLCAgNDgsICA4NiwgIDQ0LCAgMzksICA3MSwgIDM0LCAgMjksCi0gICAgNTcsICAyMywgIDE4LCAgNDEsICA4LCAgIDIsICAgMTgsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTI4LCA3MCwgIDU1LAotICAgIDExNCwgNjIsICA0NiwgIDEwMCwgNTQsICAzOSwgIDg2LCAgNDQsICAzMCwgIDcxLCAgMzQsICAyMCwgIDU3LCAgMjMsICA3LAotICAgIDQxLCAgOSwgICAwLCAgIDE4LCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDEyNCwgNDEsICAxNDUsIDExMSwgMzIsICAxMjgsCi0gICAgOTksICAyMywgIDExNCwgODYsICAxMCwgIDEwMCwgNzMsICAwLCAgIDg1LCAgNjAsICAwLCAgIDcxLCAgNDMsICAwLCAgIDU0LAotICAgIDE3LCAgMCwgICAzMiwgIDAsICAgMCwgICAwLCAgIDEyNiwgNDIsICAxMzEsIDExMywgMzMsICAxMTcsIDEwMCwgMjUsICAxMDQsCi0gICAgODYsICAxNCwgIDkwLCAgNzMsICAwLCAgIDc3LCAgNjAsICAwLCAgIDYzLCAgNDQsICAwLCAgIDQ3LCAgMTgsICAwLCAgIDI1LAotICAgIDAsICAgMCwgICAwLCAgIDEyNywgNDMsICAxMjAsIDExMywgMzQsICAxMDYsIDEwMSwgMjYsICA5NSwgIDg2LCAgMTcsICA4MiwKLSAgICA3MywgIDIsICAgNjksICA1OSwgIDAsICAgNTYsICA0MywgIDAsICAgNDEsICAxOCwgIDAsICAgMTksICAwLCAgIDAsICAgMCwKLSAgICAxMjcsIDQ1LCAgMTA5LCAxMTMsIDM3LCAgOTcsICAxMDEsIDI4LCAgODUsICA4NiwgIDE5LCAgNzQsICA3MywgIDUsICAgNjEsCi0gICAgNTksICAwLCAgIDQ4LCAgNDMsICAwLCAgIDM0LCAgMTksICAwLCAgIDExLCAgMCwgICAwLCAgIDAsICAgMTI3LCA0NiwgIDk4LAotICAgIDExNCwgMzgsICA4NiwgIDEwMCwgMzAsICA3NiwgIDg3LCAgMjEsICA2NSwgIDczLCAgOSwgICA1NCwgIDU5LCAgMCwgICA0MSwKLSAgICA0MywgIDAsICAgMjYsICAxOCwgIDAsICAgNSwgICAwLCAgIDAsICAgMCwgICAxMjcsIDQ3LCAgODcsICAxMTMsIDM5LCAgNzYsCi0gICAgMTAxLCAzMSwgIDY3LCAgODYsICAyMiwgIDU2LCAgNzIsICAxMSwgIDQ1LCAgNTksICAwLCAgIDMzLCAgNDMsICAwLCAgIDE5LAotICAgIDE4LCAgMCwgICAyLCAgIDAsICAgMCwgICAwLCAgIDEyOCwgNDgsICA3NSwgIDExNCwgMzksICA2NSwgIDEwMSwgMzMsICA1NiwKLSAgICA4NiwgIDIzLCAgNDYsICA3MiwgIDEyLCAgMzYsICA1OCwgIDAsICAgMjQsICA0MiwgIDAsICAgOSwgICAxNywgIDAsICAgMCwKLSAgICAwLCAgIDAsICAgMCwgICAxMjksIDQ4LCAgNjMsICAxMTQsIDQxLCAgNTQsICAxMDIsIDMzLCAgNDYsICA4NywgIDI0LCAgMzYsCi0gICAgNzIsICAxNCwgIDI2LCAgNTgsICAxLCAgIDE0LCAgNDIsICAwLCAgIDIsICAgMTYsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgMTI4LCA0OCwgIDUzLCAgMTE0LCA0MSwgIDQ0LCAgMTAyLCAzNCwgIDM3LCAgODcsICAyNSwgIDI3LCAgNzIsICAxNSwgIDE3LAotICAgIDU4LCAgMSwgICAzLCAgIDQxLCAgMCwgICAwLCAgIDE1LCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTg5LCAyNDIsCi0gICAgMCwgICAxNjksIDIxNywgMCwgICAxNTEsIDE5NCwgMCwgICAxMzIsIDE3MCwgMCwgICAxMTMsIDE0NywgMCwgICA5NCwgIDEyMywKLSAgICAwLCAgIDc0LCAgOTksICAwLCAgIDUxLCAgNzEsICAwLCAgIDE1LCAgMzQsICAxLCAgIDE4NywgMjE5LCAxLCAgIDE2NywgMTk1LAotICAgIDAsICAgMTUwLCAxNzUsIDAsICAgMTMxLCAxNTMsIDAsICAgMTEzLCAxMzIsIDAsICAgOTQsICAxMTEsIDAsICAgNzQsICA4OSwKLSAgICAwLCAgIDUwLCAgNjMsICAwLCAgIDEzLCAgMjgsICAxLCAgIDE4NiwgMTk4LCAxLCAgIDE2NywgMTc4LCAwLCAgIDE0OSwgMTU4LAotICAgIDAsICAgMTMwLCAxMzksIDAsICAgMTExLCAxMTksIDAsICAgOTMsICAxMDAsIDAsICAgNzQsICA4MCwgIDAsICAgNTAsICA1NSwKLSAgICAwLCAgIDEzLCAgMjIsICAxLCAgIDE4NSwgMTc2LCAxLCAgIDE2NSwgMTU5LCAxLCAgIDE0OCwgMTQyLCAwLCAgIDEyOSwgMTIzLAotICAgIDAsICAgMTExLCAxMDYsIDAsICAgOTMsICA4OSwgIDAsICAgNzMsICA3MCwgIDAsICAgNTAsICA0NywgIDAsICAgMTMsICAxMywKLSAgICAxLCAgIDE4NCwgMTU3LCAxLCAgIDE2NCwgMTQxLCAxLCAgIDE0NywgMTI1LCAwLCAgIDEyOCwgMTEwLCAwLCAgIDExMCwgOTMsCi0gICAgMCwgICA5MiwgIDc3LCAgMCwgICA3MywgIDYwLCAgMCwgICA1MCwgIDM5LCAgMCwgICAxMiwgIDUsICAgMjUsICAxODIsIDEzNywKLSAgICAyNSwgIDE2MywgMTIyLCAxNywgIDE0NiwgMTA5LCAwLCAgIDEyOCwgOTYsICAwLCAgIDExMCwgODEsICAwLCAgIDkyLCAgNjYsCi0gICAgMCwgICA3MywgIDUxLCAgMCwgICA1MCwgIDMwLCAgMCwgICAxMCwgIDAsICAgNDIsICAxODEsIDExNCwgMzUsICAxNjMsIDEwMiwKLSAgICAzMCwgIDE0NSwgOTEsICAxNCwgIDEyNywgODAsICAwLCAgIDEwOSwgNjcsICAwLCAgIDkxLCAgNTMsICAwLCAgIDcyLCAgMzksCi0gICAgMCwgICA1MCwgIDE5LCAgMCwgICAxMCwgIDAsICAgNTIsICAxODEsIDkyLCAgNDMsICAxNjIsIDgzLCAgMzIsICAxNDUsIDczLAotICAgIDE5LCAgMTI2LCA2MywgIDAsICAgMTA4LCA1MiwgIDAsICAgOTAsICA0MCwgIDAsICAgNzIsICAyNywgIDAsICAgNTAsICA3LAotICAgIDAsICAgMTAsICAwLCAgIDU3LCAgMTgxLCA3NCwgIDQ4LCAgMTYyLCA2NiwgIDM3LCAgMTQ0LCA1NywgIDI0LCAgMTI2LCA0OSwKLSAgICA3LCAgIDEwOCwgNDAsICAwLCAgIDkwLCAgMjksICAwLCAgIDcyLCAgMTUsICAwLCAgIDQ5LCAgMCwgICAwLCAgIDEwLCAgMCwKLSAgICAxLCAgIDE3MCwgMjI3LCAxLCAgIDE1MiwgMjAzLCAwLCAgIDEzNiwgMTgyLCAwLCAgIDExOSwgMTU5LCAwLCAgIDEwMSwgMTM3LAotICAgIDAsICAgODQsICAxMTUsIDAsICAgNjUsICA5MiwgIDAsICAgNDMsICA2NiwgIDAsICAgMSwgICAyOSwgIDEsICAgMTY5LCAyMDYsCi0gICAgMSwgICAxNTEsIDE4NCwgMSwgICAxMzYsIDE2NSwgMCwgICAxMTgsIDE0NCwgMCwgICAxMDIsIDEyNSwgMCwgICA4NCwgIDEwNSwKLSAgICAwLCAgIDY1LCAgODMsICAwLCAgIDQzLCAgNTgsICAwLCAgIDAsICAgMjIsICAyOSwgIDE2OCwgMTg2LCAyMSwgIDE1MSwgMTY3LAotICAgIDE0LCAgMTM1LCAxNTAsIDQsICAgMTE4LCAxMzEsIDAsICAgMTAxLCAxMTIsIDAsICAgODMsICA5NCwgIDAsICAgNjUsICA3NSwKLSAgICAwLCAgIDQzLCAgNTEsICAwLCAgIDAsICAgMTYsICA0MSwgIDE2NywgMTY3LCAzMywgIDE1MCwgMTUwLCAzMSwgIDEzNCwgMTM0LAotICAgIDE5LCAgMTE3LCAxMTcsIDQsICAgMTAwLCAxMDAsIDAsICAgODMsICA4MywgIDAsICAgNjUsICA2NSwgIDAsICAgNDIsICA0MywKLSAgICAwLCAgIDAsICAgOCwgICA0OCwgIDE2NywgMTQ5LCA0MSwgIDE0OSwgMTMzLCAzMywgIDEzMywgMTE4LCAyNSwgIDExNiwgMTAzLAotICAgIDEzLCAgOTksICA4OCwgIDAsICAgODMsICA3MywgIDAsICAgNjUsICA1NiwgIDAsICAgNDIsICAzNSwgIDAsICAgMCwgICAwLAotICAgIDU4LCAgMTY1LCAxMzAsIDQ5LCAgMTQ4LCAxMTUsIDQyLCAgMTMyLCAxMDMsIDMxLCAgMTE1LCA4OSwgIDE4LCAgOTksICA3NSwKLSAgICAwLCAgIDgyLCAgNjEsICAwLCAgIDY0LCAgNDYsICAwLCAgIDQyLCAgMjYsICAwLCAgIDAsICAgMCwgICA2MiwgIDE2NCwgMTEwLAotICAgIDU1LCAgMTQ3LCA5NywgIDQ1LCAgMTMyLCA4NywgIDM1LCAgMTE1LCA3NSwgIDIyLCAgOTgsICA2MywgIDUsICAgODIsICA1MCwKLSAgICAwLCAgIDY0LCAgMzYsICAwLCAgIDQyLCAgMTYsICAwLCAgIDAsICAgMCwgICA2OSwgIDE2NCwgODksICA2MCwgIDE0NywgNzgsCi0gICAgNTAsICAxMzEsIDcwLCAgMzcsICAxMTQsIDU5LCAgMjYsICA5OCwgIDQ5LCAgMTAsICA4MSwgIDM3LCAgMCwgICA2NCwgIDI0LAotICAgIDAsICAgNDIsICA0LCAgIDAsICAgMCwgICAwLCAgIDcxLCAgMTY0LCA3MSwgIDYzLCAgMTQ3LCA2MywgIDUzLCAgMTMxLCA1NSwKLSAgICA0MCwgIDExNCwgNDcsICAyOCwgIDk4LCAgMzgsICAxMywgIDgxLCAgMjYsICAwLCAgIDY0LCAgMTIsICAwLCAgIDQyLCAgMCwKLSAgICAwLCAgIDAsICAgMCwgICAyOCwgIDE1MywgMjE0LCAyNCwgIDEzOCwgMTkzLCAyMywgIDEyMywgMTcxLCAxNiwgIDEwNywgMTUwLAotICAgIDAsICAgOTEsICAxMzAsIDAsICAgNzUsICAxMDksIDAsICAgNTgsICA4NywgIDAsICAgMzUsICA2MSwgIDAsICAgMCwgICAyNSwKLSAgICA0OCwgIDE1MywgMTk0LCA0MSwgIDEzOCwgMTc0LCAzNCwgIDEyMywgMTU2LCAyNywgIDEwNywgMTM2LCAxNiwgIDkxLCAgMTE3LAotICAgIDEsICAgNzUsICA5OCwgIDAsICAgNTcsICA3OCwgIDAsICAgMzUsICA1MywgIDAsICAgMCwgICAxNywgIDU1LCAgMTUzLCAxNzcsCi0gICAgNDcsICAxMzcsIDE1OCwgNDIsICAxMjIsIDE0MiwgMzMsICAxMDcsIDEyNCwgMjIsICA5MSwgIDEwNiwgNiwgICA3NSwgIDg4LAotICAgIDAsICAgNTcsICA3MCwgIDAsICAgMzUsICA0NiwgIDAsICAgMCwgICA5LCAgIDYxLCAgMTUyLCAxNTgsIDUzLCAgMTM2LCAxNDMsCi0gICAgNDUsICAxMjIsIDEyNywgMzYsICAxMDYsIDExMSwgMjQsICA5MCwgIDk0LCAgMTAsICA3NCwgIDc4LCAgMCwgICA1NywgIDYxLAotICAgIDAsICAgMzUsICAzOSwgIDAsICAgMCwgICAyLCAgIDY3LCAgMTUxLCAxNDEsIDU5LCAgMTM1LCAxMjYsIDQ5LCAgMTIxLCAxMTIsCi0gICAgMzksICAxMDUsIDk4LCAgMjksICA5MCwgIDgzLCAgMTQsICA3NCwgIDY4LCAgMCwgICA1NywgIDUyLCAgMCwgICAzNSwgIDMxLAotICAgIDAsICAgMCwgICAwLCAgIDcxLCAgMTUwLCAxMjMsIDYyLCAgMTM1LCAxMTAsIDU0LCAgMTIwLCA5OCwgIDQyLCAgMTA1LCA4NCwKLSAgICAzMSwgIDg5LCAgNzEsICAxNiwgIDc0LCAgNTgsICAwLCAgIDU3LCAgNDMsICAwLCAgIDM1LCAgMjIsICAwLCAgIDAsICAgMCwKLSAgICA3NCwgIDE1MCwgMTA1LCA2NCwgIDEzNCwgOTIsICA1NSwgIDEyMCwgODMsICA0NSwgIDEwNCwgNzEsICAzNCwgIDg5LCAgNTksCi0gICAgMjAsICA3MywgIDQ3LCAgMCwgICA1NywgIDMyLCAgMCwgICAzNSwgIDEzLCAgMCwgICAwLCAgIDAsICAgNzgsICAxNDksIDg0LAotICAgIDY5LCAgMTM0LCA3NSwgIDU5LCAgMTIwLCA2NiwgIDQ3LCAgMTAzLCA1NiwgIDM0LCAgODgsICA0NiwgIDIyLCAgNzMsICAzNCwKLSAgICAxLCAgIDU3LCAgMjAsICAwLCAgIDM1LCAgMSwgICAwLCAgIDAsICAgMCwgICA4MCwgIDE0OSwgNjksICA3MCwgIDEzMywgNjEsCi0gICAgNjAsICAxMTksIDUzLCAgNDksICAxMDMsIDQ0LCAgMzYsICA4OCwgIDM1LCAgMjMsICA3MywgIDI0LCAgMiwgICA1NiwgIDEwLAotICAgIDAsICAgMzUsICAwLCAgIDAsICAgMCwgICAwLCAgIDU4LCAgMTM2LCAyMDAsIDUwLCAgMTIyLCAxODAsIDQ1LCAgMTA5LCAxNjIsCi0gICAgMzgsICA5NCwgIDE0MSwgMjcsICA4MCwgIDEyMSwgMTUsICA2NSwgIDEwMiwgMCwgICA0OCwgIDgxLCAgMCwgICAyNiwgIDU2LAotICAgIDAsICAgMCwgICAxOSwgIDY2LCAgMTM2LCAxODIsIDU5LCAgMTIyLCAxNjMsIDUyLCAgMTA5LCAxNDYsIDQyLCAgOTQsICAxMjgsCi0gICAgMzIsICA4MCwgIDEwOSwgMjAsICA2NSwgIDkxLCAgMiwgICA0OCwgIDcyLCAgMCwgICAyNiwgIDQ5LCAgMCwgICAwLCAgIDExLAotICAgIDcwLCAgMTM2LCAxNjUsIDYyLCAgMTIyLCAxNDksIDU1LCAgMTA4LCAxMzMsIDQ2LCAgOTQsICAxMTYsIDM1LCAgODAsICA5OSwKLSAgICAyMSwgIDY1LCAgODIsICA0LCAgIDQ5LCAgNjQsICAwLCAgIDI2LCAgNDEsICAwLCAgIDAsICAgMywgICA3NiwgIDEzNSwgMTQ5LAotICAgIDY2LCAgMTIxLCAxMzMsIDU4LCAgMTA4LCAxMTksIDQ4LCAgOTQsICAxMDMsIDM2LCAgNzksICA4OCwgIDIzLCAgNjUsICA3MywKLSAgICA3LCAgIDQ5LCAgNTYsICAwLCAgIDI3LCAgMzQsICAwLCAgIDAsICAgMCwgICA3OCwgIDEzNSwgMTMzLCA2OSwgIDEyMCwgMTE4LAotICAgIDYwLCAgMTA3LCAxMDYsIDUwLCAgOTMsICA5MiwgIDM5LCAgNzksICA3NywgIDI2LCAgNjUsICA2MywgIDgsICAgNDksICA0NywKLSAgICAwLCAgIDI3LCAgMjYsICAwLCAgIDAsICAgMCwgICA4MiwgIDEzNCwgMTE3LCA3MSwgIDEyMCwgMTA0LCA2MiwgIDEwNywgOTIsCi0gICAgNTEsICA5MywgIDc5LCAgMzksICA3OCwgIDY2LCAgMjcsICA2NCwgIDUzLCAgMTAsICA0OCwgIDM5LCAgMCwgICAyNywgIDE4LAotICAgIDAsICAgMCwgICAwLCAgIDg0LCAgMTM0LCA5OSwgIDczLCAgMTE5LCA4NywgIDY0LCAgMTA2LCA3NywgIDUzLCAgOTIsICA2NiwKLSAgICA0MiwgIDc4LCAgNTUsICAyOCwgIDY0LCAgNDIsICAxMSwgIDQ4LCAgMjksICAwLCAgIDI4LCAgOSwgICAwLCAgIDAsICAgMCwKLSAgICA4NywgIDEzMywgODEsICA3NiwgIDExOSwgNzIsICA2NiwgIDEwNiwgNjIsICA1NSwgIDkyLCAgNTIsICA0MywgIDc4LCAgNDIsCi0gICAgMjksICA2NCwgIDMxLCAgMTIsICA0OCwgIDE3LCAgMCwgICAyOCwgIDAsICAgMCwgICAwLCAgIDAsICAgODgsICAxMzQsIDY3LAotICAgIDc3LCAgMTE5LCA1OCwgIDY4LCAgMTA2LCA1MSwgIDU2LCAgOTIsICA0MiwgIDQ0LCAgNzgsICAzMiwgIDMwLCAgNjQsICAyMCwKLSAgICAxMiwgIDQ4LCAgNiwgICAwLCAgIDI4LCAgMCwgICAwLCAgIDAsICAgMCwgICA3MywgIDEyMCwgMTg5LCA2NCwgIDEwNywgMTY4LAotICAgIDU3LCAgOTYsICAxNTEsIDQ3LCAgODIsICAxMzMsIDM4LCAgNjksICAxMTQsIDI2LCAgNTUsICA5NSwgIDExLCAgMzksICA3NSwKLSAgICAwLCAgIDE2LCAgNTEsICAwLCAgIDAsICAgMTQsICA3OCwgIDEyMCwgMTcxLCA2OSwgIDEwNywgMTUzLCA2MiwgIDk1LCAgMTM3LAotICAgIDUxLCAgODIsICAxMTksIDQwLCAgNjksICAxMDIsIDI5LCAgNTUsICA4NSwgIDE1LCAgMzksICA2NiwgIDAsICAgMTcsICA0NCwKLSAgICAwLCAgIDAsICAgNCwgICA4MSwgIDEyMCwgMTU2LCA3MSwgIDEwNywgMTQwLCA2NCwgIDk1LCAgMTI1LCA1MywgIDgyLCAgMTA5LAotICAgIDQyLCAgNjksICA5MywgIDMxLCAgNTUsICA3NywgIDE2LCAgMzksICA1OSwgIDAsICAgMTgsICAzNywgIDAsICAgMCwgICAwLAotICAgIDg1LCAgMTIwLCAxNDEsIDc0LCAgMTA3LCAxMjYsIDY1LCAgOTUsICAxMTIsIDU0LCAgODIsICA5NywgIDQzLCAgNjksICA4MiwKLSAgICAzMiwgIDU1LCAgNjcsICAxNywgIDM5LCAgNTEsICAwLCAgIDE5LCAgMzAsICAwLCAgIDAsICAgMCwgICA4NiwgIDExOSwgMTI2LAotICAgIDc2LCAgMTA2LCAxMTIsIDY2LCAgOTUsICAxMDAsIDU2LCAgODEsICA4NSwgIDQ1LCAgNjksICA3MiwgIDMzLCAgNTUsICA1OSwKLSAgICAxOCwgIDQwLCAgNDMsICAwLCAgIDE5LCAgMjIsICAwLCAgIDAsICAgMCwgICA4OSwgIDExOSwgMTEwLCA3OCwgIDEwNiwgOTgsCi0gICAgNjksICA5NCwgIDg3LCAgNTYsICA4MSwgIDc1LCAgNDYsICA2OCwgIDYyLCAgMzMsICA1NSwgIDQ5LCAgMTgsICA0MCwgIDM1LAotICAgIDAsICAgMjAsICAxNSwgIDAsICAgMCwgICAwLCAgIDg5LCAgMTE5LCA5NSwgIDgwLCAgMTA2LCA4MywgIDcwLCAgOTQsICA3MywKLSAgICA1OCwgIDgxLCAgNjMsICA0NiwgIDY4LCAgNTEsICAzNCwgIDU1LCAgMzksICAxOSwgIDQwLCAgMjUsICAwLCAgIDIwLCAgNCwKLSAgICAwLCAgIDAsICAgMCwgICA5MiwgIDExOCwgNzgsICA4MiwgIDEwNiwgNjgsICA3MCwgIDkzLCAgNTksICA1OSwgIDgxLCAgNDksCi0gICAgNDcsICA2OCwgIDM5LCAgMzQsICA1NSwgIDI4LCAgMTksICA0MCwgIDE0LCAgMCwgICAyMCwgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgOTMsICAxMTgsIDY1LCAgODIsICAxMDUsIDU1LCAgNzIsICA5MywgIDQ4LCAgNjAsICA4MSwgIDM5LCAgNDcsICA2OCwgIDI5LAotICAgIDM0LCAgNTUsICAxOCwgIDIwLCAgNDAsICAyLCAgIDAsICAgMjAsICAwLCAgIDAsICAgMCwgICAwLCAgIDgzLCAgMTA0LCAxNzcsCi0gICAgNzQsICA5MywgIDE1OSwgNjUsICA4MiwgIDE0MiwgNTYsICA3MCwgIDEyNCwgNDUsICA1NywgIDEwNiwgMzMsICA0NCwgIDg5LAotICAgIDIwLCAgMjgsICA3MCwgIDEsICAgNCwgICA0NiwgIDAsICAgMCwgICA4LCAgIDg2LCAgMTA0LCAxNjEsIDc4LCAgOTMsICAxNDUsCi0gICAgNjgsICA4MiwgIDEyOCwgNTgsICA3MCwgIDExMiwgNDgsICA1OCwgIDk2LCAgMzUsICA0NSwgIDgwLCAgMjEsICAyOSwgIDYyLAotICAgIDEsICAgNiwgICA0MCwgIDAsICAgMCwgICAwLCAgIDg5LCAgMTA0LCAxNDcsIDc5LCAgOTMsICAxMzEsIDY5LCAgODIsICAxMTgsCi0gICAgNTksICA3MCwgIDEwMiwgNDcsICA1OCwgIDg3LCAgMzYsICA0NSwgIDcyLCAgMjMsICAyOSwgIDU1LCAgMywgICA3LCAgIDMzLAotICAgIDAsICAgMCwgICAwLCAgIDkwLCAgMTA0LCAxMzIsIDgwLCAgOTMsICAxMTksIDcxLCAgODIsICAxMDYsIDYwLCAgNzAsICA5MSwKLSAgICA0OCwgIDU4LCAgNzcsICAzNywgIDQ1LCAgNjIsICAyMywgIDMwLCAgNDcsICA0LCAgIDcsICAgMjYsICAwLCAgIDAsICAgMCwKLSAgICA5MiwgIDEwNCwgMTE4LCA4MiwgIDkzLCAgMTA1LCA3MiwgIDgyLCAgOTMsICA2MSwgIDY5LCAgODAsICA1MCwgIDU4LCAgNjgsCi0gICAgMzcsICA0NSwgIDU1LCAgMjMsICAzMCwgIDM5LCAgNCwgICA4LCAgIDE4LCAgMCwgICAwLCAgIDAsICAgOTQsICAxMDQsIDEwNSwKLSAgICA4MiwgIDkyLCAgOTMsICA3MiwgIDgyLCAgODIsICA2MSwgIDcwLCAgNzAsICA1MCwgIDU4LCAgNTgsICAzOCwgIDQ2LCAgNDYsCi0gICAgMjMsICAzMSwgIDMxLCAgNiwgICAxMCwgIDExLCAgMCwgICAwLCAgIDAsICAgOTUsICAxMDQsIDkwLCAgODQsICA5MiwgIDc5LAotICAgIDc0LCAgODIsICA3MCwgIDYyLCAgNzAsICA1OCwgIDUwLCAgNTgsICA0OCwgIDM3LCAgNDYsICAzNiwgIDIzLCAgMzEsICAyMiwKLSAgICA0LCAgIDExLCAgMywgICAwLCAgIDAsICAgMCwgICA5NiwgIDEwMywgNzQsICA4NSwgIDkyLCAgNjUsICA3NSwgIDgxLCAgNTYsCi0gICAgNjMsICA3MCwgIDQ3LCAgNTAsICA1OCwgIDM3LCAgMzgsICA0NiwgIDI1LCAgMjQsICAzMSwgIDExLCAgMywgICAxMSwgIDAsCi0gICAgMCwgICAwLCAgIDAsICAgOTcsICAxMDMsIDYyLCAgODYsICA5MiwgIDUzLCAgNzYsICA4MSwgIDQ1LCAgNjMsICA2OSwgIDM2LAotICAgIDUxLCAgNTgsICAyNywgIDM4LCAgNDYsICAxNSwgIDIzLCAgMzEsICAwLCAgIDMsICAgMTEsICAwLCAgIDAsICAgMCwgICAwLAotICAgIDkwLCAgODcsICAxNjUsIDgxLCAgNzcsICAxNDgsIDcyLCAgNjcsICAxMzIsIDYyLCAgNTUsICAxMTYsIDUwLCAgNDQsICA5OSwKLSAgICAzOSwgIDMxLCAgODIsICAyNSwgIDE0LCAgNjQsICAxLCAgIDAsICAgNDIsICAwLCAgIDAsICAgMSwgICA5MywgIDg3LCAgMTUwLAotICAgIDgzLCAgNzcsICAxMzUsIDc0LCAgNjcsICAxMjEsIDYzLCAgNTYsICAxMDUsIDUyLCAgNDUsICA5MCwgIDQwLCAgMzIsICA3NCwKLSAgICAyNSwgIDE2LCAgNTcsICAzLCAgIDAsICAgMzUsICAwLCAgIDAsICAgMCwgICA5NSwgIDg3LCAgMTM4LCA4NSwgIDc3LCAgMTIzLAotICAgIDc1LCAgNjcsICAxMDksIDYzLCAgNTcsICA5NSwgIDUzLCAgNDUsICA4MSwgIDQxLCAgMzMsICA2NiwgIDI2LCAgMTcsICA1MCwKLSAgICA0LCAgIDAsICAgMjgsICAwLCAgIDAsICAgMCwgICA5NSwgIDg4LCAgMTI0LCA4NSwgIDc3LCAgMTExLCA3NSwgIDY3LCAgOTksCi0gICAgNjMsICA1NywgIDg2LCAgNTMsICA0NSwgIDcyLCAgNDEsICAzMywgIDU4LCAgMjYsICAxOCwgIDQzLCAgNSwgICAxLCAgIDIyLAotICAgIDAsICAgMCwgICAwLCAgIDk3LCAgODgsICAxMTIsIDg3LCAgNzcsICAxMDAsIDc2LCAgNjgsICA4OCwgIDY0LCAgNTcsICA3NiwKLSAgICA1MywgIDQ2LCAgNjMsICA0MSwgIDM0LCAgNTAsICAyNiwgIDE5LCAgMzUsICA1LCAgIDIsICAgMTQsICAwLCAgIDAsICAgMCwKLSAgICA5OSwgIDg3LCAgOTksICA4NywgIDc4LCAgODgsICA3NiwgIDY4LCAgNzcsICA2NSwgIDU3LCAgNjUsICA1MywgIDQ2LCAgNTQsCi0gICAgNDEsICAzNSwgIDQyLCAgMjcsICAyMCwgIDI3LCAgNiwgICAyLCAgIDUsICAgMCwgICAwLCAgIDAsICAgMTAwLCA4NywgIDg1LAotICAgIDg4LCAgNzcsICA3NSwgIDc3LCAgNjgsICA2NSwgIDY1LCAgNTcsICA1NCwgIDUzLCAgNDYsICA0NCwgIDQxLCAgMzUsICAzMiwKLSAgICAyNywgIDIxLCAgMTksICA1LCAgIDMsICAgMiwgICAwLCAgIDAsICAgMCwgICAxMDAsIDg4LCAgNzEsICA4OSwgIDc3LCAgNjEsCi0gICAgNzgsICA2OCwgIDUzLCAgNjYsICA1NywgIDQ0LCAgNTMsICA0NywgIDMzLCAgNDEsICAzNSwgIDIyLCAgMjcsICAyMSwgIDcsCi0gICAgNSwgICAzLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTAxLCA4NywgIDYwLCAgOTAsICA3NywgIDUyLCAgNzksICA2OCwgIDQ0LAotICAgIDY2LCAgNTgsICAzNCwgIDUzLCAgNDcsICAyNSwgIDQxLCAgMzUsICAxMywgIDI2LCAgMjIsICAwLCAgIDUsICAgMywgICAwLAotICAgIDAsICAgMCwgICAwLCAgIDk3LCAgNjcsICAxNTUsIDg2LCAgNTgsICAxMzgsIDc3LCAgNTAsICAxMjUsIDY2LCAgMzksICAxMDgsCi0gICAgNTUsICAyOCwgIDkyLCAgNDMsICAxMiwgIDc2LCAgMjksICAwLCAgIDU5LCAgMiwgICAwLCAgIDM3LCAgMCwgICAwLCAgIDAsCi0gICAgOTksICA2NywgIDE0MSwgODgsICA1OSwgIDEyNywgNzgsICA1MCwgIDExMywgNjgsICA0MCwgIDk4LCAgNTYsICAyOSwgIDgzLAotICAgIDQ0LCAgMTUsICA2OCwgIDI5LCAgMCwgICA1MiwgIDMsICAgMCwgICAzMCwgIDAsICAgMCwgICAwLCAgIDEwMCwgNjgsICAxMjksCi0gICAgODksICA1OSwgIDExNSwgODAsICA1MSwgIDEwMywgNjgsICA0MSwgIDg5LCAgNTYsICAzMCwgIDc1LCAgNDQsICAxNiwgIDYxLAotICAgIDMwLCAgMCwgICA0NSwgIDQsICAgMCwgICAyNCwgIDAsICAgMCwgICAwLCAgIDEwMCwgNjksICAxMTgsIDkwLCAgNjAsICAxMDQsCi0gICAgODAsICA1MSwgIDkyLCAgNjcsICA0MSwgIDc5LCAgNTYsICAzMSwgIDY2LCAgNDQsICAxOCwgIDUzLCAgMjksICAyLCAgIDM4LAotICAgIDQsICAgMCwgICAxOCwgIDAsICAgMCwgICAwLCAgIDEwMSwgNjksICAxMDQsIDkwLCAgNjEsICA5MywgIDc5LCAgNTEsICA4MiwKLSAgICA2NywgIDQyLCAgNzAsICA1NiwgIDMyLCAgNTksICA0NCwgIDIwLCAgNDYsICAyOSwgIDQsICAgMzEsICA2LCAgIDAsICAgOSwKLSAgICAwLCAgIDAsICAgMCwgICAxMDIsIDY5LCAgOTMsICA5MCwgIDYxLCAgODMsICA4MCwgIDUyLCAgNzIsICA2OCwgIDQyLCAgNjEsCi0gICAgNTYsICAzMywgIDUwLCAgNDMsICAyMCwgIDM4LCAgMjksICA1LCAgIDIzLCAgNywgICAwLCAgIDQsICAgMCwgICAwLCAgIDAsCi0gICAgMTAyLCA3MCwgIDgwLCAgOTEsICA2MSwgIDcxLCAgODAsICA1MiwgIDYxLCAgNjgsICA0MywgIDUxLCAgNTYsICAzMiwgIDQwLAotICAgIDQ0LCAgMjEsICAyOSwgIDMwLCAgNiwgICAxNCwgIDcsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDEwMywgNzAsICA2OCwKLSAgICA5MiwgIDYxLCAgNTgsICA4MSwgIDUzLCAgNTAsICA2OSwgIDQzLCAgNDEsICA1NiwgIDM0LCAgMzEsICA0MywgIDIyLCAgMTksCi0gICAgMjksICA3LCAgIDMsICAgNywgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTA0LCA3MCwgIDU3LCAgOTIsICA2MSwgIDQ4LAotICAgIDgyLCAgNTMsICA0MCwgIDY5LCAgNDMsICAzMiwgIDU2LCAgMzQsICAyMiwgIDQzLCAgMjMsICAxMCwgIDI5LCAgOCwgICAwLAotICAgIDYsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDEwMSwgNDUsICAxNDUsIDkxLCAgMzUsICAxMjksIDgwLCAgMjYsICAxMTYsCi0gICAgNjksICAxNSwgIDEwMSwgNTksICAwLCAgIDg2LCAgNDYsICAwLCAgIDcxLCAgMzEsICAwLCAgIDU1LCAgMCwgICAwLCAgIDMzLAotICAgIDAsICAgMCwgICAwLCAgIDEwNCwgNDQsICAxMzIsIDkyLCAgMzYsICAxMTgsIDgyLCAgMjgsICAxMDUsIDcxLCAgMTcsICA5MSwKLSAgICA1OCwgIDMsICAgNzcsICA0NiwgIDAsICAgNjMsICAzMSwgIDAsICAgNDgsICAyLCAgIDAsICAgMjYsICAwLCAgIDAsICAgMCwKLSAgICAxMDQsIDQ2LCAgMTIxLCA5MywgIDM3LCAgMTA3LCA4MiwgIDMwLCAgOTYsICA3MCwgIDIwLCAgODMsICA1OCwgIDYsICAgNzAsCi0gICAgNDYsICAwLCAgIDU3LCAgMzIsICAwLCAgIDQxLCAgNCwgICAwLCAgIDIwLCAgMCwgICAwLCAgIDAsICAgMTA0LCA0OCwgIDExMCwKLSAgICA5MywgIDQwLCAgOTgsICA4MiwgIDMxLCAgODcsICA3MCwgIDIyLCAgNzQsICA1OSwgIDksICAgNjIsICA0NSwgIDAsICAgNDksCi0gICAgMzEsICAwLCAgIDM1LCAgNiwgICAwLCAgIDEzLCAgMCwgICAwLCAgIDAsICAgMTA0LCA0OCwgIDk5LCAgOTIsICA0MSwgIDg4LAotICAgIDgyLCAgMzIsICA3NywgIDcwLCAgMjMsICA2NSwgIDU4LCAgMTEsICA1NCwgIDQ2LCAgMCwgICA0MiwgIDMyLCAgMCwgICAyNywKLSAgICA3LCAgIDAsICAgNSwgICAwLCAgIDAsICAgMCwgICAxMDUsIDUwLCAgODgsICA5MywgIDQxLCAgNzcsICA4MiwgIDM0LCAgNjgsCi0gICAgNzEsICAyNCwgIDU3LCAgNTgsICAxMywgIDQ2LCAgNDUsICAxLCAgIDM1LCAgMzEsICAwLCAgIDIxLCAgNywgICAwLCAgIDIsCi0gICAgMCwgICAwLCAgIDAsICAgMTA1LCA1MCwgIDc2LCAgOTQsICA0MSwgIDY2LCAgODMsICAzNCwgIDU3LCAgNzEsICAyNSwgIDQ3LAotICAgIDU4LCAgMTUsICAzNywgIDQ1LCAgMiwgICAyNSwgIDMyLCAgMCwgICAxMSwgIDcsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAgIDEwNiwgNTAsICA2NCwgIDk0LCAgNDIsICA1NSwgIDgzLCAgMzUsICA0NywgIDcxLCAgMjYsICAzOCwgIDU4LCAgMTYsICAyNywKLSAgICA0NSwgIDQsICAgMTcsICAzMSwgIDAsICAgNCwgICA3LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxMDYsIDUxLCAgNTQsCi0gICAgOTUsICA0MiwgIDQ1LCAgODMsICAzNSwgIDM4LCAgNzEsICAyNywgIDMwLCAgNTgsICAxNiwgIDE5LCAgNDUsICA1LCAgIDcsCi0gICAgMzAsICAwLCAgIDAsICAgNiwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAxODEsIDI0MCwgMCwgICAxNjIsIDIxNiwKLSAgICAwLCAgIDE0NCwgMTkzLCAwLCAgIDEyNiwgMTY4LCAwLCAgIDEwOSwgMTQ2LCAwLCAgIDkxLCAgMTIzLCAwLCAgIDcxLCAgOTgsCi0gICAgMCwgICA0OCwgIDcxLCAgMCwgICA5LCAgIDM0LCAgMCwgICAxNzksIDIxOCwgMCwgICAxNjEsIDE5NSwgMCwgICAxNDQsIDE3NCwKLSAgICAwLCAgIDEyNiwgMTUzLCAwLCAgIDEwOCwgMTMyLCAwLCAgIDkwLCAgMTEwLCAwLCAgIDcxLCAgODgsICAwLCAgIDQ4LCAgNjMsCi0gICAgMCwgICA4LCAgIDI5LCAgMCwgICAxNzgsIDE5NywgMCwgICAxNTksIDE3NywgMCwgICAxNDMsIDE1OSwgMCwgICAxMjUsIDEzOSwKLSAgICAwLCAgIDEwNywgMTE5LCAwLCAgIDkwLCAgOTksICAwLCAgIDcxLCAgNzksICAwLCAgIDQ4LCAgNTUsICAwLCAgIDgsICAgMjIsCi0gICAgMCwgICAxNzcsIDE3NywgMCwgICAxNTgsIDE1OCwgMCwgICAxNDIsIDE0MSwgMCwgICAxMjQsIDEyMywgMCwgICAxMDcsIDEwNiwKLSAgICAwLCAgIDg5LCAgODgsICAwLCAgIDcxLCAgNzAsICAwLCAgIDQ4LCAgNDcsICAwLCAgIDgsICAgMTQsICAwLCAgIDE3NiwgMTU3LAotICAgIDAsICAgMTU4LCAxNDEsIDAsICAgMTQxLCAxMjYsIDAsICAgMTIzLCAxMDksIDAsICAgMTA2LCA5MywgIDAsICAgODksICA3OCwKLSAgICAwLCAgIDcwLCAgNjAsICAwLCAgIDQ3LCAgMzksICAwLCAgIDcsICAgNSwgICAwLCAgIDE3NSwgMTM4LCAwLCAgIDE1NywgMTIzLAotICAgIDAsICAgMTQxLCAxMTAsIDAsICAgMTIzLCA5NiwgIDAsICAgMTA1LCA4MSwgIDAsICAgODgsICA2NywgIDAsICAgNzAsICA1MSwKLSAgICAwLCAgIDQ4LCAgMzAsICAwLCAgIDYsICAgMCwgICAwLCAgIDE3MywgMTE1LCAwLCAgIDE1NSwgMTA0LCAwLCAgIDE0MCwgOTIsCi0gICAgMCwgICAxMjIsIDgwLCAgMCwgICAxMDUsIDY3LCAgMCwgICA4OCwgIDU1LCAgMCwgICA2OSwgIDQwLCAgMCwgICA0NywgIDIwLAotICAgIDAsICAgNiwgICAwLCAgIDAsICAgMTczLCA5NCwgIDAsICAgMTU1LCA4NSwgIDAsICAgMTM5LCA3NSwgIDAsICAgMTIxLCA2NCwKLSAgICAwLCAgIDEwNCwgNTMsICAwLCAgIDg4LCAgNDIsICAwLCAgIDcwLCAgMjgsICAwLCAgIDQ3LCAgOSwgICAwLCAgIDYsICAgMCwKLSAgICAwLCAgIDE3MywgNzYsICAwLCAgIDE1NSwgNzAsICAwLCAgIDEzOCwgNjEsICAwLCAgIDEyMiwgNTMsICAwLCAgIDEwNCwgNDQsCi0gICAgMCwgICA4NywgIDMyLCAgMCwgICA2OSwgIDE4LCAgMCwgICA0NywgIDAsICAgMCwgICA2LCAgIDAsICAgMCwgICAxNjQsIDIyNiwKLSAgICAwLCAgIDE0NywgMjAzLCAwLCAgIDEzMSwgMTgxLCAwLCAgIDExNCwgMTU4LCAwLCAgIDk3LCAgMTM2LCAwLCAgIDgwLCAgMTE1LAotICAgIDAsICAgNjMsICA5MiwgIDAsICAgNDAsICA2NSwgIDAsICAgMCwgICAzMCwgIDAsICAgMTYyLCAyMDUsIDAsICAgMTQ1LCAxODQsCi0gICAgMCwgICAxMzAsIDE2NCwgMCwgICAxMTQsIDE0MywgMCwgICA5NywgIDEyNCwgMCwgICA4MSwgIDEwNCwgMCwgICA2MywgIDgzLAotICAgIDAsICAgNDAsICA1OCwgIDAsICAgMCwgICAyMywgIDAsICAgMTYyLCAxODcsIDAsICAgMTQ1LCAxNjcsIDAsICAgMTMwLCAxNTAsCi0gICAgMCwgICAxMTMsIDEzMSwgMCwgICA5NiwgIDExMiwgMCwgICA4MCwgIDkzLCAgMCwgICA2MiwgIDc0LCAgMCwgICA0MCwgIDUwLAotICAgIDAsICAgMCwgICAxNiwgIDAsICAgMTYwLCAxNjcsIDAsICAgMTQ0LCAxNTAsIDAsICAgMTI5LCAxMzQsIDAsICAgMTEyLCAxMTYsCi0gICAgMCwgICA5NiwgIDEwMCwgMCwgICA4MCwgIDgyLCAgMCwgICA2MiwgIDY1LCAgMCwgICA0MCwgIDQzLCAgMCwgICAwLCAgIDcsCi0gICAgMCwgICAxNjAsIDE0OCwgMCwgICAxNDMsIDEzMywgMCwgICAxMjgsIDExOCwgMCwgICAxMTEsIDEwMywgMCwgICA5NiwgIDg4LAotICAgIDAsICAgODAsICA3MywgIDAsICAgNjIsICA1NiwgIDAsICAgNDAsICAzNSwgIDAsICAgMCwgICAwLCAgIDAsICAgMTU4LCAxMzAsCi0gICAgMCwgICAxNDIsIDExNywgMCwgICAxMjcsIDEwNCwgMCwgICAxMTEsIDg5LCAgMCwgICA5NSwgIDc2LCAgMCwgICA3OSwgIDYyLAotICAgIDAsICAgNjIsICA0NiwgIDAsICAgNDAsICAyNiwgIDAsICAgMCwgICAwLCAgIDAsICAgMTU4LCAxMTEsIDAsICAgMTQxLCA5OSwKLSAgICAwLCAgIDEyNywgODgsICAwLCAgIDExMSwgNzYsICAwLCAgIDk1LCAgNjMsICAwLCAgIDc5LCAgNTEsICAwLCAgIDYyLCAgMzcsCi0gICAgMCwgICA0MCwgIDE4LCAgMCwgICAwLCAgIDAsICAgMCwgICAxNTgsIDkxLCAgMCwgICAxNDEsIDgxLCAgMCwgICAxMjYsIDcyLAotICAgIDAsICAgMTEwLCA2MiwgIDAsICAgOTQsICA1MCwgIDAsICAgNzksICAzOSwgIDAsICAgNjIsICAyNSwgIDAsICAgNDAsICA1LAotICAgIDAsICAgMCwgICAwLCAgIDAsICAgMTU3LCA3NCwgIDAsICAgMTQxLCA2NiwgIDAsICAgMTI2LCA1OSwgIDAsICAgMTEwLCA0OSwKLSAgICAwLCAgIDk0LCAgNDAsICAwLCAgIDc4LCAgMjksICAwLCAgIDYxLCAgMTUsICAwLCAgIDQwLCAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAwLCAgIDE0OCwgMjE0LCAwLCAgIDEzMywgMTkyLCAwLCAgIDExOSwgMTcxLCAwLCAgIDEwMywgMTUwLCAwLCAgIDg3LCAgMTI5LAotICAgIDAsICAgNzIsICAxMDgsIDAsICAgNTUsICA4NiwgIDAsICAgMzIsICA2MSwgIDAsICAgMCwgICAyNSwgIDAsICAgMTQ3LCAxOTMsCi0gICAgMCwgICAxMzIsIDE3MywgMCwgICAxMTgsIDE1NSwgMCwgICAxMDMsIDEzNiwgMCwgICA4NywgIDExNiwgMCwgICA3MiwgIDk4LAotICAgIDAsICAgNTUsICA3OCwgIDAsICAgMzIsICA1MywgIDAsICAgMCwgICAxNywgIDAsICAgMTQ3LCAxNzYsIDAsICAgMTMyLCAxNTgsCi0gICAgMCwgICAxMTgsIDE0MiwgMCwgICAxMDIsIDEyNCwgMCwgICA4NywgIDEwNiwgMCwgICA3MiwgIDg4LCAgMCwgICA1NSwgIDY5LAotICAgIDAsICAgMzMsICA0NiwgIDAsICAgMCwgICA5LCAgIDAsICAgMTQ2LCAxNTksIDAsICAgMTMxLCAxNDIsIDAsICAgMTE3LCAxMjcsCi0gICAgMCwgICAxMDIsIDExMSwgMCwgICA4NywgIDk1LCAgMCwgICA3MSwgIDc5LCAgMCwgICA1NSwgIDYxLCAgMCwgICAzMywgIDM5LAotICAgIDAsICAgMCwgICAyLCAgIDAsICAgMTQ1LCAxNDAsIDAsICAgMTMwLCAxMjYsIDAsICAgMTE3LCAxMTIsIDAsICAgMTAxLCA5OCwKLSAgICAwLCAgIDg2LCAgODMsICAwLCAgIDcxLCAgNjgsICAwLCAgIDU1LCAgNTIsICAwLCAgIDMzLCAgMzEsICAwLCAgIDAsICAgMCwKLSAgICAwLCAgIDE0NCwgMTI0LCAwLCAgIDEzMCwgMTExLCAwLCAgIDExNiwgOTksICAwLCAgIDEwMSwgODQsICAwLCAgIDg2LCAgNzIsCi0gICAgMCwgICA3MSwgIDU5LCAgMCwgICA1NSwgIDQzLCAgMCwgICAzMywgIDIzLCAgMCwgICAwLCAgIDAsICAgMCwgICAxNDQsIDEwNiwKLSAgICAwLCAgIDEyOSwgOTQsICAwLCAgIDExNSwgODMsICAwLCAgIDEwMSwgNzIsICAwLCAgIDg1LCAgNjAsICAwLCAgIDcxLCAgNDgsCi0gICAgMCwgICA1NSwgIDM0LCAgMCwgICAzMywgIDE0LCAgMCwgICAwLCAgIDAsICAgMywgICAxNDMsIDg2LCAgMCwgICAxMjksIDc3LAotICAgIDAsICAgMTE1LCA2OCwgIDAsICAgMTAwLCA1OCwgIDAsICAgODUsICA0OCwgIDAsICAgNzAsICAzNiwgIDAsICAgNTQsICAyMiwKLSAgICAwLCAgIDMzLCAgMywgICAwLCAgIDAsICAgMCwgICAxOCwgIDE0MywgNzIsICAxMywgIDEyOCwgNjMsICAwLCAgIDExNSwgNTcsCi0gICAgMCwgICAxMDAsIDQ3LCAgMCwgICA4NSwgIDM3LCAgMCwgICA3MCwgIDI2LCAgMCwgICA1NCwgIDEzLCAgMCwgICAzMywgIDAsCi0gICAgMCwgICAwLCAgIDAsICAgMCwgICAxMzIsIDIwMCwgMCwgICAxMTgsIDE3OSwgMCwgICAxMDUsIDE2MSwgMCwgICA5MSwgIDE0MCwKLSAgICAwLCAgIDc2LCAgMTIxLCAwLCAgIDYyLCAgMTAxLCAwLCAgIDQ2LCAgODEsICAwLCAgIDI0LCAgNTYsICAwLCAgIDAsICAgMTksCi0gICAgMCwgICAxMzEsIDE4MiwgMCwgICAxMTgsIDE2MywgMCwgICAxMDUsIDE0NiwgMCwgICA5MSwgIDEyOCwgMCwgICA3NywgIDExMCwKLSAgICAwLCAgIDYyLCAgOTEsICAwLCAgIDQ2LCAgNzIsICAwLCAgIDI1LCAgNDgsICAwLCAgIDAsICAgMTEsICAwLCAgIDEzMSwgMTY1LAotICAgIDAsICAgMTE3LCAxNDksIDAsICAgMTA0LCAxMzMsIDAsICAgOTEsICAxMTYsIDAsICAgNzcsICA5OSwgIDAsICAgNjIsICA4MiwKLSAgICAwLCAgIDQ2LCAgNjQsICAwLCAgIDI1LCAgNDEsICAwLCAgIDAsICAgNCwgICAwLCAgIDEzMSwgMTQ5LCAwLCAgIDExNiwgMTM0LAotICAgIDAsICAgMTA0LCAxMTksIDAsICAgOTEsICAxMDQsIDAsICAgNzcsICA4OSwgIDAsICAgNjIsICA3MywgIDAsICAgNDYsICA1NiwKLSAgICAwLCAgIDI1LCAgMzQsICAwLCAgIDAsICAgMCwgICAxMCwgIDEzMCwgMTMzLCAyLCAgIDExNiwgMTE5LCAwLCAgIDEwNCwgMTA2LAotICAgIDAsICAgOTAsICA5MSwgIDAsICAgNzYsICA3OCwgIDAsICAgNjIsICA2NCwgIDAsICAgNDYsICA0OCwgIDAsICAgMjYsICAyNywKLSAgICAwLCAgIDAsICAgMCwgICAyMywgIDEzMCwgMTE4LCAyMCwgIDExNiwgMTA0LCAxMywgIDEwMywgOTMsICAzLCAgIDg5LCAgNzksCi0gICAgMCwgICA3NiwgIDY3LCAgMCwgICA2MiwgIDU0LCAgMCwgICA0NiwgIDM5LCAgMCwgICAyNiwgIDE5LCAgMCwgICAwLCAgIDAsCi0gICAgMzMsICAxMjksIDEwMSwgMjcsICAxMTUsIDg5LCAgMTksICAxMDMsIDc5LCAgOSwgICA4OSwgIDY3LCAgMCwgICA3NSwgIDU2LAotICAgIDAsICAgNjEsICA0MywgIDAsICAgNDYsICAyOSwgIDAsICAgMjYsICAxMCwgIDAsICAgMCwgICAwLCAgIDQxLCAgMTI4LCA4MywKLSAgICAzNSwgIDExNSwgNzMsICAyNywgIDEwMiwgNjQsICAxNSwgIDg5LCAgNTUsICAwLCAgIDc2LCAgNDUsICAwLCAgIDYyLCAgMzMsCi0gICAgMCwgICA0NiwgIDE4LCAgMCwgICAyNiwgIDAsICAgMCwgICAwLCAgIDAsICAgNDMsICAxMjksIDY5LCAgMzgsICAxMTUsIDYxLAotICAgIDMwLCAgMTAyLCA1NCwgIDE3LCAgODksICA0NSwgIDIsICAgNzUsICAzNCwgIDAsICAgNjEsICAyMywgIDAsICAgNDYsICA5LAotICAgIDAsICAgMjYsICAwLCAgIDAsICAgMCwgICAwLCAgIDEsICAgMTE2LCAxODgsIDEsICAgMTA0LCAxNjgsIDAsICAgOTIsICAxNTEsCi0gICAgMCwgICA3OSwgIDEzMiwgMCwgICA2NiwgIDExMywgMCwgICA1MiwgIDk0LCAgMCwgICAzNiwgIDc1LCAgMCwgICAxNCwgIDUyLAotICAgIDAsICAgMCwgICAxNCwgIDE3LCAgMTE2LCAxNzEsIDE2LCAgMTA0LCAxNTMsIDE0LCAgOTIsICAxMzcsIDgsICAgNzksICAxMTksCi0gICAgMCwgICA2NywgIDEwMiwgMCwgICA1MywgIDg1LCAgMCwgICAzNywgIDY3LCAgMCwgICAxNiwgIDQ0LCAgMCwgICAwLCAgIDQsCi0gICAgMzEsICAxMTYsIDE1NSwgMjcsICAxMDQsIDE0MCwgMjEsICA5MiwgIDEyNSwgMTMsICA3OSwgIDEwOSwgMywgICA2NiwgIDkzLAotICAgIDAsICAgNTMsICA3NywgIDAsICAgMzcsICA1OSwgIDAsICAgMTYsICAzOCwgIDAsICAgMCwgICAwLCAgIDM3LCAgMTE1LCAxNDEsCi0gICAgMzAsICAxMDMsIDEyNiwgMjYsICA5MiwgIDExMiwgMTYsICA3OSwgIDk4LCAgNSwgICA2NiwgIDgzLCAgMCwgICA1MywgIDY3LAotICAgIDAsICAgMzgsICA1MSwgIDAsICAgMTcsICAzMSwgIDAsICAgMCwgICAwLCAgIDQxLCAgMTE1LCAxMjYsIDM3LCAgMTAzLCAxMTIsCi0gICAgMzEsICA5MiwgIDEwMCwgMjIsICA3OSwgIDg2LCAgMTAsICA2NiwgIDcyLCAgMCwgICA1MywgIDU5LCAgMCwgICAzOCwgIDQ0LAotICAgIDAsICAgMTcsICAyMywgIDAsICAgMCwgICAwLCAgIDQ4LCAgMTE1LCAxMTEsIDQxLCAgMTAyLCA5OSwgIDM0LCAgOTEsICA4OCwKLSAgICAyNCwgIDc4LCAgNzYsICAxNCwgIDY2LCAgNjMsICAwLCAgIDUzLCAgNTAsICAwLCAgIDM4LCAgMzYsICAwLCAgIDE4LCAgMTUsCi0gICAgMCwgICAwLCAgIDAsICAgNTEsICAxMTUsIDk1LCAgNDYsICAxMDIsIDg1LCAgMzcsICA5MSwgIDc0LCAgMjYsICA3OCwgIDYzLAotICAgIDE2LCAgNjYsICA1MiwgIDAsICAgNTMsICA0MCwgIDAsICAgMzgsICAyNiwgIDAsICAgMTgsICA1LCAgIDAsICAgMCwgICAwLAotICAgIDU1LCAgMTE0LCA4MCwgIDQ3LCAgMTAyLCA2OSwgIDQwLCAgOTAsICA2MCwgIDMwLCAgNzgsICA1MSwgIDE5LCAgNjYsICA0MSwKLSAgICAzLCAgIDUzLCAgMjksICAwLCAgIDM4LCAgMTUsICAwLCAgIDE3LCAgMCwgICAwLCAgIDAsICAgMCwgICA1NiwgIDExNCwgNjYsCi0gICAgNTAsICAxMDIsIDU4LCAgNDAsICA5MSwgIDUwLCAgMzIsICA3OCwgIDQxLCAgMTgsICA2NiwgIDMyLCAgNCwgICA1MywgIDIxLAotICAgIDAsICAgMzgsICA1LCAgIDAsICAgMTcsICAwLCAgIDAsICAgMCwgICAwLCAgIDM5LCAgMTAyLCAxNzgsIDM3LCAgOTAsICAxNTksCi0gICAgMzAsICA3OSwgIDE0MiwgMjEsICA2OCwgIDEyNCwgMTQsICA1NSwgIDEwNiwgMCwgICA0MiwgIDg5LCAgMCwgICAyNiwgIDcwLAotICAgIDAsICAgNCwgICA0NiwgIDAsICAgMCwgICA4LCAgIDQ4LCAgMTAyLCAxNjEsIDQyLCAgOTAsICAxNDUsIDM1LCAgNzksICAxMjgsCi0gICAgMjYsICA2OCwgIDExMiwgMTksICA1NSwgIDk2LCAgMywgICA0MywgIDc5LCAgMCwgICAyNywgIDYyLCAgMCwgICA2LCAgIDQwLAotICAgIDAsICAgMCwgICAwLCAgIDUwLCAgMTAyLCAxNDcsIDQ0LCAgOTAsICAxMzIsIDM3LCAgNzksICAxMTgsIDMwLCAgNjgsICAxMDIsCi0gICAgMjAsICA1NiwgIDg3LCAgNywgICA0MywgIDcyLCAgMCwgICAyOCwgIDU1LCAgMCwgICA2LCAgIDM0LCAgMCwgICAwLCAgIDAsCi0gICAgNTMsICAxMDEsIDEzMywgNDcsICA5MCwgIDExOCwgNDEsICA3OSwgIDEwNiwgMzIsICA2OCwgIDkxLCAgMjEsICA1NiwgIDc4LAotICAgIDksICAgNDMsICA2MywgIDAsICAgMjgsICA0NywgIDAsICAgNiwgICAyNiwgIDAsICAgMCwgICAwLCAgIDU3LCAgMTAxLCAxMTksCi0gICAgNTAsICA4OSwgIDEwNiwgNDIsICA3OSwgIDk0LCAgMzQsICA2NywgIDgxLCAgMjQsICA1NiwgIDY4LCAgOSwgICA0NCwgIDU1LAotICAgIDAsICAgMjksICA0MCwgIDAsICAgNiwgICAxOSwgIDAsICAgMCwgICAwLCAgIDYwLCAgMTAwLCAxMDUsIDUwLCAgOTAsICA5NCwKLSAgICA0NSwgIDgwLCAgODMsICAzNiwgIDY4LCAgNzEsICAyNCwgIDU2LCAgNTksICAxMSwgIDQ0LCAgNDYsICAwLCAgIDI5LCAgMzIsCi0gICAgMCwgICA3LCAgIDEyLCAgMCwgICAwLCAgIDAsICAgNjMsICAxMDEsIDkxLCAgNTUsICA5MCwgIDgwLCAgNDYsICA3OSwgIDcwLAotICAgIDM3LCAgNjgsICA1OSwgIDI2LCAgNTYsICA0OSwgIDEyLCAgNDQsICAzNywgIDEsICAgMjksICAyMywgIDAsICAgNywgICAzLAotICAgIDAsICAgMCwgICAwLCAgIDY0LCAgMTAxLCA3NSwgIDU2LCAgODksICA2NywgIDQ4LCAgNzksICA1NywgIDM3LCAgNjgsICA0OCwKLSAgICAyNywgIDU2LCAgMzcsICAxNSwgIDQ0LCAgMjYsICAwLCAgIDI5LCAgMTIsICAwLCAgIDcsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICA2NiwgIDEwMSwgNjQsICA1OCwgIDg5LCAgNTUsICA0OSwgIDc5LCAgNDcsICAzOSwgIDY4LCAgMzgsICAyNywgIDU2LCAgMjksCi0gICAgMTQsICA0NCwgIDE4LCAgMSwgICAzMCwgIDIsICAgMCwgICA3LCAgIDAsICAgMCwgICAwLCAgIDAsICAgNTcsICA4NiwgIDE2NSwKLSAgICA1MSwgIDc1LCAgMTQ4LCA0NSwgIDY1LCAgMTMzLCAzOCwgIDU0LCAgMTE2LCAyOCwgIDQzLCAgMTAwLCAxNiwgIDI5LCAgODMsCi0gICAgMCwgICAxMywgIDY0LCAgMCwgICAwLCAgIDQyLCAgMCwgICAwLCAgIDMsICAgNjAsICA4NiwgIDE1MSwgNTUsICA3NSwgIDEzNSwKLSAgICA0NywgIDY2LCAgMTIxLCAzOSwgIDU1LCAgMTA1LCAzMCwgIDQ0LCAgOTAsICAxOCwgIDMxLCAgNzQsICAzLCAgIDE2LCAgNTcsCi0gICAgMCwgICAxLCAgIDM1LCAgMCwgICAwLCAgIDAsICAgNjIsICA4NiwgIDEzOSwgNTYsICA3NSwgIDEyMywgNDksICA2NiwgIDExMCwKLSAgICA0MCwgIDU1LCAgOTUsICAzMCwgIDQ0LCAgODEsICAxOSwgIDMxLCAgNjYsICA0LCAgIDE3LCAgNTEsICAwLCAgIDEsICAgMjksCi0gICAgMCwgICAwLCAgIDAsICAgNjUsICA4NiwgIDEyNSwgNTYsICA3NiwgIDExMiwgNDksICA2NiwgIDk5LCAgMzksICA1NSwgIDg2LAotICAgIDMxLCAgNDQsICA3MiwgIDE5LCAgMzIsICA1OSwgIDUsICAgMTgsICA0NCwgIDAsICAgMSwgICAyMywgIDAsICAgMCwgICAwLAotICAgIDY3LCAgODYsICAxMTMsIDU4LCAgNzUsICAxMDAsIDUxLCAgNjYsICA4OCwgIDQxLCAgNTYsICA3NywgIDMxLCAgNDUsICA2NCwKLSAgICAyMCwgIDMyLCAgNTEsICA2LCAgIDE4LCAgMzUsICAwLCAgIDEsICAgMTQsICAwLCAgIDAsICAgMCwgICA2OSwgIDg2LCAgOTksCi0gICAgNjEsICA3NiwgIDg4LCAgNTIsICA2NiwgIDc4LCAgNDMsICA1NiwgIDY2LCAgMzIsICA0NSwgIDU1LCAgMjAsICAzMywgIDQyLAotICAgIDcsICAgMTksICAyNywgIDAsICAgMSwgICA2LCAgIDAsICAgMCwgICAwLCAgIDY5LCAgODYsICA4NiwgIDYxLCAgNzYsICA3NSwKLSAgICA1MywgIDY3LCAgNjYsICA0MywgIDU2LCAgNTUsICAzMywgIDQ1LCAgNDUsICAyMSwgIDM0LCAgMzQsICA4LCAgIDIwLCAgMjAsCi0gICAgMCwgICAyLCAgIDIsICAgMCwgICAwLCAgIDAsICAgNzEsICA4NiwgIDcyLCAgNjMsICA3NSwgIDYyLCAgNTQsICA2NiwgIDU1LAotICAgIDQ1LCAgNTYsICA0NSwgIDMzLCAgNDUsICAzNSwgIDIyLCAgMzQsICAyMywgIDcsICAgMjAsICA4LCAgIDAsICAgMiwgICAwLAotICAgIDAsICAgMCwgICAwLCAgIDcxLCAgODYsICA2MiwgIDY0LCAgNzUsICA1MywgIDU1LCAgNjYsICA0NiwgIDQ1LCAgNTYsICAzNiwKLSAgICAzMywgIDQ2LCAgMjcsICAyMiwgIDM0LCAgMTUsICA4LCAgIDIwLCAgMCwgICAwLCAgIDIsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICA2OSwgIDY3LCAgMTU2LCA2MSwgIDU4LCAgMTQwLCA1MywgIDUwLCAgMTI1LCA0NSwgIDM5LCAgMTA4LCAzNSwgIDI4LCAgOTMsCi0gICAgMjUsICAxMiwgIDc3LCAgMTIsICAwLCAgIDU5LCAgMCwgICAwLCAgIDM3LCAgMCwgICAwLCAgIDAsICAgNzEsICA2OCwgIDE0MiwKLSAgICA2MywgIDU5LCAgMTI2LCA1NiwgIDUwLCAgMTE0LCA0NywgIDQwLCAgOTgsICAzNywgIDI4LCAgODQsICAyNiwgIDE1LCAgNjgsCi0gICAgMTIsICAwLCAgIDUzLCAgMCwgICAwLCAgIDMwLCAgMCwgICAwLCAgIDAsICAgNzIsICA2OCwgIDEzMCwgNjMsICA1OSwgIDExNiwKLSAgICA1NiwgIDUwLCAgMTA0LCA0NywgIDQwLCAgOTAsICAzOCwgIDMwLCAgNzUsICAyNywgIDE2LCAgNjEsICAxMywgIDAsICAgNDYsCi0gICAgMCwgICAwLCAgIDI0LCAgMCwgICAwLCAgIDAsICAgNzMsICA2OSwgIDExOCwgNjUsICA1OSwgIDEwNSwgNTcsICA1MSwgIDkyLAotICAgIDQ3LCAgNDEsICA4MCwgIDM3LCAgMzAsICA2NywgIDI2LCAgMTgsICA1MywgIDE0LCAgMSwgICAzOSwgIDAsICAgMCwgICAxOCwKLSAgICAwLCAgIDAsICAgMCwgICA3NCwgIDY5LCAgMTA2LCA2NSwgIDYwLCAgOTMsICA1NywgIDUxLCAgODIsICA0OCwgIDQxLCAgNzAsCi0gICAgMzgsICAzMSwgIDU5LCAgMjYsICAxOSwgIDQ2LCAgMTMsICAyLCAgIDMyLCAgMCwgICAwLCAgIDEwLCAgMCwgICAwLCAgIDAsCi0gICAgNzYsICA2OSwgIDk1LCAgNjYsICA2MSwgIDg0LCAgNTgsICA1MiwgIDczLCAgNDgsICA0MiwgIDYxLCAgMzcsICAzMiwgIDUwLAotICAgIDI2LCAgMjAsICAzOCwgIDE0LCAgNCwgICAyNCwgIDAsICAgMCwgICA0LCAgIDAsICAgMCwgICAwLCAgIDc2LCAgNjksICA4MSwKLSAgICA2OCwgIDYwLCAgNzIsICA1OCwgIDUyLCAgNjIsICA0OCwgIDQyLCAgNTEsICAzOCwgIDMyLCAgNDEsICAyNywgIDIxLCAgMzAsCi0gICAgMTQsICA0LCAgIDE2LCAgMCwgICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgNzYsICA2OSwgIDY4LCAgNjgsICA2MSwgIDYwLAotICAgIDYwLCAgNTIsICA1MSwgIDQ5LCAgNDMsICA0MSwgIDM4LCAgMzMsICAzMiwgIDI3LCAgMjEsICAyMCwgIDE0LCAgNSwgICA1LAotICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDc4LCAgNzAsICA1OSwgIDY5LCAgNjEsICA1MCwgIDYwLCAgNTIsICA0MiwKLSAgICA0OSwgIDQzLCAgMzQsICAzOSwgIDMzLCAgMjQsICAyNywgIDIyLCAgMTMsICAxNCwgIDcsICAgMSwgICAwLCAgIDAsICAgMCwKLSAgICAwLCAgIDAsICAgMCwgICA3NSwgIDQ2LCAgMTQ2LCA2OCwgIDM4LCAgMTMxLCA2MCwgIDMwLCAgMTE3LCA1MCwgIDE5LCAgMTAyLAotICAgIDQxLCAgNCwgICA4NywgIDI5LCAgMCwgICA3MiwgIDEzLCAgMCwgICA1NSwgIDAsICAgMCwgICAzMywgIDAsICAgMCwgICAwLAotICAgIDc4LCAgNDcsICAxMzIsIDcwLCAgMzksICAxMTksIDYxLCAgMzAsICAxMDUsIDUzLCAgMjAsICA5MiwgIDQyLCAgNSwgICA3OCwKLSAgICAzMCwgIDAsICAgNjQsICAxMywgIDAsICAgNDksICAwLCAgIDAsICAgMjcsICAwLCAgIDAsICAgMCwgICA3OSwgIDQ4LCAgMTIyLAotICAgIDcwLCAgNDAsICAxMDgsIDYyLCAgMzIsICA5NiwgIDUyLCAgMjIsICA4NCwgIDQyLCAgOSwgICA3MSwgIDMwLCAgMCwgICA1OCwKLSAgICAxNCwgIDAsICAgNDIsICAwLCAgIDAsICAgMjAsICAwLCAgIDAsICAgMCwgICA3OSwgIDUwLCAgMTExLCA3MCwgIDQyLCAgOTksCi0gICAgNjIsICAzMywgIDg4LCAgNTIsICAyMywgIDc0LCAgNDEsICAxMSwgIDYzLCAgMjksICAwLCAgIDUwLCAgMTQsICAwLCAgIDM2LAotICAgIDAsICAgMCwgICAxNCwgIDAsICAgMCwgICAwLCAgIDgwLCAgNTAsICA5OSwgIDcwLCAgNDIsICA4OSwgIDYxLCAgMzQsICA3OCwKLSAgICA1MiwgIDI1LCAgNjcsICA0MSwgIDE0LCAgNTUsICAzMCwgIDAsICAgNDIsICAxNSwgIDAsICAgMjgsICAwLCAgIDAsICAgNiwKLSAgICAwLCAgIDAsICAgMCwgICA4MSwgIDUxLCAgODksICA3MSwgIDQzLCAgNzgsICA2MiwgIDM1LCAgNjksICA1MiwgIDI1LCAgNTgsCi0gICAgNDIsICAxNSwgIDQ3LCAgMzAsICAzLCAgIDM2LCAgMTUsICAwLCAgIDIyLCAgMCwgICAwLCAgIDMsICAgMCwgICAwLCAgIDAsCi0gICAgODEsICA1MSwgIDc3LCAgNzEsICA0NCwgIDY4LCAgNjMsICAzNiwgIDU5LCAgNTMsICAyNiwgIDQ5LCAgNDEsICAxNiwgIDM4LAotICAgIDMxLCAgNCwgICAyNywgIDE2LCAgMCwgICAxMiwgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDgxLCAgNTIsICA2NSwKLSAgICA3MiwgIDQzLCAgNTYsICA2MywgIDM2LCAgNDgsICA1MywgIDI3LCAgMzksICA0MSwgIDE3LCAgMjksICAzMCwgIDQsICAgMTgsCi0gICAgMTQsICAwLCAgIDMsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgODEsICA1MiwgIDU1LCAgNzMsICA0NCwgIDQ3LAotICAgIDY0LCAgMzYsICAzOSwgIDUzLCAgMjgsICAzMiwgIDQyLCAgMTgsICAyMSwgIDMxLCAgNiwgICA5LCAgIDE0LCAgMCwgICAwLAotICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTc0LCAyMzksIDAsICAgMTU2LCAyMTQsIDAsICAgMTM5LCAxOTIsCi0gICAgMCwgICAxMjEsIDE2OCwgMCwgICAxMDUsIDE0NSwgMCwgICA4NywgIDEyMywgMCwgICA2OCwgIDk4LCAgMCwgICA0NiwgIDcwLAotICAgIDAsICAgMywgICAzNSwgIDAsICAgMTcyLCAyMTcsIDAsICAgMTU1LCAxOTQsIDAsICAgMTM5LCAxNzMsIDAsICAgMTIxLCAxNTIsCi0gICAgMCwgICAxMDQsIDEzMCwgMCwgICA4NywgIDExMCwgMCwgICA2OSwgIDg4LCAgMCwgICA0NiwgIDYzLCAgMCwgICA0LCAgIDI4LAotICAgIDAsICAgMTcxLCAxOTcsIDAsICAgMTUzLCAxNzUsIDAsICAgMTM4LCAxNTgsIDAsICAgMTIxLCAxMzksIDAsICAgMTAzLCAxMTgsCi0gICAgMCwgICA4NiwgIDEwMCwgMCwgICA2OCwgIDc5LCAgMCwgICA0NiwgIDU1LCAgMCwgICA0LCAgIDIyLCAgMCwgICAxNzAsIDE3NywKLSAgICAwLCAgIDE1MiwgMTU4LCAwLCAgIDEzNiwgMTQxLCAwLCAgIDExOSwgMTI0LCAwLCAgIDEwMywgMTA2LCAwLCAgIDg2LCAgODgsCi0gICAgMCwgICA2OCwgIDcwLCAgMCwgICA0NSwgIDQ3LCAgMCwgICAzLCAgIDE0LCAgMCwgICAxNjksIDE1NywgMCwgICAxNTIsIDE0MSwKLSAgICAwLCAgIDEzNiwgMTI2LCAwLCAgIDExOSwgMTA5LCAwLCAgIDEwMiwgOTQsICAwLCAgIDg2LCAgNzgsICAwLCAgIDY4LCAgNjAsCi0gICAgMCwgICA0NiwgIDM5LCAgMCwgICAzLCAgIDUsICAgMCwgICAxNjcsIDEzOCwgMCwgICAxNTAsIDEyNCwgMCwgICAxMzUsIDExMSwKLSAgICAwLCAgIDExOCwgOTcsICAwLCAgIDEwMiwgODIsICAwLCAgIDg1LCAgNjgsICAwLCAgIDY4LCAgNTIsICAwLCAgIDQ2LCAgMzEsCi0gICAgMCwgICAzLCAgIDAsICAgMCwgICAxNjcsIDExOCwgMCwgICAxNTAsIDEwNCwgMCwgICAxMzUsIDk0LCAgMCwgICAxMTgsIDgxLAotICAgIDAsICAgMTAxLCA2OSwgIDAsICAgODQsICA1NiwgIDAsICAgNjcsICA0MSwgIDAsICAgNDUsICAyMSwgIDAsICAgMywgICAwLAotICAgIDAsICAgMTY2LCA5NywgIDAsICAgMTQ5LCA4NywgIDAsICAgMTM0LCA3NywgIDAsICAgMTE3LCA2NywgIDAsICAgMTAxLCA1NiwKLSAgICAwLCAgIDg1LCAgNDQsICAwLCAgIDY3LCAgMzAsICAwLCAgIDQ1LCAgMTAsICAwLCAgIDMsICAgMCwgICAwLCAgIDE2NSwgNzksCi0gICAgMCwgICAxNDksIDczLCAgMCwgICAxMzMsIDY0LCAgMCwgICAxMTcsIDU2LCAgMCwgICAxMDEsIDQ2LCAgMCwgICA4NSwgIDM0LAotICAgIDAsICAgNjgsICAyMSwgIDAsICAgNDYsICAxLCAgIDAsICAgMywgICAwLCAgIDAsICAgMTU4LCAyMjUsIDAsICAgMTQxLCAyMDEsCi0gICAgMCwgICAxMjYsIDE4MCwgMCwgICAxMDksIDE1OCwgMCwgICA5NCwgIDEzNiwgMCwgICA3OCwgIDExNCwgMCwgICA2MCwgIDkxLAotICAgIDAsICAgMzgsICA2NiwgIDAsICAgMCwgICAzMCwgIDAsICAgMTU2LCAyMDMsIDAsICAgMTQwLCAxODMsIDAsICAgMTI1LCAxNjQsCi0gICAgMCwgICAxMDksIDE0MywgMCwgICA5NCwgIDEyNCwgMCwgICA3OCwgIDEwNCwgMCwgICA2MSwgIDgzLCAgMCwgICAzOCwgIDU3LAotICAgIDAsICAgMCwgICAyMywgIDAsICAgMTU2LCAxODYsIDAsICAgMTQwLCAxNjYsIDAsICAgMTI1LCAxNTAsIDAsICAgMTA5LCAxMzAsCi0gICAgMCwgICA5MywgIDExMSwgMCwgICA3NywgIDkzLCAgMCwgICA2MCwgIDc0LCAgMCwgICAzOCwgIDUwLCAgMCwgICAwLCAgIDE3LAotICAgIDAsICAgMTU1LCAxNjcsIDAsICAgMTM4LCAxNDksIDAsICAgMTI0LCAxMzQsIDAsICAgMTA5LCAxMTcsIDAsICAgOTMsICAxMDAsCi0gICAgMCwgICA3NiwgIDgzLCAgMCwgICA2MCwgIDY1LCAgMCwgICAzOCwgIDQzLCAgMCwgICAwLCAgIDksICAgMCwgICAxNTMsIDE0NywKLSAgICAwLCAgIDEzOCwgMTM0LCAwLCAgIDEyNCwgMTIwLCAwLCAgIDEwNywgMTAzLCAwLCAgIDkyLCAgODgsICAwLCAgIDc3LCAgNzMsCi0gICAgMCwgICA2MCwgIDU2LCAgMCwgICAzOCwgIDM1LCAgMCwgICAwLCAgIDAsICAgMCwgICAxNTMsIDEzMSwgMCwgICAxMzcsIDExOCwKLSAgICAwLCAgIDEyMiwgMTA1LCAwLCAgIDEwNywgOTAsICAwLCAgIDkxLCAgNzYsICAwLCAgIDc2LCAgNjMsICAwLCAgIDYwLCAgNDcsCi0gICAgMCwgICAzOSwgIDI4LCAgMCwgICAwLCAgIDAsICAgMCwgICAxNTMsIDExMSwgMCwgICAxMzYsIDEwMCwgMCwgICAxMjMsIDkwLAotICAgIDAsICAgMTA3LCA3NywgIDAsICAgOTIsICA2NSwgIDAsICAgNzYsICA1MiwgIDAsICAgNjAsICAzNywgIDAsICAgMzgsICAxOCwKLSAgICAwLCAgIDAsICAgMCwgICAwLCAgIDE1MiwgOTMsICAwLCAgIDEzNiwgODIsICAwLCAgIDEyMiwgNzQsICAwLCAgIDEwNiwgNjMsCi0gICAgMCwgICA5MSwgIDUyLCAgMCwgICA3NiwgIDQwLCAgMCwgICA1OSwgIDI2LCAgMCwgICAzOCwgIDYsICAgMCwgICAwLCAgIDAsCi0gICAgMCwgICAxNTEsIDc4LCAgMCwgICAxMzYsIDY5LCAgMCwgICAxMjEsIDYxLCAgMCwgICAxMDYsIDUyLCAgMCwgICA5MSwgIDQzLAotICAgIDAsICAgNzYsICAzMiwgIDAsICAgNTksICAxNywgIDAsICAgMzgsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTQzLCAyMTMsCi0gICAgMCwgICAxMjgsIDE5MSwgMCwgICAxMTUsIDE3MSwgMCwgICAxMDAsIDE0OSwgMCwgICA4NCwgIDEyOCwgMCwgICA2OSwgIDEwOCwKLSAgICAwLCAgIDUyLCAgODYsICAwLCAgIDMwLCAgNjEsICAwLCAgIDAsICAgMjUsICAwLCAgIDE0MiwgMTkzLCAwLCAgIDEyNywgMTczLAotICAgIDAsICAgMTE0LCAxNTQsIDAsICAgOTksICAxMzQsIDAsICAgODQsICAxMTYsIDAsICAgNjksICA5OCwgIDAsICAgNTIsICA3NywKLSAgICAwLCAgIDMxLCAgNTMsICAwLCAgIDAsICAgMTgsICAwLCAgIDE0MSwgMTc2LCAwLCAgIDEyNywgMTU4LCAwLCAgIDExNCwgMTQxLAotICAgIDAsICAgOTgsICAxMjIsIDAsICAgODQsICAxMDUsIDAsICAgNjksICA4OCwgIDAsICAgNTMsICA2OSwgIDAsICAgMzEsICA0NiwKLSAgICAwLCAgIDAsICAgOSwgICAwLCAgIDE0MSwgMTU5LCAwLCAgIDEyNiwgMTQyLCAwLCAgIDExMywgMTI3LCAwLCAgIDk4LCAgMTEwLAotICAgIDAsICAgODMsICA5NSwgIDAsICAgNjksICA3OCwgIDAsICAgNTMsICA2MCwgIDAsICAgMzIsICAzOSwgIDAsICAgMCwgICAyLAotICAgIDAsICAgMTQwLCAxNDAsIDAsICAgMTI2LCAxMjYsIDAsICAgMTEyLCAxMTIsIDAsICAgOTgsICA5OCwgIDAsICAgODMsICA4MywKLSAgICAwLCAgIDY4LCAgNjksICAwLCAgIDUyLCAgNTIsICAwLCAgIDMxLCAgMzEsICAwLCAgIDAsICAgMCwgICAwLCAgIDE0MCwgMTI0LAotICAgIDAsICAgMTI1LCAxMTIsIDAsICAgMTEyLCAxMDAsIDAsICAgOTcsICA4NiwgIDAsICAgODMsICA3MiwgIDAsICAgNjgsICA1OSwKLSAgICAwLCAgIDUyLCAgNDQsICAwLCAgIDMxLCAgMjMsICAwLCAgIDAsICAgMCwgICAwLCAgIDEzOSwgMTA2LCAwLCAgIDEyNSwgOTYsCi0gICAgMCwgICAxMTEsIDg1LCAgMCwgICA5NywgIDcyLCAgMCwgICA4MywgIDYyLCAgMCwgICA2OCwgIDQ5LCAgMCwgICA1MiwgIDM1LAotICAgIDAsICAgMzEsICAxNSwgIDAsICAgMCwgICAwLCAgIDAsICAgMTM4LCA4OCwgIDAsICAgMTI0LCA3OSwgIDAsICAgMTExLCA3MCwKLSAgICAwLCAgIDk2LCAgNTksICAwLCAgIDgyLCAgNDgsICAwLCAgIDY4LCAgMzgsICAwLCAgIDUyLCAgMjQsICAwLCAgIDMxLCAgNCwKLSAgICAwLCAgIDAsICAgMCwgICAwLCAgIDEzOSwgNzYsICAwLCAgIDEyNCwgNjYsICAwLCAgIDExMSwgNTgsICAwLCAgIDk2LCAgNTAsCi0gICAgMCwgICA4MiwgIDQwLCAgMCwgICA2OCwgIDI5LCAgMCwgICA1MiwgIDE1LCAgMCwgICAzMSwgIDAsICAgMCwgICAwLCAgIDAsCi0gICAgMCwgICAxMjksIDIwMCwgMCwgICAxMTQsIDE3OSwgMCwgICAxMDIsIDE2MCwgMCwgICA4NywgIDEzOSwgMCwgICA3NCwgIDEyMCwKLSAgICAwLCAgIDYwLCAgMTAxLCAwLCAgIDQ0LCAgODEsICAwLCAgIDIyLCAgNTYsICAwLCAgIDAsICAgMTksICAwLCAgIDEyNywgMTgxLAotICAgIDAsICAgMTE0LCAxNjMsIDAsICAgMTAyLCAxNDYsIDAsICAgODgsICAxMjcsIDAsICAgNzQsICAxMDksIDAsICAgNjAsICA5MSwKLSAgICAwLCAgIDQ0LCAgNzIsICAwLCAgIDIzLCAgNDgsICAwLCAgIDAsICAgMTEsICAwLCAgIDEyNywgMTY2LCAwLCAgIDExMywgMTQ4LAotICAgIDAsICAgMTAxLCAxMzMsIDAsICAgODcsICAxMTUsIDAsICAgNzQsICA5OSwgIDAsICAgNjAsICA4MiwgIDAsICAgNDQsICA2NCwKLSAgICAwLCAgIDIzLCAgNDIsICAwLCAgIDAsICAgNCwgICAwLCAgIDEyNywgMTUwLCAwLCAgIDExMywgMTM0LCAwLCAgIDEwMSwgMTE5LAotICAgIDAsICAgODcsICAxMDQsIDAsICAgNzQsICA4OSwgIDAsICAgNjAsICA3MywgIDAsICAgNDQsICA1NiwgIDAsICAgMjMsICAzNSwKLSAgICAwLCAgIDAsICAgMCwgICAwLCAgIDEyNSwgMTM0LCAwLCAgIDExMiwgMTE4LCAwLCAgIDEwMCwgMTA2LCAwLCAgIDg3LCAgOTIsCi0gICAgMCwgICA3MywgIDc4LCAgMCwgICA2MCwgIDY0LCAgMCwgICA0NCwgIDQ4LCAgMCwgICAyMywgIDI3LCAgMCwgICAwLCAgIDAsCi0gICAgMCwgICAxMjUsIDExOCwgMCwgICAxMTIsIDEwNSwgMCwgICAxMDAsIDk0LCAgMCwgICA4NiwgIDgwLCAgMCwgICA3MywgIDY4LAotICAgIDAsICAgNjAsICA1NCwgIDAsICAgNDQsICAzOSwgIDAsICAgMjMsICAyMCwgIDAsICAgMCwgICAwLCAgIDAsICAgMTI1LCAxMDEsCi0gICAgMCwgICAxMTEsIDkwLCAgMCwgICA5OSwgIDgwLCAgMCwgICA4NiwgIDY5LCAgMCwgICA3MywgIDU4LCAgMCwgICA1OSwgIDQ1LAotICAgIDAsICAgNDQsICAzMCwgIDAsICAgMjMsICAxMSwgIDAsICAgMCwgICAwLCAgIDAsICAgMTI0LCA4NSwgIDAsICAgMTExLCA3NSwKLSAgICAwLCAgIDk5LCAgNjYsICAwLCAgIDg2LCAgNTYsICAwLCAgIDczLCAgNDUsICAwLCAgIDU5LCAgMzQsICAwLCAgIDQ0LCAgMjAsCi0gICAgMCwgICAyMywgIDEsICAgMCwgICAwLCAgIDAsICAgMCwgICAxMjUsIDcyLCAgMCwgICAxMTEsIDYyLCAgMCwgICA5OSwgIDU2LAotICAgIDAsICAgODYsICA0NiwgIDAsICAgNzMsICAzNiwgIDAsICAgNjAsICAyNiwgIDAsICAgNDQsICAxMiwgIDAsICAgMjMsICAwLAotICAgIDAsICAgMCwgICAwLCAgIDAsICAgMTE0LCAxODgsIDAsICAgMTAxLCAxNjcsIDAsICAgODksICAxNTAsIDAsICAgNzcsICAxMzEsCi0gICAgMCwgICA2NCwgIDExMywgMCwgICA1MCwgIDk1LCAgMCwgICAzNCwgIDc1LCAgMCwgICAxMiwgIDUyLCAgMCwgICAwLCAgIDE0LAotICAgIDAsICAgMTEzLCAxNzAsIDAsICAgMTAxLCAxNTMsIDAsICAgODksICAxMzcsIDAsICAgNzcsICAxMjAsIDAsICAgNjQsICAxMDIsCi0gICAgMCwgICA1MCwgIDg1LCAgMCwgICAzNSwgIDY3LCAgMCwgICAxMiwgIDQ0LCAgMCwgICAwLCAgIDQsICAgMCwgICAxMTMsIDE1NiwKLSAgICAwLCAgIDEwMCwgMTM5LCAwLCAgIDg5LCAgMTI1LCAwLCAgIDc3LCAgMTA5LCAwLCAgIDY0LCAgOTIsICAwLCAgIDUxLCAgNzcsCi0gICAgMCwgICAzNSwgIDYwLCAgMCwgICAxMiwgIDM4LCAgMCwgICAwLCAgIDAsICAgMCwgICAxMTIsIDE0MSwgMCwgICAxMDAsIDEyNiwKLSAgICAwLCAgIDg5LCAgMTEzLCAwLCAgIDc3LCAgOTgsICAwLCAgIDY0LCAgODMsICAwLCAgIDUxLCAgNjgsICAwLCAgIDM1LCAgNTEsCi0gICAgMCwgICAxMiwgIDMwLCAgMCwgICAwLCAgIDAsICAgMCwgICAxMTIsIDEyNywgMCwgICAxMDAsIDExMiwgMCwgICA4OSwgIDEwMCwKLSAgICAwLCAgIDc2LCAgODcsICAwLCAgIDY0LCAgNzQsICAwLCAgIDUxLCAgNTksICAwLCAgIDM1LCAgNDQsICAwLCAgIDEzLCAgMjQsCi0gICAgMCwgICAwLCAgIDAsICAgMCwgICAxMTIsIDExMSwgMCwgICAxMDAsIDEwMCwgMCwgICA4OCwgIDg4LCAgMCwgICA3NiwgIDc2LAotICAgIDAsICAgNjQsICA2NCwgIDAsICAgNTEsICA1MiwgIDAsICAgMzYsICAzNywgIDAsICAgMTMsICAxNywgIDAsICAgMCwgICAwLAotICAgIDAsICAgMTExLCA5NiwgIDAsICAgOTksICA4NSwgIDAsICAgODgsICA3NiwgIDAsICAgNzYsICA2NCwgIDAsICAgNjQsICA1MywKLSAgICAwLCAgIDUxLCAgNDEsICAwLCAgIDM2LCAgMjcsICAwLCAgIDEzLCAgNiwgICAwLCAgIDAsICAgMCwgICAwLCAgIDExMSwgODEsCi0gICAgMCwgICA5OSwgIDcxLCAgMCwgICA4OCwgIDYyLCAgMCwgICA3NiwgIDUyLCAgMCwgICA2NCwgIDQzLCAgMCwgICA1MSwgIDMxLAotICAgIDAsICAgMzYsICAxNywgIDAsICAgMTMsICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMTExLCA2OSwgIDAsICAgOTksICA2MCwKLSAgICAwLCAgIDg4LCAgNTIsICAwLCAgIDc1LCAgNDMsICAwLCAgIDYzLCAgMzQsICAwLCAgIDUxLCAgMjEsICAwLCAgIDM2LCAgNywKLSAgICAwLCAgIDEzLCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDk5LCAgMTc3LCAwLCAgIDg4LCAgMTU4LCAwLCAgIDc3LCAgMTQxLAotICAgIDAsICAgNjYsICAxMjMsIDAsICAgNTMsICAxMDYsIDAsICAgNDAsICA4OSwgIDAsICAgMjUsICA3MSwgIDAsICAgNSwgICA0NywKLSAgICAwLCAgIDAsICAgOCwgICAwLCAgIDk5LCAgMTYwLCAwLCAgIDg4LCAgMTQ0LCAwLCAgIDc3LCAgMTI5LCAwLCAgIDY2LCAgMTEyLAotICAgIDAsICAgNTQsICA5NywgIDAsICAgNDEsICA4MCwgIDAsICAgMjYsICA2MiwgIDAsICAgNSwgICA0MCwgIDAsICAgMCwgICAwLAotICAgIDAsICAgOTksICAxNDcsIDAsICAgODcsICAxMzIsIDAsICAgNzgsICAxMTcsIDAsICAgNjYsICAxMDIsIDAsICAgNTQsICA4NywKLSAgICAwLCAgIDQyLCAgNzIsICAwLCAgIDI2LCAgNTUsICAwLCAgIDUsICAgMzQsICAwLCAgIDAsICAgMCwgICAwLCAgIDk5LCAgMTM0LAotICAgIDAsICAgODgsICAxMTksIDAsICAgNzcsICAxMDcsIDAsICAgNjYsICA5MiwgIDAsICAgNTQsICA3OCwgIDAsICAgNDIsICA2NCwKLSAgICAwLCAgIDI3LCAgNDgsICAwLCAgIDUsICAgMjcsICAwLCAgIDAsICAgMCwgICAwLCAgIDk5LCAgMTIwLCAwLCAgIDg3LCAgMTA3LAotICAgIDAsICAgNzgsICA5NCwgIDAsICAgNjYsICA4MSwgIDAsICAgNTQsICA2OCwgIDAsICAgNDIsICA1NSwgIDAsICAgMjcsICA0MCwKLSAgICAwLCAgIDYsICAgMjAsICAwLCAgIDAsICAgMCwgICAwLCAgIDk4LCAgMTA1LCAwLCAgIDg3LCAgOTQsICAwLCAgIDc3LCAgODQsCi0gICAgMCwgICA2NSwgIDcxLCAgMCwgICA1NSwgIDU5LCAgMCwgICA0MiwgIDQ3LCAgMCwgICAyOCwgIDMzLCAgMCwgICA2LCAgIDEyLAotICAgIDAsICAgMCwgICAwLCAgIDAsICAgOTgsICA5MywgIDAsICAgODcsICA4MSwgIDAsICAgNzcsICA3MiwgIDAsICAgNjYsICA2MSwKLSAgICAwLCAgIDU0LCAgNDksICAwLCAgIDQyLCAgMzcsICAwLCAgIDI4LCAgMjQsICAwLCAgIDYsICAgNCwgICAwLCAgIDAsICAgMCwKLSAgICAwLCAgIDk4LCAgNzcsICAwLCAgIDg3LCAgNjgsICAwLCAgIDc3LCAgNTksICAwLCAgIDY1LCAgNDksICAwLCAgIDU0LCAgMzksCi0gICAgMCwgICA0MiwgIDI3LCAgMCwgICAyOSwgIDE0LCAgMCwgICA2LCAgIDAsICAgMCwgICAwLCAgIDAsICAgMSwgICA5OCwgIDY1LAotICAgIDcsICAgODcsICA1NiwgIDAsICAgNzcsICA0OSwgIDAsICAgNjYsICA0MSwgIDAsICAgNTQsICAzMCwgIDAsICAgNDIsICAxOSwKLSAgICAwLCAgIDI5LCAgMywgICAwLCAgIDYsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDg0LCAgMTY2LCAwLCAgIDc0LCAgMTQ5LAotICAgIDAsICAgNjQsICAxMzQsIDAsICAgNTMsICAxMTcsIDAsICAgNDEsICAxMDAsIDAsICAgMjgsICA4MywgIDAsICAgMTEsICA2NCwKLSAgICAwLCAgIDAsICAgNDIsICAwLCAgIDAsICAgMywgICAwLCAgIDg0LCAgMTUxLCAwLCAgIDc0LCAgMTM1LCAwLCAgIDY0LCAgMTIxLAotICAgIDAsICAgNTMsICAxMDUsIDAsICAgNDIsICA5MCwgIDAsICAgMzAsICA3NSwgIDAsICAgMTQsICA1OCwgIDAsICAgMCwgICAzNiwKLSAgICAwLCAgIDAsICAgMCwgICAwLCAgIDg0LCAgMTM4LCAwLCAgIDc0LCAgMTI0LCAxLCAgIDY0LCAgMTEwLCAwLCAgIDU0LCAgOTUsCi0gICAgMCwgICA0MywgIDgxLCAgMCwgICAzMCwgIDY3LCAgMCwgICAxNSwgIDUxLCAgMCwgICAxLCAgIDI5LCAgMCwgICAwLCAgIDAsCi0gICAgMTQsICA4NCwgIDEyNiwgMTIsICA3NCwgIDExMiwgMiwgICA2NSwgIDk5LCAgMCwgICA1NCwgIDg1LCAgMCwgICA0NCwgIDczLAotICAgIDAsICAgMzEsICA1OSwgIDAsICAgMTYsICA0NCwgIDAsICAgMSwgICAyMywgIDAsICAgMCwgICAwLCAgIDE2LCAgODQsICAxMTMsCi0gICAgMTMsICA3NCwgIDEwMCwgNiwgICA2NSwgIDg5LCAgMCwgICA1NCwgIDc3LCAgMCwgICA0NCwgIDY1LCAgMCwgICAzMSwgIDUxLAotICAgIDAsICAgMTcsICAzNiwgIDAsICAgMSwgICAxNiwgIDAsICAgMCwgICAwLCAgIDI0LCAgODQsICAxMDAsIDE4LCAgNzQsICA4OCwKLSAgICAxMywgIDY1LCAgNzgsICAyLCAgIDU1LCAgNjgsICAwLCAgIDQ0LCAgNTUsICAwLCAgIDMyLCAgNDMsICAwLCAgIDE4LCAgMjgsCi0gICAgMCwgICAxLCAgIDYsICAgMCwgICAwLCAgIDAsICAgMjYsICA4NCwgIDg3LCAgMjQsICA3NCwgIDc2LCAgMTcsICA2NSwgIDY3LAotICAgIDcsICAgNTQsICA1NywgIDAsICAgNDQsICA0NiwgIDAsICAgMzIsICAzNSwgIDAsICAgMTksICAyMSwgIDAsICAgMiwgICAzLAotICAgIDAsICAgMCwgICAwLCAgIDMwLCAgODQsICA3NCwgIDI4LCAgNzQsICA2NCwgIDIwLCAgNjUsICA1NSwgIDEyLCAgNTUsICA0NiwKLSAgICAwLCAgIDQ0LCAgMzUsICAwLCAgIDMyLCAgMjQsICAwLCAgIDE4LCAgOSwgICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAzMiwgIDg0LCAgNjMsICAyOCwgIDc0LCAgNTQsICAyMSwgIDY1LCAgNDcsICAxMywgIDU0LCAgMzgsICAwLCAgIDQ0LCAgMjgsCi0gICAgMCwgICAzMiwgIDE2LCAgMCwgICAxOCwgIDEsICAgMCwgICAxLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMzAsICA2NywgIDE1NSwKLSAgICAyMCwgIDU4LCAgMTM5LCAyMCwgIDQ5LCAgMTI2LCAxMiwgIDM5LCAgMTEwLCAwLCAgIDI3LCAgOTQsICAwLCAgIDEzLCAgNzcsCi0gICAgMCwgICAwLCAgIDYwLCAgMCwgICAwLCAgIDM3LCAgMCwgICAwLCAgIDAsICAgMzUsICA2NywgIDE0MiwgMzAsICA1OCwgIDEyNiwKLSAgICAyMywgIDUwLCAgMTE0LCAxNiwgIDQwLCAgOTksICA3LCAgIDI5LCAgODUsICAwLCAgIDE1LCAgNjksICAwLCAgIDAsICAgNTIsCi0gICAgMCwgICAwLCAgIDMwLCAgMCwgICAwLCAgIDAsICAgMzUsICA2OCwgIDEzMSwgMzAsICA1OSwgIDExNiwgMjcsICA1MCwgIDEwNCwKLSAgICAxOCwgIDQwLCAgOTAsICA5LCAgIDI5LCAgNzYsICAwLCAgIDE3LCAgNjIsICAwLCAgIDIsICAgNDYsICAwLCAgIDAsICAgMjQsCi0gICAgMCwgICAwLCAgIDAsICAgMzcsICA2OSwgIDExOSwgMzMsICA1OSwgIDEwNiwgMjcsICA1MSwgIDk0LCAgMjEsICA0MSwgIDgwLAotICAgIDksICAgMzAsICA2NywgIDAsICAgMTgsICA1NCwgIDAsICAgMywgICAzOSwgIDAsICAgMCwgICAxOCwgIDAsICAgMCwgICAwLAotICAgIDQwLCAgNjksICAxMDcsIDM2LCAgNTksICA5NCwgIDI4LCAgNTEsICA4NCwgIDE4LCAgNDEsICA3MiwgIDEwLCAgMzEsICA2MCwKLSAgICAwLCAgIDE5LCAgNDcsICAwLCAgIDQsICAgMzIsICAwLCAgIDAsICAgMTAsICAwLCAgIDAsICAgMCwgICA0MiwgIDY5LCAgOTUsCi0gICAgMzYsICA1OSwgIDg0LCAgMjksICA1MSwgIDc0LCAgMTksICA0MSwgIDYzLCAgMTAsICAzMSwgIDUyLCAgMCwgICAyMCwgIDM5LAotICAgIDAsICAgNCwgICAyNSwgIDAsICAgMCwgICA0LCAgIDAsICAgMCwgICAwLCAgIDQzLCAgNjksICA4MywgIDM4LCAgNjAsICA3MywKLSAgICAzMiwgIDUxLCAgNjIsICAyMywgIDQyLCAgNTMsICAxMSwgIDMxLCAgNDIsICAwLCAgIDIwLCAgMzEsICAwLCAgIDUsICAgMTcsCi0gICAgMCwgICAwLCAgIDEsICAgMCwgICAwLCAgIDAsICAgNDUsICA2OSwgIDcwLCAgMzksICA2MCwgIDYwLCAgMzMsICA1MSwgIDUyLAotICAgIDI0LCAgNDIsICA0MywgIDEzLCAgMzIsICAzMywgIDAsICAgMjEsICAyMSwgIDAsICAgNSwgICA2LCAgIDAsICAgMCwgICAwLAotICAgIDAsICAgMCwgICAwLCAgIDQ3LCAgNjksICA1OSwgIDQxLCAgNjAsICA1MSwgIDM0LCAgNTEsICA0MywgIDI0LCAgNDIsICAzNSwKLSAgICAxMiwgIDMzLCAgMjYsICAxLCAgIDIyLCAgMTQsICAwLCAgIDUsICAgMSwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICA0NiwgIDQ4LCAgMTQ2LCA0MiwgIDQwLCAgMTMxLCAzNiwgIDMyLCAgMTE4LCAyNywgIDIyLCAgMTAzLCAxNywgIDYsICAgODgsCi0gICAgNSwgICAwLCAgIDczLCAgMCwgICAwLCAgIDU1LCAgMCwgICAwLCAgIDMzLCAgMCwgICAwLCAgIDAsICAgNDgsICA0OCwgIDEzMywKLSAgICA0NCwgIDQwLCAgMTE5LCAzNywgIDMyLCAgMTA3LCAyOCwgIDIyLCAgOTMsICAyMCwgIDgsICAgNzksICA3LCAgIDAsICAgNjUsCi0gICAgMCwgICAwLCAgIDQ5LCAgMCwgICAwLCAgIDI3LCAgMCwgICAwLCAgIDAsICAgNDgsICA1MCwgIDEyMywgNDQsICA0MSwgIDEwOSwKLSAgICAzNywgIDMzLCAgOTcsICAzMCwgIDIzLCAgODMsICAyMSwgIDExLCAgNzEsICA4LCAgIDAsICAgNTgsICAwLCAgIDAsICAgNDIsCi0gICAgMCwgICAwLCAgIDIxLCAgMCwgICAwLCAgIDAsICAgNDksICA1MSwgIDExMSwgNDUsICA0MiwgIDk5LCAgMzgsICAzNCwgIDg3LAotICAgIDI5LCAgMjUsICA3NSwgIDIwLCAgMTMsICA2MywgIDgsICAgMCwgICA1MSwgIDAsICAgMCwgICAzNiwgIDAsICAgMCwgICAxNCwKLSAgICAwLCAgIDAsICAgMCwgICA1MiwgIDUyLCAgMTAwLCA0NCwgIDQzLCAgODksICAzOCwgIDM1LCAgNzksICAyOSwgIDI2LCAgNjgsCi0gICAgMTksICAxNSwgIDU2LCAgMTAsICAxLCAgIDQzLCAgMCwgICAwLCAgIDI4LCAgMCwgICAwLCAgIDYsICAgMCwgICAwLCAgIDAsCi0gICAgNTIsICA1MiwgIDkwLCAgNDcsICA0NCwgIDc5LCAgMzksICAzNiwgIDcwLCAgMzAsICAyNywgIDU5LCAgMjAsICAxNiwgIDQ3LAotICAgIDksICAgMiwgICAzNiwgIDAsICAgMCwgICAyMiwgIDAsICAgMCwgICAyLCAgIDAsICAgMCwgICAwLCAgIDUyLCAgNTMsICA3OCwKLSAgICA0NiwgIDQ0LCAgNjgsICAzOSwgIDM3LCAgNjAsICAzMiwgIDI3LCAgNDksICAyMiwgIDE3LCAgMzksICAxMCwgIDMsICAgMjgsCi0gICAgMCwgICAwLCAgIDEyLCAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgNTMsICA1MywgIDY2LCAgNDcsICA0NCwgIDU3LAotICAgIDQwLCAgMzYsICA0OCwgIDMyLCAgMjcsICAzOSwgIDIyLCAgMTgsICAzMCwgIDksICAgNCwgICAxOCwgIDAsICAgMCwgICAzLAotICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDU0LCAgNTMsICA1NywgIDQ4LCAgNDUsICA0OSwgIDQxLCAgMzcsICA0MSwKLSAgICAzMywgIDI4LCAgMzIsICAyMiwgIDE5LCAgMjMsICAxMSwgIDYsICAgMTAsICAxLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAwLCAgIDAsICAgMCwKLX07Ci12b2lkIEFkb2JlQ01ZS190b19zUkdCMSh1aW50OF90IGMsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG0sCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHksCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGssCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBSLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCYgRywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QmIEIpIHsKLSAgaW50IGZpeF9jID0gYyA8PCA4OwotICBpbnQgZml4X20gPSBtIDw8IDg7Ci0gIGludCBmaXhfeSA9IHkgPDwgODsKLSAgaW50IGZpeF9rID0gayA8PCA4OwotICBpbnQgY19pbmRleCA9IChmaXhfYyArIDQwOTYpID4+IDEzOwotICBpbnQgbV9pbmRleCA9IChmaXhfbSArIDQwOTYpID4+IDEzOwotICBpbnQgeV9pbmRleCA9IChmaXhfeSArIDQwOTYpID4+IDEzOwotICBpbnQga19pbmRleCA9IChmaXhfayArIDQwOTYpID4+IDEzOwotICBpbnQgcG9zID0gKGNfaW5kZXggKiA5ICogOSAqIDkgKyBtX2luZGV4ICogOSAqIDkgKyB5X2luZGV4ICogOSArIGtfaW5kZXgpICogMzsKLSAgaW50IGZpeF9yID0gZ19DTVlLU2FtcGxlc1twb3NdIDw8IDg7Ci0gIGludCBmaXhfZyA9IGdfQ01ZS1NhbXBsZXNbcG9zICsgMV0gPDwgODsKLSAgaW50IGZpeF9iID0gZ19DTVlLU2FtcGxlc1twb3MgKyAyXSA8PCA4OwotICBpbnQgYzFfaW5kZXggPSBmaXhfYyA+PiAxMzsKLSAgaWYgKGMxX2luZGV4ID09IGNfaW5kZXgpIHsKLSAgICBjMV9pbmRleCA9IGMxX2luZGV4ID09IDggPyBjMV9pbmRleCAtIDEgOiBjMV9pbmRleCArIDE7Ci0gIH0KLSAgaW50IG0xX2luZGV4ID0gZml4X20gPj4gMTM7Ci0gIGlmIChtMV9pbmRleCA9PSBtX2luZGV4KSB7Ci0gICAgbTFfaW5kZXggPSBtMV9pbmRleCA9PSA4ID8gbTFfaW5kZXggLSAxIDogbTFfaW5kZXggKyAxOwotICB9Ci0gIGludCB5MV9pbmRleCA9IGZpeF95ID4+IDEzOwotICBpZiAoeTFfaW5kZXggPT0geV9pbmRleCkgewotICAgIHkxX2luZGV4ID0geTFfaW5kZXggPT0gOCA/IHkxX2luZGV4IC0gMSA6IHkxX2luZGV4ICsgMTsKLSAgfQotICBpbnQgazFfaW5kZXggPSBmaXhfayA+PiAxMzsKLSAgaWYgKGsxX2luZGV4ID09IGtfaW5kZXgpIHsKLSAgICBrMV9pbmRleCA9IGsxX2luZGV4ID09IDggPyBrMV9pbmRleCAtIDEgOiBrMV9pbmRleCArIDE7Ci0gIH0KLSAgaW50IGMxX3BvcyA9IHBvcyArIChjMV9pbmRleCAtIGNfaW5kZXgpICogOSAqIDkgKiA5ICogMzsKLSAgaW50IG0xX3BvcyA9IHBvcyArIChtMV9pbmRleCAtIG1faW5kZXgpICogOSAqIDkgKiAzOwotICBpbnQgeTFfcG9zID0gcG9zICsgKHkxX2luZGV4IC0geV9pbmRleCkgKiA5ICogMzsKLSAgaW50IGsxX3BvcyA9IHBvcyArIChrMV9pbmRleCAtIGtfaW5kZXgpICogMzsKLSAgaW50IGNfcl9kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zXSAtIGdfQ01ZS1NhbXBsZXNbYzFfcG9zXTsKLSAgaW50IGNfZ19kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zICsgMV0gLSBnX0NNWUtTYW1wbGVzW2MxX3BvcyArIDFdOwotICBpbnQgY19iX2RlbHRhID0gZ19DTVlLU2FtcGxlc1twb3MgKyAyXSAtIGdfQ01ZS1NhbXBsZXNbYzFfcG9zICsgMl07Ci0gIGludCBtX3JfZGVsdGEgPSBnX0NNWUtTYW1wbGVzW3Bvc10gLSBnX0NNWUtTYW1wbGVzW20xX3Bvc107Ci0gIGludCBtX2dfZGVsdGEgPSBnX0NNWUtTYW1wbGVzW3BvcyArIDFdIC0gZ19DTVlLU2FtcGxlc1ttMV9wb3MgKyAxXTsKLSAgaW50IG1fYl9kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zICsgMl0gLSBnX0NNWUtTYW1wbGVzW20xX3BvcyArIDJdOwotICBpbnQgeV9yX2RlbHRhID0gZ19DTVlLU2FtcGxlc1twb3NdIC0gZ19DTVlLU2FtcGxlc1t5MV9wb3NdOwotICBpbnQgeV9nX2RlbHRhID0gZ19DTVlLU2FtcGxlc1twb3MgKyAxXSAtIGdfQ01ZS1NhbXBsZXNbeTFfcG9zICsgMV07Ci0gIGludCB5X2JfZGVsdGEgPSBnX0NNWUtTYW1wbGVzW3BvcyArIDJdIC0gZ19DTVlLU2FtcGxlc1t5MV9wb3MgKyAyXTsKLSAgaW50IGtfcl9kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zXSAtIGdfQ01ZS1NhbXBsZXNbazFfcG9zXTsKLSAgaW50IGtfZ19kZWx0YSA9IGdfQ01ZS1NhbXBsZXNbcG9zICsgMV0gLSBnX0NNWUtTYW1wbGVzW2sxX3BvcyArIDFdOwotICBpbnQga19iX2RlbHRhID0gZ19DTVlLU2FtcGxlc1twb3MgKyAyXSAtIGdfQ01ZS1NhbXBsZXNbazFfcG9zICsgMl07Ci0gIGludCBjX3JhdGUgPSAoZml4X2MgLSAoY19pbmRleCA8PCAxMykpICogKGNfaW5kZXggLSBjMV9pbmRleCk7Ci0gIGZpeF9yICs9IGNfcl9kZWx0YSAqIGNfcmF0ZSAvIDMyOwotICBmaXhfZyArPSBjX2dfZGVsdGEgKiBjX3JhdGUgLyAzMjsKLSAgZml4X2IgKz0gY19iX2RlbHRhICogY19yYXRlIC8gMzI7Ci0gIGludCBtX3JhdGUgPSAoZml4X20gLSAobV9pbmRleCA8PCAxMykpICogKG1faW5kZXggLSBtMV9pbmRleCk7Ci0gIGZpeF9yICs9IG1fcl9kZWx0YSAqIG1fcmF0ZSAvIDMyOwotICBmaXhfZyArPSBtX2dfZGVsdGEgKiBtX3JhdGUgLyAzMjsKLSAgZml4X2IgKz0gbV9iX2RlbHRhICogbV9yYXRlIC8gMzI7Ci0gIGludCB5X3JhdGUgPSAoZml4X3kgLSAoeV9pbmRleCA8PCAxMykpICogKHlfaW5kZXggLSB5MV9pbmRleCk7Ci0gIGZpeF9yICs9IHlfcl9kZWx0YSAqIHlfcmF0ZSAvIDMyOwotICBmaXhfZyArPSB5X2dfZGVsdGEgKiB5X3JhdGUgLyAzMjsKLSAgZml4X2IgKz0geV9iX2RlbHRhICogeV9yYXRlIC8gMzI7Ci0gIGludCBrX3JhdGUgPSAoZml4X2sgLSAoa19pbmRleCA8PCAxMykpICogKGtfaW5kZXggLSBrMV9pbmRleCk7Ci0gIGZpeF9yICs9IGtfcl9kZWx0YSAqIGtfcmF0ZSAvIDMyOwotICBmaXhfZyArPSBrX2dfZGVsdGEgKiBrX3JhdGUgLyAzMjsKLSAgZml4X2IgKz0ga19iX2RlbHRhICoga19yYXRlIC8gMzI7Ci0gIGlmIChmaXhfciA8IDApIHsKLSAgICBmaXhfciA9IDA7Ci0gIH0KLSAgaWYgKGZpeF9nIDwgMCkgewotICAgIGZpeF9nID0gMDsKLSAgfQotICBpZiAoZml4X2IgPCAwKSB7Ci0gICAgZml4X2IgPSAwOwotICB9Ci0gIFIgPSBmaXhfciA+PiA4OwotICBHID0gZml4X2cgPj4gODsKLSAgQiA9IGZpeF9iID4+IDg7Ci19Ci12b2lkIEFkb2JlQ01ZS190b19zUkdCKEZYX0ZMT0FUIGMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG0sCi0gICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHksCi0gICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGssCi0gICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBSLAotICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgRywKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIEIpIHsKLSAgLy8gQ29udmVydCB0byB1aW50OF90IHdpdGggcm91bmQtdG8tbmVhcmVzdC4gQXZvaWQgdXNpbmcgRlhTWVNfcm91bmQgYmVjYXVzZQotICAvLyBpdCBpcyBpbmNyZWRpYmx5IGV4cGVuc2l2ZSB3aXRoIFZDKysgKHRlc3RlZCBvbiBWQysrIDIwMTUpIGJlY2F1c2Ugcm91bmQoKQotICAvLyBpcyB2ZXJ5IGV4cGVuc2l2ZS4KLSAgLy8gVGhlICdtYWdpYycgdmFsdWUgb2YgMC40OTk5OTk5N2YsIHRoZSBmbG9hdCB0aGF0IHByZWNlZGVzIDAuNWYsIHdhcyBjaG9zZW4KLSAgLy8gYmVjYXVzZSBpdCBnaXZlcyBpZGVudGljYWwgcmVzdWx0cyB0byBGWFNZU19yb3VuZCgpLiBVc2luZyB0aGUgY29uc3RhbnQKLSAgLy8gMC41ZiBnaXZlcyBkaWZmZXJlbnQgcmVzdWx0cyAoMSBpbnN0ZWFkIG9mIDApIGZvciBvbmUgdmFsdWUsIDAuMDAxOTYwNzg0Mi4KLSAgLy8gVGhhdCB2YWx1ZSBpcyBjbG9zZSB0byB0aGUgY3VzcCBidXQgemVybyBpcyB0aGUgY29ycmVjdCBhbnN3ZXIsIGFuZAotICAvLyBnZXR0aW5nIHRoZSBzYW1lIGFuc3dlciBhcyBiZWZvcmUgaXMgZGVzaXJhYmxlLgotICAvLyBBbGwgZmxvYXRzIGZyb20gMC4wIHRvIDEuMCB3ZXJlIHRlc3RlZCBhbmQgbm93IGdpdmUgdGhlIHNhbWUgcmVzdWx0cy4KLSAgY29uc3QgZmxvYXQgcm91bmRpbmdfb2Zmc2V0ID0gMC40OTk5OTk5N2Y7Ci0gIHVpbnQ4X3QgYzEgPSBpbnQoYyAqIDI1NS5mICsgcm91bmRpbmdfb2Zmc2V0KTsKLSAgdWludDhfdCBtMSA9IGludChtICogMjU1LmYgKyByb3VuZGluZ19vZmZzZXQpOwotICB1aW50OF90IHkxID0gaW50KHkgKiAyNTUuZiArIHJvdW5kaW5nX29mZnNldCk7Ci0gIHVpbnQ4X3QgazEgPSBpbnQoayAqIDI1NS5mICsgcm91bmRpbmdfb2Zmc2V0KTsKLQotICBBU1NFUlQoYzEgPT0gRlhTWVNfcm91bmQoYyAqIDI1NSkpOwotICBBU1NFUlQobTEgPT0gRlhTWVNfcm91bmQobSAqIDI1NSkpOwotICBBU1NFUlQoeTEgPT0gRlhTWVNfcm91bmQoeSAqIDI1NSkpOwotICBBU1NFUlQoazEgPT0gRlhTWVNfcm91bmQoayAqIDI1NSkpOwotCi0gIHVpbnQ4X3QgciwgZywgYjsKLSAgQWRvYmVDTVlLX3RvX3NSR0IxKGMxLCBtMSwgeTEsIGsxLCByLCBnLCBiKTsKLSAgLy8gTXVsdGlwbHkgYnkgYSBjb25zdGFudCByYXRoZXIgdGhhbiBkaXZpZGluZyBiZWNhdXNlIGRpdmlzaW9uIGlzIG11Y2gKLSAgLy8gbW9yZSBleHBlbnNpdmUuCi0gIFIgPSByICogKDEuMGYgLyAyNTUpOwotICBHID0gZyAqICgxLjBmIC8gMjU1KTsKLSAgQiA9IGIgKiAoMS4wZiAvIDI1NSk7CisgIGlmIChwVHJhbnNmb3JtKQorICAgIGNtc0RvVHJhbnNmb3JtKHBUcmFuc2Zvcm0tPm1faFRyYW5zZm9ybSwgcFNyYywgcERlc3QsIHBpeGVscyk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfamJpZy5jcHAgYi9jb3JlL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfamJpZy5jcHAKaW5kZXggOTI2NTQxZi4uNTQzYWVlYiAxMDA2NDQKLS0tIGEvY29yZS9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2piaWcuY3BwCisrKyBiL2NvcmUvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qYmlnLmNwcApAQCAtMzMsOCArMzMsNyBAQAogICAgICAgbV9wR2xvYmFsU3RyZWFtKG51bGxwdHIpLAogICAgICAgbV9wU3JjU3RyZWFtKG51bGxwdHIpLAogICAgICAgbV9kZXN0X2J1ZigwKSwKLSAgICAgIG1fZGVzdF9waXRjaCgwKSwKLSAgICAgIG1fcFBhdXNlKG51bGxwdHIpIHt9CisgICAgICBtX2Rlc3RfcGl0Y2goMCkge30KIAogQ0NvZGVjX0piaWcyQ29udGV4dDo6fkNDb2RlY19KYmlnMkNvbnRleHQoKSB7fQogCkBAIC00NSwxMSArNDQsMTEgQEAKICAgICBzdGQ6OnVuaXF1ZV9wdHI8SkJpZzJfRG9jdW1lbnRDb250ZXh0PiogcENvbnRleHRIb2xkZXIsCiAgICAgdWludDMyX3Qgd2lkdGgsCiAgICAgdWludDMyX3QgaGVpZ2h0LAotICAgIENQREZfU3RyZWFtQWNjKiBzcmNfc3RyZWFtLAotICAgIENQREZfU3RyZWFtQWNjKiBnbG9iYWxfc3RyZWFtLAorICAgIGNvbnN0IFJldGFpblB0cjxDUERGX1N0cmVhbUFjYz4mIHNyY19zdHJlYW0sCisgICAgY29uc3QgUmV0YWluUHRyPENQREZfU3RyZWFtQWNjPiYgZ2xvYmFsX3N0cmVhbSwKICAgICB1aW50OF90KiBkZXN0X2J1ZiwKICAgICB1aW50MzJfdCBkZXN0X3BpdGNoLAotICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgICAgSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpIHsKICAgaWYgKCFwSmJpZzJDb250ZXh0KQogICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJfUEFSQU1TOwogCkBAIC02MSw0NSArNjAsMzQgQEAKICAgcEpiaWcyQ29udGV4dC0+bV9wR2xvYmFsU3RyZWFtID0gZ2xvYmFsX3N0cmVhbTsKICAgcEpiaWcyQ29udGV4dC0+bV9kZXN0X2J1ZiA9IGRlc3RfYnVmOwogICBwSmJpZzJDb250ZXh0LT5tX2Rlc3RfcGl0Y2ggPSBkZXN0X3BpdGNoOwotICBwSmJpZzJDb250ZXh0LT5tX3BQYXVzZSA9IHBQYXVzZTsKLSAgRlhTWVNfbWVtc2V0KGRlc3RfYnVmLCAwLCBoZWlnaHQgKiBkZXN0X3BpdGNoKTsKKyAgbWVtc2V0KGRlc3RfYnVmLCAwLCBoZWlnaHQgKiBkZXN0X3BpdGNoKTsKICAgcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfQ29udGV4dD4oCiAgICAgICBnbG9iYWxfc3RyZWFtLCBzcmNfc3RyZWFtLCBwSkJpZzJEb2N1bWVudENvbnRleHQtPkdldFN5bWJvbERpY3RDYWNoZSgpLAotICAgICAgcFBhdXNlLCBmYWxzZSk7Ci0gIGlmICghcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dCkKLSAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7Ci0KKyAgICAgIGZhbHNlKTsKICAgaW50IHJldCA9IHBKYmlnMkNvbnRleHQtPm1fcENvbnRleHQtPmdldEZpcnN0UGFnZShkZXN0X2J1Ziwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3BpdGNoLCBwUGF1c2UpOwotICBpZiAocEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dC0+R2V0UHJvY2Vzc2luZ1N0YXR1cygpID09Ci0gICAgICBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIKSB7Ci0gICAgcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dC5yZXNldCgpOwotICAgIGlmIChyZXQgIT0gSkJJRzJfU1VDQ0VTUykKLSAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsKLQotICAgIGludCBkd29yZF9zaXplID0gaGVpZ2h0ICogZGVzdF9waXRjaCAvIDQ7Ci0gICAgdWludDMyX3QqIGR3b3JkX2J1ZiA9ICh1aW50MzJfdCopZGVzdF9idWY7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkd29yZF9zaXplOyBpKyspCi0gICAgICBkd29yZF9idWZbaV0gPSB+ZHdvcmRfYnVmW2ldOwotICAgIHJldHVybiBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotICB9Ci0gIHJldHVybiBwSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0LT5HZXRQcm9jZXNzaW5nU3RhdHVzKCk7CisgIHJldHVybiBEZWNvZGUocEpiaWcyQ29udGV4dCwgcmV0KTsKIH0KIAogRlhDT0RFQ19TVEFUVVMgQ0NvZGVjX0piaWcyTW9kdWxlOjpDb250aW51ZURlY29kZSgKICAgICBDQ29kZWNfSmJpZzJDb250ZXh0KiBwSmJpZzJDb250ZXh0LAotICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgICAgSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpIHsKICAgaW50IHJldCA9IHBKYmlnMkNvbnRleHQtPm1fcENvbnRleHQtPkNvbnRpbnVlKHBQYXVzZSk7Ci0gIGlmIChwSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0LT5HZXRQcm9jZXNzaW5nU3RhdHVzKCkgIT0KLSAgICAgIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0gpIHsKLSAgICByZXR1cm4gcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dC0+R2V0UHJvY2Vzc2luZ1N0YXR1cygpOwotICB9CisgIHJldHVybiBEZWNvZGUocEpiaWcyQ29udGV4dCwgcmV0KTsKK30KKworRlhDT0RFQ19TVEFUVVMgQ0NvZGVjX0piaWcyTW9kdWxlOjpEZWNvZGUoQ0NvZGVjX0piaWcyQ29udGV4dCogcEpiaWcyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXN1bHQpIHsKKyAgRlhDT0RFQ19TVEFUVVMgc3RhdHVzID0gcEpiaWcyQ29udGV4dC0+bV9wQ29udGV4dC0+R2V0UHJvY2Vzc2luZ1N0YXR1cygpOworICBpZiAoc3RhdHVzICE9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0gpCisgICAgcmV0dXJuIHN0YXR1czsKKwogICBwSmJpZzJDb250ZXh0LT5tX3BDb250ZXh0LnJlc2V0KCk7Ci0gIGlmIChyZXQgIT0gSkJJRzJfU1VDQ0VTUykKKyAgaWYgKHJlc3VsdCAhPSBKQklHMl9TVUNDRVNTKQogICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsKIAogICBpbnQgZHdvcmRfc2l6ZSA9IHBKYmlnMkNvbnRleHQtPm1faGVpZ2h0ICogcEpiaWcyQ29udGV4dC0+bV9kZXN0X3BpdGNoIC8gNDsKLSAgdWludDMyX3QqIGR3b3JkX2J1ZiA9ICh1aW50MzJfdCopcEpiaWcyQ29udGV4dC0+bV9kZXN0X2J1ZjsKKyAgdWludDMyX3QqIGR3b3JkX2J1ZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPihwSmJpZzJDb250ZXh0LT5tX2Rlc3RfYnVmKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkd29yZF9zaXplOyBpKyspCiAgICAgZHdvcmRfYnVmW2ldID0gfmR3b3JkX2J1ZltpXTsKICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanBlZy5jcHAgYi9jb3JlL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanBlZy5jcHAKaW5kZXggYzc5NzYwNS4uNmUyMjdjYSAxMDA2NDQKLS0tIGEvY29yZS9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pwZWcuY3BwCisrKyBiL2NvcmUvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcGVnLmNwcApAQCAtOSwxMCArOSwxMyBAQAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx1dGlsaXR5PgogCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2NvZGVjX2ludC5oIgorI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfanBlZ21vZHVsZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfc2NhbmxpbmVkZWNvZGVyLmgiCiAjaW5jbHVkZSAiY29yZS9meGNvZGVjL2Z4X2NvZGVjLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfZGlic291cmNlLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAogZXh0ZXJuICJDIiB7CkBAIC0yNCw3ICsyNywyMyBAQAogI2Vsc2UKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9saWJqcGVnL2pwZWdsaWIuaCIKICNlbmRpZgotfQorfSAgLy8gZXh0ZXJuICJDIgorCitjbGFzcyBDSnBlZ0NvbnRleHQgOiBwdWJsaWMgQ0NvZGVjX0pwZWdNb2R1bGU6OkNvbnRleHQgeworIHB1YmxpYzoKKyAgQ0pwZWdDb250ZXh0KCk7CisgIH5DSnBlZ0NvbnRleHQoKSBvdmVycmlkZTsKKworICBqbXBfYnVmKiBHZXRKdW1wTWFyaygpIG92ZXJyaWRlIHsgcmV0dXJuICZtX0p1bXBNYXJrOyB9CisKKyAgam1wX2J1ZiBtX0p1bXBNYXJrOworICBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IG1fSW5mbzsKKyAganBlZ19lcnJvcl9tZ3IgbV9FcnJNZ3I7CisgIGpwZWdfc291cmNlX21nciBtX1NyY01ncjsKKyAgdW5zaWduZWQgaW50IG1fU2tpcFNpemU7CisgIHZvaWQqICgqbV9BbGxvY0Z1bmMpKHVuc2lnbmVkIGludCk7CisgIHZvaWQgKCptX0ZyZWVGdW5jKSh2b2lkKik7Cit9OwogCiBleHRlcm4gIkMiIHsKIApAQCAtNzEsMTQgKzkwLDE0IEBACiAKIHN0YXRpYyB2b2lkIF9lcnJvcl9kb19ub3RoaW5nMihqX2NvbW1vbl9wdHIgY2luZm8sIGNoYXIqKSB7fQogCi0jaWYgX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lONjRfREVTS1RPUF8KKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXwogc3RhdGljIHZvaWQgX2Rlc3RfZG9fbm90aGluZyhqX2NvbXByZXNzX3B0ciBjaW5mbykge30KIAogc3RhdGljIGJvb2xlYW4gX2Rlc3RfZW1wdHkoal9jb21wcmVzc19wdHIgY2luZm8pIHsKICAgcmV0dXJuIGZhbHNlOwogfQotI2VuZGlmCi19OworI2VuZGlmICAvLyBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXworfSAgLy8gZXh0ZXJuICJDIgogCiAjZGVmaW5lIEpQRUdfTUFSS0VSX0lDQyAoSlBFR19BUFAwICsgMikKICNkZWZpbmUgSlBFR19NQVJLRVJfTUFYU0laRSAweEZGRkYKQEAgLTE4NSw5ICsyMDQsOSBAQAogICBtX3BTY2FubGluZUJ1ZiA9IG51bGxwdHI7CiAgIG1fYlN0YXJ0ZWQgPSBmYWxzZTsKICAgbV9iSW5pdGVkID0gZmFsc2U7Ci0gIEZYU1lTX21lbXNldCgmY2luZm8sIDAsIHNpemVvZihjaW5mbykpOwotICBGWFNZU19tZW1zZXQoJmplcnIsIDAsIHNpemVvZihqZXJyKSk7Ci0gIEZYU1lTX21lbXNldCgmc3JjLCAwLCBzaXplb2Yoc3JjKSk7CisgIG1lbXNldCgmY2luZm8sIDAsIHNpemVvZihjaW5mbykpOworICBtZW1zZXQoJmplcnIsIDAsIHNpemVvZihqZXJyKSk7CisgIG1lbXNldCgmc3JjLCAwLCBzaXplb2Yoc3JjKSk7CiAgIG1fbkRlZmF1bHRTY2FsZURlbm9tID0gMTsKIH0KIApAQCAtMjUzLDggKzI3Miw3IEBACiAgIHNyYy5maWxsX2lucHV0X2J1ZmZlciA9IF9zcmNfZmlsbF9idWZmZXI7CiAgIHNyYy5yZXN5bmNfdG9fcmVzdGFydCA9IF9zcmNfcmVzeW5jOwogICBtX2JKcGVnVHJhbnNmb3JtID0gQ29sb3JUcmFuc2Zvcm07Ci0gIGlmIChzcmNfc2l6ZSA+IDEgJiYKLSAgICAgIEZYU1lTX21lbWNtcChzcmNfYnVmICsgc3JjX3NpemUgLSAyLCAiXHhGRlx4RDkiLCAyKSAhPSAwKSB7CisgIGlmIChzcmNfc2l6ZSA+IDEgJiYgbWVtY21wKHNyY19idWYgKyBzcmNfc2l6ZSAtIDIsICJceEZGXHhEOSIsIDIpICE9IDApIHsKICAgICAoKHVpbnQ4X3QqKXNyY19idWYpW3NyY19zaXplIC0gMl0gPSAweEZGOwogICAgICgodWludDhfdCopc3JjX2J1Zilbc3JjX3NpemUgLSAxXSA9IDB4RDk7CiAgIH0KQEAgLTI5Nyw3ICszMTUsNyBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogICBpZiAoKGludCljaW5mby5vdXRwdXRfd2lkdGggPiBtX09yaWdXaWR0aCkgewotICAgIEFTU0VSVChmYWxzZSk7CisgICAgTk9UUkVBQ0hFRCgpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogICBtX2JTdGFydGVkID0gdHJ1ZTsKQEAgLTM0NSw3MSArMzYzLDc1IEBACiAgICAgICAgICAgICAgICAgICAgICAgYml0c19wZXJfY29tcG9uZW50cywgY29sb3JfdHJhbnNmb3JtKTsKIH0KIAotc3RydWN0IEZYSlBFR19Db250ZXh0IHsKLSAgam1wX2J1ZiBtX0p1bXBNYXJrOwotICBqcGVnX2RlY29tcHJlc3Nfc3RydWN0IG1fSW5mbzsKLSAganBlZ19lcnJvcl9tZ3IgbV9FcnJNZ3I7Ci0gIGpwZWdfc291cmNlX21nciBtX1NyY01ncjsKLSAgdW5zaWduZWQgaW50IG1fU2tpcFNpemU7Ci0gIHZvaWQqICgqbV9BbGxvY0Z1bmMpKHVuc2lnbmVkIGludCk7Ci0gIHZvaWQgKCptX0ZyZWVGdW5jKSh2b2lkKik7Ci19OwogZXh0ZXJuICJDIiB7CisKIHN0YXRpYyB2b2lkIF9lcnJvcl9mYXRhbDEoal9jb21tb25fcHRyIGNpbmZvKSB7Ci0gIGxvbmdqbXAoKChGWEpQRUdfQ29udGV4dCopY2luZm8tPmNsaWVudF9kYXRhKS0+bV9KdW1wTWFyaywgLTEpOworICBhdXRvKiBwQ29udGV4dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0pwZWdDb250ZXh0Kj4oY2luZm8tPmNsaWVudF9kYXRhKTsKKyAgbG9uZ2ptcChwQ29udGV4dC0+bV9KdW1wTWFyaywgLTEpOwogfQotfTsKLWV4dGVybiAiQyIgeworCiBzdGF0aWMgdm9pZCBfc3JjX3NraXBfZGF0YTEoc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvLCBsb25nIG51bSkgewotICBpZiAoY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyIDwgKHNpemVfdCludW0pIHsKLSAgICAoKEZYSlBFR19Db250ZXh0KiljaW5mby0+Y2xpZW50X2RhdGEpLT5tX1NraXBTaXplID0KLSAgICAgICAgKHVuc2lnbmVkIGludCkobnVtIC0gY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyKTsKKyAgaWYgKGNpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlciA8IHN0YXRpY19jYXN0PHNpemVfdD4obnVtKSkgeworICAgIGF1dG8qIHBDb250ZXh0ID0gcmVpbnRlcnByZXRfY2FzdDxDSnBlZ0NvbnRleHQqPihjaW5mby0+Y2xpZW50X2RhdGEpOworICAgIHBDb250ZXh0LT5tX1NraXBTaXplID0gKHVuc2lnbmVkIGludCkobnVtIC0gY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyKTsKICAgICBjaW5mby0+c3JjLT5ieXRlc19pbl9idWZmZXIgPSAwOwogICB9IGVsc2UgewogICAgIGNpbmZvLT5zcmMtPm5leHRfaW5wdXRfYnl0ZSArPSBudW07CiAgICAgY2luZm8tPnNyYy0+Ynl0ZXNfaW5fYnVmZmVyIC09IG51bTsKICAgfQogfQotfTsKKwogc3RhdGljIHZvaWQqIGpwZWdfYWxsb2NfZnVuYyh1bnNpZ25lZCBpbnQgc2l6ZSkgewogICByZXR1cm4gRlhfQWxsb2MoY2hhciwgc2l6ZSk7CiB9CisKIHN0YXRpYyB2b2lkIGpwZWdfZnJlZV9mdW5jKHZvaWQqIHApIHsKICAgRlhfRnJlZShwKTsKIH0KLUZYSlBFR19Db250ZXh0KiBDQ29kZWNfSnBlZ01vZHVsZTo6U3RhcnQoKSB7Ci0gIEZYSlBFR19Db250ZXh0KiBwID0gRlhfQWxsb2MoRlhKUEVHX0NvbnRleHQsIDEpOwotICBwLT5tX0FsbG9jRnVuYyA9IGpwZWdfYWxsb2NfZnVuYzsKLSAgcC0+bV9GcmVlRnVuYyA9IGpwZWdfZnJlZV9mdW5jOwotICBwLT5tX0Vyck1nci5lcnJvcl9leGl0ID0gX2Vycm9yX2ZhdGFsMTsKLSAgcC0+bV9FcnJNZ3IuZW1pdF9tZXNzYWdlID0gX2Vycm9yX2RvX25vdGhpbmcxOwotICBwLT5tX0Vyck1nci5vdXRwdXRfbWVzc2FnZSA9IF9lcnJvcl9kb19ub3RoaW5nOwotICBwLT5tX0Vyck1nci5mb3JtYXRfbWVzc2FnZSA9IF9lcnJvcl9kb19ub3RoaW5nMjsKLSAgcC0+bV9FcnJNZ3IucmVzZXRfZXJyb3JfbWdyID0gX2Vycm9yX2RvX25vdGhpbmc7Ci0gIHAtPm1fU3JjTWdyLmluaXRfc291cmNlID0gX3NyY19kb19ub3RoaW5nOwotICBwLT5tX1NyY01nci50ZXJtX3NvdXJjZSA9IF9zcmNfZG9fbm90aGluZzsKLSAgcC0+bV9TcmNNZ3Iuc2tpcF9pbnB1dF9kYXRhID0gX3NyY19za2lwX2RhdGExOwotICBwLT5tX1NyY01nci5maWxsX2lucHV0X2J1ZmZlciA9IF9zcmNfZmlsbF9idWZmZXI7Ci0gIHAtPm1fU3JjTWdyLnJlc3luY190b19yZXN0YXJ0ID0gX3NyY19yZXN5bmM7Ci0gIHAtPm1fSW5mby5jbGllbnRfZGF0YSA9IHA7Ci0gIHAtPm1fSW5mby5lcnIgPSAmcC0+bV9FcnJNZ3I7Ci0gIGlmIChzZXRqbXAocC0+bV9KdW1wTWFyaykgPT0gLTEpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCZwLT5tX0luZm8pOwotICBwLT5tX0luZm8uc3JjID0gJnAtPm1fU3JjTWdyOwotICBwLT5tX1NraXBTaXplID0gMDsKLSAgcmV0dXJuIHA7CisKK30gIC8vIGV4dGVybiAiQyIKKworQ0pwZWdDb250ZXh0OjpDSnBlZ0NvbnRleHQoKQorICAgIDogbV9Ta2lwU2l6ZSgwKSwgbV9BbGxvY0Z1bmMoanBlZ19hbGxvY19mdW5jKSwgbV9GcmVlRnVuYyhqcGVnX2ZyZWVfZnVuYykgeworICBtZW1zZXQoJm1fSW5mbywgMCwgc2l6ZW9mKG1fSW5mbykpOworICBtX0luZm8uY2xpZW50X2RhdGEgPSB0aGlzOworICBtX0luZm8uZXJyID0gJm1fRXJyTWdyOworCisgIG1lbXNldCgmbV9FcnJNZ3IsIDAsIHNpemVvZihtX0Vyck1ncikpOworICBtX0Vyck1nci5lcnJvcl9leGl0ID0gX2Vycm9yX2ZhdGFsMTsKKyAgbV9FcnJNZ3IuZW1pdF9tZXNzYWdlID0gX2Vycm9yX2RvX25vdGhpbmcxOworICBtX0Vyck1nci5vdXRwdXRfbWVzc2FnZSA9IF9lcnJvcl9kb19ub3RoaW5nOworICBtX0Vyck1nci5mb3JtYXRfbWVzc2FnZSA9IF9lcnJvcl9kb19ub3RoaW5nMjsKKyAgbV9FcnJNZ3IucmVzZXRfZXJyb3JfbWdyID0gX2Vycm9yX2RvX25vdGhpbmc7CisKKyAgbWVtc2V0KCZtX1NyY01nciwgMCwgc2l6ZW9mKG1fU3JjTWdyKSk7CisgIG1fU3JjTWdyLmluaXRfc291cmNlID0gX3NyY19kb19ub3RoaW5nOworICBtX1NyY01nci50ZXJtX3NvdXJjZSA9IF9zcmNfZG9fbm90aGluZzsKKyAgbV9TcmNNZ3Iuc2tpcF9pbnB1dF9kYXRhID0gX3NyY19za2lwX2RhdGExOworICBtX1NyY01nci5maWxsX2lucHV0X2J1ZmZlciA9IF9zcmNfZmlsbF9idWZmZXI7CisgIG1fU3JjTWdyLnJlc3luY190b19yZXN0YXJ0ID0gX3NyY19yZXN5bmM7CiB9CiAKLXZvaWQgQ0NvZGVjX0pwZWdNb2R1bGU6OkZpbmlzaChGWEpQRUdfQ29udGV4dCogY3R4KSB7Ci0gIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzKCZjdHgtPm1fSW5mbyk7Ci0gIGN0eC0+bV9GcmVlRnVuYyhjdHgpOworQ0pwZWdDb250ZXh0Ojp+Q0pwZWdDb250ZXh0KCkgeworICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygmbV9JbmZvKTsKIH0KIAotdm9pZCBDQ29kZWNfSnBlZ01vZHVsZTo6SW5wdXQoRlhKUEVHX0NvbnRleHQqIGN0eCwKK3N0ZDo6dW5pcXVlX3B0cjxDQ29kZWNfSnBlZ01vZHVsZTo6Q29udGV4dD4gQ0NvZGVjX0pwZWdNb2R1bGU6OlN0YXJ0KCkgeworICAvLyBVc2Ugb3JkaW5hcnkgcG9pbnRlciB1bnRpbCBwYXN0IHRoZSBwb3NzaWJpbGl0eSBvZiBhIGxvbmdqdW1wLgorICBhdXRvKiBwQ29udGV4dCA9IG5ldyBDSnBlZ0NvbnRleHQoKTsKKyAgaWYgKHNldGptcChwQ29udGV4dC0+bV9KdW1wTWFyaykgPT0gLTEpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAganBlZ19jcmVhdGVfZGVjb21wcmVzcygmcENvbnRleHQtPm1fSW5mbyk7CisgIHBDb250ZXh0LT5tX0luZm8uc3JjID0gJnBDb250ZXh0LT5tX1NyY01ncjsKKyAgcENvbnRleHQtPm1fU2tpcFNpemUgPSAwOworICByZXR1cm4gcGRmaXVtOjpXcmFwVW5pcXVlKHBDb250ZXh0KTsKK30KKwordm9pZCBDQ29kZWNfSnBlZ01vZHVsZTo6SW5wdXQoQ29udGV4dCogcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmNfYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NpemUpIHsKKyAgYXV0byogY3R4ID0gc3RhdGljX2Nhc3Q8Q0pwZWdDb250ZXh0Kj4ocENvbnRleHQpOwogICBpZiAoY3R4LT5tX1NraXBTaXplKSB7CiAgICAgaWYgKGN0eC0+bV9Ta2lwU2l6ZSA+IHNyY19zaXplKSB7CiAgICAgICBjdHgtPm1fU3JjTWdyLmJ5dGVzX2luX2J1ZmZlciA9IDA7CkBAIC00MjUsMjAgKzQ0NywxOCBAQAogfQogCiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKLWludCBDQ29kZWNfSnBlZ01vZHVsZTo6UmVhZEhlYWRlcihGWEpQRUdfQ29udGV4dCogY3R4LAoraW50IENDb2RlY19KcGVnTW9kdWxlOjpSZWFkSGVhZGVyKENvbnRleHQqIHBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBuQ29tcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSkgewogI2Vsc2UgICAvLyBQREZfRU5BQkxFX1hGQQotaW50IENDb2RlY19KcGVnTW9kdWxlOjpSZWFkSGVhZGVyKEZYSlBFR19Db250ZXh0KiBjdHgsCitpbnQgQ0NvZGVjX0pwZWdNb2R1bGU6OlJlYWRIZWFkZXIoQ29udGV4dCogcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG5Db21wcykgewogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQotICBpZiAoc2V0am1wKGN0eC0+bV9KdW1wTWFyaykgPT0gLTEpCi0gICAgcmV0dXJuIDE7Ci0KKyAgYXV0byogY3R4ID0gc3RhdGljX2Nhc3Q8Q0pwZWdDb250ZXh0Kj4ocENvbnRleHQpOwogICBpbnQgcmV0ID0ganBlZ19yZWFkX2hlYWRlcigmY3R4LT5tX0luZm8sIHRydWUpOwogICBpZiAocmV0ID09IEpQRUdfU1VTUEVOREVEKQogICAgIHJldHVybiAyOwpAQCAtNDU0LDI1ICs0NzQsMjIgQEAKICAgcmV0dXJuIDA7CiB9CiAKLWJvb2wgQ0NvZGVjX0pwZWdNb2R1bGU6OlN0YXJ0U2NhbmxpbmUoRlhKUEVHX0NvbnRleHQqIGN0eCwgaW50IGRvd25fc2NhbGUpIHsKLSAgaWYgKHNldGptcChjdHgtPm1fSnVtcE1hcmspID09IC0xKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjdHgtPm1fSW5mby5zY2FsZV9kZW5vbSA9IGRvd25fc2NhbGU7Citib29sIENDb2RlY19KcGVnTW9kdWxlOjpTdGFydFNjYW5saW5lKENvbnRleHQqIHBDb250ZXh0LCBpbnQgZG93bl9zY2FsZSkgeworICBhdXRvKiBjdHggPSBzdGF0aWNfY2FzdDxDSnBlZ0NvbnRleHQqPihwQ29udGV4dCk7CisgIGN0eC0+bV9JbmZvLnNjYWxlX2Rlbm9tID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50Pihkb3duX3NjYWxlKTsKICAgcmV0dXJuICEhanBlZ19zdGFydF9kZWNvbXByZXNzKCZjdHgtPm1fSW5mbyk7CiB9CiAKLWJvb2wgQ0NvZGVjX0pwZWdNb2R1bGU6OlJlYWRTY2FubGluZShGWEpQRUdfQ29udGV4dCogY3R4LAorYm9vbCBDQ29kZWNfSnBlZ01vZHVsZTo6UmVhZFNjYW5saW5lKENvbnRleHQqIHBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGRlc3RfYnVmKSB7Ci0gIGlmIChzZXRqbXAoY3R4LT5tX0p1bXBNYXJrKSA9PSAtMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW50IG5saW5lcyA9IGpwZWdfcmVhZF9zY2FubGluZXMoJmN0eC0+bV9JbmZvLCAmZGVzdF9idWYsIDEpOworICBhdXRvKiBjdHggPSBzdGF0aWNfY2FzdDxDSnBlZ0NvbnRleHQqPihwQ29udGV4dCk7CisgIHVuc2lnbmVkIGludCBubGluZXMgPSBqcGVnX3JlYWRfc2NhbmxpbmVzKCZjdHgtPm1fSW5mbywgJmRlc3RfYnVmLCAxKTsKICAgcmV0dXJuIG5saW5lcyA9PSAxOwogfQogCi11aW50MzJfdCBDQ29kZWNfSnBlZ01vZHVsZTo6R2V0QXZhaWxJbnB1dChGWEpQRUdfQ29udGV4dCogY3R4LAordWludDMyX3QgQ0NvZGVjX0pwZWdNb2R1bGU6OkdldEF2YWlsSW5wdXQoQ29udGV4dCogcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogYXZhaWxfYnVmX3B0cikgeworICBhdXRvKiBjdHggPSBzdGF0aWNfY2FzdDxDSnBlZ0NvbnRleHQqPihwQ29udGV4dCk7CiAgIGlmIChhdmFpbF9idWZfcHRyKSB7CiAgICAgKmF2YWlsX2J1Zl9wdHIgPSBudWxscHRyOwogICAgIGlmIChjdHgtPm1fU3JjTWdyLmJ5dGVzX2luX2J1ZmZlciA+IDApIHsKQEAgLTQ4MiwxMSArNDk5LDExIEBACiAgIHJldHVybiAodWludDMyX3QpY3R4LT5tX1NyY01nci5ieXRlc19pbl9idWZmZXI7CiB9CiAKLSNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF9ERVNLVE9QXworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCiAjZGVmaW5lIEpQRUdfQkxPQ0tfU0laRSAxMDQ4NTc2Ci1ib29sIENDb2RlY19KcGVnTW9kdWxlOjpKcGVnRW5jb2RlKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCitib29sIENDb2RlY19KcGVnTW9kdWxlOjpKcGVnRW5jb2RlKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGRlc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFKiBkZXN0X3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBkZXN0X3NpemUpIHsKICAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGplcnI7CiAgIGplcnIuZXJyb3JfZXhpdCA9IF9lcnJvcl9kb19ub3RoaW5nOwogICBqZXJyLmVtaXRfbWVzc2FnZSA9IF9lcnJvcl9kb19ub3RoaW5nMTsKQEAgLTU3OSw4ICs1OTYsOCBAQAogICBqcGVnX2ZpbmlzaF9jb21wcmVzcygmY2luZm8pOwogICBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MoJmNpbmZvKTsKICAgRlhfRnJlZShsaW5lX2J1Zik7Ci0gICpkZXN0X3NpemUgPSBkZXN0X2J1Zl9sZW5ndGggLSAoRlhfU1RSU0laRSlkZXN0LmZyZWVfaW5fYnVmZmVyOworICAqZGVzdF9zaXplID0gZGVzdF9idWZfbGVuZ3RoIC0gc3RhdGljX2Nhc3Q8c2l6ZV90PihkZXN0LmZyZWVfaW5fYnVmZmVyKTsKIAogICByZXR1cm4gdHJ1ZTsKIH0KLSNlbmRpZgorI2VuZGlmICAvLyBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pweF9vcGouY3BwIGIvY29yZS9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX2pweF9vcGouY3BwCmluZGV4IGZhMTYzNTYuLjg5YzUxMjMgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcHhfb3BqLmNwcAorKysgYi9jb3JlL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanB4X29wai5jcHAKQEAgLTcsMzYgKzcsMjIxIEBACiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbG9yc3BhY2UuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY29kZWNfaW50LmgiCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2Z4X2NvZGVjLmgiCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19qcHhtb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2pweF9kZWNvZGVyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9tZW1vcnkuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9sY21zMi0yLjYvaW5jbHVkZS9sY21zMi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wZW5qcGVnLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfbWFsbG9jLmgiCiAKLXN0YXRpYyB2b2lkIGZ4X2Vycm9yX2NhbGxiYWNrKGNvbnN0IGNoYXIqIG1zZywgdm9pZCogY2xpZW50X2RhdGEpIHsKLSAgKHZvaWQpY2xpZW50X2RhdGE7CituYW1lc3BhY2UgeworCit2b2lkIGZ4X2lnbm9yZV9jYWxsYmFjayhjb25zdCBjaGFyKiBtc2csIHZvaWQqIGNsaWVudF9kYXRhKSB7fQorCitvcGpfc3RyZWFtX3QqIGZ4X29wal9zdHJlYW1fY3JlYXRlX21lbW9yeV9zdHJlYW0oRGVjb2RlRGF0YSogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfU0laRV9UIHBfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQk9PTCBwX2lzX3JlYWRfc3RyZWFtKSB7CisgIGlmICghZGF0YSB8fCAhZGF0YS0+c3JjX2RhdGEgfHwgZGF0YS0+c3JjX3NpemUgPD0gMCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBvcGpfc3RyZWFtX3QqIHN0cmVhbSA9IG9wal9zdHJlYW1fY3JlYXRlKHBfc2l6ZSwgcF9pc19yZWFkX3N0cmVhbSk7CisgIGlmICghc3RyZWFtKQorICAgIHJldHVybiBudWxscHRyOworCisgIG9wal9zdHJlYW1fc2V0X3VzZXJfZGF0YShzdHJlYW0sIGRhdGEsIG51bGxwdHIpOworICBvcGpfc3RyZWFtX3NldF91c2VyX2RhdGFfbGVuZ3RoKHN0cmVhbSwgZGF0YS0+c3JjX3NpemUpOworICBvcGpfc3RyZWFtX3NldF9yZWFkX2Z1bmN0aW9uKHN0cmVhbSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkpOworICBvcGpfc3RyZWFtX3NldF9za2lwX2Z1bmN0aW9uKHN0cmVhbSwgb3BqX3NraXBfZnJvbV9tZW1vcnkpOworICBvcGpfc3RyZWFtX3NldF9zZWVrX2Z1bmN0aW9uKHN0cmVhbSwgb3BqX3NlZWtfZnJvbV9tZW1vcnkpOworICByZXR1cm4gc3RyZWFtOwogfQotc3RhdGljIHZvaWQgZnhfd2FybmluZ19jYWxsYmFjayhjb25zdCBjaGFyKiBtc2csIHZvaWQqIGNsaWVudF9kYXRhKSB7Ci0gICh2b2lkKWNsaWVudF9kYXRhOworCit2b2lkIHN5Y2NfdG9fcmdiKGludCBvZmZzZXQsCisgICAgICAgICAgICAgICAgIGludCB1cGIsCisgICAgICAgICAgICAgICAgIGludCB5LAorICAgICAgICAgICAgICAgICBpbnQgY2IsCisgICAgICAgICAgICAgICAgIGludCBjciwKKyAgICAgICAgICAgICAgICAgaW50KiBvdXRfciwKKyAgICAgICAgICAgICAgICAgaW50KiBvdXRfZywKKyAgICAgICAgICAgICAgICAgaW50KiBvdXRfYikgeworICBjYiAtPSBvZmZzZXQ7CisgIGNyIC09IG9mZnNldDsKKyAgKm91dF9yID0gcGRmaXVtOjpjbGFtcCh5ICsgc3RhdGljX2Nhc3Q8aW50PigxLjQwMiAqIGNyKSwgMCwgdXBiKTsKKyAgKm91dF9nID0gcGRmaXVtOjpjbGFtcCh5IC0gc3RhdGljX2Nhc3Q8aW50PigwLjM0NCAqIGNiICsgMC43MTQgKiBjciksIDAsIHVwYik7CisgICpvdXRfYiA9IHBkZml1bTo6Y2xhbXAoeSArIHN0YXRpY19jYXN0PGludD4oMS43NzIgKiBjYiksIDAsIHVwYik7CiB9Ci1zdGF0aWMgdm9pZCBmeF9pbmZvX2NhbGxiYWNrKGNvbnN0IGNoYXIqIG1zZywgdm9pZCogY2xpZW50X2RhdGEpIHsKLSAgKHZvaWQpY2xpZW50X2RhdGE7CisKK3ZvaWQgc3ljYzQ0NF90b19yZ2Iob3BqX2ltYWdlX3QqIGltZykgeworICBpbnQgcHJlYyA9IGltZy0+Y29tcHNbMF0ucHJlYzsKKyAgLy8gSWYgd2Ugc2hpZnQgMzEgd2UncmUgZ29pbmcgdG8gZ28gbmVnYXRpdmUsIHRoZW4gdGhpbmdzIGdvIGJhZC4KKyAgaWYgKHByZWMgPiAzMCkKKyAgICByZXR1cm47CisgIGludCBvZmZzZXQgPSAxIDw8IChwcmVjIC0gMSk7CisgIGludCB1cGIgPSAoMSA8PCBwcmVjKSAtIDE7CisgIE9QSl9VSU5UMzIgbWF4dyA9CisgICAgICBzdGQ6Om1pbih7aW1nLT5jb21wc1swXS53LCBpbWctPmNvbXBzWzFdLncsIGltZy0+Y29tcHNbMl0ud30pOworICBPUEpfVUlOVDMyIG1heGggPQorICAgICAgc3RkOjptaW4oe2ltZy0+Y29tcHNbMF0uaCwgaW1nLT5jb21wc1sxXS5oLCBpbWctPmNvbXBzWzJdLmh9KTsKKyAgRlhfU0FGRV9TSVpFX1QgbWF4X3NpemUgPSBtYXh3OworICBtYXhfc2l6ZSAqPSBtYXhoOworICBtYXhfc2l6ZSAqPSBzaXplb2YoaW50KTsKKyAgaWYgKCFtYXhfc2l6ZS5Jc1ZhbGlkKCkpCisgICAgcmV0dXJuOworCisgIGNvbnN0IGludCogeSA9IGltZy0+Y29tcHNbMF0uZGF0YTsKKyAgY29uc3QgaW50KiBjYiA9IGltZy0+Y29tcHNbMV0uZGF0YTsKKyAgY29uc3QgaW50KiBjciA9IGltZy0+Y29tcHNbMl0uZGF0YTsKKyAgaWYgKCF5IHx8ICFjYiB8fCAhY3IpCisgICAgcmV0dXJuOworCisgIGludCogciA9IHN0YXRpY19jYXN0PGludCo+KG9wal9pbWFnZV9kYXRhX2FsbG9jKG1heF9zaXplLlZhbHVlT3JEaWUoKSkpOworICBpbnQqIGcgPSBzdGF0aWNfY2FzdDxpbnQqPihvcGpfaW1hZ2VfZGF0YV9hbGxvYyhtYXhfc2l6ZS5WYWx1ZU9yRGllKCkpKTsKKyAgaW50KiBiID0gc3RhdGljX2Nhc3Q8aW50Kj4ob3BqX2ltYWdlX2RhdGFfYWxsb2MobWF4X3NpemUuVmFsdWVPckRpZSgpKSk7CisgIGludCogZDAgPSByOworICBpbnQqIGQxID0gZzsKKyAgaW50KiBkMiA9IGI7CisgIG1heF9zaXplIC89IHNpemVvZihpbnQpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1heF9zaXplLlZhbHVlT3JEaWUoKTsgKytpKSB7CisgICAgc3ljY190b19yZ2Iob2Zmc2V0LCB1cGIsICp5KyssICpjYisrLCAqY3IrKywgcisrLCBnKyssIGIrKyk7CisgIH0KKyAgb3BqX2ltYWdlX2RhdGFfZnJlZShpbWctPmNvbXBzWzBdLmRhdGEpOworICBvcGpfaW1hZ2VfZGF0YV9mcmVlKGltZy0+Y29tcHNbMV0uZGF0YSk7CisgIG9wal9pbWFnZV9kYXRhX2ZyZWUoaW1nLT5jb21wc1syXS5kYXRhKTsKKyAgaW1nLT5jb21wc1swXS5kYXRhID0gZDA7CisgIGltZy0+Y29tcHNbMV0uZGF0YSA9IGQxOworICBpbWctPmNvbXBzWzJdLmRhdGEgPSBkMjsKIH0KIAorYm9vbCBzeWNjNDIwXzQyMl9zaXplX2lzX3ZhbGlkKG9wal9pbWFnZV90KiBpbWcpIHsKKyAgcmV0dXJuIGltZyAmJiBpbWctPmNvbXBzWzBdLncgIT0gc3RkOjpudW1lcmljX2xpbWl0czxPUEpfVUlOVDMyPjo6bWF4KCkgJiYKKyAgICAgICAgIChpbWctPmNvbXBzWzBdLncgKyAxKSAvIDIgPT0gaW1nLT5jb21wc1sxXS53ICYmCisgICAgICAgICBpbWctPmNvbXBzWzFdLncgPT0gaW1nLT5jb21wc1syXS53ICYmCisgICAgICAgICBpbWctPmNvbXBzWzFdLmggPT0gaW1nLT5jb21wc1syXS5oOworfQorCitib29sIHN5Y2M0MjBfc2l6ZV9pc192YWxpZChvcGpfaW1hZ2VfdCogaW1nKSB7CisgIHJldHVybiBzeWNjNDIwXzQyMl9zaXplX2lzX3ZhbGlkKGltZykgJiYKKyAgICAgICAgIGltZy0+Y29tcHNbMF0uaCAhPSBzdGQ6Om51bWVyaWNfbGltaXRzPE9QSl9VSU5UMzI+OjptYXgoKSAmJgorICAgICAgICAgKGltZy0+Y29tcHNbMF0uaCArIDEpIC8gMiA9PSBpbWctPmNvbXBzWzFdLmg7Cit9CisKK2Jvb2wgc3ljYzQyMl9zaXplX2lzX3ZhbGlkKG9wal9pbWFnZV90KiBpbWcpIHsKKyAgcmV0dXJuIHN5Y2M0MjBfNDIyX3NpemVfaXNfdmFsaWQoaW1nKSAmJiBpbWctPmNvbXBzWzBdLmggPT0gaW1nLT5jb21wc1sxXS5oOworfQorCit2b2lkIHN5Y2M0MjJfdG9fcmdiKG9wal9pbWFnZV90KiBpbWcpIHsKKyAgaWYgKCFzeWNjNDIyX3NpemVfaXNfdmFsaWQoaW1nKSkKKyAgICByZXR1cm47CisKKyAgaW50IHByZWMgPSBpbWctPmNvbXBzWzBdLnByZWM7CisgIGlmIChwcmVjIDw9IDAgfHwgcHJlYyA+PSAzMikKKyAgICByZXR1cm47CisKKyAgaW50IG9mZnNldCA9IDEgPDwgKHByZWMgLSAxKTsKKyAgaW50IHVwYiA9ICgxIDw8IHByZWMpIC0gMTsKKyAgT1BKX1VJTlQzMiBtYXh3ID0gaW1nLT5jb21wc1swXS53OworICBPUEpfVUlOVDMyIG1heGggPSBpbWctPmNvbXBzWzBdLmg7CisgIEZYX1NBRkVfU0laRV9UIG1heF9zaXplID0gbWF4dzsKKyAgbWF4X3NpemUgKj0gbWF4aDsKKyAgbWF4X3NpemUgKj0gc2l6ZW9mKGludCk7CisgIGlmICghbWF4X3NpemUuSXNWYWxpZCgpKQorICAgIHJldHVybjsKKworICBjb25zdCBpbnQqIHkgPSBpbWctPmNvbXBzWzBdLmRhdGE7CisgIGNvbnN0IGludCogY2IgPSBpbWctPmNvbXBzWzFdLmRhdGE7CisgIGNvbnN0IGludCogY3IgPSBpbWctPmNvbXBzWzJdLmRhdGE7CisgIGlmICgheSB8fCAhY2IgfHwgIWNyKQorICAgIHJldHVybjsKKworICBpbnQqIHIgPSBzdGF0aWNfY2FzdDxpbnQqPihvcGpfaW1hZ2VfZGF0YV9hbGxvYyhtYXhfc2l6ZS5WYWx1ZU9yRGllKCkpKTsKKyAgaW50KiBnID0gc3RhdGljX2Nhc3Q8aW50Kj4ob3BqX2ltYWdlX2RhdGFfYWxsb2MobWF4X3NpemUuVmFsdWVPckRpZSgpKSk7CisgIGludCogYiA9IHN0YXRpY19jYXN0PGludCo+KG9wal9pbWFnZV9kYXRhX2FsbG9jKG1heF9zaXplLlZhbHVlT3JEaWUoKSkpOworICBpbnQqIGQwID0gcjsKKyAgaW50KiBkMSA9IGc7CisgIGludCogZDIgPSBiOworICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbWF4aDsgKytpKSB7CisgICAgT1BKX1VJTlQzMiBqOworICAgIGZvciAoaiA9IDA7IGogPCAobWF4dyAmIH5zdGF0aWNfY2FzdDxPUEpfVUlOVDMyPigxKSk7IGogKz0gMikgeworICAgICAgc3ljY190b19yZ2Iob2Zmc2V0LCB1cGIsICp5KyssICpjYiwgKmNyLCByKyssIGcrKywgYisrKTsKKyAgICAgIHN5Y2NfdG9fcmdiKG9mZnNldCwgdXBiLCAqeSsrLCAqY2IrKywgKmNyKyssIHIrKywgZysrLCBiKyspOworICAgIH0KKyAgICBpZiAoaiA8IG1heHcpIHsKKyAgICAgIHN5Y2NfdG9fcmdiKG9mZnNldCwgdXBiLCAqeSsrLCAqY2IrKywgKmNyKyssIHIrKywgZysrLCBiKyspOworICAgIH0KKyAgfQorICBvcGpfaW1hZ2VfZGF0YV9mcmVlKGltZy0+Y29tcHNbMF0uZGF0YSk7CisgIG9wal9pbWFnZV9kYXRhX2ZyZWUoaW1nLT5jb21wc1sxXS5kYXRhKTsKKyAgb3BqX2ltYWdlX2RhdGFfZnJlZShpbWctPmNvbXBzWzJdLmRhdGEpOworICBpbWctPmNvbXBzWzBdLmRhdGEgPSBkMDsKKyAgaW1nLT5jb21wc1sxXS5kYXRhID0gZDE7CisgIGltZy0+Y29tcHNbMl0uZGF0YSA9IGQyOworICBpbWctPmNvbXBzWzFdLncgPSBtYXh3OworICBpbWctPmNvbXBzWzFdLmggPSBtYXhoOworICBpbWctPmNvbXBzWzJdLncgPSBtYXh3OworICBpbWctPmNvbXBzWzJdLmggPSBtYXhoOworICBpbWctPmNvbXBzWzFdLmR4ID0gaW1nLT5jb21wc1swXS5keDsKKyAgaW1nLT5jb21wc1syXS5keCA9IGltZy0+Y29tcHNbMF0uZHg7CisgIGltZy0+Y29tcHNbMV0uZHkgPSBpbWctPmNvbXBzWzBdLmR5OworICBpbWctPmNvbXBzWzJdLmR5ID0gaW1nLT5jb21wc1swXS5keTsKK30KKworYm9vbCBzeWNjNDIwX211c3RfZXh0ZW5kX2NiY3IoT1BKX1VJTlQzMiB5LCBPUEpfVUlOVDMyIGNiY3IpIHsKKyAgcmV0dXJuICh5ICYgMSkgJiYgKGNiY3IgPT0geSAvIDIpOworfQorCitib29sIGlzX3N5Y2M0MjAoY29uc3Qgb3BqX2ltYWdlX3QqIGltZykgeworICByZXR1cm4gaW1nLT5jb21wc1swXS5keCA9PSAxICYmIGltZy0+Y29tcHNbMF0uZHkgPT0gMSAmJgorICAgICAgICAgaW1nLT5jb21wc1sxXS5keCA9PSAyICYmIGltZy0+Y29tcHNbMV0uZHkgPT0gMiAmJgorICAgICAgICAgaW1nLT5jb21wc1syXS5keCA9PSAyICYmIGltZy0+Y29tcHNbMl0uZHkgPT0gMjsKK30KKworYm9vbCBpc19zeWNjNDIyKGNvbnN0IG9wal9pbWFnZV90KiBpbWcpIHsKKyAgcmV0dXJuIGltZy0+Y29tcHNbMF0uZHggPT0gMSAmJiBpbWctPmNvbXBzWzBdLmR5ID09IDEgJiYKKyAgICAgICAgIGltZy0+Y29tcHNbMV0uZHggPT0gMiAmJiBpbWctPmNvbXBzWzFdLmR5ID09IDEgJiYKKyAgICAgICAgIGltZy0+Y29tcHNbMl0uZHggPT0gMiAmJiBpbWctPmNvbXBzWzJdLmR5ID09IDE7Cit9CisKK2Jvb2wgaXNfc3ljYzQ0NChjb25zdCBvcGpfaW1hZ2VfdCogaW1nKSB7CisgIHJldHVybiBpbWctPmNvbXBzWzBdLmR4ID09IDEgJiYgaW1nLT5jb21wc1swXS5keSA9PSAxICYmCisgICAgICAgICBpbWctPmNvbXBzWzFdLmR4ID09IDEgJiYgaW1nLT5jb21wc1sxXS5keSA9PSAxICYmCisgICAgICAgICBpbWctPmNvbXBzWzJdLmR4ID09IDEgJiYgaW1nLT5jb21wc1syXS5keSA9PSAxOworfQorCit2b2lkIGNvbG9yX3N5Y2NfdG9fcmdiKG9wal9pbWFnZV90KiBpbWcpIHsKKyAgaWYgKGltZy0+bnVtY29tcHMgPCAzKSB7CisgICAgaW1nLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfR1JBWTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGlzX3N5Y2M0MjAoaW1nKSkKKyAgICBzeWNjNDIwX3RvX3JnYihpbWcpOworICBlbHNlIGlmIChpc19zeWNjNDIyKGltZykpCisgICAgc3ljYzQyMl90b19yZ2IoaW1nKTsKKyAgZWxzZSBpZiAoaXNfc3ljYzQ0NChpbWcpKQorICAgIHN5Y2M0NDRfdG9fcmdiKGltZyk7CisgIGVsc2UKKyAgICByZXR1cm47CisKKyAgaW1nLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1JHQjsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKIE9QSl9TSVpFX1Qgb3BqX3JlYWRfZnJvbV9tZW1vcnkodm9pZCogcF9idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9TSVpFX1QgbmJfYnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBfdXNlcl9kYXRhKSB7CiAgIERlY29kZURhdGEqIHNyY0RhdGEgPSBzdGF0aWNfY2FzdDxEZWNvZGVEYXRhKj4ocF91c2VyX2RhdGEpOwotICBpZiAoIXNyY0RhdGEgfHwgIXNyY0RhdGEtPnNyY19kYXRhIHx8IHNyY0RhdGEtPnNyY19zaXplID09IDApIHsKKyAgaWYgKCFzcmNEYXRhIHx8ICFzcmNEYXRhLT5zcmNfZGF0YSB8fCBzcmNEYXRhLT5zcmNfc2l6ZSA9PSAwKQogICAgIHJldHVybiBzdGF0aWNfY2FzdDxPUEpfU0laRV9UPigtMSk7Ci0gIH0KKwogICAvLyBSZWFkcyBhdCBFT0YgcmV0dXJuIGFuIGVycm9yIGNvZGUuCi0gIGlmIChzcmNEYXRhLT5vZmZzZXQgPj0gc3JjRGF0YS0+c3JjX3NpemUpIHsKKyAgaWYgKHNyY0RhdGEtPm9mZnNldCA+PSBzcmNEYXRhLT5zcmNfc2l6ZSkKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8T1BKX1NJWkVfVD4oLTEpOwotICB9CisKICAgT1BKX1NJWkVfVCBidWZmZXJMZW5ndGggPSBzcmNEYXRhLT5zcmNfc2l6ZSAtIHNyY0RhdGEtPm9mZnNldDsKICAgT1BKX1NJWkVfVCByZWFkbGVuZ3RoID0gbmJfYnl0ZXMgPCBidWZmZXJMZW5ndGggPyBuYl9ieXRlcyA6IGJ1ZmZlckxlbmd0aDsKICAgbWVtY3B5KHBfYnVmZmVyLCAmc3JjRGF0YS0+c3JjX2RhdGFbc3JjRGF0YS0+b2Zmc2V0XSwgcmVhZGxlbmd0aCk7CkBAIC00NCwzNiArMjI5LDE4IEBACiAgIHJldHVybiByZWFkbGVuZ3RoOwogfQogCi1PUEpfU0laRV9UIG9wal93cml0ZV9mcm9tX21lbW9yeSh2b2lkKiBwX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9TSVpFX1QgbmJfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwX3VzZXJfZGF0YSkgewotICBEZWNvZGVEYXRhKiBzcmNEYXRhID0gc3RhdGljX2Nhc3Q8RGVjb2RlRGF0YSo+KHBfdXNlcl9kYXRhKTsKLSAgaWYgKCFzcmNEYXRhIHx8ICFzcmNEYXRhLT5zcmNfZGF0YSB8fCBzcmNEYXRhLT5zcmNfc2l6ZSA9PSAwKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PE9QSl9TSVpFX1Q+KC0xKTsKLSAgfQotICAvLyBXcml0ZXMgYXQgRU9GIHJldHVybiBhbiBlcnJvciBjb2RlLgotICBpZiAoc3JjRGF0YS0+b2Zmc2V0ID49IHNyY0RhdGEtPnNyY19zaXplKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PE9QSl9TSVpFX1Q+KC0xKTsKLSAgfQotICBPUEpfU0laRV9UIGJ1ZmZlckxlbmd0aCA9IHNyY0RhdGEtPnNyY19zaXplIC0gc3JjRGF0YS0+b2Zmc2V0OwotICBPUEpfU0laRV9UIHdyaXRlTGVuZ3RoID0gbmJfYnl0ZXMgPCBidWZmZXJMZW5ndGggPyBuYl9ieXRlcyA6IGJ1ZmZlckxlbmd0aDsKLSAgbWVtY3B5KCZzcmNEYXRhLT5zcmNfZGF0YVtzcmNEYXRhLT5vZmZzZXRdLCBwX2J1ZmZlciwgd3JpdGVMZW5ndGgpOwotICBzcmNEYXRhLT5vZmZzZXQgKz0gd3JpdGVMZW5ndGg7Ci0gIHJldHVybiB3cml0ZUxlbmd0aDsKLX0KLQogT1BKX09GRl9UIG9wal9za2lwX2Zyb21fbWVtb3J5KE9QSl9PRkZfVCBuYl9ieXRlcywgdm9pZCogcF91c2VyX2RhdGEpIHsKICAgRGVjb2RlRGF0YSogc3JjRGF0YSA9IHN0YXRpY19jYXN0PERlY29kZURhdGEqPihwX3VzZXJfZGF0YSk7Ci0gIGlmICghc3JjRGF0YSB8fCAhc3JjRGF0YS0+c3JjX2RhdGEgfHwgc3JjRGF0YS0+c3JjX3NpemUgPT0gMCkgeworICBpZiAoIXNyY0RhdGEgfHwgIXNyY0RhdGEtPnNyY19kYXRhIHx8IHNyY0RhdGEtPnNyY19zaXplID09IDApCiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PE9QSl9PRkZfVD4oLTEpOwotICB9CisKICAgLy8gT2Zmc2V0cyBhcmUgc2lnbmVkIGFuZCBtYXkgaW5kaWNhdGUgYSBuZWdhdGl2ZSBza2lwLiBEbyBub3Qgc3VwcG9ydCB0aGlzCiAgIC8vIGJlY2F1c2Ugb2YgdGhlIHN0cmFuZ2UgcmV0dXJuIGNvbnZlbnRpb24gd2hlcmUgZWl0aGVyIGJ5dGVzIHNraXBwZWQgb3IKICAgLy8gLTEgaXMgcmV0dXJuZWQuIEZvbGxvd2luZyB0aGF0IGNvbnZlbnRpb24sIGEgc3VjY2Vzc2Z1bCByZWxhdGl2ZSBzZWVrIG9mCiAgIC8vIC0xIGJ5dGVzIHdvdWxkIGJlIHJlcXVpcmVkIHRvIHRvIGdpdmUgdGhlIHNhbWUgcmVzdWx0IGFzIHRoZSBlcnJvciBjYXNlLgotICBpZiAobmJfYnl0ZXMgPCAwKSB7CisgIGlmIChuYl9ieXRlcyA8IDApCiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PE9QSl9PRkZfVD4oLTEpOwotICB9CisKICAgLy8gRklYTUU6IHVzZSBzdGQ6Om1ha2VfdW5zaWduZWQ8T1BKX09GRl9UPjo6dHlwZSBvbmNlIGMrKzExIGxpYiBpcyBPSydkLgogICB1aW50NjRfdCB1bnNpZ25lZE5iQnl0ZXMgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4obmJfYnl0ZXMpOwogICAvLyBBZGRpdGlvbmFsbHksIHRoZSBvZmZzZXQgbWF5IHRha2UgdXMgYmV5b25kIHRoZSByYW5nZSBvZiBhIHNpemVfdCAoZS5nLgpAQCAtOTYsMTQgKzI2MywxNCBAQAogCiBPUEpfQk9PTCBvcGpfc2Vla19mcm9tX21lbW9yeShPUEpfT0ZGX1QgbmJfYnl0ZXMsIHZvaWQqIHBfdXNlcl9kYXRhKSB7CiAgIERlY29kZURhdGEqIHNyY0RhdGEgPSBzdGF0aWNfY2FzdDxEZWNvZGVEYXRhKj4ocF91c2VyX2RhdGEpOwotICBpZiAoIXNyY0RhdGEgfHwgIXNyY0RhdGEtPnNyY19kYXRhIHx8IHNyY0RhdGEtPnNyY19zaXplID09IDApIHsKKyAgaWYgKCFzcmNEYXRhIHx8ICFzcmNEYXRhLT5zcmNfZGF0YSB8fCBzcmNEYXRhLT5zcmNfc2l6ZSA9PSAwKQogICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gIH0KKwogICAvLyBPZmZzZXRzIGFyZSBzaWduZWQgYW5kIG1heSBpbmRpY2F0ZSBhIG5lZ2F0aXZlIHBvc2l0aW9uLCB3aGljaCB3b3VsZAogICAvLyBiZSBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiBEbyBub3Qgc3VwcG9ydCB0aGlzLgotICBpZiAobmJfYnl0ZXMgPCAwKSB7CisgIGlmIChuYl9ieXRlcyA8IDApCiAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgfQorCiAgIC8vIEZJWE1FOiB1c2Ugc3RkOjptYWtlX3Vuc2lnbmVkPE9QSl9PRkZfVD46OnR5cGUgb25jZSBjKysxMSBsaWIgaXMgT0snZC4KICAgdWludDY0X3QgdW5zaWduZWROYkJ5dGVzID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG5iX2J5dGVzKTsKICAgLy8gQWRkaXRpb25hbGx5LCB0aGUgb2Zmc2V0IG1heSB0YWtlIHVzIGJleW9uZCB0aGUgcmFuZ2Ugb2YgYSBzaXplX3QgKGUuZy4KQEAgLTExOCwxODcgKzI4NSw3IEBACiAgIH0KICAgcmV0dXJuIE9QSl9UUlVFOwogfQotb3BqX3N0cmVhbV90KiBmeF9vcGpfc3RyZWFtX2NyZWF0ZV9tZW1vcnlfc3RyZWFtKERlY29kZURhdGEqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1NJWkVfVCBwX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JPT0wgcF9pc19yZWFkX3N0cmVhbSkgewotICBvcGpfc3RyZWFtX3QqIGxfc3RyZWFtID0gMDA7Ci0gIGlmICghZGF0YSB8fCAhZGF0YS0+c3JjX2RhdGEgfHwgZGF0YS0+c3JjX3NpemUgPD0gMCkgewotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIGxfc3RyZWFtID0gb3BqX3N0cmVhbV9jcmVhdGUocF9zaXplLCBwX2lzX3JlYWRfc3RyZWFtKTsKLSAgaWYgKCFsX3N0cmVhbSkgewotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIG9wal9zdHJlYW1fc2V0X3VzZXJfZGF0YShsX3N0cmVhbSwgZGF0YSwgbnVsbHB0cik7Ci0gIG9wal9zdHJlYW1fc2V0X3VzZXJfZGF0YV9sZW5ndGgobF9zdHJlYW0sIGRhdGEtPnNyY19zaXplKTsKLSAgb3BqX3N0cmVhbV9zZXRfcmVhZF9mdW5jdGlvbihsX3N0cmVhbSwgb3BqX3JlYWRfZnJvbV9tZW1vcnkpOwotICBvcGpfc3RyZWFtX3NldF93cml0ZV9mdW5jdGlvbihsX3N0cmVhbSwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KTsKLSAgb3BqX3N0cmVhbV9zZXRfc2tpcF9mdW5jdGlvbihsX3N0cmVhbSwgb3BqX3NraXBfZnJvbV9tZW1vcnkpOwotICBvcGpfc3RyZWFtX3NldF9zZWVrX2Z1bmN0aW9uKGxfc3RyZWFtLCBvcGpfc2Vla19mcm9tX21lbW9yeSk7Ci0gIHJldHVybiBsX3N0cmVhbTsKLX0KLXN0YXRpYyB2b2lkIHN5Y2NfdG9fcmdiKGludCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXBiLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2IsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG91dF9yLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBvdXRfZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCogb3V0X2IpIHsKLSAgaW50IHIsIGcsIGI7Ci0gIGNiIC09IG9mZnNldDsKLSAgY3IgLT0gb2Zmc2V0OwotICByID0geSArIChpbnQpKDEuNDAyICogKGZsb2F0KWNyKTsKLSAgaWYgKHIgPCAwKSB7Ci0gICAgciA9IDA7Ci0gIH0gZWxzZSBpZiAociA+IHVwYikgewotICAgIHIgPSB1cGI7Ci0gIH0KLSAgKm91dF9yID0gcjsKLSAgZyA9IHkgLSAoaW50KSgwLjM0NCAqIChmbG9hdCljYiArIDAuNzE0ICogKGZsb2F0KWNyKTsKLSAgaWYgKGcgPCAwKSB7Ci0gICAgZyA9IDA7Ci0gIH0gZWxzZSBpZiAoZyA+IHVwYikgewotICAgIGcgPSB1cGI7Ci0gIH0KLSAgKm91dF9nID0gZzsKLSAgYiA9IHkgKyAoaW50KSgxLjc3MiAqIChmbG9hdCljYik7Ci0gIGlmIChiIDwgMCkgewotICAgIGIgPSAwOwotICB9IGVsc2UgaWYgKGIgPiB1cGIpIHsKLSAgICBiID0gdXBiOwotICB9Ci0gICpvdXRfYiA9IGI7Ci19CiAKLXN0YXRpYyB2b2lkIHN5Y2M0NDRfdG9fcmdiKG9wal9pbWFnZV90KiBpbWcpIHsKLSAgaW50IHByZWMgPSBpbWctPmNvbXBzWzBdLnByZWM7Ci0gIGludCBvZmZzZXQgPSAxIDw8IChwcmVjIC0gMSk7Ci0gIGludCB1cGIgPSAoMSA8PCBwcmVjKSAtIDE7Ci0gIE9QSl9VSU5UMzIgbWF4dyA9Ci0gICAgICBzdGQ6Om1pbih7aW1nLT5jb21wc1swXS53LCBpbWctPmNvbXBzWzFdLncsIGltZy0+Y29tcHNbMl0ud30pOwotICBPUEpfVUlOVDMyIG1heGggPQotICAgICAgc3RkOjptaW4oe2ltZy0+Y29tcHNbMF0uaCwgaW1nLT5jb21wc1sxXS5oLCBpbWctPmNvbXBzWzJdLmh9KTsKLSAgRlhfU0FGRV9TSVpFX1QgbWF4X3NpemUgPSBtYXh3OwotICBtYXhfc2l6ZSAqPSBtYXhoOwotICBpZiAoIW1heF9zaXplLklzVmFsaWQoKSkKLSAgICByZXR1cm47Ci0KLSAgY29uc3QgaW50KiB5ID0gaW1nLT5jb21wc1swXS5kYXRhOwotICBjb25zdCBpbnQqIGNiID0gaW1nLT5jb21wc1sxXS5kYXRhOwotICBjb25zdCBpbnQqIGNyID0gaW1nLT5jb21wc1syXS5kYXRhOwotICBpZiAoIXkgfHwgIWNiIHx8ICFjcikKLSAgICByZXR1cm47Ci0KLSAgaW50KiByID0gRlhfQWxsb2MoaW50LCBtYXhfc2l6ZS5WYWx1ZU9yRGllKCkpOwotICBpbnQqIGcgPSBGWF9BbGxvYyhpbnQsIG1heF9zaXplLlZhbHVlT3JEaWUoKSk7Ci0gIGludCogYiA9IEZYX0FsbG9jKGludCwgbWF4X3NpemUuVmFsdWVPckRpZSgpKTsKLSAgaW50KiBkMCA9IHI7Ci0gIGludCogZDEgPSBnOwotICBpbnQqIGQyID0gYjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXhfc2l6ZS5WYWx1ZU9yRGllKCk7ICsraSkgewotICAgIHN5Y2NfdG9fcmdiKG9mZnNldCwgdXBiLCAqeSwgKmNiLCAqY3IsIHIsIGcsIGIpOwotICAgICsreTsKLSAgICArK2NiOwotICAgICsrY3I7Ci0gICAgKytyOwotICAgICsrZzsKLSAgICArK2I7Ci0gIH0KLSAgRlhfRnJlZShpbWctPmNvbXBzWzBdLmRhdGEpOwotICBGWF9GcmVlKGltZy0+Y29tcHNbMV0uZGF0YSk7Ci0gIEZYX0ZyZWUoaW1nLT5jb21wc1syXS5kYXRhKTsKLSAgaW1nLT5jb21wc1swXS5kYXRhID0gZDA7Ci0gIGltZy0+Y29tcHNbMV0uZGF0YSA9IGQxOwotICBpbWctPmNvbXBzWzJdLmRhdGEgPSBkMjsKLX0KLQotc3RhdGljIGJvb2wgc3ljYzQyMF80MjJfc2l6ZV9pc192YWxpZChvcGpfaW1hZ2VfdCogaW1nKSB7Ci0gIHJldHVybiAoaW1nICYmIGltZy0+Y29tcHNbMF0udyAhPSBzdGQ6Om51bWVyaWNfbGltaXRzPE9QSl9VSU5UMzI+OjptYXgoKSAmJgotICAgICAgICAgIChpbWctPmNvbXBzWzBdLncgKyAxKSAvIDIgPT0gaW1nLT5jb21wc1sxXS53ICYmCi0gICAgICAgICAgaW1nLT5jb21wc1sxXS53ID09IGltZy0+Y29tcHNbMl0udyAmJgotICAgICAgICAgIGltZy0+Y29tcHNbMV0uaCA9PSBpbWctPmNvbXBzWzJdLmgpOwotfQotc3RhdGljIGJvb2wgc3ljYzQyMF9zaXplX2lzX3ZhbGlkKG9wal9pbWFnZV90KiBpbWcpIHsKLSAgcmV0dXJuIChzeWNjNDIwXzQyMl9zaXplX2lzX3ZhbGlkKGltZykgJiYKLSAgICAgICAgICBpbWctPmNvbXBzWzBdLmggIT0gc3RkOjpudW1lcmljX2xpbWl0czxPUEpfVUlOVDMyPjo6bWF4KCkgJiYKLSAgICAgICAgICAoaW1nLT5jb21wc1swXS5oICsgMSkgLyAyID09IGltZy0+Y29tcHNbMV0uaCk7Ci19Ci1zdGF0aWMgYm9vbCBzeWNjNDIyX3NpemVfaXNfdmFsaWQob3BqX2ltYWdlX3QqIGltZykgewotICByZXR1cm4gKHN5Y2M0MjBfNDIyX3NpemVfaXNfdmFsaWQoaW1nKSAmJiBpbWctPmNvbXBzWzBdLmggPT0gaW1nLT5jb21wc1sxXS5oKTsKLX0KLXN0YXRpYyB2b2lkIHN5Y2M0MjJfdG9fcmdiKG9wal9pbWFnZV90KiBpbWcpIHsKLSAgaWYgKCFzeWNjNDIyX3NpemVfaXNfdmFsaWQoaW1nKSkKLSAgICByZXR1cm47Ci0KLSAgaW50IHByZWMgPSBpbWctPmNvbXBzWzBdLnByZWM7Ci0gIGlmIChwcmVjIDw9IDAgfHwgcHJlYyA+PSAzMikKLSAgICByZXR1cm47Ci0KLSAgaW50IG9mZnNldCA9IDEgPDwgKHByZWMgLSAxKTsKLSAgaW50IHVwYiA9ICgxIDw8IHByZWMpIC0gMTsKLQotICBPUEpfVUlOVDMyIG1heHcgPSBpbWctPmNvbXBzWzBdLnc7Ci0gIE9QSl9VSU5UMzIgbWF4aCA9IGltZy0+Y29tcHNbMF0uaDsKLSAgRlhfU0FGRV9TSVpFX1QgbWF4X3NpemUgPSBtYXh3OwotICBtYXhfc2l6ZSAqPSBtYXhoOwotICBpZiAoIW1heF9zaXplLklzVmFsaWQoKSkKLSAgICByZXR1cm47Ci0KLSAgY29uc3QgaW50KiB5ID0gaW1nLT5jb21wc1swXS5kYXRhOwotICBjb25zdCBpbnQqIGNiID0gaW1nLT5jb21wc1sxXS5kYXRhOwotICBjb25zdCBpbnQqIGNyID0gaW1nLT5jb21wc1syXS5kYXRhOwotICBpZiAoIXkgfHwgIWNiIHx8ICFjcikKLSAgICByZXR1cm47Ci0KLSAgaW50ICpkMCwgKmQxLCAqZDIsICpyLCAqZywgKmI7Ci0gIGQwID0gciA9IEZYX0FsbG9jKGludCwgbWF4X3NpemUuVmFsdWVPckRpZSgpKTsKLSAgZDEgPSBnID0gRlhfQWxsb2MoaW50LCBtYXhfc2l6ZS5WYWx1ZU9yRGllKCkpOwotICBkMiA9IGIgPSBGWF9BbGxvYyhpbnQsIG1heF9zaXplLlZhbHVlT3JEaWUoKSk7Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtYXhoOyArK2kpIHsKLSAgICBPUEpfVUlOVDMyIGo7Ci0gICAgZm9yIChqID0gMDsgaiA8IChtYXh3ICYgfnN0YXRpY19jYXN0PE9QSl9VSU5UMzI+KDEpKTsgaiArPSAyKSB7Ci0gICAgICBzeWNjX3RvX3JnYihvZmZzZXQsIHVwYiwgKnksICpjYiwgKmNyLCByLCBnLCBiKTsKLSAgICAgICsreTsKLSAgICAgICsrcjsKLSAgICAgICsrZzsKLSAgICAgICsrYjsKLSAgICAgIHN5Y2NfdG9fcmdiKG9mZnNldCwgdXBiLCAqeSwgKmNiLCAqY3IsIHIsIGcsIGIpOwotICAgICAgKyt5OwotICAgICAgKytyOwotICAgICAgKytnOwotICAgICAgKytiOwotICAgICAgKytjYjsKLSAgICAgICsrY3I7Ci0gICAgfQotICAgIGlmIChqIDwgbWF4dykgewotICAgICAgc3ljY190b19yZ2Iob2Zmc2V0LCB1cGIsICp5LCAqY2IsICpjciwgciwgZywgYik7Ci0gICAgICArK3k7Ci0gICAgICArK3I7Ci0gICAgICArK2c7Ci0gICAgICArK2I7Ci0gICAgICArK2NiOwotICAgICAgKytjcjsKLSAgICB9Ci0gIH0KLSAgRlhfRnJlZShpbWctPmNvbXBzWzBdLmRhdGEpOwotICBpbWctPmNvbXBzWzBdLmRhdGEgPSBkMDsKLSAgRlhfRnJlZShpbWctPmNvbXBzWzFdLmRhdGEpOwotICBpbWctPmNvbXBzWzFdLmRhdGEgPSBkMTsKLSAgRlhfRnJlZShpbWctPmNvbXBzWzJdLmRhdGEpOwotICBpbWctPmNvbXBzWzJdLmRhdGEgPSBkMjsKLSAgaW1nLT5jb21wc1sxXS53ID0gbWF4dzsKLSAgaW1nLT5jb21wc1sxXS5oID0gbWF4aDsKLSAgaW1nLT5jb21wc1syXS53ID0gbWF4dzsKLSAgaW1nLT5jb21wc1syXS5oID0gbWF4aDsKLSAgaW1nLT5jb21wc1sxXS5keCA9IGltZy0+Y29tcHNbMF0uZHg7Ci0gIGltZy0+Y29tcHNbMl0uZHggPSBpbWctPmNvbXBzWzBdLmR4OwotICBpbWctPmNvbXBzWzFdLmR5ID0gaW1nLT5jb21wc1swXS5keTsKLSAgaW1nLT5jb21wc1syXS5keSA9IGltZy0+Y29tcHNbMF0uZHk7Ci19Ci1zdGF0aWMgYm9vbCBzeWNjNDIwX211c3RfZXh0ZW5kX2NiY3IoT1BKX1VJTlQzMiB5LCBPUEpfVUlOVDMyIGNiY3IpIHsKLSAgcmV0dXJuICh5ICYgMSkgJiYgKGNiY3IgPT0geSAvIDIpOwotfQogdm9pZCBzeWNjNDIwX3RvX3JnYihvcGpfaW1hZ2VfdCogaW1nKSB7CiAgIGlmICghc3ljYzQyMF9zaXplX2lzX3ZhbGlkKGltZykpCiAgICAgcmV0dXJuOwpAQCAtMzA2LDYgKzI5Myw3IEBACiAgIE9QSl9VSU5UMzIgcHJlYyA9IGltZy0+Y29tcHNbMF0ucHJlYzsKICAgaWYgKCFwcmVjKQogICAgIHJldHVybjsKKwogICBPUEpfVUlOVDMyIG9mZnNldCA9IDEgPDwgKHByZWMgLSAxKTsKICAgT1BKX1VJTlQzMiB1cGIgPSAoMSA8PCBwcmVjKSAtIDE7CiAgIE9QSl9VSU5UMzIgeXcgPSBpbWctPmNvbXBzWzBdLnc7CkBAIC0zMTcsMTEgKzMwNSwxMyBAQAogICBib29sIGV4dGggPSBzeWNjNDIwX211c3RfZXh0ZW5kX2NiY3IoeWgsIGNiaCk7CiAgIEZYX1NBRkVfVUlOVDMyIHNhZmVTaXplID0geXc7CiAgIHNhZmVTaXplICo9IHloOworICBzYWZlU2l6ZSAqPSBzaXplb2YoaW50KTsKICAgaWYgKCFzYWZlU2l6ZS5Jc1ZhbGlkKCkpCiAgICAgcmV0dXJuOwotICBpbnQqIHIgPSBGWF9BbGxvYyhpbnQsIHNhZmVTaXplLlZhbHVlT3JEaWUoKSk7Ci0gIGludCogZyA9IEZYX0FsbG9jKGludCwgc2FmZVNpemUuVmFsdWVPckRpZSgpKTsKLSAgaW50KiBiID0gRlhfQWxsb2MoaW50LCBzYWZlU2l6ZS5WYWx1ZU9yRGllKCkpOworCisgIGludCogciA9IHN0YXRpY19jYXN0PGludCo+KG9wal9pbWFnZV9kYXRhX2FsbG9jKHNhZmVTaXplLlZhbHVlT3JEaWUoKSkpOworICBpbnQqIGcgPSBzdGF0aWNfY2FzdDxpbnQqPihvcGpfaW1hZ2VfZGF0YV9hbGxvYyhzYWZlU2l6ZS5WYWx1ZU9yRGllKCkpKTsKKyAgaW50KiBiID0gc3RhdGljX2Nhc3Q8aW50Kj4ob3BqX2ltYWdlX2RhdGFfYWxsb2Moc2FmZVNpemUuVmFsdWVPckRpZSgpKSk7CiAgIGludCogZDAgPSByOwogICBpbnQqIGQxID0gZzsKICAgaW50KiBkMiA9IGI7CkBAIC00MTcsMTEgKzQwNywxMSBAQAogICAgIH0KICAgfQogCi0gIEZYX0ZyZWUoaW1nLT5jb21wc1swXS5kYXRhKTsKKyAgb3BqX2ltYWdlX2RhdGFfZnJlZShpbWctPmNvbXBzWzBdLmRhdGEpOworICBvcGpfaW1hZ2VfZGF0YV9mcmVlKGltZy0+Y29tcHNbMV0uZGF0YSk7CisgIG9wal9pbWFnZV9kYXRhX2ZyZWUoaW1nLT5jb21wc1syXS5kYXRhKTsKICAgaW1nLT5jb21wc1swXS5kYXRhID0gZDA7Ci0gIEZYX0ZyZWUoaW1nLT5jb21wc1sxXS5kYXRhKTsKICAgaW1nLT5jb21wc1sxXS5kYXRhID0gZDE7Ci0gIEZYX0ZyZWUoaW1nLT5jb21wc1syXS5kYXRhKTsKICAgaW1nLT5jb21wc1syXS5kYXRhID0gZDI7CiAgIGltZy0+Y29tcHNbMV0udyA9IHl3OwogICBpbWctPmNvbXBzWzFdLmggPSB5aDsKQEAgLTQzNiwyOTAgKzQyNiwyMSBAQAogICBpbWctPmNvbXBzWzFdLmR5ID0gaW1nLT5jb21wc1swXS5keTsKICAgaW1nLT5jb21wc1syXS5keSA9IGltZy0+Y29tcHNbMF0uZHk7CiB9Ci12b2lkIGNvbG9yX3N5Y2NfdG9fcmdiKG9wal9pbWFnZV90KiBpbWcpIHsKLSAgaWYgKGltZy0+bnVtY29tcHMgPCAzKSB7Ci0gICAgaW1nLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfR1JBWTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKChpbWctPmNvbXBzWzBdLmR4ID09IDEpICYmIChpbWctPmNvbXBzWzFdLmR4ID09IDIpICYmCi0gICAgICAoaW1nLT5jb21wc1syXS5keCA9PSAyKSAmJiAoaW1nLT5jb21wc1swXS5keSA9PSAxKSAmJgotICAgICAgKGltZy0+Y29tcHNbMV0uZHkgPT0gMikgJiYgKGltZy0+Y29tcHNbMl0uZHkgPT0gMikpIHsKLSAgICBzeWNjNDIwX3RvX3JnYihpbWcpOwotICB9IGVsc2UgaWYgKChpbWctPmNvbXBzWzBdLmR4ID09IDEpICYmIChpbWctPmNvbXBzWzFdLmR4ID09IDIpICYmCi0gICAgICAgICAgICAgKGltZy0+Y29tcHNbMl0uZHggPT0gMikgJiYgKGltZy0+Y29tcHNbMF0uZHkgPT0gMSkgJiYKLSAgICAgICAgICAgICAoaW1nLT5jb21wc1sxXS5keSA9PSAxKSAmJiAoaW1nLT5jb21wc1syXS5keSA9PSAxKSkgewotICAgIHN5Y2M0MjJfdG9fcmdiKGltZyk7Ci0gIH0gZWxzZSBpZiAoKGltZy0+Y29tcHNbMF0uZHggPT0gMSkgJiYgKGltZy0+Y29tcHNbMV0uZHggPT0gMSkgJiYKLSAgICAgICAgICAgICAoaW1nLT5jb21wc1syXS5keCA9PSAxKSAmJiAoaW1nLT5jb21wc1swXS5keSA9PSAxKSAmJgotICAgICAgICAgICAgIChpbWctPmNvbXBzWzFdLmR5ID09IDEpICYmIChpbWctPmNvbXBzWzJdLmR5ID09IDEpKSB7Ci0gICAgc3ljYzQ0NF90b19yZ2IoaW1nKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW1nLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1JHQjsKLX0KLXZvaWQgY29sb3JfYXBwbHlfaWNjX3Byb2ZpbGUob3BqX2ltYWdlX3QqIGltYWdlKSB7Ci0gIGNtc0hQUk9GSUxFIG91dF9wcm9mOwotICBjbXNVSW50MzJOdW1iZXIgaW5fdHlwZTsKLSAgY21zVUludDMyTnVtYmVyIG91dF90eXBlOwotICBpbnQqIHI7Ci0gIGludCogZzsKLSAgaW50KiBiOwotICBpbnQgbWF4OwotICBjbXNIUFJPRklMRSBpbl9wcm9mID0KLSAgICAgIGNtc09wZW5Qcm9maWxlRnJvbU1lbShpbWFnZS0+aWNjX3Byb2ZpbGVfYnVmLCBpbWFnZS0+aWNjX3Byb2ZpbGVfbGVuKTsKLSAgaWYgKCFpbl9wcm9mKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgb3V0X3NwYWNlID0gY21zR2V0Q29sb3JTcGFjZShpbl9wcm9mKTsKLSAgY21zVUludDMyTnVtYmVyIGludGVudCA9IGNtc0dldEhlYWRlclJlbmRlcmluZ0ludGVudChpbl9wcm9mKTsKLSAgaW50IG1heF93ID0gKGludClpbWFnZS0+Y29tcHNbMF0udzsKLSAgaW50IG1heF9oID0gKGludClpbWFnZS0+Y29tcHNbMF0uaDsKLSAgaW50IHByZWMgPSAoaW50KWltYWdlLT5jb21wc1swXS5wcmVjOwotICBPUEpfQ09MT1JfU1BBQ0Ugb2xkc3BhY2UgPSBpbWFnZS0+Y29sb3Jfc3BhY2U7Ci0gIGlmIChvdXRfc3BhY2UgPT0gY21zU2lnUmdiRGF0YSkgewotICAgIGlmIChwcmVjIDw9IDgpIHsKLSAgICAgIGluX3R5cGUgPSBUWVBFX1JHQl84OwotICAgICAgb3V0X3R5cGUgPSBUWVBFX1JHQl84OwotICAgIH0gZWxzZSB7Ci0gICAgICBpbl90eXBlID0gVFlQRV9SR0JfMTY7Ci0gICAgICBvdXRfdHlwZSA9IFRZUEVfUkdCXzE2OwotICAgIH0KLSAgICBvdXRfcHJvZiA9IGNtc0NyZWF0ZV9zUkdCUHJvZmlsZSgpOwotICAgIGltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1JHQjsKLSAgfSBlbHNlIGlmIChvdXRfc3BhY2UgPT0gY21zU2lnR3JheURhdGEpIHsKLSAgICBpZiAocHJlYyA8PSA4KSB7Ci0gICAgICBpbl90eXBlID0gVFlQRV9HUkFZXzg7Ci0gICAgICBvdXRfdHlwZSA9IFRZUEVfUkdCXzg7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluX3R5cGUgPSBUWVBFX0dSQVlfMTY7Ci0gICAgICBvdXRfdHlwZSA9IFRZUEVfUkdCXzE2OwotICAgIH0KLSAgICBvdXRfcHJvZiA9IGNtc0NyZWF0ZV9zUkdCUHJvZmlsZSgpOwotICAgIGltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1JHQjsKLSAgfSBlbHNlIGlmIChvdXRfc3BhY2UgPT0gY21zU2lnWUNiQ3JEYXRhKSB7Ci0gICAgaW5fdHlwZSA9IFRZUEVfWUNiQ3JfMTY7Ci0gICAgb3V0X3R5cGUgPSBUWVBFX1JHQl8xNjsKLSAgICBvdXRfcHJvZiA9IGNtc0NyZWF0ZV9zUkdCUHJvZmlsZSgpOwotICAgIGltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1JHQjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgY21zSFRSQU5TRk9STSB0cmFuc2Zvcm0gPQotICAgICAgY21zQ3JlYXRlVHJhbnNmb3JtKGluX3Byb2YsIGluX3R5cGUsIG91dF9wcm9mLCBvdXRfdHlwZSwgaW50ZW50LCAwKTsKLSAgY21zQ2xvc2VQcm9maWxlKGluX3Byb2YpOwotICBjbXNDbG9zZVByb2ZpbGUob3V0X3Byb2YpOwotICBpZiAoIXRyYW5zZm9ybSkgewotICAgIGltYWdlLT5jb2xvcl9zcGFjZSA9IG9sZHNwYWNlOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoaW1hZ2UtPm51bWNvbXBzID4gMikgewotICAgIGlmIChwcmVjIDw9IDgpIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKmluYnVmLCAqb3V0YnVmLCAqaW4sICpvdXQ7Ci0gICAgICBtYXggPSBtYXhfdyAqIG1heF9oOwotICAgICAgY21zVUludDMyTnVtYmVyIG5yX3NhbXBsZXMgPSBtYXggKiAzICogc2l6ZW9mKHVuc2lnbmVkIGNoYXIpOwotICAgICAgaW4gPSBpbmJ1ZiA9IEZYX0FsbG9jKHVuc2lnbmVkIGNoYXIsIG5yX3NhbXBsZXMpOwotICAgICAgb3V0ID0gb3V0YnVmID0gRlhfQWxsb2ModW5zaWduZWQgY2hhciwgbnJfc2FtcGxlcyk7Ci0gICAgICByID0gaW1hZ2UtPmNvbXBzWzBdLmRhdGE7Ci0gICAgICBnID0gaW1hZ2UtPmNvbXBzWzFdLmRhdGE7Ci0gICAgICBiID0gaW1hZ2UtPmNvbXBzWzJdLmRhdGE7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heDsgKytpKSB7Ci0gICAgICAgICppbisrID0gKHVuc2lnbmVkIGNoYXIpKnIrKzsKLSAgICAgICAgKmluKysgPSAodW5zaWduZWQgY2hhcikqZysrOwotICAgICAgICAqaW4rKyA9ICh1bnNpZ25lZCBjaGFyKSpiKys7Ci0gICAgICB9Ci0gICAgICBjbXNEb1RyYW5zZm9ybSh0cmFuc2Zvcm0sIGluYnVmLCBvdXRidWYsIChjbXNVSW50MzJOdW1iZXIpbWF4KTsKLSAgICAgIHIgPSBpbWFnZS0+Y29tcHNbMF0uZGF0YTsKLSAgICAgIGcgPSBpbWFnZS0+Y29tcHNbMV0uZGF0YTsKLSAgICAgIGIgPSBpbWFnZS0+Y29tcHNbMl0uZGF0YTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKLSAgICAgICAgKnIrKyA9IChpbnQpKm91dCsrOwotICAgICAgICAqZysrID0gKGludCkqb3V0Kys7Ci0gICAgICAgICpiKysgPSAoaW50KSpvdXQrKzsKLSAgICAgIH0KLSAgICAgIEZYX0ZyZWUoaW5idWYpOwotICAgICAgRlhfRnJlZShvdXRidWYpOwotICAgIH0gZWxzZSB7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCAqaW5idWYsICpvdXRidWYsICppbiwgKm91dDsKLSAgICAgIG1heCA9IG1heF93ICogbWF4X2g7Ci0gICAgICBjbXNVSW50MzJOdW1iZXIgbnJfc2FtcGxlcyA9IG1heCAqIDMgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpOwotICAgICAgaW4gPSBpbmJ1ZiA9IEZYX0FsbG9jKHVuc2lnbmVkIHNob3J0LCBucl9zYW1wbGVzKTsKLSAgICAgIG91dCA9IG91dGJ1ZiA9IEZYX0FsbG9jKHVuc2lnbmVkIHNob3J0LCBucl9zYW1wbGVzKTsKLSAgICAgIHIgPSBpbWFnZS0+Y29tcHNbMF0uZGF0YTsKLSAgICAgIGcgPSBpbWFnZS0+Y29tcHNbMV0uZGF0YTsKLSAgICAgIGIgPSBpbWFnZS0+Y29tcHNbMl0uZGF0YTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKLSAgICAgICAgKmluKysgPSAodW5zaWduZWQgc2hvcnQpKnIrKzsKLSAgICAgICAgKmluKysgPSAodW5zaWduZWQgc2hvcnQpKmcrKzsKLSAgICAgICAgKmluKysgPSAodW5zaWduZWQgc2hvcnQpKmIrKzsKLSAgICAgIH0KLSAgICAgIGNtc0RvVHJhbnNmb3JtKHRyYW5zZm9ybSwgaW5idWYsIG91dGJ1ZiwgKGNtc1VJbnQzMk51bWJlciltYXgpOwotICAgICAgciA9IGltYWdlLT5jb21wc1swXS5kYXRhOwotICAgICAgZyA9IGltYWdlLT5jb21wc1sxXS5kYXRhOwotICAgICAgYiA9IGltYWdlLT5jb21wc1syXS5kYXRhOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7ICsraSkgewotICAgICAgICAqcisrID0gKGludCkqb3V0Kys7Ci0gICAgICAgICpnKysgPSAoaW50KSpvdXQrKzsKLSAgICAgICAgKmIrKyA9IChpbnQpKm91dCsrOwotICAgICAgfQotICAgICAgRlhfRnJlZShpbmJ1Zik7Ci0gICAgICBGWF9GcmVlKG91dGJ1Zik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHVuc2lnbmVkIGNoYXIgKmluLCAqaW5idWYsICpvdXQsICpvdXRidWY7Ci0gICAgbWF4ID0gbWF4X3cgKiBtYXhfaDsKLSAgICBjbXNVSW50MzJOdW1iZXIgbnJfc2FtcGxlcyA9Ci0gICAgICAgIChjbXNVSW50MzJOdW1iZXIpbWF4ICogMyAqIHNpemVvZih1bnNpZ25lZCBjaGFyKTsKLSAgICBpbiA9IGluYnVmID0gRlhfQWxsb2ModW5zaWduZWQgY2hhciwgbnJfc2FtcGxlcyk7Ci0gICAgb3V0ID0gb3V0YnVmID0gRlhfQWxsb2ModW5zaWduZWQgY2hhciwgbnJfc2FtcGxlcyk7Ci0gICAgaW1hZ2UtPmNvbXBzID0gKG9wal9pbWFnZV9jb21wX3QqKXJlYWxsb2MoCi0gICAgICAgIGltYWdlLT5jb21wcywgKGltYWdlLT5udW1jb21wcyArIDIpICogc2l6ZW9mKG9wal9pbWFnZV9jb21wX3QpKTsKLSAgICBpZiAoaW1hZ2UtPm51bWNvbXBzID09IDIpIHsKLSAgICAgIGltYWdlLT5jb21wc1szXSA9IGltYWdlLT5jb21wc1sxXTsKLSAgICB9Ci0gICAgaW1hZ2UtPmNvbXBzWzFdID0gaW1hZ2UtPmNvbXBzWzBdOwotICAgIGltYWdlLT5jb21wc1syXSA9IGltYWdlLT5jb21wc1swXTsKLSAgICBpbWFnZS0+Y29tcHNbMV0uZGF0YSA9IEZYX0FsbG9jKGludCwgKHNpemVfdCltYXgpOwotICAgIEZYU1lTX21lbXNldChpbWFnZS0+Y29tcHNbMV0uZGF0YSwgMCwgc2l6ZW9mKGludCkgKiAoc2l6ZV90KW1heCk7Ci0gICAgaW1hZ2UtPmNvbXBzWzJdLmRhdGEgPSBGWF9BbGxvYyhpbnQsIChzaXplX3QpbWF4KTsKLSAgICBGWFNZU19tZW1zZXQoaW1hZ2UtPmNvbXBzWzJdLmRhdGEsIDAsIHNpemVvZihpbnQpICogKHNpemVfdCltYXgpOwotICAgIGltYWdlLT5udW1jb21wcyArPSAyOwotICAgIHIgPSBpbWFnZS0+Y29tcHNbMF0uZGF0YTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heDsgKytpKSB7Ci0gICAgICAqaW4rKyA9ICh1bnNpZ25lZCBjaGFyKSpyKys7Ci0gICAgfQotICAgIGNtc0RvVHJhbnNmb3JtKHRyYW5zZm9ybSwgaW5idWYsIG91dGJ1ZiwgKGNtc1VJbnQzMk51bWJlciltYXgpOwotICAgIHIgPSBpbWFnZS0+Y29tcHNbMF0uZGF0YTsKLSAgICBnID0gaW1hZ2UtPmNvbXBzWzFdLmRhdGE7Ci0gICAgYiA9IGltYWdlLT5jb21wc1syXS5kYXRhOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKLSAgICAgICpyKysgPSAoaW50KSpvdXQrKzsKLSAgICAgICpnKysgPSAoaW50KSpvdXQrKzsKLSAgICAgICpiKysgPSAoaW50KSpvdXQrKzsKLSAgICB9Ci0gICAgRlhfRnJlZShpbmJ1Zik7Ci0gICAgRlhfRnJlZShvdXRidWYpOwotICB9Ci0gIGNtc0RlbGV0ZVRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotfQotdm9pZCBjb2xvcl9hcHBseV9jb252ZXJzaW9uKG9wal9pbWFnZV90KiBpbWFnZSkgewotICBpbnQqIHJvdzsKLSAgaW50IGVudW1jcywgbnVtY29tcHM7Ci0gIG51bWNvbXBzID0gaW1hZ2UtPm51bWNvbXBzOwotICBpZiAobnVtY29tcHMgPCAzKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHJvdyA9IChpbnQqKWltYWdlLT5pY2NfcHJvZmlsZV9idWY7Ci0gIGVudW1jcyA9IHJvd1swXTsKLSAgaWYgKGVudW1jcyA9PSAxNCkgewotICAgIGludCAqTCwgKmEsICpiLCAqcmVkLCAqZ3JlZW4sICpibHVlLCAqc3JjMCwgKnNyYzEsICpzcmMyOwotICAgIGRvdWJsZSBybCwgb2wsIHJhLCBvYSwgcmIsIG9iLCBwcmVjMCwgcHJlYzEsIHByZWMyOwotICAgIGRvdWJsZSBtaW5MLCBtYXhMLCBtaW5hLCBtYXhhLCBtaW5iLCBtYXhiOwotICAgIHVuc2lnbmVkIGludCBkZWZhdWx0X3R5cGU7Ci0gICAgdW5zaWduZWQgaW50IGksIG1heDsKLSAgICBjbXNIUFJPRklMRSBpbiwgb3V0OwotICAgIGNtc0hUUkFOU0ZPUk0gdHJhbnNmb3JtOwotICAgIGNtc1VJbnQxNk51bWJlciBSR0JbM107Ci0gICAgY21zQ0lFTGFiIExhYjsKLSAgICBpbiA9IGNtc0NyZWF0ZUxhYjRQcm9maWxlKG51bGxwdHIpOwotICAgIG91dCA9IGNtc0NyZWF0ZV9zUkdCUHJvZmlsZSgpOwotICAgIHRyYW5zZm9ybSA9IGNtc0NyZWF0ZVRyYW5zZm9ybShpbiwgVFlQRV9MYWJfREJMLCBvdXQsIFRZUEVfUkdCXzE2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFTlRfUEVSQ0VQVFVBTCwgMCk7Ci0gICAgY21zQ2xvc2VQcm9maWxlKGluKTsKLSAgICBjbXNDbG9zZVByb2ZpbGUob3V0KTsKLSAgICBpZiAoIXRyYW5zZm9ybSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwcmVjMCA9IChkb3VibGUpaW1hZ2UtPmNvbXBzWzBdLnByZWM7Ci0gICAgcHJlYzEgPSAoZG91YmxlKWltYWdlLT5jb21wc1sxXS5wcmVjOwotICAgIHByZWMyID0gKGRvdWJsZSlpbWFnZS0+Y29tcHNbMl0ucHJlYzsKLSAgICBkZWZhdWx0X3R5cGUgPSByb3dbMV07Ci0gICAgaWYgKGRlZmF1bHRfdHlwZSA9PSAweDQ0NDU0NjAwKSB7Ci0gICAgICBybCA9IDEwMDsKLSAgICAgIHJhID0gMTcwOwotICAgICAgcmIgPSAyMDA7Ci0gICAgICBvbCA9IDA7Ci0gICAgICBvYSA9IHBvdygyLCBwcmVjMSAtIDEpOwotICAgICAgb2IgPSBwb3coMiwgcHJlYzIgLSAyKSArIHBvdygyLCBwcmVjMiAtIDMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBybCA9IHJvd1syXTsKLSAgICAgIHJhID0gcm93WzRdOwotICAgICAgcmIgPSByb3dbNl07Ci0gICAgICBvbCA9IHJvd1szXTsKLSAgICAgIG9hID0gcm93WzVdOwotICAgICAgb2IgPSByb3dbN107Ci0gICAgfQotICAgIEwgPSBzcmMwID0gaW1hZ2UtPmNvbXBzWzBdLmRhdGE7Ci0gICAgYSA9IHNyYzEgPSBpbWFnZS0+Y29tcHNbMV0uZGF0YTsKLSAgICBiID0gc3JjMiA9IGltYWdlLT5jb21wc1syXS5kYXRhOwotICAgIG1heCA9IGltYWdlLT5jb21wc1swXS53ICogaW1hZ2UtPmNvbXBzWzBdLmg7Ci0gICAgcmVkID0gRlhfQWxsb2MoaW50LCBtYXgpOwotICAgIGltYWdlLT5jb21wc1swXS5kYXRhID0gcmVkOwotICAgIGdyZWVuID0gRlhfQWxsb2MoaW50LCBtYXgpOwotICAgIGltYWdlLT5jb21wc1sxXS5kYXRhID0gZ3JlZW47Ci0gICAgYmx1ZSA9IEZYX0FsbG9jKGludCwgbWF4KTsKLSAgICBpbWFnZS0+Y29tcHNbMl0uZGF0YSA9IGJsdWU7Ci0gICAgbWluTCA9IC0ocmwgKiBvbCkgLyAocG93KDIsIHByZWMwKSAtIDEpOwotICAgIG1heEwgPSBtaW5MICsgcmw7Ci0gICAgbWluYSA9IC0ocmEgKiBvYSkgLyAocG93KDIsIHByZWMxKSAtIDEpOwotICAgIG1heGEgPSBtaW5hICsgcmE7Ci0gICAgbWluYiA9IC0ocmIgKiBvYikgLyAocG93KDIsIHByZWMyKSAtIDEpOwotICAgIG1heGIgPSBtaW5iICsgcmI7Ci0gICAgZm9yIChpID0gMDsgaSA8IG1heDsgKytpKSB7Ci0gICAgICBMYWIuTCA9IG1pbkwgKyAoZG91YmxlKSgqTCkgKiAobWF4TCAtIG1pbkwpIC8gKHBvdygyLCBwcmVjMCkgLSAxKTsKLSAgICAgICsrTDsKLSAgICAgIExhYi5hID0gbWluYSArIChkb3VibGUpKCphKSAqIChtYXhhIC0gbWluYSkgLyAocG93KDIsIHByZWMxKSAtIDEpOwotICAgICAgKythOwotICAgICAgTGFiLmIgPSBtaW5iICsgKGRvdWJsZSkoKmIpICogKG1heGIgLSBtaW5iKSAvIChwb3coMiwgcHJlYzIpIC0gMSk7Ci0gICAgICArK2I7Ci0gICAgICBjbXNEb1RyYW5zZm9ybSh0cmFuc2Zvcm0sICZMYWIsIFJHQiwgMSk7Ci0gICAgICAqcmVkKysgPSBSR0JbMF07Ci0gICAgICAqZ3JlZW4rKyA9IFJHQlsxXTsKLSAgICAgICpibHVlKysgPSBSR0JbMl07Ci0gICAgfQotICAgIGNtc0RlbGV0ZVRyYW5zZm9ybSh0cmFuc2Zvcm0pOwotICAgIEZYX0ZyZWUoc3JjMCk7Ci0gICAgRlhfRnJlZShzcmMxKTsKLSAgICBGWF9GcmVlKHNyYzIpOwotICAgIGltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1JHQjsKLSAgICBpbWFnZS0+Y29tcHNbMF0ucHJlYyA9IDE2OwotICAgIGltYWdlLT5jb21wc1sxXS5wcmVjID0gMTY7Ci0gICAgaW1hZ2UtPmNvbXBzWzJdLnByZWMgPSAxNjsKLSAgICByZXR1cm47Ci0gIH0KLX0KLWNsYXNzIENKUFhfRGVjb2RlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDSlBYX0RlY29kZXIoQ1BERl9Db2xvclNwYWNlKiBjcyk7Ci0gIH5DSlBYX0RlY29kZXIoKTsKLSAgYm9vbCBJbml0KGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyY19kYXRhLCB1aW50MzJfdCBzcmNfc2l6ZSk7Ci0gIHZvaWQgR2V0SW5mbyh1aW50MzJfdCogd2lkdGgsIHVpbnQzMl90KiBoZWlnaHQsIHVpbnQzMl90KiBjb21wb25lbnRzKTsKLSAgYm9vbCBEZWNvZGUodWludDhfdCogZGVzdF9idWYsCi0gICAgICAgICAgICAgIGludCBwaXRjaCwKLSAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIG9mZnNldHMpOwotCi0gcHJpdmF0ZToKLSAgY29uc3QgdWludDhfdCogbV9TcmNEYXRhOwotICB1aW50MzJfdCBtX1NyY1NpemU7Ci0gIG9wal9pbWFnZV90KiBpbWFnZTsKLSAgb3BqX2NvZGVjX3QqIGxfY29kZWM7Ci0gIG9wal9zdHJlYW1fdCogbF9zdHJlYW07Ci0gIGNvbnN0IENQREZfQ29sb3JTcGFjZSogY29uc3QgbV9Db2xvclNwYWNlOwotfTsKIAogQ0pQWF9EZWNvZGVyOjpDSlBYX0RlY29kZXIoQ1BERl9Db2xvclNwYWNlKiBjcykKLSAgICA6IGltYWdlKG51bGxwdHIpLCBsX2NvZGVjKG51bGxwdHIpLCBsX3N0cmVhbShudWxscHRyKSwgbV9Db2xvclNwYWNlKGNzKSB7fQorICAgIDogbV9JbWFnZShudWxscHRyKSwKKyAgICAgIG1fQ29kZWMobnVsbHB0ciksCisgICAgICBtX0RlY29kZURhdGEobnVsbHB0ciksCisgICAgICBtX1N0cmVhbShudWxscHRyKSwKKyAgICAgIG1fQ29sb3JTcGFjZShjcykge30KIAogQ0pQWF9EZWNvZGVyOjp+Q0pQWF9EZWNvZGVyKCkgewotICBpZiAobF9jb2RlYykgewotICAgIG9wal9kZXN0cm95X2NvZGVjKGxfY29kZWMpOwotICB9Ci0gIGlmIChsX3N0cmVhbSkgewotICAgIG9wal9zdHJlYW1fZGVzdHJveShsX3N0cmVhbSk7Ci0gIH0KLSAgaWYgKGltYWdlKSB7Ci0gICAgb3BqX2ltYWdlX2Rlc3Ryb3koaW1hZ2UpOwotICB9CisgIGlmIChtX0NvZGVjKQorICAgIG9wal9kZXN0cm95X2NvZGVjKG1fQ29kZWMpOworICBpZiAobV9TdHJlYW0pCisgICAgb3BqX3N0cmVhbV9kZXN0cm95KG1fU3RyZWFtKTsKKyAgaWYgKG1fSW1hZ2UpCisgICAgb3BqX2ltYWdlX2Rlc3Ryb3kobV9JbWFnZSk7CiB9CiAKIGJvb2wgQ0pQWF9EZWNvZGVyOjpJbml0KGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyY19kYXRhLCB1aW50MzJfdCBzcmNfc2l6ZSkgewpAQCAtNzI4LDEzNCArNDQ5LDEzOSBAQAogICBpZiAoIXNyY19kYXRhIHx8IHNyY19zaXplIDwgc2l6ZW9mKHN6SlAySGVhZGVyKSkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgaW1hZ2UgPSBudWxscHRyOworICBtX0ltYWdlID0gbnVsbHB0cjsKICAgbV9TcmNEYXRhID0gc3JjX2RhdGE7CiAgIG1fU3JjU2l6ZSA9IHNyY19zaXplOwotICBEZWNvZGVEYXRhIHNyY0RhdGEoY29uc3RfY2FzdDx1bnNpZ25lZCBjaGFyKj4oc3JjX2RhdGEpLCBzcmNfc2l6ZSk7Ci0gIGxfc3RyZWFtID0gZnhfb3BqX3N0cmVhbV9jcmVhdGVfbWVtb3J5X3N0cmVhbSgmc3JjRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9KMktfU1RSRUFNX0NIVU5LX1NJWkUsIDEpOwotICBpZiAoIWxfc3RyZWFtKSB7CisgIG1fRGVjb2RlRGF0YSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxEZWNvZGVEYXRhPigKKyAgICAgIGNvbnN0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KHNyY19kYXRhKSwgc3JjX3NpemUpOworICBtX1N0cmVhbSA9IGZ4X29wal9zdHJlYW1fY3JlYXRlX21lbW9yeV9zdHJlYW0oCisgICAgICBtX0RlY29kZURhdGEuZ2V0KCksIHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oT1BKX0oyS19TVFJFQU1fQ0hVTktfU0laRSksCisgICAgICAxKTsKKyAgaWYgKCFtX1N0cmVhbSkKICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgb3BqX2RwYXJhbWV0ZXJzX3QgcGFyYW1ldGVyczsKLSAgb3BqX3NldF9kZWZhdWx0X2RlY29kZXJfcGFyYW1ldGVycygmcGFyYW1ldGVycyk7Ci0gIHBhcmFtZXRlcnMuZGVjb2RfZm9ybWF0ID0gMDsKLSAgcGFyYW1ldGVycy5jb2RfZm9ybWF0ID0gMzsKLSAgaWYgKEZYU1lTX21lbWNtcChtX1NyY0RhdGEsIHN6SlAySGVhZGVyLCBzaXplb2Yoc3pKUDJIZWFkZXIpKSA9PSAwKSB7Ci0gICAgbF9jb2RlYyA9IG9wal9jcmVhdGVfZGVjb21wcmVzcyhPUEpfQ09ERUNfSlAyKTsKLSAgICBwYXJhbWV0ZXJzLmRlY29kX2Zvcm1hdCA9IDE7Ci0gIH0gZWxzZSB7Ci0gICAgbF9jb2RlYyA9IG9wal9jcmVhdGVfZGVjb21wcmVzcyhPUEpfQ09ERUNfSjJLKTsKLSAgfQotICBpZiAoIWxfY29kZWMpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKG1fQ29sb3JTcGFjZSAmJiBtX0NvbG9yU3BhY2UtPkdldEZhbWlseSgpID09IFBERkNTX0lOREVYRUQpCi0gICAgcGFyYW1ldGVycy5mbGFncyB8PSBPUEpfRFBBUkFNRVRFUlNfSUdOT1JFX1BDTFJfQ01BUF9DREVGX0ZMQUc7Ci0gIG9wal9zZXRfaW5mb19oYW5kbGVyKGxfY29kZWMsIGZ4X2luZm9fY2FsbGJhY2ssIDAwKTsKLSAgb3BqX3NldF93YXJuaW5nX2hhbmRsZXIobF9jb2RlYywgZnhfd2FybmluZ19jYWxsYmFjaywgMDApOwotICBvcGpfc2V0X2Vycm9yX2hhbmRsZXIobF9jb2RlYywgZnhfZXJyb3JfY2FsbGJhY2ssIDAwKTsKLSAgaWYgKCFvcGpfc2V0dXBfZGVjb2RlcihsX2NvZGVjLCAmcGFyYW1ldGVycykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFvcGpfcmVhZF9oZWFkZXIobF9zdHJlYW0sIGxfY29kZWMsICZpbWFnZSkpIHsKLSAgICBpbWFnZSA9IG51bGxwdHI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGltYWdlLT5wZGZpdW1fdXNlX2NvbG9yc3BhY2UgPSAhIW1fQ29sb3JTcGFjZTsKIAotICBpZiAoIXBhcmFtZXRlcnMubmJfdGlsZV90b19kZWNvZGUpIHsKLSAgICBpZiAoIW9wal9zZXRfZGVjb2RlX2FyZWEobF9jb2RlYywgaW1hZ2UsIHBhcmFtZXRlcnMuREFfeDAsIHBhcmFtZXRlcnMuREFfeTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuREFfeDEsIHBhcmFtZXRlcnMuREFfeTEpKSB7Ci0gICAgICBvcGpfaW1hZ2VfZGVzdHJveShpbWFnZSk7Ci0gICAgICBpbWFnZSA9IG51bGxwdHI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICghKG9wal9kZWNvZGUobF9jb2RlYywgbF9zdHJlYW0sIGltYWdlKSAmJgotICAgICAgICAgIG9wal9lbmRfZGVjb21wcmVzcyhsX2NvZGVjLCBsX3N0cmVhbSkpKSB7Ci0gICAgICBvcGpfaW1hZ2VfZGVzdHJveShpbWFnZSk7Ci0gICAgICBpbWFnZSA9IG51bGxwdHI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQorICBvcGpfc2V0X2RlZmF1bHRfZGVjb2Rlcl9wYXJhbWV0ZXJzKCZtX1BhcmFtZXRlcnMpOworICBtX1BhcmFtZXRlcnMuZGVjb2RfZm9ybWF0ID0gMDsKKyAgbV9QYXJhbWV0ZXJzLmNvZF9mb3JtYXQgPSAzOworICBpZiAobWVtY21wKG1fU3JjRGF0YSwgc3pKUDJIZWFkZXIsIHNpemVvZihzekpQMkhlYWRlcikpID09IDApIHsKKyAgICBtX0NvZGVjID0gb3BqX2NyZWF0ZV9kZWNvbXByZXNzKE9QSl9DT0RFQ19KUDIpOworICAgIG1fUGFyYW1ldGVycy5kZWNvZF9mb3JtYXQgPSAxOwogICB9IGVsc2UgewotICAgIGlmICghb3BqX2dldF9kZWNvZGVkX3RpbGUobF9jb2RlYywgbF9zdHJlYW0sIGltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy50aWxlX2luZGV4KSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKyAgICBtX0NvZGVjID0gb3BqX2NyZWF0ZV9kZWNvbXByZXNzKE9QSl9DT0RFQ19KMkspOwogICB9Ci0gIG9wal9zdHJlYW1fZGVzdHJveShsX3N0cmVhbSk7Ci0gIGxfc3RyZWFtID0gbnVsbHB0cjsKLSAgaWYgKGltYWdlLT5jb2xvcl9zcGFjZSAhPSBPUEpfQ0xSU1BDX1NZQ0MgJiYgaW1hZ2UtPm51bWNvbXBzID09IDMgJiYKLSAgICAgIGltYWdlLT5jb21wc1swXS5keCA9PSBpbWFnZS0+Y29tcHNbMF0uZHkgJiYgaW1hZ2UtPmNvbXBzWzFdLmR4ICE9IDEpIHsKLSAgICBpbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX1NZQ0M7Ci0gIH0gZWxzZSBpZiAoaW1hZ2UtPm51bWNvbXBzIDw9IDIpIHsKLSAgICBpbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX0dSQVk7Ci0gIH0KLSAgaWYgKGltYWdlLT5jb2xvcl9zcGFjZSA9PSBPUEpfQ0xSU1BDX1NZQ0MpIHsKLSAgICBjb2xvcl9zeWNjX3RvX3JnYihpbWFnZSk7Ci0gIH0KLSAgaWYgKGltYWdlLT5pY2NfcHJvZmlsZV9idWYpIHsKLSAgICBGWF9GcmVlKGltYWdlLT5pY2NfcHJvZmlsZV9idWYpOwotICAgIGltYWdlLT5pY2NfcHJvZmlsZV9idWYgPSBudWxscHRyOwotICAgIGltYWdlLT5pY2NfcHJvZmlsZV9sZW4gPSAwOwotICB9Ci0gIGlmICghaW1hZ2UpIHsKKyAgaWYgKCFtX0NvZGVjKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAobV9Db2xvclNwYWNlICYmIG1fQ29sb3JTcGFjZS0+R2V0RmFtaWx5KCkgPT0gUERGQ1NfSU5ERVhFRCkKKyAgICBtX1BhcmFtZXRlcnMuZmxhZ3MgfD0gT1BKX0RQQVJBTUVURVJTX0lHTk9SRV9QQ0xSX0NNQVBfQ0RFRl9GTEFHOworICBvcGpfc2V0X2luZm9faGFuZGxlcihtX0NvZGVjLCBmeF9pZ25vcmVfY2FsbGJhY2ssIG51bGxwdHIpOworICBvcGpfc2V0X3dhcm5pbmdfaGFuZGxlcihtX0NvZGVjLCBmeF9pZ25vcmVfY2FsbGJhY2ssIG51bGxwdHIpOworICBvcGpfc2V0X2Vycm9yX2hhbmRsZXIobV9Db2RlYywgZnhfaWdub3JlX2NhbGxiYWNrLCBudWxscHRyKTsKKyAgaWYgKCFvcGpfc2V0dXBfZGVjb2RlcihtX0NvZGVjLCAmbV9QYXJhbWV0ZXJzKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFvcGpfcmVhZF9oZWFkZXIobV9TdHJlYW0sIG1fQ29kZWMsICZtX0ltYWdlKSkgeworICAgIG1fSW1hZ2UgPSBudWxscHRyOwogICAgIHJldHVybiBmYWxzZTsKICAgfQorICBtX0ltYWdlLT5wZGZpdW1fdXNlX2NvbG9yc3BhY2UgPSAhIW1fQ29sb3JTcGFjZTsKKworICBpZiAoIW1fUGFyYW1ldGVycy5uYl90aWxlX3RvX2RlY29kZSkgeworICAgIGlmICghb3BqX3NldF9kZWNvZGVfYXJlYShtX0NvZGVjLCBtX0ltYWdlLCBtX1BhcmFtZXRlcnMuREFfeDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fUGFyYW1ldGVycy5EQV95MCwgbV9QYXJhbWV0ZXJzLkRBX3gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX1BhcmFtZXRlcnMuREFfeTEpKSB7CisgICAgICBvcGpfaW1hZ2VfZGVzdHJveShtX0ltYWdlKTsKKyAgICAgIG1fSW1hZ2UgPSBudWxscHRyOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIShvcGpfZGVjb2RlKG1fQ29kZWMsIG1fU3RyZWFtLCBtX0ltYWdlKSAmJgorICAgICAgICAgIG9wal9lbmRfZGVjb21wcmVzcyhtX0NvZGVjLCBtX1N0cmVhbSkpKSB7CisgICAgICBvcGpfaW1hZ2VfZGVzdHJveShtX0ltYWdlKTsKKyAgICAgIG1fSW1hZ2UgPSBudWxscHRyOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfSBlbHNlIGlmICghb3BqX2dldF9kZWNvZGVkX3RpbGUobV9Db2RlYywgbV9TdHJlYW0sIG1fSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fUGFyYW1ldGVycy50aWxlX2luZGV4KSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIG9wal9zdHJlYW1fZGVzdHJveShtX1N0cmVhbSk7CisgIG1fU3RyZWFtID0gbnVsbHB0cjsKKyAgaWYgKG1fSW1hZ2UtPmNvbG9yX3NwYWNlICE9IE9QSl9DTFJTUENfU1lDQyAmJiBtX0ltYWdlLT5udW1jb21wcyA9PSAzICYmCisgICAgICBtX0ltYWdlLT5jb21wc1swXS5keCA9PSBtX0ltYWdlLT5jb21wc1swXS5keSAmJgorICAgICAgbV9JbWFnZS0+Y29tcHNbMV0uZHggIT0gMSkgeworICAgIG1fSW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19TWUNDOworICB9IGVsc2UgaWYgKG1fSW1hZ2UtPm51bWNvbXBzIDw9IDIpIHsKKyAgICBtX0ltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfR1JBWTsKKyAgfQorICBpZiAobV9JbWFnZS0+Y29sb3Jfc3BhY2UgPT0gT1BKX0NMUlNQQ19TWUNDKQorICAgIGNvbG9yX3N5Y2NfdG9fcmdiKG1fSW1hZ2UpOworCisgIGlmIChtX0ltYWdlLT5pY2NfcHJvZmlsZV9idWYpIHsKKyAgICAvLyBUT0RPKHBhbG1lcik6IFVzaW5nIHxvcGpfZnJlZXwgaGVyZSByZXNvbHZlcyB0aGUgY3Jhc2ggZGVzY3JpYmVkIGluCisgICAgLy8gaHR0cHM6Ly9jcmJ1Zy5jb20vNzM3MDMzLCBidXQgdWx0aW1hdGVseSB3ZSBuZWVkIHRvIGhhcm1vbml6ZSB0aGUKKyAgICAvLyBtZW1vcnkgYWxsb2NhdGlvbiBzdHJhdGVneSBhY3Jvc3MgT3BlbkpQRUcgYW5kIGl0cyBQREZpdW0gY2FsbGVycy4KKyAgICBvcGpfZnJlZShtX0ltYWdlLT5pY2NfcHJvZmlsZV9idWYpOworICAgIG1fSW1hZ2UtPmljY19wcm9maWxlX2J1ZiA9IG51bGxwdHI7CisgICAgbV9JbWFnZS0+aWNjX3Byb2ZpbGVfbGVuID0gMDsKKyAgfQorCiAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIENKUFhfRGVjb2Rlcjo6R2V0SW5mbyh1aW50MzJfdCogd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbXBvbmVudHMpIHsKLSAgKndpZHRoID0gKHVpbnQzMl90KWltYWdlLT54MTsKLSAgKmhlaWdodCA9ICh1aW50MzJfdClpbWFnZS0+eTE7Ci0gICpjb21wb25lbnRzID0gKHVpbnQzMl90KWltYWdlLT5udW1jb21wczsKKyAgKndpZHRoID0gbV9JbWFnZS0+eDE7CisgICpoZWlnaHQgPSBtX0ltYWdlLT55MTsKKyAgKmNvbXBvbmVudHMgPSBtX0ltYWdlLT5udW1jb21wczsKIH0KIAogYm9vbCBDSlBYX0RlY29kZXI6OkRlY29kZSh1aW50OF90KiBkZXN0X2J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgb2Zmc2V0cykgewotICBpZiAoaW1hZ2UtPmNvbXBzWzBdLncgIT0gaW1hZ2UtPngxIHx8IGltYWdlLT5jb21wc1swXS5oICE9IGltYWdlLT55MSkKKyAgaWYgKG1fSW1hZ2UtPmNvbXBzWzBdLncgIT0gbV9JbWFnZS0+eDEgfHwgbV9JbWFnZS0+Y29tcHNbMF0uaCAhPSBtX0ltYWdlLT55MSkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgaWYgKHBpdGNoPChpbnQpKGltYWdlLT5jb21wc1swXS53ICogOCAqIGltYWdlLT5udW1jb21wcyArIDMxKT4+IDUgPDwgMikKKyAgaWYgKHBpdGNoPHN0YXRpY19jYXN0PGludD4obV9JbWFnZS0+Y29tcHNbMF0udyAqIDggKiBtX0ltYWdlLT5udW1jb21wcyArIDMxKT4+CisgICAgICA1IDw8IDIpIHsKICAgICByZXR1cm4gZmFsc2U7CisgIH0KIAotICBGWFNZU19tZW1zZXQoZGVzdF9idWYsIDB4ZmYsIGltYWdlLT55MSAqIHBpdGNoKTsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdCo+IGNoYW5uZWxfYnVmcyhpbWFnZS0+bnVtY29tcHMpOwotICBzdGQ6OnZlY3RvcjxpbnQ+IGFkanVzdF9jb21wcyhpbWFnZS0+bnVtY29tcHMpOwotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgaW1hZ2UtPm51bWNvbXBzOyBpKyspIHsKKyAgbWVtc2V0KGRlc3RfYnVmLCAweGZmLCBtX0ltYWdlLT55MSAqIHBpdGNoKTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdCo+IGNoYW5uZWxfYnVmcyhtX0ltYWdlLT5udW1jb21wcyk7CisgIHN0ZDo6dmVjdG9yPGludD4gYWRqdXN0X2NvbXBzKG1fSW1hZ2UtPm51bWNvbXBzKTsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1fSW1hZ2UtPm51bWNvbXBzOyBpKyspIHsKICAgICBjaGFubmVsX2J1ZnNbaV0gPSBkZXN0X2J1ZiArIG9mZnNldHNbaV07Ci0gICAgYWRqdXN0X2NvbXBzW2ldID0gaW1hZ2UtPmNvbXBzW2ldLnByZWMgLSA4OworICAgIGFkanVzdF9jb21wc1tpXSA9IG1fSW1hZ2UtPmNvbXBzW2ldLnByZWMgLSA4OwogICAgIGlmIChpID4gMCkgewotICAgICAgaWYgKGltYWdlLT5jb21wc1tpXS5keCAhPSBpbWFnZS0+Y29tcHNbaSAtIDFdLmR4IHx8Ci0gICAgICAgICAgaW1hZ2UtPmNvbXBzW2ldLmR5ICE9IGltYWdlLT5jb21wc1tpIC0gMV0uZHkgfHwKLSAgICAgICAgICBpbWFnZS0+Y29tcHNbaV0ucHJlYyAhPSBpbWFnZS0+Y29tcHNbaSAtIDFdLnByZWMpIHsKKyAgICAgIGlmIChtX0ltYWdlLT5jb21wc1tpXS5keCAhPSBtX0ltYWdlLT5jb21wc1tpIC0gMV0uZHggfHwKKyAgICAgICAgICBtX0ltYWdlLT5jb21wc1tpXS5keSAhPSBtX0ltYWdlLT5jb21wc1tpIC0gMV0uZHkgfHwKKyAgICAgICAgICBtX0ltYWdlLT5jb21wc1tpXS5wcmVjICE9IG1fSW1hZ2UtPmNvbXBzW2kgLSAxXS5wcmVjKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIH0KICAgICB9CiAgIH0KLSAgaW50IHdpZHRoID0gaW1hZ2UtPmNvbXBzWzBdLnc7Ci0gIGludCBoZWlnaHQgPSBpbWFnZS0+Y29tcHNbMF0uaDsKLSAgZm9yICh1aW50MzJfdCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGltYWdlLT5udW1jb21wczsgKytjaGFubmVsKSB7CisgIGludCB3aWR0aCA9IG1fSW1hZ2UtPmNvbXBzWzBdLnc7CisgIGludCBoZWlnaHQgPSBtX0ltYWdlLT5jb21wc1swXS5oOworICBmb3IgKHVpbnQzMl90IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgbV9JbWFnZS0+bnVtY29tcHM7ICsrY2hhbm5lbCkgewogICAgIHVpbnQ4X3QqIHBDaGFubmVsID0gY2hhbm5lbF9idWZzW2NoYW5uZWxdOwogICAgIGlmIChhZGp1c3RfY29tcHNbY2hhbm5lbF0gPCAwKSB7CiAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7ICsrcm93KSB7CiAgICAgICAgIHVpbnQ4X3QqIHBTY2FubGluZSA9IHBDaGFubmVsICsgcm93ICogcGl0Y2g7CiAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyArK2NvbCkgewotICAgICAgICAgIHVpbnQ4X3QqIHBQaXhlbCA9IHBTY2FubGluZSArIGNvbCAqIGltYWdlLT5udW1jb21wczsKLSAgICAgICAgICBpZiAoIWltYWdlLT5jb21wc1tjaGFubmVsXS5kYXRhKQorICAgICAgICAgIHVpbnQ4X3QqIHBQaXhlbCA9IHBTY2FubGluZSArIGNvbCAqIG1fSW1hZ2UtPm51bWNvbXBzOworICAgICAgICAgIGlmICghbV9JbWFnZS0+Y29tcHNbY2hhbm5lbF0uZGF0YSkKICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgICAgaW50IHNyYyA9IGltYWdlLT5jb21wc1tjaGFubmVsXS5kYXRhW3JvdyAqIHdpZHRoICsgY29sXTsKLSAgICAgICAgICBzcmMgKz0gaW1hZ2UtPmNvbXBzW2NoYW5uZWxdLnNnbmQKLSAgICAgICAgICAgICAgICAgICAgID8gMSA8PCAoaW1hZ2UtPmNvbXBzW2NoYW5uZWxdLnByZWMgLSAxKQorICAgICAgICAgIGludCBzcmMgPSBtX0ltYWdlLT5jb21wc1tjaGFubmVsXS5kYXRhW3JvdyAqIHdpZHRoICsgY29sXTsKKyAgICAgICAgICBzcmMgKz0gbV9JbWFnZS0+Y29tcHNbY2hhbm5lbF0uc2duZAorICAgICAgICAgICAgICAgICAgICAgPyAxIDw8IChtX0ltYWdlLT5jb21wc1tjaGFubmVsXS5wcmVjIC0gMSkKICAgICAgICAgICAgICAgICAgICAgIDogMDsKICAgICAgICAgICBpZiAoYWRqdXN0X2NvbXBzW2NoYW5uZWxdID4gMCkgewogICAgICAgICAgICAgKnBQaXhlbCA9IDA7CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpwUGl4ZWwgPSAodWludDhfdCkoc3JjIDw8IC1hZGp1c3RfY29tcHNbY2hhbm5lbF0pOworICAgICAgICAgICAgKnBQaXhlbCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyYyA8PCAtYWRqdXN0X2NvbXBzW2NoYW5uZWxdKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTg2MywyNSArNTg5LDIxIEBACiAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7ICsrcm93KSB7CiAgICAgICAgIHVpbnQ4X3QqIHBTY2FubGluZSA9IHBDaGFubmVsICsgcm93ICogcGl0Y2g7CiAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyArK2NvbCkgewotICAgICAgICAgIHVpbnQ4X3QqIHBQaXhlbCA9IHBTY2FubGluZSArIGNvbCAqIGltYWdlLT5udW1jb21wczsKLSAgICAgICAgICBpZiAoIWltYWdlLT5jb21wc1tjaGFubmVsXS5kYXRhKQorICAgICAgICAgIHVpbnQ4X3QqIHBQaXhlbCA9IHBTY2FubGluZSArIGNvbCAqIG1fSW1hZ2UtPm51bWNvbXBzOworICAgICAgICAgIGlmICghbV9JbWFnZS0+Y29tcHNbY2hhbm5lbF0uZGF0YSkKICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgICAgaW50IHNyYyA9IGltYWdlLT5jb21wc1tjaGFubmVsXS5kYXRhW3JvdyAqIHdpZHRoICsgY29sXTsKLSAgICAgICAgICBzcmMgKz0gaW1hZ2UtPmNvbXBzW2NoYW5uZWxdLnNnbmQKLSAgICAgICAgICAgICAgICAgICAgID8gMSA8PCAoaW1hZ2UtPmNvbXBzW2NoYW5uZWxdLnByZWMgLSAxKQorICAgICAgICAgIGludCBzcmMgPSBtX0ltYWdlLT5jb21wc1tjaGFubmVsXS5kYXRhW3JvdyAqIHdpZHRoICsgY29sXTsKKyAgICAgICAgICBzcmMgKz0gbV9JbWFnZS0+Y29tcHNbY2hhbm5lbF0uc2duZAorICAgICAgICAgICAgICAgICAgICAgPyAxIDw8IChtX0ltYWdlLT5jb21wc1tjaGFubmVsXS5wcmVjIC0gMSkKICAgICAgICAgICAgICAgICAgICAgIDogMDsKICAgICAgICAgICBpZiAoYWRqdXN0X2NvbXBzW2NoYW5uZWxdIC0gMSA8IDApIHsKLSAgICAgICAgICAgICpwUGl4ZWwgPSAodWludDhfdCkoKHNyYyA+PiBhZGp1c3RfY29tcHNbY2hhbm5lbF0pKTsKKyAgICAgICAgICAgICpwUGl4ZWwgPSBzdGF0aWNfY2FzdDx1aW50OF90Pigoc3JjID4+IGFkanVzdF9jb21wc1tjaGFubmVsXSkpOwogICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpbnQgdG1wUGl4ZWwgPSAoc3JjID4+IGFkanVzdF9jb21wc1tjaGFubmVsXSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzcmMgPj4gKGFkanVzdF9jb21wc1tjaGFubmVsXSAtIDEpKSAlIDIpOwotICAgICAgICAgICAgaWYgKHRtcFBpeGVsID4gMjU1KSB7Ci0gICAgICAgICAgICAgIHRtcFBpeGVsID0gMjU1OwotICAgICAgICAgICAgfSBlbHNlIGlmICh0bXBQaXhlbCA8IDApIHsKLSAgICAgICAgICAgICAgdG1wUGl4ZWwgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKnBQaXhlbCA9ICh1aW50OF90KXRtcFBpeGVsOworICAgICAgICAgICAgdG1wUGl4ZWwgPSBwZGZpdW06OmNsYW1wKHRtcFBpeGVsLCAwLCAyNTUpOworICAgICAgICAgICAgKnBQaXhlbCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHRtcFBpeGVsKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTg5MSwxMyArNjEzLDE1IEBACiB9CiAKIENDb2RlY19KcHhNb2R1bGU6OkNDb2RlY19KcHhNb2R1bGUoKSB7fQorCiBDQ29kZWNfSnB4TW9kdWxlOjp+Q0NvZGVjX0pweE1vZHVsZSgpIHt9CiAKLUNKUFhfRGVjb2RlciogQ0NvZGVjX0pweE1vZHVsZTo6Q3JlYXRlRGVjb2Rlcihjb25zdCB1aW50OF90KiBzcmNfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQ29sb3JTcGFjZSogY3MpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPENKUFhfRGVjb2Rlcj4gZGVjb2RlcihuZXcgQ0pQWF9EZWNvZGVyKGNzKSk7Ci0gIHJldHVybiBkZWNvZGVyLT5Jbml0KHNyY19idWYsIHNyY19zaXplKSA/IGRlY29kZXIucmVsZWFzZSgpIDogbnVsbHB0cjsKK3N0ZDo6dW5pcXVlX3B0cjxDSlBYX0RlY29kZXI+IENDb2RlY19KcHhNb2R1bGU6OkNyZWF0ZURlY29kZXIoCisgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKKyAgICB1aW50MzJfdCBzcmNfc2l6ZSwKKyAgICBDUERGX0NvbG9yU3BhY2UqIGNzKSB7CisgIGF1dG8gZGVjb2RlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSlBYX0RlY29kZXI+KGNzKTsKKyAgcmV0dXJuIGRlY29kZXItPkluaXQoc3JjX2J1Ziwgc3JjX3NpemUpID8gc3RkOjptb3ZlKGRlY29kZXIpIDogbnVsbHB0cjsKIH0KIAogdm9pZCBDQ29kZWNfSnB4TW9kdWxlOjpHZXRJbWFnZUluZm8oQ0pQWF9EZWNvZGVyKiBwRGVjb2RlciwKQEAgLTkxMyw3ICs2MzcsMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIG9mZnNldHMpIHsKICAgcmV0dXJuIHBEZWNvZGVyLT5EZWNvZGUoZGVzdF9kYXRhLCBwaXRjaCwgb2Zmc2V0cyk7CiB9Ci0KLXZvaWQgQ0NvZGVjX0pweE1vZHVsZTo6RGVzdHJveURlY29kZXIoQ0pQWF9EZWNvZGVyKiBwRGVjb2RlcikgewotICBkZWxldGUgcERlY29kZXI7Ci19CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfanB4X3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcHhfdW5pdHRlc3QuY3BwCmluZGV4IDNlZjE0ZTYuLjFiZDM2OGUgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcHhfdW5pdHRlc3QuY3BwCisrKyBiL2NvcmUvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19qcHhfdW5pdHRlc3QuY3BwCkBAIC03LDE0ICs3LDE0IEBACiAjaW5jbHVkZSA8bGltaXRzPgogCiAjaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2NvZGVjX2ludC5oIgotI2luY2x1ZGUgInRlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmgiCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2Z4X2NvZGVjLmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfbWFsbG9jLmgiCiAKIHN0YXRpYyBjb25zdCBPUEpfT0ZGX1Qga1NraXBFcnJvciA9IHN0YXRpY19jYXN0PE9QSl9PRkZfVD4oLTEpOwogc3RhdGljIGNvbnN0IE9QSl9TSVpFX1Qga1JlYWRFcnJvciA9IHN0YXRpY19jYXN0PE9QSl9TSVpFX1Q+KC0xKTsKLXN0YXRpYyBjb25zdCBPUEpfU0laRV9UIGtXcml0ZUVycm9yID0gc3RhdGljX2Nhc3Q8T1BKX1NJWkVfVD4oLTEpOwogCi1zdGF0aWMgdW5zaWduZWQgY2hhciBzdHJlYW1fZGF0YVtdID0geworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3RyZWFtX2RhdGFbXSA9IHsKICAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLAogICAgIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsICAvLyBJbmNsdWRlIHNvbWUgaGktYnl0ZXMsIHRvby4KIH07CkBAIC0yMywzOSArMjMsMzggQEAKICAgRmxvYXRfdChmbG9hdCBudW0gPSAwLjBmKSA6IGYobnVtKSB7fQogCiAgIGludDMyX3QgaTsKLSAgRlhfRkxPQVQgZjsKKyAgZmxvYXQgZjsKIH07CiAKIFRFU1QoZnhjb2RlYywgQ01ZS19Sb3VuZGluZykgewogICAvLyBUZXN0aW5nIGFsbCBmbG9hdHMgZnJvbSAwLjAgdG8gMS4wIHRha2VzIGFib3V0IDM1IHNlY29uZHMgaW4gcmVsZWFzZQogICAvLyBidWlsZHMgYW5kIG11Y2ggbG9uZ2VyIGluIGRlYnVnIGJ1aWxkcywgc28ganVzdCB0ZXN0IHRoZSBrbm93bi1kYW5nZXJvdXMKICAgLy8gcmFuZ2UuCi0gIGNvbnN0IEZYX0ZMT0FUIHN0YXJ0VmFsdWUgPSAwLjAwMWY7Ci0gIGNvbnN0IEZYX0ZMT0FUIGVuZFZhbHVlID0gMC4wMDNmOwotICBGWF9GTE9BVCBSID0gMC4wZiwgRyA9IDAuMGYsIEIgPSAwLjBmOworICBjb25zdCBmbG9hdCBzdGFydFZhbHVlID0gMC4wMDFmOworICBjb25zdCBmbG9hdCBlbmRWYWx1ZSA9IDAuMDAzZjsKKyAgZmxvYXQgUiA9IDAuMGYsIEcgPSAwLjBmLCBCID0gMC4wZjsKICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGZsb2F0cyBieSBpbmNyZW1lbnRpbmcgdGhlIHJlcHJlc2VudGF0aW9uLCBhcyBkaXNjdXNzZWQgaW4KICAgLy8gaHR0cHM6Ly9yYW5kb21hc2NpaS53b3JkcHJlc3MuY29tLzIwMTIvMDEvMjMvc3R1cGlkLWZsb2F0LXRyaWNrcy0yLwogICBmb3IgKEZsb2F0X3QgZiA9IHN0YXJ0VmFsdWU7IGYuZiA8IGVuZFZhbHVlOyBmLmkrKykgewotICAgIEFkb2JlQ01ZS190b19zUkdCKGYuZiwgZi5mLCBmLmYsIGYuZiwgUiwgRywgQik7CisgICAgc3RkOjp0aWUoUiwgRywgQikgPSBBZG9iZUNNWUtfdG9fc1JHQihmLmYsIGYuZiwgZi5mLCBmLmYpOwogICB9CiAgIC8vIENoZWNrIHZhcmlvdXMgb3RoZXIgJ3NwZWNpYWwnIG51bWJlcnMuCi0gIEFkb2JlQ01ZS190b19zUkdCKDAuMGYsIDAuMjVmLCAwLjVmLCAxLjBmLCBSLCBHLCBCKTsKKyAgc3RkOjp0aWUoUiwgRywgQikgPSBBZG9iZUNNWUtfdG9fc1JHQigwLjBmLCAwLjI1ZiwgMC41ZiwgMS4wZik7CiB9CiAKIFRFU1QoZnhjb2RlYywgRGVjb2RlRGF0YU51bGxEZWNvZGVEYXRhKSB7Ci0gIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzE2XTsKKyAgdWludDhfdCBidWZmZXJbMTZdOwogICBEZWNvZGVEYXRhKiBwdHIgPSBudWxscHRyOwogCiAgIC8vIEVycm9yIGNvZGVzLCBub3Qgc2VndnMsIHNob3VsZCBjYWxsZXJzIHBhc3MgdXMgYSBudWxscHRyIHBvaW50ZXIuCiAgIEVYUEVDVF9FUShrUmVhZEVycm9yLCBvcGpfcmVhZF9mcm9tX21lbW9yeShidWZmZXIsIHNpemVvZihidWZmZXIpLCBwdHIpKTsKLSAgRVhQRUNUX0VRKGtXcml0ZUVycm9yLCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgcHRyKSk7CiAgIEVYUEVDVF9FUShrU2tpcEVycm9yLCBvcGpfc2tpcF9mcm9tX21lbW9yeSgxLCBwdHIpKTsKICAgRVhQRUNUX0ZBTFNFKG9wal9zZWVrX2Zyb21fbWVtb3J5KDEsIHB0cikpOwogfQogCiBURVNUKGZ4Y29kZWMsIERlY29kZURhdGFOdWxsU3RyZWFtKSB7CiAgIERlY29kZURhdGEgZGQobnVsbHB0ciwgMCk7Ci0gIHVuc2lnbmVkIGNoYXIgYnVmZmVyWzE2XTsKKyAgdWludDhfdCBidWZmZXJbMTZdOwogCiAgIC8vIFJlYWRzIG9mIHNpemUgMCBkbyBub3RoaW5nIGJ1dCByZXR1cm4gYW4gZXJyb3IgY29kZS4KICAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOwpAQCAtNjcsMTIgKzY2LDYgQEAKICAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICZkZCkpOwogICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKIAotICAvLyB3cml0ZXMgb2Ygc2l6ZSAwIGRvIG5vdGhpbmcgYnV0IHJldHVybiBhbiBlcnJvciBjb2RlLgotICBFWFBFQ1RfRVEoa1dyaXRlRXJyb3IsIG9wal93cml0ZV9mcm9tX21lbW9yeShidWZmZXIsIDAsICZkZCkpOwotCi0gIC8vIHdyaXRlcyBvZiBub256ZXJvIHNpemUgZG8gbm90aGluZyBidXQgcmV0dXJuIGFuIGVycm9yIGNvZGUuCi0gIEVYUEVDVF9FUShrV3JpdGVFcnJvciwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICZkZCkpOwotCiAgIC8vIFNraXBzIG9mIHNpemUgMCBhbHdheXMgcmV0dXJuIGFuIGVycm9yIGNvZGUuCiAgIEVYUEVDVF9FUShrU2tpcEVycm9yLCBvcGpfc2tpcF9mcm9tX21lbW9yeSgwLCAmZGQpKTsKIApAQCAtODgsNyArODEsNyBAQAogCiBURVNUKGZ4Y29kZWMsIERlY29kZURhdGFaZXJvU2l6ZSkgewogICBEZWNvZGVEYXRhIGRkKHN0cmVhbV9kYXRhLCAwKTsKLSAgdW5zaWduZWQgY2hhciBidWZmZXJbMTZdOworICB1aW50OF90IGJ1ZmZlclsxNl07CiAKICAgLy8gUmVhZHMgb2Ygc2l6ZSAwIGRvIG5vdGhpbmcgYnV0IHJldHVybiBhbiBlcnJvciBjb2RlLgogICBtZW1zZXQoYnVmZmVyLCAweGJkLCBzaXplb2YoYnVmZmVyKSk7CkBAIC0xMDAsMTIgKzkzLDYgQEAKICAgRVhQRUNUX0VRKGtSZWFkRXJyb3IsIG9wal9yZWFkX2Zyb21fbWVtb3J5KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICZkZCkpOwogICBFWFBFQ1RfRVEoMHhiZCwgYnVmZmVyWzBdKTsKIAotICAvLyB3cml0ZXMgb2Ygc2l6ZSAwIGRvIG5vdGhpbmcgYnV0IHJldHVybiBhbiBlcnJvciBjb2RlLgotICBFWFBFQ1RfRVEoa1dyaXRlRXJyb3IsIG9wal93cml0ZV9mcm9tX21lbW9yeShidWZmZXIsIDAsICZkZCkpOwotCi0gIC8vIHdyaXRlcyBvZiBub256ZXJvIHNpemUgZG8gbm90aGluZyBidXQgcmV0dXJuIGFuIGVycm9yIGNvZGUuCi0gIEVYUEVDVF9FUShrV3JpdGVFcnJvciwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICZkZCkpOwotCiAgIC8vIFNraXBzIG9mIHNpemUgMCBhbHdheXMgcmV0dXJuIGFuIGVycm9yIGNvZGUuCiAgIEVYUEVDVF9FUShrU2tpcEVycm9yLCBvcGpfc2tpcF9mcm9tX21lbW9yeSgwLCAmZGQpKTsKIApAQCAtMTIwLDcgKzEwNyw3IEBACiB9CiAKIFRFU1QoZnhjb2RlYywgRGVjb2RlRGF0YVJlYWRJbkJvdW5kcykgewotICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxNl07CisgIHVpbnQ4X3QgYnVmZmVyWzE2XTsKICAgewogICAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOwogCkBAIC0xNzEsNyArMTU4LDcgQEAKIH0KIAogVEVTVChmeGNvZGVjLCBEZWNvZGVEYXRhUmVhZEJleW9uZEJvdW5kcykgewotICB1bnNpZ25lZCBjaGFyIGJ1ZmZlclsxNl07CisgIHVpbnQ4X3QgYnVmZmVyWzE2XTsKICAgewogICAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOwogCkBAIC0yMzQsODYgKzIyMSwxMCBAQAogICB9CiB9CiAKLVRFU1QoZnhjb2RlYywgRGVjb2RlRGF0YVdyaXRlSW5Cb3VuZHMpIHsKLSAgdW5zaWduZWQgY2hhciBzdHJlYW1bMTZdOwotICBzdGF0aWMgdW5zaWduZWQgY2hhciBidWZmZXJfZGF0YVtdID0gewotICAgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHg4MCwgMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwKLSAgfTsKLSAgewotICAgIC8vIFByZXRlbmQgdGhlIHN0cmVhbSBjYW4gb25seSBob2xkIDQgYnl0ZXMuCi0gICAgRGVjb2RlRGF0YSBkZChzdHJlYW0sIDQpOwotCi0gICAgbWVtc2V0KHN0cmVhbSwgMHhiZCwgc2l6ZW9mKHN0cmVhbSkpOwotICAgIEVYUEVDVF9FUSg0dSwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlcl9kYXRhLCA0LCAmZGQpKTsKLSAgICBFWFBFQ1RfRVEoMHgwMCwgc3RyZWFtWzBdKTsKLSAgICBFWFBFQ1RfRVEoMHgwMSwgc3RyZWFtWzFdKTsKLSAgICBFWFBFQ1RfRVEoMHgwMiwgc3RyZWFtWzJdKTsKLSAgICBFWFBFQ1RfRVEoMHgwMywgc3RyZWFtWzNdKTsKLSAgICBFWFBFQ1RfRVEoMHhiZCwgc3RyZWFtWzRdKTsKLSAgfQotICB7Ci0gICAgLy8gUHJldGVuZCB0aGUgc3RyZWFtIGNhbiBvbmx5IGhvbGQgNCBieXRlcy4KLSAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbSwgNCk7Ci0KLSAgICBtZW1zZXQoc3RyZWFtLCAweGJkLCBzaXplb2Yoc3RyZWFtKSk7Ci0gICAgRVhQRUNUX0VRKDJ1LCBvcGpfd3JpdGVfZnJvbV9tZW1vcnkoYnVmZmVyX2RhdGEsIDIsICZkZCkpOwotICAgIEVYUEVDVF9FUSgydSwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlcl9kYXRhLCAyLCAmZGQpKTsKLSAgICBFWFBFQ1RfRVEoMHgwMCwgc3RyZWFtWzBdKTsKLSAgICBFWFBFQ1RfRVEoMHgwMSwgc3RyZWFtWzFdKTsKLSAgICBFWFBFQ1RfRVEoMHgwMCwgc3RyZWFtWzJdKTsKLSAgICBFWFBFQ1RfRVEoMHgwMSwgc3RyZWFtWzNdKTsKLSAgICBFWFBFQ1RfRVEoMHhiZCwgc3RyZWFtWzRdKTsKLSAgfQotfQotCi1URVNUKGZ4Y29kZWMsIERlY29kZURhdGFXcml0ZUJleW9uZEJvdW5kcykgewotICB1bnNpZ25lZCBjaGFyIHN0cmVhbVsxNl07Ci0gIHN0YXRpYyB1bnNpZ25lZCBjaGFyIGJ1ZmZlcl9kYXRhW10gPSB7Ci0gICAgICAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LAotICB9OwotICB7Ci0gICAgLy8gUHJldGVuZCB0aGUgc3RyZWFtIGNhbiBvbmx5IGhvbGQgNCBieXRlcy4KLSAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbSwgNCk7Ci0KLSAgICAvLyBXcml0ZSBlbmRpbmcgcGFzdCBFT0YgdHJhbnNmZXJzIHVwIHRpbCBFT0YuCi0gICAgbWVtc2V0KHN0cmVhbSwgMHhiZCwgc2l6ZW9mKHN0cmVhbSkpOwotICAgIEVYUEVDVF9FUSg0dSwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlcl9kYXRhLCA1LCAmZGQpKTsKLSAgICBFWFBFQ1RfRVEoMHgxMCwgc3RyZWFtWzBdKTsKLSAgICBFWFBFQ1RfRVEoMHgxMSwgc3RyZWFtWzFdKTsKLSAgICBFWFBFQ1RfRVEoMHgxMiwgc3RyZWFtWzJdKTsKLSAgICBFWFBFQ1RfRVEoMHgxMywgc3RyZWFtWzNdKTsKLSAgICBFWFBFQ1RfRVEoMHhiZCwgc3RyZWFtWzRdKTsKLQotICAgIC8vIFN1YnNlcXVlbnQgd3JpdGVzIGZhaWwuCi0gICAgbWVtc2V0KHN0cmVhbSwgMHhiZCwgc2l6ZW9mKHN0cmVhbSkpOwotICAgIEVYUEVDVF9FUShrV3JpdGVFcnJvciwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlcl9kYXRhLCA1LCAmZGQpKTsKLSAgICBFWFBFQ1RfRVEoMHhiZCwgc3RyZWFtWzBdKTsKLSAgfQotICB7Ci0gICAgLy8gUHJldGVuZCB0aGUgc3RyZWFtIGNhbiBvbmx5IGhvbGQgNCBieXRlcy4KLSAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbSwgNCk7Ci0KLSAgICAvLyBXcml0ZSBlbmRpbmcgcGFzdCBFT0YgKHR3byBzdGVwcykgdHJhbnNmZXJzIHVwIHRpbCBFT0YuCi0gICAgbWVtc2V0KHN0cmVhbSwgMHhiZCwgc2l6ZW9mKHN0cmVhbSkpOwotICAgIEVYUEVDVF9FUSgydSwgb3BqX3dyaXRlX2Zyb21fbWVtb3J5KGJ1ZmZlcl9kYXRhLCAyLCAmZGQpKTsKLSAgICBFWFBFQ1RfRVEoMnUsIG9wal93cml0ZV9mcm9tX21lbW9yeShidWZmZXJfZGF0YSwgNCwgJmRkKSk7Ci0gICAgRVhQRUNUX0VRKDB4MTAsIHN0cmVhbVswXSk7Ci0gICAgRVhQRUNUX0VRKDB4MTEsIHN0cmVhbVsxXSk7Ci0gICAgRVhQRUNUX0VRKDB4MTAsIHN0cmVhbVsyXSk7Ci0gICAgRVhQRUNUX0VRKDB4MTEsIHN0cmVhbVszXSk7Ci0gICAgRVhQRUNUX0VRKDB4YmQsIHN0cmVhbVs0XSk7Ci0KLSAgICAvLyBTdWJzZXF1ZW50IHdyaXRlcyBmYWlsLgotICAgIG1lbXNldChzdHJlYW0sIDB4YmQsIHNpemVvZihzdHJlYW0pKTsKLSAgICBFWFBFQ1RfRVEoa1dyaXRlRXJyb3IsIG9wal93cml0ZV9mcm9tX21lbW9yeShidWZmZXJfZGF0YSwgNSwgJmRkKSk7Ci0gICAgRVhQRUNUX0VRKDB4YmQsIHN0cmVhbVswXSk7Ci0gIH0KLX0KLQogLy8gTm90ZTogU29tZSBjYXJlIG5lZWRzIHRvIGJlIHRha2VuIGhlcmUgYmVjYXVzZSB0aGUgc2tpcC9zZWVrIGZ1bmN0aW9ucwogLy8gdGFrZSBPUEpfT0ZGX1QncyBhcyBhcmd1bWVudHMsIHdoaWNoIGFyZSB0eXBpY2FsbHkgYSBzaWduZWQgdHlwZS4KIFRFU1QoZnhjb2RlYywgRGVjb2RlRGF0YVNraXApIHsKLSAgdW5zaWduZWQgY2hhciBidWZmZXJbMTZdOworICB1aW50OF90IGJ1ZmZlclsxNl07CiAgIHsKICAgICBEZWNvZGVEYXRhIGRkKHN0cmVhbV9kYXRhLCBzaXplb2Yoc3RyZWFtX2RhdGEpKTsKIApAQCAtNDMwLDcgKzM0MSw3IEBACiB9CiAKIFRFU1QoZnhjb2RlYywgRGVjb2RlRGF0YVNlZWspIHsKLSAgdW5zaWduZWQgY2hhciBidWZmZXJbMTZdOworICB1aW50OF90IGJ1ZmZlclsxNl07CiAgIERlY29kZURhdGEgZGQoc3RyZWFtX2RhdGEsIHNpemVvZihzdHJlYW1fZGF0YSkpOwogCiAgIC8vIFNlZWtpbmcgd2l0aGluIGJ1ZmZlciBpcyBhbGxvd2VkIGFuZCByZWFkIHN1Y2NlZWRzCkBAIC01MjYsMTEgKzQzNywxNCBAQAogICAgIHkuaCA9IHkudzsKICAgICBpbWcueDEgPSB5Lnc7CiAgICAgaW1nLnkxID0geS5oOwotICAgIHkuZGF0YSA9IEZYX0FsbG9jKE9QSl9JTlQzMiwgeS53ICogeS5oKTsKKyAgICB5LmRhdGEgPSBzdGF0aWNfY2FzdDxPUEpfSU5UMzIqPigKKyAgICAgICAgb3BqX2ltYWdlX2RhdGFfYWxsb2MoeS53ICogeS5oICogc2l6ZW9mKE9QSl9JTlQzMikpKTsKKyAgICB2LmRhdGEgPSBzdGF0aWNfY2FzdDxPUEpfSU5UMzIqPigKKyAgICAgICAgb3BqX2ltYWdlX2RhdGFfYWxsb2Modi53ICogdi5oICogc2l6ZW9mKE9QSl9JTlQzMikpKTsKKyAgICB1LmRhdGEgPSBzdGF0aWNfY2FzdDxPUEpfSU5UMzIqPigKKyAgICAgICAgb3BqX2ltYWdlX2RhdGFfYWxsb2ModS53ICogdS5oICogc2l6ZW9mKE9QSl9JTlQzMikpKTsKICAgICBtZW1zZXQoeS5kYXRhLCAxLCB5LncgKiB5LmggKiBzaXplb2YoT1BKX0lOVDMyKSk7Ci0gICAgdS5kYXRhID0gRlhfQWxsb2MoT1BKX0lOVDMyLCB1LncgKiB1LmgpOwogICAgIG1lbXNldCh1LmRhdGEsIDAsIHUudyAqIHUuaCAqIHNpemVvZihPUEpfSU5UMzIpKTsKLSAgICB2LmRhdGEgPSBGWF9BbGxvYyhPUEpfSU5UMzIsIHYudyAqIHYuaCk7CiAgICAgbWVtc2V0KHYuZGF0YSwgMCwgdi53ICogdi5oICogc2l6ZW9mKE9QSl9JTlQzMikpOwogICAgIGltZy5jb21wc1swXSA9IHk7CiAgICAgaW1nLmNvbXBzWzFdID0gdTsKQEAgLTU0Nyw5ICs0NjEsOSBAQAogICAgICAgRVhQRUNUX05FKGltZy5jb21wc1swXS53LCBpbWcuY29tcHNbMl0udyk7CiAgICAgICBFWFBFQ1RfTkUoaW1nLmNvbXBzWzBdLmgsIGltZy5jb21wc1syXS5oKTsKICAgICB9Ci0gICAgRlhfRnJlZShpbWcuY29tcHNbMF0uZGF0YSk7Ci0gICAgRlhfRnJlZShpbWcuY29tcHNbMV0uZGF0YSk7Ci0gICAgRlhfRnJlZShpbWcuY29tcHNbMl0uZGF0YSk7CisgICAgb3BqX2ltYWdlX2RhdGFfZnJlZShpbWcuY29tcHNbMF0uZGF0YSk7CisgICAgb3BqX2ltYWdlX2RhdGFfZnJlZShpbWcuY29tcHNbMV0uZGF0YSk7CisgICAgb3BqX2ltYWdlX2RhdGFfZnJlZShpbWcuY29tcHNbMl0uZGF0YSk7CiAgIH0KICAgRlhfRnJlZShpbWcuY29tcHMpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3Byb2dyZXNzLmNwcCBiL2NvcmUvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19wcm9ncmVzcy5jcHAKaW5kZXggMWYyZjUwYy4uZWIwZWNjOSAxMDA2NDQKLS0tIGEvY29yZS9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3Byb2dyZXNzLmNwcAorKysgYi9jb3JlL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfcHJvZ3Jlc3MuY3BwCkBAIC04LDkgKzgsMTQgQEAKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvZnhfY29kZWMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmVhbS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2RpYml0bWFwLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9tYXRoLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogCkBAIC0xOCwxMSArMjMsMTEgQEAKIAogbmFtZXNwYWNlIHsKIAotI2lmIF9GWF9PU18gPT0gX0ZYX01BQ09TWF8gfHwgX0ZYX09TXyA9PSBfRlhfSU9TXworI2lmIF9GWF9PU18gPT0gX0ZYX09TX01BQ09TWF8KIGNvbnN0IGRvdWJsZSBrUG5nR2FtbWEgPSAxLjc7Ci0jZWxzZSAgLy8gX0ZYX09TXyA9PSBfRlhfTUFDT1NYXyB8fCBfRlhfT1NfID09IF9GWF9JT1NfCisjZWxzZSAgIC8vIF9GWF9PU18gPT0gX0ZYX09TX01BQ09TWF8KIGNvbnN0IGRvdWJsZSBrUG5nR2FtbWEgPSAyLjI7Ci0jZW5kaWYgIC8vIF9GWF9PU18gPT0gX0ZYX01BQ09TWF8gfHwgX0ZYX09TXyA9PSBfRlhfSU9TXworI2VuZGlmICAvLyBfRlhfT1NfID09IF9GWF9PU19NQUNPU1hfCiAKIHZvaWQgUkdCMkJHUih1aW50OF90KiBidWZmZXIsIGludCB3aWR0aCA9IDEpIHsKICAgaWYgKGJ1ZmZlciAmJiB3aWR0aCA+IDApIHsKQEAgLTQ4LDQ2ICs1MywzNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9tYXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX21pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19tYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkludGVycG9sKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbWF4KSB7CiAgIGRvdWJsZSBzY2FsZSwgYmFzZTsKLSAgc2NhbGUgPSAoRlhfRkxPQVQpc3JjX2xlbiAvIChGWF9GTE9BVClkZXN0X2xlbjsKKyAgc2NhbGUgPSAoZmxvYXQpc3JjX2xlbiAvIChmbG9hdClkZXN0X2xlbjsKICAgaWYgKGRlc3RfbGVuIDwgMCkgewotICAgIGJhc2UgPSAoRlhfRkxPQVQpKHNyY19sZW4pOworICAgIGJhc2UgPSAoZmxvYXQpKHNyY19sZW4pOwogICB9IGVsc2UgewogICAgIGJhc2UgPSAwLjBmOwogICB9CiAgIG1fSXRlbVNpemUgPQotICAgICAgKGludCkoc2l6ZW9mKGludCkgKiAyICsKLSAgICAgICAgICAgIHNpemVvZihpbnQpICogKEZYU1lTX2NlaWwoRlhTWVNfZmFicygoRlhfRkxPQVQpc2NhbGUpKSArIDEpKTsKKyAgICAgIChpbnQpKHNpemVvZihpbnQpICogMiArIHNpemVvZihpbnQpICogKGNlaWwoZmFicygoZmxvYXQpc2NhbGUpKSArIDEpKTsKICAgbV9EZXN0TWluID0gZGVzdF9taW47CiAgIG1fcFdlaWdodFRhYmxlcy5yZXNpemUoKGRlc3RfbWF4IC0gZGVzdF9taW4pICogbV9JdGVtU2l6ZSArIDQpOwotICBpZiAoRlhTWVNfZmFicygoRlhfRkxPQVQpc2NhbGUpIDwgMS4wZikgeworICBpZiAoZmFicygoZmxvYXQpc2NhbGUpIDwgMS4wZikgewogICAgIGZvciAoaW50IGRlc3RfcGl4ZWwgPSBkZXN0X21pbjsgZGVzdF9waXhlbCA8IGRlc3RfbWF4OyBkZXN0X3BpeGVsKyspIHsKICAgICAgIFBpeGVsV2VpZ2h0JiBwaXhlbF93ZWlnaHRzID0gKkdldFBpeGVsV2VpZ2h0KGRlc3RfcGl4ZWwpOwogICAgICAgZG91YmxlIHNyY19wb3MgPSBkZXN0X3BpeGVsICogc2NhbGUgKyBzY2FsZSAvIDIgKyBiYXNlOwotICAgICAgaWYgKGJJbnRlcnBvbCkgewotICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPQotICAgICAgICAgICAgKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX3BvcyAtIDEuMGYgLyAyKTsKLSAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19wb3MgKyAxLjBmIC8gMik7Ci0gICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPCBzcmNfbWluKSB7Ci0gICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3JjX21pbjsKLSAgICAgICAgfQotICAgICAgICBpZiAocGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA+PSBzcmNfbWF4KSB7Ci0gICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IHNyY19tYXggLSAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCkgewotICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gNjU1MzY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV0gPSBGWFNZU19yb3VuZCgKLSAgICAgICAgICAgICAgKEZYX0ZMT0FUKShzcmNfcG9zIC0gcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0IC0gMS4wZiAvIDIpICoKLSAgICAgICAgICAgICAgNjU1MzYpOwotICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gNjU1MzYgLSBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1sxXTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9Ci0gICAgICAgICAgICAoaW50KUZYU1lTX2Zsb29yKChGWF9GTE9BVClzcmNfcG9zKTsKKyAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IChpbnQpZmxvb3IoKGZsb2F0KXNyY19wb3MgLSAxLjBmIC8gMik7CisgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gKGludClmbG9vcigoZmxvYXQpc3JjX3BvcyArIDEuMGYgLyAyKTsKKyAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPCBzcmNfbWluKSB7CisgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IHNyY19taW47CisgICAgICB9CisgICAgICBpZiAocGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA+PSBzcmNfbWF4KSB7CisgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBzcmNfbWF4IC0gMTsKKyAgICAgIH0KKyAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCkgewogICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IDY1NTM2OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV0gPSBGWFNZU19yb3VuZCgKKyAgICAgICAgICAgIChmbG9hdCkoc3JjX3BvcyAtIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCAtIDEuMGYgLyAyKSAqIDY1NTM2KTsKKyAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMF0gPSA2NTUzNiAtIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzFdOwogICAgICAgfQogICAgIH0KICAgICByZXR1cm47CkBAIC05OCwxMSArOTMsMTEgQEAKICAgICBkb3VibGUgc3JjX2VuZCA9IHNyY19zdGFydCArIHNjYWxlOwogICAgIGludCBzdGFydF9pLCBlbmRfaTsKICAgICBpZiAoc3JjX3N0YXJ0IDwgc3JjX2VuZCkgewotICAgICAgc3RhcnRfaSA9IChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19zdGFydCk7Ci0gICAgICBlbmRfaSA9IChpbnQpRlhTWVNfY2VpbCgoRlhfRkxPQVQpc3JjX2VuZCk7CisgICAgICBzdGFydF9pID0gKGludClmbG9vcigoZmxvYXQpc3JjX3N0YXJ0KTsKKyAgICAgIGVuZF9pID0gKGludCljZWlsKChmbG9hdClzcmNfZW5kKTsKICAgICB9IGVsc2UgewotICAgICAgc3RhcnRfaSA9IChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19lbmQpOwotICAgICAgZW5kX2kgPSAoaW50KUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXNyY19zdGFydCk7CisgICAgICBzdGFydF9pID0gKGludClmbG9vcigoZmxvYXQpc3JjX2VuZCk7CisgICAgICBlbmRfaSA9IChpbnQpY2VpbCgoZmxvYXQpc3JjX3N0YXJ0KTsKICAgICB9CiAgICAgaWYgKHN0YXJ0X2kgPCBzcmNfbWluKSB7CiAgICAgICBzdGFydF9pID0gc3JjX21pbjsKQEAgLTExOCwxOCArMTEzLDE3IEBACiAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3RhcnRfaTsKICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gZW5kX2k7CiAgICAgZm9yIChpbnQgaiA9IHN0YXJ0X2k7IGogPD0gZW5kX2k7IGorKykgewotICAgICAgZG91YmxlIGRlc3Rfc3RhcnQgPSAoKEZYX0ZMT0FUKWogLSBiYXNlKSAvIHNjYWxlOwotICAgICAgZG91YmxlIGRlc3RfZW5kID0gKChGWF9GTE9BVCkoaiArIDEpIC0gYmFzZSkgLyBzY2FsZTsKKyAgICAgIGRvdWJsZSBkZXN0X3N0YXJ0ID0gKChmbG9hdClqIC0gYmFzZSkgLyBzY2FsZTsKKyAgICAgIGRvdWJsZSBkZXN0X2VuZCA9ICgoZmxvYXQpKGogKyAxKSAtIGJhc2UpIC8gc2NhbGU7CiAgICAgICBpZiAoZGVzdF9zdGFydCA+IGRlc3RfZW5kKSB7CiAgICAgICAgIGRvdWJsZSB0ZW1wID0gZGVzdF9zdGFydDsKICAgICAgICAgZGVzdF9zdGFydCA9IGRlc3RfZW5kOwogICAgICAgICBkZXN0X2VuZCA9IHRlbXA7CiAgICAgICB9Ci0gICAgICBkb3VibGUgYXJlYV9zdGFydCA9IGRlc3Rfc3RhcnQgPiAoRlhfRkxPQVQpKGRlc3RfcGl4ZWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRlc3Rfc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKEZYX0ZMT0FUKShkZXN0X3BpeGVsKTsKLSAgICAgIGRvdWJsZSBhcmVhX2VuZCA9IGRlc3RfZW5kID4gKEZYX0ZMT0FUKShkZXN0X3BpeGVsICsgMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChGWF9GTE9BVCkoZGVzdF9waXhlbCArIDEpCisgICAgICBkb3VibGUgYXJlYV9zdGFydCA9CisgICAgICAgICAgZGVzdF9zdGFydCA+IChmbG9hdCkoZGVzdF9waXhlbCkgPyBkZXN0X3N0YXJ0IDogKGZsb2F0KShkZXN0X3BpeGVsKTsKKyAgICAgIGRvdWJsZSBhcmVhX2VuZCA9IGRlc3RfZW5kID4gKGZsb2F0KShkZXN0X3BpeGVsICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChmbG9hdCkoZGVzdF9waXhlbCArIDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkZXN0X2VuZDsKICAgICAgIGRvdWJsZSB3ZWlnaHQgPSBhcmVhX3N0YXJ0ID49IGFyZWFfZW5kID8gMC4wZiA6IGFyZWFfZW5kIC0gYXJlYV9zdGFydDsKICAgICAgIGlmICh3ZWlnaHQgPT0gMCAmJiBqID09IGVuZF9pKSB7CkBAIC0xMzcsNyArMTMxLDcgQEAKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1tqIC0gc3RhcnRfaV0gPQotICAgICAgICAgIEZYU1lTX3JvdW5kKChGWF9GTE9BVCkod2VpZ2h0ICogNjU1MzYpKTsKKyAgICAgICAgICBGWFNZU19yb3VuZCgoZmxvYXQpKHdlaWdodCAqIDY1NTM2KSk7CiAgICAgfQogICB9CiB9CkBAIC0xNDcsOCArMTQxLDcgQEAKIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkNGWENPREVDX0hvcnpUYWJsZTo6fkNGWENPREVDX0hvcnpUYWJsZSgpIHt9CiAKIHZvaWQgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6Q0ZYQ09ERUNfSG9yelRhYmxlOjpDYWxjKGludCBkZXN0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSW50ZXJwb2wpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVuKSB7CiAgIGRvdWJsZSBzY2FsZSA9IChkb3VibGUpZGVzdF9sZW4gLyAoZG91YmxlKXNyY19sZW47CiAgIG1fSXRlbVNpemUgPSBzaXplb2YoaW50KSAqIDQ7CiAgIGludCBzaXplID0gZGVzdF9sZW4gKiBtX0l0ZW1TaXplICsgNDsKQEAgLTE1Nyw3ICsxNTAsNyBAQAogICAgIGludCBwcmVfZGVzX2NvbCA9IDA7CiAgICAgZm9yIChpbnQgc3JjX2NvbCA9IDA7IHNyY19jb2wgPCBzcmNfbGVuOyBzcmNfY29sKyspIHsKICAgICAgIGRvdWJsZSBkZXNfY29sX2YgPSBzcmNfY29sICogc2NhbGU7Ci0gICAgICBpbnQgZGVzX2NvbCA9IEZYU1lTX3JvdW5kKChGWF9GTE9BVClkZXNfY29sX2YpOworICAgICAgaW50IGRlc19jb2wgPSBGWFNZU19yb3VuZCgoZmxvYXQpZGVzX2NvbF9mKTsKICAgICAgIFBpeGVsV2VpZ2h0KiBwV2VpZ2h0ID0gR2V0UGl4ZWxXZWlnaHQoZGVzX2NvbCk7CiAgICAgICBwV2VpZ2h0LT5tX1NyY1N0YXJ0ID0gcFdlaWdodC0+bV9TcmNFbmQgPSBzcmNfY29sOwogICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzBdID0gNjU1MzY7CkBAIC0xNzksMTAgKzE3Miw4IEBACiAgICAgICAgIHBXZWlnaHQtPm1fU3JjU3RhcnQgPSBzcmNfY29sIC0gMTsKICAgICAgICAgcFdlaWdodC0+bV9TcmNFbmQgPSBzcmNfY29sOwogICAgICAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gPQotICAgICAgICAgICAgYkludGVycG9sID8gRlhTWVNfcm91bmQoKEZYX0ZMT0FUKSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEZYX0ZMT0FUKWRlc19jb2wgLSAoRlhfRkxPQVQpZGVzX2NvbF9pbmRleCkgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClkZXNfY29sX2xlbiAqIDY1NTM2KSkKLSAgICAgICAgICAgICAgICAgICAgICA6IDY1NTM2OworICAgICAgICAgICAgRlhTWVNfcm91bmQoKGZsb2F0KSgoKGZsb2F0KWRlc19jb2wgLSAoZmxvYXQpZGVzX2NvbF9pbmRleCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpZGVzX2NvbF9sZW4gKiA2NTUzNikpOwogICAgICAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gPSA2NTUzNiAtIHBXZWlnaHQtPm1fV2VpZ2h0c1swXTsKICAgICAgIH0KICAgICAgIHByZV9kZXNfY29sID0gZGVzX2NvbDsKQEAgLTE5MSw3ICsxODIsNyBAQAogICB9CiAgIGZvciAoaW50IGRlc19jb2wgPSAwOyBkZXNfY29sIDwgZGVzdF9sZW47IGRlc19jb2wrKykgewogICAgIGRvdWJsZSBzcmNfY29sX2YgPSBkZXNfY29sIC8gc2NhbGU7Ci0gICAgaW50IHNyY19jb2wgPSBGWFNZU19yb3VuZCgoRlhfRkxPQVQpc3JjX2NvbF9mKTsKKyAgICBpbnQgc3JjX2NvbCA9IEZYU1lTX3JvdW5kKChmbG9hdClzcmNfY29sX2YpOwogICAgIFBpeGVsV2VpZ2h0KiBwV2VpZ2h0ID0gR2V0UGl4ZWxXZWlnaHQoZGVzX2NvbCk7CiAgICAgcFdlaWdodC0+bV9TcmNTdGFydCA9IHBXZWlnaHQtPm1fU3JjRW5kID0gc3JjX2NvbDsKICAgICBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gPSA2NTUzNjsKQEAgLTI0OSw4ICsyNDAsOCBAQAogICAgICAgUGl4ZWxXZWlnaHQqIHBXZWlnaHQgPSBHZXRQaXhlbFdlaWdodChkZXNfcm93KTsKICAgICAgIHBXZWlnaHQtPm1fU3JjU3RhcnQgPSBzdGFydF9zdGVwOwogICAgICAgcFdlaWdodC0+bV9TcmNFbmQgPSBlbmRfc3RlcDsKLSAgICAgIHBXZWlnaHQtPm1fV2VpZ2h0c1swXSA9IEZYU1lTX3JvdW5kKChGWF9GTE9BVCkoZW5kX3N0ZXAgLSBkZXNfcm93KSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpbGVuZ3RoICogNjU1MzYpOworICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzBdID0KKyAgICAgICAgICBGWFNZU19yb3VuZCgoZmxvYXQpKGVuZF9zdGVwIC0gZGVzX3JvdykgLyAoZmxvYXQpbGVuZ3RoICogNjU1MzYpOwogICAgICAgcFdlaWdodC0+bV9XZWlnaHRzWzFdID0gNjU1MzYgLSBwV2VpZ2h0LT5tX1dlaWdodHNbMF07CiAgICAgfQogICB9CkBAIC0yNjEsNyArMjUyLDYgQEAKICAgbV9wRmlsZSA9IG51bGxwdHI7CiAgIG1fcEpwZWdDb250ZXh0ID0gbnVsbHB0cjsKICAgbV9wUG5nQ29udGV4dCA9IG51bGxwdHI7Ci0gIG1fcEdpZkNvbnRleHQgPSBudWxscHRyOwogICBtX3BCbXBDb250ZXh0ID0gbnVsbHB0cjsKICAgbV9wVGlmZkNvbnRleHQgPSBudWxscHRyOwogICBtX3BDb2RlY01nciA9IG51bGxwdHI7CkBAIC0yODQsNyArMjc0LDYgQEAKICAgbV9UcmFuc01ldGhvZCA9IC0xOwogICBtX1NyY1JvdyA9IDA7CiAgIG1fU3JjRm9ybWF0ID0gRlhDb2RlY19JbnZhbGlkOwotICBtX2JJbnRlcnBvbCA9IHRydWU7CiAgIG1fRnJhbWVOdW1iZXIgPSAwOwogICBtX0ZyYW1lQ3VyID0gMDsKICAgbV9TcmNQYWxldHRlTnVtYmVyID0gMDsKQEAgLTI5NywxNyArMjg2LDYgQEAKIH0KIAogQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6fkNDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXIoKSB7Ci0gIG1fcEZpbGUgPSBudWxscHRyOwotICBpZiAobV9wSnBlZ0NvbnRleHQpCi0gICAgbV9wQ29kZWNNZ3ItPkdldEpwZWdNb2R1bGUoKS0+RmluaXNoKG1fcEpwZWdDb250ZXh0KTsKLSAgaWYgKG1fcEJtcENvbnRleHQpCi0gICAgbV9wQ29kZWNNZ3ItPkdldEJtcE1vZHVsZSgpLT5GaW5pc2gobV9wQm1wQ29udGV4dCk7Ci0gIGlmIChtX3BHaWZDb250ZXh0KQotICAgIG1fcENvZGVjTWdyLT5HZXRHaWZNb2R1bGUoKS0+RmluaXNoKG1fcEdpZkNvbnRleHQpOwotICBpZiAobV9wUG5nQ29udGV4dCkKLSAgICBtX3BDb2RlY01nci0+R2V0UG5nTW9kdWxlKCktPkZpbmlzaChtX3BQbmdDb250ZXh0KTsKLSAgaWYgKG1fcFRpZmZDb250ZXh0KQotICAgIG1fcENvZGVjTWdyLT5HZXRUaWZmTW9kdWxlKCktPkRlc3Ryb3lEZWNvZGVyKG1fcFRpZmZDb250ZXh0KTsKICAgRlhfRnJlZShtX3BTcmNCdWYpOwogICBGWF9GcmVlKG1fcERlY29kZUJ1Zik7CiAgIEZYX0ZyZWUobV9wU3JjUGFsZXR0ZSk7CkBAIC0zMjAsNyArMjk4LDcgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KICAgZHdTaXplID0gZHdTaXplIC0gbV9vZmZTZXQ7Ci0gIHVpbnQzMl90IGR3QXZhaWwgPSBwSnBlZ01vZHVsZS0+R2V0QXZhaWxJbnB1dChtX3BKcGVnQ29udGV4dCwgbnVsbHB0cik7CisgIHVpbnQzMl90IGR3QXZhaWwgPSBwSnBlZ01vZHVsZS0+R2V0QXZhaWxJbnB1dChtX3BKcGVnQ29udGV4dC5nZXQoKSwgbnVsbHB0cik7CiAgIGlmIChkd0F2YWlsID09IG1fU3JjU2l6ZSkgewogICAgIGlmIChkd1NpemUgPiBGWENPREVDX0JMT0NLX1NJWkUpIHsKICAgICAgIGR3U2l6ZSA9IEZYQ09ERUNfQkxPQ0tfU0laRTsKQEAgLTMzNSw3ICszMTMsNyBAQAogICB9IGVsc2UgewogICAgIHVpbnQzMl90IGR3Q29uc3VtZSA9IG1fU3JjU2l6ZSAtIGR3QXZhaWw7CiAgICAgaWYgKGR3QXZhaWwpIHsKLSAgICAgIEZYU1lTX21lbW1vdmUobV9wU3JjQnVmLCBtX3BTcmNCdWYgKyBkd0NvbnN1bWUsIGR3QXZhaWwpOworICAgICAgbWVtbW92ZShtX3BTcmNCdWYsIG1fcFNyY0J1ZiArIGR3Q29uc3VtZSwgZHdBdmFpbCk7CiAgICAgfQogICAgIGlmIChkd1NpemUgPiBkd0NvbnN1bWUpIHsKICAgICAgIGR3U2l6ZSA9IGR3Q29uc3VtZTsKQEAgLTM0Niw3ICszMjQsNyBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogICBtX29mZlNldCArPSBkd1NpemU7Ci0gIHBKcGVnTW9kdWxlLT5JbnB1dChtX3BKcGVnQ29udGV4dCwgbV9wU3JjQnVmLCBkd1NpemUgKyBkd0F2YWlsKTsKKyAgcEpwZWdNb2R1bGUtPklucHV0KG1fcEpwZWdDb250ZXh0LmdldCgpLCBtX3BTcmNCdWYsIGR3U2l6ZSArIGR3QXZhaWwpOwogICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMzg2LDcgKzM2NCw3IEBACiAgIHN3aXRjaCAoZm9ybWF0KSB7CiAgICAgY2FzZSBGWERJQl8xYnBwTWFzazoKICAgICBjYXNlIEZYRElCXzFicHBSZ2I6Ci0gICAgICBBU1NFUlQoZmFsc2UpOworICAgICAgTk9UUkVBQ0hFRCgpOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6CiAgICAgY2FzZSBGWERJQl84YnBwUmdiOgpAQCAtNDAwLDE3ICszNzgsMTcgQEAKICAgICAgICpjb2xvcl90eXBlID0gNjsKICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICBBU1NFUlQoZmFsc2UpOworICAgICAgTk9UUkVBQ0hFRCgpOwogICAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgICpnYW1tYSA9IGtQbmdHYW1tYTsKICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6UG5nQXNrU2NhbmxpbmVCdWYoaW50IGxpbmUsIHVpbnQ4X3QqJiBzcmNfYnVmKSB7Ci0gIENGWF9ESUJpdG1hcCogcERJQml0bWFwID0gbV9wRGV2aWNlQml0bWFwOworYm9vbCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpQbmdBc2tTY2FubGluZUJ1ZihpbnQgbGluZSwgdWludDhfdCoqIHBTcmNCdWYpIHsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcERJQml0bWFwID0gbV9wRGV2aWNlQml0bWFwOwogICBpZiAoIXBESUJpdG1hcCkgewotICAgIEFTU0VSVChmYWxzZSk7CisgICAgTk9UUkVBQ0hFRCgpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogICBpZiAobGluZSA+PSBtX2NsaXBCb3gudG9wICYmIGxpbmUgPCBtX2NsaXBCb3guYm90dG9tKSB7CkBAIC00MTgsNyArMzk2LDcgQEAKICAgICBpbnQzMl90IHJvdyA9IChpbnQzMl90KSgobGluZSAtIG1fY2xpcEJveC50b3ApICogc2NhbGVfeSkgKyBtX3N0YXJ0WTsKICAgICB1aW50OF90KiBzcmNfc2NhbiA9ICh1aW50OF90KilwRElCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7CiAgICAgdWludDhfdCogZGVzX3NjYW4gPSBtX3BEZWNvZGVCdWY7Ci0gICAgc3JjX2J1ZiA9IG1fcERlY29kZUJ1ZjsKKyAgICAqcFNyY0J1ZiA9IG1fcERlY29kZUJ1ZjsKICAgICBpbnQzMl90IHNyY19CcHAgPSBwRElCaXRtYXAtPkdldEJQUCgpID4+IDM7CiAgICAgaW50MzJfdCBkZXNfQnBwID0gKG1fU3JjRm9ybWF0ICYgMHhmZikgPj4gMzsKICAgICBpbnQzMl90IHNyY19sZWZ0ID0gbV9zdGFydFg7CkBAIC00MzMsNyArNDExLDcgQEAKICAgICAgIHN3aXRjaCAocERJQml0bWFwLT5HZXRGb3JtYXQoKSkgewogICAgICAgICBjYXNlIEZYRElCXzFicHBNYXNrOgogICAgICAgICBjYXNlIEZYRElCXzFicHBSZ2I6Ci0gICAgICAgICAgQVNTRVJUKGZhbHNlKTsKKyAgICAgICAgICBOT1RSRUFDSEVEKCk7CiAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICBjYXNlIEZYRElCXzhicHBNYXNrOgogICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsKQEAgLTQ3Nyw3ICs0NTUsNyBAQAogfQogCiB2b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlBuZ09uZU9uZU1hcFJlc2FtcGxlSG9yeigKLSAgICBDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsCisgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBEZXZpY2VCaXRtYXAsCiAgICAgaW50MzJfdCBkZXNfbGluZSwKICAgICB1aW50OF90KiBzcmNfc2NhbiwKICAgICBGWENvZGVjX0Zvcm1hdCBzcmNfZm9ybWF0KSB7CkBAIC00OTMsNyArNDcxLDcgQEAKICAgICBzd2l0Y2ggKHBEZXZpY2VCaXRtYXAtPkdldEZvcm1hdCgpKSB7CiAgICAgICBjYXNlIEZYRElCXzFicHBNYXNrOgogICAgICAgY2FzZSBGWERJQl8xYnBwUmdiOgotICAgICAgICBBU1NFUlQoZmFsc2UpOworICAgICAgICBOT1RSRUFDSEVEKCk7CiAgICAgICAgIHJldHVybjsKICAgICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6CiAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsKQEAgLTU1MCw3ICs1MjgsNyBAQAogCiB2b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlBuZ0ZpbGxTY2FubGluZUJ1ZkNvbXBsZXRlZChpbnQgcGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lKSB7Ci0gIENGWF9ESUJpdG1hcCogcERJQml0bWFwID0gbV9wRGV2aWNlQml0bWFwOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwRElCaXRtYXAgPSBtX3BEZXZpY2VCaXRtYXA7CiAgIEFTU0VSVChwRElCaXRtYXApOwogICBpbnQgc3JjX3RvcCA9IG1fY2xpcEJveC50b3A7CiAgIGludCBzcmNfYm90dG9tID0gbV9jbGlwQm94LmJvdHRvbTsKQEAgLTU3NSwxNCArNTUzLDE0IEBACiAgIH0KIH0KIAotYm9vbCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpHaWZSZWFkTW9yZURhdGEoSUNvZGVjX0dpZk1vZHVsZSogcEdpZk1vZHVsZSwKK2Jvb2wgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2lmUmVhZE1vcmVEYXRhKENDb2RlY19HaWZNb2R1bGUqIHBHaWZNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWENPREVDX1NUQVRVUyYgZXJyX3N0YXR1cykgewogICB1aW50MzJfdCBkd1NpemUgPSAodWludDMyX3QpbV9wRmlsZS0+R2V0U2l6ZSgpOwogICBpZiAoZHdTaXplIDw9IG1fb2ZmU2V0KSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIGR3U2l6ZSA9IGR3U2l6ZSAtIG1fb2ZmU2V0OwotICB1aW50MzJfdCBkd0F2YWlsID0gcEdpZk1vZHVsZS0+R2V0QXZhaWxJbnB1dChtX3BHaWZDb250ZXh0LCBudWxscHRyKTsKKyAgdWludDMyX3QgZHdBdmFpbCA9IHBHaWZNb2R1bGUtPkdldEF2YWlsSW5wdXQobV9wR2lmQ29udGV4dC5nZXQoKSwgbnVsbHB0cik7CiAgIGlmIChkd0F2YWlsID09IG1fU3JjU2l6ZSkgewogICAgIGlmIChkd1NpemUgPiBGWENPREVDX0JMT0NLX1NJWkUpIHsKICAgICAgIGR3U2l6ZSA9IEZYQ09ERUNfQkxPQ0tfU0laRTsKQEAgLTU5Nyw3ICs1NzUsNyBAQAogICB9IGVsc2UgewogICAgIHVpbnQzMl90IGR3Q29uc3VtZSA9IG1fU3JjU2l6ZSAtIGR3QXZhaWw7CiAgICAgaWYgKGR3QXZhaWwpIHsKLSAgICAgIEZYU1lTX21lbW1vdmUobV9wU3JjQnVmLCBtX3BTcmNCdWYgKyBkd0NvbnN1bWUsIGR3QXZhaWwpOworICAgICAgbWVtbW92ZShtX3BTcmNCdWYsIG1fcFNyY0J1ZiArIGR3Q29uc3VtZSwgZHdBdmFpbCk7CiAgICAgfQogICAgIGlmIChkd1NpemUgPiBkd0NvbnN1bWUpIHsKICAgICAgIGR3U2l6ZSA9IGR3Q29uc3VtZTsKQEAgLTYwOCwyMSArNTg2LDE2IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIG1fb2ZmU2V0ICs9IGR3U2l6ZTsKLSAgcEdpZk1vZHVsZS0+SW5wdXQobV9wR2lmQ29udGV4dCwgbV9wU3JjQnVmLCBkd1NpemUgKyBkd0F2YWlsKTsKKyAgcEdpZk1vZHVsZS0+SW5wdXQobV9wR2lmQ29udGV4dC5nZXQoKSwgbV9wU3JjQnVmLCBkd1NpemUgKyBkd0F2YWlsKTsKICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2lmUmVjb3JkQ3VycmVudFBvc2l0aW9uKHVpbnQzMl90JiBjdXJfcG9zKSB7CiAgIHVpbnQzMl90IHJlbWFpbl9zaXplID0KLSAgICAgIG1fcENvZGVjTWdyLT5HZXRHaWZNb2R1bGUoKS0+R2V0QXZhaWxJbnB1dChtX3BHaWZDb250ZXh0KTsKKyAgICAgIG1fcENvZGVjTWdyLT5HZXRHaWZNb2R1bGUoKS0+R2V0QXZhaWxJbnB1dChtX3BHaWZDb250ZXh0LmdldCgpKTsKICAgY3VyX3BvcyA9IG1fb2ZmU2V0IC0gcmVtYWluX3NpemU7CiB9CiAKLXVpbnQ4X3QqIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdpZkFza0xvY2FsUGFsZXR0ZUJ1ZihpbnQzMl90IGZyYW1lX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBhbF9zaXplKSB7Ci0gIHJldHVybiBGWF9BbGxvYyh1aW50OF90LCBwYWxfc2l6ZSk7Ci19Ci0KIGJvb2wgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2lmSW5wdXRSZWNvcmRQb3NpdGlvbkJ1ZigKICAgICB1aW50MzJfdCByY2RfcG9zLAogICAgIGNvbnN0IEZYX1JFQ1QmIGltZ19yYywKQEAgLTY0Miw2ICs2MTUsOCBAQAogICBpZiAocGFsX251bSAhPSAwICYmIHBhbF9wdHIpIHsKICAgICBwUGFsZXR0ZSA9ICh1aW50OF90KilwYWxfcHRyOwogICB9IGVsc2UgeworICAgIGlmICghbV9wR2lmUGFsZXR0ZSkKKyAgICAgIHJldHVybiBmYWxzZTsKICAgICBwYWxfbnVtID0gbV9HaWZQbHROdW1iZXI7CiAgICAgcFBhbGV0dGUgPSBtX3BHaWZQYWxldHRlOwogICB9CkBAIC02NjIsNyArNjM3LDcgQEAKICAgbV9HaWZGcmFtZVJlY3QgPSBpbWdfcmM7CiAgIG1fU3JjUGFzc051bWJlciA9IGludGVybGFjZSA/IDQgOiAxOwogICBpbnQzMl90IHBhbF9pbmRleCA9IG1fR2lmQmdJbmRleDsKLSAgQ0ZYX0RJQml0bWFwKiBwRGV2aWNlID0gbV9wRGV2aWNlQml0bWFwOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwRGV2aWNlID0gbV9wRGV2aWNlQml0bWFwOwogICBpZiAodHJhbnNfaW5kZXggPj0gcGFsX251bSkKICAgICB0cmFuc19pbmRleCA9IC0xOwogICBpZiAodHJhbnNfaW5kZXggIT0gLTEpIHsKQEAgLTY4Niw3ICs2NjEsNyBAQAogICAgICAgY2FzZSAzOiB7CiAgICAgICAgIHVpbnQ4X3QgZ3JheSA9CiAgICAgICAgICAgICBGWFJHQjJHUkFZKEZYQVJHQl9SKGFyZ2IpLCBGWEFSR0JfRyhhcmdiKSwgRlhBUkdCX0IoYXJnYikpOwotICAgICAgICBGWFNZU19tZW1zZXQocFNjYW5saW5lLCBncmF5LCBzaXplWCk7CisgICAgICAgIG1lbXNldChwU2NhbmxpbmUsIGdyYXksIHNpemVYKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBjYXNlIDg6IHsKQEAgLTcxMiw3ICs2ODcsNyBAQAogCiB2b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdpZlJlYWRTY2FubGluZShpbnQzMl90IHJvd19udW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByb3dfYnVmKSB7Ci0gIENGWF9ESUJpdG1hcCogcERJQml0bWFwID0gbV9wRGV2aWNlQml0bWFwOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwRElCaXRtYXAgPSBtX3BEZXZpY2VCaXRtYXA7CiAgIEFTU0VSVChwRElCaXRtYXApOwogICBpbnQzMl90IGltZ193aWR0aCA9IG1fR2lmRnJhbWVSZWN0LldpZHRoKCk7CiAgIGlmICghcERJQml0bWFwLT5IYXNBbHBoYSgpKSB7CkBAIC03MjgsMTEgKzcwMywxMSBAQAogICBpZiAobV9HaWZUcmFuc0luZGV4ICE9IC0xICYmIG1fcERldmljZUJpdG1hcC0+SGFzQWxwaGEoKSkgewogICAgIHBhbF9pbmRleCA9IG1fR2lmVHJhbnNJbmRleDsKICAgfQotICBGWFNZU19tZW1zZXQobV9wRGVjb2RlQnVmLCBwYWxfaW5kZXgsIG1fU3JjV2lkdGgpOworICBtZW1zZXQobV9wRGVjb2RlQnVmLCBwYWxfaW5kZXgsIG1fU3JjV2lkdGgpOwogICBib29sIGJMYXN0UGFzcyA9IChyb3dfbnVtICUgMikgPT0gMTsKICAgaW50MzJfdCBsaW5lID0gcm93X251bSArIG1fR2lmRnJhbWVSZWN0LnRvcDsKICAgaW50MzJfdCBsZWZ0ID0gbV9HaWZGcmFtZVJlY3QubGVmdDsKLSAgRlhTWVNfbWVtY3B5KG1fcERlY29kZUJ1ZiArIGxlZnQsIHJvd19idWYsIGltZ193aWR0aCk7CisgIG1lbWNweShtX3BEZWNvZGVCdWYgKyBsZWZ0LCByb3dfYnVmLCBpbWdfd2lkdGgpOwogICBpbnQgc3JjX3RvcCA9IG1fY2xpcEJveC50b3A7CiAgIGludCBzcmNfYm90dG9tID0gbV9jbGlwQm94LmJvdHRvbTsKICAgaW50IGRlc190b3AgPSBtX3N0YXJ0WTsKQEAgLTc0OCw3ICs3MjMsNyBAQAogICAgIHJldHVybjsKIAogICBSZVNhbXBsZVNjYW5saW5lKHBESUJpdG1hcCwgZGVzX3JvdywgbV9wRGVjb2RlQnVmLCBtX1NyY0Zvcm1hdCk7Ci0gIGlmIChzY2FsZV95ID4gMS4wICYmICghbV9iSW50ZXJwb2wgfHwgbV9TcmNQYXNzTnVtYmVyID09IDEpKSB7CisgIGlmIChzY2FsZV95ID4gMS4wICYmIG1fU3JjUGFzc051bWJlciA9PSAxKSB7CiAgICAgUmVzYW1wbGVWZXJ0KHBESUJpdG1hcCwgc2NhbGVfeSwgZGVzX3Jvdyk7CiAgICAgcmV0dXJuOwogICB9CkBAIC03NjYsNyArNzQxLDcgQEAKICAgICAgIHVpbnQ4X3QqIHNjYW5fZGVzID0KICAgICAgICAgICAodWludDhfdCopcERJQml0bWFwLT5HZXRTY2FubGluZShjdXJfcm93KSArIGRlc19TY2FuT2ZmZXQ7CiAgICAgICB1aW50MzJfdCBzaXplID0gbV9zaXplWCAqIGRlc19CcHA7Ci0gICAgICBGWFNZU19tZW1tb3ZlKHNjYW5fZGVzLCBzY2FuX3NyYywgc2l6ZSk7CisgICAgICBtZW1tb3ZlKHNjYW5fZGVzLCBzY2FuX3NyYywgc2l6ZSk7CiAgICAgfQogICB9CiAgIGlmIChiTGFzdFBhc3MpCkBAIC03NzQsNyArNzQ5LDcgQEAKIH0KIAogdm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpHaWZEb3VibGVMaW5lUmVzYW1wbGVWZXJ0KAotICAgIENGWF9ESUJpdG1hcCogcERldmljZUJpdG1hcCwKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcERldmljZUJpdG1hcCwKICAgICBkb3VibGUgc2NhbGVfeSwKICAgICBpbnQgZGVzX3JvdykgewogICBpbnQgZGVzX0JwcCA9IHBEZXZpY2VCaXRtYXAtPkdldEJQUCgpID4+IDM7CkBAIC04NTQsMTQgKzgyOSwxNCBAQAogICB9CiB9CiAKLWJvb2wgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6Qm1wUmVhZE1vcmVEYXRhKElDb2RlY19CbXBNb2R1bGUqIHBCbXBNb2R1bGUsCitib29sIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkJtcFJlYWRNb3JlRGF0YShDQ29kZWNfQm1wTW9kdWxlKiBwQm1wTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhDT0RFQ19TVEFUVVMmIGVycl9zdGF0dXMpIHsKICAgdWludDMyX3QgZHdTaXplID0gKHVpbnQzMl90KW1fcEZpbGUtPkdldFNpemUoKTsKICAgaWYgKGR3U2l6ZSA8PSBtX29mZlNldCkKICAgICByZXR1cm4gZmFsc2U7CiAKICAgZHdTaXplID0gZHdTaXplIC0gbV9vZmZTZXQ7Ci0gIHVpbnQzMl90IGR3QXZhaWwgPSBwQm1wTW9kdWxlLT5HZXRBdmFpbElucHV0KG1fcEJtcENvbnRleHQsIG51bGxwdHIpOworICB1aW50MzJfdCBkd0F2YWlsID0gcEJtcE1vZHVsZS0+R2V0QXZhaWxJbnB1dChtX3BCbXBDb250ZXh0LmdldCgpLCBudWxscHRyKTsKICAgaWYgKGR3QXZhaWwgPT0gbV9TcmNTaXplKSB7CiAgICAgaWYgKGR3U2l6ZSA+IEZYQ09ERUNfQkxPQ0tfU0laRSkgewogICAgICAgZHdTaXplID0gRlhDT0RFQ19CTE9DS19TSVpFOwpAQCAtODc2LDcgKzg1MSw3IEBACiAgIH0gZWxzZSB7CiAgICAgdWludDMyX3QgZHdDb25zdW1lID0gbV9TcmNTaXplIC0gZHdBdmFpbDsKICAgICBpZiAoZHdBdmFpbCkgewotICAgICAgRlhTWVNfbWVtbW92ZShtX3BTcmNCdWYsIG1fcFNyY0J1ZiArIGR3Q29uc3VtZSwgZHdBdmFpbCk7CisgICAgICBtZW1tb3ZlKG1fcFNyY0J1ZiwgbV9wU3JjQnVmICsgZHdDb25zdW1lLCBkd0F2YWlsKTsKICAgICB9CiAgICAgaWYgKGR3U2l6ZSA+IGR3Q29uc3VtZSkgewogICAgICAgZHdTaXplID0gZHdDb25zdW1lOwpAQCAtODg3LDcgKzg2Miw3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIG1fb2ZmU2V0ICs9IGR3U2l6ZTsKLSAgcEJtcE1vZHVsZS0+SW5wdXQobV9wQm1wQ29udGV4dCwgbV9wU3JjQnVmLCBkd1NpemUgKyBkd0F2YWlsKTsKKyAgcEJtcE1vZHVsZS0+SW5wdXQobV9wQm1wQ29udGV4dC5nZXQoKSwgbV9wU3JjQnVmLCBkd1NpemUgKyBkd0F2YWlsKTsKICAgcmV0dXJuIHRydWU7CiB9CiAKQEAgLTg5NywxOCArODcyLDIxIEBACiAgIHJldHVybiBCbXBSZWFkTW9yZURhdGEobV9wQ29kZWNNZ3ItPkdldEJtcE1vZHVsZSgpLCBlcnJvcl9zdGF0dXMpOwogfQogCi12b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkJtcFJlYWRTY2FubGluZShpbnQzMl90IHJvd19udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByb3dfYnVmKSB7Ci0gIENGWF9ESUJpdG1hcCogcERJQml0bWFwID0gbV9wRGV2aWNlQml0bWFwOwordm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpCbXBSZWFkU2NhbmxpbmUoCisgICAgdWludDMyX3Qgcm93X251bSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcm93X2J1ZikgeworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwRElCaXRtYXAgPSBtX3BEZXZpY2VCaXRtYXA7CiAgIEFTU0VSVChwRElCaXRtYXApOwotICBGWFNZU19tZW1jcHkobV9wRGVjb2RlQnVmLCByb3dfYnVmLCBtX1NjYW5saW5lU2l6ZSk7CisgIHN0ZDo6Y29weShyb3dfYnVmLmJlZ2luKCksIHJvd19idWYuYmVnaW4oKSArIG1fU2NhbmxpbmVTaXplLCBtX3BEZWNvZGVCdWYpOwogICBpbnQgc3JjX3RvcCA9IG1fY2xpcEJveC50b3A7CiAgIGludCBzcmNfYm90dG9tID0gbV9jbGlwQm94LmJvdHRvbTsKICAgaW50IGRlc190b3AgPSBtX3N0YXJ0WTsKICAgaW50IHNyY19oZWkgPSBtX2NsaXBCb3guSGVpZ2h0KCk7CiAgIGludCBkZXNfaGVpID0gbV9zaXplWTsKLSAgaWYgKHJvd19udW0gPCBzcmNfdG9wIHx8IHJvd19udW0gPj0gc3JjX2JvdHRvbSkKKyAgaWYgKChzcmNfdG9wID49IDAgJiYgcm93X251bSA8IHN0YXRpY19jYXN0PHVpbnQzMl90PihzcmNfdG9wKSkgfHwKKyAgICAgIHNyY19ib3R0b20gPCAwIHx8IHJvd19udW0gPj0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNyY19ib3R0b20pKSB7CiAgICAgcmV0dXJuOworICB9CiAKICAgZG91YmxlIHNjYWxlX3kgPSAoZG91YmxlKWRlc19oZWkgLyAoZG91YmxlKXNyY19oZWk7CiAgIGludCBzcmNfcm93ID0gcm93X251bSAtIHNyY190b3A7CkBAIC05MjAsMTYgKzg5OCwxNyBAQAogICBpZiAoc2NhbGVfeSA8PSAxLjApCiAgICAgcmV0dXJuOwogCi0gIGlmIChtX0JtcElzVG9wQm90dG9tIHx8ICFtX2JJbnRlcnBvbCkgeworICBpZiAobV9CbXBJc1RvcEJvdHRvbSkgewogICAgIFJlc2FtcGxlVmVydChwRElCaXRtYXAsIHNjYWxlX3ksIGRlc19yb3cpOwogICAgIHJldHVybjsKICAgfQogICBSZXNhbXBsZVZlcnRCVChwRElCaXRtYXAsIHNjYWxlX3ksIGRlc19yb3cpOwogfQogCi12b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlJlc2FtcGxlVmVydEJUKENGWF9ESUJpdG1hcCogcERldmljZUJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNjYWxlX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXNfcm93KSB7Cit2b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlJlc2FtcGxlVmVydEJUKAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwRGV2aWNlQml0bWFwLAorICAgIGRvdWJsZSBzY2FsZV95LAorICAgIGludCBkZXNfcm93KSB7CiAgIGludCBkZXNfQnBwID0gcERldmljZUJpdG1hcC0+R2V0QlBQKCkgPj4gMzsKICAgdWludDMyX3QgZGVzX1NjYW5PZmZldCA9IG1fc3RhcnRYICogZGVzX0JwcDsKICAgaW50IGRlc190b3AgPSBtX3N0YXJ0WTsKQEAgLTk0NCw3ICs5MjMsNyBAQAogICAgICAgdWludDhfdCogc2Nhbl9kZXMgPQogICAgICAgICAgICh1aW50OF90KilwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93KSArIGRlc19TY2FuT2ZmZXQ7CiAgICAgICB1aW50MzJfdCBzaXplID0gbV9zaXplWCAqIGRlc19CcHA7Ci0gICAgICBGWFNZU19tZW1tb3ZlKHNjYW5fZGVzLCBzY2FuX3NyYywgc2l6ZSk7CisgICAgICBtZW1tb3ZlKHNjYW5fZGVzLCBzY2FuX3NyYywgc2l6ZSk7CiAgICAgfQogICAgIHJldHVybjsKICAgfQpAQCAtMTAyMCwyNDAgKzk5OSwyODggQEAKICAgfQogICBGWF9GcmVlKG1fcFNyY0J1Zik7CiAgIG1fcFNyY0J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOwotICBGWFNZU19tZW1zZXQobV9wU3JjQnVmLCAwLCBzaXplKTsKKyAgbWVtc2V0KG1fcFNyY0J1ZiwgMCwgc2l6ZSk7CiAgIG1fU3JjU2l6ZSA9IHNpemU7CiAgIHN3aXRjaCAoaW1hZ2VUeXBlKSB7Ci0gICAgY2FzZSBGWENPREVDX0lNQUdFX0JNUDogewotICAgICAgSUNvZGVjX0JtcE1vZHVsZSogcEJtcE1vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRCbXBNb2R1bGUoKTsKLSAgICAgIGlmICghcEJtcE1vZHVsZSkgewotICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHBCbXBNb2R1bGUtPlNldERlbGVnYXRlKHRoaXMpOwotICAgICAgbV9wQm1wQ29udGV4dCA9IHBCbXBNb2R1bGUtPlN0YXJ0KCk7Ci0gICAgICBpZiAoIW1fcEJtcENvbnRleHQpIHsKLSAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBib29sIGJSZXN1bHQgPSBtX3BGaWxlLT5SZWFkQmxvY2sobV9wU3JjQnVmLCAwLCBzaXplKTsKLSAgICAgIGlmICghYlJlc3VsdCkgewotICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBtX29mZlNldCArPSBzaXplOwotICAgICAgcEJtcE1vZHVsZS0+SW5wdXQobV9wQm1wQ29udGV4dCwgbV9wU3JjQnVmLCBzaXplKTsKLSAgICAgIHVpbnQzMl90KiBwUGFsZXR0ZSA9IG51bGxwdHI7Ci0gICAgICBpbnQzMl90IHJlYWRSZXN1bHQgPSBwQm1wTW9kdWxlLT5SZWFkSGVhZGVyKAotICAgICAgICAgIG1fcEJtcENvbnRleHQsICZtX1NyY1dpZHRoLCAmbV9TcmNIZWlnaHQsICZtX0JtcElzVG9wQm90dG9tLAotICAgICAgICAgICZtX1NyY0NvbXBvbmVudHMsICZtX1NyY1BhbGV0dGVOdW1iZXIsICZwUGFsZXR0ZSwgcEF0dHJpYnV0ZSk7Ci0gICAgICB3aGlsZSAocmVhZFJlc3VsdCA9PSAyKSB7Ci0gICAgICAgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7Ci0gICAgICAgIGlmICghQm1wUmVhZE1vcmVEYXRhKHBCbXBNb2R1bGUsIGVycm9yX3N0YXR1cykpIHsKLSAgICAgICAgICBtX3N0YXR1cyA9IGVycm9yX3N0YXR1czsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmVhZFJlc3VsdCA9IHBCbXBNb2R1bGUtPlJlYWRIZWFkZXIoCi0gICAgICAgICAgICBtX3BCbXBDb250ZXh0LCAmbV9TcmNXaWR0aCwgJm1fU3JjSGVpZ2h0LCAmbV9CbXBJc1RvcEJvdHRvbSwKLSAgICAgICAgICAgICZtX1NyY0NvbXBvbmVudHMsICZtX1NyY1BhbGV0dGVOdW1iZXIsICZwUGFsZXR0ZSwgcEF0dHJpYnV0ZSk7Ci0gICAgICB9Ci0gICAgICBpZiAocmVhZFJlc3VsdCA9PSAxKSB7Ci0gICAgICAgIG1fU3JjQlBDID0gODsKLSAgICAgICAgbV9jbGlwQm94ID0gRlhfUkVDVCgwLCAwLCBtX1NyY1dpZHRoLCBtX1NyY0hlaWdodCk7Ci0gICAgICAgIEZYX0ZyZWUobV9wU3JjUGFsZXR0ZSk7Ci0gICAgICAgIGlmIChtX1NyY1BhbGV0dGVOdW1iZXIpIHsKLSAgICAgICAgICBtX3BTcmNQYWxldHRlID0gRlhfQWxsb2MoRlhfQVJHQiwgbV9TcmNQYWxldHRlTnVtYmVyKTsKLSAgICAgICAgICBGWFNZU19tZW1jcHkobV9wU3JjUGFsZXR0ZSwgcFBhbGV0dGUsCi0gICAgICAgICAgICAgICAgICAgICAgIG1fU3JjUGFsZXR0ZU51bWJlciAqIHNpemVvZih1aW50MzJfdCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG1fcFNyY1BhbGV0dGUgPSBudWxscHRyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKG1fcEJtcENvbnRleHQpIHsKLSAgICAgICAgcEJtcE1vZHVsZS0+RmluaXNoKG1fcEJtcENvbnRleHQpOwotICAgICAgICBtX3BCbXBDb250ZXh0ID0gbnVsbHB0cjsKLSAgICAgIH0KLSAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgY2FzZSBGWENPREVDX0lNQUdFX0pQRzogewotICAgICAgQ0NvZGVjX0pwZWdNb2R1bGUqIHBKcGVnTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldEpwZWdNb2R1bGUoKTsKLSAgICAgIGlmICghcEpwZWdNb2R1bGUpIHsKLSAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBtX3BKcGVnQ29udGV4dCA9IHBKcGVnTW9kdWxlLT5TdGFydCgpOwotICAgICAgaWYgKCFtX3BKcGVnQ29udGV4dCkgewotICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJvb2wgYlJlc3VsdCA9IG1fcEZpbGUtPlJlYWRCbG9jayhtX3BTcmNCdWYsIDAsIHNpemUpOwotICAgICAgaWYgKCFiUmVzdWx0KSB7Ci0gICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1JFQUQ7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIG1fb2ZmU2V0ICs9IHNpemU7Ci0gICAgICBwSnBlZ01vZHVsZS0+SW5wdXQobV9wSnBlZ0NvbnRleHQsIG1fcFNyY0J1Ziwgc2l6ZSk7Ci0gICAgICBpbnQzMl90IHJlYWRSZXN1bHQgPQotICAgICAgICAgIHBKcGVnTW9kdWxlLT5SZWFkSGVhZGVyKG1fcEpwZWdDb250ZXh0LCAmbV9TcmNXaWR0aCwgJm1fU3JjSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX1NyY0NvbXBvbmVudHMsIHBBdHRyaWJ1dGUpOwotICAgICAgd2hpbGUgKHJlYWRSZXN1bHQgPT0gMikgewotICAgICAgICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOwotICAgICAgICBpZiAoIUpwZWdSZWFkTW9yZURhdGEocEpwZWdNb2R1bGUsIGVycm9yX3N0YXR1cykpIHsKLSAgICAgICAgICBtX3N0YXR1cyA9IGVycm9yX3N0YXR1czsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmVhZFJlc3VsdCA9Ci0gICAgICAgICAgICBwSnBlZ01vZHVsZS0+UmVhZEhlYWRlcihtX3BKcGVnQ29udGV4dCwgJm1fU3JjV2lkdGgsICZtX1NyY0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX1NyY0NvbXBvbmVudHMsIHBBdHRyaWJ1dGUpOwotICAgICAgfQotICAgICAgaWYgKCFyZWFkUmVzdWx0KSB7Ci0gICAgICAgIG1fU3JjQlBDID0gODsKLSAgICAgICAgbV9jbGlwQm94ID0gRlhfUkVDVCgwLCAwLCBtX1NyY1dpZHRoLCBtX1NyY0hlaWdodCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKG1fcEpwZWdDb250ZXh0KSB7Ci0gICAgICAgIHBKcGVnTW9kdWxlLT5GaW5pc2gobV9wSnBlZ0NvbnRleHQpOwotICAgICAgICBtX3BKcGVnQ29udGV4dCA9IG51bGxwdHI7Ci0gICAgICB9Ci0gICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9QTkc6IHsKLSAgICAgIElDb2RlY19QbmdNb2R1bGUqIHBQbmdNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0UG5nTW9kdWxlKCk7Ci0gICAgICBpZiAoIXBQbmdNb2R1bGUpIHsKLSAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBwUG5nTW9kdWxlLT5TZXREZWxlZ2F0ZSh0aGlzKTsKLSAgICAgIG1fcFBuZ0NvbnRleHQgPSBwUG5nTW9kdWxlLT5TdGFydCgpOwotICAgICAgaWYgKCFtX3BQbmdDb250ZXh0KSB7Ci0gICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYm9vbCBiUmVzdWx0ID0gbV9wRmlsZS0+UmVhZEJsb2NrKG1fcFNyY0J1ZiwgMCwgc2l6ZSk7Ci0gICAgICBpZiAoIWJSZXN1bHQpIHsKLSAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfUkVBRDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgbV9vZmZTZXQgKz0gc2l6ZTsKLSAgICAgIGJSZXN1bHQgPSBwUG5nTW9kdWxlLT5JbnB1dChtX3BQbmdDb250ZXh0LCBtX3BTcmNCdWYsIHNpemUsIHBBdHRyaWJ1dGUpOwotICAgICAgd2hpbGUgKGJSZXN1bHQpIHsKLSAgICAgICAgdWludDMyX3QgcmVtYWluX3NpemUgPSAodWludDMyX3QpbV9wRmlsZS0+R2V0U2l6ZSgpIC0gbV9vZmZTZXQ7Ci0gICAgICAgIHVpbnQzMl90IGlucHV0X3NpemUgPQotICAgICAgICAgICAgcmVtYWluX3NpemUgPiBGWENPREVDX0JMT0NLX1NJWkUgPyBGWENPREVDX0JMT0NLX1NJWkUgOiByZW1haW5fc2l6ZTsKLSAgICAgICAgaWYgKGlucHV0X3NpemUgPT0gMCkgewotICAgICAgICAgIGlmIChtX3BQbmdDb250ZXh0KSB7Ci0gICAgICAgICAgICBwUG5nTW9kdWxlLT5GaW5pc2gobV9wUG5nQ29udGV4dCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIG1fcFBuZ0NvbnRleHQgPSBudWxscHRyOwotICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcFNyY0J1ZiAmJiBpbnB1dF9zaXplID4gbV9TcmNTaXplKSB7Ci0gICAgICAgICAgRlhfRnJlZShtX3BTcmNCdWYpOwotICAgICAgICAgIG1fcFNyY0J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIGlucHV0X3NpemUpOwotICAgICAgICAgIEZYU1lTX21lbXNldChtX3BTcmNCdWYsIDAsIGlucHV0X3NpemUpOwotICAgICAgICAgIG1fU3JjU2l6ZSA9IGlucHV0X3NpemU7Ci0gICAgICAgIH0KLSAgICAgICAgYlJlc3VsdCA9IG1fcEZpbGUtPlJlYWRCbG9jayhtX3BTcmNCdWYsIG1fb2ZmU2V0LCBpbnB1dF9zaXplKTsKLSAgICAgICAgaWYgKCFiUmVzdWx0KSB7Ci0gICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfUkVBRDsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbV9vZmZTZXQgKz0gaW5wdXRfc2l6ZTsKLSAgICAgICAgYlJlc3VsdCA9Ci0gICAgICAgICAgICBwUG5nTW9kdWxlLT5JbnB1dChtX3BQbmdDb250ZXh0LCBtX3BTcmNCdWYsIGlucHV0X3NpemUsIHBBdHRyaWJ1dGUpOwotICAgICAgfQotICAgICAgQVNTRVJUKCFiUmVzdWx0KTsKLSAgICAgIGlmIChtX3BQbmdDb250ZXh0KSB7Ci0gICAgICAgIHBQbmdNb2R1bGUtPkZpbmlzaChtX3BQbmdDb250ZXh0KTsKLSAgICAgICAgbV9wUG5nQ29udGV4dCA9IG51bGxwdHI7Ci0gICAgICB9Ci0gICAgICBpZiAobV9TcmNQYXNzTnVtYmVyID09IDApIHsKLSAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2FzZSBGWENPREVDX0lNQUdFX0dJRjogewotICAgICAgSUNvZGVjX0dpZk1vZHVsZSogcEdpZk1vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRHaWZNb2R1bGUoKTsKLSAgICAgIGlmICghcEdpZk1vZHVsZSkgewotICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHBHaWZNb2R1bGUtPlNldERlbGVnYXRlKHRoaXMpOwotICAgICAgbV9wR2lmQ29udGV4dCA9IHBHaWZNb2R1bGUtPlN0YXJ0KCk7Ci0gICAgICBpZiAoIW1fcEdpZkNvbnRleHQpIHsKLSAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBib29sIGJSZXN1bHQgPSBtX3BGaWxlLT5SZWFkQmxvY2sobV9wU3JjQnVmLCAwLCBzaXplKTsKLSAgICAgIGlmICghYlJlc3VsdCkgewotICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBtX29mZlNldCArPSBzaXplOwotICAgICAgcEdpZk1vZHVsZS0+SW5wdXQobV9wR2lmQ29udGV4dCwgbV9wU3JjQnVmLCBzaXplKTsKLSAgICAgIG1fU3JjQ29tcG9uZW50cyA9IDE7Ci0gICAgICBpbnQzMl90IHJlYWRSZXN1bHQgPSBwR2lmTW9kdWxlLT5SZWFkSGVhZGVyKAotICAgICAgICAgIG1fcEdpZkNvbnRleHQsICZtX1NyY1dpZHRoLCAmbV9TcmNIZWlnaHQsICZtX0dpZlBsdE51bWJlciwKLSAgICAgICAgICAodm9pZCoqKSZtX3BHaWZQYWxldHRlLCAmbV9HaWZCZ0luZGV4LCBudWxscHRyKTsKLSAgICAgIHdoaWxlIChyZWFkUmVzdWx0ID09IDIpIHsKLSAgICAgICAgRlhDT0RFQ19TVEFUVVMgZXJyb3Jfc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsKLSAgICAgICAgaWYgKCFHaWZSZWFkTW9yZURhdGEocEdpZk1vZHVsZSwgZXJyb3Jfc3RhdHVzKSkgewotICAgICAgICAgIG1fc3RhdHVzID0gZXJyb3Jfc3RhdHVzOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZWFkUmVzdWx0ID0gcEdpZk1vZHVsZS0+UmVhZEhlYWRlcigKLSAgICAgICAgICAgIG1fcEdpZkNvbnRleHQsICZtX1NyY1dpZHRoLCAmbV9TcmNIZWlnaHQsICZtX0dpZlBsdE51bWJlciwKLSAgICAgICAgICAgICh2b2lkKiopJm1fcEdpZlBhbGV0dGUsICZtX0dpZkJnSW5kZXgsIG51bGxwdHIpOwotICAgICAgfQotICAgICAgaWYgKHJlYWRSZXN1bHQgPT0gMSkgewotICAgICAgICBtX1NyY0JQQyA9IDg7Ci0gICAgICAgIG1fY2xpcEJveCA9IEZYX1JFQ1QoMCwgMCwgbV9TcmNXaWR0aCwgbV9TcmNIZWlnaHQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChtX3BHaWZDb250ZXh0KSB7Ci0gICAgICAgIHBHaWZNb2R1bGUtPkZpbmlzaChtX3BHaWZDb250ZXh0KTsKLSAgICAgICAgbV9wR2lmQ29udGV4dCA9IG51bGxwdHI7Ci0gICAgICB9Ci0gICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9USUY6IHsKLSAgICAgIElDb2RlY19UaWZmTW9kdWxlKiBwVGlmZk1vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRUaWZmTW9kdWxlKCk7Ci0gICAgICBpZiAoIXBUaWZmTW9kdWxlKSB7Ci0gICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgbV9wVGlmZkNvbnRleHQgPSBwVGlmZk1vZHVsZS0+Q3JlYXRlRGVjb2RlcihtX3BGaWxlKTsKLSAgICAgIGlmICghbV9wVGlmZkNvbnRleHQpIHsKLSAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpbnQzMl90IGR1bW15X2JwYzsKLSAgICAgIGJvb2wgcmV0ID0gcFRpZmZNb2R1bGUtPkxvYWRGcmFtZUluZm8obV9wVGlmZkNvbnRleHQsIDAsICZtX1NyY1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9TcmNIZWlnaHQsICZtX1NyY0NvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdW1teV9icGMsIHBBdHRyaWJ1dGUpOwotICAgICAgbV9TcmNDb21wb25lbnRzID0gNDsKLSAgICAgIG1fY2xpcEJveCA9IEZYX1JFQ1QoMCwgMCwgbV9TcmNXaWR0aCwgbV9TcmNIZWlnaHQpOwotICAgICAgaWYgKCFyZXQpIHsKLSAgICAgICAgcFRpZmZNb2R1bGUtPkRlc3Ryb3lEZWNvZGVyKG1fcFRpZmZDb250ZXh0KTsKLSAgICAgICAgbV9wVGlmZkNvbnRleHQgPSBudWxscHRyOwotICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfQk1QOgorICAgICAgcmV0dXJuIEJtcERldGVjdEltYWdlVHlwZShwQXR0cmlidXRlLCBzaXplKTsKKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfSlBHOgorICAgICAgcmV0dXJuIEpwZWdEZXRlY3RJbWFnZVR5cGUocEF0dHJpYnV0ZSwgc2l6ZSk7CisgICAgY2FzZSBGWENPREVDX0lNQUdFX1BORzoKKyAgICAgIHJldHVybiBQbmdEZXRlY3RJbWFnZVR5cGUocEF0dHJpYnV0ZSwgc2l6ZSk7CisgICAgY2FzZSBGWENPREVDX0lNQUdFX0dJRjoKKyAgICAgIHJldHVybiBHaWZEZXRlY3RJbWFnZVR5cGUocEF0dHJpYnV0ZSwgc2l6ZSk7CisgICAgY2FzZSBGWENPREVDX0lNQUdFX1RJRjoKKyAgICAgIHJldHVybiBUaWZEZXRlY3RJbWFnZVR5cGUocEF0dHJpYnV0ZSwgc2l6ZSk7CiAgICAgZGVmYXVsdDoKICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsKICAgICAgIHJldHVybiBmYWxzZTsKICAgfQogfQogCitib29sIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkJtcERldGVjdEltYWdlVHlwZShDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSkgeworICBDQ29kZWNfQm1wTW9kdWxlKiBwQm1wTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldEJtcE1vZHVsZSgpOworICBpZiAoIXBCbXBNb2R1bGUpIHsKKyAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgbV9wQm1wQ29udGV4dCA9IHBCbXBNb2R1bGUtPlN0YXJ0KHRoaXMpOworICBpZiAoIW1fcEJtcENvbnRleHQpIHsKKyAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFtX3BGaWxlLT5SZWFkQmxvY2sobV9wU3JjQnVmLCAwLCBzaXplKSkgeworICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1JFQUQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgbV9vZmZTZXQgKz0gc2l6ZTsKKyAgcEJtcE1vZHVsZS0+SW5wdXQobV9wQm1wQ29udGV4dC5nZXQoKSwgbV9wU3JjQnVmLCBzaXplKTsKKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHBhbGV0dGU7CisgIGludDMyX3QgcmVhZFJlc3VsdCA9IHBCbXBNb2R1bGUtPlJlYWRIZWFkZXIoCisgICAgICBtX3BCbXBDb250ZXh0LmdldCgpLCAmbV9TcmNXaWR0aCwgJm1fU3JjSGVpZ2h0LCAmbV9CbXBJc1RvcEJvdHRvbSwKKyAgICAgICZtX1NyY0NvbXBvbmVudHMsICZtX1NyY1BhbGV0dGVOdW1iZXIsICZwYWxldHRlLCBwQXR0cmlidXRlKTsKKyAgd2hpbGUgKHJlYWRSZXN1bHQgPT0gMikgeworICAgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7CisgICAgaWYgKCFCbXBSZWFkTW9yZURhdGEocEJtcE1vZHVsZSwgZXJyb3Jfc3RhdHVzKSkgeworICAgICAgbV9zdGF0dXMgPSBlcnJvcl9zdGF0dXM7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJlYWRSZXN1bHQgPSBwQm1wTW9kdWxlLT5SZWFkSGVhZGVyKAorICAgICAgICBtX3BCbXBDb250ZXh0LmdldCgpLCAmbV9TcmNXaWR0aCwgJm1fU3JjSGVpZ2h0LCAmbV9CbXBJc1RvcEJvdHRvbSwKKyAgICAgICAgJm1fU3JjQ29tcG9uZW50cywgJm1fU3JjUGFsZXR0ZU51bWJlciwgJnBhbGV0dGUsIHBBdHRyaWJ1dGUpOworICB9CisKKyAgaWYgKHJlYWRSZXN1bHQgIT0gMSkgeworICAgIG1fcEJtcENvbnRleHQucmVzZXQoKTsKKyAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgRlhESUJfRm9ybWF0IGZvcm1hdCA9IEZYRElCX0ludmFsaWQ7CisgIHN3aXRjaCAobV9TcmNDb21wb25lbnRzKSB7CisgICAgY2FzZSAxOgorICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjXzhicHBSZ2I7CisgICAgICBmb3JtYXQgPSBGWERJQl84YnBwUmdiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjX1JnYjsKKyAgICAgIGZvcm1hdCA9IEZYRElCX1JnYjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIG1fU3JjRm9ybWF0ID0gRlhDb2RlY19SZ2IzMjsKKyAgICAgIGZvcm1hdCA9IEZYRElCX1JnYjMyOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG1fcEJtcENvbnRleHQucmVzZXQoKTsKKyAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHVpbnQzMl90IHBpdGNoID0gMDsKKyAgdWludDMyX3QgbmVlZGVkRGF0YSA9IDA7CisgIGlmICghQ0ZYX0RJQml0bWFwOjpDYWxjdWxhdGVQaXRjaEFuZFNpemUobV9TcmNXaWR0aCwgbV9TcmNIZWlnaHQsIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGl0Y2gsICZuZWVkZWREYXRhKSkgeworICAgIG1fcEJtcENvbnRleHQucmVzZXQoKTsKKyAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdWludDMyX3QgYXZhaWxhYmxlRGF0YSA9IG1fU3JjU2l6ZSA+IG1fb2ZmU2V0ID8gbV9TcmNTaXplIC0gbV9vZmZTZXQgOiAwOworICBpZiAobmVlZGVkRGF0YSA+IGF2YWlsYWJsZURhdGEpIHsKKyAgICBtX3BCbXBDb250ZXh0LnJlc2V0KCk7CisgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIG1fU3JjQlBDID0gODsKKyAgbV9jbGlwQm94ID0gRlhfUkVDVCgwLCAwLCBtX1NyY1dpZHRoLCBtX1NyY0hlaWdodCk7CisgIEZYX0ZyZWUobV9wU3JjUGFsZXR0ZSk7CisgIGlmIChtX1NyY1BhbGV0dGVOdW1iZXIpIHsKKyAgICBtX3BTcmNQYWxldHRlID0gRlhfQWxsb2MoRlhfQVJHQiwgbV9TcmNQYWxldHRlTnVtYmVyKTsKKyAgICBtZW1jcHkobV9wU3JjUGFsZXR0ZSwgcGFsZXR0ZS5kYXRhKCksIG1fU3JjUGFsZXR0ZU51bWJlciAqIHNpemVvZihGWF9BUkdCKSk7CisgIH0gZWxzZSB7CisgICAgbV9wU3JjUGFsZXR0ZSA9IG51bGxwdHI7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6SnBlZ0RldGVjdEltYWdlVHlwZSgKKyAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlLAorICAgIHVpbnQzMl90IHNpemUpIHsKKyAgQ0NvZGVjX0pwZWdNb2R1bGUqIHBKcGVnTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldEpwZWdNb2R1bGUoKTsKKyAgLy8gU2V0dGluZyBqdW1wIG1hcmtlciBiZWZvcmUgY2FsbGluZyBTdGFydCBvciBSZWFkSGVhZGVyLCBzaW5jZSBhIGxvbmdqbXAKKyAgLy8gdG8gdGhlIG1hcmtlciBpbmRpY2F0ZXMgYSBmYXRhbCBlcnJvciBpbiB0aGVzZSBmdW5jdGlvbnMuCisgIGlmIChzZXRqbXAoKm1fcEpwZWdDb250ZXh0LT5HZXRKdW1wTWFyaygpKSA9PSAtMSkgeworICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgbV9wSnBlZ0NvbnRleHQgPSBwSnBlZ01vZHVsZS0+U3RhcnQoKTsKKyAgaWYgKCFtX3BKcGVnQ29udGV4dCkgeworICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFtX3BGaWxlLT5SZWFkQmxvY2sobV9wU3JjQnVmLCAwLCBzaXplKSkgeworICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1JFQUQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1fb2ZmU2V0ICs9IHNpemU7CisgIHBKcGVnTW9kdWxlLT5JbnB1dChtX3BKcGVnQ29udGV4dC5nZXQoKSwgbV9wU3JjQnVmLCBzaXplKTsKKyAgLy8gU2V0dGluZyBqdW1wIG1hcmtlciBiZWZvcmUgY2FsbGluZyBSZWFkSGVhZGVyLCBzaW5jZSBhIGxvbmdqbXAgdG8KKyAgLy8gdGhlIG1hcmtlciBpbmRpY2F0ZXMgYSBmYXRhbCBlcnJvci4KKyAgaWYgKHNldGptcCgqbV9wSnBlZ0NvbnRleHQtPkdldEp1bXBNYXJrKCkpID09IC0xKSB7CisgICAgbV9wSnBlZ0NvbnRleHQucmVzZXQoKTsKKyAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW50MzJfdCByZWFkUmVzdWx0ID0KKyAgICAgIHBKcGVnTW9kdWxlLT5SZWFkSGVhZGVyKG1fcEpwZWdDb250ZXh0LmdldCgpLCAmbV9TcmNXaWR0aCwgJm1fU3JjSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fU3JjQ29tcG9uZW50cywgcEF0dHJpYnV0ZSk7CisgIHdoaWxlIChyZWFkUmVzdWx0ID09IDIpIHsKKyAgICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOworICAgIGlmICghSnBlZ1JlYWRNb3JlRGF0YShwSnBlZ01vZHVsZSwgZXJyb3Jfc3RhdHVzKSkgeworICAgICAgbV9zdGF0dXMgPSBlcnJvcl9zdGF0dXM7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJlYWRSZXN1bHQgPQorICAgICAgICBwSnBlZ01vZHVsZS0+UmVhZEhlYWRlcihtX3BKcGVnQ29udGV4dC5nZXQoKSwgJm1fU3JjV2lkdGgsICZtX1NyY0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fU3JjQ29tcG9uZW50cywgcEF0dHJpYnV0ZSk7CisgIH0KKyAgaWYgKCFyZWFkUmVzdWx0KSB7CisgICAgbV9TcmNCUEMgPSA4OworICAgIG1fY2xpcEJveCA9IEZYX1JFQ1QoMCwgMCwgbV9TcmNXaWR0aCwgbV9TcmNIZWlnaHQpOworICAgIHJldHVybiB0cnVlOworICB9CisgIG1fcEpwZWdDb250ZXh0LnJlc2V0KCk7CisgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlBuZ0RldGVjdEltYWdlVHlwZShDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSkgeworICBDQ29kZWNfUG5nTW9kdWxlKiBwUG5nTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldFBuZ01vZHVsZSgpOworICBpZiAoIXBQbmdNb2R1bGUpIHsKKyAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1fcFBuZ0NvbnRleHQgPSBwUG5nTW9kdWxlLT5TdGFydCh0aGlzKTsKKyAgaWYgKCFtX3BQbmdDb250ZXh0KSB7CisgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBib29sIGJSZXN1bHQgPSBtX3BGaWxlLT5SZWFkQmxvY2sobV9wU3JjQnVmLCAwLCBzaXplKTsKKyAgaWYgKCFiUmVzdWx0KSB7CisgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfUkVBRDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbV9vZmZTZXQgKz0gc2l6ZTsKKyAgYlJlc3VsdCA9IHBQbmdNb2R1bGUtPklucHV0KG1fcFBuZ0NvbnRleHQuZ2V0KCksIG1fcFNyY0J1Ziwgc2l6ZSwgcEF0dHJpYnV0ZSk7CisgIHdoaWxlIChiUmVzdWx0KSB7CisgICAgdWludDMyX3QgcmVtYWluX3NpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obV9wRmlsZS0+R2V0U2l6ZSgpKSAtIG1fb2ZmU2V0OworICAgIHVpbnQzMl90IGlucHV0X3NpemUgPQorICAgICAgICByZW1haW5fc2l6ZSA+IEZYQ09ERUNfQkxPQ0tfU0laRSA/IEZYQ09ERUNfQkxPQ0tfU0laRSA6IHJlbWFpbl9zaXplOworICAgIGlmIChpbnB1dF9zaXplID09IDApIHsKKyAgICAgIG1fcFBuZ0NvbnRleHQucmVzZXQoKTsKKyAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX0ZPUk1BVDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1fcFNyY0J1ZiAmJiBpbnB1dF9zaXplID4gbV9TcmNTaXplKSB7CisgICAgICBGWF9GcmVlKG1fcFNyY0J1Zik7CisgICAgICBtX3BTcmNCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBpbnB1dF9zaXplKTsKKyAgICAgIG1lbXNldChtX3BTcmNCdWYsIDAsIGlucHV0X3NpemUpOworICAgICAgbV9TcmNTaXplID0gaW5wdXRfc2l6ZTsKKyAgICB9CisgICAgYlJlc3VsdCA9IG1fcEZpbGUtPlJlYWRCbG9jayhtX3BTcmNCdWYsIG1fb2ZmU2V0LCBpbnB1dF9zaXplKTsKKyAgICBpZiAoIWJSZXN1bHQpIHsKKyAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1JFQUQ7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1fb2ZmU2V0ICs9IGlucHV0X3NpemU7CisgICAgYlJlc3VsdCA9IHBQbmdNb2R1bGUtPklucHV0KG1fcFBuZ0NvbnRleHQuZ2V0KCksIG1fcFNyY0J1ZiwgaW5wdXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEF0dHJpYnV0ZSk7CisgIH0KKyAgQVNTRVJUKCFiUmVzdWx0KTsKKyAgbV9wUG5nQ29udGV4dC5yZXNldCgpOworICBpZiAobV9TcmNQYXNzTnVtYmVyID09IDApIHsKKyAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdpZkRldGVjdEltYWdlVHlwZShDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSkgeworICBDQ29kZWNfR2lmTW9kdWxlKiBwR2lmTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldEdpZk1vZHVsZSgpOworICBpZiAoIXBHaWZNb2R1bGUpIHsKKyAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1fcEdpZkNvbnRleHQgPSBwR2lmTW9kdWxlLT5TdGFydCh0aGlzKTsKKyAgYm9vbCBiUmVzdWx0ID0gbV9wRmlsZS0+UmVhZEJsb2NrKG1fcFNyY0J1ZiwgMCwgc2l6ZSk7CisgIGlmICghYlJlc3VsdCkgeworICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1JFQUQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1fb2ZmU2V0ICs9IHNpemU7CisgIHBHaWZNb2R1bGUtPklucHV0KG1fcEdpZkNvbnRleHQuZ2V0KCksIG1fcFNyY0J1Ziwgc2l6ZSk7CisgIG1fU3JjQ29tcG9uZW50cyA9IDE7CisgIENGWF9HaWZEZWNvZGVTdGF0dXMgcmVhZFJlc3VsdCA9IHBHaWZNb2R1bGUtPlJlYWRIZWFkZXIoCisgICAgICBtX3BHaWZDb250ZXh0LmdldCgpLCAmbV9TcmNXaWR0aCwgJm1fU3JjSGVpZ2h0LCAmbV9HaWZQbHROdW1iZXIsCisgICAgICAodm9pZCoqKSZtX3BHaWZQYWxldHRlLCAmbV9HaWZCZ0luZGV4LCBudWxscHRyKTsKKyAgd2hpbGUgKHJlYWRSZXN1bHQgPT0gQ0ZYX0dpZkRlY29kZVN0YXR1czo6VW5maW5pc2hlZCkgeworICAgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7CisgICAgaWYgKCFHaWZSZWFkTW9yZURhdGEocEdpZk1vZHVsZSwgZXJyb3Jfc3RhdHVzKSkgeworICAgICAgbV9wR2lmQ29udGV4dCA9IG51bGxwdHI7CisgICAgICBtX3N0YXR1cyA9IGVycm9yX3N0YXR1czsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmVhZFJlc3VsdCA9IHBHaWZNb2R1bGUtPlJlYWRIZWFkZXIoCisgICAgICAgIG1fcEdpZkNvbnRleHQuZ2V0KCksICZtX1NyY1dpZHRoLCAmbV9TcmNIZWlnaHQsICZtX0dpZlBsdE51bWJlciwKKyAgICAgICAgKHZvaWQqKikmbV9wR2lmUGFsZXR0ZSwgJm1fR2lmQmdJbmRleCwgbnVsbHB0cik7CisgIH0KKyAgaWYgKHJlYWRSZXN1bHQgPT0gQ0ZYX0dpZkRlY29kZVN0YXR1czo6U3VjY2VzcykgeworICAgIG1fU3JjQlBDID0gODsKKyAgICBtX2NsaXBCb3ggPSBGWF9SRUNUKDAsIDAsIG1fU3JjV2lkdGgsIG1fU3JjSGVpZ2h0KTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBtX3BHaWZDb250ZXh0ID0gbnVsbHB0cjsKKyAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6VGlmRGV0ZWN0SW1hZ2VUeXBlKENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplKSB7CisgIENDb2RlY19UaWZmTW9kdWxlKiBwVGlmZk1vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRUaWZmTW9kdWxlKCk7CisgIGlmICghcFRpZmZNb2R1bGUpIHsKKyAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1fcFRpZmZDb250ZXh0ID0gcFRpZmZNb2R1bGUtPkNyZWF0ZURlY29kZXIobV9wRmlsZSk7CisgIGlmICghbV9wVGlmZkNvbnRleHQpIHsKKyAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGludDMyX3QgZHVtbXlfYnBjOworICBib29sIHJldCA9IHBUaWZmTW9kdWxlLT5Mb2FkRnJhbWVJbmZvKG1fcFRpZmZDb250ZXh0LmdldCgpLCAwLCAmbV9TcmNXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9TcmNIZWlnaHQsICZtX1NyY0NvbXBvbmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1bW15X2JwYywgcEF0dHJpYnV0ZSk7CisgIG1fU3JjQ29tcG9uZW50cyA9IDQ7CisgIG1fY2xpcEJveCA9IEZYX1JFQ1QoMCwgMCwgbV9TcmNXaWR0aCwgbV9TcmNIZWlnaHQpOworICBpZiAoIXJldCkgeworICAgIG1fcFRpZmZDb250ZXh0LnJlc2V0KCk7CisgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwogRlhDT0RFQ19TVEFUVVMgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6TG9hZEltYWdlSW5mbygKLSAgICBjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZSwKKyAgICBjb25zdCBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBGaWxlLAogICAgIEZYQ09ERUNfSU1BR0VfVFlQRSBpbWFnZVR5cGUsCiAgICAgQ0ZYX0RJQkF0dHJpYnV0ZSogcEF0dHJpYnV0ZSwKICAgICBib29sIGJTa2lwSW1hZ2VUeXBlQ2hlY2spIHsKQEAgLTE0NDQsMTAgKzE0NzEsMTEgQEAKICAgfQogfQogCi12b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlJlU2FtcGxlU2NhbmxpbmUoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXNfbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWENvZGVjX0Zvcm1hdCBzcmNfZm9ybWF0KSB7Cit2b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlJlU2FtcGxlU2NhbmxpbmUoCisgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBEZXZpY2VCaXRtYXAsCisgICAgaW50IGRlc19saW5lLAorICAgIHVpbnQ4X3QqIHNyY19zY2FuLAorICAgIEZYQ29kZWNfRm9ybWF0IHNyY19mb3JtYXQpIHsKICAgaW50IHNyY19sZWZ0ID0gbV9jbGlwQm94LmxlZnQ7CiAgIGludCBkZXNfbGVmdCA9IG1fc3RhcnRYOwogICB1aW50OF90KiBkZXNfc2NhbiA9CkBAIC0xNTEyLDEwICsxNTQwLDEyIEBACiAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9CiAgICAgICAgICAgICAgIHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07CiAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3BpeGVsID0gc3JjX3NjYW4gKyBqICogc3JjX0JwcDsKLSAgICAgICAgICB1aW50OF90IHNyY19iID0gMCwgc3JjX2cgPSAwLCBzcmNfciA9IDA7Ci0gICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKDI1NSAtIHNyY19waXhlbFswXSwgMjU1IC0gc3JjX3BpeGVsWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUgLSBzcmNfcGl4ZWxbMl0sIDI1NSAtIHNyY19waXhlbFszXSwgc3JjX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19nLCBzcmNfYik7CisgICAgICAgICAgdWludDhfdCBzcmNfYiA9IDA7CisgICAgICAgICAgdWludDhfdCBzcmNfZyA9IDA7CisgICAgICAgICAgdWludDhfdCBzcmNfciA9IDA7CisgICAgICAgICAgc3RkOjp0aWUoc3JjX3IsIHNyY19nLCBzcmNfYikgPQorICAgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoMjU1IC0gc3JjX3BpeGVsWzBdLCAyNTUgLSBzcmNfcGl4ZWxbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUgLSBzcmNfcGl4ZWxbMl0sIDI1NSAtIHNyY19waXhlbFszXSk7CiAgICAgICAgICAgZGVzX2IgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX2I7CiAgICAgICAgICAgZGVzX2cgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX2c7CiAgICAgICAgICAgZGVzX3IgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX3I7CkBAIC0xNTMzLDcgKzE1NjMsNyBAQAogICAgICAgICAgICAgICBwUGl4ZWxXZWlnaHRzLT5tX1dlaWdodHNbaiAtIHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnRdOwogICAgICAgICAgIGRlc19nICs9IHBpeGVsX3dlaWdodCAqIHNyY19zY2FuW2pdOwogICAgICAgICB9Ci0gICAgICAgIEZYU1lTX21lbXNldChkZXNfc2NhbiwgKHVpbnQ4X3QpKGRlc19nID4+IDE2KSwgMyk7CisgICAgICAgIG1lbXNldChkZXNfc2NhbiwgKHVpbnQ4X3QpKGRlc19nID4+IDE2KSwgMyk7CiAgICAgICAgIGRlc19zY2FuICs9IGRlc19CcHA7CiAgICAgICB9IGJyZWFrOwogICAgICAgY2FzZSA4OiB7CkBAIC0xNjA5LDEwICsxNjM5LDEyIEBACiAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9CiAgICAgICAgICAgICAgIHBQaXhlbFdlaWdodHMtPm1fV2VpZ2h0c1tqIC0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydF07CiAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3BpeGVsID0gc3JjX3NjYW4gKyBqICogc3JjX0JwcDsKLSAgICAgICAgICB1aW50OF90IHNyY19iID0gMCwgc3JjX2cgPSAwLCBzcmNfciA9IDA7Ci0gICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKDI1NSAtIHNyY19waXhlbFswXSwgMjU1IC0gc3JjX3BpeGVsWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUgLSBzcmNfcGl4ZWxbMl0sIDI1NSAtIHNyY19waXhlbFszXSwgc3JjX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19nLCBzcmNfYik7CisgICAgICAgICAgdWludDhfdCBzcmNfYiA9IDA7CisgICAgICAgICAgdWludDhfdCBzcmNfZyA9IDA7CisgICAgICAgICAgdWludDhfdCBzcmNfciA9IDA7CisgICAgICAgICAgc3RkOjp0aWUoc3JjX3IsIHNyY19nLCBzcmNfYikgPQorICAgICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoMjU1IC0gc3JjX3BpeGVsWzBdLCAyNTUgLSBzcmNfcGl4ZWxbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUgLSBzcmNfcGl4ZWxbMl0sIDI1NSAtIHNyY19waXhlbFszXSk7CiAgICAgICAgICAgZGVzX2IgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX2I7CiAgICAgICAgICAgZGVzX2cgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX2c7CiAgICAgICAgICAgZGVzX3IgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX3I7CkBAIC0xNjQ2LDkyICsxNjc4LDE3IEBACiAgIH0KIH0KIAotdm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpSZXNhbXBsZVZlcnQoQ0ZYX0RJQml0bWFwKiBwRGV2aWNlQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNjYWxlX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzX3Jvdykgewordm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpSZXNhbXBsZVZlcnQoCisgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBEZXZpY2VCaXRtYXAsCisgICAgZG91YmxlIHNjYWxlX3ksCisgICAgaW50IGRlc19yb3cpIHsKICAgaW50IGRlc19CcHAgPSBwRGV2aWNlQml0bWFwLT5HZXRCUFAoKSA+PiAzOwogICB1aW50MzJfdCBkZXNfU2Nhbk9mZmV0ID0gbV9zdGFydFggKiBkZXNfQnBwOwotICBpZiAobV9iSW50ZXJwb2wpIHsKLSAgICBpbnQgZGVzX3RvcCA9IG1fc3RhcnRZOwotICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8aW50PiBjaGVja19kZXNfcm93XzEgPSBkZXNfcm93OwotICAgIGNoZWNrX2Rlc19yb3dfMSAtPSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxpbnQ+KHNjYWxlX3kpOwotICAgIGludCBkZXNfcm93XzEgPSBjaGVja19kZXNfcm93XzEuVmFsdWVPckRpZSgpOwotICAgIGlmIChkZXNfcm93XzEgPCBkZXNfdG9wKSB7Ci0gICAgICBpbnQgZGVzX2JvdHRvbSA9IGRlc190b3AgKyBtX3NpemVZOwotICAgICAgaWYgKGRlc19yb3cgKyAoaW50KXNjYWxlX3kgPj0gZGVzX2JvdHRvbSAtIDEpIHsKLSAgICAgICAgdWludDhfdCogc2Nhbl9zcmMgPQotICAgICAgICAgICAgKHVpbnQ4X3QqKXBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKGRlc19yb3cpICsgZGVzX1NjYW5PZmZldDsKLSAgICAgICAgd2hpbGUgKCsrZGVzX3JvdyA8IGRlc19ib3R0b20pIHsKLSAgICAgICAgICB1aW50OF90KiBzY2FuX2RlcyA9Ci0gICAgICAgICAgICAgICh1aW50OF90KilwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93KSArIGRlc19TY2FuT2ZmZXQ7Ci0gICAgICAgICAgdWludDMyX3Qgc2l6ZSA9IG1fc2l6ZVggKiBkZXNfQnBwOwotICAgICAgICAgIEZYU1lTX21lbW1vdmUoc2Nhbl9kZXMsIHNjYW5fc3JjLCBzaXplKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKDsgZGVzX3Jvd18xIDwgZGVzX3JvdzsgZGVzX3Jvd18xKyspIHsKLSAgICAgIHVpbnQ4X3QqIHNjYW5fZGVzID0KLSAgICAgICAgICAodWludDhfdCopcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUoZGVzX3Jvd18xKSArIGRlc19TY2FuT2ZmZXQ7Ci0gICAgICBQaXhlbFdlaWdodCogcFdlaWdodCA9IG1fV2VpZ2h0VmVydC5HZXRQaXhlbFdlaWdodChkZXNfcm93XzEgLSBkZXNfdG9wKTsKLSAgICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5fc3JjMSA9Ci0gICAgICAgICAgcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUocFdlaWdodC0+bV9TcmNTdGFydCArIGRlc190b3ApICsKLSAgICAgICAgICBkZXNfU2Nhbk9mZmV0OwotICAgICAgY29uc3QgdWludDhfdCogc2Nhbl9zcmMyID0KLSAgICAgICAgICBwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShwV2VpZ2h0LT5tX1NyY0VuZCArIGRlc190b3ApICsKLSAgICAgICAgICBkZXNfU2Nhbk9mZmV0OwotICAgICAgZm9yIChpbnQgZGVzX2NvbCA9IDA7IGRlc19jb2wgPCBtX3NpemVYOyBkZXNfY29sKyspIHsKLSAgICAgICAgc3dpdGNoIChwRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKSkgewotICAgICAgICAgIGNhc2UgRlhESUJfSW52YWxpZDoKLSAgICAgICAgICBjYXNlIEZYRElCXzFicHBNYXNrOgotICAgICAgICAgIGNhc2UgRlhESUJfMWJwcFJnYjoKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICBjYXNlIEZYRElCXzhicHBNYXNrOgotICAgICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjogewotICAgICAgICAgICAgaWYgKHBEZXZpY2VCaXRtYXAtPkdldFBhbGV0dGUoKSkgewotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgZGVzX2cgPSAwOwotICAgICAgICAgICAgZGVzX2cgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7Ci0gICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsKLSAgICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKGRlc19nID4+IDE2KTsKLSAgICAgICAgICB9IGJyZWFrOwotICAgICAgICAgIGNhc2UgRlhESUJfUmdiOgotICAgICAgICAgIGNhc2UgRlhESUJfUmdiMzI6IHsKLSAgICAgICAgICAgIHVpbnQzMl90IGRlc19iID0gMCwgZGVzX2cgPSAwLCBkZXNfciA9IDA7Ci0gICAgICAgICAgICBkZXNfYiArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsKLSAgICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOwotICAgICAgICAgICAgZGVzX3IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7Ci0gICAgICAgICAgICBzY2FuX3NyYzEgKz0gZGVzX0JwcCAtIDM7Ci0gICAgICAgICAgICBkZXNfYiArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsKLSAgICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOwotICAgICAgICAgICAgZGVzX3IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7Ci0gICAgICAgICAgICBzY2FuX3NyYzIgKz0gZGVzX0JwcCAtIDM7Ci0gICAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX2IpID4+IDE2KTsKLSAgICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfZykgPj4gMTYpOwotICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19yKSA+PiAxNik7Ci0gICAgICAgICAgICBzY2FuX2RlcyArPSBkZXNfQnBwIC0gMzsKLSAgICAgICAgICB9IGJyZWFrOwotICAgICAgICAgIGNhc2UgRlhESUJfQXJnYjogewotICAgICAgICAgICAgdWludDMyX3QgZGVzX2EgPSAwLCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOwotICAgICAgICAgICAgZGVzX2IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7Ci0gICAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsKLSAgICAgICAgICAgIGRlc19yICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOwotICAgICAgICAgICAgZGVzX2EgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzBdICogKCpzY2FuX3NyYzErKyk7Ci0gICAgICAgICAgICBkZXNfYiArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsKLSAgICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOwotICAgICAgICAgICAgZGVzX3IgKz0gcFdlaWdodC0+bV9XZWlnaHRzWzFdICogKCpzY2FuX3NyYzIrKyk7Ci0gICAgICAgICAgICBkZXNfYSArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsKLSAgICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfYikgPj4gMTYpOwotICAgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7Ci0gICAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX3IpID4+IDE2KTsKLSAgICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKChkZXNfYSkgPj4gMTYpOwotICAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KKyAgaW50IGRlc190b3AgPSBtX3N0YXJ0WTsKKyAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQ+IGNoZWNrX2Rlc19yb3dfMSA9IGRlc19yb3c7CisgIGNoZWNrX2Rlc19yb3dfMSAtPSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxpbnQ+KHNjYWxlX3kpOworICBpbnQgZGVzX3Jvd18xID0gY2hlY2tfZGVzX3Jvd18xLlZhbHVlT3JEaWUoKTsKKyAgaWYgKGRlc19yb3dfMSA8IGRlc190b3ApIHsKICAgICBpbnQgZGVzX2JvdHRvbSA9IGRlc190b3AgKyBtX3NpemVZOwogICAgIGlmIChkZXNfcm93ICsgKGludClzY2FsZV95ID49IGRlc19ib3R0b20gLSAxKSB7CiAgICAgICB1aW50OF90KiBzY2FuX3NyYyA9CkBAIC0xNzQwLDMxICsxNjk3LDkwIEBACiAgICAgICAgIHVpbnQ4X3QqIHNjYW5fZGVzID0KICAgICAgICAgICAgICh1aW50OF90KilwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93KSArIGRlc19TY2FuT2ZmZXQ7CiAgICAgICAgIHVpbnQzMl90IHNpemUgPSBtX3NpemVYICogZGVzX0JwcDsKLSAgICAgICAgRlhTWVNfbWVtbW92ZShzY2FuX2Rlcywgc2Nhbl9zcmMsIHNpemUpOworICAgICAgICBtZW1tb3ZlKHNjYW5fZGVzLCBzY2FuX3NyYywgc2l6ZSk7CiAgICAgICB9CiAgICAgfQogICAgIHJldHVybjsKICAgfQotICBpbnQgbXVsdGlwbGUgPSAoaW50KUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXNjYWxlX3kgLSAxKTsKLSAgaWYgKG11bHRpcGxlID4gMCkgeworICBmb3IgKDsgZGVzX3Jvd18xIDwgZGVzX3JvdzsgZGVzX3Jvd18xKyspIHsKKyAgICB1aW50OF90KiBzY2FuX2RlcyA9CisgICAgICAgICh1aW50OF90KilwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShkZXNfcm93XzEpICsgZGVzX1NjYW5PZmZldDsKKyAgICBQaXhlbFdlaWdodCogcFdlaWdodCA9IG1fV2VpZ2h0VmVydC5HZXRQaXhlbFdlaWdodChkZXNfcm93XzEgLSBkZXNfdG9wKTsKKyAgICBjb25zdCB1aW50OF90KiBzY2FuX3NyYzEgPQorICAgICAgICBwRGV2aWNlQml0bWFwLT5HZXRTY2FubGluZShwV2VpZ2h0LT5tX1NyY1N0YXJ0ICsgZGVzX3RvcCkgKworICAgICAgICBkZXNfU2Nhbk9mZmV0OworICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5fc3JjMiA9CisgICAgICAgIHBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKHBXZWlnaHQtPm1fU3JjRW5kICsgZGVzX3RvcCkgKyBkZXNfU2Nhbk9mZmV0OworICAgIGZvciAoaW50IGRlc19jb2wgPSAwOyBkZXNfY29sIDwgbV9zaXplWDsgZGVzX2NvbCsrKSB7CisgICAgICBzd2l0Y2ggKHBEZXZpY2VCaXRtYXAtPkdldEZvcm1hdCgpKSB7CisgICAgICAgIGNhc2UgRlhESUJfSW52YWxpZDoKKyAgICAgICAgY2FzZSBGWERJQl8xYnBwTWFzazoKKyAgICAgICAgY2FzZSBGWERJQl8xYnBwUmdiOgorICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazoKKyAgICAgICAgY2FzZSBGWERJQl84YnBwUmdiOiB7CisgICAgICAgICAgaWYgKHBEZXZpY2VCaXRtYXAtPkdldFBhbGV0dGUoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICBpbnQgZGVzX2cgPSAwOworICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOworICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1sxXSAqICgqc2Nhbl9zcmMyKyspOworICAgICAgICAgICpzY2FuX2RlcysrID0gKHVpbnQ4X3QpKGRlc19nID4+IDE2KTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBGWERJQl9SZ2I6CisgICAgICAgIGNhc2UgRlhESUJfUmdiMzI6IHsKKyAgICAgICAgICB1aW50MzJfdCBkZXNfYiA9IDAsIGRlc19nID0gMCwgZGVzX3IgPSAwOworICAgICAgICAgIGRlc19iICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOworICAgICAgICAgIGRlc19nICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOworICAgICAgICAgIGRlc19yICs9IHBXZWlnaHQtPm1fV2VpZ2h0c1swXSAqICgqc2Nhbl9zcmMxKyspOworICAgICAgICAgIHNjYW5fc3JjMSArPSBkZXNfQnBwIC0gMzsKKyAgICAgICAgICBkZXNfYiArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsKKyAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsKKyAgICAgICAgICBkZXNfciArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsKKyAgICAgICAgICBzY2FuX3NyYzIgKz0gZGVzX0JwcCAtIDM7CisgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19iKSA+PiAxNik7CisgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19nKSA+PiAxNik7CisgICAgICAgICAgKnNjYW5fZGVzKysgPSAodWludDhfdCkoKGRlc19yKSA+PiAxNik7CisgICAgICAgICAgc2Nhbl9kZXMgKz0gZGVzX0JwcCAtIDM7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRlhESUJfQXJnYjogeworICAgICAgICAgIHVpbnQzMl90IGRlc19hID0gMCwgZGVzX2IgPSAwLCBkZXNfZyA9IDAsIGRlc19yID0gMDsKKyAgICAgICAgICBkZXNfYiArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsKKyAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsKKyAgICAgICAgICBkZXNfciArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsKKyAgICAgICAgICBkZXNfYSArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMF0gKiAoKnNjYW5fc3JjMSsrKTsKKyAgICAgICAgICBkZXNfYiArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsKKyAgICAgICAgICBkZXNfZyArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsKKyAgICAgICAgICBkZXNfciArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsKKyAgICAgICAgICBkZXNfYSArPSBwV2VpZ2h0LT5tX1dlaWdodHNbMV0gKiAoKnNjYW5fc3JjMisrKTsKKyAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX2IpID4+IDE2KTsKKyAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX2cpID4+IDE2KTsKKyAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX3IpID4+IDE2KTsKKyAgICAgICAgICAqc2Nhbl9kZXMrKyA9ICh1aW50OF90KSgoZGVzX2EpID4+IDE2KTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisgIGludCBkZXNfYm90dG9tID0gZGVzX3RvcCArIG1fc2l6ZVk7CisgIGlmIChkZXNfcm93ICsgKGludClzY2FsZV95ID49IGRlc19ib3R0b20gLSAxKSB7CiAgICAgdWludDhfdCogc2Nhbl9zcmMgPQogICAgICAgICAodWludDhfdCopcERldmljZUJpdG1hcC0+R2V0U2NhbmxpbmUoZGVzX3JvdykgKyBkZXNfU2Nhbk9mZmV0OwotICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG11bHRpcGxlOyBpKyspIHsKLSAgICAgIGlmIChkZXNfcm93ICsgaSA+PSBtX3N0YXJ0WSArIG1fc2l6ZVkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQorICAgIHdoaWxlICgrK2Rlc19yb3cgPCBkZXNfYm90dG9tKSB7CiAgICAgICB1aW50OF90KiBzY2FuX2RlcyA9Ci0gICAgICAgICAgKHVpbnQ4X3QqKXBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKGRlc19yb3cgKyBpKSArIGRlc19TY2FuT2ZmZXQ7CisgICAgICAgICAgKHVpbnQ4X3QqKXBEZXZpY2VCaXRtYXAtPkdldFNjYW5saW5lKGRlc19yb3cpICsgZGVzX1NjYW5PZmZldDsKICAgICAgIHVpbnQzMl90IHNpemUgPSBtX3NpemVYICogZGVzX0JwcDsKLSAgICAgIEZYU1lTX21lbW1vdmUoc2Nhbl9kZXMsIHNjYW5fc3JjLCBzaXplKTsKKyAgICAgIG1lbW1vdmUoc2Nhbl9kZXMsIHNjYW5fc3JjLCBzaXplKTsKICAgICB9CiAgIH0KIH0KIAotdm9pZCBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpSZXNhbXBsZShDRlhfRElCaXRtYXAqIHBEZXZpY2VCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjX2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWENvZGVjX0Zvcm1hdCBzcmNfZm9ybWF0KSB7Cit2b2lkIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlJlc2FtcGxlKAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwRGV2aWNlQml0bWFwLAorICAgIGludDMyX3Qgc3JjX2xpbmUsCisgICAgdWludDhfdCogc3JjX3NjYW4sCisgICAgRlhDb2RlY19Gb3JtYXQgc3JjX2Zvcm1hdCkgewogICBpbnQgc3JjX3RvcCA9IG1fY2xpcEJveC50b3A7CiAgIGludCBkZXNfdG9wID0gbV9zdGFydFk7CiAgIGludCBzcmNfaGVpID0gbV9jbGlwQm94LkhlaWdodCgpOwpAQCAtMTc4Myw3MiArMTc5OSw2NCBAQAogICB9CiB9CiAKLUZYQ09ERUNfU1RBVFVTIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkdldEZyYW1lcyhpbnQzMl90JiBmcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKK3N0ZDo6cGFpcjxGWENPREVDX1NUQVRVUywgc2l6ZV90PiBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpHZXRGcmFtZXMoKSB7CiAgIGlmICghKG1fc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1JFQURZIHx8CiAgICAgICAgIG1fc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1RPQkVDT05USU5VRSkpIHsKLSAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisgICAgcmV0dXJuIHtGWENPREVDX1NUQVRVU19FUlJPUiwgMH07CiAgIH0KKwogICBzd2l0Y2ggKG1faW1hZ1R5cGUpIHsKICAgICBjYXNlIEZYQ09ERUNfSU1BR0VfSlBHOgogICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9CTVA6CiAgICAgY2FzZSBGWENPREVDX0lNQUdFX1BORzoKICAgICBjYXNlIEZYQ09ERUNfSU1BR0VfVElGOgotICAgICAgZnJhbWVzID0gbV9GcmFtZU51bWJlciA9IDE7CisgICAgICBtX0ZyYW1lTnVtYmVyID0gMTsKICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1JFQURZOwotICAgICAgcmV0dXJuIG1fc3RhdHVzOworICAgICAgcmV0dXJuIHttX3N0YXR1cywgMX07CiAgICAgY2FzZSBGWENPREVDX0lNQUdFX0dJRjogewotICAgICAgSUNvZGVjX0dpZk1vZHVsZSogcEdpZk1vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRHaWZNb2R1bGUoKTsKKyAgICAgIENDb2RlY19HaWZNb2R1bGUqIHBHaWZNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0R2lmTW9kdWxlKCk7CiAgICAgICBpZiAoIXBHaWZNb2R1bGUpIHsKICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOwotICAgICAgICByZXR1cm4gbV9zdGF0dXM7CisgICAgICAgIHJldHVybiB7bV9zdGF0dXMsIDB9OwogICAgICAgfQogICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaW50MzJfdCByZWFkUmVzdWx0ID0KLSAgICAgICAgICAgIHBHaWZNb2R1bGUtPkxvYWRGcmFtZUluZm8obV9wR2lmQ29udGV4dCwgJm1fRnJhbWVOdW1iZXIpOwotICAgICAgICB3aGlsZSAocmVhZFJlc3VsdCA9PSAyKSB7CisgICAgICAgIENGWF9HaWZEZWNvZGVTdGF0dXMgcmVhZFJlc3VsdDsKKyAgICAgICAgc3RkOjp0aWUocmVhZFJlc3VsdCwgbV9GcmFtZU51bWJlcikgPQorICAgICAgICAgICAgcEdpZk1vZHVsZS0+TG9hZEZyYW1lSW5mbyhtX3BHaWZDb250ZXh0LmdldCgpKTsKKyAgICAgICAgd2hpbGUgKHJlYWRSZXN1bHQgPT0gQ0ZYX0dpZkRlY29kZVN0YXR1czo6VW5maW5pc2hlZCkgewogICAgICAgICAgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEOwotICAgICAgICAgIGlmICghR2lmUmVhZE1vcmVEYXRhKHBHaWZNb2R1bGUsIGVycm9yX3N0YXR1cykpIHsKLSAgICAgICAgICAgIHJldHVybiBlcnJvcl9zdGF0dXM7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1RPQkVDT05USU5VRTsKLSAgICAgICAgICAgIHJldHVybiBtX3N0YXR1czsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmVhZFJlc3VsdCA9IHBHaWZNb2R1bGUtPkxvYWRGcmFtZUluZm8obV9wR2lmQ29udGV4dCwgJm1fRnJhbWVOdW1iZXIpOworICAgICAgICAgIGlmICghR2lmUmVhZE1vcmVEYXRhKHBHaWZNb2R1bGUsIGVycm9yX3N0YXR1cykpCisgICAgICAgICAgICByZXR1cm4ge2Vycm9yX3N0YXR1cywgMH07CisKKyAgICAgICAgICBzdGQ6OnRpZShyZWFkUmVzdWx0LCBtX0ZyYW1lTnVtYmVyKSA9CisgICAgICAgICAgICAgIHBHaWZNb2R1bGUtPkxvYWRGcmFtZUluZm8obV9wR2lmQ29udGV4dC5nZXQoKSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHJlYWRSZXN1bHQgPT0gMSkgewotICAgICAgICAgIGZyYW1lcyA9IG1fRnJhbWVOdW1iZXI7CisgICAgICAgIGlmIChyZWFkUmVzdWx0ID09IENGWF9HaWZEZWNvZGVTdGF0dXM6OlN1Y2Nlc3MpIHsKICAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9SRUFEWTsKLSAgICAgICAgICByZXR1cm4gbV9zdGF0dXM7CisgICAgICAgICAgcmV0dXJuIHttX3N0YXR1cywgbV9GcmFtZU51bWJlcn07CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1fcEdpZkNvbnRleHQpIHsKLSAgICAgICAgICBwR2lmTW9kdWxlLT5GaW5pc2gobV9wR2lmQ29udGV4dCk7Ci0gICAgICAgICAgbV9wR2lmQ29udGV4dCA9IG51bGxwdHI7Ci0gICAgICAgIH0KKyAgICAgICAgbV9wR2lmQ29udGV4dCA9IG51bGxwdHI7CiAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7Ci0gICAgICAgIHJldHVybiBtX3N0YXR1czsKKyAgICAgICAgcmV0dXJuIHttX3N0YXR1cywgMH07CiAgICAgICB9CiAgICAgfQogICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisgICAgICByZXR1cm4ge0ZYQ09ERUNfU1RBVFVTX0VSUk9SLCAwfTsKICAgfQogfQogCi1GWENPREVDX1NUQVRVUyBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpTdGFydERlY29kZShDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSW50ZXJwb2wpIHsKK0ZYQ09ERUNfU1RBVFVTIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlN0YXJ0RGVjb2RlKAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwRElCaXRtYXAsCisgICAgaW50IHN0YXJ0X3gsCisgICAgaW50IHN0YXJ0X3ksCisgICAgaW50IHNpemVfeCwKKyAgICBpbnQgc2l6ZV95KSB7CiAgIGlmIChtX3N0YXR1cyAhPSBGWENPREVDX1NUQVRVU19ERUNPREVfUkVBRFkpCiAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOwogCi0gIGlmICghcERJQml0bWFwIHx8IHBESUJpdG1hcC0+R2V0QlBQKCkgPCA4IHx8IGZyYW1lcyA8IDAgfHwKLSAgICAgIGZyYW1lcyA+PSBtX0ZyYW1lTnVtYmVyKSB7CisgIGlmICghcERJQml0bWFwIHx8IHBESUJpdG1hcC0+R2V0QlBQKCkgPCA4IHx8IG1fRnJhbWVOdW1iZXIgPT0gMCkKICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJSX1BBUkFNUzsKLSAgfQorCiAgIG1fcERldmljZUJpdG1hcCA9IHBESUJpdG1hcDsKICAgaWYgKG1fY2xpcEJveC5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVM7CkBAIC0xODY4LDE3MSArMTg3NiwzNyBAQAogICBtX3N0YXJ0WSA9IGRldmljZV9yYy50b3A7CiAgIG1fc2l6ZVggPSBkZXZpY2VfcmMuV2lkdGgoKTsKICAgbV9zaXplWSA9IGRldmljZV9yYy5IZWlnaHQoKTsKLSAgbV9iSW50ZXJwb2wgPSBiSW50ZXJwb2w7CiAgIG1fRnJhbWVDdXIgPSAwOwogICBpZiAoc3RhcnRfeCA8IDAgfHwgb3V0X3JhbmdlX3ggPiAwKSB7Ci0gICAgRlhfRkxPQVQgc2NhbGVYID0gKEZYX0ZMT0FUKW1fY2xpcEJveC5XaWR0aCgpIC8gKEZYX0ZMT0FUKXNpemVfeDsKKyAgICBmbG9hdCBzY2FsZVggPSAoZmxvYXQpbV9jbGlwQm94LldpZHRoKCkgLyAoZmxvYXQpc2l6ZV94OwogICAgIGlmIChzdGFydF94IDwgMCkgewotICAgICAgbV9jbGlwQm94LmxlZnQgLT0gKGludDMyX3QpRlhTWVNfY2VpbCgoRlhfRkxPQVQpc3RhcnRfeCAqIHNjYWxlWCk7CisgICAgICBtX2NsaXBCb3gubGVmdCAtPSAoaW50MzJfdCljZWlsKChmbG9hdClzdGFydF94ICogc2NhbGVYKTsKICAgICB9CiAgICAgaWYgKG91dF9yYW5nZV94ID4gMCkgewotICAgICAgbV9jbGlwQm94LnJpZ2h0IC09IChpbnQzMl90KUZYU1lTX2Zsb29yKChGWF9GTE9BVClvdXRfcmFuZ2VfeCAqIHNjYWxlWCk7CisgICAgICBtX2NsaXBCb3gucmlnaHQgLT0gKGludDMyX3QpZmxvb3IoKGZsb2F0KW91dF9yYW5nZV94ICogc2NhbGVYKTsKICAgICB9CiAgIH0KICAgaWYgKHN0YXJ0X3kgPCAwIHx8IG91dF9yYW5nZV95ID4gMCkgewotICAgIEZYX0ZMT0FUIHNjYWxlWSA9IChGWF9GTE9BVCltX2NsaXBCb3guSGVpZ2h0KCkgLyAoRlhfRkxPQVQpc2l6ZV95OworICAgIGZsb2F0IHNjYWxlWSA9IChmbG9hdCltX2NsaXBCb3guSGVpZ2h0KCkgLyAoZmxvYXQpc2l6ZV95OwogICAgIGlmIChzdGFydF95IDwgMCkgewotICAgICAgbV9jbGlwQm94LnRvcCAtPSAoaW50MzJfdClGWFNZU19jZWlsKChGWF9GTE9BVClzdGFydF95ICogc2NhbGVZKTsKKyAgICAgIG1fY2xpcEJveC50b3AgLT0gKGludDMyX3QpY2VpbCgoZmxvYXQpc3RhcnRfeSAqIHNjYWxlWSk7CiAgICAgfQogICAgIGlmIChvdXRfcmFuZ2VfeSA+IDApIHsKLSAgICAgIG1fY2xpcEJveC5ib3R0b20gLT0gKGludDMyX3QpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKW91dF9yYW5nZV95ICogc2NhbGVZKTsKKyAgICAgIG1fY2xpcEJveC5ib3R0b20gLT0gKGludDMyX3QpZmxvb3IoKGZsb2F0KW91dF9yYW5nZV95ICogc2NhbGVZKTsKICAgICB9CiAgIH0KICAgaWYgKG1fY2xpcEJveC5Jc0VtcHR5KCkpIHsKICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJSX1BBUkFNUzsKICAgfQogICBzd2l0Y2ggKG1faW1hZ1R5cGUpIHsKLSAgICBjYXNlIEZYQ09ERUNfSU1BR0VfSlBHOiB7Ci0gICAgICBDQ29kZWNfSnBlZ01vZHVsZSogcEpwZWdNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0SnBlZ01vZHVsZSgpOwotICAgICAgaW50IGRvd25fc2NhbGUgPSAxOwotICAgICAgR2V0RG93blNjYWxlKGRvd25fc2NhbGUpOwotICAgICAgYm9vbCBiU3RhcnQgPSBwSnBlZ01vZHVsZS0+U3RhcnRTY2FubGluZShtX3BKcGVnQ29udGV4dCwgZG93bl9zY2FsZSk7Ci0gICAgICB3aGlsZSAoIWJTdGFydCkgewotICAgICAgICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsKLSAgICAgICAgaWYgKCFKcGVnUmVhZE1vcmVEYXRhKHBKcGVnTW9kdWxlLCBlcnJvcl9zdGF0dXMpKSB7Ci0gICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gbnVsbHB0cjsKLSAgICAgICAgICBtX3BGaWxlID0gbnVsbHB0cjsKLSAgICAgICAgICBtX3N0YXR1cyA9IGVycm9yX3N0YXR1czsKLSAgICAgICAgICByZXR1cm4gbV9zdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgYlN0YXJ0ID0gcEpwZWdNb2R1bGUtPlN0YXJ0U2NhbmxpbmUobV9wSnBlZ0NvbnRleHQsIGRvd25fc2NhbGUpOwotICAgICAgfQotICAgICAgaW50IHNjYW5saW5lX3NpemUgPSAobV9TcmNXaWR0aCArIGRvd25fc2NhbGUgLSAxKSAvIGRvd25fc2NhbGU7Ci0gICAgICBzY2FubGluZV9zaXplID0gKHNjYW5saW5lX3NpemUgKiBtX1NyY0NvbXBvbmVudHMgKyAzKSAvIDQgKiA0OwotICAgICAgRlhfRnJlZShtX3BEZWNvZGVCdWYpOwotICAgICAgbV9wRGVjb2RlQnVmID0gRlhfQWxsb2ModWludDhfdCwgc2NhbmxpbmVfc2l6ZSk7Ci0gICAgICBGWFNZU19tZW1zZXQobV9wRGVjb2RlQnVmLCAwLCBzY2FubGluZV9zaXplKTsKLSAgICAgIG1fV2VpZ2h0SG9yei5DYWxjKG1fc2l6ZVgsIDAsIG1fc2l6ZVgsIG1fY2xpcEJveC5XaWR0aCgpLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgbV9jbGlwQm94LldpZHRoKCksIG1fYkludGVycG9sKTsKLSAgICAgIG1fV2VpZ2h0VmVydC5DYWxjKG1fc2l6ZVksIG1fY2xpcEJveC5IZWlnaHQoKSk7Ci0gICAgICBzd2l0Y2ggKG1fU3JjQ29tcG9uZW50cykgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjXzhicHBHcmF5OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjX1JnYjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgIG1fU3JjRm9ybWF0ID0gRlhDb2RlY19DbXlrOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgR2V0VHJhbnNNZXRob2QocERJQml0bWFwLT5HZXRGb3JtYXQoKSwgbV9TcmNGb3JtYXQpOwotICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgICAgcmV0dXJuIG1fc3RhdHVzOwotICAgIH0KLSAgICBjYXNlIEZYQ09ERUNfSU1BR0VfUE5HOiB7Ci0gICAgICBJQ29kZWNfUG5nTW9kdWxlKiBwUG5nTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldFBuZ01vZHVsZSgpOwotICAgICAgaWYgKCFwUG5nTW9kdWxlKSB7Ci0gICAgICAgIG1fcERldmljZUJpdG1hcCA9IG51bGxwdHI7Ci0gICAgICAgIG1fcEZpbGUgPSBudWxscHRyOwotICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7Ci0gICAgICAgIHJldHVybiBtX3N0YXR1czsKLSAgICAgIH0KLSAgICAgIGlmIChtX3BQbmdDb250ZXh0KSB7Ci0gICAgICAgIHBQbmdNb2R1bGUtPkZpbmlzaChtX3BQbmdDb250ZXh0KTsKLSAgICAgICAgbV9wUG5nQ29udGV4dCA9IG51bGxwdHI7Ci0gICAgICB9Ci0gICAgICBtX3BQbmdDb250ZXh0ID0gcFBuZ01vZHVsZS0+U3RhcnQoKTsKLSAgICAgIGlmICghbV9wUG5nQ29udGV4dCkgewotICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBudWxscHRyOwotICAgICAgICBtX3BGaWxlID0gbnVsbHB0cjsKLSAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOwotICAgICAgICByZXR1cm4gbV9zdGF0dXM7Ci0gICAgICB9Ci0gICAgICBtX29mZlNldCA9IDA7Ci0gICAgICBzd2l0Y2ggKG1fcERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsKLSAgICAgICAgY2FzZSBGWERJQl84YnBwTWFzazoKLSAgICAgICAgY2FzZSBGWERJQl84YnBwUmdiOgotICAgICAgICAgIG1fU3JjQ29tcG9uZW50cyA9IDE7Ci0gICAgICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjXzhicHBHcmF5OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYRElCX1JnYjoKLSAgICAgICAgICBtX1NyY0NvbXBvbmVudHMgPSAzOwotICAgICAgICAgIG1fU3JjRm9ybWF0ID0gRlhDb2RlY19SZ2I7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfUmdiMzI6Ci0gICAgICAgIGNhc2UgRlhESUJfQXJnYjoKLSAgICAgICAgICBtX1NyY0NvbXBvbmVudHMgPSA0OwotICAgICAgICAgIG1fU3JjRm9ybWF0ID0gRlhDb2RlY19BcmdiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gbnVsbHB0cjsKLSAgICAgICAgICBtX3BGaWxlID0gbnVsbHB0cjsKLSAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVM7Ci0gICAgICAgICAgcmV0dXJuIG1fc3RhdHVzOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBHZXRUcmFuc01ldGhvZChtX3BEZXZpY2VCaXRtYXAtPkdldEZvcm1hdCgpLCBtX1NyY0Zvcm1hdCk7Ci0gICAgICBpbnQgc2NhbmxpbmVfc2l6ZSA9IChtX1NyY1dpZHRoICogbV9TcmNDb21wb25lbnRzICsgMykgLyA0ICogNDsKLSAgICAgIEZYX0ZyZWUobV9wRGVjb2RlQnVmKTsKLSAgICAgIG1fcERlY29kZUJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNjYW5saW5lX3NpemUpOwotICAgICAgRlhTWVNfbWVtc2V0KG1fcERlY29kZUJ1ZiwgMCwgc2NhbmxpbmVfc2l6ZSk7Ci0gICAgICBtX1dlaWdodEhvcnpPTy5DYWxjKG1fc2l6ZVgsIG1fY2xpcEJveC5XaWR0aCgpLCBtX2JJbnRlcnBvbCk7Ci0gICAgICBtX1dlaWdodFZlcnQuQ2FsYyhtX3NpemVZLCBtX2NsaXBCb3guSGVpZ2h0KCkpOwotICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgICAgcmV0dXJuIG1fc3RhdHVzOwotICAgIH0KLSAgICBjYXNlIEZYQ09ERUNfSU1BR0VfR0lGOiB7Ci0gICAgICBJQ29kZWNfR2lmTW9kdWxlKiBwR2lmTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldEdpZk1vZHVsZSgpOwotICAgICAgaWYgKCFwR2lmTW9kdWxlKSB7Ci0gICAgICAgIG1fcERldmljZUJpdG1hcCA9IG51bGxwdHI7Ci0gICAgICAgIG1fcEZpbGUgPSBudWxscHRyOwotICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7Ci0gICAgICAgIHJldHVybiBtX3N0YXR1czsKLSAgICAgIH0KLSAgICAgIG1fU3JjRm9ybWF0ID0gRlhDb2RlY184YnBwUmdiOwotICAgICAgR2V0VHJhbnNNZXRob2QobV9wRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKSwgbV9TcmNGb3JtYXQpOwotICAgICAgaW50IHNjYW5saW5lX3NpemUgPSAobV9TcmNXaWR0aCArIDMpIC8gNCAqIDQ7Ci0gICAgICBGWF9GcmVlKG1fcERlY29kZUJ1Zik7Ci0gICAgICBtX3BEZWNvZGVCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBzY2FubGluZV9zaXplKTsKLSAgICAgIEZYU1lTX21lbXNldChtX3BEZWNvZGVCdWYsIDAsIHNjYW5saW5lX3NpemUpOwotICAgICAgbV9XZWlnaHRIb3J6LkNhbGMobV9zaXplWCwgMCwgbV9zaXplWCwgbV9jbGlwQm94LldpZHRoKCksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2NsaXBCb3guV2lkdGgoKSwgbV9iSW50ZXJwb2wpOwotICAgICAgbV9XZWlnaHRWZXJ0LkNhbGMobV9zaXplWSwgbV9jbGlwQm94LkhlaWdodCgpKTsKLSAgICAgIG1fRnJhbWVDdXIgPSBmcmFtZXM7Ci0gICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7Ci0gICAgICByZXR1cm4gbV9zdGF0dXM7Ci0gICAgfQotICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9CTVA6IHsKLSAgICAgIElDb2RlY19CbXBNb2R1bGUqIHBCbXBNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0Qm1wTW9kdWxlKCk7Ci0gICAgICBpZiAoIXBCbXBNb2R1bGUpIHsKLSAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gbnVsbHB0cjsKLSAgICAgICAgbV9wRmlsZSA9IG51bGxwdHI7Ci0gICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsKLSAgICAgICAgcmV0dXJuIG1fc3RhdHVzOwotICAgICAgfQotICAgICAgc3dpdGNoIChtX1NyY0NvbXBvbmVudHMpIHsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgIG1fU3JjRm9ybWF0ID0gRlhDb2RlY184YnBwUmdiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjX1JnYjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgIG1fU3JjRm9ybWF0ID0gRlhDb2RlY19SZ2IzMjsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIEdldFRyYW5zTWV0aG9kKG1fcERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCksIG1fU3JjRm9ybWF0KTsKLSAgICAgIG1fU2NhbmxpbmVTaXplID0gKG1fU3JjV2lkdGggKiBtX1NyY0NvbXBvbmVudHMgKyAzKSAvIDQgKiA0OwotICAgICAgRlhfRnJlZShtX3BEZWNvZGVCdWYpOwotICAgICAgbV9wRGVjb2RlQnVmID0gRlhfQWxsb2ModWludDhfdCwgbV9TY2FubGluZVNpemUpOwotICAgICAgRlhTWVNfbWVtc2V0KG1fcERlY29kZUJ1ZiwgMCwgbV9TY2FubGluZVNpemUpOwotICAgICAgbV9XZWlnaHRIb3J6LkNhbGMobV9zaXplWCwgMCwgbV9zaXplWCwgbV9jbGlwQm94LldpZHRoKCksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBtX2NsaXBCb3guV2lkdGgoKSwgbV9iSW50ZXJwb2wpOwotICAgICAgbV9XZWlnaHRWZXJ0LkNhbGMobV9zaXplWSwgbV9jbGlwQm94LkhlaWdodCgpKTsKLSAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKLSAgICAgIHJldHVybiBtX3N0YXR1czsKLSAgICB9CisgICAgY2FzZSBGWENPREVDX0lNQUdFX0pQRzoKKyAgICAgIHJldHVybiBKcGVnU3RhcnREZWNvZGUocERJQml0bWFwKTsKKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfUE5HOgorICAgICAgcmV0dXJuIFBuZ1N0YXJ0RGVjb2RlKHBESUJpdG1hcCk7CisgICAgY2FzZSBGWENPREVDX0lNQUdFX0dJRjoKKyAgICAgIHJldHVybiBHaWZTdGFydERlY29kZShwRElCaXRtYXApOworICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9CTVA6CisgICAgICByZXR1cm4gQm1wU3RhcnREZWNvZGUocERJQml0bWFwKTsKICAgICBjYXNlIEZYQ09ERUNfSU1BR0VfVElGOgogICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwogICAgICAgcmV0dXJuIG1fc3RhdHVzOwpAQCAtMjA0MSwzMTIgKzE5MTUsNDU1IEBACiAgIH0KIH0KIAotRlhDT0RFQ19TVEFUVVMgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6Q29udGludWVEZWNvZGUoSUZYX1BhdXNlKiBwUGF1c2UpIHsKK0ZYQ09ERUNfU1RBVFVTIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkpwZWdTdGFydERlY29kZSgKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcERJQml0bWFwKSB7CisgIGludCBkb3duX3NjYWxlID0gMTsKKyAgR2V0RG93blNjYWxlKGRvd25fc2NhbGUpOworICAvLyBTZXR0aW5nIGp1bXAgbWFya2VyIGJlZm9yZSBjYWxsaW5nIFN0YXJ0U2NhbkxpbmUsIHNpbmNlIGEgbG9uZ2ptcCB0bworICAvLyB0aGUgbWFya2VyIGluZGljYXRlcyBhIGZhdGFsIGVycm9yLgorICBpZiAoc2V0am1wKCptX3BKcGVnQ29udGV4dC0+R2V0SnVtcE1hcmsoKSkgPT0gLTEpIHsKKyAgICBtX3BKcGVnQ29udGV4dC5yZXNldCgpOworICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOworICB9CisKKyAgQ0NvZGVjX0pwZWdNb2R1bGUqIHBKcGVnTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldEpwZWdNb2R1bGUoKTsKKyAgYm9vbCBzdGFydFN0YXR1cyA9CisgICAgICBwSnBlZ01vZHVsZS0+U3RhcnRTY2FubGluZShtX3BKcGVnQ29udGV4dC5nZXQoKSwgZG93bl9zY2FsZSk7CisgIHdoaWxlICghc3RhcnRTdGF0dXMpIHsKKyAgICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsKKyAgICBpZiAoIUpwZWdSZWFkTW9yZURhdGEocEpwZWdNb2R1bGUsIGVycm9yX3N0YXR1cykpIHsKKyAgICAgIG1fcERldmljZUJpdG1hcCA9IG51bGxwdHI7CisgICAgICBtX3BGaWxlID0gbnVsbHB0cjsKKyAgICAgIG1fc3RhdHVzID0gZXJyb3Jfc3RhdHVzOworICAgICAgcmV0dXJuIG1fc3RhdHVzOworICAgIH0KKworICAgIHN0YXJ0U3RhdHVzID0gcEpwZWdNb2R1bGUtPlN0YXJ0U2NhbmxpbmUobV9wSnBlZ0NvbnRleHQuZ2V0KCksIGRvd25fc2NhbGUpOworICB9CisgIGludCBzY2FubGluZV9zaXplID0gKG1fU3JjV2lkdGggKyBkb3duX3NjYWxlIC0gMSkgLyBkb3duX3NjYWxlOworICBzY2FubGluZV9zaXplID0gKHNjYW5saW5lX3NpemUgKiBtX1NyY0NvbXBvbmVudHMgKyAzKSAvIDQgKiA0OworICBGWF9GcmVlKG1fcERlY29kZUJ1Zik7CisgIG1fcERlY29kZUJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNjYW5saW5lX3NpemUpOworICBtZW1zZXQobV9wRGVjb2RlQnVmLCAwLCBzY2FubGluZV9zaXplKTsKKyAgbV9XZWlnaHRIb3J6LkNhbGMobV9zaXplWCwgMCwgbV9zaXplWCwgbV9jbGlwQm94LldpZHRoKCksIDAsCisgICAgICAgICAgICAgICAgICAgIG1fY2xpcEJveC5XaWR0aCgpKTsKKyAgbV9XZWlnaHRWZXJ0LkNhbGMobV9zaXplWSwgbV9jbGlwQm94LkhlaWdodCgpKTsKKyAgc3dpdGNoIChtX1NyY0NvbXBvbmVudHMpIHsKKyAgICBjYXNlIDE6CisgICAgICBtX1NyY0Zvcm1hdCA9IEZYQ29kZWNfOGJwcEdyYXk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBtX1NyY0Zvcm1hdCA9IEZYQ29kZWNfUmdiOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgbV9TcmNGb3JtYXQgPSBGWENvZGVjX0NteWs7CisgICAgICBicmVhazsKKyAgfQorICBHZXRUcmFuc01ldGhvZChwRElCaXRtYXAtPkdldEZvcm1hdCgpLCBtX1NyY0Zvcm1hdCk7CisgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKKyAgcmV0dXJuIG1fc3RhdHVzOworfQorCitGWENPREVDX1NUQVRVUyBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpQbmdTdGFydERlY29kZSgKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcERJQml0bWFwKSB7CisgIENDb2RlY19QbmdNb2R1bGUqIHBQbmdNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0UG5nTW9kdWxlKCk7CisgIGlmICghcFBuZ01vZHVsZSkgeworICAgIG1fcERldmljZUJpdG1hcCA9IG51bGxwdHI7CisgICAgbV9wRmlsZSA9IG51bGxwdHI7CisgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOworICAgIHJldHVybiBtX3N0YXR1czsKKyAgfQorICBtX3BQbmdDb250ZXh0ID0gcFBuZ01vZHVsZS0+U3RhcnQodGhpcyk7CisgIGlmICghbV9wUG5nQ29udGV4dCkgeworICAgIG1fcERldmljZUJpdG1hcCA9IG51bGxwdHI7CisgICAgbV9wRmlsZSA9IG51bGxwdHI7CisgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOworICAgIHJldHVybiBtX3N0YXR1czsKKyAgfQorICBtX29mZlNldCA9IDA7CisgIHN3aXRjaCAobV9wRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKSkgeworICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6CisgICAgY2FzZSBGWERJQl84YnBwUmdiOgorICAgICAgbV9TcmNDb21wb25lbnRzID0gMTsKKyAgICAgIG1fU3JjRm9ybWF0ID0gRlhDb2RlY184YnBwR3JheTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfUmdiOgorICAgICAgbV9TcmNDb21wb25lbnRzID0gMzsKKyAgICAgIG1fU3JjRm9ybWF0ID0gRlhDb2RlY19SZ2I7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX1JnYjMyOgorICAgIGNhc2UgRlhESUJfQXJnYjoKKyAgICAgIG1fU3JjQ29tcG9uZW50cyA9IDQ7CisgICAgICBtX1NyY0Zvcm1hdCA9IEZYQ29kZWNfQXJnYjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IHsKKyAgICAgIG1fcERldmljZUJpdG1hcCA9IG51bGxwdHI7CisgICAgICBtX3BGaWxlID0gbnVsbHB0cjsKKyAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1BBUkFNUzsKKyAgICAgIHJldHVybiBtX3N0YXR1czsKKyAgICB9CisgIH0KKyAgR2V0VHJhbnNNZXRob2QobV9wRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKSwgbV9TcmNGb3JtYXQpOworICBpbnQgc2NhbmxpbmVfc2l6ZSA9IChtX1NyY1dpZHRoICogbV9TcmNDb21wb25lbnRzICsgMykgLyA0ICogNDsKKyAgRlhfRnJlZShtX3BEZWNvZGVCdWYpOworICBtX3BEZWNvZGVCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBzY2FubGluZV9zaXplKTsKKyAgbWVtc2V0KG1fcERlY29kZUJ1ZiwgMCwgc2NhbmxpbmVfc2l6ZSk7CisgIG1fV2VpZ2h0SG9yek9PLkNhbGMobV9zaXplWCwgbV9jbGlwQm94LldpZHRoKCkpOworICBtX1dlaWdodFZlcnQuQ2FsYyhtX3NpemVZLCBtX2NsaXBCb3guSGVpZ2h0KCkpOworICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7CisgIHJldHVybiBtX3N0YXR1czsKK30KKworRlhDT0RFQ19TVEFUVVMgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2lmU3RhcnREZWNvZGUoCisgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBESUJpdG1hcCkgeworICBDQ29kZWNfR2lmTW9kdWxlKiBwR2lmTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldEdpZk1vZHVsZSgpOworICBpZiAoIXBHaWZNb2R1bGUpIHsKKyAgICBtX3BEZXZpY2VCaXRtYXAgPSBudWxscHRyOworICAgIG1fcEZpbGUgPSBudWxscHRyOworICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsKKyAgICByZXR1cm4gbV9zdGF0dXM7CisgIH0KKyAgbV9TcmNGb3JtYXQgPSBGWENvZGVjXzhicHBSZ2I7CisgIEdldFRyYW5zTWV0aG9kKG1fcERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCksIG1fU3JjRm9ybWF0KTsKKyAgaW50IHNjYW5saW5lX3NpemUgPSAobV9TcmNXaWR0aCArIDMpIC8gNCAqIDQ7CisgIEZYX0ZyZWUobV9wRGVjb2RlQnVmKTsKKyAgbV9wRGVjb2RlQnVmID0gRlhfQWxsb2ModWludDhfdCwgc2NhbmxpbmVfc2l6ZSk7CisgIG1lbXNldChtX3BEZWNvZGVCdWYsIDAsIHNjYW5saW5lX3NpemUpOworICBtX1dlaWdodEhvcnouQ2FsYyhtX3NpemVYLCAwLCBtX3NpemVYLCBtX2NsaXBCb3guV2lkdGgoKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgbV9jbGlwQm94LldpZHRoKCkpOworICBtX1dlaWdodFZlcnQuQ2FsYyhtX3NpemVZLCBtX2NsaXBCb3guSGVpZ2h0KCkpOworICBtX0ZyYW1lQ3VyID0gMDsKKyAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOworICByZXR1cm4gbV9zdGF0dXM7Cit9CisKK0ZYQ09ERUNfU1RBVFVTIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkJtcFN0YXJ0RGVjb2RlKAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwRElCaXRtYXApIHsKKyAgQ0NvZGVjX0JtcE1vZHVsZSogcEJtcE1vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRCbXBNb2R1bGUoKTsKKyAgaWYgKCFwQm1wTW9kdWxlKSB7CisgICAgbV9wRGV2aWNlQml0bWFwID0gbnVsbHB0cjsKKyAgICBtX3BGaWxlID0gbnVsbHB0cjsKKyAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7CisgICAgcmV0dXJuIG1fc3RhdHVzOworICB9CisgIEdldFRyYW5zTWV0aG9kKG1fcERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCksIG1fU3JjRm9ybWF0KTsKKyAgbV9TY2FubGluZVNpemUgPSAobV9TcmNXaWR0aCAqIG1fU3JjQ29tcG9uZW50cyArIDMpIC8gNCAqIDQ7CisgIEZYX0ZyZWUobV9wRGVjb2RlQnVmKTsKKyAgbV9wRGVjb2RlQnVmID0gRlhfQWxsb2ModWludDhfdCwgbV9TY2FubGluZVNpemUpOworICBtZW1zZXQobV9wRGVjb2RlQnVmLCAwLCBtX1NjYW5saW5lU2l6ZSk7CisgIG1fV2VpZ2h0SG9yei5DYWxjKG1fc2l6ZVgsIDAsIG1fc2l6ZVgsIG1fY2xpcEJveC5XaWR0aCgpLCAwLAorICAgICAgICAgICAgICAgICAgICBtX2NsaXBCb3guV2lkdGgoKSk7CisgIG1fV2VpZ2h0VmVydC5DYWxjKG1fc2l6ZVksIG1fY2xpcEJveC5IZWlnaHQoKSk7CisgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKKyAgcmV0dXJuIG1fc3RhdHVzOworfQorCitGWENPREVDX1NUQVRVUyBDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyOjpDb250aW51ZURlY29kZSgpIHsKICAgaWYgKG1fc3RhdHVzICE9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpCiAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOwogCiAgIHN3aXRjaCAobV9pbWFnVHlwZSkgewotICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9KUEc6IHsKLSAgICAgIENDb2RlY19KcGVnTW9kdWxlKiBwSnBlZ01vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRKcGVnTW9kdWxlKCk7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBib29sIHJlYWRSZXMgPSBwSnBlZ01vZHVsZS0+UmVhZFNjYW5saW5lKG1fcEpwZWdDb250ZXh0LCBtX3BEZWNvZGVCdWYpOwotICAgICAgICB3aGlsZSAoIXJlYWRSZXMpIHsKLSAgICAgICAgICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotICAgICAgICAgIGlmICghSnBlZ1JlYWRNb3JlRGF0YShwSnBlZ01vZHVsZSwgZXJyb3Jfc3RhdHVzKSkgewotICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gbnVsbHB0cjsKLSAgICAgICAgICAgIG1fcEZpbGUgPSBudWxscHRyOwotICAgICAgICAgICAgbV9zdGF0dXMgPSBlcnJvcl9zdGF0dXM7Ci0gICAgICAgICAgICByZXR1cm4gbV9zdGF0dXM7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJlYWRSZXMgPSBwSnBlZ01vZHVsZS0+UmVhZFNjYW5saW5lKG1fcEpwZWdDb250ZXh0LCBtX3BEZWNvZGVCdWYpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX1NyY0Zvcm1hdCA9PSBGWENvZGVjX1JnYikgewotICAgICAgICAgIGludCBzcmNfQnBwID0gKG1fU3JjRm9ybWF0ICYgMHhmZikgPj4gMzsKLSAgICAgICAgICBSR0IyQkdSKG1fcERlY29kZUJ1ZiArIG1fY2xpcEJveC5sZWZ0ICogc3JjX0JwcCwgbV9jbGlwQm94LldpZHRoKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX1NyY1JvdyA+PSBtX2NsaXBCb3guYm90dG9tKSB7Ci0gICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gbnVsbHB0cjsKLSAgICAgICAgICBtX3BGaWxlID0gbnVsbHB0cjsKLSAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7Ci0gICAgICAgICAgcmV0dXJuIG1fc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIFJlc2FtcGxlKG1fcERldmljZUJpdG1hcCwgbV9TcmNSb3csIG1fcERlY29kZUJ1ZiwgbV9TcmNGb3JtYXQpOwotICAgICAgICBtX1NyY1JvdysrOwotICAgICAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKLSAgICAgICAgICByZXR1cm4gbV9zdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2FzZSBGWENPREVDX0lNQUdFX1BORzogewotICAgICAgSUNvZGVjX1BuZ01vZHVsZSogcFBuZ01vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRQbmdNb2R1bGUoKTsKLSAgICAgIGlmICghcFBuZ01vZHVsZSkgewotICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7Ci0gICAgICAgIHJldHVybiBtX3N0YXR1czsKLSAgICAgIH0KLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHVpbnQzMl90IHJlbWFpbl9zaXplID0gKHVpbnQzMl90KW1fcEZpbGUtPkdldFNpemUoKSAtIG1fb2ZmU2V0OwotICAgICAgICB1aW50MzJfdCBpbnB1dF9zaXplID0KLSAgICAgICAgICAgIHJlbWFpbl9zaXplID4gRlhDT0RFQ19CTE9DS19TSVpFID8gRlhDT0RFQ19CTE9DS19TSVpFIDogcmVtYWluX3NpemU7Ci0gICAgICAgIGlmIChpbnB1dF9zaXplID09IDApIHsKLSAgICAgICAgICBpZiAobV9wUG5nQ29udGV4dCkgewotICAgICAgICAgICAgcFBuZ01vZHVsZS0+RmluaXNoKG1fcFBuZ0NvbnRleHQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBtX3BQbmdDb250ZXh0ID0gbnVsbHB0cjsKLSAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBudWxscHRyOwotICAgICAgICAgIG1fcEZpbGUgPSBudWxscHRyOwotICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLSAgICAgICAgICByZXR1cm4gbV9zdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcFNyY0J1ZiAmJiBpbnB1dF9zaXplID4gbV9TcmNTaXplKSB7Ci0gICAgICAgICAgRlhfRnJlZShtX3BTcmNCdWYpOwotICAgICAgICAgIG1fcFNyY0J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIGlucHV0X3NpemUpOwotICAgICAgICAgIEZYU1lTX21lbXNldChtX3BTcmNCdWYsIDAsIGlucHV0X3NpemUpOwotICAgICAgICAgIG1fU3JjU2l6ZSA9IGlucHV0X3NpemU7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBiUmVzdWx0ID0gbV9wRmlsZS0+UmVhZEJsb2NrKG1fcFNyY0J1ZiwgbV9vZmZTZXQsIGlucHV0X3NpemUpOwotICAgICAgICBpZiAoIWJSZXN1bHQpIHsKLSAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBudWxscHRyOwotICAgICAgICAgIG1fcEZpbGUgPSBudWxscHRyOwotICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX1JFQUQ7Ci0gICAgICAgICAgcmV0dXJuIG1fc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIG1fb2ZmU2V0ICs9IGlucHV0X3NpemU7Ci0gICAgICAgIGJSZXN1bHQgPQotICAgICAgICAgICAgcFBuZ01vZHVsZS0+SW5wdXQobV9wUG5nQ29udGV4dCwgbV9wU3JjQnVmLCBpbnB1dF9zaXplLCBudWxscHRyKTsKLSAgICAgICAgaWYgKCFiUmVzdWx0KSB7Ci0gICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gbnVsbHB0cjsKLSAgICAgICAgICBtX3BGaWxlID0gbnVsbHB0cjsKLSAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOwotICAgICAgICAgIHJldHVybiBtX3N0YXR1czsKLSAgICAgICAgfQotICAgICAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKLSAgICAgICAgICByZXR1cm4gbV9zdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2FzZSBGWENPREVDX0lNQUdFX0dJRjogewotICAgICAgSUNvZGVjX0dpZk1vZHVsZSogcEdpZk1vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRHaWZNb2R1bGUoKTsKLSAgICAgIGlmICghcEdpZk1vZHVsZSkgewotICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7Ci0gICAgICAgIHJldHVybiBtX3N0YXR1czsKLSAgICAgIH0KLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGludDMyX3QgcmVhZFJlcyA9Ci0gICAgICAgICAgICBwR2lmTW9kdWxlLT5Mb2FkRnJhbWUobV9wR2lmQ29udGV4dCwgbV9GcmFtZUN1ciwgbnVsbHB0cik7Ci0gICAgICAgIHdoaWxlIChyZWFkUmVzID09IDIpIHsKLSAgICAgICAgICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotICAgICAgICAgIGlmICghR2lmUmVhZE1vcmVEYXRhKHBHaWZNb2R1bGUsIGVycm9yX3N0YXR1cykpIHsKLSAgICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IG51bGxwdHI7Ci0gICAgICAgICAgICBtX3BGaWxlID0gbnVsbHB0cjsKLSAgICAgICAgICAgIG1fc3RhdHVzID0gZXJyb3Jfc3RhdHVzOwotICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFOwotICAgICAgICAgICAgcmV0dXJuIG1fc3RhdHVzOwotICAgICAgICAgIH0KLSAgICAgICAgICByZWFkUmVzID0gcEdpZk1vZHVsZS0+TG9hZEZyYW1lKG1fcEdpZkNvbnRleHQsIG1fRnJhbWVDdXIsIG51bGxwdHIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZWFkUmVzID09IDEpIHsKLSAgICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBudWxscHRyOwotICAgICAgICAgIG1fcEZpbGUgPSBudWxscHRyOwotICAgICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLSAgICAgICAgICByZXR1cm4gbV9zdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gbnVsbHB0cjsKLSAgICAgICAgbV9wRmlsZSA9IG51bGxwdHI7Ci0gICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7Ci0gICAgICAgIHJldHVybiBtX3N0YXR1czsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2FzZSBGWENPREVDX0lNQUdFX0JNUDogewotICAgICAgSUNvZGVjX0JtcE1vZHVsZSogcEJtcE1vZHVsZSA9IG1fcENvZGVjTWdyLT5HZXRCbXBNb2R1bGUoKTsKLSAgICAgIGlmICghcEJtcE1vZHVsZSkgewotICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7Ci0gICAgICAgIHJldHVybiBtX3N0YXR1czsKLSAgICAgIH0KLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGludDMyX3QgcmVhZFJlcyA9IHBCbXBNb2R1bGUtPkxvYWRJbWFnZShtX3BCbXBDb250ZXh0KTsKLSAgICAgICAgd2hpbGUgKHJlYWRSZXMgPT0gMikgewotICAgICAgICAgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7Ci0gICAgICAgICAgaWYgKCFCbXBSZWFkTW9yZURhdGEocEJtcE1vZHVsZSwgZXJyb3Jfc3RhdHVzKSkgewotICAgICAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gbnVsbHB0cjsKLSAgICAgICAgICAgIG1fcEZpbGUgPSBudWxscHRyOwotICAgICAgICAgICAgbV9zdGF0dXMgPSBlcnJvcl9zdGF0dXM7Ci0gICAgICAgICAgICByZXR1cm4gbV9zdGF0dXM7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUU7Ci0gICAgICAgICAgICByZXR1cm4gbV9zdGF0dXM7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJlYWRSZXMgPSBwQm1wTW9kdWxlLT5Mb2FkSW1hZ2UobV9wQm1wQ29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlYWRSZXMgPT0gMSkgewotICAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IG51bGxwdHI7Ci0gICAgICAgICAgbV9wRmlsZSA9IG51bGxwdHI7Ci0gICAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOwotICAgICAgICAgIHJldHVybiBtX3N0YXR1czsKLSAgICAgICAgfQotICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBudWxscHRyOwotICAgICAgICBtX3BGaWxlID0gbnVsbHB0cjsKLSAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsKLSAgICAgICAgcmV0dXJuIG1fc3RhdHVzOwotICAgICAgfQotICAgIH0KLSAgICBjYXNlIEZYQ09ERUNfSU1BR0VfVElGOiB7Ci0gICAgICBJQ29kZWNfVGlmZk1vZHVsZSogcFRpZmZNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0VGlmZk1vZHVsZSgpOwotICAgICAgaWYgKCFwVGlmZk1vZHVsZSkgewotICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7Ci0gICAgICAgIHJldHVybiBtX3N0YXR1czsKLSAgICAgIH0KLSAgICAgIGJvb2wgcmV0ID0gZmFsc2U7Ci0gICAgICBpZiAobV9wRGV2aWNlQml0bWFwLT5HZXRCUFAoKSA9PSAzMiAmJgotICAgICAgICAgIG1fcERldmljZUJpdG1hcC0+R2V0V2lkdGgoKSA9PSBtX1NyY1dpZHRoICYmIG1fU3JjV2lkdGggPT0gbV9zaXplWCAmJgotICAgICAgICAgIG1fcERldmljZUJpdG1hcC0+R2V0SGVpZ2h0KCkgPT0gbV9TcmNIZWlnaHQgJiYKLSAgICAgICAgICBtX1NyY0hlaWdodCA9PSBtX3NpemVZICYmIG1fc3RhcnRYID09IDAgJiYgbV9zdGFydFkgPT0gMCAmJgotICAgICAgICAgIG1fY2xpcEJveC5sZWZ0ID09IDAgJiYgbV9jbGlwQm94LnRvcCA9PSAwICYmCi0gICAgICAgICAgbV9jbGlwQm94LnJpZ2h0ID09IG1fU3JjV2lkdGggJiYgbV9jbGlwQm94LmJvdHRvbSA9PSBtX1NyY0hlaWdodCkgewotICAgICAgICByZXQgPSBwVGlmZk1vZHVsZS0+RGVjb2RlKG1fcFRpZmZDb250ZXh0LCBtX3BEZXZpY2VCaXRtYXApOwotICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBudWxscHRyOwotICAgICAgICBtX3BGaWxlID0gbnVsbHB0cjsKLSAgICAgICAgaWYgKCFyZXQpIHsKLSAgICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOwotICAgICAgICAgIHJldHVybiBtX3N0YXR1czsKLSAgICAgICAgfQotICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7Ci0gICAgICAgIHJldHVybiBtX3N0YXR1czsKLSAgICAgIH0KKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfSlBHOgorICAgICAgcmV0dXJuIEpwZWdDb250aW51ZURlY29kZSgpOworICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9QTkc6CisgICAgICByZXR1cm4gUG5nQ29udGludWVEZWNvZGUoKTsKKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfR0lGOgorICAgICAgcmV0dXJuIEdpZkNvbnRpbnVlRGVjb2RlKCk7CisgICAgY2FzZSBGWENPREVDX0lNQUdFX0JNUDoKKyAgICAgIHJldHVybiBCbXBDb250aW51ZURlY29kZSgpOworICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9USUY6CisgICAgICByZXR1cm4gVGlmQ29udGludWVEZWNvZGUoKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOworICB9Cit9CiAKLSAgICAgIENGWF9ESUJpdG1hcCogcERJQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICAgIHBESUJpdG1hcC0+Q3JlYXRlKG1fU3JjV2lkdGgsIG1fU3JjSGVpZ2h0LCBGWERJQl9BcmdiKTsKLSAgICAgIGlmICghcERJQml0bWFwLT5HZXRCdWZmZXIoKSkgewotICAgICAgICBkZWxldGUgcERJQml0bWFwOworRlhDT0RFQ19TVEFUVVMgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6SnBlZ0NvbnRpbnVlRGVjb2RlKCkgeworICBDQ29kZWNfSnBlZ01vZHVsZSogcEpwZWdNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0SnBlZ01vZHVsZSgpOworICAvLyBTZXR0aW5nIGp1bXAgbWFya2VyIGJlZm9yZSBjYWxsaW5nIFJlYWRTY2FuTGluZSwgc2luY2UgYSBsb25nam1wIHRvCisgIC8vIHRoZSBtYXJrZXIgaW5kaWNhdGVzIGEgZmF0YWwgZXJyb3IuCisgIGlmIChzZXRqbXAoKm1fcEpwZWdDb250ZXh0LT5HZXRKdW1wTWFyaygpKSA9PSAtMSkgeworICAgIG1fcEpwZWdDb250ZXh0LnJlc2V0KCk7CisgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsKKyAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisgIH0KKworICB3aGlsZSAodHJ1ZSkgeworICAgIGJvb2wgcmVhZFJlcyA9CisgICAgICAgIHBKcGVnTW9kdWxlLT5SZWFkU2NhbmxpbmUobV9wSnBlZ0NvbnRleHQuZ2V0KCksIG1fcERlY29kZUJ1Zik7CisgICAgd2hpbGUgKCFyZWFkUmVzKSB7CisgICAgICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICAgICAgaWYgKCFKcGVnUmVhZE1vcmVEYXRhKHBKcGVnTW9kdWxlLCBlcnJvcl9zdGF0dXMpKSB7CiAgICAgICAgIG1fcERldmljZUJpdG1hcCA9IG51bGxwdHI7CiAgICAgICAgIG1fcEZpbGUgPSBudWxscHRyOwotICAgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7CisgICAgICAgIG1fc3RhdHVzID0gZXJyb3Jfc3RhdHVzOwogICAgICAgICByZXR1cm4gbV9zdGF0dXM7CiAgICAgICB9Ci0gICAgICByZXQgPSBwVGlmZk1vZHVsZS0+RGVjb2RlKG1fcFRpZmZDb250ZXh0LCBwRElCaXRtYXApOwotICAgICAgaWYgKCFyZXQpIHsKLSAgICAgICAgZGVsZXRlIHBESUJpdG1hcDsKLSAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gbnVsbHB0cjsKLSAgICAgICAgbV9wRmlsZSA9IG51bGxwdHI7Ci0gICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7Ci0gICAgICAgIHJldHVybiBtX3N0YXR1czsKLSAgICAgIH0KLSAgICAgIENGWF9ESUJpdG1hcCogcENsaXBCaXRtYXAgPQotICAgICAgICAgIChtX2NsaXBCb3gubGVmdCA9PSAwICYmIG1fY2xpcEJveC50b3AgPT0gMCAmJgotICAgICAgICAgICBtX2NsaXBCb3gucmlnaHQgPT0gbV9TcmNXaWR0aCAmJiBtX2NsaXBCb3guYm90dG9tID09IG1fU3JjSGVpZ2h0KQotICAgICAgICAgICAgICA/IHBESUJpdG1hcAotICAgICAgICAgICAgICA6IHBESUJpdG1hcC0+Q2xvbmUoJm1fY2xpcEJveCkucmVsZWFzZSgpOwotICAgICAgaWYgKHBESUJpdG1hcCAhPSBwQ2xpcEJpdG1hcCkgewotICAgICAgICBkZWxldGUgcERJQml0bWFwOwotICAgICAgfQotICAgICAgaWYgKCFwQ2xpcEJpdG1hcCkgewotICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBudWxscHRyOwotICAgICAgICBtX3BGaWxlID0gbnVsbHB0cjsKLSAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOwotICAgICAgICByZXR1cm4gbV9zdGF0dXM7Ci0gICAgICB9Ci0gICAgICBDRlhfRElCaXRtYXAqIHBGb3JtYXRCaXRtYXAgPSBudWxscHRyOwotICAgICAgc3dpdGNoIChtX3BEZXZpY2VCaXRtYXAtPkdldEZvcm1hdCgpKSB7Ci0gICAgICAgIGNhc2UgRlhESUJfOGJwcFJnYjoKLSAgICAgICAgICBwRm9ybWF0Qml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICAgICAgICBwRm9ybWF0Qml0bWFwLT5DcmVhdGUocENsaXBCaXRtYXAtPkdldFdpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwQml0bWFwLT5HZXRIZWlnaHQoKSwgRlhESUJfOGJwcFJnYik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6Ci0gICAgICAgICAgcEZvcm1hdEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7Ci0gICAgICAgICAgcEZvcm1hdEJpdG1hcC0+Q3JlYXRlKHBDbGlwQml0bWFwLT5HZXRXaWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEJpdG1hcC0+R2V0SGVpZ2h0KCksIEZYRElCXzhicHBNYXNrKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWERJQl9SZ2I6Ci0gICAgICAgICAgcEZvcm1hdEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7Ci0gICAgICAgICAgcEZvcm1hdEJpdG1hcC0+Q3JlYXRlKHBDbGlwQml0bWFwLT5HZXRXaWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEJpdG1hcC0+R2V0SGVpZ2h0KCksIEZYRElCX1JnYik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfUmdiMzI6Ci0gICAgICAgICAgcEZvcm1hdEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7Ci0gICAgICAgICAgcEZvcm1hdEJpdG1hcC0+Q3JlYXRlKHBDbGlwQml0bWFwLT5HZXRXaWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcEJpdG1hcC0+R2V0SGVpZ2h0KCksIEZYRElCX1JnYjMyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGWERJQl9BcmdiOgotICAgICAgICAgIHBGb3JtYXRCaXRtYXAgPSBwQ2xpcEJpdG1hcDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHN3aXRjaCAobV9wRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKSkgewotICAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6Ci0gICAgICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6IHsKLSAgICAgICAgICBmb3IgKGludDMyX3Qgcm93ID0gMDsgcm93IDwgcENsaXBCaXRtYXAtPkdldEhlaWdodCgpOyByb3crKykgewotICAgICAgICAgICAgdWludDhfdCogc3JjX2xpbmUgPSAodWludDhfdCopcENsaXBCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgICAgICB1aW50OF90KiBkZXNfbGluZSA9ICh1aW50OF90KilwRm9ybWF0Qml0bWFwLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgICAgICAgZm9yIChpbnQzMl90IGNvbCA9IDA7IGNvbCA8IHBDbGlwQml0bWFwLT5HZXRXaWR0aCgpOyBjb2wrKykgewotICAgICAgICAgICAgICB1aW50OF90IF9hID0gMjU1IC0gc3JjX2xpbmVbM107Ci0gICAgICAgICAgICAgIHVpbnQ4X3QgYiA9IChzcmNfbGluZVswXSAqIHNyY19saW5lWzNdICsgMHhGRiAqIF9hKSAvIDI1NTsKLSAgICAgICAgICAgICAgdWludDhfdCBnID0gKHNyY19saW5lWzFdICogc3JjX2xpbmVbM10gKyAweEZGICogX2EpIC8gMjU1OwotICAgICAgICAgICAgICB1aW50OF90IHIgPSAoc3JjX2xpbmVbMl0gKiBzcmNfbGluZVszXSArIDB4RkYgKiBfYSkgLyAyNTU7Ci0gICAgICAgICAgICAgICpkZXNfbGluZSsrID0gRlhSR0IyR1JBWShyLCBnLCBiKTsKLSAgICAgICAgICAgICAgc3JjX2xpbmUgKz0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhESUJfUmdiOgotICAgICAgICBjYXNlIEZYRElCX1JnYjMyOiB7Ci0gICAgICAgICAgaW50MzJfdCBkZXNCcHAgPSAobV9wRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKSA9PSBGWERJQl9SZ2IpID8gMyA6IDQ7Ci0gICAgICAgICAgZm9yIChpbnQzMl90IHJvdyA9IDA7IHJvdyA8IHBDbGlwQml0bWFwLT5HZXRIZWlnaHQoKTsgcm93KyspIHsKLSAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19saW5lID0gKHVpbnQ4X3QqKXBDbGlwQml0bWFwLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgICAgICAgdWludDhfdCogZGVzX2xpbmUgPSAodWludDhfdCopcEZvcm1hdEJpdG1hcC0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBjb2wgPSAwOyBjb2wgPCBwQ2xpcEJpdG1hcC0+R2V0V2lkdGgoKTsgY29sKyspIHsKLSAgICAgICAgICAgICAgdWludDhfdCBfYSA9IDI1NSAtIHNyY19saW5lWzNdOwotICAgICAgICAgICAgICB1aW50OF90IGIgPSAoc3JjX2xpbmVbMF0gKiBzcmNfbGluZVszXSArIDB4RkYgKiBfYSkgLyAyNTU7Ci0gICAgICAgICAgICAgIHVpbnQ4X3QgZyA9IChzcmNfbGluZVsxXSAqIHNyY19saW5lWzNdICsgMHhGRiAqIF9hKSAvIDI1NTsKLSAgICAgICAgICAgICAgdWludDhfdCByID0gKHNyY19saW5lWzJdICogc3JjX2xpbmVbM10gKyAweEZGICogX2EpIC8gMjU1OwotICAgICAgICAgICAgICAqZGVzX2xpbmUrKyA9IGI7Ci0gICAgICAgICAgICAgICpkZXNfbGluZSsrID0gZzsKLSAgICAgICAgICAgICAgKmRlc19saW5lKysgPSByOwotICAgICAgICAgICAgICBkZXNfbGluZSArPSBkZXNCcHAgLSAzOwotICAgICAgICAgICAgICBzcmNfbGluZSArPSA0OwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChwQ2xpcEJpdG1hcCAhPSBwRm9ybWF0Qml0bWFwKSB7Ci0gICAgICAgIGRlbGV0ZSBwQ2xpcEJpdG1hcDsKLSAgICAgIH0KLSAgICAgIGlmICghcEZvcm1hdEJpdG1hcCkgewotICAgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBudWxscHRyOwotICAgICAgICBtX3BGaWxlID0gbnVsbHB0cjsKLSAgICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOwotICAgICAgICByZXR1cm4gbV9zdGF0dXM7Ci0gICAgICB9Ci0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBwU3RyZWNoQml0bWFwID0gcEZvcm1hdEJpdG1hcC0+U3RyZXRjaFRvKAotICAgICAgICAgIG1fc2l6ZVgsIG1fc2l6ZVksIG1fYkludGVycG9sID8gRlhESUJfSU5URVJQT0wgOiBGWERJQl9ET1dOU0FNUExFKTsKLSAgICAgIGRlbGV0ZSBwRm9ybWF0Qml0bWFwOwotICAgICAgcEZvcm1hdEJpdG1hcCA9IG51bGxwdHI7Ci0gICAgICBpZiAoIXBTdHJlY2hCaXRtYXApIHsKLSAgICAgICAgbV9wRGV2aWNlQml0bWFwID0gbnVsbHB0cjsKLSAgICAgICAgbV9wRmlsZSA9IG51bGxwdHI7Ci0gICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJSX01FTU9SWTsKLSAgICAgICAgcmV0dXJuIG1fc3RhdHVzOwotICAgICAgfQotICAgICAgbV9wRGV2aWNlQml0bWFwLT5UcmFuc2ZlckJpdG1hcChtX3N0YXJ0WCwgbV9zdGFydFksIG1fc2l6ZVgsIG1fc2l6ZVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlY2hCaXRtYXAuZ2V0KCksIDAsIDApOworICAgICAgcmVhZFJlcyA9IHBKcGVnTW9kdWxlLT5SZWFkU2NhbmxpbmUobV9wSnBlZ0NvbnRleHQuZ2V0KCksIG1fcERlY29kZUJ1Zik7CisgICAgfQorICAgIGlmIChtX1NyY0Zvcm1hdCA9PSBGWENvZGVjX1JnYikgeworICAgICAgaW50IHNyY19CcHAgPSAobV9TcmNGb3JtYXQgJiAweGZmKSA+PiAzOworICAgICAgUkdCMkJHUihtX3BEZWNvZGVCdWYgKyBtX2NsaXBCb3gubGVmdCAqIHNyY19CcHAsIG1fY2xpcEJveC5XaWR0aCgpKTsKKyAgICB9CisgICAgaWYgKG1fU3JjUm93ID49IG1fY2xpcEJveC5ib3R0b20pIHsKICAgICAgIG1fcERldmljZUJpdG1hcCA9IG51bGxwdHI7CiAgICAgICBtX3BGaWxlID0gbnVsbHB0cjsKICAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKICAgICAgIHJldHVybiBtX3N0YXR1czsKICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsKKyAgICBSZXNhbXBsZShtX3BEZXZpY2VCaXRtYXAsIG1fU3JjUm93LCBtX3BEZWNvZGVCdWYsIG1fU3JjRm9ybWF0KTsKKyAgICBtX1NyY1JvdysrOwogICB9CiB9CiAKK0ZYQ09ERUNfU1RBVFVTIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlBuZ0NvbnRpbnVlRGVjb2RlKCkgeworICBDQ29kZWNfUG5nTW9kdWxlKiBwUG5nTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldFBuZ01vZHVsZSgpOworICBpZiAoIXBQbmdNb2R1bGUpIHsKKyAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7CisgICAgcmV0dXJuIG1fc3RhdHVzOworICB9CisgIHdoaWxlICh0cnVlKSB7CisgICAgdWludDMyX3QgcmVtYWluX3NpemUgPSAodWludDMyX3QpbV9wRmlsZS0+R2V0U2l6ZSgpIC0gbV9vZmZTZXQ7CisgICAgdWludDMyX3QgaW5wdXRfc2l6ZSA9CisgICAgICAgIHJlbWFpbl9zaXplID4gRlhDT0RFQ19CTE9DS19TSVpFID8gRlhDT0RFQ19CTE9DS19TSVpFIDogcmVtYWluX3NpemU7CisgICAgaWYgKGlucHV0X3NpemUgPT0gMCkgeworICAgICAgbV9wUG5nQ29udGV4dC5yZXNldCgpOworICAgICAgbV9wRGV2aWNlQml0bWFwID0gbnVsbHB0cjsKKyAgICAgIG1fcEZpbGUgPSBudWxscHRyOworICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICAgICAgcmV0dXJuIG1fc3RhdHVzOworICAgIH0KKyAgICBpZiAobV9wU3JjQnVmICYmIGlucHV0X3NpemUgPiBtX1NyY1NpemUpIHsKKyAgICAgIEZYX0ZyZWUobV9wU3JjQnVmKTsKKyAgICAgIG1fcFNyY0J1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIGlucHV0X3NpemUpOworICAgICAgbWVtc2V0KG1fcFNyY0J1ZiwgMCwgaW5wdXRfc2l6ZSk7CisgICAgICBtX1NyY1NpemUgPSBpbnB1dF9zaXplOworICAgIH0KKyAgICBib29sIGJSZXN1bHQgPSBtX3BGaWxlLT5SZWFkQmxvY2sobV9wU3JjQnVmLCBtX29mZlNldCwgaW5wdXRfc2l6ZSk7CisgICAgaWYgKCFiUmVzdWx0KSB7CisgICAgICBtX3BEZXZpY2VCaXRtYXAgPSBudWxscHRyOworICAgICAgbV9wRmlsZSA9IG51bGxwdHI7CisgICAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEOworICAgICAgcmV0dXJuIG1fc3RhdHVzOworICAgIH0KKyAgICBtX29mZlNldCArPSBpbnB1dF9zaXplOworICAgIGJSZXN1bHQgPQorICAgICAgICBwUG5nTW9kdWxlLT5JbnB1dChtX3BQbmdDb250ZXh0LmdldCgpLCBtX3BTcmNCdWYsIGlucHV0X3NpemUsIG51bGxwdHIpOworICAgIGlmICghYlJlc3VsdCkgeworICAgICAgbV9wRGV2aWNlQml0bWFwID0gbnVsbHB0cjsKKyAgICAgIG1fcEZpbGUgPSBudWxscHRyOworICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsKKyAgICAgIHJldHVybiBtX3N0YXR1czsKKyAgICB9CisgIH0KK30KKworRlhDT0RFQ19TVEFUVVMgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcjo6R2lmQ29udGludWVEZWNvZGUoKSB7CisgIENDb2RlY19HaWZNb2R1bGUqIHBHaWZNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0R2lmTW9kdWxlKCk7CisgIGlmICghcEdpZk1vZHVsZSkgeworICAgIG1fcERldmljZUJpdG1hcCA9IG51bGxwdHI7CisgICAgbV9wRmlsZSA9IG51bGxwdHI7CisgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOworICAgIHJldHVybiBtX3N0YXR1czsKKyAgfQorCisgIENGWF9HaWZEZWNvZGVTdGF0dXMgcmVhZFJlcyA9CisgICAgICBwR2lmTW9kdWxlLT5Mb2FkRnJhbWUobV9wR2lmQ29udGV4dC5nZXQoKSwgbV9GcmFtZUN1ciwgbnVsbHB0cik7CisgIHdoaWxlIChyZWFkUmVzID09IENGWF9HaWZEZWNvZGVTdGF0dXM6OlVuZmluaXNoZWQpIHsKKyAgICBGWENPREVDX1NUQVRVUyBlcnJvcl9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICAgIGlmICghR2lmUmVhZE1vcmVEYXRhKHBHaWZNb2R1bGUsIGVycm9yX3N0YXR1cykpIHsKKyAgICAgIG1fcERldmljZUJpdG1hcCA9IG51bGxwdHI7CisgICAgICBtX3BGaWxlID0gbnVsbHB0cjsKKyAgICAgIG1fc3RhdHVzID0gZXJyb3Jfc3RhdHVzOworICAgICAgcmV0dXJuIG1fc3RhdHVzOworICAgIH0KKyAgICByZWFkUmVzID0gcEdpZk1vZHVsZS0+TG9hZEZyYW1lKG1fcEdpZkNvbnRleHQuZ2V0KCksIG1fRnJhbWVDdXIsIG51bGxwdHIpOworICB9CisKKyAgaWYgKHJlYWRSZXMgPT0gQ0ZYX0dpZkRlY29kZVN0YXR1czo6U3VjY2VzcykgeworICAgIG1fcERldmljZUJpdG1hcCA9IG51bGxwdHI7CisgICAgbV9wRmlsZSA9IG51bGxwdHI7CisgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICAgIHJldHVybiBtX3N0YXR1czsKKyAgfQorCisgIG1fcERldmljZUJpdG1hcCA9IG51bGxwdHI7CisgIG1fcEZpbGUgPSBudWxscHRyOworICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOworICByZXR1cm4gbV9zdGF0dXM7Cit9CisKK0ZYQ09ERUNfU1RBVFVTIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OkJtcENvbnRpbnVlRGVjb2RlKCkgeworICBDQ29kZWNfQm1wTW9kdWxlKiBwQm1wTW9kdWxlID0gbV9wQ29kZWNNZ3ItPkdldEJtcE1vZHVsZSgpOworICBpZiAoIXBCbXBNb2R1bGUpIHsKKyAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7CisgICAgcmV0dXJuIG1fc3RhdHVzOworICB9CisgIHdoaWxlICh0cnVlKSB7CisgICAgaW50MzJfdCByZWFkUmVzID0gcEJtcE1vZHVsZS0+TG9hZEltYWdlKG1fcEJtcENvbnRleHQuZ2V0KCkpOworICAgIHdoaWxlIChyZWFkUmVzID09IDIpIHsKKyAgICAgIEZYQ09ERUNfU1RBVFVTIGVycm9yX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CisgICAgICBpZiAoIUJtcFJlYWRNb3JlRGF0YShwQm1wTW9kdWxlLCBlcnJvcl9zdGF0dXMpKSB7CisgICAgICAgIG1fcERldmljZUJpdG1hcCA9IG51bGxwdHI7CisgICAgICAgIG1fcEZpbGUgPSBudWxscHRyOworICAgICAgICBtX3N0YXR1cyA9IGVycm9yX3N0YXR1czsKKyAgICAgICAgcmV0dXJuIG1fc3RhdHVzOworICAgICAgfQorICAgICAgcmVhZFJlcyA9IHBCbXBNb2R1bGUtPkxvYWRJbWFnZShtX3BCbXBDb250ZXh0LmdldCgpKTsKKyAgICB9CisgICAgaWYgKHJlYWRSZXMgPT0gMSkgeworICAgICAgbV9wRGV2aWNlQml0bWFwID0gbnVsbHB0cjsKKyAgICAgIG1fcEZpbGUgPSBudWxscHRyOworICAgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIOworICAgICAgcmV0dXJuIG1fc3RhdHVzOworICAgIH0KKyAgICBtX3BEZXZpY2VCaXRtYXAgPSBudWxscHRyOworICAgIG1fcEZpbGUgPSBudWxscHRyOworICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisgICAgcmV0dXJuIG1fc3RhdHVzOworICB9Cit9CisKK0ZYQ09ERUNfU1RBVFVTIENDb2RlY19Qcm9ncmVzc2l2ZURlY29kZXI6OlRpZkNvbnRpbnVlRGVjb2RlKCkgeworICBDQ29kZWNfVGlmZk1vZHVsZSogcFRpZmZNb2R1bGUgPSBtX3BDb2RlY01nci0+R2V0VGlmZk1vZHVsZSgpOworICBpZiAoIXBUaWZmTW9kdWxlKSB7CisgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOworICAgIHJldHVybiBtX3N0YXR1czsKKyAgfQorICBib29sIHJldCA9IGZhbHNlOworICBpZiAobV9wRGV2aWNlQml0bWFwLT5HZXRCUFAoKSA9PSAzMiAmJgorICAgICAgbV9wRGV2aWNlQml0bWFwLT5HZXRXaWR0aCgpID09IG1fU3JjV2lkdGggJiYgbV9TcmNXaWR0aCA9PSBtX3NpemVYICYmCisgICAgICBtX3BEZXZpY2VCaXRtYXAtPkdldEhlaWdodCgpID09IG1fU3JjSGVpZ2h0ICYmIG1fU3JjSGVpZ2h0ID09IG1fc2l6ZVkgJiYKKyAgICAgIG1fc3RhcnRYID09IDAgJiYgbV9zdGFydFkgPT0gMCAmJiBtX2NsaXBCb3gubGVmdCA9PSAwICYmCisgICAgICBtX2NsaXBCb3gudG9wID09IDAgJiYgbV9jbGlwQm94LnJpZ2h0ID09IG1fU3JjV2lkdGggJiYKKyAgICAgIG1fY2xpcEJveC5ib3R0b20gPT0gbV9TcmNIZWlnaHQpIHsKKyAgICByZXQgPSBwVGlmZk1vZHVsZS0+RGVjb2RlKG1fcFRpZmZDb250ZXh0LmdldCgpLCBtX3BEZXZpY2VCaXRtYXApOworICAgIG1fcERldmljZUJpdG1hcCA9IG51bGxwdHI7CisgICAgbV9wRmlsZSA9IG51bGxwdHI7CisgICAgaWYgKCFyZXQpIHsKKyAgICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisgICAgICByZXR1cm4gbV9zdGF0dXM7CisgICAgfQorICAgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKKyAgICByZXR1cm4gbV9zdGF0dXM7CisgIH0KKworICBhdXRvIHBESUJpdG1hcCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfRElCaXRtYXA+KCk7CisgIHBESUJpdG1hcC0+Q3JlYXRlKG1fU3JjV2lkdGgsIG1fU3JjSGVpZ2h0LCBGWERJQl9BcmdiKTsKKyAgaWYgKCFwRElCaXRtYXAtPkdldEJ1ZmZlcigpKSB7CisgICAgbV9wRGV2aWNlQml0bWFwID0gbnVsbHB0cjsKKyAgICBtX3BGaWxlID0gbnVsbHB0cjsKKyAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7CisgICAgcmV0dXJuIG1fc3RhdHVzOworICB9CisgIHJldCA9IHBUaWZmTW9kdWxlLT5EZWNvZGUobV9wVGlmZkNvbnRleHQuZ2V0KCksIHBESUJpdG1hcCk7CisgIGlmICghcmV0KSB7CisgICAgbV9wRGV2aWNlQml0bWFwID0gbnVsbHB0cjsKKyAgICBtX3BGaWxlID0gbnVsbHB0cjsKKyAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOworICAgIHJldHVybiBtX3N0YXR1czsKKyAgfQorICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwQ2xpcEJpdG1hcCA9CisgICAgICAobV9jbGlwQm94LmxlZnQgPT0gMCAmJiBtX2NsaXBCb3gudG9wID09IDAgJiYKKyAgICAgICBtX2NsaXBCb3gucmlnaHQgPT0gbV9TcmNXaWR0aCAmJiBtX2NsaXBCb3guYm90dG9tID09IG1fU3JjSGVpZ2h0KQorICAgICAgICAgID8gcERJQml0bWFwCisgICAgICAgICAgOiBwRElCaXRtYXAtPkNsb25lKCZtX2NsaXBCb3gpOworICBpZiAoIXBDbGlwQml0bWFwKSB7CisgICAgbV9wRGV2aWNlQml0bWFwID0gbnVsbHB0cjsKKyAgICBtX3BGaWxlID0gbnVsbHB0cjsKKyAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7CisgICAgcmV0dXJuIG1fc3RhdHVzOworICB9CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBGb3JtYXRCaXRtYXA7CisgIHN3aXRjaCAobV9wRGV2aWNlQml0bWFwLT5HZXRGb3JtYXQoKSkgeworICAgIGNhc2UgRlhESUJfOGJwcFJnYjoKKyAgICAgIHBGb3JtYXRCaXRtYXAgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOworICAgICAgcEZvcm1hdEJpdG1hcC0+Q3JlYXRlKHBDbGlwQml0bWFwLT5HZXRXaWR0aCgpLCBwQ2xpcEJpdG1hcC0+R2V0SGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfOGJwcFJnYik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCXzhicHBNYXNrOgorICAgICAgcEZvcm1hdEJpdG1hcCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfRElCaXRtYXA+KCk7CisgICAgICBwRm9ybWF0Qml0bWFwLT5DcmVhdGUocENsaXBCaXRtYXAtPkdldFdpZHRoKCksIHBDbGlwQml0bWFwLT5HZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl84YnBwTWFzayk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX1JnYjoKKyAgICAgIHBGb3JtYXRCaXRtYXAgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOworICAgICAgcEZvcm1hdEJpdG1hcC0+Q3JlYXRlKHBDbGlwQml0bWFwLT5HZXRXaWR0aCgpLCBwQ2xpcEJpdG1hcC0+R2V0SGVpZ2h0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfUmdiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfUmdiMzI6CisgICAgICBwRm9ybWF0Qml0bWFwID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKTsKKyAgICAgIHBGb3JtYXRCaXRtYXAtPkNyZWF0ZShwQ2xpcEJpdG1hcC0+R2V0V2lkdGgoKSwgcENsaXBCaXRtYXAtPkdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX1JnYjMyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfQXJnYjoKKyAgICAgIHBGb3JtYXRCaXRtYXAgPSBwQ2xpcEJpdG1hcDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICBzd2l0Y2ggKG1fcERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsKKyAgICBjYXNlIEZYRElCXzhicHBSZ2I6CisgICAgY2FzZSBGWERJQl84YnBwTWFzazogeworICAgICAgZm9yIChpbnQzMl90IHJvdyA9IDA7IHJvdyA8IHBDbGlwQml0bWFwLT5HZXRIZWlnaHQoKTsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogc3JjX2xpbmUgPSAodWludDhfdCopcENsaXBCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7CisgICAgICAgIHVpbnQ4X3QqIGRlc19saW5lID0gKHVpbnQ4X3QqKXBGb3JtYXRCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7CisgICAgICAgIGZvciAoaW50MzJfdCBjb2wgPSAwOyBjb2wgPCBwQ2xpcEJpdG1hcC0+R2V0V2lkdGgoKTsgY29sKyspIHsKKyAgICAgICAgICB1aW50OF90IF9hID0gMjU1IC0gc3JjX2xpbmVbM107CisgICAgICAgICAgdWludDhfdCBiID0gKHNyY19saW5lWzBdICogc3JjX2xpbmVbM10gKyAweEZGICogX2EpIC8gMjU1OworICAgICAgICAgIHVpbnQ4X3QgZyA9IChzcmNfbGluZVsxXSAqIHNyY19saW5lWzNdICsgMHhGRiAqIF9hKSAvIDI1NTsKKyAgICAgICAgICB1aW50OF90IHIgPSAoc3JjX2xpbmVbMl0gKiBzcmNfbGluZVszXSArIDB4RkYgKiBfYSkgLyAyNTU7CisgICAgICAgICAgKmRlc19saW5lKysgPSBGWFJHQjJHUkFZKHIsIGcsIGIpOworICAgICAgICAgIHNyY19saW5lICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgRlhESUJfUmdiOgorICAgIGNhc2UgRlhESUJfUmdiMzI6IHsKKyAgICAgIGludDMyX3QgZGVzQnBwID0gKG1fcERldmljZUJpdG1hcC0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfUmdiKSA/IDMgOiA0OworICAgICAgZm9yIChpbnQzMl90IHJvdyA9IDA7IHJvdyA8IHBDbGlwQml0bWFwLT5HZXRIZWlnaHQoKTsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogc3JjX2xpbmUgPSAodWludDhfdCopcENsaXBCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7CisgICAgICAgIHVpbnQ4X3QqIGRlc19saW5lID0gKHVpbnQ4X3QqKXBGb3JtYXRCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7CisgICAgICAgIGZvciAoaW50MzJfdCBjb2wgPSAwOyBjb2wgPCBwQ2xpcEJpdG1hcC0+R2V0V2lkdGgoKTsgY29sKyspIHsKKyAgICAgICAgICB1aW50OF90IF9hID0gMjU1IC0gc3JjX2xpbmVbM107CisgICAgICAgICAgdWludDhfdCBiID0gKHNyY19saW5lWzBdICogc3JjX2xpbmVbM10gKyAweEZGICogX2EpIC8gMjU1OworICAgICAgICAgIHVpbnQ4X3QgZyA9IChzcmNfbGluZVsxXSAqIHNyY19saW5lWzNdICsgMHhGRiAqIF9hKSAvIDI1NTsKKyAgICAgICAgICB1aW50OF90IHIgPSAoc3JjX2xpbmVbMl0gKiBzcmNfbGluZVszXSArIDB4RkYgKiBfYSkgLyAyNTU7CisgICAgICAgICAgKmRlc19saW5lKysgPSBiOworICAgICAgICAgICpkZXNfbGluZSsrID0gZzsKKyAgICAgICAgICAqZGVzX2xpbmUrKyA9IHI7CisgICAgICAgICAgZGVzX2xpbmUgKz0gZGVzQnBwIC0gMzsKKyAgICAgICAgICBzcmNfbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKCFwRm9ybWF0Qml0bWFwKSB7CisgICAgbV9wRGV2aWNlQml0bWFwID0gbnVsbHB0cjsKKyAgICBtX3BGaWxlID0gbnVsbHB0cjsKKyAgICBtX3N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUl9NRU1PUlk7CisgICAgcmV0dXJuIG1fc3RhdHVzOworICB9CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBTdHJlY2hCaXRtYXAgPQorICAgICAgcEZvcm1hdEJpdG1hcC0+U3RyZXRjaFRvKG1fc2l6ZVgsIG1fc2l6ZVksIEZYRElCX0lOVEVSUE9MLCBudWxscHRyKTsKKyAgcEZvcm1hdEJpdG1hcCA9IG51bGxwdHI7CisgIGlmICghcFN0cmVjaEJpdG1hcCkgeworICAgIG1fcERldmljZUJpdG1hcCA9IG51bGxwdHI7CisgICAgbV9wRmlsZSA9IG51bGxwdHI7CisgICAgbV9zdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZOworICAgIHJldHVybiBtX3N0YXR1czsKKyAgfQorICBtX3BEZXZpY2VCaXRtYXAtPlRyYW5zZmVyQml0bWFwKG1fc3RhcnRYLCBtX3N0YXJ0WSwgbV9zaXplWCwgbV9zaXplWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWNoQml0bWFwLCAwLCAwKTsKKyAgbV9wRGV2aWNlQml0bWFwID0gbnVsbHB0cjsKKyAgbV9wRmlsZSA9IG51bGxwdHI7CisgIG1fc3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKKyAgcmV0dXJuIG1fc3RhdHVzOworfQorCiBzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcj4KIENDb2RlY19Nb2R1bGVNZ3I6OkNyZWF0ZVByb2dyZXNzaXZlRGVjb2RlcigpIHsKICAgcmV0dXJuIHBkZml1bTo6TWFrZVVuaXF1ZTxDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyPih0aGlzKTsKZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19ybGVfdW5pdHRlc3QuY3BwIGIvY29yZS9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3JsZV91bml0dGVzdC5jcHAKaW5kZXggZDkwYTUxNS4uN2IwYWY5MCAxMDA2NDQKLS0tIGEvY29yZS9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3JsZV91bml0dGVzdC5jcHAKKysrIGIvY29yZS9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3JsZV91bml0dGVzdC5jcHAKQEAgLTksNyArOSw2IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGUuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2Jhc2ljbW9kdWxlLmgiCiAjaW5jbHVkZSAiY29yZS9meGNvZGVjL2Z4X2NvZGVjLmgiCi0jaW5jbHVkZSAidGVzdGluZy9meF9zdHJpbmdfdGVzdGhlbHBlcnMuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKIAogVEVTVChmeGNvZGVjLCBSTEVUZXN0QmFkSW5wdXRzKSB7CkBAIC03NSw3ICs3NCw3IEBACiAgICAgICBwRW5jb2RlcnMtPlJ1bkxlbmd0aEVuY29kZShzcmNfYnVmXzEsIHNyY19zaXplLCAmZGVzdF9idWYsICZkZXN0X3NpemUpKTsKICAgdWludDhfdCogZGVjb2RlZF9idWYgPSBudWxscHRyOwogICB1aW50MzJfdCBkZWNvZGVkX3NpemUgPSAwOwotICBSdW5MZW5ndGhEZWNvZGUoZGVzdF9idWYsIGRlc3Rfc2l6ZSwgZGVjb2RlZF9idWYsIGRlY29kZWRfc2l6ZSk7CisgIFJ1bkxlbmd0aERlY29kZShkZXN0X2J1ZiwgZGVzdF9zaXplLCAmZGVjb2RlZF9idWYsICZkZWNvZGVkX3NpemUpOwogICBBU1NFUlRfRVEoc3JjX3NpemUsIGRlY29kZWRfc2l6ZSk7CiAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzcmNfc2l6ZTsgaSsrKQogICAgIEVYUEVDVF9FUShzcmNfYnVmXzFbaV0sIGRlY29kZWRfYnVmW2ldKSA8PCAiIGF0ICIgPDwgaTsKQEAgLTg5LDcgKzg4LDcgQEAKICAgICAgIHBFbmNvZGVycy0+UnVuTGVuZ3RoRW5jb2RlKHNyY19idWZfMiwgc3JjX3NpemUsICZkZXN0X2J1ZiwgJmRlc3Rfc2l6ZSkpOwogICBkZWNvZGVkX2J1ZiA9IG51bGxwdHI7CiAgIGRlY29kZWRfc2l6ZSA9IDA7Ci0gIFJ1bkxlbmd0aERlY29kZShkZXN0X2J1ZiwgZGVzdF9zaXplLCBkZWNvZGVkX2J1ZiwgZGVjb2RlZF9zaXplKTsKKyAgUnVuTGVuZ3RoRGVjb2RlKGRlc3RfYnVmLCBkZXN0X3NpemUsICZkZWNvZGVkX2J1ZiwgJmRlY29kZWRfc2l6ZSk7CiAgIEFTU0VSVF9FUShzcmNfc2l6ZSwgZGVjb2RlZF9zaXplKTsKICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNyY19zaXplOyBpKyspCiAgICAgRVhQRUNUX0VRKHNyY19idWZfMltpXSwgZGVjb2RlZF9idWZbaV0pIDw8ICIgYXQgIiA8PCBpOwpAQCAtMTAzLDcgKzEwMiw3IEBACiAgICAgICBwRW5jb2RlcnMtPlJ1bkxlbmd0aEVuY29kZShzcmNfYnVmXzMsIHNyY19zaXplLCAmZGVzdF9idWYsICZkZXN0X3NpemUpKTsKICAgZGVjb2RlZF9idWYgPSBudWxscHRyOwogICBkZWNvZGVkX3NpemUgPSAwOwotICBSdW5MZW5ndGhEZWNvZGUoZGVzdF9idWYsIGRlc3Rfc2l6ZSwgZGVjb2RlZF9idWYsIGRlY29kZWRfc2l6ZSk7CisgIFJ1bkxlbmd0aERlY29kZShkZXN0X2J1ZiwgZGVzdF9zaXplLCAmZGVjb2RlZF9idWYsICZkZWNvZGVkX3NpemUpOwogICBBU1NFUlRfRVEoc3JjX3NpemUsIGRlY29kZWRfc2l6ZSk7CiAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzcmNfc2l6ZTsgaSsrKQogICAgIEVYUEVDVF9FUShzcmNfYnVmXzNbaV0sIGRlY29kZWRfYnVmW2ldKSA8PCAiIGF0ICIgPDwgaTsKQEAgLTE0NCw3ICsxNDMsNyBAQAogICAgICAgcEVuY29kZXJzLT5SdW5MZW5ndGhFbmNvZGUoc3JjX2J1Zl8xLCBzcmNfc2l6ZSwgJmRlc3RfYnVmLCAmZGVzdF9zaXplKSk7CiAgIHVpbnQ4X3QqIGRlY29kZWRfYnVmID0gbnVsbHB0cjsKICAgdWludDMyX3QgZGVjb2RlZF9zaXplID0gMDsKLSAgUnVuTGVuZ3RoRGVjb2RlKGRlc3RfYnVmLCBkZXN0X3NpemUsIGRlY29kZWRfYnVmLCBkZWNvZGVkX3NpemUpOworICBSdW5MZW5ndGhEZWNvZGUoZGVzdF9idWYsIGRlc3Rfc2l6ZSwgJmRlY29kZWRfYnVmLCAmZGVjb2RlZF9zaXplKTsKICAgQVNTRVJUX0VRKHNyY19zaXplLCBkZWNvZGVkX3NpemUpOwogICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3JjX3NpemU7IGkrKykKICAgICBFWFBFQ1RfRVEoc3JjX2J1Zl8xW2ldLCBkZWNvZGVkX2J1ZltpXSkgPDwgIiBhdCAiIDw8IGk7CkBAIC0xNTgsNyArMTU3LDcgQEAKICAgICAgIHBFbmNvZGVycy0+UnVuTGVuZ3RoRW5jb2RlKHNyY19idWZfMiwgc3JjX3NpemUsICZkZXN0X2J1ZiwgJmRlc3Rfc2l6ZSkpOwogICBkZWNvZGVkX2J1ZiA9IG51bGxwdHI7CiAgIGRlY29kZWRfc2l6ZSA9IDA7Ci0gIFJ1bkxlbmd0aERlY29kZShkZXN0X2J1ZiwgZGVzdF9zaXplLCBkZWNvZGVkX2J1ZiwgZGVjb2RlZF9zaXplKTsKKyAgUnVuTGVuZ3RoRGVjb2RlKGRlc3RfYnVmLCBkZXN0X3NpemUsICZkZWNvZGVkX2J1ZiwgJmRlY29kZWRfc2l6ZSk7CiAgIEFTU0VSVF9FUShzcmNfc2l6ZSwgZGVjb2RlZF9zaXplKTsKICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNyY19zaXplOyBpKyspCiAgICAgRVhQRUNUX0VRKHNyY19idWZfMltpXSwgZGVjb2RlZF9idWZbaV0pIDw8ICIgYXQgIiA8PCBpOwpAQCAtMTcyLDcgKzE3MSw3IEBACiAgICAgICBwRW5jb2RlcnMtPlJ1bkxlbmd0aEVuY29kZShzcmNfYnVmXzMsIHNyY19zaXplLCAmZGVzdF9idWYsICZkZXN0X3NpemUpKTsKICAgZGVjb2RlZF9idWYgPSBudWxscHRyOwogICBkZWNvZGVkX3NpemUgPSAwOwotICBSdW5MZW5ndGhEZWNvZGUoZGVzdF9idWYsIGRlc3Rfc2l6ZSwgZGVjb2RlZF9idWYsIGRlY29kZWRfc2l6ZSk7CisgIFJ1bkxlbmd0aERlY29kZShkZXN0X2J1ZiwgZGVzdF9zaXplLCAmZGVjb2RlZF9idWYsICZkZWNvZGVkX3NpemUpOwogICBBU1NFUlRfRVEoc3JjX3NpemUsIGRlY29kZWRfc2l6ZSk7CiAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBzcmNfc2l6ZTsgaSsrKQogICAgIEVYUEVDVF9FUShzcmNfYnVmXzNbaV0sIGRlY29kZWRfYnVmW2ldKSA8PCAiIGF0ICIgPDwgaTsKQEAgLTE4Niw3ICsxODUsNyBAQAogICAgICAgcEVuY29kZXJzLT5SdW5MZW5ndGhFbmNvZGUoc3JjX2J1Zl80LCBzcmNfc2l6ZSwgJmRlc3RfYnVmLCAmZGVzdF9zaXplKSk7CiAgIGRlY29kZWRfYnVmID0gbnVsbHB0cjsKICAgZGVjb2RlZF9zaXplID0gMDsKLSAgUnVuTGVuZ3RoRGVjb2RlKGRlc3RfYnVmLCBkZXN0X3NpemUsIGRlY29kZWRfYnVmLCBkZWNvZGVkX3NpemUpOworICBSdW5MZW5ndGhEZWNvZGUoZGVzdF9idWYsIGRlc3Rfc2l6ZSwgJmRlY29kZWRfYnVmLCAmZGVjb2RlZF9zaXplKTsKICAgQVNTRVJUX0VRKHNyY19zaXplLCBkZWNvZGVkX3NpemUpOwogICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc3JjX3NpemU7IGkrKykKICAgICBFWFBFQ1RfRVEoc3JjX2J1Zl80W2ldLCBkZWNvZGVkX2J1ZltpXSkgPDwgIiBhdCAiIDw8IGk7CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvY29kZWMvaWNvZGVjX2JtcG1vZHVsZS5oIGIvY29yZS9meGNvZGVjL2NvZGVjL2ljb2RlY19ibXBtb2R1bGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY3ZTIwYy4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Y29kZWMvY29kZWMvaWNvZGVjX2JtcG1vZHVsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlhDT0RFQ19DT0RFQ19JQ09ERUNfQk1QTU9EVUxFX0hfCi0jZGVmaW5lIENPUkVfRlhDT0RFQ19DT0RFQ19JQ09ERUNfQk1QTU9EVUxFX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotCi1zdHJ1Y3QgRlhCTVBfQ29udGV4dDsKLWNsYXNzIENGWF9ESUJBdHRyaWJ1dGU7Ci0KLS8vIFZpcnR1YWwgaW50ZXJmYWNlIHRvIGF2b2lkIGxpbmtpbmcgaW4gYSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbgotLy8gaWYgd2UgZG8gbm90IGVuYWJsZSB0aGlzIGNvZGVjLgotY2xhc3MgSUNvZGVjX0JtcE1vZHVsZSB7Ci0gcHVibGljOgotICBjbGFzcyBEZWxlZ2F0ZSB7Ci0gICBwdWJsaWM6Ci0gICAgdmlydHVhbCBib29sIEJtcElucHV0SW1hZ2VQb3NpdGlvbkJ1Zih1aW50MzJfdCByY2RfcG9zKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIEJtcFJlYWRTY2FubGluZShpbnQzMl90IHJvd19udW0sIHVpbnQ4X3QqIHJvd19idWYpID0gMDsKLSAgfTsKLQotICB2aXJ0dWFsIH5JQ29kZWNfQm1wTW9kdWxlKCkge30KLQotICB2aXJ0dWFsIEZYQk1QX0NvbnRleHQqIFN0YXJ0KCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgRmluaXNoKEZYQk1QX0NvbnRleHQqIHBDb250ZXh0KSA9IDA7Ci0gIHZpcnR1YWwgdWludDMyX3QgR2V0QXZhaWxJbnB1dChGWEJNUF9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBhdmFpbF9idWZfcHRyKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBJbnB1dChGWEJNUF9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc2l6ZSkgPSAwOwotICB2aXJ0dWFsIGludDMyX3QgUmVhZEhlYWRlcihGWEJNUF9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogdGJfZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogY29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcGFsX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqKiBwYWxfcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpID0gMDsKLSAgdmlydHVhbCBpbnQzMl90IExvYWRJbWFnZShGWEJNUF9Db250ZXh0KiBwQ29udGV4dCkgPSAwOwotCi0gIERlbGVnYXRlKiBHZXREZWxlZ2F0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcERlbGVnYXRlOyB9Ci0gIHZvaWQgU2V0RGVsZWdhdGUoRGVsZWdhdGUqIHBEZWxlZ2F0ZSkgeyBtX3BEZWxlZ2F0ZSA9IHBEZWxlZ2F0ZTsgfQotCi0gcHJvdGVjdGVkOgotICBEZWxlZ2F0ZSogbV9wRGVsZWdhdGU7Ci19OwotCi0jZW5kaWYgIC8vIENPUkVfRlhDT0RFQ19DT0RFQ19JQ09ERUNfQk1QTU9EVUxFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvY29kZWMvaWNvZGVjX2dpZm1vZHVsZS5oIGIvY29yZS9meGNvZGVjL2NvZGVjL2ljb2RlY19naWZtb2R1bGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjMDcwOC4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Y29kZWMvY29kZWMvaWNvZGVjX2dpZm1vZHVsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlhDT0RFQ19DT0RFQ19JQ09ERUNfR0lGTU9EVUxFX0hfCi0jZGVmaW5lIENPUkVfRlhDT0RFQ19DT0RFQ19JQ09ERUNfR0lGTU9EVUxFX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLQotY2xhc3MgQ0ZYX0RJQkF0dHJpYnV0ZTsKLXN0cnVjdCBGWEdJRl9Db250ZXh0OwotCi0vLyBWaXJ0dWFsIGludGVyZmFjZSB0byBhdm9pZCBsaW5raW5nIGluIGEgY29uY3JldGUgaW1wbGVtZW50YXRpb24KLS8vIGlmIHdlIGRvIG5vdCBlbmFibGUgdGhpcyBjb2RlYy4KLWNsYXNzIElDb2RlY19HaWZNb2R1bGUgewotIHB1YmxpYzoKLSAgY2xhc3MgRGVsZWdhdGUgewotICAgcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCBHaWZSZWNvcmRDdXJyZW50UG9zaXRpb24odWludDMyX3QmIGN1cl9wb3MpID0gMDsKLSAgICB2aXJ0dWFsIHVpbnQ4X3QqIEdpZkFza0xvY2FsUGFsZXR0ZUJ1ZihpbnQzMl90IGZyYW1lX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBhbF9zaXplKSA9IDA7Ci0gICAgdmlydHVhbCBib29sIEdpZklucHV0UmVjb3JkUG9zaXRpb25CdWYodWludDMyX3QgcmNkX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUJiBpbWdfcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwYWxfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhbF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWxheV90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlcl9pbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRyYW5zX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGlzcG9zYWxfbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW50ZXJsYWNlKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIEdpZlJlYWRTY2FubGluZShpbnQzMl90IHJvd19udW0sIHVpbnQ4X3QqIHJvd19idWYpID0gMDsKLSAgfTsKLQotICB2aXJ0dWFsIH5JQ29kZWNfR2lmTW9kdWxlKCkge30KLQotICB2aXJ0dWFsIEZYR0lGX0NvbnRleHQqIFN0YXJ0KCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgRmluaXNoKEZYR0lGX0NvbnRleHQqIHBDb250ZXh0KSA9IDA7Ci0gIHZpcnR1YWwgdWludDMyX3QgR2V0QXZhaWxJbnB1dChGWEdJRl9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBhdmFpbF9idWZfcHRyID0gbnVsbHB0cikgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBJbnB1dChGWEdJRl9Db250ZXh0KiBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc2l6ZSkgPSAwOwotCi0gIHZpcnR1YWwgaW50MzJfdCBSZWFkSGVhZGVyKEZYR0lGX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwYWxfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogcGFsX3BwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGJnX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKSA9IDA7Ci0KLSAgdmlydHVhbCBpbnQzMl90IExvYWRGcmFtZUluZm8oRlhHSUZfQ29udGV4dCogcENvbnRleHQsIGludCogZnJhbWVfbnVtKSA9IDA7Ci0gIHZpcnR1YWwgaW50MzJfdCBMb2FkRnJhbWUoRlhHSUZfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKSA9IDA7Ci0KLSAgRGVsZWdhdGUqIEdldERlbGVnYXRlKCkgY29uc3QgeyByZXR1cm4gbV9wRGVsZWdhdGU7IH0KLSAgdm9pZCBTZXREZWxlZ2F0ZShEZWxlZ2F0ZSogcERlbGVnYXRlKSB7IG1fcERlbGVnYXRlID0gcERlbGVnYXRlOyB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIERlbGVnYXRlKiBtX3BEZWxlZ2F0ZTsKLX07Ci0KLSNlbmRpZiAgLy8gQ09SRV9GWENPREVDX0NPREVDX0lDT0RFQ19HSUZNT0RVTEVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9jb2RlYy9pY29kZWNfcG5nbW9kdWxlLmggYi9jb3JlL2Z4Y29kZWMvY29kZWMvaWNvZGVjX3BuZ21vZHVsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2U2MWZlLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjb2RlYy9jb2RlYy9pY29kZWNfcG5nbW9kdWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgQ09SRV9GWENPREVDX0NPREVDX0lDT0RFQ19QTkdNT0RVTEVfSF8KLSNkZWZpbmUgQ09SRV9GWENPREVDX0NPREVDX0lDT0RFQ19QTkdNT0RVTEVfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0KLWNsYXNzIENGWF9ESUJBdHRyaWJ1dGU7Ci1zdHJ1Y3QgRlhQTkdfQ29udGV4dDsKLQotLy8gVmlydHVhbCBpbnRlcmZhY2UgdG8gYXZvaWQgbGlua2luZyBpbiBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uCi0vLyBpZiB3ZSBkbyBub3QgZW5hYmxlIHRoaXMgY29kZWMuCi1jbGFzcyBJQ29kZWNfUG5nTW9kdWxlIHsKLSBwdWJsaWM6Ci0gIGNsYXNzIERlbGVnYXRlIHsKLSAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIGJvb2wgUG5nUmVhZEhlYWRlcihpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29sb3JfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGdhbW1hKSA9IDA7Ci0gICAgdmlydHVhbCBib29sIFBuZ0Fza1NjYW5saW5lQnVmKGludCBsaW5lLCB1aW50OF90KiYgc3JjX2J1ZikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBQbmdGaWxsU2NhbmxpbmVCdWZDb21wbGV0ZWQoaW50IHBhc3MsIGludCBsaW5lKSA9IDA7Ci0gIH07Ci0KLSAgdmlydHVhbCB+SUNvZGVjX1BuZ01vZHVsZSgpIHt9Ci0KLSAgdmlydHVhbCBGWFBOR19Db250ZXh0KiBTdGFydCgpID0gMDsKLSAgdmlydHVhbCB2b2lkIEZpbmlzaChGWFBOR19Db250ZXh0KiBwQ29udGV4dCkgPSAwOwotICB2aXJ0dWFsIGJvb2wgSW5wdXQoRlhQTkdfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYnVmLAotICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfRElCQXR0cmlidXRlKiBwQXR0cmlidXRlKSA9IDA7Ci0KLSAgRGVsZWdhdGUqIEdldERlbGVnYXRlKCkgY29uc3QgeyByZXR1cm4gbV9wRGVsZWdhdGU7IH0KLSAgdm9pZCBTZXREZWxlZ2F0ZShEZWxlZ2F0ZSogZGVsZWdhdGUpIHsgbV9wRGVsZWdhdGUgPSBkZWxlZ2F0ZTsgfQotCi0gcHJvdGVjdGVkOgotICBEZWxlZ2F0ZSogbV9wRGVsZWdhdGU7Ci19OwotCi0jZW5kaWYgIC8vIENPUkVfRlhDT0RFQ19DT0RFQ19JQ09ERUNfUE5HTU9EVUxFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvY29kZWMvaWNvZGVjX3RpZmZtb2R1bGUuaCBiL2NvcmUvZnhjb2RlYy9jb2RlYy9pY29kZWNfdGlmZm1vZHVsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDBkODJmLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjb2RlYy9jb2RlYy9pY29kZWNfdGlmZm1vZHVsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlhDT0RFQ19DT0RFQ19JQ09ERUNfVElGRk1PRFVMRV9IXwotI2RlZmluZSBDT1JFX0ZYQ09ERUNfQ09ERUNfSUNPREVDX1RJRkZNT0RVTEVfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3JldGFpbl9wdHIuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotCi1jbGFzcyBDQ29kZWNfVGlmZkNvbnRleHQ7Ci1jbGFzcyBDRlhfRElCQXR0cmlidXRlOwotY2xhc3MgQ0ZYX0RJQml0bWFwOwotY2xhc3MgSUZYX1NlZWthYmxlUmVhZFN0cmVhbTsKLQotY2xhc3MgSUNvZGVjX1RpZmZNb2R1bGUgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+SUNvZGVjX1RpZmZNb2R1bGUoKSB7fQotCi0gIHZpcnR1YWwgQ0NvZGVjX1RpZmZDb250ZXh0KiBDcmVhdGVEZWNvZGVyKAotICAgICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgZmlsZV9wdHIpID0gMDsKLSAgdmlydHVhbCBib29sIExvYWRGcmFtZUluZm8oQ0NvZGVjX1RpZmZDb250ZXh0KiBjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGNvbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBicGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJBdHRyaWJ1dGUqIHBBdHRyaWJ1dGUpID0gMDsKLSAgdmlydHVhbCBib29sIERlY29kZShDQ29kZWNfVGlmZkNvbnRleHQqIGN0eCwKLSAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgRGVzdHJveURlY29kZXIoQ0NvZGVjX1RpZmZDb250ZXh0KiBjdHgpID0gMDsKLX07Ci0KLSNlbmRpZiAgLy8gQ09SRV9GWENPREVDX0NPREVDX0lDT0RFQ19USUZGTU9EVUxFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvZnhfY29kZWMuaCBiL2NvcmUvZnhjb2RlYy9meF9jb2RlYy5oCmluZGV4IGIwYjlmYTEuLjkyM2ViN2MgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjb2RlYy9meF9jb2RlYy5oCisrKyBiL2NvcmUvZnhjb2RlYy9meF9jb2RlYy5oCkBAIC05LDM1ICs5LDMyIEBACiAKICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHR1cGxlPgogI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19iYXNpY21vZHVsZS5oIgotI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfZmF4bW9kdWxlLmgiCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19mbGF0ZW1vZHVsZS5oIgotI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfaWNjbW9kdWxlLmgiCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19qYmlnMm1vZHVsZS5oIgotI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfanBlZ21vZHVsZS5oIgotI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfanB4bW9kdWxlLmgiCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19zY2FubGluZWRlY29kZXIuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvZnhfY29kZWNfZGVmLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgogCi0jaWZkZWYgUERGX0VOQUJMRV9YRkEKLSNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvaWNvZGVjX2JtcG1vZHVsZS5oIgotI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9pY29kZWNfZ2lmbW9kdWxlLmgiCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2ljb2RlY19wbmdtb2R1bGUuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvaWNvZGVjX3RpZmZtb2R1bGUuaCIKLSNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKLQorY2xhc3MgQ0NvZGVjX0Jhc2ljTW9kdWxlOworY2xhc3MgQ0NvZGVjX0ZheE1vZHVsZTsKK2NsYXNzIENDb2RlY19GbGF0ZU1vZHVsZTsKK2NsYXNzIENDb2RlY19JY2NNb2R1bGU7CitjbGFzcyBDQ29kZWNfSmJpZzJNb2R1bGU7CitjbGFzcyBDQ29kZWNfSnBlZ01vZHVsZTsKK2NsYXNzIENDb2RlY19KcHhNb2R1bGU7CiBjbGFzcyBDRlhfRElCU291cmNlOwogY2xhc3MgQ0pQWF9EZWNvZGVyOwogY2xhc3MgQ1BERl9Db2xvclNwYWNlOwogY2xhc3MgQ1BERl9TdHJlYW1BY2M7CiAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQorY2xhc3MgQ0NvZGVjX0JtcE1vZHVsZTsKK2NsYXNzIENDb2RlY19HaWZNb2R1bGU7CitjbGFzcyBDQ29kZWNfUG5nTW9kdWxlOwogY2xhc3MgQ0NvZGVjX1Byb2dyZXNzaXZlRGVjb2RlcjsKK2NsYXNzIENDb2RlY19UaWZmTW9kdWxlOwogCiBjbGFzcyBDRlhfRElCQXR0cmlidXRlIHsKICBwdWJsaWM6CkBAIC00NiwxMCArNDMsOSBAQAogCiAgIGludDMyX3QgbV9uWERQSTsKICAgaW50MzJfdCBtX25ZRFBJOwotICBGWF9GTE9BVCBtX2ZBc3BlY3RSYXRpbzsKKyAgZmxvYXQgbV9mQXNwZWN0UmF0aW87CiAgIHVpbnQxNl90IG1fd0RQSVVuaXQ7Ci0gIENGWF9CeXRlU3RyaW5nIG1fc3RyQXV0aG9yOwotICB1aW50OF90IG1fc3RyVGltZVsyMF07CisgIEJ5dGVTdHJpbmcgbV9zdHJBdXRob3I7CiAgIGludDMyX3QgbV9uR2lmTGVmdDsKICAgaW50MzJfdCBtX25HaWZUb3A7CiAgIHVpbnQzMl90KiBtX3BHaWZMb2NhbFBhbGV0dGU7CkBAIC03NCwyMiArNzAsMTQgQEAKIAogI2lmZGVmIFBERl9FTkFCTEVfWEZBCiAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyPiBDcmVhdGVQcm9ncmVzc2l2ZURlY29kZXIoKTsKLSAgdm9pZCBTZXRCbXBNb2R1bGUoc3RkOjp1bmlxdWVfcHRyPElDb2RlY19CbXBNb2R1bGU+IG1vZHVsZSkgewotICAgIG1fcEJtcE1vZHVsZSA9IHN0ZDo6bW92ZShtb2R1bGUpOwotICB9Ci0gIHZvaWQgU2V0R2lmTW9kdWxlKHN0ZDo6dW5pcXVlX3B0cjxJQ29kZWNfR2lmTW9kdWxlPiBtb2R1bGUpIHsKLSAgICBtX3BHaWZNb2R1bGUgPSBzdGQ6Om1vdmUobW9kdWxlKTsKLSAgfQotICB2b2lkIFNldFBuZ01vZHVsZShzdGQ6OnVuaXF1ZV9wdHI8SUNvZGVjX1BuZ01vZHVsZT4gbW9kdWxlKSB7Ci0gICAgbV9wUG5nTW9kdWxlID0gc3RkOjptb3ZlKG1vZHVsZSk7Ci0gIH0KLSAgdm9pZCBTZXRUaWZmTW9kdWxlKHN0ZDo6dW5pcXVlX3B0cjxJQ29kZWNfVGlmZk1vZHVsZT4gbW9kdWxlKSB7Ci0gICAgbV9wVGlmZk1vZHVsZSA9IHN0ZDo6bW92ZShtb2R1bGUpOwotICB9Ci0gIElDb2RlY19CbXBNb2R1bGUqIEdldEJtcE1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcEJtcE1vZHVsZS5nZXQoKTsgfQotICBJQ29kZWNfR2lmTW9kdWxlKiBHZXRHaWZNb2R1bGUoKSBjb25zdCB7IHJldHVybiBtX3BHaWZNb2R1bGUuZ2V0KCk7IH0KLSAgSUNvZGVjX1BuZ01vZHVsZSogR2V0UG5nTW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbV9wUG5nTW9kdWxlLmdldCgpOyB9Ci0gIElDb2RlY19UaWZmTW9kdWxlKiBHZXRUaWZmTW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbV9wVGlmZk1vZHVsZS5nZXQoKTsgfQorICB2b2lkIFNldEJtcE1vZHVsZShzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjX0JtcE1vZHVsZT4gbW9kdWxlKTsKKyAgdm9pZCBTZXRHaWZNb2R1bGUoc3RkOjp1bmlxdWVfcHRyPENDb2RlY19HaWZNb2R1bGU+IG1vZHVsZSk7CisgIHZvaWQgU2V0UG5nTW9kdWxlKHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNfUG5nTW9kdWxlPiBtb2R1bGUpOworICB2b2lkIFNldFRpZmZNb2R1bGUoc3RkOjp1bmlxdWVfcHRyPENDb2RlY19UaWZmTW9kdWxlPiBtb2R1bGUpOworICBDQ29kZWNfQm1wTW9kdWxlKiBHZXRCbXBNb2R1bGUoKSBjb25zdCB7IHJldHVybiBtX3BCbXBNb2R1bGUuZ2V0KCk7IH0KKyAgQ0NvZGVjX0dpZk1vZHVsZSogR2V0R2lmTW9kdWxlKCkgY29uc3QgeyByZXR1cm4gbV9wR2lmTW9kdWxlLmdldCgpOyB9CisgIENDb2RlY19QbmdNb2R1bGUqIEdldFBuZ01vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcFBuZ01vZHVsZS5nZXQoKTsgfQorICBDQ29kZWNfVGlmZk1vZHVsZSogR2V0VGlmZk1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1fcFRpZmZNb2R1bGUuZ2V0KCk7IH0KICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAogIHByb3RlY3RlZDoKQEAgLTEwMSwxMCArODksMTAgQEAKICAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY19JY2NNb2R1bGU+IG1fcEljY01vZHVsZTsKIAogI2lmZGVmIFBERl9FTkFCTEVfWEZBCi0gIHN0ZDo6dW5pcXVlX3B0cjxJQ29kZWNfQm1wTW9kdWxlPiBtX3BCbXBNb2R1bGU7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxJQ29kZWNfR2lmTW9kdWxlPiBtX3BHaWZNb2R1bGU7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxJQ29kZWNfUG5nTW9kdWxlPiBtX3BQbmdNb2R1bGU7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxJQ29kZWNfVGlmZk1vZHVsZT4gbV9wVGlmZk1vZHVsZTsKKyAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY19CbXBNb2R1bGU+IG1fcEJtcE1vZHVsZTsKKyAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY19HaWZNb2R1bGU+IG1fcEdpZk1vZHVsZTsKKyAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY19QbmdNb2R1bGU+IG1fcFBuZ01vZHVsZTsKKyAgc3RkOjp1bmlxdWVfcHRyPENDb2RlY19UaWZmTW9kdWxlPiBtX3BUaWZmTW9kdWxlOwogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCiAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNfRmxhdGVNb2R1bGU+IG1fcEZsYXRlTW9kdWxlOwpAQCAtMTEyLDI4ICsxMDAsMTQgQEAKIAogdm9pZCBSZXZlcnNlUkdCKHVpbnQ4X3QqIHBEZXN0QnVmLCBjb25zdCB1aW50OF90KiBwU3JjQnVmLCBpbnQgcGl4ZWxzKTsKIHVpbnQzMl90IENvbXBvbmVudHNGb3JGYW1pbHkoaW50IGZhbWlseSk7Ci12b2lkIHNSR0JfdG9fQWRvYmVDTVlLKEZYX0ZMT0FUIFIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEcsCi0gICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIEIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBjLAotICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgbSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHksCi0gICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBrKTsKLXZvaWQgQWRvYmVDTVlLX3RvX3NSR0IoRlhfRkxPQVQgYywKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaywKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIFIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBHLAotICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgQik7Ci12b2lkIEFkb2JlQ01ZS190b19zUkdCMSh1aW50OF90IGMsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG0sCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHksCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGssCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBSLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCYgRywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QmIEIpOwotYm9vbCBNRDVDb21wdXRlSUQoY29uc3Qgdm9pZCogYnVmLCB1aW50MzJfdCBkd1NpemUsIHVpbnQ4X3QgSURbMTZdKTsKK3N0ZDo6dHVwbGU8ZmxvYXQsIGZsb2F0LCBmbG9hdD4gQWRvYmVDTVlLX3RvX3NSR0IoZmxvYXQgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgayk7CitzdGQ6OnR1cGxlPHVpbnQ4X3QsIHVpbnQ4X3QsIHVpbnQ4X3Q+IEFkb2JlQ01ZS190b19zUkdCMSh1aW50OF90IGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGspOwogdm9pZCBGYXhHNERlY29kZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAogICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc2l6ZSwKICAgICAgICAgICAgICAgICAgaW50KiBwYml0cG9zLApkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2Z4X2NvZGVjX2RlZi5oIGIvY29yZS9meGNvZGVjL2Z4X2NvZGVjX2RlZi5oCmluZGV4IGZkMjNkNzguLjM5ODMyODUgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjb2RlYy9meF9jb2RlY19kZWYuaAorKysgYi9jb3JlL2Z4Y29kZWMvZnhfY29kZWNfZGVmLmgKQEAgLTIyLDQ1ICsyMiw3IEBACiAgIEZYQ09ERUNfU1RBVFVTX0VSUl9GT1JNQVQsCiAgIEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVMKIH07Ci0jZGVmaW5lIEpQMl9TUEFDRV9JTlZBTElEIC0xCi0jZGVmaW5lIEpQWF9TUEFDRV9JTlZBTElEIC0xCi0jZGVmaW5lIEpQMl9TUEFDRV9iaWxldmVsMSAwCi0jZGVmaW5lIEpQMl9TUEFDRV9ZQ2JDcjEgMQotI2RlZmluZSBKUDJfU1BBQ0VfWUNiQ3IyIDMKLSNkZWZpbmUgSlAyX1NQQUNFX1lDYkNyMyA0Ci0jZGVmaW5lIEpQMl9TUEFDRV9QaG90b1lDQyA5Ci0jZGVmaW5lIEpQMl9TUEFDRV9DTVkgMTEKLSNkZWZpbmUgSlAyX1NQQUNFX0NNWUsgMTIKLSNkZWZpbmUgSlAyX1NQQUNFX1lDQ0sgMTMKLSNkZWZpbmUgSlAyX1NQQUNFX0NJRUxhYiAxNAotI2RlZmluZSBKUDJfU1BBQ0VfYmlsZXZlbDIgMTUKLSNkZWZpbmUgSlAyX1NQQUNFX3NSR0IgMTYKLSNkZWZpbmUgSlAyX1NQQUNFX3NMVU0gMTcKLSNkZWZpbmUgSlAyX1NQQUNFX3NZQ0MgMTgKLSNkZWZpbmUgSlAyX1NQQUNFX0NJRUphYiAxOQotI2RlZmluZSBKUDJfU1BBQ0VfZXNSR0IgMjAKLSNkZWZpbmUgSlAyX1NQQUNFX1JPTU1SR0IgMjEKLSNkZWZpbmUgSlAyX1NQQUNFX1lQYlByNjAgMjIKLSNkZWZpbmUgSlAyX1NQQUNFX1lQYlByNTAgMjMKLSNkZWZpbmUgSlAyX1NQQUNFX2VzWUNDIDI0Ci0jZGVmaW5lIEpQMl9TUEFDRV9pY2NMVU0gMTAwCi0jZGVmaW5lIEpQMl9TUEFDRV9pY2NSR0IgMTAxCi0jZGVmaW5lIEljY19JTlRFTlRfUEVSQ0VQVFVBTCAwCi0jZGVmaW5lIEljY19JTlRFTlRfUkVMQVRJVkVfQ09MT1JJTUVUUklDIDEKLSNkZWZpbmUgSWNjX0lOVEVOVF9TQVRVUkFUSU9OIDIKLSNkZWZpbmUgSWNjX0lOVEVOVF9BQlNPTFVURV9DT0xPUklNRVRSSUMgMwotI2RlZmluZSBJY2NfRk9STUFUX0RFRkFVTFQgMAotI2RlZmluZSBJY2NfRk9STUFUX1NXQVAgKDEgPDwgMTApCi0jZGVmaW5lIEljY19GTEFHU19ERUZBVUxUIDB4MDAwMAotI2RlZmluZSBJY2NfRkxBR1NfQkxBQ0tQT0lOVENPTVBFTlNBVElPTiAweDIwMDAKLSNkZWZpbmUgSWNjX0ZMQUdTX05PV0hJVEVPTldISVRFRklYVVAgMHgwMDA0Ci0jZGVmaW5lIEljY19GTEFHU19ISUdIUkVTUFJFQ0FMQyAweDA0MDAKLSNkZWZpbmUgSWNjX0ZMQUdTX0xPV1JFU1BSRUNBTEMgMHgwODAwCi0jZGVmaW5lIEljY19GTEFHU19HQU1VVENIRUNLIDB4MTAwMAotI2RlZmluZSBJY2NfRkxBR1NfU09GVFBST09GSU5HIDB4NDAwMAotI2RlZmluZSBJY2NfUEFSQU1UWVBFX05PTkUgMAotI2RlZmluZSBJY2NfUEFSQU1UWVBFX0JVRkZFUiAxCi0jZGVmaW5lIEljY19QQVJBTVRZUEVfUEFSQU0gMgorCiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKIGVudW0gRlhDT0RFQ19JTUFHRV9UWVBFIHsKICAgRlhDT0RFQ19JTUFHRV9VTktOT1dOID0gMCwKQEAgLTc4LDE1ICs0MCw1IEBACiAgIEZYQ09ERUNfUkVTVU5JVF9NRVRFUgogfTsKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKLSNkZWZpbmUgRVhJRlRBR19VU0hPUlRfUkVTVU5JVCAyOTYKLSNkZWZpbmUgRVhJRlRBR19GTE9BVF9EUElYIDI4MgotI2RlZmluZSBFWElGVEFHX0ZMT0FUX0RQSVkgMjgzCi0jZGVmaW5lIEVYSUZUQUdfVVNIT1JUX09SSUVOVEFUSU9OIDI3NAotI2RlZmluZSBFWElGVEFHX1NUUklOR19NQU5VRkFDVFVSRVIgMjcxCi0jZGVmaW5lIEVYSUZUQUdfU1RSSU5HX01PRFVMRSAyNzIKLSNkZWZpbmUgRVhJRlRBR19TVFJJTkdfU09GVFdBUkUgMzA1Ci0jZGVmaW5lIEVYSUZUQUdfU1RSSU5HX0lBTUdFREVTQ1JJUFRJT04gMjcwCi0jZGVmaW5lIEVYSUZUQUdfU1RSSU5HX0RBVEVUSU1FIDMwNgotI2RlZmluZSBFWElGVEFHX1NUUklOR19DT1BZUklHSFQgMzM0MzIKIAogI2VuZGlmICAvLyBDT1JFX0ZYQ09ERUNfRlhfQ09ERUNfREVGX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvZ2lmL2NmeF9naWYuY3BwIGIvY29yZS9meGNvZGVjL2dpZi9jZnhfZ2lmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODVhNjg3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNvZGVjL2dpZi9jZnhfZ2lmLmNwcApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvZ2lmL2NmeF9naWYuaCIKKworY29uc3QgY2hhcioga0dpZlNpZ25hdHVyZTg3ID0gIkdJRjg3YSI7Citjb25zdCBjaGFyKiBrR2lmU2lnbmF0dXJlODkgPSAiR0lGODlhIjsKKworc3RhdGljX2Fzc2VydChzaXplb2YoQ0ZYX0NGWF9HaWZJbWFnZUluZm8pID09IDksCisgICAgICAgICAgICAgICJDRlhfQ0ZYX0dpZkltYWdlSW5mbyBzaG91bGQgaGF2ZSBhIHNpemUgb2YgOSIpOworc3RhdGljX2Fzc2VydChzaXplb2YoQ0ZYX0dpZlBhbGV0dGUpID09IDMsCisgICAgICAgICAgICAgICJDRlhfR2lmUGFsZXR0ZSBzaG91bGQgaGF2ZSBhIHNpemUgb2YgMyIpOworc3RhdGljX2Fzc2VydChzaXplb2YoQ0ZYX0dpZlBsYWluVGV4dEV4dGVuc2lvbikgPT0gMTMsCisgICAgICAgICAgICAgICJDRlhfR2lmUGxhaW5UZXh0RXh0ZW5zaW9uIHNob3VsZCBoYXZlIGEgc2l6ZSBvZiAxMyIpOworc3RhdGljX2Fzc2VydChzaXplb2YoQ0ZYX0dpZkdyYXBoaWNDb250cm9sRXh0ZW5zaW9uKSA9PSA1LAorICAgICAgICAgICAgICAiQ0ZYX0dpZkdyYXBoaWNDb250cm9sRXh0ZW5zaW9uIHNob3VsZCBoYXZlIGEgc2l6ZSBvZiA1Iik7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihDRlhfR2lmSGVhZGVyKSA9PSA2LAorICAgICAgICAgICAgICAiQ0ZYX0dpZkhlYWRlciBzaG91bGQgaGF2ZSBhIHNpemUgb2YgNiIpOworc3RhdGljX2Fzc2VydChzaXplb2YoQ0ZYX0dpZkxvY2FsU2NyZWVuRGVzY3JpcHRvcikgPT0gNywKKyAgICAgICAgICAgICAgIkNGWF9HaWZMb2NhbFNjcmVlbkRlc2NyaXB0b3Igc2hvdWxkIGhhdmUgYSBzaXplIG9mIDciKTsKZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9naWYvY2Z4X2dpZi5oIGIvY29yZS9meGNvZGVjL2dpZi9jZnhfZ2lmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI4Mjc4ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjb2RlYy9naWYvY2Z4X2dpZi5oCkBAIC0wLDAgKzEsMTI3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENPREVDX0dJRl9DRlhfR0lGX0hfCisjZGVmaW5lIENPUkVfRlhDT0RFQ19HSUZfQ0ZYX0dJRl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworY2xhc3MgQ0ZYX0dpZkNvbnRleHQ7CisKK2V4dGVybiBjb25zdCBjaGFyKiBrR2lmU2lnbmF0dXJlODc7CitleHRlcm4gY29uc3QgY2hhcioga0dpZlNpZ25hdHVyZTg5OworCisjZGVmaW5lIEdJRl9TSUdfRVhURU5TSU9OIDB4MjEKKyNkZWZpbmUgR0lGX1NJR19JTUFHRSAweDJDCisjZGVmaW5lIEdJRl9TSUdfVFJBSUxFUiAweDNCCisjZGVmaW5lIEdJRl9CTE9DS19HQ0UgMHhGOQorI2RlZmluZSBHSUZfQkxPQ0tfUFRFIDB4MDEKKyNkZWZpbmUgR0lGX0JMT0NLX0NFIDB4RkUKKyNkZWZpbmUgR0lGX0JMT0NLX1RFUk1JTkFMIDB4MDAKKyNkZWZpbmUgR0lGX01BWF9MWldfRVhQIDEyCisjZGVmaW5lIEdJRl9NQVhfTFpXX0NPREUgNDA5NgorI2RlZmluZSBHSUZfREFUQV9CTE9DSyAyNTUKKyNkZWZpbmUgR0lGX0RfU1RBVFVTX1NJRyAweDAxCisjZGVmaW5lIEdJRl9EX1NUQVRVU19UQUlMIDB4MDIKKyNkZWZpbmUgR0lGX0RfU1RBVFVTX0VYVCAweDAzCisjZGVmaW5lIEdJRl9EX1NUQVRVU19FWFRfQ0UgMHgwNQorI2RlZmluZSBHSUZfRF9TVEFUVVNfRVhUX0dDRSAweDA2CisjZGVmaW5lIEdJRl9EX1NUQVRVU19FWFRfUFRFIDB4MDcKKyNkZWZpbmUgR0lGX0RfU1RBVFVTX0VYVF9VTkUgMHgwOAorI2RlZmluZSBHSUZfRF9TVEFUVVNfSU1HX0lORk8gMHgwOQorI2RlZmluZSBHSUZfRF9TVEFUVVNfSU1HX0RBVEEgMHgwQQorCisjcHJhZ21hIHBhY2soMSkKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDhfdCBwYWxfYml0cyA6IDM7CisgIHVpbnQ4X3Qgc29ydF9mbGFnIDogMTsKKyAgdWludDhfdCBjb2xvcl9yZXNvbHV0aW9uIDogMzsKKyAgdWludDhfdCBnbG9iYWxfcGFsIDogMTsKK30gQ0ZYX0dpZkdsb2JhbEZsYWdzOworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQ4X3QgcGFsX2JpdHMgOiAzOworICB1aW50OF90IHJlc2VydmVkIDogMjsKKyAgdWludDhfdCBzb3J0X2ZsYWcgOiAxOworICB1aW50OF90IGludGVybGFjZSA6IDE7CisgIHVpbnQ4X3QgbG9jYWxfcGFsIDogMTsKK30gQ0ZYX0dpZkxvY2FsRmxhZ3M7CisKK3R5cGVkZWYgc3RydWN0IHsgY2hhciBzaWduYXR1cmVbNl07IH0gQ0ZYX0dpZkhlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MTZfdCB3aWR0aDsKKyAgdWludDE2X3QgaGVpZ2h0OworICBDRlhfR2lmR2xvYmFsRmxhZ3MgZ2xvYmFsX2ZsYWdzOworICB1aW50OF90IGJjX2luZGV4OworICB1aW50OF90IHBpeGVsX2FzcGVjdDsKK30gQ0ZYX0dpZkxvY2FsU2NyZWVuRGVzY3JpcHRvcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MTZfdCBsZWZ0OworICB1aW50MTZfdCB0b3A7CisgIHVpbnQxNl90IHdpZHRoOworICB1aW50MTZfdCBoZWlnaHQ7CisgIENGWF9HaWZMb2NhbEZsYWdzIGxvY2FsX2ZsYWdzOworfSBDRlhfQ0ZYX0dpZkltYWdlSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50OF90IHRyYW5zcGFyZW5jeSA6IDE7CisgIHVpbnQ4X3QgdXNlcl9pbnB1dCA6IDE7CisgIHVpbnQ4X3QgZGlzcG9zYWxfbWV0aG9kIDogMzsKKyAgdWludDhfdCByZXNlcnZlZCA6IDM7Cit9IENGWF9HaWZDb250cm9sRXh0ZW5zaW9uRmxhZ3M7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDhfdCBibG9ja19zaXplOworICBDRlhfR2lmQ29udHJvbEV4dGVuc2lvbkZsYWdzIGdjZV9mbGFnczsKKyAgdWludDE2X3QgZGVsYXlfdGltZTsKKyAgdWludDhfdCB0cmFuc19pbmRleDsKK30gQ0ZYX0dpZkdyYXBoaWNDb250cm9sRXh0ZW5zaW9uOworCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQ4X3QgYmxvY2tfc2l6ZTsKKyAgdWludDE2X3QgZ3JpZF9sZWZ0OworICB1aW50MTZfdCBncmlkX3RvcDsKKyAgdWludDE2X3QgZ3JpZF93aWR0aDsKKyAgdWludDE2X3QgZ3JpZF9oZWlnaHQ7CisKKyAgdWludDhfdCBjaGFyX3dpZHRoOworICB1aW50OF90IGNoYXJfaGVpZ2h0OworCisgIHVpbnQ4X3QgZmNfaW5kZXg7CisgIHVpbnQ4X3QgYmNfaW5kZXg7Cit9IENGWF9HaWZQbGFpblRleHRFeHRlbnNpb247CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDhfdCBibG9ja19zaXplOworICB1aW50OF90IGFwcF9pZGVudGlmeVs4XTsKKyAgdWludDhfdCBhcHBfYXV0aGVudGljYXRpb25bM107Cit9IEdpZkFwcGxpY2F0aW9uRXh0ZW5zaW9uOworCit0eXBlZGVmIHN0cnVjdCB7IHVpbnQ4X3QgciwgZywgYjsgfSBDRlhfR2lmUGFsZXR0ZTsKKyNwcmFnbWEgcGFjaygpCisKK2VudW0gY2xhc3MgQ0ZYX0dpZkRlY29kZVN0YXR1cyB7CisgIEVycm9yLAorICBTdWNjZXNzLAorICBVbmZpbmlzaGVkLAorICBJbnN1ZmZpY2llbnREZXN0U2l6ZSwgIC8vIE9ubHkgdXNlZCBpbnRlcm5hbGx5IGJ5IENHaWZMWldEZWNvZGVyOjpEZWNvZGUoKQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0dpZkdyYXBoaWNDb250cm9sRXh0ZW5zaW9uPiBpbWFnZV9HQ0U7CisgIHN0ZDo6dmVjdG9yPENGWF9HaWZQYWxldHRlPiBsb2NhbF9wYWxldHRlczsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcm93X2J1ZmZlcjsKKyAgQ0ZYX0NGWF9HaWZJbWFnZUluZm8gaW1hZ2VfaW5mbzsKKyAgdWludDhfdCBsb2NhbF9wYWxsZXR0ZV9leHA7CisgIHVpbnQ4X3QgY29kZV9leHA7CisgIHVpbnQzMl90IGRhdGFfcG9zOworICBpbnQzMl90IHJvd19udW07Cit9IENGWF9HaWZJbWFnZTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ09ERUNfR0lGX0NGWF9HSUZfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9naWYvY2Z4X2dpZmNvbnRleHQuY3BwIGIvY29yZS9meGNvZGVjL2dpZi9jZnhfZ2lmY29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE1OWU1NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjb2RlYy9naWYvY2Z4X2dpZmNvbnRleHQuY3BwCkBAIC0wLDAgKzEsNTcyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvZ2lmL2NmeF9naWZjb250ZXh0LmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfZ2lmbW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2dpZi9jZnhfZ2lmLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgaW50MzJfdCBzX2dpZl9pbnRlcmxhY2Vfc3RlcFs0XSA9IHs4LCA4LCA0LCAyfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NGWF9HaWZDb250ZXh0OjpDRlhfR2lmQ29udGV4dChDQ29kZWNfR2lmTW9kdWxlKiBnaWZfbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDb2RlY19HaWZNb2R1bGU6OkRlbGVnYXRlKiBkZWxlZ2F0ZSkKKyAgICA6IGdpZl9tb2R1bGVfKGdpZl9tb2R1bGUpLAorICAgICAgZGVsZWdhdGVfKGRlbGVnYXRlKSwKKyAgICAgIGdsb2JhbF9wYWxfZXhwXygwKSwKKyAgICAgIGltZ19yb3dfb2Zmc2V0XygwKSwKKyAgICAgIGltZ19yb3dfYXZhaWxfc2l6ZV8oMCksCisgICAgICBhdmFpbF9pbl8oMCksCisgICAgICBkZWNvZGVfc3RhdHVzXyhHSUZfRF9TVEFUVVNfU0lHKSwKKyAgICAgIHNraXBfc2l6ZV8oMCksCisgICAgICBuZXh0X2luXyhudWxscHRyKSwKKyAgICAgIHdpZHRoXygwKSwKKyAgICAgIGhlaWdodF8oMCksCisgICAgICBiY19pbmRleF8oMCksCisgICAgICBwaXhlbF9hc3BlY3RfKDApLAorICAgICAgZ2xvYmFsX3NvcnRfZmxhZ18oMCksCisgICAgICBnbG9iYWxfY29sb3JfcmVzb2x1dGlvbl8oMCksCisgICAgICBpbWdfcGFzc19udW1fKDApIHt9CisKK0NGWF9HaWZDb250ZXh0Ojp+Q0ZYX0dpZkNvbnRleHQoKSB7fQorCit2b2lkIENGWF9HaWZDb250ZXh0OjpSZWNvcmRDdXJyZW50UG9zaXRpb24odWludDMyX3QqIGN1cl9wb3MpIHsKKyAgZGVsZWdhdGVfLT5HaWZSZWNvcmRDdXJyZW50UG9zaXRpb24oKmN1cl9wb3MpOworfQorCit2b2lkIENGWF9HaWZDb250ZXh0OjpSZWFkU2NhbmxpbmUoaW50MzJfdCByb3dfbnVtLCB1aW50OF90KiByb3dfYnVmKSB7CisgIGRlbGVnYXRlXy0+R2lmUmVhZFNjYW5saW5lKHJvd19udW0sIHJvd19idWYpOworfQorCitib29sIENGWF9HaWZDb250ZXh0OjpHZXRSZWNvcmRQb3NpdGlvbih1aW50MzJfdCBjdXJfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBhbF9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR2lmUGFsZXR0ZSogcGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWxheV90aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VyX2lucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0cmFuc19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGlzcG9zYWxfbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbnRlcmxhY2UpIHsKKyAgcmV0dXJuIGRlbGVnYXRlXy0+R2lmSW5wdXRSZWNvcmRQb3NpdGlvbkJ1ZigKKyAgICAgIGN1cl9wb3MsIEZYX1JFQ1QobGVmdCwgdG9wLCBsZWZ0ICsgd2lkdGgsIHRvcCArIGhlaWdodCksIHBhbF9udW0sIHBhbCwKKyAgICAgIGRlbGF5X3RpbWUsIHVzZXJfaW5wdXQsIHRyYW5zX2luZGV4LCBkaXNwb3NhbF9tZXRob2QsIGludGVybGFjZSk7Cit9CisKK0NGWF9HaWZEZWNvZGVTdGF0dXMgQ0ZYX0dpZkNvbnRleHQ6OlJlYWRIZWFkZXIoKSB7CisgIENGWF9HaWZEZWNvZGVTdGF0dXMgc3RhdHVzID0gUmVhZEdpZlNpZ25hdHVyZSgpOworICBpZiAoc3RhdHVzICE9IENGWF9HaWZEZWNvZGVTdGF0dXM6OlN1Y2Nlc3MpCisgICAgcmV0dXJuIHN0YXR1czsKKyAgcmV0dXJuIFJlYWRMb2dpY2FsU2NyZWVuRGVzY3JpcHRvcigpOworfQorCitDRlhfR2lmRGVjb2RlU3RhdHVzIENGWF9HaWZDb250ZXh0OjpHZXRGcmFtZSgpIHsKKyAgQ0ZYX0dpZkRlY29kZVN0YXR1cyByZXQgPSBDRlhfR2lmRGVjb2RlU3RhdHVzOjpTdWNjZXNzOworICB3aGlsZSAodHJ1ZSkgeworICAgIHN3aXRjaCAoZGVjb2RlX3N0YXR1c18pIHsKKyAgICAgIGNhc2UgR0lGX0RfU1RBVFVTX1RBSUw6CisgICAgICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpTdWNjZXNzOworICAgICAgY2FzZSBHSUZfRF9TVEFUVVNfU0lHOiB7CisgICAgICAgIHVpbnQ4X3QqIHNpZ25hdHVyZSA9IG51bGxwdHI7CisgICAgICAgIGlmICghUmVhZERhdGEoJnNpZ25hdHVyZSwgMSkpCisgICAgICAgICAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OlVuZmluaXNoZWQ7CisKKyAgICAgICAgc3dpdGNoICgqc2lnbmF0dXJlKSB7CisgICAgICAgICAgY2FzZSBHSUZfU0lHX0VYVEVOU0lPTjoKKyAgICAgICAgICAgIFNhdmVEZWNvZGluZ1N0YXR1cyhHSUZfRF9TVEFUVVNfRVhUKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGNhc2UgR0lGX1NJR19JTUFHRToKKyAgICAgICAgICAgIFNhdmVEZWNvZGluZ1N0YXR1cyhHSUZfRF9TVEFUVVNfSU1HX0lORk8pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgY2FzZSBHSUZfU0lHX1RSQUlMRVI6CisgICAgICAgICAgICBTYXZlRGVjb2RpbmdTdGF0dXMoR0lGX0RfU1RBVFVTX1RBSUwpOworICAgICAgICAgICAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OlN1Y2Nlc3M7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChhdmFpbF9pbl8pIHsKKyAgICAgICAgICAgICAgLy8gVGhlIEdpZiBGaWxlIGhhcyBub25fc3RhbmRhcmQgVGFnIQorICAgICAgICAgICAgICBTYXZlRGVjb2RpbmdTdGF0dXMoR0lGX0RfU1RBVFVTX1NJRyk7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVGhlIEdpZiBGaWxlIERvZXNuJ3QgaGF2ZSBUcmFpbGVyIFRhZyEKKyAgICAgICAgICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpTdWNjZXNzOworICAgICAgICB9CisgICAgICB9CisgICAgICBjYXNlIEdJRl9EX1NUQVRVU19FWFQ6IHsKKyAgICAgICAgdWludDhfdCogZXh0ZW5zaW9uID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKCFSZWFkRGF0YSgmZXh0ZW5zaW9uLCAxKSkKKyAgICAgICAgICByZXR1cm4gQ0ZYX0dpZkRlY29kZVN0YXR1czo6VW5maW5pc2hlZDsKKworICAgICAgICBzd2l0Y2ggKCpleHRlbnNpb24pIHsKKyAgICAgICAgICBjYXNlIEdJRl9CTE9DS19DRToKKyAgICAgICAgICAgIFNhdmVEZWNvZGluZ1N0YXR1cyhHSUZfRF9TVEFUVVNfRVhUX0NFKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGNhc2UgR0lGX0JMT0NLX0dDRToKKyAgICAgICAgICAgIFNhdmVEZWNvZGluZ1N0YXR1cyhHSUZfRF9TVEFUVVNfRVhUX0dDRSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICBjYXNlIEdJRl9CTE9DS19QVEU6CisgICAgICAgICAgICBTYXZlRGVjb2RpbmdTdGF0dXMoR0lGX0RfU1RBVFVTX0VYVF9QVEUpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgaW50MzJfdCBzdGF0dXMgPSBHSUZfRF9TVEFUVVNfRVhUX1VORTsKKyAgICAgICAgICAgIGlmICgqZXh0ZW5zaW9uID09IEdJRl9CTE9DS19QVEUpIHsKKyAgICAgICAgICAgICAgc3RhdHVzID0gR0lGX0RfU1RBVFVTX0VYVF9QVEU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTYXZlRGVjb2RpbmdTdGF0dXMoc3RhdHVzKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgY2FzZSBHSUZfRF9TVEFUVVNfSU1HX0lORk86IHsKKyAgICAgICAgcmV0ID0gRGVjb2RlSW1hZ2VJbmZvKCk7CisgICAgICAgIGlmIChyZXQgIT0gQ0ZYX0dpZkRlY29kZVN0YXR1czo6U3VjY2VzcykKKyAgICAgICAgICByZXR1cm4gcmV0OworCisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgY2FzZSBHSUZfRF9TVEFUVVNfSU1HX0RBVEE6IHsKKyAgICAgICAgdWludDhfdCogaW1nX2RhdGFfc2l6ZSA9IG51bGxwdHI7CisgICAgICAgIHVpbnQ4X3QqIGltZ19kYXRhID0gbnVsbHB0cjsKKyAgICAgICAgdWludDMyX3Qgc2tpcF9zaXplX29yZyA9IHNraXBfc2l6ZV87CisgICAgICAgIGlmICghUmVhZERhdGEoJmltZ19kYXRhX3NpemUsIDEpKQorICAgICAgICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpVbmZpbmlzaGVkOworCisgICAgICAgIHdoaWxlICgqaW1nX2RhdGFfc2l6ZSAhPSBHSUZfQkxPQ0tfVEVSTUlOQUwpIHsKKyAgICAgICAgICBpZiAoIVJlYWREYXRhKCZpbWdfZGF0YSwgKmltZ19kYXRhX3NpemUpKSB7CisgICAgICAgICAgICBza2lwX3NpemVfID0gc2tpcF9zaXplX29yZzsKKyAgICAgICAgICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpVbmZpbmlzaGVkOworICAgICAgICAgIH0KKworICAgICAgICAgIFNhdmVEZWNvZGluZ1N0YXR1cyhHSUZfRF9TVEFUVVNfSU1HX0RBVEEpOworICAgICAgICAgIHNraXBfc2l6ZV9vcmcgPSBza2lwX3NpemVfOworICAgICAgICAgIGlmICghUmVhZERhdGEoJmltZ19kYXRhX3NpemUsIDEpKQorICAgICAgICAgICAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OlVuZmluaXNoZWQ7CisgICAgICAgIH0KKyAgICAgICAgU2F2ZURlY29kaW5nU3RhdHVzKEdJRl9EX1NUQVRVU19TSUcpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgcmV0ID0gRGVjb2RlRXh0ZW5zaW9uKCk7CisgICAgICAgIGlmIChyZXQgIT0gQ0ZYX0dpZkRlY29kZVN0YXR1czo6U3VjY2VzcykKKyAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OlN1Y2Nlc3M7Cit9CisKK0NGWF9HaWZEZWNvZGVTdGF0dXMgQ0ZYX0dpZkNvbnRleHQ6OkxvYWRGcmFtZShpbnQzMl90IGZyYW1lX251bSkgeworICBpZiAoIXBkZml1bTo6SW5kZXhJbkJvdW5kcyhpbWFnZXNfLCBmcmFtZV9udW0pKQorICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpFcnJvcjsKKworICB1aW50OF90KiBpbWdfZGF0YV9zaXplID0gbnVsbHB0cjsKKyAgdWludDhfdCogaW1nX2RhdGEgPSBudWxscHRyOworICB1aW50MzJfdCBza2lwX3NpemVfb3JnID0gc2tpcF9zaXplXzsKKyAgQ0ZYX0dpZkltYWdlKiBnaWZfaW1hZ2UgPSBpbWFnZXNfW3N0YXRpY19jYXN0PHNpemVfdD4oZnJhbWVfbnVtKV0uZ2V0KCk7CisgIGlmIChnaWZfaW1hZ2UtPmltYWdlX2luZm8uaGVpZ2h0ID09IDApCisgICAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OkVycm9yOworCisgIHVpbnQzMl90IGdpZl9pbWdfcm93X2J5dGVzID0gZ2lmX2ltYWdlLT5pbWFnZV9pbmZvLndpZHRoOworICBpZiAoZ2lmX2ltZ19yb3dfYnl0ZXMgPT0gMCkKKyAgICByZXR1cm4gQ0ZYX0dpZkRlY29kZVN0YXR1czo6RXJyb3I7CisKKyAgaWYgKGRlY29kZV9zdGF0dXNfID09IEdJRl9EX1NUQVRVU19UQUlMKSB7CisgICAgZ2lmX2ltYWdlLT5yb3dfYnVmZmVyLnJlc2l6ZShnaWZfaW1nX3Jvd19ieXRlcyk7CisgICAgQ0ZYX0dpZkdyYXBoaWNDb250cm9sRXh0ZW5zaW9uKiBnaWZfaW1nX2djZSA9IGdpZl9pbWFnZS0+aW1hZ2VfR0NFLmdldCgpOworICAgIGludDMyX3QgbG9jX3BhbF9udW0gPQorICAgICAgICBnaWZfaW1hZ2UtPmltYWdlX2luZm8ubG9jYWxfZmxhZ3MubG9jYWxfcGFsCisgICAgICAgICAgICA/ICgyIDw8IGdpZl9pbWFnZS0+aW1hZ2VfaW5mby5sb2NhbF9mbGFncy5wYWxfYml0cykKKyAgICAgICAgICAgIDogMDsKKyAgICBhdmFpbF9pbl8gPSAwOworICAgIENGWF9HaWZQYWxldHRlKiBwTG9jYWxQYWxldHRlID0gZ2lmX2ltYWdlLT5sb2NhbF9wYWxldHRlcy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnaWZfaW1hZ2UtPmxvY2FsX3BhbGV0dGVzLmRhdGEoKTsKKyAgICBpZiAoIWdpZl9pbWdfZ2NlKSB7CisgICAgICBib29sIGJSZXMgPSBHZXRSZWNvcmRQb3NpdGlvbigKKyAgICAgICAgICBnaWZfaW1hZ2UtPmRhdGFfcG9zLCBnaWZfaW1hZ2UtPmltYWdlX2luZm8ubGVmdCwKKyAgICAgICAgICBnaWZfaW1hZ2UtPmltYWdlX2luZm8udG9wLCBnaWZfaW1hZ2UtPmltYWdlX2luZm8ud2lkdGgsCisgICAgICAgICAgZ2lmX2ltYWdlLT5pbWFnZV9pbmZvLmhlaWdodCwgbG9jX3BhbF9udW0sIHBMb2NhbFBhbGV0dGUsIDAsIDAsIC0xLCAwLAorICAgICAgICAgIGdpZl9pbWFnZS0+aW1hZ2VfaW5mby5sb2NhbF9mbGFncy5pbnRlcmxhY2UpOworICAgICAgaWYgKCFiUmVzKSB7CisgICAgICAgIGdpZl9pbWFnZS0+cm93X2J1ZmZlci5jbGVhcigpOworICAgICAgICByZXR1cm4gQ0ZYX0dpZkRlY29kZVN0YXR1czo6RXJyb3I7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGJvb2wgYlJlcyA9IEdldFJlY29yZFBvc2l0aW9uKAorICAgICAgICAgIGdpZl9pbWFnZS0+ZGF0YV9wb3MsIGdpZl9pbWFnZS0+aW1hZ2VfaW5mby5sZWZ0LAorICAgICAgICAgIGdpZl9pbWFnZS0+aW1hZ2VfaW5mby50b3AsIGdpZl9pbWFnZS0+aW1hZ2VfaW5mby53aWR0aCwKKyAgICAgICAgICBnaWZfaW1hZ2UtPmltYWdlX2luZm8uaGVpZ2h0LCBsb2NfcGFsX251bSwgcExvY2FsUGFsZXR0ZSwKKyAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihnaWZfaW1hZ2UtPmltYWdlX0dDRS0+ZGVsYXlfdGltZSksCisgICAgICAgICAgZ2lmX2ltYWdlLT5pbWFnZV9HQ0UtPmdjZV9mbGFncy51c2VyX2lucHV0LAorICAgICAgICAgIGdpZl9pbWFnZS0+aW1hZ2VfR0NFLT5nY2VfZmxhZ3MudHJhbnNwYXJlbmN5CisgICAgICAgICAgICAgID8gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZ2lmX2ltYWdlLT5pbWFnZV9HQ0UtPnRyYW5zX2luZGV4KQorICAgICAgICAgICAgICA6IC0xLAorICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGdpZl9pbWFnZS0+aW1hZ2VfR0NFLT5nY2VfZmxhZ3MuZGlzcG9zYWxfbWV0aG9kKSwKKyAgICAgICAgICBnaWZfaW1hZ2UtPmltYWdlX2luZm8ubG9jYWxfZmxhZ3MuaW50ZXJsYWNlKTsKKyAgICAgIGlmICghYlJlcykgeworICAgICAgICBnaWZfaW1hZ2UtPnJvd19idWZmZXIuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OkVycm9yOworICAgICAgfQorICAgIH0KKworICAgIGlmIChnaWZfaW1hZ2UtPmNvZGVfZXhwID4gR0lGX01BWF9MWldfRVhQKSB7CisgICAgICBnaWZfaW1hZ2UtPnJvd19idWZmZXIuY2xlYXIoKTsKKyAgICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpFcnJvcjsKKyAgICB9CisKKyAgICBpbWdfcm93X29mZnNldF8gPSAwOworICAgIGltZ19yb3dfYXZhaWxfc2l6ZV8gPSAwOworICAgIGltZ19wYXNzX251bV8gPSAwOworICAgIGdpZl9pbWFnZS0+cm93X251bSA9IDA7CisgICAgU2F2ZURlY29kaW5nU3RhdHVzKEdJRl9EX1NUQVRVU19JTUdfREFUQSk7CisgIH0KKworICBpZiAoZGVjb2RlX3N0YXR1c18gPT0gR0lGX0RfU1RBVFVTX0lNR19EQVRBKSB7CisgICAgaWYgKCFSZWFkRGF0YSgmaW1nX2RhdGFfc2l6ZSwgMSkpCisgICAgICByZXR1cm4gQ0ZYX0dpZkRlY29kZVN0YXR1czo6VW5maW5pc2hlZDsKKworICAgIGlmICgqaW1nX2RhdGFfc2l6ZSAhPSBHSUZfQkxPQ0tfVEVSTUlOQUwpIHsKKyAgICAgIGlmICghUmVhZERhdGEoJmltZ19kYXRhLCAqaW1nX2RhdGFfc2l6ZSkpIHsKKyAgICAgICAgc2tpcF9zaXplXyA9IHNraXBfc2l6ZV9vcmc7CisgICAgICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpVbmZpbmlzaGVkOworICAgICAgfQorCisgICAgICBpZiAoIWx6d19kZWNvbXByZXNzb3JfLmdldCgpKQorICAgICAgICBsendfZGVjb21wcmVzc29yXyA9IENGWF9MWldEZWNvbXByZXNzb3I6OkNyZWF0ZSgKKyAgICAgICAgICAgICFnaWZfaW1hZ2UtPmxvY2FsX3BhbGV0dGVzLmVtcHR5KCkgPyBnaWZfaW1hZ2UtPmxvY2FsX3BhbGxldHRlX2V4cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdsb2JhbF9wYWxfZXhwXywKKyAgICAgICAgICAgIGdpZl9pbWFnZS0+Y29kZV9leHApOworICAgICAgU2F2ZURlY29kaW5nU3RhdHVzKEdJRl9EX1NUQVRVU19JTUdfREFUQSk7CisgICAgICBpbWdfcm93X29mZnNldF8gKz0gaW1nX3Jvd19hdmFpbF9zaXplXzsKKyAgICAgIGltZ19yb3dfYXZhaWxfc2l6ZV8gPSBnaWZfaW1nX3Jvd19ieXRlcyAtIGltZ19yb3dfb2Zmc2V0XzsKKyAgICAgIENGWF9HaWZEZWNvZGVTdGF0dXMgcmV0ID0KKyAgICAgICAgICBsendfZGVjb21wcmVzc29yXy5nZXQoKQorICAgICAgICAgICAgICA/IGx6d19kZWNvbXByZXNzb3JfLT5EZWNvZGUoCisgICAgICAgICAgICAgICAgICAgIGltZ19kYXRhLCAqaW1nX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgZ2lmX2ltYWdlLT5yb3dfYnVmZmVyLmRhdGEoKSArIGltZ19yb3dfb2Zmc2V0XywKKyAgICAgICAgICAgICAgICAgICAgJmltZ19yb3dfYXZhaWxfc2l6ZV8pCisgICAgICAgICAgICAgIDogQ0ZYX0dpZkRlY29kZVN0YXR1czo6RXJyb3I7CisgICAgICBpZiAocmV0ID09IENGWF9HaWZEZWNvZGVTdGF0dXM6OkVycm9yKSB7CisgICAgICAgIERlY29kaW5nRmFpbHVyZUF0VGFpbENsZWFudXAoZ2lmX2ltYWdlKTsKKyAgICAgICAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OkVycm9yOworICAgICAgfQorICAgICAgd2hpbGUgKHJldCAhPSBDRlhfR2lmRGVjb2RlU3RhdHVzOjpFcnJvcikgeworICAgICAgICBpZiAocmV0ID09IENGWF9HaWZEZWNvZGVTdGF0dXM6OlN1Y2Nlc3MpIHsKKyAgICAgICAgICBSZWFkU2NhbmxpbmUoZ2lmX2ltYWdlLT5yb3dfbnVtLCBnaWZfaW1hZ2UtPnJvd19idWZmZXIuZGF0YSgpKTsKKyAgICAgICAgICBnaWZfaW1hZ2UtPnJvd19idWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICBTYXZlRGVjb2RpbmdTdGF0dXMoR0lGX0RfU1RBVFVTX1RBSUwpOworICAgICAgICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpTdWNjZXNzOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPT0gQ0ZYX0dpZkRlY29kZVN0YXR1czo6VW5maW5pc2hlZCkgeworICAgICAgICAgIHNraXBfc2l6ZV9vcmcgPSBza2lwX3NpemVfOworICAgICAgICAgIGlmICghUmVhZERhdGEoJmltZ19kYXRhX3NpemUsIDEpKQorICAgICAgICAgICAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OlVuZmluaXNoZWQ7CisKKyAgICAgICAgICBpZiAoKmltZ19kYXRhX3NpemUgIT0gR0lGX0JMT0NLX1RFUk1JTkFMKSB7CisgICAgICAgICAgICBpZiAoIVJlYWREYXRhKCZpbWdfZGF0YSwgKmltZ19kYXRhX3NpemUpKSB7CisgICAgICAgICAgICAgIHNraXBfc2l6ZV8gPSBza2lwX3NpemVfb3JnOworICAgICAgICAgICAgICByZXR1cm4gQ0ZYX0dpZkRlY29kZVN0YXR1czo6VW5maW5pc2hlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbHp3X2RlY29tcHJlc3Nvcl8uZ2V0KCkpCisgICAgICAgICAgICAgIGx6d19kZWNvbXByZXNzb3JfID0gQ0ZYX0xaV0RlY29tcHJlc3Nvcjo6Q3JlYXRlKAorICAgICAgICAgICAgICAgICAgIWdpZl9pbWFnZS0+bG9jYWxfcGFsZXR0ZXMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICAgID8gZ2lmX2ltYWdlLT5sb2NhbF9wYWxsZXR0ZV9leHAKKyAgICAgICAgICAgICAgICAgICAgICA6IGdsb2JhbF9wYWxfZXhwXywKKyAgICAgICAgICAgICAgICAgIGdpZl9pbWFnZS0+Y29kZV9leHApOworICAgICAgICAgICAgU2F2ZURlY29kaW5nU3RhdHVzKEdJRl9EX1NUQVRVU19JTUdfREFUQSk7CisgICAgICAgICAgICBpbWdfcm93X29mZnNldF8gKz0gaW1nX3Jvd19hdmFpbF9zaXplXzsKKyAgICAgICAgICAgIGltZ19yb3dfYXZhaWxfc2l6ZV8gPSBnaWZfaW1nX3Jvd19ieXRlcyAtIGltZ19yb3dfb2Zmc2V0XzsKKyAgICAgICAgICAgIHJldCA9IGx6d19kZWNvbXByZXNzb3JfLmdldCgpCisgICAgICAgICAgICAgICAgICAgICAgPyBsendfZGVjb21wcmVzc29yXy0+RGVjb2RlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ19kYXRhLCAqaW1nX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaWZfaW1hZ2UtPnJvd19idWZmZXIuZGF0YSgpICsgaW1nX3Jvd19vZmZzZXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWdfcm93X2F2YWlsX3NpemVfKQorICAgICAgICAgICAgICAgICAgICAgIDogQ0ZYX0dpZkRlY29kZVN0YXR1czo6RXJyb3I7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPT0gQ0ZYX0dpZkRlY29kZVN0YXR1czo6SW5zdWZmaWNpZW50RGVzdFNpemUpIHsKKyAgICAgICAgICBpZiAoZ2lmX2ltYWdlLT5pbWFnZV9pbmZvLmxvY2FsX2ZsYWdzLmludGVybGFjZSkgeworICAgICAgICAgICAgUmVhZFNjYW5saW5lKGdpZl9pbWFnZS0+cm93X251bSwgZ2lmX2ltYWdlLT5yb3dfYnVmZmVyLmRhdGEoKSk7CisgICAgICAgICAgICBnaWZfaW1hZ2UtPnJvd19udW0gKz0gc19naWZfaW50ZXJsYWNlX3N0ZXBbaW1nX3Bhc3NfbnVtX107CisgICAgICAgICAgICBpZiAoZ2lmX2ltYWdlLT5yb3dfbnVtID49CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oZ2lmX2ltYWdlLT5pbWFnZV9pbmZvLmhlaWdodCkpIHsKKyAgICAgICAgICAgICAgaW1nX3Bhc3NfbnVtXysrOworICAgICAgICAgICAgICBpZiAoaW1nX3Bhc3NfbnVtXyA9PSBGWF9BcnJheVNpemUoc19naWZfaW50ZXJsYWNlX3N0ZXApKSB7CisgICAgICAgICAgICAgICAgRGVjb2RpbmdGYWlsdXJlQXRUYWlsQ2xlYW51cChnaWZfaW1hZ2UpOworICAgICAgICAgICAgICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpFcnJvcjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBnaWZfaW1hZ2UtPnJvd19udW0gPSBzX2dpZl9pbnRlcmxhY2Vfc3RlcFtpbWdfcGFzc19udW1fXSAvIDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFJlYWRTY2FubGluZShnaWZfaW1hZ2UtPnJvd19udW0rKywgZ2lmX2ltYWdlLT5yb3dfYnVmZmVyLmRhdGEoKSk7CisgICAgICAgICAgfQorICAgICAgICAgIGltZ19yb3dfb2Zmc2V0XyA9IDA7CisgICAgICAgICAgaW1nX3Jvd19hdmFpbF9zaXplXyA9IGdpZl9pbWdfcm93X2J5dGVzOworICAgICAgICAgIHJldCA9IGx6d19kZWNvbXByZXNzb3JfLmdldCgpCisgICAgICAgICAgICAgICAgICAgID8gbHp3X2RlY29tcHJlc3Nvcl8tPkRlY29kZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nX2RhdGEsICppbWdfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBnaWZfaW1hZ2UtPnJvd19idWZmZXIuZGF0YSgpICsgaW1nX3Jvd19vZmZzZXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1nX3Jvd19hdmFpbF9zaXplXykKKyAgICAgICAgICAgICAgICAgICAgOiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpFcnJvcjsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ID09IENGWF9HaWZEZWNvZGVTdGF0dXM6OkVycm9yKSB7CisgICAgICAgICAgRGVjb2RpbmdGYWlsdXJlQXRUYWlsQ2xlYW51cChnaWZfaW1hZ2UpOworICAgICAgICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpFcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBTYXZlRGVjb2RpbmdTdGF0dXMoR0lGX0RfU1RBVFVTX1RBSUwpOworICB9CisgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpFcnJvcjsKK30KKwordm9pZCBDRlhfR2lmQ29udGV4dDo6U2V0SW5wdXRCdWZmZXIodWludDhfdCogc3JjX2J1ZiwgdWludDMyX3Qgc3JjX3NpemUpIHsKKyAgbmV4dF9pbl8gPSBzcmNfYnVmOworICBhdmFpbF9pbl8gPSBzcmNfc2l6ZTsKKyAgc2tpcF9zaXplXyA9IDA7Cit9CisKK3VpbnQzMl90IENGWF9HaWZDb250ZXh0OjpHZXRBdmFpbElucHV0KHVpbnQ4X3QqKiBhdmFpbF9idWYpIGNvbnN0IHsKKyAgaWYgKGF2YWlsX2J1ZikgeworICAgICphdmFpbF9idWYgPSBudWxscHRyOworICAgIGlmIChhdmFpbF9pbl8gPiAwKQorICAgICAgKmF2YWlsX2J1ZiA9IG5leHRfaW5fOworICB9CisgIHJldHVybiBhdmFpbF9pbl87Cit9CisKK3VpbnQ4X3QqIENGWF9HaWZDb250ZXh0OjpSZWFkRGF0YSh1aW50OF90KiogZGVzX2J1Zl9wcCwgdWludDMyX3QgZGF0YV9zaXplKSB7CisgIGlmICghbmV4dF9pbl8pCisgICAgcmV0dXJuIG51bGxwdHI7CisgIGlmIChhdmFpbF9pbl8gPD0gc2tpcF9zaXplXykKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgaWYgKCFkZXNfYnVmX3BwKQorICAgIHJldHVybiBudWxscHRyOworICBpZiAoZGF0YV9zaXplID09IDApCisgICAgcmV0dXJuIG51bGxwdHI7CisgIGlmIChhdmFpbF9pbl8gLSBza2lwX3NpemVfIDwgZGF0YV9zaXplKQorICAgIHJldHVybiBudWxscHRyOworCisgICpkZXNfYnVmX3BwID0gbmV4dF9pbl8gKyBza2lwX3NpemVfOworICBza2lwX3NpemVfICs9IGRhdGFfc2l6ZTsKKyAgcmV0dXJuICpkZXNfYnVmX3BwOworfQorCitDRlhfR2lmRGVjb2RlU3RhdHVzIENGWF9HaWZDb250ZXh0OjpSZWFkR2lmU2lnbmF0dXJlKCkgeworICBDRlhfR2lmSGVhZGVyKiBoZWFkZXIgPSBudWxscHRyOworICB1aW50MzJfdCBza2lwX3NpemVfb3JnID0gc2tpcF9zaXplXzsKKyAgaWYgKCFSZWFkRGF0YShyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqKj4oJmhlYWRlciksIDYpKSB7CisgICAgc2tpcF9zaXplXyA9IHNraXBfc2l6ZV9vcmc7CisgICAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OlVuZmluaXNoZWQ7CisgIH0KKworICBpZiAoc3RybmNtcChoZWFkZXItPnNpZ25hdHVyZSwga0dpZlNpZ25hdHVyZTg3LCA2KSAhPSAwICYmCisgICAgICBzdHJuY21wKGhlYWRlci0+c2lnbmF0dXJlLCBrR2lmU2lnbmF0dXJlODksIDYpICE9IDApCisgICAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OkVycm9yOworCisgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpTdWNjZXNzOworfQorCitDRlhfR2lmRGVjb2RlU3RhdHVzIENGWF9HaWZDb250ZXh0OjpSZWFkTG9naWNhbFNjcmVlbkRlc2NyaXB0b3IoKSB7CisgIENGWF9HaWZMb2NhbFNjcmVlbkRlc2NyaXB0b3IqIGxzZCA9IG51bGxwdHI7CisgIHVpbnQzMl90IHNraXBfc2l6ZV9vcmcgPSBza2lwX3NpemVfOworICBpZiAoIVJlYWREYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCoqPigmbHNkKSwgNykpIHsKKyAgICBza2lwX3NpemVfID0gc2tpcF9zaXplX29yZzsKKyAgICByZXR1cm4gQ0ZYX0dpZkRlY29kZVN0YXR1czo6VW5maW5pc2hlZDsKKyAgfQorCisgIGlmIChsc2QtPmdsb2JhbF9mbGFncy5nbG9iYWxfcGFsKSB7CisgICAgdWludDMyX3QgcGFsZXR0ZV9jb3VudCA9IHVuc2lnbmVkKDIgPDwgbHNkLT5nbG9iYWxfZmxhZ3MucGFsX2JpdHMpOworICAgIGlmIChsc2QtPmJjX2luZGV4ID49IHBhbGV0dGVfY291bnQpCisgICAgICByZXR1cm4gQ0ZYX0dpZkRlY29kZVN0YXR1czo6RXJyb3I7CisgICAgYmNfaW5kZXhfID0gbHNkLT5iY19pbmRleDsKKworICAgIHVpbnQzMl90IHBhbGV0dGVfc2l6ZSA9IHBhbGV0dGVfY291bnQgKiAzdTsKKyAgICB1aW50OF90KiBwYWxldHRlID0gbnVsbHB0cjsKKyAgICBpZiAoIVJlYWREYXRhKCZwYWxldHRlLCBwYWxldHRlX3NpemUpKSB7CisgICAgICBza2lwX3NpemVfID0gc2tpcF9zaXplX29yZzsKKyAgICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpVbmZpbmlzaGVkOworICAgIH0KKworICAgIGdsb2JhbF9wYWxfZXhwXyA9IGxzZC0+Z2xvYmFsX2ZsYWdzLnBhbF9iaXRzOworICAgIGdsb2JhbF9zb3J0X2ZsYWdfID0gbHNkLT5nbG9iYWxfZmxhZ3Muc29ydF9mbGFnOworICAgIGdsb2JhbF9jb2xvcl9yZXNvbHV0aW9uXyA9IGxzZC0+Z2xvYmFsX2ZsYWdzLmNvbG9yX3Jlc29sdXRpb247CisgICAgZ2xvYmFsX3BhbGV0dGVfLnJlc2l6ZShwYWxldHRlX2NvdW50KTsKKyAgICBtZW1jcHkoZ2xvYmFsX3BhbGV0dGVfLmRhdGEoKSwgcGFsZXR0ZSwgcGFsZXR0ZV9zaXplKTsKKyAgfQorCisgIHdpZHRoXyA9IHN0YXRpY19jYXN0PGludD4oCisgICAgICBGWFdPUkRfR0VUX0xTQkZJUlNUKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZsc2QtPndpZHRoKSkpOworICBoZWlnaHRfID0gc3RhdGljX2Nhc3Q8aW50PigKKyAgICAgIEZYV09SRF9HRVRfTFNCRklSU1QocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJmxzZC0+aGVpZ2h0KSkpOworCisgIHBpeGVsX2FzcGVjdF8gPSBsc2QtPnBpeGVsX2FzcGVjdDsKKyAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OlN1Y2Nlc3M7Cit9CisKK3ZvaWQgQ0ZYX0dpZkNvbnRleHQ6OlNhdmVEZWNvZGluZ1N0YXR1cyhpbnQzMl90IHN0YXR1cykgeworICBkZWNvZGVfc3RhdHVzXyA9IHN0YXR1czsKKyAgbmV4dF9pbl8gKz0gc2tpcF9zaXplXzsKKyAgYXZhaWxfaW5fIC09IHNraXBfc2l6ZV87CisgIHNraXBfc2l6ZV8gPSAwOworfQorCitDRlhfR2lmRGVjb2RlU3RhdHVzIENGWF9HaWZDb250ZXh0OjpEZWNvZGVFeHRlbnNpb24oKSB7CisgIHVpbnQ4X3QqIGRhdGFfc2l6ZSA9IG51bGxwdHI7CisgIHVpbnQ4X3QqIGRhdGFfYnVmID0gbnVsbHB0cjsKKyAgdWludDMyX3Qgc2tpcF9zaXplX29yZyA9IHNraXBfc2l6ZV87CisgIHN3aXRjaCAoZGVjb2RlX3N0YXR1c18pIHsKKyAgICBjYXNlIEdJRl9EX1NUQVRVU19FWFRfQ0U6IHsKKyAgICAgIGlmICghUmVhZERhdGEoJmRhdGFfc2l6ZSwgMSkpIHsKKyAgICAgICAgc2tpcF9zaXplXyA9IHNraXBfc2l6ZV9vcmc7CisgICAgICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpVbmZpbmlzaGVkOworICAgICAgfQorCisgICAgICBjbXRfZGF0YV8uY2xlYXIoKTsKKyAgICAgIHdoaWxlICgqZGF0YV9zaXplICE9IEdJRl9CTE9DS19URVJNSU5BTCkgeworICAgICAgICB1aW50OF90IGJsb2NrX3NpemUgPSAqZGF0YV9zaXplOworICAgICAgICBpZiAoIVJlYWREYXRhKCZkYXRhX2J1ZiwgKmRhdGFfc2l6ZSkgfHwgIVJlYWREYXRhKCZkYXRhX3NpemUsIDEpKSB7CisgICAgICAgICAgc2tpcF9zaXplXyA9IHNraXBfc2l6ZV9vcmc7CisgICAgICAgICAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OlVuZmluaXNoZWQ7CisgICAgICAgIH0KKworICAgICAgICBjbXRfZGF0YV8gKz0gQnl0ZVN0cmluZyhkYXRhX2J1ZiwgYmxvY2tfc2l6ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHSUZfRF9TVEFUVVNfRVhUX1BURTogeworICAgICAgQ0ZYX0dpZlBsYWluVGV4dEV4dGVuc2lvbiogZ2lmX3B0ZSA9IG51bGxwdHI7CisgICAgICBpZiAoIVJlYWREYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCoqPigmZ2lmX3B0ZSksIDEzKSkKKyAgICAgICAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OlVuZmluaXNoZWQ7CisKKyAgICAgIGdyYXBoaWNfY29udHJvbF9leHRlbnNpb25fID0gbnVsbHB0cjsKKyAgICAgIGlmICghUmVhZERhdGEoJmRhdGFfc2l6ZSwgMSkpIHsKKyAgICAgICAgc2tpcF9zaXplXyA9IHNraXBfc2l6ZV9vcmc7CisgICAgICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpVbmZpbmlzaGVkOworICAgICAgfQorCisgICAgICB3aGlsZSAoKmRhdGFfc2l6ZSAhPSBHSUZfQkxPQ0tfVEVSTUlOQUwpIHsKKyAgICAgICAgaWYgKCFSZWFkRGF0YSgmZGF0YV9idWYsICpkYXRhX3NpemUpIHx8ICFSZWFkRGF0YSgmZGF0YV9zaXplLCAxKSkgeworICAgICAgICAgIHNraXBfc2l6ZV8gPSBza2lwX3NpemVfb3JnOworICAgICAgICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpVbmZpbmlzaGVkOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHSUZfRF9TVEFUVVNfRVhUX0dDRTogeworICAgICAgQ0ZYX0dpZkdyYXBoaWNDb250cm9sRXh0ZW5zaW9uKiBnaWZfZ2NlID0gbnVsbHB0cjsKKyAgICAgIGlmICghUmVhZERhdGEocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kio+KCZnaWZfZ2NlKSwgNikpCisgICAgICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpVbmZpbmlzaGVkOworCisgICAgICBpZiAoIWdyYXBoaWNfY29udHJvbF9leHRlbnNpb25fLmdldCgpKQorICAgICAgICBncmFwaGljX2NvbnRyb2xfZXh0ZW5zaW9uXyA9CisgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0dpZkdyYXBoaWNDb250cm9sRXh0ZW5zaW9uPigpOworICAgICAgZ3JhcGhpY19jb250cm9sX2V4dGVuc2lvbl8tPmJsb2NrX3NpemUgPSBnaWZfZ2NlLT5ibG9ja19zaXplOworICAgICAgZ3JhcGhpY19jb250cm9sX2V4dGVuc2lvbl8tPmdjZV9mbGFncyA9IGdpZl9nY2UtPmdjZV9mbGFnczsKKyAgICAgIGdyYXBoaWNfY29udHJvbF9leHRlbnNpb25fLT5kZWxheV90aW1lID0KKyAgICAgICAgICBGWFdPUkRfR0VUX0xTQkZJUlNUKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZnaWZfZ2NlLT5kZWxheV90aW1lKSk7CisgICAgICBncmFwaGljX2NvbnRyb2xfZXh0ZW5zaW9uXy0+dHJhbnNfaW5kZXggPSBnaWZfZ2NlLT50cmFuc19pbmRleDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICBpZiAoZGVjb2RlX3N0YXR1c18gPT0gR0lGX0RfU1RBVFVTX0VYVF9QVEUpCisgICAgICAgIGdyYXBoaWNfY29udHJvbF9leHRlbnNpb25fID0gbnVsbHB0cjsKKyAgICAgIGlmICghUmVhZERhdGEoJmRhdGFfc2l6ZSwgMSkpCisgICAgICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpVbmZpbmlzaGVkOworCisgICAgICB3aGlsZSAoKmRhdGFfc2l6ZSAhPSBHSUZfQkxPQ0tfVEVSTUlOQUwpIHsKKyAgICAgICAgaWYgKCFSZWFkRGF0YSgmZGF0YV9idWYsICpkYXRhX3NpemUpIHx8ICFSZWFkRGF0YSgmZGF0YV9zaXplLCAxKSkgeworICAgICAgICAgIHNraXBfc2l6ZV8gPSBza2lwX3NpemVfb3JnOworICAgICAgICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpVbmZpbmlzaGVkOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIFNhdmVEZWNvZGluZ1N0YXR1cyhHSUZfRF9TVEFUVVNfU0lHKTsKKyAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OlN1Y2Nlc3M7Cit9CisKK0NGWF9HaWZEZWNvZGVTdGF0dXMgQ0ZYX0dpZkNvbnRleHQ6OkRlY29kZUltYWdlSW5mbygpIHsKKyAgaWYgKHdpZHRoXyA8PSAwIHx8IGhlaWdodF8gPD0gMCkKKyAgICByZXR1cm4gQ0ZYX0dpZkRlY29kZVN0YXR1czo6RXJyb3I7CisKKyAgdWludDMyX3Qgc2tpcF9zaXplX29yZyA9IHNraXBfc2l6ZV87CisgIENGWF9DRlhfR2lmSW1hZ2VJbmZvKiBpbWdfaW5mbyA9IG51bGxwdHI7CisgIGlmICghUmVhZERhdGEocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kio+KCZpbWdfaW5mbyksIDkpKQorICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpVbmZpbmlzaGVkOworCisgIGF1dG8gZ2lmX2ltYWdlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9HaWZJbWFnZT4oKTsKKyAgZ2lmX2ltYWdlLT5pbWFnZV9pbmZvLmxlZnQgPQorICAgICAgRlhXT1JEX0dFVF9MU0JGSVJTVChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmaW1nX2luZm8tPmxlZnQpKTsKKyAgZ2lmX2ltYWdlLT5pbWFnZV9pbmZvLnRvcCA9CisgICAgICBGWFdPUkRfR0VUX0xTQkZJUlNUKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZpbWdfaW5mby0+dG9wKSk7CisgIGdpZl9pbWFnZS0+aW1hZ2VfaW5mby53aWR0aCA9CisgICAgICBGWFdPUkRfR0VUX0xTQkZJUlNUKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZpbWdfaW5mby0+d2lkdGgpKTsKKyAgZ2lmX2ltYWdlLT5pbWFnZV9pbmZvLmhlaWdodCA9CisgICAgICBGWFdPUkRfR0VUX0xTQkZJUlNUKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZpbWdfaW5mby0+aGVpZ2h0KSk7CisgIGdpZl9pbWFnZS0+aW1hZ2VfaW5mby5sb2NhbF9mbGFncyA9IGltZ19pbmZvLT5sb2NhbF9mbGFnczsKKyAgaWYgKGdpZl9pbWFnZS0+aW1hZ2VfaW5mby5sZWZ0ICsgZ2lmX2ltYWdlLT5pbWFnZV9pbmZvLndpZHRoID4gd2lkdGhfIHx8CisgICAgICBnaWZfaW1hZ2UtPmltYWdlX2luZm8udG9wICsgZ2lmX2ltYWdlLT5pbWFnZV9pbmZvLmhlaWdodCA+IGhlaWdodF8pCisgICAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OkVycm9yOworCisgIENGWF9HaWZMb2NhbEZsYWdzKiBnaWZfaW1nX2luZm9fbGYgPSAmaW1nX2luZm8tPmxvY2FsX2ZsYWdzOworICBpZiAoZ2lmX2ltZ19pbmZvX2xmLT5sb2NhbF9wYWwpIHsKKyAgICBnaWZfaW1hZ2UtPmxvY2FsX3BhbGxldHRlX2V4cCA9IGdpZl9pbWdfaW5mb19sZi0+cGFsX2JpdHM7CisgICAgdWludDMyX3QgbG9jX3BhbF9zaXplID0gdW5zaWduZWQoMiA8PCBnaWZfaW1nX2luZm9fbGYtPnBhbF9iaXRzKSAqIDN1OworICAgIHVpbnQ4X3QqIGxvY19wYWwgPSBudWxscHRyOworICAgIGlmICghUmVhZERhdGEoJmxvY19wYWwsIGxvY19wYWxfc2l6ZSkpIHsKKyAgICAgIHNraXBfc2l6ZV8gPSBza2lwX3NpemVfb3JnOworICAgICAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OlVuZmluaXNoZWQ7CisgICAgfQorCisgICAgZ2lmX2ltYWdlLT5sb2NhbF9wYWxldHRlcyA9IHN0ZDo6dmVjdG9yPENGWF9HaWZQYWxldHRlPihsb2NfcGFsX3NpemUgLyAzKTsKKyAgICBzdGQ6OmNvcHkobG9jX3BhbCwgbG9jX3BhbCArIGxvY19wYWxfc2l6ZSwKKyAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oZ2lmX2ltYWdlLT5sb2NhbF9wYWxldHRlcy5kYXRhKCkpKTsKKyAgfQorCisgIHVpbnQ4X3QqIGNvZGVfc2l6ZSA9IG51bGxwdHI7CisgIGlmICghUmVhZERhdGEoJmNvZGVfc2l6ZSwgMSkpIHsKKyAgICBza2lwX3NpemVfID0gc2tpcF9zaXplX29yZzsKKyAgICByZXR1cm4gQ0ZYX0dpZkRlY29kZVN0YXR1czo6VW5maW5pc2hlZDsKKyAgfQorCisgIGdpZl9pbWFnZS0+Y29kZV9leHAgPSAqY29kZV9zaXplOworICBSZWNvcmRDdXJyZW50UG9zaXRpb24oJmdpZl9pbWFnZS0+ZGF0YV9wb3MpOworICBnaWZfaW1hZ2UtPmRhdGFfcG9zICs9IHNraXBfc2l6ZV87CisgIGdpZl9pbWFnZS0+aW1hZ2VfR0NFID0gbnVsbHB0cjsKKyAgaWYgKGdyYXBoaWNfY29udHJvbF9leHRlbnNpb25fLmdldCgpKSB7CisgICAgaWYgKGdyYXBoaWNfY29udHJvbF9leHRlbnNpb25fLT5nY2VfZmxhZ3MudHJhbnNwYXJlbmN5KSB7CisgICAgICAvLyBOZWVkIHRvIHRlc3QgdGhhdCB0aGUgY29sb3IgdGhhdCBpcyBnb2luZyB0byBiZSB0cmFuc3BhcmVudCBpcyBhY3R1YWxseQorICAgICAgLy8gaW4gdGhlIHBhbGV0dGUgYmVpbmcgdXNlZC4KKyAgICAgIGlmIChncmFwaGljX2NvbnRyb2xfZXh0ZW5zaW9uXy0+dHJhbnNfaW5kZXggPj0KKyAgICAgICAgICAyIDw8IChnaWZfaW1hZ2UtPmxvY2FsX3BhbGV0dGVzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgPyBnbG9iYWxfcGFsX2V4cF8KKyAgICAgICAgICAgICAgICAgICAgOiBnaWZfaW1hZ2UtPmxvY2FsX3BhbGxldHRlX2V4cCkpCisgICAgICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpFcnJvcjsKKyAgICB9CisgICAgZ2lmX2ltYWdlLT5pbWFnZV9HQ0UgPSBzdGQ6Om1vdmUoZ3JhcGhpY19jb250cm9sX2V4dGVuc2lvbl8pOworICAgIGdyYXBoaWNfY29udHJvbF9leHRlbnNpb25fID0gbnVsbHB0cjsKKyAgfQorCisgIGltYWdlc18ucHVzaF9iYWNrKHN0ZDo6bW92ZShnaWZfaW1hZ2UpKTsKKyAgU2F2ZURlY29kaW5nU3RhdHVzKEdJRl9EX1NUQVRVU19JTUdfREFUQSk7CisgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpTdWNjZXNzOworfQorCit2b2lkIENGWF9HaWZDb250ZXh0OjpEZWNvZGluZ0ZhaWx1cmVBdFRhaWxDbGVhbnVwKENGWF9HaWZJbWFnZSogZ2lmX2ltYWdlKSB7CisgIGdpZl9pbWFnZS0+cm93X2J1ZmZlci5jbGVhcigpOworICBTYXZlRGVjb2RpbmdTdGF0dXMoR0lGX0RfU1RBVFVTX1RBSUwpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2dpZi9jZnhfZ2lmY29udGV4dC5oIGIvY29yZS9meGNvZGVjL2dpZi9jZnhfZ2lmY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMzY3YmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y29kZWMvZ2lmL2NmeF9naWZjb250ZXh0LmgKQEAgLTAsMCArMSw4MCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDT0RFQ19HSUZfQ0ZYX0dJRkNPTlRFWFRfSF8KKyNkZWZpbmUgQ09SRV9GWENPREVDX0dJRl9DRlhfR0lGQ09OVEVYVF9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfZ2lmbW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2dpZi9jZnhfZ2lmLmgiCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2dpZi9jZnhfbHp3ZGVjb21wcmVzc29yLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisKK2NsYXNzIENGWF9HaWZDb250ZXh0IDogcHVibGljIENDb2RlY19HaWZNb2R1bGU6OkNvbnRleHQgeworIHB1YmxpYzoKKyAgQ0ZYX0dpZkNvbnRleHQoQ0NvZGVjX0dpZk1vZHVsZSogZ2lmX21vZHVsZSwKKyAgICAgICAgICAgICAgICAgQ0NvZGVjX0dpZk1vZHVsZTo6RGVsZWdhdGUqIGRlbGVnYXRlKTsKKyAgfkNGWF9HaWZDb250ZXh0KCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBSZWNvcmRDdXJyZW50UG9zaXRpb24odWludDMyX3QqIGN1cl9wb3MpOworICB2b2lkIFJlYWRTY2FubGluZShpbnQzMl90IHJvd19udW0sIHVpbnQ4X3QqIHJvd19idWYpOworICBib29sIEdldFJlY29yZFBvc2l0aW9uKHVpbnQzMl90IGN1cl9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwYWxfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HaWZQYWxldHRlKiBwYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkZWxheV90aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlcl9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRyYW5zX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGlzcG9zYWxfbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW50ZXJsYWNlKTsKKyAgQ0ZYX0dpZkRlY29kZVN0YXR1cyBSZWFkSGVhZGVyKCk7CisgIENGWF9HaWZEZWNvZGVTdGF0dXMgR2V0RnJhbWUoKTsKKyAgQ0ZYX0dpZkRlY29kZVN0YXR1cyBMb2FkRnJhbWUoaW50MzJfdCBmcmFtZV9udW0pOworICB2b2lkIFNldElucHV0QnVmZmVyKHVpbnQ4X3QqIHNyY19idWYsIHVpbnQzMl90IHNyY19zaXplKTsKKyAgdWludDMyX3QgR2V0QXZhaWxJbnB1dCh1aW50OF90KiogYXZhaWxfYnVmKSBjb25zdDsKKyAgc2l6ZV90IEdldEZyYW1lTnVtKCkgY29uc3QgeyByZXR1cm4gaW1hZ2VzXy5zaXplKCk7IH0KKworICBVbm93bmVkUHRyPENDb2RlY19HaWZNb2R1bGU+IGdpZl9tb2R1bGVfOworICBVbm93bmVkUHRyPENDb2RlY19HaWZNb2R1bGU6OkRlbGVnYXRlPiBkZWxlZ2F0ZV87CisgIHN0ZDo6dmVjdG9yPENGWF9HaWZQYWxldHRlPiBnbG9iYWxfcGFsZXR0ZV87CisgIHVpbnQ4X3QgZ2xvYmFsX3BhbF9leHBfOworICB1aW50MzJfdCBpbWdfcm93X29mZnNldF87CisgIHVpbnQzMl90IGltZ19yb3dfYXZhaWxfc2l6ZV87CisgIHVpbnQzMl90IGF2YWlsX2luXzsKKyAgaW50MzJfdCBkZWNvZGVfc3RhdHVzXzsKKyAgdWludDMyX3Qgc2tpcF9zaXplXzsKKyAgQnl0ZVN0cmluZyBjbXRfZGF0YV87CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfR2lmR3JhcGhpY0NvbnRyb2xFeHRlbnNpb24+IGdyYXBoaWNfY29udHJvbF9leHRlbnNpb25fOworICB1aW50OF90KiBuZXh0X2luXzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWF9HaWZJbWFnZT4+IGltYWdlc187CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfTFpXRGVjb21wcmVzc29yPiBsendfZGVjb21wcmVzc29yXzsKKyAgaW50IHdpZHRoXzsKKyAgaW50IGhlaWdodF87CisgIHVpbnQ4X3QgYmNfaW5kZXhfOworICB1aW50OF90IHBpeGVsX2FzcGVjdF87CisgIHVpbnQ4X3QgZ2xvYmFsX3NvcnRfZmxhZ187CisgIHVpbnQ4X3QgZ2xvYmFsX2NvbG9yX3Jlc29sdXRpb25fOworICB1aW50OF90IGltZ19wYXNzX251bV87CisKKyBwcm90ZWN0ZWQ6CisgIHVpbnQ4X3QqIFJlYWREYXRhKHVpbnQ4X3QqKiBkZXNfYnVmX3BwLCB1aW50MzJfdCBkYXRhX3NpemUpOworICBDRlhfR2lmRGVjb2RlU3RhdHVzIFJlYWRHaWZTaWduYXR1cmUoKTsKKyAgQ0ZYX0dpZkRlY29kZVN0YXR1cyBSZWFkTG9naWNhbFNjcmVlbkRlc2NyaXB0b3IoKTsKKworIHByaXZhdGU6CisgIHZvaWQgU2F2ZURlY29kaW5nU3RhdHVzKGludDMyX3Qgc3RhdHVzKTsKKyAgQ0ZYX0dpZkRlY29kZVN0YXR1cyBEZWNvZGVFeHRlbnNpb24oKTsKKyAgQ0ZYX0dpZkRlY29kZVN0YXR1cyBEZWNvZGVJbWFnZUluZm8oKTsKKyAgdm9pZCBEZWNvZGluZ0ZhaWx1cmVBdFRhaWxDbGVhbnVwKENGWF9HaWZJbWFnZSogZ2lmX2ltYWdlKTsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWENPREVDX0dJRl9DRlhfR0lGQ09OVEVYVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2dpZi9jZnhfZ2lmY29udGV4dF91bml0dGVzdC5jcHAgYi9jb3JlL2Z4Y29kZWMvZ2lmL2NmeF9naWZjb250ZXh0X3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWQzYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNvZGVjL2dpZi9jZnhfZ2lmY29udGV4dF91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwzMTUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9naWYvY2Z4X2dpZmNvbnRleHQuaCIKKworI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworY2xhc3MgQ0ZYX0dpZkNvbnRleHRGb3JUZXN0IDogcHVibGljIENGWF9HaWZDb250ZXh0IHsKKyBwdWJsaWM6CisgIENGWF9HaWZDb250ZXh0Rm9yVGVzdChDQ29kZWNfR2lmTW9kdWxlKiBnaWZfbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0NvZGVjX0dpZk1vZHVsZTo6RGVsZWdhdGUqIGRlbGVnYXRlKQorICAgICAgOiBDRlhfR2lmQ29udGV4dChnaWZfbW9kdWxlLCBkZWxlZ2F0ZSkge30KKyAgfkNGWF9HaWZDb250ZXh0Rm9yVGVzdCgpIG92ZXJyaWRlIHt9CisKKyAgdXNpbmcgQ0ZYX0dpZkNvbnRleHQ6OlJlYWREYXRhOworICB1c2luZyBDRlhfR2lmQ29udGV4dDo6UmVhZEdpZlNpZ25hdHVyZTsKKyAgdXNpbmcgQ0ZYX0dpZkNvbnRleHQ6OlJlYWRMb2dpY2FsU2NyZWVuRGVzY3JpcHRvcjsKK307CisKK1RFU1QoQ0ZYX0dpZkNvbnRleHQsIFNldElucHV0QnVmZmVyKSB7CisgIENGWF9HaWZDb250ZXh0Rm9yVGVzdCBjb250ZXh0KG51bGxwdHIsIG51bGxwdHIpOworCisgIGNvbnRleHQuU2V0SW5wdXRCdWZmZXIobnVsbHB0ciwgMCk7CisgIEVYUEVDVF9FUShudWxscHRyLCBjb250ZXh0Lm5leHRfaW5fKTsKKyAgRVhQRUNUX0VRKDB1LCBjb250ZXh0LmF2YWlsX2luXyk7CisgIEVYUEVDVF9FUSgwdSwgY29udGV4dC5za2lwX3NpemVfKTsKKworICBjb250ZXh0LlNldElucHV0QnVmZmVyKG51bGxwdHIsIDEwMCk7CisgIEVYUEVDVF9FUShudWxscHRyLCBjb250ZXh0Lm5leHRfaW5fKTsKKyAgRVhQRUNUX0VRKDEwMHUsIGNvbnRleHQuYXZhaWxfaW5fKTsKKyAgRVhQRUNUX0VRKDB1LCBjb250ZXh0LnNraXBfc2l6ZV8pOworCisgIHVpbnQ4X3QgYnVmZmVyW10gPSB7MHgwMCwgMHgwMSwgMHgwMn07CisgIGNvbnRleHQuU2V0SW5wdXRCdWZmZXIoYnVmZmVyLCAwKTsKKyAgRVhQRUNUX0VRKGJ1ZmZlciwgY29udGV4dC5uZXh0X2luXyk7CisgIEVYUEVDVF9FUSgwdSwgY29udGV4dC5hdmFpbF9pbl8pOworICBFWFBFQ1RfRVEoMHUsIGNvbnRleHQuc2tpcF9zaXplXyk7CisKKyAgY29udGV4dC5TZXRJbnB1dEJ1ZmZlcihidWZmZXIsIDMpOworICBFWFBFQ1RfRVEoYnVmZmVyLCBjb250ZXh0Lm5leHRfaW5fKTsKKyAgRVhQRUNUX0VRKDN1LCBjb250ZXh0LmF2YWlsX2luXyk7CisgIEVYUEVDVF9FUSgwdSwgY29udGV4dC5za2lwX3NpemVfKTsKKworICBjb250ZXh0LlNldElucHV0QnVmZmVyKGJ1ZmZlciwgMTAwKTsKKyAgRVhQRUNUX0VRKGJ1ZmZlciwgY29udGV4dC5uZXh0X2luXyk7CisgIEVYUEVDVF9FUSgxMDB1LCBjb250ZXh0LmF2YWlsX2luXyk7CisgIEVYUEVDVF9FUSgwdSwgY29udGV4dC5za2lwX3NpemVfKTsKK30KKworVEVTVChDRlhfR2lmQ29udGV4dCwgUmVhZERhdGEpIHsKKyAgQ0ZYX0dpZkNvbnRleHRGb3JUZXN0IGNvbnRleHQobnVsbHB0ciwgbnVsbHB0cik7CisKKyAgY29udGV4dC5TZXRJbnB1dEJ1ZmZlcihudWxscHRyLCAwKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIGNvbnRleHQuUmVhZERhdGEobnVsbHB0ciwgMCkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgY29udGV4dC5SZWFkRGF0YShudWxscHRyLCAxMCkpOworCisgIHVpbnQ4X3QqIGRlc3RfYnVmZmVyID0gbnVsbHB0cjsKKyAgRVhQRUNUX0VRKG51bGxwdHIsCisgICAgICAgICAgICBjb250ZXh0LlJlYWREYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCoqPigmZGVzdF9idWZmZXIpLCAwKSk7CisgIEVYUEVDVF9FUShudWxscHRyLAorICAgICAgICAgICAgY29udGV4dC5SZWFkRGF0YShyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqKj4oJmRlc3RfYnVmZmVyKSwgMTApKTsKKworICB1aW50OF90IHNyY19idWZmZXJbXSA9IHsweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5fTsKKyAgY29udGV4dC5TZXRJbnB1dEJ1ZmZlcihzcmNfYnVmZmVyLCAwKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsCisgICAgICAgICAgICBjb250ZXh0LlJlYWREYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCoqPigmZGVzdF9idWZmZXIpLCAxMCkpOworICBFWFBFQ1RfRVEocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oc3JjX2J1ZmZlciksIGNvbnRleHQubmV4dF9pbl8pOworICBFWFBFQ1RfRVEoMHUsIGNvbnRleHQuYXZhaWxfaW5fKTsKKyAgRVhQRUNUX0VRKDB1LCBjb250ZXh0LnNraXBfc2l6ZV8pOworCisgIGRlc3RfYnVmZmVyID0gbnVsbHB0cjsKKyAgY29udGV4dC5TZXRJbnB1dEJ1ZmZlcihzcmNfYnVmZmVyLCAxMCk7CisgIEVYUEVDVF9FUShzcmNfYnVmZmVyLAorICAgICAgICAgICAgY29udGV4dC5SZWFkRGF0YShyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqKj4oJmRlc3RfYnVmZmVyKSwgMTApKTsKKyAgRVhQRUNUX0VRKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHNyY19idWZmZXIpLCBkZXN0X2J1ZmZlcik7CisgIEVYUEVDVF9FUShzcmNfYnVmZmVyLCBjb250ZXh0Lm5leHRfaW5fKTsKKyAgRVhQRUNUX0VRKDEwdSwgY29udGV4dC5hdmFpbF9pbl8pOworICBFWFBFQ1RfRVEoMTB1LCBjb250ZXh0LnNraXBfc2l6ZV8pOworCisgIGRlc3RfYnVmZmVyID0gbnVsbHB0cjsKKyAgY29udGV4dC5TZXRJbnB1dEJ1ZmZlcihzcmNfYnVmZmVyLCAxMCk7CisgIEVYUEVDVF9FUShzcmNfYnVmZmVyLAorICAgICAgICAgICAgY29udGV4dC5SZWFkRGF0YShyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqKj4oJmRlc3RfYnVmZmVyKSwgNSkpOworICBFWFBFQ1RfRVEocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oc3JjX2J1ZmZlciksIGRlc3RfYnVmZmVyKTsKKyAgRVhQRUNUX0VRKHNyY19idWZmZXIsIGNvbnRleHQubmV4dF9pbl8pOworICBFWFBFQ1RfRVEoMTB1LCBjb250ZXh0LmF2YWlsX2luXyk7CisgIEVYUEVDVF9FUSg1dSwgY29udGV4dC5za2lwX3NpemVfKTsKKworICBkZXN0X2J1ZmZlciA9IG51bGxwdHI7CisgIEVYUEVDVF9FUShzcmNfYnVmZmVyICsgNSwKKyAgICAgICAgICAgIGNvbnRleHQuUmVhZERhdGEocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kio+KCZkZXN0X2J1ZmZlciksIDUpKTsKKyAgRVhQRUNUX0VRKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHNyY19idWZmZXIgKyA1KSwgZGVzdF9idWZmZXIpOworICBFWFBFQ1RfRVEoc3JjX2J1ZmZlciwgY29udGV4dC5uZXh0X2luXyk7CisgIEVYUEVDVF9FUSgxMHUsIGNvbnRleHQuYXZhaWxfaW5fKTsKKyAgRVhQRUNUX0VRKDEwdSwgY29udGV4dC5za2lwX3NpemVfKTsKKworICBkZXN0X2J1ZmZlciA9IG51bGxwdHI7CisgIEVYUEVDVF9FUShudWxscHRyLAorICAgICAgICAgICAgY29udGV4dC5SZWFkRGF0YShyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqKj4oJmRlc3RfYnVmZmVyKSwgNSkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgZGVzdF9idWZmZXIpOworICBFWFBFQ1RfRVEoc3JjX2J1ZmZlciwgY29udGV4dC5uZXh0X2luXyk7CisgIEVYUEVDVF9FUSgxMHUsIGNvbnRleHQuYXZhaWxfaW5fKTsKKyAgRVhQRUNUX0VRKDEwdSwgY29udGV4dC5za2lwX3NpemVfKTsKK30KKworVEVTVChDRlhfR2lmQ29udGV4dCwgUmVhZEdpZlNpZ25hdHVyZSkgeworICBDRlhfR2lmQ29udGV4dEZvclRlc3QgY29udGV4dChudWxscHRyLCBudWxscHRyKTsKKworICB7CisgICAgdWludDhfdCBkYXRhWzFdOworICAgIGNvbnRleHQuU2V0SW5wdXRCdWZmZXIoZGF0YSwgMCk7CisgICAgRVhQRUNUX0VRKENGWF9HaWZEZWNvZGVTdGF0dXM6OlVuZmluaXNoZWQsIGNvbnRleHQuUmVhZEdpZlNpZ25hdHVyZSgpKTsKKyAgICBFWFBFQ1RfRVEoMHUsIGNvbnRleHQuc2tpcF9zaXplXyk7CisgIH0KKyAgLy8gTWFrZSBzdXJlIHRlc3RpbmcgdGhlIGVudGlyZSBzaWduYXR1cmUKKyAgeworICAgIHVpbnQ4X3QgZGF0YVtdID0geydHJywgJ0knLCAnRid9OworICAgIGNvbnRleHQuU2V0SW5wdXRCdWZmZXIoZGF0YSwgc2l6ZW9mKGRhdGEpKTsKKyAgICBFWFBFQ1RfRVEoQ0ZYX0dpZkRlY29kZVN0YXR1czo6VW5maW5pc2hlZCwgY29udGV4dC5SZWFkR2lmU2lnbmF0dXJlKCkpOworICAgIEVYUEVDVF9FUSgwdSwgY29udGV4dC5za2lwX3NpemVfKTsKKyAgfQorICB7CisgICAgdWludDhfdCBkYXRhW10gPSB7J04nLCAnTycsICdUJywgJ0cnLCAnSScsICdGJ307CisgICAgY29udGV4dC5TZXRJbnB1dEJ1ZmZlcihkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIEVYUEVDVF9FUShDRlhfR2lmRGVjb2RlU3RhdHVzOjpFcnJvciwgY29udGV4dC5SZWFkR2lmU2lnbmF0dXJlKCkpOworICAgIEVYUEVDVF9FUSg2dSwgY29udGV4dC5za2lwX3NpemVfKTsKKyAgfQorICAvLyBNYWtlIHN1cmUgbm90IG1hdGNoaW5nIEdJRjgqYQorICB7CisgICAgdWludDhfdCBkYXRhW10gPSB7J0cnLCAnSScsICdGJywgJzgnLCAnMCcsICdhJ307CisgICAgY29udGV4dC5TZXRJbnB1dEJ1ZmZlcihkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIEVYUEVDVF9FUShDRlhfR2lmRGVjb2RlU3RhdHVzOjpFcnJvciwgY29udGV4dC5SZWFkR2lmU2lnbmF0dXJlKCkpOworICAgIEVYUEVDVF9FUSg2dSwgY29udGV4dC5za2lwX3NpemVfKTsKKyAgfQorICAvLyBNYWtlIHN1cmUgbm90IG1hdGNoaW5nIEdJRioqYQorICB7CisgICAgdWludDhfdCBkYXRhW10gPSB7J0cnLCAnSScsICdGJywgJzknLCAnMicsICdhJ307CisgICAgY29udGV4dC5TZXRJbnB1dEJ1ZmZlcihkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIEVYUEVDVF9FUShDRlhfR2lmRGVjb2RlU3RhdHVzOjpFcnJvciwgY29udGV4dC5SZWFkR2lmU2lnbmF0dXJlKCkpOworICAgIEVYUEVDVF9FUSg2dSwgY29udGV4dC5za2lwX3NpemVfKTsKKyAgfQorICAvLyBPbmUgdmFsaWQgc2lnbmF0dXJlCisgIHsKKyAgICB1aW50OF90IGRhdGFbXSA9IHsnRycsICdJJywgJ0YnLCAnOCcsICc3JywgJ2EnfTsKKyAgICBjb250ZXh0LlNldElucHV0QnVmZmVyKGRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgRVhQRUNUX0VRKENGWF9HaWZEZWNvZGVTdGF0dXM6OlN1Y2Nlc3MsIGNvbnRleHQuUmVhZEdpZlNpZ25hdHVyZSgpKTsKKyAgICBFWFBFQ1RfRVEoNnUsIGNvbnRleHQuc2tpcF9zaXplXyk7CisgIH0KKyAgLy8gVGhlIG90aGVyIHZhbGlkIHNpZ25hdHVyZQorICB7CisgICAgdWludDhfdCBkYXRhW10gPSB7J0cnLCAnSScsICdGJywgJzgnLCAnOScsICdhJ307CisgICAgY29udGV4dC5TZXRJbnB1dEJ1ZmZlcihkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIEVYUEVDVF9FUShDRlhfR2lmRGVjb2RlU3RhdHVzOjpTdWNjZXNzLCBjb250ZXh0LlJlYWRHaWZTaWduYXR1cmUoKSk7CisgICAgRVhQRUNUX0VRKDZ1LCBjb250ZXh0LnNraXBfc2l6ZV8pOworICB9Cit9CisKK1RFU1QoQ0ZYX0dpZkNvbnRleHQsIFJlYWRMb2NhbFNjcmVlbkRlc2NyaXB0b3IpIHsKKyAgQ0ZYX0dpZkNvbnRleHRGb3JUZXN0IGNvbnRleHQobnVsbHB0ciwgbnVsbHB0cik7CisgIHsKKyAgICB1aW50OF90IGRhdGFbMV07CisgICAgY29udGV4dC5TZXRJbnB1dEJ1ZmZlcihkYXRhLCAwKTsKKyAgICBFWFBFQ1RfRVEoQ0ZYX0dpZkRlY29kZVN0YXR1czo6VW5maW5pc2hlZCwKKyAgICAgICAgICAgICAgY29udGV4dC5SZWFkTG9naWNhbFNjcmVlbkRlc2NyaXB0b3IoKSk7CisgIH0KKyAgLy8gTFNEIHdpdGggYWxsIHRoZSB2YWx1ZXMgemVybydkCisgIHsKKyAgICB1aW50OF90IGxzZFtzaXplb2YoQ0ZYX0dpZkxvY2FsU2NyZWVuRGVzY3JpcHRvcildOworICAgIG1lbXNldCgmbHNkLCAwLCBzaXplb2YoQ0ZYX0dpZkxvY2FsU2NyZWVuRGVzY3JpcHRvcikpOworICAgIGNvbnRleHQuU2V0SW5wdXRCdWZmZXIobHNkLCBzaXplb2YoQ0ZYX0dpZkxvY2FsU2NyZWVuRGVzY3JpcHRvcikpOworCisgICAgRVhQRUNUX0VRKENGWF9HaWZEZWNvZGVTdGF0dXM6OlN1Y2Nlc3MsCisgICAgICAgICAgICAgIGNvbnRleHQuUmVhZExvZ2ljYWxTY3JlZW5EZXNjcmlwdG9yKCkpOworCisgICAgRVhQRUNUX0VRKHNpemVvZihDRlhfR2lmTG9jYWxTY3JlZW5EZXNjcmlwdG9yKSwgY29udGV4dC5za2lwX3NpemVfKTsKKyAgICBFWFBFQ1RfRVEoMCwgY29udGV4dC53aWR0aF8pOworICAgIEVYUEVDVF9FUSgwLCBjb250ZXh0LmhlaWdodF8pOworICAgIEVYUEVDVF9FUSgwdSwgY29udGV4dC5iY19pbmRleF8pOworICAgIEVYUEVDVF9FUSgwdSwgY29udGV4dC5waXhlbF9hc3BlY3RfKTsKKyAgfQorICAvLyBMU0Qgd2l0aCBubyBnbG9iYWwgcGFsZXR0ZQorICB7CisgICAgdWludDhfdCBsc2Rbc2l6ZW9mKENGWF9HaWZMb2NhbFNjcmVlbkRlc2NyaXB0b3IpXSA9IHsweDBBLCAweDAwLCAweDAwLCAweDBGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMCwgMHgwMSwgMHgwMn07CisgICAgY29udGV4dC5TZXRJbnB1dEJ1ZmZlcihsc2QsIHNpemVvZihDRlhfR2lmTG9jYWxTY3JlZW5EZXNjcmlwdG9yKSk7CisKKyAgICBFWFBFQ1RfRVEoQ0ZYX0dpZkRlY29kZVN0YXR1czo6U3VjY2VzcywKKyAgICAgICAgICAgICAgY29udGV4dC5SZWFkTG9naWNhbFNjcmVlbkRlc2NyaXB0b3IoKSk7CisKKyAgICBFWFBFQ1RfRVEoc2l6ZW9mKENGWF9HaWZMb2NhbFNjcmVlbkRlc2NyaXB0b3IpLCBjb250ZXh0LnNraXBfc2l6ZV8pOworICAgIEVYUEVDVF9FUSgweDAwMEEsIGNvbnRleHQud2lkdGhfKTsKKyAgICBFWFBFQ1RfRVEoMHgwRjAwLCBjb250ZXh0LmhlaWdodF8pOworICAgIEVYUEVDVF9FUSgwdSwgY29udGV4dC5iY19pbmRleF8pOyAgLy8gYmNfaW5kZXhfIGlzIDAgaWYgbm8gZ2xvYmFsIHBhbGV0dGUKKyAgICBFWFBFQ1RfRVEoMnUsIGNvbnRleHQucGl4ZWxfYXNwZWN0Xyk7CisgIH0KKyAgLy8gTFNEIHdpdGggZ2xvYmFsIHBhbGV0dGUgYml0IHNldCwgYnV0IG5vIGdsb2JhbCBwYWxldHRlCisgIHsKKyAgICB1aW50OF90IGxzZFtzaXplb2YoQ0ZYX0dpZkxvY2FsU2NyZWVuRGVzY3JpcHRvcildID0gezB4MEEsIDB4MDAsIDB4MDAsIDB4MEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwLCAweDAxLCAweDAyfTsKKyAgICBjb250ZXh0LlNldElucHV0QnVmZmVyKGxzZCwgc2l6ZW9mKENGWF9HaWZMb2NhbFNjcmVlbkRlc2NyaXB0b3IpKTsKKworICAgIEVYUEVDVF9FUShDRlhfR2lmRGVjb2RlU3RhdHVzOjpVbmZpbmlzaGVkLAorICAgICAgICAgICAgICBjb250ZXh0LlJlYWRMb2dpY2FsU2NyZWVuRGVzY3JpcHRvcigpKTsKKworICAgIEVYUEVDVF9FUSgwdSwgY29udGV4dC5za2lwX3NpemVfKTsKKyAgfQorICAvLyBMU0Qgd2l0aCBnbG9iYWwgcGFsZXR0ZQorICB7CisgICAgc3RydWN0IHsKKyAgICAgIHVpbnQ4X3QgbHNkW3NpemVvZihDRlhfR2lmTG9jYWxTY3JlZW5EZXNjcmlwdG9yKV07CisgICAgICB1aW50OF90IHBhbGV0dGVbNCAqIHNpemVvZihDRlhfR2lmUGFsZXR0ZSldOworICAgIH0gZGF0YSA9IHt7MHgwQSwgMHgwMCwgMHgwMCwgMHgwRiwgMHhBOSwgMHgwMSwgMHgwMn0sCisgICAgICAgICAgICAgIHswLCAwLCAwLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAxfX07CisgICAgY29udGV4dC5TZXRJbnB1dEJ1ZmZlcihyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmZGF0YSksIHNpemVvZihkYXRhKSk7CisKKyAgICBFWFBFQ1RfRVEoQ0ZYX0dpZkRlY29kZVN0YXR1czo6U3VjY2VzcywKKyAgICAgICAgICAgICAgY29udGV4dC5SZWFkTG9naWNhbFNjcmVlbkRlc2NyaXB0b3IoKSk7CisKKyAgICBFWFBFQ1RfRVEoc2l6ZW9mKGRhdGEpLCBjb250ZXh0LnNraXBfc2l6ZV8pOworICAgIEVYUEVDVF9FUSgweDAwMEEsIGNvbnRleHQud2lkdGhfKTsKKyAgICBFWFBFQ1RfRVEoMHgwRjAwLCBjb250ZXh0LmhlaWdodF8pOworICAgIEVYUEVDVF9FUSgxdSwgY29udGV4dC5iY19pbmRleF8pOworICAgIEVYUEVDVF9FUSgydSwgY29udGV4dC5waXhlbF9hc3BlY3RfKTsKKworICAgIEVYUEVDVF9FUSgxdSwgY29udGV4dC5nbG9iYWxfcGFsX2V4cF8pOworICAgIEVYUEVDVF9FUSgxLCBjb250ZXh0Lmdsb2JhbF9zb3J0X2ZsYWdfKTsKKyAgICBFWFBFQ1RfRVEoMiwgY29udGV4dC5nbG9iYWxfY29sb3JfcmVzb2x1dGlvbl8pOworICAgIEVYUEVDVF9UUlVFKDAgPT0gbWVtY21wKGRhdGEucGFsZXR0ZSwgY29udGV4dC5nbG9iYWxfcGFsZXR0ZV8uZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkYXRhLnBhbGV0dGUpKSk7CisgIH0KK30KKworVEVTVChDRlhfR2lmQ29udGV4dCwgUmVhZEhlYWRlcikgeworICBDRlhfR2lmQ29udGV4dEZvclRlc3QgY29udGV4dChudWxscHRyLCBudWxscHRyKTsKKyAgLy8gQmFkIHNpZ25hdHVyZQorICB7CisgICAgc3RydWN0IHsKKyAgICAgIHVpbnQ4X3Qgc2lnbmF0dXJlWzZdOworICAgICAgdWludDhfdCBsc2Rbc2l6ZW9mKENGWF9HaWZMb2NhbFNjcmVlbkRlc2NyaXB0b3IpXTsKKyAgICB9IGRhdGEgPSB7eydOJywgJ08nLCAnVCcsICdHJywgJ0knLCAnRid9LAorICAgICAgICAgICAgICB7MHgwQSwgMHgwMCwgMHgwMCwgMHgwRiwgMHgwMCwgMHgwMSwgMHgwMn19OworICAgIGNvbnRleHQuU2V0SW5wdXRCdWZmZXIocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJmRhdGEpLCBzaXplb2YoZGF0YSkpOworCisgICAgRVhQRUNUX0VRKENGWF9HaWZEZWNvZGVTdGF0dXM6OkVycm9yLCBjb250ZXh0LlJlYWRIZWFkZXIoKSk7CisKKyAgICBFWFBFQ1RfRVEoc2l6ZW9mKGRhdGEuc2lnbmF0dXJlKSwgY29udGV4dC5za2lwX3NpemVfKTsKKyAgfQorICAvLyBTaG9ydCBhZnRlciBzaWduYXR1cmUKKyAgeworICAgIHVpbnQ4X3Qgc2lnbmF0dXJlW10gPSB7J0cnLCAnSScsICdGJywgJzgnLCAnNycsICdhJ307CisgICAgY29udGV4dC5TZXRJbnB1dEJ1ZmZlcihyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmc2lnbmF0dXJlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzaWduYXR1cmUpKTsKKworICAgIEVYUEVDVF9FUShDRlhfR2lmRGVjb2RlU3RhdHVzOjpVbmZpbmlzaGVkLCBjb250ZXh0LlJlYWRIZWFkZXIoKSk7CisKKyAgICBFWFBFQ1RfRVEoc2l6ZW9mKHNpZ25hdHVyZSksIGNvbnRleHQuc2tpcF9zaXplXyk7CisgIH0KKyAgLy8gU3VjY2VzcyB3aXRob3V0IGdsb2JhbCBwYWxldHRlCisgIHsKKyAgICBzdHJ1Y3QgeworICAgICAgdWludDhfdCBzaWduYXR1cmVbNl07CisgICAgICB1aW50OF90IGxzZFtzaXplb2YoQ0ZYX0dpZkxvY2FsU2NyZWVuRGVzY3JpcHRvcildOworICAgIH0gZGF0YSA9IHt7J0cnLCAnSScsICdGJywgJzgnLCAnNycsICdhJ30sCisgICAgICAgICAgICAgIHsweDBBLCAweDAwLCAweDAwLCAweDBGLCAweDAwLCAweDAxLCAweDAyfX07CisgICAgY29udGV4dC5TZXRJbnB1dEJ1ZmZlcihyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmZGF0YSksIHNpemVvZihkYXRhKSk7CisKKyAgICBFWFBFQ1RfRVEoQ0ZYX0dpZkRlY29kZVN0YXR1czo6U3VjY2VzcywgY29udGV4dC5SZWFkSGVhZGVyKCkpOworCisgICAgRVhQRUNUX0VRKHNpemVvZihkYXRhKSwgY29udGV4dC5za2lwX3NpemVfKTsKKyAgICBFWFBFQ1RfRVEoMHgwMDBBLCBjb250ZXh0LndpZHRoXyk7CisgICAgRVhQRUNUX0VRKDB4MEYwMCwgY29udGV4dC5oZWlnaHRfKTsKKyAgICBFWFBFQ1RfRVEoMHUsIGNvbnRleHQuYmNfaW5kZXhfKTsgIC8vIGJjX2luZGV4XyBpcyAwIGlmIG5vIGdsb2JhbCBwYWxldHRlCisgICAgRVhQRUNUX0VRKDJ1LCBjb250ZXh0LnBpeGVsX2FzcGVjdF8pOworICB9CisgIC8vIE1pc3NpbmcgR2xvYmFsIFBhbGV0dGUKKyAgeworICAgIHN0cnVjdCB7CisgICAgICB1aW50OF90IHNpZ25hdHVyZVs2XTsKKyAgICAgIHVpbnQ4X3QgbHNkW3NpemVvZihDRlhfR2lmTG9jYWxTY3JlZW5EZXNjcmlwdG9yKV07CisgICAgfSBkYXRhID0ge3snRycsICdJJywgJ0YnLCAnOCcsICc3JywgJ2EnfSwKKyAgICAgICAgICAgICAgezB4MEEsIDB4MDAsIDB4MDAsIDB4MEYsIDB4ODAsIDB4MDEsIDB4MDJ9fTsKKyAgICBjb250ZXh0LlNldElucHV0QnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZkYXRhKSwgc2l6ZW9mKGRhdGEpKTsKKworICAgIEVYUEVDVF9FUShDRlhfR2lmRGVjb2RlU3RhdHVzOjpVbmZpbmlzaGVkLCBjb250ZXh0LlJlYWRIZWFkZXIoKSk7CisKKyAgICBFWFBFQ1RfRVEoc2l6ZW9mKGRhdGEuc2lnbmF0dXJlKSwgY29udGV4dC5za2lwX3NpemVfKTsKKyAgfQorICAvLyBTdWNjZXNzIHdpdGggZ2xvYmFsIHBhbGV0dGUKKyAgeworICAgIHN0cnVjdCB7CisgICAgICB1aW50OF90IHNpZ25hdHVyZVs2XTsKKyAgICAgIHVpbnQ4X3QgbHNkW3NpemVvZihDRlhfR2lmTG9jYWxTY3JlZW5EZXNjcmlwdG9yKV07CisgICAgICB1aW50OF90IHBhbGV0dGVbNCAqIHNpemVvZihDRlhfR2lmUGFsZXR0ZSldOworICAgIH0gZGF0YSA9IHt7J0cnLCAnSScsICdGJywgJzgnLCAnNycsICdhJ30sCisgICAgICAgICAgICAgIHsweDBBLCAweDAwLCAweDAwLCAweDBGLCAweEE5LCAweDAxLCAweDAyfSwKKyAgICAgICAgICAgICAgezAsIDAsIDAsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDF9fTsKKyAgICBjb250ZXh0LlNldElucHV0QnVmZmVyKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZkYXRhKSwgc2l6ZW9mKGRhdGEpKTsKKworICAgIEVYUEVDVF9FUShDRlhfR2lmRGVjb2RlU3RhdHVzOjpTdWNjZXNzLCBjb250ZXh0LlJlYWRIZWFkZXIoKSk7CisKKyAgICBFWFBFQ1RfRVEoc2l6ZW9mKGRhdGEpLCBjb250ZXh0LnNraXBfc2l6ZV8pOworICAgIEVYUEVDVF9FUSgweDAwMEEsIGNvbnRleHQud2lkdGhfKTsKKyAgICBFWFBFQ1RfRVEoMHgwRjAwLCBjb250ZXh0LmhlaWdodF8pOworICAgIEVYUEVDVF9FUSgxdSwgY29udGV4dC5iY19pbmRleF8pOworICAgIEVYUEVDVF9FUSgydSwgY29udGV4dC5waXhlbF9hc3BlY3RfKTsKKyAgICBFWFBFQ1RfRVEoMXUsIGNvbnRleHQuZ2xvYmFsX3BhbF9leHBfKTsKKyAgICBFWFBFQ1RfRVEoMSwgY29udGV4dC5nbG9iYWxfc29ydF9mbGFnXyk7CisgICAgRVhQRUNUX0VRKDIsIGNvbnRleHQuZ2xvYmFsX2NvbG9yX3Jlc29sdXRpb25fKTsKKyAgICBFWFBFQ1RfVFJVRSgwID09IG1lbWNtcChkYXRhLnBhbGV0dGUsIGNvbnRleHQuZ2xvYmFsX3BhbGV0dGVfLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZGF0YS5wYWxldHRlKSkpOworICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvZ2lmL2NmeF9sendkZWNvbXByZXNzb3IuY3BwIGIvY29yZS9meGNvZGVjL2dpZi9jZnhfbHp3ZGVjb21wcmVzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWU3YjVhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNvZGVjL2dpZi9jZnhfbHp3ZGVjb21wcmVzc29yLmNwcApAQCAtMCwwICsxLDE5NiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2dpZi9jZnhfbHp3ZGVjb21wcmVzc29yLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvbGJtcC9meF9ibXAuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfbWF0aC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisKK3N0ZDo6dW5pcXVlX3B0cjxDRlhfTFpXRGVjb21wcmVzc29yPiBDRlhfTFpXRGVjb21wcmVzc29yOjpDcmVhdGUoCisgICAgdWludDhfdCBjb2xvcl9leHAsCisgICAgdWludDhfdCBjb2RlX2V4cCkgeworICAvLyBjb2xvcl9leHAgZ2VuZXJhdGVzIDJeKG4gKyAxKSBjb2Rlcywgd2hlcmUgYXMgdGhlIGNvZGVfZXhwIHJlc2VydmVzIDJebi4KKyAgLy8gVGhpcyBpcyBhIHF1aXJrIG9mIHRoZSBHSUYgc3BlYy4KKyAgaWYgKGNvZGVfZXhwID4gR0lGX01BWF9MWldfRVhQIHx8IGNvZGVfZXhwIDwgY29sb3JfZXhwICsgMSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxDRlhfTFpXRGVjb21wcmVzc29yPigKKyAgICAgIG5ldyBDRlhfTFpXRGVjb21wcmVzc29yKGNvbG9yX2V4cCwgY29kZV9leHApKTsKK30KKworQ0ZYX0xaV0RlY29tcHJlc3Nvcjo6Q0ZYX0xaV0RlY29tcHJlc3Nvcih1aW50OF90IGNvbG9yX2V4cCwgdWludDhfdCBjb2RlX2V4cCkKKyAgICA6IGNvZGVfc2l6ZV8oY29kZV9leHApLAorICAgICAgY29kZV9zaXplX2N1cl8oMCksCisgICAgICBjb2RlX2NvbG9yX2VuZF8oc3RhdGljX2Nhc3Q8dWludDE2X3Q+KDEgPDwgKGNvbG9yX2V4cCArIDEpKSksCisgICAgICBjb2RlX2NsZWFyXyhzdGF0aWNfY2FzdDx1aW50MTZfdD4oMSA8PCBjb2RlX2V4cCkpLAorICAgICAgY29kZV9lbmRfKHN0YXRpY19jYXN0PHVpbnQxNl90PigoMSA8PCBjb2RlX2V4cCkgKyAxKSksCisgICAgICBjb2RlX25leHRfKDApLAorICAgICAgY29kZV9maXJzdF8oMCksCisgICAgICBjb2RlX29sZF8oMCksCisgICAgICBuZXh0X2luXyhudWxscHRyKSwKKyAgICAgIGF2YWlsX2luXygwKSwKKyAgICAgIGJpdHNfbGVmdF8oMCksCisgICAgICBjb2RlX3N0b3JlXygwKSB7fQorCitDRlhfTFpXRGVjb21wcmVzc29yOjp+Q0ZYX0xaV0RlY29tcHJlc3NvcigpIHt9CisKK0NGWF9HaWZEZWNvZGVTdGF0dXMgQ0ZYX0xaV0RlY29tcHJlc3Nvcjo6RGVjb2RlKHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZGVzX3NpemUpIHsKKyAgaWYgKCFzcmNfYnVmIHx8IHNyY19zaXplID09IDAgfHwgIWRlc19idWYgfHwgIWRlc19zaXplKQorICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpFcnJvcjsKKworICBpZiAoKmRlc19zaXplID09IDApCisgICAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6Okluc3VmZmljaWVudERlc3RTaXplOworCisgIG5leHRfaW5fID0gc3JjX2J1ZjsKKyAgYXZhaWxfaW5fID0gc3JjX3NpemU7CisKKyAgQ2xlYXJUYWJsZSgpOworCisgIHVpbnQzMl90IGkgPSAwOworICBpZiAoZGVjb21wcmVzc2VkX25leHRfICE9IDApIHsKKyAgICB1aW50MzJfdCBleHRyYWN0ZWRfc2l6ZSA9IEV4dHJhY3REYXRhKGRlc19idWYsICpkZXNfc2l6ZSk7CisgICAgaWYgKGRlY29tcHJlc3NlZF9uZXh0XyAhPSAwKQorICAgICAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6Okluc3VmZmljaWVudERlc3RTaXplOworCisgICAgZGVzX2J1ZiArPSBleHRyYWN0ZWRfc2l6ZTsKKyAgICBpICs9IGV4dHJhY3RlZF9zaXplOworICB9CisKKyAgd2hpbGUgKGkgPD0gKmRlc19zaXplICYmIChhdmFpbF9pbl8gPiAwIHx8IGJpdHNfbGVmdF8gPj0gY29kZV9zaXplX2N1cl8pKSB7CisgICAgaWYgKGNvZGVfc2l6ZV9jdXJfID4gR0lGX01BWF9MWldfRVhQKQorICAgICAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OkVycm9yOworCisgICAgaWYgKGF2YWlsX2luXyA+IDApIHsKKyAgICAgIGlmIChiaXRzX2xlZnRfID4gMzEpCisgICAgICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpFcnJvcjsKKworICAgICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzx1aW50MzJfdD4gc2FmZV9jb2RlID0gKm5leHRfaW5fKys7CisgICAgICBzYWZlX2NvZGUgPDw9IGJpdHNfbGVmdF87CisgICAgICBzYWZlX2NvZGUgfD0gY29kZV9zdG9yZV87CisgICAgICBpZiAoIXNhZmVfY29kZS5Jc1ZhbGlkKCkpCisgICAgICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpFcnJvcjsKKworICAgICAgY29kZV9zdG9yZV8gPSBzYWZlX2NvZGUuVmFsdWVPckRpZSgpOworICAgICAgLS1hdmFpbF9pbl87CisgICAgICBiaXRzX2xlZnRfICs9IDg7CisgICAgfQorCisgICAgd2hpbGUgKGJpdHNfbGVmdF8gPj0gY29kZV9zaXplX2N1cl8pIHsKKyAgICAgIHVpbnQxNl90IGNvZGUgPQorICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90Pihjb2RlX3N0b3JlXykgJiAoKDEgPDwgY29kZV9zaXplX2N1cl8pIC0gMSk7CisgICAgICBjb2RlX3N0b3JlXyA+Pj0gY29kZV9zaXplX2N1cl87CisgICAgICBiaXRzX2xlZnRfIC09IGNvZGVfc2l6ZV9jdXJfOworICAgICAgaWYgKGNvZGUgPT0gY29kZV9jbGVhcl8pIHsKKyAgICAgICAgQ2xlYXJUYWJsZSgpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChjb2RlID09IGNvZGVfZW5kXykgeworICAgICAgICAqZGVzX3NpemUgPSBpOworICAgICAgICByZXR1cm4gQ0ZYX0dpZkRlY29kZVN0YXR1czo6U3VjY2VzczsKKyAgICAgIH0KKworICAgICAgaWYgKGNvZGVfb2xkXyAhPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oLTEpKSB7CisgICAgICAgIGlmIChjb2RlX25leHRfIDwgR0lGX01BWF9MWldfQ09ERSkgeworICAgICAgICAgIGlmIChjb2RlID09IGNvZGVfbmV4dF8pIHsKKyAgICAgICAgICAgIEFkZENvZGUoY29kZV9vbGRfLCBjb2RlX2ZpcnN0Xyk7CisgICAgICAgICAgICBpZiAoIURlY29kZVN0cmluZyhjb2RlKSkKKyAgICAgICAgICAgICAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OkVycm9yOworICAgICAgICAgIH0gZWxzZSBpZiAoY29kZSA+IGNvZGVfbmV4dF8pIHsKKyAgICAgICAgICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpFcnJvcjsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFEZWNvZGVTdHJpbmcoY29kZSkpCisgICAgICAgICAgICAgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpFcnJvcjsKKworICAgICAgICAgICAgdWludDhfdCBhcHBlbmRfY2hhciA9IGRlY29tcHJlc3NlZF9bZGVjb21wcmVzc2VkX25leHRfIC0gMV07CisgICAgICAgICAgICBBZGRDb2RlKGNvZGVfb2xkXywgYXBwZW5kX2NoYXIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFEZWNvZGVTdHJpbmcoY29kZSkpCisgICAgICAgICAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OkVycm9yOworICAgICAgfQorCisgICAgICBjb2RlX29sZF8gPSBjb2RlOworICAgICAgdWludDMyX3QgZXh0cmFjdGVkX3NpemUgPSBFeHRyYWN0RGF0YShkZXNfYnVmLCAqZGVzX3NpemUgLSBpKTsKKyAgICAgIGlmIChkZWNvbXByZXNzZWRfbmV4dF8gIT0gMCkKKyAgICAgICAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6Okluc3VmZmljaWVudERlc3RTaXplOworCisgICAgICBkZXNfYnVmICs9IGV4dHJhY3RlZF9zaXplOworICAgICAgaSArPSBleHRyYWN0ZWRfc2l6ZTsKKyAgICB9CisgIH0KKworICBpZiAoYXZhaWxfaW5fICE9IDApCisgICAgcmV0dXJuIENGWF9HaWZEZWNvZGVTdGF0dXM6OkVycm9yOworCisgICpkZXNfc2l6ZSA9IGk7CisgIHJldHVybiBDRlhfR2lmRGVjb2RlU3RhdHVzOjpVbmZpbmlzaGVkOworfQorCit2b2lkIENGWF9MWldEZWNvbXByZXNzb3I6OkNsZWFyVGFibGUoKSB7CisgIGNvZGVfc2l6ZV9jdXJfID0gY29kZV9zaXplXyArIDE7CisgIGNvZGVfbmV4dF8gPSBjb2RlX2VuZF8gKyAxOworICBjb2RlX29sZF8gPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oLTEpOworICBtZW1zZXQoY29kZV90YWJsZV8sIDAsIHNpemVvZihjb2RlX3RhYmxlXykpOworICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgY29kZV9jbGVhcl87IGkrKykKKyAgICBjb2RlX3RhYmxlX1tpXS5zdWZmaXggPSBzdGF0aWNfY2FzdDx1aW50OF90PihpKTsKKyAgZGVjb21wcmVzc2VkXy5yZXNpemUoY29kZV9uZXh0XyAtIGNvZGVfY2xlYXJfICsgMSk7CisgIGRlY29tcHJlc3NlZF9uZXh0XyA9IDA7Cit9CisKK3ZvaWQgQ0ZYX0xaV0RlY29tcHJlc3Nvcjo6QWRkQ29kZSh1aW50MTZfdCBwcmVmaXhfY29kZSwgdWludDhfdCBhcHBlbmRfY2hhcikgeworICBpZiAoY29kZV9uZXh0XyA9PSBHSUZfTUFYX0xaV19DT0RFKQorICAgIHJldHVybjsKKworICBjb2RlX3RhYmxlX1tjb2RlX25leHRfXS5wcmVmaXggPSBwcmVmaXhfY29kZTsKKyAgY29kZV90YWJsZV9bY29kZV9uZXh0X10uc3VmZml4ID0gYXBwZW5kX2NoYXI7CisgIGlmICgrK2NvZGVfbmV4dF8gPCBHSUZfTUFYX0xaV19DT0RFKSB7CisgICAgaWYgKGNvZGVfbmV4dF8gPj4gY29kZV9zaXplX2N1cl8pCisgICAgICBjb2RlX3NpemVfY3VyXysrOworICB9Cit9CisKK2Jvb2wgQ0ZYX0xaV0RlY29tcHJlc3Nvcjo6RGVjb2RlU3RyaW5nKHVpbnQxNl90IGNvZGUpIHsKKyAgZGVjb21wcmVzc2VkXy5yZXNpemUoY29kZV9uZXh0XyAtIGNvZGVfY2xlYXJfICsgMSk7CisgIGRlY29tcHJlc3NlZF9uZXh0XyA9IDA7CisKKyAgd2hpbGUgKGNvZGUgPj0gY29kZV9jbGVhcl8gJiYgY29kZSA8PSBjb2RlX25leHRfKSB7CisgICAgaWYgKGNvZGUgPT0gY29kZV90YWJsZV9bY29kZV0ucHJlZml4IHx8CisgICAgICAgIGRlY29tcHJlc3NlZF9uZXh0XyA+PSBkZWNvbXByZXNzZWRfLnNpemUoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGRlY29tcHJlc3NlZF9bZGVjb21wcmVzc2VkX25leHRfKytdID0gY29kZV90YWJsZV9bY29kZV0uc3VmZml4OworICAgIGNvZGUgPSBjb2RlX3RhYmxlX1tjb2RlXS5wcmVmaXg7CisgIH0KKworICBpZiAoY29kZSA+PSBjb2RlX2NvbG9yX2VuZF8pCisgICAgcmV0dXJuIGZhbHNlOworCisgIGRlY29tcHJlc3NlZF9bZGVjb21wcmVzc2VkX25leHRfKytdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29kZSk7CisgIGNvZGVfZmlyc3RfID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29kZSk7CisgIHJldHVybiB0cnVlOworfQorCit1aW50MzJfdCBDRlhfTFpXRGVjb21wcmVzc29yOjpFeHRyYWN0RGF0YSh1aW50OF90KiBkZXNfYnVmLCB1aW50MzJfdCBkZXNfc2l6ZSkgeworICBpZiAoZGVzX3NpemUgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICB1aW50MzJfdCBjb3B5X3NpemUgPSBkZXNfc2l6ZSA8PSBkZWNvbXByZXNzZWRfbmV4dF8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGVzX3NpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRlY29tcHJlc3NlZF9uZXh0Xyk7CisgIHN0ZDo6cmV2ZXJzZV9jb3B5KGRlY29tcHJlc3NlZF8uZGF0YSgpICsgZGVjb21wcmVzc2VkX25leHRfIC0gY29weV9zaXplLAorICAgICAgICAgICAgICAgICAgICBkZWNvbXByZXNzZWRfLmRhdGEoKSArIGRlY29tcHJlc3NlZF9uZXh0XywgZGVzX2J1Zik7CisgIGRlY29tcHJlc3NlZF9uZXh0XyAtPSBjb3B5X3NpemU7CisgIHJldHVybiBjb3B5X3NpemU7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvZ2lmL2NmeF9sendkZWNvbXByZXNzb3IuaCBiL2NvcmUvZnhjb2RlYy9naWYvY2Z4X2x6d2RlY29tcHJlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxN2MwNTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y29kZWMvZ2lmL2NmeF9sendkZWNvbXByZXNzb3IuaApAQCAtMCwwICsxLDY1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENPREVDX0dJRl9DRlhfTFpXREVDT01QUkVTU09SX0hfCisjZGVmaW5lIENPUkVfRlhDT0RFQ19HSUZfQ0ZYX0xaV0RFQ09NUFJFU1NPUl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9naWYvY2Z4X2dpZi5oIgorCitjbGFzcyBDRlhfTFpXRGVjb21wcmVzc29yIHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgc3RydWN0IHsKKyAgICB1aW50MTZfdCBwcmVmaXg7CisgICAgdWludDhfdCBzdWZmaXg7CisgIH0gQ29kZUVudHJ5OworCisgIC8vIFJldHVybnMgbnVsbHB0ciBvbiBlcnJvcgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPENGWF9MWldEZWNvbXByZXNzb3I+IENyZWF0ZSh1aW50OF90IGNvbG9yX2V4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjb2RlX2V4cCk7CisgIH5DRlhfTFpXRGVjb21wcmVzc29yKCk7CisKKyAgQ0ZYX0dpZkRlY29kZVN0YXR1cyBEZWNvZGUodWludDhfdCogc3JjX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkZXNfc2l6ZSk7CisKKyAgLy8gVXNlZCBieSB1bml0dGVzdHMsIHNob3VsZCBub3QgYmUgY2FsbGVkIGluIHByb2R1Y3Rpb24gY29kZS4KKyAgdWludDMyX3QgRXh0cmFjdERhdGFGb3JUZXN0KHVpbnQ4X3QqIGRlc19idWYsIHVpbnQzMl90IGRlc19zaXplKSB7CisgICAgcmV0dXJuIEV4dHJhY3REYXRhKGRlc19idWYsIGRlc19zaXplKTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBEZWNvbXByZXNzZWRGb3JUZXN0KCkgeyByZXR1cm4gJmRlY29tcHJlc3NlZF87IH0KKworICBzaXplX3QqIERlY29tcHJlc3NlZE5leHRGb3JUZXN0KCkgeyByZXR1cm4gJmRlY29tcHJlc3NlZF9uZXh0XzsgfQorCisgcHJpdmF0ZToKKyAgQ0ZYX0xaV0RlY29tcHJlc3Nvcih1aW50OF90IGNvbG9yX2V4cCwgdWludDhfdCBjb2RlX2V4cCk7CisgIHZvaWQgQ2xlYXJUYWJsZSgpOworICB2b2lkIEFkZENvZGUodWludDE2X3QgcHJlZml4X2NvZGUsIHVpbnQ4X3QgYXBwZW5kX2NoYXIpOworICBib29sIERlY29kZVN0cmluZyh1aW50MTZfdCBjb2RlKTsKKyAgdWludDMyX3QgRXh0cmFjdERhdGEodWludDhfdCogZGVzX2J1ZiwgdWludDMyX3QgZGVzX3NpemUpOworCisgIHVpbnQ4X3QgY29kZV9zaXplXzsKKyAgdWludDhfdCBjb2RlX3NpemVfY3VyXzsKKyAgdWludDE2X3QgY29kZV9jb2xvcl9lbmRfOworICB1aW50MTZfdCBjb2RlX2NsZWFyXzsKKyAgdWludDE2X3QgY29kZV9lbmRfOworICB1aW50MTZfdCBjb2RlX25leHRfOworICB1aW50OF90IGNvZGVfZmlyc3RfOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkZWNvbXByZXNzZWRfOworICBzaXplX3QgZGVjb21wcmVzc2VkX25leHRfOworICBDb2RlRW50cnkgY29kZV90YWJsZV9bR0lGX01BWF9MWldfQ09ERV07CisgIHVpbnQxNl90IGNvZGVfb2xkXzsKKyAgdWludDhfdCogbmV4dF9pbl87CisgIHVpbnQzMl90IGF2YWlsX2luXzsKKyAgdWludDhfdCBiaXRzX2xlZnRfOworICB1aW50MzJfdCBjb2RlX3N0b3JlXzsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWENPREVDX0dJRl9DRlhfTFpXREVDT01QUkVTU09SX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvZ2lmL2NmeF9sendkZWNvbXByZXNzb3JfdW5pdHRlc3QuY3BwIGIvY29yZS9meGNvZGVjL2dpZi9jZnhfbHp3ZGVjb21wcmVzc29yX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDA5MDZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNvZGVjL2dpZi9jZnhfbHp3ZGVjb21wcmVzc29yX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDIxNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2dpZi9jZnhfbHp3ZGVjb21wcmVzc29yLmgiCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCitURVNUKENGWF9MWldEZWNvbXByZXNzb3IsIENyZWF0ZUJhZFBhcmFtcykgeworICBFWFBFQ1RfRVEobnVsbHB0ciwgQ0ZYX0xaV0RlY29tcHJlc3Nvcjo6Q3JlYXRlKDB4MTAsIDB4MDIpKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIENGWF9MWldEZWNvbXByZXNzb3I6OkNyZWF0ZSgweDA0LCAweDBGKSk7CisgIEVYUEVDVF9FUShudWxscHRyLCBDRlhfTFpXRGVjb21wcmVzc29yOjpDcmVhdGUoMHgwMiwgMHgwMikpOworfQorCitURVNUKENGWF9MWldEZWNvbXByZXNzb3IsIEV4dHJhY3REYXRhKSB7CisgIHVpbnQ4X3QgcGFsZXR0ZV9leHAgPSAweDE7CisgIHVpbnQ4X3QgY29kZV9leHAgPSAweDI7CisgIGF1dG8gZGVjb21wcmVzc29yID0gQ0ZYX0xaV0RlY29tcHJlc3Nvcjo6Q3JlYXRlKHBhbGV0dGVfZXhwLCBjb2RlX2V4cCk7CisgIEFTU0VSVF9ORShudWxscHRyLCBkZWNvbXByZXNzb3IpOworCisgIC8vIENoZWNrIHRoYXQgMCBsZW5ndGggZXh0cmFjdCBkb2VzIG5vdGhpbmcKKyAgeworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBkZWNvbXByZXNzZWQgPSBkZWNvbXByZXNzb3ItPkRlY29tcHJlc3NlZEZvclRlc3QoKTsKKyAgICAqZGVjb21wcmVzc2VkID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDl9OworICAgICooZGVjb21wcmVzc29yLT5EZWNvbXByZXNzZWROZXh0Rm9yVGVzdCgpKSA9IGRlY29tcHJlc3NlZC0+c2l6ZSgpOworICAgIHVpbnQ4X3QgZGVzX2J1ZlsyMF07CisgICAgbWVtc2V0KGRlc19idWYsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KC0xKSwgc2l6ZW9mKGRlc19idWYpKTsKKworICAgIEVYUEVDVF9FUSgwdSwgZGVjb21wcmVzc29yLT5FeHRyYWN0RGF0YUZvclRlc3QoZGVzX2J1ZiwgMCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGRlc19idWYpOyArK2kpCisgICAgICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8dWludDhfdD4oLTEpLCBkZXNfYnVmW2ldKTsKKworICAgIEVYUEVDVF9FUSgxMHUsICooZGVjb21wcmVzc29yLT5EZWNvbXByZXNzZWROZXh0Rm9yVGVzdCgpKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAqKGRlY29tcHJlc3Nvci0+RGVjb21wcmVzc2VkTmV4dEZvclRlc3QoKSk7ICsraSkKKyAgICAgIEVYUEVDVF9FUShpLCBkZWNvbXByZXNzZWQtPm9wZXJhdG9yW10oaSkpOworICB9CisKKyAgLy8gQ2hlY2sgdGhhdCBsZXNzIHRoYW4gZGVjb21wcmVzc2VkIHNpemUgb25seSBnZXRzIHRoZSBleHBlY3RlZCBudW1iZXIKKyAgeworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBkZWNvbXByZXNzZWQgPSBkZWNvbXByZXNzb3ItPkRlY29tcHJlc3NlZEZvclRlc3QoKTsKKyAgICAqZGVjb21wcmVzc2VkID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDl9OworICAgICooZGVjb21wcmVzc29yLT5EZWNvbXByZXNzZWROZXh0Rm9yVGVzdCgpKSA9IGRlY29tcHJlc3NlZC0+c2l6ZSgpOworICAgIHVpbnQ4X3QgZGVzX2J1ZlsyMF07CisgICAgbWVtc2V0KGRlc19idWYsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KC0xKSwgc2l6ZW9mKGRlc19idWYpKTsKKworICAgIEVYUEVDVF9FUSg1dSwgZGVjb21wcmVzc29yLT5FeHRyYWN0RGF0YUZvclRlc3QoZGVzX2J1ZiwgNSkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKDsgaSA8IDU7ICsraSkKKyAgICAgIEVYUEVDVF9FUSg5IC0gaSwgZGVzX2J1ZltpXSk7CisgICAgZm9yICg7IGkgPCBGWF9BcnJheVNpemUoZGVzX2J1Zik7ICsraSkKKyAgICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDx1aW50OF90PigtMSksIGRlc19idWZbaV0pOworCisgICAgRVhQRUNUX0VRKDV1LCAqKGRlY29tcHJlc3Nvci0+RGVjb21wcmVzc2VkTmV4dEZvclRlc3QoKSkpOworICAgIGZvciAoaSA9IDA7IGkgPCAqKGRlY29tcHJlc3Nvci0+RGVjb21wcmVzc2VkTmV4dEZvclRlc3QoKSk7ICsraSkKKyAgICAgIEVYUEVDVF9FUShpLCBkZWNvbXByZXNzZWQtPm9wZXJhdG9yW10oaSkpOworICB9CisKKyAgLy8gQ2hlY2sgdGhhdCBncmVhdGVyIHRoYW4gZGVjb21wcmVzc2VkIHNpemUgZGVwbGV0ZXMgdGhlIGRlY29tcHJlc3NvcgorICB7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGRlY29tcHJlc3NlZCA9IGRlY29tcHJlc3Nvci0+RGVjb21wcmVzc2VkRm9yVGVzdCgpOworICAgICpkZWNvbXByZXNzZWQgPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOX07CisgICAgKihkZWNvbXByZXNzb3ItPkRlY29tcHJlc3NlZE5leHRGb3JUZXN0KCkpID0gZGVjb21wcmVzc2VkLT5zaXplKCk7CisgICAgdWludDhfdCBkZXNfYnVmWzIwXTsKKyAgICBtZW1zZXQoZGVzX2J1Ziwgc3RhdGljX2Nhc3Q8dWludDhfdD4oLTEpLCBzaXplb2YoZGVzX2J1ZikpOworCisgICAgRVhQRUNUX0VRKDEwdSwKKyAgICAgICAgICAgICAgZGVjb21wcmVzc29yLT5FeHRyYWN0RGF0YUZvclRlc3QoZGVzX2J1ZiwgRlhfQXJyYXlTaXplKGRlc19idWYpKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoOyBpIDwgMTA7ICsraSkKKyAgICAgIEVYUEVDVF9FUSg5IC0gaSwgZGVzX2J1ZltpXSk7CisgICAgZm9yICg7IGkgPCBGWF9BcnJheVNpemUoZGVzX2J1Zik7ICsraSkKKyAgICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDx1aW50OF90PigtMSksIGRlc19idWZbaV0pOworCisgICAgRVhQRUNUX0VRKDB1LCAqKGRlY29tcHJlc3Nvci0+RGVjb21wcmVzc2VkTmV4dEZvclRlc3QoKSkpOworICB9Cit9CisKK1RFU1QoQ0ZYX0xaV0RlY29tcHJlc3NvciwgRGVjb2RlQmFkUGFyYW1zKSB7CisgIHVpbnQ4X3QgcGFsZXR0ZV9leHAgPSAweDA7CisgIHVpbnQ4X3QgY29kZV9leHAgPSAweDI7CisgIGF1dG8gZGVjb21wcmVzc29yID0gQ0ZYX0xaV0RlY29tcHJlc3Nvcjo6Q3JlYXRlKHBhbGV0dGVfZXhwLCBjb2RlX2V4cCk7CisgIEFTU0VSVF9ORShudWxscHRyLCBkZWNvbXByZXNzb3IpOworCisgIHVpbnQ4X3QgaW1hZ2VfZGF0YVsxMF07CisgIHVpbnQzMl90IGltYWdlX3NpemUgPSBGWF9BcnJheVNpemUoaW1hZ2VfZGF0YSk7CisKKyAgdWludDhfdCBvdXRwdXRfZGF0YVsxMF07CisgIHVpbnQzMl90IG91dHB1dF9zaXplID0gRlhfQXJyYXlTaXplKG91dHB1dF9kYXRhKTsKKworICBFWFBFQ1RfRVEoCisgICAgICBDRlhfR2lmRGVjb2RlU3RhdHVzOjpFcnJvciwKKyAgICAgIGRlY29tcHJlc3Nvci0+RGVjb2RlKG51bGxwdHIsIGltYWdlX3NpemUsIG91dHB1dF9kYXRhLCAmb3V0cHV0X3NpemUpKTsKKyAgRVhQRUNUX0VRKENGWF9HaWZEZWNvZGVTdGF0dXM6OkVycm9yLAorICAgICAgICAgICAgZGVjb21wcmVzc29yLT5EZWNvZGUoaW1hZ2VfZGF0YSwgMCwgb3V0cHV0X2RhdGEsICZvdXRwdXRfc2l6ZSkpOworICBFWFBFQ1RfRVEoCisgICAgICBDRlhfR2lmRGVjb2RlU3RhdHVzOjpFcnJvciwKKyAgICAgIGRlY29tcHJlc3Nvci0+RGVjb2RlKGltYWdlX2RhdGEsIGltYWdlX3NpemUsIG51bGxwdHIsICZvdXRwdXRfc2l6ZSkpOworICBFWFBFQ1RfRVEoQ0ZYX0dpZkRlY29kZVN0YXR1czo6RXJyb3IsCisgICAgICAgICAgICBkZWNvbXByZXNzb3ItPkRlY29kZShpbWFnZV9kYXRhLCBpbWFnZV9zaXplLCBvdXRwdXRfZGF0YSwgbnVsbHB0cikpOworCisgIG91dHB1dF9zaXplID0gMDsKKyAgRVhQRUNUX0VRKAorICAgICAgQ0ZYX0dpZkRlY29kZVN0YXR1czo6SW5zdWZmaWNpZW50RGVzdFNpemUsCisgICAgICBkZWNvbXByZXNzb3ItPkRlY29kZShpbWFnZV9kYXRhLCBpbWFnZV9zaXplLCBvdXRwdXRfZGF0YSwgJm91dHB1dF9zaXplKSk7Cit9CisKK1RFU1QoQ0ZYX0xaV0RlY29tcHJlc3NvciwgRGVjb2RlMXgxU2luZ2xlQ29sb3VyKSB7CisgIHVpbnQ4X3QgcGFsZXR0ZV9leHAgPSAweDA7CisgIHVpbnQ4X3QgY29kZV9leHAgPSAweDI7CisgIGF1dG8gZGVjb21wcmVzc29yID0gQ0ZYX0xaV0RlY29tcHJlc3Nvcjo6Q3JlYXRlKHBhbGV0dGVfZXhwLCBjb2RlX2V4cCk7CisgIEFTU0VSVF9ORShudWxscHRyLCBkZWNvbXByZXNzb3IpOworCisgIHVpbnQ4X3QgaW1hZ2VfZGF0YVtdID0gezB4NDQsIDB4MDF9OworICB1aW50MzJfdCBpbWFnZV9zaXplID0gRlhfQXJyYXlTaXplKGltYWdlX2RhdGEpOworCisgIHVpbnQ4X3QgZXhwZWN0ZWRfZGF0YVtdID0gezB4MDB9OworICB1aW50OF90IG91dHB1dF9kYXRhW0ZYX0FycmF5U2l6ZShleHBlY3RlZF9kYXRhKV07CisgIG1lbXNldChvdXRwdXRfZGF0YSwgMCwgc2l6ZW9mKG91dHB1dF9kYXRhKSk7CisgIHVpbnQzMl90IG91dHB1dF9zaXplID0gRlhfQXJyYXlTaXplKG91dHB1dF9kYXRhKTsKKworICBFWFBFQ1RfRVEoCisgICAgICBDRlhfR2lmRGVjb2RlU3RhdHVzOjpTdWNjZXNzLAorICAgICAgZGVjb21wcmVzc29yLT5EZWNvZGUoaW1hZ2VfZGF0YSwgaW1hZ2Vfc2l6ZSwgb3V0cHV0X2RhdGEsICZvdXRwdXRfc2l6ZSkpOworCisgIEVYUEVDVF9FUShGWF9BcnJheVNpemUob3V0cHV0X2RhdGEpLCBvdXRwdXRfc2l6ZSk7CisgIEVYUEVDVF9UUlVFKDAgPT0gbWVtY21wKGV4cGVjdGVkX2RhdGEsIG91dHB1dF9kYXRhLCBzaXplb2YoZXhwZWN0ZWRfZGF0YSkpKTsKK30KKworVEVTVChDRlhfTFpXRGVjb21wcmVzc29yLCBEZWNvZGUxMHgxMFNpbmdsZUNvbG91cikgeworICB1aW50OF90IHBhbGV0dGVfZXhwID0gMHgwOworICB1aW50OF90IGNvZGVfZXhwID0gMHgyOworICBhdXRvIGRlY29tcHJlc3NvciA9IENGWF9MWldEZWNvbXByZXNzb3I6OkNyZWF0ZShwYWxldHRlX2V4cCwgY29kZV9leHApOworICBBU1NFUlRfTkUobnVsbHB0ciwgZGVjb21wcmVzc29yKTsKKworICB1aW50OF90IGltYWdlX2RhdGFbXSA9IHsweDg0LCAweDhGLCAweEE5LCAweENCLCAweEVELCAweDBGLCAweDYzLCAweDJCfTsKKyAgdWludDMyX3QgaW1hZ2Vfc2l6ZSA9IEZYX0FycmF5U2l6ZShpbWFnZV9kYXRhKTsKKworICB1aW50OF90IGV4cGVjdGVkX2RhdGFbXSA9IHsKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwfTsKKyAgdWludDhfdCBvdXRwdXRfZGF0YVtGWF9BcnJheVNpemUoZXhwZWN0ZWRfZGF0YSldOworICBtZW1zZXQob3V0cHV0X2RhdGEsIDAsIHNpemVvZihvdXRwdXRfZGF0YSkpOworICB1aW50MzJfdCBvdXRwdXRfc2l6ZSA9IEZYX0FycmF5U2l6ZShvdXRwdXRfZGF0YSk7CisKKyAgRVhQRUNUX0VRKAorICAgICAgQ0ZYX0dpZkRlY29kZVN0YXR1czo6U3VjY2VzcywKKyAgICAgIGRlY29tcHJlc3Nvci0+RGVjb2RlKGltYWdlX2RhdGEsIGltYWdlX3NpemUsIG91dHB1dF9kYXRhLCAmb3V0cHV0X3NpemUpKTsKKworICBFWFBFQ1RfRVEoRlhfQXJyYXlTaXplKG91dHB1dF9kYXRhKSwgb3V0cHV0X3NpemUpOworICBFWFBFQ1RfVFJVRSgwID09IG1lbWNtcChleHBlY3RlZF9kYXRhLCBvdXRwdXRfZGF0YSwgc2l6ZW9mKGV4cGVjdGVkX2RhdGEpKSk7Cit9CisKK1RFU1QoQ0ZYX0xaV0RlY29tcHJlc3NvciwgRGVjb2RlMTB4MTBNdWx0aXBsZUNvbG91cikgeworICB1aW50OF90IHBhbGV0dGVfZXhwID0gMHgxOworICB1aW50OF90IGNvZGVfZXhwID0gMHgyOworICBhdXRvIGRlY29tcHJlc3NvciA9IENGWF9MWldEZWNvbXByZXNzb3I6OkNyZWF0ZShwYWxldHRlX2V4cCwgY29kZV9leHApOworICBBU1NFUlRfTkUobnVsbHB0ciwgZGVjb21wcmVzc29yKTsKKworICB1aW50OF90IGltYWdlX2RhdGFbXSA9IHsweDhDLCAweDJELCAweDk5LCAweDg3LCAweDJBLCAweDFDLCAweERDLCAweDMzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAweEEwLCAweDAyLCAweDc1LCAweEVDLCAweDk1LCAweEZBLCAweEE4LCAweERFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAweDYwLCAweDhDLCAweDA0LCAweDkxLCAweDRDLCAweDAxfTsKKyAgdWludDMyX3QgaW1hZ2Vfc2l6ZSA9IEZYX0FycmF5U2l6ZShpbWFnZV9kYXRhKTsKKworICB1aW50OF90IGV4cGVjdGVkX2RhdGFbXSA9IHsKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAyLCAweDAyLCAweDAyLCAweDAyLCAweDAyLAorICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsCisgICAgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAyLAorICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDIsCisgICAgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMSwgMHgwMSwKKyAgICAweDAyLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAxLAorICAgIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisgICAgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKyAgICAweDAyLCAweDAyLCAweDAyLCAweDAyLCAweDAyLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxfTsKKworICB1aW50OF90IG91dHB1dF9kYXRhW0ZYX0FycmF5U2l6ZShleHBlY3RlZF9kYXRhKV07CisgIG1lbXNldChvdXRwdXRfZGF0YSwgMCwgc2l6ZW9mKG91dHB1dF9kYXRhKSk7CisgIHVpbnQzMl90IG91dHB1dF9zaXplID0gRlhfQXJyYXlTaXplKG91dHB1dF9kYXRhKTsKKworICBFWFBFQ1RfRVEoCisgICAgICBDRlhfR2lmRGVjb2RlU3RhdHVzOjpTdWNjZXNzLAorICAgICAgZGVjb21wcmVzc29yLT5EZWNvZGUoaW1hZ2VfZGF0YSwgaW1hZ2Vfc2l6ZSwgb3V0cHV0X2RhdGEsICZvdXRwdXRfc2l6ZSkpOworCisgIEVYUEVDVF9FUShGWF9BcnJheVNpemUob3V0cHV0X2RhdGEpLCBvdXRwdXRfc2l6ZSk7CisgIEVYUEVDVF9UUlVFKDAgPT0gbWVtY21wKGV4cGVjdGVkX2RhdGEsIG91dHB1dF9kYXRhLCBzaXplb2YoZXhwZWN0ZWRfZGF0YSkpKTsKK30KKworVEVTVChDRlhfTFpXRGVjb21wcmVzc29yLCBIYW5kbGVDb2xvdXJDb2RlT3V0T2ZQYWxldHRlKSB7CisgIHVpbnQ4X3QgcGFsZXR0ZV9leHAgPSAweDI7ICAvLyBJbWFnZSB1c2VzIDEwIGNvbG91cnMsIHNvIHRoZSBwYWxldHRlIGV4cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIDMsIDJeKDMrMSkgPSAxNiBjb2xvdXJzLgorICB1aW50OF90IGNvZGVfZXhwID0gMHg0OworICBhdXRvIGRlY29tcHJlc3NvciA9IENGWF9MWldEZWNvbXByZXNzb3I6OkNyZWF0ZShwYWxldHRlX2V4cCwgY29kZV9leHApOworICBBU1NFUlRfTkUobnVsbHB0ciwgZGVjb21wcmVzc29yKTsKKworICB1aW50OF90IGltYWdlX2RhdGFbXSA9IHsweDMwLCAweEM5LCAweDQ5LCAweDgxLCAweEJELCAweDc4LCAweEU4LCAweENELAorICAgICAgICAgICAgICAgICAgICAgICAgICAweDg5LCAweEZGLCAweDYwLCAweDIwLCAweDhFLCAweEU0LCAweDYxLCAweDlFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAweEE4LCAweEExLCAweEFFLCAweDJDLCAweEUyLCAweEJFLCAweEIwLCAweDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAweENGLCAweDc0LCAweDYxLCAweERGLCAweDc4LCAweDA0fTsKKyAgdWludDMyX3QgaW1hZ2Vfc2l6ZSA9IEZYX0FycmF5U2l6ZShpbWFnZV9kYXRhKTsKKworICB1aW50OF90IG91dHB1dF9kYXRhWzEwMF07ICAvLyBUaGUgdW5jb21wcmVzc2VkIGRhdGEgaXMgZm9yIGEgMTB4MTAgaW1hZ2UKKyAgbWVtc2V0KG91dHB1dF9kYXRhLCAwLCBzaXplb2Yob3V0cHV0X2RhdGEpKTsKKyAgdWludDMyX3Qgb3V0cHV0X3NpemUgPSBGWF9BcnJheVNpemUob3V0cHV0X2RhdGEpOworCisgIEVYUEVDVF9FUSgKKyAgICAgIENGWF9HaWZEZWNvZGVTdGF0dXM6OkVycm9yLAorICAgICAgZGVjb21wcmVzc29yLT5EZWNvZGUoaW1hZ2VfZGF0YSwgaW1hZ2Vfc2l6ZSwgb3V0cHV0X2RhdGEsICZvdXRwdXRfc2l6ZSkpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0FyaXRoRGVjb2Rlci5jcHAgYi9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhEZWNvZGVyLmNwcAppbmRleCAwZDQ1ZjU3Li5kZWJhNzJiIDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhEZWNvZGVyLmNwcAorKysgYi9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhEZWNvZGVyLmNwcApAQCAtNyw3ICs3LDcgQEAKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhEZWNvZGVyLmgiCiAKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfQml0U3RyZWFtLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCiAKIG5hbWVzcGFjZSB7CiAKQEAgLTU2LDcgKzU2LDcgQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBDSkJpZzJfQXJpdGhEZWNvZGVyOjpDSkJpZzJfQXJpdGhEZWNvZGVyKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0pCi0gICAgOiBtX3BTdHJlYW0ocFN0cmVhbSkgeworICAgIDogbV9Db21wbGV0ZShmYWxzZSksIG1fRmluaXNoZWRTdHJlYW0oZmFsc2UpLCBtX3BTdHJlYW0ocFN0cmVhbSkgewogICBtX0IgPSBtX3BTdHJlYW0tPmdldEN1ckJ5dGVfYXJpdGgoKTsKICAgbV9DID0gKG1fQiBeIDB4ZmYpIDw8IDE2OwogICBCWVRFSU4oKTsKQEAgLTk1LDYgKzk1LDEyIEBACiAgICAgQjEgPSBtX3BTdHJlYW0tPmdldE5leHRCeXRlX2FyaXRoKCk7CiAgICAgaWYgKEIxID4gMHg4ZikgewogICAgICAgbV9DVCA9IDg7CisgICAgICAvLyBJZiB3ZSBhcmUgaGVyZSwgaXQgbWVhbnMgdGhhdCB3ZSBoYXZlIGZpbmlzaGVkIGRlY29kaW5nIGRhdGEgKHNlZSBKQklHMgorICAgICAgLy8gc3BlYywgU2VjdGlvbiBFLjMuNCkuIElmIHdlIGFycml2ZSBoZXJlIGEgc2Vjb25kIHRpbWUsIHdlJ3JlIGxvb3BpbmcsCisgICAgICAvLyBzbyBjb21wbGV0ZSBkZWNvZGluZy4KKyAgICAgIGlmIChtX0ZpbmlzaGVkU3RyZWFtKQorICAgICAgICBtX0NvbXBsZXRlID0gdHJ1ZTsKKyAgICAgIG1fRmluaXNoZWRTdHJlYW0gPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICBtX3BTdHJlYW0tPmluY0J5dGVJZHgoKTsKICAgICAgIG1fQiA9IEIxOwpAQCAtMTA3LDYgKzExMyw5IEBACiAgICAgbV9DID0gbV9DICsgMHhmZjAwIC0gKG1fQiA8PCA4KTsKICAgICBtX0NUID0gODsKICAgfQorCisgIGlmICghbV9wU3RyZWFtLT5Jc0luQm91bmRzKCkpCisgICAgbV9Db21wbGV0ZSA9IHRydWU7CiB9CiAKIHZvaWQgQ0pCaWcyX0FyaXRoRGVjb2Rlcjo6UmVhZFZhbHVlQSgpIHsKZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aERlY29kZXIuaCBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aERlY29kZXIuaAppbmRleCBhOGFiNWRkLi5jOWUyOWE1IDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhEZWNvZGVyLmgKKysrIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0FyaXRoRGVjb2Rlci5oCkBAIC03LDYgKzcsMTAgQEAKICNpZm5kZWYgQ09SRV9GWENPREVDX0pCSUcyX0pCSUcyX0FSSVRIREVDT0RFUl9IXwogI2RlZmluZSBDT1JFX0ZYQ09ERUNfSkJJRzJfSkJJRzJfQVJJVEhERUNPREVSX0hfCiAKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKKwogY2xhc3MgQ0pCaWcyX0JpdFN0cmVhbTsKIAogc3RydWN0IEpCaWcyQXJpdGhDdHggewpAQCAtMjQsMTUgKzI4LDE5IEBACiAKICAgaW50IERFQ09ERShKQmlnMkFyaXRoQ3R4KiBwQ1gpOwogCisgIGJvb2wgSXNDb21wbGV0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fQ29tcGxldGU7IH0KKwogIHByaXZhdGU6CiAgIHZvaWQgQllURUlOKCk7CiAgIHZvaWQgUmVhZFZhbHVlQSgpOwogCi0gIHVuc2lnbmVkIGNoYXIgbV9COworICBib29sIG1fQ29tcGxldGU7CisgIGJvb2wgbV9GaW5pc2hlZFN0cmVhbTsKKyAgdWludDhfdCBtX0I7CiAgIHVuc2lnbmVkIGludCBtX0M7CiAgIHVuc2lnbmVkIGludCBtX0E7CiAgIHVuc2lnbmVkIGludCBtX0NUOwotICBDSkJpZzJfQml0U3RyZWFtKiBjb25zdCBtX3BTdHJlYW07CisgIFVub3duZWRQdHI8Q0pCaWcyX0JpdFN0cmVhbT4gY29uc3QgbV9wU3RyZWFtOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZYQ09ERUNfSkJJRzJfSkJJRzJfQVJJVEhERUNPREVSX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhJbnREZWNvZGVyLmNwcCBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aEludERlY29kZXIuY3BwCmluZGV4IDIyOGUxNmUuLjdlZDc3MDIgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aEludERlY29kZXIuY3BwCisrKyBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aEludERlY29kZXIuY3BwCkBAIC04LDcgKzgsNyBAQAogCiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCiAKIG5hbWVzcGFjZSB7CiAKQEAgLTQ5LDYgKzQ5LDkgQEAKIAogYm9vbCBDSkJpZzJfQXJpdGhJbnREZWNvZGVyOjpkZWNvZGUoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogblJlc3VsdCkgeworICAvLyBUaGlzIGRlY29kaW5nIGFsZ29yaXRobSBpcyBleHBsYWluZWQgaW4gIkFubmV4IEEgLSBBcml0aG1ldGljIEludGVnZXIKKyAgLy8gRGVjb2RpbmcgUHJvY2VkdXJlIiBvbiBwYWdlIDExMyBvZiB0aGUgSkJJRzIgc3BlY2lmaWNhdGlvbiAoSVNPL0lFQyBGQ0QKKyAgLy8gMTQ0OTIpLgogICBpbnQgUFJFViA9IDE7CiAgIGNvbnN0IGludCBTID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZtX0lBeFtQUkVWXSk7CiAgIFBSRVYgPSBTaGlmdE9yKFBSRVYsIFMpOwpAQCAtNjQsOCArNjcsMTcgQEAKICAgICAgIFBSRVYgPSAoUFJFViAmIDUxMSkgfCAyNTY7CiAgICAgblRlbXAgPSBTaGlmdE9yKG5UZW1wLCBEKTsKICAgfQotICBpbnQgblZhbHVlID0gZ19Bcml0aEludERlY29kZURhdGFbbkRlY29kZURhdGFJbmRleF0ublZhbHVlOwotICBuVmFsdWUgKz0gblRlbXA7CisgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8aW50PiBzYWZlVmFsdWUgPQorICAgICAgZ19Bcml0aEludERlY29kZURhdGFbbkRlY29kZURhdGFJbmRleF0ublZhbHVlOworICBzYWZlVmFsdWUgKz0gblRlbXA7CisKKyAgLy8gVmFsdWUgZG9lcyBub3QgZml0IGluIGludC4KKyAgaWYgKCFzYWZlVmFsdWUuSXNWYWxpZCgpKSB7CisgICAgKm5SZXN1bHQgPSAwOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGludCBuVmFsdWUgPSBzYWZlVmFsdWUuVmFsdWVPckRpZSgpOwogICBpZiAoUyA9PSAxICYmIG5WYWx1ZSA+IDApCiAgICAgblZhbHVlID0gLW5WYWx1ZTsKIApkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0JpdFN0cmVhbS5jcHAgYi9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfQml0U3RyZWFtLmNwcAppbmRleCBkYzRiZWFiLi5hNzIwOTlkIDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfQml0U3RyZWFtLmNwcAorKysgYi9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfQml0U3RyZWFtLmNwcApAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtX2FjYy5oIgogCi1DSkJpZzJfQml0U3RyZWFtOjpDSkJpZzJfQml0U3RyZWFtKENQREZfU3RyZWFtQWNjKiBwU3JjU3RyZWFtKQorQ0pCaWcyX0JpdFN0cmVhbTo6Q0pCaWcyX0JpdFN0cmVhbShjb25zdCBSZXRhaW5QdHI8Q1BERl9TdHJlYW1BY2M+JiBwU3JjU3RyZWFtKQogICAgIDogbV9wQnVmKHBTcmNTdHJlYW0tPkdldERhdGEoKSksCiAgICAgICBtX2R3TGVuZ3RoKHBTcmNTdHJlYW0tPkdldFNpemUoKSksCiAgICAgICBtX2R3Qnl0ZUlkeCgwKSwKQEAgLTI3LDYgKzI3LDkgQEAKIENKQmlnMl9CaXRTdHJlYW06On5DSkJpZzJfQml0U3RyZWFtKCkge30KIAogaW50MzJfdCBDSkJpZzJfQml0U3RyZWFtOjpyZWFkTkJpdHModWludDMyX3QgZHdCaXRzLCB1aW50MzJfdCogZHdSZXN1bHQpIHsKKyAgaWYgKCFJc0luQm91bmRzKCkpCisgICAgcmV0dXJuIC0xOworCiAgIHVpbnQzMl90IGR3Qml0UG9zID0gZ2V0Qml0UG9zKCk7CiAgIGlmIChkd0JpdFBvcyA+IExlbmd0aEluQml0cygpKQogICAgIHJldHVybiAtMTsKQEAgLTQ2LDYgKzQ5LDkgQEAKIH0KIAogaW50MzJfdCBDSkJpZzJfQml0U3RyZWFtOjpyZWFkTkJpdHModWludDMyX3QgZHdCaXRzLCBpbnQzMl90KiBuUmVzdWx0KSB7CisgIGlmICghSXNJbkJvdW5kcygpKQorICAgIHJldHVybiAtMTsKKwogICB1aW50MzJfdCBkd0JpdFBvcyA9IGdldEJpdFBvcygpOwogICBpZiAoZHdCaXRQb3MgPiBMZW5ndGhJbkJpdHMoKSkKICAgICByZXR1cm4gLTE7CkBAIC02NSw3ICs3MSw3IEBACiB9CiAKIGludDMyX3QgQ0pCaWcyX0JpdFN0cmVhbTo6cmVhZDFCaXQodWludDMyX3QqIGR3UmVzdWx0KSB7Ci0gIGlmICghSXNJbkJvdW5kKCkpCisgIGlmICghSXNJbkJvdW5kcygpKQogICAgIHJldHVybiAtMTsKIAogICAqZHdSZXN1bHQgPSAobV9wQnVmW21fZHdCeXRlSWR4XSA+PiAoNyAtIG1fZHdCaXRJZHgpKSAmIDB4MDE7CkBAIC03NCw3ICs4MCw3IEBACiB9CiAKIGludDMyX3QgQ0pCaWcyX0JpdFN0cmVhbTo6cmVhZDFCaXQoYm9vbCogYlJlc3VsdCkgewotICBpZiAoIUlzSW5Cb3VuZCgpKQorICBpZiAoIUlzSW5Cb3VuZHMoKSkKICAgICByZXR1cm4gLTE7CiAKICAgKmJSZXN1bHQgPSAobV9wQnVmW21fZHdCeXRlSWR4XSA+PiAoNyAtIG1fZHdCaXRJZHgpKSAmIDB4MDE7CkBAIC04Myw3ICs4OSw3IEBACiB9CiAKIGludDMyX3QgQ0pCaWcyX0JpdFN0cmVhbTo6cmVhZDFCeXRlKHVpbnQ4X3QqIGNSZXN1bHQpIHsKLSAgaWYgKCFJc0luQm91bmQoKSkKKyAgaWYgKCFJc0luQm91bmRzKCkpCiAgICAgcmV0dXJuIC0xOwogCiAgICpjUmVzdWx0ID0gbV9wQnVmW21fZHdCeXRlSWR4XTsKQEAgLTExOCwxNiArMTI0LDE2IEBACiB9CiAKIHVpbnQ4X3QgQ0pCaWcyX0JpdFN0cmVhbTo6Z2V0Q3VyQnl0ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIElzSW5Cb3VuZCgpID8gbV9wQnVmW21fZHdCeXRlSWR4XSA6IDA7CisgIHJldHVybiBJc0luQm91bmRzKCkgPyBtX3BCdWZbbV9kd0J5dGVJZHhdIDogMDsKIH0KIAogdm9pZCBDSkJpZzJfQml0U3RyZWFtOjppbmNCeXRlSWR4KCkgewotICBpZiAoSXNJbkJvdW5kKCkpCisgIGlmIChJc0luQm91bmRzKCkpCiAgICAgKyttX2R3Qnl0ZUlkeDsKIH0KIAogdWludDhfdCBDSkJpZzJfQml0U3RyZWFtOjpnZXRDdXJCeXRlX2FyaXRoKCkgY29uc3QgewotICByZXR1cm4gSXNJbkJvdW5kKCkgPyBtX3BCdWZbbV9kd0J5dGVJZHhdIDogMHhGRjsKKyAgcmV0dXJuIElzSW5Cb3VuZHMoKSA/IG1fcEJ1ZlttX2R3Qnl0ZUlkeF0gOiAweEZGOwogfQogCiB1aW50OF90IENKQmlnMl9CaXRTdHJlYW06OmdldE5leHRCeXRlX2FyaXRoKCkgY29uc3QgewpAQCAtMTc2LDcgKzE4Miw3IEBACiAgIH0KIH0KIAotYm9vbCBDSkJpZzJfQml0U3RyZWFtOjpJc0luQm91bmQoKSBjb25zdCB7Citib29sIENKQmlnMl9CaXRTdHJlYW06OklzSW5Cb3VuZHMoKSBjb25zdCB7CiAgIHJldHVybiBtX2R3Qnl0ZUlkeCA8IG1fZHdMZW5ndGg7CiB9CiAKZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9CaXRTdHJlYW0uaCBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9CaXRTdHJlYW0uaAppbmRleCBhZWIyZWJhLi4wZWRiNDMyIDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfQml0U3RyZWFtLmgKKysrIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0JpdFN0cmVhbS5oCkBAIC03LDEzICs3LDEzIEBACiAjaWZuZGVmIENPUkVfRlhDT0RFQ19KQklHMl9KQklHMl9CSVRTVFJFQU1fSF8KICNkZWZpbmUgQ09SRV9GWENPREVDX0pCSUcyX0pCSUcyX0JJVFNUUkVBTV9IXwogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgogCiBjbGFzcyBDUERGX1N0cmVhbUFjYzsKIAogY2xhc3MgQ0pCaWcyX0JpdFN0cmVhbSB7CiAgcHVibGljOgotICBleHBsaWNpdCBDSkJpZzJfQml0U3RyZWFtKENQREZfU3RyZWFtQWNjKiBwU3JjU3RyZWFtKTsKKyAgZXhwbGljaXQgQ0pCaWcyX0JpdFN0cmVhbShjb25zdCBSZXRhaW5QdHI8Q1BERl9TdHJlYW1BY2M+JiBwU3JjU3RyZWFtKTsKICAgfkNKQmlnMl9CaXRTdHJlYW0oKTsKIAogICAvLyBUT0RPKHRoZXN0aWcpOiByZWFkRm9vKCkgc2hvdWxkIHJldHVybiBib29sLgpAQCAtNDAsOSArNDAsMTAgQEAKICAgdWludDMyX3QgZ2V0Qnl0ZUxlZnQoKSBjb25zdDsKICAgdWludDMyX3QgZ2V0T2JqTnVtKCkgY29uc3Q7CiAKKyAgYm9vbCBJc0luQm91bmRzKCkgY29uc3Q7CisKICBwcml2YXRlOgogICB2b2lkIEFkdmFuY2VCaXQoKTsKLSAgYm9vbCBJc0luQm91bmQoKSBjb25zdDsKICAgdWludDMyX3QgTGVuZ3RoSW5CaXRzKCkgY29uc3Q7CiAKICAgY29uc3QgdWludDhfdCogbV9wQnVmOwpkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0JpdFN0cmVhbV91bml0dGVzdC5jcHAgYi9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfQml0U3RyZWFtX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjZkOGIwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0JpdFN0cmVhbV91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwxMTkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9CaXRTdHJlYW0uaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbV9hY2MuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK1RFU1QoSkJpZzJfQml0U3RyZWFtLCBSZWFkTkJpdHMpIHsKKyAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IGRhdGEoRlhfQWxsb2ModWludDhfdCwgMSkpOworICBkYXRhLmdldCgpWzBdID0gMHhiMTsgIC8vIDEwMTEwMDAxCisKKyAgYXV0byBpbl9zdHJlYW0gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJlYW0+KHN0ZDo6bW92ZShkYXRhKSwgMSwgbnVsbHB0cik7CisgIGF1dG8gYWNjID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfU3RyZWFtQWNjPihpbl9zdHJlYW0uZ2V0KCkpOworICBhY2MtPkxvYWRBbGxEYXRhRmlsdGVyZWQoKTsKKworICBDSkJpZzJfQml0U3RyZWFtIHN0cmVhbShhY2MpOworCisgIHVpbnQzMl90IHZhbDE7CisgIEVYUEVDVF9FUSgwLCBzdHJlYW0ucmVhZE5CaXRzKDEsICZ2YWwxKSk7CisgIEVYUEVDVF9FUSgxVSwgdmFsMSk7CisKKyAgaW50MzJfdCB2YWwyOworICBFWFBFQ1RfRVEoMCwgc3RyZWFtLnJlYWROQml0cygxLCAmdmFsMikpOworICBFWFBFQ1RfRVEoMCwgdmFsMik7CisKKyAgRVhQRUNUX0VRKDAsIHN0cmVhbS5yZWFkTkJpdHMoMiwgJnZhbDIpKTsKKyAgRVhQRUNUX0VRKDMsIHZhbDIpOworCisgIEVYUEVDVF9FUSgwLCBzdHJlYW0ucmVhZE5CaXRzKDQsICZ2YWwyKSk7CisgIEVYUEVDVF9FUSgxLCB2YWwyKTsKK30KKworVEVTVChKQmlnMl9CaXRTdHJlYW0sIFJlYWROQml0c0xhcmdlclRoZW5EYXRhKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90LCBGeEZyZWVEZWxldGVyPiBkYXRhKEZYX0FsbG9jKHVpbnQ4X3QsIDEpKTsKKyAgZGF0YS5nZXQoKVswXSA9IDB4YjE7CisKKyAgYXV0byBpbl9zdHJlYW0gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJlYW0+KHN0ZDo6bW92ZShkYXRhKSwgMSwgbnVsbHB0cik7CisgIGF1dG8gYWNjID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfU3RyZWFtQWNjPihpbl9zdHJlYW0uZ2V0KCkpOworICBhY2MtPkxvYWRBbGxEYXRhRmlsdGVyZWQoKTsKKworICBDSkJpZzJfQml0U3RyZWFtIHN0cmVhbShhY2MpOworCisgIHVpbnQzMl90IHZhbDE7CisgIEVYUEVDVF9FUSgwLCBzdHJlYW0ucmVhZE5CaXRzKDEwLCAmdmFsMSkpOworICBFWFBFQ1RfRVEoMHhiMVUsIHZhbDEpOworfQorCitURVNUKEpCaWcyX0JpdFN0cmVhbSwgUmVhZE5CaXRzTnVsbFN0cmVhbSkgeworICBhdXRvIGluX3N0cmVhbSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmVhbT4obnVsbHB0ciwgMCwgbnVsbHB0cik7CisgIGF1dG8gYWNjID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfU3RyZWFtQWNjPihpbl9zdHJlYW0uZ2V0KCkpOworICBhY2MtPkxvYWRBbGxEYXRhRmlsdGVyZWQoKTsKKworICBDSkJpZzJfQml0U3RyZWFtIHN0cmVhbShhY2MpOworCisgIHVpbnQzMl90IHZhbDE7CisgIEVYUEVDVF9FUSgtMSwgc3RyZWFtLnJlYWROQml0cygxLCAmdmFsMSkpOworCisgIGludDMyX3QgdmFsMjsKKyAgRVhQRUNUX0VRKC0xLCBzdHJlYW0ucmVhZE5CaXRzKDIsICZ2YWwyKSk7Cit9CisKK1RFU1QoSkJpZzJfQml0U3RyZWFtLCBSZWFkTkJpdHNFbXB0eVN0cmVhbSkgeworICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4gZGF0YShGWF9BbGxvYyh1aW50OF90LCAxKSk7CisKKyAgYXV0byBpbl9zdHJlYW0gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJlYW0+KHN0ZDo6bW92ZShkYXRhKSwgMCwgbnVsbHB0cik7CisgIGF1dG8gYWNjID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfU3RyZWFtQWNjPihpbl9zdHJlYW0uZ2V0KCkpOworICBhY2MtPkxvYWRBbGxEYXRhRmlsdGVyZWQoKTsKKworICBDSkJpZzJfQml0U3RyZWFtIHN0cmVhbShhY2MpOworCisgIHVpbnQzMl90IHZhbDE7CisgIEVYUEVDVF9FUSgtMSwgc3RyZWFtLnJlYWROQml0cygxLCAmdmFsMSkpOworCisgIGludDMyX3QgdmFsMjsKKyAgRVhQRUNUX0VRKC0xLCBzdHJlYW0ucmVhZE5CaXRzKDIsICZ2YWwyKSk7Cit9CisKK1RFU1QoSkJpZzJfQml0U3RyZWFtLCBSZWFkTkJpdHNPdXRPZkJvdW5kcykgeworICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4gZGF0YShGWF9BbGxvYyh1aW50OF90LCAxKSk7CisgIGRhdGEuZ2V0KClbMF0gPSAweGIxOyAgLy8gMTAxMTAwMDEKKworICBhdXRvIGluX3N0cmVhbSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmVhbT4oc3RkOjptb3ZlKGRhdGEpLCAxLCBudWxscHRyKTsKKyAgYXV0byBhY2MgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERl9TdHJlYW1BY2M+KGluX3N0cmVhbS5nZXQoKSk7CisgIGFjYy0+TG9hZEFsbERhdGFGaWx0ZXJlZCgpOworCisgIENKQmlnMl9CaXRTdHJlYW0gc3RyZWFtKGFjYyk7CisKKyAgdWludDMyX3QgdmFsMTsKKyAgRVhQRUNUX0VRKDAsIHN0cmVhbS5yZWFkTkJpdHMoOCwgJnZhbDEpKTsKKworICBpbnQzMl90IHZhbDI7CisgIEVYUEVDVF9FUSgtMSwgc3RyZWFtLnJlYWROQml0cygyLCAmdmFsMikpOworfQorCitURVNUKEpCaWcyX0JpdFN0cmVhbSwgUmVhZE5CaXRzV2hlcmVOSXMzNikgeworICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4gZGF0YShGWF9BbGxvYyh1aW50OF90LCA1KSk7CisgIGRhdGEuZ2V0KClbMF0gPSAweGIwOworICBkYXRhLmdldCgpWzFdID0gMHgwMTsKKyAgZGF0YS5nZXQoKVsyXSA9IDB4MDA7CisgIGRhdGEuZ2V0KClbM10gPSAweDAwOworICBkYXRhLmdldCgpWzRdID0gMHg0MDsKKworICBhdXRvIGluX3N0cmVhbSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmVhbT4oc3RkOjptb3ZlKGRhdGEpLCA1LCBudWxscHRyKTsKKyAgYXV0byBhY2MgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERl9TdHJlYW1BY2M+KGluX3N0cmVhbS5nZXQoKSk7CisgIGFjYy0+TG9hZEFsbERhdGFGaWx0ZXJlZCgpOworCisgIENKQmlnMl9CaXRTdHJlYW0gc3RyZWFtKGFjYyk7CisKKyAgLy8gVGhpcyB3aWxsIHNoaWZ0IG9mZiB0aGUgdG9wIHR3byBiaXRzIGFuZCB0aGV5IGVuZCB1cCBsb3N0LgorICB1aW50MzJfdCB2YWwxOworICBFWFBFQ1RfRVEoMCwgc3RyZWFtLnJlYWROQml0cygzNCwgJnZhbDEpKTsKKyAgRVhQRUNUX0VRKDB4YzAwNDAwMDFVLCB2YWwxKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmNwcCBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmNwcAppbmRleCAxMDkwMTMyLi4zMGU0YWFiIDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfQ29udGV4dC5jcHAKKysrIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0NvbnRleHQuY3BwCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmgiCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bGltaXRzPgogI2luY2x1ZGUgPGxpc3Q+CiAjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx2ZWN0b3I+CkBAIC0yMiw4ICsyMyw4IEBACiAjaW5jbHVkZSAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX1BkZFByb2MuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfU2RkUHJvYy5oIgogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9UcmRQcm9jLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9pZnhfcGF1c2VpbmRpY2F0b3IuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgogCiBuYW1lc3BhY2UgewogCkBAIC00NCwzMiArNDUsMzIgQEAKIC8vIGxpc3Qga2VlcHMgdHJhY2sgb2YgdGhlIGZyZXNobmVzcyBvZiBlbnRyaWVzLCB3aXRoIGZyZXNoZXN0IG9uZXMKIC8vIGF0IHRoZSBmcm9udC4gRXZlbiBhIHRpbnkgY2FjaGUgc2l6ZSBsaWtlIDIgbWFrZXMgYSBkcmFtYXRpYwogLy8gZGlmZmVyZW5jZSBmb3IgdHlwaWNhbCBKQklHMiBkb2N1bWVudHMuCi1zdGF0aWMgY29uc3QgaW50IGtTeW1ib2xEaWN0Q2FjaGVNYXhTaXplID0gMjsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1N5bWJvbERpY3RDYWNoZU1heFNpemUgPSAyOworc3RhdGljX2Fzc2VydChrU3ltYm9sRGljdENhY2hlTWF4U2l6ZSA+IDAsCisgICAgICAgICAgICAgICJTeW1ib2wgRGljdGlvbmFyeSBDYWNoZSBtdXN0IGhhdmUgbm9uLXplcm8gc2l6ZSIpOwogCi1DSkJpZzJfQ29udGV4dDo6Q0pCaWcyX0NvbnRleHQoQ1BERl9TdHJlYW1BY2MqIHBHbG9iYWxTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW1BY2MqIHBTcmNTdHJlYW0sCitDSkJpZzJfQ29udGV4dDo6Q0pCaWcyX0NvbnRleHQoY29uc3QgUmV0YWluUHRyPENQREZfU3RyZWFtQWNjPiYgcEdsb2JhbFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q1BERl9TdHJlYW1BY2M+JiBwU3JjU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxDSkJpZzJfQ2FjaGVQYWlyPiogcFN5bWJvbERpY3RDYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJc0dsb2JhbCkKICAgICA6IG1fblNlZ21lbnREZWNvZGVkKDApLAogICAgICAgbV9iSW5QYWdlKGZhbHNlKSwKICAgICAgIG1fYkJ1ZlNwZWNpZmllZChmYWxzZSksCiAgICAgICBtX1BhdXNlU3RlcCgxMCksCi0gICAgICBtX3BQYXVzZShwUGF1c2UpLAogICAgICAgbV9Qcm9jZXNzaW5nU3RhdHVzKEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1JFQURZKSwKICAgICAgIG1fZHdPZmZzZXQoMCksCiAgICAgICBtX3BTeW1ib2xEaWN0Q2FjaGUocFN5bWJvbERpY3RDYWNoZSksCiAgICAgICBtX2JJc0dsb2JhbChiSXNHbG9iYWwpIHsKLSAgaWYgKHBHbG9iYWxTdHJlYW0gJiYgKHBHbG9iYWxTdHJlYW0tPkdldFNpemUoKSA+IDApKSB7CisgIGlmIChwR2xvYmFsU3RyZWFtICYmIHBHbG9iYWxTdHJlYW0tPkdldFNpemUoKSA+IDApIHsKICAgICBtX3BHbG9iYWxDb250ZXh0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9Db250ZXh0PigKLSAgICAgICAgbnVsbHB0ciwgcEdsb2JhbFN0cmVhbSwgcFN5bWJvbERpY3RDYWNoZSwgcFBhdXNlLCB0cnVlKTsKKyAgICAgICAgbnVsbHB0ciwgcEdsb2JhbFN0cmVhbSwgcFN5bWJvbERpY3RDYWNoZSwgdHJ1ZSk7CiAgIH0KICAgbV9wU3RyZWFtID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9CaXRTdHJlYW0+KHBTcmNTdHJlYW0pOwogfQogCiBDSkJpZzJfQ29udGV4dDo6fkNKQmlnMl9Db250ZXh0KCkge30KIAotaW50MzJfdCBDSkJpZzJfQ29udGV4dDo6ZGVjb2RlX1NxdWVudGlhbE9yZ25hemF0aW9uKElGWF9QYXVzZSogcFBhdXNlKSB7CitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpkZWNvZGVTZXF1ZW50aWFsKElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKSB7CiAgIGludDMyX3QgblJldDsKICAgaWYgKG1fcFN0cmVhbS0+Z2V0Qnl0ZUxlZnQoKSA8PSAwKQogICAgIHJldHVybiBKQklHMl9FTkRfT0ZfRklMRTsKQEAgLTEwMCw3ICsxMDEsMTAgQEAKICAgICB9CiAgICAgaWYgKG1fcFNlZ21lbnQtPm1fZHdEYXRhX2xlbmd0aCAhPSAweGZmZmZmZmZmKSB7CiAgICAgICBtX2R3T2Zmc2V0ICs9IG1fcFNlZ21lbnQtPm1fZHdEYXRhX2xlbmd0aDsKLSAgICAgIG1fcFN0cmVhbS0+c2V0T2Zmc2V0KG1fZHdPZmZzZXQpOworICAgICAgaWYgKCFtX2R3T2Zmc2V0LklzVmFsaWQoKSkKKyAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOworCisgICAgICBtX3BTdHJlYW0tPnNldE9mZnNldChtX2R3T2Zmc2V0LlZhbHVlT3JEaWUoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgIG1fcFN0cmVhbS0+b2Zmc2V0KDQpOwogICAgIH0KQEAgLTExNSwzMiArMTE5LDI5IEBACiAgIHJldHVybiBKQklHMl9TVUNDRVNTOwogfQogCi1pbnQzMl90IENKQmlnMl9Db250ZXh0OjpkZWNvZGVfRW1iZWRPcmduYXphdGlvbihJRlhfUGF1c2UqIHBQYXVzZSkgewotICByZXR1cm4gZGVjb2RlX1NxdWVudGlhbE9yZ25hemF0aW9uKHBQYXVzZSk7Ci19Ci0KLWludDMyX3QgQ0pCaWcyX0NvbnRleHQ6OmRlY29kZV9SYW5kb21PcmduYXphdGlvbl9GaXJzdFBhZ2UoSUZYX1BhdXNlKiBwUGF1c2UpIHsKK2ludDMyX3QgQ0pCaWcyX0NvbnRleHQ6OmRlY29kZVJhbmRvbUZpcnN0UGFnZShJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSkgewogICBpbnQzMl90IG5SZXQ7CiAgIHdoaWxlIChtX3BTdHJlYW0tPmdldEJ5dGVMZWZ0KCkgPiBKQklHMl9NSU5fU0VHTUVOVF9TSVpFKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9TZWdtZW50PiBwU2VnbWVudChuZXcgQ0pCaWcyX1NlZ21lbnQpOworICAgIGF1dG8gcFNlZ21lbnQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX1NlZ21lbnQ+KCk7CiAgICAgblJldCA9IHBhcnNlU2VnbWVudEhlYWRlcihwU2VnbWVudC5nZXQoKSk7Ci0gICAgaWYgKG5SZXQgIT0gSkJJRzJfU1VDQ0VTUykgeworICAgIGlmIChuUmV0ICE9IEpCSUcyX1NVQ0NFU1MpCiAgICAgICByZXR1cm4gblJldDsKLSAgICB9IGVsc2UgaWYgKHBTZWdtZW50LT5tX2NGbGFncy5zLnR5cGUgPT0gNTEpIHsKKworICAgIGlmIChwU2VnbWVudC0+bV9jRmxhZ3Mucy50eXBlID09IDUxKQogICAgICAgYnJlYWs7Ci0gICAgfQorCiAgICAgbV9TZWdtZW50TGlzdC5wdXNoX2JhY2soc3RkOjptb3ZlKHBTZWdtZW50KSk7Ci0gICAgaWYgKHBQYXVzZSAmJiBtX3BQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKKyAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewogICAgICAgbV9QYXVzZVN0ZXAgPSAzOwogICAgICAgbV9Qcm9jZXNzaW5nU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRTsKICAgICAgIHJldHVybiBKQklHMl9TVUNDRVNTOwogICAgIH0KICAgfQogICBtX25TZWdtZW50RGVjb2RlZCA9IDA7Ci0gIHJldHVybiBkZWNvZGVfUmFuZG9tT3JnbmF6YXRpb24ocFBhdXNlKTsKKyAgcmV0dXJuIGRlY29kZVJhbmRvbShwUGF1c2UpOwogfQogCi1pbnQzMl90IENKQmlnMl9Db250ZXh0OjpkZWNvZGVfUmFuZG9tT3JnbmF6YXRpb24oSUZYX1BhdXNlKiBwUGF1c2UpIHsKK2ludDMyX3QgQ0pCaWcyX0NvbnRleHQ6OmRlY29kZVJhbmRvbShJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSkgewogICBmb3IgKDsgbV9uU2VnbWVudERlY29kZWQgPCBtX1NlZ21lbnRMaXN0LnNpemUoKTsgKyttX25TZWdtZW50RGVjb2RlZCkgewogICAgIGludDMyX3QgblJldCA9CiAgICAgICAgIHBhcnNlU2VnbWVudERhdGEobV9TZWdtZW50TGlzdFttX25TZWdtZW50RGVjb2RlZF0uZ2V0KCksIHBQYXVzZSk7CkBAIC0xNjMsMTAgKzE2NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSkgewogICBpbnQzMl90IG5SZXQgPSAwOwogICBpZiAobV9wR2xvYmFsQ29udGV4dCkgewotICAgIG5SZXQgPSBtX3BHbG9iYWxDb250ZXh0LT5kZWNvZGVfRW1iZWRPcmduYXphdGlvbihwUGF1c2UpOworICAgIG5SZXQgPSBtX3BHbG9iYWxDb250ZXh0LT5kZWNvZGVTZXF1ZW50aWFsKHBQYXVzZSk7CiAgICAgaWYgKG5SZXQgIT0gSkJJRzJfU1VDQ0VTUykgewogICAgICAgbV9Qcm9jZXNzaW5nU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7CiAgICAgICByZXR1cm4gblJldDsKQEAgLTE4Myw0MyArMTg0LDM3IEBACiAgIHJldHVybiBDb250aW51ZShwUGF1c2UpOwogfQogCi1pbnQzMl90IENKQmlnMl9Db250ZXh0OjpDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSkgeworaW50MzJfdCBDSkJpZzJfQ29udGV4dDo6Q29udGludWUoSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpIHsKICAgbV9Qcm9jZXNzaW5nU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1JFQURZOwogICBpbnQzMl90IG5SZXQgPSAwOwotICBpZiAobV9QYXVzZVN0ZXAgPD0gMSkgewotICAgIG5SZXQgPSBkZWNvZGVfRW1iZWRPcmduYXphdGlvbihwUGF1c2UpOwotICB9IGVsc2UgaWYgKG1fUGF1c2VTdGVwID09IDIpIHsKLSAgICBuUmV0ID0gZGVjb2RlX1NxdWVudGlhbE9yZ25hemF0aW9uKHBQYXVzZSk7CisgIGlmIChtX1BhdXNlU3RlcCA8PSAyKSB7CisgICAgblJldCA9IGRlY29kZVNlcXVlbnRpYWwocFBhdXNlKTsKICAgfSBlbHNlIGlmIChtX1BhdXNlU3RlcCA9PSAzKSB7Ci0gICAgblJldCA9IGRlY29kZV9SYW5kb21PcmduYXphdGlvbl9GaXJzdFBhZ2UocFBhdXNlKTsKKyAgICBuUmV0ID0gZGVjb2RlUmFuZG9tRmlyc3RQYWdlKHBQYXVzZSk7CiAgIH0gZWxzZSBpZiAobV9QYXVzZVN0ZXAgPT0gNCkgewotICAgIG5SZXQgPSBkZWNvZGVfUmFuZG9tT3JnbmF6YXRpb24ocFBhdXNlKTsKKyAgICBuUmV0ID0gZGVjb2RlUmFuZG9tKHBQYXVzZSk7CiAgIH0gZWxzZSBpZiAobV9QYXVzZVN0ZXAgPT0gNSkgewogICAgIG1fUHJvY2Vzc2luZ1N0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CiAgICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7CiAgIH0KLSAgaWYgKG1fUHJvY2Vzc2luZ1N0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKSB7CisgIGlmIChtX1Byb2Nlc3NpbmdTdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkKICAgICByZXR1cm4gblJldDsKLSAgfQorCiAgIG1fUGF1c2VTdGVwID0gNTsKICAgaWYgKCFtX2JCdWZTcGVjaWZpZWQgJiYgblJldCA9PSBKQklHMl9TVUNDRVNTKSB7CiAgICAgbV9Qcm9jZXNzaW5nU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKICAgICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKICAgfQotICBpZiAoblJldCA9PSBKQklHMl9TVUNDRVNTKSB7Ci0gICAgbV9Qcm9jZXNzaW5nU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKLSAgfSBlbHNlIHsKLSAgICBtX1Byb2Nlc3NpbmdTdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsKLSAgfQorICBtX1Byb2Nlc3NpbmdTdGF0dXMgPSBuUmV0ID09IEpCSUcyX1NVQ0NFU1MgPyBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNICisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZYQ09ERUNfU1RBVFVTX0VSUk9SOwogICByZXR1cm4gblJldDsKIH0KIAogQ0pCaWcyX1NlZ21lbnQqIENKQmlnMl9Db250ZXh0OjpmaW5kU2VnbWVudEJ5TnVtYmVyKHVpbnQzMl90IGR3TnVtYmVyKSB7CiAgIGlmIChtX3BHbG9iYWxDb250ZXh0KSB7CiAgICAgQ0pCaWcyX1NlZ21lbnQqIHBTZWcgPSBtX3BHbG9iYWxDb250ZXh0LT5maW5kU2VnbWVudEJ5TnVtYmVyKGR3TnVtYmVyKTsKLSAgICBpZiAocFNlZykgeworICAgIGlmIChwU2VnKQogICAgICAgcmV0dXJuIHBTZWc7Ci0gICAgfQogICB9CiAgIGZvciAoY29uc3QgYXV0byYgcFNlZyA6IG1fU2VnbWVudExpc3QpIHsKICAgICBpZiAocFNlZy0+bV9kd051bWJlciA9PSBkd051bWJlcikKQEAgLTIzNSw3ICsyMzAsNyBAQAogICBpbnQzMl90IGNvdW50ID0gMDsKICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQ7ICsraSkgewogICAgIENKQmlnMl9TZWdtZW50KiBwU2VnID0KLSAgICAgICAgZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldKTsKKyAgICAgICAgZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9SZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbaV0pOwogICAgIGlmIChwU2VnICYmIHBTZWctPm1fY0ZsYWdzLnMudHlwZSA9PSBjVHlwZSkgewogICAgICAgaWYgKGNvdW50ID09IG5JbmRleCkKICAgICAgICAgcmV0dXJuIHBTZWc7CkBAIC0yNzUsMzEgKzI3MCwzMSBAQAogICAgICAgcFNlZ21lbnQtPm1fZHdOdW1iZXIgPiA2NTUzNiA/IDQgOiBwU2VnbWVudC0+bV9kd051bWJlciA+IDI1NiA/IDIgOiAxOwogICB1aW50OF90IGNQU2l6ZSA9IHBTZWdtZW50LT5tX2NGbGFncy5zLnBhZ2VfYXNzb2NpYXRpb25fc2l6ZSA/IDQgOiAxOwogICBpZiAocFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQpIHsKLSAgICBwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzID0KLSAgICAgICAgRlhfQWxsb2ModWludDMyX3QsIHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50KTsKKyAgICBwU2VnbWVudC0+bV9SZWZlcnJlZF90b19zZWdtZW50X251bWJlcnMucmVzaXplKAorICAgICAgICBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudCk7CiAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQ7ICsraSkgewogICAgICAgc3dpdGNoIChjU1NpemUpIHsKICAgICAgICAgY2FzZSAxOgogICAgICAgICAgIGlmIChtX3BTdHJlYW0tPnJlYWQxQnl0ZSgmY1RlbXApICE9IDApCiAgICAgICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwogCi0gICAgICAgICAgcFNlZ21lbnQtPm1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1tpXSA9IGNUZW1wOworICAgICAgICAgIHBTZWdtZW50LT5tX1JlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1tpXSA9IGNUZW1wOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgdWludDE2X3Qgd1RlbXA7CiAgICAgICAgICAgaWYgKG1fcFN0cmVhbS0+cmVhZFNob3J0SW50ZWdlcigmd1RlbXApICE9IDApCiAgICAgICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwogCi0gICAgICAgICAgcFNlZ21lbnQtPm1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1tpXSA9IHdUZW1wOworICAgICAgICAgIHBTZWdtZW50LT5tX1JlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1tpXSA9IHdUZW1wOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgaWYgKG1fcFN0cmVhbS0+cmVhZEludGVnZXIoJmR3VGVtcCkgIT0gMCkKICAgICAgICAgICAgIHJldHVybiBKQklHMl9FUlJPUl9UT09fU0hPUlQ7CiAKLSAgICAgICAgICBwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldID0gZHdUZW1wOworICAgICAgICAgIHBTZWdtZW50LT5tX1JlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1tpXSA9IGR3VGVtcDsKICAgICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIGlmIChwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldID49IHBTZWdtZW50LT5tX2R3TnVtYmVyKQorICAgICAgaWYgKHBTZWdtZW50LT5tX1JlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1tpXSA+PSBwU2VnbWVudC0+bV9kd051bWJlcikKICAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKICAgICB9CiAgIH0KQEAgLTMyMiw3ICszMTcsNyBAQAogfQogCiBpbnQzMl90IENKQmlnMl9Db250ZXh0OjpwYXJzZVNlZ21lbnREYXRhKENKQmlnMl9TZWdtZW50KiBwU2VnbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpIHsKICAgaW50MzJfdCByZXQgPSBQcm9jZXNzaW5nUGFyc2VTZWdtZW50RGF0YShwU2VnbWVudCwgcFBhdXNlKTsKICAgd2hpbGUgKG1fUHJvY2Vzc2luZ1N0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFICYmCiAgICAgICAgICBtX3BTdHJlYW0tPmdldEJ5dGVMZWZ0KCkgPiAwKSB7CkBAIC0zMzIsMTAgKzMyNywxMCBAQAogfQogCiBpbnQzMl90IENKQmlnMl9Db250ZXh0OjpQcm9jZXNzaW5nUGFyc2VTZWdtZW50RGF0YShDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpIHsKICAgc3dpdGNoIChwU2VnbWVudC0+bV9jRmxhZ3Mucy50eXBlKSB7CiAgICAgY2FzZSAwOgotICAgICAgcmV0dXJuIHBhcnNlU3ltYm9sRGljdChwU2VnbWVudCwgcFBhdXNlKTsKKyAgICAgIHJldHVybiBwYXJzZVN5bWJvbERpY3QocFNlZ21lbnQpOwogICAgIGNhc2UgNDoKICAgICBjYXNlIDY6CiAgICAgY2FzZSA3OgpAQCAtMzY0LDcgKzM1OSw3IEBACiAgICAgICByZXR1cm4gcGFyc2VHZW5lcmljUmVmaW5lbWVudFJlZ2lvbihwU2VnbWVudCk7CiAgICAgY2FzZSA0ODogewogICAgICAgdWludDE2X3Qgd1RlbXA7Ci0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8SkJpZzJQYWdlSW5mbz4gcFBhZ2VJbmZvKG5ldyBKQmlnMlBhZ2VJbmZvKTsKKyAgICAgIGF1dG8gcFBhZ2VJbmZvID0gcGRmaXVtOjpNYWtlVW5pcXVlPEpCaWcyUGFnZUluZm8+KCk7CiAgICAgICBpZiAobV9wU3RyZWFtLT5yZWFkSW50ZWdlcigmcFBhZ2VJbmZvLT5tX2R3V2lkdGgpICE9IDAgfHwKICAgICAgICAgICBtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKCZwUGFnZUluZm8tPm1fZHdIZWlnaHQpICE9IDAgfHwKICAgICAgICAgICBtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKCZwUGFnZUluZm8tPm1fZHdSZXNvbHV0aW9uWCkgIT0gMCB8fApAQCAtMzg2LDcgKzM4MSw3IEBACiAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0ltYWdlPihwUGFnZUluZm8tPm1fZHdXaWR0aCwgaGVpZ2h0KTsKICAgICAgIH0KIAotICAgICAgaWYgKCFtX3BQYWdlLT5tX3BEYXRhKSB7CisgICAgICBpZiAoIW1fcFBhZ2UtPmRhdGEoKSkgewogICAgICAgICBtX1Byb2Nlc3NpbmdTdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsKICAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX1RPT19TSE9SVDsKICAgICAgIH0KQEAgLTQxOCwxMyArNDEzLDEyIEBACiAgIHJldHVybiBKQklHMl9TVUNDRVNTOwogfQogCi1pbnQzMl90IENKQmlnMl9Db250ZXh0OjpwYXJzZVN5bWJvbERpY3QoQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CitpbnQzMl90IENKQmlnMl9Db250ZXh0OjpwYXJzZVN5bWJvbERpY3QoQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50KSB7CiAgIHVpbnQxNl90IHdGbGFnczsKICAgaWYgKG1fcFN0cmVhbS0+cmVhZFNob3J0SW50ZWdlcigmd0ZsYWdzKSAhPSAwKQogICAgIHJldHVybiBKQklHMl9FUlJPUl9UT09fU0hPUlQ7CiAKLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9TRERQcm9jPiBwU3ltYm9sRGljdERlY29kZXIobmV3IENKQmlnMl9TRERQcm9jKTsKKyAgYXV0byBwU3ltYm9sRGljdERlY29kZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX1NERFByb2M+KCk7CiAgIHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RIVUZGID0gd0ZsYWdzICYgMHgwMDAxOwogICBwU3ltYm9sRGljdERlY29kZXItPlNEUkVGQUdHID0gKHdGbGFncyA+PiAxKSAmIDB4MDAwMTsKICAgcFN5bWJvbERpY3REZWNvZGVyLT5TRFRFTVBMQVRFID0gKHdGbGFncyA+PiAxMCkgJiAweDAwMDM7CkBAIC00NTUsMTYgKzQ0OSwxNiBAQAogICAgIHJldHVybiBKQklHMl9FUlJPUl9MSU1JVDsKICAgfQogICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudDsgKytpKSB7Ci0gICAgaWYgKCFmaW5kU2VnbWVudEJ5TnVtYmVyKHBTZWdtZW50LT5tX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbaV0pKQorICAgIGlmICghZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9SZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbaV0pKQogICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOwogICB9CiAgIENKQmlnMl9TZWdtZW50KiBwTFJTZWcgPSBudWxscHRyOwogICBwU3ltYm9sRGljdERlY29kZXItPlNETlVNSU5TWU1TID0gMDsKICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQ7ICsraSkgewogICAgIENKQmlnMl9TZWdtZW50KiBwU2VnID0KLSAgICAgICAgZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldKTsKKyAgICAgICAgZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9SZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbaV0pOwogICAgIGlmIChwU2VnLT5tX2NGbGFncy5zLnR5cGUgPT0gMCkgewotICAgICAgcFN5bWJvbERpY3REZWNvZGVyLT5TRE5VTUlOU1lNUyArPSBwU2VnLT5tX1Jlc3VsdC5zZC0+TnVtSW1hZ2VzKCk7CisgICAgICBwU3ltYm9sRGljdERlY29kZXItPlNETlVNSU5TWU1TICs9IHBTZWctPm1fU3ltYm9sRGljdC0+TnVtSW1hZ2VzKCk7CiAgICAgICBwTFJTZWcgPSBwU2VnOwogICAgIH0KICAgfQpAQCAtNDc1LDkgKzQ2OSw5IEBACiAgICAgdWludDMyX3QgZHdUZW1wID0gMDsKICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudDsgKytpKSB7CiAgICAgICBDSkJpZzJfU2VnbWVudCogcFNlZyA9Ci0gICAgICAgICAgZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzW2ldKTsKKyAgICAgICAgICBmaW5kU2VnbWVudEJ5TnVtYmVyKHBTZWdtZW50LT5tX1JlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1tpXSk7CiAgICAgICBpZiAocFNlZy0+bV9jRmxhZ3Mucy50eXBlID09IDApIHsKLSAgICAgICAgY29uc3QgQ0pCaWcyX1N5bWJvbERpY3QmIGRpY3QgPSAqcFNlZy0+bV9SZXN1bHQuc2Q7CisgICAgICAgIGNvbnN0IENKQmlnMl9TeW1ib2xEaWN0JiBkaWN0ID0gKnBTZWctPm1fU3ltYm9sRGljdC5nZXQoKTsKICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBkaWN0Lk51bUltYWdlcygpOyArK2opCiAgICAgICAgICAgU0RJTlNZTVMuZ2V0KClbZHdUZW1wICsgal0gPSBkaWN0LkdldEltYWdlKGopOwogICAgICAgICBkd1RlbXAgKz0gZGljdC5OdW1JbWFnZXMoKTsKQEAgLTUwOSw3ICs1MDMsNyBAQAogICAgICAgICAgIGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKICAgICAgIGlmICghcFNlZykKICAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOwotICAgICAgcFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkZESCA9IHBTZWctPm1fUmVzdWx0Lmh0OworICAgICAgcFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkZESCA9IHBTZWctPm1fSHVmZm1hblRhYmxlLmdldCgpOwogICAgIH0KICAgICBpZiAoY1NESFVGRkRXID09IDApIHsKICAgICAgIFRhYmxlX0IyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9IdWZmbWFuVGFibGU+KApAQCAtNTI0LDcgKzUxOCw3IEBACiAgICAgICAgICAgZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOwogICAgICAgaWYgKCFwU2VnKQogICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7Ci0gICAgICBwU3ltYm9sRGljdERlY29kZXItPlNESFVGRkRXID0gcFNlZy0+bV9SZXN1bHQuaHQ7CisgICAgICBwU3ltYm9sRGljdERlY29kZXItPlNESFVGRkRXID0gcFNlZy0+bV9IdWZmbWFuVGFibGUuZ2V0KCk7CiAgICAgfQogICAgIGlmIChjU0RIVUZGQk1TSVpFID09IDApIHsKICAgICAgIFRhYmxlX0IxID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9IdWZmbWFuVGFibGU+KApAQCAtNTM1LDcgKzUyOSw3IEBACiAgICAgICAgICAgZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOwogICAgICAgaWYgKCFwU2VnKQogICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7Ci0gICAgICBwU3ltYm9sRGljdERlY29kZXItPlNESFVGRkJNU0laRSA9IHBTZWctPm1fUmVzdWx0Lmh0OworICAgICAgcFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkZCTVNJWkUgPSBwU2VnLT5tX0h1ZmZtYW5UYWJsZS5nZXQoKTsKICAgICB9CiAgICAgaWYgKHBTeW1ib2xEaWN0RGVjb2Rlci0+U0RSRUZBR0cgPT0gMSkgewogICAgICAgaWYgKGNTREhVRkZBR0dJTlNUID09IDApIHsKQEAgLTU0OSw3ICs1NDMsNyBAQAogICAgICAgICAgICAgZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOwogICAgICAgICBpZiAoIXBTZWcpCiAgICAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOwotICAgICAgICBwU3ltYm9sRGljdERlY29kZXItPlNESFVGRkFHR0lOU1QgPSBwU2VnLT5tX1Jlc3VsdC5odDsKKyAgICAgICAgcFN5bWJvbERpY3REZWNvZGVyLT5TREhVRkZBR0dJTlNUID0gcFNlZy0+bV9IdWZmbWFuVGFibGUuZ2V0KCk7CiAgICAgICB9CiAgICAgfQogICB9CkBAIC01NjQsMTIgKzU1OCwxMiBAQAogICBzdGQ6OnZlY3RvcjxKQmlnMkFyaXRoQ3R4PiBnckNvbnRleHQ7CiAgIGlmICgod0ZsYWdzICYgMHgwMTAwKSAmJiBwTFJTZWcpIHsKICAgICBpZiAoYlVzZUdiQ29udGV4dCkgewotICAgICAgZ2JDb250ZXh0ID0gcExSU2VnLT5tX1Jlc3VsdC5zZC0+R2JDb250ZXh0KCk7CisgICAgICBnYkNvbnRleHQgPSBwTFJTZWctPm1fU3ltYm9sRGljdC0+R2JDb250ZXh0KCk7CiAgICAgICBpZiAoZ2JDb250ZXh0LnNpemUoKSAhPSBnYkNvbnRleHRTaXplKQogICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CiAgICAgfQogICAgIGlmIChiVXNlR3JDb250ZXh0KSB7Ci0gICAgICBnckNvbnRleHQgPSBwTFJTZWctPm1fUmVzdWx0LnNkLT5HckNvbnRleHQoKTsKKyAgICAgIGdyQ29udGV4dCA9IHBMUlNlZy0+bV9TeW1ib2xEaWN0LT5HckNvbnRleHQoKTsKICAgICAgIGlmIChnckNvbnRleHQuc2l6ZSgpICE9IGdyQ29udGV4dFNpemUpCiAgICAgICAgIHJldHVybiBKQklHMl9FUlJPUl9GQVRBTDsKICAgICB9CkBAIC01ODgsOCArNTgyLDcgQEAKICAgICBmb3IgKGF1dG8gaXQgPSBtX3BTeW1ib2xEaWN0Q2FjaGUtPmJlZ2luKCk7IGl0ICE9IG1fcFN5bWJvbERpY3RDYWNoZS0+ZW5kKCk7CiAgICAgICAgICArK2l0KSB7CiAgICAgICBpZiAoaXQtPmZpcnN0ID09IGtleSkgewotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX1N5bWJvbERpY3Q+IGNvcHkoaXQtPnNlY29uZC0+RGVlcENvcHkoKSk7Ci0gICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5zZCA9IGNvcHkucmVsZWFzZSgpOworICAgICAgICBwU2VnbWVudC0+bV9TeW1ib2xEaWN0ID0gaXQtPnNlY29uZC0+RGVlcENvcHkoKTsKICAgICAgICAgbV9wU3ltYm9sRGljdENhY2hlLT5wdXNoX2Zyb250KAogICAgICAgICAgICAgQ0pCaWcyX0NhY2hlUGFpcihrZXksIHN0ZDo6bW92ZShpdC0+c2Vjb25kKSkpOwogICAgICAgICBtX3BTeW1ib2xEaWN0Q2FjaGUtPmVyYXNlKGl0KTsKQEAgLTYwMCwyNiArNTkzLDI2IEBACiAgIH0KICAgaWYgKCFjYWNoZV9oaXQpIHsKICAgICBpZiAoYlVzZUdiQ29udGV4dCkgewotICAgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aERlY29kZXI+IHBBcml0aERlY29kZXIoCi0gICAgICAgICAgbmV3IENKQmlnMl9Bcml0aERlY29kZXIobV9wU3RyZWFtLmdldCgpKSk7Ci0gICAgICBwU2VnbWVudC0+bV9SZXN1bHQuc2QgPSBwU3ltYm9sRGljdERlY29kZXItPmRlY29kZV9Bcml0aCgKKyAgICAgIGF1dG8gcEFyaXRoRGVjb2RlciA9CisgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9Bcml0aERlY29kZXI+KG1fcFN0cmVhbS5nZXQoKSk7CisgICAgICBwU2VnbWVudC0+bV9TeW1ib2xEaWN0ID0gcFN5bWJvbERpY3REZWNvZGVyLT5kZWNvZGVfQXJpdGgoCiAgICAgICAgICAgcEFyaXRoRGVjb2Rlci5nZXQoKSwgJmdiQ29udGV4dCwgJmdyQ29udGV4dCk7Ci0gICAgICBpZiAoIXBTZWdtZW50LT5tX1Jlc3VsdC5zZCkKKyAgICAgIGlmICghcFNlZ21lbnQtPm1fU3ltYm9sRGljdCkKICAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOwogCiAgICAgICBtX3BTdHJlYW0tPmFsaWduQnl0ZSgpOwogICAgICAgbV9wU3RyZWFtLT5vZmZzZXQoMik7CiAgICAgfSBlbHNlIHsKLSAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5zZCA9IHBTeW1ib2xEaWN0RGVjb2Rlci0+ZGVjb2RlX0h1ZmZtYW4oCi0gICAgICAgICAgbV9wU3RyZWFtLmdldCgpLCAmZ2JDb250ZXh0LCAmZ3JDb250ZXh0LCBwUGF1c2UpOwotICAgICAgaWYgKCFwU2VnbWVudC0+bV9SZXN1bHQuc2QpCisgICAgICBwU2VnbWVudC0+bV9TeW1ib2xEaWN0ID0gcFN5bWJvbERpY3REZWNvZGVyLT5kZWNvZGVfSHVmZm1hbigKKyAgICAgICAgICBtX3BTdHJlYW0uZ2V0KCksICZnYkNvbnRleHQsICZnckNvbnRleHQpOworICAgICAgaWYgKCFwU2VnbWVudC0+bV9TeW1ib2xEaWN0KQogICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CiAgICAgICBtX3BTdHJlYW0tPmFsaWduQnl0ZSgpOwogICAgIH0KICAgICBpZiAobV9iSXNHbG9iYWwpIHsKICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfU3ltYm9sRGljdD4gdmFsdWUgPQotICAgICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5zZC0+RGVlcENvcHkoKTsKLSAgICAgIGludCBzaXplID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQ+KCptX3BTeW1ib2xEaWN0Q2FjaGUpOworICAgICAgICAgIHBTZWdtZW50LT5tX1N5bWJvbERpY3QtPkRlZXBDb3B5KCk7CisgICAgICBzaXplX3Qgc2l6ZSA9IG1fcFN5bWJvbERpY3RDYWNoZS0+c2l6ZSgpOwogICAgICAgd2hpbGUgKHNpemUgPj0ga1N5bWJvbERpY3RDYWNoZU1heFNpemUpIHsKICAgICAgICAgbV9wU3ltYm9sRGljdENhY2hlLT5wb3BfYmFjaygpOwogICAgICAgICAtLXNpemU7CkBAIC02MjksOSArNjIyLDkgQEAKICAgfQogICBpZiAod0ZsYWdzICYgMHgwMjAwKSB7CiAgICAgaWYgKGJVc2VHYkNvbnRleHQpCi0gICAgICBwU2VnbWVudC0+bV9SZXN1bHQuc2QtPlNldEdiQ29udGV4dChnYkNvbnRleHQpOworICAgICAgcFNlZ21lbnQtPm1fU3ltYm9sRGljdC0+U2V0R2JDb250ZXh0KGdiQ29udGV4dCk7CiAgICAgaWYgKGJVc2VHckNvbnRleHQpCi0gICAgICBwU2VnbWVudC0+bV9SZXN1bHQuc2QtPlNldEdyQ29udGV4dChnckNvbnRleHQpOworICAgICAgcFNlZ21lbnQtPm1fU3ltYm9sRGljdC0+U2V0R3JDb250ZXh0KGdyQ29udGV4dCk7CiAgIH0KICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7CiB9CkBAIC02NDQsNyArNjM3LDcgQEAKICAgICByZXR1cm4gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwogICB9CiAKLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9UUkRQcm9jPiBwVFJEKG5ldyBDSkJpZzJfVFJEUHJvYyk7CisgIGF1dG8gcFRSRCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfVFJEUHJvYz4oKTsKICAgcFRSRC0+U0JXID0gcmkud2lkdGg7CiAgIHBUUkQtPlNCSCA9IHJpLmhlaWdodDsKICAgcFRSRC0+U0JIVUZGID0gd0ZsYWdzICYgMHgwMDAxOwpAQCAtNjkyLDE2ICs2ODUsMTYgQEAKICAgICByZXR1cm4gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwogCiAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50OyArK2kpIHsKLSAgICBpZiAoIWZpbmRTZWdtZW50QnlOdW1iZXIocFNlZ21lbnQtPm1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1tpXSkpCisgICAgaWYgKCFmaW5kU2VnbWVudEJ5TnVtYmVyKHBTZWdtZW50LT5tX1JlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1tpXSkpCiAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CiAgIH0KIAogICBwVFJELT5TQk5VTVNZTVMgPSAwOwogICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwU2VnbWVudC0+bV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudDsgKytpKSB7CiAgICAgQ0pCaWcyX1NlZ21lbnQqIHBTZWcgPQotICAgICAgICBmaW5kU2VnbWVudEJ5TnVtYmVyKHBTZWdtZW50LT5tX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbaV0pOworICAgICAgICBmaW5kU2VnbWVudEJ5TnVtYmVyKHBTZWdtZW50LT5tX1JlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1tpXSk7CiAgICAgaWYgKHBTZWctPm1fY0ZsYWdzLnMudHlwZSA9PSAwKSB7Ci0gICAgICBwVFJELT5TQk5VTVNZTVMgKz0gcFNlZy0+bV9SZXN1bHQuc2QtPk51bUltYWdlcygpOworICAgICAgcFRSRC0+U0JOVU1TWU1TICs9IHBTZWctPm1fU3ltYm9sRGljdC0+TnVtSW1hZ2VzKCk7CiAgICAgfQogICB9CiAKQEAgLTcxMSw5ICs3MDQsOSBAQAogICAgIGR3VGVtcCA9IDA7CiAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQ7ICsraSkgewogICAgICAgQ0pCaWcyX1NlZ21lbnQqIHBTZWcgPQotICAgICAgICAgIGZpbmRTZWdtZW50QnlOdW1iZXIocFNlZ21lbnQtPm1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1tpXSk7CisgICAgICAgICAgZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9SZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbaV0pOwogICAgICAgaWYgKHBTZWctPm1fY0ZsYWdzLnMudHlwZSA9PSAwKSB7Ci0gICAgICAgIGNvbnN0IENKQmlnMl9TeW1ib2xEaWN0JiBkaWN0ID0gKnBTZWctPm1fUmVzdWx0LnNkOworICAgICAgICBjb25zdCBDSkJpZzJfU3ltYm9sRGljdCYgZGljdCA9ICpwU2VnLT5tX1N5bWJvbERpY3QuZ2V0KCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZGljdC5OdW1JbWFnZXMoKTsgKytqKQogICAgICAgICAgIFNCU1lNUy5nZXQoKVtkd1RlbXAgKyBqXSA9IGRpY3QuR2V0SW1hZ2Uoaik7CiAgICAgICAgIGR3VGVtcCArPSBkaWN0Lk51bUltYWdlcygpOwpAQCAtNzI0LDE1ICs3MTcsMTQgQEAKICAgICBwVFJELT5TQlNZTVMgPSBudWxscHRyOwogICB9CiAKLSAgc3RkOjp1bmlxdWVfcHRyPEpCaWcySHVmZm1hbkNvZGUsIEZ4RnJlZURlbGV0ZXI+IFNCU1lNQ09ERVM7CiAgIGlmIChwVFJELT5TQkhVRkYgPT0gMSkgewotICAgIFNCU1lNQ09ERVMucmVzZXQoCi0gICAgICAgIGRlY29kZVN5bWJvbElESHVmZm1hblRhYmxlKG1fcFN0cmVhbS5nZXQoKSwgcFRSRC0+U0JOVU1TWU1TKSk7Ci0gICAgaWYgKCFTQlNZTUNPREVTKQorICAgIHN0ZDo6dmVjdG9yPEpCaWcySHVmZm1hbkNvZGU+IFNCU1lNQ09ERVMgPQorICAgICAgICBkZWNvZGVTeW1ib2xJREh1ZmZtYW5UYWJsZShtX3BTdHJlYW0uZ2V0KCksIHBUUkQtPlNCTlVNU1lNUyk7CisgICAgaWYgKFNCU1lNQ09ERVMuZW1wdHkoKSkKICAgICAgIHJldHVybiBKQklHMl9FUlJPUl9GQVRBTDsKIAogICAgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7Ci0gICAgcFRSRC0+U0JTWU1DT0RFUyA9IFNCU1lNQ09ERVMuZ2V0KCk7CisgICAgcFRSRC0+U0JTWU1DT0RFUyA9IHN0ZDo6bW92ZShTQlNZTUNPREVTKTsKICAgfSBlbHNlIHsKICAgICBkd1RlbXAgPSAwOwogICAgIHdoaWxlICgodWludDMyX3QpKDEgPDwgZHdUZW1wKSA8IHBUUkQtPlNCTlVNU1lNUykgewpAQCAtNzcxLDcgKzc2Myw3IEBACiAgICAgICAgICAgZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOwogICAgICAgaWYgKCFwU2VnKQogICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7Ci0gICAgICBwVFJELT5TQkhVRkZGUyA9IHBTZWctPm1fUmVzdWx0Lmh0OworICAgICAgcFRSRC0+U0JIVUZGRlMgPSBwU2VnLT5tX0h1ZmZtYW5UYWJsZS5nZXQoKTsKICAgICB9CiAgICAgaWYgKGNTQkhVRkZEUyA9PSAwKSB7CiAgICAgICBUYWJsZV9COCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSHVmZm1hblRhYmxlPigKQEAgLTc5MCw3ICs3ODIsNyBAQAogICAgICAgICAgIGZpbmRSZWZlcnJlZFNlZ21lbnRCeVR5cGVBbmRJbmRleChwU2VnbWVudCwgNTMsIG5JbmRleCsrKTsKICAgICAgIGlmICghcFNlZykKICAgICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOwotICAgICAgcFRSRC0+U0JIVUZGRFMgPSBwU2VnLT5tX1Jlc3VsdC5odDsKKyAgICAgIHBUUkQtPlNCSFVGRkRTID0gcFNlZy0+bV9IdWZmbWFuVGFibGUuZ2V0KCk7CiAgICAgfQogICAgIGlmIChjU0JIVUZGRFQgPT0gMCkgewogICAgICAgVGFibGVfQjExID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9IdWZmbWFuVGFibGU+KApAQCAtODA5LDcgKzgwMSw3IEBACiAgICAgICAgICAgZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOwogICAgICAgaWYgKCFwU2VnKQogICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7Ci0gICAgICBwVFJELT5TQkhVRkZEVCA9IHBTZWctPm1fUmVzdWx0Lmh0OworICAgICAgcFRSRC0+U0JIVUZGRFQgPSBwU2VnLT5tX0h1ZmZtYW5UYWJsZS5nZXQoKTsKICAgICB9CiAgICAgaWYgKGNTQkhVRkZSRFcgPT0gMCkgewogICAgICAgVGFibGVfQjE0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9IdWZmbWFuVGFibGU+KApAQCAtODI0LDcgKzgxNiw3IEBACiAgICAgICAgICAgZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOwogICAgICAgaWYgKCFwU2VnKQogICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7Ci0gICAgICBwVFJELT5TQkhVRkZSRFcgPSBwU2VnLT5tX1Jlc3VsdC5odDsKKyAgICAgIHBUUkQtPlNCSFVGRlJEVyA9IHBTZWctPm1fSHVmZm1hblRhYmxlLmdldCgpOwogICAgIH0KICAgICBpZiAoY1NCSFVGRlJESCA9PSAwKSB7CiAgICAgICBpZiAoIVRhYmxlX0IxNCkgewpAQCAtODQzLDcgKzgzNSw3IEBACiAgICAgICAgICAgZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOwogICAgICAgaWYgKCFwU2VnKQogICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7Ci0gICAgICBwVFJELT5TQkhVRkZSREggPSBwU2VnLT5tX1Jlc3VsdC5odDsKKyAgICAgIHBUUkQtPlNCSFVGRlJESCA9IHBTZWctPm1fSHVmZm1hblRhYmxlLmdldCgpOwogICAgIH0KICAgICBpZiAoY1NCSFVGRlJEWCA9PSAwKSB7CiAgICAgICBpZiAoIVRhYmxlX0IxNCkgewpAQCAtODYyLDcgKzg1NCw3IEBACiAgICAgICAgICAgZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOwogICAgICAgaWYgKCFwU2VnKQogICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7Ci0gICAgICBwVFJELT5TQkhVRkZSRFggPSBwU2VnLT5tX1Jlc3VsdC5odDsKKyAgICAgIHBUUkQtPlNCSFVGRlJEWCA9IHBTZWctPm1fSHVmZm1hblRhYmxlLmdldCgpOwogICAgIH0KICAgICBpZiAoY1NCSFVGRlJEWSA9PSAwKSB7CiAgICAgICBpZiAoIVRhYmxlX0IxNCkgewpAQCAtODgxLDcgKzg3Myw3IEBACiAgICAgICAgICAgZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOwogICAgICAgaWYgKCFwU2VnKQogICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7Ci0gICAgICBwVFJELT5TQkhVRkZSRFkgPSBwU2VnLT5tX1Jlc3VsdC5odDsKKyAgICAgIHBUUkQtPlNCSFVGRlJEWSA9IHBTZWctPm1fSHVmZm1hblRhYmxlLmdldCgpOwogICAgIH0KICAgICBpZiAoY1NCSFVGRlJTSVpFID09IDApIHsKICAgICAgIFRhYmxlX0IxID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9IdWZmbWFuVGFibGU+KApAQCAtODkyLDcgKzg4NCw3IEBACiAgICAgICAgICAgZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KHBTZWdtZW50LCA1MywgbkluZGV4KyspOwogICAgICAgaWYgKCFwU2VnKQogICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7Ci0gICAgICBwVFJELT5TQkhVRkZSU0laRSA9IHBTZWctPm1fUmVzdWx0Lmh0OworICAgICAgcFRSRC0+U0JIVUZGUlNJWkUgPSBwU2VnLT5tX0h1ZmZtYW5UYWJsZS5nZXQoKTsKICAgICB9CiAgIH0KICAgc3RkOjp1bmlxdWVfcHRyPEpCaWcyQXJpdGhDdHgsIEZ4RnJlZURlbGV0ZXI+IGdyQ29udGV4dDsKQEAgLTkwMiwyMCArODk0LDE5IEBACiAgICAgSkJJRzJfbWVtc2V0KGdyQ29udGV4dC5nZXQoKSwgMCwgc2l6ZW9mKEpCaWcyQXJpdGhDdHgpICogc2l6ZSk7CiAgIH0KICAgaWYgKHBUUkQtPlNCSFVGRiA9PSAwKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aERlY29kZXI+IHBBcml0aERlY29kZXIoCi0gICAgICAgIG5ldyBDSkJpZzJfQXJpdGhEZWNvZGVyKG1fcFN0cmVhbS5nZXQoKSkpOworICAgIGF1dG8gcEFyaXRoRGVjb2RlciA9CisgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfQXJpdGhEZWNvZGVyPihtX3BTdHJlYW0uZ2V0KCkpOwogICAgIHBTZWdtZW50LT5tX25SZXN1bHRUeXBlID0gSkJJRzJfSU1BR0VfUE9JTlRFUjsKLSAgICBwU2VnbWVudC0+bV9SZXN1bHQuaW0gPQorICAgIHBTZWdtZW50LT5tX0ltYWdlID0KICAgICAgICAgcFRSRC0+ZGVjb2RlX0FyaXRoKHBBcml0aERlY29kZXIuZ2V0KCksIGdyQ29udGV4dC5nZXQoKSwgbnVsbHB0cik7Ci0gICAgaWYgKCFwU2VnbWVudC0+bV9SZXN1bHQuaW0pCisgICAgaWYgKCFwU2VnbWVudC0+bV9JbWFnZSkKICAgICAgIHJldHVybiBKQklHMl9FUlJPUl9GQVRBTDsKICAgICBtX3BTdHJlYW0tPmFsaWduQnl0ZSgpOwogICAgIG1fcFN0cmVhbS0+b2Zmc2V0KDIpOwogICB9IGVsc2UgewogICAgIHBTZWdtZW50LT5tX25SZXN1bHRUeXBlID0gSkJJRzJfSU1BR0VfUE9JTlRFUjsKLSAgICBwU2VnbWVudC0+bV9SZXN1bHQuaW0gPQotICAgICAgICBwVFJELT5kZWNvZGVfSHVmZm1hbihtX3BTdHJlYW0uZ2V0KCksIGdyQ29udGV4dC5nZXQoKSk7Ci0gICAgaWYgKCFwU2VnbWVudC0+bV9SZXN1bHQuaW0pCisgICAgcFNlZ21lbnQtPm1fSW1hZ2UgPSBwVFJELT5kZWNvZGVfSHVmZm1hbihtX3BTdHJlYW0uZ2V0KCksIGdyQ29udGV4dC5nZXQoKSk7CisgICAgaWYgKCFwU2VnbWVudC0+bV9JbWFnZSkKICAgICAgIHJldHVybiBKQklHMl9FUlJPUl9GQVRBTDsKICAgICBtX3BTdHJlYW0tPmFsaWduQnl0ZSgpOwogICB9CkBAIC05MjcsMTggKzkxOCwxNyBAQAogICAgICAgICBtX3BQYWdlLT5leHBhbmQocmkueSArIHJpLmhlaWdodCwgKHBQYWdlSW5mby0+bV9jRmxhZ3MgJiA0KSA/IDEgOiAwKTsKICAgICAgIH0KICAgICB9Ci0gICAgbV9wUGFnZS0+Y29tcG9zZUZyb20ocmkueCwgcmkueSwgcFNlZ21lbnQtPm1fUmVzdWx0LmltLAorICAgIG1fcFBhZ2UtPmNvbXBvc2VGcm9tKHJpLngsIHJpLnksIHBTZWdtZW50LT5tX0ltYWdlLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIChKQmlnMkNvbXBvc2VPcCkocmkuZmxhZ3MgJiAweDAzKSk7Ci0gICAgZGVsZXRlIHBTZWdtZW50LT5tX1Jlc3VsdC5pbTsKLSAgICBwU2VnbWVudC0+bV9SZXN1bHQuaW0gPSBudWxscHRyOworICAgIHBTZWdtZW50LT5tX0ltYWdlLnJlc2V0KCk7CiAgIH0KICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7CiB9CiAKIGludDMyX3QgQ0pCaWcyX0NvbnRleHQ6OnBhcnNlUGF0dGVybkRpY3QoQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSkgewogICB1aW50OF90IGNGbGFnczsKLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9QRERQcm9jPiBwUEREKG5ldyBDSkJpZzJfUEREUHJvYyk7CisgIGF1dG8gcFBERCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfUEREUHJvYz4oKTsKICAgaWYgKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZjRmxhZ3MpICE9IDAgfHwKICAgICAgIG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZwUERELT5IRFBXKSAhPSAwIHx8CiAgICAgICBtX3BTdHJlYW0tPnJlYWQxQnl0ZSgmcFBERC0+SERQSCkgIT0gMCB8fApAQCAtOTU2LDE4ICs5NDYsMTggQEAKICAgICBzdGQ6OnVuaXF1ZV9wdHI8SkJpZzJBcml0aEN0eCwgRnhGcmVlRGVsZXRlcj4gZ2JDb250ZXh0KAogICAgICAgICBGWF9BbGxvYyhKQmlnMkFyaXRoQ3R4LCBzaXplKSk7CiAgICAgSkJJRzJfbWVtc2V0KGdiQ29udGV4dC5nZXQoKSwgMCwgc2l6ZW9mKEpCaWcyQXJpdGhDdHgpICogc2l6ZSk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aERlY29kZXI+IHBBcml0aERlY29kZXIoCi0gICAgICAgIG5ldyBDSkJpZzJfQXJpdGhEZWNvZGVyKG1fcFN0cmVhbS5nZXQoKSkpOwotICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5wZCA9CisgICAgYXV0byBwQXJpdGhEZWNvZGVyID0KKyAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9Bcml0aERlY29kZXI+KG1fcFN0cmVhbS5nZXQoKSk7CisgICAgcFNlZ21lbnQtPm1fUGF0dGVybkRpY3QgPQogICAgICAgICBwUERELT5kZWNvZGVfQXJpdGgocEFyaXRoRGVjb2Rlci5nZXQoKSwgZ2JDb250ZXh0LmdldCgpLCBwUGF1c2UpOwotICAgIGlmICghcFNlZ21lbnQtPm1fUmVzdWx0LnBkKQorICAgIGlmICghcFNlZ21lbnQtPm1fUGF0dGVybkRpY3QpCiAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CiAKICAgICBtX3BTdHJlYW0tPmFsaWduQnl0ZSgpOwogICAgIG1fcFN0cmVhbS0+b2Zmc2V0KDIpOwogICB9IGVsc2UgewotICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5wZCA9IHBQREQtPmRlY29kZV9NTVIobV9wU3RyZWFtLmdldCgpLCBwUGF1c2UpOwotICAgIGlmICghcFNlZ21lbnQtPm1fUmVzdWx0LnBkKQorICAgIHBTZWdtZW50LT5tX1BhdHRlcm5EaWN0ID0gcFBERC0+ZGVjb2RlX01NUihtX3BTdHJlYW0uZ2V0KCkpOworICAgIGlmICghcFNlZ21lbnQtPm1fUGF0dGVybkRpY3QpCiAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CiAgICAgbV9wU3RyZWFtLT5hbGlnbkJ5dGUoKTsKICAgfQpAQCAtOTc1LDEwICs5NjUsMTAgQEAKIH0KIAogaW50MzJfdCBDSkJpZzJfQ29udGV4dDo6cGFyc2VIYWxmdG9uZVJlZ2lvbihDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKSB7CiAgIHVpbnQ4X3QgY0ZsYWdzOwogICBKQmlnMlJlZ2lvbkluZm8gcmk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSFRSRFByb2M+IHBIUkQobmV3IENKQmlnMl9IVFJEUHJvYyk7CisgIGF1dG8gcEhSRCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSFRSRFByb2M+KCk7CiAgIGlmIChwYXJzZVJlZ2lvbkluZm8oJnJpKSAhPSBKQklHMl9TVUNDRVNTIHx8CiAgICAgICBtX3BTdHJlYW0tPnJlYWQxQnl0ZSgmY0ZsYWdzKSAhPSAwIHx8CiAgICAgICBtX3BTdHJlYW0tPnJlYWRJbnRlZ2VyKCZwSFJELT5IR1cpICE9IDAgfHwKQEAgLTEwMDQsMTYgKzk5NCwxNiBAQAogICAgIHJldHVybiBKQklHMl9FUlJPUl9GQVRBTDsKIAogICBDSkJpZzJfU2VnbWVudCogcFNlZyA9Ci0gICAgICBmaW5kU2VnbWVudEJ5TnVtYmVyKHBTZWdtZW50LT5tX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbMF0pOworICAgICAgZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9SZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbMF0pOwogICBpZiAoIXBTZWcgfHwgKHBTZWctPm1fY0ZsYWdzLnMudHlwZSAhPSAxNikpCiAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOwogCi0gIENKQmlnMl9QYXR0ZXJuRGljdCogcFBhdHRlcm5EaWN0ID0gcFNlZy0+bV9SZXN1bHQucGQ7CisgIGNvbnN0IENKQmlnMl9QYXR0ZXJuRGljdCogcFBhdHRlcm5EaWN0ID0gcFNlZy0+bV9QYXR0ZXJuRGljdC5nZXQoKTsKICAgaWYgKCFwUGF0dGVybkRpY3QgfHwgKHBQYXR0ZXJuRGljdC0+TlVNUEFUUyA9PSAwKSkKICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CiAKICAgcEhSRC0+SE5VTVBBVFMgPSBwUGF0dGVybkRpY3QtPk5VTVBBVFM7Ci0gIHBIUkQtPkhQQVRTID0gcFBhdHRlcm5EaWN0LT5IRFBBVFM7CisgIHBIUkQtPkhQQVRTID0gJnBQYXR0ZXJuRGljdC0+SERQQVRTOwogICBwSFJELT5IUFcgPSBwUGF0dGVybkRpY3QtPkhEUEFUU1swXS0+d2lkdGgoKTsKICAgcEhSRC0+SFBIID0gcFBhdHRlcm5EaWN0LT5IRFBBVFNbMF0tPmhlaWdodCgpOwogICBwU2VnbWVudC0+bV9uUmVzdWx0VHlwZSA9IEpCSUcyX0lNQUdFX1BPSU5URVI7CkBAIC0xMDIyLDE4ICsxMDEyLDE4IEBACiAgICAgc3RkOjp1bmlxdWVfcHRyPEpCaWcyQXJpdGhDdHgsIEZ4RnJlZURlbGV0ZXI+IGdiQ29udGV4dCgKICAgICAgICAgRlhfQWxsb2MoSkJpZzJBcml0aEN0eCwgc2l6ZSkpOwogICAgIEpCSUcyX21lbXNldChnYkNvbnRleHQuZ2V0KCksIDAsIHNpemVvZihKQmlnMkFyaXRoQ3R4KSAqIHNpemUpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfQXJpdGhEZWNvZGVyPiBwQXJpdGhEZWNvZGVyKAotICAgICAgICBuZXcgQ0pCaWcyX0FyaXRoRGVjb2RlcihtX3BTdHJlYW0uZ2V0KCkpKTsKLSAgICBwU2VnbWVudC0+bV9SZXN1bHQuaW0gPQorICAgIGF1dG8gcEFyaXRoRGVjb2RlciA9CisgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfQXJpdGhEZWNvZGVyPihtX3BTdHJlYW0uZ2V0KCkpOworICAgIHBTZWdtZW50LT5tX0ltYWdlID0KICAgICAgICAgcEhSRC0+ZGVjb2RlX0FyaXRoKHBBcml0aERlY29kZXIuZ2V0KCksIGdiQ29udGV4dC5nZXQoKSwgcFBhdXNlKTsKLSAgICBpZiAoIXBTZWdtZW50LT5tX1Jlc3VsdC5pbSkKKyAgICBpZiAoIXBTZWdtZW50LT5tX0ltYWdlKQogICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOwogCiAgICAgbV9wU3RyZWFtLT5hbGlnbkJ5dGUoKTsKICAgICBtX3BTdHJlYW0tPm9mZnNldCgyKTsKICAgfSBlbHNlIHsKLSAgICBwU2VnbWVudC0+bV9SZXN1bHQuaW0gPSBwSFJELT5kZWNvZGVfTU1SKG1fcFN0cmVhbS5nZXQoKSwgcFBhdXNlKTsKLSAgICBpZiAoIXBTZWdtZW50LT5tX1Jlc3VsdC5pbSkKKyAgICBwU2VnbWVudC0+bV9JbWFnZSA9IHBIUkQtPmRlY29kZV9NTVIobV9wU3RyZWFtLmdldCgpKTsKKyAgICBpZiAoIXBTZWdtZW50LT5tX0ltYWdlKQogICAgICAgcmV0dXJuIEpCSUcyX0VSUk9SX0ZBVEFMOwogICAgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7CiAgIH0KQEAgLTEwNDUsMTggKzEwMzUsMTcgQEAKICAgICAgICAgbV9wUGFnZS0+ZXhwYW5kKHJpLnkgKyByaS5oZWlnaHQsIChwUGFnZUluZm8tPm1fY0ZsYWdzICYgNCkgPyAxIDogMCk7CiAgICAgICB9CiAgICAgfQotICAgIG1fcFBhZ2UtPmNvbXBvc2VGcm9tKHJpLngsIHJpLnksIHBTZWdtZW50LT5tX1Jlc3VsdC5pbSwKKyAgICBtX3BQYWdlLT5jb21wb3NlRnJvbShyaS54LCByaS55LCBwU2VnbWVudC0+bV9JbWFnZS5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAoSkJpZzJDb21wb3NlT3ApKHJpLmZsYWdzICYgMHgwMykpOwotICAgIGRlbGV0ZSBwU2VnbWVudC0+bV9SZXN1bHQuaW07Ci0gICAgcFNlZ21lbnQtPm1fUmVzdWx0LmltID0gbnVsbHB0cjsKKyAgICBwU2VnbWVudC0+bV9JbWFnZS5yZXNldCgpOwogICB9CiAgIHJldHVybiBKQklHMl9TVUNDRVNTOwogfQogCiBpbnQzMl90IENKQmlnMl9Db250ZXh0OjpwYXJzZUdlbmVyaWNSZWdpb24oQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpIHsKICAgaWYgKCFtX3BHUkQpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0dSRFByb2M+IHBHUkQobmV3IENKQmlnMl9HUkRQcm9jKTsKKyAgICBhdXRvIHBHUkQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0dSRFByb2M+KCk7CiAgICAgdWludDhfdCBjRmxhZ3M7CiAgICAgaWYgKHBhcnNlUmVnaW9uSW5mbygmbV9yaSkgIT0gSkJJRzJfU1VDQ0VTUyB8fAogICAgICAgICBtX3BTdHJlYW0tPnJlYWQxQnl0ZSgmY0ZsYWdzKSAhPSAwKSB7CkBAIC0xMDY0LDcgKzEwNTMsNiBAQAogICAgIH0KICAgICBpZiAobV9yaS5oZWlnaHQgPCAwIHx8IG1fcmkud2lkdGggPCAwKQogICAgICAgcmV0dXJuIEpCSUcyX0ZBSUxFRDsKLQogICAgIHBHUkQtPkdCVyA9IG1fcmkud2lkdGg7CiAgICAgcEdSRC0+R0JIID0gbV9yaS5oZWlnaHQ7CiAgICAgcEdSRC0+TU1SID0gY0ZsYWdzICYgMHgwMTsKQEAgLTEwNzMsMTUgKzEwNjEsMTMgQEAKICAgICBpZiAocEdSRC0+TU1SID09IDApIHsKICAgICAgIGlmIChwR1JELT5HQlRFTVBMQVRFID09IDApIHsKICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgODsgKytpKSB7Ci0gICAgICAgICAgaWYgKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCh1aW50OF90KikmcEdSRC0+R0JBVFtpXSkgIT0gMCkgeworICAgICAgICAgIGlmIChtX3BTdHJlYW0tPnJlYWQxQnl0ZSgodWludDhfdCopJnBHUkQtPkdCQVRbaV0pICE9IDApCiAgICAgICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwotICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfSBlbHNlIHsKICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMjsgKytpKSB7Ci0gICAgICAgICAgaWYgKG1fcFN0cmVhbS0+cmVhZDFCeXRlKCh1aW50OF90KikmcEdSRC0+R0JBVFtpXSkgIT0gMCkgeworICAgICAgICAgIGlmIChtX3BTdHJlYW0tPnJlYWQxQnl0ZSgodWludDhfdCopJnBHUkQtPkdCQVRbaV0pICE9IDApCiAgICAgICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwotICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTEwOTAsMTggKzEwNzYsMTYgQEAKICAgfQogICBwU2VnbWVudC0+bV9uUmVzdWx0VHlwZSA9IEpCSUcyX0lNQUdFX1BPSU5URVI7CiAgIGlmIChtX3BHUkQtPk1NUiA9PSAwKSB7Ci0gICAgaWYgKG1fZ2JDb250ZXh0LmVtcHR5KCkpIHsKLSAgICAgIGNvbnN0IHNpemVfdCBzaXplID0gR2V0SHVmZkNvbnRleHRTaXplKG1fcEdSRC0+R0JURU1QTEFURSk7Ci0gICAgICBtX2diQ29udGV4dC5yZXNpemUoc2l6ZSk7Ci0gICAgfQorICAgIGlmIChtX2diQ29udGV4dC5lbXB0eSgpKQorICAgICAgbV9nYkNvbnRleHQucmVzaXplKEdldEh1ZmZDb250ZXh0U2l6ZShtX3BHUkQtPkdCVEVNUExBVEUpKTsKICAgICBpZiAoIW1fcEFyaXRoRGVjb2RlcikgewogICAgICAgbV9wQXJpdGhEZWNvZGVyID0KICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0FyaXRoRGVjb2Rlcj4obV9wU3RyZWFtLmdldCgpKTsKLSAgICAgIG1fUHJvY2Vzc2luZ1N0YXR1cyA9IG1fcEdSRC0+U3RhcnRfZGVjb2RlX0FyaXRoKCZwU2VnbWVudC0+bV9SZXN1bHQuaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BBcml0aERlY29kZXIuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbV9nYkNvbnRleHRbMF0sIHBQYXVzZSk7CisgICAgICBtX1Byb2Nlc3NpbmdTdGF0dXMgPSBtX3BHUkQtPlN0YXJ0X2RlY29kZV9Bcml0aCgKKyAgICAgICAgICAmcFNlZ21lbnQtPm1fSW1hZ2UsIG1fcEFyaXRoRGVjb2Rlci5nZXQoKSwgJm1fZ2JDb250ZXh0WzBdLCBwUGF1c2UpOwogICAgIH0gZWxzZSB7Ci0gICAgICBtX1Byb2Nlc3NpbmdTdGF0dXMgPSBtX3BHUkQtPkNvbnRpbnVlX2RlY29kZShwUGF1c2UpOworICAgICAgbV9Qcm9jZXNzaW5nU3RhdHVzID0KKyAgICAgICAgICBtX3BHUkQtPkNvbnRpbnVlX2RlY29kZShwUGF1c2UsIG1fcEFyaXRoRGVjb2Rlci5nZXQoKSk7CiAgICAgfQogICAgIGlmIChtX1Byb2Nlc3NpbmdTdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkgewogICAgICAgaWYgKHBTZWdtZW50LT5tX2NGbGFncy5zLnR5cGUgIT0gMzYpIHsKQEAgLTExMTUsMjQgKzEwOTksMjMgQEAKICAgICAgICAgfQogICAgICAgICBGWF9SRUNUIFJlY3QgPSBtX3BHUkQtPkdldFJlcGxhY2VSZWN0KCk7CiAgICAgICAgIG1fcFBhZ2UtPmNvbXBvc2VGcm9tKG1fcmkueCArIFJlY3QubGVmdCwgbV9yaS55ICsgUmVjdC50b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWdtZW50LT5tX1Jlc3VsdC5pbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNlZ21lbnQtPm1fSW1hZ2UuZ2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChKQmlnMkNvbXBvc2VPcCkobV9yaS5mbGFncyAmIDB4MDMpLCAmUmVjdCk7CiAgICAgICB9CiAgICAgICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKLSAgICB9IGVsc2UgewotICAgICAgbV9wQXJpdGhEZWNvZGVyLnJlc2V0KCk7Ci0gICAgICBtX2diQ29udGV4dC5jbGVhcigpOwotICAgICAgaWYgKCFwU2VnbWVudC0+bV9SZXN1bHQuaW0pIHsKLSAgICAgICAgbV9Qcm9jZXNzaW5nU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7Ci0gICAgICAgIG1fcEdSRC5yZXNldCgpOwotICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7Ci0gICAgICB9Ci0gICAgICBtX3BTdHJlYW0tPmFsaWduQnl0ZSgpOwotICAgICAgbV9wU3RyZWFtLT5vZmZzZXQoMik7CiAgICAgfQorICAgIG1fcEFyaXRoRGVjb2Rlci5yZXNldCgpOworICAgIG1fZ2JDb250ZXh0LmNsZWFyKCk7CisgICAgaWYgKCFwU2VnbWVudC0+bV9JbWFnZSkgeworICAgICAgbV9Qcm9jZXNzaW5nU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisgICAgICBtX3BHUkQucmVzZXQoKTsKKyAgICAgIHJldHVybiBKQklHMl9FUlJPUl9GQVRBTDsKKyAgICB9CisgICAgbV9wU3RyZWFtLT5hbGlnbkJ5dGUoKTsKKyAgICBtX3BTdHJlYW0tPm9mZnNldCgyKTsKICAgfSBlbHNlIHsKLSAgICBtX3BHUkQtPlN0YXJ0X2RlY29kZV9NTVIoJnBTZWdtZW50LT5tX1Jlc3VsdC5pbSwgbV9wU3RyZWFtLmdldCgpLCBwUGF1c2UpOwotICAgIGlmICghcFNlZ21lbnQtPm1fUmVzdWx0LmltKSB7CisgICAgbV9wR1JELT5TdGFydF9kZWNvZGVfTU1SKCZwU2VnbWVudC0+bV9JbWFnZSwgbV9wU3RyZWFtLmdldCgpKTsKKyAgICBpZiAoIXBTZWdtZW50LT5tX0ltYWdlKSB7CiAgICAgICBtX3BHUkQucmVzZXQoKTsKICAgICAgIHJldHVybiBKQklHMl9FUlJPUl9GQVRBTDsKICAgICB9CkBAIC0xMTQ5LDEwICsxMTMyLDkgQEAKICAgICB9CiAgICAgRlhfUkVDVCBSZWN0ID0gbV9wR1JELT5HZXRSZXBsYWNlUmVjdCgpOwogICAgIG1fcFBhZ2UtPmNvbXBvc2VGcm9tKG1fcmkueCArIFJlY3QubGVmdCwgbV9yaS55ICsgUmVjdC50b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFNlZ21lbnQtPm1fUmVzdWx0LmltLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWdtZW50LT5tX0ltYWdlLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIChKQmlnMkNvbXBvc2VPcCkobV9yaS5mbGFncyAmIDB4MDMpLCAmUmVjdCk7Ci0gICAgZGVsZXRlIHBTZWdtZW50LT5tX1Jlc3VsdC5pbTsKLSAgICBwU2VnbWVudC0+bV9SZXN1bHQuaW0gPSBudWxscHRyOworICAgIHBTZWdtZW50LT5tX0ltYWdlLnJlc2V0KCk7CiAgIH0KICAgbV9wR1JELnJlc2V0KCk7CiAgIHJldHVybiBKQklHMl9TVUNDRVNTOwpAQCAtMTE2NSw3ICsxMTQ3LDcgQEAKICAgICAgIG1fcFN0cmVhbS0+cmVhZDFCeXRlKCZjRmxhZ3MpICE9IDApIHsKICAgICByZXR1cm4gSkJJRzJfRVJST1JfVE9PX1NIT1JUOwogICB9Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfR1JSRFByb2M+IHBHUlJEKG5ldyBDSkJpZzJfR1JSRFByb2MpOworICBhdXRvIHBHUlJEID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9HUlJEUHJvYz4oKTsKICAgcEdSUkQtPkdSVyA9IHJpLndpZHRoOwogICBwR1JSRC0+R1JIID0gcmkuaGVpZ2h0OwogICBwR1JSRC0+R1JURU1QTEFURSA9ICEhKGNGbGFncyAmIDB4MDEpOwpAQCAtMTE4MCw3ICsxMTYyLDcgQEAKICAgaWYgKHBTZWdtZW50LT5tX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50ID4gMCkgewogICAgIGludDMyX3QgaTsKICAgICBmb3IgKGkgPSAwOyBpIDwgcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQ7ICsraSkgewotICAgICAgcFNlZyA9IGZpbmRTZWdtZW50QnlOdW1iZXIocFNlZ21lbnQtPm1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyc1swXSk7CisgICAgICBwU2VnID0gZmluZFNlZ21lbnRCeU51bWJlcihwU2VnbWVudC0+bV9SZWZlcnJlZF90b19zZWdtZW50X251bWJlcnNbMF0pOwogICAgICAgaWYgKCFwU2VnKQogICAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CiAKQEAgLTExOTIsNyArMTE3NCw3IEBACiAgICAgaWYgKGkgPj0gcFNlZ21lbnQtPm1fblJlZmVycmVkX3RvX3NlZ21lbnRfY291bnQpCiAgICAgICByZXR1cm4gSkJJRzJfRVJST1JfRkFUQUw7CiAKLSAgICBwR1JSRC0+R1JSRUZFUkVOQ0UgPSBwU2VnLT5tX1Jlc3VsdC5pbTsKKyAgICBwR1JSRC0+R1JSRUZFUkVOQ0UgPSBwU2VnLT5tX0ltYWdlLmdldCgpOwogICB9IGVsc2UgewogICAgIHBHUlJELT5HUlJFRkVSRU5DRSA9IG1fcFBhZ2UuZ2V0KCk7CiAgIH0KQEAgLTEyMDIsMTEgKzExODQsMTAgQEAKICAgc3RkOjp1bmlxdWVfcHRyPEpCaWcyQXJpdGhDdHgsIEZ4RnJlZURlbGV0ZXI+IGdyQ29udGV4dCgKICAgICAgIEZYX0FsbG9jKEpCaWcyQXJpdGhDdHgsIHNpemUpKTsKICAgSkJJRzJfbWVtc2V0KGdyQ29udGV4dC5nZXQoKSwgMCwgc2l6ZW9mKEpCaWcyQXJpdGhDdHgpICogc2l6ZSk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfQXJpdGhEZWNvZGVyPiBwQXJpdGhEZWNvZGVyKAotICAgICAgbmV3IENKQmlnMl9Bcml0aERlY29kZXIobV9wU3RyZWFtLmdldCgpKSk7CisgIGF1dG8gcEFyaXRoRGVjb2RlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfQXJpdGhEZWNvZGVyPihtX3BTdHJlYW0uZ2V0KCkpOwogICBwU2VnbWVudC0+bV9uUmVzdWx0VHlwZSA9IEpCSUcyX0lNQUdFX1BPSU5URVI7Ci0gIHBTZWdtZW50LT5tX1Jlc3VsdC5pbSA9IHBHUlJELT5kZWNvZGUocEFyaXRoRGVjb2Rlci5nZXQoKSwgZ3JDb250ZXh0LmdldCgpKTsKLSAgaWYgKCFwU2VnbWVudC0+bV9SZXN1bHQuaW0pCisgIHBTZWdtZW50LT5tX0ltYWdlID0gcEdSUkQtPmRlY29kZShwQXJpdGhEZWNvZGVyLmdldCgpLCBnckNvbnRleHQuZ2V0KCkpOworICBpZiAoIXBTZWdtZW50LT5tX0ltYWdlKQogICAgIHJldHVybiBKQklHMl9FUlJPUl9GQVRBTDsKIAogICBtX3BTdHJlYW0tPmFsaWduQnl0ZSgpOwpAQCAtMTIxOSwyMyArMTIwMCwyMSBAQAogICAgICAgICBtX3BQYWdlLT5leHBhbmQocmkueSArIHJpLmhlaWdodCwgKHBQYWdlSW5mby0+bV9jRmxhZ3MgJiA0KSA/IDEgOiAwKTsKICAgICAgIH0KICAgICB9Ci0gICAgbV9wUGFnZS0+Y29tcG9zZUZyb20ocmkueCwgcmkueSwgcFNlZ21lbnQtPm1fUmVzdWx0LmltLAorICAgIG1fcFBhZ2UtPmNvbXBvc2VGcm9tKHJpLngsIHJpLnksIHBTZWdtZW50LT5tX0ltYWdlLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIChKQmlnMkNvbXBvc2VPcCkocmkuZmxhZ3MgJiAweDAzKSk7Ci0gICAgZGVsZXRlIHBTZWdtZW50LT5tX1Jlc3VsdC5pbTsKLSAgICBwU2VnbWVudC0+bV9SZXN1bHQuaW0gPSBudWxscHRyOworICAgIHBTZWdtZW50LT5tX0ltYWdlLnJlc2V0KCk7CiAgIH0KICAgcmV0dXJuIEpCSUcyX1NVQ0NFU1M7CiB9CiAKIGludDMyX3QgQ0pCaWcyX0NvbnRleHQ6OnBhcnNlVGFibGUoQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50KSB7CiAgIHBTZWdtZW50LT5tX25SZXN1bHRUeXBlID0gSkJJRzJfSFVGRk1BTl9UQUJMRV9QT0lOVEVSOwotICBwU2VnbWVudC0+bV9SZXN1bHQuaHQgPSBudWxscHRyOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4gcEh1ZmYoCi0gICAgICBuZXcgQ0pCaWcyX0h1ZmZtYW5UYWJsZShtX3BTdHJlYW0uZ2V0KCkpKTsKKyAgcFNlZ21lbnQtPm1fSHVmZm1hblRhYmxlLnJlc2V0KCk7CisgIGF1dG8gcEh1ZmYgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4obV9wU3RyZWFtLmdldCgpKTsKICAgaWYgKCFwSHVmZi0+SXNPSygpKQogICAgIHJldHVybiBKQklHMl9FUlJPUl9GQVRBTDsKIAotICBwU2VnbWVudC0+bV9SZXN1bHQuaHQgPSBwSHVmZi5yZWxlYXNlKCk7CisgIHBTZWdtZW50LT5tX0h1ZmZtYW5UYWJsZSA9IHN0ZDo6bW92ZShwSHVmZik7CiAgIG1fcFN0cmVhbS0+YWxpZ25CeXRlKCk7CiAgIHJldHVybiBKQklHMl9TVUNDRVNTOwogfQpAQCAtMTI1MSwzNSArMTIzMCwzNSBAQAogICByZXR1cm4gSkJJRzJfU1VDQ0VTUzsKIH0KIAotSkJpZzJIdWZmbWFuQ29kZSogQ0pCaWcyX0NvbnRleHQ6OmRlY29kZVN5bWJvbElESHVmZm1hblRhYmxlKAorc3RkOjp2ZWN0b3I8SkJpZzJIdWZmbWFuQ29kZT4gQ0pCaWcyX0NvbnRleHQ6OmRlY29kZVN5bWJvbElESHVmZm1hblRhYmxlKAogICAgIENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sCiAgICAgdWludDMyX3QgU0JOVU1TWU1TKSB7CiAgIGNvbnN0IHNpemVfdCBrUnVuQ29kZXNTaXplID0gMzU7Ci0gIGludDMyX3QgcnVuY29kZXNba1J1bkNvZGVzU2l6ZV07Ci0gIGludDMyX3QgcnVuY29kZXNfbGVuW2tSdW5Db2Rlc1NpemVdOworICBKQmlnMkh1ZmZtYW5Db2RlIGh1ZmZtYW5fY29kZXNba1J1bkNvZGVzU2l6ZV07CiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga1J1bkNvZGVzU2l6ZTsgKytpKSB7Ci0gICAgaWYgKHBTdHJlYW0tPnJlYWROQml0cyg0LCAmcnVuY29kZXNfbGVuW2ldKSAhPSAwKQotICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgaWYgKHBTdHJlYW0tPnJlYWROQml0cyg0LCAmaHVmZm1hbl9jb2Rlc1tpXS5jb2RlbGVuKSAhPSAwKQorICAgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPEpCaWcySHVmZm1hbkNvZGU+KCk7CiAgIH0KLSAgaHVmZm1hbl9hc3NpZ25fY29kZShydW5jb2RlcywgcnVuY29kZXNfbGVuLCBrUnVuQ29kZXNTaXplKTsKKyAgaHVmZm1hbl9hc3NpZ25fY29kZShodWZmbWFuX2NvZGVzLCBrUnVuQ29kZXNTaXplKTsKIAotICBzdGQ6OnVuaXF1ZV9wdHI8SkJpZzJIdWZmbWFuQ29kZSwgRnhGcmVlRGVsZXRlcj4gU0JTWU1DT0RFUygKLSAgICAgIEZYX0FsbG9jKEpCaWcySHVmZm1hbkNvZGUsIFNCTlVNU1lNUykpOworICBzdGQ6OnZlY3RvcjxKQmlnMkh1ZmZtYW5Db2RlPiBTQlNZTUNPREVTKFNCTlVNU1lNUyk7CiAgIGludDMyX3QgcnVuID0gMDsKICAgaW50MzJfdCBpID0gMDsKLSAgd2hpbGUgKGkgPCAoaW50KVNCTlVNU1lNUykgeworICB3aGlsZSAoaSA8IHN0YXRpY19jYXN0PGludD4oU0JOVU1TWU1TKSkgewogICAgIHNpemVfdCBqOwogICAgIGludDMyX3QgblZhbCA9IDA7CiAgICAgaW50MzJfdCBuQml0cyA9IDA7CiAgICAgdWludDMyX3QgblRlbXA7CiAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIGlmIChwU3RyZWFtLT5yZWFkMUJpdCgmblRlbXApICE9IDApCi0gICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgaWYgKG5WYWwgPiBzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgoKSAvIDIgfHwKKyAgICAgICAgICBwU3RyZWFtLT5yZWFkMUJpdCgmblRlbXApICE9IDApIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPEpCaWcySHVmZm1hbkNvZGU+KCk7CisgICAgICB9CiAKICAgICAgIG5WYWwgPSAoblZhbCA8PCAxKSB8IG5UZW1wOwogICAgICAgKytuQml0czsKICAgICAgIGZvciAoaiA9IDA7IGogPCBrUnVuQ29kZXNTaXplOyArK2opIHsKLSAgICAgICAgaWYgKG5CaXRzID09IHJ1bmNvZGVzX2xlbltqXSAmJiBuVmFsID09IHJ1bmNvZGVzW2pdKQorICAgICAgICBpZiAobkJpdHMgPT0gaHVmZm1hbl9jb2Rlc1tqXS5jb2RlbGVuICYmIG5WYWwgPT0gaHVmZm1hbl9jb2Rlc1tqXS5jb2RlKQogICAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgaWYgKGogPCBrUnVuQ29kZXNTaXplKQpAQCAtMTI4NywxMTAgKzEyNjYsNTggQEAKICAgICB9CiAgICAgaW50MzJfdCBydW5jb2RlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaik7CiAgICAgaWYgKHJ1bmNvZGUgPCAzMikgewotICAgICAgU0JTWU1DT0RFUy5nZXQoKVtpXS5jb2RlbGVuID0gcnVuY29kZTsKKyAgICAgIFNCU1lNQ09ERVNbaV0uY29kZWxlbiA9IHJ1bmNvZGU7CiAgICAgICBydW4gPSAwOwogICAgIH0gZWxzZSBpZiAocnVuY29kZSA9PSAzMikgewogICAgICAgaWYgKHBTdHJlYW0tPnJlYWROQml0cygyLCAmblRlbXApICE9IDApCi0gICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICByZXR1cm4gc3RkOjp2ZWN0b3I8SkJpZzJIdWZmbWFuQ29kZT4oKTsKICAgICAgIHJ1biA9IG5UZW1wICsgMzsKICAgICB9IGVsc2UgaWYgKHJ1bmNvZGUgPT0gMzMpIHsKICAgICAgIGlmIChwU3RyZWFtLT5yZWFkTkJpdHMoMywgJm5UZW1wKSAhPSAwKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPEpCaWcySHVmZm1hbkNvZGU+KCk7CiAgICAgICBydW4gPSBuVGVtcCArIDM7CiAgICAgfSBlbHNlIGlmIChydW5jb2RlID09IDM0KSB7CiAgICAgICBpZiAocFN0cmVhbS0+cmVhZE5CaXRzKDcsICZuVGVtcCkgIT0gMCkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIHJldHVybiBzdGQ6OnZlY3RvcjxKQmlnMkh1ZmZtYW5Db2RlPigpOwogICAgICAgcnVuID0gblRlbXAgKyAxMTsKICAgICB9CiAgICAgaWYgKHJ1biA+IDApIHsKICAgICAgIGlmIChpICsgcnVuID4gKGludClTQk5VTVNZTVMpCi0gICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICByZXR1cm4gc3RkOjp2ZWN0b3I8SkJpZzJIdWZmbWFuQ29kZT4oKTsKICAgICAgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IHJ1bjsgKytrKSB7Ci0gICAgICAgIGlmIChydW5jb2RlID09IDMyICYmIGkgPiAwKSB7Ci0gICAgICAgICAgU0JTWU1DT0RFUy5nZXQoKVtpICsga10uY29kZWxlbiA9IFNCU1lNQ09ERVMuZ2V0KClbaSAtIDFdLmNvZGVsZW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgU0JTWU1DT0RFUy5nZXQoKVtpICsga10uY29kZWxlbiA9IDA7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKHJ1bmNvZGUgPT0gMzIgJiYgaSA+IDApCisgICAgICAgICAgU0JTWU1DT0RFU1tpICsga10uY29kZWxlbiA9IFNCU1lNQ09ERVNbaSAtIDFdLmNvZGVsZW47CisgICAgICAgIGVsc2UKKyAgICAgICAgICBTQlNZTUNPREVTW2kgKyBrXS5jb2RlbGVuID0gMDsKICAgICAgIH0KICAgICAgIGkgKz0gcnVuOwogICAgIH0gZWxzZSB7CiAgICAgICArK2k7CiAgICAgfQogICB9Ci0gIGh1ZmZtYW5fYXNzaWduX2NvZGUoU0JTWU1DT0RFUy5nZXQoKSwgU0JOVU1TWU1TKTsKLSAgcmV0dXJuIFNCU1lNQ09ERVMucmVsZWFzZSgpOwotfQotCi12b2lkIENKQmlnMl9Db250ZXh0OjpodWZmbWFuX2Fzc2lnbl9jb2RlKGludCogQ09ERVMsIGludCogUFJFRkxFTiwgaW50IE5URU1QKSB7Ci0gIC8vIFRPRE8odGhlc3RpZykgQ0pCaWcyX0h1ZmZtYW5UYWJsZTo6cGFyc2VGcm9tQ29kZWRCdWZmZXIoKSBoYXMgc2ltaWxhciBjb2RlLgotICBpbnQgQ1VSTEVOLCBMRU5NQVgsIENVUkNPREUsIENVUlRFTVAsIGk7Ci0gIGludCogTEVOQ09VTlQ7Ci0gIGludCogRklSU1RDT0RFOwotICBMRU5NQVggPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgTlRFTVA7ICsraSkgewotICAgIGlmIChQUkVGTEVOW2ldID4gTEVOTUFYKSB7Ci0gICAgICBMRU5NQVggPSBQUkVGTEVOW2ldOwotICAgIH0KLSAgfQotICBMRU5DT1VOVCA9IEZYX0FsbG9jKGludCwgTEVOTUFYICsgMSk7Ci0gIEpCSUcyX21lbXNldChMRU5DT1VOVCwgMCwgc2l6ZW9mKGludCkgKiAoTEVOTUFYICsgMSkpOwotICBGSVJTVENPREUgPSBGWF9BbGxvYyhpbnQsIExFTk1BWCArIDEpOwotICBmb3IgKGkgPSAwOyBpIDwgTlRFTVA7ICsraSkgewotICAgICsrTEVOQ09VTlRbUFJFRkxFTltpXV07Ci0gIH0KLSAgQ1VSTEVOID0gMTsKLSAgRklSU1RDT0RFWzBdID0gMDsKLSAgTEVOQ09VTlRbMF0gPSAwOwotICB3aGlsZSAoQ1VSTEVOIDw9IExFTk1BWCkgewotICAgIEZJUlNUQ09ERVtDVVJMRU5dID0gKEZJUlNUQ09ERVtDVVJMRU4gLSAxXSArIExFTkNPVU5UW0NVUkxFTiAtIDFdKSA8PCAxOwotICAgIENVUkNPREUgPSBGSVJTVENPREVbQ1VSTEVOXTsKLSAgICBDVVJURU1QID0gMDsKLSAgICB3aGlsZSAoQ1VSVEVNUCA8IE5URU1QKSB7Ci0gICAgICBpZiAoUFJFRkxFTltDVVJURU1QXSA9PSBDVVJMRU4pIHsKLSAgICAgICAgQ09ERVNbQ1VSVEVNUF0gPSBDVVJDT0RFOwotICAgICAgICBDVVJDT0RFID0gQ1VSQ09ERSArIDE7Ci0gICAgICB9Ci0gICAgICBDVVJURU1QID0gQ1VSVEVNUCArIDE7Ci0gICAgfQotICAgIENVUkxFTiA9IENVUkxFTiArIDE7Ci0gIH0KLSAgRlhfRnJlZShMRU5DT1VOVCk7Ci0gIEZYX0ZyZWUoRklSU1RDT0RFKTsKKyAgaHVmZm1hbl9hc3NpZ25fY29kZShTQlNZTUNPREVTLmRhdGEoKSwgU0JOVU1TWU1TKTsKKyAgcmV0dXJuIFNCU1lNQ09ERVM7CiB9CiAKIHZvaWQgQ0pCaWcyX0NvbnRleHQ6Omh1ZmZtYW5fYXNzaWduX2NvZGUoSkJpZzJIdWZmbWFuQ29kZSogU0JTWU1DT0RFUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE5URU1QKSB7Ci0gIGludCBDVVJMRU4sIExFTk1BWCwgQ1VSQ09ERSwgQ1VSVEVNUCwgaTsKLSAgaW50KiBMRU5DT1VOVDsKLSAgaW50KiBGSVJTVENPREU7Ci0gIExFTk1BWCA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBOVEVNUDsgKytpKSB7Ci0gICAgaWYgKFNCU1lNQ09ERVNbaV0uY29kZWxlbiA+IExFTk1BWCkgewotICAgICAgTEVOTUFYID0gU0JTWU1DT0RFU1tpXS5jb2RlbGVuOwotICAgIH0KLSAgfQotICBMRU5DT1VOVCA9IEZYX0FsbG9jKGludCwgKExFTk1BWCArIDEpKTsKLSAgSkJJRzJfbWVtc2V0KExFTkNPVU5ULCAwLCBzaXplb2YoaW50KSAqIChMRU5NQVggKyAxKSk7Ci0gIEZJUlNUQ09ERSA9IEZYX0FsbG9jKGludCwgKExFTk1BWCArIDEpKTsKLSAgZm9yIChpID0gMDsgaSA8IE5URU1QOyArK2kpIHsKKyAgLy8gVE9ETyh0aGVzdGlnKSBDSkJpZzJfSHVmZm1hblRhYmxlOjpwYXJzZUZyb21Db2RlZEJ1ZmZlcigpIGhhcyBzaW1pbGFyIGNvZGUuCisgIGludCBMRU5NQVggPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IE5URU1QOyArK2kpCisgICAgTEVOTUFYID0gc3RkOjptYXgoTEVOTUFYLCBTQlNZTUNPREVTW2ldLmNvZGVsZW4pOworICBzdGQ6OnZlY3RvcjxpbnQ+IExFTkNPVU5UKExFTk1BWCArIDEpOworICBzdGQ6OnZlY3RvcjxpbnQ+IEZJUlNUQ09ERShMRU5NQVggKyAxKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVEVNUDsgKytpKQogICAgICsrTEVOQ09VTlRbU0JTWU1DT0RFU1tpXS5jb2RlbGVuXTsKLSAgfQotICBDVVJMRU4gPSAxOwotICBGSVJTVENPREVbMF0gPSAwOwogICBMRU5DT1VOVFswXSA9IDA7Ci0gIHdoaWxlIChDVVJMRU4gPD0gTEVOTUFYKSB7CisgIGZvciAoaW50IENVUkxFTiA9IDE7IENVUkxFTiA8PSBMRU5NQVg7ICsrQ1VSTEVOKSB7CiAgICAgRklSU1RDT0RFW0NVUkxFTl0gPSAoRklSU1RDT0RFW0NVUkxFTiAtIDFdICsgTEVOQ09VTlRbQ1VSTEVOIC0gMV0pIDw8IDE7Ci0gICAgQ1VSQ09ERSA9IEZJUlNUQ09ERVtDVVJMRU5dOwotICAgIENVUlRFTVAgPSAwOwotICAgIHdoaWxlIChDVVJURU1QIDwgTlRFTVApIHsKKyAgICBpbnQgQ1VSQ09ERSA9IEZJUlNUQ09ERVtDVVJMRU5dOworICAgIGZvciAoaW50IENVUlRFTVAgPSAwOyBDVVJURU1QIDwgTlRFTVA7ICsrQ1VSVEVNUCkgewogICAgICAgaWYgKFNCU1lNQ09ERVNbQ1VSVEVNUF0uY29kZWxlbiA9PSBDVVJMRU4pIHsKICAgICAgICAgU0JTWU1DT0RFU1tDVVJURU1QXS5jb2RlID0gQ1VSQ09ERTsKICAgICAgICAgQ1VSQ09ERSA9IENVUkNPREUgKyAxOwogICAgICAgfQotICAgICAgQ1VSVEVNUCA9IENVUlRFTVAgKyAxOwogICAgIH0KLSAgICBDVVJMRU4gPSBDVVJMRU4gKyAxOwogICB9Ci0gIEZYX0ZyZWUoTEVOQ09VTlQpOwotICBGWF9GcmVlKEZJUlNUQ09ERSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfQ29udGV4dC5oIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0NvbnRleHQuaAppbmRleCBjZDQ0YTgyLi5mODZhYTJlIDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfQ29udGV4dC5oCisrKyBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9Db250ZXh0LmgKQEAgLTE2LDExICsxNiwxMiBAQAogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9meF9jb2RlY19kZWYuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfUGFnZS5oIgogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9TZWdtZW50LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCiAKIGNsYXNzIENKQmlnMl9Bcml0aERlY29kZXI7CiBjbGFzcyBDSkJpZzJfR1JEUHJvYzsKIGNsYXNzIENQREZfU3RyZWFtQWNjOwotY2xhc3MgSUZYX1BhdXNlOworY2xhc3MgSUZYX1BhdXNlSW5kaWNhdG9yOwogCiAvLyBDYWNoZSBpcyBrZXllZCBieSB0aGUgT2JqTnVtIG9mIGEgc3RyZWFtIGFuZCBhbiBpbmRleCB3aXRoaW4gdGhlIHN0cmVhbS4KIHVzaW5nIENKQmlnMl9DYWNoZUtleSA9IHN0ZDo6cGFpcjx1aW50MzJfdCwgdWludDMyX3Q+OwpAQCAtMzMsMTcgKzM0LDE0IEBACiAjZGVmaW5lIEpCSUcyX0VSUk9SX0ZBVEFMIC0zCiAjZGVmaW5lIEpCSUcyX0VORF9PRl9QQUdFIDIKICNkZWZpbmUgSkJJRzJfRU5EX09GX0ZJTEUgMwotI2RlZmluZSBKQklHMl9FUlJPUl9GSUxFX0ZPUk1BVCAtNAotI2RlZmluZSBKQklHMl9FUlJPUl9TVFJFQU1fVFlQRSAtNQogI2RlZmluZSBKQklHMl9FUlJPUl9MSU1JVCAtNgogI2RlZmluZSBKQklHMl9NSU5fU0VHTUVOVF9TSVpFIDExCiAKIGNsYXNzIENKQmlnMl9Db250ZXh0IHsKICBwdWJsaWM6Ci0gIENKQmlnMl9Db250ZXh0KENQREZfU3RyZWFtQWNjKiBwR2xvYmFsU3RyZWFtLAotICAgICAgICAgICAgICAgICBDUERGX1N0cmVhbUFjYyogcFNyY1N0cmVhbSwKKyAgQ0pCaWcyX0NvbnRleHQoY29uc3QgUmV0YWluUHRyPENQREZfU3RyZWFtQWNjPiYgcEdsb2JhbFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPENQREZfU3RyZWFtQWNjPiYgcFNyY1N0cmVhbSwKICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PENKQmlnMl9DYWNoZVBhaXI+KiBwU3ltYm9sRGljdENhY2hlLAotICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSwKICAgICAgICAgICAgICAgICAgYm9vbCBiSXNHbG9iYWwpOwogICB+Q0pCaWcyX0NvbnRleHQoKTsKIApAQCAtNTEsMTYgKzQ5LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpOworICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CiAKLSAgaW50MzJfdCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gIEZYQ09ERUNfU1RBVFVTIEdldFByb2Nlc3NpbmdTdGF0dXMoKSB7IHJldHVybiBtX1Byb2Nlc3NpbmdTdGF0dXM7IH0KKyAgaW50MzJfdCBDb250aW51ZShJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CisgIEZYQ09ERUNfU1RBVFVTIEdldFByb2Nlc3NpbmdTdGF0dXMoKSBjb25zdCB7IHJldHVybiBtX1Byb2Nlc3NpbmdTdGF0dXM7IH0KIAogIHByaXZhdGU6Ci0gIGludDMyX3QgZGVjb2RlX1NxdWVudGlhbE9yZ25hemF0aW9uKElGWF9QYXVzZSogcFBhdXNlKTsKLSAgaW50MzJfdCBkZWNvZGVfRW1iZWRPcmduYXphdGlvbihJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gIGludDMyX3QgZGVjb2RlX1JhbmRvbU9yZ25hemF0aW9uX0ZpcnN0UGFnZShJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gIGludDMyX3QgZGVjb2RlX1JhbmRvbU9yZ25hemF0aW9uKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgaW50MzJfdCBkZWNvZGVTZXF1ZW50aWFsKElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKTsKKyAgaW50MzJfdCBkZWNvZGVSYW5kb21GaXJzdFBhZ2UoSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpOworICBpbnQzMl90IGRlY29kZVJhbmRvbShJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CiAKICAgQ0pCaWcyX1NlZ21lbnQqIGZpbmRTZWdtZW50QnlOdW1iZXIodWludDMyX3QgZHdOdW1iZXIpOwogICBDSkJpZzJfU2VnbWVudCogZmluZFJlZmVycmVkU2VnbWVudEJ5VHlwZUFuZEluZGV4KENKQmlnMl9TZWdtZW50KiBwU2VnbWVudCwKQEAgLTY4LDIyICs2NSwyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4KTsKIAogICBpbnQzMl90IHBhcnNlU2VnbWVudEhlYWRlcihDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQpOwotICBpbnQzMl90IHBhcnNlU2VnbWVudERhdGEoQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50LCBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIGludDMyX3QgcGFyc2VTZWdtZW50RGF0YShDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CiAgIGludDMyX3QgUHJvY2Vzc2luZ1BhcnNlU2VnbWVudERhdGEoQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKTsKLSAgaW50MzJfdCBwYXJzZVN5bWJvbERpY3QoQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50LCBJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpOworICBpbnQzMl90IHBhcnNlU3ltYm9sRGljdChDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQpOwogICBpbnQzMl90IHBhcnNlVGV4dFJlZ2lvbihDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQpOwotICBpbnQzMl90IHBhcnNlUGF0dGVybkRpY3QoQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50LCBJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gIGludDMyX3QgcGFyc2VIYWxmdG9uZVJlZ2lvbihDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQsIElGWF9QYXVzZSogcFBhdXNlKTsKLSAgaW50MzJfdCBwYXJzZUdlbmVyaWNSZWdpb24oQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50LCBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIGludDMyX3QgcGFyc2VQYXR0ZXJuRGljdChDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CisgIGludDMyX3QgcGFyc2VIYWxmdG9uZVJlZ2lvbihDSkJpZzJfU2VnbWVudCogcFNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CisgIGludDMyX3QgcGFyc2VHZW5lcmljUmVnaW9uKENKQmlnMl9TZWdtZW50KiBwU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpOwogICBpbnQzMl90IHBhcnNlR2VuZXJpY1JlZmluZW1lbnRSZWdpb24oQ0pCaWcyX1NlZ21lbnQqIHBTZWdtZW50KTsKICAgaW50MzJfdCBwYXJzZVRhYmxlKENKQmlnMl9TZWdtZW50KiBwU2VnbWVudCk7CiAgIGludDMyX3QgcGFyc2VSZWdpb25JbmZvKEpCaWcyUmVnaW9uSW5mbyogcFJJKTsKIAotICBKQmlnMkh1ZmZtYW5Db2RlKiBkZWNvZGVTeW1ib2xJREh1ZmZtYW5UYWJsZShDSkJpZzJfQml0U3RyZWFtKiBwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTQk5VTVNZTVMpOworICBzdGQ6OnZlY3RvcjxKQmlnMkh1ZmZtYW5Db2RlPiBkZWNvZGVTeW1ib2xJREh1ZmZtYW5UYWJsZSgKKyAgICAgIENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sCisgICAgICB1aW50MzJfdCBTQk5VTVNZTVMpOwogCi0gIHZvaWQgaHVmZm1hbl9hc3NpZ25fY29kZShpbnQqIENPREVTLCBpbnQqIFBSRUZMRU4sIGludCBOVEVNUCk7CiAgIHZvaWQgaHVmZm1hbl9hc3NpZ25fY29kZShKQmlnMkh1ZmZtYW5Db2RlKiBTQlNZTUNPREVTLCBpbnQgTlRFTVApOwogCiAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfQ29udGV4dD4gbV9wR2xvYmFsQ29udGV4dDsKQEAgLTk1LDEzICs5NiwxMiBAQAogICBib29sIG1fYkluUGFnZTsKICAgYm9vbCBtX2JCdWZTcGVjaWZpZWQ7CiAgIGludDMyX3QgbV9QYXVzZVN0ZXA7Ci0gIElGWF9QYXVzZSogY29uc3QgbV9wUGF1c2U7CiAgIEZYQ09ERUNfU1RBVFVTIG1fUHJvY2Vzc2luZ1N0YXR1czsKICAgc3RkOjp2ZWN0b3I8SkJpZzJBcml0aEN0eD4gbV9nYkNvbnRleHQ7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfQXJpdGhEZWNvZGVyPiBtX3BBcml0aERlY29kZXI7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfR1JEUHJvYz4gbV9wR1JEOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX1NlZ21lbnQ+IG1fcFNlZ21lbnQ7Ci0gIHVpbnQzMl90IG1fZHdPZmZzZXQ7CisgIEZYX1NBRkVfVUlOVDMyIG1fZHdPZmZzZXQ7CiAgIEpCaWcyUmVnaW9uSW5mbyBtX3JpOwogICBzdGQ6Omxpc3Q8Q0pCaWcyX0NhY2hlUGFpcj4qIGNvbnN0IG1fcFN5bWJvbERpY3RDYWNoZTsKICAgYm9vbCBtX2JJc0dsb2JhbDsKZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9EZWZpbmUuaCBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9EZWZpbmUuaAppbmRleCA4NmRmMjQ4Li42ZmMzNDM0IDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfRGVmaW5lLmgKKysrIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0RlZmluZS5oCkBAIC05LDkgKzksOCBAQAogCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKIAotI2RlZmluZSBKQklHMl9tZW1zZXQgRlhTWVNfbWVtc2V0Ci0jZGVmaW5lIEpCSUcyX21lbWNtcCBGWFNZU19tZW1jbXAKLSNkZWZpbmUgSkJJRzJfbWVtY3B5IEZYU1lTX21lbWNweQorI2RlZmluZSBKQklHMl9tZW1zZXQgbWVtc2V0CisjZGVmaW5lIEpCSUcyX21lbWNweSBtZW1jcHkKICNkZWZpbmUgSkJJRzJfT09CIDEKIAogc3RydWN0IEpCaWcyUmVnaW9uSW5mbyB7CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3JkUHJvYy5jcHAgYi9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3JkUHJvYy5jcHAKaW5kZXggOGM2ZDU4ZS4uZTMwOGFlMyAxMDA2NDQKLS0tIGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0dyZFByb2MuY3BwCisrKyBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9HcmRQcm9jLmNwcApAQCAtNywxNiArNywxOCBAQAogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9HcmRQcm9jLmgiCiAKICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KIAogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9meF9jb2RlYy5oIgogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aERlY29kZXIuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfQml0U3RyZWFtLmgiCiAjaW5jbHVkZSAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9pZnhfcGF1c2VpbmRpY2F0b3IuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKIENKQmlnMl9HUkRQcm9jOjpDSkJpZzJfR1JEUHJvYygpCiAgICAgOiBtX2xvb3BJbmRleCgwKSwKICAgICAgIG1fcExpbmUobnVsbHB0ciksCi0gICAgICBtX3BQYXVzZShudWxscHRyKSwKICAgICAgIG1fRGVjb2RlVHlwZSgwKSwKICAgICAgIG1fTFRQKDApIHsKICAgbV9SZXBsYWNlUmVjdC5sZWZ0ID0gMDsKQEAgLTI1LDYgKzI3LDggQEAKICAgbV9SZXBsYWNlUmVjdC5yaWdodCA9IDA7CiB9CiAKK0NKQmlnMl9HUkRQcm9jOjp+Q0pCaWcyX0dSRFByb2MoKSB7fQorCiBib29sIENKQmlnMl9HUkRQcm9jOjpVc2VUZW1wbGF0ZTBPcHQzKCkgY29uc3QgewogICByZXR1cm4gKEdCQVRbMF0gPT0gMykgJiYgKEdCQVRbMV0gPT0gLTEpICYmIChHQkFUWzJdID09IC0zKSAmJgogICAgICAgICAgKEdCQVRbM10gPT0gLTEpICYmIChHQkFUWzRdID09IDIpICYmIChHQkFUWzVdID09IC0yKSAmJgpAQCAtMzksMTAgKzQzLDEzIEBACiAgIHJldHVybiAoR0JBVFswXSA9PSAyKSAmJiAoR0JBVFsxXSA9PSAtMSk7CiB9CiAKLUNKQmlnMl9JbWFnZSogQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aChDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCkgewotICBpZiAoR0JXID09IDAgfHwgR0JIID09IDApCi0gICAgcmV0dXJuIG5ldyBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpOworc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aCgKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCkgeworICBpZiAoR0JXID09IDAgfHwgR0JXID4gSkJJRzJfTUFYX0lNQUdFX1NJWkUgfHwgR0JIID09IDAgfHwKKyAgICAgIEdCSCA+IEpCSUcyX01BWF9JTUFHRV9TSVpFKSB7CisgICAgcmV0dXJuIHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSW1hZ2U+KEdCVywgR0JIKTsKKyAgfQogCiAgIGlmIChHQlRFTVBMQVRFID09IDApIHsKICAgICBpZiAoVXNlVGVtcGxhdGUwT3B0MygpKQpAQCAtNjIsMjMgKzY5LDI4IEBACiAgICAgcmV0dXJuIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfdW5vcHQocEFyaXRoRGVjb2RlciwgZ2JDb250ZXh0KTsKICAgfQogfQotQ0pCaWcyX0ltYWdlKiBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF9vcHQzKAorCitzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF9vcHQzKAogICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCiAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0KSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IEdCUkVHKG5ldyBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKLSAgaWYgKCFHQlJFRy0+bV9wRGF0YSkKKyAgYXV0byBHQlJFRyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSW1hZ2U+KEdCVywgR0JIKTsKKyAgaWYgKCFHQlJFRy0+ZGF0YSgpKQogICAgIHJldHVybiBudWxscHRyOwogCiAgIGludCBMVFAgPSAwOwotICB1aW50OF90KiBwTGluZSA9IEdCUkVHLT5tX3BEYXRhOworICB1aW50OF90KiBwTGluZSA9IEdCUkVHLT5kYXRhKCk7CiAgIGludDMyX3QgblN0cmlkZSA9IEdCUkVHLT5zdHJpZGUoKTsKICAgaW50MzJfdCBuU3RyaWRlMiA9IG5TdHJpZGUgPDwgMTsKICAgaW50MzJfdCBuTGluZUJ5dGVzID0gKChHQlcgKyA3KSA+PiAzKSAtIDE7CiAgIGludDMyX3QgbkJpdHNMZWZ0ID0gR0JXIC0gKG5MaW5lQnl0ZXMgPDwgMyk7CiAgIHVpbnQzMl90IGhlaWdodCA9IEdCSCAmIDB4N2ZmZmZmZmY7CiAgIGZvciAodWludDMyX3QgaCA9IDA7IGggPCBoZWlnaHQ7IGgrKykgewotICAgIGlmIChUUEdET04pCisgICAgaWYgKFRQR0RPTikgeworICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKICAgICAgIExUUCA9IExUUCBeIHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4OWIyNV0pOworICAgIH0KICAgICBpZiAoTFRQKSB7CiAgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOwogICAgIH0gZWxzZSB7CkBAIC05Myw2ICsxMDUsOSBAQAogICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7CiAgICAgICAgICAgdWludDhfdCBjVmFsID0gMDsKICAgICAgICAgICBmb3IgKGludDMyX3QgayA9IDc7IGsgPj0gMDsgay0tKSB7CisgICAgICAgICAgICBpZiAocEFyaXRoRGVjb2Rlci0+SXNDb21wbGV0ZSgpKQorICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKwogICAgICAgICAgICAgaW50IGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKICAgICAgICAgICAgIENPTlRFWFQgPSAoKChDT05URVhUICYgMHg3YmY3KSA8PCAxKSB8IGJWYWwgfApAQCAtMTA0LDYgKzExOSw5IEBACiAgICAgICAgIGxpbmUyIDw8PSA4OwogICAgICAgICB1aW50OF90IGNWYWwxID0gMDsKICAgICAgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKKyAgICAgICAgICBpZiAocEFyaXRoRGVjb2Rlci0+SXNDb21wbGV0ZSgpKQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKICAgICAgICAgICBpbnQgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKICAgICAgICAgICBjVmFsMSB8PSBiVmFsIDw8ICg3IC0gayk7CiAgICAgICAgICAgQ09OVEVYVCA9CkBAIC0xMjEsNiArMTM5LDkgQEAKICAgICAgICAgICB9CiAgICAgICAgICAgdWludDhfdCBjVmFsID0gMDsKICAgICAgICAgICBmb3IgKGludDMyX3QgayA9IDc7IGsgPj0gMDsgay0tKSB7CisgICAgICAgICAgICBpZiAocEFyaXRoRGVjb2Rlci0+SXNDb21wbGV0ZSgpKQorICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKwogICAgICAgICAgICAgaW50IGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKICAgICAgICAgICAgIENPTlRFWFQgPQpAQCAtMTMxLDYgKzE1Miw5IEBACiAgICAgICAgIGxpbmUyIDw8PSA4OwogICAgICAgICB1aW50OF90IGNWYWwxID0gMDsKICAgICAgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKKyAgICAgICAgICBpZiAocEFyaXRoRGVjb2Rlci0+SXNDb21wbGV0ZSgpKQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKICAgICAgICAgICBpbnQgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKICAgICAgICAgICBjVmFsMSB8PSBiVmFsIDw8ICg3IC0gayk7CiAgICAgICAgICAgQ09OVEVYVCA9ICgoKENPTlRFWFQgJiAweDdiZjcpIDw8IDEpIHwgYlZhbCB8CkBAIC0xNDEsMTggKzE2NSwyMiBAQAogICAgIH0KICAgICBwTGluZSArPSBuU3RyaWRlOwogICB9Ci0gIHJldHVybiBHQlJFRy5yZWxlYXNlKCk7CisgIHJldHVybiBHQlJFRzsKIH0KIAotQ0pCaWcyX0ltYWdlKiBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF91bm9wdCgKK3N0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX3Vub3B0KAogICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCiAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0KSB7CiAgIGludCBMVFAgPSAwOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBHQlJFRyhuZXcgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7CisgIGF1dG8gR0JSRUcgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0ltYWdlPihHQlcsIEdCSCk7CiAgIEdCUkVHLT5maWxsKDApOwogICBmb3IgKHVpbnQzMl90IGggPSAwOyBoIDwgR0JIOyBoKyspIHsKLSAgICBpZiAoVFBHRE9OKQorICAgIGlmIChUUEdET04pIHsKKyAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworCiAgICAgICBMVFAgPSBMVFAgXiBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDliMjVdKTsKKyAgICB9CiAgICAgaWYgKExUUCkgewogICAgICAgR0JSRUctPmNvcHlMaW5lKGgsIGggLSAxKTsKICAgICB9IGVsc2UgewpAQCAtMTc0LDYgKzIwMiw5IEBACiAgICAgICAgICAgQ09OVEVYVCB8PSBHQlJFRy0+Z2V0UGl4ZWwodyArIEdCQVRbNF0sIGggKyBHQkFUWzVdKSA8PCAxMTsKICAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDEyOwogICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzZdLCBoICsgR0JBVFs3XSkgPDwgMTU7CisgICAgICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworCiAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYlZhbCkgewpAQCAtMTg1LDI1ICsyMTYsMjkgQEAKICAgICAgIH0KICAgICB9CiAgIH0KLSAgcmV0dXJuIEdCUkVHLnJlbGVhc2UoKTsKKyAgcmV0dXJuIEdCUkVHOwogfQogCi1DSkJpZzJfSW1hZ2UqIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX29wdDMoCitzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV9vcHQzKAogICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCiAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0KSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IEdCUkVHKG5ldyBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKLSAgaWYgKCFHQlJFRy0+bV9wRGF0YSkKKyAgYXV0byBHQlJFRyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSW1hZ2U+KEdCVywgR0JIKTsKKyAgaWYgKCFHQlJFRy0+ZGF0YSgpKQogICAgIHJldHVybiBudWxscHRyOwogCiAgIGludCBMVFAgPSAwOwotICB1aW50OF90KiBwTGluZSA9IEdCUkVHLT5tX3BEYXRhOworICB1aW50OF90KiBwTGluZSA9IEdCUkVHLT5kYXRhKCk7CiAgIGludDMyX3QgblN0cmlkZSA9IEdCUkVHLT5zdHJpZGUoKTsKICAgaW50MzJfdCBuU3RyaWRlMiA9IG5TdHJpZGUgPDwgMTsKICAgaW50MzJfdCBuTGluZUJ5dGVzID0gKChHQlcgKyA3KSA+PiAzKSAtIDE7CiAgIGludDMyX3QgbkJpdHNMZWZ0ID0gR0JXIC0gKG5MaW5lQnl0ZXMgPDwgMyk7CiAgIGZvciAodWludDMyX3QgaCA9IDA7IGggPCBHQkg7IGgrKykgewotICAgIGlmIChUUEdET04pCisgICAgaWYgKFRQR0RPTikgeworICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKICAgICAgIExUUCA9IExUUCBeIHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDc5NV0pOworICAgIH0KICAgICBpZiAoTFRQKSB7CiAgICAgICBHQlJFRy0+Y29weUxpbmUoaCwgaCAtIDEpOwogICAgIH0gZWxzZSB7CkBAIC0yMTgsNiArMjUzLDkgQEAKICAgICAgICAgICBsaW5lMiA9IChsaW5lMiA8PCA4KSB8ICgqcExpbmUyKyspOwogICAgICAgICAgIHVpbnQ4X3QgY1ZhbCA9IDA7CiAgICAgICAgICAgZm9yIChpbnQzMl90IGsgPSA3OyBrID49IDA7IGstLSkgeworICAgICAgICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKICAgICAgICAgICAgIGludCBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwogICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7CiAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwZWZiKSA8PCAxKSB8IGJWYWwgfApAQCAtMjI5LDYgKzI2Nyw5IEBACiAgICAgICAgIGxpbmUyIDw8PSA4OwogICAgICAgICB1aW50OF90IGNWYWwxID0gMDsKICAgICAgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKKyAgICAgICAgICBpZiAocEFyaXRoRGVjb2Rlci0+SXNDb21wbGV0ZSgpKQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKICAgICAgICAgICBpbnQgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKICAgICAgICAgICBjVmFsMSB8PSBiVmFsIDw8ICg3IC0gayk7CiAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MGVmYikgPDwgMSkgfCBiVmFsIHwKQEAgLTI0Niw2ICsyODcsOSBAQAogICAgICAgICAgIH0KICAgICAgICAgICB1aW50OF90IGNWYWwgPSAwOwogICAgICAgICAgIGZvciAoaW50MzJfdCBrID0gNzsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworCiAgICAgICAgICAgICBpbnQgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOwogICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MGVmYikgPDwgMSkgfCBiVmFsIHwKQEAgLTI1Niw2ICszMDAsOSBAQAogICAgICAgICBsaW5lMiA8PD0gODsKICAgICAgICAgdWludDhfdCBjVmFsMSA9IDA7CiAgICAgICAgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7CisgICAgICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworCiAgICAgICAgICAgaW50IGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgICAgY1ZhbDEgfD0gYlZhbCA8PCAoNyAtIGspOwogICAgICAgICAgIENPTlRFWFQgPQpAQCAtMjY2LDE4ICszMTMsMjIgQEAKICAgICB9CiAgICAgcExpbmUgKz0gblN0cmlkZTsKICAgfQotICByZXR1cm4gR0JSRUcucmVsZWFzZSgpOworICByZXR1cm4gR0JSRUc7CiB9CiAKLUNKQmlnMl9JbWFnZSogQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfdW5vcHQoCitzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV91bm9wdCgKICAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAogICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCkgewogICBpbnQgTFRQID0gMDsKLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gR0JSRUcobmV3IENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOworICBhdXRvIEdCUkVHID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9JbWFnZT4oR0JXLCBHQkgpOwogICBHQlJFRy0+ZmlsbCgwKTsKICAgZm9yICh1aW50MzJfdCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7Ci0gICAgaWYgKFRQR0RPTikKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBpZiAocEFyaXRoRGVjb2Rlci0+SXNDb21wbGV0ZSgpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKwogICAgICAgTFRQID0gTFRQIF4gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwNzk1XSk7CisgICAgfQogICAgIGlmIChMVFApIHsKICAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7CiAgICAgfSBlbHNlIHsKQEAgLTI5Nyw2ICszNDgsOSBAQAogICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBoICsgR0JBVFsxXSkgPDwgMzsKICAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDQ7CiAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA5OworICAgICAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKwogICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJWYWwpIHsKQEAgLTMwOCwyNSArMzYyLDI5IEBACiAgICAgICB9CiAgICAgfQogICB9Ci0gIHJldHVybiBHQlJFRy5yZWxlYXNlKCk7CisgIHJldHVybiBHQlJFRzsKIH0KIAotQ0pCaWcyX0ltYWdlKiBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl9vcHQzKAorc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfb3B0MygKICAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAogICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCkgewotICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBHQlJFRyhuZXcgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7Ci0gIGlmICghR0JSRUctPm1fcERhdGEpCisgIGF1dG8gR0JSRUcgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0ltYWdlPihHQlcsIEdCSCk7CisgIGlmICghR0JSRUctPmRhdGEoKSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAogICBpbnQgTFRQID0gMDsKLSAgdWludDhfdCogcExpbmUgPSBHQlJFRy0+bV9wRGF0YTsKKyAgdWludDhfdCogcExpbmUgPSBHQlJFRy0+ZGF0YSgpOwogICBpbnQzMl90IG5TdHJpZGUgPSBHQlJFRy0+c3RyaWRlKCk7CiAgIGludDMyX3QgblN0cmlkZTIgPSBuU3RyaWRlIDw8IDE7CiAgIGludDMyX3QgbkxpbmVCeXRlcyA9ICgoR0JXICsgNykgPj4gMykgLSAxOwogICBpbnQzMl90IG5CaXRzTGVmdCA9IEdCVyAtIChuTGluZUJ5dGVzIDw8IDMpOwogICBmb3IgKHVpbnQzMl90IGggPSAwOyBoIDwgR0JIOyBoKyspIHsKLSAgICBpZiAoVFBHRE9OKQorICAgIGlmIChUUEdET04pIHsKKyAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworCiAgICAgICBMVFAgPSBMVFAgXiBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDAwZTVdKTsKKyAgICB9CiAgICAgaWYgKExUUCkgewogICAgICAgR0JSRUctPmNvcHlMaW5lKGgsIGggLSAxKTsKICAgICB9IGVsc2UgewpAQCAtMzQxLDYgKzM5OSw5IEBACiAgICAgICAgICAgbGluZTIgPSAobGluZTIgPDwgOCkgfCAoKnBMaW5lMisrKTsKICAgICAgICAgICB1aW50OF90IGNWYWwgPSAwOwogICAgICAgICAgIGZvciAoaW50MzJfdCBrID0gNzsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworCiAgICAgICAgICAgICBpbnQgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOwogICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFiZCkgPDwgMSkgfCBiVmFsIHwKQEAgLTM1Miw2ICs0MTMsOSBAQAogICAgICAgICBsaW5lMiA8PD0gODsKICAgICAgICAgdWludDhfdCBjVmFsMSA9IDA7CiAgICAgICAgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7CisgICAgICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworCiAgICAgICAgICAgaW50IGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgICAgY1ZhbDEgfD0gYlZhbCA8PCAoNyAtIGspOwogICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxYmQpIDw8IDEpIHwgYlZhbCB8CkBAIC0zNjksNiArNDMzLDkgQEAKICAgICAgICAgICB9CiAgICAgICAgICAgdWludDhfdCBjVmFsID0gMDsKICAgICAgICAgICBmb3IgKGludDMyX3QgayA9IDc7IGsgPj0gMDsgay0tKSB7CisgICAgICAgICAgICBpZiAocEFyaXRoRGVjb2Rlci0+SXNDb21wbGV0ZSgpKQorICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKwogICAgICAgICAgICAgaW50IGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxYmQpIDw8IDEpIHwgYlZhbCB8CkBAIC0zNzksNiArNDQ2LDkgQEAKICAgICAgICAgbGluZTIgPDw9IDg7CiAgICAgICAgIHVpbnQ4X3QgY1ZhbDEgPSAwOwogICAgICAgICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgeworICAgICAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKwogICAgICAgICAgIGludCBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwogICAgICAgICAgIGNWYWwxIHw9IGJWYWwgPDwgKDcgLSBrKTsKICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWJkKSA8PCAxKSB8IGJWYWwgfApAQCAtMzg5LDE4ICs0NTksMjIgQEAKICAgICB9CiAgICAgcExpbmUgKz0gblN0cmlkZTsKICAgfQotICByZXR1cm4gR0JSRUcucmVsZWFzZSgpOworICByZXR1cm4gR0JSRUc7CiB9CiAKLUNKQmlnMl9JbWFnZSogQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfdW5vcHQoCitzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl91bm9wdCgKICAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAogICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCkgewogICBpbnQgTFRQID0gMDsKLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gR0JSRUcobmV3IENKQmlnMl9JbWFnZShHQlcsIEdCSCkpOworICBhdXRvIEdCUkVHID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9JbWFnZT4oR0JXLCBHQkgpOwogICBHQlJFRy0+ZmlsbCgwKTsKICAgZm9yICh1aW50MzJfdCBoID0gMDsgaCA8IEdCSDsgaCsrKSB7Ci0gICAgaWYgKFRQR0RPTikKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBpZiAocEFyaXRoRGVjb2Rlci0+SXNDb21wbGV0ZSgpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKwogICAgICAgTFRQID0gTFRQIF4gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwMGU1XSk7CisgICAgfQogICAgIGlmIChMVFApIHsKICAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7CiAgICAgfSBlbHNlIHsKQEAgLTQxOCw2ICs0OTIsOSBAQAogICAgICAgICAgIENPTlRFWFQgfD0gR0JSRUctPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBoICsgR0JBVFsxXSkgPDwgMjsKICAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDM7CiAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA3OworICAgICAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKwogICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJWYWwpIHsKQEAgLTQyOSwyNCArNTA2LDMwIEBACiAgICAgICB9CiAgICAgfQogICB9Ci0gIHJldHVybiBHQlJFRy5yZWxlYXNlKCk7CisgIHJldHVybiBHQlJFRzsKIH0KIAotQ0pCaWcyX0ltYWdlKiBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoX1RlbXBsYXRlM19vcHQzKAorc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfb3B0MygKICAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAogICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCkgewotICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBHQlJFRyhuZXcgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKSk7Ci0gIGlmICghR0JSRUctPm1fcERhdGEpCisgIGF1dG8gR0JSRUcgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0ltYWdlPihHQlcsIEdCSCk7CisgIGlmICghR0JSRUctPmRhdGEoKSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAogICBpbnQgTFRQID0gMDsKLSAgdWludDhfdCogcExpbmUgPSBHQlJFRy0+bV9wRGF0YTsKKyAgdWludDhfdCogcExpbmUgPSBHQlJFRy0+ZGF0YSgpOwogICBpbnQzMl90IG5TdHJpZGUgPSBHQlJFRy0+c3RyaWRlKCk7CiAgIGludDMyX3QgbkxpbmVCeXRlcyA9ICgoR0JXICsgNykgPj4gMykgLSAxOwogICBpbnQzMl90IG5CaXRzTGVmdCA9IEdCVyAtIChuTGluZUJ5dGVzIDw8IDMpOworCiAgIGZvciAodWludDMyX3QgaCA9IDA7IGggPCBHQkg7IGgrKykgewotICAgIGlmIChUUEdET04pCisgICAgaWYgKFRQR0RPTikgeworICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKICAgICAgIExUUCA9IExUUCBeIHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDE5NV0pOworICAgIH0KKwogICAgIGlmIChMVFApIHsKICAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7CiAgICAgfSBlbHNlIHsKQEAgLTQ1OCw2ICs1NDEsOSBAQAogICAgICAgICAgIGxpbmUxID0gKGxpbmUxIDw8IDgpIHwgKCpwTGluZTErKyk7CiAgICAgICAgICAgdWludDhfdCBjVmFsID0gMDsKICAgICAgICAgICBmb3IgKGludDMyX3QgayA9IDc7IGsgPj0gMDsgay0tKSB7CisgICAgICAgICAgICBpZiAocEFyaXRoRGVjb2Rlci0+SXNDb21wbGV0ZSgpKQorICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKwogICAgICAgICAgICAgaW50IGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxZjcpIDw8IDEpIHwgYlZhbCB8CkBAIC00NjgsNiArNTU0LDkgQEAKICAgICAgICAgbGluZTEgPDw9IDg7CiAgICAgICAgIHVpbnQ4X3QgY1ZhbDEgPSAwOwogICAgICAgICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgeworICAgICAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKwogICAgICAgICAgIGludCBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwogICAgICAgICAgIGNWYWwxIHw9IGJWYWwgPDwgKDcgLSBrKTsKICAgICAgICAgICBDT05URVhUID0KQEAgLTQ3OSw2ICs1NjgsOSBAQAogICAgICAgICBmb3IgKGludDMyX3QgY2MgPSAwOyBjYyA8IG5MaW5lQnl0ZXM7IGNjKyspIHsKICAgICAgICAgICB1aW50OF90IGNWYWwgPSAwOwogICAgICAgICAgIGZvciAoaW50MzJfdCBrID0gNzsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworCiAgICAgICAgICAgICBpbnQgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOwogICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFmNykgPDwgMSkgfCBiVmFsOwpAQCAtNDg3LDYgKzU3OSw5IEBACiAgICAgICAgIH0KICAgICAgICAgdWludDhfdCBjVmFsMSA9IDA7CiAgICAgICAgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7CisgICAgICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworCiAgICAgICAgICAgaW50IGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgICAgY1ZhbDEgfD0gYlZhbCA8PCAoNyAtIGspOwogICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxZjcpIDw8IDEpIHwgYlZhbDsKQEAgLTQ5NiwxOCArNTkxLDIyIEBACiAgICAgfQogICAgIHBMaW5lICs9IG5TdHJpZGU7CiAgIH0KLSAgcmV0dXJuIEdCUkVHLnJlbGVhc2UoKTsKKyAgcmV0dXJuIEdCUkVHOwogfQogCi1DSkJpZzJfSW1hZ2UqIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX3Vub3B0KAorc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gQ0pCaWcyX0dSRFByb2M6OmRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfdW5vcHQoCiAgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpIHsKICAgaW50IExUUCA9IDA7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IEdCUkVHKG5ldyBDSkJpZzJfSW1hZ2UoR0JXLCBHQkgpKTsKKyAgYXV0byBHQlJFRyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSW1hZ2U+KEdCVywgR0JIKTsKICAgR0JSRUctPmZpbGwoMCk7CiAgIGZvciAodWludDMyX3QgaCA9IDA7IGggPCBHQkg7IGgrKykgewotICAgIGlmIChUUEdET04pCisgICAgaWYgKFRQR0RPTikgeworICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKICAgICAgIExUUCA9IExUUCBeIHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDE5NV0pOworICAgIH0KICAgICBpZiAoTFRQID09IDEpIHsKICAgICAgIEdCUkVHLT5jb3B5TGluZShoLCBoIC0gMSk7CiAgICAgfSBlbHNlIHsKQEAgLTUyMiw2ICs2MjEsOSBAQAogICAgICAgICAgIHVpbnQzMl90IENPTlRFWFQgPSBsaW5lMjsKICAgICAgICAgICBDT05URVhUIHw9IEdCUkVHLT5nZXRQaXhlbCh3ICsgR0JBVFswXSwgaCArIEdCQVRbMV0pIDw8IDQ7CiAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA1OworICAgICAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKwogICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJWYWwpIHsKQEAgLTUzMiwxMDggKzYzNCwxMDggQEAKICAgICAgIH0KICAgICB9CiAgIH0KLSAgcmV0dXJuIEdCUkVHLnJlbGVhc2UoKTsKKyAgcmV0dXJuIEdCUkVHOwogfQogCiBGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6U3RhcnRfZGVjb2RlX0FyaXRoKAotICAgIENKQmlnMl9JbWFnZSoqIHBJbWFnZSwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiogcEltYWdlLAogICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCiAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAotICAgIElGWF9QYXVzZSogcFBhdXNlKSB7Ci0gIGlmIChHQlcgPT0gMCB8fCBHQkggPT0gMCkgeworICAgIElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKSB7CisgIGlmIChHQlcgPT0gMCB8fCBHQlcgPiBKQklHMl9NQVhfSU1BR0VfU0laRSB8fCBHQkggPT0gMCB8fAorICAgICAgR0JIID4gSkJJRzJfTUFYX0lNQUdFX1NJWkUpIHsKICAgICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfREVDT0RFX0ZJTklTSDsKICAgfQogICBtX1Byb3NzaXZlU3RhdHVzID0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1JFQURZOwotICBtX3BQYXVzZSA9IHBQYXVzZTsKICAgaWYgKCEqcEltYWdlKQotICAgICpwSW1hZ2UgPSBuZXcgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKTsKLSAgaWYgKCEoKnBJbWFnZSktPm1fcERhdGEpIHsKLSAgICBkZWxldGUgKnBJbWFnZTsKKyAgICAqcEltYWdlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9JbWFnZT4oR0JXLCBHQkgpOworICBpZiAoISgqcEltYWdlKS0+ZGF0YSgpKSB7CiAgICAgKnBJbWFnZSA9IG51bGxwdHI7CiAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOwogICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsKICAgfQogICBtX0RlY29kZVR5cGUgPSAxOwotICBtX3BJbWFnZSA9IHBJbWFnZTsKLSAgKCptX3BJbWFnZSktPmZpbGwoMCk7Ci0gIG1fcEFyaXRoRGVjb2RlciA9IHBBcml0aERlY29kZXI7CisgIG1fcEltYWdlID0gcEltYWdlLT5nZXQoKTsKKyAgbV9wSW1hZ2UtPmZpbGwoMCk7CiAgIG1fZ2JDb250ZXh0ID0gZ2JDb250ZXh0OwogICBtX0xUUCA9IDA7CiAgIG1fcExpbmUgPSBudWxscHRyOwogICBtX2xvb3BJbmRleCA9IDA7Ci0gIHJldHVybiBkZWNvZGVfQXJpdGgocFBhdXNlKTsKKyAgcmV0dXJuIGRlY29kZV9Bcml0aChwUGF1c2UsIHBBcml0aERlY29kZXIpOwogfQogCi1GWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoKElGWF9QYXVzZSogcFBhdXNlKSB7CitGWENPREVDX1NUQVRVUyBDSkJpZzJfR1JEUHJvYzo6ZGVjb2RlX0FyaXRoKAorICAgIElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlLAorICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIpIHsKICAgaW50IGlsaW5lID0gbV9sb29wSW5kZXg7Ci0gIENKQmlnMl9JbWFnZSogcEltYWdlID0gKm1fcEltYWdlOwogICBpZiAoR0JURU1QTEFURSA9PSAwKSB7CiAgICAgaWYgKFVzZVRlbXBsYXRlME9wdDMoKSkgewotICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IGRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfb3B0MyhwSW1hZ2UsIG1fcEFyaXRoRGVjb2RlciwKKyAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX29wdDMobV9wSW1hZ2UsIHBBcml0aERlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZ2JDb250ZXh0LCBwUGF1c2UpOwogICAgIH0gZWxzZSB7Ci0gICAgICBtX1Byb3NzaXZlU3RhdHVzID0gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF91bm9wdChwSW1hZ2UsIG1fcEFyaXRoRGVjb2RlciwKKyAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX3Vub3B0KG1fcEltYWdlLCBwQXJpdGhEZWNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9nYkNvbnRleHQsIHBQYXVzZSk7CiAgICAgfQogICB9IGVsc2UgaWYgKEdCVEVNUExBVEUgPT0gMSkgewogICAgIGlmIChVc2VUZW1wbGF0ZTFPcHQzKCkpIHsKLSAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBkZWNvZGVfQXJpdGhfVGVtcGxhdGUxX29wdDMocEltYWdlLCBtX3BBcml0aERlY29kZXIsCisgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV9vcHQzKG1fcEltYWdlLCBwQXJpdGhEZWNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2diQ29udGV4dCwgcFBhdXNlKTsKICAgICB9IGVsc2UgewotICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IGRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfdW5vcHQocEltYWdlLCBtX3BBcml0aERlY29kZXIsCisgICAgICBtX1Byb3NzaXZlU3RhdHVzID0gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV91bm9wdChtX3BJbWFnZSwgcEFyaXRoRGVjb2RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZ2JDb250ZXh0LCBwUGF1c2UpOwogICAgIH0KICAgfSBlbHNlIGlmIChHQlRFTVBMQVRFID09IDIpIHsKICAgICBpZiAoVXNlVGVtcGxhdGUyM09wdDMoKSkgewotICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IGRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfb3B0MyhwSW1hZ2UsIG1fcEFyaXRoRGVjb2RlciwKKyAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX29wdDMobV9wSW1hZ2UsIHBBcml0aERlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZ2JDb250ZXh0LCBwUGF1c2UpOwogICAgIH0gZWxzZSB7Ci0gICAgICBtX1Byb3NzaXZlU3RhdHVzID0gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl91bm9wdChwSW1hZ2UsIG1fcEFyaXRoRGVjb2RlciwKKyAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBkZWNvZGVfQXJpdGhfVGVtcGxhdGUyX3Vub3B0KG1fcEltYWdlLCBwQXJpdGhEZWNvZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9nYkNvbnRleHQsIHBQYXVzZSk7CiAgICAgfQogICB9IGVsc2UgewogICAgIGlmIChVc2VUZW1wbGF0ZTIzT3B0MygpKSB7Ci0gICAgICBtX1Byb3NzaXZlU3RhdHVzID0gZGVjb2RlX0FyaXRoX1RlbXBsYXRlM19vcHQzKHBJbWFnZSwgbV9wQXJpdGhEZWNvZGVyLAorICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IGRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfb3B0MyhtX3BJbWFnZSwgcEFyaXRoRGVjb2RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9nYkNvbnRleHQsIHBQYXVzZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBkZWNvZGVfQXJpdGhfVGVtcGxhdGUzX3Vub3B0KHBJbWFnZSwgbV9wQXJpdGhEZWNvZGVyLAorICAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IGRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfdW5vcHQobV9wSW1hZ2UsIHBBcml0aERlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2diQ29udGV4dCwgcFBhdXNlKTsKICAgICB9CiAgIH0KICAgbV9SZXBsYWNlUmVjdC5sZWZ0ID0gMDsKLSAgbV9SZXBsYWNlUmVjdC5yaWdodCA9IHBJbWFnZS0+d2lkdGgoKTsKKyAgbV9SZXBsYWNlUmVjdC5yaWdodCA9IG1fcEltYWdlLT53aWR0aCgpOwogICBtX1JlcGxhY2VSZWN0LnRvcCA9IGlsaW5lOwogICBtX1JlcGxhY2VSZWN0LmJvdHRvbSA9IG1fbG9vcEluZGV4OwotICBpZiAobV9Qcm9zc2l2ZVN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfRklOSVNIKSB7CisgIGlmIChtX1Byb3NzaXZlU3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0gpCiAgICAgbV9sb29wSW5kZXggPSAwOwotICB9CisKICAgcmV0dXJuIG1fUHJvc3NpdmVTdGF0dXM7CiB9CiAKLUZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpTdGFydF9kZWNvZGVfTU1SKENKQmlnMl9JbWFnZSoqIHBJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OlN0YXJ0X2RlY29kZV9NTVIoCisgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4qIHBJbWFnZSwKKyAgICBDSkJpZzJfQml0U3RyZWFtKiBwU3RyZWFtKSB7CiAgIGludCBiaXRwb3MsIGk7Ci0gICpwSW1hZ2UgPSBuZXcgQ0pCaWcyX0ltYWdlKEdCVywgR0JIKTsKLSAgaWYgKCEoKnBJbWFnZSktPm1fcERhdGEpIHsKLSAgICBkZWxldGUgKCpwSW1hZ2UpOwotICAgICgqcEltYWdlKSA9IG51bGxwdHI7CisgIGF1dG8gaW1hZ2UgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0ltYWdlPihHQlcsIEdCSCk7CisgIGlmICghaW1hZ2UtPmRhdGEoKSkgeworICAgICpwSW1hZ2UgPSBudWxscHRyOwogICAgIG1fUHJvc3NpdmVTdGF0dXMgPSBGWENPREVDX1NUQVRVU19FUlJPUjsKICAgICByZXR1cm4gbV9Qcm9zc2l2ZVN0YXR1czsKICAgfQotICBiaXRwb3MgPSAoaW50KXBTdHJlYW0tPmdldEJpdFBvcygpOwotICBGYXhHNERlY29kZShwU3RyZWFtLT5nZXRCdWYoKSwgcFN0cmVhbS0+Z2V0TGVuZ3RoKCksICZiaXRwb3MsCi0gICAgICAgICAgICAgICgqcEltYWdlKS0+bV9wRGF0YSwgR0JXLCBHQkgsICgqcEltYWdlKS0+c3RyaWRlKCkpOworICBiaXRwb3MgPSBzdGF0aWNfY2FzdDxpbnQ+KHBTdHJlYW0tPmdldEJpdFBvcygpKTsKKyAgRmF4RzREZWNvZGUocFN0cmVhbS0+Z2V0QnVmKCksIHBTdHJlYW0tPmdldExlbmd0aCgpLCAmYml0cG9zLCBpbWFnZS0+ZGF0YSgpLAorICAgICAgICAgICAgICBHQlcsIEdCSCwgaW1hZ2UtPnN0cmlkZSgpKTsKICAgcFN0cmVhbS0+c2V0Qml0UG9zKGJpdHBvcyk7Ci0gIGZvciAoaSA9IDA7ICh1aW50MzJfdClpIDwgKCpwSW1hZ2UpLT5zdHJpZGUoKSAqIEdCSDsgaSsrKSB7Ci0gICAgKCpwSW1hZ2UpLT5tX3BEYXRhW2ldID0gfigqcEltYWdlKS0+bV9wRGF0YVtpXTsKLSAgfQorICBmb3IgKGkgPSAwOyAodWludDMyX3QpaSA8IGltYWdlLT5zdHJpZGUoKSAqIEdCSDsgKytpKQorICAgIGltYWdlLT5kYXRhKClbaV0gPSB+aW1hZ2UtPmRhdGEoKVtpXTsKICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9GSU5JU0g7CisgICpwSW1hZ2UgPSBzdGQ6Om1vdmUoaW1hZ2UpOwogICByZXR1cm4gbV9Qcm9zc2l2ZVN0YXR1czsKIH0KIAotRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OkNvbnRpbnVlX2RlY29kZShJRlhfUGF1c2UqIHBQYXVzZSkgeworRlhDT0RFQ19TVEFUVVMgQ0pCaWcyX0dSRFByb2M6OkNvbnRpbnVlX2RlY29kZSgKKyAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSwKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyKSB7CiAgIGlmIChtX1Byb3NzaXZlU3RhdHVzICE9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpCiAgICAgcmV0dXJuIG1fUHJvc3NpdmVTdGF0dXM7CiAKQEAgLTY0MSwyNiArNzQzLDI5IEBACiAgICAgbV9Qcm9zc2l2ZVN0YXR1cyA9IEZYQ09ERUNfU1RBVFVTX0VSUk9SOwogICAgIHJldHVybiBtX1Byb3NzaXZlU3RhdHVzOwogICB9Ci0KLSAgcmV0dXJuIGRlY29kZV9Bcml0aChwUGF1c2UpOworICByZXR1cm4gZGVjb2RlX0FyaXRoKHBQYXVzZSwgcEFyaXRoRGVjb2Rlcik7CiB9CiAKIEZYQ09ERUNfU1RBVFVTIENKQmlnMl9HUkRQcm9jOjpkZWNvZGVfQXJpdGhfVGVtcGxhdGUwX29wdDMoCiAgICAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2UsCiAgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCi0gICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKLSAgaWYgKCFtX3BMaW5lKSB7Ci0gICAgbV9wTGluZSA9IHBJbWFnZS0+bV9wRGF0YTsKLSAgfQorICAgIElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKSB7CisgIGlmICghbV9wTGluZSkKKyAgICBtX3BMaW5lID0gcEltYWdlLT5kYXRhKCk7CiAgIGludDMyX3QgblN0cmlkZSA9IHBJbWFnZS0+c3RyaWRlKCk7CiAgIGludDMyX3QgblN0cmlkZTIgPSBuU3RyaWRlIDw8IDE7CiAgIGludDMyX3QgbkxpbmVCeXRlcyA9ICgoR0JXICsgNykgPj4gMykgLSAxOwogICBpbnQzMl90IG5CaXRzTGVmdCA9IEdCVyAtIChuTGluZUJ5dGVzIDw8IDMpOwogICB1aW50MzJfdCBoZWlnaHQgPSBHQkggJiAweDdmZmZmZmZmOworCiAgIGZvciAoOyBtX2xvb3BJbmRleCA8IGhlaWdodDsgbV9sb29wSW5kZXgrKykgewotICAgIGlmIChUUEdET04pCisgICAgaWYgKFRQR0RPTikgeworICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOworCiAgICAgICBtX0xUUCA9IG1fTFRQIF4gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHg5YjI1XSk7CisgICAgfQogICAgIGlmIChtX0xUUCkgewogICAgICAgcEltYWdlLT5jb3B5TGluZShtX2xvb3BJbmRleCwgbV9sb29wSW5kZXggLSAxKTsKICAgICB9IGVsc2UgewpAQCAtNjc1LDYgKzc4MCw5IEBACiAgICAgICAgICAgbGluZTIgPSAobGluZTIgPDwgOCkgfCAoKnBMaW5lMisrKTsKICAgICAgICAgICB1aW50OF90IGNWYWwgPSAwOwogICAgICAgICAgIGZvciAoaW50MzJfdCBrID0gNzsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsKKwogICAgICAgICAgICAgaW50IGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKICAgICAgICAgICAgIENPTlRFWFQgPSAoKChDT05URVhUICYgMHg3YmY3KSA8PCAxKSB8IGJWYWwgfApAQCAtNjg2LDYgKzc5NCw5IEBACiAgICAgICAgIGxpbmUyIDw8PSA4OwogICAgICAgICB1aW50OF90IGNWYWwxID0gMDsKICAgICAgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKKyAgICAgICAgICBpZiAocEFyaXRoRGVjb2Rlci0+SXNDb21wbGV0ZSgpKQorICAgICAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOworCiAgICAgICAgICAgaW50IGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgICAgY1ZhbDEgfD0gYlZhbCA8PCAoNyAtIGspOwogICAgICAgICAgIENPTlRFWFQgPQpAQCAtNzAzLDYgKzgxNCw5IEBACiAgICAgICAgICAgfQogICAgICAgICAgIHVpbnQ4X3QgY1ZhbCA9IDA7CiAgICAgICAgICAgZm9yIChpbnQzMl90IGsgPSA3OyBrID49IDA7IGstLSkgeworICAgICAgICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOworCiAgICAgICAgICAgICBpbnQgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOwogICAgICAgICAgICAgQ09OVEVYVCA9CkBAIC03MTMsNiArODI3LDkgQEAKICAgICAgICAgbGluZTIgPDw9IDg7CiAgICAgICAgIHVpbnQ4X3QgY1ZhbDEgPSAwOwogICAgICAgICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBuQml0c0xlZnQ7IGsrKykgeworICAgICAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisKICAgICAgICAgICBpbnQgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKICAgICAgICAgICBjVmFsMSB8PSBiVmFsIDw8ICg3IC0gayk7CiAgICAgICAgICAgQ09OVEVYVCA9ICgoKENPTlRFWFQgJiAweDdiZjcpIDw8IDEpIHwgYlZhbCB8CkBAIC03MzYsMTAgKzg1MywxNCBAQAogICAgIENKQmlnMl9JbWFnZSogcEltYWdlLAogICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCiAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAotICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgICAgSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpIHsKICAgZm9yICg7IG1fbG9vcEluZGV4IDwgR0JIOyBtX2xvb3BJbmRleCsrKSB7Ci0gICAgaWYgKFRQR0RPTikKKyAgICBpZiAoVFBHRE9OKSB7CisgICAgICBpZiAocEFyaXRoRGVjb2Rlci0+SXNDb21wbGV0ZSgpKQorICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisKICAgICAgIG1fTFRQID0gbV9MVFAgXiBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFsweDliMjVdKTsKKyAgICB9CiAgICAgaWYgKG1fTFRQKSB7CiAgICAgICBwSW1hZ2UtPmNvcHlMaW5lKG1fbG9vcEluZGV4LCBtX2xvb3BJbmRleCAtIDEpOwogICAgIH0gZWxzZSB7CkBAIC03NjEsNiArODgyLDkgQEAKICAgICAgICAgICBDT05URVhUIHw9IHBJbWFnZS0+Z2V0UGl4ZWwodyArIEdCQVRbNF0sIG1fbG9vcEluZGV4ICsgR0JBVFs1XSkgPDwgMTE7CiAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCAxMjsKICAgICAgICAgICBDT05URVhUIHw9IHBJbWFnZS0+Z2V0UGl4ZWwodyArIEdCQVRbNl0sIG1fbG9vcEluZGV4ICsgR0JBVFs3XSkgPDwgMTU7CisgICAgICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsKKwogICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGJWYWwpIHsKQEAgLTc4NywxNyArOTExLDIwIEBACiAgICAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2UsCiAgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCi0gICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKLSAgaWYgKCFtX3BMaW5lKSB7Ci0gICAgbV9wTGluZSA9IHBJbWFnZS0+bV9wRGF0YTsKLSAgfQorICAgIElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKSB7CisgIGlmICghbV9wTGluZSkKKyAgICBtX3BMaW5lID0gcEltYWdlLT5kYXRhKCk7CiAgIGludDMyX3QgblN0cmlkZSA9IHBJbWFnZS0+c3RyaWRlKCk7CiAgIGludDMyX3QgblN0cmlkZTIgPSBuU3RyaWRlIDw8IDE7CiAgIGludDMyX3QgbkxpbmVCeXRlcyA9ICgoR0JXICsgNykgPj4gMykgLSAxOwogICBpbnQzMl90IG5CaXRzTGVmdCA9IEdCVyAtIChuTGluZUJ5dGVzIDw8IDMpOwogICBmb3IgKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKLSAgICBpZiAoVFBHRE9OKQorICAgIGlmIChUUEdET04pIHsKKyAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsKKwogICAgICAgbV9MVFAgPSBtX0xUUCBeIHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDc5NV0pOworICAgIH0KICAgICBpZiAobV9MVFApIHsKICAgICAgIHBJbWFnZS0+Y29weUxpbmUobV9sb29wSW5kZXgsIG1fbG9vcEluZGV4IC0gMSk7CiAgICAgfSBlbHNlIHsKQEAgLTgxMiw2ICs5MzksOSBAQAogICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7CiAgICAgICAgICAgdWludDhfdCBjVmFsID0gMDsKICAgICAgICAgICBmb3IgKGludDMyX3QgayA9IDc7IGsgPj0gMDsgay0tKSB7CisgICAgICAgICAgICBpZiAocEFyaXRoRGVjb2Rlci0+SXNDb21wbGV0ZSgpKQorICAgICAgICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisKICAgICAgICAgICAgIGludCBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwogICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7CiAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwZWZiKSA8PCAxKSB8IGJWYWwgfApAQCAtODIzLDYgKzk1Myw5IEBACiAgICAgICAgIGxpbmUyIDw8PSA4OwogICAgICAgICB1aW50OF90IGNWYWwxID0gMDsKICAgICAgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKKyAgICAgICAgICBpZiAocEFyaXRoRGVjb2Rlci0+SXNDb21wbGV0ZSgpKQorICAgICAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOworCiAgICAgICAgICAgaW50IGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgICAgY1ZhbDEgfD0gYlZhbCA8PCAoNyAtIGspOwogICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDBlZmIpIDw8IDEpIHwgYlZhbCB8CkBAIC04NDAsNiArOTczLDkgQEAKICAgICAgICAgICB9CiAgICAgICAgICAgdWludDhfdCBjVmFsID0gMDsKICAgICAgICAgICBmb3IgKGludDMyX3QgayA9IDc7IGsgPj0gMDsgay0tKSB7CisgICAgICAgICAgICBpZiAocEFyaXRoRGVjb2Rlci0+SXNDb21wbGV0ZSgpKQorICAgICAgICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisKICAgICAgICAgICAgIGludCBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwogICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7CiAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwZWZiKSA8PCAxKSB8IGJWYWwgfApAQCAtODUwLDYgKzk4Niw5IEBACiAgICAgICAgIGxpbmUyIDw8PSA4OwogICAgICAgICB1aW50OF90IGNWYWwxID0gMDsKICAgICAgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKKyAgICAgICAgICBpZiAocEFyaXRoRGVjb2Rlci0+SXNDb21wbGV0ZSgpKQorICAgICAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOworCiAgICAgICAgICAgaW50IGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgICAgY1ZhbDEgfD0gYlZhbCA8PCAoNyAtIGspOwogICAgICAgICAgIENPTlRFWFQgPQpAQCAtODczLDEwICsxMDEyLDE0IEBACiAgICAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2UsCiAgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCi0gICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSkgewogICBmb3IgKHVpbnQzMl90IGggPSAwOyBoIDwgR0JIOyBoKyspIHsKLSAgICBpZiAoVFBHRE9OKQorICAgIGlmIChUUEdET04pIHsKKyAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsKKwogICAgICAgbV9MVFAgPSBtX0xUUCBeIHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDc5NV0pOworICAgIH0KICAgICBpZiAobV9MVFApIHsKICAgICAgIHBJbWFnZS0+Y29weUxpbmUoaCwgaCAtIDEpOwogICAgIH0gZWxzZSB7CkBAIC04OTYsNiArMTAzOSw5IEBACiAgICAgICAgICAgQ09OVEVYVCB8PSBwSW1hZ2UtPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBoICsgR0JBVFsxXSkgPDwgMzsKICAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDQ7CiAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA5OworICAgICAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisKICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwogICAgICAgICB9CiAgICAgICAgIGlmIChiVmFsKSB7CkBAIC05MjAsMTcgKzEwNjYsMjAgQEAKICAgICBDSkJpZzJfSW1hZ2UqIHBJbWFnZSwKICAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAogICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCwKLSAgICBJRlhfUGF1c2UqIHBQYXVzZSkgewotICBpZiAoIW1fcExpbmUpIHsKLSAgICBtX3BMaW5lID0gcEltYWdlLT5tX3BEYXRhOwotICB9CisgICAgSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpIHsKKyAgaWYgKCFtX3BMaW5lKQorICAgIG1fcExpbmUgPSBwSW1hZ2UtPmRhdGEoKTsKICAgaW50MzJfdCBuU3RyaWRlID0gcEltYWdlLT5zdHJpZGUoKTsKICAgaW50MzJfdCBuU3RyaWRlMiA9IG5TdHJpZGUgPDwgMTsKICAgaW50MzJfdCBuTGluZUJ5dGVzID0gKChHQlcgKyA3KSA+PiAzKSAtIDE7CiAgIGludDMyX3QgbkJpdHNMZWZ0ID0gR0JXIC0gKG5MaW5lQnl0ZXMgPDwgMyk7CiAgIGZvciAoOyBtX2xvb3BJbmRleCA8IEdCSDsgbV9sb29wSW5kZXgrKykgewotICAgIGlmIChUUEdET04pCisgICAgaWYgKFRQR0RPTikgeworICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOworCiAgICAgICBtX0xUUCA9IG1fTFRQIF4gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwMGU1XSk7CisgICAgfQogICAgIGlmIChtX0xUUCkgewogICAgICAgcEltYWdlLT5jb3B5TGluZShtX2xvb3BJbmRleCwgbV9sb29wSW5kZXggLSAxKTsKICAgICB9IGVsc2UgewpAQCAtOTQ1LDYgKzEwOTQsOSBAQAogICAgICAgICAgIGxpbmUyID0gKGxpbmUyIDw8IDgpIHwgKCpwTGluZTIrKyk7CiAgICAgICAgICAgdWludDhfdCBjVmFsID0gMDsKICAgICAgICAgICBmb3IgKGludDMyX3QgayA9IDc7IGsgPj0gMDsgay0tKSB7CisgICAgICAgICAgICBpZiAocEFyaXRoRGVjb2Rlci0+SXNDb21wbGV0ZSgpKQorICAgICAgICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisKICAgICAgICAgICAgIGludCBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwogICAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8IGs7CiAgICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWJkKSA8PCAxKSB8IGJWYWwgfApAQCAtOTU2LDYgKzExMDgsOSBAQAogICAgICAgICBsaW5lMiA8PD0gODsKICAgICAgICAgdWludDhfdCBjVmFsMSA9IDA7CiAgICAgICAgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7CisgICAgICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsKKwogICAgICAgICAgIGludCBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwogICAgICAgICAgIGNWYWwxIHw9IGJWYWwgPDwgKDcgLSBrKTsKICAgICAgICAgICBDT05URVhUID0gKChDT05URVhUICYgMHgwMWJkKSA8PCAxKSB8IGJWYWwgfApAQCAtOTczLDYgKzExMjgsOSBAQAogICAgICAgICAgIH0KICAgICAgICAgICB1aW50OF90IGNWYWwgPSAwOwogICAgICAgICAgIGZvciAoaW50MzJfdCBrID0gNzsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsKKwogICAgICAgICAgICAgaW50IGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxYmQpIDw8IDEpIHwgYlZhbCB8CkBAIC05ODMsNiArMTE0MSw5IEBACiAgICAgICAgIGxpbmUyIDw8PSA4OwogICAgICAgICB1aW50OF90IGNWYWwxID0gMDsKICAgICAgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKKyAgICAgICAgICBpZiAocEFyaXRoRGVjb2Rlci0+SXNDb21wbGV0ZSgpKQorICAgICAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOworCiAgICAgICAgICAgaW50IGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgICAgY1ZhbDEgfD0gYlZhbCA8PCAoNyAtIGspOwogICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxYmQpIDw8IDEpIHwgYlZhbCB8CkBAIC0xMDA2LDEwICsxMTY3LDE0IEBACiAgICAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2UsCiAgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCi0gICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKKyAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSkgewogICBmb3IgKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKLSAgICBpZiAoVFBHRE9OKQorICAgIGlmIChUUEdET04pIHsKKyAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsKKwogICAgICAgbV9MVFAgPSBtX0xUUCBeIHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDBlNV0pOworICAgIH0KICAgICBpZiAobV9MVFApIHsKICAgICAgIHBJbWFnZS0+Y29weUxpbmUobV9sb29wSW5kZXgsIG1fbG9vcEluZGV4IC0gMSk7CiAgICAgfSBlbHNlIHsKQEAgLTEwMjcsNiArMTE5Miw5IEBACiAgICAgICAgICAgQ09OVEVYVCB8PSBwSW1hZ2UtPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBtX2xvb3BJbmRleCArIEdCQVRbMV0pIDw8IDI7CiAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMiA8PCAzOwogICAgICAgICAgIENPTlRFWFQgfD0gbGluZTEgPDwgNzsKKyAgICAgICAgICBpZiAocEFyaXRoRGVjb2Rlci0+SXNDb21wbGV0ZSgpKQorICAgICAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOworCiAgICAgICAgICAgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKICAgICAgICAgfQogICAgICAgICBpZiAoYlZhbCkgewpAQCAtMTA1MywxNiArMTIyMSwxOSBAQAogICAgIENKQmlnMl9JbWFnZSogcEltYWdlLAogICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCiAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAotICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CisgICAgSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpIHsKICAgaWYgKCFtX3BMaW5lKQotICAgIG1fcExpbmUgPSBwSW1hZ2UtPm1fcERhdGE7Ci0KKyAgICBtX3BMaW5lID0gcEltYWdlLT5kYXRhKCk7CiAgIGludDMyX3QgblN0cmlkZSA9IHBJbWFnZS0+c3RyaWRlKCk7CiAgIGludDMyX3QgbkxpbmVCeXRlcyA9ICgoR0JXICsgNykgPj4gMykgLSAxOwogICBpbnQzMl90IG5CaXRzTGVmdCA9IEdCVyAtIChuTGluZUJ5dGVzIDw8IDMpOwogICBmb3IgKDsgbV9sb29wSW5kZXggPCBHQkg7IG1fbG9vcEluZGV4KyspIHsKLSAgICBpZiAoVFBHRE9OKQorICAgIGlmIChUUEdET04pIHsKKyAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsKKwogICAgICAgbV9MVFAgPSBtX0xUUCBeIHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0WzB4MDE5NV0pOworICAgIH0KICAgICBpZiAobV9MVFApIHsKICAgICAgIHBJbWFnZS0+Y29weUxpbmUobV9sb29wSW5kZXgsIG1fbG9vcEluZGV4IC0gMSk7CiAgICAgfSBlbHNlIHsKQEAgLTEwNzQsNiArMTI0NSw5IEBACiAgICAgICAgICAgbGluZTEgPSAobGluZTEgPDwgOCkgfCAoKnBMaW5lMSsrKTsKICAgICAgICAgICB1aW50OF90IGNWYWwgPSAwOwogICAgICAgICAgIGZvciAoaW50MzJfdCBrID0gNzsgayA+PSAwOyBrLS0pIHsKKyAgICAgICAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsKKwogICAgICAgICAgICAgaW50IGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgazsKICAgICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxZjcpIDw8IDEpIHwgYlZhbCB8CkBAIC0xMDg0LDYgKzEyNTgsOSBAQAogICAgICAgICBsaW5lMSA8PD0gODsKICAgICAgICAgdWludDhfdCBjVmFsMSA9IDA7CiAgICAgICAgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IG5CaXRzTGVmdDsgaysrKSB7CisgICAgICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgICAgIHJldHVybiBGWENPREVDX1NUQVRVU19FUlJPUjsKKwogICAgICAgICAgIGludCBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwogICAgICAgICAgIGNWYWwxIHw9IGJWYWwgPDwgKDcgLSBrKTsKICAgICAgICAgICBDT05URVhUID0KQEAgLTEwOTUsNiArMTI3Miw5IEBACiAgICAgICAgIGZvciAoaW50MzJfdCBjYyA9IDA7IGNjIDwgbkxpbmVCeXRlczsgY2MrKykgewogICAgICAgICAgIHVpbnQ4X3QgY1ZhbCA9IDA7CiAgICAgICAgICAgZm9yIChpbnQzMl90IGsgPSA3OyBrID49IDA7IGstLSkgeworICAgICAgICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOworCiAgICAgICAgICAgICBpbnQgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ2JDb250ZXh0W0NPTlRFWFRdKTsKICAgICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCBrOwogICAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MDFmNykgPDwgMSkgfCBiVmFsOwpAQCAtMTEwMyw2ICsxMjgzLDkgQEAKICAgICAgICAgfQogICAgICAgICB1aW50OF90IGNWYWwxID0gMDsKICAgICAgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgbkJpdHNMZWZ0OyBrKyspIHsKKyAgICAgICAgICBpZiAocEFyaXRoRGVjb2Rlci0+SXNDb21wbGV0ZSgpKQorICAgICAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOworCiAgICAgICAgICAgaW50IGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdiQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgICAgY1ZhbDEgfD0gYlZhbCA8PCAoNyAtIGspOwogICAgICAgICAgIENPTlRFWFQgPSAoKENPTlRFWFQgJiAweDAxZjcpIDw8IDEpIHwgYlZhbDsKQEAgLTExMjUsMTAgKzEzMDgsMTQgQEAKICAgICBDSkJpZzJfSW1hZ2UqIHBJbWFnZSwKICAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAogICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCwKLSAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICAgIElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKSB7CiAgIGZvciAoOyBtX2xvb3BJbmRleCA8IEdCSDsgbV9sb29wSW5kZXgrKykgewotICAgIGlmIChUUEdET04pCisgICAgaWYgKFRQR0RPTikgeworICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgcmV0dXJuIEZYQ09ERUNfU1RBVFVTX0VSUk9SOworCiAgICAgICBtX0xUUCA9IG1fTFRQIF4gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbMHgwMTk1XSk7CisgICAgfQogICAgIGlmIChtX0xUUCkgewogICAgICAgcEltYWdlLT5jb3B5TGluZShtX2xvb3BJbmRleCwgbV9sb29wSW5kZXggLSAxKTsKICAgICB9IGVsc2UgewpAQCAtMTE0Myw2ICsxMzMwLDkgQEAKICAgICAgICAgICB1aW50MzJfdCBDT05URVhUID0gbGluZTI7CiAgICAgICAgICAgQ09OVEVYVCB8PSBwSW1hZ2UtPmdldFBpeGVsKHcgKyBHQkFUWzBdLCBtX2xvb3BJbmRleCArIEdCQVRbMV0pIDw8IDQ7CiAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA1OworICAgICAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgICAgICByZXR1cm4gRlhDT0RFQ19TVEFUVVNfRVJST1I7CisKICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnYkNvbnRleHRbQ09OVEVYVF0pOwogICAgICAgICB9CiAgICAgICAgIGlmIChiVmFsKSB7CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3JkUHJvYy5oIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0dyZFByb2MuaAppbmRleCBhODJhZWNiLi43OTk5MmFkIDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3JkUHJvYy5oCisrKyBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9HcmRQcm9jLmgKQEAgLTcsMzEgKzcsMzUgQEAKICNpZm5kZWYgQ09SRV9GWENPREVDX0pCSUcyX0pCSUcyX0dSRFBST0NfSF8KICNkZWZpbmUgQ09SRV9GWENPREVDX0pCSUcyX0pCSUcyX0dSRFBST0NfSF8KIAorI2luY2x1ZGUgPG1lbW9yeT4KKwogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9meF9jb2RlY19kZWYuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAKIGNsYXNzIENKQmlnMl9Bcml0aERlY29kZXI7CiBjbGFzcyBDSkJpZzJfQml0U3RyZWFtOwogY2xhc3MgQ0pCaWcyX0ltYWdlOwotY2xhc3MgSUZYX1BhdXNlOworY2xhc3MgSUZYX1BhdXNlSW5kaWNhdG9yOwogc3RydWN0IEpCaWcyQXJpdGhDdHg7CiAKIGNsYXNzIENKQmlnMl9HUkRQcm9jIHsKICBwdWJsaWM6CiAgIENKQmlnMl9HUkRQcm9jKCk7CisgIH5DSkJpZzJfR1JEUHJvYygpOwogCi0gIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IGRlY29kZV9Bcml0aChDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0KTsKIAotICBGWENPREVDX1NUQVRVUyBTdGFydF9kZWNvZGVfQXJpdGgoQ0pCaWcyX0ltYWdlKiogcEltYWdlLAorICBGWENPREVDX1NUQVRVUyBTdGFydF9kZWNvZGVfQXJpdGgoc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4qIHBJbWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gIEZYQ09ERUNfU1RBVFVTIFN0YXJ0X2RlY29kZV9NTVIoQ0pCaWcyX0ltYWdlKiogcEltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpOwotICBGWENPREVDX1NUQVRVUyBDb250aW51ZV9kZWNvZGUoSUZYX1BhdXNlKiBwUGF1c2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpOworICBGWENPREVDX1NUQVRVUyBTdGFydF9kZWNvZGVfTU1SKHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+KiBwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSk7CisgIEZYQ09ERUNfU1RBVFVTIENvbnRpbnVlX2RlY29kZShJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIpOwogICBGWF9SRUNUIEdldFJlcGxhY2VSZWN0KCkgY29uc3QgeyByZXR1cm4gbV9SZXBsYWNlUmVjdDsgfQogCiAgIGJvb2wgTU1SOwpAQCAtNDgsNzMgKzUyLDgwIEBACiAgIGJvb2wgVXNlVGVtcGxhdGUxT3B0MygpIGNvbnN0OwogICBib29sIFVzZVRlbXBsYXRlMjNPcHQzKCkgY29uc3Q7CiAKLSAgRlhDT0RFQ19TVEFUVVMgZGVjb2RlX0FyaXRoKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgRlhDT0RFQ19TVEFUVVMgZGVjb2RlX0FyaXRoKElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2Rlcik7CiAgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfb3B0MyhDSkJpZzJfSW1hZ2UqIHBJbWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CiAgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfdW5vcHQoCiAgICAgICBDSkJpZzJfSW1hZ2UqIHBJbWFnZSwKICAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCiAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCi0gICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CiAgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfb3B0MyhDSkJpZzJfSW1hZ2UqIHBJbWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CiAgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfdW5vcHQoCiAgICAgICBDSkJpZzJfSW1hZ2UqIHBJbWFnZSwKICAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCiAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCi0gICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CiAgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfb3B0MyhDSkJpZzJfSW1hZ2UqIHBJbWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CiAgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfdW5vcHQoCiAgICAgICBDSkJpZzJfSW1hZ2UqIHBJbWFnZSwKICAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCiAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCi0gICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CiAgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfb3B0MyhDSkJpZzJfSW1hZ2UqIHBJbWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CiAgIEZYQ09ERUNfU1RBVFVTIGRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfdW5vcHQoCiAgICAgICBDSkJpZzJfSW1hZ2UqIHBJbWFnZSwKICAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCiAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCi0gICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF9vcHQzKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCk7CisgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IGRlY29kZV9Bcml0aF9UZW1wbGF0ZTBfb3B0MygKKyAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpOwogCi0gIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF91bm9wdChDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0KTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMF91bm9wdCgKKyAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpOwogCi0gIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV9vcHQzKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IGRlY29kZV9Bcml0aF9UZW1wbGF0ZTFfb3B0MygKKyAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpOwogCi0gIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV91bm9wdChDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0KTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMV91bm9wdCgKKyAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpOwogCi0gIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl9vcHQzKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IGRlY29kZV9Bcml0aF9UZW1wbGF0ZTJfb3B0MygKKyAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpOwogCi0gIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl91bm9wdChDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0KTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gZGVjb2RlX0FyaXRoX1RlbXBsYXRlMl91bm9wdCgKKyAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpOwogCi0gIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoX1RlbXBsYXRlM19vcHQzKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IGRlY29kZV9Bcml0aF9UZW1wbGF0ZTNfb3B0MygKKyAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpOwogCi0gIENKQmlnMl9JbWFnZSogZGVjb2RlX0FyaXRoX1RlbXBsYXRlM191bm9wdChDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0KTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gZGVjb2RlX0FyaXRoX1RlbXBsYXRlM191bm9wdCgKKyAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQpOwogCiAgIHVpbnQzMl90IG1fbG9vcEluZGV4OwogICB1aW50OF90KiBtX3BMaW5lOwotICBJRlhfUGF1c2UqIG1fcFBhdXNlOwogICBGWENPREVDX1NUQVRVUyBtX1Byb3NzaXZlU3RhdHVzOwotICBDSkJpZzJfSW1hZ2UqKiBtX3BJbWFnZTsKLSAgQ0pCaWcyX0FyaXRoRGVjb2RlciogbV9wQXJpdGhEZWNvZGVyOworICBDSkJpZzJfSW1hZ2UqIG1fcEltYWdlOwogICBKQmlnMkFyaXRoQ3R4KiBtX2diQ29udGV4dDsKICAgdWludDE2X3QgbV9EZWNvZGVUeXBlOwogICBpbnQgbV9MVFA7CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3JyZFByb2MuY3BwIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0dycmRQcm9jLmNwcAppbmRleCA2NjlmZWQ2Li5mNWY1NjljIDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3JyZFByb2MuY3BwCisrKyBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9HcnJkUHJvYy5jcHAKQEAgLTExLDExICsxMSwxNSBAQAogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aERlY29kZXIuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfQml0U3RyZWFtLmgiCiAjaW5jbHVkZSAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogCi1DSkJpZzJfSW1hZ2UqIENKQmlnMl9HUlJEUHJvYzo6ZGVjb2RlKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdyQ29udGV4dCkgewotICBpZiAoR1JXID09IDAgfHwgR1JIID09IDApCi0gICAgcmV0dXJuIG5ldyBDSkJpZzJfSW1hZ2UoR1JXLCBHUkgpOworc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gQ0pCaWcyX0dSUkRQcm9jOjpkZWNvZGUoCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQpIHsKKyAgaWYgKEdSVyA9PSAwIHx8IEdSVyA+IEpCSUcyX01BWF9JTUFHRV9TSVpFIHx8IEdSSCA9PSAwIHx8CisgICAgICBHUkggPiBKQklHMl9NQVhfSU1BR0VfU0laRSkgeworICAgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0ltYWdlPihHUlcsIEdSSCk7CisgIH0KIAogICBpZiAoIUdSVEVNUExBVEUpIHsKICAgICBpZiAoKEdSQVRbMF0gPT0gLTEpICYmIChHUkFUWzFdID09IC0xKSAmJiAoR1JBVFsyXSA9PSAtMSkgJiYKQEAgLTI4LDgzICszMiw1MCBAQAogCiAgIGlmICgoR1JSRUZFUkVOQ0VEWCA9PSAwKSAmJiAoR1JXID09ICh1aW50MzJfdClHUlJFRkVSRU5DRS0+d2lkdGgoKSkpCiAgICAgcmV0dXJuIGRlY29kZV9UZW1wbGF0ZTFfb3B0KHBBcml0aERlY29kZXIsIGdyQ29udGV4dCk7CisKICAgcmV0dXJuIGRlY29kZV9UZW1wbGF0ZTFfdW5vcHQocEFyaXRoRGVjb2RlciwgZ3JDb250ZXh0KTsKIH0KIAotQ0pCaWcyX0ltYWdlKiBDSkJpZzJfR1JSRFByb2M6OmRlY29kZV9UZW1wbGF0ZTBfdW5vcHQoCitzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBDSkJpZzJfR1JSRFByb2M6OmRlY29kZV9UZW1wbGF0ZTBfdW5vcHQoCiAgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKICAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQpIHsKICAgaW50IExUUCA9IDA7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IEdSUkVHKG5ldyBDSkJpZzJfSW1hZ2UoR1JXLCBHUkgpKTsKKyAgYXV0byBHUlJFRyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSW1hZ2U+KEdSVywgR1JIKTsKICAgR1JSRUctPmZpbGwoMCk7CiAgIGZvciAodWludDMyX3QgaCA9IDA7IGggPCBHUkg7IGgrKykgewotICAgIGlmIChUUEdST04pCisgICAgaWYgKFRQR1JPTikgeworICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKICAgICAgIExUUCA9IExUUCBeIHBBcml0aERlY29kZXItPkRFQ09ERSgmZ3JDb250ZXh0WzB4MDAxMF0pOworICAgIH0KKyAgICB1aW50MzJfdCBsaW5lc1s1XTsKKyAgICBsaW5lc1swXSA9IEdSUkVHLT5nZXRQaXhlbCgxLCBoIC0gMSk7CisgICAgbGluZXNbMF0gfD0gR1JSRUctPmdldFBpeGVsKDAsIGggLSAxKSA8PCAxOworICAgIGxpbmVzWzFdID0gMDsKKyAgICBsaW5lc1syXSA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZIC0gMSk7CisgICAgbGluZXNbMl0gfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpCisgICAgICAgICAgICAgICAgPDwgMTsKKyAgICBsaW5lc1szXSA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZKTsKKyAgICBsaW5lc1szXSB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZKSA8PCAxOworICAgIGxpbmVzWzNdIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCAtIDEsIGggLSBHUlJFRkVSRU5DRURZKQorICAgICAgICAgICAgICAgIDw8IDI7CisgICAgbGluZXNbNF0gPSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpOworICAgIGxpbmVzWzRdIHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKQorICAgICAgICAgICAgICAgIDw8IDE7CisgICAgbGluZXNbNF0gfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYIC0gMSwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKQorICAgICAgICAgICAgICAgIDw8IDI7CiAgICAgaWYgKCFMVFApIHsKLSAgICAgIHVpbnQzMl90IGxpbmUxID0gR1JSRUctPmdldFBpeGVsKDEsIGggLSAxKTsKLSAgICAgIGxpbmUxIHw9IEdSUkVHLT5nZXRQaXhlbCgwLCBoIC0gMSkgPDwgMTsKLSAgICAgIHVpbnQzMl90IGxpbmUyID0gMDsKLSAgICAgIHVpbnQzMl90IGxpbmUzID0KLSAgICAgICAgICBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpOwotICAgICAgbGluZTMgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpCi0gICAgICAgICAgICAgICA8PCAxOwotICAgICAgdWludDMyX3QgbGluZTQgPQotICAgICAgICAgIEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZKTsKLSAgICAgIGxpbmU0IHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkpIDw8IDE7Ci0gICAgICBsaW5lNCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggLSAxLCBoIC0gR1JSRUZFUkVOQ0VEWSkKLSAgICAgICAgICAgICAgIDw8IDI7Ci0gICAgICB1aW50MzJfdCBsaW5lNSA9Ci0gICAgICAgICAgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYICsgMSwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKTsKLSAgICAgIGxpbmU1IHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKQotICAgICAgICAgICAgICAgPDwgMTsKLSAgICAgIGxpbmU1IHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCAtIDEsIGggLSBHUlJFRkVSRU5DRURZICsgMSkKLSAgICAgICAgICAgICAgIDw8IDI7CiAgICAgICBmb3IgKHVpbnQzMl90IHcgPSAwOyB3IDwgR1JXOyB3KyspIHsKLSAgICAgICAgdWludDMyX3QgQ09OVEVYVCA9IGxpbmU1OwotICAgICAgICBDT05URVhUIHw9IGxpbmU0IDw8IDM7Ci0gICAgICAgIENPTlRFWFQgfD0gbGluZTMgPDwgNjsKLSAgICAgICAgQ09OVEVYVCB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyBHUkFUWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoIC0gR1JSRUZFUkVOQ0VEWSArIEdSQVRbM10pCi0gICAgICAgICAgICAgICAgICAgPDwgODsKLSAgICAgICAgQ09OVEVYVCB8PSBsaW5lMiA8PCA5OwotICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDEwOwotICAgICAgICBDT05URVhUIHw9IEdSUkVHLT5nZXRQaXhlbCh3ICsgR1JBVFswXSwgaCArIEdSQVRbMV0pIDw8IDEyOworICAgICAgICB1aW50MzJfdCBDT05URVhUID0KKyAgICAgICAgICAgIGRlY29kZV9UZW1wbGF0ZTBfdW5vcHRfQ2FsY3VsYXRlQ29udGV4dCgqR1JSRUcsIGxpbmVzLCB3LCBoKTsKKyAgICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKwogICAgICAgICBpbnQgYlZhbCA9IHBBcml0aERlY29kZXItPkRFQ09ERSgmZ3JDb250ZXh0W0NPTlRFWFRdKTsKLSAgICAgICAgR1JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOwotICAgICAgICBsaW5lMSA9ICgobGluZTEgPDwgMSkgfCBHUlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAxKSkgJiAweDAzOwotICAgICAgICBsaW5lMiA9ICgobGluZTIgPDwgMSkgfCBiVmFsKSAmIDB4MDE7Ci0gICAgICAgIGxpbmUzID0gKChsaW5lMyA8PCAxKSB8Ci0gICAgICAgICAgICAgICAgIEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpKSAmCi0gICAgICAgICAgICAgICAgMHgwMzsKLSAgICAgICAgbGluZTQgPQotICAgICAgICAgICAgKChsaW5lNCA8PCAxKSB8Ci0gICAgICAgICAgICAgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMiwgaCAtIEdSUkVGRVJFTkNFRFkpKSAmCi0gICAgICAgICAgICAweDA3OwotICAgICAgICBsaW5lNSA9ICgobGluZTUgPDwgMSkgfAotICAgICAgICAgICAgICAgICBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKSkgJgotICAgICAgICAgICAgICAgIDB4MDc7CisgICAgICAgIGRlY29kZV9UZW1wbGF0ZTBfdW5vcHRfU2V0UGl4ZWwoR1JSRUcuZ2V0KCksIGxpbmVzLCB3LCBoLCBiVmFsKTsKICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgdWludDMyX3QgbGluZTEgPSBHUlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpOwotICAgICAgbGluZTEgfD0gR1JSRUctPmdldFBpeGVsKDAsIGggLSAxKSA8PCAxOwotICAgICAgdWludDMyX3QgbGluZTIgPSAwOwotICAgICAgdWludDMyX3QgbGluZTMgPQotICAgICAgICAgIEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCArIDEsIGggLSBHUlJFRkVSRU5DRURZIC0gMSk7Ci0gICAgICBsaW5lMyB8PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFgsIGggLSBHUlJFRkVSRU5DRURZIC0gMSkKLSAgICAgICAgICAgICAgIDw8IDE7Ci0gICAgICB1aW50MzJfdCBsaW5lNCA9Ci0gICAgICAgICAgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYICsgMSwgaCAtIEdSUkVGRVJFTkNFRFkpOwotICAgICAgbGluZTQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSkgPDwgMTsKLSAgICAgIGxpbmU0IHw9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCgtR1JSRUZFUkVOQ0VEWCAtIDEsIGggLSBHUlJFRkVSRU5DRURZKQotICAgICAgICAgICAgICAgPDwgMjsKLSAgICAgIHVpbnQzMl90IGxpbmU1ID0KLSAgICAgICAgICBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwoLUdSUkVGRVJFTkNFRFggKyAxLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpOwotICAgICAgbGluZTUgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYLCBoIC0gR1JSRUZFUkVOQ0VEWSArIDEpCi0gICAgICAgICAgICAgICA8PCAxOwotICAgICAgbGluZTUgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKC1HUlJFRkVSRU5DRURYIC0gMSwgaCAtIEdSUkVGRVJFTkNFRFkgKyAxKQotICAgICAgICAgICAgICAgPDwgMjsKICAgICAgIGZvciAodWludDMyX3QgdyA9IDA7IHcgPCBHUlc7IHcrKykgewogICAgICAgICBpbnQgYlZhbCA9IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3LCBoKTsKICAgICAgICAgaWYgKCEoVFBHUk9OICYmIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gMSwgaCAtIDEpKSAmJgpAQCAtMTE1LDUzICs4Niw3MSBAQAogICAgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIDEsIGggKyAxKSkgJiYKICAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcsIGggKyAxKSkgJiYKICAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyAxLCBoICsgMSkpKSkgewotICAgICAgICAgIHVpbnQzMl90IENPTlRFWFQgPSBsaW5lNTsKLSAgICAgICAgICBDT05URVhUIHw9IGxpbmU0IDw8IDM7Ci0gICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMyA8PCA2OwotICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgR1JBVFsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoIC0gR1JSRUZFUkVOQ0VEWSArIEdSQVRbM10pCi0gICAgICAgICAgICAgICAgICAgICA8PCA4OwotICAgICAgICAgIENPTlRFWFQgfD0gbGluZTIgPDwgOTsKLSAgICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDEwOwotICAgICAgICAgIENPTlRFWFQgfD0gR1JSRUctPmdldFBpeGVsKHcgKyBHUkFUWzBdLCBoICsgR1JBVFsxXSkgPDwgMTI7CisgICAgICAgICAgdWludDMyX3QgQ09OVEVYVCA9CisgICAgICAgICAgICAgIGRlY29kZV9UZW1wbGF0ZTBfdW5vcHRfQ2FsY3VsYXRlQ29udGV4dCgqR1JSRUcsIGxpbmVzLCB3LCBoKTsKKyAgICAgICAgICBpZiAocEFyaXRoRGVjb2Rlci0+SXNDb21wbGV0ZSgpKQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbQ09OVEVYVF0pOwogICAgICAgICB9Ci0gICAgICAgIEdSUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKLSAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR1JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMSkpICYgMHgwMzsKLSAgICAgICAgbGluZTIgPSAoKGxpbmUyIDw8IDEpIHwgYlZhbCkgJiAweDAxOwotICAgICAgICBsaW5lMyA9ICgobGluZTMgPDwgMSkgfAotICAgICAgICAgICAgICAgICBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyAtIEdSUkVGRVJFTkNFRFggKyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtIEdSUkVGRVJFTkNFRFkgLSAxKSkgJgotICAgICAgICAgICAgICAgIDB4MDM7Ci0gICAgICAgIGxpbmU0ID0KLSAgICAgICAgICAgICgobGluZTQgPDwgMSkgfAotICAgICAgICAgICAgIEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDIsIGggLSBHUlJFRkVSRU5DRURZKSkgJgotICAgICAgICAgICAgMHgwNzsKLSAgICAgICAgbGluZTUgPSAoKGxpbmU1IDw8IDEpIHwKLSAgICAgICAgICAgICAgICAgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLSBHUlJFRkVSRU5DRURZICsgMSkpICYKLSAgICAgICAgICAgICAgICAweDA3OworICAgICAgICBkZWNvZGVfVGVtcGxhdGUwX3Vub3B0X1NldFBpeGVsKEdSUkVHLmdldCgpLCBsaW5lcywgdywgaCwgYlZhbCk7CiAgICAgICB9CiAgICAgfQogICB9Ci0gIHJldHVybiBHUlJFRy5yZWxlYXNlKCk7CisgIHJldHVybiBHUlJFRzsKIH0KIAotQ0pCaWcyX0ltYWdlKiBDSkJpZzJfR1JSRFByb2M6OmRlY29kZV9UZW1wbGF0ZTBfb3B0KAordWludDMyX3QgQ0pCaWcyX0dSUkRQcm9jOjpkZWNvZGVfVGVtcGxhdGUwX3Vub3B0X0NhbGN1bGF0ZUNvbnRleHQoCisgICAgY29uc3QgQ0pCaWcyX0ltYWdlJiBHUlJFRywKKyAgICBjb25zdCB1aW50MzJfdCogbGluZXMsCisgICAgdWludDMyX3QgdywKKyAgICB1aW50MzJfdCBoKSBjb25zdCB7CisgIHVpbnQzMl90IENPTlRFWFQgPSBsaW5lc1s0XTsKKyAgQ09OVEVYVCB8PSBsaW5lc1szXSA8PCAzOworICBDT05URVhUIHw9IGxpbmVzWzJdIDw8IDY7CisgIENPTlRFWFQgfD0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgR1JBVFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCAtIEdSUkVGRVJFTkNFRFkgKyBHUkFUWzNdKQorICAgICAgICAgICAgIDw8IDg7CisgIENPTlRFWFQgfD0gbGluZXNbMV0gPDwgOTsKKyAgQ09OVEVYVCB8PSBsaW5lc1swXSA8PCAxMDsKKyAgQ09OVEVYVCB8PSBHUlJFRy5nZXRQaXhlbCh3ICsgR1JBVFswXSwgaCArIEdSQVRbMV0pIDw8IDEyOworICByZXR1cm4gQ09OVEVYVDsKK30KKwordm9pZCBDSkJpZzJfR1JSRFByb2M6OmRlY29kZV9UZW1wbGF0ZTBfdW5vcHRfU2V0UGl4ZWwoQ0pCaWcyX0ltYWdlKiBHUlJFRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJWYWwpIHsKKyAgR1JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOworICBsaW5lc1swXSA9ICgobGluZXNbMF0gPDwgMSkgfCBHUlJFRy0+Z2V0UGl4ZWwodyArIDIsIGggLSAxKSkgJiAweDAzOworICBsaW5lc1sxXSA9ICgobGluZXNbMV0gPDwgMSkgfCBiVmFsKSAmIDB4MDE7CisgIGxpbmVzWzJdID0gKChsaW5lc1syXSA8PCAxKSB8IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3IC0gR1JSRUZFUkVOQ0VEWCArIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoIC0gR1JSRUZFUkVOQ0VEWSAtIDEpKSAmCisgICAgICAgICAgICAgMHgwMzsKKyAgbGluZXNbM10gPSAoKGxpbmVzWzNdIDw8IDEpIHwKKyAgICAgICAgICAgICAgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMiwgaCAtIEdSUkVGRVJFTkNFRFkpKSAmCisgICAgICAgICAgICAgMHgwNzsKKyAgbGluZXNbNF0gPSAoKGxpbmVzWzRdIDw8IDEpIHwgR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgLSBHUlJFRkVSRU5DRURYICsgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGggLSBHUlJFRkVSRU5DRURZICsgMSkpICYKKyAgICAgICAgICAgICAweDA3OworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBDSkJpZzJfR1JSRFByb2M6OmRlY29kZV9UZW1wbGF0ZTBfb3B0KAogICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCiAgICAgSkJpZzJBcml0aEN0eCogZ3JDb250ZXh0KSB7Ci0gIGlmICghR1JSRUZFUkVOQ0UtPm1fcERhdGEpCisgIGlmICghR1JSRUZFUkVOQ0UtPmRhdGEoKSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAogICBpbnQzMl90IGlHUlcgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihHUlcpOwogICBpbnQzMl90IGlHUkggPSBzdGF0aWNfY2FzdDxpbnQzMl90PihHUkgpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBHUlJFRyhuZXcgQ0pCaWcyX0ltYWdlKGlHUlcsIGlHUkgpKTsKLSAgaWYgKCFHUlJFRy0+bV9wRGF0YSkKKyAgYXV0byBHUlJFRyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSW1hZ2U+KGlHUlcsIGlHUkgpOworICBpZiAoIUdSUkVHLT5kYXRhKCkpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKICAgaW50IExUUCA9IDA7Ci0gIHVpbnQ4X3QqIHBMaW5lID0gR1JSRUctPm1fcERhdGE7Ci0gIHVpbnQ4X3QqIHBMaW5lUiA9IEdSUkVGRVJFTkNFLT5tX3BEYXRhOworICB1aW50OF90KiBwTGluZSA9IEdSUkVHLT5kYXRhKCk7CisgIHVpbnQ4X3QqIHBMaW5lUiA9IEdSUkVGRVJFTkNFLT5kYXRhKCk7CiAgIGludHB0cl90IG5TdHJpZGUgPSBHUlJFRy0+c3RyaWRlKCk7CiAgIGludHB0cl90IG5TdHJpZGVSID0gR1JSRUZFUkVOQ0UtPnN0cmlkZSgpOwogICBpbnQzMl90IEdSV1IgPSBHUlJFRkVSRU5DRS0+d2lkdGgoKTsKQEAgLTE3MCw4ICsxNTksMTIgQEAKICAgICBHUlJFRkVSRU5DRURZID0gMDsKICAgaW50cHRyX3Qgbk9mZnNldCA9IC1HUlJFRkVSRU5DRURZICogblN0cmlkZVI7CiAgIGZvciAoaW50MzJfdCBoID0gMDsgaCA8IGlHUkg7IGgrKykgewotICAgIGlmIChUUEdST04pCisgICAgaWYgKFRQR1JPTikgeworICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKICAgICAgIExUUCA9IExUUCBeIHBBcml0aERlY29kZXItPkRFQ09ERSgmZ3JDb250ZXh0WzB4MDAxMF0pOworICAgIH0KICAgICB1aW50MzJfdCBsaW5lMSA9IChoID4gMCkgPyBwTGluZVstblN0cmlkZV0gPDwgNCA6IDA7CiAgICAgaW50MzJfdCByZWZlcmVuY2VfaCA9IGggLSBHUlJFRkVSRU5DRURZOwogICAgIGJvb2wgbGluZTFfcl9vayA9IChyZWZlcmVuY2VfaCA+IDAgJiYgcmVmZXJlbmNlX2ggPCBHUkhSICsgMSk7CkBAIC0yMTMsNiArMjA2LDkgQEAKICAgICAgICAgfQogICAgICAgICB1aW50OF90IGNWYWwgPSAwOwogICAgICAgICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBuQml0czsgaysrKSB7CisgICAgICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworCiAgICAgICAgICAgaW50IGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgICAgY1ZhbCB8PSBiVmFsIDw8ICg3IC0gayk7CiAgICAgICAgICAgQ09OVEVYVCA9ICgoQ09OVEVYVCAmIDB4MGNkYikgPDwgMSkgfCAoYlZhbCA8PCA5KSB8CkBAIC0yNTksNiArMjU1LDkgQEAKICAgICAgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGsgLSAxLCBoICsgMSkpICYmCiAgICAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrLCBoICsgMSkpICYmCiAgICAgICAgICAgICAgICAgKGJWYWwgPT0gR1JSRUZFUkVOQ0UtPmdldFBpeGVsKHcgKyBrICsgMSwgaCArIDEpKSkpIHsKKyAgICAgICAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworCiAgICAgICAgICAgICBiVmFsID0gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbQ09OVEVYVF0pOwogICAgICAgICAgIH0KICAgICAgICAgICBjVmFsIHw9IGJWYWwgPDwgKDcgLSBrKTsKQEAgLTI3MiwyMiArMjcxLDI1IEBACiAgICAgICB9CiAgICAgfQogICAgIHBMaW5lICs9IG5TdHJpZGU7Ci0gICAgaWYgKGggPCBHUkhSICsgR1JSRUZFUkVOQ0VEWSkgeworICAgIGlmIChoIDwgR1JIUiArIEdSUkVGRVJFTkNFRFkpCiAgICAgICBwTGluZVIgKz0gblN0cmlkZVI7Ci0gICAgfQogICB9Ci0gIHJldHVybiBHUlJFRy5yZWxlYXNlKCk7CisgIHJldHVybiBHUlJFRzsKIH0KIAotQ0pCaWcyX0ltYWdlKiBDSkJpZzJfR1JSRFByb2M6OmRlY29kZV9UZW1wbGF0ZTFfdW5vcHQoCitzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBDSkJpZzJfR1JSRFByb2M6OmRlY29kZV9UZW1wbGF0ZTFfdW5vcHQoCiAgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKICAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQpIHsKICAgaW50IExUUCA9IDA7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IEdSUkVHKG5ldyBDSkJpZzJfSW1hZ2UoR1JXLCBHUkgpKTsKKyAgYXV0byBHUlJFRyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSW1hZ2U+KEdSVywgR1JIKTsKICAgR1JSRUctPmZpbGwoMCk7CiAgIGZvciAodWludDMyX3QgaCA9IDA7IGggPCBHUkg7IGgrKykgewotICAgIGlmIChUUEdST04pCisgICAgaWYgKFRQR1JPTikgeworICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKICAgICAgIExUUCA9IExUUCBeIHBBcml0aERlY29kZXItPkRFQ09ERSgmZ3JDb250ZXh0WzB4MDAwOF0pOworICAgIH0KICAgICBpZiAoIUxUUCkgewogICAgICAgdWludDMyX3QgbGluZTEgPSBHUlJFRy0+Z2V0UGl4ZWwoMSwgaCAtIDEpOwogICAgICAgbGluZTEgfD0gR1JSRUctPmdldFBpeGVsKDAsIGggLSAxKSA8PCAxOwpAQCAtMzEwLDYgKzMxMiw5IEBACiAgICAgICAgIENPTlRFWFQgfD0gbGluZTMgPDwgNTsKICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMiA8PCA2OwogICAgICAgICBDT05URVhUIHw9IGxpbmUxIDw8IDc7CisgICAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKICAgICAgICAgaW50IGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgIEdSUkVHLT5zZXRQaXhlbCh3LCBoLCBiVmFsKTsKICAgICAgICAgbGluZTEgPSAoKGxpbmUxIDw8IDEpIHwgR1JSRUctPmdldFBpeGVsKHcgKyAyLCBoIC0gMSkpICYgMHgwNzsKQEAgLTM1OCw2ICszNjMsOSBAQAogICAgICAgICAgIENPTlRFWFQgfD0gbGluZTMgPDwgNTsKICAgICAgICAgICBDT05URVhUIHw9IGxpbmUyIDw8IDY7CiAgICAgICAgICAgQ09OVEVYVCB8PSBsaW5lMSA8PCA3OworICAgICAgICAgIGlmIChwQXJpdGhEZWNvZGVyLT5Jc0NvbXBsZXRlKCkpCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKwogICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgIH0KICAgICAgICAgR1JSRUctPnNldFBpeGVsKHcsIGgsIGJWYWwpOwpAQCAtMzc4LDI0ICszODYsMjQgQEAKICAgICAgIH0KICAgICB9CiAgIH0KLSAgcmV0dXJuIEdSUkVHLnJlbGVhc2UoKTsKKyAgcmV0dXJuIEdSUkVHOwogfQogCi1DSkJpZzJfSW1hZ2UqIENKQmlnMl9HUlJEUHJvYzo6ZGVjb2RlX1RlbXBsYXRlMV9vcHQoCitzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBDSkJpZzJfR1JSRFByb2M6OmRlY29kZV9UZW1wbGF0ZTFfb3B0KAogICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCiAgICAgSkJpZzJBcml0aEN0eCogZ3JDb250ZXh0KSB7Ci0gIGlmICghR1JSRUZFUkVOQ0UtPm1fcERhdGEpCisgIGlmICghR1JSRUZFUkVOQ0UtPmRhdGEoKSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAogICBpbnQzMl90IGlHUlcgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihHUlcpOwogICBpbnQzMl90IGlHUkggPSBzdGF0aWNfY2FzdDxpbnQzMl90PihHUkgpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBHUlJFRyhuZXcgQ0pCaWcyX0ltYWdlKGlHUlcsIGlHUkgpKTsKLSAgaWYgKCFHUlJFRy0+bV9wRGF0YSkKKyAgYXV0byBHUlJFRyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSW1hZ2U+KGlHUlcsIGlHUkgpOworICBpZiAoIUdSUkVHLT5kYXRhKCkpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKICAgaW50IExUUCA9IDA7Ci0gIHVpbnQ4X3QqIHBMaW5lID0gR1JSRUctPm1fcERhdGE7Ci0gIHVpbnQ4X3QqIHBMaW5lUiA9IEdSUkVGRVJFTkNFLT5tX3BEYXRhOworICB1aW50OF90KiBwTGluZSA9IEdSUkVHLT5kYXRhKCk7CisgIHVpbnQ4X3QqIHBMaW5lUiA9IEdSUkVGRVJFTkNFLT5kYXRhKCk7CiAgIGludHB0cl90IG5TdHJpZGUgPSBHUlJFRy0+c3RyaWRlKCk7CiAgIGludHB0cl90IG5TdHJpZGVSID0gR1JSRUZFUkVOQ0UtPnN0cmlkZSgpOwogICBpbnQzMl90IEdSV1IgPSBHUlJFRkVSRU5DRS0+d2lkdGgoKTsKQEAgLTQwNSw4ICs0MTMsMTIgQEAKICAgfQogICBpbnRwdHJfdCBuT2Zmc2V0ID0gLUdSUkVGRVJFTkNFRFkgKiBuU3RyaWRlUjsKICAgZm9yIChpbnQzMl90IGggPSAwOyBoIDwgaUdSSDsgaCsrKSB7Ci0gICAgaWYgKFRQR1JPTikKKyAgICBpZiAoVFBHUk9OKSB7CisgICAgICBpZiAocEFyaXRoRGVjb2Rlci0+SXNDb21wbGV0ZSgpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKwogICAgICAgTFRQID0gTFRQIF4gcEFyaXRoRGVjb2Rlci0+REVDT0RFKCZnckNvbnRleHRbMHgwMDA4XSk7CisgICAgfQogICAgIHVpbnQzMl90IGxpbmUxID0gKGggPiAwKSA/IHBMaW5lWy1uU3RyaWRlXSA8PCAxIDogMDsKICAgICBpbnQzMl90IHJlZmVyZW5jZV9oID0gaCAtIEdSUkVGRVJFTkNFRFk7CiAgICAgYm9vbCBsaW5lMV9yX29rID0gKHJlZmVyZW5jZV9oID4gMCAmJiByZWZlcmVuY2VfaCA8IEdSSFIgKyAxKTsKQEAgLTQ4Miw2ICs0OTQsOSBAQAogICAgICAgICAgICAgICAgIChiVmFsID09IEdSUkVGRVJFTkNFLT5nZXRQaXhlbCh3ICsgayAtIDEsIGggKyAxKSkgJiYKICAgICAgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGssIGggKyAxKSkgJiYKICAgICAgICAgICAgICAgICAoYlZhbCA9PSBHUlJFRkVSRU5DRS0+Z2V0UGl4ZWwodyArIGsgKyAxLCBoICsgMSkpKSkgeworICAgICAgICAgICAgaWYgKHBBcml0aERlY29kZXItPklzQ29tcGxldGUoKSkKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKICAgICAgICAgICAgIGJWYWwgPSBwQXJpdGhEZWNvZGVyLT5ERUNPREUoJmdyQ29udGV4dFtDT05URVhUXSk7CiAgICAgICAgICAgfQogICAgICAgICAgIGNWYWwgfD0gYlZhbCA8PCAoNyAtIGspOwpAQCAtNDk1LDkgKzUxMCw4IEBACiAgICAgICB9CiAgICAgfQogICAgIHBMaW5lICs9IG5TdHJpZGU7Ci0gICAgaWYgKGggPCBHUkhSICsgR1JSRUZFUkVOQ0VEWSkgeworICAgIGlmIChoIDwgR1JIUiArIEdSUkVGRVJFTkNFRFkpCiAgICAgICBwTGluZVIgKz0gblN0cmlkZVI7Ci0gICAgfQogICB9Ci0gIHJldHVybiBHUlJFRy5yZWxlYXNlKCk7CisgIHJldHVybiBHUlJFRzsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9HcnJkUHJvYy5oIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0dycmRQcm9jLmgKaW5kZXggYmRiNDlkNy4uYTlhMTQzOSAxMDA2NDQKLS0tIGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0dycmRQcm9jLmgKKysrIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0dycmRQcm9jLmgKQEAgLTcsNiArNyw4IEBACiAjaWZuZGVmIENPUkVfRlhDT0RFQ19KQklHMl9KQklHMl9HUlJEUFJPQ19IXwogI2RlZmluZSBDT1JFX0ZYQ09ERUNfSkJJRzJfSkJJRzJfR1JSRFBST0NfSF8KIAorI2luY2x1ZGUgPG1lbW9yeT4KKwogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCiAKIGNsYXNzIENKQmlnMl9Bcml0aERlY29kZXI7CkBAIC0xNSwyMSArMTcsOSBAQAogCiBjbGFzcyBDSkJpZzJfR1JSRFByb2MgewogIHB1YmxpYzoKLSAgQ0pCaWcyX0ltYWdlKiBkZWNvZGUoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ3JDb250ZXh0KTsKLQotICBDSkJpZzJfSW1hZ2UqIGRlY29kZV9UZW1wbGF0ZTBfdW5vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gZGVjb2RlKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQpOwogCi0gIENKQmlnMl9JbWFnZSogZGVjb2RlX1RlbXBsYXRlMF9vcHQoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQpOwotCi0gIENKQmlnMl9JbWFnZSogZGVjb2RlX1RlbXBsYXRlMV91bm9wdChDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ3JDb250ZXh0KTsKLQotICBDSkJpZzJfSW1hZ2UqIGRlY29kZV9UZW1wbGF0ZTFfb3B0KENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ3JDb250ZXh0KTsKLQogICB1aW50MzJfdCBHUlc7CiAgIHVpbnQzMl90IEdSSDsKICAgYm9vbCBHUlRFTVBMQVRFOwpAQCAtMzgsNiArMjgsMzIgQEAKICAgaW50MzJfdCBHUlJFRkVSRU5DRURZOwogICBib29sIFRQR1JPTjsKICAgaW50OF90IEdSQVRbNF07CisKKyBwcml2YXRlOgorICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBkZWNvZGVfVGVtcGxhdGUwX3Vub3B0KAorICAgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgIEpCaWcyQXJpdGhDdHgqIGdyQ29udGV4dCk7CisgIHVpbnQzMl90IGRlY29kZV9UZW1wbGF0ZTBfdW5vcHRfQ2FsY3VsYXRlQ29udGV4dChjb25zdCBDSkJpZzJfSW1hZ2UmIEdSUkVHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGgpIGNvbnN0OworICB2b2lkIGRlY29kZV9UZW1wbGF0ZTBfdW5vcHRfU2V0UGl4ZWwoQ0pCaWcyX0ltYWdlKiBHUlJFRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJWYWwpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IGRlY29kZV9UZW1wbGF0ZTBfb3B0KAorICAgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgIEpCaWcyQXJpdGhDdHgqIGdyQ29udGV4dCk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gZGVjb2RlX1RlbXBsYXRlMV91bm9wdCgKKyAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IGRlY29kZV9UZW1wbGF0ZTFfb3B0KAorICAgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgIEpCaWcyQXJpdGhDdHgqIGdyQ29udGV4dCk7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlhDT0RFQ19KQklHMl9KQklHMl9HUlJEUFJPQ19IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0dzaWRQcm9jLmNwcCBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9Hc2lkUHJvYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4N2Y4ZWUuLjAwMDAwMDAKLS0tIGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0dzaWRQcm9jLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3NpZFByb2MuaCIKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfQml0U3RyZWFtLmgiCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0dyZFByb2MuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0KLXVpbnQzMl90KiBDSkJpZzJfR1NJRFByb2M6OmRlY29kZV9Bcml0aChDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgewotICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0dSRFByb2M+IHBHUkQobmV3IENKQmlnMl9HUkRQcm9jKCkpOwotICBwR1JELT5NTVIgPSBHU01NUjsKLSAgcEdSRC0+R0JXID0gR1NXOwotICBwR1JELT5HQkggPSBHU0g7Ci0gIHBHUkQtPkdCVEVNUExBVEUgPSBHU1RFTVBMQVRFOwotICBwR1JELT5UUEdET04gPSAwOwotICBwR1JELT5VU0VTS0lQID0gR1NVU0VTS0lQOwotICBwR1JELT5TS0lQID0gR1NLSVA7Ci0gIGlmIChHU1RFTVBMQVRFIDw9IDEpIHsKLSAgICBwR1JELT5HQkFUWzBdID0gMzsKLSAgfSBlbHNlIHsKLSAgICBwR1JELT5HQkFUWzBdID0gMjsKLSAgfQotICBwR1JELT5HQkFUWzFdID0gLTE7Ci0gIGlmIChwR1JELT5HQlRFTVBMQVRFID09IDApIHsKLSAgICBwR1JELT5HQkFUWzJdID0gLTM7Ci0gICAgcEdSRC0+R0JBVFszXSA9IC0xOwotICAgIHBHUkQtPkdCQVRbNF0gPSAyOwotICAgIHBHUkQtPkdCQVRbNV0gPSAtMjsKLSAgICBwR1JELT5HQkFUWzZdID0gLTI7Ci0gICAgcEdSRC0+R0JBVFs3XSA9IC0yOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4+IEdTUExBTkVTKEdTQlBQKTsKLSAgZm9yIChpbnQzMl90IGkgPSBHU0JQUCAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0gICAgQ0pCaWcyX0ltYWdlKiBwSW1hZ2UgPSBudWxscHRyOwotICAgIEZYQ09ERUNfU1RBVFVTIHN0YXR1cyA9Ci0gICAgICAgIHBHUkQtPlN0YXJ0X2RlY29kZV9Bcml0aCgmcEltYWdlLCBwQXJpdGhEZWNvZGVyLCBnYkNvbnRleHQsIG51bGxwdHIpOwotICAgIHdoaWxlIChzdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkKLSAgICAgIHN0YXR1cyA9IHBHUkQtPkNvbnRpbnVlX2RlY29kZShwUGF1c2UpOwotCi0gICAgaWYgKCFwSW1hZ2UpCi0gICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIEdTUExBTkVTW2ldLnJlc2V0KHBJbWFnZSk7Ci0gICAgaWYgKGkgPCBHU0JQUCAtIDEpCi0gICAgICBwSW1hZ2UtPmNvbXBvc2VGcm9tKDAsIDAsIEdTUExBTkVTW2kgKyAxXS5nZXQoKSwgSkJJRzJfQ09NUE9TRV9YT1IpOwotICB9Ci0gIHN0ZDo6dW5pcXVlX3B0cjx1aW50MzJfdCwgRnhGcmVlRGVsZXRlcj4gR1NWQUxTKAotICAgICAgRlhfQWxsb2MyRCh1aW50MzJfdCwgR1NXLCBHU0gpKTsKLSAgSkJJRzJfbWVtc2V0KEdTVkFMUy5nZXQoKSwgMCwgc2l6ZW9mKHVpbnQzMl90KSAqIEdTVyAqIEdTSCk7Ci0gIGZvciAodWludDMyX3QgeSA9IDA7IHkgPCBHU0g7ICsreSkgewotICAgIGZvciAodWludDMyX3QgeCA9IDA7IHggPCBHU1c7ICsreCkgewotICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgR1NCUFA7ICsraSkKLSAgICAgICAgR1NWQUxTLmdldCgpW3kgKiBHU1cgKyB4XSB8PSBHU1BMQU5FU1tpXS0+Z2V0UGl4ZWwoeCwgeSkgPDwgaTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIEdTVkFMUy5yZWxlYXNlKCk7Ci19Ci0KLXVpbnQzMl90KiBDSkJpZzJfR1NJRFByb2M6OmRlY29kZV9NTVIoQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9HUkRQcm9jPiBwR1JEKG5ldyBDSkJpZzJfR1JEUHJvYygpKTsKLSAgcEdSRC0+TU1SID0gR1NNTVI7Ci0gIHBHUkQtPkdCVyA9IEdTVzsKLSAgcEdSRC0+R0JIID0gR1NIOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2UqPiBHU1BMQU5FUyhGWF9BbGxvYyhDSkJpZzJfSW1hZ2UqLCBHU0JQUCkpOwotICBKQklHMl9tZW1zZXQoR1NQTEFORVMuZ2V0KCksIDAsIHNpemVvZihDSkJpZzJfSW1hZ2UqKSAqIEdTQlBQKTsKLSAgcEdSRC0+U3RhcnRfZGVjb2RlX01NUigmR1NQTEFORVMuZ2V0KClbR1NCUFAgLSAxXSwgcFN0cmVhbSwgbnVsbHB0cik7Ci0gIGlmICghR1NQTEFORVMuZ2V0KClbR1NCUFAgLSAxXSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBwU3RyZWFtLT5hbGlnbkJ5dGUoKTsKLSAgcFN0cmVhbS0+b2Zmc2V0KDMpOwotICBpbnQzMl90IEogPSBHU0JQUCAtIDI7Ci0gIHdoaWxlIChKID49IDApIHsKLSAgICBwR1JELT5TdGFydF9kZWNvZGVfTU1SKCZHU1BMQU5FUy5nZXQoKVtKXSwgcFN0cmVhbSwgbnVsbHB0cik7Ci0gICAgaWYgKCFHU1BMQU5FUy5nZXQoKVtKXSkgewotICAgICAgZm9yIChpbnQzMl90IEsgPSBHU0JQUCAtIDE7IEsgPiBKOyAtLUspCi0gICAgICAgIGRlbGV0ZSBHU1BMQU5FUy5nZXQoKVtLXTsKLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICBwU3RyZWFtLT5hbGlnbkJ5dGUoKTsKLSAgICBwU3RyZWFtLT5vZmZzZXQoMyk7Ci0gICAgR1NQTEFORVMuZ2V0KClbSl0tPmNvbXBvc2VGcm9tKDAsIDAsIEdTUExBTkVTLmdldCgpW0ogKyAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJJRzJfQ09NUE9TRV9YT1IpOwotICAgIEogPSBKIC0gMTsKLSAgfQotICBzdGQ6OnVuaXF1ZV9wdHI8dWludDMyX3Q+IEdTVkFMUyhGWF9BbGxvYzJEKHVpbnQzMl90LCBHU1csIEdTSCkpOwotICBKQklHMl9tZW1zZXQoR1NWQUxTLmdldCgpLCAwLCBzaXplb2YodWludDMyX3QpICogR1NXICogR1NIKTsKLSAgZm9yICh1aW50MzJfdCB5ID0gMDsgeSA8IEdTSDsgKyt5KSB7Ci0gICAgZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IEdTVzsgKyt4KSB7Ci0gICAgICBmb3IgKEogPSAwOyBKIDwgR1NCUFA7ICsrSikgewotICAgICAgICBHU1ZBTFMuZ2V0KClbeSAqIEdTVyArIHhdIHw9IEdTUExBTkVTLmdldCgpW0pdLT5nZXRQaXhlbCh4LCB5KSA8PCBKOwotICAgICAgfQotICAgIH0KLSAgfQotICBmb3IgKEogPSAwOyBKIDwgR1NCUFA7ICsrSikgewotICAgIGRlbGV0ZSBHU1BMQU5FUy5nZXQoKVtKXTsKLSAgfQotICByZXR1cm4gR1NWQUxTLnJlbGVhc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9Hc2lkUHJvYy5oIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0dzaWRQcm9jLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNWRjMmQuLjAwMDAwMDAKLS0tIGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0dzaWRQcm9jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgQ09SRV9GWENPREVDX0pCSUcyX0pCSUcyX0dTSURQUk9DX0hfCi0jZGVmaW5lIENPUkVfRlhDT0RFQ19KQklHMl9KQklHMl9HU0lEUFJPQ19IXwotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLQotY2xhc3MgQ0pCaWcyX0FyaXRoRGVjb2RlcjsKLWNsYXNzIENKQmlnMl9CaXRTdHJlYW07Ci1jbGFzcyBDSkJpZzJfSW1hZ2U7Ci1jbGFzcyBJRlhfUGF1c2U7Ci1zdHJ1Y3QgSkJpZzJBcml0aEN0eDsKLQotY2xhc3MgQ0pCaWcyX0dTSURQcm9jIHsKLSBwdWJsaWM6Ci0gIHVpbnQzMl90KiBkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpOwotCi0gIHVpbnQzMl90KiBkZWNvZGVfTU1SKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sIElGWF9QYXVzZSogcFBhdXNlKTsKLQotIHB1YmxpYzoKLSAgYm9vbCBHU01NUjsKLSAgYm9vbCBHU1VTRVNLSVA7Ci0gIHVpbnQ4X3QgR1NCUFA7Ci0gIHVpbnQzMl90IEdTVzsKLSAgdWludDMyX3QgR1NIOwotICB1aW50OF90IEdTVEVNUExBVEU7Ci0gIENKQmlnMl9JbWFnZSogR1NLSVA7Ci19OwotCi0jZW5kaWYgIC8vIENPUkVfRlhDT0RFQ19KQklHMl9KQklHMl9HU0lEUFJPQ19IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0h0cmRQcm9jLmNwcCBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdHJkUHJvYy5jcHAKaW5kZXggMTIxYmYxZC4uYmQxZDkyZiAxMDA2NDQKLS0tIGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0h0cmRQcm9jLmNwcAorKysgYi9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHRyZFByb2MuY3BwCkBAIC02LDMwICs2LDI3IEBACiAKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHRyZFByb2MuaCIKIAotI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dXRpbGl0eT4KIAotI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9Hc2lkUHJvYy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfQml0U3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0dyZFByb2MuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKLUNKQmlnMl9JbWFnZSogQ0pCaWcyX0hUUkRQcm9jOjpkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgewotICB1aW50MzJfdCBuZywgbWc7Ci0gIGludDMyX3QgeCwgeTsKLSAgdWludDMyX3QgSEJQUDsKLSAgdWludDMyX3QqIEdJOworc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gQ0pCaWcyX0hUUkRQcm9jOjpkZWNvZGVfQXJpdGgoCisgICAgQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpIHsKICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gSFNLSVA7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IEhUUkVHKG5ldyBDSkJpZzJfSW1hZ2UoSEJXLCBIQkgpKTsKLSAgSFRSRUctPmZpbGwoSERFRlBJWEVMKTsKICAgaWYgKEhFTkFCTEVTS0lQID09IDEpIHsKICAgICBIU0tJUCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSW1hZ2U+KEhHVywgSEdIKTsKLSAgICBmb3IgKG1nID0gMDsgbWcgPCBIR0g7IG1nKyspIHsKLSAgICAgIGZvciAobmcgPSAwOyBuZyA8IEhHVzsgbmcrKykgewotICAgICAgICB4ID0gKEhHWCArIG1nICogSFJZICsgbmcgKiBIUlgpID4+IDg7Ci0gICAgICAgIHkgPSAoSEdZICsgbWcgKiBIUlggLSBuZyAqIEhSWSkgPj4gODsKLSAgICAgICAgaWYgKCh4ICsgSFBXIDw9IDApIHwgKHggPj0gKGludDMyX3QpSEJXKSB8ICh5ICsgSFBIIDw9IDApIHwKLSAgICAgICAgICAgICh5ID49IChpbnQzMl90KUhQSCkpIHsKKyAgICBmb3IgKHVpbnQzMl90IG1nID0gMDsgbWcgPCBIR0g7ICsrbWcpIHsKKyAgICAgIGZvciAodWludDMyX3QgbmcgPSAwOyBuZyA8IEhHVzsgKytuZykgeworICAgICAgICBpbnQzMl90IHggPSAoSEdYICsgbWcgKiBIUlkgKyBuZyAqIEhSWCkgPj4gODsKKyAgICAgICAgaW50MzJfdCB5ID0gKEhHWSArIG1nICogSFJYIC0gbmcgKiBIUlkpID4+IDg7CisgICAgICAgIGlmICgoeCArIEhQVyA8PSAwKSB8ICh4ID49IHN0YXRpY19jYXN0PGludDMyX3Q+KEhCVykpIHwgKHkgKyBIUEggPD0gMCkgfAorICAgICAgICAgICAgKHkgPj0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oSFBIKSkpIHsKICAgICAgICAgICBIU0tJUC0+c2V0UGl4ZWwobmcsIG1nLCAxKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBIU0tJUC0+c2V0UGl4ZWwobmcsIG1nLCAwKTsKQEAgLTM3LDY5ICszNCwxMDAgQEAKICAgICAgIH0KICAgICB9CiAgIH0KLSAgSEJQUCA9IDE7Ci0gIHdoaWxlICgodWludDMyX3QpKDEgPDwgSEJQUCkgPCBITlVNUEFUUykgewotICAgIEhCUFArKzsKLSAgfQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0dTSURQcm9jPiBwR0lEKG5ldyBDSkJpZzJfR1NJRFByb2MoKSk7Ci0gIHBHSUQtPkdTTU1SID0gSE1NUjsKLSAgcEdJRC0+R1NXID0gSEdXOwotICBwR0lELT5HU0ggPSBIR0g7Ci0gIHBHSUQtPkdTQlBQID0gKHVpbnQ4X3QpSEJQUDsKLSAgcEdJRC0+R1NVU0VTS0lQID0gSEVOQUJMRVNLSVA7Ci0gIHBHSUQtPkdTS0lQID0gSFNLSVAuZ2V0KCk7Ci0gIHBHSUQtPkdTVEVNUExBVEUgPSBIVEVNUExBVEU7Ci0gIEdJID0gcEdJRC0+ZGVjb2RlX0FyaXRoKHBBcml0aERlY29kZXIsIGdiQ29udGV4dCwgcFBhdXNlKTsKLSAgaWYgKCFHSSkKLSAgICByZXR1cm4gbnVsbHB0cjsKKyAgdWludDMyX3QgSEJQUCA9IDE7CisgIHdoaWxlIChzdGF0aWNfY2FzdDx1aW50MzJfdD4oMSA8PCBIQlBQKSA8IEhOVU1QQVRTKQorICAgICsrSEJQUDsKIAotICBmb3IgKG1nID0gMDsgbWcgPCBIR0g7IG1nKyspIHsKLSAgICBmb3IgKG5nID0gMDsgbmcgPCBIR1c7IG5nKyspIHsKLSAgICAgIHggPSAoSEdYICsgbWcgKiBIUlkgKyBuZyAqIEhSWCkgPj4gODsKLSAgICAgIHkgPSAoSEdZICsgbWcgKiBIUlggLSBuZyAqIEhSWSkgPj4gODsKLSAgICAgIHVpbnQzMl90IHBhdF9pbmRleCA9IEdJW21nICogSEdXICsgbmddOwotICAgICAgaWYgKHBhdF9pbmRleCA+PSBITlVNUEFUUykgewotICAgICAgICBwYXRfaW5kZXggPSBITlVNUEFUUyAtIDE7Ci0gICAgICB9Ci0gICAgICBIVFJFRy0+Y29tcG9zZUZyb20oeCwgeSwgSFBBVFNbcGF0X2luZGV4XSwgSENPTUJPUCk7Ci0gICAgfQorICBDSkJpZzJfR1JEUHJvYyBHUkQ7CisgIEdSRC5NTVIgPSBITU1SOworICBHUkQuR0JXID0gSEdXOworICBHUkQuR0JIID0gSEdIOworICBHUkQuR0JURU1QTEFURSA9IEhURU1QTEFURTsKKyAgR1JELlRQR0RPTiA9IDA7CisgIEdSRC5VU0VTS0lQID0gSEVOQUJMRVNLSVA7CisgIEdSRC5TS0lQID0gSFNLSVAuZ2V0KCk7CisgIGlmIChIVEVNUExBVEUgPD0gMSkKKyAgICBHUkQuR0JBVFswXSA9IDM7CisgIGVsc2UKKyAgICBHUkQuR0JBVFswXSA9IDI7CisgIEdSRC5HQkFUWzFdID0gLTE7CisgIGlmIChHUkQuR0JURU1QTEFURSA9PSAwKSB7CisgICAgR1JELkdCQVRbMl0gPSAtMzsKKyAgICBHUkQuR0JBVFszXSA9IC0xOworICAgIEdSRC5HQkFUWzRdID0gMjsKKyAgICBHUkQuR0JBVFs1XSA9IC0yOworICAgIEdSRC5HQkFUWzZdID0gLTI7CisgICAgR1JELkdCQVRbN10gPSAtMjsKICAgfQotICBGWF9GcmVlKEdJKTsKLSAgcmV0dXJuIEhUUkVHLnJlbGVhc2UoKTsKKworICB1aW50OF90IEdTQlBQID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oSEJQUCk7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+PiBHU1BMQU5FUyhHU0JQUCk7CisgIGZvciAoaW50MzJfdCBpID0gR1NCUFAgLSAxOyBpID49IDA7IC0taSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IHBJbWFnZTsKKyAgICBGWENPREVDX1NUQVRVUyBzdGF0dXMgPQorICAgICAgICBHUkQuU3RhcnRfZGVjb2RlX0FyaXRoKCZwSW1hZ2UsIHBBcml0aERlY29kZXIsIGdiQ29udGV4dCwgbnVsbHB0cik7CisgICAgd2hpbGUgKHN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKQorICAgICAgc3RhdHVzID0gR1JELkNvbnRpbnVlX2RlY29kZShwUGF1c2UsIHBBcml0aERlY29kZXIpOworCisgICAgaWYgKCFwSW1hZ2UpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIEdTUExBTkVTW2ldID0gc3RkOjptb3ZlKHBJbWFnZSk7CisgICAgaWYgKGkgPCBHU0JQUCAtIDEpCisgICAgICBHU1BMQU5FU1tpXS0+Y29tcG9zZUZyb20oMCwgMCwgR1NQTEFORVNbaSArIDFdLmdldCgpLCBKQklHMl9DT01QT1NFX1hPUik7CisgIH0KKyAgcmV0dXJuIGRlY29kZV9pbWFnZShHU1BMQU5FUyk7CiB9CiAKLUNKQmlnMl9JbWFnZSogQ0pCaWcyX0hUUkRQcm9jOjpkZWNvZGVfTU1SKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSkgewotICB1aW50MzJfdCBuZywgbWc7Ci0gIGludDMyX3QgeCwgeTsKLSAgdWludDMyX3QqIEdJOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBIVFJFRyhuZXcgQ0pCaWcyX0ltYWdlKEhCVywgSEJIKSk7Ci0gIEhUUkVHLT5maWxsKEhERUZQSVhFTCk7CitzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBDSkJpZzJfSFRSRFByb2M6OmRlY29kZV9NTVIoCisgICAgQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSkgewogICB1aW50MzJfdCBIQlBQID0gMTsKLSAgd2hpbGUgKCh1aW50MzJfdCkoMSA8PCBIQlBQKSA8IEhOVU1QQVRTKSB7Ci0gICAgSEJQUCsrOwotICB9Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfR1NJRFByb2M+IHBHSUQobmV3IENKQmlnMl9HU0lEUHJvYygpKTsKLSAgcEdJRC0+R1NNTVIgPSBITU1SOwotICBwR0lELT5HU1cgPSBIR1c7Ci0gIHBHSUQtPkdTSCA9IEhHSDsKLSAgcEdJRC0+R1NCUFAgPSAodWludDhfdClIQlBQOwotICBwR0lELT5HU1VTRVNLSVAgPSAwOwotICBHSSA9IHBHSUQtPmRlY29kZV9NTVIocFN0cmVhbSwgcFBhdXNlKTsKLSAgaWYgKCFHSSkKKyAgd2hpbGUgKHN0YXRpY19jYXN0PHVpbnQzMl90PigxIDw8IEhCUFApIDwgSE5VTVBBVFMpCisgICAgKytIQlBQOworCisgIENKQmlnMl9HUkRQcm9jIEdSRDsKKyAgR1JELk1NUiA9IEhNTVI7CisgIEdSRC5HQlcgPSBIR1c7CisgIEdSRC5HQkggPSBIR0g7CisKKyAgdWludDhfdCBHU0JQUCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KEhCUFApOworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPj4gR1NQTEFORVMoR1NCUFApOworICBHUkQuU3RhcnRfZGVjb2RlX01NUigmR1NQTEFORVNbR1NCUFAgLSAxXSwgcFN0cmVhbSk7CisgIGlmICghR1NQTEFORVNbR1NCUFAgLSAxXSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAotICBmb3IgKG1nID0gMDsgbWcgPCBIR0g7IG1nKyspIHsKLSAgICBmb3IgKG5nID0gMDsgbmcgPCBIR1c7IG5nKyspIHsKLSAgICAgIHggPSAoSEdYICsgbWcgKiBIUlkgKyBuZyAqIEhSWCkgPj4gODsKLSAgICAgIHkgPSAoSEdZICsgbWcgKiBIUlggLSBuZyAqIEhSWSkgPj4gODsKLSAgICAgIHVpbnQzMl90IHBhdF9pbmRleCA9IEdJW21nICogSEdXICsgbmddOwotICAgICAgaWYgKHBhdF9pbmRleCA+PSBITlVNUEFUUykgewotICAgICAgICBwYXRfaW5kZXggPSBITlVNUEFUUyAtIDE7Ci0gICAgICB9Ci0gICAgICBIVFJFRy0+Y29tcG9zZUZyb20oeCwgeSwgSFBBVFNbcGF0X2luZGV4XSwgSENPTUJPUCk7CisgIHBTdHJlYW0tPmFsaWduQnl0ZSgpOworICBwU3RyZWFtLT5vZmZzZXQoMyk7CisgIGZvciAoaW50MzJfdCBKID0gR1NCUFAgLSAyOyBKID49IDA7IC0tSikgeworICAgIEdSRC5TdGFydF9kZWNvZGVfTU1SKCZHU1BMQU5FU1tKXSwgcFN0cmVhbSk7CisgICAgaWYgKCFHU1BMQU5FU1tKXSkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgcFN0cmVhbS0+YWxpZ25CeXRlKCk7CisgICAgcFN0cmVhbS0+b2Zmc2V0KDMpOworICAgIEdTUExBTkVTW0pdLT5jb21wb3NlRnJvbSgwLCAwLCBHU1BMQU5FU1tKICsgMV0uZ2V0KCksIEpCSUcyX0NPTVBPU0VfWE9SKTsKKyAgfQorICByZXR1cm4gZGVjb2RlX2ltYWdlKEdTUExBTkVTKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gQ0pCaWcyX0hUUkRQcm9jOjpkZWNvZGVfaW1hZ2UoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4+JiBHU1BMQU5FUykgeworICBhdXRvIEhUUkVHID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9JbWFnZT4oSEJXLCBIQkgpOworICBIVFJFRy0+ZmlsbChIREVGUElYRUwpOworICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gR1NWQUxTKEhHVyAqIEhHSCk7CisgIGZvciAodWludDMyX3QgeSA9IDA7IHkgPCBIR0g7ICsreSkgeworICAgIGZvciAodWludDMyX3QgeCA9IDA7IHggPCBIR1c7ICsreCkgeworICAgICAgZm9yICh1aW50OF90IEogPSAwOyBKIDwgR1NQTEFORVMuc2l6ZSgpOyArK0opCisgICAgICAgIEdTVkFMU1t5ICogSEdXICsgeF0gfD0gR1NQTEFORVNbSl0tPmdldFBpeGVsKHgsIHkpIDw8IEo7CiAgICAgfQogICB9Ci0gIEZYX0ZyZWUoR0kpOwotICByZXR1cm4gSFRSRUcucmVsZWFzZSgpOworICBmb3IgKHVpbnQzMl90IG1nID0gMDsgbWcgPCBIR0g7ICsrbWcpIHsKKyAgICBmb3IgKHVpbnQzMl90IG5nID0gMDsgbmcgPCBIR1c7ICsrbmcpIHsKKyAgICAgIGludDMyX3QgeCA9IChIR1ggKyBtZyAqIEhSWSArIG5nICogSFJYKSA+PiA4OworICAgICAgaW50MzJfdCB5ID0gKEhHWSArIG1nICogSFJYIC0gbmcgKiBIUlkpID4+IDg7CisgICAgICB1aW50MzJfdCBwYXRfaW5kZXggPSBzdGQ6Om1pbihHU1ZBTFNbbWcgKiBIR1cgKyBuZ10sIEhOVU1QQVRTIC0gMSk7CisgICAgICBIVFJFRy0+Y29tcG9zZUZyb20oeCwgeSwgKCpIUEFUUylbcGF0X2luZGV4XS5nZXQoKSwgSENPTUJPUCk7CisgICAgfQorICB9CisgIHJldHVybiBIVFJFRzsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdHJkUHJvYy5oIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0h0cmRQcm9jLmgKaW5kZXggOWE5YTVjNS4uZWQ3Y2RiZiAxMDA2NDQKLS0tIGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0h0cmRQcm9jLmgKKysrIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0h0cmRQcm9jLmgKQEAgLTcsMjEgKzcsMjQgQEAKICNpZm5kZWYgQ09SRV9GWENPREVDX0pCSUcyX0pCSUcyX0hUUkRQUk9DX0hfCiAjZGVmaW5lIENPUkVfRlhDT0RFQ19KQklHMl9KQklHMl9IVFJEUFJPQ19IXwogCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKwogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9JbWFnZS5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCiAKIGNsYXNzIENKQmlnMl9Bcml0aERlY29kZXI7CiBjbGFzcyBDSkJpZzJfQml0U3RyZWFtOwotY2xhc3MgSUZYX1BhdXNlOworY2xhc3MgSUZYX1BhdXNlSW5kaWNhdG9yOwogc3RydWN0IEpCaWcyQXJpdGhDdHg7CiAKIGNsYXNzIENKQmlnMl9IVFJEUHJvYyB7CiAgcHVibGljOgotICBDSkJpZzJfSW1hZ2UqIGRlY29kZV9Bcml0aChDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gZGVjb2RlX0FyaXRoKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CiAKLSAgQ0pCaWcyX0ltYWdlKiBkZWNvZGVfTU1SKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gZGVjb2RlX01NUihDSkJpZzJfQml0U3RyZWFtKiBwU3RyZWFtKTsKIAogIHB1YmxpYzoKICAgdWludDMyX3QgSEJXOwpAQCAtMjksNyArMzIsNyBAQAogICBib29sIEhNTVI7CiAgIHVpbnQ4X3QgSFRFTVBMQVRFOwogICB1aW50MzJfdCBITlVNUEFUUzsKLSAgQ0pCaWcyX0ltYWdlKiogSFBBVFM7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+PiogSFBBVFM7CiAgIGJvb2wgSERFRlBJWEVMOwogICBKQmlnMkNvbXBvc2VPcCBIQ09NQk9QOwogICBib29sIEhFTkFCTEVTS0lQOwpAQCAtNDEsNiArNDQsMTAgQEAKICAgdWludDE2X3QgSFJZOwogICB1aW50OF90IEhQVzsKICAgdWludDhfdCBIUEg7CisKKyBwcml2YXRlOgorICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBkZWNvZGVfaW1hZ2UoCisgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPj4mIEdTUExBTkVTKTsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9GWENPREVDX0pCSUcyX0pCSUcyX0hUUkRQUk9DX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hbkRlY29kZXIuaCBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuRGVjb2Rlci5oCmluZGV4IGM3MjM0NmEuLmFjNTNiNGQgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuRGVjb2Rlci5oCisrKyBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuRGVjb2Rlci5oCkBAIC05LDYgKzksOCBAQAogCiAjaW5jbHVkZSAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0JpdFN0cmVhbS5oIgogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisKIGNsYXNzIENKQmlnMl9IdWZmbWFuRGVjb2RlciB7CiAgcHVibGljOgogICBleHBsaWNpdCBDSkJpZzJfSHVmZm1hbkRlY29kZXIoQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSk7CkBAIC0xOCw3ICsyMCw3IEBACiAgIGludCBkZWNvZGVBVmFsdWUoQ0pCaWcyX0h1ZmZtYW5UYWJsZSogcFRhYmxlLCBpbnQqIG5SZXN1bHQpOwogCiAgcHJpdmF0ZToKLSAgQ0pCaWcyX0JpdFN0cmVhbSogY29uc3QgbV9wU3RyZWFtOworICBVbm93bmVkUHRyPENKQmlnMl9CaXRTdHJlYW0+IGNvbnN0IG1fcFN0cmVhbTsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9GWENPREVDX0pCSUcyX0pCSUcyX0hVRkZNQU5ERUNPREVSX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlLmNwcCBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGUuY3BwCmluZGV4IGJhZjk3NTYuLjExMjdmNTIgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGUuY3BwCisrKyBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGUuY3BwCkBAIC03LDYgKzcsNyBAQAogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGUuaCIKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxsaW1pdHM+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0JpdFN0cmVhbS5oIgpAQCAtNTIsNyArNTMsOSBAQAogICB1aW50MzJfdCBIVExPVzsKICAgdWludDMyX3QgSFRISUdIOwogICBpZiAocFN0cmVhbS0+cmVhZEludGVnZXIoJkhUTE9XKSA9PSAtMSB8fAotICAgICAgcFN0cmVhbS0+cmVhZEludGVnZXIoJkhUSElHSCkgPT0gLTEpIHsKKyAgICAgIHBTdHJlYW0tPnJlYWRJbnRlZ2VyKCZIVEhJR0gpID09IC0xIHx8CisgICAgICBIVExPVyA+IHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpKSB8fAorICAgICAgSFRISUdIID4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkpKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKQEAgLTcwLDYgKzczLDEwIEBACiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIFJBTkdFTE9XW05URU1QXSA9IGN1cl9sb3cuVmFsdWVPckRpZSgpOworCisgICAgaWYgKFJBTkdFTEVOW05URU1QXSA+PSAzMikKKyAgICAgIHJldHVybiBmYWxzZTsKKwogICAgIGN1cl9sb3cgKz0gKDEgPDwgUkFOR0VMRU5bTlRFTVBdKTsKICAgICBpZiAoIWN1cl9sb3cuSXNWYWxpZCgpKQogICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtOTcsMTEgKzEwNCwxMCBAQAogICAgICsrTlRFTVA7CiAgIH0KIAotICBJbml0Q29kZXMoKTsKLSAgcmV0dXJuIHRydWU7CisgIHJldHVybiBJbml0Q29kZXMoKTsKIH0KIAotdm9pZCBDSkJpZzJfSHVmZm1hblRhYmxlOjpJbml0Q29kZXMoKSB7Citib29sIENKQmlnMl9IdWZmbWFuVGFibGU6OkluaXRDb2RlcygpIHsKICAgaW50IGxlbm1heCA9IDA7CiAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBOVEVNUDsgKytpKQogICAgIGxlbm1heCA9IHN0ZDo6bWF4KFBSRUZMRU5baV0sIGxlbm1heCk7CkBAIC0xMTUsMTMgKzEyMSwyMSBAQAogICBGSVJTVENPREVbMF0gPSAwOwogICBMRU5DT1VOVFswXSA9IDA7CiAgIGZvciAoaW50IGkgPSAxOyBpIDw9IGxlbm1heDsgKytpKSB7Ci0gICAgRklSU1RDT0RFW2ldID0gKEZJUlNUQ09ERVtpIC0gMV0gKyBMRU5DT1VOVFtpIC0gMV0pIDw8IDE7CisgICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQ+IHNoaWZ0ZWQ7CisgICAgc2hpZnRlZCA9IEZJUlNUQ09ERVtpIC0gMV0gKyBMRU5DT1VOVFtpIC0gMV07CisgICAgc2hpZnRlZCA8PD0gMTsKKyAgICBpZiAoIXNoaWZ0ZWQuSXNWYWxpZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgRklSU1RDT0RFW2ldID0gc2hpZnRlZC5WYWx1ZU9yRGllKCk7CiAgICAgaW50IENVUkNPREUgPSBGSVJTVENPREVbaV07CiAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IE5URU1QOyArK2opIHsKICAgICAgIGlmIChQUkVGTEVOW2pdID09IGkpCiAgICAgICAgIENPREVTW2pdID0gQ1VSQ09ERSsrOwogICAgIH0KICAgfQorCisgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIENKQmlnMl9IdWZmbWFuVGFibGU6OkV4dGVuZEJ1ZmZlcnMoYm9vbCBpbmNyZW1lbnQpIHsKZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGUuaCBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGUuaAppbmRleCA1OGEzMTI0Li5iNDlmY2ViIDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlLmgKKysrIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZS5oCkBAIC0zNSw3ICszNSw3IEBACiAgcHJpdmF0ZToKICAgdm9pZCBQYXJzZUZyb21TdGFuZGFyZFRhYmxlKGNvbnN0IEpCaWcyVGFibGVMaW5lKiBwVGFibGUpOwogICBib29sIFBhcnNlRnJvbUNvZGVkQnVmZmVyKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0pOwotICB2b2lkIEluaXRDb2RlcygpOworICBib29sIEluaXRDb2RlcygpOwogICB2b2lkIEV4dGVuZEJ1ZmZlcnMoYm9vbCBpbmNyZW1lbnQpOwogCiAgIGJvb2wgbV9iT0s7CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlX1N0YW5kYXJkLmNwcCBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGVfU3RhbmRhcmQuY3BwCmluZGV4IDRjMmJhOTkuLmFiZmY3ODYgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGVfU3RhbmRhcmQuY3BwCisrKyBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGVfU3RhbmRhcmQuY3BwCkBAIC01LDcgKzUsOCBAQAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGVfU3RhbmRhcmQuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgogCiBjb25zdCBib29sIEh1ZmZtYW5UYWJsZV9IVE9PQl9CMSA9IGZhbHNlOwogY29uc3QgSkJpZzJUYWJsZUxpbmUgSHVmZm1hblRhYmxlX0IxW10gPSB7ezEsIDQsIDB9LApkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlLmNwcCBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9JbWFnZS5jcHAKaW5kZXggOGY5MzVjZS4uYjBkNzVkNCAxMDA2NDQKLS0tIGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlLmNwcAorKysgYi9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuY3BwCkBAIC00LDExICs0LDE3IEBACiAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuaCIKKwogI2luY2x1ZGUgPGxpbWl0cy5oPgogCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKwogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc2FmZV90eXBlcy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAogbmFtZXNwYWNlIHsKIApAQCAtMTgsMTEgKzI0LDcgQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBDSkJpZzJfSW1hZ2U6OkNKQmlnMl9JbWFnZShpbnQzMl90IHcsIGludDMyX3QgaCkKLSAgICA6IG1fcERhdGEobnVsbHB0ciksCi0gICAgICBtX25XaWR0aCgwKSwKLSAgICAgIG1fbkhlaWdodCgwKSwKLSAgICAgIG1fblN0cmlkZSgwKSwKLSAgICAgIG1fYk93bnNCdWZmZXIodHJ1ZSkgeworICAgIDogbV9wRGF0YShudWxscHRyKSwgbV9uV2lkdGgoMCksIG1fbkhlaWdodCgwKSwgbV9uU3RyaWRlKDApIHsKICAgaWYgKHcgPD0gMCB8fCBoIDw9IDAgfHwgdyA+IGtNYXhJbWFnZVBpeGVscykKICAgICByZXR1cm47CiAKQEAgLTMzLDE1ICszNSwxMiBAQAogICBtX25XaWR0aCA9IHc7CiAgIG1fbkhlaWdodCA9IGg7CiAgIG1fblN0cmlkZSA9IHN0cmlkZV9waXhlbHMgLyA4OwotICBtX3BEYXRhID0gRlhfQWxsb2MyRCh1aW50OF90LCBtX25TdHJpZGUsIG1fbkhlaWdodCk7CisgIG1fcERhdGEuUmVzZXQoc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+KAorICAgICAgRlhfQWxsb2MyRCh1aW50OF90LCBtX25TdHJpZGUsIG1fbkhlaWdodCkpKTsKIH0KIAogQ0pCaWcyX0ltYWdlOjpDSkJpZzJfSW1hZ2UoaW50MzJfdCB3LCBpbnQzMl90IGgsIGludDMyX3Qgc3RyaWRlLCB1aW50OF90KiBwQnVmKQotICAgIDogbV9wRGF0YShudWxscHRyKSwKLSAgICAgIG1fbldpZHRoKDApLAotICAgICAgbV9uSGVpZ2h0KDApLAotICAgICAgbV9uU3RyaWRlKDApLAotICAgICAgbV9iT3duc0J1ZmZlcihmYWxzZSkgeworICAgIDogbV9wRGF0YShudWxscHRyKSwgbV9uV2lkdGgoMCksIG1fbkhlaWdodCgwKSwgbV9uU3RyaWRlKDApIHsKICAgaWYgKHcgPCAwIHx8IGggPCAwIHx8IHN0cmlkZSA8IDAgfHwgc3RyaWRlID4ga01heEltYWdlQnl0ZXMpCiAgICAgcmV0dXJuOwogCkBAIC01MiwyOCArNTEsMjQgQEAKICAgbV9uV2lkdGggPSB3OwogICBtX25IZWlnaHQgPSBoOwogICBtX25TdHJpZGUgPSBzdHJpZGU7Ci0gIG1fcERhdGEgPSBwQnVmOworICBtX3BEYXRhLlJlc2V0KHBCdWYpOwogfQogCiBDSkJpZzJfSW1hZ2U6OkNKQmlnMl9JbWFnZShjb25zdCBDSkJpZzJfSW1hZ2UmIG90aGVyKQogICAgIDogbV9wRGF0YShudWxscHRyKSwKICAgICAgIG1fbldpZHRoKG90aGVyLm1fbldpZHRoKSwKICAgICAgIG1fbkhlaWdodChvdGhlci5tX25IZWlnaHQpLAotICAgICAgbV9uU3RyaWRlKG90aGVyLm1fblN0cmlkZSksCi0gICAgICBtX2JPd25zQnVmZmVyKHRydWUpIHsKKyAgICAgIG1fblN0cmlkZShvdGhlci5tX25TdHJpZGUpIHsKICAgaWYgKG90aGVyLm1fcERhdGEpIHsKLSAgICBtX3BEYXRhID0gRlhfQWxsb2MyRCh1aW50OF90LCBtX25TdHJpZGUsIG1fbkhlaWdodCk7Ci0gICAgSkJJRzJfbWVtY3B5KG1fcERhdGEsIG90aGVyLm1fcERhdGEsIG1fblN0cmlkZSAqIG1fbkhlaWdodCk7CisgICAgbV9wRGF0YS5SZXNldChzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4oCisgICAgICAgIEZYX0FsbG9jMkQodWludDhfdCwgbV9uU3RyaWRlLCBtX25IZWlnaHQpKSk7CisgICAgSkJJRzJfbWVtY3B5KGRhdGEoKSwgb3RoZXIuZGF0YSgpLCBtX25TdHJpZGUgKiBtX25IZWlnaHQpOwogICB9CiB9CiAKLUNKQmlnMl9JbWFnZTo6fkNKQmlnMl9JbWFnZSgpIHsKLSAgaWYgKG1fYk93bnNCdWZmZXIpIHsKLSAgICBGWF9GcmVlKG1fcERhdGEpOwotICB9Ci19CitDSkJpZzJfSW1hZ2U6On5DSkJpZzJfSW1hZ2UoKSB7fQogCi1pbnQgQ0pCaWcyX0ltYWdlOjpnZXRQaXhlbChpbnQzMl90IHgsIGludDMyX3QgeSkgeworaW50IENKQmlnMl9JbWFnZTo6Z2V0UGl4ZWwoaW50MzJfdCB4LCBpbnQzMl90IHkpIGNvbnN0IHsKICAgaWYgKCFtX3BEYXRhKQogICAgIHJldHVybiAwOwogCkBAIC04NSw3ICs4MCw3IEBACiAKICAgaW50MzJfdCBtID0geSAqIG1fblN0cmlkZSArICh4ID4+IDMpOwogICBpbnQzMl90IG4gPSB4ICYgNzsKLSAgcmV0dXJuICgobV9wRGF0YVttXSA+PiAoNyAtIG4pKSAmIDEpOworICByZXR1cm4gKChkYXRhKClbbV0gPj4gKDcgLSBuKSkgJiAxKTsKIH0KIAogaW50MzJfdCBDSkJpZzJfSW1hZ2U6OnNldFBpeGVsKGludDMyX3QgeCwgaW50MzJfdCB5LCBpbnQgdikgewpAQCAtMTAxLDM3ICs5NiwzNyBAQAogICBpbnQzMl90IG0gPSB5ICogbV9uU3RyaWRlICsgKHggPj4gMyk7CiAgIGludDMyX3QgbiA9IHggJiA3OwogICBpZiAodikKLSAgICBtX3BEYXRhW21dIHw9IDEgPDwgKDcgLSBuKTsKKyAgICBkYXRhKClbbV0gfD0gMSA8PCAoNyAtIG4pOwogICBlbHNlCi0gICAgbV9wRGF0YVttXSAmPSB+KDEgPDwgKDcgLSBuKSk7CisgICAgZGF0YSgpW21dICY9IH4oMSA8PCAoNyAtIG4pKTsKIAogICByZXR1cm4gMTsKIH0KIAogdm9pZCBDSkJpZzJfSW1hZ2U6OmNvcHlMaW5lKGludDMyX3QgaFRvLCBpbnQzMl90IGhGcm9tKSB7Ci0gIGlmICghbV9wRGF0YSkgeworICBpZiAoIW1fcERhdGEpCiAgICAgcmV0dXJuOwotICB9CisKICAgaWYgKGhGcm9tIDwgMCB8fCBoRnJvbSA+PSBtX25IZWlnaHQpIHsKLSAgICBKQklHMl9tZW1zZXQobV9wRGF0YSArIGhUbyAqIG1fblN0cmlkZSwgMCwgbV9uU3RyaWRlKTsKKyAgICBKQklHMl9tZW1zZXQoZGF0YSgpICsgaFRvICogbV9uU3RyaWRlLCAwLCBtX25TdHJpZGUpOwogICB9IGVsc2UgewotICAgIEpCSUcyX21lbWNweShtX3BEYXRhICsgaFRvICogbV9uU3RyaWRlLCBtX3BEYXRhICsgaEZyb20gKiBtX25TdHJpZGUsCisgICAgSkJJRzJfbWVtY3B5KGRhdGEoKSArIGhUbyAqIG1fblN0cmlkZSwgZGF0YSgpICsgaEZyb20gKiBtX25TdHJpZGUsCiAgICAgICAgICAgICAgICAgIG1fblN0cmlkZSk7CiAgIH0KIH0KIHZvaWQgQ0pCaWcyX0ltYWdlOjpmaWxsKGJvb2wgdikgewotICBpZiAoIW1fcERhdGEpIHsKKyAgaWYgKCFtX3BEYXRhKQogICAgIHJldHVybjsKLSAgfQotICBKQklHMl9tZW1zZXQobV9wRGF0YSwgdiA/IDB4ZmYgOiAwLCBtX25TdHJpZGUgKiBtX25IZWlnaHQpOworCisgIEpCSUcyX21lbXNldChkYXRhKCksIHYgPyAweGZmIDogMCwgbV9uU3RyaWRlICogbV9uSGVpZ2h0KTsKIH0KIGJvb2wgQ0pCaWcyX0ltYWdlOjpjb21wb3NlVG8oQ0pCaWcyX0ltYWdlKiBwRHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJDb21wb3NlT3Agb3ApIHsKLSAgaWYgKCFtX3BEYXRhKSB7CisgIGlmICghbV9wRGF0YSkKICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KKwogICByZXR1cm4gY29tcG9zZVRvX29wdDIocERzdCwgeCwgeSwgb3ApOwogfQogYm9vbCBDSkJpZzJfSW1hZ2U6OmNvbXBvc2VUbyhDSkJpZzJfSW1hZ2UqIHBEc3QsCkBAIC0xNTIsOSArMTQ3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pCaWcyX0ltYWdlKiBwU3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQ29tcG9zZU9wIG9wKSB7Ci0gIGlmICghbV9wRGF0YSkgeworICBpZiAoIW1fcERhdGEpCiAgICAgcmV0dXJuIGZhbHNlOwotICB9CisKICAgcmV0dXJuIHBTcmMtPmNvbXBvc2VUbyh0aGlzLCB4LCB5LCBvcCk7CiB9CiBib29sIENKQmlnMl9JbWFnZTo6Y29tcG9zZUZyb20oaW50MzJfdCB4LApAQCAtMTYyLDM0ICsxNTcsMzkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSkJpZzJfSW1hZ2UqIHBTcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJDb21wb3NlT3Agb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QpIHsKLSAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBwU3JjLT5jb21wb3NlVG8odGhpcywgeCwgeSwgb3AsIHBTcmNSZWN0KTsKKyAgcmV0dXJuIG1fcERhdGEgPyBwU3JjLT5jb21wb3NlVG8odGhpcywgeCwgeSwgb3AsIHBTcmNSZWN0KSA6IGZhbHNlOwogfQorCiAjZGVmaW5lIEpCSUcyX0dFVERXT1JEKGJ1ZikgXAogICAoKHVpbnQzMl90KSgoKGJ1ZilbMF0gPDwgMjQpIHwgKChidWYpWzFdIDw8IDE2KSB8ICgoYnVmKVsyXSA8PCA4KSB8IChidWYpWzNdKSkKLUNKQmlnMl9JbWFnZSogQ0pCaWcyX0ltYWdlOjpzdWJJbWFnZShpbnQzMl90IHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGgpIHsKLSAgaW50MzJfdCBtLCBuLCBqOwotICB1aW50OF90ICpwTGluZVNyYywgKnBMaW5lRHN0OworCitzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBDSkJpZzJfSW1hZ2U6OnN1YkltYWdlKGludDMyX3QgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaCkgeworICBpbnQzMl90IG07CisgIGludDMyX3QgbjsKKyAgaW50MzJfdCBqOworICB1aW50OF90KiBwTGluZVNyYzsKKyAgdWludDhfdCogcExpbmVEc3Q7CiAgIHVpbnQzMl90IHdUbXA7Ci0gIHVpbnQ4X3QgKnBTcmMsICpwU3JjRW5kLCAqcERzdCwgKnBEc3RFbmQ7Ci0gIGlmICh3ID09IDAgfHwgaCA9PSAwKSB7CisgIHVpbnQ4X3QqIHBTcmM7CisgIHVpbnQ4X3QqIHBTcmNFbmQ7CisgIHVpbnQ4X3QqIHBEc3Q7CisgIHVpbnQ4X3QqIHBEc3RFbmQ7CisgIGlmICh3ID09IDAgfHwgaCA9PSAwKQogICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIENKQmlnMl9JbWFnZSogcEltYWdlID0gbmV3IENKQmlnMl9JbWFnZSh3LCBoKTsKKworICBhdXRvIHBJbWFnZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSW1hZ2U+KHcsIGgpOwogICBpZiAoIW1fcERhdGEpIHsKICAgICBwSW1hZ2UtPmZpbGwoMCk7CiAgICAgcmV0dXJuIHBJbWFnZTsKICAgfQotICBpZiAoIXBJbWFnZS0+bV9wRGF0YSkgeworICBpZiAoIXBJbWFnZS0+bV9wRGF0YSkKICAgICByZXR1cm4gcEltYWdlOwotICB9Ci0gIHBMaW5lU3JjID0gbV9wRGF0YSArIG1fblN0cmlkZSAqIHk7Ci0gIHBMaW5lRHN0ID0gcEltYWdlLT5tX3BEYXRhOworCisgIHBMaW5lU3JjID0gZGF0YSgpICsgbV9uU3RyaWRlICogeTsKKyAgcExpbmVEc3QgPSBwSW1hZ2UtPmRhdGEoKTsKICAgbSA9ICh4ID4+IDUpIDw8IDI7CiAgIG4gPSB4ICYgMzE7CiAgIGlmIChuID09IDApIHsKQEAgLTIzMywxNSArMjMzLDE2IEBACiAgIGlmICghbV9wRGF0YSB8fCBoIDw9IG1fbkhlaWdodCB8fCBoID4ga01heEltYWdlQnl0ZXMgLyBtX25TdHJpZGUpCiAgICAgcmV0dXJuOwogCi0gIGlmIChtX2JPd25zQnVmZmVyKSB7Ci0gICAgbV9wRGF0YSA9IEZYX1JlYWxsb2ModWludDhfdCwgbV9wRGF0YSwgaCAqIG1fblN0cmlkZSk7CisgIGlmIChtX3BEYXRhLklzT3duZWQoKSkgeworICAgIG1fcERhdGEuUmVzZXQoc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+KAorICAgICAgICBGWF9SZWFsbG9jKHVpbnQ4X3QsIG1fcERhdGEuUmVsZWFzZSgpLnJlbGVhc2UoKSwgaCAqIG1fblN0cmlkZSkpKTsKICAgfSBlbHNlIHsKLSAgICB1aW50OF90KiBwRXh0ZXJuYWxCdWZmZXIgPSBtX3BEYXRhOwotICAgIG1fcERhdGEgPSBGWF9BbGxvYyh1aW50OF90LCBoICogbV9uU3RyaWRlKTsKLSAgICBKQklHMl9tZW1jcHkobV9wRGF0YSwgcEV4dGVybmFsQnVmZmVyLCBtX25IZWlnaHQgKiBtX25TdHJpZGUpOwotICAgIG1fYk93bnNCdWZmZXIgPSB0cnVlOworICAgIHVpbnQ4X3QqIHBFeHRlcm5hbEJ1ZmZlciA9IGRhdGEoKTsKKyAgICBtX3BEYXRhLlJlc2V0KHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90LCBGeEZyZWVEZWxldGVyPigKKyAgICAgICAgRlhfQWxsb2ModWludDhfdCwgaCAqIG1fblN0cmlkZSkpKTsKKyAgICBKQklHMl9tZW1jcHkoZGF0YSgpLCBwRXh0ZXJuYWxCdWZmZXIsIG1fbkhlaWdodCAqIG1fblN0cmlkZSk7CiAgIH0KLSAgSkJJRzJfbWVtc2V0KG1fcERhdGEgKyBtX25IZWlnaHQgKiBtX25TdHJpZGUsIHYgPyAweGZmIDogMCwKKyAgSkJJRzJfbWVtc2V0KGRhdGEoKSArIG1fbkhlaWdodCAqIG1fblN0cmlkZSwgdiA/IDB4ZmYgOiAwLAogICAgICAgICAgICAgICAgKGggLSBtX25IZWlnaHQpICogbV9uU3RyaWRlKTsKICAgbV9uSGVpZ2h0ID0gaDsKIH0KQEAgLTI1MCw2MyArMjUxLDU2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkNvbXBvc2VPcCBvcCkgewotICBpbnQzMl90IHhzMCA9IDAsIHlzMCA9IDAsIHhzMSA9IDAsIHlzMSA9IDAsIHhkMCA9IDAsIHlkMCA9IDAsIHhkMSA9IDAsCi0gICAgICAgICAgeWQxID0gMCwgeHggPSAwLCB5eSA9IDAsIHcgPSAwLCBoID0gMCwgbWlkZGxlRHdvcmRzID0gMCwgbGluZUxlZnQgPSAwOwotCi0gIHVpbnQzMl90IHMxID0gMCwgZDEgPSAwLCBkMiA9IDAsIHNoaWZ0ID0gMCwgc2hpZnQxID0gMCwgc2hpZnQyID0gMCwgdG1wID0gMCwKLSAgICAgICAgICAgdG1wMSA9IDAsIHRtcDIgPSAwLCBtYXNrTCA9IDAsIG1hc2tSID0gMCwgbWFza00gPSAwOwotCiAgIGlmICghbV9wRGF0YSkKICAgICByZXR1cm4gZmFsc2U7CiAKICAgaWYgKHggPCAtMTA0ODU3NiB8fCB4ID4gMTA0ODU3NiB8fCB5IDwgLTEwNDg1NzYgfHwgeSA+IDEwNDg1NzYpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIGlmICh5IDwgMCkgewotICAgIHlzMCA9IC15OwotICB9Ci0gIGlmICh5ICsgbV9uSGVpZ2h0ID4gcERzdC0+bV9uSGVpZ2h0KSB7Ci0gICAgeXMxID0gcERzdC0+bV9uSGVpZ2h0IC0geTsKLSAgfSBlbHNlIHsKLSAgICB5czEgPSBtX25IZWlnaHQ7Ci0gIH0KLSAgaWYgKHggPCAwKSB7Ci0gICAgeHMwID0gLXg7Ci0gIH0KLSAgaWYgKHggKyBtX25XaWR0aCA+IHBEc3QtPm1fbldpZHRoKSB7Ci0gICAgeHMxID0gcERzdC0+bV9uV2lkdGggLSB4OwotICB9IGVsc2UgeworICBpbnQzMl90IHhzMCA9IHggPCAwID8gLXggOiAwOworICBpbnQzMl90IHhzMTsKKyAgRlhfU0FGRV9JTlQzMiBpQ2hlY2tlZCA9IHBEc3QtPm1fbldpZHRoOworICBpQ2hlY2tlZCAtPSB4OworICBpZiAoaUNoZWNrZWQuSXNWYWxpZCgpICYmIG1fbldpZHRoID4gaUNoZWNrZWQuVmFsdWVPckRpZSgpKQorICAgIHhzMSA9IGlDaGVja2VkLlZhbHVlT3JEaWUoKTsKKyAgZWxzZQogICAgIHhzMSA9IG1fbldpZHRoOwotICB9Ci0gIGlmICgoeXMwID49IHlzMSkgfHwgKHhzMCA+PSB4czEpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgdyA9IHhzMSAtIHhzMDsKLSAgaCA9IHlzMSAtIHlzMDsKLSAgaWYgKHkgPj0gMCkgewotICAgIHlkMCA9IHk7Ci0gIH0KLSAgaWYgKHggPj0gMCkgewotICAgIHhkMCA9IHg7Ci0gIH0KLSAgeGQxID0geGQwICsgdzsKLSAgeWQxID0geWQwICsgaDsKLSAgZDEgPSB4ZDAgJiAzMTsKLSAgZDIgPSB4ZDEgJiAzMTsKLSAgczEgPSB4czAgJiAzMTsKLSAgbWFza0wgPSAweGZmZmZmZmZmID4+IGQxOwotICBtYXNrUiA9IDB4ZmZmZmZmZmYgPDwgKCgzMiAtICh4ZDEgJiAzMSkpICUgMzIpOwotICBtYXNrTSA9IG1hc2tMICYgbWFza1I7Ci0gIHVpbnQ4X3QqIGxpbmVTcmMgPSBtX3BEYXRhICsgeXMwICogbV9uU3RyaWRlICsgKCh4czAgPj4gNSkgPDwgMik7Ci0gIGxpbmVMZWZ0ID0gbV9uU3RyaWRlIC0gKCh4czAgPj4gNSkgPDwgMik7Ci0gIHVpbnQ4X3QqIGxpbmVEc3QgPSBwRHN0LT5tX3BEYXRhICsgeWQwICogcERzdC0+bV9uU3RyaWRlICsgKCh4ZDAgPj4gNSkgPDwgMik7CisKKyAgaW50MzJfdCB5czAgPSB5IDwgMCA/IC15IDogMDsKKyAgaW50MzJfdCB5czE7CisgIGlDaGVja2VkID0gcERzdC0+bV9uSGVpZ2h0OworICBpQ2hlY2tlZCAtPSB5OworICBpZiAoaUNoZWNrZWQuSXNWYWxpZCgpICYmIG1fbkhlaWdodCA+IGlDaGVja2VkLlZhbHVlT3JEaWUoKSkKKyAgICB5czEgPSBwRHN0LT5tX25IZWlnaHQgLSB5OworICBlbHNlCisgICAgeXMxID0gbV9uSGVpZ2h0OworCisgIGlmICh5czAgPj0geXMxIHx8IHhzMCA+PSB4czEpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGludDMyX3QgeGQwID0gc3RkOjptYXgoeCwgMCk7CisgIGludDMyX3QgeWQwID0gc3RkOjptYXgoeSwgMCk7CisgIGludDMyX3QgdyA9IHhzMSAtIHhzMDsKKyAgaW50MzJfdCBoID0geXMxIC0geXMwOworICBpbnQzMl90IHhkMSA9IHhkMCArIHc7CisgIGludDMyX3QgeWQxID0geWQwICsgaDsKKyAgdWludDMyX3QgZDEgPSB4ZDAgJiAzMTsKKyAgdWludDMyX3QgZDIgPSB4ZDEgJiAzMTsKKyAgdWludDMyX3QgczEgPSB4czAgJiAzMTsKKyAgdWludDMyX3QgbWFza0wgPSAweGZmZmZmZmZmID4+IGQxOworICB1aW50MzJfdCBtYXNrUiA9IDB4ZmZmZmZmZmYgPDwgKCgzMiAtICh4ZDEgJiAzMSkpICUgMzIpOworICB1aW50MzJfdCBtYXNrTSA9IG1hc2tMICYgbWFza1I7CisgIHVpbnQ4X3QqIGxpbmVTcmMgPSBkYXRhKCkgKyB5czAgKiBtX25TdHJpZGUgKyAoKHhzMCA+PiA1KSA8PCAyKTsKKyAgaW50MzJfdCBsaW5lTGVmdCA9IG1fblN0cmlkZSAtICgoeHMwID4+IDUpIDw8IDIpOworICB1aW50OF90KiBsaW5lRHN0ID0gcERzdC0+ZGF0YSgpICsgeWQwICogcERzdC0+bV9uU3RyaWRlICsgKCh4ZDAgPj4gNSkgPDwgMik7CiAgIGlmICgoeGQwICYgfjMxKSA9PSAoKHhkMSAtIDEpICYgfjMxKSkgewogICAgIGlmICgoeHMwICYgfjMxKSA9PSAoKHhzMSAtIDEpICYgfjMxKSkgewogICAgICAgaWYgKHMxID4gZDEpIHsKLSAgICAgICAgc2hpZnQgPSBzMSAtIGQxOwotICAgICAgICBmb3IgKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgewotICAgICAgICAgIHRtcDEgPSBKQklHMl9HRVREV09SRChsaW5lU3JjKSA8PCBzaGlmdDsKLSAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQobGluZURzdCk7CisgICAgICAgIHVpbnQzMl90IHNoaWZ0ID0gczEgLSBkMTsKKyAgICAgICAgZm9yIChpbnQzMl90IHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgeworICAgICAgICAgIHVpbnQzMl90IHRtcDEgPSBKQklHMl9HRVREV09SRChsaW5lU3JjKSA8PCBzaGlmdDsKKyAgICAgICAgICB1aW50MzJfdCB0bXAyID0gSkJJRzJfR0VURFdPUkQobGluZURzdCk7CisgICAgICAgICAgdWludDMyX3QgdG1wID0gMDsKICAgICAgICAgICBzd2l0Y2ggKG9wKSB7CiAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CiAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza00pOwpAQCAtMzMyLDEwICszMjYsMTEgQEAKICAgICAgICAgICBsaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKICAgICAgICAgfQogICAgICAgfSBlbHNlIHsKLSAgICAgICAgc2hpZnQgPSBkMSAtIHMxOwotICAgICAgICBmb3IgKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgewotICAgICAgICAgIHRtcDEgPSBKQklHMl9HRVREV09SRChsaW5lU3JjKSA+PiBzaGlmdDsKLSAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQobGluZURzdCk7CisgICAgICAgIHVpbnQzMl90IHNoaWZ0ID0gZDEgLSBzMTsKKyAgICAgICAgZm9yIChpbnQzMl90IHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgeworICAgICAgICAgIHVpbnQzMl90IHRtcDEgPSBKQklHMl9HRVREV09SRChsaW5lU3JjKSA+PiBzaGlmdDsKKyAgICAgICAgICB1aW50MzJfdCB0bXAyID0gSkJJRzJfR0VURFdPUkQobGluZURzdCk7CisgICAgICAgICAgdWludDMyX3QgdG1wID0gMDsKICAgICAgICAgICBzd2l0Y2ggKG9wKSB7CiAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CiAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza00pOwpAQCAtMzYyLDEyICszNTcsMTMgQEAKICAgICAgICAgfQogICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICBzaGlmdDEgPSBzMSAtIGQxOwotICAgICAgc2hpZnQyID0gMzIgLSBzaGlmdDE7Ci0gICAgICBmb3IgKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgewotICAgICAgICB0bXAxID0gKEpCSUcyX0dFVERXT1JEKGxpbmVTcmMpIDw8IHNoaWZ0MSkgfAotICAgICAgICAgICAgICAgKEpCSUcyX0dFVERXT1JEKGxpbmVTcmMgKyA0KSA+PiBzaGlmdDIpOwotICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQobGluZURzdCk7CisgICAgICB1aW50MzJfdCBzaGlmdDEgPSBzMSAtIGQxOworICAgICAgdWludDMyX3Qgc2hpZnQyID0gMzIgLSBzaGlmdDE7CisgICAgICBmb3IgKGludDMyX3QgeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7CisgICAgICAgIHVpbnQzMl90IHRtcDEgPSAoSkJJRzJfR0VURFdPUkQobGluZVNyYykgPDwgc2hpZnQxKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAoSkJJRzJfR0VURFdPUkQobGluZVNyYyArIDQpID4+IHNoaWZ0Mik7CisgICAgICAgIHVpbnQzMl90IHRtcDIgPSBKQklHMl9HRVREV09SRChsaW5lRHN0KTsKKyAgICAgICAgdWludDMyX3QgdG1wID0gMDsKICAgICAgICAgc3dpdGNoIChvcCkgewogICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tNKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza00pOwpAQCAtMzk4LDE2ICszOTQsMTcgQEAKICAgICB1aW50OF90KiBkcCA9IG51bGxwdHI7CiAKICAgICBpZiAoczEgPiBkMSkgewotICAgICAgc2hpZnQxID0gczEgLSBkMTsKLSAgICAgIHNoaWZ0MiA9IDMyIC0gc2hpZnQxOwotICAgICAgbWlkZGxlRHdvcmRzID0gKHhkMSA+PiA1KSAtICgoeGQwICsgMzEpID4+IDUpOwotICAgICAgZm9yICh5eSA9IHlkMDsgeXkgPCB5ZDE7IHl5KyspIHsKKyAgICAgIHVpbnQzMl90IHNoaWZ0MSA9IHMxIC0gZDE7CisgICAgICB1aW50MzJfdCBzaGlmdDIgPSAzMiAtIHNoaWZ0MTsKKyAgICAgIGludDMyX3QgbWlkZGxlRHdvcmRzID0gKHhkMSA+PiA1KSAtICgoeGQwICsgMzEpID4+IDUpOworICAgICAgZm9yIChpbnQzMl90IHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgewogICAgICAgICBzcCA9IGxpbmVTcmM7CiAgICAgICAgIGRwID0gbGluZURzdDsKICAgICAgICAgaWYgKGQxICE9IDApIHsKLSAgICAgICAgICB0bXAxID0gKEpCSUcyX0dFVERXT1JEKHNwKSA8PCBzaGlmdDEpIHwKLSAgICAgICAgICAgICAgICAgKEpCSUcyX0dFVERXT1JEKHNwICsgNCkgPj4gc2hpZnQyKTsKLSAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOworICAgICAgICAgIHVpbnQzMl90IHRtcDEgPSAoSkJJRzJfR0VURFdPUkQoc3ApIDw8IHNoaWZ0MSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAoSkJJRzJfR0VURFdPUkQoc3AgKyA0KSA+PiBzaGlmdDIpOworICAgICAgICAgIHVpbnQzMl90IHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7CisgICAgICAgICAgdWludDMyX3QgdG1wID0gMDsKICAgICAgICAgICBzd2l0Y2ggKG9wKSB7CiAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CiAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza0wpOwpAQCAtNDMyLDEwICs0MjksMTEgQEAKICAgICAgICAgICBzcCArPSA0OwogICAgICAgICAgIGRwICs9IDQ7CiAgICAgICAgIH0KLSAgICAgICAgZm9yICh4eCA9IDA7IHh4IDwgbWlkZGxlRHdvcmRzOyB4eCsrKSB7Ci0gICAgICAgICAgdG1wMSA9IChKQklHMl9HRVREV09SRChzcCkgPDwgc2hpZnQxKSB8Ci0gICAgICAgICAgICAgICAgIChKQklHMl9HRVREV09SRChzcCArIDQpID4+IHNoaWZ0Mik7Ci0gICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKKyAgICAgICAgZm9yIChpbnQzMl90IHh4ID0gMDsgeHggPCBtaWRkbGVEd29yZHM7IHh4KyspIHsKKyAgICAgICAgICB1aW50MzJfdCB0bXAxID0gKEpCSUcyX0dFVERXT1JEKHNwKSA8PCBzaGlmdDEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKEpCSUcyX0dFVERXT1JEKHNwICsgNCkgPj4gc2hpZnQyKTsKKyAgICAgICAgICB1aW50MzJfdCB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOworICAgICAgICAgIHVpbnQzMl90IHRtcCA9IDA7CiAgICAgICAgICAgc3dpdGNoIChvcCkgewogICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgogICAgICAgICAgICAgICB0bXAgPSB0bXAxIHwgdG1wMjsKQEAgLTQ2MSwxMSArNDU5LDEyIEBACiAgICAgICAgICAgZHAgKz0gNDsKICAgICAgICAgfQogICAgICAgICBpZiAoZDIgIT0gMCkgewotICAgICAgICAgIHRtcDEgPQorICAgICAgICAgIHVpbnQzMl90IHRtcDEgPQogICAgICAgICAgICAgICAoSkJJRzJfR0VURFdPUkQoc3ApIDw8IHNoaWZ0MSkgfAogICAgICAgICAgICAgICAoKChzcCArIDQpIDwgbGluZVNyYyArIGxpbmVMZWZ0ID8gSkJJRzJfR0VURFdPUkQoc3AgKyA0KSA6IDApID4+CiAgICAgICAgICAgICAgICBzaGlmdDIpOwotICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7CisgICAgICAgICAgdWludDMyX3QgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKKyAgICAgICAgICB1aW50MzJfdCB0bXAgPSAwOwogICAgICAgICAgIHN3aXRjaCAob3ApIHsKICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza1IpIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrUik7CkBAIC00OTIsMTMgKzQ5MSwxNCBAQAogICAgICAgICBsaW5lRHN0ICs9IHBEc3QtPm1fblN0cmlkZTsKICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHMxID09IGQxKSB7Ci0gICAgICBtaWRkbGVEd29yZHMgPSAoeGQxID4+IDUpIC0gKCh4ZDAgKyAzMSkgPj4gNSk7Ci0gICAgICBmb3IgKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgeworICAgICAgaW50MzJfdCBtaWRkbGVEd29yZHMgPSAoeGQxID4+IDUpIC0gKCh4ZDAgKyAzMSkgPj4gNSk7CisgICAgICBmb3IgKGludDMyX3QgeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7CiAgICAgICAgIHNwID0gbGluZVNyYzsKICAgICAgICAgZHAgPSBsaW5lRHN0OwogICAgICAgICBpZiAoZDEgIT0gMCkgewotICAgICAgICAgIHRtcDEgPSBKQklHMl9HRVREV09SRChzcCk7Ci0gICAgICAgICAgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKKyAgICAgICAgICB1aW50MzJfdCB0bXAxID0gSkJJRzJfR0VURFdPUkQoc3ApOworICAgICAgICAgIHVpbnQzMl90IHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7CisgICAgICAgICAgdWludDMyX3QgdG1wID0gMDsKICAgICAgICAgICBzd2l0Y2ggKG9wKSB7CiAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CiAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tMKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza0wpOwpAQCAtNTIzLDkgKzUyMywxMCBAQAogICAgICAgICAgIHNwICs9IDQ7CiAgICAgICAgICAgZHAgKz0gNDsKICAgICAgICAgfQotICAgICAgICBmb3IgKHh4ID0gMDsgeHggPCBtaWRkbGVEd29yZHM7IHh4KyspIHsKLSAgICAgICAgICB0bXAxID0gSkJJRzJfR0VURFdPUkQoc3ApOwotICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7CisgICAgICAgIGZvciAoaW50MzJfdCB4eCA9IDA7IHh4IDwgbWlkZGxlRHdvcmRzOyB4eCsrKSB7CisgICAgICAgICAgdWludDMyX3QgdG1wMSA9IEpCSUcyX0dFVERXT1JEKHNwKTsKKyAgICAgICAgICB1aW50MzJfdCB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOworICAgICAgICAgIHVpbnQzMl90IHRtcCA9IDA7CiAgICAgICAgICAgc3dpdGNoIChvcCkgewogICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgogICAgICAgICAgICAgICB0bXAgPSB0bXAxIHwgdG1wMjsKQEAgLTU1MSw4ICs1NTIsOSBAQAogICAgICAgICAgIGRwICs9IDQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGQyICE9IDApIHsKLSAgICAgICAgICB0bXAxID0gSkJJRzJfR0VURFdPUkQoc3ApOwotICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7CisgICAgICAgICAgdWludDMyX3QgdG1wMSA9IEpCSUcyX0dFVERXT1JEKHNwKTsKKyAgICAgICAgICB1aW50MzJfdCB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOworICAgICAgICAgIHVpbnQzMl90IHRtcCA9IDA7CiAgICAgICAgICAgc3dpdGNoIChvcCkgewogICAgICAgICAgICAgY2FzZSBKQklHMl9DT01QT1NFX09SOgogICAgICAgICAgICAgICB0bXAgPSAodG1wMiAmIH5tYXNrUikgfCAoKHRtcDEgfCB0bXAyKSAmIG1hc2tSKTsKQEAgLTU3OSwxNSArNTgxLDE2IEBACiAgICAgICAgIGxpbmVEc3QgKz0gcERzdC0+bV9uU3RyaWRlOwogICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICBzaGlmdDEgPSBkMSAtIHMxOwotICAgICAgc2hpZnQyID0gMzIgLSBzaGlmdDE7Ci0gICAgICBtaWRkbGVEd29yZHMgPSAoeGQxID4+IDUpIC0gKCh4ZDAgKyAzMSkgPj4gNSk7Ci0gICAgICBmb3IgKHl5ID0geWQwOyB5eSA8IHlkMTsgeXkrKykgeworICAgICAgdWludDMyX3Qgc2hpZnQxID0gZDEgLSBzMTsKKyAgICAgIHVpbnQzMl90IHNoaWZ0MiA9IDMyIC0gc2hpZnQxOworICAgICAgaW50MzJfdCBtaWRkbGVEd29yZHMgPSAoeGQxID4+IDUpIC0gKCh4ZDAgKyAzMSkgPj4gNSk7CisgICAgICBmb3IgKGludDMyX3QgeXkgPSB5ZDA7IHl5IDwgeWQxOyB5eSsrKSB7CiAgICAgICAgIHNwID0gbGluZVNyYzsKICAgICAgICAgZHAgPSBsaW5lRHN0OwogICAgICAgICBpZiAoZDEgIT0gMCkgewotICAgICAgICAgIHRtcDEgPSBKQklHMl9HRVREV09SRChzcCkgPj4gc2hpZnQxOwotICAgICAgICAgIHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7CisgICAgICAgICAgdWludDMyX3QgdG1wMSA9IEpCSUcyX0dFVERXT1JEKHNwKSA+PiBzaGlmdDE7CisgICAgICAgICAgdWludDMyX3QgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKKyAgICAgICAgICB1aW50MzJfdCB0bXAgPSAwOwogICAgICAgICAgIHN3aXRjaCAob3ApIHsKICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKICAgICAgICAgICAgICAgdG1wID0gKHRtcDIgJiB+bWFza0wpIHwgKCh0bXAxIHwgdG1wMikgJiBtYXNrTCk7CkBAIC02MTEsMTAgKzYxNCwxMSBAQAogICAgICAgICAgIGRwWzNdID0gKHVpbnQ4X3QpdG1wOwogICAgICAgICAgIGRwICs9IDQ7CiAgICAgICAgIH0KLSAgICAgICAgZm9yICh4eCA9IDA7IHh4IDwgbWlkZGxlRHdvcmRzOyB4eCsrKSB7Ci0gICAgICAgICAgdG1wMSA9IChKQklHMl9HRVREV09SRChzcCkgPDwgc2hpZnQyKSB8Ci0gICAgICAgICAgICAgICAgICgoSkJJRzJfR0VURFdPUkQoc3AgKyA0KSkgPj4gc2hpZnQxKTsKLSAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOworICAgICAgICBmb3IgKGludDMyX3QgeHggPSAwOyB4eCA8IG1pZGRsZUR3b3JkczsgeHgrKykgeworICAgICAgICAgIHVpbnQzMl90IHRtcDEgPSAoSkJJRzJfR0VURFdPUkQoc3ApIDw8IHNoaWZ0MikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAoKEpCSUcyX0dFVERXT1JEKHNwICsgNCkpID4+IHNoaWZ0MSk7CisgICAgICAgICAgdWludDMyX3QgdG1wMiA9IEpCSUcyX0dFVERXT1JEKGRwKTsKKyAgICAgICAgICB1aW50MzJfdCB0bXAgPSAwOwogICAgICAgICAgIHN3aXRjaCAob3ApIHsKICAgICAgICAgICAgIGNhc2UgSkJJRzJfQ09NUE9TRV9PUjoKICAgICAgICAgICAgICAgdG1wID0gdG1wMSB8IHRtcDI7CkBAIC02NDAsMTEgKzY0NCwxMiBAQAogICAgICAgICAgIGRwICs9IDQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGQyICE9IDApIHsKLSAgICAgICAgICB0bXAxID0KKyAgICAgICAgICB1aW50MzJfdCB0bXAxID0KICAgICAgICAgICAgICAgKEpCSUcyX0dFVERXT1JEKHNwKSA8PCBzaGlmdDIpIHwKICAgICAgICAgICAgICAgKCgoc3AgKyA0KSA8IGxpbmVTcmMgKyBsaW5lTGVmdCA/IEpCSUcyX0dFVERXT1JEKHNwICsgNCkgOiAwKSA+PgogICAgICAgICAgICAgICAgc2hpZnQxKTsKLSAgICAgICAgICB0bXAyID0gSkJJRzJfR0VURFdPUkQoZHApOworICAgICAgICAgIHVpbnQzMl90IHRtcDIgPSBKQklHMl9HRVREV09SRChkcCk7CisgICAgICAgICAgdWludDMyX3QgdG1wID0gMDsKICAgICAgICAgICBzd2l0Y2ggKG9wKSB7CiAgICAgICAgICAgICBjYXNlIEpCSUcyX0NPTVBPU0VfT1I6CiAgICAgICAgICAgICAgIHRtcCA9ICh0bXAyICYgfm1hc2tSKSB8ICgodG1wMSB8IHRtcDIpICYgbWFza1IpOwpAQCAtNjcyLDE2ICs2NzcsMTcgQEAKICAgICAgIH0KICAgICB9CiAgIH0KLSAgcmV0dXJuIDE7CisgIHJldHVybiB0cnVlOwogfQorCiBib29sIENKQmlnMl9JbWFnZTo6Y29tcG9zZVRvX29wdDIoQ0pCaWcyX0ltYWdlKiBwRHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJDb21wb3NlT3Agb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QpIHsKLSAgaWYgKCFtX3BEYXRhKSB7CisgIGlmICghbV9wRGF0YSkKICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KKwogICAvLyBUT0RPKHdlaWxpKTogQ2hlY2sgd2hldGhlciB0aGUgcmFuZ2UgY2hlY2sgaXMgY29ycmVjdC4gU2hvdWxkIHg+PTEwNDg1NzY/CiAgIGlmICh4IDwgLTEwNDg1NzYgfHwgeCA+IDEwNDg1NzYgfHwgeSA8IC0xMDQ4NTc2IHx8IHkgPiAxMDQ4NTc2KSB7CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNzA3LDEwICs3MTMsMTAgQEAKICAgaW50MzJfdCBtYXNrTCA9IDB4ZmZmZmZmZmYgPj4gZDE7CiAgIGludDMyX3QgbWFza1IgPSAweGZmZmZmZmZmIDw8ICgoMzIgLSAoeGQxICYgMzEpKSAlIDMyKTsKICAgaW50MzJfdCBtYXNrTSA9IG1hc2tMICYgbWFza1I7Ci0gIHVpbnQ4X3QqIGxpbmVTcmMgPSBtX3BEYXRhICsgKHBTcmNSZWN0LT50b3AgKyB5czApICogbV9uU3RyaWRlICsKKyAgdWludDhfdCogbGluZVNyYyA9IGRhdGEoKSArIChwU3JjUmVjdC0+dG9wICsgeXMwKSAqIG1fblN0cmlkZSArCiAgICAgICAgICAgICAgICAgICAgICAoKCh4czAgKyBwU3JjUmVjdC0+bGVmdCkgPj4gNSkgPDwgMik7CiAgIGludDMyX3QgbGluZUxlZnQgPSBtX25TdHJpZGUgLSAoKHhzMCA+PiA1KSA8PCAyKTsKLSAgdWludDhfdCogbGluZURzdCA9IHBEc3QtPm1fcERhdGEgKyB5ZDAgKiBwRHN0LT5tX25TdHJpZGUgKyAoKHhkMCA+PiA1KSA8PCAyKTsKKyAgdWludDhfdCogbGluZURzdCA9IHBEc3QtPmRhdGEoKSArIHlkMCAqIHBEc3QtPm1fblN0cmlkZSArICgoeGQwID4+IDUpIDw8IDIpOwogICBpZiAoKHhkMCAmIH4zMSkgPT0gKCh4ZDEgLSAxKSAmIH4zMSkpIHsKICAgICBpZiAoKHhzMCAmIH4zMSkgPT0gKCh4czEgLSAxKSAmIH4zMSkpIHsKICAgICAgIGlmIChzMSA+IGQxKSB7CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuaCBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9JbWFnZS5oCmluZGV4IDU0NTI5ZWYuLmMwOTgwNDAgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9JbWFnZS5oCisrKyBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9JbWFnZS5oCkBAIC03LDcgKzcsMTAgQEAKICNpZm5kZWYgQ09SRV9GWENPREVDX0pCSUcyX0pCSUcyX0lNQUdFX0hfCiAjZGVmaW5lIENPUkVfRlhDT0RFQ19KQklHMl9KQklHMl9JTUFHRV9IXwogCisjaW5jbHVkZSA8bWVtb3J5PgorCiAjaW5jbHVkZSAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0RlZmluZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvbWF5YmVfb3duZWQuaCIKIAogc3RydWN0IEZYX1JFQ1Q7CiAKQEAgLTI5LDggKzMyLDkgQEAKICAgaW50MzJfdCB3aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fbldpZHRoOyB9CiAgIGludDMyX3QgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9uSGVpZ2h0OyB9CiAgIGludDMyX3Qgc3RyaWRlKCkgY29uc3QgeyByZXR1cm4gbV9uU3RyaWRlOyB9CisgIHVpbnQ4X3QqIGRhdGEoKSBjb25zdCB7IHJldHVybiBtX3BEYXRhLkdldCgpOyB9CiAKLSAgaW50IGdldFBpeGVsKGludDMyX3QgeCwgaW50MzJfdCB5KTsKKyAgaW50IGdldFBpeGVsKGludDMyX3QgeCwgaW50MzJfdCB5KSBjb25zdDsKICAgaW50MzJfdCBzZXRQaXhlbChpbnQzMl90IHgsIGludDMyX3QgeSwgaW50IGJWYWwpOwogCiAgIHZvaWQgY29weUxpbmUoaW50MzJfdCBoVG8sIGludDMyX3QgaEZyb20pOwpAQCAtNjAsMTYgKzY0LDE4IEBACiAgICAgICAgICAgICAgICAgICAgSkJpZzJDb21wb3NlT3Agb3AsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QpOwogCi0gIENKQmlnMl9JbWFnZSogc3ViSW1hZ2UoaW50MzJfdCB4LCBpbnQzMl90IHksIGludDMyX3QgdywgaW50MzJfdCBoKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gc3ViSW1hZ2UoaW50MzJfdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoKTsKICAgdm9pZCBleHBhbmQoaW50MzJfdCBoLCBib29sIHYpOwogCi0gIHVpbnQ4X3QqIG1fcERhdGE7CiAKICBwcml2YXRlOgorICBNYXliZU93bmVkPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IG1fcERhdGE7CiAgIGludDMyX3QgbV9uV2lkdGg7ICAgLy8gMS1iaXQgcGl4ZWxzCiAgIGludDMyX3QgbV9uSGVpZ2h0OyAgLy8gbGluZXMKICAgaW50MzJfdCBtX25TdHJpZGU7ICAvLyBieXRlcwotICBib29sIG1fYk93bnNCdWZmZXI7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlhDT0RFQ19KQklHMl9KQklHMl9JTUFHRV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9JbWFnZV91bml0dGVzdC5jcHAKaW5kZXggNzg4ZjkyMi4uMmU1M2U3YiAxMDA2NDQKLS0tIGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlX3VuaXR0ZXN0LmNwcAorKysgYi9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2VfdW5pdHRlc3QuY3BwCkBAIC0zNCw3ICszNCw3IEBACiAgIENKQmlnMl9JbWFnZSBpbWcoa1dpZHRoUGl4ZWxzLCBrVG9vTGFyZ2VIZWlnaHRMaW5lcyk7CiAgIEVYUEVDVF9FUSgwLCBpbWcud2lkdGgoKSk7CiAgIEVYUEVDVF9FUSgwLCBpbWcuaGVpZ2h0KCkpOwotICBFWFBFQ1RfRVEobnVsbHB0ciwgaW1nLm1fcERhdGEpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgaW1nLmRhdGEoKSk7CiB9CiAKIFRFU1QoZnhjb2RlYywgSkJpZzJJbWFnZUNyZWF0ZUV4dGVybmFsKSB7CkBAIC01Myw3ICs1Myw3IEBACiAgIENKQmlnMl9JbWFnZSBpbWcoa1dpZHRoUGl4ZWxzLCBrVG9vTGFyZ2VIZWlnaHRMaW5lcywga1N0cmlkZUJ5dGVzLCBidWYpOwogICBFWFBFQ1RfRVEoMCwgaW1nLndpZHRoKCkpOwogICBFWFBFQ1RfRVEoMCwgaW1nLmhlaWdodCgpKTsKLSAgRVhQRUNUX0VRKG51bGxwdHIsIGltZy5tX3BEYXRhKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIGltZy5kYXRhKCkpOwogfQogCiBURVNUKGZ4Y29kZWMsIEpCaWcySW1hZ2VFeHBhbmQpIHsKZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9QYXR0ZXJuRGljdC5jcHAgYi9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfUGF0dGVybkRpY3QuY3BwCmluZGV4IGNkNmEyYWQuLjQ1MGU3OGEgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9QYXR0ZXJuRGljdC5jcHAKKysrIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX1BhdHRlcm5EaWN0LmNwcApAQCAtOCwxNiArOCw3IEBACiAKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgogCi1DSkJpZzJfUGF0dGVybkRpY3Q6OkNKQmlnMl9QYXR0ZXJuRGljdCgpIHsKLSAgTlVNUEFUUyA9IDA7Ci0gIEhEUEFUUyA9IG51bGxwdHI7Ci19CitDSkJpZzJfUGF0dGVybkRpY3Q6OkNKQmlnMl9QYXR0ZXJuRGljdCh1aW50MzJfdCBkaWN0X3NpemUpCisgICAgOiBOVU1QQVRTKGRpY3Rfc2l6ZSksIEhEUEFUUyhkaWN0X3NpemUpIHt9CiAKLUNKQmlnMl9QYXR0ZXJuRGljdDo6fkNKQmlnMl9QYXR0ZXJuRGljdCgpIHsKLSAgaWYgKEhEUEFUUykgewotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBOVU1QQVRTOyBpKyspIHsKLSAgICAgIGRlbGV0ZSBIRFBBVFNbaV07Ci0gICAgfQotICAgIEZYX0ZyZWUoSERQQVRTKTsKLSAgfQotfQorQ0pCaWcyX1BhdHRlcm5EaWN0Ojp+Q0pCaWcyX1BhdHRlcm5EaWN0KCkge30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9QYXR0ZXJuRGljdC5oIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX1BhdHRlcm5EaWN0LmgKaW5kZXggZGRkZDQ3NC4uYWQ1NTkxNyAxMDA2NDQKLS0tIGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX1BhdHRlcm5EaWN0LmgKKysrIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX1BhdHRlcm5EaWN0LmgKQEAgLTcsMTcgKzcsMjAgQEAKICNpZm5kZWYgQ09SRV9GWENPREVDX0pCSUcyX0pCSUcyX1BBVFRFUk5ESUNUX0hfCiAjZGVmaW5lIENPUkVfRlhDT0RFQ19KQklHMl9KQklHMl9QQVRURVJORElDVF9IXwogCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKwogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9EZWZpbmUuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfSW1hZ2UuaCIKIAogY2xhc3MgQ0pCaWcyX1BhdHRlcm5EaWN0IHsKICBwdWJsaWM6Ci0gIENKQmlnMl9QYXR0ZXJuRGljdCgpOworICBleHBsaWNpdCBDSkJpZzJfUGF0dGVybkRpY3QodWludDMyX3QgZGljdF9zaXplKTsKIAogICB+Q0pCaWcyX1BhdHRlcm5EaWN0KCk7CiAKICAgdWludDMyX3QgTlVNUEFUUzsKLSAgQ0pCaWcyX0ltYWdlKiogSERQQVRTOworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPj4gSERQQVRTOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZYQ09ERUNfSkJJRzJfSkJJRzJfUEFUVEVSTkRJQ1RfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9QZGRQcm9jLmNwcCBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9QZGRQcm9jLmNwcAppbmRleCA2NzlhODdhLi5lZTg5MWNjIDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfUGRkUHJvYy5jcHAKKysrIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX1BkZFByb2MuY3BwCkBAIC0xMSwxOSArMTEsMTcgQEAKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3JkUHJvYy5oIgogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9JbWFnZS5oIgogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9QYXR0ZXJuRGljdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAotQ0pCaWcyX1BhdHRlcm5EaWN0KiBDSkJpZzJfUEREUHJvYzo6ZGVjb2RlX0FyaXRoKAorc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9QYXR0ZXJuRGljdD4gQ0pCaWcyX1BERFByb2M6OmRlY29kZV9Bcml0aCgKICAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAogICAgIEpCaWcyQXJpdGhDdHgqIGdiQ29udGV4dCwKLSAgICBJRlhfUGF1c2UqIHBQYXVzZSkgeworICAgIElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKSB7CiAgIHVpbnQzMl90IEdSQVk7Ci0gIENKQmlnMl9JbWFnZSogQkhEQyA9IG51bGxwdHI7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfUGF0dGVybkRpY3Q+IHBEaWN0KG5ldyBDSkJpZzJfUGF0dGVybkRpY3QoKSk7Ci0gIHBEaWN0LT5OVU1QQVRTID0gR1JBWU1BWCArIDE7Ci0gIHBEaWN0LT5IRFBBVFMgPSBGWF9BbGxvYyhDSkJpZzJfSW1hZ2UqLCBwRGljdC0+TlVNUEFUUyk7Ci0gIEpCSUcyX21lbXNldChwRGljdC0+SERQQVRTLCAwLCBzaXplb2YoQ0pCaWcyX0ltYWdlKikgKiBwRGljdC0+TlVNUEFUUyk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IEJIREM7CisgIGF1dG8gcERpY3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX1BhdHRlcm5EaWN0PihHUkFZTUFYICsgMSk7CiAKLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9HUkRQcm9jPiBwR1JEKG5ldyBDSkJpZzJfR1JEUHJvYygpKTsKKyAgYXV0byBwR1JEID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9HUkRQcm9jPigpOwogICBwR1JELT5NTVIgPSBIRE1NUjsKICAgcEdSRC0+R0JXID0gKEdSQVlNQVggKyAxKSAqIEhEUFc7CiAgIHBHUkQtPkdCSCA9IEhEUEg7CkBAIC00Myw3ICs0MSw3IEBACiAgIEZYQ09ERUNfU1RBVFVTIHN0YXR1cyA9CiAgICAgICBwR1JELT5TdGFydF9kZWNvZGVfQXJpdGgoJkJIREMsIHBBcml0aERlY29kZXIsIGdiQ29udGV4dCwgbnVsbHB0cik7CiAgIHdoaWxlIChzdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfREVDT0RFX1RPQkVDT05USU5VRSkKLSAgICBzdGF0dXMgPSBwR1JELT5Db250aW51ZV9kZWNvZGUocFBhdXNlKTsKKyAgICBzdGF0dXMgPSBwR1JELT5Db250aW51ZV9kZWNvZGUocFBhdXNlLCBwQXJpdGhEZWNvZGVyKTsKICAgaWYgKCFCSERDKQogICAgIHJldHVybiBudWxscHRyOwogCkBAIC01MiwyNCArNTAsMjAgQEAKICAgICBwRGljdC0+SERQQVRTW0dSQVldID0gQkhEQy0+c3ViSW1hZ2UoSERQVyAqIEdSQVksIDAsIEhEUFcsIEhEUEgpOwogICAgIEdSQVkgPSBHUkFZICsgMTsKICAgfQotICBkZWxldGUgQkhEQzsKLSAgcmV0dXJuIHBEaWN0LnJlbGVhc2UoKTsKKyAgcmV0dXJuIHBEaWN0OwogfQogCi1DSkJpZzJfUGF0dGVybkRpY3QqIENKQmlnMl9QRERQcm9jOjpkZWNvZGVfTU1SKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CitzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX1BhdHRlcm5EaWN0PiBDSkJpZzJfUEREUHJvYzo6ZGVjb2RlX01NUigKKyAgICBDSkJpZzJfQml0U3RyZWFtKiBwU3RyZWFtKSB7CiAgIHVpbnQzMl90IEdSQVk7Ci0gIENKQmlnMl9JbWFnZSogQkhEQyA9IG51bGxwdHI7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfUGF0dGVybkRpY3Q+IHBEaWN0KG5ldyBDSkJpZzJfUGF0dGVybkRpY3QoKSk7Ci0gIHBEaWN0LT5OVU1QQVRTID0gR1JBWU1BWCArIDE7Ci0gIHBEaWN0LT5IRFBBVFMgPSBGWF9BbGxvYyhDSkJpZzJfSW1hZ2UqLCBwRGljdC0+TlVNUEFUUyk7Ci0gIEpCSUcyX21lbXNldChwRGljdC0+SERQQVRTLCAwLCBzaXplb2YoQ0pCaWcyX0ltYWdlKikgKiBwRGljdC0+TlVNUEFUUyk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IEJIREM7CisgIGF1dG8gcERpY3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX1BhdHRlcm5EaWN0PihHUkFZTUFYICsgMSk7CiAKLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9HUkRQcm9jPiBwR1JEKG5ldyBDSkJpZzJfR1JEUHJvYygpKTsKKyAgYXV0byBwR1JEID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9HUkRQcm9jPigpOwogICBwR1JELT5NTVIgPSBIRE1NUjsKICAgcEdSRC0+R0JXID0gKEdSQVlNQVggKyAxKSAqIEhEUFc7CiAgIHBHUkQtPkdCSCA9IEhEUEg7Ci0gIHBHUkQtPlN0YXJ0X2RlY29kZV9NTVIoJkJIREMsIHBTdHJlYW0sIG51bGxwdHIpOworICBwR1JELT5TdGFydF9kZWNvZGVfTU1SKCZCSERDLCBwU3RyZWFtKTsKICAgaWYgKCFCSERDKQogICAgIHJldHVybiBudWxscHRyOwogCkBAIC03OCw2ICs3Miw1IEBACiAgICAgcERpY3QtPkhEUEFUU1tHUkFZXSA9IEJIREMtPnN1YkltYWdlKEhEUFcgKiBHUkFZLCAwLCBIRFBXLCBIRFBIKTsKICAgICBHUkFZID0gR1JBWSArIDE7CiAgIH0KLSAgZGVsZXRlIEJIREM7Ci0gIHJldHVybiBwRGljdC5yZWxlYXNlKCk7CisgIHJldHVybiBwRGljdDsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9QZGRQcm9jLmggYi9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfUGRkUHJvYy5oCmluZGV4IDU3OGY2MDMuLjkzOGRhMWIgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9QZGRQcm9jLmgKKysrIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX1BkZFByb2MuaApAQCAtNywyMSArNywyNCBAQAogI2lmbmRlZiBDT1JFX0ZYQ09ERUNfSkJJRzJfSkJJRzJfUEREUFJPQ19IXwogI2RlZmluZSBDT1JFX0ZYQ09ERUNfSkJJRzJfSkJJRzJfUEREUFJPQ19IXwogCisjaW5jbHVkZSA8bWVtb3J5PgorCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKIAogY2xhc3MgQ0pCaWcyX0FyaXRoRGVjb2RlcjsKIGNsYXNzIENKQmlnMl9CaXRTdHJlYW07CiBjbGFzcyBDSkJpZzJfUGF0dGVybkRpY3Q7Ci1jbGFzcyBJRlhfUGF1c2U7CitjbGFzcyBJRlhfUGF1c2VJbmRpY2F0b3I7CiBzdHJ1Y3QgSkJpZzJBcml0aEN0eDsKIAogY2xhc3MgQ0pCaWcyX1BERFByb2MgewogIHB1YmxpYzoKLSAgQ0pCaWcyX1BhdHRlcm5EaWN0KiBkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ2JDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfUGF0dGVybkRpY3Q+IGRlY29kZV9Bcml0aCgKKyAgICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCisgICAgICBKQmlnMkFyaXRoQ3R4KiBnYkNvbnRleHQsCisgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CiAKLSAgQ0pCaWcyX1BhdHRlcm5EaWN0KiBkZWNvZGVfTU1SKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sIElGWF9QYXVzZSogcFBhdXNlKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9QYXR0ZXJuRGljdD4gZGVjb2RlX01NUihDSkJpZzJfQml0U3RyZWFtKiBwU3RyZWFtKTsKIAogIHB1YmxpYzoKICAgYm9vbCBIRE1NUjsKZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9TZGRQcm9jLmNwcCBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9TZGRQcm9jLmNwcAppbmRleCA1ZjIzZmNmLi5hNDQ2ZGJjIDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfU2RkUHJvYy5jcHAKKysrIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX1NkZFByb2MuY3BwCkBAIC02LDcgKzYsOSBAQAogCiAjaW5jbHVkZSAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX1NkZFByb2MuaCIKIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfQXJpdGhJbnREZWNvZGVyLmgiCkBAIC0xNywyMSArMTksMTkgQEAKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hblRhYmxlX1N0YW5kYXJkLmgiCiAjaW5jbHVkZSAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfVHJkUHJvYy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKLUNKQmlnMl9TeW1ib2xEaWN0KiBDSkJpZzJfU0REUHJvYzo6ZGVjb2RlX0FyaXRoKAorc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9TeW1ib2xEaWN0PiBDSkJpZzJfU0REUHJvYzo6ZGVjb2RlX0FyaXRoKAogICAgIENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCiAgICAgc3RkOjp2ZWN0b3I8SkJpZzJBcml0aEN0eD4qIGdiQ29udGV4dCwKICAgICBzdGQ6OnZlY3RvcjxKQmlnMkFyaXRoQ3R4PiogZ3JDb250ZXh0KSB7Ci0gIENKQmlnMl9JbWFnZSoqIFNETkVXU1lNUzsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4+IFNETkVXU1lNUzsKICAgdWludDMyX3QgSENIRUlHSFQsIE5TWU1TREVDT0RFRDsKICAgaW50MzJfdCBIQ0RIOwogICB1aW50MzJfdCBTWU1XSURUSCwgVE9UV0lEVEg7CiAgIGludDMyX3QgRFc7Ci0gIENKQmlnMl9JbWFnZSogQlM7CiAgIHVpbnQzMl90IEksIEosIFJFRkFHR05JTlNUOwotICBib29sKiBFWEZMQUdTOworICBzdGQ6OnZlY3Rvcjxib29sPiBFWEZMQUdTOwogICB1aW50MzJfdCBFWElOREVYOwogICBib29sIENVUkVYRkxBRzsKICAgdWludDMyX3QgRVhSVU5MRU5HVEg7CkBAIC00MCwzOSArNDAsMzkgQEAKICAgdWludDhfdCBTQlNZTUNPREVMRU47CiAgIGludDMyX3QgUkRYSSwgUkRZSTsKICAgdWludDMyX3QgbnVtX2V4X3N5bXM7Ci0gIENKQmlnMl9JbWFnZSoqIFNCU1lNUzsKKyAgLy8gUG9pbnRlcnMgYXJlIG5vdCBvd25lZAorICBzdGQ6OnZlY3RvcjxDSkJpZzJfSW1hZ2UqPiBTQlNZTVM7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfQXJpdGhJYWlkRGVjb2Rlcj4gSUFJRDsKICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9TeW1ib2xEaWN0PiBwRGljdDsKLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aEludERlY29kZXI+IElBREgobmV3IENKQmlnMl9Bcml0aEludERlY29kZXIpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4gSUFEVyhuZXcgQ0pCaWcyX0FyaXRoSW50RGVjb2Rlcik7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfQXJpdGhJbnREZWNvZGVyPiBJQUFJKG5ldyBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aEludERlY29kZXI+IElBUkRYKG5ldyBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aEludERlY29kZXI+IElBUkRZKG5ldyBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aEludERlY29kZXI+IElBRVgobmV3IENKQmlnMl9Bcml0aEludERlY29kZXIpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4gSUFEVChuZXcgQ0pCaWcyX0FyaXRoSW50RGVjb2Rlcik7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfQXJpdGhJbnREZWNvZGVyPiBJQUZTKG5ldyBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aEludERlY29kZXI+IElBRFMobmV3IENKQmlnMl9Bcml0aEludERlY29kZXIpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4gSUFJVChuZXcgQ0pCaWcyX0FyaXRoSW50RGVjb2Rlcik7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfQXJpdGhJbnREZWNvZGVyPiBJQVJJKG5ldyBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aEludERlY29kZXI+IElBUkRXKG5ldyBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aEludERlY29kZXI+IElBUkRIKG5ldyBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKTsKKyAgYXV0byBJQURIID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9Bcml0aEludERlY29kZXI+KCk7CisgIGF1dG8gSUFEVyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfQXJpdGhJbnREZWNvZGVyPigpOworICBhdXRvIElBQUkgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4oKTsKKyAgYXV0byBJQVJEWCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfQXJpdGhJbnREZWNvZGVyPigpOworICBhdXRvIElBUkRZID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9Bcml0aEludERlY29kZXI+KCk7CisgIGF1dG8gSUFFWCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfQXJpdGhJbnREZWNvZGVyPigpOworICBhdXRvIElBRFQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4oKTsKKyAgYXV0byBJQUZTID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9Bcml0aEludERlY29kZXI+KCk7CisgIGF1dG8gSUFEUyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfQXJpdGhJbnREZWNvZGVyPigpOworICBhdXRvIElBSVQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4oKTsKKyAgYXV0byBJQVJJID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9Bcml0aEludERlY29kZXI+KCk7CisgIGF1dG8gSUFSRFcgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4oKTsKKyAgYXV0byBJQVJESCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfQXJpdGhJbnREZWNvZGVyPigpOwogICBuVG1wID0gMDsKICAgd2hpbGUgKCh1aW50MzJfdCkoMSA8PCBuVG1wKSA8IChTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUykpIHsKICAgICBuVG1wKys7CiAgIH0KICAgSUFJRCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfQXJpdGhJYWlkRGVjb2Rlcj4oKHVpbnQ4X3QpblRtcCk7Ci0gIFNETkVXU1lNUyA9IEZYX0FsbG9jKENKQmlnMl9JbWFnZSosIFNETlVNTkVXU1lNUyk7Ci0gIEZYU1lTX21lbXNldChTRE5FV1NZTVMsIDAsIFNETlVNTkVXU1lNUyAqIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7CisgIFNETkVXU1lNUy5yZXNpemUoU0ROVU1ORVdTWU1TKTsKIAogICBIQ0hFSUdIVCA9IDA7CiAgIE5TWU1TREVDT0RFRCA9IDA7CiAgIHdoaWxlIChOU1lNU0RFQ09ERUQgPCBTRE5VTU5FV1NZTVMpIHsKLSAgICBCUyA9IG51bGxwdHI7CisgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gQlM7CiAgICAgSUFESC0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZIQ0RIKTsKICAgICBIQ0hFSUdIVCA9IEhDSEVJR0hUICsgSENESDsKLSAgICBpZiAoKGludClIQ0hFSUdIVCA8IDAgfHwgKGludClIQ0hFSUdIVCA+IEpCSUcyX01BWF9JTUFHRV9TSVpFKSB7Ci0gICAgICBnb3RvIGZhaWxlZDsKLSAgICB9CisgICAgaWYgKChpbnQpSENIRUlHSFQgPCAwIHx8IChpbnQpSENIRUlHSFQgPiBKQklHMl9NQVhfSU1BR0VfU0laRSkKKyAgICAgIHJldHVybiBudWxscHRyOworCiAgICAgU1lNV0lEVEggPSAwOwogICAgIFRPVFdJRFRIID0gMDsKICAgICBmb3IgKDs7KSB7CkBAIC04MCwxMSArODAsMTEgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICAgIGlmIChOU1lNU0RFQ09ERUQgPj0gU0ROVU1ORVdTWU1TKQotICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKICAgICAgIFNZTVdJRFRIID0gU1lNV0lEVEggKyBEVzsKICAgICAgIGlmICgoaW50KVNZTVdJRFRIIDwgMCB8fCAoaW50KVNZTVdJRFRIID4gSkJJRzJfTUFYX0lNQUdFX1NJWkUpCi0gICAgICAgIGdvdG8gZmFpbGVkOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKIAogICAgICAgaWYgKEhDSEVJR0hUID09IDAgfHwgU1lNV0lEVEggPT0gMCkgewogICAgICAgICBUT1RXSURUSCA9IFRPVFdJRFRIICsgU1lNV0lEVEg7CkBAIC05NCw3ICs5NCw3IEBACiAgICAgICB9CiAgICAgICBUT1RXSURUSCA9IFRPVFdJRFRIICsgU1lNV0lEVEg7CiAgICAgICBpZiAoU0RSRUZBR0cgPT0gMCkgewotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0dSRFByb2M+IHBHUkQobmV3IENKQmlnMl9HUkRQcm9jKCkpOworICAgICAgICBhdXRvIHBHUkQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0dSRFByb2M+KCk7CiAgICAgICAgIHBHUkQtPk1NUiA9IDA7CiAgICAgICAgIHBHUkQtPkdCVyA9IFNZTVdJRFRIOwogICAgICAgICBwR1JELT5HQkggPSBIQ0hFSUdIVDsKQEAgLTExMCwxMyArMTEwLDEyIEBACiAgICAgICAgIHBHUkQtPkdCQVRbNl0gPSBTREFUWzZdOwogICAgICAgICBwR1JELT5HQkFUWzddID0gU0RBVFs3XTsKICAgICAgICAgQlMgPSBwR1JELT5kZWNvZGVfQXJpdGgocEFyaXRoRGVjb2RlciwgZ2JDb250ZXh0LT5kYXRhKCkpOwotICAgICAgICBpZiAoIUJTKSB7Ci0gICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKCFCUykKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIElBQUktPmRlY29kZShwQXJpdGhEZWNvZGVyLCAoaW50KikmUkVGQUdHTklOU1QpOwogICAgICAgICBpZiAoUkVGQUdHTklOU1QgPiAxKSB7Ci0gICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9UUkRQcm9jPiBwRGVjb2RlcihuZXcgQ0pCaWcyX1RSRFByb2MoKSk7CisgICAgICAgICAgYXV0byBwRGVjb2RlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfVFJEUHJvYz4oKTsKICAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGID0gU0RIVUZGOwogICAgICAgICAgIHBEZWNvZGVyLT5TQlJFRklORSA9IDE7CiAgICAgICAgICAgcERlY29kZXItPlNCVyA9IFNZTVdJRFRIOwpAQCAtMTMxLDM3ICsxMzAsMzIgQEAKICAgICAgICAgICB9CiAgICAgICAgICAgU0JTWU1DT0RFTEVOID0gKHVpbnQ4X3QpblRtcDsKICAgICAgICAgICBwRGVjb2Rlci0+U0JTWU1DT0RFTEVOID0gU0JTWU1DT0RFTEVOOwotICAgICAgICAgIFNCU1lNUyA9IEZYX0FsbG9jKENKQmlnMl9JbWFnZSosIFNCTlVNU1lNUyk7Ci0gICAgICAgICAgSkJJRzJfbWVtY3B5KFNCU1lNUywgU0RJTlNZTVMsIFNETlVNSU5TWU1TICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKLSAgICAgICAgICBKQklHMl9tZW1jcHkoU0JTWU1TICsgU0ROVU1JTlNZTVMsIFNETkVXU1lNUywKLSAgICAgICAgICAgICAgICAgICAgICAgTlNZTVNERUNPREVEICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKLSAgICAgICAgICBwRGVjb2Rlci0+U0JTWU1TID0gU0JTWU1TOworICAgICAgICAgIFNCU1lNUy5yZXNpemUoU0JOVU1TWU1TKTsKKyAgICAgICAgICBzdGQ6OmNvcHkoU0RJTlNZTVMsIFNESU5TWU1TICsgU0ROVU1JTlNZTVMsIFNCU1lNUy5iZWdpbigpKTsKKyAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE5TWU1TREVDT0RFRDsgKytpKQorICAgICAgICAgICAgU0JTWU1TW2kgKyBTRE5VTUlOU1lNU10gPSBTRE5FV1NZTVNbaV0uZ2V0KCk7CisgICAgICAgICAgcERlY29kZXItPlNCU1lNUyA9IFNCU1lNUy5kYXRhKCk7CiAgICAgICAgICAgcERlY29kZXItPlNCREVGUElYRUwgPSAwOwogICAgICAgICAgIHBEZWNvZGVyLT5TQkNPTUJPUCA9IEpCSUcyX0NPTVBPU0VfT1I7CiAgICAgICAgICAgcERlY29kZXItPlRSQU5TUE9TRUQgPSAwOwogICAgICAgICAgIHBEZWNvZGVyLT5SRUZDT1JORVIgPSBKQklHMl9DT1JORVJfVE9QTEVGVDsKICAgICAgICAgICBwRGVjb2Rlci0+U0JEU09GRlNFVCA9IDA7Ci0gICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9IdWZmbWFuVGFibGU+IFNCSFVGRkZTKG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKAotICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfQjYsIEh1ZmZtYW5UYWJsZV9CNl9TaXplLCBIdWZmbWFuVGFibGVfSFRPT0JfQjYpKTsKLSAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4gU0JIVUZGRFMobmV3IENKQmlnMl9IdWZmbWFuVGFibGUoCi0gICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9COCwgSHVmZm1hblRhYmxlX0I4X1NpemUsIEh1ZmZtYW5UYWJsZV9IVE9PQl9COCkpOwotICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSHVmZm1hblRhYmxlPiBTQkhVRkZEVChuZXcgQ0pCaWcyX0h1ZmZtYW5UYWJsZSgKLSAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0IxMSwgSHVmZm1hblRhYmxlX0IxMV9TaXplLCBIdWZmbWFuVGFibGVfSFRPT0JfQjExKSk7Ci0gICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9IdWZmbWFuVGFibGU+IFNCSFVGRlJEVygKLSAgICAgICAgICAgICAgbmV3IENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxNSwgSHVmZm1hblRhYmxlX0IxNV9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7Ci0gICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9IdWZmbWFuVGFibGU+IFNCSFVGRlJESCgKLSAgICAgICAgICAgICAgbmV3IENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxNSwgSHVmZm1hblRhYmxlX0IxNV9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7Ci0gICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9IdWZmbWFuVGFibGU+IFNCSFVGRlJEWCgKLSAgICAgICAgICAgICAgbmV3IENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxNSwgSHVmZm1hblRhYmxlX0IxNV9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7Ci0gICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9IdWZmbWFuVGFibGU+IFNCSFVGRlJEWSgKLSAgICAgICAgICAgICAgbmV3IENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxNSwgSHVmZm1hblRhYmxlX0IxNV9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7Ci0gICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9IdWZmbWFuVGFibGU+IFNCSFVGRlJTSVpFKAotICAgICAgICAgICAgICBuZXcgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjEsIEh1ZmZtYW5UYWJsZV9CMV9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjEpKTsKKyAgICAgICAgICBhdXRvIFNCSFVGRkZTID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9IdWZmbWFuVGFibGU+KAorICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfQjYsIEh1ZmZtYW5UYWJsZV9CNl9TaXplLCBIdWZmbWFuVGFibGVfSFRPT0JfQjYpOworICAgICAgICAgIGF1dG8gU0JIVUZGRFMgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4oCisgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9COCwgSHVmZm1hblRhYmxlX0I4X1NpemUsIEh1ZmZtYW5UYWJsZV9IVE9PQl9COCk7CisgICAgICAgICAgYXV0byBTQkhVRkZEVCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSHVmZm1hblRhYmxlPigKKyAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0IxMSwgSHVmZm1hblRhYmxlX0IxMV9TaXplLCBIdWZmbWFuVGFibGVfSFRPT0JfQjExKTsKKyAgICAgICAgICBhdXRvIFNCSFVGRlJEVyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSHVmZm1hblRhYmxlPigKKyAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0IxNSwgSHVmZm1hblRhYmxlX0IxNV9TaXplLCBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KTsKKyAgICAgICAgICBhdXRvIFNCSFVGRlJESCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSHVmZm1hblRhYmxlPigKKyAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0IxNSwgSHVmZm1hblRhYmxlX0IxNV9TaXplLCBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KTsKKyAgICAgICAgICBhdXRvIFNCSFVGRlJEWCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSHVmZm1hblRhYmxlPigKKyAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0IxNSwgSHVmZm1hblRhYmxlX0IxNV9TaXplLCBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KTsKKyAgICAgICAgICBhdXRvIFNCSFVGRlJEWSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSHVmZm1hblRhYmxlPigKKyAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0IxNSwgSHVmZm1hblRhYmxlX0IxNV9TaXplLCBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KTsKKyAgICAgICAgICBhdXRvIFNCSFVGRlJTSVpFID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9IdWZmbWFuVGFibGU+KAorICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfQjEsIEh1ZmZtYW5UYWJsZV9CMV9TaXplLCBIdWZmbWFuVGFibGVfSFRPT0JfQjEpOwogICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZGUyA9IFNCSFVGRkZTLmdldCgpOwogICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZEUyA9IFNCSFVGRkRTLmdldCgpOwogICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkZEVCA9IFNCSFVGRkRULmdldCgpOwpAQCAtMTg3LDI5ICsxODEsMjUgQEAKICAgICAgICAgICBpZHMuSUFSRFkgPSBJQVJEWS5nZXQoKTsKICAgICAgICAgICBpZHMuSUFJRCA9IElBSUQuZ2V0KCk7CiAgICAgICAgICAgQlMgPSBwRGVjb2Rlci0+ZGVjb2RlX0FyaXRoKHBBcml0aERlY29kZXIsIGdyQ29udGV4dC0+ZGF0YSgpLCAmaWRzKTsKLSAgICAgICAgICBpZiAoIUJTKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKFNCU1lNUyk7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgRlhfRnJlZShTQlNZTVMpOworICAgICAgICAgIGlmICghQlMpCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICAgICAgfSBlbHNlIGlmIChSRUZBR0dOSU5TVCA9PSAxKSB7CiAgICAgICAgICAgU0JOVU1TWU1TID0gU0ROVU1JTlNZTVMgKyBOU1lNU0RFQ09ERUQ7CiAgICAgICAgICAgdWludDMyX3QgSURJOwogICAgICAgICAgIElBSUQtPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmSURJKTsKICAgICAgICAgICBJQVJEWC0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZSRFhJKTsKICAgICAgICAgICBJQVJEWS0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZSRFlJKTsKLSAgICAgICAgICBpZiAoSURJID49IFNCTlVNU1lNUykgewotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIFNCU1lNUyA9IEZYX0FsbG9jKENKQmlnMl9JbWFnZSosIFNCTlVNU1lNUyk7Ci0gICAgICAgICAgSkJJRzJfbWVtY3B5KFNCU1lNUywgU0RJTlNZTVMsIFNETlVNSU5TWU1TICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKLSAgICAgICAgICBKQklHMl9tZW1jcHkoU0JTWU1TICsgU0ROVU1JTlNZTVMsIFNETkVXU1lNUywKLSAgICAgICAgICAgICAgICAgICAgICAgTlNZTVNERUNPREVEICogc2l6ZW9mKENKQmlnMl9JbWFnZSopKTsKLSAgICAgICAgICBpZiAoIVNCU1lNU1tJREldKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKFNCU1lNUyk7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9HUlJEUHJvYz4gcEdSUkQobmV3IENKQmlnMl9HUlJEUHJvYygpKTsKKyAgICAgICAgICBpZiAoSURJID49IFNCTlVNU1lNUykKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICAgICAgU0JTWU1TLnJlc2l6ZShTQk5VTVNZTVMpOworICAgICAgICAgIHN0ZDo6Y29weShTRElOU1lNUywgU0RJTlNZTVMgKyBTRE5VTUlOU1lNUywgU0JTWU1TLmJlZ2luKCkpOworICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTlNZTVNERUNPREVEOyArK2kpCisgICAgICAgICAgICBTQlNZTVNbaSArIFNETlVNSU5TWU1TXSA9IFNETkVXU1lNU1tpXS5nZXQoKTsKKyAgICAgICAgICBpZiAoIVNCU1lNU1tJREldKQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgICAgICBhdXRvIHBHUlJEID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9HUlJEUHJvYz4oKTsKICAgICAgICAgICBwR1JSRC0+R1JXID0gU1lNV0lEVEg7CiAgICAgICAgICAgcEdSUkQtPkdSSCA9IEhDSEVJR0hUOwogICAgICAgICAgIHBHUlJELT5HUlRFTVBMQVRFID0gU0RSVEVNUExBVEU7CkBAIC0yMjIsMjggKzIxMiwyMyBAQAogICAgICAgICAgIHBHUlJELT5HUkFUWzJdID0gU0RSQVRbMl07CiAgICAgICAgICAgcEdSUkQtPkdSQVRbM10gPSBTRFJBVFszXTsKICAgICAgICAgICBCUyA9IHBHUlJELT5kZWNvZGUocEFyaXRoRGVjb2RlciwgZ3JDb250ZXh0LT5kYXRhKCkpOwotICAgICAgICAgIGlmICghQlMpIHsKLSAgICAgICAgICAgIEZYX0ZyZWUoU0JTWU1TKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgIH0KLSAgICAgICAgICBGWF9GcmVlKFNCU1lNUyk7CisgICAgICAgICAgaWYgKCFCUykKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgICBTRE5FV1NZTVNbTlNZTVNERUNPREVEXSA9IEJTOwotICAgICAgQlMgPSBudWxscHRyOworICAgICAgU0RORVdTWU1TW05TWU1TREVDT0RFRF0gPSBzdGQ6Om1vdmUoQlMpOwogICAgICAgTlNZTVNERUNPREVEID0gTlNZTVNERUNPREVEICsgMTsKICAgICB9CiAgIH0KICAgRVhJTkRFWCA9IDA7CiAgIENVUkVYRkxBRyA9IDA7Ci0gIEVYRkxBR1MgPSBGWF9BbGxvYyhib29sLCBTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUyk7CisgIEVYRkxBR1MucmVzaXplKFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TKTsKICAgbnVtX2V4X3N5bXMgPSAwOwogICB3aGlsZSAoRVhJTkRFWCA8IFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TKSB7CiAgICAgSUFFWC0+ZGVjb2RlKHBBcml0aERlY29kZXIsIChpbnQqKSZFWFJVTkxFTkdUSCk7Ci0gICAgaWYgKEVYSU5ERVggKyBFWFJVTkxFTkdUSCA+IFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TKSB7Ci0gICAgICBGWF9GcmVlKEVYRkxBR1MpOwotICAgICAgZ290byBmYWlsZWQ7Ci0gICAgfQorICAgIGlmIChFWElOREVYICsgRVhSVU5MRU5HVEggPiBTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUykKKyAgICAgIHJldHVybiBudWxscHRyOworCiAgICAgaWYgKEVYUlVOTEVOR1RIICE9IDApIHsKICAgICAgIGZvciAoSSA9IEVYSU5ERVg7IEkgPCBFWElOREVYICsgRVhSVU5MRU5HVEg7IEkrKykgewogICAgICAgICBpZiAoQ1VSRVhGTEFHKQpAQCAtMjU0LDEyNSArMjM5LDEwMCBAQAogICAgIEVYSU5ERVggPSBFWElOREVYICsgRVhSVU5MRU5HVEg7CiAgICAgQ1VSRVhGTEFHID0gIUNVUkVYRkxBRzsKICAgfQotICBpZiAobnVtX2V4X3N5bXMgPiBTRE5VTUVYU1lNUykgewotICAgIEZYX0ZyZWUoRVhGTEFHUyk7Ci0gICAgZ290byBmYWlsZWQ7Ci0gIH0KKyAgaWYgKG51bV9leF9zeW1zID4gU0ROVU1FWFNZTVMpCisgICAgcmV0dXJuIG51bGxwdHI7CiAKICAgcERpY3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX1N5bWJvbERpY3Q+KCk7CiAgIEkgPSBKID0gMDsKICAgZm9yIChJID0gMDsgSSA8IFNETlVNSU5TWU1TICsgU0ROVU1ORVdTWU1TOyBJKyspIHsKLSAgICBpZiAoRVhGTEFHU1tJXSAmJiBKIDwgU0ROVU1FWFNZTVMpIHsKLSAgICAgIGlmIChJIDwgU0ROVU1JTlNZTVMpIHsKLSAgICAgICAgcERpY3QtPkFkZEltYWdlKFNESU5TWU1TW0ldCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0ltYWdlPigqU0RJTlNZTVNbSV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBEaWN0LT5BZGRJbWFnZShwZGZpdW06OldyYXBVbmlxdWUoU0RORVdTWU1TW0kgLSBTRE5VTUlOU1lNU10pKTsKLSAgICAgIH0KLSAgICAgICsrSjsKLSAgICB9IGVsc2UgaWYgKCFFWEZMQUdTW0ldICYmIEkgPj0gU0ROVU1JTlNZTVMpIHsKLSAgICAgIGRlbGV0ZSBTRE5FV1NZTVNbSSAtIFNETlVNSU5TWU1TXTsKKyAgICBpZiAoIUVYRkxBR1NbSV0gfHwgSiA+PSBTRE5VTUVYU1lNUykKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChJIDwgU0ROVU1JTlNZTVMpIHsKKyAgICAgIHBEaWN0LT5BZGRJbWFnZShTRElOU1lNU1tJXQorICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSW1hZ2U+KCpTRElOU1lNU1tJXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyKTsKKyAgICB9IGVsc2UgeworICAgICAgcERpY3QtPkFkZEltYWdlKHN0ZDo6bW92ZShTRE5FV1NZTVNbSSAtIFNETlVNSU5TWU1TXSkpOwogICAgIH0KKyAgICArK0o7CiAgIH0KLSAgRlhfRnJlZShFWEZMQUdTKTsKLSAgRlhfRnJlZShTRE5FV1NZTVMpOwotICByZXR1cm4gcERpY3QucmVsZWFzZSgpOwotZmFpbGVkOgotICBmb3IgKEkgPSAwOyBJIDwgTlNZTVNERUNPREVEOyBJKyspIHsKLSAgICBpZiAoU0RORVdTWU1TW0ldKSB7Ci0gICAgICBkZWxldGUgU0RORVdTWU1TW0ldOwotICAgICAgU0RORVdTWU1TW0ldID0gbnVsbHB0cjsKLSAgICB9Ci0gIH0KLSAgRlhfRnJlZShTRE5FV1NZTVMpOwotICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIHBEaWN0OwogfQogCi1DSkJpZzJfU3ltYm9sRGljdCogQ0pCaWcyX1NERFByb2M6OmRlY29kZV9IdWZmbWFuKAorc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9TeW1ib2xEaWN0PiBDSkJpZzJfU0REUHJvYzo6ZGVjb2RlX0h1ZmZtYW4oCiAgICAgQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSwKICAgICBzdGQ6OnZlY3RvcjxKQmlnMkFyaXRoQ3R4PiogZ2JDb250ZXh0LAotICAgIHN0ZDo6dmVjdG9yPEpCaWcyQXJpdGhDdHg+KiBnckNvbnRleHQsCi0gICAgSUZYX1BhdXNlKiBwUGF1c2UpIHsKLSAgQ0pCaWcyX0ltYWdlKiogU0RORVdTWU1TOwotICB1aW50MzJfdCogU0RORVdTWU1XSURUSFM7CisgICAgc3RkOjp2ZWN0b3I8SkJpZzJBcml0aEN0eD4qIGdyQ29udGV4dCkgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPj4gU0RORVdTWU1TOworICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gU0RORVdTWU1XSURUSFM7CiAgIHVpbnQzMl90IEhDSEVJR0hULCBOU1lNU0RFQ09ERUQ7CiAgIGludDMyX3QgSENESDsKICAgdWludDMyX3QgU1lNV0lEVEgsIFRPVFdJRFRILCBIQ0ZJUlNUU1lNOwogICBpbnQzMl90IERXOwotICBDSkJpZzJfSW1hZ2UgKkJTLCAqQkhDOwogICB1aW50MzJfdCBJLCBKLCBSRUZBR0dOSU5TVDsKLSAgYm9vbCogRVhGTEFHUzsKKyAgc3RkOjp2ZWN0b3I8Ym9vbD4gRVhGTEFHUzsKICAgdWludDMyX3QgRVhJTkRFWDsKICAgYm9vbCBDVVJFWEZMQUc7CiAgIHVpbnQzMl90IEVYUlVOTEVOR1RIOwotICBpbnQzMl90IG5WYWwsIG5CaXRzOworICBpbnQzMl90IG5WYWw7CiAgIHVpbnQzMl90IG5UbXA7CiAgIHVpbnQzMl90IFNCTlVNU1lNUzsKICAgdWludDhfdCBTQlNZTUNPREVMRU47Ci0gIEpCaWcySHVmZm1hbkNvZGUqIFNCU1lNQ09ERVM7CiAgIHVpbnQzMl90IElESTsKICAgaW50MzJfdCBSRFhJLCBSRFlJOwogICB1aW50MzJfdCBCTVNJWkU7CiAgIHVpbnQzMl90IHN0cmlkZTsKICAgdWludDMyX3QgbnVtX2V4X3N5bXM7Ci0gIENKQmlnMl9JbWFnZSoqIFNCU1lNUzsKLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9IdWZmbWFuRGVjb2Rlcj4gcEh1ZmZtYW5EZWNvZGVyKAotICAgICAgbmV3IENKQmlnMl9IdWZmbWFuRGVjb2RlcihwU3RyZWFtKSk7Ci0gIFNETkVXU1lNUyA9IEZYX0FsbG9jKENKQmlnMl9JbWFnZSosIFNETlVNTkVXU1lNUyk7Ci0gIEZYU1lTX21lbXNldChTRE5FV1NZTVMsIDAsIFNETlVNTkVXU1lNUyAqIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7Ci0gIFNETkVXU1lNV0lEVEhTID0gbnVsbHB0cjsKLSAgQkhDID0gbnVsbHB0cjsKLSAgaWYgKFNEUkVGQUdHID09IDApIHsKLSAgICBTRE5FV1NZTVdJRFRIUyA9IEZYX0FsbG9jKHVpbnQzMl90LCBTRE5VTU5FV1NZTVMpOwotICAgIEZYU1lTX21lbXNldChTRE5FV1NZTVdJRFRIUywgMCwgU0ROVU1ORVdTWU1TICogc2l6ZW9mKHVpbnQzMl90KSk7Ci0gIH0KLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9TeW1ib2xEaWN0PiBwRGljdChuZXcgQ0pCaWcyX1N5bWJvbERpY3QoKSk7CisgIC8vIFBvaW50ZXJzIGFyZSBub3Qgb3duZWQKKyAgc3RkOjp2ZWN0b3I8Q0pCaWcyX0ltYWdlKj4gU0JTWU1TOworICBhdXRvIHBIdWZmbWFuRGVjb2RlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSHVmZm1hbkRlY29kZXI+KHBTdHJlYW0pOworICBTRE5FV1NZTVMucmVzaXplKFNETlVNTkVXU1lNUyk7CisgIGlmIChTRFJFRkFHRyA9PSAwKQorICAgIFNETkVXU1lNV0lEVEhTLnJlc2l6ZShTRE5VTU5FV1NZTVMpOworICBhdXRvIHBEaWN0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9TeW1ib2xEaWN0PigpOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4gcFRhYmxlOwogCiAgIEhDSEVJR0hUID0gMDsKICAgTlNZTVNERUNPREVEID0gMDsKLSAgQlMgPSBudWxscHRyOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBCUzsKICAgd2hpbGUgKE5TWU1TREVDT0RFRCA8IFNETlVNTkVXU1lNUykgewotICAgIGlmIChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTREhVRkZESCwgJkhDREgpICE9IDApIHsKLSAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KKyAgICBpZiAocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0RIVUZGREgsICZIQ0RIKSAhPSAwKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisKICAgICBIQ0hFSUdIVCA9IEhDSEVJR0hUICsgSENESDsKLSAgICBpZiAoKGludClIQ0hFSUdIVCA8IDAgfHwgKGludClIQ0hFSUdIVCA+IEpCSUcyX01BWF9JTUFHRV9TSVpFKSB7Ci0gICAgICBnb3RvIGZhaWxlZDsKLSAgICB9CisgICAgaWYgKChpbnQpSENIRUlHSFQgPCAwIHx8IChpbnQpSENIRUlHSFQgPiBKQklHMl9NQVhfSU1BR0VfU0laRSkKKyAgICAgIHJldHVybiBudWxscHRyOworCiAgICAgU1lNV0lEVEggPSAwOwogICAgIFRPVFdJRFRIID0gMDsKICAgICBIQ0ZJUlNUU1lNID0gTlNZTVNERUNPREVEOwogICAgIGZvciAoOzspIHsKICAgICAgIG5WYWwgPSBwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTREhVRkZEVywgJkRXKTsKLSAgICAgIGlmIChuVmFsID09IEpCSUcyX09PQikgeworICAgICAgaWYgKG5WYWwgPT0gSkJJRzJfT09CKQogICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSBpZiAoblZhbCAhPSAwKSB7Ci0gICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKE5TWU1TREVDT0RFRCA+PSBTRE5VTU5FV1NZTVMpIHsKLSAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfQotICAgICAgICBTWU1XSURUSCA9IFNZTVdJRFRIICsgRFc7Ci0gICAgICAgIGlmICgoaW50KVNZTVdJRFRIIDwgMCB8fCAoaW50KVNZTVdJRFRIID4gSkJJRzJfTUFYX0lNQUdFX1NJWkUpIHsKLSAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgfSBlbHNlIGlmIChIQ0hFSUdIVCA9PSAwIHx8IFNZTVdJRFRIID09IDApIHsKLSAgICAgICAgICBUT1RXSURUSCA9IFRPVFdJRFRIICsgU1lNV0lEVEg7Ci0gICAgICAgICAgU0RORVdTWU1TW05TWU1TREVDT0RFRF0gPSBudWxscHRyOwotICAgICAgICAgIE5TWU1TREVDT0RFRCA9IE5TWU1TREVDT0RFRCArIDE7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KKyAgICAgIGlmIChuVmFsICE9IDApCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgaWYgKE5TWU1TREVDT0RFRCA+PSBTRE5VTU5FV1NZTVMpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICBTWU1XSURUSCA9IFNZTVdJRFRIICsgRFc7CisgICAgICBpZiAoKGludClTWU1XSURUSCA8IDAgfHwgKGludClTWU1XSURUSCA+IEpCSUcyX01BWF9JTUFHRV9TSVpFKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIGlmIChIQ0hFSUdIVCA9PSAwIHx8IFNZTVdJRFRIID09IDApIHsKICAgICAgICAgVE9UV0lEVEggPSBUT1RXSURUSCArIFNZTVdJRFRIOworICAgICAgICBTRE5FV1NZTVNbTlNZTVNERUNPREVEXSA9IG51bGxwdHI7CisgICAgICAgIE5TWU1TREVDT0RFRCA9IE5TWU1TREVDT0RFRCArIDE7CisgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQorICAgICAgVE9UV0lEVEggPSBUT1RXSURUSCArIFNZTVdJRFRIOwogICAgICAgaWYgKFNEUkVGQUdHID09IDEpIHsKICAgICAgICAgaWYgKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNESFVGRkFHR0lOU1QsIChpbnQqKSZSRUZBR0dOSU5TVCkgIT0KICAgICAgICAgICAgIDApIHsKLSAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICAgICAgfQogICAgICAgICBCUyA9IG51bGxwdHI7CiAgICAgICAgIGlmIChSRUZBR0dOSU5TVCA+IDEpIHsKLSAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX1RSRFByb2M+IHBEZWNvZGVyKG5ldyBDSkJpZzJfVFJEUHJvYygpKTsKKyAgICAgICAgICBhdXRvIHBEZWNvZGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9UUkRQcm9jPigpOwogICAgICAgICAgIHBEZWNvZGVyLT5TQkhVRkYgPSBTREhVRkY7CiAgICAgICAgICAgcERlY29kZXItPlNCUkVGSU5FID0gMTsKICAgICAgICAgICBwRGVjb2Rlci0+U0JXID0gU1lNV0lEVEg7CkBAIC0zODEsNDcgKzM0MSw0MSBAQAogICAgICAgICAgIHBEZWNvZGVyLT5TQlNUUklQUyA9IDE7CiAgICAgICAgICAgcERlY29kZXItPlNCTlVNU1lNUyA9IFNETlVNSU5TWU1TICsgTlNZTVNERUNPREVEOwogICAgICAgICAgIFNCTlVNU1lNUyA9IHBEZWNvZGVyLT5TQk5VTVNZTVM7Ci0gICAgICAgICAgU0JTWU1DT0RFUyA9IEZYX0FsbG9jKEpCaWcySHVmZm1hbkNvZGUsIFNCTlVNU1lNUyk7CisgICAgICAgICAgc3RkOjp2ZWN0b3I8SkJpZzJIdWZmbWFuQ29kZT4gU0JTWU1DT0RFUyhTQk5VTVNZTVMpOwogICAgICAgICAgIG5UbXAgPSAxOwotICAgICAgICAgIHdoaWxlICgodWludDMyX3QpKDEgPDwgblRtcCkgPCBTQk5VTVNZTVMpIHsKLSAgICAgICAgICAgIG5UbXArKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZm9yIChJID0gMDsgSSA8IFNCTlVNU1lNUzsgSSsrKSB7CisgICAgICAgICAgd2hpbGUgKHN0YXRpY19jYXN0PHVpbnQzMl90PigxIDw8IG5UbXApIDwgU0JOVU1TWU1TKQorICAgICAgICAgICAgKytuVG1wOworICAgICAgICAgIGZvciAoSSA9IDA7IEkgPCBTQk5VTVNZTVM7ICsrSSkgewogICAgICAgICAgICAgU0JTWU1DT0RFU1tJXS5jb2RlbGVuID0gblRtcDsKICAgICAgICAgICAgIFNCU1lNQ09ERVNbSV0uY29kZSA9IEk7CiAgICAgICAgICAgfQotICAgICAgICAgIHBEZWNvZGVyLT5TQlNZTUNPREVTID0gU0JTWU1DT0RFUzsKLSAgICAgICAgICBTQlNZTVMgPSBGWF9BbGxvYyhDSkJpZzJfSW1hZ2UqLCBTQk5VTVNZTVMpOwotICAgICAgICAgIEpCSUcyX21lbWNweShTQlNZTVMsIFNESU5TWU1TLCBTRE5VTUlOU1lNUyAqIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7Ci0gICAgICAgICAgSkJJRzJfbWVtY3B5KFNCU1lNUyArIFNETlVNSU5TWU1TLCBTRE5FV1NZTVMsCi0gICAgICAgICAgICAgICAgICAgICAgIE5TWU1TREVDT0RFRCAqIHNpemVvZihDSkJpZzJfSW1hZ2UqKSk7Ci0gICAgICAgICAgcERlY29kZXItPlNCU1lNUyA9IFNCU1lNUzsKKyAgICAgICAgICBwRGVjb2Rlci0+U0JTWU1DT0RFUyA9IHN0ZDo6bW92ZShTQlNZTUNPREVTKTsKKyAgICAgICAgICBTQlNZTVMucmVzaXplKFNCTlVNU1lNUyk7CisgICAgICAgICAgc3RkOjpjb3B5KFNESU5TWU1TLCBTRElOU1lNUyArIFNETlVNSU5TWU1TLCBTQlNZTVMuYmVnaW4oKSk7CisgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOU1lNU0RFQ09ERUQ7ICsraSkKKyAgICAgICAgICAgIFNCU1lNU1tpICsgU0ROVU1JTlNZTVNdID0gU0RORVdTWU1TW2ldLmdldCgpOworICAgICAgICAgIHBEZWNvZGVyLT5TQlNZTVMgPSBTQlNZTVMuZGF0YSgpOwogICAgICAgICAgIHBEZWNvZGVyLT5TQkRFRlBJWEVMID0gMDsKICAgICAgICAgICBwRGVjb2Rlci0+U0JDT01CT1AgPSBKQklHMl9DT01QT1NFX09SOwogICAgICAgICAgIHBEZWNvZGVyLT5UUkFOU1BPU0VEID0gMDsKICAgICAgICAgICBwRGVjb2Rlci0+UkVGQ09STkVSID0gSkJJRzJfQ09STkVSX1RPUExFRlQ7CiAgICAgICAgICAgcERlY29kZXItPlNCRFNPRkZTRVQgPSAwOwotICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSHVmZm1hblRhYmxlPiBTQkhVRkZGUyhuZXcgQ0pCaWcyX0h1ZmZtYW5UYWJsZSgKLSAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0I2LCBIdWZmbWFuVGFibGVfQjZfU2l6ZSwgSHVmZm1hblRhYmxlX0hUT09CX0I2KSk7Ci0gICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9IdWZmbWFuVGFibGU+IFNCSFVGRkRTKG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKAotICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfQjgsIEh1ZmZtYW5UYWJsZV9COF9TaXplLCBIdWZmbWFuVGFibGVfSFRPT0JfQjgpKTsKLSAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4gU0JIVUZGRFQobmV3IENKQmlnMl9IdWZmbWFuVGFibGUoCi0gICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9CMTEsIEh1ZmZtYW5UYWJsZV9CMTFfU2l6ZSwgSHVmZm1hblRhYmxlX0hUT09CX0IxMSkpOwotICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSHVmZm1hblRhYmxlPiBTQkhVRkZSRFcoCi0gICAgICAgICAgICAgIG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsIEh1ZmZtYW5UYWJsZV9CMTVfU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IxNSkpOwotICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSHVmZm1hblRhYmxlPiBTQkhVRkZSREgoCi0gICAgICAgICAgICAgIG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsIEh1ZmZtYW5UYWJsZV9CMTVfU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IxNSkpOwotICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSHVmZm1hblRhYmxlPiBTQkhVRkZSRFgoCi0gICAgICAgICAgICAgIG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsIEh1ZmZtYW5UYWJsZV9CMTVfU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IxNSkpOwotICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSHVmZm1hblRhYmxlPiBTQkhVRkZSRFkoCi0gICAgICAgICAgICAgIG5ldyBDSkJpZzJfSHVmZm1hblRhYmxlKEh1ZmZtYW5UYWJsZV9CMTUsIEh1ZmZtYW5UYWJsZV9CMTVfU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IxNSkpOwotICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSHVmZm1hblRhYmxlPiBTQkhVRkZSU0laRSgKLSAgICAgICAgICAgICAgbmV3IENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxLCBIdWZmbWFuVGFibGVfQjFfU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0hUT09CX0IxKSk7CisgICAgICAgICAgYXV0byBTQkhVRkZGUyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSHVmZm1hblRhYmxlPigKKyAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0I2LCBIdWZmbWFuVGFibGVfQjZfU2l6ZSwgSHVmZm1hblRhYmxlX0hUT09CX0I2KTsKKyAgICAgICAgICBhdXRvIFNCSFVGRkRTID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9IdWZmbWFuVGFibGU+KAorICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfQjgsIEh1ZmZtYW5UYWJsZV9COF9TaXplLCBIdWZmbWFuVGFibGVfSFRPT0JfQjgpOworICAgICAgICAgIGF1dG8gU0JIVUZGRFQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4oCisgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9CMTEsIEh1ZmZtYW5UYWJsZV9CMTFfU2l6ZSwgSHVmZm1hblRhYmxlX0hUT09CX0IxMSk7CisgICAgICAgICAgYXV0byBTQkhVRkZSRFcgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4oCisgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9CMTUsIEh1ZmZtYW5UYWJsZV9CMTVfU2l6ZSwgSHVmZm1hblRhYmxlX0hUT09CX0IxNSk7CisgICAgICAgICAgYXV0byBTQkhVRkZSREggPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4oCisgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9CMTUsIEh1ZmZtYW5UYWJsZV9CMTVfU2l6ZSwgSHVmZm1hblRhYmxlX0hUT09CX0IxNSk7CisgICAgICAgICAgYXV0byBTQkhVRkZSRFggPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4oCisgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9CMTUsIEh1ZmZtYW5UYWJsZV9CMTVfU2l6ZSwgSHVmZm1hblRhYmxlX0hUT09CX0IxNSk7CisgICAgICAgICAgYXV0byBTQkhVRkZSRFkgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4oCisgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZV9CMTUsIEh1ZmZtYW5UYWJsZV9CMTVfU2l6ZSwgSHVmZm1hblRhYmxlX0hUT09CX0IxNSk7CisgICAgICAgICAgYXV0byBTQkhVRkZSU0laRSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSHVmZm1hblRhYmxlPigKKyAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0IxLCBIdWZmbWFuVGFibGVfQjFfU2l6ZSwgSHVmZm1hblRhYmxlX0hUT09CX0IxKTsKICAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGRlMgPSBTQkhVRkZGUy5nZXQoKTsKICAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGRFMgPSBTQkhVRkZEUy5nZXQoKTsKICAgICAgICAgICBwRGVjb2Rlci0+U0JIVUZGRFQgPSBTQkhVRkZEVC5nZXQoKTsKQEAgLTQzNiwxMyArMzkwLDkgQEAKICAgICAgICAgICBwRGVjb2Rlci0+U0JSQVRbMl0gPSBTRFJBVFsyXTsKICAgICAgICAgICBwRGVjb2Rlci0+U0JSQVRbM10gPSBTRFJBVFszXTsKICAgICAgICAgICBCUyA9IHBEZWNvZGVyLT5kZWNvZGVfSHVmZm1hbihwU3RyZWFtLCBnckNvbnRleHQtPmRhdGEoKSk7Ci0gICAgICAgICAgaWYgKCFCUykgewotICAgICAgICAgICAgRlhfRnJlZShTQlNZTUNPREVTKTsKLSAgICAgICAgICAgIEZYX0ZyZWUoU0JTWU1TKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgIH0KLSAgICAgICAgICBGWF9GcmVlKFNCU1lNQ09ERVMpOwotICAgICAgICAgIEZYX0ZyZWUoU0JTWU1TKTsKKyAgICAgICAgICBpZiAoIUJTKQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKICAgICAgICAgfSBlbHNlIGlmIChSRUZBR0dOSU5TVCA9PSAxKSB7CiAgICAgICAgICAgU0JOVU1TWU1TID0gU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVM7CiAgICAgICAgICAgblRtcCA9IDE7CkBAIC00NTAsNDggKzQwMCwzNSBAQAogICAgICAgICAgICAgblRtcCsrOwogICAgICAgICAgIH0KICAgICAgICAgICBTQlNZTUNPREVMRU4gPSAodWludDhfdCluVG1wOwotICAgICAgICAgIFNCU1lNQ09ERVMgPSBGWF9BbGxvYyhKQmlnMkh1ZmZtYW5Db2RlLCBTQk5VTVNZTVMpOwotICAgICAgICAgIGZvciAoSSA9IDA7IEkgPCBTQk5VTVNZTVM7IEkrKykgewotICAgICAgICAgICAgU0JTWU1DT0RFU1tJXS5jb2RlbGVuID0gU0JTWU1DT0RFTEVOOwotICAgICAgICAgICAgU0JTWU1DT0RFU1tJXS5jb2RlID0gSTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgblZhbCA9IDA7Ci0gICAgICAgICAgbkJpdHMgPSAwOworICAgICAgICAgIHVpbnQzMl90IHVWYWwgPSAwOwogICAgICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIGlmIChwU3RyZWFtLT5yZWFkMUJpdCgmblRtcCkgIT0gMCkgewotICAgICAgICAgICAgICBGWF9GcmVlKFNCU1lNQ09ERVMpOwotICAgICAgICAgICAgICBnb3RvIGZhaWxlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5WYWwgPSAoblZhbCA8PCAxKSB8IG5UbXA7Ci0gICAgICAgICAgICBmb3IgKElESSA9IDA7IElESSA8IFNCTlVNU1lNUzsgSURJKyspIHsKLSAgICAgICAgICAgICAgaWYgKChuVmFsID09IFNCU1lNQ09ERVNbSURJXS5jb2RlKSAmJgotICAgICAgICAgICAgICAgICAgKG5CaXRzID09IFNCU1lNQ09ERVNbSURJXS5jb2RlbGVuKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoSURJIDwgU0JOVU1TWU1TKSB7CisgICAgICAgICAgICBpZiAocFN0cmVhbS0+cmVhZDFCaXQoJm5UbXApICE9IDApCisgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICAgICAgICB1VmFsID0gKHVWYWwgPDwgMSkgfCBuVG1wOworICAgICAgICAgICAgaWYgKHVWYWwgPj0gU0JOVU1TWU1TKQorICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgICAgICAgICAgSURJID0gU0JTWU1DT0RFTEVOID09IDAgPyB1VmFsIDogU0JOVU1TWU1TOworICAgICAgICAgICAgaWYgKElESSA8IFNCTlVNU1lNUykKICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgICAgIEZYX0ZyZWUoU0JTWU1DT0RFUyk7Ci0gICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9IdWZmbWFuVGFibGU+IFNCSFVGRlJEWCgKLSAgICAgICAgICAgICAgbmV3IENKQmlnMl9IdWZmbWFuVGFibGUoSHVmZm1hblRhYmxlX0IxNSwgSHVmZm1hblRhYmxlX0IxNV9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KSk7Ci0gICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9IdWZmbWFuVGFibGU+IFNCSFVGRlJTSVpFKAotICAgICAgICAgICAgICBuZXcgQ0pCaWcyX0h1ZmZtYW5UYWJsZShIdWZmbWFuVGFibGVfQjEsIEh1ZmZtYW5UYWJsZV9CMV9TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfSFRPT0JfQjEpKTsKKyAgICAgICAgICBhdXRvIFNCSFVGRlJEWCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSHVmZm1hblRhYmxlPigKKyAgICAgICAgICAgICAgSHVmZm1hblRhYmxlX0IxNSwgSHVmZm1hblRhYmxlX0IxNV9TaXplLCBIdWZmbWFuVGFibGVfSFRPT0JfQjE1KTsKKyAgICAgICAgICBhdXRvIFNCSFVGRlJTSVpFID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9IdWZmbWFuVGFibGU+KAorICAgICAgICAgICAgICBIdWZmbWFuVGFibGVfQjEsIEh1ZmZtYW5UYWJsZV9CMV9TaXplLCBIdWZmbWFuVGFibGVfSFRPT0JfQjEpOwogICAgICAgICAgIGlmICgocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGUkRYLmdldCgpLCAmUkRYSSkgIT0gMCkgfHwKICAgICAgICAgICAgICAgKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRlJEWC5nZXQoKSwgJlJEWUkpICE9IDApIHx8CiAgICAgICAgICAgICAgIChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTQkhVRkZSU0laRS5nZXQoKSwgJm5WYWwpICE9IDApKSB7Ci0gICAgICAgICAgICBnb3RvIGZhaWxlZDsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgICAgICAgIH0KICAgICAgICAgICBwU3RyZWFtLT5hbGlnbkJ5dGUoKTsKICAgICAgICAgICBuVG1wID0gcFN0cmVhbS0+Z2V0T2Zmc2V0KCk7Ci0gICAgICAgICAgU0JTWU1TID0gRlhfQWxsb2MoQ0pCaWcyX0ltYWdlKiwgU0JOVU1TWU1TKTsKLSAgICAgICAgICBKQklHMl9tZW1jcHkoU0JTWU1TLCBTRElOU1lNUywgU0ROVU1JTlNZTVMgKiBzaXplb2YoQ0pCaWcyX0ltYWdlKikpOwotICAgICAgICAgIEpCSUcyX21lbWNweShTQlNZTVMgKyBTRE5VTUlOU1lNUywgU0RORVdTWU1TLAotICAgICAgICAgICAgICAgICAgICAgICBOU1lNU0RFQ09ERUQgKiBzaXplb2YoQ0pCaWcyX0ltYWdlKikpOwotICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfR1JSRFByb2M+IHBHUlJEKG5ldyBDSkJpZzJfR1JSRFByb2MoKSk7CisgICAgICAgICAgU0JTWU1TLnJlc2l6ZShTQk5VTVNZTVMpOworICAgICAgICAgIHN0ZDo6Y29weShTRElOU1lNUywgU0RJTlNZTVMgKyBTRE5VTUlOU1lNUywgU0JTWU1TLmJlZ2luKCkpOworICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTlNZTVNERUNPREVEOyArK2kpCisgICAgICAgICAgICBTQlNZTVNbaSArIFNETlVNSU5TWU1TXSA9IFNETkVXU1lNU1tpXS5nZXQoKTsKKyAgICAgICAgICBhdXRvIHBHUlJEID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9HUlJEUHJvYz4oKTsKICAgICAgICAgICBwR1JSRC0+R1JXID0gU1lNV0lEVEg7CiAgICAgICAgICAgcEdSUkQtPkdSSCA9IEhDSEVJR0hUOwogICAgICAgICAgIHBHUlJELT5HUlRFTVBMQVRFID0gU0RSVEVNUExBVEU7CkBAIC01MDMsODMgKzQ0MCw3MyBAQAogICAgICAgICAgIHBHUlJELT5HUkFUWzFdID0gU0RSQVRbMV07CiAgICAgICAgICAgcEdSUkQtPkdSQVRbMl0gPSBTRFJBVFsyXTsKICAgICAgICAgICBwR1JSRC0+R1JBVFszXSA9IFNEUkFUWzNdOwotICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfQXJpdGhEZWNvZGVyPiBwQXJpdGhEZWNvZGVyKAotICAgICAgICAgICAgICBuZXcgQ0pCaWcyX0FyaXRoRGVjb2RlcihwU3RyZWFtKSk7CisgICAgICAgICAgYXV0byBwQXJpdGhEZWNvZGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9Bcml0aERlY29kZXI+KHBTdHJlYW0pOwogICAgICAgICAgIEJTID0gcEdSUkQtPmRlY29kZShwQXJpdGhEZWNvZGVyLmdldCgpLCBnckNvbnRleHQtPmRhdGEoKSk7Ci0gICAgICAgICAgaWYgKCFCUykgewotICAgICAgICAgICAgRlhfRnJlZShTQlNZTVMpOwotICAgICAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICAgICAgfQorICAgICAgICAgIGlmICghQlMpCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKwogICAgICAgICAgIHBTdHJlYW0tPmFsaWduQnl0ZSgpOwogICAgICAgICAgIHBTdHJlYW0tPm9mZnNldCgyKTsKLSAgICAgICAgICBpZiAoKHVpbnQzMl90KW5WYWwgIT0gKHBTdHJlYW0tPmdldE9mZnNldCgpIC0gblRtcCkpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBCUzsKLSAgICAgICAgICAgIEZYX0ZyZWUoU0JTWU1TKTsKLSAgICAgICAgICAgIGdvdG8gZmFpbGVkOwotICAgICAgICAgIH0KLSAgICAgICAgICBGWF9GcmVlKFNCU1lNUyk7CisgICAgICAgICAgaWYgKCh1aW50MzJfdCluVmFsICE9IChwU3RyZWFtLT5nZXRPZmZzZXQoKSAtIG5UbXApKQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgICAgIH0KLSAgICAgICAgU0RORVdTWU1TW05TWU1TREVDT0RFRF0gPSBCUzsKKyAgICAgICAgU0RORVdTWU1TW05TWU1TREVDT0RFRF0gPSBzdGQ6Om1vdmUoQlMpOwogICAgICAgfQotICAgICAgaWYgKFNEUkVGQUdHID09IDApIHsKKyAgICAgIGlmIChTRFJFRkFHRyA9PSAwKQogICAgICAgICBTRE5FV1NZTVdJRFRIU1tOU1lNU0RFQ09ERURdID0gU1lNV0lEVEg7Ci0gICAgICB9CiAgICAgICBOU1lNU0RFQ09ERUQgPSBOU1lNU0RFQ09ERUQgKyAxOwogICAgIH0KICAgICBpZiAoU0RSRUZBR0cgPT0gMCkgewotICAgICAgaWYgKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNESFVGRkJNU0laRSwgKGludDMyX3QqKSZCTVNJWkUpICE9IDApIHsKLSAgICAgICAgZ290byBmYWlsZWQ7Ci0gICAgICB9CisgICAgICBpZiAocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0RIVUZGQk1TSVpFLCAoaW50MzJfdCopJkJNU0laRSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKICAgICAgIHBTdHJlYW0tPmFsaWduQnl0ZSgpOworICAgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gQkhDOwogICAgICAgaWYgKEJNU0laRSA9PSAwKSB7CiAgICAgICAgIHN0cmlkZSA9IChUT1RXSURUSCArIDcpID4+IDM7CiAgICAgICAgIGlmIChwU3RyZWFtLT5nZXRCeXRlTGVmdCgpID49IHN0cmlkZSAqIEhDSEVJR0hUKSB7Ci0gICAgICAgICAgQkhDID0gbmV3IENKQmlnMl9JbWFnZShUT1RXSURUSCwgSENIRUlHSFQpOworICAgICAgICAgIEJIQyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSW1hZ2U+KFRPVFdJRFRILCBIQ0hFSUdIVCk7CiAgICAgICAgICAgZm9yIChJID0gMDsgSSA8IEhDSEVJR0hUOyBJKyspIHsKLSAgICAgICAgICAgIEpCSUcyX21lbWNweShCSEMtPm1fcERhdGEgKyBJICogQkhDLT5zdHJpZGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5nZXRQb2ludGVyKCksIHN0cmlkZSk7CisgICAgICAgICAgICBKQklHMl9tZW1jcHkoQkhDLT5kYXRhKCkgKyBJICogQkhDLT5zdHJpZGUoKSwgcFN0cmVhbS0+Z2V0UG9pbnRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSk7CiAgICAgICAgICAgICBwU3RyZWFtLT5vZmZzZXQoc3RyaWRlKTsKICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBmYWlsZWQ7CisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgICAgIH0KICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfR1JEUHJvYz4gcEdSRChuZXcgQ0pCaWcyX0dSRFByb2MoKSk7CisgICAgICAgIGF1dG8gcEdSRCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfR1JEUHJvYz4oKTsKICAgICAgICAgcEdSRC0+TU1SID0gMTsKICAgICAgICAgcEdSRC0+R0JXID0gVE9UV0lEVEg7CiAgICAgICAgIHBHUkQtPkdCSCA9IEhDSEVJR0hUOwotICAgICAgICBwR1JELT5TdGFydF9kZWNvZGVfTU1SKCZCSEMsIHBTdHJlYW0sIG51bGxwdHIpOworICAgICAgICBwR1JELT5TdGFydF9kZWNvZGVfTU1SKCZCSEMsIHBTdHJlYW0pOwogICAgICAgICBwU3RyZWFtLT5hbGlnbkJ5dGUoKTsKICAgICAgIH0KICAgICAgIG5UbXAgPSAwOwotICAgICAgaWYgKCFCSEMpIHsKKyAgICAgIGlmICghQkhDKQogICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGZvciAoSSA9IEhDRklSU1RTWU07IEkgPCBOU1lNU0RFQ09ERUQ7IEkrKykgeworCisgICAgICBmb3IgKEkgPSBIQ0ZJUlNUU1lNOyBJIDwgTlNZTVNERUNPREVEOyArK0kpIHsKICAgICAgICAgU0RORVdTWU1TW0ldID0gQkhDLT5zdWJJbWFnZShuVG1wLCAwLCBTRE5FV1NZTVdJRFRIU1tJXSwgSENIRUlHSFQpOwogICAgICAgICBuVG1wICs9IFNETkVXU1lNV0lEVEhTW0ldOwogICAgICAgfQotICAgICAgZGVsZXRlIEJIQzsKLSAgICAgIEJIQyA9IG51bGxwdHI7CiAgICAgfQogICB9CiAgIEVYSU5ERVggPSAwOwogICBDVVJFWEZMQUcgPSAwOwogICBwVGFibGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0h1ZmZtYW5UYWJsZT4oCiAgICAgICBIdWZmbWFuVGFibGVfQjEsIEh1ZmZtYW5UYWJsZV9CMV9TaXplLCBIdWZmbWFuVGFibGVfSFRPT0JfQjEpOwotICBFWEZMQUdTID0gRlhfQWxsb2MoYm9vbCwgU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpOworICBFWEZMQUdTLnJlc2l6ZShTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUyk7CiAgIG51bV9leF9zeW1zID0gMDsKICAgd2hpbGUgKEVYSU5ERVggPCBTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUykgewotICAgIGlmIChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShwVGFibGUuZ2V0KCksIChpbnQqKSZFWFJVTkxFTkdUSCkgIT0gMCkgewotICAgICAgRlhfRnJlZShFWEZMQUdTKTsKLSAgICAgIGdvdG8gZmFpbGVkOwotICAgIH0KLSAgICBpZiAoRVhJTkRFWCArIEVYUlVOTEVOR1RIID4gU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpIHsKLSAgICAgIEZYX0ZyZWUoRVhGTEFHUyk7Ci0gICAgICBnb3RvIGZhaWxlZDsKLSAgICB9CisgICAgaWYgKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKHBUYWJsZS5nZXQoKSwgKGludCopJkVYUlVOTEVOR1RIKSAhPSAwKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBpZiAoRVhJTkRFWCArIEVYUlVOTEVOR1RIID4gU0ROVU1JTlNZTVMgKyBTRE5VTU5FV1NZTVMpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKwogICAgIGlmIChFWFJVTkxFTkdUSCAhPSAwKSB7Ci0gICAgICBmb3IgKEkgPSBFWElOREVYOyBJIDwgRVhJTkRFWCArIEVYUlVOTEVOR1RIOyBJKyspIHsKKyAgICAgIGZvciAoSSA9IEVYSU5ERVg7IEkgPCBFWElOREVYICsgRVhSVU5MRU5HVEg7ICsrSSkgewogICAgICAgICBpZiAoQ1VSRVhGTEFHKQogICAgICAgICAgIG51bV9leF9zeW1zKys7CiAKQEAgLTU4OSwzOSArNTE2LDIxIEBACiAgICAgRVhJTkRFWCA9IEVYSU5ERVggKyBFWFJVTkxFTkdUSDsKICAgICBDVVJFWEZMQUcgPSAhQ1VSRVhGTEFHOwogICB9Ci0gIGlmIChudW1fZXhfc3ltcyA+IFNETlVNRVhTWU1TKSB7Ci0gICAgRlhfRnJlZShFWEZMQUdTKTsKLSAgICBnb3RvIGZhaWxlZDsKLSAgfQorICBpZiAobnVtX2V4X3N5bXMgPiBTRE5VTUVYU1lNUykKKyAgICByZXR1cm4gbnVsbHB0cjsKIAogICBJID0gSiA9IDA7Ci0gIGZvciAoSSA9IDA7IEkgPCBTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUzsgSSsrKSB7Ci0gICAgaWYgKEVYRkxBR1NbSV0gJiYgSiA8IFNETlVNRVhTWU1TKSB7Ci0gICAgICBpZiAoSSA8IFNETlVNSU5TWU1TKSB7Ci0gICAgICAgIHBEaWN0LT5BZGRJbWFnZShTRElOU1lNU1tJXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9JbWFnZT4oKlNESU5TWU1TW0ldKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwRGljdC0+QWRkSW1hZ2UocGRmaXVtOjpXcmFwVW5pcXVlKFNETkVXU1lNU1tJIC0gU0ROVU1JTlNZTVNdKSk7Ci0gICAgICB9Ci0gICAgICArK0o7Ci0gICAgfSBlbHNlIGlmICghRVhGTEFHU1tJXSAmJiBJID49IFNETlVNSU5TWU1TKSB7Ci0gICAgICBkZWxldGUgU0RORVdTWU1TW0kgLSBTRE5VTUlOU1lNU107CisgIGZvciAoSSA9IDA7IEkgPCBTRE5VTUlOU1lNUyArIFNETlVNTkVXU1lNUzsgKytJKSB7CisgICAgaWYgKCFFWEZMQUdTW0ldIHx8IEogPj0gU0ROVU1FWFNZTVMpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoSSA8IFNETlVNSU5TWU1TKSB7CisgICAgICBwRGljdC0+QWRkSW1hZ2UoU0RJTlNZTVNbSV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0ltYWdlPigqU0RJTlNZTVNbSV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cik7CisgICAgfSBlbHNlIHsKKyAgICAgIHBEaWN0LT5BZGRJbWFnZShzdGQ6Om1vdmUoU0RORVdTWU1TW0kgLSBTRE5VTUlOU1lNU10pKTsKICAgICB9CisgICAgKytKOwogICB9Ci0gIEZYX0ZyZWUoRVhGTEFHUyk7Ci0gIEZYX0ZyZWUoU0RORVdTWU1TKTsKLSAgaWYgKFNEUkVGQUdHID09IDApIHsKLSAgICBGWF9GcmVlKFNETkVXU1lNV0lEVEhTKTsKLSAgfQotICByZXR1cm4gcERpY3QucmVsZWFzZSgpOwotZmFpbGVkOgotICBmb3IgKEkgPSAwOyBJIDwgTlNZTVNERUNPREVEOyBJKyspIHsKLSAgICBkZWxldGUgU0RORVdTWU1TW0ldOwotICB9Ci0gIEZYX0ZyZWUoU0RORVdTWU1TKTsKLSAgaWYgKFNEUkVGQUdHID09IDApIHsKLSAgICBGWF9GcmVlKFNETkVXU1lNV0lEVEhTKTsKLSAgfQotICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIHBEaWN0OwogfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX1NkZFByb2MuaCBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9TZGRQcm9jLmgKaW5kZXggNGRmMGNiNC4uODBiOTg4ZSAxMDA2NDQKLS0tIGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX1NkZFByb2MuaAorKysgYi9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfU2RkUHJvYy5oCkBAIC03LDYgKzcsNyBAQAogI2lmbmRlZiBDT1JFX0ZYQ09ERUNfSkJJRzJfSkJJRzJfU0REUFJPQ19IXwogI2RlZmluZSBDT1JFX0ZYQ09ERUNfSkJJRzJfSkJJRzJfU0REUFJPQ19IXwogCisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9Bcml0aERlY29kZXIuaCIKQEAgLTE2LDIwICsxNywxOSBAQAogY2xhc3MgQ0pCaWcyX0h1ZmZtYW5UYWJsZTsKIGNsYXNzIENKQmlnMl9JbWFnZTsKIGNsYXNzIENKQmlnMl9TeW1ib2xEaWN0OwotY2xhc3MgSUZYX1BhdXNlOwogCiBjbGFzcyBDSkJpZzJfU0REUHJvYyB7CiAgcHVibGljOgotICBDSkJpZzJfU3ltYm9sRGljdCogZGVjb2RlX0FyaXRoKENKQmlnMl9Bcml0aERlY29kZXIqIHBBcml0aERlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8SkJpZzJBcml0aEN0eD4qIGdiQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxKQmlnMkFyaXRoQ3R4PiogZ3JDb250ZXh0KTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9TeW1ib2xEaWN0PiBkZWNvZGVfQXJpdGgoCisgICAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgICAgc3RkOjp2ZWN0b3I8SkJpZzJBcml0aEN0eD4qIGdiQ29udGV4dCwKKyAgICAgIHN0ZDo6dmVjdG9yPEpCaWcyQXJpdGhDdHg+KiBnckNvbnRleHQpOwogCi0gIENKQmlnMl9TeW1ib2xEaWN0KiBkZWNvZGVfSHVmZm1hbihDSkJpZzJfQml0U3RyZWFtKiBwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8SkJpZzJBcml0aEN0eD4qIGdiQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEpCaWcyQXJpdGhDdHg+KiBnckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2UqIHBQYXVzZSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfU3ltYm9sRGljdD4gZGVjb2RlX0h1ZmZtYW4oCisgICAgICBDSkJpZzJfQml0U3RyZWFtKiBwU3RyZWFtLAorICAgICAgc3RkOjp2ZWN0b3I8SkJpZzJBcml0aEN0eD4qIGdiQ29udGV4dCwKKyAgICAgIHN0ZDo6dmVjdG9yPEpCaWcyQXJpdGhDdHg+KiBnckNvbnRleHQpOwogCi0gcHVibGljOgogICBib29sIFNESFVGRjsKICAgYm9vbCBTRFJFRkFHRzsKICAgdWludDMyX3QgU0ROVU1JTlNZTVM7CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfU2VnbWVudC5jcHAgYi9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfU2VnbWVudC5jcHAKaW5kZXggNjEwMjQ2Yi4uNThiZTgxMCAxMDA2NDQKLS0tIGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX1NlZ21lbnQuY3BwCisrKyBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9TZWdtZW50LmNwcApAQCAtOCwzNyArOCwxNyBAQAogCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9tZW1vcnkuaCIKIAotQ0pCaWcyX1NlZ21lbnQ6OkNKQmlnMl9TZWdtZW50KCkgewotICBtX2R3TnVtYmVyID0gMDsKK0NKQmlnMl9TZWdtZW50OjpDSkJpZzJfU2VnbWVudCgpCisgICAgOiBtX2R3TnVtYmVyKDApLAorICAgICAgbV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudCgwKSwKKyAgICAgIG1fZHdQYWdlX2Fzc29jaWF0aW9uKDApLAorICAgICAgbV9kd0RhdGFfbGVuZ3RoKDApLAorICAgICAgbV9kd0hlYWRlcl9MZW5ndGgoMCksCisgICAgICBtX2R3T2JqTnVtKDApLAorICAgICAgbV9kd0RhdGFPZmZzZXQoMCksCisgICAgICBtX1N0YXRlKEpCSUcyX1NFR01FTlRfSEVBREVSX1VOUEFSU0VEKSwKKyAgICAgIG1fblJlc3VsdFR5cGUoSkJJRzJfVk9JRF9QT0lOVEVSKSB7CiAgIG1fY0ZsYWdzLmMgPSAwOwotICBtX25SZWZlcnJlZF90b19zZWdtZW50X2NvdW50ID0gMDsKLSAgbV9wUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzID0gbnVsbHB0cjsKLSAgbV9kd1BhZ2VfYXNzb2NpYXRpb24gPSAwOwotICBtX2R3RGF0YV9sZW5ndGggPSAwOwotICBtX2R3SGVhZGVyX0xlbmd0aCA9IDA7Ci0gIG1fZHdPYmpOdW0gPSAwOwotICBtX2R3RGF0YU9mZnNldCA9IDA7Ci0gIG1fU3RhdGUgPSBKQklHMl9TRUdNRU5UX0hFQURFUl9VTlBBUlNFRDsKLSAgbV9uUmVzdWx0VHlwZSA9IEpCSUcyX1ZPSURfUE9JTlRFUjsKLSAgbV9SZXN1bHQudmQgPSBudWxscHRyOwogfQotQ0pCaWcyX1NlZ21lbnQ6On5DSkJpZzJfU2VnbWVudCgpIHsKLSAgRlhfRnJlZShtX3BSZWZlcnJlZF90b19zZWdtZW50X251bWJlcnMpOwogCi0gIHN3aXRjaCAobV9uUmVzdWx0VHlwZSkgewotICAgIGNhc2UgSkJJRzJfSU1BR0VfUE9JTlRFUjoKLSAgICAgIGRlbGV0ZSBtX1Jlc3VsdC5pbTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSkJJRzJfU1lNQk9MX0RJQ1RfUE9JTlRFUjoKLSAgICAgIGRlbGV0ZSBtX1Jlc3VsdC5zZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSkJJRzJfUEFUVEVSTl9ESUNUX1BPSU5URVI6Ci0gICAgICBkZWxldGUgbV9SZXN1bHQucGQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEpCSUcyX0hVRkZNQU5fVEFCTEVfUE9JTlRFUjoKLSAgICAgIGRlbGV0ZSBtX1Jlc3VsdC5odDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBGWF9GcmVlKG1fUmVzdWx0LnZkKTsKLSAgfQotfQorQ0pCaWcyX1NlZ21lbnQ6On5DSkJpZzJfU2VnbWVudCgpIHt9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfU2VnbWVudC5oIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX1NlZ21lbnQuaAppbmRleCBkODlkNjUyLi45MTQxMTViIDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfU2VnbWVudC5oCisrKyBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9TZWdtZW50LmgKQEAgLTcsMTQgKzcsMTQgQEAKICNpZm5kZWYgQ09SRV9GWENPREVDX0pCSUcyX0pCSUcyX1NFR01FTlRfSF8KICNkZWZpbmUgQ09SRV9GWENPREVDX0pCSUcyX0pCSUcyX1NFR01FTlRfSF8KIAorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfRGVmaW5lLmgiCiAjaW5jbHVkZSAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0h1ZmZtYW5UYWJsZS5oIgogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9QYXR0ZXJuRGljdC5oIgogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9TeW1ib2xEaWN0LmgiCiAKLSNkZWZpbmUgSkJJRzJfR0VUX0lOVDMyKGJ1ZikgXAotICAoKChidWYpWzBdIDw8IDI0KSB8ICgoYnVmKVsxXSA8PCAxNikgfCAoKGJ1ZilbMl0gPDwgOCkgfCAoYnVmKVszXSkKLSNkZWZpbmUgSkJJRzJfR0VUX0lOVDE2KGJ1ZikgKCgoYnVmKVswXSA8PCA4KSB8IChidWYpWzFdKQogdHlwZWRlZiBlbnVtIHsKICAgSkJJRzJfU0VHTUVOVF9IRUFERVJfVU5QQVJTRUQsCiAgIEpCSUcyX1NFR01FTlRfREFUQV9VTlBBUlNFRCwKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICB1aW50OF90IGM7CiAgIH0gbV9jRmxhZ3M7CiAgIGludDMyX3QgbV9uUmVmZXJyZWRfdG9fc2VnbWVudF9jb3VudDsKLSAgdWludDMyX3QqIG1fcFJlZmVycmVkX3RvX3NlZ21lbnRfbnVtYmVyczsKKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IG1fUmVmZXJyZWRfdG9fc2VnbWVudF9udW1iZXJzOwogICB1aW50MzJfdCBtX2R3UGFnZV9hc3NvY2lhdGlvbjsKICAgdWludDMyX3QgbV9kd0RhdGFfbGVuZ3RoOwogCkBAIC01NCwxMyArNTQsMTAgQEAKICAgdWludDMyX3QgbV9kd0RhdGFPZmZzZXQ7CiAgIEpCaWcyX1NlZ21lbnRTdGF0ZSBtX1N0YXRlOwogICBKQmlnMl9SZXN1bHRUeXBlIG1fblJlc3VsdFR5cGU7Ci0gIHVuaW9uIHsKLSAgICBDSkJpZzJfU3ltYm9sRGljdCogc2Q7Ci0gICAgQ0pCaWcyX1BhdHRlcm5EaWN0KiBwZDsKLSAgICBDSkJpZzJfSW1hZ2UqIGltOwotICAgIENKQmlnMl9IdWZmbWFuVGFibGUqIGh0OwotICAgIHZvaWQqIHZkOwotICB9IG1fUmVzdWx0OworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX1N5bWJvbERpY3Q+IG1fU3ltYm9sRGljdDsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9QYXR0ZXJuRGljdD4gbV9QYXR0ZXJuRGljdDsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gbV9JbWFnZTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9IdWZmbWFuVGFibGU+IG1fSHVmZm1hblRhYmxlOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZYQ09ERUNfSkJJRzJfSkJJRzJfU0VHTUVOVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuaCBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9TeW1ib2xEaWN0LmgKaW5kZXggZDZiODk3Yy4uNDkyODlmYiAxMDA2NDQKLS0tIGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX1N5bWJvbERpY3QuaAorKysgYi9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfU3ltYm9sRGljdC5oCkBAIC0xMiw3ICsxMiw2IEBACiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0FyaXRoRGVjb2Rlci5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKIAogY2xhc3MgQ0pCaWcyX0ltYWdlOwogCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfVHJkUHJvYy5jcHAgYi9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfVHJkUHJvYy5jcHAKaW5kZXggODQwNDJkYi4uMzMyZTU4NiAxMDA2NDQKLS0tIGEvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX1RyZFByb2MuY3BwCisrKyBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9UcmRQcm9jLmNwcApAQCAtMTIsNjUgKzEyLDc2IEBACiAjaW5jbHVkZSAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0FyaXRoSW50RGVjb2Rlci5oIgogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9HcnJkUHJvYy5oIgogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuRGVjb2Rlci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvbWF5YmVfb3duZWQuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKLUNKQmlnMl9JbWFnZSogQ0pCaWcyX1RSRFByb2M6OmRlY29kZV9IdWZmbWFuKENKQmlnMl9CaXRTdHJlYW0qIHBTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9IdWZmbWFuRGVjb2Rlcj4gcEh1ZmZtYW5EZWNvZGVyKAotICAgICAgbmV3IENKQmlnMl9IdWZmbWFuRGVjb2RlcihwU3RyZWFtKSk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfSW1hZ2U+IFNCUkVHKG5ldyBDSkJpZzJfSW1hZ2UoU0JXLCBTQkgpKTsKK0NKQmlnMl9UUkRQcm9jOjpDSkJpZzJfVFJEUHJvYygpIHt9CisKK0NKQmlnMl9UUkRQcm9jOjp+Q0pCaWcyX1RSRFByb2MoKSB7fQorCitzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBDSkJpZzJfVFJEUHJvYzo6ZGVjb2RlX0h1ZmZtYW4oCisgICAgQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSwKKyAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQpIHsKKyAgYXV0byBwSHVmZm1hbkRlY29kZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0h1ZmZtYW5EZWNvZGVyPihwU3RyZWFtKTsKKyAgYXV0byBTQlJFRyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfSW1hZ2U+KFNCVywgU0JIKTsKICAgU0JSRUctPmZpbGwoU0JERUZQSVhFTCk7Ci0gIGludDMyX3QgU1RSSVBUOwotICBpZiAocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGRFQsICZTVFJJUFQpICE9IDApCisgIGludDMyX3QgSU5JVElBTF9TVFJJUFQ7CisgIGlmIChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTQkhVRkZEVCwgJklOSVRJQUxfU1RSSVBUKSAhPSAwKQogICAgIHJldHVybiBudWxscHRyOwogCisgIEZYX1NBRkVfSU5UMzIgU1RSSVBUID0gSU5JVElBTF9TVFJJUFQ7CiAgIFNUUklQVCAqPSBTQlNUUklQUzsKICAgU1RSSVBUID0gLVNUUklQVDsKLSAgaW50MzJfdCBGSVJTVFMgPSAwOworICBGWF9TQUZFX0lOVDMyIEZJUlNUUyA9IDA7CiAgIHVpbnQzMl90IE5JTlNUQU5DRVMgPSAwOwogICB3aGlsZSAoTklOU1RBTkNFUyA8IFNCTlVNSU5TVEFOQ0VTKSB7Ci0gICAgaW50MzJfdCBEVDsKLSAgICBpZiAocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGRFQsICZEVCkgIT0gMCkKKyAgICBpbnQzMl90IElOSVRJQUxfRFQ7CisgICAgaWYgKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRkRULCAmSU5JVElBTF9EVCkgIT0gMCkKICAgICAgIHJldHVybiBudWxscHRyOwogCisgICAgRlhfU0FGRV9JTlQzMiBEVCA9IElOSVRJQUxfRFQ7CiAgICAgRFQgKj0gU0JTVFJJUFM7Ci0gICAgU1RSSVBUID0gU1RSSVBUICsgRFQ7CisgICAgU1RSSVBUICs9IERUOwogICAgIGJvb2wgYkZpcnN0ID0gdHJ1ZTsKLSAgICBpbnQzMl90IENVUlMgPSAwOworICAgIEZYX1NBRkVfSU5UMzIgQ1VSUyA9IDA7CiAgICAgZm9yICg7OykgewogICAgICAgaWYgKGJGaXJzdCkgewogICAgICAgICBpbnQzMl90IERGUzsKICAgICAgICAgaWYgKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRkZTLCAmREZTKSAhPSAwKQogICAgICAgICAgIHJldHVybiBudWxscHRyOwogCi0gICAgICAgIEZJUlNUUyA9IEZJUlNUUyArIERGUzsKKyAgICAgICAgRklSU1RTICs9IERGUzsKICAgICAgICAgQ1VSUyA9IEZJUlNUUzsKICAgICAgICAgYkZpcnN0ID0gZmFsc2U7CiAgICAgICB9IGVsc2UgewogICAgICAgICBpbnQzMl90IElEUzsKICAgICAgICAgaW50MzJfdCBuVmFsID0gcEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGRFMsICZJRFMpOwotICAgICAgICBpZiAoblZhbCA9PSBKQklHMl9PT0IpIHsKKyAgICAgICAgaWYgKG5WYWwgPT0gSkJJRzJfT09CKQogICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYgKG5WYWwgIT0gMCkgeworCisgICAgICAgIGlmIChuVmFsICE9IDApCiAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgQ1VSUyA9IENVUlMgKyBJRFMgKyBTQkRTT0ZGU0VUOwotICAgICAgICB9CisKKyAgICAgICAgQ1VSUyArPSBJRFM7CisgICAgICAgIENVUlMgKz0gU0JEU09GRlNFVDsKICAgICAgIH0KICAgICAgIHVpbnQ4X3QgQ1VSVCA9IDA7CiAgICAgICBpZiAoU0JTVFJJUFMgIT0gMSkgewogICAgICAgICB1aW50MzJfdCBuVG1wID0gMTsKLSAgICAgICAgd2hpbGUgKCh1aW50MzJfdCkoMSA8PCBuVG1wKSA8IFNCU1RSSVBTKSB7Ci0gICAgICAgICAgblRtcCsrOwotICAgICAgICB9CisgICAgICAgIHdoaWxlIChzdGF0aWNfY2FzdDx1aW50MzJfdD4oMSA8PCBuVG1wKSA8IFNCU1RSSVBTKQorICAgICAgICAgICsrblRtcDsKICAgICAgICAgaW50MzJfdCBuVmFsOwogICAgICAgICBpZiAocFN0cmVhbS0+cmVhZE5CaXRzKG5UbXAsICZuVmFsKSAhPSAwKQogICAgICAgICAgIHJldHVybiBudWxscHRyOwogCiAgICAgICAgIENVUlQgPSBuVmFsOwogICAgICAgfQotICAgICAgaW50MzJfdCBUSSA9IFNUUklQVCArIENVUlQ7Ci0gICAgICBpbnQzMl90IG5WYWwgPSAwOworICAgICAgRlhfU0FGRV9JTlQzMiBTQUZFX1RJID0gU1RSSVBUICsgQ1VSVDsKKyAgICAgIGlmICghU0FGRV9USS5Jc1ZhbGlkKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICBpbnQzMl90IFRJID0gU0FGRV9USS5WYWx1ZU9yRGllKCk7CisgICAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPGludDMyX3Q+IG5WYWwgPSAwOwogICAgICAgaW50MzJfdCBuQml0cyA9IDA7CiAgICAgICB1aW50MzJfdCBJREk7CiAgICAgICBmb3IgKDs7KSB7CkBAIC03OCwyMyArODksMjYgQEAKICAgICAgICAgaWYgKHBTdHJlYW0tPnJlYWQxQml0KCZuVG1wKSAhPSAwKQogICAgICAgICAgIHJldHVybiBudWxscHRyOwogCi0gICAgICAgIG5WYWwgPSAoblZhbCA8PCAxKSB8IG5UbXA7Ci0gICAgICAgIG5CaXRzKys7Ci0gICAgICAgIGZvciAoSURJID0gMDsgSURJIDwgU0JOVU1TWU1TOyBJREkrKykgeworICAgICAgICBuVmFsIDw8PSAxOworICAgICAgICBpZiAoIW5WYWwuSXNWYWxpZCgpKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICAgIG5WYWwgfD0gblRtcDsKKyAgICAgICAgKytuQml0czsKKyAgICAgICAgZm9yIChJREkgPSAwOyBJREkgPCBTQk5VTVNZTVM7ICsrSURJKSB7CiAgICAgICAgICAgaWYgKChuQml0cyA9PSBTQlNZTUNPREVTW0lESV0uY29kZWxlbikgJiYKLSAgICAgICAgICAgICAgKG5WYWwgPT0gU0JTWU1DT0RFU1tJREldLmNvZGUpKSB7CisgICAgICAgICAgICAgIChuVmFsLlZhbHVlT3JEaWUoKSA9PSBTQlNZTUNPREVTW0lESV0uY29kZSkpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAoSURJIDwgU0JOVU1TWU1TKSB7CisgICAgICAgIGlmIChJREkgPCBTQk5VTVNZTVMpCiAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KICAgICAgIH0KICAgICAgIGJvb2wgUkkgPSAwOwotICAgICAgaWYgKFNCUkVGSU5FICE9IDAgJiYgcFN0cmVhbS0+cmVhZDFCaXQoJlJJKSAhPSAwKSB7CisgICAgICBpZiAoU0JSRUZJTkUgIT0gMCAmJiBwU3RyZWFtLT5yZWFkMUJpdCgmUkkpICE9IDApCiAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgfQotICAgICAgQ0pCaWcyX0ltYWdlKiBJQkkgPSBudWxscHRyOworCisgICAgICBNYXliZU93bmVkPENKQmlnMl9JbWFnZT4gSUJJOwogICAgICAgaWYgKFJJID09IDApIHsKICAgICAgICAgSUJJID0gU0JTWU1TW0lESV07CiAgICAgICB9IGVsc2UgewpAQCAtMTAyLDExICsxMTYsMTIgQEAKICAgICAgICAgaW50MzJfdCBSREhJOwogICAgICAgICBpbnQzMl90IFJEWEk7CiAgICAgICAgIGludDMyX3QgUkRZSTsKKyAgICAgICAgaW50MzJfdCBIVUZGUlNJWkU7CiAgICAgICAgIGlmICgocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGUkRXLCAmUkRXSSkgIT0gMCkgfHwKICAgICAgICAgICAgIChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTQkhVRkZSREgsICZSREhJKSAhPSAwKSB8fAogICAgICAgICAgICAgKHBIdWZmbWFuRGVjb2Rlci0+ZGVjb2RlQVZhbHVlKFNCSFVGRlJEWCwgJlJEWEkpICE9IDApIHx8CiAgICAgICAgICAgICAocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGUkRZLCAmUkRZSSkgIT0gMCkgfHwKLSAgICAgICAgICAgIChwSHVmZm1hbkRlY29kZXItPmRlY29kZUFWYWx1ZShTQkhVRkZSU0laRSwgJm5WYWwpICE9IDApKSB7CisgICAgICAgICAgICAocEh1ZmZtYW5EZWNvZGVyLT5kZWNvZGVBVmFsdWUoU0JIVUZGUlNJWkUsICZIVUZGUlNJWkUpICE9IDApKSB7CiAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgICAgIH0KICAgICAgICAgcFN0cmVhbS0+YWxpZ25CeXRlKCk7CkBAIC0xMTcsMTAgKzEzMiwxMiBAQAogCiAgICAgICAgIHVpbnQzMl90IFdPSSA9IElCT0ktPndpZHRoKCk7CiAgICAgICAgIHVpbnQzMl90IEhPSSA9IElCT0ktPmhlaWdodCgpOwotICAgICAgICBpZiAoKGludCkoV09JICsgUkRXSSkgPCAwIHx8IChpbnQpKEhPSSArIFJESEkpIDwgMCkKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PGludD4oV09JICsgUkRXSSkgPCAwIHx8CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KEhPSSArIFJESEkpIDwgMCkgewogICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CiAKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9HUlJEUHJvYz4gcEdSUkQobmV3IENKQmlnMl9HUlJEUHJvYygpKTsKKyAgICAgICAgYXV0byBwR1JSRCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfR1JSRFByb2M+KCk7CiAgICAgICAgIHBHUlJELT5HUlcgPSBXT0kgKyBSRFdJOwogICAgICAgICBwR1JSRC0+R1JIID0gSE9JICsgUkRISTsKICAgICAgICAgcEdSUkQtPkdSVEVNUExBVEUgPSBTQlJURU1QTEFURTsKQEAgLTEzMywxMDQgKzE1MCw5MCBAQAogICAgICAgICBwR1JSRC0+R1JBVFsyXSA9IFNCUkFUWzJdOwogICAgICAgICBwR1JSRC0+R1JBVFszXSA9IFNCUkFUWzNdOwogCi0gICAgICAgIHsKLSAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0FyaXRoRGVjb2Rlcj4gcEFyaXRoRGVjb2RlcigKLSAgICAgICAgICAgICAgbmV3IENKQmlnMl9Bcml0aERlY29kZXIocFN0cmVhbSkpOwotICAgICAgICAgIElCSSA9IHBHUlJELT5kZWNvZGUocEFyaXRoRGVjb2Rlci5nZXQoKSwgZ3JDb250ZXh0KTsKLSAgICAgICAgICBpZiAoIUlCSSkKLSAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICB9CisgICAgICAgIGF1dG8gcEFyaXRoRGVjb2RlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfQXJpdGhEZWNvZGVyPihwU3RyZWFtKTsKKyAgICAgICAgSUJJID0gcEdSUkQtPmRlY29kZShwQXJpdGhEZWNvZGVyLmdldCgpLCBnckNvbnRleHQpOworICAgICAgICBpZiAoIUlCSSkKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKIAogICAgICAgICBwU3RyZWFtLT5hbGlnbkJ5dGUoKTsKICAgICAgICAgcFN0cmVhbS0+b2Zmc2V0KDIpOwotICAgICAgICBpZiAoKHVpbnQzMl90KW5WYWwgIT0gKHBTdHJlYW0tPmdldE9mZnNldCgpIC0gblRtcCkpIHsKLSAgICAgICAgICBkZWxldGUgSUJJOworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KEhVRkZSU0laRSkgIT0gKHBTdHJlYW0tPmdldE9mZnNldCgpIC0gblRtcCkpCiAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0KICAgICAgIH0KLSAgICAgIGlmICghSUJJKSB7CisgICAgICBpZiAoIUlCSSkKICAgICAgICAgY29udGludWU7Ci0gICAgICB9CisKICAgICAgIHVpbnQzMl90IFdJID0gSUJJLT53aWR0aCgpOwogICAgICAgdWludDMyX3QgSEkgPSBJQkktPmhlaWdodCgpOwogICAgICAgaWYgKFRSQU5TUE9TRUQgPT0gMCAmJiAoKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfVE9QUklHSFQpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9CT1RUT01SSUdIVCkpKSB7Ci0gICAgICAgIENVUlMgPSBDVVJTICsgV0kgLSAxOworICAgICAgICBDVVJTICs9IFdJIC0gMTsKICAgICAgIH0gZWxzZSBpZiAoVFJBTlNQT1NFRCA9PSAxICYmICgoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9CT1RUT01MRUZUKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX0JPVFRPTVJJR0hUKSkpIHsKLSAgICAgICAgQ1VSUyA9IENVUlMgKyBISSAtIDE7CisgICAgICAgIENVUlMgKz0gSEkgLSAxOwogICAgICAgfQotICAgICAgaW50MzJfdCBTSSA9IENVUlM7CisgICAgICBpZiAoIUNVUlMuSXNWYWxpZCgpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgICAgaW50MzJfdCBTSSA9IENVUlMuVmFsdWVPckRpZSgpOwogICAgICAgaWYgKFRSQU5TUE9TRUQgPT0gMCkgewogICAgICAgICBzd2l0Y2ggKFJFRkNPUk5FUikgewogICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX1RPUExFRlQ6Ci0gICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oU0ksIFRJLCBJQkksIFNCQ09NQk9QKTsKKyAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShTSSwgVEksIElCSS5HZXQoKSwgU0JDT01CT1ApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfVE9QUklHSFQ6Ci0gICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oU0kgLSBXSSArIDEsIFRJLCBJQkksIFNCQ09NQk9QKTsKKyAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShTSSAtIFdJICsgMSwgVEksIElCSS5HZXQoKSwgU0JDT01CT1ApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfQk9UVE9NTEVGVDoKLSAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShTSSwgVEkgLSBISSArIDEsIElCSSwgU0JDT01CT1ApOworICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFNJLCBUSSAtIEhJICsgMSwgSUJJLkdldCgpLCBTQkNPTUJPUCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBjYXNlIEpCSUcyX0NPUk5FUl9CT1RUT01SSUdIVDoKLSAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShTSSAtIFdJICsgMSwgVEkgLSBISSArIDEsIElCSSwgU0JDT01CT1ApOworICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFNJIC0gV0kgKyAxLCBUSSAtIEhJICsgMSwgSUJJLkdldCgpLCBTQkNPTUJPUCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgfSBlbHNlIHsKICAgICAgICAgc3dpdGNoIChSRUZDT1JORVIpIHsKICAgICAgICAgICBjYXNlIEpCSUcyX0NPUk5FUl9UT1BMRUZUOgotICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFRJLCBTSSwgSUJJLCBTQkNPTUJPUCk7CisgICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oVEksIFNJLCBJQkkuR2V0KCksIFNCQ09NQk9QKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX1RPUFJJR0hUOgotICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFRJIC0gV0kgKyAxLCBTSSwgSUJJLCBTQkNPTUJPUCk7CisgICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oVEkgLSBXSSArIDEsIFNJLCBJQkkuR2V0KCksIFNCQ09NQk9QKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX0JPVFRPTUxFRlQ6Ci0gICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oVEksIFNJIC0gSEkgKyAxLCBJQkksIFNCQ09NQk9QKTsKKyAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShUSSwgU0kgLSBISSArIDEsIElCSS5HZXQoKSwgU0JDT01CT1ApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfQk9UVE9NUklHSFQ6Ci0gICAgICAgICAgICBTQlJFRy0+Y29tcG9zZUZyb20oVEkgLSBXSSArIDEsIFNJIC0gSEkgKyAxLCBJQkksIFNCQ09NQk9QKTsKKyAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShUSSAtIFdJICsgMSwgU0kgLSBISSArIDEsIElCSS5HZXQoKSwgU0JDT01CT1ApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIGlmIChSSSAhPSAwKSB7Ci0gICAgICAgIGRlbGV0ZSBJQkk7Ci0gICAgICB9CiAgICAgICBpZiAoVFJBTlNQT1NFRCA9PSAwICYmICgoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9UT1BMRUZUKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFJFRkNPUk5FUiA9PSBKQklHMl9DT1JORVJfQk9UVE9NTEVGVCkpKSB7Ci0gICAgICAgIENVUlMgPSBDVVJTICsgV0kgLSAxOworICAgICAgICBDVVJTICs9IFdJIC0gMTsKICAgICAgIH0gZWxzZSBpZiAoVFJBTlNQT1NFRCA9PSAxICYmICgoUkVGQ09STkVSID09IEpCSUcyX0NPUk5FUl9UT1BMRUZUKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX1RPUFJJR0hUKSkpIHsKLSAgICAgICAgQ1VSUyA9IENVUlMgKyBISSAtIDE7CisgICAgICAgIENVUlMgKz0gSEkgLSAxOwogICAgICAgfQogICAgICAgTklOU1RBTkNFUyA9IE5JTlNUQU5DRVMgKyAxOwogICAgIH0KICAgfQotICByZXR1cm4gU0JSRUcucmVsZWFzZSgpOworICByZXR1cm4gU0JSRUc7CiB9CiAKLUNKQmlnMl9JbWFnZSogQ0pCaWcyX1RSRFByb2M6OmRlY29kZV9Bcml0aChDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdyQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkludERlY29kZXJTdGF0ZSogcElEUykgewotICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4gSUFEVDsKLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aEludERlY29kZXI+IElBRlM7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfQXJpdGhJbnREZWNvZGVyPiBJQURTOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4gSUFJVDsKLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aEludERlY29kZXI+IElBUkk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfQXJpdGhJbnREZWNvZGVyPiBJQVJEVzsKLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aEludERlY29kZXI+IElBUkRIOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4gSUFSRFg7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSkJpZzJfQXJpdGhJbnREZWNvZGVyPiBJQVJEWTsKLSAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9Bcml0aElhaWREZWNvZGVyPiBJQUlEOwotICBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKiBwSUFEVDsKLSAgQ0pCaWcyX0FyaXRoSW50RGVjb2RlciogcElBRlM7Ci0gIENKQmlnMl9Bcml0aEludERlY29kZXIqIHBJQURTOwotICBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKiBwSUFJVDsKLSAgQ0pCaWcyX0FyaXRoSW50RGVjb2RlciogcElBUkk7Ci0gIENKQmlnMl9Bcml0aEludERlY29kZXIqIHBJQVJEVzsKLSAgQ0pCaWcyX0FyaXRoSW50RGVjb2RlciogcElBUkRIOwotICBDSkJpZzJfQXJpdGhJbnREZWNvZGVyKiBwSUFSRFg7Ci0gIENKQmlnMl9Bcml0aEludERlY29kZXIqIHBJQVJEWTsKLSAgQ0pCaWcyX0FyaXRoSWFpZERlY29kZXIqIHBJQUlEOworc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gQ0pCaWcyX1RSRFByb2M6OmRlY29kZV9Bcml0aCgKKyAgICBDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAorICAgIEpCaWcyQXJpdGhDdHgqIGdyQ29udGV4dCwKKyAgICBKQmlnMkludERlY29kZXJTdGF0ZSogcElEUykgeworICBNYXliZU93bmVkPENKQmlnMl9Bcml0aEludERlY29kZXI+IHBJQURUOworICBNYXliZU93bmVkPENKQmlnMl9Bcml0aEludERlY29kZXI+IHBJQUZTOworICBNYXliZU93bmVkPENKQmlnMl9Bcml0aEludERlY29kZXI+IHBJQURTOworICBNYXliZU93bmVkPENKQmlnMl9Bcml0aEludERlY29kZXI+IHBJQUlUOworICBNYXliZU93bmVkPENKQmlnMl9Bcml0aEludERlY29kZXI+IHBJQVJJOworICBNYXliZU93bmVkPENKQmlnMl9Bcml0aEludERlY29kZXI+IHBJQVJEVzsKKyAgTWF5YmVPd25lZDxDSkJpZzJfQXJpdGhJbnREZWNvZGVyPiBwSUFSREg7CisgIE1heWJlT3duZWQ8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4gcElBUkRYOworICBNYXliZU93bmVkPENKQmlnMl9Bcml0aEludERlY29kZXI+IHBJQVJEWTsKKyAgTWF5YmVPd25lZDxDSkJpZzJfQXJpdGhJYWlkRGVjb2Rlcj4gcElBSUQ7CiAgIGlmIChwSURTKSB7CiAgICAgcElBRFQgPSBwSURTLT5JQURUOwogICAgIHBJQUZTID0gcElEUy0+SUFGUzsKQEAgLTI0Myw0MSArMjQ2LDM1IEBACiAgICAgcElBUkRZID0gcElEUy0+SUFSRFk7CiAgICAgcElBSUQgPSBwSURTLT5JQUlEOwogICB9IGVsc2UgewotICAgIElBRFQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4oKTsKLSAgICBJQUZTID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9Bcml0aEludERlY29kZXI+KCk7Ci0gICAgSUFEUyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfQXJpdGhJbnREZWNvZGVyPigpOwotICAgIElBSVQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4oKTsKLSAgICBJQVJJID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9Bcml0aEludERlY29kZXI+KCk7Ci0gICAgSUFSRFcgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4oKTsKLSAgICBJQVJESCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfQXJpdGhJbnREZWNvZGVyPigpOwotICAgIElBUkRYID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9Bcml0aEludERlY29kZXI+KCk7Ci0gICAgSUFSRFkgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4oKTsKLSAgICBJQUlEID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9Bcml0aElhaWREZWNvZGVyPihTQlNZTUNPREVMRU4pOwotICAgIHBJQURUID0gSUFEVC5nZXQoKTsKLSAgICBwSUFGUyA9IElBRlMuZ2V0KCk7Ci0gICAgcElBRFMgPSBJQURTLmdldCgpOwotICAgIHBJQUlUID0gSUFJVC5nZXQoKTsKLSAgICBwSUFSSSA9IElBUkkuZ2V0KCk7Ci0gICAgcElBUkRXID0gSUFSRFcuZ2V0KCk7Ci0gICAgcElBUkRIID0gSUFSREguZ2V0KCk7Ci0gICAgcElBUkRYID0gSUFSRFguZ2V0KCk7Ci0gICAgcElBUkRZID0gSUFSRFkuZ2V0KCk7Ci0gICAgcElBSUQgPSBJQUlELmdldCgpOworICAgIHBJQURUID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9Bcml0aEludERlY29kZXI+KCk7CisgICAgcElBRlMgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4oKTsKKyAgICBwSUFEUyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfQXJpdGhJbnREZWNvZGVyPigpOworICAgIHBJQUlUID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKQmlnMl9Bcml0aEludERlY29kZXI+KCk7CisgICAgcElBUkkgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4oKTsKKyAgICBwSUFSRFcgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4oKTsKKyAgICBwSUFSREggPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4oKTsKKyAgICBwSUFSRFggPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4oKTsKKyAgICBwSUFSRFkgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0FyaXRoSW50RGVjb2Rlcj4oKTsKKyAgICBwSUFJRCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfQXJpdGhJYWlkRGVjb2Rlcj4oU0JTWU1DT0RFTEVOKTsKICAgfQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBTQlJFRyhuZXcgQ0pCaWcyX0ltYWdlKFNCVywgU0JIKSk7CisgIGF1dG8gU0JSRUcgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pCaWcyX0ltYWdlPihTQlcsIFNCSCk7CiAgIFNCUkVHLT5maWxsKFNCREVGUElYRUwpOwotICBpbnQzMl90IFNUUklQVDsKLSAgaWYgKCFwSUFEVC0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZTVFJJUFQpKQorICBpbnQzMl90IElOSVRJQUxfU1RSSVBUOworICBpZiAoIXBJQURULT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJklOSVRJQUxfU1RSSVBUKSkKICAgICByZXR1cm4gbnVsbHB0cjsKKworICBGWF9TQUZFX0lOVDMyIFNUUklQVCA9IElOSVRJQUxfU1RSSVBUOwogICBTVFJJUFQgKj0gU0JTVFJJUFM7CiAgIFNUUklQVCA9IC1TVFJJUFQ7Ci0gIGludDMyX3QgRklSU1RTID0gMDsKKyAgRlhfU0FGRV9JTlQzMiBGSVJTVFMgPSAwOwogICB1aW50MzJfdCBOSU5TVEFOQ0VTID0gMDsKICAgd2hpbGUgKE5JTlNUQU5DRVMgPCBTQk5VTUlOU1RBTkNFUykgewotICAgIGludDMyX3QgQ1VSUyA9IDA7Ci0gICAgaW50MzJfdCBEVDsKLSAgICBpZiAoIXBJQURULT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJkRUKSkKKyAgICBGWF9TQUZFX0lOVDMyIENVUlMgPSAwOworICAgIGludDMyX3QgSU5JVElBTF9EVDsKKyAgICBpZiAoIXBJQURULT5kZWNvZGUocEFyaXRoRGVjb2RlciwgJklOSVRJQUxfRFQpKQogICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBGWF9TQUZFX0lOVDMyIERUID0gSU5JVElBTF9EVDsKICAgICBEVCAqPSBTQlNUUklQUzsKICAgICBTVFJJUFQgKz0gRFQ7CiAgICAgYm9vbCBiRmlyc3QgPSB0cnVlOwpAQCAtMjkyLDE2ICsyODksMjIgQEAKICAgICAgICAgaW50MzJfdCBJRFM7CiAgICAgICAgIGlmICghcElBRFMtPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmSURTKSkKICAgICAgICAgICBicmVhazsKLSAgICAgICAgQ1VSUyArPSBJRFMgKyBTQkRTT0ZGU0VUOworCisgICAgICAgIENVUlMgKz0gSURTOworICAgICAgICBDVVJTICs9IFNCRFNPRkZTRVQ7CiAgICAgICB9Ci0gICAgICBpZiAoTklOU1RBTkNFUyA+PSBTQk5VTUlOU1RBTkNFUykgeworICAgICAgaWYgKE5JTlNUQU5DRVMgPj0gU0JOVU1JTlNUQU5DRVMpCiAgICAgICAgIGJyZWFrOwotICAgICAgfQorCiAgICAgICBpbnQgQ1VSVCA9IDA7CiAgICAgICBpZiAoU0JTVFJJUFMgIT0gMSkKICAgICAgICAgcElBSVQtPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmQ1VSVCk7CiAKLSAgICAgIGludDMyX3QgVEkgPSBTVFJJUFQgKyBDVVJUOworICAgICAgRlhfU0FGRV9JTlQzMiBTQUZFX1RJID0gU1RSSVBUICsgQ1VSVDsKKyAgICAgIGlmICghU0FGRV9USS5Jc1ZhbGlkKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICBpbnQzMl90IFRJID0gU0FGRV9USS5WYWx1ZU9yRGllKCk7CiAgICAgICB1aW50MzJfdCBJREk7CiAgICAgICBwSUFJRC0+ZGVjb2RlKHBBcml0aERlY29kZXIsICZJREkpOwogICAgICAgaWYgKElESSA+PSBTQk5VTVNZTVMpCkBAIC0zMTMsOCArMzE2LDcgQEAKICAgICAgIGVsc2UKICAgICAgICAgcElBUkktPmRlY29kZShwQXJpdGhEZWNvZGVyLCAmUkkpOwogCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBJQkk7Ci0gICAgICBDSkJpZzJfSW1hZ2UqIHBJQkk7CisgICAgICBNYXliZU93bmVkPENKQmlnMl9JbWFnZT4gcElCSTsKICAgICAgIGlmIChSSSA9PSAwKSB7CiAgICAgICAgIHBJQkkgPSBTQlNZTVNbSURJXTsKICAgICAgIH0gZWxzZSB7CkBAIC0zMzIsMTAgKzMzNCwxMiBAQAogCiAgICAgICAgIHVpbnQzMl90IFdPSSA9IElCT0ktPndpZHRoKCk7CiAgICAgICAgIHVpbnQzMl90IEhPSSA9IElCT0ktPmhlaWdodCgpOwotICAgICAgICBpZiAoKGludCkoV09JICsgUkRXSSkgPCAwIHx8IChpbnQpKEhPSSArIFJESEkpIDwgMCkKKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PGludD4oV09JICsgUkRXSSkgPCAwIHx8CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KEhPSSArIFJESEkpIDwgMCkgewogICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CiAKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9HUlJEUHJvYz4gcEdSUkQobmV3IENKQmlnMl9HUlJEUHJvYygpKTsKKyAgICAgICAgYXV0byBwR1JSRCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSkJpZzJfR1JSRFByb2M+KCk7CiAgICAgICAgIHBHUlJELT5HUlcgPSBXT0kgKyBSRFdJOwogICAgICAgICBwR1JSRC0+R1JIID0gSE9JICsgUkRISTsKICAgICAgICAgcEdSUkQtPkdSVEVNUExBVEUgPSBTQlJURU1QTEFURTsKQEAgLTM0Nyw4ICszNTEsNyBAQAogICAgICAgICBwR1JSRC0+R1JBVFsxXSA9IFNCUkFUWzFdOwogICAgICAgICBwR1JSRC0+R1JBVFsyXSA9IFNCUkFUWzJdOwogICAgICAgICBwR1JSRC0+R1JBVFszXSA9IFNCUkFUWzNdOwotICAgICAgICBJQkkucmVzZXQocEdSUkQtPmRlY29kZShwQXJpdGhEZWNvZGVyLCBnckNvbnRleHQpKTsKLSAgICAgICAgcElCSSA9IElCSS5nZXQoKTsKKyAgICAgICAgcElCSSA9IHBHUlJELT5kZWNvZGUocEFyaXRoRGVjb2RlciwgZ3JDb250ZXh0KTsKICAgICAgIH0KICAgICAgIGlmICghcElCSSkKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC0zNjIsMzUgKzM2NSwzOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSRUZDT1JORVIgPT0gSkJJRzJfQ09STkVSX0JPVFRPTVJJR0hUKSkpIHsKICAgICAgICAgQ1VSUyArPSBISSAtIDE7CiAgICAgICB9Ci0gICAgICBpbnQzMl90IFNJID0gQ1VSUzsKKyAgICAgIGlmICghQ1VSUy5Jc1ZhbGlkKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICBpbnQzMl90IFNJID0gQ1VSUy5WYWx1ZU9yRGllKCk7CiAgICAgICBpZiAoVFJBTlNQT1NFRCA9PSAwKSB7CiAgICAgICAgIHN3aXRjaCAoUkVGQ09STkVSKSB7CiAgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfVE9QTEVGVDoKLSAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShTSSwgVEksIHBJQkksIFNCQ09NQk9QKTsKKyAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShTSSwgVEksIHBJQkkuR2V0KCksIFNCQ09NQk9QKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX1RPUFJJR0hUOgotICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFNJIC0gV0kgKyAxLCBUSSwgcElCSSwgU0JDT01CT1ApOworICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFNJIC0gV0kgKyAxLCBUSSwgcElCSS5HZXQoKSwgU0JDT01CT1ApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfQk9UVE9NTEVGVDoKLSAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShTSSwgVEkgLSBISSArIDEsIHBJQkksIFNCQ09NQk9QKTsKKyAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShTSSwgVEkgLSBISSArIDEsIHBJQkkuR2V0KCksIFNCQ09NQk9QKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX0JPVFRPTVJJR0hUOgotICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFNJIC0gV0kgKyAxLCBUSSAtIEhJICsgMSwgcElCSSwgU0JDT01CT1ApOworICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFNJIC0gV0kgKyAxLCBUSSAtIEhJICsgMSwgcElCSS5HZXQoKSwgU0JDT01CT1ApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHN3aXRjaCAoUkVGQ09STkVSKSB7CiAgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfVE9QTEVGVDoKLSAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShUSSwgU0ksIHBJQkksIFNCQ09NQk9QKTsKKyAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShUSSwgU0ksIHBJQkkuR2V0KCksIFNCQ09NQk9QKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX1RPUFJJR0hUOgotICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFRJIC0gV0kgKyAxLCBTSSwgcElCSSwgU0JDT01CT1ApOworICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFRJIC0gV0kgKyAxLCBTSSwgcElCSS5HZXQoKSwgU0JDT01CT1ApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgY2FzZSBKQklHMl9DT1JORVJfQk9UVE9NTEVGVDoKLSAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShUSSwgU0kgLSBISSArIDEsIHBJQkksIFNCQ09NQk9QKTsKKyAgICAgICAgICAgIFNCUkVHLT5jb21wb3NlRnJvbShUSSwgU0kgLSBISSArIDEsIHBJQkkuR2V0KCksIFNCQ09NQk9QKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIGNhc2UgSkJJRzJfQ09STkVSX0JPVFRPTVJJR0hUOgotICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFRJIC0gV0kgKyAxLCBTSSAtIEhJICsgMSwgcElCSSwgU0JDT01CT1ApOworICAgICAgICAgICAgU0JSRUctPmNvbXBvc2VGcm9tKFRJIC0gV0kgKyAxLCBTSSAtIEhJICsgMSwgcElCSS5HZXQoKSwgU0JDT01CT1ApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTQwNCw1ICs0MTAsNSBAQAogICAgICAgKytOSU5TVEFOQ0VTOwogICAgIH0KICAgfQotICByZXR1cm4gU0JSRUcucmVsZWFzZSgpOworICByZXR1cm4gU0JSRUc7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfVHJkUHJvYy5oIGIvY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX1RyZFByb2MuaAppbmRleCBiZTUwZWMxLi5hNjY0MTViIDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfVHJkUHJvYy5oCisrKyBiL2NvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9UcmRQcm9jLmgKQEAgLTcsNiArNyw5IEBACiAjaWZuZGVmIENPUkVfRlhDT0RFQ19KQklHMl9KQklHMl9UUkRQUk9DX0hfCiAjZGVmaW5lIENPUkVfRlhDT0RFQ19KQklHMl9KQklHMl9UUkRQUk9DX0hfCiAKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCiAjaW5jbHVkZSAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0ltYWdlLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKIApAQCAtNDAsMTIgKzQzLDE1IEBACiAKIGNsYXNzIENKQmlnMl9UUkRQcm9jIHsKICBwdWJsaWM6Ci0gIENKQmlnMl9JbWFnZSogZGVjb2RlX0h1ZmZtYW4oQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQpOworICBDSkJpZzJfVFJEUHJvYygpOworICB+Q0pCaWcyX1RSRFByb2MoKTsKIAotICBDSkJpZzJfSW1hZ2UqIGRlY29kZV9Bcml0aChDSkJpZzJfQXJpdGhEZWNvZGVyKiBwQXJpdGhEZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQmlnMkFyaXRoQ3R4KiBnckNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcySW50RGVjb2RlclN0YXRlKiBwSURTKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKQmlnMl9JbWFnZT4gZGVjb2RlX0h1ZmZtYW4oQ0pCaWcyX0JpdFN0cmVhbSogcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkJpZzJBcml0aEN0eCogZ3JDb250ZXh0KTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pCaWcyX0ltYWdlPiBkZWNvZGVfQXJpdGgoQ0pCaWcyX0FyaXRoRGVjb2RlciogcEFyaXRoRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcyQXJpdGhDdHgqIGdyQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpCaWcySW50RGVjb2RlclN0YXRlKiBwSURTKTsKIAogICBib29sIFNCSFVGRjsKICAgYm9vbCBTQlJFRklORTsKQEAgLTU1LDcgKzYxLDcgQEAKICAgdWludDMyX3QgU0JTVFJJUFM7CiAgIHVpbnQzMl90IFNCTlVNU1lNUzsKIAotICBKQmlnMkh1ZmZtYW5Db2RlKiBTQlNZTUNPREVTOworICBzdGQ6OnZlY3RvcjxKQmlnMkh1ZmZtYW5Db2RlPiBTQlNZTUNPREVTOwogICB1aW50OF90IFNCU1lNQ09ERUxFTjsKIAogICBDSkJpZzJfSW1hZ2UqKiBTQlNZTVM7CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y29kZWMvbGJtcC9meF9ibXAuY3BwIGIvY29yZS9meGNvZGVjL2xibXAvZnhfYm1wLmNwcAppbmRleCAyYjA3MmE0Li43M2JlNjZlIDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvbGJtcC9meF9ibXAuY3BwCisrKyBiL2NvcmUvZnhjb2RlYy9sYm1wL2Z4X2JtcC5jcHAKQEAgLTcsMzM3ICs3LDM1NyBAQAogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9sYm1wL2Z4X2JtcC5oIgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCitzdGF0aWNfYXNzZXJ0KHNpemVvZihCbXBGaWxlSGVhZGVyKSA9PSAxNCwKKyAgICAgICAgICAgICAgIkJtcEZpbGVIZWFkZXIgc2hvdWxkIGhhdmUgYSBzaXplIG9mIDE0Iik7CiAKIG5hbWVzcGFjZSB7CiAKIGNvbnN0IHNpemVfdCBrQm1wQ29yZUhlYWRlclNpemUgPSAxMjsKIGNvbnN0IHNpemVfdCBrQm1wSW5mb0hlYWRlclNpemUgPSA0MDsKIAotLy8gVE9ETyh0aGVzdGlnKTogUmVwbGFjZSB3aXRoIEZYRFdPUkRfR0VUX0xTQkZJUlNUPwotdWludDMyX3QgR2V0RFdvcmRfTFNCRmlyc3QodWludDhfdCogcCkgewotICByZXR1cm4gcFswXSB8IChwWzFdIDw8IDgpIHwgKHBbMl0gPDwgMTYpIHwgKHBbM10gPDwgMjQpOwordWludDhfdCBIYWxmUm91bmRVcCh1aW50OF90IHZhbHVlKSB7CisgIHVpbnQxNl90IHZhbHVlMTYgPSB2YWx1ZTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KCh2YWx1ZTE2ICsgMSkgLyAyKTsKIH0KIAotdm9pZCBTZXREV29yZF9MU0JGaXJzdCh1aW50OF90KiBwLCB1aW50MzJfdCB2KSB7Ci0gIHBbMF0gPSAodWludDhfdCl2OwotICBwWzFdID0gKHVpbnQ4X3QpKHYgPj4gOCk7Ci0gIHBbMl0gPSAodWludDhfdCkodiA+PiAxNik7Ci0gIHBbM10gPSAodWludDhfdCkodiA+PiAyNCk7Ci19CiB9ICAvLyBuYW1lc3BhY2UKIAotdWludDE2X3QgR2V0V29yZF9MU0JGaXJzdCh1aW50OF90KiBwKSB7Ci0gIHJldHVybiBwWzBdIHwgKHBbMV0gPDwgOCk7Ci19Ci12b2lkIFNldFdvcmRfTFNCRmlyc3QodWludDhfdCogcCwgdWludDE2X3QgdikgewotICBwWzBdID0gKHVpbnQ4X3QpdjsKLSAgcFsxXSA9ICh1aW50OF90KSh2ID4+IDgpOwotfQotdm9pZCBibXBfZXJyb3IoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgY29uc3QgRlhfQ0hBUiogZXJyX21zZykgewotICBpZiAoYm1wX3B0ciAmJiBibXBfcHRyLT5ibXBfZXJyb3JfZm4pIHsKLSAgICBibXBfcHRyLT5ibXBfZXJyb3JfZm4oYm1wX3B0ciwgZXJyX21zZyk7Ci0gIH0KLX0KLWJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9jcmVhdGVfZGVjb21wcmVzcygpIHsKLSAgYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciA9IEZYX0FsbG9jKGJtcF9kZWNvbXByZXNzX3N0cnVjdCwgMSk7Ci0gIEZYU1lTX21lbXNldChibXBfcHRyLCAwLCBzaXplb2YoYm1wX2RlY29tcHJlc3Nfc3RydWN0KSk7Ci0gIGJtcF9wdHItPmRlY29kZV9zdGF0dXMgPSBCTVBfRF9TVEFUVVNfSEVBREVSOwotICBibXBfcHRyLT5ibXBfaGVhZGVyX3B0ciA9IEZYX0FsbG9jKEJtcEZpbGVIZWFkZXIsIDEpOwotICByZXR1cm4gYm1wX3B0cjsKLX0KLXZvaWQgYm1wX2Rlc3Ryb3lfZGVjb21wcmVzcyhibXBfZGVjb21wcmVzc19zdHJ1Y3RfcHAgYm1wX3B0cl9wdHIpIHsKLSAgaWYgKCFibXBfcHRyX3B0ciB8fCAhKmJtcF9wdHJfcHRyKQotICAgIHJldHVybjsKK0JNUERlY29tcHJlc3Nvcjo6Qk1QRGVjb21wcmVzc29yKCkKKyAgICA6IGNvbnRleHRfcHRyKG51bGxwdHIpLAorICAgICAgbmV4dF9pbihudWxscHRyKSwKKyAgICAgIGhlYWRlcl9vZmZzZXQoMCksCisgICAgICB3aWR0aCgwKSwKKyAgICAgIGhlaWdodCgwKSwKKyAgICAgIGNvbXByZXNzX2ZsYWcoMCksCisgICAgICBjb21wb25lbnRzKDApLAorICAgICAgc3JjX3Jvd19ieXRlcygwKSwKKyAgICAgIG91dF9yb3dfYnl0ZXMoMCksCisgICAgICBiaXRDb3VudHMoMCksCisgICAgICBjb2xvcl91c2VkKDApLAorICAgICAgaW1nVEJfZmxhZyhmYWxzZSksCisgICAgICBwYWxfbnVtKDApLAorICAgICAgcGFsX3R5cGUoMCksCisgICAgICBkYXRhX3NpemUoMCksCisgICAgICBpbWdfZGF0YV9vZmZzZXQoMCksCisgICAgICBpbWdfaWZoX3NpemUoMCksCisgICAgICByb3dfbnVtKDApLAorICAgICAgY29sX251bSgwKSwKKyAgICAgIGRwaV94KDApLAorICAgICAgZHBpX3koMCksCisgICAgICBtYXNrX3JlZCgwKSwKKyAgICAgIG1hc2tfZ3JlZW4oMCksCisgICAgICBtYXNrX2JsdWUoMCksCisgICAgICBhdmFpbF9pbigwKSwKKyAgICAgIHNraXBfc2l6ZSgwKSwKKyAgICAgIGRlY29kZV9zdGF0dXMoQk1QX0RfU1RBVFVTX0hFQURFUikge30KIAotICBibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyID0gKmJtcF9wdHJfcHRyOwotICAqYm1wX3B0cl9wdHIgPSBudWxscHRyOwotICBpZiAoYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIpIHsKLSAgICBGWF9GcmVlKGJtcF9wdHItPm91dF9yb3dfYnVmZmVyKTsKLSAgfQotICBGWF9GcmVlKGJtcF9wdHItPnBhbF9wdHIpOwotICBGWF9GcmVlKGJtcF9wdHItPmJtcF9oZWFkZXJfcHRyKTsKLSAgRlhfRnJlZShibXBfcHRyKTsKK0JNUERlY29tcHJlc3Nvcjo6fkJNUERlY29tcHJlc3NvcigpIHt9CisKK3ZvaWQgQk1QRGVjb21wcmVzc29yOjpFcnJvcigpIHsKKyAgbG9uZ2ptcChqbXBidWYsIDEpOwogfQotaW50MzJfdCBibXBfcmVhZF9oZWFkZXIoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cikgewotICBpZiAoIWJtcF9wdHIpCi0gICAgcmV0dXJuIDA7CiAKLSAgdWludDMyX3Qgc2tpcF9zaXplX29yZyA9IGJtcF9wdHItPnNraXBfc2l6ZTsKLSAgaWYgKGJtcF9wdHItPmRlY29kZV9zdGF0dXMgPT0gQk1QX0RfU1RBVFVTX0hFQURFUikgewotICAgIEFTU0VSVChzaXplb2YoQm1wRmlsZUhlYWRlcikgPT0gMTQpOwotICAgIEJtcEZpbGVIZWFkZXIqIGJtcF9oZWFkZXJfcHRyID0gbnVsbHB0cjsKLSAgICBpZiAoIWJtcF9yZWFkX2RhdGEoYm1wX3B0ciwgKHVpbnQ4X3QqKikmYm1wX2hlYWRlcl9wdHIsIDE0KSkKLSAgICAgIHJldHVybiAyOwordm9pZCBCTVBEZWNvbXByZXNzb3I6OlJlYWRTY2FubGluZSh1aW50MzJfdCByb3dfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcm93X2J1ZikgeworICBhdXRvKiBwID0gcmVpbnRlcnByZXRfY2FzdDxDQm1wQ29udGV4dCo+KGNvbnRleHRfcHRyKTsKKyAgcC0+bV9wRGVsZWdhdGUtPkJtcFJlYWRTY2FubGluZShyb3dfbnVtLCByb3dfYnVmKTsKK30KIAotICAgIGJtcF9wdHItPmJtcF9oZWFkZXJfcHRyLT5iZlR5cGUgPQotICAgICAgICBHZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2hlYWRlcl9wdHItPmJmVHlwZSk7Ci0gICAgYm1wX3B0ci0+Ym1wX2hlYWRlcl9wdHItPmJmT2ZmQml0cyA9Ci0gICAgICAgIEdldERXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2hlYWRlcl9wdHItPmJmT2ZmQml0cyk7Ci0gICAgYm1wX3B0ci0+ZGF0YV9zaXplID0gR2V0RFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZibXBfaGVhZGVyX3B0ci0+YmZTaXplKTsKLSAgICBpZiAoYm1wX3B0ci0+Ym1wX2hlYWRlcl9wdHItPmJmVHlwZSAhPSBCTVBfU0lHTkFUVVJFKSB7Ci0gICAgICBibXBfZXJyb3IoYm1wX3B0ciwgIk5vdCBBIEJtcCBJbWFnZSIpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChibXBfcHRyLT5hdmFpbF9pbiA8IHNpemVvZih1aW50MzJfdCkpIHsKLSAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7Citib29sIEJNUERlY29tcHJlc3Nvcjo6R2V0RGF0YVBvc2l0aW9uKHVpbnQzMl90IHJjZF9wb3MpIHsKKyAgYXV0byogcCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0JtcENvbnRleHQqPihjb250ZXh0X3B0cik7CisgIHJldHVybiBwLT5tX3BEZWxlZ2F0ZS0+Qm1wSW5wdXRJbWFnZVBvc2l0aW9uQnVmKHJjZF9wb3MpOworfQorCitpbnQzMl90IEJNUERlY29tcHJlc3Nvcjo6UmVhZEhlYWRlcigpIHsKKyAgdWludDMyX3Qgc2tpcF9zaXplX29yZyA9IHNraXBfc2l6ZTsKKyAgaWYgKGRlY29kZV9zdGF0dXMgPT0gQk1QX0RfU1RBVFVTX0hFQURFUikgeworICAgIEJtcEZpbGVIZWFkZXIqIHBCbXBfaGVhZGVyID0gbnVsbHB0cjsKKyAgICBpZiAoIVJlYWREYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCoqPigmcEJtcF9oZWFkZXIpLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJtcEZpbGVIZWFkZXIpKSkgewogICAgICAgcmV0dXJuIDI7CiAgICAgfQotICAgIGJtcF9wdHItPmltZ19pZmhfc2l6ZSA9Ci0gICAgICAgIEdldERXb3JkX0xTQkZpcnN0KGJtcF9wdHItPm5leHRfaW4gKyBibXBfcHRyLT5za2lwX3NpemUpOwotICAgIGJtcF9wdHItPnBhbF90eXBlID0gMDsKKworICAgIHBCbXBfaGVhZGVyLT5iZlR5cGUgPQorICAgICAgICBGWFdPUkRfR0VUX0xTQkZJUlNUKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZwQm1wX2hlYWRlci0+YmZUeXBlKSk7CisgICAgcEJtcF9oZWFkZXItPmJmT2ZmQml0cyA9IEZYRFdPUkRfR0VUX0xTQkZJUlNUKAorICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmcEJtcF9oZWFkZXItPmJmT2ZmQml0cykpOworICAgIGRhdGFfc2l6ZSA9CisgICAgICAgIEZYRFdPUkRfR0VUX0xTQkZJUlNUKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZwQm1wX2hlYWRlci0+YmZTaXplKSk7CisgICAgaWYgKHBCbXBfaGVhZGVyLT5iZlR5cGUgIT0gQk1QX1NJR05BVFVSRSkgeworICAgICAgRXJyb3IoKTsKKyAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICB9CisgICAgaWYgKGF2YWlsX2luIDwgc2l6ZW9mKHVpbnQzMl90KSkgeworICAgICAgc2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsKKyAgICAgIHJldHVybiAyOworICAgIH0KKyAgICBpbWdfaWZoX3NpemUgPQorICAgICAgICBGWERXT1JEX0dFVF9MU0JGSVJTVChzdGF0aWNfY2FzdDx1aW50OF90Kj4obmV4dF9pbiArIHNraXBfc2l6ZSkpOworICAgIHBhbF90eXBlID0gMDsKICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihCbXBDb3JlSGVhZGVyKSA9PSBrQm1wQ29yZUhlYWRlclNpemUsCiAgICAgICAgICAgICAgICAgICAiQm1wQ29yZUhlYWRlciBoYXMgd3Jvbmcgc2l6ZSIpOwogICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEJtcEluZm9IZWFkZXIpID09IGtCbXBJbmZvSGVhZGVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICJCbXBJbmZvSGVhZGVyIGhhcyB3cm9uZyBzaXplIik7Ci0gICAgc3dpdGNoIChibXBfcHRyLT5pbWdfaWZoX3NpemUpIHsKKyAgICBzd2l0Y2ggKGltZ19pZmhfc2l6ZSkgewogICAgICAgY2FzZSBrQm1wQ29yZUhlYWRlclNpemU6IHsKLSAgICAgICAgYm1wX3B0ci0+cGFsX3R5cGUgPSAxOwotICAgICAgICBCbXBDb3JlSGVhZGVyUHRyIGJtcF9jb3JlX2hlYWRlcl9wdHIgPSBudWxscHRyOwotICAgICAgICBpZiAoIWJtcF9yZWFkX2RhdGEoYm1wX3B0ciwgKHVpbnQ4X3QqKikmYm1wX2NvcmVfaGVhZGVyX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmltZ19pZmhfc2l6ZSkpIHsKLSAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOworICAgICAgICBwYWxfdHlwZSA9IDE7CisgICAgICAgIEJtcENvcmVIZWFkZXIqIHBCbXBfY29yZV9oZWFkZXIgPSBudWxscHRyOworICAgICAgICBpZiAoIVJlYWREYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCoqPigmcEJtcF9jb3JlX2hlYWRlciksCisgICAgICAgICAgICAgICAgICAgICAgaW1nX2lmaF9zaXplKSkgeworICAgICAgICAgIHNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7CiAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgIH0KLSAgICAgICAgYm1wX3B0ci0+d2lkdGggPQotICAgICAgICAgICAgR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9jb3JlX2hlYWRlcl9wdHItPmJjV2lkdGgpOwotICAgICAgICBibXBfcHRyLT5oZWlnaHQgPQotICAgICAgICAgICAgR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9jb3JlX2hlYWRlcl9wdHItPmJjSGVpZ2h0KTsKLSAgICAgICAgYm1wX3B0ci0+Yml0Q291bnRzID0KLSAgICAgICAgICAgIEdldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZibXBfY29yZV9oZWFkZXJfcHRyLT5iY0JpdENvdW50KTsKLSAgICAgICAgYm1wX3B0ci0+Y29tcHJlc3NfZmxhZyA9IEJNUF9SR0I7Ci0gICAgICAgIGJtcF9wdHItPmltZ1RCX2ZsYWcgPSBmYWxzZTsKKyAgICAgICAgd2lkdGggPSBGWFdPUkRfR0VUX0xTQkZJUlNUKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnBCbXBfY29yZV9oZWFkZXItPmJjV2lkdGgpKTsKKyAgICAgICAgaGVpZ2h0ID0gRlhXT1JEX0dFVF9MU0JGSVJTVCgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZwQm1wX2NvcmVfaGVhZGVyLT5iY0hlaWdodCkpOworICAgICAgICBiaXRDb3VudHMgPSBGWFdPUkRfR0VUX0xTQkZJUlNUKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnBCbXBfY29yZV9oZWFkZXItPmJjQml0Q291bnQpKTsKKyAgICAgICAgY29tcHJlc3NfZmxhZyA9IEJNUF9SR0I7CisgICAgICAgIGltZ1RCX2ZsYWcgPSBmYWxzZTsKICAgICAgIH0gYnJlYWs7CiAgICAgICBjYXNlIGtCbXBJbmZvSGVhZGVyU2l6ZTogewotICAgICAgICBCbXBJbmZvSGVhZGVyUHRyIGJtcF9pbmZvX2hlYWRlcl9wdHIgPSBudWxscHRyOwotICAgICAgICBpZiAoIWJtcF9yZWFkX2RhdGEoYm1wX3B0ciwgKHVpbnQ4X3QqKikmYm1wX2luZm9faGVhZGVyX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmltZ19pZmhfc2l6ZSkpIHsKLSAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOworICAgICAgICBCbXBJbmZvSGVhZGVyKiBwQm1wX2luZm9faGVhZGVyID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKCFSZWFkRGF0YShyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqKj4oJnBCbXBfaW5mb19oZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgIGltZ19pZmhfc2l6ZSkpIHsKKyAgICAgICAgICBza2lwX3NpemUgPSBza2lwX3NpemVfb3JnOwogICAgICAgICAgIHJldHVybiAyOwogICAgICAgICB9Ci0gICAgICAgIGJtcF9wdHItPndpZHRoID0KLSAgICAgICAgICAgIEdldERXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlXaWR0aCk7Ci0gICAgICAgIGJtcF9wdHItPmhlaWdodCA9Ci0gICAgICAgICAgICBHZXREV29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpSGVpZ2h0KTsKLSAgICAgICAgYm1wX3B0ci0+Yml0Q291bnRzID0KLSAgICAgICAgICAgIEdldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZibXBfaW5mb19oZWFkZXJfcHRyLT5iaUJpdENvdW50KTsKLSAgICAgICAgYm1wX3B0ci0+Y29tcHJlc3NfZmxhZyA9Ci0gICAgICAgICAgICBHZXREV29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpQ29tcHJlc3Npb24pOwotICAgICAgICBibXBfcHRyLT5jb2xvcl91c2VkID0KLSAgICAgICAgICAgIEdldERXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlDbHJVc2VkKTsKLSAgICAgICAgYm1wX3B0ci0+ZHBpX3ggPSAoaW50MzJfdClHZXREV29yZF9MU0JGaXJzdCgKLSAgICAgICAgICAgICh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlYUGVsc1Blck1ldGVyKTsKLSAgICAgICAgYm1wX3B0ci0+ZHBpX3kgPSAoaW50MzJfdClHZXREV29yZF9MU0JGaXJzdCgKLSAgICAgICAgICAgICh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlZUGVsc1Blck1ldGVyKTsKLSAgICAgICAgaWYgKGJtcF9wdHItPmhlaWdodCA8IDApIHsKLSAgICAgICAgICBibXBfcHRyLT5oZWlnaHQgPSAtYm1wX3B0ci0+aGVpZ2h0OwotICAgICAgICAgIGJtcF9wdHItPmltZ1RCX2ZsYWcgPSB0cnVlOwotICAgICAgICB9CisgICAgICAgIHdpZHRoID0gRlhEV09SRF9HRVRfTFNCRklSU1QoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmcEJtcF9pbmZvX2hlYWRlci0+YmlXaWR0aCkpOworICAgICAgICBpbnQzMl90IHNpZ25lZF9oZWlnaHQgPSBGWERXT1JEX0dFVF9MU0JGSVJTVCgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZwQm1wX2luZm9faGVhZGVyLT5iaUhlaWdodCkpOworICAgICAgICBiaXRDb3VudHMgPSBGWFdPUkRfR0VUX0xTQkZJUlNUKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnBCbXBfaW5mb19oZWFkZXItPmJpQml0Q291bnQpKTsKKyAgICAgICAgY29tcHJlc3NfZmxhZyA9IEZYRFdPUkRfR0VUX0xTQkZJUlNUKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnBCbXBfaW5mb19oZWFkZXItPmJpQ29tcHJlc3Npb24pKTsKKyAgICAgICAgY29sb3JfdXNlZCA9IEZYRFdPUkRfR0VUX0xTQkZJUlNUKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnBCbXBfaW5mb19oZWFkZXItPmJpQ2xyVXNlZCkpOworICAgICAgICBkcGlfeCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KEZYRFdPUkRfR0VUX0xTQkZJUlNUKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnBCbXBfaW5mb19oZWFkZXItPmJpWFBlbHNQZXJNZXRlcikpKTsKKyAgICAgICAgZHBpX3kgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihGWERXT1JEX0dFVF9MU0JGSVJTVCgKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZwQm1wX2luZm9faGVhZGVyLT5iaVlQZWxzUGVyTWV0ZXIpKSk7CisgICAgICAgIFNldEhlaWdodChzaWduZWRfaGVpZ2h0KTsKICAgICAgIH0gYnJlYWs7CiAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgIGlmIChibXBfcHRyLT5pbWdfaWZoX3NpemUgPgorICAgICAgICBpZiAoaW1nX2lmaF9zaXplID4KICAgICAgICAgICAgIHN0ZDo6bWluKGtCbXBJbmZvSGVhZGVyU2l6ZSwgc2l6ZW9mKEJtcEluZm9IZWFkZXIpKSkgewotICAgICAgICAgIEJtcEluZm9IZWFkZXJQdHIgYm1wX2luZm9faGVhZGVyX3B0ciA9IG51bGxwdHI7Ci0gICAgICAgICAgaWYgKCFibXBfcmVhZF9kYXRhKGJtcF9wdHIsICh1aW50OF90KiopJmJtcF9pbmZvX2hlYWRlcl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJtcF9wdHItPmltZ19pZmhfc2l6ZSkpIHsKLSAgICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7CisgICAgICAgICAgQm1wSW5mb0hlYWRlciogcEJtcF9pbmZvX2hlYWRlciA9IG51bGxwdHI7CisgICAgICAgICAgaWYgKCFSZWFkRGF0YShyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqKj4oJnBCbXBfaW5mb19oZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1nX2lmaF9zaXplKSkgeworICAgICAgICAgICAgc2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsKICAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgICAgIH0KICAgICAgICAgICB1aW50MTZfdCBiaVBsYW5lczsKLSAgICAgICAgICBibXBfcHRyLT53aWR0aCA9Ci0gICAgICAgICAgICAgIEdldERXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlXaWR0aCk7Ci0gICAgICAgICAgYm1wX3B0ci0+aGVpZ2h0ID0KLSAgICAgICAgICAgICAgR2V0RFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZibXBfaW5mb19oZWFkZXJfcHRyLT5iaUhlaWdodCk7Ci0gICAgICAgICAgYm1wX3B0ci0+Yml0Q291bnRzID0KLSAgICAgICAgICAgICAgR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpQml0Q291bnQpOwotICAgICAgICAgIGJtcF9wdHItPmNvbXByZXNzX2ZsYWcgPQotICAgICAgICAgICAgICBHZXREV29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpQ29tcHJlc3Npb24pOwotICAgICAgICAgIGJtcF9wdHItPmNvbG9yX3VzZWQgPQotICAgICAgICAgICAgICBHZXREV29yZF9MU0JGaXJzdCgodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpQ2xyVXNlZCk7Ci0gICAgICAgICAgYmlQbGFuZXMgPSBHZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlQbGFuZXMpOwotICAgICAgICAgIGJtcF9wdHItPmRwaV94ID0gR2V0RFdvcmRfTFNCRmlyc3QoCi0gICAgICAgICAgICAgICh1aW50OF90KikmYm1wX2luZm9faGVhZGVyX3B0ci0+YmlYUGVsc1Blck1ldGVyKTsKLSAgICAgICAgICBibXBfcHRyLT5kcGlfeSA9IEdldERXb3JkX0xTQkZpcnN0KAotICAgICAgICAgICAgICAodWludDhfdCopJmJtcF9pbmZvX2hlYWRlcl9wdHItPmJpWVBlbHNQZXJNZXRlcik7Ci0gICAgICAgICAgaWYgKGJtcF9wdHItPmhlaWdodCA8IDApIHsKLSAgICAgICAgICAgIGJtcF9wdHItPmhlaWdodCA9IC1ibXBfcHRyLT5oZWlnaHQ7Ci0gICAgICAgICAgICBibXBfcHRyLT5pbWdUQl9mbGFnID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGJtcF9wdHItPmNvbXByZXNzX2ZsYWcgPT0gQk1QX1JHQiAmJiBiaVBsYW5lcyA9PSAxICYmCi0gICAgICAgICAgICAgIGJtcF9wdHItPmNvbG9yX3VzZWQgPT0gMCkgeworICAgICAgICAgIHdpZHRoID0gRlhEV09SRF9HRVRfTFNCRklSU1QoCisgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZwQm1wX2luZm9faGVhZGVyLT5iaVdpZHRoKSk7CisgICAgICAgICAgaW50MzJfdCBzaWduZWRfaGVpZ2h0ID0gRlhEV09SRF9HRVRfTFNCRklSU1QoCisgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZwQm1wX2luZm9faGVhZGVyLT5iaUhlaWdodCkpOworICAgICAgICAgIGJpdENvdW50cyA9IEZYV09SRF9HRVRfTFNCRklSU1QoCisgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZwQm1wX2luZm9faGVhZGVyLT5iaUJpdENvdW50KSk7CisgICAgICAgICAgY29tcHJlc3NfZmxhZyA9IEZYRFdPUkRfR0VUX0xTQkZJUlNUKAorICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmcEJtcF9pbmZvX2hlYWRlci0+YmlDb21wcmVzc2lvbikpOworICAgICAgICAgIGNvbG9yX3VzZWQgPSBGWERXT1JEX0dFVF9MU0JGSVJTVCgKKyAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnBCbXBfaW5mb19oZWFkZXItPmJpQ2xyVXNlZCkpOworICAgICAgICAgIGJpUGxhbmVzID0gRlhXT1JEX0dFVF9MU0JGSVJTVCgKKyAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnBCbXBfaW5mb19oZWFkZXItPmJpUGxhbmVzKSk7CisgICAgICAgICAgZHBpX3ggPSBGWERXT1JEX0dFVF9MU0JGSVJTVCgKKyAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJnBCbXBfaW5mb19oZWFkZXItPmJpWFBlbHNQZXJNZXRlcikpOworICAgICAgICAgIGRwaV95ID0gRlhEV09SRF9HRVRfTFNCRklSU1QoCisgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZwQm1wX2luZm9faGVhZGVyLT5iaVlQZWxzUGVyTWV0ZXIpKTsKKyAgICAgICAgICBTZXRIZWlnaHQoc2lnbmVkX2hlaWdodCk7CisgICAgICAgICAgaWYgKGNvbXByZXNzX2ZsYWcgPT0gQk1QX1JHQiAmJiBiaVBsYW5lcyA9PSAxICYmIGNvbG9yX3VzZWQgPT0gMCkKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBibXBfZXJyb3IoYm1wX3B0ciwgIlVuc3VwcG9ydGVkIEJtcCBGaWxlIik7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICBFcnJvcigpOworICAgICAgICBOT1RSRUFDSEVEKCk7CiAgICAgICB9CiAgICAgfQotICAgIGlmIChibXBfcHRyLT53aWR0aCA8PSAwIHx8IGJtcF9wdHItPmNvbXByZXNzX2ZsYWcgPiBCTVBfQklURklFTERTKSB7Ci0gICAgICBibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0Iik7Ci0gICAgICByZXR1cm4gMDsKKyAgICBpZiAod2lkdGggPiBCTVBfTUFYX1dJRFRIIHx8IGNvbXByZXNzX2ZsYWcgPiBCTVBfQklURklFTERTKSB7CisgICAgICBFcnJvcigpOworICAgICAgTk9UUkVBQ0hFRCgpOwogICAgIH0KLSAgICBzd2l0Y2ggKGJtcF9wdHItPmJpdENvdW50cykgeworICAgIHN3aXRjaCAoYml0Q291bnRzKSB7CiAgICAgICBjYXNlIDE6CiAgICAgICBjYXNlIDQ6CiAgICAgICBjYXNlIDg6CiAgICAgICBjYXNlIDE2OgogICAgICAgY2FzZSAyNDogewotICAgICAgICBpZiAoYm1wX3B0ci0+Y29sb3JfdXNlZCA+ICgodWludDMyX3QpMSkgPDwgYm1wX3B0ci0+Yml0Q291bnRzKSB7Ci0gICAgICAgICAgYm1wX2Vycm9yKGJtcF9wdHIsICJUaGUgQm1wIEZpbGUgSXMgQ29ycnVwdCIpOwotICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoY29sb3JfdXNlZCA+IDFVIDw8IGJpdENvdW50cykgeworICAgICAgICAgIEVycm9yKCk7CisgICAgICAgICAgTk9UUkVBQ0hFRCgpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBjYXNlIDMyOgogICAgICAgICBicmVhazsKICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJtcCBGaWxlIElzIENvcnJ1cHQiKTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIEVycm9yKCk7CisgICAgICAgIE5PVFJFQUNIRUQoKTsKICAgICB9Ci0gICAgYm1wX3B0ci0+c3JjX3Jvd19ieXRlcyA9IEJNUF9XSURUSEJZVEVTKGJtcF9wdHItPndpZHRoLCBibXBfcHRyLT5iaXRDb3VudHMpOwotICAgIHN3aXRjaCAoYm1wX3B0ci0+Yml0Q291bnRzKSB7CisgICAgc3JjX3Jvd19ieXRlcyA9IEJNUF9XSURUSEJZVEVTKHdpZHRoLCBiaXRDb3VudHMpOworICAgIHN3aXRjaCAoYml0Q291bnRzKSB7CiAgICAgICBjYXNlIDE6CiAgICAgICBjYXNlIDQ6CiAgICAgICBjYXNlIDg6Ci0gICAgICAgIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMgPSBCTVBfV0lEVEhCWVRFUyhibXBfcHRyLT53aWR0aCwgOCk7Ci0gICAgICAgIGJtcF9wdHItPmNvbXBvbmVudHMgPSAxOworICAgICAgICBvdXRfcm93X2J5dGVzID0gQk1QX1dJRFRIQllURVMod2lkdGgsIDgpOworICAgICAgICBjb21wb25lbnRzID0gMTsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIDE2OgogICAgICAgY2FzZSAyNDoKLSAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyA9IEJNUF9XSURUSEJZVEVTKGJtcF9wdHItPndpZHRoLCAyNCk7Ci0gICAgICAgIGJtcF9wdHItPmNvbXBvbmVudHMgPSAzOworICAgICAgICBvdXRfcm93X2J5dGVzID0gQk1QX1dJRFRIQllURVMod2lkdGgsIDI0KTsKKyAgICAgICAgY29tcG9uZW50cyA9IDM7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSAzMjoKLSAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyA9IGJtcF9wdHItPnNyY19yb3dfYnl0ZXM7Ci0gICAgICAgIGJtcF9wdHItPmNvbXBvbmVudHMgPSA0OworICAgICAgICBvdXRfcm93X2J5dGVzID0gc3JjX3Jvd19ieXRlczsKKyAgICAgICAgY29tcG9uZW50cyA9IDQ7CiAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBGWF9GcmVlKGJtcF9wdHItPm91dF9yb3dfYnVmZmVyKTsKKyAgICBvdXRfcm93X2J1ZmZlci5jbGVhcigpOwogCi0gICAgaWYgKGJtcF9wdHItPm91dF9yb3dfYnl0ZXMgPD0gMCkgewotICAgICAgYm1wX2Vycm9yKGJtcF9wdHIsICJUaGUgQm1wIEZpbGUgSXMgQ29ycnVwdCIpOwotICAgICAgcmV0dXJuIDA7CisgICAgaWYgKG91dF9yb3dfYnl0ZXMgPD0gMCkgeworICAgICAgRXJyb3IoKTsKKyAgICAgIE5PVFJFQUNIRUQoKTsKICAgICB9CiAKLSAgICBibXBfcHRyLT5vdXRfcm93X2J1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMpOwotICAgIEZYU1lTX21lbXNldChibXBfcHRyLT5vdXRfcm93X2J1ZmZlciwgMCwgYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyk7Ci0gICAgYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19QQUwpOworICAgIG91dF9yb3dfYnVmZmVyLnJlc2l6ZShvdXRfcm93X2J5dGVzKTsKKyAgICBTYXZlRGVjb2RpbmdTdGF0dXMoQk1QX0RfU1RBVFVTX1BBTCk7CiAgIH0KLSAgaWYgKGJtcF9wdHItPmRlY29kZV9zdGF0dXMgPT0gQk1QX0RfU1RBVFVTX1BBTCkgewotICAgIHNraXBfc2l6ZV9vcmcgPSBibXBfcHRyLT5za2lwX3NpemU7Ci0gICAgaWYgKGJtcF9wdHItPmNvbXByZXNzX2ZsYWcgPT0gQk1QX0JJVEZJRUxEUykgewotICAgICAgaWYgKGJtcF9wdHItPmJpdENvdW50cyAhPSAxNiAmJiBibXBfcHRyLT5iaXRDb3VudHMgIT0gMzIpIHsKLSAgICAgICAgYm1wX2Vycm9yKGJtcF9wdHIsICJUaGUgQm1wIEZpbGUgSXMgQ29ycnVwdCIpOwotICAgICAgICByZXR1cm4gMDsKKyAgaWYgKGRlY29kZV9zdGF0dXMgPT0gQk1QX0RfU1RBVFVTX1BBTCkgeworICAgIHNraXBfc2l6ZV9vcmcgPSBza2lwX3NpemU7CisgICAgaWYgKGNvbXByZXNzX2ZsYWcgPT0gQk1QX0JJVEZJRUxEUykgeworICAgICAgaWYgKGJpdENvdW50cyAhPSAxNiAmJiBiaXRDb3VudHMgIT0gMzIpIHsKKyAgICAgICAgRXJyb3IoKTsKKyAgICAgICAgTk9UUkVBQ0hFRCgpOwogICAgICAgfQogICAgICAgdWludDMyX3QqIG1hc2s7Ci0gICAgICBpZiAoYm1wX3JlYWRfZGF0YShibXBfcHRyLCAodWludDhfdCoqKSZtYXNrLCAzICogc2l6ZW9mKHVpbnQzMl90KSkgPT0KKyAgICAgIGlmIChSZWFkRGF0YShyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqKj4oJm1hc2spLCAzICogc2l6ZW9mKHVpbnQzMl90KSkgPT0KICAgICAgICAgICBudWxscHRyKSB7Ci0gICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7CisgICAgICAgIHNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7CiAgICAgICAgIHJldHVybiAyOwogICAgICAgfQotICAgICAgYm1wX3B0ci0+bWFza19yZWQgPSBHZXREV29yZF9MU0JGaXJzdCgodWludDhfdCopJm1hc2tbMF0pOwotICAgICAgYm1wX3B0ci0+bWFza19ncmVlbiA9IEdldERXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmbWFza1sxXSk7Ci0gICAgICBibXBfcHRyLT5tYXNrX2JsdWUgPSBHZXREV29yZF9MU0JGaXJzdCgodWludDhfdCopJm1hc2tbMl0pOwotICAgICAgaWYgKGJtcF9wdHItPm1hc2tfcmVkICYgYm1wX3B0ci0+bWFza19ncmVlbiB8fAotICAgICAgICAgIGJtcF9wdHItPm1hc2tfcmVkICYgYm1wX3B0ci0+bWFza19ibHVlIHx8Ci0gICAgICAgICAgYm1wX3B0ci0+bWFza19ncmVlbiAmIGJtcF9wdHItPm1hc2tfYmx1ZSkgewotICAgICAgICBibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCaXRmaWVsZCBCbXAgRmlsZSBJcyBDb3JydXB0Iik7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgbWFza19yZWQgPSBGWERXT1JEX0dFVF9MU0JGSVJTVChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmbWFza1swXSkpOworICAgICAgbWFza19ncmVlbiA9IEZYRFdPUkRfR0VUX0xTQkZJUlNUKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KCZtYXNrWzFdKSk7CisgICAgICBtYXNrX2JsdWUgPSBGWERXT1JEX0dFVF9MU0JGSVJTVChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPigmbWFza1syXSkpOworICAgICAgaWYgKG1hc2tfcmVkICYgbWFza19ncmVlbiB8fCBtYXNrX3JlZCAmIG1hc2tfYmx1ZSB8fAorICAgICAgICAgIG1hc2tfZ3JlZW4gJiBtYXNrX2JsdWUpIHsKKyAgICAgICAgRXJyb3IoKTsKKyAgICAgICAgTk9UUkVBQ0hFRCgpOwogICAgICAgfQotICAgICAgaWYgKGJtcF9wdHItPmJtcF9oZWFkZXJfcHRyLT5iZk9mZkJpdHMgPCAyNiArIGJtcF9wdHItPmltZ19pZmhfc2l6ZSkgewotICAgICAgICBibXBfcHRyLT5ibXBfaGVhZGVyX3B0ci0+YmZPZmZCaXRzID0gMjYgKyBibXBfcHRyLT5pbWdfaWZoX3NpemU7Ci0gICAgICB9Ci0gICAgICBibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX3B0ciwgQk1QX0RfU1RBVFVTX0RBVEFfUFJFKTsKKyAgICAgIGhlYWRlcl9vZmZzZXQgPSBzdGQ6Om1heChoZWFkZXJfb2Zmc2V0LCAyNiArIGltZ19pZmhfc2l6ZSk7CisgICAgICBTYXZlRGVjb2RpbmdTdGF0dXMoQk1QX0RfU1RBVFVTX0RBVEFfUFJFKTsKICAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSBpZiAoYm1wX3B0ci0+Yml0Q291bnRzID09IDE2KSB7Ci0gICAgICBibXBfcHRyLT5tYXNrX3JlZCA9IDB4N0MwMDsKLSAgICAgIGJtcF9wdHItPm1hc2tfZ3JlZW4gPSAweDAzRTA7Ci0gICAgICBibXBfcHRyLT5tYXNrX2JsdWUgPSAweDAwMUY7CisgICAgfSBlbHNlIGlmIChiaXRDb3VudHMgPT0gMTYpIHsKKyAgICAgIG1hc2tfcmVkID0gMHg3QzAwOworICAgICAgbWFza19ncmVlbiA9IDB4MDNFMDsKKyAgICAgIG1hc2tfYmx1ZSA9IDB4MDAxRjsKICAgICB9Ci0gICAgYm1wX3B0ci0+cGFsX251bSA9IDA7Ci0gICAgaWYgKGJtcF9wdHItPmJpdENvdW50cyA8IDE2KSB7Ci0gICAgICBibXBfcHRyLT5wYWxfbnVtID0gMSA8PCBibXBfcHRyLT5iaXRDb3VudHM7Ci0gICAgICBpZiAoYm1wX3B0ci0+Y29sb3JfdXNlZCAhPSAwKSB7Ci0gICAgICAgIGJtcF9wdHItPnBhbF9udW0gPSBibXBfcHRyLT5jb2xvcl91c2VkOwotICAgICAgfQorICAgIHBhbF9udW0gPSAwOworICAgIGlmIChiaXRDb3VudHMgPCAxNikgeworICAgICAgcGFsX251bSA9IDEgPDwgYml0Q291bnRzOworICAgICAgaWYgKGNvbG9yX3VzZWQgIT0gMCkKKyAgICAgICAgcGFsX251bSA9IGNvbG9yX3VzZWQ7CiAgICAgICB1aW50OF90KiBzcmNfcGFsX3B0ciA9IG51bGxwdHI7Ci0gICAgICB1aW50MzJfdCBzcmNfcGFsX3NpemUgPSBibXBfcHRyLT5wYWxfbnVtICogKGJtcF9wdHItPnBhbF90eXBlID8gMyA6IDQpOwotICAgICAgaWYgKGJtcF9yZWFkX2RhdGEoYm1wX3B0ciwgKHVpbnQ4X3QqKikmc3JjX3BhbF9wdHIsIHNyY19wYWxfc2l6ZSkgPT0KLSAgICAgICAgICBudWxscHRyKSB7Ci0gICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7CisgICAgICB1aW50MzJfdCBzcmNfcGFsX3NpemUgPSBwYWxfbnVtICogKHBhbF90eXBlID8gMyA6IDQpOworICAgICAgaWYgKFJlYWREYXRhKCZzcmNfcGFsX3B0ciwgc3JjX3BhbF9zaXplKSA9PSBudWxscHRyKSB7CisgICAgICAgIHNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7CiAgICAgICAgIHJldHVybiAyOwogICAgICAgfQotICAgICAgRlhfRnJlZShibXBfcHRyLT5wYWxfcHRyKTsKLSAgICAgIGJtcF9wdHItPnBhbF9wdHIgPSBGWF9BbGxvYyh1aW50MzJfdCwgYm1wX3B0ci0+cGFsX251bSk7CisgICAgICBwYWxldHRlLnJlc2l6ZShwYWxfbnVtKTsKICAgICAgIGludDMyX3Qgc3JjX3BhbF9pbmRleCA9IDA7Ci0gICAgICBpZiAoYm1wX3B0ci0+cGFsX3R5cGUgPT0gQk1QX1BBTF9PTEQpIHsKLSAgICAgICAgd2hpbGUgKHNyY19wYWxfaW5kZXggPCBibXBfcHRyLT5wYWxfbnVtKSB7Ci0gICAgICAgICAgYm1wX3B0ci0+cGFsX3B0cltzcmNfcGFsX2luZGV4KytdID0gQk1QX1BBTF9FTkNPREUoCisgICAgICBpZiAocGFsX3R5cGUgPT0gQk1QX1BBTF9PTEQpIHsKKyAgICAgICAgd2hpbGUgKHNyY19wYWxfaW5kZXggPCBwYWxfbnVtKSB7CisgICAgICAgICAgcGFsZXR0ZVtzcmNfcGFsX2luZGV4KytdID0gQk1QX1BBTF9FTkNPREUoCiAgICAgICAgICAgICAgIDB4MDAsIHNyY19wYWxfcHRyWzJdLCBzcmNfcGFsX3B0clsxXSwgc3JjX3BhbF9wdHJbMF0pOwogICAgICAgICAgIHNyY19wYWxfcHRyICs9IDM7CiAgICAgICAgIH0KICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHdoaWxlIChzcmNfcGFsX2luZGV4IDwgYm1wX3B0ci0+cGFsX251bSkgewotICAgICAgICAgIGJtcF9wdHItPnBhbF9wdHJbc3JjX3BhbF9pbmRleCsrXSA9IEJNUF9QQUxfRU5DT0RFKAorICAgICAgICB3aGlsZSAoc3JjX3BhbF9pbmRleCA8IHBhbF9udW0pIHsKKyAgICAgICAgICBwYWxldHRlW3NyY19wYWxfaW5kZXgrK10gPSBCTVBfUEFMX0VOQ09ERSgKICAgICAgICAgICAgICAgc3JjX3BhbF9wdHJbM10sIHNyY19wYWxfcHRyWzJdLCBzcmNfcGFsX3B0clsxXSwgc3JjX3BhbF9wdHJbMF0pOwogICAgICAgICAgIHNyY19wYWxfcHRyICs9IDQ7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9Ci0gICAgaWYgKGJtcF9wdHItPmJtcF9oZWFkZXJfcHRyLT5iZk9mZkJpdHMgPAotICAgICAgICAxNCArIGJtcF9wdHItPmltZ19pZmhfc2l6ZSArCi0gICAgICAgICAgICBibXBfcHRyLT5wYWxfbnVtICogKGJtcF9wdHItPnBhbF90eXBlID8gMyA6IDQpKSB7Ci0gICAgICBibXBfcHRyLT5ibXBfaGVhZGVyX3B0ci0+YmZPZmZCaXRzID0KLSAgICAgICAgICAxNCArIGJtcF9wdHItPmltZ19pZmhfc2l6ZSArCi0gICAgICAgICAgYm1wX3B0ci0+cGFsX251bSAqIChibXBfcHRyLT5wYWxfdHlwZSA/IDMgOiA0KTsKLSAgICB9Ci0gICAgYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19EQVRBX1BSRSk7CisgICAgaGVhZGVyX29mZnNldCA9IHN0ZDo6bWF4KGhlYWRlcl9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0ICsgaW1nX2lmaF9zaXplICsgcGFsX251bSAqIChwYWxfdHlwZSA/IDMgOiA0KSk7CisgICAgU2F2ZURlY29kaW5nU3RhdHVzKEJNUF9EX1NUQVRVU19EQVRBX1BSRSk7CiAgIH0KICAgcmV0dXJuIDE7CiB9Ci1pbnQzMl90IGJtcF9kZWNvZGVfaW1hZ2UoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cikgewotICBpZiAoYm1wX3B0ci0+ZGVjb2RlX3N0YXR1cyA9PSBCTVBfRF9TVEFUVVNfREFUQV9QUkUpIHsKLSAgICBibXBfcHRyLT5hdmFpbF9pbiA9IDA7Ci0gICAgaWYgKCFibXBfcHRyLT5ibXBfZ2V0X2RhdGFfcG9zaXRpb25fZm4oCi0gICAgICAgICAgICBibXBfcHRyLCBibXBfcHRyLT5ibXBfaGVhZGVyX3B0ci0+YmZPZmZCaXRzKSkgewotICAgICAgYm1wX3B0ci0+ZGVjb2RlX3N0YXR1cyA9IEJNUF9EX1NUQVRVU19UQUlMOwotICAgICAgYm1wX2Vycm9yKGJtcF9wdHIsICJUaGUgQm1wIEZpbGUgSXMgQ29ycnVwdCwgVW5leHBlY3RlZCBTdHJlYW0gT2Zmc2V0Iik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgYm1wX3B0ci0+cm93X251bSA9IDA7Ci0gICAgYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19EQVRBKTsKKworYm9vbCBCTVBEZWNvbXByZXNzb3I6OlZhbGlkYXRlRmxhZygpIGNvbnN0IHsKKyAgc3dpdGNoIChjb21wcmVzc19mbGFnKSB7CisgICAgY2FzZSBCTVBfUkdCOgorICAgIGNhc2UgQk1QX0JJVEZJRUxEUzoKKyAgICBjYXNlIEJNUF9STEU4OgorICAgIGNhc2UgQk1QX1JMRTQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIGlmIChibXBfcHRyLT5kZWNvZGVfc3RhdHVzID09IEJNUF9EX1NUQVRVU19EQVRBKSB7Ci0gICAgc3dpdGNoIChibXBfcHRyLT5jb21wcmVzc19mbGFnKSB7Ci0gICAgICBjYXNlIEJNUF9SR0I6Ci0gICAgICBjYXNlIEJNUF9CSVRGSUVMRFM6Ci0gICAgICAgIHJldHVybiBibXBfZGVjb2RlX3JnYihibXBfcHRyKTsKLSAgICAgIGNhc2UgQk1QX1JMRTg6Ci0gICAgICAgIHJldHVybiBibXBfZGVjb2RlX3JsZTgoYm1wX3B0cik7Ci0gICAgICBjYXNlIEJNUF9STEU0OgotICAgICAgICByZXR1cm4gYm1wX2RlY29kZV9ybGU0KGJtcF9wdHIpOwotICAgIH0KLSAgfQotICBibXBfZXJyb3IoYm1wX3B0ciwgIkFueSBVbmNvbnRyb2wgRXJyb3IiKTsKLSAgcmV0dXJuIDA7CiB9Ci1pbnQzMl90IGJtcF9kZWNvZGVfcmdiKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIpIHsKLSAgdWludDhfdCogcm93X2J1ZiA9IGJtcF9wdHItPm91dF9yb3dfYnVmZmVyOworCitpbnQzMl90IEJNUERlY29tcHJlc3Nvcjo6RGVjb2RlSW1hZ2UoKSB7CisgIGlmIChkZWNvZGVfc3RhdHVzID09IEJNUF9EX1NUQVRVU19EQVRBX1BSRSkgeworICAgIGF2YWlsX2luID0gMDsKKyAgICBpZiAoIUdldERhdGFQb3NpdGlvbihoZWFkZXJfb2Zmc2V0KSkgeworICAgICAgZGVjb2RlX3N0YXR1cyA9IEJNUF9EX1NUQVRVU19UQUlMOworICAgICAgRXJyb3IoKTsKKyAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICB9CisgICAgcm93X251bSA9IDA7CisgICAgU2F2ZURlY29kaW5nU3RhdHVzKEJNUF9EX1NUQVRVU19EQVRBKTsKKyAgfQorICBpZiAoZGVjb2RlX3N0YXR1cyAhPSBCTVBfRF9TVEFUVVNfREFUQSB8fCAhVmFsaWRhdGVGbGFnKCkpIHsKKyAgICBFcnJvcigpOworICAgIE5PVFJFQUNIRUQoKTsKKyAgfQorICBzd2l0Y2ggKGNvbXByZXNzX2ZsYWcpIHsKKyAgICBjYXNlIEJNUF9SR0I6CisgICAgY2FzZSBCTVBfQklURklFTERTOgorICAgICAgcmV0dXJuIERlY29kZVJHQigpOworICAgIGNhc2UgQk1QX1JMRTg6CisgICAgICByZXR1cm4gRGVjb2RlUkxFOCgpOworICAgIGNhc2UgQk1QX1JMRTQ6CisgICAgICByZXR1cm4gRGVjb2RlUkxFNCgpOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gMDsKKyAgfQorfQorCitib29sIEJNUERlY29tcHJlc3Nvcjo6VmFsaWRhdGVDb2xvckluZGV4KHVpbnQ4X3QgdmFsKSB7CisgIGlmICh2YWwgPj0gcGFsX251bSkgeworICAgIEVycm9yKCk7CisgICAgTk9UUkVBQ0hFRCgpOworICB9CisgIHJldHVybiB0cnVlOworfQorCitpbnQzMl90IEJNUERlY29tcHJlc3Nvcjo6RGVjb2RlUkdCKCkgewogICB1aW50OF90KiBkZXNfYnVmID0gbnVsbHB0cjsKLSAgd2hpbGUgKGJtcF9wdHItPnJvd19udW0gPCBibXBfcHRyLT5oZWlnaHQpIHsKLSAgICBpZiAoIWJtcF9yZWFkX2RhdGEoYm1wX3B0ciwgJmRlc19idWYsIGJtcF9wdHItPnNyY19yb3dfYnl0ZXMpKQorICB3aGlsZSAocm93X251bSA8IGhlaWdodCkgeworICAgIHNpemVfdCBpZHggPSAwOworICAgIGlmICghUmVhZERhdGEoJmRlc19idWYsIHNyY19yb3dfYnl0ZXMpKQogICAgICAgcmV0dXJuIDI7CiAKLSAgICBibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX3B0ciwgQk1QX0RfU1RBVFVTX0RBVEEpOwotICAgIHN3aXRjaCAoYm1wX3B0ci0+Yml0Q291bnRzKSB7CisgICAgU2F2ZURlY29kaW5nU3RhdHVzKEJNUF9EX1NUQVRVU19EQVRBKTsKKyAgICBzd2l0Y2ggKGJpdENvdW50cykgewogICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGZvciAoaW50MzJfdCBjb2wgPSAwOyBjb2wgPCBibXBfcHRyLT53aWR0aDsgY29sKyspIHsKLSAgICAgICAgICAqcm93X2J1ZisrID0gZGVzX2J1Zltjb2wgPj4gM10gJiAoMHg4MCA+PiAoY29sICUgOCkpID8gMHgwMSA6IDB4MDA7Ci0gICAgICAgIH0KKyAgICAgICAgZm9yICh1aW50MzJfdCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgKytjb2wpCisgICAgICAgICAgb3V0X3Jvd19idWZmZXJbaWR4KytdID0KKyAgICAgICAgICAgICAgZGVzX2J1Zltjb2wgPj4gM10gJiAoMHg4MCA+PiAoY29sICUgOCkpID8gMHgwMSA6IDB4MDA7CiAgICAgICB9IGJyZWFrOwogICAgICAgY2FzZSA0OiB7Ci0gICAgICAgIGZvciAoaW50MzJfdCBjb2wgPSAwOyBjb2wgPCBibXBfcHRyLT53aWR0aDsgY29sKyspIHsKLSAgICAgICAgICAqcm93X2J1ZisrID0gKGNvbCAmIDB4MDEpID8gKGRlc19idWZbY29sID4+IDFdICYgMHgwRikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKChkZXNfYnVmW2NvbCA+PiAxXSAmIDB4RjApID4+IDQpOworICAgICAgICBmb3IgKHVpbnQzMl90IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyArK2NvbCkgeworICAgICAgICAgIG91dF9yb3dfYnVmZmVyW2lkeCsrXSA9IChjb2wgJiAweDAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChkZXNfYnVmW2NvbCA+PiAxXSAmIDB4MEYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKChkZXNfYnVmW2NvbCA+PiAxXSAmIDB4RjApID4+IDQpOwogICAgICAgICB9CiAgICAgICB9IGJyZWFrOwogICAgICAgY2FzZSAxNjogewpAQCAtMzQ2LDE1ICszNjYsMTIgQEAKICAgICAgICAgdWludDhfdCBncmVlbl9iaXRzID0gMDsKICAgICAgICAgdWludDhfdCByZWRfYml0cyA9IDA7CiAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDE2OyBpKyspIHsKLSAgICAgICAgICBpZiAoKGJtcF9wdHItPm1hc2tfYmx1ZSA+PiBpKSAmIDB4MDEpIHsKKyAgICAgICAgICBpZiAoKG1hc2tfYmx1ZSA+PiBpKSAmIDB4MDEpCiAgICAgICAgICAgICBibHVlX2JpdHMrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKChibXBfcHRyLT5tYXNrX2dyZWVuID4+IGkpICYgMHgwMSkgeworICAgICAgICAgIGlmICgobWFza19ncmVlbiA+PiBpKSAmIDB4MDEpCiAgICAgICAgICAgICBncmVlbl9iaXRzKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICgoYm1wX3B0ci0+bWFza19yZWQgPj4gaSkgJiAweDAxKSB7CisgICAgICAgICAgaWYgKChtYXNrX3JlZCA+PiBpKSAmIDB4MDEpCiAgICAgICAgICAgICByZWRfYml0cysrOwotICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBncmVlbl9iaXRzICs9IGJsdWVfYml0czsKICAgICAgICAgcmVkX2JpdHMgKz0gZ3JlZW5fYml0czsKQEAgLTM2Myw1NzcgKzM4MCwyOTIgQEAKICAgICAgICAgYmx1ZV9iaXRzID0gOCAtIGJsdWVfYml0czsKICAgICAgICAgZ3JlZW5fYml0cyAtPSA4OwogICAgICAgICByZWRfYml0cyAtPSA4OwotICAgICAgICBmb3IgKGludDMyX3QgY29sID0gMDsgY29sIDwgYm1wX3B0ci0+d2lkdGg7IGNvbCsrKSB7Ci0gICAgICAgICAgKmJ1ZiA9IEdldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKWJ1Zik7Ci0gICAgICAgICAgKnJvd19idWYrKyA9ICh1aW50OF90KSgoKmJ1ZiAmIGJtcF9wdHItPm1hc2tfYmx1ZSkgPDwgYmx1ZV9iaXRzKTsKLSAgICAgICAgICAqcm93X2J1ZisrID0gKHVpbnQ4X3QpKCgqYnVmICYgYm1wX3B0ci0+bWFza19ncmVlbikgPj4gZ3JlZW5fYml0cyk7Ci0gICAgICAgICAgKnJvd19idWYrKyA9ICh1aW50OF90KSgoKmJ1ZisrICYgYm1wX3B0ci0+bWFza19yZWQpID4+IHJlZF9iaXRzKTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgKytjb2wpIHsKKyAgICAgICAgICAqYnVmID0gRlhXT1JEX0dFVF9MU0JGSVJTVChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihidWYpKTsKKyAgICAgICAgICBvdXRfcm93X2J1ZmZlcltpZHgrK10gPQorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PigoKmJ1ZiAmIG1hc2tfYmx1ZSkgPDwgYmx1ZV9iaXRzKTsKKyAgICAgICAgICBvdXRfcm93X2J1ZmZlcltpZHgrK10gPQorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PigoKmJ1ZiAmIG1hc2tfZ3JlZW4pID4+IGdyZWVuX2JpdHMpOworICAgICAgICAgIG91dF9yb3dfYnVmZmVyW2lkeCsrXSA9CisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KCgqYnVmKysgJiBtYXNrX3JlZCkgPj4gcmVkX2JpdHMpOwogICAgICAgICB9CiAgICAgICB9IGJyZWFrOwogICAgICAgY2FzZSA4OgogICAgICAgY2FzZSAyNDoKICAgICAgIGNhc2UgMzI6Ci0gICAgICAgIEZYU1lTX21lbWNweShibXBfcHRyLT5vdXRfcm93X2J1ZmZlciwgZGVzX2J1ZiwgYm1wX3B0ci0+c3JjX3Jvd19ieXRlcyk7CisgICAgICAgIHN0ZDo6Y29weShkZXNfYnVmLCBkZXNfYnVmICsgc3JjX3Jvd19ieXRlcywgb3V0X3Jvd19idWZmZXIuYmVnaW4oKSk7CisgICAgICAgIGlkeCArPSBzcmNfcm93X2J5dGVzOwogICAgICAgICBicmVhazsKICAgICB9Ci0gICAgcm93X2J1ZiA9IGJtcF9wdHItPm91dF9yb3dfYnVmZmVyOwotICAgIGJtcF9wdHItPmJtcF9nZXRfcm93X2ZuKGJtcF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+aW1nVEJfZmxhZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJtcF9wdHItPnJvd19udW0rKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChibXBfcHRyLT5oZWlnaHQgLSAxIC0gYm1wX3B0ci0+cm93X251bSsrKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBibXBfcHRyLT5vdXRfcm93X2J1ZmZlcik7CisgICAgZm9yICh1aW50OF90IGJ5dGUgOiBvdXRfcm93X2J1ZmZlcikgeworICAgICAgaWYgKCFWYWxpZGF0ZUNvbG9ySW5kZXgoYnl0ZSkpCisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBSZWFkU2NhbmxpbmUoaW1nVEJfZmxhZyA/IHJvd19udW0rKyA6IChoZWlnaHQgLSAxIC0gcm93X251bSsrKSwKKyAgICAgICAgICAgICAgICAgb3V0X3Jvd19idWZmZXIpOwogICB9Ci0gIGJtcF9zYXZlX2RlY29kaW5nX3N0YXR1cyhibXBfcHRyLCBCTVBfRF9TVEFUVVNfVEFJTCk7CisgIFNhdmVEZWNvZGluZ1N0YXR1cyhCTVBfRF9TVEFUVVNfVEFJTCk7CiAgIHJldHVybiAxOwogfQotaW50MzJfdCBibXBfZGVjb2RlX3JsZTgoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cikgeworCitpbnQzMl90IEJNUERlY29tcHJlc3Nvcjo6RGVjb2RlUkxFOCgpIHsKICAgdWludDhfdCogZmlyc3RfYnl0ZV9wdHIgPSBudWxscHRyOwogICB1aW50OF90KiBzZWNvbmRfYnl0ZV9wdHIgPSBudWxscHRyOwotICBibXBfcHRyLT5jb2xfbnVtID0gMDsKKyAgY29sX251bSA9IDA7CiAgIHdoaWxlICh0cnVlKSB7Ci0gICAgdWludDMyX3Qgc2tpcF9zaXplX29yZyA9IGJtcF9wdHItPnNraXBfc2l6ZTsKLSAgICBpZiAoIWJtcF9yZWFkX2RhdGEoYm1wX3B0ciwgJmZpcnN0X2J5dGVfcHRyLCAxKSkKKyAgICB1aW50MzJfdCBza2lwX3NpemVfb3JnID0gc2tpcF9zaXplOworICAgIGlmICghUmVhZERhdGEoJmZpcnN0X2J5dGVfcHRyLCAxKSkKICAgICAgIHJldHVybiAyOwogCiAgICAgc3dpdGNoICgqZmlyc3RfYnl0ZV9wdHIpIHsKICAgICAgIGNhc2UgUkxFX01BUktFUjogewotICAgICAgICBpZiAoIWJtcF9yZWFkX2RhdGEoYm1wX3B0ciwgJmZpcnN0X2J5dGVfcHRyLCAxKSkgewotICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7CisgICAgICAgIGlmICghUmVhZERhdGEoJmZpcnN0X2J5dGVfcHRyLCAxKSkgeworICAgICAgICAgIHNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7CiAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgIH0KICAgICAgICAgc3dpdGNoICgqZmlyc3RfYnl0ZV9wdHIpIHsKICAgICAgICAgICBjYXNlIFJMRV9FT0w6IHsKLSAgICAgICAgICAgIGlmIChibXBfcHRyLT5yb3dfbnVtID49IGJtcF9wdHItPmhlaWdodCkgewotICAgICAgICAgICAgICBibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX3B0ciwgQk1QX0RfU1RBVFVTX1RBSUwpOwotICAgICAgICAgICAgICBibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0Iik7Ci0gICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgaWYgKHJvd19udW0gPj0gaGVpZ2h0KSB7CisgICAgICAgICAgICAgIFNhdmVEZWNvZGluZ1N0YXR1cyhCTVBfRF9TVEFUVVNfVEFJTCk7CisgICAgICAgICAgICAgIEVycm9yKCk7CisgICAgICAgICAgICAgIE5PVFJFQUNIRUQoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJtcF9wdHItPmJtcF9nZXRfcm93X2ZuKAotICAgICAgICAgICAgICAgIGJtcF9wdHIsIGJtcF9wdHItPmltZ1RCX2ZsYWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibXBfcHRyLT5yb3dfbnVtKysKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoYm1wX3B0ci0+aGVpZ2h0IC0gMSAtIGJtcF9wdHItPnJvd19udW0rKyksCi0gICAgICAgICAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIpOwotICAgICAgICAgICAgYm1wX3B0ci0+Y29sX251bSA9IDA7Ci0gICAgICAgICAgICBGWFNZU19tZW1zZXQoYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIsIDAsIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMpOwotICAgICAgICAgICAgYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19EQVRBKTsKKyAgICAgICAgICAgIFJlYWRTY2FubGluZShpbWdUQl9mbGFnID8gcm93X251bSsrIDogKGhlaWdodCAtIDEgLSByb3dfbnVtKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9yb3dfYnVmZmVyKTsKKyAgICAgICAgICAgIGNvbF9udW0gPSAwOworICAgICAgICAgICAgc3RkOjpmaWxsKG91dF9yb3dfYnVmZmVyLmJlZ2luKCksIG91dF9yb3dfYnVmZmVyLmVuZCgpLCAwKTsKKyAgICAgICAgICAgIFNhdmVEZWNvZGluZ1N0YXR1cyhCTVBfRF9TVEFUVVNfREFUQSk7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICB9CiAgICAgICAgICAgY2FzZSBSTEVfRU9JOiB7Ci0gICAgICAgICAgICBpZiAoYm1wX3B0ci0+cm93X251bSA8IGJtcF9wdHItPmhlaWdodCkgewotICAgICAgICAgICAgICBibXBfcHRyLT5ibXBfZ2V0X3Jvd19mbigKLSAgICAgICAgICAgICAgICAgIGJtcF9wdHIsIGJtcF9wdHItPmltZ1RCX2ZsYWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJtcF9wdHItPnJvd19udW0rKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGJtcF9wdHItPmhlaWdodCAtIDEgLSBibXBfcHRyLT5yb3dfbnVtKyspLAotICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIpOworICAgICAgICAgICAgaWYgKHJvd19udW0gPCBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgUmVhZFNjYW5saW5lKGltZ1RCX2ZsYWcgPyByb3dfbnVtKysgOiAoaGVpZ2h0IC0gMSAtIHJvd19udW0rKyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfcm93X2J1ZmZlcik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX3B0ciwgQk1QX0RfU1RBVFVTX1RBSUwpOworICAgICAgICAgICAgU2F2ZURlY29kaW5nU3RhdHVzKEJNUF9EX1NUQVRVU19UQUlMKTsKICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgIH0KICAgICAgICAgICBjYXNlIFJMRV9ERUxUQTogewogICAgICAgICAgICAgdWludDhfdCogZGVsdGFfcHRyOwotICAgICAgICAgICAgaWYgKCFibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZkZWx0YV9wdHIsIDIpKSB7Ci0gICAgICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7CisgICAgICAgICAgICBpZiAoIVJlYWREYXRhKCZkZWx0YV9wdHIsIDIpKSB7CisgICAgICAgICAgICAgIHNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7CiAgICAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYm1wX3B0ci0+Y29sX251bSArPSAoaW50MzJfdClkZWx0YV9wdHJbMF07Ci0gICAgICAgICAgICBpbnQzMl90IGJtcF9yb3dfbnVtX25leHQgPSBibXBfcHRyLT5yb3dfbnVtICsgKGludDMyX3QpZGVsdGFfcHRyWzFdOwotICAgICAgICAgICAgaWYgKGJtcF9wdHItPmNvbF9udW0gPj0gYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyB8fAotICAgICAgICAgICAgICAgIGJtcF9yb3dfbnVtX25leHQgPj0gYm1wX3B0ci0+aGVpZ2h0KSB7Ci0gICAgICAgICAgICAgIGJtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJtcCBGaWxlIElzIENvcnJ1cHQgT3IgTm90IFN1cHBvcnRlZCIpOwotICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGNvbF9udW0gKz0gZGVsdGFfcHRyWzBdOworICAgICAgICAgICAgc2l6ZV90IGJtcF9yb3dfbnVtX25leHQgPSByb3dfbnVtICsgZGVsdGFfcHRyWzFdOworICAgICAgICAgICAgaWYgKGNvbF9udW0gPj0gb3V0X3Jvd19ieXRlcyB8fCBibXBfcm93X251bV9uZXh0ID49IGhlaWdodCkgeworICAgICAgICAgICAgICBFcnJvcigpOworICAgICAgICAgICAgICBOT1RSRUFDSEVEKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoYm1wX3B0ci0+cm93X251bSA8IGJtcF9yb3dfbnVtX25leHQpIHsKLSAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0KGJtcF9wdHItPm91dF9yb3dfYnVmZmVyLCAwLCBibXBfcHRyLT5vdXRfcm93X2J5dGVzKTsKLSAgICAgICAgICAgICAgYm1wX3B0ci0+Ym1wX2dldF9yb3dfZm4oCi0gICAgICAgICAgICAgICAgICBibXBfcHRyLCBibXBfcHRyLT5pbWdUQl9mbGFnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibXBfcHRyLT5yb3dfbnVtKysKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChibXBfcHRyLT5oZWlnaHQgLSAxIC0gYm1wX3B0ci0+cm93X251bSsrKSwKLSAgICAgICAgICAgICAgICAgIGJtcF9wdHItPm91dF9yb3dfYnVmZmVyKTsKKyAgICAgICAgICAgIHdoaWxlIChyb3dfbnVtIDwgYm1wX3Jvd19udW1fbmV4dCkgeworICAgICAgICAgICAgICBzdGQ6OmZpbGwob3V0X3Jvd19idWZmZXIuYmVnaW4oKSwgb3V0X3Jvd19idWZmZXIuZW5kKCksIDApOworICAgICAgICAgICAgICBSZWFkU2NhbmxpbmUoaW1nVEJfZmxhZyA/IHJvd19udW0rKyA6IChoZWlnaHQgLSAxIC0gcm93X251bSsrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9yb3dfYnVmZmVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIGlmICgoaW50MzJfdCkoKmZpcnN0X2J5dGVfcHRyKSA+Ci0gICAgICAgICAgICAgICAgYm1wX3B0ci0+c3JjX3Jvd19ieXRlcyAtIGJtcF9wdHItPmNvbF9udW0pIHsKLSAgICAgICAgICAgICAgYm1wX2Vycm9yKGJtcF9wdHIsICJUaGUgQm1wIEZpbGUgSXMgQ29ycnVwdCIpOwotICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGludDMyX3QgYXZhaWxfc2l6ZSA9IG91dF9yb3dfYnl0ZXMgLSBjb2xfbnVtOworICAgICAgICAgICAgaWYgKCFhdmFpbF9zaXplIHx8CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oKmZpcnN0X2J5dGVfcHRyKSA+IGF2YWlsX3NpemUpIHsKKyAgICAgICAgICAgICAgRXJyb3IoKTsKKyAgICAgICAgICAgICAgTk9UUkVBQ0hFRCgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZzZWNvbmRfYnl0ZV9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZpcnN0X2J5dGVfcHRyICYgMSA/ICpmaXJzdF9ieXRlX3B0ciArIDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKmZpcnN0X2J5dGVfcHRyKSkgewotICAgICAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOworICAgICAgICAgICAgaWYgKCFSZWFkRGF0YSgmc2Vjb25kX2J5dGVfcHRyLCAqZmlyc3RfYnl0ZV9wdHIgJiAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICpmaXJzdF9ieXRlX3B0ciArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKmZpcnN0X2J5dGVfcHRyKSkgeworICAgICAgICAgICAgICBza2lwX3NpemUgPSBza2lwX3NpemVfb3JnOwogICAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYU1lTX21lbWNweShibXBfcHRyLT5vdXRfcm93X2J1ZmZlciArIGJtcF9wdHItPmNvbF9udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX2J5dGVfcHRyLCAqZmlyc3RfYnl0ZV9wdHIpOwotICAgICAgICAgICAgYm1wX3B0ci0+Y29sX251bSArPSAoaW50MzJfdCkoKmZpcnN0X2J5dGVfcHRyKTsKKyAgICAgICAgICAgIHN0ZDo6Y29weShzZWNvbmRfYnl0ZV9wdHIsIHNlY29uZF9ieXRlX3B0ciArICpmaXJzdF9ieXRlX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRfcm93X2J1ZmZlci5iZWdpbigpICsgY29sX251bSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gY29sX251bTsgaSA8IGNvbF9udW0gKyAqZmlyc3RfYnl0ZV9wdHI7ICsraSkgeworICAgICAgICAgICAgICBpZiAoIVZhbGlkYXRlQ29sb3JJbmRleChvdXRfcm93X2J1ZmZlcltpXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2xfbnVtICs9ICpmaXJzdF9ieXRlX3B0cjsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0gYnJlYWs7CiAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgIGlmICghYm1wX3JlYWRfZGF0YShibXBfcHRyLCAmc2Vjb25kX2J5dGVfcHRyLCAxKSkgewotICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7CisgICAgICAgIGludDMyX3QgYXZhaWxfc2l6ZSA9IG91dF9yb3dfYnl0ZXMgLSBjb2xfbnVtOworICAgICAgICBpZiAoIWF2YWlsX3NpemUgfHwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oKmZpcnN0X2J5dGVfcHRyKSA+IGF2YWlsX3NpemUpIHsKKyAgICAgICAgICBFcnJvcigpOworICAgICAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIVJlYWREYXRhKCZzZWNvbmRfYnl0ZV9wdHIsIDEpKSB7CisgICAgICAgICAgc2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsKICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICAgfQotICAgICAgICBpZiAoKGludDMyX3QpKCpmaXJzdF9ieXRlX3B0cikgPgotICAgICAgICAgICAgYm1wX3B0ci0+c3JjX3Jvd19ieXRlcyAtIGJtcF9wdHItPmNvbF9udW0pIHsKLSAgICAgICAgICBibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0Iik7CisgICAgICAgIHN0ZDo6ZmlsbChvdXRfcm93X2J1ZmZlci5iZWdpbigpICsgY29sX251bSwKKyAgICAgICAgICAgICAgICAgIG91dF9yb3dfYnVmZmVyLmJlZ2luKCkgKyBjb2xfbnVtICsgKmZpcnN0X2J5dGVfcHRyLAorICAgICAgICAgICAgICAgICAgKnNlY29uZF9ieXRlX3B0cik7CisgICAgICAgIGlmICghVmFsaWRhdGVDb2xvckluZGV4KG91dF9yb3dfYnVmZmVyW2NvbF9udW1dKSkKICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBGWFNZU19tZW1zZXQoYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIgKyBibXBfcHRyLT5jb2xfbnVtLAotICAgICAgICAgICAgICAgICAgICAgKnNlY29uZF9ieXRlX3B0ciwgKmZpcnN0X2J5dGVfcHRyKTsKLSAgICAgICAgYm1wX3B0ci0+Y29sX251bSArPSAoaW50MzJfdCkoKmZpcnN0X2J5dGVfcHRyKTsKKyAgICAgICAgY29sX251bSArPSAqZmlyc3RfYnl0ZV9wdHI7CiAgICAgICB9CiAgICAgfQogICB9Ci0gIGJtcF9lcnJvcihibXBfcHRyLCAiQW55IFVuY29udHJvbCBFcnJvciIpOwotICByZXR1cm4gMDsKKyAgRXJyb3IoKTsKKyAgTk9UUkVBQ0hFRCgpOwogfQotaW50MzJfdCBibXBfZGVjb2RlX3JsZTQoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cikgeworCitpbnQzMl90IEJNUERlY29tcHJlc3Nvcjo6RGVjb2RlUkxFNCgpIHsKICAgdWludDhfdCogZmlyc3RfYnl0ZV9wdHIgPSBudWxscHRyOwogICB1aW50OF90KiBzZWNvbmRfYnl0ZV9wdHIgPSBudWxscHRyOwotICBibXBfcHRyLT5jb2xfbnVtID0gMDsKKyAgY29sX251bSA9IDA7CiAgIHdoaWxlICh0cnVlKSB7Ci0gICAgdWludDMyX3Qgc2tpcF9zaXplX29yZyA9IGJtcF9wdHItPnNraXBfc2l6ZTsKLSAgICBpZiAoIWJtcF9yZWFkX2RhdGEoYm1wX3B0ciwgJmZpcnN0X2J5dGVfcHRyLCAxKSkKKyAgICB1aW50MzJfdCBza2lwX3NpemVfb3JnID0gc2tpcF9zaXplOworICAgIGlmICghUmVhZERhdGEoJmZpcnN0X2J5dGVfcHRyLCAxKSkKICAgICAgIHJldHVybiAyOwogCiAgICAgc3dpdGNoICgqZmlyc3RfYnl0ZV9wdHIpIHsKICAgICAgIGNhc2UgUkxFX01BUktFUjogewotICAgICAgICBpZiAoIWJtcF9yZWFkX2RhdGEoYm1wX3B0ciwgJmZpcnN0X2J5dGVfcHRyLCAxKSkgewotICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7CisgICAgICAgIGlmICghUmVhZERhdGEoJmZpcnN0X2J5dGVfcHRyLCAxKSkgeworICAgICAgICAgIHNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7CiAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgIH0KICAgICAgICAgc3dpdGNoICgqZmlyc3RfYnl0ZV9wdHIpIHsKICAgICAgICAgICBjYXNlIFJMRV9FT0w6IHsKLSAgICAgICAgICAgIGlmIChibXBfcHRyLT5yb3dfbnVtID49IGJtcF9wdHItPmhlaWdodCkgewotICAgICAgICAgICAgICBibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX3B0ciwgQk1QX0RfU1RBVFVTX1RBSUwpOwotICAgICAgICAgICAgICBibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0Iik7Ci0gICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgaWYgKHJvd19udW0gPj0gaGVpZ2h0KSB7CisgICAgICAgICAgICAgIFNhdmVEZWNvZGluZ1N0YXR1cyhCTVBfRF9TVEFUVVNfVEFJTCk7CisgICAgICAgICAgICAgIEVycm9yKCk7CisgICAgICAgICAgICAgIE5PVFJFQUNIRUQoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJtcF9wdHItPmJtcF9nZXRfcm93X2ZuKAotICAgICAgICAgICAgICAgIGJtcF9wdHIsIGJtcF9wdHItPmltZ1RCX2ZsYWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibXBfcHRyLT5yb3dfbnVtKysKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoYm1wX3B0ci0+aGVpZ2h0IC0gMSAtIGJtcF9wdHItPnJvd19udW0rKyksCi0gICAgICAgICAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIpOwotICAgICAgICAgICAgYm1wX3B0ci0+Y29sX251bSA9IDA7Ci0gICAgICAgICAgICBGWFNZU19tZW1zZXQoYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIsIDAsIGJtcF9wdHItPm91dF9yb3dfYnl0ZXMpOwotICAgICAgICAgICAgYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9wdHIsIEJNUF9EX1NUQVRVU19EQVRBKTsKKyAgICAgICAgICAgIFJlYWRTY2FubGluZShpbWdUQl9mbGFnID8gcm93X251bSsrIDogKGhlaWdodCAtIDEgLSByb3dfbnVtKyspLAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9yb3dfYnVmZmVyKTsKKyAgICAgICAgICAgIGNvbF9udW0gPSAwOworICAgICAgICAgICAgc3RkOjpmaWxsKG91dF9yb3dfYnVmZmVyLmJlZ2luKCksIG91dF9yb3dfYnVmZmVyLmVuZCgpLCAwKTsKKyAgICAgICAgICAgIFNhdmVEZWNvZGluZ1N0YXR1cyhCTVBfRF9TVEFUVVNfREFUQSk7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICB9CiAgICAgICAgICAgY2FzZSBSTEVfRU9JOiB7Ci0gICAgICAgICAgICBpZiAoYm1wX3B0ci0+cm93X251bSA8IGJtcF9wdHItPmhlaWdodCkgewotICAgICAgICAgICAgICBibXBfcHRyLT5ibXBfZ2V0X3Jvd19mbigKLSAgICAgICAgICAgICAgICAgIGJtcF9wdHIsIGJtcF9wdHItPmltZ1RCX2ZsYWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJtcF9wdHItPnJvd19udW0rKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGJtcF9wdHItPmhlaWdodCAtIDEgLSBibXBfcHRyLT5yb3dfbnVtKyspLAotICAgICAgICAgICAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIpOworICAgICAgICAgICAgaWYgKHJvd19udW0gPCBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgUmVhZFNjYW5saW5lKGltZ1RCX2ZsYWcgPyByb3dfbnVtKysgOiAoaGVpZ2h0IC0gMSAtIHJvd19udW0rKyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfcm93X2J1ZmZlcik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX3B0ciwgQk1QX0RfU1RBVFVTX1RBSUwpOworICAgICAgICAgICAgU2F2ZURlY29kaW5nU3RhdHVzKEJNUF9EX1NUQVRVU19UQUlMKTsKICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgIH0KICAgICAgICAgICBjYXNlIFJMRV9ERUxUQTogewogICAgICAgICAgICAgdWludDhfdCogZGVsdGFfcHRyOwotICAgICAgICAgICAgaWYgKCFibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZkZWx0YV9wdHIsIDIpKSB7Ci0gICAgICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7CisgICAgICAgICAgICBpZiAoIVJlYWREYXRhKCZkZWx0YV9wdHIsIDIpKSB7CisgICAgICAgICAgICAgIHNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7CiAgICAgICAgICAgICAgIHJldHVybiAyOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYm1wX3B0ci0+Y29sX251bSArPSAoaW50MzJfdClkZWx0YV9wdHJbMF07Ci0gICAgICAgICAgICBpbnQzMl90IGJtcF9yb3dfbnVtX25leHQgPSBibXBfcHRyLT5yb3dfbnVtICsgKGludDMyX3QpZGVsdGFfcHRyWzFdOwotICAgICAgICAgICAgaWYgKGJtcF9wdHItPmNvbF9udW0gPj0gYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyB8fAotICAgICAgICAgICAgICAgIGJtcF9yb3dfbnVtX25leHQgPj0gYm1wX3B0ci0+aGVpZ2h0KSB7Ci0gICAgICAgICAgICAgIGJtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJtcCBGaWxlIElzIENvcnJ1cHQgT3IgTm90IFN1cHBvcnRlZCIpOwotICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGNvbF9udW0gKz0gZGVsdGFfcHRyWzBdOworICAgICAgICAgICAgc2l6ZV90IGJtcF9yb3dfbnVtX25leHQgPSByb3dfbnVtICsgZGVsdGFfcHRyWzFdOworICAgICAgICAgICAgaWYgKGNvbF9udW0gPj0gb3V0X3Jvd19ieXRlcyB8fCBibXBfcm93X251bV9uZXh0ID49IGhlaWdodCkgeworICAgICAgICAgICAgICBFcnJvcigpOworICAgICAgICAgICAgICBOT1RSRUFDSEVEKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAoYm1wX3B0ci0+cm93X251bSA8IGJtcF9yb3dfbnVtX25leHQpIHsKLSAgICAgICAgICAgICAgRlhTWVNfbWVtc2V0KGJtcF9wdHItPm91dF9yb3dfYnVmZmVyLCAwLCBibXBfcHRyLT5vdXRfcm93X2J5dGVzKTsKLSAgICAgICAgICAgICAgYm1wX3B0ci0+Ym1wX2dldF9yb3dfZm4oCi0gICAgICAgICAgICAgICAgICBibXBfcHRyLCBibXBfcHRyLT5pbWdUQl9mbGFnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibXBfcHRyLT5yb3dfbnVtKysKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChibXBfcHRyLT5oZWlnaHQgLSAxIC0gYm1wX3B0ci0+cm93X251bSsrKSwKLSAgICAgICAgICAgICAgICAgIGJtcF9wdHItPm91dF9yb3dfYnVmZmVyKTsKKyAgICAgICAgICAgIHdoaWxlIChyb3dfbnVtIDwgYm1wX3Jvd19udW1fbmV4dCkgeworICAgICAgICAgICAgICBzdGQ6OmZpbGwob3V0X3Jvd19idWZmZXIuYmVnaW4oKSwgb3V0X3Jvd19idWZmZXIuZW5kKCksIDApOworICAgICAgICAgICAgICBSZWFkU2NhbmxpbmUoaW1nVEJfZmxhZyA/IHJvd19udW0rKyA6IChoZWlnaHQgLSAxIC0gcm93X251bSsrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9yb3dfYnVmZmVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICAgIHVpbnQ4X3Qgc2l6ZSA9ICh1aW50OF90KSgoKHVpbnQxNl90KSgqZmlyc3RfYnl0ZV9wdHIpICsgMSkgPj4gMSk7Ci0gICAgICAgICAgICBpZiAoKGludDMyX3QpKmZpcnN0X2J5dGVfcHRyID49Ci0gICAgICAgICAgICAgICAgYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyAtIGJtcF9wdHItPmNvbF9udW0pIHsKLSAgICAgICAgICAgICAgaWYgKHNpemUgKyAoYm1wX3B0ci0+Y29sX251bSA+PiAxKSA+IGJtcF9wdHItPnNyY19yb3dfYnl0ZXMpIHsKLSAgICAgICAgICAgICAgICBibXBfZXJyb3IoYm1wX3B0ciwgIlRoZSBCbXAgRmlsZSBJcyBDb3JydXB0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgKmZpcnN0X2J5dGVfcHRyID0gYm1wX3B0ci0+b3V0X3Jvd19ieXRlcyAtIGJtcF9wdHItPmNvbF9udW0gLSAxOworICAgICAgICAgICAgaW50MzJfdCBhdmFpbF9zaXplID0gb3V0X3Jvd19ieXRlcyAtIGNvbF9udW07CisgICAgICAgICAgICBpZiAoIWF2YWlsX3NpemUpIHsKKyAgICAgICAgICAgICAgRXJyb3IoKTsKKyAgICAgICAgICAgICAgTk9UUkVBQ0hFRCgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFibXBfcmVhZF9kYXRhKGJtcF9wdHIsICZzZWNvbmRfYnl0ZV9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAmIDEgPyBzaXplICsgMSA6IHNpemUpKSB7Ci0gICAgICAgICAgICAgIGJtcF9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7CisgICAgICAgICAgICB1aW50OF90IHNpemUgPSBIYWxmUm91bmRVcCgqZmlyc3RfYnl0ZV9wdHIpOworICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PGludDMyX3Q+KCpmaXJzdF9ieXRlX3B0cikgPiBhdmFpbF9zaXplKSB7CisgICAgICAgICAgICAgIGlmIChzaXplICsgKGNvbF9udW0gPj4gMSkgPiBzcmNfcm93X2J5dGVzKSB7CisgICAgICAgICAgICAgICAgRXJyb3IoKTsKKyAgICAgICAgICAgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgKmZpcnN0X2J5dGVfcHRyID0gYXZhaWxfc2l6ZSAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIVJlYWREYXRhKCZzZWNvbmRfYnl0ZV9wdHIsIHNpemUgJiAxID8gc2l6ZSArIDEgOiBzaXplKSkgeworICAgICAgICAgICAgICBza2lwX3NpemUgPSBza2lwX3NpemVfb3JnOwogICAgICAgICAgICAgICByZXR1cm4gMjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGZvciAodWludDhfdCBpID0gMDsgaSA8ICpmaXJzdF9ieXRlX3B0cjsgaSsrKSB7Ci0gICAgICAgICAgICAgIGlmIChpICYgMHgwMSkgewotICAgICAgICAgICAgICAgICooYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIgKyBibXBfcHRyLT5jb2xfbnVtKyspID0KLSAgICAgICAgICAgICAgICAgICAgKCpzZWNvbmRfYnl0ZV9wdHIrKyAmIDB4MEYpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICooYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIgKyBibXBfcHRyLT5jb2xfbnVtKyspID0KLSAgICAgICAgICAgICAgICAgICAgKCgqc2Vjb25kX2J5dGVfcHRyICYgMHhGMCkgPj4gNCk7Ci0gICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgdWludDhfdCBjb2xvciA9IChpICYgMHgwMSkgPyAoKnNlY29uZF9ieXRlX3B0cisrICYgMHgwRikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoKnNlY29uZF9ieXRlX3B0ciAmIDB4RjApID4+IDQ7CisgICAgICAgICAgICAgIGlmICghVmFsaWRhdGVDb2xvckluZGV4KGNvbG9yKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgICBvdXRfcm93X2J1ZmZlcltjb2xfbnVtKytdID0gY29sb3I7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9IGJyZWFrOwogICAgICAgZGVmYXVsdDogewotICAgICAgICBpZiAoIWJtcF9yZWFkX2RhdGEoYm1wX3B0ciwgJnNlY29uZF9ieXRlX3B0ciwgMSkpIHsKLSAgICAgICAgICBibXBfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOworICAgICAgICBpbnQzMl90IGF2YWlsX3NpemUgPSBvdXRfcm93X2J5dGVzIC0gY29sX251bTsKKyAgICAgICAgaWYgKCFhdmFpbF9zaXplKSB7CisgICAgICAgICAgRXJyb3IoKTsKKyAgICAgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXRpY19jYXN0PGludDMyX3Q+KCpmaXJzdF9ieXRlX3B0cikgPiBhdmFpbF9zaXplKSB7CisgICAgICAgICAgdWludDhfdCBzaXplID0gSGFsZlJvdW5kVXAoKmZpcnN0X2J5dGVfcHRyKTsKKyAgICAgICAgICBpZiAoc2l6ZSArIChjb2xfbnVtID4+IDEpID4gc3JjX3Jvd19ieXRlcykgeworICAgICAgICAgICAgRXJyb3IoKTsKKyAgICAgICAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKmZpcnN0X2J5dGVfcHRyID0gYXZhaWxfc2l6ZSAtIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFSZWFkRGF0YSgmc2Vjb25kX2J5dGVfcHRyLCAxKSkgeworICAgICAgICAgIHNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7CiAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKChpbnQzMl90KSpmaXJzdF9ieXRlX3B0ciA+Ci0gICAgICAgICAgICBibXBfcHRyLT5vdXRfcm93X2J5dGVzIC0gYm1wX3B0ci0+Y29sX251bSkgewotICAgICAgICAgIHVpbnQ4X3Qgc2l6ZSA9ICh1aW50OF90KSgoKHVpbnQxNl90KSgqZmlyc3RfYnl0ZV9wdHIpICsgMSkgPj4gMSk7Ci0gICAgICAgICAgaWYgKHNpemUgKyAoYm1wX3B0ci0+Y29sX251bSA+PiAxKSA+IGJtcF9wdHItPnNyY19yb3dfYnl0ZXMpIHsKLSAgICAgICAgICAgIGJtcF9lcnJvcihibXBfcHRyLCAiVGhlIEJtcCBGaWxlIElzIENvcnJ1cHQiKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgIH0KLSAgICAgICAgICAqZmlyc3RfYnl0ZV9wdHIgPSBibXBfcHRyLT5vdXRfcm93X2J5dGVzIC0gYm1wX3B0ci0+Y29sX251bSAtIDE7Ci0gICAgICAgIH0KICAgICAgICAgZm9yICh1aW50OF90IGkgPSAwOyBpIDwgKmZpcnN0X2J5dGVfcHRyOyBpKyspIHsKLSAgICAgICAgICBpZiAoaSAmIDB4MDEpIHsKLSAgICAgICAgICAgICooYm1wX3B0ci0+b3V0X3Jvd19idWZmZXIgKyBibXBfcHRyLT5jb2xfbnVtKyspID0KLSAgICAgICAgICAgICAgICAoKnNlY29uZF9ieXRlX3B0ciAmIDB4MEYpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqKGJtcF9wdHItPm91dF9yb3dfYnVmZmVyICsgYm1wX3B0ci0+Y29sX251bSsrKSA9Ci0gICAgICAgICAgICAgICAgKCgqc2Vjb25kX2J5dGVfcHRyICYgMHhGMCkgPj4gNCk7Ci0gICAgICAgICAgfQorICAgICAgICAgIHVpbnQ4X3Qgc2Vjb25kX2J5dGUgPSAqc2Vjb25kX2J5dGVfcHRyOworICAgICAgICAgIHNlY29uZF9ieXRlID0KKyAgICAgICAgICAgICAgaSAmIDB4MDEgPyAoc2Vjb25kX2J5dGUgJiAweDBGKSA6IChzZWNvbmRfYnl0ZSAmIDB4RjApID4+IDQ7CisgICAgICAgICAgaWYgKCFWYWxpZGF0ZUNvbG9ySW5kZXgoc2Vjb25kX2J5dGUpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgb3V0X3Jvd19idWZmZXJbY29sX251bSsrXSA9IHNlY29uZF9ieXRlOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9Ci0gIGJtcF9lcnJvcihibXBfcHRyLCAiQW55IFVuY29udHJvbCBFcnJvciIpOwotICByZXR1cm4gMDsKKyAgRXJyb3IoKTsKKyAgTk9UUkVBQ0hFRCgpOwogfQotdWludDhfdCogYm1wX3JlYWRfZGF0YShibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogZGVzX2J1Zl9wcCwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9zaXplKSB7Ci0gIGlmICghYm1wX3B0ciB8fCBibXBfcHRyLT5hdmFpbF9pbiA8IGJtcF9wdHItPnNraXBfc2l6ZSArIGRhdGFfc2l6ZSkKKwordWludDhfdCogQk1QRGVjb21wcmVzc29yOjpSZWFkRGF0YSh1aW50OF90KiogZGVzX2J1ZiwgdWludDMyX3QgZGF0YV9zaXplKSB7CisgIGlmIChhdmFpbF9pbiA8IHNraXBfc2l6ZSArIGRhdGFfc2l6ZSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAotICAqZGVzX2J1Zl9wcCA9IGJtcF9wdHItPm5leHRfaW4gKyBibXBfcHRyLT5za2lwX3NpemU7Ci0gIGJtcF9wdHItPnNraXBfc2l6ZSArPSBkYXRhX3NpemU7Ci0gIHJldHVybiAqZGVzX2J1Zl9wcDsKLX0KLXZvaWQgYm1wX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsIGludDMyX3Qgc3RhdHVzKSB7Ci0gIGJtcF9wdHItPmRlY29kZV9zdGF0dXMgPSBzdGF0dXM7Ci0gIGJtcF9wdHItPm5leHRfaW4gKz0gYm1wX3B0ci0+c2tpcF9zaXplOwotICBibXBfcHRyLT5hdmFpbF9pbiAtPSBibXBfcHRyLT5za2lwX3NpemU7Ci0gIGJtcF9wdHItPnNraXBfc2l6ZSA9IDA7Ci19Ci12b2lkIGJtcF9pbnB1dF9idWZmZXIoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfYnVmLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNyY19zaXplKSB7Ci0gIGJtcF9wdHItPm5leHRfaW4gPSBzcmNfYnVmOwotICBibXBfcHRyLT5hdmFpbF9pbiA9IHNyY19zaXplOwotICBibXBfcHRyLT5za2lwX3NpemUgPSAwOwotfQotdWludDMyX3QgYm1wX2dldF9hdmFpbF9pbnB1dChibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogYXZhaWxfYnVmX3B0cikgewotICBpZiAoYXZhaWxfYnVmX3B0cikgewotICAgICphdmFpbF9idWZfcHRyID0gbnVsbHB0cjsKLSAgICBpZiAoYm1wX3B0ci0+YXZhaWxfaW4gPiAwKSB7Ci0gICAgICAqYXZhaWxfYnVmX3B0ciA9IGJtcF9wdHItPm5leHRfaW47Ci0gICAgfQotICB9Ci0gIHJldHVybiBibXBfcHRyLT5hdmFpbF9pbjsKLX0KLWJtcF9jb21wcmVzc19zdHJ1Y3RfcCBibXBfY3JlYXRlX2NvbXByZXNzKCkgewotICBibXBfY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cjsKLSAgYm1wX3B0ciA9IEZYX0FsbG9jKGJtcF9jb21wcmVzc19zdHJ1Y3QsIDEpOwotICBpZiAoYm1wX3B0cikgewotICAgIEZYU1lTX21lbXNldChibXBfcHRyLCAwLCBzaXplb2YoYm1wX2NvbXByZXNzX3N0cnVjdCkpOwotICB9Ci0gIHJldHVybiBibXBfcHRyOwotfQotdm9pZCBibXBfZGVzdHJveV9jb21wcmVzcyhibXBfY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cikgewotICBpZiAoYm1wX3B0cikgewotICAgIGlmIChibXBfcHRyLT5zcmNfZnJlZSAmJiBibXBfcHRyLT5zcmNfYnVmKSB7Ci0gICAgICBGWF9GcmVlKGJtcF9wdHItPnNyY19idWYpOwotICAgIH0KLSAgICBGWF9GcmVlKGJtcF9wdHIpOwotICB9Ci19Ci1zdGF0aWMgdm9pZCBXcml0ZUZpbGVIZWFkZXIoQm1wRmlsZUhlYWRlclB0ciBoZWFkX3B0ciwgdWludDhfdCogZHN0X2J1ZikgewotICB1aW50MzJfdCBvZmZzZXQ7Ci0gIG9mZnNldCA9IDA7Ci0gIFNldFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaGVhZF9wdHItPmJmVHlwZSk7Ci0gIG9mZnNldCArPSAyOwotICBTZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBoZWFkX3B0ci0+YmZTaXplKTsKLSAgb2Zmc2V0ICs9IDQ7Ci0gIFNldFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaGVhZF9wdHItPmJmUmVzZXJ2ZWQxKTsKLSAgb2Zmc2V0ICs9IDI7Ci0gIFNldFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaGVhZF9wdHItPmJmUmVzZXJ2ZWQyKTsKLSAgb2Zmc2V0ICs9IDI7Ci0gIFNldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW29mZnNldF0sIGhlYWRfcHRyLT5iZk9mZkJpdHMpOwotICBvZmZzZXQgKz0gNDsKLX0KLXN0YXRpYyB2b2lkIFdyaXRlSW5mb0hlYWRlcihCbXBJbmZvSGVhZGVyUHRyIGluZm9faGVhZF9wdHIsIHVpbnQ4X3QqIGRzdF9idWYpIHsKLSAgdWludDMyX3Qgb2Zmc2V0OwotICBvZmZzZXQgPSBzaXplb2YoQm1wRmlsZUhlYWRlcik7Ci0gIFNldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW29mZnNldF0sIGluZm9faGVhZF9wdHItPmJpU2l6ZSk7Ci0gIG9mZnNldCArPSA0OwotICBTZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBpbmZvX2hlYWRfcHRyLT5iaVdpZHRoKTsKLSAgb2Zmc2V0ICs9IDQ7Ci0gIFNldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW29mZnNldF0sIGluZm9faGVhZF9wdHItPmJpSGVpZ2h0KTsKLSAgb2Zmc2V0ICs9IDQ7Ci0gIFNldFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaW5mb19oZWFkX3B0ci0+YmlQbGFuZXMpOwotICBvZmZzZXQgKz0gMjsKLSAgU2V0V29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBpbmZvX2hlYWRfcHRyLT5iaUJpdENvdW50KTsKLSAgb2Zmc2V0ICs9IDI7Ci0gIFNldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW29mZnNldF0sIGluZm9faGVhZF9wdHItPmJpQ29tcHJlc3Npb24pOwotICBvZmZzZXQgKz0gNDsKLSAgU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaW5mb19oZWFkX3B0ci0+YmlTaXplSW1hZ2UpOwotICBvZmZzZXQgKz0gNDsKLSAgU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaW5mb19oZWFkX3B0ci0+YmlYUGVsc1Blck1ldGVyKTsKLSAgb2Zmc2V0ICs9IDQ7Ci0gIFNldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW29mZnNldF0sIGluZm9faGVhZF9wdHItPmJpWVBlbHNQZXJNZXRlcik7Ci0gIG9mZnNldCArPSA0OwotICBTZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1ZltvZmZzZXRdLCBpbmZvX2hlYWRfcHRyLT5iaUNsclVzZWQpOwotICBvZmZzZXQgKz0gNDsKLSAgU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbb2Zmc2V0XSwgaW5mb19oZWFkX3B0ci0+YmlDbHJJbXBvcnRhbnQpOwotICBvZmZzZXQgKz0gNDsKLX0KLXN0YXRpYyB2b2lkIGJtcF9lbmNvZGVfYml0ZmllbGRzKGJtcF9jb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRzdF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgZHN0X3NpemUpIHsKLSAgaWYgKGJtcF9wdHItPmluZm9faGVhZGVyLmJpQml0Q291bnQgIT0gMTYgJiYKLSAgICAgIGJtcF9wdHItPmluZm9faGVhZGVyLmJpQml0Q291bnQgIT0gMzIpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgdWludDMyX3Qgc2l6ZSwgZHN0X3BvcywgaTsKLSAgc2l6ZSA9IGJtcF9wdHItPnNyY19waXRjaCAqIGJtcF9wdHItPnNyY19yb3cgKgotICAgICAgICAgYm1wX3B0ci0+aW5mb19oZWFkZXIuYmlCaXRDb3VudCAvIDE2OwotICBkc3RfcG9zID0gYm1wX3B0ci0+ZmlsZV9oZWFkZXIuYmZPZmZCaXRzOwotICBkc3Rfc2l6ZSArPSBzaXplOwotICBkc3RfYnVmID0gRlhfUmVhbGxvYyh1aW50OF90LCBkc3RfYnVmLCBkc3Rfc2l6ZSk7Ci0gIEZYU1lTX21lbXNldCgmZHN0X2J1Zltkc3RfcG9zXSwgMCwgc2l6ZSk7Ci0gIHVpbnQzMl90IG1hc2tfcmVkOwotICB1aW50MzJfdCBtYXNrX2dyZWVuOwotICB1aW50MzJfdCBtYXNrX2JsdWU7Ci0gIG1hc2tfcmVkID0gMHg3QzAwOwotICBtYXNrX2dyZWVuID0gMHgwM0UwOwotICBtYXNrX2JsdWUgPSAweDAwMUY7Ci0gIGlmIChibXBfcHRyLT5pbmZvX2hlYWRlci5iaUNvbXByZXNzaW9uID09IEJNUF9CSVRGSUVMRFMpIHsKLSAgICBpZiAoYm1wX3B0ci0+Yml0X3R5cGUgPT0gQk1QX0JJVF81NjUpIHsKLSAgICAgIG1hc2tfcmVkID0gMHhGODAwOwotICAgICAgbWFza19ncmVlbiA9IDB4MDdFMDsKLSAgICAgIG1hc2tfYmx1ZSA9IDB4MDAxRjsKLSAgICB9Ci0gICAgaWYgKGJtcF9wdHItPmluZm9faGVhZGVyLmJpQml0Q291bnQgPT0gMzIpIHsKLSAgICAgIG1hc2tfcmVkID0gMHhGRjAwMDA7Ci0gICAgICBtYXNrX2dyZWVuID0gMHgwMEZGMDA7Ci0gICAgICBtYXNrX2JsdWUgPSAweDAwMDBGRjsKLSAgICB9Ci0gICAgU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbZHN0X3Bvc10sIG1hc2tfcmVkKTsKLSAgICBkc3RfcG9zICs9IDQ7Ci0gICAgU2V0RFdvcmRfTFNCRmlyc3QoJmRzdF9idWZbZHN0X3Bvc10sIG1hc2tfZ3JlZW4pOwotICAgIGRzdF9wb3MgKz0gNDsKLSAgICBTZXREV29yZF9MU0JGaXJzdCgmZHN0X2J1Zltkc3RfcG9zXSwgbWFza19ibHVlKTsKLSAgICBkc3RfcG9zICs9IDQ7Ci0gICAgYm1wX3B0ci0+ZmlsZV9oZWFkZXIuYmZPZmZCaXRzID0gZHN0X3BvczsKLSAgfQotICB1aW50OF90IGJsdWVfYml0cyA9IDA7Ci0gIHVpbnQ4X3QgZ3JlZW5fYml0cyA9IDA7Ci0gIHVpbnQ4X3QgcmVkX2JpdHMgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgYm1wX3B0ci0+aW5mb19oZWFkZXIuYmlCaXRDb3VudDsgaSsrKSB7Ci0gICAgaWYgKChtYXNrX2JsdWUgPj4gaSkgJiAweDAxKSB7Ci0gICAgICBibHVlX2JpdHMrKzsKLSAgICB9Ci0gICAgaWYgKChtYXNrX2dyZWVuID4+IGkpICYgMHgwMSkgewotICAgICAgZ3JlZW5fYml0cysrOwotICAgIH0KLSAgICBpZiAoKG1hc2tfcmVkID4+IGkpICYgMHgwMSkgewotICAgICAgcmVkX2JpdHMrKzsKLSAgICB9Ci0gIH0KLSAgZ3JlZW5fYml0cyArPSBibHVlX2JpdHM7Ci0gIHJlZF9iaXRzICs9IGdyZWVuX2JpdHM7Ci0gIGJsdWVfYml0cyA9IDggLSBibHVlX2JpdHM7Ci0gIGdyZWVuX2JpdHMgLT0gODsKLSAgcmVkX2JpdHMgLT0gODsKLSAgaSA9IDA7Ci0gIGZvciAoaW50MzJfdCByb3dfbnVtID0gYm1wX3B0ci0+c3JjX3JvdyAtIDE7IHJvd19udW0gPiAtMTsgcm93X251bS0tLCBpID0gMCkgewotICAgIHdoaWxlIChpIDwgYm1wX3B0ci0+c3JjX3dpZHRoICogYm1wX3B0ci0+c3JjX2JwcCAvIDgpIHsKLSAgICAgIHVpbnQ4X3QgYiA9IGJtcF9wdHItPnNyY19idWZbcm93X251bSAqIGJtcF9wdHItPnNyY19waXRjaCArIGkrK107Ci0gICAgICB1aW50OF90IGcgPSBibXBfcHRyLT5zcmNfYnVmW3Jvd19udW0gKiBibXBfcHRyLT5zcmNfcGl0Y2ggKyBpKytdOwotICAgICAgdWludDhfdCByID0gYm1wX3B0ci0+c3JjX2J1Zltyb3dfbnVtICogYm1wX3B0ci0+c3JjX3BpdGNoICsgaSsrXTsKLSAgICAgIGlmIChibXBfcHRyLT5zcmNfYnBwID09IDMyKSB7Ci0gICAgICAgIGkrKzsKLSAgICAgIH0KLSAgICAgIHVpbnQzMl90IHBpeF92YWwgPSAwOwotICAgICAgcGl4X3ZhbCB8PSAoYiA+PiBibHVlX2JpdHMpICYgbWFza19ibHVlOwotICAgICAgcGl4X3ZhbCB8PSAoZyA8PCBncmVlbl9iaXRzKSAmIG1hc2tfZ3JlZW47Ci0gICAgICBwaXhfdmFsIHw9IChyIDw8IHJlZF9iaXRzKSAmIG1hc2tfcmVkOwotICAgICAgaWYgKGJtcF9wdHItPmluZm9faGVhZGVyLmJpQml0Q291bnQgPT0gMTYpIHsKLSAgICAgICAgU2V0V29yZF9MU0JGaXJzdCgmZHN0X2J1Zltkc3RfcG9zXSwgcGl4X3ZhbCk7Ci0gICAgICAgIGRzdF9wb3MgKz0gMjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFNldERXb3JkX0xTQkZpcnN0KCZkc3RfYnVmW2RzdF9wb3NdLCBwaXhfdmFsKTsKLSAgICAgICAgZHN0X3BvcyArPSA0OwotICAgICAgfQotICAgIH0KLSAgfQotICBkc3Rfc2l6ZSA9IGRzdF9wb3M7CisgICpkZXNfYnVmID0gbmV4dF9pbiArIHNraXBfc2l6ZTsKKyAgc2tpcF9zaXplICs9IGRhdGFfc2l6ZTsKKyAgcmV0dXJuICpkZXNfYnVmOwogfQogCi1zdGF0aWMgdm9pZCBibXBfZW5jb2RlX3JnYihibXBfY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIGRzdF9zaXplKSB7Ci0gIGlmIChibXBfcHRyLT5pbmZvX2hlYWRlci5iaUJpdENvdW50ID09IDE2KSB7Ci0gICAgYm1wX2VuY29kZV9iaXRmaWVsZHMoYm1wX3B0ciwgZHN0X2J1ZiwgZHN0X3NpemUpOwordm9pZCBCTVBEZWNvbXByZXNzb3I6OlNhdmVEZWNvZGluZ1N0YXR1cyhpbnQzMl90IHN0YXR1cykgeworICBkZWNvZGVfc3RhdHVzID0gc3RhdHVzOworICBuZXh0X2luICs9IHNraXBfc2l6ZTsKKyAgYXZhaWxfaW4gLT0gc2tpcF9zaXplOworICBza2lwX3NpemUgPSAwOworfQorCit2b2lkIEJNUERlY29tcHJlc3Nvcjo6U2V0SW5wdXRCdWZmZXIodWludDhfdCogc3JjX2J1ZiwgdWludDMyX3Qgc3JjX3NpemUpIHsKKyAgbmV4dF9pbiA9IHNyY19idWY7CisgIGF2YWlsX2luID0gc3JjX3NpemU7CisgIHNraXBfc2l6ZSA9IDA7Cit9CisKK3VpbnQzMl90IEJNUERlY29tcHJlc3Nvcjo6R2V0QXZhaWxJbnB1dCh1aW50OF90KiogYXZhaWxfYnVmKSB7CisgIGlmIChhdmFpbF9idWYpIHsKKyAgICAqYXZhaWxfYnVmID0gbnVsbHB0cjsKKyAgICBpZiAoYXZhaWxfaW4gPiAwKQorICAgICAgKmF2YWlsX2J1ZiA9IG5leHRfaW47CisgIH0KKyAgcmV0dXJuIGF2YWlsX2luOworfQorCit2b2lkIEJNUERlY29tcHJlc3Nvcjo6U2V0SGVpZ2h0KGludDMyX3Qgc2lnbmVkX2hlaWdodCkgeworICBpZiAoc2lnbmVkX2hlaWdodCA+PSAwKSB7CisgICAgaGVpZ2h0ID0gc2lnbmVkX2hlaWdodDsKICAgICByZXR1cm47CiAgIH0KLSAgdWludDMyX3Qgc2l6ZSwgZHN0X3BvczsKLSAgdWludDMyX3QgZHN0X3BpdGNoID0KLSAgICAgIChibXBfcHRyLT5zcmNfd2lkdGggKiBibXBfcHRyLT5pbmZvX2hlYWRlci5iaUJpdENvdW50ICsgMzEpIC8gMzIgKiA0OwotICBzaXplID0gZHN0X3BpdGNoICogYm1wX3B0ci0+c3JjX3JvdzsKLSAgZHN0X3BvcyA9IGJtcF9wdHItPmZpbGVfaGVhZGVyLmJmT2ZmQml0czsKLSAgZHN0X3NpemUgKz0gc2l6ZTsKLSAgZHN0X2J1ZiA9IEZYX1JlYWxsb2ModWludDhfdCwgZHN0X2J1ZiwgZHN0X3NpemUpOwotICBGWFNZU19tZW1zZXQoJmRzdF9idWZbZHN0X3Bvc10sIDAsIHNpemUpOwotICBmb3IgKGludDMyX3Qgcm93X251bSA9IGJtcF9wdHItPnNyY19yb3cgLSAxOyByb3dfbnVtID4gLTE7IHJvd19udW0tLSkgewotICAgIEZYU1lTX21lbWNweSgmZHN0X2J1Zltkc3RfcG9zXSwKLSAgICAgICAgICAgICAgICAgJmJtcF9wdHItPnNyY19idWZbcm93X251bSAqIGJtcF9wdHItPnNyY19waXRjaF0sCi0gICAgICAgICAgICAgICAgIGJtcF9wdHItPnNyY19waXRjaCk7Ci0gICAgZHN0X3BvcyArPSBkc3RfcGl0Y2g7CisgIGlmIChzaWduZWRfaGVpZ2h0ID09IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCkpIHsKKyAgICBFcnJvcigpOworICAgIE5PVFJFQUNIRUQoKTsKICAgfQotICBkc3Rfc2l6ZSA9IGRzdF9wb3M7Ci19Ci1zdGF0aWMgdWludDhfdCBibXBfcmxlOF9zZWFyY2goY29uc3QgdWludDhfdCogYnVmLCBpbnQzMl90IGxlbikgewotICB1aW50OF90IG51bTsKLSAgbnVtID0gMTsKLSAgd2hpbGUgKG51bSA8IGxlbikgewotICAgIGlmIChidWZbbnVtIC0gMV0gIT0gYnVmW251bV0gfHwgbnVtID09IDB4RkYpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBudW0rKzsKLSAgfQotICByZXR1cm4gbnVtOwotfQotc3RhdGljIHZvaWQgYm1wX2VuY29kZV9ybGU4KGJtcF9jb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBkc3Rfc2l6ZSkgewotICB1aW50MzJfdCBzaXplLCBkc3RfcG9zLCBpbmRleDsKLSAgdWludDhfdCBybGVbMl0gPSB7MH07Ci0gIHNpemUgPSBibXBfcHRyLT5zcmNfcGl0Y2ggKiBibXBfcHRyLT5zcmNfcm93ICogMjsKLSAgZHN0X3BvcyA9IGJtcF9wdHItPmZpbGVfaGVhZGVyLmJmT2ZmQml0czsKLSAgZHN0X3NpemUgKz0gc2l6ZTsKLSAgZHN0X2J1ZiA9IEZYX1JlYWxsb2ModWludDhfdCwgZHN0X2J1ZiwgZHN0X3NpemUpOwotICBGWFNZU19tZW1zZXQoJmRzdF9idWZbZHN0X3Bvc10sIDAsIHNpemUpOwotICBmb3IgKGludDMyX3Qgcm93X251bSA9IGJtcF9wdHItPnNyY19yb3cgLSAxLCBpID0gMDsgcm93X251bSA+IC0xOykgewotICAgIGluZGV4ID0gcm93X251bSAqIGJtcF9wdHItPnNyY19waXRjaDsKLSAgICBybGVbMF0gPSBibXBfcmxlOF9zZWFyY2goJmJtcF9wdHItPnNyY19idWZbaW5kZXggKyBpXSwgc2l6ZSAtIGluZGV4IC0gaSk7Ci0gICAgcmxlWzFdID0gYm1wX3B0ci0+c3JjX2J1ZltpbmRleCArIGldOwotICAgIGlmIChpICsgcmxlWzBdID49IChpbnQzMl90KWJtcF9wdHItPnNyY19waXRjaCkgewotICAgICAgcmxlWzBdID0gdWludDhfdChibXBfcHRyLT5zcmNfcGl0Y2ggLSBpKTsKLSAgICAgIGlmIChybGVbMF0pIHsKLSAgICAgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gcmxlWzBdOwotICAgICAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBybGVbMV07Ci0gICAgICB9Ci0gICAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBSTEVfTUFSS0VSOwotICAgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gUkxFX0VPTDsKLSAgICAgIGkgPSAwOwotICAgICAgcm93X251bS0tOwotICAgIH0gZWxzZSB7Ci0gICAgICBpICs9IHJsZVswXTsKLSAgICAgIGRzdF9idWZbZHN0X3BvcysrXSA9IHJsZVswXTsKLSAgICAgIGRzdF9idWZbZHN0X3BvcysrXSA9IHJsZVsxXTsKLSAgICB9Ci0gIH0KLSAgZHN0X2J1Zltkc3RfcG9zKytdID0gUkxFX01BUktFUjsKLSAgZHN0X2J1Zltkc3RfcG9zKytdID0gUkxFX0VPSTsKLSAgZHN0X3NpemUgPSBkc3RfcG9zOwotfQotc3RhdGljIHVpbnQ4X3QgYm1wX3JsZTRfc2VhcmNoKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgaW50MzJfdCBsZW4pIHsKLSAgdWludDhfdCBudW07Ci0gIG51bSA9IDI7Ci0gIHdoaWxlIChudW0gPCBsZW4pIHsKLSAgICBpZiAoYnVmW251bSAtIDJdICE9IGJ1ZltudW1dIHx8IG51bSA9PSAweEZGKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgbnVtKys7Ci0gIH0KLSAgcmV0dXJuIG51bTsKLX0KLXN0YXRpYyB2b2lkIGJtcF9lbmNvZGVfcmxlNChibXBfY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZHN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgZHN0X3NpemUpIHsKLSAgdWludDMyX3Qgc2l6ZSwgZHN0X3BvcywgaW5kZXg7Ci0gIHVpbnQ4X3QgcmxlWzJdID0gezB9OwotICBzaXplID0gYm1wX3B0ci0+c3JjX3BpdGNoICogYm1wX3B0ci0+c3JjX3JvdzsKLSAgZHN0X3BvcyA9IGJtcF9wdHItPmZpbGVfaGVhZGVyLmJmT2ZmQml0czsKLSAgZHN0X3NpemUgKz0gc2l6ZTsKLSAgZHN0X2J1ZiA9IEZYX1JlYWxsb2ModWludDhfdCwgZHN0X2J1ZiwgZHN0X3NpemUpOwotICBGWFNZU19tZW1zZXQoJmRzdF9idWZbZHN0X3Bvc10sIDAsIHNpemUpOwotICBmb3IgKGludDMyX3Qgcm93X251bSA9IGJtcF9wdHItPnNyY19yb3cgLSAxLCBpID0gMDsgcm93X251bSA+IC0xOwotICAgICAgIHJsZVsxXSA9IDApIHsKLSAgICBpbmRleCA9IHJvd19udW0gKiBibXBfcHRyLT5zcmNfcGl0Y2g7Ci0gICAgcmxlWzBdID0gYm1wX3JsZTRfc2VhcmNoKCZibXBfcHRyLT5zcmNfYnVmW2luZGV4ICsgaV0sIHNpemUgLSBpbmRleCAtIGkpOwotICAgIHJsZVsxXSB8PSAoYm1wX3B0ci0+c3JjX2J1ZltpbmRleCArIGldICYgMHgwZikgPDwgNDsKLSAgICBybGVbMV0gfD0gYm1wX3B0ci0+c3JjX2J1ZltpbmRleCArIGkgKyAxXSAmIDB4MGY7Ci0gICAgaWYgKGkgKyBybGVbMF0gPj0gKGludDMyX3QpYm1wX3B0ci0+c3JjX3BpdGNoKSB7Ci0gICAgICBybGVbMF0gPSB1aW50OF90KGJtcF9wdHItPnNyY19waXRjaCAtIGkpOwotICAgICAgaWYgKHJsZVswXSkgewotICAgICAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBybGVbMF07Ci0gICAgICAgIGRzdF9idWZbZHN0X3BvcysrXSA9IHJsZVsxXTsKLSAgICAgIH0KLSAgICAgIGRzdF9idWZbZHN0X3BvcysrXSA9IFJMRV9NQVJLRVI7Ci0gICAgICBkc3RfYnVmW2RzdF9wb3MrK10gPSBSTEVfRU9MOwotICAgICAgaSA9IDA7Ci0gICAgICByb3dfbnVtLS07Ci0gICAgfSBlbHNlIHsKLSAgICAgIGkgKz0gcmxlWzBdOwotICAgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gcmxlWzBdOwotICAgICAgZHN0X2J1Zltkc3RfcG9zKytdID0gcmxlWzFdOwotICAgIH0KLSAgfQotICBkc3RfYnVmW2RzdF9wb3MrK10gPSBSTEVfTUFSS0VSOwotICBkc3RfYnVmW2RzdF9wb3MrK10gPSBSTEVfRU9JOwotICBkc3Rfc2l6ZSA9IGRzdF9wb3M7Ci19Ci1ib29sIGJtcF9lbmNvZGVfaW1hZ2UoYm1wX2NvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRzdF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIGRzdF9zaXplKSB7Ci0gIHVpbnQzMl90IGhlYWRfc2l6ZSA9IHNpemVvZihCbXBGaWxlSGVhZGVyKSArIHNpemVvZihCbXBJbmZvSGVhZGVyKTsKLSAgdWludDMyX3QgcGFsX3NpemUgPSBzaXplb2YodWludDMyX3QpICogYm1wX3B0ci0+cGFsX251bTsKLSAgaWYgKGJtcF9wdHItPmluZm9faGVhZGVyLmJpQ2xyVXNlZCA+IDAgJiYKLSAgICAgIGJtcF9wdHItPmluZm9faGVhZGVyLmJpQ2xyVXNlZCA8IGJtcF9wdHItPnBhbF9udW0pIHsKLSAgICBwYWxfc2l6ZSA9IHNpemVvZih1aW50MzJfdCkgKiBibXBfcHRyLT5pbmZvX2hlYWRlci5iaUNsclVzZWQ7Ci0gIH0KLSAgZHN0X3NpemUgPSBoZWFkX3NpemUgKyBzaXplb2YodWludDMyX3QpICogYm1wX3B0ci0+cGFsX251bTsKLSAgZHN0X2J1ZiA9IEZYX1RyeUFsbG9jKHVpbnQ4X3QsIGRzdF9zaXplKTsKLSAgaWYgKCFkc3RfYnVmKQotICAgIHJldHVybiBmYWxzZTsKLQotICBGWFNZU19tZW1zZXQoZHN0X2J1ZiwgMCwgZHN0X3NpemUpOwotICBibXBfcHRyLT5maWxlX2hlYWRlci5iZk9mZkJpdHMgPSBoZWFkX3NpemU7Ci0gIGlmIChibXBfcHRyLT5wYWxfcHRyICYmIHBhbF9zaXplKSB7Ci0gICAgRlhTWVNfbWVtY3B5KCZkc3RfYnVmW2hlYWRfc2l6ZV0sIGJtcF9wdHItPnBhbF9wdHIsIHBhbF9zaXplKTsKLSAgICBibXBfcHRyLT5maWxlX2hlYWRlci5iZk9mZkJpdHMgKz0gcGFsX3NpemU7Ci0gIH0KLSAgV3JpdGVJbmZvSGVhZGVyKCZibXBfcHRyLT5pbmZvX2hlYWRlciwgZHN0X2J1Zik7Ci0gIHN3aXRjaCAoYm1wX3B0ci0+aW5mb19oZWFkZXIuYmlDb21wcmVzc2lvbikgewotICAgIGNhc2UgQk1QX1JHQjoKLSAgICAgIGJtcF9lbmNvZGVfcmdiKGJtcF9wdHIsIGRzdF9idWYsIGRzdF9zaXplKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQk1QX0JJVEZJRUxEUzoKLSAgICAgIGJtcF9lbmNvZGVfYml0ZmllbGRzKGJtcF9wdHIsIGRzdF9idWYsIGRzdF9zaXplKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQk1QX1JMRTg6Ci0gICAgICBibXBfZW5jb2RlX3JsZTgoYm1wX3B0ciwgZHN0X2J1ZiwgZHN0X3NpemUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCTVBfUkxFNDoKLSAgICAgIGJtcF9lbmNvZGVfcmxlNChibXBfcHRyLCBkc3RfYnVmLCBkc3Rfc2l6ZSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLSAgYm1wX3B0ci0+ZmlsZV9oZWFkZXIuYmZTaXplID0gZHN0X3NpemU7Ci0gIFdyaXRlRmlsZUhlYWRlcigmYm1wX3B0ci0+ZmlsZV9oZWFkZXIsIGRzdF9idWYpOwotICByZXR1cm4gdHJ1ZTsKKyAgaGVpZ2h0ID0gLXNpZ25lZF9oZWlnaHQ7CisgIGltZ1RCX2ZsYWcgPSB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2xibXAvZnhfYm1wLmggYi9jb3JlL2Z4Y29kZWMvbGJtcC9meF9ibXAuaAppbmRleCAyN2EwZjE5Li45ZGZhODQ5IDEwMDY0NAotLS0gYS9jb3JlL2Z4Y29kZWMvbGJtcC9meF9ibXAuaAorKysgYi9jb3JlL2Z4Y29kZWMvbGJtcC9meF9ibXAuaApAQCAtOSw3ICs5LDEwIEBACiAKICNpbmNsdWRlIDxzZXRqbXAuaD4KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19ibXBtb2R1bGUuaCIKIAogI2RlZmluZSBCTVBfV0lEVEhCWVRFUyh3aWR0aCwgYml0Q291bnQpICgod2lkdGggKiBiaXRDb3VudCkgKyAzMSkgLyAzMiAqIDQKICNkZWZpbmUgQk1QX1BBTF9FTkNPREUoYSwgciwgZywgYikgXApAQCAtMjAsNyArMjMsNiBAQAogI2RlZmluZSBCTVBfRF9TVEFUVVNfREFUQSAweDA0CiAjZGVmaW5lIEJNUF9EX1NUQVRVU19UQUlMIDB4MDAKICNkZWZpbmUgQk1QX1NJR05BVFVSRSAweDRENDIKLSNkZWZpbmUgQk1QX1BBTF9ORVcgMAogI2RlZmluZSBCTVBfUEFMX09MRCAxCiAjZGVmaW5lIFJMRV9NQVJLRVIgMAogI2RlZmluZSBSTEVfRU9MIDAKQEAgLTMwLDkgKzMyLDggQEAKICNkZWZpbmUgQk1QX1JMRTggMUwKICNkZWZpbmUgQk1QX1JMRTQgMkwKICNkZWZpbmUgQk1QX0JJVEZJRUxEUyAzTAotI2RlZmluZSBCTVBfQklUXzU1NSAwCi0jZGVmaW5lIEJNUF9CSVRfNTY1IDEKLSNkZWZpbmUgQk1QX01BWF9FUlJPUl9TSVpFIDI1NgorLy8gTGltaXQgd2lkdGggdG8gKE1BWElOVDMyIC0gMzEpIC8gMzIKKyNkZWZpbmUgQk1QX01BWF9XSURUSCA2NzEwODg2MwogI3ByYWdtYSBwYWNrKDEpCiB0eXBlZGVmIHN0cnVjdCB0YWdCbXBGaWxlSGVhZGVyIHsKICAgdWludDE2X3QgYmZUeXBlOwpAQCAtNDAsMTQgKzQxLDE0IEBACiAgIHVpbnQxNl90IGJmUmVzZXJ2ZWQxOwogICB1aW50MTZfdCBiZlJlc2VydmVkMjsKICAgdWludDMyX3QgYmZPZmZCaXRzOwotfSBCbXBGaWxlSGVhZGVyLCAqQm1wRmlsZUhlYWRlclB0cjsKK30gQm1wRmlsZUhlYWRlcjsKIHR5cGVkZWYgc3RydWN0IHRhZ0JtcENvcmVIZWFkZXIgewogICB1aW50MzJfdCBiY1NpemU7CiAgIHVpbnQxNl90IGJjV2lkdGg7CiAgIHVpbnQxNl90IGJjSGVpZ2h0OwogICB1aW50MTZfdCBiY1BsYW5lczsKICAgdWludDE2X3QgYmNCaXRDb3VudDsKLX0gQm1wQ29yZUhlYWRlciwgKkJtcENvcmVIZWFkZXJQdHI7Cit9IEJtcENvcmVIZWFkZXI7CiB0eXBlZGVmIHN0cnVjdCB0YWdCbXBJbmZvSGVhZGVyIHsKICAgdWludDMyX3QgYmlTaXplOwogICBpbnQzMl90IGJpV2lkdGg7CkBAIC02MCw5NiArNjEsNzYgQEAKICAgaW50MzJfdCBiaVlQZWxzUGVyTWV0ZXI7CiAgIHVpbnQzMl90IGJpQ2xyVXNlZDsKICAgdWludDMyX3QgYmlDbHJJbXBvcnRhbnQ7Ci19IEJtcEluZm9IZWFkZXIsICpCbXBJbmZvSGVhZGVyUHRyOworfSBCbXBJbmZvSGVhZGVyOwogI3ByYWdtYSBwYWNrKCkKIAotdHlwZWRlZiBzdHJ1Y3QgdGFnX2JtcF9kZWNvbXByZXNzX3N0cnVjdCBibXBfZGVjb21wcmVzc19zdHJ1Y3Q7Ci10eXBlZGVmIGJtcF9kZWNvbXByZXNzX3N0cnVjdCogYm1wX2RlY29tcHJlc3Nfc3RydWN0X3A7Ci10eXBlZGVmIGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wKiBibXBfZGVjb21wcmVzc19zdHJ1Y3RfcHA7Ci1zdHJ1Y3QgdGFnX2JtcF9kZWNvbXByZXNzX3N0cnVjdCB7CitjbGFzcyBCTVBEZWNvbXByZXNzb3IgeworIHB1YmxpYzoKKyAgQk1QRGVjb21wcmVzc29yKCk7CisgIH5CTVBEZWNvbXByZXNzb3IoKTsKKworICB2b2lkIEVycm9yKCk7CisgIGludDMyX3QgRGVjb2RlSW1hZ2UoKTsKKyAgaW50MzJfdCBSZWFkSGVhZGVyKCk7CisgIHZvaWQgU2V0SW5wdXRCdWZmZXIodWludDhfdCogc3JjX2J1ZiwgdWludDMyX3Qgc3JjX3NpemUpOworICB1aW50MzJfdCBHZXRBdmFpbElucHV0KHVpbnQ4X3QqKiBhdmFpbF9idWYpOworCiAgIGptcF9idWYgam1wYnVmOwotICBGWF9DSEFSKiBlcnJfcHRyOwotICB2b2lkICgqYm1wX2Vycm9yX2ZuKShibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBjb25zdCBGWF9DSEFSKiBlcnJfbXNnKTsKIAogICB2b2lkKiBjb250ZXh0X3B0cjsKIAotICBCbXBGaWxlSGVhZGVyUHRyIGJtcF9oZWFkZXJfcHRyOwotICBCbXBJbmZvSGVhZGVyUHRyIGJtcF9pbmZvaGVhZGVyX3B0cjsKLSAgaW50MzJfdCB3aWR0aDsKLSAgaW50MzJfdCBoZWlnaHQ7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG91dF9yb3dfYnVmZmVyOworICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gcGFsZXR0ZTsKKyAgdWludDhfdCogbmV4dF9pbjsKKworICB1aW50MzJfdCBoZWFkZXJfb2Zmc2V0OworICB1aW50MzJfdCB3aWR0aDsKKyAgdWludDMyX3QgaGVpZ2h0OwogICB1aW50MzJfdCBjb21wcmVzc19mbGFnOwogICBpbnQzMl90IGNvbXBvbmVudHM7Ci0gIGludDMyX3Qgc3JjX3Jvd19ieXRlczsKLSAgaW50MzJfdCBvdXRfcm93X2J5dGVzOwotICB1aW50OF90KiBvdXRfcm93X2J1ZmZlcjsKKyAgc2l6ZV90IHNyY19yb3dfYnl0ZXM7CisgIHNpemVfdCBvdXRfcm93X2J5dGVzOwogICB1aW50MTZfdCBiaXRDb3VudHM7CiAgIHVpbnQzMl90IGNvbG9yX3VzZWQ7CiAgIGJvb2wgaW1nVEJfZmxhZzsKICAgaW50MzJfdCBwYWxfbnVtOwogICBpbnQzMl90IHBhbF90eXBlOwotICB1aW50MzJfdCogcGFsX3B0cjsKICAgdWludDMyX3QgZGF0YV9zaXplOwogICB1aW50MzJfdCBpbWdfZGF0YV9vZmZzZXQ7CiAgIHVpbnQzMl90IGltZ19pZmhfc2l6ZTsKLSAgaW50MzJfdCByb3dfbnVtOwotICBpbnQzMl90IGNvbF9udW07CisgIHNpemVfdCByb3dfbnVtOworICBzaXplX3QgY29sX251bTsKICAgaW50MzJfdCBkcGlfeDsKICAgaW50MzJfdCBkcGlfeTsKICAgdWludDMyX3QgbWFza19yZWQ7CiAgIHVpbnQzMl90IG1hc2tfZ3JlZW47CiAgIHVpbnQzMl90IG1hc2tfYmx1ZTsKIAotICBib29sICgqYm1wX2dldF9kYXRhX3Bvc2l0aW9uX2ZuKShibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjdXJfcG9zKTsKLSAgdm9pZCAoKmJtcF9nZXRfcm93X2ZuKShibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcm93X251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByb3dfYnVmKTsKLSAgdWludDhfdCogbmV4dF9pbjsKICAgdWludDMyX3QgYXZhaWxfaW47CiAgIHVpbnQzMl90IHNraXBfc2l6ZTsKICAgaW50MzJfdCBkZWNvZGVfc3RhdHVzOwotfTsKLXZvaWQgYm1wX2Vycm9yKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsIGNvbnN0IEZYX0NIQVIqIGVycl9tc2cpOwotYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX2NyZWF0ZV9kZWNvbXByZXNzKCk7Ci12b2lkIGJtcF9kZXN0cm95X2RlY29tcHJlc3MoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3BwIGJtcF9wdHJfcHRyKTsKLWludDMyX3QgYm1wX3JlYWRfaGVhZGVyKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIpOwotaW50MzJfdCBibXBfZGVjb2RlX2ltYWdlKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIpOwotaW50MzJfdCBibXBfZGVjb2RlX3JnYihibXBfZGVjb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyKTsKLWludDMyX3QgYm1wX2RlY29kZV9ybGU4KGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIpOwotaW50MzJfdCBibXBfZGVjb2RlX3JsZTQoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0cik7Ci11aW50OF90KiBibXBfcmVhZF9kYXRhKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBkZXNfYnVmX3BwLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXRhX3NpemUpOwotdm9pZCBibXBfc2F2ZV9kZWNvZGluZ19zdGF0dXMoYm1wX2RlY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwgaW50MzJfdCBzdGF0dXMpOwotdm9pZCBibXBfaW5wdXRfYnVmZmVyKGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc3JjX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc2l6ZSk7Ci11aW50MzJfdCBibXBfZ2V0X2F2YWlsX2lucHV0KGJtcF9kZWNvbXByZXNzX3N0cnVjdF9wIGJtcF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBhdmFpbF9idWZfcHRyKTsKLXR5cGVkZWYgc3RydWN0IHRhZ19ibXBfY29tcHJlc3Nfc3RydWN0IGJtcF9jb21wcmVzc19zdHJ1Y3Q7Ci10eXBlZGVmIGJtcF9jb21wcmVzc19zdHJ1Y3QqIGJtcF9jb21wcmVzc19zdHJ1Y3RfcDsKLXR5cGVkZWYgYm1wX2NvbXByZXNzX3N0cnVjdF9wKiBibXBfY29tcHJlc3Nfc3RydWN0X3BwOwotc3RydWN0IHRhZ19ibXBfY29tcHJlc3Nfc3RydWN0IHsKLSAgQm1wRmlsZUhlYWRlciBmaWxlX2hlYWRlcjsKLSAgQm1wSW5mb0hlYWRlciBpbmZvX2hlYWRlcjsKLSAgdWludDhfdCogc3JjX2J1ZjsKLSAgdWludDMyX3Qgc3JjX3BpdGNoOwotICB1aW50MzJfdCBzcmNfcm93OwotICB1aW50OF90IHNyY19icHA7Ci0gIHVpbnQzMl90IHNyY193aWR0aDsKLSAgYm9vbCBzcmNfZnJlZTsKLSAgdWludDMyX3QqIHBhbF9wdHI7Ci0gIHVpbnQxNl90IHBhbF9udW07Ci0gIHVpbnQ4X3QgYml0X3R5cGU7CisKKyBwcml2YXRlOgorICBib29sIEdldERhdGFQb3NpdGlvbih1aW50MzJfdCBjdXJfcG9zKTsKKyAgdm9pZCBSZWFkU2NhbmxpbmUodWludDMyX3Qgcm93X251bSwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHJvd19idWYpOworICBpbnQzMl90IERlY29kZVJHQigpOworICBpbnQzMl90IERlY29kZVJMRTgoKTsKKyAgaW50MzJfdCBEZWNvZGVSTEU0KCk7CisgIHVpbnQ4X3QqIFJlYWREYXRhKHVpbnQ4X3QqKiBkZXNfYnVmLCB1aW50MzJfdCBkYXRhX3NpemUpOworICB2b2lkIFNhdmVEZWNvZGluZ1N0YXR1cyhpbnQzMl90IHN0YXR1cyk7CisgIGJvb2wgVmFsaWRhdGVDb2xvckluZGV4KHVpbnQ4X3QgdmFsKTsKKyAgYm9vbCBWYWxpZGF0ZUZsYWcoKSBjb25zdDsKKyAgdm9pZCBTZXRIZWlnaHQoaW50MzJfdCBzaWduZWRfaGVpZ2h0KTsKIH07CiAKLWJtcF9jb21wcmVzc19zdHJ1Y3RfcCBibXBfY3JlYXRlX2NvbXByZXNzKCk7Ci12b2lkIGJtcF9kZXN0cm95X2NvbXByZXNzKGJtcF9jb21wcmVzc19zdHJ1Y3RfcCBibXBfcHRyKTsKLWJvb2wgYm1wX2VuY29kZV9pbWFnZShibXBfY29tcHJlc3Nfc3RydWN0X3AgYm1wX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZHN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgZHN0X3NpemUpOworY2xhc3MgQ0JtcENvbnRleHQgOiBwdWJsaWMgQ0NvZGVjX0JtcE1vZHVsZTo6Q29udGV4dCB7CisgcHVibGljOgorICBDQm1wQ29udGV4dChDQ29kZWNfQm1wTW9kdWxlKiBwTW9kdWxlLCBDQ29kZWNfQm1wTW9kdWxlOjpEZWxlZ2F0ZSogcERlbGVnYXRlKTsKKyAgfkNCbXBDb250ZXh0KCkgb3ZlcnJpZGU7CiAKLXVpbnQxNl90IEdldFdvcmRfTFNCRmlyc3QodWludDhfdCogcCk7Ci12b2lkIFNldFdvcmRfTFNCRmlyc3QodWludDhfdCogcCwgdWludDE2X3Qgdik7CisgIEJNUERlY29tcHJlc3NvciBtX0JtcDsKKyAgVW5vd25lZFB0cjxDQ29kZWNfQm1wTW9kdWxlPiBjb25zdCBtX3BNb2R1bGU7CisgIFVub3duZWRQdHI8Q0NvZGVjX0JtcE1vZHVsZTo6RGVsZWdhdGU+IGNvbnN0IG1fcERlbGVnYXRlOworfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZYQ09ERUNfTEJNUF9GWF9CTVBfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9sZ2lmL2Z4X2dpZi5jcHAgYi9jb3JlL2Z4Y29kZWMvbGdpZi9meF9naWYuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjJkYWNiLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjb2RlYy9sZ2lmL2Z4X2dpZi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9sZ2lmL2Z4X2dpZi5oIgotCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2xibXAvZnhfYm1wLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgotCi12b2lkIENHaWZMWldEZWNvZGVyOjpJbnB1dCh1aW50OF90KiBzcmNfYnVmLCB1aW50MzJfdCBzcmNfc2l6ZSkgewotICBuZXh0X2luID0gc3JjX2J1ZjsKLSAgYXZhaWxfaW4gPSBzcmNfc2l6ZTsKLX0KLQotdWludDMyX3QgQ0dpZkxaV0RlY29kZXI6OkdldEF2YWlsSW5wdXQoKSB7Ci0gIHJldHVybiBhdmFpbF9pbjsKLX0KLQotQ0dpZkxaV0RlY29kZXI6OkNHaWZMWldEZWNvZGVyKEZYX0NIQVIqIGVycm9yX3B0cikKLSAgICA6IGNvZGVfc2l6ZSgwKSwKLSAgICAgIGNvZGVfc2l6ZV9jdXIoMCksCi0gICAgICBjb2RlX2NsZWFyKDApLAotICAgICAgY29kZV9lbmQoMCksCi0gICAgICBjb2RlX25leHQoMCksCi0gICAgICBjb2RlX2ZpcnN0KDApLAotICAgICAgc3RhY2tfc2l6ZSgwKSwKLSAgICAgIGNvZGVfb2xkKDApLAotICAgICAgbmV4dF9pbihudWxscHRyKSwKLSAgICAgIGF2YWlsX2luKDApLAotICAgICAgYml0c19sZWZ0KDApLAotICAgICAgY29kZV9zdG9yZSgwKSwKLSAgICAgIGVycl9tc2dfcHRyKGVycm9yX3B0cikge30KLQotQ0dpZkxaV0RlY29kZXI6On5DR2lmTFpXRGVjb2RlcigpIHt9Ci0KLXZvaWQgQ0dpZkxaV0RlY29kZXI6OkluaXRUYWJsZSh1aW50OF90IGNvZGVfbGVuKSB7Ci0gIGNvZGVfc2l6ZSA9IGNvZGVfbGVuOwotICBBU1NFUlQoY29kZV9zaXplIDwgMzIpOwotICBjb2RlX2NsZWFyID0gMSA8PCBjb2RlX3NpemU7Ci0gIGNvZGVfZW5kID0gY29kZV9jbGVhciArIDE7Ci0gIGJpdHNfbGVmdCA9IDA7Ci0gIGNvZGVfc3RvcmUgPSAwOwotICBuZXh0X2luID0gbnVsbHB0cjsKLSAgYXZhaWxfaW4gPSAwOwotICBzdGFja19zaXplID0gMDsKLSAgY29kZV9maXJzdCA9IDA7Ci0gIENsZWFyVGFibGUoKTsKLX0KLXZvaWQgQ0dpZkxaV0RlY29kZXI6OkNsZWFyVGFibGUoKSB7Ci0gIGNvZGVfc2l6ZV9jdXIgPSBjb2RlX3NpemUgKyAxOwotICBjb2RlX25leHQgPSBjb2RlX2VuZCArIDE7Ci0gIGNvZGVfb2xkID0gKHVpbnQxNl90KS0xOwotICBGWFNZU19tZW1zZXQoY29kZV90YWJsZSwgMCwgc2l6ZW9mKHRhZ19UYWJsZSkgKiBHSUZfTUFYX0xaV19DT0RFKTsKLSAgRlhTWVNfbWVtc2V0KHN0YWNrLCAwLCBHSUZfTUFYX0xaV19DT0RFKTsKLSAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IGNvZGVfY2xlYXI7IGkrKykgewotICAgIGNvZGVfdGFibGVbaV0uc3VmZml4ID0gKHVpbnQ4X3QpaTsKLSAgfQotfQotdm9pZCBDR2lmTFpXRGVjb2Rlcjo6RGVjb2RlU3RyaW5nKHVpbnQxNl90IGNvZGUpIHsKLSAgc3RhY2tfc2l6ZSA9IDA7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgQVNTRVJUKGNvZGUgPD0gY29kZV9uZXh0KTsKLSAgICBpZiAoY29kZSA8IGNvZGVfY2xlYXIgfHwgY29kZSA+IGNvZGVfbmV4dCkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHN0YWNrW0dJRl9NQVhfTFpXX0NPREUgLSAxIC0gc3RhY2tfc2l6ZSsrXSA9IGNvZGVfdGFibGVbY29kZV0uc3VmZml4OwotICAgIGNvZGUgPSBjb2RlX3RhYmxlW2NvZGVdLnByZWZpeDsKLSAgfQotICBzdGFja1tHSUZfTUFYX0xaV19DT0RFIC0gMSAtIHN0YWNrX3NpemUrK10gPSAodWludDhfdCljb2RlOwotICBjb2RlX2ZpcnN0ID0gKHVpbnQ4X3QpY29kZTsKLX0KLXZvaWQgQ0dpZkxaV0RlY29kZXI6OkFkZENvZGUodWludDE2X3QgcHJlZml4X2NvZGUsIHVpbnQ4X3QgYXBwZW5kX2NoYXIpIHsKLSAgaWYgKGNvZGVfbmV4dCA9PSBHSUZfTUFYX0xaV19DT0RFKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGNvZGVfdGFibGVbY29kZV9uZXh0XS5wcmVmaXggPSBwcmVmaXhfY29kZTsKLSAgY29kZV90YWJsZVtjb2RlX25leHRdLnN1ZmZpeCA9IGFwcGVuZF9jaGFyOwotICBpZiAoKytjb2RlX25leHQgPCBHSUZfTUFYX0xaV19DT0RFKSB7Ci0gICAgaWYgKGNvZGVfbmV4dCA+PiBjb2RlX3NpemVfY3VyKSB7Ci0gICAgICBjb2RlX3NpemVfY3VyKys7Ci0gICAgfQotICB9Ci19Ci1pbnQzMl90IENHaWZMWldEZWNvZGVyOjpEZWNvZGUodWludDhfdCogZGVzX2J1ZiwgdWludDMyX3QmIGRlc19zaXplKSB7Ci0gIGlmIChkZXNfc2l6ZSA9PSAwKSB7Ci0gICAgcmV0dXJuIDM7Ci0gIH0KLSAgdWludDMyX3QgaSA9IDA7Ci0gIGlmIChzdGFja19zaXplICE9IDApIHsKLSAgICBpZiAoZGVzX3NpemUgPCBzdGFja19zaXplKSB7Ci0gICAgICBGWFNZU19tZW1jcHkoZGVzX2J1ZiwgJnN0YWNrW0dJRl9NQVhfTFpXX0NPREUgLSBzdGFja19zaXplXSwgZGVzX3NpemUpOwotICAgICAgc3RhY2tfc2l6ZSAtPSAodWludDE2X3QpZGVzX3NpemU7Ci0gICAgICByZXR1cm4gMzsKLSAgICB9Ci0gICAgRlhTWVNfbWVtY3B5KGRlc19idWYsICZzdGFja1tHSUZfTUFYX0xaV19DT0RFIC0gc3RhY2tfc2l6ZV0sIHN0YWNrX3NpemUpOwotICAgIGRlc19idWYgKz0gc3RhY2tfc2l6ZTsKLSAgICBpICs9IHN0YWNrX3NpemU7Ci0gICAgc3RhY2tfc2l6ZSA9IDA7Ci0gIH0KLSAgdWludDE2X3QgY29kZSA9IDA7Ci0gIHdoaWxlIChpIDw9IGRlc19zaXplICYmIChhdmFpbF9pbiA+IDAgfHwgYml0c19sZWZ0ID49IGNvZGVfc2l6ZV9jdXIpKSB7Ci0gICAgaWYgKGNvZGVfc2l6ZV9jdXIgPiAxMikgewotICAgICAgaWYgKGVycl9tc2dfcHRyKSB7Ci0gICAgICAgIEZYU1lTX3N0cm5jcHkoZXJyX21zZ19wdHIsICJDb2RlIExlbmd0aCBPdXQgT2YgUmFuZ2UiLAotICAgICAgICAgICAgICAgICAgICAgIEdJRl9NQVhfRVJST1JfU0laRSAtIDEpOwotICAgICAgfQotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChhdmFpbF9pbiA+IDApIHsKLSAgICAgIGlmIChiaXRzX2xlZnQgPiAzMSkgewotICAgICAgICBpZiAoZXJyX21zZ19wdHIpCi0gICAgICAgICAgRlhTWVNfc3RybmNweShlcnJfbXNnX3B0ciwgIkRlY29kZSBFcnJvciIsIEdJRl9NQVhfRVJST1JfU0laRSAtIDEpOwotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8dWludDMyX3Q+IHNhZmVfY29kZSA9ICpuZXh0X2luKys7Ci0gICAgICBzYWZlX2NvZGUgPDw9IGJpdHNfbGVmdDsKLSAgICAgIHNhZmVfY29kZSB8PSBjb2RlX3N0b3JlOwotICAgICAgaWYgKCFzYWZlX2NvZGUuSXNWYWxpZCgpKSB7Ci0gICAgICAgIGlmIChlcnJfbXNnX3B0cikgewotICAgICAgICAgIEZYU1lTX3N0cm5jcHkoZXJyX21zZ19wdHIsICJDb2RlIFN0b3JlIE91dCBPZiBSYW5nZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBHSUZfTUFYX0VSUk9SX1NJWkUgLSAxKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIGNvZGVfc3RvcmUgPSBzYWZlX2NvZGUuVmFsdWVPckRpZSgpOwotICAgICAgYXZhaWxfaW4tLTsKLSAgICAgIGJpdHNfbGVmdCArPSA4OwotICAgIH0KLSAgICB3aGlsZSAoYml0c19sZWZ0ID49IGNvZGVfc2l6ZV9jdXIpIHsKLSAgICAgIGNvZGUgPSAodWludDE2X3QpY29kZV9zdG9yZSAmICgoMSA8PCBjb2RlX3NpemVfY3VyKSAtIDEpOwotICAgICAgY29kZV9zdG9yZSA+Pj0gY29kZV9zaXplX2N1cjsKLSAgICAgIGJpdHNfbGVmdCAtPSBjb2RlX3NpemVfY3VyOwotICAgICAgaWYgKGNvZGUgPT0gY29kZV9jbGVhcikgewotICAgICAgICBDbGVhclRhYmxlKCk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfSBlbHNlIGlmIChjb2RlID49IGNvZGVfZW5kKSB7Ci0gICAgICAgIGRlc19zaXplID0gaTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoY29kZV9vbGQgIT0gKHVpbnQxNl90KS0xKSB7Ci0gICAgICAgICAgaWYgKGNvZGVfbmV4dCA8IEdJRl9NQVhfTFpXX0NPREUpIHsKLSAgICAgICAgICAgIGlmIChjb2RlID09IGNvZGVfbmV4dCkgewotICAgICAgICAgICAgICBBZGRDb2RlKGNvZGVfb2xkLCBjb2RlX2ZpcnN0KTsKLSAgICAgICAgICAgICAgRGVjb2RlU3RyaW5nKGNvZGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlID4gY29kZV9uZXh0KSB7Ci0gICAgICAgICAgICAgIGlmIChlcnJfbXNnX3B0cikgewotICAgICAgICAgICAgICAgIEZYU1lTX3N0cm5jcHkoZXJyX21zZ19wdHIsICJEZWNvZGUgRXJyb3IsIE91dCBPZiBSYW5nZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSUZfTUFYX0VSUk9SX1NJWkUgLSAxKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIERlY29kZVN0cmluZyhjb2RlKTsKLSAgICAgICAgICAgICAgdWludDhfdCBhcHBlbmRfY2hhciA9IHN0YWNrW0dJRl9NQVhfTFpXX0NPREUgLSBzdGFja19zaXplXTsKLSAgICAgICAgICAgICAgQWRkQ29kZShjb2RlX29sZCwgYXBwZW5kX2NoYXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBEZWNvZGVTdHJpbmcoY29kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY29kZV9vbGQgPSBjb2RlOwotICAgICAgICBpZiAoaSArIHN0YWNrX3NpemUgPiBkZXNfc2l6ZSkgewotICAgICAgICAgIEZYU1lTX21lbWNweShkZXNfYnVmLCAmc3RhY2tbR0lGX01BWF9MWldfQ09ERSAtIHN0YWNrX3NpemVdLAotICAgICAgICAgICAgICAgICAgICAgICBkZXNfc2l6ZSAtIGkpOwotICAgICAgICAgIHN0YWNrX3NpemUgLT0gKHVpbnQxNl90KShkZXNfc2l6ZSAtIGkpOwotICAgICAgICAgIHJldHVybiAzOwotICAgICAgICB9Ci0gICAgICAgIEZYU1lTX21lbWNweShkZXNfYnVmLCAmc3RhY2tbR0lGX01BWF9MWldfQ09ERSAtIHN0YWNrX3NpemVdLAotICAgICAgICAgICAgICAgICAgICAgc3RhY2tfc2l6ZSk7Ci0gICAgICAgIGRlc19idWYgKz0gc3RhY2tfc2l6ZTsKLSAgICAgICAgaSArPSBzdGFja19zaXplOwotICAgICAgICBzdGFja19zaXplID0gMDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaWYgKGF2YWlsX2luID09IDApIHsKLSAgICBkZXNfc2l6ZSA9IGk7Ci0gICAgcmV0dXJuIDI7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci1zdGF0aWMgYm9vbCBnaWZfZ3Jvd19idWYodWludDhfdComIGRzdF9idWYsIHVpbnQzMl90JiBkc3RfbGVuLCB1aW50MzJfdCBzaXplKSB7Ci0gIGlmIChkc3RfbGVuIDwgc2l6ZSkgewotICAgIHVpbnQzMl90IGxlbl9vcmcgPSBkc3RfbGVuOwotICAgIHdoaWxlIChkc3RfYnVmICYmIGRzdF9sZW4gPCBzaXplKSB7Ci0gICAgICBkc3RfbGVuIDw8PSAxOwotICAgICAgLy8gVE9ETyh0aGVzdGlnKTogUHJvYmFibHkgc2hvdWxkIGJlIGEgdHJ5LXJlYWxsb2MgaGVyZS4KLSAgICAgIGRzdF9idWYgPSBGWF9SZWFsbG9jKHVpbnQ4X3QsIGRzdF9idWYsIGRzdF9sZW4pOwotICAgIH0KLSAgICBpZiAoIWRzdF9idWYpIHsKLSAgICAgIGRzdF9sZW4gPSBzaXplOwotICAgICAgZHN0X2J1ZiA9IEZYX1JlYWxsb2ModWludDhfdCwgZHN0X2J1ZiwgZHN0X2xlbik7Ci0gICAgfQotICAgIEZYU1lTX21lbXNldChkc3RfYnVmICsgbGVuX29yZywgMCwgZHN0X2xlbiAtIGxlbl9vcmcpOwotICAgIHJldHVybiAhIWRzdF9idWY7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgZ2lmX2N1dF9pbmRleCh1aW50OF90JiB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaW5kZXhfYml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpbmRleF9iaXRfdXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBiaXRfdXNlKSB7Ci0gIHVpbnQzMl90IGN1dCA9ICgoMSA8PCAoaW5kZXhfYml0IC0gaW5kZXhfYml0X3VzZSkpIC0gMSkgPDwgaW5kZXhfYml0X3VzZTsKLSAgdmFsIHw9ICgoaW5kZXggJiBjdXQpID4+IGluZGV4X2JpdF91c2UpIDw8IGJpdF91c2U7Ci19Ci1zdGF0aWMgaW5saW5lIHVpbnQ4X3QgZ2lmX2N1dF9idWYoY29uc3QgdWludDhfdCogYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBiaXRfY3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QmIGJpdF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIGJpdF9udW0pIHsKLSAgaWYgKGJpdF9jdXQgIT0gOCkgewotICAgIHVpbnQxNl90IGluZGV4ID0gMDsKLSAgICBpbmRleCB8PSAoKDEgPDwgYml0X2N1dCkgLSAxKSA8PCAoNyAtIGJpdF9vZmZzZXQpOwotICAgIHVpbnQ4X3QgcmV0ID0gKChpbmRleCAmIGJ1ZltvZmZzZXRdKSA+PiAoNyAtIGJpdF9vZmZzZXQpKTsKLSAgICBiaXRfb2Zmc2V0ICs9IGJpdF9jdXQ7Ci0gICAgaWYgKGJpdF9vZmZzZXQgPj0gOCkgewotICAgICAgaWYgKGJpdF9vZmZzZXQgPiA4KSB7Ci0gICAgICAgIHJldCB8PSAoKGluZGV4ICYgKGJ1ZltvZmZzZXQgKyAxXSA8PCA4KSkgPj4gOCk7Ci0gICAgICB9Ci0gICAgICBiaXRfb2Zmc2V0IC09IDg7Ci0gICAgICBvZmZzZXQrKzsKLSAgICB9Ci0gICAgYml0X251bSArPSBiaXRfY3V0OwotICAgIHJldHVybiByZXQ7Ci0gIH0KLSAgYml0X251bSArPSBiaXRfY3V0OwotICByZXR1cm4gYnVmW29mZnNldCsrXTsKLX0KLUNHaWZMWldFbmNvZGVyOjpDR2lmTFpXRW5jb2RlcigpIHsKLSAgRlhTWVNfbWVtc2V0KHRoaXMsIDAsIHNpemVvZihDR2lmTFpXRW5jb2RlcikpOwotfQotQ0dpZkxaV0VuY29kZXI6On5DR2lmTFpXRW5jb2RlcigpIHt9Ci12b2lkIENHaWZMWldFbmNvZGVyOjpDbGVhclRhYmxlKCkgewotICBpbmRleF9iaXRfY3VyID0gY29kZV9zaXplICsgMTsKLSAgaW5kZXhfbnVtID0gY29kZV9lbmQgKyAxOwotICB0YWJsZV9jdXIgPSBjb2RlX2VuZCArIDE7Ci0gIGZvciAodWludDE2X3QgaSA9IDA7IGkgPCBHSUZfTUFYX0xaV19DT0RFOyBpKyspIHsKLSAgICBjb2RlX3RhYmxlW2ldLnByZWZpeCA9IDA7Ci0gICAgY29kZV90YWJsZVtpXS5zdWZmaXggPSAwOwotICB9Ci19Ci12b2lkIENHaWZMWldFbmNvZGVyOjpTdGFydCh1aW50OF90IGNvZGVfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIG9mZnNldCkgewotICBjb2RlX3NpemUgPSBjb2RlX2xlbiArIDE7Ci0gIEFTU0VSVChjb2RlX3NpemUgPCAzMik7Ci0gIHNyY19iaXRfY3V0ID0gY29kZV9zaXplOwotICBpZiAoY29kZV9sZW4gPT0gMCkgewotICAgIHNyY19iaXRfY3V0ID0gMTsKLSAgICBjb2RlX3NpemUgPSAyOwotICB9Ci0gIGNvZGVfY2xlYXIgPSAxIDw8IGNvZGVfc2l6ZTsKLSAgY29kZV9lbmQgPSBjb2RlX2NsZWFyICsgMTsKLSAgZHN0X2J1ZltvZmZzZXQrK10gPSBjb2RlX3NpemU7Ci0gIGJpdF9vZmZzZXQgPSAwOwotICBDbGVhclRhYmxlKCk7Ci0gIHNyY19vZmZzZXQgPSAwOwotICBzcmNfYml0X29mZnNldCA9IDA7Ci0gIHNyY19iaXRfbnVtID0gMDsKLSAgY29kZV90YWJsZVtpbmRleF9udW1dLnByZWZpeCA9IGdpZl9jdXRfYnVmKHNyY19idWYsIHNyY19vZmZzZXQsIHNyY19iaXRfY3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2JpdF9vZmZzZXQsIHNyY19iaXRfbnVtKTsKLSAgY29kZV90YWJsZVtpbmRleF9udW1dLnN1ZmZpeCA9IGdpZl9jdXRfYnVmKHNyY19idWYsIHNyY19vZmZzZXQsIHNyY19iaXRfY3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2JpdF9vZmZzZXQsIHNyY19iaXRfbnVtKTsKLX0KLXZvaWQgQ0dpZkxaV0VuY29kZXI6OldyaXRlQmxvY2sodWludDhfdComIGRzdF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBkc3RfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgb2Zmc2V0KSB7Ci0gIGlmICghZ2lmX2dyb3dfYnVmKGRzdF9idWYsIGRzdF9sZW4sIG9mZnNldCArIEdJRl9EQVRBX0JMT0NLICsgMSkpIHsKLSAgICBsb25nam1wKGptcCwgMSk7Ci0gIH0KLSAgZHN0X2J1ZltvZmZzZXQrK10gPSBpbmRleF9idWZfbGVuOwotICBGWFNZU19tZW1jcHkoJmRzdF9idWZbb2Zmc2V0XSwgaW5kZXhfYnVmLCBpbmRleF9idWZfbGVuKTsKLSAgb2Zmc2V0ICs9IGluZGV4X2J1Zl9sZW47Ci0gIEZYU1lTX21lbXNldChpbmRleF9idWYsIDAsIEdJRl9EQVRBX0JMT0NLKTsKLSAgaW5kZXhfYnVmX2xlbiA9IDA7Ci19Ci12b2lkIENHaWZMWldFbmNvZGVyOjpFbmNvZGVTdHJpbmcodWludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRzdF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIGRzdF9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIG9mZnNldCkgewotICB1aW50OF90IGluZGV4X2JpdF91c2U7Ci0gIGluZGV4X2JpdF91c2UgPSAwOwotICBpZiAoaW5kZXhfYnVmX2xlbiA9PSBHSUZfREFUQV9CTE9DSykgewotICAgIFdyaXRlQmxvY2soZHN0X2J1ZiwgZHN0X2xlbiwgb2Zmc2V0KTsKLSAgfQotICBnaWZfY3V0X2luZGV4KGluZGV4X2J1ZltpbmRleF9idWZfbGVuXSwgaW5kZXgsIGluZGV4X2JpdF9jdXIsIGluZGV4X2JpdF91c2UsCi0gICAgICAgICAgICAgICAgYml0X29mZnNldCk7Ci0gIGlmIChpbmRleF9iaXRfY3VyIDw9ICg4IC0gYml0X29mZnNldCkpIHsKLSAgICBiaXRfb2Zmc2V0ICs9IGluZGV4X2JpdF9jdXI7Ci0gIH0gZWxzZSBpZiAoaW5kZXhfYml0X2N1ciA8PSAoMTYgLSBiaXRfb2Zmc2V0KSkgewotICAgIGluZGV4X2JpdF91c2UgKz0gKDggLSBiaXRfb2Zmc2V0KTsKLSAgICBiaXRfb2Zmc2V0ID0gMDsKLSAgICBpbmRleF9idWZfbGVuKys7Ci0gICAgaWYgKGluZGV4X2J1Zl9sZW4gPT0gR0lGX0RBVEFfQkxPQ0spIHsKLSAgICAgIFdyaXRlQmxvY2soZHN0X2J1ZiwgZHN0X2xlbiwgb2Zmc2V0KTsKLSAgICB9Ci0gICAgZ2lmX2N1dF9pbmRleChpbmRleF9idWZbaW5kZXhfYnVmX2xlbl0sIGluZGV4LCBpbmRleF9iaXRfY3VyLCBpbmRleF9iaXRfdXNlLAotICAgICAgICAgICAgICAgICAgYml0X29mZnNldCk7Ci0gICAgYml0X29mZnNldCA9IGluZGV4X2JpdF9jdXIgLSBpbmRleF9iaXRfdXNlOwotICB9IGVsc2UgewotICAgIGluZGV4X2JpdF91c2UgKz0gKDggLSBiaXRfb2Zmc2V0KTsKLSAgICBiaXRfb2Zmc2V0ID0gMDsKLSAgICBpbmRleF9idWZfbGVuKys7Ci0gICAgaWYgKGluZGV4X2J1Zl9sZW4gPT0gR0lGX0RBVEFfQkxPQ0spIHsKLSAgICAgIFdyaXRlQmxvY2soZHN0X2J1ZiwgZHN0X2xlbiwgb2Zmc2V0KTsKLSAgICB9Ci0gICAgZ2lmX2N1dF9pbmRleChpbmRleF9idWZbaW5kZXhfYnVmX2xlbl0sIGluZGV4LCBpbmRleF9iaXRfY3VyLCBpbmRleF9iaXRfdXNlLAotICAgICAgICAgICAgICAgICAgYml0X29mZnNldCk7Ci0gICAgaW5kZXhfYml0X3VzZSArPSA4OwotICAgIGJpdF9vZmZzZXQgPSAwOwotICAgIGluZGV4X2J1Zl9sZW4rKzsKLSAgICBpZiAoaW5kZXhfYnVmX2xlbiA9PSBHSUZfREFUQV9CTE9DSykgewotICAgICAgV3JpdGVCbG9jayhkc3RfYnVmLCBkc3RfbGVuLCBvZmZzZXQpOwotICAgIH0KLSAgICBnaWZfY3V0X2luZGV4KGluZGV4X2J1ZltpbmRleF9idWZfbGVuXSwgaW5kZXgsIGluZGV4X2JpdF9jdXIsIGluZGV4X2JpdF91c2UsCi0gICAgICAgICAgICAgICAgICBiaXRfb2Zmc2V0KTsKLSAgICBiaXRfb2Zmc2V0ID0gaW5kZXhfYml0X2N1ciAtIGluZGV4X2JpdF91c2U7Ci0gIH0KLSAgaWYgKGJpdF9vZmZzZXQgPT0gOCkgewotICAgIGJpdF9vZmZzZXQgPSAwOwotICAgIGluZGV4X2J1Zl9sZW4rKzsKLSAgICBpZiAoaW5kZXhfYnVmX2xlbiA9PSBHSUZfREFUQV9CTE9DSykgewotICAgICAgV3JpdGVCbG9jayhkc3RfYnVmLCBkc3RfbGVuLCBvZmZzZXQpOwotICAgIH0KLSAgfQotICBpZiAoaW5kZXggPT0gY29kZV9lbmQpIHsKLSAgICBpbmRleF9idWZfbGVuKys7Ci0gICAgV3JpdGVCbG9jayhkc3RfYnVmLCBkc3RfbGVuLCBvZmZzZXQpOwotICB9Ci0gIGlmIChpbmRleF9udW0rKyA+PiBpbmRleF9iaXRfY3VyKSB7Ci0gICAgaW5kZXhfYml0X2N1cisrOwotICB9Ci19Ci1ib29sIENHaWZMWldFbmNvZGVyOjpFbmNvZGUoY29uc3QgdWludDhfdCogc3JjX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBkc3RfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBvZmZzZXQpIHsKLSAgdWludDhfdCBzdWZmaXg7Ci0gIGlmIChzZXRqbXAoam1wKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB3aGlsZSAoc3JjX2JpdF9udW0gPCBzcmNfbGVuKSB7Ci0gICAgaWYgKCFMb29rVXBJblRhYmxlKHNyY19idWYsIHNyY19vZmZzZXQsIHNyY19iaXRfb2Zmc2V0KSkgewotICAgICAgRW5jb2RlU3RyaW5nKGNvZGVfdGFibGVbaW5kZXhfbnVtXS5wcmVmaXgsIGRzdF9idWYsIGRzdF9sZW4sIG9mZnNldCk7Ci0gICAgICBpZiAoaW5kZXhfbnVtID09IEdJRl9NQVhfTFpXX0NPREUpIHsKLSAgICAgICAgc3VmZml4ID0gY29kZV90YWJsZVtpbmRleF9udW0gLSAxXS5zdWZmaXg7Ci0gICAgICAgIEVuY29kZVN0cmluZyhjb2RlX2NsZWFyLCBkc3RfYnVmLCBkc3RfbGVuLCBvZmZzZXQpOwotICAgICAgICBDbGVhclRhYmxlKCk7Ci0gICAgICAgIGNvZGVfdGFibGVbaW5kZXhfbnVtXS5wcmVmaXggPSBzdWZmaXg7Ci0gICAgICAgIGNvZGVfdGFibGVbaW5kZXhfbnVtXS5zdWZmaXggPSBnaWZfY3V0X2J1ZigKLSAgICAgICAgICAgIHNyY19idWYsIHNyY19vZmZzZXQsIHNyY19iaXRfY3V0LCBzcmNfYml0X29mZnNldCwgc3JjX2JpdF9udW0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29kZV90YWJsZVtpbmRleF9udW1dLnByZWZpeCA9IGNvZGVfdGFibGVbaW5kZXhfbnVtIC0gMV0uc3VmZml4OwotICAgICAgICBjb2RlX3RhYmxlW2luZGV4X251bV0uc3VmZml4ID0gZ2lmX2N1dF9idWYoCi0gICAgICAgICAgICBzcmNfYnVmLCBzcmNfb2Zmc2V0LCBzcmNfYml0X2N1dCwgc3JjX2JpdF9vZmZzZXQsIHNyY19iaXRfbnVtKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgc3JjX29mZnNldCA9IDA7Ci0gIHNyY19iaXRfb2Zmc2V0ID0gMDsKLSAgc3JjX2JpdF9udW0gPSAwOwotICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgQ0dpZkxaV0VuY29kZXI6Okxvb2tVcEluVGFibGUoY29uc3QgdWludDhfdCogYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBvdXRfYml0X29mZnNldCkgewotICBmb3IgKHVpbnQxNl90IGkgPSB0YWJsZV9jdXI7IGkgPCBpbmRleF9udW07IGkrKykgewotICAgIGlmIChjb2RlX3RhYmxlW2ldLnByZWZpeCA9PSBjb2RlX3RhYmxlW2luZGV4X251bV0ucHJlZml4ICYmCi0gICAgICAgIGNvZGVfdGFibGVbaV0uc3VmZml4ID09IGNvZGVfdGFibGVbaW5kZXhfbnVtXS5zdWZmaXgpIHsKLSAgICAgIGNvZGVfdGFibGVbaW5kZXhfbnVtXS5wcmVmaXggPSBpOwotICAgICAgY29kZV90YWJsZVtpbmRleF9udW1dLnN1ZmZpeCA9Ci0gICAgICAgICAgZ2lmX2N1dF9idWYoYnVmLCBvZmZzZXQsIHNyY19iaXRfY3V0LCBvdXRfYml0X29mZnNldCwgc3JjX2JpdF9udW0pOwotICAgICAgdGFibGVfY3VyID0gaTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICB0YWJsZV9jdXIgPSBjb2RlX2VuZCArIDE7Ci0gIHJldHVybiBmYWxzZTsKLX0KLXZvaWQgQ0dpZkxaV0VuY29kZXI6OkZpbmlzaCh1aW50OF90KiYgZHN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgZHN0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgb2Zmc2V0KSB7Ci0gIEVuY29kZVN0cmluZyhjb2RlX3RhYmxlW2luZGV4X251bV0ucHJlZml4LCBkc3RfYnVmLCBkc3RfbGVuLCBvZmZzZXQpOwotICBFbmNvZGVTdHJpbmcoY29kZV9lbmQsIGRzdF9idWYsIGRzdF9sZW4sIG9mZnNldCk7Ci0gIGJpdF9vZmZzZXQgPSAwOwotICBDbGVhclRhYmxlKCk7Ci19Ci1naWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfY3JlYXRlX2RlY29tcHJlc3MoKSB7Ci0gIGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIgPSBGWF9BbGxvYyhnaWZfZGVjb21wcmVzc19zdHJ1Y3QsIDEpOwotICBGWFNZU19tZW1zZXQoZ2lmX3B0ciwgMCwgc2l6ZW9mKGdpZl9kZWNvbXByZXNzX3N0cnVjdCkpOwotICBnaWZfcHRyLT5kZWNvZGVfc3RhdHVzID0gR0lGX0RfU1RBVFVTX1NJRzsKLSAgZ2lmX3B0ci0+aW1nX3B0cl9hcnJfcHRyID0gbmV3IHN0ZDo6dmVjdG9yPEdpZkltYWdlKj47Ci0gIGdpZl9wdHItPmNtdF9kYXRhX3B0ciA9IG5ldyBDRlhfQnl0ZVN0cmluZzsKLSAgZ2lmX3B0ci0+cHRfcHRyX2Fycl9wdHIgPSBuZXcgc3RkOjp2ZWN0b3I8R2lmUGxhaW5UZXh0Kj47Ci0gIHJldHVybiBnaWZfcHRyOwotfQotdm9pZCBnaWZfZGVzdHJveV9kZWNvbXByZXNzKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wcCBnaWZfcHRyX3B0cikgewotICBpZiAoIWdpZl9wdHJfcHRyIHx8ICEqZ2lmX3B0cl9wdHIpCi0gICAgcmV0dXJuOwotCi0gIGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIgPSAqZ2lmX3B0cl9wdHI7Ci0gICpnaWZfcHRyX3B0ciA9IG51bGxwdHI7Ci0gIEZYX0ZyZWUoZ2lmX3B0ci0+Z2xvYmFsX3BhbF9wdHIpOwotICBkZWxldGUgZ2lmX3B0ci0+aW1nX2RlY29kZXJfcHRyOwotICBpZiAoZ2lmX3B0ci0+aW1nX3B0cl9hcnJfcHRyKSB7Ci0gICAgc2l6ZV90IHNpemVfaW1nX2FyciA9IGdpZl9wdHItPmltZ19wdHJfYXJyX3B0ci0+c2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZV9pbWdfYXJyOyBpKyspIHsKLSAgICAgIEdpZkltYWdlKiBwID0gKCpnaWZfcHRyLT5pbWdfcHRyX2Fycl9wdHIpW2ldOwotICAgICAgRlhfRnJlZShwLT5pbWFnZV9pbmZvX3B0cik7Ci0gICAgICBGWF9GcmVlKHAtPmltYWdlX2djZV9wdHIpOwotICAgICAgRlhfRnJlZShwLT5pbWFnZV9yb3dfYnVmKTsKLSAgICAgIGlmIChwLT5sb2NhbF9wYWxfcHRyICYmIHAtPmxvY2FsX3BhbF9wdHIgIT0gZ2lmX3B0ci0+Z2xvYmFsX3BhbF9wdHIpIHsKLSAgICAgICAgRlhfRnJlZShwLT5sb2NhbF9wYWxfcHRyKTsKLSAgICAgIH0KLSAgICAgIEZYX0ZyZWUocCk7Ci0gICAgfQotICAgIGdpZl9wdHItPmltZ19wdHJfYXJyX3B0ci0+Y2xlYXIoKTsKLSAgICBkZWxldGUgZ2lmX3B0ci0+aW1nX3B0cl9hcnJfcHRyOwotICB9Ci0gIGRlbGV0ZSBnaWZfcHRyLT5jbXRfZGF0YV9wdHI7Ci0gIEZYX0ZyZWUoZ2lmX3B0ci0+Z2NlX3B0cik7Ci0gIGlmIChnaWZfcHRyLT5wdF9wdHJfYXJyX3B0cikgewotICAgIHNpemVfdCBzaXplX3B0X2FyciA9IGdpZl9wdHItPnB0X3B0cl9hcnJfcHRyLT5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplX3B0X2FycjsgaSsrKSB7Ci0gICAgICBHaWZQbGFpblRleHQqIHAgPSAoKmdpZl9wdHItPnB0X3B0cl9hcnJfcHRyKVtpXTsKLSAgICAgIEZYX0ZyZWUocC0+Z2NlX3B0cik7Ci0gICAgICBGWF9GcmVlKHAtPnB0ZV9wdHIpOwotICAgICAgZGVsZXRlIHAtPnN0cmluZ19wdHI7Ci0gICAgICBGWF9GcmVlKHApOwotICAgIH0KLSAgICBnaWZfcHRyLT5wdF9wdHJfYXJyX3B0ci0+Y2xlYXIoKTsKLSAgICBkZWxldGUgZ2lmX3B0ci0+cHRfcHRyX2Fycl9wdHI7Ci0gIH0KLSAgRlhfRnJlZShnaWZfcHRyKTsKLX0KLWdpZl9jb21wcmVzc19zdHJ1Y3RfcCBnaWZfY3JlYXRlX2NvbXByZXNzKCkgewotICBnaWZfY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciA9IEZYX0FsbG9jKGdpZl9jb21wcmVzc19zdHJ1Y3QsIDEpOwotICBGWFNZU19tZW1zZXQoZ2lmX3B0ciwgMCwgc2l6ZW9mKGdpZl9jb21wcmVzc19zdHJ1Y3QpKTsKLSAgZ2lmX3B0ci0+aW1nX2VuY29kZXJfcHRyID0gbmV3IENHaWZMWldFbmNvZGVyOwotICBnaWZfcHRyLT5oZWFkZXJfcHRyID0gRlhfQWxsb2MoR2lmSGVhZGVyLCAxKTsKLSAgaWYgKCFnaWZfcHRyLT5oZWFkZXJfcHRyKSB7Ci0gICAgZGVsZXRlIChnaWZfcHRyLT5pbWdfZW5jb2Rlcl9wdHIpOwotICAgIEZYX0ZyZWUoZ2lmX3B0cik7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgRlhTWVNfbWVtY3B5KGdpZl9wdHItPmhlYWRlcl9wdHItPnNpZ25hdHVyZSwgR0lGX1NJR05BVFVSRSwgMyk7Ci0gIEZYU1lTX21lbWNweShnaWZfcHRyLT5oZWFkZXJfcHRyLT52ZXJzaW9uLCAiODlhIiwgMyk7Ci0gIGdpZl9wdHItPmxzZF9wdHIgPSBGWF9BbGxvYyhHaWZMU0QsIDEpOwotICBpZiAoIWdpZl9wdHItPmxzZF9wdHIpIHsKLSAgICBGWF9GcmVlKGdpZl9wdHItPmhlYWRlcl9wdHIpOwotICAgIGRlbGV0ZSAoZ2lmX3B0ci0+aW1nX2VuY29kZXJfcHRyKTsKLSAgICBGWF9GcmVlKGdpZl9wdHIpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIEZYU1lTX21lbXNldChnaWZfcHRyLT5sc2RfcHRyLCAwLCBzaXplb2YoR2lmTFNEKSk7Ci0gIGdpZl9wdHItPmltYWdlX2luZm9fcHRyID0gRlhfQWxsb2MoR2lmSW1hZ2VJbmZvLCAxKTsKLSAgaWYgKCFnaWZfcHRyLT5pbWFnZV9pbmZvX3B0cikgewotICAgIEZYX0ZyZWUoZ2lmX3B0ci0+bHNkX3B0cik7Ci0gICAgRlhfRnJlZShnaWZfcHRyLT5oZWFkZXJfcHRyKTsKLSAgICBkZWxldGUgKGdpZl9wdHItPmltZ19lbmNvZGVyX3B0cik7Ci0gICAgRlhfRnJlZShnaWZfcHRyKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBGWFNZU19tZW1zZXQoZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHIsIDAsIHNpemVvZihHaWZJbWFnZUluZm8pKTsKLSAgZ2lmX3B0ci0+Z2NlX3B0ciA9IEZYX0FsbG9jKEdpZkdDRSwgMSk7Ci0gIGlmICghZ2lmX3B0ci0+Z2NlX3B0cikgewotICAgIEZYX0ZyZWUoZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHIpOwotICAgIEZYX0ZyZWUoZ2lmX3B0ci0+bHNkX3B0cik7Ci0gICAgRlhfRnJlZShnaWZfcHRyLT5oZWFkZXJfcHRyKTsKLSAgICBkZWxldGUgKGdpZl9wdHItPmltZ19lbmNvZGVyX3B0cik7Ci0gICAgRlhfRnJlZShnaWZfcHRyKTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBnaWZfcHRyLT5wdGVfcHRyID0gRlhfQWxsb2MoR2lmUFRFLCAxKTsKLSAgaWYgKCFnaWZfcHRyLT5wdGVfcHRyKSB7Ci0gICAgRlhfRnJlZShnaWZfcHRyLT5nY2VfcHRyKTsKLSAgICBGWF9GcmVlKGdpZl9wdHItPmltYWdlX2luZm9fcHRyKTsKLSAgICBGWF9GcmVlKGdpZl9wdHItPmxzZF9wdHIpOwotICAgIEZYX0ZyZWUoZ2lmX3B0ci0+aGVhZGVyX3B0cik7Ci0gICAgZGVsZXRlIChnaWZfcHRyLT5pbWdfZW5jb2Rlcl9wdHIpOwotICAgIEZYX0ZyZWUoZ2lmX3B0cik7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgRlhTWVNfbWVtc2V0KGdpZl9wdHItPnB0ZV9wdHIsIDAsIHNpemVvZihHaWZQVEUpKTsKLSAgZ2lmX3B0ci0+cHRlX3B0ci0+YmxvY2tfc2l6ZSA9IDEyOwotICByZXR1cm4gZ2lmX3B0cjsKLX0KLXZvaWQgZ2lmX2Rlc3Ryb3lfY29tcHJlc3MoZ2lmX2NvbXByZXNzX3N0cnVjdF9wcCBnaWZfcHRyX3B0cikgewotICBpZiAoIWdpZl9wdHJfcHRyIHx8ICEqZ2lmX3B0cl9wdHIpCi0gICAgcmV0dXJuOwotCi0gIGdpZl9jb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyID0gKmdpZl9wdHJfcHRyOwotICAqZ2lmX3B0cl9wdHIgPSBudWxscHRyOwotICBGWF9GcmVlKGdpZl9wdHItPmhlYWRlcl9wdHIpOwotICBGWF9GcmVlKGdpZl9wdHItPmxzZF9wdHIpOwotICBGWF9GcmVlKGdpZl9wdHItPmdsb2JhbF9wYWwpOwotICBGWF9GcmVlKGdpZl9wdHItPmltYWdlX2luZm9fcHRyKTsKLSAgRlhfRnJlZShnaWZfcHRyLT5sb2NhbF9wYWwpOwotICBkZWxldGUgZ2lmX3B0ci0+aW1nX2VuY29kZXJfcHRyOwotICBGWF9GcmVlKGdpZl9wdHItPmdjZV9wdHIpOwotICBGWF9GcmVlKGdpZl9wdHItPmNtdF9kYXRhX3B0cik7Ci0gIEZYX0ZyZWUoZ2lmX3B0ci0+cHRlX3B0cik7Ci0gIEZYX0ZyZWUoZ2lmX3B0cik7Ci19Ci12b2lkIGdpZl9lcnJvcihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBjb25zdCBGWF9DSEFSKiBlcnJfbXNnKSB7Ci0gIGlmIChnaWZfcHRyICYmIGdpZl9wdHItPmdpZl9lcnJvcl9mbikgewotICAgIGdpZl9wdHItPmdpZl9lcnJvcl9mbihnaWZfcHRyLCBlcnJfbXNnKTsKLSAgfQotfQotdm9pZCBnaWZfd2FybihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBjb25zdCBGWF9DSEFSKiBlcnJfbXNnKSB7fQotaW50MzJfdCBnaWZfcmVhZF9oZWFkZXIoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0cikgewotICBpZiAoIWdpZl9wdHIpCi0gICAgcmV0dXJuIDA7Ci0KLSAgdWludDMyX3Qgc2tpcF9zaXplX29yZyA9IGdpZl9wdHItPnNraXBfc2l6ZTsKLSAgQVNTRVJUKHNpemVvZihHaWZIZWFkZXIpID09IDYpOwotICBHaWZIZWFkZXIqIGdpZl9oZWFkZXJfcHRyID0gbnVsbHB0cjsKLSAgaWYgKCFnaWZfcmVhZF9kYXRhKGdpZl9wdHIsICh1aW50OF90KiopJmdpZl9oZWFkZXJfcHRyLCA2KSkKLSAgICByZXR1cm4gMjsKLQotICBpZiAoRlhTWVNfc3RybmNtcChnaWZfaGVhZGVyX3B0ci0+c2lnbmF0dXJlLCBHSUZfU0lHTkFUVVJFLCAzKSAhPSAwIHx8Ci0gICAgICBnaWZfaGVhZGVyX3B0ci0+dmVyc2lvblswXSAhPSAnOCcgfHwgZ2lmX2hlYWRlcl9wdHItPnZlcnNpb25bMl0gIT0gJ2EnKSB7Ci0gICAgZ2lmX2Vycm9yKGdpZl9wdHIsICJOb3QgQSBHaWYgSW1hZ2UiKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBBU1NFUlQoc2l6ZW9mKEdpZkxTRCkgPT0gNyk7Ci0gIEdpZkxTRCogZ2lmX2xzZF9wdHIgPSBudWxscHRyOwotICBpZiAoIWdpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgKHVpbnQ4X3QqKikmZ2lmX2xzZF9wdHIsIDcpKSB7Ci0gICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsKLSAgICByZXR1cm4gMjsKLSAgfQotICBpZiAoKChHaWZHRiopJmdpZl9sc2RfcHRyLT5nbG9iYWxfZmxhZyktPmdsb2JhbF9wYWwpIHsKLSAgICBnaWZfcHRyLT5nbG9iYWxfcGFsX251bSA9IDIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICgoR2lmR0YqKSZnaWZfbHNkX3B0ci0+Z2xvYmFsX2ZsYWcpLT5wYWxfYml0czsKLSAgICBBU1NFUlQoc2l6ZW9mKEdpZlBhbGV0dGUpID09IDMpOwotICAgIGludDMyX3QgZ2xvYmFsX3BhbF9zaXplID0gZ2lmX3B0ci0+Z2xvYmFsX3BhbF9udW0gKiAzOwotICAgIHVpbnQ4X3QqIGdsb2JhbF9wYWxfcHRyID0gbnVsbHB0cjsKLSAgICBpZiAoIWdpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmdsb2JhbF9wYWxfcHRyLCBnbG9iYWxfcGFsX3NpemUpKSB7Ci0gICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOwotICAgICAgcmV0dXJuIDI7Ci0gICAgfQotICAgIGdpZl9wdHItPmdsb2JhbF9zb3J0X2ZsYWcgPSAoKEdpZkdGKikmZ2lmX2xzZF9wdHItPmdsb2JhbF9mbGFnKS0+c29ydF9mbGFnOwotICAgIGdpZl9wdHItPmdsb2JhbF9jb2xvcl9yZXNvbHV0aW9uID0KLSAgICAgICAgKChHaWZHRiopJmdpZl9sc2RfcHRyLT5nbG9iYWxfZmxhZyktPmNvbG9yX3Jlc29sdXRpb247Ci0gICAgRlhfRnJlZShnaWZfcHRyLT5nbG9iYWxfcGFsX3B0cik7Ci0gICAgZ2lmX3B0ci0+Z2xvYmFsX3BhbF9wdHIgPSAoR2lmUGFsZXR0ZSopRlhfQWxsb2ModWludDhfdCwgZ2xvYmFsX3BhbF9zaXplKTsKLSAgICBGWFNZU19tZW1jcHkoZ2lmX3B0ci0+Z2xvYmFsX3BhbF9wdHIsIGdsb2JhbF9wYWxfcHRyLCBnbG9iYWxfcGFsX3NpemUpOwotICB9Ci0gIGdpZl9wdHItPndpZHRoID0gKGludClHZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmZ2lmX2xzZF9wdHItPndpZHRoKTsKLSAgZ2lmX3B0ci0+aGVpZ2h0ID0gKGludClHZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmZ2lmX2xzZF9wdHItPmhlaWdodCk7Ci0gIGdpZl9wdHItPmJjX2luZGV4ID0gZ2lmX2xzZF9wdHItPmJjX2luZGV4OwotICBnaWZfcHRyLT5waXhlbF9hc3BlY3QgPSBnaWZfbHNkX3B0ci0+cGl4ZWxfYXNwZWN0OwotICByZXR1cm4gMTsKLX0KLWludDMyX3QgZ2lmX2dldF9mcmFtZShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyKSB7Ci0gIGlmICghZ2lmX3B0cikKLSAgICByZXR1cm4gMDsKLQotICBpbnQzMl90IHJldCA9IDE7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgc3dpdGNoIChnaWZfcHRyLT5kZWNvZGVfc3RhdHVzKSB7Ci0gICAgICBjYXNlIEdJRl9EX1NUQVRVU19UQUlMOgotICAgICAgICByZXR1cm4gMTsKLSAgICAgIGNhc2UgR0lGX0RfU1RBVFVTX1NJRzogewotICAgICAgICB1aW50OF90KiBzaWdfcHRyID0gbnVsbHB0cjsKLSAgICAgICAgaWYgKCFnaWZfcmVhZF9kYXRhKGdpZl9wdHIsICZzaWdfcHRyLCAxKSkKLSAgICAgICAgICByZXR1cm4gMjsKLQotICAgICAgICBzd2l0Y2ggKCpzaWdfcHRyKSB7Ci0gICAgICAgICAgY2FzZSBHSUZfU0lHX0VYVEVOU0lPTjoKLSAgICAgICAgICAgIGdpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfRVhUKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIGNhc2UgR0lGX1NJR19JTUFHRToKLSAgICAgICAgICAgIGdpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfSU1HX0lORk8pOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgY2FzZSBHSUZfU0lHX1RSQUlMRVI6Ci0gICAgICAgICAgICBnaWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX1RBSUwpOwotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlmIChnaWZfcHRyLT5hdmFpbF9pbikgewotICAgICAgICAgICAgICBnaWZfd2FybihnaWZfcHRyLCAiVGhlIEdpZiBGaWxlIGhhcyBub25fc3RhbmRhcmQgVGFnISIpOwotICAgICAgICAgICAgICBnaWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX1NJRyk7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2lmX3dhcm4oZ2lmX3B0ciwgIlRoZSBHaWYgRmlsZSBEb2Vzbid0IGhhdmUgVHJhaWxlciBUYWchIik7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2FzZSBHSUZfRF9TVEFUVVNfRVhUOiB7Ci0gICAgICAgIHVpbnQ4X3QqIGV4dF9wdHIgPSBudWxscHRyOwotICAgICAgICBpZiAoIWdpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmV4dF9wdHIsIDEpKQotICAgICAgICAgIHJldHVybiAyOwotCi0gICAgICAgIHN3aXRjaCAoKmV4dF9wdHIpIHsKLSAgICAgICAgICBjYXNlIEdJRl9CTE9DS19DRToKLSAgICAgICAgICAgIGdpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfRVhUX0NFKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIGNhc2UgR0lGX0JMT0NLX0dDRToKLSAgICAgICAgICAgIGdpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfRVhUX0dDRSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBjYXNlIEdJRl9CTE9DS19QVEU6Ci0gICAgICAgICAgICBnaWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX0VYVF9QVEUpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgaW50MzJfdCBzdGF0dXMgPSBHSUZfRF9TVEFUVVNfRVhUX1VORTsKLSAgICAgICAgICAgIGlmICgqZXh0X3B0ciA9PSBHSUZfQkxPQ0tfUFRFKSB7Ci0gICAgICAgICAgICAgIHN0YXR1cyA9IEdJRl9EX1NUQVRVU19FWFRfUFRFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIHN0YXR1cyk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhc2UgR0lGX0RfU1RBVFVTX0lNR19JTkZPOiB7Ci0gICAgICAgIHJldCA9IGdpZl9kZWNvZGVfaW1hZ2VfaW5mbyhnaWZfcHRyKTsKLSAgICAgICAgaWYgKHJldCAhPSAxKSB7Ci0gICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGNhc2UgR0lGX0RfU1RBVFVTX0lNR19EQVRBOiB7Ci0gICAgICAgIHVpbnQ4X3QqIGRhdGFfc2l6ZV9wdHIgPSBudWxscHRyOwotICAgICAgICB1aW50OF90KiBkYXRhX3B0ciA9IG51bGxwdHI7Ci0gICAgICAgIHVpbnQzMl90IHNraXBfc2l6ZV9vcmcgPSBnaWZfcHRyLT5za2lwX3NpemU7Ci0gICAgICAgIGlmICghZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9zaXplX3B0ciwgMSkpCi0gICAgICAgICAgcmV0dXJuIDI7Ci0KLSAgICAgICAgd2hpbGUgKCpkYXRhX3NpemVfcHRyICE9IEdJRl9CTE9DS19URVJNSU5BTCkgewotICAgICAgICAgIGlmICghZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9wdHIsICpkYXRhX3NpemVfcHRyKSkgewotICAgICAgICAgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsKLSAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICAgIH0KLSAgICAgICAgICBnaWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX0lNR19EQVRBKTsKLSAgICAgICAgICBza2lwX3NpemVfb3JnID0gZ2lmX3B0ci0+c2tpcF9zaXplOwotICAgICAgICAgIGlmICghZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9zaXplX3B0ciwgMSkpCi0gICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgfQotICAgICAgICBnaWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX1NJRyk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgZGVmYXVsdDogewotICAgICAgICByZXQgPSBnaWZfZGVjb2RlX2V4dGVuc2lvbihnaWZfcHRyKTsKLSAgICAgICAgaWYgKHJldCAhPSAxKSB7Ci0gICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgfQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci12b2lkIGdpZl90YWtlb3Zlcl9nY2VfcHRyKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEdpZkdDRSoqIGdjZV9wdHJfcHRyKSB7Ci0gICpnY2VfcHRyX3B0ciA9IG51bGxwdHI7Ci0gIGlmIChnaWZfcHRyLT5nY2VfcHRyICYmIGdjZV9wdHJfcHRyKSB7Ci0gICAgKmdjZV9wdHJfcHRyID0gZ2lmX3B0ci0+Z2NlX3B0cjsKLSAgICBnaWZfcHRyLT5nY2VfcHRyID0gbnVsbHB0cjsKLSAgfQotfQotaW50MzJfdCBnaWZfZGVjb2RlX2V4dGVuc2lvbihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyKSB7Ci0gIHVpbnQ4X3QqIGRhdGFfc2l6ZV9wdHIgPSBudWxscHRyOwotICB1aW50OF90KiBkYXRhX3B0ciA9IG51bGxwdHI7Ci0gIHVpbnQzMl90IHNraXBfc2l6ZV9vcmcgPSBnaWZfcHRyLT5za2lwX3NpemU7Ci0gIHN3aXRjaCAoZ2lmX3B0ci0+ZGVjb2RlX3N0YXR1cykgewotICAgIGNhc2UgR0lGX0RfU1RBVFVTX0VYVF9DRTogewotICAgICAgaWYgKCFnaWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3NpemVfcHRyLCAxKSkgewotICAgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOwotICAgICAgICByZXR1cm4gMjsKLSAgICAgIH0KLSAgICAgIGdpZl9wdHItPmNtdF9kYXRhX3B0ci0+Y2xlYXIoKTsKLSAgICAgIHdoaWxlICgqZGF0YV9zaXplX3B0ciAhPSBHSUZfQkxPQ0tfVEVSTUlOQUwpIHsKLSAgICAgICAgdWludDhfdCBkYXRhX3NpemUgPSAqZGF0YV9zaXplX3B0cjsKLSAgICAgICAgaWYgKCFnaWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3B0ciwgKmRhdGFfc2l6ZV9wdHIpIHx8Ci0gICAgICAgICAgICAhZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9zaXplX3B0ciwgMSkpIHsKLSAgICAgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOwotICAgICAgICAgIHJldHVybiAyOwotICAgICAgICB9Ci0gICAgICAgICooZ2lmX3B0ci0+Y210X2RhdGFfcHRyKSArPQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcoKGNvbnN0IEZYX0NIQVIqKWRhdGFfcHRyLCBkYXRhX3NpemUpOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBHSUZfRF9TVEFUVVNfRVhUX1BURTogewotICAgICAgQVNTRVJUKHNpemVvZihHaWZQVEUpID09IDEzKTsKLSAgICAgIEdpZlBURSogZ2lmX3B0ZV9wdHIgPSBudWxscHRyOwotICAgICAgaWYgKCFnaWZfcmVhZF9kYXRhKGdpZl9wdHIsICh1aW50OF90KiopJmdpZl9wdGVfcHRyLCAxMykpIHsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgICB9Ci0gICAgICBHaWZQbGFpblRleHQqIGdpZl9wdF9wdHIgPSBGWF9BbGxvYyhHaWZQbGFpblRleHQsIDEpOwotICAgICAgRlhTWVNfbWVtc2V0KGdpZl9wdF9wdHIsIDAsIHNpemVvZihHaWZQbGFpblRleHQpKTsKLSAgICAgIGdpZl90YWtlb3Zlcl9nY2VfcHRyKGdpZl9wdHIsICZnaWZfcHRfcHRyLT5nY2VfcHRyKTsKLSAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHIgPSBGWF9BbGxvYyhHaWZQVEUsIDEpOwotICAgICAgZ2lmX3B0X3B0ci0+c3RyaW5nX3B0ciA9IG5ldyBDRlhfQnl0ZVN0cmluZzsKLSAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHItPmJsb2NrX3NpemUgPSBnaWZfcHRlX3B0ci0+YmxvY2tfc2l6ZTsKLSAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHItPmdyaWRfbGVmdCA9Ci0gICAgICAgICAgR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmdpZl9wdGVfcHRyLT5ncmlkX2xlZnQpOwotICAgICAgZ2lmX3B0X3B0ci0+cHRlX3B0ci0+Z3JpZF90b3AgPQotICAgICAgICAgIEdldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZnaWZfcHRlX3B0ci0+Z3JpZF90b3ApOwotICAgICAgZ2lmX3B0X3B0ci0+cHRlX3B0ci0+Z3JpZF93aWR0aCA9Ci0gICAgICAgICAgR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmdpZl9wdGVfcHRyLT5ncmlkX3dpZHRoKTsKLSAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHItPmdyaWRfaGVpZ2h0ID0KLSAgICAgICAgICBHZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmZ2lmX3B0ZV9wdHItPmdyaWRfaGVpZ2h0KTsKLSAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHItPmNoYXJfd2lkdGggPSBnaWZfcHRlX3B0ci0+Y2hhcl93aWR0aDsKLSAgICAgIGdpZl9wdF9wdHItPnB0ZV9wdHItPmNoYXJfaGVpZ2h0ID0gZ2lmX3B0ZV9wdHItPmNoYXJfaGVpZ2h0OwotICAgICAgZ2lmX3B0X3B0ci0+cHRlX3B0ci0+ZmNfaW5kZXggPSBnaWZfcHRlX3B0ci0+ZmNfaW5kZXg7Ci0gICAgICBnaWZfcHRfcHRyLT5wdGVfcHRyLT5iY19pbmRleCA9IGdpZl9wdGVfcHRyLT5iY19pbmRleDsKLSAgICAgIGlmICghZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9zaXplX3B0ciwgMSkpIHsKLSAgICAgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsKLSAgICAgICAgaWYgKGdpZl9wdF9wdHIpIHsKLSAgICAgICAgICBGWF9GcmVlKGdpZl9wdF9wdHItPmdjZV9wdHIpOwotICAgICAgICAgIEZYX0ZyZWUoZ2lmX3B0X3B0ci0+cHRlX3B0cik7Ci0gICAgICAgICAgZGVsZXRlIGdpZl9wdF9wdHItPnN0cmluZ19wdHI7Ci0gICAgICAgICAgRlhfRnJlZShnaWZfcHRfcHRyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMjsKLSAgICAgIH0KLSAgICAgIHdoaWxlICgqZGF0YV9zaXplX3B0ciAhPSBHSUZfQkxPQ0tfVEVSTUlOQUwpIHsKLSAgICAgICAgdWludDhfdCBkYXRhX3NpemUgPSAqZGF0YV9zaXplX3B0cjsKLSAgICAgICAgaWYgKCFnaWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3B0ciwgKmRhdGFfc2l6ZV9wdHIpIHx8Ci0gICAgICAgICAgICAhZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9zaXplX3B0ciwgMSkpIHsKLSAgICAgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOwotICAgICAgICAgIGlmIChnaWZfcHRfcHRyKSB7Ci0gICAgICAgICAgICBGWF9GcmVlKGdpZl9wdF9wdHItPmdjZV9wdHIpOwotICAgICAgICAgICAgRlhfRnJlZShnaWZfcHRfcHRyLT5wdGVfcHRyKTsKLSAgICAgICAgICAgIGRlbGV0ZSBnaWZfcHRfcHRyLT5zdHJpbmdfcHRyOwotICAgICAgICAgICAgRlhfRnJlZShnaWZfcHRfcHRyKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgIH0KLSAgICAgICAgKihnaWZfcHRfcHRyLT5zdHJpbmdfcHRyKSArPQotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcoKGNvbnN0IEZYX0NIQVIqKWRhdGFfcHRyLCBkYXRhX3NpemUpOwotICAgICAgfQotICAgICAgZ2lmX3B0ci0+cHRfcHRyX2Fycl9wdHItPnB1c2hfYmFjayhnaWZfcHRfcHRyKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgR0lGX0RfU1RBVFVTX0VYVF9HQ0U6IHsKLSAgICAgIEFTU0VSVChzaXplb2YoR2lmR0NFKSA9PSA1KTsKLSAgICAgIEdpZkdDRSogZ2lmX2djZV9wdHIgPSBudWxscHRyOwotICAgICAgaWYgKCFnaWZfcmVhZF9kYXRhKGdpZl9wdHIsICh1aW50OF90KiopJmdpZl9nY2VfcHRyLCA2KSkKLSAgICAgICAgcmV0dXJuIDI7Ci0KLSAgICAgIGlmICghZ2lmX3B0ci0+Z2NlX3B0cikKLSAgICAgICAgZ2lmX3B0ci0+Z2NlX3B0ciA9IEZYX0FsbG9jKEdpZkdDRSwgMSk7Ci0gICAgICBnaWZfcHRyLT5nY2VfcHRyLT5ibG9ja19zaXplID0gZ2lmX2djZV9wdHItPmJsb2NrX3NpemU7Ci0gICAgICBnaWZfcHRyLT5nY2VfcHRyLT5nY2VfZmxhZyA9IGdpZl9nY2VfcHRyLT5nY2VfZmxhZzsKLSAgICAgIGdpZl9wdHItPmdjZV9wdHItPmRlbGF5X3RpbWUgPQotICAgICAgICAgIEdldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZnaWZfZ2NlX3B0ci0+ZGVsYXlfdGltZSk7Ci0gICAgICBnaWZfcHRyLT5nY2VfcHRyLT50cmFuc19pbmRleCA9IGdpZl9nY2VfcHRyLT50cmFuc19pbmRleDsKLSAgICB9IGJyZWFrOwotICAgIGRlZmF1bHQ6IHsKLSAgICAgIGlmIChnaWZfcHRyLT5kZWNvZGVfc3RhdHVzID09IEdJRl9EX1NUQVRVU19FWFRfUFRFKSB7Ci0gICAgICAgIEZYX0ZyZWUoZ2lmX3B0ci0+Z2NlX3B0cik7Ci0gICAgICAgIGdpZl9wdHItPmdjZV9wdHIgPSBudWxscHRyOwotICAgICAgfQotICAgICAgaWYgKCFnaWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3NpemVfcHRyLCAxKSkKLSAgICAgICAgcmV0dXJuIDI7Ci0KLSAgICAgIHdoaWxlICgqZGF0YV9zaXplX3B0ciAhPSBHSUZfQkxPQ0tfVEVSTUlOQUwpIHsKLSAgICAgICAgaWYgKCFnaWZfcmVhZF9kYXRhKGdpZl9wdHIsICZkYXRhX3B0ciwgKmRhdGFfc2l6ZV9wdHIpIHx8Ci0gICAgICAgICAgICAhZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9zaXplX3B0ciwgMSkpIHsKLSAgICAgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOwotICAgICAgICAgIHJldHVybiAyOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGdpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfU0lHKTsKLSAgcmV0dXJuIDE7Ci19Ci1pbnQzMl90IGdpZl9kZWNvZGVfaW1hZ2VfaW5mbyhnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyKSB7Ci0gIGlmIChnaWZfcHRyLT53aWR0aCA9PSAwIHx8IGdpZl9wdHItPmhlaWdodCA9PSAwKSB7Ci0gICAgZ2lmX2Vycm9yKGdpZl9wdHIsICJObyBJbWFnZSBIZWFkZXIgSW5mbyIpOwotICAgIHJldHVybiAwOwotICB9Ci0gIHVpbnQzMl90IHNraXBfc2l6ZV9vcmcgPSBnaWZfcHRyLT5za2lwX3NpemU7Ci0gIEFTU0VSVChzaXplb2YoR2lmSW1hZ2VJbmZvKSA9PSA5KTsKLSAgR2lmSW1hZ2VJbmZvKiBnaWZfaW1nX2luZm9fcHRyID0gbnVsbHB0cjsKLSAgaWYgKCFnaWZfcmVhZF9kYXRhKGdpZl9wdHIsICh1aW50OF90KiopJmdpZl9pbWdfaW5mb19wdHIsIDkpKQotICAgIHJldHVybiAyOwotCi0gIEdpZkltYWdlKiBnaWZfaW1hZ2VfcHRyID0gRlhfQWxsb2MoR2lmSW1hZ2UsIDEpOwotICBGWFNZU19tZW1zZXQoZ2lmX2ltYWdlX3B0ciwgMCwgc2l6ZW9mKEdpZkltYWdlKSk7Ci0gIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyID0gRlhfQWxsb2MoR2lmSW1hZ2VJbmZvLCAxKTsKLSAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmxlZnQgPQotICAgICAgR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmdpZl9pbWdfaW5mb19wdHItPmxlZnQpOwotICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+dG9wID0KLSAgICAgIEdldFdvcmRfTFNCRmlyc3QoKHVpbnQ4X3QqKSZnaWZfaW1nX2luZm9fcHRyLT50b3ApOwotICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+d2lkdGggPQotICAgICAgR2V0V29yZF9MU0JGaXJzdCgodWludDhfdCopJmdpZl9pbWdfaW5mb19wdHItPndpZHRoKTsKLSAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmhlaWdodCA9Ci0gICAgICBHZXRXb3JkX0xTQkZpcnN0KCh1aW50OF90KikmZ2lmX2ltZ19pbmZvX3B0ci0+aGVpZ2h0KTsKLSAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmxvY2FsX2ZsYWcgPSBnaWZfaW1nX2luZm9fcHRyLT5sb2NhbF9mbGFnOwotICBpZiAoZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmxlZnQgKwotICAgICAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+d2lkdGggPgotICAgICAgICAgIGdpZl9wdHItPndpZHRoIHx8Ci0gICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+dG9wICsKLSAgICAgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmhlaWdodCA+Ci0gICAgICAgICAgZ2lmX3B0ci0+aGVpZ2h0KSB7Ci0gICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0cik7Ci0gICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmKTsKLSAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHIpOwotICAgIGdpZl9lcnJvcihnaWZfcHRyLCAiSW1hZ2UgRGF0YSBPdXQgT2YgTFNELCBUaGUgRmlsZSBNYXkgQmUgQ29ycnVwdCIpOwotICAgIHJldHVybiAwOwotICB9Ci0gIEdpZkxGKiBnaWZfaW1nX2luZm9fbGZfcHRyID0gKEdpZkxGKikmZ2lmX2ltZ19pbmZvX3B0ci0+bG9jYWxfZmxhZzsKLSAgaWYgKGdpZl9pbWdfaW5mb19sZl9wdHItPmxvY2FsX3BhbCkgewotICAgIEFTU0VSVChzaXplb2YoR2lmUGFsZXR0ZSkgPT0gMyk7Ci0gICAgaW50MzJfdCBsb2NfcGFsX3NpemUgPSAoMiA8PCBnaWZfaW1nX2luZm9fbGZfcHRyLT5wYWxfYml0cykgKiAzOwotICAgIHVpbnQ4X3QqIGxvY19wYWxfcHRyID0gbnVsbHB0cjsKLSAgICBpZiAoIWdpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmxvY19wYWxfcHRyLCBsb2NfcGFsX3NpemUpKSB7Ci0gICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOwotICAgICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0cik7Ci0gICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOwotICAgICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyKTsKLSAgICAgIHJldHVybiAyOwotICAgIH0KLSAgICBnaWZfaW1hZ2VfcHRyLT5sb2NhbF9wYWxfcHRyID0KLSAgICAgICAgKEdpZlBhbGV0dGUqKWdpZl9wdHItPmdpZl9hc2tfYnVmX2Zvcl9wYWxfZm4oZ2lmX3B0ciwgbG9jX3BhbF9zaXplKTsKLSAgICBpZiAoZ2lmX2ltYWdlX3B0ci0+bG9jYWxfcGFsX3B0cikgewotICAgICAgRlhTWVNfbWVtY3B5KCh1aW50OF90KilnaWZfaW1hZ2VfcHRyLT5sb2NhbF9wYWxfcHRyLCBsb2NfcGFsX3B0ciwKLSAgICAgICAgICAgICAgICAgICBsb2NfcGFsX3NpemUpOwotICAgIH0KLSAgfQotICB1aW50OF90KiBjb2RlX3NpemVfcHRyID0gbnVsbHB0cjsKLSAgaWYgKCFnaWZfcmVhZF9kYXRhKGdpZl9wdHIsICZjb2RlX3NpemVfcHRyLCAxKSkgewotICAgIGdpZl9wdHItPnNraXBfc2l6ZSA9IHNraXBfc2l6ZV9vcmc7Ci0gICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0cik7Ci0gICAgRlhfRnJlZShnaWZfaW1hZ2VfcHRyLT5sb2NhbF9wYWxfcHRyKTsKLSAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOwotICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0cik7Ci0gICAgcmV0dXJuIDI7Ci0gIH0KLSAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfY29kZV9zaXplID0gKmNvZGVfc2l6ZV9wdHI7Ci0gIGdpZl9wdHItPmdpZl9yZWNvcmRfY3VycmVudF9wb3NpdGlvbl9mbihnaWZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdpZl9pbWFnZV9wdHItPmltYWdlX2RhdGFfcG9zKTsKLSAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfZGF0YV9wb3MgKz0gZ2lmX3B0ci0+c2tpcF9zaXplOwotICBnaWZfdGFrZW92ZXJfZ2NlX3B0cihnaWZfcHRyLCAmZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfZ2NlX3B0cik7Ci0gIGdpZl9wdHItPmltZ19wdHJfYXJyX3B0ci0+cHVzaF9iYWNrKGdpZl9pbWFnZV9wdHIpOwotICBnaWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX0lNR19EQVRBKTsKLSAgcmV0dXJuIDE7Ci19Ci1pbnQzMl90IGdpZl9sb2FkX2ZyYW1lKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIGludDMyX3QgZnJhbWVfbnVtKSB7Ci0gIGlmICghZ2lmX3B0ciB8fCBmcmFtZV9udW0gPCAwIHx8Ci0gICAgICBmcmFtZV9udW0gPj0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQ+KCpnaWZfcHRyLT5pbWdfcHRyX2Fycl9wdHIpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgdWludDhfdCogZGF0YV9zaXplX3B0ciA9IG51bGxwdHI7Ci0gIHVpbnQ4X3QqIGRhdGFfcHRyID0gbnVsbHB0cjsKLSAgdWludDMyX3Qgc2tpcF9zaXplX29yZyA9IGdpZl9wdHItPnNraXBfc2l6ZTsKLSAgR2lmSW1hZ2UqIGdpZl9pbWFnZV9wdHIgPSAoKmdpZl9wdHItPmltZ19wdHJfYXJyX3B0cilbZnJhbWVfbnVtXTsKLSAgdWludDMyX3QgZ2lmX2ltZ19yb3dfYnl0ZXMgPSBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+d2lkdGg7Ci0gIGlmIChnaWZfaW1nX3Jvd19ieXRlcyA9PSAwKSB7Ci0gICAgZ2lmX2Vycm9yKGdpZl9wdHIsICJFcnJvciBJbnZhbGlkIE51bWJlciBvZiBSb3cgQnl0ZXMiKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAoZ2lmX3B0ci0+ZGVjb2RlX3N0YXR1cyA9PSBHSUZfRF9TVEFUVVNfVEFJTCkgewotICAgIGlmIChnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmKSB7Ci0gICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOwotICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiA9IG51bGxwdHI7Ci0gICAgfQotICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgPSBGWF9BbGxvYyh1aW50OF90LCBnaWZfaW1nX3Jvd19ieXRlcyk7Ci0gICAgR2lmR0NFKiBnaWZfaW1nX2djZV9wdHIgPSBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9nY2VfcHRyOwotICAgIGludDMyX3QgbG9jX3BhbF9udW0gPQotICAgICAgICAoKEdpZkxGKikmZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmxvY2FsX2ZsYWcpLT5sb2NhbF9wYWwKLSAgICAgICAgICAgID8gKDIgPDwgKChHaWZMRiopJmdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5sb2NhbF9mbGFnKQotICAgICAgICAgICAgICAgICAgICAgICAgLT5wYWxfYml0cykKLSAgICAgICAgICAgIDogMDsKLSAgICBnaWZfcHRyLT5hdmFpbF9pbiA9IDA7Ci0gICAgaWYgKCFnaWZfaW1nX2djZV9wdHIpIHsKLSAgICAgIGJvb2wgYlJlcyA9IGdpZl9wdHItPmdpZl9nZXRfcmVjb3JkX3Bvc2l0aW9uX2ZuKAotICAgICAgICAgIGdpZl9wdHIsIGdpZl9pbWFnZV9wdHItPmltYWdlX2RhdGFfcG9zLAotICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5sZWZ0LAotICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT50b3AsCi0gICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPndpZHRoLAotICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5oZWlnaHQsIGxvY19wYWxfbnVtLAotICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmxvY2FsX3BhbF9wdHIsIDAsIDAsIC0xLCAwLAotICAgICAgICAgIChib29sKSgoR2lmTEYqKSZnaWZfaW1hZ2VfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bG9jYWxfZmxhZykKLSAgICAgICAgICAgICAgLT5pbnRlcmxhY2UpOwotICAgICAgaWYgKCFiUmVzKSB7Ci0gICAgICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1Zik7Ci0gICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgPSBudWxscHRyOwotICAgICAgICBnaWZfZXJyb3IoZ2lmX3B0ciwgIkVycm9yIFJlYWQgUmVjb3JkIFBvc2l0aW9uIERhdGEiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJvb2wgYlJlcyA9IGdpZl9wdHItPmdpZl9nZXRfcmVjb3JkX3Bvc2l0aW9uX2ZuKAotICAgICAgICAgIGdpZl9wdHIsIGdpZl9pbWFnZV9wdHItPmltYWdlX2RhdGFfcG9zLAotICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5sZWZ0LAotICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT50b3AsCi0gICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPndpZHRoLAotICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5oZWlnaHQsIGxvY19wYWxfbnVtLAotICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmxvY2FsX3BhbF9wdHIsCi0gICAgICAgICAgKGludDMyX3QpZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfZ2NlX3B0ci0+ZGVsYXlfdGltZSwKLSAgICAgICAgICAoYm9vbCkoKEdpZkNFRiopJmdpZl9pbWFnZV9wdHItPmltYWdlX2djZV9wdHItPmdjZV9mbGFnKS0+dXNlcl9pbnB1dCwKLSAgICAgICAgICAoKEdpZkNFRiopJmdpZl9pbWFnZV9wdHItPmltYWdlX2djZV9wdHItPmdjZV9mbGFnKS0+dHJhbnNwYXJlbmN5Ci0gICAgICAgICAgICAgID8gKGludDMyX3QpZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfZ2NlX3B0ci0+dHJhbnNfaW5kZXgKLSAgICAgICAgICAgICAgOiAtMSwKLSAgICAgICAgICAoaW50MzJfdCkoKEdpZkNFRiopJmdpZl9pbWFnZV9wdHItPmltYWdlX2djZV9wdHItPmdjZV9mbGFnKQotICAgICAgICAgICAgICAtPmRpc3Bvc2FsX21ldGhvZCwKLSAgICAgICAgICAoYm9vbCkoKEdpZkxGKikmZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmxvY2FsX2ZsYWcpCi0gICAgICAgICAgICAgIC0+aW50ZXJsYWNlKTsKLSAgICAgIGlmICghYlJlcykgewotICAgICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOwotICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfYnVmID0gbnVsbHB0cjsKLSAgICAgICAgZ2lmX2Vycm9yKGdpZl9wdHIsICJFcnJvciBSZWFkIFJlY29yZCBQb3NpdGlvbiBEYXRhIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfY29kZV9zaXplID49IDMyKSB7Ci0gICAgICBGWF9GcmVlKGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOwotICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiA9IG51bGxwdHI7Ci0gICAgICBnaWZfZXJyb3IoZ2lmX3B0ciwgIkVycm9yIEludmFsaWQgQ29kZSBTaXplIik7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKCFnaWZfcHRyLT5pbWdfZGVjb2Rlcl9wdHIpCi0gICAgICBnaWZfcHRyLT5pbWdfZGVjb2Rlcl9wdHIgPSBuZXcgQ0dpZkxaV0RlY29kZXIoZ2lmX3B0ci0+ZXJyX3B0cik7Ci0gICAgZ2lmX3B0ci0+aW1nX2RlY29kZXJfcHRyLT5Jbml0VGFibGUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfY29kZV9zaXplKTsKLSAgICBnaWZfcHRyLT5pbWdfcm93X29mZnNldCA9IDA7Ci0gICAgZ2lmX3B0ci0+aW1nX3Jvd19hdmFpbF9zaXplID0gMDsKLSAgICBnaWZfcHRyLT5pbWdfcGFzc19udW0gPSAwOwotICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19udW0gPSAwOwotICAgIGdpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfSU1HX0RBVEEpOwotICB9Ci0gIENHaWZMWldEZWNvZGVyKiBpbWdfZGVjb2Rlcl9wdHIgPSBnaWZfcHRyLT5pbWdfZGVjb2Rlcl9wdHI7Ci0gIGlmIChnaWZfcHRyLT5kZWNvZGVfc3RhdHVzID09IEdJRl9EX1NUQVRVU19JTUdfREFUQSkgewotICAgIGlmICghZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9zaXplX3B0ciwgMSkpCi0gICAgICByZXR1cm4gMjsKLQotICAgIGlmICgqZGF0YV9zaXplX3B0ciAhPSBHSUZfQkxPQ0tfVEVSTUlOQUwpIHsKLSAgICAgIGlmICghZ2lmX3JlYWRfZGF0YShnaWZfcHRyLCAmZGF0YV9wdHIsICpkYXRhX3NpemVfcHRyKSkgewotICAgICAgICBnaWZfcHRyLT5za2lwX3NpemUgPSBza2lwX3NpemVfb3JnOwotICAgICAgICByZXR1cm4gMjsKLSAgICAgIH0KLSAgICAgIGltZ19kZWNvZGVyX3B0ci0+SW5wdXQoZGF0YV9wdHIsICpkYXRhX3NpemVfcHRyKTsKLSAgICAgIGdpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfcHRyLCBHSUZfRF9TVEFUVVNfSU1HX0RBVEEpOwotICAgICAgZ2lmX3B0ci0+aW1nX3Jvd19vZmZzZXQgKz0gZ2lmX3B0ci0+aW1nX3Jvd19hdmFpbF9zaXplOwotICAgICAgZ2lmX3B0ci0+aW1nX3Jvd19hdmFpbF9zaXplID0gZ2lmX2ltZ19yb3dfYnl0ZXMgLSBnaWZfcHRyLT5pbWdfcm93X29mZnNldDsKLSAgICAgIGludDMyX3QgcmV0ID0gaW1nX2RlY29kZXJfcHRyLT5EZWNvZGUoCi0gICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiArIGdpZl9wdHItPmltZ19yb3dfb2Zmc2V0LAotICAgICAgICAgIGdpZl9wdHItPmltZ19yb3dfYXZhaWxfc2l6ZSk7Ci0gICAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgZ2lmX2RlY29kaW5nX2ZhaWx1cmVfYXRfdGFpbF9jbGVhbnVwKGdpZl9wdHIsIGdpZl9pbWFnZV9wdHIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIHdoaWxlIChyZXQgIT0gMCkgewotICAgICAgICBpZiAocmV0ID09IDEpIHsKLSAgICAgICAgICBnaWZfcHRyLT5naWZfZ2V0X3Jvd19mbihnaWZfcHRyLCBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOwotICAgICAgICAgIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1Zik7Ci0gICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1ZiA9IG51bGxwdHI7Ci0gICAgICAgICAgZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19UQUlMKTsKLSAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0ID09IDIpIHsKLSAgICAgICAgICBBU1NFUlQoaW1nX2RlY29kZXJfcHRyLT5HZXRBdmFpbElucHV0KCkgPT0gMCk7Ci0gICAgICAgICAgc2tpcF9zaXplX29yZyA9IGdpZl9wdHItPnNraXBfc2l6ZTsKLSAgICAgICAgICBpZiAoIWdpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfc2l6ZV9wdHIsIDEpKQotICAgICAgICAgICAgcmV0dXJuIDI7Ci0KLSAgICAgICAgICBpZiAoKmRhdGFfc2l6ZV9wdHIgIT0gR0lGX0JMT0NLX1RFUk1JTkFMKSB7Ci0gICAgICAgICAgICBpZiAoIWdpZl9yZWFkX2RhdGEoZ2lmX3B0ciwgJmRhdGFfcHRyLCAqZGF0YV9zaXplX3B0cikpIHsKLSAgICAgICAgICAgICAgZ2lmX3B0ci0+c2tpcF9zaXplID0gc2tpcF9zaXplX29yZzsKLSAgICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbWdfZGVjb2Rlcl9wdHItPklucHV0KGRhdGFfcHRyLCAqZGF0YV9zaXplX3B0cik7Ci0gICAgICAgICAgICBnaWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX0lNR19EQVRBKTsKLSAgICAgICAgICAgIGdpZl9wdHItPmltZ19yb3dfb2Zmc2V0ICs9IGdpZl9wdHItPmltZ19yb3dfYXZhaWxfc2l6ZTsKLSAgICAgICAgICAgIGdpZl9wdHItPmltZ19yb3dfYXZhaWxfc2l6ZSA9Ci0gICAgICAgICAgICAgICAgZ2lmX2ltZ19yb3dfYnl0ZXMgLSBnaWZfcHRyLT5pbWdfcm93X29mZnNldDsKLSAgICAgICAgICAgIHJldCA9IGltZ19kZWNvZGVyX3B0ci0+RGVjb2RlKAotICAgICAgICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgKyBnaWZfcHRyLT5pbWdfcm93X29mZnNldCwKLSAgICAgICAgICAgICAgICBnaWZfcHRyLT5pbWdfcm93X2F2YWlsX3NpemUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAocmV0ID09IDMpIHsKLSAgICAgICAgICBpZiAoKChHaWZMRiopJmdpZl9pbWFnZV9wdHItPmltYWdlX2luZm9fcHRyLT5sb2NhbF9mbGFnKS0+aW50ZXJsYWNlKSB7Ci0gICAgICAgICAgICBnaWZfcHRyLT5naWZfZ2V0X3Jvd19mbihnaWZfcHRyLCBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1Zik7Ci0gICAgICAgICAgICBnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfbnVtICs9Ci0gICAgICAgICAgICAgICAgc19naWZfaW50ZXJsYWNlX3N0ZXBbZ2lmX3B0ci0+aW1nX3Bhc3NfbnVtXTsKLSAgICAgICAgICAgIGlmIChnaWZfaW1hZ2VfcHRyLT5pbWFnZV9yb3dfbnVtID49Ci0gICAgICAgICAgICAgICAgKGludDMyX3QpZ2lmX2ltYWdlX3B0ci0+aW1hZ2VfaW5mb19wdHItPmhlaWdodCkgewotICAgICAgICAgICAgICBnaWZfcHRyLT5pbWdfcGFzc19udW0rKzsKLSAgICAgICAgICAgICAgaWYgKGdpZl9wdHItPmltZ19wYXNzX251bSA9PSBGWF9BcnJheVNpemUoc19naWZfaW50ZXJsYWNlX3N0ZXApKSB7Ci0gICAgICAgICAgICAgICAgZ2lmX2RlY29kaW5nX2ZhaWx1cmVfYXRfdGFpbF9jbGVhbnVwKGdpZl9wdHIsIGdpZl9pbWFnZV9wdHIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19udW0gPQotICAgICAgICAgICAgICAgICAgc19naWZfaW50ZXJsYWNlX3N0ZXBbZ2lmX3B0ci0+aW1nX3Bhc3NfbnVtXSAvIDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdpZl9wdHItPmdpZl9nZXRfcm93X2ZuKGdpZl9wdHIsIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19udW0rKywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYpOwotICAgICAgICAgIH0KLSAgICAgICAgICBnaWZfcHRyLT5pbWdfcm93X29mZnNldCA9IDA7Ci0gICAgICAgICAgZ2lmX3B0ci0+aW1nX3Jvd19hdmFpbF9zaXplID0gZ2lmX2ltZ19yb3dfYnl0ZXM7Ci0gICAgICAgICAgcmV0ID0gaW1nX2RlY29kZXJfcHRyLT5EZWNvZGUoCi0gICAgICAgICAgICAgIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgKyBnaWZfcHRyLT5pbWdfcm93X29mZnNldCwKLSAgICAgICAgICAgICAgZ2lmX3B0ci0+aW1nX3Jvd19hdmFpbF9zaXplKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgICBnaWZfZGVjb2RpbmdfZmFpbHVyZV9hdF90YWlsX2NsZWFudXAoZ2lmX3B0ciwgZ2lmX2ltYWdlX3B0cik7Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZ2lmX3NhdmVfZGVjb2Rpbmdfc3RhdHVzKGdpZl9wdHIsIEdJRl9EX1NUQVRVU19UQUlMKTsKLSAgfQotICBnaWZfZXJyb3IoZ2lmX3B0ciwgIkRlY29kZSBJbWFnZSBEYXRhIEVycm9yIik7Ci0gIHJldHVybiAwOwotfQotdm9pZCBnaWZfZGVjb2RpbmdfZmFpbHVyZV9hdF90YWlsX2NsZWFudXAoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdpZkltYWdlKiBnaWZfaW1hZ2VfcHRyKSB7Ci0gIEZYX0ZyZWUoZ2lmX2ltYWdlX3B0ci0+aW1hZ2Vfcm93X2J1Zik7Ci0gIGdpZl9pbWFnZV9wdHItPmltYWdlX3Jvd19idWYgPSBudWxscHRyOwotICBnaWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX3B0ciwgR0lGX0RfU1RBVFVTX1RBSUwpOwotICBnaWZfZXJyb3IoZ2lmX3B0ciwgIkRlY29kZSBJbWFnZSBEYXRhIEVycm9yIik7Ci19Ci12b2lkIGdpZl9zYXZlX2RlY29kaW5nX3N0YXR1cyhnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLCBpbnQzMl90IHN0YXR1cykgewotICBnaWZfcHRyLT5kZWNvZGVfc3RhdHVzID0gc3RhdHVzOwotICBnaWZfcHRyLT5uZXh0X2luICs9IGdpZl9wdHItPnNraXBfc2l6ZTsKLSAgZ2lmX3B0ci0+YXZhaWxfaW4gLT0gZ2lmX3B0ci0+c2tpcF9zaXplOwotICBnaWZfcHRyLT5za2lwX3NpemUgPSAwOwotfQotdWludDhfdCogZ2lmX3JlYWRfZGF0YShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogZGVzX2J1Zl9wcCwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF0YV9zaXplKSB7Ci0gIGlmICghZ2lmX3B0ciB8fCBnaWZfcHRyLT5hdmFpbF9pbiA8IGdpZl9wdHItPnNraXBfc2l6ZSArIGRhdGFfc2l6ZSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICAqZGVzX2J1Zl9wcCA9IGdpZl9wdHItPm5leHRfaW4gKyBnaWZfcHRyLT5za2lwX3NpemU7Ci0gIGdpZl9wdHItPnNraXBfc2l6ZSArPSBkYXRhX3NpemU7Ci0gIHJldHVybiAqZGVzX2J1Zl9wcDsKLX0KLXZvaWQgZ2lmX2lucHV0X2J1ZmZlcihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19idWYsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NpemUpIHsKLSAgZ2lmX3B0ci0+bmV4dF9pbiA9IHNyY19idWY7Ci0gIGdpZl9wdHItPmF2YWlsX2luID0gc3JjX3NpemU7Ci0gIGdpZl9wdHItPnNraXBfc2l6ZSA9IDA7Ci19Ci11aW50MzJfdCBnaWZfZ2V0X2F2YWlsX2lucHV0KGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBhdmFpbF9idWZfcHRyKSB7Ci0gIGlmIChhdmFpbF9idWZfcHRyKSB7Ci0gICAgKmF2YWlsX2J1Zl9wdHIgPSBudWxscHRyOwotICAgIGlmIChnaWZfcHRyLT5hdmFpbF9pbiA+IDApIHsKLSAgICAgICphdmFpbF9idWZfcHRyID0gZ2lmX3B0ci0+bmV4dF9pbjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGdpZl9wdHItPmF2YWlsX2luOwotfQotaW50MzJfdCBnaWZfZ2V0X2ZyYW1lX251bShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyKSB7Ci0gIHJldHVybiBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KCpnaWZfcHRyLT5pbWdfcHRyX2Fycl9wdHIpOwotfQotc3RhdGljIGJvb2wgZ2lmX3dyaXRlX2hlYWRlcihnaWZfY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRzdF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBkc3RfbGVuKSB7Ci0gIGlmIChnaWZfcHRyLT5jdXJfb2Zmc2V0KSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgZHN0X2xlbiA9IHNpemVvZihHaWZIZWFkZXIpICsgc2l6ZW9mKEdpZkxTRCkgKyBzaXplb2YoR2lmR0YpOwotICBkc3RfYnVmID0gRlhfVHJ5QWxsb2ModWludDhfdCwgZHN0X2xlbik7Ci0gIGlmICghZHN0X2J1ZikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgRlhTWVNfbWVtc2V0KGRzdF9idWYsIDAsIGRzdF9sZW4pOwotICBGWFNZU19tZW1jcHkoZHN0X2J1ZiwgZ2lmX3B0ci0+aGVhZGVyX3B0ciwgc2l6ZW9mKEdpZkhlYWRlcikpOwotICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IHNpemVvZihHaWZIZWFkZXIpOwotICBTZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LCBnaWZfcHRyLT5sc2RfcHRyLT53aWR0aCk7Ci0gIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsKLSAgU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwgZ2lmX3B0ci0+bHNkX3B0ci0+aGVpZ2h0KTsKLSAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOwotICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBnaWZfcHRyLT5sc2RfcHRyLT5nbG9iYWxfZmxhZzsKLSAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gZ2lmX3B0ci0+bHNkX3B0ci0+YmNfaW5kZXg7Ci0gIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IGdpZl9wdHItPmxzZF9wdHItPnBpeGVsX2FzcGVjdDsKLSAgaWYgKGdpZl9wdHItPmdsb2JhbF9wYWwpIHsKLSAgICB1aW50MTZfdCBzaXplID0gc2l6ZW9mKEdpZlBhbGV0dGUpICogZ2lmX3B0ci0+Z3BhbF9udW07Ci0gICAgaWYgKCFnaWZfZ3Jvd19idWYoZHN0X2J1ZiwgZHN0X2xlbiwgZ2lmX3B0ci0+Y3VyX29mZnNldCArIHNpemUpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIEZYU1lTX21lbWNweSgmZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0XSwgZ2lmX3B0ci0+Z2xvYmFsX3BhbCwgc2l6ZSk7Ci0gICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSBzaXplOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotdm9pZCBpbnRlcmxhY2VfYnVmKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QgcGl0Y2gsIHVpbnQzMl90IGhlaWdodCkgewotICBzdGQ6OnZlY3Rvcjx1aW50OF90Kj4gcGFzc1s0XTsKLSAgdWludDMyX3Qgcm93ID0gMDsKLSAgdWludDhfdCogdGVtcDsKLSAgd2hpbGUgKHJvdyA8IGhlaWdodCkgewotICAgIHNpemVfdCBqOwotICAgIGlmIChyb3cgJSA4ID09IDApIHsKLSAgICAgIGogPSAwOwotICAgIH0gZWxzZSBpZiAocm93ICUgNCA9PSAwKSB7Ci0gICAgICBqID0gMTsKLSAgICB9IGVsc2UgaWYgKHJvdyAlIDIgPT0gMCkgewotICAgICAgaiA9IDI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGogPSAzOwotICAgIH0KLSAgICB0ZW1wID0gRlhfQWxsb2ModWludDhfdCwgcGl0Y2gpOwotICAgIEZYU1lTX21lbWNweSh0ZW1wLCAmYnVmW3BpdGNoICogcm93XSwgcGl0Y2gpOwotICAgIHBhc3Nbal0ucHVzaF9iYWNrKHRlbXApOwotICAgIHJvdysrOwotICB9Ci0gIGZvciAoc2l6ZV90IGkgPSAwLCByb3cgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwYXNzW2ldLnNpemUoKTsgaisrLCByb3crKykgewotICAgICAgRlhTWVNfbWVtY3B5KCh1aW50OF90KikmYnVmW3BpdGNoICogcm93XSwgcGFzc1tpXVtqXSwgcGl0Y2gpOwotICAgICAgRlhfRnJlZShwYXNzW2ldW2pdKTsKLSAgICB9Ci0gIH0KLX0KLXN0YXRpYyB2b2lkIGdpZl93cml0ZV9ibG9ja19kYXRhKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIGRzdF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgZHN0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBkc3Rfb2Zmc2V0KSB7Ci0gIHVpbnQzMl90IHNyY19vZmZzZXQgPSAwOwotICB3aGlsZSAoc3JjX2xlbiA+IEdJRl9EQVRBX0JMT0NLKSB7Ci0gICAgZHN0X2J1Zltkc3Rfb2Zmc2V0KytdID0gR0lGX0RBVEFfQkxPQ0s7Ci0gICAgRlhTWVNfbWVtY3B5KCZkc3RfYnVmW2RzdF9vZmZzZXRdLCAmc3JjX2J1ZltzcmNfb2Zmc2V0XSwgR0lGX0RBVEFfQkxPQ0spOwotICAgIGRzdF9vZmZzZXQgKz0gR0lGX0RBVEFfQkxPQ0s7Ci0gICAgc3JjX29mZnNldCArPSBHSUZfREFUQV9CTE9DSzsKLSAgICBzcmNfbGVuIC09IEdJRl9EQVRBX0JMT0NLOwotICB9Ci0gIGRzdF9idWZbZHN0X29mZnNldCsrXSA9ICh1aW50OF90KXNyY19sZW47Ci0gIEZYU1lTX21lbWNweSgmZHN0X2J1Zltkc3Rfb2Zmc2V0XSwgJnNyY19idWZbc3JjX29mZnNldF0sIHNyY19sZW4pOwotICBkc3Rfb2Zmc2V0ICs9IHNyY19sZW47Ci19Ci1zdGF0aWMgYm9vbCBnaWZfd3JpdGVfZGF0YShnaWZfY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIGRzdF9sZW4pIHsKLSAgaWYgKCFnaWZfZ3Jvd19idWYoZHN0X2J1ZiwgZHN0X2xlbiwgZ2lmX3B0ci0+Y3VyX29mZnNldCArIEdJRl9EQVRBX0JMT0NLKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoRlhTWVNfbWVtY21wKGdpZl9wdHItPmhlYWRlcl9wdHItPnZlcnNpb24sICI4OWEiLCAzKSA9PSAwKSB7Ci0gICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gR0lGX1NJR19FWFRFTlNJT047Ci0gICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gR0lGX0JMT0NLX0dDRTsKLSAgICBnaWZfcHRyLT5nY2VfcHRyLT5ibG9ja19zaXplID0gNDsKLSAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBnaWZfcHRyLT5nY2VfcHRyLT5ibG9ja19zaXplOwotICAgIGdpZl9wdHItPmdjZV9wdHItPmdjZV9mbGFnID0gMDsKLSAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBnaWZfcHRyLT5nY2VfcHRyLT5nY2VfZmxhZzsKLSAgICBnaWZfcHRyLT5nY2VfcHRyLT5kZWxheV90aW1lID0gMTA7Ci0gICAgU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPmdjZV9wdHItPmRlbGF5X3RpbWUpOwotICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsKLSAgICBnaWZfcHRyLT5nY2VfcHRyLT50cmFuc19pbmRleCA9IDA7Ci0gICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gZ2lmX3B0ci0+Z2NlX3B0ci0+dHJhbnNfaW5kZXg7Ci0gICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gMDsKLSAgfQotICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBHSUZfU0lHX0lNQUdFOwotICBTZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPmltYWdlX2luZm9fcHRyLT5sZWZ0KTsKLSAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOwotICBTZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LCBnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ci0+dG9wKTsKLSAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOwotICBTZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPmltYWdlX2luZm9fcHRyLT53aWR0aCk7Ci0gIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsKLSAgU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ci0+aGVpZ2h0KTsKLSAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOwotICBHaWZMRiYgbGYgPSAoR2lmTEYmKWdpZl9wdHItPmltYWdlX2luZm9fcHRyLT5sb2NhbF9mbGFnOwotICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSBnaWZfcHRyLT5pbWFnZV9pbmZvX3B0ci0+bG9jYWxfZmxhZzsKLSAgaWYgKGdpZl9wdHItPmxvY2FsX3BhbCkgewotICAgIHVpbnQzMl90IHBhbF9zaXplID0gc2l6ZW9mKEdpZlBhbGV0dGUpICogZ2lmX3B0ci0+bHBhbF9udW07Ci0gICAgaWYgKCFnaWZfZ3Jvd19idWYoZHN0X2J1ZiwgZHN0X2xlbiwgcGFsX3NpemUgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0KSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBGWFNZU19tZW1jcHkoJmRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldF0sIGdpZl9wdHItPmxvY2FsX3BhbCwgcGFsX3NpemUpOwotICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gcGFsX3NpemU7Ci0gIH0KLSAgaWYgKGxmLmludGVybGFjZSkgewotICAgIGludGVybGFjZV9idWYoZ2lmX3B0ci0+c3JjX2J1ZiwgZ2lmX3B0ci0+c3JjX3BpdGNoLAotICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+aW1hZ2VfaW5mb19wdHItPmhlaWdodCk7Ci0gIH0KLSAgdWludDhfdCBjb2RlX2JpdCA9IGxmLnBhbF9iaXRzOwotICBpZiAobGYubG9jYWxfcGFsID09IDApIHsKLSAgICBHaWZHRiYgZ2YgPSAoR2lmR0YmKWdpZl9wdHItPmxzZF9wdHItPmdsb2JhbF9mbGFnOwotICAgIGNvZGVfYml0ID0gZ2YucGFsX2JpdHM7Ci0gIH0KLSAgaWYgKGNvZGVfYml0ID49IDMxKQotICAgIHJldHVybiBmYWxzZTsKLSAgZ2lmX3B0ci0+aW1nX2VuY29kZXJfcHRyLT5TdGFydChjb2RlX2JpdCwgZ2lmX3B0ci0+c3JjX2J1ZiwgZHN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0KTsKLSAgdWludDMyX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IGdpZl9wdHItPnNyY19yb3c7IGkrKykgewotICAgIGlmICghZ2lmX3B0ci0+aW1nX2VuY29kZXJfcHRyLT5FbmNvZGUoCi0gICAgICAgICAgICAmZ2lmX3B0ci0+c3JjX2J1ZltpICogZ2lmX3B0ci0+c3JjX3BpdGNoXSwKLSAgICAgICAgICAgIGdpZl9wdHItPnNyY193aWR0aCAqIChjb2RlX2JpdCArIDEpLCBkc3RfYnVmLCBkc3RfbGVuLAotICAgICAgICAgICAgZ2lmX3B0ci0+Y3VyX29mZnNldCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgZ2lmX3B0ci0+aW1nX2VuY29kZXJfcHRyLT5GaW5pc2goZHN0X2J1ZiwgZHN0X2xlbiwgZ2lmX3B0ci0+Y3VyX29mZnNldCk7Ci0gIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IDA7Ci0gIGlmIChGWFNZU19tZW1jbXAoZ2lmX3B0ci0+aGVhZGVyX3B0ci0+dmVyc2lvbiwgIjg5YSIsIDMpID09IDAgJiYKLSAgICAgIGdpZl9wdHItPmNtdF9kYXRhX3B0cikgewotICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IEdJRl9TSUdfRVhURU5TSU9OOwotICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IEdJRl9CTE9DS19DRTsKLSAgICBnaWZfd3JpdGVfYmxvY2tfZGF0YShnaWZfcHRyLT5jbXRfZGF0YV9wdHIsIGdpZl9wdHItPmNtdF9kYXRhX2xlbiwgZHN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfbGVuLCBnaWZfcHRyLT5jdXJfb2Zmc2V0KTsKLSAgICBkc3RfYnVmW2dpZl9wdHItPmN1cl9vZmZzZXQrK10gPSAwOwotICB9Ci0gIGlmIChGWFNZU19tZW1jbXAoZ2lmX3B0ci0+aGVhZGVyX3B0ci0+dmVyc2lvbiwgIjg5YSIsIDMpID09IDAgJiYKLSAgICAgIGdpZl9wdHItPnB0ZV9kYXRhX3B0cikgewotICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IEdJRl9TSUdfRVhURU5TSU9OOwotICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IEdJRl9CTE9DS19QVEU7Ci0gICAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gZ2lmX3B0ci0+cHRlX3B0ci0+YmxvY2tfc2l6ZTsKLSAgICBTZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+cHRlX3B0ci0+Z3JpZF9sZWZ0KTsKLSAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDI7Ci0gICAgU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwgZ2lmX3B0ci0+cHRlX3B0ci0+Z3JpZF90b3ApOwotICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsKLSAgICBTZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgZ2lmX3B0ci0+cHRlX3B0ci0+Z3JpZF93aWR0aCk7Ci0gICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOwotICAgIFNldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5wdGVfcHRyLT5ncmlkX2hlaWdodCk7Ci0gICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOwotICAgIFNldFdvcmRfTFNCRmlyc3QoZHN0X2J1ZiArIGdpZl9wdHItPmN1cl9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICBnaWZfcHRyLT5wdGVfcHRyLT5jaGFyX3dpZHRoKTsKLSAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDI7Ci0gICAgU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgIGdpZl9wdHItPnB0ZV9wdHItPmNoYXJfaGVpZ2h0KTsKLSAgICBnaWZfcHRyLT5jdXJfb2Zmc2V0ICs9IDI7Ci0gICAgU2V0V29yZF9MU0JGaXJzdChkc3RfYnVmICsgZ2lmX3B0ci0+Y3VyX29mZnNldCwgZ2lmX3B0ci0+cHRlX3B0ci0+ZmNfaW5kZXgpOwotICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gMjsKLSAgICBTZXRXb3JkX0xTQkZpcnN0KGRzdF9idWYgKyBnaWZfcHRyLT5jdXJfb2Zmc2V0LCBnaWZfcHRyLT5wdGVfcHRyLT5iY19pbmRleCk7Ci0gICAgZ2lmX3B0ci0+Y3VyX29mZnNldCArPSAyOwotICAgIGdpZl93cml0ZV9ibG9ja19kYXRhKGdpZl9wdHItPnB0ZV9kYXRhX3B0ciwgZ2lmX3B0ci0+cHRlX2RhdGFfbGVuLCBkc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9sZW4sIGdpZl9wdHItPmN1cl9vZmZzZXQpOwotICAgIGdpZl9wdHItPmN1cl9vZmZzZXQgKz0gZ2lmX3B0ci0+cHRlX2RhdGFfbGVuOwotICAgIGRzdF9idWZbZ2lmX3B0ci0+Y3VyX29mZnNldCsrXSA9IDA7Ci0gIH0KLSAgZHN0X2J1ZltnaWZfcHRyLT5jdXJfb2Zmc2V0KytdID0gR0lGX1NJR19UUkFJTEVSOwotICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgZ2lmX2VuY29kZShnaWZfY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwKLSAgICAgICAgICAgICAgICB1aW50OF90KiYgZHN0X2J1ZiwKLSAgICAgICAgICAgICAgICB1aW50MzJfdCYgZHN0X2xlbikgewotICBpZiAoIWdpZl93cml0ZV9oZWFkZXIoZ2lmX3B0ciwgZHN0X2J1ZiwgZHN0X2xlbikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgdWludDMyX3QgY3VyX29mZnNldCA9IGdpZl9wdHItPmN1cl9vZmZzZXQ7Ci0gIGJvb2wgcmVzID0gdHJ1ZTsKLSAgaWYgKGdpZl9wdHItPmZyYW1lcykgewotICAgIGdpZl9wdHItPmN1cl9vZmZzZXQtLTsKLSAgfQotICBpZiAoIWdpZl93cml0ZV9kYXRhKGdpZl9wdHIsIGRzdF9idWYsIGRzdF9sZW4pKSB7Ci0gICAgZ2lmX3B0ci0+Y3VyX29mZnNldCA9IGN1cl9vZmZzZXQ7Ci0gICAgcmVzID0gZmFsc2U7Ci0gIH0KLSAgZHN0X2xlbiA9IGdpZl9wdHItPmN1cl9vZmZzZXQ7Ci0gIGRzdF9idWZbZHN0X2xlbiAtIDFdID0gR0lGX1NJR19UUkFJTEVSOwotICBpZiAocmVzKSB7Ci0gICAgZ2lmX3B0ci0+ZnJhbWVzKys7Ci0gIH0KLSAgcmV0dXJuIHJlczsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvZnhjb2RlYy9sZ2lmL2Z4X2dpZi5oIGIvY29yZS9meGNvZGVjL2xnaWYvZnhfZ2lmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4Yjc4MGIuLjAwMDAwMDAKLS0tIGEvY29yZS9meGNvZGVjL2xnaWYvZnhfZ2lmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlhDT0RFQ19MR0lGX0ZYX0dJRl9IXwotI2RlZmluZSBDT1JFX0ZYQ09ERUNfTEdJRl9GWF9HSUZfSF8KLQotI2luY2x1ZGUgPHNldGptcC5oPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLQotI2RlZmluZSBHSUZfU0lHTkFUVVJFICJHSUYiCi0jZGVmaW5lIEdJRl9TSUdfRVhURU5TSU9OIDB4MjEKLSNkZWZpbmUgR0lGX1NJR19JTUFHRSAweDJDCi0jZGVmaW5lIEdJRl9TSUdfVFJBSUxFUiAweDNCCi0jZGVmaW5lIEdJRl9CTE9DS19HQ0UgMHhGOQotI2RlZmluZSBHSUZfQkxPQ0tfUFRFIDB4MDEKLSNkZWZpbmUgR0lGX0JMT0NLX0NFIDB4RkUKLSNkZWZpbmUgR0lGX0JMT0NLX0FFIDB4RkYKLSNkZWZpbmUgR0lGX0JMT0NLX1RFUk1JTkFMIDB4MDAKLSNkZWZpbmUgR0lGX01BWF9MWldfQ09ERSA0MDk2Ci0jZGVmaW5lIEdJRl9EQVRBX0JMT0NLIDI1NQotI2RlZmluZSBHSUZfTUFYX0VSUk9SX1NJWkUgMjU2Ci0jZGVmaW5lIEdJRl9EX1NUQVRVU19TSUcgMHgwMQotI2RlZmluZSBHSUZfRF9TVEFUVVNfVEFJTCAweDAyCi0jZGVmaW5lIEdJRl9EX1NUQVRVU19FWFQgMHgwMwotI2RlZmluZSBHSUZfRF9TVEFUVVNfRVhUX0FFIDB4MDQKLSNkZWZpbmUgR0lGX0RfU1RBVFVTX0VYVF9DRSAweDA1Ci0jZGVmaW5lIEdJRl9EX1NUQVRVU19FWFRfR0NFIDB4MDYKLSNkZWZpbmUgR0lGX0RfU1RBVFVTX0VYVF9QVEUgMHgwNwotI2RlZmluZSBHSUZfRF9TVEFUVVNfRVhUX1VORSAweDA4Ci0jZGVmaW5lIEdJRl9EX1NUQVRVU19JTUdfSU5GTyAweDA5Ci0jZGVmaW5lIEdJRl9EX1NUQVRVU19JTUdfREFUQSAweDBBCi0jcHJhZ21hIHBhY2soMSkKLXR5cGVkZWYgc3RydWN0IHRhZ0dpZkdGIHsKLSAgdWludDhfdCBwYWxfYml0cyA6IDM7Ci0gIHVpbnQ4X3Qgc29ydF9mbGFnIDogMTsKLSAgdWludDhfdCBjb2xvcl9yZXNvbHV0aW9uIDogMzsKLSAgdWludDhfdCBnbG9iYWxfcGFsIDogMTsKLX0gR2lmR0Y7Ci10eXBlZGVmIHN0cnVjdCB0YWdHaWZMRiB7Ci0gIHVpbnQ4X3QgcGFsX2JpdHMgOiAzOwotICB1aW50OF90IHJlc2VydmVkIDogMjsKLSAgdWludDhfdCBzb3J0X2ZsYWcgOiAxOwotICB1aW50OF90IGludGVybGFjZSA6IDE7Ci0gIHVpbnQ4X3QgbG9jYWxfcGFsIDogMTsKLX0gR2lmTEY7Ci10eXBlZGVmIHN0cnVjdCB0YWdHaWZIZWFkZXIgewotICBjaGFyIHNpZ25hdHVyZVszXTsKLSAgY2hhciB2ZXJzaW9uWzNdOwotfSBHaWZIZWFkZXI7Ci10eXBlZGVmIHN0cnVjdCB0YWdHaWZMU0QgewotICB1aW50MTZfdCB3aWR0aDsKLSAgdWludDE2X3QgaGVpZ2h0OwotICB1aW50OF90IGdsb2JhbF9mbGFnOwotICB1aW50OF90IGJjX2luZGV4OwotICB1aW50OF90IHBpeGVsX2FzcGVjdDsKLX0gR2lmTFNEOwotdHlwZWRlZiBzdHJ1Y3QgdGFnR2lmSW1hZ2VJbmZvIHsKLSAgdWludDE2X3QgbGVmdDsKLSAgdWludDE2X3QgdG9wOwotICB1aW50MTZfdCB3aWR0aDsKLSAgdWludDE2X3QgaGVpZ2h0OwotCi0gIHVpbnQ4X3QgbG9jYWxfZmxhZzsKLX0gR2lmSW1hZ2VJbmZvOwotdHlwZWRlZiBzdHJ1Y3QgdGFnR2lmQ0VGIHsKLSAgdWludDhfdCB0cmFuc3BhcmVuY3kgOiAxOwotICB1aW50OF90IHVzZXJfaW5wdXQgOiAxOwotICB1aW50OF90IGRpc3Bvc2FsX21ldGhvZCA6IDM7Ci0gIHVpbnQ4X3QgcmVzZXJ2ZWQgOiAzOwotfSBHaWZDRUY7Ci10eXBlZGVmIHN0cnVjdCB0YWdHaWZHQ0UgewotICB1aW50OF90IGJsb2NrX3NpemU7Ci0gIHVpbnQ4X3QgZ2NlX2ZsYWc7Ci0gIHVpbnQxNl90IGRlbGF5X3RpbWU7Ci0gIHVpbnQ4X3QgdHJhbnNfaW5kZXg7Ci19IEdpZkdDRTsKLXR5cGVkZWYgc3RydWN0IHRhZ0dpZlBURSB7Ci0gIHVpbnQ4X3QgYmxvY2tfc2l6ZTsKLSAgdWludDE2X3QgZ3JpZF9sZWZ0OwotICB1aW50MTZfdCBncmlkX3RvcDsKLSAgdWludDE2X3QgZ3JpZF93aWR0aDsKLSAgdWludDE2X3QgZ3JpZF9oZWlnaHQ7Ci0KLSAgdWludDhfdCBjaGFyX3dpZHRoOwotICB1aW50OF90IGNoYXJfaGVpZ2h0OwotCi0gIHVpbnQ4X3QgZmNfaW5kZXg7Ci0gIHVpbnQ4X3QgYmNfaW5kZXg7Ci19IEdpZlBURTsKLXR5cGVkZWYgc3RydWN0IHRhZ0dpZkFFIHsKLSAgdWludDhfdCBibG9ja19zaXplOwotICB1aW50OF90IGFwcF9pZGVudGlmeVs4XTsKLSAgdWludDhfdCBhcHBfYXV0aGVudGljYXRpb25bM107Ci19IEdpZkFFOwotdHlwZWRlZiBzdHJ1Y3QgdGFnR2lmUGFsZXR0ZSB7IHVpbnQ4X3QgciwgZywgYjsgfSBHaWZQYWxldHRlOwotI3ByYWdtYSBwYWNrKCkKLXR5cGVkZWYgc3RydWN0IHRhZ0dpZkltYWdlIHsKLSAgR2lmR0NFKiBpbWFnZV9nY2VfcHRyOwotICBHaWZQYWxldHRlKiBsb2NhbF9wYWxfcHRyOwotICBHaWZJbWFnZUluZm8qIGltYWdlX2luZm9fcHRyOwotICB1aW50OF90IGltYWdlX2NvZGVfc2l6ZTsKLSAgdWludDMyX3QgaW1hZ2VfZGF0YV9wb3M7Ci0gIHVpbnQ4X3QqIGltYWdlX3Jvd19idWY7Ci0gIGludDMyX3QgaW1hZ2Vfcm93X251bTsKLX0gR2lmSW1hZ2U7Ci0KLXR5cGVkZWYgc3RydWN0IHRhZ0dpZlBsYWluVGV4dCB7Ci0gIEdpZkdDRSogZ2NlX3B0cjsKLSAgR2lmUFRFKiBwdGVfcHRyOwotICBDRlhfQnl0ZVN0cmluZyogc3RyaW5nX3B0cjsKLX0gR2lmUGxhaW5UZXh0OwotCi1jbGFzcyBDR2lmTFpXRGVjb2RlciB7Ci0gcHVibGljOgotICBzdHJ1Y3QgdGFnX1RhYmxlIHsKLSAgICB1aW50MTZfdCBwcmVmaXg7Ci0gICAgdWludDhfdCBzdWZmaXg7Ci0gIH07Ci0KLSAgZXhwbGljaXQgQ0dpZkxaV0RlY29kZXIoRlhfQ0hBUiogZXJyb3JfcHRyKTsKLSAgfkNHaWZMWldEZWNvZGVyKCk7Ci0KLSAgdm9pZCBJbml0VGFibGUodWludDhfdCBjb2RlX2xlbik7Ci0gIGludDMyX3QgRGVjb2RlKHVpbnQ4X3QqIGRlc19idWYsIHVpbnQzMl90JiBkZXNfc2l6ZSk7Ci0gIHZvaWQgSW5wdXQodWludDhfdCogc3JjX2J1ZiwgdWludDMyX3Qgc3JjX3NpemUpOwotICB1aW50MzJfdCBHZXRBdmFpbElucHV0KCk7Ci0KLSBwcml2YXRlOgotICB2b2lkIENsZWFyVGFibGUoKTsKLSAgdm9pZCBBZGRDb2RlKHVpbnQxNl90IHByZWZpeF9jb2RlLCB1aW50OF90IGFwcGVuZF9jaGFyKTsKLSAgdm9pZCBEZWNvZGVTdHJpbmcodWludDE2X3QgY29kZSk7Ci0KLSAgdWludDhfdCBjb2RlX3NpemU7Ci0gIHVpbnQ4X3QgY29kZV9zaXplX2N1cjsKLSAgdWludDE2X3QgY29kZV9jbGVhcjsKLSAgdWludDE2X3QgY29kZV9lbmQ7Ci0gIHVpbnQxNl90IGNvZGVfbmV4dDsKLSAgdWludDhfdCBjb2RlX2ZpcnN0OwotICB1aW50OF90IHN0YWNrW0dJRl9NQVhfTFpXX0NPREVdOwotICB1aW50MTZfdCBzdGFja19zaXplOwotICB0YWdfVGFibGUgY29kZV90YWJsZVtHSUZfTUFYX0xaV19DT0RFXTsKLSAgdWludDE2X3QgY29kZV9vbGQ7Ci0KLSAgdWludDhfdCogbmV4dF9pbjsKLSAgdWludDMyX3QgYXZhaWxfaW47Ci0KLSAgdWludDhfdCBiaXRzX2xlZnQ7Ci0gIHVpbnQzMl90IGNvZGVfc3RvcmU7Ci0KLSAgRlhfQ0hBUiogZXJyX21zZ19wdHI7Ci19OwotCi1jbGFzcyBDR2lmTFpXRW5jb2RlciB7Ci0gcHVibGljOgotICBzdHJ1Y3QgdGFnX1RhYmxlIHsKLSAgICB1aW50MTZfdCBwcmVmaXg7Ci0gICAgdWludDhfdCBzdWZmaXg7Ci0gIH07Ci0KLSAgQ0dpZkxaV0VuY29kZXIoKTsKLSAgfkNHaWZMWldFbmNvZGVyKCk7Ci0KLSAgdm9pZCBTdGFydCh1aW50OF90IGNvZGVfbGVuLAotICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCi0gICAgICAgICAgICAgdWludDhfdComIGRzdF9idWYsCi0gICAgICAgICAgICAgdWludDMyX3QmIG9mZnNldCk7Ci0gIGJvb2wgRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCi0gICAgICAgICAgICAgIHVpbnQzMl90IHNyY19sZW4sCi0gICAgICAgICAgICAgIHVpbnQ4X3QqJiBkc3RfYnVmLAotICAgICAgICAgICAgICB1aW50MzJfdCYgZHN0X2xlbiwKLSAgICAgICAgICAgICAgdWludDMyX3QmIG9mZnNldCk7Ci0gIHZvaWQgRmluaXNoKHVpbnQ4X3QqJiBkc3RfYnVmLCB1aW50MzJfdCYgZHN0X2xlbiwgdWludDMyX3QmIG9mZnNldCk7Ci0KLSBwcml2YXRlOgotICB2b2lkIENsZWFyVGFibGUoKTsKLSAgYm9vbCBMb29rVXBJblRhYmxlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgdWludDMyX3QmIG9mZnNldCwgdWludDhfdCYgYml0X29mZnNldCk7Ci0gIHZvaWQgRW5jb2RlU3RyaW5nKHVpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgZHN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIGRzdF9sZW4sCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBvZmZzZXQpOwotICB2b2lkIFdyaXRlQmxvY2sodWludDhfdComIGRzdF9idWYsIHVpbnQzMl90JiBkc3RfbGVuLCB1aW50MzJfdCYgb2Zmc2V0KTsKLQotICBqbXBfYnVmIGptcDsKLSAgdWludDMyX3Qgc3JjX29mZnNldDsKLSAgdWludDhfdCBzcmNfYml0X29mZnNldDsKLSAgdWludDhfdCBzcmNfYml0X2N1dDsKLSAgdWludDMyX3Qgc3JjX2JpdF9udW07Ci0gIHVpbnQ4X3QgY29kZV9zaXplOwotICB1aW50MTZfdCBjb2RlX2NsZWFyOwotICB1aW50MTZfdCBjb2RlX2VuZDsKLSAgdWludDE2X3QgaW5kZXhfbnVtOwotICB1aW50OF90IGJpdF9vZmZzZXQ7Ci0gIHVpbnQ4X3QgaW5kZXhfYml0X2N1cjsKLSAgdWludDhfdCBpbmRleF9idWZbR0lGX0RBVEFfQkxPQ0tdOwotICB1aW50OF90IGluZGV4X2J1Zl9sZW47Ci0gIHRhZ19UYWJsZSBjb2RlX3RhYmxlW0dJRl9NQVhfTFpXX0NPREVdOwotICB1aW50MTZfdCB0YWJsZV9jdXI7Ci19OwotCi10eXBlZGVmIHN0cnVjdCB0YWdfZ2lmX2RlY29tcHJlc3Nfc3RydWN0IGdpZl9kZWNvbXByZXNzX3N0cnVjdDsKLXR5cGVkZWYgZ2lmX2RlY29tcHJlc3Nfc3RydWN0KiBnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcDsKLXR5cGVkZWYgZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AqIGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wcDsKLXN0YXRpYyBjb25zdCBpbnQzMl90IHNfZ2lmX2ludGVybGFjZV9zdGVwWzRdID0gezgsIDgsIDQsIDJ9Owotc3RydWN0IHRhZ19naWZfZGVjb21wcmVzc19zdHJ1Y3QgewotICBqbXBfYnVmIGptcGJ1ZjsKLSAgRlhfQ0hBUiogZXJyX3B0cjsKLSAgdm9pZCAoKmdpZl9lcnJvcl9mbikoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgY29uc3QgRlhfQ0hBUiogZXJyX21zZyk7Ci0gIHZvaWQqIGNvbnRleHRfcHRyOwotICBpbnQgd2lkdGg7Ci0gIGludCBoZWlnaHQ7Ci0gIEdpZlBhbGV0dGUqIGdsb2JhbF9wYWxfcHRyOwotICBpbnQzMl90IGdsb2JhbF9wYWxfbnVtOwotICB1aW50OF90IGdsb2JhbF9zb3J0X2ZsYWc7Ci0gIHVpbnQ4X3QgZ2xvYmFsX2NvbG9yX3Jlc29sdXRpb247Ci0KLSAgdWludDhfdCBiY19pbmRleDsKLSAgdWludDhfdCBwaXhlbF9hc3BlY3Q7Ci0gIENHaWZMWldEZWNvZGVyKiBpbWdfZGVjb2Rlcl9wdHI7Ci0gIHVpbnQzMl90IGltZ19yb3dfb2Zmc2V0OwotICB1aW50MzJfdCBpbWdfcm93X2F2YWlsX3NpemU7Ci0gIHVpbnQ4X3QgaW1nX3Bhc3NfbnVtOwotICBzdGQ6OnZlY3RvcjxHaWZJbWFnZSo+KiBpbWdfcHRyX2Fycl9wdHI7Ci0gIHVpbnQ4X3QqICgqZ2lmX2Fza19idWZfZm9yX3BhbF9mbikoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBhbF9zaXplKTsKLSAgdWludDhfdCogbmV4dF9pbjsKLSAgdWludDMyX3QgYXZhaWxfaW47Ci0gIGludDMyX3QgZGVjb2RlX3N0YXR1czsKLSAgdWludDMyX3Qgc2tpcF9zaXplOwotICB2b2lkICgqZ2lmX3JlY29yZF9jdXJyZW50X3Bvc2l0aW9uX2ZuKShnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY3VyX3Bvc19wdHIpOwotICB2b2lkICgqZ2lmX2dldF9yb3dfZm4pKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByb3dfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHJvd19idWYpOwotICBib29sICgqZ2lmX2dldF9yZWNvcmRfcG9zaXRpb25fZm4pKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY3VyX3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBhbF9udW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFsX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRlbGF5X3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VyX2lucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHJhbnNfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkaXNwb3NhbF9tZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbnRlcmxhY2UpOwotICBDRlhfQnl0ZVN0cmluZyogY210X2RhdGFfcHRyOwotICBHaWZHQ0UqIGdjZV9wdHI7Ci0gIHN0ZDo6dmVjdG9yPEdpZlBsYWluVGV4dCo+KiBwdF9wdHJfYXJyX3B0cjsKLX07Ci10eXBlZGVmIHN0cnVjdCB0YWdfZ2lmX2NvbXByZXNzX3N0cnVjdCBnaWZfY29tcHJlc3Nfc3RydWN0OwotdHlwZWRlZiBnaWZfY29tcHJlc3Nfc3RydWN0KiBnaWZfY29tcHJlc3Nfc3RydWN0X3A7Ci10eXBlZGVmIGdpZl9jb21wcmVzc19zdHJ1Y3RfcCogZ2lmX2NvbXByZXNzX3N0cnVjdF9wcDsKLXN0cnVjdCB0YWdfZ2lmX2NvbXByZXNzX3N0cnVjdCB7Ci0gIGNvbnN0IHVpbnQ4X3QqIHNyY19idWY7Ci0gIHVpbnQzMl90IHNyY19waXRjaDsKLSAgdWludDMyX3Qgc3JjX3dpZHRoOwotICB1aW50MzJfdCBzcmNfcm93OwotICB1aW50MzJfdCBjdXJfb2Zmc2V0OwotICB1aW50MzJfdCBmcmFtZXM7Ci0gIEdpZkhlYWRlciogaGVhZGVyX3B0cjsKLSAgR2lmTFNEKiBsc2RfcHRyOwotICBHaWZQYWxldHRlKiBnbG9iYWxfcGFsOwotICB1aW50MTZfdCBncGFsX251bTsKLSAgR2lmUGFsZXR0ZSogbG9jYWxfcGFsOwotICB1aW50MTZfdCBscGFsX251bTsKLSAgR2lmSW1hZ2VJbmZvKiBpbWFnZV9pbmZvX3B0cjsKLSAgQ0dpZkxaV0VuY29kZXIqIGltZ19lbmNvZGVyX3B0cjsKLQotICB1aW50OF90KiBjbXRfZGF0YV9wdHI7Ci0gIHVpbnQzMl90IGNtdF9kYXRhX2xlbjsKLSAgR2lmR0NFKiBnY2VfcHRyOwotICBHaWZQVEUqIHB0ZV9wdHI7Ci0gIGNvbnN0IHVpbnQ4X3QqIHB0ZV9kYXRhX3B0cjsKLSAgdWludDMyX3QgcHRlX2RhdGFfbGVuOwotfTsKLQotdm9pZCBnaWZfZXJyb3IoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgY29uc3QgRlhfQ0hBUiogZXJyX21zZyk7Ci12b2lkIGdpZl93YXJuKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIGNvbnN0IEZYX0NIQVIqIGVycl9tc2cpOwotZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX2NyZWF0ZV9kZWNvbXByZXNzKCk7Ci12b2lkIGdpZl9kZXN0cm95X2RlY29tcHJlc3MoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3BwIGdpZl9wdHJfcHRyKTsKLWdpZl9jb21wcmVzc19zdHJ1Y3RfcCBnaWZfY3JlYXRlX2NvbXByZXNzKCk7Ci12b2lkIGdpZl9kZXN0cm95X2NvbXByZXNzKGdpZl9jb21wcmVzc19zdHJ1Y3RfcHAgZ2lmX3B0cl9wdHIpOwotaW50MzJfdCBnaWZfcmVhZF9oZWFkZXIoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0cik7Ci1pbnQzMl90IGdpZl9nZXRfZnJhbWUoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0cik7Ci1pbnQzMl90IGdpZl9nZXRfZnJhbWVfbnVtKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIpOwotaW50MzJfdCBnaWZfZGVjb2RlX2V4dGVuc2lvbihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyKTsKLWludDMyX3QgZ2lmX2RlY29kZV9pbWFnZV9pbmZvKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIpOwotdm9pZCBnaWZfdGFrZW92ZXJfZ2NlX3B0cihnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBHaWZHQ0UqKiBnY2VfcHRyX3B0cik7Ci1pbnQzMl90IGdpZl9sb2FkX2ZyYW1lKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsIGludDMyX3QgZnJhbWVfbnVtKTsKLXVpbnQ4X3QqIGdpZl9yZWFkX2RhdGEoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGRlc19idWZfcHAsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRhdGFfc2l6ZSk7Ci12b2lkIGdpZl9kZWNvZGluZ19mYWlsdXJlX2F0X3RhaWxfY2xlYW51cChnaWZfZGVjb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2lmSW1hZ2UqIGdpZl9pbWFnZV9wdHIpOwotdm9pZCBnaWZfc2F2ZV9kZWNvZGluZ19zdGF0dXMoZ2lmX2RlY29tcHJlc3Nfc3RydWN0X3AgZ2lmX3B0ciwgaW50MzJfdCBzdGF0dXMpOwotdm9pZCBnaWZfaW5wdXRfYnVmZmVyKGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc3JjX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc2l6ZSk7Ci11aW50MzJfdCBnaWZfZ2V0X2F2YWlsX2lucHV0KGdpZl9kZWNvbXByZXNzX3N0cnVjdF9wIGdpZl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBhdmFpbF9idWZfcHRyKTsKLXZvaWQgaW50ZXJsYWNlX2J1Zihjb25zdCB1aW50OF90KiBidWYsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOwotYm9vbCBnaWZfZW5jb2RlKGdpZl9jb21wcmVzc19zdHJ1Y3RfcCBnaWZfcHRyLAotICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBkc3RfYnVmLAotICAgICAgICAgICAgICAgIHVpbnQzMl90JiBkc3RfbGVuKTsKLQotI2VuZGlmICAvLyBDT1JFX0ZYQ09ERUNfTEdJRl9GWF9HSUZfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvYXV0b3Jlc3RvcmVyLmggYi9jb3JlL2Z4Y3J0L2F1dG9yZXN0b3Jlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NWE1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2F1dG9yZXN0b3Jlci5oCkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX0FVVE9SRVNUT1JFUl9IXworI2RlZmluZSBDT1JFX0ZYQ1JUX0FVVE9SRVNUT1JFUl9IXworCituYW1lc3BhY2UgZnhjcnQgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEF1dG9SZXN0b3JlciB7CisgcHVibGljOgorICBleHBsaWNpdCBBdXRvUmVzdG9yZXIoVCogbG9jYXRpb24pCisgICAgICA6IG1fTG9jYXRpb24obG9jYXRpb24pLCBtX09sZFZhbHVlKCpsb2NhdGlvbikge30KKyAgfkF1dG9SZXN0b3JlcigpIHsgKm1fTG9jYXRpb24gPSBtX09sZFZhbHVlOyB9CisKKyBwcml2YXRlOgorICBUKiBjb25zdCBtX0xvY2F0aW9uOworICBjb25zdCBUIG1fT2xkVmFsdWU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZnhjcnQKKwordXNpbmcgZnhjcnQ6OkF1dG9SZXN0b3JlcjsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0FVVE9SRVNUT1JFUl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9ieXRlc3RyaW5nLmNwcCBiL2NvcmUvZnhjcnQvYnl0ZXN0cmluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiMTM3OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvYnl0ZXN0cmluZy5jcHAKQEAgLTAsMCArMSw4MDggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvYnl0ZXN0cmluZy5oIgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3V0ZjhkZWNvZGVyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb2RlcGFnZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9zdHJpbmdfcG9vbF90ZW1wbGF0ZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9tYXRoLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorCit0ZW1wbGF0ZSBjbGFzcyBmeGNydDo6U3RyaW5nRGF0YVRlbXBsYXRlPGNoYXI+OwordGVtcGxhdGUgY2xhc3MgZnhjcnQ6OlN0cmluZ1ZpZXdUZW1wbGF0ZTxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIGZ4Y3J0OjpTdHJpbmdQb29sVGVtcGxhdGU8Qnl0ZVN0cmluZz47Cit0ZW1wbGF0ZSBzdHJ1Y3Qgc3RkOjpoYXNoPEJ5dGVTdHJpbmc+OworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBrVHJpbUNoYXJzW10gPSAiXHgwOVx4MGFceDBiXHgwY1x4MGRceDIwIjsKKworY29uc3QgY2hhciogRlhfc3Ryc3RyKGNvbnN0IGNoYXIqIGhheXN0YWNrLAorICAgICAgICAgICAgICAgICAgICAgIGludCBoYXlzdGFja19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmVlZGxlLAorICAgICAgICAgICAgICAgICAgICAgIGludCBuZWVkbGVfbGVuKSB7CisgIGlmIChuZWVkbGVfbGVuID4gaGF5c3RhY2tfbGVuIHx8IG5lZWRsZV9sZW4gPT0gMCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGNvbnN0IGNoYXIqIGVuZF9wdHIgPSBoYXlzdGFjayArIGhheXN0YWNrX2xlbiAtIG5lZWRsZV9sZW47CisgIHdoaWxlIChoYXlzdGFjayA8PSBlbmRfcHRyKSB7CisgICAgaW50IGkgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICBpZiAoaGF5c3RhY2tbaV0gIT0gbmVlZGxlW2ldKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaSsrOworICAgICAgaWYgKGkgPT0gbmVlZGxlX2xlbikgeworICAgICAgICByZXR1cm4gaGF5c3RhY2s7CisgICAgICB9CisgICAgfQorICAgIGhheXN0YWNrKys7CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKKyNpZm5kZWYgTkRFQlVHCitib29sIElzVmFsaWRDb2RlUGFnZSh1aW50MTZfdCBjb2RlcGFnZSkgeworICBzd2l0Y2ggKGNvZGVwYWdlKSB7CisgICAgY2FzZSBGWF9DT0RFUEFHRV9EZWZBTlNJOgorICAgIGNhc2UgRlhfQ09ERVBBR0VfU2hpZnRKSVM6CisgICAgY2FzZSBGWF9DT0RFUEFHRV9DaGluZXNlU2ltcGxpZmllZDoKKyAgICBjYXNlIEZYX0NPREVQQUdFX0hhbmd1bDoKKyAgICBjYXNlIEZYX0NPREVQQUdFX0NoaW5lc2VUcmFkaXRpb25hbDoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKyNlbmRpZgorCitCeXRlU3RyaW5nIEdldEJ5dGVTdHJpbmcodWludDE2X3QgY29kZXBhZ2UsIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c3RyKSB7CisjaWZuZGVmIE5ERUJVRworICBBU1NFUlQoSXNWYWxpZENvZGVQYWdlKGNvZGVwYWdlKSk7CisjZW5kaWYKKworICBpbnQgc3JjX2xlbiA9IHdzdHIuR2V0TGVuZ3RoKCk7CisgIGludCBkZXN0X2xlbiA9CisgICAgICBGWFNZU19XaWRlQ2hhclRvTXVsdGlCeXRlKGNvZGVwYWdlLCAwLCB3c3RyLnVudGVybWluYXRlZF9jX3N0cigpLCBzcmNfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAwLCBudWxscHRyLCBudWxscHRyKTsKKyAgaWYgKCFkZXN0X2xlbikKKyAgICByZXR1cm4gQnl0ZVN0cmluZygpOworCisgIEJ5dGVTdHJpbmcgYnN0cjsKKyAgY2hhciogZGVzdF9idWYgPSBic3RyLkdldEJ1ZmZlcihkZXN0X2xlbik7CisgIEZYU1lTX1dpZGVDaGFyVG9NdWx0aUJ5dGUoY29kZXBhZ2UsIDAsIHdzdHIudW50ZXJtaW5hdGVkX2Nfc3RyKCksIHNyY19sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9idWYsIGRlc3RfbGVuLCBudWxscHRyLCBudWxscHRyKTsKKyAgYnN0ci5SZWxlYXNlQnVmZmVyKGRlc3RfbGVuKTsKKyAgcmV0dXJuIGJzdHI7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgZnhjcnQgeworCitzdGF0aWNfYXNzZXJ0KHNpemVvZihCeXRlU3RyaW5nKSA8PSBzaXplb2YoY2hhciopLAorICAgICAgICAgICAgICAiU3RyaW5ncyBtdXN0IG5vdCByZXF1aXJlIG1vcmUgc3BhY2UgdGhhbiBwb2ludGVycyIpOworCisjZGVmaW5lIEZPUkNFX0FOU0kgMHgxMDAwMAorI2RlZmluZSBGT1JDRV9VTklDT0RFIDB4MjAwMDAKKyNkZWZpbmUgRk9SQ0VfSU5UNjQgMHg0MDAwMAorCisvLyBzdGF0aWMKK0J5dGVTdHJpbmcgQnl0ZVN0cmluZzo6Rm9ybWF0SW50ZWdlcihpbnQgaSkgeworICBjaGFyIGJ1ZlszMl07CisgIEZYU1lTX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZCIsIGkpOworICByZXR1cm4gQnl0ZVN0cmluZyhidWYpOworfQorCisvLyBzdGF0aWMKK0J5dGVTdHJpbmcgQnl0ZVN0cmluZzo6Rm9ybWF0RmxvYXQoZmxvYXQgZCkgeworICBjaGFyIGJ1ZlszMl07CisgIHJldHVybiBCeXRlU3RyaW5nKGJ1ZiwgRlhfZnRvYShkLCBidWYpKTsKK30KKworLy8gc3RhdGljCitCeXRlU3RyaW5nIEJ5dGVTdHJpbmc6OkZvcm1hdFYoY29uc3QgY2hhciogcEZvcm1hdCwgdmFfbGlzdCBhcmdMaXN0KSB7CisgIHZhX2xpc3QgYXJnTGlzdENvcHk7CisgIHZhX2NvcHkoYXJnTGlzdENvcHksIGFyZ0xpc3QpOworICBpbnQgbk1heExlbiA9IHZzbnByaW50ZihudWxscHRyLCAwLCBwRm9ybWF0LCBhcmdMaXN0Q29weSk7CisgIHZhX2VuZChhcmdMaXN0Q29weSk7CisKKyAgaWYgKG5NYXhMZW4gPD0gMCkKKyAgICByZXR1cm4gIiI7CisKKyAgQnl0ZVN0cmluZyByZXQ7CisgIGNoYXIqIGJ1ZiA9IHJldC5HZXRCdWZmZXIobk1heExlbik7CisgIGlmIChidWYpIHsKKyAgICAvLyBJbiB0aGUgZm9sbG93aW5nIHR3byBjYWxscywgdGhlcmUncyBhbHdheXMgc3BhY2UgaW4gdGhlIGJ1ZmZlciBmb3IKKyAgICAvLyBhIHRlcm1pbmF0aW5nIE5VTCB0aGF0J3Mgbm90IGluY2x1ZGVkIGluIG5NYXhMZW4uCisgICAgbWVtc2V0KGJ1ZiwgMCwgbk1heExlbiArIDEpOworICAgIHZhX2NvcHkoYXJnTGlzdENvcHksIGFyZ0xpc3QpOworICAgIHZzbnByaW50ZihidWYsIG5NYXhMZW4gKyAxLCBwRm9ybWF0LCBhcmdMaXN0Q29weSk7CisgICAgdmFfZW5kKGFyZ0xpc3RDb3B5KTsKKyAgICByZXQuUmVsZWFzZUJ1ZmZlcihyZXQuR2V0U3RyaW5nTGVuZ3RoKCkpOworICB9CisgIHJldHVybiByZXQ7Cit9CisKKy8vIHN0YXRpYworQnl0ZVN0cmluZyBCeXRlU3RyaW5nOjpGb3JtYXQoY29uc3QgY2hhciogcEZvcm1hdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnTGlzdDsKKyAgdmFfc3RhcnQoYXJnTGlzdCwgcEZvcm1hdCk7CisgIEJ5dGVTdHJpbmcgcmV0ID0gRm9ybWF0VihwRm9ybWF0LCBhcmdMaXN0KTsKKyAgdmFfZW5kKGFyZ0xpc3QpOworCisgIHJldHVybiByZXQ7Cit9CisKK0J5dGVTdHJpbmc6OkJ5dGVTdHJpbmcoY29uc3QgY2hhciogcFN0ciwgc2l6ZV90IG5MZW4pIHsKKyAgaWYgKG5MZW4pCisgICAgbV9wRGF0YS5SZXNldChTdHJpbmdEYXRhOjpDcmVhdGUocFN0ciwgbkxlbikpOworfQorCitCeXRlU3RyaW5nOjpCeXRlU3RyaW5nKGNvbnN0IHVpbnQ4X3QqIHBTdHIsIHNpemVfdCBuTGVuKSB7CisgIGlmIChuTGVuKQorICAgIG1fcERhdGEuUmVzZXQoCisgICAgICAgIFN0cmluZ0RhdGE6OkNyZWF0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwU3RyKSwgbkxlbikpOworfQorCitCeXRlU3RyaW5nOjpCeXRlU3RyaW5nKCkge30KKworQnl0ZVN0cmluZzo6Qnl0ZVN0cmluZyhjb25zdCBCeXRlU3RyaW5nJiBvdGhlcikgOiBtX3BEYXRhKG90aGVyLm1fcERhdGEpIHt9CisKK0J5dGVTdHJpbmc6OkJ5dGVTdHJpbmcoQnl0ZVN0cmluZyYmIG90aGVyKSBub2V4Y2VwdCB7CisgIG1fcERhdGEuU3dhcChvdGhlci5tX3BEYXRhKTsKK30KKworQnl0ZVN0cmluZzo6Qnl0ZVN0cmluZyhjaGFyIGNoKSB7CisgIG1fcERhdGEuUmVzZXQoU3RyaW5nRGF0YTo6Q3JlYXRlKDEpKTsKKyAgbV9wRGF0YS0+bV9TdHJpbmdbMF0gPSBjaDsKK30KKworQnl0ZVN0cmluZzo6Qnl0ZVN0cmluZyhjb25zdCBjaGFyKiBwdHIpCisgICAgOiBCeXRlU3RyaW5nKHB0ciwgcHRyID8gc3RybGVuKHB0cikgOiAwKSB7fQorCitCeXRlU3RyaW5nOjpCeXRlU3RyaW5nKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHJpbmdTcmMpIHsKKyAgaWYgKCFzdHJpbmdTcmMuSXNFbXB0eSgpKQorICAgIG1fcERhdGEuUmVzZXQoU3RyaW5nRGF0YTo6Q3JlYXRlKHN0cmluZ1NyYy51bnRlcm1pbmF0ZWRfY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdTcmMuR2V0TGVuZ3RoKCkpKTsKK30KKworQnl0ZVN0cmluZzo6Qnl0ZVN0cmluZyhjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyMSwgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN0cjIpIHsKKyAgRlhfU0FGRV9TSVpFX1QgblNhZmVMZW4gPSBzdHIxLkdldExlbmd0aCgpOworICBuU2FmZUxlbiArPSBzdHIyLkdldExlbmd0aCgpOworCisgIHNpemVfdCBuTmV3TGVuID0gblNhZmVMZW4uVmFsdWVPckRpZSgpOworICBpZiAobk5ld0xlbiA9PSAwKQorICAgIHJldHVybjsKKworICBtX3BEYXRhLlJlc2V0KFN0cmluZ0RhdGE6OkNyZWF0ZShuTmV3TGVuKSk7CisgIG1fcERhdGEtPkNvcHlDb250ZW50cyhzdHIxLnVudGVybWluYXRlZF9jX3N0cigpLCBzdHIxLkdldExlbmd0aCgpKTsKKyAgbV9wRGF0YS0+Q29weUNvbnRlbnRzQXQoc3RyMS5HZXRMZW5ndGgoKSwgc3RyMi51bnRlcm1pbmF0ZWRfY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyMi5HZXRMZW5ndGgoKSk7Cit9CisKK0J5dGVTdHJpbmc6OkJ5dGVTdHJpbmcoY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PEJ5dGVTdHJpbmdWaWV3PiYgbGlzdCkgeworICBGWF9TQUZFX1NJWkVfVCBuU2FmZUxlbiA9IDA7CisgIGZvciAoY29uc3QgYXV0byYgaXRlbSA6IGxpc3QpCisgICAgblNhZmVMZW4gKz0gaXRlbS5HZXRMZW5ndGgoKTsKKworICBzaXplX3Qgbk5ld0xlbiA9IG5TYWZlTGVuLlZhbHVlT3JEaWUoKTsKKyAgaWYgKG5OZXdMZW4gPT0gMCkKKyAgICByZXR1cm47CisKKyAgbV9wRGF0YS5SZXNldChTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbikpOworCisgIHNpemVfdCBuT2Zmc2V0ID0gMDsKKyAgZm9yIChjb25zdCBhdXRvJiBpdGVtIDogbGlzdCkgeworICAgIG1fcERhdGEtPkNvcHlDb250ZW50c0F0KG5PZmZzZXQsIGl0ZW0udW50ZXJtaW5hdGVkX2Nfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5HZXRMZW5ndGgoKSk7CisgICAgbk9mZnNldCArPSBpdGVtLkdldExlbmd0aCgpOworICB9Cit9CisKK0J5dGVTdHJpbmc6OkJ5dGVTdHJpbmcoY29uc3Qgc3RkOjpvc3RyaW5nc3RyZWFtJiBvdXRTdHJlYW0pIHsKKyAgc3RkOjpzdHJpbmcgc3RyID0gb3V0U3RyZWFtLnN0cigpOworICBpZiAoc3RyLmxlbmd0aCgpID4gMCkKKyAgICBtX3BEYXRhLlJlc2V0KFN0cmluZ0RhdGE6OkNyZWF0ZShzdHIuY19zdHIoKSwgc3RyLmxlbmd0aCgpKSk7Cit9CisKK0J5dGVTdHJpbmc6On5CeXRlU3RyaW5nKCkge30KKworY29uc3QgQnl0ZVN0cmluZyYgQnl0ZVN0cmluZzo6b3BlcmF0b3I9KGNvbnN0IGNoYXIqIHBTdHIpIHsKKyAgaWYgKCFwU3RyIHx8ICFwU3RyWzBdKQorICAgIGNsZWFyKCk7CisgIGVsc2UKKyAgICBBc3NpZ25Db3B5KHBTdHIsIHN0cmxlbihwU3RyKSk7CisKKyAgcmV0dXJuICp0aGlzOworfQorCitjb25zdCBCeXRlU3RyaW5nJiBCeXRlU3RyaW5nOjpvcGVyYXRvcj0oY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN0cmluZ1NyYykgeworICBpZiAoc3RyaW5nU3JjLklzRW1wdHkoKSkKKyAgICBjbGVhcigpOworICBlbHNlCisgICAgQXNzaWduQ29weShzdHJpbmdTcmMudW50ZXJtaW5hdGVkX2Nfc3RyKCksIHN0cmluZ1NyYy5HZXRMZW5ndGgoKSk7CisKKyAgcmV0dXJuICp0aGlzOworfQorCitjb25zdCBCeXRlU3RyaW5nJiBCeXRlU3RyaW5nOjpvcGVyYXRvcj0oY29uc3QgQnl0ZVN0cmluZyYgc3RyaW5nU3JjKSB7CisgIGlmIChtX3BEYXRhICE9IHN0cmluZ1NyYy5tX3BEYXRhKQorICAgIG1fcERhdGEgPSBzdHJpbmdTcmMubV9wRGF0YTsKKworICByZXR1cm4gKnRoaXM7Cit9CisKK2NvbnN0IEJ5dGVTdHJpbmcmIEJ5dGVTdHJpbmc6Om9wZXJhdG9yKz0oY29uc3QgY2hhciogcFN0cikgeworICBpZiAocFN0cikKKyAgICBDb25jYXQocFN0ciwgc3RybGVuKHBTdHIpKTsKKworICByZXR1cm4gKnRoaXM7Cit9CisKK2NvbnN0IEJ5dGVTdHJpbmcmIEJ5dGVTdHJpbmc6Om9wZXJhdG9yKz0oY2hhciBjaCkgeworICBDb25jYXQoJmNoLCAxKTsKKyAgcmV0dXJuICp0aGlzOworfQorCitjb25zdCBCeXRlU3RyaW5nJiBCeXRlU3RyaW5nOjpvcGVyYXRvcis9KGNvbnN0IEJ5dGVTdHJpbmcmIHN0cikgeworICBpZiAoc3RyLm1fcERhdGEpCisgICAgQ29uY2F0KHN0ci5tX3BEYXRhLT5tX1N0cmluZywgc3RyLm1fcERhdGEtPm1fbkRhdGFMZW5ndGgpOworCisgIHJldHVybiAqdGhpczsKK30KKworY29uc3QgQnl0ZVN0cmluZyYgQnl0ZVN0cmluZzo6b3BlcmF0b3IrPShjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyKSB7CisgIGlmICghc3RyLklzRW1wdHkoKSkKKyAgICBDb25jYXQoc3RyLnVudGVybWluYXRlZF9jX3N0cigpLCBzdHIuR2V0TGVuZ3RoKCkpOworCisgIHJldHVybiAqdGhpczsKK30KKworYm9vbCBCeXRlU3RyaW5nOjpvcGVyYXRvcj09KGNvbnN0IGNoYXIqIHB0cikgY29uc3QgeworICBpZiAoIW1fcERhdGEpCisgICAgcmV0dXJuICFwdHIgfHwgIXB0clswXTsKKworICBpZiAoIXB0cikKKyAgICByZXR1cm4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9PSAwOworCisgIHJldHVybiBzdHJsZW4ocHRyKSA9PSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICYmCisgICAgICAgICBtZW1jbXAocHRyLCBtX3BEYXRhLT5tX1N0cmluZywgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgPT0gMDsKK30KKworYm9vbCBCeXRlU3RyaW5nOjpvcGVyYXRvcj09KGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIpIGNvbnN0IHsKKyAgaWYgKCFtX3BEYXRhKQorICAgIHJldHVybiBzdHIuSXNFbXB0eSgpOworCisgIHJldHVybiBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID09IHN0ci5HZXRMZW5ndGgoKSAmJgorICAgICAgICAgbWVtY21wKG1fcERhdGEtPm1fU3RyaW5nLCBzdHIudW50ZXJtaW5hdGVkX2Nfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSkgPT0KKyAgICAgICAgICAgICAwOworfQorCitib29sIEJ5dGVTdHJpbmc6Om9wZXJhdG9yPT0oY29uc3QgQnl0ZVN0cmluZyYgb3RoZXIpIGNvbnN0IHsKKyAgaWYgKG1fcERhdGEgPT0gb3RoZXIubV9wRGF0YSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoSXNFbXB0eSgpKQorICAgIHJldHVybiBvdGhlci5Jc0VtcHR5KCk7CisKKyAgaWYgKG90aGVyLklzRW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIG90aGVyLm1fcERhdGEtPm1fbkRhdGFMZW5ndGggPT0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAmJgorICAgICAgICAgbWVtY21wKG90aGVyLm1fcERhdGEtPm1fU3RyaW5nLCBtX3BEYXRhLT5tX1N0cmluZywKKyAgICAgICAgICAgICAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSA9PSAwOworfQorCitib29sIEJ5dGVTdHJpbmc6Om9wZXJhdG9yPChjb25zdCBjaGFyKiBwdHIpIGNvbnN0IHsKKyAgaWYgKCFtX3BEYXRhICYmICFwdHIpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoY19zdHIoKSA9PSBwdHIpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHNpemVfdCBsZW4gPSBHZXRMZW5ndGgoKTsKKyAgc2l6ZV90IG90aGVyX2xlbiA9IHB0ciA/IHN0cmxlbihwdHIpIDogMDsKKyAgaW50IHJlc3VsdCA9IG1lbWNtcChjX3N0cigpLCBwdHIsIHN0ZDo6bWluKGxlbiwgb3RoZXJfbGVuKSk7CisgIHJldHVybiByZXN1bHQgPCAwIHx8IChyZXN1bHQgPT0gMCAmJiBsZW4gPCBvdGhlcl9sZW4pOworfQorCitib29sIEJ5dGVTdHJpbmc6Om9wZXJhdG9yPChjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyKSBjb25zdCB7CisgIHJldHVybiBDb21wYXJlKHN0cikgPCAwOworfQorCitib29sIEJ5dGVTdHJpbmc6Om9wZXJhdG9yPChjb25zdCBCeXRlU3RyaW5nJiBvdGhlcikgY29uc3QgeworICBpZiAobV9wRGF0YSA9PSBvdGhlci5tX3BEYXRhKQorICAgIHJldHVybiBmYWxzZTsKKworICBzaXplX3QgbGVuID0gR2V0TGVuZ3RoKCk7CisgIHNpemVfdCBvdGhlcl9sZW4gPSBvdGhlci5HZXRMZW5ndGgoKTsKKyAgaW50IHJlc3VsdCA9IG1lbWNtcChjX3N0cigpLCBvdGhlci5jX3N0cigpLCBzdGQ6Om1pbihsZW4sIG90aGVyX2xlbikpOworICByZXR1cm4gcmVzdWx0IDwgMCB8fCAocmVzdWx0ID09IDAgJiYgbGVuIDwgb3RoZXJfbGVuKTsKK30KKworYm9vbCBCeXRlU3RyaW5nOjpFcXVhbE5vQ2FzZShjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyKSBjb25zdCB7CisgIGlmICghbV9wRGF0YSkKKyAgICByZXR1cm4gc3RyLklzRW1wdHkoKTsKKworICBzaXplX3QgbGVuID0gc3RyLkdldExlbmd0aCgpOworICBpZiAobV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAhPSBsZW4pCisgICAgcmV0dXJuIGZhbHNlOworCisgIGNvbnN0IHVpbnQ4X3QqIHBUaGlzID0gKGNvbnN0IHVpbnQ4X3QqKW1fcERhdGEtPm1fU3RyaW5nOworICBjb25zdCB1aW50OF90KiBwVGhhdCA9IHN0ci5yYXdfc3RyKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBpZiAoKCpwVGhpcykgIT0gKCpwVGhhdCkpIHsKKyAgICAgIHVpbnQ4X3QgYlRoaXMgPSBGWFNZU190b2xvd2VyKCpwVGhpcyk7CisgICAgICB1aW50OF90IGJUaGF0ID0gRlhTWVNfdG9sb3dlcigqcFRoYXQpOworICAgICAgaWYgKGJUaGlzICE9IGJUaGF0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHBUaGlzKys7CisgICAgcFRoYXQrKzsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBCeXRlU3RyaW5nOjpBc3NpZ25Db3B5KGNvbnN0IGNoYXIqIHBTcmNEYXRhLCBzaXplX3QgblNyY0xlbikgeworICBBbGxvY0JlZm9yZVdyaXRlKG5TcmNMZW4pOworICBtX3BEYXRhLT5Db3B5Q29udGVudHMocFNyY0RhdGEsIG5TcmNMZW4pOworICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gblNyY0xlbjsKK30KKwordm9pZCBCeXRlU3RyaW5nOjpSZWFsbG9jQmVmb3JlV3JpdGUoc2l6ZV90IG5OZXdMZW5ndGgpIHsKKyAgaWYgKG1fcERhdGEgJiYgbV9wRGF0YS0+Q2FuT3BlcmF0ZUluUGxhY2Uobk5ld0xlbmd0aCkpCisgICAgcmV0dXJuOworCisgIGlmIChuTmV3TGVuZ3RoID09IDApIHsKKyAgICBjbGVhcigpOworICAgIHJldHVybjsKKyAgfQorCisgIFJldGFpblB0cjxTdHJpbmdEYXRhPiBwTmV3RGF0YShTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbmd0aCkpOworICBpZiAobV9wRGF0YSkgeworICAgIHNpemVfdCBuQ29weUxlbmd0aCA9IHN0ZDo6bWluKG1fcERhdGEtPm1fbkRhdGFMZW5ndGgsIG5OZXdMZW5ndGgpOworICAgIHBOZXdEYXRhLT5Db3B5Q29udGVudHMobV9wRGF0YS0+bV9TdHJpbmcsIG5Db3B5TGVuZ3RoKTsKKyAgICBwTmV3RGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5Db3B5TGVuZ3RoOworICB9IGVsc2UgeworICAgIHBOZXdEYXRhLT5tX25EYXRhTGVuZ3RoID0gMDsKKyAgfQorICBwTmV3RGF0YS0+bV9TdHJpbmdbcE5ld0RhdGEtPm1fbkRhdGFMZW5ndGhdID0gMDsKKyAgbV9wRGF0YS5Td2FwKHBOZXdEYXRhKTsKK30KKwordm9pZCBCeXRlU3RyaW5nOjpBbGxvY0JlZm9yZVdyaXRlKHNpemVfdCBuTmV3TGVuZ3RoKSB7CisgIGlmIChtX3BEYXRhICYmIG1fcERhdGEtPkNhbk9wZXJhdGVJblBsYWNlKG5OZXdMZW5ndGgpKQorICAgIHJldHVybjsKKworICBpZiAobk5ld0xlbmd0aCA9PSAwKSB7CisgICAgY2xlYXIoKTsKKyAgICByZXR1cm47CisgIH0KKworICBtX3BEYXRhLlJlc2V0KFN0cmluZ0RhdGE6OkNyZWF0ZShuTmV3TGVuZ3RoKSk7Cit9CisKK3ZvaWQgQnl0ZVN0cmluZzo6UmVsZWFzZUJ1ZmZlcihzaXplX3Qgbk5ld0xlbmd0aCkgeworICBpZiAoIW1fcERhdGEpCisgICAgcmV0dXJuOworCisgIG5OZXdMZW5ndGggPSBzdGQ6Om1pbihuTmV3TGVuZ3RoLCBtX3BEYXRhLT5tX25BbGxvY0xlbmd0aCk7CisgIGlmIChuTmV3TGVuZ3RoID09IDApIHsKKyAgICBjbGVhcigpOworICAgIHJldHVybjsKKyAgfQorCisgIEFTU0VSVChtX3BEYXRhLT5tX25SZWZzID09IDEpOworICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gbk5ld0xlbmd0aDsKKyAgbV9wRGF0YS0+bV9TdHJpbmdbbk5ld0xlbmd0aF0gPSAwOworICBpZiAobV9wRGF0YS0+bV9uQWxsb2NMZW5ndGggLSBuTmV3TGVuZ3RoID49IDMyKSB7CisgICAgLy8gT3ZlciBhcmJpdHJhcnkgdGhyZXNob2xkLCBzbyBwYXkgdGhlIHByaWNlIHRvIHJlbG9jYXRlLiAgRm9yY2UgY29weSB0bworICAgIC8vIGFsd2F5cyBvY2N1ciBieSBob2xkaW5nIGEgc2Vjb25kIHJlZmVyZW5jZSB0byB0aGUgc3RyaW5nLgorICAgIEJ5dGVTdHJpbmcgcHJlc2VydmUoKnRoaXMpOworICAgIFJlYWxsb2NCZWZvcmVXcml0ZShuTmV3TGVuZ3RoKTsKKyAgfQorfQorCit2b2lkIEJ5dGVTdHJpbmc6OlJlc2VydmUoc2l6ZV90IGxlbikgeworICBHZXRCdWZmZXIobGVuKTsKK30KKworY2hhciogQnl0ZVN0cmluZzo6R2V0QnVmZmVyKHNpemVfdCBuTWluQnVmTGVuZ3RoKSB7CisgIGlmICghbV9wRGF0YSkgeworICAgIGlmIChuTWluQnVmTGVuZ3RoID09IDApCisgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIG1fcERhdGEuUmVzZXQoU3RyaW5nRGF0YTo6Q3JlYXRlKG5NaW5CdWZMZW5ndGgpKTsKKyAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gMDsKKyAgICBtX3BEYXRhLT5tX1N0cmluZ1swXSA9IDA7CisgICAgcmV0dXJuIG1fcERhdGEtPm1fU3RyaW5nOworICB9CisKKyAgaWYgKG1fcERhdGEtPkNhbk9wZXJhdGVJblBsYWNlKG5NaW5CdWZMZW5ndGgpKQorICAgIHJldHVybiBtX3BEYXRhLT5tX1N0cmluZzsKKworICBuTWluQnVmTGVuZ3RoID0gc3RkOjptYXgobk1pbkJ1Zkxlbmd0aCwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCk7CisgIGlmIChuTWluQnVmTGVuZ3RoID09IDApCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgUmV0YWluUHRyPFN0cmluZ0RhdGE+IHBOZXdEYXRhKFN0cmluZ0RhdGE6OkNyZWF0ZShuTWluQnVmTGVuZ3RoKSk7CisgIHBOZXdEYXRhLT5Db3B5Q29udGVudHMoKm1fcERhdGEpOworICBwTmV3RGF0YS0+bV9uRGF0YUxlbmd0aCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7CisgIG1fcERhdGEuU3dhcChwTmV3RGF0YSk7CisgIHJldHVybiBtX3BEYXRhLT5tX1N0cmluZzsKK30KKworc2l6ZV90IEJ5dGVTdHJpbmc6OkRlbGV0ZShzaXplX3QgaW5kZXgsIHNpemVfdCBjb3VudCkgeworICBpZiAoIW1fcERhdGEpCisgICAgcmV0dXJuIDA7CisKKyAgc2l6ZV90IG9sZF9sZW5ndGggPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOworICBpZiAoY291bnQgPT0gMCB8fAorICAgICAgaW5kZXggIT0gcGRmaXVtOjpjbGFtcChpbmRleCwgc3RhdGljX2Nhc3Q8c2l6ZV90PigwKSwgb2xkX2xlbmd0aCkpCisgICAgcmV0dXJuIG9sZF9sZW5ndGg7CisKKyAgc2l6ZV90IHJlbW92YWxfbGVuZ3RoID0gaW5kZXggKyBjb3VudDsKKyAgaWYgKHJlbW92YWxfbGVuZ3RoID4gb2xkX2xlbmd0aCkKKyAgICByZXR1cm4gb2xkX2xlbmd0aDsKKworICBSZWFsbG9jQmVmb3JlV3JpdGUob2xkX2xlbmd0aCk7CisgIHNpemVfdCBjaGFyc190b19jb3B5ID0gb2xkX2xlbmd0aCAtIHJlbW92YWxfbGVuZ3RoICsgMTsKKyAgbWVtbW92ZShtX3BEYXRhLT5tX1N0cmluZyArIGluZGV4LCBtX3BEYXRhLT5tX1N0cmluZyArIHJlbW92YWxfbGVuZ3RoLAorICAgICAgICAgIGNoYXJzX3RvX2NvcHkpOworICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gb2xkX2xlbmd0aCAtIGNvdW50OworICByZXR1cm4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKK30KKwordm9pZCBCeXRlU3RyaW5nOjpDb25jYXQoY29uc3QgY2hhciogcFNyY0RhdGEsIHNpemVfdCBuU3JjTGVuKSB7CisgIGlmICghcFNyY0RhdGEgfHwgblNyY0xlbiA9PSAwKQorICAgIHJldHVybjsKKworICBpZiAoIW1fcERhdGEpIHsKKyAgICBtX3BEYXRhLlJlc2V0KFN0cmluZ0RhdGE6OkNyZWF0ZShwU3JjRGF0YSwgblNyY0xlbikpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChtX3BEYXRhLT5DYW5PcGVyYXRlSW5QbGFjZShtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICsgblNyY0xlbikpIHsKKyAgICBtX3BEYXRhLT5Db3B5Q29udGVudHNBdChtX3BEYXRhLT5tX25EYXRhTGVuZ3RoLCBwU3JjRGF0YSwgblNyY0xlbik7CisgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCArPSBuU3JjTGVuOworICAgIHJldHVybjsKKyAgfQorCisgIFJldGFpblB0cjxTdHJpbmdEYXRhPiBwTmV3RGF0YSgKKyAgICAgIFN0cmluZ0RhdGE6OkNyZWF0ZShtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICsgblNyY0xlbikpOworICBwTmV3RGF0YS0+Q29weUNvbnRlbnRzKCptX3BEYXRhKTsKKyAgcE5ld0RhdGEtPkNvcHlDb250ZW50c0F0KG1fcERhdGEtPm1fbkRhdGFMZW5ndGgsIHBTcmNEYXRhLCBuU3JjTGVuKTsKKyAgbV9wRGF0YS5Td2FwKHBOZXdEYXRhKTsKK30KKworQnl0ZVN0cmluZyBCeXRlU3RyaW5nOjpNaWQoc2l6ZV90IGZpcnN0LCBzaXplX3QgY291bnQpIGNvbnN0IHsKKyAgaWYgKCFtX3BEYXRhKQorICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisKKyAgaWYgKCFJc1ZhbGlkSW5kZXgoZmlyc3QpKQorICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisKKyAgaWYgKGNvdW50ID09IDAgfHwgIUlzVmFsaWRMZW5ndGgoY291bnQpKQorICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisKKyAgaWYgKCFJc1ZhbGlkSW5kZXgoZmlyc3QgKyBjb3VudCAtIDEpKQorICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisKKyAgaWYgKGZpcnN0ID09IDAgJiYgY291bnQgPT0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkKKyAgICByZXR1cm4gKnRoaXM7CisKKyAgQnl0ZVN0cmluZyBkZXN0OworICBBbGxvY0NvcHkoZGVzdCwgY291bnQsIGZpcnN0KTsKKyAgcmV0dXJuIGRlc3Q7Cit9CisKK0J5dGVTdHJpbmcgQnl0ZVN0cmluZzo6TGVmdChzaXplX3QgY291bnQpIGNvbnN0IHsKKyAgaWYgKGNvdW50ID09IDAgfHwgIUlzVmFsaWRMZW5ndGgoY291bnQpKQorICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisgIHJldHVybiBNaWQoMCwgY291bnQpOworfQorCitCeXRlU3RyaW5nIEJ5dGVTdHJpbmc6OlJpZ2h0KHNpemVfdCBjb3VudCkgY29uc3QgeworICBpZiAoY291bnQgPT0gMCB8fCAhSXNWYWxpZExlbmd0aChjb3VudCkpCisgICAgcmV0dXJuIEJ5dGVTdHJpbmcoKTsKKyAgcmV0dXJuIE1pZChHZXRMZW5ndGgoKSAtIGNvdW50LCBjb3VudCk7Cit9CisKK3ZvaWQgQnl0ZVN0cmluZzo6QWxsb2NDb3B5KEJ5dGVTdHJpbmcmIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbkNvcHlMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbkNvcHlJbmRleCkgY29uc3QgeworICBpZiAobkNvcHlMZW4gPT0gMCkKKyAgICByZXR1cm47CisKKyAgUmV0YWluUHRyPFN0cmluZ0RhdGE+IHBOZXdEYXRhKAorICAgICAgU3RyaW5nRGF0YTo6Q3JlYXRlKG1fcERhdGEtPm1fU3RyaW5nICsgbkNvcHlJbmRleCwgbkNvcHlMZW4pKTsKKyAgZGVzdC5tX3BEYXRhLlN3YXAocE5ld0RhdGEpOworfQorCit2b2lkIEJ5dGVTdHJpbmc6OlNldEF0KHNpemVfdCBpbmRleCwgY2hhciBjKSB7CisgIEFTU0VSVChJc1ZhbGlkSW5kZXgoaW5kZXgpKTsKKyAgUmVhbGxvY0JlZm9yZVdyaXRlKG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpOworICBtX3BEYXRhLT5tX1N0cmluZ1tpbmRleF0gPSBjOworfQorCitzaXplX3QgQnl0ZVN0cmluZzo6SW5zZXJ0KHNpemVfdCBsb2NhdGlvbiwgY2hhciBjaCkgeworICBjb25zdCBzaXplX3QgY3VyX2xlbmd0aCA9IG1fcERhdGEgPyBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIDogMDsKKyAgaWYgKCFJc1ZhbGlkTGVuZ3RoKGxvY2F0aW9uKSkKKyAgICByZXR1cm4gY3VyX2xlbmd0aDsKKworICBjb25zdCBzaXplX3QgbmV3X2xlbmd0aCA9IGN1cl9sZW5ndGggKyAxOworICBSZWFsbG9jQmVmb3JlV3JpdGUobmV3X2xlbmd0aCk7CisgIG1lbW1vdmUobV9wRGF0YS0+bV9TdHJpbmcgKyBsb2NhdGlvbiArIDEsIG1fcERhdGEtPm1fU3RyaW5nICsgbG9jYXRpb24sCisgICAgICAgICAgbmV3X2xlbmd0aCAtIGxvY2F0aW9uKTsKKyAgbV9wRGF0YS0+bV9TdHJpbmdbbG9jYXRpb25dID0gY2g7CisgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuZXdfbGVuZ3RoOworICByZXR1cm4gbmV3X2xlbmd0aDsKK30KKworT3B0aW9uYWw8c2l6ZV90PiBCeXRlU3RyaW5nOjpGaW5kKGNoYXIgY2gsIHNpemVfdCBzdGFydCkgY29uc3QgeworICBpZiAoIW1fcERhdGEpCisgICAgcmV0dXJuIE9wdGlvbmFsPHNpemVfdD4oKTsKKworICBpZiAoIUlzVmFsaWRJbmRleChzdGFydCkpCisgICAgcmV0dXJuIE9wdGlvbmFsPHNpemVfdD4oKTsKKworICBjb25zdCBjaGFyKiBwU3RyID0gc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KAorICAgICAgbWVtY2hyKG1fcERhdGEtPm1fU3RyaW5nICsgc3RhcnQsIGNoLCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC0gc3RhcnQpKTsKKyAgcmV0dXJuIHBTdHIgPyBPcHRpb25hbDxzaXplX3Q+KHN0YXRpY19jYXN0PHNpemVfdD4ocFN0ciAtIG1fcERhdGEtPm1fU3RyaW5nKSkKKyAgICAgICAgICAgICAgOiBPcHRpb25hbDxzaXplX3Q+KCk7Cit9CisKK09wdGlvbmFsPHNpemVfdD4gQnl0ZVN0cmluZzo6RmluZChjb25zdCBCeXRlU3RyaW5nVmlldyYgc3ViU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzdGFydCkgY29uc3QgeworICBpZiAoIW1fcERhdGEpCisgICAgcmV0dXJuIE9wdGlvbmFsPHNpemVfdD4oKTsKKworICBpZiAoIUlzVmFsaWRJbmRleChzdGFydCkpCisgICAgcmV0dXJuIE9wdGlvbmFsPHNpemVfdD4oKTsKKworICBjb25zdCBjaGFyKiBwU3RyID0KKyAgICAgIEZYX3N0cnN0cihtX3BEYXRhLT5tX1N0cmluZyArIHN0YXJ0LCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC0gc3RhcnQsCisgICAgICAgICAgICAgICAgc3ViU3RyLnVudGVybWluYXRlZF9jX3N0cigpLCBzdWJTdHIuR2V0TGVuZ3RoKCkpOworICByZXR1cm4gcFN0ciA/IE9wdGlvbmFsPHNpemVfdD4oc3RhdGljX2Nhc3Q8c2l6ZV90PihwU3RyIC0gbV9wRGF0YS0+bV9TdHJpbmcpKQorICAgICAgICAgICAgICA6IE9wdGlvbmFsPHNpemVfdD4oKTsKK30KKworT3B0aW9uYWw8c2l6ZV90PiBCeXRlU3RyaW5nOjpSZXZlcnNlRmluZChjaGFyIGNoKSBjb25zdCB7CisgIGlmICghbV9wRGF0YSkKKyAgICByZXR1cm4gT3B0aW9uYWw8c2l6ZV90PigpOworCisgIHNpemVfdCBuTGVuZ3RoID0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKKyAgd2hpbGUgKG5MZW5ndGgtLSkgeworICAgIGlmIChtX3BEYXRhLT5tX1N0cmluZ1tuTGVuZ3RoXSA9PSBjaCkKKyAgICAgIHJldHVybiBPcHRpb25hbDxzaXplX3Q+KG5MZW5ndGgpOworICB9CisgIHJldHVybiBPcHRpb25hbDxzaXplX3Q+KCk7Cit9CisKK3ZvaWQgQnl0ZVN0cmluZzo6TWFrZUxvd2VyKCkgeworICBpZiAoIW1fcERhdGEpCisgICAgcmV0dXJuOworCisgIFJlYWxsb2NCZWZvcmVXcml0ZShtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKTsKKyAgRlhTWVNfc3RybHdyKG1fcERhdGEtPm1fU3RyaW5nKTsKK30KKwordm9pZCBCeXRlU3RyaW5nOjpNYWtlVXBwZXIoKSB7CisgIGlmICghbV9wRGF0YSkKKyAgICByZXR1cm47CisKKyAgUmVhbGxvY0JlZm9yZVdyaXRlKG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpOworICBGWFNZU19zdHJ1cHIobV9wRGF0YS0+bV9TdHJpbmcpOworfQorCitzaXplX3QgQnl0ZVN0cmluZzo6UmVtb3ZlKGNoYXIgY2hSZW1vdmUpIHsKKyAgaWYgKCFtX3BEYXRhIHx8IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPCAxKQorICAgIHJldHVybiAwOworCisgIGNoYXIqIHBzdHJTb3VyY2UgPSBtX3BEYXRhLT5tX1N0cmluZzsKKyAgY2hhciogcHN0ckVuZCA9IG1fcERhdGEtPm1fU3RyaW5nICsgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKKyAgd2hpbGUgKHBzdHJTb3VyY2UgPCBwc3RyRW5kKSB7CisgICAgaWYgKCpwc3RyU291cmNlID09IGNoUmVtb3ZlKQorICAgICAgYnJlYWs7CisgICAgcHN0clNvdXJjZSsrOworICB9CisgIGlmIChwc3RyU291cmNlID09IHBzdHJFbmQpCisgICAgcmV0dXJuIDA7CisKKyAgcHRyZGlmZl90IGNvcGllZCA9IHBzdHJTb3VyY2UgLSBtX3BEYXRhLT5tX1N0cmluZzsKKyAgUmVhbGxvY0JlZm9yZVdyaXRlKG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpOworICBwc3RyU291cmNlID0gbV9wRGF0YS0+bV9TdHJpbmcgKyBjb3BpZWQ7CisgIHBzdHJFbmQgPSBtX3BEYXRhLT5tX1N0cmluZyArIG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7CisKKyAgY2hhciogcHN0ckRlc3QgPSBwc3RyU291cmNlOworICB3aGlsZSAocHN0clNvdXJjZSA8IHBzdHJFbmQpIHsKKyAgICBpZiAoKnBzdHJTb3VyY2UgIT0gY2hSZW1vdmUpIHsKKyAgICAgICpwc3RyRGVzdCA9ICpwc3RyU291cmNlOworICAgICAgcHN0ckRlc3QrKzsKKyAgICB9CisgICAgcHN0clNvdXJjZSsrOworICB9CisKKyAgKnBzdHJEZXN0ID0gMDsKKyAgc2l6ZV90IG5Db3VudCA9IHN0YXRpY19jYXN0PHNpemVfdD4ocHN0clNvdXJjZSAtIHBzdHJEZXN0KTsKKyAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAtPSBuQ291bnQ7CisgIHJldHVybiBuQ291bnQ7Cit9CisKK3NpemVfdCBCeXRlU3RyaW5nOjpSZXBsYWNlKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBwT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHBOZXcpIHsKKyAgaWYgKCFtX3BEYXRhIHx8IHBPbGQuSXNFbXB0eSgpKQorICAgIHJldHVybiAwOworCisgIHNpemVfdCBuU291cmNlTGVuID0gcE9sZC5HZXRMZW5ndGgoKTsKKyAgc2l6ZV90IG5SZXBsYWNlbWVudExlbiA9IHBOZXcuR2V0TGVuZ3RoKCk7CisgIHNpemVfdCBuQ291bnQgPSAwOworICBjb25zdCBjaGFyKiBwU3RhcnQgPSBtX3BEYXRhLT5tX1N0cmluZzsKKyAgY2hhciogcEVuZCA9IG1fcERhdGEtPm1fU3RyaW5nICsgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKKyAgd2hpbGUgKDEpIHsKKyAgICBjb25zdCBjaGFyKiBwVGFyZ2V0ID0gRlhfc3Ryc3RyKHBTdGFydCwgc3RhdGljX2Nhc3Q8aW50PihwRW5kIC0gcFN0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPbGQudW50ZXJtaW5hdGVkX2Nfc3RyKCksIG5Tb3VyY2VMZW4pOworICAgIGlmICghcFRhcmdldCkKKyAgICAgIGJyZWFrOworCisgICAgbkNvdW50Kys7CisgICAgcFN0YXJ0ID0gcFRhcmdldCArIG5Tb3VyY2VMZW47CisgIH0KKyAgaWYgKG5Db3VudCA9PSAwKQorICAgIHJldHVybiAwOworCisgIHNpemVfdCBuTmV3TGVuZ3RoID0KKyAgICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggKyAoblJlcGxhY2VtZW50TGVuIC0gblNvdXJjZUxlbikgKiBuQ291bnQ7CisKKyAgaWYgKG5OZXdMZW5ndGggPT0gMCkgeworICAgIGNsZWFyKCk7CisgICAgcmV0dXJuIG5Db3VudDsKKyAgfQorCisgIFJldGFpblB0cjxTdHJpbmdEYXRhPiBwTmV3RGF0YShTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbmd0aCkpOworICBwU3RhcnQgPSBtX3BEYXRhLT5tX1N0cmluZzsKKyAgY2hhciogcERlc3QgPSBwTmV3RGF0YS0+bV9TdHJpbmc7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKKyAgICBjb25zdCBjaGFyKiBwVGFyZ2V0ID0gRlhfc3Ryc3RyKHBTdGFydCwgc3RhdGljX2Nhc3Q8aW50PihwRW5kIC0gcFN0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPbGQudW50ZXJtaW5hdGVkX2Nfc3RyKCksIG5Tb3VyY2VMZW4pOworICAgIG1lbWNweShwRGVzdCwgcFN0YXJ0LCBwVGFyZ2V0IC0gcFN0YXJ0KTsKKyAgICBwRGVzdCArPSBwVGFyZ2V0IC0gcFN0YXJ0OworICAgIG1lbWNweShwRGVzdCwgcE5ldy51bnRlcm1pbmF0ZWRfY19zdHIoKSwgcE5ldy5HZXRMZW5ndGgoKSk7CisgICAgcERlc3QgKz0gcE5ldy5HZXRMZW5ndGgoKTsKKyAgICBwU3RhcnQgPSBwVGFyZ2V0ICsgblNvdXJjZUxlbjsKKyAgfQorICBtZW1jcHkocERlc3QsIHBTdGFydCwgcEVuZCAtIHBTdGFydCk7CisgIG1fcERhdGEuU3dhcChwTmV3RGF0YSk7CisgIHJldHVybiBuQ291bnQ7Cit9CisKK1dpZGVTdHJpbmcgQnl0ZVN0cmluZzo6VVRGOERlY29kZSgpIGNvbnN0IHsKKyAgQ0ZYX1VURjhEZWNvZGVyIGRlY29kZXI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgR2V0TGVuZ3RoKCk7IGkrKykgeworICAgIGRlY29kZXIuSW5wdXQoc3RhdGljX2Nhc3Q8dWludDhfdD4obV9wRGF0YS0+bV9TdHJpbmdbaV0pKTsKKyAgfQorICByZXR1cm4gV2lkZVN0cmluZyhkZWNvZGVyLkdldFJlc3VsdCgpKTsKK30KKworLy8gc3RhdGljCitCeXRlU3RyaW5nIEJ5dGVTdHJpbmc6OkZyb21Vbmljb2RlKGNvbnN0IFdpZGVTdHJpbmcmIHN0cikgeworICByZXR1cm4gR2V0Qnl0ZVN0cmluZygwLCBzdHIuQXNTdHJpbmdWaWV3KCkpOworfQorCitpbnQgQnl0ZVN0cmluZzo6Q29tcGFyZShjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyKSBjb25zdCB7CisgIGlmICghbV9wRGF0YSkKKyAgICByZXR1cm4gc3RyLklzRW1wdHkoKSA/IDAgOiAtMTsKKworICBzaXplX3QgdGhpc19sZW4gPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOworICBzaXplX3QgdGhhdF9sZW4gPSBzdHIuR2V0TGVuZ3RoKCk7CisgIHNpemVfdCBtaW5fbGVuID0gc3RkOjptaW4odGhpc19sZW4sIHRoYXRfbGVuKTsKKyAgaW50IHJlc3VsdCA9IG1lbWNtcChtX3BEYXRhLT5tX1N0cmluZywgc3RyLnVudGVybWluYXRlZF9jX3N0cigpLCBtaW5fbGVuKTsKKyAgaWYgKHJlc3VsdCAhPSAwKQorICAgIHJldHVybiByZXN1bHQ7CisgIGlmICh0aGlzX2xlbiA9PSB0aGF0X2xlbikKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIHRoaXNfbGVuIDwgdGhhdF9sZW4gPyAtMSA6IDE7Cit9CisKK3ZvaWQgQnl0ZVN0cmluZzo6VHJpbSgpIHsKKyAgVHJpbVJpZ2h0KGtUcmltQ2hhcnMpOworICBUcmltTGVmdChrVHJpbUNoYXJzKTsKK30KKwordm9pZCBCeXRlU3RyaW5nOjpUcmltKGNoYXIgdGFyZ2V0KSB7CisgIEJ5dGVTdHJpbmdWaWV3IHRhcmdldHModGFyZ2V0KTsKKyAgVHJpbVJpZ2h0KHRhcmdldHMpOworICBUcmltTGVmdCh0YXJnZXRzKTsKK30KKwordm9pZCBCeXRlU3RyaW5nOjpUcmltKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiB0YXJnZXRzKSB7CisgIFRyaW1SaWdodCh0YXJnZXRzKTsKKyAgVHJpbUxlZnQodGFyZ2V0cyk7Cit9CisKK3ZvaWQgQnl0ZVN0cmluZzo6VHJpbUxlZnQoKSB7CisgIFRyaW1MZWZ0KGtUcmltQ2hhcnMpOworfQorCit2b2lkIEJ5dGVTdHJpbmc6OlRyaW1MZWZ0KGNoYXIgdGFyZ2V0KSB7CisgIFRyaW1MZWZ0KEJ5dGVTdHJpbmdWaWV3KHRhcmdldCkpOworfQorCit2b2lkIEJ5dGVTdHJpbmc6OlRyaW1MZWZ0KGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiB0YXJnZXRzKSB7CisgIGlmICghbV9wRGF0YSB8fCB0YXJnZXRzLklzRW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgc2l6ZV90IGxlbiA9IEdldExlbmd0aCgpOworICBpZiAobGVuID09IDApCisgICAgcmV0dXJuOworCisgIHNpemVfdCBwb3MgPSAwOworICB3aGlsZSAocG9zIDwgbGVuKSB7CisgICAgc2l6ZV90IGkgPSAwOworICAgIHdoaWxlIChpIDwgdGFyZ2V0cy5HZXRMZW5ndGgoKSAmJiB0YXJnZXRzW2ldICE9IG1fcERhdGEtPm1fU3RyaW5nW3Bvc10pCisgICAgICBpKys7CisgICAgaWYgKGkgPT0gdGFyZ2V0cy5HZXRMZW5ndGgoKSkKKyAgICAgIGJyZWFrOworICAgIHBvcysrOworICB9CisgIGlmIChwb3MpIHsKKyAgICBSZWFsbG9jQmVmb3JlV3JpdGUobGVuKTsKKyAgICBzaXplX3QgbkRhdGFMZW5ndGggPSBsZW4gLSBwb3M7CisgICAgbWVtbW92ZShtX3BEYXRhLT5tX1N0cmluZywgbV9wRGF0YS0+bV9TdHJpbmcgKyBwb3MsCisgICAgICAgICAgICAobkRhdGFMZW5ndGggKyAxKSAqIHNpemVvZihjaGFyKSk7CisgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5EYXRhTGVuZ3RoOworICB9Cit9CisKK3ZvaWQgQnl0ZVN0cmluZzo6VHJpbVJpZ2h0KCkgeworICBUcmltUmlnaHQoa1RyaW1DaGFycyk7Cit9CisKK3ZvaWQgQnl0ZVN0cmluZzo6VHJpbVJpZ2h0KGNoYXIgdGFyZ2V0KSB7CisgIFRyaW1SaWdodChCeXRlU3RyaW5nVmlldyh0YXJnZXQpKTsKK30KKwordm9pZCBCeXRlU3RyaW5nOjpUcmltUmlnaHQoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHRhcmdldHMpIHsKKyAgaWYgKCFtX3BEYXRhIHx8IHRhcmdldHMuSXNFbXB0eSgpKQorICAgIHJldHVybjsKKworICBzaXplX3QgcG9zID0gR2V0TGVuZ3RoKCk7CisgIGlmIChwb3MgPT0gMCkKKyAgICByZXR1cm47CisKKyAgd2hpbGUgKHBvcykgeworICAgIHNpemVfdCBpID0gMDsKKyAgICB3aGlsZSAoaSA8IHRhcmdldHMuR2V0TGVuZ3RoKCkgJiYgdGFyZ2V0c1tpXSAhPSBtX3BEYXRhLT5tX1N0cmluZ1twb3MgLSAxXSkKKyAgICAgIGkrKzsKKyAgICBpZiAoaSA9PSB0YXJnZXRzLkdldExlbmd0aCgpKQorICAgICAgYnJlYWs7CisgICAgcG9zLS07CisgIH0KKyAgaWYgKHBvcyA8IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpIHsKKyAgICBSZWFsbG9jQmVmb3JlV3JpdGUobV9wRGF0YS0+bV9uRGF0YUxlbmd0aCk7CisgICAgbV9wRGF0YS0+bV9TdHJpbmdbcG9zXSA9IDA7CisgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IHBvczsKKyAgfQorfQorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQnl0ZVN0cmluZyYgc3RyKSB7CisgIHJldHVybiBvcy53cml0ZShzdHIuY19zdHIoKSwgc3RyLkdldExlbmd0aCgpKTsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIpIHsKKyAgcmV0dXJuIG9zLndyaXRlKHN0ci51bnRlcm1pbmF0ZWRfY19zdHIoKSwgc3RyLkdldExlbmd0aCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGZ4Y3J0CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2J5dGVzdHJpbmcuaCBiL2NvcmUvZnhjcnQvYnl0ZXN0cmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZjEwZGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2J5dGVzdHJpbmcuaApAQCAtMCwwICsxLDI4MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfQllURVNUUklOR19IXworI2RlZmluZSBDT1JFX0ZYQ1JUX0JZVEVTVFJJTkdfSF8KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3N0cmluZ19kYXRhX3RlbXBsYXRlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9zdHJpbmdfdmlld190ZW1wbGF0ZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvb3B0aW9uYWwuaCIKKworbmFtZXNwYWNlIGZ4Y3J0IHsKKworY2xhc3MgQnl0ZVN0cmluZ19Db25jYXRfVGVzdDsKK2NsYXNzIFN0cmluZ1Bvb2xfQnl0ZVN0cmluZ19UZXN0OworY2xhc3MgV2lkZVN0cmluZzsKKworLy8gQSBtdXRhYmxlIHN0cmluZyB3aXRoIHNoYXJlZCBidWZmZXJzIHVzaW5nIGNvcHktb24td3JpdGUgc2VtYW50aWNzIHRoYXQKKy8vIGF2b2lkcyB0aGUgY29zdCBvZiBzdGQ6OnN0cmluZydzIGl0ZXJhdG9yIHN0YWJpbGl0eSBndWFyYW50ZWVzLgorY2xhc3MgQnl0ZVN0cmluZyB7CisgcHVibGljOgorICB1c2luZyBDaGFyVHlwZSA9IGNoYXI7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gY29uc3QgQ2hhclR5cGUqOworICB1c2luZyBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yID0gc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPjsKKworICBzdGF0aWMgQnl0ZVN0cmluZyBGb3JtYXRJbnRlZ2VyKGludCBpKSBXQVJOX1VOVVNFRF9SRVNVTFQ7CisgIHN0YXRpYyBCeXRlU3RyaW5nIEZvcm1hdEZsb2F0KGZsb2F0IGYpIFdBUk5fVU5VU0VEX1JFU1VMVDsKKyAgc3RhdGljIEJ5dGVTdHJpbmcgRm9ybWF0KGNvbnN0IGNoYXIqIGxwc3pGb3JtYXQsIC4uLikgV0FSTl9VTlVTRURfUkVTVUxUOworICBzdGF0aWMgQnl0ZVN0cmluZyBGb3JtYXRWKGNvbnN0IGNoYXIqIGxwc3pGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdMaXN0KSBXQVJOX1VOVVNFRF9SRVNVTFQ7CisKKyAgQnl0ZVN0cmluZygpOworICBCeXRlU3RyaW5nKGNvbnN0IEJ5dGVTdHJpbmcmIG90aGVyKTsKKyAgQnl0ZVN0cmluZyhCeXRlU3RyaW5nJiYgb3RoZXIpIG5vZXhjZXB0OworCisgIC8vIERlbGliZXJhdGVseSBpbXBsaWNpdCB0byBhdm9pZCBjYWxsaW5nIG9uIGV2ZXJ5IHN0cmluZyBsaXRlcmFsLgorICAvLyBOT0xJTlRORVhUTElORShydW50aW1lL2V4cGxpY2l0KQorICBCeXRlU3RyaW5nKGNoYXIgY2gpOworICAvLyBOT0xJTlRORVhUTElORShydW50aW1lL2V4cGxpY2l0KQorICBCeXRlU3RyaW5nKGNvbnN0IGNoYXIqIHB0cik7CisKKyAgLy8gTm8gaW1wbGljaXQgY29udmVyc2lvbnMgZnJvbSB3aWRlIHN0cmluZ3MuCisgIC8vIE5PTElOVE5FWFRMSU5FKHJ1bnRpbWUvZXhwbGljaXQpCisgIEJ5dGVTdHJpbmcod2NoYXJfdCkgPSBkZWxldGU7CisKKyAgQnl0ZVN0cmluZyhjb25zdCBjaGFyKiBwdHIsIHNpemVfdCBsZW4pOworICBCeXRlU3RyaW5nKGNvbnN0IHVpbnQ4X3QqIHB0ciwgc2l6ZV90IGxlbik7CisKKyAgZXhwbGljaXQgQnl0ZVN0cmluZyhjb25zdCBCeXRlU3RyaW5nVmlldyYgYnN0cmMpOworICBCeXRlU3RyaW5nKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBic3RyYzEsIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBic3RyYzIpOworICBCeXRlU3RyaW5nKGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxCeXRlU3RyaW5nVmlldz4mIGxpc3QpOworICBleHBsaWNpdCBCeXRlU3RyaW5nKGNvbnN0IHN0ZDo6b3N0cmluZ3N0cmVhbSYgb3V0U3RyZWFtKTsKKworICB+Qnl0ZVN0cmluZygpOworCisgIHZvaWQgY2xlYXIoKSB7IG1fcERhdGEuUmVzZXQoKTsgfQorCisgIHN0YXRpYyBCeXRlU3RyaW5nIEZyb21Vbmljb2RlKGNvbnN0IFdpZGVTdHJpbmcmIHN0cikgV0FSTl9VTlVTRURfUkVTVUxUOworCisgIC8vIEV4cGxpY2l0IGNvbnZlcnNpb24gdG8gQy1zdHlsZSBzdHJpbmcuCisgIC8vIE5vdGU6IEFueSBzdWJzZXF1ZW50IG1vZGlmaWNhdGlvbiBvZiB8dGhpc3wgd2lsbCBpbnZhbGlkYXRlIHRoZSByZXN1bHQuCisgIGNvbnN0IGNoYXIqIGNfc3RyKCkgY29uc3QgeyByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fU3RyaW5nIDogIiI7IH0KKworICAvLyBFeHBsaWNpdCBjb252ZXJzaW9uIHRvIHVpbnQ4X3QqLgorICAvLyBOb3RlOiBBbnkgc3Vic2VxdWVudCBtb2RpZmljYXRpb24gb2YgfHRoaXN8IHdpbGwgaW52YWxpZGF0ZSB0aGUgcmVzdWx0LgorICBjb25zdCB1aW50OF90KiByYXdfc3RyKCkgY29uc3QgeworICAgIHJldHVybiBtX3BEYXRhID8gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4obV9wRGF0YS0+bV9TdHJpbmcpCisgICAgICAgICAgICAgICAgICAgOiBudWxscHRyOworICB9CisKKyAgLy8gRXhwbGljaXQgY29udmVyc2lvbiB0byBCeXRlU3RyaW5nVmlldy4KKyAgLy8gTm90ZTogQW55IHN1YnNlcXVlbnQgbW9kaWZpY2F0aW9uIG9mIHx0aGlzfCB3aWxsIGludmFsaWRhdGUgdGhlIHJlc3VsdC4KKyAgQnl0ZVN0cmluZ1ZpZXcgQXNTdHJpbmdWaWV3KCkgY29uc3QgeworICAgIHJldHVybiBCeXRlU3RyaW5nVmlldyhyYXdfc3RyKCksIEdldExlbmd0aCgpKTsKKyAgfQorCisgIC8vIE5vdGU6IEFueSBzdWJzZXF1ZW50IG1vZGlmaWNhdGlvbiBvZiB8dGhpc3wgd2lsbCBpbnZhbGlkYXRlIGl0ZXJhdG9ycy4KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9TdHJpbmcgOiBudWxscHRyOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fU3RyaW5nICsgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA6IG51bGxwdHI7CisgIH0KKworICAvLyBOb3RlOiBBbnkgc3Vic2VxdWVudCBtb2RpZmljYXRpb24gb2YgfHRoaXN8IHdpbGwgaW52YWxpZGF0ZSBpdGVyYXRvcnMuCisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsKKyAgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7CisgIH0KKworICBzaXplX3QgR2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggOiAwOyB9CisgIHNpemVfdCBHZXRTdHJpbmdMZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fcERhdGEgPyBzdHJsZW4obV9wRGF0YS0+bV9TdHJpbmcpIDogMDsKKyAgfQorICBib29sIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiAhR2V0TGVuZ3RoKCk7IH0KKyAgYm9vbCBJc1ZhbGlkSW5kZXgoc2l6ZV90IGluZGV4KSBjb25zdCB7IHJldHVybiBpbmRleCA8IEdldExlbmd0aCgpOyB9CisgIGJvb2wgSXNWYWxpZExlbmd0aChzaXplX3QgbGVuZ3RoKSBjb25zdCB7IHJldHVybiBsZW5ndGggPD0gR2V0TGVuZ3RoKCk7IH0KKworICBpbnQgQ29tcGFyZShjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyKSBjb25zdDsKKyAgYm9vbCBFcXVhbE5vQ2FzZShjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyKSBjb25zdDsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgY2hhciogcHRyKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIpIGNvbnN0OworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQnl0ZVN0cmluZyYgb3RoZXIpIGNvbnN0OworCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBjaGFyKiBwdHIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gcHRyKTsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN0cikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBzdHIpOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBCeXRlU3RyaW5nJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIG9wZXJhdG9yPChjb25zdCBjaGFyKiBwdHIpIGNvbnN0OworICBib29sIG9wZXJhdG9yPChjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQnl0ZVN0cmluZyYgb3RoZXIpIGNvbnN0OworCisgIGNvbnN0IEJ5dGVTdHJpbmcmIG9wZXJhdG9yPShjb25zdCBjaGFyKiBzdHIpOworICBjb25zdCBCeXRlU3RyaW5nJiBvcGVyYXRvcj0oY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzdHJjKTsKKyAgY29uc3QgQnl0ZVN0cmluZyYgb3BlcmF0b3I9KGNvbnN0IEJ5dGVTdHJpbmcmIHN0cmluZ1NyYyk7CisKKyAgY29uc3QgQnl0ZVN0cmluZyYgb3BlcmF0b3IrPShjaGFyIGNoKTsKKyAgY29uc3QgQnl0ZVN0cmluZyYgb3BlcmF0b3IrPShjb25zdCBjaGFyKiBzdHIpOworICBjb25zdCBCeXRlU3RyaW5nJiBvcGVyYXRvcis9KGNvbnN0IEJ5dGVTdHJpbmcmIHN0cik7CisgIGNvbnN0IEJ5dGVTdHJpbmcmIG9wZXJhdG9yKz0oY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzdHJjKTsKKworICBDaGFyVHlwZSBvcGVyYXRvcltdKGNvbnN0IHNpemVfdCBpbmRleCkgY29uc3QgeworICAgIEFTU0VSVChJc1ZhbGlkSW5kZXgoaW5kZXgpKTsKKyAgICByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fU3RyaW5nW2luZGV4XSA6IDA7CisgIH0KKworICBDaGFyVHlwZSBGaXJzdCgpIGNvbnN0IHsgcmV0dXJuIEdldExlbmd0aCgpID8gKCp0aGlzKVswXSA6IDA7IH0KKyAgQ2hhclR5cGUgTGFzdCgpIGNvbnN0IHsgcmV0dXJuIEdldExlbmd0aCgpID8gKCp0aGlzKVtHZXRMZW5ndGgoKSAtIDFdIDogMDsgfQorCisgIHZvaWQgU2V0QXQoc2l6ZV90IGluZGV4LCBjaGFyIGMpOworCisgIHNpemVfdCBJbnNlcnQoc2l6ZV90IGluZGV4LCBjaGFyIGNoKTsKKyAgc2l6ZV90IEluc2VydEF0RnJvbnQoY2hhciBjaCkgeyByZXR1cm4gSW5zZXJ0KDAsIGNoKTsgfQorICBzaXplX3QgSW5zZXJ0QXRCYWNrKGNoYXIgY2gpIHsgcmV0dXJuIEluc2VydChHZXRMZW5ndGgoKSwgY2gpOyB9CisgIHNpemVfdCBEZWxldGUoc2l6ZV90IGluZGV4LCBzaXplX3QgY291bnQgPSAxKTsKKworICB2b2lkIFJlc2VydmUoc2l6ZV90IGxlbik7CisgIGNoYXIqIEdldEJ1ZmZlcihzaXplX3QgbGVuKTsKKyAgdm9pZCBSZWxlYXNlQnVmZmVyKHNpemVfdCBsZW4pOworCisgIEJ5dGVTdHJpbmcgTWlkKHNpemVfdCBmaXJzdCwgc2l6ZV90IGNvdW50KSBjb25zdDsKKyAgQnl0ZVN0cmluZyBMZWZ0KHNpemVfdCBjb3VudCkgY29uc3Q7CisgIEJ5dGVTdHJpbmcgUmlnaHQoc2l6ZV90IGNvdW50KSBjb25zdDsKKworICBPcHRpb25hbDxzaXplX3Q+IEZpbmQoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGxwc3pTdWIsIHNpemVfdCBzdGFydCA9IDApIGNvbnN0OworICBPcHRpb25hbDxzaXplX3Q+IEZpbmQoY2hhciBjaCwgc2l6ZV90IHN0YXJ0ID0gMCkgY29uc3Q7CisgIE9wdGlvbmFsPHNpemVfdD4gUmV2ZXJzZUZpbmQoY2hhciBjaCkgY29uc3Q7CisKKyAgYm9vbCBDb250YWlucyhjb25zdCBCeXRlU3RyaW5nVmlldyYgbHBzelN1Yiwgc2l6ZV90IHN0YXJ0ID0gMCkgY29uc3QgeworICAgIHJldHVybiBGaW5kKGxwc3pTdWIsIHN0YXJ0KS5oYXNfdmFsdWUoKTsKKyAgfQorCisgIGJvb2wgQ29udGFpbnMoY2hhciBjaCwgc2l6ZV90IHN0YXJ0ID0gMCkgY29uc3QgeworICAgIHJldHVybiBGaW5kKGNoLCBzdGFydCkuaGFzX3ZhbHVlKCk7CisgIH0KKworICB2b2lkIE1ha2VMb3dlcigpOworICB2b2lkIE1ha2VVcHBlcigpOworCisgIHZvaWQgVHJpbSgpOworICB2b2lkIFRyaW0oY2hhciB0YXJnZXQpOworICB2b2lkIFRyaW0oY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHRhcmdldHMpOworCisgIHZvaWQgVHJpbUxlZnQoKTsKKyAgdm9pZCBUcmltTGVmdChjaGFyIHRhcmdldCk7CisgIHZvaWQgVHJpbUxlZnQoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHRhcmdldHMpOworCisgIHZvaWQgVHJpbVJpZ2h0KCk7CisgIHZvaWQgVHJpbVJpZ2h0KGNoYXIgdGFyZ2V0KTsKKyAgdm9pZCBUcmltUmlnaHQoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHRhcmdldHMpOworCisgIHNpemVfdCBSZXBsYWNlKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBscHN6T2xkLCBjb25zdCBCeXRlU3RyaW5nVmlldyYgbHBzek5ldyk7CisKKyAgc2l6ZV90IFJlbW92ZShjaGFyIGNoKTsKKworICBXaWRlU3RyaW5nIFVURjhEZWNvZGUoKSBjb25zdDsKKworICB1aW50MzJfdCBHZXRJRCgpIGNvbnN0IHsgcmV0dXJuIEFzU3RyaW5nVmlldygpLkdldElEKCk7IH0KKworIHByb3RlY3RlZDoKKyAgdXNpbmcgU3RyaW5nRGF0YSA9IFN0cmluZ0RhdGFUZW1wbGF0ZTxjaGFyPjsKKworICB2b2lkIFJlYWxsb2NCZWZvcmVXcml0ZShzaXplX3Qgbk5ld0xlbik7CisgIHZvaWQgQWxsb2NCZWZvcmVXcml0ZShzaXplX3Qgbk5ld0xlbik7CisgIHZvaWQgQWxsb2NDb3B5KEJ5dGVTdHJpbmcmIGRlc3QsIHNpemVfdCBuQ29weUxlbiwgc2l6ZV90IG5Db3B5SW5kZXgpIGNvbnN0OworICB2b2lkIEFzc2lnbkNvcHkoY29uc3QgY2hhciogcFNyY0RhdGEsIHNpemVfdCBuU3JjTGVuKTsKKyAgdm9pZCBDb25jYXQoY29uc3QgY2hhciogbHBzelNyY0RhdGEsIHNpemVfdCBuU3JjTGVuKTsKKworICBSZXRhaW5QdHI8U3RyaW5nRGF0YT4gbV9wRGF0YTsKKworICBmcmllbmQgQnl0ZVN0cmluZ19Db25jYXRfVGVzdDsKKyAgZnJpZW5kIGNsYXNzIFN0cmluZ1Bvb2xfQnl0ZVN0cmluZ19UZXN0OworfTsKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBjaGFyKiBsaHMsIGNvbnN0IEJ5dGVTdHJpbmcmIHJocykgeworICByZXR1cm4gcmhzID09IGxoczsKK30KK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGxocywgY29uc3QgQnl0ZVN0cmluZyYgcmhzKSB7CisgIHJldHVybiByaHMgPT0gbGhzOworfQoraW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBjaGFyKiBsaHMsIGNvbnN0IEJ5dGVTdHJpbmcmIHJocykgeworICByZXR1cm4gcmhzICE9IGxoczsKK30KK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGxocywgY29uc3QgQnl0ZVN0cmluZyYgcmhzKSB7CisgIHJldHVybiByaHMgIT0gbGhzOworfQoraW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IGNoYXIqIGxocywgY29uc3QgQnl0ZVN0cmluZyYgcmhzKSB7CisgIHJldHVybiByaHMuQ29tcGFyZShsaHMpID4gMDsKK30KKworaW5saW5lIEJ5dGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIyKSB7CisgIHJldHVybiBCeXRlU3RyaW5nKHN0cjEsIHN0cjIpOworfQoraW5saW5lIEJ5dGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIxLCBjb25zdCBjaGFyKiBzdHIyKSB7CisgIHJldHVybiBCeXRlU3RyaW5nKHN0cjEsIHN0cjIpOworfQoraW5saW5lIEJ5dGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IGNoYXIqIHN0cjEsIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIyKSB7CisgIHJldHVybiBCeXRlU3RyaW5nKHN0cjEsIHN0cjIpOworfQoraW5saW5lIEJ5dGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIxLCBjaGFyIGNoKSB7CisgIHJldHVybiBCeXRlU3RyaW5nKHN0cjEsIEJ5dGVTdHJpbmdWaWV3KGNoKSk7Cit9CitpbmxpbmUgQnl0ZVN0cmluZyBvcGVyYXRvcisoY2hhciBjaCwgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN0cjIpIHsKKyAgcmV0dXJuIEJ5dGVTdHJpbmcoY2gsIHN0cjIpOworfQoraW5saW5lIEJ5dGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IEJ5dGVTdHJpbmcmIHN0cjEsIGNvbnN0IEJ5dGVTdHJpbmcmIHN0cjIpIHsKKyAgcmV0dXJuIEJ5dGVTdHJpbmcoc3RyMS5Bc1N0cmluZ1ZpZXcoKSwgc3RyMi5Bc1N0cmluZ1ZpZXcoKSk7Cit9CitpbmxpbmUgQnl0ZVN0cmluZyBvcGVyYXRvcisoY29uc3QgQnl0ZVN0cmluZyYgc3RyMSwgY2hhciBjaCkgeworICByZXR1cm4gQnl0ZVN0cmluZyhzdHIxLkFzU3RyaW5nVmlldygpLCBCeXRlU3RyaW5nVmlldyhjaCkpOworfQoraW5saW5lIEJ5dGVTdHJpbmcgb3BlcmF0b3IrKGNoYXIgY2gsIGNvbnN0IEJ5dGVTdHJpbmcmIHN0cjIpIHsKKyAgcmV0dXJuIEJ5dGVTdHJpbmcoY2gsIHN0cjIuQXNTdHJpbmdWaWV3KCkpOworfQoraW5saW5lIEJ5dGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IEJ5dGVTdHJpbmcmIHN0cjEsIGNvbnN0IGNoYXIqIHN0cjIpIHsKKyAgcmV0dXJuIEJ5dGVTdHJpbmcoc3RyMS5Bc1N0cmluZ1ZpZXcoKSwgc3RyMik7Cit9CitpbmxpbmUgQnl0ZVN0cmluZyBvcGVyYXRvcisoY29uc3QgY2hhciogc3RyMSwgY29uc3QgQnl0ZVN0cmluZyYgc3RyMikgeworICByZXR1cm4gQnl0ZVN0cmluZyhzdHIxLCBzdHIyLkFzU3RyaW5nVmlldygpKTsKK30KK2lubGluZSBCeXRlU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBCeXRlU3RyaW5nJiBzdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIyKSB7CisgIHJldHVybiBCeXRlU3RyaW5nKHN0cjEuQXNTdHJpbmdWaWV3KCksIHN0cjIpOworfQoraW5saW5lIEJ5dGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIHN0cjIpIHsKKyAgcmV0dXJuIEJ5dGVTdHJpbmcoc3RyMSwgc3RyMi5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBCeXRlU3RyaW5nJiBzdHIpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIpOworCit9ICAvLyBuYW1lc3BhY2UgZnhjcnQKKwordXNpbmcgQnl0ZVN0cmluZyA9IGZ4Y3J0OjpCeXRlU3RyaW5nOworCit1aW50MzJfdCBGWF9IYXNoQ29kZV9HZXRBKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIsIGJvb2wgYklnbm9yZUNhc2UpOworCituYW1lc3BhY2Ugc3RkIHsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBoYXNoPEJ5dGVTdHJpbmc+IHsKKyAgc3RkOjpzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBCeXRlU3RyaW5nJiBzdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gRlhfSGFzaENvZGVfR2V0QShzdHIuQXNTdHJpbmdWaWV3KCksIGZhbHNlKTsKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIHN0ZAorCitleHRlcm4gdGVtcGxhdGUgc3RydWN0IHN0ZDo6aGFzaDxCeXRlU3RyaW5nPjsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0JZVEVTVFJJTkdfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvYnl0ZXN0cmluZ191bml0dGVzdC5jcHAgYi9jb3JlL2Z4Y3J0L2J5dGVzdHJpbmdfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMTUxMmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2J5dGVzdHJpbmdfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTcyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY29yZS9meGNydC9ieXRlc3RyaW5nLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisKK25hbWVzcGFjZSBmeGNydCB7CisKK1RFU1QoQnl0ZVN0cmluZywgRWxlbWVudEFjY2VzcykgeworICBjb25zdCBCeXRlU3RyaW5nIGFiYygiYWJjIik7CisgIEVYUEVDVF9FUSgnYScsIGFiY1swXSk7CisgIEVYUEVDVF9FUSgnYicsIGFiY1sxXSk7CisgIEVYUEVDVF9FUSgnYycsIGFiY1syXSk7CisjaWZuZGVmIE5ERUJVRworICBFWFBFQ1RfREVBVEgoeyBhYmNbM107IH0sICIuKiIpOworI2VuZGlmCisKKyAgQnl0ZVN0cmluZyBtdXRhYmxlX2FiYyA9IGFiYzsKKyAgRVhQRUNUX0VRKGFiYy5jX3N0cigpLCBtdXRhYmxlX2FiYy5jX3N0cigpKTsKKyAgRVhQRUNUX0VRKCdhJywgbXV0YWJsZV9hYmNbMF0pOworICBFWFBFQ1RfRVEoJ2InLCBtdXRhYmxlX2FiY1sxXSk7CisgIEVYUEVDVF9FUSgnYycsIG11dGFibGVfYWJjWzJdKTsKKyAgRVhQRUNUX0VRKGFiYy5jX3N0cigpLCBtdXRhYmxlX2FiYy5jX3N0cigpKTsKKyAgRVhQRUNUX0VRKCJhYmMiLCBhYmMpOworCisgIGNvbnN0IGNoYXIqIGNfc3RyID0gYWJjLmNfc3RyKCk7CisgIG11dGFibGVfYWJjLlNldEF0KDAsICdkJyk7CisgIEVYUEVDVF9FUShjX3N0ciwgYWJjLmNfc3RyKCkpOworICBFWFBFQ1RfTkUoY19zdHIsIG11dGFibGVfYWJjLmNfc3RyKCkpOworICBFWFBFQ1RfRVEoImFiYyIsIGFiYyk7CisgIEVYUEVDVF9FUSgiZGJjIiwgbXV0YWJsZV9hYmMpOworCisgIG11dGFibGVfYWJjLlNldEF0KDEsICdlJyk7CisgIEVYUEVDVF9FUSgiYWJjIiwgYWJjKTsKKyAgRVhQRUNUX0VRKCJkZWMiLCBtdXRhYmxlX2FiYyk7CisKKyAgbXV0YWJsZV9hYmMuU2V0QXQoMiwgJ2YnKTsKKyAgRVhQRUNUX0VRKCJhYmMiLCBhYmMpOworICBFWFBFQ1RfRVEoImRlZiIsIG11dGFibGVfYWJjKTsKKyNpZm5kZWYgTkRFQlVHCisgIEVYUEVDVF9ERUFUSCh7IG11dGFibGVfYWJjLlNldEF0KDMsICdnJyk7IH0sICIuKiIpOworICBFWFBFQ1RfRVEoImFiYyIsIGFiYyk7CisjZW5kaWYKK30KKworVEVTVChCeXRlU3RyaW5nLCBPcGVyYXRvckxUKSB7CisgIEJ5dGVTdHJpbmcgZW1wdHk7CisgIEJ5dGVTdHJpbmcgYSgiYSIpOworICBCeXRlU3RyaW5nIGFiYygiYWJjIik7CisgIEJ5dGVTdHJpbmcgZGVmKCJkZWYiKTsKKyAgQnl0ZVN0cmluZ1ZpZXcgdl9lbXB0eTsKKyAgQnl0ZVN0cmluZ1ZpZXcgdl9hKCJhIik7CisgIEJ5dGVTdHJpbmdWaWV3IHZfYWJjKCJhYmMiKTsKKyAgQnl0ZVN0cmluZ1ZpZXcgdl9kZWYoImRlZiIpOworICBjb25zdCBjaGFyKiBjb25zdCBjX251bGwgPSBudWxscHRyOworICBjb25zdCBjaGFyKiBjb25zdCBjX2VtcHR5ID0gIiI7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGNfYSA9ICJhIjsKKyAgY29uc3QgY2hhciogY29uc3QgY19hYmMgPSAiYWJjIjsKKyAgY29uc3QgY2hhciogY29uc3QgY19kZWYgPSAiZGVmIjsKKworICBFWFBFQ1RfRkFMU0UoZW1wdHkgPCBlbXB0eSk7CisgIEVYUEVDVF9GQUxTRShhIDwgYSk7CisgIEVYUEVDVF9GQUxTRShhYmMgPCBhYmMpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGNfbnVsbCA8IGVtcHR5KTsKKyAgRVhQRUNUX0ZBTFNFKGNfZW1wdHkgPCBlbXB0eSk7CisgIEVYUEVDVF9GQUxTRShjX2EgPCBhKTsKKyAgRVhQRUNUX0ZBTFNFKGNfYWJjIDwgYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGNfZGVmIDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5IDwgY19udWxsKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5IDwgY19lbXB0eSk7CisgIEVYUEVDVF9GQUxTRShhIDwgY19hKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IGNfYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGNfZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5IDwgdl9lbXB0eSk7CisgIEVYUEVDVF9GQUxTRShhIDwgdl9hKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IHZfYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IHZfZGVmKTsKKworICBFWFBFQ1RfVFJVRShlbXB0eSA8IGEpOworICBFWFBFQ1RfRkFMU0UoYSA8IGVtcHR5KTsKKyAgRVhQRUNUX1RSVUUoY19udWxsIDwgYSk7CisgIEVYUEVDVF9UUlVFKGNfZW1wdHkgPCBhKTsKKyAgRVhQRUNUX0ZBTFNFKGNfYSA8IGVtcHR5KTsKKyAgRVhQRUNUX1RSVUUoZW1wdHkgPCBjX2EpOworICBFWFBFQ1RfRkFMU0UoYSA8IGNfbnVsbCk7CisgIEVYUEVDVF9GQUxTRShhIDwgY19lbXB0eSk7CisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgdl9hKTsKKyAgRVhQRUNUX0ZBTFNFKGEgPCB2X2VtcHR5KTsKKworICBFWFBFQ1RfVFJVRShlbXB0eSA8IGFiYyk7CisgIEVYUEVDVF9GQUxTRShhYmMgPCBlbXB0eSk7CisgIEVYUEVDVF9UUlVFKGNfbnVsbCA8IGFiYyk7CisgIEVYUEVDVF9UUlVFKGNfZW1wdHkgPCBhYmMpOworICBFWFBFQ1RfRkFMU0UoY19hYmMgPCBlbXB0eSk7CisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgY19hYmMpOworICBFWFBFQ1RfRkFMU0UoYWJjIDwgY19udWxsKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IGNfZW1wdHkpOworICBFWFBFQ1RfVFJVRShlbXB0eSA8IHZfYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IHZfZW1wdHkpOworCisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGVtcHR5KTsKKyAgRVhQRUNUX1RSVUUoY19udWxsIDwgZGVmKTsKKyAgRVhQRUNUX1RSVUUoY19lbXB0eSA8IGRlZik7CisgIEVYUEVDVF9GQUxTRShjX2RlZiA8IGVtcHR5KTsKKyAgRVhQRUNUX1RSVUUoZW1wdHkgPCBjX2RlZik7CisgIEVYUEVDVF9GQUxTRShkZWYgPCBjX251bGwpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgY19lbXB0eSk7CisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgdl9kZWYpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgdl9lbXB0eSk7CisKKyAgRVhQRUNUX1RSVUUoYSA8IGFiYyk7CisgIEVYUEVDVF9GQUxTRShhYmMgPCBhKTsKKyAgRVhQRUNUX1RSVUUoY19hIDwgYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGNfYWJjIDwgYSk7CisgIEVYUEVDVF9UUlVFKGEgPCBjX2FiYyk7CisgIEVYUEVDVF9GQUxTRShhYmMgPCBjX2EpOworICBFWFBFQ1RfVFJVRShhIDwgdl9hYmMpOworICBFWFBFQ1RfRkFMU0UoYWJjIDwgdl9hKTsKKworICBFWFBFQ1RfVFJVRShhIDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGEpOworICBFWFBFQ1RfVFJVRShjX2EgPCBkZWYpOworICBFWFBFQ1RfRkFMU0UoY19kZWYgPCBhKTsKKyAgRVhQRUNUX1RSVUUoYSA8IGNfZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGNfYSk7CisgIEVYUEVDVF9UUlVFKGEgPCB2X2RlZik7CisgIEVYUEVDVF9GQUxTRShkZWYgPCB2X2EpOworCisgIEVYUEVDVF9UUlVFKGFiYyA8IGRlZik7CisgIEVYUEVDVF9GQUxTRShkZWYgPCBhYmMpOworICBFWFBFQ1RfVFJVRShjX2FiYyA8IGRlZik7CisgIEVYUEVDVF9GQUxTRShjX2RlZiA8IGFiYyk7CisgIEVYUEVDVF9UUlVFKGFiYyA8IGNfZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGNfYWJjKTsKKyAgRVhQRUNUX1RSVUUoYWJjIDwgdl9kZWYpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgdl9hYmMpOworfQorCitURVNUKEJ5dGVTdHJpbmcsIE9wZXJhdG9yRVEpIHsKKyAgQnl0ZVN0cmluZyBudWxsX3N0cmluZzsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOworCisgIEJ5dGVTdHJpbmcgZW1wdHlfc3RyaW5nKCIiKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7CisKKyAgQnl0ZVN0cmluZyBkZWxldGVkX3N0cmluZygiaGVsbG8iKTsKKyAgZGVsZXRlZF9zdHJpbmcuRGVsZXRlKDAsIDUpOworICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBkZWxldGVkX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOworCisgIEJ5dGVTdHJpbmcgYnl0ZV9zdHJpbmcoImhlbGxvIik7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nID09IGJ5dGVfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBkZWxldGVkX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyA9PSBieXRlX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgPT0gYnl0ZV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgPT0gYnl0ZV9zdHJpbmcpOworCisgIEJ5dGVTdHJpbmcgYnl0ZV9zdHJpbmdfc2FtZTEoImhlbGxvIik7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nID09IGJ5dGVfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfc2FtZTEgPT0gYnl0ZV9zdHJpbmcpOworCisgIEJ5dGVTdHJpbmcgYnl0ZV9zdHJpbmdfc2FtZTIoYnl0ZV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZ19zYW1lMik7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX3NhbWUyID09IGJ5dGVfc3RyaW5nKTsKKworICBCeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMSgiaGUiKTsKKyAgQnl0ZVN0cmluZyBieXRlX3N0cmluZzIoImhlbGxwIik7CisgIEJ5dGVTdHJpbmcgYnl0ZV9zdHJpbmczKCJoZWxsb2QiKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGJ5dGVfc3RyaW5nMSk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZzIpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgPT0gYnl0ZV9zdHJpbmczKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nMSA9PSBieXRlX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZzIgPT0gYnl0ZV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmczID09IGJ5dGVfc3RyaW5nKTsKKworICBCeXRlU3RyaW5nVmlldyBudWxsX3N0cmluZ19jOworICBCeXRlU3RyaW5nVmlldyBlbXB0eV9zdHJpbmdfYygiIik7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IG51bGxfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBlbXB0eV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBudWxsX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IGVtcHR5X3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gbnVsbF9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IGVtcHR5X3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmdfYyA9PSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZ19jID09IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmdfYyA9PSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmdfYyA9PSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZ19jID09IGRlbGV0ZWRfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nX2MgPT0gZGVsZXRlZF9zdHJpbmcpOworCisgIEJ5dGVTdHJpbmdWaWV3IGJ5dGVfc3RyaW5nX2Nfc2FtZTEoImhlbGxvIik7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nID09IGJ5dGVfc3RyaW5nX2Nfc2FtZTEpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jX3NhbWUxID09IGJ5dGVfc3RyaW5nKTsKKworICBCeXRlU3RyaW5nVmlldyBieXRlX3N0cmluZ19jMSgiaGUiKTsKKyAgQnl0ZVN0cmluZ1ZpZXcgYnl0ZV9zdHJpbmdfYzIoImhlbGxwIik7CisgIEJ5dGVTdHJpbmdWaWV3IGJ5dGVfc3RyaW5nX2MzKCJoZWxsb2QiKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGJ5dGVfc3RyaW5nX2MxKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGJ5dGVfc3RyaW5nX2MyKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGJ5dGVfc3RyaW5nX2MzKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MxID09IGJ5dGVfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MyID09IGJ5dGVfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MzID09IGJ5dGVfc3RyaW5nKTsKKworICBjb25zdCBjaGFyKiBjb25zdCBjX251bGxfc3RyaW5nID0gbnVsbHB0cjsKKyAgY29uc3QgY2hhciogY29uc3QgY19lbXB0eV9zdHJpbmcgPSAiIjsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gY19udWxsX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGNfZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IGNfbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gY19lbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBjX251bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gY19lbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShjX251bGxfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoY19lbXB0eV9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShjX251bGxfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGNfZW1wdHlfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGNfbnVsbF9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShjX2VtcHR5X3N0cmluZyA9PSBkZWxldGVkX3N0cmluZyk7CisKKyAgY29uc3QgY2hhciogY29uc3QgY19zdHJpbmdfc2FtZTEgPSAiaGVsbG8iOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyA9PSBjX3N0cmluZ19zYW1lMSk7CisgIEVYUEVDVF9UUlVFKGNfc3RyaW5nX3NhbWUxID09IGJ5dGVfc3RyaW5nKTsKKworICBjb25zdCBjaGFyKiBjb25zdCBjX3N0cmluZzEgPSAiaGUiOworICBjb25zdCBjaGFyKiBjb25zdCBjX3N0cmluZzIgPSAiaGVsbHAiOworICBjb25zdCBjaGFyKiBjb25zdCBjX3N0cmluZzMgPSAiaGVsbG9kIjsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGNfc3RyaW5nMSk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBjX3N0cmluZzIpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgPT0gY19zdHJpbmczKTsKKyAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMSA9PSBieXRlX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShjX3N0cmluZzIgPT0gYnl0ZV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoY19zdHJpbmczID09IGJ5dGVfc3RyaW5nKTsKK30KKworVEVTVChCeXRlU3RyaW5nLCBPcGVyYXRvck5FKSB7CisgIEJ5dGVTdHJpbmcgbnVsbF9zdHJpbmc7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBudWxsX3N0cmluZyk7CisKKyAgQnl0ZVN0cmluZyBlbXB0eV9zdHJpbmcoIiIpOworICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKKworICBCeXRlU3RyaW5nIGRlbGV0ZWRfc3RyaW5nKCJoZWxsbyIpOworICBkZWxldGVkX3N0cmluZy5EZWxldGUoMCwgNSk7CisgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGRlbGV0ZWRfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IGRlbGV0ZWRfc3RyaW5nKTsKKworICBCeXRlU3RyaW5nIGJ5dGVfc3RyaW5nKCJoZWxsbyIpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgIT0gYnl0ZV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IGRlbGV0ZWRfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgIT0gYnl0ZV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgIT0gYnl0ZV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyAhPSBieXRlX3N0cmluZyk7CisKKyAgQnl0ZVN0cmluZyBieXRlX3N0cmluZ19zYW1lMSgiaGVsbG8iKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX3NhbWUxICE9IGJ5dGVfc3RyaW5nKTsKKworICBCeXRlU3RyaW5nIGJ5dGVfc3RyaW5nX3NhbWUyKGJ5dGVfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nX3NhbWUyKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX3NhbWUyICE9IGJ5dGVfc3RyaW5nKTsKKworICBCeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMSgiaGUiKTsKKyAgQnl0ZVN0cmluZyBieXRlX3N0cmluZzIoImhlbGxwIik7CisgIEJ5dGVTdHJpbmcgYnl0ZV9zdHJpbmczKCJoZWxsb2QiKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gYnl0ZV9zdHJpbmcxKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gYnl0ZV9zdHJpbmcyKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gYnl0ZV9zdHJpbmczKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcxICE9IGJ5dGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcyICE9IGJ5dGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmczICE9IGJ5dGVfc3RyaW5nKTsKKworICBCeXRlU3RyaW5nVmlldyBudWxsX3N0cmluZ19jOworICBCeXRlU3RyaW5nVmlldyBlbXB0eV9zdHJpbmdfYygiIik7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBudWxsX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGVtcHR5X3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBudWxsX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBlbXB0eV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZ19jICE9IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZ19jICE9IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nX2MgIT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZ19jICE9IGVtcHR5X3N0cmluZyk7CisKKyAgQnl0ZVN0cmluZ1ZpZXcgYnl0ZV9zdHJpbmdfY19zYW1lMSgiaGVsbG8iKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nX2Nfc2FtZTEpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfY19zYW1lMSAhPSBieXRlX3N0cmluZyk7CisKKyAgQnl0ZVN0cmluZ1ZpZXcgYnl0ZV9zdHJpbmdfYzEoImhlIik7CisgIEJ5dGVTdHJpbmdWaWV3IGJ5dGVfc3RyaW5nX2MyKCJoZWxscCIpOworICBCeXRlU3RyaW5nVmlldyBieXRlX3N0cmluZ19jMygiaGVsbG9kIik7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nX2MxKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gYnl0ZV9zdHJpbmdfYzIpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBieXRlX3N0cmluZ19jMyk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MxICE9IGJ5dGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYzIgIT0gYnl0ZV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jMyAhPSBieXRlX3N0cmluZyk7CisKKyAgY29uc3QgY2hhciogY29uc3QgY19udWxsX3N0cmluZyA9IG51bGxwdHI7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGNfZW1wdHlfc3RyaW5nID0gIiI7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBjX251bGxfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGNfZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBjX251bGxfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBjX2VtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBjX251bGxfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IGNfZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGNfbnVsbF9zdHJpbmcgIT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoY19lbXB0eV9zdHJpbmcgIT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoY19udWxsX3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoY19lbXB0eV9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGNfbnVsbF9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoY19lbXB0eV9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOworCisgIGNvbnN0IGNoYXIqIGNvbnN0IGNfc3RyaW5nX3NhbWUxID0gImhlbGxvIjsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nICE9IGNfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nX3NhbWUxICE9IGJ5dGVfc3RyaW5nKTsKKworICBjb25zdCBjaGFyKiBjb25zdCBjX3N0cmluZzEgPSAiaGUiOworICBjb25zdCBjaGFyKiBjb25zdCBjX3N0cmluZzIgPSAiaGVsbHAiOworICBjb25zdCBjaGFyKiBjb25zdCBjX3N0cmluZzMgPSAiaGVsbG9kIjsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gY19zdHJpbmcxKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gY19zdHJpbmcyKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gY19zdHJpbmczKTsKKyAgRVhQRUNUX1RSVUUoY19zdHJpbmcxICE9IGJ5dGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoY19zdHJpbmcyICE9IGJ5dGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoY19zdHJpbmczICE9IGJ5dGVfc3RyaW5nKTsKK30KKworVEVTVChCeXRlU3RyaW5nVmlldywgTnVsbCkgeworICBCeXRlU3RyaW5nVmlldyBudWxsX3N0cmluZzsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nLnJhd19zdHIoKSk7CisgIEVYUEVDVF9FUSgwdSwgbnVsbF9zdHJpbmcuR2V0TGVuZ3RoKCkpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZy5Jc0VtcHR5KCkpOworCisgIEJ5dGVTdHJpbmdWaWV3IGFub3RoZXJfbnVsbF9zdHJpbmc7CisgIEVYUEVDVF9FUShudWxsX3N0cmluZywgYW5vdGhlcl9udWxsX3N0cmluZyk7CisKKyAgQnl0ZVN0cmluZ1ZpZXcgY29waWVkX251bGxfc3RyaW5nKG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGNvcGllZF9udWxsX3N0cmluZy5yYXdfc3RyKCkpOworICBFWFBFQ1RfRVEoMHUsIGNvcGllZF9udWxsX3N0cmluZy5HZXRMZW5ndGgoKSk7CisgIEVYUEVDVF9UUlVFKGNvcGllZF9udWxsX3N0cmluZy5Jc0VtcHR5KCkpOworICBFWFBFQ1RfRVEobnVsbF9zdHJpbmcsIGNvcGllZF9udWxsX3N0cmluZyk7CisKKyAgQnl0ZVN0cmluZ1ZpZXcgZW1wdHlfc3RyaW5nKCIiKTsgIC8vIFBvaW50ZXIgdG8gTlVMLCBub3QgTlVMTCBwb2ludGVyLgorICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcucmF3X3N0cigpKTsKKyAgRVhQRUNUX0VRKDB1LCBlbXB0eV9zdHJpbmcuR2V0TGVuZ3RoKCkpOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcuSXNFbXB0eSgpKTsKKyAgRVhQRUNUX0VRKG51bGxfc3RyaW5nLCBlbXB0eV9zdHJpbmcpOworCisgIEJ5dGVTdHJpbmdWaWV3IGFzc2lnbmVkX251bGxfc3RyaW5nKCJpbml0aWFsbHkgbm90IG51bGxwdHIiKTsKKyAgYXNzaWduZWRfbnVsbF9zdHJpbmcgPSBudWxsX3N0cmluZzsKKyAgRVhQRUNUX0ZBTFNFKGFzc2lnbmVkX251bGxfc3RyaW5nLnJhd19zdHIoKSk7CisgIEVYUEVDVF9FUSgwdSwgYXNzaWduZWRfbnVsbF9zdHJpbmcuR2V0TGVuZ3RoKCkpOworICBFWFBFQ1RfVFJVRShhc3NpZ25lZF9udWxsX3N0cmluZy5Jc0VtcHR5KCkpOworICBFWFBFQ1RfRVEobnVsbF9zdHJpbmcsIGFzc2lnbmVkX251bGxfc3RyaW5nKTsKKworICBCeXRlU3RyaW5nVmlldyBhc3NpZ25lZF9udWxscHRyX3N0cmluZygiaW5pdGlhbGx5IG5vdCBudWxscHRyIik7CisgIGFzc2lnbmVkX251bGxwdHJfc3RyaW5nID0gbnVsbHB0cjsKKyAgRVhQRUNUX0ZBTFNFKGFzc2lnbmVkX251bGxwdHJfc3RyaW5nLnJhd19zdHIoKSk7CisgIEVYUEVDVF9FUSgwdSwgYXNzaWduZWRfbnVsbHB0cl9zdHJpbmcuR2V0TGVuZ3RoKCkpOworICBFWFBFQ1RfVFJVRShhc3NpZ25lZF9udWxscHRyX3N0cmluZy5Jc0VtcHR5KCkpOworICBFWFBFQ1RfRVEobnVsbF9zdHJpbmcsIGFzc2lnbmVkX251bGxwdHJfc3RyaW5nKTsKKworICBCeXRlU3RyaW5nVmlldyBub25fbnVsbF9zdHJpbmcoImEiKTsKKyAgRVhQRUNUX05FKG51bGxfc3RyaW5nLCBub25fbnVsbF9zdHJpbmcpOworfQorCitURVNUKEJ5dGVTdHJpbmcsIENvbmNhdCkgeworICBCeXRlU3RyaW5nIGZyZWQ7CisgIGZyZWQuQ29uY2F0KCJGUkVEIiwgNCk7CisgIEVYUEVDVF9FUSgiRlJFRCIsIGZyZWQpOworCisgIGZyZWQuQ29uY2F0KCJEWSIsIDIpOworICBFWFBFQ1RfRVEoIkZSRUREWSIsIGZyZWQpOworCisgIGZyZWQuRGVsZXRlKDMsIDMpOworICBFWFBFQ1RfRVEoIkZSRSIsIGZyZWQpOworCisgIGZyZWQuQ29uY2F0KCJEIiwgMSk7CisgIEVYUEVDVF9FUSgiRlJFRCIsIGZyZWQpOworCisgIEJ5dGVTdHJpbmcgY29weSA9IGZyZWQ7CisgIGZyZWQuQ29uY2F0KCJEWSIsIDIpOworICBFWFBFQ1RfRVEoIkZSRUREWSIsIGZyZWQpOworICBFWFBFQ1RfRVEoIkZSRUQiLCBjb3B5KTsKK30KKworVEVTVChCeXRlU3RyaW5nLCBSZW1vdmUpIHsKKyAgQnl0ZVN0cmluZyBmcmVlZCgiRlJFRUQiKTsKKyAgZnJlZWQuUmVtb3ZlKCdFJyk7CisgIEVYUEVDVF9FUSgiRlJEIiwgZnJlZWQpOworICBmcmVlZC5SZW1vdmUoJ0YnKTsKKyAgRVhQRUNUX0VRKCJSRCIsIGZyZWVkKTsKKyAgZnJlZWQuUmVtb3ZlKCdEJyk7CisgIEVYUEVDVF9FUSgiUiIsIGZyZWVkKTsKKyAgZnJlZWQuUmVtb3ZlKCdYJyk7CisgIEVYUEVDVF9FUSgiUiIsIGZyZWVkKTsKKyAgZnJlZWQuUmVtb3ZlKCdSJyk7CisgIEVYUEVDVF9FUSgiIiwgZnJlZWQpOworCisgIEJ5dGVTdHJpbmcgZW1wdHk7CisgIGVtcHR5LlJlbW92ZSgnWCcpOworICBFWFBFQ1RfRVEoIiIsIGVtcHR5KTsKK30KKworVEVTVChCeXRlU3RyaW5nLCBSZW1vdmVDb3BpZXMpIHsKKyAgQnl0ZVN0cmluZyBmcmVlZCgiRlJFRUQiKTsKKyAgY29uc3QgY2hhciogb2xkX2J1ZmZlciA9IGZyZWVkLmNfc3RyKCk7CisKKyAgLy8gTm8gY2hhbmdlIHdpdGggc2luZ2xlIHJlZmVyZW5jZSAtIG5vIGNvcHkuCisgIGZyZWVkLlJlbW92ZSgnUScpOworICBFWFBFQ1RfRVEoIkZSRUVEIiwgZnJlZWQpOworICBFWFBFQ1RfRVEob2xkX2J1ZmZlciwgZnJlZWQuY19zdHIoKSk7CisKKyAgLy8gQ2hhbmdlIHdpdGggc2luZ2xlIHJlZmVyZW5jZSAtIG5vIGNvcHkuCisgIGZyZWVkLlJlbW92ZSgnRScpOworICBFWFBFQ1RfRVEoIkZSRCIsIGZyZWVkKTsKKyAgRVhQRUNUX0VRKG9sZF9idWZmZXIsIGZyZWVkLmNfc3RyKCkpOworCisgIC8vIE5vIGNoYW5nZSB3aXRoIG11bHRpcGxlIHJlZmVyZW5jZXMgLSBubyBjb3B5LgorICBCeXRlU3RyaW5nIHNoYXJlZChmcmVlZCk7CisgIGZyZWVkLlJlbW92ZSgnUScpOworICBFWFBFQ1RfRVEoIkZSRCIsIGZyZWVkKTsKKyAgRVhQRUNUX0VRKG9sZF9idWZmZXIsIGZyZWVkLmNfc3RyKCkpOworICBFWFBFQ1RfRVEob2xkX2J1ZmZlciwgc2hhcmVkLmNfc3RyKCkpOworCisgIC8vIENoYW5nZSB3aXRoIG11bHRpcGxlIHJlZmVyZW5jZXMgLS0gbXVzdCBjb3B5LgorICBmcmVlZC5SZW1vdmUoJ0QnKTsKKyAgRVhQRUNUX0VRKCJGUiIsIGZyZWVkKTsKKyAgRVhQRUNUX05FKG9sZF9idWZmZXIsIGZyZWVkLmNfc3RyKCkpOworICBFWFBFQ1RfRVEoIkZSRCIsIHNoYXJlZCk7CisgIEVYUEVDVF9FUShvbGRfYnVmZmVyLCBzaGFyZWQuY19zdHIoKSk7Cit9CisKK1RFU1QoQnl0ZVN0cmluZywgUmVwbGFjZSkgeworICBCeXRlU3RyaW5nIGZyZWQoIkZSRUQiKTsKKyAgZnJlZC5SZXBsYWNlKCJGUiIsICJCTCIpOworICBFWFBFQ1RfRVEoIkJMRUQiLCBmcmVkKTsKKyAgZnJlZC5SZXBsYWNlKCJEIiwgIkREWSIpOworICBFWFBFQ1RfRVEoIkJMRUREWSIsIGZyZWQpOworICBmcmVkLlJlcGxhY2UoIkxFREQiLCAiIik7CisgIEVYUEVDVF9FUSgiQlkiLCBmcmVkKTsKKyAgZnJlZC5SZXBsYWNlKCJYIiwgIkNMQU1TIik7CisgIEVYUEVDVF9FUSgiQlkiLCBmcmVkKTsKKyAgZnJlZC5SZXBsYWNlKCJCWSIsICJISSIpOworICBFWFBFQ1RfRVEoIkhJIiwgZnJlZCk7CisgIGZyZWQuUmVwbGFjZSgiIiwgIkNMQU1TIik7CisgIEVYUEVDVF9FUSgiSEkiLCBmcmVkKTsKKyAgZnJlZC5SZXBsYWNlKCJISSIsICIiKTsKKyAgRVhQRUNUX0VRKCIiLCBmcmVkKTsKK30KKworVEVTVChCeXRlU3RyaW5nLCBJbnNlcnQpIHsKKyAgQnl0ZVN0cmluZyBmcmVkKCJGUkVEIik7CisgIEVYUEVDVF9FUSg1dSwgZnJlZC5JbnNlcnQoMCwgJ1MnKSk7CisgIEVYUEVDVF9FUSgiU0ZSRUQiLCBmcmVkKTsKKyAgRVhQRUNUX0VRKDZ1LCBmcmVkLkluc2VydCgxLCAnVCcpKTsKKyAgRVhQRUNUX0VRKCJTVEZSRUQiLCBmcmVkKTsKKyAgRVhQRUNUX0VRKDd1LCBmcmVkLkluc2VydCg0LCAnVScpKTsKKyAgRVhQRUNUX0VRKCJTVEZSVUVEIiwgZnJlZCk7CisgIEVYUEVDVF9FUSg4dSwgZnJlZC5JbnNlcnQoNywgJ1YnKSk7CisgIEVYUEVDVF9FUSgiU1RGUlVFRFYiLCBmcmVkKTsKKyAgRVhQRUNUX0VRKDh1LCBmcmVkLkluc2VydCgxMiwgJ1AnKSk7CisgIEVYUEVDVF9FUSgiU1RGUlVFRFYiLCBmcmVkKTsKKyAgeworICAgIEJ5dGVTdHJpbmcgZW1wdHk7CisgICAgRVhQRUNUX0VRKDF1LCBlbXB0eS5JbnNlcnQoMCwgJ1gnKSk7CisgICAgRVhQRUNUX0VRKCJYIiwgZW1wdHkpOworICB9CisgIHsKKyAgICBCeXRlU3RyaW5nIGVtcHR5OworICAgIEVYUEVDVF9FUSgwdSwgZW1wdHkuSW5zZXJ0KDUsICdYJykpOworICAgIEVYUEVDVF9ORSgiWCIsIGVtcHR5KTsKKyAgfQorfQorCitURVNUKEJ5dGVTdHJpbmcsIEluc2VydEF0RnJvbnRBbmRJbnNlcnRBdEJhY2spIHsKKyAgeworICAgIEJ5dGVTdHJpbmcgZW1wdHk7CisgICAgRVhQRUNUX0VRKDF1LCBlbXB0eS5JbnNlcnRBdEZyb250KCdEJykpOworICAgIEVYUEVDVF9FUSgiRCIsIGVtcHR5KTsKKyAgICBFWFBFQ1RfRVEoMnUsIGVtcHR5Lkluc2VydEF0RnJvbnQoJ0UnKSk7CisgICAgRVhQRUNUX0VRKCJFRCIsIGVtcHR5KTsKKyAgICBFWFBFQ1RfRVEoM3UsIGVtcHR5Lkluc2VydEF0RnJvbnQoJ1InKSk7CisgICAgRVhQRUNUX0VRKCJSRUQiLCBlbXB0eSk7CisgICAgRVhQRUNUX0VRKDR1LCBlbXB0eS5JbnNlcnRBdEZyb250KCdGJykpOworICAgIEVYUEVDVF9FUSgiRlJFRCIsIGVtcHR5KTsKKyAgfQorICB7CisgICAgQnl0ZVN0cmluZyBlbXB0eTsKKyAgICBFWFBFQ1RfRVEoMXUsIGVtcHR5Lkluc2VydEF0QmFjaygnRicpKTsKKyAgICBFWFBFQ1RfRVEoIkYiLCBlbXB0eSk7CisgICAgRVhQRUNUX0VRKDJ1LCBlbXB0eS5JbnNlcnRBdEJhY2soJ1InKSk7CisgICAgRVhQRUNUX0VRKCJGUiIsIGVtcHR5KTsKKyAgICBFWFBFQ1RfRVEoM3UsIGVtcHR5Lkluc2VydEF0QmFjaygnRScpKTsKKyAgICBFWFBFQ1RfRVEoIkZSRSIsIGVtcHR5KTsKKyAgICBFWFBFQ1RfRVEoNHUsIGVtcHR5Lkluc2VydEF0QmFjaygnRCcpKTsKKyAgICBFWFBFQ1RfRVEoIkZSRUQiLCBlbXB0eSk7CisgIH0KKyAgeworICAgIEJ5dGVTdHJpbmcgZW1wdHk7CisgICAgRVhQRUNUX0VRKDF1LCBlbXB0eS5JbnNlcnRBdEJhY2soJ0UnKSk7CisgICAgRVhQRUNUX0VRKCJFIiwgZW1wdHkpOworICAgIEVYUEVDVF9FUSgydSwgZW1wdHkuSW5zZXJ0QXRGcm9udCgnUicpKTsKKyAgICBFWFBFQ1RfRVEoIlJFIiwgZW1wdHkpOworICAgIEVYUEVDVF9FUSgzdSwgZW1wdHkuSW5zZXJ0QXRCYWNrKCdEJykpOworICAgIEVYUEVDVF9FUSgiUkVEIiwgZW1wdHkpOworICAgIEVYUEVDVF9FUSg0dSwgZW1wdHkuSW5zZXJ0QXRGcm9udCgnRicpKTsKKyAgICBFWFBFQ1RfRVEoIkZSRUQiLCBlbXB0eSk7CisgIH0KK30KKworVEVTVChCeXRlU3RyaW5nLCBEZWxldGUpIHsKKyAgQnl0ZVN0cmluZyBmcmVkKCJGUkVEIik7CisgIEVYUEVDVF9FUSg0dSwgZnJlZC5EZWxldGUoMCwgMCkpOworICBFWFBFQ1RfRVEoIkZSRUQiLCBmcmVkKTsKKyAgRVhQRUNUX0VRKDJ1LCBmcmVkLkRlbGV0ZSgwLCAyKSk7CisgIEVYUEVDVF9FUSgiRUQiLCBmcmVkKTsKKyAgRVhQRUNUX0VRKDF1LCBmcmVkLkRlbGV0ZSgxKSk7CisgIEVYUEVDVF9FUSgiRSIsIGZyZWQpOworICBFWFBFQ1RfRVEoMHUsIGZyZWQuRGVsZXRlKDApKTsKKyAgRVhQRUNUX0VRKCIiLCBmcmVkKTsKKyAgRVhQRUNUX0VRKDB1LCBmcmVkLkRlbGV0ZSgwKSk7CisgIEVYUEVDVF9FUSgiIiwgZnJlZCk7CisKKyAgQnl0ZVN0cmluZyBlbXB0eTsKKyAgRVhQRUNUX0VRKDB1LCBlbXB0eS5EZWxldGUoMCkpOworICBFWFBFQ1RfRVEoIiIsIGVtcHR5KTsKKyAgRVhQRUNUX0VRKDB1LCBlbXB0eS5EZWxldGUoMSkpOworICBFWFBFQ1RfRVEoIiIsIGVtcHR5KTsKK30KKworVEVTVChCeXRlU3RyaW5nLCBNaWQpIHsKKyAgQnl0ZVN0cmluZyBmcmVkKCJGUkVEIik7CisgIEVYUEVDVF9FUSgiIiwgZnJlZC5NaWQoMCwgMCkpOworICBFWFBFQ1RfRVEoIiIsIGZyZWQuTWlkKDMsIDApKTsKKyAgRVhQRUNUX0VRKCJGUkVEIiwgZnJlZC5NaWQoMCwgNCkpOworICBFWFBFQ1RfRVEoIlJFRCIsIGZyZWQuTWlkKDEsIDMpKTsKKyAgRVhQRUNUX0VRKCJFRCIsIGZyZWQuTWlkKDIsIDIpKTsKKyAgRVhQRUNUX0VRKCJEIiwgZnJlZC5NaWQoMywgMSkpOworICBFWFBFQ1RfRVEoIkYiLCBmcmVkLk1pZCgwLCAxKSk7CisgIEVYUEVDVF9FUSgiUiIsIGZyZWQuTWlkKDEsIDEpKTsKKyAgRVhQRUNUX0VRKCJFIiwgZnJlZC5NaWQoMiwgMSkpOworICBFWFBFQ1RfRVEoIkQiLCBmcmVkLk1pZCgzLCAxKSk7CisgIEVYUEVDVF9FUSgiRlIiLCBmcmVkLk1pZCgwLCAyKSk7CisgIEVYUEVDVF9FUSgiRlJFRCIsIGZyZWQuTWlkKDAsIDQpKTsKKyAgRVhQRUNUX0VRKCIiLCBmcmVkLk1pZCgwLCAxMCkpOworCisgIEVYUEVDVF9FUSgiUkVEIiwgZnJlZC5NaWQoMSwgMykpOworICBFWFBFQ1RfRVEoIiIsIGZyZWQuTWlkKDQsIDEpKTsKKworICBCeXRlU3RyaW5nIGVtcHR5OworICBFWFBFQ1RfRVEoIiIsIGVtcHR5Lk1pZCgwLCAwKSk7Cit9CisKK1RFU1QoQnl0ZVN0cmluZywgTGVmdCkgeworICBCeXRlU3RyaW5nIGZyZWQoIkZSRUQiKTsKKyAgRVhQRUNUX0VRKCIiLCBmcmVkLkxlZnQoMCkpOworICBFWFBFQ1RfRVEoIkYiLCBmcmVkLkxlZnQoMSkpOworICBFWFBFQ1RfRVEoIkZSIiwgZnJlZC5MZWZ0KDIpKTsKKyAgRVhQRUNUX0VRKCJGUkUiLCBmcmVkLkxlZnQoMykpOworICBFWFBFQ1RfRVEoIkZSRUQiLCBmcmVkLkxlZnQoNCkpOworCisgIEVYUEVDVF9FUSgiIiwgZnJlZC5MZWZ0KDUpKTsKKworICBCeXRlU3RyaW5nIGVtcHR5OworICBFWFBFQ1RfRVEoIiIsIGVtcHR5LkxlZnQoMCkpOworICBFWFBFQ1RfRVEoIiIsIGVtcHR5LkxlZnQoMSkpOworfQorCitURVNUKEJ5dGVTdHJpbmcsIFJpZ2h0KSB7CisgIEJ5dGVTdHJpbmcgZnJlZCgiRlJFRCIpOworICBFWFBFQ1RfRVEoIiIsIGZyZWQuUmlnaHQoMCkpOworICBFWFBFQ1RfRVEoIkQiLCBmcmVkLlJpZ2h0KDEpKTsKKyAgRVhQRUNUX0VRKCJFRCIsIGZyZWQuUmlnaHQoMikpOworICBFWFBFQ1RfRVEoIlJFRCIsIGZyZWQuUmlnaHQoMykpOworICBFWFBFQ1RfRVEoIkZSRUQiLCBmcmVkLlJpZ2h0KDQpKTsKKworICBFWFBFQ1RfRVEoIiIsIGZyZWQuUmlnaHQoNSkpOworCisgIEJ5dGVTdHJpbmcgZW1wdHk7CisgIEVYUEVDVF9FUSgiIiwgZW1wdHkuUmlnaHQoMCkpOworICBFWFBFQ1RfRVEoIiIsIGVtcHR5LlJpZ2h0KDEpKTsKK30KKworVEVTVChCeXRlU3RyaW5nLCBGaW5kKSB7CisgIEJ5dGVTdHJpbmcgbnVsbF9zdHJpbmc7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZy5GaW5kKCdhJykuaGFzX3ZhbHVlKCkpOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcuRmluZCgnXDAnKS5oYXNfdmFsdWUoKSk7CisKKyAgQnl0ZVN0cmluZyBlbXB0eV9zdHJpbmcoIiIpOworICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nLkZpbmQoJ2EnKS5oYXNfdmFsdWUoKSk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcuRmluZCgnXDAnKS5oYXNfdmFsdWUoKSk7CisKKyAgT3B0aW9uYWw8c2l6ZV90PiByZXN1bHQ7CisgIEJ5dGVTdHJpbmcgc2luZ2xlX3N0cmluZygiYSIpOworICByZXN1bHQgPSBzaW5nbGVfc3RyaW5nLkZpbmQoJ2EnKTsKKyAgQVNTRVJUX1RSVUUocmVzdWx0Lmhhc192YWx1ZSgpKTsKKyAgRVhQRUNUX0VRKDB1LCByZXN1bHQudmFsdWUoKSk7CisgIEVYUEVDVF9GQUxTRShzaW5nbGVfc3RyaW5nLkZpbmQoJ2InKS5oYXNfdmFsdWUoKSk7CisgIEVYUEVDVF9GQUxTRShzaW5nbGVfc3RyaW5nLkZpbmQoJ1wwJykuaGFzX3ZhbHVlKCkpOworCisgIEJ5dGVTdHJpbmcgbG9uZ2VyX3N0cmluZygiYWJjY2MiKTsKKyAgcmVzdWx0ID0gbG9uZ2VyX3N0cmluZy5GaW5kKCdhJyk7CisgIEFTU0VSVF9UUlVFKHJlc3VsdC5oYXNfdmFsdWUoKSk7CisgIEVYUEVDVF9FUSgwdSwgcmVzdWx0LnZhbHVlKCkpOworICByZXN1bHQgPSBsb25nZXJfc3RyaW5nLkZpbmQoJ2MnKTsKKyAgQVNTRVJUX1RSVUUocmVzdWx0Lmhhc192YWx1ZSgpKTsKKyAgRVhQRUNUX0VRKDJ1LCByZXN1bHQudmFsdWUoKSk7CisgIHJlc3VsdCA9IGxvbmdlcl9zdHJpbmcuRmluZCgnYycsIDMpOworICBBU1NFUlRfVFJVRShyZXN1bHQuaGFzX3ZhbHVlKCkpOworICBFWFBFQ1RfRVEoM3UsIHJlc3VsdC52YWx1ZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKGxvbmdlcl9zdHJpbmcuRmluZCgnZCcpLmhhc192YWx1ZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKGxvbmdlcl9zdHJpbmcuRmluZCgnXDAnKS5oYXNfdmFsdWUoKSk7CisKKyAgcmVzdWx0ID0gbG9uZ2VyX3N0cmluZy5GaW5kKCJhYiIpOworICBBU1NFUlRfVFJVRShyZXN1bHQuaGFzX3ZhbHVlKCkpOworICBFWFBFQ1RfRVEoMHUsIHJlc3VsdC52YWx1ZSgpKTsKKyAgcmVzdWx0ID0gbG9uZ2VyX3N0cmluZy5GaW5kKCJjY2MiKTsKKyAgQVNTRVJUX1RSVUUocmVzdWx0Lmhhc192YWx1ZSgpKTsKKyAgRVhQRUNUX0VRKDJ1LCByZXN1bHQudmFsdWUoKSk7CisgIHJlc3VsdCA9IGxvbmdlcl9zdHJpbmcuRmluZCgiY2MiLCAzKTsKKyAgQVNTRVJUX1RSVUUocmVzdWx0Lmhhc192YWx1ZSgpKTsKKyAgRVhQRUNUX0VRKDN1LCByZXN1bHQudmFsdWUoKSk7CisgIEVYUEVDVF9GQUxTRShsb25nZXJfc3RyaW5nLkZpbmQoImQiKS5oYXNfdmFsdWUoKSk7CisKKyAgQnl0ZVN0cmluZyBoaWJ5dGVfc3RyaW5nKAorICAgICAgImFiXHg4YyIKKyAgICAgICJkZWYiKTsKKyAgcmVzdWx0ID0gaGlieXRlX3N0cmluZy5GaW5kKCdceDhjJyk7CisgIEFTU0VSVF9UUlVFKHJlc3VsdC5oYXNfdmFsdWUoKSk7CisgIEVYUEVDVF9FUSgydSwgcmVzdWx0LnZhbHVlKCkpOworfQorCitURVNUKEJ5dGVTdHJpbmcsIFJldmVyc2VGaW5kKSB7CisgIEJ5dGVTdHJpbmcgbnVsbF9zdHJpbmc7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZy5SZXZlcnNlRmluZCgnYScpLmhhc192YWx1ZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nLlJldmVyc2VGaW5kKCdcMCcpLmhhc192YWx1ZSgpKTsKKworICBCeXRlU3RyaW5nIGVtcHR5X3N0cmluZygiIik7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcuUmV2ZXJzZUZpbmQoJ2EnKS5oYXNfdmFsdWUoKSk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcuUmV2ZXJzZUZpbmQoJ1wwJykuaGFzX3ZhbHVlKCkpOworCisgIE9wdGlvbmFsPHNpemVfdD4gcmVzdWx0OworICBCeXRlU3RyaW5nIHNpbmdsZV9zdHJpbmcoImEiKTsKKyAgcmVzdWx0ID0gc2luZ2xlX3N0cmluZy5SZXZlcnNlRmluZCgnYScpOworICBBU1NFUlRfVFJVRShyZXN1bHQuaGFzX3ZhbHVlKCkpOworICBFWFBFQ1RfRVEoMHUsIHJlc3VsdC52YWx1ZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKHNpbmdsZV9zdHJpbmcuUmV2ZXJzZUZpbmQoJ2InKS5oYXNfdmFsdWUoKSk7CisgIEVYUEVDVF9GQUxTRShzaW5nbGVfc3RyaW5nLlJldmVyc2VGaW5kKCdcMCcpLmhhc192YWx1ZSgpKTsKKworICBCeXRlU3RyaW5nIGxvbmdlcl9zdHJpbmcoImFiY2NjIik7CisgIHJlc3VsdCA9IGxvbmdlcl9zdHJpbmcuUmV2ZXJzZUZpbmQoJ2EnKTsKKyAgQVNTRVJUX1RSVUUocmVzdWx0Lmhhc192YWx1ZSgpKTsKKyAgRVhQRUNUX0VRKDB1LCByZXN1bHQudmFsdWUoKSk7CisgIHJlc3VsdCA9IGxvbmdlcl9zdHJpbmcuUmV2ZXJzZUZpbmQoJ2MnKTsKKyAgQVNTRVJUX1RSVUUocmVzdWx0Lmhhc192YWx1ZSgpKTsKKyAgRVhQRUNUX0VRKDR1LCByZXN1bHQudmFsdWUoKSk7CisgIEVYUEVDVF9GQUxTRShsb25nZXJfc3RyaW5nLlJldmVyc2VGaW5kKCdcMCcpLmhhc192YWx1ZSgpKTsKKworICBCeXRlU3RyaW5nIGhpYnl0ZV9zdHJpbmcoCisgICAgICAiYWJceDhjIgorICAgICAgImRlZiIpOworICByZXN1bHQgPSBoaWJ5dGVfc3RyaW5nLlJldmVyc2VGaW5kKCdceDhjJyk7CisgIEFTU0VSVF9UUlVFKHJlc3VsdC5oYXNfdmFsdWUoKSk7CisgIEVYUEVDVF9FUSgydSwgcmVzdWx0LnZhbHVlKCkpOworfQorCitURVNUKEJ5dGVTdHJpbmcsIFVwcGVyTG93ZXIpIHsKKyAgQnl0ZVN0cmluZyBmcmVkKCJGLVJlLjQyRCIpOworICBmcmVkLk1ha2VMb3dlcigpOworICBFWFBFQ1RfRVEoImYtcmUuNDJkIiwgZnJlZCk7CisgIGZyZWQuTWFrZVVwcGVyKCk7CisgIEVYUEVDVF9FUSgiRi1SRS40MkQiLCBmcmVkKTsKKworICBCeXRlU3RyaW5nIGVtcHR5OworICBlbXB0eS5NYWtlTG93ZXIoKTsKKyAgRVhQRUNUX0VRKCIiLCBlbXB0eSk7CisgIGVtcHR5Lk1ha2VVcHBlcigpOworICBFWFBFQ1RfRVEoIiIsIGVtcHR5KTsKK30KKworVEVTVChCeXRlU3RyaW5nLCBUcmltKSB7CisgIEJ5dGVTdHJpbmcgZnJlZCgiICBGUkVEICAiKTsKKyAgZnJlZC5UcmltKCk7CisgIEVYUEVDVF9FUSgiRlJFRCIsIGZyZWQpOworICBmcmVkLlRyaW0oJ0UnKTsKKyAgRVhQRUNUX0VRKCJGUkVEIiwgZnJlZCk7CisgIGZyZWQuVHJpbSgnRicpOworICBFWFBFQ1RfRVEoIlJFRCIsIGZyZWQpOworICBmcmVkLlRyaW0oIkVSUCIpOworICBFWFBFQ1RfRVEoIkQiLCBmcmVkKTsKKworICBCeXRlU3RyaW5nIGJsYW5rKCIgICAiKTsKKyAgYmxhbmsuVHJpbSgiRVJQIik7CisgIEVYUEVDVF9FUSgiICAgIiwgYmxhbmspOworICBibGFuay5UcmltKCdFJyk7CisgIEVYUEVDVF9FUSgiICAgIiwgYmxhbmspOworICBibGFuay5UcmltKCk7CisgIEVYUEVDVF9FUSgiIiwgYmxhbmspOworCisgIEJ5dGVTdHJpbmcgZW1wdHk7CisgIGVtcHR5LlRyaW0oIkVSUCIpOworICBFWFBFQ1RfRVEoIiIsIGVtcHR5KTsKKyAgZW1wdHkuVHJpbSgnRScpOworICBFWFBFQ1RfRVEoIiIsIGVtcHR5KTsKKyAgZW1wdHkuVHJpbSgpOworICBFWFBFQ1RfRVEoIiIsIGVtcHR5KTsKKworICBCeXRlU3RyaW5nIGFiYygiICBBQkNDQkEgICIpOworICBhYmMuVHJpbSgiQSIpOworICBFWFBFQ1RfRVEoIiAgQUJDQ0JBICAiLCBhYmMpOworICBhYmMuVHJpbSgiIEEiKTsKKyAgRVhQRUNUX0VRKCJCQ0NCIiwgYWJjKTsKK30KKworVEVTVChCeXRlU3RyaW5nLCBUcmltTGVmdCkgeworICBCeXRlU3RyaW5nIGZyZWQoIiAgRlJFRCAgIik7CisgIGZyZWQuVHJpbUxlZnQoKTsKKyAgRVhQRUNUX0VRKCJGUkVEICAiLCBmcmVkKTsKKyAgZnJlZC5UcmltTGVmdCgnRScpOworICBFWFBFQ1RfRVEoIkZSRUQgICIsIGZyZWQpOworICBmcmVkLlRyaW1MZWZ0KCdGJyk7CisgIEVYUEVDVF9FUSgiUkVEICAiLCBmcmVkKTsKKyAgZnJlZC5UcmltTGVmdCgiRVJQIik7CisgIEVYUEVDVF9FUSgiRCAgIiwgZnJlZCk7CisKKyAgQnl0ZVN0cmluZyBibGFuaygiICAgIik7CisgIGJsYW5rLlRyaW1MZWZ0KCJFUlAiKTsKKyAgRVhQRUNUX0VRKCIgICAiLCBibGFuayk7CisgIGJsYW5rLlRyaW1MZWZ0KCdFJyk7CisgIEVYUEVDVF9FUSgiICAgIiwgYmxhbmspOworICBibGFuay5UcmltTGVmdCgpOworICBFWFBFQ1RfRVEoIiIsIGJsYW5rKTsKKworICBCeXRlU3RyaW5nIGVtcHR5OworICBlbXB0eS5UcmltTGVmdCgiRVJQIik7CisgIEVYUEVDVF9FUSgiIiwgZW1wdHkpOworICBlbXB0eS5UcmltTGVmdCgnRScpOworICBFWFBFQ1RfRVEoIiIsIGVtcHR5KTsKKyAgZW1wdHkuVHJpbUxlZnQoKTsKKyAgRVhQRUNUX0VRKCIiLCBlbXB0eSk7Cit9CisKK1RFU1QoQnl0ZVN0cmluZywgVHJpbUxlZnRDb3BpZXMpIHsKKyAgeworICAgIC8vIFdpdGggYSBzaW5nbGUgcmVmZXJlbmNlLCBubyBjb3B5IHRha2VzIHBsYWNlLgorICAgIEJ5dGVTdHJpbmcgZnJlZCgiICBGUkVEICAiKTsKKyAgICBjb25zdCBjaGFyKiBvbGRfYnVmZmVyID0gZnJlZC5jX3N0cigpOworICAgIGZyZWQuVHJpbUxlZnQoKTsKKyAgICBFWFBFQ1RfRVEoIkZSRUQgICIsIGZyZWQpOworICAgIEVYUEVDVF9FUShvbGRfYnVmZmVyLCBmcmVkLmNfc3RyKCkpOworICB9CisgIHsKKyAgICAvLyBXaXRoIG11bHRpcGxlIHJlZmVyZW5jZXMsIHdlIG11c3QgY29weS4KKyAgICBCeXRlU3RyaW5nIGZyZWQoIiAgRlJFRCAgIik7CisgICAgQnl0ZVN0cmluZyBvdGhlcl9mcmVkID0gZnJlZDsKKyAgICBjb25zdCBjaGFyKiBvbGRfYnVmZmVyID0gZnJlZC5jX3N0cigpOworICAgIGZyZWQuVHJpbUxlZnQoKTsKKyAgICBFWFBFQ1RfRVEoIkZSRUQgICIsIGZyZWQpOworICAgIEVYUEVDVF9FUSgiICBGUkVEICAiLCBvdGhlcl9mcmVkKTsKKyAgICBFWFBFQ1RfTkUob2xkX2J1ZmZlciwgZnJlZC5jX3N0cigpKTsKKyAgfQorICB7CisgICAgLy8gV2l0aCBtdWx0aXBsZSByZWZlcmVuY2VzLCBidXQgbm8gbW9kaWZpY2F0aW9ucywgbm8gY29weS4KKyAgICBCeXRlU3RyaW5nIGZyZWQoIkZSRUQiKTsKKyAgICBCeXRlU3RyaW5nIG90aGVyX2ZyZWQgPSBmcmVkOworICAgIGNvbnN0IGNoYXIqIG9sZF9idWZmZXIgPSBmcmVkLmNfc3RyKCk7CisgICAgZnJlZC5UcmltTGVmdCgpOworICAgIEVYUEVDVF9FUSgiRlJFRCIsIGZyZWQpOworICAgIEVYUEVDVF9FUSgiRlJFRCIsIG90aGVyX2ZyZWQpOworICAgIEVYUEVDVF9FUShvbGRfYnVmZmVyLCBmcmVkLmNfc3RyKCkpOworICB9Cit9CisKK1RFU1QoQnl0ZVN0cmluZywgVHJpbVJpZ2h0KSB7CisgIEJ5dGVTdHJpbmcgZnJlZCgiICBGUkVEICAiKTsKKyAgZnJlZC5UcmltUmlnaHQoKTsKKyAgRVhQRUNUX0VRKCIgIEZSRUQiLCBmcmVkKTsKKyAgZnJlZC5UcmltUmlnaHQoJ0UnKTsKKyAgRVhQRUNUX0VRKCIgIEZSRUQiLCBmcmVkKTsKKyAgZnJlZC5UcmltUmlnaHQoJ0QnKTsKKyAgRVhQRUNUX0VRKCIgIEZSRSIsIGZyZWQpOworICBmcmVkLlRyaW1SaWdodCgiRVJQIik7CisgIEVYUEVDVF9FUSgiICBGIiwgZnJlZCk7CisKKyAgQnl0ZVN0cmluZyBibGFuaygiICAgIik7CisgIGJsYW5rLlRyaW1SaWdodCgiRVJQIik7CisgIEVYUEVDVF9FUSgiICAgIiwgYmxhbmspOworICBibGFuay5UcmltUmlnaHQoJ0UnKTsKKyAgRVhQRUNUX0VRKCIgICAiLCBibGFuayk7CisgIGJsYW5rLlRyaW1SaWdodCgpOworICBFWFBFQ1RfRVEoIiIsIGJsYW5rKTsKKworICBCeXRlU3RyaW5nIGVtcHR5OworICBlbXB0eS5UcmltUmlnaHQoIkVSUCIpOworICBFWFBFQ1RfRVEoIiIsIGVtcHR5KTsKKyAgZW1wdHkuVHJpbVJpZ2h0KCdFJyk7CisgIEVYUEVDVF9FUSgiIiwgZW1wdHkpOworICBlbXB0eS5UcmltUmlnaHQoKTsKKyAgRVhQRUNUX0VRKCIiLCBlbXB0eSk7Cit9CisKK1RFU1QoQnl0ZVN0cmluZywgVHJpbVJpZ2h0Q29waWVzKSB7CisgIHsKKyAgICAvLyBXaXRoIGEgc2luZ2xlIHJlZmVyZW5jZSwgbm8gY29weSB0YWtlcyBwbGFjZS4KKyAgICBCeXRlU3RyaW5nIGZyZWQoIiAgRlJFRCAgIik7CisgICAgY29uc3QgY2hhciogb2xkX2J1ZmZlciA9IGZyZWQuY19zdHIoKTsKKyAgICBmcmVkLlRyaW1SaWdodCgpOworICAgIEVYUEVDVF9FUSgiICBGUkVEIiwgZnJlZCk7CisgICAgRVhQRUNUX0VRKG9sZF9idWZmZXIsIGZyZWQuY19zdHIoKSk7CisgIH0KKyAgeworICAgIC8vIFdpdGggbXVsdGlwbGUgcmVmZXJlbmNlcywgd2UgbXVzdCBjb3B5LgorICAgIEJ5dGVTdHJpbmcgZnJlZCgiICBGUkVEICAiKTsKKyAgICBCeXRlU3RyaW5nIG90aGVyX2ZyZWQgPSBmcmVkOworICAgIGNvbnN0IGNoYXIqIG9sZF9idWZmZXIgPSBmcmVkLmNfc3RyKCk7CisgICAgZnJlZC5UcmltUmlnaHQoKTsKKyAgICBFWFBFQ1RfRVEoIiAgRlJFRCIsIGZyZWQpOworICAgIEVYUEVDVF9FUSgiICBGUkVEICAiLCBvdGhlcl9mcmVkKTsKKyAgICBFWFBFQ1RfTkUob2xkX2J1ZmZlciwgZnJlZC5jX3N0cigpKTsKKyAgfQorICB7CisgICAgLy8gV2l0aCBtdWx0aXBsZSByZWZlcmVuY2VzLCBidXQgbm8gbW9kaWZpY2F0aW9ucywgbm8gY29weS4KKyAgICBCeXRlU3RyaW5nIGZyZWQoIkZSRUQiKTsKKyAgICBCeXRlU3RyaW5nIG90aGVyX2ZyZWQgPSBmcmVkOworICAgIGNvbnN0IGNoYXIqIG9sZF9idWZmZXIgPSBmcmVkLmNfc3RyKCk7CisgICAgZnJlZC5UcmltUmlnaHQoKTsKKyAgICBFWFBFQ1RfRVEoIkZSRUQiLCBmcmVkKTsKKyAgICBFWFBFQ1RfRVEoIkZSRUQiLCBvdGhlcl9mcmVkKTsKKyAgICBFWFBFQ1RfRVEob2xkX2J1ZmZlciwgZnJlZC5jX3N0cigpKTsKKyAgfQorfQorCitURVNUKEJ5dGVTdHJpbmcsIFJlc2VydmUpIHsKKyAgeworICAgIEJ5dGVTdHJpbmcgc3RyOworICAgIHN0ci5SZXNlcnZlKDYpOworICAgIGNvbnN0IGNoYXIqIG9sZF9idWZmZXIgPSBzdHIuY19zdHIoKTsKKyAgICBzdHIgKz0gIkFCQ0RFRiI7CisgICAgRVhQRUNUX0VRKG9sZF9idWZmZXIsIHN0ci5jX3N0cigpKTsKKyAgICBzdHIgKz0gIkJsYWggQmxhaCBCbGFoIEJsYWggQmxhaCBCbGFoIjsKKyAgICBFWFBFQ1RfTkUob2xkX2J1ZmZlciwgc3RyLmNfc3RyKCkpOworICB9CisgIHsKKyAgICBCeXRlU3RyaW5nIHN0cigiQSIpOworICAgIHN0ci5SZXNlcnZlKDYpOworICAgIGNvbnN0IGNoYXIqIG9sZF9idWZmZXIgPSBzdHIuY19zdHIoKTsKKyAgICBzdHIgKz0gIkJDREVGIjsKKyAgICBFWFBFQ1RfRVEob2xkX2J1ZmZlciwgc3RyLmNfc3RyKCkpOworICAgIHN0ciArPSAiQmxhaCBCbGFoIEJsYWggQmxhaCBCbGFoIEJsYWgiOworICAgIEVYUEVDVF9ORShvbGRfYnVmZmVyLCBzdHIuY19zdHIoKSk7CisgIH0KK30KKworVEVTVChCeXRlU3RyaW5nLCBHZXRCdWZmZXIpIHsKKyAgeworICAgIEJ5dGVTdHJpbmcgc3RyOworICAgIGNoYXIqIGJ1ZmZlciA9IHN0ci5HZXRCdWZmZXIoMTIpOworICAgIC8vIE5PTElOVE5FWFRMSU5FKHJ1bnRpbWUvcHJpbnRmKQorICAgIHN0cmNweShidWZmZXIsICJjbGFtcyIpOworICAgIHN0ci5SZWxlYXNlQnVmZmVyKHN0ci5HZXRTdHJpbmdMZW5ndGgoKSk7CisgICAgRVhQRUNUX0VRKCJjbGFtcyIsIHN0cik7CisgIH0KKyAgeworICAgIEJ5dGVTdHJpbmcgc3RyKCJjbCIpOworICAgIGNoYXIqIGJ1ZmZlciA9IHN0ci5HZXRCdWZmZXIoMTIpOworICAgIC8vIE5PTElOVE5FWFRMSU5FKHJ1bnRpbWUvcHJpbnRmKQorICAgIHN0cmNweShidWZmZXIgKyAyLCAiYW1zIik7CisgICAgc3RyLlJlbGVhc2VCdWZmZXIoc3RyLkdldFN0cmluZ0xlbmd0aCgpKTsKKyAgICBFWFBFQ1RfRVEoImNsYW1zIiwgc3RyKTsKKyAgfQorfQorCitURVNUKEJ5dGVTdHJpbmcsIFJlbGVhc2VCdWZmZXIpIHsKKyAgeworICAgIEJ5dGVTdHJpbmcgc3RyOworICAgIHN0ci5SZXNlcnZlKDEyKTsKKyAgICBzdHIgKz0gImNsYW1zIjsKKyAgICBjb25zdCBjaGFyKiBvbGRfYnVmZmVyID0gc3RyLmNfc3RyKCk7CisgICAgc3RyLlJlbGVhc2VCdWZmZXIoNCk7CisgICAgRVhQRUNUX0VRKG9sZF9idWZmZXIsIHN0ci5jX3N0cigpKTsKKyAgICBFWFBFQ1RfRVEoImNsYW0iLCBzdHIpOworICB9CisgIHsKKyAgICBCeXRlU3RyaW5nIHN0cigiYyIpOworICAgIHN0ci5SZXNlcnZlKDEyKTsKKyAgICBzdHIgKz0gImxhbXMiOworICAgIGNvbnN0IGNoYXIqIG9sZF9idWZmZXIgPSBzdHIuY19zdHIoKTsKKyAgICBzdHIuUmVsZWFzZUJ1ZmZlcig0KTsKKyAgICBFWFBFQ1RfRVEob2xkX2J1ZmZlciwgc3RyLmNfc3RyKCkpOworICAgIEVYUEVDVF9FUSgiY2xhbSIsIHN0cik7CisgIH0KKyAgeworICAgIEJ5dGVTdHJpbmcgc3RyOworICAgIHN0ci5SZXNlcnZlKDIwMCk7CisgICAgc3RyICs9ICJjbGFtcyI7CisgICAgY29uc3QgY2hhciogb2xkX2J1ZmZlciA9IHN0ci5jX3N0cigpOworICAgIHN0ci5SZWxlYXNlQnVmZmVyKDQpOworICAgIEVYUEVDVF9ORShvbGRfYnVmZmVyLCBzdHIuY19zdHIoKSk7CisgICAgRVhQRUNUX0VRKCJjbGFtIiwgc3RyKTsKKyAgfQorICB7CisgICAgQnl0ZVN0cmluZyBzdHIoImMiKTsKKyAgICBzdHIuUmVzZXJ2ZSgyMDApOworICAgIHN0ciArPSAibGFtcyI7CisgICAgY29uc3QgY2hhciogb2xkX2J1ZmZlciA9IHN0ci5jX3N0cigpOworICAgIHN0ci5SZWxlYXNlQnVmZmVyKDQpOworICAgIEVYUEVDVF9ORShvbGRfYnVmZmVyLCBzdHIuY19zdHIoKSk7CisgICAgRVhQRUNUX0VRKCJjbGFtIiwgc3RyKTsKKyAgfQorfQorCitURVNUKEJ5dGVTdHJpbmcsIEVtcHR5UmV2ZXJzZUl0ZXJhdG9yKSB7CisgIEJ5dGVTdHJpbmcgZW1wdHk7CisgIGF1dG8gaXRlciA9IGVtcHR5LnJiZWdpbigpOworICBFWFBFQ1RfVFJVRShpdGVyID09IGVtcHR5LnJlbmQoKSk7CisgIEVYUEVDVF9GQUxTRShpdGVyICE9IGVtcHR5LnJlbmQoKSk7CisgIEVYUEVDVF9GQUxTRShpdGVyIDwgZW1wdHkucmVuZCgpKTsKK30KKworVEVTVChCeXRlU3RyaW5nLCBPbmVDaGFyUmV2ZXJzZUl0ZXJhdG9yKSB7CisgIEJ5dGVTdHJpbmcgb25lX3N0cigiYSIpOworICBhdXRvIGl0ZXIgPSBvbmVfc3RyLnJiZWdpbigpOworICBFWFBFQ1RfRkFMU0UoaXRlciA9PSBvbmVfc3RyLnJlbmQoKSk7CisgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gb25lX3N0ci5yZW5kKCkpOworICBFWFBFQ1RfVFJVRShpdGVyIDwgb25lX3N0ci5yZW5kKCkpOworCisgIGNoYXIgY2ggPSAqaXRlcisrOworICBFWFBFQ1RfRVEoJ2EnLCBjaCk7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPT0gb25lX3N0ci5yZW5kKCkpOworICBFWFBFQ1RfRkFMU0UoaXRlciAhPSBvbmVfc3RyLnJlbmQoKSk7CisgIEVYUEVDVF9GQUxTRShpdGVyIDwgb25lX3N0ci5yZW5kKCkpOworfQorCitURVNUKEJ5dGVTdHJpbmcsIE11bHRpQ2hhclJldmVyc2VJdGVyYXRvcikgeworICBCeXRlU3RyaW5nIG11bHRpX3N0cigiYWJjZCIpOworICBhdXRvIGl0ZXIgPSBtdWx0aV9zdHIucmJlZ2luKCk7CisgIEVYUEVDVF9GQUxTRShpdGVyID09IG11bHRpX3N0ci5yZW5kKCkpOworCisgIGNoYXIgY2ggPSAqaXRlcisrOworICBFWFBFQ1RfRVEoJ2QnLCBjaCk7CisgIEVYUEVDVF9FUSgnYycsICppdGVyKTsKKyAgRVhQRUNUX0ZBTFNFKGl0ZXIgPT0gbXVsdGlfc3RyLnJlbmQoKSk7CisKKyAgY2ggPSAqKCsraXRlcik7CisgIEVYUEVDVF9FUSgnYicsIGNoKTsKKyAgRVhQRUNUX0VRKCdiJywgKml0ZXIpOworICBFWFBFQ1RfRkFMU0UoaXRlciA9PSBtdWx0aV9zdHIucmVuZCgpKTsKKworICBjaCA9ICppdGVyKys7CisgIEVYUEVDVF9FUSgnYicsIGNoKTsKKyAgRVhQRUNUX0VRKCdhJywgKml0ZXIpOworICBFWFBFQ1RfRkFMU0UoaXRlciA9PSBtdWx0aV9zdHIucmVuZCgpKTsKKworICBjaCA9ICppdGVyKys7CisgIEVYUEVDVF9FUSgnYScsIGNoKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA9PSBtdWx0aV9zdHIucmVuZCgpKTsKKworICBjaCA9ICooLS1pdGVyKTsKKyAgRVhQRUNUX0VRKCdhJywgY2gpOworICBFWFBFQ1RfRVEoJ2EnLCAqaXRlcik7CisgIEVYUEVDVF9GQUxTRShpdGVyID09IG11bHRpX3N0ci5yZW5kKCkpOworCisgIGNoID0gKml0ZXItLTsKKyAgRVhQRUNUX0VRKCdhJywgY2gpOworICBFWFBFQ1RfRVEoJ2InLCAqaXRlcik7CisgIEVYUEVDVF9GQUxTRShpdGVyID09IG11bHRpX3N0ci5yZW5kKCkpOworCisgIGNoID0gKml0ZXItLTsKKyAgRVhQRUNUX0VRKCdiJywgY2gpOworICBFWFBFQ1RfRVEoJ2MnLCAqaXRlcik7CisgIEVYUEVDVF9GQUxTRShpdGVyID09IG11bHRpX3N0ci5yZW5kKCkpOworCisgIGNoID0gKigtLWl0ZXIpOworICBFWFBFQ1RfRVEoJ2QnLCBjaCk7CisgIEVYUEVDVF9FUSgnZCcsICppdGVyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA9PSBtdWx0aV9zdHIucmJlZ2luKCkpOworfQorCitURVNUKEJ5dGVTdHJpbmdWaWV3LCBOb3ROdWxsKSB7CisgIEJ5dGVTdHJpbmdWaWV3IHN0cmluZzMoImFiYyIpOworICBCeXRlU3RyaW5nVmlldyBzdHJpbmc2KCJhYmNkZWYiKTsKKyAgQnl0ZVN0cmluZ1ZpZXcgYWx0ZXJuYXRlX3N0cmluZzMoImFiY2RlZiIsIDMpOworICBCeXRlU3RyaW5nVmlldyBlbWJlZGRlZF9udWxfc3RyaW5nNygiYWJjXDBkZWYiLCA3KTsKKyAgQnl0ZVN0cmluZ1ZpZXcgaWxsZWdhbF9zdHJpbmc3KCJhYmNkZWYiLCA3KTsKKworICBFWFBFQ1RfRVEoM3UsIHN0cmluZzMuR2V0TGVuZ3RoKCkpOworICBFWFBFQ1RfRVEoNnUsIHN0cmluZzYuR2V0TGVuZ3RoKCkpOworICBFWFBFQ1RfRVEoM3UsIGFsdGVybmF0ZV9zdHJpbmczLkdldExlbmd0aCgpKTsKKyAgRVhQRUNUX0VRKDd1LCBlbWJlZGRlZF9udWxfc3RyaW5nNy5HZXRMZW5ndGgoKSk7CisgIEVYUEVDVF9FUSg3dSwgaWxsZWdhbF9zdHJpbmc3LkdldExlbmd0aCgpKTsKKworICBFWFBFQ1RfTkUoc3RyaW5nMywgc3RyaW5nNik7CisgIEVYUEVDVF9FUShzdHJpbmczLCBhbHRlcm5hdGVfc3RyaW5nMyk7CisgIEVYUEVDVF9ORShzdHJpbmczLCBlbWJlZGRlZF9udWxfc3RyaW5nNyk7CisgIEVYUEVDVF9ORShzdHJpbmczLCBpbGxlZ2FsX3N0cmluZzcpOworICBFWFBFQ1RfTkUoc3RyaW5nNiwgYWx0ZXJuYXRlX3N0cmluZzMpOworICBFWFBFQ1RfTkUoc3RyaW5nNiwgZW1iZWRkZWRfbnVsX3N0cmluZzcpOworICBFWFBFQ1RfTkUoc3RyaW5nNiwgaWxsZWdhbF9zdHJpbmc3KTsKKyAgRVhQRUNUX05FKGFsdGVybmF0ZV9zdHJpbmczLCBlbWJlZGRlZF9udWxfc3RyaW5nNyk7CisgIEVYUEVDVF9ORShhbHRlcm5hdGVfc3RyaW5nMywgaWxsZWdhbF9zdHJpbmc3KTsKKyAgRVhQRUNUX05FKGVtYmVkZGVkX251bF9zdHJpbmc3LCBpbGxlZ2FsX3N0cmluZzcpOworCisgIEJ5dGVTdHJpbmdWaWV3IGNvcGllZF9zdHJpbmczKHN0cmluZzMpOworICBCeXRlU3RyaW5nVmlldyBjb3BpZWRfYWx0ZXJuYXRlX3N0cmluZzMoYWx0ZXJuYXRlX3N0cmluZzMpOworICBCeXRlU3RyaW5nVmlldyBjb3BpZWRfZW1iZWRkZWRfbnVsX3N0cmluZzcoZW1iZWRkZWRfbnVsX3N0cmluZzcpOworCisgIEVYUEVDVF9FUShzdHJpbmczLCBjb3BpZWRfc3RyaW5nMyk7CisgIEVYUEVDVF9FUShhbHRlcm5hdGVfc3RyaW5nMywgY29waWVkX2FsdGVybmF0ZV9zdHJpbmczKTsKKyAgRVhQRUNUX0VRKGVtYmVkZGVkX251bF9zdHJpbmc3LCBjb3BpZWRfZW1iZWRkZWRfbnVsX3N0cmluZzcpOworCisgIEJ5dGVTdHJpbmdWaWV3IGFzc2lnbmVkX3N0cmluZzMoImludGlhbGx5IHNvbWV0aGluZyBlbHNlIik7CisgIEJ5dGVTdHJpbmdWaWV3IGFzc2lnbmVkX2FsdGVybmF0ZV9zdHJpbmczKCJpbml0YWxseSBzb21ldGhpbmcgZWxzZSIpOworICBCeXRlU3RyaW5nVmlldyBhc3NpZ25lZF9wdHJfc3RyaW5nMygiaW5pdGlhbGx5IHNvbWV0aGluZyBlbHNlIik7CisgIEJ5dGVTdHJpbmdWaWV3IGFzc2lnbmVkX2VtYmVkZGVkX251bF9zdHJpbmc3KCJpbml0aWFsbHkgc29tZXRoaW5nIGVsc2UiKTsKKworICBhc3NpZ25lZF9zdHJpbmczID0gc3RyaW5nMzsKKyAgYXNzaWduZWRfYWx0ZXJuYXRlX3N0cmluZzMgPSBhbHRlcm5hdGVfc3RyaW5nMzsKKyAgYXNzaWduZWRfcHRyX3N0cmluZzMgPSAiYWJjIjsKKyAgYXNzaWduZWRfZW1iZWRkZWRfbnVsX3N0cmluZzcgPSBlbWJlZGRlZF9udWxfc3RyaW5nNzsKKyAgRVhQRUNUX0VRKHN0cmluZzMsIGFzc2lnbmVkX3N0cmluZzMpOworICBFWFBFQ1RfRVEoYWx0ZXJuYXRlX3N0cmluZzMsIGFzc2lnbmVkX2FsdGVybmF0ZV9zdHJpbmczKTsKKyAgRVhQRUNUX0VRKGFsdGVybmF0ZV9zdHJpbmczLCBhc3NpZ25lZF9wdHJfc3RyaW5nMyk7CisgIEVYUEVDVF9FUShlbWJlZGRlZF9udWxfc3RyaW5nNywgYXNzaWduZWRfZW1iZWRkZWRfbnVsX3N0cmluZzcpOworfQorCitURVNUKEJ5dGVTdHJpbmdWaWV3LCBGcm9tQ2hhcikgeworICBCeXRlU3RyaW5nVmlldyBudWxsX3N0cmluZzsKKyAgQnl0ZVN0cmluZ1ZpZXcgbG93ZXJfYV9zdHJpbmcoImEiKTsKKworICAvLyBNdXN0IGhhdmUgbHZhbHVlcyB0aGF0IG91dGxpdmUgdGhlIGNvcnJlc3BvbmRpbmcgQnl0ZVN0cmluZ0MuCisgIGNoYXIgbnVsID0gJ1wwJzsKKyAgY2hhciBsb3dlcl9hID0gJ2EnOworICBCeXRlU3RyaW5nVmlldyBudWxfc3RyaW5nX2Zyb21fY2hhcihudWwpOworICBCeXRlU3RyaW5nVmlldyBsb3dlcl9hX3N0cmluZ19mcm9tX2NoYXIobG93ZXJfYSk7CisKKyAgLy8gUG9pbnRlciB0byBudWwsIG5vdCBudWxscHRyIHB0ciwgaGVuY2UgbGVuZ3RoIDEgLi4uCisgIEVYUEVDVF9FUSgxdSwgbnVsX3N0cmluZ19mcm9tX2NoYXIuR2V0TGVuZ3RoKCkpOworICBFWFBFQ1RfTkUobnVsbF9zdHJpbmcsIG51bF9zdHJpbmdfZnJvbV9jaGFyKTsKKworICBFWFBFQ1RfRVEoMXUsIGxvd2VyX2Ffc3RyaW5nX2Zyb21fY2hhci5HZXRMZW5ndGgoKSk7CisgIEVYUEVDVF9FUShsb3dlcl9hX3N0cmluZywgbG93ZXJfYV9zdHJpbmdfZnJvbV9jaGFyKTsKKyAgRVhQRUNUX05FKG51bF9zdHJpbmdfZnJvbV9jaGFyLCBsb3dlcl9hX3N0cmluZ19mcm9tX2NoYXIpOworCisgIEJ5dGVTdHJpbmdWaWV3IGxvbmdlcl9zdHJpbmcoImFiIik7CisgIEVYUEVDVF9ORShsb25nZXJfc3RyaW5nLCBsb3dlcl9hX3N0cmluZ19mcm9tX2NoYXIpOworfQorCitURVNUKEJ5dGVTdHJpbmdWaWV3LCBGcm9tVmVjdG9yKSB7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG51bGxfdmVjOworICBCeXRlU3RyaW5nVmlldyBudWxsX3N0cmluZyhudWxsX3ZlYyk7CisgIEVYUEVDVF9FUSgwdSwgbnVsbF9zdHJpbmcuR2V0TGVuZ3RoKCkpOworCisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGxvd2VyX2FfdmVjKDEwLCBzdGF0aWNfY2FzdDx1aW50OF90PignYScpKTsKKyAgQnl0ZVN0cmluZ1ZpZXcgbG93ZXJfYV9zdHJpbmcobG93ZXJfYV92ZWMpOworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8c2l6ZV90PigxMCksIGxvd2VyX2Ffc3RyaW5nLkdldExlbmd0aCgpKTsKKyAgRVhQRUNUX0VRKCJhYWFhYWFhYWFhIiwgbG93ZXJfYV9zdHJpbmcpOworCisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNsZWFyZWRfdmVjOworICBjbGVhcmVkX3ZlYy5wdXNoX2JhY2soNDIpOworICBjbGVhcmVkX3ZlYy5wb3BfYmFjaygpOworICBCeXRlU3RyaW5nVmlldyBjbGVhcmVkX3N0cmluZyhjbGVhcmVkX3ZlYyk7CisgIEVYUEVDVF9FUSgwdSwgY2xlYXJlZF9zdHJpbmcuR2V0TGVuZ3RoKCkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgY2xlYXJlZF9zdHJpbmcucmF3X3N0cigpKTsKK30KKworVEVTVChCeXRlU3RyaW5nVmlldywgR2V0SUQpIHsKKyAgQnl0ZVN0cmluZ1ZpZXcgbnVsbF9zdHJpbmc7CisgIEVYUEVDVF9FUSgwdSwgbnVsbF9zdHJpbmcuR2V0SUQoKSk7CisKKyAgQnl0ZVN0cmluZ1ZpZXcgZW1wdHlfc3RyaW5nKCIiKTsKKyAgRVhQRUNUX0VRKDB1LCBlbXB0eV9zdHJpbmcuR2V0SUQoKSk7CisKKyAgQnl0ZVN0cmluZ1ZpZXcgc2hvcnRfc3RyaW5nKCJhYiIpOworICBFWFBFQ1RfRVEoRlhCU1RSX0lEKCdhJywgJ2InLCAwLCAwKSwgc2hvcnRfc3RyaW5nLkdldElEKCkpOworCisgIEJ5dGVTdHJpbmdWaWV3IGxvbmdlcl9zdHJpbmcoImFiY2RlZiIpOworICBFWFBFQ1RfRVEoRlhCU1RSX0lEKCdhJywgJ2InLCAnYycsICdkJyksIGxvbmdlcl9zdHJpbmcuR2V0SUQoKSk7Cit9CisKK1RFU1QoQnl0ZVN0cmluZ1ZpZXcsIEZpbmQpIHsKKyAgQnl0ZVN0cmluZ1ZpZXcgbnVsbF9zdHJpbmc7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZy5GaW5kKCdhJykuaGFzX3ZhbHVlKCkpOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcuRmluZCgnXDAnKS5oYXNfdmFsdWUoKSk7CisKKyAgQnl0ZVN0cmluZ1ZpZXcgZW1wdHlfc3RyaW5nKCIiKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZy5GaW5kKCdhJykuaGFzX3ZhbHVlKCkpOworICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nLkZpbmQoJ1wwJykuaGFzX3ZhbHVlKCkpOworCisgIE9wdGlvbmFsPHNpemVfdD4gcmVzdWx0OworICBCeXRlU3RyaW5nVmlldyBzaW5nbGVfc3RyaW5nKCJhIik7CisgIHJlc3VsdCA9IHNpbmdsZV9zdHJpbmcuRmluZCgnYScpOworICBBU1NFUlRfVFJVRShyZXN1bHQuaGFzX3ZhbHVlKCkpOworICBFWFBFQ1RfRVEoMHUsIHJlc3VsdC52YWx1ZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKHNpbmdsZV9zdHJpbmcuRmluZCgnYicpLmhhc192YWx1ZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKHNpbmdsZV9zdHJpbmcuRmluZCgnXDAnKS5oYXNfdmFsdWUoKSk7CisKKyAgQnl0ZVN0cmluZ1ZpZXcgbG9uZ2VyX3N0cmluZygiYWJjY2MiKTsKKyAgcmVzdWx0ID0gbG9uZ2VyX3N0cmluZy5GaW5kKCdhJyk7CisgIEFTU0VSVF9UUlVFKHJlc3VsdC5oYXNfdmFsdWUoKSk7CisgIEVYUEVDVF9FUSgwdSwgcmVzdWx0LnZhbHVlKCkpOworICByZXN1bHQgPSBsb25nZXJfc3RyaW5nLkZpbmQoJ2MnKTsKKyAgQVNTRVJUX1RSVUUocmVzdWx0Lmhhc192YWx1ZSgpKTsKKyAgRVhQRUNUX0VRKDJ1LCByZXN1bHQudmFsdWUoKSk7CisgIEVYUEVDVF9GQUxTRShsb25nZXJfc3RyaW5nLkZpbmQoJ2QnKS5oYXNfdmFsdWUoKSk7CisgIEVYUEVDVF9GQUxTRShsb25nZXJfc3RyaW5nLkZpbmQoJ1wwJykuaGFzX3ZhbHVlKCkpOworCisgIEJ5dGVTdHJpbmdWaWV3IGhpYnl0ZV9zdHJpbmcoCisgICAgICAiYWJceDhjIgorICAgICAgImRlZiIpOworICByZXN1bHQgPSBoaWJ5dGVfc3RyaW5nLkZpbmQoJ1x4OGMnKTsKKyAgQVNTRVJUX1RSVUUocmVzdWx0Lmhhc192YWx1ZSgpKTsKKyAgRVhQRUNUX0VRKDJ1LCByZXN1bHQudmFsdWUoKSk7Cit9CisKK1RFU1QoQnl0ZVN0cmluZ1ZpZXcsIE1pZCkgeworICBCeXRlU3RyaW5nVmlldyBudWxsX3N0cmluZzsKKyAgRVhQRUNUX0VRKG51bGxfc3RyaW5nLCBudWxsX3N0cmluZy5NaWQoMCwgMSkpOworICBFWFBFQ1RfRVEobnVsbF9zdHJpbmcsIG51bGxfc3RyaW5nLk1pZCgxLCAxKSk7CisKKyAgQnl0ZVN0cmluZ1ZpZXcgZW1wdHlfc3RyaW5nKCIiKTsKKyAgRVhQRUNUX0VRKCIiLCBlbXB0eV9zdHJpbmcuTWlkKDAsIDEpKTsKKyAgRVhQRUNUX0VRKCIiLCBlbXB0eV9zdHJpbmcuTWlkKDEsIDEpKTsKKworICBCeXRlU3RyaW5nVmlldyBzaW5nbGVfY2hhcmFjdGVyKCJhIik7CisgIEVYUEVDVF9FUSgiIiwgc2luZ2xlX2NoYXJhY3Rlci5NaWQoMCwgMCkpOworICBFWFBFQ1RfRVEoc2luZ2xlX2NoYXJhY3Rlciwgc2luZ2xlX2NoYXJhY3Rlci5NaWQoMCwgMSkpOworICBFWFBFQ1RfRVEoIiIsIHNpbmdsZV9jaGFyYWN0ZXIuTWlkKDEsIDApKTsKKyAgRVhQRUNUX0VRKCIiLCBzaW5nbGVfY2hhcmFjdGVyLk1pZCgxLCAxKSk7CisKKyAgQnl0ZVN0cmluZ1ZpZXcgbG9uZ2VyX3N0cmluZygiYWJjZGVmIik7CisgIEVYUEVDVF9FUShsb25nZXJfc3RyaW5nLCBsb25nZXJfc3RyaW5nLk1pZCgwLCA2KSk7CisgIEVYUEVDVF9FUSgiIiwgbG9uZ2VyX3N0cmluZy5NaWQoMCwgMTg3KSk7CisKKyAgQnl0ZVN0cmluZ1ZpZXcgbGVhZGluZ19zdWJzdHJpbmcoImFiIik7CisgIEVYUEVDVF9FUShsZWFkaW5nX3N1YnN0cmluZywgbG9uZ2VyX3N0cmluZy5NaWQoMCwgMikpOworCisgIEJ5dGVTdHJpbmdWaWV3IG1pZGRsZV9zdWJzdHJpbmcoImJjZGUiKTsKKyAgRVhQRUNUX0VRKG1pZGRsZV9zdWJzdHJpbmcsIGxvbmdlcl9zdHJpbmcuTWlkKDEsIDQpKTsKKworICBCeXRlU3RyaW5nVmlldyB0cmFpbGluZ19zdWJzdHJpbmcoImVmIik7CisgIEVYUEVDVF9FUSh0cmFpbGluZ19zdWJzdHJpbmcsIGxvbmdlcl9zdHJpbmcuTWlkKDQsIDIpKTsKKyAgRVhQRUNUX0VRKCIiLCBsb25nZXJfc3RyaW5nLk1pZCg0LCAzKSk7Cit9CisKK1RFU1QoQnl0ZVN0cmluZ1ZpZXcsIFRyaW1tZWRSaWdodCkgeworICBCeXRlU3RyaW5nVmlldyBmcmVkKCJGUkVEIik7CisgIEVYUEVDVF9FUSgiRlJFRCIsIGZyZWQuVHJpbW1lZFJpZ2h0KCdFJykpOworICBFWFBFQ1RfRVEoIkZSRSIsIGZyZWQuVHJpbW1lZFJpZ2h0KCdEJykpOworICBCeXRlU3RyaW5nVmlldyBmcmVkZCgiRlJFREQiKTsKKyAgRVhQRUNUX0VRKCJGUkUiLCBmcmVkLlRyaW1tZWRSaWdodCgnRCcpKTsKK30KKworVEVTVChCeXRlU3RyaW5nVmlldywgRWxlbWVudEFjY2VzcykgeworICAvLyBCeXRlU3RyaW5nVmlldyBpbmNsdWRlcyB0aGUgTlVMIHRlcm1pbmF0b3IgZm9yIG5vbi1lbXB0eSBzdHJpbmdzLgorICBCeXRlU3RyaW5nVmlldyBhYmMoImFiYyIpOworICBFWFBFQ1RfRVEoJ2EnLCBzdGF0aWNfY2FzdDxjaGFyPihhYmNbMF0pKTsKKyAgRVhQRUNUX0VRKCdiJywgc3RhdGljX2Nhc3Q8Y2hhcj4oYWJjWzFdKSk7CisgIEVYUEVDVF9FUSgnYycsIHN0YXRpY19jYXN0PGNoYXI+KGFiY1syXSkpOworI2lmbmRlZiBOREVCVUcKKyAgRVhQRUNUX0RFQVRIKHsgYWJjWzNdOyB9LCAiLioiKTsKKyNlbmRpZgorfQorCitURVNUKEJ5dGVTdHJpbmdWaWV3LCBPcGVyYXRvckxUKSB7CisgIEJ5dGVTdHJpbmdWaWV3IGVtcHR5OworICBCeXRlU3RyaW5nVmlldyBhKCJhIik7CisgIEJ5dGVTdHJpbmdWaWV3IGFiYygiYWJjIik7CisgIEJ5dGVTdHJpbmdWaWV3IGRlZigiZGVmIik7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGNfbnVsbCA9IG51bGxwdHI7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGNfZW1wdHkgPSAiIjsKKyAgY29uc3QgY2hhciogY29uc3QgY19hID0gImEiOworICBjb25zdCBjaGFyKiBjb25zdCBjX2FiYyA9ICJhYmMiOworICBjb25zdCBjaGFyKiBjb25zdCBjX2RlZiA9ICJkZWYiOworCisgIEVYUEVDVF9GQUxTRShlbXB0eSA8IGVtcHR5KTsKKyAgRVhQRUNUX0ZBTFNFKGEgPCBhKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IGFiYyk7CisgIEVYUEVDVF9GQUxTRShkZWYgPCBkZWYpOworICBFWFBFQ1RfRkFMU0UoY19udWxsIDwgZW1wdHkpOworICBFWFBFQ1RfRkFMU0UoY19lbXB0eSA8IGVtcHR5KTsKKyAgRVhQRUNUX0ZBTFNFKGNfYSA8IGEpOworICBFWFBFQ1RfRkFMU0UoY19hYmMgPCBhYmMpOworICBFWFBFQ1RfRkFMU0UoY19kZWYgPCBkZWYpOworICBFWFBFQ1RfRkFMU0UoZW1wdHkgPCBjX251bGwpOworICBFWFBFQ1RfRkFMU0UoZW1wdHkgPCBjX2VtcHR5KTsKKyAgRVhQRUNUX0ZBTFNFKGEgPCBjX2EpOworICBFWFBFQ1RfRkFMU0UoYWJjIDwgY19hYmMpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgY19kZWYpOworCisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgYSk7CisgIEVYUEVDVF9GQUxTRShhIDwgZW1wdHkpOworICBFWFBFQ1RfVFJVRShlbXB0eSA8IGNfYSk7CisgIEVYUEVDVF9GQUxTRShhIDwgY19udWxsKTsKKyAgRVhQRUNUX0ZBTFNFKGEgPCBjX2VtcHR5KTsKKworICBFWFBFQ1RfVFJVRShlbXB0eSA8IGFiYyk7CisgIEVYUEVDVF9GQUxTRShhYmMgPCBlbXB0eSk7CisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgY19hYmMpOworICBFWFBFQ1RfRkFMU0UoYWJjIDwgY19udWxsKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IGNfZW1wdHkpOworCisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGVtcHR5KTsKKyAgRVhQRUNUX1RSVUUoZW1wdHkgPCBjX2RlZik7CisgIEVYUEVDVF9GQUxTRShkZWYgPCBjX251bGwpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgY19lbXB0eSk7CisKKyAgRVhQRUNUX1RSVUUoYSA8IGFiYyk7CisgIEVYUEVDVF9GQUxTRShhYmMgPCBhKTsKKyAgRVhQRUNUX1RSVUUoYSA8IGNfYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IGNfYSk7CisKKyAgRVhQRUNUX1RSVUUoYSA8IGRlZik7CisgIEVYUEVDVF9GQUxTRShkZWYgPCBhKTsKKyAgRVhQRUNUX1RSVUUoYSA8IGNfZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGNfYSk7CisKKyAgRVhQRUNUX1RSVUUoYWJjIDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGFiYyk7CisgIEVYUEVDVF9UUlVFKGFiYyA8IGNfZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGNfYWJjKTsKK30KKworVEVTVChCeXRlU3RyaW5nVmlldywgT3BlcmF0b3JFUSkgeworICBCeXRlU3RyaW5nVmlldyBieXRlX3N0cmluZ19jKCJoZWxsbyIpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jID09IGJ5dGVfc3RyaW5nX2MpOworCisgIEJ5dGVTdHJpbmdWaWV3IGJ5dGVfc3RyaW5nX2Nfc2FtZTEoImhlbGxvIik7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgPT0gYnl0ZV9zdHJpbmdfY19zYW1lMSk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2Nfc2FtZTEgPT0gYnl0ZV9zdHJpbmdfYyk7CisKKyAgQnl0ZVN0cmluZ1ZpZXcgYnl0ZV9zdHJpbmdfY19zYW1lMihieXRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZ19jX3NhbWUyKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfY19zYW1lMiA9PSBieXRlX3N0cmluZ19jKTsKKworICBCeXRlU3RyaW5nVmlldyBieXRlX3N0cmluZ19jMSgiaGUiKTsKKyAgQnl0ZVN0cmluZ1ZpZXcgYnl0ZV9zdHJpbmdfYzIoImhlbGxwIik7CisgIEJ5dGVTdHJpbmdWaWV3IGJ5dGVfc3RyaW5nX2MzKCJoZWxsb2QiKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgPT0gYnl0ZV9zdHJpbmdfYzEpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZ19jMik7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGJ5dGVfc3RyaW5nX2MzKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MxID09IGJ5dGVfc3RyaW5nX2MpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYzIgPT0gYnl0ZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jMyA9PSBieXRlX3N0cmluZ19jKTsKKworICBCeXRlU3RyaW5nIGJ5dGVfc3RyaW5nX3NhbWUxKCJoZWxsbyIpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jID09IGJ5dGVfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfc2FtZTEgPT0gYnl0ZV9zdHJpbmdfYyk7CisKKyAgQnl0ZVN0cmluZyBieXRlX3N0cmluZzEoImhlIik7CisgIEJ5dGVTdHJpbmcgYnl0ZV9zdHJpbmcyKCJoZWxscCIpOworICBCeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMygiaGVsbG9kIik7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGJ5dGVfc3RyaW5nMSk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGJ5dGVfc3RyaW5nMik7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGJ5dGVfc3RyaW5nMyk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZzEgPT0gYnl0ZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZzIgPT0gYnl0ZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZzMgPT0gYnl0ZV9zdHJpbmdfYyk7CisKKyAgY29uc3QgY2hhciogY29uc3QgY19zdHJpbmdfc2FtZTEgPSAiaGVsbG8iOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jID09IGNfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX1RSVUUoY19zdHJpbmdfc2FtZTEgPT0gYnl0ZV9zdHJpbmdfYyk7CisKKyAgY29uc3QgY2hhciogY29uc3QgY19zdHJpbmcxID0gImhlIjsKKyAgY29uc3QgY2hhciogY29uc3QgY19zdHJpbmcyID0gImhlbGxwIjsKKyAgY29uc3QgY2hhciogY29uc3QgY19zdHJpbmczID0gImhlbGxvZCI7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGNfc3RyaW5nMSk7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGNfc3RyaW5nMik7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGNfc3RyaW5nMyk7CisKKyAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMSA9PSBieXRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMiA9PSBieXRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMyA9PSBieXRlX3N0cmluZ19jKTsKK30KKworVEVTVChCeXRlU3RyaW5nVmlldywgT3BlcmF0b3JORSkgeworICBCeXRlU3RyaW5nVmlldyBieXRlX3N0cmluZ19jKCJoZWxsbyIpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZ19jKTsKKworICBCeXRlU3RyaW5nVmlldyBieXRlX3N0cmluZ19jX3NhbWUxKCJoZWxsbyIpOworICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZ19jX3NhbWUxKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2Nfc2FtZTEgIT0gYnl0ZV9zdHJpbmdfYyk7CisKKyAgQnl0ZVN0cmluZ1ZpZXcgYnl0ZV9zdHJpbmdfY19zYW1lMihieXRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgIT0gYnl0ZV9zdHJpbmdfY19zYW1lMik7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jX3NhbWUyICE9IGJ5dGVfc3RyaW5nX2MpOworCisgIEJ5dGVTdHJpbmdWaWV3IGJ5dGVfc3RyaW5nX2MxKCJoZSIpOworICBCeXRlU3RyaW5nVmlldyBieXRlX3N0cmluZ19jMigiaGVsbHAiKTsKKyAgQnl0ZVN0cmluZ1ZpZXcgYnl0ZV9zdHJpbmdfYzMoImhlbGxvZCIpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jICE9IGJ5dGVfc3RyaW5nX2MxKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZ19jMik7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgIT0gYnl0ZV9zdHJpbmdfYzMpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jMSAhPSBieXRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYzIgIT0gYnl0ZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MzICE9IGJ5dGVfc3RyaW5nX2MpOworCisgIEJ5dGVTdHJpbmcgYnl0ZV9zdHJpbmdfc2FtZTEoImhlbGxvIik7CisgIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jICE9IGJ5dGVfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX3NhbWUxICE9IGJ5dGVfc3RyaW5nX2MpOworCisgIEJ5dGVTdHJpbmcgYnl0ZV9zdHJpbmcxKCJoZSIpOworICBCeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMigiaGVsbHAiKTsKKyAgQnl0ZVN0cmluZyBieXRlX3N0cmluZzMoImhlbGxvZCIpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jICE9IGJ5dGVfc3RyaW5nMSk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgIT0gYnl0ZV9zdHJpbmcyKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZzMpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZzEgIT0gYnl0ZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nMiAhPSBieXRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmczICE9IGJ5dGVfc3RyaW5nX2MpOworCisgIGNvbnN0IGNoYXIqIGNvbnN0IGNfc3RyaW5nX3NhbWUxID0gImhlbGxvIjsKKyAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgIT0gY19zdHJpbmdfc2FtZTEpOworICBFWFBFQ1RfRkFMU0UoY19zdHJpbmdfc2FtZTEgIT0gYnl0ZV9zdHJpbmdfYyk7CisKKyAgY29uc3QgY2hhciogY29uc3QgY19zdHJpbmcxID0gImhlIjsKKyAgY29uc3QgY2hhciogY29uc3QgY19zdHJpbmcyID0gImhlbGxwIjsKKyAgY29uc3QgY2hhciogY29uc3QgY19zdHJpbmczID0gImhlbGxvZCI7CisgIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgIT0gY19zdHJpbmcxKTsKKyAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyAhPSBjX3N0cmluZzIpOworICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jICE9IGNfc3RyaW5nMyk7CisKKyAgRVhQRUNUX1RSVUUoY19zdHJpbmcxICE9IGJ5dGVfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRShjX3N0cmluZzIgIT0gYnl0ZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKGNfc3RyaW5nMyAhPSBieXRlX3N0cmluZ19jKTsKK30KKworVEVTVChCeXRlU3RyaW5nVmlldywgTnVsbEl0ZXJhdG9yKSB7CisgIEJ5dGVTdHJpbmdWaWV3IG51bGxfc3RyOworICBpbnQzMl90IHN1bSA9IDA7CisgIGJvb2wgYW55X3ByZXNlbnQgPSBmYWxzZTsKKyAgZm9yIChjb25zdCBhdXRvJiBjIDogbnVsbF9zdHIpIHsKKyAgICBzdW0gKz0gYzsgIC8vIEF2b2lkIHVudXNlZCBhcmcgd2FybmluZ3MuCisgICAgYW55X3ByZXNlbnQgPSB0cnVlOworICB9CisgIEVYUEVDVF9GQUxTRShhbnlfcHJlc2VudCk7CisgIEVYUEVDVF9FUSgwLCBzdW0pOworfQorCitURVNUKEJ5dGVTdHJpbmdWaWV3LCBFbXB0eUl0ZXJhdG9yKSB7CisgIEJ5dGVTdHJpbmdWaWV3IGVtcHR5X3N0cigiIik7CisgIGludDMyX3Qgc3VtID0gMDsKKyAgYm9vbCBhbnlfcHJlc2VudCA9IGZhbHNlOworICBmb3IgKGNvbnN0IGF1dG8mIGMgOiBlbXB0eV9zdHIpIHsKKyAgICBhbnlfcHJlc2VudCA9IHRydWU7CisgICAgc3VtICs9IGM7ICAvLyBBdm9pZCB1bnVzZWQgYXJnIHdhcm5pbmdzLgorICB9CisgIEVYUEVDVF9GQUxTRShhbnlfcHJlc2VudCk7CisgIEVYUEVDVF9FUSgwLCBzdW0pOworfQorCitURVNUKEJ5dGVTdHJpbmdWaWV3LCBPbmVDaGFySXRlcmF0b3IpIHsKKyAgQnl0ZVN0cmluZ1ZpZXcgb25lX3N0cigiYSIpOworICBpbnQzMl90IHN1bSA9IDA7CisgIGJvb2wgYW55X3ByZXNlbnQgPSBmYWxzZTsKKyAgZm9yIChjb25zdCBhdXRvJiBjIDogb25lX3N0cikgeworICAgIGFueV9wcmVzZW50ID0gdHJ1ZTsKKyAgICBzdW0gKz0gYzsgIC8vIEF2b2lkIHVudXNlZCBhcmcgd2FybmluZ3MuCisgIH0KKyAgRVhQRUNUX1RSVUUoYW55X3ByZXNlbnQpOworICBFWFBFQ1RfRVEoJ2EnLCBzdW0pOworfQorCitURVNUKEJ5dGVTdHJpbmdWaWV3LCBNdWx0aUNoYXJJdGVyYXRvcikgeworICBCeXRlU3RyaW5nVmlldyBvbmVfc3RyKCJhYmMiKTsKKyAgaW50MzJfdCBzdW0gPSAwOworICBib29sIGFueV9wcmVzZW50ID0gZmFsc2U7CisgIGZvciAoY29uc3QgYXV0byYgYyA6IG9uZV9zdHIpIHsKKyAgICBhbnlfcHJlc2VudCA9IHRydWU7CisgICAgc3VtICs9IGM7ICAvLyBBdm9pZCB1bnVzZWQgYXJnIHdhcm5pbmdzLgorICB9CisgIEVYUEVDVF9UUlVFKGFueV9wcmVzZW50KTsKKyAgRVhQRUNUX0VRKCdhJyArICdiJyArICdjJywgc3VtKTsKK30KKworVEVTVChCeXRlU3RyaW5nVmlldywgRW1wdHlSZXZlcnNlSXRlcmF0b3IpIHsKKyAgQnl0ZVN0cmluZ1ZpZXcgZW1wdHk7CisgIGF1dG8gaXRlciA9IGVtcHR5LnJiZWdpbigpOworICBFWFBFQ1RfVFJVRShpdGVyID09IGVtcHR5LnJlbmQoKSk7CisgIEVYUEVDVF9GQUxTRShpdGVyICE9IGVtcHR5LnJlbmQoKSk7CisgIEVYUEVDVF9GQUxTRShpdGVyIDwgZW1wdHkucmVuZCgpKTsKK30KKworVEVTVChCeXRlU3RyaW5nVmlldywgT25lQ2hhclJldmVyc2VJdGVyYXRvcikgeworICBCeXRlU3RyaW5nVmlldyBvbmVfc3RyKCJhIik7CisgIGF1dG8gaXRlciA9IG9uZV9zdHIucmJlZ2luKCk7CisgIEVYUEVDVF9GQUxTRShpdGVyID09IG9uZV9zdHIucmVuZCgpKTsKKyAgRVhQRUNUX1RSVUUoaXRlciAhPSBvbmVfc3RyLnJlbmQoKSk7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPCBvbmVfc3RyLnJlbmQoKSk7CisKKyAgY2hhciBjaCA9ICppdGVyKys7CisgIEVYUEVDVF9FUSgnYScsIGNoKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA9PSBvbmVfc3RyLnJlbmQoKSk7CisgIEVYUEVDVF9GQUxTRShpdGVyICE9IG9uZV9zdHIucmVuZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKGl0ZXIgPCBvbmVfc3RyLnJlbmQoKSk7Cit9CisKK1RFU1QoQnl0ZVN0cmluZ1ZpZXcsIE11bHRpQ2hhclJldmVyc2VJdGVyYXRvcikgeworICBCeXRlU3RyaW5nVmlldyBtdWx0aV9zdHIoImFiY2QiKTsKKyAgYXV0byBpdGVyID0gbXVsdGlfc3RyLnJiZWdpbigpOworICBFWFBFQ1RfRkFMU0UoaXRlciA9PSBtdWx0aV9zdHIucmVuZCgpKTsKKworICBjaGFyIGNoID0gKml0ZXIrKzsKKyAgRVhQRUNUX0VRKCdkJywgY2gpOworICBFWFBFQ1RfRVEoJ2MnLCAqaXRlcik7CisgIEVYUEVDVF9GQUxTRShpdGVyID09IG11bHRpX3N0ci5yZW5kKCkpOworCisgIGNoID0gKigrK2l0ZXIpOworICBFWFBFQ1RfRVEoJ2InLCBjaCk7CisgIEVYUEVDVF9FUSgnYicsICppdGVyKTsKKyAgRVhQRUNUX0ZBTFNFKGl0ZXIgPT0gbXVsdGlfc3RyLnJlbmQoKSk7CisKKyAgY2ggPSAqaXRlcisrOworICBFWFBFQ1RfRVEoJ2InLCBjaCk7CisgIEVYUEVDVF9FUSgnYScsICppdGVyKTsKKyAgRVhQRUNUX0ZBTFNFKGl0ZXIgPT0gbXVsdGlfc3RyLnJlbmQoKSk7CisKKyAgY2ggPSAqaXRlcisrOworICBFWFBFQ1RfRVEoJ2EnLCBjaCk7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPT0gbXVsdGlfc3RyLnJlbmQoKSk7CisKKyAgY2ggPSAqKC0taXRlcik7CisgIEVYUEVDVF9FUSgnYScsIGNoKTsKKyAgRVhQRUNUX0VRKCdhJywgKml0ZXIpOworICBFWFBFQ1RfRkFMU0UoaXRlciA9PSBtdWx0aV9zdHIucmVuZCgpKTsKKworICBjaCA9ICppdGVyLS07CisgIEVYUEVDVF9FUSgnYScsIGNoKTsKKyAgRVhQRUNUX0VRKCdiJywgKml0ZXIpOworICBFWFBFQ1RfRkFMU0UoaXRlciA9PSBtdWx0aV9zdHIucmVuZCgpKTsKKworICBjaCA9ICppdGVyLS07CisgIEVYUEVDVF9FUSgnYicsIGNoKTsKKyAgRVhQRUNUX0VRKCdjJywgKml0ZXIpOworICBFWFBFQ1RfRkFMU0UoaXRlciA9PSBtdWx0aV9zdHIucmVuZCgpKTsKKworICBjaCA9ICooLS1pdGVyKTsKKyAgRVhQRUNUX0VRKCdkJywgY2gpOworICBFWFBFQ1RfRVEoJ2QnLCAqaXRlcik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPT0gbXVsdGlfc3RyLnJiZWdpbigpKTsKK30KKworVEVTVChCeXRlU3RyaW5nVmlldywgQW55QWxsTm9uZU9mKSB7CisgIEJ5dGVTdHJpbmdWaWV3IHN0cigiYWFhYWFhYWFhYWFhYWFhYWFiIik7CisgIEVYUEVDVF9GQUxTRShzdGQ6OmFsbF9vZihzdHIuYmVnaW4oKSwgc3RyLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgY2hhciYgYykgeyByZXR1cm4gYyA9PSAnYSc7IH0pKTsKKworICBFWFBFQ1RfRkFMU0Uoc3RkOjpub25lX29mKHN0ci5iZWdpbigpLCBzdHIuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgY2hhciYgYykgeyByZXR1cm4gYyA9PSAnYSc7IH0pKTsKKworICBFWFBFQ1RfVFJVRShzdGQ6OmFueV9vZihzdHIuYmVnaW4oKSwgc3RyLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBjaGFyJiBjKSB7IHJldHVybiBjID09ICdhJzsgfSkpOworCisgIEVYUEVDVF9UUlVFKHBkZml1bTo6Q29udGFpbnNWYWx1ZShzdHIsICdhJykpOworICBFWFBFQ1RfVFJVRShwZGZpdW06OkNvbnRhaW5zVmFsdWUoc3RyLCAnYicpKTsKKyAgRVhQRUNUX0ZBTFNFKHBkZml1bTo6Q29udGFpbnNWYWx1ZShzdHIsICd6JykpOworfQorCitURVNUKEJ5dGVTdHJpbmcsIEZvcm1hdFdpZHRoKSB7CisgIEVYUEVDVF9FUSgiICAgIDEiLCBCeXRlU3RyaW5nOjpGb3JtYXQoIiU1ZCIsIDEpKTsKKyAgRVhQRUNUX0VRKCIxIiwgQnl0ZVN0cmluZzo6Rm9ybWF0KCIlZCIsIDEpKTsKKyAgRVhQRUNUX0VRKCIgICAgMSIsIEJ5dGVTdHJpbmc6OkZvcm1hdCgiJSpkIiwgNSwgMSkpOworICBFWFBFQ1RfRVEoIjEiLCBCeXRlU3RyaW5nOjpGb3JtYXQoIiUtMWQiLCAxKSk7CisgIEVYUEVDVF9FUSgiMSIsIEJ5dGVTdHJpbmc6OkZvcm1hdCgiJTBkIiwgMSkpOworfQorCitURVNUKEJ5dGVTdHJpbmcsIEZvcm1hdFByZWNpc2lvbikgeworICBFWFBFQ1RfRVEoIjEuMTIiLCBCeXRlU3RyaW5nOjpGb3JtYXQoIiUuMmYiLCAxLjEyMzQ1KSk7CisgIEVYUEVDVF9FUSgiMS4xMjMiLCBCeXRlU3RyaW5nOjpGb3JtYXQoIiUuKmYiLCAzLCAxLjEyMzQ1KSk7CisgIEVYUEVDVF9FUSgiMS4xMjM0NTAiLCBCeXRlU3RyaW5nOjpGb3JtYXQoIiVmIiwgMS4xMjM0NSkpOworICBFWFBFQ1RfRVEoIjEuMTIzNDUwIiwgQnl0ZVN0cmluZzo6Rm9ybWF0KCIlLTFmIiwgMS4xMjM0NSkpOworICBFWFBFQ1RfRVEoIjEuMTIzNDUwIiwgQnl0ZVN0cmluZzo6Rm9ybWF0KCIlMGYiLCAxLjEyMzQ1KSk7Cit9CisKK1RFU1QoQnl0ZVN0cmluZywgRW1wdHkpIHsKKyAgQnl0ZVN0cmluZyBlbXB0eV9zdHI7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0ci5Jc0VtcHR5KCkpOworICBFWFBFQ1RfRVEoMHUsIGVtcHR5X3N0ci5HZXRMZW5ndGgoKSk7CisgIGNvbnN0IGNoYXIqIGNzdHIgPSBlbXB0eV9zdHIuY19zdHIoKTsKKyAgRVhQRUNUX0VRKDB1LCBzdHJsZW4oY3N0cikpOworfQorCitURVNUKEJ5dGVTdHJpbmcsIEluaXRpYWxpemVyTGlzdCkgeworICBCeXRlU3RyaW5nIG1hbnlfc3RyKHsiY2xhbXMiLCAiIGFuZCAiLCAib3lzdGVycyJ9KTsKKyAgRVhQRUNUX0VRKCJjbGFtcyBhbmQgb3lzdGVycyIsIG1hbnlfc3RyKTsKKyAgbWFueV9zdHIgPSB7ImZpc2giLCAiIGFuZCAiLCAiY2hpcHMiLCAiIGFuZCAiLCAic29kYSJ9OworICBFWFBFQ1RfRVEoImZpc2ggYW5kIGNoaXBzIGFuZCBzb2RhIiwgbWFueV9zdHIpOworfQorCitURVNUKEJ5dGVTdHJpbmcsIE51bGxJdGVyYXRvcikgeworICBCeXRlU3RyaW5nIG51bGxfc3RyOworICBpbnQzMl90IHN1bSA9IDA7CisgIGJvb2wgYW55X3ByZXNlbnQgPSBmYWxzZTsKKyAgZm9yIChjb25zdCBhdXRvJiBjIDogbnVsbF9zdHIpIHsKKyAgICBzdW0gKz0gYzsgIC8vIEF2b2lkIHVudXNlZCBhcmcgd2FybmluZ3MuCisgICAgYW55X3ByZXNlbnQgPSB0cnVlOworICB9CisgIEVYUEVDVF9GQUxTRShhbnlfcHJlc2VudCk7CisgIEVYUEVDVF9FUSgwLCBzdW0pOworfQorCitURVNUKEJ5dGVTdHJpbmcsIEVtcHR5SXRlcmF0b3IpIHsKKyAgQnl0ZVN0cmluZyBlbXB0eV9zdHIoIiIpOworICBpbnQzMl90IHN1bSA9IDA7CisgIGJvb2wgYW55X3ByZXNlbnQgPSBmYWxzZTsKKyAgZm9yIChjb25zdCBhdXRvJiBjIDogZW1wdHlfc3RyKSB7CisgICAgYW55X3ByZXNlbnQgPSB0cnVlOworICAgIHN1bSArPSBjOyAgLy8gQXZvaWQgdW51c2VkIGFyZyB3YXJuaW5ncy4KKyAgfQorICBFWFBFQ1RfRkFMU0UoYW55X3ByZXNlbnQpOworICBFWFBFQ1RfRVEoMCwgc3VtKTsKK30KKworVEVTVChCeXRlU3RyaW5nLCBPbmVDaGFySXRlcmF0b3IpIHsKKyAgQnl0ZVN0cmluZyBvbmVfc3RyKCJhIik7CisgIGludDMyX3Qgc3VtID0gMDsKKyAgYm9vbCBhbnlfcHJlc2VudCA9IGZhbHNlOworICBmb3IgKGNvbnN0IGF1dG8mIGMgOiBvbmVfc3RyKSB7CisgICAgYW55X3ByZXNlbnQgPSB0cnVlOworICAgIHN1bSArPSBjOyAgLy8gQXZvaWQgdW51c2VkIGFyZyB3YXJuaW5ncy4KKyAgfQorICBFWFBFQ1RfVFJVRShhbnlfcHJlc2VudCk7CisgIEVYUEVDVF9FUSgnYScsIHN1bSk7Cit9CisKK1RFU1QoQnl0ZVN0cmluZywgTXVsdGlDaGFySXRlcmF0b3IpIHsKKyAgQnl0ZVN0cmluZyBvbmVfc3RyKCJhYmMiKTsKKyAgaW50MzJfdCBzdW0gPSAwOworICBib29sIGFueV9wcmVzZW50ID0gZmFsc2U7CisgIGZvciAoY29uc3QgYXV0byYgYyA6IG9uZV9zdHIpIHsKKyAgICBhbnlfcHJlc2VudCA9IHRydWU7CisgICAgc3VtICs9IGM7ICAvLyBBdm9pZCB1bnVzZWQgYXJnIHdhcm5pbmdzLgorICB9CisgIEVYUEVDVF9UUlVFKGFueV9wcmVzZW50KTsKKyAgRVhQRUNUX0VRKCdhJyArICdiJyArICdjJywgc3VtKTsKK30KKworVEVTVChCeXRlU3RyaW5nLCBBbnlBbGxOb25lT2YpIHsKKyAgQnl0ZVN0cmluZyBzdHIoImFhYWFhYWFhYWFhYWFhYWFhYiIpOworICBFWFBFQ1RfRkFMU0Uoc3RkOjphbGxfb2Yoc3RyLmJlZ2luKCksIHN0ci5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IGNoYXImIGMpIHsgcmV0dXJuIGMgPT0gJ2EnOyB9KSk7CisKKyAgRVhQRUNUX0ZBTFNFKHN0ZDo6bm9uZV9vZihzdHIuYmVnaW4oKSwgc3RyLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IGNoYXImIGMpIHsgcmV0dXJuIGMgPT0gJ2EnOyB9KSk7CisKKyAgRVhQRUNUX1RSVUUoc3RkOjphbnlfb2Yoc3RyLmJlZ2luKCksIHN0ci5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgY2hhciYgYykgeyByZXR1cm4gYyA9PSAnYSc7IH0pKTsKKworICBFWFBFQ1RfVFJVRShwZGZpdW06OkNvbnRhaW5zVmFsdWUoc3RyLCAnYScpKTsKKyAgRVhQRUNUX1RSVUUocGRmaXVtOjpDb250YWluc1ZhbHVlKHN0ciwgJ2InKSk7CisgIEVYUEVDVF9GQUxTRShwZGZpdW06OkNvbnRhaW5zVmFsdWUoc3RyLCAneicpKTsKK30KKworVEVTVChDRlhfQnl0clN0cmluZywgRXF1YWxOb0Nhc2UpIHsKKyAgQnl0ZVN0cmluZyBzdHIoImFhYSIpOworICBFWFBFQ1RfVFJVRShzdHIuRXF1YWxOb0Nhc2UoImFhYSIpKTsKKyAgRVhQRUNUX1RSVUUoc3RyLkVxdWFsTm9DYXNlKCJBQUEiKSk7CisgIEVYUEVDVF9UUlVFKHN0ci5FcXVhbE5vQ2FzZSgiYWFBIikpOworICBFWFBFQ1RfVFJVRShzdHIuRXF1YWxOb0Nhc2UoIkFhYSIpKTsKKyAgRVhQRUNUX0ZBTFNFKHN0ci5FcXVhbE5vQ2FzZSgiYWFiIikpOworICBFWFBFQ1RfRkFMU0Uoc3RyLkVxdWFsTm9DYXNlKCJhYWFhIikpOworICBFWFBFQ1RfRkFMU0Uoc3RyLkVxdWFsTm9DYXNlKCJCQkJCIikpOworICBFWFBFQ1RfRkFMU0Uoc3RyLkVxdWFsTm9DYXNlKCJhIikpOworICBFWFBFQ1RfRkFMU0Uoc3RyLkVxdWFsTm9DYXNlKCIiKSk7Cit9CisKK1RFU1QoQnl0ZVN0cmluZywgT1N0cmVhbU92ZXJsb2FkKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzdHJlYW07CisKKyAgLy8gQmFzaWMgY2FzZSwgZW1wdHkgc3RyaW5nCisgIEJ5dGVTdHJpbmcgc3RyOworICBzdHJlYW0gPDwgc3RyOworICBFWFBFQ1RfRVEoIiIsIHN0cmVhbS5zdHIoKSk7CisKKyAgLy8gQmFzaWMgY2FzZSwgbm9uLWVtcHR5IHN0cmluZworICBzdHIgPSAiZGVmIjsKKyAgc3RyZWFtLnN0cigiIik7CisgIHN0cmVhbSA8PCAiYWJjIiA8PCBzdHIgPDwgImdoaSI7CisgIEVYUEVDVF9FUSgiYWJjZGVmZ2hpIiwgc3RyZWFtLnN0cigpKTsKKworICAvLyBDaGFuZ2luZyB0aGUgQnl0ZVN0cmluZyBkb2VzIG5vdCBjaGFuZ2UgdGhlIHN0cmVhbSBpdCB3YXMgd3JpdHRlbiB0by4KKyAgc3RyID0gIjEyMyI7CisgIEVYUEVDVF9FUSgiYWJjZGVmZ2hpIiwgc3RyZWFtLnN0cigpKTsKKworICAvLyBXcml0aW5nIGl0IGFnYWluIHRvIHRoZSBzdHJlYW0gd2lsbCB1c2UgdGhlIGxhdGVzdCB2YWx1ZS4KKyAgc3RyZWFtLnN0cigiIik7CisgIHN0cmVhbSA8PCAiYWJjIiA8PCBzdHIgPDwgImdoaSI7CisgIEVYUEVDVF9FUSgiYWJjMTIzZ2hpIiwgc3RyZWFtLnN0cigpKTsKKworICBjaGFyIHN0cmluZ1dpdGhOdWxsc1tdeyd4JywgJ3knLCAnXDAnLCAneid9OworCisgIC8vIFdyaXRpbmcgYSBCeXRlU3RyaW5nIHdpdGggbnVsbHMgYW5kIG5vIHNwZWNpZmllZCBsZW5ndGggdHJlYXRzIGl0IGFzCisgIC8vIGEgQy1zdHlsZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLgorICBzdHIgPSBCeXRlU3RyaW5nKHN0cmluZ1dpdGhOdWxscyk7CisgIEVYUEVDVF9FUSgydSwgc3RyLkdldExlbmd0aCgpKTsKKyAgc3RyZWFtLnN0cigiIik7CisgIHN0cmVhbSA8PCBzdHI7CisgIEVYUEVDVF9FUSgydSwgc3RyZWFtLnRlbGxwKCkpOworCisgIC8vIFdyaXRpbmcgYSBCeXRlU3RyaW5nIHdpdGggbnVsbHMgYnV0IHNwZWNpZnlpbmcgaXRzIGxlbmd0aCB0cmVhdHMgaXQgYXMKKyAgLy8gYSBDKystc3R5bGUgc3RyaW5nLgorICBzdHIgPSBCeXRlU3RyaW5nKHN0cmluZ1dpdGhOdWxscywgNCk7CisgIEVYUEVDVF9FUSg0dSwgc3RyLkdldExlbmd0aCgpKTsKKyAgc3RyZWFtLnN0cigiIik7CisgIHN0cmVhbSA8PCBzdHI7CisgIEVYUEVDVF9FUSg0dSwgc3RyZWFtLnRlbGxwKCkpOworCisgIC8vIDw8IG9wZXJhdG9ycyBjYW4gYmUgY2hhaW5lZC4KKyAgQnl0ZVN0cmluZyBzdHIxKCJhYmMiKTsKKyAgQnl0ZVN0cmluZyBzdHIyKCJkZWYiKTsKKyAgc3RyZWFtLnN0cigiIik7CisgIHN0cmVhbSA8PCBzdHIxIDw8IHN0cjI7CisgIEVYUEVDVF9FUSgiYWJjZGVmIiwgc3RyZWFtLnN0cigpKTsKK30KKworVEVTVChCeXRlU3RyaW5nVmlldywgT1N0cmVhbU92ZXJsb2FkKSB7CisgIC8vIEJhc2ljIGNhc2UsIGVtcHR5IHN0cmluZworICB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0cmVhbTsKKyAgICBCeXRlU3RyaW5nVmlldyBzdHI7CisgICAgc3RyZWFtIDw8IHN0cjsKKyAgICBFWFBFQ1RfRVEoIiIsIHN0cmVhbS5zdHIoKSk7CisgIH0KKworICAvLyBCYXNpYyBjYXNlLCBub24tZW1wdHkgc3RyaW5nCisgIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RyZWFtOworICAgIEJ5dGVTdHJpbmdWaWV3IHN0cigiZGVmIik7CisgICAgc3RyZWFtIDw8ICJhYmMiIDw8IHN0ciA8PCAiZ2hpIjsKKyAgICBFWFBFQ1RfRVEoImFiY2RlZmdoaSIsIHN0cmVhbS5zdHIoKSk7CisgIH0KKworICAvLyBDaGFuZ2luZyB0aGUgQnl0ZVN0cmluZ1ZpZXcgZG9lcyBub3QgY2hhbmdlIHRoZSBzdHJlYW0gaXQgd2FzIHdyaXR0ZW4gdG8uCisgIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RyZWFtOworICAgIEJ5dGVTdHJpbmdWaWV3IHN0cigiYWJjIik7CisgICAgc3RyZWFtIDw8IHN0cjsKKyAgICBzdHIgPSAiMTIzIjsKKyAgICBFWFBFQ1RfRVEoImFiYyIsIHN0cmVhbS5zdHIoKSk7CisgIH0KKworICAvLyBXcml0aW5nIGl0IGFnYWluIHRvIHRoZSBzdHJlYW0gd2lsbCB1c2UgdGhlIGxhdGVzdCB2YWx1ZS4KKyAgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzdHJlYW07CisgICAgQnl0ZVN0cmluZ1ZpZXcgc3RyKCJhYmMiKTsKKyAgICBzdHJlYW0gPDwgc3RyOworICAgIHN0cmVhbS5zdHIoIiIpOworICAgIHN0ciA9ICIxMjMiOworICAgIHN0cmVhbSA8PCBzdHI7CisgICAgRVhQRUNUX0VRKCIxMjMiLCBzdHJlYW0uc3RyKCkpOworICB9CisKKyAgLy8gV3JpdGluZyBhIEJ5dGVTdHJpbmdWaWV3IHdpdGggbnVsbHMgYW5kIG5vIHNwZWNpZmllZCBsZW5ndGggdHJlYXRzIGl0IGFzCisgIC8vIGEgQy1zdHlsZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLgorICB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0cmVhbTsKKyAgICBjaGFyIHN0cmluZ1dpdGhOdWxsc1tdeyd4JywgJ3knLCAnXDAnLCAneid9OworICAgIEJ5dGVTdHJpbmdWaWV3IHN0cihzdHJpbmdXaXRoTnVsbHMpOworICAgIEVYUEVDVF9FUSgydSwgc3RyLkdldExlbmd0aCgpKTsKKyAgICBzdHJlYW0gPDwgc3RyOworICAgIEVYUEVDVF9FUSgydSwgc3RyZWFtLnRlbGxwKCkpOworICAgIHN0ciA9ICIiOworICB9CisKKyAgLy8gV3JpdGluZyBhIEJ5dGVTdHJpbmdWaWV3IHdpdGggbnVsbHMgYnV0IHNwZWNpZnlpbmcgaXRzIGxlbmd0aCB0cmVhdHMgaXQgYXMKKyAgLy8gYSBDKystc3R5bGUgc3RyaW5nLgorICB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0cmVhbTsKKyAgICBjaGFyIHN0cmluZ1dpdGhOdWxsc1tdeyd4JywgJ3knLCAnXDAnLCAneid9OworICAgIEJ5dGVTdHJpbmdWaWV3IHN0cihzdHJpbmdXaXRoTnVsbHMsIDQpOworICAgIEVYUEVDVF9FUSg0dSwgc3RyLkdldExlbmd0aCgpKTsKKyAgICBzdHJlYW0gPDwgc3RyOworICAgIEVYUEVDVF9FUSg0dSwgc3RyZWFtLnRlbGxwKCkpOworICAgIHN0ciA9ICIiOworICB9CisKKyAgLy8gPDwgb3BlcmF0b3JzIGNhbiBiZSBjaGFpbmVkLgorICB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0cmVhbTsKKyAgICBCeXRlU3RyaW5nVmlldyBzdHIxKCJhYmMiKTsKKyAgICBCeXRlU3RyaW5nVmlldyBzdHIyKCJkZWYiKTsKKyAgICBzdHJlYW0gPDwgc3RyMSA8PCBzdHIyOworICAgIEVYUEVDVF9FUSgiYWJjZGVmIiwgc3RyZWFtLnN0cigpKTsKKyAgfQorfQorCitURVNUKEJ5dGVTdHJpbmcsIEZvcm1hdEludGVnZXIpIHsKKyAgLy8gQmFzZSBjYXNlIG9mIDAuCisgIEVYUEVDVF9FUSgiMCIsIEJ5dGVTdHJpbmc6OkZvcm1hdEludGVnZXIoMCkpOworCisgIC8vIFBvc2l0aXZlIG9yZGluYXJ5IG51bWJlci4KKyAgRVhQRUNUX0VRKCIxMjM0NTYiLCBCeXRlU3RyaW5nOjpGb3JtYXRJbnRlZ2VyKDEyMzQ1NikpOworCisgIC8vIE5lZ2F0aXZlIG9yZGluYXJ5IG51bWJlci4KKyAgRVhQRUNUX0VRKCItMTIzNDU2IiwgQnl0ZVN0cmluZzo6Rm9ybWF0SW50ZWdlcigtMTIzNDU2KSk7CisKKyAgLy8gaW50IGxpbWl0cy4KKyAgRVhQRUNUX0VRKCIyMTQ3NDgzNjQ3IiwgQnl0ZVN0cmluZzo6Rm9ybWF0SW50ZWdlcihJTlRfTUFYKSk7CisgIEVYUEVDVF9FUSgiLTIxNDc0ODM2NDgiLCBCeXRlU3RyaW5nOjpGb3JtYXRJbnRlZ2VyKElOVF9NSU4pKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGZ4Y3J0CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2NmeF9iaW5hcnlidWYuY3BwIGIvY29yZS9meGNydC9jZnhfYmluYXJ5YnVmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjQzNTkzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9jZnhfYmluYXJ5YnVmLmNwcApAQCAtMCwwICsxLDc0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9iaW5hcnlidWYuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCitDRlhfQmluYXJ5QnVmOjpDRlhfQmluYXJ5QnVmKCkKKyAgICA6IG1fQWxsb2NTdGVwKDApLCBtX0FsbG9jU2l6ZSgwKSwgbV9EYXRhU2l6ZSgwKSB7fQorCitDRlhfQmluYXJ5QnVmOjp+Q0ZYX0JpbmFyeUJ1ZigpIHt9CisKK3ZvaWQgQ0ZYX0JpbmFyeUJ1Zjo6RGVsZXRlKHNpemVfdCBzdGFydF9pbmRleCwgc2l6ZV90IGNvdW50KSB7CisgIGlmICghbV9wQnVmZmVyIHx8IGNvdW50ID4gbV9EYXRhU2l6ZSB8fCBzdGFydF9pbmRleCA+IG1fRGF0YVNpemUgLSBjb3VudCkKKyAgICByZXR1cm47CisKKyAgbWVtbW92ZShtX3BCdWZmZXIuZ2V0KCkgKyBzdGFydF9pbmRleCwgbV9wQnVmZmVyLmdldCgpICsgc3RhcnRfaW5kZXggKyBjb3VudCwKKyAgICAgICAgICBtX0RhdGFTaXplIC0gc3RhcnRfaW5kZXggLSBjb3VudCk7CisgIG1fRGF0YVNpemUgLT0gY291bnQ7Cit9CisKK3NpemVfdCBDRlhfQmluYXJ5QnVmOjpHZXRMZW5ndGgoKSBjb25zdCB7CisgIHJldHVybiBtX0RhdGFTaXplOworfQorCit2b2lkIENGWF9CaW5hcnlCdWY6OkNsZWFyKCkgeworICBtX0RhdGFTaXplID0gMDsKK30KKworc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IENGWF9CaW5hcnlCdWY6OkRldGFjaEJ1ZmZlcigpIHsKKyAgbV9EYXRhU2l6ZSA9IDA7CisgIG1fQWxsb2NTaXplID0gMDsKKyAgcmV0dXJuIHN0ZDo6bW92ZShtX3BCdWZmZXIpOworfQorCit2b2lkIENGWF9CaW5hcnlCdWY6OkVzdGltYXRlU2l6ZShzaXplX3Qgc2l6ZSwgc2l6ZV90IHN0ZXApIHsKKyAgbV9BbGxvY1N0ZXAgPSBzdGVwOworICBpZiAobV9BbGxvY1NpemUgPCBzaXplKQorICAgIEV4cGFuZEJ1ZihzaXplIC0gbV9EYXRhU2l6ZSk7Cit9CisKK3ZvaWQgQ0ZYX0JpbmFyeUJ1Zjo6RXhwYW5kQnVmKHNpemVfdCBhZGRfc2l6ZSkgeworICBGWF9TQUZFX1NJWkVfVCBuZXdfc2l6ZSA9IG1fRGF0YVNpemU7CisgIG5ld19zaXplICs9IGFkZF9zaXplOworICBpZiAobV9BbGxvY1NpemUgPj0gbmV3X3NpemUuVmFsdWVPckRpZSgpKQorICAgIHJldHVybjsKKworICBzaXplX3QgYWxsb2Nfc3RlcCA9IHN0ZDo6bWF4KHN0YXRpY19jYXN0PHNpemVfdD4oMTI4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0FsbG9jU3RlcCA/IG1fQWxsb2NTdGVwIDogbV9BbGxvY1NpemUgLyA0KTsKKyAgbmV3X3NpemUgKz0gYWxsb2Nfc3RlcCAtIDE7ICAvLyBRdWFudGl6ZSwgZG9uJ3QgY29tYmluZSB0aGVzZSBsaW5lcy4KKyAgbmV3X3NpemUgLz0gYWxsb2Nfc3RlcDsKKyAgbmV3X3NpemUgKj0gYWxsb2Nfc3RlcDsKKyAgbV9BbGxvY1NpemUgPSBuZXdfc2l6ZS5WYWx1ZU9yRGllKCk7CisgIG1fcEJ1ZmZlci5yZXNldChtX3BCdWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICA/IEZYX1JlYWxsb2ModWludDhfdCwgbV9wQnVmZmVyLnJlbGVhc2UoKSwgbV9BbGxvY1NpemUpCisgICAgICAgICAgICAgICAgICAgICAgOiBGWF9BbGxvYyh1aW50OF90LCBtX0FsbG9jU2l6ZSkpOworfQorCit2b2lkIENGWF9CaW5hcnlCdWY6OkFwcGVuZEJsb2NrKGNvbnN0IHZvaWQqIHBCdWYsIHNpemVfdCBzaXplKSB7CisgIGlmIChzaXplID09IDApCisgICAgcmV0dXJuOworCisgIEV4cGFuZEJ1ZihzaXplKTsKKyAgaWYgKHBCdWYpIHsKKyAgICBtZW1jcHkobV9wQnVmZmVyLmdldCgpICsgbV9EYXRhU2l6ZSwgcEJ1Ziwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgbWVtc2V0KG1fcEJ1ZmZlci5nZXQoKSArIG1fRGF0YVNpemUsIDAsIHNpemUpOworICB9CisgIG1fRGF0YVNpemUgKz0gc2l6ZTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY2Z4X2JpbmFyeWJ1Zi5oIGIvY29yZS9meGNydC9jZnhfYmluYXJ5YnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ0ZjAxOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY2Z4X2JpbmFyeWJ1Zi5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX0NGWF9CSU5BUllCVUZfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9DRlhfQklOQVJZQlVGX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKworY2xhc3MgQ0ZYX0JpbmFyeUJ1ZiB7CisgcHVibGljOgorICBDRlhfQmluYXJ5QnVmKCk7CisgIHZpcnR1YWwgfkNGWF9CaW5hcnlCdWYoKTsKKworICB1aW50OF90KiBHZXRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtX3BCdWZmZXIuZ2V0KCk7IH0KKyAgc2l6ZV90IEdldFNpemUoKSBjb25zdCB7IHJldHVybiBtX0RhdGFTaXplOyB9CisgIHZpcnR1YWwgc2l6ZV90IEdldExlbmd0aCgpIGNvbnN0OworICBib29sIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBHZXRMZW5ndGgoKSA9PSAwOyB9CisKKyAgdm9pZCBDbGVhcigpOworICB2b2lkIEVzdGltYXRlU2l6ZShzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsbG9jX3N0ZXAgPSAwKTsKKyAgdm9pZCBBcHBlbmRCbG9jayhjb25zdCB2b2lkKiBwQnVmLCBzaXplX3Qgc2l6ZSk7CisgIHZvaWQgQXBwZW5kU3RyaW5nKGNvbnN0IEJ5dGVTdHJpbmcmIHN0cikgeworICAgIEFwcGVuZEJsb2NrKHN0ci5jX3N0cigpLCBzdHIuR2V0TGVuZ3RoKCkpOworICB9CisKKyAgdm9pZCBBcHBlbmRCeXRlKHVpbnQ4X3QgYnl0ZSkgeworICAgIEV4cGFuZEJ1ZigxKTsKKyAgICBtX3BCdWZmZXIuZ2V0KClbbV9EYXRhU2l6ZSsrXSA9IGJ5dGU7CisgIH0KKworICB2b2lkIERlbGV0ZShzaXplX3Qgc3RhcnRfaW5kZXgsIHNpemVfdCBjb3VudCk7CisKKyAgLy8gUmVsZWFzZXMgb3duZXJzaGlwIG9mIHxtX3BCdWZmZXJ8IGFuZCByZXR1cm5zIGl0LgorICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4gRGV0YWNoQnVmZmVyKCk7CisKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgRXhwYW5kQnVmKHNpemVfdCBzaXplKTsKKworICBzaXplX3QgbV9BbGxvY1N0ZXA7CisgIHNpemVfdCBtX0FsbG9jU2l6ZTsKKyAgc2l6ZV90IG1fRGF0YVNpemU7CisgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90LCBGeEZyZWVEZWxldGVyPiBtX3BCdWZmZXI7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfQ0ZYX0JJTkFSWUJVRl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jZnhfYml0c3RyZWFtLmNwcCBiL2NvcmUvZnhjcnQvY2Z4X2JpdHN0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NmNmQzNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY2Z4X2JpdHN0cmVhbS5jcHAKQEAgLTAsMCArMSw1NyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfYml0c3RyZWFtLmgiCisKKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorCitDRlhfQml0U3RyZWFtOjpDRlhfQml0U3RyZWFtKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCB1aW50MzJfdCBkd1NpemUpCisgICAgOiBtX0JpdFBvcygwKSwgbV9CaXRTaXplKGR3U2l6ZSAqIDgpLCBtX3BEYXRhKHBEYXRhKSB7CisgIEFTU0VSVChkd1NpemUgPD0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpIC8gOCk7Cit9CisKK0NGWF9CaXRTdHJlYW06On5DRlhfQml0U3RyZWFtKCkge30KKwordm9pZCBDRlhfQml0U3RyZWFtOjpCeXRlQWxpZ24oKSB7CisgIG1fQml0UG9zID0gKG1fQml0UG9zICsgNykgJiB+NzsKK30KKwordWludDMyX3QgQ0ZYX0JpdFN0cmVhbTo6R2V0Qml0cyh1aW50MzJfdCBuQml0cykgeworICBpZiAobkJpdHMgPiBtX0JpdFNpemUgfHwgbV9CaXRQb3MgKyBuQml0cyA+IG1fQml0U2l6ZSkKKyAgICByZXR1cm4gMDsKKworICBjb25zdCB1aW50OF90KiBkYXRhID0gbV9wRGF0YS5HZXQoKTsKKworICBpZiAobkJpdHMgPT0gMSkgeworICAgIGludCBiaXQgPSAoZGF0YVttX0JpdFBvcyAvIDhdICYgKDEgPDwgKDcgLSBtX0JpdFBvcyAlIDgpKSkgPyAxIDogMDsKKyAgICBtX0JpdFBvcysrOworICAgIHJldHVybiBiaXQ7CisgIH0KKworICB1aW50MzJfdCBieXRlX3BvcyA9IG1fQml0UG9zIC8gODsKKyAgdWludDMyX3QgYml0X3BvcyA9IG1fQml0UG9zICUgODsKKyAgdWludDMyX3QgYml0X2xlZnQgPSBuQml0czsKKyAgdWludDMyX3QgcmVzdWx0ID0gMDsKKyAgaWYgKGJpdF9wb3MpIHsKKyAgICBpZiAoOCAtIGJpdF9wb3MgPj0gYml0X2xlZnQpIHsKKyAgICAgIHJlc3VsdCA9IChkYXRhW2J5dGVfcG9zXSAmICgweGZmID4+IGJpdF9wb3MpKSA+PiAoOCAtIGJpdF9wb3MgLSBiaXRfbGVmdCk7CisgICAgICBtX0JpdFBvcyArPSBiaXRfbGVmdDsKKyAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIGJpdF9sZWZ0IC09IDggLSBiaXRfcG9zOworICAgIHJlc3VsdCA9IChkYXRhW2J5dGVfcG9zKytdICYgKCgxIDw8ICg4IC0gYml0X3BvcykpIC0gMSkpIDw8IGJpdF9sZWZ0OworICB9CisgIHdoaWxlIChiaXRfbGVmdCA+PSA4KSB7CisgICAgYml0X2xlZnQgLT0gODsKKyAgICByZXN1bHQgfD0gZGF0YVtieXRlX3BvcysrXSA8PCBiaXRfbGVmdDsKKyAgfQorICBpZiAoYml0X2xlZnQpCisgICAgcmVzdWx0IHw9IGRhdGFbYnl0ZV9wb3NdID4+ICg4IC0gYml0X2xlZnQpOworICBtX0JpdFBvcyArPSBuQml0czsKKyAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY2Z4X2JpdHN0cmVhbS5oIGIvY29yZS9meGNydC9jZnhfYml0c3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY4NzYwZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY2Z4X2JpdHN0cmVhbS5oCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX0NGWF9CSVRTVFJFQU1fSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9DRlhfQklUU1RSRUFNX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKKworY2xhc3MgQ0ZYX0JpdFN0cmVhbSB7CisgcHVibGljOgorICBDRlhfQml0U3RyZWFtKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCB1aW50MzJfdCBkd1NpemUpOworICB+Q0ZYX0JpdFN0cmVhbSgpOworCisgIHZvaWQgQnl0ZUFsaWduKCk7CisKKyAgYm9vbCBJc0VPRigpIGNvbnN0IHsgcmV0dXJuIG1fQml0UG9zID49IG1fQml0U2l6ZTsgfQorICB1aW50MzJfdCBHZXRQb3MoKSBjb25zdCB7IHJldHVybiBtX0JpdFBvczsgfQorICB1aW50MzJfdCBHZXRCaXRzKHVpbnQzMl90IG5CaXRzKTsKKworICB2b2lkIFNraXBCaXRzKHVpbnQzMl90IG5CaXRzKSB7IG1fQml0UG9zICs9IG5CaXRzOyB9CisgIHZvaWQgUmV3aW5kKCkgeyBtX0JpdFBvcyA9IDA7IH0KKworICB1aW50MzJfdCBCaXRzUmVtYWluaW5nKCkgY29uc3QgeworICAgIHJldHVybiBtX0JpdFNpemUgPj0gbV9CaXRQb3MgPyBtX0JpdFNpemUgLSBtX0JpdFBvcyA6IDA7CisgIH0KKworIHByaXZhdGU6CisgIHVpbnQzMl90IG1fQml0UG9zOworICB1aW50MzJfdCBtX0JpdFNpemU7CisgIFVub3duZWRQdHI8Y29uc3QgdWludDhfdD4gbV9wRGF0YTsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWENSVF9DRlhfQklUU1RSRUFNX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2NmeF9ibG9ja2J1ZmZlci5jcHAgYi9jb3JlL2Z4Y3J0L2NmeF9ibG9ja2J1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMxMzRmMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY2Z4X2Jsb2NrYnVmZmVyLmNwcApAQCAtMCwwICsxLDEyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfYmxvY2tidWZmZXIuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgeworCitjb25zdCBzaXplX3Qga0FsbG9jU3RlcCA9IDEwMjQgKiAxMDI0OworCit9ICAvLyBuYW1lc3BhY2UKKworQ0ZYX0Jsb2NrQnVmZmVyOjpDRlhfQmxvY2tCdWZmZXIoKQorICAgIDogbV9EYXRhTGVuZ3RoKDApLCBtX0J1ZmZlclNpemUoMCksIG1fU3RhcnRQb3NpdGlvbigwKSB7fQorCitDRlhfQmxvY2tCdWZmZXI6On5DRlhfQmxvY2tCdWZmZXIoKSB7fQorCitzaXplX3QgQ0ZYX0Jsb2NrQnVmZmVyOjpHZXRBbGxvY1N0ZXAoKSBjb25zdCB7CisgIHJldHVybiBrQWxsb2NTdGVwOworfQorCitzdGQ6OnBhaXI8d2NoYXJfdCosIHNpemVfdD4gQ0ZYX0Jsb2NrQnVmZmVyOjpHZXRBdmFpbGFibGVCbG9jaygpIHsKKyAgaWYgKG1fQmxvY2tBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiB7bnVsbHB0ciwgMH07CisKKyAgc2l6ZV90IHJlYWxJbmRleCA9IG1fU3RhcnRQb3NpdGlvbiArIG1fRGF0YUxlbmd0aDsKKyAgaWYgKHJlYWxJbmRleCA9PSBtX0J1ZmZlclNpemUpIHsKKyAgICBtX0Jsb2NrQXJyYXkuZW1wbGFjZV9iYWNrKEZYX0FsbG9jKHdjaGFyX3QsIGtBbGxvY1N0ZXApKTsKKyAgICBtX0J1ZmZlclNpemUgKz0ga0FsbG9jU3RlcDsKKyAgICByZXR1cm4ge21fQmxvY2tBcnJheS5iYWNrKCkuZ2V0KCksIDB9OworICB9CisgIHJldHVybiB7bV9CbG9ja0FycmF5W3JlYWxJbmRleCAvIGtBbGxvY1N0ZXBdLmdldCgpLCByZWFsSW5kZXggJSBrQWxsb2NTdGVwfTsKK30KKworYm9vbCBDRlhfQmxvY2tCdWZmZXI6OkluaXRCdWZmZXIoKSB7CisgIG1fQmxvY2tBcnJheS5jbGVhcigpOworICBtX0Jsb2NrQXJyYXkuZW1wbGFjZV9iYWNrKEZYX0FsbG9jKHdjaGFyX3QsIGtBbGxvY1N0ZXApKTsKKyAgbV9CdWZmZXJTaXplID0ga0FsbG9jU3RlcDsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ0ZYX0Jsb2NrQnVmZmVyOjpTZXRUZXh0Q2hhcihzaXplX3QgaW5kZXgsIHdjaGFyX3QgY2gpIHsKKyAgc2l6ZV90IHJlYWxJbmRleCA9IG1fU3RhcnRQb3NpdGlvbiArIGluZGV4OworICBzaXplX3QgYmxvY2tJbmRleCA9IHJlYWxJbmRleCAvIGtBbGxvY1N0ZXA7CisgIGlmIChibG9ja0luZGV4ID49IG1fQmxvY2tBcnJheS5zaXplKCkpIHsKKyAgICBzaXplX3QgbmV3QmxvY2tzID0gYmxvY2tJbmRleCAtIG1fQmxvY2tBcnJheS5zaXplKCkgKyAxOworICAgIGRvIHsKKyAgICAgIG1fQmxvY2tBcnJheS5lbXBsYWNlX2JhY2soRlhfQWxsb2Mod2NoYXJfdCwga0FsbG9jU3RlcCkpOworICAgICAgbV9CdWZmZXJTaXplICs9IGtBbGxvY1N0ZXA7CisgICAgfSB3aGlsZSAoLS1uZXdCbG9ja3MpOworICB9CisgIHdjaGFyX3QqIHBUZXh0RGF0YSA9IG1fQmxvY2tBcnJheVtibG9ja0luZGV4XS5nZXQoKTsKKyAgcFRleHREYXRhW3JlYWxJbmRleCAlIGtBbGxvY1N0ZXBdID0gY2g7CisgIG1fRGF0YUxlbmd0aCA9IHN0ZDo6bWF4KG1fRGF0YUxlbmd0aCwgaW5kZXggKyAxKTsKK30KKwordm9pZCBDRlhfQmxvY2tCdWZmZXI6OkRlbGV0ZVRleHRDaGFycyhzaXplX3QgY291bnQpIHsKKyAgaWYgKGNvdW50ID09IDApCisgICAgcmV0dXJuOworCisgIGlmIChjb3VudCA+PSBtX0RhdGFMZW5ndGgpIHsKKyAgICBSZXNldChmYWxzZSk7CisgICAgcmV0dXJuOworICB9CisgIG1fRGF0YUxlbmd0aCAtPSBjb3VudDsKK30KKworV2lkZVN0cmluZyBDRlhfQmxvY2tCdWZmZXI6OkdldFRleHREYXRhKHNpemVfdCBzdGFydCwgc2l6ZV90IGxlbmd0aCkgY29uc3QgeworICBpZiAobV9CdWZmZXJTaXplIDw9IG1fU3RhcnRQb3NpdGlvbiArIDEgfHwgbGVuZ3RoID09IDApCisgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKKworICBzaXplX3QgbWF5YmVEYXRhTGVuZ3RoID0gbV9CdWZmZXJTaXplIC0gMSAtIG1fU3RhcnRQb3NpdGlvbjsKKyAgaWYgKHN0YXJ0ID4gbWF5YmVEYXRhTGVuZ3RoKQorICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CisgIGxlbmd0aCA9IHN0ZDo6bWluKGxlbmd0aCwgbWF5YmVEYXRhTGVuZ3RoKTsKKworICBXaWRlU3RyaW5nIHdzVGV4dERhdGE7CisgIHdjaGFyX3QqIHBCdWYgPSB3c1RleHREYXRhLkdldEJ1ZmZlcihsZW5ndGgpOworICBpZiAoIXBCdWYpCisgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKKworICBzaXplX3Qgc3RhcnRCbG9jayA9IDA7CisgIHNpemVfdCBzdGFydElubmVyID0gMDsKKyAgc3RkOjp0aWUoc3RhcnRCbG9jaywgc3RhcnRJbm5lcikgPSBUZXh0RGF0YUluZGV4MkJ1ZkluZGV4KHN0YXJ0KTsKKworICBzaXplX3QgZW5kQmxvY2sgPSAwOworICBzaXplX3QgZW5kSW5uZXIgPSAwOworICBzdGQ6OnRpZShlbmRCbG9jaywgZW5kSW5uZXIpID0gVGV4dERhdGFJbmRleDJCdWZJbmRleChzdGFydCArIGxlbmd0aCk7CisKKyAgc2l6ZV90IHBvaW50ZXIgPSAwOworICBmb3IgKHNpemVfdCBpID0gc3RhcnRCbG9jazsgaSA8PSBlbmRCbG9jazsgKytpKSB7CisgICAgc2l6ZV90IGJ1ZmZlclBvaW50ZXIgPSAwOworICAgIHNpemVfdCBjb3B5TGVuZ3RoID0ga0FsbG9jU3RlcDsKKyAgICBpZiAoaSA9PSBzdGFydEJsb2NrKSB7CisgICAgICBjb3B5TGVuZ3RoIC09IHN0YXJ0SW5uZXI7CisgICAgICBidWZmZXJQb2ludGVyID0gc3RhcnRJbm5lcjsKKyAgICB9CisgICAgaWYgKGkgPT0gZW5kQmxvY2spCisgICAgICBjb3B5TGVuZ3RoIC09ICgoa0FsbG9jU3RlcCAtIDEpIC0gZW5kSW5uZXIpOworCisgICAgd2NoYXJfdCogcEJsb2NrQnVmID0gbV9CbG9ja0FycmF5W2ldLmdldCgpOworICAgIG1lbWNweShwQnVmICsgcG9pbnRlciwgcEJsb2NrQnVmICsgYnVmZmVyUG9pbnRlciwKKyAgICAgICAgICAgY29weUxlbmd0aCAqIHNpemVvZih3Y2hhcl90KSk7CisgICAgcG9pbnRlciArPSBjb3B5TGVuZ3RoOworICB9CisgIHdzVGV4dERhdGEuUmVsZWFzZUJ1ZmZlcihsZW5ndGgpOworICByZXR1cm4gd3NUZXh0RGF0YTsKK30KKworc3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PiBDRlhfQmxvY2tCdWZmZXI6OlRleHREYXRhSW5kZXgyQnVmSW5kZXgoCisgICAgY29uc3Qgc2l6ZV90IGlJbmRleCkgY29uc3QgeworICBBU1NFUlQoaUluZGV4ID49IDApOworCisgIHNpemVfdCByZWFsSW5kZXggPSBtX1N0YXJ0UG9zaXRpb24gKyBpSW5kZXg7CisgIHJldHVybiB7cmVhbEluZGV4IC8ga0FsbG9jU3RlcCwgcmVhbEluZGV4ICUga0FsbG9jU3RlcH07Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2NmeF9ibG9ja2J1ZmZlci5oIGIvY29yZS9meGNydC9jZnhfYmxvY2tidWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjNhYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9jZnhfYmxvY2tidWZmZXIuaApAQCAtMCwwICsxLDUxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENSVF9DRlhfQkxPQ0tCVUZGRVJfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9DRlhfQkxPQ0tCVUZGRVJfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKworY2xhc3MgQ0ZYX0Jsb2NrQnVmZmVyIHsKKyBwdWJsaWM6CisgIENGWF9CbG9ja0J1ZmZlcigpOworICB+Q0ZYX0Jsb2NrQnVmZmVyKCk7CisKKyAgYm9vbCBJbml0QnVmZmVyKCk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIHsgcmV0dXJuIG1fQnVmZmVyU2l6ZSAvIEdldEFsbG9jU3RlcCgpID49IDE7IH0KKworICBzdGQ6OnBhaXI8d2NoYXJfdCosIHNpemVfdD4gR2V0QXZhaWxhYmxlQmxvY2soKTsKKyAgc2l6ZV90IEdldEFsbG9jU3RlcCgpIGNvbnN0OworICBzaXplX3QgR2V0RGF0YUxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fRGF0YUxlbmd0aDsgfQorICB2b2lkIEluY3JlbWVudERhdGFMZW5ndGgoKSB7IG1fRGF0YUxlbmd0aCsrOyB9CisgIGJvb2wgSXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1fRGF0YUxlbmd0aCA9PSAwOyB9CisKKyAgdm9pZCBSZXNldChib29sIGJSZXNlcnZlRGF0YSkgeworICAgIGlmICghYlJlc2VydmVEYXRhKQorICAgICAgbV9TdGFydFBvc2l0aW9uID0gMDsKKyAgICBtX0RhdGFMZW5ndGggPSAwOworICB9CisKKyAgdm9pZCBTZXRUZXh0Q2hhcihzaXplX3QgaUluZGV4LCB3Y2hhcl90IGNoKTsKKyAgdm9pZCBEZWxldGVUZXh0Q2hhcnMoc2l6ZV90IGlDb3VudCk7CisgIFdpZGVTdHJpbmcgR2V0VGV4dERhdGEoc2l6ZV90IGlTdGFydCwgc2l6ZV90IGlMZW5ndGgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgc3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PiBUZXh0RGF0YUluZGV4MkJ1ZkluZGV4KGNvbnN0IHNpemVfdCBpSW5kZXgpIGNvbnN0OworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjx3Y2hhcl90LCBGeEZyZWVEZWxldGVyPj4gbV9CbG9ja0FycmF5OworICBzaXplX3QgbV9EYXRhTGVuZ3RoOworICBzaXplX3QgbV9CdWZmZXJTaXplOworICBzaXplX3QgbV9TdGFydFBvc2l0aW9uOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0NGWF9CTE9DS0JVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jZnhfY2hhci5jcHAgYi9jb3JlL2Z4Y3J0L2NmeF9jaGFyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzA0YjBmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9jZnhfY2hhci5jcHAKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfY2hhci5oIgorCitDRlhfQ2hhcjo6Q0ZYX0NoYXIodWludDE2X3Qgd0NoYXJDb2RlLCB1aW50MzJfdCBkd0NoYXJQcm9wcykKKyAgICA6IENGWF9DaGFyKHdDaGFyQ29kZSwgZHdDaGFyUHJvcHMsIDEwMCwgMTAwKSB7fQorCitDRlhfQ2hhcjo6Q0ZYX0NoYXIodWludDE2X3Qgd0NoYXJDb2RlLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3Q2hhclByb3BzLAorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUhvcml6b250YWxTY2FsZSwKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWZXJ0aWNhbFNjYWxlKQorICAgIDogbV9kd1N0YXR1cyhDRlhfQnJlYWtUeXBlOjpOb25lKSwKKyAgICAgIG1fbkJyZWFrVHlwZSgwKSwKKyAgICAgIG1fZHdDaGFyU3R5bGVzKDApLAorICAgICAgbV9pQ2hhcldpZHRoKDApLAorICAgICAgbV9pQmlkaUNsYXNzKDApLAorICAgICAgbV9pQmlkaUxldmVsKDApLAorICAgICAgbV9pQmlkaVBvcygwKSwKKyAgICAgIG1faUJpZGlPcmRlcigwKSwKKyAgICAgIG1faUZvbnRTaXplKDApLAorICAgICAgbV9kd0lkZW50aXR5KDApLAorICAgICAgbV93Q2hhckNvZGUod0NoYXJDb2RlKSwKKyAgICAgIG1fZHdDaGFyUHJvcHMoZHdDaGFyUHJvcHMpLAorICAgICAgbV9pSG9yaXpvbnRhbFNjYWxlKGlIb3Jpem9udGFsU2NhbGUpLAorICAgICAgbV9pVmVydGljYWxTY2FsZShpVmVydGljYWxTY2FsZSkge30KKworQ0ZYX0NoYXI6OkNGWF9DaGFyKGNvbnN0IENGWF9DaGFyJiBvdGhlcikgPSBkZWZhdWx0OworCitDRlhfQ2hhcjo6fkNGWF9DaGFyKCkgPSBkZWZhdWx0OworCitGWF9DSEFSVFlQRSBDRlhfQ2hhcjo6R2V0Q2hhclR5cGUoKSBjb25zdCB7CisgIHJldHVybiBHZXRDaGFyVHlwZUZyb21Qcm9wKG1fZHdDaGFyUHJvcHMpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jZnhfY2hhci5oIGIvY29yZS9meGNydC9jZnhfY2hhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNjI1ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2NmeF9jaGFyLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfQ0ZYX0NIQVJfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9DRlhfQ0hBUl9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3VuaWNvZGUuaCIKKworZW51bSBjbGFzcyBDRlhfQnJlYWtUeXBlIHsgTm9uZSA9IDAsIFBpZWNlLCBMaW5lLCBQYXJhZ3JhcGgsIFBhZ2UgfTsKKworY2xhc3MgQ0ZYX0NoYXIgeworIHB1YmxpYzoKKyAgQ0ZYX0NoYXIodWludDE2X3Qgd0NoYXJDb2RlLCB1aW50MzJfdCBkd0NoYXJQcm9wcyk7CisgIENGWF9DaGFyKHVpbnQxNl90IHdDaGFyQ29kZSwKKyAgICAgICAgICAgdWludDMyX3QgZHdDaGFyUHJvcHMsCisgICAgICAgICAgIGludDMyX3QgaUhvcml6b250YWxTY2FsZSwKKyAgICAgICAgICAgaW50MzJfdCBpVmVydGljYWxTY2FsZSk7CisgIENGWF9DaGFyKGNvbnN0IENGWF9DaGFyJiBvdGhlcik7CisgIH5DRlhfQ2hhcigpOworCisgIEZYX0NIQVJUWVBFIEdldENoYXJUeXBlKCkgY29uc3Q7CisKKyAgdWludDE2X3QgY2hhcl9jb2RlKCkgY29uc3QgeyByZXR1cm4gbV93Q2hhckNvZGU7IH0KKyAgdWludDMyX3QgY2hhcl9wcm9wcygpIGNvbnN0IHsgcmV0dXJuIG1fZHdDaGFyUHJvcHM7IH0KKyAgaW50MTZfdCBob3Jpem9uYWxfc2NhbGUoKSBjb25zdCB7IHJldHVybiBtX2lIb3Jpem9udGFsU2NhbGU7IH0KKyAgaW50MTZfdCB2ZXJ0aWNhbF9zY2FsZSgpIGNvbnN0IHsgcmV0dXJuIG1faVZlcnRpY2FsU2NhbGU7IH0KKworICBDRlhfQnJlYWtUeXBlIG1fZHdTdGF0dXM7CisgIHVpbnQ4X3QgbV9uQnJlYWtUeXBlOworICB1aW50MzJfdCBtX2R3Q2hhclN0eWxlczsKKyAgaW50MzJfdCBtX2lDaGFyV2lkdGg7CisgIGludDE2X3QgbV9pQmlkaUNsYXNzOworICBpbnQxNl90IG1faUJpZGlMZXZlbDsKKyAgaW50MTZfdCBtX2lCaWRpUG9zOworICBpbnQxNl90IG1faUJpZGlPcmRlcjsKKyAgaW50MzJfdCBtX2lGb250U2l6ZTsKKyAgdWludDMyX3QgbV9kd0lkZW50aXR5OworICBSZXRhaW5QdHI8UmV0YWluYWJsZT4gbV9wVXNlckRhdGE7CisKKyBwcml2YXRlOgorICB1aW50MTZfdCBtX3dDaGFyQ29kZTsKKyAgdWludDMyX3QgbV9kd0NoYXJQcm9wczsKKyAgaW50MzJfdCBtX2lIb3Jpem9udGFsU2NhbGU7CisgIGludDMyX3QgbV9pVmVydGljYWxTY2FsZTsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWENSVF9DRlhfQ0hBUl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jZnhfY2hlY2tzdW1jb250ZXh0LmNwcCBiL2NvcmUvZnhjcnQvY2Z4X2NoZWNrc3VtY29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzNDA5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY2Z4X2NoZWNrc3VtY29udGV4dC5jcHAKQEAgLTAsMCArMSwxNTIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X2NoZWNrc3VtY29udGV4dC5oIgorCisjaW5jbHVkZSAiY29yZS9mZHJtL2NyeXB0by9meF9jcnlwdC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3NheHJlYWRlcmhhbmRsZXIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBGWF9CQVNFNjREQVRBIHsKKyAgdWludDMyX3QgZGF0YTEgOiAyOworICB1aW50MzJfdCBkYXRhMiA6IDY7CisgIHVpbnQzMl90IGRhdGEzIDogNDsKKyAgdWludDMyX3QgZGF0YTQgOiA0OworICB1aW50MzJfdCBkYXRhNSA6IDY7CisgIHVpbnQzMl90IGRhdGE2IDogMjsKKyAgdWludDMyX3QgZGF0YTcgOiA4OworfTsKKworY29uc3QgY2hhciBnX0ZYQmFzZTY0RW5jb2Rlck1hcFs2NF0gPSB7CisgICAgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLCAnSCcsICdJJywgJ0onLCAnSycsICdMJywgJ00nLAorICAgICdOJywgJ08nLCAnUCcsICdRJywgJ1InLCAnUycsICdUJywgJ1UnLCAnVicsICdXJywgJ1gnLCAnWScsICdaJywKKyAgICAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ2knLCAnaicsICdrJywgJ2wnLCAnbScsCisgICAgJ24nLCAnbycsICdwJywgJ3EnLCAncicsICdzJywgJ3QnLCAndScsICd2JywgJ3cnLCAneCcsICd5JywgJ3onLAorICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJysnLCAnLycsCit9OworCit2b2lkIEJhc2U2NEVuY29kZVBpZWNlKGNvbnN0IEZYX0JBU0U2NERBVEEmIHNyYywgaW50MzJfdCBpQnl0ZXMsIGNoYXIgZHN0WzRdKSB7CisgIGRzdFswXSA9IGdfRlhCYXNlNjRFbmNvZGVyTWFwW3NyYy5kYXRhMl07CisgIHVpbnQzMl90IGIgPSBzcmMuZGF0YTEgPDwgNDsKKyAgaWYgKGlCeXRlcyA+IDEpIHsKKyAgICBiIHw9IHNyYy5kYXRhNDsKKyAgfQorICBkc3RbMV0gPSBnX0ZYQmFzZTY0RW5jb2Rlck1hcFtiXTsKKyAgaWYgKGlCeXRlcyA+IDEpIHsKKyAgICBiID0gc3JjLmRhdGEzIDw8IDI7CisgICAgaWYgKGlCeXRlcyA+IDIpIHsKKyAgICAgIGIgfD0gc3JjLmRhdGE2OworICAgIH0KKyAgICBkc3RbMl0gPSBnX0ZYQmFzZTY0RW5jb2Rlck1hcFtiXTsKKyAgICBpZiAoaUJ5dGVzID4gMikgeworICAgICAgZHN0WzNdID0gZ19GWEJhc2U2NEVuY29kZXJNYXBbc3JjLmRhdGE1XTsKKyAgICB9IGVsc2UgeworICAgICAgZHN0WzNdID0gJz0nOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBkc3RbMl0gPSBkc3RbM10gPSAnPSc7CisgIH0KK30KKworaW50MzJfdCBCYXNlNjRFbmNvZGVBKGNvbnN0IHVpbnQ4X3QqIHBTcmMsIGludDMyX3QgaVNyY0xlbiwgY2hhciogcERzdCkgeworICBBU1NFUlQocFNyYyk7CisgIGlmIChpU3JjTGVuIDwgMSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICghcERzdCkgeworICAgIGludDMyX3QgaURzdExlbiA9IGlTcmNMZW4gLyAzICogNDsKKyAgICBpZiAoKGlTcmNMZW4gJSAzKSAhPSAwKSB7CisgICAgICBpRHN0TGVuICs9IDQ7CisgICAgfQorICAgIHJldHVybiBpRHN0TGVuOworICB9CisgIEZYX0JBU0U2NERBVEEgc3JjRGF0YTsKKyAgaW50MzJfdCBpQnl0ZXMgPSAzOworICBjaGFyKiBwRHN0RW5kID0gcERzdDsKKyAgd2hpbGUgKGlTcmNMZW4gPiAwKSB7CisgICAgaWYgKGlTcmNMZW4gPiAyKSB7CisgICAgICAoKHVpbnQ4X3QqKSZzcmNEYXRhKVswXSA9ICpwU3JjKys7CisgICAgICAoKHVpbnQ4X3QqKSZzcmNEYXRhKVsxXSA9ICpwU3JjKys7CisgICAgICAoKHVpbnQ4X3QqKSZzcmNEYXRhKVsyXSA9ICpwU3JjKys7CisgICAgICBpU3JjTGVuIC09IDM7CisgICAgfSBlbHNlIHsKKyAgICAgICooKHVpbnQzMl90Kikmc3JjRGF0YSkgPSAwOworICAgICAgKCh1aW50OF90Kikmc3JjRGF0YSlbMF0gPSAqcFNyYysrOworICAgICAgaWYgKGlTcmNMZW4gPiAxKSB7CisgICAgICAgICgodWludDhfdCopJnNyY0RhdGEpWzFdID0gKnBTcmMrKzsKKyAgICAgIH0KKyAgICAgIGlCeXRlcyA9IGlTcmNMZW47CisgICAgICBpU3JjTGVuID0gMDsKKyAgICB9CisgICAgQmFzZTY0RW5jb2RlUGllY2Uoc3JjRGF0YSwgaUJ5dGVzLCBwRHN0RW5kKTsKKyAgICBwRHN0RW5kICs9IDQ7CisgIH0KKyAgcmV0dXJuIHBEc3RFbmQgLSBwRHN0OworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQ0ZYX0NoZWNrc3VtQ29udGV4dDo6Q0ZYX0NoZWNrc3VtQ29udGV4dCgpIHt9CisKK0NGWF9DaGVja3N1bUNvbnRleHQ6On5DRlhfQ2hlY2tzdW1Db250ZXh0KCkge30KKwordm9pZCBDRlhfQ2hlY2tzdW1Db250ZXh0OjpTdGFydENoZWNrc3VtKCkgeworICBGaW5pc2hDaGVja3N1bSgpOworICBtX3BCeXRlQ29udGV4dCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUllQVF9zaGExX2NvbnRleHQ+KCk7CisgIENSWVBUX1NIQTFTdGFydChtX3BCeXRlQ29udGV4dC5nZXQoKSk7CisgIG1fYnNDaGVja3N1bS5jbGVhcigpOworICBtX3BTQVhSZWFkZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX1NBWFJlYWRlcj4oKTsKK30KKworYm9vbCBDRlhfQ2hlY2tzdW1Db250ZXh0OjpVcGRhdGVDaGVja3N1bSgKKyAgICBjb25zdCBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBTcmNGaWxlLAorICAgIEZYX0ZJTEVTSVpFIG9mZnNldCwKKyAgICBzaXplX3Qgc2l6ZSkgeworICBpZiAoIW1fcFNBWFJlYWRlciB8fCAhcFNyY0ZpbGUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChzaXplIDwgMSkKKyAgICBzaXplID0gcFNyY0ZpbGUtPkdldFNpemUoKTsKKworICBDRlhfU0FYUmVhZGVySGFuZGxlciBoYW5kbGVyKHRoaXMpOworICBtX3BTQVhSZWFkZXItPlNldEhhbmRsZXIoJmhhbmRsZXIpOworICBpZiAobV9wU0FYUmVhZGVyLT5TdGFydFBhcnNlKAorICAgICAgICAgIHBTcmNGaWxlLCAodWludDMyX3Qpb2Zmc2V0LCAodWludDMyX3Qpc2l6ZSwKKyAgICAgICAgICBDRlhfU2F4UGFyc2VNb2RlX05vdFNraXBTcGFjZSB8IENGWF9TYXhQYXJzZU1vZGVfTm90Q29udmVydF9hbXAgfAorICAgICAgICAgICAgICBDRlhfU2F4UGFyc2VNb2RlX05vdENvbnZlcnRfbHQgfCBDRlhfU2F4UGFyc2VNb2RlX05vdENvbnZlcnRfZ3QgfAorICAgICAgICAgICAgICBDRlhfU2F4UGFyc2VNb2RlX05vdENvbnZlcnRfc2hhcnApIDwgMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gbV9wU0FYUmVhZGVyLT5Db250aW51ZVBhcnNlKCkgPiA5OTsKK30KKwordm9pZCBDRlhfQ2hlY2tzdW1Db250ZXh0OjpGaW5pc2hDaGVja3N1bSgpIHsKKyAgbV9wU0FYUmVhZGVyLnJlc2V0KCk7CisgIGlmIChtX3BCeXRlQ29udGV4dCkgeworICAgIHVpbnQ4X3QgZGlnZXN0WzIwXTsKKyAgICBtZW1zZXQoZGlnZXN0LCAwLCAyMCk7CisgICAgQ1JZUFRfU0hBMUZpbmlzaChtX3BCeXRlQ29udGV4dC5nZXQoKSwgZGlnZXN0KTsKKyAgICBpbnQzMl90IG5MZW4gPSBCYXNlNjRFbmNvZGVBKGRpZ2VzdCwgMjAsIG51bGxwdHIpOworICAgIGNoYXIqIHBCdWZmZXIgPSBtX2JzQ2hlY2tzdW0uR2V0QnVmZmVyKG5MZW4pOworICAgIEJhc2U2NEVuY29kZUEoZGlnZXN0LCAyMCwgcEJ1ZmZlcik7CisgICAgbV9ic0NoZWNrc3VtLlJlbGVhc2VCdWZmZXIobkxlbik7CisgICAgbV9wQnl0ZUNvbnRleHQucmVzZXQoKTsKKyAgfQorfQorCitCeXRlU3RyaW5nIENGWF9DaGVja3N1bUNvbnRleHQ6OkdldENoZWNrc3VtKCkgY29uc3QgeworICByZXR1cm4gbV9ic0NoZWNrc3VtOworfQorCit2b2lkIENGWF9DaGVja3N1bUNvbnRleHQ6OlVwZGF0ZShjb25zdCBCeXRlU3RyaW5nVmlldyYgYnNUZXh0KSB7CisgIGlmICghbV9wQnl0ZUNvbnRleHQpCisgICAgcmV0dXJuOworCisgIENSWVBUX1NIQTFVcGRhdGUobV9wQnl0ZUNvbnRleHQuZ2V0KCksIGJzVGV4dC5yYXdfc3RyKCksIGJzVGV4dC5HZXRMZW5ndGgoKSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2NmeF9jaGVja3N1bWNvbnRleHQuaCBiL2NvcmUvZnhjcnQvY2Z4X2NoZWNrc3VtY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNzk2M2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2NmeF9jaGVja3N1bWNvbnRleHQuaApAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENSVF9DRlhfQ0hFQ0tTVU1DT05URVhUX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfQ0ZYX0NIRUNLU1VNQ09OVEVYVF9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9mZHJtL2NyeXB0by9meF9jcnlwdC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF9zYXhyZWFkZXIuaCIKKworY2xhc3MgQ0ZYX0NoZWNrc3VtQ29udGV4dCB7CisgcHVibGljOgorICBDRlhfQ2hlY2tzdW1Db250ZXh0KCk7CisgIH5DRlhfQ2hlY2tzdW1Db250ZXh0KCk7CisKKyAgdm9pZCBTdGFydENoZWNrc3VtKCk7CisgIHZvaWQgVXBkYXRlKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBic1RleHQpOworICBib29sIFVwZGF0ZUNoZWNrc3VtKGNvbnN0IFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcFNyY0ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IDApOworICB2b2lkIEZpbmlzaENoZWNrc3VtKCk7CisgIEJ5dGVTdHJpbmcgR2V0Q2hlY2tzdW0oKSBjb25zdDsKKworIHByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfU0FYUmVhZGVyPiBtX3BTQVhSZWFkZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxDUllQVF9zaGExX2NvbnRleHQ+IG1fcEJ5dGVDb250ZXh0OworICBCeXRlU3RyaW5nIG1fYnNDaGVja3N1bTsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWENSVF9DRlhfQ0hFQ0tTVU1DT05URVhUX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2NmeF9kYXRldGltZS5jcHAgYi9jb3JlL2Z4Y3J0L2NmeF9kYXRldGltZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmYThhNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY2Z4X2RhdGV0aW1lLmNwcApAQCAtMCwwICsxLDEzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfZGF0ZXRpbWUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorCisjaWYgX0ZYX09TXyA9PSBfRlhfT1NfTElOVVhfIHx8IF9GWF9PU18gPT0gX0ZYX09TX0FORFJPSURfIHx8IFwKKyAgICBfRlhfT1NfID09IF9GWF9PU19NQUNPU1hfCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIHsKKworY29uc3QgdWludDhfdCBnX0ZYRGF5c1Blck1vbnRoWzEyXSA9IHszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxfTsKK2NvbnN0IHVpbnQ4X3QgZ19GWERheXNQZXJMZWFwTW9udGhbMTJdID0gezMxLCAyOSwgMzEsIDMwLCAzMSwgMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxfTsKK2NvbnN0IGludDMyX3QgZ19GWERheXNCZWZvcmVNb250aFsxMl0gPSB7MCwgICAzMSwgIDU5LCAgOTAsICAxMjAsIDE1MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNH07Citjb25zdCBpbnQzMl90IGdfRlhEYXlzQmVmb3JlTGVhcE1vbnRoWzEyXSA9IHswLCAgIDMxLCAgNjAsICA5MSwgIDEyMSwgMTUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgyLCAyMTMsIDI0NCwgMjc0LCAzMDUsIDMzNX07Citjb25zdCBpbnQzMl90IGdfRlhEYXlzUGVyWWVhciA9IDM2NTsKK2NvbnN0IGludDMyX3QgZ19GWERheXNQZXJMZWFwWWVhciA9IDM2NjsKKworaW50MzJfdCBEYXlzQmVmb3JlTW9udGhJblllYXIoaW50MzJfdCBpWWVhciwgdWludDhfdCBpTW9udGgpIHsKKyAgQVNTRVJUKGlZZWFyICE9IDApOworICBBU1NFUlQoaU1vbnRoID49IDEgJiYgaU1vbnRoIDw9IDEyKTsKKworICBjb25zdCBpbnQzMl90KiBwID0KKyAgICAgIEZYX0lzTGVhcFllYXIoaVllYXIpID8gZ19GWERheXNCZWZvcmVMZWFwTW9udGggOiBnX0ZYRGF5c0JlZm9yZU1vbnRoOworICByZXR1cm4gcFtpTW9udGggLSAxXTsKK30KKworaW50MzJfdCBEYXlzSW5ZZWFyKGludDMyX3QgaVllYXIpIHsKKyAgQVNTRVJUKGlZZWFyICE9IDApOworICByZXR1cm4gRlhfSXNMZWFwWWVhcihpWWVhcikgPyBnX0ZYRGF5c1BlckxlYXBZZWFyIDogZ19GWERheXNQZXJZZWFyOworfQorCitpbnQ2NF90IERhdGVUb0RheXMoaW50MzJfdCBpWWVhciwKKyAgICAgICAgICAgICAgICAgICB1aW50OF90IGlNb250aCwKKyAgICAgICAgICAgICAgICAgICB1aW50OF90IGlEYXksCisgICAgICAgICAgICAgICAgICAgYm9vbCBiSW5jbHVkZVRoaXNEYXkpIHsKKyAgQVNTRVJUKGlZZWFyICE9IDApOworICBBU1NFUlQoaU1vbnRoID49IDEgJiYgaU1vbnRoIDw9IDEyKTsKKyAgQVNTRVJUKGlEYXkgPj0gMSAmJiBpRGF5IDw9IEZYX0RheXNJbk1vbnRoKGlZZWFyLCBpTW9udGgpKTsKKworICBpbnQ2NF90IGlEYXlzID0gRGF5c0JlZm9yZU1vbnRoSW5ZZWFyKGlZZWFyLCBpTW9udGgpOworICBpRGF5cyArPSBpRGF5OworICBpZiAoIWJJbmNsdWRlVGhpc0RheSkKKyAgICBpRGF5cy0tOworCisgIGlmIChpWWVhciA+IDApIHsKKyAgICBpWWVhci0tOworICB9IGVsc2UgeworICAgIGlEYXlzIC09IERheXNJblllYXIoaVllYXIpOworICAgIGlZZWFyKys7CisgIH0KKyAgcmV0dXJuIGlEYXlzICsgc3RhdGljX2Nhc3Q8aW50NjRfdD4oaVllYXIpICogMzY1ICsgaVllYXIgLyA0IC0gaVllYXIgLyAxMDAgKworICAgICAgICAgaVllYXIgLyA0MDA7Cit9CisKK3N0cnVjdCBGWFVUX1NZU1RFTVRJTUUgeworICB1aW50MTZfdCB3WWVhcjsKKyAgdWludDE2X3Qgd01vbnRoOworICB1aW50MTZfdCB3RGF5T2ZXZWVrOworICB1aW50MTZfdCB3RGF5OworICB1aW50MTZfdCB3SG91cjsKKyAgdWludDE2X3Qgd01pbnV0ZTsKKyAgdWludDE2X3Qgd1NlY29uZDsKKyAgdWludDE2X3Qgd01pbGxpc2Vjb25kOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK3VpbnQ4X3QgRlhfRGF5c0luTW9udGgoaW50MzJfdCBpWWVhciwgdWludDhfdCBpTW9udGgpIHsKKyAgQVNTRVJUKGlZZWFyICE9IDApOworICBBU1NFUlQoaU1vbnRoID49IDEgJiYgaU1vbnRoIDw9IDEyKTsKKworICBjb25zdCB1aW50OF90KiBwID0KKyAgICAgIEZYX0lzTGVhcFllYXIoaVllYXIpID8gZ19GWERheXNQZXJMZWFwTW9udGggOiBnX0ZYRGF5c1Blck1vbnRoOworICByZXR1cm4gcFtpTW9udGggLSAxXTsKK30KKworYm9vbCBGWF9Jc0xlYXBZZWFyKGludDMyX3QgaVllYXIpIHsKKyAgQVNTRVJUKGlZZWFyICE9IDApOworICByZXR1cm4gKChpWWVhciAlIDQpID09IDAgJiYgKGlZZWFyICUgMTAwKSAhPSAwKSB8fCAoaVllYXIgJSA0MDApID09IDA7Cit9CisKKy8vIHN0YXRpYworQ0ZYX0RhdGVUaW1lIENGWF9EYXRlVGltZTo6Tm93KCkgeworICBGWFVUX1NZU1RFTVRJTUUgdXRMb2NhbDsKKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXworICA6OkdldExvY2FsVGltZSgoTFBTWVNURU1USU1FKSZ1dExvY2FsKTsKKyNlbHNlICAgLy8gX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KKyAgdGltZXZhbCBjdXJUaW1lOworICBnZXR0aW1lb2ZkYXkoJmN1clRpbWUsIG51bGxwdHIpOworCisgIHN0cnVjdCB0bSBzdDsKKyAgbG9jYWx0aW1lX3IoJmN1clRpbWUudHZfc2VjLCAmc3QpOworICB1dExvY2FsLndZZWFyID0gc3QudG1feWVhciArIDE5MDA7CisgIHV0TG9jYWwud01vbnRoID0gc3QudG1fbW9uICsgMTsKKyAgdXRMb2NhbC53RGF5T2ZXZWVrID0gc3QudG1fd2RheTsKKyAgdXRMb2NhbC53RGF5ID0gc3QudG1fbWRheTsKKyAgdXRMb2NhbC53SG91ciA9IHN0LnRtX2hvdXI7CisgIHV0TG9jYWwud01pbnV0ZSA9IHN0LnRtX21pbjsKKyAgdXRMb2NhbC53U2Vjb25kID0gc3QudG1fc2VjOworICB1dExvY2FsLndNaWxsaXNlY29uZCA9IGN1clRpbWUudHZfdXNlYyAvIDEwMDA7CisjZW5kaWYgIC8vIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisKKyAgcmV0dXJuIENGWF9EYXRlVGltZSh1dExvY2FsLndZZWFyLCBzdGF0aWNfY2FzdDx1aW50OF90Pih1dExvY2FsLndNb250aCksCisgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4odXRMb2NhbC53RGF5KSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pih1dExvY2FsLndIb3VyKSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pih1dExvY2FsLndNaW51dGUpLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHV0TG9jYWwud1NlY29uZCksCisgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHV0TG9jYWwud01pbGxpc2Vjb25kKSk7Cit9CisKK2ludDMyX3QgQ0ZYX0RhdGVUaW1lOjpHZXREYXlPZldlZWsoKSBjb25zdCB7CisgIGludDMyX3QgdiA9IHN0YXRpY19jYXN0PGludDMyX3Q+KERhdGVUb0RheXMoeWVhcl8sIG1vbnRoXywgZGF5XywgdHJ1ZSkgJSA3KTsKKyAgaWYgKHYgPCAwKQorICAgIHYgKz0gNzsKKyAgcmV0dXJuIHY7Cit9CisKK2Jvb2wgQ0ZYX0RhdGVUaW1lOjpvcGVyYXRvcj09KGNvbnN0IENGWF9EYXRlVGltZSYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHllYXJfID09IG90aGVyLnllYXJfICYmIG1vbnRoXyA9PSBvdGhlci5tb250aF8gJiYgZGF5XyA9PSBvdGhlci5kYXlfICYmCisgICAgICAgICBob3VyXyA9PSBvdGhlci5ob3VyXyAmJiBtaW51dGVfID09IG90aGVyLm1pbnV0ZV8gJiYKKyAgICAgICAgIHNlY29uZF8gPT0gb3RoZXIuc2Vjb25kXyAmJiBtaWxsaXNlY29uZF8gPT0gb3RoZXIubWlsbGlzZWNvbmRfOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jZnhfZGF0ZXRpbWUuaCBiL2NvcmUvZnhjcnQvY2Z4X2RhdGV0aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEwYTg0NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY2Z4X2RhdGV0aW1lLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX0NGWF9EQVRFVElNRV9IXworI2RlZmluZSBDT1JFX0ZYQ1JUX0NGWF9EQVRFVElNRV9IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKworYm9vbCBGWF9Jc0xlYXBZZWFyKGludDMyX3QgaVllYXIpOwordWludDhfdCBGWF9EYXlzSW5Nb250aChpbnQzMl90IGlZZWFyLCB1aW50OF90IGlNb250aCk7CisKK2NsYXNzIENGWF9EYXRlVGltZSB7CisgcHVibGljOgorICBzdGF0aWMgQ0ZYX0RhdGVUaW1lIE5vdygpOworCisgIENGWF9EYXRlVGltZSgpCisgICAgICA6IHllYXJfKDApLAorICAgICAgICBtb250aF8oMCksCisgICAgICAgIGRheV8oMCksCisgICAgICAgIGhvdXJfKDApLAorICAgICAgICBtaW51dGVfKDApLAorICAgICAgICBzZWNvbmRfKDApLAorICAgICAgICBtaWxsaXNlY29uZF8oMCkge30KKyAgQ0ZYX0RhdGVUaW1lKGludDMyX3QgeWVhciwKKyAgICAgICAgICAgICAgIHVpbnQ4X3QgbW9udGgsCisgICAgICAgICAgICAgICB1aW50OF90IGRheSwKKyAgICAgICAgICAgICAgIHVpbnQ4X3QgaG91ciwKKyAgICAgICAgICAgICAgIHVpbnQ4X3QgbWludXRlLAorICAgICAgICAgICAgICAgdWludDhfdCBzZWNvbmQsCisgICAgICAgICAgICAgICB1aW50MTZfdCBtaWxsaXNlY29uZCkKKyAgICAgIDogeWVhcl8oeWVhciksCisgICAgICAgIG1vbnRoXyhtb250aCksCisgICAgICAgIGRheV8oZGF5KSwKKyAgICAgICAgaG91cl8oaG91ciksCisgICAgICAgIG1pbnV0ZV8obWludXRlKSwKKyAgICAgICAgc2Vjb25kXyhzZWNvbmQpLAorICAgICAgICBtaWxsaXNlY29uZF8obWlsbGlzZWNvbmQpIHt9CisKKyAgdm9pZCBSZXNldCgpIHsKKyAgICB5ZWFyXyA9IDA7CisgICAgbW9udGhfID0gMDsKKyAgICBkYXlfID0gMDsKKyAgICBob3VyXyA9IDA7CisgICAgbWludXRlXyA9IDA7CisgICAgc2Vjb25kXyA9IDA7CisgICAgbWlsbGlzZWNvbmRfID0gMDsKKyAgfQorCisgIGJvb2wgSXNTZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIHllYXJfICE9IDAgfHwgbW9udGhfICE9IDAgfHwgZGF5XyAhPSAwIHx8IGhvdXJfICE9IDAgfHwKKyAgICAgICAgICAgbWludXRlXyAhPSAwIHx8IHNlY29uZF8gIT0gMCB8fCBtaWxsaXNlY29uZF8gIT0gMDsKKyAgfQorCisgIHZvaWQgU2V0RGF0ZShpbnQzMl90IHllYXIsIHVpbnQ4X3QgbW9udGgsIHVpbnQ4X3QgZGF5KSB7CisgICAgeWVhcl8gPSB5ZWFyOworICAgIG1vbnRoXyA9IG1vbnRoOworICAgIGRheV8gPSBkYXk7CisgIH0KKworICB2b2lkIFNldFRpbWUodWludDhfdCBob3VyLAorICAgICAgICAgICAgICAgdWludDhfdCBtaW51dGUsCisgICAgICAgICAgICAgICB1aW50OF90IHNlY29uZCwKKyAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbGxpc2Vjb25kKSB7CisgICAgaG91cl8gPSBob3VyOworICAgIG1pbnV0ZV8gPSBtaW51dGU7CisgICAgc2Vjb25kXyA9IHNlY29uZDsKKyAgICBtaWxsaXNlY29uZF8gPSBtaWxsaXNlY29uZDsKKyAgfQorCisgIGludDMyX3QgR2V0WWVhcigpIGNvbnN0IHsgcmV0dXJuIHllYXJfOyB9CisgIHVpbnQ4X3QgR2V0TW9udGgoKSBjb25zdCB7IHJldHVybiBtb250aF87IH0KKyAgdWludDhfdCBHZXREYXkoKSBjb25zdCB7IHJldHVybiBkYXlfOyB9CisgIHVpbnQ4X3QgR2V0SG91cigpIGNvbnN0IHsgcmV0dXJuIGhvdXJfOyB9CisgIHVpbnQ4X3QgR2V0TWludXRlKCkgY29uc3QgeyByZXR1cm4gbWludXRlXzsgfQorICB1aW50OF90IEdldFNlY29uZCgpIGNvbnN0IHsgcmV0dXJuIHNlY29uZF87IH0KKyAgdWludDE2X3QgR2V0TWlsbGlzZWNvbmQoKSBjb25zdCB7IHJldHVybiBtaWxsaXNlY29uZF87IH0KKyAgaW50MzJfdCBHZXREYXlPZldlZWsoKSBjb25zdDsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ0ZYX0RhdGVUaW1lJiBvdGhlcikgY29uc3Q7CisKKyBwcml2YXRlOgorICBpbnQzMl90IHllYXJfOworICB1aW50OF90IG1vbnRoXzsKKyAgdWludDhfdCBkYXlfOworICB1aW50OF90IGhvdXJfOworICB1aW50OF90IG1pbnV0ZV87CisgIHVpbnQ4X3Qgc2Vjb25kXzsKKyAgdWludDE2X3QgbWlsbGlzZWNvbmRfOworfTsKKworI2lmIF9GWF9PU18gIT0gX0ZYX09TX0FORFJPSURfCisjcHJhZ21hIHBhY2socHVzaCwgMSkKKyNlbmRpZgorc3RydWN0IEZYX1RJTUVaT05FIHsKKyAgaW50OF90IHR6SG91cjsKKyAgdWludDhfdCB0ek1pbnV0ZTsKK307CisjaWYgX0ZYX09TXyAhPSBfRlhfT1NfQU5EUk9JRF8KKyNwcmFnbWEgcGFjayhwb3ApCisjZW5kaWYKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0NGWF9EQVRFVElNRV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jZnhfZGVjaW1hbC5jcHAgYi9jb3JlL2Z4Y3J0L2NmeF9kZWNpbWFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTk4MGRiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9jZnhfZGVjaW1hbC5jcHAKQEAgLTAsMCArMSw0NzMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X2RlY2ltYWwuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9leHRlbnNpb24uaCIKKworI2RlZmluZSBGWE1BVEhfREVDSU1BTF9TQ0FMRUxJTUlUIDB4MWMKKyNkZWZpbmUgRlhNQVRIX0RFQ0lNQUxfTkVHTUFTSyAoMHg4MDAwMDAwMEwpCisjZGVmaW5lIEZYTUFUSF9ERUNJTUFMX0ZPUkNFQk9PTCh4KSAoISEoeCkpCisjZGVmaW5lIEZYTUFUSF9ERUNJTUFMX01BS0VGTEFHUyhORUcsIFNDQUxFKSBcCisgICgoKFNDQUxFKSA8PCAweDEwKSB8ICgoTkVHKSA/IEZYTUFUSF9ERUNJTUFMX05FR01BU0sgOiAwKSkKKyNkZWZpbmUgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKEZMQUdTKSBcCisgIEZYTUFUSF9ERUNJTUFMX0ZPUkNFQk9PTCgoRkxBR1MpJkZYTUFUSF9ERUNJTUFMX05FR01BU0spCisjZGVmaW5lIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKEZMQUdTKSBcCisgICgodWludDhfdCkoKChGTEFHUykgJiB+RlhNQVRIX0RFQ0lNQUxfTkVHTUFTSykgPj4gMHgxMCkpCisjZGVmaW5lIEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKHgpICgoeCkgPj4gMHgxMCA+PiAweDEwKQorI2RlZmluZSBGWE1BVEhfREVDSU1BTF9MU0hJRlQzMkJJVCh4KSAoKHgpIDw8IDB4MTAgPDwgMHgxMCkKKworbmFtZXNwYWNlIHsKKworaW5saW5lIHVpbnQ4X3QgZGVjaW1hbF9oZWxwZXJfZGl2MTAodWludDY0X3QmIHBoaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90JiBwbWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QmIHBsbykgeworICB1aW50OF90IHJldFZhbDsKKyAgcG1pZCArPSBGWE1BVEhfREVDSU1BTF9MU0hJRlQzMkJJVChwaGkgJSAweEEpOworICBwaGkgLz0gMHhBOworICBwbG8gKz0gRlhNQVRIX0RFQ0lNQUxfTFNISUZUMzJCSVQocG1pZCAlIDB4QSk7CisgIHBtaWQgLz0gMHhBOworICByZXRWYWwgPSBwbG8gJSAweEE7CisgIHBsbyAvPSAweEE7CisgIHJldHVybiByZXRWYWw7Cit9CisKK2lubGluZSB1aW50OF90IGRlY2ltYWxfaGVscGVyX2RpdjEwX2FueSh1aW50NjRfdCBudW1zW10sIHVpbnQ4X3QgbnVtY291bnQpIHsKKyAgdWludDhfdCByZXRWYWwgPSAwOworICBmb3IgKGludCBpID0gbnVtY291bnQgLSAxOyBpID4gMDsgaS0tKSB7CisgICAgbnVtc1tpIC0gMV0gKz0gRlhNQVRIX0RFQ0lNQUxfTFNISUZUMzJCSVQobnVtc1tpXSAlIDB4QSk7CisgICAgbnVtc1tpXSAvPSAweEE7CisgIH0KKyAgaWYgKG51bWNvdW50KSB7CisgICAgcmV0VmFsID0gbnVtc1swXSAlIDB4QTsKKyAgICBudW1zWzBdIC89IDB4QTsKKyAgfQorICByZXR1cm4gcmV0VmFsOworfQorCitpbmxpbmUgdm9pZCBkZWNpbWFsX2hlbHBlcl9tdWwxMCh1aW50NjRfdCYgcGhpLCB1aW50NjRfdCYgcG1pZCwgdWludDY0X3QmIHBsbykgeworICBwbG8gKj0gMHhBOworICBwbWlkID0gcG1pZCAqIDB4QSArIEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKHBsbyk7CisgIHBsbyA9ICh1aW50MzJfdClwbG87CisgIHBoaSA9IHBoaSAqIDB4QSArIEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKHBtaWQpOworICBwbWlkID0gKHVpbnQzMl90KXBtaWQ7Cit9CisKK2lubGluZSB2b2lkIGRlY2ltYWxfaGVscGVyX211bDEwX2FueSh1aW50NjRfdCBudW1zW10sIHVpbnQ4X3QgbnVtY291bnQpIHsKKyAgbnVtc1swXSAqPSAweEE7CisgIGZvciAoaW50IGkgPSAxOyBpIDwgbnVtY291bnQ7IGkrKykgeworICAgIG51bXNbaV0gPSBudW1zW2ldICogMHhBICsgRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQobnVtc1tpIC0gMV0pOworICAgIG51bXNbaSAtIDFdID0gKHVpbnQzMl90KW51bXNbaSAtIDFdOworICB9Cit9CisKK2lubGluZSB2b2lkIGRlY2ltYWxfaGVscGVyX25vcm1hbGl6ZSh1aW50NjRfdCYgcGhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90JiBwbWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90JiBwbG8pIHsKKyAgcGhpICs9IEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKHBtaWQpOworICBwbWlkID0gKHVpbnQzMl90KXBtaWQ7CisgIHBtaWQgKz0gRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQocGxvKTsKKyAgcGxvID0gKHVpbnQzMl90KXBsbzsKKyAgcGhpICs9IEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKHBtaWQpOworICBwbWlkID0gKHVpbnQzMl90KXBtaWQ7Cit9CisKK2lubGluZSB2b2lkIGRlY2ltYWxfaGVscGVyX25vcm1hbGl6ZV9hbnkodWludDY0X3QgbnVtc1tdLCB1aW50OF90IGxlbikgeworICBmb3IgKGludCBpID0gbGVuIC0gMjsgaSA+IDA7IGktLSkgeworICAgIG51bXNbaSArIDFdICs9IEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKG51bXNbaV0pOworICAgIG51bXNbaV0gPSAodWludDMyX3QpbnVtc1tpXTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGxlbiAtIDE7IGkrKykgeworICAgIG51bXNbaSArIDFdICs9IEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKG51bXNbaV0pOworICAgIG51bXNbaV0gPSAodWludDMyX3QpbnVtc1tpXTsKKyAgfQorfQorCitpbmxpbmUgaW50OF90IGRlY2ltYWxfaGVscGVyX3Jhd19jb21wYXJlX2FueSh1aW50NjRfdCBhW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBibCkgeworICBpbnQ4X3QgcmV0VmFsID0gMDsKKyAgZm9yIChpbnQgaSA9IHN0ZDo6bWF4KGFsIC0gMSwgYmwgLSAxKTsgaSA+PSAwOyBpLS0pIHsKKyAgICB1aW50NjRfdCBsID0gKGkgPj0gYWwgPyAwIDogYVtpXSksIHIgPSAoaSA+PSBibCA/IDAgOiBiW2ldKTsKKyAgICByZXRWYWwgKz0gKGwgPiByID8gMSA6IChsIDwgciA/IC0xIDogMCkpOworICAgIGlmIChyZXRWYWwpCisgICAgICByZXR1cm4gcmV0VmFsOworICB9CisgIHJldHVybiByZXRWYWw7Cit9CisKK2lubGluZSB2b2lkIGRlY2ltYWxfaGVscGVyX2RlY19hbnkodWludDY0X3QgYVtdLCB1aW50OF90IGFsKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgYWw7IGkrKykgeworICAgIGlmIChhW2ldLS0pCisgICAgICByZXR1cm47CisgIH0KK30KKworaW5saW5lIHZvaWQgZGVjaW1hbF9oZWxwZXJfaW5jX2FueSh1aW50NjRfdCBhW10sIHVpbnQ4X3QgYWwpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbDsgaSsrKSB7CisgICAgYVtpXSsrOworICAgIGlmICgodWludDMyX3QpYVtpXSA9PSBhW2ldKQorICAgICAgcmV0dXJuOworICAgIGFbaV0gPSAwOworICB9Cit9CisKK2lubGluZSB2b2lkIGRlY2ltYWxfaGVscGVyX3Jhd19tdWwodWludDY0X3QgYVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBiW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBjbCkgeworICBBU1NFUlQoYWwgKyBibCA8PSBjbCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgY2w7IGkrKykKKyAgICBjW2ldID0gMDsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGFsOyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGJsOyBqKyspIHsKKyAgICAgIHVpbnQ2NF90IG0gPSAodWludDY0X3QpYVtpXSAqIGJbal07CisgICAgICBjW2kgKyBqXSArPSAodWludDMyX3QpbTsKKyAgICAgIGNbaSArIGogKyAxXSArPSBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVChtKTsKKyAgICB9CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbCAtIDE7IGkrKykgeworICAgIGNbaSArIDFdICs9IEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKGNbaV0pOworICAgIGNbaV0gPSAodWludDMyX3QpY1tpXTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGNsOyBpKyspCisgICAgY1tpXSA9ICh1aW50MzJfdCljW2ldOworfQorCitpbmxpbmUgdm9pZCBkZWNpbWFsX2hlbHBlcl9yYXdfZGl2KHVpbnQ2NF90IGFbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBjW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2wpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbDsgaSsrKQorICAgIGNbaV0gPSAwOworCisgIHVpbnQ2NF90IGxlZnRbMTZdID0gezB9OworICB1aW50NjRfdCByaWdodFsxNl0gPSB7MH07CisgIGxlZnRbMF0gPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IGFsOyBpKyspCisgICAgcmlnaHRbaV0gPSBhW2ldOworCisgIHVpbnQ2NF90IHRtcFsxNl07CisgIHdoaWxlIChkZWNpbWFsX2hlbHBlcl9yYXdfY29tcGFyZV9hbnkobGVmdCwgYWwsIHJpZ2h0LCBhbCkgPD0gMCkgeworICAgIHVpbnQ2NF90IGN1clsxNl07CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbDsgaSsrKQorICAgICAgY3VyW2ldID0gbGVmdFtpXSArIHJpZ2h0W2ldOworCisgICAgZm9yIChpbnQgaSA9IGFsIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgIGlmIChpKQorICAgICAgICBjdXJbaSAtIDFdICs9IEZYTUFUSF9ERUNJTUFMX0xTSElGVDMyQklUKGN1cltpXSAlIDIpOworICAgICAgY3VyW2ldIC89IDI7CisgICAgfQorCisgICAgZGVjaW1hbF9oZWxwZXJfcmF3X211bChjdXIsIGFsLCBiLCBibCwgdG1wLCAxNik7CisgICAgc3dpdGNoIChkZWNpbWFsX2hlbHBlcl9yYXdfY29tcGFyZV9hbnkodG1wLCAxNiwgYSwgYWwpKSB7CisgICAgICBjYXNlIC0xOgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspCisgICAgICAgICAgbGVmdFtpXSA9IGN1cltpXTsKKworICAgICAgICBsZWZ0WzBdKys7CisgICAgICAgIGRlY2ltYWxfaGVscGVyX25vcm1hbGl6ZV9hbnkobGVmdCwgYWwpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKQorICAgICAgICAgIHJpZ2h0W2ldID0gY3VyW2ldOworICAgICAgICBkZWNpbWFsX2hlbHBlcl9kZWNfYW55KHJpZ2h0LCBhbCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAwOgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ZDo6bWluKGFsLCBjbCk7IGkrKykKKyAgICAgICAgICBjW2ldID0gY3VyW2ldOworICAgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RkOjptaW4oYWwsIGNsKTsgaSsrKQorICAgIGNbaV0gPSBsZWZ0W2ldOworfQorCitpbmxpbmUgYm9vbCBkZWNpbWFsX2hlbHBlcl9vdXRvZnJhbmdlKHVpbnQ2NF90IGFbXSwgdWludDhfdCBhbCwgdWludDhfdCBnb2FsKSB7CisgIGZvciAoaW50IGkgPSBnb2FsOyBpIDwgYWw7IGkrKykgeworICAgIGlmIChhW2ldKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitpbmxpbmUgdm9pZCBkZWNpbWFsX2hlbHBlcl9zaHJpbmtpbnRvcmFuZ2UodWludDY0X3QgYVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBnb2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QmIHNjYWxlKSB7CisgIGJvb2wgYlJvdW5kVXAgPSBmYWxzZTsKKyAgd2hpbGUgKHNjYWxlICE9IDAgJiYgKHNjYWxlID4gRlhNQVRIX0RFQ0lNQUxfU0NBTEVMSU1JVCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbF9oZWxwZXJfb3V0b2ZyYW5nZShhLCBhbCwgZ29hbCkpKSB7CisgICAgYlJvdW5kVXAgPSBkZWNpbWFsX2hlbHBlcl9kaXYxMF9hbnkoYSwgYWwpID49IDU7CisgICAgc2NhbGUtLTsKKyAgfQorICBpZiAoYlJvdW5kVXApIHsKKyAgICBkZWNpbWFsX2hlbHBlcl9ub3JtYWxpemVfYW55KGEsIGdvYWwpOworICAgIGRlY2ltYWxfaGVscGVyX2luY19hbnkoYSwgZ29hbCk7CisgIH0KK30KKworaW5saW5lIHZvaWQgZGVjaW1hbF9oZWxwZXJfdHJ1bmNhdGUodWludDY0X3QmIHBoaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90JiBwbWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QmIHBsbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QmIHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtaW5zY2FsZSA9IDApIHsKKyAgd2hpbGUgKHNjYWxlID4gbWluc2NhbGUpIHsKKyAgICB1aW50NjRfdCB0aGkgPSBwaGksIHRtaWQgPSBwbWlkLCB0bG8gPSBwbG87CisgICAgaWYgKGRlY2ltYWxfaGVscGVyX2RpdjEwKHRoaSwgdG1pZCwgdGxvKSAhPSAwKQorICAgICAgYnJlYWs7CisKKyAgICBwaGkgPSB0aGk7CisgICAgcG1pZCA9IHRtaWQ7CisgICAgcGxvID0gdGxvOworICAgIHNjYWxlLS07CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0NGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbCgpIDogbV91SGkoMCksIG1fdUxvKDApLCBtX3VNaWQoMCksIG1fdUZsYWdzKDApIHt9CisKK0NGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbCh1aW50NjRfdCB2YWwpCisgICAgOiBtX3VIaSgwKSwKKyAgICAgIG1fdUxvKHN0YXRpY19jYXN0PHVpbnQzMl90Pih2YWwpKSwKKyAgICAgIG1fdU1pZChzdGF0aWNfY2FzdDx1aW50MzJfdD4oRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQodmFsKSkpLAorICAgICAgbV91RmxhZ3MoMCkge30KKworQ0ZYX0RlY2ltYWw6OkNGWF9EZWNpbWFsKHVpbnQzMl90IHZhbCkKKyAgICA6IG1fdUhpKDApLCBtX3VMbyhzdGF0aWNfY2FzdDx1aW50MzJfdD4odmFsKSksIG1fdU1pZCgwKSwgbV91RmxhZ3MoMCkge30KKworQ0ZYX0RlY2ltYWw6OkNGWF9EZWNpbWFsKHVpbnQzMl90IGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNjYWxlKQorICAgIDogbV91SGkoaGkpLAorICAgICAgbV91TG8obG8pLAorICAgICAgbV91TWlkKG1pZCksCisgICAgICBtX3VGbGFncyhGWE1BVEhfREVDSU1BTF9NQUtFRkxBR1MoCisgICAgICAgICAgbmVnICYmIElzTm90WmVybygpLAorICAgICAgICAgIChzY2FsZSA+IEZYTUFUSF9ERUNJTUFMX1NDQUxFTElNSVQgPyAwIDogc2NhbGUpKSkge30KKworQ0ZYX0RlY2ltYWw6OkNGWF9EZWNpbWFsKGludDMyX3QgdmFsKSB7CisgIGlmICh2YWwgPj0gMCkgeworICAgICp0aGlzID0gQ0ZYX0RlY2ltYWwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHZhbCkpOworICB9IGVsc2UgeworICAgICp0aGlzID0gQ0ZYX0RlY2ltYWwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KC12YWwpKTsKKyAgICBTZXROZWdhdGUoKTsKKyAgfQorfQorCitDRlhfRGVjaW1hbDo6Q0ZYX0RlY2ltYWwoZmxvYXQgdmFsLCB1aW50OF90IHNjYWxlKSB7CisgIGZsb2F0IG5ld3ZhbCA9IGZhYnModmFsKTsKKyAgdWludDY0X3QgcGhpOworICB1aW50NjRfdCBwbWlkOworICB1aW50NjRfdCBwbG87CisgIHBsbyA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihuZXd2YWwpOworICBwbWlkID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG5ld3ZhbCAvIDFlMzIpOworICBwaGkgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4obmV3dmFsIC8gMWU2NCk7CisgIG5ld3ZhbCA9IGZtb2QobmV3dmFsLCAxLjBmKTsKKyAgZm9yICh1aW50OF90IGl0ZXIgPSAwOyBpdGVyIDwgc2NhbGU7IGl0ZXIrKykgeworICAgIGRlY2ltYWxfaGVscGVyX211bDEwKHBoaSwgcG1pZCwgcGxvKTsKKyAgICBuZXd2YWwgKj0gMTA7CisgICAgcGxvICs9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihuZXd2YWwpOworICAgIG5ld3ZhbCA9IGZtb2QobmV3dmFsLCAxLjBmKTsKKyAgfQorCisgIHBsbyArPSBGWFNZU19yb3VuZChuZXd2YWwpOworICBkZWNpbWFsX2hlbHBlcl9ub3JtYWxpemUocGhpLCBwbWlkLCBwbG8pOworICBtX3VIaSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihwaGkpOworICBtX3VNaWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocG1pZCk7CisgIG1fdUxvID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBsbyk7CisgIG1fdUZsYWdzID0gRlhNQVRIX0RFQ0lNQUxfTUFLRUZMQUdTKHZhbCA8IDAgJiYgSXNOb3RaZXJvKCksIHNjYWxlKTsKK30KKworQ0ZYX0RlY2ltYWw6OkNGWF9EZWNpbWFsKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBzdHJPYmopIHsKKyAgY29uc3Qgd2NoYXJfdCogc3RyID0gc3RyT2JqLnVudGVybWluYXRlZF9jX3N0cigpOworICBjb25zdCB3Y2hhcl90KiBzdHJCb3VuZCA9IHN0ciArIHN0ck9iai5HZXRMZW5ndGgoKTsKKyAgYm9vbCBwb2ludG1ldCA9IGZhbHNlOworICBib29sIG5lZ21ldCA9IGZhbHNlOworICB1aW50OF90IHNjYWxlID0gMDsKKyAgbV91SGkgPSAwOworICBtX3VNaWQgPSAwOworICBtX3VMbyA9IDA7CisgIHdoaWxlIChzdHIgIT0gc3RyQm91bmQgJiYgKnN0ciA9PSAnICcpCisgICAgc3RyKys7CisgIGlmIChzdHIgIT0gc3RyQm91bmQgJiYgKnN0ciA9PSAnLScpIHsKKyAgICBuZWdtZXQgPSAxOworICAgIHN0cisrOworICB9IGVsc2UgaWYgKHN0ciAhPSBzdHJCb3VuZCAmJiAqc3RyID09ICcrJykgeworICAgIHN0cisrOworICB9CisKKyAgd2hpbGUgKHN0ciAhPSBzdHJCb3VuZCAmJiAoc3RkOjppc3dkaWdpdCgqc3RyKSB8fCAqc3RyID09ICcuJykgJiYKKyAgICAgICAgIHNjYWxlIDwgRlhNQVRIX0RFQ0lNQUxfU0NBTEVMSU1JVCkgeworICAgIGlmICgqc3RyID09ICcuJykgeworICAgICAgaWYgKCFwb2ludG1ldCkKKyAgICAgICAgcG9pbnRtZXQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICBtX3VIaSA9IG1fdUhpICogMHhBICsgRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQoKHVpbnQ2NF90KW1fdU1pZCAqIDB4QSk7CisgICAgICBtX3VNaWQgPSBtX3VNaWQgKiAweEEgKyBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVCgodWludDY0X3QpbV91TG8gKiAweEEpOworICAgICAgbV91TG8gPSBtX3VMbyAqIDB4QSArICgqc3RyIC0gJzAnKTsKKyAgICAgIGlmIChwb2ludG1ldCkKKyAgICAgICAgc2NhbGUrKzsKKyAgICB9CisgICAgc3RyKys7CisgIH0KKyAgbV91RmxhZ3MgPSBGWE1BVEhfREVDSU1BTF9NQUtFRkxBR1MobmVnbWV0ICYmIElzTm90WmVybygpLCBzY2FsZSk7Cit9CisKK0NGWF9EZWNpbWFsOjpvcGVyYXRvciBXaWRlU3RyaW5nKCkgY29uc3QgeworICBXaWRlU3RyaW5nIHJldFN0cmluZzsKKyAgV2lkZVN0cmluZyB0bXBidWY7CisgIHVpbnQ2NF90IHBoaSA9IG1fdUhpOworICB1aW50NjRfdCBwbWlkID0gbV91TWlkOworICB1aW50NjRfdCBwbG8gPSBtX3VMbzsKKyAgd2hpbGUgKHBoaSB8fCBwbWlkIHx8IHBsbykKKyAgICB0bXBidWYgKz0gZGVjaW1hbF9oZWxwZXJfZGl2MTAocGhpLCBwbWlkLCBwbG8pICsgJzAnOworCisgIHVpbnQ4X3Qgb3V0cHV0bGVuID0gKHVpbnQ4X3QpdG1wYnVmLkdldExlbmd0aCgpOworICB1aW50OF90IHNjYWxlID0gKHVpbnQ4X3QpRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobV91RmxhZ3MpOworICB3aGlsZSAoc2NhbGUgPj0gb3V0cHV0bGVuKSB7CisgICAgdG1wYnVmICs9ICcwJzsKKyAgICBvdXRwdXRsZW4rKzsKKyAgfQorICBpZiAoRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKG1fdUZsYWdzKSAmJiBJc05vdFplcm8oKSkKKyAgICByZXRTdHJpbmcgKz0gJy0nOworCisgIGZvciAodWludDhfdCBpZHggPSAwOyBpZHggPCBvdXRwdXRsZW47IGlkeCsrKSB7CisgICAgaWYgKGlkeCA9PSAob3V0cHV0bGVuIC0gc2NhbGUpICYmIHNjYWxlICE9IDApCisgICAgICByZXRTdHJpbmcgKz0gJy4nOworICAgIHJldFN0cmluZyArPSB0bXBidWZbb3V0cHV0bGVuIC0gMSAtIGlkeF07CisgIH0KKyAgcmV0dXJuIHJldFN0cmluZzsKK30KKworQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yIGRvdWJsZSgpIGNvbnN0IHsKKyAgZG91YmxlIHBvdyA9IChkb3VibGUpKDEgPDwgMTYpICogKDEgPDwgMTYpOworICBkb3VibGUgYmFzZSA9IHN0YXRpY19jYXN0PGRvdWJsZT4obV91SGkpICogcG93ICogcG93ICsKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KG1fdU1pZCkgKiBwb3cgKyBzdGF0aWNfY2FzdDxkb3VibGU+KG1fdUxvKTsKKyAgaW50OF90IHNjYWxlID0gRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobV91RmxhZ3MpOworICBib29sIGJOZWcgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpOworICByZXR1cm4gKGJOZWcgPyAtMSA6IDEpICogYmFzZSAqIDo6cG93KDEwLjAsIC1zY2FsZSk7Cit9CisKK3ZvaWQgQ0ZYX0RlY2ltYWw6OlNldFNjYWxlKHVpbnQ4X3QgbmV3c2NhbGUpIHsKKyAgdWludDhfdCBvbGRzY2FsZSA9IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKG1fdUZsYWdzKTsKKyAgaWYgKG5ld3NjYWxlID4gb2xkc2NhbGUpIHsKKyAgICB1aW50NjRfdCBwaGkgPSBtX3VIaTsKKyAgICB1aW50NjRfdCBwbWlkID0gbV91TWlkOworICAgIHVpbnQ2NF90IHBsbyA9IG1fdUxvOworICAgIGZvciAodWludDhfdCBpdGVyID0gMDsgaXRlciA8IG5ld3NjYWxlIC0gb2xkc2NhbGU7IGl0ZXIrKykKKyAgICAgIGRlY2ltYWxfaGVscGVyX211bDEwKHBoaSwgcG1pZCwgcGxvKTsKKworICAgIG1fdUhpID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBoaSk7CisgICAgbV91TWlkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBtaWQpOworICAgIG1fdUxvID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBsbyk7CisgICAgbV91RmxhZ3MgPSBGWE1BVEhfREVDSU1BTF9NQUtFRkxBR1MoCisgICAgICAgIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhtX3VGbGFncykgJiYgSXNOb3RaZXJvKCksIG5ld3NjYWxlKTsKKyAgfSBlbHNlIGlmIChuZXdzY2FsZSA8IG9sZHNjYWxlKSB7CisgICAgdWludDY0X3QgcGhpOworICAgIHVpbnQ2NF90IHBtaWQ7CisgICAgdWludDY0X3QgcGxvOworICAgIHBoaSA9IDA7CisgICAgcG1pZCA9IDA7CisgICAgcGxvID0gNTsKKyAgICBmb3IgKHVpbnQ4X3QgaXRlciA9IDA7IGl0ZXIgPCBvbGRzY2FsZSAtIG5ld3NjYWxlIC0gMTsgaXRlcisrKQorICAgICAgZGVjaW1hbF9oZWxwZXJfbXVsMTAocGhpLCBwbWlkLCBwbG8pOworCisgICAgcGhpICs9IG1fdUhpOworICAgIHBtaWQgKz0gbV91TWlkOworICAgIHBsbyArPSBtX3VMbzsKKyAgICBkZWNpbWFsX2hlbHBlcl9ub3JtYWxpemUocGhpLCBwbWlkLCBwbG8pOworICAgIGZvciAodWludDhfdCBpdGVyID0gMDsgaXRlciA8IG9sZHNjYWxlIC0gbmV3c2NhbGU7IGl0ZXIrKykKKyAgICAgIGRlY2ltYWxfaGVscGVyX2RpdjEwKHBoaSwgcG1pZCwgcGxvKTsKKworICAgIG1fdUhpID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBoaSk7CisgICAgbV91TWlkID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBtaWQpOworICAgIG1fdUxvID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBsbyk7CisgICAgbV91RmxhZ3MgPSBGWE1BVEhfREVDSU1BTF9NQUtFRkxBR1MoCisgICAgICAgIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhtX3VGbGFncykgJiYgSXNOb3RaZXJvKCksIG5ld3NjYWxlKTsKKyAgfQorfQorCit1aW50OF90IENGWF9EZWNpbWFsOjpHZXRTY2FsZSgpIHsKKyAgcmV0dXJuIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKG1fdUZsYWdzKTsKK30KKwordm9pZCBDRlhfRGVjaW1hbDo6U2V0TmVnYXRlKCkgeworICBpZiAoSXNOb3RaZXJvKCkpCisgICAgbV91RmxhZ3MgXj0gRlhNQVRIX0RFQ0lNQUxfTkVHTUFTSzsKK30KKwordm9pZCBDRlhfRGVjaW1hbDo6U3dhcChDRlhfRGVjaW1hbCYgdmFsKSB7CisgIHN0ZDo6c3dhcChtX3VIaSwgdmFsLm1fdUhpKTsKKyAgc3RkOjpzd2FwKG1fdU1pZCwgdmFsLm1fdU1pZCk7CisgIHN0ZDo6c3dhcChtX3VMbywgdmFsLm1fdUxvKTsKKyAgc3RkOjpzd2FwKG1fdUZsYWdzLCB2YWwubV91RmxhZ3MpOworfQorCitDRlhfRGVjaW1hbCBDRlhfRGVjaW1hbDo6b3BlcmF0b3IqKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0IHsKKyAgdWludDY0X3QgYVszXSA9IHttX3VMbywgbV91TWlkLCBtX3VIaX0sCisgICAgICAgICAgIGJbM10gPSB7dmFsLm1fdUxvLCB2YWwubV91TWlkLCB2YWwubV91SGl9OworICB1aW50NjRfdCBjWzZdOworICBkZWNpbWFsX2hlbHBlcl9yYXdfbXVsKGEsIDMsIGIsIDMsIGMsIDYpOworICBib29sIG5lZyA9IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhtX3VGbGFncykgXgorICAgICAgICAgICAgIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyh2YWwubV91RmxhZ3MpOworICB1aW50OF90IHNjYWxlID0gRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobV91RmxhZ3MpICsKKyAgICAgICAgICAgICAgICAgIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKHZhbC5tX3VGbGFncyk7CisgIGRlY2ltYWxfaGVscGVyX3Nocmlua2ludG9yYW5nZShjLCA2LCAzLCBzY2FsZSk7CisgIHJldHVybiBDRlhfRGVjaW1hbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oY1swXSksIHN0YXRpY19jYXN0PHVpbnQzMl90PihjWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihjWzJdKSwgbmVnLCBzY2FsZSk7Cit9CisKK0NGWF9EZWNpbWFsIENGWF9EZWNpbWFsOjpvcGVyYXRvci8oY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3QgeworICBpZiAoIXZhbC5Jc05vdFplcm8oKSkKKyAgICByZXR1cm4gQ0ZYX0RlY2ltYWwoKTsKKworICBib29sIG5lZyA9IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhtX3VGbGFncykgXgorICAgICAgICAgICAgIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyh2YWwubV91RmxhZ3MpOworICB1aW50NjRfdCBhWzddID0ge21fdUxvLCBtX3VNaWQsIG1fdUhpfSwKKyAgICAgICAgICAgYlszXSA9IHt2YWwubV91TG8sIHZhbC5tX3VNaWQsIHZhbC5tX3VIaX0sIGNbN10gPSB7MH07CisgIHVpbnQ4X3Qgc2NhbGUgPSAwOworICBpZiAoRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobV91RmxhZ3MpIDwKKyAgICAgIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKHZhbC5tX3VGbGFncykpIHsKKyAgICBmb3IgKGludCBpID0gRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUodmFsLm1fdUZsYWdzKSAtCisgICAgICAgICAgICAgICAgIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKG1fdUZsYWdzKTsKKyAgICAgICAgIGkgPiAwOyBpLS0pIHsKKyAgICAgIGRlY2ltYWxfaGVscGVyX211bDEwX2FueShhLCA3KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgc2NhbGUgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShtX3VGbGFncykgLQorICAgICAgICAgICAgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUodmFsLm1fdUZsYWdzKTsKKyAgfQorCisgIHVpbnQ4X3QgbWluc2NhbGUgPSBzY2FsZTsKKyAgaWYgKCFJc05vdFplcm8oKSkKKyAgICByZXR1cm4gQ0ZYX0RlY2ltYWwoMCwgMCwgMCwgMCwgbWluc2NhbGUpOworCisgIHdoaWxlICghYVs2XSkgeworICAgIGRlY2ltYWxfaGVscGVyX211bDEwX2FueShhLCA3KTsKKyAgICBzY2FsZSsrOworICB9CisKKyAgZGVjaW1hbF9oZWxwZXJfZGl2MTBfYW55KGEsIDcpOworICBzY2FsZS0tOworICBkZWNpbWFsX2hlbHBlcl9yYXdfZGl2KGEsIDYsIGIsIDMsIGMsIDcpOworICBkZWNpbWFsX2hlbHBlcl9zaHJpbmtpbnRvcmFuZ2UoYywgNiwgMywgc2NhbGUpOworICBkZWNpbWFsX2hlbHBlcl90cnVuY2F0ZShjWzJdLCBjWzFdLCBjWzBdLCBzY2FsZSwgbWluc2NhbGUpOworICByZXR1cm4gQ0ZYX0RlY2ltYWwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNbMF0pLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY1sxXSksCisgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY1syXSksIG5lZywgc2NhbGUpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jZnhfZGVjaW1hbC5oIGIvY29yZS9meGNydC9jZnhfZGVjaW1hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNmUzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2NmeF9kZWNpbWFsLmgKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfQ0ZYX0RFQ0lNQUxfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9DRlhfREVDSU1BTF9IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKworY2xhc3MgQ0ZYX0RlY2ltYWwgeworIHB1YmxpYzoKKyAgQ0ZYX0RlY2ltYWwoKTsKKyAgZXhwbGljaXQgQ0ZYX0RlY2ltYWwodWludDMyX3QgdmFsKTsKKyAgZXhwbGljaXQgQ0ZYX0RlY2ltYWwodWludDY0X3QgdmFsKTsKKyAgZXhwbGljaXQgQ0ZYX0RlY2ltYWwoaW50MzJfdCB2YWwpOworICBDRlhfRGVjaW1hbChmbG9hdCB2YWwsIHVpbnQ4X3Qgc2NhbGUpOworICBleHBsaWNpdCBDRlhfRGVjaW1hbChjb25zdCBXaWRlU3RyaW5nVmlldyYgc3RyKTsKKworICBvcGVyYXRvciBXaWRlU3RyaW5nKCkgY29uc3Q7CisgIG9wZXJhdG9yIGRvdWJsZSgpIGNvbnN0OworCisgIENGWF9EZWNpbWFsIG9wZXJhdG9yKihjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdDsKKyAgQ0ZYX0RlY2ltYWwgb3BlcmF0b3IvKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0OworCisgIHZvaWQgU2V0U2NhbGUodWludDhfdCBuZXdTY2FsZSk7CisgIHVpbnQ4X3QgR2V0U2NhbGUoKTsKKyAgdm9pZCBTZXROZWdhdGUoKTsKKworIHByaXZhdGU6CisgIENGWF9EZWNpbWFsKHVpbnQzMl90IGhpLCB1aW50MzJfdCBtaWQsIHVpbnQzMl90IGxvLCBib29sIG5lZywgdWludDhfdCBzY2FsZSk7CisgIGJvb2wgSXNOb3RaZXJvKCkgY29uc3QgeyByZXR1cm4gbV91SGkgfHwgbV91TWlkIHx8IG1fdUxvOyB9CisgIHZvaWQgU3dhcChDRlhfRGVjaW1hbCYgdmFsKTsKKworICB1aW50MzJfdCBtX3VIaTsKKyAgdWludDMyX3QgbV91TG87CisgIHVpbnQzMl90IG1fdU1pZDsKKyAgdWludDMyX3QgbV91RmxhZ3M7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfQ0ZYX0RFQ0lNQUxfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY2Z4X2ZpbGVhY2Nlc3NfcG9zaXguY3BwIGIvY29yZS9meGNydC9jZnhfZmlsZWFjY2Vzc19wb3NpeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY4NTY3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY2Z4X2ZpbGVhY2Nlc3NfcG9zaXguY3BwCkBAIC0wLDAgKzEsMTUzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9maWxlYWNjZXNzX3Bvc2l4LmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKKyNpZm5kZWYgT19CSU5BUlkKKyNkZWZpbmUgT19CSU5BUlkgMAorI2VuZGlmICAvLyBPX0JJTkFSWQorCisjaWZuZGVmIE9fTEFSR0VGSUxFCisjZGVmaW5lIE9fTEFSR0VGSUxFIDAKKyNlbmRpZiAgLy8gT19MQVJHRUZJTEUKKworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0xJTlVYXyB8fCBcCisgICAgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfIHx8IFwKKyAgICBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9BTkRST0lEXworCituYW1lc3BhY2UgeworCit2b2lkIEdldEZpbGVNb2RlKHVpbnQzMl90IGR3TW9kZXMsIGludDMyX3QmIG5GbGFncywgaW50MzJfdCYgbk1hc2tzKSB7CisgIG5GbGFncyA9IE9fQklOQVJZIHwgT19MQVJHRUZJTEU7CisgIGlmIChkd01vZGVzICYgRlhfRklMRU1PREVfUmVhZE9ubHkpIHsKKyAgICBuRmxhZ3MgfD0gT19SRE9OTFk7CisgICAgbk1hc2tzID0gMDsKKyAgfSBlbHNlIHsKKyAgICBuRmxhZ3MgfD0gT19SRFdSIHwgT19DUkVBVDsKKyAgICBpZiAoZHdNb2RlcyAmIEZYX0ZJTEVNT0RFX1RydW5jYXRlKSB7CisgICAgICBuRmxhZ3MgfD0gT19UUlVOQzsKKyAgICB9CisgICAgbk1hc2tzID0gU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USDsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitzdGQ6OnVuaXF1ZV9wdHI8SUZYX0ZpbGVBY2Nlc3M+IElGWF9GaWxlQWNjZXNzOjpDcmVhdGUoKSB7CisgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0ZpbGVBY2Nlc3NfUG9zaXg+KCk7Cit9CisKK0NGWF9GaWxlQWNjZXNzX1Bvc2l4OjpDRlhfRmlsZUFjY2Vzc19Qb3NpeCgpIDogbV9uRkQoLTEpIHt9CisKK0NGWF9GaWxlQWNjZXNzX1Bvc2l4Ojp+Q0ZYX0ZpbGVBY2Nlc3NfUG9zaXgoKSB7CisgIENsb3NlKCk7Cit9CisKK2Jvb2wgQ0ZYX0ZpbGVBY2Nlc3NfUG9zaXg6Ok9wZW4oY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd01vZGUpIHsKKyAgaWYgKG1fbkZEID4gLTEpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGludDMyX3QgbkZsYWdzOworICBpbnQzMl90IG5NYXNrczsKKyAgR2V0RmlsZU1vZGUoZHdNb2RlLCBuRmxhZ3MsIG5NYXNrcyk7CisKKyAgLy8gVE9ETyh0c2VwZXopOiBjaGVjayB1c2FnZSBvZiBjX3N0cigpIGJlbG93LgorICBtX25GRCA9IG9wZW4oZmlsZU5hbWUudW50ZXJtaW5hdGVkX2Nfc3RyKCksIG5GbGFncywgbk1hc2tzKTsKKyAgcmV0dXJuIG1fbkZEID4gLTE7Cit9CisKK2Jvb2wgQ0ZYX0ZpbGVBY2Nlc3NfUG9zaXg6Ok9wZW4oY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd01vZGUpIHsKKyAgcmV0dXJuIE9wZW4oRlhfVVRGOEVuY29kZShmaWxlTmFtZSkuQXNTdHJpbmdWaWV3KCksIGR3TW9kZSk7Cit9CisKK3ZvaWQgQ0ZYX0ZpbGVBY2Nlc3NfUG9zaXg6OkNsb3NlKCkgeworICBpZiAobV9uRkQgPCAwKSB7CisgICAgcmV0dXJuOworICB9CisgIGNsb3NlKG1fbkZEKTsKKyAgbV9uRkQgPSAtMTsKK30KK0ZYX0ZJTEVTSVpFIENGWF9GaWxlQWNjZXNzX1Bvc2l4OjpHZXRTaXplKCkgY29uc3QgeworICBpZiAobV9uRkQgPCAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc3RydWN0IHN0YXQgczsKKyAgbWVtc2V0KCZzLCAwLCBzaXplb2YocykpOworICBmc3RhdChtX25GRCwgJnMpOworICByZXR1cm4gcy5zdF9zaXplOworfQorRlhfRklMRVNJWkUgQ0ZYX0ZpbGVBY2Nlc3NfUG9zaXg6OkdldFBvc2l0aW9uKCkgY29uc3QgeworICBpZiAobV9uRkQgPCAwKSB7CisgICAgcmV0dXJuIChGWF9GSUxFU0laRSktMTsKKyAgfQorICByZXR1cm4gbHNlZWsobV9uRkQsIDAsIFNFRUtfQ1VSKTsKK30KK0ZYX0ZJTEVTSVpFIENGWF9GaWxlQWNjZXNzX1Bvc2l4OjpTZXRQb3NpdGlvbihGWF9GSUxFU0laRSBwb3MpIHsKKyAgaWYgKG1fbkZEIDwgMCkgeworICAgIHJldHVybiAoRlhfRklMRVNJWkUpLTE7CisgIH0KKyAgcmV0dXJuIGxzZWVrKG1fbkZELCBwb3MsIFNFRUtfU0VUKTsKK30KK3NpemVfdCBDRlhfRmlsZUFjY2Vzc19Qb3NpeDo6UmVhZCh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpIHsKKyAgaWYgKG1fbkZEIDwgMCkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiByZWFkKG1fbkZELCBwQnVmZmVyLCBzekJ1ZmZlcik7Cit9CitzaXplX3QgQ0ZYX0ZpbGVBY2Nlc3NfUG9zaXg6OldyaXRlKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikgeworICBpZiAobV9uRkQgPCAwKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIHdyaXRlKG1fbkZELCBwQnVmZmVyLCBzekJ1ZmZlcik7Cit9CitzaXplX3QgQ0ZYX0ZpbGVBY2Nlc3NfUG9zaXg6OlJlYWRQb3Modm9pZCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3pCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgcG9zKSB7CisgIGlmIChtX25GRCA8IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAocG9zID49IEdldFNpemUoKSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChTZXRQb3NpdGlvbihwb3MpID09IChGWF9GSUxFU0laRSktMSkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBSZWFkKHBCdWZmZXIsIHN6QnVmZmVyKTsKK30KK3NpemVfdCBDRlhfRmlsZUFjY2Vzc19Qb3NpeDo6V3JpdGVQb3MoY29uc3Qgdm9pZCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHN6QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBwb3MpIHsKKyAgaWYgKG1fbkZEIDwgMCkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChTZXRQb3NpdGlvbihwb3MpID09IChGWF9GSUxFU0laRSktMSkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBXcml0ZShwQnVmZmVyLCBzekJ1ZmZlcik7Cit9CisKK2Jvb2wgQ0ZYX0ZpbGVBY2Nlc3NfUG9zaXg6OkZsdXNoKCkgeworICBpZiAobV9uRkQgPCAwKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gZnN5bmMobV9uRkQpID4gLTE7Cit9CisKK2Jvb2wgQ0ZYX0ZpbGVBY2Nlc3NfUG9zaXg6OlRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSkgeworICBpZiAobV9uRkQgPCAwKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gIWZ0cnVuY2F0ZShtX25GRCwgc3pGaWxlKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2NmeF9maWxlYWNjZXNzX3Bvc2l4LmggYi9jb3JlL2Z4Y3J0L2NmeF9maWxlYWNjZXNzX3Bvc2l4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZhMjVlYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY2Z4X2ZpbGVhY2Nlc3NfcG9zaXguaApAQCAtMCwwICsxLDQxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENSVF9DRlhfRklMRUFDQ0VTU19QT1NJWF9IXworI2RlZmluZSBDT1JFX0ZYQ1JUX0NGWF9GSUxFQUNDRVNTX1BPU0lYX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2lmeF9maWxlYWNjZXNzLmgiCisKKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9MSU5VWF8gfHwgXAorICAgIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXyB8fCBcCisgICAgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQU5EUk9JRF8KK2NsYXNzIENGWF9GaWxlQWNjZXNzX1Bvc2l4IDogcHVibGljIElGWF9GaWxlQWNjZXNzIHsKKyBwdWJsaWM6CisgIENGWF9GaWxlQWNjZXNzX1Bvc2l4KCk7CisgIH5DRlhfRmlsZUFjY2Vzc19Qb3NpeCgpIG92ZXJyaWRlOworCisgIC8vIElGWF9GaWxlQWNjZXNzOgorICBib29sIE9wZW4oY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGZpbGVOYW1lLCB1aW50MzJfdCBkd01vZGUpIG92ZXJyaWRlOworICBib29sIE9wZW4oY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGZpbGVOYW1lLCB1aW50MzJfdCBkd01vZGUpIG92ZXJyaWRlOworICB2b2lkIENsb3NlKCkgb3ZlcnJpZGU7CisgIEZYX0ZJTEVTSVpFIEdldFNpemUoKSBjb25zdCBvdmVycmlkZTsKKyAgRlhfRklMRVNJWkUgR2V0UG9zaXRpb24oKSBjb25zdCBvdmVycmlkZTsKKyAgRlhfRklMRVNJWkUgU2V0UG9zaXRpb24oRlhfRklMRVNJWkUgcG9zKSBvdmVycmlkZTsKKyAgc2l6ZV90IFJlYWQodm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKSBvdmVycmlkZTsKKyAgc2l6ZV90IFdyaXRlKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikgb3ZlcnJpZGU7CisgIHNpemVfdCBSZWFkUG9zKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKSBvdmVycmlkZTsKKyAgc2l6ZV90IFdyaXRlUG9zKGNvbnN0IHZvaWQqIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICBzaXplX3Qgc3pCdWZmZXIsCisgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBwb3MpIG92ZXJyaWRlOworICBib29sIEZsdXNoKCkgb3ZlcnJpZGU7CisgIGJvb2wgVHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKSBvdmVycmlkZTsKKworIHByb3RlY3RlZDoKKyAgaW50MzJfdCBtX25GRDsKK307CisjZW5kaWYKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0NGWF9GSUxFQUNDRVNTX1BPU0lYX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2NmeF9maWxlYWNjZXNzX3dpbmRvd3MuY3BwIGIvY29yZS9meGNydC9jZnhfZmlsZWFjY2Vzc193aW5kb3dzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWM0NDk2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9jZnhfZmlsZWFjY2Vzc193aW5kb3dzLmNwcApAQCAtMCwwICsxLDE5NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfZmlsZWFjY2Vzc193aW5kb3dzLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisKK25hbWVzcGFjZSB7CisKK3ZvaWQgR2V0RmlsZU1vZGUodWludDMyX3QgZHdNb2RlLAorICAgICAgICAgICAgICAgICB1aW50MzJfdCYgZHdBY2Nlc3MsCisgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBkd1NoYXJlLAorICAgICAgICAgICAgICAgICB1aW50MzJfdCYgZHdDcmVhdGlvbikgeworICBkd0FjY2VzcyA9IEdFTkVSSUNfUkVBRDsKKyAgZHdTaGFyZSA9IEZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEU7CisgIGlmICghKGR3TW9kZSAmIEZYX0ZJTEVNT0RFX1JlYWRPbmx5KSkgeworICAgIGR3QWNjZXNzIHw9IEdFTkVSSUNfV1JJVEU7CisgICAgZHdDcmVhdGlvbiA9IChkd01vZGUgJiBGWF9GSUxFTU9ERV9UcnVuY2F0ZSkgPyBDUkVBVEVfQUxXQVlTIDogT1BFTl9BTFdBWVM7CisgIH0gZWxzZSB7CisgICAgZHdDcmVhdGlvbiA9IE9QRU5fRVhJU1RJTkc7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworc3RkOjp1bmlxdWVfcHRyPElGWF9GaWxlQWNjZXNzPiBJRlhfRmlsZUFjY2Vzczo6Q3JlYXRlKCkgeworICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9GaWxlQWNjZXNzX1dpbmRvd3M+KCk7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK1dJTkJBU0VBUEkgQk9PTCBXSU5BUEkgR2V0RmlsZVNpemVFeChIQU5ETEUgaEZpbGUsIFBMQVJHRV9JTlRFR0VSIGxwRmlsZVNpemUpOworV0lOQkFTRUFQSSBCT09MIFdJTkFQSSBTZXRGaWxlUG9pbnRlckV4KEhBTkRMRSBoRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQVJHRV9JTlRFR0VSIGxpRGlzdGFuY2VUb01vdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUExBUkdFX0lOVEVHRVIgbHBOZXdGaWxlUG9pbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd01vdmVNZXRob2QpOworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworQ0ZYX0ZpbGVBY2Nlc3NfV2luZG93czo6Q0ZYX0ZpbGVBY2Nlc3NfV2luZG93cygpIDogbV9oRmlsZShudWxscHRyKSB7fQorCitDRlhfRmlsZUFjY2Vzc19XaW5kb3dzOjp+Q0ZYX0ZpbGVBY2Nlc3NfV2luZG93cygpIHsKKyAgQ2xvc2UoKTsKK30KKworYm9vbCBDRlhfRmlsZUFjY2Vzc19XaW5kb3dzOjpPcGVuKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd01vZGUpIHsKKyAgaWYgKG1faEZpbGUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHVpbnQzMl90IGR3QWNjZXNzLCBkd1NoYXJlLCBkd0NyZWF0aW9uOworICBHZXRGaWxlTW9kZShkd01vZGUsIGR3QWNjZXNzLCBkd1NoYXJlLCBkd0NyZWF0aW9uKTsKKyAgbV9oRmlsZSA9IDo6Q3JlYXRlRmlsZUEoZmlsZU5hbWUudW50ZXJtaW5hdGVkX2Nfc3RyKCksIGR3QWNjZXNzLCBkd1NoYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBkd0NyZWF0aW9uLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIG51bGxwdHIpOworICBpZiAobV9oRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICBtX2hGaWxlID0gbnVsbHB0cjsKKworICByZXR1cm4gISFtX2hGaWxlOworfQorCitib29sIENGWF9GaWxlQWNjZXNzX1dpbmRvd3M6Ok9wZW4oY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3TW9kZSkgeworICBpZiAobV9oRmlsZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgdWludDMyX3QgZHdBY2Nlc3MsIGR3U2hhcmUsIGR3Q3JlYXRpb247CisgIEdldEZpbGVNb2RlKGR3TW9kZSwgZHdBY2Nlc3MsIGR3U2hhcmUsIGR3Q3JlYXRpb24pOworICBtX2hGaWxlID0KKyAgICAgIDo6Q3JlYXRlRmlsZVcoKExQQ1dTVFIpZmlsZU5hbWUudW50ZXJtaW5hdGVkX2Nfc3RyKCksIGR3QWNjZXNzLCBkd1NoYXJlLAorICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBkd0NyZWF0aW9uLCBGSUxFX0FUVFJJQlVURV9OT1JNQUwsIG51bGxwdHIpOworICBpZiAobV9oRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKKyAgICBtX2hGaWxlID0gbnVsbHB0cjsKKworICByZXR1cm4gISFtX2hGaWxlOworfQorCit2b2lkIENGWF9GaWxlQWNjZXNzX1dpbmRvd3M6OkNsb3NlKCkgeworICBpZiAoIW1faEZpbGUpCisgICAgcmV0dXJuOworCisgIDo6Q2xvc2VIYW5kbGUobV9oRmlsZSk7CisgIG1faEZpbGUgPSBudWxscHRyOworfQorCitGWF9GSUxFU0laRSBDRlhfRmlsZUFjY2Vzc19XaW5kb3dzOjpHZXRTaXplKCkgY29uc3QgeworICBpZiAoIW1faEZpbGUpCisgICAgcmV0dXJuIDA7CisKKyAgTEFSR0VfSU5URUdFUiBzaXplID0ge307CisgIGlmICghOjpHZXRGaWxlU2l6ZUV4KG1faEZpbGUsICZzaXplKSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gKEZYX0ZJTEVTSVpFKXNpemUuUXVhZFBhcnQ7Cit9CisKK0ZYX0ZJTEVTSVpFIENGWF9GaWxlQWNjZXNzX1dpbmRvd3M6OkdldFBvc2l0aW9uKCkgY29uc3QgeworICBpZiAoIW1faEZpbGUpCisgICAgcmV0dXJuIChGWF9GSUxFU0laRSktMTsKKworICBMQVJHRV9JTlRFR0VSIGRpc3QgPSB7fTsKKyAgTEFSR0VfSU5URUdFUiBuZXdQb3MgPSB7fTsKKyAgaWYgKCE6OlNldEZpbGVQb2ludGVyRXgobV9oRmlsZSwgZGlzdCwgJm5ld1BvcywgRklMRV9DVVJSRU5UKSkKKyAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKS0xOworCisgIHJldHVybiAoRlhfRklMRVNJWkUpbmV3UG9zLlF1YWRQYXJ0OworfQorCitGWF9GSUxFU0laRSBDRlhfRmlsZUFjY2Vzc19XaW5kb3dzOjpTZXRQb3NpdGlvbihGWF9GSUxFU0laRSBwb3MpIHsKKyAgaWYgKCFtX2hGaWxlKQorICAgIHJldHVybiAoRlhfRklMRVNJWkUpLTE7CisKKyAgTEFSR0VfSU5URUdFUiBkaXN0OworICBkaXN0LlF1YWRQYXJ0ID0gcG9zOworICBMQVJHRV9JTlRFR0VSIG5ld1BvcyA9IHt9OworICBpZiAoITo6U2V0RmlsZVBvaW50ZXJFeChtX2hGaWxlLCBkaXN0LCAmbmV3UG9zLCBGSUxFX0JFR0lOKSkKKyAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKS0xOworCisgIHJldHVybiAoRlhfRklMRVNJWkUpbmV3UG9zLlF1YWRQYXJ0OworfQorCitzaXplX3QgQ0ZYX0ZpbGVBY2Nlc3NfV2luZG93czo6UmVhZCh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpIHsKKyAgaWYgKCFtX2hGaWxlKQorICAgIHJldHVybiAwOworCisgIHNpemVfdCBzelJlYWQgPSAwOworICBpZiAoITo6UmVhZEZpbGUobV9oRmlsZSwgcEJ1ZmZlciwgKERXT1JEKXN6QnVmZmVyLCAoTFBEV09SRCkmc3pSZWFkLAorICAgICAgICAgICAgICAgICAgbnVsbHB0cikpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gc3pSZWFkOworfQorCitzaXplX3QgQ0ZYX0ZpbGVBY2Nlc3NfV2luZG93czo6V3JpdGUoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKSB7CisgIGlmICghbV9oRmlsZSkKKyAgICByZXR1cm4gMDsKKworICBzaXplX3Qgc3pXcml0ZSA9IDA7CisgIGlmICghOjpXcml0ZUZpbGUobV9oRmlsZSwgcEJ1ZmZlciwgKERXT1JEKXN6QnVmZmVyLCAoTFBEV09SRCkmc3pXcml0ZSwKKyAgICAgICAgICAgICAgICAgICBudWxscHRyKSkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBzeldyaXRlOworfQorCitzaXplX3QgQ0ZYX0ZpbGVBY2Nlc3NfV2luZG93czo6UmVhZFBvcyh2b2lkKiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHN6QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgcG9zKSB7CisgIGlmICghbV9oRmlsZSkKKyAgICByZXR1cm4gMDsKKworICBpZiAocG9zID49IEdldFNpemUoKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoU2V0UG9zaXRpb24ocG9zKSA9PSAoRlhfRklMRVNJWkUpLTEpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIFJlYWQocEJ1ZmZlciwgc3pCdWZmZXIpOworfQorCitzaXplX3QgQ0ZYX0ZpbGVBY2Nlc3NfV2luZG93czo6V3JpdGVQb3MoY29uc3Qgdm9pZCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3pCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgcG9zKSB7CisgIGlmICghbV9oRmlsZSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChTZXRQb3NpdGlvbihwb3MpID09IChGWF9GSUxFU0laRSktMSkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBXcml0ZShwQnVmZmVyLCBzekJ1ZmZlcik7Cit9CisKK2Jvb2wgQ0ZYX0ZpbGVBY2Nlc3NfV2luZG93czo6Rmx1c2goKSB7CisgIGlmICghbV9oRmlsZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuICEhOjpGbHVzaEZpbGVCdWZmZXJzKG1faEZpbGUpOworfQorCitib29sIENGWF9GaWxlQWNjZXNzX1dpbmRvd3M6OlRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSkgeworICBpZiAoU2V0UG9zaXRpb24oc3pGaWxlKSA9PSAoRlhfRklMRVNJWkUpLTEpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiAhITo6U2V0RW5kT2ZGaWxlKG1faEZpbGUpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2NmeF9maWxlYWNjZXNzX3dpbmRvd3MuaCBiL2NvcmUvZnhjcnQvY2Z4X2ZpbGVhY2Nlc3Nfd2luZG93cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZDA3ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2NmeF9maWxlYWNjZXNzX3dpbmRvd3MuaApAQCAtMCwwICsxLDM5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENSVF9DRlhfRklMRUFDQ0VTU19XSU5ET1dTX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfQ0ZYX0ZJTEVBQ0NFU1NfV0lORE9XU19IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9pZnhfZmlsZWFjY2Vzcy5oIgorCisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KK2NsYXNzIENGWF9GaWxlQWNjZXNzX1dpbmRvd3MgOiBwdWJsaWMgSUZYX0ZpbGVBY2Nlc3MgeworIHB1YmxpYzoKKyAgQ0ZYX0ZpbGVBY2Nlc3NfV2luZG93cygpOworICB+Q0ZYX0ZpbGVBY2Nlc3NfV2luZG93cygpIG92ZXJyaWRlOworCisgIC8vIElGWF9GaWxlQWNjZXNzCisgIGJvb2wgT3Blbihjb25zdCBCeXRlU3RyaW5nVmlldyYgZmlsZU5hbWUsIHVpbnQzMl90IGR3TW9kZSkgb3ZlcnJpZGU7CisgIGJvb2wgT3Blbihjb25zdCBXaWRlU3RyaW5nVmlldyYgZmlsZU5hbWUsIHVpbnQzMl90IGR3TW9kZSkgb3ZlcnJpZGU7CisgIHZvaWQgQ2xvc2UoKSBvdmVycmlkZTsKKyAgRlhfRklMRVNJWkUgR2V0U2l6ZSgpIGNvbnN0IG92ZXJyaWRlOworICBGWF9GSUxFU0laRSBHZXRQb3NpdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICBGWF9GSUxFU0laRSBTZXRQb3NpdGlvbihGWF9GSUxFU0laRSBwb3MpIG92ZXJyaWRlOworICBzaXplX3QgUmVhZCh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpIG92ZXJyaWRlOworICBzaXplX3QgV3JpdGUoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKSBvdmVycmlkZTsKKyAgc2l6ZV90IFJlYWRQb3Modm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpIG92ZXJyaWRlOworICBzaXplX3QgV3JpdGVQb3MoY29uc3Qgdm9pZCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCBzekJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIHBvcykgb3ZlcnJpZGU7CisgIGJvb2wgRmx1c2goKSBvdmVycmlkZTsKKyAgYm9vbCBUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpIG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICB2b2lkKiBtX2hGaWxlOworfTsKKyNlbmRpZgorCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfQ0ZYX0ZJTEVBQ0NFU1NfV0lORE9XU19IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jZnhfZml4ZWRidWZncm93LmggYi9jb3JlL2Z4Y3J0L2NmeF9maXhlZGJ1Zmdyb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTJiNzEwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9jZnhfZml4ZWRidWZncm93LmgKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfQ0ZYX0ZJWEVEQlVGR1JPV19IXworI2RlZmluZSBDT1JFX0ZYQ1JUX0NGWF9GSVhFREJVRkdST1dfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCisKK3RlbXBsYXRlIDxjbGFzcyBEYXRhVHlwZSwgaW50IEZpeGVkU2l6ZT4KK2NsYXNzIENGWF9GaXhlZEJ1Zkdyb3cgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0ZYX0ZpeGVkQnVmR3JvdyhpbnQgZGF0YV9zaXplKSB7CisgICAgaWYgKGRhdGFfc2l6ZSA+IEZpeGVkU2l6ZSkgeworICAgICAgbV9wR3Jvd0RhdGEucmVzZXQoRlhfQWxsb2MoRGF0YVR5cGUsIGRhdGFfc2l6ZSkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtZW1zZXQobV9GaXhlZERhdGEsIDAsIHNpemVvZihEYXRhVHlwZSkgKiBGaXhlZFNpemUpOworICB9CisgIG9wZXJhdG9yIERhdGFUeXBlKigpIHsgcmV0dXJuIG1fcEdyb3dEYXRhID8gbV9wR3Jvd0RhdGEuZ2V0KCkgOiBtX0ZpeGVkRGF0YTsgfQorCisgcHJpdmF0ZToKKyAgRGF0YVR5cGUgbV9GaXhlZERhdGFbRml4ZWRTaXplXTsKKyAgc3RkOjp1bmlxdWVfcHRyPERhdGFUeXBlLCBGeEZyZWVEZWxldGVyPiBtX3BHcm93RGF0YTsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWENSVF9DRlhfRklYRURCVUZHUk9XX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2NmeF9tYXliZV9vd25lZC5oIGIvY29yZS9meGNydC9jZnhfbWF5YmVfb3duZWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJiMWMxYy4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Y3J0L2NmeF9tYXliZV9vd25lZC5oCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIENPUkVfRlhDUlRfQ0ZYX01BWUJFX09XTkVEX0hfCi0jZGVmaW5lIENPUkVfRlhDUlRfQ0ZYX01BWUJFX09XTkVEX0hfCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0KLS8vIEEgdGVtcGxhdGUgdGhhdCBjYW4gaG9sZCBlaXRoZXIgb3duZWQgb3IgdW5vd25lZCByZWZlcmVuY2VzLCBhbmQgY2xlYW5zIHVwCi0vLyBhcHByb3ByaWF0ZWx5LiAgUG9zc2libHkgdGhlIG1vc3QgcGVybmljaW91cyBhbnRpLXBhdHRlcm4gaW1hZ2luYWJsZSwgYnV0Ci0vLyBpdCBjcm9wcyB1cCB0aHJvdWdob3V0IHRoZSBjb2RlYmFzZSBkdWUgdG8gYSBkZXNpcmUgdG8gYXZvaWQgY29weWluZy1pbgotLy8gb2JqZWN0cyBvciBkYXRhLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEQgPSBzdGQ6OmRlZmF1bHRfZGVsZXRlPFQ+PgotY2xhc3MgQ0ZYX01heWJlT3duZWQgewotIHB1YmxpYzoKLSAgQ0ZYX01heWJlT3duZWQoKSA6IG1fcE9iaihudWxscHRyKSB7fQotICBleHBsaWNpdCBDRlhfTWF5YmVPd25lZChUKiBwdHIpIDogbV9wT2JqKHB0cikge30KLSAgZXhwbGljaXQgQ0ZYX01heWJlT3duZWQoc3RkOjp1bmlxdWVfcHRyPFQsIEQ+IHB0cikKLSAgICAgIDogbV9wT3duZWRPYmooc3RkOjptb3ZlKHB0cikpLCBtX3BPYmoobV9wT3duZWRPYmouZ2V0KCkpIHt9Ci0KLSAgQ0ZYX01heWJlT3duZWQoY29uc3QgQ0ZYX01heWJlT3duZWQmIHRoYXQpID0gZGVsZXRlOwotICBDRlhfTWF5YmVPd25lZChDRlhfTWF5YmVPd25lZCYmIHRoYXQpCi0gICAgICA6IG1fcE93bmVkT2JqKHRoYXQubV9wT3duZWRPYmoucmVsZWFzZSgpKSwgbV9wT2JqKHRoYXQubV9wT2JqKSB7Ci0gICAgdGhhdC5tX3BPYmogPSBudWxscHRyOwotICB9Ci0KLSAgdm9pZCBSZXNldChzdGQ6OnVuaXF1ZV9wdHI8VCwgRD4gcHRyKSB7Ci0gICAgbV9wT3duZWRPYmogPSBzdGQ6Om1vdmUocHRyKTsKLSAgICBtX3BPYmogPSBtX3BPd25lZE9iai5nZXQoKTsKLSAgfQotICB2b2lkIFJlc2V0KFQqIHB0ciA9IG51bGxwdHIpIHsKLSAgICBtX3BPd25lZE9iai5yZXNldCgpOwotICAgIG1fcE9iaiA9IHB0cjsKLSAgfQotCi0gIGJvb2wgSXNPd25lZCgpIGNvbnN0IHsgcmV0dXJuICEhbV9wT3duZWRPYmo7IH0KLSAgVCogR2V0KCkgY29uc3QgeyByZXR1cm4gbV9wT2JqOyB9Ci0gIHN0ZDo6dW5pcXVlX3B0cjxULCBEPiBSZWxlYXNlKCkgewotICAgIEFTU0VSVChJc093bmVkKCkpOwotICAgIHJldHVybiBzdGQ6Om1vdmUobV9wT3duZWRPYmopOwotICB9Ci0KLSAgQ0ZYX01heWJlT3duZWQmIG9wZXJhdG9yPShjb25zdCBDRlhfTWF5YmVPd25lZCYgdGhhdCkgPSBkZWxldGU7Ci0gIENGWF9NYXliZU93bmVkJiBvcGVyYXRvcj0oQ0ZYX01heWJlT3duZWQmJiB0aGF0KSB7Ci0gICAgbV9wT3duZWRPYmogPSBzdGQ6Om1vdmUodGhhdC5tX3BPd25lZE9iaik7Ci0gICAgbV9wT2JqID0gdGhhdC5tX3BPYmo7Ci0gICAgdGhhdC5tX3BPYmogPSBudWxscHRyOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBDRlhfTWF5YmVPd25lZCYgb3BlcmF0b3I9KFQqIHB0cikgewotICAgIFJlc2V0KHB0cik7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIENGWF9NYXliZU93bmVkJiBvcGVyYXRvcj0oc3RkOjp1bmlxdWVfcHRyPFQsIEQ+IHB0cikgewotICAgIFJlc2V0KHN0ZDo6bW92ZShwdHIpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ0ZYX01heWJlT3duZWQmIHRoYXQpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0KCkgPT0gdGhhdC5HZXQoKTsKLSAgfQotICBib29sIG9wZXJhdG9yPT0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFQsIEQ+JiBwdHIpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0KCkgPT0gcHRyLmdldCgpOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I9PShUKiBwdHIpIGNvbnN0IHsgcmV0dXJuIEdldCgpID09IHB0cjsgfQotCi0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDRlhfTWF5YmVPd25lZCYgdGhhdCkgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSB0aGF0KTsgfQotICBib29sIG9wZXJhdG9yIT0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFQsIEQ+IHB0cikgY29uc3QgewotICAgIHJldHVybiAhKCp0aGlzID09IHB0cik7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvciE9KFQqIHB0cikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBwdHIpOyB9Ci0KLSAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuICEhbV9wT2JqOyB9Ci0gIFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICptX3BPYmo7IH0KLSAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIG1fcE9iajsgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjp1bmlxdWVfcHRyPFQsIEQ+IG1fcE93bmVkT2JqOwotICBUKiBtX3BPYmo7Ci19OwotCi0jZW5kaWYgIC8vIENPUkVfRlhDUlRfQ0ZYX01BWUJFX09XTkVEX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2NmeF9tYXliZV9vd25lZF91bml0dGVzdC5jcHAgYi9jb3JlL2Z4Y3J0L2NmeF9tYXliZV9vd25lZF91bml0dGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNTEzYTMuLjAwMDAwMDAKLS0tIGEvY29yZS9meGNydC9jZnhfbWF5YmVfb3duZWRfdW5pdHRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X21heWJlX293bmVkLmgiCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCi0jaW5jbHVkZSAidGVzdGluZy9meF9zdHJpbmdfdGVzdGhlbHBlcnMuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIFBzZXVkb0RlbGV0YWJsZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBQc2V1ZG9EZWxldGFibGUoaW50IGlkLCBpbnQqIGNvdW50X2xvY2F0aW9uKQotICAgICAgOiBpZF8oaWQpLCBjb3VudF9sb2NhdGlvbl8oY291bnRfbG9jYXRpb24pIHt9Ci0gIH5Qc2V1ZG9EZWxldGFibGUoKSB7ICsrKCpjb3VudF9sb2NhdGlvbl8pOyB9Ci0gIGludCBHZXRJRCgpIGNvbnN0IHsgcmV0dXJuIGlkXzsgfQotCi0gcHJpdmF0ZToKLSAgaW50IGlkXzsKLSAgaW50KiBjb3VudF9sb2NhdGlvbl87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotVEVTVChmeGNydCwgTWF5YmVPd25lZE51bGwpIHsKLSAgQ0ZYX01heWJlT3duZWQ8UHNldWRvRGVsZXRhYmxlPiBwdHIxOwotICBFWFBFQ1RfRkFMU0UocHRyMS5Jc093bmVkKCkpOwotICBFWFBFQ1RfRkFMU0UocHRyMSk7Ci0gIEVYUEVDVF9FUShudWxscHRyLCBwdHIxLkdldCgpKTsKLQotICBDRlhfTWF5YmVPd25lZDxQc2V1ZG9EZWxldGFibGU+IHB0cjI7Ci0gIEVYUEVDVF9UUlVFKHB0cjEgPT0gcHRyMik7Ci0gIEVYUEVDVF9GQUxTRShwdHIxICE9IHB0cjIpOwotfQotCi1URVNUKGZ4Y3J0LCBNYXliZU93bmVkTm90T3duZWQpIHsKLSAgaW50IGRlbGV0ZV9jb3VudCA9IDA7Ci0gIFBzZXVkb0RlbGV0YWJsZSB0aGluZzEoMTAwLCAmZGVsZXRlX2NvdW50KTsKLSAgewotICAgIENGWF9NYXliZU93bmVkPFBzZXVkb0RlbGV0YWJsZT4gcHRyKCZ0aGluZzEpOwotICAgIEVYUEVDVF9GQUxTRShwdHIuSXNPd25lZCgpKTsKLSAgICBFWFBFQ1RfRVEocHRyLkdldCgpLCAmdGhpbmcxKTsKLSAgICBFWFBFQ1RfRVEoMTAwLCBwdHItPkdldElEKCkpOwotICAgIEVYUEVDVF9UUlVFKHB0ciA9PSAmdGhpbmcxKTsKLSAgICBFWFBFQ1RfRkFMU0UocHRyICE9ICZ0aGluZzEpOwotCi0gICAgQ0ZYX01heWJlT3duZWQ8UHNldWRvRGVsZXRhYmxlPiBlbXB0eTsKLSAgICBFWFBFQ1RfRkFMU0UocHRyID09IGVtcHR5KTsKLSAgICBFWFBFQ1RfVFJVRShwdHIgIT0gZW1wdHkpOwotICB9Ci0gIEVYUEVDVF9FUSgwLCBkZWxldGVfY291bnQpOwotCi0gIGRlbGV0ZV9jb3VudCA9IDA7Ci0gIFBzZXVkb0RlbGV0YWJsZSB0aGluZzIoMjAwLCAmZGVsZXRlX2NvdW50KTsKLSAgewotICAgIENGWF9NYXliZU93bmVkPFBzZXVkb0RlbGV0YWJsZT4gcHRyKCZ0aGluZzEpOwotICAgIHB0ciA9ICZ0aGluZzI7Ci0gICAgRVhQRUNUX0ZBTFNFKHB0ci5Jc093bmVkKCkpOwotICAgIEVYUEVDVF9FUShwdHIuR2V0KCksICZ0aGluZzIpOwotICAgIEVYUEVDVF9FUSgyMDAsIHB0ci0+R2V0SUQoKSk7Ci0gIH0KLSAgRVhQRUNUX0VRKDAsIGRlbGV0ZV9jb3VudCk7Ci0KLSAgZGVsZXRlX2NvdW50ID0gMDsKLSAgaW50IG93bmVkX2RlbGV0ZV9jb3VudCA9IDA7Ci0gIHsKLSAgICBDRlhfTWF5YmVPd25lZDxQc2V1ZG9EZWxldGFibGU+IHB0cigmdGhpbmcxKTsKLSAgICBFWFBFQ1RfRVEoMTAwLCBwdHItPkdldElEKCkpOwotICAgIHB0ciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxQc2V1ZG9EZWxldGFibGU+KDMwMCwgJm93bmVkX2RlbGV0ZV9jb3VudCk7Ci0gICAgRVhQRUNUX1RSVUUocHRyLklzT3duZWQoKSk7Ci0gICAgRVhQRUNUX0VRKDMwMCwgcHRyLT5HZXRJRCgpKTsKLSAgfQotICBFWFBFQ1RfRVEoMCwgZGVsZXRlX2NvdW50KTsKLSAgRVhQRUNUX0VRKDEsIG93bmVkX2RlbGV0ZV9jb3VudCk7Ci19Ci0KLVRFU1QoZnhjcnQsIE1heWJlT3duZWRPd25lZCkgewotICBpbnQgZGVsZXRlX2NvdW50ID0gMDsKLSAgewotICAgIENGWF9NYXliZU93bmVkPFBzZXVkb0RlbGV0YWJsZT4gcHRyKAotICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8UHNldWRvRGVsZXRhYmxlPigxMDAsICZkZWxldGVfY291bnQpKTsKLSAgICBFWFBFQ1RfVFJVRShwdHIuSXNPd25lZCgpKTsKLSAgICBFWFBFQ1RfRVEoMTAwLCBwdHItPkdldElEKCkpOwotCi0gICAgQ0ZYX01heWJlT3duZWQ8UHNldWRvRGVsZXRhYmxlPiBlbXB0eTsKLSAgICBFWFBFQ1RfRkFMU0UocHRyID09IGVtcHR5KTsKLSAgICBFWFBFQ1RfVFJVRShwdHIgIT0gZW1wdHkpOwotICB9Ci0gIEVYUEVDVF9FUSgxLCBkZWxldGVfY291bnQpOwotCi0gIGRlbGV0ZV9jb3VudCA9IDA7Ci0gIHsKLSAgICBDRlhfTWF5YmVPd25lZDxQc2V1ZG9EZWxldGFibGU+IHB0cigKLSAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPFBzZXVkb0RlbGV0YWJsZT4oMjAwLCAmZGVsZXRlX2NvdW50KSk7Ci0gICAgcHRyID0gcGRmaXVtOjpNYWtlVW5pcXVlPFBzZXVkb0RlbGV0YWJsZT4oMzAwLCAmZGVsZXRlX2NvdW50KTsKLSAgICBFWFBFQ1RfVFJVRShwdHIuSXNPd25lZCgpKTsKLSAgICBFWFBFQ1RfRVEoMzAwLCBwdHItPkdldElEKCkpOwotICAgIEVYUEVDVF9FUSgxLCBkZWxldGVfY291bnQpOwotICB9Ci0gIEVYUEVDVF9FUSgyLCBkZWxldGVfY291bnQpOwotCi0gIGRlbGV0ZV9jb3VudCA9IDA7Ci0gIGludCB1bm93bmVkX2RlbGV0ZV9jb3VudCA9IDA7Ci0gIFBzZXVkb0RlbGV0YWJsZSB0aGluZzIoNDAwLCAmdW5vd25lZF9kZWxldGVfY291bnQpOwotICB7Ci0gICAgQ0ZYX01heWJlT3duZWQ8UHNldWRvRGVsZXRhYmxlPiBwdHIoCi0gICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxQc2V1ZG9EZWxldGFibGU+KDUwMCwgJmRlbGV0ZV9jb3VudCkpOwotICAgIHB0ciA9ICZ0aGluZzI7Ci0gICAgRVhQRUNUX0ZBTFNFKHB0ci5Jc093bmVkKCkpOwotICAgIEVYUEVDVF9FUSg0MDAsIHB0ci0+R2V0SUQoKSk7Ci0gICAgRVhQRUNUX0VRKDEsIGRlbGV0ZV9jb3VudCk7Ci0gICAgRVhQRUNUX0VRKDAsIHVub3duZWRfZGVsZXRlX2NvdW50KTsKLSAgfQotICBFWFBFQ1RfRVEoMSwgZGVsZXRlX2NvdW50KTsKLSAgRVhQRUNUX0VRKDAsIHVub3duZWRfZGVsZXRlX2NvdW50KTsKLX0KLQotVEVTVChmeGNydCwgTWF5YmVPd25lZFJlbGVhc2UpIHsKLSAgaW50IGRlbGV0ZV9jb3VudCA9IDA7Ci0gIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8UHNldWRvRGVsZXRhYmxlPiBzdG9sZW47Ci0gICAgewotICAgICAgQ0ZYX01heWJlT3duZWQ8UHNldWRvRGVsZXRhYmxlPiBwdHIoCi0gICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPFBzZXVkb0RlbGV0YWJsZT4oMTAwLCAmZGVsZXRlX2NvdW50KSk7Ci0gICAgICBFWFBFQ1RfVFJVRShwdHIuSXNPd25lZCgpKTsKLSAgICAgIHN0b2xlbiA9IHB0ci5SZWxlYXNlKCk7Ci0gICAgICBFWFBFQ1RfRkFMU0UocHRyLklzT3duZWQoKSk7Ci0gICAgICBFWFBFQ1RfRVEocHRyLCBzdG9sZW4pOwotICAgICAgRVhQRUNUX0VRKDAsIGRlbGV0ZV9jb3VudCk7Ci0gICAgfQotICAgIEVYUEVDVF9FUSgwLCBkZWxldGVfY291bnQpOwotICB9Ci0gIEVYUEVDVF9FUSgxLCBkZWxldGVfY291bnQpOwotfQotCi1URVNUKGZ4Y3J0LCBNYXliZU93bmVkTW92ZSkgewotICBpbnQgZGVsZXRlX2NvdW50ID0gMDsKLSAgUHNldWRvRGVsZXRhYmxlIHRoaW5nMSgxMDAsICZkZWxldGVfY291bnQpOwotICB7Ci0gICAgQ0ZYX01heWJlT3duZWQ8UHNldWRvRGVsZXRhYmxlPiBwdHIxKCZ0aGluZzEpOwotICAgIENGWF9NYXliZU93bmVkPFBzZXVkb0RlbGV0YWJsZT4gcHRyMigKLSAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPFBzZXVkb0RlbGV0YWJsZT4oMjAwLCAmZGVsZXRlX2NvdW50KSk7Ci0gICAgRVhQRUNUX0ZBTFNFKHB0cjEuSXNPd25lZCgpKTsKLSAgICBFWFBFQ1RfVFJVRShwdHIyLklzT3duZWQoKSk7Ci0KLSAgICBDRlhfTWF5YmVPd25lZDxQc2V1ZG9EZWxldGFibGU+IHB0cjMoc3RkOjptb3ZlKHB0cjEpKTsKLSAgICBDRlhfTWF5YmVPd25lZDxQc2V1ZG9EZWxldGFibGU+IHB0cjQoc3RkOjptb3ZlKHB0cjIpKTsKLSAgICBFWFBFQ1RfRkFMU0UocHRyMS5Jc093bmVkKCkpOwotICAgIEVYUEVDVF9GQUxTRShwdHIyLklzT3duZWQoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKHB0cjMuSXNPd25lZCgpKTsKLSAgICBFWFBFQ1RfVFJVRShwdHI0LklzT3duZWQoKSk7Ci0gICAgRVhQRUNUX0VRKDAsIGRlbGV0ZV9jb3VudCk7Ci0gICAgRVhQRUNUX0VRKG51bGxwdHIsIHB0cjEuR2V0KCkpOwotICAgIEVYUEVDVF9FUShudWxscHRyLCBwdHIyLkdldCgpKTsKLSAgICBFWFBFQ1RfRVEoMTAwLCBwdHIzLT5HZXRJRCgpKTsKLSAgICBFWFBFQ1RfRVEoMjAwLCBwdHI0LT5HZXRJRCgpKTsKLQotICAgIENGWF9NYXliZU93bmVkPFBzZXVkb0RlbGV0YWJsZT4gcHRyNTsKLSAgICBDRlhfTWF5YmVPd25lZDxQc2V1ZG9EZWxldGFibGU+IHB0cjY7Ci0gICAgcHRyNSA9IHN0ZDo6bW92ZShwdHIzKTsKLSAgICBwdHI2ID0gc3RkOjptb3ZlKHB0cjQpOwotICAgIEVYUEVDVF9GQUxTRShwdHIzLklzT3duZWQoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKHB0cjQuSXNPd25lZCgpKTsKLSAgICBFWFBFQ1RfRkFMU0UocHRyNS5Jc093bmVkKCkpOwotICAgIEVYUEVDVF9UUlVFKHB0cjYuSXNPd25lZCgpKTsKLSAgICBFWFBFQ1RfRVEoMCwgZGVsZXRlX2NvdW50KTsKLSAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcHRyMy5HZXQoKSk7Ci0gICAgRVhQRUNUX0VRKG51bGxwdHIsIHB0cjQuR2V0KCkpOwotICAgIEVYUEVDVF9FUSgxMDAsIHB0cjUtPkdldElEKCkpOwotICAgIEVYUEVDVF9FUSgyMDAsIHB0cjYtPkdldElEKCkpOwotICB9Ci0gIEVYUEVDVF9FUSgxLCBkZWxldGVfY291bnQpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jZnhfbWVtb3J5c3RyZWFtLmNwcCBiL2NvcmUvZnhjcnQvY2Z4X21lbW9yeXN0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ1YjM4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY2Z4X21lbW9yeXN0cmVhbS5jcHAKQEAgLTAsMCArMSwxOTkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X21lbW9yeXN0cmVhbS5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IGludDMyX3Qga0Jsb2NrU2l6ZSA9IDY0ICogMTAyNDsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NGWF9NZW1vcnlTdHJlYW06OkNGWF9NZW1vcnlTdHJlYW0oYm9vbCBiQ29uc2VjdXRpdmUpCisgICAgOiBtX25Ub3RhbFNpemUoMCksCisgICAgICBtX25DdXJTaXplKDApLAorICAgICAgbV9uQ3VyUG9zKDApLAorICAgICAgbV9uR3Jvd1NpemUoa0Jsb2NrU2l6ZSksCisgICAgICBtX2R3RmxhZ3MoVHlwZTo6a1Rha2VPdmVyIHwgKGJDb25zZWN1dGl2ZSA/IFR5cGU6OmtDb25zZWN1dGl2ZSA6IDApKSB7fQorCitDRlhfTWVtb3J5U3RyZWFtOjpDRlhfTWVtb3J5U3RyZWFtKHVpbnQ4X3QqIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVGFrZU92ZXIpCisgICAgOiBtX25Ub3RhbFNpemUoblNpemUpLAorICAgICAgbV9uQ3VyU2l6ZShuU2l6ZSksCisgICAgICBtX25DdXJQb3MoMCksCisgICAgICBtX25Hcm93U2l6ZShrQmxvY2tTaXplKSwKKyAgICAgIG1fZHdGbGFncyhUeXBlOjprQ29uc2VjdXRpdmUgfCAoYlRha2VPdmVyID8gVHlwZTo6a1Rha2VPdmVyIDogMCkpIHsKKyAgbV9CbG9ja3MucHVzaF9iYWNrKHBCdWZmZXIpOworfQorCitDRlhfTWVtb3J5U3RyZWFtOjp+Q0ZYX01lbW9yeVN0cmVhbSgpIHsKKyAgaWYgKG1fZHdGbGFncyAmIFR5cGU6OmtUYWtlT3ZlcikgeworICAgIGZvciAodWludDhfdCogcEJsb2NrIDogbV9CbG9ja3MpCisgICAgICBGWF9GcmVlKHBCbG9jayk7CisgIH0KK30KKworRlhfRklMRVNJWkUgQ0ZYX01lbW9yeVN0cmVhbTo6R2V0U2l6ZSgpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX25DdXJTaXplKTsKK30KKworYm9vbCBDRlhfTWVtb3J5U3RyZWFtOjpJc0VPRigpIHsKKyAgcmV0dXJuIG1fbkN1clBvcyA+PSBzdGF0aWNfY2FzdDxzaXplX3Q+KEdldFNpemUoKSk7Cit9CisKK0ZYX0ZJTEVTSVpFIENGWF9NZW1vcnlTdHJlYW06OkdldFBvc2l0aW9uKCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8RlhfRklMRVNJWkU+KG1fbkN1clBvcyk7Cit9CisKK2Jvb2wgQ0ZYX01lbW9yeVN0cmVhbTo6Rmx1c2goKSB7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENGWF9NZW1vcnlTdHJlYW06OlJlYWRCbG9jayh2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgeworICBpZiAoIWJ1ZmZlciB8fCAhc2l6ZSB8fCBvZmZzZXQgPCAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBGWF9TQUZFX1NJWkVfVCBuZXdQb3MgPSBzaXplOworICBuZXdQb3MgKz0gb2Zmc2V0OworICBpZiAoIW5ld1Bvcy5Jc1ZhbGlkKCkgfHwgbmV3UG9zLlZhbHVlT3JEZWZhdWx0KDApID09IDAgfHwKKyAgICAgIG5ld1Bvcy5WYWx1ZU9yRGllKCkgPiBtX25DdXJTaXplKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgbV9uQ3VyUG9zID0gbmV3UG9zLlZhbHVlT3JEaWUoKTsKKyAgaWYgKG1fZHdGbGFncyAmIFR5cGU6OmtDb25zZWN1dGl2ZSkgeworICAgIG1lbWNweShidWZmZXIsIG1fQmxvY2tzWzBdICsgc3RhdGljX2Nhc3Q8c2l6ZV90PihvZmZzZXQpLCBzaXplKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHNpemVfdCBuU3RhcnRCbG9jayA9IHN0YXRpY19jYXN0PHNpemVfdD4ob2Zmc2V0KSAvIG1fbkdyb3dTaXplOworICBvZmZzZXQgLT0gc3RhdGljX2Nhc3Q8RlhfRklMRVNJWkU+KG5TdGFydEJsb2NrICogbV9uR3Jvd1NpemUpOworICB3aGlsZSAoc2l6ZSkgeworICAgIHNpemVfdCBuUmVhZCA9IHN0ZDo6bWluKHNpemUsIG1fbkdyb3dTaXplIC0gc3RhdGljX2Nhc3Q8c2l6ZV90PihvZmZzZXQpKTsKKyAgICBtZW1jcHkoYnVmZmVyLCBtX0Jsb2Nrc1tuU3RhcnRCbG9ja10gKyBvZmZzZXQsIG5SZWFkKTsKKyAgICBidWZmZXIgPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSArIG5SZWFkOworICAgIHNpemUgLT0gblJlYWQ7CisgICAgKytuU3RhcnRCbG9jazsKKyAgICBvZmZzZXQgPSAwOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzaXplX3QgQ0ZYX01lbW9yeVN0cmVhbTo6UmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKG1fbkN1clBvcyA+PSBtX25DdXJTaXplKQorICAgIHJldHVybiAwOworCisgIHNpemVfdCBuUmVhZCA9IHN0ZDo6bWluKHNpemUsIG1fbkN1clNpemUgLSBtX25DdXJQb3MpOworICBpZiAoIVJlYWRCbG9jayhidWZmZXIsIHN0YXRpY19jYXN0PGludDMyX3Q+KG1fbkN1clBvcyksIG5SZWFkKSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gblJlYWQ7Cit9CisKK2Jvb2wgQ0ZYX01lbW9yeVN0cmVhbTo6V3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7CisgIGlmICghYnVmZmVyIHx8ICFzaXplKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAobV9kd0ZsYWdzICYgVHlwZTo6a0NvbnNlY3V0aXZlKSB7CisgICAgRlhfU0FGRV9TSVpFX1QgbmV3UG9zID0gc2l6ZTsKKyAgICBuZXdQb3MgKz0gb2Zmc2V0OworICAgIGlmICghbmV3UG9zLklzVmFsaWQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIG1fbkN1clBvcyA9IG5ld1Bvcy5WYWx1ZU9yRGllKCk7CisgICAgaWYgKG1fbkN1clBvcyA+IG1fblRvdGFsU2l6ZSkgeworICAgICAgbV9uVG90YWxTaXplID0gKG1fbkN1clBvcyArIG1fbkdyb3dTaXplIC0gMSkgLyBtX25Hcm93U2l6ZSAqIG1fbkdyb3dTaXplOworICAgICAgaWYgKG1fQmxvY2tzLmVtcHR5KCkpCisgICAgICAgIG1fQmxvY2tzLnB1c2hfYmFjayhGWF9BbGxvYyh1aW50OF90LCBtX25Ub3RhbFNpemUpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgbV9CbG9ja3NbMF0gPSBGWF9SZWFsbG9jKHVpbnQ4X3QsIG1fQmxvY2tzWzBdLCBtX25Ub3RhbFNpemUpOworICAgIH0KKworICAgIG1lbWNweShtX0Jsb2Nrc1swXSArIG9mZnNldCwgYnVmZmVyLCBzaXplKTsKKyAgICBtX25DdXJTaXplID0gc3RkOjptYXgobV9uQ3VyU2l6ZSwgbV9uQ3VyUG9zKTsKKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgRlhfU0FGRV9TSVpFX1QgbmV3UG9zID0gc2l6ZTsKKyAgbmV3UG9zICs9IG9mZnNldDsKKyAgaWYgKCFuZXdQb3MuSXNWYWxpZCgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFFeHBhbmRCbG9ja3MobmV3UG9zLlZhbHVlT3JEaWUoKSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG1fbkN1clBvcyA9IG5ld1Bvcy5WYWx1ZU9yRGllKCk7CisgIHNpemVfdCBuU3RhcnRCbG9jayA9IHN0YXRpY19jYXN0PHNpemVfdD4ob2Zmc2V0KSAvIG1fbkdyb3dTaXplOworICBvZmZzZXQgLT0gc3RhdGljX2Nhc3Q8RlhfRklMRVNJWkU+KG5TdGFydEJsb2NrICogbV9uR3Jvd1NpemUpOworICB3aGlsZSAoc2l6ZSkgeworICAgIHNpemVfdCBuV3JpdGUgPSBzdGQ6Om1pbihzaXplLCBtX25Hcm93U2l6ZSAtIHN0YXRpY19jYXN0PHNpemVfdD4ob2Zmc2V0KSk7CisgICAgbWVtY3B5KG1fQmxvY2tzW25TdGFydEJsb2NrXSArIG9mZnNldCwgYnVmZmVyLCBuV3JpdGUpOworICAgIGJ1ZmZlciA9IHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIpICsgbldyaXRlOworICAgIHNpemUgLT0gbldyaXRlOworICAgICsrblN0YXJ0QmxvY2s7CisgICAgb2Zmc2V0ID0gMDsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDRlhfTWVtb3J5U3RyZWFtOjpFc3RpbWF0ZVNpemUoc2l6ZV90IG5Jbml0U2l6ZSwgc2l6ZV90IG5Hcm93U2l6ZSkgeworICBpZiAobV9kd0ZsYWdzICYgVHlwZTo6a0NvbnNlY3V0aXZlKSB7CisgICAgaWYgKG1fQmxvY2tzLmVtcHR5KCkpIHsKKyAgICAgIG1fQmxvY2tzLnB1c2hfYmFjaygKKyAgICAgICAgICBGWF9BbGxvYyh1aW50OF90LCBzdGQ6Om1heChuSW5pdFNpemUsIHN0YXRpY19jYXN0PHNpemVfdD4oNDA5NikpKSk7CisgICAgfQorICAgIG1fbkdyb3dTaXplID0gc3RkOjptYXgobkdyb3dTaXplLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDQwOTYpKTsKKyAgfSBlbHNlIGlmIChtX0Jsb2Nrcy5lbXB0eSgpKSB7CisgICAgbV9uR3Jvd1NpemUgPSBzdGQ6Om1heChuR3Jvd1NpemUsIHN0YXRpY19jYXN0PHNpemVfdD4oNDA5NikpOworICB9Cit9CisKK3ZvaWQgQ0ZYX01lbW9yeVN0cmVhbTo6QXR0YWNoQnVmZmVyKHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBuU2l6ZSkgeworICBpZiAoIShtX2R3RmxhZ3MgJiBUeXBlOjprQ29uc2VjdXRpdmUpKQorICAgIHJldHVybjsKKworICBtX0Jsb2Nrcy5jbGVhcigpOworICBtX0Jsb2Nrcy5wdXNoX2JhY2socEJ1ZmZlcik7CisgIG1fblRvdGFsU2l6ZSA9IG5TaXplOworICBtX25DdXJTaXplID0gblNpemU7CisgIG1fbkN1clBvcyA9IDA7CisgIG1fZHdGbGFncyA9IFR5cGU6OmtDb25zZWN1dGl2ZTsKK30KKwordm9pZCBDRlhfTWVtb3J5U3RyZWFtOjpEZXRhY2hCdWZmZXIoKSB7CisgIGlmICghKG1fZHdGbGFncyAmIFR5cGU6OmtDb25zZWN1dGl2ZSkpCisgICAgcmV0dXJuOworCisgIG1fQmxvY2tzLmNsZWFyKCk7CisgIG1fblRvdGFsU2l6ZSA9IDA7CisgIG1fbkN1clNpemUgPSAwOworICBtX25DdXJQb3MgPSAwOworICBtX2R3RmxhZ3MgPSBUeXBlOjprVGFrZU92ZXI7Cit9CisKK2Jvb2wgQ0ZYX01lbW9yeVN0cmVhbTo6RXhwYW5kQmxvY2tzKHNpemVfdCBzaXplKSB7CisgIG1fbkN1clNpemUgPSBzdGQ6Om1heChtX25DdXJTaXplLCBzaXplKTsKKyAgaWYgKHNpemUgPD0gbV9uVG90YWxTaXplKQorICAgIHJldHVybiB0cnVlOworCisgIHNpemUgPSAoc2l6ZSAtIG1fblRvdGFsU2l6ZSArIG1fbkdyb3dTaXplIC0gMSkgLyBtX25Hcm93U2l6ZTsKKyAgc2l6ZV90IGlDb3VudCA9IG1fQmxvY2tzLnNpemUoKTsKKyAgbV9CbG9ja3MucmVzaXplKGlDb3VudCArIHNpemUpOworICB3aGlsZSAoc2l6ZS0tKSB7CisgICAgbV9CbG9ja3NbaUNvdW50KytdID0gRlhfQWxsb2ModWludDhfdCwgbV9uR3Jvd1NpemUpOworICAgIG1fblRvdGFsU2l6ZSArPSBtX25Hcm93U2l6ZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY2Z4X21lbW9yeXN0cmVhbS5oIGIvY29yZS9meGNydC9jZnhfbWVtb3J5c3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY2NjA4MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY2Z4X21lbW9yeXN0cmVhbS5oCkBAIC0wLDAgKzEsNTYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX0NGWF9NRU1PUllTVFJFQU1fSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9DRlhfTUVNT1JZU1RSRUFNX0hfCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmVhbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgorCitjbGFzcyBDRlhfTWVtb3J5U3RyZWFtIDogcHVibGljIElGWF9TZWVrYWJsZVN0cmVhbSB7CisgcHVibGljOgorICBlbnVtIFR5cGUgeyBrQ29uc2VjdXRpdmUgPSAxIDw8IDAsIGtUYWtlT3ZlciA9IDEgPDwgMSB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgorICBmcmllbmQgUmV0YWluUHRyPFQ+IHBkZml1bTo6TWFrZVJldGFpbihBcmdzJiYuLi4gYXJncyk7CisKKyAgLy8gSUZYX1NlZWthYmxlU3RyZWFtCisgIEZYX0ZJTEVTSVpFIEdldFNpemUoKSBvdmVycmlkZTsKKyAgRlhfRklMRVNJWkUgR2V0UG9zaXRpb24oKSBvdmVycmlkZTsKKyAgYm9vbCBJc0VPRigpIG92ZXJyaWRlOworICBib29sIFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICBzaXplX3QgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICBib29sIFdyaXRlQmxvY2soY29uc3Qgdm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKyAgYm9vbCBGbHVzaCgpIG92ZXJyaWRlOworCisgIGJvb2wgSXNDb25zZWN1dGl2ZSgpIGNvbnN0IHsgcmV0dXJuICEhKG1fZHdGbGFncyAmIFR5cGU6OmtDb25zZWN1dGl2ZSk7IH0KKworICB1aW50OF90KiBHZXRCdWZmZXIoKSBjb25zdCB7CisgICAgcmV0dXJuICFtX0Jsb2Nrcy5lbXB0eSgpID8gbV9CbG9ja3MuZnJvbnQoKSA6IG51bGxwdHI7CisgIH0KKworICB2b2lkIEVzdGltYXRlU2l6ZShzaXplX3QgbkluaXRTaXplLCBzaXplX3Qgbkdyb3dTaXplKTsKKyAgdm9pZCBBdHRhY2hCdWZmZXIodWludDhfdCogcEJ1ZmZlciwgc2l6ZV90IG5TaXplKTsKKyAgdm9pZCBEZXRhY2hCdWZmZXIoKTsKKworIHByaXZhdGU6CisgIGV4cGxpY2l0IENGWF9NZW1vcnlTdHJlYW0oYm9vbCBiQ29uc2VjdXRpdmUpOworICBDRlhfTWVtb3J5U3RyZWFtKHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBuU2l6ZSwgYm9vbCBiVGFrZU92ZXIpOworICB+Q0ZYX01lbW9yeVN0cmVhbSgpIG92ZXJyaWRlOworCisgIGJvb2wgRXhwYW5kQmxvY2tzKHNpemVfdCBzaXplKTsKKworICBzdGQ6OnZlY3Rvcjx1aW50OF90Kj4gbV9CbG9ja3M7CisgIHNpemVfdCBtX25Ub3RhbFNpemU7CisgIHNpemVfdCBtX25DdXJTaXplOworICBzaXplX3QgbV9uQ3VyUG9zOworICBzaXplX3QgbV9uR3Jvd1NpemU7CisgIHVpbnQzMl90IG1fZHdGbGFnczsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWENSVF9DRlhfTUVNT1JZU1RSRUFNX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2NmeF9vYnNlcnZhYmxlLmggYi9jb3JlL2Z4Y3J0L2NmeF9vYnNlcnZhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYzA5MDcuLjAwMDAwMDAKLS0tIGEvY29yZS9meGNydC9jZnhfb2JzZXJ2YWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaWZuZGVmIENPUkVfRlhDUlRfQ0ZYX09CU0VSVkFCTEVfSF8KLSNkZWZpbmUgQ09SRV9GWENSVF9DRlhfT0JTRVJWQUJMRV9IXwotCi0jaW5jbHVkZSA8c2V0PgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCi0KLXRlbXBsYXRlIDxjbGFzcyBUPgotY2xhc3MgQ0ZYX09ic2VydmFibGUgewotIHB1YmxpYzoKLSAgY2xhc3MgT2JzZXJ2ZWRQdHIgewotICAgcHVibGljOgotICAgIE9ic2VydmVkUHRyKCkgOiBtX3BPYnNlcnZhYmxlKG51bGxwdHIpIHt9Ci0gICAgZXhwbGljaXQgT2JzZXJ2ZWRQdHIoVCogcE9ic2VydmFibGUpIDogbV9wT2JzZXJ2YWJsZShwT2JzZXJ2YWJsZSkgewotICAgICAgaWYgKG1fcE9ic2VydmFibGUpCi0gICAgICAgIG1fcE9ic2VydmFibGUtPkFkZE9ic2VydmVkUHRyKHRoaXMpOwotICAgIH0KLSAgICBPYnNlcnZlZFB0cihjb25zdCBPYnNlcnZlZFB0ciYgdGhhdCkgOiBPYnNlcnZlZFB0cih0aGF0LkdldCgpKSB7fQotICAgIH5PYnNlcnZlZFB0cigpIHsKLSAgICAgIGlmIChtX3BPYnNlcnZhYmxlKQotICAgICAgICBtX3BPYnNlcnZhYmxlLT5SZW1vdmVPYnNlcnZlZFB0cih0aGlzKTsKLSAgICB9Ci0gICAgdm9pZCBSZXNldChUKiBwT2JzZXJ2YWJsZSA9IG51bGxwdHIpIHsKLSAgICAgIGlmIChtX3BPYnNlcnZhYmxlKQotICAgICAgICBtX3BPYnNlcnZhYmxlLT5SZW1vdmVPYnNlcnZlZFB0cih0aGlzKTsKLSAgICAgIG1fcE9ic2VydmFibGUgPSBwT2JzZXJ2YWJsZTsKLSAgICAgIGlmIChtX3BPYnNlcnZhYmxlKQotICAgICAgICBtX3BPYnNlcnZhYmxlLT5BZGRPYnNlcnZlZFB0cih0aGlzKTsKLSAgICB9Ci0gICAgdm9pZCBPbkRlc3Ryb3koKSB7Ci0gICAgICBBU1NFUlQobV9wT2JzZXJ2YWJsZSk7Ci0gICAgICBtX3BPYnNlcnZhYmxlID0gbnVsbHB0cjsKLSAgICB9Ci0gICAgT2JzZXJ2ZWRQdHImIG9wZXJhdG9yPShjb25zdCBPYnNlcnZlZFB0ciYgdGhhdCkgewotICAgICAgUmVzZXQodGhhdC5HZXQoKSk7Ci0gICAgICByZXR1cm4gKnRoaXM7Ci0gICAgfQotICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBPYnNlcnZlZFB0ciYgdGhhdCkgY29uc3QgewotICAgICAgcmV0dXJuIG1fcE9ic2VydmFibGUgPT0gdGhhdC5tX3BPYnNlcnZhYmxlOwotICAgIH0KLSAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgT2JzZXJ2ZWRQdHImIHRoYXQpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gdGhhdCk7IH0KLSAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gISFtX3BPYnNlcnZhYmxlOyB9Ci0gICAgVCogR2V0KCkgY29uc3QgeyByZXR1cm4gbV9wT2JzZXJ2YWJsZTsgfQotICAgIFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICptX3BPYnNlcnZhYmxlOyB9Ci0gICAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIG1fcE9ic2VydmFibGU7IH0KLQotICAgcHJpdmF0ZToKLSAgICBUKiBtX3BPYnNlcnZhYmxlOwotICB9OwotCi0gIENGWF9PYnNlcnZhYmxlKCkge30KLSAgQ0ZYX09ic2VydmFibGUoY29uc3QgQ0ZYX09ic2VydmFibGUmIHRoYXQpID0gZGVsZXRlOwotICB+Q0ZYX09ic2VydmFibGUoKSB7IE5vdGlmeU9ic2VydmVkUHRycygpOyB9Ci0gIHZvaWQgQWRkT2JzZXJ2ZWRQdHIoT2JzZXJ2ZWRQdHIqIHBPYnNlcnZlZFB0cikgewotICAgIEFTU0VSVCghcGRmaXVtOjpDb250YWluc0tleShtX09ic2VydmVkUHRycywgcE9ic2VydmVkUHRyKSk7Ci0gICAgbV9PYnNlcnZlZFB0cnMuaW5zZXJ0KHBPYnNlcnZlZFB0cik7Ci0gIH0KLSAgdm9pZCBSZW1vdmVPYnNlcnZlZFB0cihPYnNlcnZlZFB0ciogcE9ic2VydmVkUHRyKSB7Ci0gICAgQVNTRVJUKHBkZml1bTo6Q29udGFpbnNLZXkobV9PYnNlcnZlZFB0cnMsIHBPYnNlcnZlZFB0cikpOwotICAgIG1fT2JzZXJ2ZWRQdHJzLmVyYXNlKHBPYnNlcnZlZFB0cik7Ci0gIH0KLSAgdm9pZCBOb3RpZnlPYnNlcnZlZFB0cnMoKSB7Ci0gICAgZm9yIChhdXRvKiBwT2JzZXJ2ZWRQdHIgOiBtX09ic2VydmVkUHRycykKLSAgICAgIHBPYnNlcnZlZFB0ci0+T25EZXN0cm95KCk7Ci0gICAgbV9PYnNlcnZlZFB0cnMuY2xlYXIoKTsKLSAgfQotICBDRlhfT2JzZXJ2YWJsZSYgb3BlcmF0b3I9KGNvbnN0IENGWF9PYnNlcnZhYmxlJiB0aGF0KSA9IGRlbGV0ZTsKLQotIHByb3RlY3RlZDoKLSAgc2l6ZV90IEFjdGl2ZU9ic2VydmVkUHRyc0ZvclRlc3RpbmcoKSBjb25zdCB7IHJldHVybiBtX09ic2VydmVkUHRycy5zaXplKCk7IH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6c2V0PE9ic2VydmVkUHRyKj4gbV9PYnNlcnZlZFB0cnM7Ci19OwotCi0jZW5kaWYgIC8vIENPUkVfRlhDUlRfQ0ZYX09CU0VSVkFCTEVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY2Z4X29ic2VydmFibGVfdW5pdHRlc3QuY3BwIGIvY29yZS9meGNydC9jZnhfb2JzZXJ2YWJsZV91bml0dGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMGZhYmIuLjAwMDAwMDAKLS0tIGEvY29yZS9meGNydC9jZnhfb2JzZXJ2YWJsZV91bml0dGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfb2JzZXJ2YWJsZS5oIgotCi0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJ0ZXN0aW5nL2Z4X3N0cmluZ190ZXN0aGVscGVycy5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBQc2V1ZG9PYnNlcnZhYmxlIDogcHVibGljIENGWF9PYnNlcnZhYmxlPFBzZXVkb09ic2VydmFibGU+IHsKLSBwdWJsaWM6Ci0gIFBzZXVkb09ic2VydmFibGUoKSB7fQotICBpbnQgU29tZU1ldGhvZCgpIHsgcmV0dXJuIDQyOyB9Ci0gIHNpemVfdCBBY3RpdmVPYnNlcnZlZFB0cnMoKSBjb25zdCB7IHJldHVybiBBY3RpdmVPYnNlcnZlZFB0cnNGb3JUZXN0aW5nKCk7IH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1URVNUKGZ4Y3J0LCBPYnNlcnZlUHRyTnVsbCkgewotICBQc2V1ZG9PYnNlcnZhYmxlOjpPYnNlcnZlZFB0ciBwdHI7Ci0gIEVYUEVDVF9FUShudWxscHRyLCBwdHIuR2V0KCkpOwotfQotCi1URVNUKGZ4Y3J0LCBPYnNlcnZlUHRyTGl2ZXNMb25nZXIpIHsKLSAgUHNldWRvT2JzZXJ2YWJsZSogcE9icyA9IG5ldyBQc2V1ZG9PYnNlcnZhYmxlOwotICBQc2V1ZG9PYnNlcnZhYmxlOjpPYnNlcnZlZFB0ciBwdHIocE9icyk7Ci0gIEVYUEVDVF9ORShudWxscHRyLCBwdHIuR2V0KCkpOwotICBFWFBFQ1RfRVEoMXUsIHBPYnMtPkFjdGl2ZU9ic2VydmVkUHRycygpKTsKLSAgZGVsZXRlIHBPYnM7Ci0gIEVYUEVDVF9FUShudWxscHRyLCBwdHIuR2V0KCkpOwotfQotCi1URVNUKGZ4Y3J0LCBPYnNlcnZlUHRyTGl2ZXNTaG9ydGVyKSB7Ci0gIFBzZXVkb09ic2VydmFibGUgb2JzOwotICB7Ci0gICAgUHNldWRvT2JzZXJ2YWJsZTo6T2JzZXJ2ZWRQdHIgcHRyKCZvYnMpOwotICAgIEVYUEVDVF9ORShudWxscHRyLCBwdHIuR2V0KCkpOwotICAgIEVYUEVDVF9FUSgxdSwgb2JzLkFjdGl2ZU9ic2VydmVkUHRycygpKTsKLSAgfQotICBFWFBFQ1RfRVEoMHUsIG9icy5BY3RpdmVPYnNlcnZlZFB0cnMoKSk7Ci19Ci0KLVRFU1QoZnhjcnQsIE9ic2VydmVDb3B5Q29uc3RydWN0KSB7Ci0gIFBzZXVkb09ic2VydmFibGUgb2JzOwotICB7Ci0gICAgUHNldWRvT2JzZXJ2YWJsZTo6T2JzZXJ2ZWRQdHIgcHRyKCZvYnMpOwotICAgIEVYUEVDVF9ORShudWxscHRyLCBwdHIuR2V0KCkpOwotICAgIEVYUEVDVF9FUSgxdSwgb2JzLkFjdGl2ZU9ic2VydmVkUHRycygpKTsKLSAgICB7Ci0gICAgICBQc2V1ZG9PYnNlcnZhYmxlOjpPYnNlcnZlZFB0ciBwdHIyKHB0cik7Ci0gICAgICBFWFBFQ1RfTkUobnVsbHB0ciwgcHRyMi5HZXQoKSk7Ci0gICAgICBFWFBFQ1RfRVEoMnUsIG9icy5BY3RpdmVPYnNlcnZlZFB0cnMoKSk7Ci0gICAgfQotICAgIEVYUEVDVF9FUSgxdSwgb2JzLkFjdGl2ZU9ic2VydmVkUHRycygpKTsKLSAgfQotICBFWFBFQ1RfRVEoMHUsIG9icy5BY3RpdmVPYnNlcnZlZFB0cnMoKSk7Ci19Ci0KLVRFU1QoZnhjcnQsIE9ic2VydmVDb3B5QXNzaWduKSB7Ci0gIFBzZXVkb09ic2VydmFibGUgb2JzOwotICB7Ci0gICAgUHNldWRvT2JzZXJ2YWJsZTo6T2JzZXJ2ZWRQdHIgcHRyKCZvYnMpOwotICAgIEVYUEVDVF9ORShudWxscHRyLCBwdHIuR2V0KCkpOwotICAgIEVYUEVDVF9FUSgxdSwgb2JzLkFjdGl2ZU9ic2VydmVkUHRycygpKTsKLSAgICB7Ci0gICAgICBQc2V1ZG9PYnNlcnZhYmxlOjpPYnNlcnZlZFB0ciBwdHIyOwotICAgICAgcHRyMiA9IHB0cjsKLSAgICAgIEVYUEVDVF9ORShudWxscHRyLCBwdHIyLkdldCgpKTsKLSAgICAgIEVYUEVDVF9FUSgydSwgb2JzLkFjdGl2ZU9ic2VydmVkUHRycygpKTsKLSAgICB9Ci0gICAgRVhQRUNUX0VRKDF1LCBvYnMuQWN0aXZlT2JzZXJ2ZWRQdHJzKCkpOwotICB9Ci0gIEVYUEVDVF9FUSgwdSwgb2JzLkFjdGl2ZU9ic2VydmVkUHRycygpKTsKLX0KLQotVEVTVChmeGNydCwgT2JzZXJ2ZVZlY3RvcikgewotICBQc2V1ZG9PYnNlcnZhYmxlIG9iczsKLSAgewotICAgIHN0ZDo6dmVjdG9yPFBzZXVkb09ic2VydmFibGU6Ok9ic2VydmVkUHRyPiB2ZWMxOwotICAgIHN0ZDo6dmVjdG9yPFBzZXVkb09ic2VydmFibGU6Ok9ic2VydmVkUHRyPiB2ZWMyOwotICAgIHZlYzEuZW1wbGFjZV9iYWNrKCZvYnMpOwotICAgIHZlYzEuZW1wbGFjZV9iYWNrKCZvYnMpOwotICAgIEVYUEVDVF9ORShudWxscHRyLCB2ZWMxWzBdLkdldCgpKTsKLSAgICBFWFBFQ1RfTkUobnVsbHB0ciwgdmVjMVsxXS5HZXQoKSk7Ci0gICAgRVhQRUNUX0VRKDJ1LCBvYnMuQWN0aXZlT2JzZXJ2ZWRQdHJzKCkpOwotICAgIHZlYzIgPSB2ZWMxOwotICAgIEVYUEVDVF9ORShudWxscHRyLCB2ZWMyWzBdLkdldCgpKTsKLSAgICBFWFBFQ1RfTkUobnVsbHB0ciwgdmVjMlsxXS5HZXQoKSk7Ci0gICAgRVhQRUNUX0VRKDR1LCBvYnMuQWN0aXZlT2JzZXJ2ZWRQdHJzKCkpOwotICAgIHZlYzEuY2xlYXIoKTsKLSAgICBFWFBFQ1RfRVEoMnUsIG9icy5BY3RpdmVPYnNlcnZlZFB0cnMoKSk7Ci0gICAgdmVjMi5yZXNpemUoMTAwMDApOwotICAgIEVYUEVDVF9FUSgydSwgb2JzLkFjdGl2ZU9ic2VydmVkUHRycygpKTsKLSAgICB2ZWMyLnJlc2l6ZSgwKTsKLSAgICBFWFBFQ1RfRVEoMHUsIG9icy5BY3RpdmVPYnNlcnZlZFB0cnMoKSk7Ci0gIH0KLSAgRVhQRUNUX0VRKDB1LCBvYnMuQWN0aXZlT2JzZXJ2ZWRQdHJzKCkpOwotfQotCi1URVNUKGZ4Y3J0LCBPYnNlcnZlVmVjdG9yQXV0b0NsZWFyKSB7Ci0gIHN0ZDo6dmVjdG9yPFBzZXVkb09ic2VydmFibGU6Ok9ic2VydmVkUHRyPiB2ZWMxOwotICB7Ci0gICAgUHNldWRvT2JzZXJ2YWJsZSBvYnM7Ci0gICAgdmVjMS5lbXBsYWNlX2JhY2soJm9icyk7Ci0gICAgdmVjMS5lbXBsYWNlX2JhY2soJm9icyk7Ci0gICAgRVhQRUNUX05FKG51bGxwdHIsIHZlYzFbMF0uR2V0KCkpOwotICAgIEVYUEVDVF9ORShudWxscHRyLCB2ZWMxWzFdLkdldCgpKTsKLSAgICBFWFBFQ1RfRVEoMnUsIG9icy5BY3RpdmVPYnNlcnZlZFB0cnMoKSk7Ci0gIH0KLSAgRVhQRUNUX0VRKG51bGxwdHIsIHZlYzFbMF0uR2V0KCkpOwotICBFWFBFQ1RfRVEobnVsbHB0ciwgdmVjMVsxXS5HZXQoKSk7Ci19Ci0KLVRFU1QoZnhjcnQsIE9ic2VydmVQdHJSZXNldE51bGwpIHsKLSAgUHNldWRvT2JzZXJ2YWJsZSBvYnM7Ci0gIFBzZXVkb09ic2VydmFibGU6Ok9ic2VydmVkUHRyIHB0cigmb2JzKTsKLSAgRVhQRUNUX0VRKDF1LCBvYnMuQWN0aXZlT2JzZXJ2ZWRQdHJzKCkpOwotICBwdHIuUmVzZXQoKTsKLSAgRVhQRUNUX0VRKDB1LCBvYnMuQWN0aXZlT2JzZXJ2ZWRQdHJzKCkpOwotfQotCi1URVNUKGZ4Y3J0LCBPYnNlcnZlUHRyUmVzZXQpIHsKLSAgUHNldWRvT2JzZXJ2YWJsZSBvYnMxOwotICBQc2V1ZG9PYnNlcnZhYmxlIG9iczI7Ci0gIFBzZXVkb09ic2VydmFibGU6Ok9ic2VydmVkUHRyIHB0cigmb2JzMSk7Ci0gIEVYUEVDVF9FUSgxdSwgb2JzMS5BY3RpdmVPYnNlcnZlZFB0cnMoKSk7Ci0gIEVYUEVDVF9FUSgwdSwgb2JzMi5BY3RpdmVPYnNlcnZlZFB0cnMoKSk7Ci0gIHB0ci5SZXNldCgmb2JzMik7Ci0gIEVYUEVDVF9FUSgwdSwgb2JzMS5BY3RpdmVPYnNlcnZlZFB0cnMoKSk7Ci0gIEVYUEVDVF9FUSgxdSwgb2JzMi5BY3RpdmVPYnNlcnZlZFB0cnMoKSk7Ci19Ci0KLVRFU1QoZnhjcnQsIE9ic2VydmVQdHJFcXVhbHMpIHsKLSAgUHNldWRvT2JzZXJ2YWJsZSBvYmoxOwotICBQc2V1ZG9PYnNlcnZhYmxlIG9iajI7Ci0gIFBzZXVkb09ic2VydmFibGU6Ok9ic2VydmVkUHRyIG51bGxfcHRyMTsKLSAgUHNldWRvT2JzZXJ2YWJsZTo6T2JzZXJ2ZWRQdHIgb2JqMV9wdHIxKCZvYmoxKTsKLSAgUHNldWRvT2JzZXJ2YWJsZTo6T2JzZXJ2ZWRQdHIgb2JqMl9wdHIxKCZvYmoyKTsKLSAgewotICAgIFBzZXVkb09ic2VydmFibGU6Ok9ic2VydmVkUHRyIG51bGxfcHRyMjsKLSAgICBFWFBFQ1RfVFJVRShudWxsX3B0cjEgPT0gbnVsbF9wdHIyKTsKLQotICAgIFBzZXVkb09ic2VydmFibGU6Ok9ic2VydmVkUHRyIG9iajFfcHRyMigmb2JqMSk7Ci0gICAgRVhQRUNUX1RSVUUob2JqMV9wdHIxID09IG9iajFfcHRyMik7Ci0KLSAgICBQc2V1ZG9PYnNlcnZhYmxlOjpPYnNlcnZlZFB0ciBvYmoyX3B0cjIoJm9iajIpOwotICAgIEVYUEVDVF9UUlVFKG9iajJfcHRyMSA9PSBvYmoyX3B0cjIpOwotICB9Ci0gIEVYUEVDVF9GQUxTRShudWxsX3B0cjEgPT0gb2JqMV9wdHIxKTsKLSAgRVhQRUNUX0ZBTFNFKG51bGxfcHRyMSA9PSBvYmoyX3B0cjEpOwotICBFWFBFQ1RfRkFMU0Uob2JqMV9wdHIxID09IG9iajJfcHRyMSk7Ci19Ci0KLVRFU1QoZnhjcnQsIE9ic2VydmVQdHJOb3RFcXVhbHMpIHsKLSAgUHNldWRvT2JzZXJ2YWJsZSBvYmoxOwotICBQc2V1ZG9PYnNlcnZhYmxlIG9iajI7Ci0gIFBzZXVkb09ic2VydmFibGU6Ok9ic2VydmVkUHRyIG51bGxfcHRyMTsKLSAgUHNldWRvT2JzZXJ2YWJsZTo6T2JzZXJ2ZWRQdHIgb2JqMV9wdHIxKCZvYmoxKTsKLSAgUHNldWRvT2JzZXJ2YWJsZTo6T2JzZXJ2ZWRQdHIgb2JqMl9wdHIxKCZvYmoyKTsKLSAgewotICAgIFBzZXVkb09ic2VydmFibGU6Ok9ic2VydmVkUHRyIG51bGxfcHRyMjsKLSAgICBQc2V1ZG9PYnNlcnZhYmxlOjpPYnNlcnZlZFB0ciBvYmoxX3B0cjIoJm9iajEpOwotICAgIFBzZXVkb09ic2VydmFibGU6Ok9ic2VydmVkUHRyIG9iajJfcHRyMigmb2JqMik7Ci0gICAgRVhQRUNUX0ZBTFNFKG51bGxfcHRyMSAhPSBudWxsX3B0cjIpOwotICAgIEVYUEVDVF9GQUxTRShvYmoxX3B0cjEgIT0gb2JqMV9wdHIyKTsKLSAgICBFWFBFQ1RfRkFMU0Uob2JqMl9wdHIxICE9IG9iajJfcHRyMik7Ci0gIH0KLSAgRVhQRUNUX1RSVUUobnVsbF9wdHIxICE9IG9iajFfcHRyMSk7Ci0gIEVYUEVDVF9UUlVFKG51bGxfcHRyMSAhPSBvYmoyX3B0cjEpOwotICBFWFBFQ1RfVFJVRShvYmoxX3B0cjEgIT0gb2JqMl9wdHIxKTsKLX0KLQotVEVTVChmeGNydCwgT2JzZXJ2ZVB0ckJvb2wpIHsKLSAgUHNldWRvT2JzZXJ2YWJsZSBvYmoxOwotICBQc2V1ZG9PYnNlcnZhYmxlOjpPYnNlcnZlZFB0ciBudWxsX3B0cjsKLSAgUHNldWRvT2JzZXJ2YWJsZTo6T2JzZXJ2ZWRQdHIgb2JqMV9wdHIoJm9iajEpOwotICBib29sIG51bGxfYm9vbCA9ICEhbnVsbF9wdHI7Ci0gIGJvb2wgb2JqMV9ib29sID0gISFvYmoxX3B0cjsKLSAgRVhQRUNUX0ZBTFNFKG51bGxfYm9vbCk7Ci0gIEVYUEVDVF9UUlVFKG9iajFfYm9vbCk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyLmggYi9jb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNjdhZTAuLjAwMDAwMDAKLS0tIGEvY29yZS9meGNydC9jZnhfcmV0YWluX3B0ci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBDT1JFX0ZYQ1JUX0NGWF9SRVRBSU5fUFRSX0hfCi0jZGVmaW5lIENPUkVfRlhDUlRfQ0ZYX1JFVEFJTl9QVFJfSF8KLQotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgotCi0vLyBBbmFsb2dvdXMgdG8gYmFzZSdzIHNjb3BlZF9yZWZwdHIuCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWNsYXNzIENGWF9SZXRhaW5QdHIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0ZYX1JldGFpblB0cihUKiBwT2JqKSA6IG1fcE9iaihwT2JqKSB7Ci0gICAgaWYgKG1fcE9iaikKLSAgICAgIG1fcE9iai0+UmV0YWluKCk7Ci0gIH0KLQotICBDRlhfUmV0YWluUHRyKCkge30KLSAgQ0ZYX1JldGFpblB0cihjb25zdCBDRlhfUmV0YWluUHRyJiB0aGF0KSA6IENGWF9SZXRhaW5QdHIodGhhdC5HZXQoKSkge30KLSAgQ0ZYX1JldGFpblB0cihDRlhfUmV0YWluUHRyJiYgdGhhdCkgeyBTd2FwKHRoYXQpOyB9Ci0KLSAgLy8gRGVsaWJlcmF0ZWx5IGltcGxpY2l0IHRvIGFsbG93IHJldHVybmluZyBudWxscHRycy4KLSAgQ0ZYX1JldGFpblB0cihzdGQ6Om51bGxwdHJfdCBwdHIpIHt9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIFU+Ci0gIENGWF9SZXRhaW5QdHIoY29uc3QgQ0ZYX1JldGFpblB0cjxVPiYgdGhhdCkgOiBDRlhfUmV0YWluUHRyKHRoYXQuR2V0KCkpIHt9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIFU+Ci0gIENGWF9SZXRhaW5QdHI8VT4gQXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIENGWF9SZXRhaW5QdHI8VT4oc3RhdGljX2Nhc3Q8VSo+KEdldCgpKSk7Ci0gIH0KLQotICB2b2lkIFJlc2V0KFQqIG9iaiA9IG51bGxwdHIpIHsKLSAgICBpZiAob2JqKQotICAgICAgb2JqLT5SZXRhaW4oKTsKLSAgICBtX3BPYmoucmVzZXQob2JqKTsKLSAgfQotCi0gIFQqIEdldCgpIGNvbnN0IHsgcmV0dXJuIG1fcE9iai5nZXQoKTsgfQotICB2b2lkIFN3YXAoQ0ZYX1JldGFpblB0ciYgdGhhdCkgeyBtX3BPYmouc3dhcCh0aGF0Lm1fcE9iaik7IH0KLQotICAvLyBUT0RPKHRzZXBleik6IHRlbXBvcmFyeSBzY2FmZm9sZGluZywgdG8gYmUgcmVtb3ZlZC4KLSAgVCogTGVhaygpIHsgcmV0dXJuIG1fcE9iai5yZWxlYXNlKCk7IH0KLSAgdm9pZCBVbmxlYWsoVCogcHRyKSB7IG1fcE9iai5yZXNldChwdHIpOyB9Ci0KLSAgQ0ZYX1JldGFpblB0ciYgb3BlcmF0b3I9KGNvbnN0IENGWF9SZXRhaW5QdHImIHRoYXQpIHsKLSAgICBpZiAoKnRoaXMgIT0gdGhhdCkKLSAgICAgIFJlc2V0KHRoYXQuR2V0KCkpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDRlhfUmV0YWluUHRyJiB0aGF0KSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldCgpID09IHRoYXQuR2V0KCk7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENGWF9SZXRhaW5QdHImIHRoYXQpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gdGhhdCk7IH0KLQotICBib29sIG9wZXJhdG9yPChjb25zdCBDRlhfUmV0YWluUHRyJiB0aGF0KSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0ZDo6bGVzczxUKj4oKShHZXQoKSwgdGhhdC5HZXQoKSk7Ci0gIH0KLQotICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gISFtX3BPYmo7IH0KLSAgVCYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKm1fcE9iai5nZXQoKTsgfQotICBUKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gbV9wT2JqLmdldCgpOyB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnVuaXF1ZV9wdHI8VCwgUmVsZWFzZURlbGV0ZXI8VD4+IG1fcE9iajsKLX07Ci0KLS8vIFRyaXZpYWwgaW1wbGVtZW50YXRpb24gLSBpbnRlcm5hbCByZWYgY291bnQgd2l0aCB2aXJ0dWFsIGRlc3RydWN0b3IuCi1jbGFzcyBDRlhfUmV0YWluYWJsZSB7Ci0gcHVibGljOgotICBib29sIEhhc09uZVJlZigpIGNvbnN0IHsgcmV0dXJuIG1fblJlZkNvdW50ID09IDE7IH0KLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+Q0ZYX1JldGFpbmFibGUoKSB7fQotCi0gcHJpdmF0ZToKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+Ci0gIGZyaWVuZCBzdHJ1Y3QgUmVsZWFzZURlbGV0ZXI7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+Ci0gIGZyaWVuZCBjbGFzcyBDRlhfUmV0YWluUHRyOwotCi0gIHZvaWQgUmV0YWluKCkgeyArK21fblJlZkNvdW50OyB9Ci0gIHZvaWQgUmVsZWFzZSgpIHsKLSAgICBBU1NFUlQobV9uUmVmQ291bnQgPiAwKTsKLSAgICBpZiAoLS1tX25SZWZDb3VudCA9PSAwKQotICAgICAgZGVsZXRlIHRoaXM7Ci0gIH0KLQotICBpbnRwdHJfdCBtX25SZWZDb3VudCA9IDA7Ci19OwotCi1uYW1lc3BhY2UgcGRmaXVtIHsKLQotLy8gSGVscGVyIHRvIG1ha2UgYSBDRlhfUmV0YWluUHRyIGFsb25nIHRoZSBsaW5lcyBvZiBzdGQ6Om1ha2VfdW5pcXVlPD4oKSwKLS8vIG9yIHBkZml1bTo6TWFrZVVuaXF1ZTw+KCkuIEFyZ3VtZW50cyBhcmUgZm9yd2FyZGVkIHRvIFQncyBjb25zdHJ1Y3Rvci4KLS8vIENsYXNzZXMgbWFuYWdlZCBieSBDRlhfUmV0YWluUHRyIHNob3VsZCBoYXZlIHByb3RlY3RlZCAob3IgcHJpdmF0ZSkKLS8vIGNvbnN0cnVjdG9ycywgYW5kIHNob3VsZCBmcmllbmQgdGhpcyBmdW5jdGlvbi4KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgotQ0ZYX1JldGFpblB0cjxUPiBNYWtlUmV0YWluKEFyZ3MmJi4uLiBhcmdzKSB7Ci0gIHJldHVybiBDRlhfUmV0YWluUHRyPFQ+KG5ldyBUKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLikpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgcGRmaXVtCi0KLSNlbmRpZiAgLy8gQ09SRV9GWENSVF9DRlhfUkVUQUlOX1BUUl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jZnhfcmV0YWluX3B0cl91bml0dGVzdC5jcHAgYi9jb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyX3VuaXR0ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE2OGI1YS4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyX3VuaXR0ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI1NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyLmgiCi0KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAidGVzdGluZy9meF9zdHJpbmdfdGVzdGhlbHBlcnMuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgUHNldWRvUmV0YWluYWJsZSB7Ci0gcHVibGljOgotICBQc2V1ZG9SZXRhaW5hYmxlKCkgOiByZXRhaW5fY291bnRfKDApLCByZWxlYXNlX2NvdW50XygwKSB7fQotICB2b2lkIFJldGFpbigpIHsgKytyZXRhaW5fY291bnRfOyB9Ci0gIHZvaWQgUmVsZWFzZSgpIHsgKytyZWxlYXNlX2NvdW50XzsgfQotICBpbnQgcmV0YWluX2NvdW50KCkgY29uc3QgeyByZXR1cm4gcmV0YWluX2NvdW50XzsgfQotICBpbnQgcmVsZWFzZV9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIHJlbGVhc2VfY291bnRfOyB9Ci0KLSBwcml2YXRlOgotICBpbnQgcmV0YWluX2NvdW50XzsKLSAgaW50IHJlbGVhc2VfY291bnRfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLVRFU1QoZnhjcnQsIFJldGFpblB0ck51bGwpIHsKLSAgQ0ZYX1JldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBwdHI7Ci0gIEVYUEVDVF9FUShudWxscHRyLCBwdHIuR2V0KCkpOwotfQotCi1URVNUKGZ4Y3J0LCBSZXRhaW5QdHJOb3JtYWwpIHsKLSAgUHNldWRvUmV0YWluYWJsZSBvYmo7Ci0gIHsKLSAgICBDRlhfUmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+IHB0cigmb2JqKTsKLSAgICBFWFBFQ1RfRVEoJm9iaiwgcHRyLkdldCgpKTsKLSAgICBFWFBFQ1RfRVEoMSwgb2JqLnJldGFpbl9jb3VudCgpKTsKLSAgICBFWFBFQ1RfRVEoMCwgb2JqLnJlbGVhc2VfY291bnQoKSk7Ci0gIH0KLSAgRVhQRUNUX0VRKDEsIG9iai5yZXRhaW5fY291bnQoKSk7Ci0gIEVYUEVDVF9FUSgxLCBvYmoucmVsZWFzZV9jb3VudCgpKTsKLX0KLQotVEVTVChmeGNydCwgUmV0YWluUHRyQ29weUN0b3IpIHsKLSAgUHNldWRvUmV0YWluYWJsZSBvYmo7Ci0gIHsKLSAgICBDRlhfUmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+IHB0cjEoJm9iaik7Ci0gICAgewotICAgICAgQ0ZYX1JldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBwdHIyKHB0cjEpOwotICAgICAgRVhQRUNUX0VRKDIsIG9iai5yZXRhaW5fY291bnQoKSk7Ci0gICAgICBFWFBFQ1RfRVEoMCwgb2JqLnJlbGVhc2VfY291bnQoKSk7Ci0gICAgfQotICAgIEVYUEVDVF9FUSgyLCBvYmoucmV0YWluX2NvdW50KCkpOwotICAgIEVYUEVDVF9FUSgxLCBvYmoucmVsZWFzZV9jb3VudCgpKTsKLSAgfQotICBFWFBFQ1RfRVEoMiwgb2JqLnJldGFpbl9jb3VudCgpKTsKLSAgRVhQRUNUX0VRKDIsIG9iai5yZWxlYXNlX2NvdW50KCkpOwotfQotCi1URVNUKGZ4Y3J0LCBSZXRhaW5QdHJNb3ZlQ3RvcikgewotICBQc2V1ZG9SZXRhaW5hYmxlIG9iajsKLSAgewotICAgIENGWF9SZXRhaW5QdHI8UHNldWRvUmV0YWluYWJsZT4gcHRyMSgmb2JqKTsKLSAgICB7Ci0gICAgICBDRlhfUmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+IHB0cjIoc3RkOjptb3ZlKHB0cjEpKTsKLSAgICAgIEVYUEVDVF9FUSgxLCBvYmoucmV0YWluX2NvdW50KCkpOwotICAgICAgRVhQRUNUX0VRKDAsIG9iai5yZWxlYXNlX2NvdW50KCkpOwotICAgIH0KLSAgICBFWFBFQ1RfRVEoMSwgb2JqLnJldGFpbl9jb3VudCgpKTsKLSAgICBFWFBFQ1RfRVEoMSwgb2JqLnJlbGVhc2VfY291bnQoKSk7Ci0gIH0KLSAgRVhQRUNUX0VRKDEsIG9iai5yZXRhaW5fY291bnQoKSk7Ci0gIEVYUEVDVF9FUSgxLCBvYmoucmVsZWFzZV9jb3VudCgpKTsKLX0KLQotVEVTVChmeGNydCwgUmV0YWluUHRyUmVzZXROdWxsKSB7Ci0gIFBzZXVkb1JldGFpbmFibGUgb2JqOwotICB7Ci0gICAgQ0ZYX1JldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBwdHIoJm9iaik7Ci0gICAgcHRyLlJlc2V0KCk7Ci0gICAgRVhQRUNUX0VRKDEsIG9iai5yZXRhaW5fY291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKDEsIG9iai5yZWxlYXNlX2NvdW50KCkpOwotICB9Ci0gIEVYUEVDVF9FUSgxLCBvYmoucmV0YWluX2NvdW50KCkpOwotICBFWFBFQ1RfRVEoMSwgb2JqLnJlbGVhc2VfY291bnQoKSk7Ci19Ci0KLVRFU1QoZnhjcnQsIFJldGFpblB0clJlc2V0KSB7Ci0gIFBzZXVkb1JldGFpbmFibGUgb2JqMTsKLSAgUHNldWRvUmV0YWluYWJsZSBvYmoyOwotICB7Ci0gICAgQ0ZYX1JldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBwdHIoJm9iajEpOwotICAgIHB0ci5SZXNldCgmb2JqMik7Ci0gICAgRVhQRUNUX0VRKDEsIG9iajEucmV0YWluX2NvdW50KCkpOwotICAgIEVYUEVDVF9FUSgxLCBvYmoxLnJlbGVhc2VfY291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKDEsIG9iajIucmV0YWluX2NvdW50KCkpOwotICAgIEVYUEVDVF9FUSgwLCBvYmoyLnJlbGVhc2VfY291bnQoKSk7Ci0gIH0KLSAgRVhQRUNUX0VRKDEsIG9iajEucmV0YWluX2NvdW50KCkpOwotICBFWFBFQ1RfRVEoMSwgb2JqMS5yZWxlYXNlX2NvdW50KCkpOwotICBFWFBFQ1RfRVEoMSwgb2JqMi5yZXRhaW5fY291bnQoKSk7Ci0gIEVYUEVDVF9FUSgxLCBvYmoyLnJlbGVhc2VfY291bnQoKSk7Ci19Ci0KLVRFU1QoZnhjcnQsIFJldGFpblB0clN3YXApIHsKLSAgUHNldWRvUmV0YWluYWJsZSBvYmoxOwotICBQc2V1ZG9SZXRhaW5hYmxlIG9iajI7Ci0gIHsKLSAgICBDRlhfUmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+IHB0cjEoJm9iajEpOwotICAgIHsKLSAgICAgIENGWF9SZXRhaW5QdHI8UHNldWRvUmV0YWluYWJsZT4gcHRyMigmb2JqMik7Ci0gICAgICBwdHIxLlN3YXAocHRyMik7Ci0gICAgICBFWFBFQ1RfRVEoMSwgb2JqMS5yZXRhaW5fY291bnQoKSk7Ci0gICAgICBFWFBFQ1RfRVEoMCwgb2JqMS5yZWxlYXNlX2NvdW50KCkpOwotICAgICAgRVhQRUNUX0VRKDEsIG9iajIucmV0YWluX2NvdW50KCkpOwotICAgICAgRVhQRUNUX0VRKDAsIG9iajIucmVsZWFzZV9jb3VudCgpKTsKLSAgICB9Ci0gICAgRVhQRUNUX0VRKDEsIG9iajEucmV0YWluX2NvdW50KCkpOwotICAgIEVYUEVDVF9FUSgxLCBvYmoxLnJlbGVhc2VfY291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKDEsIG9iajIucmV0YWluX2NvdW50KCkpOwotICAgIEVYUEVDVF9FUSgwLCBvYmoyLnJlbGVhc2VfY291bnQoKSk7Ci0gIH0KLSAgRVhQRUNUX0VRKDEsIG9iajEucmV0YWluX2NvdW50KCkpOwotICBFWFBFQ1RfRVEoMSwgb2JqMS5yZWxlYXNlX2NvdW50KCkpOwotICBFWFBFQ1RfRVEoMSwgb2JqMi5yZXRhaW5fY291bnQoKSk7Ci0gIEVYUEVDVF9FUSgxLCBvYmoyLnJlbGVhc2VfY291bnQoKSk7Ci19Ci0KLVRFU1QoZnhjcnQsIFJldGFpblB0ckxlYWspIHsKLSAgUHNldWRvUmV0YWluYWJsZSBvYmo7Ci0gIFBzZXVkb1JldGFpbmFibGUqIGxlYWs7Ci0gIHsKLSAgICBDRlhfUmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+IHB0cigmb2JqKTsKLSAgICBsZWFrID0gcHRyLkxlYWsoKTsKLSAgICBFWFBFQ1RfRVEoMSwgb2JqLnJldGFpbl9jb3VudCgpKTsKLSAgICBFWFBFQ1RfRVEoMCwgb2JqLnJlbGVhc2VfY291bnQoKSk7Ci0gIH0KLSAgRVhQRUNUX0VRKDEsIG9iai5yZXRhaW5fY291bnQoKSk7Ci0gIEVYUEVDVF9FUSgwLCBvYmoucmVsZWFzZV9jb3VudCgpKTsKLSAgewotICAgIENGWF9SZXRhaW5QdHI8UHNldWRvUmV0YWluYWJsZT4gcHRyOwotICAgIHB0ci5VbmxlYWsobGVhayk7Ci0gICAgRVhQRUNUX0VRKDEsIG9iai5yZXRhaW5fY291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKDAsIG9iai5yZWxlYXNlX2NvdW50KCkpOwotICB9Ci0gIEVYUEVDVF9FUSgxLCBvYmoucmV0YWluX2NvdW50KCkpOwotICBFWFBFQ1RfRVEoMSwgb2JqLnJlbGVhc2VfY291bnQoKSk7Ci19Ci0KLVRFU1QoZnhjcnQsIFJldGFpblB0clN3YXBOdWxsKSB7Ci0gIFBzZXVkb1JldGFpbmFibGUgb2JqMTsKLSAgewotICAgIENGWF9SZXRhaW5QdHI8UHNldWRvUmV0YWluYWJsZT4gcHRyMSgmb2JqMSk7Ci0gICAgewotICAgICAgQ0ZYX1JldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBwdHIyOwotICAgICAgcHRyMS5Td2FwKHB0cjIpOwotICAgICAgRVhQRUNUX0ZBTFNFKHB0cjEpOwotICAgICAgRVhQRUNUX1RSVUUocHRyMik7Ci0gICAgICBFWFBFQ1RfRVEoMSwgb2JqMS5yZXRhaW5fY291bnQoKSk7Ci0gICAgICBFWFBFQ1RfRVEoMCwgb2JqMS5yZWxlYXNlX2NvdW50KCkpOwotICAgIH0KLSAgICBFWFBFQ1RfRVEoMSwgb2JqMS5yZXRhaW5fY291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKDEsIG9iajEucmVsZWFzZV9jb3VudCgpKTsKLSAgfQotICBFWFBFQ1RfRVEoMSwgb2JqMS5yZXRhaW5fY291bnQoKSk7Ci0gIEVYUEVDVF9FUSgxLCBvYmoxLnJlbGVhc2VfY291bnQoKSk7Ci19Ci0KLVRFU1QoZnhjcnQsIFJldGFpblB0ckFzc2lnbikgewotICBQc2V1ZG9SZXRhaW5hYmxlIG9iajsKLSAgewotICAgIENGWF9SZXRhaW5QdHI8UHNldWRvUmV0YWluYWJsZT4gcHRyKCZvYmopOwotICAgIHsKLSAgICAgIENGWF9SZXRhaW5QdHI8UHNldWRvUmV0YWluYWJsZT4gcHRyMjsKLSAgICAgIHB0cjIgPSBwdHI7Ci0gICAgICBFWFBFQ1RfRVEoMiwgb2JqLnJldGFpbl9jb3VudCgpKTsKLSAgICAgIEVYUEVDVF9FUSgwLCBvYmoucmVsZWFzZV9jb3VudCgpKTsKLSAgICB9Ci0gICAgRVhQRUNUX0VRKDIsIG9iai5yZXRhaW5fY291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKDEsIG9iai5yZWxlYXNlX2NvdW50KCkpOwotICB9Ci0gIEVYUEVDVF9FUSgyLCBvYmoucmV0YWluX2NvdW50KCkpOwotICBFWFBFQ1RfRVEoMiwgb2JqLnJlbGVhc2VfY291bnQoKSk7Ci19Ci0KLVRFU1QoZnhjcnQsIFJldGFpblB0ckVxdWFscykgewotICBQc2V1ZG9SZXRhaW5hYmxlIG9iajE7Ci0gIFBzZXVkb1JldGFpbmFibGUgb2JqMjsKLSAgQ0ZYX1JldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBudWxsX3B0cjE7Ci0gIENGWF9SZXRhaW5QdHI8UHNldWRvUmV0YWluYWJsZT4gb2JqMV9wdHIxKCZvYmoxKTsKLSAgQ0ZYX1JldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBvYmoyX3B0cjEoJm9iajIpOwotICB7Ci0gICAgQ0ZYX1JldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBudWxsX3B0cjI7Ci0gICAgRVhQRUNUX1RSVUUobnVsbF9wdHIxID09IG51bGxfcHRyMik7Ci0KLSAgICBDRlhfUmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+IG9iajFfcHRyMigmb2JqMSk7Ci0gICAgRVhQRUNUX1RSVUUob2JqMV9wdHIxID09IG9iajFfcHRyMik7Ci0KLSAgICBDRlhfUmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+IG9iajJfcHRyMigmb2JqMik7Ci0gICAgRVhQRUNUX1RSVUUob2JqMl9wdHIxID09IG9iajJfcHRyMik7Ci0gIH0KLSAgRVhQRUNUX0ZBTFNFKG51bGxfcHRyMSA9PSBvYmoxX3B0cjEpOwotICBFWFBFQ1RfRkFMU0UobnVsbF9wdHIxID09IG9iajJfcHRyMSk7Ci0gIEVYUEVDVF9GQUxTRShvYmoxX3B0cjEgPT0gb2JqMl9wdHIxKTsKLX0KLQotVEVTVChmeGNydCwgUmV0YWluUHRyTm90RXF1YWxzKSB7Ci0gIFBzZXVkb1JldGFpbmFibGUgb2JqMTsKLSAgUHNldWRvUmV0YWluYWJsZSBvYmoyOwotICBDRlhfUmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+IG51bGxfcHRyMTsKLSAgQ0ZYX1JldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBvYmoxX3B0cjEoJm9iajEpOwotICBDRlhfUmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+IG9iajJfcHRyMSgmb2JqMik7Ci0gIHsKLSAgICBDRlhfUmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+IG51bGxfcHRyMjsKLSAgICBDRlhfUmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+IG9iajFfcHRyMigmb2JqMSk7Ci0gICAgQ0ZYX1JldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBvYmoyX3B0cjIoJm9iajIpOwotICAgIEVYUEVDVF9GQUxTRShudWxsX3B0cjEgIT0gbnVsbF9wdHIyKTsKLSAgICBFWFBFQ1RfRkFMU0Uob2JqMV9wdHIxICE9IG9iajFfcHRyMik7Ci0gICAgRVhQRUNUX0ZBTFNFKG9iajJfcHRyMSAhPSBvYmoyX3B0cjIpOwotICB9Ci0gIEVYUEVDVF9UUlVFKG51bGxfcHRyMSAhPSBvYmoxX3B0cjEpOwotICBFWFBFQ1RfVFJVRShudWxsX3B0cjEgIT0gb2JqMl9wdHIxKTsKLSAgRVhQRUNUX1RSVUUob2JqMV9wdHIxICE9IG9iajJfcHRyMSk7Ci19Ci0KLVRFU1QoZnhjcnQsIFJldGFpblB0ckxlc3NUaGFuKSB7Ci0gIFBzZXVkb1JldGFpbmFibGUgb2Jqc1syXTsKLSAgQ0ZYX1JldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBvYmoxX3B0cigmb2Jqc1swXSk7Ci0gIENGWF9SZXRhaW5QdHI8UHNldWRvUmV0YWluYWJsZT4gb2JqMl9wdHIoJm9ianNbMV0pOwotICBFWFBFQ1RfVFJVRShvYmoxX3B0ciA8IG9iajJfcHRyKTsKLSAgRVhQRUNUX0ZBTFNFKG9iajJfcHRyIDwgb2JqMV9wdHIpOwotfQotCi1URVNUKGZ4Y3J0LCBSZXRhaW5QdHJCb29sKSB7Ci0gIFBzZXVkb1JldGFpbmFibGUgb2JqMTsKLSAgQ0ZYX1JldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBudWxsX3B0cjsKLSAgQ0ZYX1JldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBvYmoxX3B0cigmb2JqMSk7Ci0gIGJvb2wgbnVsbF9ib29sID0gISFudWxsX3B0cjsKLSAgYm9vbCBvYmoxX2Jvb2wgPSAhIW9iajFfcHRyOwotICBFWFBFQ1RfRkFMU0UobnVsbF9ib29sKTsKLSAgRVhQRUNUX1RSVUUob2JqMV9ib29sKTsKLX0KLQotVEVTVChmeGNydCwgUmV0YWluUHRyTWFrZVJldGFpbmVkKSB7Ci0gIGF1dG8gcHRyID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9SZXRhaW5hYmxlPigpOwotICBFWFBFQ1RfVFJVRShwdHItPkhhc09uZVJlZigpKTsKLSAgewotICAgIENGWF9SZXRhaW5QdHI8Q0ZYX1JldGFpbmFibGU+IG90aGVyID0gcHRyOwotICAgIEVYUEVDVF9GQUxTRShwdHItPkhhc09uZVJlZigpKTsKLSAgfQotICBFWFBFQ1RfVFJVRShwdHItPkhhc09uZVJlZigpKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY2Z4X3NlZWthYmxlbXVsdGlzdHJlYW0uY3BwIGIvY29yZS9meGNydC9jZnhfc2Vla2FibGVtdWx0aXN0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIyODZiMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY2Z4X3NlZWthYmxlbXVsdGlzdHJlYW0uY3BwCkBAIC0wLDAgKzEsODUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3NlZWthYmxlbXVsdGlzdHJlYW0uaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW1fYWNjLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorCitDRlhfU2Vla2FibGVNdWx0aVN0cmVhbTo6Q0ZYX1NlZWthYmxlTXVsdGlTdHJlYW0oCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q1BERl9TdHJlYW0qPiYgc3RyZWFtcykgeworICBmb3IgKENQREZfU3RyZWFtKiBwU3RyZWFtIDogc3RyZWFtcykgeworICAgIG1fRGF0YS5wdXNoX2JhY2socGRmaXVtOjpNYWtlUmV0YWluPENQREZfU3RyZWFtQWNjPihwU3RyZWFtKSk7CisgICAgbV9EYXRhLmJhY2soKS0+TG9hZEFsbERhdGFGaWx0ZXJlZCgpOworICB9Cit9CisKK0NGWF9TZWVrYWJsZU11bHRpU3RyZWFtOjp+Q0ZYX1NlZWthYmxlTXVsdGlTdHJlYW0oKSB7fQorCitGWF9GSUxFU0laRSBDRlhfU2Vla2FibGVNdWx0aVN0cmVhbTo6R2V0U2l6ZSgpIHsKKyAgdWludDMyX3QgZHdTaXplID0gMDsKKyAgZm9yIChjb25zdCBhdXRvJiBhY2MgOiBtX0RhdGEpCisgICAgZHdTaXplICs9IGFjYy0+R2V0U2l6ZSgpOworICByZXR1cm4gZHdTaXplOworfQorCitib29sIENGWF9TZWVrYWJsZU11bHRpU3RyZWFtOjpSZWFkQmxvY2sodm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgeworICBpbnQzMl90IGlDb3VudCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9EYXRhKTsKKyAgaW50MzJfdCBpbmRleCA9IDA7CisgIHdoaWxlIChpbmRleCA8IGlDb3VudCkgeworICAgIGNvbnN0IGF1dG8mIGFjYyA9IG1fRGF0YVtpbmRleF07CisgICAgRlhfRklMRVNJWkUgZHdTaXplID0gYWNjLT5HZXRTaXplKCk7CisgICAgaWYgKG9mZnNldCA8IGR3U2l6ZSkKKyAgICAgIGJyZWFrOworCisgICAgb2Zmc2V0IC09IGR3U2l6ZTsKKyAgICBpbmRleCsrOworICB9CisgIHdoaWxlIChpbmRleCA8IGlDb3VudCkgeworICAgIGNvbnN0IGF1dG8mIGFjYyA9IG1fRGF0YVtpbmRleF07CisgICAgdWludDMyX3QgZHdTaXplID0gYWNjLT5HZXRTaXplKCk7CisgICAgc2l6ZV90IGR3UmVhZCA9IHN0ZDo6bWluKHNpemUsIHN0YXRpY19jYXN0PHNpemVfdD4oZHdTaXplIC0gb2Zmc2V0KSk7CisgICAgbWVtY3B5KGJ1ZmZlciwgYWNjLT5HZXREYXRhKCkgKyBvZmZzZXQsIGR3UmVhZCk7CisgICAgc2l6ZSAtPSBkd1JlYWQ7CisgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgYnVmZmVyID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGJ1ZmZlcikgKyBkd1JlYWQ7CisgICAgb2Zmc2V0ID0gMDsKKyAgICBpbmRleCsrOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworc2l6ZV90IENGWF9TZWVrYWJsZU11bHRpU3RyZWFtOjpSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgeworICBOT1RSRUFDSEVEKCk7CisgIHJldHVybiAwOworfQorCitGWF9GSUxFU0laRSBDRlhfU2Vla2FibGVNdWx0aVN0cmVhbTo6R2V0UG9zaXRpb24oKSB7CisgIHJldHVybiAwOworfQorCitib29sIENGWF9TZWVrYWJsZU11bHRpU3RyZWFtOjpJc0VPRigpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENGWF9TZWVrYWJsZU11bHRpU3RyZWFtOjpGbHVzaCgpIHsKKyAgTk9UUkVBQ0hFRCgpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ0ZYX1NlZWthYmxlTXVsdGlTdHJlYW06OldyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsKKyAgTk9UUkVBQ0hFRCgpOworICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2NmeF9zZWVrYWJsZW11bHRpc3RyZWFtLmggYi9jb3JlL2Z4Y3J0L2NmeF9zZWVrYWJsZW11bHRpc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzOGQ3YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY2Z4X3NlZWthYmxlbXVsdGlzdHJlYW0uaApAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENSVF9DRlhfU0VFS0FCTEVNVUxUSVNUUkVBTV9IXworI2RlZmluZSBDT1JFX0ZYQ1JUX0NGWF9TRUVLQUJMRU1VTFRJU1RSRUFNX0hfCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmVhbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgorCitjbGFzcyBDUERGX1N0cmVhbTsKK2NsYXNzIENQREZfU3RyZWFtQWNjOworCitjbGFzcyBDRlhfU2Vla2FibGVNdWx0aVN0cmVhbSA6IHB1YmxpYyBJRlhfU2Vla2FibGVTdHJlYW0geworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0ZYX1NlZWthYmxlTXVsdGlTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8Q1BERl9TdHJlYW0qPiYgc3RyZWFtcyk7CisgIH5DRlhfU2Vla2FibGVNdWx0aVN0cmVhbSgpIG92ZXJyaWRlOworCisgIC8vIElGWF9TZWVrYWJsZVJlYWRTdHJlYW0KKyAgRlhfRklMRVNJWkUgR2V0UG9zaXRpb24oKSBvdmVycmlkZTsKKyAgRlhfRklMRVNJWkUgR2V0U2l6ZSgpIG92ZXJyaWRlOworICBib29sIFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICBzaXplX3QgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICBib29sIElzRU9GKCkgb3ZlcnJpZGU7CisgIGJvb2wgRmx1c2goKSBvdmVycmlkZTsKKyAgYm9vbCBXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPFJldGFpblB0cjxDUERGX1N0cmVhbUFjYz4+IG1fRGF0YTsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWENSVF9DRlhfU0VFS0FCTEVNVUxUSVNUUkVBTV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jZnhfc2Vla2FibGVtdWx0aXN0cmVhbV91bml0dGVzdC5jcHAgYi9jb3JlL2Z4Y3J0L2NmeF9zZWVrYWJsZW11bHRpc3RyZWFtX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTIxM2IxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9jZnhfc2Vla2FibGVtdWx0aXN0cmVhbV91bml0dGVzdC5jcHAKQEAgLTAsMCArMSw4NSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfc2Vla2FibGVtdWx0aXN0cmVhbS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy90ZXN0X3N1cHBvcnQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK1RFU1QoQ0ZYX1NlZWthYmxlTXVsdGlTdHJlYW1UZXN0LCBOb1N0cmVhbXMpIHsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9TdHJlYW0qPiBzdHJlYW1zOworICBhdXRvIGZpbGVyZWFkID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9TZWVrYWJsZU11bHRpU3RyZWFtPihzdHJlYW1zKTsKKworICB1aW50OF90IG91dHB1dF9idWZmZXJbMTZdOworICBtZW1zZXQob3V0cHV0X2J1ZmZlciwgMHhiZCwgc2l6ZW9mKG91dHB1dF9idWZmZXIpKTsKKyAgRVhQRUNUX0ZBTFNFKGZpbGVyZWFkLT5SZWFkQmxvY2sob3V0cHV0X2J1ZmZlciwgMCwgMCkpOworICBFWFBFQ1RfRVEoMHhiZCwgb3V0cHV0X2J1ZmZlclswXSk7Cit9CisKK1RFU1QoQ1hGQUZpbGVSZWFkVGVzdCwgRW1wdHlTdHJlYW1zKSB7CisgIHN0ZDo6dmVjdG9yPENQREZfU3RyZWFtKj4gc3RyZWFtczsKKyAgYXV0byBzdHJlYW0xID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU3RyZWFtPigpOworICBzdHJlYW1zLnB1c2hfYmFjayhzdHJlYW0xLmdldCgpKTsKKyAgYXV0byBmaWxlcmVhZCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfU2Vla2FibGVNdWx0aVN0cmVhbT4oc3RyZWFtcyk7CisKKyAgdWludDhfdCBvdXRwdXRfYnVmZmVyWzE2XTsKKyAgbWVtc2V0KG91dHB1dF9idWZmZXIsIDB4YmQsIHNpemVvZihvdXRwdXRfYnVmZmVyKSk7CisgIEVYUEVDVF9GQUxTRShmaWxlcmVhZC0+UmVhZEJsb2NrKG91dHB1dF9idWZmZXIsIDAsIDApKTsKKyAgRVhQRUNUX0VRKDB4YmQsIG91dHB1dF9idWZmZXJbMF0pOworfQorCitURVNUKENYRkFGaWxlUmVhZFRlc3QsIE5vcm1hbFN0cmVhbXMpIHsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9TdHJlYW0qPiBzdHJlYW1zOworICBhdXRvIHN0cmVhbTEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJlYW0+KCk7CisgIGF1dG8gc3RyZWFtMiA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmVhbT4oKTsKKyAgYXV0byBzdHJlYW0zID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU3RyZWFtPigpOworCisgIC8vIDE2IGNoYXJzIHRvdGFsLgorICBzdHJlYW0xLT5Jbml0U3RyZWFtKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCJvbmUgdCIpLCA1LAorICAgICAgICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCkpOworICBzdHJlYW0yLT5Jbml0U3RyZWFtKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCJ3byAiKSwgMywKKyAgICAgICAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigpKTsKKyAgc3RyZWFtMy0+SW5pdFN0cmVhbShyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigidGhyZWUhISEiKSwgOCwKKyAgICAgICAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigpKTsKKworICBzdHJlYW1zLnB1c2hfYmFjayhzdHJlYW0xLmdldCgpKTsKKyAgc3RyZWFtcy5wdXNoX2JhY2soc3RyZWFtMi5nZXQoKSk7CisgIHN0cmVhbXMucHVzaF9iYWNrKHN0cmVhbTMuZ2V0KCkpOworICBhdXRvIGZpbGVyZWFkID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9TZWVrYWJsZU11bHRpU3RyZWFtPihzdHJlYW1zKTsKKworICB1aW50OF90IG91dHB1dF9idWZmZXJbMTZdOworICBtZW1zZXQob3V0cHV0X2J1ZmZlciwgMHhiZCwgc2l6ZW9mKG91dHB1dF9idWZmZXIpKTsKKyAgRVhQRUNUX1RSVUUoZmlsZXJlYWQtPlJlYWRCbG9jayhvdXRwdXRfYnVmZmVyLCAwLCAwKSk7CisgIEVYUEVDVF9FUSgweGJkLCBvdXRwdXRfYnVmZmVyWzBdKTsKKworICBtZW1zZXQob3V0cHV0X2J1ZmZlciwgMHhiZCwgc2l6ZW9mKG91dHB1dF9idWZmZXIpKTsKKyAgRVhQRUNUX1RSVUUoZmlsZXJlYWQtPlJlYWRCbG9jayhvdXRwdXRfYnVmZmVyLCAxLCAwKSk7CisgIEVYUEVDVF9FUSgweGJkLCBvdXRwdXRfYnVmZmVyWzBdKTsKKworICBtZW1zZXQob3V0cHV0X2J1ZmZlciwgMHhiZCwgc2l6ZW9mKG91dHB1dF9idWZmZXIpKTsKKyAgRVhQRUNUX1RSVUUoZmlsZXJlYWQtPlJlYWRCbG9jayhvdXRwdXRfYnVmZmVyLCAwLCAxKSk7CisgIEVYUEVDVF9FUSgwLCBtZW1jbXAob3V0cHV0X2J1ZmZlciwgIm8iLCAxKSk7CisgIEVYUEVDVF9FUSgweGJkLCBvdXRwdXRfYnVmZmVyWzFdKTsKKworICBtZW1zZXQob3V0cHV0X2J1ZmZlciwgMHhiZCwgc2l6ZW9mKG91dHB1dF9idWZmZXIpKTsKKyAgRVhQRUNUX1RSVUUoZmlsZXJlYWQtPlJlYWRCbG9jayhvdXRwdXRfYnVmZmVyLCAwLCBzaXplb2Yob3V0cHV0X2J1ZmZlcikpKTsKKyAgRVhQRUNUX0VRKDAsIG1lbWNtcChvdXRwdXRfYnVmZmVyLCAib25lIHR3byB0aHJlZSEhISIsIDE2KSk7CisKKyAgbWVtc2V0KG91dHB1dF9idWZmZXIsIDB4YmQsIHNpemVvZihvdXRwdXRfYnVmZmVyKSk7CisgIEVYUEVDVF9UUlVFKGZpbGVyZWFkLT5SZWFkQmxvY2sob3V0cHV0X2J1ZmZlciwgMiwgMTApKTsKKyAgRVhQRUNUX0VRKDAsIG1lbWNtcChvdXRwdXRfYnVmZmVyLCAiZSB0d28gdGhyZSIsIDEwKSk7CisgIEVYUEVDVF9FUSgweGJkLCBvdXRwdXRfYnVmZmVyWzExXSk7CisKKyAgbWVtc2V0KG91dHB1dF9idWZmZXIsIDB4YmQsIHNpemVvZihvdXRwdXRfYnVmZmVyKSk7CisgIEVYUEVDVF9GQUxTRShmaWxlcmVhZC0+UmVhZEJsb2NrKG91dHB1dF9idWZmZXIsIDEsIHNpemVvZihvdXRwdXRfYnVmZmVyKSkpOworICBFWFBFQ1RfRVEoMCwgbWVtY21wKG91dHB1dF9idWZmZXIsICJuZSB0d28gdGhyZWUhISEiLCAxNSkpOworICBFWFBFQ1RfRVEoMHhiZCwgb3V0cHV0X2J1ZmZlclsxNV0pOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jZnhfc2Vla2FibGVzdHJlYW1wcm94eS5jcHAgYi9jb3JlL2Z4Y3J0L2NmeF9zZWVrYWJsZXN0cmVhbXByb3h5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODljNDQwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9jZnhfc2Vla2FibGVzdHJlYW1wcm94eS5jcHAKQEAgLTAsMCArMSwyODYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3NlZWthYmxlc3RyZWFtcHJveHkuaCIKKworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisjaW5jbHVkZSA8aW8uaD4KKyNlbmRpZiAgLy8gX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfbWVtb3J5c3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb2RlcGFnZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworLy8gUmV0dXJucyB7c3JjIGJ5dGVzIGNvbnN1bWVkLCBkc3QgYnl0ZXMgcHJvZHVjZWR9Lgorc3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PiBVVEY4RGVjb2RlKGNvbnN0IGNoYXIqIHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNyY0xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90KiBwRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkc3RMZW4pIHsKKyAgQVNTRVJUKHBEc3QgJiYgZHN0TGVuID4gMCk7CisKKyAgaWYgKHNyY0xlbiA8IDEpCisgICAgcmV0dXJuIHswLCAwfTsKKworICB1aW50MzJfdCBkd0NvZGUgPSAwOworICBpbnQzMl90IGlQZW5kaW5nID0gMDsKKyAgc2l6ZV90IGlTcmNOdW0gPSAwOworICBzaXplX3QgaURzdE51bSA9IDA7CisgIHNpemVfdCBpSW5kZXggPSAwOworICBpbnQzMl90IGsgPSAxOworICB3aGlsZSAoaUluZGV4IDwgc3JjTGVuKSB7CisgICAgdWludDhfdCBieXRlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oKihwU3JjICsgaUluZGV4KSk7CisgICAgaWYgKGJ5dGUgPCAweDgwKSB7CisgICAgICBpUGVuZGluZyA9IDA7CisgICAgICBrID0gMTsKKyAgICAgIGlEc3ROdW0rKzsKKyAgICAgIGlTcmNOdW0gKz0gazsKKyAgICAgICpwRHN0KysgPSBieXRlOworICAgICAgaWYgKGlEc3ROdW0gPj0gZHN0TGVuKQorICAgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKGJ5dGUgPCAweGMwKSB7CisgICAgICBpZiAoaVBlbmRpbmcgPCAxKQorICAgICAgICBicmVhazsKKworICAgICAgaVBlbmRpbmctLTsKKyAgICAgIGR3Q29kZSB8PSAoYnl0ZSAmIDB4M2YpIDw8IChpUGVuZGluZyAqIDYpOworICAgICAgaWYgKGlQZW5kaW5nID09IDApIHsKKyAgICAgICAgaURzdE51bSsrOworICAgICAgICBpU3JjTnVtICs9IGs7CisgICAgICAgICpwRHN0KysgPSBkd0NvZGU7CisgICAgICAgIGlmIChpRHN0TnVtID49IGRzdExlbikKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGJ5dGUgPCAweGUwKSB7CisgICAgICBpUGVuZGluZyA9IDE7CisgICAgICBrID0gMjsKKyAgICAgIGR3Q29kZSA9IChieXRlICYgMHgxZikgPDwgNjsKKyAgICB9IGVsc2UgaWYgKGJ5dGUgPCAweGYwKSB7CisgICAgICBpUGVuZGluZyA9IDI7CisgICAgICBrID0gMzsKKyAgICAgIGR3Q29kZSA9IChieXRlICYgMHgwZikgPDwgMTI7CisgICAgfSBlbHNlIGlmIChieXRlIDwgMHhmOCkgeworICAgICAgaVBlbmRpbmcgPSAzOworICAgICAgayA9IDQ7CisgICAgICBkd0NvZGUgPSAoYnl0ZSAmIDB4MDcpIDw8IDE4OworICAgIH0gZWxzZSBpZiAoYnl0ZSA8IDB4ZmMpIHsKKyAgICAgIGlQZW5kaW5nID0gNDsKKyAgICAgIGsgPSA1OworICAgICAgZHdDb2RlID0gKGJ5dGUgJiAweDAzKSA8PCAyNDsKKyAgICB9IGVsc2UgaWYgKGJ5dGUgPCAweGZlKSB7CisgICAgICBpUGVuZGluZyA9IDU7CisgICAgICBrID0gNjsKKyAgICAgIGR3Q29kZSA9IChieXRlICYgMHgwMSkgPDwgMzA7CisgICAgfSBlbHNlIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpSW5kZXgrKzsKKyAgfQorICByZXR1cm4ge2lTcmNOdW0sIGlEc3ROdW19OworfQorCit2b2lkIFVURjE2VG9XQ2hhcih2b2lkKiBwQnVmZmVyLCBzaXplX3QgaUxlbmd0aCkgeworICBBU1NFUlQocEJ1ZmZlcik7CisgIEFTU0VSVChpTGVuZ3RoID4gMCk7CisgIEFTU0VSVChzaXplb2Yod2NoYXJfdCkgPiAyKTsKKworICB1aW50MTZfdCogcFNyYyA9IHN0YXRpY19jYXN0PHVpbnQxNl90Kj4ocEJ1ZmZlcik7CisgIHdjaGFyX3QqIHBEc3QgPSBzdGF0aWNfY2FzdDx3Y2hhcl90Kj4ocEJ1ZmZlcik7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaUxlbmd0aDsgaSsrKQorICAgIHBEc3RbaV0gPSBzdGF0aWNfY2FzdDx3Y2hhcl90PihwU3JjW2ldKTsKK30KKwordm9pZCBTd2FwQnl0ZU9yZGVyKHdjaGFyX3QqIHBTdHIsIHNpemVfdCBpTGVuZ3RoKSB7CisgIEFTU0VSVChwU3RyKTsKKworICB1aW50MTZfdCB3Y2g7CisgIGlmIChzaXplb2Yod2NoYXJfdCkgPiAyKSB7CisgICAgd2hpbGUgKGlMZW5ndGgtLSA+IDApIHsKKyAgICAgIHdjaCA9IHN0YXRpY19jYXN0PHVpbnQxNl90PigqcFN0cik7CisgICAgICB3Y2ggPSAod2NoID4+IDgpIHwgKHdjaCA8PCA4KTsKKyAgICAgIHdjaCAmPSAweDAwRkY7CisgICAgICAqcFN0ciA9IHdjaDsKKyAgICAgICsrcFN0cjsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgd2hpbGUgKGlMZW5ndGgtLSA+IDApIHsKKyAgICB3Y2ggPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oKnBTdHIpOworICAgIHdjaCA9ICh3Y2ggPj4gOCkgfCAod2NoIDw8IDgpOworICAgICpwU3RyID0gd2NoOworICAgICsrcFN0cjsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKKworI2RlZmluZSBCT01fTUFTSyAweDAwRkZGRkZGCisjZGVmaW5lIEJPTV9VVEY4IDB4MDBCRkJCRUYKKyNkZWZpbmUgQk9NX1VURjE2X01BU0sgMHgwMDAwRkZGRgorI2RlZmluZSBCT01fVVRGMTZfQkUgMHgwMDAwRkZGRQorI2RlZmluZSBCT01fVVRGMTZfTEUgMHgwMDAwRkVGRgorCitDRlhfU2Vla2FibGVTdHJlYW1Qcm94eTo6Q0ZYX1NlZWthYmxlU3RyZWFtUHJveHkoCisgICAgY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVN0cmVhbT4mIHN0cmVhbSwKKyAgICBib29sIGlzV3JpdGVTdHJlYW0pCisgICAgOiBtX0lzV3JpdGVTdHJlYW0oaXNXcml0ZVN0cmVhbSksCisgICAgICBtX3dDb2RlUGFnZShGWF9DT0RFUEFHRV9EZWZBTlNJKSwKKyAgICAgIG1fd0JPTUxlbmd0aCgwKSwKKyAgICAgIG1faVBvc2l0aW9uKDApLAorICAgICAgbV9wU3RyZWFtKHN0cmVhbSkgeworICBBU1NFUlQobV9wU3RyZWFtKTsKKworICBpZiAoaXNXcml0ZVN0cmVhbSkgeworICAgIG1faVBvc2l0aW9uID0gbV9wU3RyZWFtLT5HZXRTaXplKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgU2VlayhGcm9tOjpCZWdpbiwgMCk7CisKKyAgdWludDMyX3QgYm9tID0gMDsKKyAgUmVhZERhdGEocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oJmJvbSksIDMpOworCisgIGJvbSAmPSBCT01fTUFTSzsKKyAgaWYgKGJvbSA9PSBCT01fVVRGOCkgeworICAgIG1fd0JPTUxlbmd0aCA9IDM7CisgICAgbV93Q29kZVBhZ2UgPSBGWF9DT0RFUEFHRV9VVEY4OworICB9IGVsc2UgeworICAgIGJvbSAmPSBCT01fVVRGMTZfTUFTSzsKKyAgICBpZiAoYm9tID09IEJPTV9VVEYxNl9CRSkgeworICAgICAgbV93Qk9NTGVuZ3RoID0gMjsKKyAgICAgIG1fd0NvZGVQYWdlID0gRlhfQ09ERVBBR0VfVVRGMTZCRTsKKyAgICB9IGVsc2UgaWYgKGJvbSA9PSBCT01fVVRGMTZfTEUpIHsKKyAgICAgIG1fd0JPTUxlbmd0aCA9IDI7CisgICAgICBtX3dDb2RlUGFnZSA9IEZYX0NPREVQQUdFX1VURjE2TEU7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fd0JPTUxlbmd0aCA9IDA7CisgICAgICBtX3dDb2RlUGFnZSA9IEZYU1lTX0dldEFDUCgpOworICAgIH0KKyAgfQorCisgIFNlZWsoRnJvbTo6QmVnaW4sIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX3dCT01MZW5ndGgpKTsKK30KKworQ0ZYX1NlZWthYmxlU3RyZWFtUHJveHk6OkNGWF9TZWVrYWJsZVN0cmVhbVByb3h5KHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKQorICAgIDogQ0ZYX1NlZWthYmxlU3RyZWFtUHJveHkoCisgICAgICAgICAgcGRmaXVtOjpNYWtlUmV0YWluPENGWF9NZW1vcnlTdHJlYW0+KGRhdGEsIHNpemUsIGZhbHNlKSwKKyAgICAgICAgICBmYWxzZSkge30KKworQ0ZYX1NlZWthYmxlU3RyZWFtUHJveHk6On5DRlhfU2Vla2FibGVTdHJlYW1Qcm94eSgpIHt9CisKK3ZvaWQgQ0ZYX1NlZWthYmxlU3RyZWFtUHJveHk6OlNlZWsoRnJvbSBlU2VlaywgRlhfRklMRVNJWkUgaU9mZnNldCkgeworICBzd2l0Y2ggKGVTZWVrKSB7CisgICAgY2FzZSBGcm9tOjpCZWdpbjoKKyAgICAgIG1faVBvc2l0aW9uID0gaU9mZnNldDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRnJvbTo6Q3VycmVudDogeworICAgICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxGWF9GSUxFU0laRT4gbmV3X3BvcyA9IG1faVBvc2l0aW9uOworICAgICAgbmV3X3BvcyArPSBpT2Zmc2V0OworICAgICAgbV9pUG9zaXRpb24gPQorICAgICAgICAgIG5ld19wb3MuVmFsdWVPckRlZmF1bHQoc3RkOjpudW1lcmljX2xpbWl0czxGWF9GSUxFU0laRT46Om1heCgpKTsKKyAgICB9IGJyZWFrOworICB9CisgIG1faVBvc2l0aW9uID0KKyAgICAgIHBkZml1bTo6Y2xhbXAobV9pUG9zaXRpb24sIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPigwKSwgR2V0TGVuZ3RoKCkpOworfQorCit2b2lkIENGWF9TZWVrYWJsZVN0cmVhbVByb3h5OjpTZXRDb2RlUGFnZSh1aW50MTZfdCB3Q29kZVBhZ2UpIHsKKyAgaWYgKG1fd0JPTUxlbmd0aCA+IDApCisgICAgcmV0dXJuOworICBtX3dDb2RlUGFnZSA9IHdDb2RlUGFnZTsKK30KKworc2l6ZV90IENGWF9TZWVrYWJsZVN0cmVhbVByb3h5OjpSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBzaXplX3QgaUJ1ZmZlclNpemUpIHsKKyAgQVNTRVJUKHBCdWZmZXIgJiYgaUJ1ZmZlclNpemUgPiAwKTsKKworICBpZiAobV9Jc1dyaXRlU3RyZWFtKQorICAgIHJldHVybiAwOworCisgIGlCdWZmZXJTaXplID0KKyAgICAgIHN0ZDo6bWluKGlCdWZmZXJTaXplLCBzdGF0aWNfY2FzdDxzaXplX3Q+KEdldExlbmd0aCgpIC0gbV9pUG9zaXRpb24pKTsKKyAgaWYgKGlCdWZmZXJTaXplIDw9IDApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCFtX3BTdHJlYW0tPlJlYWRCbG9jayhwQnVmZmVyLCBtX2lQb3NpdGlvbiwgaUJ1ZmZlclNpemUpKQorICAgIHJldHVybiAwOworCisgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8RlhfRklMRVNJWkU+IG5ld19wb3MgPSBtX2lQb3NpdGlvbjsKKyAgbmV3X3BvcyArPSBpQnVmZmVyU2l6ZTsKKyAgbV9pUG9zaXRpb24gPSBuZXdfcG9zLlZhbHVlT3JEZWZhdWx0KG1faVBvc2l0aW9uKTsKKyAgcmV0dXJuIG5ld19wb3MuSXNWYWxpZCgpID8gaUJ1ZmZlclNpemUgOiAwOworfQorCitzaXplX3QgQ0ZYX1NlZWthYmxlU3RyZWFtUHJveHk6OlJlYWRTdHJpbmcod2NoYXJfdCogcFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaU1heExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBiRU9TKSB7CisgIGlmICghcFN0ciB8fCBpTWF4TGVuZ3RoID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKG1fSXNXcml0ZVN0cmVhbSkKKyAgICByZXR1cm4gMDsKKworICBpZiAobV93Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGMTZMRSB8fAorICAgICAgbV93Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGMTZCRSkgeworICAgIHNpemVfdCBpQnl0ZXMgPSBpTWF4TGVuZ3RoICogMjsKKyAgICBzaXplX3QgaUxlbiA9IFJlYWREYXRhKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHBTdHIpLCBpQnl0ZXMpOworICAgIGlNYXhMZW5ndGggPSBpTGVuIC8gMjsKKyAgICBpZiAoc2l6ZW9mKHdjaGFyX3QpID4gMiAmJiBpTWF4TGVuZ3RoID4gMCkKKyAgICAgIFVURjE2VG9XQ2hhcihwU3RyLCBpTWF4TGVuZ3RoKTsKKworICAgIGlmIChtX3dDb2RlUGFnZSA9PSBGWF9DT0RFUEFHRV9VVEYxNkJFKQorICAgICAgU3dhcEJ5dGVPcmRlcihwU3RyLCBpTWF4TGVuZ3RoKTsKKworICB9IGVsc2UgeworICAgIEZYX0ZJTEVTSVpFIHBvcyA9IEdldFBvc2l0aW9uKCk7CisgICAgc2l6ZV90IGlCeXRlcyA9CisgICAgICAgIHN0ZDo6bWluKGlNYXhMZW5ndGgsIHN0YXRpY19jYXN0PHNpemVfdD4oR2V0TGVuZ3RoKCkgLSBwb3MpKTsKKworICAgIGlmIChpQnl0ZXMgPiAwKSB7CisgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBidWYoaUJ5dGVzKTsKKworICAgICAgc2l6ZV90IGlMZW4gPSBSZWFkRGF0YShidWYuZGF0YSgpLCBpQnl0ZXMpOworICAgICAgaWYgKG1fd0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjgpCisgICAgICAgIHJldHVybiAwOworCisgICAgICBzaXplX3QgaVNyYyA9IDA7CisgICAgICBzdGQ6OnRpZShpU3JjLCBpTWF4TGVuZ3RoKSA9IFVURjhEZWNvZGUoCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYnVmLmRhdGEoKSksIGlMZW4sIHBTdHIsIGlNYXhMZW5ndGgpOworICAgICAgU2VlayhGcm9tOjpDdXJyZW50LCBpU3JjIC0gaUxlbik7CisgICAgfSBlbHNlIHsKKyAgICAgIGlNYXhMZW5ndGggPSAwOworICAgIH0KKyAgfQorCisgICpiRU9TID0gSXNFT0YoKTsKKyAgcmV0dXJuIGlNYXhMZW5ndGg7Cit9CisKK3ZvaWQgQ0ZYX1NlZWthYmxlU3RyZWFtUHJveHk6OldyaXRlU3RyaW5nKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBzdHIpIHsKKyAgaWYgKCFtX0lzV3JpdGVTdHJlYW0gfHwgc3RyLkdldExlbmd0aCgpID09IDAgfHwKKyAgICAgIG1fd0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjgpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFtX3BTdHJlYW0tPldyaXRlQmxvY2soc3RyLnVudGVybWluYXRlZF9jX3N0cigpLCBtX2lQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLkdldExlbmd0aCgpICogc2l6ZW9mKHdjaGFyX3QpKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8RlhfRklMRVNJWkU+IG5ld19wb3MgPSBtX2lQb3NpdGlvbjsKKyAgbmV3X3BvcyArPSBzdHIuR2V0TGVuZ3RoKCkgKiBzaXplb2Yod2NoYXJfdCk7CisgIG1faVBvc2l0aW9uID0gbmV3X3Bvcy5WYWx1ZU9yRGVmYXVsdChzdGQ6Om51bWVyaWNfbGltaXRzPEZYX0ZJTEVTSVpFPjo6bWF4KCkpOworICBtX2lQb3NpdGlvbiA9CisgICAgICBwZGZpdW06OmNsYW1wKG1faVBvc2l0aW9uLCBzdGF0aWNfY2FzdDxGWF9GSUxFU0laRT4oMCksIEdldExlbmd0aCgpKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY2Z4X3NlZWthYmxlc3RyZWFtcHJveHkuaCBiL2NvcmUvZnhjcnQvY2Z4X3NlZWthYmxlc3RyZWFtcHJveHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjVhYjNjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9jZnhfc2Vla2FibGVzdHJlYW1wcm94eS5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX0NGWF9TRUVLQUJMRVNUUkVBTVBST1hZX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfQ0ZYX1NFRUtBQkxFU1RSRUFNUFJPWFlfSF8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKworY2xhc3MgQ0ZYX1NlZWthYmxlU3RyZWFtUHJveHkgOiBwdWJsaWMgUmV0YWluYWJsZSB7CisgcHVibGljOgorICBlbnVtIGNsYXNzIEZyb20geworICAgIEJlZ2luID0gMCwKKyAgICBDdXJyZW50LAorICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgorICBmcmllbmQgUmV0YWluUHRyPFQ+IHBkZml1bTo6TWFrZVJldGFpbihBcmdzJiYuLi4gYXJncyk7CisKKyAgRlhfRklMRVNJWkUgR2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9wU3RyZWFtLT5HZXRTaXplKCk7IH0KKyAgRlhfRklMRVNJWkUgR2V0UG9zaXRpb24oKSB7IHJldHVybiBtX2lQb3NpdGlvbjsgfQorICBzaXplX3QgR2V0Qk9NTGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV93Qk9NTGVuZ3RoOyB9CisgIGJvb2wgSXNFT0YoKSBjb25zdCB7IHJldHVybiBtX2lQb3NpdGlvbiA+PSBHZXRMZW5ndGgoKTsgfQorCisgIHZvaWQgU2VlayhGcm9tIGVTZWVrLCBGWF9GSUxFU0laRSBpT2Zmc2V0KTsKKyAgc2l6ZV90IFJlYWRTdHJpbmcod2NoYXJfdCogcFN0ciwgc2l6ZV90IGlNYXhMZW5ndGgsIGJvb2wqIGJFT1MpOworCisgIHZvaWQgV3JpdGVTdHJpbmcoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHN0cik7CisKKyAgdWludDE2X3QgR2V0Q29kZVBhZ2UoKSBjb25zdCB7IHJldHVybiBtX3dDb2RlUGFnZTsgfQorICB2b2lkIFNldENvZGVQYWdlKHVpbnQxNl90IHdDb2RlUGFnZSk7CisKKyBwcml2YXRlOgorICBDRlhfU2Vla2FibGVTdHJlYW1Qcm94eShjb25zdCBSZXRhaW5QdHI8SUZYX1NlZWthYmxlU3RyZWFtPiYgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzV3JpdGVTdGVhbSk7CisgIENGWF9TZWVrYWJsZVN0cmVhbVByb3h5KHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKTsKKyAgfkNGWF9TZWVrYWJsZVN0cmVhbVByb3h5KCkgb3ZlcnJpZGU7CisKKyAgc2l6ZV90IFJlYWREYXRhKHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBpQnVmZmVyU2l6ZSk7CisKKyAgYm9vbCBtX0lzV3JpdGVTdHJlYW07CisgIHVpbnQxNl90IG1fd0NvZGVQYWdlOworICBzaXplX3QgbV93Qk9NTGVuZ3RoOworICBGWF9GSUxFU0laRSBtX2lQb3NpdGlvbjsKKyAgUmV0YWluUHRyPElGWF9TZWVrYWJsZVN0cmVhbT4gbV9wU3RyZWFtOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0NGWF9TRUVLQUJMRVNUUkVBTVBST1hZX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2NmeF9zaGFyZWRfY29weV9vbl93cml0ZS5oIGIvY29yZS9meGNydC9jZnhfc2hhcmVkX2NvcHlfb25fd3JpdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg3ZDk2NS4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Y3J0L2NmeF9zaGFyZWRfY29weV9vbl93cml0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlhDUlRfQ0ZYX1NIQVJFRF9DT1BZX09OX1dSSVRFX0hfCi0jZGVmaW5lIENPUkVfRlhDUlRfQ0ZYX1NIQVJFRF9DT1BZX09OX1dSSVRFX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLQotLy8gQSBzaGFyZWQgb2JqZWN0IHdpdGggQ29weSBvbiBXcml0ZSBzZW1hbnRpY3MgdGhhdCBtYWtlcyBpdCBhcHBlYXIgYXMKLS8vIGlmIGVhY2ggb25lIHdlcmUgaW5kZXBlbmRlbnQuCi10ZW1wbGF0ZSA8Y2xhc3MgT2JqQ2xhc3M+Ci1jbGFzcyBDRlhfU2hhcmVkQ29weU9uV3JpdGUgewotIHB1YmxpYzoKLSAgQ0ZYX1NoYXJlZENvcHlPbldyaXRlKCkge30KLSAgQ0ZYX1NoYXJlZENvcHlPbldyaXRlKGNvbnN0IENGWF9TaGFyZWRDb3B5T25Xcml0ZSYgb3RoZXIpCi0gICAgICA6IG1fcE9iamVjdChvdGhlci5tX3BPYmplY3QpIHt9Ci0gIH5DRlhfU2hhcmVkQ29weU9uV3JpdGUoKSB7fQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPgotICBPYmpDbGFzcyogRW1wbGFjZShBcmdzLi4uIHBhcmFtcykgewotICAgIG1fcE9iamVjdC5SZXNldChuZXcgQ291bnRlZE9iaihwYXJhbXMuLi4pKTsKLSAgICByZXR1cm4gbV9wT2JqZWN0LkdldCgpOwotICB9Ci0KLSAgQ0ZYX1NoYXJlZENvcHlPbldyaXRlJiBvcGVyYXRvcj0oY29uc3QgQ0ZYX1NoYXJlZENvcHlPbldyaXRlJiB0aGF0KSB7Ci0gICAgaWYgKCp0aGlzICE9IHRoYXQpCi0gICAgICBtX3BPYmplY3QgPSB0aGF0Lm1fcE9iamVjdDsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICB2b2lkIFNldE51bGwoKSB7IG1fcE9iamVjdC5SZXNldCgpOyB9Ci0gIGNvbnN0IE9iakNsYXNzKiBHZXRPYmplY3QoKSBjb25zdCB7IHJldHVybiBtX3BPYmplY3QuR2V0KCk7IH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJncz4KLSAgT2JqQ2xhc3MqIEdldFByaXZhdGVDb3B5KEFyZ3MuLi4gcGFyYW1zKSB7Ci0gICAgaWYgKCFtX3BPYmplY3QpCi0gICAgICByZXR1cm4gRW1wbGFjZShwYXJhbXMuLi4pOwotICAgIGlmICghbV9wT2JqZWN0LT5IYXNPbmVSZWYoKSkKLSAgICAgIG1fcE9iamVjdC5SZXNldChuZXcgQ291bnRlZE9iaigqbV9wT2JqZWN0KSk7Ci0gICAgcmV0dXJuIG1fcE9iamVjdC5HZXQoKTsKLSAgfQotCi0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDRlhfU2hhcmVkQ29weU9uV3JpdGUmIHRoYXQpIGNvbnN0IHsKLSAgICByZXR1cm4gbV9wT2JqZWN0ID09IHRoYXQubV9wT2JqZWN0OwotICB9Ci0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDRlhfU2hhcmVkQ29weU9uV3JpdGUmIHRoYXQpIGNvbnN0IHsKLSAgICByZXR1cm4gISgqdGhpcyA9PSB0aGF0KTsKLSAgfQotICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gISFtX3BPYmplY3Q7IH0KLQotIHByaXZhdGU6Ci0gIGNsYXNzIENvdW50ZWRPYmogOiBwdWJsaWMgT2JqQ2xhc3MgewotICAgcHVibGljOgotICAgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdzPgotICAgIC8vIE5PTElOVE5FWFRMSU5FKHJ1bnRpbWUvZXhwbGljaXQpCi0gICAgQ291bnRlZE9iaihBcmdzLi4uIHBhcmFtcykgOiBPYmpDbGFzcyhwYXJhbXMuLi4pLCBtX1JlZkNvdW50KDApIHt9Ci0KLSAgICBDb3VudGVkT2JqKGNvbnN0IENvdW50ZWRPYmomIHNyYykgOiBPYmpDbGFzcyhzcmMpLCBtX1JlZkNvdW50KDApIHt9Ci0gICAgfkNvdW50ZWRPYmooKSB7IG1fUmVmQ291bnQgPSAwOyB9Ci0KLSAgICBib29sIEhhc09uZVJlZigpIGNvbnN0IHsgcmV0dXJuIG1fUmVmQ291bnQgPT0gMTsgfQotICAgIHZvaWQgUmV0YWluKCkgeyBtX1JlZkNvdW50Kys7IH0KLSAgICB2b2lkIFJlbGVhc2UoKSB7Ci0gICAgICBBU1NFUlQobV9SZWZDb3VudCk7Ci0gICAgICBpZiAoLS1tX1JlZkNvdW50ID09IDApCi0gICAgICAgIGRlbGV0ZSB0aGlzOwotICAgIH0KLQotICAgcHJpdmF0ZToKLSAgICAvLyBUbyBlbnN1cmUgcmVmIGNvdW50cyBkbyBub3Qgb3ZlcmZsb3csIGNvbnNpZGVyIHRoZSB3b3JzdCBwb3NzaWJsZSBjYXNlOgotICAgIC8vIHRoZSBlbnRpcmUgYWRkcmVzcyBzcGFjZSBjb250YWlucyBub3RoaW5nIGJ1dCBwb2ludGVycyB0byB0aGlzIG9iamVjdC4KLSAgICAvLyBTaW5jZSB0aGUgY291bnQgaW5jcmVtZW50cyB3aXRoIGVhY2ggbmV3IHBvaW50ZXIsIHRoZSBsYXJnZXN0IHZhbHVlIGlzCi0gICAgLy8gdGhlIG51bWJlciBvZiBwb2ludGVycyB0aGF0IGNhbiBmaXQgaW50byB0aGUgYWRkcmVzcyBzcGFjZS4gVGhlIHNpemUgb2YKLSAgICAvLyB0aGUgYWRkcmVzcyBzcGFjZSBpdHNlbGYgaXMgYSBnb29kIHVwcGVyIGJvdW5kIG9uIGl0LgotICAgIGludHB0cl90IG1fUmVmQ291bnQ7Ci0gIH07Ci0KLSAgQ0ZYX1JldGFpblB0cjxDb3VudGVkT2JqPiBtX3BPYmplY3Q7Ci19OwotCi0jZW5kaWYgIC8vIENPUkVfRlhDUlRfQ0ZYX1NIQVJFRF9DT1BZX09OX1dSSVRFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2NmeF9zaGFyZWRfY29weV9vbl93cml0ZV91bml0dGVzdC5jcHAgYi9jb3JlL2Z4Y3J0L2NmeF9zaGFyZWRfY29weV9vbl93cml0ZV91bml0dGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMjA1ZDguLjAwMDAwMDAKLS0tIGEvY29yZS9meGNydC9jZnhfc2hhcmVkX2NvcHlfb25fd3JpdGVfdW5pdHRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3NoYXJlZF9jb3B5X29uX3dyaXRlLmgiCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAidGVzdGluZy9meF9zdHJpbmdfdGVzdGhlbHBlcnMuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgT2JzZXJ2ZXIgewotIHB1YmxpYzoKLSAgdm9pZCBPbkNvbnN0cnVjdChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeyBjb25zdHJ1Y3Rpb25fY291bnRzX1tuYW1lXSsrOyB9Ci0gIHZvaWQgT25EZXN0cnVjdChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeyBkZXN0cnVjdGlvbl9jb3VudHNfW25hbWVdKys7IH0KLSAgaW50IEdldENvbnN0cnVjdGlvbkNvdW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgcmV0dXJuIGNvbnN0cnVjdGlvbl9jb3VudHNfW25hbWVdOwotICB9Ci0gIGludCBHZXREZXN0cnVjdGlvbkNvdW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7Ci0gICAgcmV0dXJuIGRlc3RydWN0aW9uX2NvdW50c19bbmFtZV07Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGNvbnN0cnVjdGlvbl9jb3VudHNfOwotICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBkZXN0cnVjdGlvbl9jb3VudHNfOwotfTsKLQotY2xhc3MgT2JqZWN0IHsKLSBwdWJsaWM6Ci0gIE9iamVjdChPYnNlcnZlciogb2JzZXJ2ZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKQotICAgICAgOiBuYW1lXyhuYW1lKSwgb2JzZXJ2ZXJfKG9ic2VydmVyKSB7Ci0gICAgb2JzZXJ2ZXItPk9uQ29uc3RydWN0KG5hbWVfKTsKLSAgfQotICBPYmplY3QoY29uc3QgT2JqZWN0JiB0aGF0KSA6IG5hbWVfKHRoYXQubmFtZV8pLCBvYnNlcnZlcl8odGhhdC5vYnNlcnZlcl8pIHsKLSAgICBvYnNlcnZlcl8tPk9uQ29uc3RydWN0KG5hbWVfKTsKLSAgfQotICB+T2JqZWN0KCkgeyBvYnNlcnZlcl8tPk9uRGVzdHJ1Y3QobmFtZV8pOyB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnN0cmluZyBuYW1lXzsKLSAgT2JzZXJ2ZXIqIG9ic2VydmVyXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1URVNUKGZ4Y3J0LCBTaGFyZWRDb3B5T25Xcml0ZU51bGwpIHsKLSAgT2JzZXJ2ZXIgb2JzZXJ2ZXI7Ci0gIHsKLSAgICBDRlhfU2hhcmVkQ29weU9uV3JpdGU8T2JqZWN0PiBwdHI7Ci0gICAgRVhQRUNUX0VRKG51bGxwdHIsIHB0ci5HZXRPYmplY3QoKSk7Ci0gIH0KLX0KLQotVEVTVChmeGNydCwgU2hhcmVkQ29weU9uV3JpdGVDb3B5KSB7Ci0gIE9ic2VydmVyIG9ic2VydmVyOwotICB7Ci0gICAgQ0ZYX1NoYXJlZENvcHlPbldyaXRlPE9iamVjdD4gcHRyMTsKLSAgICBwdHIxLkVtcGxhY2UoJm9ic2VydmVyLCBzdGQ6OnN0cmluZygib25lIikpOwotICAgIHsKLSAgICAgIENGWF9TaGFyZWRDb3B5T25Xcml0ZTxPYmplY3Q+IHB0cjIgPSBwdHIxOwotICAgICAgRVhQRUNUX0VRKDEsIG9ic2VydmVyLkdldENvbnN0cnVjdGlvbkNvdW50KCJvbmUiKSk7Ci0gICAgICBFWFBFQ1RfRVEoMCwgb2JzZXJ2ZXIuR2V0RGVzdHJ1Y3Rpb25Db3VudCgib25lIikpOwotICAgIH0KLSAgICB7Ci0gICAgICBDRlhfU2hhcmVkQ29weU9uV3JpdGU8T2JqZWN0PiBwdHIzKHB0cjEpOwotICAgICAgRVhQRUNUX0VRKDEsIG9ic2VydmVyLkdldENvbnN0cnVjdGlvbkNvdW50KCJvbmUiKSk7Ci0gICAgICBFWFBFQ1RfRVEoMCwgb2JzZXJ2ZXIuR2V0RGVzdHJ1Y3Rpb25Db3VudCgib25lIikpOwotICAgIH0KLSAgICBFWFBFQ1RfRVEoMSwgb2JzZXJ2ZXIuR2V0Q29uc3RydWN0aW9uQ291bnQoIm9uZSIpKTsKLSAgICBFWFBFQ1RfRVEoMCwgb2JzZXJ2ZXIuR2V0RGVzdHJ1Y3Rpb25Db3VudCgib25lIikpOwotICB9Ci0gIEVYUEVDVF9FUSgxLCBvYnNlcnZlci5HZXREZXN0cnVjdGlvbkNvdW50KCJvbmUiKSk7Ci19Ci0KLVRFU1QoZnhjcnQsIFNoYXJlZENvcHlPbldyaXRlQXNzaWduT3Zlck9sZCkgewotICBPYnNlcnZlciBvYnNlcnZlcjsKLSAgewotICAgIENGWF9TaGFyZWRDb3B5T25Xcml0ZTxPYmplY3Q+IHB0cjE7Ci0gICAgcHRyMS5FbXBsYWNlKCZvYnNlcnZlciwgc3RkOjpzdHJpbmcoIm9uZSIpKTsKLSAgICBwdHIxLkVtcGxhY2UoJm9ic2VydmVyLCBzdGQ6OnN0cmluZygidHdvIikpOwotICAgIEVYUEVDVF9FUSgxLCBvYnNlcnZlci5HZXRDb25zdHJ1Y3Rpb25Db3VudCgib25lIikpOwotICAgIEVYUEVDVF9FUSgxLCBvYnNlcnZlci5HZXRDb25zdHJ1Y3Rpb25Db3VudCgidHdvIikpOwotICAgIEVYUEVDVF9FUSgxLCBvYnNlcnZlci5HZXREZXN0cnVjdGlvbkNvdW50KCJvbmUiKSk7Ci0gICAgRVhQRUNUX0VRKDAsIG9ic2VydmVyLkdldERlc3RydWN0aW9uQ291bnQoInR3byIpKTsKLSAgfQotICBFWFBFQ1RfRVEoMSwgb2JzZXJ2ZXIuR2V0RGVzdHJ1Y3Rpb25Db3VudCgidHdvIikpOwotfQotCi1URVNUKGZ4Y3J0LCBTaGFyZWRDb3B5T25Xcml0ZUFzc2lnbk92ZXJSZXRhaW5lZCkgewotICBPYnNlcnZlciBvYnNlcnZlcjsKLSAgewotICAgIENGWF9TaGFyZWRDb3B5T25Xcml0ZTxPYmplY3Q+IHB0cjE7Ci0gICAgcHRyMS5FbXBsYWNlKCZvYnNlcnZlciwgc3RkOjpzdHJpbmcoIm9uZSIpKTsKLSAgICBDRlhfU2hhcmVkQ29weU9uV3JpdGU8T2JqZWN0PiBwdHIyKHB0cjEpOwotICAgIHB0cjEuRW1wbGFjZSgmb2JzZXJ2ZXIsIHN0ZDo6c3RyaW5nKCJ0d28iKSk7Ci0gICAgRVhQRUNUX0VRKDEsIG9ic2VydmVyLkdldENvbnN0cnVjdGlvbkNvdW50KCJvbmUiKSk7Ci0gICAgRVhQRUNUX0VRKDEsIG9ic2VydmVyLkdldENvbnN0cnVjdGlvbkNvdW50KCJ0d28iKSk7Ci0gICAgRVhQRUNUX0VRKDAsIG9ic2VydmVyLkdldERlc3RydWN0aW9uQ291bnQoIm9uZSIpKTsKLSAgICBFWFBFQ1RfRVEoMCwgb2JzZXJ2ZXIuR2V0RGVzdHJ1Y3Rpb25Db3VudCgidHdvIikpOwotICB9Ci0gIEVYUEVDVF9FUSgxLCBvYnNlcnZlci5HZXREZXN0cnVjdGlvbkNvdW50KCJvbmUiKSk7Ci0gIEVYUEVDVF9FUSgxLCBvYnNlcnZlci5HZXREZXN0cnVjdGlvbkNvdW50KCJ0d28iKSk7Ci19Ci0KLVRFU1QoZnhjcnQsIFNoYXJlZENvcHlPbldyaXRlR2V0TW9kaWZ5KSB7Ci0gIE9ic2VydmVyIG9ic2VydmVyOwotICB7Ci0gICAgQ0ZYX1NoYXJlZENvcHlPbldyaXRlPE9iamVjdD4gcHRyOwotICAgIEVYUEVDVF9ORShudWxscHRyLCBwdHIuR2V0UHJpdmF0ZUNvcHkoJm9ic2VydmVyLCBzdGQ6OnN0cmluZygib25lIikpKTsKLSAgICBFWFBFQ1RfRVEoMSwgb2JzZXJ2ZXIuR2V0Q29uc3RydWN0aW9uQ291bnQoIm9uZSIpKTsKLSAgICBFWFBFQ1RfRVEoMCwgb2JzZXJ2ZXIuR2V0RGVzdHJ1Y3Rpb25Db3VudCgib25lIikpOwotCi0gICAgRVhQRUNUX05FKG51bGxwdHIsIHB0ci5HZXRQcml2YXRlQ29weSgmb2JzZXJ2ZXIsIHN0ZDo6c3RyaW5nKCJvbmUiKSkpOwotICAgIEVYUEVDVF9FUSgxLCBvYnNlcnZlci5HZXRDb25zdHJ1Y3Rpb25Db3VudCgib25lIikpOwotICAgIEVYUEVDVF9FUSgwLCBvYnNlcnZlci5HZXREZXN0cnVjdGlvbkNvdW50KCJvbmUiKSk7Ci0gICAgewotICAgICAgQ0ZYX1NoYXJlZENvcHlPbldyaXRlPE9iamVjdD4gb3RoZXIocHRyKTsKLSAgICAgIEVYUEVDVF9ORShudWxscHRyLCBwdHIuR2V0UHJpdmF0ZUNvcHkoJm9ic2VydmVyLCBzdGQ6OnN0cmluZygib25lIikpKTsKLSAgICAgIEVYUEVDVF9FUSgyLCBvYnNlcnZlci5HZXRDb25zdHJ1Y3Rpb25Db3VudCgib25lIikpOwotICAgICAgRVhQRUNUX0VRKDAsIG9ic2VydmVyLkdldERlc3RydWN0aW9uQ291bnQoIm9uZSIpKTsKLSAgICB9Ci0gICAgRVhQRUNUX0VRKDIsIG9ic2VydmVyLkdldENvbnN0cnVjdGlvbkNvdW50KCJvbmUiKSk7Ci0gICAgRVhQRUNUX0VRKDEsIG9ic2VydmVyLkdldERlc3RydWN0aW9uQ291bnQoIm9uZSIpKTsKLSAgfQotICBFWFBFQ1RfRVEoMiwgb2JzZXJ2ZXIuR2V0RGVzdHJ1Y3Rpb25Db3VudCgib25lIikpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jZnhfc3RyaW5nX2NfdGVtcGxhdGUuaCBiL2NvcmUvZnhjcnQvY2Z4X3N0cmluZ19jX3RlbXBsYXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZmNjOTEuLjAwMDAwMDAKLS0tIGEvY29yZS9meGNydC9jZnhfc3RyaW5nX2NfdGVtcGxhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgQ09SRV9GWENSVF9DRlhfU1RSSU5HX0NfVEVNUExBVEVfSF8KLSNkZWZpbmUgQ09SRV9GWENSVF9DRlhfU1RSSU5HX0NfVEVNUExBVEVfSF8KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0KLS8vIEFuIGltbXV0YWJsZSBzdHJpbmcgd2l0aCBjYWxsZXItcHJvdmlkZWQgc3RvcmFnZSB3aGljaCBtdXN0IG91dGxpdmUgdGhlCi0vLyBzdHJpbmcgaXRzZWxmLiBUaGVzZSBhcmUgbm90IG5lY2Vzc2FyaWx5IG51bC10ZXJtaW5hdGVkLCBzbyB0aGF0IHN1YnN0cmluZwotLy8gZXh0cmFjdGlvbiAodmlhIHRoZSBNaWQoKSwgTGVmdCgpLCBhbmQgUmlnaHQoKSBtZXRob2RzKSBpcyBjb3B5LWZyZWUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIENGWF9TdHJpbmdDVGVtcGxhdGUgewotIHB1YmxpYzoKLSAgdXNpbmcgQ2hhclR5cGUgPSBUOwotICB1c2luZyBVbnNpZ25lZFR5cGUgPSB0eXBlbmFtZSBzdGQ6Om1ha2VfdW5zaWduZWQ8Q2hhclR5cGU+Ojp0eXBlOwotCi0gIENGWF9TdHJpbmdDVGVtcGxhdGUoKSA6IG1fUHRyKG51bGxwdHIpLCBtX0xlbmd0aCgwKSB7fQotCi0gIC8vIERlbGliZXJhdGVseSBpbXBsaWNpdCB0byBhdm9pZCBjYWxsaW5nIG9uIGV2ZXJ5IHN0cmluZyBsaXRlcmFsLgotICAvLyBOT0xJTlRORVhUTElORShydW50aW1lL2V4cGxpY2l0KQotICBDRlhfU3RyaW5nQ1RlbXBsYXRlKGNvbnN0IENoYXJUeXBlKiBwdHIpCi0gICAgICA6IG1fUHRyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVW5zaWduZWRUeXBlKj4ocHRyKSksCi0gICAgICAgIG1fTGVuZ3RoKHB0ciA/IEZYU1lTX2xlbihwdHIpIDogMCkge30KLQotICBDRlhfU3RyaW5nQ1RlbXBsYXRlKGNvbnN0IENoYXJUeXBlKiBwdHIsIEZYX1NUUlNJWkUgbGVuKQotICAgICAgOiBtX1B0cihyZWludGVycHJldF9jYXN0PGNvbnN0IFVuc2lnbmVkVHlwZSo+KHB0cikpLAotICAgICAgICBtX0xlbmd0aChsZW4gPT0gLTEgPyBGWFNZU19sZW4ocHRyKSA6IGxlbikge30KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVSA9IFVuc2lnbmVkVHlwZT4KLSAgQ0ZYX1N0cmluZ0NUZW1wbGF0ZSgKLSAgICAgIGNvbnN0IFVuc2lnbmVkVHlwZSogcHRyLAotICAgICAgRlhfU1RSU0laRSBzaXplLAotICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfc2FtZTxVLCBDaGFyVHlwZT46OnZhbHVlPjo6dHlwZSogPSAwKQotICAgICAgOiBtX1B0cihwdHIpLCBtX0xlbmd0aChzaXplKSB7fQotCi0gIC8vIERlbGliZXJhdGVseSBpbXBsaWNpdCB0byBhdm9pZCBjYWxsaW5nIG9uIGV2ZXJ5IHN0cmluZyBsaXRlcmFsLgotICAvLyB8Y2h8IG11c3QgYmUgYW4gbHZhbHVlIHRoYXQgb3V0bGl2ZXMgdGhlIHRoZSBDRlhfU3RyaW5nQ1RlbXBsYXRlLgotICAvLyBOT0xJTlRORVhUTElORShydW50aW1lL2V4cGxpY2l0KQotICBDRlhfU3RyaW5nQ1RlbXBsYXRlKENoYXJUeXBlJiBjaCkgewotICAgIG1fUHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVbnNpZ25lZFR5cGUqPigmY2gpOwotICAgIG1fTGVuZ3RoID0gMTsKLSAgfQotCi0gIENGWF9TdHJpbmdDVGVtcGxhdGUoY29uc3QgQ0ZYX1N0cmluZ0NUZW1wbGF0ZSYgc3JjKSB7Ci0gICAgbV9QdHIgPSBzcmMubV9QdHI7Ci0gICAgbV9MZW5ndGggPSBzcmMubV9MZW5ndGg7Ci0gIH0KLQotICBDRlhfU3RyaW5nQ1RlbXBsYXRlJiBvcGVyYXRvcj0oY29uc3QgQ2hhclR5cGUqIHNyYykgewotICAgIG1fUHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVbnNpZ25lZFR5cGUqPihzcmMpOwotICAgIG1fTGVuZ3RoID0gc3JjID8gRlhTWVNfbGVuKHNyYykgOiAwOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIENGWF9TdHJpbmdDVGVtcGxhdGUmIG9wZXJhdG9yPShjb25zdCBDRlhfU3RyaW5nQ1RlbXBsYXRlJiBzcmMpIHsKLSAgICBtX1B0ciA9IHNyYy5tX1B0cjsKLSAgICBtX0xlbmd0aCA9IHNyYy5tX0xlbmd0aDsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ2hhclR5cGUqIHB0cikgY29uc3QgewotICAgIHJldHVybiBGWFNZU19sZW4ocHRyKSA9PSBtX0xlbmd0aCAmJgotICAgICAgICAgICBGWFNZU19jbXAocHRyLCByZWludGVycHJldF9jYXN0PGNvbnN0IENoYXJUeXBlKj4obV9QdHIpLCBtX0xlbmd0aCkgPT0KLSAgICAgICAgICAgICAgIDA7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENGWF9TdHJpbmdDVGVtcGxhdGUmIG90aGVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIG90aGVyLm1fTGVuZ3RoID09IG1fTGVuZ3RoICYmCi0gICAgICAgICAgIEZYU1lTX2NtcChyZWludGVycHJldF9jYXN0PGNvbnN0IENoYXJUeXBlKj4ob3RoZXIubV9QdHIpLAotICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDaGFyVHlwZSo+KG1fUHRyKSwgbV9MZW5ndGgpID09IDA7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENoYXJUeXBlKiBwdHIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gcHRyKTsgfQotICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ0ZYX1N0cmluZ0NUZW1wbGF0ZSYgb3RoZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7Ci0gIH0KLQotICB1aW50MzJfdCBHZXRJRChGWF9TVFJTSVpFIHN0YXJ0X3BvcyA9IDApIGNvbnN0IHsKLSAgICBpZiAobV9MZW5ndGggPT0gMCB8fCBzdGFydF9wb3MgPCAwIHx8IHN0YXJ0X3BvcyA+PSBtX0xlbmd0aCkKLSAgICAgIHJldHVybiAwOwotCi0gICAgdWludDMyX3Qgc3RyaWQgPSAwOwotICAgIEZYX1NUUlNJWkUgc2l6ZSA9IHN0ZDo6bWluKDQsIG1fTGVuZ3RoIC0gc3RhcnRfcG9zKTsKLSAgICBmb3IgKEZYX1NUUlNJWkUgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgICBzdHJpZCA9IHN0cmlkICogMjU2ICsgbV9QdHJbc3RhcnRfcG9zICsgaV07Ci0KLSAgICByZXR1cm4gc3RyaWQgPDwgKCg0IC0gc2l6ZSkgKiA4KTsKLSAgfQotCi0gIGNvbnN0IFVuc2lnbmVkVHlwZSogcmF3X3N0cigpIGNvbnN0IHsgcmV0dXJuIG1fUHRyOyB9Ci0gIGNvbnN0IENoYXJUeXBlKiBjX3N0cigpIGNvbnN0IHsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDaGFyVHlwZSo+KG1fUHRyKTsKLSAgfQotCi0gIEZYX1NUUlNJWkUgR2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9MZW5ndGg7IH0KLSAgYm9vbCBJc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbV9MZW5ndGggPT0gMDsgfQotCi0gIFVuc2lnbmVkVHlwZSBHZXRBdChGWF9TVFJTSVpFIGluZGV4KSBjb25zdCB7IHJldHVybiBtX1B0cltpbmRleF07IH0KLSAgQ2hhclR5cGUgQ2hhckF0KEZYX1NUUlNJWkUgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2hhclR5cGU+KG1fUHRyW2luZGV4XSk7Ci0gIH0KLQotICBGWF9TVFJTSVpFIEZpbmQoQ2hhclR5cGUgY2gpIGNvbnN0IHsKLSAgICBjb25zdCBVbnNpZ25lZFR5cGUqIGZvdW5kID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVbnNpZ25lZFR5cGUqPigKLSAgICAgICAgRlhTWVNfY2hyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ2hhclR5cGUqPihtX1B0ciksIGNoLCBtX0xlbmd0aCkpOwotICAgIHJldHVybiBmb3VuZCA/IGZvdW5kIC0gbV9QdHIgOiAtMTsKLSAgfQotCi0gIENGWF9TdHJpbmdDVGVtcGxhdGUgTWlkKEZYX1NUUlNJWkUgaW5kZXgsIEZYX1NUUlNJWkUgY291bnQgPSAtMSkgY29uc3QgewotICAgIGluZGV4ID0gc3RkOjptYXgoMCwgaW5kZXgpOwotICAgIGlmIChpbmRleCA+IG1fTGVuZ3RoKQotICAgICAgcmV0dXJuIENGWF9TdHJpbmdDVGVtcGxhdGUoKTsKLQotICAgIGlmIChjb3VudCA8IDAgfHwgY291bnQgPiBtX0xlbmd0aCAtIGluZGV4KQotICAgICAgY291bnQgPSBtX0xlbmd0aCAtIGluZGV4OwotCi0gICAgcmV0dXJuIENGWF9TdHJpbmdDVGVtcGxhdGUobV9QdHIgKyBpbmRleCwgY291bnQpOwotICB9Ci0KLSAgQ0ZYX1N0cmluZ0NUZW1wbGF0ZSBMZWZ0KEZYX1NUUlNJWkUgY291bnQpIGNvbnN0IHsKLSAgICBpZiAoY291bnQgPD0gMCkKLSAgICAgIHJldHVybiBDRlhfU3RyaW5nQ1RlbXBsYXRlKCk7Ci0KLSAgICByZXR1cm4gQ0ZYX1N0cmluZ0NUZW1wbGF0ZShtX1B0ciwgc3RkOjptaW4oY291bnQsIG1fTGVuZ3RoKSk7Ci0gIH0KLQotICBDRlhfU3RyaW5nQ1RlbXBsYXRlIFJpZ2h0KEZYX1NUUlNJWkUgY291bnQpIGNvbnN0IHsKLSAgICBpZiAoY291bnQgPD0gMCkKLSAgICAgIHJldHVybiBDRlhfU3RyaW5nQ1RlbXBsYXRlKCk7Ci0KLSAgICBjb3VudCA9IHN0ZDo6bWluKGNvdW50LCBtX0xlbmd0aCk7Ci0gICAgcmV0dXJuIENGWF9TdHJpbmdDVGVtcGxhdGUobV9QdHIgKyBtX0xlbmd0aCAtIGNvdW50LCBjb3VudCk7Ci0gIH0KLQotICBjb25zdCBVbnNpZ25lZFR5cGUmIG9wZXJhdG9yW10oc2l6ZV90IGluZGV4KSBjb25zdCB7IHJldHVybiBtX1B0cltpbmRleF07IH0KLQotICBib29sIG9wZXJhdG9yPChjb25zdCBDRlhfU3RyaW5nQ1RlbXBsYXRlJiB0aGF0KSBjb25zdCB7Ci0gICAgaW50IHJlc3VsdCA9IEZYU1lTX2NtcChyZWludGVycHJldF9jYXN0PGNvbnN0IENoYXJUeXBlKj4obV9QdHIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDaGFyVHlwZSo+KHRoYXQubV9QdHIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptaW4obV9MZW5ndGgsIHRoYXQubV9MZW5ndGgpKTsKLSAgICByZXR1cm4gcmVzdWx0IDwgMCB8fCAocmVzdWx0ID09IDAgJiYgbV9MZW5ndGggPCB0aGF0Lm1fTGVuZ3RoKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBjb25zdCBVbnNpZ25lZFR5cGUqIG1fUHRyOwotICBGWF9TVFJTSVpFIG1fTGVuZ3RoOwotCi0gcHJpdmF0ZToKLSAgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCkgdGhyb3coKSB7IHJldHVybiBudWxscHRyOyB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVCogbGhzLCBjb25zdCBDRlhfU3RyaW5nQ1RlbXBsYXRlPFQ+JiByaHMpIHsKLSAgcmV0dXJuIHJocyA9PSBsaHM7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUKiBsaHMsIGNvbnN0IENGWF9TdHJpbmdDVGVtcGxhdGU8VD4mIHJocykgewotICByZXR1cm4gcmhzICE9IGxoczsKLX0KLQotZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIENGWF9TdHJpbmdDVGVtcGxhdGU8RlhfQ0hBUj47Ci1leHRlcm4gdGVtcGxhdGUgY2xhc3MgQ0ZYX1N0cmluZ0NUZW1wbGF0ZTxGWF9XQ0hBUj47Ci0KLSNlbmRpZiAgLy8gQ09SRV9GWENSVF9DRlhfU1RSSU5HX0NfVEVNUExBVEVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY2Z4X3N0cmluZ19kYXRhX3RlbXBsYXRlLmggYi9jb3JlL2Z4Y3J0L2NmeF9zdHJpbmdfZGF0YV90ZW1wbGF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2UwOTBmLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjcnQvY2Z4X3N0cmluZ19kYXRhX3RlbXBsYXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlhDUlRfQ0ZYX1NUUklOR19EQVRBX1RFTVBMQVRFX0hfCi0jZGVmaW5lIENPUkVfRlhDUlRfQ0ZYX1NUUklOR19EQVRBX1RFTVBMQVRFX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX21hdGguaCIKLQotdGVtcGxhdGUgPHR5cGVuYW1lIENoYXJUeXBlPgotY2xhc3MgQ0ZYX1N0cmluZ0RhdGFUZW1wbGF0ZSB7Ci0gcHVibGljOgotICBzdGF0aWMgQ0ZYX1N0cmluZ0RhdGFUZW1wbGF0ZSogQ3JlYXRlKEZYX1NUUlNJWkUgbkxlbikgewotICAgIEFTU0VSVChuTGVuID4gMCk7Ci0KLSAgICAvLyBDYWxjdWxhdGUgc3BhY2UgbmVlZGVkIGZvciB0aGUgZml4ZWQgcG9ydGlvbiBvZiB0aGUgc3RydWN0IHBsdXMgdGhlCi0gICAgLy8gTlVMIGNoYXIgdGhhdCBpcyBub3QgaW5jbHVkZWQgaW4gfG1fbkFsbG9jTGVuZ3RofC4KLSAgICBpbnQgb3ZlcmhlYWQgPQotICAgICAgICBvZmZzZXRvZihDRlhfU3RyaW5nRGF0YVRlbXBsYXRlLCBtX1N0cmluZykgKyBzaXplb2YoQ2hhclR5cGUpOwotICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8aW50PiBuU2l6ZSA9IG5MZW47Ci0gICAgblNpemUgKj0gc2l6ZW9mKENoYXJUeXBlKTsKLSAgICBuU2l6ZSArPSBvdmVyaGVhZDsKLQotICAgIC8vIE5vdyByb3VuZCB0byBhbiA4LWJ5dGUgYm91bmRhcnkuIFdlJ2QgZXhwZWN0IHRoYXQgdGhpcyBpcyB0aGUgbWluaW11bQotICAgIC8vIGdyYW51bGFyaXR5IG9mIGFueSBvZiB0aGUgdW5kZXJseWluZyBhbGxvY2F0b3JzLCBzbyB0aGVyZSBtYXkgYmUgY2FzZXMKLSAgICAvLyB3aGVyZSB3ZSBjYW4gc2F2ZSBhIHJlLWFsbG9jIHdoZW4gYWRkaW5nIGEgZmV3IGNoYXJhY3RlcnMgdG8gYSBzdHJpbmcKLSAgICAvLyBieSB1c2luZyB0aGlzIG90aGVyd2lzZSB3YXN0ZWQgc3BhY2UuCi0gICAgblNpemUgKz0gNzsKLSAgICBuU2l6ZSAmPSB+NzsKLSAgICBpbnQgdG90YWxTaXplID0gblNpemUuVmFsdWVPckRpZSgpOwotICAgIGludCB1c2FibGVMZW4gPSAodG90YWxTaXplIC0gb3ZlcmhlYWQpIC8gc2l6ZW9mKENoYXJUeXBlKTsKLSAgICBBU1NFUlQodXNhYmxlTGVuID49IG5MZW4pOwotCi0gICAgdm9pZCogcERhdGEgPSBGWF9BbGxvYyh1aW50OF90LCB0b3RhbFNpemUpOwotICAgIHJldHVybiBuZXcgKHBEYXRhKSBDRlhfU3RyaW5nRGF0YVRlbXBsYXRlKG5MZW4sIHVzYWJsZUxlbik7Ci0gIH0KLQotICBzdGF0aWMgQ0ZYX1N0cmluZ0RhdGFUZW1wbGF0ZSogQ3JlYXRlKGNvbnN0IENGWF9TdHJpbmdEYXRhVGVtcGxhdGUmIG90aGVyKSB7Ci0gICAgQ0ZYX1N0cmluZ0RhdGFUZW1wbGF0ZSogcmVzdWx0ID0gQ3JlYXRlKG90aGVyLm1fbkRhdGFMZW5ndGgpOwotICAgIHJlc3VsdC0+Q29weUNvbnRlbnRzKG90aGVyKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgc3RhdGljIENGWF9TdHJpbmdEYXRhVGVtcGxhdGUqIENyZWF0ZShjb25zdCBDaGFyVHlwZSogcFN0ciwgRlhfU1RSU0laRSBuTGVuKSB7Ci0gICAgQ0ZYX1N0cmluZ0RhdGFUZW1wbGF0ZSogcmVzdWx0ID0gQ3JlYXRlKG5MZW4pOwotICAgIHJlc3VsdC0+Q29weUNvbnRlbnRzKHBTdHIsIG5MZW4pOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICB2b2lkIFJldGFpbigpIHsgKyttX25SZWZzOyB9Ci0gIHZvaWQgUmVsZWFzZSgpIHsKLSAgICBpZiAoLS1tX25SZWZzIDw9IDApCi0gICAgICBGWF9GcmVlKHRoaXMpOwotICB9Ci0KLSAgYm9vbCBDYW5PcGVyYXRlSW5QbGFjZShGWF9TVFJTSVpFIG5Ub3RhbExlbikgY29uc3QgewotICAgIHJldHVybiBtX25SZWZzIDw9IDEgJiYgblRvdGFsTGVuIDw9IG1fbkFsbG9jTGVuZ3RoOwotICB9Ci0KLSAgdm9pZCBDb3B5Q29udGVudHMoY29uc3QgQ0ZYX1N0cmluZ0RhdGFUZW1wbGF0ZSYgb3RoZXIpIHsKLSAgICBBU1NFUlQob3RoZXIubV9uRGF0YUxlbmd0aCA8PSBtX25BbGxvY0xlbmd0aCk7Ci0gICAgRlhTWVNfbWVtY3B5KG1fU3RyaW5nLCBvdGhlci5tX1N0cmluZywKLSAgICAgICAgICAgICAgICAgKG90aGVyLm1fbkRhdGFMZW5ndGggKyAxKSAqIHNpemVvZihDaGFyVHlwZSkpOwotICB9Ci0KLSAgdm9pZCBDb3B5Q29udGVudHMoY29uc3QgQ2hhclR5cGUqIHBTdHIsIEZYX1NUUlNJWkUgbkxlbikgewotICAgIEFTU0VSVChuTGVuID49IDAgJiYgbkxlbiA8PSBtX25BbGxvY0xlbmd0aCk7Ci0gICAgRlhTWVNfbWVtY3B5KG1fU3RyaW5nLCBwU3RyLCBuTGVuICogc2l6ZW9mKENoYXJUeXBlKSk7Ci0gICAgbV9TdHJpbmdbbkxlbl0gPSAwOwotICB9Ci0KLSAgdm9pZCBDb3B5Q29udGVudHNBdChGWF9TVFJTSVpFIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDaGFyVHlwZSogcFN0ciwKLSAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIG5MZW4pIHsKLSAgICBBU1NFUlQob2Zmc2V0ID49IDAgJiYgbkxlbiA+PSAwICYmIG9mZnNldCArIG5MZW4gPD0gbV9uQWxsb2NMZW5ndGgpOwotICAgIEZYU1lTX21lbWNweShtX1N0cmluZyArIG9mZnNldCwgcFN0ciwgbkxlbiAqIHNpemVvZihDaGFyVHlwZSkpOwotICAgIG1fU3RyaW5nW29mZnNldCArIG5MZW5dID0gMDsKLSAgfQotCi0gIC8vIFRvIGVuc3VyZSByZWYgY291bnRzIGRvIG5vdCBvdmVyZmxvdywgY29uc2lkZXIgdGhlIHdvcnN0IHBvc3NpYmxlIGNhc2U6Ci0gIC8vIHRoZSBlbnRpcmUgYWRkcmVzcyBzcGFjZSBjb250YWlucyBub3RoaW5nIGJ1dCBwb2ludGVycyB0byB0aGlzIG9iamVjdC4KLSAgLy8gU2luY2UgdGhlIGNvdW50IGluY3JlbWVudHMgd2l0aCBlYWNoIG5ldyBwb2ludGVyLCB0aGUgbGFyZ2VzdCB2YWx1ZSBpcwotICAvLyB0aGUgbnVtYmVyIG9mIHBvaW50ZXJzIHRoYXQgY2FuIGZpdCBpbnRvIHRoZSBhZGRyZXNzIHNwYWNlLiBUaGUgc2l6ZSBvZgotICAvLyB0aGUgYWRkcmVzcyBzcGFjZSBpdHNlbGYgaXMgYSBnb29kIHVwcGVyIGJvdW5kIG9uIGl0LgotICBpbnRwdHJfdCBtX25SZWZzOwotCi0gIC8vIHxGWF9TVFJTSVpFfCBpcyBjdXJyZW50bHkgdHlwZWRlZidkIGFzIHxpbnR8LgotICAvLyBUT0RPKHBhbG1lcik6IEl0IHNob3VsZCBiZSBhIHxzaXplX3R8LCBvciBhdCBsZWFzdCB1bnNpZ25lZC4KLSAgLy8gVGhlc2UgbGVuZ3RocyBhcmUgaW4gdGVybXMgb2YgbnVtYmVyIG9mIGNoYXJhY3RlcnMsIG5vdCBieXRlcywgYW5kIGRvIG5vdAotICAvLyBpbmNsdWRlIHRoZSB0ZXJtaW5hdGluZyBOVUwgY2hhcmFjdGVyLCBidXQgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlzIHNpemVkCi0gIC8vIHRvIGJlIGNhcGFibGUgb2YgaG9sZGluZyBpdC4KLSAgRlhfU1RSU0laRSBtX25EYXRhTGVuZ3RoOwotICBGWF9TVFJTSVpFIG1fbkFsbG9jTGVuZ3RoOwotCi0gIC8vIE5vdCByZWFsbHkgMSwgdmFyaWFibGUgc2l6ZS4KLSAgQ2hhclR5cGUgbV9TdHJpbmdbMV07Ci0KLSBwcml2YXRlOgotICBDRlhfU3RyaW5nRGF0YVRlbXBsYXRlKEZYX1NUUlNJWkUgZGF0YUxlbiwgRlhfU1RSU0laRSBhbGxvY0xlbikKLSAgICAgIDogbV9uUmVmcygwKSwgbV9uRGF0YUxlbmd0aChkYXRhTGVuKSwgbV9uQWxsb2NMZW5ndGgoYWxsb2NMZW4pIHsKLSAgICBBU1NFUlQoZGF0YUxlbiA+PSAwKTsKLSAgICBBU1NFUlQoZGF0YUxlbiA8PSBhbGxvY0xlbik7Ci0gICAgbV9TdHJpbmdbZGF0YUxlbl0gPSAwOwotICB9Ci0KLSAgfkNGWF9TdHJpbmdEYXRhVGVtcGxhdGUoKSA9IGRlbGV0ZTsKLX07Ci0KLWV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBDRlhfU3RyaW5nRGF0YVRlbXBsYXRlPEZYX0NIQVI+OwotZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIENGWF9TdHJpbmdEYXRhVGVtcGxhdGU8RlhfV0NIQVI+OwotCi0jZW5kaWYgIC8vIENPUkVfRlhDUlRfQ0ZYX1NUUklOR19EQVRBX1RFTVBMQVRFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2NmeF9zdHJpbmdfcG9vbF90ZW1wbGF0ZS5oIGIvY29yZS9meGNydC9jZnhfc3RyaW5nX3Bvb2xfdGVtcGxhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZjMWNlNC4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Y3J0L2NmeF9zdHJpbmdfcG9vbF90ZW1wbGF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlhDUlRfQ0ZYX1NUUklOR19QT09MX1RFTVBMQVRFX0hfCi0jZGVmaW5lIENPUkVfRlhDUlRfQ0ZYX1NUUklOR19QT09MX1RFTVBMQVRFX0hfCi0KLSNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFN0cmluZ1R5cGU+Ci1jbGFzcyBDRlhfU3RyaW5nUG9vbFRlbXBsYXRlIHsKLSBwdWJsaWM6Ci0gIFN0cmluZ1R5cGUgSW50ZXJuKGNvbnN0IFN0cmluZ1R5cGUmIHN0cikgeyByZXR1cm4gKm1fUG9vbC5pbnNlcnQoc3RyKS5maXJzdDsgfQotICB2b2lkIENsZWFyKCkgeyBtX1Bvb2wuY2xlYXIoKTsgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjp1bm9yZGVyZWRfc2V0PFN0cmluZ1R5cGU+IG1fUG9vbDsKLX07Ci0KLXVzaW5nIENGWF9CeXRlU3RyaW5nUG9vbCA9IENGWF9TdHJpbmdQb29sVGVtcGxhdGU8Q0ZYX0J5dGVTdHJpbmc+OwotdXNpbmcgQ0ZYX1dpZGVTdHJpbmdQb29sID0gQ0ZYX1N0cmluZ1Bvb2xUZW1wbGF0ZTxDRlhfV2lkZVN0cmluZz47Ci0KLWV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBDRlhfU3RyaW5nUG9vbFRlbXBsYXRlPENGWF9CeXRlU3RyaW5nPjsKLWV4dGVybiB0ZW1wbGF0ZSBjbGFzcyBDRlhfU3RyaW5nUG9vbFRlbXBsYXRlPENGWF9XaWRlU3RyaW5nPjsKLQotI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0NGWF9TVFJJTkdfUE9PTF9URU1QTEFURV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jZnhfc3RyaW5nX3Bvb2xfdGVtcGxhdGVfdW5pdHRlc3QuY3BwIGIvY29yZS9meGNydC9jZnhfc3RyaW5nX3Bvb2xfdGVtcGxhdGVfdW5pdHRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGY1ZmJlLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjcnQvY2Z4X3N0cmluZ19wb29sX3RlbXBsYXRlX3VuaXR0ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3N0cmluZ19wb29sX3RlbXBsYXRlLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2Z4X3N0cmluZ190ZXN0aGVscGVycy5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1URVNUKGZ4Y3J0LCBCeXRlU3RyaW5nUG9vbCkgewotICBDRlhfQnl0ZVN0cmluZ1Bvb2wgcG9vbDsKLQotICBDRlhfQnl0ZVN0cmluZyBudWxsMTsKLSAgQ0ZYX0J5dGVTdHJpbmcgbnVsbDI7Ci0gIENGWF9CeXRlU3RyaW5nIGdvYXRzMSgiZ29hdHMiKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgZ29hdHMyKCJnb2F0cyIpOwotCi0gIC8vIFVuZGVybHlpbmcgc3RvcmFnZSwgaWYgbm9uLW51bGwsIGlzIG5vdCBzaGFyZWQuCi0gIEVYUEVDVF9FUShudWxscHRyLCBudWxsMS5tX3BEYXRhLkdldCgpKTsKLSAgRVhQRUNUX0VRKG51bGxwdHIsIG51bGwyLm1fcERhdGEuR2V0KCkpOwotICBFWFBFQ1RfTkUoZ29hdHMxLm1fcERhdGEsIGdvYXRzMi5tX3BEYXRhKTsKLQotICBDRlhfQnl0ZVN0cmluZyBpbnRlcm5lZF9udWxsMSA9IHBvb2wuSW50ZXJuKG51bGwxKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgaW50ZXJuZWRfbnVsbDIgPSBwb29sLkludGVybihudWxsMik7Ci0gIENGWF9CeXRlU3RyaW5nIGludGVybmVkX2dvYXRzMSA9IHBvb2wuSW50ZXJuKGdvYXRzMSk7Ci0gIENGWF9CeXRlU3RyaW5nIGludGVybmVkX2dvYXRzMiA9IHBvb2wuSW50ZXJuKGdvYXRzMik7Ci0KLSAgLy8gU3RyaW5ncyBhcmUgbG9naWNhbGx5IGVxdWFsIGFmdGVyIGJlaW5nIGludGVybmVkLgotICBFWFBFQ1RfRVEobnVsbDEsIGludGVybmVkX251bGwxKTsKLSAgRVhQRUNUX0VRKG51bGwyLCBpbnRlcm5lZF9udWxsMik7Ci0gIEVYUEVDVF9FUShnb2F0czEsIGludGVybmVkX2dvYXRzMSk7Ci0gIEVYUEVDVF9FUShnb2F0czIsIGludGVybmVkX2dvYXRzMik7Ci0KLSAgLy8gSW50ZXJuZWQgdW5kZXJseWluZyBzdG9yYWdlLCBpZiBub24tbnVsbCwgYmVsb25ncyB0byBmaXJzdCBzZWVuLgotICBFWFBFQ1RfRVEobnVsbHB0ciwgaW50ZXJuZWRfbnVsbDEubV9wRGF0YS5HZXQoKSk7Ci0gIEVYUEVDVF9FUShudWxscHRyLCBpbnRlcm5lZF9udWxsMi5tX3BEYXRhLkdldCgpKTsKLSAgRVhQRUNUX0VRKGdvYXRzMS5tX3BEYXRhLCBpbnRlcm5lZF9nb2F0czEubV9wRGF0YSk7Ci0gIEVYUEVDVF9FUShnb2F0czEubV9wRGF0YSwgaW50ZXJuZWRfZ29hdHMyLm1fcERhdGEpOwotCi0gIHBvb2wuQ2xlYXIoKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgcmVpbnRlcm5lZF9udWxsMiA9IHBvb2wuSW50ZXJuKG51bGwyKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgcmVpbnRlcm5lZF9udWxsMSA9IHBvb2wuSW50ZXJuKG51bGwyKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgcmVpbnRlcm5lZF9nb2F0czIgPSBwb29sLkludGVybihnb2F0czIpOwotICBDRlhfQnl0ZVN0cmluZyByZWludGVybmVkX2dvYXRzMSA9IHBvb2wuSW50ZXJuKGdvYXRzMik7Ci0KLSAgLy8gQWZ0ZXIgY2xlYXJpbmcgcG9vbCwgc3RvcmFnZSB3YXMgcmUtaW50ZXJuZWQgdXNpbmcgc2Vjb25kIHN0cmluZ3MuCi0gIEVYUEVDVF9FUShudWxscHRyLCBpbnRlcm5lZF9udWxsMS5tX3BEYXRhLkdldCgpKTsKLSAgRVhQRUNUX0VRKG51bGxwdHIsIGludGVybmVkX251bGwyLm1fcERhdGEuR2V0KCkpOwotICBFWFBFQ1RfRVEoZ29hdHMyLm1fcERhdGEsIHJlaW50ZXJuZWRfZ29hdHMxLm1fcERhdGEpOwotICBFWFBFQ1RfRVEoZ29hdHMyLm1fcERhdGEsIHJlaW50ZXJuZWRfZ29hdHMyLm1fcERhdGEpOwotfQotCi1URVNUKGZ4Y3J0LCBXaWRlU3RyaW5nUG9vbCkgewotICBDRlhfV2lkZVN0cmluZ1Bvb2wgcG9vbDsKLQotICBDRlhfV2lkZVN0cmluZyBudWxsMTsKLSAgQ0ZYX1dpZGVTdHJpbmcgbnVsbDI7Ci0gIENGWF9XaWRlU3RyaW5nIGdvYXRzMShMImdvYXRzIik7Ci0gIENGWF9XaWRlU3RyaW5nIGdvYXRzMihMImdvYXRzIik7Ci0KLSAgLy8gVW5kZXJseWluZyBzdG9yYWdlLCBpZiBub24tbnVsbCwgaXMgbm90IHNoYXJlZC4KLSAgRVhQRUNUX0VRKG51bGxwdHIsIG51bGwxLm1fcERhdGEuR2V0KCkpOwotICBFWFBFQ1RfRVEobnVsbHB0ciwgbnVsbDIubV9wRGF0YS5HZXQoKSk7Ci0gIEVYUEVDVF9ORShnb2F0czEubV9wRGF0YSwgZ29hdHMyLm1fcERhdGEpOwotCi0gIENGWF9XaWRlU3RyaW5nIGludGVybmVkX251bGwxID0gcG9vbC5JbnRlcm4obnVsbDEpOwotICBDRlhfV2lkZVN0cmluZyBpbnRlcm5lZF9udWxsMiA9IHBvb2wuSW50ZXJuKG51bGwyKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgaW50ZXJuZWRfZ29hdHMxID0gcG9vbC5JbnRlcm4oZ29hdHMxKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgaW50ZXJuZWRfZ29hdHMyID0gcG9vbC5JbnRlcm4oZ29hdHMyKTsKLQotICAvLyBTdHJpbmdzIGFyZSBsb2dpY2FsbHkgZXF1YWwgYWZ0ZXIgYmVpbmcgaW50ZXJuZWQuCi0gIEVYUEVDVF9FUShudWxsMSwgaW50ZXJuZWRfbnVsbDEpOwotICBFWFBFQ1RfRVEobnVsbDIsIGludGVybmVkX251bGwyKTsKLSAgRVhQRUNUX0VRKGdvYXRzMSwgaW50ZXJuZWRfZ29hdHMxKTsKLSAgRVhQRUNUX0VRKGdvYXRzMiwgaW50ZXJuZWRfZ29hdHMyKTsKLQotICAvLyBJbnRlcm5lZCB1bmRlcmx5aW5nIHN0b3JhZ2UsIGlmIG5vbi1udWxsLCBiZWxvbmdzIHRvIGZpcnN0IHNlZW4uCi0gIEVYUEVDVF9FUShudWxscHRyLCBpbnRlcm5lZF9udWxsMS5tX3BEYXRhLkdldCgpKTsKLSAgRVhQRUNUX0VRKG51bGxwdHIsIGludGVybmVkX251bGwyLm1fcERhdGEuR2V0KCkpOwotICBFWFBFQ1RfRVEoZ29hdHMxLm1fcERhdGEsIGludGVybmVkX2dvYXRzMS5tX3BEYXRhKTsKLSAgRVhQRUNUX0VRKGdvYXRzMS5tX3BEYXRhLCBpbnRlcm5lZF9nb2F0czIubV9wRGF0YSk7Ci0KLSAgcG9vbC5DbGVhcigpOwotICBDRlhfV2lkZVN0cmluZyByZWludGVybmVkX251bGwyID0gcG9vbC5JbnRlcm4obnVsbDIpOwotICBDRlhfV2lkZVN0cmluZyByZWludGVybmVkX251bGwxID0gcG9vbC5JbnRlcm4obnVsbDIpOwotICBDRlhfV2lkZVN0cmluZyByZWludGVybmVkX2dvYXRzMiA9IHBvb2wuSW50ZXJuKGdvYXRzMik7Ci0gIENGWF9XaWRlU3RyaW5nIHJlaW50ZXJuZWRfZ29hdHMxID0gcG9vbC5JbnRlcm4oZ29hdHMyKTsKLQotICAvLyBBZnRlciBjbGVhcmluZyBwb29sLCBzdG9yYWdlIHdhcyByZS1pbnRlcm5lZCB1c2luZyBzZWNvbmQgc3RyaW5ncy4KLSAgRVhQRUNUX0VRKG51bGxwdHIsIGludGVybmVkX251bGwxLm1fcERhdGEuR2V0KCkpOwotICBFWFBFQ1RfRVEobnVsbHB0ciwgaW50ZXJuZWRfbnVsbDIubV9wRGF0YS5HZXQoKSk7Ci0gIEVYUEVDVF9FUShnb2F0czIubV9wRGF0YSwgcmVpbnRlcm5lZF9nb2F0czEubV9wRGF0YSk7Ci0gIEVYUEVDVF9FUShnb2F0czIubV9wRGF0YSwgcmVpbnRlcm5lZF9nb2F0czIubV9wRGF0YSk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2NmeF91dGY4ZGVjb2Rlci5jcHAgYi9jb3JlL2Z4Y3J0L2NmeF91dGY4ZGVjb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVlNWUxNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY2Z4X3V0ZjhkZWNvZGVyLmNwcApAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF91dGY4ZGVjb2Rlci5oIgorCit2b2lkIENGWF9VVEY4RGVjb2Rlcjo6Q2xlYXIoKSB7CisgIG1fQnVmZmVyLkNsZWFyKCk7CisgIG1fUGVuZGluZ0J5dGVzID0gMDsKK30KKwordm9pZCBDRlhfVVRGOERlY29kZXI6OkFwcGVuZENvZGVQb2ludCh1aW50MzJfdCBjaCkgeworICBtX0J1ZmZlci5BcHBlbmRDaGFyKHN0YXRpY19jYXN0PHdjaGFyX3Q+KGNoKSk7Cit9CisKK3ZvaWQgQ0ZYX1VURjhEZWNvZGVyOjpJbnB1dCh1aW50OF90IGJ5dGUpIHsKKyAgaWYgKGJ5dGUgPCAweDgwKSB7CisgICAgbV9QZW5kaW5nQnl0ZXMgPSAwOworICAgIG1fQnVmZmVyLkFwcGVuZENoYXIoYnl0ZSk7CisgIH0gZWxzZSBpZiAoYnl0ZSA8IDB4YzApIHsKKyAgICBpZiAobV9QZW5kaW5nQnl0ZXMgPT0gMCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtX1BlbmRpbmdCeXRlcy0tOworICAgIG1fUGVuZGluZ0NoYXIgfD0gKGJ5dGUgJiAweDNmKSA8PCAobV9QZW5kaW5nQnl0ZXMgKiA2KTsKKyAgICBpZiAobV9QZW5kaW5nQnl0ZXMgPT0gMCkgeworICAgICAgQXBwZW5kQ29kZVBvaW50KG1fUGVuZGluZ0NoYXIpOworICAgIH0KKyAgfSBlbHNlIGlmIChieXRlIDwgMHhlMCkgeworICAgIG1fUGVuZGluZ0J5dGVzID0gMTsKKyAgICBtX1BlbmRpbmdDaGFyID0gKGJ5dGUgJiAweDFmKSA8PCA2OworICB9IGVsc2UgaWYgKGJ5dGUgPCAweGYwKSB7CisgICAgbV9QZW5kaW5nQnl0ZXMgPSAyOworICAgIG1fUGVuZGluZ0NoYXIgPSAoYnl0ZSAmIDB4MGYpIDw8IDEyOworICB9IGVsc2UgaWYgKGJ5dGUgPCAweGY4KSB7CisgICAgbV9QZW5kaW5nQnl0ZXMgPSAzOworICAgIG1fUGVuZGluZ0NoYXIgPSAoYnl0ZSAmIDB4MDcpIDw8IDE4OworICB9IGVsc2UgaWYgKGJ5dGUgPCAweGZjKSB7CisgICAgbV9QZW5kaW5nQnl0ZXMgPSA0OworICAgIG1fUGVuZGluZ0NoYXIgPSAoYnl0ZSAmIDB4MDMpIDw8IDI0OworICB9IGVsc2UgaWYgKGJ5dGUgPCAweGZlKSB7CisgICAgbV9QZW5kaW5nQnl0ZXMgPSA1OworICAgIG1fUGVuZGluZ0NoYXIgPSAoYnl0ZSAmIDB4MDEpIDw8IDMwOworICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2NmeF91dGY4ZGVjb2Rlci5oIGIvY29yZS9meGNydC9jZnhfdXRmOGRlY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2FmYmU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9jZnhfdXRmOGRlY29kZXIuaApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENSVF9DRlhfVVRGOERFQ09ERVJfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9DRlhfVVRGOERFQ09ERVJfSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3dpZGV0ZXh0YnVmLmgiCisKK2NsYXNzIENGWF9VVEY4RGVjb2RlciB7CisgcHVibGljOgorICBDRlhfVVRGOERlY29kZXIoKSB7IG1fUGVuZGluZ0J5dGVzID0gMDsgfQorCisgIHZvaWQgQ2xlYXIoKTsKKyAgdm9pZCBJbnB1dCh1aW50OF90IGJ5dGUpOworICB2b2lkIEFwcGVuZENvZGVQb2ludCh1aW50MzJfdCBjaCk7CisgIHZvaWQgQ2xlYXJTdGF0dXMoKSB7IG1fUGVuZGluZ0J5dGVzID0gMDsgfQorICBXaWRlU3RyaW5nVmlldyBHZXRSZXN1bHQoKSBjb25zdCB7IHJldHVybiBtX0J1ZmZlci5Bc1N0cmluZ1ZpZXcoKTsgfQorCisgcHJpdmF0ZToKKyAgaW50IG1fUGVuZGluZ0J5dGVzOworICB1aW50MzJfdCBtX1BlbmRpbmdDaGFyOworICBDRlhfV2lkZVRleHRCdWYgbV9CdWZmZXI7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfQ0ZYX1VURjhERUNPREVSX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2NmeF93ZWFrX3B0ci5oIGIvY29yZS9meGNydC9jZnhfd2Vha19wdHIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNhZTViOC4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Y3J0L2NmeF93ZWFrX3B0ci5oCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlhDUlRfQ0ZYX1dFQUtfUFRSX0hfCi0jZGVmaW5lIENPUkVfRlhDUlRfQ0ZYX1dFQUtfUFRSX0hfCi0KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfcmV0YWluX3B0ci5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0KLXRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBEID0gc3RkOjpkZWZhdWx0X2RlbGV0ZTxUPj4KLWNsYXNzIENGWF9XZWFrUHRyIHsKLSBwdWJsaWM6Ci0gIENGWF9XZWFrUHRyKCkge30KLSAgQ0ZYX1dlYWtQdHIoY29uc3QgQ0ZYX1dlYWtQdHImIHRoYXQpIDogbV9wSGFuZGxlKHRoYXQubV9wSGFuZGxlKSB7fQotICBDRlhfV2Vha1B0cihDRlhfV2Vha1B0ciYmIHRoYXQpIHsgU3dhcCh0aGF0KTsgfQotICBleHBsaWNpdCBDRlhfV2Vha1B0cihzdGQ6OnVuaXF1ZV9wdHI8VCwgRD4gcE9iaikKLSAgICAgIDogbV9wSGFuZGxlKG5ldyBIYW5kbGUoc3RkOjptb3ZlKHBPYmopKSkge30KLQotICAvLyBEZWxpYmVyYXRlbHkgaW1wbGljaXQgdG8gYWxsb3cgcGFzc2luZyBudWxscHRyLgotICAvLyBOT0xJTlRORVhUTElORShydW50aW1lL2V4cGxpY2l0KQotICBDRlhfV2Vha1B0cihzdGQ6Om51bGxwdHJfdCBhcmcpIHt9Ci0KLSAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIG1fcEhhbmRsZSAmJiAhIW1fcEhhbmRsZS0+R2V0KCk7IH0KLSAgYm9vbCBIYXNPbmVSZWYoKSBjb25zdCB7IHJldHVybiBtX3BIYW5kbGUgJiYgbV9wSGFuZGxlLT5IYXNPbmVSZWYoKTsgfQotICBUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gbV9wSGFuZGxlLT5HZXQoKTsgfQotICBjb25zdCBUKiBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gbV9wSGFuZGxlLT5HZXQoKTsgfQotICBDRlhfV2Vha1B0ciYgb3BlcmF0b3I9KGNvbnN0IENGWF9XZWFrUHRyJiB0aGF0KSB7Ci0gICAgbV9wSGFuZGxlID0gdGhhdC5tX3BIYW5kbGU7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDRlhfV2Vha1B0ciYgdGhhdCkgY29uc3QgewotICAgIHJldHVybiBtX3BIYW5kbGUgPT0gdGhhdC5tX3BIYW5kbGU7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENGWF9XZWFrUHRyJiB0aGF0KSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHRoYXQpOyB9Ci0KLSAgVCogR2V0KCkgY29uc3QgeyByZXR1cm4gbV9wSGFuZGxlID8gbV9wSGFuZGxlLT5HZXQoKSA6IG51bGxwdHI7IH0KLSAgdm9pZCBEZWxldGVPYmplY3QoKSB7Ci0gICAgaWYgKG1fcEhhbmRsZSkgewotICAgICAgbV9wSGFuZGxlLT5DbGVhcigpOwotICAgICAgbV9wSGFuZGxlLlJlc2V0KCk7Ci0gICAgfQotICB9Ci0gIHZvaWQgUmVzZXQoKSB7IG1fcEhhbmRsZS5SZXNldCgpOyB9Ci0gIHZvaWQgUmVzZXQoc3RkOjp1bmlxdWVfcHRyPFQsIEQ+IHBPYmopIHsKLSAgICBtX3BIYW5kbGUuUmVzZXQobmV3IEhhbmRsZShzdGQ6Om1vdmUocE9iaikpKTsKLSAgfQotICB2b2lkIFN3YXAoQ0ZYX1dlYWtQdHImIHRoYXQpIHsgbV9wSGFuZGxlLlN3YXAodGhhdC5tX3BIYW5kbGUpOyB9Ci0KLSBwcml2YXRlOgotICBjbGFzcyBIYW5kbGUgewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IEhhbmRsZShzdGQ6OnVuaXF1ZV9wdHI8VCwgRD4gcHRyKQotICAgICAgICA6IG1fbkNvdW50KDApLCBtX3BPYmooc3RkOjptb3ZlKHB0cikpIHt9Ci0gICAgdm9pZCBSZXNldChzdGQ6OnVuaXF1ZV9wdHI8VCwgRD4gcHRyKSB7IG1fcE9iaiA9IHN0ZDo6bW92ZShwdHIpOyB9Ci0gICAgdm9pZCBDbGVhcigpIHsgICAgIC8vIE5vdyB5b3UncmUgYWxsIHdlYWsgcHRycyAuLi4KLSAgICAgIG1fcE9iai5yZXNldCgpOyAgLy8gdW5pcXVlX3B0ciBudWxscyBmaXJzdCBiZWZvcmUgaW52b2tpbmcgZGVsZXRlLgotICAgIH0KLSAgICBUKiBHZXQoKSBjb25zdCB7IHJldHVybiBtX3BPYmouZ2V0KCk7IH0KLSAgICBUKiBSZXRhaW4oKSB7Ci0gICAgICArK21fbkNvdW50OwotICAgICAgcmV0dXJuIG1fcE9iai5nZXQoKTsKLSAgICB9Ci0gICAgdm9pZCBSZWxlYXNlKCkgewotICAgICAgaWYgKC0tbV9uQ291bnQgPT0gMCkKLSAgICAgICAgZGVsZXRlIHRoaXM7Ci0gICAgfQotICAgIGJvb2wgSGFzT25lUmVmKCkgY29uc3QgeyByZXR1cm4gbV9uQ291bnQgPT0gMTsgfQotCi0gICBwcml2YXRlOgotICAgIH5IYW5kbGUoKSB7fQotCi0gICAgaW50cHRyX3QgbV9uQ291bnQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFQsIEQ+IG1fcE9iajsKLSAgfTsKLQotICBDRlhfUmV0YWluUHRyPEhhbmRsZT4gbV9wSGFuZGxlOwotfTsKLQotI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0NGWF9XRUFLX1BUUl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jZnhfd2Vha19wdHJfdW5pdHRlc3QuY3BwIGIvY29yZS9meGNydC9jZnhfd2Vha19wdHJfdW5pdHRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2Y2M2MzLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjcnQvY2Z4X3dlYWtfcHRyX3VuaXR0ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF93ZWFrX3B0ci5oIgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgotI2luY2x1ZGUgInRlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIFBzZXVkb0RlbGV0YWJsZTsKLXVzaW5nIFdlYWtQdHIgPSBDRlhfV2Vha1B0cjxQc2V1ZG9EZWxldGFibGUsIFJlbGVhc2VEZWxldGVyPFBzZXVkb0RlbGV0YWJsZT4+OwotdXNpbmcgVW5pcXVlUHRyID0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8UHNldWRvRGVsZXRhYmxlLCBSZWxlYXNlRGVsZXRlcjxQc2V1ZG9EZWxldGFibGU+PjsKLQotY2xhc3MgUHNldWRvRGVsZXRhYmxlIHsKLSBwdWJsaWM6Ci0gIFBzZXVkb0RlbGV0YWJsZSgpIDogZGVsZXRlX2NvdW50XygwKSB7fQotICB2b2lkIFJlbGVhc2UoKSB7Ci0gICAgKytkZWxldGVfY291bnRfOwotICAgIG5leHRfLlJlc2V0KCk7Ci0gIH0KLSAgdm9pZCBTZXROZXh0KGNvbnN0IFdlYWtQdHImIG5leHQpIHsgbmV4dF8gPSBuZXh0OyB9Ci0gIGludCBkZWxldGVfY291bnQoKSBjb25zdCB7IHJldHVybiBkZWxldGVfY291bnRfOyB9Ci0KLSBwcml2YXRlOgotICBpbnQgZGVsZXRlX2NvdW50XzsKLSAgV2Vha1B0ciBuZXh0XzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1URVNUKGZ4Y3J0LCBXZWFrUHRyTnVsbCkgewotICBXZWFrUHRyIHB0cjE7Ci0gIEVYUEVDVF9GQUxTRShwdHIxKTsKLQotICBXZWFrUHRyIHB0cjI7Ci0gIEVYUEVDVF9UUlVFKHB0cjEgPT0gcHRyMik7Ci0gIEVYUEVDVF9GQUxTRShwdHIxICE9IHB0cjIpOwotCi0gIFdlYWtQdHIgcHRyMyhwdHIxKTsKLSAgRVhQRUNUX1RSVUUocHRyMSA9PSBwdHIzKTsKLSAgRVhQRUNUX0ZBTFNFKHB0cjEgIT0gcHRyMyk7Ci0KLSAgV2Vha1B0ciBwdHI0ID0gcHRyMTsKLSAgRVhQRUNUX1RSVUUocHRyMSA9PSBwdHI0KTsKLSAgRVhQRUNUX0ZBTFNFKHB0cjEgIT0gcHRyNCk7Ci19Ci0KLVRFU1QoZnhjcnQsIFdlYWtQdHJOb25OdWxsKSB7Ci0gIFBzZXVkb0RlbGV0YWJsZSB0aGluZzsKLSAgRVhQRUNUX0VRKDAsIHRoaW5nLmRlbGV0ZV9jb3VudCgpKTsKLSAgewotICAgIFVuaXF1ZVB0ciB1bmlxdWUoJnRoaW5nKTsKLSAgICBXZWFrUHRyIHB0cjEoc3RkOjptb3ZlKHVuaXF1ZSkpOwotICAgIEVYUEVDVF9UUlVFKHB0cjEpOwotICAgIEVYUEVDVF9FUSgmdGhpbmcsIHB0cjEuR2V0KCkpOwotCi0gICAgV2Vha1B0ciBwdHIyOwotICAgIEVYUEVDVF9GQUxTRShwdHIxID09IHB0cjIpOwotICAgIEVYUEVDVF9UUlVFKHB0cjEgIT0gcHRyMik7Ci0gICAgewotICAgICAgV2Vha1B0ciBwdHIzKHB0cjEpOwotICAgICAgRVhQRUNUX1RSVUUocHRyMSA9PSBwdHIzKTsKLSAgICAgIEVYUEVDVF9GQUxTRShwdHIxICE9IHB0cjMpOwotICAgICAgRVhQRUNUX0VRKCZ0aGluZywgcHRyMy5HZXQoKSk7Ci0gICAgICB7Ci0gICAgICAgIFdlYWtQdHIgcHRyNCA9IHB0cjE7Ci0gICAgICAgIEVYUEVDVF9UUlVFKHB0cjEgPT0gcHRyNCk7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShwdHIxICE9IHB0cjQpOwotICAgICAgICBFWFBFQ1RfRVEoJnRoaW5nLCBwdHI0LkdldCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgRVhQRUNUX0VRKDAsIHRoaW5nLmRlbGV0ZV9jb3VudCgpKTsKLSAgfQotICBFWFBFQ1RfRVEoMSwgdGhpbmcuZGVsZXRlX2NvdW50KCkpOwotfQotCi1URVNUKGZ4Y3J0LCBXZWFrUHRyUmVzZXROdWxsKSB7Ci0gIFBzZXVkb0RlbGV0YWJsZSB0aGluZzsKLSAgewotICAgIFVuaXF1ZVB0ciB1bmlxdWUoJnRoaW5nKTsKLSAgICBXZWFrUHRyIHB0cjEoc3RkOjptb3ZlKHVuaXF1ZSkpOwotICAgIFdlYWtQdHIgcHRyMiA9IHB0cjE7Ci0gICAgcHRyMS5SZXNldCgpOwotICAgIEVYUEVDVF9GQUxTRShwdHIxKTsKLSAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcHRyMS5HZXQoKSk7Ci0gICAgRVhQRUNUX1RSVUUocHRyMik7Ci0gICAgRVhQRUNUX0VRKCZ0aGluZywgcHRyMi5HZXQoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKHB0cjEgPT0gcHRyMik7Ci0gICAgRVhQRUNUX1RSVUUocHRyMSAhPSBwdHIyKTsKLSAgICBFWFBFQ1RfRVEoMCwgdGhpbmcuZGVsZXRlX2NvdW50KCkpOwotICB9Ci0gIEVYUEVDVF9FUSgxLCB0aGluZy5kZWxldGVfY291bnQoKSk7Ci19Ci0KLVRFU1QoZnhjcnQsIFdlYWtQdHJSZXNldE5vbk51bGwpIHsKLSAgUHNldWRvRGVsZXRhYmxlIHRoaW5nMTsKLSAgUHNldWRvRGVsZXRhYmxlIHRoaW5nMjsKLSAgewotICAgIFVuaXF1ZVB0ciB1bmlxdWUxKCZ0aGluZzEpOwotICAgIFdlYWtQdHIgcHRyMShzdGQ6Om1vdmUodW5pcXVlMSkpOwotICAgIFdlYWtQdHIgcHRyMiA9IHB0cjE7Ci0gICAgVW5pcXVlUHRyIHVuaXF1ZTIoJnRoaW5nMik7Ci0gICAgcHRyMi5SZXNldChzdGQ6Om1vdmUodW5pcXVlMikpOwotICAgIEVYUEVDVF9UUlVFKHB0cjEpOwotICAgIEVYUEVDVF9FUSgmdGhpbmcxLCBwdHIxLkdldCgpKTsKLSAgICBFWFBFQ1RfVFJVRShwdHIyKTsKLSAgICBFWFBFQ1RfRVEoJnRoaW5nMiwgcHRyMi5HZXQoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKHB0cjEgPT0gcHRyMik7Ci0gICAgRVhQRUNUX1RSVUUocHRyMSAhPSBwdHIyKTsKLSAgICBFWFBFQ1RfRVEoMCwgdGhpbmcxLmRlbGV0ZV9jb3VudCgpKTsKLSAgICBFWFBFQ1RfRVEoMCwgdGhpbmcyLmRlbGV0ZV9jb3VudCgpKTsKLSAgfQotICBFWFBFQ1RfRVEoMSwgdGhpbmcxLmRlbGV0ZV9jb3VudCgpKTsKLSAgRVhQRUNUX0VRKDEsIHRoaW5nMi5kZWxldGVfY291bnQoKSk7Ci19Ci0KLVRFU1QoZnhjcnQsIFdlYWtQdHJEZWxldGVPYmplY3QpIHsKLSAgUHNldWRvRGVsZXRhYmxlIHRoaW5nOwotICB7Ci0gICAgVW5pcXVlUHRyIHVuaXF1ZSgmdGhpbmcpOwotICAgIFdlYWtQdHIgcHRyMShzdGQ6Om1vdmUodW5pcXVlKSk7Ci0gICAgV2Vha1B0ciBwdHIyID0gcHRyMTsKLSAgICBwdHIxLkRlbGV0ZU9iamVjdCgpOwotICAgIEVYUEVDVF9GQUxTRShwdHIxKTsKLSAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcHRyMS5HZXQoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKHB0cjIpOwotICAgIEVYUEVDVF9FUShudWxscHRyLCBwdHIyLkdldCgpKTsKLSAgICBFWFBFQ1RfRkFMU0UocHRyMSA9PSBwdHIyKTsKLSAgICBFWFBFQ1RfVFJVRShwdHIxICE9IHB0cjIpOwotICAgIEVYUEVDVF9FUSgxLCB0aGluZy5kZWxldGVfY291bnQoKSk7Ci0gIH0KLSAgRVhQRUNUX0VRKDEsIHRoaW5nLmRlbGV0ZV9jb3VudCgpKTsKLX0KLQotVEVTVChmeGNydCwgV2Vha1B0ckN5Y2xpYykgewotICBQc2V1ZG9EZWxldGFibGUgdGhpbmcxOwotICBQc2V1ZG9EZWxldGFibGUgdGhpbmcyOwotICB7Ci0gICAgVW5pcXVlUHRyIHVuaXF1ZTEoJnRoaW5nMSk7Ci0gICAgVW5pcXVlUHRyIHVuaXF1ZTIoJnRoaW5nMik7Ci0gICAgV2Vha1B0ciBwdHIxKHN0ZDo6bW92ZSh1bmlxdWUxKSk7Ci0gICAgV2Vha1B0ciBwdHIyKHN0ZDo6bW92ZSh1bmlxdWUyKSk7Ci0gICAgcHRyMS0+U2V0TmV4dChwdHIyKTsKLSAgICBwdHIyLT5TZXROZXh0KHB0cjEpOwotICB9Ci0gIC8vIExlYWtzIHdpdGhvdXQgZXhwbGljaXQgY2xlYXIuCi0gIEVYUEVDVF9FUSgwLCB0aGluZzEuZGVsZXRlX2NvdW50KCkpOwotICBFWFBFQ1RfRVEoMCwgdGhpbmcyLmRlbGV0ZV9jb3VudCgpKTsKLX0KLQotVEVTVChmeGNydCwgV2Vha1B0ckN5Y2xpY0RlbGV0ZU9iamVjdCkgewotICBQc2V1ZG9EZWxldGFibGUgdGhpbmcxOwotICBQc2V1ZG9EZWxldGFibGUgdGhpbmcyOwotICB7Ci0gICAgVW5pcXVlUHRyIHVuaXF1ZTEoJnRoaW5nMSk7Ci0gICAgVW5pcXVlUHRyIHVuaXF1ZTIoJnRoaW5nMik7Ci0gICAgV2Vha1B0ciBwdHIxKHN0ZDo6bW92ZSh1bmlxdWUxKSk7Ci0gICAgV2Vha1B0ciBwdHIyKHN0ZDo6bW92ZSh1bmlxdWUyKSk7Ci0gICAgcHRyMS0+U2V0TmV4dChwdHIyKTsKLSAgICBwdHIyLT5TZXROZXh0KHB0cjEpOwotICAgIHB0cjEuRGVsZXRlT2JqZWN0KCk7Ci0gICAgRVhQRUNUX0VRKDEsIHRoaW5nMS5kZWxldGVfY291bnQoKSk7Ci0gICAgRVhQRUNUX0VRKDAsIHRoaW5nMi5kZWxldGVfY291bnQoKSk7Ci0gIH0KLSAgRVhQRUNUX0VRKDEsIHRoaW5nMS5kZWxldGVfY291bnQoKSk7Ci0gIEVYUEVDVF9FUSgxLCB0aGluZzIuZGVsZXRlX2NvdW50KCkpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jZnhfd2lkZXRleHRidWYuY3BwIGIvY29yZS9meGNydC9jZnhfd2lkZXRleHRidWYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YjU5YjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2NmeF93aWRldGV4dGJ1Zi5jcHAKQEAgLTAsMCArMSw2MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfd2lkZXRleHRidWYuaCIKKworc2l6ZV90IENGWF9XaWRlVGV4dEJ1Zjo6R2V0TGVuZ3RoKCkgY29uc3QgeworICByZXR1cm4gbV9EYXRhU2l6ZSAvIHNpemVvZih3Y2hhcl90KTsKK30KKwordm9pZCBDRlhfV2lkZVRleHRCdWY6OkFwcGVuZENoYXIod2NoYXJfdCBjaCkgeworICBFeHBhbmRCdWYoc2l6ZW9mKHdjaGFyX3QpKTsKKyAgKih3Y2hhcl90KikobV9wQnVmZmVyLmdldCgpICsgbV9EYXRhU2l6ZSkgPSBjaDsKKyAgbV9EYXRhU2l6ZSArPSBzaXplb2Yod2NoYXJfdCk7Cit9CisKK0NGWF9XaWRlVGV4dEJ1ZiYgQ0ZYX1dpZGVUZXh0QnVmOjpvcGVyYXRvcjw8KGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBzdHIpIHsKKyAgQXBwZW5kQmxvY2soc3RyLnVudGVybWluYXRlZF9jX3N0cigpLCBzdHIuR2V0TGVuZ3RoKCkgKiBzaXplb2Yod2NoYXJfdCkpOworICByZXR1cm4gKnRoaXM7Cit9CisKK0NGWF9XaWRlVGV4dEJ1ZiYgQ0ZYX1dpZGVUZXh0QnVmOjpvcGVyYXRvcjw8KGNvbnN0IFdpZGVTdHJpbmcmIHN0cikgeworICBBcHBlbmRCbG9jayhzdHIuY19zdHIoKSwgc3RyLkdldExlbmd0aCgpICogc2l6ZW9mKHdjaGFyX3QpKTsKKyAgcmV0dXJuICp0aGlzOworfQorCitDRlhfV2lkZVRleHRCdWYmIENGWF9XaWRlVGV4dEJ1Zjo6b3BlcmF0b3I8PChpbnQgaSkgeworICBjaGFyIGJ1ZlszMl07CisgIEZYU1lTX2l0b2EoaSwgYnVmLCAxMCk7CisgIHNpemVfdCBsZW4gPSBzdHJsZW4oYnVmKTsKKyAgRXhwYW5kQnVmKGxlbiAqIHNpemVvZih3Y2hhcl90KSk7CisgIHdjaGFyX3QqIHN0ciA9ICh3Y2hhcl90KikobV9wQnVmZmVyLmdldCgpICsgbV9EYXRhU2l6ZSk7CisgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbGVuOyBqKyspIHsKKyAgICAqc3RyKysgPSBidWZbal07CisgIH0KKyAgbV9EYXRhU2l6ZSArPSBsZW4gKiBzaXplb2Yod2NoYXJfdCk7CisgIHJldHVybiAqdGhpczsKK30KKworQ0ZYX1dpZGVUZXh0QnVmJiBDRlhfV2lkZVRleHRCdWY6Om9wZXJhdG9yPDwoZG91YmxlIGYpIHsKKyAgY2hhciBidWZbMzJdOworICBzaXplX3QgbGVuID0gRlhfZnRvYSgoZmxvYXQpZiwgYnVmKTsKKyAgRXhwYW5kQnVmKGxlbiAqIHNpemVvZih3Y2hhcl90KSk7CisgIHdjaGFyX3QqIHN0ciA9ICh3Y2hhcl90KikobV9wQnVmZmVyLmdldCgpICsgbV9EYXRhU2l6ZSk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAqc3RyKysgPSBidWZbaV07CisgIH0KKyAgbV9EYXRhU2l6ZSArPSBsZW4gKiBzaXplb2Yod2NoYXJfdCk7CisgIHJldHVybiAqdGhpczsKK30KKworQ0ZYX1dpZGVUZXh0QnVmJiBDRlhfV2lkZVRleHRCdWY6Om9wZXJhdG9yPDwoY29uc3Qgd2NoYXJfdCogbHBzeikgeworICBBcHBlbmRCbG9jayhscHN6LCB3Y3NsZW4obHBzeikgKiBzaXplb2Yod2NoYXJfdCkpOworICByZXR1cm4gKnRoaXM7Cit9CisKK0NGWF9XaWRlVGV4dEJ1ZiYgQ0ZYX1dpZGVUZXh0QnVmOjpvcGVyYXRvcjw8KGNvbnN0IENGWF9XaWRlVGV4dEJ1ZiYgYnVmKSB7CisgIEFwcGVuZEJsb2NrKGJ1Zi5tX3BCdWZmZXIuZ2V0KCksIGJ1Zi5tX0RhdGFTaXplKTsKKyAgcmV0dXJuICp0aGlzOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jZnhfd2lkZXRleHRidWYuaCBiL2NvcmUvZnhjcnQvY2Z4X3dpZGV0ZXh0YnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ1NTNhMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY2Z4X3dpZGV0ZXh0YnVmLmgKQEAgLTAsMCArMSw0NCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfQ0ZYX1dJREVURVhUQlVGX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfQ0ZYX1dJREVURVhUQlVGX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9iaW5hcnlidWYuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisKK2NsYXNzIENGWF9XaWRlVGV4dEJ1ZiA6IHB1YmxpYyBDRlhfQmluYXJ5QnVmIHsKKyBwdWJsaWM6CisgIHZvaWQgQXBwZW5kQ2hhcih3Y2hhcl90IHdjaCk7CisgIHNpemVfdCBHZXRMZW5ndGgoKSBjb25zdCBvdmVycmlkZTsKKyAgd2NoYXJfdCogR2V0QnVmZmVyKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHdjaGFyX3QqPihtX3BCdWZmZXIuZ2V0KCkpOworICB9CisKKyAgV2lkZVN0cmluZ1ZpZXcgQXNTdHJpbmdWaWV3KCkgY29uc3QgeworICAgIHJldHVybiBXaWRlU3RyaW5nVmlldyhyZWludGVycHJldF9jYXN0PGNvbnN0IHdjaGFyX3QqPihtX3BCdWZmZXIuZ2V0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtX0RhdGFTaXplIC8gc2l6ZW9mKHdjaGFyX3QpKTsKKyAgfQorICBXaWRlU3RyaW5nIE1ha2VTdHJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIFdpZGVTdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCB3Y2hhcl90Kj4obV9wQnVmZmVyLmdldCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBtX0RhdGFTaXplIC8gc2l6ZW9mKHdjaGFyX3QpKTsKKyAgfQorCisgIHZvaWQgRGVsZXRlKGludCBzdGFydF9pbmRleCwgaW50IGNvdW50KSB7CisgICAgQ0ZYX0JpbmFyeUJ1Zjo6RGVsZXRlKHN0YXJ0X2luZGV4ICogc2l6ZW9mKHdjaGFyX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCAqIHNpemVvZih3Y2hhcl90KSk7CisgIH0KKworICBDRlhfV2lkZVRleHRCdWYmIG9wZXJhdG9yPDwoaW50IGkpOworICBDRlhfV2lkZVRleHRCdWYmIG9wZXJhdG9yPDwoZG91YmxlIGYpOworICBDRlhfV2lkZVRleHRCdWYmIG9wZXJhdG9yPDwoY29uc3Qgd2NoYXJfdCogbHBzeik7CisgIENGWF9XaWRlVGV4dEJ1ZiYgb3BlcmF0b3I8PChjb25zdCBXaWRlU3RyaW5nVmlldyYgc3RyKTsKKyAgQ0ZYX1dpZGVUZXh0QnVmJiBvcGVyYXRvcjw8KGNvbnN0IFdpZGVTdHJpbmcmIHN0cik7CisgIENGWF9XaWRlVGV4dEJ1ZiYgb3BlcmF0b3I8PChjb25zdCBDRlhfV2lkZVRleHRCdWYmIGJ1Zik7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfQ0ZYX1dJREVURVhUQlVGX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzLmggYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxZDdkMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3MuaApAQCAtMCwwICsxLDI0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9DU1NfQ0ZYX0NTU19IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfc2Vla2FibGVzdHJlYW1wcm94eS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9meF9kaWIuaCIKKworZW51bSBDRlhfQ1NTVkFMVUVUWVBFIHsKKyAgQ0ZYX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgPSAxIDw8IDAsCisgIENGWF9DU1NWQUxVRVRZUEVfTGlzdCA9IDEgPDwgMSwKKyAgQ0ZYX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmQgPSAxIDw8IDIsCisgIC8vIE5vdGUgdGhlIHZhbHVlcyBiZWxvdyB0aGlzIGNvbW1lbnQgbXVzdCBiZSA+IDB4MEYgc28gd2UgY2FuIG1hc2sgdGhlIGFib3ZlLgorICBDRlhfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyID0gMSA8PCA0LAorICBDRlhfQ1NTVkFMVUVUWVBFX01heWJlRW51bSA9IDEgPDwgNSwKKyAgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZVN0cmluZyA9IDEgPDwgNywKKyAgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yID0gMSA8PCA4Cit9OworCitlbnVtIGNsYXNzIENGWF9DU1NQcmltaXRpdmVUeXBlIDogdWludDhfdCB7CisgIFVua25vd24gPSAwLAorICBOdW1iZXIsCisgIFN0cmluZywKKyAgUkdCLAorICBFbnVtLAorICBGdW5jdGlvbiwKKyAgTGlzdCwKK307CisKK2VudW0gY2xhc3MgQ0ZYX0NTU1Byb3BlcnR5VmFsdWUgOiB1aW50OF90IHsKKyAgQm9sZGVyID0gMCwKKyAgTm9uZSwKKyAgRG90LAorICBTdWIsCisgIFRvcCwKKyAgUmlnaHQsCisgIE5vcm1hbCwKKyAgQXV0bywKKyAgVGV4dCwKKyAgWFNtYWxsLAorICBUaGluLAorICBTbWFsbCwKKyAgQm90dG9tLAorICBVbmRlcmxpbmUsCisgIERvdWJsZSwKKyAgTGlnaHRlciwKKyAgT2JsaXF1ZSwKKyAgU3VwZXIsCisgIENlbnRlciwKKyAgWHhMYXJnZSwKKyAgU21hbGxlciwKKyAgQmFzZWxpbmUsCisgIFRoaWNrLAorICBKdXN0aWZ5LAorICBNaWRkbGUsCisgIE1lZGl1bSwKKyAgTGlzdEl0ZW0sCisgIFh4U21hbGwsCisgIEJvbGQsCisgIFNtYWxsQ2FwcywKKyAgSW5saW5lLAorICBPdmVybGluZSwKKyAgVGV4dEJvdHRvbSwKKyAgTGFyZ2VyLAorICBJbmxpbmVUYWJsZSwKKyAgSW5saW5lQmxvY2ssCisgIEJsaW5rLAorICBCbG9jaywKKyAgSXRhbGljLAorICBMaW5lVGhyb3VnaCwKKyAgWExhcmdlLAorICBMYXJnZSwKKyAgTGVmdCwKKyAgVGV4dFRvcCwKKyAgTEFTVF9NQVJLRVIKK307CisKK2VudW0gY2xhc3MgQ0ZYX0NTU1Byb3BlcnR5IDogdWludDhfdCB7CisgIEJvcmRlckxlZnQgPSAwLAorICBUb3AsCisgIE1hcmdpbiwKKyAgVGV4dEluZGVudCwKKyAgUmlnaHQsCisgIFBhZGRpbmdMZWZ0LAorICBNYXJnaW5MZWZ0LAorICBCb3JkZXIsCisgIEJvcmRlclRvcCwKKyAgQm90dG9tLAorICBQYWRkaW5nUmlnaHQsCisgIEJvcmRlckJvdHRvbSwKKyAgRm9udEZhbWlseSwKKyAgRm9udFdlaWdodCwKKyAgQ29sb3IsCisgIExldHRlclNwYWNpbmcsCisgIFRleHRBbGlnbiwKKyAgQm9yZGVyUmlnaHRXaWR0aCwKKyAgVmVydGljYWxBbGlnbiwKKyAgUGFkZGluZ1RvcCwKKyAgRm9udFZhcmlhbnQsCisgIEJvcmRlcldpZHRoLAorICBCb3JkZXJCb3R0b21XaWR0aCwKKyAgQm9yZGVyUmlnaHQsCisgIEZvbnRTaXplLAorICBCb3JkZXJTcGFjaW5nLAorICBGb250U3R5bGUsCisgIEZvbnQsCisgIExpbmVIZWlnaHQsCisgIE1hcmdpblJpZ2h0LAorICBCb3JkZXJMZWZ0V2lkdGgsCisgIERpc3BsYXksCisgIFBhZGRpbmdCb3R0b20sCisgIEJvcmRlclRvcFdpZHRoLAorICBXb3JkU3BhY2luZywKKyAgTGVmdCwKKyAgVGV4dERlY29yYXRpb24sCisgIFBhZGRpbmcsCisgIE1hcmdpbkJvdHRvbSwKKyAgTWFyZ2luVG9wLAorICBMQVNUX01BUktFUgorfTsKKworZW51bSBjbGFzcyBDRlhfQ1NTU2VsZWN0b3JUeXBlIDogdWludDhfdCB7IEVsZW1lbnQgPSAwLCBEZXNjZW5kYW50IH07CisKK2VudW0gY2xhc3MgQ0ZYX0NTU0xlbmd0aFVuaXQgOiB1aW50OF90IHsKKyAgQXV0bywKKyAgTm9uZSwKKyAgTm9ybWFsLAorICBQb2ludCwKKyAgUGVyY2VudCwKK307CisKK2VudW0gY2xhc3MgQ0ZYX0NTU0Rpc3BsYXkgOiB1aW50OF90IHsKKyAgTm9uZSwKKyAgTGlzdEl0ZW0sCisgIEJsb2NrLAorICBJbmxpbmUsCisgIElubGluZUJsb2NrLAorICBJbmxpbmVUYWJsZSwKK307CisKK2VudW0gY2xhc3MgQ0ZYX0NTU0ZvbnRTdHlsZSA6IHVpbnQ4X3QgeworICBOb3JtYWwsCisgIEl0YWxpYywKK307CisKK2VudW0gY2xhc3MgQ0ZYX0NTU1RleHRBbGlnbiA6IHVpbnQ4X3QgeworICBMZWZ0LAorICBSaWdodCwKKyAgQ2VudGVyLAorICBKdXN0aWZ5LAorICBKdXN0aWZ5QWxsLAorfTsKKworZW51bSBjbGFzcyBDRlhfQ1NTVmVydGljYWxBbGlnbiA6IHVpbnQ4X3QgeworICBCYXNlbGluZSwKKyAgU3ViLAorICBTdXBlciwKKyAgVG9wLAorICBUZXh0VG9wLAorICBNaWRkbGUsCisgIEJvdHRvbSwKKyAgVGV4dEJvdHRvbSwKKyAgTnVtYmVyLAorfTsKKworZW51bSBjbGFzcyBDRlhfQ1NTRm9udFZhcmlhbnQgOiB1aW50OF90IHsKKyAgTm9ybWFsLAorICBTbWFsbENhcHMsCit9OworCitlbnVtIENGWF9DU1NURVhUREVDT1JBVElPTiB7CisgIENGWF9DU1NURVhUREVDT1JBVElPTl9Ob25lID0gMCwKKyAgQ0ZYX0NTU1RFWFRERUNPUkFUSU9OX1VuZGVybGluZSA9IDEgPDwgMCwKKyAgQ0ZYX0NTU1RFWFRERUNPUkFUSU9OX092ZXJsaW5lID0gMSA8PCAxLAorICBDRlhfQ1NTVEVYVERFQ09SQVRJT05fTGluZVRocm91Z2ggPSAxIDw8IDIsCisgIENGWF9DU1NURVhUREVDT1JBVElPTl9CbGluayA9IDEgPDwgMywKKyAgQ0ZYX0NTU1RFWFRERUNPUkFUSU9OX0RvdWJsZSA9IDEgPDwgNCwKK307CisKK2NsYXNzIENGWF9DU1NMZW5ndGggeworIHB1YmxpYzoKKyAgQ0ZYX0NTU0xlbmd0aCgpIHt9CisKKyAgZXhwbGljaXQgQ0ZYX0NTU0xlbmd0aChDRlhfQ1NTTGVuZ3RoVW5pdCBlVW5pdCkgOiBtX3VuaXQoZVVuaXQpIHt9CisKKyAgQ0ZYX0NTU0xlbmd0aChDRlhfQ1NTTGVuZ3RoVW5pdCBlVW5pdCwgZmxvYXQgZlZhbHVlKQorICAgICAgOiBtX3VuaXQoZVVuaXQpLCBtX2ZWYWx1ZShmVmFsdWUpIHt9CisKKyAgQ0ZYX0NTU0xlbmd0aCYgU2V0KENGWF9DU1NMZW5ndGhVbml0IGVVbml0KSB7CisgICAgbV91bml0ID0gZVVuaXQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQ0ZYX0NTU0xlbmd0aCYgU2V0KENGWF9DU1NMZW5ndGhVbml0IGVVbml0LCBmbG9hdCBmVmFsdWUpIHsKKyAgICBtX3VuaXQgPSBlVW5pdDsKKyAgICBtX2ZWYWx1ZSA9IGZWYWx1ZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBDRlhfQ1NTTGVuZ3RoVW5pdCBHZXRVbml0KCkgY29uc3QgeyByZXR1cm4gbV91bml0OyB9CisKKyAgZmxvYXQgR2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBtX2ZWYWx1ZTsgfQorICBib29sIE5vblplcm8oKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KG1fZlZhbHVlKSAhPSAwOyB9CisKKyBwcml2YXRlOgorICBDRlhfQ1NTTGVuZ3RoVW5pdCBtX3VuaXQ7CisgIGZsb2F0IG1fZlZhbHVlOworfTsKKworY2xhc3MgQ0ZYX0NTU1JlY3QgeworIHB1YmxpYzoKKyAgQ0ZYX0NTU1JlY3QoKSB7fQorCisgIENGWF9DU1NSZWN0KENGWF9DU1NMZW5ndGhVbml0IGVVbml0LCBmbG9hdCB2YWwpCisgICAgICA6IGxlZnQoZVVuaXQsIHZhbCksCisgICAgICAgIHRvcChlVW5pdCwgdmFsKSwKKyAgICAgICAgcmlnaHQoZVVuaXQsIHZhbCksCisgICAgICAgIGJvdHRvbShlVW5pdCwgdmFsKSB7fQorCisgIENGWF9DU1NSZWN0JiBTZXQoQ0ZYX0NTU0xlbmd0aFVuaXQgZVVuaXQpIHsKKyAgICBsZWZ0LlNldChlVW5pdCk7CisgICAgdG9wLlNldChlVW5pdCk7CisgICAgcmlnaHQuU2V0KGVVbml0KTsKKyAgICBib3R0b20uU2V0KGVVbml0KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgQ0ZYX0NTU1JlY3QmIFNldChDRlhfQ1NTTGVuZ3RoVW5pdCBlVW5pdCwgZmxvYXQgZlZhbHVlKSB7CisgICAgbGVmdC5TZXQoZVVuaXQsIGZWYWx1ZSk7CisgICAgdG9wLlNldChlVW5pdCwgZlZhbHVlKTsKKyAgICByaWdodC5TZXQoZVVuaXQsIGZWYWx1ZSk7CisgICAgYm90dG9tLlNldChlVW5pdCwgZlZhbHVlKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBDRlhfQ1NTTGVuZ3RoIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWENSVF9DU1NfQ0ZYX0NTU19IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jc3MvY2Z4X2Nzc2NvbG9ydmFsdWUuY3BwIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc2NvbG9ydmFsdWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNTQ3M2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzY29sb3J2YWx1ZS5jcHAKQEAgLTAsMCArMSwxMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc2NvbG9ydmFsdWUuaCIKKworQ0ZYX0NTU0NvbG9yVmFsdWU6OkNGWF9DU1NDb2xvclZhbHVlKEZYX0FSR0IgdmFsdWUpCisgICAgOiBDRlhfQ1NTVmFsdWUoQ0ZYX0NTU1ByaW1pdGl2ZVR5cGU6OlJHQiksIHZhbHVlXyh2YWx1ZSkge30KKworQ0ZYX0NTU0NvbG9yVmFsdWU6On5DRlhfQ1NTQ29sb3JWYWx1ZSgpIHt9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzY29sb3J2YWx1ZS5oIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc2NvbG9ydmFsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTljMGM1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc2NvbG9ydmFsdWUuaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENSVF9DU1NfQ0ZYX0NTU0NPTE9SVkFMVUVfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9DU1NfQ0ZYX0NTU0NPTE9SVkFMVUVfSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3N2YWx1ZS5oIgorCitjbGFzcyBDRlhfQ1NTQ29sb3JWYWx1ZSA6IHB1YmxpYyBDRlhfQ1NTVmFsdWUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0ZYX0NTU0NvbG9yVmFsdWUoRlhfQVJHQiBjb2xvcik7CisgIH5DRlhfQ1NTQ29sb3JWYWx1ZSgpIG92ZXJyaWRlOworCisgIEZYX0FSR0IgVmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKworIHByaXZhdGU6CisgIEZYX0FSR0IgdmFsdWVfOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0NTU19DRlhfQ1NTQ09MT1JWQUxVRV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jc3MvY2Z4X2Nzc2NvbXB1dGVkc3R5bGUuY3BwIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc2NvbXB1dGVkc3R5bGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZTg4YTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzY29tcHV0ZWRzdHlsZS5jcHAKQEAgLTAsMCArMSwxOTUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3Njb21wdXRlZHN0eWxlLmgiCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3RyaW5ndmFsdWUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzdmFsdWVsaXN0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorCitDRlhfQ1NTQ29tcHV0ZWRTdHlsZTo6Q0ZYX0NTU0NvbXB1dGVkU3R5bGUoKSB7fQorCitDRlhfQ1NTQ29tcHV0ZWRTdHlsZTo6fkNGWF9DU1NDb21wdXRlZFN0eWxlKCkge30KKworYm9vbCBDRlhfQ1NTQ29tcHV0ZWRTdHlsZTo6R2V0Q3VzdG9tU3R5bGUoY29uc3QgV2lkZVN0cmluZyYgd3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyYgd3NWYWx1ZSkgY29uc3QgeworICBmb3IgKGF1dG8gaXRlciA9IG1fQ3VzdG9tUHJvcGVydGllcy5yYmVnaW4oKTsKKyAgICAgICBpdGVyICE9IG1fQ3VzdG9tUHJvcGVydGllcy5yZW5kKCk7IGl0ZXIrKykgeworICAgIGlmICh3c05hbWUgPT0gaXRlci0+bmFtZSgpKSB7CisgICAgICB3c1ZhbHVlID0gaXRlci0+dmFsdWUoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2ludDMyX3QgQ0ZYX0NTU0NvbXB1dGVkU3R5bGU6OkNvdW50Rm9udEZhbWlsaWVzKCkgY29uc3QgeworICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fcEZvbnRGYW1pbHkKKyAgICAgICAgICAgICA/IG1fSW5oZXJpdGVkRGF0YS5tX3BGb250RmFtaWx5LT5Db3VudFZhbHVlcygpCisgICAgICAgICAgICAgOiAwOworfQorCitjb25zdCBXaWRlU3RyaW5nIENGWF9DU1NDb21wdXRlZFN0eWxlOjpHZXRGb250RmFtaWx5KGludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX3BGb250RmFtaWx5LT5HZXRWYWx1ZShpbmRleCkKKyAgICAgIC5BczxDRlhfQ1NTU3RyaW5nVmFsdWU+KCkKKyAgICAgIC0+VmFsdWUoKTsKK30KKwordWludDE2X3QgQ0ZYX0NTU0NvbXB1dGVkU3R5bGU6OkdldEZvbnRXZWlnaHQoKSBjb25zdCB7CisgIHJldHVybiBtX0luaGVyaXRlZERhdGEubV93Rm9udFdlaWdodDsKK30KKworQ0ZYX0NTU0ZvbnRWYXJpYW50IENGWF9DU1NDb21wdXRlZFN0eWxlOjpHZXRGb250VmFyaWFudCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX2VGb250VmFyaWFudDsKK30KKworQ0ZYX0NTU0ZvbnRTdHlsZSBDRlhfQ1NTQ29tcHV0ZWRTdHlsZTo6R2V0Rm9udFN0eWxlKCkgY29uc3QgeworICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fZUZvbnRTdHlsZTsKK30KKworZmxvYXQgQ0ZYX0NTU0NvbXB1dGVkU3R5bGU6OkdldEZvbnRTaXplKCkgY29uc3QgeworICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplOworfQorCitGWF9BUkdCIENGWF9DU1NDb21wdXRlZFN0eWxlOjpHZXRDb2xvcigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX2R3Rm9udENvbG9yOworfQorCit2b2lkIENGWF9DU1NDb21wdXRlZFN0eWxlOjpTZXRGb250V2VpZ2h0KHVpbnQxNl90IHdGb250V2VpZ2h0KSB7CisgIG1fSW5oZXJpdGVkRGF0YS5tX3dGb250V2VpZ2h0ID0gd0ZvbnRXZWlnaHQ7Cit9CisKK3ZvaWQgQ0ZYX0NTU0NvbXB1dGVkU3R5bGU6OlNldEZvbnRWYXJpYW50KENGWF9DU1NGb250VmFyaWFudCBlRm9udFZhcmlhbnQpIHsKKyAgbV9Jbmhlcml0ZWREYXRhLm1fZUZvbnRWYXJpYW50ID0gZUZvbnRWYXJpYW50OworfQorCit2b2lkIENGWF9DU1NDb21wdXRlZFN0eWxlOjpTZXRGb250U3R5bGUoQ0ZYX0NTU0ZvbnRTdHlsZSBlRm9udFN0eWxlKSB7CisgIG1fSW5oZXJpdGVkRGF0YS5tX2VGb250U3R5bGUgPSBlRm9udFN0eWxlOworfQorCit2b2lkIENGWF9DU1NDb21wdXRlZFN0eWxlOjpTZXRGb250U2l6ZShmbG9hdCBmRm9udFNpemUpIHsKKyAgbV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplID0gZkZvbnRTaXplOworfQorCit2b2lkIENGWF9DU1NDb21wdXRlZFN0eWxlOjpTZXRDb2xvcihGWF9BUkdCIGR3Rm9udENvbG9yKSB7CisgIG1fSW5oZXJpdGVkRGF0YS5tX2R3Rm9udENvbG9yID0gZHdGb250Q29sb3I7Cit9CisKK2NvbnN0IENGWF9DU1NSZWN0KiBDRlhfQ1NTQ29tcHV0ZWRTdHlsZTo6R2V0Qm9yZGVyV2lkdGgoKSBjb25zdCB7CisgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9iSGFzQm9yZGVyID8gJihtX05vbkluaGVyaXRlZERhdGEubV9Cb3JkZXJXaWR0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyOworfQorCitjb25zdCBDRlhfQ1NTUmVjdCogQ0ZYX0NTU0NvbXB1dGVkU3R5bGU6OkdldE1hcmdpbldpZHRoKCkgY29uc3QgeworICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fYkhhc01hcmdpbiA/ICYobV9Ob25Jbmhlcml0ZWREYXRhLm1fTWFyZ2luV2lkdGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cjsKK30KKworY29uc3QgQ0ZYX0NTU1JlY3QqIENGWF9DU1NDb21wdXRlZFN0eWxlOjpHZXRQYWRkaW5nV2lkdGgoKSBjb25zdCB7CisgIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9iSGFzUGFkZGluZyA/ICYobV9Ob25Jbmhlcml0ZWREYXRhLm1fUGFkZGluZ1dpZHRoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyOworfQorCit2b2lkIENGWF9DU1NDb21wdXRlZFN0eWxlOjpTZXRNYXJnaW5XaWR0aChjb25zdCBDRlhfQ1NTUmVjdCYgcmVjdCkgeworICBtX05vbkluaGVyaXRlZERhdGEubV9NYXJnaW5XaWR0aCA9IHJlY3Q7CisgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2JIYXNNYXJnaW4gPSB0cnVlOworfQorCit2b2lkIENGWF9DU1NDb21wdXRlZFN0eWxlOjpTZXRQYWRkaW5nV2lkdGgoY29uc3QgQ0ZYX0NTU1JlY3QmIHJlY3QpIHsKKyAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fUGFkZGluZ1dpZHRoID0gcmVjdDsKKyAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fYkhhc1BhZGRpbmcgPSB0cnVlOworfQorCitDRlhfQ1NTRGlzcGxheSBDRlhfQ1NTQ29tcHV0ZWRTdHlsZTo6R2V0RGlzcGxheSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VEaXNwbGF5OworfQorCitmbG9hdCBDRlhfQ1NTQ29tcHV0ZWRTdHlsZTo6R2V0TGluZUhlaWdodCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX2ZMaW5lSGVpZ2h0OworfQorCitjb25zdCBDRlhfQ1NTTGVuZ3RoJiBDRlhfQ1NTQ29tcHV0ZWRTdHlsZTo6R2V0VGV4dEluZGVudCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX1RleHRJbmRlbnQ7Cit9CisKK0NGWF9DU1NUZXh0QWxpZ24gQ0ZYX0NTU0NvbXB1dGVkU3R5bGU6OkdldFRleHRBbGlnbigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX2VUZXh0QWxpZ247Cit9CisKK0NGWF9DU1NWZXJ0aWNhbEFsaWduIENGWF9DU1NDb21wdXRlZFN0eWxlOjpHZXRWZXJ0aWNhbEFsaWduKCkgY29uc3QgeworICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fZVZlcnRpY2FsQWxpZ247Cit9CisKK2Zsb2F0IENGWF9DU1NDb21wdXRlZFN0eWxlOjpHZXROdW1iZXJWZXJ0aWNhbEFsaWduKCkgY29uc3QgeworICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fZlZlcnRpY2FsQWxpZ247Cit9CisKK3VpbnQzMl90IENGWF9DU1NDb21wdXRlZFN0eWxlOjpHZXRUZXh0RGVjb3JhdGlvbigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2R3VGV4dERlY29yYXRpb247Cit9CisKK2NvbnN0IENGWF9DU1NMZW5ndGgmIENGWF9DU1NDb21wdXRlZFN0eWxlOjpHZXRMZXR0ZXJTcGFjaW5nKCkgY29uc3QgeworICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fTGV0dGVyU3BhY2luZzsKK30KKwordm9pZCBDRlhfQ1NTQ29tcHV0ZWRTdHlsZTo6U2V0TGluZUhlaWdodChmbG9hdCBmTGluZUhlaWdodCkgeworICBtX0luaGVyaXRlZERhdGEubV9mTGluZUhlaWdodCA9IGZMaW5lSGVpZ2h0OworfQorCit2b2lkIENGWF9DU1NDb21wdXRlZFN0eWxlOjpTZXRUZXh0SW5kZW50KGNvbnN0IENGWF9DU1NMZW5ndGgmIHRleHRJbmRlbnQpIHsKKyAgbV9Jbmhlcml0ZWREYXRhLm1fVGV4dEluZGVudCA9IHRleHRJbmRlbnQ7Cit9CisKK3ZvaWQgQ0ZYX0NTU0NvbXB1dGVkU3R5bGU6OlNldFRleHRBbGlnbihDRlhfQ1NTVGV4dEFsaWduIGVUZXh0QWxpZ24pIHsKKyAgbV9Jbmhlcml0ZWREYXRhLm1fZVRleHRBbGlnbiA9IGVUZXh0QWxpZ247Cit9CisKK3ZvaWQgQ0ZYX0NTU0NvbXB1dGVkU3R5bGU6OlNldE51bWJlclZlcnRpY2FsQWxpZ24oZmxvYXQgZkFsaWduKSB7CisgIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VWZXJ0aWNhbEFsaWduID0gQ0ZYX0NTU1ZlcnRpY2FsQWxpZ246Ok51bWJlciwKKyAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZlZlcnRpY2FsQWxpZ24gPSBmQWxpZ247Cit9CisKK3ZvaWQgQ0ZYX0NTU0NvbXB1dGVkU3R5bGU6OlNldFRleHREZWNvcmF0aW9uKHVpbnQzMl90IGR3VGV4dERlY29yYXRpb24pIHsKKyAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZHdUZXh0RGVjb3JhdGlvbiA9IGR3VGV4dERlY29yYXRpb247Cit9CisKK3ZvaWQgQ0ZYX0NTU0NvbXB1dGVkU3R5bGU6OlNldExldHRlclNwYWNpbmcoCisgICAgY29uc3QgQ0ZYX0NTU0xlbmd0aCYgbGV0dGVyU3BhY2luZykgeworICBtX0luaGVyaXRlZERhdGEubV9MZXR0ZXJTcGFjaW5nID0gbGV0dGVyU3BhY2luZzsKK30KKwordm9pZCBDRlhfQ1NTQ29tcHV0ZWRTdHlsZTo6QWRkQ3VzdG9tU3R5bGUoY29uc3QgQ0ZYX0NTU0N1c3RvbVByb3BlcnR5JiBwcm9wKSB7CisgIC8vIEZvcmNlIHRoZSBwcm9wZXJ0eSB0byBiZSBjb3BpZWQgc28gd2UgYXJlbid0IGRlcGVuZGVudCBvbiB0aGUgbGlmZXRpbWUKKyAgLy8gb2Ygd2hhdGV2ZXIgY3VycmVudGx5IG93bnMgaXQuCisgIG1fQ3VzdG9tUHJvcGVydGllcy5wdXNoX2JhY2socHJvcCk7Cit9CisKK0NGWF9DU1NDb21wdXRlZFN0eWxlOjpJbmhlcml0ZWREYXRhOjpJbmhlcml0ZWREYXRhKCkKKyAgICA6IG1fTGV0dGVyU3BhY2luZyhDRlhfQ1NTTGVuZ3RoVW5pdDo6Tm9ybWFsKSwKKyAgICAgIG1fV29yZFNwYWNpbmcoQ0ZYX0NTU0xlbmd0aFVuaXQ6Ok5vcm1hbCksCisgICAgICBtX1RleHRJbmRlbnQoQ0ZYX0NTU0xlbmd0aFVuaXQ6OlBvaW50LCAwKSwKKyAgICAgIG1fcEZvbnRGYW1pbHkobnVsbHB0ciksCisgICAgICBtX2ZGb250U2l6ZSgxMi4wZiksCisgICAgICBtX2ZMaW5lSGVpZ2h0KDE0LjBmKSwKKyAgICAgIG1fZHdGb250Q29sb3IoMHhGRjAwMDAwMCksCisgICAgICBtX3dGb250V2VpZ2h0KDQwMCksCisgICAgICBtX2VGb250VmFyaWFudChDRlhfQ1NTRm9udFZhcmlhbnQ6Ok5vcm1hbCksCisgICAgICBtX2VGb250U3R5bGUoQ0ZYX0NTU0ZvbnRTdHlsZTo6Tm9ybWFsKSwKKyAgICAgIG1fZVRleHRBbGlnbihDRlhfQ1NTVGV4dEFsaWduOjpMZWZ0KSB7fQorCitDRlhfQ1NTQ29tcHV0ZWRTdHlsZTo6SW5oZXJpdGVkRGF0YTo6fkluaGVyaXRlZERhdGEoKSB7fQorCitDRlhfQ1NTQ29tcHV0ZWRTdHlsZTo6Tm9uSW5oZXJpdGVkRGF0YTo6Tm9uSW5oZXJpdGVkRGF0YSgpCisgICAgOiBtX01hcmdpbldpZHRoKENGWF9DU1NMZW5ndGhVbml0OjpQb2ludCwgMCksCisgICAgICBtX0JvcmRlcldpZHRoKENGWF9DU1NMZW5ndGhVbml0OjpQb2ludCwgMCksCisgICAgICBtX1BhZGRpbmdXaWR0aChDRlhfQ1NTTGVuZ3RoVW5pdDo6UG9pbnQsIDApLAorICAgICAgbV9mVmVydGljYWxBbGlnbigwLjBmKSwKKyAgICAgIG1fZURpc3BsYXkoQ0ZYX0NTU0Rpc3BsYXk6OklubGluZSksCisgICAgICBtX2VWZXJ0aWNhbEFsaWduKENGWF9DU1NWZXJ0aWNhbEFsaWduOjpCYXNlbGluZSksCisgICAgICBtX2R3VGV4dERlY29yYXRpb24oMCksCisgICAgICBtX2JIYXNNYXJnaW4oZmFsc2UpLAorICAgICAgbV9iSGFzQm9yZGVyKGZhbHNlKSwKKyAgICAgIG1fYkhhc1BhZGRpbmcoZmFsc2UpIHt9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzY29tcHV0ZWRzdHlsZS5oIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc2NvbXB1dGVkc3R5bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjQ0YTZkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc2NvbXB1dGVkc3R5bGUuaApAQCAtMCwwICsxLDEwOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NDT01QVVRFRFNUWUxFX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NDT01QVVRFRFNUWUxFX0hfCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc2N1c3RvbXByb3BlcnR5LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKworY2xhc3MgQ0ZYX0NTU1ZhbHVlTGlzdDsKKworY2xhc3MgQ0ZYX0NTU0NvbXB1dGVkU3R5bGUgOiBwdWJsaWMgUmV0YWluYWJsZSB7CisgcHVibGljOgorICBjbGFzcyBJbmhlcml0ZWREYXRhIHsKKyAgIHB1YmxpYzoKKyAgICBJbmhlcml0ZWREYXRhKCk7CisgICAgfkluaGVyaXRlZERhdGEoKTsKKworICAgIENGWF9DU1NMZW5ndGggbV9MZXR0ZXJTcGFjaW5nOworICAgIENGWF9DU1NMZW5ndGggbV9Xb3JkU3BhY2luZzsKKyAgICBDRlhfQ1NTTGVuZ3RoIG1fVGV4dEluZGVudDsKKyAgICBSZXRhaW5QdHI8Q0ZYX0NTU1ZhbHVlTGlzdD4gbV9wRm9udEZhbWlseTsKKyAgICBmbG9hdCBtX2ZGb250U2l6ZTsKKyAgICBmbG9hdCBtX2ZMaW5lSGVpZ2h0OworICAgIEZYX0FSR0IgbV9kd0ZvbnRDb2xvcjsKKyAgICB1aW50MTZfdCBtX3dGb250V2VpZ2h0OworICAgIENGWF9DU1NGb250VmFyaWFudCBtX2VGb250VmFyaWFudDsKKyAgICBDRlhfQ1NTRm9udFN0eWxlIG1fZUZvbnRTdHlsZTsKKyAgICBDRlhfQ1NTVGV4dEFsaWduIG1fZVRleHRBbGlnbjsKKyAgfTsKKworICBjbGFzcyBOb25Jbmhlcml0ZWREYXRhIHsKKyAgIHB1YmxpYzoKKyAgICBOb25Jbmhlcml0ZWREYXRhKCk7CisKKyAgICBDRlhfQ1NTUmVjdCBtX01hcmdpbldpZHRoOworICAgIENGWF9DU1NSZWN0IG1fQm9yZGVyV2lkdGg7CisgICAgQ0ZYX0NTU1JlY3QgbV9QYWRkaW5nV2lkdGg7CisgICAgQ0ZYX0NTU0xlbmd0aCBtX1RvcDsKKyAgICBDRlhfQ1NTTGVuZ3RoIG1fQm90dG9tOworICAgIENGWF9DU1NMZW5ndGggbV9MZWZ0OworICAgIENGWF9DU1NMZW5ndGggbV9SaWdodDsKKyAgICBmbG9hdCBtX2ZWZXJ0aWNhbEFsaWduOworICAgIENGWF9DU1NEaXNwbGF5IG1fZURpc3BsYXk7CisgICAgQ0ZYX0NTU1ZlcnRpY2FsQWxpZ24gbV9lVmVydGljYWxBbGlnbjsKKyAgICB1aW50OF90IG1fZHdUZXh0RGVjb3JhdGlvbjsKKyAgICBib29sIG1fYkhhc01hcmdpbjsKKyAgICBib29sIG1fYkhhc0JvcmRlcjsKKyAgICBib29sIG1fYkhhc1BhZGRpbmc7CisgIH07CisKKyAgaW50MzJfdCBDb3VudEZvbnRGYW1pbGllcygpIGNvbnN0OworICBjb25zdCBXaWRlU3RyaW5nIEdldEZvbnRGYW1pbHkoaW50MzJfdCBpbmRleCkgY29uc3Q7CisgIHVpbnQxNl90IEdldEZvbnRXZWlnaHQoKSBjb25zdDsKKyAgQ0ZYX0NTU0ZvbnRWYXJpYW50IEdldEZvbnRWYXJpYW50KCkgY29uc3Q7CisgIENGWF9DU1NGb250U3R5bGUgR2V0Rm9udFN0eWxlKCkgY29uc3Q7CisgIGZsb2F0IEdldEZvbnRTaXplKCkgY29uc3Q7CisgIEZYX0FSR0IgR2V0Q29sb3IoKSBjb25zdDsKKyAgdm9pZCBTZXRGb250V2VpZ2h0KHVpbnQxNl90IHdGb250V2VpZ2h0KTsKKyAgdm9pZCBTZXRGb250VmFyaWFudChDRlhfQ1NTRm9udFZhcmlhbnQgZUZvbnRWYXJpYW50KTsKKyAgdm9pZCBTZXRGb250U3R5bGUoQ0ZYX0NTU0ZvbnRTdHlsZSBlRm9udFN0eWxlKTsKKyAgdm9pZCBTZXRGb250U2l6ZShmbG9hdCBmRm9udFNpemUpOworICB2b2lkIFNldENvbG9yKEZYX0FSR0IgZHdGb250Q29sb3IpOworCisgIGNvbnN0IENGWF9DU1NSZWN0KiBHZXRCb3JkZXJXaWR0aCgpIGNvbnN0OworICBjb25zdCBDRlhfQ1NTUmVjdCogR2V0TWFyZ2luV2lkdGgoKSBjb25zdDsKKyAgY29uc3QgQ0ZYX0NTU1JlY3QqIEdldFBhZGRpbmdXaWR0aCgpIGNvbnN0OworICB2b2lkIFNldE1hcmdpbldpZHRoKGNvbnN0IENGWF9DU1NSZWN0JiByZWN0KTsKKyAgdm9pZCBTZXRQYWRkaW5nV2lkdGgoY29uc3QgQ0ZYX0NTU1JlY3QmIHJlY3QpOworCisgIENGWF9DU1NEaXNwbGF5IEdldERpc3BsYXkoKSBjb25zdDsKKworICBmbG9hdCBHZXRMaW5lSGVpZ2h0KCkgY29uc3Q7CisgIGNvbnN0IENGWF9DU1NMZW5ndGgmIEdldFRleHRJbmRlbnQoKSBjb25zdDsKKyAgQ0ZYX0NTU1RleHRBbGlnbiBHZXRUZXh0QWxpZ24oKSBjb25zdDsKKyAgQ0ZYX0NTU1ZlcnRpY2FsQWxpZ24gR2V0VmVydGljYWxBbGlnbigpIGNvbnN0OworICBmbG9hdCBHZXROdW1iZXJWZXJ0aWNhbEFsaWduKCkgY29uc3Q7CisgIHVpbnQzMl90IEdldFRleHREZWNvcmF0aW9uKCkgY29uc3Q7CisgIGNvbnN0IENGWF9DU1NMZW5ndGgmIEdldExldHRlclNwYWNpbmcoKSBjb25zdDsKKyAgdm9pZCBTZXRMaW5lSGVpZ2h0KGZsb2F0IGZMaW5lSGVpZ2h0KTsKKyAgdm9pZCBTZXRUZXh0SW5kZW50KGNvbnN0IENGWF9DU1NMZW5ndGgmIHRleHRJbmRlbnQpOworICB2b2lkIFNldFRleHRBbGlnbihDRlhfQ1NTVGV4dEFsaWduIGVUZXh0QWxpZ24pOworICB2b2lkIFNldE51bWJlclZlcnRpY2FsQWxpZ24oZmxvYXQgZkFsaWduKTsKKyAgdm9pZCBTZXRUZXh0RGVjb3JhdGlvbih1aW50MzJfdCBkd1RleHREZWNvcmF0aW9uKTsKKyAgdm9pZCBTZXRMZXR0ZXJTcGFjaW5nKGNvbnN0IENGWF9DU1NMZW5ndGgmIGxldHRlclNwYWNpbmcpOworICB2b2lkIEFkZEN1c3RvbVN0eWxlKGNvbnN0IENGWF9DU1NDdXN0b21Qcm9wZXJ0eSYgcHJvcCk7CisKKyAgYm9vbCBHZXRDdXN0b21TdHlsZShjb25zdCBXaWRlU3RyaW5nJiB3c05hbWUsIFdpZGVTdHJpbmcmIHdzVmFsdWUpIGNvbnN0OworCisgIEluaGVyaXRlZERhdGEgbV9Jbmhlcml0ZWREYXRhOworICBOb25Jbmhlcml0ZWREYXRhIG1fTm9uSW5oZXJpdGVkRGF0YTsKKworIHByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgorICBmcmllbmQgUmV0YWluUHRyPFQ+IHBkZml1bTo6TWFrZVJldGFpbihBcmdzJiYuLi4gYXJncyk7CisKKyAgQ0ZYX0NTU0NvbXB1dGVkU3R5bGUoKTsKKyAgfkNGWF9DU1NDb21wdXRlZFN0eWxlKCkgb3ZlcnJpZGU7CisKKyAgc3RkOjp2ZWN0b3I8Q0ZYX0NTU0N1c3RvbVByb3BlcnR5PiBtX0N1c3RvbVByb3BlcnRpZXM7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NDT01QVVRFRFNUWUxFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzY3VzdG9tcHJvcGVydHkuY3BwIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc2N1c3RvbXByb3BlcnR5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTNmYWNkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc2N1c3RvbXByb3BlcnR5LmNwcApAQCAtMCwwICsxLDE0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzY3VzdG9tcHJvcGVydHkuaCIKKworQ0ZYX0NTU0N1c3RvbVByb3BlcnR5OjpDRlhfQ1NTQ3VzdG9tUHJvcGVydHkoY29uc3QgV2lkZVN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHZhbHVlKQorICAgIDogbmFtZV8obmFtZSksIHZhbHVlXyh2YWx1ZSkge30KKworQ0ZYX0NTU0N1c3RvbVByb3BlcnR5OjpDRlhfQ1NTQ3VzdG9tUHJvcGVydHkoY29uc3QgQ0ZYX0NTU0N1c3RvbVByb3BlcnR5JiBwcm9wKQorICAgIDogbmFtZV8ocHJvcC5uYW1lXyksIHZhbHVlXyhwcm9wLnZhbHVlXykge30KKworQ0ZYX0NTU0N1c3RvbVByb3BlcnR5Ojp+Q0ZYX0NTU0N1c3RvbVByb3BlcnR5KCkge30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NjdXN0b21wcm9wZXJ0eS5oIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc2N1c3RvbXByb3BlcnR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVjM2VjYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NjdXN0b21wcm9wZXJ0eS5oCkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX0NTU19DRlhfQ1NTQ1VTVE9NUFJPUEVSVFlfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9DU1NfQ0ZYX0NTU0NVU1RPTVBST1BFUlRZX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorCitjbGFzcyBDRlhfQ1NTQ3VzdG9tUHJvcGVydHkgeworIHB1YmxpYzoKKyAgQ0ZYX0NTU0N1c3RvbVByb3BlcnR5KGNvbnN0IFdpZGVTdHJpbmcmIG5hbWUsIGNvbnN0IFdpZGVTdHJpbmcmIHZhbHVlKTsKKyAgQ0ZYX0NTU0N1c3RvbVByb3BlcnR5KGNvbnN0IENGWF9DU1NDdXN0b21Qcm9wZXJ0eSYgcHJvcCk7CisgIH5DRlhfQ1NTQ3VzdG9tUHJvcGVydHkoKTsKKworICBXaWRlU3RyaW5nIG5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorICBXaWRlU3RyaW5nIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisKKyBwcml2YXRlOgorICBXaWRlU3RyaW5nIG5hbWVfOworICBXaWRlU3RyaW5nIHZhbHVlXzsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWENSVF9DU1NfQ0ZYX0NTU0NVU1RPTVBST1BFUlRZX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzZGF0YXRhYmxlLmNwcCBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NkYXRhdGFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNjE3YjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzZGF0YXRhYmxlLmNwcApAQCAtMCwwICsxLDE0NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc2RhdGF0YWJsZS5oIgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHlsZXNlbGVjdG9yLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3ZhbHVlbGlzdHBhcnNlci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29kZXBhZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorCitzdGF0aWMgY29uc3QgQ0ZYX0NTU1Byb3BlcnR5VGFibGUgZ19DRlhfQ1NTUHJvcGVydGllc1tdID0geworICAgIHtDRlhfQ1NTUHJvcGVydHk6OkJvcmRlckxlZnQsIEwiYm9yZGVyLWxlZnQiLCAweDA0MDgwMDM2LAorICAgICBDRlhfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sCisgICAge0NGWF9DU1NQcm9wZXJ0eTo6VG9wLCBMInRvcCIsIDB4MEJFREFGMzMsCisgICAgIENGWF9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfAorICAgICAgICAgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sCisgICAge0NGWF9DU1NQcm9wZXJ0eTo6TWFyZ2luLCBMIm1hcmdpbiIsIDB4MENCMDE2QkUsCisgICAgIENGWF9DU1NWQUxVRVRZUEVfTGlzdCB8IENGWF9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwKKyAgICAgICAgIENGWF9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LAorICAgIHtDRlhfQ1NTUHJvcGVydHk6OlRleHRJbmRlbnQsIEwidGV4dC1pbmRlbnQiLCAweDE2OUFEQjc0LAorICAgICBDRlhfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IENGWF9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LAorICAgIHtDRlhfQ1NTUHJvcGVydHk6OlJpZ2h0LCBMInJpZ2h0IiwgMHgxOTNBREUzRSwKKyAgICAgQ0ZYX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBDRlhfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8CisgICAgICAgICBDRlhfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5OjpQYWRkaW5nTGVmdCwgTCJwYWRkaW5nLWxlZnQiLCAweDIyOENGMDJGLAorICAgICBDRlhfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IENGWF9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LAorICAgIHtDRlhfQ1NTUHJvcGVydHk6Ok1hcmdpbkxlZnQsIEwibWFyZ2luLWxlZnQiLCAweDI5N0M1NjU2LAorICAgICBDRlhfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IENGWF9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXIgfAorICAgICAgICAgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LAorICAgIHtDRlhfQ1NTUHJvcGVydHk6OkJvcmRlciwgTCJib3JkZXIiLCAweDJBMjMzNDlFLAorICAgICBDRlhfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sCisgICAge0NGWF9DU1NQcm9wZXJ0eTo6Qm9yZGVyVG9wLCBMImJvcmRlci10b3AiLCAweDJCODY2QURFLAorICAgICBDRlhfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sCisgICAge0NGWF9DU1NQcm9wZXJ0eTo6Qm90dG9tLCBMImJvdHRvbSIsIDB4Mzk5RjAyQjUsCisgICAgIENGWF9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfAorICAgICAgICAgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sCisgICAge0NGWF9DU1NQcm9wZXJ0eTo6UGFkZGluZ1JpZ2h0LCBMInBhZGRpbmctcmlnaHQiLCAweDNGNjE2QUMyLAorICAgICBDRlhfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IENGWF9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LAorICAgIHtDRlhfQ1NTUHJvcGVydHk6OkJvcmRlckJvdHRvbSwgTCJib3JkZXItYm90dG9tIiwgMHg0NTJDRTc4MCwKKyAgICAgQ0ZYX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LAorICAgIHtDRlhfQ1NTUHJvcGVydHk6OkZvbnRGYW1pbHksIEwiZm9udC1mYW1pbHkiLCAweDU3NDY4NkU2LAorICAgICBDRlhfQ1NTVkFMVUVUWVBFX0xpc3QgfCBDRlhfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5OjpGb250V2VpZ2h0LCBMImZvbnQtd2VpZ2h0IiwgMHg2NjkyRjYwQywKKyAgICAgQ0ZYX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBDRlhfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8CisgICAgICAgICBDRlhfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5OjpDb2xvciwgTCJjb2xvciIsIDB4NkU2NzkyMUYsCisgICAgIENGWF9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfAorICAgICAgICAgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5OjpMZXR0ZXJTcGFjaW5nLCBMImxldHRlci1zcGFjaW5nIiwgMHg3MDUzNjEwMiwKKyAgICAgQ0ZYX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBDRlhfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8CisgICAgICAgICBDRlhfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5OjpUZXh0QWxpZ24sIEwidGV4dC1hbGlnbiIsIDB4NzU1M0YxQkQsCisgICAgIENGWF9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LAorICAgIHtDRlhfQ1NTUHJvcGVydHk6OkJvcmRlclJpZ2h0V2lkdGgsIEwiYm9yZGVyLXJpZ2h0LXdpZHRoIiwgMHg4RjVBNjAzNiwKKyAgICAgQ0ZYX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBDRlhfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8CisgICAgICAgICBDRlhfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5OjpWZXJ0aWNhbEFsaWduLCBMInZlcnRpY2FsLWFsaWduIiwgMHg5MzRBODdEMiwKKyAgICAgQ0ZYX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBDRlhfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8CisgICAgICAgICBDRlhfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5OjpQYWRkaW5nVG9wLCBMInBhZGRpbmctdG9wIiwgMHg5NTlEMjJCNywKKyAgICAgQ0ZYX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBDRlhfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5OjpGb250VmFyaWFudCwgTCJmb250LXZhcmlhbnQiLCAweDlDNzg1Nzc5LAorICAgICBDRlhfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IENGWF9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5OjpCb3JkZXJXaWR0aCwgTCJib3JkZXItd2lkdGgiLCAweEE4REU0RkVCLAorICAgICBDRlhfQ1NTVkFMVUVUWVBFX0xpc3QgfCBDRlhfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8CisgICAgICAgICBDRlhfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5OjpCb3JkZXJCb3R0b21XaWR0aCwgTCJib3JkZXItYm90dG9tLXdpZHRoIiwgMHhBRTQxMjA0RCwKKyAgICAgQ0ZYX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBDRlhfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8CisgICAgICAgICBDRlhfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5OjpCb3JkZXJSaWdodCwgTCJib3JkZXItcmlnaHQiLCAweEI3OEU5RUE5LAorICAgICBDRlhfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sCisgICAge0NGWF9DU1NQcm9wZXJ0eTo6Rm9udFNpemUsIEwiZm9udC1zaXplIiwgMHhCOTM5NTZERiwKKyAgICAgQ0ZYX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBDRlhfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8CisgICAgICAgICBDRlhfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5OjpCb3JkZXJTcGFjaW5nLCBMImJvcmRlci1zcGFjaW5nIiwgMHhDNzIwMzBGMCwKKyAgICAgQ0ZYX0NTU1ZBTFVFVFlQRV9MaXN0IHwgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sCisgICAge0NGWF9DU1NQcm9wZXJ0eTo6Rm9udFN0eWxlLCBMImZvbnQtc3R5bGUiLCAweENCMTk1MEY1LAorICAgICBDRlhfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IENGWF9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5OjpGb250LCBMImZvbnQiLCAweENEMzA4Qjc3LCBDRlhfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sCisgICAge0NGWF9DU1NQcm9wZXJ0eTo6TGluZUhlaWdodCwgTCJsaW5lLWhlaWdodCIsIDB4Q0ZDQUNFMkUsCisgICAgIENGWF9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfAorICAgICAgICAgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sCisgICAge0NGWF9DU1NQcm9wZXJ0eTo6TWFyZ2luUmlnaHQsIEwibWFyZ2luLXJpZ2h0IiwgMHhEMTNDNThDOSwKKyAgICAgQ0ZYX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBDRlhfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyIHwKKyAgICAgICAgIENGWF9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5OjpCb3JkZXJMZWZ0V2lkdGgsIEwiYm9yZGVyLWxlZnQtd2lkdGgiLCAweEQxRTkzRDgzLAorICAgICBDRlhfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IENGWF9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwKKyAgICAgICAgIENGWF9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LAorICAgIHtDRlhfQ1NTUHJvcGVydHk6OkRpc3BsYXksIEwiZGlzcGxheSIsIDB4RDQyMjRDMzYsCisgICAgIENGWF9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LAorICAgIHtDRlhfQ1NTUHJvcGVydHk6OlBhZGRpbmdCb3R0b20sIEwicGFkZGluZy1ib3R0b20iLCAweEU1NTVCM0I5LAorICAgICBDRlhfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IENGWF9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LAorICAgIHtDRlhfQ1NTUHJvcGVydHk6OkJvcmRlclRvcFdpZHRoLCBMImJvcmRlci10b3Atd2lkdGgiLCAweEVEMkNCNjJCLAorICAgICBDRlhfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IENGWF9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwKKyAgICAgICAgIENGWF9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LAorICAgIHtDRlhfQ1NTUHJvcGVydHk6OldvcmRTcGFjaW5nLCBMIndvcmQtc3BhY2luZyIsIDB4RURBNjNCQUUsCisgICAgIENGWF9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfAorICAgICAgICAgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sCisgICAge0NGWF9DU1NQcm9wZXJ0eTo6TGVmdCwgTCJsZWZ0IiwgMHhGNUFENzgyQiwKKyAgICAgQ0ZYX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBDRlhfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8CisgICAgICAgICBDRlhfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5OjpUZXh0RGVjb3JhdGlvbiwgTCJ0ZXh0LWRlY29yYXRpb24iLCAweEY3QzYzNEJBLAorICAgICBDRlhfQ1NTVkFMVUVUWVBFX0xpc3QgfCBDRlhfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sCisgICAge0NGWF9DU1NQcm9wZXJ0eTo6UGFkZGluZywgTCJwYWRkaW5nIiwgMHhGOEMzNzNGNywKKyAgICAgQ0ZYX0NTU1ZBTFVFVFlQRV9MaXN0IHwgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sCisgICAge0NGWF9DU1NQcm9wZXJ0eTo6TWFyZ2luQm90dG9tLCBMIm1hcmdpbi1ib3R0b20iLCAweEY5MzQ4NUEwLAorICAgICBDRlhfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IENGWF9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXIgfAorICAgICAgICAgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LAorICAgIHtDRlhfQ1NTUHJvcGVydHk6Ok1hcmdpblRvcCwgTCJtYXJnaW4tdG9wIiwgMHhGRTUxRENGRSwKKyAgICAgQ0ZYX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBDRlhfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyIHwKKyAgICAgICAgIENGWF9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwKK307Citjb25zdCBpbnQzMl90IGdfaUNTU1Byb3BlcnR5Q291bnQgPQorICAgIHNpemVvZihnX0NGWF9DU1NQcm9wZXJ0aWVzKSAvIHNpemVvZihDRlhfQ1NTUHJvcGVydHlUYWJsZSk7CitzdGF0aWNfYXNzZXJ0KGdfaUNTU1Byb3BlcnR5Q291bnQgPT0KKyAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KENGWF9DU1NQcm9wZXJ0eTo6TEFTVF9NQVJLRVIpLAorICAgICAgICAgICAgICAiUHJvcGVydHkgdGFibGUgZGlmZmVycyBpbiBzaXplIGZyb20gcHJvcGVydHkgZW51bSIpOworCitjb25zdCBDRlhfQ1NTUHJvcGVydHlUYWJsZSogQ0ZYX0dldENTU1Byb3BlcnR5QnlOYW1lKAorICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c05hbWUpIHsKKyAgQVNTRVJUKCF3c05hbWUuSXNFbXB0eSgpKTsKKyAgdWludDMyX3QgZHdIYXNoID0gRlhfSGFzaENvZGVfR2V0Vyh3c05hbWUsIHRydWUpOworICBpbnQzMl90IGlFbmQgPSBnX2lDU1NQcm9wZXJ0eUNvdW50OworICBpbnQzMl90IGlNaWQsIGlTdGFydCA9IDA7CisgIHVpbnQzMl90IGR3TWlkOworICBkbyB7CisgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7CisgICAgZHdNaWQgPSBnX0NGWF9DU1NQcm9wZXJ0aWVzW2lNaWRdLmR3SGFzaDsKKyAgICBpZiAoZHdIYXNoID09IGR3TWlkKSB7CisgICAgICByZXR1cm4gZ19DRlhfQ1NTUHJvcGVydGllcyArIGlNaWQ7CisgICAgfSBlbHNlIGlmIChkd0hhc2ggPiBkd01pZCkgeworICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsKKyAgICB9CisgIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2NvbnN0IENGWF9DU1NQcm9wZXJ0eVRhYmxlKiBDRlhfR2V0Q1NTUHJvcGVydHlCeUVudW0oQ0ZYX0NTU1Byb3BlcnR5IGVOYW1lKSB7CisgIHJldHVybiBnX0NGWF9DU1NQcm9wZXJ0aWVzICsgc3RhdGljX2Nhc3Q8aW50PihlTmFtZSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzZGF0YXRhYmxlLmggYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzZGF0YXRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNjMzAzNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NkYXRhdGFibGUuaApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENSVF9DU1NfQ0ZYX0NTU0RBVEFUQUJMRV9IXworI2RlZmluZSBDT1JFX0ZYQ1JUX0NTU19DRlhfQ1NTREFUQVRBQkxFX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzcy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NudW1iZXJ2YWx1ZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3N2YWx1ZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisKK3N0cnVjdCBDRlhfQ1NTUHJvcGVydHlUYWJsZSB7CisgIENGWF9DU1NQcm9wZXJ0eSBlTmFtZTsKKyAgY29uc3Qgd2NoYXJfdCogcHN6TmFtZTsKKyAgdWludDMyX3QgZHdIYXNoOworICB1aW50MzJfdCBkd1R5cGU7Cit9OworCitjb25zdCBDRlhfQ1NTUHJvcGVydHlUYWJsZSogQ0ZYX0dldENTU1Byb3BlcnR5QnlOYW1lKAorICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c05hbWUpOworY29uc3QgQ0ZYX0NTU1Byb3BlcnR5VGFibGUqIENGWF9HZXRDU1NQcm9wZXJ0eUJ5RW51bShDRlhfQ1NTUHJvcGVydHkgZU5hbWUpOworCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NEQVRBVEFCTEVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NkZWNsYXJhdGlvbi5jcHAgYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzZGVjbGFyYXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYmRmNGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzZGVjbGFyYXRpb24uY3BwCkBAIC0wLDAgKzEsNzgxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzZGVjbGFyYXRpb24uaCIKKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3Njb2xvcnZhbHVlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc2N1c3RvbXByb3BlcnR5LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc2VudW12YWx1ZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NudW1iZXJ2YWx1ZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3Nwcm9wZXJ0eWhvbGRlci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHJpbmd2YWx1ZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3N2YWx1ZWxpc3QuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzdmFsdWVsaXN0cGFyc2VyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9leHRlbnNpb24uaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK3VpbnQ4X3QgSGV4MkRlYyh1aW50OF90IGhleEhpZ2gsIHVpbnQ4X3QgaGV4TG93KSB7CisgIHJldHVybiAoRlhTWVNfSGV4Q2hhclRvSW50KGhleEhpZ2gpIDw8IDQpICsgRlhTWVNfSGV4Q2hhclRvSW50KGhleExvdyk7Cit9CisKK3N0cnVjdCBDRlhfQ1NTUHJvcGVydHlWYWx1ZVRhYmxlIHsKKyAgQ0ZYX0NTU1Byb3BlcnR5VmFsdWUgZU5hbWU7CisgIGNvbnN0IHdjaGFyX3QqIHBzek5hbWU7CisgIHVpbnQzMl90IGR3SGFzaDsKK307Citjb25zdCBDRlhfQ1NTUHJvcGVydHlWYWx1ZVRhYmxlIGdfQ0ZYX0NTU1Byb3BlcnR5VmFsdWVzW10gPSB7CisgICAge0NGWF9DU1NQcm9wZXJ0eVZhbHVlOjpCb2xkZXIsIEwiYm9sZGVyIiwgMHgwMDlGMTA1OH0sCisgICAge0NGWF9DU1NQcm9wZXJ0eVZhbHVlOjpOb25lLCBMIm5vbmUiLCAweDA0OEI2NjcwfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5VmFsdWU6OkRvdCwgTCJkb3QiLCAweDBBNDhDQjI3fSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5VmFsdWU6OlN1YiwgTCJzdWIiLCAweDBCRDM3RkFBfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5VmFsdWU6OlRvcCwgTCJ0b3AiLCAweDBCRURBRjMzfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5VmFsdWU6OlJpZ2h0LCBMInJpZ2h0IiwgMHgxOTNBREUzRX0sCisgICAge0NGWF9DU1NQcm9wZXJ0eVZhbHVlOjpOb3JtYWwsIEwibm9ybWFsIiwgMHgyNDdDRjNFOX0sCisgICAge0NGWF9DU1NQcm9wZXJ0eVZhbHVlOjpBdXRvLCBMImF1dG8iLCAweDJCMzVCNkQ5fSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5VmFsdWU6OlRleHQsIEwidGV4dCIsIDB4MkQwOEFGODV9LAorICAgIHtDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6WFNtYWxsLCBMIngtc21hbGwiLCAweDJEMkZDQUZFfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5VmFsdWU6OlRoaW4sIEwidGhpbiIsIDB4MkQ1NzRENTN9LAorICAgIHtDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6U21hbGwsIEwic21hbGwiLCAweDMxNkEzNzM5fSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5VmFsdWU6OkJvdHRvbSwgTCJib3R0b20iLCAweDM5OUYwMkI1fSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5VmFsdWU6OlVuZGVybGluZSwgTCJ1bmRlcmxpbmUiLCAweDNBMDI3M0E2fSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5VmFsdWU6OkRvdWJsZSwgTCJkb3VibGUiLCAweDNEOTg1MTVCfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5VmFsdWU6OkxpZ2h0ZXIsIEwibGlnaHRlciIsIDB4NDVCRUI3QUZ9LAorICAgIHtDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6T2JsaXF1ZSwgTCJvYmxpcXVlIiwgMHg1M0VCRERCMX0sCisgICAge0NGWF9DU1NQcm9wZXJ0eVZhbHVlOjpTdXBlciwgTCJzdXBlciIsIDB4NkE0Rjg0MkZ9LAorICAgIHtDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6Q2VudGVyLCBMImNlbnRlciIsIDB4NkM1MUFGQzF9LAorICAgIHtDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6WHhMYXJnZSwgTCJ4eC1sYXJnZSIsIDB4NzBCQjE1MDh9LAorICAgIHtDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6U21hbGxlciwgTCJzbWFsbGVyIiwgMHg4NDk3NjlGMH0sCisgICAge0NGWF9DU1NQcm9wZXJ0eVZhbHVlOjpCYXNlbGluZSwgTCJiYXNlbGluZSIsIDB4ODc0MzZCQTN9LAorICAgIHtDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6VGhpY2ssIEwidGhpY2siLCAweDhDQzM1RUIzfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5VmFsdWU6Okp1c3RpZnksIEwianVzdGlmeSIsIDB4OEQyNjlDQUV9LAorICAgIHtDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6TWlkZGxlLCBMIm1pZGRsZSIsIDB4OTQ3RkEwMEZ9LAorICAgIHtDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6TWVkaXVtLCBMIm1lZGl1bSIsIDB4QTA4NEEzODF9LAorICAgIHtDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6TGlzdEl0ZW0sIEwibGlzdC1pdGVtIiwgMHhBMzIzODJCOH0sCisgICAge0NGWF9DU1NQcm9wZXJ0eVZhbHVlOjpYeFNtYWxsLCBMInh4LXNtYWxsIiwgMHhBREUxRkM3Nn0sCisgICAge0NGWF9DU1NQcm9wZXJ0eVZhbHVlOjpCb2xkLCBMImJvbGQiLCAweEIxODMxM0ExfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5VmFsdWU6OlNtYWxsQ2FwcywgTCJzbWFsbC1jYXBzIiwgMHhCMjk5NDI4RH0sCisgICAge0NGWF9DU1NQcm9wZXJ0eVZhbHVlOjpJbmxpbmUsIEwiaW5saW5lIiwgMHhDMDJENjQ5Rn0sCisgICAge0NGWF9DU1NQcm9wZXJ0eVZhbHVlOjpPdmVybGluZSwgTCJvdmVybGluZSIsIDB4QzBFQzlGQTR9LAorICAgIHtDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6VGV4dEJvdHRvbSwgTCJ0ZXh0LWJvdHRvbSIsIDB4QzdEMDhEODd9LAorICAgIHtDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6TGFyZ2VyLCBMImxhcmdlciIsIDB4Q0QzQzQwOUR9LAorICAgIHtDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6SW5saW5lVGFibGUsIEwiaW5saW5lLXRhYmxlIiwgMHhEMTMxRjQ5NH0sCisgICAge0NGWF9DU1NQcm9wZXJ0eVZhbHVlOjpJbmxpbmVCbG9jaywgTCJpbmxpbmUtYmxvY2siLCAweEQyNkE4QkQ3fSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5VmFsdWU6OkJsaW5rLCBMImJsaW5rIiwgMHhEQzM2RTM5MH0sCisgICAge0NGWF9DU1NQcm9wZXJ0eVZhbHVlOjpCbG9jaywgTCJibG9jayIsIDB4RENENDgwQUJ9LAorICAgIHtDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6SXRhbGljLCBMIml0YWxpYyIsIDB4RTMxRDUzOTZ9LAorICAgIHtDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6TGluZVRocm91Z2gsIEwibGluZS10aHJvdWdoIiwgMHhFNEM1QTI3Nn0sCisgICAge0NGWF9DU1NQcm9wZXJ0eVZhbHVlOjpYTGFyZ2UsIEwieC1sYXJnZSIsIDB4RjAwOEUzOTB9LAorICAgIHtDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6TGFyZ2UsIEwibGFyZ2UiLCAweEY0NDM0RkNCfSwKKyAgICB7Q0ZYX0NTU1Byb3BlcnR5VmFsdWU6OkxlZnQsIEwibGVmdCIsIDB4RjVBRDc4MkJ9LAorICAgIHtDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6VGV4dFRvcCwgTCJ0ZXh0LXRvcCIsIDB4RkNCNThENDV9LAorfTsKK2NvbnN0IGludDMyX3QgZ19pQ1NTUHJvcGVydHlWYWx1ZUNvdW50ID0KKyAgICBzaXplb2YoZ19DRlhfQ1NTUHJvcGVydHlWYWx1ZXMpIC8gc2l6ZW9mKENGWF9DU1NQcm9wZXJ0eVZhbHVlVGFibGUpOworc3RhdGljX2Fzc2VydChnX2lDU1NQcm9wZXJ0eVZhbHVlQ291bnQgPT0KKyAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpMQVNUX01BUktFUiksCisgICAgICAgICAgICAgICJQcm9wZXJ0eSB2YWx1ZSB0YWJsZSBkaWZmZXJzIGluIHNpemUgZnJvbSBwcm9wZXJ0eSB2YWx1ZSBlbnVtIik7CisKK3N0cnVjdCBDRlhfQ1NTTGVuZ3RoVW5pdFRhYmxlIHsKKyAgdWludDE2X3Qgd0hhc2g7CisgIENGWF9DU1NOdW1iZXJUeXBlIHdWYWx1ZTsKK307Citjb25zdCBDRlhfQ1NTTGVuZ3RoVW5pdFRhYmxlIGdfQ0ZYX0NTU0xlbmd0aFVuaXRzW10gPSB7CisgICAgezB4MDY3MiwgQ0ZYX0NTU051bWJlclR5cGU6OkVNU30sCisgICAgezB4MDY3RCwgQ0ZYX0NTU051bWJlclR5cGU6OkVYU30sCisgICAgezB4MUFGNywgQ0ZYX0NTU051bWJlclR5cGU6OkluY2hlc30sCisgICAgezB4MkY3QSwgQ0ZYX0NTU051bWJlclR5cGU6Ok1pbGxpTWV0ZXJzfSwKKyAgICB7MHgzRUQzLCBDRlhfQ1NTTnVtYmVyVHlwZTo6UGljYXN9LAorICAgIHsweDNFRTQsIENGWF9DU1NOdW1iZXJUeXBlOjpQb2ludHN9LAorICAgIHsweDNFRTgsIENGWF9DU1NOdW1iZXJUeXBlOjpQaXhlbHN9LAorICAgIHsweEZDMzAsIENGWF9DU1NOdW1iZXJUeXBlOjpDZW50aU1ldGVyc30sCit9OworCitzdHJ1Y3QgQ0ZYX0NTU0NvbG9yVGFibGUgeworICB1aW50MzJfdCBkd0hhc2g7CisgIEZYX0FSR0IgZHdWYWx1ZTsKK307Citjb25zdCBDRlhfQ1NTQ29sb3JUYWJsZSBnX0NGWF9DU1NDb2xvcnNbXSA9IHsKKyAgICB7MHgwMzFCNDdGRSwgMHhmZjAwMDA4MH0sIHsweDBCQjhERjVCLCAweGZmZmYwMDAwfSwKKyAgICB7MHgwRDgyQTc4QywgMHhmZjgwMDAwMH0sIHsweDJBQ0M4MkU4LCAweGZmMDBmZmZmfSwKKyAgICB7MHgyRDA4Mzk4NiwgMHhmZjAwODA4MH0sIHsweDRBNkE2MTk1LCAweGZmYzBjMGMwfSwKKyAgICB7MHg1NDZBOEVGMywgMHhmZjgwODA4MH0sIHsweDY1QzkxNjlDLCAweGZmZmZhNTAwfSwKKyAgICB7MHg4NDIyQkI2MSwgMHhmZmZmZmZmZn0sIHsweDkyNzFBNTU4LCAweGZmODAwMDgwfSwKKyAgICB7MHhBNjVBM0VFMywgMHhmZmZmMDBmZn0sIHsweEIxMzQ1NzA4LCAweGZmMDAwMGZmfSwKKyAgICB7MHhCNkQyQ0YxRiwgMHhmZjgwODAwMH0sIHsweEQxOUI1RTFDLCAweGZmZmZmZjAwfSwKKyAgICB7MHhEQjY0MzkxRCwgMHhmZjAwMDAwMH0sIHsweEY2MTZENTA3LCAweGZmMDBmZjAwfSwKKyAgICB7MHhGNkVGRkYzMSwgMHhmZjAwODAwMH0sCit9OworCitjb25zdCBDRlhfQ1NTUHJvcGVydHlWYWx1ZVRhYmxlKiBHZXRDU1NQcm9wZXJ0eVZhbHVlQnlOYW1lKAorICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c05hbWUpIHsKKyAgQVNTRVJUKCF3c05hbWUuSXNFbXB0eSgpKTsKKyAgdWludDMyX3QgZHdIYXNoID0gRlhfSGFzaENvZGVfR2V0Vyh3c05hbWUsIHRydWUpOworICBpbnQzMl90IGlFbmQgPSBnX2lDU1NQcm9wZXJ0eVZhbHVlQ291bnQ7CisgIGludDMyX3QgaU1pZCwgaVN0YXJ0ID0gMDsKKyAgdWludDMyX3QgZHdNaWQ7CisgIGRvIHsKKyAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsKKyAgICBkd01pZCA9IGdfQ0ZYX0NTU1Byb3BlcnR5VmFsdWVzW2lNaWRdLmR3SGFzaDsKKyAgICBpZiAoZHdIYXNoID09IGR3TWlkKSB7CisgICAgICByZXR1cm4gZ19DRlhfQ1NTUHJvcGVydHlWYWx1ZXMgKyBpTWlkOworICAgIH0gZWxzZSBpZiAoZHdIYXNoID4gZHdNaWQpIHsKKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOworICAgIH0gZWxzZSB7CisgICAgICBpRW5kID0gaU1pZCAtIDE7CisgICAgfQorICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7CisgIHJldHVybiBudWxscHRyOworfQorCitjb25zdCBDRlhfQ1NTTGVuZ3RoVW5pdFRhYmxlKiBHZXRDU1NMZW5ndGhVbml0QnlOYW1lKAorICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c05hbWUpIHsKKyAgQVNTRVJUKCF3c05hbWUuSXNFbXB0eSgpKTsKKyAgdWludDE2X3Qgd0hhc2ggPSBGWF9IYXNoQ29kZV9HZXRXKHdzTmFtZSwgdHJ1ZSk7CisgIGludDMyX3QgaUVuZCA9CisgICAgICBzaXplb2YoZ19DRlhfQ1NTTGVuZ3RoVW5pdHMpIC8gc2l6ZW9mKENGWF9DU1NMZW5ndGhVbml0VGFibGUpIC0gMTsKKyAgaW50MzJfdCBpTWlkLCBpU3RhcnQgPSAwOworICB1aW50MTZfdCB3TWlkOworICBkbyB7CisgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7CisgICAgd01pZCA9IGdfQ0ZYX0NTU0xlbmd0aFVuaXRzW2lNaWRdLndIYXNoOworICAgIGlmICh3SGFzaCA9PSB3TWlkKSB7CisgICAgICByZXR1cm4gZ19DRlhfQ1NTTGVuZ3RoVW5pdHMgKyBpTWlkOworICAgIH0gZWxzZSBpZiAod0hhc2ggPiB3TWlkKSB7CisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgaUVuZCA9IGlNaWQgLSAxOworICAgIH0KKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOworICByZXR1cm4gbnVsbHB0cjsKK30KKworY29uc3QgQ0ZYX0NTU0NvbG9yVGFibGUqIEdldENTU0NvbG9yQnlOYW1lKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c05hbWUpIHsKKyAgQVNTRVJUKCF3c05hbWUuSXNFbXB0eSgpKTsKKyAgdWludDMyX3QgZHdIYXNoID0gRlhfSGFzaENvZGVfR2V0Vyh3c05hbWUsIHRydWUpOworICBpbnQzMl90IGlFbmQgPSBzaXplb2YoZ19DRlhfQ1NTQ29sb3JzKSAvIHNpemVvZihDRlhfQ1NTQ29sb3JUYWJsZSkgLSAxOworICBpbnQzMl90IGlNaWQsIGlTdGFydCA9IDA7CisgIHVpbnQzMl90IGR3TWlkOworICBkbyB7CisgICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7CisgICAgZHdNaWQgPSBnX0NGWF9DU1NDb2xvcnNbaU1pZF0uZHdIYXNoOworICAgIGlmIChkd0hhc2ggPT0gZHdNaWQpIHsKKyAgICAgIHJldHVybiBnX0NGWF9DU1NDb2xvcnMgKyBpTWlkOworICAgIH0gZWxzZSBpZiAoZHdIYXNoID4gZHdNaWQpIHsKKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOworICAgIH0gZWxzZSB7CisgICAgICBpRW5kID0gaU1pZCAtIDE7CisgICAgfQorICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7CisgIHJldHVybiBudWxscHRyOworfQorCitib29sIFBhcnNlQ1NTTnVtYmVyKGNvbnN0IHdjaGFyX3QqIHBzelZhbHVlLAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQmIGZWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX0NTU051bWJlclR5cGUmIGVVbml0KSB7CisgIEFTU0VSVChwc3pWYWx1ZSAmJiBpVmFsdWVMZW4gPiAwKTsKKyAgaW50MzJfdCBpVXNlZExlbiA9IDA7CisgIGZWYWx1ZSA9IEZYU1lTX3djc3RvZihwc3pWYWx1ZSwgaVZhbHVlTGVuLCAmaVVzZWRMZW4pOworICBpZiAoaVVzZWRMZW4gPD0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaVZhbHVlTGVuIC09IGlVc2VkTGVuOworICBwc3pWYWx1ZSArPSBpVXNlZExlbjsKKyAgZVVuaXQgPSBDRlhfQ1NTTnVtYmVyVHlwZTo6TnVtYmVyOworICBpZiAoaVZhbHVlTGVuID49IDEgJiYgKnBzelZhbHVlID09ICclJykgeworICAgIGVVbml0ID0gQ0ZYX0NTU051bWJlclR5cGU6OlBlcmNlbnQ7CisgIH0gZWxzZSBpZiAoaVZhbHVlTGVuID09IDIpIHsKKyAgICBjb25zdCBDRlhfQ1NTTGVuZ3RoVW5pdFRhYmxlKiBwVW5pdCA9CisgICAgICAgIEdldENTU0xlbmd0aFVuaXRCeU5hbWUoV2lkZVN0cmluZ1ZpZXcocHN6VmFsdWUsIDIpKTsKKyAgICBpZiAocFVuaXQpCisgICAgICBlVW5pdCA9IHBVbml0LT53VmFsdWU7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK2Jvb2wgQ0ZYX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUNTU1N0cmluZyhjb25zdCB3Y2hhcl90KiBwc3pWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBpT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGlMZW5ndGgpIHsKKyAgQVNTRVJUKHBzelZhbHVlICYmIGlWYWx1ZUxlbiA+IDApOworICAqaU9mZnNldCA9IDA7CisgICppTGVuZ3RoID0gaVZhbHVlTGVuOworICBpZiAoaVZhbHVlTGVuID49IDIpIHsKKyAgICB3Y2hhcl90IGZpcnN0ID0gcHN6VmFsdWVbMF0sIGxhc3QgPSBwc3pWYWx1ZVtpVmFsdWVMZW4gLSAxXTsKKyAgICBpZiAoKGZpcnN0ID09ICdcIicgJiYgbGFzdCA9PSAnXCInKSB8fCAoZmlyc3QgPT0gJ1wnJyAmJiBsYXN0ID09ICdcJycpKSB7CisgICAgICAqaU9mZnNldCA9IDE7CisgICAgICAqaUxlbmd0aCAtPSAyOworICAgIH0KKyAgfQorICByZXR1cm4gaVZhbHVlTGVuID4gMDsKK30KKworLy8gc3RhdGljLgorYm9vbCBDRlhfQ1NTRGVjbGFyYXRpb246OlBhcnNlQ1NTQ29sb3IoY29uc3Qgd2NoYXJfdCogcHN6VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IqIGR3Q29sb3IpIHsKKyAgQVNTRVJUKHBzelZhbHVlICYmIGlWYWx1ZUxlbiA+IDApOworICBBU1NFUlQoZHdDb2xvcik7CisKKyAgaWYgKCpwc3pWYWx1ZSA9PSAnIycpIHsKKyAgICBzd2l0Y2ggKGlWYWx1ZUxlbikgeworICAgICAgY2FzZSA0OiB7CisgICAgICAgIHVpbnQ4X3QgcmVkID0gSGV4MkRlYygodWludDhfdClwc3pWYWx1ZVsxXSwgKHVpbnQ4X3QpcHN6VmFsdWVbMV0pOworICAgICAgICB1aW50OF90IGdyZWVuID0gSGV4MkRlYygodWludDhfdClwc3pWYWx1ZVsyXSwgKHVpbnQ4X3QpcHN6VmFsdWVbMl0pOworICAgICAgICB1aW50OF90IGJsdWUgPSBIZXgyRGVjKCh1aW50OF90KXBzelZhbHVlWzNdLCAodWludDhfdClwc3pWYWx1ZVszXSk7CisgICAgICAgICpkd0NvbG9yID0gQXJnYkVuY29kZSgyNTUsIHJlZCwgZ3JlZW4sIGJsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGNhc2UgNzogeworICAgICAgICB1aW50OF90IHJlZCA9IEhleDJEZWMoKHVpbnQ4X3QpcHN6VmFsdWVbMV0sICh1aW50OF90KXBzelZhbHVlWzJdKTsKKyAgICAgICAgdWludDhfdCBncmVlbiA9IEhleDJEZWMoKHVpbnQ4X3QpcHN6VmFsdWVbM10sICh1aW50OF90KXBzelZhbHVlWzRdKTsKKyAgICAgICAgdWludDhfdCBibHVlID0gSGV4MkRlYygodWludDhfdClwc3pWYWx1ZVs1XSwgKHVpbnQ4X3QpcHN6VmFsdWVbNl0pOworICAgICAgICAqZHdDb2xvciA9IEFyZ2JFbmNvZGUoMjU1LCByZWQsIGdyZWVuLCBibHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgaWYgKGlWYWx1ZUxlbiA+PSAxMCkgeworICAgIGlmIChwc3pWYWx1ZVtpVmFsdWVMZW4gLSAxXSAhPSAnKScgfHwgRlhTWVNfd2NzbmljbXAoTCJyZ2IoIiwgcHN6VmFsdWUsIDQpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgdWludDhfdCByZ2JbM10gPSB7MH07CisgICAgZmxvYXQgZlZhbHVlOworICAgIENGWF9DU1NQcmltaXRpdmVUeXBlIGVUeXBlOworICAgIENGWF9DU1NWYWx1ZUxpc3RQYXJzZXIgbGlzdChwc3pWYWx1ZSArIDQsIGlWYWx1ZUxlbiAtIDUsICcsJyk7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMzsgKytpKSB7CisgICAgICBpZiAoIWxpc3QuTmV4dFZhbHVlKCZlVHlwZSwgJnBzelZhbHVlLCAmaVZhbHVlTGVuKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKGVUeXBlICE9IENGWF9DU1NQcmltaXRpdmVUeXBlOjpOdW1iZXIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIENGWF9DU1NOdW1iZXJUeXBlIGVOdW1UeXBlOworICAgICAgaWYgKCFQYXJzZUNTU051bWJlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBmVmFsdWUsIGVOdW1UeXBlKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICByZ2JbaV0gPSBlTnVtVHlwZSA9PSBDRlhfQ1NTTnVtYmVyVHlwZTo6UGVyY2VudAorICAgICAgICAgICAgICAgICAgID8gRlhTWVNfcm91bmQoZlZhbHVlICogMi41NWYpCisgICAgICAgICAgICAgICAgICAgOiBGWFNZU19yb3VuZChmVmFsdWUpOworICAgIH0KKyAgICAqZHdDb2xvciA9IEFyZ2JFbmNvZGUoMjU1LCByZ2JbMF0sIHJnYlsxXSwgcmdiWzJdKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGNvbnN0IENGWF9DU1NDb2xvclRhYmxlKiBwQ29sb3IgPQorICAgICAgR2V0Q1NTQ29sb3JCeU5hbWUoV2lkZVN0cmluZ1ZpZXcocHN6VmFsdWUsIGlWYWx1ZUxlbikpOworICBpZiAoIXBDb2xvcikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgKmR3Q29sb3IgPSBwQ29sb3ItPmR3VmFsdWU7CisgIHJldHVybiB0cnVlOworfQorCitDRlhfQ1NTRGVjbGFyYXRpb246OkNGWF9DU1NEZWNsYXJhdGlvbigpIHt9CisKK0NGWF9DU1NEZWNsYXJhdGlvbjo6fkNGWF9DU1NEZWNsYXJhdGlvbigpIHt9CisKK1JldGFpblB0cjxDRlhfQ1NTVmFsdWU+IENGWF9DU1NEZWNsYXJhdGlvbjo6R2V0UHJvcGVydHkoCisgICAgQ0ZYX0NTU1Byb3BlcnR5IGVQcm9wZXJ0eSwKKyAgICBib29sKiBiSW1wb3J0YW50KSBjb25zdCB7CisgIGZvciAoY29uc3QgYXV0byYgcCA6IHByb3BlcnRpZXNfKSB7CisgICAgaWYgKHAtPmVQcm9wZXJ0eSA9PSBlUHJvcGVydHkpIHsKKyAgICAgICpiSW1wb3J0YW50ID0gcC0+YkltcG9ydGFudDsKKyAgICAgIHJldHVybiBwLT5wVmFsdWU7CisgICAgfQorICB9CisgIHJldHVybiBudWxscHRyOworfQorCit2b2lkIENGWF9DU1NEZWNsYXJhdGlvbjo6QWRkUHJvcGVydHlIb2xkZXIoQ0ZYX0NTU1Byb3BlcnR5IGVQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXRhaW5QdHI8Q0ZYX0NTU1ZhbHVlPiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSW1wb3J0YW50KSB7CisgIGF1dG8gcEhvbGRlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfQ1NTUHJvcGVydHlIb2xkZXI+KCk7CisgIHBIb2xkZXItPmJJbXBvcnRhbnQgPSBiSW1wb3J0YW50OworICBwSG9sZGVyLT5lUHJvcGVydHkgPSBlUHJvcGVydHk7CisgIHBIb2xkZXItPnBWYWx1ZSA9IHBWYWx1ZTsKKyAgcHJvcGVydGllc18ucHVzaF9iYWNrKHN0ZDo6bW92ZShwSG9sZGVyKSk7Cit9CisKK3ZvaWQgQ0ZYX0NTU0RlY2xhcmF0aW9uOjpBZGRQcm9wZXJ0eShjb25zdCBDRlhfQ1NTUHJvcGVydHlUYWJsZSogcFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB2YWx1ZSkgeworICBBU1NFUlQoIXZhbHVlLklzRW1wdHkoKSk7CisKKyAgY29uc3Qgd2NoYXJfdCogcHN6VmFsdWUgPSB2YWx1ZS51bnRlcm1pbmF0ZWRfY19zdHIoKTsKKyAgaW50MzJfdCBpVmFsdWVMZW4gPSB2YWx1ZS5HZXRMZW5ndGgoKTsKKyAgYm9vbCBiSW1wb3J0YW50ID0gZmFsc2U7CisgIGlmIChpVmFsdWVMZW4gPj0gMTAgJiYgcHN6VmFsdWVbaVZhbHVlTGVuIC0gMTBdID09ICchJyAmJgorICAgICAgRlhTWVNfd2NzbmljbXAoTCJpbXBvcnRhbnQiLCBwc3pWYWx1ZSArIGlWYWx1ZUxlbiAtIDksIDkpID09IDApIHsKKyAgICBpZiAoKGlWYWx1ZUxlbiAtPSAxMCkgPT0gMCkKKyAgICAgIHJldHVybjsKKworICAgIGJJbXBvcnRhbnQgPSB0cnVlOworICB9CisgIGNvbnN0IHVpbnQzMl90IGR3VHlwZSA9IHBUYWJsZS0+ZHdUeXBlOworICBzd2l0Y2ggKGR3VHlwZSAmIDB4MEYpIHsKKyAgICBjYXNlIENGWF9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlOiB7CisgICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgZ19WYWx1ZUd1ZXNzT3JkZXJbXSA9IHsKKyAgICAgICAgICBDRlhfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyLCBDRlhfQ1NTVkFMVUVUWVBFX01heWJlRW51bSwKKyAgICAgICAgICBDRlhfQ1NTVkFMVUVUWVBFX01heWJlQ29sb3IsIENGWF9DU1NWQUxVRVRZUEVfTWF5YmVTdHJpbmcsCisgICAgICB9OworICAgICAgc3RhdGljIGNvbnN0IGludDMyX3QgZ19WYWx1ZUd1ZXNzQ291bnQgPQorICAgICAgICAgIHNpemVvZihnX1ZhbHVlR3Vlc3NPcmRlcikgLyBzaXplb2YodWludDMyX3QpOworICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZ19WYWx1ZUd1ZXNzQ291bnQ7ICsraSkgeworICAgICAgICBjb25zdCB1aW50MzJfdCBkd01hdGNoID0gZHdUeXBlICYgZ19WYWx1ZUd1ZXNzT3JkZXJbaV07CisgICAgICAgIGlmIChkd01hdGNoID09IDApIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBSZXRhaW5QdHI8Q0ZYX0NTU1ZhbHVlPiBwQ1NTVmFsdWU7CisgICAgICAgIHN3aXRjaCAoZHdNYXRjaCkgeworICAgICAgICAgIGNhc2UgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcjoKKyAgICAgICAgICAgIHBDU1NWYWx1ZSA9IFBhcnNlTnVtYmVyKHBzelZhbHVlLCBpVmFsdWVMZW4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBDRlhfQ1NTVkFMVUVUWVBFX01heWJlRW51bToKKyAgICAgICAgICAgIHBDU1NWYWx1ZSA9IFBhcnNlRW51bShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yOgorICAgICAgICAgICAgcENTU1ZhbHVlID0gUGFyc2VDb2xvcihwc3pWYWx1ZSwgaVZhbHVlTGVuKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZVN0cmluZzoKKyAgICAgICAgICAgIHBDU1NWYWx1ZSA9IFBhcnNlU3RyaW5nKHBzelZhbHVlLCBpVmFsdWVMZW4pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChwQ1NTVmFsdWUpIHsKKyAgICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwVGFibGUtPmVOYW1lLCBwQ1NTVmFsdWUsIGJJbXBvcnRhbnQpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoZHdUeXBlICYgfihnX1ZhbHVlR3Vlc3NPcmRlcltpXSkpID09IENGWF9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlKQorICAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIENGWF9DU1NWQUxVRVRZUEVfU2hvcnRoYW5kOiB7CisgICAgICBSZXRhaW5QdHI8Q0ZYX0NTU1ZhbHVlPiBwV2lkdGg7CisgICAgICBzd2l0Y2ggKHBUYWJsZS0+ZU5hbWUpIHsKKyAgICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHk6OkZvbnQ6CisgICAgICAgICAgUGFyc2VGb250UHJvcGVydHkocHN6VmFsdWUsIGlWYWx1ZUxlbiwgYkltcG9ydGFudCk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eTo6Qm9yZGVyOgorICAgICAgICAgIGlmIChQYXJzZUJvcmRlclByb3BlcnR5KHBzelZhbHVlLCBpVmFsdWVMZW4sIHBXaWR0aCkpIHsKKyAgICAgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKENGWF9DU1NQcm9wZXJ0eTo6Qm9yZGVyTGVmdFdpZHRoLCBwV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsKKyAgICAgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKENGWF9DU1NQcm9wZXJ0eTo6Qm9yZGVyVG9wV2lkdGgsIHBXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOworICAgICAgICAgICAgQWRkUHJvcGVydHlIb2xkZXIoQ0ZYX0NTU1Byb3BlcnR5OjpCb3JkZXJSaWdodFdpZHRoLCBwV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsKKyAgICAgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKENGWF9DU1NQcm9wZXJ0eTo6Qm9yZGVyQm90dG9tV2lkdGgsIHBXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHk6OkJvcmRlckxlZnQ6CisgICAgICAgICAgaWYgKFBhcnNlQm9yZGVyUHJvcGVydHkocHN6VmFsdWUsIGlWYWx1ZUxlbiwgcFdpZHRoKSkgeworICAgICAgICAgICAgQWRkUHJvcGVydHlIb2xkZXIoQ0ZYX0NTU1Byb3BlcnR5OjpCb3JkZXJMZWZ0V2lkdGgsIHBXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHk6OkJvcmRlclRvcDoKKyAgICAgICAgICBpZiAoUGFyc2VCb3JkZXJQcm9wZXJ0eShwc3pWYWx1ZSwgaVZhbHVlTGVuLCBwV2lkdGgpKSB7CisgICAgICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihDRlhfQ1NTUHJvcGVydHk6OkJvcmRlclRvcFdpZHRoLCBwV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5OjpCb3JkZXJSaWdodDoKKyAgICAgICAgICBpZiAoUGFyc2VCb3JkZXJQcm9wZXJ0eShwc3pWYWx1ZSwgaVZhbHVlTGVuLCBwV2lkdGgpKSB7CisgICAgICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihDRlhfQ1NTUHJvcGVydHk6OkJvcmRlclJpZ2h0V2lkdGgsIHBXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHk6OkJvcmRlckJvdHRvbToKKyAgICAgICAgICBpZiAoUGFyc2VCb3JkZXJQcm9wZXJ0eShwc3pWYWx1ZSwgaVZhbHVlTGVuLCBwV2lkdGgpKSB7CisgICAgICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihDRlhfQ1NTUHJvcGVydHk6OkJvcmRlckJvdHRvbVdpZHRoLCBwV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSW1wb3J0YW50KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfSBicmVhazsKKyAgICBjYXNlIENGWF9DU1NWQUxVRVRZUEVfTGlzdDoKKyAgICAgIFBhcnNlVmFsdWVMaXN0UHJvcGVydHkocFRhYmxlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuLCBiSW1wb3J0YW50KTsKKyAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0OgorICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCBDRlhfQ1NTRGVjbGFyYXRpb246OkFkZFByb3BlcnR5KGNvbnN0IFdpZGVTdHJpbmcmIHByb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgdmFsdWUpIHsKKyAgY3VzdG9tX3Byb3BlcnRpZXNfLnB1c2hfYmFjaygKKyAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfQ1NTQ3VzdG9tUHJvcGVydHk+KHByb3AsIHZhbHVlKSk7Cit9CisKK1JldGFpblB0cjxDRlhfQ1NTVmFsdWU+IENGWF9DU1NEZWNsYXJhdGlvbjo6UGFyc2VOdW1iZXIoY29uc3Qgd2NoYXJfdCogcHN6VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuKSB7CisgIGZsb2F0IGZWYWx1ZTsKKyAgQ0ZYX0NTU051bWJlclR5cGUgZVVuaXQ7CisgIGlmICghUGFyc2VDU1NOdW1iZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZlZhbHVlLCBlVW5pdCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0NTU051bWJlclZhbHVlPihlVW5pdCwgZlZhbHVlKTsKK30KKworUmV0YWluUHRyPENGWF9DU1NWYWx1ZT4gQ0ZYX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUVudW0oY29uc3Qgd2NoYXJfdCogcHN6VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbikgeworICBjb25zdCBDRlhfQ1NTUHJvcGVydHlWYWx1ZVRhYmxlKiBwVmFsdWUgPQorICAgICAgR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShXaWRlU3RyaW5nVmlldyhwc3pWYWx1ZSwgaVZhbHVlTGVuKSk7CisgIHJldHVybiBwVmFsdWUgPyBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0NTU0VudW1WYWx1ZT4ocFZhbHVlLT5lTmFtZSkgOiBudWxscHRyOworfQorCitSZXRhaW5QdHI8Q0ZYX0NTU1ZhbHVlPiBDRlhfQ1NTRGVjbGFyYXRpb246OlBhcnNlQ29sb3IoY29uc3Qgd2NoYXJfdCogcHN6VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4pIHsKKyAgRlhfQVJHQiBkd0NvbG9yOworICBpZiAoIVBhcnNlQ1NTQ29sb3IocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJmR3Q29sb3IpKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9DU1NDb2xvclZhbHVlPihkd0NvbG9yKTsKK30KKworUmV0YWluUHRyPENGWF9DU1NWYWx1ZT4gQ0ZYX0NTU0RlY2xhcmF0aW9uOjpQYXJzZVN0cmluZyhjb25zdCB3Y2hhcl90KiBwc3pWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4pIHsKKyAgaW50MzJfdCBpT2Zmc2V0OworICBpZiAoIVBhcnNlQ1NTU3RyaW5nKHBzelZhbHVlLCBpVmFsdWVMZW4sICZpT2Zmc2V0LCAmaVZhbHVlTGVuKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBpZiAoaVZhbHVlTGVuIDw9IDApCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgcmV0dXJuIHBkZml1bTo6TWFrZVJldGFpbjxDRlhfQ1NTU3RyaW5nVmFsdWU+KAorICAgICAgV2lkZVN0cmluZyhwc3pWYWx1ZSArIGlPZmZzZXQsIGlWYWx1ZUxlbikpOworfQorCit2b2lkIENGWF9DU1NEZWNsYXJhdGlvbjo6UGFyc2VWYWx1ZUxpc3RQcm9wZXJ0eSgKKyAgICBjb25zdCBDRlhfQ1NTUHJvcGVydHlUYWJsZSogcFRhYmxlLAorICAgIGNvbnN0IHdjaGFyX3QqIHBzelZhbHVlLAorICAgIGludDMyX3QgaVZhbHVlTGVuLAorICAgIGJvb2wgYkltcG9ydGFudCkgeworICB3Y2hhcl90IHNlcGFyYXRvciA9CisgICAgICAocFRhYmxlLT5lTmFtZSA9PSBDRlhfQ1NTUHJvcGVydHk6OkZvbnRGYW1pbHkpID8gJywnIDogJyAnOworICBDRlhfQ1NTVmFsdWVMaXN0UGFyc2VyIHBhcnNlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBzZXBhcmF0b3IpOworCisgIGNvbnN0IHVpbnQzMl90IGR3VHlwZSA9IHBUYWJsZS0+ZHdUeXBlOworICBDRlhfQ1NTUHJpbWl0aXZlVHlwZSBlVHlwZTsKKyAgc3RkOjp2ZWN0b3I8UmV0YWluUHRyPENGWF9DU1NWYWx1ZT4+IGxpc3Q7CisgIHdoaWxlIChwYXJzZXIuTmV4dFZhbHVlKCZlVHlwZSwgJnBzelZhbHVlLCAmaVZhbHVlTGVuKSkgeworICAgIHN3aXRjaCAoZVR5cGUpIHsKKyAgICAgIGNhc2UgQ0ZYX0NTU1ByaW1pdGl2ZVR5cGU6Ok51bWJlcjoKKyAgICAgICAgaWYgKGR3VHlwZSAmIENGWF9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXIpIHsKKyAgICAgICAgICBmbG9hdCBmVmFsdWU7CisgICAgICAgICAgQ0ZYX0NTU051bWJlclR5cGUgZU51bVR5cGU7CisgICAgICAgICAgaWYgKFBhcnNlQ1NTTnVtYmVyKHBzelZhbHVlLCBpVmFsdWVMZW4sIGZWYWx1ZSwgZU51bVR5cGUpKQorICAgICAgICAgICAgbGlzdC5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlUmV0YWluPENGWF9DU1NOdW1iZXJWYWx1ZT4oZU51bVR5cGUsIGZWYWx1ZSkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDRlhfQ1NTUHJpbWl0aXZlVHlwZTo6U3RyaW5nOgorICAgICAgICBpZiAoZHdUeXBlICYgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yKSB7CisgICAgICAgICAgRlhfQVJHQiBkd0NvbG9yOworICAgICAgICAgIGlmIChQYXJzZUNTU0NvbG9yKHBzelZhbHVlLCBpVmFsdWVMZW4sICZkd0NvbG9yKSkgeworICAgICAgICAgICAgbGlzdC5wdXNoX2JhY2socGRmaXVtOjpNYWtlUmV0YWluPENGWF9DU1NDb2xvclZhbHVlPihkd0NvbG9yKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGR3VHlwZSAmIENGWF9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtKSB7CisgICAgICAgICAgY29uc3QgQ0ZYX0NTU1Byb3BlcnR5VmFsdWVUYWJsZSogcFZhbHVlID0KKyAgICAgICAgICAgICAgR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShXaWRlU3RyaW5nVmlldyhwc3pWYWx1ZSwgaVZhbHVlTGVuKSk7CisgICAgICAgICAgaWYgKHBWYWx1ZSkgeworICAgICAgICAgICAgbGlzdC5wdXNoX2JhY2socGRmaXVtOjpNYWtlUmV0YWluPENGWF9DU1NFbnVtVmFsdWU+KHBWYWx1ZS0+ZU5hbWUpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZHdUeXBlICYgQ0ZYX0NTU1ZBTFVFVFlQRV9NYXliZVN0cmluZykgeworICAgICAgICAgIGxpc3QucHVzaF9iYWNrKHBkZml1bTo6TWFrZVJldGFpbjxDRlhfQ1NTU3RyaW5nVmFsdWU+KAorICAgICAgICAgICAgICBXaWRlU3RyaW5nKHBzelZhbHVlLCBpVmFsdWVMZW4pKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENGWF9DU1NQcmltaXRpdmVUeXBlOjpSR0I6CisgICAgICAgIGlmIChkd1R5cGUgJiBDRlhfQ1NTVkFMVUVUWVBFX01heWJlQ29sb3IpIHsKKyAgICAgICAgICBGWF9BUkdCIGR3Q29sb3I7CisgICAgICAgICAgaWYgKFBhcnNlQ1NTQ29sb3IocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJmR3Q29sb3IpKSB7CisgICAgICAgICAgICBsaXN0LnB1c2hfYmFjayhwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0NTU0NvbG9yVmFsdWU+KGR3Q29sb3IpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKGxpc3QuZW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgc3dpdGNoIChwVGFibGUtPmVOYW1lKSB7CisgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHk6OkJvcmRlcldpZHRoOgorICAgICAgQWRkNFZhbHVlc1Byb3BlcnR5KGxpc3QsIGJJbXBvcnRhbnQsIENGWF9DU1NQcm9wZXJ0eTo6Qm9yZGVyTGVmdFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DU1NQcm9wZXJ0eTo6Qm9yZGVyVG9wV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NTU1Byb3BlcnR5OjpCb3JkZXJSaWdodFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DU1NQcm9wZXJ0eTo6Qm9yZGVyQm90dG9tV2lkdGgpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5OjpNYXJnaW46CisgICAgICBBZGQ0VmFsdWVzUHJvcGVydHkobGlzdCwgYkltcG9ydGFudCwgQ0ZYX0NTU1Byb3BlcnR5OjpNYXJnaW5MZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DU1NQcm9wZXJ0eTo6TWFyZ2luVG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DU1NQcm9wZXJ0eTo6TWFyZ2luUmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NTU1Byb3BlcnR5OjpNYXJnaW5Cb3R0b20pOworICAgICAgcmV0dXJuOworICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5OjpQYWRkaW5nOgorICAgICAgQWRkNFZhbHVlc1Byb3BlcnR5KGxpc3QsIGJJbXBvcnRhbnQsIENGWF9DU1NQcm9wZXJ0eTo6UGFkZGluZ0xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NTU1Byb3BlcnR5OjpQYWRkaW5nVG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DU1NQcm9wZXJ0eTo6UGFkZGluZ1JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DU1NQcm9wZXJ0eTo6UGFkZGluZ0JvdHRvbSk7CisgICAgICByZXR1cm47CisgICAgZGVmYXVsdDogeworICAgICAgYXV0byBwTGlzdCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfQ1NTVmFsdWVMaXN0PihsaXN0KTsKKyAgICAgIEFkZFByb3BlcnR5SG9sZGVyKHBUYWJsZS0+ZU5hbWUsIHBMaXN0LCBiSW1wb3J0YW50KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KK30KKwordm9pZCBDRlhfQ1NTRGVjbGFyYXRpb246OkFkZDRWYWx1ZXNQcm9wZXJ0eSgKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxSZXRhaW5QdHI8Q0ZYX0NTU1ZhbHVlPj4mIGxpc3QsCisgICAgYm9vbCBiSW1wb3J0YW50LAorICAgIENGWF9DU1NQcm9wZXJ0eSBlTGVmdCwKKyAgICBDRlhfQ1NTUHJvcGVydHkgZVRvcCwKKyAgICBDRlhfQ1NTUHJvcGVydHkgZVJpZ2h0LAorICAgIENGWF9DU1NQcm9wZXJ0eSBlQm90dG9tKSB7CisgIHN3aXRjaCAobGlzdC5zaXplKCkpIHsKKyAgICBjYXNlIDE6CisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihlTGVmdCwgbGlzdFswXSwgYkltcG9ydGFudCk7CisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihlVG9wLCBsaXN0WzBdLCBiSW1wb3J0YW50KTsKKyAgICAgIEFkZFByb3BlcnR5SG9sZGVyKGVSaWdodCwgbGlzdFswXSwgYkltcG9ydGFudCk7CisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihlQm90dG9tLCBsaXN0WzBdLCBiSW1wb3J0YW50KTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIDI6CisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihlTGVmdCwgbGlzdFsxXSwgYkltcG9ydGFudCk7CisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihlVG9wLCBsaXN0WzBdLCBiSW1wb3J0YW50KTsKKyAgICAgIEFkZFByb3BlcnR5SG9sZGVyKGVSaWdodCwgbGlzdFsxXSwgYkltcG9ydGFudCk7CisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihlQm90dG9tLCBsaXN0WzBdLCBiSW1wb3J0YW50KTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIDM6CisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihlTGVmdCwgbGlzdFsxXSwgYkltcG9ydGFudCk7CisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihlVG9wLCBsaXN0WzBdLCBiSW1wb3J0YW50KTsKKyAgICAgIEFkZFByb3BlcnR5SG9sZGVyKGVSaWdodCwgbGlzdFsxXSwgYkltcG9ydGFudCk7CisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihlQm90dG9tLCBsaXN0WzJdLCBiSW1wb3J0YW50KTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIDQ6CisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihlTGVmdCwgbGlzdFszXSwgYkltcG9ydGFudCk7CisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihlVG9wLCBsaXN0WzBdLCBiSW1wb3J0YW50KTsKKyAgICAgIEFkZFByb3BlcnR5SG9sZGVyKGVSaWdodCwgbGlzdFsxXSwgYkltcG9ydGFudCk7CisgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihlQm90dG9tLCBsaXN0WzJdLCBiSW1wb3J0YW50KTsKKyAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworYm9vbCBDRlhfQ1NTRGVjbGFyYXRpb246OlBhcnNlQm9yZGVyUHJvcGVydHkoCisgICAgY29uc3Qgd2NoYXJfdCogcHN6VmFsdWUsCisgICAgaW50MzJfdCBpVmFsdWVMZW4sCisgICAgUmV0YWluUHRyPENGWF9DU1NWYWx1ZT4mIHBXaWR0aCkgY29uc3QgeworICBwV2lkdGguUmVzZXQobnVsbHB0cik7CisKKyAgQ0ZYX0NTU1ZhbHVlTGlzdFBhcnNlciBwYXJzZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJyAnKTsKKyAgQ0ZYX0NTU1ByaW1pdGl2ZVR5cGUgZVR5cGU7CisgIHdoaWxlIChwYXJzZXIuTmV4dFZhbHVlKCZlVHlwZSwgJnBzelZhbHVlLCAmaVZhbHVlTGVuKSkgeworICAgIHN3aXRjaCAoZVR5cGUpIHsKKyAgICAgIGNhc2UgQ0ZYX0NTU1ByaW1pdGl2ZVR5cGU6Ok51bWJlcjogeworICAgICAgICBpZiAocFdpZHRoKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGZsb2F0IGZWYWx1ZTsKKyAgICAgICAgQ0ZYX0NTU051bWJlclR5cGUgZU51bVR5cGU7CisgICAgICAgIGlmIChQYXJzZUNTU051bWJlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBmVmFsdWUsIGVOdW1UeXBlKSkKKyAgICAgICAgICBwV2lkdGggPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0NTU051bWJlclZhbHVlPihlTnVtVHlwZSwgZlZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIENGWF9DU1NQcmltaXRpdmVUeXBlOjpTdHJpbmc6IHsKKyAgICAgICAgY29uc3QgQ0ZYX0NTU0NvbG9yVGFibGUqIHBDb2xvckl0ZW0gPQorICAgICAgICAgICAgR2V0Q1NTQ29sb3JCeU5hbWUoV2lkZVN0cmluZ1ZpZXcocHN6VmFsdWUsIGlWYWx1ZUxlbikpOworICAgICAgICBpZiAocENvbG9ySXRlbSkKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBjb25zdCBDRlhfQ1NTUHJvcGVydHlWYWx1ZVRhYmxlKiBwVmFsdWUgPQorICAgICAgICAgICAgR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShXaWRlU3RyaW5nVmlldyhwc3pWYWx1ZSwgaVZhbHVlTGVuKSk7CisgICAgICAgIGlmICghcFZhbHVlKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHN3aXRjaCAocFZhbHVlLT5lTmFtZSkgeworICAgICAgICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5VmFsdWU6OlRoaW46CisgICAgICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6VGhpY2s6CisgICAgICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6TWVkaXVtOgorICAgICAgICAgICAgaWYgKCFwV2lkdGgpCisgICAgICAgICAgICAgIHBXaWR0aCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfQ1NTRW51bVZhbHVlPihwVmFsdWUtPmVOYW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoIXBXaWR0aCkKKyAgICBwV2lkdGggPQorICAgICAgICBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0NTU051bWJlclZhbHVlPihDRlhfQ1NTTnVtYmVyVHlwZTo6TnVtYmVyLCAwLjBmKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDRlhfQ1NTRGVjbGFyYXRpb246OlBhcnNlRm9udFByb3BlcnR5KGNvbnN0IHdjaGFyX3QqIHBzelZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkltcG9ydGFudCkgeworICBDRlhfQ1NTVmFsdWVMaXN0UGFyc2VyIHBhcnNlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCAnLycpOworICBSZXRhaW5QdHI8Q0ZYX0NTU1ZhbHVlPiBwU3R5bGU7CisgIFJldGFpblB0cjxDRlhfQ1NTVmFsdWU+IHBWYXJpYW50OworICBSZXRhaW5QdHI8Q0ZYX0NTU1ZhbHVlPiBwV2VpZ2h0OworICBSZXRhaW5QdHI8Q0ZYX0NTU1ZhbHVlPiBwRm9udFNpemU7CisgIFJldGFpblB0cjxDRlhfQ1NTVmFsdWU+IHBMaW5lSGVpZ2h0OworICBzdGQ6OnZlY3RvcjxSZXRhaW5QdHI8Q0ZYX0NTU1ZhbHVlPj4gZmFtaWx5TGlzdDsKKyAgQ0ZYX0NTU1ByaW1pdGl2ZVR5cGUgZVR5cGU7CisgIHdoaWxlIChwYXJzZXIuTmV4dFZhbHVlKCZlVHlwZSwgJnBzelZhbHVlLCAmaVZhbHVlTGVuKSkgeworICAgIHN3aXRjaCAoZVR5cGUpIHsKKyAgICAgIGNhc2UgQ0ZYX0NTU1ByaW1pdGl2ZVR5cGU6OlN0cmluZzogeworICAgICAgICBjb25zdCBDRlhfQ1NTUHJvcGVydHlWYWx1ZVRhYmxlKiBwVmFsdWUgPQorICAgICAgICAgICAgR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShXaWRlU3RyaW5nVmlldyhwc3pWYWx1ZSwgaVZhbHVlTGVuKSk7CisgICAgICAgIGlmIChwVmFsdWUpIHsKKyAgICAgICAgICBzd2l0Y2ggKHBWYWx1ZS0+ZU5hbWUpIHsKKyAgICAgICAgICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5VmFsdWU6Olh4U21hbGw6CisgICAgICAgICAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpYU21hbGw6CisgICAgICAgICAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpTbWFsbDoKKyAgICAgICAgICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5VmFsdWU6Ok1lZGl1bToKKyAgICAgICAgICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5VmFsdWU6OkxhcmdlOgorICAgICAgICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6WExhcmdlOgorICAgICAgICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6WHhMYXJnZToKKyAgICAgICAgICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5VmFsdWU6OlNtYWxsZXI6CisgICAgICAgICAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpMYXJnZXI6CisgICAgICAgICAgICAgIGlmICghcEZvbnRTaXplKQorICAgICAgICAgICAgICAgIHBGb250U2l6ZSA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfQ1NTRW51bVZhbHVlPihwVmFsdWUtPmVOYW1lKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpCb2xkOgorICAgICAgICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6Qm9sZGVyOgorICAgICAgICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6TGlnaHRlcjoKKyAgICAgICAgICAgICAgaWYgKCFwV2VpZ2h0KQorICAgICAgICAgICAgICAgIHBXZWlnaHQgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0NTU0VudW1WYWx1ZT4ocFZhbHVlLT5lTmFtZSk7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6SXRhbGljOgorICAgICAgICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6T2JsaXF1ZToKKyAgICAgICAgICAgICAgaWYgKCFwU3R5bGUpCisgICAgICAgICAgICAgICAgcFN0eWxlID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9DU1NFbnVtVmFsdWU+KHBWYWx1ZS0+ZU5hbWUpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5VmFsdWU6OlNtYWxsQ2FwczoKKyAgICAgICAgICAgICAgaWYgKCFwVmFyaWFudCkKKyAgICAgICAgICAgICAgICBwVmFyaWFudCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfQ1NTRW51bVZhbHVlPihwVmFsdWUtPmVOYW1lKTsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpOb3JtYWw6CisgICAgICAgICAgICAgIGlmICghcFN0eWxlKQorICAgICAgICAgICAgICAgIHBTdHlsZSA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfQ1NTRW51bVZhbHVlPihwVmFsdWUtPmVOYW1lKTsKKyAgICAgICAgICAgICAgZWxzZSBpZiAoIXBWYXJpYW50KQorICAgICAgICAgICAgICAgIHBWYXJpYW50ID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9DU1NFbnVtVmFsdWU+KHBWYWx1ZS0+ZU5hbWUpOworICAgICAgICAgICAgICBlbHNlIGlmICghcFdlaWdodCkKKyAgICAgICAgICAgICAgICBwV2VpZ2h0ID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9DU1NFbnVtVmFsdWU+KHBWYWx1ZS0+ZU5hbWUpOworICAgICAgICAgICAgICBlbHNlIGlmICghcEZvbnRTaXplKQorICAgICAgICAgICAgICAgIHBGb250U2l6ZSA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfQ1NTRW51bVZhbHVlPihwVmFsdWUtPmVOYW1lKTsKKyAgICAgICAgICAgICAgZWxzZSBpZiAoIXBMaW5lSGVpZ2h0KQorICAgICAgICAgICAgICAgIHBMaW5lSGVpZ2h0ID0KKyAgICAgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlUmV0YWluPENGWF9DU1NFbnVtVmFsdWU+KHBWYWx1ZS0+ZU5hbWUpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocEZvbnRTaXplKSB7CisgICAgICAgICAgZmFtaWx5TGlzdC5wdXNoX2JhY2socGRmaXVtOjpNYWtlUmV0YWluPENGWF9DU1NTdHJpbmdWYWx1ZT4oCisgICAgICAgICAgICAgIFdpZGVTdHJpbmcocHN6VmFsdWUsIGlWYWx1ZUxlbikpKTsKKyAgICAgICAgfQorICAgICAgICBwYXJzZXIuVXNlQ29tbWFTZXBhcmF0b3IoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIENGWF9DU1NQcmltaXRpdmVUeXBlOjpOdW1iZXI6IHsKKyAgICAgICAgZmxvYXQgZlZhbHVlOworICAgICAgICBDRlhfQ1NTTnVtYmVyVHlwZSBlTnVtVHlwZTsKKyAgICAgICAgaWYgKCFQYXJzZUNTU051bWJlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBmVmFsdWUsIGVOdW1UeXBlKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGVUeXBlID09IENGWF9DU1NQcmltaXRpdmVUeXBlOjpOdW1iZXIpIHsKKyAgICAgICAgICBzd2l0Y2ggKChpbnQzMl90KWZWYWx1ZSkgeworICAgICAgICAgICAgY2FzZSAxMDA6CisgICAgICAgICAgICBjYXNlIDIwMDoKKyAgICAgICAgICAgIGNhc2UgMzAwOgorICAgICAgICAgICAgY2FzZSA0MDA6CisgICAgICAgICAgICBjYXNlIDUwMDoKKyAgICAgICAgICAgIGNhc2UgNjAwOgorICAgICAgICAgICAgY2FzZSA3MDA6CisgICAgICAgICAgICBjYXNlIDgwMDoKKyAgICAgICAgICAgIGNhc2UgOTAwOgorICAgICAgICAgICAgICBpZiAoIXBXZWlnaHQpCisgICAgICAgICAgICAgICAgcFdlaWdodCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfQ1NTTnVtYmVyVmFsdWU+KAorICAgICAgICAgICAgICAgICAgICBDRlhfQ1NTTnVtYmVyVHlwZTo6TnVtYmVyLCBmVmFsdWUpOworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwRm9udFNpemUpCisgICAgICAgICAgcEZvbnRTaXplID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9DU1NOdW1iZXJWYWx1ZT4oZU51bVR5cGUsIGZWYWx1ZSk7CisgICAgICAgIGVsc2UgaWYgKCFwTGluZUhlaWdodCkKKyAgICAgICAgICBwTGluZUhlaWdodCA9CisgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDRlhfQ1NTTnVtYmVyVmFsdWU+KGVOdW1UeXBlLCBmVmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmICghcFN0eWxlKSB7CisgICAgcFN0eWxlID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9DU1NFbnVtVmFsdWU+KENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpOb3JtYWwpOworICB9CisgIGlmICghcFZhcmlhbnQpIHsKKyAgICBwVmFyaWFudCA9CisgICAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDRlhfQ1NTRW51bVZhbHVlPihDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6Tm9ybWFsKTsKKyAgfQorICBpZiAoIXBXZWlnaHQpIHsKKyAgICBwV2VpZ2h0ID0KKyAgICAgICAgcGRmaXVtOjpNYWtlUmV0YWluPENGWF9DU1NFbnVtVmFsdWU+KENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpOb3JtYWwpOworICB9CisgIGlmICghcEZvbnRTaXplKSB7CisgICAgcEZvbnRTaXplID0KKyAgICAgICAgcGRmaXVtOjpNYWtlUmV0YWluPENGWF9DU1NFbnVtVmFsdWU+KENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpNZWRpdW0pOworICB9CisgIGlmICghcExpbmVIZWlnaHQpIHsKKyAgICBwTGluZUhlaWdodCA9CisgICAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDRlhfQ1NTRW51bVZhbHVlPihDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6Tm9ybWFsKTsKKyAgfQorCisgIEFkZFByb3BlcnR5SG9sZGVyKENGWF9DU1NQcm9wZXJ0eTo6Rm9udFN0eWxlLCBwU3R5bGUsIGJJbXBvcnRhbnQpOworICBBZGRQcm9wZXJ0eUhvbGRlcihDRlhfQ1NTUHJvcGVydHk6OkZvbnRWYXJpYW50LCBwVmFyaWFudCwgYkltcG9ydGFudCk7CisgIEFkZFByb3BlcnR5SG9sZGVyKENGWF9DU1NQcm9wZXJ0eTo6Rm9udFdlaWdodCwgcFdlaWdodCwgYkltcG9ydGFudCk7CisgIEFkZFByb3BlcnR5SG9sZGVyKENGWF9DU1NQcm9wZXJ0eTo6Rm9udFNpemUsIHBGb250U2l6ZSwgYkltcG9ydGFudCk7CisgIEFkZFByb3BlcnR5SG9sZGVyKENGWF9DU1NQcm9wZXJ0eTo6TGluZUhlaWdodCwgcExpbmVIZWlnaHQsIGJJbXBvcnRhbnQpOworICBpZiAoIWZhbWlseUxpc3QuZW1wdHkoKSkgeworICAgIGF1dG8gcExpc3QgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0NTU1ZhbHVlTGlzdD4oZmFtaWx5TGlzdCk7CisgICAgQWRkUHJvcGVydHlIb2xkZXIoQ0ZYX0NTU1Byb3BlcnR5OjpGb250RmFtaWx5LCBwTGlzdCwgYkltcG9ydGFudCk7CisgIH0KK30KKworc2l6ZV90IENGWF9DU1NEZWNsYXJhdGlvbjo6UHJvcGVydHlDb3VudEZvclRlc3RpbmcoKSBjb25zdCB7CisgIHJldHVybiBwcm9wZXJ0aWVzXy5zaXplKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzZGVjbGFyYXRpb24uaCBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NkZWNsYXJhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZDBiYmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzZGVjbGFyYXRpb24uaApAQCAtMCwwICsxLDkyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENSVF9DU1NfQ0ZYX0NTU0RFQ0xBUkFUSU9OX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NERUNMQVJBVElPTl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc2RhdGF0YWJsZS5oIgorCitjbGFzcyBDRlhfQ1NTUHJvcGVydHlIb2xkZXI7CitjbGFzcyBDRlhfQ1NTQ3VzdG9tUHJvcGVydHk7CisKK2NsYXNzIENGWF9DU1NEZWNsYXJhdGlvbiB7CisgcHVibGljOgorICB1c2luZyBjb25zdF9wcm9wX2l0ZXJhdG9yID0KKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhfQ1NTUHJvcGVydHlIb2xkZXI+Pjo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2N1c3RvbV9pdGVyYXRvciA9CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0NTU0N1c3RvbVByb3BlcnR5Pj46OmNvbnN0X2l0ZXJhdG9yOworCisgIHN0YXRpYyBib29sIFBhcnNlQ1NTU3RyaW5nKGNvbnN0IHdjaGFyX3QqIHBzelZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogaU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogaUxlbmd0aCk7CisgIHN0YXRpYyBib29sIFBhcnNlQ1NTQ29sb3IoY29uc3Qgd2NoYXJfdCogcHN6VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiogZHdDb2xvcik7CisKKyAgQ0ZYX0NTU0RlY2xhcmF0aW9uKCk7CisgIH5DRlhfQ1NTRGVjbGFyYXRpb24oKTsKKworICBSZXRhaW5QdHI8Q0ZYX0NTU1ZhbHVlPiBHZXRQcm9wZXJ0eShDRlhfQ1NTUHJvcGVydHkgZVByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBiSW1wb3J0YW50KSBjb25zdDsKKworICBjb25zdF9wcm9wX2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gcHJvcGVydGllc18uYmVnaW4oKTsgfQorICBjb25zdF9wcm9wX2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIHByb3BlcnRpZXNfLmVuZCgpOyB9CisKKyAgY29uc3RfY3VzdG9tX2l0ZXJhdG9yIGN1c3RvbV9iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY3VzdG9tX3Byb3BlcnRpZXNfLmJlZ2luKCk7CisgIH0KKyAgY29uc3RfY3VzdG9tX2l0ZXJhdG9yIGN1c3RvbV9lbmQoKSBjb25zdCB7IHJldHVybiBjdXN0b21fcHJvcGVydGllc18uZW5kKCk7IH0KKworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gcHJvcGVydGllc18uZW1wdHkoKTsgfQorCisgIHZvaWQgQWRkUHJvcGVydHkoY29uc3QgQ0ZYX0NTU1Byb3BlcnR5VGFibGUqIHBUYWJsZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgdmFsdWUpOworICB2b2lkIEFkZFByb3BlcnR5KGNvbnN0IFdpZGVTdHJpbmcmIHByb3AsIGNvbnN0IFdpZGVTdHJpbmcmIHZhbHVlKTsKKworICBzaXplX3QgUHJvcGVydHlDb3VudEZvclRlc3RpbmcoKSBjb25zdDsKKworICBGWF9BUkdCIFBhcnNlQ29sb3JGb3JUZXN0KGNvbnN0IHdjaGFyX3QqIHBzelZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IqIGR3Q29sb3IpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgdm9pZCBQYXJzZUZvbnRQcm9wZXJ0eShjb25zdCB3Y2hhcl90KiBwc3pWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJbXBvcnRhbnQpOworICBib29sIFBhcnNlQm9yZGVyUHJvcGVydHkoY29uc3Qgd2NoYXJfdCogcHN6VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldGFpblB0cjxDRlhfQ1NTVmFsdWU+JiBwV2lkdGgpIGNvbnN0OworICB2b2lkIFBhcnNlVmFsdWVMaXN0UHJvcGVydHkoY29uc3QgQ0ZYX0NTU1Byb3BlcnR5VGFibGUqIHBUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHBzelZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJbXBvcnRhbnQpOworICB2b2lkIEFkZDRWYWx1ZXNQcm9wZXJ0eShjb25zdCBzdGQ6OnZlY3RvcjxSZXRhaW5QdHI8Q0ZYX0NTU1ZhbHVlPj4mIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkltcG9ydGFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NTU1Byb3BlcnR5IGVMZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQ1NTUHJvcGVydHkgZVRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NTU1Byb3BlcnR5IGVSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NTU1Byb3BlcnR5IGVCb3R0b20pOworICBSZXRhaW5QdHI8Q0ZYX0NTU1ZhbHVlPiBQYXJzZU51bWJlcihjb25zdCB3Y2hhcl90KiBwc3pWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4pOworICBSZXRhaW5QdHI8Q0ZYX0NTU1ZhbHVlPiBQYXJzZUVudW0oY29uc3Qgd2NoYXJfdCogcHN6VmFsdWUsIGludDMyX3QgaVZhbHVlTGVuKTsKKyAgUmV0YWluUHRyPENGWF9DU1NWYWx1ZT4gUGFyc2VDb2xvcihjb25zdCB3Y2hhcl90KiBwc3pWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbik7CisgIFJldGFpblB0cjxDRlhfQ1NTVmFsdWU+IFBhcnNlU3RyaW5nKGNvbnN0IHdjaGFyX3QqIHBzelZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbik7CisgIHZvaWQgQWRkUHJvcGVydHlIb2xkZXIoQ0ZYX0NTU1Byb3BlcnR5IGVQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXRhaW5QdHI8Q0ZYX0NTU1ZhbHVlPiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSW1wb3J0YW50KTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0NTU1Byb3BlcnR5SG9sZGVyPj4gcHJvcGVydGllc187CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhfQ1NTQ3VzdG9tUHJvcGVydHk+PiBjdXN0b21fcHJvcGVydGllc187Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NERUNMQVJBVElPTl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jc3MvY2Z4X2Nzc2RlY2xhcmF0aW9uX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NkZWNsYXJhdGlvbl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1ZTY3ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NkZWNsYXJhdGlvbl91bml0dGVzdC5jcHAKQEAgLTAsMCArMSw2MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc2RlY2xhcmF0aW9uLmgiCisKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5oIgorCitURVNUKENGWF9DU1NEZWNsYXJhdGlvblRlc3QsIEhleEVuY29kaW5nUGFyc2luZykgeworICBGWF9BUkdCIGNvbG9yOworCisgIC8vIExlbmd0aCB2YWx1ZSBpbnZhbGlkLgorICBFWFBFQ1RfRkFMU0UoQ0ZYX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUNTU0NvbG9yKEwiIzAwMCIsIDMsICZjb2xvcikpOworICBFWFBFQ1RfRkFMU0UoQ0ZYX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUNTU0NvbG9yKEwiIzAwMDAwMCIsIDUsICZjb2xvcikpOworICBFWFBFQ1RfRkFMU0UoQ0ZYX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUNTU0NvbG9yKEwiIzAwMDAwMCIsIDgsICZjb2xvcikpOworCisgIC8vIEludmFsaWQgY2hhcmFjdGVycworICBFWFBFQ1RfVFJVRShDRlhfQ1NTRGVjbGFyYXRpb246OlBhcnNlQ1NTQ29sb3IoTCIjenh5dGxtIiwgNywgJmNvbG9yKSk7CisgIEVYUEVDVF9FUSgwLCBGWEFSR0JfUihjb2xvcikpOworICBFWFBFQ1RfRVEoMCwgRlhBUkdCX0coY29sb3IpKTsKKyAgRVhQRUNUX0VRKDAsIEZYQVJHQl9CKGNvbG9yKSk7CisKKyAgRVhQRUNUX1RSVUUoQ0ZYX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUNTU0NvbG9yKEwiIzAwMCIsIDQsICZjb2xvcikpOworICBFWFBFQ1RfRVEoMCwgRlhBUkdCX1IoY29sb3IpKTsKKyAgRVhQRUNUX0VRKDAsIEZYQVJHQl9HKGNvbG9yKSk7CisgIEVYUEVDVF9FUSgwLCBGWEFSR0JfQihjb2xvcikpOworCisgIEVYUEVDVF9UUlVFKENGWF9DU1NEZWNsYXJhdGlvbjo6UGFyc2VDU1NDb2xvcihMIiNGRkYiLCA0LCAmY29sb3IpKTsKKyAgRVhQRUNUX0VRKDI1NSwgRlhBUkdCX1IoY29sb3IpKTsKKyAgRVhQRUNUX0VRKDI1NSwgRlhBUkdCX0coY29sb3IpKTsKKyAgRVhQRUNUX0VRKDI1NSwgRlhBUkdCX0IoY29sb3IpKTsKKworICBFWFBFQ1RfVFJVRShDRlhfQ1NTRGVjbGFyYXRpb246OlBhcnNlQ1NTQ29sb3IoTCIjRjBGMEYwIiwgNywgJmNvbG9yKSk7CisgIEVYUEVDVF9FUSgyNDAsIEZYQVJHQl9SKGNvbG9yKSk7CisgIEVYUEVDVF9FUSgyNDAsIEZYQVJHQl9HKGNvbG9yKSk7CisgIEVYUEVDVF9FUSgyNDAsIEZYQVJHQl9CKGNvbG9yKSk7CisKKyAgLy8gVXBwZXIgYW5kIGxvd2VyIGNhc2UgY2hhcmFjdGVycy4KKyAgRVhQRUNUX1RSVUUoQ0ZYX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUNTU0NvbG9yKEwiIzFiMkYzYyIsIDcsICZjb2xvcikpOworICBFWFBFQ1RfRVEoMjcsIEZYQVJHQl9SKGNvbG9yKSk7CisgIEVYUEVDVF9FUSg0NywgRlhBUkdCX0coY29sb3IpKTsKKyAgRVhQRUNUX0VRKDYwLCBGWEFSR0JfQihjb2xvcikpOworfQorCitURVNUKENGWF9DU1NEZWNsYXJhdGlvblRlc3QsIFJHQkVuY29kaW5nUGFyc2luZykgeworICBGWF9BUkdCIGNvbG9yOworCisgIC8vIEludmFsaWQgaW5wdXQgZm9yIHJnYigpIHN5bnRheC4KKyAgRVhQRUNUX0ZBTFNFKENGWF9DU1NEZWNsYXJhdGlvbjo6UGFyc2VDU1NDb2xvcihMImJsYWhibGFoYmxhaCIsIDExLCAmY29sb3IpKTsKKworICBFWFBFQ1RfVFJVRShDRlhfQ1NTRGVjbGFyYXRpb246OlBhcnNlQ1NTQ29sb3IoTCJyZ2IoMCwgMCwgMCkiLCAxMiwgJmNvbG9yKSk7CisgIEVYUEVDVF9FUSgwLCBGWEFSR0JfUihjb2xvcikpOworICBFWFBFQ1RfRVEoMCwgRlhBUkdCX0coY29sb3IpKTsKKyAgRVhQRUNUX0VRKDAsIEZYQVJHQl9CKGNvbG9yKSk7CisKKyAgRVhQRUNUX1RSVUUoCisgICAgICBDRlhfQ1NTRGVjbGFyYXRpb246OlBhcnNlQ1NTQ29sb3IoTCJyZ2IoMTI4LDI1NSw0OCkiLCAxNSwgJmNvbG9yKSk7CisgIEVYUEVDVF9FUSgxMjgsIEZYQVJHQl9SKGNvbG9yKSk7CisgIEVYUEVDVF9FUSgyNTUsIEZYQVJHQl9HKGNvbG9yKSk7CisgIEVYUEVDVF9FUSg0OCwgRlhBUkdCX0IoY29sb3IpKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NlbnVtdmFsdWUuY3BwIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc2VudW12YWx1ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliMzliZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NlbnVtdmFsdWUuY3BwCkBAIC0wLDAgKzEsMTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NlbnVtdmFsdWUuaCIKKworQ0ZYX0NTU0VudW1WYWx1ZTo6Q0ZYX0NTU0VudW1WYWx1ZShDRlhfQ1NTUHJvcGVydHlWYWx1ZSB2YWx1ZSkKKyAgICA6IENGWF9DU1NWYWx1ZShDRlhfQ1NTUHJpbWl0aXZlVHlwZTo6RW51bSksIHZhbHVlXyh2YWx1ZSkge30KKworQ0ZYX0NTU0VudW1WYWx1ZTo6fkNGWF9DU1NFbnVtVmFsdWUoKSB7fQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jc3MvY2Z4X2Nzc2VudW12YWx1ZS5oIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc2VudW12YWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNmI4N2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzZW51bXZhbHVlLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NFTlVNVkFMVUVfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9DU1NfQ0ZYX0NTU0VOVU1WQUxVRV9IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3ZhbHVlLmgiCisKK2NsYXNzIENGWF9DU1NFbnVtVmFsdWUgOiBwdWJsaWMgQ0ZYX0NTU1ZhbHVlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENGWF9DU1NFbnVtVmFsdWUoQ0ZYX0NTU1Byb3BlcnR5VmFsdWUgdmFsdWUpOworICB+Q0ZYX0NTU0VudW1WYWx1ZSgpIG92ZXJyaWRlOworCisgIENGWF9DU1NQcm9wZXJ0eVZhbHVlIFZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisKKyBwcml2YXRlOgorICBDRlhfQ1NTUHJvcGVydHlWYWx1ZSB2YWx1ZV87Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NFTlVNVkFMVUVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NleHR0ZXh0YnVmLmNwcCBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NleHR0ZXh0YnVmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODdkYzJlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc2V4dHRleHRidWYuY3BwCkBAIC0wLDAgKzEsMTcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NleHR0ZXh0YnVmLmgiCisKK0NGWF9DU1NFeHRUZXh0QnVmOjpDRlhfQ1NTRXh0VGV4dEJ1ZigpCisgICAgOiBtX3BFeHRCdWZmZXIobnVsbHB0ciksIG1faURhdExlbigwKSwgbV9pRGF0UG9zKDApIHt9CisKK0NGWF9DU1NFeHRUZXh0QnVmOjp+Q0ZYX0NTU0V4dFRleHRCdWYoKSB7fQorCit2b2lkIENGWF9DU1NFeHRUZXh0QnVmOjpBdHRhY2hCdWZmZXIoY29uc3Qgd2NoYXJfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmTGVuKSB7CisgIG1fcEV4dEJ1ZmZlciA9IHBCdWZmZXI7CisgIG1faURhdExlbiA9IGlCdWZMZW47Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzZXh0dGV4dGJ1Zi5oIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc2V4dHRleHRidWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDJiOTFlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc2V4dHRleHRidWYuaApAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENSVF9DU1NfQ0ZYX0NTU0VYVFRFWFRCVUZfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9DU1NfQ0ZYX0NTU0VYVFRFWFRCVUZfSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisKK2NsYXNzIENGWF9DU1NFeHRUZXh0QnVmIHsKKyBwdWJsaWM6CisgIENGWF9DU1NFeHRUZXh0QnVmKCk7CisgIH5DRlhfQ1NTRXh0VGV4dEJ1ZigpOworCisgIHZvaWQgQXR0YWNoQnVmZmVyKGNvbnN0IHdjaGFyX3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1Zkxlbik7CisKKyAgYm9vbCBJc0VPRigpIGNvbnN0IHsgcmV0dXJuIG1faURhdFBvcyA+PSBtX2lEYXRMZW47IH0KKworICB3Y2hhcl90IEdldENoYXIoKSBjb25zdCB7IHJldHVybiBtX3BFeHRCdWZmZXJbbV9pRGF0UG9zXTsgfQorICB3Y2hhcl90IEdldE5leHRDaGFyKCkgY29uc3QgeworICAgIHJldHVybiAobV9pRGF0UG9zICsgMSA+PSBtX2lEYXRMZW4pID8gMCA6IG1fcEV4dEJ1ZmZlclttX2lEYXRQb3MgKyAxXTsKKyAgfQorCisgIHZvaWQgTW92ZU5leHQoKSB7IG1faURhdFBvcysrOyB9CisKKyBwcm90ZWN0ZWQ6CisgIGNvbnN0IHdjaGFyX3QqIG1fcEV4dEJ1ZmZlcjsKKyAgaW50MzJfdCBtX2lEYXRMZW47CisgIGludDMyX3QgbV9pRGF0UG9zOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0NTU19DRlhfQ1NTRVhUVEVYVEJVRl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jc3MvY2Z4X2Nzc251bWJlcnZhbHVlLmNwcCBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NudW1iZXJ2YWx1ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhmNzI0NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NudW1iZXJ2YWx1ZS5jcHAKQEAgLTAsMCArMSwzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc251bWJlcnZhbHVlLmgiCisKK0NGWF9DU1NOdW1iZXJWYWx1ZTo6Q0ZYX0NTU051bWJlclZhbHVlKENGWF9DU1NOdW1iZXJUeXBlIHR5cGUsIGZsb2F0IHZhbHVlKQorICAgIDogQ0ZYX0NTU1ZhbHVlKENGWF9DU1NQcmltaXRpdmVUeXBlOjpOdW1iZXIpLCB0eXBlXyh0eXBlKSwgdmFsdWVfKHZhbHVlKSB7CisgIGlmICh0eXBlXyA9PSBDRlhfQ1NTTnVtYmVyVHlwZTo6TnVtYmVyICYmIGZhYnModmFsdWVfKSA8IDAuMDAxZikKKyAgICB2YWx1ZV8gPSAwLjBmOworfQorCitDRlhfQ1NTTnVtYmVyVmFsdWU6On5DRlhfQ1NTTnVtYmVyVmFsdWUoKSB7fQorCitmbG9hdCBDRlhfQ1NTTnVtYmVyVmFsdWU6OkFwcGx5KGZsb2F0IHBlcmNlbnRCYXNlKSBjb25zdCB7CisgIHN3aXRjaCAodHlwZV8pIHsKKyAgICBjYXNlIENGWF9DU1NOdW1iZXJUeXBlOjpQaXhlbHM6CisgICAgY2FzZSBDRlhfQ1NTTnVtYmVyVHlwZTo6TnVtYmVyOgorICAgICAgcmV0dXJuIHZhbHVlXyAqIDcyIC8gOTY7CisgICAgY2FzZSBDRlhfQ1NTTnVtYmVyVHlwZTo6RU1TOgorICAgIGNhc2UgQ0ZYX0NTU051bWJlclR5cGU6OkVYUzoKKyAgICAgIHJldHVybiB2YWx1ZV8gKiBwZXJjZW50QmFzZTsKKyAgICBjYXNlIENGWF9DU1NOdW1iZXJUeXBlOjpQZXJjZW50OgorICAgICAgcmV0dXJuIHZhbHVlXyAqIHBlcmNlbnRCYXNlIC8gMTAwLjBmOworICAgIGNhc2UgQ0ZYX0NTU051bWJlclR5cGU6OkNlbnRpTWV0ZXJzOgorICAgICAgcmV0dXJuIHZhbHVlXyAqIDI4LjM0NjRmOworICAgIGNhc2UgQ0ZYX0NTU051bWJlclR5cGU6Ok1pbGxpTWV0ZXJzOgorICAgICAgcmV0dXJuIHZhbHVlXyAqIDIuODM0NmY7CisgICAgY2FzZSBDRlhfQ1NTTnVtYmVyVHlwZTo6SW5jaGVzOgorICAgICAgcmV0dXJuIHZhbHVlXyAqIDcyLjBmOworICAgIGNhc2UgQ0ZYX0NTU051bWJlclR5cGU6OlBpY2FzOgorICAgICAgcmV0dXJuIHZhbHVlXyAvIDEyLjBmOworICAgIGNhc2UgQ0ZYX0NTU051bWJlclR5cGU6OlBvaW50czoKKyAgICAgIHJldHVybiB2YWx1ZV87CisgIH0KKyAgcmV0dXJuIHZhbHVlXzsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NudW1iZXJ2YWx1ZS5oIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc251bWJlcnZhbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5MzI4ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NudW1iZXJ2YWx1ZS5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX0NTU19DRlhfQ1NTTlVNQkVSVkFMVUVfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9DU1NfQ0ZYX0NTU05VTUJFUlZBTFVFX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzdmFsdWUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorCitlbnVtIGNsYXNzIENGWF9DU1NOdW1iZXJUeXBlIHsKKyAgTnVtYmVyLAorICBQZXJjZW50LAorICBFTVMsCisgIEVYUywKKyAgUGl4ZWxzLAorICBDZW50aU1ldGVycywKKyAgTWlsbGlNZXRlcnMsCisgIEluY2hlcywKKyAgUG9pbnRzLAorICBQaWNhcywKK307CisKK2NsYXNzIENGWF9DU1NOdW1iZXJWYWx1ZSA6IHB1YmxpYyBDRlhfQ1NTVmFsdWUgeworIHB1YmxpYzoKKyAgQ0ZYX0NTU051bWJlclZhbHVlKENGWF9DU1NOdW1iZXJUeXBlIHR5cGUsIGZsb2F0IHZhbHVlKTsKKyAgfkNGWF9DU1NOdW1iZXJWYWx1ZSgpIG92ZXJyaWRlOworCisgIGZsb2F0IFZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9CisgIENGWF9DU1NOdW1iZXJUeXBlIEtpbmQoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQorCisgIGZsb2F0IEFwcGx5KGZsb2F0IHBlcmNlbnRCYXNlKSBjb25zdDsKKworIHByaXZhdGU6CisgIENGWF9DU1NOdW1iZXJUeXBlIHR5cGVfOworICBmbG9hdCB2YWx1ZV87Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NOVU1CRVJWQUxVRV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jc3MvY2Z4X2Nzc3Byb3BlcnR5aG9sZGVyLmNwcCBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3Nwcm9wZXJ0eWhvbGRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlMGQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3Nwcm9wZXJ0eWhvbGRlci5jcHAKQEAgLTAsMCArMSwxMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3Byb3BlcnR5aG9sZGVyLmgiCisKK0NGWF9DU1NQcm9wZXJ0eUhvbGRlcjo6Q0ZYX0NTU1Byb3BlcnR5SG9sZGVyKCkge30KKworQ0ZYX0NTU1Byb3BlcnR5SG9sZGVyOjp+Q0ZYX0NTU1Byb3BlcnR5SG9sZGVyKCkge30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3Nwcm9wZXJ0eWhvbGRlci5oIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc3Byb3BlcnR5aG9sZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3MWJkYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3Nwcm9wZXJ0eWhvbGRlci5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX0NTU19DRlhfQ1NTUFJPUEVSVFlIT0xERVJfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9DU1NfQ0ZYX0NTU1BST1BFUlRZSE9MREVSX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3ZhbHVlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisKK2NsYXNzIENGWF9DU1NQcm9wZXJ0eUhvbGRlciB7CisgcHVibGljOgorICBDRlhfQ1NTUHJvcGVydHlIb2xkZXIoKTsKKyAgfkNGWF9DU1NQcm9wZXJ0eUhvbGRlcigpOworCisgIENGWF9DU1NQcm9wZXJ0eSBlUHJvcGVydHk7CisgIGJvb2wgYkltcG9ydGFudDsKKyAgUmV0YWluUHRyPENGWF9DU1NWYWx1ZT4gcFZhbHVlOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0NTU19DRlhfQ1NTUFJPUEVSVFlIT0xERVJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NydWxlY29sbGVjdGlvbi5jcHAgYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzcnVsZWNvbGxlY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMzA1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzcnVsZWNvbGxlY3Rpb24uY3BwCkBAIC0wLDAgKzEsNTYgQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NydWxlY29sbGVjdGlvbi5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzZGVjbGFyYXRpb24uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc2VsZWN0b3IuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3R5bGVydWxlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3N0eWxlc2hlZXQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3ludGF4cGFyc2VyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCitDRlhfQ1NTUnVsZUNvbGxlY3Rpb246OkNGWF9DU1NSdWxlQ29sbGVjdGlvbigpIDogbV9pU2VsZWN0b3JzKDApIHt9CisKK0NGWF9DU1NSdWxlQ29sbGVjdGlvbjo6fkNGWF9DU1NSdWxlQ29sbGVjdGlvbigpIHsKKyAgQ2xlYXIoKTsKK30KKwordm9pZCBDRlhfQ1NTUnVsZUNvbGxlY3Rpb246OkNsZWFyKCkgeworICBtX1RhZ1J1bGVzLmNsZWFyKCk7CisgIG1faVNlbGVjdG9ycyA9IDA7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhfQ1NTUnVsZUNvbGxlY3Rpb246OkRhdGE+PioKK0NGWF9DU1NSdWxlQ29sbGVjdGlvbjo6R2V0VGFnUnVsZURhdGEoY29uc3QgV2lkZVN0cmluZyYgdGFnbmFtZSkgY29uc3QgeworICBhdXRvIGl0ID0gbV9UYWdSdWxlcy5maW5kKEZYX0hhc2hDb2RlX0dldFcodGFnbmFtZS5jX3N0cigpLCB0cnVlKSk7CisgIHJldHVybiBpdCAhPSBtX1RhZ1J1bGVzLmVuZCgpID8gJml0LT5zZWNvbmQgOiBudWxscHRyOworfQorCit2b2lkIENGWF9DU1NSdWxlQ29sbGVjdGlvbjo6QWRkUnVsZXNGcm9tKGNvbnN0IENGWF9DU1NTdHlsZVNoZWV0KiBzaGVldCkgeworICBpbnQzMl90IGlSdWxlcyA9IHNoZWV0LT5Db3VudFJ1bGVzKCk7CisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlSdWxlczsgaisrKQorICAgIEFkZFJ1bGVzRnJvbShzaGVldCwgc2hlZXQtPkdldFJ1bGUoaikpOworfQorCit2b2lkIENGWF9DU1NSdWxlQ29sbGVjdGlvbjo6QWRkUnVsZXNGcm9tKGNvbnN0IENGWF9DU1NTdHlsZVNoZWV0KiBwU3R5bGVTaGVldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NTU1N0eWxlUnVsZSogcFN0eWxlUnVsZSkgeworICBDRlhfQ1NTRGVjbGFyYXRpb24qIHBEZWNsYXJhdGlvbiA9IHBTdHlsZVJ1bGUtPkdldERlY2xhcmF0aW9uKCk7CisgIGludDMyX3QgaVNlbGVjdG9ycyA9IHBTdHlsZVJ1bGUtPkNvdW50U2VsZWN0b3JMaXN0cygpOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2VsZWN0b3JzOyArK2kpIHsKKyAgICBDRlhfQ1NTU2VsZWN0b3IqIHBTZWxlY3RvciA9IHBTdHlsZVJ1bGUtPkdldFNlbGVjdG9yTGlzdChpKTsKKyAgICBtX1RhZ1J1bGVzW3BTZWxlY3Rvci0+R2V0TmFtZUhhc2goKV0ucHVzaF9iYWNrKAorICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8RGF0YT4ocFNlbGVjdG9yLCBwRGVjbGFyYXRpb24pKTsKKyAgICBtX2lTZWxlY3RvcnMrKzsKKyAgfQorfQorCitDRlhfQ1NTUnVsZUNvbGxlY3Rpb246OkRhdGE6OkRhdGEoQ0ZYX0NTU1NlbGVjdG9yKiBwU2VsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DU1NEZWNsYXJhdGlvbiogcERlY2wpCisgICAgOiBwU2VsZWN0b3IocFNlbCksIHBEZWNsYXJhdGlvbihwRGVjbCkge30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NydWxlY29sbGVjdGlvbi5oIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc3J1bGVjb2xsZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJhZTU4YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NydWxlY29sbGVjdGlvbi5oCkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX0NTU19DRlhfQ1NTUlVMRUNPTExFQ1RJT05fSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9DU1NfQ0ZYX0NTU1JVTEVDT0xMRUNUSU9OX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisKK2NsYXNzIENGWF9DU1NEZWNsYXJhdGlvbjsKK2NsYXNzIENGWF9DU1NTZWxlY3RvcjsKK2NsYXNzIENGWF9DU1NTdHlsZVJ1bGU7CitjbGFzcyBDRlhfQ1NTU3R5bGVTaGVldDsKKworY2xhc3MgQ0ZYX0NTU1J1bGVDb2xsZWN0aW9uIHsKKyBwdWJsaWM6CisgIGNsYXNzIERhdGEgeworICAgcHVibGljOgorICAgIERhdGEoQ0ZYX0NTU1NlbGVjdG9yKiBwU2VsLCBDRlhfQ1NTRGVjbGFyYXRpb24qIHBEZWNsKTsKKworICAgIENGWF9DU1NTZWxlY3RvciogY29uc3QgcFNlbGVjdG9yOworICAgIENGWF9DU1NEZWNsYXJhdGlvbiogY29uc3QgcERlY2xhcmF0aW9uOworICB9OworCisgIENGWF9DU1NSdWxlQ29sbGVjdGlvbigpOworICB+Q0ZYX0NTU1J1bGVDb2xsZWN0aW9uKCk7CisKKyAgdm9pZCBBZGRSdWxlc0Zyb20oY29uc3QgQ0ZYX0NTU1N0eWxlU2hlZXQqIHNoZWV0KTsKKyAgdm9pZCBDbGVhcigpOworICBpbnQzMl90IENvdW50U2VsZWN0b3JzKCkgY29uc3QgeyByZXR1cm4gbV9pU2VsZWN0b3JzOyB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPERhdGE+PiogR2V0VGFnUnVsZURhdGEoCisgICAgICBjb25zdCBXaWRlU3RyaW5nJiB0YWduYW1lKSBjb25zdDsKKworIHByaXZhdGU6CisgIHZvaWQgQWRkUnVsZXNGcm9tKGNvbnN0IENGWF9DU1NTdHlsZVNoZWV0KiBwU3R5bGVTaGVldCwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX0NTU1N0eWxlUnVsZSogcFJ1bGUpOworCisgIHN0ZDo6bWFwPHVpbnQzMl90LCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RGF0YT4+PiBtX1RhZ1J1bGVzOworICBpbnQzMl90IG1faVNlbGVjdG9yczsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWENSVF9DU1NfQ0ZYX0NTU1JVTEVDT0xMRUNUSU9OX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc2VsZWN0b3IuY3BwIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc3NlbGVjdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTkzZGNhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc3NlbGVjdG9yLmNwcApAQCAtMCwwICsxLDg3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc2VsZWN0b3IuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworaW50MzJfdCBHZXRDU1NOYW1lTGVuKGNvbnN0IHdjaGFyX3QqIHBzeiwgY29uc3Qgd2NoYXJfdCogcEVuZCkgeworICBjb25zdCB3Y2hhcl90KiBwU3RhcnQgPSBwc3o7CisgIHdoaWxlIChwc3ogPCBwRW5kKSB7CisgICAgd2NoYXJfdCB3Y2ggPSAqcHN6OworICAgIGlmICghRlhTWVNfaXN3YWxudW0od2NoKSAmJiB3Y2ggIT0gJ18nICYmIHdjaCAhPSAnLScpCisgICAgICBicmVhazsKKyAgICArK3BzejsKKyAgfQorICByZXR1cm4gcHN6IC0gcFN0YXJ0OworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQ0ZYX0NTU1NlbGVjdG9yOjpDRlhfQ1NTU2VsZWN0b3IoQ0ZYX0NTU1NlbGVjdG9yVHlwZSBlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHBzeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYklnbm9yZUNhc2UpCisgICAgOiBtX2VUeXBlKGVUeXBlKSwKKyAgICAgIG1fZHdIYXNoKEZYX0hhc2hDb2RlX0dldFcoV2lkZVN0cmluZ1ZpZXcocHN6LCBpTGVuKSwgYklnbm9yZUNhc2UpKSB7fQorCitDRlhfQ1NTU2VsZWN0b3I6On5DRlhfQ1NTU2VsZWN0b3IoKSB7fQorCitDRlhfQ1NTU2VsZWN0b3JUeXBlIENGWF9DU1NTZWxlY3Rvcjo6R2V0VHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fZVR5cGU7Cit9CisKK3VpbnQzMl90IENGWF9DU1NTZWxlY3Rvcjo6R2V0TmFtZUhhc2goKSBjb25zdCB7CisgIHJldHVybiBtX2R3SGFzaDsKK30KKworQ0ZYX0NTU1NlbGVjdG9yKiBDRlhfQ1NTU2VsZWN0b3I6OkdldE5leHRTZWxlY3RvcigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcE5leHQuZ2V0KCk7Cit9CisKKy8vIHN0YXRpYy4KK3N0ZDo6dW5pcXVlX3B0cjxDRlhfQ1NTU2VsZWN0b3I+IENGWF9DU1NTZWxlY3Rvcjo6RnJvbVN0cmluZygKKyAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgc3RyKSB7CisgIEFTU0VSVCghc3RyLklzRW1wdHkoKSk7CisKKyAgY29uc3Qgd2NoYXJfdCogcHN6ID0gc3RyLnVudGVybWluYXRlZF9jX3N0cigpOworICBjb25zdCB3Y2hhcl90KiBwU3RhcnQgPSBwc3o7CisgIGNvbnN0IHdjaGFyX3QqIHBFbmQgPSBwc3ogKyBzdHIuR2V0TGVuZ3RoKCk7CisgIGZvciAoOyBwc3ogPCBwRW5kOyArK3BzeikgeworICAgIHN3aXRjaCAoKnBzeikgeworICAgICAgY2FzZSAnPic6CisgICAgICBjYXNlICdbJzoKKyAgICAgIGNhc2UgJysnOgorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0NTU1NlbGVjdG9yPiBwRmlyc3QgPSBudWxscHRyOworICBmb3IgKHBzeiA9IHBTdGFydDsgcHN6IDwgcEVuZDspIHsKKyAgICB3Y2hhcl90IHdjaCA9ICpwc3o7CisgICAgaWYgKEZYU1lTX2lzd2FscGhhKHdjaCkgfHwgd2NoID09ICcqJykgeworICAgICAgaW50MzJfdCBpTmFtZUxlbiA9IHdjaCA9PSAnKicgPyAxIDogR2V0Q1NTTmFtZUxlbihwc3osIHBFbmQpOworICAgICAgYXV0byBwID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9DU1NTZWxlY3Rvcj4oQ0ZYX0NTU1NlbGVjdG9yVHlwZTo6RWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzeiwgaU5hbWVMZW4sIHRydWUpOworICAgICAgaWYgKHBGaXJzdCkgeworICAgICAgICBwRmlyc3QtPlNldFR5cGUoQ0ZYX0NTU1NlbGVjdG9yVHlwZTo6RGVzY2VuZGFudCk7CisgICAgICAgIHAtPlNldE5leHQoc3RkOjptb3ZlKHBGaXJzdCkpOworICAgICAgfQorICAgICAgcEZpcnN0ID0gc3RkOjptb3ZlKHApOworICAgICAgcHN6ICs9IGlOYW1lTGVuOworICAgIH0gZWxzZSBpZiAod2NoID09ICcgJykgeworICAgICAgcHN6Kys7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgfQorICByZXR1cm4gcEZpcnN0OworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jc3MvY2Z4X2Nzc3NlbGVjdG9yLmggYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc2VsZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmY4YjE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc3NlbGVjdG9yLmgKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NTRUxFQ1RPUl9IXworI2RlZmluZSBDT1JFX0ZYQ1JUX0NTU19DRlhfQ1NTU0VMRUNUT1JfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzcy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisKK2NsYXNzIENGWF9DU1NTZWxlY3RvciB7CisgcHVibGljOgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPENGWF9DU1NTZWxlY3Rvcj4gRnJvbVN0cmluZyhjb25zdCBXaWRlU3RyaW5nVmlldyYgc3RyKTsKKworICBDRlhfQ1NTU2VsZWN0b3IoQ0ZYX0NTU1NlbGVjdG9yVHlwZSBlVHlwZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHBzeiwKKyAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbiwKKyAgICAgICAgICAgICAgICAgIGJvb2wgYklnbm9yZUNhc2UpOworICB+Q0ZYX0NTU1NlbGVjdG9yKCk7CisKKyAgQ0ZYX0NTU1NlbGVjdG9yVHlwZSBHZXRUeXBlKCkgY29uc3Q7CisgIHVpbnQzMl90IEdldE5hbWVIYXNoKCkgY29uc3Q7CisgIENGWF9DU1NTZWxlY3RvciogR2V0TmV4dFNlbGVjdG9yKCkgY29uc3Q7CisKKyAgdm9pZCBTZXROZXh0KHN0ZDo6dW5pcXVlX3B0cjxDRlhfQ1NTU2VsZWN0b3I+IHBOZXh0KSB7CisgICAgbV9wTmV4dCA9IHN0ZDo6bW92ZShwTmV4dCk7CisgIH0KKworIHByaXZhdGU6CisgIHZvaWQgU2V0VHlwZShDRlhfQ1NTU2VsZWN0b3JUeXBlIGVUeXBlKSB7IG1fZVR5cGUgPSBlVHlwZTsgfQorCisgIENGWF9DU1NTZWxlY3RvclR5cGUgbV9lVHlwZTsKKyAgdWludDMyX3QgbV9kd0hhc2g7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfQ1NTU2VsZWN0b3I+IG1fcE5leHQ7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NTRUxFQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jc3MvY2Z4X2Nzc3N0cmluZ3ZhbHVlLmNwcCBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHJpbmd2YWx1ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmMmEzMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHJpbmd2YWx1ZS5jcHAKQEAgLTAsMCArMSwxMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3N0cmluZ3ZhbHVlLmgiCisKK0NGWF9DU1NTdHJpbmdWYWx1ZTo6Q0ZYX0NTU1N0cmluZ1ZhbHVlKGNvbnN0IFdpZGVTdHJpbmcmIHZhbHVlKQorICAgIDogQ0ZYX0NTU1ZhbHVlKENGWF9DU1NQcmltaXRpdmVUeXBlOjpTdHJpbmcpLCB2YWx1ZV8odmFsdWUpIHt9CisKK0NGWF9DU1NTdHJpbmdWYWx1ZTo6fkNGWF9DU1NTdHJpbmdWYWx1ZSgpIHt9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3RyaW5ndmFsdWUuaCBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHJpbmd2YWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MjA3OGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3RyaW5ndmFsdWUuaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENSVF9DU1NfQ0ZYX0NTU1NUUklOR1ZBTFVFX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NTVFJJTkdWQUxVRV9IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3ZhbHVlLmgiCisKK2NsYXNzIENGWF9DU1NTdHJpbmdWYWx1ZSA6IHB1YmxpYyBDRlhfQ1NTVmFsdWUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0ZYX0NTU1N0cmluZ1ZhbHVlKGNvbnN0IFdpZGVTdHJpbmcmIHZhbHVlKTsKKyAgfkNGWF9DU1NTdHJpbmdWYWx1ZSgpIG92ZXJyaWRlOworCisgIGNvbnN0IFdpZGVTdHJpbmcgVmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KKworIHByaXZhdGU6CisgIGNvbnN0IFdpZGVTdHJpbmcgdmFsdWVfOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0NTU19DRlhfQ1NTU1RSSU5HVkFMVUVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHlsZXJ1bGUuY3BwIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc3N0eWxlcnVsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA0NzcxZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHlsZXJ1bGUuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHlsZXJ1bGUuaCIKKworQ0ZYX0NTU1N0eWxlUnVsZTo6Q0ZYX0NTU1N0eWxlUnVsZSgpIHt9CisKK0NGWF9DU1NTdHlsZVJ1bGU6On5DRlhfQ1NTU3R5bGVSdWxlKCkge30KKworc2l6ZV90IENGWF9DU1NTdHlsZVJ1bGU6OkNvdW50U2VsZWN0b3JMaXN0cygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcHBTZWxlY3Rvci5zaXplKCk7Cit9CisKK0NGWF9DU1NTZWxlY3RvciogQ0ZYX0NTU1N0eWxlUnVsZTo6R2V0U2VsZWN0b3JMaXN0KGludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcHBTZWxlY3RvcltpbmRleF0uZ2V0KCk7Cit9CisKK0NGWF9DU1NEZWNsYXJhdGlvbiogQ0ZYX0NTU1N0eWxlUnVsZTo6R2V0RGVjbGFyYXRpb24oKSB7CisgIHJldHVybiAmbV9EZWNsYXJhdGlvbjsKK30KKwordm9pZCBDRlhfQ1NTU3R5bGVSdWxlOjpTZXRTZWxlY3RvcigKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0NTU1NlbGVjdG9yPj4qIGxpc3QpIHsKKyAgQVNTRVJUKG1fcHBTZWxlY3Rvci5lbXB0eSgpKTsKKworICBtX3BwU2VsZWN0b3Iuc3dhcCgqbGlzdCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3R5bGVydWxlLmggYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3R5bGVydWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhMWZjNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHlsZXJ1bGUuaApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENSVF9DU1NfQ0ZYX0NTU1NUWUxFUlVMRV9IXworI2RlZmluZSBDT1JFX0ZYQ1JUX0NTU19DRlhfQ1NTU1RZTEVSVUxFX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc2RlY2xhcmF0aW9uLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3NlbGVjdG9yLmgiCisKK2NsYXNzIENGWF9DU1NTdHlsZVJ1bGUgeworIHB1YmxpYzoKKyAgQ0ZYX0NTU1N0eWxlUnVsZSgpOworICB+Q0ZYX0NTU1N0eWxlUnVsZSgpOworCisgIHNpemVfdCBDb3VudFNlbGVjdG9yTGlzdHMoKSBjb25zdDsKKyAgQ0ZYX0NTU1NlbGVjdG9yKiBHZXRTZWxlY3Rvckxpc3QoaW50MzJfdCBpbmRleCkgY29uc3Q7CisgIENGWF9DU1NEZWNsYXJhdGlvbiogR2V0RGVjbGFyYXRpb24oKTsKKworICB2b2lkIFNldFNlbGVjdG9yKHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhfQ1NTU2VsZWN0b3I+PiogbGlzdCk7CisKKyBwcml2YXRlOgorICBDRlhfQ1NTRGVjbGFyYXRpb24gbV9EZWNsYXJhdGlvbjsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWF9DU1NTZWxlY3Rvcj4+IG1fcHBTZWxlY3RvcjsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWENSVF9DU1NfQ0ZYX0NTU1NUWUxFUlVMRV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jc3MvY2Z4X2Nzc3N0eWxlc2VsZWN0b3IuY3BwIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc3N0eWxlc2VsZWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiOWFiMmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3R5bGVzZWxlY3Rvci5jcHAKQEAgLTAsMCArMSw1OTcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHlsZXNlbGVjdG9yLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3Njb2xvcnZhbHVlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc2NvbXB1dGVkc3R5bGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzY3VzdG9tcHJvcGVydHkuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzZGVjbGFyYXRpb24uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzZW51bXZhbHVlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3Byb3BlcnR5aG9sZGVyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3NlbGVjdG9yLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3N0eWxlc2hlZXQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3ludGF4cGFyc2VyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3ZhbHVlbGlzdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworQ0ZYX0NTU1N0eWxlU2VsZWN0b3I6OkNGWF9DU1NTdHlsZVNlbGVjdG9yKCkgOiBtX2ZEZWZGb250U2l6ZSgxMi4wZikge30KKworQ0ZYX0NTU1N0eWxlU2VsZWN0b3I6On5DRlhfQ1NTU3R5bGVTZWxlY3RvcigpIHt9CisKK3ZvaWQgQ0ZYX0NTU1N0eWxlU2VsZWN0b3I6OlNldERlZkZvbnRTaXplKGZsb2F0IGZGb250U2l6ZSkgeworICBBU1NFUlQoZkZvbnRTaXplID4gMCk7CisgIG1fZkRlZkZvbnRTaXplID0gZkZvbnRTaXplOworfQorCitSZXRhaW5QdHI8Q0ZYX0NTU0NvbXB1dGVkU3R5bGU+IENGWF9DU1NTdHlsZVNlbGVjdG9yOjpDcmVhdGVDb21wdXRlZFN0eWxlKAorICAgIENGWF9DU1NDb21wdXRlZFN0eWxlKiBwUGFyZW50U3R5bGUpIHsKKyAgYXV0byBwU3R5bGUgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0NTU0NvbXB1dGVkU3R5bGU+KCk7CisgIGlmIChwUGFyZW50U3R5bGUpCisgICAgcFN0eWxlLT5tX0luaGVyaXRlZERhdGEgPSBwUGFyZW50U3R5bGUtPm1fSW5oZXJpdGVkRGF0YTsKKyAgcmV0dXJuIHBTdHlsZTsKK30KKwordm9pZCBDRlhfQ1NTU3R5bGVTZWxlY3Rvcjo6U2V0VUFTdHlsZVNoZWV0KAorICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfQ1NTU3R5bGVTaGVldD4gcFNoZWV0KSB7CisgIG1fVUFTdHlsZXMgPSBzdGQ6Om1vdmUocFNoZWV0KTsKK30KKwordm9pZCBDRlhfQ1NTU3R5bGVTZWxlY3Rvcjo6VXBkYXRlU3R5bGVJbmRleCgpIHsKKyAgbV9VQVJ1bGVzLkNsZWFyKCk7CisgIG1fVUFSdWxlcy5BZGRSdWxlc0Zyb20obV9VQVN0eWxlcy5nZXQoKSk7Cit9CisKK3N0ZDo6dmVjdG9yPGNvbnN0IENGWF9DU1NEZWNsYXJhdGlvbio+IENGWF9DU1NTdHlsZVNlbGVjdG9yOjpNYXRjaERlY2xhcmF0aW9ucygKKyAgICBjb25zdCBXaWRlU3RyaW5nJiB0YWduYW1lKSB7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IENGWF9DU1NEZWNsYXJhdGlvbio+IG1hdGNoZWREZWNsczsKKyAgaWYgKG1fVUFSdWxlcy5Db3VudFNlbGVjdG9ycygpID09IDAgfHwgdGFnbmFtZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIG1hdGNoZWREZWNsczsKKworICBhdXRvKiBydWxlcyA9IG1fVUFSdWxlcy5HZXRUYWdSdWxlRGF0YSh0YWduYW1lKTsKKyAgaWYgKCFydWxlcykKKyAgICByZXR1cm4gbWF0Y2hlZERlY2xzOworCisgIGZvciAoY29uc3QgYXV0byYgZCA6ICpydWxlcykgeworICAgIGlmIChNYXRjaFNlbGVjdG9yKHRhZ25hbWUsIGQtPnBTZWxlY3RvcikpCisgICAgICBtYXRjaGVkRGVjbHMucHVzaF9iYWNrKGQtPnBEZWNsYXJhdGlvbik7CisgIH0KKyAgcmV0dXJuIG1hdGNoZWREZWNsczsKK30KKworYm9vbCBDRlhfQ1NTU3R5bGVTZWxlY3Rvcjo6TWF0Y2hTZWxlY3Rvcihjb25zdCBXaWRlU3RyaW5nJiB0YWduYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQ1NTU2VsZWN0b3IqIHBTZWwpIHsKKyAgLy8gVE9ETyhkc2luY2xhaXIpOiBUaGUgY29kZSBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIGxldmVsIG9mIHNlbGVjdG9yIGF0IHRoaXMKKyAgLy8gcG9pbnQuIE5vbmUgb2YgdGhlIGNvZGUgdXNpbmcgc2VsZWN0b3JzIHJlcXVpcmVkIHRoZSBjb21wbGV4aXR5IHNvIGxldHMKKyAgLy8ganVzdCBzYXkgd2UgZG9uJ3Qgc3VwcG9ydCB0aGVtIHRvIHNpbXBsaWZ5IHRoZSBjb2RlIGZvciBub3cuCisgIGlmICghcFNlbCB8fCBwU2VsLT5HZXROZXh0U2VsZWN0b3IoKSB8fAorICAgICAgcFNlbC0+R2V0VHlwZSgpID09IENGWF9DU1NTZWxlY3RvclR5cGU6OkRlc2NlbmRhbnQpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHBTZWwtPkdldE5hbWVIYXNoKCkgPT0gRlhfSGFzaENvZGVfR2V0Vyh0YWduYW1lLmNfc3RyKCksIHRydWUpOworfQorCit2b2lkIENGWF9DU1NTdHlsZVNlbGVjdG9yOjpDb21wdXRlU3R5bGUoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgQ0ZYX0NTU0RlY2xhcmF0aW9uKj4mIGRlY2xBcnJheSwKKyAgICBjb25zdCBXaWRlU3RyaW5nJiBzdHlsZVN0cmluZywKKyAgICBjb25zdCBXaWRlU3RyaW5nJiBhbGlnblN0cmluZywKKyAgICBDRlhfQ1NTQ29tcHV0ZWRTdHlsZSogcERlc3QpIHsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWF9DU1NEZWNsYXJhdGlvbj4gcERlY2w7CisgIGlmICghc3R5bGVTdHJpbmcuSXNFbXB0eSgpIHx8ICFhbGlnblN0cmluZy5Jc0VtcHR5KCkpIHsKKyAgICBwRGVjbCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfQ1NTRGVjbGFyYXRpb24+KCk7CisKKyAgICBpZiAoIXN0eWxlU3RyaW5nLklzRW1wdHkoKSkKKyAgICAgIEFwcGVuZElubGluZVN0eWxlKHBEZWNsLmdldCgpLCBzdHlsZVN0cmluZyk7CisgICAgaWYgKCFhbGlnblN0cmluZy5Jc0VtcHR5KCkpIHsKKyAgICAgIHBEZWNsLT5BZGRQcm9wZXJ0eShDRlhfR2V0Q1NTUHJvcGVydHlCeUVudW0oQ0ZYX0NTU1Byb3BlcnR5OjpUZXh0QWxpZ24pLAorICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduU3RyaW5nLkFzU3RyaW5nVmlldygpKTsKKyAgICB9CisgIH0KKyAgQXBwbHlEZWNsYXJhdGlvbnMoZGVjbEFycmF5LCBwRGVjbC5nZXQoKSwgcERlc3QpOworfQorCit2b2lkIENGWF9DU1NTdHlsZVNlbGVjdG9yOjpBcHBseURlY2xhcmF0aW9ucygKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBDRlhfQ1NTRGVjbGFyYXRpb24qPiYgZGVjbEFycmF5LAorICAgIGNvbnN0IENGWF9DU1NEZWNsYXJhdGlvbiogZXh0cmFEZWNsLAorICAgIENGWF9DU1NDb21wdXRlZFN0eWxlKiBwQ29tcHV0ZWRTdHlsZSkgeworICBzdGQ6OnZlY3Rvcjxjb25zdCBDRlhfQ1NTUHJvcGVydHlIb2xkZXIqPiBpbXBvcnRhbnRzOworICBzdGQ6OnZlY3Rvcjxjb25zdCBDRlhfQ1NTUHJvcGVydHlIb2xkZXIqPiBub3JtYWxzOworICBzdGQ6OnZlY3Rvcjxjb25zdCBDRlhfQ1NTQ3VzdG9tUHJvcGVydHkqPiBjdXN0b21zOworCisgIGZvciAoYXV0byogZGVjbCA6IGRlY2xBcnJheSkKKyAgICBFeHRyYWN0VmFsdWVzKGRlY2wsICZpbXBvcnRhbnRzLCAmbm9ybWFscywgJmN1c3RvbXMpOworCisgIGlmIChleHRyYURlY2wpCisgICAgRXh0cmFjdFZhbHVlcyhleHRyYURlY2wsICZpbXBvcnRhbnRzLCAmbm9ybWFscywgJmN1c3RvbXMpOworCisgIGZvciAoYXV0byogcHJvcCA6IG5vcm1hbHMpCisgICAgQXBwbHlQcm9wZXJ0eShwcm9wLT5lUHJvcGVydHksIHByb3AtPnBWYWx1ZSwgcENvbXB1dGVkU3R5bGUpOworCisgIGZvciAoYXV0byogcHJvcCA6IGN1c3RvbXMpCisgICAgcENvbXB1dGVkU3R5bGUtPkFkZEN1c3RvbVN0eWxlKCpwcm9wKTsKKworICBmb3IgKGF1dG8qIHByb3AgOiBpbXBvcnRhbnRzKQorICAgIEFwcGx5UHJvcGVydHkocHJvcC0+ZVByb3BlcnR5LCBwcm9wLT5wVmFsdWUsIHBDb21wdXRlZFN0eWxlKTsKK30KKwordm9pZCBDRlhfQ1NTU3R5bGVTZWxlY3Rvcjo6RXh0cmFjdFZhbHVlcygKKyAgICBjb25zdCBDRlhfQ1NTRGVjbGFyYXRpb24qIGRlY2wsCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgQ0ZYX0NTU1Byb3BlcnR5SG9sZGVyKj4qIGltcG9ydGFudHMsCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgQ0ZYX0NTU1Byb3BlcnR5SG9sZGVyKj4qIG5vcm1hbHMsCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgQ0ZYX0NTU0N1c3RvbVByb3BlcnR5Kj4qIGN1c3RvbSkgeworICBmb3IgKGNvbnN0IGF1dG8mIGhvbGRlciA6ICpkZWNsKSB7CisgICAgaWYgKGhvbGRlci0+YkltcG9ydGFudCkKKyAgICAgIGltcG9ydGFudHMtPnB1c2hfYmFjayhob2xkZXIuZ2V0KCkpOworICAgIGVsc2UKKyAgICAgIG5vcm1hbHMtPnB1c2hfYmFjayhob2xkZXIuZ2V0KCkpOworICB9CisgIGZvciAoYXV0byBpdCA9IGRlY2wtPmN1c3RvbV9iZWdpbigpOyBpdCAhPSBkZWNsLT5jdXN0b21fZW5kKCk7IGl0KyspCisgICAgY3VzdG9tLT5wdXNoX2JhY2soaXQtPmdldCgpKTsKK30KKwordm9pZCBDRlhfQ1NTU3R5bGVTZWxlY3Rvcjo6QXBwZW5kSW5saW5lU3R5bGUoQ0ZYX0NTU0RlY2xhcmF0aW9uKiBwRGVjbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHN0eWxlKSB7CisgIEFTU0VSVChwRGVjbCAmJiAhc3R5bGUuSXNFbXB0eSgpKTsKKworICBhdXRvIHBTeW50YXggPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0NTU1N5bnRheFBhcnNlcj4oCisgICAgICBzdHlsZS5jX3N0cigpLCBzdHlsZS5HZXRMZW5ndGgoKSwgMzIsIHRydWUpOworICBpbnQzMl90IGlMZW4yID0gMDsKKyAgY29uc3QgQ0ZYX0NTU1Byb3BlcnR5VGFibGUqIHRhYmxlID0gbnVsbHB0cjsKKyAgV2lkZVN0cmluZyB3c05hbWU7CisgIHdoaWxlICgxKSB7CisgICAgQ0ZYX0NTU1N5bnRheFN0YXR1cyBlU3RhdHVzID0gcFN5bnRheC0+RG9TeW50YXhQYXJzZSgpOworICAgIGlmIChlU3RhdHVzID09IENGWF9DU1NTeW50YXhTdGF0dXM6OlByb3BlcnR5TmFtZSkgeworICAgICAgV2lkZVN0cmluZ1ZpZXcgc3RyVmFsdWUgPSBwU3ludGF4LT5HZXRDdXJyZW50U3RyaW5nKCk7CisgICAgICB0YWJsZSA9IENGWF9HZXRDU1NQcm9wZXJ0eUJ5TmFtZShzdHJWYWx1ZSk7CisgICAgICBpZiAoIXRhYmxlKQorICAgICAgICB3c05hbWUgPSBXaWRlU3RyaW5nKHN0clZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGVTdGF0dXMgPT0gQ0ZYX0NTU1N5bnRheFN0YXR1czo6UHJvcGVydHlWYWx1ZSkgeworICAgICAgaWYgKHRhYmxlIHx8IGlMZW4yID4gMCkgeworICAgICAgICBXaWRlU3RyaW5nVmlldyBzdHJWYWx1ZSA9IHBTeW50YXgtPkdldEN1cnJlbnRTdHJpbmcoKTsKKyAgICAgICAgaWYgKCFzdHJWYWx1ZS5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICBpZiAodGFibGUpCisgICAgICAgICAgICBwRGVjbC0+QWRkUHJvcGVydHkodGFibGUsIHN0clZhbHVlKTsKKyAgICAgICAgICBlbHNlIGlmIChpTGVuMiA+IDApCisgICAgICAgICAgICBwRGVjbC0+QWRkUHJvcGVydHkod3NOYW1lLCBXaWRlU3RyaW5nKHN0clZhbHVlKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ0ZYX0NTU1N0eWxlU2VsZWN0b3I6OkFwcGx5UHJvcGVydHkoQ0ZYX0NTU1Byb3BlcnR5IGVQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPENGWF9DU1NWYWx1ZT4mIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NTU0NvbXB1dGVkU3R5bGUqIHBDb21wdXRlZFN0eWxlKSB7CisgIGlmIChwVmFsdWUtPkdldFR5cGUoKSAhPSBDRlhfQ1NTUHJpbWl0aXZlVHlwZTo6TGlzdCkgeworICAgIENGWF9DU1NQcmltaXRpdmVUeXBlIGVUeXBlID0gcFZhbHVlLT5HZXRUeXBlKCk7CisgICAgc3dpdGNoIChlUHJvcGVydHkpIHsKKyAgICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5OjpEaXNwbGF5OgorICAgICAgICBpZiAoZVR5cGUgPT0gQ0ZYX0NTU1ByaW1pdGl2ZVR5cGU6OkVudW0pIHsKKyAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fZURpc3BsYXkgPQorICAgICAgICAgICAgICBUb0Rpc3BsYXkocFZhbHVlLkFzPENGWF9DU1NFbnVtVmFsdWU+KCktPlZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHk6OkZvbnRTaXplOiB7CisgICAgICAgIGZsb2F0JiBmRm9udFNpemUgPSBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplOworICAgICAgICBpZiAoZVR5cGUgPT0gQ0ZYX0NTU1ByaW1pdGl2ZVR5cGU6Ok51bWJlcikgeworICAgICAgICAgIGZGb250U2l6ZSA9IHBWYWx1ZS5BczxDRlhfQ1NTTnVtYmVyVmFsdWU+KCktPkFwcGx5KGZGb250U2l6ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gQ0ZYX0NTU1ByaW1pdGl2ZVR5cGU6OkVudW0pIHsKKyAgICAgICAgICBmRm9udFNpemUgPQorICAgICAgICAgICAgICBUb0ZvbnRTaXplKHBWYWx1ZS5BczxDRlhfQ1NTRW51bVZhbHVlPigpLT5WYWx1ZSgpLCBmRm9udFNpemUpOworICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHk6OkxpbmVIZWlnaHQ6CisgICAgICAgIGlmIChlVHlwZSA9PSBDRlhfQ1NTUHJpbWl0aXZlVHlwZTo6TnVtYmVyKSB7CisgICAgICAgICAgUmV0YWluUHRyPENGWF9DU1NOdW1iZXJWYWx1ZT4gdiA9IHBWYWx1ZS5BczxDRlhfQ1NTTnVtYmVyVmFsdWU+KCk7CisgICAgICAgICAgaWYgKHYtPktpbmQoKSA9PSBDRlhfQ1NTTnVtYmVyVHlwZTo6TnVtYmVyKSB7CisgICAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkxpbmVIZWlnaHQgPQorICAgICAgICAgICAgICAgIHYtPlZhbHVlKCkgKiBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkxpbmVIZWlnaHQgPQorICAgICAgICAgICAgICAgIHYtPkFwcGx5KHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9mRm9udFNpemUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5OjpUZXh0QWxpZ246CisgICAgICAgIGlmIChlVHlwZSA9PSBDRlhfQ1NTUHJpbWl0aXZlVHlwZTo6RW51bSkgeworICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9lVGV4dEFsaWduID0KKyAgICAgICAgICAgICAgVG9UZXh0QWxpZ24ocFZhbHVlLkFzPENGWF9DU1NFbnVtVmFsdWU+KCktPlZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHk6OlRleHRJbmRlbnQ6CisgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9UZXh0SW5kZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVHlwZSwgcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eTo6Rm9udFdlaWdodDoKKyAgICAgICAgaWYgKGVUeXBlID09IENGWF9DU1NQcmltaXRpdmVUeXBlOjpFbnVtKSB7CisgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX3dGb250V2VpZ2h0ID0KKyAgICAgICAgICAgICAgVG9Gb250V2VpZ2h0KHBWYWx1ZS5BczxDRlhfQ1NTRW51bVZhbHVlPigpLT5WYWx1ZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA9PSBDRlhfQ1NTUHJpbWl0aXZlVHlwZTo6TnVtYmVyKSB7CisgICAgICAgICAgaW50MzJfdCBpVmFsdWUgPQorICAgICAgICAgICAgICAoaW50MzJfdClwVmFsdWUuQXM8Q0ZYX0NTU051bWJlclZhbHVlPigpLT5WYWx1ZSgpIC8gMTAwOworICAgICAgICAgIGlmIChpVmFsdWUgPj0gMSAmJiBpVmFsdWUgPD0gOSkgeworICAgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX3dGb250V2VpZ2h0ID0gaVZhbHVlICogMTAwOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5OjpGb250U3R5bGU6CisgICAgICAgIGlmIChlVHlwZSA9PSBDRlhfQ1NTUHJpbWl0aXZlVHlwZTo6RW51bSkgeworICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9lRm9udFN0eWxlID0KKyAgICAgICAgICAgICAgVG9Gb250U3R5bGUocFZhbHVlLkFzPENGWF9DU1NFbnVtVmFsdWU+KCktPlZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHk6OkNvbG9yOgorICAgICAgICBpZiAoZVR5cGUgPT0gQ0ZYX0NTU1ByaW1pdGl2ZVR5cGU6OlJHQikgeworICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9kd0ZvbnRDb2xvciA9CisgICAgICAgICAgICAgIHBWYWx1ZS5BczxDRlhfQ1NTQ29sb3JWYWx1ZT4oKS0+VmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5OjpNYXJnaW5MZWZ0OgorICAgICAgICBpZiAoU2V0TGVuZ3RoV2l0aFBlcmNlbnQoCisgICAgICAgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX01hcmdpbldpZHRoLmxlZnQsIGVUeXBlLAorICAgICAgICAgICAgICAgIHBWYWx1ZSwgcENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX2ZGb250U2l6ZSkpIHsKKyAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fYkhhc01hcmdpbiA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eTo6TWFyZ2luVG9wOgorICAgICAgICBpZiAoU2V0TGVuZ3RoV2l0aFBlcmNlbnQoCisgICAgICAgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX01hcmdpbldpZHRoLnRvcCwgZVR5cGUsCisgICAgICAgICAgICAgICAgcFZhbHVlLCBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplKSkgeworICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEubV9iSGFzTWFyZ2luID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5OjpNYXJnaW5SaWdodDoKKyAgICAgICAgaWYgKFNldExlbmd0aFdpdGhQZXJjZW50KAorICAgICAgICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEubV9NYXJnaW5XaWR0aC5yaWdodCwgZVR5cGUsCisgICAgICAgICAgICAgICAgcFZhbHVlLCBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplKSkgeworICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEubV9iSGFzTWFyZ2luID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5OjpNYXJnaW5Cb3R0b206CisgICAgICAgIGlmIChTZXRMZW5ndGhXaXRoUGVyY2VudCgKKyAgICAgICAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fTWFyZ2luV2lkdGguYm90dG9tLCBlVHlwZSwKKyAgICAgICAgICAgICAgICBwVmFsdWUsIHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9mRm9udFNpemUpKSB7CisgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX2JIYXNNYXJnaW4gPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHk6OlBhZGRpbmdMZWZ0OgorICAgICAgICBpZiAoU2V0TGVuZ3RoV2l0aFBlcmNlbnQoCisgICAgICAgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX1BhZGRpbmdXaWR0aC5sZWZ0LCBlVHlwZSwKKyAgICAgICAgICAgICAgICBwVmFsdWUsIHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9mRm9udFNpemUpKSB7CisgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX2JIYXNQYWRkaW5nID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5OjpQYWRkaW5nVG9wOgorICAgICAgICBpZiAoU2V0TGVuZ3RoV2l0aFBlcmNlbnQoCisgICAgICAgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX1BhZGRpbmdXaWR0aC50b3AsIGVUeXBlLAorICAgICAgICAgICAgICAgIHBWYWx1ZSwgcENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX2ZGb250U2l6ZSkpIHsKKyAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fYkhhc1BhZGRpbmcgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHk6OlBhZGRpbmdSaWdodDoKKyAgICAgICAgaWYgKFNldExlbmd0aFdpdGhQZXJjZW50KAorICAgICAgICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEubV9QYWRkaW5nV2lkdGgucmlnaHQsIGVUeXBlLAorICAgICAgICAgICAgICAgIHBWYWx1ZSwgcENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX2ZGb250U2l6ZSkpIHsKKyAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fYkhhc1BhZGRpbmcgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHk6OlBhZGRpbmdCb3R0b206CisgICAgICAgIGlmIChTZXRMZW5ndGhXaXRoUGVyY2VudCgKKyAgICAgICAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fUGFkZGluZ1dpZHRoLmJvdHRvbSwgZVR5cGUsCisgICAgICAgICAgICAgICAgcFZhbHVlLCBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplKSkgeworICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEubV9iSGFzUGFkZGluZyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eTo6Qm9yZGVyTGVmdFdpZHRoOgorICAgICAgICBpZiAoU2V0TGVuZ3RoV2l0aFBlcmNlbnQoCisgICAgICAgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX0JvcmRlcldpZHRoLmxlZnQsIGVUeXBlLAorICAgICAgICAgICAgICAgIHBWYWx1ZSwgcENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX2ZGb250U2l6ZSkpIHsKKyAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fYkhhc0JvcmRlciA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eTo6Qm9yZGVyVG9wV2lkdGg6CisgICAgICAgIGlmIChTZXRMZW5ndGhXaXRoUGVyY2VudCgKKyAgICAgICAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fQm9yZGVyV2lkdGgudG9wLCBlVHlwZSwKKyAgICAgICAgICAgICAgICBwVmFsdWUsIHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9mRm9udFNpemUpKSB7CisgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX2JIYXNCb3JkZXIgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHk6OkJvcmRlclJpZ2h0V2lkdGg6CisgICAgICAgIGlmIChTZXRMZW5ndGhXaXRoUGVyY2VudCgKKyAgICAgICAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fQm9yZGVyV2lkdGgucmlnaHQsIGVUeXBlLAorICAgICAgICAgICAgICAgIHBWYWx1ZSwgcENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX2ZGb250U2l6ZSkpIHsKKyAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fYkhhc0JvcmRlciA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eTo6Qm9yZGVyQm90dG9tV2lkdGg6CisgICAgICAgIGlmIChTZXRMZW5ndGhXaXRoUGVyY2VudCgKKyAgICAgICAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fQm9yZGVyV2lkdGguYm90dG9tLCBlVHlwZSwKKyAgICAgICAgICAgICAgICBwVmFsdWUsIHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9mRm9udFNpemUpKSB7CisgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX2JIYXNCb3JkZXIgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHk6OlZlcnRpY2FsQWxpZ246CisgICAgICAgIGlmIChlVHlwZSA9PSBDRlhfQ1NTUHJpbWl0aXZlVHlwZTo6RW51bSkgeworICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEubV9lVmVydGljYWxBbGlnbiA9CisgICAgICAgICAgICAgIFRvVmVydGljYWxBbGlnbihwVmFsdWUuQXM8Q0ZYX0NTU0VudW1WYWx1ZT4oKS0+VmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gQ0ZYX0NTU1ByaW1pdGl2ZVR5cGU6Ok51bWJlcikgeworICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEubV9lVmVydGljYWxBbGlnbiA9CisgICAgICAgICAgICAgIENGWF9DU1NWZXJ0aWNhbEFsaWduOjpOdW1iZXI7CisgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX2ZWZXJ0aWNhbEFsaWduID0KKyAgICAgICAgICAgICAgcFZhbHVlLkFzPENGWF9DU1NOdW1iZXJWYWx1ZT4oKS0+QXBwbHkoCisgICAgICAgICAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5OjpGb250VmFyaWFudDoKKyAgICAgICAgaWYgKGVUeXBlID09IENGWF9DU1NQcmltaXRpdmVUeXBlOjpFbnVtKSB7CisgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX2VGb250VmFyaWFudCA9CisgICAgICAgICAgICAgIFRvRm9udFZhcmlhbnQocFZhbHVlLkFzPENGWF9DU1NFbnVtVmFsdWU+KCktPlZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHk6OkxldHRlclNwYWNpbmc6CisgICAgICAgIGlmIChlVHlwZSA9PSBDRlhfQ1NTUHJpbWl0aXZlVHlwZTo6RW51bSkgeworICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9MZXR0ZXJTcGFjaW5nLlNldCgKKyAgICAgICAgICAgICAgQ0ZYX0NTU0xlbmd0aFVuaXQ6Ok5vcm1hbCk7CisgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gQ0ZYX0NTU1ByaW1pdGl2ZVR5cGU6Ok51bWJlcikgeworICAgICAgICAgIGlmIChwVmFsdWUuQXM8Q0ZYX0NTU051bWJlclZhbHVlPigpLT5LaW5kKCkgPT0KKyAgICAgICAgICAgICAgQ0ZYX0NTU051bWJlclR5cGU6OlBlcmNlbnQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKworICAgICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9MZXR0ZXJTcGFjaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVUeXBlLCBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX2ZGb250U2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eTo6V29yZFNwYWNpbmc6CisgICAgICAgIGlmIChlVHlwZSA9PSBDRlhfQ1NTUHJpbWl0aXZlVHlwZTo6RW51bSkgeworICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9Xb3JkU3BhY2luZy5TZXQoCisgICAgICAgICAgICAgIENGWF9DU1NMZW5ndGhVbml0OjpOb3JtYWwpOworICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID09IENGWF9DU1NQcmltaXRpdmVUeXBlOjpOdW1iZXIpIHsKKyAgICAgICAgICBpZiAocFZhbHVlLkFzPENGWF9DU1NOdW1iZXJWYWx1ZT4oKS0+S2luZCgpID09CisgICAgICAgICAgICAgIENGWF9DU1NOdW1iZXJUeXBlOjpQZXJjZW50KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQocENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX1dvcmRTcGFjaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVUeXBlLCBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX2ZGb250U2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eTo6VG9wOgorICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fVG9wLCBlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eTo6Qm90dG9tOgorICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fQm90dG9tLCBlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eTo6TGVmdDoKKyAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQocENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX0xlZnQsIGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9mRm9udFNpemUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5OjpSaWdodDoKKyAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQocENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX1JpZ2h0LCBlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSBpZiAocFZhbHVlLT5HZXRUeXBlKCkgPT0gQ0ZYX0NTU1ByaW1pdGl2ZVR5cGU6Okxpc3QpIHsKKyAgICBSZXRhaW5QdHI8Q0ZYX0NTU1ZhbHVlTGlzdD4gcExpc3QgPSBwVmFsdWUuQXM8Q0ZYX0NTU1ZhbHVlTGlzdD4oKTsKKyAgICBpbnQzMl90IGlDb3VudCA9IHBMaXN0LT5Db3VudFZhbHVlcygpOworICAgIGlmIChpQ291bnQgPiAwKSB7CisgICAgICBzd2l0Y2ggKGVQcm9wZXJ0eSkgeworICAgICAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eTo6Rm9udEZhbWlseToKKyAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fcEZvbnRGYW1pbHkgPSBwTGlzdDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHk6OlRleHREZWNvcmF0aW9uOgorICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEubV9kd1RleHREZWNvcmF0aW9uID0KKyAgICAgICAgICAgICAgVG9UZXh0RGVjb3JhdGlvbihwTGlzdCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgfQorfQorCitDRlhfQ1NTRGlzcGxheSBDRlhfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9EaXNwbGF5KENGWF9DU1NQcm9wZXJ0eVZhbHVlIGVWYWx1ZSkgeworICBzd2l0Y2ggKGVWYWx1ZSkgeworICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5VmFsdWU6OkJsb2NrOgorICAgICAgcmV0dXJuIENGWF9DU1NEaXNwbGF5OjpCbG9jazsKKyAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpOb25lOgorICAgICAgcmV0dXJuIENGWF9DU1NEaXNwbGF5OjpOb25lOworICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5VmFsdWU6Okxpc3RJdGVtOgorICAgICAgcmV0dXJuIENGWF9DU1NEaXNwbGF5OjpMaXN0SXRlbTsKKyAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpJbmxpbmVUYWJsZToKKyAgICAgIHJldHVybiBDRlhfQ1NTRGlzcGxheTo6SW5saW5lVGFibGU7CisgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6SW5saW5lQmxvY2s6CisgICAgICByZXR1cm4gQ0ZYX0NTU0Rpc3BsYXk6OklubGluZUJsb2NrOworICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5VmFsdWU6OklubGluZToKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIENGWF9DU1NEaXNwbGF5OjpJbmxpbmU7CisgIH0KK30KKworQ0ZYX0NTU1RleHRBbGlnbiBDRlhfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9UZXh0QWxpZ24oCisgICAgQ0ZYX0NTU1Byb3BlcnR5VmFsdWUgZVZhbHVlKSB7CisgIHN3aXRjaCAoZVZhbHVlKSB7CisgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6Q2VudGVyOgorICAgICAgcmV0dXJuIENGWF9DU1NUZXh0QWxpZ246OkNlbnRlcjsKKyAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpSaWdodDoKKyAgICAgIHJldHVybiBDRlhfQ1NTVGV4dEFsaWduOjpSaWdodDsKKyAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpKdXN0aWZ5OgorICAgICAgcmV0dXJuIENGWF9DU1NUZXh0QWxpZ246Okp1c3RpZnk7CisgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6TGVmdDoKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIENGWF9DU1NUZXh0QWxpZ246OkxlZnQ7CisgIH0KK30KKwordWludDE2X3QgQ0ZYX0NTU1N0eWxlU2VsZWN0b3I6OlRvRm9udFdlaWdodChDRlhfQ1NTUHJvcGVydHlWYWx1ZSBlVmFsdWUpIHsKKyAgc3dpdGNoIChlVmFsdWUpIHsKKyAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpCb2xkOgorICAgICAgcmV0dXJuIDcwMDsKKyAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpCb2xkZXI6CisgICAgICByZXR1cm4gOTAwOworICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5VmFsdWU6OkxpZ2h0ZXI6CisgICAgICByZXR1cm4gMjAwOworICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5VmFsdWU6Ok5vcm1hbDoKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDQwMDsKKyAgfQorfQorCitDRlhfQ1NTRm9udFN0eWxlIENGWF9DU1NTdHlsZVNlbGVjdG9yOjpUb0ZvbnRTdHlsZSgKKyAgICBDRlhfQ1NTUHJvcGVydHlWYWx1ZSBlVmFsdWUpIHsKKyAgc3dpdGNoIChlVmFsdWUpIHsKKyAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpJdGFsaWM6CisgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6T2JsaXF1ZToKKyAgICAgIHJldHVybiBDRlhfQ1NTRm9udFN0eWxlOjpJdGFsaWM7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBDRlhfQ1NTRm9udFN0eWxlOjpOb3JtYWw7CisgIH0KK30KKworYm9vbCBDRlhfQ1NTU3R5bGVTZWxlY3Rvcjo6U2V0TGVuZ3RoV2l0aFBlcmNlbnQoCisgICAgQ0ZYX0NTU0xlbmd0aCYgd2lkdGgsCisgICAgQ0ZYX0NTU1ByaW1pdGl2ZVR5cGUgZVR5cGUsCisgICAgY29uc3QgUmV0YWluUHRyPENGWF9DU1NWYWx1ZT4mIHBWYWx1ZSwKKyAgICBmbG9hdCBmRm9udFNpemUpIHsKKyAgaWYgKGVUeXBlID09IENGWF9DU1NQcmltaXRpdmVUeXBlOjpOdW1iZXIpIHsKKyAgICBSZXRhaW5QdHI8Q0ZYX0NTU051bWJlclZhbHVlPiB2ID0gcFZhbHVlLkFzPENGWF9DU1NOdW1iZXJWYWx1ZT4oKTsKKyAgICBpZiAodi0+S2luZCgpID09IENGWF9DU1NOdW1iZXJUeXBlOjpQZXJjZW50KSB7CisgICAgICB3aWR0aC5TZXQoQ0ZYX0NTU0xlbmd0aFVuaXQ6OlBlcmNlbnQsCisgICAgICAgICAgICAgICAgcFZhbHVlLkFzPENGWF9DU1NOdW1iZXJWYWx1ZT4oKS0+VmFsdWUoKSAvIDEwMC4wZik7CisgICAgICByZXR1cm4gd2lkdGguTm9uWmVybygpOworICAgIH0KKworICAgIGZsb2F0IGZWYWx1ZSA9IHYtPkFwcGx5KGZGb250U2l6ZSk7CisgICAgd2lkdGguU2V0KENGWF9DU1NMZW5ndGhVbml0OjpQb2ludCwgZlZhbHVlKTsKKyAgICByZXR1cm4gd2lkdGguTm9uWmVybygpOworICB9IGVsc2UgaWYgKGVUeXBlID09IENGWF9DU1NQcmltaXRpdmVUeXBlOjpFbnVtKSB7CisgICAgc3dpdGNoIChwVmFsdWUuQXM8Q0ZYX0NTU0VudW1WYWx1ZT4oKS0+VmFsdWUoKSkgeworICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6QXV0bzoKKyAgICAgICAgd2lkdGguU2V0KENGWF9DU1NMZW5ndGhVbml0OjpBdXRvKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpOb25lOgorICAgICAgICB3aWR0aC5TZXQoQ0ZYX0NTU0xlbmd0aFVuaXQ6Ok5vbmUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5VmFsdWU6OlRoaW46CisgICAgICAgIHdpZHRoLlNldChDRlhfQ1NTTGVuZ3RoVW5pdDo6UG9pbnQsIDIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5VmFsdWU6Ok1lZGl1bToKKyAgICAgICAgd2lkdGguU2V0KENGWF9DU1NMZW5ndGhVbml0OjpQb2ludCwgMyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6VGhpY2s6CisgICAgICAgIHdpZHRoLlNldChDRlhfQ1NTTGVuZ3RoVW5pdDo6UG9pbnQsIDQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitmbG9hdCBDRlhfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9Gb250U2l6ZShDRlhfQ1NTUHJvcGVydHlWYWx1ZSBlVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmQ3VyRm9udFNpemUpIHsKKyAgc3dpdGNoIChlVmFsdWUpIHsKKyAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpYeFNtYWxsOgorICAgICAgcmV0dXJuIG1fZkRlZkZvbnRTaXplIC8gMS4yZiAvIDEuMmYgLyAxLjJmOworICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5VmFsdWU6OlhTbWFsbDoKKyAgICAgIHJldHVybiBtX2ZEZWZGb250U2l6ZSAvIDEuMmYgLyAxLjJmOworICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5VmFsdWU6OlNtYWxsOgorICAgICAgcmV0dXJuIG1fZkRlZkZvbnRTaXplIC8gMS4yZjsKKyAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpNZWRpdW06CisgICAgICByZXR1cm4gbV9mRGVmRm9udFNpemU7CisgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6TGFyZ2U6CisgICAgICByZXR1cm4gbV9mRGVmRm9udFNpemUgKiAxLjJmOworICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5VmFsdWU6OlhMYXJnZToKKyAgICAgIHJldHVybiBtX2ZEZWZGb250U2l6ZSAqIDEuMmYgKiAxLjJmOworICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5VmFsdWU6Olh4TGFyZ2U6CisgICAgICByZXR1cm4gbV9mRGVmRm9udFNpemUgKiAxLjJmICogMS4yZiAqIDEuMmY7CisgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6TGFyZ2VyOgorICAgICAgcmV0dXJuIGZDdXJGb250U2l6ZSAqIDEuMmY7CisgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6U21hbGxlcjoKKyAgICAgIHJldHVybiBmQ3VyRm9udFNpemUgLyAxLjJmOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZkN1ckZvbnRTaXplOworICB9Cit9CisKK0NGWF9DU1NWZXJ0aWNhbEFsaWduIENGWF9DU1NTdHlsZVNlbGVjdG9yOjpUb1ZlcnRpY2FsQWxpZ24oCisgICAgQ0ZYX0NTU1Byb3BlcnR5VmFsdWUgZVZhbHVlKSB7CisgIHN3aXRjaCAoZVZhbHVlKSB7CisgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6TWlkZGxlOgorICAgICAgcmV0dXJuIENGWF9DU1NWZXJ0aWNhbEFsaWduOjpNaWRkbGU7CisgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6Qm90dG9tOgorICAgICAgcmV0dXJuIENGWF9DU1NWZXJ0aWNhbEFsaWduOjpCb3R0b207CisgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6U3VwZXI6CisgICAgICByZXR1cm4gQ0ZYX0NTU1ZlcnRpY2FsQWxpZ246OlN1cGVyOworICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5VmFsdWU6OlN1YjoKKyAgICAgIHJldHVybiBDRlhfQ1NTVmVydGljYWxBbGlnbjo6U3ViOworICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5VmFsdWU6OlRvcDoKKyAgICAgIHJldHVybiBDRlhfQ1NTVmVydGljYWxBbGlnbjo6VG9wOworICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5VmFsdWU6OlRleHRUb3A6CisgICAgICByZXR1cm4gQ0ZYX0NTU1ZlcnRpY2FsQWxpZ246OlRleHRUb3A7CisgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6VGV4dEJvdHRvbToKKyAgICAgIHJldHVybiBDRlhfQ1NTVmVydGljYWxBbGlnbjo6VGV4dEJvdHRvbTsKKyAgICBjYXNlIENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpCYXNlbGluZToKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIENGWF9DU1NWZXJ0aWNhbEFsaWduOjpCYXNlbGluZTsKKyAgfQorfQorCit1aW50MzJfdCBDRlhfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9UZXh0RGVjb3JhdGlvbigKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0NTU1ZhbHVlTGlzdD4mIHBWYWx1ZSkgeworICB1aW50MzJfdCBkd0RlY29yYXRpb24gPSAwOworICBmb3IgKGludDMyX3QgaSA9IHBWYWx1ZS0+Q291bnRWYWx1ZXMoKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgY29uc3QgUmV0YWluUHRyPENGWF9DU1NWYWx1ZT4gcFZhbCA9IHBWYWx1ZS0+R2V0VmFsdWUoaSk7CisgICAgaWYgKHBWYWwtPkdldFR5cGUoKSAhPSBDRlhfQ1NTUHJpbWl0aXZlVHlwZTo6RW51bSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgc3dpdGNoIChwVmFsLkFzPENGWF9DU1NFbnVtVmFsdWU+KCktPlZhbHVlKCkpIHsKKyAgICAgIGNhc2UgQ0ZYX0NTU1Byb3BlcnR5VmFsdWU6OlVuZGVybGluZToKKyAgICAgICAgZHdEZWNvcmF0aW9uIHw9IENGWF9DU1NURVhUREVDT1JBVElPTl9VbmRlcmxpbmU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6TGluZVRocm91Z2g6CisgICAgICAgIGR3RGVjb3JhdGlvbiB8PSBDRlhfQ1NTVEVYVERFQ09SQVRJT05fTGluZVRocm91Z2g7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6T3ZlcmxpbmU6CisgICAgICAgIGR3RGVjb3JhdGlvbiB8PSBDRlhfQ1NTVEVYVERFQ09SQVRJT05fT3ZlcmxpbmU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6Qmxpbms6CisgICAgICAgIGR3RGVjb3JhdGlvbiB8PSBDRlhfQ1NTVEVYVERFQ09SQVRJT05fQmxpbms7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6RG91YmxlOgorICAgICAgICBkd0RlY29yYXRpb24gfD0gQ0ZYX0NTU1RFWFRERUNPUkFUSU9OX0RvdWJsZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGR3RGVjb3JhdGlvbjsKK30KKworQ0ZYX0NTU0ZvbnRWYXJpYW50IENGWF9DU1NTdHlsZVNlbGVjdG9yOjpUb0ZvbnRWYXJpYW50KAorICAgIENGWF9DU1NQcm9wZXJ0eVZhbHVlIGVWYWx1ZSkgeworICByZXR1cm4gZVZhbHVlID09IENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpTbWFsbENhcHMKKyAgICAgICAgICAgICA/IENGWF9DU1NGb250VmFyaWFudDo6U21hbGxDYXBzCisgICAgICAgICAgICAgOiBDRlhfQ1NTRm9udFZhcmlhbnQ6Ok5vcm1hbDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHlsZXNlbGVjdG9yLmggYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3R5bGVzZWxlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYTBmNzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3R5bGVzZWxlY3Rvci5oCkBAIC0wLDAgKzEsODMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX0NTU19DRlhfQ1NTU1RZTEVTRUxFQ1RPUl9IXworI2RlZmluZSBDT1JFX0ZYQ1JUX0NTU19DRlhfQ1NTU1RZTEVTRUxFQ1RPUl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3MuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzcnVsZWNvbGxlY3Rpb24uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorCitjbGFzcyBDRlhfQ1NTQ29tcHV0ZWRTdHlsZTsKK2NsYXNzIENGWF9DU1NDdXN0b21Qcm9wZXJ0eTsKK2NsYXNzIENGWF9DU1NEZWNsYXJhdGlvbjsKK2NsYXNzIENGWF9DU1NQcm9wZXJ0eUhvbGRlcjsKK2NsYXNzIENGWF9DU1NTZWxlY3RvcjsKK2NsYXNzIENGWF9DU1NTdHlsZVNoZWV0OworY2xhc3MgQ0ZYX0NTU1ZhbHVlOworY2xhc3MgQ0ZYX0NTU1ZhbHVlTGlzdDsKKworY2xhc3MgQ0ZYX0NTU1N0eWxlU2VsZWN0b3IgeworIHB1YmxpYzoKKyAgQ0ZYX0NTU1N0eWxlU2VsZWN0b3IoKTsKKyAgfkNGWF9DU1NTdHlsZVNlbGVjdG9yKCk7CisKKyAgdm9pZCBTZXREZWZGb250U2l6ZShmbG9hdCBmRm9udFNpemUpOworICB2b2lkIFNldFVBU3R5bGVTaGVldChzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0NTU1N0eWxlU2hlZXQ+IHBTaGVldCk7CisgIHZvaWQgVXBkYXRlU3R5bGVJbmRleCgpOworCisgIFJldGFpblB0cjxDRlhfQ1NTQ29tcHV0ZWRTdHlsZT4gQ3JlYXRlQ29tcHV0ZWRTdHlsZSgKKyAgICAgIENGWF9DU1NDb21wdXRlZFN0eWxlKiBwUGFyZW50U3R5bGUpOworCisgIC8vIE5vdGUsIHRoZSBkZXN0IHN0eWxlIGhhcyB0byBiZSBhbiBvdXQgcGFyYW0gYmVjYXVzZSB0aGUgQ1hGQV9UZXh0UGFyc2VyCisgIC8vIGFkZHMgbm9uLWluaGVyaXRlZCBkYXRhIGZyb20gdGhlIHBhcmVudCBzdHlsZS4gQXR0ZW1wdGluZyB0byBjb3B5CisgIC8vIGludGVybmFsbHkgd2lsbCBmYWlsIGFzIHlvdSdsbCBsb3NlIHRoZSBub24taW5oZXJpdGVkIGRhdGEuCisgIHZvaWQgQ29tcHV0ZVN0eWxlKGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IENGWF9DU1NEZWNsYXJhdGlvbio+JiBkZWNsQXJyYXksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHN0eWxlU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBhbGlnblN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX0NTU0NvbXB1dGVkU3R5bGUqIHBEZXN0U3R5bGUpOworCisgIHN0ZDo6dmVjdG9yPGNvbnN0IENGWF9DU1NEZWNsYXJhdGlvbio+IE1hdGNoRGVjbGFyYXRpb25zKAorICAgICAgY29uc3QgV2lkZVN0cmluZyYgdGFnbmFtZSk7CisKKyBwcml2YXRlOgorICBib29sIE1hdGNoU2VsZWN0b3IoY29uc3QgV2lkZVN0cmluZyYgdGFnbmFtZSwgQ0ZYX0NTU1NlbGVjdG9yKiBwU2VsKTsKKworICB2b2lkIEFwcGVuZElubGluZVN0eWxlKENGWF9DU1NEZWNsYXJhdGlvbiogcERlY2wsIGNvbnN0IFdpZGVTdHJpbmcmIHN0eWxlKTsKKyAgdm9pZCBBcHBseURlY2xhcmF0aW9ucygKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGNvbnN0IENGWF9DU1NEZWNsYXJhdGlvbio+JiBkZWNsQXJyYXksCisgICAgICBjb25zdCBDRlhfQ1NTRGVjbGFyYXRpb24qIGV4dHJhRGVjbCwKKyAgICAgIENGWF9DU1NDb21wdXRlZFN0eWxlKiBwRGVzdFN0eWxlKTsKKyAgdm9pZCBBcHBseVByb3BlcnR5KENGWF9DU1NQcm9wZXJ0eSBlUHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0NTU1ZhbHVlPiYgcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NTU0NvbXB1dGVkU3R5bGUqIHBDb21wdXRlZFN0eWxlKTsKKyAgdm9pZCBFeHRyYWN0VmFsdWVzKGNvbnN0IENGWF9DU1NEZWNsYXJhdGlvbiogZGVjbCwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IENGWF9DU1NQcm9wZXJ0eUhvbGRlcio+KiBpbXBvcnRhbnRzLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgQ0ZYX0NTU1Byb3BlcnR5SG9sZGVyKj4qIG5vcm1hbHMsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBDRlhfQ1NTQ3VzdG9tUHJvcGVydHkqPiogY3VzdG9tKTsKKworICBib29sIFNldExlbmd0aFdpdGhQZXJjZW50KENGWF9DU1NMZW5ndGgmIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DU1NQcmltaXRpdmVUeXBlIGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfQ1NTVmFsdWU+JiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZkZvbnRTaXplKTsKKyAgZmxvYXQgVG9Gb250U2l6ZShDRlhfQ1NTUHJvcGVydHlWYWx1ZSBlVmFsdWUsIGZsb2F0IGZDdXJGb250U2l6ZSk7CisgIENGWF9DU1NEaXNwbGF5IFRvRGlzcGxheShDRlhfQ1NTUHJvcGVydHlWYWx1ZSBlVmFsdWUpOworICBDRlhfQ1NTVGV4dEFsaWduIFRvVGV4dEFsaWduKENGWF9DU1NQcm9wZXJ0eVZhbHVlIGVWYWx1ZSk7CisgIHVpbnQxNl90IFRvRm9udFdlaWdodChDRlhfQ1NTUHJvcGVydHlWYWx1ZSBlVmFsdWUpOworICBDRlhfQ1NTRm9udFN0eWxlIFRvRm9udFN0eWxlKENGWF9DU1NQcm9wZXJ0eVZhbHVlIGVWYWx1ZSk7CisgIENGWF9DU1NWZXJ0aWNhbEFsaWduIFRvVmVydGljYWxBbGlnbihDRlhfQ1NTUHJvcGVydHlWYWx1ZSBlVmFsdWUpOworICB1aW50MzJfdCBUb1RleHREZWNvcmF0aW9uKGNvbnN0IFJldGFpblB0cjxDRlhfQ1NTVmFsdWVMaXN0PiYgcExpc3QpOworICBDRlhfQ1NTRm9udFZhcmlhbnQgVG9Gb250VmFyaWFudChDRlhfQ1NTUHJvcGVydHlWYWx1ZSBlVmFsdWUpOworCisgIGZsb2F0IG1fZkRlZkZvbnRTaXplOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0NTU1N0eWxlU2hlZXQ+IG1fVUFTdHlsZXM7CisgIENGWF9DU1NSdWxlQ29sbGVjdGlvbiBtX1VBUnVsZXM7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NTVFlMRVNFTEVDVE9SX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3R5bGVzaGVldC5jcHAgYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3R5bGVzaGVldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgzNzY1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHlsZXNoZWV0LmNwcApAQCAtMCwwICsxLDE0MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3N0eWxlc2hlZXQuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzZGF0YXRhYmxlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc2RlY2xhcmF0aW9uLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3N0eWxlcnVsZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29kZXBhZ2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorCitDRlhfQ1NTU3R5bGVTaGVldDo6Q0ZYX0NTU1N0eWxlU2hlZXQoKSB7fQorCitDRlhfQ1NTU3R5bGVTaGVldDo6fkNGWF9DU1NTdHlsZVNoZWV0KCkgeworICBSZXNldCgpOworfQorCit2b2lkIENGWF9DU1NTdHlsZVNoZWV0OjpSZXNldCgpIHsKKyAgbV9SdWxlQXJyYXkuY2xlYXIoKTsKKyAgbV9TdHJpbmdDYWNoZS5jbGVhcigpOworfQorCitpbnQzMl90IENGWF9DU1NTdHlsZVNoZWV0OjpDb3VudFJ1bGVzKCkgY29uc3QgeworICByZXR1cm4gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX1J1bGVBcnJheSk7Cit9CisKK0NGWF9DU1NTdHlsZVJ1bGUqIENGWF9DU1NTdHlsZVNoZWV0OjpHZXRSdWxlKGludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fUnVsZUFycmF5W2luZGV4XS5nZXQoKTsKK30KKworYm9vbCBDRlhfQ1NTU3R5bGVTaGVldDo6TG9hZEJ1ZmZlcihjb25zdCB3Y2hhcl90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZTaXplKSB7CisgIEFTU0VSVChwQnVmZmVyKTsKKyAgQVNTRVJUKGlCdWZTaXplID4gMCk7CisKKyAgYXV0byBwU3ludGF4ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9DU1NTeW50YXhQYXJzZXI+KHBCdWZmZXIsIGlCdWZTaXplKTsKKyAgUmVzZXQoKTsKKyAgQ0ZYX0NTU1N5bnRheFN0YXR1cyBlU3RhdHVzOworICBkbyB7CisgICAgc3dpdGNoIChlU3RhdHVzID0gcFN5bnRheC0+RG9TeW50YXhQYXJzZSgpKSB7CisgICAgICBjYXNlIENGWF9DU1NTeW50YXhTdGF0dXM6OlN0eWxlUnVsZToKKyAgICAgICAgZVN0YXR1cyA9IExvYWRTdHlsZVJ1bGUocFN5bnRheC5nZXQoKSwgJm1fUnVsZUFycmF5KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKGVTdGF0dXMgPj0gQ0ZYX0NTU1N5bnRheFN0YXR1czo6Tm9uZSk7CisKKyAgbV9TdHJpbmdDYWNoZS5jbGVhcigpOworICByZXR1cm4gZVN0YXR1cyAhPSBDRlhfQ1NTU3ludGF4U3RhdHVzOjpFcnJvcjsKK30KKworQ0ZYX0NTU1N5bnRheFN0YXR1cyBDRlhfQ1NTU3R5bGVTaGVldDo6TG9hZFN0eWxlUnVsZSgKKyAgICBDRlhfQ1NTU3ludGF4UGFyc2VyKiBwU3ludGF4LAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhfQ1NTU3R5bGVSdWxlPj4qIHJ1bGVBcnJheSkgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0NTU1NlbGVjdG9yPj4gc2VsZWN0b3JzOworCisgIENGWF9DU1NTdHlsZVJ1bGUqIHBTdHlsZVJ1bGUgPSBudWxscHRyOworICBpbnQzMl90IGlWYWx1ZUxlbiA9IDA7CisgIGNvbnN0IENGWF9DU1NQcm9wZXJ0eVRhYmxlKiBwcm9wZXJ0eVRhYmxlID0gbnVsbHB0cjsKKyAgV2lkZVN0cmluZyB3c05hbWU7CisgIHdoaWxlICgxKSB7CisgICAgc3dpdGNoIChwU3ludGF4LT5Eb1N5bnRheFBhcnNlKCkpIHsKKyAgICAgIGNhc2UgQ0ZYX0NTU1N5bnRheFN0YXR1czo6U2VsZWN0b3I6IHsKKyAgICAgICAgV2lkZVN0cmluZ1ZpZXcgc3RyVmFsdWUgPSBwU3ludGF4LT5HZXRDdXJyZW50U3RyaW5nKCk7CisgICAgICAgIGF1dG8gcFNlbGVjdG9yID0gQ0ZYX0NTU1NlbGVjdG9yOjpGcm9tU3RyaW5nKHN0clZhbHVlKTsKKyAgICAgICAgaWYgKHBTZWxlY3RvcikKKyAgICAgICAgICBzZWxlY3RvcnMucHVzaF9iYWNrKHN0ZDo6bW92ZShwU2VsZWN0b3IpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIENGWF9DU1NTeW50YXhTdGF0dXM6OlByb3BlcnR5TmFtZTogeworICAgICAgICBXaWRlU3RyaW5nVmlldyBzdHJWYWx1ZSA9IHBTeW50YXgtPkdldEN1cnJlbnRTdHJpbmcoKTsKKyAgICAgICAgcHJvcGVydHlUYWJsZSA9IENGWF9HZXRDU1NQcm9wZXJ0eUJ5TmFtZShzdHJWYWx1ZSk7CisgICAgICAgIGlmICghcHJvcGVydHlUYWJsZSkKKyAgICAgICAgICB3c05hbWUgPSBXaWRlU3RyaW5nKHN0clZhbHVlKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIENGWF9DU1NTeW50YXhTdGF0dXM6OlByb3BlcnR5VmFsdWU6IHsKKyAgICAgICAgaWYgKHByb3BlcnR5VGFibGUgfHwgaVZhbHVlTGVuID4gMCkgeworICAgICAgICAgIFdpZGVTdHJpbmdWaWV3IHN0clZhbHVlID0gcFN5bnRheC0+R2V0Q3VycmVudFN0cmluZygpOworICAgICAgICAgIGF1dG8qIGRlY2wgPSBwU3R5bGVSdWxlLT5HZXREZWNsYXJhdGlvbigpOworICAgICAgICAgIGlmICghc3RyVmFsdWUuSXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAocHJvcGVydHlUYWJsZSkgeworICAgICAgICAgICAgICBkZWNsLT5BZGRQcm9wZXJ0eShwcm9wZXJ0eVRhYmxlLCBzdHJWYWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBkZWNsLT5BZGRQcm9wZXJ0eSh3c05hbWUsIFdpZGVTdHJpbmcoc3RyVmFsdWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIENGWF9DU1NTeW50YXhTdGF0dXM6OkRlY2xPcGVuOiB7CisgICAgICAgIGlmICghcFN0eWxlUnVsZSAmJiAhc2VsZWN0b3JzLmVtcHR5KCkpIHsKKyAgICAgICAgICBhdXRvIHJ1bGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0NTU1N0eWxlUnVsZT4oKTsKKyAgICAgICAgICBwU3R5bGVSdWxlID0gcnVsZS5nZXQoKTsKKyAgICAgICAgICBwU3R5bGVSdWxlLT5TZXRTZWxlY3Rvcigmc2VsZWN0b3JzKTsKKyAgICAgICAgICBydWxlQXJyYXktPnB1c2hfYmFjayhzdGQ6Om1vdmUocnVsZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFNraXBSdWxlU2V0KHBTeW50YXgpOworICAgICAgICAgIHJldHVybiBDRlhfQ1NTU3ludGF4U3RhdHVzOjpOb25lOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBDRlhfQ1NTU3ludGF4U3RhdHVzOjpEZWNsQ2xvc2U6IHsKKyAgICAgICAgaWYgKHBTdHlsZVJ1bGUgJiYgcFN0eWxlUnVsZS0+R2V0RGVjbGFyYXRpb24oKS0+ZW1wdHkoKSkgeworICAgICAgICAgIHJ1bGVBcnJheS0+cG9wX2JhY2soKTsKKyAgICAgICAgICBwU3R5bGVSdWxlID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQ0ZYX0NTU1N5bnRheFN0YXR1czo6Tm9uZTsKKyAgICAgIH0KKyAgICAgIGNhc2UgQ0ZYX0NTU1N5bnRheFN0YXR1czo6RU9TOgorICAgICAgICByZXR1cm4gQ0ZYX0NTU1N5bnRheFN0YXR1czo6RU9TOworICAgICAgY2FzZSBDRlhfQ1NTU3ludGF4U3RhdHVzOjpFcnJvcjoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBDRlhfQ1NTU3ludGF4U3RhdHVzOjpFcnJvcjsKKyAgICB9CisgIH0KK30KKwordm9pZCBDRlhfQ1NTU3R5bGVTaGVldDo6U2tpcFJ1bGVTZXQoQ0ZYX0NTU1N5bnRheFBhcnNlciogcFN5bnRheCkgeworICB3aGlsZSAoMSkgeworICAgIHN3aXRjaCAocFN5bnRheC0+RG9TeW50YXhQYXJzZSgpKSB7CisgICAgICBjYXNlIENGWF9DU1NTeW50YXhTdGF0dXM6OlNlbGVjdG9yOgorICAgICAgY2FzZSBDRlhfQ1NTU3ludGF4U3RhdHVzOjpEZWNsT3BlbjoKKyAgICAgIGNhc2UgQ0ZYX0NTU1N5bnRheFN0YXR1czo6UHJvcGVydHlOYW1lOgorICAgICAgY2FzZSBDRlhfQ1NTU3ludGF4U3RhdHVzOjpQcm9wZXJ0eVZhbHVlOgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0ZYX0NTU1N5bnRheFN0YXR1czo6RGVjbENsb3NlOgorICAgICAgY2FzZSBDRlhfQ1NTU3ludGF4U3RhdHVzOjpFT1M6CisgICAgICBjYXNlIENGWF9DU1NTeW50YXhTdGF0dXM6OkVycm9yOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jc3MvY2Z4X2Nzc3N0eWxlc2hlZXQuaCBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHlsZXNoZWV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YzYTk0YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHlsZXNoZWV0LmgKQEAgLTAsMCArMSw0MCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NTVFlMRVNIRUVUX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NTVFlMRVNIRUVUX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NzeW50YXhwYXJzZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorCitjbGFzcyBDRlhfQ1NTU3R5bGVSdWxlOworCitjbGFzcyBDRlhfQ1NTU3R5bGVTaGVldCB7CisgcHVibGljOgorICBDRlhfQ1NTU3R5bGVTaGVldCgpOworICB+Q0ZYX0NTU1N0eWxlU2hlZXQoKTsKKworICBib29sIExvYWRCdWZmZXIoY29uc3Qgd2NoYXJfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmU2l6ZSk7CisKKyAgaW50MzJfdCBDb3VudFJ1bGVzKCkgY29uc3Q7CisgIENGWF9DU1NTdHlsZVJ1bGUqIEdldFJ1bGUoaW50MzJfdCBpbmRleCkgY29uc3Q7CisKKyBwcml2YXRlOgorICB2b2lkIFJlc2V0KCk7CisgIENGWF9DU1NTeW50YXhTdGF0dXMgTG9hZFN0eWxlUnVsZSgKKyAgICAgIENGWF9DU1NTeW50YXhQYXJzZXIqIHBTeW50YXgsCisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0NTU1N0eWxlUnVsZT4+KiBydWxlQXJyYXkpOworICB2b2lkIFNraXBSdWxlU2V0KENGWF9DU1NTeW50YXhQYXJzZXIqIHBTeW50YXgpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhfQ1NTU3R5bGVSdWxlPj4gbV9SdWxlQXJyYXk7CisgIHN0ZDo6bWFwPHVpbnQzMl90LCB3Y2hhcl90Kj4gbV9TdHJpbmdDYWNoZTsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWENSVF9DU1NfQ0ZYX0NTU1NUWUxFU0hFRVRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHlsZXNoZWV0X3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHlsZXNoZWV0X3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWEwMDJiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc3N0eWxlc2hlZXRfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMjM5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3R5bGVzaGVldC5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NkZWNsYXJhdGlvbi5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NlbnVtdmFsdWUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzbnVtYmVydmFsdWUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3R5bGVydWxlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3ZhbHVlbGlzdC5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisKK2NsYXNzIENGWF9DU1NTdHlsZVNoZWV0VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgc2hlZXRfID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9DU1NTdHlsZVNoZWV0PigpOworICAgIGRlY2xfID0gbnVsbHB0cjsKKyAgfQorCisgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7IGRlY2xfID0gbnVsbHB0cjsgfQorCisgIHZvaWQgTG9hZEFuZFZlcmlmeURlY2woY29uc3Qgd2NoYXJfdCogYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFdpZGVTdHJpbmc+JiBzZWxlY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRlY2xfY291bnQpIHsKKyAgICBBU1NFUlQoc2hlZXRfKTsKKworICAgIEVYUEVDVF9UUlVFKHNoZWV0Xy0+TG9hZEJ1ZmZlcihidWYsIHdjc2xlbihidWYpKSk7CisgICAgRVhQRUNUX0VRKHNoZWV0Xy0+Q291bnRSdWxlcygpLCAxKTsKKworICAgIENGWF9DU1NTdHlsZVJ1bGUqIHN0eWxlID0gc2hlZXRfLT5HZXRSdWxlKDApOworICAgIEVYUEVDVF9FUShzZWxlY3RvcnMuc2l6ZSgpLCBzdHlsZS0+Q291bnRTZWxlY3Rvckxpc3RzKCkpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzZWxlY3RvcnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIHVpbnQzMl90IGhhc2ggPSBGWF9IYXNoQ29kZV9HZXRXKHNlbGVjdG9yc1tpXS5Bc1N0cmluZ1ZpZXcoKSwgdHJ1ZSk7CisgICAgICBFWFBFQ1RfRVEoaGFzaCwgc3R5bGUtPkdldFNlbGVjdG9yTGlzdChpKS0+R2V0TmFtZUhhc2goKSk7CisgICAgfQorCisgICAgZGVjbF8gPSBzdHlsZS0+R2V0RGVjbGFyYXRpb24oKTsKKyAgICBFWFBFQ1RfRVEoZGVjbF8tPlByb3BlcnR5Q291bnRGb3JUZXN0aW5nKCksIGRlY2xfY291bnQpOworICB9CisKKyAgdm9pZCBWZXJpZnlGbG9hdChDRlhfQ1NTUHJvcGVydHkgcHJvcCwgZmxvYXQgdmFsLCBDRlhfQ1NTTnVtYmVyVHlwZSB0eXBlKSB7CisgICAgQVNTRVJUKGRlY2xfKTsKKworICAgIGJvb2wgaW1wb3J0YW50OworICAgIFJldGFpblB0cjxDRlhfQ1NTVmFsdWU+IHYgPSBkZWNsXy0+R2V0UHJvcGVydHkocHJvcCwgJmltcG9ydGFudCk7CisgICAgRVhQRUNUX0VRKHYtPkdldFR5cGUoKSwgQ0ZYX0NTU1ByaW1pdGl2ZVR5cGU6Ok51bWJlcik7CisgICAgRVhQRUNUX0VRKHYuQXM8Q0ZYX0NTU051bWJlclZhbHVlPigpLT5LaW5kKCksIHR5cGUpOworICAgIEVYUEVDVF9FUSh2LkFzPENGWF9DU1NOdW1iZXJWYWx1ZT4oKS0+VmFsdWUoKSwgdmFsKTsKKyAgfQorCisgIHZvaWQgVmVyaWZ5RW51bShDRlhfQ1NTUHJvcGVydHkgcHJvcCwgQ0ZYX0NTU1Byb3BlcnR5VmFsdWUgdmFsKSB7CisgICAgQVNTRVJUKGRlY2xfKTsKKworICAgIGJvb2wgaW1wb3J0YW50OworICAgIFJldGFpblB0cjxDRlhfQ1NTVmFsdWU+IHYgPSBkZWNsXy0+R2V0UHJvcGVydHkocHJvcCwgJmltcG9ydGFudCk7CisgICAgRVhQRUNUX0VRKHYtPkdldFR5cGUoKSwgQ0ZYX0NTU1ByaW1pdGl2ZVR5cGU6OkVudW0pOworICAgIEVYUEVDVF9FUSh2LkFzPENGWF9DU1NFbnVtVmFsdWU+KCktPlZhbHVlKCksIHZhbCk7CisgIH0KKworICB2b2lkIFZlcmlmeUxpc3QoQ0ZYX0NTU1Byb3BlcnR5IHByb3AsCisgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDRlhfQ1NTUHJvcGVydHlWYWx1ZT4gdmFsdWVzKSB7CisgICAgQVNTRVJUKGRlY2xfKTsKKworICAgIGJvb2wgaW1wb3J0YW50OworICAgIFJldGFpblB0cjxDRlhfQ1NTVmFsdWVMaXN0PiBsaXN0ID0KKyAgICAgICAgZGVjbF8tPkdldFByb3BlcnR5KHByb3AsICZpbXBvcnRhbnQpLkFzPENGWF9DU1NWYWx1ZUxpc3Q+KCk7CisgICAgRVhQRUNUX0VRKGxpc3QtPkNvdW50VmFsdWVzKCksIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4odmFsdWVzKSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCk7IGkrKykgeworICAgICAgUmV0YWluUHRyPENGWF9DU1NWYWx1ZT4gdmFsID0gbGlzdC0+R2V0VmFsdWUoaSk7CisgICAgICBFWFBFQ1RfRVEodmFsLT5HZXRUeXBlKCksIENGWF9DU1NQcmltaXRpdmVUeXBlOjpFbnVtKTsKKyAgICAgIEVYUEVDVF9FUSh2YWwuQXM8Q0ZYX0NTU0VudW1WYWx1ZT4oKS0+VmFsdWUoKSwgdmFsdWVzW2ldKTsKKyAgICB9CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0NTU1N0eWxlU2hlZXQ+IHNoZWV0XzsKKyAgQ0ZYX0NTU0RlY2xhcmF0aW9uKiBkZWNsXzsKK307CisKK1RFU1RfRihDRlhfQ1NTU3R5bGVTaGVldFRlc3QsIFBhcnNlTXVsdGlwbGVTZWxlY3RvcnMpIHsKKyAgY29uc3Qgd2NoYXJfdCogYnVmID0KKyAgICAgIEwiYSB7IGJvcmRlcjogMTBweDsgfVxuYiB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9IjsKKyAgRVhQRUNUX1RSVUUoc2hlZXRfLT5Mb2FkQnVmZmVyKGJ1Ziwgd2NzbGVuKGJ1ZikpKTsKKyAgRVhQRUNUX0VRKDIsIHNoZWV0Xy0+Q291bnRSdWxlcygpKTsKKworICBDRlhfQ1NTU3R5bGVSdWxlKiBzdHlsZSA9IHNoZWV0Xy0+R2V0UnVsZSgwKTsKKyAgRVhQRUNUX0VRKDFVTCwgc3R5bGUtPkNvdW50U2VsZWN0b3JMaXN0cygpKTsKKworICBib29sIGZvdW5kX3NlbGVjdG9yID0gZmFsc2U7CisgIHVpbnQzMl90IGhhc2ggPSBGWF9IYXNoQ29kZV9HZXRXKEwiYSIsIHRydWUpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0eWxlLT5Db3VudFNlbGVjdG9yTGlzdHMoKTsgaSsrKSB7CisgICAgaWYgKHN0eWxlLT5HZXRTZWxlY3Rvckxpc3QoaSktPkdldE5hbWVIYXNoKCkgPT0gaGFzaCkgeworICAgICAgZm91bmRfc2VsZWN0b3IgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIEVYUEVDVF9UUlVFKGZvdW5kX3NlbGVjdG9yKTsKKworICBkZWNsXyA9IHN0eWxlLT5HZXREZWNsYXJhdGlvbigpOworICBFWFBFQ1RfRVEoNFVMLCBkZWNsXy0+UHJvcGVydHlDb3VudEZvclRlc3RpbmcoKSk7CisKKyAgVmVyaWZ5RmxvYXQoQ0ZYX0NTU1Byb3BlcnR5OjpCb3JkZXJMZWZ0V2lkdGgsIDEwLjAsCisgICAgICAgICAgICAgIENGWF9DU1NOdW1iZXJUeXBlOjpQaXhlbHMpOworICBWZXJpZnlGbG9hdChDRlhfQ1NTUHJvcGVydHk6OkJvcmRlclJpZ2h0V2lkdGgsIDEwLjAsCisgICAgICAgICAgICAgIENGWF9DU1NOdW1iZXJUeXBlOjpQaXhlbHMpOworICBWZXJpZnlGbG9hdChDRlhfQ1NTUHJvcGVydHk6OkJvcmRlclRvcFdpZHRoLCAxMC4wLCBDRlhfQ1NTTnVtYmVyVHlwZTo6UGl4ZWxzKTsKKyAgVmVyaWZ5RmxvYXQoQ0ZYX0NTU1Byb3BlcnR5OjpCb3JkZXJCb3R0b21XaWR0aCwgMTAuMCwKKyAgICAgICAgICAgICAgQ0ZYX0NTU051bWJlclR5cGU6OlBpeGVscyk7CisKKyAgc3R5bGUgPSBzaGVldF8tPkdldFJ1bGUoMSk7CisgIEVYUEVDVF9FUSgxVUwsIHN0eWxlLT5Db3VudFNlbGVjdG9yTGlzdHMoKSk7CisKKyAgZm91bmRfc2VsZWN0b3IgPSBmYWxzZTsKKyAgaGFzaCA9IEZYX0hhc2hDb2RlX0dldFcoTCJiIiwgdHJ1ZSk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3R5bGUtPkNvdW50U2VsZWN0b3JMaXN0cygpOyBpKyspIHsKKyAgICBpZiAoc3R5bGUtPkdldFNlbGVjdG9yTGlzdChpKS0+R2V0TmFtZUhhc2goKSA9PSBoYXNoKSB7CisgICAgICBmb3VuZF9zZWxlY3RvciA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgRVhQRUNUX1RSVUUoZm91bmRfc2VsZWN0b3IpOworCisgIGRlY2xfID0gc3R5bGUtPkdldERlY2xhcmF0aW9uKCk7CisgIEVYUEVDVF9FUSgxVUwsIGRlY2xfLT5Qcm9wZXJ0eUNvdW50Rm9yVGVzdGluZygpKTsKKyAgVmVyaWZ5TGlzdChDRlhfQ1NTUHJvcGVydHk6OlRleHREZWNvcmF0aW9uLAorICAgICAgICAgICAgIHtDRlhfQ1NTUHJvcGVydHlWYWx1ZTo6VW5kZXJsaW5lfSk7Cit9CisKK1RFU1RfRihDRlhfQ1NTU3R5bGVTaGVldFRlc3QsIFBhcnNlQ2hpbGRTZWxlY3RvcnMpIHsKKyAgY29uc3Qgd2NoYXJfdCogYnVmID0gTCJhIGIgYyB7IGJvcmRlcjogMTBweDsgfSI7CisgIEVYUEVDVF9UUlVFKHNoZWV0Xy0+TG9hZEJ1ZmZlcihidWYsIHdjc2xlbihidWYpKSk7CisgIEVYUEVDVF9FUSgxLCBzaGVldF8tPkNvdW50UnVsZXMoKSk7CisKKyAgQ0ZYX0NTU1N0eWxlUnVsZSogc3R5bGUgPSBzaGVldF8tPkdldFJ1bGUoMCk7CisgIEVYUEVDVF9FUSgxVUwsIHN0eWxlLT5Db3VudFNlbGVjdG9yTGlzdHMoKSk7CisKKyAgYXV0byogc2VsID0gc3R5bGUtPkdldFNlbGVjdG9yTGlzdCgwKTsKKyAgRVhQRUNUX1RSVUUoc2VsICE9IG51bGxwdHIpOworICBFWFBFQ1RfRVEoRlhfSGFzaENvZGVfR2V0VyhMImMiLCB0cnVlKSwgc2VsLT5HZXROYW1lSGFzaCgpKTsKKworICBzZWwgPSBzZWwtPkdldE5leHRTZWxlY3RvcigpOworICBFWFBFQ1RfVFJVRShzZWwgIT0gbnVsbHB0cik7CisgIEVYUEVDVF9FUShGWF9IYXNoQ29kZV9HZXRXKEwiYiIsIHRydWUpLCBzZWwtPkdldE5hbWVIYXNoKCkpOworCisgIHNlbCA9IHNlbC0+R2V0TmV4dFNlbGVjdG9yKCk7CisgIEVYUEVDVF9UUlVFKHNlbCAhPSBudWxscHRyKTsKKyAgRVhQRUNUX0VRKEZYX0hhc2hDb2RlX0dldFcoTCJhIiwgdHJ1ZSksIHNlbC0+R2V0TmFtZUhhc2goKSk7CisKKyAgc2VsID0gc2VsLT5HZXROZXh0U2VsZWN0b3IoKTsKKyAgRVhQRUNUX1RSVUUoc2VsID09IG51bGxwdHIpOworCisgIGRlY2xfID0gc3R5bGUtPkdldERlY2xhcmF0aW9uKCk7CisgIEVYUEVDVF9FUSg0VUwsIGRlY2xfLT5Qcm9wZXJ0eUNvdW50Rm9yVGVzdGluZygpKTsKKworICBWZXJpZnlGbG9hdChDRlhfQ1NTUHJvcGVydHk6OkJvcmRlckxlZnRXaWR0aCwgMTAuMCwKKyAgICAgICAgICAgICAgQ0ZYX0NTU051bWJlclR5cGU6OlBpeGVscyk7CisgIFZlcmlmeUZsb2F0KENGWF9DU1NQcm9wZXJ0eTo6Qm9yZGVyUmlnaHRXaWR0aCwgMTAuMCwKKyAgICAgICAgICAgICAgQ0ZYX0NTU051bWJlclR5cGU6OlBpeGVscyk7CisgIFZlcmlmeUZsb2F0KENGWF9DU1NQcm9wZXJ0eTo6Qm9yZGVyVG9wV2lkdGgsIDEwLjAsIENGWF9DU1NOdW1iZXJUeXBlOjpQaXhlbHMpOworICBWZXJpZnlGbG9hdChDRlhfQ1NTUHJvcGVydHk6OkJvcmRlckJvdHRvbVdpZHRoLCAxMC4wLAorICAgICAgICAgICAgICBDRlhfQ1NTTnVtYmVyVHlwZTo6UGl4ZWxzKTsKK30KKworVEVTVF9GKENGWF9DU1NTdHlsZVNoZWV0VGVzdCwgUGFyc2VVbmhhbmRsZWRTZWxlY3RvcnMpIHsKKyAgY29uc3Qgd2NoYXJfdCogYnVmID0gTCJhID4gYiB7IHBhZGRpbmc6IDA7IH0iOworICBFWFBFQ1RfVFJVRShzaGVldF8tPkxvYWRCdWZmZXIoYnVmLCB3Y3NsZW4oYnVmKSkpOworICBFWFBFQ1RfRVEoMCwgc2hlZXRfLT5Db3VudFJ1bGVzKCkpOworCisgIGJ1ZiA9IEwiYVtmaXJzdF0geyBwYWRkaW5nOiAwOyB9IjsKKyAgRVhQRUNUX1RSVUUoc2hlZXRfLT5Mb2FkQnVmZmVyKGJ1Ziwgd2NzbGVuKGJ1ZikpKTsKKyAgRVhQRUNUX0VRKDAsIHNoZWV0Xy0+Q291bnRSdWxlcygpKTsKKworICBidWYgPSBMImErYiB7IHBhZGRpbmc6IDA7IH0iOworICBFWFBFQ1RfVFJVRShzaGVldF8tPkxvYWRCdWZmZXIoYnVmLCB3Y3NsZW4oYnVmKSkpOworICBFWFBFQ1RfRVEoMCwgc2hlZXRfLT5Db3VudFJ1bGVzKCkpOworCisgIGJ1ZiA9IEwiYSBeIGIgeyBwYWRkaW5nOiAwOyB9IjsKKyAgRVhQRUNUX1RSVUUoc2hlZXRfLT5Mb2FkQnVmZmVyKGJ1Ziwgd2NzbGVuKGJ1ZikpKTsKKyAgRVhQRUNUX0VRKDAsIHNoZWV0Xy0+Q291bnRSdWxlcygpKTsKK30KKworVEVTVF9GKENGWF9DU1NTdHlsZVNoZWV0VGVzdCwgUGFyc2VNdWx0aXBsZVNlbGVjdG9yc0NvbWJpbmVkKSB7CisgIExvYWRBbmRWZXJpZnlEZWNsKEwiYSwgYiwgYyB7IGJvcmRlcjogNXB4OyB9Iiwge0wiYSIsIEwiYiIsIEwiYyJ9LCA0KTsKK30KKworVEVTVF9GKENGWF9DU1NTdHlsZVNoZWV0VGVzdCwgUGFyc2VCb3JkZXIpIHsKKyAgTG9hZEFuZFZlcmlmeURlY2woTCJhIHsgYm9yZGVyOiA1cHg7IH0iLCB7TCJhIn0sIDQpOworICBWZXJpZnlGbG9hdChDRlhfQ1NTUHJvcGVydHk6OkJvcmRlckxlZnRXaWR0aCwgNS4wLCBDRlhfQ1NTTnVtYmVyVHlwZTo6UGl4ZWxzKTsKKyAgVmVyaWZ5RmxvYXQoQ0ZYX0NTU1Byb3BlcnR5OjpCb3JkZXJSaWdodFdpZHRoLCA1LjAsCisgICAgICAgICAgICAgIENGWF9DU1NOdW1iZXJUeXBlOjpQaXhlbHMpOworICBWZXJpZnlGbG9hdChDRlhfQ1NTUHJvcGVydHk6OkJvcmRlclRvcFdpZHRoLCA1LjAsIENGWF9DU1NOdW1iZXJUeXBlOjpQaXhlbHMpOworICBWZXJpZnlGbG9hdChDRlhfQ1NTUHJvcGVydHk6OkJvcmRlckJvdHRvbVdpZHRoLCA1LjAsCisgICAgICAgICAgICAgIENGWF9DU1NOdW1iZXJUeXBlOjpQaXhlbHMpOworfQorCitURVNUX0YoQ0ZYX0NTU1N0eWxlU2hlZXRUZXN0LCBQYXJzZUJvcmRlckZ1bGwpIHsKKyAgTG9hZEFuZFZlcmlmeURlY2woTCJhIHsgYm9yZGVyOiA1cHggc29saWQgcmVkOyB9Iiwge0wiYSJ9LCA0KTsKKyAgVmVyaWZ5RmxvYXQoQ0ZYX0NTU1Byb3BlcnR5OjpCb3JkZXJMZWZ0V2lkdGgsIDUuMCwgQ0ZYX0NTU051bWJlclR5cGU6OlBpeGVscyk7CisgIFZlcmlmeUZsb2F0KENGWF9DU1NQcm9wZXJ0eTo6Qm9yZGVyUmlnaHRXaWR0aCwgNS4wLAorICAgICAgICAgICAgICBDRlhfQ1NTTnVtYmVyVHlwZTo6UGl4ZWxzKTsKKyAgVmVyaWZ5RmxvYXQoQ0ZYX0NTU1Byb3BlcnR5OjpCb3JkZXJUb3BXaWR0aCwgNS4wLCBDRlhfQ1NTTnVtYmVyVHlwZTo6UGl4ZWxzKTsKKyAgVmVyaWZ5RmxvYXQoQ0ZYX0NTU1Byb3BlcnR5OjpCb3JkZXJCb3R0b21XaWR0aCwgNS4wLAorICAgICAgICAgICAgICBDRlhfQ1NTTnVtYmVyVHlwZTo6UGl4ZWxzKTsKK30KKworVEVTVF9GKENGWF9DU1NTdHlsZVNoZWV0VGVzdCwgUGFyc2VCb3JkZXJMZWZ0KSB7CisgIExvYWRBbmRWZXJpZnlEZWNsKEwiYSB7IGJvcmRlci1sZWZ0OiAyLjVwYzsgfSIsIHtMImEifSwgMSk7CisgIFZlcmlmeUZsb2F0KENGWF9DU1NQcm9wZXJ0eTo6Qm9yZGVyTGVmdFdpZHRoLCAyLjUsIENGWF9DU1NOdW1iZXJUeXBlOjpQaWNhcyk7Cit9CisKK1RFU1RfRihDRlhfQ1NTU3R5bGVTaGVldFRlc3QsIFBhcnNlQm9yZGVyTGVmdFRoaWNrKSB7CisgIExvYWRBbmRWZXJpZnlEZWNsKEwiYSB7IGJvcmRlci1sZWZ0OiB0aGljazsgfSIsIHtMImEifSwgMSk7CisgIFZlcmlmeUVudW0oQ0ZYX0NTU1Byb3BlcnR5OjpCb3JkZXJMZWZ0V2lkdGgsIENGWF9DU1NQcm9wZXJ0eVZhbHVlOjpUaGljayk7Cit9CisKK1RFU1RfRihDRlhfQ1NTU3R5bGVTaGVldFRlc3QsIFBhcnNlQm9yZGVyUmlnaHQpIHsKKyAgTG9hZEFuZFZlcmlmeURlY2woTCJhIHsgYm9yZGVyLXJpZ2h0OiAyLjVwYzsgfSIsIHtMImEifSwgMSk7CisgIFZlcmlmeUZsb2F0KENGWF9DU1NQcm9wZXJ0eTo6Qm9yZGVyUmlnaHRXaWR0aCwgMi41LCBDRlhfQ1NTTnVtYmVyVHlwZTo6UGljYXMpOworfQorCitURVNUX0YoQ0ZYX0NTU1N0eWxlU2hlZXRUZXN0LCBQYXJzZUJvcmRlclRvcCkgeworICBMb2FkQW5kVmVyaWZ5RGVjbChMImEgeyBib3JkZXItdG9wOiAyLjVwYzsgfSIsIHtMImEifSwgMSk7CisgIFZlcmlmeUZsb2F0KENGWF9DU1NQcm9wZXJ0eTo6Qm9yZGVyVG9wV2lkdGgsIDIuNSwgQ0ZYX0NTU051bWJlclR5cGU6OlBpY2FzKTsKK30KKworVEVTVF9GKENGWF9DU1NTdHlsZVNoZWV0VGVzdCwgUGFyc2VCb3JkZXJCb3R0b20pIHsKKyAgTG9hZEFuZFZlcmlmeURlY2woTCJhIHsgYm9yZGVyLWJvdHRvbTogMi41cGM7IH0iLCB7TCJhIn0sIDEpOworICBWZXJpZnlGbG9hdChDRlhfQ1NTUHJvcGVydHk6OkJvcmRlckJvdHRvbVdpZHRoLCAyLjUsCisgICAgICAgICAgICAgIENGWF9DU1NOdW1iZXJUeXBlOjpQaWNhcyk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3ludGF4cGFyc2VyLmNwcCBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3NzeW50YXhwYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NmI4MmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3ludGF4cGFyc2VyLmNwcApAQCAtMCwwICsxLDIyOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3N5bnRheHBhcnNlci5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc2RhdGF0YWJsZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NkZWNsYXJhdGlvbi5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29kZXBhZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgorCituYW1lc3BhY2UgeworCitib29sIElzU2VsZWN0b3JTdGFydCh3Y2hhcl90IHdjaCkgeworICByZXR1cm4gd2NoID09ICcuJyB8fCB3Y2ggPT0gJyMnIHx8IHdjaCA9PSAnKicgfHwgRlhTWVNfaXN3YWxwaGEod2NoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0NGWF9DU1NTeW50YXhQYXJzZXI6OkNGWF9DU1NTeW50YXhQYXJzZXIoY29uc3Qgd2NoYXJfdCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQnVmZmVyU2l6ZSkKKyAgICA6IENGWF9DU1NTeW50YXhQYXJzZXIocEJ1ZmZlciwgaUJ1ZmZlclNpemUsIDMyLCBmYWxzZSkge30KKworQ0ZYX0NTU1N5bnRheFBhcnNlcjo6Q0ZYX0NTU1N5bnRheFBhcnNlcihjb25zdCB3Y2hhcl90KiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUZXh0RGF0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiT25seURlY2xhcmF0aW9uKQorICAgIDogbV9pVGV4dERhdGFMZW4oMCksCisgICAgICBtX2R3Q2hlY2soMHhGRkZGRkZGRiksCisgICAgICBtX2VTdGF0dXMoQ0ZYX0NTU1N5bnRheFN0YXR1czo6Tm9uZSkgeworICBBU1NFUlQocEJ1ZmZlciAmJiBpQnVmZmVyU2l6ZSA+IDAgJiYgaVRleHREYXRTaXplID4gMCk7CisgIG1fZU1vZGUgPSBiT25seURlY2xhcmF0aW9uID8gQ0ZYX0NTU1N5bnRheE1vZGU6OlByb3BlcnR5TmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENGWF9DU1NTeW50YXhNb2RlOjpSdWxlU2V0OworICBtX1RleHREYXRhLkluaXRXaXRoU2l6ZShpVGV4dERhdFNpemUpOworICBtX1RleHRQbGFuZS5BdHRhY2hCdWZmZXIocEJ1ZmZlciwgaUJ1ZmZlclNpemUpOworfQorCitDRlhfQ1NTU3ludGF4UGFyc2VyOjp+Q0ZYX0NTU1N5bnRheFBhcnNlcigpIHt9CisKK0NGWF9DU1NTeW50YXhTdGF0dXMgQ0ZYX0NTU1N5bnRheFBhcnNlcjo6RG9TeW50YXhQYXJzZSgpIHsKKyAgd2hpbGUgKG1fZVN0YXR1cyA+PSBDRlhfQ1NTU3ludGF4U3RhdHVzOjpOb25lKSB7CisgICAgaWYgKG1fVGV4dFBsYW5lLklzRU9GKCkpIHsKKyAgICAgIGlmIChtX2VNb2RlID09IENGWF9DU1NTeW50YXhNb2RlOjpQcm9wZXJ0eVZhbHVlICYmCisgICAgICAgICAgbV9UZXh0RGF0YS5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgU2F2ZVRleHREYXRhKCk7CisgICAgICAgIG1fZVN0YXR1cyA9IENGWF9DU1NTeW50YXhTdGF0dXM6OlByb3BlcnR5VmFsdWU7CisgICAgICAgIHJldHVybiBtX2VTdGF0dXM7CisgICAgICB9CisgICAgICBtX2VTdGF0dXMgPSBDRlhfQ1NTU3ludGF4U3RhdHVzOjpFT1M7CisgICAgICByZXR1cm4gbV9lU3RhdHVzOworICAgIH0KKyAgICB3Y2hhcl90IHdjaDsKKyAgICB3aGlsZSAoIW1fVGV4dFBsYW5lLklzRU9GKCkpIHsKKyAgICAgIHdjaCA9IG1fVGV4dFBsYW5lLkdldENoYXIoKTsKKyAgICAgIHN3aXRjaCAobV9lTW9kZSkgeworICAgICAgICBjYXNlIENGWF9DU1NTeW50YXhNb2RlOjpSdWxlU2V0OgorICAgICAgICAgIHN3aXRjaCAod2NoKSB7CisgICAgICAgICAgICBjYXNlICd9JzoKKyAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsKKyAgICAgICAgICAgICAgaWYgKFJlc3RvcmVNb2RlKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIENGWF9DU1NTeW50YXhTdGF0dXM6OkRlY2xDbG9zZTsKKworICAgICAgICAgICAgICBtX2VTdGF0dXMgPSBDRlhfQ1NTU3ludGF4U3RhdHVzOjpFcnJvcjsKKyAgICAgICAgICAgICAgcmV0dXJuIG1fZVN0YXR1czsKKyAgICAgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgICBpZiAobV9UZXh0UGxhbmUuR2V0TmV4dENoYXIoKSA9PSAnKicpIHsKKyAgICAgICAgICAgICAgICBtX01vZGVTdGFjay5wdXNoKG1fZU1vZGUpOworICAgICAgICAgICAgICAgIFN3aXRjaE1vZGUoQ0ZYX0NTU1N5bnRheE1vZGU6OkNvbW1lbnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBpZiAod2NoIDw9ICcgJykgeworICAgICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSXNTZWxlY3RvclN0YXJ0KHdjaCkpIHsKKyAgICAgICAgICAgICAgICBTd2l0Y2hNb2RlKENGWF9DU1NTeW50YXhNb2RlOjpTZWxlY3Rvcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIENGWF9DU1NTeW50YXhTdGF0dXM6OlN0eWxlUnVsZTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtX2VTdGF0dXMgPSBDRlhfQ1NTU3ludGF4U3RhdHVzOjpFcnJvcjsKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9lU3RhdHVzOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDRlhfQ1NTU3ludGF4TW9kZTo6U2VsZWN0b3I6CisgICAgICAgICAgc3dpdGNoICh3Y2gpIHsKKyAgICAgICAgICAgIGNhc2UgJywnOgorICAgICAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOworICAgICAgICAgICAgICBTd2l0Y2hNb2RlKENGWF9DU1NTeW50YXhNb2RlOjpTZWxlY3Rvcik7CisgICAgICAgICAgICAgIGlmIChtX2lUZXh0RGF0YUxlbiA+IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIENGWF9DU1NTeW50YXhTdGF0dXM6OlNlbGVjdG9yOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3snOgorICAgICAgICAgICAgICBpZiAobV9UZXh0RGF0YS5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBTYXZlVGV4dERhdGEoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ0ZYX0NTU1N5bnRheFN0YXR1czo6U2VsZWN0b3I7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsKKyAgICAgICAgICAgICAgbV9Nb2RlU3RhY2sucHVzaChDRlhfQ1NTU3ludGF4TW9kZTo6UnVsZVNldCk7CisgICAgICAgICAgICAgIFN3aXRjaE1vZGUoQ0ZYX0NTU1N5bnRheE1vZGU6OlByb3BlcnR5TmFtZSk7CisgICAgICAgICAgICAgIHJldHVybiBDRlhfQ1NTU3ludGF4U3RhdHVzOjpEZWNsT3BlbjsKKyAgICAgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgICBpZiAobV9UZXh0UGxhbmUuR2V0TmV4dENoYXIoKSA9PSAnKicpIHsKKyAgICAgICAgICAgICAgICBpZiAoU3dpdGNoVG9Db21tZW50KCkgPiAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIENGWF9DU1NTeW50YXhTdGF0dXM6OlNlbGVjdG9yOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBBcHBlbmRDaGFyKHdjaCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDRlhfQ1NTU3ludGF4TW9kZTo6UHJvcGVydHlOYW1lOgorICAgICAgICAgIHN3aXRjaCAod2NoKSB7CisgICAgICAgICAgICBjYXNlICc6JzoKKyAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsKKyAgICAgICAgICAgICAgU3dpdGNoTW9kZShDRlhfQ1NTU3ludGF4TW9kZTo6UHJvcGVydHlWYWx1ZSk7CisgICAgICAgICAgICAgIHJldHVybiBDRlhfQ1NTU3ludGF4U3RhdHVzOjpQcm9wZXJ0eU5hbWU7CisgICAgICAgICAgICBjYXNlICd9JzoKKyAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsKKyAgICAgICAgICAgICAgaWYgKFJlc3RvcmVNb2RlKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIENGWF9DU1NTeW50YXhTdGF0dXM6OkRlY2xDbG9zZTsKKworICAgICAgICAgICAgICBtX2VTdGF0dXMgPSBDRlhfQ1NTU3ludGF4U3RhdHVzOjpFcnJvcjsKKyAgICAgICAgICAgICAgcmV0dXJuIG1fZVN0YXR1czsKKyAgICAgICAgICAgIGNhc2UgJy8nOgorICAgICAgICAgICAgICBpZiAobV9UZXh0UGxhbmUuR2V0TmV4dENoYXIoKSA9PSAnKicpIHsKKyAgICAgICAgICAgICAgICBpZiAoU3dpdGNoVG9Db21tZW50KCkgPiAwKQorICAgICAgICAgICAgICAgICAgcmV0dXJuIENGWF9DU1NTeW50YXhTdGF0dXM6OlByb3BlcnR5TmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgQXBwZW5kQ2hhcih3Y2gpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZYX0NTU1N5bnRheE1vZGU6OlByb3BlcnR5VmFsdWU6CisgICAgICAgICAgc3dpdGNoICh3Y2gpIHsKKyAgICAgICAgICAgIGNhc2UgJzsnOgorICAgICAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOworICAgICAgICAgICAgY2FzZSAnfSc6CisgICAgICAgICAgICAgIFN3aXRjaE1vZGUoQ0ZYX0NTU1N5bnRheE1vZGU6OlByb3BlcnR5TmFtZSk7CisgICAgICAgICAgICAgIHJldHVybiBDRlhfQ1NTU3ludGF4U3RhdHVzOjpQcm9wZXJ0eVZhbHVlOworICAgICAgICAgICAgY2FzZSAnLyc6CisgICAgICAgICAgICAgIGlmIChtX1RleHRQbGFuZS5HZXROZXh0Q2hhcigpID09ICcqJykgeworICAgICAgICAgICAgICAgIGlmIChTd2l0Y2hUb0NvbW1lbnQoKSA+IDApCisgICAgICAgICAgICAgICAgICByZXR1cm4gQ0ZYX0NTU1N5bnRheFN0YXR1czo6UHJvcGVydHlWYWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgQXBwZW5kQ2hhcih3Y2gpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZYX0NTU1N5bnRheE1vZGU6OkNvbW1lbnQ6CisgICAgICAgICAgaWYgKHdjaCA9PSAnLycgJiYgbV9UZXh0RGF0YS5HZXRMZW5ndGgoKSA+IDAgJiYKKyAgICAgICAgICAgICAgbV9UZXh0RGF0YS5HZXRCdWZmZXIoKVttX1RleHREYXRhLkdldExlbmd0aCgpIC0gMV0gPT0gJyonKSB7CisgICAgICAgICAgICBSZXN0b3JlTW9kZSgpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX1RleHREYXRhLkFwcGVuZENoYXIod2NoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDRlhfQ1NTU3ludGF4TW9kZTo6VW5rbm93blJ1bGU6CisgICAgICAgICAgaWYgKHdjaCA9PSAnOycpCisgICAgICAgICAgICBTd2l0Y2hNb2RlKENGWF9DU1NTeW50YXhNb2RlOjpSdWxlU2V0KTsKKyAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIG1fZVN0YXR1czsKK30KKworYm9vbCBDRlhfQ1NTU3ludGF4UGFyc2VyOjpJc0ltcG9ydEVuYWJsZWQoKSBjb25zdCB7CisgIGlmICgobV9kd0NoZWNrICYgQ0ZYX0NTU1NZTlRBWENIRUNLX0FsbG93SW1wb3J0KSA9PSAwKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKG1fTW9kZVN0YWNrLnNpemUoKSA+IDEpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDRlhfQ1NTU3ludGF4UGFyc2VyOjpBcHBlbmRDaGFyKHdjaGFyX3Qgd2NoKSB7CisgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7CisgIGlmIChtX1RleHREYXRhLkdldExlbmd0aCgpID4gMCB8fCB3Y2ggPiAnICcpIHsKKyAgICBtX1RleHREYXRhLkFwcGVuZENoYXIod2NoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2ludDMyX3QgQ0ZYX0NTU1N5bnRheFBhcnNlcjo6U2F2ZVRleHREYXRhKCkgeworICBtX2lUZXh0RGF0YUxlbiA9IG1fVGV4dERhdGEuVHJpbUVuZCgpOworICBtX1RleHREYXRhLkNsZWFyKCk7CisgIHJldHVybiBtX2lUZXh0RGF0YUxlbjsKK30KKwordm9pZCBDRlhfQ1NTU3ludGF4UGFyc2VyOjpTd2l0Y2hNb2RlKENGWF9DU1NTeW50YXhNb2RlIGVNb2RlKSB7CisgIG1fZU1vZGUgPSBlTW9kZTsKKyAgU2F2ZVRleHREYXRhKCk7Cit9CisKK2ludDMyX3QgQ0ZYX0NTU1N5bnRheFBhcnNlcjo6U3dpdGNoVG9Db21tZW50KCkgeworICBpbnQzMl90IGlMZW5ndGggPSBtX1RleHREYXRhLkdldExlbmd0aCgpOworICBtX01vZGVTdGFjay5wdXNoKG1fZU1vZGUpOworICBTd2l0Y2hNb2RlKENGWF9DU1NTeW50YXhNb2RlOjpDb21tZW50KTsKKyAgcmV0dXJuIGlMZW5ndGg7Cit9CisKK2Jvb2wgQ0ZYX0NTU1N5bnRheFBhcnNlcjo6UmVzdG9yZU1vZGUoKSB7CisgIGlmIChtX01vZGVTdGFjay5lbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBTd2l0Y2hNb2RlKG1fTW9kZVN0YWNrLnRvcCgpKTsKKyAgbV9Nb2RlU3RhY2sucG9wKCk7CisgIHJldHVybiB0cnVlOworfQorCitXaWRlU3RyaW5nVmlldyBDRlhfQ1NTU3ludGF4UGFyc2VyOjpHZXRDdXJyZW50U3RyaW5nKCkgY29uc3QgeworICByZXR1cm4gV2lkZVN0cmluZ1ZpZXcobV9UZXh0RGF0YS5HZXRCdWZmZXIoKSwgbV9pVGV4dERhdGFMZW4pOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jc3MvY2Z4X2Nzc3N5bnRheHBhcnNlci5oIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc3N5bnRheHBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OGY5YTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3Nzc3ludGF4cGFyc2VyLmgKQEAgLTAsMCArMSw3NSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NTWU5UQVhQQVJTRVJfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9DU1NfQ0ZYX0NTU1NZTlRBWFBBUlNFUl9IXworCisjaW5jbHVkZSA8c3RhY2s+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzZXh0dGV4dGJ1Zi5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3N0ZXh0YnVmLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKworI2RlZmluZSBDRlhfQ1NTU1lOVEFYQ0hFQ0tfQWxsb3dDaGFyc2V0IDEKKyNkZWZpbmUgQ0ZYX0NTU1NZTlRBWENIRUNLX0FsbG93SW1wb3J0IDIKKworZW51bSBjbGFzcyBDRlhfQ1NTU3ludGF4TW9kZSB7CisgIFJ1bGVTZXQsCisgIENvbW1lbnQsCisgIFVua25vd25SdWxlLAorICBTZWxlY3RvciwKKyAgUHJvcGVydHlOYW1lLAorICBQcm9wZXJ0eVZhbHVlLAorfTsKKworZW51bSBjbGFzcyBDRlhfQ1NTU3ludGF4U3RhdHVzIDogdWludDhfdCB7CisgIEVycm9yLAorICBFT1MsCisgIE5vbmUsCisgIFN0eWxlUnVsZSwKKyAgU2VsZWN0b3IsCisgIERlY2xPcGVuLAorICBEZWNsQ2xvc2UsCisgIFByb3BlcnR5TmFtZSwKKyAgUHJvcGVydHlWYWx1ZSwKK307CisKK2NsYXNzIENGWF9DU1NTeW50YXhQYXJzZXIgeworIHB1YmxpYzoKKyAgQ0ZYX0NTU1N5bnRheFBhcnNlcihjb25zdCB3Y2hhcl90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKTsKKyAgQ0ZYX0NTU1N5bnRheFBhcnNlcihjb25zdCB3Y2hhcl90KiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVGV4dERhdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiT25seURlY2xhcmF0aW9uKTsKKyAgfkNGWF9DU1NTeW50YXhQYXJzZXIoKTsKKworICBDRlhfQ1NTU3ludGF4U3RhdHVzIERvU3ludGF4UGFyc2UoKTsKKyAgV2lkZVN0cmluZ1ZpZXcgR2V0Q3VycmVudFN0cmluZygpIGNvbnN0OworCisgcHJvdGVjdGVkOgorICB2b2lkIFN3aXRjaE1vZGUoQ0ZYX0NTU1N5bnRheE1vZGUgZU1vZGUpOworICBpbnQzMl90IFN3aXRjaFRvQ29tbWVudCgpOworCisgIGJvb2wgUmVzdG9yZU1vZGUoKTsKKyAgYm9vbCBBcHBlbmRDaGFyKHdjaGFyX3Qgd2NoKTsKKyAgaW50MzJfdCBTYXZlVGV4dERhdGEoKTsKKyAgYm9vbCBJc0NoYXJzZXRFbmFibGVkKCkgY29uc3QgeworICAgIHJldHVybiAobV9kd0NoZWNrICYgQ0ZYX0NTU1NZTlRBWENIRUNLX0FsbG93Q2hhcnNldCkgIT0gMDsKKyAgfQorICB2b2lkIERpc2FibGVDaGFyc2V0KCkgeyBtX2R3Q2hlY2sgPSBDRlhfQ1NTU1lOVEFYQ0hFQ0tfQWxsb3dJbXBvcnQ7IH0KKyAgYm9vbCBJc0ltcG9ydEVuYWJsZWQoKSBjb25zdDsKKyAgdm9pZCBEaXNhYmxlSW1wb3J0KCkgeyBtX2R3Q2hlY2sgPSAwOyB9CisKKyAgQ0ZYX0NTU1RleHRCdWYgbV9UZXh0RGF0YTsKKyAgQ0ZYX0NTU0V4dFRleHRCdWYgbV9UZXh0UGxhbmU7CisgIGludDMyX3QgbV9pVGV4dERhdGFMZW47CisgIHVpbnQzMl90IG1fZHdDaGVjazsKKyAgQ0ZYX0NTU1N5bnRheE1vZGUgbV9lTW9kZTsKKyAgQ0ZYX0NTU1N5bnRheFN0YXR1cyBtX2VTdGF0dXM7CisgIHN0ZDo6c3RhY2s8Q0ZYX0NTU1N5bnRheE1vZGU+IG1fTW9kZVN0YWNrOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0NTU19DRlhfQ1NTU1lOVEFYUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzdGV4dGJ1Zi5jcHAgYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzdGV4dGJ1Zi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmM2I5NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3N0ZXh0YnVmLmNwcApAQCAtMCwwICsxLDQ5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzdGV4dGJ1Zi5oIgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9tZW1vcnkuaCIKKworQ0ZYX0NTU1RleHRCdWY6OkNGWF9DU1NUZXh0QnVmKCkKKyAgICA6IG1fcEJ1ZmZlcihudWxscHRyKSwgbV9pQnVmTGVuKDApLCBtX2lEYXRMZW4oMCkge30KKworQ0ZYX0NTU1RleHRCdWY6On5DRlhfQ1NTVGV4dEJ1ZigpIHsKKyAgRlhfRnJlZShtX3BCdWZmZXIpOworICBtX3BCdWZmZXIgPSBudWxscHRyOworICBtX2lEYXRMZW4gPSBtX2lCdWZMZW47Cit9CisKK3ZvaWQgQ0ZYX0NTU1RleHRCdWY6OkluaXRXaXRoU2l6ZShpbnQzMl90IGlBbGxvY1NpemUpIHsKKyAgRXhwYW5kQnVmKGlBbGxvY1NpemUpOworfQorCit2b2lkIENGWF9DU1NUZXh0QnVmOjpBcHBlbmRDaGFyKHdjaGFyX3Qgd2NoKSB7CisgIGlmIChtX2lEYXRMZW4gPj0gbV9pQnVmTGVuKQorICAgIEV4cGFuZEJ1ZihtX2lCdWZMZW4gKiAyKTsKKworICBtX3BCdWZmZXJbbV9pRGF0TGVuKytdID0gd2NoOworfQorCitpbnQzMl90IENGWF9DU1NUZXh0QnVmOjpUcmltRW5kKCkgeworICB3aGlsZSAobV9pRGF0TGVuID4gMCAmJiBtX3BCdWZmZXJbbV9pRGF0TGVuIC0gMV0gPD0gJyAnKQorICAgIC0tbV9pRGF0TGVuOworICBBcHBlbmRDaGFyKDApOworICByZXR1cm4gLS1tX2lEYXRMZW47Cit9CisKK3ZvaWQgQ0ZYX0NTU1RleHRCdWY6OkV4cGFuZEJ1ZihpbnQzMl90IGlEZXNpcmVkU2l6ZSkgeworICBBU1NFUlQoaURlc2lyZWRTaXplID4gMCk7CisgIGlmIChtX3BCdWZmZXIgJiYgbV9pQnVmTGVuID09IGlEZXNpcmVkU2l6ZSkKKyAgICByZXR1cm47CisKKyAgaWYgKG1fcEJ1ZmZlcikKKyAgICBtX3BCdWZmZXIgPSBGWF9SZWFsbG9jKHdjaGFyX3QsIG1fcEJ1ZmZlciwgaURlc2lyZWRTaXplKTsKKyAgZWxzZQorICAgIG1fcEJ1ZmZlciA9IEZYX0FsbG9jKHdjaGFyX3QsIGlEZXNpcmVkU2l6ZSk7CisKKyAgbV9pQnVmTGVuID0gaURlc2lyZWRTaXplOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jc3MvY2Z4X2Nzc3RleHRidWYuaCBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3N0ZXh0YnVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFiOWM2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3N0ZXh0YnVmLmgKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NURVhUQlVGX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NURVhUQlVGX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorCitjbGFzcyBDRlhfQ1NTVGV4dEJ1ZiB7CisgcHVibGljOgorICBDRlhfQ1NTVGV4dEJ1ZigpOworICB+Q0ZYX0NTU1RleHRCdWYoKTsKKworICB2b2lkIEluaXRXaXRoU2l6ZShpbnQzMl90IGlBbGxvY1NpemUpOworICB2b2lkIEFwcGVuZENoYXIod2NoYXJfdCB3Y2gpOworCisgIHZvaWQgQ2xlYXIoKSB7IG1faURhdExlbiA9IDA7IH0KKworICBpbnQzMl90IFRyaW1FbmQoKTsKKworICBpbnQzMl90IEdldExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1faURhdExlbjsgfQorICBjb25zdCB3Y2hhcl90KiBHZXRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtX3BCdWZmZXI7IH0KKworIHByb3RlY3RlZDoKKyAgdm9pZCBFeHBhbmRCdWYoaW50MzJfdCBpRGVzaXJlZFNpemUpOworCisgIHdjaGFyX3QqIG1fcEJ1ZmZlcjsKKyAgaW50MzJfdCBtX2lCdWZMZW47CisgIGludDMyX3QgbV9pRGF0TGVuOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0NTU19DRlhfQ1NTVEVYVEJVRl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9jc3MvY2Z4X2Nzc3ZhbHVlLmNwcCBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3N2YWx1ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1ZmM3NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3N2YWx1ZS5jcHAKQEAgLTAsMCArMSw5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzdmFsdWUuaCIKKworQ0ZYX0NTU1ZhbHVlOjpDRlhfQ1NTVmFsdWUoQ0ZYX0NTU1ByaW1pdGl2ZVR5cGUgdHlwZSkgOiBtX3ZhbHVlKHR5cGUpIHt9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzdmFsdWUuaCBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3N2YWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNDNlOTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzdmFsdWUuaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENSVF9DU1NfQ0ZYX0NTU1ZBTFVFX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NWQUxVRV9IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzcy5oIgorCitjbGFzcyBDRlhfQ1NTVmFsdWUgOiBwdWJsaWMgUmV0YWluYWJsZSB7CisgcHVibGljOgorICBDRlhfQ1NTUHJpbWl0aXZlVHlwZSBHZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gbV92YWx1ZTsgfQorCisgcHJvdGVjdGVkOgorICBleHBsaWNpdCBDRlhfQ1NTVmFsdWUoQ0ZYX0NTU1ByaW1pdGl2ZVR5cGUgdHlwZSk7CisKKyBwcml2YXRlOgorICBDRlhfQ1NTUHJpbWl0aXZlVHlwZSBtX3ZhbHVlOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0NTU19DRlhfQ1NTVkFMVUVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3N2YWx1ZWxpc3QuY3BwIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc3ZhbHVlbGlzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk2ZjE2NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3N2YWx1ZWxpc3QuY3BwCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3N2YWx1ZWxpc3QuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzLmgiCisKK0NGWF9DU1NWYWx1ZUxpc3Q6OkNGWF9DU1NWYWx1ZUxpc3Qoc3RkOjp2ZWN0b3I8UmV0YWluUHRyPENGWF9DU1NWYWx1ZT4+JiBsaXN0KQorICAgIDogQ0ZYX0NTU1ZhbHVlKENGWF9DU1NQcmltaXRpdmVUeXBlOjpMaXN0KSwgbV9wcExpc3Qoc3RkOjptb3ZlKGxpc3QpKSB7fQorCitDRlhfQ1NTVmFsdWVMaXN0Ojp+Q0ZYX0NTU1ZhbHVlTGlzdCgpIHt9CisKK2ludDMyX3QgQ0ZYX0NTU1ZhbHVlTGlzdDo6Q291bnRWYWx1ZXMoKSBjb25zdCB7CisgIHJldHVybiBtX3BwTGlzdC5zaXplKCk7Cit9CisKK1JldGFpblB0cjxDRlhfQ1NTVmFsdWU+IENGWF9DU1NWYWx1ZUxpc3Q6OkdldFZhbHVlKGludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcHBMaXN0W2luZGV4XTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3N2YWx1ZWxpc3QuaCBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3N2YWx1ZWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmIwYzZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc3ZhbHVlbGlzdC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX0NTU19DRlhfQ1NTVkFMVUVMSVNUX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NWQUxVRUxJU1RfSF8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3N2YWx1ZS5oIgorCitjbGFzcyBDRlhfQ1NTVmFsdWVMaXN0IDogcHVibGljIENGWF9DU1NWYWx1ZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDRlhfQ1NTVmFsdWVMaXN0KHN0ZDo6dmVjdG9yPFJldGFpblB0cjxDRlhfQ1NTVmFsdWU+PiYgbGlzdCk7CisgIH5DRlhfQ1NTVmFsdWVMaXN0KCkgb3ZlcnJpZGU7CisKKyAgaW50MzJfdCBDb3VudFZhbHVlcygpIGNvbnN0OworICBSZXRhaW5QdHI8Q0ZYX0NTU1ZhbHVlPiBHZXRWYWx1ZShpbnQzMl90IGluZGV4KSBjb25zdDsKKworIHByb3RlY3RlZDoKKyAgc3RkOjp2ZWN0b3I8UmV0YWluUHRyPENGWF9DU1NWYWx1ZT4+IG1fcHBMaXN0OworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0NTU19DRlhfQ1NTVkFMVUVMSVNUX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzdmFsdWVsaXN0cGFyc2VyLmNwcCBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3N2YWx1ZWxpc3RwYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMzlkZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzdmFsdWVsaXN0cGFyc2VyLmNwcApAQCAtMCwwICsxLDg3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzdmFsdWVsaXN0cGFyc2VyLmgiCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorCitDRlhfQ1NTVmFsdWVMaXN0UGFyc2VyOjpDRlhfQ1NTVmFsdWVMaXN0UGFyc2VyKGNvbnN0IHdjaGFyX3QqIHBzeiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90IHNlcGFyYXRvcikKKyAgICA6IG1fU2VwYXJhdG9yKHNlcGFyYXRvciksIG1fcEN1cihwc3opLCBtX3BFbmQocHN6ICsgaUxlbikgeworICBBU1NFUlQocHN6ICYmIGlMZW4gPiAwKTsKK30KKworYm9vbCBDRlhfQ1NTVmFsdWVMaXN0UGFyc2VyOjpOZXh0VmFsdWUoQ0ZYX0NTU1ByaW1pdGl2ZVR5cGUqIGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCoqIHBTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGlMZW5ndGgpIHsKKyAgd2hpbGUgKG1fcEN1ciA8IG1fcEVuZCAmJiAoKm1fcEN1ciA8PSAnICcgfHwgKm1fcEN1ciA9PSBtX1NlcGFyYXRvcikpCisgICAgKyttX3BDdXI7CisKKyAgaWYgKG1fcEN1ciA+PSBtX3BFbmQpCisgICAgcmV0dXJuIGZhbHNlOworCisgICplVHlwZSA9IENGWF9DU1NQcmltaXRpdmVUeXBlOjpVbmtub3duOworICAqcFN0YXJ0ID0gbV9wQ3VyOworICAqaUxlbmd0aCA9IDA7CisgIHdjaGFyX3Qgd2NoID0gKm1fcEN1cjsKKyAgaWYgKHdjaCA9PSAnIycpIHsKKyAgICAqaUxlbmd0aCA9IFNraXBUbygnICcsIGZhbHNlLCBmYWxzZSk7CisgICAgaWYgKCppTGVuZ3RoID09IDQgfHwgKmlMZW5ndGggPT0gNykKKyAgICAgICplVHlwZSA9IENGWF9DU1NQcmltaXRpdmVUeXBlOjpSR0I7CisgIH0gZWxzZSBpZiAoc3RkOjppc3dkaWdpdCh3Y2gpIHx8IHdjaCA9PSAnLicgfHwgd2NoID09ICctJyB8fCB3Y2ggPT0gJysnKSB7CisgICAgd2hpbGUgKG1fcEN1ciA8IG1fcEVuZCAmJiAoKm1fcEN1ciA+ICcgJyAmJiAqbV9wQ3VyICE9IG1fU2VwYXJhdG9yKSkKKyAgICAgICsrbV9wQ3VyOworCisgICAgKmlMZW5ndGggPSBtX3BDdXIgLSAqcFN0YXJ0OworICAgICplVHlwZSA9IENGWF9DU1NQcmltaXRpdmVUeXBlOjpOdW1iZXI7CisgIH0gZWxzZSBpZiAod2NoID09ICdcIicgfHwgd2NoID09ICdcJycpIHsKKyAgICArKygqcFN0YXJ0KTsKKyAgICBtX3BDdXIrKzsKKyAgICAqaUxlbmd0aCA9IFNraXBUbyh3Y2gsIGZhbHNlLCBmYWxzZSk7CisgICAgbV9wQ3VyKys7CisgICAgKmVUeXBlID0gQ0ZYX0NTU1ByaW1pdGl2ZVR5cGU6OlN0cmluZzsKKyAgfSBlbHNlIGlmIChtX3BFbmQgLSBtX3BDdXIgPiA1ICYmIG1fcEN1clszXSA9PSAnKCcpIHsKKyAgICBpZiAoRlhTWVNfd2NzbmljbXAoTCJyZ2IiLCBtX3BDdXIsIDMpID09IDApIHsKKyAgICAgICppTGVuZ3RoID0gU2tpcFRvKCcpJywgZmFsc2UsIGZhbHNlKSArIDE7CisgICAgICBtX3BDdXIrKzsKKyAgICAgICplVHlwZSA9IENGWF9DU1NQcmltaXRpdmVUeXBlOjpSR0I7CisgICAgfQorICB9IGVsc2UgeworICAgICppTGVuZ3RoID0gU2tpcFRvKG1fU2VwYXJhdG9yLCB0cnVlLCB0cnVlKTsKKyAgICAqZVR5cGUgPSBDRlhfQ1NTUHJpbWl0aXZlVHlwZTo6U3RyaW5nOworICB9CisgIHJldHVybiBtX3BDdXIgPD0gbV9wRW5kICYmICppTGVuZ3RoID4gMDsKK30KKworaW50MzJfdCBDRlhfQ1NTVmFsdWVMaXN0UGFyc2VyOjpTa2lwVG8od2NoYXJfdCB3Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJyZWFrT25TcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2hCcmFja2V0cykgeworICBjb25zdCB3Y2hhcl90KiBwU3RhcnQgPSBtX3BDdXI7CisgIGludDMyX3QgYnJhY2tldENvdW50ID0gMDsKKyAgd2hpbGUgKG1fcEN1ciA8IG1fcEVuZCAmJiAqbV9wQ3VyICE9IHdjaCkgeworICAgIGlmIChicmVha09uU3BhY2UgJiYgKm1fcEN1ciA8PSAnICcpCisgICAgICBicmVhazsKKyAgICBpZiAoIW1hdGNoQnJhY2tldHMpIHsKKyAgICAgIG1fcEN1cisrOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKCptX3BDdXIgPT0gJygnKQorICAgICAgYnJhY2tldENvdW50Kys7CisgICAgZWxzZSBpZiAoKm1fcEN1ciA9PSAnKScpCisgICAgICBicmFja2V0Q291bnQtLTsKKworICAgIG1fcEN1cisrOworICB9CisKKyAgd2hpbGUgKGJyYWNrZXRDb3VudCA+IDAgJiYgbV9wQ3VyIDwgbV9wRW5kKSB7CisgICAgaWYgKCptX3BDdXIgPT0gJyknKQorICAgICAgYnJhY2tldENvdW50LS07CisgICAgbV9wQ3VyKys7CisgIH0KKyAgcmV0dXJuIG1fcEN1ciAtIHBTdGFydDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3N2YWx1ZWxpc3RwYXJzZXIuaCBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3N2YWx1ZWxpc3RwYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODcyZWUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9jc3MvY2Z4X2Nzc3ZhbHVlbGlzdHBhcnNlci5oCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX0NTU19DRlhfQ1NTVkFMVUVMSVNUUEFSU0VSX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfQ1NTX0NGWF9DU1NWQUxVRUxJU1RQQVJTRVJfSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3MuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorCitjbGFzcyBDRlhfQ1NTVmFsdWVMaXN0UGFyc2VyIHsKKyBwdWJsaWM6CisgIENGWF9DU1NWYWx1ZUxpc3RQYXJzZXIoY29uc3Qgd2NoYXJfdCogcHN6LCBpbnQzMl90IGlMZW4sIHdjaGFyX3Qgc2VwYXJhdG9yKTsKKworICBib29sIE5leHRWYWx1ZShDRlhfQ1NTUHJpbWl0aXZlVHlwZSogZVR5cGUsCisgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqKiBwU3RhcnQsCisgICAgICAgICAgICAgICAgIGludDMyX3QqIGlMZW5ndGgpOworICB2b2lkIFVzZUNvbW1hU2VwYXJhdG9yKCkgeyBtX1NlcGFyYXRvciA9ICcsJzsgfQorCisgcHJpdmF0ZToKKyAgaW50MzJfdCBTa2lwVG8od2NoYXJfdCB3Y2gsIGJvb2wgYnJlYWtPblNwYWNlLCBib29sIG1hdGNoQnJhY2tldHMpOworCisgIHdjaGFyX3QgbV9TZXBhcmF0b3I7CisgIGNvbnN0IHdjaGFyX3QqIG1fcEN1cjsKKyAgY29uc3Qgd2NoYXJfdCogbV9wRW5kOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0NTU19DRlhfQ1NTVkFMVUVMSVNUUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzdmFsdWVsaXN0cGFyc2VyX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnhjcnQvY3NzL2NmeF9jc3N2YWx1ZWxpc3RwYXJzZXJfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMzJhMmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzdmFsdWVsaXN0cGFyc2VyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDE0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3ZhbHVlbGlzdHBhcnNlci5oIgorCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy90ZXN0X3N1cHBvcnQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK1RFU1QoQ0ZYX0NTU1ZhbHVlTGlzdFBhcnNlclRlc3QsIHJnYl9zaG9ydCkgeworICBDRlhfQ1NTUHJpbWl0aXZlVHlwZSB0eXBlOworICBjb25zdCB3Y2hhcl90KiBzdGFydDsKKyAgaW50MzJfdCBsZW47CisKKyAgYXV0byBwYXJzZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0NTU1ZhbHVlTGlzdFBhcnNlcj4oTCIjYWJjIiwgNCwgTCcgJyk7CisgIEVYUEVDVF9UUlVFKHBhcnNlci0+TmV4dFZhbHVlKCZ0eXBlLCAmc3RhcnQsICZsZW4pKTsKKyAgRVhQRUNUX0VRKENGWF9DU1NQcmltaXRpdmVUeXBlOjpSR0IsIHR5cGUpOworICBFWFBFQ1RfRVEoTCIjYWJjIiwgV2lkZVN0cmluZyhzdGFydCwgbGVuKSk7CisgIEVYUEVDVF9GQUxTRShwYXJzZXItPk5leHRWYWx1ZSgmdHlwZSwgJnN0YXJ0LCAmbGVuKSk7CisKKyAgcGFyc2VyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9DU1NWYWx1ZUxpc3RQYXJzZXI+KEwiI2FiY2RlZiIsIDcsIEwnICcpOworICBFWFBFQ1RfVFJVRShwYXJzZXItPk5leHRWYWx1ZSgmdHlwZSwgJnN0YXJ0LCAmbGVuKSk7CisgIEVYUEVDVF9FUShDRlhfQ1NTUHJpbWl0aXZlVHlwZTo6UkdCLCB0eXBlKTsKKyAgRVhQRUNUX0VRKEwiI2FiY2RlZiIsIFdpZGVTdHJpbmcoc3RhcnQsIGxlbikpOworICBFWFBFQ1RfRkFMU0UocGFyc2VyLT5OZXh0VmFsdWUoJnR5cGUsICZzdGFydCwgJmxlbikpOworCisgIHBhcnNlciA9CisgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0NTU1ZhbHVlTGlzdFBhcnNlcj4oTCJyZ2IoMSwgMjU1LCA0KSIsIDE0LCBMJyAnKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyLT5OZXh0VmFsdWUoJnR5cGUsICZzdGFydCwgJmxlbikpOworICBFWFBFQ1RfRVEoQ0ZYX0NTU1ByaW1pdGl2ZVR5cGU6OlJHQiwgdHlwZSk7CisgIEVYUEVDVF9FUShMInJnYigxLCAyNTUsIDQpIiwgV2lkZVN0cmluZyhzdGFydCwgbGVuKSk7CisKKyAgcGFyc2VyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9DU1NWYWx1ZUxpc3RQYXJzZXI+KEwiI2FiY2RlZmdoaWoiLCAxMSwgTCcgJyk7CisgIEVYUEVDVF9UUlVFKHBhcnNlci0+TmV4dFZhbHVlKCZ0eXBlLCAmc3RhcnQsICZsZW4pKTsKKyAgRVhQRUNUX0VRKENGWF9DU1NQcmltaXRpdmVUeXBlOjpVbmtub3duLCB0eXBlKTsKKyAgRVhQRUNUX0VRKEwiI2FiY2RlZmdoaWoiLCBXaWRlU3RyaW5nKHN0YXJ0LCBsZW4pKTsKKyAgRVhQRUNUX0ZBTFNFKHBhcnNlci0+TmV4dFZhbHVlKCZ0eXBlLCAmc3RhcnQsICZsZW4pKTsKK30KKworVEVTVChDRlhfQ1NTVmFsdWVMaXN0UGFyc2VyVGVzdCwgbnVtYmVyX3BhcnNpbmcpIHsKKyAgQ0ZYX0NTU1ByaW1pdGl2ZVR5cGUgdHlwZTsKKyAgY29uc3Qgd2NoYXJfdCogc3RhcnQ7CisgIGludDMyX3QgbGVuOworCisgIGF1dG8gcGFyc2VyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9DU1NWYWx1ZUxpc3RQYXJzZXI+KEwiMTIzNCIsIDQsIEwnICcpOworICBFWFBFQ1RfVFJVRShwYXJzZXItPk5leHRWYWx1ZSgmdHlwZSwgJnN0YXJ0LCAmbGVuKSk7CisgIEVYUEVDVF9FUShDRlhfQ1NTUHJpbWl0aXZlVHlwZTo6TnVtYmVyLCB0eXBlKTsKKyAgRVhQRUNUX0VRKEwiMTIzNCIsIFdpZGVTdHJpbmcoc3RhcnQsIGxlbikpOworCisgIHBhcnNlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfQ1NTVmFsdWVMaXN0UGFyc2VyPihMIi0xMjM0IiwgNSwgTCcgJyk7CisgIEVYUEVDVF9UUlVFKHBhcnNlci0+TmV4dFZhbHVlKCZ0eXBlLCAmc3RhcnQsICZsZW4pKTsKKyAgRVhQRUNUX0VRKENGWF9DU1NQcmltaXRpdmVUeXBlOjpOdW1iZXIsIHR5cGUpOworICBFWFBFQ1RfRVEoTCItMTIzNCIsIFdpZGVTdHJpbmcoc3RhcnQsIGxlbikpOworCisgIHBhcnNlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfQ1NTVmFsdWVMaXN0UGFyc2VyPihMIisxMjM0IiwgNSwgTCcgJyk7CisgIEVYUEVDVF9UUlVFKHBhcnNlci0+TmV4dFZhbHVlKCZ0eXBlLCAmc3RhcnQsICZsZW4pKTsKKyAgRVhQRUNUX0VRKENGWF9DU1NQcmltaXRpdmVUeXBlOjpOdW1iZXIsIHR5cGUpOworICBFWFBFQ1RfRVEoTCIrMTIzNCIsIFdpZGVTdHJpbmcoc3RhcnQsIGxlbikpOworCisgIHBhcnNlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfQ1NTVmFsdWVMaXN0UGFyc2VyPihMIi4xMjM0IiwgNSwgTCcgJyk7CisgIEVYUEVDVF9UUlVFKHBhcnNlci0+TmV4dFZhbHVlKCZ0eXBlLCAmc3RhcnQsICZsZW4pKTsKKyAgRVhQRUNUX0VRKENGWF9DU1NQcmltaXRpdmVUeXBlOjpOdW1iZXIsIHR5cGUpOworICBFWFBFQ1RfRVEoTCIuMTIzNCIsIFdpZGVTdHJpbmcoc3RhcnQsIGxlbikpOworCisgIHBhcnNlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfQ1NTVmFsdWVMaXN0UGFyc2VyPihMIjQzMjEuMTIzNCIsIDksIEwnICcpOworICBFWFBFQ1RfVFJVRShwYXJzZXItPk5leHRWYWx1ZSgmdHlwZSwgJnN0YXJ0LCAmbGVuKSk7CisgIEVYUEVDVF9FUShDRlhfQ1NTUHJpbWl0aXZlVHlwZTo6TnVtYmVyLCB0eXBlKTsKKyAgRVhQRUNUX0VRKEwiNDMyMS4xMjM0IiwgV2lkZVN0cmluZyhzdGFydCwgbGVuKSk7CisKKyAgLy8gVE9ETyhkc2luY2xhaXIpOiBUaGVzZSBzaG91bGQgcHJvYmFibHkgZmFpbCBidXQgY3VycmVudGx5IGRvbid0LgorICBwYXJzZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0NTU1ZhbHVlTGlzdFBhcnNlcj4oTCI0MzIxLjEyLjM0IiwgMTAsIEwnICcpOworICBFWFBFQ1RfVFJVRShwYXJzZXItPk5leHRWYWx1ZSgmdHlwZSwgJnN0YXJ0LCAmbGVuKSk7CisgIEVYUEVDVF9FUShDRlhfQ1NTUHJpbWl0aXZlVHlwZTo6TnVtYmVyLCB0eXBlKTsKKyAgRVhQRUNUX0VRKEwiNDMyMS4xMi4zNCIsIFdpZGVTdHJpbmcoc3RhcnQsIGxlbikpOworCisgIHBhcnNlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfQ1NTVmFsdWVMaXN0UGFyc2VyPihMIjQzYTEuMTIuMzQiLCAxMCwgTCcgJyk7CisgIEVYUEVDVF9UUlVFKHBhcnNlci0+TmV4dFZhbHVlKCZ0eXBlLCAmc3RhcnQsICZsZW4pKTsKKyAgRVhQRUNUX0VRKENGWF9DU1NQcmltaXRpdmVUeXBlOjpOdW1iZXIsIHR5cGUpOworICBFWFBFQ1RfRVEoTCI0M2ExLjEyLjM0IiwgV2lkZVN0cmluZyhzdGFydCwgbGVuKSk7Cit9CisKK1RFU1QoQ0ZYX0NTU1ZhbHVlTGlzdFBhcnNlclRlc3QsIHN0cmluZ19wYXJzaW5nKSB7CisgIENGWF9DU1NQcmltaXRpdmVUeXBlIHR5cGU7CisgIGNvbnN0IHdjaGFyX3QqIHN0YXJ0OworICBpbnQzMl90IGxlbjsKKworICBhdXRvIHBhcnNlciA9CisgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0NTU1ZhbHVlTGlzdFBhcnNlcj4oTCInc3RyaW5nJyIsIDgsIEwnICcpOworICBFWFBFQ1RfVFJVRShwYXJzZXItPk5leHRWYWx1ZSgmdHlwZSwgJnN0YXJ0LCAmbGVuKSk7CisgIEVYUEVDVF9FUShDRlhfQ1NTUHJpbWl0aXZlVHlwZTo6U3RyaW5nLCB0eXBlKTsKKyAgRVhQRUNUX0VRKEwic3RyaW5nIiwgV2lkZVN0cmluZyhzdGFydCwgbGVuKSk7CisKKyAgcGFyc2VyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9DU1NWYWx1ZUxpc3RQYXJzZXI+KEwiXCJhbm90aGVyIHN0cmluZ1wiIiwgMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMJyAnKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyLT5OZXh0VmFsdWUoJnR5cGUsICZzdGFydCwgJmxlbikpOworICBFWFBFQ1RfRVEoQ0ZYX0NTU1ByaW1pdGl2ZVR5cGU6OlN0cmluZywgdHlwZSk7CisgIEVYUEVDVF9FUShMImFub3RoZXIgc3RyaW5nIiwgV2lkZVN0cmluZyhzdGFydCwgbGVuKSk7CisKKyAgcGFyc2VyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9DU1NWYWx1ZUxpc3RQYXJzZXI+KEwic3RhbmRhbG9uZSIsIDEwLCBMJyAnKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyLT5OZXh0VmFsdWUoJnR5cGUsICZzdGFydCwgJmxlbikpOworICBFWFBFQ1RfRVEoQ0ZYX0NTU1ByaW1pdGl2ZVR5cGU6OlN0cmluZywgdHlwZSk7CisgIEVYUEVDVF9FUShMInN0YW5kYWxvbmUiLCBXaWRlU3RyaW5nKHN0YXJ0LCBsZW4pKTsKK30KKworVEVTVChDRlhfQ1NTVmFsdWVMaXN0UGFyc2VyVGVzdCwgbXVsdGlwYXJzaW5nKSB7CisgIENGWF9DU1NQcmltaXRpdmVUeXBlIHR5cGU7CisgIGNvbnN0IHdjaGFyX3QqIHN0YXJ0OworICBpbnQzMl90IGxlbjsKKworICBhdXRvIHBhcnNlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfQ1NTVmFsdWVMaXN0UGFyc2VyPihMIjEsIDIsIDMiLCA3LCBMJywnKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyLT5OZXh0VmFsdWUoJnR5cGUsICZzdGFydCwgJmxlbikpOworICBFWFBFQ1RfRVEoQ0ZYX0NTU1ByaW1pdGl2ZVR5cGU6Ok51bWJlciwgdHlwZSk7CisgIEVYUEVDVF9FUShMIjEiLCBXaWRlU3RyaW5nKHN0YXJ0LCBsZW4pKTsKKworICBFWFBFQ1RfVFJVRShwYXJzZXItPk5leHRWYWx1ZSgmdHlwZSwgJnN0YXJ0LCAmbGVuKSk7CisgIEVYUEVDVF9FUShDRlhfQ1NTUHJpbWl0aXZlVHlwZTo6TnVtYmVyLCB0eXBlKTsKKyAgRVhQRUNUX0VRKEwiMiIsIFdpZGVTdHJpbmcoc3RhcnQsIGxlbikpOworCisgIEVYUEVDVF9UUlVFKHBhcnNlci0+TmV4dFZhbHVlKCZ0eXBlLCAmc3RhcnQsICZsZW4pKTsKKyAgRVhQRUNUX0VRKENGWF9DU1NQcmltaXRpdmVUeXBlOjpOdW1iZXIsIHR5cGUpOworICBFWFBFQ1RfRVEoTCIzIiwgV2lkZVN0cmluZyhzdGFydCwgbGVuKSk7CisKKyAgRVhQRUNUX0ZBTFNFKHBhcnNlci0+TmV4dFZhbHVlKCZ0eXBlLCAmc3RhcnQsICZsZW4pKTsKKworICBwYXJzZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0NTU1ZhbHVlTGlzdFBhcnNlcj4oTCInc3RyJywgcmdiKDEsIDIsIDMpLCA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyLCBMJywnKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyLT5OZXh0VmFsdWUoJnR5cGUsICZzdGFydCwgJmxlbikpOworICBFWFBFQ1RfRVEoQ0ZYX0NTU1ByaW1pdGl2ZVR5cGU6OlN0cmluZywgdHlwZSk7CisgIEVYUEVDVF9FUShMInN0ciIsIFdpZGVTdHJpbmcoc3RhcnQsIGxlbikpOworCisgIEVYUEVDVF9UUlVFKHBhcnNlci0+TmV4dFZhbHVlKCZ0eXBlLCAmc3RhcnQsICZsZW4pKTsKKyAgRVhQRUNUX0VRKENGWF9DU1NQcmltaXRpdmVUeXBlOjpSR0IsIHR5cGUpOworICBFWFBFQ1RfRVEoTCJyZ2IoMSwgMiwgMykiLCBXaWRlU3RyaW5nKHN0YXJ0LCBsZW4pKTsKKworICBFWFBFQ1RfVFJVRShwYXJzZXItPk5leHRWYWx1ZSgmdHlwZSwgJnN0YXJ0LCAmbGVuKSk7CisgIEVYUEVDVF9FUShDRlhfQ1NTUHJpbWl0aXZlVHlwZTo6TnVtYmVyLCB0eXBlKTsKKyAgRVhQRUNUX0VRKEwiNCIsIFdpZGVTdHJpbmcoc3RhcnQsIGxlbikpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9leHRlbnNpb24uaCBiL2NvcmUvZnhjcnQvZXh0ZW5zaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MmY2NzcuLjAwMDAwMDAKLS0tIGEvY29yZS9meGNydC9leHRlbnNpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBDT1JFX0ZYQ1JUX0VYVEVOU0lPTl9IXwotI2RlZmluZSBDT1JFX0ZYQ1JUX0VYVEVOU0lPTl9IXwotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKLQotY2xhc3MgSUZYQ1JUX0ZpbGVBY2Nlc3MgewotIHB1YmxpYzoKLSAgc3RhdGljIElGWENSVF9GaWxlQWNjZXNzKiBDcmVhdGUoKTsKLSAgdmlydHVhbCB+SUZYQ1JUX0ZpbGVBY2Nlc3MoKSB7fQotCi0gIHZpcnR1YWwgYm9vbCBPcGVuKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgZmlsZU5hbWUsIHVpbnQzMl90IGR3TW9kZSkgPSAwOwotICB2aXJ0dWFsIGJvb2wgT3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLCB1aW50MzJfdCBkd01vZGUpID0gMDsKLSAgdmlydHVhbCB2b2lkIENsb3NlKCkgPSAwOwotICB2aXJ0dWFsIEZYX0ZJTEVTSVpFIEdldFNpemUoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgRlhfRklMRVNJWkUgR2V0UG9zaXRpb24oKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgRlhfRklMRVNJWkUgU2V0UG9zaXRpb24oRlhfRklMRVNJWkUgcG9zKSA9IDA7Ci0gIHZpcnR1YWwgc2l6ZV90IFJlYWQodm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKSA9IDA7Ci0gIHZpcnR1YWwgc2l6ZV90IFdyaXRlKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikgPSAwOwotICB2aXJ0dWFsIHNpemVfdCBSZWFkUG9zKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlciwgRlhfRklMRVNJWkUgcG9zKSA9IDA7Ci0gIHZpcnR1YWwgc2l6ZV90IFdyaXRlUG9zKGNvbnN0IHZvaWQqIHBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzekJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgcG9zKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBGbHVzaCgpID0gMDsKLSAgdmlydHVhbCBib29sIFRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSkgPSAwOwotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotI2RlZmluZSBNVF9OIDg0OAotI2RlZmluZSBNVF9NIDQ1NgotI2RlZmluZSBNVF9NYXRyaXhfQSAweDk5MDhiMGRmCi0jZGVmaW5lIE1UX1VwcGVyX01hc2sgMHg4MDAwMDAwMAotI2RlZmluZSBNVF9Mb3dlcl9NYXNrIDB4N2ZmZmZmZmYKLXN0cnVjdCBGWF9NVFJBTkRPTUNPTlRFWFQgewotICBGWF9NVFJBTkRPTUNPTlRFWFQoKSB7Ci0gICAgbXRpID0gTVRfTiArIDE7Ci0gICAgYkhhdmVTZWVkID0gZmFsc2U7Ci0gIH0KLSAgdWludDMyX3QgbXRpOwotICBib29sIGJIYXZlU2VlZDsKLSAgdWludDMyX3QgbXRbTVRfTl07Ci19OwotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLWJvb2wgRlhfR2VuZXJhdGVDcnlwdG9SYW5kb20odWludDMyX3QqIHBCdWZmZXIsIGludDMyX3QgaUNvdW50KTsKLSNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0VYVEVOU0lPTl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF9hcmFiaWMuY3BwIGIvY29yZS9meGNydC9meF9hcmFiaWMuY3BwCmluZGV4IDEwOGM2YzEuLjBkNmYwMzkgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjcnQvZnhfYXJhYmljLmNwcAorKysgYi9jb3JlL2Z4Y3J0L2Z4X2FyYWJpYy5jcHAKQEAgLTksMTEgKzksMjkgQEAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF91Y2QuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfdW5pY29kZS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKIAogbmFtZXNwYWNlIHsKIAorc3RydWN0IEZYX0FSQkZPUk1UQUJMRSB7CisgIHVpbnQxNl90IHdJc29sYXRlZDsKKyAgdWludDE2X3Qgd0ZpbmFsOworICB1aW50MTZfdCB3SW5pdGlhbDsKKyAgdWludDE2X3Qgd01lZGlhbDsKK307CisKK3N0cnVjdCBGWF9BUkFBTEVGIHsKKyAgdWludDE2X3Qgd0FsZWY7CisgIHVpbnQxNl90IHdJc29sYXRlZDsKK307CisKK3N0cnVjdCBGWF9BUkFTSEFEREEgeworICB1aW50MTZfdCB3U2hhZGRhOworICB1aW50MTZfdCB3SXNvbGF0ZWQ7Cit9OworCiBjb25zdCBGWF9BUkJGT1JNVEFCTEUgZ19GWF9BcmFiaWNGb3JtVGFibGVzW10gPSB7CiAgICAgezB4RkU4MSwgMHhGRTgyLCAweEZFODEsIDB4RkU4Mn0sIHsweEZFODMsIDB4RkU4NCwgMHhGRTgzLCAweEZFODR9LAogICAgIHsweEZFODUsIDB4RkU4NiwgMHhGRTg1LCAweEZFODZ9LCB7MHhGRTg3LCAweEZFODgsIDB4RkU4NywgMHhGRTg4fSwKQEAgLTExOSw2MTUgKzEzNyw5NiBAQAogICAgIHsweDA2NEYsIDB4RkM2MX0sIHsweDA2NTAsIDB4RkM2Mn0sCiB9OwogCi1jb25zdCBpbnQzMl90IGdjX0ZYX0JpZGlOVHlwZXNbXSA9IHsKLSAgICBGWF9CSURJQ0xBU1NfTiwgICBGWF9CSURJQ0xBU1NfTCwgICBGWF9CSURJQ0xBU1NfUiwgICBGWF9CSURJQ0xBU1NfQU4sCi0gICAgRlhfQklESUNMQVNTX0VOLCAgRlhfQklESUNMQVNTX0FMLCAgRlhfQklESUNMQVNTX05TTSwgRlhfQklESUNMQVNTX0NTLAotICAgIEZYX0JJRElDTEFTU19FUywgIEZYX0JJRElDTEFTU19FVCwgIEZYX0JJRElDTEFTU19CTiwgIEZYX0JJRElDTEFTU19CTiwKLSAgICBGWF9CSURJQ0xBU1NfTiwgICBGWF9CSURJQ0xBU1NfQiwgICBGWF9CSURJQ0xBU1NfUkxPLCBGWF9CSURJQ0xBU1NfUkxFLAotICAgIEZYX0JJRElDTEFTU19MUk8sIEZYX0JJRElDTEFTU19MUkUsIEZYX0JJRElDTEFTU19QREYsIEZYX0JJRElDTEFTU19PTiwKLX07Ci0KLWNvbnN0IGludDMyX3QgZ2NfRlhfQmlkaVdlYWtTdGF0ZXNbXVsxMF0gPSB7Ci0gICAge0ZYX0JXU2FvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU2NuLCBGWF9CV1NjbiwgRlhfQldTeGEsIEZYX0JXU3hhLAotICAgICBGWF9CV1NhbywgRlhfQldTYW8sIEZYX0JXU2FvfSwKLSAgICB7RlhfQldTcm8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTcmEsIEZYX0JXU3JlLCBGWF9CV1N4YSwgRlhfQldTeHIsCi0gICAgIEZYX0JXU3JvLCBGWF9CV1NybywgRlhfQldTcnR9LAotICAgIHtGWF9CV1NsbywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NsYSwgRlhfQldTbGUsIEZYX0JXU3hhLCBGWF9CV1N4bCwKLSAgICAgRlhfQldTbG8sIEZYX0JXU2xvLCBGWF9CV1NsdH0sCi0gICAge0ZYX0JXU2FvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU2NuLCBGWF9CV1NjbiwgRlhfQldTeGEsIEZYX0JXU2FvLAotICAgICBGWF9CV1NhbywgRlhfQldTYW8sIEZYX0JXU2FvfSwKLSAgICB7RlhfQldTcm8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTcmEsIEZYX0JXU3JlLCBGWF9CV1N4YSwgRlhfQldTcm8sCi0gICAgIEZYX0JXU3JvLCBGWF9CV1NybywgRlhfQldTcnR9LAotICAgIHtGWF9CV1NsbywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NsYSwgRlhfQldTbGUsIEZYX0JXU3hhLCBGWF9CV1NsbywKLSAgICAgRlhfQldTbG8sIEZYX0JXU2xvLCBGWF9CV1NsdH0sCi0gICAge0ZYX0JXU3JvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU3JhLCBGWF9CV1NyZSwgRlhfQldTeGEsIEZYX0JXU3J0LAotICAgICBGWF9CV1NybywgRlhfQldTcm8sIEZYX0JXU3J0fSwKLSAgICB7RlhfQldTbG8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTbGEsIEZYX0JXU2xlLCBGWF9CV1N4YSwgRlhfQldTbHQsCi0gICAgIEZYX0JXU2xvLCBGWF9CV1NsbywgRlhfQldTbHR9LAotICAgIHtGWF9CV1NhbywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NjbiwgRlhfQldTY24sIEZYX0JXU3hhLCBGWF9CV1NjbiwKLSAgICAgRlhfQldTYWMsIEZYX0JXU2FvLCBGWF9CV1Nhb30sCi0gICAge0ZYX0JXU3JvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU3JhLCBGWF9CV1NyZSwgRlhfQldTeGEsIEZYX0JXU3JhLAotICAgICBGWF9CV1NyYywgRlhfQldTcm8sIEZYX0JXU3J0fSwKLSAgICB7RlhfQldTcm8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTcmEsIEZYX0JXU3JlLCBGWF9CV1N4YSwgRlhfQldTcmUsCi0gICAgIEZYX0JXU3JzLCBGWF9CV1NycywgRlhfQldTcmV0fSwKLSAgICB7RlhfQldTbG8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTbGEsIEZYX0JXU2xlLCBGWF9CV1N4YSwgRlhfQldTbGEsCi0gICAgIEZYX0JXU2xjLCBGWF9CV1NsbywgRlhfQldTbHR9LAotICAgIHtGWF9CV1NsbywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NsYSwgRlhfQldTbGUsIEZYX0JXU3hhLCBGWF9CV1NsZSwKLSAgICAgRlhfQldTbHMsIEZYX0JXU2xzLCBGWF9CV1NsZXR9LAotICAgIHtGWF9CV1NhbywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NjbiwgRlhfQldTY24sIEZYX0JXU3hhLCBGWF9CV1NhbywKLSAgICAgRlhfQldTYW8sIEZYX0JXU2FvLCBGWF9CV1Nhb30sCi0gICAge0ZYX0JXU3JvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU3JhLCBGWF9CV1NyZSwgRlhfQldTeGEsIEZYX0JXU3JvLAotICAgICBGWF9CV1NybywgRlhfQldTcm8sIEZYX0JXU3J0fSwKLSAgICB7RlhfQldTcm8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTcmEsIEZYX0JXU3JlLCBGWF9CV1N4YSwgRlhfQldTcm8sCi0gICAgIEZYX0JXU3JvLCBGWF9CV1NybywgRlhfQldTcnR9LAotICAgIHtGWF9CV1NsbywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NsYSwgRlhfQldTbGUsIEZYX0JXU3hhLCBGWF9CV1NsbywKLSAgICAgRlhfQldTbG8sIEZYX0JXU2xvLCBGWF9CV1NsdH0sCi0gICAge0ZYX0JXU2xvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU2xhLCBGWF9CV1NsZSwgRlhfQldTeGEsIEZYX0JXU2xvLAotICAgICBGWF9CV1NsbywgRlhfQldTbG8sIEZYX0JXU2x0fSwKLSAgICB7RlhfQldTcm8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTcmEsIEZYX0JXU3JlLCBGWF9CV1N4YSwgRlhfQldTcmV0LAotICAgICBGWF9CV1NybywgRlhfQldTcm8sIEZYX0JXU3JldH0sCi0gICAge0ZYX0JXU2xvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU2xhLCBGWF9CV1NsZSwgRlhfQldTeGEsIEZYX0JXU2xldCwKLSAgICAgRlhfQldTbG8sIEZYX0JXU2xvLCBGWF9CV1NsZXR9LAotfTsKLQotY29uc3QgaW50MzJfdCBnY19GWF9CaWRpV2Vha0FjdGlvbnNbXVsxMF0gPSB7Ci0gICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhBLCBGWF9CV0F4eFIsCi0gICAgIEZYX0JXQXh4UiwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXh4Tn0sCi0gICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhFLCBGWF9CV0F4eFIsCi0gICAgIEZYX0JXQXh4UiwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXhJeH0sCi0gICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhMLCBGWF9CV0F4eFIsCi0gICAgIEZYX0JXQXh4TCwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXhJeH0sCi0gICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhBLCBGWF9CV0F4eFIsCi0gICAgIEZYX0JXQXh4TiwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXh4Tn0sCi0gICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhFLCBGWF9CV0F4eFIsCi0gICAgIEZYX0JXQXh4TiwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXhJeH0sCi0gICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhMLCBGWF9CV0F4eFIsCi0gICAgIEZYX0JXQXh4TiwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXhJeH0sCi0gICAge0ZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBRXhFLCBGWF9CV0FOeFIsCi0gICAgIEZYX0JXQXhJeCwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQXhJeH0sCi0gICAge0ZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBTHhMLCBGWF9CV0FOeFIsCi0gICAgIEZYX0JXQXhJeCwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQXhJeH0sCi0gICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhBLCBGWF9CV0F4eFIsCi0gICAgIEZYX0JXQXh4QSwgRlhfQldBeEl4LCBGWF9CV0F4eE4sIEZYX0JXQXh4Tn0sCi0gICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhFLCBGWF9CV0F4eFIsCi0gICAgIEZYX0JXQXh4QSwgRlhfQldBeEl4LCBGWF9CV0F4eE4sIEZYX0JXQXhJeH0sCi0gICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhFLCBGWF9CV0F4eFIsCi0gICAgIEZYX0JXQXh4RSwgRlhfQldBeEl4LCBGWF9CV0F4SXgsIEZYX0JXQXh4RX0sCi0gICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhMLCBGWF9CV0F4eFIsCi0gICAgIEZYX0JXQXh4QSwgRlhfQldBeEl4LCBGWF9CV0F4eE4sIEZYX0JXQXhJeH0sCi0gICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhMLCBGWF9CV0F4eFIsCi0gICAgIEZYX0JXQXh4TCwgRlhfQldBeEl4LCBGWF9CV0F4SXgsIEZYX0JXQXh4TH0sCi0gICAge0ZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQUF4eCwgRlhfQldBQXhBLCBGWF9CV0FOeFIsCi0gICAgIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU54Tn0sCi0gICAge0ZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQUF4eCwgRlhfQldBTnhFLCBGWF9CV0FOeFIsCi0gICAgIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU5JeH0sCi0gICAge0ZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBRXhFLCBGWF9CV0FOeFIsCi0gICAgIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU5JeH0sCi0gICAge0ZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQUF4eCwgRlhfQldBTnhMLCBGWF9CV0FOeFIsCi0gICAgIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU5JeH0sCi0gICAge0ZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBTHhMLCBGWF9CV0FOeFIsCi0gICAgIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0FOeE4sIEZYX0JXQU5JeH0sCi0gICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhFLCBGWF9CV0F4eFIsCi0gICAgIEZYX0JXQXh4RSwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXh4RX0sCi0gICAge0ZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHhMLCBGWF9CV0F4eFIsCi0gICAgIEZYX0JXQXh4TCwgRlhfQldBeHhOLCBGWF9CV0F4eE4sIEZYX0JXQXh4TH0sCi19OwotCi1jb25zdCBpbnQzMl90IGdjX0ZYX0JpZGlOZXV0cmFsU3RhdGVzW11bNV0gPSB7Ci0gICAge0ZYX0JOU3JuLCBGWF9CTlNsLCBGWF9CTlNyLCBGWF9CTlNyLCBGWF9CTlNyfSwKLSAgICB7RlhfQk5TbG4sIEZYX0JOU2wsIEZYX0JOU3IsIEZYX0JOU2EsIEZYX0JOU2x9LAotICAgIHtGWF9CTlNybiwgRlhfQk5TbCwgRlhfQk5TciwgRlhfQk5TciwgRlhfQk5Tcn0sCi0gICAge0ZYX0JOU2xuLCBGWF9CTlNsLCBGWF9CTlNyLCBGWF9CTlNhLCBGWF9CTlNsfSwKLSAgICB7RlhfQk5TbmEsIEZYX0JOU2wsIEZYX0JOU3IsIEZYX0JOU2EsIEZYX0JOU2x9LAotICAgIHtGWF9CTlNuYSwgRlhfQk5TbCwgRlhfQk5TciwgRlhfQk5TYSwgRlhfQk5TbH0sCi19OwotY29uc3QgaW50MzJfdCBnY19GWF9CaWRpTmV1dHJhbEFjdGlvbnNbXVs1XSA9IHsKLSAgICB7RlhfQk5BSW4sIDAsIDAsIDAsIDB9LAotICAgIHtGWF9CTkFJbiwgMCwgMCwgMCwgRlhfQklESUNMQVNTX0x9LAotICAgIHtGWF9CTkFJbiwgRlhfQk5BRW4sIEZYX0JOQVJuLCBGWF9CTkFSbiwgRlhfQk5BUm59LAotICAgIHtGWF9CTkFJbiwgRlhfQk5BTG4sIEZYX0JOQUVuLCBGWF9CTkFFbiwgRlhfQk5BTG5MfSwKLSAgICB7RlhfQk5BSW4sIDAsIDAsIDAsIEZYX0JJRElDTEFTU19MfSwKLSAgICB7RlhfQk5BSW4sIEZYX0JOQUVuLCBGWF9CTkFSbiwgRlhfQk5BUm4sIEZYX0JOQUVufSwKLX07Ci0KLWNvbnN0IGludDMyX3QgZ2NfRlhfQmlkaUFkZExldmVsW11bNF0gPSB7Ci0gICAgezAsIDEsIDIsIDJ9LAotICAgIHsxLCAwLCAxLCAxfSwKLX07Citjb25zdCBGWF9BUkJGT1JNVEFCTEUqIEdldEFyYWJpY0Zvcm1UYWJsZSh3Y2hhcl90IHVuaWNvZGUpIHsKKyAgaWYgKHVuaWNvZGUgPCAweDYyMiB8fCB1bmljb2RlID4gMHg2ZDUpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBnX0ZYX0FyYWJpY0Zvcm1UYWJsZXMgKyB1bmljb2RlIC0gMHg2MjI7Cit9CiAKIGNvbnN0IEZYX0FSQkZPUk1UQUJMRSogUGFyc2VDaGFyKGNvbnN0IENGWF9DaGFyKiBwVEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiYgd0NoYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DSEFSVFlQRSYgZVR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqIHdDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ0hBUlRZUEUqIGVUeXBlKSB7CiAgIGlmICghcFRDKSB7Ci0gICAgZVR5cGUgPSBGWF9DSEFSVFlQRV9Vbmtub3duOwotICAgIHdDaGFyID0gMHhGRUZGOworICAgICplVHlwZSA9IEZYX0NIQVJUWVBFX1Vua25vd247CisgICAgKndDaGFyID0gMHhGRUZGOwogICAgIHJldHVybiBudWxscHRyOwogICB9Ci0gIGVUeXBlID0gcFRDLT5HZXRDaGFyVHlwZSgpOwotICB3Q2hhciA9IChGWF9XQ0hBUilwVEMtPm1fd0NoYXJDb2RlOwotICBjb25zdCBGWF9BUkJGT1JNVEFCTEUqIHBGVCA9IEZYX0dldEFyYWJpY0Zvcm1UYWJsZSh3Q2hhcik7Ci0gIGlmICghcEZUIHx8IGVUeXBlID49IEZYX0NIQVJUWVBFX0FyYWJpY05vcm1hbCkKLSAgICBlVHlwZSA9IEZYX0NIQVJUWVBFX1Vua25vd247CisKKyAgKmVUeXBlID0gcFRDLT5HZXRDaGFyVHlwZSgpOworICAqd0NoYXIgPSBzdGF0aWNfY2FzdDx3Y2hhcl90PihwVEMtPmNoYXJfY29kZSgpKTsKKyAgY29uc3QgRlhfQVJCRk9STVRBQkxFKiBwRlQgPSBHZXRBcmFiaWNGb3JtVGFibGUoKndDaGFyKTsKKyAgaWYgKCFwRlQgfHwgKmVUeXBlID49IEZYX0NIQVJUWVBFX0FyYWJpY05vcm1hbCkKKyAgICAqZVR5cGUgPSBGWF9DSEFSVFlQRV9Vbmtub3duOwogCiAgIHJldHVybiBwRlQ7CiB9CiAKLX0gIC8vIG5hbWVzcGFjZQotCi1jb25zdCBGWF9BUkJGT1JNVEFCTEUqIEZYX0dldEFyYWJpY0Zvcm1UYWJsZShGWF9XQ0hBUiB1bmljb2RlKSB7Ci0gIGlmICh1bmljb2RlIDwgMHg2MjIgfHwgdW5pY29kZSA+IDB4NmQ1KSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgcmV0dXJuIGdfRlhfQXJhYmljRm9ybVRhYmxlcyArIHVuaWNvZGUgLSAweDYyMjsKLX0KLUZYX1dDSEFSIEZYX0dldEFyYWJpY0Zyb21BbGVmVGFibGUoRlhfV0NIQVIgYWxlZikgewotICBzdGF0aWMgY29uc3QgaW50MzJfdCBzX2lBbGVmQ291bnQgPQotICAgICAgc2l6ZW9mKGdzX0ZYX0FsZWZUYWJsZSkgLyBzaXplb2YoRlhfQVJBQUxFRik7Ci0gIGZvciAoaW50MzJfdCBpU3RhcnQgPSAwOyBpU3RhcnQgPCBzX2lBbGVmQ291bnQ7IGlTdGFydCsrKSB7Cit3Y2hhcl90IEdldEFyYWJpY0Zyb21BbGVmVGFibGUod2NoYXJfdCBhbGVmKSB7CisgIHN0YXRpYyBjb25zdCBzaXplX3Qgc19pQWxlZkNvdW50ID0gRlhfQXJyYXlTaXplKGdzX0ZYX0FsZWZUYWJsZSk7CisgIGZvciAoc2l6ZV90IGlTdGFydCA9IDA7IGlTdGFydCA8IHNfaUFsZWZDb3VudDsgaVN0YXJ0KyspIHsKICAgICBjb25zdCBGWF9BUkFBTEVGJiB2ID0gZ3NfRlhfQWxlZlRhYmxlW2lTdGFydF07Ci0gICAgaWYgKHYud0FsZWYgPT0gYWxlZikgeworICAgIGlmICh2LndBbGVmID09IGFsZWYpCiAgICAgICByZXR1cm4gdi53SXNvbGF0ZWQ7Ci0gICAgfQogICB9CiAgIHJldHVybiBhbGVmOwogfQotRlhfV0NIQVIgRlhfR2V0QXJhYmljRnJvbVNoYWRkYVRhYmxlKEZYX1dDSEFSIHNoYWRkYSkgewotICBzdGF0aWMgY29uc3QgaW50MzJfdCBzX2lTaGFkZGFDb3VudCA9Ci0gICAgICBzaXplb2YoZ3NfRlhfU2hhZGRhVGFibGUpIC8gc2l6ZW9mKEZYX0FSQVNIQUREQSk7Ci0gIGZvciAoaW50MzJfdCBpU3RhcnQgPSAwOyBpU3RhcnQgPCBzX2lTaGFkZGFDb3VudDsgaVN0YXJ0KyspIHsKLSAgICBjb25zdCBGWF9BUkFTSEFEREEmIHYgPSBnc19GWF9TaGFkZGFUYWJsZVtpU3RhcnRdOwotICAgIGlmICh2LndTaGFkZGEgPT0gc2hhZGRhKSB7Ci0gICAgICByZXR1cm4gdi53SXNvbGF0ZWQ7Ci0gICAgfQotICB9Ci0gIHJldHVybiBzaGFkZGE7Ci19CisKK30gIC8vIG5hbWVzcGFjZQogCiBuYW1lc3BhY2UgcGRmaXVtIHsKIG5hbWVzcGFjZSBhcmFiaWMgewogCi1ib29sIElzQXJhYmljQ2hhcihGWF9XQ0hBUiB3Y2gpIHsKLSAgdWludDMyX3QgZHdSZXQgPQotICAgICAga1RleHRMYXlvdXRDb2RlUHJvcGVydGllc1sodWludDE2X3Qpd2NoXSAmIEZYX0NIQVJUWVBFQklUU01BU0s7Ci0gIHJldHVybiBkd1JldCA+PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmOwotfQotCi1ib29sIElzQXJhYmljRm9ybUNoYXIoRlhfV0NIQVIgd2NoKSB7Ci0gIHJldHVybiAoa1RleHRMYXlvdXRDb2RlUHJvcGVydGllc1sodWludDE2X3Qpd2NoXSAmIEZYX0NIQVJUWVBFQklUU01BU0spID09Ci0gICAgICAgICBGWF9DSEFSVFlQRV9BcmFiaWNGb3JtOwotfQotCi1GWF9XQ0hBUiBHZXRGb3JtQ2hhcihGWF9XQ0hBUiB3Y2gsIEZYX1dDSEFSIHByZXYsIEZYX1dDSEFSIG5leHQpIHsKLSAgQ0ZYX0NoYXIgYyh3Y2gsIGtUZXh0TGF5b3V0Q29kZVByb3BlcnRpZXNbKHVpbnQxNl90KXdjaF0pOwotICBDRlhfQ2hhciBwKHByZXYsIGtUZXh0TGF5b3V0Q29kZVByb3BlcnRpZXNbKHVpbnQxNl90KXByZXZdKTsKLSAgQ0ZYX0NoYXIgbihuZXh0LCBrVGV4dExheW91dENvZGVQcm9wZXJ0aWVzWyh1aW50MTZfdCluZXh0XSk7Cit3Y2hhcl90IEdldEZvcm1DaGFyKHdjaGFyX3Qgd2NoLCB3Y2hhcl90IHByZXYsIHdjaGFyX3QgbmV4dCkgeworICBDRlhfQ2hhciBjKHdjaCwgRlhfR2V0VW5pY29kZVByb3BlcnRpZXMod2NoKSk7CisgIENGWF9DaGFyIHAocHJldiwgRlhfR2V0VW5pY29kZVByb3BlcnRpZXMocHJldikpOworICBDRlhfQ2hhciBuKG5leHQsIEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKG5leHQpKTsKICAgcmV0dXJuIEdldEZvcm1DaGFyKCZjLCAmcCwgJm4pOwogfQogCi1GWF9XQ0hBUiBHZXRGb3JtQ2hhcihjb25zdCBDRlhfQ2hhciogY3VyLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NoYXIqIHByZXYsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2hhciogbmV4dCkgeword2NoYXJfdCBHZXRGb3JtQ2hhcihjb25zdCBDRlhfQ2hhciogY3VyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2hhciogcHJldiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NoYXIqIG5leHQpIHsKICAgRlhfQ0hBUlRZUEUgZUN1cjsKLSAgRlhfV0NIQVIgd0N1cjsKLSAgY29uc3QgRlhfQVJCRk9STVRBQkxFKiBmdCA9IFBhcnNlQ2hhcihjdXIsIHdDdXIsIGVDdXIpOwotICBpZiAoZUN1ciA8IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYgfHwgZUN1ciA+PSBGWF9DSEFSVFlQRV9BcmFiaWNOb3JtYWwpIHsKKyAgd2NoYXJfdCB3Q3VyOworICBjb25zdCBGWF9BUkJGT1JNVEFCTEUqIGZ0ID0gUGFyc2VDaGFyKGN1ciwgJndDdXIsICZlQ3VyKTsKKyAgaWYgKGVDdXIgPCBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmIHx8IGVDdXIgPj0gRlhfQ0hBUlRZUEVfQXJhYmljTm9ybWFsKQogICAgIHJldHVybiB3Q3VyOwotICB9CisKICAgRlhfQ0hBUlRZUEUgZVByZXY7Ci0gIEZYX1dDSEFSIHdQcmV2OwotICBQYXJzZUNoYXIocHJldiwgd1ByZXYsIGVQcmV2KTsKLSAgaWYgKHdQcmV2ID09IDB4MDY0NCAmJiBlQ3VyID09IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpIHsKKyAgd2NoYXJfdCB3UHJldjsKKyAgUGFyc2VDaGFyKHByZXYsICZ3UHJldiwgJmVQcmV2KTsKKyAgaWYgKHdQcmV2ID09IDB4MDY0NCAmJiBlQ3VyID09IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpCiAgICAgcmV0dXJuIDB4RkVGRjsKLSAgfQorCiAgIEZYX0NIQVJUWVBFIGVOZXh0OwotICBGWF9XQ0hBUiB3TmV4dDsKLSAgUGFyc2VDaGFyKG5leHQsIHdOZXh0LCBlTmV4dCk7CisgIHdjaGFyX3Qgd05leHQ7CisgIFBhcnNlQ2hhcihuZXh0LCAmd05leHQsICZlTmV4dCk7CiAgIGJvb2wgYkFsZWYgPSAoZU5leHQgPT0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZiAmJiB3Q3VyID09IDB4NjQ0KTsKICAgaWYgKGVQcmV2IDwgRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgewotICAgIGlmIChiQWxlZikgewotICAgICAgcmV0dXJuIEZYX0dldEFyYWJpY0Zyb21BbGVmVGFibGUod05leHQpOwotICAgIH0KKyAgICBpZiAoYkFsZWYpCisgICAgICByZXR1cm4gR2V0QXJhYmljRnJvbUFsZWZUYWJsZSh3TmV4dCk7CiAgICAgcmV0dXJuIChlTmV4dCA8IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpID8gZnQtPndJc29sYXRlZCA6IGZ0LT53SW5pdGlhbDsKICAgfQorCiAgIGlmIChiQWxlZikgewotICAgIHdDdXIgPSBGWF9HZXRBcmFiaWNGcm9tQWxlZlRhYmxlKHdOZXh0KTsKKyAgICB3Q3VyID0gR2V0QXJhYmljRnJvbUFsZWZUYWJsZSh3TmV4dCk7CiAgICAgcmV0dXJuIChlUHJldiAhPSBGWF9DSEFSVFlQRV9BcmFiaWNEaXN0b3J0aW9uKSA/IHdDdXIgOiArK3dDdXI7CiAgIH0KLSAgaWYgKGVQcmV2ID09IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYgfHwgZVByZXYgPT0gRlhfQ0hBUlRZUEVfQXJhYmljU3BlY2lhbCkgeworCisgIGlmIChlUHJldiA9PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmIHx8IGVQcmV2ID09IEZYX0NIQVJUWVBFX0FyYWJpY1NwZWNpYWwpCiAgICAgcmV0dXJuIChlTmV4dCA8IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpID8gZnQtPndJc29sYXRlZCA6IGZ0LT53SW5pdGlhbDsKLSAgfQogICByZXR1cm4gKGVOZXh0IDwgRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgPyBmdC0+d0ZpbmFsIDogZnQtPndNZWRpYWw7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhcmFiaWMKIH0gIC8vIG5hbWVzcGFjZSBwZGZpdW0KIAotdm9pZCBGWF9CaWRpUmV2ZXJzZVN0cmluZyhDRlhfV2lkZVN0cmluZyYgd3NUZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQpIHsKLSAgQVNTRVJUKGlTdGFydCA+IC0xICYmIGlTdGFydCA8IHdzVGV4dC5HZXRMZW5ndGgoKSk7Ci0gIEFTU0VSVChpQ291bnQgPj0gMCAmJiBpU3RhcnQgKyBpQ291bnQgPD0gd3NUZXh0LkdldExlbmd0aCgpKTsKLSAgRlhfV0NIQVIgd2NoOwotICBGWF9XQ0hBUiogcFN0YXJ0ID0gY29uc3RfY2FzdDxGWF9XQ0hBUio+KHdzVGV4dC5jX3N0cigpKTsKLSAgcFN0YXJ0ICs9IGlTdGFydDsKLSAgRlhfV0NIQVIqIHBFbmQgPSBwU3RhcnQgKyBpQ291bnQgLSAxOwotICB3aGlsZSAocFN0YXJ0IDwgcEVuZCkgewotICAgIHdjaCA9ICpwU3RhcnQ7Ci0gICAgKnBTdGFydCsrID0gKnBFbmQ7Ci0gICAgKnBFbmQtLSA9IHdjaDsKK3djaGFyX3QgRlhfR2V0QXJhYmljRnJvbVNoYWRkYVRhYmxlKHdjaGFyX3Qgc2hhZGRhKSB7CisgIHN0YXRpYyBjb25zdCBzaXplX3Qgc19pU2hhZGRhQ291bnQgPSBGWF9BcnJheVNpemUoZ3NfRlhfU2hhZGRhVGFibGUpOworICBmb3IgKHNpemVfdCBpU3RhcnQgPSAwOyBpU3RhcnQgPCBzX2lTaGFkZGFDb3VudDsgaVN0YXJ0KyspIHsKKyAgICBjb25zdCBGWF9BUkFTSEFEREEmIHYgPSBnc19GWF9TaGFkZGFUYWJsZVtpU3RhcnRdOworICAgIGlmICh2LndTaGFkZGEgPT0gc2hhZGRhKQorICAgICAgcmV0dXJuIHYud0lzb2xhdGVkOwogICB9Ci19Ci0KLQotaW50MzJfdCBGWF9CaWRpR2V0RGVmZXJyZWROZXV0cmFscyhpbnQzMl90IGlBY3Rpb24sIGludDMyX3QgaUxldmVsKSB7Ci0gIGlBY3Rpb24gPSAoaUFjdGlvbiA+PiA0KSAmIDB4RjsKLSAgaWYgKGlBY3Rpb24gPT0gKEZYX0JJRElORVVUUkFMQUNUSU9OX0VuID4+IDQpKSB7Ci0gICAgcmV0dXJuIEZYX0JpZGlEaXJlY3Rpb24oaUxldmVsKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gaUFjdGlvbjsKLSAgfQotfQotCi1pbnQzMl90IEZYX0JpZGlHZXRSZXNvbHZlZE5ldXRyYWxzKGludDMyX3QgaUFjdGlvbikgewotICBpQWN0aW9uID0gKGlBY3Rpb24gJiAweEYpOwotICBpZiAoaUFjdGlvbiA9PSBGWF9CSURJTkVVVFJBTEFDVElPTl9JbikgewotICAgIHJldHVybiAwOwotICB9IGVsc2UgewotICAgIHJldHVybiBpQWN0aW9uOwotICB9Ci19Ci0KLWludDMyX3QgRlhfQmlkaVJlb3JkZXJMZXZlbChpbnQzMl90IGlCYXNlTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiYgbGV2ZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJldmVyc2UpIHsKLSAgQVNTRVJUKGlCYXNlTGV2ZWwgPj0gMCAmJiBpQmFzZUxldmVsIDw9IEZYX0JJRElNQVhMRVZFTCk7Ci0gIEFTU0VSVCh3c1RleHQuR2V0TGVuZ3RoKCkgPT0gbGV2ZWxzLkdldFNpemUoKSk7Ci0gIEFTU0VSVChpU3RhcnQgPj0gMCAmJiBpU3RhcnQgPCB3c1RleHQuR2V0TGVuZ3RoKCkpOwotICBpbnQzMl90IGlTaXplID0gd3NUZXh0LkdldExlbmd0aCgpOwotICBpZiAoaVNpemUgPCAxKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgYlJldmVyc2UgPSBiUmV2ZXJzZSB8fCBGWF9Jc09kZChpQmFzZUxldmVsKTsKLSAgaW50MzJfdCBpID0gaVN0YXJ0LCBpTGV2ZWw7Ci0gIGZvciAoOyBpIDwgaVNpemU7IGkrKykgewotICAgIGlmICgoaUxldmVsID0gbGV2ZWxzLkdldEF0KGkpKSA9PSBpQmFzZUxldmVsKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKGlMZXZlbCA8IGlCYXNlTGV2ZWwpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpICs9IEZYX0JpZGlSZW9yZGVyTGV2ZWwoaUJhc2VMZXZlbCArIDEsIHdzVGV4dCwgbGV2ZWxzLCBpLCBiUmV2ZXJzZSkgLSAxOwotICB9Ci0gIGludDMyX3QgaUNvdW50ID0gaSAtIGlTdGFydDsKLSAgaWYgKGJSZXZlcnNlICYmIGlDb3VudCA+IDEpIHsKLSAgICBGWF9CaWRpUmV2ZXJzZVN0cmluZyh3c1RleHQsIGlTdGFydCwgaUNvdW50KTsKLSAgfQotICByZXR1cm4gaUNvdW50OwotfQotdm9pZCBGWF9CaWRpUmVvcmRlcihpbnQzMl90IGlCYXNlTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+JiBsZXZlbHMpIHsKLSAgQVNTRVJUKGlCYXNlTGV2ZWwgPj0gMCAmJiBpQmFzZUxldmVsIDw9IEZYX0JJRElNQVhMRVZFTCk7Ci0gIEFTU0VSVCh3c1RleHQuR2V0TGVuZ3RoKCkgPT0gbGV2ZWxzLkdldFNpemUoKSk7Ci0gIGludDMyX3QgaVNpemUgPSB3c1RleHQuR2V0TGVuZ3RoKCk7Ci0gIGlmIChpU2l6ZSA8IDEpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50MzJfdCBpID0gMDsKLSAgd2hpbGUgKGkgPCBpU2l6ZSkgewotICAgIGkgKz0gRlhfQmlkaVJlb3JkZXJMZXZlbChpQmFzZUxldmVsLCB3c1RleHQsIGxldmVscywgaSwgZmFsc2UpOwotICB9Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4KLWNsYXNzIENGWF9CaWRpTGluZVRlbXBsYXRlIHsKLSBwdWJsaWM6Ci0gIHZvaWQgRlhfQmlkaVJldmVyc2VTdHJpbmcoc3RkOjp2ZWN0b3I8YmFzZVR5cGU+JiBjaGFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCkgewotICAgIEFTU0VSVChpU3RhcnQgPj0gMCAmJiBpU3RhcnQgPCBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KGNoYXJzKSk7Ci0gICAgQVNTRVJUKGlDb3VudCA+PSAwICYmCi0gICAgICAgICAgIGlTdGFydCArIGlDb3VudCA8PSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KGNoYXJzKSk7Ci0gICAgc3RkOjpyZXZlcnNlKGNoYXJzLmJlZ2luKCkgKyBpU3RhcnQsIGNoYXJzLmJlZ2luKCkgKyBpU3RhcnQgKyBpQ291bnQpOwotICB9Ci0KLSAgdm9pZCBGWF9CaWRpU2V0RGVmZXJyZWRSdW4oc3RkOjp2ZWN0b3I8YmFzZVR5cGU+JiBjaGFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWUpIHsKLSAgICBBU1NFUlQoaVN0YXJ0ID49IDAgJiYgaVN0YXJ0IDw9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4oY2hhcnMpKTsKLSAgICBBU1NFUlQoaVN0YXJ0IC0gaUNvdW50ID4gLTEpOwotICAgIGludDMyX3QgaUxhc3QgPSBpU3RhcnQgLSBpQ291bnQ7Ci0gICAgaWYgKGJDbGFzcykgewotICAgICAgZm9yIChpbnQzMl90IGkgPSBpU3RhcnQgLSAxOyBpID49IGlMYXN0OyBpLS0pCi0gICAgICAgIGNoYXJzW2ldLm1faUJpZGlDbGFzcyA9IChpbnQxNl90KWlWYWx1ZTsKLSAgICB9IGVsc2UgewotICAgICAgZm9yIChpbnQzMl90IGkgPSBpU3RhcnQgLSAxOyBpID49IGlMYXN0OyBpLS0pCi0gICAgICAgIGNoYXJzW2ldLm1faUJpZGlMZXZlbCA9IChpbnQxNl90KWlWYWx1ZTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIEZYX0JpZGlDbGFzc2lmeShzdGQ6OnZlY3RvcjxiYXNlVHlwZT4mIGNoYXJzLCBpbnQzMl90IGlDb3VudCwgYm9vbCBiV1MpIHsKLSAgICBBU1NFUlQoaUNvdW50ID49IDAgJiYgaUNvdW50IDw9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4oY2hhcnMpKTsKLSAgICBpZiAoYldTKSB7Ci0gICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgewotICAgICAgICBjaGFyc1tpXS5tX2lCaWRpQ2xhc3MgPQotICAgICAgICAgICAgKGludDE2X3QpKGNoYXJzW2ldLm1fZHdDaGFyUHJvcHMgJiBGWF9CSURJQ0xBU1NCSVRTTUFTSykgPj4KLSAgICAgICAgICAgIEZYX0JJRElDTEFTU0JJVFM7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7Ci0gICAgICAgIGNoYXJzW2ldLm1faUJpZGlDbGFzcyA9IChpbnQxNl90KQotICAgICAgICAgICAgZ2NfRlhfQmlkaU5UeXBlc1soY2hhcnNbaV0ubV9kd0NoYXJQcm9wcyAmIEZYX0JJRElDTEFTU0JJVFNNQVNLKSA+PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9CSURJQ0xBU1NCSVRTXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIEZYX0JpZGlSZXNvbHZlRXhwbGljaXQoc3RkOjp2ZWN0b3I8YmFzZVR5cGU+JiBjaGFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQmFzZUxldmVsKSB7Ci0gICAgQVNTRVJUKGlDb3VudCA+PSAwICYmIGlDb3VudCA8PSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KGNoYXJzKSk7Ci0gICAgQVNTRVJUKGlCYXNlTGV2ZWwgPj0gMCAmJiBpQmFzZUxldmVsIDw9IEZYX0JJRElNQVhMRVZFTCk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspCi0gICAgICBjaGFyc1tpXS5tX2lCaWRpTGV2ZWwgPSBzdGF0aWNfY2FzdDxpbnQxNl90PihpQmFzZUxldmVsKTsKLSAgfQotCi0gIHZvaWQgRlhfQmlkaVJlc29sdmVXZWFrKHN0ZDo6dmVjdG9yPGJhc2VUeXBlPiYgY2hhcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCYXNlTGV2ZWwpIHsKLSAgICBBU1NFUlQoaUNvdW50ID49IDAgJiYgaUNvdW50IDw9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4oY2hhcnMpKTsKLSAgICBpQ291bnQtLTsKLSAgICBpZiAoaUNvdW50IDwgMSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBiYXNlVHlwZSAqcFRDLCAqcFRDTmV4dDsKLSAgICBpbnQzMl90IGlMZXZlbEN1ciA9IGlCYXNlTGV2ZWw7Ci0gICAgaW50MzJfdCBpU3RhdGUgPSBGWF9Jc09kZChpQmFzZUxldmVsKSA/IEZYX0JXU3hyIDogRlhfQldTeGw7Ci0gICAgaW50MzJfdCBpID0gMCwgaU51bSA9IDAsIGlDbHNDdXIsIGlDbHNSdW4sIGlDbHNOZXcsIGlBY3Rpb247Ci0gICAgZm9yICg7IGkgPD0gaUNvdW50OyBpKyspIHsKLSAgICAgIHBUQyA9ICZjaGFyc1tpXTsKLSAgICAgIGlDbHNDdXIgPSBwVEMtPm1faUJpZGlDbGFzczsKLSAgICAgIGlmIChpQ2xzQ3VyID09IEZYX0JJRElDTEFTU19CTikgewotICAgICAgICBwVEMtPm1faUJpZGlMZXZlbCA9IChpbnQxNl90KWlMZXZlbEN1cjsKLSAgICAgICAgaWYgKGkgPT0gaUNvdW50ICYmIGlMZXZlbEN1ciAhPSBpQmFzZUxldmVsKSB7Ci0gICAgICAgICAgaUNsc0N1ciA9IEZYX0JpZGlEaXJlY3Rpb24oaUxldmVsQ3VyKTsKLSAgICAgICAgICBwVEMtPm1faUJpZGlDbGFzcyA9IChpbnQxNl90KWlDbHNDdXI7Ci0gICAgICAgIH0gZWxzZSBpZiAoaSA8IGlDb3VudCkgewotICAgICAgICAgIHBUQ05leHQgPSAmY2hhcnNbaSArIDFdOwotICAgICAgICAgIGludDMyX3QgaUxldmVsTmV4dCwgaUxldmVsTmV3OwotICAgICAgICAgIGlDbHNOZXcgPSBwVENOZXh0LT5tX2lCaWRpQ2xhc3M7Ci0gICAgICAgICAgaUxldmVsTmV4dCA9IHBUQ05leHQtPm1faUJpZGlMZXZlbDsKLSAgICAgICAgICBpZiAoaUNsc05ldyAhPSBGWF9CSURJQ0xBU1NfQk4gJiYgaUxldmVsQ3VyICE9IGlMZXZlbE5leHQpIHsKLSAgICAgICAgICAgIGlMZXZlbE5ldyA9IGlMZXZlbE5leHQ7Ci0gICAgICAgICAgICBpZiAoaUxldmVsQ3VyID4gaUxldmVsTmV3KSB7Ci0gICAgICAgICAgICAgIGlMZXZlbE5ldyA9IGlMZXZlbEN1cjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBUQy0+bV9pQmlkaUxldmVsID0gKGludDE2X3QpaUxldmVsTmV3OwotICAgICAgICAgICAgaUNsc0N1ciA9IEZYX0JpZGlEaXJlY3Rpb24oaUxldmVsTmV3KTsKLSAgICAgICAgICAgIHBUQy0+bV9pQmlkaUNsYXNzID0gKGludDE2X3QpaUNsc0N1cjsKLSAgICAgICAgICAgIGlMZXZlbEN1ciA9IGlMZXZlbE5leHQ7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChpTnVtID4gMCkgewotICAgICAgICAgICAgICBpTnVtKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKGlOdW0gPiAwKSB7Ci0gICAgICAgICAgICBpTnVtKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBBU1NFUlQoaUNsc0N1ciA8PSBGWF9CSURJQ0xBU1NfQk4pOwotICAgICAgaUFjdGlvbiA9IGdjX0ZYX0JpZGlXZWFrQWN0aW9uc1tpU3RhdGVdW2lDbHNDdXJdOwotICAgICAgaUNsc1J1biA9IEZYX0JpZGlHZXREZWZlcnJlZFR5cGUoaUFjdGlvbik7Ci0gICAgICBpZiAoaUNsc1J1biAhPSBGWF9CSURJV0VBS0FDVElPTl9YWCAmJiBpTnVtID4gMCkgewotICAgICAgICBGWF9CaWRpU2V0RGVmZXJyZWRSdW4oY2hhcnMsIHRydWUsIGksIGlOdW0sIGlDbHNSdW4pOwotICAgICAgICBpTnVtID0gMDsKLSAgICAgIH0KLSAgICAgIGlDbHNOZXcgPSBGWF9CaWRpR2V0UmVzb2x2ZWRUeXBlKGlBY3Rpb24pOwotICAgICAgaWYgKGlDbHNOZXcgIT0gRlhfQklESVdFQUtBQ1RJT05fWFgpIHsKLSAgICAgICAgcFRDLT5tX2lCaWRpQ2xhc3MgPSAoaW50MTZfdClpQ2xzTmV3OwotICAgICAgfQotICAgICAgaWYgKEZYX0JJRElXRUFLQUNUSU9OX0lYICYgaUFjdGlvbikgewotICAgICAgICBpTnVtKys7Ci0gICAgICB9Ci0gICAgICBpU3RhdGUgPSBnY19GWF9CaWRpV2Vha1N0YXRlc1tpU3RhdGVdW2lDbHNDdXJdOwotICAgIH0KLSAgICBpZiAoaU51bSA+IDApIHsKLSAgICAgIGlDbHNDdXIgPSBGWF9CaWRpRGlyZWN0aW9uKGlCYXNlTGV2ZWwpOwotICAgICAgaUNsc1J1biA9IEZYX0JpZGlHZXREZWZlcnJlZFR5cGUoZ2NfRlhfQmlkaVdlYWtBY3Rpb25zW2lTdGF0ZV1baUNsc0N1cl0pOwotICAgICAgaWYgKGlDbHNSdW4gIT0gRlhfQklESVdFQUtBQ1RJT05fWFgpIHsKLSAgICAgICAgRlhfQmlkaVNldERlZmVycmVkUnVuKGNoYXJzLCB0cnVlLCBpLCBpTnVtLCBpQ2xzUnVuKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIEZYX0JpZGlSZXNvbHZlTmV1dHJhbHMoc3RkOjp2ZWN0b3I8YmFzZVR5cGU+JiBjaGFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQmFzZUxldmVsKSB7Ci0gICAgQVNTRVJUKGlDb3VudCA+PSAwICYmIGlDb3VudCA8PSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KGNoYXJzKSk7Ci0gICAgQVNTRVJUKGlCYXNlTGV2ZWwgPj0gMCAmJiBpQmFzZUxldmVsIDw9IEZYX0JJRElNQVhMRVZFTCk7Ci0gICAgaUNvdW50LS07Ci0gICAgaWYgKGlDb3VudCA8IDEpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYmFzZVR5cGUqIHBUQzsKLSAgICBpbnQzMl90IGlMZXZlbCA9IGlCYXNlTGV2ZWw7Ci0gICAgaW50MzJfdCBpU3RhdGUgPSBGWF9Jc09kZChpQmFzZUxldmVsKSA/IEZYX0JOU3IgOiBGWF9CTlNsOwotICAgIGludDMyX3QgaSA9IDAsIGlOdW0gPSAwLCBpQ2xzQ3VyLCBpQ2xzUnVuLCBpQ2xzTmV3LCBpQWN0aW9uOwotICAgIGZvciAoOyBpIDw9IGlDb3VudDsgaSsrKSB7Ci0gICAgICBwVEMgPSAmY2hhcnNbaV07Ci0gICAgICBpQ2xzQ3VyID0gcFRDLT5tX2lCaWRpQ2xhc3M7Ci0gICAgICBpZiAoaUNsc0N1ciA9PSBGWF9CSURJQ0xBU1NfQk4pIHsKLSAgICAgICAgaWYgKGlOdW0pIHsKLSAgICAgICAgICBpTnVtKys7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBBU1NFUlQoaUNsc0N1ciA8IEZYX0JJRElDTEFTU19BTCk7Ci0gICAgICBpQWN0aW9uID0gZ2NfRlhfQmlkaU5ldXRyYWxBY3Rpb25zW2lTdGF0ZV1baUNsc0N1cl07Ci0gICAgICBpQ2xzUnVuID0gRlhfQmlkaUdldERlZmVycmVkTmV1dHJhbHMoaUFjdGlvbiwgaUxldmVsKTsKLSAgICAgIGlmIChpQ2xzUnVuICE9IEZYX0JJRElDTEFTU19OICYmIGlOdW0gPiAwKSB7Ci0gICAgICAgIEZYX0JpZGlTZXREZWZlcnJlZFJ1bihjaGFycywgdHJ1ZSwgaSwgaU51bSwgaUNsc1J1bik7Ci0gICAgICAgIGlOdW0gPSAwOwotICAgICAgfQotICAgICAgaUNsc05ldyA9IEZYX0JpZGlHZXRSZXNvbHZlZE5ldXRyYWxzKGlBY3Rpb24pOwotICAgICAgaWYgKGlDbHNOZXcgIT0gRlhfQklESUNMQVNTX04pIHsKLSAgICAgICAgcFRDLT5tX2lCaWRpQ2xhc3MgPSAoaW50MTZfdClpQ2xzTmV3OwotICAgICAgfQotICAgICAgaWYgKEZYX0JJRElORVVUUkFMQUNUSU9OX0luICYgaUFjdGlvbikgewotICAgICAgICBpTnVtKys7Ci0gICAgICB9Ci0gICAgICBpU3RhdGUgPSBnY19GWF9CaWRpTmV1dHJhbFN0YXRlc1tpU3RhdGVdW2lDbHNDdXJdOwotICAgICAgaUxldmVsID0gcFRDLT5tX2lCaWRpTGV2ZWw7Ci0gICAgfQotICAgIGlmIChpTnVtID4gMCkgewotICAgICAgaUNsc0N1ciA9IEZYX0JpZGlEaXJlY3Rpb24oaUxldmVsKTsKLSAgICAgIGlDbHNSdW4gPSBGWF9CaWRpR2V0RGVmZXJyZWROZXV0cmFscygKLSAgICAgICAgICBnY19GWF9CaWRpTmV1dHJhbEFjdGlvbnNbaVN0YXRlXVtpQ2xzQ3VyXSwgaUxldmVsKTsKLSAgICAgIGlmIChpQ2xzUnVuICE9IEZYX0JJRElDTEFTU19OKSB7Ci0gICAgICAgIEZYX0JpZGlTZXREZWZlcnJlZFJ1bihjaGFycywgdHJ1ZSwgaSwgaU51bSwgaUNsc1J1bik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBGWF9CaWRpUmVzb2x2ZUltcGxpY2l0KHN0ZDo6dmVjdG9yPGJhc2VUeXBlPiYgY2hhcnMsIGludDMyX3QgaUNvdW50KSB7Ci0gICAgQVNTRVJUKGlDb3VudCA+PSAwICYmIGlDb3VudCA8PSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KGNoYXJzKSk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKLSAgICAgIGludDMyX3QgaUNscyA9IGNoYXJzW2ldLm1faUJpZGlDbGFzczsKLSAgICAgIGlmIChpQ2xzID09IEZYX0JJRElDTEFTU19CTikgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIEFTU0VSVChpQ2xzID4gRlhfQklESUNMQVNTX09OICYmIGlDbHMgPCBGWF9CSURJQ0xBU1NfQUwpOwotICAgICAgaW50MzJfdCBpTGV2ZWwgPSBjaGFyc1tpXS5tX2lCaWRpTGV2ZWw7Ci0gICAgICBpTGV2ZWwgKz0gZ2NfRlhfQmlkaUFkZExldmVsW0ZYX0lzT2RkKGlMZXZlbCldW2lDbHMgLSAxXTsKLSAgICAgIGNoYXJzW2ldLm1faUJpZGlMZXZlbCA9IChpbnQxNl90KWlMZXZlbDsKLSAgICB9Ci0gIH0KLQotICB2b2lkIEZYX0JpZGlSZXNvbHZlV2hpdGVzcGFjZShzdGQ6OnZlY3RvcjxiYXNlVHlwZT4mIGNoYXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQmFzZUxldmVsKSB7Ci0gICAgQVNTRVJUKGlDb3VudCA+PSAwICYmIGlDb3VudCA8PSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KGNoYXJzKSk7Ci0gICAgQVNTRVJUKGlCYXNlTGV2ZWwgPj0gMCAmJiBpQmFzZUxldmVsIDw9IEZYX0JJRElNQVhMRVZFTCk7Ci0gICAgaWYgKGlDb3VudCA8IDEpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaUNvdW50LS07Ci0gICAgaW50MzJfdCBpTGV2ZWwgPSBpQmFzZUxldmVsOwotICAgIGludDMyX3QgaSA9IDAsIGlOdW0gPSAwOwotICAgIGZvciAoOyBpIDw9IGlDb3VudDsgaSsrKSB7Ci0gICAgICBzd2l0Y2ggKGNoYXJzW2ldLm1faUJpZGlDbGFzcykgewotICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19XUzoKLSAgICAgICAgICBpTnVtKys7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlhfQklESUNMQVNTX1JMRToKLSAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfTFJFOgotICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19MUk86Ci0gICAgICAgIGNhc2UgRlhfQklESUNMQVNTX1JMTzoKLSAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfUERGOgotICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19CTjoKLSAgICAgICAgICBjaGFyc1tpXS5tX2lCaWRpTGV2ZWwgPSAoaW50MTZfdClpTGV2ZWw7Ci0gICAgICAgICAgaU51bSsrOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19TOgotICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19COgotICAgICAgICAgIGlmIChpTnVtID4gMCkgewotICAgICAgICAgICAgRlhfQmlkaVNldERlZmVycmVkUnVuKGNoYXJzLCBmYWxzZSwgaSwgaU51bSwgaUJhc2VMZXZlbCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNoYXJzW2ldLm1faUJpZGlMZXZlbCA9IChpbnQxNl90KWlCYXNlTGV2ZWw7Ci0gICAgICAgICAgaU51bSA9IDA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgaU51bSA9IDA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpTGV2ZWwgPSBjaGFyc1tpXS5tX2lCaWRpTGV2ZWw7Ci0gICAgfQotICAgIGlmIChpTnVtID4gMCkgewotICAgICAgRlhfQmlkaVNldERlZmVycmVkUnVuKGNoYXJzLCBmYWxzZSwgaSwgaU51bSwgaUJhc2VMZXZlbCk7Ci0gICAgfQotICB9Ci0KLSAgaW50MzJfdCBGWF9CaWRpUmVvcmRlckxldmVsKHN0ZDo6dmVjdG9yPGJhc2VUeXBlPiYgY2hhcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJhc2VMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmV2ZXJzZSkgewotICAgIEFTU0VSVChpQ291bnQgPj0gMCAmJiBpQ291bnQgPD0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihjaGFycykpOwotICAgIEFTU0VSVChpQmFzZUxldmVsID49IDAgJiYgaUJhc2VMZXZlbCA8PSBGWF9CSURJTUFYTEVWRUwpOwotICAgIEFTU0VSVChpU3RhcnQgPj0gMCAmJiBpU3RhcnQgPCBpQ291bnQpOwotICAgIGlmIChpQ291bnQgPCAxKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgYlJldmVyc2UgPSBiUmV2ZXJzZSB8fCBGWF9Jc09kZChpQmFzZUxldmVsKTsKLSAgICBpbnQzMl90IGkgPSBpU3RhcnQ7Ci0gICAgZm9yICg7IGkgPCBpQ291bnQ7IGkrKykgewotICAgICAgaW50MzJfdCBpTGV2ZWwgPSBjaGFyc1tpXS5tX2lCaWRpTGV2ZWw7Ci0gICAgICBpZiAoaUxldmVsID09IGlCYXNlTGV2ZWwpCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgaWYgKGlMZXZlbCA8IGlCYXNlTGV2ZWwpCi0gICAgICAgIGJyZWFrOwotICAgICAgaSArPSBGWF9CaWRpUmVvcmRlckxldmVsKGNoYXJzLCBpQ291bnQsIGlCYXNlTGV2ZWwgKyAxLCBpLCBiUmV2ZXJzZSkgLSAxOwotICAgIH0KLSAgICBpbnQzMl90IGlOdW0gPSBpIC0gaVN0YXJ0OwotICAgIGlmIChiUmV2ZXJzZSAmJiBpTnVtID4gMSkgewotICAgICAgRlhfQmlkaVJldmVyc2VTdHJpbmcoY2hhcnMsIGlTdGFydCwgaU51bSk7Ci0gICAgfQotICAgIHJldHVybiBpTnVtOwotICB9Ci0KLSAgdm9pZCBGWF9CaWRpUmVvcmRlcihzdGQ6OnZlY3RvcjxiYXNlVHlwZT4mIGNoYXJzLAotICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJhc2VMZXZlbCkgewotICAgIEFTU0VSVChpQ291bnQgPj0gMCAmJiBpQ291bnQgPD0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihjaGFycykpOwotICAgIEFTU0VSVChpQmFzZUxldmVsID49IDAgJiYgaUJhc2VMZXZlbCA8PSBGWF9CSURJTUFYTEVWRUwpOwotICAgIGludDMyX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGkgPCBpQ291bnQpIHsKLSAgICAgIGkgKz0gRlhfQmlkaVJlb3JkZXJMZXZlbChjaGFycywgaUNvdW50LCBpQmFzZUxldmVsLCBpLCBmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBGWF9CaWRpUG9zaXRpb24oc3RkOjp2ZWN0b3I8YmFzZVR5cGU+JiBjaGFycywgaW50MzJfdCBpQ291bnQpIHsKLSAgICBBU1NFUlQoaUNvdW50ID49IDAgJiYgaUNvdW50IDw9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4oY2hhcnMpKTsKLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7ICsraSkKLSAgICAgIGNoYXJzW2NoYXJzW2ldLm1faUJpZGlQb3NdLm1faUJpZGlPcmRlciA9IGk7Ci0gIH0KLQotICB2b2lkIEZYX0JpZGlMaW5lKHN0ZDo6dmVjdG9yPGJhc2VUeXBlPiYgY2hhcnMsCi0gICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQsCi0gICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQmFzZUxldmVsKSB7Ci0gICAgQVNTRVJUKGlDb3VudCA+PSAwICYmIGlDb3VudCA8PSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KGNoYXJzKSk7Ci0gICAgaWYgKGlDb3VudCA8IDIpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRlhfQmlkaUNsYXNzaWZ5KGNoYXJzLCBpQ291bnQsIGZhbHNlKTsKLSAgICBGWF9CaWRpUmVzb2x2ZUV4cGxpY2l0KGNoYXJzLCBpQ291bnQsIGlCYXNlTGV2ZWwpOwotICAgIEZYX0JpZGlSZXNvbHZlV2VhayhjaGFycywgaUNvdW50LCBpQmFzZUxldmVsKTsKLSAgICBGWF9CaWRpUmVzb2x2ZU5ldXRyYWxzKGNoYXJzLCBpQ291bnQsIGlCYXNlTGV2ZWwpOwotICAgIEZYX0JpZGlSZXNvbHZlSW1wbGljaXQoY2hhcnMsIGlDb3VudCk7Ci0gICAgRlhfQmlkaUNsYXNzaWZ5KGNoYXJzLCBpQ291bnQsIHRydWUpOwotICAgIEZYX0JpZGlSZXNvbHZlV2hpdGVzcGFjZShjaGFycywgaUNvdW50LCBpQmFzZUxldmVsKTsKLSAgICBGWF9CaWRpUmVvcmRlcihjaGFycywgaUNvdW50LCBpQmFzZUxldmVsKTsKLSAgICBGWF9CaWRpUG9zaXRpb24oY2hhcnMsIGlDb3VudCk7Ci0gIH0KLX07Ci0KLXZvaWQgRlhfQmlkaUxpbmUoc3RkOjp2ZWN0b3I8Q0ZYX1R4dENoYXI+JiBjaGFycywKLSAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQsCi0gICAgICAgICAgICAgICAgIGludDMyX3QgaUJhc2VMZXZlbCkgewotICBDRlhfQmlkaUxpbmVUZW1wbGF0ZTxDRlhfVHh0Q2hhcj4gYmx0OwotICBibHQuRlhfQmlkaUxpbmUoY2hhcnMsIGlDb3VudCwgaUJhc2VMZXZlbCk7Ci19Ci12b2lkIEZYX0JpZGlMaW5lKHN0ZDo6dmVjdG9yPENGWF9SVEZDaGFyPiYgY2hhcnMsCi0gICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LAotICAgICAgICAgICAgICAgICBpbnQzMl90IGlCYXNlTGV2ZWwpIHsKLSAgQ0ZYX0JpZGlMaW5lVGVtcGxhdGU8Q0ZYX1JURkNoYXI+IGJsdDsKLSAgYmx0LkZYX0JpZGlMaW5lKGNoYXJzLCBpQ291bnQsIGlCYXNlTGV2ZWwpOworICByZXR1cm4gc2hhZGRhOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF9hcmFiaWMuaCBiL2NvcmUvZnhjcnQvZnhfYXJhYmljLmgKaW5kZXggZTdiYTA3OS4uOWQyM2IxNSAxMDA2NDQKLS0tIGEvY29yZS9meGNydC9meF9hcmFiaWMuaAorKysgYi9jb3JlL2Z4Y3J0L2Z4X2FyYWJpYy5oCkBAIC03LDE4MiArNywyMiBAQAogI2lmbmRlZiBDT1JFX0ZYQ1JUX0ZYX0FSQUJJQ19IXwogI2RlZmluZSBDT1JFX0ZYQ1JUX0ZYX0FSQUJJQ19IXwogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9hcmIuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNkZWZpbmUgRlhfQklESU1BWExFVkVMIDYxCi0jZGVmaW5lIEZYX0JpZGlEaXJlY3Rpb24oYSkgKEZYX0lzT2RkKGEpID8gRlhfQklESUNMQVNTX1IgOiBGWF9CSURJQ0xBU1NfTCkKLSNkZWZpbmUgRlhfQmlkaUdldERlZmVycmVkVHlwZShhKSAoKChhKSA+PiA0KSAmIDB4MEYpCi0jZGVmaW5lIEZYX0JpZGlHZXRSZXNvbHZlZFR5cGUoYSkgKChhKSYweDBGKQorI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X2NoYXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgogCiBuYW1lc3BhY2UgcGRmaXVtIHsKIG5hbWVzcGFjZSBhcmFiaWMgewogCi1ib29sIElzQXJhYmljQ2hhcihGWF9XQ0hBUiB3Y2gpOwotYm9vbCBJc0FyYWJpY0Zvcm1DaGFyKEZYX1dDSEFSIHdjaCk7Ci1GWF9XQ0hBUiBHZXRGb3JtQ2hhcihGWF9XQ0hBUiB3Y2gsIEZYX1dDSEFSIHByZXYgPSAwLCBGWF9XQ0hBUiBuZXh0ID0gMCk7Ci1GWF9XQ0hBUiBHZXRGb3JtQ2hhcihjb25zdCBDRlhfQ2hhciogY3VyLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NoYXIqIHByZXYsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2hhciogbmV4dCk7Cit3Y2hhcl90IEdldEZvcm1DaGFyKHdjaGFyX3Qgd2NoLCB3Y2hhcl90IHByZXYsIHdjaGFyX3QgbmV4dCk7Cit3Y2hhcl90IEdldEZvcm1DaGFyKGNvbnN0IENGWF9DaGFyKiBjdXIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9DaGFyKiBwcmV2LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2hhciogbmV4dCk7CiAKIH0gIC8vIG5hbWVzcGFjZSBhcmFiaWMKIH0gIC8vIG5hbWVzcGFjZSBwZGZpdW0KIAotdm9pZCBGWF9CaWRpUmV2ZXJzZVN0cmluZyhDRlhfV2lkZVN0cmluZyYgd3NUZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQpOwotdm9pZCBGWF9CaWRpU2V0RGVmZXJyZWRSdW4oQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4mIHZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZSk7Ci12b2lkIEZYX0JpZGlDbGFzc2lmeShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0LAotICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4mIGNsYXNzZXMsCi0gICAgICAgICAgICAgICAgICAgICBib29sIGJXUyA9IGZhbHNlKTsKLWludDMyX3QgRlhfQmlkaVJlc29sdmVFeHBsaWNpdChpbnQzMl90IGlCYXNlTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGlyZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+JiBjbGFzc2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+JiBsZXZlbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTmVzdCA9IDApOwotCi1lbnVtIEZYX0JJRElXRUFLU1RBVEUgewotICBGWF9CSURJV0VBS1NUQVRFX3hhID0gMCwKLSAgRlhfQklESVdFQUtTVEFURV94ciwKLSAgRlhfQklESVdFQUtTVEFURV94bCwKLSAgRlhfQklESVdFQUtTVEFURV9hbywKLSAgRlhfQklESVdFQUtTVEFURV9ybywKLSAgRlhfQklESVdFQUtTVEFURV9sbywKLSAgRlhfQklESVdFQUtTVEFURV9ydCwKLSAgRlhfQklESVdFQUtTVEFURV9sdCwKLSAgRlhfQklESVdFQUtTVEFURV9jbiwKLSAgRlhfQklESVdFQUtTVEFURV9yYSwKLSAgRlhfQklESVdFQUtTVEFURV9yZSwKLSAgRlhfQklESVdFQUtTVEFURV9sYSwKLSAgRlhfQklESVdFQUtTVEFURV9sZSwKLSAgRlhfQklESVdFQUtTVEFURV9hYywKLSAgRlhfQklESVdFQUtTVEFURV9yYywKLSAgRlhfQklESVdFQUtTVEFURV9ycywKLSAgRlhfQklESVdFQUtTVEFURV9sYywKLSAgRlhfQklESVdFQUtTVEFURV9scywKLSAgRlhfQklESVdFQUtTVEFURV9yZXQsCi0gIEZYX0JJRElXRUFLU1RBVEVfbGV0LAotfTsKLSNkZWZpbmUgRlhfQldTeGEgRlhfQklESVdFQUtTVEFURV94YQotI2RlZmluZSBGWF9CV1N4ciBGWF9CSURJV0VBS1NUQVRFX3hyCi0jZGVmaW5lIEZYX0JXU3hsIEZYX0JJRElXRUFLU1RBVEVfeGwKLSNkZWZpbmUgRlhfQldTYW8gRlhfQklESVdFQUtTVEFURV9hbwotI2RlZmluZSBGWF9CV1NybyBGWF9CSURJV0VBS1NUQVRFX3JvCi0jZGVmaW5lIEZYX0JXU2xvIEZYX0JJRElXRUFLU1RBVEVfbG8KLSNkZWZpbmUgRlhfQldTcnQgRlhfQklESVdFQUtTVEFURV9ydAotI2RlZmluZSBGWF9CV1NsdCBGWF9CSURJV0VBS1NUQVRFX2x0Ci0jZGVmaW5lIEZYX0JXU2NuIEZYX0JJRElXRUFLU1RBVEVfY24KLSNkZWZpbmUgRlhfQldTcmEgRlhfQklESVdFQUtTVEFURV9yYQotI2RlZmluZSBGWF9CV1NyZSBGWF9CSURJV0VBS1NUQVRFX3JlCi0jZGVmaW5lIEZYX0JXU2xhIEZYX0JJRElXRUFLU1RBVEVfbGEKLSNkZWZpbmUgRlhfQldTbGUgRlhfQklESVdFQUtTVEFURV9sZQotI2RlZmluZSBGWF9CV1NhYyBGWF9CSURJV0VBS1NUQVRFX2FjCi0jZGVmaW5lIEZYX0JXU3JjIEZYX0JJRElXRUFLU1RBVEVfcmMKLSNkZWZpbmUgRlhfQldTcnMgRlhfQklESVdFQUtTVEFURV9ycwotI2RlZmluZSBGWF9CV1NsYyBGWF9CSURJV0VBS1NUQVRFX2xjCi0jZGVmaW5lIEZYX0JXU2xzIEZYX0JJRElXRUFLU1RBVEVfbHMKLSNkZWZpbmUgRlhfQldTcmV0IEZYX0JJRElXRUFLU1RBVEVfcmV0Ci0jZGVmaW5lIEZYX0JXU2xldCBGWF9CSURJV0VBS1NUQVRFX2xldAotCi1lbnVtIEZYX0JJRElXRUFLQUNUSU9OIHsKLSAgRlhfQklESVdFQUtBQ1RJT05fSVggPSAweDEwMCwKLSAgRlhfQklESVdFQUtBQ1RJT05fWFggPSAweDBGLAotICBGWF9CSURJV0VBS0FDVElPTl94eHggPSAoMHgwRiA8PCA0KSArIDB4MEYsCi0gIEZYX0JJRElXRUFLQUNUSU9OX3hJeCA9IDB4MTAwICsgRlhfQklESVdFQUtBQ1RJT05feHh4LAotICBGWF9CSURJV0VBS0FDVElPTl94eE4gPSAoMHgwRiA8PCA0KSArIEZYX0JJRElDTEFTU19PTiwKLSAgRlhfQklESVdFQUtBQ1RJT05feHhFID0gKDB4MEYgPDwgNCkgKyBGWF9CSURJQ0xBU1NfRU4sCi0gIEZYX0JJRElXRUFLQUNUSU9OX3h4QSA9ICgweDBGIDw8IDQpICsgRlhfQklESUNMQVNTX0FOLAotICBGWF9CSURJV0VBS0FDVElPTl94eFIgPSAoMHgwRiA8PCA0KSArIEZYX0JJRElDTEFTU19SLAotICBGWF9CSURJV0VBS0FDVElPTl94eEwgPSAoMHgwRiA8PCA0KSArIEZYX0JJRElDTEFTU19MLAotICBGWF9CSURJV0VBS0FDVElPTl9OeHggPSAoRlhfQklESUNMQVNTX09OIDw8IDQpICsgMHgwRiwKLSAgRlhfQklESVdFQUtBQ1RJT05fQXh4ID0gKEZYX0JJRElDTEFTU19BTiA8PCA0KSArIDB4MEYsCi0gIEZYX0JJRElXRUFLQUNUSU9OX0V4RSA9IChGWF9CSURJQ0xBU1NfRU4gPDwgNCkgKyBGWF9CSURJQ0xBU1NfRU4sCi0gIEZYX0JJRElXRUFLQUNUSU9OX05JeCA9IChGWF9CSURJQ0xBU1NfT04gPDwgNCkgKyAweDBGICsgMHgxMDAsCi0gIEZYX0JJRElXRUFLQUNUSU9OX054TiA9IChGWF9CSURJQ0xBU1NfT04gPDwgNCkgKyBGWF9CSURJQ0xBU1NfT04sCi0gIEZYX0JJRElXRUFLQUNUSU9OX054UiA9IChGWF9CSURJQ0xBU1NfT04gPDwgNCkgKyBGWF9CSURJQ0xBU1NfUiwKLSAgRlhfQklESVdFQUtBQ1RJT05fTnhFID0gKEZYX0JJRElDTEFTU19PTiA8PCA0KSArIEZYX0JJRElDTEFTU19FTiwKLSAgRlhfQklESVdFQUtBQ1RJT05fQXhBID0gKEZYX0JJRElDTEFTU19BTiA8PCA0KSArIEZYX0JJRElDTEFTU19BTiwKLSAgRlhfQklESVdFQUtBQ1RJT05fTnhMID0gKEZYX0JJRElDTEFTU19PTiA8PCA0KSArIEZYX0JJRElDTEFTU19MLAotICBGWF9CSURJV0VBS0FDVElPTl9MeEwgPSAoRlhfQklESUNMQVNTX0wgPDwgNCkgKyBGWF9CSURJQ0xBU1NfTCwKLSAgRlhfQklESVdFQUtBQ1RJT05feElMID0gKDB4MEYgPDwgNCkgKyBGWF9CSURJQ0xBU1NfTCArIDB4MTAwLAotICBGWF9CSURJV0VBS0FDVElPTl9BeFIgPSAoRlhfQklESUNMQVNTX0FOIDw8IDQpICsgRlhfQklESUNMQVNTX1IsCi0gIEZYX0JJRElXRUFLQUNUSU9OX0x4eCA9IChGWF9CSURJQ0xBU1NfTCA8PCA0KSArIDB4MEYsCi19OwotI2RlZmluZSBGWF9CV0FJWCBGWF9CSURJV0VBS0FDVElPTl9JWAotI2RlZmluZSBGWF9CV0FYWCBGWF9CSURJV0VBS0FDVElPTl9YWAotI2RlZmluZSBGWF9CV0F4eHggRlhfQklESVdFQUtBQ1RJT05feHh4Ci0jZGVmaW5lIEZYX0JXQXhJeCBGWF9CSURJV0VBS0FDVElPTl94SXgKLSNkZWZpbmUgRlhfQldBeHhOIEZYX0JJRElXRUFLQUNUSU9OX3h4TgotI2RlZmluZSBGWF9CV0F4eEUgRlhfQklESVdFQUtBQ1RJT05feHhFCi0jZGVmaW5lIEZYX0JXQXh4QSBGWF9CSURJV0VBS0FDVElPTl94eEEKLSNkZWZpbmUgRlhfQldBeHhSIEZYX0JJRElXRUFLQUNUSU9OX3h4UgotI2RlZmluZSBGWF9CV0F4eEwgRlhfQklESVdFQUtBQ1RJT05feHhMCi0jZGVmaW5lIEZYX0JXQU54eCBGWF9CSURJV0VBS0FDVElPTl9OeHgKLSNkZWZpbmUgRlhfQldBQXh4IEZYX0JJRElXRUFLQUNUSU9OX0F4eAotI2RlZmluZSBGWF9CV0FFeEUgRlhfQklESVdFQUtBQ1RJT05fRXhFCi0jZGVmaW5lIEZYX0JXQU5JeCBGWF9CSURJV0VBS0FDVElPTl9OSXgKLSNkZWZpbmUgRlhfQldBTnhOIEZYX0JJRElXRUFLQUNUSU9OX054TgotI2RlZmluZSBGWF9CV0FOeFIgRlhfQklESVdFQUtBQ1RJT05fTnhSCi0jZGVmaW5lIEZYX0JXQU54RSBGWF9CSURJV0VBS0FDVElPTl9OeEUKLSNkZWZpbmUgRlhfQldBQXhBIEZYX0JJRElXRUFLQUNUSU9OX0F4QQotI2RlZmluZSBGWF9CV0FOeEwgRlhfQklESVdFQUtBQ1RJT05fTnhMCi0jZGVmaW5lIEZYX0JXQUx4TCBGWF9CSURJV0VBS0FDVElPTl9MeEwKLSNkZWZpbmUgRlhfQldBeElMIEZYX0JJRElXRUFLQUNUSU9OX3hJTAotI2RlZmluZSBGWF9CV0FBeFIgRlhfQklESVdFQUtBQ1RJT05fQXhSCi0jZGVmaW5lIEZYX0JXQUx4eCBGWF9CSURJV0VBS0FDVElPTl9MeHgKLQotdm9pZCBGWF9CaWRpUmVzb2x2ZVdlYWsoaW50MzJfdCBpQmFzZUxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4mIGNsYXNzZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiYgbGV2ZWxzKTsKLWVudW0gRlhfQklESU5FVVRSQUxTVEFURSB7Ci0gIEZYX0JJRElORVVUUkFMU1RBVEVfciA9IDAsCi0gIEZYX0JJRElORVVUUkFMU1RBVEVfbCwKLSAgRlhfQklESU5FVVRSQUxTVEFURV9ybiwKLSAgRlhfQklESU5FVVRSQUxTVEFURV9sbiwKLSAgRlhfQklESU5FVVRSQUxTVEFURV9hLAotICBGWF9CSURJTkVVVFJBTFNUQVRFX25hLAotfTsKLSNkZWZpbmUgRlhfQk5TciBGWF9CSURJTkVVVFJBTFNUQVRFX3IKLSNkZWZpbmUgRlhfQk5TbCBGWF9CSURJTkVVVFJBTFNUQVRFX2wKLSNkZWZpbmUgRlhfQk5Tcm4gRlhfQklESU5FVVRSQUxTVEFURV9ybgotI2RlZmluZSBGWF9CTlNsbiBGWF9CSURJTkVVVFJBTFNUQVRFX2xuCi0jZGVmaW5lIEZYX0JOU2EgRlhfQklESU5FVVRSQUxTVEFURV9hCi0jZGVmaW5lIEZYX0JOU25hIEZYX0JJRElORVVUUkFMU1RBVEVfbmEKLWVudW0gRlhfQklESU5FVVRSQUxBQ1RJT04gewotICBGWF9CSURJTkVVVFJBTEFDVElPTl9uTCA9IEZYX0JJRElDTEFTU19MLAotICBGWF9CSURJTkVVVFJBTEFDVElPTl9FbiA9IChGWF9CSURJQ0xBU1NfQU4gPDwgNCksCi0gIEZYX0JJRElORVVUUkFMQUNUSU9OX1JuID0gKEZYX0JJRElDTEFTU19SIDw8IDQpLAotICBGWF9CSURJTkVVVFJBTEFDVElPTl9MbiA9IChGWF9CSURJQ0xBU1NfTCA8PCA0KSwKLSAgRlhfQklESU5FVVRSQUxBQ1RJT05fSW4gPSBGWF9CSURJV0VBS0FDVElPTl9JWCwKLSAgRlhfQklESU5FVVRSQUxBQ1RJT05fTG5MID0gKEZYX0JJRElDTEFTU19MIDw8IDQpICsgRlhfQklESUNMQVNTX0wsCi19OwotI2RlZmluZSBGWF9CTkFuTCBGWF9CSURJTkVVVFJBTEFDVElPTl9uTAotI2RlZmluZSBGWF9CTkFFbiBGWF9CSURJTkVVVFJBTEFDVElPTl9FbgotI2RlZmluZSBGWF9CTkFSbiBGWF9CSURJTkVVVFJBTEFDVElPTl9SbgotI2RlZmluZSBGWF9CTkFMbiBGWF9CSURJTkVVVFJBTEFDVElPTl9MbgotI2RlZmluZSBGWF9CTkFJbiBGWF9CSURJTkVVVFJBTEFDVElPTl9JbgotI2RlZmluZSBGWF9CTkFMbkwgRlhfQklESU5FVVRSQUxBQ1RJT05fTG5MCi1pbnQzMl90IEZYX0JpZGlHZXREZWZlcnJlZE5ldXRyYWxzKGludDMyX3QgaUFjdGlvbiwgaW50MzJfdCBpTGV2ZWwpOwotaW50MzJfdCBGWF9CaWRpR2V0UmVzb2x2ZWROZXV0cmFscyhpbnQzMl90IGlBY3Rpb24pOwotdm9pZCBGWF9CaWRpUmVzb2x2ZU5ldXRyYWxzKGludDMyX3QgaUJhc2VMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiYgY2xhc3NlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiYgbGV2ZWxzKTsKLXZvaWQgRlhfQmlkaVJlc29sdmVJbXBsaWNpdChjb25zdCBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiYgY2xhc3NlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiYgbGV2ZWxzKTsKLXZvaWQgRlhfQmlkaVJlc29sdmVXaGl0ZXNwYWNlKGludDMyX3QgaUJhc2VMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+JiBjbGFzc2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4mIGxldmVscyk7Ci1pbnQzMl90IEZYX0JpZGlSZW9yZGVyTGV2ZWwoaW50MzJfdCBpQmFzZUxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4mIGxldmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZXZlcnNlID0gZmFsc2UpOwotdm9pZCBGWF9CaWRpUmVvcmRlcihpbnQzMl90IGlCYXNlTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+JiBsZXZlbHMpOword2NoYXJfdCBGWF9HZXRBcmFiaWNGcm9tU2hhZGRhVGFibGUod2NoYXJfdCBzaGFkZGEpOwogCiAjZW5kaWYgIC8vIENPUkVfRlhDUlRfRlhfQVJBQklDX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Z4X2FyYi5oIGIvY29yZS9meGNydC9meF9hcmIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI0MTk3Yy4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Y3J0L2Z4X2FyYi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlhDUlRfRlhfQVJCX0hfCi0jZGVmaW5lIENPUkVfRlhDUlRfRlhfQVJCX0hfCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfdWNkLmgiCi0KLXN0cnVjdCBGWF9BUkJGT1JNVEFCTEUgewotICB1aW50MTZfdCB3SXNvbGF0ZWQ7Ci0gIHVpbnQxNl90IHdGaW5hbDsKLSAgdWludDE2X3Qgd0luaXRpYWw7Ci0gIHVpbnQxNl90IHdNZWRpYWw7Ci19OwotCi1zdHJ1Y3QgRlhfQVJBQUxFRiB7Ci0gIHVpbnQxNl90IHdBbGVmOwotICB1aW50MTZfdCB3SXNvbGF0ZWQ7Ci19OwotCi1zdHJ1Y3QgRlhfQVJBU0hBRERBIHsKLSAgdWludDE2X3Qgd1NoYWRkYTsKLSAgdWludDE2X3Qgd0lzb2xhdGVkOwotfTsKLQotY29uc3QgRlhfQVJCRk9STVRBQkxFKiBGWF9HZXRBcmFiaWNGb3JtVGFibGUoRlhfV0NIQVIgdW5pY29kZSk7Ci1GWF9XQ0hBUiBGWF9HZXRBcmFiaWNGcm9tQWxlZlRhYmxlKEZYX1dDSEFSIGFsZWYpOwotRlhfV0NIQVIgRlhfR2V0QXJhYmljRnJvbVNoYWRkYVRhYmxlKEZYX1dDSEFSIHNoYWRkYSk7Ci0KLWVudW0gRlhfQVJCUE9TSVRJT04gewotICBGWF9BUkJQT1NJVElPTl9Jc29sYXRlZCA9IDAsCi0gIEZYX0FSQlBPU0lUSU9OX0ZpbmFsLAotICBGWF9BUkJQT1NJVElPTl9Jbml0aWFsLAotICBGWF9BUkJQT1NJVElPTl9NZWRpYWwsCi19OwotCi12b2lkIEZYX0JpZGlMaW5lKENGWF9XaWRlU3RyaW5nJiB3c1RleHQsIGludDMyX3QgaUJhc2VMZXZlbCA9IDApOwotdm9pZCBGWF9CaWRpTGluZShzdGQ6OnZlY3RvcjxDRlhfVHh0Q2hhcj4mIGNoYXJzLAotICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwKLSAgICAgICAgICAgICAgICAgaW50MzJfdCBpQmFzZUxldmVsID0gMCk7Ci12b2lkIEZYX0JpZGlMaW5lKHN0ZDo6dmVjdG9yPENGWF9SVEZDaGFyPiYgY2hhcnMsCi0gICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LAotICAgICAgICAgICAgICAgICBpbnQzMl90IGlCYXNlTGV2ZWwgPSAwKTsKLQotI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0ZYX0FSQl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF9iYXNpYy5oIGIvY29yZS9meGNydC9meF9iYXNpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODQxM2IyLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjcnQvZnhfYmFzaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgQ09SRV9GWENSVF9GWF9CQVNJQ19IXwotI2RlZmluZSBDT1JFX0ZYQ1JUX0ZYX0JBU0lDX0hfCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfcmV0YWluX3B0ci5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJlYW0uaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0KLSNpZmRlZiBQREZfRU5BQkxFX1hGQQotI2RlZmluZSBGWF9Jc09kZChhKSAoKGEpJjEpCi0jZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCi0KLWNsYXNzIENGWF9CaW5hcnlCdWYgewotIHB1YmxpYzoKLSAgQ0ZYX0JpbmFyeUJ1ZigpOwotICBleHBsaWNpdCBDRlhfQmluYXJ5QnVmKEZYX1NUUlNJWkUgc2l6ZSk7Ci0gIH5DRlhfQmluYXJ5QnVmKCk7Ci0KLSAgdWludDhfdCogR2V0QnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbV9wQnVmZmVyLmdldCgpOyB9Ci0gIEZYX1NUUlNJWkUgR2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fRGF0YVNpemU7IH0KLQotICB2b2lkIENsZWFyKCk7Ci0gIHZvaWQgRXN0aW1hdGVTaXplKEZYX1NUUlNJWkUgc2l6ZSwgRlhfU1RSU0laRSBhbGxvY19zdGVwID0gMCk7Ci0gIHZvaWQgQXBwZW5kQmxvY2soY29uc3Qgdm9pZCogcEJ1ZiwgRlhfU1RSU0laRSBzaXplKTsKLSAgdm9pZCBBcHBlbmRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikgewotICAgIEFwcGVuZEJsb2NrKHN0ci5jX3N0cigpLCBzdHIuR2V0TGVuZ3RoKCkpOwotICB9Ci0KLSAgdm9pZCBBcHBlbmRCeXRlKHVpbnQ4X3QgYnl0ZSkgewotICAgIEV4cGFuZEJ1ZigxKTsKLSAgICBtX3BCdWZmZXIuZ2V0KClbbV9EYXRhU2l6ZSsrXSA9IGJ5dGU7Ci0gIH0KLQotICB2b2lkIEluc2VydEJsb2NrKEZYX1NUUlNJWkUgcG9zLCBjb25zdCB2b2lkKiBwQnVmLCBGWF9TVFJTSVpFIHNpemUpOwotICB2b2lkIERlbGV0ZShpbnQgc3RhcnRfaW5kZXgsIGludCBjb3VudCk7Ci0KLSAgLy8gUmVsZWFzZXMgb3duZXJzaGlwIG9mIHxtX3BCdWZmZXJ8IGFuZCByZXR1cm5zIGl0LgotICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4gRGV0YWNoQnVmZmVyKCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgRXhwYW5kQnVmKEZYX1NUUlNJWkUgc2l6ZSk7Ci0KLSAgRlhfU1RSU0laRSBtX0FsbG9jU3RlcDsKLSAgRlhfU1RSU0laRSBtX0FsbG9jU2l6ZTsKLSAgRlhfU1RSU0laRSBtX0RhdGFTaXplOwotICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4gbV9wQnVmZmVyOwotfTsKLQotY2xhc3MgQ0ZYX0J5dGVUZXh0QnVmIDogcHVibGljIENGWF9CaW5hcnlCdWYgewotIHB1YmxpYzoKLSAgRlhfU1RSU0laRSBHZXRMZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX0RhdGFTaXplOyB9Ci0gIENGWF9CeXRlU3RyaW5nIE1ha2VTdHJpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKG1fcEJ1ZmZlci5nZXQoKSwgbV9EYXRhU2l6ZSk7Ci0gIH0KLSAgQ0ZYX0J5dGVTdHJpbmdDIEFzU3RyaW5nQygpIGNvbnN0IHsKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmdDKG1fcEJ1ZmZlci5nZXQoKSwgbV9EYXRhU2l6ZSk7Ci0gIH0KLQotICB2b2lkIEFwcGVuZENoYXIoaW50IGNoKSB7IEFwcGVuZEJ5dGUoc3RhdGljX2Nhc3Q8dWludDhfdD4oY2gpKTsgfQotICBDRlhfQnl0ZVRleHRCdWYmIG9wZXJhdG9yPDwoaW50IGkpOwotICBDRlhfQnl0ZVRleHRCdWYmIG9wZXJhdG9yPDwodWludDMyX3QgaSk7Ci0gIENGWF9CeXRlVGV4dEJ1ZiYgb3BlcmF0b3I8PChkb3VibGUgZik7Ci0gIENGWF9CeXRlVGV4dEJ1ZiYgb3BlcmF0b3I8PChjb25zdCBGWF9DSEFSKiBwU3RyKSB7Ci0gICAgcmV0dXJuICp0aGlzIDw8IENGWF9CeXRlU3RyaW5nQyhwU3RyKTsKLSAgfQotICBDRlhfQnl0ZVRleHRCdWYmIG9wZXJhdG9yPDwoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikgewotICAgIHJldHVybiAqdGhpcyA8PCBzdHIuQXNTdHJpbmdDKCk7Ci0gIH0KLSAgQ0ZYX0J5dGVUZXh0QnVmJiBvcGVyYXRvcjw8KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbHBzeik7Ci0gIENGWF9CeXRlVGV4dEJ1ZiYgb3BlcmF0b3I8PChjb25zdCBDRlhfQnl0ZVRleHRCdWYmIGJ1Zik7Ci19OwotCi1jbGFzcyBDRlhfV2lkZVRleHRCdWYgOiBwdWJsaWMgQ0ZYX0JpbmFyeUJ1ZiB7Ci0gcHVibGljOgotICB2b2lkIEFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKTsKLSAgRlhfU1RSU0laRSBHZXRMZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX0RhdGFTaXplIC8gc2l6ZW9mKEZYX1dDSEFSKTsgfQotICBGWF9XQ0hBUiogR2V0QnVmZmVyKCkgY29uc3QgewotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEZYX1dDSEFSKj4obV9wQnVmZmVyLmdldCgpKTsKLSAgfQotCi0gIENGWF9XaWRlU3RyaW5nQyBBc1N0cmluZ0MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nQyhyZWludGVycHJldF9jYXN0PGNvbnN0IEZYX1dDSEFSKj4obV9wQnVmZmVyLmdldCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fRGF0YVNpemUgLyBzaXplb2YoRlhfV0NIQVIpKTsKLSAgfQotICBDRlhfV2lkZVN0cmluZyBNYWtlU3RyaW5nKCkgY29uc3QgewotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IEZYX1dDSEFSKj4obV9wQnVmZmVyLmdldCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbV9EYXRhU2l6ZSAvIHNpemVvZihGWF9XQ0hBUikpOwotICB9Ci0KLSAgdm9pZCBEZWxldGUoaW50IHN0YXJ0X2luZGV4LCBpbnQgY291bnQpIHsKLSAgICBDRlhfQmluYXJ5QnVmOjpEZWxldGUoc3RhcnRfaW5kZXggKiBzaXplb2YoRlhfV0NIQVIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCAqIHNpemVvZihGWF9XQ0hBUikpOwotICB9Ci0KLSAgQ0ZYX1dpZGVUZXh0QnVmJiBvcGVyYXRvcjw8KGludCBpKTsKLSAgQ0ZYX1dpZGVUZXh0QnVmJiBvcGVyYXRvcjw8KGRvdWJsZSBmKTsKLSAgQ0ZYX1dpZGVUZXh0QnVmJiBvcGVyYXRvcjw8KGNvbnN0IEZYX1dDSEFSKiBscHN6KTsKLSAgQ0ZYX1dpZGVUZXh0QnVmJiBvcGVyYXRvcjw8KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKTsKLSAgQ0ZYX1dpZGVUZXh0QnVmJiBvcGVyYXRvcjw8KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOwotICBDRlhfV2lkZVRleHRCdWYmIG9wZXJhdG9yPDwoY29uc3QgQ0ZYX1dpZGVUZXh0QnVmJiBidWYpOwotfTsKLQotY2xhc3MgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlIHsKLSBwdWJsaWM6Ci0gIENGWF9GaWxlQnVmZmVyQXJjaGl2ZSgpOwotICB+Q0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKCk7Ci0KLSAgdm9pZCBDbGVhcigpOwotICBib29sIEZsdXNoKCk7Ci0gIGludDMyX3QgQXBwZW5kQmxvY2soY29uc3Qgdm9pZCogcEJ1Ziwgc2l6ZV90IHNpemUpOwotICBpbnQzMl90IEFwcGVuZEJ5dGUodWludDhfdCBieXRlKTsKLSAgaW50MzJfdCBBcHBlbmREV29yZCh1aW50MzJfdCBpKTsKLSAgaW50MzJfdCBBcHBlbmRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBscHN6KTsKLSAgdm9pZCBBdHRhY2hGaWxlKGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1dyaXRlU3RyZWFtPiYgcEZpbGUpOwotCi0gcHJpdmF0ZToKLSAgc3RhdGljIGNvbnN0IHNpemVfdCBrQnVmU2l6ZSA9IDMyNzY4OwotCi0gIHNpemVfdCBtX0xlbmd0aDsKLSAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IG1fcEJ1ZmZlcjsKLSAgQ0ZYX1JldGFpblB0cjxJRlhfV3JpdGVTdHJlYW0+IG1fcEZpbGU7Ci19OwotCi1jbGFzcyBDRlhfQ2hhck1hcCB7Ci0gcHVibGljOgotICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0Qnl0ZVN0cmluZyh1aW50MTZfdCBjb2RlcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c3RyKTsKLQotICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgR2V0V2lkZVN0cmluZyh1aW50MTZfdCBjb2RlcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic3RyKTsKLQotICBDRlhfQ2hhck1hcCgpID0gZGVsZXRlOwotfTsKLQotY2xhc3MgQ0ZYX1VURjhEZWNvZGVyIHsKLSBwdWJsaWM6Ci0gIENGWF9VVEY4RGVjb2RlcigpIHsgbV9QZW5kaW5nQnl0ZXMgPSAwOyB9Ci0KLSAgdm9pZCBDbGVhcigpOwotCi0gIHZvaWQgSW5wdXQodWludDhfdCBieXRlKTsKLQotICB2b2lkIEFwcGVuZENoYXIodWludDMyX3QgY2gpOwotCi0gIHZvaWQgQ2xlYXJTdGF0dXMoKSB7IG1fUGVuZGluZ0J5dGVzID0gMDsgfQotCi0gIENGWF9XaWRlU3RyaW5nQyBHZXRSZXN1bHQoKSBjb25zdCB7IHJldHVybiBtX0J1ZmZlci5Bc1N0cmluZ0MoKTsgfQotCi0gcHJvdGVjdGVkOgotICBpbnQgbV9QZW5kaW5nQnl0ZXM7Ci0KLSAgdWludDMyX3QgbV9QZW5kaW5nQ2hhcjsKLQotICBDRlhfV2lkZVRleHRCdWYgbV9CdWZmZXI7Ci19OwotCi1jbGFzcyBDRlhfVVRGOEVuY29kZXIgewotIHB1YmxpYzoKLSAgQ0ZYX1VURjhFbmNvZGVyKCkge30KLQotICB2b2lkIElucHV0KEZYX1dDSEFSIHVuaWNvZGUpOwotICB2b2lkIEFwcGVuZFN0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgeyBtX0J1ZmZlciA8PCBzdHI7IH0KLSAgQ0ZYX0J5dGVTdHJpbmdDIEdldFJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuIG1fQnVmZmVyLkFzU3RyaW5nQygpOyB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIENGWF9CeXRlVGV4dEJ1ZiBtX0J1ZmZlcjsKLX07Ci0KLWNsYXNzIENGWF9CYXNpY0FycmF5IHsKLSBwcm90ZWN0ZWQ6Ci0gIGV4cGxpY2l0IENGWF9CYXNpY0FycmF5KGludCB1bml0X3NpemUpOwotICBDRlhfQmFzaWNBcnJheShjb25zdCBDRlhfQmFzaWNBcnJheSYpID0gZGVsZXRlOwotICB+Q0ZYX0Jhc2ljQXJyYXkoKTsKLQotICBib29sIFNldFNpemUoaW50IG5OZXdTaXplKTsKLSAgYm9vbCBBcHBlbmQoY29uc3QgQ0ZYX0Jhc2ljQXJyYXkmIHNyYyk7Ci0gIGJvb2wgQ29weShjb25zdCBDRlhfQmFzaWNBcnJheSYgc3JjKTsKLSAgdWludDhfdCogSW5zZXJ0U3BhY2VBdChpbnQgbkluZGV4LCBpbnQgbkNvdW50KTsKLSAgYm9vbCBSZW1vdmVBdChpbnQgbkluZGV4LCBpbnQgbkNvdW50KTsKLSAgYm9vbCBJbnNlcnRBdChpbnQgblN0YXJ0SW5kZXgsIGNvbnN0IENGWF9CYXNpY0FycmF5KiBwTmV3QXJyYXkpOwotICBjb25zdCB2b2lkKiBHZXREYXRhUHRyKGludCBpbmRleCkgY29uc3Q7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHVpbnQ4X3QqIG1fcERhdGE7Ci0gIGludCBtX25TaXplOwotICBpbnQgbV9uTWF4U2l6ZTsKLSAgaW50IG1fblVuaXRTaXplOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFRZUEU+Ci1jbGFzcyBDRlhfQXJyYXlUZW1wbGF0ZSA6IHB1YmxpYyBDRlhfQmFzaWNBcnJheSB7Ci0gcHVibGljOgotICBDRlhfQXJyYXlUZW1wbGF0ZSgpIDogQ0ZYX0Jhc2ljQXJyYXkoc2l6ZW9mKFRZUEUpKSB7fQotCi0gIGludCBHZXRTaXplKCkgY29uc3QgeyByZXR1cm4gbV9uU2l6ZTsgfQotCi0gIGludCBHZXRVcHBlckJvdW5kKCkgY29uc3QgeyByZXR1cm4gbV9uU2l6ZSAtIDE7IH0KLQotICBib29sIFNldFNpemUoaW50IG5OZXdTaXplKSB7IHJldHVybiBDRlhfQmFzaWNBcnJheTo6U2V0U2l6ZShuTmV3U2l6ZSk7IH0KLQotICB2b2lkIFJlbW92ZUFsbCgpIHsgU2V0U2l6ZSgwKTsgfQotCi0gIGNvbnN0IFRZUEUgR2V0QXQoaW50IG5JbmRleCkgY29uc3QgewotICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX25TaXplKSB7Ci0gICAgICBQREZJVU1fSU1NRURJQVRFX0NSQVNIKCk7Ci0gICAgfQotICAgIHJldHVybiAoKGNvbnN0IFRZUEUqKW1fcERhdGEpW25JbmRleF07Ci0gIH0KLQotICBib29sIFNldEF0KGludCBuSW5kZXgsIFRZUEUgbmV3RWxlbWVudCkgewotICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX25TaXplKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgICgoVFlQRSopbV9wRGF0YSlbbkluZGV4XSA9IG5ld0VsZW1lbnQ7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBUWVBFJiBFbGVtZW50QXQoaW50IG5JbmRleCkgewotICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX25TaXplKSB7Ci0gICAgICBQREZJVU1fSU1NRURJQVRFX0NSQVNIKCk7Ci0gICAgfQotICAgIHJldHVybiAoKFRZUEUqKW1fcERhdGEpW25JbmRleF07Ci0gIH0KLQotICBjb25zdCBUWVBFKiBHZXREYXRhKCkgY29uc3QgeyByZXR1cm4gKGNvbnN0IFRZUEUqKW1fcERhdGE7IH0KLQotICBUWVBFKiBHZXREYXRhKCkgeyByZXR1cm4gKFRZUEUqKW1fcERhdGE7IH0KLQotICBib29sIFNldEF0R3JvdyhpbnQgbkluZGV4LCBUWVBFIG5ld0VsZW1lbnQpIHsKLSAgICBpZiAobkluZGV4IDwgMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChuSW5kZXggPj0gbV9uU2l6ZSAmJiAhU2V0U2l6ZShuSW5kZXggKyAxKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICgoVFlQRSopbV9wRGF0YSlbbkluZGV4XSA9IG5ld0VsZW1lbnQ7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBib29sIEFkZChUWVBFIG5ld0VsZW1lbnQpIHsKLSAgICBpZiAobV9uU2l6ZSA8IG1fbk1heFNpemUpIHsKLSAgICAgIG1fblNpemUrKzsKLSAgICB9IGVsc2UgaWYgKCFTZXRTaXplKG1fblNpemUgKyAxKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAoKFRZUEUqKW1fcERhdGEpW21fblNpemUgLSAxXSA9IG5ld0VsZW1lbnQ7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBib29sIEFwcGVuZChjb25zdCBDRlhfQXJyYXlUZW1wbGF0ZSYgc3JjKSB7Ci0gICAgcmV0dXJuIENGWF9CYXNpY0FycmF5OjpBcHBlbmQoc3JjKTsKLSAgfQotCi0gIGJvb2wgQ29weShjb25zdCBDRlhfQXJyYXlUZW1wbGF0ZSYgc3JjKSB7IHJldHVybiBDRlhfQmFzaWNBcnJheTo6Q29weShzcmMpOyB9Ci0KLSAgVFlQRSogR2V0RGF0YVB0cihpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gKFRZUEUqKUNGWF9CYXNpY0FycmF5OjpHZXREYXRhUHRyKGluZGV4KTsKLSAgfQotCi0gIFRZUEUqIEFkZFNwYWNlKCkgeyByZXR1cm4gKFRZUEUqKUNGWF9CYXNpY0FycmF5OjpJbnNlcnRTcGFjZUF0KG1fblNpemUsIDEpOyB9Ci0KLSAgVFlQRSogSW5zZXJ0U3BhY2VBdChpbnQgbkluZGV4LCBpbnQgbkNvdW50KSB7Ci0gICAgcmV0dXJuIChUWVBFKilDRlhfQmFzaWNBcnJheTo6SW5zZXJ0U3BhY2VBdChuSW5kZXgsIG5Db3VudCk7Ci0gIH0KLQotICBjb25zdCBUWVBFIG9wZXJhdG9yW10oaW50IG5JbmRleCkgY29uc3QgewotICAgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBtX25TaXplKSB7Ci0gICAgICAqKHZvbGF0aWxlIGNoYXIqKTAgPSAnXDAnOwotICAgIH0KLSAgICByZXR1cm4gKChjb25zdCBUWVBFKiltX3BEYXRhKVtuSW5kZXhdOwotICB9Ci0KLSAgVFlQRSYgb3BlcmF0b3JbXShpbnQgbkluZGV4KSB7Ci0gICAgaWYgKG5JbmRleCA8IDAgfHwgbkluZGV4ID49IG1fblNpemUpIHsKLSAgICAgICoodm9sYXRpbGUgY2hhciopMCA9ICdcMCc7Ci0gICAgfQotICAgIHJldHVybiAoKFRZUEUqKW1fcERhdGEpW25JbmRleF07Ci0gIH0KLQotICBib29sIEluc2VydEF0KGludCBuSW5kZXgsIFRZUEUgbmV3RWxlbWVudCwgaW50IG5Db3VudCA9IDEpIHsKLSAgICBpZiAoIUluc2VydFNwYWNlQXQobkluZGV4LCBuQ291bnQpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHdoaWxlIChuQ291bnQtLSkgewotICAgICAgKChUWVBFKiltX3BEYXRhKVtuSW5kZXgrK10gPSBuZXdFbGVtZW50OwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGJvb2wgUmVtb3ZlQXQoaW50IG5JbmRleCwgaW50IG5Db3VudCA9IDEpIHsKLSAgICByZXR1cm4gQ0ZYX0Jhc2ljQXJyYXk6OlJlbW92ZUF0KG5JbmRleCwgbkNvdW50KTsKLSAgfQotCi0gIGJvb2wgSW5zZXJ0QXQoaW50IG5TdGFydEluZGV4LCBjb25zdCBDRlhfQmFzaWNBcnJheSogcE5ld0FycmF5KSB7Ci0gICAgcmV0dXJuIENGWF9CYXNpY0FycmF5OjpJbnNlcnRBdChuU3RhcnRJbmRleCwgcE5ld0FycmF5KTsKLSAgfQotCi0gIGludCBGaW5kKFRZUEUgZGF0YSwgaW50IGlTdGFydCA9IDApIGNvbnN0IHsKLSAgICBpZiAoaVN0YXJ0IDwgMCkgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBmb3IgKDsgaVN0YXJ0IDwgKGludCltX25TaXplOyBpU3RhcnQrKykKLSAgICAgIGlmICgoKFRZUEUqKW1fcERhdGEpW2lTdGFydF0gPT0gZGF0YSkgewotICAgICAgICByZXR1cm4gaVN0YXJ0OwotICAgICAgfQotICAgIHJldHVybiAtMTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIERhdGFUeXBlLCBpbnQgRml4ZWRTaXplPgotY2xhc3MgQ0ZYX0ZpeGVkQnVmR3JvdyB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDRlhfRml4ZWRCdWZHcm93KGludCBkYXRhX3NpemUpIHsKLSAgICBpZiAoZGF0YV9zaXplID4gRml4ZWRTaXplKSB7Ci0gICAgICBtX3BHcm93RGF0YS5yZXNldChGWF9BbGxvYyhEYXRhVHlwZSwgZGF0YV9zaXplKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIEZYU1lTX21lbXNldChtX0ZpeGVkRGF0YSwgMCwgc2l6ZW9mKERhdGFUeXBlKSAqIEZpeGVkU2l6ZSk7Ci0gIH0KLSAgb3BlcmF0b3IgRGF0YVR5cGUqKCkgeyByZXR1cm4gbV9wR3Jvd0RhdGEgPyBtX3BHcm93RGF0YS5nZXQoKSA6IG1fRml4ZWREYXRhOyB9Ci0KLSBwcml2YXRlOgotICBEYXRhVHlwZSBtX0ZpeGVkRGF0YVtGaXhlZFNpemVdOwotICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YVR5cGUsIEZ4RnJlZURlbGV0ZXI+IG1fcEdyb3dEYXRhOwotfTsKLQotY2xhc3MgQ0ZYX0JpdFN0cmVhbSB7Ci0gcHVibGljOgotICB2b2lkIEluaXQoY29uc3QgdWludDhfdCogcERhdGEsIHVpbnQzMl90IGR3U2l6ZSk7Ci0KLSAgdWludDMyX3QgR2V0Qml0cyh1aW50MzJfdCBuQml0cyk7Ci0KLSAgdm9pZCBCeXRlQWxpZ24oKTsKLQotICBib29sIElzRU9GKCkgeyByZXR1cm4gbV9CaXRQb3MgPj0gbV9CaXRTaXplOyB9Ci0KLSAgdm9pZCBTa2lwQml0cyh1aW50MzJfdCBuQml0cykgeyBtX0JpdFBvcyArPSBuQml0czsgfQotCi0gIHZvaWQgUmV3aW5kKCkgeyBtX0JpdFBvcyA9IDA7IH0KLQotICB1aW50MzJfdCBHZXRQb3MoKSBjb25zdCB7IHJldHVybiBtX0JpdFBvczsgfQotCi0gIHVpbnQzMl90IEJpdHNSZW1haW5pbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1fQml0U2l6ZSA+PSBtX0JpdFBvcyA/IG1fQml0U2l6ZSAtIG1fQml0UG9zIDogMDsKLSAgfQotCi0gcHJvdGVjdGVkOgotICB1aW50MzJfdCBtX0JpdFBvczsKLSAgdWludDMyX3QgbV9CaXRTaXplOwotICBjb25zdCB1aW50OF90KiBtX3BEYXRhOwotfTsKLQotY2xhc3MgSUZYX1BhdXNlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfklGWF9QYXVzZSgpIHt9Ci0gIHZpcnR1YWwgYm9vbCBOZWVkVG9QYXVzZU5vdygpID0gMDsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgQ0ZYX0F1dG9SZXN0b3JlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDRlhfQXV0b1Jlc3RvcmVyKFQqIGxvY2F0aW9uKQotICAgICAgOiBtX0xvY2F0aW9uKGxvY2F0aW9uKSwgbV9PbGRWYWx1ZSgqbG9jYXRpb24pIHt9Ci0gIH5DRlhfQXV0b1Jlc3RvcmVyKCkgeyAqbV9Mb2NhdGlvbiA9IG1fT2xkVmFsdWU7IH0KLQotIHByaXZhdGU6Ci0gIFQqIGNvbnN0IG1fTG9jYXRpb247Ci0gIGNvbnN0IFQgbV9PbGRWYWx1ZTsKLX07Ci0KLSNkZWZpbmUgRlhfREFUQUxJU1RfTEVOR1RIIDEwMjQKLXRlbXBsYXRlIDxzaXplX3QgdW5pdD4KLWNsYXNzIENGWF9Tb3J0TGlzdEFycmF5IHsKLSBwcm90ZWN0ZWQ6Ci0gIHN0cnVjdCBEYXRhTGlzdCB7Ci0gICAgaW50MzJfdCBzdGFydDsKLQotICAgIGludDMyX3QgY291bnQ7Ci0gICAgdWludDhfdCogZGF0YTsKLSAgfTsKLQotIHB1YmxpYzoKLSAgQ0ZYX1NvcnRMaXN0QXJyYXkoKSA6IG1fQ3VyTGlzdCgwKSB7fQotCi0gIH5DRlhfU29ydExpc3RBcnJheSgpIHsgQ2xlYXIoKTsgfQotCi0gIHZvaWQgQ2xlYXIoKSB7Ci0gICAgZm9yIChpbnQzMl90IGkgPSBtX0RhdGFMaXN0cy5HZXRVcHBlckJvdW5kKCk7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICBEYXRhTGlzdCBsaXN0ID0gbV9EYXRhTGlzdHMuRWxlbWVudEF0KGkpOwotICAgICAgRlhfRnJlZShsaXN0LmRhdGEpOwotICAgIH0KLSAgICBtX0RhdGFMaXN0cy5SZW1vdmVBbGwoKTsKLSAgICBtX0N1ckxpc3QgPSAwOwotICB9Ci0KLSAgdm9pZCBBcHBlbmQoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50KSB7Ci0gICAgaWYgKG5TdGFydCA8IDApIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgd2hpbGUgKG5Db3VudCA+IDApIHsKLSAgICAgIGludDMyX3QgdGVtcF9jb3VudCA9IHN0ZDo6bWluKG5Db3VudCwgRlhfREFUQUxJU1RfTEVOR1RIKTsKLSAgICAgIERhdGFMaXN0IGxpc3Q7Ci0gICAgICBsaXN0LmRhdGEgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIHRlbXBfY291bnQsIHVuaXQpOwotICAgICAgbGlzdC5zdGFydCA9IG5TdGFydDsKLSAgICAgIGxpc3QuY291bnQgPSB0ZW1wX2NvdW50OwotICAgICAgQXBwZW5kKGxpc3QpOwotICAgICAgbkNvdW50IC09IHRlbXBfY291bnQ7Ci0gICAgICBuU3RhcnQgKz0gdGVtcF9jb3VudDsKLSAgICB9Ci0gIH0KLQotICB1aW50OF90KiBHZXRBdChpbnQzMl90IG5JbmRleCkgewotICAgIGlmIChuSW5kZXggPCAwKSB7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgaWYgKG1fQ3VyTGlzdCA8IDAgfHwgbV9DdXJMaXN0ID49IG1fRGF0YUxpc3RzLkdldFNpemUoKSkgewotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIERhdGFMaXN0KiBwQ3VyTGlzdCA9IG1fRGF0YUxpc3RzLkdldERhdGFQdHIobV9DdXJMaXN0KTsKLSAgICBpZiAoIXBDdXJMaXN0IHx8IG5JbmRleCA8IHBDdXJMaXN0LT5zdGFydCB8fAotICAgICAgICBuSW5kZXggPj0gcEN1ckxpc3QtPnN0YXJ0ICsgcEN1ckxpc3QtPmNvdW50KSB7Ci0gICAgICBwQ3VyTGlzdCA9IG51bGxwdHI7Ci0gICAgICBpbnQzMl90IGlTdGFydCA9IDA7Ci0gICAgICBpbnQzMl90IGlFbmQgPSBtX0RhdGFMaXN0cy5HZXRVcHBlckJvdW5kKCk7Ci0gICAgICBpbnQzMl90IGlNaWQgPSAwOwotICAgICAgd2hpbGUgKGlTdGFydCA8PSBpRW5kKSB7Ci0gICAgICAgIGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOwotICAgICAgICBEYXRhTGlzdCogbGlzdCA9IG1fRGF0YUxpc3RzLkdldERhdGFQdHIoaU1pZCk7Ci0gICAgICAgIGlmIChuSW5kZXggPCBsaXN0LT5zdGFydCkgewotICAgICAgICAgIGlFbmQgPSBpTWlkIC0gMTsKLSAgICAgICAgfSBlbHNlIGlmIChuSW5kZXggPj0gbGlzdC0+c3RhcnQgKyBsaXN0LT5jb3VudCkgewotICAgICAgICAgIGlTdGFydCA9IGlNaWQgKyAxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBDdXJMaXN0ID0gbGlzdDsKLSAgICAgICAgICBtX0N1ckxpc3QgPSBpTWlkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwQ3VyTGlzdCA/IHBDdXJMaXN0LT5kYXRhICsgKG5JbmRleCAtIHBDdXJMaXN0LT5zdGFydCkgKiB1bml0Ci0gICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cjsKLSAgfQotCi0gcHJvdGVjdGVkOgotICB2b2lkIEFwcGVuZChjb25zdCBEYXRhTGlzdCYgbGlzdCkgewotICAgIGludDMyX3QgaVN0YXJ0ID0gMDsKLSAgICBpbnQzMl90IGlFbmQgPSBtX0RhdGFMaXN0cy5HZXRVcHBlckJvdW5kKCk7Ci0gICAgaW50MzJfdCBpRmluZCA9IDA7Ci0gICAgd2hpbGUgKGlTdGFydCA8PSBpRW5kKSB7Ci0gICAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOwotICAgICAgRGF0YUxpc3QqIGN1cl9saXN0ID0gbV9EYXRhTGlzdHMuR2V0RGF0YVB0cihpTWlkKTsKLSAgICAgIGlmIChsaXN0LnN0YXJ0IDwgY3VyX2xpc3QtPnN0YXJ0ICsgY3VyX2xpc3QtPmNvdW50KSB7Ci0gICAgICAgIGlFbmQgPSBpTWlkIC0gMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChpTWlkID09IGlFbmQpIHsKLSAgICAgICAgICBpRmluZCA9IGlNaWQgKyAxOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIERhdGFMaXN0KiBuZXh0X2xpc3QgPSBtX0RhdGFMaXN0cy5HZXREYXRhUHRyKGlNaWQgKyAxKTsKLSAgICAgICAgaWYgKGxpc3Quc3RhcnQgPCBuZXh0X2xpc3QtPnN0YXJ0KSB7Ci0gICAgICAgICAgaUZpbmQgPSBpTWlkICsgMTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBtX0RhdGFMaXN0cy5JbnNlcnRBdChpRmluZCwgbGlzdCk7Ci0gIH0KLSAgaW50MzJfdCBtX0N1ckxpc3Q7Ci0gIENGWF9BcnJheVRlbXBsYXRlPERhdGFMaXN0PiBtX0RhdGFMaXN0czsKLX07Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotY2xhc3MgQ0ZYX0xpc3RBcnJheVRlbXBsYXRlIHsKLSBwdWJsaWM6Ci0gIHZvaWQgQ2xlYXIoKSB7IG1fRGF0YS5DbGVhcigpOyB9Ci0KLSAgdm9pZCBBZGQoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50KSB7IG1fRGF0YS5BcHBlbmQoblN0YXJ0LCBuQ291bnQpOyB9Ci0KLSAgVDImIG9wZXJhdG9yW10oaW50MzJfdCBuSW5kZXgpIHsKLSAgICB1aW50OF90KiBkYXRhID0gbV9EYXRhLkdldEF0KG5JbmRleCk7Ci0gICAgQVNTRVJUKGRhdGEpOwotICAgIHJldHVybiAoVDImKSgqKHZvbGF0aWxlIFQyKilkYXRhKTsKLSAgfQotCi0gIFQyKiBHZXRQdHJBdChpbnQzMl90IG5JbmRleCkgeyByZXR1cm4gKFQyKiltX0RhdGEuR2V0QXQobkluZGV4KTsgfQotCi0gcHJvdGVjdGVkOgotICBUMSBtX0RhdGE7Ci19OwotdHlwZWRlZiBDRlhfTGlzdEFycmF5VGVtcGxhdGU8Q0ZYX1NvcnRMaXN0QXJyYXk8c2l6ZW9mKEZYX0ZJTEVTSVpFKT4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRT4KLSAgICBDRlhfRmlsZVNpemVMaXN0QXJyYXk7Ci0KLWNsYXNzIENGWF9WZWN0b3JfM2J5MSB7Ci0gcHVibGljOgotICBDRlhfVmVjdG9yXzNieTEoKSA6IGEoMC4wZiksIGIoMC4wZiksIGMoMC4wZikge30KLQotICBDRlhfVmVjdG9yXzNieTEoRlhfRkxPQVQgYTEsIEZYX0ZMT0FUIGIxLCBGWF9GTE9BVCBjMSkKLSAgICAgIDogYShhMSksIGIoYjEpLCBjKGMxKSB7fQotCi0gIEZYX0ZMT0FUIGE7Ci0gIEZYX0ZMT0FUIGI7Ci0gIEZYX0ZMT0FUIGM7Ci19OwotY2xhc3MgQ0ZYX01hdHJpeF8zYnkzIHsKLSBwdWJsaWM6Ci0gIENGWF9NYXRyaXhfM2J5MygpCi0gICAgICA6IGEoMC4wZiksCi0gICAgICAgIGIoMC4wZiksCi0gICAgICAgIGMoMC4wZiksCi0gICAgICAgIGQoMC4wZiksCi0gICAgICAgIGUoMC4wZiksCi0gICAgICAgIGYoMC4wZiksCi0gICAgICAgIGcoMC4wZiksCi0gICAgICAgIGgoMC4wZiksCi0gICAgICAgIGkoMC4wZikge30KLQotICBDRlhfTWF0cml4XzNieTMoRlhfRkxPQVQgYTEsCi0gICAgICAgICAgICAgICAgICBGWF9GTE9BVCBiMSwKLSAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGMxLAotICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZDEsCi0gICAgICAgICAgICAgICAgICBGWF9GTE9BVCBlMSwKLSAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGYxLAotICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZzEsCi0gICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoMSwKLSAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGkxKQotICAgICAgOiBhKGExKSwgYihiMSksIGMoYzEpLCBkKGQxKSwgZShlMSksIGYoZjEpLCBnKGcxKSwgaChoMSksIGkoaTEpIHt9Ci0KLSAgQ0ZYX01hdHJpeF8zYnkzIEludmVyc2UoKTsKLQotICBDRlhfTWF0cml4XzNieTMgTXVsdGlwbHkoY29uc3QgQ0ZYX01hdHJpeF8zYnkzJiBtKTsKLQotICBDRlhfVmVjdG9yXzNieTEgVHJhbnNmb3JtVmVjdG9yKGNvbnN0IENGWF9WZWN0b3JfM2J5MSYgdik7Ci0KLSAgRlhfRkxPQVQgYTsKLSAgRlhfRkxPQVQgYjsKLSAgRlhfRkxPQVQgYzsKLSAgRlhfRkxPQVQgZDsKLSAgRlhfRkxPQVQgZTsKLSAgRlhfRkxPQVQgZjsKLSAgRlhfRkxPQVQgZzsKLSAgRlhfRkxPQVQgaDsKLSAgRlhfRkxPQVQgaTsKLX07Ci0KLXVpbnQzMl90IEdldEJpdHMzMihjb25zdCB1aW50OF90KiBwRGF0YSwgaW50IGJpdHBvcywgaW50IG5iaXRzKTsKLQotI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0ZYX0JBU0lDX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Z4X2Jhc2ljX2FycmF5LmNwcCBiL2NvcmUvZnhjcnQvZnhfYmFzaWNfYXJyYXkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2M5ODFlLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjcnQvZnhfYmFzaWNfYXJyYXkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfbWF0aC5oIgotCi1DRlhfQmFzaWNBcnJheTo6Q0ZYX0Jhc2ljQXJyYXkoaW50IHVuaXRfc2l6ZSkKLSAgICA6IG1fcERhdGEobnVsbHB0ciksIG1fblNpemUoMCksIG1fbk1heFNpemUoMCkgewotICBpZiAodW5pdF9zaXplIDwgMCB8fCB1bml0X3NpemUgPiAoMSA8PCAyOCkpIHsKLSAgICBtX25Vbml0U2l6ZSA9IDQ7Ci0gIH0gZWxzZSB7Ci0gICAgbV9uVW5pdFNpemUgPSB1bml0X3NpemU7Ci0gIH0KLX0KLUNGWF9CYXNpY0FycmF5Ojp+Q0ZYX0Jhc2ljQXJyYXkoKSB7Ci0gIEZYX0ZyZWUobV9wRGF0YSk7Ci19Ci1ib29sIENGWF9CYXNpY0FycmF5OjpTZXRTaXplKGludCBuTmV3U2l6ZSkgewotICBpZiAobk5ld1NpemUgPD0gMCkgewotICAgIEZYX0ZyZWUobV9wRGF0YSk7Ci0gICAgbV9wRGF0YSA9IG51bGxwdHI7Ci0gICAgbV9uU2l6ZSA9IG1fbk1heFNpemUgPSAwOwotICAgIHJldHVybiAwID09IG5OZXdTaXplOwotICB9Ci0KLSAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQ+IHRvdGFsU2l6ZSA9IG5OZXdTaXplOwotICAgIHRvdGFsU2l6ZSAqPSBtX25Vbml0U2l6ZTsKLSAgICBpZiAoIXRvdGFsU2l6ZS5Jc1ZhbGlkKCkpIHsKLSAgICAgIG1fblNpemUgPSBtX25NYXhTaXplID0gMDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgbV9wRGF0YSA9Ci0gICAgICAgIEZYX0FsbG9jKHVpbnQ4X3QsIHBkZml1bTo6YmFzZTo6VmFsdWVPckRpZUZvclR5cGU8c2l6ZV90Pih0b3RhbFNpemUpKTsKLSAgICBtX25TaXplID0gbV9uTWF4U2l6ZSA9IG5OZXdTaXplOwotICB9IGVsc2UgaWYgKG5OZXdTaXplIDw9IG1fbk1heFNpemUpIHsKLSAgICBpZiAobk5ld1NpemUgPiBtX25TaXplKSB7Ci0gICAgICBGWFNZU19tZW1zZXQobV9wRGF0YSArIG1fblNpemUgKiBtX25Vbml0U2l6ZSwgMCwKLSAgICAgICAgICAgICAgICAgICAobk5ld1NpemUgLSBtX25TaXplKSAqIG1fblVuaXRTaXplKTsKLSAgICB9Ci0gICAgbV9uU2l6ZSA9IG5OZXdTaXplOwotICB9IGVsc2UgewotICAgIGludCBuTmV3TWF4ID0gbk5ld1NpemUgPCBtX25NYXhTaXplID8gbV9uTWF4U2l6ZSA6IG5OZXdTaXplOwotICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8aW50PiB0b3RhbFNpemUgPSBuTmV3TWF4OwotICAgIHRvdGFsU2l6ZSAqPSBtX25Vbml0U2l6ZTsKLSAgICBpZiAoIXRvdGFsU2l6ZS5Jc1ZhbGlkKCkgfHwgbk5ld01heCA8IG1fblNpemUpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgdWludDhfdCogcE5ld0RhdGEgPSBGWF9SZWFsbG9jKAotICAgICAgICB1aW50OF90LCBtX3BEYXRhLCBwZGZpdW06OmJhc2U6OlZhbHVlT3JEaWVGb3JUeXBlPHNpemVfdD4odG90YWxTaXplKSk7Ci0gICAgaWYgKCFwTmV3RGF0YSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBGWFNZU19tZW1zZXQocE5ld0RhdGEgKyBtX25TaXplICogbV9uVW5pdFNpemUsIDAsCi0gICAgICAgICAgICAgICAgIChuTmV3TWF4IC0gbV9uU2l6ZSkgKiBtX25Vbml0U2l6ZSk7Ci0gICAgbV9wRGF0YSA9IHBOZXdEYXRhOwotICAgIG1fblNpemUgPSBuTmV3U2l6ZTsKLSAgICBtX25NYXhTaXplID0gbk5ld01heDsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgQ0ZYX0Jhc2ljQXJyYXk6OkFwcGVuZChjb25zdCBDRlhfQmFzaWNBcnJheSYgc3JjKSB7Ci0gIGludCBuT2xkU2l6ZSA9IG1fblNpemU7Ci0gIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8aW50PiBuZXdTaXplID0gbV9uU2l6ZTsKLSAgbmV3U2l6ZSArPSBzcmMubV9uU2l6ZTsKLSAgaWYgKG1fblVuaXRTaXplICE9IHNyYy5tX25Vbml0U2l6ZSB8fCAhbmV3U2l6ZS5Jc1ZhbGlkKCkgfHwKLSAgICAgICFTZXRTaXplKG5ld1NpemUuVmFsdWVPckRpZSgpKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIEZYU1lTX21lbWNweShtX3BEYXRhICsgbk9sZFNpemUgKiBtX25Vbml0U2l6ZSwgc3JjLm1fcERhdGEsCi0gICAgICAgICAgICAgICBzcmMubV9uU2l6ZSAqIG1fblVuaXRTaXplKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci1ib29sIENGWF9CYXNpY0FycmF5OjpDb3B5KGNvbnN0IENGWF9CYXNpY0FycmF5JiBzcmMpIHsKLSAgaWYgKCFTZXRTaXplKHNyYy5tX25TaXplKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBGWFNZU19tZW1jcHkobV9wRGF0YSwgc3JjLm1fcERhdGEsIHNyYy5tX25TaXplICogbV9uVW5pdFNpemUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLXVpbnQ4X3QqIENGWF9CYXNpY0FycmF5OjpJbnNlcnRTcGFjZUF0KGludCBuSW5kZXgsIGludCBuQ291bnQpIHsKLSAgaWYgKG5JbmRleCA8IDAgfHwgbkNvdW50IDw9IDApIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBpZiAobkluZGV4ID49IG1fblNpemUpIHsKLSAgICBpZiAoIVNldFNpemUobkluZGV4ICsgbkNvdW50KSkgewotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGludCBuT2xkU2l6ZSA9IG1fblNpemU7Ci0gICAgaWYgKCFTZXRTaXplKG1fblNpemUgKyBuQ291bnQpKSB7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgRlhTWVNfbWVtbW92ZShtX3BEYXRhICsgKG5JbmRleCArIG5Db3VudCkgKiBtX25Vbml0U2l6ZSwKLSAgICAgICAgICAgICAgICAgIG1fcERhdGEgKyBuSW5kZXggKiBtX25Vbml0U2l6ZSwKLSAgICAgICAgICAgICAgICAgIChuT2xkU2l6ZSAtIG5JbmRleCkgKiBtX25Vbml0U2l6ZSk7Ci0gICAgRlhTWVNfbWVtc2V0KG1fcERhdGEgKyBuSW5kZXggKiBtX25Vbml0U2l6ZSwgMCwgbkNvdW50ICogbV9uVW5pdFNpemUpOwotICB9Ci0gIHJldHVybiBtX3BEYXRhICsgbkluZGV4ICogbV9uVW5pdFNpemU7Ci19Ci1ib29sIENGWF9CYXNpY0FycmF5OjpSZW1vdmVBdChpbnQgbkluZGV4LCBpbnQgbkNvdW50KSB7Ci0gIGlmIChuSW5kZXggPCAwIHx8IG5Db3VudCA8PSAwIHx8IG1fblNpemUgPCBuSW5kZXggKyBuQ291bnQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaW50IG5Nb3ZlQ291bnQgPSBtX25TaXplIC0gKG5JbmRleCArIG5Db3VudCk7Ci0gIGlmIChuTW92ZUNvdW50KSB7Ci0gICAgRlhTWVNfbWVtbW92ZShtX3BEYXRhICsgbkluZGV4ICogbV9uVW5pdFNpemUsCi0gICAgICAgICAgICAgICAgICBtX3BEYXRhICsgKG5JbmRleCArIG5Db3VudCkgKiBtX25Vbml0U2l6ZSwKLSAgICAgICAgICAgICAgICAgIG5Nb3ZlQ291bnQgKiBtX25Vbml0U2l6ZSk7Ci0gIH0KLSAgbV9uU2l6ZSAtPSBuQ291bnQ7Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDRlhfQmFzaWNBcnJheTo6SW5zZXJ0QXQoaW50IG5TdGFydEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Jhc2ljQXJyYXkqIHBOZXdBcnJheSkgewotICBpZiAoIXBOZXdBcnJheSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAocE5ld0FycmF5LT5tX25TaXplID09IDApIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoIUluc2VydFNwYWNlQXQoblN0YXJ0SW5kZXgsIHBOZXdBcnJheS0+bV9uU2l6ZSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRlhTWVNfbWVtY3B5KG1fcERhdGEgKyBuU3RhcnRJbmRleCAqIG1fblVuaXRTaXplLCBwTmV3QXJyYXktPm1fcERhdGEsCi0gICAgICAgICAgICAgICBwTmV3QXJyYXktPm1fblNpemUgKiBtX25Vbml0U2l6ZSk7Ci0gIHJldHVybiB0cnVlOwotfQotY29uc3Qgdm9pZCogQ0ZYX0Jhc2ljQXJyYXk6OkdldERhdGFQdHIoaW50IGluZGV4KSBjb25zdCB7Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbV9uU2l6ZSB8fCAhbV9wRGF0YSkgewotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHJldHVybiBtX3BEYXRhICsgaW5kZXggKiBtX25Vbml0U2l6ZTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvZnhfYmFzaWNfYnN0cmluZy5jcHAgYi9jb3JlL2Z4Y3J0L2Z4X2Jhc2ljX2JzdHJpbmcuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjY5NDc0Li4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjcnQvZnhfYmFzaWNfYnN0cmluZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNjdHlwZT4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3N0cmluZ19wb29sX3RlbXBsYXRlLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9tYXRoLmgiCi0KLXRlbXBsYXRlIGNsYXNzIENGWF9TdHJpbmdEYXRhVGVtcGxhdGU8RlhfQ0hBUj47Ci10ZW1wbGF0ZSBjbGFzcyBDRlhfU3RyaW5nQ1RlbXBsYXRlPEZYX0NIQVI+OwotdGVtcGxhdGUgY2xhc3MgQ0ZYX1N0cmluZ1Bvb2xUZW1wbGF0ZTxDRlhfQnl0ZVN0cmluZz47Ci10ZW1wbGF0ZSBzdHJ1Y3Qgc3RkOjpoYXNoPENGWF9CeXRlU3RyaW5nPjsKLQotbmFtZXNwYWNlIHsKLQotaW50IEJ1ZmZlcl9pdG9hKGNoYXIqIGJ1ZiwgaW50IGksIHVpbnQzMl90IGZsYWdzKSB7Ci0gIGlmIChpID09IDApIHsKLSAgICBidWZbMF0gPSAnMCc7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgY2hhciBidWYxWzMyXTsKLSAgaW50IGJ1Zl9wb3MgPSAzMTsKLSAgdWludDMyX3QgdSA9IGk7Ci0gIGlmICgoZmxhZ3MgJiBGWEZPUk1BVF9TSUdORUQpICYmIGkgPCAwKSB7Ci0gICAgdSA9IC1pOwotICB9Ci0gIGludCBiYXNlID0gMTA7Ci0gIGNvbnN0IEZYX0NIQVIqIHN0ciA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKLSAgaWYgKGZsYWdzICYgRlhGT1JNQVRfSEVYKSB7Ci0gICAgYmFzZSA9IDE2OwotICAgIGlmIChmbGFncyAmIEZYRk9STUFUX0NBUElUQUwpIHsKLSAgICAgIHN0ciA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKLSAgICB9Ci0gIH0KLSAgd2hpbGUgKHUgIT0gMCkgewotICAgIGJ1ZjFbYnVmX3Bvcy0tXSA9IHN0clt1ICUgYmFzZV07Ci0gICAgdSA9IHUgLyBiYXNlOwotICB9Ci0gIGlmICgoZmxhZ3MgJiBGWEZPUk1BVF9TSUdORUQpICYmIGkgPCAwKSB7Ci0gICAgYnVmMVtidWZfcG9zLS1dID0gJy0nOwotICB9Ci0gIGludCBsZW4gPSAzMSAtIGJ1Zl9wb3M7Ci0gIGZvciAoaW50IGlpID0gMDsgaWkgPCBsZW47IGlpKyspIHsKLSAgICBidWZbaWldID0gYnVmMVtpaSArIGJ1Zl9wb3MgKyAxXTsKLSAgfQotICByZXR1cm4gbGVuOwotfQotCi1jb25zdCBGWF9DSEFSKiBGWF9zdHJzdHIoY29uc3QgRlhfQ0hBUiogaGF5c3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhheXN0YWNrX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBuZWVkbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5lZWRsZV9sZW4pIHsKLSAgaWYgKG5lZWRsZV9sZW4gPiBoYXlzdGFja19sZW4gfHwgbmVlZGxlX2xlbiA9PSAwKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgY29uc3QgRlhfQ0hBUiogZW5kX3B0ciA9IGhheXN0YWNrICsgaGF5c3RhY2tfbGVuIC0gbmVlZGxlX2xlbjsKLSAgd2hpbGUgKGhheXN0YWNrIDw9IGVuZF9wdHIpIHsKLSAgICBpbnQgaSA9IDA7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgIGlmIChoYXlzdGFja1tpXSAhPSBuZWVkbGVbaV0pIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpKys7Ci0gICAgICBpZiAoaSA9PSBuZWVkbGVfbGVuKSB7Ci0gICAgICAgIHJldHVybiBoYXlzdGFjazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaGF5c3RhY2srKzsKLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLXN0YXRpY19hc3NlcnQoc2l6ZW9mKENGWF9CeXRlU3RyaW5nKSA8PSBzaXplb2YoRlhfQ0hBUiopLAotICAgICAgICAgICAgICAiU3RyaW5ncyBtdXN0IG5vdCByZXF1aXJlIG1vcmUgc3BhY2UgdGhhbiBwb2ludGVycyIpOwotCi1DRlhfQnl0ZVN0cmluZzo6Q0ZYX0J5dGVTdHJpbmcoY29uc3QgRlhfQ0hBUiogcFN0ciwgRlhfU1RSU0laRSBuTGVuKSB7Ci0gIGlmIChuTGVuIDwgMCkKLSAgICBuTGVuID0gcFN0ciA/IEZYU1lTX3N0cmxlbihwU3RyKSA6IDA7Ci0KLSAgaWYgKG5MZW4pCi0gICAgbV9wRGF0YS5SZXNldChTdHJpbmdEYXRhOjpDcmVhdGUocFN0ciwgbkxlbikpOwotfQotCi1DRlhfQnl0ZVN0cmluZzo6Q0ZYX0J5dGVTdHJpbmcoY29uc3QgdWludDhfdCogcFN0ciwgRlhfU1RSU0laRSBuTGVuKSB7Ci0gIGlmIChuTGVuID4gMCkgewotICAgIG1fcERhdGEuUmVzZXQoCi0gICAgICAgIFN0cmluZ0RhdGE6OkNyZWF0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IEZYX0NIQVIqPihwU3RyKSwgbkxlbikpOwotICB9Ci19Ci0KLUNGWF9CeXRlU3RyaW5nOjpDRlhfQnl0ZVN0cmluZygpIHt9Ci0KLUNGWF9CeXRlU3RyaW5nOjpDRlhfQnl0ZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgb3RoZXIpCi0gICAgOiBtX3BEYXRhKG90aGVyLm1fcERhdGEpIHt9Ci0KLUNGWF9CeXRlU3RyaW5nOjpDRlhfQnl0ZVN0cmluZyhDRlhfQnl0ZVN0cmluZyYmIG90aGVyKSB7Ci0gIG1fcERhdGEuU3dhcChvdGhlci5tX3BEYXRhKTsKLX0KLQotQ0ZYX0J5dGVTdHJpbmc6OkNGWF9CeXRlU3RyaW5nKGNoYXIgY2gpIHsKLSAgbV9wRGF0YS5SZXNldChTdHJpbmdEYXRhOjpDcmVhdGUoMSkpOwotICBtX3BEYXRhLT5tX1N0cmluZ1swXSA9IGNoOwotfQotCi1DRlhfQnl0ZVN0cmluZzo6Q0ZYX0J5dGVTdHJpbmcoY29uc3QgRlhfQ0hBUiogcHRyKQotICAgIDogQ0ZYX0J5dGVTdHJpbmcocHRyLCBwdHIgPyBGWFNZU19zdHJsZW4ocHRyKSA6IDApIHt9Ci0KLUNGWF9CeXRlU3RyaW5nOjpDRlhfQnl0ZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cmluZ1NyYykgewotICBpZiAoIXN0cmluZ1NyYy5Jc0VtcHR5KCkpCi0gICAgbV9wRGF0YS5SZXNldChTdHJpbmdEYXRhOjpDcmVhdGUoc3RyaW5nU3JjLmNfc3RyKCksIHN0cmluZ1NyYy5HZXRMZW5ndGgoKSkpOwotfQotCi1DRlhfQnl0ZVN0cmluZzo6Q0ZYX0J5dGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyMikgewotICBpbnQgbk5ld0xlbiA9IHN0cjEuR2V0TGVuZ3RoKCkgKyBzdHIyLkdldExlbmd0aCgpOwotICBpZiAobk5ld0xlbiA9PSAwKQotICAgIHJldHVybjsKLQotICBtX3BEYXRhLlJlc2V0KFN0cmluZ0RhdGE6OkNyZWF0ZShuTmV3TGVuKSk7Ci0gIG1fcERhdGEtPkNvcHlDb250ZW50cyhzdHIxLmNfc3RyKCksIHN0cjEuR2V0TGVuZ3RoKCkpOwotICBtX3BEYXRhLT5Db3B5Q29udGVudHNBdChzdHIxLkdldExlbmd0aCgpLCBzdHIyLmNfc3RyKCksIHN0cjIuR2V0TGVuZ3RoKCkpOwotfQotCi1DRlhfQnl0ZVN0cmluZzo6fkNGWF9CeXRlU3RyaW5nKCkge30KLQotY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIENGWF9CeXRlU3RyaW5nOjpvcGVyYXRvcj0oY29uc3QgRlhfQ0hBUiogcFN0cikgewotICBpZiAoIXBTdHIgfHwgIXBTdHJbMF0pCi0gICAgY2xlYXIoKTsKLSAgZWxzZQotICAgIEFzc2lnbkNvcHkocFN0ciwgRlhTWVNfc3RybGVuKHBTdHIpKTsKLQotICByZXR1cm4gKnRoaXM7Ci19Ci0KLWNvbnN0IENGWF9CeXRlU3RyaW5nJiBDRlhfQnl0ZVN0cmluZzo6b3BlcmF0b3I9KAotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyaW5nU3JjKSB7Ci0gIGlmIChzdHJpbmdTcmMuSXNFbXB0eSgpKQotICAgIGNsZWFyKCk7Ci0gIGVsc2UKLSAgICBBc3NpZ25Db3B5KHN0cmluZ1NyYy5jX3N0cigpLCBzdHJpbmdTcmMuR2V0TGVuZ3RoKCkpOwotCi0gIHJldHVybiAqdGhpczsKLX0KLQotY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIENGWF9CeXRlU3RyaW5nOjpvcGVyYXRvcj0oCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZ1NyYykgewotICBpZiAobV9wRGF0YSAhPSBzdHJpbmdTcmMubV9wRGF0YSkKLSAgICBtX3BEYXRhID0gc3RyaW5nU3JjLm1fcERhdGE7Ci0KLSAgcmV0dXJuICp0aGlzOwotfQotCi1jb25zdCBDRlhfQnl0ZVN0cmluZyYgQ0ZYX0J5dGVTdHJpbmc6Om9wZXJhdG9yKz0oY29uc3QgRlhfQ0hBUiogcFN0cikgewotICBpZiAocFN0cikKLSAgICBDb25jYXQocFN0ciwgRlhTWVNfc3RybGVuKHBTdHIpKTsKLQotICByZXR1cm4gKnRoaXM7Ci19Ci0KLWNvbnN0IENGWF9CeXRlU3RyaW5nJiBDRlhfQnl0ZVN0cmluZzo6b3BlcmF0b3IrPShjaGFyIGNoKSB7Ci0gIENvbmNhdCgmY2gsIDEpOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLWNvbnN0IENGWF9CeXRlU3RyaW5nJiBDRlhfQnl0ZVN0cmluZzo6b3BlcmF0b3IrPShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKSB7Ci0gIGlmIChzdHIubV9wRGF0YSkKLSAgICBDb25jYXQoc3RyLm1fcERhdGEtPm1fU3RyaW5nLCBzdHIubV9wRGF0YS0+bV9uRGF0YUxlbmd0aCk7Ci0KLSAgcmV0dXJuICp0aGlzOwotfQotCi1jb25zdCBDRlhfQnl0ZVN0cmluZyYgQ0ZYX0J5dGVTdHJpbmc6Om9wZXJhdG9yKz0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpIHsKLSAgaWYgKCFzdHIuSXNFbXB0eSgpKQotICAgIENvbmNhdChzdHIuY19zdHIoKSwgc3RyLkdldExlbmd0aCgpKTsKLQotICByZXR1cm4gKnRoaXM7Ci19Ci0KLWJvb2wgQ0ZYX0J5dGVTdHJpbmc6Om9wZXJhdG9yPT0oY29uc3QgY2hhciogcHRyKSBjb25zdCB7Ci0gIGlmICghbV9wRGF0YSkKLSAgICByZXR1cm4gIXB0ciB8fCAhcHRyWzBdOwotCi0gIGlmICghcHRyKQotICAgIHJldHVybiBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID09IDA7Ci0KLSAgcmV0dXJuIEZYU1lTX3N0cmxlbihwdHIpID09IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggJiYKLSAgICAgICAgIEZYU1lTX21lbWNtcChwdHIsIG1fcERhdGEtPm1fU3RyaW5nLCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSA9PSAwOwotfQotCi1ib29sIENGWF9CeXRlU3RyaW5nOjpvcGVyYXRvcj09KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSBjb25zdCB7Ci0gIGlmICghbV9wRGF0YSkKLSAgICByZXR1cm4gc3RyLklzRW1wdHkoKTsKLQotICByZXR1cm4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9PSBzdHIuR2V0TGVuZ3RoKCkgJiYKLSAgICAgICAgIEZYU1lTX21lbWNtcChtX3BEYXRhLT5tX1N0cmluZywgc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSkgPT0gMDsKLX0KLQotYm9vbCBDRlhfQnl0ZVN0cmluZzo6b3BlcmF0b3I9PShjb25zdCBDRlhfQnl0ZVN0cmluZyYgb3RoZXIpIGNvbnN0IHsKLSAgaWYgKG1fcERhdGEgPT0gb3RoZXIubV9wRGF0YSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoSXNFbXB0eSgpKQotICAgIHJldHVybiBvdGhlci5Jc0VtcHR5KCk7Ci0KLSAgaWYgKG90aGVyLklzRW1wdHkoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIG90aGVyLm1fcERhdGEtPm1fbkRhdGFMZW5ndGggPT0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAmJgotICAgICAgICAgRlhTWVNfbWVtY21wKG90aGVyLm1fcERhdGEtPm1fU3RyaW5nLCBtX3BEYXRhLT5tX1N0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSA9PSAwOwotfQotCi1ib29sIENGWF9CeXRlU3RyaW5nOjpvcGVyYXRvcjwoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikgY29uc3QgewotICBpZiAobV9wRGF0YSA9PSBzdHIubV9wRGF0YSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW50IHJlc3VsdCA9IEZYU1lTX21lbWNtcChjX3N0cigpLCBzdHIuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1pbihHZXRMZW5ndGgoKSwgc3RyLkdldExlbmd0aCgpKSk7Ci0gIHJldHVybiByZXN1bHQgPCAwIHx8IChyZXN1bHQgPT0gMCAmJiBHZXRMZW5ndGgoKSA8IHN0ci5HZXRMZW5ndGgoKSk7Ci19Ci0KLWJvb2wgQ0ZYX0J5dGVTdHJpbmc6OkVxdWFsTm9DYXNlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSBjb25zdCB7Ci0gIGlmICghbV9wRGF0YSkKLSAgICByZXR1cm4gc3RyLklzRW1wdHkoKTsKLQotICBGWF9TVFJTSVpFIGxlbiA9IHN0ci5HZXRMZW5ndGgoKTsKLSAgaWYgKG1fcERhdGEtPm1fbkRhdGFMZW5ndGggIT0gbGVuKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjb25zdCB1aW50OF90KiBwVGhpcyA9IChjb25zdCB1aW50OF90KiltX3BEYXRhLT5tX1N0cmluZzsKLSAgY29uc3QgdWludDhfdCogcFRoYXQgPSBzdHIucmF3X3N0cigpOwotICBmb3IgKEZYX1NUUlNJWkUgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgIGlmICgoKnBUaGlzKSAhPSAoKnBUaGF0KSkgewotICAgICAgdWludDhfdCBiVGhpcyA9ICpwVGhpczsKLSAgICAgIGlmIChiVGhpcyA+PSAnQScgJiYgYlRoaXMgPD0gJ1onKQotICAgICAgICBiVGhpcyArPSAnYScgLSAnQSc7Ci0KLSAgICAgIHVpbnQ4X3QgYlRoYXQgPSAqcFRoYXQ7Ci0gICAgICBpZiAoYlRoYXQgPj0gJ0EnICYmIGJUaGF0IDw9ICdaJykKLSAgICAgICAgYlRoYXQgKz0gJ2EnIC0gJ0EnOwotCi0gICAgICBpZiAoYlRoaXMgIT0gYlRoYXQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcFRoaXMrKzsKLSAgICBwVGhhdCsrOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIENGWF9CeXRlU3RyaW5nOjpBc3NpZ25Db3B5KGNvbnN0IEZYX0NIQVIqIHBTcmNEYXRhLCBGWF9TVFJTSVpFIG5TcmNMZW4pIHsKLSAgQWxsb2NCZWZvcmVXcml0ZShuU3JjTGVuKTsKLSAgbV9wRGF0YS0+Q29weUNvbnRlbnRzKHBTcmNEYXRhLCBuU3JjTGVuKTsKLSAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5TcmNMZW47Ci19Ci0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OlJlYWxsb2NCZWZvcmVXcml0ZShGWF9TVFJTSVpFIG5OZXdMZW5ndGgpIHsKLSAgaWYgKG1fcERhdGEgJiYgbV9wRGF0YS0+Q2FuT3BlcmF0ZUluUGxhY2Uobk5ld0xlbmd0aCkpCi0gICAgcmV0dXJuOwotCi0gIGlmIChuTmV3TGVuZ3RoIDw9IDApIHsKLSAgICBjbGVhcigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENGWF9SZXRhaW5QdHI8U3RyaW5nRGF0YT4gcE5ld0RhdGEoU3RyaW5nRGF0YTo6Q3JlYXRlKG5OZXdMZW5ndGgpKTsKLSAgaWYgKG1fcERhdGEpIHsKLSAgICBGWF9TVFJTSVpFIG5Db3B5TGVuZ3RoID0gc3RkOjptaW4obV9wRGF0YS0+bV9uRGF0YUxlbmd0aCwgbk5ld0xlbmd0aCk7Ci0gICAgcE5ld0RhdGEtPkNvcHlDb250ZW50cyhtX3BEYXRhLT5tX1N0cmluZywgbkNvcHlMZW5ndGgpOwotICAgIHBOZXdEYXRhLT5tX25EYXRhTGVuZ3RoID0gbkNvcHlMZW5ndGg7Ci0gIH0gZWxzZSB7Ci0gICAgcE5ld0RhdGEtPm1fbkRhdGFMZW5ndGggPSAwOwotICB9Ci0gIHBOZXdEYXRhLT5tX1N0cmluZ1twTmV3RGF0YS0+bV9uRGF0YUxlbmd0aF0gPSAwOwotICBtX3BEYXRhLlN3YXAocE5ld0RhdGEpOwotfQotCi12b2lkIENGWF9CeXRlU3RyaW5nOjpBbGxvY0JlZm9yZVdyaXRlKEZYX1NUUlNJWkUgbk5ld0xlbmd0aCkgewotICBpZiAobV9wRGF0YSAmJiBtX3BEYXRhLT5DYW5PcGVyYXRlSW5QbGFjZShuTmV3TGVuZ3RoKSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKG5OZXdMZW5ndGggPD0gMCkgewotICAgIGNsZWFyKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgbV9wRGF0YS5SZXNldChTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbmd0aCkpOwotfQotCi12b2lkIENGWF9CeXRlU3RyaW5nOjpSZWxlYXNlQnVmZmVyKEZYX1NUUlNJWkUgbk5ld0xlbmd0aCkgewotICBpZiAoIW1fcERhdGEpCi0gICAgcmV0dXJuOwotCi0gIGlmIChuTmV3TGVuZ3RoID09IC0xKQotICAgIG5OZXdMZW5ndGggPSBGWFNZU19zdHJsZW4obV9wRGF0YS0+bV9TdHJpbmcpOwotCi0gIG5OZXdMZW5ndGggPSBzdGQ6Om1pbihuTmV3TGVuZ3RoLCBtX3BEYXRhLT5tX25BbGxvY0xlbmd0aCk7Ci0gIGlmIChuTmV3TGVuZ3RoID09IDApIHsKLSAgICBjbGVhcigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEFTU0VSVChtX3BEYXRhLT5tX25SZWZzID09IDEpOwotICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gbk5ld0xlbmd0aDsKLSAgbV9wRGF0YS0+bV9TdHJpbmdbbk5ld0xlbmd0aF0gPSAwOwotICBpZiAobV9wRGF0YS0+bV9uQWxsb2NMZW5ndGggLSBuTmV3TGVuZ3RoID49IDMyKSB7Ci0gICAgLy8gT3ZlciBhcmJpdHJhcnkgdGhyZXNob2xkLCBzbyBwYXkgdGhlIHByaWNlIHRvIHJlbG9jYXRlLiAgRm9yY2UgY29weSB0bwotICAgIC8vIGFsd2F5cyBvY2N1ciBieSBob2xkaW5nIGEgc2Vjb25kIHJlZmVyZW5jZSB0byB0aGUgc3RyaW5nLgotICAgIENGWF9CeXRlU3RyaW5nIHByZXNlcnZlKCp0aGlzKTsKLSAgICBSZWFsbG9jQmVmb3JlV3JpdGUobk5ld0xlbmd0aCk7Ci0gIH0KLX0KLQotdm9pZCBDRlhfQnl0ZVN0cmluZzo6UmVzZXJ2ZShGWF9TVFJTSVpFIGxlbikgewotICBHZXRCdWZmZXIobGVuKTsKLX0KLQotRlhfQ0hBUiogQ0ZYX0J5dGVTdHJpbmc6OkdldEJ1ZmZlcihGWF9TVFJTSVpFIG5NaW5CdWZMZW5ndGgpIHsKLSAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgaWYgKG5NaW5CdWZMZW5ndGggPT0gMCkKLSAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgbV9wRGF0YS5SZXNldChTdHJpbmdEYXRhOjpDcmVhdGUobk1pbkJ1Zkxlbmd0aCkpOwotICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSAwOwotICAgIG1fcERhdGEtPm1fU3RyaW5nWzBdID0gMDsKLSAgICByZXR1cm4gbV9wRGF0YS0+bV9TdHJpbmc7Ci0gIH0KLQotICBpZiAobV9wRGF0YS0+Q2FuT3BlcmF0ZUluUGxhY2Uobk1pbkJ1Zkxlbmd0aCkpCi0gICAgcmV0dXJuIG1fcERhdGEtPm1fU3RyaW5nOwotCi0gIG5NaW5CdWZMZW5ndGggPSBzdGQ6Om1heChuTWluQnVmTGVuZ3RoLCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKTsKLSAgaWYgKG5NaW5CdWZMZW5ndGggPT0gMCkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBDRlhfUmV0YWluUHRyPFN0cmluZ0RhdGE+IHBOZXdEYXRhKFN0cmluZ0RhdGE6OkNyZWF0ZShuTWluQnVmTGVuZ3RoKSk7Ci0gIHBOZXdEYXRhLT5Db3B5Q29udGVudHMoKm1fcERhdGEpOwotICBwTmV3RGF0YS0+bV9uRGF0YUxlbmd0aCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gIG1fcERhdGEuU3dhcChwTmV3RGF0YSk7Ci0gIHJldHVybiBtX3BEYXRhLT5tX1N0cmluZzsKLX0KLQotRlhfU1RSU0laRSBDRlhfQnl0ZVN0cmluZzo6RGVsZXRlKEZYX1NUUlNJWkUgbkluZGV4LCBGWF9TVFJTSVpFIG5Db3VudCkgewotICBpZiAoIW1fcERhdGEpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKG5JbmRleCA8IDApCi0gICAgbkluZGV4ID0gMDsKLQotICBGWF9TVFJTSVpFIG5PbGRMZW5ndGggPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwotICBpZiAobkNvdW50ID4gMCAmJiBuSW5kZXggPCBuT2xkTGVuZ3RoKSB7Ci0gICAgRlhfU1RSU0laRSBtTGVuZ3RoID0gbkluZGV4ICsgbkNvdW50OwotICAgIGlmIChtTGVuZ3RoID49IG5PbGRMZW5ndGgpIHsKLSAgICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuSW5kZXg7Ci0gICAgICByZXR1cm4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKLSAgICB9Ci0gICAgUmVhbGxvY0JlZm9yZVdyaXRlKG5PbGRMZW5ndGgpOwotICAgIGludCBuQ2hhcnNUb0NvcHkgPSBuT2xkTGVuZ3RoIC0gbUxlbmd0aCArIDE7Ci0gICAgRlhTWVNfbWVtbW92ZShtX3BEYXRhLT5tX1N0cmluZyArIG5JbmRleCwgbV9wRGF0YS0+bV9TdHJpbmcgKyBtTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgbkNoYXJzVG9Db3B5KTsKLSAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gbk9sZExlbmd0aCAtIG5Db3VudDsKLSAgfQotICByZXR1cm4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKLX0KLQotdm9pZCBDRlhfQnl0ZVN0cmluZzo6Q29uY2F0KGNvbnN0IEZYX0NIQVIqIHBTcmNEYXRhLCBGWF9TVFJTSVpFIG5TcmNMZW4pIHsKLSAgaWYgKCFwU3JjRGF0YSB8fCBuU3JjTGVuIDw9IDApCi0gICAgcmV0dXJuOwotCi0gIGlmICghbV9wRGF0YSkgewotICAgIG1fcERhdGEuUmVzZXQoU3RyaW5nRGF0YTo6Q3JlYXRlKHBTcmNEYXRhLCBuU3JjTGVuKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKG1fcERhdGEtPkNhbk9wZXJhdGVJblBsYWNlKG1fcERhdGEtPm1fbkRhdGFMZW5ndGggKyBuU3JjTGVuKSkgewotICAgIG1fcERhdGEtPkNvcHlDb250ZW50c0F0KG1fcERhdGEtPm1fbkRhdGFMZW5ndGgsIHBTcmNEYXRhLCBuU3JjTGVuKTsKLSAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICs9IG5TcmNMZW47Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ0ZYX1JldGFpblB0cjxTdHJpbmdEYXRhPiBwTmV3RGF0YSgKLSAgICAgIFN0cmluZ0RhdGE6OkNyZWF0ZShtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICsgblNyY0xlbikpOwotICBwTmV3RGF0YS0+Q29weUNvbnRlbnRzKCptX3BEYXRhKTsKLSAgcE5ld0RhdGEtPkNvcHlDb250ZW50c0F0KG1fcERhdGEtPm1fbkRhdGFMZW5ndGgsIHBTcmNEYXRhLCBuU3JjTGVuKTsKLSAgbV9wRGF0YS5Td2FwKHBOZXdEYXRhKTsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0J5dGVTdHJpbmc6Ok1pZChGWF9TVFJTSVpFIG5GaXJzdCkgY29uc3QgewotICBpZiAoIW1fcERhdGEpCi0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0KLSAgcmV0dXJuIE1pZChuRmlyc3QsIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggLSBuRmlyc3QpOwotfQotCi1DRlhfQnl0ZVN0cmluZyBDRlhfQnl0ZVN0cmluZzo6TWlkKEZYX1NUUlNJWkUgbkZpcnN0LCBGWF9TVFJTSVpFIG5Db3VudCkgY29uc3QgewotICBpZiAoIW1fcERhdGEpCi0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0KLSAgbkZpcnN0ID0gc3RkOjptaW4oc3RkOjptYXgobkZpcnN0LCAwKSwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCk7Ci0gIG5Db3VudCA9IHN0ZDo6bWluKHN0ZDo6bWF4KG5Db3VudCwgMCksIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggLSBuRmlyc3QpOwotICBpZiAobkNvdW50ID09IDApCi0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0KLSAgaWYgKG5GaXJzdCA9PSAwICYmIG5Db3VudCA9PSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKQotICAgIHJldHVybiAqdGhpczsKLQotICBDRlhfQnl0ZVN0cmluZyBkZXN0OwotICBBbGxvY0NvcHkoZGVzdCwgbkNvdW50LCBuRmlyc3QpOwotICByZXR1cm4gZGVzdDsKLX0KLQotdm9pZCBDRlhfQnl0ZVN0cmluZzo6QWxsb2NDb3B5KENGWF9CeXRlU3RyaW5nJiBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1NUUlNJWkUgbkNvcHlMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSBuQ29weUluZGV4KSBjb25zdCB7Ci0gIGlmIChuQ29weUxlbiA8PSAwKQotICAgIHJldHVybjsKLQotICBDRlhfUmV0YWluUHRyPFN0cmluZ0RhdGE+IHBOZXdEYXRhKAotICAgICAgU3RyaW5nRGF0YTo6Q3JlYXRlKG1fcERhdGEtPm1fU3RyaW5nICsgbkNvcHlJbmRleCwgbkNvcHlMZW4pKTsKLSAgZGVzdC5tX3BEYXRhLlN3YXAocE5ld0RhdGEpOwotfQotCi0jZGVmaW5lIEZPUkNFX0FOU0kgMHgxMDAwMAotI2RlZmluZSBGT1JDRV9VTklDT0RFIDB4MjAwMDAKLSNkZWZpbmUgRk9SQ0VfSU5UNjQgMHg0MDAwMAotCi1DRlhfQnl0ZVN0cmluZyBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0SW50ZWdlcihpbnQgaSwgdWludDMyX3QgZmxhZ3MpIHsKLSAgY2hhciBidWZbMzJdOwotICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoYnVmLCBCdWZmZXJfaXRvYShidWYsIGksIGZsYWdzKSk7Ci19Ci0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OkZvcm1hdFYoY29uc3QgRlhfQ0hBUiogcEZvcm1hdCwgdmFfbGlzdCBhcmdMaXN0KSB7Ci0gIHZhX2xpc3QgYXJnTGlzdFNhdmU7Ci0jaWYgZGVmaW5lZChfX0FSTUNDX1ZFUlNJT04pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoIWRlZmluZWQoX01TQ19WRVIpICYmIChfRlhfQ1BVXyA9PSBfRlhfWDY0XyB8fCBfRlhfQ1BVXyA9PSBfRlhfSUE2NF8gfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9GWF9DUFVfID09IF9GWF9BUk02NF8pKSB8fCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZGVmaW5lZChfX25hdGl2ZV9jbGllbnRfXykKLSAgdmFfY29weShhcmdMaXN0U2F2ZSwgYXJnTGlzdCk7Ci0jZWxzZQotICBhcmdMaXN0U2F2ZSA9IGFyZ0xpc3Q7Ci0jZW5kaWYKLSAgaW50IG5NYXhMZW4gPSAwOwotICBmb3IgKGNvbnN0IEZYX0NIQVIqIHBTdHIgPSBwRm9ybWF0OyAqcFN0ciAhPSAwOyBwU3RyKyspIHsKLSAgICBpZiAoKnBTdHIgIT0gJyUnIHx8ICoocFN0ciA9IHBTdHIgKyAxKSA9PSAnJScpIHsKLSAgICAgIG5NYXhMZW4gKz0gRlhTWVNfc3RybGVuKHBTdHIpOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGludCBuSXRlbUxlbiA9IDA7Ci0gICAgaW50IG5XaWR0aCA9IDA7Ci0gICAgZm9yICg7ICpwU3RyICE9IDA7IHBTdHIrKykgewotICAgICAgaWYgKCpwU3RyID09ICcjJykgewotICAgICAgICBuTWF4TGVuICs9IDI7Ci0gICAgICB9IGVsc2UgaWYgKCpwU3RyID09ICcqJykgewotICAgICAgICBuV2lkdGggPSB2YV9hcmcoYXJnTGlzdCwgaW50KTsKLSAgICAgIH0gZWxzZSBpZiAoKnBTdHIgIT0gJy0nICYmICpwU3RyICE9ICcrJyAmJiAqcFN0ciAhPSAnMCcgJiYgKnBTdHIgIT0gJyAnKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBpZiAobldpZHRoID09IDApIHsKLSAgICAgIG5XaWR0aCA9IEZYU1lTX2F0b2kocFN0cik7Ci0gICAgICB3aGlsZSAoc3RkOjppc2RpZ2l0KCpwU3RyKSkKLSAgICAgICAgcFN0cisrOwotICAgIH0KLSAgICBpZiAobldpZHRoIDwgMCB8fCBuV2lkdGggPiAxMjggKiAxMDI0KSB7Ci0gICAgICBwRm9ybWF0ID0gIkJhZCB3aWR0aCI7Ci0gICAgICBuTWF4TGVuID0gMTA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaW50IG5QcmVjaXNpb24gPSAwOwotICAgIGlmICgqcFN0ciA9PSAnLicpIHsKLSAgICAgIHBTdHIrKzsKLSAgICAgIGlmICgqcFN0ciA9PSAnKicpIHsKLSAgICAgICAgblByZWNpc2lvbiA9IHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICBwU3RyKys7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBuUHJlY2lzaW9uID0gRlhTWVNfYXRvaShwU3RyKTsKLSAgICAgICAgd2hpbGUgKHN0ZDo6aXNkaWdpdCgqcFN0cikpCi0gICAgICAgICAgcFN0cisrOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoblByZWNpc2lvbiA8IDAgfHwgblByZWNpc2lvbiA+IDEyOCAqIDEwMjQpIHsKLSAgICAgIHBGb3JtYXQgPSAiQmFkIHByZWNpc2lvbiI7Ci0gICAgICBuTWF4TGVuID0gMTQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaW50IG5Nb2RpZmllciA9IDA7Ci0gICAgaWYgKEZYU1lTX3N0cm5jbXAocFN0ciwgIkk2NCIsIDMpID09IDApIHsKLSAgICAgIHBTdHIgKz0gMzsKLSAgICAgIG5Nb2RpZmllciA9IEZPUkNFX0lOVDY0OwotICAgIH0gZWxzZSB7Ci0gICAgICBzd2l0Y2ggKCpwU3RyKSB7Ci0gICAgICAgIGNhc2UgJ2gnOgotICAgICAgICAgIG5Nb2RpZmllciA9IEZPUkNFX0FOU0k7Ci0gICAgICAgICAgcFN0cisrOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdsJzoKLSAgICAgICAgICBuTW9kaWZpZXIgPSBGT1JDRV9VTklDT0RFOwotICAgICAgICAgIHBTdHIrKzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnRic6Ci0gICAgICAgIGNhc2UgJ04nOgotICAgICAgICBjYXNlICdMJzoKLSAgICAgICAgICBwU3RyKys7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHN3aXRjaCAoKnBTdHIgfCBuTW9kaWZpZXIpIHsKLSAgICAgIGNhc2UgJ2MnOgotICAgICAgY2FzZSAnQyc6Ci0gICAgICAgIG5JdGVtTGVuID0gMjsKLSAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIGludCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnYycgfCBGT1JDRV9BTlNJOgotICAgICAgY2FzZSAnQycgfCBGT1JDRV9BTlNJOgotICAgICAgICBuSXRlbUxlbiA9IDI7Ci0gICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ2MnIHwgRk9SQ0VfVU5JQ09ERToKLSAgICAgIGNhc2UgJ0MnIHwgRk9SQ0VfVU5JQ09ERToKLSAgICAgICAgbkl0ZW1MZW4gPSAyOwotICAgICAgICB2YV9hcmcoYXJnTGlzdCwgaW50KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdzJzogewotICAgICAgICBjb25zdCBGWF9DSEFSKiBwc3RyTmV4dEFyZyA9IHZhX2FyZyhhcmdMaXN0LCBjb25zdCBGWF9DSEFSKik7Ci0gICAgICAgIGlmIChwc3RyTmV4dEFyZykgewotICAgICAgICAgIG5JdGVtTGVuID0gRlhTWVNfc3RybGVuKHBzdHJOZXh0QXJnKTsKLSAgICAgICAgICBpZiAobkl0ZW1MZW4gPCAxKSB7Ci0gICAgICAgICAgICBuSXRlbUxlbiA9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG5JdGVtTGVuID0gNjsKLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgJ1MnOiB7Ci0gICAgICAgIEZYX1dDSEFSKiBwc3RyTmV4dEFyZyA9IHZhX2FyZyhhcmdMaXN0LCBGWF9XQ0hBUiopOwotICAgICAgICBpZiAocHN0ck5leHRBcmcpIHsKLSAgICAgICAgICBuSXRlbUxlbiA9IEZYU1lTX3djc2xlbihwc3RyTmV4dEFyZyk7Ci0gICAgICAgICAgaWYgKG5JdGVtTGVuIDwgMSkgewotICAgICAgICAgICAgbkl0ZW1MZW4gPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBuSXRlbUxlbiA9IDY7Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlICdzJyB8IEZPUkNFX0FOU0k6Ci0gICAgICBjYXNlICdTJyB8IEZPUkNFX0FOU0k6IHsKLSAgICAgICAgY29uc3QgRlhfQ0hBUiogcHN0ck5leHRBcmcgPSB2YV9hcmcoYXJnTGlzdCwgY29uc3QgRlhfQ0hBUiopOwotICAgICAgICBpZiAocHN0ck5leHRBcmcpIHsKLSAgICAgICAgICBuSXRlbUxlbiA9IEZYU1lTX3N0cmxlbihwc3RyTmV4dEFyZyk7Ci0gICAgICAgICAgaWYgKG5JdGVtTGVuIDwgMSkgewotICAgICAgICAgICAgbkl0ZW1MZW4gPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBuSXRlbUxlbiA9IDY7Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlICdzJyB8IEZPUkNFX1VOSUNPREU6Ci0gICAgICBjYXNlICdTJyB8IEZPUkNFX1VOSUNPREU6IHsKLSAgICAgICAgRlhfV0NIQVIqIHBzdHJOZXh0QXJnID0gdmFfYXJnKGFyZ0xpc3QsIEZYX1dDSEFSKik7Ci0gICAgICAgIGlmIChwc3RyTmV4dEFyZykgewotICAgICAgICAgIG5JdGVtTGVuID0gRlhTWVNfd2NzbGVuKHBzdHJOZXh0QXJnKTsKLSAgICAgICAgICBpZiAobkl0ZW1MZW4gPCAxKSB7Ci0gICAgICAgICAgICBuSXRlbUxlbiA9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG5JdGVtTGVuID0gNjsKLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICB9Ci0gICAgaWYgKG5JdGVtTGVuICE9IDApIHsKLSAgICAgIGlmIChuUHJlY2lzaW9uICE9IDAgJiYgbkl0ZW1MZW4gPiBuUHJlY2lzaW9uKSB7Ci0gICAgICAgIG5JdGVtTGVuID0gblByZWNpc2lvbjsKLSAgICAgIH0KLSAgICAgIGlmIChuSXRlbUxlbiA8IG5XaWR0aCkgewotICAgICAgICBuSXRlbUxlbiA9IG5XaWR0aDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgc3dpdGNoICgqcFN0cikgewotICAgICAgICBjYXNlICdkJzoKLSAgICAgICAgY2FzZSAnaSc6Ci0gICAgICAgIGNhc2UgJ3UnOgotICAgICAgICBjYXNlICd4JzoKLSAgICAgICAgY2FzZSAnWCc6Ci0gICAgICAgIGNhc2UgJ28nOgotICAgICAgICAgIGlmIChuTW9kaWZpZXIgJiBGT1JDRV9JTlQ2NCkgewotICAgICAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIGludDY0X3QpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2YV9hcmcoYXJnTGlzdCwgaW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbkl0ZW1MZW4gPSAzMjsKLSAgICAgICAgICBpZiAobkl0ZW1MZW4gPCBuV2lkdGggKyBuUHJlY2lzaW9uKSB7Ci0gICAgICAgICAgICBuSXRlbUxlbiA9IG5XaWR0aCArIG5QcmVjaXNpb247Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdhJzoKLSAgICAgICAgY2FzZSAnQSc6Ci0gICAgICAgIGNhc2UgJ2UnOgotICAgICAgICBjYXNlICdFJzoKLSAgICAgICAgY2FzZSAnZyc6Ci0gICAgICAgIGNhc2UgJ0cnOgotICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBkb3VibGUpOwotICAgICAgICAgIG5JdGVtTGVuID0gMTI4OwotICAgICAgICAgIGlmIChuSXRlbUxlbiA8IG5XaWR0aCArIG5QcmVjaXNpb24pIHsKLSAgICAgICAgICAgIG5JdGVtTGVuID0gbldpZHRoICsgblByZWNpc2lvbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2YnOgotICAgICAgICAgIGlmIChuV2lkdGggKyBuUHJlY2lzaW9uID4gMTAwKSB7Ci0gICAgICAgICAgICBuSXRlbUxlbiA9IG5QcmVjaXNpb24gKyBuV2lkdGggKyAxMjg7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNoYXIgcHN6VGVtcFsyNTZdOwotICAgICAgICAgICAgZG91YmxlIGYgPSB2YV9hcmcoYXJnTGlzdCwgZG91YmxlKTsKLSAgICAgICAgICAgIG1lbXNldChwc3pUZW1wLCAwLCBzaXplb2YocHN6VGVtcCkpOwotICAgICAgICAgICAgRlhTWVNfc25wcmludGYocHN6VGVtcCwgc2l6ZW9mKHBzelRlbXApIC0gMSwgIiUqLipmIiwgbldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgblByZWNpc2lvbiArIDYsIGYpOwotICAgICAgICAgICAgbkl0ZW1MZW4gPSBGWFNZU19zdHJsZW4ocHN6VGVtcCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdwJzoKLSAgICAgICAgICB2YV9hcmcoYXJnTGlzdCwgdm9pZCopOwotICAgICAgICAgIG5JdGVtTGVuID0gMzI7Ci0gICAgICAgICAgaWYgKG5JdGVtTGVuIDwgbldpZHRoICsgblByZWNpc2lvbikgewotICAgICAgICAgICAgbkl0ZW1MZW4gPSBuV2lkdGggKyBuUHJlY2lzaW9uOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnbic6Ci0gICAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIGludCopOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBuTWF4TGVuICs9IG5JdGVtTGVuOwotICB9Ci0gIG5NYXhMZW4gKz0gMzI7ICAvLyBGdWRnZSBmYWN0b3IuCi0gIEdldEJ1ZmZlcihuTWF4TGVuKTsKLSAgaWYgKG1fcERhdGEpIHsKLSAgICBtZW1zZXQobV9wRGF0YS0+bV9TdHJpbmcsIDAsIG5NYXhMZW4pOwotICAgIEZYU1lTX3ZzbnByaW50ZihtX3BEYXRhLT5tX1N0cmluZywgbk1heExlbiAtIDEsIHBGb3JtYXQsIGFyZ0xpc3RTYXZlKTsKLSAgICBSZWxlYXNlQnVmZmVyKCk7Ci0gIH0KLSAgdmFfZW5kKGFyZ0xpc3RTYXZlKTsKLX0KLQotdm9pZCBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0KGNvbnN0IEZYX0NIQVIqIHBGb3JtYXQsIC4uLikgewotICB2YV9saXN0IGFyZ0xpc3Q7Ci0gIHZhX3N0YXJ0KGFyZ0xpc3QsIHBGb3JtYXQpOwotICBGb3JtYXRWKHBGb3JtYXQsIGFyZ0xpc3QpOwotICB2YV9lbmQoYXJnTGlzdCk7Ci19Ci0KLUZYX1NUUlNJWkUgQ0ZYX0J5dGVTdHJpbmc6Okluc2VydChGWF9TVFJTSVpFIG5JbmRleCwgRlhfQ0hBUiBjaCkgewotICBGWF9TVFJTSVpFIG5OZXdMZW5ndGggPSBtX3BEYXRhID8gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA6IDA7Ci0gIG5JbmRleCA9IHN0ZDo6bWF4KG5JbmRleCwgMCk7Ci0gIG5JbmRleCA9IHN0ZDo6bWluKG5JbmRleCwgbk5ld0xlbmd0aCk7Ci0gIG5OZXdMZW5ndGgrKzsKLQotICBSZWFsbG9jQmVmb3JlV3JpdGUobk5ld0xlbmd0aCk7Ci0gIEZYU1lTX21lbW1vdmUobV9wRGF0YS0+bV9TdHJpbmcgKyBuSW5kZXggKyAxLCBtX3BEYXRhLT5tX1N0cmluZyArIG5JbmRleCwKLSAgICAgICAgICAgICAgICBuTmV3TGVuZ3RoIC0gbkluZGV4KTsKLSAgbV9wRGF0YS0+bV9TdHJpbmdbbkluZGV4XSA9IGNoOwotICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gbk5ld0xlbmd0aDsKLSAgcmV0dXJuIG5OZXdMZW5ndGg7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENGWF9CeXRlU3RyaW5nOjpSaWdodChGWF9TVFJTSVpFIG5Db3VudCkgY29uc3QgewotICBpZiAoIW1fcERhdGEpCi0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0KLSAgbkNvdW50ID0gc3RkOjptYXgobkNvdW50LCAwKTsKLSAgaWYgKG5Db3VudCA+PSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKQotICAgIHJldHVybiAqdGhpczsKLQotICBDRlhfQnl0ZVN0cmluZyBkZXN0OwotICBBbGxvY0NvcHkoZGVzdCwgbkNvdW50LCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC0gbkNvdW50KTsKLSAgcmV0dXJuIGRlc3Q7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENGWF9CeXRlU3RyaW5nOjpMZWZ0KEZYX1NUUlNJWkUgbkNvdW50KSBjb25zdCB7Ci0gIGlmICghbV9wRGF0YSkKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKLQotICBuQ291bnQgPSBzdGQ6Om1heChuQ291bnQsIDApOwotICBpZiAobkNvdW50ID49IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpCi0gICAgcmV0dXJuICp0aGlzOwotCi0gIENGWF9CeXRlU3RyaW5nIGRlc3Q7Ci0gIEFsbG9jQ29weShkZXN0LCBuQ291bnQsIDApOwotICByZXR1cm4gZGVzdDsKLX0KLQotRlhfU1RSU0laRSBDRlhfQnl0ZVN0cmluZzo6RmluZChGWF9DSEFSIGNoLCBGWF9TVFJTSVpFIG5TdGFydCkgY29uc3QgewotICBpZiAoIW1fcERhdGEpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChuU3RhcnQgPCAwIHx8IG5TdGFydCA+PSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKQotICAgIHJldHVybiAtMTsKLQotICBjb25zdCBGWF9DSEFSKiBwU3RyID0gc3RhdGljX2Nhc3Q8Y29uc3QgRlhfQ0hBUio+KAotICAgICAgbWVtY2hyKG1fcERhdGEtPm1fU3RyaW5nICsgblN0YXJ0LCBjaCwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAtIG5TdGFydCkpOwotICByZXR1cm4gcFN0ciA/IHBTdHIgLSBtX3BEYXRhLT5tX1N0cmluZyA6IC0xOwotfQotCi1GWF9TVFJTSVpFIENGWF9CeXRlU3RyaW5nOjpSZXZlcnNlRmluZChGWF9DSEFSIGNoKSBjb25zdCB7Ci0gIGlmICghbV9wRGF0YSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgRlhfU1RSU0laRSBuTGVuZ3RoID0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKLSAgd2hpbGUgKG5MZW5ndGgtLSkgewotICAgIGlmIChtX3BEYXRhLT5tX1N0cmluZ1tuTGVuZ3RoXSA9PSBjaCkKLSAgICAgIHJldHVybiBuTGVuZ3RoOwotICB9Ci0gIHJldHVybiAtMTsKLX0KLQotRlhfU1RSU0laRSBDRlhfQnl0ZVN0cmluZzo6RmluZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHBTdWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1NUUlNJWkUgblN0YXJ0KSBjb25zdCB7Ci0gIGlmICghbV9wRGF0YSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgRlhfU1RSU0laRSBuTGVuZ3RoID0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKLSAgaWYgKG5TdGFydCA+IG5MZW5ndGgpCi0gICAgcmV0dXJuIC0xOwotCi0gIGNvbnN0IEZYX0NIQVIqIHBTdHIgPQotICAgICAgRlhfc3Ryc3RyKG1fcERhdGEtPm1fU3RyaW5nICsgblN0YXJ0LCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC0gblN0YXJ0LAotICAgICAgICAgICAgICAgIHBTdWIuY19zdHIoKSwgcFN1Yi5HZXRMZW5ndGgoKSk7Ci0gIHJldHVybiBwU3RyID8gKGludCkocFN0ciAtIG1fcERhdGEtPm1fU3RyaW5nKSA6IC0xOwotfQotCi12b2lkIENGWF9CeXRlU3RyaW5nOjpNYWtlTG93ZXIoKSB7Ci0gIGlmICghbV9wRGF0YSkKLSAgICByZXR1cm47Ci0KLSAgUmVhbGxvY0JlZm9yZVdyaXRlKG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpOwotICBGWFNZU19zdHJsd3IobV9wRGF0YS0+bV9TdHJpbmcpOwotfQotCi12b2lkIENGWF9CeXRlU3RyaW5nOjpNYWtlVXBwZXIoKSB7Ci0gIGlmICghbV9wRGF0YSkKLSAgICByZXR1cm47Ci0KLSAgUmVhbGxvY0JlZm9yZVdyaXRlKG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpOwotICBGWFNZU19zdHJ1cHIobV9wRGF0YS0+bV9TdHJpbmcpOwotfQotCi1GWF9TVFJTSVpFIENGWF9CeXRlU3RyaW5nOjpSZW1vdmUoRlhfQ0hBUiBjaFJlbW92ZSkgewotICBpZiAoIW1fcERhdGEgfHwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA8IDEpCi0gICAgcmV0dXJuIDA7Ci0KLSAgRlhfQ0hBUiogcHN0clNvdXJjZSA9IG1fcERhdGEtPm1fU3RyaW5nOwotICBGWF9DSEFSKiBwc3RyRW5kID0gbV9wRGF0YS0+bV9TdHJpbmcgKyBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwotICB3aGlsZSAocHN0clNvdXJjZSA8IHBzdHJFbmQpIHsKLSAgICBpZiAoKnBzdHJTb3VyY2UgPT0gY2hSZW1vdmUpCi0gICAgICBicmVhazsKLSAgICBwc3RyU291cmNlKys7Ci0gIH0KLSAgaWYgKHBzdHJTb3VyY2UgPT0gcHN0ckVuZCkKLSAgICByZXR1cm4gMDsKLQotICBwdHJkaWZmX3QgY29waWVkID0gcHN0clNvdXJjZSAtIG1fcERhdGEtPm1fU3RyaW5nOwotICBSZWFsbG9jQmVmb3JlV3JpdGUobV9wRGF0YS0+bV9uRGF0YUxlbmd0aCk7Ci0gIHBzdHJTb3VyY2UgPSBtX3BEYXRhLT5tX1N0cmluZyArIGNvcGllZDsKLSAgcHN0ckVuZCA9IG1fcERhdGEtPm1fU3RyaW5nICsgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKLQotICBGWF9DSEFSKiBwc3RyRGVzdCA9IHBzdHJTb3VyY2U7Ci0gIHdoaWxlIChwc3RyU291cmNlIDwgcHN0ckVuZCkgewotICAgIGlmICgqcHN0clNvdXJjZSAhPSBjaFJlbW92ZSkgewotICAgICAgKnBzdHJEZXN0ID0gKnBzdHJTb3VyY2U7Ci0gICAgICBwc3RyRGVzdCsrOwotICAgIH0KLSAgICBwc3RyU291cmNlKys7Ci0gIH0KLQotICAqcHN0ckRlc3QgPSAwOwotICBGWF9TVFJTSVpFIG5Db3VudCA9IChGWF9TVFJTSVpFKShwc3RyU291cmNlIC0gcHN0ckRlc3QpOwotICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC09IG5Db3VudDsKLSAgcmV0dXJuIG5Db3VudDsKLX0KLQotRlhfU1RSU0laRSBDRlhfQnl0ZVN0cmluZzo6UmVwbGFjZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHBPbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcE5ldykgewotICBpZiAoIW1fcERhdGEgfHwgcE9sZC5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgRlhfU1RSU0laRSBuU291cmNlTGVuID0gcE9sZC5HZXRMZW5ndGgoKTsKLSAgRlhfU1RSU0laRSBuUmVwbGFjZW1lbnRMZW4gPSBwTmV3LkdldExlbmd0aCgpOwotICBGWF9TVFJTSVpFIG5Db3VudCA9IDA7Ci0gIGNvbnN0IEZYX0NIQVIqIHBTdGFydCA9IG1fcERhdGEtPm1fU3RyaW5nOwotICBGWF9DSEFSKiBwRW5kID0gbV9wRGF0YS0+bV9TdHJpbmcgKyBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwotICB3aGlsZSAoMSkgewotICAgIGNvbnN0IEZYX0NIQVIqIHBUYXJnZXQgPSBGWF9zdHJzdHIocFN0YXJ0LCAoRlhfU1RSU0laRSkocEVuZCAtIHBTdGFydCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2xkLmNfc3RyKCksIG5Tb3VyY2VMZW4pOwotICAgIGlmICghcFRhcmdldCkKLSAgICAgIGJyZWFrOwotCi0gICAgbkNvdW50Kys7Ci0gICAgcFN0YXJ0ID0gcFRhcmdldCArIG5Tb3VyY2VMZW47Ci0gIH0KLSAgaWYgKG5Db3VudCA9PSAwKQotICAgIHJldHVybiAwOwotCi0gIEZYX1NUUlNJWkUgbk5ld0xlbmd0aCA9Ci0gICAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICsgKG5SZXBsYWNlbWVudExlbiAtIG5Tb3VyY2VMZW4pICogbkNvdW50OwotCi0gIGlmIChuTmV3TGVuZ3RoID09IDApIHsKLSAgICBjbGVhcigpOwotICAgIHJldHVybiBuQ291bnQ7Ci0gIH0KLQotICBDRlhfUmV0YWluUHRyPFN0cmluZ0RhdGE+IHBOZXdEYXRhKFN0cmluZ0RhdGE6OkNyZWF0ZShuTmV3TGVuZ3RoKSk7Ci0gIHBTdGFydCA9IG1fcERhdGEtPm1fU3RyaW5nOwotICBGWF9DSEFSKiBwRGVzdCA9IHBOZXdEYXRhLT5tX1N0cmluZzsKLSAgZm9yIChGWF9TVFJTSVpFIGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKLSAgICBjb25zdCBGWF9DSEFSKiBwVGFyZ2V0ID0gRlhfc3Ryc3RyKHBTdGFydCwgKEZYX1NUUlNJWkUpKHBFbmQgLSBwU3RhcnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9sZC5jX3N0cigpLCBuU291cmNlTGVuKTsKLSAgICBGWFNZU19tZW1jcHkocERlc3QsIHBTdGFydCwgcFRhcmdldCAtIHBTdGFydCk7Ci0gICAgcERlc3QgKz0gcFRhcmdldCAtIHBTdGFydDsKLSAgICBGWFNZU19tZW1jcHkocERlc3QsIHBOZXcuY19zdHIoKSwgcE5ldy5HZXRMZW5ndGgoKSk7Ci0gICAgcERlc3QgKz0gcE5ldy5HZXRMZW5ndGgoKTsKLSAgICBwU3RhcnQgPSBwVGFyZ2V0ICsgblNvdXJjZUxlbjsKLSAgfQotICBGWFNZU19tZW1jcHkocERlc3QsIHBTdGFydCwgcEVuZCAtIHBTdGFydCk7Ci0gIG1fcERhdGEuU3dhcChwTmV3RGF0YSk7Ci0gIHJldHVybiBuQ291bnQ7Ci19Ci0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OlNldEF0KEZYX1NUUlNJWkUgbkluZGV4LCBGWF9DSEFSIGNoKSB7Ci0gIGlmICghbV9wRGF0YSkgewotICAgIHJldHVybjsKLSAgfQotICBBU1NFUlQobkluZGV4ID49IDApOwotICBBU1NFUlQobkluZGV4IDwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCk7Ci0gIFJlYWxsb2NCZWZvcmVXcml0ZShtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKTsKLSAgbV9wRGF0YS0+bV9TdHJpbmdbbkluZGV4XSA9IGNoOwotfQotCi1DRlhfV2lkZVN0cmluZyBDRlhfQnl0ZVN0cmluZzo6VVRGOERlY29kZSgpIGNvbnN0IHsKLSAgQ0ZYX1VURjhEZWNvZGVyIGRlY29kZXI7Ci0gIGZvciAoRlhfU1RSU0laRSBpID0gMDsgaSA8IEdldExlbmd0aCgpOyBpKyspIHsKLSAgICBkZWNvZGVyLklucHV0KCh1aW50OF90KW1fcERhdGEtPm1fU3RyaW5nW2ldKTsKLSAgfQotICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoZGVjb2Rlci5HZXRSZXN1bHQoKSk7Ci19Ci0KLS8vIHN0YXRpYwotQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKGNvbnN0IEZYX1dDSEFSKiBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSBsZW4pIHsKLSAgRlhfU1RSU0laRSBzdHJfbGVuID0gbGVuID49IDAgPyBsZW4gOiBGWFNZU193Y3NsZW4oc3RyKTsKLSAgcmV0dXJuIEZyb21Vbmljb2RlKENGWF9XaWRlU3RyaW5nKHN0ciwgc3RyX2xlbikpOwotfQotCi0vLyBzdGF0aWMKLUNGWF9CeXRlU3RyaW5nIENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiBDRlhfQ2hhck1hcDo6R2V0Qnl0ZVN0cmluZygwLCBzdHIuQXNTdHJpbmdDKCkpOwotfQotCi1pbnQgQ0ZYX0J5dGVTdHJpbmc6OkNvbXBhcmUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpIGNvbnN0IHsKLSAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgcmV0dXJuIHN0ci5Jc0VtcHR5KCkgPyAwIDogLTE7Ci0gIH0KLSAgaW50IHRoaXNfbGVuID0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKLSAgaW50IHRoYXRfbGVuID0gc3RyLkdldExlbmd0aCgpOwotICBpbnQgbWluX2xlbiA9IHRoaXNfbGVuIDwgdGhhdF9sZW4gPyB0aGlzX2xlbiA6IHRoYXRfbGVuOwotICBmb3IgKGludCBpID0gMDsgaSA8IG1pbl9sZW47IGkrKykgewotICAgIGlmICgodWludDhfdCltX3BEYXRhLT5tX1N0cmluZ1tpXSA8IHN0ci5HZXRBdChpKSkgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoKHVpbnQ4X3QpbV9wRGF0YS0+bV9TdHJpbmdbaV0gPiBzdHIuR2V0QXQoaSkpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotICBpZiAodGhpc19sZW4gPCB0aGF0X2xlbikgewotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAodGhpc19sZW4gPiB0aGF0X2xlbikgewotICAgIHJldHVybiAxOwotICB9Ci0gIHJldHVybiAwOwotfQotCi12b2lkIENGWF9CeXRlU3RyaW5nOjpUcmltUmlnaHQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBwVGFyZ2V0cykgewotICBpZiAoIW1fcERhdGEgfHwgcFRhcmdldHMuSXNFbXB0eSgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIEZYX1NUUlNJWkUgcG9zID0gR2V0TGVuZ3RoKCk7Ci0gIGlmIChwb3MgPCAxKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHdoaWxlIChwb3MpIHsKLSAgICBGWF9TVFJTSVpFIGkgPSAwOwotICAgIHdoaWxlIChpIDwgcFRhcmdldHMuR2V0TGVuZ3RoKCkgJiYKLSAgICAgICAgICAgcFRhcmdldHNbaV0gIT0gbV9wRGF0YS0+bV9TdHJpbmdbcG9zIC0gMV0pIHsKLSAgICAgIGkrKzsKLSAgICB9Ci0gICAgaWYgKGkgPT0gcFRhcmdldHMuR2V0TGVuZ3RoKCkpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBwb3MtLTsKLSAgfQotICBpZiAocG9zIDwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkgewotICAgIFJlYWxsb2NCZWZvcmVXcml0ZShtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKTsKLSAgICBtX3BEYXRhLT5tX1N0cmluZ1twb3NdID0gMDsKLSAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gcG9zOwotICB9Ci19Ci0KLXZvaWQgQ0ZYX0J5dGVTdHJpbmc6OlRyaW1SaWdodChGWF9DSEFSIGNoVGFyZ2V0KSB7Ci0gIFRyaW1SaWdodChDRlhfQnl0ZVN0cmluZ0MoY2hUYXJnZXQpKTsKLX0KLQotdm9pZCBDRlhfQnl0ZVN0cmluZzo6VHJpbVJpZ2h0KCkgewotICBUcmltUmlnaHQoIlx4MDlceDBhXHgwYlx4MGNceDBkXHgyMCIpOwotfQotCi12b2lkIENGWF9CeXRlU3RyaW5nOjpUcmltTGVmdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHBUYXJnZXRzKSB7Ci0gIGlmICghbV9wRGF0YSB8fCBwVGFyZ2V0cy5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuOwotCi0gIEZYX1NUUlNJWkUgbGVuID0gR2V0TGVuZ3RoKCk7Ci0gIGlmIChsZW4gPCAxKQotICAgIHJldHVybjsKLQotICBGWF9TVFJTSVpFIHBvcyA9IDA7Ci0gIHdoaWxlIChwb3MgPCBsZW4pIHsKLSAgICBGWF9TVFJTSVpFIGkgPSAwOwotICAgIHdoaWxlIChpIDwgcFRhcmdldHMuR2V0TGVuZ3RoKCkgJiYgcFRhcmdldHNbaV0gIT0gbV9wRGF0YS0+bV9TdHJpbmdbcG9zXSkgewotICAgICAgaSsrOwotICAgIH0KLSAgICBpZiAoaSA9PSBwVGFyZ2V0cy5HZXRMZW5ndGgoKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHBvcysrOwotICB9Ci0gIGlmIChwb3MpIHsKLSAgICBSZWFsbG9jQmVmb3JlV3JpdGUobGVuKTsKLSAgICBGWF9TVFJTSVpFIG5EYXRhTGVuZ3RoID0gbGVuIC0gcG9zOwotICAgIEZYU1lTX21lbW1vdmUobV9wRGF0YS0+bV9TdHJpbmcsIG1fcERhdGEtPm1fU3RyaW5nICsgcG9zLAotICAgICAgICAgICAgICAgICAgKG5EYXRhTGVuZ3RoICsgMSkgKiBzaXplb2YoRlhfQ0hBUikpOwotICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuRGF0YUxlbmd0aDsKLSAgfQotfQotCi12b2lkIENGWF9CeXRlU3RyaW5nOjpUcmltTGVmdChGWF9DSEFSIGNoVGFyZ2V0KSB7Ci0gIFRyaW1MZWZ0KENGWF9CeXRlU3RyaW5nQyhjaFRhcmdldCkpOwotfQotCi12b2lkIENGWF9CeXRlU3RyaW5nOjpUcmltTGVmdCgpIHsKLSAgVHJpbUxlZnQoIlx4MDlceDBhXHgwYlx4MGNceDBkXHgyMCIpOwotfQotCi11aW50MzJfdCBDRlhfQnl0ZVN0cmluZzo6R2V0SUQoRlhfU1RSU0laRSBzdGFydF9wb3MpIGNvbnN0IHsKLSAgcmV0dXJuIEFzU3RyaW5nQygpLkdldElEKHN0YXJ0X3Bvcyk7Ci19Ci1GWF9TVFJTSVpFIEZYX2Z0b2EoRlhfRkxPQVQgZCwgRlhfQ0hBUiogYnVmKSB7Ci0gIGJ1ZlswXSA9ICcwJzsKLSAgYnVmWzFdID0gJ1wwJzsKLSAgaWYgKGQgPT0gMC4wZikgewotICAgIHJldHVybiAxOwotICB9Ci0gIGJvb2wgYk5lZ2F0aXZlID0gZmFsc2U7Ci0gIGlmIChkIDwgMCkgewotICAgIGJOZWdhdGl2ZSA9IHRydWU7Ci0gICAgZCA9IC1kOwotICB9Ci0gIGludCBzY2FsZSA9IDE7Ci0gIGludCBzY2FsZWQgPSBGWFNZU19yb3VuZChkKTsKLSAgd2hpbGUgKHNjYWxlZCA8IDEwMDAwMCkgewotICAgIGlmIChzY2FsZSA9PSAxMDAwMDAwKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgc2NhbGUgKj0gMTA7Ci0gICAgc2NhbGVkID0gRlhTWVNfcm91bmQoZCAqIHNjYWxlKTsKLSAgfQotICBpZiAoc2NhbGVkID09IDApIHsKLSAgICByZXR1cm4gMTsKLSAgfQotICBjaGFyIGJ1ZjJbMzJdOwotICBpbnQgYnVmX3NpemUgPSAwOwotICBpZiAoYk5lZ2F0aXZlKSB7Ci0gICAgYnVmW2J1Zl9zaXplKytdID0gJy0nOwotICB9Ci0gIGludCBpID0gc2NhbGVkIC8gc2NhbGU7Ci0gIEZYU1lTX2l0b2EoaSwgYnVmMiwgMTApOwotICBGWF9TVFJTSVpFIGxlbiA9IEZYU1lTX3N0cmxlbihidWYyKTsKLSAgRlhTWVNfbWVtY3B5KGJ1ZiArIGJ1Zl9zaXplLCBidWYyLCBsZW4pOwotICBidWZfc2l6ZSArPSBsZW47Ci0gIGludCBmcmFjdGlvbiA9IHNjYWxlZCAlIHNjYWxlOwotICBpZiAoZnJhY3Rpb24gPT0gMCkgewotICAgIHJldHVybiBidWZfc2l6ZTsKLSAgfQotICBidWZbYnVmX3NpemUrK10gPSAnLic7Ci0gIHNjYWxlIC89IDEwOwotICB3aGlsZSAoZnJhY3Rpb24pIHsKLSAgICBidWZbYnVmX3NpemUrK10gPSAnMCcgKyBmcmFjdGlvbiAvIHNjYWxlOwotICAgIGZyYWN0aW9uICU9IHNjYWxlOwotICAgIHNjYWxlIC89IDEwOwotICB9Ci0gIHJldHVybiBidWZfc2l6ZTsKLX0KLUNGWF9CeXRlU3RyaW5nIENGWF9CeXRlU3RyaW5nOjpGb3JtYXRGbG9hdChGWF9GTE9BVCBkLCBpbnQgcHJlY2lzaW9uKSB7Ci0gIEZYX0NIQVIgYnVmWzMyXTsKLSAgRlhfU1RSU0laRSBsZW4gPSBGWF9mdG9hKGQsIGJ1Zik7Ci0gIHJldHVybiBDRlhfQnl0ZVN0cmluZyhidWYsIGxlbik7Ci19CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Z4X2Jhc2ljX2JzdHJpbmdfdW5pdHRlc3QuY3BwIGIvY29yZS9meGNydC9meF9iYXNpY19ic3RyaW5nX3VuaXR0ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTAzZTY4NC4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Y3J0L2Z4X2Jhc2ljX2JzdHJpbmdfdW5pdHRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTEwMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgInRlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLVRFU1QoZnhjcnQsIEJ5dGVTdHJpbmdPcGVyYXRvclN1YnNjcmlwdCkgewotICAvLyBDRlhfQnl0ZVN0cmluZyBpbmNsdWRlcyB0aGUgTlVMIHRlcm1pbmF0b3IgZm9yIG5vbi1lbXB0eSBzdHJpbmdzLgotICBDRlhfQnl0ZVN0cmluZyBhYmMoImFiYyIpOwotICBFWFBFQ1RfRVEoJ2EnLCBhYmNbMF0pOwotICBFWFBFQ1RfRVEoJ2InLCBhYmNbMV0pOwotICBFWFBFQ1RfRVEoJ2MnLCBhYmNbMl0pOwotICBFWFBFQ1RfRVEoMCwgYWJjWzNdKTsKLX0KLQotVEVTVChmeGNydCwgQnl0ZVN0cmluZ09wZXJhdG9yTFQpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgZW1wdHk7Ci0gIENGWF9CeXRlU3RyaW5nIGEoImEiKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgYWJjKCJhYmMiKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgZGVmKCJkZWYiKTsKLQotICBFWFBFQ1RfRkFMU0UoZW1wdHkgPCBlbXB0eSk7Ci0gIEVYUEVDVF9GQUxTRShhIDwgYSk7Ci0gIEVYUEVDVF9GQUxTRShhYmMgPCBhYmMpOwotICBFWFBFQ1RfRkFMU0UoZGVmIDwgZGVmKTsKLQotICBFWFBFQ1RfVFJVRShlbXB0eSA8IGEpOwotICBFWFBFQ1RfRkFMU0UoYSA8IGVtcHR5KTsKLQotICBFWFBFQ1RfVFJVRShlbXB0eSA8IGFiYyk7Ci0gIEVYUEVDVF9GQUxTRShhYmMgPCBlbXB0eSk7Ci0KLSAgRVhQRUNUX1RSVUUoZW1wdHkgPCBkZWYpOwotICBFWFBFQ1RfRkFMU0UoZGVmIDwgZW1wdHkpOwotCi0gIEVYUEVDVF9UUlVFKGEgPCBhYmMpOwotICBFWFBFQ1RfRkFMU0UoYWJjIDwgYSk7Ci0KLSAgRVhQRUNUX1RSVUUoYSA8IGRlZik7Ci0gIEVYUEVDVF9GQUxTRShkZWYgPCBhKTsKLQotICBFWFBFQ1RfVFJVRShhYmMgPCBkZWYpOwotICBFWFBFQ1RfRkFMU0UoZGVmIDwgYWJjKTsKLX0KLQotVEVTVChmeGNydCwgQnl0ZVN0cmluZ09wZXJhdG9yRVEpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgbnVsbF9zdHJpbmc7Ci0gIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKLQotICBDRlhfQnl0ZVN0cmluZyBlbXB0eV9zdHJpbmcoIiIpOwotICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKLSAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKLSAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKLQotICBDRlhfQnl0ZVN0cmluZyBkZWxldGVkX3N0cmluZygiaGVsbG8iKTsKLSAgZGVsZXRlZF9zdHJpbmcuRGVsZXRlKDAsIDUpOwotICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBkZWxldGVkX3N0cmluZyk7Ci0gIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKLSAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKLSAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOwotCi0gIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nKCJoZWxsbyIpOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBudWxsX3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgPT0gYnl0ZV9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nID09IGJ5dGVfc3RyaW5nKTsKLSAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nID09IGJ5dGVfc3RyaW5nKTsKLQotICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZ19zYW1lMSgiaGVsbG8iKTsKLSAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgPT0gYnl0ZV9zdHJpbmdfc2FtZTEpOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19zYW1lMSA9PSBieXRlX3N0cmluZyk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmdfc2FtZTIoYnl0ZV9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZ19zYW1lMik7Ci0gIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX3NhbWUyID09IGJ5dGVfc3RyaW5nKTsKLQotICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZzEoImhlIik7Ci0gIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMigiaGVsbHAiKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmczKCJoZWxsb2QiKTsKLSAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGJ5dGVfc3RyaW5nMSk7Ci0gIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBieXRlX3N0cmluZzIpOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgPT0gYnl0ZV9zdHJpbmczKTsKLSAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nMSA9PSBieXRlX3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZzIgPT0gYnl0ZV9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmczID09IGJ5dGVfc3RyaW5nKTsKLQotICBDRlhfQnl0ZVN0cmluZ0MgbnVsbF9zdHJpbmdfYzsKLSAgQ0ZYX0J5dGVTdHJpbmdDIGVtcHR5X3N0cmluZ19jKCIiKTsKLSAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gbnVsbF9zdHJpbmdfYyk7Ci0gIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGVtcHR5X3N0cmluZ19jKTsKLSAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IG51bGxfc3RyaW5nX2MpOwotICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nX2MpOwotICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBudWxsX3N0cmluZ19jKTsKLSAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nX2MpOwotICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZ19jID09IG51bGxfc3RyaW5nKTsKLSAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nX2MgPT0gbnVsbF9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZ19jID09IGVtcHR5X3N0cmluZyk7Ci0gIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZ19jID09IGVtcHR5X3N0cmluZyk7Ci0gIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nX2MgPT0gZGVsZXRlZF9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmdfYyA9PSBkZWxldGVkX3N0cmluZyk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2Nfc2FtZTEoImhlbGxvIik7Ci0gIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nID09IGJ5dGVfc3RyaW5nX2Nfc2FtZTEpOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jX3NhbWUxID09IGJ5dGVfc3RyaW5nKTsKLQotICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYzEoImhlIik7Ci0gIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jMigiaGVsbHAiKTsKLSAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MzKCJoZWxsb2QiKTsKLSAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGJ5dGVfc3RyaW5nX2MxKTsKLSAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGJ5dGVfc3RyaW5nX2MyKTsKLSAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGJ5dGVfc3RyaW5nX2MzKTsKLSAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MxID09IGJ5dGVfc3RyaW5nKTsKLSAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MyID09IGJ5dGVfc3RyaW5nKTsKLSAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MzID09IGJ5dGVfc3RyaW5nKTsKLQotICBjb25zdCBjaGFyKiBjX251bGxfc3RyaW5nID0gbnVsbHB0cjsKLSAgY29uc3QgY2hhciogY19lbXB0eV9zdHJpbmcgPSAiIjsKLSAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gY19udWxsX3N0cmluZyk7Ci0gIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGNfZW1wdHlfc3RyaW5nKTsKLSAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IGNfbnVsbF9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gY19lbXB0eV9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBjX251bGxfc3RyaW5nKTsKLSAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gY19lbXB0eV9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShjX251bGxfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKLSAgRVhQRUNUX1RSVUUoY19lbXB0eV9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShjX251bGxfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7Ci0gIEVYUEVDVF9UUlVFKGNfZW1wdHlfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7Ci0gIEVYUEVDVF9UUlVFKGNfbnVsbF9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShjX2VtcHR5X3N0cmluZyA9PSBkZWxldGVkX3N0cmluZyk7Ci0KLSAgY29uc3QgY2hhciogY19zdHJpbmdfc2FtZTEgPSAiaGVsbG8iOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyA9PSBjX3N0cmluZ19zYW1lMSk7Ci0gIEVYUEVDVF9UUlVFKGNfc3RyaW5nX3NhbWUxID09IGJ5dGVfc3RyaW5nKTsKLQotICBjb25zdCBjaGFyKiBjX3N0cmluZzEgPSAiaGUiOwotICBjb25zdCBjaGFyKiBjX3N0cmluZzIgPSAiaGVsbHAiOwotICBjb25zdCBjaGFyKiBjX3N0cmluZzMgPSAiaGVsbG9kIjsKLSAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nID09IGNfc3RyaW5nMSk7Ci0gIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyA9PSBjX3N0cmluZzIpOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgPT0gY19zdHJpbmczKTsKLSAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMSA9PSBieXRlX3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRShjX3N0cmluZzIgPT0gYnl0ZV9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoY19zdHJpbmczID09IGJ5dGVfc3RyaW5nKTsKLX0KLQotVEVTVChmeGNydCwgQnl0ZVN0cmluZ09wZXJhdG9yTkUpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgbnVsbF9zdHJpbmc7Ci0gIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBudWxsX3N0cmluZyk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgZW1wdHlfc3RyaW5nKCIiKTsKLSAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IG51bGxfc3RyaW5nKTsKLSAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgZGVsZXRlZF9zdHJpbmcoImhlbGxvIik7Ci0gIGRlbGV0ZWRfc3RyaW5nLkRlbGV0ZSgwLCA1KTsKLSAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IGRlbGV0ZWRfc3RyaW5nKTsKLSAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IG51bGxfc3RyaW5nKTsKLSAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOwotCi0gIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nKCJoZWxsbyIpOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgIT0gYnl0ZV9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBudWxsX3N0cmluZyk7Ci0gIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7Ci0gIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IGRlbGV0ZWRfc3RyaW5nKTsKLSAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgIT0gYnl0ZV9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgIT0gYnl0ZV9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyAhPSBieXRlX3N0cmluZyk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmdfc2FtZTEoImhlbGxvIik7Ci0gIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZyAhPSBieXRlX3N0cmluZ19zYW1lMSk7Ci0gIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19zYW1lMSAhPSBieXRlX3N0cmluZyk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmdfc2FtZTIoYnl0ZV9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgIT0gYnl0ZV9zdHJpbmdfc2FtZTIpOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfc2FtZTIgIT0gYnl0ZV9zdHJpbmcpOwotCi0gIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMSgiaGUiKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmcyKCJoZWxscCIpOwotICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZzMoImhlbGxvZCIpOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBieXRlX3N0cmluZzEpOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBieXRlX3N0cmluZzIpOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBieXRlX3N0cmluZzMpOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZzEgIT0gYnl0ZV9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZzIgIT0gYnl0ZV9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZzMgIT0gYnl0ZV9zdHJpbmcpOwotCi0gIENGWF9CeXRlU3RyaW5nQyBudWxsX3N0cmluZ19jOwotICBDRlhfQnl0ZVN0cmluZ0MgZW1wdHlfc3RyaW5nX2MoIiIpOwotICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gbnVsbF9zdHJpbmdfYyk7Ci0gIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBlbXB0eV9zdHJpbmdfYyk7Ci0gIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gbnVsbF9zdHJpbmdfYyk7Ci0gIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nX2MpOwotICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmdfYyAhPSBudWxsX3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmdfYyAhPSBudWxsX3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZ19jICE9IGVtcHR5X3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmdfYyAhPSBlbXB0eV9zdHJpbmcpOwotCi0gIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jX3NhbWUxKCJoZWxsbyIpOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgIT0gYnl0ZV9zdHJpbmdfY19zYW1lMSk7Ci0gIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jX3NhbWUxICE9IGJ5dGVfc3RyaW5nKTsKLQotICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYzEoImhlIik7Ci0gIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jMigiaGVsbHAiKTsKLSAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MzKCJoZWxsb2QiKTsKLSAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcgIT0gYnl0ZV9zdHJpbmdfYzEpOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBieXRlX3N0cmluZ19jMik7Ci0gIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nICE9IGJ5dGVfc3RyaW5nX2MzKTsKLSAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYzEgIT0gYnl0ZV9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jMiAhPSBieXRlX3N0cmluZyk7Ci0gIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MzICE9IGJ5dGVfc3RyaW5nKTsKLQotICBjb25zdCBjaGFyKiBjX251bGxfc3RyaW5nID0gbnVsbHB0cjsKLSAgY29uc3QgY2hhciogY19lbXB0eV9zdHJpbmcgPSAiIjsKLSAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGNfbnVsbF9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gY19lbXB0eV9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGNfbnVsbF9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGNfZW1wdHlfc3RyaW5nKTsKLSAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IGNfbnVsbF9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gY19lbXB0eV9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoY19udWxsX3N0cmluZyAhPSBudWxsX3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRShjX2VtcHR5X3N0cmluZyAhPSBudWxsX3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRShjX251bGxfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRShjX2VtcHR5X3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoY19udWxsX3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRShjX2VtcHR5X3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7Ci0KLSAgY29uc3QgY2hhciogY19zdHJpbmdfc2FtZTEgPSAiaGVsbG8iOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcgIT0gY19zdHJpbmdfc2FtZTEpOwotICBFWFBFQ1RfRkFMU0UoY19zdHJpbmdfc2FtZTEgIT0gYnl0ZV9zdHJpbmcpOwotCi0gIGNvbnN0IGNoYXIqIGNfc3RyaW5nMSA9ICJoZSI7Ci0gIGNvbnN0IGNoYXIqIGNfc3RyaW5nMiA9ICJoZWxscCI7Ci0gIGNvbnN0IGNoYXIqIGNfc3RyaW5nMyA9ICJoZWxsb2QiOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBjX3N0cmluZzEpOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBjX3N0cmluZzIpOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZyAhPSBjX3N0cmluZzMpOwotICBFWFBFQ1RfVFJVRShjX3N0cmluZzEgIT0gYnl0ZV9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShjX3N0cmluZzIgIT0gYnl0ZV9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShjX3N0cmluZzMgIT0gYnl0ZV9zdHJpbmcpOwotfQotCi1URVNUKGZ4Y3J0LCBCeXRlU3RyaW5nQ051bGwpIHsKLSAgQ0ZYX0J5dGVTdHJpbmdDIG51bGxfc3RyaW5nOwotICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcucmF3X3N0cigpKTsKLSAgRVhQRUNUX0VRKG51bGxfc3RyaW5nLkdldExlbmd0aCgpLCAwKTsKLSAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcuSXNFbXB0eSgpKTsKLQotICBDRlhfQnl0ZVN0cmluZ0MgYW5vdGhlcl9udWxsX3N0cmluZzsKLSAgRVhQRUNUX0VRKG51bGxfc3RyaW5nLCBhbm90aGVyX251bGxfc3RyaW5nKTsKLQotICBDRlhfQnl0ZVN0cmluZ0MgY29waWVkX251bGxfc3RyaW5nKG51bGxfc3RyaW5nKTsKLSAgRVhQRUNUX0ZBTFNFKGNvcGllZF9udWxsX3N0cmluZy5yYXdfc3RyKCkpOwotICBFWFBFQ1RfRVEoY29waWVkX251bGxfc3RyaW5nLkdldExlbmd0aCgpLCAwKTsKLSAgRVhQRUNUX1RSVUUoY29waWVkX251bGxfc3RyaW5nLklzRW1wdHkoKSk7Ci0gIEVYUEVDVF9FUShudWxsX3N0cmluZywgY29waWVkX251bGxfc3RyaW5nKTsKLQotICBDRlhfQnl0ZVN0cmluZ0MgZW1wdHlfc3RyaW5nKCIiKTsgIC8vIFBvaW50ZXIgdG8gTlVMLCBub3QgTlVMTCBwb2ludGVyLgotICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcucmF3X3N0cigpKTsKLSAgRVhQRUNUX0VRKGVtcHR5X3N0cmluZy5HZXRMZW5ndGgoKSwgMCk7Ci0gIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZy5Jc0VtcHR5KCkpOwotICBFWFBFQ1RfRVEobnVsbF9zdHJpbmcsIGVtcHR5X3N0cmluZyk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmdDIGFzc2lnbmVkX251bGxfc3RyaW5nKCJpbml0aWFsbHkgbm90IG51bGxwdHIiKTsKLSAgYXNzaWduZWRfbnVsbF9zdHJpbmcgPSBudWxsX3N0cmluZzsKLSAgRVhQRUNUX0ZBTFNFKGFzc2lnbmVkX251bGxfc3RyaW5nLnJhd19zdHIoKSk7Ci0gIEVYUEVDVF9FUShhc3NpZ25lZF9udWxsX3N0cmluZy5HZXRMZW5ndGgoKSwgMCk7Ci0gIEVYUEVDVF9UUlVFKGFzc2lnbmVkX251bGxfc3RyaW5nLklzRW1wdHkoKSk7Ci0gIEVYUEVDVF9FUShudWxsX3N0cmluZywgYXNzaWduZWRfbnVsbF9zdHJpbmcpOwotCi0gIENGWF9CeXRlU3RyaW5nQyBhc3NpZ25lZF9udWxscHRyX3N0cmluZygiaW5pdGlhbGx5IG5vdCBudWxscHRyIik7Ci0gIGFzc2lnbmVkX251bGxwdHJfc3RyaW5nID0gKGNvbnN0IEZYX0NIQVIqKW51bGxwdHI7Ci0gIEVYUEVDVF9GQUxTRShhc3NpZ25lZF9udWxscHRyX3N0cmluZy5yYXdfc3RyKCkpOwotICBFWFBFQ1RfRVEoYXNzaWduZWRfbnVsbHB0cl9zdHJpbmcuR2V0TGVuZ3RoKCksIDApOwotICBFWFBFQ1RfVFJVRShhc3NpZ25lZF9udWxscHRyX3N0cmluZy5Jc0VtcHR5KCkpOwotICBFWFBFQ1RfRVEobnVsbF9zdHJpbmcsIGFzc2lnbmVkX251bGxwdHJfc3RyaW5nKTsKLQotICBDRlhfQnl0ZVN0cmluZ0Mgbm9uX251bGxfc3RyaW5nKCJhIik7Ci0gIEVYUEVDVF9ORShudWxsX3N0cmluZywgbm9uX251bGxfc3RyaW5nKTsKLX0KLQotVEVTVChmeGNydCwgQnl0ZVN0cmluZ0NvbmNhdCkgewotICBDRlhfQnl0ZVN0cmluZyBmcmVkOwotICBmcmVkLkNvbmNhdCgiRlJFRCIsIDQpOwotICBFWFBFQ1RfRVEoIkZSRUQiLCBmcmVkKTsKLQotICBmcmVkLkNvbmNhdCgiRFkiLCAyKTsKLSAgRVhQRUNUX0VRKCJGUkVERFkiLCBmcmVkKTsKLQotICBmcmVkLkRlbGV0ZSgzLCAzKTsKLSAgRVhQRUNUX0VRKCJGUkUiLCBmcmVkKTsKLQotICBmcmVkLkNvbmNhdCgiRCIsIDEpOwotICBFWFBFQ1RfRVEoIkZSRUQiLCBmcmVkKTsKLQotICBDRlhfQnl0ZVN0cmluZyBjb3B5ID0gZnJlZDsKLSAgZnJlZC5Db25jYXQoIkRZIiwgMik7Ci0gIEVYUEVDVF9FUSgiRlJFRERZIiwgZnJlZCk7Ci0gIEVYUEVDVF9FUSgiRlJFRCIsIGNvcHkpOwotCi0gIC8vIFRlc3QgaW52YWxpZCBhcmd1bWVudHMuCi0gIGNvcHkgPSBmcmVkOwotICBmcmVkLkNvbmNhdCgiZnJlZGR5IiwgLTYpOwotICBDRlhfQnl0ZVN0cmluZyBub3RfYWxpYXNlZCgieHh4eHh4Iik7Ci0gIEVYUEVDVF9FUSgiRlJFRERZIiwgZnJlZCk7Ci0gIEVYUEVDVF9FUSgieHh4eHh4Iiwgbm90X2FsaWFzZWQpOwotfQotCi1URVNUKGZ4Y3J0LCBCeXRlU3RyaW5nUmVtb3ZlKSB7Ci0gIENGWF9CeXRlU3RyaW5nIGZyZWVkKCJGUkVFRCIpOwotICBmcmVlZC5SZW1vdmUoJ0UnKTsKLSAgRVhQRUNUX0VRKCJGUkQiLCBmcmVlZCk7Ci0gIGZyZWVkLlJlbW92ZSgnRicpOwotICBFWFBFQ1RfRVEoIlJEIiwgZnJlZWQpOwotICBmcmVlZC5SZW1vdmUoJ0QnKTsKLSAgRVhQRUNUX0VRKCJSIiwgZnJlZWQpOwotICBmcmVlZC5SZW1vdmUoJ1gnKTsKLSAgRVhQRUNUX0VRKCJSIiwgZnJlZWQpOwotICBmcmVlZC5SZW1vdmUoJ1InKTsKLSAgRVhQRUNUX0VRKCIiLCBmcmVlZCk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgZW1wdHk7Ci0gIGVtcHR5LlJlbW92ZSgnWCcpOwotICBFWFBFQ1RfRVEoIiIsIGVtcHR5KTsKLX0KLQotVEVTVChmeGNydCwgQnl0ZVN0cmluZ1JlbW92ZUNvcGllcykgewotICBDRlhfQnl0ZVN0cmluZyBmcmVlZCgiRlJFRUQiKTsKLSAgY29uc3QgRlhfQ0hBUiogb2xkX2J1ZmZlciA9IGZyZWVkLmNfc3RyKCk7Ci0KLSAgLy8gTm8gY2hhbmdlIHdpdGggc2luZ2xlIHJlZmVyZW5jZSAtIG5vIGNvcHkuCi0gIGZyZWVkLlJlbW92ZSgnUScpOwotICBFWFBFQ1RfRVEoIkZSRUVEIiwgZnJlZWQpOwotICBFWFBFQ1RfRVEob2xkX2J1ZmZlciwgZnJlZWQuY19zdHIoKSk7Ci0KLSAgLy8gQ2hhbmdlIHdpdGggc2luZ2xlIHJlZmVyZW5jZSAtIG5vIGNvcHkuCi0gIGZyZWVkLlJlbW92ZSgnRScpOwotICBFWFBFQ1RfRVEoIkZSRCIsIGZyZWVkKTsKLSAgRVhQRUNUX0VRKG9sZF9idWZmZXIsIGZyZWVkLmNfc3RyKCkpOwotCi0gIC8vIE5vIGNoYW5nZSB3aXRoIG11bHRpcGxlIHJlZmVyZW5jZXMgLSBubyBjb3B5LgotICBDRlhfQnl0ZVN0cmluZyBzaGFyZWQoZnJlZWQpOwotICBmcmVlZC5SZW1vdmUoJ1EnKTsKLSAgRVhQRUNUX0VRKCJGUkQiLCBmcmVlZCk7Ci0gIEVYUEVDVF9FUShvbGRfYnVmZmVyLCBmcmVlZC5jX3N0cigpKTsKLSAgRVhQRUNUX0VRKG9sZF9idWZmZXIsIHNoYXJlZC5jX3N0cigpKTsKLQotICAvLyBDaGFuZ2Ugd2l0aCBtdWx0aXBsZSByZWZlcmVuY2VzIC0tIG11c3QgY29weS4KLSAgZnJlZWQuUmVtb3ZlKCdEJyk7Ci0gIEVYUEVDVF9FUSgiRlIiLCBmcmVlZCk7Ci0gIEVYUEVDVF9ORShvbGRfYnVmZmVyLCBmcmVlZC5jX3N0cigpKTsKLSAgRVhQRUNUX0VRKCJGUkQiLCBzaGFyZWQpOwotICBFWFBFQ1RfRVEob2xkX2J1ZmZlciwgc2hhcmVkLmNfc3RyKCkpOwotfQotCi1URVNUKGZ4Y3J0LCBCeXRlU3RyaW5nUmVwbGFjZSkgewotICBDRlhfQnl0ZVN0cmluZyBmcmVkKCJGUkVEIik7Ci0gIGZyZWQuUmVwbGFjZSgiRlIiLCAiQkwiKTsKLSAgRVhQRUNUX0VRKCJCTEVEIiwgZnJlZCk7Ci0gIGZyZWQuUmVwbGFjZSgiRCIsICJERFkiKTsKLSAgRVhQRUNUX0VRKCJCTEVERFkiLCBmcmVkKTsKLSAgZnJlZC5SZXBsYWNlKCJMRUREIiwgIiIpOwotICBFWFBFQ1RfRVEoIkJZIiwgZnJlZCk7Ci0gIGZyZWQuUmVwbGFjZSgiWCIsICJDTEFNUyIpOwotICBFWFBFQ1RfRVEoIkJZIiwgZnJlZCk7Ci0gIGZyZWQuUmVwbGFjZSgiQlkiLCAiSEkiKTsKLSAgRVhQRUNUX0VRKCJISSIsIGZyZWQpOwotICBmcmVkLlJlcGxhY2UoIiIsICJDTEFNUyIpOwotICBFWFBFQ1RfRVEoIkhJIiwgZnJlZCk7Ci0gIGZyZWQuUmVwbGFjZSgiSEkiLCAiIik7Ci0gIEVYUEVDVF9FUSgiIiwgZnJlZCk7Ci19Ci0KLVRFU1QoZnhjcnQsIEJ5dGVTdHJpbmdJbnNlcnQpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgZnJlZCgiRlJFRCIpOwotICBmcmVkLkluc2VydCgtMSwgJ1gnKTsKLSAgRVhQRUNUX0VRKCJYRlJFRCIsIGZyZWQpOwotICBmcmVkLkluc2VydCgwLCAnUycpOwotICBFWFBFQ1RfRVEoIlNYRlJFRCIsIGZyZWQpOwotICBmcmVkLkluc2VydCgyLCAnVCcpOwotICBFWFBFQ1RfRVEoIlNYVEZSRUQiLCBmcmVkKTsKLSAgZnJlZC5JbnNlcnQoNSwgJ1UnKTsKLSAgRVhQRUNUX0VRKCJTWFRGUlVFRCIsIGZyZWQpOwotICBmcmVkLkluc2VydCg4LCAnVicpOwotICBFWFBFQ1RfRVEoIlNYVEZSVUVEViIsIGZyZWQpOwotICBmcmVkLkluc2VydCgxMiwgJ1AnKTsKLSAgRVhQRUNUX0VRKCJTWFRGUlVFRFZQIiwgZnJlZCk7Ci0gIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBlbXB0eTsKLSAgICBlbXB0eS5JbnNlcnQoLTEsICdYJyk7Ci0gICAgRVhQRUNUX0VRKCJYIiwgZW1wdHkpOwotICB9Ci0gIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBlbXB0eTsKLSAgICBlbXB0eS5JbnNlcnQoMCwgJ1gnKTsKLSAgICBFWFBFQ1RfRVEoIlgiLCBlbXB0eSk7Ci0gIH0KLSAgewotICAgIENGWF9CeXRlU3RyaW5nIGVtcHR5OwotICAgIGVtcHR5Lkluc2VydCg1LCAnWCcpOwotICAgIEVYUEVDVF9FUSgiWCIsIGVtcHR5KTsKLSAgfQotfQotCi1URVNUKGZ4Y3J0LCBCeXRlU3RyaW5nRGVsZXRlKSB7Ci0gIENGWF9CeXRlU3RyaW5nIGZyZWQoIkZSRUQiKTsKLSAgZnJlZC5EZWxldGUoMCwgMik7Ci0gIEVYUEVDVF9FUSgiRUQiLCBmcmVkKTsKLSAgZnJlZC5EZWxldGUoMSk7Ci0gIEVYUEVDVF9FUSgiRSIsIGZyZWQpOwotICBmcmVkLkRlbGV0ZSgtMSk7Ci0gIEVYUEVDVF9FUSgiIiwgZnJlZCk7Ci0gIGZyZWQuRGVsZXRlKDEpOwotICBFWFBFQ1RfRVEoIiIsIGZyZWQpOwotCi0gIENGWF9CeXRlU3RyaW5nIGVtcHR5OwotICBlbXB0eS5EZWxldGUoMCk7Ci0gIEVYUEVDVF9FUSgiIiwgZW1wdHkpOwotICBlbXB0eS5EZWxldGUoLTEpOwotICBFWFBFQ1RfRVEoIiIsIGVtcHR5KTsKLSAgZW1wdHkuRGVsZXRlKDEpOwotICBFWFBFQ1RfRVEoIiIsIGVtcHR5KTsKLX0KLQotVEVTVChmeGNydCwgQnl0ZVN0cmluZ01pZCkgewotICBDRlhfQnl0ZVN0cmluZyBmcmVkKCJGUkVEIik7Ci0gIEVYUEVDVF9FUSgiIiwgZnJlZC5NaWQoMCwgMCkpOwotICBFWFBFQ1RfRVEoIiIsIGZyZWQuTWlkKDMsIDApKTsKLSAgRVhQRUNUX0VRKCJGUkVEIiwgZnJlZC5NaWQoMCkpOwotICBFWFBFQ1RfRVEoIlJFRCIsIGZyZWQuTWlkKDEpKTsKLSAgRVhQRUNUX0VRKCJFRCIsIGZyZWQuTWlkKDIpKTsKLSAgRVhQRUNUX0VRKCJEIiwgZnJlZC5NaWQoMykpOwotICBFWFBFQ1RfRVEoIkYiLCBmcmVkLk1pZCgwLCAxKSk7Ci0gIEVYUEVDVF9FUSgiUiIsIGZyZWQuTWlkKDEsIDEpKTsKLSAgRVhQRUNUX0VRKCJFIiwgZnJlZC5NaWQoMiwgMSkpOwotICBFWFBFQ1RfRVEoIkQiLCBmcmVkLk1pZCgzLCAxKSk7Ci0gIEVYUEVDVF9FUSgiRlIiLCBmcmVkLk1pZCgwLCAyKSk7Ci0gIEVYUEVDVF9FUSgiRlJFRCIsIGZyZWQuTWlkKDAsIDQpKTsKLSAgRVhQRUNUX0VRKCJGUkVEIiwgZnJlZC5NaWQoMCwgMTApKTsKLQotICBFWFBFQ1RfRVEoIkZSIiwgZnJlZC5NaWQoLTEsIDIpKTsKLSAgRVhQRUNUX0VRKCJSRUQiLCBmcmVkLk1pZCgxLCA0KSk7Ci0gIEVYUEVDVF9FUSgiIiwgZnJlZC5NaWQoNCwgMSkpOwotCi0gIENGWF9CeXRlU3RyaW5nIGVtcHR5OwotICBFWFBFQ1RfRVEoIiIsIGVtcHR5Lk1pZCgwLCAwKSk7Ci0gIEVYUEVDVF9FUSgiIiwgZW1wdHkuTWlkKDApKTsKLSAgRVhQRUNUX0VRKCIiLCBlbXB0eS5NaWQoMSkpOwotICBFWFBFQ1RfRVEoIiIsIGVtcHR5Lk1pZCgtMSkpOwotfQotCi1URVNUKGZ4Y3J0LCBCeXRlU3RyaW5nTGVmdCkgewotICBDRlhfQnl0ZVN0cmluZyBmcmVkKCJGUkVEIik7Ci0gIEVYUEVDVF9FUSgiIiwgZnJlZC5MZWZ0KDApKTsKLSAgRVhQRUNUX0VRKCJGIiwgZnJlZC5MZWZ0KDEpKTsKLSAgRVhQRUNUX0VRKCJGUiIsIGZyZWQuTGVmdCgyKSk7Ci0gIEVYUEVDVF9FUSgiRlJFIiwgZnJlZC5MZWZ0KDMpKTsKLSAgRVhQRUNUX0VRKCJGUkVEIiwgZnJlZC5MZWZ0KDQpKTsKLQotICBFWFBFQ1RfRVEoIkZSRUQiLCBmcmVkLkxlZnQoNSkpOwotICBFWFBFQ1RfRVEoIiIsIGZyZWQuTGVmdCgtMSkpOwotCi0gIENGWF9CeXRlU3RyaW5nIGVtcHR5OwotICBFWFBFQ1RfRVEoIiIsIGVtcHR5LkxlZnQoMCkpOwotICBFWFBFQ1RfRVEoIiIsIGVtcHR5LkxlZnQoMSkpOwotICBFWFBFQ1RfRVEoIiIsIGVtcHR5LkxlZnQoLTEpKTsKLX0KLQotVEVTVChmeGNydCwgQnl0ZVN0cmluZ1JpZ2h0KSB7Ci0gIENGWF9CeXRlU3RyaW5nIGZyZWQoIkZSRUQiKTsKLSAgRVhQRUNUX0VRKCIiLCBmcmVkLlJpZ2h0KDApKTsKLSAgRVhQRUNUX0VRKCJEIiwgZnJlZC5SaWdodCgxKSk7Ci0gIEVYUEVDVF9FUSgiRUQiLCBmcmVkLlJpZ2h0KDIpKTsKLSAgRVhQRUNUX0VRKCJSRUQiLCBmcmVkLlJpZ2h0KDMpKTsKLSAgRVhQRUNUX0VRKCJGUkVEIiwgZnJlZC5SaWdodCg0KSk7Ci0KLSAgRVhQRUNUX0VRKCJGUkVEIiwgZnJlZC5SaWdodCg1KSk7Ci0gIEVYUEVDVF9FUSgiIiwgZnJlZC5SaWdodCgtMSkpOwotCi0gIENGWF9CeXRlU3RyaW5nIGVtcHR5OwotICBFWFBFQ1RfRVEoIiIsIGVtcHR5LlJpZ2h0KDApKTsKLSAgRVhQRUNUX0VRKCIiLCBlbXB0eS5SaWdodCgxKSk7Ci0gIEVYUEVDVF9FUSgiIiwgZW1wdHkuUmlnaHQoLTEpKTsKLX0KLQotVEVTVChmeGNydCwgQnl0ZVN0cmluZ1VwcGVyTG93ZXIpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgZnJlZCgiRi1SZS40MkQiKTsKLSAgZnJlZC5NYWtlTG93ZXIoKTsKLSAgRVhQRUNUX0VRKCJmLXJlLjQyZCIsIGZyZWQpOwotICBmcmVkLk1ha2VVcHBlcigpOwotICBFWFBFQ1RfRVEoIkYtUkUuNDJEIiwgZnJlZCk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgZW1wdHk7Ci0gIGVtcHR5Lk1ha2VMb3dlcigpOwotICBFWFBFQ1RfRVEoIiIsIGVtcHR5KTsKLSAgZW1wdHkuTWFrZVVwcGVyKCk7Ci0gIEVYUEVDVF9FUSgiIiwgZW1wdHkpOwotfQotCi1URVNUKGZ4Y3J0LCBCeXRlU3RyaW5nVHJpbVJpZ2h0KSB7Ci0gIENGWF9CeXRlU3RyaW5nIGZyZWQoIiAgRlJFRCAgIik7Ci0gIGZyZWQuVHJpbVJpZ2h0KCk7Ci0gIEVYUEVDVF9FUSgiICBGUkVEIiwgZnJlZCk7Ci0gIGZyZWQuVHJpbVJpZ2h0KCdFJyk7Ci0gIEVYUEVDVF9FUSgiICBGUkVEIiwgZnJlZCk7Ci0gIGZyZWQuVHJpbVJpZ2h0KCdEJyk7Ci0gIEVYUEVDVF9FUSgiICBGUkUiLCBmcmVkKTsKLSAgZnJlZC5UcmltUmlnaHQoIkVSUCIpOwotICBFWFBFQ1RfRVEoIiAgRiIsIGZyZWQpOwotCi0gIENGWF9CeXRlU3RyaW5nIGJsYW5rKCIgICAiKTsKLSAgYmxhbmsuVHJpbVJpZ2h0KCJFUlAiKTsKLSAgRVhQRUNUX0VRKCIgICAiLCBibGFuayk7Ci0gIGJsYW5rLlRyaW1SaWdodCgnRScpOwotICBFWFBFQ1RfRVEoIiAgICIsIGJsYW5rKTsKLSAgYmxhbmsuVHJpbVJpZ2h0KCk7Ci0gIEVYUEVDVF9FUSgiIiwgYmxhbmspOwotCi0gIENGWF9CeXRlU3RyaW5nIGVtcHR5OwotICBlbXB0eS5UcmltUmlnaHQoIkVSUCIpOwotICBFWFBFQ1RfRVEoIiIsIGVtcHR5KTsKLSAgZW1wdHkuVHJpbVJpZ2h0KCdFJyk7Ci0gIEVYUEVDVF9FUSgiIiwgZW1wdHkpOwotICBlbXB0eS5UcmltUmlnaHQoKTsKLSAgRVhQRUNUX0VRKCIiLCBlbXB0eSk7Ci19Ci0KLVRFU1QoZnhjcnQsIEJ5dGVTdHJpbmdUcmltUmlnaHRDb3BpZXMpIHsKLSAgewotICAgIC8vIFdpdGggYSBzaW5nbGUgcmVmZXJlbmNlLCBubyBjb3B5IHRha2VzIHBsYWNlLgotICAgIENGWF9CeXRlU3RyaW5nIGZyZWQoIiAgRlJFRCAgIik7Ci0gICAgY29uc3QgRlhfQ0hBUiogb2xkX2J1ZmZlciA9IGZyZWQuY19zdHIoKTsKLSAgICBmcmVkLlRyaW1SaWdodCgpOwotICAgIEVYUEVDVF9FUSgiICBGUkVEIiwgZnJlZCk7Ci0gICAgRVhQRUNUX0VRKG9sZF9idWZmZXIsIGZyZWQuY19zdHIoKSk7Ci0gIH0KLSAgewotICAgIC8vIFdpdGggbXVsdGlwbGUgcmVmZXJlbmNlcywgd2UgbXVzdCBjb3B5LgotICAgIENGWF9CeXRlU3RyaW5nIGZyZWQoIiAgRlJFRCAgIik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgb3RoZXJfZnJlZCA9IGZyZWQ7Ci0gICAgY29uc3QgRlhfQ0hBUiogb2xkX2J1ZmZlciA9IGZyZWQuY19zdHIoKTsKLSAgICBmcmVkLlRyaW1SaWdodCgpOwotICAgIEVYUEVDVF9FUSgiICBGUkVEIiwgZnJlZCk7Ci0gICAgRVhQRUNUX0VRKCIgIEZSRUQgICIsIG90aGVyX2ZyZWQpOwotICAgIEVYUEVDVF9ORShvbGRfYnVmZmVyLCBmcmVkLmNfc3RyKCkpOwotICB9Ci0gIHsKLSAgICAvLyBXaXRoIG11bHRpcGxlIHJlZmVyZW5jZXMsIGJ1dCBubyBtb2RpZmljYXRpb25zLCBubyBjb3B5LgotICAgIENGWF9CeXRlU3RyaW5nIGZyZWQoIkZSRUQiKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBvdGhlcl9mcmVkID0gZnJlZDsKLSAgICBjb25zdCBGWF9DSEFSKiBvbGRfYnVmZmVyID0gZnJlZC5jX3N0cigpOwotICAgIGZyZWQuVHJpbVJpZ2h0KCk7Ci0gICAgRVhQRUNUX0VRKCJGUkVEIiwgZnJlZCk7Ci0gICAgRVhQRUNUX0VRKCJGUkVEIiwgb3RoZXJfZnJlZCk7Ci0gICAgRVhQRUNUX0VRKG9sZF9idWZmZXIsIGZyZWQuY19zdHIoKSk7Ci0gIH0KLX0KLQotVEVTVChmeGNydCwgQnl0ZVN0cmluZ1RyaW1MZWZ0KSB7Ci0gIENGWF9CeXRlU3RyaW5nIGZyZWQoIiAgRlJFRCAgIik7Ci0gIGZyZWQuVHJpbUxlZnQoKTsKLSAgRVhQRUNUX0VRKCJGUkVEICAiLCBmcmVkKTsKLSAgZnJlZC5UcmltTGVmdCgnRScpOwotICBFWFBFQ1RfRVEoIkZSRUQgICIsIGZyZWQpOwotICBmcmVkLlRyaW1MZWZ0KCdGJyk7Ci0gIEVYUEVDVF9FUSgiUkVEICAiLCBmcmVkKTsKLSAgZnJlZC5UcmltTGVmdCgiRVJQIik7Ci0gIEVYUEVDVF9FUSgiRCAgIiwgZnJlZCk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgYmxhbmsoIiAgICIpOwotICBibGFuay5UcmltTGVmdCgiRVJQIik7Ci0gIEVYUEVDVF9FUSgiICAgIiwgYmxhbmspOwotICBibGFuay5UcmltTGVmdCgnRScpOwotICBFWFBFQ1RfRVEoIiAgICIsIGJsYW5rKTsKLSAgYmxhbmsuVHJpbUxlZnQoKTsKLSAgRVhQRUNUX0VRKCIiLCBibGFuayk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgZW1wdHk7Ci0gIGVtcHR5LlRyaW1MZWZ0KCJFUlAiKTsKLSAgRVhQRUNUX0VRKCIiLCBlbXB0eSk7Ci0gIGVtcHR5LlRyaW1MZWZ0KCdFJyk7Ci0gIEVYUEVDVF9FUSgiIiwgZW1wdHkpOwotICBlbXB0eS5UcmltTGVmdCgpOwotICBFWFBFQ1RfRVEoIiIsIGVtcHR5KTsKLX0KLQotVEVTVChmeGNydCwgQnl0ZVN0cmluZ1RyaW1MZWZ0Q29waWVzKSB7Ci0gIHsKLSAgICAvLyBXaXRoIGEgc2luZ2xlIHJlZmVyZW5jZSwgbm8gY29weSB0YWtlcyBwbGFjZS4KLSAgICBDRlhfQnl0ZVN0cmluZyBmcmVkKCIgIEZSRUQgICIpOwotICAgIGNvbnN0IEZYX0NIQVIqIG9sZF9idWZmZXIgPSBmcmVkLmNfc3RyKCk7Ci0gICAgZnJlZC5UcmltTGVmdCgpOwotICAgIEVYUEVDVF9FUSgiRlJFRCAgIiwgZnJlZCk7Ci0gICAgRVhQRUNUX0VRKG9sZF9idWZmZXIsIGZyZWQuY19zdHIoKSk7Ci0gIH0KLSAgewotICAgIC8vIFdpdGggbXVsdGlwbGUgcmVmZXJlbmNlcywgd2UgbXVzdCBjb3B5LgotICAgIENGWF9CeXRlU3RyaW5nIGZyZWQoIiAgRlJFRCAgIik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgb3RoZXJfZnJlZCA9IGZyZWQ7Ci0gICAgY29uc3QgRlhfQ0hBUiogb2xkX2J1ZmZlciA9IGZyZWQuY19zdHIoKTsKLSAgICBmcmVkLlRyaW1MZWZ0KCk7Ci0gICAgRVhQRUNUX0VRKCJGUkVEICAiLCBmcmVkKTsKLSAgICBFWFBFQ1RfRVEoIiAgRlJFRCAgIiwgb3RoZXJfZnJlZCk7Ci0gICAgRVhQRUNUX05FKG9sZF9idWZmZXIsIGZyZWQuY19zdHIoKSk7Ci0gIH0KLSAgewotICAgIC8vIFdpdGggbXVsdGlwbGUgcmVmZXJlbmNlcywgYnV0IG5vIG1vZGlmaWNhdGlvbnMsIG5vIGNvcHkuCi0gICAgQ0ZYX0J5dGVTdHJpbmcgZnJlZCgiRlJFRCIpOwotICAgIENGWF9CeXRlU3RyaW5nIG90aGVyX2ZyZWQgPSBmcmVkOwotICAgIGNvbnN0IEZYX0NIQVIqIG9sZF9idWZmZXIgPSBmcmVkLmNfc3RyKCk7Ci0gICAgZnJlZC5UcmltTGVmdCgpOwotICAgIEVYUEVDVF9FUSgiRlJFRCIsIGZyZWQpOwotICAgIEVYUEVDVF9FUSgiRlJFRCIsIG90aGVyX2ZyZWQpOwotICAgIEVYUEVDVF9FUShvbGRfYnVmZmVyLCBmcmVkLmNfc3RyKCkpOwotICB9Ci19Ci0KLVRFU1QoZnhjcnQsIEJ5dGVTdHJpbmdSZXNlcnZlKSB7Ci0gIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBzdHI7Ci0gICAgc3RyLlJlc2VydmUoNik7Ci0gICAgY29uc3QgRlhfQ0hBUiogb2xkX2J1ZmZlciA9IHN0ci5jX3N0cigpOwotICAgIHN0ciArPSAiQUJDREVGIjsKLSAgICBFWFBFQ1RfRVEob2xkX2J1ZmZlciwgc3RyLmNfc3RyKCkpOwotICAgIHN0ciArPSAiQmxhaCBCbGFoIEJsYWggQmxhaCBCbGFoIEJsYWgiOwotICAgIEVYUEVDVF9ORShvbGRfYnVmZmVyLCBzdHIuY19zdHIoKSk7Ci0gIH0KLSAgewotICAgIENGWF9CeXRlU3RyaW5nIHN0cigiQSIpOwotICAgIHN0ci5SZXNlcnZlKDYpOwotICAgIGNvbnN0IEZYX0NIQVIqIG9sZF9idWZmZXIgPSBzdHIuY19zdHIoKTsKLSAgICBzdHIgKz0gIkJDREVGIjsKLSAgICBFWFBFQ1RfRVEob2xkX2J1ZmZlciwgc3RyLmNfc3RyKCkpOwotICAgIHN0ciArPSAiQmxhaCBCbGFoIEJsYWggQmxhaCBCbGFoIEJsYWgiOwotICAgIEVYUEVDVF9ORShvbGRfYnVmZmVyLCBzdHIuY19zdHIoKSk7Ci0gIH0KLX0KLQotVEVTVChmeGNydCwgQnl0ZVN0cmluZ0dldEJ1ZmZlcikgewotICB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyOwotICAgIEZYX0NIQVIqIGJ1ZmZlciA9IHN0ci5HZXRCdWZmZXIoMTIpOwotICAgIC8vIE5PTElOVE5FWFRMSU5FKHJ1bnRpbWUvcHJpbnRmKQotICAgIHN0cmNweShidWZmZXIsICJjbGFtcyIpOwotICAgIHN0ci5SZWxlYXNlQnVmZmVyKCk7Ci0gICAgRVhQRUNUX0VRKCJjbGFtcyIsIHN0cik7Ci0gIH0KLSAgewotICAgIENGWF9CeXRlU3RyaW5nIHN0cigiY2wiKTsKLSAgICBGWF9DSEFSKiBidWZmZXIgPSBzdHIuR2V0QnVmZmVyKDEyKTsKLSAgICAvLyBOT0xJTlRORVhUTElORShydW50aW1lL3ByaW50ZikKLSAgICBzdHJjcHkoYnVmZmVyICsgMiwgImFtcyIpOwotICAgIHN0ci5SZWxlYXNlQnVmZmVyKCk7Ci0gICAgRVhQRUNUX0VRKCJjbGFtcyIsIHN0cik7Ci0gIH0KLX0KLQotVEVTVChmeGNydCwgQnl0ZVN0cmluZ1JlbGVhc2VCdWZmZXIpIHsKLSAgewotICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKLSAgICBzdHIuUmVzZXJ2ZSgxMik7Ci0gICAgc3RyICs9ICJjbGFtcyI7Ci0gICAgY29uc3QgRlhfQ0hBUiogb2xkX2J1ZmZlciA9IHN0ci5jX3N0cigpOwotICAgIHN0ci5SZWxlYXNlQnVmZmVyKDQpOwotICAgIEVYUEVDVF9FUShvbGRfYnVmZmVyLCBzdHIuY19zdHIoKSk7Ci0gICAgRVhQRUNUX0VRKCJjbGFtIiwgc3RyKTsKLSAgfQotICB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyKCJjIik7Ci0gICAgc3RyLlJlc2VydmUoMTIpOwotICAgIHN0ciArPSAibGFtcyI7Ci0gICAgY29uc3QgRlhfQ0hBUiogb2xkX2J1ZmZlciA9IHN0ci5jX3N0cigpOwotICAgIHN0ci5SZWxlYXNlQnVmZmVyKDQpOwotICAgIEVYUEVDVF9FUShvbGRfYnVmZmVyLCBzdHIuY19zdHIoKSk7Ci0gICAgRVhQRUNUX0VRKCJjbGFtIiwgc3RyKTsKLSAgfQotICB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyOwotICAgIHN0ci5SZXNlcnZlKDIwMCk7Ci0gICAgc3RyICs9ICJjbGFtcyI7Ci0gICAgY29uc3QgRlhfQ0hBUiogb2xkX2J1ZmZlciA9IHN0ci5jX3N0cigpOwotICAgIHN0ci5SZWxlYXNlQnVmZmVyKDQpOwotICAgIEVYUEVDVF9ORShvbGRfYnVmZmVyLCBzdHIuY19zdHIoKSk7Ci0gICAgRVhQRUNUX0VRKCJjbGFtIiwgc3RyKTsKLSAgfQotICB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyKCJjIik7Ci0gICAgc3RyLlJlc2VydmUoMjAwKTsKLSAgICBzdHIgKz0gImxhbXMiOwotICAgIGNvbnN0IEZYX0NIQVIqIG9sZF9idWZmZXIgPSBzdHIuY19zdHIoKTsKLSAgICBzdHIuUmVsZWFzZUJ1ZmZlcig0KTsKLSAgICBFWFBFQ1RfTkUob2xkX2J1ZmZlciwgc3RyLmNfc3RyKCkpOwotICAgIEVYUEVDVF9FUSgiY2xhbSIsIHN0cik7Ci0gIH0KLX0KLQotVEVTVChmeGNydCwgQnl0ZVN0cmluZ0NOb3ROdWxsKSB7Ci0gIENGWF9CeXRlU3RyaW5nQyBzdHJpbmczKCJhYmMiKTsKLSAgQ0ZYX0J5dGVTdHJpbmdDIHN0cmluZzYoImFiY2RlZiIpOwotICBDRlhfQnl0ZVN0cmluZ0MgYWx0ZXJuYXRlX3N0cmluZzMoImFiY2RlZiIsIDMpOwotICBDRlhfQnl0ZVN0cmluZ0MgZW1iZWRkZWRfbnVsX3N0cmluZzcoImFiY1wwZGVmIiwgNyk7Ci0gIENGWF9CeXRlU3RyaW5nQyBpbGxlZ2FsX3N0cmluZzcoImFiY2RlZiIsIDcpOwotCi0gIEVYUEVDVF9FUSgzLCBzdHJpbmczLkdldExlbmd0aCgpKTsKLSAgRVhQRUNUX0VRKDYsIHN0cmluZzYuR2V0TGVuZ3RoKCkpOwotICBFWFBFQ1RfRVEoMywgYWx0ZXJuYXRlX3N0cmluZzMuR2V0TGVuZ3RoKCkpOwotICBFWFBFQ1RfRVEoNywgZW1iZWRkZWRfbnVsX3N0cmluZzcuR2V0TGVuZ3RoKCkpOwotICBFWFBFQ1RfRVEoNywgaWxsZWdhbF9zdHJpbmc3LkdldExlbmd0aCgpKTsKLQotICBFWFBFQ1RfTkUoc3RyaW5nMywgc3RyaW5nNik7Ci0gIEVYUEVDVF9FUShzdHJpbmczLCBhbHRlcm5hdGVfc3RyaW5nMyk7Ci0gIEVYUEVDVF9ORShzdHJpbmczLCBlbWJlZGRlZF9udWxfc3RyaW5nNyk7Ci0gIEVYUEVDVF9ORShzdHJpbmczLCBpbGxlZ2FsX3N0cmluZzcpOwotICBFWFBFQ1RfTkUoc3RyaW5nNiwgYWx0ZXJuYXRlX3N0cmluZzMpOwotICBFWFBFQ1RfTkUoc3RyaW5nNiwgZW1iZWRkZWRfbnVsX3N0cmluZzcpOwotICBFWFBFQ1RfTkUoc3RyaW5nNiwgaWxsZWdhbF9zdHJpbmc3KTsKLSAgRVhQRUNUX05FKGFsdGVybmF0ZV9zdHJpbmczLCBlbWJlZGRlZF9udWxfc3RyaW5nNyk7Ci0gIEVYUEVDVF9ORShhbHRlcm5hdGVfc3RyaW5nMywgaWxsZWdhbF9zdHJpbmc3KTsKLSAgRVhQRUNUX05FKGVtYmVkZGVkX251bF9zdHJpbmc3LCBpbGxlZ2FsX3N0cmluZzcpOwotCi0gIENGWF9CeXRlU3RyaW5nQyBjb3BpZWRfc3RyaW5nMyhzdHJpbmczKTsKLSAgQ0ZYX0J5dGVTdHJpbmdDIGNvcGllZF9hbHRlcm5hdGVfc3RyaW5nMyhhbHRlcm5hdGVfc3RyaW5nMyk7Ci0gIENGWF9CeXRlU3RyaW5nQyBjb3BpZWRfZW1iZWRkZWRfbnVsX3N0cmluZzcoZW1iZWRkZWRfbnVsX3N0cmluZzcpOwotCi0gIEVYUEVDVF9FUShzdHJpbmczLCBjb3BpZWRfc3RyaW5nMyk7Ci0gIEVYUEVDVF9FUShhbHRlcm5hdGVfc3RyaW5nMywgY29waWVkX2FsdGVybmF0ZV9zdHJpbmczKTsKLSAgRVhQRUNUX0VRKGVtYmVkZGVkX251bF9zdHJpbmc3LCBjb3BpZWRfZW1iZWRkZWRfbnVsX3N0cmluZzcpOwotCi0gIENGWF9CeXRlU3RyaW5nQyBhc3NpZ25lZF9zdHJpbmczKCJpbnRpYWxseSBzb21ldGhpbmcgZWxzZSIpOwotICBDRlhfQnl0ZVN0cmluZ0MgYXNzaWduZWRfYWx0ZXJuYXRlX3N0cmluZzMoImluaXRhbGx5IHNvbWV0aGluZyBlbHNlIik7Ci0gIENGWF9CeXRlU3RyaW5nQyBhc3NpZ25lZF9wdHJfc3RyaW5nMygiaW5pdGlhbGx5IHNvbWV0aGluZyBlbHNlIik7Ci0gIENGWF9CeXRlU3RyaW5nQyBhc3NpZ25lZF9lbWJlZGRlZF9udWxfc3RyaW5nNygiaW5pdGlhbGx5IHNvbWV0aGluZyBlbHNlIik7Ci0KLSAgYXNzaWduZWRfc3RyaW5nMyA9IHN0cmluZzM7Ci0gIGFzc2lnbmVkX2FsdGVybmF0ZV9zdHJpbmczID0gYWx0ZXJuYXRlX3N0cmluZzM7Ci0gIGFzc2lnbmVkX3B0cl9zdHJpbmczID0gImFiYyI7Ci0gIGFzc2lnbmVkX2VtYmVkZGVkX251bF9zdHJpbmc3ID0gZW1iZWRkZWRfbnVsX3N0cmluZzc7Ci0gIEVYUEVDVF9FUShzdHJpbmczLCBhc3NpZ25lZF9zdHJpbmczKTsKLSAgRVhQRUNUX0VRKGFsdGVybmF0ZV9zdHJpbmczLCBhc3NpZ25lZF9hbHRlcm5hdGVfc3RyaW5nMyk7Ci0gIEVYUEVDVF9FUShhbHRlcm5hdGVfc3RyaW5nMywgYXNzaWduZWRfcHRyX3N0cmluZzMpOwotICBFWFBFQ1RfRVEoZW1iZWRkZWRfbnVsX3N0cmluZzcsIGFzc2lnbmVkX2VtYmVkZGVkX251bF9zdHJpbmc3KTsKLX0KLQotVEVTVChmeGNydCwgQnl0ZVN0cmluZ0NGcm9tQ2hhcikgewotICBDRlhfQnl0ZVN0cmluZ0MgbnVsbF9zdHJpbmc7Ci0gIENGWF9CeXRlU3RyaW5nQyBsb3dlcl9hX3N0cmluZygiYSIpOwotCi0gIC8vIE11c3QgaGF2ZSBsdmFsdWVzIHRoYXQgb3V0bGl2ZSB0aGUgY29ycmVzcG9uZGluZyBCeXRlU3RyaW5nQy4KLSAgY2hhciBudWwgPSAnXDAnOwotICBjaGFyIGxvd2VyX2EgPSAnYSc7Ci0gIENGWF9CeXRlU3RyaW5nQyBudWxfc3RyaW5nX2Zyb21fY2hhcihudWwpOwotICBDRlhfQnl0ZVN0cmluZ0MgbG93ZXJfYV9zdHJpbmdfZnJvbV9jaGFyKGxvd2VyX2EpOwotCi0gIC8vIFBvaW50ZXIgdG8gbnVsLCBub3QgbnVsbHB0ciBwdHIsIGhlbmNlIGxlbmd0aCAxIC4uLgotICBFWFBFQ1RfRVEoMSwgbnVsX3N0cmluZ19mcm9tX2NoYXIuR2V0TGVuZ3RoKCkpOwotICBFWFBFQ1RfTkUobnVsbF9zdHJpbmcsIG51bF9zdHJpbmdfZnJvbV9jaGFyKTsKLQotICBFWFBFQ1RfRVEoMSwgbG93ZXJfYV9zdHJpbmdfZnJvbV9jaGFyLkdldExlbmd0aCgpKTsKLSAgRVhQRUNUX0VRKGxvd2VyX2Ffc3RyaW5nLCBsb3dlcl9hX3N0cmluZ19mcm9tX2NoYXIpOwotICBFWFBFQ1RfTkUobnVsX3N0cmluZ19mcm9tX2NoYXIsIGxvd2VyX2Ffc3RyaW5nX2Zyb21fY2hhcik7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmdDIGxvbmdlcl9zdHJpbmcoImFiIik7Ci0gIEVYUEVDVF9ORShsb25nZXJfc3RyaW5nLCBsb3dlcl9hX3N0cmluZ19mcm9tX2NoYXIpOwotfQotCi1URVNUKGZ4Y3J0LCBCeXRlU3RyaW5nQ0dldElEKSB7Ci0gIENGWF9CeXRlU3RyaW5nQyBudWxsX3N0cmluZzsKLSAgRVhQRUNUX0VRKDB1LCBudWxsX3N0cmluZy5HZXRJRCgpKTsKLSAgRVhQRUNUX0VRKDB1LCBudWxsX3N0cmluZy5HZXRJRCgxKSk7Ci0gIEVYUEVDVF9FUSgwdSwgbnVsbF9zdHJpbmcuR2V0SUQoLTEpKTsKLSAgRVhQRUNUX0VRKDB1LCBudWxsX3N0cmluZy5HZXRJRCgtMTAwMDAwMCkpOwotCi0gIENGWF9CeXRlU3RyaW5nQyBlbXB0eV9zdHJpbmcoIiIpOwotICBFWFBFQ1RfRVEoMHUsIGVtcHR5X3N0cmluZy5HZXRJRCgpKTsKLSAgRVhQRUNUX0VRKDB1LCBlbXB0eV9zdHJpbmcuR2V0SUQoMSkpOwotICBFWFBFQ1RfRVEoMHUsIGVtcHR5X3N0cmluZy5HZXRJRCgtMSkpOwotICBFWFBFQ1RfRVEoMHUsIGVtcHR5X3N0cmluZy5HZXRJRCgtMTAwMDAwMCkpOwotCi0gIENGWF9CeXRlU3RyaW5nQyBzaG9ydF9zdHJpbmcoImFiIik7Ci0gIEVYUEVDVF9FUShGWEJTVFJfSUQoJ2EnLCAnYicsIDAsIDApLCBzaG9ydF9zdHJpbmcuR2V0SUQoKSk7Ci0gIEVYUEVDVF9FUShGWEJTVFJfSUQoJ2InLCAwLCAwLCAwKSwgc2hvcnRfc3RyaW5nLkdldElEKDEpKTsKLSAgRVhQRUNUX0VRKDB1LCBzaG9ydF9zdHJpbmcuR2V0SUQoMikpOwotICBFWFBFQ1RfRVEoMHUsIHNob3J0X3N0cmluZy5HZXRJRCgtMSkpOwotICBFWFBFQ1RfRVEoMHUsIHNob3J0X3N0cmluZy5HZXRJRCgtMTAwMDAwMCkpOwotCi0gIENGWF9CeXRlU3RyaW5nQyBsb25nZXJfc3RyaW5nKCJhYmNkZWYiKTsKLSAgRVhQRUNUX0VRKEZYQlNUUl9JRCgnYScsICdiJywgJ2MnLCAnZCcpLCBsb25nZXJfc3RyaW5nLkdldElEKCkpOwotICBFWFBFQ1RfRVEoRlhCU1RSX0lEKCdiJywgJ2MnLCAnZCcsICdlJyksIGxvbmdlcl9zdHJpbmcuR2V0SUQoMSkpOwotICBFWFBFQ1RfRVEoRlhCU1RSX0lEKCdjJywgJ2QnLCAnZScsICdmJyksIGxvbmdlcl9zdHJpbmcuR2V0SUQoMikpOwotICBFWFBFQ1RfRVEoRlhCU1RSX0lEKCdkJywgJ2UnLCAnZicsIDApLCBsb25nZXJfc3RyaW5nLkdldElEKDMpKTsKLSAgRVhQRUNUX0VRKEZYQlNUUl9JRCgnZScsICdmJywgMCwgMCksIGxvbmdlcl9zdHJpbmcuR2V0SUQoNCkpOwotICBFWFBFQ1RfRVEoRlhCU1RSX0lEKCdmJywgMCwgMCwgMCksIGxvbmdlcl9zdHJpbmcuR2V0SUQoNSkpOwotICBFWFBFQ1RfRVEoMHUsIGxvbmdlcl9zdHJpbmcuR2V0SUQoNikpOwotICBFWFBFQ1RfRVEoMHUsIGxvbmdlcl9zdHJpbmcuR2V0SUQoLTEpKTsKLSAgRVhQRUNUX0VRKDB1LCBsb25nZXJfc3RyaW5nLkdldElEKC0xMDAwMDAwKSk7Ci19Ci0KLVRFU1QoZnhjcnQsIEJ5dGVTdHJpbmdDRmluZCkgewotICBDRlhfQnl0ZVN0cmluZ0MgbnVsbF9zdHJpbmc7Ci0gIEVYUEVDVF9FUSgtMSwgbnVsbF9zdHJpbmcuRmluZCgnYScpKTsKLSAgRVhQRUNUX0VRKC0xLCBudWxsX3N0cmluZy5GaW5kKDApKTsKLQotICBDRlhfQnl0ZVN0cmluZ0MgZW1wdHlfc3RyaW5nKCIiKTsKLSAgRVhQRUNUX0VRKC0xLCBlbXB0eV9zdHJpbmcuRmluZCgnYScpKTsKLSAgRVhQRUNUX0VRKC0xLCBlbXB0eV9zdHJpbmcuRmluZCgwKSk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmdDIHNpbmdsZV9zdHJpbmcoImEiKTsKLSAgRVhQRUNUX0VRKDAsIHNpbmdsZV9zdHJpbmcuRmluZCgnYScpKTsKLSAgRVhQRUNUX0VRKC0xLCBzaW5nbGVfc3RyaW5nLkZpbmQoJ2InKSk7Ci0gIEVYUEVDVF9FUSgtMSwgc2luZ2xlX3N0cmluZy5GaW5kKDApKTsKLQotICBDRlhfQnl0ZVN0cmluZ0MgbG9uZ2VyX3N0cmluZygiYWJjY2MiKTsKLSAgRVhQRUNUX0VRKDAsIGxvbmdlcl9zdHJpbmcuRmluZCgnYScpKTsKLSAgRVhQRUNUX0VRKDIsIGxvbmdlcl9zdHJpbmcuRmluZCgnYycpKTsKLSAgRVhQRUNUX0VRKC0xLCBsb25nZXJfc3RyaW5nLkZpbmQoMCkpOwotCi0gIENGWF9CeXRlU3RyaW5nQyBoaWJ5dGVfc3RyaW5nKAotICAgICAgImFiXHg4YyIKLSAgICAgICJkZWYiKTsKLSAgRVhQRUNUX0VRKDIsIGhpYnl0ZV9zdHJpbmcuRmluZCgnXHg4YycpKTsKLX0KLQotVEVTVChmeGNydCwgQnl0ZVN0cmluZ0NNaWQpIHsKLSAgQ0ZYX0J5dGVTdHJpbmdDIG51bGxfc3RyaW5nOwotICBFWFBFQ1RfRVEobnVsbF9zdHJpbmcsIG51bGxfc3RyaW5nLk1pZCgwLCAxKSk7Ci0gIEVYUEVDVF9FUShudWxsX3N0cmluZywgbnVsbF9zdHJpbmcuTWlkKDEsIDEpKTsKLQotICBDRlhfQnl0ZVN0cmluZ0MgZW1wdHlfc3RyaW5nKCIiKTsKLSAgRVhQRUNUX0VRKGVtcHR5X3N0cmluZywgZW1wdHlfc3RyaW5nLk1pZCgwLCAxKSk7Ci0gIEVYUEVDVF9FUShlbXB0eV9zdHJpbmcsIGVtcHR5X3N0cmluZy5NaWQoMSwgMSkpOwotCi0gIENGWF9CeXRlU3RyaW5nQyBzaW5nbGVfY2hhcmFjdGVyKCJhIik7Ci0gIEVYUEVDVF9FUShlbXB0eV9zdHJpbmcsIHNpbmdsZV9jaGFyYWN0ZXIuTWlkKDAsIDApKTsKLSAgRVhQRUNUX0VRKHNpbmdsZV9jaGFyYWN0ZXIsIHNpbmdsZV9jaGFyYWN0ZXIuTWlkKDAsIDEpKTsKLSAgRVhQRUNUX0VRKGVtcHR5X3N0cmluZywgc2luZ2xlX2NoYXJhY3Rlci5NaWQoMSwgMCkpOwotICBFWFBFQ1RfRVEoZW1wdHlfc3RyaW5nLCBzaW5nbGVfY2hhcmFjdGVyLk1pZCgxLCAxKSk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmdDIGxvbmdlcl9zdHJpbmcoImFiY2RlZiIpOwotICBFWFBFQ1RfRVEobG9uZ2VyX3N0cmluZywgbG9uZ2VyX3N0cmluZy5NaWQoMCwgNikpOwotICBFWFBFQ1RfRVEobG9uZ2VyX3N0cmluZywgbG9uZ2VyX3N0cmluZy5NaWQoMCwgMTg3KSk7Ci0gIEVYUEVDVF9FUShsb25nZXJfc3RyaW5nLCBsb25nZXJfc3RyaW5nLk1pZCgtNDIsIDYpKTsKLSAgRVhQRUNUX0VRKGxvbmdlcl9zdHJpbmcsIGxvbmdlcl9zdHJpbmcuTWlkKC00MiwgMTg3KSk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmdDIGxlYWRpbmdfc3Vic3RyaW5nKCJhYiIpOwotICBFWFBFQ1RfRVEobGVhZGluZ19zdWJzdHJpbmcsIGxvbmdlcl9zdHJpbmcuTWlkKDAsIDIpKTsKLSAgRVhQRUNUX0VRKGxlYWRpbmdfc3Vic3RyaW5nLCBsb25nZXJfc3RyaW5nLk1pZCgtMSwgMikpOwotCi0gIENGWF9CeXRlU3RyaW5nQyBtaWRkbGVfc3Vic3RyaW5nKCJiY2RlIik7Ci0gIEVYUEVDVF9FUShtaWRkbGVfc3Vic3RyaW5nLCBsb25nZXJfc3RyaW5nLk1pZCgxLCA0KSk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmdDIHRyYWlsaW5nX3N1YnN0cmluZygiZWYiKTsKLSAgRVhQRUNUX0VRKHRyYWlsaW5nX3N1YnN0cmluZywgbG9uZ2VyX3N0cmluZy5NaWQoNCwgMikpOwotICBFWFBFQ1RfRVEodHJhaWxpbmdfc3Vic3RyaW5nLCBsb25nZXJfc3RyaW5nLk1pZCg0LCAzKSk7Ci19Ci0KLVRFU1QoZnhjcnQsIEJ5dGVTdHJpbmdDR2V0QXQpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgc2hvcnRfc3RyaW5nKCJhIik7Ci0gIENGWF9CeXRlU3RyaW5nIGxvbmdlcl9zdHJpbmcoImFiYyIpOwotICBDRlhfQnl0ZVN0cmluZyBlbWJlZGRlZF9udWxfc3RyaW5nKCJhYlwwYyIsIDQpOwotCi0gIEVYUEVDVF9FUSgnYScsIHNob3J0X3N0cmluZy5HZXRBdCgwKSk7Ci0gIEVYUEVDVF9FUSgnYycsIGxvbmdlcl9zdHJpbmcuR2V0QXQoMikpOwotICBFWFBFQ1RfRVEoJ2InLCBlbWJlZGRlZF9udWxfc3RyaW5nLkdldEF0KDEpKTsKLSAgRVhQRUNUX0VRKCdcMCcsIGVtYmVkZGVkX251bF9zdHJpbmcuR2V0QXQoMikpOwotICBFWFBFQ1RfRVEoJ2MnLCBlbWJlZGRlZF9udWxfc3RyaW5nLkdldEF0KDMpKTsKLX0KLQotVEVTVChmeGNydCwgQnl0ZVN0cmluZ0NPcGVyYXRvclN1YnNjcmlwdCkgewotICAvLyBDRlhfQnl0ZVN0cmluZ0MgaW5jbHVkZXMgdGhlIE5VTCB0ZXJtaW5hdG9yIGZvciBub24tZW1wdHkgc3RyaW5ncy4KLSAgQ0ZYX0J5dGVTdHJpbmdDIGFiYygiYWJjIik7Ci0gIEVYUEVDVF9FUSgnYScsIGFiY1swXSk7Ci0gIEVYUEVDVF9FUSgnYicsIGFiY1sxXSk7Ci0gIEVYUEVDVF9FUSgnYycsIGFiY1syXSk7Ci0gIEVYUEVDVF9FUSgwLCBhYmNbM10pOwotfQotCi1URVNUKGZ4Y3J0LCBCeXRlU3RyaW5nQ09wZXJhdG9yTFQpIHsKLSAgQ0ZYX0J5dGVTdHJpbmdDIGVtcHR5OwotICBDRlhfQnl0ZVN0cmluZ0MgYSgiYSIpOwotICBDRlhfQnl0ZVN0cmluZ0MgYWJjKCJhYmMiKTsKLSAgQ0ZYX0J5dGVTdHJpbmdDIGRlZigiZGVmIik7Ci0KLSAgRVhQRUNUX0ZBTFNFKGVtcHR5IDwgZW1wdHkpOwotICBFWFBFQ1RfRkFMU0UoYSA8IGEpOwotICBFWFBFQ1RfRkFMU0UoYWJjIDwgYWJjKTsKLSAgRVhQRUNUX0ZBTFNFKGRlZiA8IGRlZik7Ci0KLSAgRVhQRUNUX1RSVUUoZW1wdHkgPCBhKTsKLSAgRVhQRUNUX0ZBTFNFKGEgPCBlbXB0eSk7Ci0KLSAgRVhQRUNUX1RSVUUoZW1wdHkgPCBhYmMpOwotICBFWFBFQ1RfRkFMU0UoYWJjIDwgZW1wdHkpOwotCi0gIEVYUEVDVF9UUlVFKGVtcHR5IDwgZGVmKTsKLSAgRVhQRUNUX0ZBTFNFKGRlZiA8IGVtcHR5KTsKLQotICBFWFBFQ1RfVFJVRShhIDwgYWJjKTsKLSAgRVhQRUNUX0ZBTFNFKGFiYyA8IGEpOwotCi0gIEVYUEVDVF9UUlVFKGEgPCBkZWYpOwotICBFWFBFQ1RfRkFMU0UoZGVmIDwgYSk7Ci0KLSAgRVhQRUNUX1RSVUUoYWJjIDwgZGVmKTsKLSAgRVhQRUNUX0ZBTFNFKGRlZiA8IGFiYyk7Ci19Ci0KLVRFU1QoZnhjcnQsIEJ5dGVTdHJpbmdDT3BlcmF0b3JFUSkgewotICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYygiaGVsbG8iKTsKLSAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZ19jKTsKLQotICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfY19zYW1lMSgiaGVsbG8iKTsKLSAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZ19jX3NhbWUxKTsKLSAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfY19zYW1lMSA9PSBieXRlX3N0cmluZ19jKTsKLQotICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfY19zYW1lMihieXRlX3N0cmluZ19jKTsKLSAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZ19jX3NhbWUyKTsKLSAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfY19zYW1lMiA9PSBieXRlX3N0cmluZ19jKTsKLQotICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYzEoImhlIik7Ci0gIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jMigiaGVsbHAiKTsKLSAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MzKCJoZWxsb2QiKTsKLSAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgPT0gYnl0ZV9zdHJpbmdfYzEpOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZ19jMik7Ci0gIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jID09IGJ5dGVfc3RyaW5nX2MzKTsKLSAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MxID09IGJ5dGVfc3RyaW5nX2MpOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYzIgPT0gYnl0ZV9zdHJpbmdfYyk7Ci0gIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jMyA9PSBieXRlX3N0cmluZ19jKTsKLQotICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZ19zYW1lMSgiaGVsbG8iKTsKLSAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZ19zYW1lMSk7Ci0gIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX3NhbWUxID09IGJ5dGVfc3RyaW5nX2MpOwotCi0gIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMSgiaGUiKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmcyKCJoZWxscCIpOwotICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZzMoImhlbGxvZCIpOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZzEpOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZzIpOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyA9PSBieXRlX3N0cmluZzMpOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcxID09IGJ5dGVfc3RyaW5nX2MpOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmcyID09IGJ5dGVfc3RyaW5nX2MpOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmczID09IGJ5dGVfc3RyaW5nX2MpOwotCi0gIGNvbnN0IGNoYXIqIGNfc3RyaW5nX3NhbWUxID0gImhlbGxvIjsKLSAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyA9PSBjX3N0cmluZ19zYW1lMSk7Ci0gIEVYUEVDVF9UUlVFKGNfc3RyaW5nX3NhbWUxID09IGJ5dGVfc3RyaW5nX2MpOwotCi0gIGNvbnN0IGNoYXIqIGNfc3RyaW5nMSA9ICJoZSI7Ci0gIGNvbnN0IGNoYXIqIGNfc3RyaW5nMiA9ICJoZWxscCI7Ci0gIGNvbnN0IGNoYXIqIGNfc3RyaW5nMyA9ICJoZWxsb2QiOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyA9PSBjX3N0cmluZzEpOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyA9PSBjX3N0cmluZzIpOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyA9PSBjX3N0cmluZzMpOwotCi0gIEVYUEVDVF9GQUxTRShjX3N0cmluZzEgPT0gYnl0ZV9zdHJpbmdfYyk7Ci0gIEVYUEVDVF9GQUxTRShjX3N0cmluZzIgPT0gYnl0ZV9zdHJpbmdfYyk7Ci0gIEVYUEVDVF9GQUxTRShjX3N0cmluZzMgPT0gYnl0ZV9zdHJpbmdfYyk7Ci19Ci0KLVRFU1QoZnhjcnQsIEJ5dGVTdHJpbmdDT3BlcmF0b3JORSkgewotICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYygiaGVsbG8iKTsKLSAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgIT0gYnl0ZV9zdHJpbmdfYyk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2Nfc2FtZTEoImhlbGxvIik7Ci0gIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jICE9IGJ5dGVfc3RyaW5nX2Nfc2FtZTEpOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfY19zYW1lMSAhPSBieXRlX3N0cmluZ19jKTsKLQotICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfY19zYW1lMihieXRlX3N0cmluZ19jKTsKLSAgRVhQRUNUX0ZBTFNFKGJ5dGVfc3RyaW5nX2MgIT0gYnl0ZV9zdHJpbmdfY19zYW1lMik7Ci0gIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jX3NhbWUyICE9IGJ5dGVfc3RyaW5nX2MpOwotCi0gIENGWF9CeXRlU3RyaW5nQyBieXRlX3N0cmluZ19jMSgiaGUiKTsKLSAgQ0ZYX0J5dGVTdHJpbmdDIGJ5dGVfc3RyaW5nX2MyKCJoZWxscCIpOwotICBDRlhfQnl0ZVN0cmluZ0MgYnl0ZV9zdHJpbmdfYzMoImhlbGxvZCIpOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jICE9IGJ5dGVfc3RyaW5nX2MxKTsKLSAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZ19jMik7Ci0gIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgIT0gYnl0ZV9zdHJpbmdfYzMpOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jMSAhPSBieXRlX3N0cmluZ19jKTsKLSAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYzIgIT0gYnl0ZV9zdHJpbmdfYyk7Ci0gIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MzICE9IGJ5dGVfc3RyaW5nX2MpOwotCi0gIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nX3NhbWUxKCJoZWxsbyIpOwotICBFWFBFQ1RfRkFMU0UoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZ19zYW1lMSk7Ci0gIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19zYW1lMSAhPSBieXRlX3N0cmluZ19jKTsKLQotICBDRlhfQnl0ZVN0cmluZyBieXRlX3N0cmluZzEoImhlIik7Ci0gIENGWF9CeXRlU3RyaW5nIGJ5dGVfc3RyaW5nMigiaGVsbHAiKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZV9zdHJpbmczKCJoZWxsb2QiKTsKLSAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyAhPSBieXRlX3N0cmluZzEpOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jICE9IGJ5dGVfc3RyaW5nMik7Ci0gIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgIT0gYnl0ZV9zdHJpbmczKTsKLSAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmcxICE9IGJ5dGVfc3RyaW5nX2MpOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZzIgIT0gYnl0ZV9zdHJpbmdfYyk7Ci0gIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nMyAhPSBieXRlX3N0cmluZ19jKTsKLQotICBjb25zdCBjaGFyKiBjX3N0cmluZ19zYW1lMSA9ICJoZWxsbyI7Ci0gIEVYUEVDVF9GQUxTRShieXRlX3N0cmluZ19jICE9IGNfc3RyaW5nX3NhbWUxKTsKLSAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nX3NhbWUxICE9IGJ5dGVfc3RyaW5nX2MpOwotCi0gIGNvbnN0IGNoYXIqIGNfc3RyaW5nMSA9ICJoZSI7Ci0gIGNvbnN0IGNoYXIqIGNfc3RyaW5nMiA9ICJoZWxscCI7Ci0gIGNvbnN0IGNoYXIqIGNfc3RyaW5nMyA9ICJoZWxsb2QiOwotICBFWFBFQ1RfVFJVRShieXRlX3N0cmluZ19jICE9IGNfc3RyaW5nMSk7Ci0gIEVYUEVDVF9UUlVFKGJ5dGVfc3RyaW5nX2MgIT0gY19zdHJpbmcyKTsKLSAgRVhQRUNUX1RSVUUoYnl0ZV9zdHJpbmdfYyAhPSBjX3N0cmluZzMpOwotCi0gIEVYUEVDVF9UUlVFKGNfc3RyaW5nMSAhPSBieXRlX3N0cmluZ19jKTsKLSAgRVhQRUNUX1RSVUUoY19zdHJpbmcyICE9IGJ5dGVfc3RyaW5nX2MpOwotICBFWFBFQ1RfVFJVRShjX3N0cmluZzMgIT0gYnl0ZV9zdHJpbmdfYyk7Ci19Ci0KLVRFU1QoZnhjcnQsIEJ5dGVTdHJpbmdGb3JtYXRXaWR0aCkgewotICB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyOwotICAgIHN0ci5Gb3JtYXQoIiU1ZCIsIDEpOwotICAgIEVYUEVDVF9FUSgiICAgIDEiLCBzdHIpOwotICB9Ci0KLSAgewotICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKLSAgICBzdHIuRm9ybWF0KCIlZCIsIDEpOwotICAgIEVYUEVDVF9FUSgiMSIsIHN0cik7Ci0gIH0KLQotICB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyOwotICAgIHN0ci5Gb3JtYXQoIiUqZCIsIDUsIDEpOwotICAgIEVYUEVDVF9FUSgiICAgIDEiLCBzdHIpOwotICB9Ci0KLSAgewotICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKLSAgICBzdHIuRm9ybWF0KCIlLTFkIiwgMSk7Ci0gICAgRVhQRUNUX0VRKCIxIiwgc3RyKTsKLSAgfQotCi0gIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBzdHI7Ci0gICAgc3RyLkZvcm1hdCgiJTBkIiwgMSk7Ci0gICAgRVhQRUNUX0VRKCIxIiwgc3RyKTsKLSAgfQotCi0gIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBzdHI7Ci0gICAgc3RyLkZvcm1hdCgiJTEwNDg1NzZkIiwgMSk7Ci0gICAgRVhQRUNUX0VRKCJCYWQgd2lkdGgiLCBzdHIpOwotICB9Ci19Ci0KLVRFU1QoZnhjcnQsIEJ5dGVTdHJpbmdGb3JtYXRQcmVjaXNpb24pIHsKLSAgewotICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKLSAgICBzdHIuRm9ybWF0KCIlLjJmIiwgMS4xMjM0NSk7Ci0gICAgRVhQRUNUX0VRKCIxLjEyIiwgc3RyKTsKLSAgfQotCi0gIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBzdHI7Ci0gICAgc3RyLkZvcm1hdCgiJS4qZiIsIDMsIDEuMTIzNDUpOwotICAgIEVYUEVDVF9FUSgiMS4xMjMiLCBzdHIpOwotICB9Ci0KLSAgewotICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKLSAgICBzdHIuRm9ybWF0KCIlZiIsIDEuMTIzNDUpOwotICAgIEVYUEVDVF9FUSgiMS4xMjM0NTAiLCBzdHIpOwotICB9Ci0KLSAgewotICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKLSAgICBzdHIuRm9ybWF0KCIlLTFmIiwgMS4xMjM0NSk7Ci0gICAgRVhQRUNUX0VRKCIxLjEyMzQ1MCIsIHN0cik7Ci0gIH0KLQotICB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyOwotICAgIHN0ci5Gb3JtYXQoIiUwZiIsIDEuMTIzNDUpOwotICAgIEVYUEVDVF9FUSgiMS4xMjM0NTAiLCBzdHIpOwotICB9Ci0KLSAgewotICAgIENGWF9CeXRlU3RyaW5nIHN0cjsKLSAgICBzdHIuRm9ybWF0KCIlLjEwNDg1NzZmIiwgMS4yKTsKLSAgICBFWFBFQ1RfRVEoIkJhZCBwcmVjaXNpb24iLCBzdHIpOwotICB9Ci19Ci0KLVRFU1QoZnhjcnQsIEVtcHR5Qnl0ZVN0cmluZykgewotICBDRlhfQnl0ZVN0cmluZyBlbXB0eV9zdHI7Ci0gIEVYUEVDVF9UUlVFKGVtcHR5X3N0ci5Jc0VtcHR5KCkpOwotICBFWFBFQ1RfRVEoMCwgZW1wdHlfc3RyLkdldExlbmd0aCgpKTsKLSAgY29uc3QgRlhfQ0hBUiogY3N0ciA9IGVtcHR5X3N0ci5jX3N0cigpOwotICBFWFBFQ1RfRVEoMCwgRlhTWVNfc3RybGVuKGNzdHIpKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvZnhfYmFzaWNfYnVmZmVyLmNwcCBiL2NvcmUvZnhjcnQvZnhfYmFzaWNfYnVmZmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRhODVjMi4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Y3J0L2Z4X2Jhc2ljX2J1ZmZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyODggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGxpbWl0cz4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfY29udmVyc2lvbnMuaCIKLQotQ0ZYX0JpbmFyeUJ1Zjo6Q0ZYX0JpbmFyeUJ1ZigpCi0gICAgOiBtX0FsbG9jU3RlcCgwKSwgbV9BbGxvY1NpemUoMCksIG1fRGF0YVNpemUoMCkge30KLQotQ0ZYX0JpbmFyeUJ1Zjo6Q0ZYX0JpbmFyeUJ1ZihGWF9TVFJTSVpFIHNpemUpCi0gICAgOiBtX0FsbG9jU3RlcCgwKSwgbV9BbGxvY1NpemUoc2l6ZSksIG1fRGF0YVNpemUoc2l6ZSkgewotICBtX3BCdWZmZXIucmVzZXQoRlhfQWxsb2ModWludDhfdCwgc2l6ZSkpOwotfQotCi1DRlhfQmluYXJ5QnVmOjp+Q0ZYX0JpbmFyeUJ1ZigpIHt9Ci0KLXZvaWQgQ0ZYX0JpbmFyeUJ1Zjo6RGVsZXRlKGludCBzdGFydF9pbmRleCwgaW50IGNvdW50KSB7Ci0gIGlmICghbV9wQnVmZmVyIHx8IHN0YXJ0X2luZGV4IDwgMCB8fCBjb3VudCA8IDAgfHwgY291bnQgPiBtX0RhdGFTaXplIHx8Ci0gICAgICBzdGFydF9pbmRleCA+IG1fRGF0YVNpemUgLSBjb3VudCkgewotICAgIHJldHVybjsKLSAgfQotICBGWFNZU19tZW1tb3ZlKG1fcEJ1ZmZlci5nZXQoKSArIHN0YXJ0X2luZGV4LAotICAgICAgICAgICAgICAgIG1fcEJ1ZmZlci5nZXQoKSArIHN0YXJ0X2luZGV4ICsgY291bnQsCi0gICAgICAgICAgICAgICAgbV9EYXRhU2l6ZSAtIHN0YXJ0X2luZGV4IC0gY291bnQpOwotICBtX0RhdGFTaXplIC09IGNvdW50OwotfQotCi12b2lkIENGWF9CaW5hcnlCdWY6OkNsZWFyKCkgewotICBtX0RhdGFTaXplID0gMDsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IENGWF9CaW5hcnlCdWY6OkRldGFjaEJ1ZmZlcigpIHsKLSAgbV9EYXRhU2l6ZSA9IDA7Ci0gIG1fQWxsb2NTaXplID0gMDsKLSAgcmV0dXJuIHN0ZDo6bW92ZShtX3BCdWZmZXIpOwotfQotCi12b2lkIENGWF9CaW5hcnlCdWY6OkVzdGltYXRlU2l6ZShGWF9TVFJTSVpFIHNpemUsIEZYX1NUUlNJWkUgc3RlcCkgewotICBtX0FsbG9jU3RlcCA9IHN0ZXA7Ci0gIGlmIChtX0FsbG9jU2l6ZSA8IHNpemUpCi0gICAgRXhwYW5kQnVmKHNpemUgLSBtX0RhdGFTaXplKTsKLX0KLQotdm9pZCBDRlhfQmluYXJ5QnVmOjpFeHBhbmRCdWYoRlhfU1RSU0laRSBhZGRfc2l6ZSkgewotICBGWF9TQUZFX1NUUlNJWkUgbmV3X3NpemUgPSBtX0RhdGFTaXplOwotICBuZXdfc2l6ZSArPSBhZGRfc2l6ZTsKLSAgaWYgKG1fQWxsb2NTaXplID49IG5ld19zaXplLlZhbHVlT3JEaWUoKSkKLSAgICByZXR1cm47Ci0KLSAgaW50IGFsbG9jX3N0ZXAgPSBzdGQ6Om1heCgxMjgsIG1fQWxsb2NTdGVwID8gbV9BbGxvY1N0ZXAgOiBtX0FsbG9jU2l6ZSAvIDQpOwotICBuZXdfc2l6ZSArPSBhbGxvY19zdGVwIC0gMTsgIC8vIFF1YW50aXplLCBkb24ndCBjb21iaW5lIHRoZXNlIGxpbmVzLgotICBuZXdfc2l6ZSAvPSBhbGxvY19zdGVwOwotICBuZXdfc2l6ZSAqPSBhbGxvY19zdGVwOwotICBtX0FsbG9jU2l6ZSA9IG5ld19zaXplLlZhbHVlT3JEaWUoKTsKLSAgbV9wQnVmZmVyLnJlc2V0KG1fcEJ1ZmZlcgotICAgICAgICAgICAgICAgICAgICAgID8gRlhfUmVhbGxvYyh1aW50OF90LCBtX3BCdWZmZXIucmVsZWFzZSgpLCBtX0FsbG9jU2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICA6IEZYX0FsbG9jKHVpbnQ4X3QsIG1fQWxsb2NTaXplKSk7Ci19Ci0KLXZvaWQgQ0ZYX0JpbmFyeUJ1Zjo6QXBwZW5kQmxvY2soY29uc3Qgdm9pZCogcEJ1ZiwgRlhfU1RSU0laRSBzaXplKSB7Ci0gIGlmIChzaXplIDw9IDApCi0gICAgcmV0dXJuOwotCi0gIEV4cGFuZEJ1ZihzaXplKTsKLSAgaWYgKHBCdWYpIHsKLSAgICBGWFNZU19tZW1jcHkobV9wQnVmZmVyLmdldCgpICsgbV9EYXRhU2l6ZSwgcEJ1Ziwgc2l6ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgRlhTWVNfbWVtc2V0KG1fcEJ1ZmZlci5nZXQoKSArIG1fRGF0YVNpemUsIDAsIHNpemUpOwotICB9Ci0gIG1fRGF0YVNpemUgKz0gc2l6ZTsKLX0KLQotdm9pZCBDRlhfQmluYXJ5QnVmOjpJbnNlcnRCbG9jayhGWF9TVFJTSVpFIHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogcEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSBzaXplKSB7Ci0gIGlmIChzaXplIDw9IDApCi0gICAgcmV0dXJuOwotCi0gIEV4cGFuZEJ1ZihzaXplKTsKLSAgRlhTWVNfbWVtbW92ZShtX3BCdWZmZXIuZ2V0KCkgKyBwb3MgKyBzaXplLCBtX3BCdWZmZXIuZ2V0KCkgKyBwb3MsCi0gICAgICAgICAgICAgICAgbV9EYXRhU2l6ZSAtIHBvcyk7Ci0gIGlmIChwQnVmKSB7Ci0gICAgRlhTWVNfbWVtY3B5KG1fcEJ1ZmZlci5nZXQoKSArIHBvcywgcEJ1Ziwgc2l6ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgRlhTWVNfbWVtc2V0KG1fcEJ1ZmZlci5nZXQoKSArIHBvcywgMCwgc2l6ZSk7Ci0gIH0KLSAgbV9EYXRhU2l6ZSArPSBzaXplOwotfQotCi1DRlhfQnl0ZVRleHRCdWYmIENGWF9CeXRlVGV4dEJ1Zjo6b3BlcmF0b3I8PChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGxwc3opIHsKLSAgQXBwZW5kQmxvY2sobHBzei5yYXdfc3RyKCksIGxwc3ouR2V0TGVuZ3RoKCkpOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLUNGWF9CeXRlVGV4dEJ1ZiYgQ0ZYX0J5dGVUZXh0QnVmOjpvcGVyYXRvcjw8KGludCBpKSB7Ci0gIGNoYXIgYnVmWzMyXTsKLSAgRlhTWVNfaXRvYShpLCBidWYsIDEwKTsKLSAgQXBwZW5kQmxvY2soYnVmLCBGWFNZU19zdHJsZW4oYnVmKSk7Ci0gIHJldHVybiAqdGhpczsKLX0KLQotQ0ZYX0J5dGVUZXh0QnVmJiBDRlhfQnl0ZVRleHRCdWY6Om9wZXJhdG9yPDwodWludDMyX3QgaSkgewotICBjaGFyIGJ1ZlszMl07Ci0gIEZYU1lTX2l0b2EoaSwgYnVmLCAxMCk7Ci0gIEFwcGVuZEJsb2NrKGJ1ZiwgRlhTWVNfc3RybGVuKGJ1ZikpOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLUNGWF9CeXRlVGV4dEJ1ZiYgQ0ZYX0J5dGVUZXh0QnVmOjpvcGVyYXRvcjw8KGRvdWJsZSBmKSB7Ci0gIGNoYXIgYnVmWzMyXTsKLSAgRlhfU1RSU0laRSBsZW4gPSBGWF9mdG9hKChGWF9GTE9BVClmLCBidWYpOwotICBBcHBlbmRCbG9jayhidWYsIGxlbik7Ci0gIHJldHVybiAqdGhpczsKLX0KLQotQ0ZYX0J5dGVUZXh0QnVmJiBDRlhfQnl0ZVRleHRCdWY6Om9wZXJhdG9yPDwoY29uc3QgQ0ZYX0J5dGVUZXh0QnVmJiBidWYpIHsKLSAgQXBwZW5kQmxvY2soYnVmLm1fcEJ1ZmZlci5nZXQoKSwgYnVmLm1fRGF0YVNpemUpOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLXZvaWQgQ0ZYX1dpZGVUZXh0QnVmOjpBcHBlbmRDaGFyKEZYX1dDSEFSIGNoKSB7Ci0gIEV4cGFuZEJ1ZihzaXplb2YoRlhfV0NIQVIpKTsKLSAgKihGWF9XQ0hBUiopKG1fcEJ1ZmZlci5nZXQoKSArIG1fRGF0YVNpemUpID0gY2g7Ci0gIG1fRGF0YVNpemUgKz0gc2l6ZW9mKEZYX1dDSEFSKTsKLX0KLQotQ0ZYX1dpZGVUZXh0QnVmJiBDRlhfV2lkZVRleHRCdWY6Om9wZXJhdG9yPDwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIpIHsKLSAgQXBwZW5kQmxvY2soc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSAqIHNpemVvZihGWF9XQ0hBUikpOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLUNGWF9XaWRlVGV4dEJ1ZiYgQ0ZYX1dpZGVUZXh0QnVmOjpvcGVyYXRvcjw8KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKLSAgQXBwZW5kQmxvY2soc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSAqIHNpemVvZihGWF9XQ0hBUikpOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLUNGWF9XaWRlVGV4dEJ1ZiYgQ0ZYX1dpZGVUZXh0QnVmOjpvcGVyYXRvcjw8KGludCBpKSB7Ci0gIGNoYXIgYnVmWzMyXTsKLSAgRlhTWVNfaXRvYShpLCBidWYsIDEwKTsKLSAgRlhfU1RSU0laRSBsZW4gPSBGWFNZU19zdHJsZW4oYnVmKTsKLSAgRXhwYW5kQnVmKGxlbiAqIHNpemVvZihGWF9XQ0hBUikpOwotICBGWF9XQ0hBUiogc3RyID0gKEZYX1dDSEFSKikobV9wQnVmZmVyLmdldCgpICsgbV9EYXRhU2l6ZSk7Ci0gIGZvciAoRlhfU1RSU0laRSBqID0gMDsgaiA8IGxlbjsgaisrKSB7Ci0gICAgKnN0cisrID0gYnVmW2pdOwotICB9Ci0gIG1fRGF0YVNpemUgKz0gbGVuICogc2l6ZW9mKEZYX1dDSEFSKTsKLSAgcmV0dXJuICp0aGlzOwotfQotCi1DRlhfV2lkZVRleHRCdWYmIENGWF9XaWRlVGV4dEJ1Zjo6b3BlcmF0b3I8PChkb3VibGUgZikgewotICBjaGFyIGJ1ZlszMl07Ci0gIEZYX1NUUlNJWkUgbGVuID0gRlhfZnRvYSgoRlhfRkxPQVQpZiwgYnVmKTsKLSAgRXhwYW5kQnVmKGxlbiAqIHNpemVvZihGWF9XQ0hBUikpOwotICBGWF9XQ0hBUiogc3RyID0gKEZYX1dDSEFSKikobV9wQnVmZmVyLmdldCgpICsgbV9EYXRhU2l6ZSk7Ci0gIGZvciAoRlhfU1RSU0laRSBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgKnN0cisrID0gYnVmW2ldOwotICB9Ci0gIG1fRGF0YVNpemUgKz0gbGVuICogc2l6ZW9mKEZYX1dDSEFSKTsKLSAgcmV0dXJuICp0aGlzOwotfQotCi1DRlhfV2lkZVRleHRCdWYmIENGWF9XaWRlVGV4dEJ1Zjo6b3BlcmF0b3I8PChjb25zdCBGWF9XQ0hBUiogbHBzeikgewotICBBcHBlbmRCbG9jayhscHN6LCBGWFNZU193Y3NsZW4obHBzeikgKiBzaXplb2YoRlhfV0NIQVIpKTsKLSAgcmV0dXJuICp0aGlzOwotfQotCi1DRlhfV2lkZVRleHRCdWYmIENGWF9XaWRlVGV4dEJ1Zjo6b3BlcmF0b3I8PChjb25zdCBDRlhfV2lkZVRleHRCdWYmIGJ1ZikgewotICBBcHBlbmRCbG9jayhidWYubV9wQnVmZmVyLmdldCgpLCBidWYubV9EYXRhU2l6ZSk7Ci0gIHJldHVybiAqdGhpczsKLX0KLQotdm9pZCBDRlhfQml0U3RyZWFtOjpJbml0KGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCB1aW50MzJfdCBkd1NpemUpIHsKLSAgbV9wRGF0YSA9IHBEYXRhOwotICBtX0JpdFNpemUgPSBkd1NpemUgKiA4OwotICBtX0JpdFBvcyA9IDA7Ci19Ci0KLXZvaWQgQ0ZYX0JpdFN0cmVhbTo6Qnl0ZUFsaWduKCkgewotICBtX0JpdFBvcyA9IChtX0JpdFBvcyArIDcpICYgfjc7Ci19Ci0KLXVpbnQzMl90IENGWF9CaXRTdHJlYW06OkdldEJpdHModWludDMyX3QgbkJpdHMpIHsKLSAgaWYgKG5CaXRzID4gbV9CaXRTaXplIHx8IG1fQml0UG9zICsgbkJpdHMgPiBtX0JpdFNpemUpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKG5CaXRzID09IDEpIHsKLSAgICBpbnQgYml0ID0gKG1fcERhdGFbbV9CaXRQb3MgLyA4XSAmICgxIDw8ICg3IC0gbV9CaXRQb3MgJSA4KSkpID8gMSA6IDA7Ci0gICAgbV9CaXRQb3MrKzsKLSAgICByZXR1cm4gYml0OwotICB9Ci0KLSAgdWludDMyX3QgYnl0ZV9wb3MgPSBtX0JpdFBvcyAvIDg7Ci0gIHVpbnQzMl90IGJpdF9wb3MgPSBtX0JpdFBvcyAlIDg7Ci0gIHVpbnQzMl90IGJpdF9sZWZ0ID0gbkJpdHM7Ci0gIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gIGlmIChiaXRfcG9zKSB7Ci0gICAgaWYgKDggLSBiaXRfcG9zID49IGJpdF9sZWZ0KSB7Ci0gICAgICByZXN1bHQgPQotICAgICAgICAgIChtX3BEYXRhW2J5dGVfcG9zXSAmICgweGZmID4+IGJpdF9wb3MpKSA+PiAoOCAtIGJpdF9wb3MgLSBiaXRfbGVmdCk7Ci0gICAgICBtX0JpdFBvcyArPSBiaXRfbGVmdDsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotICAgIGJpdF9sZWZ0IC09IDggLSBiaXRfcG9zOwotICAgIHJlc3VsdCA9IChtX3BEYXRhW2J5dGVfcG9zKytdICYgKCgxIDw8ICg4IC0gYml0X3BvcykpIC0gMSkpIDw8IGJpdF9sZWZ0OwotICB9Ci0gIHdoaWxlIChiaXRfbGVmdCA+PSA4KSB7Ci0gICAgYml0X2xlZnQgLT0gODsKLSAgICByZXN1bHQgfD0gbV9wRGF0YVtieXRlX3BvcysrXSA8PCBiaXRfbGVmdDsKLSAgfQotICBpZiAoYml0X2xlZnQpCi0gICAgcmVzdWx0IHw9IG1fcERhdGFbYnl0ZV9wb3NdID4+ICg4IC0gYml0X2xlZnQpOwotICBtX0JpdFBvcyArPSBuQml0czsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjpDRlhfRmlsZUJ1ZmZlckFyY2hpdmUoKQotICAgIDogbV9MZW5ndGgoMCksIG1fcEZpbGUobnVsbHB0cikge30KLQotQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjp+Q0ZYX0ZpbGVCdWZmZXJBcmNoaXZlKCkge30KLQotdm9pZCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkNsZWFyKCkgewotICBtX0xlbmd0aCA9IDA7Ci0gIG1fcEJ1ZmZlci5yZXNldCgpOwotICBtX3BGaWxlLlJlc2V0KCk7Ci19Ci0KLWJvb2wgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjpGbHVzaCgpIHsKLSAgc2l6ZV90IG5SZW1haW5pbmcgPSBtX0xlbmd0aDsKLSAgbV9MZW5ndGggPSAwOwotICBpZiAoIW1fcEZpbGUpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoIW1fcEJ1ZmZlciB8fCAhblJlbWFpbmluZykKLSAgICByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIG1fcEZpbGUtPldyaXRlQmxvY2sobV9wQnVmZmVyLmdldCgpLCBuUmVtYWluaW5nKTsKLX0KLQotaW50MzJfdCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkFwcGVuZEJsb2NrKGNvbnN0IHZvaWQqIHBCdWYsIHNpemVfdCBzaXplKSB7Ci0gIGlmICghcEJ1ZiB8fCBzaXplIDwgMSkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoIW1fcEJ1ZmZlcikKLSAgICBtX3BCdWZmZXIucmVzZXQoRlhfQWxsb2ModWludDhfdCwga0J1ZlNpemUpKTsKLQotICBjb25zdCB1aW50OF90KiBidWZmZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihwQnVmKTsKLSAgc2l6ZV90IHRlbXBfc2l6ZSA9IHNpemU7Ci0gIHdoaWxlICh0ZW1wX3NpemUpIHsKLSAgICBzaXplX3QgYnVmX3NpemUgPSBzdGQ6Om1pbihrQnVmU2l6ZSAtIG1fTGVuZ3RoLCB0ZW1wX3NpemUpOwotICAgIEZYU1lTX21lbWNweShtX3BCdWZmZXIuZ2V0KCkgKyBtX0xlbmd0aCwgYnVmZmVyLCBidWZfc2l6ZSk7Ci0gICAgbV9MZW5ndGggKz0gYnVmX3NpemU7Ci0gICAgaWYgKG1fTGVuZ3RoID09IGtCdWZTaXplKSB7Ci0gICAgICBpZiAoIUZsdXNoKCkpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgIH0KLSAgICB0ZW1wX3NpemUgLT0gYnVmX3NpemU7Ci0gICAgYnVmZmVyICs9IGJ1Zl9zaXplOwotICB9Ci0gIHJldHVybiBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxpbnQzMl90PihzaXplKTsKLX0KLQotaW50MzJfdCBDRlhfRmlsZUJ1ZmZlckFyY2hpdmU6OkFwcGVuZEJ5dGUodWludDhfdCBieXRlKSB7Ci0gIHJldHVybiBBcHBlbmRCbG9jaygmYnl0ZSwgMSk7Ci19Ci0KLWludDMyX3QgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjpBcHBlbmREV29yZCh1aW50MzJfdCBpKSB7Ci0gIGNoYXIgYnVmWzMyXTsKLSAgRlhTWVNfaXRvYShpLCBidWYsIDEwKTsKLSAgcmV0dXJuIEFwcGVuZEJsb2NrKGJ1ZiwgKHNpemVfdClGWFNZU19zdHJsZW4oYnVmKSk7Ci19Ci0KLWludDMyX3QgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjpBcHBlbmRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBscHN6KSB7Ci0gIHJldHVybiBBcHBlbmRCbG9jayhscHN6LnJhd19zdHIoKSwgbHBzei5HZXRMZW5ndGgoKSk7Ci19Ci0KLXZvaWQgQ0ZYX0ZpbGVCdWZmZXJBcmNoaXZlOjpBdHRhY2hGaWxlKAotICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1dyaXRlU3RyZWFtPiYgcEZpbGUpIHsKLSAgQVNTRVJUKHBGaWxlKTsKLSAgbV9wRmlsZSA9IHBGaWxlOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF9iYXNpY19jb29yZHMuY3BwIGIvY29yZS9meGNydC9meF9iYXNpY19jb29yZHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjVhMDEwLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjcnQvZnhfYmFzaWNfY29vcmRzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQxNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dC5oIgotCi1uYW1lc3BhY2UgewotCi12b2lkIE1hdGNoRmxvYXRSYW5nZShGWF9GTE9BVCBmMSwgRlhfRkxPQVQgZjIsIGludCogaTEsIGludCogaTIpIHsKLSAgaW50IGxlbmd0aCA9IHN0YXRpY19jYXN0PGludD4oRlhTWVNfY2VpbChmMiAtIGYxKSk7Ci0gIGludCBpMV8xID0gc3RhdGljX2Nhc3Q8aW50PihGWFNZU19mbG9vcihmMSkpOwotICBpbnQgaTFfMiA9IHN0YXRpY19jYXN0PGludD4oRlhTWVNfY2VpbChmMSkpOwotICBGWF9GTE9BVCBlcnJvcjEgPSBmMSAtIGkxXzEgKyAoRlhfRkxPQVQpRlhTWVNfZmFicyhmMiAtIGkxXzEgLSBsZW5ndGgpOwotICBGWF9GTE9BVCBlcnJvcjIgPSBpMV8yIC0gZjEgKyAoRlhfRkxPQVQpRlhTWVNfZmFicyhmMiAtIGkxXzIgLSBsZW5ndGgpOwotCi0gICppMSA9IChlcnJvcjEgPiBlcnJvcjIpID8gaTFfMiA6IGkxXzE7Ci0gICppMiA9ICppMSArIGxlbmd0aDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLXZvaWQgRlhfUkVDVDo6Tm9ybWFsaXplKCkgewotICBpZiAobGVmdCA+IHJpZ2h0KSB7Ci0gICAgaW50IHRlbXAgPSBsZWZ0OwotICAgIGxlZnQgPSByaWdodDsKLSAgICByaWdodCA9IHRlbXA7Ci0gIH0KLSAgaWYgKHRvcCA+IGJvdHRvbSkgewotICAgIGludCB0ZW1wID0gdG9wOwotICAgIHRvcCA9IGJvdHRvbTsKLSAgICBib3R0b20gPSB0ZW1wOwotICB9Ci19Ci12b2lkIEZYX1JFQ1Q6OkludGVyc2VjdChjb25zdCBGWF9SRUNUJiBzcmMpIHsKLSAgRlhfUkVDVCBzcmNfbiA9IHNyYzsKLSAgc3JjX24uTm9ybWFsaXplKCk7Ci0gIE5vcm1hbGl6ZSgpOwotICBsZWZ0ID0gbGVmdCA+IHNyY19uLmxlZnQgPyBsZWZ0IDogc3JjX24ubGVmdDsKLSAgdG9wID0gdG9wID4gc3JjX24udG9wID8gdG9wIDogc3JjX24udG9wOwotICByaWdodCA9IHJpZ2h0IDwgc3JjX24ucmlnaHQgPyByaWdodCA6IHNyY19uLnJpZ2h0OwotICBib3R0b20gPSBib3R0b20gPCBzcmNfbi5ib3R0b20gPyBib3R0b20gOiBzcmNfbi5ib3R0b207Ci0gIGlmIChsZWZ0ID4gcmlnaHQgfHwgdG9wID4gYm90dG9tKSB7Ci0gICAgbGVmdCA9IHRvcCA9IHJpZ2h0ID0gYm90dG9tID0gMDsKLSAgfQotfQotCi1ib29sIEdldEludGVyc2VjdGlvbihGWF9GTE9BVCBsb3cxLAotICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGlnaDEsCi0gICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBsb3cyLAotICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGlnaDIsCi0gICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgaW50ZXJsb3csCi0gICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgaW50ZXJoaWdoKSB7Ci0gIGlmIChsb3cxID49IGhpZ2gyIHx8IGxvdzIgPj0gaGlnaDEpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaW50ZXJsb3cgPSBsb3cxID4gbG93MiA/IGxvdzEgOiBsb3cyOwotICBpbnRlcmhpZ2ggPSBoaWdoMSA+IGhpZ2gyID8gaGlnaDIgOiBoaWdoMTsKLSAgcmV0dXJuIHRydWU7Ci19Ci1leHRlcm4gIkMiIGludCBGWFNZU19yb3VuZChGWF9GTE9BVCBkKSB7Ci0gIGlmIChkIDwgKEZYX0ZMT0FUKUlOVF9NSU4pIHsKLSAgICByZXR1cm4gSU5UX01JTjsKLSAgfQotICBpZiAoZCA+IChGWF9GTE9BVClJTlRfTUFYKSB7Ci0gICAgcmV0dXJuIElOVF9NQVg7Ci0gIH0KLQotICByZXR1cm4gKGludClyb3VuZChkKTsKLX0KLUNGWF9GbG9hdFJlY3Q6OkNGWF9GbG9hdFJlY3QoY29uc3QgRlhfUkVDVCYgcmVjdCkgewotICBsZWZ0ID0gKEZYX0ZMT0FUKShyZWN0LmxlZnQpOwotICByaWdodCA9IChGWF9GTE9BVCkocmVjdC5yaWdodCk7Ci0gIGJvdHRvbSA9IChGWF9GTE9BVCkocmVjdC50b3ApOwotICB0b3AgPSAoRlhfRkxPQVQpKHJlY3QuYm90dG9tKTsKLX0KLXZvaWQgQ0ZYX0Zsb2F0UmVjdDo6Tm9ybWFsaXplKCkgewotICBGWF9GTE9BVCB0ZW1wOwotICBpZiAobGVmdCA+IHJpZ2h0KSB7Ci0gICAgdGVtcCA9IGxlZnQ7Ci0gICAgbGVmdCA9IHJpZ2h0OwotICAgIHJpZ2h0ID0gdGVtcDsKLSAgfQotICBpZiAoYm90dG9tID4gdG9wKSB7Ci0gICAgdGVtcCA9IHRvcDsKLSAgICB0b3AgPSBib3R0b207Ci0gICAgYm90dG9tID0gdGVtcDsKLSAgfQotfQotdm9pZCBDRlhfRmxvYXRSZWN0OjpJbnRlcnNlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgb3RoZXJfcmVjdCkgewotICBOb3JtYWxpemUoKTsKLSAgQ0ZYX0Zsb2F0UmVjdCBvdGhlciA9IG90aGVyX3JlY3Q7Ci0gIG90aGVyLk5vcm1hbGl6ZSgpOwotICBsZWZ0ID0gbGVmdCA+IG90aGVyLmxlZnQgPyBsZWZ0IDogb3RoZXIubGVmdDsKLSAgcmlnaHQgPSByaWdodCA8IG90aGVyLnJpZ2h0ID8gcmlnaHQgOiBvdGhlci5yaWdodDsKLSAgYm90dG9tID0gYm90dG9tID4gb3RoZXIuYm90dG9tID8gYm90dG9tIDogb3RoZXIuYm90dG9tOwotICB0b3AgPSB0b3AgPCBvdGhlci50b3AgPyB0b3AgOiBvdGhlci50b3A7Ci0gIGlmIChsZWZ0ID4gcmlnaHQgfHwgYm90dG9tID4gdG9wKSB7Ci0gICAgbGVmdCA9IHJpZ2h0ID0gYm90dG9tID0gdG9wID0gMDsKLSAgfQotfQotdm9pZCBDRlhfRmxvYXRSZWN0OjpVbmlvbihjb25zdCBDRlhfRmxvYXRSZWN0JiBvdGhlcl9yZWN0KSB7Ci0gIE5vcm1hbGl6ZSgpOwotICBDRlhfRmxvYXRSZWN0IG90aGVyID0gb3RoZXJfcmVjdDsKLSAgb3RoZXIuTm9ybWFsaXplKCk7Ci0gIGxlZnQgPSBsZWZ0IDwgb3RoZXIubGVmdCA/IGxlZnQgOiBvdGhlci5sZWZ0OwotICByaWdodCA9IHJpZ2h0ID4gb3RoZXIucmlnaHQgPyByaWdodCA6IG90aGVyLnJpZ2h0OwotICBib3R0b20gPSBib3R0b20gPCBvdGhlci5ib3R0b20gPyBib3R0b20gOiBvdGhlci5ib3R0b207Ci0gIHRvcCA9IHRvcCA+IG90aGVyLnRvcCA/IHRvcCA6IG90aGVyLnRvcDsKLX0KLQotaW50IENGWF9GbG9hdFJlY3Q6OlN1YnN0cmFjdDQoQ0ZYX0Zsb2F0UmVjdCYgcywgQ0ZYX0Zsb2F0UmVjdCogcFJlY3RzKSB7Ci0gIE5vcm1hbGl6ZSgpOwotICBzLk5vcm1hbGl6ZSgpOwotICBpbnQgblJlY3RzID0gMDsKLSAgQ0ZYX0Zsb2F0UmVjdCByZWN0c1s0XTsKLSAgaWYgKGxlZnQgPCBzLmxlZnQpIHsKLSAgICByZWN0c1tuUmVjdHNdLmxlZnQgPSBsZWZ0OwotICAgIHJlY3RzW25SZWN0c10ucmlnaHQgPSBzLmxlZnQ7Ci0gICAgcmVjdHNbblJlY3RzXS5ib3R0b20gPSBib3R0b207Ci0gICAgcmVjdHNbblJlY3RzXS50b3AgPSB0b3A7Ci0gICAgblJlY3RzKys7Ci0gIH0KLSAgaWYgKHMubGVmdCA8IHJpZ2h0ICYmIHMudG9wIDwgdG9wKSB7Ci0gICAgcmVjdHNbblJlY3RzXS5sZWZ0ID0gcy5sZWZ0OwotICAgIHJlY3RzW25SZWN0c10ucmlnaHQgPSByaWdodDsKLSAgICByZWN0c1tuUmVjdHNdLmJvdHRvbSA9IHMudG9wOwotICAgIHJlY3RzW25SZWN0c10udG9wID0gdG9wOwotICAgIG5SZWN0cysrOwotICB9Ci0gIGlmIChzLnRvcCA+IGJvdHRvbSAmJiBzLnJpZ2h0IDwgcmlnaHQpIHsKLSAgICByZWN0c1tuUmVjdHNdLmxlZnQgPSBzLnJpZ2h0OwotICAgIHJlY3RzW25SZWN0c10ucmlnaHQgPSByaWdodDsKLSAgICByZWN0c1tuUmVjdHNdLmJvdHRvbSA9IGJvdHRvbTsKLSAgICByZWN0c1tuUmVjdHNdLnRvcCA9IHMudG9wOwotICAgIG5SZWN0cysrOwotICB9Ci0gIGlmIChzLmJvdHRvbSA+IGJvdHRvbSkgewotICAgIHJlY3RzW25SZWN0c10ubGVmdCA9IHMubGVmdDsKLSAgICByZWN0c1tuUmVjdHNdLnJpZ2h0ID0gcy5yaWdodDsKLSAgICByZWN0c1tuUmVjdHNdLmJvdHRvbSA9IGJvdHRvbTsKLSAgICByZWN0c1tuUmVjdHNdLnRvcCA9IHMuYm90dG9tOwotICAgIG5SZWN0cysrOwotICB9Ci0gIGlmIChuUmVjdHMgPT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgblJlY3RzOyBpKyspIHsKLSAgICBwUmVjdHNbaV0gPSByZWN0c1tpXTsKLSAgICBwUmVjdHNbaV0uSW50ZXJzZWN0KCp0aGlzKTsKLSAgfQotICByZXR1cm4gblJlY3RzOwotfQotCi1GWF9SRUNUIENGWF9GbG9hdFJlY3Q6OkdldE91dGVyUmVjdCgpIGNvbnN0IHsKLSAgQ0ZYX0Zsb2F0UmVjdCByZWN0MSA9ICp0aGlzOwotICBGWF9SRUNUIHJlY3Q7Ci0gIHJlY3QubGVmdCA9IChpbnQpRlhTWVNfZmxvb3IocmVjdDEubGVmdCk7Ci0gIHJlY3QucmlnaHQgPSAoaW50KUZYU1lTX2NlaWwocmVjdDEucmlnaHQpOwotICByZWN0LnRvcCA9IChpbnQpRlhTWVNfZmxvb3IocmVjdDEuYm90dG9tKTsKLSAgcmVjdC5ib3R0b20gPSAoaW50KUZYU1lTX2NlaWwocmVjdDEudG9wKTsKLSAgcmVjdC5Ob3JtYWxpemUoKTsKLSAgcmV0dXJuIHJlY3Q7Ci19Ci0KLUZYX1JFQ1QgQ0ZYX0Zsb2F0UmVjdDo6R2V0SW5uZXJSZWN0KCkgY29uc3QgewotICBDRlhfRmxvYXRSZWN0IHJlY3QxID0gKnRoaXM7Ci0gIEZYX1JFQ1QgcmVjdDsKLSAgcmVjdC5sZWZ0ID0gKGludClGWFNZU19jZWlsKHJlY3QxLmxlZnQpOwotICByZWN0LnJpZ2h0ID0gKGludClGWFNZU19mbG9vcihyZWN0MS5yaWdodCk7Ci0gIHJlY3QudG9wID0gKGludClGWFNZU19jZWlsKHJlY3QxLmJvdHRvbSk7Ci0gIHJlY3QuYm90dG9tID0gKGludClGWFNZU19mbG9vcihyZWN0MS50b3ApOwotICByZWN0Lk5vcm1hbGl6ZSgpOwotICByZXR1cm4gcmVjdDsKLX0KLQotRlhfUkVDVCBDRlhfRmxvYXRSZWN0OjpHZXRDbG9zZXN0UmVjdCgpIGNvbnN0IHsKLSAgQ0ZYX0Zsb2F0UmVjdCByZWN0MSA9ICp0aGlzOwotICBGWF9SRUNUIHJlY3Q7Ci0gIE1hdGNoRmxvYXRSYW5nZShyZWN0MS5sZWZ0LCByZWN0MS5yaWdodCwgJnJlY3QubGVmdCwgJnJlY3QucmlnaHQpOwotICBNYXRjaEZsb2F0UmFuZ2UocmVjdDEuYm90dG9tLCByZWN0MS50b3AsICZyZWN0LnRvcCwgJnJlY3QuYm90dG9tKTsKLSAgcmVjdC5Ob3JtYWxpemUoKTsKLSAgcmV0dXJuIHJlY3Q7Ci19Ci0KLWJvb2wgQ0ZYX0Zsb2F0UmVjdDo6Q29udGFpbnMoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIGNvbnN0IHsKLSAgQ0ZYX0Zsb2F0UmVjdCBuMSgqdGhpcyk7Ci0gIG4xLk5vcm1hbGl6ZSgpOwotICByZXR1cm4gcG9pbnQueCA8PSBuMS5yaWdodCAmJiBwb2ludC54ID49IG4xLmxlZnQgJiYgcG9pbnQueSA8PSBuMS50b3AgJiYKLSAgICAgICAgIHBvaW50LnkgPj0gbjEuYm90dG9tOwotfQotCi1ib29sIENGWF9GbG9hdFJlY3Q6OkNvbnRhaW5zKGNvbnN0IENGWF9GbG9hdFJlY3QmIG90aGVyX3JlY3QpIGNvbnN0IHsKLSAgQ0ZYX0Zsb2F0UmVjdCBuMSgqdGhpcyk7Ci0gIENGWF9GbG9hdFJlY3QgbjIob3RoZXJfcmVjdCk7Ci0gIG4xLk5vcm1hbGl6ZSgpOwotICBuMi5Ob3JtYWxpemUoKTsKLSAgcmV0dXJuIG4yLmxlZnQgPj0gbjEubGVmdCAmJiBuMi5yaWdodCA8PSBuMS5yaWdodCAmJiBuMi5ib3R0b20gPj0gbjEuYm90dG9tICYmCi0gICAgICAgICBuMi50b3AgPD0gbjEudG9wOwotfQotCi12b2lkIENGWF9GbG9hdFJlY3Q6OlVwZGF0ZVJlY3QoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkgewotICBsZWZ0ID0gc3RkOjptaW4obGVmdCwgeCk7Ci0gIHJpZ2h0ID0gc3RkOjptYXgocmlnaHQsIHgpOwotICBib3R0b20gPSBzdGQ6Om1pbihib3R0b20sIHkpOwotICB0b3AgPSBzdGQ6Om1heCh0b3AsIHkpOwotfQotCi1DRlhfRmxvYXRSZWN0IENGWF9GbG9hdFJlY3Q6OkdldEJCb3goY29uc3QgQ0ZYX1BvaW50RiogcFBvaW50cywgaW50IG5Qb2ludHMpIHsKLSAgaWYgKG5Qb2ludHMgPT0gMCkKLSAgICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdCgpOwotCi0gIEZYX0ZMT0FUIG1pbl94ID0gcFBvaW50cy0+eDsKLSAgRlhfRkxPQVQgbWF4X3ggPSBwUG9pbnRzLT54OwotICBGWF9GTE9BVCBtaW5feSA9IHBQb2ludHMtPnk7Ci0gIEZYX0ZMT0FUIG1heF95ID0gcFBvaW50cy0+eTsKLSAgZm9yIChpbnQgaSA9IDE7IGkgPCBuUG9pbnRzOyBpKyspIHsKLSAgICBtaW5feCA9IHN0ZDo6bWluKG1pbl94LCBwUG9pbnRzW2ldLngpOwotICAgIG1heF94ID0gc3RkOjptYXgobWF4X3gsIHBQb2ludHNbaV0ueCk7Ci0gICAgbWluX3kgPSBzdGQ6Om1pbihtaW5feSwgcFBvaW50c1tpXS55KTsKLSAgICBtYXhfeSA9IHN0ZDo6bWF4KG1heF95LCBwUG9pbnRzW2ldLnkpOwotICB9Ci0gIHJldHVybiBDRlhfRmxvYXRSZWN0KG1pbl94LCBtaW5feSwgbWF4X3gsIG1heF95KTsKLX0KLQotdm9pZCBDRlhfTWF0cml4OjpTZXRSZXZlcnNlKGNvbnN0IENGWF9NYXRyaXgmIG0pIHsKLSAgRlhfRkxPQVQgaSA9IG0uYSAqIG0uZCAtIG0uYiAqIG0uYzsKLSAgaWYgKEZYU1lTX2ZhYnMoaSkgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgRlhfRkxPQVQgaiA9IC1pOwotICBhID0gbS5kIC8gaTsKLSAgYiA9IG0uYiAvIGo7Ci0gIGMgPSBtLmMgLyBqOwotICBkID0gbS5hIC8gaTsKLSAgZSA9IChtLmMgKiBtLmYgLSBtLmQgKiBtLmUpIC8gaTsKLSAgZiA9IChtLmEgKiBtLmYgLSBtLmIgKiBtLmUpIC8gajsKLX0KLQotdm9pZCBDRlhfTWF0cml4OjpDb25jYXQoY29uc3QgQ0ZYX01hdHJpeCYgbSwgYm9vbCBiUHJlcGVuZGVkKSB7Ci0gIENvbmNhdEludGVybmFsKG0sIGJQcmVwZW5kZWQpOwotfQotCi12b2lkIENGWF9NYXRyaXg6OkNvbmNhdEludmVyc2UoY29uc3QgQ0ZYX01hdHJpeCYgc3JjLCBib29sIGJQcmVwZW5kZWQpIHsKLSAgQ0ZYX01hdHJpeCBtOwotICBtLlNldFJldmVyc2Uoc3JjKTsKLSAgQ29uY2F0KG0sIGJQcmVwZW5kZWQpOwotfQotCi1ib29sIENGWF9NYXRyaXg6OklzOTBSb3RhdGVkKCkgY29uc3QgewotICByZXR1cm4gRlhTWVNfZmFicyhhICogMTAwMCkgPCBGWFNZU19mYWJzKGIpICYmCi0gICAgICAgICBGWFNZU19mYWJzKGQgKiAxMDAwKSA8IEZYU1lTX2ZhYnMoYyk7Ci19Ci0KLWJvb2wgQ0ZYX01hdHJpeDo6SXNTY2FsZWQoKSBjb25zdCB7Ci0gIHJldHVybiBGWFNZU19mYWJzKGIgKiAxMDAwKSA8IEZYU1lTX2ZhYnMoYSkgJiYKLSAgICAgICAgIEZYU1lTX2ZhYnMoYyAqIDEwMDApIDwgRlhTWVNfZmFicyhkKTsKLX0KLQotdm9pZCBDRlhfTWF0cml4OjpUcmFuc2xhdGUoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgYm9vbCBiUHJlcGVuZGVkKSB7Ci0gIGlmIChiUHJlcGVuZGVkKSB7Ci0gICAgZSArPSB4ICogYSArIHkgKiBjOwotICAgIGYgKz0geSAqIGQgKyB4ICogYjsKLSAgICByZXR1cm47Ci0gIH0KLSAgZSArPSB4OwotICBmICs9IHk7Ci19Ci0KLXZvaWQgQ0ZYX01hdHJpeDo6U2NhbGUoRlhfRkxPQVQgc3gsIEZYX0ZMT0FUIHN5LCBib29sIGJQcmVwZW5kZWQpIHsKLSAgYSAqPSBzeDsKLSAgZCAqPSBzeTsKLSAgaWYgKGJQcmVwZW5kZWQpIHsKLSAgICBiICo9IHN4OwotICAgIGMgKj0gc3k7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYiAqPSBzeTsKLSAgYyAqPSBzeDsKLSAgZSAqPSBzeDsKLSAgZiAqPSBzeTsKLX0KLQotdm9pZCBDRlhfTWF0cml4OjpSb3RhdGUoRlhfRkxPQVQgZlJhZGlhbiwgYm9vbCBiUHJlcGVuZGVkKSB7Ci0gIEZYX0ZMT0FUIGNvc1ZhbHVlID0gRlhTWVNfY29zKGZSYWRpYW4pOwotICBGWF9GTE9BVCBzaW5WYWx1ZSA9IEZYU1lTX3NpbihmUmFkaWFuKTsKLSAgQ29uY2F0SW50ZXJuYWwoQ0ZYX01hdHJpeChjb3NWYWx1ZSwgc2luVmFsdWUsIC1zaW5WYWx1ZSwgY29zVmFsdWUsIDAsIDApLAotICAgICAgICAgICAgICAgICBiUHJlcGVuZGVkKTsKLX0KLQotdm9pZCBDRlhfTWF0cml4OjpSb3RhdGVBdChGWF9GTE9BVCBmUmFkaWFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlByZXBlbmRlZCkgewotICBUcmFuc2xhdGUoZHgsIGR5LCBiUHJlcGVuZGVkKTsKLSAgUm90YXRlKGZSYWRpYW4sIGJQcmVwZW5kZWQpOwotICBUcmFuc2xhdGUoLWR4LCAtZHksIGJQcmVwZW5kZWQpOwotfQotCi12b2lkIENGWF9NYXRyaXg6OlNoZWFyKEZYX0ZMT0FUIGZBbHBoYVJhZGlhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkJldGFSYWRpYW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlByZXBlbmRlZCkgewotICBDb25jYXRJbnRlcm5hbCgKLSAgICAgIENGWF9NYXRyaXgoMSwgRlhTWVNfdGFuKGZBbHBoYVJhZGlhbiksIEZYU1lTX3RhbihmQmV0YVJhZGlhbiksIDEsIDAsIDApLAotICAgICAgYlByZXBlbmRlZCk7Ci19Ci0KLXZvaWQgQ0ZYX01hdHJpeDo6TWF0Y2hSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRmxvYXRSZWN0JiBzcmMpIHsKLSAgRlhfRkxPQVQgZkRpZmYgPSBzcmMubGVmdCAtIHNyYy5yaWdodDsKLSAgYSA9IEZYU1lTX2ZhYnMoZkRpZmYpIDwgMC4wMDFmID8gMSA6IChkZXN0LmxlZnQgLSBkZXN0LnJpZ2h0KSAvIGZEaWZmOwotCi0gIGZEaWZmID0gc3JjLmJvdHRvbSAtIHNyYy50b3A7Ci0gIGQgPSBGWFNZU19mYWJzKGZEaWZmKSA8IDAuMDAxZiA/IDEgOiAoZGVzdC5ib3R0b20gLSBkZXN0LnRvcCkgLyBmRGlmZjsKLSAgZSA9IGRlc3QubGVmdCAtIHNyYy5sZWZ0ICogYTsKLSAgZiA9IGRlc3QuYm90dG9tIC0gc3JjLmJvdHRvbSAqIGQ7Ci0gIGIgPSAwOwotICBjID0gMDsKLX0KLQotRlhfRkxPQVQgQ0ZYX01hdHJpeDo6R2V0WFVuaXQoKSBjb25zdCB7Ci0gIGlmIChiID09IDApCi0gICAgcmV0dXJuIChhID4gMCA/IGEgOiAtYSk7Ci0gIGlmIChhID09IDApCi0gICAgcmV0dXJuIChiID4gMCA/IGIgOiAtYik7Ci0gIHJldHVybiBGWFNZU19zcXJ0KGEgKiBhICsgYiAqIGIpOwotfQotCi1GWF9GTE9BVCBDRlhfTWF0cml4OjpHZXRZVW5pdCgpIGNvbnN0IHsKLSAgaWYgKGMgPT0gMCkKLSAgICByZXR1cm4gKGQgPiAwID8gZCA6IC1kKTsKLSAgaWYgKGQgPT0gMCkKLSAgICByZXR1cm4gKGMgPiAwID8gYyA6IC1jKTsKLSAgcmV0dXJuIEZYU1lTX3NxcnQoYyAqIGMgKyBkICogZCk7Ci19Ci0KLUNGWF9GbG9hdFJlY3QgQ0ZYX01hdHJpeDo6R2V0VW5pdFJlY3QoKSBjb25zdCB7Ci0gIENGWF9GbG9hdFJlY3QgcmVjdCgwLCAwLCAxLCAxKTsKLSAgVHJhbnNmb3JtUmVjdChyZWN0KTsKLSAgcmV0dXJuIHJlY3Q7Ci19Ci0KLUZYX0ZMT0FUIENGWF9NYXRyaXg6OlRyYW5zZm9ybVhEaXN0YW5jZShGWF9GTE9BVCBkeCkgY29uc3QgewotICBGWF9GTE9BVCBmeCA9IGEgKiBkeDsKLSAgRlhfRkxPQVQgZnkgPSBiICogZHg7Ci0gIHJldHVybiBGWFNZU19zcXJ0KGZ4ICogZnggKyBmeSAqIGZ5KTsKLX0KLQotRlhfRkxPQVQgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtRGlzdGFuY2UoRlhfRkxPQVQgZHgsIEZYX0ZMT0FUIGR5KSBjb25zdCB7Ci0gIEZYX0ZMT0FUIGZ4ID0gYSAqIGR4ICsgYyAqIGR5OwotICBGWF9GTE9BVCBmeSA9IGIgKiBkeCArIGQgKiBkeTsKLSAgcmV0dXJuIEZYU1lTX3NxcnQoZnggKiBmeCArIGZ5ICogZnkpOwotfQotCi1GWF9GTE9BVCBDRlhfTWF0cml4OjpUcmFuc2Zvcm1EaXN0YW5jZShGWF9GTE9BVCBkaXN0YW5jZSkgY29uc3QgewotICByZXR1cm4gZGlzdGFuY2UgKiAoR2V0WFVuaXQoKSArIEdldFlVbml0KCkpIC8gMjsKLX0KLQotQ0ZYX1BvaW50RiBDRlhfTWF0cml4OjpUcmFuc2Zvcm0oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIGNvbnN0IHsKLSAgcmV0dXJuIENGWF9Qb2ludEYoYSAqIHBvaW50LnggKyBjICogcG9pbnQueSArIGUsCi0gICAgICAgICAgICAgICAgICAgIGIgKiBwb2ludC54ICsgZCAqIHBvaW50LnkgKyBmKTsKLX0KLQotdm9pZCBDRlhfTWF0cml4OjpUcmFuc2Zvcm1SZWN0KENGWF9SZWN0RiYgcmVjdCkgY29uc3QgewotICBGWF9GTE9BVCByaWdodCA9IHJlY3QucmlnaHQoKSwgYm90dG9tID0gcmVjdC5ib3R0b20oKTsKLSAgVHJhbnNmb3JtUmVjdChyZWN0LmxlZnQsIHJpZ2h0LCBib3R0b20sIHJlY3QudG9wKTsKLSAgcmVjdC53aWR0aCA9IHJpZ2h0IC0gcmVjdC5sZWZ0OwotICByZWN0LmhlaWdodCA9IGJvdHRvbSAtIHJlY3QudG9wOwotfQotCi12b2lkIENGWF9NYXRyaXg6OlRyYW5zZm9ybVJlY3QoRlhfRkxPQVQmIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIHJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGJvdHRvbSkgY29uc3QgewotICBDRlhfUG9pbnRGIHBvaW50c1tdID0gewotICAgICAge2xlZnQsIHRvcH0sIHtsZWZ0LCBib3R0b219LCB7cmlnaHQsIHRvcH0sIHtyaWdodCwgYm90dG9tfX07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKQotICAgIHBvaW50c1tpXSA9IFRyYW5zZm9ybShwb2ludHNbaV0pOwotCi0gIHJpZ2h0ID0gcG9pbnRzWzBdLng7Ci0gIGxlZnQgPSBwb2ludHNbMF0ueDsKLSAgdG9wID0gcG9pbnRzWzBdLnk7Ci0gIGJvdHRvbSA9IHBvaW50c1swXS55OwotICBmb3IgKGludCBpID0gMTsgaSA8IDQ7IGkrKykgewotICAgIHJpZ2h0ID0gc3RkOjptYXgocmlnaHQsIHBvaW50c1tpXS54KTsKLSAgICBsZWZ0ID0gc3RkOjptaW4obGVmdCwgcG9pbnRzW2ldLngpOwotICAgIHRvcCA9IHN0ZDo6bWF4KHRvcCwgcG9pbnRzW2ldLnkpOwotICAgIGJvdHRvbSA9IHN0ZDo6bWluKGJvdHRvbSwgcG9pbnRzW2ldLnkpOwotICB9Ci19Ci0KLXZvaWQgQ0ZYX01hdHJpeDo6Q29uY2F0SW50ZXJuYWwoY29uc3QgQ0ZYX01hdHJpeCYgb3RoZXIsIGJvb2wgcHJlcGVuZCkgewotICBDRlhfTWF0cml4IGxlZnQ7Ci0gIENGWF9NYXRyaXggcmlnaHQ7Ci0gIGlmIChwcmVwZW5kKSB7Ci0gICAgbGVmdCA9IG90aGVyOwotICAgIHJpZ2h0ID0gKnRoaXM7Ci0gIH0gZWxzZSB7Ci0gICAgbGVmdCA9ICp0aGlzOwotICAgIHJpZ2h0ID0gb3RoZXI7Ci0gIH0KLQotICBhID0gbGVmdC5hICogcmlnaHQuYSArIGxlZnQuYiAqIHJpZ2h0LmM7Ci0gIGIgPSBsZWZ0LmEgKiByaWdodC5iICsgbGVmdC5iICogcmlnaHQuZDsKLSAgYyA9IGxlZnQuYyAqIHJpZ2h0LmEgKyBsZWZ0LmQgKiByaWdodC5jOwotICBkID0gbGVmdC5jICogcmlnaHQuYiArIGxlZnQuZCAqIHJpZ2h0LmQ7Ci0gIGUgPSBsZWZ0LmUgKiByaWdodC5hICsgbGVmdC5mICogcmlnaHQuYyArIHJpZ2h0LmU7Ci0gIGYgPSBsZWZ0LmUgKiByaWdodC5iICsgbGVmdC5mICogcmlnaHQuZCArIHJpZ2h0LmY7Ci19CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Z4X2Jhc2ljX2djYy5jcHAgYi9jb3JlL2Z4Y3J0L2Z4X2Jhc2ljX2djYy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZmIyYTEuLjAwMDAwMDAKLS0tIGEvY29yZS9meGNydC9meF9iYXNpY19nY2MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjU0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgPGNjdHlwZT4KLSNpbmNsdWRlIDxjd2N0eXBlPgotI2luY2x1ZGUgPGxpbWl0cz4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEludFR5cGUsIHR5cGVuYW1lIENoYXJUeXBlPgotSW50VHlwZSBGWFNZU19TdHJUb0ludChjb25zdCBDaGFyVHlwZSogc3RyKSB7Ci0gIGlmICghc3RyKQotICAgIHJldHVybiAwOwotCi0gIC8vIFByb2Nlc3MgdGhlIHNpZ24uCi0gIGJvb2wgbmVnID0gKnN0ciA9PSAnLSc7Ci0gIGlmIChuZWcgfHwgKnN0ciA9PSAnKycpCi0gICAgc3RyKys7Ci0KLSAgSW50VHlwZSBudW0gPSAwOwotICB3aGlsZSAoKnN0ciAmJiBGWFNZU19pc0RlY2ltYWxEaWdpdCgqc3RyKSkgewotICAgIEludFR5cGUgdmFsID0gRlhTWVNfdG9EZWNpbWFsRGlnaXQoKnN0cik7Ci0gICAgaWYgKG51bSA+IChzdGQ6Om51bWVyaWNfbGltaXRzPEludFR5cGU+OjptYXgoKSAtIHZhbCkgLyAxMCkgewotICAgICAgaWYgKG5lZyAmJiBzdGQ6Om51bWVyaWNfbGltaXRzPEludFR5cGU+Ojppc19zaWduZWQpIHsKLSAgICAgICAgLy8gUmV0dXJuIE1JTiB3aGVuIHRoZSByZXByZXNlbnRlZCBudW1iZXIgaXMgc2lnbmVkIHR5cGUgYW5kIGlzIHNtYWxsZXIKLSAgICAgICAgLy8gdGhhbiB0aGUgbWluIHZhbHVlLgotICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxJbnRUeXBlPjo6bWluKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBSZXR1cm4gTUFYIHdoZW4gdGhlIHJlcHJlc2VudGVkIG51bWJlciBpcyBzaWduZWQgdHlwZSBhbmQgaXMgbGFyZ2VyCi0gICAgICAgIC8vIHRoYW4gdGhlIG1heCB2YWx1ZSwgb3IgdGhlIG51bWJlciBpcyB1bnNpZ25lZCB0eXBlIGFuZCBvdXQgb2YgcmFuZ2UuCi0gICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPEludFR5cGU+OjptYXgoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBudW0gPSBudW0gKiAxMCArIHZhbDsKLSAgICBzdHIrKzsKLSAgfQotICAvLyBXaGVuIGl0IGlzIGEgbmVnYXRpdmUgdmFsdWUsIC1udW0gc2hvdWxkIGJlIHJldHVybmVkLiBTaW5jZSBudW0gbWF5IGJlIG9mCi0gIC8vIHVuc2lnbmVkIHR5cGUsIHVzZSB+bnVtICsgMSB0byBhdm9pZCB0aGUgd2FybmluZyBvZiBhcHBseWluZyB1bmFyeSBtaW51cwotICAvLyBvcGVyYXRvciB0byB1bnNpZ25lZCB0eXBlLgotICByZXR1cm4gbmVnID8gfm51bSArIDEgOiBudW07Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVVCwgdHlwZW5hbWUgU1RSX1Q+Ci1TVFJfVCBGWFNZU19JbnRUb1N0cihUIHZhbHVlLCBTVFJfVCBzdHIsIGludCByYWRpeCkgewotICBpZiAocmFkaXggPCAyIHx8IHJhZGl4ID4gMTYpIHsKLSAgICBzdHJbMF0gPSAwOwotICAgIHJldHVybiBzdHI7Ci0gIH0KLSAgaWYgKHZhbHVlID09IDApIHsKLSAgICBzdHJbMF0gPSAnMCc7Ci0gICAgc3RyWzFdID0gMDsKLSAgICByZXR1cm4gc3RyOwotICB9Ci0gIGludCBpID0gMDsKLSAgVVQgdXZhbHVlOwotICBpZiAodmFsdWUgPCAwKSB7Ci0gICAgc3RyW2krK10gPSAnLSc7Ci0gICAgLy8gU3RhbmRhcmQgdHJpY2sgdG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ciB3aGVuIG5lZ2F0aW5nIElOVF9NSU4uCi0gICAgdXZhbHVlID0gc3RhdGljX2Nhc3Q8VVQ+KC0odmFsdWUgKyAxKSkgKyAxOwotICB9IGVsc2UgewotICAgIHV2YWx1ZSA9IHZhbHVlOwotICB9Ci0gIGludCBkaWdpdHMgPSAxOwotICBUIG9yZGVyID0gdXZhbHVlIC8gcmFkaXg7Ci0gIHdoaWxlIChvcmRlciA+IDApIHsKLSAgICBkaWdpdHMrKzsKLSAgICBvcmRlciA9IG9yZGVyIC8gcmFkaXg7Ci0gIH0KLSAgZm9yIChpbnQgZCA9IGRpZ2l0cyAtIDE7IGQgPiAtMTsgZC0tKSB7Ci0gICAgc3RyW2QgKyBpXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIlt1dmFsdWUgJSByYWRpeF07Ci0gICAgdXZhbHVlIC89IHJhZGl4OwotICB9Ci0gIHN0cltkaWdpdHMgKyBpXSA9IDA7Ci0gIHJldHVybiBzdHI7Ci19Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLWludDMyX3QgRlhTWVNfYXRvaShjb25zdCBGWF9DSEFSKiBzdHIpIHsKLSAgcmV0dXJuIEZYU1lTX1N0clRvSW50PGludDMyX3QsIEZYX0NIQVI+KHN0cik7Ci19Ci11aW50MzJfdCBGWFNZU19hdG91aShjb25zdCBGWF9DSEFSKiBzdHIpIHsKLSAgcmV0dXJuIEZYU1lTX1N0clRvSW50PHVpbnQzMl90PihzdHIpOwotfQotaW50MzJfdCBGWFNZU193dG9pKGNvbnN0IEZYX1dDSEFSKiBzdHIpIHsKLSAgcmV0dXJuIEZYU1lTX1N0clRvSW50PGludDMyX3QsIEZYX1dDSEFSPihzdHIpOwotfQotaW50NjRfdCBGWFNZU19hdG9pNjQoY29uc3QgRlhfQ0hBUiogc3RyKSB7Ci0gIHJldHVybiBGWFNZU19TdHJUb0ludDxpbnQ2NF90LCBGWF9DSEFSPihzdHIpOwotfQotaW50NjRfdCBGWFNZU193dG9pNjQoY29uc3QgRlhfV0NIQVIqIHN0cikgewotICByZXR1cm4gRlhTWVNfU3RyVG9JbnQ8aW50NjRfdCwgRlhfV0NIQVI+KHN0cik7Ci19Ci1jb25zdCBGWF9DSEFSKiBGWFNZU19pNjR0b2EoaW50NjRfdCB2YWx1ZSwgRlhfQ0hBUiogc3RyLCBpbnQgcmFkaXgpIHsKLSAgcmV0dXJuIEZYU1lTX0ludFRvU3RyPGludDY0X3QsIHVpbnQ2NF90LCBGWF9DSEFSKj4odmFsdWUsIHN0ciwgcmFkaXgpOwotfQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLSNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1pbnQgRlhTWVNfR2V0QUNQKCkgewotICByZXR1cm4gMDsKLX0KLXVpbnQzMl90IEZYU1lTX0dldEZ1bGxQYXRoTmFtZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBidWZsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ0hBUiogYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NIQVIqKiBmaWxlcGFydCkgewotICBpbnQgc3JjbGVuID0gRlhTWVNfc3RybGVuKGZpbGVuYW1lKTsKLSAgaWYgKCFidWYgfHwgKGludClidWZsZW4gPCBzcmNsZW4gKyAxKSB7Ci0gICAgcmV0dXJuIHNyY2xlbiArIDE7Ci0gIH0KLSAgRlhTWVNfc3RyY3B5KGJ1ZiwgZmlsZW5hbWUpOwotICByZXR1cm4gc3JjbGVuOwotfQotdWludDMyX3QgRlhTWVNfR2V0TW9kdWxlRmlsZU5hbWUodm9pZCogaE1vZHVsZSwgY2hhciogYnVmLCB1aW50MzJfdCBidWZzaXplKSB7Ci0gIHJldHVybiAodWludDMyX3QpLTE7Ci19Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotI2VuZGlmCi0jaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotRlhTWVNfRklMRSogRlhTWVNfd2ZvcGVuKGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSwgY29uc3QgRlhfV0NIQVIqIG1vZGUpIHsKLSAgcmV0dXJuIEZYU1lTX2ZvcGVuKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShmaWxlbmFtZSkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShtb2RlKS5jX3N0cigpKTsKLX0KLWNoYXIqIEZYU1lTX3N0cmx3cihjaGFyKiBzdHIpIHsKLSAgaWYgKCFzdHIpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBjaGFyKiBzID0gc3RyOwotICB3aGlsZSAoKnN0cikgewotICAgICpzdHIgPSBGWFNZU190b2xvd2VyKCpzdHIpOwotICAgIHN0cisrOwotICB9Ci0gIHJldHVybiBzOwotfQotY2hhciogRlhTWVNfc3RydXByKGNoYXIqIHN0cikgewotICBpZiAoIXN0cikgewotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIGNoYXIqIHMgPSBzdHI7Ci0gIHdoaWxlICgqc3RyKSB7Ci0gICAgKnN0ciA9IEZYU1lTX3RvdXBwZXIoKnN0cik7Ci0gICAgc3RyKys7Ci0gIH0KLSAgcmV0dXJuIHM7Ci19Ci1GWF9XQ0hBUiogRlhTWVNfd2NzbHdyKEZYX1dDSEFSKiBzdHIpIHsKLSAgaWYgKCFzdHIpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBGWF9XQ0hBUiogcyA9IHN0cjsKLSAgd2hpbGUgKCpzdHIpIHsKLSAgICAqc3RyID0gRlhTWVNfdG9sb3dlcigqc3RyKTsKLSAgICBzdHIrKzsKLSAgfQotICByZXR1cm4gczsKLX0KLUZYX1dDSEFSKiBGWFNZU193Y3N1cHIoRlhfV0NIQVIqIHN0cikgewotICBpZiAoIXN0cikgewotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIEZYX1dDSEFSKiBzID0gc3RyOwotICB3aGlsZSAoKnN0cikgewotICAgICpzdHIgPSBGWFNZU190b3VwcGVyKCpzdHIpOwotICAgIHN0cisrOwotICB9Ci0gIHJldHVybiBzOwotfQotaW50IEZYU1lTX3N0cmljbXAoY29uc3QgY2hhciogZHN0LCBjb25zdCBjaGFyKiBzcmMpIHsKLSAgaW50IGYsIGw7Ci0gIGRvIHsKLSAgICBpZiAoKChmID0gKHVuc2lnbmVkIGNoYXIpKCooZHN0KyspKSkgPj0gJ0EnKSAmJiAoZiA8PSAnWicpKSB7Ci0gICAgICBmIC09ICgnQScgLSAnYScpOwotICAgIH0KLSAgICBpZiAoKChsID0gKHVuc2lnbmVkIGNoYXIpKCooc3JjKyspKSkgPj0gJ0EnKSAmJiAobCA8PSAnWicpKSB7Ci0gICAgICBsIC09ICgnQScgLSAnYScpOwotICAgIH0KLSAgfSB3aGlsZSAoZiAmJiAoZiA9PSBsKSk7Ci0gIHJldHVybiAoZiAtIGwpOwotfQotaW50IEZYU1lTX3djc2ljbXAoY29uc3QgRlhfV0NIQVIqIGRzdCwgY29uc3QgRlhfV0NIQVIqIHNyYykgewotICBGWF9XQ0hBUiBmLCBsOwotICBkbyB7Ci0gICAgaWYgKCgoZiA9IChGWF9XQ0hBUikoKihkc3QrKykpKSA+PSAnQScpICYmIChmIDw9ICdaJykpIHsKLSAgICAgIGYgLT0gKCdBJyAtICdhJyk7Ci0gICAgfQotICAgIGlmICgoKGwgPSAoRlhfV0NIQVIpKCooc3JjKyspKSkgPj0gJ0EnKSAmJiAobCA8PSAnWicpKSB7Ci0gICAgICBsIC09ICgnQScgLSAnYScpOwotICAgIH0KLSAgfSB3aGlsZSAoZiAmJiAoZiA9PSBsKSk7Ci0gIHJldHVybiAoZiAtIGwpOwotfQotY2hhciogRlhTWVNfaXRvYShpbnQgdmFsdWUsIGNoYXIqIHN0ciwgaW50IHJhZGl4KSB7Ci0gIHJldHVybiBGWFNZU19JbnRUb1N0cjxpbnQzMl90LCB1aW50MzJfdCwgRlhfQ0hBUio+KHZhbHVlLCBzdHIsIHJhZGl4KTsKLX0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jZW5kaWYKLSNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi1pbnQgRlhTWVNfV2lkZUNoYXJUb011bHRpQnl0ZSh1aW50MzJfdCBjb2RlcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogd3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ0hBUiogYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1ZmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGRlZmF1bHRfc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBwVXNlRGVmYXVsdCkgewotICBpbnQgbGVuID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB3bGVuOyBpKyspIHsKLSAgICBpZiAod3N0cltpXSA8IDB4MTAwKSB7Ci0gICAgICBpZiAoYnVmICYmIGxlbiA8IGJ1ZmxlbikKLSAgICAgICAgYnVmW2xlbl0gPSBzdGF0aWNfY2FzdDxGWF9DSEFSPih3c3RyW2ldKTsKLSAgICAgIGxlbisrOwotICAgIH0KLSAgfQotICByZXR1cm4gbGVuOwotfQotaW50IEZYU1lTX011bHRpQnl0ZVRvV2lkZUNoYXIodWludDMyX3QgY29kZXBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogYnN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIqIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZsZW4pIHsKLSAgaW50IHdsZW4gPSAwOwotICBmb3IgKGludCBpID0gMDsgaSA8IGJsZW47IGkrKykgewotICAgIGlmIChidWYgJiYgd2xlbiA8IGJ1ZmxlbikgewotICAgICAgYnVmW3dsZW5dID0gYnN0cltpXTsKLSAgICB9Ci0gICAgd2xlbisrOwotICB9Ci0gIHJldHVybiB3bGVuOwotfQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF9iYXNpY19nY2NfdW5pdHRlc3QuY3BwIGIvY29yZS9meGNydC9meF9iYXNpY19nY2NfdW5pdHRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjVlZWRlLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjcnQvZnhfYmFzaWNfZ2NjX3VuaXR0ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1URVNUKGZ4Y3J0LCBGWFNZU19hdG9pKSB7Ci0gIEVYUEVDVF9FUSgwLCBGWFNZU19hdG9pKCIiKSk7Ci0gIEVYUEVDVF9FUSgwLCBGWFNZU19hdG9pKCIwIikpOwotICBFWFBFQ1RfRVEoLTEsIEZYU1lTX2F0b2koIi0xIikpOwotICBFWFBFQ1RfRVEoMjM0NSwgRlhTWVNfYXRvaSgiMjM0NSIpKTsKLSAgRVhQRUNUX0VRKC0yMTQ3NDgzNjQ3LCBGWFNZU19hdG9pKCItMjE0NzQ4MzY0NyIpKTsKLSAgLy8gSGFuZGxlIHRoZSBzaWduLgotICBFWFBFQ1RfRVEoLTIzNDUsIEZYU1lTX2F0b2koIi0yMzQ1IikpOwotICBFWFBFQ1RfRVEoMjM0NSwgRlhTWVNfYXRvaSgiKzIzNDUiKSk7Ci0gIC8vIFRoZSBtYXggdmFsdWUuCi0gIEVYUEVDVF9FUSgyMTQ3NDgzNjQ3LCBGWFNZU19hdG9pKCIyMTQ3NDgzNjQ3IikpOwotICAvLyBUaGUgbWluIHZhbHVlLiBXcml0dGVuIGluIC0xIGZvcm1hdCB0byBhdm9pZCAidW5hcnkgbWludXMgb3BlcmF0b3IgYXBwbGllZAotICAvLyB0byB1bnNpZ25lZCB0eXBlIiB3YXJuaW5nLgotICBFWFBFQ1RfRVEoLTIxNDc0ODM2NDcgLSAxLCBGWFNZU19hdG9pKCItMjE0NzQ4MzY0OCIpKTsKLSAgLy8gV2l0aCBpbnZhbGlkIGNoYXIuCi0gIEVYUEVDVF9FUSg5LCBGWFNZU19hdG9pKCI5eDkiKSk7Ci0KLSAgLy8gT3V0IG9mIHJhbmdlIHZhbHVlcy4KLSAgRVhQRUNUX0VRKDIxNDc0ODM2NDcsIEZYU1lTX2F0b2koIjIxNDc0ODM2MjM0MjM0MTIzNDgiKSk7Ci0gIEVYUEVDVF9FUSgyMTQ3NDgzNjQ3LCBGWFNZU19hdG9pKCIyMTQ3NDgzNjQ4IikpOwotICBFWFBFQ1RfRVEoLTIxNDc0ODM2NDcgLSAxLCBGWFNZU19hdG9pKCItMjE0NzQ4MzY1MCIpKTsKLX0KLQotVEVTVChmeGNydCwgRlhTWVNfYXRvaTY0KSB7Ci0gIEVYUEVDVF9FUSgwLCBGWFNZU19hdG9pNjQoIiIpKTsKLSAgRVhQRUNUX0VRKDAsIEZYU1lTX2F0b2k2NCgiMCIpKTsKLSAgRVhQRUNUX0VRKC0xLCBGWFNZU19hdG9pNjQoIi0xIikpOwotICBFWFBFQ1RfRVEoMjM0NSwgRlhTWVNfYXRvaTY0KCIyMzQ1IikpOwotICBFWFBFQ1RfRVEoLTkyMjMzNzIwMzY4NTQ3NzU4MDdMTCwgRlhTWVNfYXRvaTY0KCItOTIyMzM3MjAzNjg1NDc3NTgwNyIpKTsKLSAgLy8gSGFuZGxlIHRoZSBzaWduLgotICBFWFBFQ1RfRVEoLTIzNDUsIEZYU1lTX2F0b2k2NCgiLTIzNDUiKSk7Ci0gIEVYUEVDVF9FUSgyMzQ1LCBGWFNZU19hdG9pNjQoIisyMzQ1IikpOwotICAvLyBUaGUgbWF4IHZhbHVlLgotICBFWFBFQ1RfRVEoOTIyMzM3MjAzNjg1NDc3NTgwN0xMLCBGWFNZU19hdG9pNjQoIjkyMjMzNzIwMzY4NTQ3NzU4MDciKSk7Ci0gIC8vIFRoZSBtaW4gdmFsdWUuIFdyaXR0ZW4gaW4gLTEgZm9ybWF0IHRvIGF2b2lkIGltcGxpY2l0IHVuc2lnbmVkIHdhcm5pbmcuCi0gIEVYUEVDVF9FUSgtOTIyMzM3MjAzNjg1NDc3NTgwN0xMIC0gMUxMLCBGWFNZU19hdG9pNjQoIi05MjIzMzcyMDM2ODU0Nzc1ODA4IikpOwotICAvLyBXaXRoIGludmFsaWQgY2hhci4KLSAgRVhQRUNUX0VRKDksIEZYU1lTX2F0b2k2NCgiOXg5IikpOwotCi0gIC8vIE91dCBvZiByYW5nZSB2YWx1ZXMuCi0gIEVYUEVDVF9FUSg5MjIzMzcyMDM2ODU0Nzc1ODA3TEwsIEZYU1lTX2F0b2k2NCgiOTIyMzM3MjAzNjg1NDcxMjM0MTIzNDc1ODA3IikpOwotICBFWFBFQ1RfRVEoOTIyMzM3MjAzNjg1NDc3NTgwN0xMLCBGWFNZU19hdG9pNjQoIjkyMjMzNzIwMzY4NTQ3NzU4MDgiKSk7Ci0gIEVYUEVDVF9FUSgtOTIyMzM3MjAzNjg1NDc3NTgwN0xMIC0gMUxMLCBGWFNZU19hdG9pNjQoIi05MjIzMzcyMDM2ODU0Nzc1ODEwIikpOwotfQotCi1URVNUKGZ4Y3J0LCBGWFNZU193dG9pKSB7Ci0gIEVYUEVDVF9FUSgwLCBGWFNZU193dG9pKEwiIikpOwotICBFWFBFQ1RfRVEoMCwgRlhTWVNfd3RvaShMIjAiKSk7Ci0gIEVYUEVDVF9FUSgtMSwgRlhTWVNfd3RvaShMIi0xIikpOwotICBFWFBFQ1RfRVEoMjM0NSwgRlhTWVNfd3RvaShMIjIzNDUiKSk7Ci0gIEVYUEVDVF9FUSgtMjE0NzQ4MzY0NywgRlhTWVNfd3RvaShMIi0yMTQ3NDgzNjQ3IikpOwotICAvLyBUaGUgbWF4IHZhbHVlLgotICBFWFBFQ1RfRVEoMjE0NzQ4MzY0NywgRlhTWVNfd3RvaShMIjIxNDc0ODM2NDciKSk7Ci0gIC8vIFRoZSBtaW4gdmFsdWUuCi0gIEVYUEVDVF9FUSgtMjE0NzQ4MzY0NyAtIDEsIEZYU1lTX3d0b2koTCItMjE0NzQ4MzY0OCIpKTsKLSAgRVhQRUNUX0VRKDksIEZYU1lTX3d0b2k2NChMIjl4OSIpKTsKLQotICAvLyBPdXQgb2YgcmFuZ2UgdmFsdWVzLgotICBFWFBFQ1RfRVEoMjE0NzQ4MzY0NywgRlhTWVNfd3RvaShMIjIxNDc0ODM2MjM0MjM0MTIzNDgiKSk7Ci0gIEVYUEVDVF9FUSgyMTQ3NDgzNjQ3LCBGWFNZU193dG9pKEwiMjE0NzQ4MzY0OCIpKTsKLSAgRVhQRUNUX0VRKC0yMTQ3NDgzNjQ3IC0gMSwgRlhTWVNfd3RvaShMIi0yMTQ3NDgzNjUyIikpOwotfQotCi1URVNUKGZ4Y3J0LCBGWFNZU193dG9pNjQpIHsKLSAgRVhQRUNUX0VRKDAsIEZYU1lTX3d0b2k2NChMIiIpKTsKLSAgRVhQRUNUX0VRKDAsIEZYU1lTX3d0b2k2NChMIjAiKSk7Ci0gIEVYUEVDVF9FUSgtMSwgRlhTWVNfd3RvaTY0KEwiLTEiKSk7Ci0gIEVYUEVDVF9FUSgyMzQ1LCBGWFNZU193dG9pNjQoTCIyMzQ1IikpOwotICBFWFBFQ1RfRVEoLTkyMjMzNzIwMzY4NTQ3NzU4MDdMTCwgRlhTWVNfd3RvaTY0KEwiLTkyMjMzNzIwMzY4NTQ3NzU4MDciKSk7Ci0gIC8vIEhhbmRsZSB0aGUgc2lnbi4KLSAgRVhQRUNUX0VRKC0yMzQ1LCBGWFNZU193dG9pNjQoTCItMjM0NSIpKTsKLSAgRVhQRUNUX0VRKDIzNDUsIEZYU1lTX3d0b2k2NChMIisyMzQ1IikpOwotICAvLyBUaGUgbWF4IHZhbHVlLgotICBFWFBFQ1RfRVEoOTIyMzM3MjAzNjg1NDc3NTgwN0xMLCBGWFNZU193dG9pNjQoTCI5MjIzMzcyMDM2ODU0Nzc1ODA3IikpOwotICAvLyBUaGUgbWluIHZhbHVlLgotICBFWFBFQ1RfRVEoLTkyMjMzNzIwMzY4NTQ3NzU4MDdMTCAtIDFMTCwKLSAgICAgICAgICAgIEZYU1lTX3d0b2k2NChMIi05MjIzMzcyMDM2ODU0Nzc1ODA4IikpOwotICAvLyBXaXRoIGludmFsaWQgY2hhci4KLSAgRVhQRUNUX0VRKDksIEZYU1lTX3d0b2k2NChMIjl4OSIpKTsKLQotICAvLyBPdXQgb2YgcmFuZ2UgdmFsdWVzLgotICBFWFBFQ1RfRVEoOTIyMzM3MjAzNjg1NDc3NTgwN0xMLAotICAgICAgICAgICAgRlhTWVNfd3RvaTY0KEwiOTIyMzM3MjAzNjg1NDcxMjM0MTIzNDc1ODA3IikpOwotICBFWFBFQ1RfRVEoOTIyMzM3MjAzNjg1NDc3NTgwN0xMLCBGWFNZU193dG9pNjQoTCI5MjIzMzcyMDM2ODU0Nzc1ODA4IikpOwotICBFWFBFQ1RfRVEoLTkyMjMzNzIwMzY4NTQ3NzU4MDdMTCAtIDFMTCwKLSAgICAgICAgICAgIEZYU1lTX3d0b2k2NChMIi05MjIzMzcyMDM2ODU0Nzc1ODEwIikpOwotfQotCi1URVNUKGZ4Y3J0LCBGWFNZU19hdG91aSkgewotICBFWFBFQ1RfRVEoMHUsIEZYU1lTX2F0b3VpKCIiKSk7Ci0gIEVYUEVDVF9FUSgwdSwgRlhTWVNfYXRvdWkoIjAiKSk7Ci0gIEVYUEVDVF9FUSg0Mjk0OTY3Mjk1LCBGWFNZU19hdG91aSgiLTEiKSk7Ci0gIEVYUEVDVF9FUSgyMzQ1dSwgRlhTWVNfYXRvdWkoIjIzNDUiKSk7Ci0gIC8vIEhhbmRsZSB0aGUgc2lnbi4KLSAgRVhQRUNUX0VRKDQyOTQ5NjQ5NTEsIEZYU1lTX2F0b3VpKCItMjM0NSIpKTsKLSAgRVhQRUNUX0VRKDIzNDV1LCBGWFNZU19hdG91aSgiKzIzNDUiKSk7Ci0gIC8vIFRoZSBtYXggdmFsdWUuCi0gIEVYUEVDVF9FUSg0Mjk0OTY3Mjk1LCBGWFNZU19hdG91aSgiNDI5NDk2NzI5NSIpKTsKLSAgRVhQRUNUX0VRKDl1LCBGWFNZU19hdG91aSgiOXg5IikpOwotCi0gIC8vIE91dCBvZiByYW5nZSB2YWx1ZXMuCi0gIEVYUEVDVF9FUSg0Mjk0OTY3Mjk1LCBGWFNZU19hdG91aSgiMjE0NzQ4MzYyMzQyMzQxMjM0OCIpKTsKLSAgRVhQRUNUX0VRKDQyOTQ5NjcyOTUsIEZYU1lTX2F0b3VpKCI0Mjk0OTY3Mjk2IikpOwotICBFWFBFQ1RfRVEoNDI5NDk2NzI5NSwgRlhTWVNfYXRvdWkoIi00Mjk0OTY3MzQ1IikpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF9iYXNpY19tZW1tZ3IuY3BwIGIvY29yZS9meGNydC9meF9iYXNpY19tZW1tZ3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjdiOTk0Li4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjcnQvZnhfYmFzaWNfbWVtbWdyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gRm9yIGFib3J0KCkuCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgotCi12b2lkKiBGWE1FTV9EZWZhdWx0QWxsb2Moc2l6ZV90IGJ5dGVfc2l6ZSwgaW50IGZsYWdzKSB7Ci0gIHJldHVybiAodm9pZCopbWFsbG9jKGJ5dGVfc2l6ZSk7Ci19Ci12b2lkKiBGWE1FTV9EZWZhdWx0UmVhbGxvYyh2b2lkKiBwb2ludGVyLCBzaXplX3QgbmV3X3NpemUsIGludCBmbGFncykgewotICByZXR1cm4gcmVhbGxvYyhwb2ludGVyLCBuZXdfc2l6ZSk7Ci19Ci12b2lkIEZYTUVNX0RlZmF1bHRGcmVlKHZvaWQqIHBvaW50ZXIsIGludCBmbGFncykgewotICBmcmVlKHBvaW50ZXIpOwotfQotCi1ORVZFUl9JTkxJTkUgdm9pZCBGWF9PdXRPZk1lbW9yeVRlcm1pbmF0ZSgpIHsKLSAgLy8gVGVybWltYXRlIGNsZWFubHkgaWYgd2UgY2FuLCBlbHNlIGNyYXNoIGF0IGEgc3BlY2lmaWMgYWRkcmVzcyAoMHhiZCkuCi0gIGFib3J0KCk7Ci0jaWZuZGVmIF9XSU4zMgotICByZWludGVycHJldF9jYXN0PHZvaWQgKCopKCk+KDB4YmQpKCk7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvZnhfYmFzaWNfbWVtbWdyX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnhjcnQvZnhfYmFzaWNfbWVtbWdyX3VuaXR0ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmZmQ5OC4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Y3J0L2Z4X2Jhc2ljX21lbW1ncl91bml0dGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlIDxsaW1pdHM+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgewotCi1jb25zdCBzaXplX3Qga01heEJ5dGVBbGxvYyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCk7Ci1jb25zdCBzaXplX3Qga01heEludEFsbG9jID0ga01heEJ5dGVBbGxvYyAvIHNpemVvZihpbnQpOwotY29uc3Qgc2l6ZV90IGtPdmVyZmxvd0ludEFsbG9jID0ga01heEludEFsbG9jICsgMTAwOwotY29uc3Qgc2l6ZV90IGtXaWR0aCA9IDY0MDsKLWNvbnN0IHNpemVfdCBrT3ZlcmZsb3dJbnRBbGxvYzJEID0ga01heEludEFsbG9jIC8ga1dpZHRoICsgMTA7Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBUT0RPKHRzZXBleik6IHJlLWVuYWJsZSBPT00gdGVzdHMgaWYgd2UgY2FuIGZpbmQgYSB3YXkgdG8KLS8vIHByZXZlbnQgaXQgZnJvbSBob3NpbmcgdGhlIGJvdHMuCi1URVNUKGZ4Y3J0LCBESVNBQkxFRF9GWF9BbGxvY09PTSkgewotICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKCh2b2lkKUZYX0FsbG9jKGludCwga01heEludEFsbG9jKSwgIiIpOwotCi0gIGludCogcHRyID0gRlhfQWxsb2MoaW50LCAxKTsKLSAgRVhQRUNUX1RSVUUocHRyKTsKLSAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgodm9pZClGWF9SZWFsbG9jKGludCwgcHRyLCBrTWF4SW50QWxsb2MpLCAiIik7Ci0gIEZYX0ZyZWUocHRyKTsKLX0KLQotVEVTVChmeGNydCwgRlhfQWxsb2NPdmVyZmxvdykgewotICAvLyB8cHRyfCBuZWVkcyB0byBiZSBkZWZpbmVkIGFuZCB1c2VkIHRvIGF2b2lkIENsYW5nIG9wdGltaXplcyBhd2F5IHRoZQotICAvLyBGWF9BbGxvYygpIHN0YXRlbWVudCBvdmVyemVhbG91c2x5IGZvciBvcHRpbWl6ZWQgYnVpbGRzLgotICBpbnQqIHB0ciA9IG51bGxwdHI7Ci0gIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQocHRyID0gRlhfQWxsb2MoaW50LCBrT3ZlcmZsb3dJbnRBbGxvYyksICIiKSA8PCBwdHI7Ci0KLSAgcHRyID0gRlhfQWxsb2MoaW50LCAxKTsKLSAgRVhQRUNUX1RSVUUocHRyKTsKLSAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgodm9pZClGWF9SZWFsbG9jKGludCwgcHRyLCBrT3ZlcmZsb3dJbnRBbGxvYyksICIiKTsKLSAgRlhfRnJlZShwdHIpOwotfQotCi1URVNUKGZ4Y3J0LCBGWF9BbGxvY092ZXJmbG93MkQpIHsKLSAgLy8gfHB0cnwgbmVlZHMgdG8gYmUgZGVmaW5lZCBhbmQgdXNlZCB0byBhdm9pZCBDbGFuZyBvcHRpbWl6ZXMgYXdheSB0aGUKLSAgLy8gRlhfQWxsb2MoKSBzdGF0ZW1lbnQgb3ZlcnplYWxvdXNseSBmb3Igb3B0aW1pemVkIGJ1aWxkcy4KLSAgaW50KiBwdHIgPSBudWxscHRyOwotICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHB0ciA9IEZYX0FsbG9jMkQoaW50LCBrV2lkdGgsIGtPdmVyZmxvd0ludEFsbG9jMkQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiKQotICAgICAgPDwgcHRyOwotfQotCi1URVNUKGZ4Y3J0LCBESVNBQkxFRF9GWF9UcnlBbGxvY09PTSkgewotICBFWFBFQ1RfRkFMU0UoRlhfVHJ5QWxsb2MoaW50LCBrTWF4SW50QWxsb2MpKTsKLQotICBpbnQqIHB0ciA9IEZYX0FsbG9jKGludCwgMSk7Ci0gIEVYUEVDVF9UUlVFKHB0cik7Ci0gIEVYUEVDVF9GQUxTRShGWF9UcnlSZWFsbG9jKGludCwgcHRyLCBrTWF4SW50QWxsb2MpKTsKLSAgRlhfRnJlZShwdHIpOwotfQotCi1URVNUKGZ4Y3J0LCBGWF9UcnlBbGxvY092ZXJmbG93KSB7Ci0gIC8vIHxwdHJ8IG5lZWRzIHRvIGJlIGRlZmluZWQgYW5kIHVzZWQgdG8gYXZvaWQgQ2xhbmcgb3B0aW1pemVzIGF3YXkgdGhlCi0gIC8vIGNhbGxvYygpIHN0YXRlbWVudCBvdmVyemVhbG91c2x5IGZvciBvcHRpbWl6ZWQgYnVpbGRzLgotICBpbnQqIHB0ciA9IChpbnQqKWNhbGxvYyhzaXplb2YoaW50KSwga092ZXJmbG93SW50QWxsb2MpOwotICBFWFBFQ1RfRkFMU0UocHRyKSA8PCBwdHI7Ci0KLSAgcHRyID0gRlhfQWxsb2MoaW50LCAxKTsKLSAgRVhQRUNUX1RSVUUocHRyKTsKLSAgRVhQRUNUX0ZBTFNFKEZYX1RyeVJlYWxsb2MoaW50LCBwdHIsIGtPdmVyZmxvd0ludEFsbG9jKSk7Ci0gIEZYX0ZyZWUocHRyKTsKLX0KLQotVEVTVChmeGNydCwgRElTQUJMRURfRlhNRU1fRGVmYXVsdE9PTSkgewotICBFWFBFQ1RfRkFMU0UoRlhNRU1fRGVmYXVsdEFsbG9jKGtNYXhCeXRlQWxsb2MsIDApKTsKLQotICB2b2lkKiBwdHIgPSBGWE1FTV9EZWZhdWx0QWxsb2MoMSwgMCk7Ci0gIEVYUEVDVF9UUlVFKHB0cik7Ci0gIEVYUEVDVF9GQUxTRShGWE1FTV9EZWZhdWx0UmVhbGxvYyhwdHIsIGtNYXhCeXRlQWxsb2MsIDApKTsKLSAgRlhNRU1fRGVmYXVsdEZyZWUocHRyLCAwKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvZnhfYmFzaWNfdXRmLmNwcCBiL2NvcmUvZnhjcnQvZnhfYmFzaWNfdXRmLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBmMTRjOC4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Y3J0L2Z4X2Jhc2ljX3V0Zi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0KLXZvaWQgQ0ZYX1VURjhEZWNvZGVyOjpDbGVhcigpIHsKLSAgbV9CdWZmZXIuQ2xlYXIoKTsKLSAgbV9QZW5kaW5nQnl0ZXMgPSAwOwotfQotdm9pZCBDRlhfVVRGOERlY29kZXI6OkFwcGVuZENoYXIodWludDMyX3QgY2gpIHsKLSAgbV9CdWZmZXIuQXBwZW5kQ2hhcigoRlhfV0NIQVIpY2gpOwotfQotdm9pZCBDRlhfVVRGOERlY29kZXI6OklucHV0KHVpbnQ4X3QgYnl0ZSkgewotICBpZiAoYnl0ZSA8IDB4ODApIHsKLSAgICBtX1BlbmRpbmdCeXRlcyA9IDA7Ci0gICAgbV9CdWZmZXIuQXBwZW5kQ2hhcihieXRlKTsKLSAgfSBlbHNlIGlmIChieXRlIDwgMHhjMCkgewotICAgIGlmIChtX1BlbmRpbmdCeXRlcyA9PSAwKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIG1fUGVuZGluZ0J5dGVzLS07Ci0gICAgbV9QZW5kaW5nQ2hhciB8PSAoYnl0ZSAmIDB4M2YpIDw8IChtX1BlbmRpbmdCeXRlcyAqIDYpOwotICAgIGlmIChtX1BlbmRpbmdCeXRlcyA9PSAwKSB7Ci0gICAgICBBcHBlbmRDaGFyKG1fUGVuZGluZ0NoYXIpOwotICAgIH0KLSAgfSBlbHNlIGlmIChieXRlIDwgMHhlMCkgewotICAgIG1fUGVuZGluZ0J5dGVzID0gMTsKLSAgICBtX1BlbmRpbmdDaGFyID0gKGJ5dGUgJiAweDFmKSA8PCA2OwotICB9IGVsc2UgaWYgKGJ5dGUgPCAweGYwKSB7Ci0gICAgbV9QZW5kaW5nQnl0ZXMgPSAyOwotICAgIG1fUGVuZGluZ0NoYXIgPSAoYnl0ZSAmIDB4MGYpIDw8IDEyOwotICB9IGVsc2UgaWYgKGJ5dGUgPCAweGY4KSB7Ci0gICAgbV9QZW5kaW5nQnl0ZXMgPSAzOwotICAgIG1fUGVuZGluZ0NoYXIgPSAoYnl0ZSAmIDB4MDcpIDw8IDE4OwotICB9IGVsc2UgaWYgKGJ5dGUgPCAweGZjKSB7Ci0gICAgbV9QZW5kaW5nQnl0ZXMgPSA0OwotICAgIG1fUGVuZGluZ0NoYXIgPSAoYnl0ZSAmIDB4MDMpIDw8IDI0OwotICB9IGVsc2UgaWYgKGJ5dGUgPCAweGZlKSB7Ci0gICAgbV9QZW5kaW5nQnl0ZXMgPSA1OwotICAgIG1fUGVuZGluZ0NoYXIgPSAoYnl0ZSAmIDB4MDEpIDw8IDMwOwotICB9Ci19Ci12b2lkIENGWF9VVEY4RW5jb2Rlcjo6SW5wdXQoRlhfV0NIQVIgdW5pY29kZSkgewotICBpZiAoKHVpbnQzMl90KXVuaWNvZGUgPCAweDgwKSB7Ci0gICAgbV9CdWZmZXIuQXBwZW5kQ2hhcih1bmljb2RlKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoKHVpbnQzMl90KXVuaWNvZGUgPj0gMHg4MDAwMDAwMCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgbmJ5dGVzID0gMDsKLSAgICBpZiAoKHVpbnQzMl90KXVuaWNvZGUgPCAweDgwMCkgewotICAgICAgbmJ5dGVzID0gMjsKLSAgICB9IGVsc2UgaWYgKCh1aW50MzJfdCl1bmljb2RlIDwgMHgxMDAwMCkgewotICAgICAgbmJ5dGVzID0gMzsKLSAgICB9IGVsc2UgaWYgKCh1aW50MzJfdCl1bmljb2RlIDwgMHgyMDAwMDApIHsKLSAgICAgIG5ieXRlcyA9IDQ7Ci0gICAgfSBlbHNlIGlmICgodWludDMyX3QpdW5pY29kZSA8IDB4NDAwMDAwMCkgewotICAgICAgbmJ5dGVzID0gNTsKLSAgICB9IGVsc2UgewotICAgICAgbmJ5dGVzID0gNjsKLSAgICB9Ci0gICAgc3RhdGljIHVpbnQ4X3QgcHJlZml4W10gPSB7MHhjMCwgMHhlMCwgMHhmMCwgMHhmOCwgMHhmY307Ci0gICAgaW50IG9yZGVyID0gMSA8PCAoKG5ieXRlcyAtIDEpICogNik7Ci0gICAgaW50IGNvZGUgPSB1bmljb2RlOwotICAgIG1fQnVmZmVyLkFwcGVuZENoYXIocHJlZml4W25ieXRlcyAtIDJdIHwgKGNvZGUgLyBvcmRlcikpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmJ5dGVzIC0gMTsgaSsrKSB7Ci0gICAgICBjb2RlID0gY29kZSAlIG9yZGVyOwotICAgICAgb3JkZXIgPj49IDY7Ci0gICAgICBtX0J1ZmZlci5BcHBlbmRDaGFyKDB4ODAgfCAoY29kZSAvIG9yZGVyKSk7Ci0gICAgfQotICB9Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIEZYX1VURjhFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1N0cikgewotICBGWF9TVFJTSVpFIGxlbiA9IHdzU3RyLkdldExlbmd0aCgpOwotICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IHdzU3RyLmNfc3RyKCk7Ci0gIENGWF9VVEY4RW5jb2RlciBlbmNvZGVyOwotICB3aGlsZSAobGVuLS0gPiAwKQotICAgIGVuY29kZXIuSW5wdXQoKnBTdHIrKyk7Ci0KLSAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGVuY29kZXIuR2V0UmVzdWx0KCkpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF9iYXNpY191dGlsLmNwcCBiL2NvcmUvZnhjcnQvZnhfYmFzaWNfdXRpbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MDhlMjkuLjAwMDAwMDAKLS0tIGEvY29yZS9meGNydC9meF9iYXNpY191dGlsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9leHQuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjY3R5cGU+Ci0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotYm9vbCBGWF9hdG9udW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHJjLCB2b2lkKiBwRGF0YSkgewotICBpZiAoc3RyYy5GaW5kKCcuJykgIT0gLTEpIHsKLSAgICBGWF9GTE9BVCogcEZsb2F0ID0gc3RhdGljX2Nhc3Q8RlhfRkxPQVQqPihwRGF0YSk7Ci0gICAgKnBGbG9hdCA9IEZYX2F0b2Yoc3RyYyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gTm90ZSwgbnVtYmVycyBpbiBQREYgYXJlIHR5cGljYWxseSBvZiB0aGUgZm9ybSAxMjMsIC0xMjMsIGV0Yy4gQnV0LAotICAvLyBmb3IgdGhpbmdzIGxpa2UgdGhlIFBlcm1pc3Npb25zIG9uIHRoZSBlbmNyeXB0aW9uIGhhc2ggdGhlIG51bWJlciBpcwotICAvLyBhY3R1YWxseSBhbiB1bnNpZ25lZCB2YWx1ZS4gV2UgdXNlIGEgdWludDMyX3Qgc28gd2UgY2FuIGRlYWwgd2l0aCB0aGUKLSAgLy8gdW5zaWduZWQgYW5kIHRoZW4gY2hlY2sgZm9yIG92ZXJmbG93IGlmIHRoZSB1c2VyIGFjdHVhbGx5IHNpZ25lZCB0aGUgdmFsdWUuCi0gIC8vIFRoZSBQZXJtaXNzaW9ucyBmbGFnIGlzIGxpc3RlZCBpbiBUYWJsZSAzLjIwIFBERiAxLjcgc3BlYy4KLSAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzx1aW50MzJfdD4gaW50ZWdlciA9IDA7Ci0gIGJvb2wgYk5lZ2F0aXZlID0gZmFsc2U7Ci0gIGJvb2wgYlNpZ25lZCA9IGZhbHNlOwotICBpbnQgY2MgPSAwOwotICBpZiAoc3RyY1swXSA9PSAnKycpIHsKLSAgICBjYysrOwotICAgIGJTaWduZWQgPSB0cnVlOwotICB9IGVsc2UgaWYgKHN0cmNbMF0gPT0gJy0nKSB7Ci0gICAgYk5lZ2F0aXZlID0gdHJ1ZTsKLSAgICBiU2lnbmVkID0gdHJ1ZTsKLSAgICBjYysrOwotICB9Ci0KLSAgd2hpbGUgKGNjIDwgc3RyYy5HZXRMZW5ndGgoKSAmJiBzdGQ6OmlzZGlnaXQoc3RyY1tjY10pKSB7Ci0gICAgaW50ZWdlciA9IGludGVnZXIgKiAxMCArIEZYU1lTX3RvRGVjaW1hbERpZ2l0KHN0cmMuQ2hhckF0KGNjKSk7Ci0gICAgaWYgKCFpbnRlZ2VyLklzVmFsaWQoKSkKLSAgICAgIGJyZWFrOwotICAgIGNjKys7Ci0gIH0KLQotICAvLyBXZSBoYXZlIGEgc2lnbiwgYW5kIHRoZSB2YWx1ZSB3YXMgZ3JlYXRlciB0aGVuIGEgcmVndWxhciBpbnRlZ2VyCi0gIC8vIHdlJ3ZlIG92ZXJmbG93ZWQsIHJlc2V0IHRvIHRoZSBkZWZhdWx0IHZhbHVlLgotICBpZiAoYlNpZ25lZCkgewotICAgIGlmIChiTmVnYXRpdmUpIHsKLSAgICAgIGlmIChpbnRlZ2VyLlZhbHVlT3JEZWZhdWx0KDApID4KLSAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSkgKyAxKSB7Ci0gICAgICAgIGludGVnZXIgPSAwOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoaW50ZWdlci5WYWx1ZU9yRGVmYXVsdCgwKSA+Ci0gICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSkpIHsKLSAgICAgIGludGVnZXIgPSAwOwotICAgIH0KLSAgfQotCi0gIC8vIFN3aXRjaCBiYWNrIHRvIHRoZSBpbnQgc3BhY2Ugc28gd2UgY2FuIGZsaXAgdG8gYSBuZWdhdGl2ZSBpZiB3ZSBuZWVkLgotICB1aW50MzJfdCB1VmFsdWUgPSBpbnRlZ2VyLlZhbHVlT3JEZWZhdWx0KDApOwotICBpbnQzMl90IHZhbHVlID0gc3RhdGljX2Nhc3Q8aW50Pih1VmFsdWUpOwotICBpZiAoYk5lZ2F0aXZlKQotICAgIHZhbHVlID0gLXZhbHVlOwotCi0gIGludCogcEludCA9IHN0YXRpY19jYXN0PGludCo+KHBEYXRhKTsKLSAgKnBJbnQgPSB2YWx1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBjb25zdCBGWF9GTE9BVCBmcmFjdGlvbl9zY2FsZXNbXSA9IHsKLSAgICAwLjFmLCAgICAgICAgIDAuMDFmLCAgICAgICAgIDAuMDAxZiwgICAgICAgIDAuMDAwMWYsCi0gICAgMC4wMDAwMWYsICAgICAwLjAwMDAwMWYsICAgICAwLjAwMDAwMDFmLCAgICAwLjAwMDAwMDAxZiwKLSAgICAwLjAwMDAwMDAwMWYsIDAuMDAwMDAwMDAwMWYsIDAuMDAwMDAwMDAwMDFmfTsKLQotaW50IEZYU1lTX0ZyYWN0aW9uYWxTY2FsZUNvdW50KCkgewotICByZXR1cm4gRlhfQXJyYXlTaXplKGZyYWN0aW9uX3NjYWxlcyk7Ci19Ci0KLUZYX0ZMT0FUIEZYU1lTX0ZyYWN0aW9uYWxTY2FsZShzaXplX3Qgc2NhbGVfZmFjdG9yLCBpbnQgdmFsdWUpIHsKLSAgcmV0dXJuIGZyYWN0aW9uX3NjYWxlc1tzY2FsZV9mYWN0b3JdICogdmFsdWU7Ci19Ci0KLUZYX0ZMT0FUIEZYX2F0b2YoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHJjKSB7Ci0gIGlmIChzdHJjLklzRW1wdHkoKSkKLSAgICByZXR1cm4gMC4wOwotCi0gIGludCBjYyA9IDA7Ci0gIGJvb2wgYk5lZ2F0aXZlID0gZmFsc2U7Ci0gIGludCBsZW4gPSBzdHJjLkdldExlbmd0aCgpOwotICBpZiAoc3RyY1swXSA9PSAnKycpIHsKLSAgICBjYysrOwotICB9IGVsc2UgaWYgKHN0cmNbMF0gPT0gJy0nKSB7Ci0gICAgYk5lZ2F0aXZlID0gdHJ1ZTsKLSAgICBjYysrOwotICB9Ci0gIHdoaWxlIChjYyA8IGxlbikgewotICAgIGlmIChzdHJjW2NjXSAhPSAnKycgJiYgc3RyY1tjY10gIT0gJy0nKQotICAgICAgYnJlYWs7Ci0gICAgY2MrKzsKLSAgfQotICBGWF9GTE9BVCB2YWx1ZSA9IDA7Ci0gIHdoaWxlIChjYyA8IGxlbikgewotICAgIGlmIChzdHJjW2NjXSA9PSAnLicpCi0gICAgICBicmVhazsKLSAgICB2YWx1ZSA9IHZhbHVlICogMTAgKyBGWFNZU190b0RlY2ltYWxEaWdpdChzdHJjLkNoYXJBdChjYykpOwotICAgIGNjKys7Ci0gIH0KLSAgaW50IHNjYWxlID0gMDsKLSAgaWYgKGNjIDwgbGVuICYmIHN0cmNbY2NdID09ICcuJykgewotICAgIGNjKys7Ci0gICAgd2hpbGUgKGNjIDwgbGVuKSB7Ci0gICAgICB2YWx1ZSArPQotICAgICAgICAgIEZYU1lTX0ZyYWN0aW9uYWxTY2FsZShzY2FsZSwgRlhTWVNfdG9EZWNpbWFsRGlnaXQoc3RyYy5DaGFyQXQoY2MpKSk7Ci0gICAgICBzY2FsZSsrOwotICAgICAgaWYgKHNjYWxlID09IEZYU1lTX0ZyYWN0aW9uYWxTY2FsZUNvdW50KCkpCi0gICAgICAgIGJyZWFrOwotICAgICAgY2MrKzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGJOZWdhdGl2ZSA/IC12YWx1ZSA6IHZhbHVlOwotfQotCi0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXyAmJiBfTVNDX1ZFUiA8IDE5MDAKLXZvaWQgRlhTWVNfc25wcmludGYoY2hhciogc3RyLAotICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgX1ByaW50Zl9mb3JtYXRfc3RyaW5nXyBjb25zdCBjaGFyKiBmbXQsCi0gICAgICAgICAgICAgICAgICAgIC4uLikgewotICB2YV9saXN0IGFwOwotICB2YV9zdGFydChhcCwgZm10KTsKLSAgRlhTWVNfdnNucHJpbnRmKHN0ciwgc2l6ZSwgZm10LCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci19Ci0KLXZvaWQgRlhTWVNfdnNucHJpbnRmKGNoYXIqIHN0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIqIGZtdCwgdmFfbGlzdCBhcCkgewotICAodm9pZClfdnNucHJpbnRmKHN0ciwgc2l6ZSwgZm10LCBhcCk7Ci0gIGlmIChzaXplKQotICAgIHN0cltzaXplIC0gMV0gPSAwOwotfQotI2VuZGlmICAvLyBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfICYmIF9NU0NfVkVSIDwgMTkwMAotCi1GWF9GaWxlSGFuZGxlKiBGWF9PcGVuRm9sZGVyKGNvbnN0IEZYX0NIQVIqIHBhdGgpIHsKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRmluZEZpbGVEYXRhQT4gcERhdGEobmV3IENGaW5kRmlsZURhdGFBKTsKLSAgcERhdGEtPm1fSGFuZGxlID0gRmluZEZpcnN0RmlsZUV4QSgoQ0ZYX0J5dGVTdHJpbmcocGF0aCkgKyAiLyouKiIpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluZEV4SW5mb1N0YW5kYXJkLCAmcERhdGEtPm1fRmluZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluZEV4U2VhcmNoTmFtZU1hdGNoLCBudWxscHRyLCAwKTsKLSAgaWYgKHBEYXRhLT5tX0hhbmRsZSA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBwRGF0YS0+bV9iRW5kID0gZmFsc2U7Ci0gIHJldHVybiBwRGF0YS5yZWxlYXNlKCk7Ci0jZWxzZQotICByZXR1cm4gb3BlbmRpcihwYXRoKTsKLSNlbmRpZgotfQotCi1ib29sIEZYX0dldE5leHRGaWxlKEZYX0ZpbGVIYW5kbGUqIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcqIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICBib29sKiBiRm9sZGVyKSB7Ci0gIGlmICghaGFuZGxlKQotICAgIHJldHVybiBmYWxzZTsKLQotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgaWYgKGhhbmRsZS0+bV9iRW5kKQotICAgIHJldHVybiBmYWxzZTsKLQotICAqZmlsZW5hbWUgPSBoYW5kbGUtPm1fRmluZERhdGEuY0ZpbGVOYW1lOwotICAqYkZvbGRlciA9Ci0gICAgICAoaGFuZGxlLT5tX0ZpbmREYXRhLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpICE9IDA7Ci0gIGlmICghRmluZE5leHRGaWxlQShoYW5kbGUtPm1fSGFuZGxlLCAmaGFuZGxlLT5tX0ZpbmREYXRhKSkKLSAgICBoYW5kbGUtPm1fYkVuZCA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotI2VsaWYgZGVmaW5lZChfX25hdGl2ZV9jbGllbnRfXykKLSAgYWJvcnQoKTsKLSAgcmV0dXJuIGZhbHNlOwotI2Vsc2UKLSAgc3RydWN0IGRpcmVudCogZGUgPSByZWFkZGlyKGhhbmRsZSk7Ci0gIGlmICghZGUpCi0gICAgcmV0dXJuIGZhbHNlOwotICAqZmlsZW5hbWUgPSBkZS0+ZF9uYW1lOwotICAqYkZvbGRlciA9IGRlLT5kX3R5cGUgPT0gRFRfRElSOwotICByZXR1cm4gdHJ1ZTsKLSNlbmRpZgotfQotCi12b2lkIEZYX0Nsb3NlRm9sZGVyKEZYX0ZpbGVIYW5kbGUqIGhhbmRsZSkgewotICBpZiAoIWhhbmRsZSkKLSAgICByZXR1cm47Ci0KLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0gIEZpbmRDbG9zZShoYW5kbGUtPm1fSGFuZGxlKTsKLSAgZGVsZXRlIGhhbmRsZTsKLSNlbHNlCi0gIGNsb3NlZGlyKGhhbmRsZSk7Ci0jZW5kaWYKLX0KLQotRlhfV0NIQVIgRlhfR2V0Rm9sZGVyU2VwYXJhdG9yKCkgewotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgcmV0dXJuICdcXCc7Ci0jZWxzZQotICByZXR1cm4gJy8nOwotI2VuZGlmCi19Ci0KLUNGWF9NYXRyaXhfM2J5MyBDRlhfTWF0cml4XzNieTM6OkludmVyc2UoKSB7Ci0gIEZYX0ZMT0FUIGRldCA9Ci0gICAgICBhICogKGUgKiBpIC0gZiAqIGgpIC0gYiAqIChpICogZCAtIGYgKiBnKSArIGMgKiAoZCAqIGggLSBlICogZyk7Ci0gIGlmIChGWFNZU19mYWJzKGRldCkgPCAwLjAwMDAwMDEpCi0gICAgcmV0dXJuIENGWF9NYXRyaXhfM2J5MygpOwotCi0gIHJldHVybiBDRlhfTWF0cml4XzNieTMoCi0gICAgICAoZSAqIGkgLSBmICogaCkgLyBkZXQsIC0oYiAqIGkgLSBjICogaCkgLyBkZXQsIChiICogZiAtIGMgKiBlKSAvIGRldCwKLSAgICAgIC0oZCAqIGkgLSBmICogZykgLyBkZXQsIChhICogaSAtIGMgKiBnKSAvIGRldCwgLShhICogZiAtIGMgKiBkKSAvIGRldCwKLSAgICAgIChkICogaCAtIGUgKiBnKSAvIGRldCwgLShhICogaCAtIGIgKiBnKSAvIGRldCwgKGEgKiBlIC0gYiAqIGQpIC8gZGV0KTsKLX0KLQotQ0ZYX01hdHJpeF8zYnkzIENGWF9NYXRyaXhfM2J5Mzo6TXVsdGlwbHkoY29uc3QgQ0ZYX01hdHJpeF8zYnkzJiBtKSB7Ci0gIHJldHVybiBDRlhfTWF0cml4XzNieTMoCi0gICAgICBhICogbS5hICsgYiAqIG0uZCArIGMgKiBtLmcsIGEgKiBtLmIgKyBiICogbS5lICsgYyAqIG0uaCwKLSAgICAgIGEgKiBtLmMgKyBiICogbS5mICsgYyAqIG0uaSwgZCAqIG0uYSArIGUgKiBtLmQgKyBmICogbS5nLAotICAgICAgZCAqIG0uYiArIGUgKiBtLmUgKyBmICogbS5oLCBkICogbS5jICsgZSAqIG0uZiArIGYgKiBtLmksCi0gICAgICBnICogbS5hICsgaCAqIG0uZCArIGkgKiBtLmcsIGcgKiBtLmIgKyBoICogbS5lICsgaSAqIG0uaCwKLSAgICAgIGcgKiBtLmMgKyBoICogbS5mICsgaSAqIG0uaSk7Ci19Ci0KLUNGWF9WZWN0b3JfM2J5MSBDRlhfTWF0cml4XzNieTM6OlRyYW5zZm9ybVZlY3Rvcihjb25zdCBDRlhfVmVjdG9yXzNieTEmIHYpIHsKLSAgcmV0dXJuIENGWF9WZWN0b3JfM2J5MShhICogdi5hICsgYiAqIHYuYiArIGMgKiB2LmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZCAqIHYuYSArIGUgKiB2LmIgKyBmICogdi5jLAotICAgICAgICAgICAgICAgICAgICAgICAgIGcgKiB2LmEgKyBoICogdi5iICsgaSAqIHYuYyk7Ci19Ci0KLXVpbnQzMl90IEdldEJpdHMzMihjb25zdCB1aW50OF90KiBwRGF0YSwgaW50IGJpdHBvcywgaW50IG5iaXRzKSB7Ci0gIEFTU0VSVCgwIDwgbmJpdHMgJiYgbmJpdHMgPD0gMzIpOwotICBjb25zdCB1aW50OF90KiBkYXRhUHRyID0gJnBEYXRhW2JpdHBvcyAvIDhdOwotICBpbnQgYml0U2hpZnQ7Ci0gIGludCBiaXRNYXNrOwotICBpbnQgZHN0U2hpZnQ7Ci0gIGludCBiaXRDb3VudCA9IGJpdHBvcyAmIDB4MDc7Ci0gIGlmIChuYml0cyA8IDggJiYgbmJpdHMgKyBiaXRDb3VudCA8PSA4KSB7Ci0gICAgYml0U2hpZnQgPSA4IC0gbmJpdHMgLSBiaXRDb3VudDsKLSAgICBiaXRNYXNrID0gKDEgPDwgbmJpdHMpIC0gMTsKLSAgICBkc3RTaGlmdCA9IDA7Ci0gIH0gZWxzZSB7Ci0gICAgYml0U2hpZnQgPSAwOwotICAgIGludCBiaXRPZmZzZXQgPSA4IC0gYml0Q291bnQ7Ci0gICAgYml0TWFzayA9ICgxIDw8IHN0ZDo6bWluKGJpdE9mZnNldCwgbmJpdHMpKSAtIDE7Ci0gICAgZHN0U2hpZnQgPSBuYml0cyAtIGJpdE9mZnNldDsKLSAgfQotICB1aW50MzJfdCByZXN1bHQgPQotICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KCgqZGF0YVB0cisrID4+IGJpdFNoaWZ0ICYgYml0TWFzaykgPDwgZHN0U2hpZnQpOwotICB3aGlsZSAoZHN0U2hpZnQgPj0gOCkgewotICAgIGRzdFNoaWZ0IC09IDg7Ci0gICAgcmVzdWx0IHw9ICpkYXRhUHRyKysgPDwgZHN0U2hpZnQ7Ci0gIH0KLSAgaWYgKGRzdFNoaWZ0ID4gMCkgewotICAgIGJpdFNoaWZ0ID0gOCAtIGRzdFNoaWZ0OwotICAgIGJpdE1hc2sgPSAoMSA8PCBkc3RTaGlmdCkgLSAxOwotICAgIHJlc3VsdCB8PSAqZGF0YVB0cisrID4+IGJpdFNoaWZ0ICYgYml0TWFzazsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF9iYXNpY191dGlsX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnhjcnQvZnhfYmFzaWNfdXRpbF91bml0dGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MWM2ZGUuLjAwMDAwMDAKLS0tIGEvY29yZS9meGNydC9meF9iYXNpY191dGlsX3VuaXR0ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgPGxpbWl0cz4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2Z4X3N0cmluZ190ZXN0aGVscGVycy5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotCi1uYW1lc3BhY2UgewotCi11aW50MzJfdCBSZWZlcmVuY2VHZXRCaXRzMzIoY29uc3QgdWludDhfdCogcERhdGEsIGludCBiaXRwb3MsIGludCBuYml0cykgewotICBpbnQgcmVzdWx0ID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYml0czsgaSsrKSB7Ci0gICAgaWYgKHBEYXRhWyhiaXRwb3MgKyBpKSAvIDhdICYgKDEgPDwgKDcgLSAoYml0cG9zICsgaSkgJSA4KSkpCi0gICAgICByZXN1bHQgfD0gMSA8PCAobmJpdHMgLSBpIC0gMSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLVRFU1QoZnhnZSwgR2V0Qml0czMyKSB7Ci0gIHVuc2lnbmVkIGNoYXIgZGF0YVtdID0gezB4REUsIDB4M0YsIDB4QjEsIDB4N0MsIDB4MTIsIDB4OUEsIDB4MDQsIDB4NTZ9OwotICBmb3IgKGludCBuYml0cyA9IDE7IG5iaXRzIDw9IDMyOyArK25iaXRzKSB7Ci0gICAgZm9yIChpbnQgYml0cG9zID0gMDsgYml0cG9zIDwgKGludClzaXplb2YoZGF0YSkgKiA4IC0gbmJpdHM7ICsrYml0cG9zKSB7Ci0gICAgICBFWFBFQ1RfRVEoUmVmZXJlbmNlR2V0Qml0czMyKGRhdGEsIGJpdHBvcywgbmJpdHMpLAotICAgICAgICAgICAgICAgIEdldEJpdHMzMihkYXRhLCBiaXRwb3MsIG5iaXRzKSk7Ci0gICAgfQotICB9Ci19Ci0KLVRFU1QoZnhjcnQsIEZYX2F0b251bSkgewotICBpbnQgaTsKLSAgRVhQRUNUX1RSVUUoRlhfYXRvbnVtKCIxMCIsICZpKSk7Ci0gIEVYUEVDVF9FUSgxMCwgaSk7Ci0KLSAgRVhQRUNUX1RSVUUoRlhfYXRvbnVtKCItMTAiLCAmaSkpOwotICBFWFBFQ1RfRVEoLTEwLCBpKTsKLQotICBFWFBFQ1RfVFJVRShGWF9hdG9udW0oIisxMCIsICZpKSk7Ci0gIEVYUEVDVF9FUSgxMCwgaSk7Ci0KLSAgRVhQRUNUX1RSVUUoRlhfYXRvbnVtKCItMjE0NzQ4MzY0OCIsICZpKSk7Ci0gIEVYUEVDVF9FUShzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpLCBpKTsKLQotICBFWFBFQ1RfVFJVRShGWF9hdG9udW0oIjIxNDc0ODM2NDciLCAmaSkpOwotICBFWFBFQ1RfRVEoMjE0NzQ4MzY0NywgaSk7Ci0KLSAgLy8gVmFsdWUgb3ZlcmZsb3dzLgotICBFWFBFQ1RfVFJVRShGWF9hdG9udW0oIi0yMTQ3NDgzNjQ5IiwgJmkpKTsKLSAgRVhQRUNUX0VRKDAsIGkpOwotCi0gIC8vIFZhbHVlIG92ZXJmbG93cy4KLSAgRVhQRUNUX1RSVUUoRlhfYXRvbnVtKCIrMjE0NzQ4MzY0OCIsICZpKSk7Ci0gIEVYUEVDVF9FUSgwLCBpKTsKLQotICAvLyBWYWx1ZSBvdmVyZmxvd3MuCi0gIEVYUEVDVF9UUlVFKEZYX2F0b251bSgiNDIyMzQyMzQ5NDk2NTI1MiIsICZpKSk7Ci0gIEVYUEVDVF9FUSgwLCBpKTsKLQotICAvLyBObyBleHBsaWNpdCBzaWduIHdpbGwgYWxsb3cgdGhlIG51bWJlciB0byBnbyBuZWdhdGl2ZS4gVGhpcyBpcyBmb3IgdGhpbmdzCi0gIC8vIGxpa2UgdGhlIGVuY3J5cHRpb24gUGVybWlzc2lvbnMgZmxhZyAoVGFibGUgMy4yMCBQREYgMS43IHNwZWMpCi0gIEVYUEVDVF9UUlVFKEZYX2F0b251bSgiNDI5NDk2NTI1MiIsICZpKSk7Ci0gIEVYUEVDVF9FUSgtMjA0NCwgaSk7Ci0KLSAgRVhQRUNUX1RSVUUoRlhfYXRvbnVtKCItNDI5NDk2NTI1MiIsICZpKSk7Ci0gIEVYUEVDVF9FUSgwLCBpKTsKLQotICBFWFBFQ1RfVFJVRShGWF9hdG9udW0oIis0Mjk0OTY1MjUyIiwgJmkpKTsKLSAgRVhQRUNUX0VRKDAsIGkpOwotCi0gIGZsb2F0IGY7Ci0gIEVYUEVDVF9GQUxTRShGWF9hdG9udW0oIjMuMjQiLCAmZikpOwotICBFWFBFQ1RfRkxPQVRfRVEoMy4yNGYsIGYpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF9iYXNpY193c3RyaW5nLmNwcCBiL2NvcmUvZnhjcnQvZnhfYmFzaWNfd3N0cmluZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYjliYTcuLjAwMDAwMDAKLS0tIGEvY29yZS9meGNydC9meF9iYXNpY193c3RyaW5nLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMjIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y2N0eXBlPgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfc3RyaW5nX3Bvb2xfdGVtcGxhdGUuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9leHQuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfbWF0aC5oIgotCi10ZW1wbGF0ZSBjbGFzcyBDRlhfU3RyaW5nRGF0YVRlbXBsYXRlPEZYX1dDSEFSPjsKLXRlbXBsYXRlIGNsYXNzIENGWF9TdHJpbmdDVGVtcGxhdGU8RlhfV0NIQVI+OwotdGVtcGxhdGUgY2xhc3MgQ0ZYX1N0cmluZ1Bvb2xUZW1wbGF0ZTxDRlhfV2lkZVN0cmluZz47Ci10ZW1wbGF0ZSBzdHJ1Y3Qgc3RkOjpoYXNoPENGWF9XaWRlU3RyaW5nPjsKLQotbmFtZXNwYWNlIHsKLQotI2lmbmRlZiBOREVCVUcKLWJvb2wgSXNWYWxpZENvZGVQYWdlKHVpbnQxNl90IGNvZGVwYWdlKSB7Ci0gIHN3aXRjaCAoY29kZXBhZ2UpIHsKLSAgICBjYXNlIDA6Ci0gICAgY2FzZSA5MzI6Ci0gICAgY2FzZSA5MzY6Ci0gICAgY2FzZSA5NDk6Ci0gICAgY2FzZSA5NTA6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLSNlbmRpZgotCi1jb25zdCBGWF9XQ0hBUiogRlhfd2Nzc3RyKGNvbnN0IEZYX1dDSEFSKiBoYXlzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhheXN0YWNrX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIG5lZWRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5lZWRsZV9sZW4pIHsKLSAgaWYgKG5lZWRsZV9sZW4gPiBoYXlzdGFja19sZW4gfHwgbmVlZGxlX2xlbiA9PSAwKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgY29uc3QgRlhfV0NIQVIqIGVuZF9wdHIgPSBoYXlzdGFjayArIGhheXN0YWNrX2xlbiAtIG5lZWRsZV9sZW47Ci0gIHdoaWxlIChoYXlzdGFjayA8PSBlbmRfcHRyKSB7Ci0gICAgaW50IGkgPSAwOwotICAgIHdoaWxlICgxKSB7Ci0gICAgICBpZiAoaGF5c3RhY2tbaV0gIT0gbmVlZGxlW2ldKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaSsrOwotICAgICAgaWYgKGkgPT0gbmVlZGxlX2xlbikgewotICAgICAgICByZXR1cm4gaGF5c3RhY2s7Ci0gICAgICB9Ci0gICAgfQotICAgIGhheXN0YWNrKys7Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1zdGF0aWNfYXNzZXJ0KHNpemVvZihDRlhfV2lkZVN0cmluZykgPD0gc2l6ZW9mKEZYX1dDSEFSKiksCi0gICAgICAgICAgICAgICJTdHJpbmdzIG11c3Qgbm90IHJlcXVpcmUgbW9yZSBzcGFjZSB0aGFuIHBvaW50ZXJzIik7Ci0KLUNGWF9XaWRlU3RyaW5nOjpDRlhfV2lkZVN0cmluZygpIHt9Ci0KLUNGWF9XaWRlU3RyaW5nOjpDRlhfV2lkZVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgb3RoZXIpCi0gICAgOiBtX3BEYXRhKG90aGVyLm1fcERhdGEpIHt9Ci0KLUNGWF9XaWRlU3RyaW5nOjpDRlhfV2lkZVN0cmluZyhDRlhfV2lkZVN0cmluZyYmIG90aGVyKSB7Ci0gIG1fcERhdGEuU3dhcChvdGhlci5tX3BEYXRhKTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmc6OkNGWF9XaWRlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBGWF9TVFJTSVpFIG5MZW4pIHsKLSAgaWYgKG5MZW4gPCAwKQotICAgIG5MZW4gPSBwU3RyID8gRlhTWVNfd2NzbGVuKHBTdHIpIDogMDsKLQotICBpZiAobkxlbikKLSAgICBtX3BEYXRhLlJlc2V0KFN0cmluZ0RhdGE6OkNyZWF0ZShwU3RyLCBuTGVuKSk7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nOjpDRlhfV2lkZVN0cmluZyhGWF9XQ0hBUiBjaCkgewotICBtX3BEYXRhLlJlc2V0KFN0cmluZ0RhdGE6OkNyZWF0ZSgxKSk7Ci0gIG1fcERhdGEtPm1fU3RyaW5nWzBdID0gY2g7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nOjpDRlhfV2lkZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcHRyKQotICAgIDogQ0ZYX1dpZGVTdHJpbmcocHRyLCBwdHIgPyBGWFNZU193Y3NsZW4ocHRyKSA6IDApIHt9Ci0KLUNGWF9XaWRlU3RyaW5nOjpDRlhfV2lkZVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cmluZ1NyYykgewotICBpZiAoIXN0cmluZ1NyYy5Jc0VtcHR5KCkpIHsKLSAgICBtX3BEYXRhLlJlc2V0KFN0cmluZ0RhdGE6OkNyZWF0ZShzdHJpbmdTcmMuY19zdHIoKSwgc3RyaW5nU3JjLkdldExlbmd0aCgpKSk7Ci0gIH0KLX0KLQotQ0ZYX1dpZGVTdHJpbmc6OkNGWF9XaWRlU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cjIpIHsKLSAgaW50IG5OZXdMZW4gPSBzdHIxLkdldExlbmd0aCgpICsgc3RyMi5HZXRMZW5ndGgoKTsKLSAgaWYgKG5OZXdMZW4gPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgbV9wRGF0YS5SZXNldChTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbikpOwotICBtX3BEYXRhLT5Db3B5Q29udGVudHMoc3RyMS5jX3N0cigpLCBzdHIxLkdldExlbmd0aCgpKTsKLSAgbV9wRGF0YS0+Q29weUNvbnRlbnRzQXQoc3RyMS5HZXRMZW5ndGgoKSwgc3RyMi5jX3N0cigpLCBzdHIyLkdldExlbmd0aCgpKTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmc6On5DRlhfV2lkZVN0cmluZygpIHt9Ci0KLWNvbnN0IENGWF9XaWRlU3RyaW5nJiBDRlhfV2lkZVN0cmluZzo6b3BlcmF0b3I9KGNvbnN0IEZYX1dDSEFSKiBwU3RyKSB7Ci0gIGlmICghcFN0ciB8fCAhcFN0clswXSkKLSAgICBjbGVhcigpOwotICBlbHNlCi0gICAgQXNzaWduQ29weShwU3RyLCBGWFNZU193Y3NsZW4ocFN0cikpOwotCi0gIHJldHVybiAqdGhpczsKLX0KLQotY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIENGWF9XaWRlU3RyaW5nOjpvcGVyYXRvcj0oCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHJpbmdTcmMpIHsKLSAgaWYgKHN0cmluZ1NyYy5Jc0VtcHR5KCkpCi0gICAgY2xlYXIoKTsKLSAgZWxzZQotICAgIEFzc2lnbkNvcHkoc3RyaW5nU3JjLmNfc3RyKCksIHN0cmluZ1NyYy5HZXRMZW5ndGgoKSk7Ci0KLSAgcmV0dXJuICp0aGlzOwotfQotCi1jb25zdCBDRlhfV2lkZVN0cmluZyYgQ0ZYX1dpZGVTdHJpbmc6Om9wZXJhdG9yPSgKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nU3JjKSB7Ci0gIGlmIChtX3BEYXRhICE9IHN0cmluZ1NyYy5tX3BEYXRhKQotICAgIG1fcERhdGEgPSBzdHJpbmdTcmMubV9wRGF0YTsKLQotICByZXR1cm4gKnRoaXM7Ci19Ci0KLWNvbnN0IENGWF9XaWRlU3RyaW5nJiBDRlhfV2lkZVN0cmluZzo6b3BlcmF0b3IrPShjb25zdCBGWF9XQ0hBUiogcFN0cikgewotICBpZiAocFN0cikKLSAgICBDb25jYXQocFN0ciwgRlhTWVNfd2NzbGVuKHBTdHIpKTsKLQotICByZXR1cm4gKnRoaXM7Ci19Ci0KLWNvbnN0IENGWF9XaWRlU3RyaW5nJiBDRlhfV2lkZVN0cmluZzo6b3BlcmF0b3IrPShGWF9XQ0hBUiBjaCkgewotICBDb25jYXQoJmNoLCAxKTsKLSAgcmV0dXJuICp0aGlzOwotfQotCi1jb25zdCBDRlhfV2lkZVN0cmluZyYgQ0ZYX1dpZGVTdHJpbmc6Om9wZXJhdG9yKz0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikgewotICBpZiAoc3RyLm1fcERhdGEpCi0gICAgQ29uY2F0KHN0ci5tX3BEYXRhLT5tX1N0cmluZywgc3RyLm1fcERhdGEtPm1fbkRhdGFMZW5ndGgpOwotCi0gIHJldHVybiAqdGhpczsKLX0KLQotY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIENGWF9XaWRlU3RyaW5nOjpvcGVyYXRvcis9KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKSB7Ci0gIGlmICghc3RyLklzRW1wdHkoKSkKLSAgICBDb25jYXQoc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSk7Ci0KLSAgcmV0dXJuICp0aGlzOwotfQotCi1ib29sIENGWF9XaWRlU3RyaW5nOjpvcGVyYXRvcj09KGNvbnN0IHdjaGFyX3QqIHB0cikgY29uc3QgewotICBpZiAoIW1fcERhdGEpCi0gICAgcmV0dXJuICFwdHIgfHwgIXB0clswXTsKLQotICBpZiAoIXB0cikKLSAgICByZXR1cm4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9PSAwOwotCi0gIHJldHVybiB3Y3NsZW4ocHRyKSA9PSBzdGF0aWNfY2FzdDxzaXplX3Q+KG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpICYmCi0gICAgICAgICB3bWVtY21wKHB0ciwgbV9wRGF0YS0+bV9TdHJpbmcsIG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpID09IDA7Ci19Ci0KLWJvb2wgQ0ZYX1dpZGVTdHJpbmc6Om9wZXJhdG9yPT0oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIpIGNvbnN0IHsKLSAgaWYgKCFtX3BEYXRhKQotICAgIHJldHVybiBzdHIuSXNFbXB0eSgpOwotCi0gIHJldHVybiBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID09IHN0ci5HZXRMZW5ndGgoKSAmJgotICAgICAgICAgd21lbWNtcChtX3BEYXRhLT5tX1N0cmluZywgc3RyLmNfc3RyKCksIHN0ci5HZXRMZW5ndGgoKSkgPT0gMDsKLX0KLQotYm9vbCBDRlhfV2lkZVN0cmluZzo6b3BlcmF0b3I9PShjb25zdCBDRlhfV2lkZVN0cmluZyYgb3RoZXIpIGNvbnN0IHsKLSAgaWYgKG1fcERhdGEgPT0gb3RoZXIubV9wRGF0YSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoSXNFbXB0eSgpKQotICAgIHJldHVybiBvdGhlci5Jc0VtcHR5KCk7Ci0KLSAgaWYgKG90aGVyLklzRW1wdHkoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIG90aGVyLm1fcERhdGEtPm1fbkRhdGFMZW5ndGggPT0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAmJgotICAgICAgICAgd21lbWNtcChvdGhlci5tX3BEYXRhLT5tX1N0cmluZywgbV9wRGF0YS0+bV9TdHJpbmcsCi0gICAgICAgICAgICAgICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpID09IDA7Ci19Ci0KLWJvb2wgQ0ZYX1dpZGVTdHJpbmc6Om9wZXJhdG9yPChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKSBjb25zdCB7Ci0gIGlmIChtX3BEYXRhID09IHN0ci5tX3BEYXRhKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbnQgcmVzdWx0ID0KLSAgICAgIHdtZW1jbXAoY19zdHIoKSwgc3RyLmNfc3RyKCksIHN0ZDo6bWluKEdldExlbmd0aCgpLCBzdHIuR2V0TGVuZ3RoKCkpKTsKLSAgcmV0dXJuIHJlc3VsdCA8IDAgfHwgKHJlc3VsdCA9PSAwICYmIEdldExlbmd0aCgpIDwgc3RyLkdldExlbmd0aCgpKTsKLX0KLQotdm9pZCBDRlhfV2lkZVN0cmluZzo6QXNzaWduQ29weShjb25zdCBGWF9XQ0hBUiogcFNyY0RhdGEsIEZYX1NUUlNJWkUgblNyY0xlbikgewotICBBbGxvY0JlZm9yZVdyaXRlKG5TcmNMZW4pOwotICBtX3BEYXRhLT5Db3B5Q29udGVudHMocFNyY0RhdGEsIG5TcmNMZW4pOwotICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gblNyY0xlbjsKLX0KLQotdm9pZCBDRlhfV2lkZVN0cmluZzo6UmVhbGxvY0JlZm9yZVdyaXRlKEZYX1NUUlNJWkUgbk5ld0xlbmd0aCkgewotICBpZiAobV9wRGF0YSAmJiBtX3BEYXRhLT5DYW5PcGVyYXRlSW5QbGFjZShuTmV3TGVuZ3RoKSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKG5OZXdMZW5ndGggPD0gMCkgewotICAgIGNsZWFyKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ0ZYX1JldGFpblB0cjxTdHJpbmdEYXRhPiBwTmV3RGF0YShTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbmd0aCkpOwotICBpZiAobV9wRGF0YSkgewotICAgIEZYX1NUUlNJWkUgbkNvcHlMZW5ndGggPSBzdGQ6Om1pbihtX3BEYXRhLT5tX25EYXRhTGVuZ3RoLCBuTmV3TGVuZ3RoKTsKLSAgICBwTmV3RGF0YS0+Q29weUNvbnRlbnRzKG1fcERhdGEtPm1fU3RyaW5nLCBuQ29weUxlbmd0aCk7Ci0gICAgcE5ld0RhdGEtPm1fbkRhdGFMZW5ndGggPSBuQ29weUxlbmd0aDsKLSAgfSBlbHNlIHsKLSAgICBwTmV3RGF0YS0+bV9uRGF0YUxlbmd0aCA9IDA7Ci0gIH0KLSAgcE5ld0RhdGEtPm1fU3RyaW5nW3BOZXdEYXRhLT5tX25EYXRhTGVuZ3RoXSA9IDA7Ci0gIG1fcERhdGEuU3dhcChwTmV3RGF0YSk7Ci19Ci0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OkFsbG9jQmVmb3JlV3JpdGUoRlhfU1RSU0laRSBuTmV3TGVuZ3RoKSB7Ci0gIGlmIChtX3BEYXRhICYmIG1fcERhdGEtPkNhbk9wZXJhdGVJblBsYWNlKG5OZXdMZW5ndGgpKQotICAgIHJldHVybjsKLQotICBpZiAobk5ld0xlbmd0aCA8PSAwKSB7Ci0gICAgY2xlYXIoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBtX3BEYXRhLlJlc2V0KFN0cmluZ0RhdGE6OkNyZWF0ZShuTmV3TGVuZ3RoKSk7Ci19Ci0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OlJlbGVhc2VCdWZmZXIoRlhfU1RSU0laRSBuTmV3TGVuZ3RoKSB7Ci0gIGlmICghbV9wRGF0YSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKG5OZXdMZW5ndGggPT0gLTEpCi0gICAgbk5ld0xlbmd0aCA9IEZYU1lTX3djc2xlbihtX3BEYXRhLT5tX1N0cmluZyk7Ci0KLSAgbk5ld0xlbmd0aCA9IHN0ZDo6bWluKG5OZXdMZW5ndGgsIG1fcERhdGEtPm1fbkFsbG9jTGVuZ3RoKTsKLSAgaWYgKG5OZXdMZW5ndGggPT0gMCkgewotICAgIGNsZWFyKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQVNTRVJUKG1fcERhdGEtPm1fblJlZnMgPT0gMSk7Ci0gIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuTmV3TGVuZ3RoOwotICBtX3BEYXRhLT5tX1N0cmluZ1tuTmV3TGVuZ3RoXSA9IDA7Ci0gIGlmIChtX3BEYXRhLT5tX25BbGxvY0xlbmd0aCAtIG5OZXdMZW5ndGggPj0gMzIpIHsKLSAgICAvLyBPdmVyIGFyYml0cmFyeSB0aHJlc2hvbGQsIHNvIHBheSB0aGUgcHJpY2UgdG8gcmVsb2NhdGUuICBGb3JjZSBjb3B5IHRvCi0gICAgLy8gYWx3YXlzIG9jY3VyIGJ5IGhvbGRpbmcgYSBzZWNvbmQgcmVmZXJlbmNlIHRvIHRoZSBzdHJpbmcuCi0gICAgQ0ZYX1dpZGVTdHJpbmcgcHJlc2VydmUoKnRoaXMpOwotICAgIFJlYWxsb2NCZWZvcmVXcml0ZShuTmV3TGVuZ3RoKTsKLSAgfQotfQotCi12b2lkIENGWF9XaWRlU3RyaW5nOjpSZXNlcnZlKEZYX1NUUlNJWkUgbGVuKSB7Ci0gIEdldEJ1ZmZlcihsZW4pOwotfQotCi1GWF9XQ0hBUiogQ0ZYX1dpZGVTdHJpbmc6OkdldEJ1ZmZlcihGWF9TVFJTSVpFIG5NaW5CdWZMZW5ndGgpIHsKLSAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgaWYgKG5NaW5CdWZMZW5ndGggPT0gMCkKLSAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgbV9wRGF0YS5SZXNldChTdHJpbmdEYXRhOjpDcmVhdGUobk1pbkJ1Zkxlbmd0aCkpOwotICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSAwOwotICAgIG1fcERhdGEtPm1fU3RyaW5nWzBdID0gMDsKLSAgICByZXR1cm4gbV9wRGF0YS0+bV9TdHJpbmc7Ci0gIH0KLQotICBpZiAobV9wRGF0YS0+Q2FuT3BlcmF0ZUluUGxhY2Uobk1pbkJ1Zkxlbmd0aCkpCi0gICAgcmV0dXJuIG1fcERhdGEtPm1fU3RyaW5nOwotCi0gIG5NaW5CdWZMZW5ndGggPSBzdGQ6Om1heChuTWluQnVmTGVuZ3RoLCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKTsKLSAgaWYgKG5NaW5CdWZMZW5ndGggPT0gMCkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBDRlhfUmV0YWluUHRyPFN0cmluZ0RhdGE+IHBOZXdEYXRhKFN0cmluZ0RhdGE6OkNyZWF0ZShuTWluQnVmTGVuZ3RoKSk7Ci0gIHBOZXdEYXRhLT5Db3B5Q29udGVudHMoKm1fcERhdGEpOwotICBwTmV3RGF0YS0+bV9uRGF0YUxlbmd0aCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gIG1fcERhdGEuU3dhcChwTmV3RGF0YSk7Ci0gIHJldHVybiBtX3BEYXRhLT5tX1N0cmluZzsKLX0KLQotRlhfU1RSU0laRSBDRlhfV2lkZVN0cmluZzo6RGVsZXRlKEZYX1NUUlNJWkUgbkluZGV4LCBGWF9TVFJTSVpFIG5Db3VudCkgewotICBpZiAoIW1fcERhdGEpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKG5JbmRleCA8IDApCi0gICAgbkluZGV4ID0gMDsKLQotICBGWF9TVFJTSVpFIG5PbGRMZW5ndGggPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwotICBpZiAobkNvdW50ID4gMCAmJiBuSW5kZXggPCBuT2xkTGVuZ3RoKSB7Ci0gICAgRlhfU1RSU0laRSBtTGVuZ3RoID0gbkluZGV4ICsgbkNvdW50OwotICAgIGlmIChtTGVuZ3RoID49IG5PbGRMZW5ndGgpIHsKLSAgICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuSW5kZXg7Ci0gICAgICByZXR1cm4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKLSAgICB9Ci0gICAgUmVhbGxvY0JlZm9yZVdyaXRlKG5PbGRMZW5ndGgpOwotICAgIGludCBuQ2hhcnNUb0NvcHkgPSBuT2xkTGVuZ3RoIC0gbUxlbmd0aCArIDE7Ci0gICAgd21lbW1vdmUobV9wRGF0YS0+bV9TdHJpbmcgKyBuSW5kZXgsIG1fcERhdGEtPm1fU3RyaW5nICsgbUxlbmd0aCwKLSAgICAgICAgICAgICBuQ2hhcnNUb0NvcHkpOwotICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuT2xkTGVuZ3RoIC0gbkNvdW50OwotICB9Ci0gIHJldHVybiBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwotfQotCi12b2lkIENGWF9XaWRlU3RyaW5nOjpDb25jYXQoY29uc3QgRlhfV0NIQVIqIHBTcmNEYXRhLCBGWF9TVFJTSVpFIG5TcmNMZW4pIHsKLSAgaWYgKCFwU3JjRGF0YSB8fCBuU3JjTGVuIDw9IDApCi0gICAgcmV0dXJuOwotCi0gIGlmICghbV9wRGF0YSkgewotICAgIG1fcERhdGEuUmVzZXQoU3RyaW5nRGF0YTo6Q3JlYXRlKHBTcmNEYXRhLCBuU3JjTGVuKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKG1fcERhdGEtPkNhbk9wZXJhdGVJblBsYWNlKG1fcERhdGEtPm1fbkRhdGFMZW5ndGggKyBuU3JjTGVuKSkgewotICAgIG1fcERhdGEtPkNvcHlDb250ZW50c0F0KG1fcERhdGEtPm1fbkRhdGFMZW5ndGgsIHBTcmNEYXRhLCBuU3JjTGVuKTsKLSAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICs9IG5TcmNMZW47Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ0ZYX1JldGFpblB0cjxTdHJpbmdEYXRhPiBwTmV3RGF0YSgKLSAgICAgIFN0cmluZ0RhdGE6OkNyZWF0ZShtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICsgblNyY0xlbikpOwotICBwTmV3RGF0YS0+Q29weUNvbnRlbnRzKCptX3BEYXRhKTsKLSAgcE5ld0RhdGEtPkNvcHlDb250ZW50c0F0KG1fcERhdGEtPm1fbkRhdGFMZW5ndGgsIHBTcmNEYXRhLCBuU3JjTGVuKTsKLSAgbV9wRGF0YS5Td2FwKHBOZXdEYXRhKTsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgQ0ZYX1dpZGVTdHJpbmc6OlVURjhFbmNvZGUoKSBjb25zdCB7Ci0gIHJldHVybiBGWF9VVEY4RW5jb2RlKEFzU3RyaW5nQygpKTsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgQ0ZYX1dpZGVTdHJpbmc6OlVURjE2TEVfRW5jb2RlKCkgY29uc3QgewotICBpZiAoIW1fcERhdGEpIHsKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoIlwwXDAiLCAyKTsKLSAgfQotICBpbnQgbGVuID0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKLSAgQ0ZYX0J5dGVTdHJpbmcgcmVzdWx0OwotICBGWF9DSEFSKiBidWZmZXIgPSByZXN1bHQuR2V0QnVmZmVyKGxlbiAqIDIgKyAyKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgIGJ1ZmZlcltpICogMl0gPSBtX3BEYXRhLT5tX1N0cmluZ1tpXSAmIDB4ZmY7Ci0gICAgYnVmZmVyW2kgKiAyICsgMV0gPSBtX3BEYXRhLT5tX1N0cmluZ1tpXSA+PiA4OwotICB9Ci0gIGJ1ZmZlcltsZW4gKiAyXSA9IDA7Ci0gIGJ1ZmZlcltsZW4gKiAyICsgMV0gPSAwOwotICByZXN1bHQuUmVsZWFzZUJ1ZmZlcihsZW4gKiAyICsgMik7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENGWF9XaWRlU3RyaW5nOjpNaWQoRlhfU1RSU0laRSBuRmlyc3QpIGNvbnN0IHsKLSAgaWYgKCFtX3BEYXRhKQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotCi0gIHJldHVybiBNaWQobkZpcnN0LCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC0gbkZpcnN0KTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ0ZYX1dpZGVTdHJpbmc6Ok1pZChGWF9TVFJTSVpFIG5GaXJzdCwgRlhfU1RSU0laRSBuQ291bnQpIGNvbnN0IHsKLSAgaWYgKCFtX3BEYXRhKQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotCi0gIG5GaXJzdCA9IHN0ZDo6bWluKHN0ZDo6bWF4KG5GaXJzdCwgMCksIG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpOwotICBuQ291bnQgPSBzdGQ6Om1pbihzdGQ6Om1heChuQ291bnQsIDApLCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC0gbkZpcnN0KTsKLSAgaWYgKG5Db3VudCA9PSAwKQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotCi0gIGlmIChuRmlyc3QgPT0gMCAmJiBuQ291bnQgPT0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkKLSAgICByZXR1cm4gKnRoaXM7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgZGVzdDsKLSAgQWxsb2NDb3B5KGRlc3QsIG5Db3VudCwgbkZpcnN0KTsKLSAgcmV0dXJuIGRlc3Q7Ci19Ci0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OkFsbG9jQ29weShDRlhfV2lkZVN0cmluZyYgZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIG5Db3B5TGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1NUUlNJWkUgbkNvcHlJbmRleCkgY29uc3QgewotICBpZiAobkNvcHlMZW4gPD0gMCkKLSAgICByZXR1cm47Ci0KLSAgQ0ZYX1JldGFpblB0cjxTdHJpbmdEYXRhPiBwTmV3RGF0YSgKLSAgICAgIFN0cmluZ0RhdGE6OkNyZWF0ZShtX3BEYXRhLT5tX1N0cmluZyArIG5Db3B5SW5kZXgsIG5Db3B5TGVuKSk7Ci0gIGRlc3QubV9wRGF0YS5Td2FwKHBOZXdEYXRhKTsKLX0KLQotI2RlZmluZSBGT1JDRV9BTlNJIDB4MTAwMDAKLSNkZWZpbmUgRk9SQ0VfVU5JQ09ERSAweDIwMDAwCi0jZGVmaW5lIEZPUkNFX0lOVDY0IDB4NDAwMDAKLQotdm9pZCBDRlhfV2lkZVN0cmluZzo6Rm9ybWF0Vihjb25zdCBGWF9XQ0hBUiogcEZvcm1hdCwgdmFfbGlzdCBhcmdMaXN0KSB7Ci0gIHZhX2xpc3QgYXJnTGlzdFNhdmU7Ci0jaWYgZGVmaW5lZChfX0FSTUNDX1ZFUlNJT04pIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoIWRlZmluZWQoX01TQ19WRVIpICYmIChfRlhfQ1BVXyA9PSBfRlhfWDY0XyB8fCBfRlhfQ1BVXyA9PSBfRlhfSUE2NF8gfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9GWF9DUFVfID09IF9GWF9BUk02NF8pKSB8fCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZGVmaW5lZChfX25hdGl2ZV9jbGllbnRfXykKLSAgdmFfY29weShhcmdMaXN0U2F2ZSwgYXJnTGlzdCk7Ci0jZWxzZQotICBhcmdMaXN0U2F2ZSA9IGFyZ0xpc3Q7Ci0jZW5kaWYKLSAgaW50IG5NYXhMZW4gPSAwOwotICBmb3IgKGNvbnN0IEZYX1dDSEFSKiBwU3RyID0gcEZvcm1hdDsgKnBTdHIgIT0gMDsgcFN0cisrKSB7Ci0gICAgaWYgKCpwU3RyICE9ICclJyB8fCAqKHBTdHIgPSBwU3RyICsgMSkgPT0gJyUnKSB7Ci0gICAgICBuTWF4TGVuICs9IEZYU1lTX3djc2xlbihwU3RyKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpbnQgbkl0ZW1MZW4gPSAwOwotICAgIGludCBuV2lkdGggPSAwOwotICAgIGZvciAoOyAqcFN0ciAhPSAwOyBwU3RyKyspIHsKLSAgICAgIGlmICgqcFN0ciA9PSAnIycpIHsKLSAgICAgICAgbk1heExlbiArPSAyOwotICAgICAgfSBlbHNlIGlmICgqcFN0ciA9PSAnKicpIHsKLSAgICAgICAgbldpZHRoID0gdmFfYXJnKGFyZ0xpc3QsIGludCk7Ci0gICAgICB9IGVsc2UgaWYgKCpwU3RyICE9ICctJyAmJiAqcFN0ciAhPSAnKycgJiYgKnBTdHIgIT0gJzAnICYmICpwU3RyICE9ICcgJykgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG5XaWR0aCA9PSAwKSB7Ci0gICAgICBuV2lkdGggPSBGWFNZU193dG9pKHBTdHIpOwotICAgICAgd2hpbGUgKHN0ZDo6aXN3ZGlnaXQoKnBTdHIpKQotICAgICAgICArK3BTdHI7Ci0gICAgfQotICAgIGlmIChuV2lkdGggPCAwIHx8IG5XaWR0aCA+IDEyOCAqIDEwMjQpIHsKLSAgICAgIHBGb3JtYXQgPSBMIkJhZCB3aWR0aCI7Ci0gICAgICBuTWF4TGVuID0gMTA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaW50IG5QcmVjaXNpb24gPSAwOwotICAgIGlmICgqcFN0ciA9PSAnLicpIHsKLSAgICAgIHBTdHIrKzsKLSAgICAgIGlmICgqcFN0ciA9PSAnKicpIHsKLSAgICAgICAgblByZWNpc2lvbiA9IHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICBwU3RyKys7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBuUHJlY2lzaW9uID0gRlhTWVNfd3RvaShwU3RyKTsKLSAgICAgICAgd2hpbGUgKHN0ZDo6aXN3ZGlnaXQoKnBTdHIpKQotICAgICAgICAgICsrcFN0cjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG5QcmVjaXNpb24gPCAwIHx8IG5QcmVjaXNpb24gPiAxMjggKiAxMDI0KSB7Ci0gICAgICBwRm9ybWF0ID0gTCJCYWQgcHJlY2lzaW9uIjsKLSAgICAgIG5NYXhMZW4gPSAxNDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpbnQgbk1vZGlmaWVyID0gMDsKLSAgICBpZiAoKnBTdHIgPT0gTCdJJyAmJiAqKHBTdHIgKyAxKSA9PSBMJzYnICYmICoocFN0ciArIDIpID09IEwnNCcpIHsKLSAgICAgIHBTdHIgKz0gMzsKLSAgICAgIG5Nb2RpZmllciA9IEZPUkNFX0lOVDY0OwotICAgIH0gZWxzZSB7Ci0gICAgICBzd2l0Y2ggKCpwU3RyKSB7Ci0gICAgICAgIGNhc2UgJ2gnOgotICAgICAgICAgIG5Nb2RpZmllciA9IEZPUkNFX0FOU0k7Ci0gICAgICAgICAgcFN0cisrOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdsJzoKLSAgICAgICAgICBuTW9kaWZpZXIgPSBGT1JDRV9VTklDT0RFOwotICAgICAgICAgIHBTdHIrKzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnRic6Ci0gICAgICAgIGNhc2UgJ04nOgotICAgICAgICBjYXNlICdMJzoKLSAgICAgICAgICBwU3RyKys7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHN3aXRjaCAoKnBTdHIgfCBuTW9kaWZpZXIpIHsKLSAgICAgIGNhc2UgJ2MnOgotICAgICAgY2FzZSAnQyc6Ci0gICAgICAgIG5JdGVtTGVuID0gMjsKLSAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIGludCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnYycgfCBGT1JDRV9BTlNJOgotICAgICAgY2FzZSAnQycgfCBGT1JDRV9BTlNJOgotICAgICAgICBuSXRlbUxlbiA9IDI7Ci0gICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ2MnIHwgRk9SQ0VfVU5JQ09ERToKLSAgICAgIGNhc2UgJ0MnIHwgRk9SQ0VfVU5JQ09ERToKLSAgICAgICAgbkl0ZW1MZW4gPSAyOwotICAgICAgICB2YV9hcmcoYXJnTGlzdCwgaW50KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdzJzogewotICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN0ck5leHRBcmcgPSB2YV9hcmcoYXJnTGlzdCwgY29uc3QgRlhfV0NIQVIqKTsKLSAgICAgICAgaWYgKHBzdHJOZXh0QXJnKSB7Ci0gICAgICAgICAgbkl0ZW1MZW4gPSBGWFNZU193Y3NsZW4ocHN0ck5leHRBcmcpOwotICAgICAgICAgIGlmIChuSXRlbUxlbiA8IDEpIHsKLSAgICAgICAgICAgIG5JdGVtTGVuID0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbkl0ZW1MZW4gPSA2OwotICAgICAgICB9Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSAnUyc6IHsKLSAgICAgICAgY29uc3QgRlhfQ0hBUiogcHN0ck5leHRBcmcgPSB2YV9hcmcoYXJnTGlzdCwgY29uc3QgRlhfQ0hBUiopOwotICAgICAgICBpZiAocHN0ck5leHRBcmcpIHsKLSAgICAgICAgICBuSXRlbUxlbiA9IEZYU1lTX3N0cmxlbihwc3RyTmV4dEFyZyk7Ci0gICAgICAgICAgaWYgKG5JdGVtTGVuIDwgMSkgewotICAgICAgICAgICAgbkl0ZW1MZW4gPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBuSXRlbUxlbiA9IDY7Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlICdzJyB8IEZPUkNFX0FOU0k6Ci0gICAgICBjYXNlICdTJyB8IEZPUkNFX0FOU0k6IHsKLSAgICAgICAgY29uc3QgRlhfQ0hBUiogcHN0ck5leHRBcmcgPSB2YV9hcmcoYXJnTGlzdCwgY29uc3QgRlhfQ0hBUiopOwotICAgICAgICBpZiAocHN0ck5leHRBcmcpIHsKLSAgICAgICAgICBuSXRlbUxlbiA9IEZYU1lTX3N0cmxlbihwc3RyTmV4dEFyZyk7Ci0gICAgICAgICAgaWYgKG5JdGVtTGVuIDwgMSkgewotICAgICAgICAgICAgbkl0ZW1MZW4gPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBuSXRlbUxlbiA9IDY7Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlICdzJyB8IEZPUkNFX1VOSUNPREU6Ci0gICAgICBjYXNlICdTJyB8IEZPUkNFX1VOSUNPREU6IHsKLSAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzdHJOZXh0QXJnID0gdmFfYXJnKGFyZ0xpc3QsIEZYX1dDSEFSKik7Ci0gICAgICAgIGlmIChwc3RyTmV4dEFyZykgewotICAgICAgICAgIG5JdGVtTGVuID0gRlhTWVNfd2NzbGVuKHBzdHJOZXh0QXJnKTsKLSAgICAgICAgICBpZiAobkl0ZW1MZW4gPCAxKSB7Ci0gICAgICAgICAgICBuSXRlbUxlbiA9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG5JdGVtTGVuID0gNjsKLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICB9Ci0gICAgaWYgKG5JdGVtTGVuICE9IDApIHsKLSAgICAgIGlmIChuUHJlY2lzaW9uICE9IDAgJiYgbkl0ZW1MZW4gPiBuUHJlY2lzaW9uKSB7Ci0gICAgICAgIG5JdGVtTGVuID0gblByZWNpc2lvbjsKLSAgICAgIH0KLSAgICAgIGlmIChuSXRlbUxlbiA8IG5XaWR0aCkgewotICAgICAgICBuSXRlbUxlbiA9IG5XaWR0aDsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgc3dpdGNoICgqcFN0cikgewotICAgICAgICBjYXNlICdkJzoKLSAgICAgICAgY2FzZSAnaSc6Ci0gICAgICAgIGNhc2UgJ3UnOgotICAgICAgICBjYXNlICd4JzoKLSAgICAgICAgY2FzZSAnWCc6Ci0gICAgICAgIGNhc2UgJ28nOgotICAgICAgICAgIGlmIChuTW9kaWZpZXIgJiBGT1JDRV9JTlQ2NCkgewotICAgICAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIGludDY0X3QpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2YV9hcmcoYXJnTGlzdCwgaW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbkl0ZW1MZW4gPSAzMjsKLSAgICAgICAgICBpZiAobkl0ZW1MZW4gPCBuV2lkdGggKyBuUHJlY2lzaW9uKSB7Ci0gICAgICAgICAgICBuSXRlbUxlbiA9IG5XaWR0aCArIG5QcmVjaXNpb247Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdhJzoKLSAgICAgICAgY2FzZSAnQSc6Ci0gICAgICAgIGNhc2UgJ2UnOgotICAgICAgICBjYXNlICdFJzoKLSAgICAgICAgY2FzZSAnZyc6Ci0gICAgICAgIGNhc2UgJ0cnOgotICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBkb3VibGUpOwotICAgICAgICAgIG5JdGVtTGVuID0gMTI4OwotICAgICAgICAgIGlmIChuSXRlbUxlbiA8IG5XaWR0aCArIG5QcmVjaXNpb24pIHsKLSAgICAgICAgICAgIG5JdGVtTGVuID0gbldpZHRoICsgblByZWNpc2lvbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2YnOgotICAgICAgICAgIGlmIChuV2lkdGggKyBuUHJlY2lzaW9uID4gMTAwKSB7Ci0gICAgICAgICAgICBuSXRlbUxlbiA9IG5QcmVjaXNpb24gKyBuV2lkdGggKyAxMjg7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRvdWJsZSBmOwotICAgICAgICAgICAgY2hhciBwc3pUZW1wWzI1Nl07Ci0gICAgICAgICAgICBmID0gdmFfYXJnKGFyZ0xpc3QsIGRvdWJsZSk7Ci0gICAgICAgICAgICBGWFNZU19zbnByaW50Zihwc3pUZW1wLCBzaXplb2YocHN6VGVtcCksICIlKi4qZiIsIG5XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QcmVjaXNpb24gKyA2LCBmKTsKLSAgICAgICAgICAgIG5JdGVtTGVuID0gRlhTWVNfc3RybGVuKHBzelRlbXApOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAncCc6Ci0gICAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIHZvaWQqKTsKLSAgICAgICAgICBuSXRlbUxlbiA9IDMyOwotICAgICAgICAgIGlmIChuSXRlbUxlbiA8IG5XaWR0aCArIG5QcmVjaXNpb24pIHsKLSAgICAgICAgICAgIG5JdGVtTGVuID0gbldpZHRoICsgblByZWNpc2lvbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ24nOgotICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQqKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgbk1heExlbiArPSBuSXRlbUxlbjsKLSAgfQotICBHZXRCdWZmZXIobk1heExlbik7Ci0gIGlmIChtX3BEYXRhKSB7Ci0gICAgRlhTWVNfdnN3cHJpbnRmKCh3Y2hhcl90KiltX3BEYXRhLT5tX1N0cmluZywgbk1heExlbiArIDEsCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCB3Y2hhcl90KilwRm9ybWF0LCBhcmdMaXN0U2F2ZSk7Ci0gICAgUmVsZWFzZUJ1ZmZlcigpOwotICB9Ci0gIHZhX2VuZChhcmdMaXN0U2F2ZSk7Ci19Ci0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OkZvcm1hdChjb25zdCBGWF9XQ0hBUiogcEZvcm1hdCwgLi4uKSB7Ci0gIHZhX2xpc3QgYXJnTGlzdDsKLSAgdmFfc3RhcnQoYXJnTGlzdCwgcEZvcm1hdCk7Ci0gIEZvcm1hdFYocEZvcm1hdCwgYXJnTGlzdCk7Ci0gIHZhX2VuZChhcmdMaXN0KTsKLX0KLQotRlhfU1RSU0laRSBDRlhfV2lkZVN0cmluZzo6SW5zZXJ0KEZYX1NUUlNJWkUgbkluZGV4LCBGWF9XQ0hBUiBjaCkgewotICBGWF9TVFJTSVpFIG5OZXdMZW5ndGggPSBtX3BEYXRhID8gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA6IDA7Ci0gIG5JbmRleCA9IHN0ZDo6bWF4KG5JbmRleCwgMCk7Ci0gIG5JbmRleCA9IHN0ZDo6bWluKG5JbmRleCwgbk5ld0xlbmd0aCk7Ci0gIG5OZXdMZW5ndGgrKzsKLQotICBSZWFsbG9jQmVmb3JlV3JpdGUobk5ld0xlbmd0aCk7Ci0gIHdtZW1tb3ZlKG1fcERhdGEtPm1fU3RyaW5nICsgbkluZGV4ICsgMSwgbV9wRGF0YS0+bV9TdHJpbmcgKyBuSW5kZXgsCi0gICAgICAgICAgIG5OZXdMZW5ndGggLSBuSW5kZXgpOwotICBtX3BEYXRhLT5tX1N0cmluZ1tuSW5kZXhdID0gY2g7Ci0gIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuTmV3TGVuZ3RoOwotICByZXR1cm4gbk5ld0xlbmd0aDsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ0ZYX1dpZGVTdHJpbmc6OlJpZ2h0KEZYX1NUUlNJWkUgbkNvdW50KSBjb25zdCB7Ci0gIGlmICghbV9wRGF0YSkKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLQotICBuQ291bnQgPSBzdGQ6Om1heChuQ291bnQsIDApOwotICBpZiAobkNvdW50ID49IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpCi0gICAgcmV0dXJuICp0aGlzOwotCi0gIENGWF9XaWRlU3RyaW5nIGRlc3Q7Ci0gIEFsbG9jQ29weShkZXN0LCBuQ291bnQsIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggLSBuQ291bnQpOwotICByZXR1cm4gZGVzdDsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ0ZYX1dpZGVTdHJpbmc6OkxlZnQoRlhfU1RSU0laRSBuQ291bnQpIGNvbnN0IHsKLSAgaWYgKCFtX3BEYXRhKQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotCi0gIG5Db3VudCA9IHN0ZDo6bWF4KG5Db3VudCwgMCk7Ci0gIGlmIChuQ291bnQgPj0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCkKLSAgICByZXR1cm4gKnRoaXM7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgZGVzdDsKLSAgQWxsb2NDb3B5KGRlc3QsIG5Db3VudCwgMCk7Ci0gIHJldHVybiBkZXN0OwotfQotCi1GWF9TVFJTSVpFIENGWF9XaWRlU3RyaW5nOjpGaW5kKEZYX1dDSEFSIGNoLCBGWF9TVFJTSVpFIG5TdGFydCkgY29uc3QgewotICBpZiAoIW1fcERhdGEpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChuU3RhcnQgPCAwIHx8IG5TdGFydCA+PSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKQotICAgIHJldHVybiAtMTsKLQotICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9Ci0gICAgICB3bWVtY2hyKG1fcERhdGEtPm1fU3RyaW5nICsgblN0YXJ0LCBjaCwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAtIG5TdGFydCk7Ci0gIHJldHVybiBwU3RyID8gcFN0ciAtIG1fcERhdGEtPm1fU3RyaW5nIDogLTE7Ci19Ci0KLUZYX1NUUlNJWkUgQ0ZYX1dpZGVTdHJpbmc6OkZpbmQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwU3ViLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIG5TdGFydCkgY29uc3QgewotICBpZiAoIW1fcERhdGEpCi0gICAgcmV0dXJuIC0xOwotCi0gIEZYX1NUUlNJWkUgbkxlbmd0aCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gIGlmIChuU3RhcnQgPiBuTGVuZ3RoKQotICAgIHJldHVybiAtMTsKLQotICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9Ci0gICAgICBGWF93Y3NzdHIobV9wRGF0YS0+bV9TdHJpbmcgKyBuU3RhcnQsIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggLSBuU3RhcnQsCi0gICAgICAgICAgICAgICAgcFN1Yi5jX3N0cigpLCBwU3ViLkdldExlbmd0aCgpKTsKLSAgcmV0dXJuIHBTdHIgPyAoaW50KShwU3RyIC0gbV9wRGF0YS0+bV9TdHJpbmcpIDogLTE7Ci19Ci0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6Ok1ha2VMb3dlcigpIHsKLSAgaWYgKCFtX3BEYXRhKQotICAgIHJldHVybjsKLQotICBSZWFsbG9jQmVmb3JlV3JpdGUobV9wRGF0YS0+bV9uRGF0YUxlbmd0aCk7Ci0gIEZYU1lTX3djc2x3cihtX3BEYXRhLT5tX1N0cmluZyk7Ci19Ci0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6Ok1ha2VVcHBlcigpIHsKLSAgaWYgKCFtX3BEYXRhKQotICAgIHJldHVybjsKLQotICBSZWFsbG9jQmVmb3JlV3JpdGUobV9wRGF0YS0+bV9uRGF0YUxlbmd0aCk7Ci0gIEZYU1lTX3djc3VwcihtX3BEYXRhLT5tX1N0cmluZyk7Ci19Ci0KLUZYX1NUUlNJWkUgQ0ZYX1dpZGVTdHJpbmc6OlJlbW92ZShGWF9XQ0hBUiBjaFJlbW92ZSkgewotICBpZiAoIW1fcERhdGEgfHwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA8IDEpCi0gICAgcmV0dXJuIDA7Ci0KLSAgRlhfV0NIQVIqIHBzdHJTb3VyY2UgPSBtX3BEYXRhLT5tX1N0cmluZzsKLSAgRlhfV0NIQVIqIHBzdHJFbmQgPSBtX3BEYXRhLT5tX1N0cmluZyArIG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gIHdoaWxlIChwc3RyU291cmNlIDwgcHN0ckVuZCkgewotICAgIGlmICgqcHN0clNvdXJjZSA9PSBjaFJlbW92ZSkKLSAgICAgIGJyZWFrOwotICAgIHBzdHJTb3VyY2UrKzsKLSAgfQotICBpZiAocHN0clNvdXJjZSA9PSBwc3RyRW5kKQotICAgIHJldHVybiAwOwotCi0gIHB0cmRpZmZfdCBjb3BpZWQgPSBwc3RyU291cmNlIC0gbV9wRGF0YS0+bV9TdHJpbmc7Ci0gIFJlYWxsb2NCZWZvcmVXcml0ZShtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKTsKLSAgcHN0clNvdXJjZSA9IG1fcERhdGEtPm1fU3RyaW5nICsgY29waWVkOwotICBwc3RyRW5kID0gbV9wRGF0YS0+bV9TdHJpbmcgKyBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwotCi0gIEZYX1dDSEFSKiBwc3RyRGVzdCA9IHBzdHJTb3VyY2U7Ci0gIHdoaWxlIChwc3RyU291cmNlIDwgcHN0ckVuZCkgewotICAgIGlmICgqcHN0clNvdXJjZSAhPSBjaFJlbW92ZSkgewotICAgICAgKnBzdHJEZXN0ID0gKnBzdHJTb3VyY2U7Ci0gICAgICBwc3RyRGVzdCsrOwotICAgIH0KLSAgICBwc3RyU291cmNlKys7Ci0gIH0KLQotICAqcHN0ckRlc3QgPSAwOwotICBGWF9TVFJTSVpFIG5Db3VudCA9IChGWF9TVFJTSVpFKShwc3RyU291cmNlIC0gcHN0ckRlc3QpOwotICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC09IG5Db3VudDsKLSAgcmV0dXJuIG5Db3VudDsKLX0KLQotRlhfU1RSU0laRSBDRlhfV2lkZVN0cmluZzo6UmVwbGFjZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHBPbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcE5ldykgewotICBpZiAoIW1fcERhdGEgfHwgcE9sZC5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgRlhfU1RSU0laRSBuU291cmNlTGVuID0gcE9sZC5HZXRMZW5ndGgoKTsKLSAgRlhfU1RSU0laRSBuUmVwbGFjZW1lbnRMZW4gPSBwTmV3LkdldExlbmd0aCgpOwotICBGWF9TVFJTSVpFIG5Db3VudCA9IDA7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwU3RhcnQgPSBtX3BEYXRhLT5tX1N0cmluZzsKLSAgRlhfV0NIQVIqIHBFbmQgPSBtX3BEYXRhLT5tX1N0cmluZyArIG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gIHdoaWxlICgxKSB7Ci0gICAgY29uc3QgRlhfV0NIQVIqIHBUYXJnZXQgPSBGWF93Y3NzdHIocFN0YXJ0LCAoRlhfU1RSU0laRSkocEVuZCAtIHBTdGFydCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE9sZC5jX3N0cigpLCBuU291cmNlTGVuKTsKLSAgICBpZiAoIXBUYXJnZXQpCi0gICAgICBicmVhazsKLQotICAgIG5Db3VudCsrOwotICAgIHBTdGFydCA9IHBUYXJnZXQgKyBuU291cmNlTGVuOwotICB9Ci0gIGlmIChuQ291bnQgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBGWF9TVFJTSVpFIG5OZXdMZW5ndGggPQotICAgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCArIChuUmVwbGFjZW1lbnRMZW4gLSBuU291cmNlTGVuKSAqIG5Db3VudDsKLQotICBpZiAobk5ld0xlbmd0aCA9PSAwKSB7Ci0gICAgY2xlYXIoKTsKLSAgICByZXR1cm4gbkNvdW50OwotICB9Ci0KLSAgQ0ZYX1JldGFpblB0cjxTdHJpbmdEYXRhPiBwTmV3RGF0YShTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbmd0aCkpOwotICBwU3RhcnQgPSBtX3BEYXRhLT5tX1N0cmluZzsKLSAgRlhfV0NIQVIqIHBEZXN0ID0gcE5ld0RhdGEtPm1fU3RyaW5nOwotICBmb3IgKEZYX1NUUlNJWkUgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgewotICAgIGNvbnN0IEZYX1dDSEFSKiBwVGFyZ2V0ID0gRlhfd2Nzc3RyKHBTdGFydCwgKEZYX1NUUlNJWkUpKHBFbmQgLSBwU3RhcnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPbGQuY19zdHIoKSwgblNvdXJjZUxlbik7Ci0gICAgd21lbWNweShwRGVzdCwgcFN0YXJ0LCBwVGFyZ2V0IC0gcFN0YXJ0KTsKLSAgICBwRGVzdCArPSBwVGFyZ2V0IC0gcFN0YXJ0OwotICAgIHdtZW1jcHkocERlc3QsIHBOZXcuY19zdHIoKSwgcE5ldy5HZXRMZW5ndGgoKSk7Ci0gICAgcERlc3QgKz0gcE5ldy5HZXRMZW5ndGgoKTsKLSAgICBwU3RhcnQgPSBwVGFyZ2V0ICsgblNvdXJjZUxlbjsKLSAgfQotICB3bWVtY3B5KHBEZXN0LCBwU3RhcnQsIHBFbmQgLSBwU3RhcnQpOwotICBtX3BEYXRhLlN3YXAocE5ld0RhdGEpOwotICByZXR1cm4gbkNvdW50OwotfQotCi12b2lkIENGWF9XaWRlU3RyaW5nOjpTZXRBdChGWF9TVFJTSVpFIG5JbmRleCwgRlhfV0NIQVIgY2gpIHsKLSAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIEFTU0VSVChuSW5kZXggPj0gMCk7Ci0gIEFTU0VSVChuSW5kZXggPCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKTsKLSAgUmVhbGxvY0JlZm9yZVdyaXRlKG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpOwotICBtX3BEYXRhLT5tX1N0cmluZ1tuSW5kZXhdID0gY2g7Ci19Ci0KLS8vIHN0YXRpYwotQ0ZYX1dpZGVTdHJpbmcgQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgewotICByZXR1cm4gRnJvbUNvZGVQYWdlKHN0ciwgMCk7Ci19Ci0KLS8vIHN0YXRpYwotQ0ZYX1dpZGVTdHJpbmcgQ0ZYX1dpZGVTdHJpbmc6OkZyb21Db2RlUGFnZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29kZXBhZ2UpIHsKLSAgcmV0dXJuIENGWF9DaGFyTWFwOjpHZXRXaWRlU3RyaW5nKGNvZGVwYWdlLCBzdHIpOwotfQotCi0vLyBzdGF0aWMKLUNGWF9XaWRlU3RyaW5nIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgewotICBpZiAoc3RyLklzRW1wdHkoKSkKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLQotICBDRlhfVVRGOERlY29kZXIgZGVjb2RlcjsKLSAgZm9yIChGWF9TVFJTSVpFIGkgPSAwOyBpIDwgc3RyLkdldExlbmd0aCgpOyBpKyspCi0gICAgZGVjb2Rlci5JbnB1dChzdHJbaV0pOwotCi0gIHJldHVybiBDRlhfV2lkZVN0cmluZyhkZWNvZGVyLkdldFJlc3VsdCgpKTsKLX0KLQotLy8gc3RhdGljCi1DRlhfV2lkZVN0cmluZyBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoY29uc3QgdW5zaWduZWQgc2hvcnQqIHdzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSB3bGVuKSB7Ci0gIGlmICghd3N0ciB8fCAwID09IHdsZW4pIHsKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgfQotCi0gIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKLSAgRlhfV0NIQVIqIGJ1ZiA9IHJlc3VsdC5HZXRCdWZmZXIod2xlbik7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgd2xlbjsgaSsrKSB7Ci0gICAgYnVmW2ldID0gd3N0cltpXTsKLSAgfQotICByZXN1bHQuUmVsZWFzZUJ1ZmZlcih3bGVuKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IENGWF9XaWRlU3RyaW5nOjpDb21wYXJlKGNvbnN0IEZYX1dDSEFSKiBscHN6KSBjb25zdCB7Ci0gIGlmIChtX3BEYXRhKQotICAgIHJldHVybiBGWFNZU193Y3NjbXAobV9wRGF0YS0+bV9TdHJpbmcsIGxwc3opOwotICByZXR1cm4gKCFscHN6IHx8IGxwc3pbMF0gPT0gMCkgPyAwIDogLTE7Ci19Ci0KLWludCBDRlhfV2lkZVN0cmluZzo6Q29tcGFyZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKSBjb25zdCB7Ci0gIGlmICghbV9wRGF0YSkgewotICAgIGlmICghc3RyLm1fcERhdGEpIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKCFzdHIubV9wRGF0YSkgewotICAgIHJldHVybiAxOwotICB9Ci0gIGludCB0aGlzX2xlbiA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7Ci0gIGludCB0aGF0X2xlbiA9IHN0ci5tX3BEYXRhLT5tX25EYXRhTGVuZ3RoOwotICBpbnQgbWluX2xlbiA9IHRoaXNfbGVuIDwgdGhhdF9sZW4gPyB0aGlzX2xlbiA6IHRoYXRfbGVuOwotICBmb3IgKGludCBpID0gMDsgaSA8IG1pbl9sZW47IGkrKykgewotICAgIGlmIChtX3BEYXRhLT5tX1N0cmluZ1tpXSA8IHN0ci5tX3BEYXRhLT5tX1N0cmluZ1tpXSkgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAobV9wRGF0YS0+bV9TdHJpbmdbaV0gPiBzdHIubV9wRGF0YS0+bV9TdHJpbmdbaV0pIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotICBpZiAodGhpc19sZW4gPCB0aGF0X2xlbikgewotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAodGhpc19sZW4gPiB0aGF0X2xlbikgewotICAgIHJldHVybiAxOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1pbnQgQ0ZYX1dpZGVTdHJpbmc6OkNvbXBhcmVOb0Nhc2UoY29uc3QgRlhfV0NIQVIqIGxwc3opIGNvbnN0IHsKLSAgaWYgKCFtX3BEYXRhKSB7Ci0gICAgcmV0dXJuICghbHBzeiB8fCBscHN6WzBdID09IDApID8gMCA6IC0xOwotICB9Ci0gIHJldHVybiBGWFNZU193Y3NpY21wKG1fcERhdGEtPm1fU3RyaW5nLCBscHN6KTsKLX0KLQotRlhfU1RSU0laRSBDRlhfV2lkZVN0cmluZzo6V1N0cmluZ0xlbmd0aChjb25zdCB1bnNpZ25lZCBzaG9ydCogc3RyKSB7Ci0gIEZYX1NUUlNJWkUgbGVuID0gMDsKLSAgaWYgKHN0cikKLSAgICB3aGlsZSAoc3RyW2xlbl0pCi0gICAgICBsZW4rKzsKLSAgcmV0dXJuIGxlbjsKLX0KLQotdm9pZCBDRlhfV2lkZVN0cmluZzo6VHJpbVJpZ2h0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcFRhcmdldHMpIHsKLSAgaWYgKElzRW1wdHkoKSB8fCBwVGFyZ2V0cy5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuOwotCi0gIEZYX1NUUlNJWkUgcG9zID0gR2V0TGVuZ3RoKCk7Ci0gIHdoaWxlIChwb3MgJiYgcFRhcmdldHMuRmluZChtX3BEYXRhLT5tX1N0cmluZ1twb3MgLSAxXSkgIT0gLTEpCi0gICAgcG9zLS07Ci0KLSAgaWYgKHBvcyA8IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpIHsKLSAgICBSZWFsbG9jQmVmb3JlV3JpdGUobV9wRGF0YS0+bV9uRGF0YUxlbmd0aCk7Ci0gICAgbV9wRGF0YS0+bV9TdHJpbmdbcG9zXSA9IDA7Ci0gICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IHBvczsKLSAgfQotfQotCi12b2lkIENGWF9XaWRlU3RyaW5nOjpUcmltUmlnaHQoRlhfV0NIQVIgY2hUYXJnZXQpIHsKLSAgRlhfV0NIQVIgc3RyWzJdID0ge2NoVGFyZ2V0LCAwfTsKLSAgVHJpbVJpZ2h0KHN0cik7Ci19Ci0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OlRyaW1SaWdodCgpIHsKLSAgVHJpbVJpZ2h0KEwiXHgwOVx4MGFceDBiXHgwY1x4MGRceDIwIik7Ci19Ci0KLXZvaWQgQ0ZYX1dpZGVTdHJpbmc6OlRyaW1MZWZ0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcFRhcmdldHMpIHsKLSAgaWYgKCFtX3BEYXRhIHx8IHBUYXJnZXRzLklzRW1wdHkoKSkKLSAgICByZXR1cm47Ci0KLSAgRlhfU1RSU0laRSBsZW4gPSBHZXRMZW5ndGgoKTsKLSAgaWYgKGxlbiA8IDEpCi0gICAgcmV0dXJuOwotCi0gIEZYX1NUUlNJWkUgcG9zID0gMDsKLSAgd2hpbGUgKHBvcyA8IGxlbikgewotICAgIEZYX1NUUlNJWkUgaSA9IDA7Ci0gICAgd2hpbGUgKGkgPCBwVGFyZ2V0cy5HZXRMZW5ndGgoKSAmJgotICAgICAgICAgICBwVGFyZ2V0cy5DaGFyQXQoaSkgIT0gbV9wRGF0YS0+bV9TdHJpbmdbcG9zXSkgewotICAgICAgaSsrOwotICAgIH0KLSAgICBpZiAoaSA9PSBwVGFyZ2V0cy5HZXRMZW5ndGgoKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHBvcysrOwotICB9Ci0gIGlmIChwb3MpIHsKLSAgICBSZWFsbG9jQmVmb3JlV3JpdGUobGVuKTsKLSAgICBGWF9TVFJTSVpFIG5EYXRhTGVuZ3RoID0gbGVuIC0gcG9zOwotICAgIEZYU1lTX21lbW1vdmUobV9wRGF0YS0+bV9TdHJpbmcsIG1fcERhdGEtPm1fU3RyaW5nICsgcG9zLAotICAgICAgICAgICAgICAgICAgKG5EYXRhTGVuZ3RoICsgMSkgKiBzaXplb2YoRlhfV0NIQVIpKTsKLSAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gbkRhdGFMZW5ndGg7Ci0gIH0KLX0KLQotdm9pZCBDRlhfV2lkZVN0cmluZzo6VHJpbUxlZnQoRlhfV0NIQVIgY2hUYXJnZXQpIHsKLSAgRlhfV0NIQVIgc3RyWzJdID0ge2NoVGFyZ2V0LCAwfTsKLSAgVHJpbUxlZnQoc3RyKTsKLX0KLQotdm9pZCBDRlhfV2lkZVN0cmluZzo6VHJpbUxlZnQoKSB7Ci0gIFRyaW1MZWZ0KEwiXHgwOVx4MGFceDBiXHgwY1x4MGRceDIwIik7Ci19Ci1GWF9GTE9BVCBGWF93dG9mKGNvbnN0IEZYX1dDSEFSKiBzdHIsIGludCBsZW4pIHsKLSAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgcmV0dXJuIDAuMDsKLSAgfQotICBpbnQgY2MgPSAwOwotICBib29sIGJOZWdhdGl2ZSA9IGZhbHNlOwotICBpZiAoc3RyWzBdID09ICcrJykgewotICAgIGNjKys7Ci0gIH0gZWxzZSBpZiAoc3RyWzBdID09ICctJykgewotICAgIGJOZWdhdGl2ZSA9IHRydWU7Ci0gICAgY2MrKzsKLSAgfQotICBpbnQgaW50ZWdlciA9IDA7Ci0gIHdoaWxlIChjYyA8IGxlbikgewotICAgIGlmIChzdHJbY2NdID09ICcuJykgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGludGVnZXIgPSBpbnRlZ2VyICogMTAgKyBGWFNZU190b0RlY2ltYWxEaWdpdChzdHJbY2NdKTsKLSAgICBjYysrOwotICB9Ci0gIEZYX0ZMT0FUIGZyYWN0aW9uID0gMDsKLSAgaWYgKHN0cltjY10gPT0gJy4nKSB7Ci0gICAgY2MrKzsKLSAgICBGWF9GTE9BVCBzY2FsZSA9IDAuMWY7Ci0gICAgd2hpbGUgKGNjIDwgbGVuKSB7Ci0gICAgICBmcmFjdGlvbiArPSBzY2FsZSAqIEZYU1lTX3RvRGVjaW1hbERpZ2l0KHN0cltjY10pOwotICAgICAgc2NhbGUgKj0gMC4xZjsKLSAgICAgIGNjKys7Ci0gICAgfQotICB9Ci0gIGZyYWN0aW9uICs9IChGWF9GTE9BVClpbnRlZ2VyOwotICByZXR1cm4gYk5lZ2F0aXZlID8gLWZyYWN0aW9uIDogZnJhY3Rpb247Ci19Ci0KLWludCBDRlhfV2lkZVN0cmluZzo6R2V0SW50ZWdlcigpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcERhdGEgPyBGWFNZU193dG9pKG1fcERhdGEtPm1fU3RyaW5nKSA6IDA7Ci19Ci0KLUZYX0ZMT0FUIENGWF9XaWRlU3RyaW5nOjpHZXRGbG9hdCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcERhdGEgPyBGWF93dG9mKG1fcERhdGEtPm1fU3RyaW5nLCBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKSA6IDAuMGY7Ci19Ci0KLS8vIHN0YXRpYwotQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0NoYXJNYXA6OkdldEJ5dGVTdHJpbmcodWludDE2X3QgY29kZXBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzdHIpIHsKLSAgQVNTRVJUKElzVmFsaWRDb2RlUGFnZShjb2RlcGFnZSkpOwotICBpbnQgc3JjX2xlbiA9IHdzdHIuR2V0TGVuZ3RoKCk7Ci0gIGludCBkZXN0X2xlbiA9IEZYU1lTX1dpZGVDaGFyVG9NdWx0aUJ5dGUoY29kZXBhZ2UsIDAsIHdzdHIuY19zdHIoKSwgc3JjX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAwLCBudWxscHRyLCBudWxscHRyKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgYnN0cjsKLSAgaWYgKGRlc3RfbGVuKSB7Ci0gICAgRlhfQ0hBUiogZGVzdF9idWYgPSBic3RyLkdldEJ1ZmZlcihkZXN0X2xlbik7Ci0gICAgRlhTWVNfV2lkZUNoYXJUb011bHRpQnl0ZShjb2RlcGFnZSwgMCwgd3N0ci5jX3N0cigpLCBzcmNfbGVuLCBkZXN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfbGVuLCBudWxscHRyLCBudWxscHRyKTsKLSAgICBic3RyLlJlbGVhc2VCdWZmZXIoZGVzdF9sZW4pOwotICB9Ci0gIHJldHVybiBic3RyOwotfQotCi0vLyBzdGF0aWMKLUNGWF9XaWRlU3RyaW5nIENGWF9DaGFyTWFwOjpHZXRXaWRlU3RyaW5nKHVpbnQxNl90IGNvZGVwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic3RyKSB7Ci0gIEFTU0VSVChJc1ZhbGlkQ29kZVBhZ2UoY29kZXBhZ2UpKTsKLSAgaW50IHNyY19sZW4gPSBic3RyLkdldExlbmd0aCgpOwotICBpbnQgZGVzdF9sZW4gPQotICAgICAgRlhTWVNfTXVsdGlCeXRlVG9XaWRlQ2hhcihjb2RlcGFnZSwgMCwgYnN0ci5jX3N0cigpLCBzcmNfbGVuLCBudWxscHRyLCAwKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3N0cjsKLSAgaWYgKGRlc3RfbGVuKSB7Ci0gICAgRlhfV0NIQVIqIGRlc3RfYnVmID0gd3N0ci5HZXRCdWZmZXIoZGVzdF9sZW4pOwotICAgIEZYU1lTX011bHRpQnl0ZVRvV2lkZUNoYXIoY29kZXBhZ2UsIDAsIGJzdHIuY19zdHIoKSwgc3JjX2xlbiwgZGVzdF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2xlbik7Ci0gICAgd3N0ci5SZWxlYXNlQnVmZmVyKGRlc3RfbGVuKTsKLSAgfQotICByZXR1cm4gd3N0cjsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvZnhfYmFzaWNfd3N0cmluZ191bml0dGVzdC5jcHAgYi9jb3JlL2Z4Y3J0L2Z4X2Jhc2ljX3dzdHJpbmdfdW5pdHRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2I1YWFmLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjcnQvZnhfYmFzaWNfd3N0cmluZ191bml0dGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NDEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgotI2luY2x1ZGUgInRlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLVRFU1QoZnhjcnQsIFdpZGVTdHJpbmdPcGVyYXRvclN1YnNjcmlwdCkgewotICAvLyBDRlhfV2lkZVN0cmluZyBpbmNsdWRlcyB0aGUgTlVMIHRlcm1pbmF0b3IgZm9yIG5vbi1lbXB0eSBzdHJpbmdzLgotICBDRlhfV2lkZVN0cmluZyBhYmMoTCJhYmMiKTsKLSAgRVhQRUNUX0VRKEwnYScsIGFiY1swXSk7Ci0gIEVYUEVDVF9FUShMJ2InLCBhYmNbMV0pOwotICBFWFBFQ1RfRVEoTCdjJywgYWJjWzJdKTsKLSAgRVhQRUNUX0VRKEwnXDAnLCBhYmNbM10pOwotfQotCi1URVNUKGZ4Y3J0LCBXaWRlU3RyaW5nT3BlcmF0b3JMVCkgewotICBDRlhfV2lkZVN0cmluZyBlbXB0eTsKLSAgQ0ZYX1dpZGVTdHJpbmcgYShMImEiKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgYWJjKEwiXHgwMTEwcXEiKTsgIC8vIENvbWVzIGJlZm9yZSBkZXNwaXRlIGVuZGlhbm5lc3MuCi0gIENGWF9XaWRlU3RyaW5nIGRlZihMIlx4MTAwMXFxIik7ICAvLyBDb21lcyBhZnRlciBkZXNwaXRlIGVuZGlhbm5lc3MuCi0KLSAgRVhQRUNUX0ZBTFNFKGVtcHR5IDwgZW1wdHkpOwotICBFWFBFQ1RfRkFMU0UoYSA8IGEpOwotICBFWFBFQ1RfRkFMU0UoYWJjIDwgYWJjKTsKLSAgRVhQRUNUX0ZBTFNFKGRlZiA8IGRlZik7Ci0KLSAgRVhQRUNUX1RSVUUoZW1wdHkgPCBhKTsKLSAgRVhQRUNUX0ZBTFNFKGEgPCBlbXB0eSk7Ci0KLSAgRVhQRUNUX1RSVUUoZW1wdHkgPCBhYmMpOwotICBFWFBFQ1RfRkFMU0UoYWJjIDwgZW1wdHkpOwotCi0gIEVYUEVDVF9UUlVFKGVtcHR5IDwgZGVmKTsKLSAgRVhQRUNUX0ZBTFNFKGRlZiA8IGVtcHR5KTsKLQotICBFWFBFQ1RfVFJVRShhIDwgYWJjKTsKLSAgRVhQRUNUX0ZBTFNFKGFiYyA8IGEpOwotCi0gIEVYUEVDVF9UUlVFKGEgPCBkZWYpOwotICBFWFBFQ1RfRkFMU0UoZGVmIDwgYSk7Ci0KLSAgRVhQRUNUX1RSVUUoYWJjIDwgZGVmKTsKLSAgRVhQRUNUX0ZBTFNFKGRlZiA8IGFiYyk7Ci19Ci0KLVRFU1QoZnhjcnQsIFdpZGVTdHJpbmdPcGVyYXRvckVRKSB7Ci0gIENGWF9XaWRlU3RyaW5nIG51bGxfc3RyaW5nOwotICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBudWxsX3N0cmluZyk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgZW1wdHlfc3RyaW5nKEwiIik7Ci0gIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOwotCi0gIENGWF9XaWRlU3RyaW5nIGRlbGV0ZWRfc3RyaW5nKEwiaGVsbG8iKTsKLSAgZGVsZXRlZF9zdHJpbmcuRGVsZXRlKDAsIDUpOwotICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBkZWxldGVkX3N0cmluZyk7Ci0gIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKLSAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKLSAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOwotCi0gIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nKEwiaGVsbG8iKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgPT0gd2lkZV9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKLSAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKLSAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nID09IHdpZGVfc3RyaW5nKTsKLSAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyA9PSB3aWRlX3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyA9PSB3aWRlX3N0cmluZyk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmdfc2FtZTEoTCJoZWxsbyIpOwotICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZ19zYW1lMSk7Ci0gIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX3NhbWUxID09IHdpZGVfc3RyaW5nKTsKLQotICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZ19zYW1lMih3aWRlX3N0cmluZyk7Ci0gIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nID09IHdpZGVfc3RyaW5nX3NhbWUyKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfc2FtZTIgPT0gd2lkZV9zdHJpbmcpOwotCi0gIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nMShMImhlIik7Ci0gIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nMihMImhlbGxwIik7Ci0gIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nMyhMImhlbGxvZCIpOwotICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gd2lkZV9zdHJpbmcxKTsKLSAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IHdpZGVfc3RyaW5nMik7Ci0gIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZzMpOwotICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcxID09IHdpZGVfc3RyaW5nKTsKLSAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nMiA9PSB3aWRlX3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZzMgPT0gd2lkZV9zdHJpbmcpOwotCi0gIENGWF9XaWRlU3RyaW5nQyBudWxsX3N0cmluZ19jOwotICBDRlhfV2lkZVN0cmluZ0MgZW1wdHlfc3RyaW5nX2MoTCIiKTsKLSAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gbnVsbF9zdHJpbmdfYyk7Ci0gIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGVtcHR5X3N0cmluZ19jKTsKLSAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IG51bGxfc3RyaW5nX2MpOwotICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nX2MpOwotICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBudWxsX3N0cmluZ19jKTsKLSAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nX2MpOwotICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZ19jID09IG51bGxfc3RyaW5nKTsKLSAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nX2MgPT0gbnVsbF9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZ19jID09IGVtcHR5X3N0cmluZyk7Ci0gIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZ19jID09IGVtcHR5X3N0cmluZyk7Ci0gIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nX2MgPT0gZGVsZXRlZF9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmdfYyA9PSBkZWxldGVkX3N0cmluZyk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2Nfc2FtZTEoTCJoZWxsbyIpOwotICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZ19jX3NhbWUxKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfY19zYW1lMSA9PSB3aWRlX3N0cmluZyk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MxKEwiaGUiKTsKLSAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MyKEwiaGVsbHAiKTsKLSAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MzKEwiaGVsbG9kIik7Ci0gIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZ19jMSk7Ci0gIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZ19jMik7Ci0gIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZ19jMyk7Ci0gIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jMSA9PSB3aWRlX3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jMiA9PSB3aWRlX3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jMyA9PSB3aWRlX3N0cmluZyk7Ci0KLSAgY29uc3Qgd2NoYXJfdCogY19udWxsX3N0cmluZyA9IG51bGxwdHI7Ci0gIGNvbnN0IHdjaGFyX3QqIGNfZW1wdHlfc3RyaW5nID0gTCIiOwotICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBjX251bGxfc3RyaW5nKTsKLSAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gY19lbXB0eV9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gY19udWxsX3N0cmluZyk7Ci0gIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBjX2VtcHR5X3N0cmluZyk7Ci0gIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IGNfbnVsbF9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBjX2VtcHR5X3N0cmluZyk7Ci0gIEVYUEVDVF9UUlVFKGNfbnVsbF9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShjX2VtcHR5X3N0cmluZyA9PSBudWxsX3N0cmluZyk7Ci0gIEVYUEVDVF9UUlVFKGNfbnVsbF9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKLSAgRVhQRUNUX1RSVUUoY19lbXB0eV9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nKTsKLSAgRVhQRUNUX1RSVUUoY19udWxsX3N0cmluZyA9PSBkZWxldGVkX3N0cmluZyk7Ci0gIEVYUEVDVF9UUlVFKGNfZW1wdHlfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKLQotICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZ19zYW1lMSA9IEwiaGVsbG8iOwotICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyA9PSBjX3N0cmluZ19zYW1lMSk7Ci0gIEVYUEVDVF9UUlVFKGNfc3RyaW5nX3NhbWUxID09IHdpZGVfc3RyaW5nKTsKLQotICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZzEgPSBMImhlIjsKLSAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmcyID0gTCJoZWxscCI7Ci0gIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nMyA9IEwiaGVsbG9kIjsKLSAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IGNfc3RyaW5nMSk7Ci0gIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSBjX3N0cmluZzIpOwotICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gY19zdHJpbmczKTsKLSAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMSA9PSB3aWRlX3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRShjX3N0cmluZzIgPT0gd2lkZV9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoY19zdHJpbmczID09IHdpZGVfc3RyaW5nKTsKLX0KLQotVEVTVChmeGNydCwgV2lkZVN0cmluZ09wZXJhdG9yTkUpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgbnVsbF9zdHJpbmc7Ci0gIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBudWxsX3N0cmluZyk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgZW1wdHlfc3RyaW5nKEwiIik7Ci0gIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKLSAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBudWxsX3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOwotCi0gIENGWF9XaWRlU3RyaW5nIGRlbGV0ZWRfc3RyaW5nKEwiaGVsbG8iKTsKLSAgZGVsZXRlZF9zdHJpbmcuRGVsZXRlKDAsIDUpOwotICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gbnVsbF9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKLSAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGRlbGV0ZWRfc3RyaW5nKTsKLSAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmcoTCJoZWxsbyIpOwotICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyAhPSBudWxsX3N0cmluZyk7Ci0gIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7Ci0gIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IGRlbGV0ZWRfc3RyaW5nKTsKLSAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgIT0gd2lkZV9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgIT0gd2lkZV9zdHJpbmcpOwotICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyAhPSB3aWRlX3N0cmluZyk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgd2lkZV9zdHJpbmdfc2FtZTEoTCJoZWxsbyIpOwotICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmdfc2FtZTEpOwotICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfc2FtZTEgIT0gd2lkZV9zdHJpbmcpOwotCi0gIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nX3NhbWUyKHdpZGVfc3RyaW5nKTsKLSAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nICE9IHdpZGVfc3RyaW5nX3NhbWUyKTsKLSAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX3NhbWUyICE9IHdpZGVfc3RyaW5nKTsKLQotICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzEoTCJoZSIpOwotICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzIoTCJoZWxscCIpOwotICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzMoTCJoZWxsb2QiKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmcxKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmcyKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmczKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcxICE9IHdpZGVfc3RyaW5nKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcyICE9IHdpZGVfc3RyaW5nKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmczICE9IHdpZGVfc3RyaW5nKTsKLQotICBDRlhfV2lkZVN0cmluZ0MgbnVsbF9zdHJpbmdfYzsKLSAgQ0ZYX1dpZGVTdHJpbmdDIGVtcHR5X3N0cmluZ19jKEwiIik7Ci0gIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBudWxsX3N0cmluZ19jKTsKLSAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGVtcHR5X3N0cmluZ19jKTsKLSAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBudWxsX3N0cmluZ19jKTsKLSAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZyAhPSBlbXB0eV9zdHJpbmdfYyk7Ci0gIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBudWxsX3N0cmluZ19jKTsKLSAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IGVtcHR5X3N0cmluZ19jKTsKLSAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nX2MgIT0gbnVsbF9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nX2MgIT0gbnVsbF9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmdfYyAhPSBlbXB0eV9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nX2MgIT0gZW1wdHlfc3RyaW5nKTsKLQotICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfY19zYW1lMShMImhlbGxvIik7Ci0gIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyAhPSB3aWRlX3N0cmluZ19jX3NhbWUxKTsKLSAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2Nfc2FtZTEgIT0gd2lkZV9zdHJpbmcpOwotCi0gIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jMShMImhlIik7Ci0gIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jMihMImhlbGxwIik7Ci0gIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jMyhMImhlbGxvZCIpOwotICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyAhPSB3aWRlX3N0cmluZ19jMSk7Ci0gIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IHdpZGVfc3RyaW5nX2MyKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmdfYzMpOwotICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jMSAhPSB3aWRlX3N0cmluZyk7Ci0gIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MyICE9IHdpZGVfc3RyaW5nKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYzMgIT0gd2lkZV9zdHJpbmcpOwotCi0gIGNvbnN0IHdjaGFyX3QqIGNfbnVsbF9zdHJpbmcgPSBudWxscHRyOwotICBjb25zdCB3Y2hhcl90KiBjX2VtcHR5X3N0cmluZyA9IEwiIjsKLSAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGNfbnVsbF9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gY19lbXB0eV9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGNfbnVsbF9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGNfZW1wdHlfc3RyaW5nKTsKLSAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IGNfbnVsbF9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gY19lbXB0eV9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoY19udWxsX3N0cmluZyAhPSBudWxsX3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRShjX2VtcHR5X3N0cmluZyAhPSBudWxsX3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRShjX251bGxfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRShjX2VtcHR5X3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOwotICBFWFBFQ1RfRkFMU0UoY19udWxsX3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7Ci0gIEVYUEVDVF9GQUxTRShjX2VtcHR5X3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7Ci0KLSAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmdfc2FtZTEgPSBMImhlbGxvIjsKLSAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nICE9IGNfc3RyaW5nX3NhbWUxKTsKLSAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nX3NhbWUxICE9IHdpZGVfc3RyaW5nKTsKLQotICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZzEgPSBMImhlIjsKLSAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmcyID0gTCJoZWxscCI7Ci0gIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nMyA9IEwiaGVsbG9kIjsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gY19zdHJpbmcxKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gY19zdHJpbmcyKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gY19zdHJpbmczKTsKLSAgRVhQRUNUX1RSVUUoY19zdHJpbmcxICE9IHdpZGVfc3RyaW5nKTsKLSAgRVhQRUNUX1RSVUUoY19zdHJpbmcyICE9IHdpZGVfc3RyaW5nKTsKLSAgRVhQRUNUX1RSVUUoY19zdHJpbmczICE9IHdpZGVfc3RyaW5nKTsKLX0KLQotVEVTVChmeGNydCwgV2lkZVN0cmluZ0NvbmNhdEluUGxhY2UpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgZnJlZDsKLSAgZnJlZC5Db25jYXQoTCJGUkVEIiwgNCk7Ci0gIEVYUEVDVF9FUShMIkZSRUQiLCBmcmVkKTsKLQotICBmcmVkLkNvbmNhdChMIkRZIiwgMik7Ci0gIEVYUEVDVF9FUShMIkZSRUREWSIsIGZyZWQpOwotCi0gIGZyZWQuRGVsZXRlKDMsIDMpOwotICBFWFBFQ1RfRVEoTCJGUkUiLCBmcmVkKTsKLQotICBmcmVkLkNvbmNhdChMIkQiLCAxKTsKLSAgRVhQRUNUX0VRKEwiRlJFRCIsIGZyZWQpOwotCi0gIENGWF9XaWRlU3RyaW5nIGNvcHkgPSBmcmVkOwotICBmcmVkLkNvbmNhdChMIkRZIiwgMik7Ci0gIEVYUEVDVF9FUShMIkZSRUREWSIsIGZyZWQpOwotICBFWFBFQ1RfRVEoTCJGUkVEIiwgY29weSk7Ci0KLSAgLy8gVGVzdCBpbnZhbGlkIGFyZ3VtZW50cy4KLSAgY29weSA9IGZyZWQ7Ci0gIGZyZWQuQ29uY2F0KEwiZnJlZGR5IiwgLTYpOwotICBDRlhfV2lkZVN0cmluZyBub3RfYWxpYXNlZChMInh4eHh4eCIpOwotICBFWFBFQ1RfRVEoTCJGUkVERFkiLCBmcmVkKTsKLSAgRVhQRUNUX0VRKEwieHh4eHh4Iiwgbm90X2FsaWFzZWQpOwotfQotCi1URVNUKGZ4Y3J0LCBXaWRlU3RyaW5nUmVtb3ZlKSB7Ci0gIENGWF9XaWRlU3RyaW5nIGZyZWVkKEwiRlJFRUQiKTsKLSAgZnJlZWQuUmVtb3ZlKEwnRScpOwotICBFWFBFQ1RfRVEoTCJGUkQiLCBmcmVlZCk7Ci0gIGZyZWVkLlJlbW92ZShMJ0YnKTsKLSAgRVhQRUNUX0VRKEwiUkQiLCBmcmVlZCk7Ci0gIGZyZWVkLlJlbW92ZShMJ0QnKTsKLSAgRVhQRUNUX0VRKEwiUiIsIGZyZWVkKTsKLSAgZnJlZWQuUmVtb3ZlKEwnWCcpOwotICBFWFBFQ1RfRVEoTCJSIiwgZnJlZWQpOwotICBmcmVlZC5SZW1vdmUoTCdSJyk7Ci0gIEVYUEVDVF9FUShMIiIsIGZyZWVkKTsKLQotICBDRlhfV2lkZVN0cmluZyBlbXB0eTsKLSAgZW1wdHkuUmVtb3ZlKEwnWCcpOwotICBFWFBFQ1RfRVEoTCIiLCBlbXB0eSk7Ci19Ci0KLVRFU1QoZnhjcnQsIFdpZGVTdHJpbmdSZW1vdmVDb3BpZXMpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgZnJlZWQoTCJGUkVFRCIpOwotICBjb25zdCBGWF9XQ0hBUiogb2xkX2J1ZmZlciA9IGZyZWVkLmNfc3RyKCk7Ci0KLSAgLy8gTm8gY2hhbmdlIHdpdGggc2luZ2xlIHJlZmVyZW5jZSAtIG5vIGNvcHkuCi0gIGZyZWVkLlJlbW92ZShMJ1EnKTsKLSAgRVhQRUNUX0VRKEwiRlJFRUQiLCBmcmVlZCk7Ci0gIEVYUEVDVF9FUShvbGRfYnVmZmVyLCBmcmVlZC5jX3N0cigpKTsKLQotICAvLyBDaGFuZ2Ugd2l0aCBzaW5nbGUgcmVmZXJlbmNlIC0gbm8gY29weS4KLSAgZnJlZWQuUmVtb3ZlKEwnRScpOwotICBFWFBFQ1RfRVEoTCJGUkQiLCBmcmVlZCk7Ci0gIEVYUEVDVF9FUShvbGRfYnVmZmVyLCBmcmVlZC5jX3N0cigpKTsKLQotICAvLyBObyBjaGFuZ2Ugd2l0aCBtdWx0aXBsZSByZWZlcmVuY2VzIC0gbm8gY29weS4KLSAgQ0ZYX1dpZGVTdHJpbmcgc2hhcmVkKGZyZWVkKTsKLSAgZnJlZWQuUmVtb3ZlKEwnUScpOwotICBFWFBFQ1RfRVEoTCJGUkQiLCBmcmVlZCk7Ci0gIEVYUEVDVF9FUShvbGRfYnVmZmVyLCBmcmVlZC5jX3N0cigpKTsKLSAgRVhQRUNUX0VRKG9sZF9idWZmZXIsIHNoYXJlZC5jX3N0cigpKTsKLQotICAvLyBDaGFuZ2Ugd2l0aCBtdWx0aXBsZSByZWZlcmVuY2VzIC0tIG11c3QgY29weS4KLSAgZnJlZWQuUmVtb3ZlKEwnRCcpOwotICBFWFBFQ1RfRVEoTCJGUiIsIGZyZWVkKTsKLSAgRVhQRUNUX05FKG9sZF9idWZmZXIsIGZyZWVkLmNfc3RyKCkpOwotICBFWFBFQ1RfRVEoTCJGUkQiLCBzaGFyZWQpOwotICBFWFBFQ1RfRVEob2xkX2J1ZmZlciwgc2hhcmVkLmNfc3RyKCkpOwotfQotCi1URVNUKGZ4Y3J0LCBXaWRlU3RyaW5nUmVwbGFjZSkgewotICBDRlhfV2lkZVN0cmluZyBmcmVkKEwiRlJFRCIpOwotICBmcmVkLlJlcGxhY2UoTCJGUiIsIEwiQkwiKTsKLSAgRVhQRUNUX0VRKEwiQkxFRCIsIGZyZWQpOwotICBmcmVkLlJlcGxhY2UoTCJEIiwgTCJERFkiKTsKLSAgRVhQRUNUX0VRKEwiQkxFRERZIiwgZnJlZCk7Ci0gIGZyZWQuUmVwbGFjZShMIkxFREQiLCBMIiIpOwotICBFWFBFQ1RfRVEoTCJCWSIsIGZyZWQpOwotICBmcmVkLlJlcGxhY2UoTCJYIiwgTCJDTEFNUyIpOwotICBFWFBFQ1RfRVEoTCJCWSIsIGZyZWQpOwotICBmcmVkLlJlcGxhY2UoTCJCWSIsIEwiSEkiKTsKLSAgRVhQRUNUX0VRKEwiSEkiLCBmcmVkKTsKLSAgZnJlZC5SZXBsYWNlKEwiIiwgTCJDTEFNUyIpOwotICBFWFBFQ1RfRVEoTCJISSIsIGZyZWQpOwotICBmcmVkLlJlcGxhY2UoTCJISSIsIEwiIik7Ci0gIEVYUEVDVF9FUShMIiIsIGZyZWQpOwotfQotCi1URVNUKGZ4Y3J0LCBXaWRlU3RyaW5nSW5zZXJ0KSB7Ci0gIENGWF9XaWRlU3RyaW5nIGZyZWQoTCJGUkVEIik7Ci0gIGZyZWQuSW5zZXJ0KC0xLCAnWCcpOwotICBFWFBFQ1RfRVEoTCJYRlJFRCIsIGZyZWQpOwotCi0gIGZyZWQuSW5zZXJ0KDAsICdTJyk7Ci0gIEVYUEVDVF9FUShMIlNYRlJFRCIsIGZyZWQpOwotCi0gIGZyZWQuSW5zZXJ0KDIsICdUJyk7Ci0gIEVYUEVDVF9FUShMIlNYVEZSRUQiLCBmcmVkKTsKLQotICBmcmVkLkluc2VydCg1LCAnVScpOwotICBFWFBFQ1RfRVEoTCJTWFRGUlVFRCIsIGZyZWQpOwotCi0gIGZyZWQuSW5zZXJ0KDgsICdWJyk7Ci0gIEVYUEVDVF9FUShMIlNYVEZSVUVEViIsIGZyZWQpOwotCi0gIGZyZWQuSW5zZXJ0KDEyLCAnUCcpOwotICBFWFBFQ1RfRVEoTCJTWFRGUlVFRFZQIiwgZnJlZCk7Ci0KLSAgewotICAgIENGWF9XaWRlU3RyaW5nIGVtcHR5OwotICAgIGVtcHR5Lkluc2VydCgtMSwgJ1gnKTsKLSAgICBFWFBFQ1RfRVEoTCJYIiwgZW1wdHkpOwotICB9Ci0gIHsKLSAgICBDRlhfV2lkZVN0cmluZyBlbXB0eTsKLSAgICBlbXB0eS5JbnNlcnQoMCwgJ1gnKTsKLSAgICBFWFBFQ1RfRVEoTCJYIiwgZW1wdHkpOwotICB9Ci0gIHsKLSAgICBDRlhfV2lkZVN0cmluZyBlbXB0eTsKLSAgICBlbXB0eS5JbnNlcnQoNSwgJ1gnKTsKLSAgICBFWFBFQ1RfRVEoTCJYIiwgZW1wdHkpOwotICB9Ci19Ci0KLVRFU1QoZnhjcnQsIFdpZGVTdHJpbmdEZWxldGUpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgZnJlZChMIkZSRUQiKTsKLSAgZnJlZC5EZWxldGUoMCwgMik7Ci0gIEVYUEVDVF9FUShMIkVEIiwgZnJlZCk7Ci0gIGZyZWQuRGVsZXRlKDEpOwotICBFWFBFQ1RfRVEoTCJFIiwgZnJlZCk7Ci0gIGZyZWQuRGVsZXRlKC0xKTsKLSAgRVhQRUNUX0VRKEwiIiwgZnJlZCk7Ci0gIGZyZWQuRGVsZXRlKDEpOwotICBFWFBFQ1RfRVEoTCIiLCBmcmVkKTsKLQotICBDRlhfV2lkZVN0cmluZyBlbXB0eTsKLSAgZW1wdHkuRGVsZXRlKDApOwotICBFWFBFQ1RfRVEoTCIiLCBlbXB0eSk7Ci0gIGVtcHR5LkRlbGV0ZSgtMSk7Ci0gIEVYUEVDVF9FUShMIiIsIGVtcHR5KTsKLSAgZW1wdHkuRGVsZXRlKDEpOwotICBFWFBFQ1RfRVEoTCIiLCBlbXB0eSk7Ci19Ci0KLVRFU1QoZnhjcnQsIFdpZGVTdHJpbmdNaWQpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgZnJlZChMIkZSRUQiKTsKLSAgRVhQRUNUX0VRKEwiIiwgZnJlZC5NaWQoMCwgMCkpOwotICBFWFBFQ1RfRVEoTCIiLCBmcmVkLk1pZCgzLCAwKSk7Ci0gIEVYUEVDVF9FUShMIkZSRUQiLCBmcmVkLk1pZCgwKSk7Ci0gIEVYUEVDVF9FUShMIlJFRCIsIGZyZWQuTWlkKDEpKTsKLSAgRVhQRUNUX0VRKEwiRUQiLCBmcmVkLk1pZCgyKSk7Ci0gIEVYUEVDVF9FUShMIkQiLCBmcmVkLk1pZCgzKSk7Ci0gIEVYUEVDVF9FUShMIkYiLCBmcmVkLk1pZCgwLCAxKSk7Ci0gIEVYUEVDVF9FUShMIlIiLCBmcmVkLk1pZCgxLCAxKSk7Ci0gIEVYUEVDVF9FUShMIkUiLCBmcmVkLk1pZCgyLCAxKSk7Ci0gIEVYUEVDVF9FUShMIkQiLCBmcmVkLk1pZCgzLCAxKSk7Ci0gIEVYUEVDVF9FUShMIkZSIiwgZnJlZC5NaWQoMCwgMikpOwotICBFWFBFQ1RfRVEoTCJGUkVEIiwgZnJlZC5NaWQoMCwgNCkpOwotICBFWFBFQ1RfRVEoTCJGUkVEIiwgZnJlZC5NaWQoMCwgMTApKTsKLQotICBFWFBFQ1RfRVEoTCJGUiIsIGZyZWQuTWlkKC0xLCAyKSk7Ci0gIEVYUEVDVF9FUShMIlJFRCIsIGZyZWQuTWlkKDEsIDQpKTsKLSAgRVhQRUNUX0VRKEwiIiwgZnJlZC5NaWQoNCwgMSkpOwotCi0gIENGWF9XaWRlU3RyaW5nIGVtcHR5OwotICBFWFBFQ1RfRVEoTCIiLCBlbXB0eS5NaWQoMCwgMCkpOwotICBFWFBFQ1RfRVEoTCIiLCBlbXB0eS5NaWQoMCkpOwotICBFWFBFQ1RfRVEoTCIiLCBlbXB0eS5NaWQoMSkpOwotICBFWFBFQ1RfRVEoTCIiLCBlbXB0eS5NaWQoLTEpKTsKLX0KLQotVEVTVChmeGNydCwgV2lkZVN0cmluZ0xlZnQpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgZnJlZChMIkZSRUQiKTsKLSAgRVhQRUNUX0VRKEwiIiwgZnJlZC5MZWZ0KDApKTsKLSAgRVhQRUNUX0VRKEwiRiIsIGZyZWQuTGVmdCgxKSk7Ci0gIEVYUEVDVF9FUShMIkZSIiwgZnJlZC5MZWZ0KDIpKTsKLSAgRVhQRUNUX0VRKEwiRlJFIiwgZnJlZC5MZWZ0KDMpKTsKLSAgRVhQRUNUX0VRKEwiRlJFRCIsIGZyZWQuTGVmdCg0KSk7Ci0KLSAgRVhQRUNUX0VRKEwiRlJFRCIsIGZyZWQuTGVmdCg1KSk7Ci0gIEVYUEVDVF9FUShMIiIsIGZyZWQuTGVmdCgtMSkpOwotCi0gIENGWF9XaWRlU3RyaW5nIGVtcHR5OwotICBFWFBFQ1RfRVEoTCIiLCBlbXB0eS5MZWZ0KDApKTsKLSAgRVhQRUNUX0VRKEwiIiwgZW1wdHkuTGVmdCgxKSk7Ci0gIEVYUEVDVF9FUShMIiIsIGVtcHR5LkxlZnQoLTEpKTsKLX0KLQotVEVTVChmeGNydCwgV2lkZVN0cmluZ1JpZ2h0KSB7Ci0gIENGWF9XaWRlU3RyaW5nIGZyZWQoTCJGUkVEIik7Ci0gIEVYUEVDVF9FUShMIiIsIGZyZWQuUmlnaHQoMCkpOwotICBFWFBFQ1RfRVEoTCJEIiwgZnJlZC5SaWdodCgxKSk7Ci0gIEVYUEVDVF9FUShMIkVEIiwgZnJlZC5SaWdodCgyKSk7Ci0gIEVYUEVDVF9FUShMIlJFRCIsIGZyZWQuUmlnaHQoMykpOwotICBFWFBFQ1RfRVEoTCJGUkVEIiwgZnJlZC5SaWdodCg0KSk7Ci0KLSAgRVhQRUNUX0VRKEwiRlJFRCIsIGZyZWQuUmlnaHQoNSkpOwotICBFWFBFQ1RfRVEoTCIiLCBmcmVkLlJpZ2h0KC0xKSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgZW1wdHk7Ci0gIEVYUEVDVF9FUShMIiIsIGVtcHR5LlJpZ2h0KDApKTsKLSAgRVhQRUNUX0VRKEwiIiwgZW1wdHkuUmlnaHQoMSkpOwotICBFWFBFQ1RfRVEoTCIiLCBlbXB0eS5SaWdodCgtMSkpOwotfQotCi1URVNUKGZ4Y3J0LCBXaWRlU3RyaW5nVXBwZXJMb3dlcikgewotICBDRlhfV2lkZVN0cmluZyBmcmVkKEwiRi1SZS40MkQiKTsKLSAgZnJlZC5NYWtlTG93ZXIoKTsKLSAgRVhQRUNUX0VRKEwiZi1yZS40MmQiLCBmcmVkKTsKLSAgZnJlZC5NYWtlVXBwZXIoKTsKLSAgRVhQRUNUX0VRKEwiRi1SRS40MkQiLCBmcmVkKTsKLQotICBDRlhfV2lkZVN0cmluZyBlbXB0eTsKLSAgZW1wdHkuTWFrZUxvd2VyKCk7Ci0gIEVYUEVDVF9FUShMIiIsIGVtcHR5KTsKLSAgZW1wdHkuTWFrZVVwcGVyKCk7Ci0gIEVYUEVDVF9FUShMIiIsIGVtcHR5KTsKLX0KLQotVEVTVChmeGNydCwgV2lkZVN0cmluZ1RyaW1SaWdodCkgewotICBDRlhfV2lkZVN0cmluZyBmcmVkKEwiICBGUkVEICAiKTsKLSAgZnJlZC5UcmltUmlnaHQoKTsKLSAgRVhQRUNUX0VRKEwiICBGUkVEIiwgZnJlZCk7Ci0gIGZyZWQuVHJpbVJpZ2h0KEwnRScpOwotICBFWFBFQ1RfRVEoTCIgIEZSRUQiLCBmcmVkKTsKLSAgZnJlZC5UcmltUmlnaHQoTCdEJyk7Ci0gIEVYUEVDVF9FUShMIiAgRlJFIiwgZnJlZCk7Ci0gIGZyZWQuVHJpbVJpZ2h0KEwiRVJQIik7Ci0gIEVYUEVDVF9FUShMIiAgRiIsIGZyZWQpOwotCi0gIENGWF9XaWRlU3RyaW5nIGJsYW5rKEwiICAgIik7Ci0gIGJsYW5rLlRyaW1SaWdodChMIkVSUCIpOwotICBFWFBFQ1RfRVEoTCIgICAiLCBibGFuayk7Ci0gIGJsYW5rLlRyaW1SaWdodChMJ0UnKTsKLSAgRVhQRUNUX0VRKEwiICAgIiwgYmxhbmspOwotICBibGFuay5UcmltUmlnaHQoKTsKLSAgRVhQRUNUX0VRKEwiIiwgYmxhbmspOwotCi0gIENGWF9XaWRlU3RyaW5nIGVtcHR5OwotICBlbXB0eS5UcmltUmlnaHQoTCJFUlAiKTsKLSAgRVhQRUNUX0VRKEwiIiwgZW1wdHkpOwotICBlbXB0eS5UcmltUmlnaHQoTCdFJyk7Ci0gIEVYUEVDVF9FUShMIiIsIGVtcHR5KTsKLSAgZW1wdHkuVHJpbVJpZ2h0KCk7Ci0gIEVYUEVDVF9FUShMIiIsIGVtcHR5KTsKLX0KLQotVEVTVChmeGNydCwgV2lkZVN0cmluZ1RyaW1SaWdodENvcGllcykgewotICB7Ci0gICAgLy8gV2l0aCBhIHNpbmdsZSByZWZlcmVuY2UsIG5vIGNvcHkgdGFrZXMgcGxhY2UuCi0gICAgQ0ZYX1dpZGVTdHJpbmcgZnJlZChMIiAgRlJFRCAgIik7Ci0gICAgY29uc3QgRlhfV0NIQVIqIG9sZF9idWZmZXIgPSBmcmVkLmNfc3RyKCk7Ci0gICAgZnJlZC5UcmltUmlnaHQoKTsKLSAgICBFWFBFQ1RfRVEoTCIgIEZSRUQiLCBmcmVkKTsKLSAgICBFWFBFQ1RfRVEob2xkX2J1ZmZlciwgZnJlZC5jX3N0cigpKTsKLSAgfQotICB7Ci0gICAgLy8gV2l0aCBtdWx0aXBsZSByZWZlcmVuY2VzLCB3ZSBtdXN0IGNvcHkuCi0gICAgQ0ZYX1dpZGVTdHJpbmcgZnJlZChMIiAgRlJFRCAgIik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgb3RoZXJfZnJlZCA9IGZyZWQ7Ci0gICAgY29uc3QgRlhfV0NIQVIqIG9sZF9idWZmZXIgPSBmcmVkLmNfc3RyKCk7Ci0gICAgZnJlZC5UcmltUmlnaHQoKTsKLSAgICBFWFBFQ1RfRVEoTCIgIEZSRUQiLCBmcmVkKTsKLSAgICBFWFBFQ1RfRVEoTCIgIEZSRUQgICIsIG90aGVyX2ZyZWQpOwotICAgIEVYUEVDVF9ORShvbGRfYnVmZmVyLCBmcmVkLmNfc3RyKCkpOwotICB9Ci0gIHsKLSAgICAvLyBXaXRoIG11bHRpcGxlIHJlZmVyZW5jZXMsIGJ1dCBubyBtb2RpZmljYXRpb25zLCBubyBjb3B5LgotICAgIENGWF9XaWRlU3RyaW5nIGZyZWQoTCJGUkVEIik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgb3RoZXJfZnJlZCA9IGZyZWQ7Ci0gICAgY29uc3QgRlhfV0NIQVIqIG9sZF9idWZmZXIgPSBmcmVkLmNfc3RyKCk7Ci0gICAgZnJlZC5UcmltUmlnaHQoKTsKLSAgICBFWFBFQ1RfRVEoTCJGUkVEIiwgZnJlZCk7Ci0gICAgRVhQRUNUX0VRKEwiRlJFRCIsIG90aGVyX2ZyZWQpOwotICAgIEVYUEVDVF9FUShvbGRfYnVmZmVyLCBmcmVkLmNfc3RyKCkpOwotICB9Ci19Ci0KLVRFU1QoZnhjcnQsIFdpZGVTdHJpbmdUcmltTGVmdCkgewotICBDRlhfV2lkZVN0cmluZyBmcmVkKEwiICBGUkVEICAiKTsKLSAgZnJlZC5UcmltTGVmdCgpOwotICBFWFBFQ1RfRVEoTCJGUkVEICAiLCBmcmVkKTsKLSAgZnJlZC5UcmltTGVmdChMJ0UnKTsKLSAgRVhQRUNUX0VRKEwiRlJFRCAgIiwgZnJlZCk7Ci0gIGZyZWQuVHJpbUxlZnQoTCdGJyk7Ci0gIEVYUEVDVF9FUShMIlJFRCAgIiwgZnJlZCk7Ci0gIGZyZWQuVHJpbUxlZnQoTCJFUlAiKTsKLSAgRVhQRUNUX0VRKEwiRCAgIiwgZnJlZCk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgYmxhbmsoTCIgICAiKTsKLSAgYmxhbmsuVHJpbUxlZnQoTCJFUlAiKTsKLSAgRVhQRUNUX0VRKEwiICAgIiwgYmxhbmspOwotICBibGFuay5UcmltTGVmdChMJ0UnKTsKLSAgRVhQRUNUX0VRKEwiICAgIiwgYmxhbmspOwotICBibGFuay5UcmltTGVmdCgpOwotICBFWFBFQ1RfRVEoTCIiLCBibGFuayk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgZW1wdHk7Ci0gIGVtcHR5LlRyaW1MZWZ0KEwiRVJQIik7Ci0gIEVYUEVDVF9FUShMIiIsIGVtcHR5KTsKLSAgZW1wdHkuVHJpbUxlZnQoTCdFJyk7Ci0gIEVYUEVDVF9FUShMIiIsIGVtcHR5KTsKLSAgZW1wdHkuVHJpbUxlZnQoKTsKLSAgRVhQRUNUX0VRKEwiIiwgZW1wdHkpOwotfQotCi1URVNUKGZ4Y3J0LCBXaWRlU3RyaW5nVHJpbUxlZnRDb3BpZXMpIHsKLSAgewotICAgIC8vIFdpdGggYSBzaW5nbGUgcmVmZXJlbmNlLCBubyBjb3B5IHRha2VzIHBsYWNlLgotICAgIENGWF9XaWRlU3RyaW5nIGZyZWQoTCIgIEZSRUQgICIpOwotICAgIGNvbnN0IEZYX1dDSEFSKiBvbGRfYnVmZmVyID0gZnJlZC5jX3N0cigpOwotICAgIGZyZWQuVHJpbUxlZnQoKTsKLSAgICBFWFBFQ1RfRVEoTCJGUkVEICAiLCBmcmVkKTsKLSAgICBFWFBFQ1RfRVEob2xkX2J1ZmZlciwgZnJlZC5jX3N0cigpKTsKLSAgfQotICB7Ci0gICAgLy8gV2l0aCBtdWx0aXBsZSByZWZlcmVuY2VzLCB3ZSBtdXN0IGNvcHkuCi0gICAgQ0ZYX1dpZGVTdHJpbmcgZnJlZChMIiAgRlJFRCAgIik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgb3RoZXJfZnJlZCA9IGZyZWQ7Ci0gICAgY29uc3QgRlhfV0NIQVIqIG9sZF9idWZmZXIgPSBmcmVkLmNfc3RyKCk7Ci0gICAgZnJlZC5UcmltTGVmdCgpOwotICAgIEVYUEVDVF9FUShMIkZSRUQgICIsIGZyZWQpOwotICAgIEVYUEVDVF9FUShMIiAgRlJFRCAgIiwgb3RoZXJfZnJlZCk7Ci0gICAgRVhQRUNUX05FKG9sZF9idWZmZXIsIGZyZWQuY19zdHIoKSk7Ci0gIH0KLSAgewotICAgIC8vIFdpdGggbXVsdGlwbGUgcmVmZXJlbmNlcywgYnV0IG5vIG1vZGlmaWNhdGlvbnMsIG5vIGNvcHkuCi0gICAgQ0ZYX1dpZGVTdHJpbmcgZnJlZChMIkZSRUQiKTsKLSAgICBDRlhfV2lkZVN0cmluZyBvdGhlcl9mcmVkID0gZnJlZDsKLSAgICBjb25zdCBGWF9XQ0hBUiogb2xkX2J1ZmZlciA9IGZyZWQuY19zdHIoKTsKLSAgICBmcmVkLlRyaW1MZWZ0KCk7Ci0gICAgRVhQRUNUX0VRKEwiRlJFRCIsIGZyZWQpOwotICAgIEVYUEVDVF9FUShMIkZSRUQiLCBvdGhlcl9mcmVkKTsKLSAgICBFWFBFQ1RfRVEob2xkX2J1ZmZlciwgZnJlZC5jX3N0cigpKTsKLSAgfQotfQotCi1URVNUKGZ4Y3J0LCBXaWRlU3RyaW5nUmVzZXJ2ZSkgewotICB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3RyOwotICAgIHN0ci5SZXNlcnZlKDYpOwotICAgIGNvbnN0IEZYX1dDSEFSKiBvbGRfYnVmZmVyID0gc3RyLmNfc3RyKCk7Ci0gICAgc3RyICs9IEwiQUJDREVGIjsKLSAgICBFWFBFQ1RfRVEob2xkX2J1ZmZlciwgc3RyLmNfc3RyKCkpOwotICAgIHN0ciArPSBMIkJsYWggQmxhaCBCbGFoIEJsYWggQmxhaCBCbGFoIjsKLSAgICBFWFBFQ1RfTkUob2xkX2J1ZmZlciwgc3RyLmNfc3RyKCkpOwotICB9Ci0gIHsKLSAgICBDRlhfV2lkZVN0cmluZyBzdHIoTCJBIik7Ci0gICAgc3RyLlJlc2VydmUoNik7Ci0gICAgY29uc3QgRlhfV0NIQVIqIG9sZF9idWZmZXIgPSBzdHIuY19zdHIoKTsKLSAgICBzdHIgKz0gTCJCQ0RFRiI7Ci0gICAgRVhQRUNUX0VRKG9sZF9idWZmZXIsIHN0ci5jX3N0cigpKTsKLSAgICBzdHIgKz0gTCJCbGFoIEJsYWggQmxhaCBCbGFoIEJsYWggQmxhaCI7Ci0gICAgRVhQRUNUX05FKG9sZF9idWZmZXIsIHN0ci5jX3N0cigpKTsKLSAgfQotfQotCi1URVNUKGZ4Y3J0LCBXaWRlU3RyaW5nR2V0QnVmZmVyKSB7Ci0gIHsKLSAgICBDRlhfV2lkZVN0cmluZyBzdHI7Ci0gICAgRlhfV0NIQVIqIGJ1ZmZlciA9IHN0ci5HZXRCdWZmZXIoMTIpOwotICAgIHdjc2NweShidWZmZXIsIEwiY2xhbXMiKTsKLSAgICBzdHIuUmVsZWFzZUJ1ZmZlcigpOwotICAgIEVYUEVDVF9FUShMImNsYW1zIiwgc3RyKTsKLSAgfQotICB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3RyKEwiY2wiKTsKLSAgICBGWF9XQ0hBUiogYnVmZmVyID0gc3RyLkdldEJ1ZmZlcigxMik7Ci0gICAgd2NzY3B5KGJ1ZmZlciArIDIsIEwiYW1zIik7Ci0gICAgc3RyLlJlbGVhc2VCdWZmZXIoKTsKLSAgICBFWFBFQ1RfRVEoTCJjbGFtcyIsIHN0cik7Ci0gIH0KLX0KLQotVEVTVChmeGNydCwgV2lkZVN0cmluZ1JlbGVhc2VCdWZmZXIpIHsKLSAgewotICAgIENGWF9XaWRlU3RyaW5nIHN0cjsKLSAgICBzdHIuUmVzZXJ2ZSgxMik7Ci0gICAgc3RyICs9IEwiY2xhbXMiOwotICAgIGNvbnN0IEZYX1dDSEFSKiBvbGRfYnVmZmVyID0gc3RyLmNfc3RyKCk7Ci0gICAgc3RyLlJlbGVhc2VCdWZmZXIoNCk7Ci0gICAgRVhQRUNUX0VRKG9sZF9idWZmZXIsIHN0ci5jX3N0cigpKTsKLSAgICBFWFBFQ1RfRVEoTCJjbGFtIiwgc3RyKTsKLSAgfQotICB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3RyKEwiYyIpOwotICAgIHN0ci5SZXNlcnZlKDEyKTsKLSAgICBzdHIgKz0gTCJsYW1zIjsKLSAgICBjb25zdCBGWF9XQ0hBUiogb2xkX2J1ZmZlciA9IHN0ci5jX3N0cigpOwotICAgIHN0ci5SZWxlYXNlQnVmZmVyKDQpOwotICAgIEVYUEVDVF9FUShvbGRfYnVmZmVyLCBzdHIuY19zdHIoKSk7Ci0gICAgRVhQRUNUX0VRKEwiY2xhbSIsIHN0cik7Ci0gIH0KLSAgewotICAgIENGWF9XaWRlU3RyaW5nIHN0cjsKLSAgICBzdHIuUmVzZXJ2ZSgyMDApOwotICAgIHN0ciArPSBMImNsYW1zIjsKLSAgICBjb25zdCBGWF9XQ0hBUiogb2xkX2J1ZmZlciA9IHN0ci5jX3N0cigpOwotICAgIHN0ci5SZWxlYXNlQnVmZmVyKDQpOwotICAgIEVYUEVDVF9ORShvbGRfYnVmZmVyLCBzdHIuY19zdHIoKSk7Ci0gICAgRVhQRUNUX0VRKEwiY2xhbSIsIHN0cik7Ci0gIH0KLSAgewotICAgIENGWF9XaWRlU3RyaW5nIHN0cihMImMiKTsKLSAgICBzdHIuUmVzZXJ2ZSgyMDApOwotICAgIHN0ciArPSBMImxhbXMiOwotICAgIGNvbnN0IEZYX1dDSEFSKiBvbGRfYnVmZmVyID0gc3RyLmNfc3RyKCk7Ci0gICAgc3RyLlJlbGVhc2VCdWZmZXIoNCk7Ci0gICAgRVhQRUNUX05FKG9sZF9idWZmZXIsIHN0ci5jX3N0cigpKTsKLSAgICBFWFBFQ1RfRVEoTCJjbGFtIiwgc3RyKTsKLSAgfQotfQotCi1URVNUKGZ4Y3J0LCBXaWRlU3RyaW5nVVRGMTZMRV9FbmNvZGUpIHsKLSAgc3RydWN0IFVURjE2TEVFbmNvZGVDYXNlIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3czsKLSAgICBDRlhfQnl0ZVN0cmluZyBiczsKLSAgfSB1dGYxNmxlX2VuY29kZV9jYXNlc1tdID0gewotICAgICAge0wiIiwgQ0ZYX0J5dGVTdHJpbmcoIlwwXDAiLCAyKX0sCi0gICAgICB7TCJhYmMiLCBDRlhfQnl0ZVN0cmluZygiYVwwYlwwY1wwXDBcMCIsIDgpfSwKLSAgICAgIHtMImFiY2RlZiIsIENGWF9CeXRlU3RyaW5nKCJhXDBiXDBjXDBkXDBlXDBmXDBcMFwwIiwgMTQpfSwKLSAgICAgIHtMImFiY1wwZGVmIiwgQ0ZYX0J5dGVTdHJpbmcoImFcMGJcMGNcMFwwXDAiLCA4KX0sCi0gICAgICB7TCJceGFhYmJceGNjZGQiLCBDRlhfQnl0ZVN0cmluZygiXHhiYlx4YWFceGRkXHhjY1wwXDAiLCA2KX0sCi0gICAgICB7TCJceDMxMzJceDYxNjIiLCBDRlhfQnl0ZVN0cmluZygiXHgzMlx4MzFceDYyXHg2MVwwXDAiLCA2KX0sCi0gIH07Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodXRmMTZsZV9lbmNvZGVfY2FzZXMpOyArK2kpIHsKLSAgICBFWFBFQ1RfRVEodXRmMTZsZV9lbmNvZGVfY2FzZXNbaV0uYnMsCi0gICAgICAgICAgICAgIHV0ZjE2bGVfZW5jb2RlX2Nhc2VzW2ldLndzLlVURjE2TEVfRW5jb2RlKCkpCi0gICAgICAgIDw8ICIgZm9yIGNhc2UgbnVtYmVyICIgPDwgaTsKLSAgfQotfQotCi1URVNUKGZ4Y3J0LCBXaWRlU3RyaW5nQ09wZXJhdG9yU3Vic2NyaXB0KSB7Ci0gIC8vIENGWF9XaWRlU3RyaW5nQyBpbmNsdWRlcyB0aGUgTlVMIHRlcm1pbmF0b3IgZm9yIG5vbi1lbXB0eSBzdHJpbmdzLgotICBDRlhfV2lkZVN0cmluZ0MgYWJjKEwiYWJjIik7Ci0gIEVYUEVDVF9FUShMJ2EnLCBhYmMuQ2hhckF0KDApKTsKLSAgRVhQRUNUX0VRKEwnYicsIGFiYy5DaGFyQXQoMSkpOwotICBFWFBFQ1RfRVEoTCdjJywgYWJjLkNoYXJBdCgyKSk7Ci0gIEVYUEVDVF9FUShMJ1wwJywgYWJjLkNoYXJBdCgzKSk7Ci19Ci0KLVRFU1QoZnhjcnQsIFdpZGVTdHJpbmdDT3BlcmF0b3JMVCkgewotICBDRlhfV2lkZVN0cmluZ0MgZW1wdHk7Ci0gIENGWF9XaWRlU3RyaW5nQyBhKEwiYSIpOwotICBDRlhfV2lkZVN0cmluZ0MgYWJjKEwiXHgwMTEwcXEiKTsgIC8vIENvbWVzIGJlZm9yZSBkZXNwaXRlIGVuZGlhbm5lc3MuCi0gIENGWF9XaWRlU3RyaW5nQyBkZWYoTCJceDEwMDFxcSIpOyAgLy8gQ29tZXMgYWZ0ZXIgZGVzcGl0ZSBlbmRpYW5uZXNzLgotCi0gIEVYUEVDVF9GQUxTRShlbXB0eSA8IGVtcHR5KTsKLSAgRVhQRUNUX0ZBTFNFKGEgPCBhKTsKLSAgRVhQRUNUX0ZBTFNFKGFiYyA8IGFiYyk7Ci0gIEVYUEVDVF9GQUxTRShkZWYgPCBkZWYpOwotCi0gIEVYUEVDVF9UUlVFKGVtcHR5IDwgYSk7Ci0gIEVYUEVDVF9GQUxTRShhIDwgZW1wdHkpOwotCi0gIEVYUEVDVF9UUlVFKGVtcHR5IDwgYWJjKTsKLSAgRVhQRUNUX0ZBTFNFKGFiYyA8IGVtcHR5KTsKLQotICBFWFBFQ1RfVFJVRShlbXB0eSA8IGRlZik7Ci0gIEVYUEVDVF9GQUxTRShkZWYgPCBlbXB0eSk7Ci0KLSAgRVhQRUNUX1RSVUUoYSA8IGFiYyk7Ci0gIEVYUEVDVF9GQUxTRShhYmMgPCBhKTsKLQotICBFWFBFQ1RfVFJVRShhIDwgZGVmKTsKLSAgRVhQRUNUX0ZBTFNFKGRlZiA8IGEpOwotCi0gIEVYUEVDVF9UUlVFKGFiYyA8IGRlZik7Ci0gIEVYUEVDVF9GQUxTRShkZWYgPCBhYmMpOwotfQotCi1URVNUKGZ4Y3J0LCBXaWRlU3RyaW5nQ09wZXJhdG9yRVEpIHsKLSAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2MoTCJoZWxsbyIpOwotICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jID09IHdpZGVfc3RyaW5nX2MpOwotCi0gIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jX3NhbWUxKEwiaGVsbG8iKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyA9PSB3aWRlX3N0cmluZ19jX3NhbWUxKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfY19zYW1lMSA9PSB3aWRlX3N0cmluZ19jKTsKLQotICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfY19zYW1lMih3aWRlX3N0cmluZ19jKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyA9PSB3aWRlX3N0cmluZ19jX3NhbWUyKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfY19zYW1lMiA9PSB3aWRlX3N0cmluZ19jKTsKLQotICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfYzEoTCJoZSIpOwotICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfYzIoTCJoZWxscCIpOwotICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfYzMoTCJoZWxsb2QiKTsKLSAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgPT0gd2lkZV9zdHJpbmdfYzEpOwotICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyA9PSB3aWRlX3N0cmluZ19jMik7Ci0gIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IHdpZGVfc3RyaW5nX2MzKTsKLSAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MxID09IHdpZGVfc3RyaW5nX2MpOwotICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYzIgPT0gd2lkZV9zdHJpbmdfYyk7Ci0gIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jMyA9PSB3aWRlX3N0cmluZ19jKTsKLQotICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZ19zYW1lMShMImhlbGxvIik7Ci0gIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgPT0gd2lkZV9zdHJpbmdfc2FtZTEpOwotICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19zYW1lMSA9PSB3aWRlX3N0cmluZ19jKTsKLQotICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzEoTCJoZSIpOwotICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzIoTCJoZWxscCIpOwotICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZzMoTCJoZWxsb2QiKTsKLSAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgPT0gd2lkZV9zdHJpbmcxKTsKLSAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgPT0gd2lkZV9zdHJpbmcyKTsKLSAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgPT0gd2lkZV9zdHJpbmczKTsKLSAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nMSA9PSB3aWRlX3N0cmluZ19jKTsKLSAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nMiA9PSB3aWRlX3N0cmluZ19jKTsKLSAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nMyA9PSB3aWRlX3N0cmluZ19jKTsKLQotICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZ19zYW1lMSA9IEwiaGVsbG8iOwotICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jID09IGNfc3RyaW5nX3NhbWUxKTsKLSAgRVhQRUNUX1RSVUUoY19zdHJpbmdfc2FtZTEgPT0gd2lkZV9zdHJpbmdfYyk7Ci0KLSAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmcxID0gTCJoZSI7Ci0gIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nMiA9IEwiaGVsbHAiOwotICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZzMgPSBMImhlbGxvZCI7Ci0gIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IGNfc3RyaW5nMSk7Ci0gIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IGNfc3RyaW5nMik7Ci0gIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IGNfc3RyaW5nMyk7Ci0KLSAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMSA9PSB3aWRlX3N0cmluZ19jKTsKLSAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMiA9PSB3aWRlX3N0cmluZ19jKTsKLSAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMyA9PSB3aWRlX3N0cmluZ19jKTsKLX0KLQotVEVTVChmeGNydCwgV2lkZVN0cmluZ0NPcGVyYXRvck5FKSB7Ci0gIENGWF9XaWRlU3RyaW5nQyB3aWRlX3N0cmluZ19jKEwiaGVsbG8iKTsKLSAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgIT0gd2lkZV9zdHJpbmdfYyk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2Nfc2FtZTEoTCJoZWxsbyIpOwotICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyAhPSB3aWRlX3N0cmluZ19jX3NhbWUxKTsKLSAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2Nfc2FtZTEgIT0gd2lkZV9zdHJpbmdfYyk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmdDIHdpZGVfc3RyaW5nX2Nfc2FtZTIod2lkZV9zdHJpbmdfYyk7Ci0gIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nX2Nfc2FtZTIpOwotICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfY19zYW1lMiAhPSB3aWRlX3N0cmluZ19jKTsKLQotICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfYzEoTCJoZSIpOwotICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfYzIoTCJoZWxscCIpOwotICBDRlhfV2lkZVN0cmluZ0Mgd2lkZV9zdHJpbmdfYzMoTCJoZWxsb2QiKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyAhPSB3aWRlX3N0cmluZ19jMSk7Ci0gIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgIT0gd2lkZV9zdHJpbmdfYzIpOwotICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nX2MzKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYzEgIT0gd2lkZV9zdHJpbmdfYyk7Ci0gIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MyICE9IHdpZGVfc3RyaW5nX2MpOwotICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jMyAhPSB3aWRlX3N0cmluZ19jKTsKLQotICBDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZ19zYW1lMShMImhlbGxvIik7Ci0gIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nX3NhbWUxKTsKLSAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX3NhbWUxICE9IHdpZGVfc3RyaW5nX2MpOwotCi0gIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nMShMImhlIik7Ci0gIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nMihMImhlbGxwIik7Ci0gIENGWF9XaWRlU3RyaW5nIHdpZGVfc3RyaW5nMyhMImhlbGxvZCIpOwotICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nMSk7Ci0gIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgIT0gd2lkZV9zdHJpbmcyKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyAhPSB3aWRlX3N0cmluZzMpOwotICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZzEgIT0gd2lkZV9zdHJpbmdfYyk7Ci0gIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nMiAhPSB3aWRlX3N0cmluZ19jKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmczICE9IHdpZGVfc3RyaW5nX2MpOwotCi0gIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nX3NhbWUxID0gTCJoZWxsbyI7Ci0gIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jICE9IGNfc3RyaW5nX3NhbWUxKTsKLSAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nX3NhbWUxICE9IHdpZGVfc3RyaW5nX2MpOwotCi0gIGNvbnN0IHdjaGFyX3QqIGNfc3RyaW5nMSA9IEwiaGUiOwotICBjb25zdCB3Y2hhcl90KiBjX3N0cmluZzIgPSBMImhlbGxwIjsKLSAgY29uc3Qgd2NoYXJfdCogY19zdHJpbmczID0gTCJoZWxsb2QiOwotICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jICE9IGNfc3RyaW5nMSk7Ci0gIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgIT0gY19zdHJpbmcyKTsKLSAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyAhPSBjX3N0cmluZzMpOwotCi0gIEVYUEVDVF9UUlVFKGNfc3RyaW5nMSAhPSB3aWRlX3N0cmluZ19jKTsKLSAgRVhQRUNUX1RSVUUoY19zdHJpbmcyICE9IHdpZGVfc3RyaW5nX2MpOwotICBFWFBFQ1RfVFJVRShjX3N0cmluZzMgIT0gd2lkZV9zdHJpbmdfYyk7Ci19Ci0KLVRFU1QoZnhjcnQsIFdpZGVTdHJpbmdDRmluZCkgewotICBDRlhfV2lkZVN0cmluZ0MgbnVsbF9zdHJpbmc7Ci0gIEVYUEVDVF9FUSgtMSwgbnVsbF9zdHJpbmcuRmluZChMJ2EnKSk7Ci0gIEVYUEVDVF9FUSgtMSwgbnVsbF9zdHJpbmcuRmluZCgwKSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmdDIGVtcHR5X3N0cmluZyhMIiIpOwotICBFWFBFQ1RfRVEoLTEsIGVtcHR5X3N0cmluZy5GaW5kKEwnYScpKTsKLSAgRVhQRUNUX0VRKC0xLCBlbXB0eV9zdHJpbmcuRmluZCgwKSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmdDIHNpbmdsZV9zdHJpbmcoTCJhIik7Ci0gIEVYUEVDVF9FUSgwLCBzaW5nbGVfc3RyaW5nLkZpbmQoTCdhJykpOwotICBFWFBFQ1RfRVEoLTEsIHNpbmdsZV9zdHJpbmcuRmluZChMJ2InKSk7Ci0gIEVYUEVDVF9FUSgtMSwgc2luZ2xlX3N0cmluZy5GaW5kKDApKTsKLQotICBDRlhfV2lkZVN0cmluZ0MgbG9uZ2VyX3N0cmluZyhMImFiY2NjIik7Ci0gIEVYUEVDVF9FUSgwLCBsb25nZXJfc3RyaW5nLkZpbmQoTCdhJykpOwotICBFWFBFQ1RfRVEoMiwgbG9uZ2VyX3N0cmluZy5GaW5kKEwnYycpKTsKLSAgRVhQRUNUX0VRKC0xLCBsb25nZXJfc3RyaW5nLkZpbmQoMCkpOwotCi0gIENGWF9XaWRlU3RyaW5nQyBoaWJ5dGVfc3RyaW5nKAotICAgICAgTCJhYlx4ZmYwOCIKLSAgICAgIEwiZGVmIik7Ci0gIEVYUEVDVF9FUSgyLCBoaWJ5dGVfc3RyaW5nLkZpbmQoTCdceGZmMDgnKSk7Ci19Ci0KLVRFU1QoZnhjcnQsIFdpZGVTdHJpbmdGb3JtYXRXaWR0aCkgewotICB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3RyOwotICAgIHN0ci5Gb3JtYXQoTCIlNWQiLCAxKTsKLSAgICBFWFBFQ1RfRVEoTCIgICAgMSIsIHN0cik7Ci0gIH0KLQotICB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3RyOwotICAgIHN0ci5Gb3JtYXQoTCIlZCIsIDEpOwotICAgIEVYUEVDVF9FUShMIjEiLCBzdHIpOwotICB9Ci0KLSAgewotICAgIENGWF9XaWRlU3RyaW5nIHN0cjsKLSAgICBzdHIuRm9ybWF0KEwiJSpkIiwgNSwgMSk7Ci0gICAgRVhQRUNUX0VRKEwiICAgIDEiLCBzdHIpOwotICB9Ci0KLSAgewotICAgIENGWF9XaWRlU3RyaW5nIHN0cjsKLSAgICBzdHIuRm9ybWF0KEwiJS0xZCIsIDEpOwotICAgIEVYUEVDVF9FUShMIjEiLCBzdHIpOwotICB9Ci0KLSAgewotICAgIENGWF9XaWRlU3RyaW5nIHN0cjsKLSAgICBzdHIuRm9ybWF0KEwiJTBkIiwgMSk7Ci0gICAgRVhQRUNUX0VRKEwiMSIsIHN0cik7Ci0gIH0KLQotICB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3RyOwotICAgIHN0ci5Gb3JtYXQoTCIlMTA0ODU3NmQiLCAxKTsKLSAgICBFWFBFQ1RfRVEoTCJCYWQgd2lkdGgiLCBzdHIpOwotICB9Ci19Ci0KLVRFU1QoZnhjcnQsIFdpZGVTdHJpbmdGb3JtYXRQcmVjaXNpb24pIHsKLSAgewotICAgIENGWF9XaWRlU3RyaW5nIHN0cjsKLSAgICBzdHIuRm9ybWF0KEwiJS4yZiIsIDEuMTIzNDUpOwotICAgIEVYUEVDVF9FUShMIjEuMTIiLCBzdHIpOwotICB9Ci0KLSAgewotICAgIENGWF9XaWRlU3RyaW5nIHN0cjsKLSAgICBzdHIuRm9ybWF0KEwiJS4qZiIsIDMsIDEuMTIzNDUpOwotICAgIEVYUEVDVF9FUShMIjEuMTIzIiwgc3RyKTsKLSAgfQotCi0gIHsKLSAgICBDRlhfV2lkZVN0cmluZyBzdHI7Ci0gICAgc3RyLkZvcm1hdChMIiVmIiwgMS4xMjM0NSk7Ci0gICAgRVhQRUNUX0VRKEwiMS4xMjM0NTAiLCBzdHIpOwotICB9Ci0KLSAgewotICAgIENGWF9XaWRlU3RyaW5nIHN0cjsKLSAgICBzdHIuRm9ybWF0KEwiJS0xZiIsIDEuMTIzNDUpOwotICAgIEVYUEVDVF9FUShMIjEuMTIzNDUwIiwgc3RyKTsKLSAgfQotCi0gIHsKLSAgICBDRlhfV2lkZVN0cmluZyBzdHI7Ci0gICAgc3RyLkZvcm1hdChMIiUwZiIsIDEuMTIzNDUpOwotICAgIEVYUEVDVF9FUShMIjEuMTIzNDUwIiwgc3RyKTsKLSAgfQotCi0gIHsKLSAgICBDRlhfV2lkZVN0cmluZyBzdHI7Ci0gICAgc3RyLkZvcm1hdChMIiUuMTA0ODU3NmYiLCAxLjIpOwotICAgIEVYUEVDVF9FUShMIkJhZCBwcmVjaXNpb24iLCBzdHIpOwotICB9Ci19Ci0KLVRFU1QoZnhjcnQsIEVtcHR5V2lkZVN0cmluZykgewotICBDRlhfV2lkZVN0cmluZyBlbXB0eV9zdHI7Ci0gIEVYUEVDVF9UUlVFKGVtcHR5X3N0ci5Jc0VtcHR5KCkpOwotICBFWFBFQ1RfRVEoMCwgZW1wdHlfc3RyLkdldExlbmd0aCgpKTsKLSAgY29uc3QgRlhfV0NIQVIqIGNzdHIgPSBlbXB0eV9zdHIuY19zdHIoKTsKLSAgRVhQRUNUX0VRKDAsIEZYU1lTX3djc2xlbihjc3RyKSk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Z4X2JpZGkuY3BwIGIvY29yZS9meGNydC9meF9iaWRpLmNwcAppbmRleCBlODJiM2U3Li5kYjQ2ZDk5IDEwMDY0NAotLS0gYS9jb3JlL2Z4Y3J0L2Z4X2JpZGkuY3BwCisrKyBiL2NvcmUvZnhjcnQvZnhfYmlkaS5jcHAKQEAgLTUsMTQgKzUsNTQzIEBACiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9iaWRpLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF91Y2QuaCIKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KIAorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfdW5pY29kZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9leHRlbnNpb24uaCIKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworbmFtZXNwYWNlIHsKKworZW51bSBGWF9CSURJQ0xBU1MgeworICBGWF9CSURJQ0xBU1NfT04gPSAwLCAgICAvLyBPdGhlciBOZXV0cmFsCisgIEZYX0JJRElDTEFTU19MID0gMSwgICAgIC8vIExlZnQgTGV0dGVyCisgIEZYX0JJRElDTEFTU19SID0gMiwgICAgIC8vIFJpZ2h0IExldHRlcgorICBGWF9CSURJQ0xBU1NfQU4gPSAzLCAgICAvLyBBcmFiaWMgTnVtYmVyCisgIEZYX0JJRElDTEFTU19FTiA9IDQsICAgIC8vIEV1cm9wZWFuIE51bWJlcgorICBGWF9CSURJQ0xBU1NfQUwgPSA1LCAgICAvLyBBcmFiaWMgTGV0dGVyCisgIEZYX0JJRElDTEFTU19OU00gPSA2LCAgIC8vIE5vbi1zcGFjaW5nIE1hcmsKKyAgRlhfQklESUNMQVNTX0NTID0gNywgICAgLy8gQ29tbW9uIE51bWJlciBTZXBhcmF0b3IKKyAgRlhfQklESUNMQVNTX0VTID0gOCwgICAgLy8gRXVyb3BlYW4gU2VwYXJhdG9yCisgIEZYX0JJRElDTEFTU19FVCA9IDksICAgIC8vIEV1cm9wZWFuIE51bWJlciBUZXJtaW5hdG9yCisgIEZYX0JJRElDTEFTU19CTiA9IDEwLCAgIC8vIEJvdW5kYXJ5IE5ldXRyYWwKKyAgRlhfQklESUNMQVNTX1MgPSAxMSwgICAgLy8gU2VnbWVudCBTZXBhcmF0b3IKKyAgRlhfQklESUNMQVNTX1dTID0gMTIsICAgLy8gV2hpdGVzcGFjZQorICBGWF9CSURJQ0xBU1NfQiA9IDEzLCAgICAvLyBQYXJhZ3JhcGggU2VwYXJhdG9yCisgIEZYX0JJRElDTEFTU19STE8gPSAxNCwgIC8vIFJpZ2h0LXRvLUxlZnQgT3ZlcnJpZGUKKyAgRlhfQklESUNMQVNTX1JMRSA9IDE1LCAgLy8gUmlnaHQtdG8tTGVmdCBFbWJlZGRpbmcKKyAgRlhfQklESUNMQVNTX0xSTyA9IDE2LCAgLy8gTGVmdC10by1SaWdodCBPdmVycmlkZQorICBGWF9CSURJQ0xBU1NfTFJFID0gMTcsICAvLyBMZWZ0LXRvLVJpZ2h0IEVtYmVkZGluZworICBGWF9CSURJQ0xBU1NfUERGID0gMTgsICAvLyBQb3AgRGlyZWN0aW9uYWwgRm9ybWF0CisgIEZYX0JJRElDTEFTU19OID0gRlhfQklESUNMQVNTX09OLAorfTsKK2NvbnN0ZXhwciB1aW50MzJfdCBGWF9CSURJQ0xBU1NCSVRTID0gNjsKK2NvbnN0ZXhwciB1aW50MzJfdCBGWF9CSURJQ0xBU1NCSVRTTUFTSyA9IDB4MUYgPDwgRlhfQklESUNMQVNTQklUUzsKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisKKyNpZm5kZWYgTkRFQlVHCitjb25zdGV4cHIgaW50MzJfdCBrQmlkaU1heExldmVsID0gNjE7CisjZW5kaWYgIC8vIE5ERUJVRworCitlbnVtIEZYX0JJRElXRUFLU1RBVEUgeworICBGWF9CV1N4YSA9IDAsCisgIEZYX0JXU3hyLAorICBGWF9CV1N4bCwKKyAgRlhfQldTYW8sCisgIEZYX0JXU3JvLAorICBGWF9CV1NsbywKKyAgRlhfQldTcnQsCisgIEZYX0JXU2x0LAorICBGWF9CV1NjbiwKKyAgRlhfQldTcmEsCisgIEZYX0JXU3JlLAorICBGWF9CV1NsYSwKKyAgRlhfQldTbGUsCisgIEZYX0JXU2FjLAorICBGWF9CV1NyYywKKyAgRlhfQldTcnMsCisgIEZYX0JXU2xjLAorICBGWF9CV1NscywKKyAgRlhfQldTcmV0LAorICBGWF9CV1NsZXQKK307CisKK2VudW0gRlhfQklESVdFQUtBQ1RJT04geworICBGWF9CV0FJWCA9IDB4MTAwLAorICBGWF9CV0FYWCA9IDB4MEYsCisgIEZYX0JXQXh4eCA9ICgweDBGIDw8IDQpICsgMHgwRiwKKyAgRlhfQldBeEl4ID0gMHgxMDAgKyBGWF9CV0F4eHgsCisgIEZYX0JXQXh4TiA9ICgweDBGIDw8IDQpICsgRlhfQklESUNMQVNTX09OLAorICBGWF9CV0F4eEUgPSAoMHgwRiA8PCA0KSArIEZYX0JJRElDTEFTU19FTiwKKyAgRlhfQldBeHhBID0gKDB4MEYgPDwgNCkgKyBGWF9CSURJQ0xBU1NfQU4sCisgIEZYX0JXQXh4UiA9ICgweDBGIDw8IDQpICsgRlhfQklESUNMQVNTX1IsCisgIEZYX0JXQXh4TCA9ICgweDBGIDw8IDQpICsgRlhfQklESUNMQVNTX0wsCisgIEZYX0JXQU54eCA9IChGWF9CSURJQ0xBU1NfT04gPDwgNCkgKyAweDBGLAorICBGWF9CV0FBeHggPSAoRlhfQklESUNMQVNTX0FOIDw8IDQpICsgMHgwRiwKKyAgRlhfQldBRXhFID0gKEZYX0JJRElDTEFTU19FTiA8PCA0KSArIEZYX0JJRElDTEFTU19FTiwKKyAgRlhfQldBTkl4ID0gKEZYX0JJRElDTEFTU19PTiA8PCA0KSArIDB4MEYgKyAweDEwMCwKKyAgRlhfQldBTnhOID0gKEZYX0JJRElDTEFTU19PTiA8PCA0KSArIEZYX0JJRElDTEFTU19PTiwKKyAgRlhfQldBTnhSID0gKEZYX0JJRElDTEFTU19PTiA8PCA0KSArIEZYX0JJRElDTEFTU19SLAorICBGWF9CV0FOeEUgPSAoRlhfQklESUNMQVNTX09OIDw8IDQpICsgRlhfQklESUNMQVNTX0VOLAorICBGWF9CV0FBeEEgPSAoRlhfQklESUNMQVNTX0FOIDw8IDQpICsgRlhfQklESUNMQVNTX0FOLAorICBGWF9CV0FOeEwgPSAoRlhfQklESUNMQVNTX09OIDw8IDQpICsgRlhfQklESUNMQVNTX0wsCisgIEZYX0JXQUx4TCA9IChGWF9CSURJQ0xBU1NfTCA8PCA0KSArIEZYX0JJRElDTEFTU19MLAorICBGWF9CV0F4SUwgPSAoMHgwRiA8PCA0KSArIEZYX0JJRElDTEFTU19MICsgMHgxMDAsCisgIEZYX0JXQUF4UiA9IChGWF9CSURJQ0xBU1NfQU4gPDwgNCkgKyBGWF9CSURJQ0xBU1NfUiwKKyAgRlhfQldBTHh4ID0gKEZYX0JJRElDTEFTU19MIDw8IDQpICsgMHgwRiwKK307CisKK2VudW0gRlhfQklESU5FVVRSQUxTVEFURSB7CisgIEZYX0JOU3IgPSAwLAorICBGWF9CTlNsLAorICBGWF9CTlNybiwKKyAgRlhfQk5TbG4sCisgIEZYX0JOU2EsCisgIEZYX0JOU25hCit9OworCitlbnVtIEZYX0JJRElORVVUUkFMQUNUSU9OIHsKKyAgRlhfQk5BbkwgPSBGWF9CSURJQ0xBU1NfTCwKKyAgRlhfQk5BRW4gPSAoRlhfQklESUNMQVNTX0FOIDw8IDQpLAorICBGWF9CTkFSbiA9IChGWF9CSURJQ0xBU1NfUiA8PCA0KSwKKyAgRlhfQk5BTG4gPSAoRlhfQklESUNMQVNTX0wgPDwgNCksCisgIEZYX0JOQUluID0gRlhfQldBSVgsCisgIEZYX0JOQUxuTCA9IChGWF9CSURJQ0xBU1NfTCA8PCA0KSArIEZYX0JJRElDTEFTU19MLAorfTsKKworY29uc3QgaW50MzJfdCBnY19GWF9CaWRpTlR5cGVzW10gPSB7CisgICAgRlhfQklESUNMQVNTX04sICAgRlhfQklESUNMQVNTX0wsICAgRlhfQklESUNMQVNTX1IsICAgRlhfQklESUNMQVNTX0FOLAorICAgIEZYX0JJRElDTEFTU19FTiwgIEZYX0JJRElDTEFTU19BTCwgIEZYX0JJRElDTEFTU19OU00sIEZYX0JJRElDTEFTU19DUywKKyAgICBGWF9CSURJQ0xBU1NfRVMsICBGWF9CSURJQ0xBU1NfRVQsICBGWF9CSURJQ0xBU1NfQk4sICBGWF9CSURJQ0xBU1NfQk4sCisgICAgRlhfQklESUNMQVNTX04sICAgRlhfQklESUNMQVNTX0IsICAgRlhfQklESUNMQVNTX1JMTywgRlhfQklESUNMQVNTX1JMRSwKKyAgICBGWF9CSURJQ0xBU1NfTFJPLCBGWF9CSURJQ0xBU1NfTFJFLCBGWF9CSURJQ0xBU1NfUERGLCBGWF9CSURJQ0xBU1NfT04sCit9OworCitjb25zdCBpbnQzMl90IGdjX0ZYX0JpZGlXZWFrU3RhdGVzW11bMTBdID0geworICAgIHtGWF9CV1NhbywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NjbiwgRlhfQldTY24sIEZYX0JXU3hhLCBGWF9CV1N4YSwKKyAgICAgRlhfQldTYW8sIEZYX0JXU2FvLCBGWF9CV1Nhb30sCisgICAge0ZYX0JXU3JvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU3JhLCBGWF9CV1NyZSwgRlhfQldTeGEsIEZYX0JXU3hyLAorICAgICBGWF9CV1NybywgRlhfQldTcm8sIEZYX0JXU3J0fSwKKyAgICB7RlhfQldTbG8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTbGEsIEZYX0JXU2xlLCBGWF9CV1N4YSwgRlhfQldTeGwsCisgICAgIEZYX0JXU2xvLCBGWF9CV1NsbywgRlhfQldTbHR9LAorICAgIHtGWF9CV1NhbywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NjbiwgRlhfQldTY24sIEZYX0JXU3hhLCBGWF9CV1NhbywKKyAgICAgRlhfQldTYW8sIEZYX0JXU2FvLCBGWF9CV1Nhb30sCisgICAge0ZYX0JXU3JvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU3JhLCBGWF9CV1NyZSwgRlhfQldTeGEsIEZYX0JXU3JvLAorICAgICBGWF9CV1NybywgRlhfQldTcm8sIEZYX0JXU3J0fSwKKyAgICB7RlhfQldTbG8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTbGEsIEZYX0JXU2xlLCBGWF9CV1N4YSwgRlhfQldTbG8sCisgICAgIEZYX0JXU2xvLCBGWF9CV1NsbywgRlhfQldTbHR9LAorICAgIHtGWF9CV1NybywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NyYSwgRlhfQldTcmUsIEZYX0JXU3hhLCBGWF9CV1NydCwKKyAgICAgRlhfQldTcm8sIEZYX0JXU3JvLCBGWF9CV1NydH0sCisgICAge0ZYX0JXU2xvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU2xhLCBGWF9CV1NsZSwgRlhfQldTeGEsIEZYX0JXU2x0LAorICAgICBGWF9CV1NsbywgRlhfQldTbG8sIEZYX0JXU2x0fSwKKyAgICB7RlhfQldTYW8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTY24sIEZYX0JXU2NuLCBGWF9CV1N4YSwgRlhfQldTY24sCisgICAgIEZYX0JXU2FjLCBGWF9CV1NhbywgRlhfQldTYW99LAorICAgIHtGWF9CV1NybywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NyYSwgRlhfQldTcmUsIEZYX0JXU3hhLCBGWF9CV1NyYSwKKyAgICAgRlhfQldTcmMsIEZYX0JXU3JvLCBGWF9CV1NydH0sCisgICAge0ZYX0JXU3JvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU3JhLCBGWF9CV1NyZSwgRlhfQldTeGEsIEZYX0JXU3JlLAorICAgICBGWF9CV1NycywgRlhfQldTcnMsIEZYX0JXU3JldH0sCisgICAge0ZYX0JXU2xvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU2xhLCBGWF9CV1NsZSwgRlhfQldTeGEsIEZYX0JXU2xhLAorICAgICBGWF9CV1NsYywgRlhfQldTbG8sIEZYX0JXU2x0fSwKKyAgICB7RlhfQldTbG8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTbGEsIEZYX0JXU2xlLCBGWF9CV1N4YSwgRlhfQldTbGUsCisgICAgIEZYX0JXU2xzLCBGWF9CV1NscywgRlhfQldTbGV0fSwKKyAgICB7RlhfQldTYW8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTY24sIEZYX0JXU2NuLCBGWF9CV1N4YSwgRlhfQldTYW8sCisgICAgIEZYX0JXU2FvLCBGWF9CV1NhbywgRlhfQldTYW99LAorICAgIHtGWF9CV1NybywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NyYSwgRlhfQldTcmUsIEZYX0JXU3hhLCBGWF9CV1NybywKKyAgICAgRlhfQldTcm8sIEZYX0JXU3JvLCBGWF9CV1NydH0sCisgICAge0ZYX0JXU3JvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU3JhLCBGWF9CV1NyZSwgRlhfQldTeGEsIEZYX0JXU3JvLAorICAgICBGWF9CV1NybywgRlhfQldTcm8sIEZYX0JXU3J0fSwKKyAgICB7RlhfQldTbG8sIEZYX0JXU3hsLCBGWF9CV1N4ciwgRlhfQldTbGEsIEZYX0JXU2xlLCBGWF9CV1N4YSwgRlhfQldTbG8sCisgICAgIEZYX0JXU2xvLCBGWF9CV1NsbywgRlhfQldTbHR9LAorICAgIHtGWF9CV1NsbywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NsYSwgRlhfQldTbGUsIEZYX0JXU3hhLCBGWF9CV1NsbywKKyAgICAgRlhfQldTbG8sIEZYX0JXU2xvLCBGWF9CV1NsdH0sCisgICAge0ZYX0JXU3JvLCBGWF9CV1N4bCwgRlhfQldTeHIsIEZYX0JXU3JhLCBGWF9CV1NyZSwgRlhfQldTeGEsIEZYX0JXU3JldCwKKyAgICAgRlhfQldTcm8sIEZYX0JXU3JvLCBGWF9CV1NyZXR9LAorICAgIHtGWF9CV1NsbywgRlhfQldTeGwsIEZYX0JXU3hyLCBGWF9CV1NsYSwgRlhfQldTbGUsIEZYX0JXU3hhLCBGWF9CV1NsZXQsCisgICAgIEZYX0JXU2xvLCBGWF9CV1NsbywgRlhfQldTbGV0fSwKK307CisKK2NvbnN0IGludDMyX3QgZ2NfRlhfQmlkaVdlYWtBY3Rpb25zW11bMTBdID0geworICAgIHtGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4QSwgRlhfQldBeHhSLAorICAgICBGWF9CV0F4eFIsIEZYX0JXQXh4TiwgRlhfQldBeHhOLCBGWF9CV0F4eE59LAorICAgIHtGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4RSwgRlhfQldBeHhSLAorICAgICBGWF9CV0F4eFIsIEZYX0JXQXh4TiwgRlhfQldBeHhOLCBGWF9CV0F4SXh9LAorICAgIHtGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4TCwgRlhfQldBeHhSLAorICAgICBGWF9CV0F4eEwsIEZYX0JXQXh4TiwgRlhfQldBeHhOLCBGWF9CV0F4SXh9LAorICAgIHtGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4QSwgRlhfQldBeHhSLAorICAgICBGWF9CV0F4eE4sIEZYX0JXQXh4TiwgRlhfQldBeHhOLCBGWF9CV0F4eE59LAorICAgIHtGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4RSwgRlhfQldBeHhSLAorICAgICBGWF9CV0F4eE4sIEZYX0JXQXh4TiwgRlhfQldBeHhOLCBGWF9CV0F4SXh9LAorICAgIHtGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4TCwgRlhfQldBeHhSLAorICAgICBGWF9CV0F4eE4sIEZYX0JXQXh4TiwgRlhfQldBeHhOLCBGWF9CV0F4SXh9LAorICAgIHtGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQUV4RSwgRlhfQldBTnhSLAorICAgICBGWF9CV0F4SXgsIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0F4SXh9LAorICAgIHtGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQUx4TCwgRlhfQldBTnhSLAorICAgICBGWF9CV0F4SXgsIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0F4SXh9LAorICAgIHtGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4QSwgRlhfQldBeHhSLAorICAgICBGWF9CV0F4eEEsIEZYX0JXQXhJeCwgRlhfQldBeHhOLCBGWF9CV0F4eE59LAorICAgIHtGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4RSwgRlhfQldBeHhSLAorICAgICBGWF9CV0F4eEEsIEZYX0JXQXhJeCwgRlhfQldBeHhOLCBGWF9CV0F4SXh9LAorICAgIHtGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4RSwgRlhfQldBeHhSLAorICAgICBGWF9CV0F4eEUsIEZYX0JXQXhJeCwgRlhfQldBeEl4LCBGWF9CV0F4eEV9LAorICAgIHtGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4TCwgRlhfQldBeHhSLAorICAgICBGWF9CV0F4eEEsIEZYX0JXQXhJeCwgRlhfQldBeHhOLCBGWF9CV0F4SXh9LAorICAgIHtGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4TCwgRlhfQldBeHhSLAorICAgICBGWF9CV0F4eEwsIEZYX0JXQXhJeCwgRlhfQldBeEl4LCBGWF9CV0F4eEx9LAorICAgIHtGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FBeHgsIEZYX0JXQUF4QSwgRlhfQldBTnhSLAorICAgICBGWF9CV0FOeE4sIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0FOeE59LAorICAgIHtGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FBeHgsIEZYX0JXQU54RSwgRlhfQldBTnhSLAorICAgICBGWF9CV0FOeE4sIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0FOSXh9LAorICAgIHtGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQUV4RSwgRlhfQldBTnhSLAorICAgICBGWF9CV0FOeE4sIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0FOSXh9LAorICAgIHtGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FBeHgsIEZYX0JXQU54TCwgRlhfQldBTnhSLAorICAgICBGWF9CV0FOeE4sIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0FOSXh9LAorICAgIHtGWF9CV0FOeHgsIEZYX0JXQU54eCwgRlhfQldBTnh4LCBGWF9CV0FOeHgsIEZYX0JXQUx4TCwgRlhfQldBTnhSLAorICAgICBGWF9CV0FOeE4sIEZYX0JXQU54TiwgRlhfQldBTnhOLCBGWF9CV0FOSXh9LAorICAgIHtGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4RSwgRlhfQldBeHhSLAorICAgICBGWF9CV0F4eEUsIEZYX0JXQXh4TiwgRlhfQldBeHhOLCBGWF9CV0F4eEV9LAorICAgIHtGWF9CV0F4eHgsIEZYX0JXQXh4eCwgRlhfQldBeHh4LCBGWF9CV0F4eHgsIEZYX0JXQXh4TCwgRlhfQldBeHhSLAorICAgICBGWF9CV0F4eEwsIEZYX0JXQXh4TiwgRlhfQldBeHhOLCBGWF9CV0F4eEx9LAorfTsKKworY29uc3QgaW50MzJfdCBnY19GWF9CaWRpTmV1dHJhbFN0YXRlc1tdWzVdID0geworICAgIHtGWF9CTlNybiwgRlhfQk5TbCwgRlhfQk5TciwgRlhfQk5TciwgRlhfQk5Tcn0sCisgICAge0ZYX0JOU2xuLCBGWF9CTlNsLCBGWF9CTlNyLCBGWF9CTlNhLCBGWF9CTlNsfSwKKyAgICB7RlhfQk5Tcm4sIEZYX0JOU2wsIEZYX0JOU3IsIEZYX0JOU3IsIEZYX0JOU3J9LAorICAgIHtGWF9CTlNsbiwgRlhfQk5TbCwgRlhfQk5TciwgRlhfQk5TYSwgRlhfQk5TbH0sCisgICAge0ZYX0JOU25hLCBGWF9CTlNsLCBGWF9CTlNyLCBGWF9CTlNhLCBGWF9CTlNsfSwKKyAgICB7RlhfQk5TbmEsIEZYX0JOU2wsIEZYX0JOU3IsIEZYX0JOU2EsIEZYX0JOU2x9LAorfTsKK2NvbnN0IGludDMyX3QgZ2NfRlhfQmlkaU5ldXRyYWxBY3Rpb25zW11bNV0gPSB7CisgICAge0ZYX0JOQUluLCAwLCAwLCAwLCAwfSwKKyAgICB7RlhfQk5BSW4sIDAsIDAsIDAsIEZYX0JJRElDTEFTU19MfSwKKyAgICB7RlhfQk5BSW4sIEZYX0JOQUVuLCBGWF9CTkFSbiwgRlhfQk5BUm4sIEZYX0JOQVJufSwKKyAgICB7RlhfQk5BSW4sIEZYX0JOQUxuLCBGWF9CTkFFbiwgRlhfQk5BRW4sIEZYX0JOQUxuTH0sCisgICAge0ZYX0JOQUluLCAwLCAwLCAwLCBGWF9CSURJQ0xBU1NfTH0sCisgICAge0ZYX0JOQUluLCBGWF9CTkFFbiwgRlhfQk5BUm4sIEZYX0JOQVJuLCBGWF9CTkFFbn0sCit9OworCitjb25zdCBpbnQzMl90IGdjX0ZYX0JpZGlBZGRMZXZlbFtdWzRdID0geworICAgIHswLCAxLCAyLCAyfSwKKyAgICB7MSwgMCwgMSwgMX0sCit9OworCitjbGFzcyBDRlhfQmlkaUxpbmUgeworIHB1YmxpYzoKKyAgdm9pZCBCaWRpTGluZShzdGQ6OnZlY3RvcjxDRlhfQ2hhcj4qIGNoYXJzLCBzaXplX3QgaUNvdW50KSB7CisgICAgQVNTRVJUKGlDb3VudCA8PSBjaGFycy0+c2l6ZSgpKTsKKyAgICBpZiAoaUNvdW50IDwgMikKKyAgICAgIHJldHVybjsKKworICAgIENsYXNzaWZ5KGNoYXJzLCBpQ291bnQsIGZhbHNlKTsKKyAgICBSZXNvbHZlRXhwbGljaXQoY2hhcnMsIGlDb3VudCk7CisgICAgUmVzb2x2ZVdlYWsoY2hhcnMsIGlDb3VudCk7CisgICAgUmVzb2x2ZU5ldXRyYWxzKGNoYXJzLCBpQ291bnQpOworICAgIFJlc29sdmVJbXBsaWNpdChjaGFycywgaUNvdW50KTsKKyAgICBDbGFzc2lmeShjaGFycywgaUNvdW50LCB0cnVlKTsKKyAgICBSZXNvbHZlV2hpdGVzcGFjZShjaGFycywgaUNvdW50KTsKKyAgICBSZW9yZGVyKGNoYXJzLCBpQ291bnQpOworICAgIFBvc2l0aW9uKGNoYXJzLCBpQ291bnQpOworICB9CisKKyBwcml2YXRlOgorICBpbnQzMl90IERpcmVjdGlvbihpbnQzMl90IHZhbCkgeworICAgIHJldHVybiBGWF9Jc09kZCh2YWwpID8gRlhfQklESUNMQVNTX1IgOiBGWF9CSURJQ0xBU1NfTDsKKyAgfQorCisgIGludDMyX3QgR2V0RGVmZXJyZWRUeXBlKGludDMyX3QgdmFsKSB7IHJldHVybiAodmFsID4+IDQpICYgMHgwRjsgfQorCisgIGludDMyX3QgR2V0UmVzb2x2ZWRUeXBlKGludDMyX3QgdmFsKSB7IHJldHVybiB2YWwgJiAweDBGOyB9CisKKyAgaW50MzJfdCBHZXREZWZlcnJlZE5ldXRyYWxzKGludDMyX3QgaUFjdGlvbiwgaW50MzJfdCBpTGV2ZWwpIHsKKyAgICBpQWN0aW9uID0gKGlBY3Rpb24gPj4gNCkgJiAweEY7CisgICAgaWYgKGlBY3Rpb24gPT0gKEZYX0JOQUVuID4+IDQpKQorICAgICAgcmV0dXJuIERpcmVjdGlvbihpTGV2ZWwpOworICAgIHJldHVybiBpQWN0aW9uOworICB9CisKKyAgaW50MzJfdCBHZXRSZXNvbHZlZE5ldXRyYWxzKGludDMyX3QgaUFjdGlvbikgeworICAgIGlBY3Rpb24gJj0gMHhGOworICAgIHJldHVybiBpQWN0aW9uID09IEZYX0JOQUluID8gMCA6IGlBY3Rpb247CisgIH0KKworICB2b2lkIFJldmVyc2VTdHJpbmcoc3RkOjp2ZWN0b3I8Q0ZYX0NoYXI+KiBjaGFycywKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaUNvdW50KSB7CisgICAgQVNTRVJUKHBkZml1bTo6SW5kZXhJbkJvdW5kcygqY2hhcnMsIGlTdGFydCkpOworICAgIEFTU0VSVChpU3RhcnQgKyBpQ291bnQgPD0gY2hhcnMtPnNpemUoKSk7CisKKyAgICBzdGQ6OnJldmVyc2UoY2hhcnMtPmJlZ2luKCkgKyBpU3RhcnQsIGNoYXJzLT5iZWdpbigpICsgaVN0YXJ0ICsgaUNvdW50KTsKKyAgfQorCisgIHZvaWQgU2V0RGVmZXJyZWRSdW4oc3RkOjp2ZWN0b3I8Q0ZYX0NoYXI+KiBjaGFycywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWUpIHsKKyAgICBBU1NFUlQoaVN0YXJ0IDw9IGNoYXJzLT5zaXplKCkpOworICAgIEFTU0VSVChpU3RhcnQgPj0gaUNvdW50KTsKKworICAgIHNpemVfdCBpTGFzdCA9IGlTdGFydCAtIGlDb3VudDsKKyAgICBmb3IgKHNpemVfdCBpID0gaVN0YXJ0IC0gMTsgaSA+PSBpTGFzdDsgLS1pKSB7CisgICAgICBpZiAoYkNsYXNzKQorICAgICAgICAoKmNoYXJzKVtpXS5tX2lCaWRpQ2xhc3MgPSBzdGF0aWNfY2FzdDxpbnQxNl90PihpVmFsdWUpOworICAgICAgZWxzZQorICAgICAgICAoKmNoYXJzKVtpXS5tX2lCaWRpTGV2ZWwgPSBzdGF0aWNfY2FzdDxpbnQxNl90PihpVmFsdWUpOworCisgICAgICBpZiAoaSA9PSAwKQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICB2b2lkIENsYXNzaWZ5KHN0ZDo6dmVjdG9yPENGWF9DaGFyPiogY2hhcnMsIHNpemVfdCBpQ291bnQsIGJvb2wgYldTKSB7CisgICAgaWYgKGJXUykgeworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpQ291bnQ7ICsraSkgeworICAgICAgICBDRlhfQ2hhciYgY3VyID0gKCpjaGFycylbaV07CisgICAgICAgIGN1ci5tX2lCaWRpQ2xhc3MgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MTZfdD4oY3VyLmNoYXJfcHJvcHMoKSAmIEZYX0JJRElDTEFTU0JJVFNNQVNLKSA+PgorICAgICAgICAgICAgRlhfQklESUNMQVNTQklUUzsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlDb3VudDsgKytpKSB7CisgICAgICBDRlhfQ2hhciYgY3VyID0gKCpjaGFycylbaV07CisgICAgICBjdXIubV9pQmlkaUNsYXNzID0gc3RhdGljX2Nhc3Q8aW50MTZfdD4oCisgICAgICAgICAgZ2NfRlhfQmlkaU5UeXBlc1soY3VyLmNoYXJfcHJvcHMoKSAmIEZYX0JJRElDTEFTU0JJVFNNQVNLKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQklESUNMQVNTQklUU10pOworICAgIH0KKyAgfQorCisgIHZvaWQgUmVzb2x2ZUV4cGxpY2l0KHN0ZDo6dmVjdG9yPENGWF9DaGFyPiogY2hhcnMsIHNpemVfdCBpQ291bnQpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlDb3VudDsgKytpKQorICAgICAgKCpjaGFycylbaV0ubV9pQmlkaUxldmVsID0gMDsKKyAgfQorCisgIHZvaWQgUmVzb2x2ZVdlYWsoc3RkOjp2ZWN0b3I8Q0ZYX0NoYXI+KiBjaGFycywgc2l6ZV90IGlDb3VudCkgeworICAgIGlmIChpQ291bnQgPD0gMSkKKyAgICAgIHJldHVybjsKKyAgICAtLWlDb3VudDsKKworICAgIGludDMyX3QgaUxldmVsQ3VyID0gMDsKKyAgICBpbnQzMl90IGlTdGF0ZSA9IEZYX0JXU3hsOworICAgIHNpemVfdCBpID0gMDsKKyAgICBzaXplX3QgaU51bSA9IDA7CisgICAgaW50MzJfdCBpQ2xzQ3VyOworICAgIGludDMyX3QgaUNsc1J1bjsKKyAgICBpbnQzMl90IGlDbHNOZXc7CisgICAgaW50MzJfdCBpQWN0aW9uOworICAgIGZvciAoOyBpIDw9IGlDb3VudDsgKytpKSB7CisgICAgICBDRlhfQ2hhciogcFRDID0gJigqY2hhcnMpW2ldOworICAgICAgaUNsc0N1ciA9IHBUQy0+bV9pQmlkaUNsYXNzOworICAgICAgaWYgKGlDbHNDdXIgPT0gRlhfQklESUNMQVNTX0JOKSB7CisgICAgICAgIHBUQy0+bV9pQmlkaUxldmVsID0gKGludDE2X3QpaUxldmVsQ3VyOworICAgICAgICBpZiAoaSA9PSBpQ291bnQgJiYgaUxldmVsQ3VyICE9IDApIHsKKyAgICAgICAgICBpQ2xzQ3VyID0gRGlyZWN0aW9uKGlMZXZlbEN1cik7CisgICAgICAgICAgcFRDLT5tX2lCaWRpQ2xhc3MgPSAoaW50MTZfdClpQ2xzQ3VyOworICAgICAgICB9IGVsc2UgaWYgKGkgPCBpQ291bnQpIHsKKyAgICAgICAgICBDRlhfQ2hhciogcFRDTmV4dCA9ICYoKmNoYXJzKVtpICsgMV07CisgICAgICAgICAgaW50MzJfdCBpTGV2ZWxOZXh0LCBpTGV2ZWxOZXc7CisgICAgICAgICAgaUNsc05ldyA9IHBUQ05leHQtPm1faUJpZGlDbGFzczsKKyAgICAgICAgICBpTGV2ZWxOZXh0ID0gcFRDTmV4dC0+bV9pQmlkaUxldmVsOworICAgICAgICAgIGlmIChpQ2xzTmV3ICE9IEZYX0JJRElDTEFTU19CTiAmJiBpTGV2ZWxDdXIgIT0gaUxldmVsTmV4dCkgeworICAgICAgICAgICAgaUxldmVsTmV3ID0gc3RkOjptYXgoaUxldmVsTmV4dCwgaUxldmVsQ3VyKTsKKyAgICAgICAgICAgIHBUQy0+bV9pQmlkaUxldmVsID0gc3RhdGljX2Nhc3Q8aW50MTZfdD4oaUxldmVsTmV3KTsKKyAgICAgICAgICAgIGlDbHNDdXIgPSBEaXJlY3Rpb24oaUxldmVsTmV3KTsKKyAgICAgICAgICAgIHBUQy0+bV9pQmlkaUNsYXNzID0gc3RhdGljX2Nhc3Q8aW50MTZfdD4oaUNsc0N1cik7CisgICAgICAgICAgICBpTGV2ZWxDdXIgPSBpTGV2ZWxOZXh0OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaU51bSA+IDApCisgICAgICAgICAgICAgICsraU51bTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoaU51bSA+IDApCisgICAgICAgICAgICArK2lOdW07CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgQVNTRVJUKGlDbHNDdXIgPD0gRlhfQklESUNMQVNTX0JOKTsKKyAgICAgIGlBY3Rpb24gPSBnY19GWF9CaWRpV2Vha0FjdGlvbnNbaVN0YXRlXVtpQ2xzQ3VyXTsKKyAgICAgIGlDbHNSdW4gPSBHZXREZWZlcnJlZFR5cGUoaUFjdGlvbik7CisgICAgICBpZiAoaUNsc1J1biAhPSBGWF9CV0FYWCAmJiBpTnVtID4gMCkgeworICAgICAgICBTZXREZWZlcnJlZFJ1bihjaGFycywgdHJ1ZSwgaSwgaU51bSwgaUNsc1J1bik7CisgICAgICAgIGlOdW0gPSAwOworICAgICAgfQorICAgICAgaUNsc05ldyA9IEdldFJlc29sdmVkVHlwZShpQWN0aW9uKTsKKyAgICAgIGlmIChpQ2xzTmV3ICE9IEZYX0JXQVhYKQorICAgICAgICBwVEMtPm1faUJpZGlDbGFzcyA9IHN0YXRpY19jYXN0PGludDE2X3Q+KGlDbHNOZXcpOworICAgICAgaWYgKEZYX0JXQUlYICYgaUFjdGlvbikKKyAgICAgICAgKytpTnVtOworCisgICAgICBpU3RhdGUgPSBnY19GWF9CaWRpV2Vha1N0YXRlc1tpU3RhdGVdW2lDbHNDdXJdOworICAgIH0KKyAgICBpZiAoaU51bSA9PSAwKQorICAgICAgcmV0dXJuOworCisgICAgaUNsc0N1ciA9IERpcmVjdGlvbigwKTsKKyAgICBpQ2xzUnVuID0gR2V0RGVmZXJyZWRUeXBlKGdjX0ZYX0JpZGlXZWFrQWN0aW9uc1tpU3RhdGVdW2lDbHNDdXJdKTsKKyAgICBpZiAoaUNsc1J1biAhPSBGWF9CV0FYWCkKKyAgICAgIFNldERlZmVycmVkUnVuKGNoYXJzLCB0cnVlLCBpLCBpTnVtLCBpQ2xzUnVuKTsKKyAgfQorCisgIHZvaWQgUmVzb2x2ZU5ldXRyYWxzKHN0ZDo6dmVjdG9yPENGWF9DaGFyPiogY2hhcnMsIHNpemVfdCBpQ291bnQpIHsKKyAgICBpZiAoaUNvdW50IDw9IDEpCisgICAgICByZXR1cm47CisgICAgLS1pQ291bnQ7CisKKyAgICBDRlhfQ2hhciogcFRDOworICAgIGludDMyX3QgaUxldmVsID0gMDsKKyAgICBpbnQzMl90IGlTdGF0ZSA9IEZYX0JOU2w7CisgICAgc2l6ZV90IGkgPSAwOworICAgIHNpemVfdCBpTnVtID0gMDsKKyAgICBpbnQzMl90IGlDbHNDdXI7CisgICAgaW50MzJfdCBpQ2xzUnVuOworICAgIGludDMyX3QgaUNsc05ldzsKKyAgICBpbnQzMl90IGlBY3Rpb247CisgICAgZm9yICg7IGkgPD0gaUNvdW50OyArK2kpIHsKKyAgICAgIHBUQyA9ICYoKmNoYXJzKVtpXTsKKyAgICAgIGlDbHNDdXIgPSBwVEMtPm1faUJpZGlDbGFzczsKKyAgICAgIGlmIChpQ2xzQ3VyID09IEZYX0JJRElDTEFTU19CTikgeworICAgICAgICBpZiAoaU51bSkKKyAgICAgICAgICArK2lOdW07CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICBBU1NFUlQoaUNsc0N1ciA8IEZYX0JJRElDTEFTU19BTCk7CisgICAgICBpQWN0aW9uID0gZ2NfRlhfQmlkaU5ldXRyYWxBY3Rpb25zW2lTdGF0ZV1baUNsc0N1cl07CisgICAgICBpQ2xzUnVuID0gR2V0RGVmZXJyZWROZXV0cmFscyhpQWN0aW9uLCBpTGV2ZWwpOworICAgICAgaWYgKGlDbHNSdW4gIT0gRlhfQklESUNMQVNTX04gJiYgaU51bSA+IDApIHsKKyAgICAgICAgU2V0RGVmZXJyZWRSdW4oY2hhcnMsIHRydWUsIGksIGlOdW0sIGlDbHNSdW4pOworICAgICAgICBpTnVtID0gMDsKKyAgICAgIH0KKworICAgICAgaUNsc05ldyA9IEdldFJlc29sdmVkTmV1dHJhbHMoaUFjdGlvbik7CisgICAgICBpZiAoaUNsc05ldyAhPSBGWF9CSURJQ0xBU1NfTikKKyAgICAgICAgcFRDLT5tX2lCaWRpQ2xhc3MgPSAoaW50MTZfdClpQ2xzTmV3OworICAgICAgaWYgKEZYX0JOQUluICYgaUFjdGlvbikKKyAgICAgICAgKytpTnVtOworCisgICAgICBpU3RhdGUgPSBnY19GWF9CaWRpTmV1dHJhbFN0YXRlc1tpU3RhdGVdW2lDbHNDdXJdOworICAgICAgaUxldmVsID0gcFRDLT5tX2lCaWRpTGV2ZWw7CisgICAgfQorICAgIGlmIChpTnVtID09IDApCisgICAgICByZXR1cm47CisKKyAgICBpQ2xzQ3VyID0gRGlyZWN0aW9uKGlMZXZlbCk7CisgICAgaUNsc1J1biA9CisgICAgICAgIEdldERlZmVycmVkTmV1dHJhbHMoZ2NfRlhfQmlkaU5ldXRyYWxBY3Rpb25zW2lTdGF0ZV1baUNsc0N1cl0sIGlMZXZlbCk7CisgICAgaWYgKGlDbHNSdW4gIT0gRlhfQklESUNMQVNTX04pCisgICAgICBTZXREZWZlcnJlZFJ1bihjaGFycywgdHJ1ZSwgaSwgaU51bSwgaUNsc1J1bik7CisgIH0KKworICB2b2lkIFJlc29sdmVJbXBsaWNpdChzdGQ6OnZlY3RvcjxDRlhfQ2hhcj4qIGNoYXJzLCBzaXplX3QgaUNvdW50KSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpQ291bnQ7ICsraSkgeworICAgICAgaW50MzJfdCBpQ2xzID0gKCpjaGFycylbaV0ubV9pQmlkaUNsYXNzOworICAgICAgaWYgKGlDbHMgPT0gRlhfQklESUNMQVNTX0JOKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgQVNTRVJUKGlDbHMgPiBGWF9CSURJQ0xBU1NfT04gJiYgaUNscyA8IEZYX0JJRElDTEFTU19BTCk7CisgICAgICBpbnQzMl90IGlMZXZlbCA9ICgqY2hhcnMpW2ldLm1faUJpZGlMZXZlbDsKKyAgICAgIGlMZXZlbCArPSBnY19GWF9CaWRpQWRkTGV2ZWxbRlhfSXNPZGQoaUxldmVsKV1baUNscyAtIDFdOworICAgICAgKCpjaGFycylbaV0ubV9pQmlkaUxldmVsID0gKGludDE2X3QpaUxldmVsOworICAgIH0KKyAgfQorCisgIHZvaWQgUmVzb2x2ZVdoaXRlc3BhY2Uoc3RkOjp2ZWN0b3I8Q0ZYX0NoYXI+KiBjaGFycywgc2l6ZV90IGlDb3VudCkgeworICAgIGlmIChpQ291bnQgPD0gMSkKKyAgICAgIHJldHVybjsKKyAgICBpQ291bnQtLTsKKworICAgIGludDMyX3QgaUxldmVsID0gMDsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgc2l6ZV90IGlOdW0gPSAwOworICAgIGZvciAoOyBpIDw9IGlDb3VudDsgKytpKSB7CisgICAgICBzd2l0Y2ggKCgqY2hhcnMpW2ldLm1faUJpZGlDbGFzcykgeworICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19XUzoKKyAgICAgICAgICArK2lOdW07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX1JMRToKKyAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfTFJFOgorICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19MUk86CisgICAgICAgIGNhc2UgRlhfQklESUNMQVNTX1JMTzoKKyAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfUERGOgorICAgICAgICBjYXNlIEZYX0JJRElDTEFTU19CTjoKKyAgICAgICAgICAoKmNoYXJzKVtpXS5tX2lCaWRpTGV2ZWwgPSBzdGF0aWNfY2FzdDxpbnQxNl90PihpTGV2ZWwpOworICAgICAgICAgICsraU51bTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfUzoKKyAgICAgICAgY2FzZSBGWF9CSURJQ0xBU1NfQjoKKyAgICAgICAgICBpZiAoaU51bSA+IDApCisgICAgICAgICAgICBTZXREZWZlcnJlZFJ1bihjaGFycywgZmFsc2UsIGksIGlOdW0sIDApOworCisgICAgICAgICAgKCpjaGFycylbaV0ubV9pQmlkaUxldmVsID0gMDsKKyAgICAgICAgICBpTnVtID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBpTnVtID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlMZXZlbCA9ICgqY2hhcnMpW2ldLm1faUJpZGlMZXZlbDsKKyAgICB9CisgICAgaWYgKGlOdW0gPiAwKQorICAgICAgU2V0RGVmZXJyZWRSdW4oY2hhcnMsIGZhbHNlLCBpLCBpTnVtLCAwKTsKKyAgfQorCisgIHNpemVfdCBSZW9yZGVyTGV2ZWwoc3RkOjp2ZWN0b3I8Q0ZYX0NoYXI+KiBjaGFycywKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJhc2VMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJldmVyc2UpIHsKKyAgICBBU1NFUlQoaUJhc2VMZXZlbCA+PSAwICYmIGlCYXNlTGV2ZWwgPD0ga0JpZGlNYXhMZXZlbCk7CisgICAgQVNTRVJUKGlTdGFydCA8IGlDb3VudCk7CisKKyAgICBpZiAoaUNvdW50IDwgMSkKKyAgICAgIHJldHVybiAwOworCisgICAgYlJldmVyc2UgPSBiUmV2ZXJzZSB8fCBGWF9Jc09kZChpQmFzZUxldmVsKTsKKyAgICBzaXplX3QgaSA9IGlTdGFydDsKKyAgICBmb3IgKDsgaSA8IGlDb3VudDsgKytpKSB7CisgICAgICBpbnQzMl90IGlMZXZlbCA9ICgqY2hhcnMpW2ldLm1faUJpZGlMZXZlbDsKKyAgICAgIGlmIChpTGV2ZWwgPT0gaUJhc2VMZXZlbCkKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAoaUxldmVsIDwgaUJhc2VMZXZlbCkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGkgKz0gUmVvcmRlckxldmVsKGNoYXJzLCBpQ291bnQsIGlCYXNlTGV2ZWwgKyAxLCBpLCBiUmV2ZXJzZSkgLSAxOworICAgIH0KKworICAgIHNpemVfdCBpTnVtID0gaSAtIGlTdGFydDsKKyAgICBpZiAoYlJldmVyc2UgJiYgaU51bSA+IDEpCisgICAgICBSZXZlcnNlU3RyaW5nKGNoYXJzLCBpU3RhcnQsIGlOdW0pOworCisgICAgcmV0dXJuIGlOdW07CisgIH0KKworICB2b2lkIFJlb3JkZXIoc3RkOjp2ZWN0b3I8Q0ZYX0NoYXI+KiBjaGFycywgc2l6ZV90IGlDb3VudCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaUNvdW50OykKKyAgICAgIGkgKz0gUmVvcmRlckxldmVsKGNoYXJzLCBpQ291bnQsIDAsIGksIGZhbHNlKTsKKyAgfQorCisgIHZvaWQgUG9zaXRpb24oc3RkOjp2ZWN0b3I8Q0ZYX0NoYXI+KiBjaGFycywgc2l6ZV90IGlDb3VudCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaUNvdW50OyArK2kpCisgICAgICAoKmNoYXJzKVsoKmNoYXJzKVtpXS5tX2lCaWRpUG9zXS5tX2lCaWRpT3JkZXIgPSBpOworICB9Cit9OworCisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKK30gIC8vIG5hbWVzcGFjZQorCiBDRlhfQmlkaUNoYXI6OkNGWF9CaWRpQ2hhcigpCiAgICAgOiBtX0N1cnJlbnRTZWdtZW50KHswLCAwLCBORVVUUkFMfSksIG1fTGFzdFNlZ21lbnQoezAsIDAsIE5FVVRSQUx9KSB7fQogCi1ib29sIENGWF9CaWRpQ2hhcjo6QXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpIHsKK2Jvb2wgQ0ZYX0JpZGlDaGFyOjpBcHBlbmRDaGFyKHdjaGFyX3Qgd2NoKSB7CiAgIHVpbnQzMl90IGR3UHJvcHMgPSBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3Y2gpOwogICBpbnQzMl90IGlCaWRpQ2xzID0gKGR3UHJvcHMgJiBGWF9CSURJQ0xBU1NCSVRTTUFTSykgPj4gRlhfQklESUNMQVNTQklUUzsKICAgRGlyZWN0aW9uIGRpcmVjdGlvbiA9IE5FVVRSQUw7CkBAIC00OCwxMiArNTc3LDEyIEBACiAgIG1fQ3VycmVudFNlZ21lbnQuZGlyZWN0aW9uID0gZGlyZWN0aW9uOwogfQogCi1DRlhfQmlkaVN0cmluZzo6Q0ZYX0JpZGlTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikKK0NGWF9CaWRpU3RyaW5nOjpDRlhfQmlkaVN0cmluZyhjb25zdCBXaWRlU3RyaW5nJiBzdHIpCiAgICAgOiBtX1N0cihzdHIpLAotICAgICAgbV9wQmlkaUNoYXIobmV3IENGWF9CaWRpQ2hhciksCisgICAgICBtX3BCaWRpQ2hhcihwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0JpZGlDaGFyPigpKSwKICAgICAgIG1fZU92ZXJhbGxEaXJlY3Rpb24oQ0ZYX0JpZGlDaGFyOjpMRUZUKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbV9TdHIuR2V0TGVuZ3RoKCk7ICsraSkgewotICAgIGlmIChtX3BCaWRpQ2hhci0+QXBwZW5kQ2hhcihtX1N0ci5HZXRBdChpKSkpCisgIGZvciAoY29uc3QgYXV0byYgYyA6IG1fU3RyKSB7CisgICAgaWYgKG1fcEJpZGlDaGFyLT5BcHBlbmRDaGFyKGMpKQogICAgICAgbV9PcmRlci5wdXNoX2JhY2sobV9wQmlkaUNoYXItPkdldFNlZ21lbnRJbmZvKCkpOwogICB9CiAgIGlmIChtX3BCaWRpQ2hhci0+RW5kQ2hhcigpKQpAQCAtODEsMyArNjEwLDEwIEBACiAgICAgbV9lT3ZlcmFsbERpcmVjdGlvbiA9IENGWF9CaWRpQ2hhcjo6UklHSFQ7CiAgIH0KIH0KKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCit2b2lkIEZYX0JpZGlMaW5lKHN0ZDo6dmVjdG9yPENGWF9DaGFyPiogY2hhcnMsIHNpemVfdCBpQ291bnQpIHsKKyAgQ0ZYX0JpZGlMaW5lIGJsdDsKKyAgYmx0LkJpZGlMaW5lKGNoYXJzLCBpQ291bnQpOworfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF9iaWRpLmggYi9jb3JlL2Z4Y3J0L2Z4X2JpZGkuaAppbmRleCA4ZDEyY2M4Li5hOWI1MmNmIDEwMDY0NAotLS0gYS9jb3JlL2Z4Y3J0L2Z4X2JpZGkuaAorKysgYi9jb3JlL2Z4Y3J0L2Z4X2JpZGkuaApAQCAtMTMsNiArMTMsMTAgQEAKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCiAKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X2NoYXIuaCIKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKwogLy8gUHJvY2Vzc2VzIGNoYXJhY3RlcnMgYW5kIGdyb3VwIHRoZW0gaW50byBzZWdtZW50cyBiYXNlZCBvbiB0ZXh0IGRpcmVjdGlvbi4KIGNsYXNzIENGWF9CaWRpQ2hhciB7CiAgcHVibGljOgpAQCAtMjgsNyArMzIsNyBAQAogICAvLyBBcHBlbmQgYSBjaGFyYWN0ZXIgYW5kIGNsYXNzaWZ5IGl0IGFzIGxlZnQsIHJpZ2h0LCBvciBuZXV0cmFsLgogICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBoYXMgYSBkaWZmZXJlbnQgZGlyZWN0aW9uIHRoYW4gdGhlCiAgIC8vIGV4aXN0aW5nIGRpcmVjdGlvbiB0byBpbmRpY2F0ZSB0aGVyZSBpcyBhIHNlZ21lbnQgdG8gcHJvY2Vzcy4KLSAgYm9vbCBBcHBlbmRDaGFyKEZYX1dDSEFSIHdjaCk7CisgIGJvb2wgQXBwZW5kQ2hhcih3Y2hhcl90IHdjaCk7CiAKICAgLy8gQ2FsbCB0aGlzIGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciBoYXMgYmVlbiBhcHBlbmRlZC4gQXBwZW5kQ2hhcigpCiAgIC8vIG11c3Qgbm90IGJlIGNhbGxlZCBhZnRlciB0aGlzLgpAQCAtNTAsNyArNTQsNyBAQAogIHB1YmxpYzoKICAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBzdGQ6OnZlY3RvcjxDRlhfQmlkaUNoYXI6OlNlZ21lbnQ+Ojpjb25zdF9pdGVyYXRvcjsKIAotICBleHBsaWNpdCBDRlhfQmlkaVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKTsKKyAgZXhwbGljaXQgQ0ZYX0JpZGlTdHJpbmcoY29uc3QgV2lkZVN0cmluZyYgc3RyKTsKICAgfkNGWF9CaWRpU3RyaW5nKCk7CiAKICAgLy8gT3ZlcmFsbCBkaXJlY3Rpb24gaXMgYWx3YXlzIExFRlQgb3IgUklHSFQsIG5ldmVyIE5FVVRSQUwuCkBAIC02MSwxNSArNjUsMTkgQEAKICAgLy8gRm9yY2UgdGhlIG92ZXJhbGwgZGlyZWN0aW9uIHRvIGJlIFIyTCByZWdhcmRsZXNzIG9mIHdoYXQgd2FzIGRldGVjdGVkLgogICB2b2lkIFNldE92ZXJhbGxEaXJlY3Rpb25SaWdodCgpOwogCi0gIEZYX1dDSEFSIENoYXJBdChzaXplX3QgeCkgY29uc3QgeyByZXR1cm4gbV9TdHJbeF07IH0KKyAgd2NoYXJfdCBDaGFyQXQoc2l6ZV90IHgpIGNvbnN0IHsgcmV0dXJuIG1fU3RyW3hdOyB9CiAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gbV9PcmRlci5iZWdpbigpOyB9CiAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIG1fT3JkZXIuZW5kKCk7IH0KIAogIHByaXZhdGU6Ci0gIGNvbnN0IENGWF9XaWRlU3RyaW5nIG1fU3RyOworICBjb25zdCBXaWRlU3RyaW5nIG1fU3RyOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0JpZGlDaGFyPiBtX3BCaWRpQ2hhcjsKICAgc3RkOjp2ZWN0b3I8Q0ZYX0JpZGlDaGFyOjpTZWdtZW50PiBtX09yZGVyOwogICBDRlhfQmlkaUNoYXI6OkRpcmVjdGlvbiBtX2VPdmVyYWxsRGlyZWN0aW9uOwogfTsKIAorI2lmIFBERl9FTkFCTEVfWEZBCit2b2lkIEZYX0JpZGlMaW5lKHN0ZDo6dmVjdG9yPENGWF9DaGFyPiogY2hhcnMsIHNpemVfdCBpQ291bnQpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCiAjZW5kaWYgIC8vIENPUkVfRlhDUlRfRlhfQklESV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF9iaWRpX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnhjcnQvZnhfYmlkaV91bml0dGVzdC5jcHAKaW5kZXggMmMxOTk2Yi4uYWQ1OThhNiAxMDA2NDQKLS0tIGEvY29yZS9meGNydC9meF9iaWRpX3VuaXR0ZXN0LmNwcAorKysgYi9jb3JlL2Z4Y3J0L2Z4X2JpZGlfdW5pdHRlc3QuY3BwCkBAIC03LDkgKzcsOSBAQAogCiBuYW1lc3BhY2UgewogCi1jb25zdCBGWF9XQ0hBUiBrTmV1dHJhbENoYXIgPSAzMjsKLWNvbnN0IEZYX1dDSEFSIGtMZWZ0Q2hhciA9IDY1OwotY29uc3QgRlhfV0NIQVIga1JpZ2h0Q2hhciA9IDE0MjQ7Citjb25zdCB3Y2hhcl90IGtOZXV0cmFsQ2hhciA9IDMyOworY29uc3Qgd2NoYXJfdCBrTGVmdENoYXIgPSA2NTsKK2NvbnN0IHdjaGFyX3Qga1JpZ2h0Q2hhciA9IDE0MjQ7CiAKIH0gIC8vIG5hbWVzcGFjZQogCkBAIC0xMjYsNyArMTI2LDcgQEAKIAogVEVTVChmeGNydCwgQmlkaVN0cmluZ0FsbE5ldXRyYWwpIHsKICAgewotICAgIGNvbnN0IEZYX1dDSEFSIHN0cltdID0ge2tOZXV0cmFsQ2hhciwgMH07CisgICAgY29uc3Qgd2NoYXJfdCBzdHJbXSA9IHtrTmV1dHJhbENoYXIsIDB9OwogICAgIENGWF9CaWRpU3RyaW5nIGJpZGkoc3RyKTsKICAgICBFWFBFQ1RfRVEoQ0ZYX0JpZGlDaGFyOjpMRUZULCBiaWRpLk92ZXJhbGxEaXJlY3Rpb24oKSk7CiAKQEAgLTEzOSw3ICsxMzksNyBAQAogICAgIEVYUEVDVF9UUlVFKGl0ID09IGJpZGkuZW5kKCkpOwogICB9CiAgIHsKLSAgICBjb25zdCBGWF9XQ0hBUiBzdHJbXSA9IHtrTmV1dHJhbENoYXIsIGtOZXV0cmFsQ2hhciwga05ldXRyYWxDaGFyLCAwfTsKKyAgICBjb25zdCB3Y2hhcl90IHN0cltdID0ge2tOZXV0cmFsQ2hhciwga05ldXRyYWxDaGFyLCBrTmV1dHJhbENoYXIsIDB9OwogICAgIENGWF9CaWRpU3RyaW5nIGJpZGkoc3RyKTsKICAgICBFWFBFQ1RfRVEoQ0ZYX0JpZGlDaGFyOjpMRUZULCBiaWRpLk92ZXJhbGxEaXJlY3Rpb24oKSk7CiAKQEAgLTE1NSw3ICsxNTUsNyBAQAogCiBURVNUKGZ4Y3J0LCBCaWRpU3RyaW5nQWxsTGVmdCkgewogICB7Ci0gICAgY29uc3QgRlhfV0NIQVIgc3RyW10gPSB7a0xlZnRDaGFyLCAwfTsKKyAgICBjb25zdCB3Y2hhcl90IHN0cltdID0ge2tMZWZ0Q2hhciwgMH07CiAgICAgQ0ZYX0JpZGlTdHJpbmcgYmlkaShzdHIpOwogICAgIEVYUEVDVF9FUShDRlhfQmlkaUNoYXI6OkxFRlQsIGJpZGkuT3ZlcmFsbERpcmVjdGlvbigpKTsKIApAQCAtMTc2LDcgKzE3Niw3IEBACiAgICAgRVhQRUNUX1RSVUUoaXQgPT0gYmlkaS5lbmQoKSk7CiAgIH0KICAgewotICAgIGNvbnN0IEZYX1dDSEFSIHN0cltdID0ge2tMZWZ0Q2hhciwga0xlZnRDaGFyLCBrTGVmdENoYXIsIDB9OworICAgIGNvbnN0IHdjaGFyX3Qgc3RyW10gPSB7a0xlZnRDaGFyLCBrTGVmdENoYXIsIGtMZWZ0Q2hhciwgMH07CiAgICAgQ0ZYX0JpZGlTdHJpbmcgYmlkaShzdHIpOwogICAgIEVYUEVDVF9FUShDRlhfQmlkaUNoYXI6OkxFRlQsIGJpZGkuT3ZlcmFsbERpcmVjdGlvbigpKTsKIApAQCAtMjAwLDcgKzIwMCw3IEBACiAKIFRFU1QoZnhjcnQsIEJpZGlTdHJpbmdBbGxSaWdodCkgewogICB7Ci0gICAgY29uc3QgRlhfV0NIQVIgc3RyW10gPSB7a1JpZ2h0Q2hhciwgMH07CisgICAgY29uc3Qgd2NoYXJfdCBzdHJbXSA9IHtrUmlnaHRDaGFyLCAwfTsKICAgICBDRlhfQmlkaVN0cmluZyBiaWRpKHN0cik7CiAgICAgRVhQRUNUX0VRKENGWF9CaWRpQ2hhcjo6UklHSFQsIGJpZGkuT3ZlcmFsbERpcmVjdGlvbigpKTsKIApAQCAtMjIxLDcgKzIyMSw3IEBACiAgICAgRVhQRUNUX1RSVUUoaXQgPT0gYmlkaS5lbmQoKSk7CiAgIH0KICAgewotICAgIGNvbnN0IEZYX1dDSEFSIHN0cltdID0ge2tSaWdodENoYXIsIGtSaWdodENoYXIsIGtSaWdodENoYXIsIDB9OworICAgIGNvbnN0IHdjaGFyX3Qgc3RyW10gPSB7a1JpZ2h0Q2hhciwga1JpZ2h0Q2hhciwga1JpZ2h0Q2hhciwgMH07CiAgICAgQ0ZYX0JpZGlTdHJpbmcgYmlkaShzdHIpOwogICAgIEVYUEVDVF9FUShDRlhfQmlkaUNoYXI6OlJJR0hULCBiaWRpLk92ZXJhbGxEaXJlY3Rpb24oKSk7CiAKQEAgLTI0NCw3ICsyNDQsNyBAQAogfQogCiBURVNUKGZ4Y3J0LCBCaWRpU3RyaW5nTGVmdE5ldXRyYWxMZWZ0UmlnaHQpIHsKLSAgY29uc3QgRlhfV0NIQVIgc3RyW10gPSB7a0xlZnRDaGFyLCBrTmV1dHJhbENoYXIsIGtMZWZ0Q2hhciwga1JpZ2h0Q2hhciwgMH07CisgIGNvbnN0IHdjaGFyX3Qgc3RyW10gPSB7a0xlZnRDaGFyLCBrTmV1dHJhbENoYXIsIGtMZWZ0Q2hhciwga1JpZ2h0Q2hhciwgMH07CiAgIENGWF9CaWRpU3RyaW5nIGJpZGkoc3RyKTsKICAgRVhQRUNUX0VRKENGWF9CaWRpQ2hhcjo6TEVGVCwgYmlkaS5PdmVyYWxsRGlyZWN0aW9uKCkpOwogCkBAIC0yODQsNyArMjg0LDcgQEAKIH0KIAogVEVTVChmeGNydCwgQmlkaVN0cmluZ1JpZ2h0TmV1dHJhbExlZnRSaWdodCkgewotICBjb25zdCBGWF9XQ0hBUiBzdHJbXSA9IHtrUmlnaHRDaGFyLCBrTmV1dHJhbENoYXIsIGtMZWZ0Q2hhciwga1JpZ2h0Q2hhciwgMH07CisgIGNvbnN0IHdjaGFyX3Qgc3RyW10gPSB7a1JpZ2h0Q2hhciwga05ldXRyYWxDaGFyLCBrTGVmdENoYXIsIGtSaWdodENoYXIsIDB9OwogICBDRlhfQmlkaVN0cmluZyBiaWRpKHN0cik7CiAgIEVYUEVDVF9FUShDRlhfQmlkaUNoYXI6OlJJR0hULCBiaWRpLk92ZXJhbGxEaXJlY3Rpb24oKSk7CiAKQEAgLTMyNCw3ICszMjQsNyBAQAogfQogCiBURVNUKGZ4Y3J0LCBCaWRpU3RyaW5nUmV2ZXJzZSkgewotICBjb25zdCBGWF9XQ0hBUiBzdHJbXSA9IHtrTGVmdENoYXIsIGtOZXV0cmFsQ2hhciwga1JpZ2h0Q2hhciwga0xlZnRDaGFyLCAwfTsKKyAgY29uc3Qgd2NoYXJfdCBzdHJbXSA9IHtrTGVmdENoYXIsIGtOZXV0cmFsQ2hhciwga1JpZ2h0Q2hhciwga0xlZnRDaGFyLCAwfTsKICAgQ0ZYX0JpZGlTdHJpbmcgYmlkaShzdHIpOwogICBFWFBFQ1RfRVEoQ0ZYX0JpZGlDaGFyOjpMRUZULCBiaWRpLk92ZXJhbGxEaXJlY3Rpb24oKSk7CiAgIGJpZGkuU2V0T3ZlcmFsbERpcmVjdGlvblJpZ2h0KCk7CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Z4X2NvZGVwYWdlLmggYi9jb3JlL2Z4Y3J0L2Z4X2NvZGVwYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0Zjk2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvZnhfY29kZXBhZ2UuaApAQCAtMCwwICsxLDkxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENSVF9GWF9DT0RFUEFHRV9IXworI2RlZmluZSBDT1JFX0ZYQ1JUX0ZYX0NPREVQQUdFX0hfCisKKyNkZWZpbmUgRlhfQ09ERVBBR0VfRGVmQU5TSSAwCisjZGVmaW5lIEZYX0NPREVQQUdFX1N5bWJvbCA0MgorI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19VUyA0MzcKKyNkZWZpbmUgRlhfQ09ERVBBR0VfQXJhYmljX0FTTU83MDggNzA4CisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0dyZWVrMSA3MzcKKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfQmFsdGljIDc3NQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19XZXN0ZXJuRXVyb3BlYW4gODUwCisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0Vhc3Rlcm5FdXJvcGVhbiA4NTIKKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfQ3lyaWxsaWMgODU1CisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX1R1cmtpc2ggODU3CisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX1BvcnR1Z3Vlc2UgODYwCisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0ljZWxhbmRpYyA4NjEKKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfSGVicmV3IDg2MgorI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19GcmVuY2hDYW5hZGlhbiA4NjMKKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfQXJhYmljIDg2NAorI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19Ob3J3ZWdpYW4gODY1CisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX1J1c3NpYW4gODY2CisjZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0dyZWVrMiA4NjkKKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfVGhhaSA4NzQKKyNkZWZpbmUgRlhfQ09ERVBBR0VfU2hpZnRKSVMgOTMyCisjZGVmaW5lIEZYX0NPREVQQUdFX0NoaW5lc2VTaW1wbGlmaWVkIDkzNgorI2RlZmluZSBGWF9DT0RFUEFHRV9IYW5ndWwgOTQ5CisjZGVmaW5lIEZYX0NPREVQQUdFX0NoaW5lc2VUcmFkaXRpb25hbCA5NTAKKyNkZWZpbmUgRlhfQ09ERVBBR0VfVVRGMTZMRSAxMjAwCisjZGVmaW5lIEZYX0NPREVQQUdFX1VURjE2QkUgMTIwMQorI2RlZmluZSBGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW4gMTI1MAorI2RlZmluZSBGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpYyAxMjUxCisjZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbiAxMjUyCisjZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX0dyZWVrIDEyNTMKKyNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW5fVHVya2lzaCAxMjU0CisjZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX0hlYnJldyAxMjU1CisjZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX0FyYWJpYyAxMjU2CisjZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX0JhbHRpYyAxMjU3CisjZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX1ZpZXRuYW1lc2UgMTI1OAorI2RlZmluZSBGWF9DT0RFUEFHRV9Kb2hhYiAxMzYxCisjZGVmaW5lIEZYX0NPREVQQUdFX01BQ19Sb21hbiAxMDAwMAorI2RlZmluZSBGWF9DT0RFUEFHRV9NQUNfU2hpZnRKSVMgMTAwMDEKKyNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX0NoaW5lc2VUcmFkaXRpb25hbCAxMDAwMgorI2RlZmluZSBGWF9DT0RFUEFHRV9NQUNfS29yZWFuIDEwMDAzCisjZGVmaW5lIEZYX0NPREVQQUdFX01BQ19BcmFiaWMgMTAwMDQKKyNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX0hlYnJldyAxMDAwNQorI2RlZmluZSBGWF9DT0RFUEFHRV9NQUNfR3JlZWsgMTAwMDYKKyNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX0N5cmlsbGljIDEwMDA3CisjZGVmaW5lIEZYX0NPREVQQUdFX01BQ19DaGluZXNlU2ltcGxpZmllZCAxMDAwOAorI2RlZmluZSBGWF9DT0RFUEFHRV9NQUNfVGhhaSAxMDAyMQorI2RlZmluZSBGWF9DT0RFUEFHRV9NQUNfRWFzdGVybkV1cm9wZWFuIDEwMDI5CisjZGVmaW5lIEZYX0NPREVQQUdFX01BQ19UdXJraXNoIDEwMDgxCisjZGVmaW5lIEZYX0NPREVQQUdFX1VURjggNjUwMDEKKworI2RlZmluZSBGWF9DSEFSU0VUX0FOU0kgMAorI2RlZmluZSBGWF9DSEFSU0VUX0RlZmF1bHQgMQorI2RlZmluZSBGWF9DSEFSU0VUX1N5bWJvbCAyCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX1JvbWFuIDc3CisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX1NoaWZ0SklTIDc4CisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0tvcmVhbiA3OQorI2RlZmluZSBGWF9DSEFSU0VUX01BQ19DaGluZXNlU2ltcGxpZmllZCA4MAorI2RlZmluZSBGWF9DSEFSU0VUX01BQ19DaGluZXNlVHJhZGl0aW9uYWwgODEKKyNkZWZpbmUgRlhfQ0hBUlNFVF9NQUNfSGVicmV3IDgzCisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0FyYWJpYyA4NAorI2RlZmluZSBGWF9DSEFSU0VUX01BQ19HcmVlayA4NQorI2RlZmluZSBGWF9DSEFSU0VUX01BQ19UdXJraXNoIDg2CisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX1RoYWkgODcKKyNkZWZpbmUgRlhfQ0hBUlNFVF9NQUNfRWFzdGVybkV1cm9wZWFuIDg4CisjZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0N5cmlsbGljIDg5CisjZGVmaW5lIEZYX0NIQVJTRVRfU2hpZnRKSVMgMTI4CisjZGVmaW5lIEZYX0NIQVJTRVRfSGFuZ3VsIDEyOQorI2RlZmluZSBGWF9DSEFSU0VUX0pvaGFiIDEzMAorI2RlZmluZSBGWF9DSEFSU0VUX0NoaW5lc2VTaW1wbGlmaWVkIDEzNAorI2RlZmluZSBGWF9DSEFSU0VUX0NoaW5lc2VUcmFkaXRpb25hbCAxMzYKKyNkZWZpbmUgRlhfQ0hBUlNFVF9NU1dpbl9HcmVlayAxNjEKKyNkZWZpbmUgRlhfQ0hBUlNFVF9NU1dpbl9UdXJraXNoIDE2MgorI2RlZmluZSBGWF9DSEFSU0VUX01TV2luX1ZpZXRuYW1lc2UgMTYzCisjZGVmaW5lIEZYX0NIQVJTRVRfTVNXaW5fSGVicmV3IDE3NworI2RlZmluZSBGWF9DSEFSU0VUX01TV2luX0FyYWJpYyAxNzgKKyNkZWZpbmUgRlhfQ0hBUlNFVF9NU1dpbl9CYWx0aWMgMTg2CisjZGVmaW5lIEZYX0NIQVJTRVRfTVNXaW5fQ3lyaWxsaWMgMjA0CisjZGVmaW5lIEZYX0NIQVJTRVRfVGhhaSAyMjIKKyNkZWZpbmUgRlhfQ0hBUlNFVF9NU1dpbl9FYXN0ZXJuRXVyb3BlYW4gMjM4CisjZGVmaW5lIEZYX0NIQVJTRVRfVVMgMjU0CisjZGVmaW5lIEZYX0NIQVJTRVRfT0VNIDI1NQorCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfRlhfQ09ERVBBR0VfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuY3BwIGIvY29yZS9meGNydC9meF9jb29yZGluYXRlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxM2EzMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuY3BwCkBAIC0wLDAgKzEsMzkyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisKK25hbWVzcGFjZSB7CisKK3ZvaWQgTWF0Y2hGbG9hdFJhbmdlKGZsb2F0IGYxLCBmbG9hdCBmMiwgaW50KiBpMSwgaW50KiBpMikgeworICBpbnQgbGVuZ3RoID0gc3RhdGljX2Nhc3Q8aW50PihjZWlsKGYyIC0gZjEpKTsKKyAgaW50IGkxXzEgPSBzdGF0aWNfY2FzdDxpbnQ+KGZsb29yKGYxKSk7CisgIGludCBpMV8yID0gc3RhdGljX2Nhc3Q8aW50PihjZWlsKGYxKSk7CisgIGZsb2F0IGVycm9yMSA9IGYxIC0gaTFfMSArIGZhYnNmKGYyIC0gaTFfMSAtIGxlbmd0aCk7CisgIGZsb2F0IGVycm9yMiA9IGkxXzIgLSBmMSArIGZhYnNmKGYyIC0gaTFfMiAtIGxlbmd0aCk7CisKKyAgKmkxID0gZXJyb3IxID4gZXJyb3IyID8gaTFfMiA6IGkxXzE7CisgICppMiA9ICppMSArIGxlbmd0aDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK3ZvaWQgRlhfUkVDVDo6Tm9ybWFsaXplKCkgeworICBpZiAobGVmdCA+IHJpZ2h0KQorICAgIHN0ZDo6c3dhcChsZWZ0LCByaWdodCk7CisgIGlmICh0b3AgPiBib3R0b20pCisgICAgc3RkOjpzd2FwKHRvcCwgYm90dG9tKTsKK30KKwordm9pZCBGWF9SRUNUOjpJbnRlcnNlY3QoY29uc3QgRlhfUkVDVCYgc3JjKSB7CisgIEZYX1JFQ1Qgc3JjX24gPSBzcmM7CisgIHNyY19uLk5vcm1hbGl6ZSgpOworICBOb3JtYWxpemUoKTsKKyAgbGVmdCA9IHN0ZDo6bWF4KGxlZnQsIHNyY19uLmxlZnQpOworICB0b3AgPSBzdGQ6Om1heCh0b3AsIHNyY19uLnRvcCk7CisgIHJpZ2h0ID0gc3RkOjptaW4ocmlnaHQsIHNyY19uLnJpZ2h0KTsKKyAgYm90dG9tID0gc3RkOjptaW4oYm90dG9tLCBzcmNfbi5ib3R0b20pOworICBpZiAobGVmdCA+IHJpZ2h0IHx8IHRvcCA+IGJvdHRvbSkgeworICAgIGxlZnQgPSB0b3AgPSByaWdodCA9IGJvdHRvbSA9IDA7CisgIH0KK30KKworQ0ZYX0Zsb2F0UmVjdDo6Q0ZYX0Zsb2F0UmVjdChjb25zdCBGWF9SRUNUJiByZWN0KSB7CisgIGxlZnQgPSByZWN0LmxlZnQ7CisgIHRvcCA9IHJlY3QuYm90dG9tOworICByaWdodCA9IHJlY3QucmlnaHQ7CisgIGJvdHRvbSA9IHJlY3QudG9wOworfQorCisvLyBzdGF0aWMKK0NGWF9GbG9hdFJlY3QgQ0ZYX0Zsb2F0UmVjdDo6R2V0QkJveChjb25zdCBDRlhfUG9pbnRGKiBwUG9pbnRzLCBpbnQgblBvaW50cykgeworICBpZiAoblBvaW50cyA9PSAwKQorICAgIHJldHVybiBDRlhfRmxvYXRSZWN0KCk7CisKKyAgZmxvYXQgbWluX3ggPSBwUG9pbnRzLT54OworICBmbG9hdCBtYXhfeCA9IHBQb2ludHMtPng7CisgIGZsb2F0IG1pbl95ID0gcFBvaW50cy0+eTsKKyAgZmxvYXQgbWF4X3kgPSBwUG9pbnRzLT55OworICBmb3IgKGludCBpID0gMTsgaSA8IG5Qb2ludHM7IGkrKykgeworICAgIG1pbl94ID0gc3RkOjptaW4obWluX3gsIHBQb2ludHNbaV0ueCk7CisgICAgbWF4X3ggPSBzdGQ6Om1heChtYXhfeCwgcFBvaW50c1tpXS54KTsKKyAgICBtaW5feSA9IHN0ZDo6bWluKG1pbl95LCBwUG9pbnRzW2ldLnkpOworICAgIG1heF95ID0gc3RkOjptYXgobWF4X3ksIHBQb2ludHNbaV0ueSk7CisgIH0KKyAgcmV0dXJuIENGWF9GbG9hdFJlY3QobWluX3gsIG1pbl95LCBtYXhfeCwgbWF4X3kpOworfQorCit2b2lkIENGWF9GbG9hdFJlY3Q6Ok5vcm1hbGl6ZSgpIHsKKyAgaWYgKGxlZnQgPiByaWdodCkKKyAgICBzdGQ6OnN3YXAobGVmdCwgcmlnaHQpOworICBpZiAoYm90dG9tID4gdG9wKQorICAgIHN0ZDo6c3dhcCh0b3AsIGJvdHRvbSk7Cit9CisKK3ZvaWQgQ0ZYX0Zsb2F0UmVjdDo6UmVzZXQoKSB7CisgIGxlZnQgPSAwLjBmOworICByaWdodCA9IDAuMGY7CisgIGJvdHRvbSA9IDAuMGY7CisgIHRvcCA9IDAuMGY7Cit9CisKK3ZvaWQgQ0ZYX0Zsb2F0UmVjdDo6SW50ZXJzZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIG90aGVyX3JlY3QpIHsKKyAgTm9ybWFsaXplKCk7CisgIENGWF9GbG9hdFJlY3Qgb3RoZXIgPSBvdGhlcl9yZWN0OworICBvdGhlci5Ob3JtYWxpemUoKTsKKyAgbGVmdCA9IHN0ZDo6bWF4KGxlZnQsIG90aGVyLmxlZnQpOworICBib3R0b20gPSBzdGQ6Om1heChib3R0b20sIG90aGVyLmJvdHRvbSk7CisgIHJpZ2h0ID0gc3RkOjptaW4ocmlnaHQsIG90aGVyLnJpZ2h0KTsKKyAgdG9wID0gc3RkOjptaW4odG9wLCBvdGhlci50b3ApOworICBpZiAobGVmdCA+IHJpZ2h0IHx8IGJvdHRvbSA+IHRvcCkKKyAgICBSZXNldCgpOworfQorCit2b2lkIENGWF9GbG9hdFJlY3Q6OlVuaW9uKGNvbnN0IENGWF9GbG9hdFJlY3QmIG90aGVyX3JlY3QpIHsKKyAgTm9ybWFsaXplKCk7CisgIENGWF9GbG9hdFJlY3Qgb3RoZXIgPSBvdGhlcl9yZWN0OworICBvdGhlci5Ob3JtYWxpemUoKTsKKyAgbGVmdCA9IHN0ZDo6bWluKGxlZnQsIG90aGVyLmxlZnQpOworICBib3R0b20gPSBzdGQ6Om1pbihib3R0b20sIG90aGVyLmJvdHRvbSk7CisgIHJpZ2h0ID0gc3RkOjptYXgocmlnaHQsIG90aGVyLnJpZ2h0KTsKKyAgdG9wID0gc3RkOjptYXgodG9wLCBvdGhlci50b3ApOworfQorCitGWF9SRUNUIENGWF9GbG9hdFJlY3Q6OkdldE91dGVyUmVjdCgpIGNvbnN0IHsKKyAgRlhfUkVDVCByZWN0OworICByZWN0LmxlZnQgPSBzdGF0aWNfY2FzdDxpbnQ+KGZsb29yKGxlZnQpKTsKKyAgcmVjdC5ib3R0b20gPSBzdGF0aWNfY2FzdDxpbnQ+KGNlaWwodG9wKSk7CisgIHJlY3QucmlnaHQgPSBzdGF0aWNfY2FzdDxpbnQ+KGNlaWwocmlnaHQpKTsKKyAgcmVjdC50b3AgPSBzdGF0aWNfY2FzdDxpbnQ+KGZsb29yKGJvdHRvbSkpOworICByZWN0Lk5vcm1hbGl6ZSgpOworICByZXR1cm4gcmVjdDsKK30KKworRlhfUkVDVCBDRlhfRmxvYXRSZWN0OjpHZXRJbm5lclJlY3QoKSBjb25zdCB7CisgIEZYX1JFQ1QgcmVjdDsKKyAgcmVjdC5sZWZ0ID0gc3RhdGljX2Nhc3Q8aW50PihjZWlsKGxlZnQpKTsKKyAgcmVjdC5ib3R0b20gPSBzdGF0aWNfY2FzdDxpbnQ+KGZsb29yKHRvcCkpOworICByZWN0LnJpZ2h0ID0gc3RhdGljX2Nhc3Q8aW50PihmbG9vcihyaWdodCkpOworICByZWN0LnRvcCA9IHN0YXRpY19jYXN0PGludD4oY2VpbChib3R0b20pKTsKKyAgcmVjdC5Ob3JtYWxpemUoKTsKKyAgcmV0dXJuIHJlY3Q7Cit9CisKK0ZYX1JFQ1QgQ0ZYX0Zsb2F0UmVjdDo6R2V0Q2xvc2VzdFJlY3QoKSBjb25zdCB7CisgIEZYX1JFQ1QgcmVjdDsKKyAgTWF0Y2hGbG9hdFJhbmdlKGxlZnQsIHJpZ2h0LCAmcmVjdC5sZWZ0LCAmcmVjdC5yaWdodCk7CisgIE1hdGNoRmxvYXRSYW5nZShib3R0b20sIHRvcCwgJnJlY3QudG9wLCAmcmVjdC5ib3R0b20pOworICByZWN0Lk5vcm1hbGl6ZSgpOworICByZXR1cm4gcmVjdDsKK30KKworQ0ZYX0Zsb2F0UmVjdCBDRlhfRmxvYXRSZWN0OjpHZXRDZW50ZXJTcXVhcmUoKSBjb25zdCB7CisgIGZsb2F0IGZXaWR0aCA9IHJpZ2h0IC0gbGVmdDsKKyAgZmxvYXQgZkhlaWdodCA9IHRvcCAtIGJvdHRvbTsKKyAgZmxvYXQgZkhhbGZXaWR0aCA9IChmV2lkdGggPiBmSGVpZ2h0KSA/IGZIZWlnaHQgLyAyIDogZldpZHRoIC8gMjsKKworICBmbG9hdCBmQ2VudGVyWCA9IChsZWZ0ICsgcmlnaHQpIC8gMi4wZjsKKyAgZmxvYXQgZkNlbnRlclkgPSAodG9wICsgYm90dG9tKSAvIDIuMGY7CisgIHJldHVybiBDRlhfRmxvYXRSZWN0KGZDZW50ZXJYIC0gZkhhbGZXaWR0aCwgZkNlbnRlclkgLSBmSGFsZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBmQ2VudGVyWCArIGZIYWxmV2lkdGgsIGZDZW50ZXJZICsgZkhhbGZXaWR0aCk7Cit9CisKK2Jvb2wgQ0ZYX0Zsb2F0UmVjdDo6Q29udGFpbnMoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIGNvbnN0IHsKKyAgQ0ZYX0Zsb2F0UmVjdCBuMSgqdGhpcyk7CisgIG4xLk5vcm1hbGl6ZSgpOworICByZXR1cm4gcG9pbnQueCA8PSBuMS5yaWdodCAmJiBwb2ludC54ID49IG4xLmxlZnQgJiYgcG9pbnQueSA8PSBuMS50b3AgJiYKKyAgICAgICAgIHBvaW50LnkgPj0gbjEuYm90dG9tOworfQorCitib29sIENGWF9GbG9hdFJlY3Q6OkNvbnRhaW5zKGNvbnN0IENGWF9GbG9hdFJlY3QmIG90aGVyX3JlY3QpIGNvbnN0IHsKKyAgQ0ZYX0Zsb2F0UmVjdCBuMSgqdGhpcyk7CisgIENGWF9GbG9hdFJlY3QgbjIob3RoZXJfcmVjdCk7CisgIG4xLk5vcm1hbGl6ZSgpOworICBuMi5Ob3JtYWxpemUoKTsKKyAgcmV0dXJuIG4yLmxlZnQgPj0gbjEubGVmdCAmJiBuMi5yaWdodCA8PSBuMS5yaWdodCAmJiBuMi5ib3R0b20gPj0gbjEuYm90dG9tICYmCisgICAgICAgICBuMi50b3AgPD0gbjEudG9wOworfQorCit2b2lkIENGWF9GbG9hdFJlY3Q6OlVwZGF0ZVJlY3QoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKKyAgbGVmdCA9IHN0ZDo6bWluKGxlZnQsIHBvaW50LngpOworICBib3R0b20gPSBzdGQ6Om1pbihib3R0b20sIHBvaW50LnkpOworICByaWdodCA9IHN0ZDo6bWF4KHJpZ2h0LCBwb2ludC54KTsKKyAgdG9wID0gc3RkOjptYXgodG9wLCBwb2ludC55KTsKK30KKwordm9pZCBDRlhfRmxvYXRSZWN0OjpTY2FsZShmbG9hdCBmU2NhbGUpIHsKKyAgbGVmdCAqPSBmU2NhbGU7CisgIGJvdHRvbSAqPSBmU2NhbGU7CisgIHJpZ2h0ICo9IGZTY2FsZTsKKyAgdG9wICo9IGZTY2FsZTsKK30KKwordm9pZCBDRlhfRmxvYXRSZWN0OjpTY2FsZUZyb21DZW50ZXJQb2ludChmbG9hdCBmU2NhbGUpIHsKKyAgZmxvYXQgZkhhbGZXaWR0aCA9IChyaWdodCAtIGxlZnQpIC8gMi4wZjsKKyAgZmxvYXQgZkhhbGZIZWlnaHQgPSAodG9wIC0gYm90dG9tKSAvIDIuMGY7CisKKyAgZmxvYXQgY2VudGVyX3ggPSAobGVmdCArIHJpZ2h0KSAvIDI7CisgIGZsb2F0IGNlbnRlcl95ID0gKHRvcCArIGJvdHRvbSkgLyAyOworCisgIGxlZnQgPSBjZW50ZXJfeCAtIGZIYWxmV2lkdGggKiBmU2NhbGU7CisgIGJvdHRvbSA9IGNlbnRlcl95IC0gZkhhbGZIZWlnaHQgKiBmU2NhbGU7CisgIHJpZ2h0ID0gY2VudGVyX3ggKyBmSGFsZldpZHRoICogZlNjYWxlOworICB0b3AgPSBjZW50ZXJfeSArIGZIYWxmSGVpZ2h0ICogZlNjYWxlOworfQorCitGWF9SRUNUIENGWF9GbG9hdFJlY3Q6OlRvRnhSZWN0KCkgY29uc3QgeworICByZXR1cm4gRlhfUkVDVChzdGF0aWNfY2FzdDxpbnQ+KGxlZnQpLCBzdGF0aWNfY2FzdDxpbnQ+KHRvcCksCisgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4ocmlnaHQpLCBzdGF0aWNfY2FzdDxpbnQ+KGJvdHRvbSkpOworfQorCitGWF9SRUNUIENGWF9GbG9hdFJlY3Q6OlRvUm91bmRlZEZ4UmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIEZYX1JFQ1QoRlhTWVNfcm91bmQobGVmdCksIEZYU1lTX3JvdW5kKHRvcCksIEZYU1lTX3JvdW5kKHJpZ2h0KSwKKyAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoYm90dG9tKSk7Cit9CisKKyNpZm5kZWYgTkRFQlVHCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgeworICBvcyA8PCAicmVjdFsiIDw8IHJlY3QuV2lkdGgoKSA8PCAieCIgPDwgcmVjdC5IZWlnaHQoKSA8PCAiICgiIDw8IHJlY3QubGVmdAorICAgICA8PCAiLCAiIDw8IHJlY3QuYm90dG9tIDw8ICIpXSI7CisgIHJldHVybiBvczsKK30KKyNlbmRpZgorCitDRlhfTWF0cml4IENGWF9NYXRyaXg6OkdldEludmVyc2UoKSBjb25zdCB7CisgIENGWF9NYXRyaXggaW52ZXJzZTsKKyAgZmxvYXQgaSA9IGEgKiBkIC0gYiAqIGM7CisgIGlmIChmYWJzKGkpID09IDApCisgICAgcmV0dXJuIGludmVyc2U7CisKKyAgZmxvYXQgaiA9IC1pOworICBpbnZlcnNlLmEgPSBkIC8gaTsKKyAgaW52ZXJzZS5iID0gYiAvIGo7CisgIGludmVyc2UuYyA9IGMgLyBqOworICBpbnZlcnNlLmQgPSBhIC8gaTsKKyAgaW52ZXJzZS5lID0gKGMgKiBmIC0gZCAqIGUpIC8gaTsKKyAgaW52ZXJzZS5mID0gKGEgKiBmIC0gYiAqIGUpIC8gajsKKyAgcmV0dXJuIGludmVyc2U7Cit9CisKK3ZvaWQgQ0ZYX01hdHJpeDo6Q29uY2F0KGNvbnN0IENGWF9NYXRyaXgmIG0sIGJvb2wgYlByZXBlbmRlZCkgeworICBDb25jYXRJbnRlcm5hbChtLCBiUHJlcGVuZGVkKTsKK30KKwordm9pZCBDRlhfTWF0cml4OjpDb25jYXRJbnZlcnNlKGNvbnN0IENGWF9NYXRyaXgmIHNyYywgYm9vbCBiUHJlcGVuZGVkKSB7CisgIENvbmNhdChzcmMuR2V0SW52ZXJzZSgpLCBiUHJlcGVuZGVkKTsKK30KKworYm9vbCBDRlhfTWF0cml4OjpJczkwUm90YXRlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIGZhYnMoYSAqIDEwMDApIDwgZmFicyhiKSAmJiBmYWJzKGQgKiAxMDAwKSA8IGZhYnMoYyk7Cit9CisKK2Jvb2wgQ0ZYX01hdHJpeDo6SXNTY2FsZWQoKSBjb25zdCB7CisgIHJldHVybiBmYWJzKGIgKiAxMDAwKSA8IGZhYnMoYSkgJiYgZmFicyhjICogMTAwMCkgPCBmYWJzKGQpOworfQorCit2b2lkIENGWF9NYXRyaXg6OlRyYW5zbGF0ZShmbG9hdCB4LCBmbG9hdCB5LCBib29sIGJQcmVwZW5kZWQpIHsKKyAgaWYgKGJQcmVwZW5kZWQpIHsKKyAgICBlICs9IHggKiBhICsgeSAqIGM7CisgICAgZiArPSB5ICogZCArIHggKiBiOworICAgIHJldHVybjsKKyAgfQorICBlICs9IHg7CisgIGYgKz0geTsKK30KKwordm9pZCBDRlhfTWF0cml4OjpTY2FsZShmbG9hdCBzeCwgZmxvYXQgc3ksIGJvb2wgYlByZXBlbmRlZCkgeworICBhICo9IHN4OworICBkICo9IHN5OworICBpZiAoYlByZXBlbmRlZCkgeworICAgIGIgKj0gc3g7CisgICAgYyAqPSBzeTsKKyAgICByZXR1cm47CisgIH0KKworICBiICo9IHN5OworICBjICo9IHN4OworICBlICo9IHN4OworICBmICo9IHN5OworfQorCit2b2lkIENGWF9NYXRyaXg6OlJvdGF0ZShmbG9hdCBmUmFkaWFuLCBib29sIGJQcmVwZW5kZWQpIHsKKyAgZmxvYXQgY29zVmFsdWUgPSBjb3MoZlJhZGlhbik7CisgIGZsb2F0IHNpblZhbHVlID0gc2luKGZSYWRpYW4pOworICBDb25jYXRJbnRlcm5hbChDRlhfTWF0cml4KGNvc1ZhbHVlLCBzaW5WYWx1ZSwgLXNpblZhbHVlLCBjb3NWYWx1ZSwgMCwgMCksCisgICAgICAgICAgICAgICAgIGJQcmVwZW5kZWQpOworfQorCit2b2lkIENGWF9NYXRyaXg6OlJvdGF0ZUF0KGZsb2F0IGZSYWRpYW4sIGZsb2F0IGR4LCBmbG9hdCBkeSwgYm9vbCBiUHJlcGVuZGVkKSB7CisgIFRyYW5zbGF0ZShkeCwgZHksIGJQcmVwZW5kZWQpOworICBSb3RhdGUoZlJhZGlhbiwgYlByZXBlbmRlZCk7CisgIFRyYW5zbGF0ZSgtZHgsIC1keSwgYlByZXBlbmRlZCk7Cit9CisKK3ZvaWQgQ0ZYX01hdHJpeDo6U2hlYXIoZmxvYXQgZkFscGhhUmFkaWFuLCBmbG9hdCBmQmV0YVJhZGlhbiwgYm9vbCBiUHJlcGVuZGVkKSB7CisgIENvbmNhdEludGVybmFsKENGWF9NYXRyaXgoMSwgdGFuKGZBbHBoYVJhZGlhbiksIHRhbihmQmV0YVJhZGlhbiksIDEsIDAsIDApLAorICAgICAgICAgICAgICAgICBiUHJlcGVuZGVkKTsKK30KKwordm9pZCBDRlhfTWF0cml4OjpNYXRjaFJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHNyYykgeworICBmbG9hdCBmRGlmZiA9IHNyYy5sZWZ0IC0gc3JjLnJpZ2h0OworICBhID0gZmFicyhmRGlmZikgPCAwLjAwMWYgPyAxIDogKGRlc3QubGVmdCAtIGRlc3QucmlnaHQpIC8gZkRpZmY7CisKKyAgZkRpZmYgPSBzcmMuYm90dG9tIC0gc3JjLnRvcDsKKyAgZCA9IGZhYnMoZkRpZmYpIDwgMC4wMDFmID8gMSA6IChkZXN0LmJvdHRvbSAtIGRlc3QudG9wKSAvIGZEaWZmOworICBlID0gZGVzdC5sZWZ0IC0gc3JjLmxlZnQgKiBhOworICBmID0gZGVzdC5ib3R0b20gLSBzcmMuYm90dG9tICogZDsKKyAgYiA9IDA7CisgIGMgPSAwOworfQorCitmbG9hdCBDRlhfTWF0cml4OjpHZXRYVW5pdCgpIGNvbnN0IHsKKyAgaWYgKGIgPT0gMCkKKyAgICByZXR1cm4gKGEgPiAwID8gYSA6IC1hKTsKKyAgaWYgKGEgPT0gMCkKKyAgICByZXR1cm4gKGIgPiAwID8gYiA6IC1iKTsKKyAgcmV0dXJuIHNxcnQoYSAqIGEgKyBiICogYik7Cit9CisKK2Zsb2F0IENGWF9NYXRyaXg6OkdldFlVbml0KCkgY29uc3QgeworICBpZiAoYyA9PSAwKQorICAgIHJldHVybiAoZCA+IDAgPyBkIDogLWQpOworICBpZiAoZCA9PSAwKQorICAgIHJldHVybiAoYyA+IDAgPyBjIDogLWMpOworICByZXR1cm4gc3FydChjICogYyArIGQgKiBkKTsKK30KKworQ0ZYX0Zsb2F0UmVjdCBDRlhfTWF0cml4OjpHZXRVbml0UmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIFRyYW5zZm9ybVJlY3QoQ0ZYX0Zsb2F0UmVjdCgwLmYsIDAuZiwgMS5mLCAxLmYpKTsKK30KKworZmxvYXQgQ0ZYX01hdHJpeDo6VHJhbnNmb3JtWERpc3RhbmNlKGZsb2F0IGR4KSBjb25zdCB7CisgIGZsb2F0IGZ4ID0gYSAqIGR4OworICBmbG9hdCBmeSA9IGIgKiBkeDsKKyAgcmV0dXJuIHNxcnQoZnggKiBmeCArIGZ5ICogZnkpOworfQorCitmbG9hdCBDRlhfTWF0cml4OjpUcmFuc2Zvcm1EaXN0YW5jZShmbG9hdCBkaXN0YW5jZSkgY29uc3QgeworICByZXR1cm4gZGlzdGFuY2UgKiAoR2V0WFVuaXQoKSArIEdldFlVbml0KCkpIC8gMjsKK30KKworQ0ZYX1BvaW50RiBDRlhfTWF0cml4OjpUcmFuc2Zvcm0oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIGNvbnN0IHsKKyAgcmV0dXJuIENGWF9Qb2ludEYoYSAqIHBvaW50LnggKyBjICogcG9pbnQueSArIGUsCisgICAgICAgICAgICAgICAgICAgIGIgKiBwb2ludC54ICsgZCAqIHBvaW50LnkgKyBmKTsKK30KK3N0ZDo6dHVwbGU8ZmxvYXQsIGZsb2F0LCBmbG9hdCwgZmxvYXQ+IENGWF9NYXRyaXg6OlRyYW5zZm9ybVJlY3QoCisgICAgY29uc3QgZmxvYXQmIGxlZnQsCisgICAgY29uc3QgZmxvYXQmIHJpZ2h0LAorICAgIGNvbnN0IGZsb2F0JiB0b3AsCisgICAgY29uc3QgZmxvYXQmIGJvdHRvbSkgY29uc3QgeworICBDRlhfUG9pbnRGIHBvaW50c1tdID0geworICAgICAge2xlZnQsIHRvcH0sIHtsZWZ0LCBib3R0b219LCB7cmlnaHQsIHRvcH0sIHtyaWdodCwgYm90dG9tfX07CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKQorICAgIHBvaW50c1tpXSA9IFRyYW5zZm9ybShwb2ludHNbaV0pOworCisgIGZsb2F0IG5ld19yaWdodCA9IHBvaW50c1swXS54OworICBmbG9hdCBuZXdfbGVmdCA9IHBvaW50c1swXS54OworICBmbG9hdCBuZXdfdG9wID0gcG9pbnRzWzBdLnk7CisgIGZsb2F0IG5ld19ib3R0b20gPSBwb2ludHNbMF0ueTsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCA0OyBpKyspIHsKKyAgICBuZXdfcmlnaHQgPSBzdGQ6Om1heChuZXdfcmlnaHQsIHBvaW50c1tpXS54KTsKKyAgICBuZXdfbGVmdCA9IHN0ZDo6bWluKG5ld19sZWZ0LCBwb2ludHNbaV0ueCk7CisgICAgbmV3X3RvcCA9IHN0ZDo6bWF4KG5ld190b3AsIHBvaW50c1tpXS55KTsKKyAgICBuZXdfYm90dG9tID0gc3RkOjptaW4obmV3X2JvdHRvbSwgcG9pbnRzW2ldLnkpOworICB9CisgIHJldHVybiBzdGQ6Om1ha2VfdHVwbGUobmV3X2xlZnQsIG5ld19yaWdodCwgbmV3X3RvcCwgbmV3X2JvdHRvbSk7Cit9CisKK0NGWF9SZWN0RiBDRlhfTWF0cml4OjpUcmFuc2Zvcm1SZWN0KGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgY29uc3QgeworICBmbG9hdCBsZWZ0OworICBmbG9hdCByaWdodDsKKyAgZmxvYXQgYm90dG9tOworICBmbG9hdCB0b3A7CisgIHN0ZDo6dGllKGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCkgPQorICAgICAgVHJhbnNmb3JtUmVjdChyZWN0LmxlZnQsIHJlY3QucmlnaHQoKSwgcmVjdC5ib3R0b20oKSwgcmVjdC50b3ApOworICByZXR1cm4gQ0ZYX1JlY3RGKGxlZnQsIHRvcCwgcmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3ApOworfQorCitDRlhfRmxvYXRSZWN0IENGWF9NYXRyaXg6OlRyYW5zZm9ybVJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3QgeworICBmbG9hdCBsZWZ0OworICBmbG9hdCByaWdodDsKKyAgZmxvYXQgdG9wOworICBmbG9hdCBib3R0b207CisgIHN0ZDo6dGllKGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSkgPQorICAgICAgVHJhbnNmb3JtUmVjdChyZWN0LmxlZnQsIHJlY3QucmlnaHQsIHJlY3QudG9wLCByZWN0LmJvdHRvbSk7CisgIHJldHVybiBDRlhfRmxvYXRSZWN0KGxlZnQsIGJvdHRvbSwgcmlnaHQsIHRvcCk7Cit9CisKK3ZvaWQgQ0ZYX01hdHJpeDo6Q29uY2F0SW50ZXJuYWwoY29uc3QgQ0ZYX01hdHJpeCYgb3RoZXIsIGJvb2wgcHJlcGVuZCkgeworICBDRlhfTWF0cml4IGxlZnQ7CisgIENGWF9NYXRyaXggcmlnaHQ7CisgIGlmIChwcmVwZW5kKSB7CisgICAgbGVmdCA9IG90aGVyOworICAgIHJpZ2h0ID0gKnRoaXM7CisgIH0gZWxzZSB7CisgICAgbGVmdCA9ICp0aGlzOworICAgIHJpZ2h0ID0gb3RoZXI7CisgIH0KKworICBhID0gbGVmdC5hICogcmlnaHQuYSArIGxlZnQuYiAqIHJpZ2h0LmM7CisgIGIgPSBsZWZ0LmEgKiByaWdodC5iICsgbGVmdC5iICogcmlnaHQuZDsKKyAgYyA9IGxlZnQuYyAqIHJpZ2h0LmEgKyBsZWZ0LmQgKiByaWdodC5jOworICBkID0gbGVmdC5jICogcmlnaHQuYiArIGxlZnQuZCAqIHJpZ2h0LmQ7CisgIGUgPSBsZWZ0LmUgKiByaWdodC5hICsgbGVmdC5mICogcmlnaHQuYyArIHJpZ2h0LmU7CisgIGYgPSBsZWZ0LmUgKiByaWdodC5iICsgbGVmdC5mICogcmlnaHQuZCArIHJpZ2h0LmY7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmggYi9jb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgKaW5kZXggMmM4NGQwNy4uNjlkMTZkMSAxMDA2NDQKLS0tIGEvY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oCisrKyBiL2NvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaApAQCAtNyw3ICs3LDExIEBACiAjaWZuZGVmIENPUkVfRlhDUlRfRlhfQ09PUkRJTkFURVNfSF8KICNkZWZpbmUgQ09SRV9GWENSVF9GWF9DT09SRElOQVRFU19IXwogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx0dXBsZT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX21hdGguaCIKIAogY2xhc3MgQ0ZYX01hdHJpeDsKIApAQCAtMTcsMTAgKzIxLDcgQEAKICAgQ0ZYX1BUZW1wbGF0ZSgpIDogeCgwKSwgeSgwKSB7fQogICBDRlhfUFRlbXBsYXRlKEJhc2VUeXBlIG5ld194LCBCYXNlVHlwZSBuZXdfeSkgOiB4KG5ld194KSwgeShuZXdfeSkge30KICAgQ0ZYX1BUZW1wbGF0ZShjb25zdCBDRlhfUFRlbXBsYXRlJiBvdGhlcikgOiB4KG90aGVyLngpLCB5KG90aGVyLnkpIHt9Ci0gIHZvaWQgY2xlYXIoKSB7Ci0gICAgeCA9IDA7Ci0gICAgeSA9IDA7Ci0gIH0KKwogICBDRlhfUFRlbXBsYXRlIG9wZXJhdG9yPShjb25zdCBDRlhfUFRlbXBsYXRlJiBvdGhlcikgewogICAgIGlmICh0aGlzICE9ICZvdGhlcikgewogICAgICAgeCA9IG90aGVyLng7CkBAIC00NCwzNCArNDUsMTggQEAKICAgICB5IC09IG9iai55OwogICAgIHJldHVybiAqdGhpczsKICAgfQotICBDRlhfUFRlbXBsYXRlJiBvcGVyYXRvcio9KEJhc2VUeXBlIGZhY3RvcikgewotICAgIHggKj0gZmFjdG9yOwotICAgIHkgKj0gZmFjdG9yOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBDRlhfUFRlbXBsYXRlJiBvcGVyYXRvci89KEJhc2VUeXBlIGRpdmlzb3IpIHsKLSAgICB4IC89IGRpdmlzb3I7Ci0gICAgeSAvPSBkaXZpc29yOwotICAgIHJldHVybiAqdGhpczsKLSAgfQogICBDRlhfUFRlbXBsYXRlIG9wZXJhdG9yKyhjb25zdCBDRlhfUFRlbXBsYXRlJiBvdGhlcikgY29uc3QgewogICAgIHJldHVybiBDRlhfUFRlbXBsYXRlKHggKyBvdGhlci54LCB5ICsgb3RoZXIueSk7CiAgIH0KICAgQ0ZYX1BUZW1wbGF0ZSBvcGVyYXRvci0oY29uc3QgQ0ZYX1BUZW1wbGF0ZSYgb3RoZXIpIGNvbnN0IHsKICAgICByZXR1cm4gQ0ZYX1BUZW1wbGF0ZSh4IC0gb3RoZXIueCwgeSAtIG90aGVyLnkpOwogICB9Ci0gIENGWF9QVGVtcGxhdGUgb3BlcmF0b3IqKEJhc2VUeXBlIGZhY3RvcikgY29uc3QgewotICAgIHJldHVybiBDRlhfUFRlbXBsYXRlKHggKiBmYWN0b3IsIHkgKiBmYWN0b3IpOwotICB9Ci0gIENGWF9QVGVtcGxhdGUgb3BlcmF0b3IvKEJhc2VUeXBlIGRpdmlzb3IpIGNvbnN0IHsKLSAgICByZXR1cm4gQ0ZYX1BUZW1wbGF0ZSh4IC8gZGl2aXNvciwgeSAvIGRpdmlzb3IpOwotICB9CiAKICAgQmFzZVR5cGUgeDsKICAgQmFzZVR5cGUgeTsKIH07CiB1c2luZyBDRlhfUG9pbnQgPSBDRlhfUFRlbXBsYXRlPGludDMyX3Q+OwotdXNpbmcgQ0ZYX1BvaW50RiA9IENGWF9QVGVtcGxhdGU8RlhfRkxPQVQ+OwordXNpbmcgQ0ZYX1BvaW50RiA9IENGWF9QVGVtcGxhdGU8ZmxvYXQ+OwogCiB0ZW1wbGF0ZSA8Y2xhc3MgQmFzZVR5cGU+CiBjbGFzcyBDRlhfU1RlbXBsYXRlIHsKQEAgLTE0NCw3ICsxMjksNyBAQAogICBCYXNlVHlwZSBoZWlnaHQ7CiB9OwogdXNpbmcgQ0ZYX1NpemUgPSBDRlhfU1RlbXBsYXRlPGludDMyX3Q+OwotdXNpbmcgQ0ZYX1NpemVGID0gQ0ZYX1NUZW1wbGF0ZTxGWF9GTE9BVD47Cit1c2luZyBDRlhfU2l6ZUYgPSBDRlhfU1RlbXBsYXRlPGZsb2F0PjsKIAogdGVtcGxhdGUgPGNsYXNzIEJhc2VUeXBlPgogY2xhc3MgQ0ZYX1ZUZW1wbGF0ZSA6IHB1YmxpYyBDRlhfUFRlbXBsYXRlPEJhc2VUeXBlPiB7CkBAIC0xNjIsOSArMTQ3LDkgQEAKICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUFRlbXBsYXRlPEJhc2VUeXBlPiYgcG9pbnQyKQogICAgICAgOiBDRlhfUFRlbXBsYXRlPEJhc2VUeXBlPihwb2ludDIueCAtIHBvaW50MS54LCBwb2ludDIueSAtIHBvaW50MS55KSB7fQogCi0gIEZYX0ZMT0FUIExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIEZYU1lTX3NxcnQoeCAqIHggKyB5ICogeSk7IH0KKyAgZmxvYXQgTGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gc3FydCh4ICogeCArIHkgKiB5KTsgfQogICB2b2lkIE5vcm1hbGl6ZSgpIHsKLSAgICBGWF9GTE9BVCBmTGVuID0gTGVuZ3RoKCk7CisgICAgZmxvYXQgZkxlbiA9IExlbmd0aCgpOwogICAgIGlmIChmTGVuIDwgMC4wMDAxZikKICAgICAgIHJldHVybjsKIApAQCAtMTc5LDE5ICsxNjQsMjAzIEBACiAgICAgeCAqPSBzeDsKICAgICB5ICo9IHN5OwogICB9Ci0gIHZvaWQgUm90YXRlKEZYX0ZMT0FUIGZSYWRpYW4pIHsKLSAgICBGWF9GTE9BVCBjb3NWYWx1ZSA9IEZYU1lTX2NvcyhmUmFkaWFuKTsKLSAgICBGWF9GTE9BVCBzaW5WYWx1ZSA9IEZYU1lTX3NpbihmUmFkaWFuKTsKKyAgdm9pZCBSb3RhdGUoZmxvYXQgZlJhZGlhbikgeworICAgIGZsb2F0IGNvc1ZhbHVlID0gY29zKGZSYWRpYW4pOworICAgIGZsb2F0IHNpblZhbHVlID0gc2luKGZSYWRpYW4pOwogICAgIHggPSB4ICogY29zVmFsdWUgLSB5ICogc2luVmFsdWU7CiAgICAgeSA9IHggKiBzaW5WYWx1ZSArIHkgKiBjb3NWYWx1ZTsKICAgfQogfTsKIHVzaW5nIENGWF9WZWN0b3IgPSBDRlhfVlRlbXBsYXRlPGludDMyX3Q+OwotdXNpbmcgQ0ZYX1ZlY3RvckYgPSBDRlhfVlRlbXBsYXRlPEZYX0ZMT0FUPjsKK3VzaW5nIENGWF9WZWN0b3JGID0gQ0ZYX1ZUZW1wbGF0ZTxmbG9hdD47CiAKIC8vIFJlY3RhbmdsZXMuCiAvLyBUT0RPKHRzZXBleik6IENvbnNvbGlkYXRlIGFsbCB0aGVzZSBkaWZmZXJlbnQgcmVjdGFuZ2xlIGNsYXNzZXMuCiAKKy8vIExUUkIgcmVjdGFuZ2xlcyAoeS1heGlzIHJ1bnMgZG93bndhcmRzKS4KK3N0cnVjdCBGWF9SRUNUIHsKKyAgRlhfUkVDVCgpIDogbGVmdCgwKSwgdG9wKDApLCByaWdodCgwKSwgYm90dG9tKDApIHt9CisgIEZYX1JFQ1QoaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIDogbGVmdChsKSwgdG9wKHQpLCByaWdodChyKSwgYm90dG9tKGIpIHt9CisKKyAgaW50IFdpZHRoKCkgY29uc3QgeyByZXR1cm4gcmlnaHQgLSBsZWZ0OyB9CisgIGludCBIZWlnaHQoKSBjb25zdCB7IHJldHVybiBib3R0b20gLSB0b3A7IH0KKyAgYm9vbCBJc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gcmlnaHQgPD0gbGVmdCB8fCBib3R0b20gPD0gdG9wOyB9CisKKyAgYm9vbCBWYWxpZCgpIGNvbnN0IHsKKyAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPGludD4gdyA9IHJpZ2h0OworICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8aW50PiBoID0gYm90dG9tOworICAgIHcgLT0gbGVmdDsKKyAgICBoIC09IHRvcDsKKyAgICByZXR1cm4gdy5Jc1ZhbGlkKCkgJiYgaC5Jc1ZhbGlkKCk7CisgIH0KKworICB2b2lkIE5vcm1hbGl6ZSgpOworCisgIHZvaWQgSW50ZXJzZWN0KGNvbnN0IEZYX1JFQ1QmIHNyYyk7CisgIHZvaWQgSW50ZXJzZWN0KGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7IEludGVyc2VjdChGWF9SRUNUKGwsIHQsIHIsIGIpKTsgfQorCisgIHZvaWQgT2Zmc2V0KGludCBkeCwgaW50IGR5KSB7CisgICAgbGVmdCArPSBkeDsKKyAgICByaWdodCArPSBkeDsKKyAgICB0b3AgKz0gZHk7CisgICAgYm90dG9tICs9IGR5OworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZYX1JFQ1QmIHNyYykgY29uc3QgeworICAgIHJldHVybiBsZWZ0ID09IHNyYy5sZWZ0ICYmIHJpZ2h0ID09IHNyYy5yaWdodCAmJiB0b3AgPT0gc3JjLnRvcCAmJgorICAgICAgICAgICBib3R0b20gPT0gc3JjLmJvdHRvbTsKKyAgfQorCisgIGJvb2wgQ29udGFpbnMoaW50IHgsIGludCB5KSBjb25zdCB7CisgICAgcmV0dXJuIHggPj0gbGVmdCAmJiB4IDwgcmlnaHQgJiYgeSA+PSB0b3AgJiYgeSA8IGJvdHRvbTsKKyAgfQorCisgIGludDMyX3QgbGVmdDsKKyAgaW50MzJfdCB0b3A7CisgIGludDMyX3QgcmlnaHQ7CisgIGludDMyX3QgYm90dG9tOworfTsKKworLy8gTFRSQiByZWN0YW5nbGVzICh5LWF4aXMgcnVucyB1cHdhcmRzKS4KK2NsYXNzIENGWF9GbG9hdFJlY3QgeworIHB1YmxpYzoKKyAgQ0ZYX0Zsb2F0UmVjdCgpIDogQ0ZYX0Zsb2F0UmVjdCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKSB7fQorICBDRlhfRmxvYXRSZWN0KGZsb2F0IGwsIGZsb2F0IGIsIGZsb2F0IHIsIGZsb2F0IHQpCisgICAgICA6IGxlZnQobCksIGJvdHRvbShiKSwgcmlnaHQociksIHRvcCh0KSB7fQorCisgIGV4cGxpY2l0IENGWF9GbG9hdFJlY3QoY29uc3QgZmxvYXQqIHBBcnJheSkKKyAgICAgIDogQ0ZYX0Zsb2F0UmVjdChwQXJyYXlbMF0sIHBBcnJheVsxXSwgcEFycmF5WzJdLCBwQXJyYXlbM10pIHt9CisKKyAgZXhwbGljaXQgQ0ZYX0Zsb2F0UmVjdChjb25zdCBGWF9SRUNUJiByZWN0KTsKKworICBzdGF0aWMgQ0ZYX0Zsb2F0UmVjdCBHZXRCQm94KGNvbnN0IENGWF9Qb2ludEYqIHBQb2ludHMsIGludCBuUG9pbnRzKTsKKworICB2b2lkIE5vcm1hbGl6ZSgpOworCisgIHZvaWQgUmVzZXQoKTsKKworICBib29sIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBsZWZ0ID49IHJpZ2h0IHx8IGJvdHRvbSA+PSB0b3A7IH0KKworICBib29sIENvbnRhaW5zKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBjb25zdDsKKyAgYm9vbCBDb250YWlucyhjb25zdCBDRlhfRmxvYXRSZWN0JiBvdGhlcl9yZWN0KSBjb25zdDsKKworICB2b2lkIEludGVyc2VjdChjb25zdCBDRlhfRmxvYXRSZWN0JiBvdGhlcl9yZWN0KTsKKyAgdm9pZCBVbmlvbihjb25zdCBDRlhfRmxvYXRSZWN0JiBvdGhlcl9yZWN0KTsKKworICAvLyBUaGVzZSBtYXkgYmUgYmV0dGVyIGF0IHJvdW5kaW5nIHRoYW4gVG9GeFJlY3QoKSBhbmQgZnJpZW5kcy4KKyAgLy8KKyAgLy8gUmV0dXJuZWQgcmVjdCBoYXMgYm91bmRzIHJvdW5kZWQgdXAvZG93biBzdWNoIHRoYXQgaXQgaXMgY29udGFpbmVkIGluIHRoZQorICAvLyBvcmlnaW5hbC4KKyAgRlhfUkVDVCBHZXRJbm5lclJlY3QoKSBjb25zdDsKKworICAvLyBSZXR1cm5lZCByZWN0IGhhcyBib3VuZHMgcm91bmRlZCB1cC9kb3duIHN1Y2ggdGhhdCB0aGUgb3JpZ2luYWwgaXMKKyAgLy8gY29udGFpbmVkIGluIGl0LgorICBGWF9SRUNUIEdldE91dGVyUmVjdCgpIGNvbnN0OworCisgIC8vIFJldHVybmVkIHJlY3QgaGFzIGJvdW5kcyByb3VuZGVkIHVwL2Rvd24gc3VjaCB0aGF0IHRoZSBkaW1lbnNpb25zIGFyZQorICAvLyByb3VuZGVkIHVwIGFuZCB0aGUgc3VtIG9mIHRoZSBlcnJvciBpbiB0aGUgYm91bmRzIGlzIG1pbmltaXplZC4KKyAgRlhfUkVDVCBHZXRDbG9zZXN0UmVjdCgpIGNvbnN0OworCisgIENGWF9GbG9hdFJlY3QgR2V0Q2VudGVyU3F1YXJlKCkgY29uc3Q7CisKKyAgdm9pZCBJbml0UmVjdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICAgIGxlZnQgPSBwb2ludC54OworICAgIHJpZ2h0ID0gcG9pbnQueDsKKyAgICBib3R0b20gPSBwb2ludC55OworICAgIHRvcCA9IHBvaW50Lnk7CisgIH0KKyAgdm9pZCBVcGRhdGVSZWN0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKKworICBmbG9hdCBXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIHJpZ2h0IC0gbGVmdDsgfQorICBmbG9hdCBIZWlnaHQoKSBjb25zdCB7IHJldHVybiB0b3AgLSBib3R0b207IH0KKworICB2b2lkIEluZmxhdGUoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgIE5vcm1hbGl6ZSgpOworICAgIGxlZnQgLT0geDsKKyAgICByaWdodCArPSB4OworICAgIGJvdHRvbSAtPSB5OworICAgIHRvcCArPSB5OworICB9CisKKyAgdm9pZCBJbmZsYXRlKGZsb2F0IG90aGVyX2xlZnQsCisgICAgICAgICAgICAgICBmbG9hdCBvdGhlcl9ib3R0b20sCisgICAgICAgICAgICAgICBmbG9hdCBvdGhlcl9yaWdodCwKKyAgICAgICAgICAgICAgIGZsb2F0IG90aGVyX3RvcCkgeworICAgIE5vcm1hbGl6ZSgpOworICAgIGxlZnQgLT0gb3RoZXJfbGVmdDsKKyAgICBib3R0b20gLT0gb3RoZXJfYm90dG9tOworICAgIHJpZ2h0ICs9IG90aGVyX3JpZ2h0OworICAgIHRvcCArPSBvdGhlcl90b3A7CisgIH0KKworICB2b2lkIEluZmxhdGUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcnQpIHsKKyAgICBJbmZsYXRlKHJ0LmxlZnQsIHJ0LmJvdHRvbSwgcnQucmlnaHQsIHJ0LnRvcCk7CisgIH0KKworICB2b2lkIERlZmxhdGUoZmxvYXQgeCwgZmxvYXQgeSkgeworICAgIE5vcm1hbGl6ZSgpOworICAgIGxlZnQgKz0geDsKKyAgICByaWdodCAtPSB4OworICAgIGJvdHRvbSArPSB5OworICAgIHRvcCAtPSB5OworICB9CisKKyAgdm9pZCBEZWZsYXRlKGZsb2F0IG90aGVyX2xlZnQsCisgICAgICAgICAgICAgICBmbG9hdCBvdGhlcl9ib3R0b20sCisgICAgICAgICAgICAgICBmbG9hdCBvdGhlcl9yaWdodCwKKyAgICAgICAgICAgICAgIGZsb2F0IG90aGVyX3RvcCkgeworICAgIE5vcm1hbGl6ZSgpOworICAgIGxlZnQgKz0gb3RoZXJfbGVmdDsKKyAgICBib3R0b20gKz0gb3RoZXJfYm90dG9tOworICAgIHJpZ2h0IC09IG90aGVyX3JpZ2h0OworICAgIHRvcCAtPSBvdGhlcl90b3A7CisgIH0KKworICB2b2lkIERlZmxhdGUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcnQpIHsKKyAgICBEZWZsYXRlKHJ0LmxlZnQsIHJ0LmJvdHRvbSwgcnQucmlnaHQsIHJ0LnRvcCk7CisgIH0KKworICBDRlhfRmxvYXRSZWN0IEdldERlZmxhdGVkKGZsb2F0IHgsIGZsb2F0IHkpIGNvbnN0IHsKKyAgICBpZiAoSXNFbXB0eSgpKQorICAgICAgcmV0dXJuIENGWF9GbG9hdFJlY3QoKTsKKworICAgIENGWF9GbG9hdFJlY3QgdGhhdCA9ICp0aGlzOworICAgIHRoYXQuRGVmbGF0ZSh4LCB5KTsKKyAgICB0aGF0Lk5vcm1hbGl6ZSgpOworICAgIHJldHVybiB0aGF0OworICB9CisKKyAgdm9pZCBUcmFuc2xhdGUoZmxvYXQgZSwgZmxvYXQgZikgeworICAgIGxlZnQgKz0gZTsKKyAgICByaWdodCArPSBlOworICAgIHRvcCArPSBmOworICAgIGJvdHRvbSArPSBmOworICB9CisKKyAgdm9pZCBTY2FsZShmbG9hdCBmU2NhbGUpOworICB2b2lkIFNjYWxlRnJvbUNlbnRlclBvaW50KGZsb2F0IGZTY2FsZSk7CisKKyAgLy8gR2V0SW5uZXJSZWN0KCkgYW5kIGZyaWVuZHMgbWF5IGJlIGJldHRlciBhdCByb3VuZGluZyB0aGFuIHRoZXNlIG1ldGhvZHMuCisgIC8vIFVubGlrZSB0aGUgbWV0aG9kcyBhYm92ZSwgdGhlc2UgdHdvIGJsaW5kbHkgZmxvb3IgLyByb3VuZCB0aGUgTEJSVCB2YWx1ZXMuCisgIC8vIERvaW5nIHNvIG1heSBpbnRyb2R1Y2Ugcm91bmRpbmcgZXJyb3JzIHRoYXQgYXJlIHZpc2libGUgdG8gdXNlcnMgYXMKKyAgLy8gb2ZmLWJ5LW9uZSBwaXhlbHMvbGluZXMuCisgIC8vCisgIC8vIEZsb29ycyBMQlJUIHZhbHVlcy4KKyAgRlhfUkVDVCBUb0Z4UmVjdCgpIGNvbnN0OworCisgIC8vIFJvdW5kcyBMQlJUIHZhbHVlcy4KKyAgRlhfUkVDVCBUb1JvdW5kZWRGeFJlY3QoKSBjb25zdDsKKworICBmbG9hdCBsZWZ0OworICBmbG9hdCBib3R0b207CisgIGZsb2F0IHJpZ2h0OworICBmbG9hdCB0b3A7Cit9OworCisjaWZuZGVmIE5ERUJVRworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpOworI2VuZGlmCisKIC8vIExUV0ggcmVjdGFuZ2xlcyAoeS1heGlzIHJ1bnMgZG93bndhcmRzKS4KIHRlbXBsYXRlIDxjbGFzcyBCYXNlVHlwZT4KIGNsYXNzIENGWF9SVGVtcGxhdGUgewpAQCAtMjI4LDYgKzM5NywxMiBAQAogICAgIE5vcm1hbGl6ZSgpOwogICB9CiAKKyAgZXhwbGljaXQgQ0ZYX1JUZW1wbGF0ZShjb25zdCBDRlhfRmxvYXRSZWN0JiByKQorICAgICAgOiBsZWZ0KHN0YXRpY19jYXN0PEJhc2VUeXBlPihyLmxlZnQpKSwKKyAgICAgICAgdG9wKHN0YXRpY19jYXN0PEJhc2VUeXBlPihyLnRvcCkpLAorICAgICAgICB3aWR0aChzdGF0aWNfY2FzdDxCYXNlVHlwZT4oci5XaWR0aCgpKSksCisgICAgICAgIGhlaWdodChzdGF0aWNfY2FzdDxCYXNlVHlwZT4oci5IZWlnaHQoKSkpIHt9CisKICAgLy8gTk9MSU5UTkVYVExJTkUocnVudGltZS9leHBsaWNpdCkKICAgQ0ZYX1JUZW1wbGF0ZShjb25zdCBSZWN0VHlwZSYgb3RoZXIpCiAgICAgICA6IGxlZnQob3RoZXIubGVmdCksCkBAIC0zMTMsNyArNDg4LDcgQEAKICAgICBEZWZsYXRlKHJ0LmxlZnQsIHJ0LnRvcCwgcnQudG9wICsgcnQud2lkdGgsIHJ0LnRvcCArIHJ0LmhlaWdodCk7CiAgIH0KICAgYm9vbCBJc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gd2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMDsgfQotICBib29sIElzRW1wdHkoRlhfRkxPQVQgZkVwc2lsb24pIGNvbnN0IHsKKyAgYm9vbCBJc0VtcHR5KGZsb2F0IGZFcHNpbG9uKSBjb25zdCB7CiAgICAgcmV0dXJuIHdpZHRoIDw9IGZFcHNpbG9uIHx8IGhlaWdodCA8PSBmRXBzaWxvbjsKICAgfQogICB2b2lkIEVtcHR5KCkgeyB3aWR0aCA9IGhlaWdodCA9IDA7IH0KQEAgLTM0MCwxNCArNTE1LDEyIEBACiAgIHZvaWQgVW5pb24oQmFzZVR5cGUgeCwgQmFzZVR5cGUgeSkgewogICAgIEJhc2VUeXBlIHIgPSByaWdodCgpOwogICAgIEJhc2VUeXBlIGIgPSBib3R0b20oKTsKLSAgICBpZiAobGVmdCA+IHgpCi0gICAgICBsZWZ0ID0geDsKLSAgICBpZiAociA8IHgpCi0gICAgICByID0geDsKLSAgICBpZiAodG9wID4geSkKLSAgICAgIHRvcCA9IHk7Ci0gICAgaWYgKGIgPCB5KQotICAgICAgYiA9IHk7CisKKyAgICBsZWZ0ID0gc3RkOjptaW4obGVmdCwgeCk7CisgICAgdG9wID0gc3RkOjptaW4odG9wLCB5KTsKKyAgICByID0gc3RkOjptYXgociwgeCk7CisgICAgYiA9IHN0ZDo6bWF4KGIsIHkpOworCiAgICAgd2lkdGggPSByIC0gbGVmdDsKICAgICBoZWlnaHQgPSBiIC0gdG9wOwogICB9CkBAIC0zNTUsMjggKzUyOCwyNCBAQAogICB2b2lkIFVuaW9uKGNvbnN0IFJlY3RUeXBlJiBydCkgewogICAgIEJhc2VUeXBlIHIgPSByaWdodCgpOwogICAgIEJhc2VUeXBlIGIgPSBib3R0b20oKTsKLSAgICBpZiAobGVmdCA+IHJ0LmxlZnQpCi0gICAgICBsZWZ0ID0gcnQubGVmdDsKLSAgICBpZiAociA8IHJ0LnJpZ2h0KCkpCi0gICAgICByID0gcnQucmlnaHQoKTsKLSAgICBpZiAodG9wID4gcnQudG9wKQotICAgICAgdG9wID0gcnQudG9wOwotICAgIGlmIChiIDwgcnQuYm90dG9tKCkpCi0gICAgICBiID0gcnQuYm90dG9tKCk7CisKKyAgICBsZWZ0ID0gc3RkOjptaW4obGVmdCwgcnQubGVmdCk7CisgICAgdG9wID0gc3RkOjptaW4odG9wLCBydC50b3ApOworICAgIHIgPSBzdGQ6Om1heChyLCBydC5yaWdodCgpKTsKKyAgICBiID0gc3RkOjptYXgoYiwgcnQuYm90dG9tKCkpOworCiAgICAgd2lkdGggPSByIC0gbGVmdDsKICAgICBoZWlnaHQgPSBiIC0gdG9wOwogICB9CiAgIHZvaWQgSW50ZXJzZWN0KGNvbnN0IFJlY3RUeXBlJiBydCkgewogICAgIEJhc2VUeXBlIHIgPSByaWdodCgpOwogICAgIEJhc2VUeXBlIGIgPSBib3R0b20oKTsKLSAgICBpZiAobGVmdCA8IHJ0LmxlZnQpCi0gICAgICBsZWZ0ID0gcnQubGVmdDsKLSAgICBpZiAociA+IHJ0LnJpZ2h0KCkpCi0gICAgICByID0gcnQucmlnaHQoKTsKLSAgICBpZiAodG9wIDwgcnQudG9wKQotICAgICAgdG9wID0gcnQudG9wOwotICAgIGlmIChiID4gcnQuYm90dG9tKCkpCi0gICAgICBiID0gcnQuYm90dG9tKCk7CisKKyAgICBsZWZ0ID0gc3RkOjptYXgobGVmdCwgcnQubGVmdCk7CisgICAgdG9wID0gc3RkOjptYXgodG9wLCBydC50b3ApOworICAgIHIgPSBzdGQ6Om1pbihyLCBydC5yaWdodCgpKTsKKyAgICBiID0gc3RkOjptaW4oYiwgcnQuYm90dG9tKCkpOworCiAgICAgd2lkdGggPSByIC0gbGVmdDsKICAgICBoZWlnaHQgPSBiIC0gdG9wOwogICB9CkBAIC0zODUsNyArNTU0LDcgQEAKICAgICByZWN0LkludGVyc2VjdCgqdGhpcyk7CiAgICAgcmV0dXJuICFyZWN0LklzRW1wdHkoKTsKICAgfQotICBib29sIEludGVyc2VjdFdpdGgoY29uc3QgUmVjdFR5cGUmIHJ0LCBGWF9GTE9BVCBmRXBzaWxvbikgY29uc3QgeworICBib29sIEludGVyc2VjdFdpdGgoY29uc3QgUmVjdFR5cGUmIHJ0LCBmbG9hdCBmRXBzaWxvbikgY29uc3QgewogICAgIFJlY3RUeXBlIHJlY3QgPSBydDsKICAgICByZWN0LkludGVyc2VjdCgqdGhpcyk7CiAgICAgcmV0dXJuICFyZWN0LklzRW1wdHkoZkVwc2lsb24pOwpAQCAtMzk4LDE5NSArNTY3LDM2IEBACiAgICAgcmV0dXJuICEocmMxID09IHJjMik7CiAgIH0KIAorICBDRlhfRmxvYXRSZWN0IFRvRmxvYXRSZWN0KCkgY29uc3QgeworICAgIC8vIE5vdGUsIHdlIGZsaXAgdG9wL2JvdHRvbSBoZXJlIGJlY2F1c2UgdGhlIENGWF9GbG9hdFJlY3QgaGFzIHRoZQorICAgIC8vIHktYXhpcyBydW5uaW5nIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24uCisgICAgcmV0dXJuIENGWF9GbG9hdFJlY3QobGVmdCwgdG9wLCByaWdodCgpLCBib3R0b20oKSk7CisgIH0KKwogICBCYXNlVHlwZSBsZWZ0OwogICBCYXNlVHlwZSB0b3A7CiAgIEJhc2VUeXBlIHdpZHRoOwogICBCYXNlVHlwZSBoZWlnaHQ7CiB9OwogdXNpbmcgQ0ZYX1JlY3QgPSBDRlhfUlRlbXBsYXRlPGludDMyX3Q+OwotdXNpbmcgQ0ZYX1JlY3RGID0gQ0ZYX1JUZW1wbGF0ZTxGWF9GTE9BVD47Cit1c2luZyBDRlhfUmVjdEYgPSBDRlhfUlRlbXBsYXRlPGZsb2F0PjsKIAotLy8gTFRSQiByZWN0YW5nbGVzICh5LWF4aXMgcnVucyBkb3dud2FyZHMpLgotc3RydWN0IEZYX1JFQ1QgewotICBGWF9SRUNUKCkgOiBsZWZ0KDApLCB0b3AoMCksIHJpZ2h0KDApLCBib3R0b20oMCkge30KLSAgRlhfUkVDVChpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgOiBsZWZ0KGwpLCB0b3AodCksIHJpZ2h0KHIpLCBib3R0b20oYikge30KLQotICBpbnQgV2lkdGgoKSBjb25zdCB7IHJldHVybiByaWdodCAtIGxlZnQ7IH0KLSAgaW50IEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIGJvdHRvbSAtIHRvcDsgfQotICBib29sIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiByaWdodCA8PSBsZWZ0IHx8IGJvdHRvbSA8PSB0b3A7IH0KLQotICBib29sIFZhbGlkKCkgY29uc3QgewotICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8aW50PiB3ID0gcmlnaHQ7Ci0gICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQ+IGggPSBib3R0b207Ci0gICAgdyAtPSBsZWZ0OwotICAgIGggLT0gdG9wOwotICAgIHJldHVybiB3LklzVmFsaWQoKSAmJiBoLklzVmFsaWQoKTsKLSAgfQotCi0gIHZvaWQgTm9ybWFsaXplKCk7Ci0KLSAgdm9pZCBJbnRlcnNlY3QoY29uc3QgRlhfUkVDVCYgc3JjKTsKLSAgdm9pZCBJbnRlcnNlY3QoaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsgSW50ZXJzZWN0KEZYX1JFQ1QobCwgdCwgciwgYikpOyB9Ci0KLSAgdm9pZCBPZmZzZXQoaW50IGR4LCBpbnQgZHkpIHsKLSAgICBsZWZ0ICs9IGR4OwotICAgIHJpZ2h0ICs9IGR4OwotICAgIHRvcCArPSBkeTsKLSAgICBib3R0b20gKz0gZHk7Ci0gIH0KLQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgRlhfUkVDVCYgc3JjKSBjb25zdCB7Ci0gICAgcmV0dXJuIGxlZnQgPT0gc3JjLmxlZnQgJiYgcmlnaHQgPT0gc3JjLnJpZ2h0ICYmIHRvcCA9PSBzcmMudG9wICYmCi0gICAgICAgICAgIGJvdHRvbSA9PSBzcmMuYm90dG9tOwotICB9Ci0KLSAgYm9vbCBDb250YWlucyhpbnQgeCwgaW50IHkpIGNvbnN0IHsKLSAgICByZXR1cm4geCA+PSBsZWZ0ICYmIHggPCByaWdodCAmJiB5ID49IHRvcCAmJiB5IDwgYm90dG9tOwotICB9Ci0KLSAgaW50MzJfdCBsZWZ0OwotICBpbnQzMl90IHRvcDsKLSAgaW50MzJfdCByaWdodDsKLSAgaW50MzJfdCBib3R0b207Ci19OwotCi0vLyBMVFJCIHJlY3RhbmdsZXMgKHktYXhpcyBydW5zIHVwd2FyZHMpLgotY2xhc3MgQ0ZYX0Zsb2F0UmVjdCB7Ci0gcHVibGljOgotICBDRlhfRmxvYXRSZWN0KCkgOiBDRlhfRmxvYXRSZWN0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpIHt9Ci0gIENGWF9GbG9hdFJlY3QoRlhfRkxPQVQgbCwgRlhfRkxPQVQgYiwgRlhfRkxPQVQgciwgRlhfRkxPQVQgdCkKLSAgICAgIDogbGVmdChsKSwgYm90dG9tKGIpLCByaWdodChyKSwgdG9wKHQpIHt9Ci0KLSAgZXhwbGljaXQgQ0ZYX0Zsb2F0UmVjdChjb25zdCBGWF9GTE9BVCogcEFycmF5KQotICAgICAgOiBDRlhfRmxvYXRSZWN0KHBBcnJheVswXSwgcEFycmF5WzFdLCBwQXJyYXlbMl0sIHBBcnJheVszXSkge30KLQotICBleHBsaWNpdCBDRlhfRmxvYXRSZWN0KGNvbnN0IEZYX1JFQ1QmIHJlY3QpOwotCi0gIHZvaWQgTm9ybWFsaXplKCk7Ci0KLSAgdm9pZCBSZXNldCgpIHsKLSAgICBsZWZ0ID0gMC4wZjsKLSAgICByaWdodCA9IDAuMGY7Ci0gICAgYm90dG9tID0gMC4wZjsKLSAgICB0b3AgPSAwLjBmOwotICB9Ci0KLSAgYm9vbCBJc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gbGVmdCA+PSByaWdodCB8fCBib3R0b20gPj0gdG9wOyB9Ci0KLSAgYm9vbCBDb250YWlucyhjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3Q7Ci0gIGJvb2wgQ29udGFpbnMoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgb3RoZXJfcmVjdCkgY29uc3Q7Ci0KLSAgdm9pZCBJbnRlcnNlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgb3RoZXJfcmVjdCk7Ci0gIHZvaWQgVW5pb24oY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgb3RoZXJfcmVjdCk7Ci0KLSAgRlhfUkVDVCBHZXRJbm5lclJlY3QoKSBjb25zdDsKLSAgRlhfUkVDVCBHZXRPdXRlclJlY3QoKSBjb25zdDsKLSAgRlhfUkVDVCBHZXRDbG9zZXN0UmVjdCgpIGNvbnN0OwotCi0gIGludCBTdWJzdHJhY3Q0KENGWF9GbG9hdFJlY3QmIHN1YnN0cmFjdF9yZWN0LCBDRlhfRmxvYXRSZWN0KiBwUmVjdHMpOwotCi0gIHZvaWQgSW5pdFJlY3QoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSkgewotICAgIGxlZnQgPSB4OwotICAgIHJpZ2h0ID0geDsKLSAgICBib3R0b20gPSB5OwotICAgIHRvcCA9IHk7Ci0gIH0KLSAgdm9pZCBVcGRhdGVSZWN0KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpOwotCi0gIEZYX0ZMT0FUIFdpZHRoKCkgY29uc3QgeyByZXR1cm4gcmlnaHQgLSBsZWZ0OyB9Ci0gIEZYX0ZMT0FUIEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIHRvcCAtIGJvdHRvbTsgfQotCi0gIHZvaWQgSW5mbGF0ZShGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KSB7Ci0gICAgTm9ybWFsaXplKCk7Ci0gICAgbGVmdCAtPSB4OwotICAgIHJpZ2h0ICs9IHg7Ci0gICAgYm90dG9tIC09IHk7Ci0gICAgdG9wICs9IHk7Ci0gIH0KLQotICB2b2lkIEluZmxhdGUoRlhfRkxPQVQgb3RoZXJfbGVmdCwKLSAgICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX2JvdHRvbSwKLSAgICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX3JpZ2h0LAotICAgICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfdG9wKSB7Ci0gICAgTm9ybWFsaXplKCk7Ci0gICAgbGVmdCAtPSBvdGhlcl9sZWZ0OwotICAgIGJvdHRvbSAtPSBvdGhlcl9ib3R0b207Ci0gICAgcmlnaHQgKz0gb3RoZXJfcmlnaHQ7Ci0gICAgdG9wICs9IG90aGVyX3RvcDsKLSAgfQotCi0gIHZvaWQgSW5mbGF0ZShjb25zdCBDRlhfRmxvYXRSZWN0JiBydCkgewotICAgIEluZmxhdGUocnQubGVmdCwgcnQuYm90dG9tLCBydC5yaWdodCwgcnQudG9wKTsKLSAgfQotCi0gIHZvaWQgRGVmbGF0ZShGWF9GTE9BVCB4LCBGWF9GTE9BVCB5KSB7Ci0gICAgTm9ybWFsaXplKCk7Ci0gICAgbGVmdCArPSB4OwotICAgIHJpZ2h0IC09IHg7Ci0gICAgYm90dG9tICs9IHk7Ci0gICAgdG9wIC09IHk7Ci0gIH0KLQotICB2b2lkIERlZmxhdGUoRlhfRkxPQVQgb3RoZXJfbGVmdCwKLSAgICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX2JvdHRvbSwKLSAgICAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX3JpZ2h0LAotICAgICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfdG9wKSB7Ci0gICAgTm9ybWFsaXplKCk7Ci0gICAgbGVmdCArPSBvdGhlcl9sZWZ0OwotICAgIGJvdHRvbSArPSBvdGhlcl9ib3R0b207Ci0gICAgcmlnaHQgLT0gb3RoZXJfcmlnaHQ7Ci0gICAgdG9wIC09IG90aGVyX3RvcDsKLSAgfQotCi0gIHZvaWQgRGVmbGF0ZShjb25zdCBDRlhfRmxvYXRSZWN0JiBydCkgewotICAgIERlZmxhdGUocnQubGVmdCwgcnQuYm90dG9tLCBydC5yaWdodCwgcnQudG9wKTsKLSAgfQotCi0gIHZvaWQgVHJhbnNsYXRlKEZYX0ZMT0FUIGUsIEZYX0ZMT0FUIGYpIHsKLSAgICBsZWZ0ICs9IGU7Ci0gICAgcmlnaHQgKz0gZTsKLSAgICB0b3AgKz0gZjsKLSAgICBib3R0b20gKz0gZjsKLSAgfQotCi0gIHN0YXRpYyBDRlhfRmxvYXRSZWN0IEdldEJCb3goY29uc3QgQ0ZYX1BvaW50RiogcFBvaW50cywgaW50IG5Qb2ludHMpOwotCi0gIEZYX1JFQ1QgVG9GeFJlY3QoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEZYX1JFQ1Qoc3RhdGljX2Nhc3Q8aW50MzJfdD4obGVmdCksIHN0YXRpY19jYXN0PGludDMyX3Q+KHRvcCksCi0gICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmlnaHQpLCBzdGF0aWNfY2FzdDxpbnQzMl90Pihib3R0b20pKTsKLSAgfQotCi0gIHN0YXRpYyBDRlhfRmxvYXRSZWN0IEZyb21DRlhSZWN0Rihjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsKLSAgICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0KCksIHJlY3QuYm90dG9tKCkpOwotICB9Ci0KLSAgRlhfRkxPQVQgbGVmdDsKLSAgRlhfRkxPQVQgYm90dG9tOwotICBGWF9GTE9BVCByaWdodDsKLSAgRlhfRkxPQVQgdG9wOwotfTsKLQorLy8gVGhlIG1hdHJpeCBpcyBvZiB0aGUgZm9ybToKKy8vIHwgYSAgYiAgMCB8CisvLyB8IGMgIGQgIDAgfAorLy8gfCBlICBmICAxIHwKKy8vIFNlZSBQREYgc3BlYyAxLjcgU2VjdGlvbiA0LjIuMy4KKy8vCiBjbGFzcyBDRlhfTWF0cml4IHsKICBwdWJsaWM6CiAgIENGWF9NYXRyaXgoKSB7IFNldElkZW50aXR5KCk7IH0KIAotICBleHBsaWNpdCBDRlhfTWF0cml4KGNvbnN0IEZYX0ZMT0FUIG5bNl0pCisgIGV4cGxpY2l0IENGWF9NYXRyaXgoY29uc3QgZmxvYXQgbls2XSkKICAgICAgIDogYShuWzBdKSwgYihuWzFdKSwgYyhuWzJdKSwgZChuWzNdKSwgZShuWzRdKSwgZihuWzVdKSB7fQogCi0gIENGWF9NYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgb3RoZXIpCi0gICAgICA6IGEob3RoZXIuYSksCi0gICAgICAgIGIob3RoZXIuYiksCi0gICAgICAgIGMob3RoZXIuYyksCi0gICAgICAgIGQob3RoZXIuZCksCi0gICAgICAgIGUob3RoZXIuZSksCi0gICAgICAgIGYob3RoZXIuZikge30KKyAgQ0ZYX01hdHJpeChjb25zdCBDRlhfTWF0cml4JiBvdGhlcikgPSBkZWZhdWx0OwogCi0gIENGWF9NYXRyaXgoRlhfRkxPQVQgYTEsCi0gICAgICAgICAgICAgRlhfRkxPQVQgYjEsCi0gICAgICAgICAgICAgRlhfRkxPQVQgYzEsCi0gICAgICAgICAgICAgRlhfRkxPQVQgZDEsCi0gICAgICAgICAgICAgRlhfRkxPQVQgZTEsCi0gICAgICAgICAgICAgRlhfRkxPQVQgZjEpCisgIENGWF9NYXRyaXgoZmxvYXQgYTEsIGZsb2F0IGIxLCBmbG9hdCBjMSwgZmxvYXQgZDEsIGZsb2F0IGUxLCBmbG9hdCBmMSkKICAgICAgIDogYShhMSksIGIoYjEpLCBjKGMxKSwgZChkMSksIGUoZTEpLCBmKGYxKSB7fQogCiAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENGWF9NYXRyaXgmIG90aGVyKSB7CkBAIC02MDcsNyArNjE3LDcgQEAKICAgICBmID0gMDsKICAgfQogCi0gIHZvaWQgU2V0UmV2ZXJzZShjb25zdCBDRlhfTWF0cml4JiBtKTsKKyAgQ0ZYX01hdHJpeCBHZXRJbnZlcnNlKCkgY29uc3Q7CiAKICAgdm9pZCBDb25jYXQoY29uc3QgQ0ZYX01hdHJpeCYgbSwgYm9vbCBiUHJlcGVuZGVkID0gZmFsc2UpOwogICB2b2lkIENvbmNhdEludmVyc2UoY29uc3QgQ0ZYX01hdHJpeCYgbSwgYm9vbCBiUHJlcGVuZGVkID0gZmFsc2UpOwpAQCAtNjIwLDQ5ICs2MzAsNDIgQEAKICAgYm9vbCBJc1NjYWxlZCgpIGNvbnN0OwogICBib29sIFdpbGxTY2FsZSgpIGNvbnN0IHsgcmV0dXJuIGEgIT0gMS4wZiB8fCBiICE9IDAgfHwgYyAhPSAwIHx8IGQgIT0gMS4wZjsgfQogCi0gIHZvaWQgVHJhbnNsYXRlKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIGJvb2wgYlByZXBlbmRlZCA9IGZhbHNlKTsKKyAgdm9pZCBUcmFuc2xhdGUoZmxvYXQgeCwgZmxvYXQgeSwgYm9vbCBiUHJlcGVuZGVkID0gZmFsc2UpOwogICB2b2lkIFRyYW5zbGF0ZShpbnQzMl90IHgsIGludDMyX3QgeSwgYm9vbCBiUHJlcGVuZGVkID0gZmFsc2UpIHsKLSAgICBUcmFuc2xhdGUoc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHgpLCBzdGF0aWNfY2FzdDxGWF9GTE9BVD4oeSksIGJQcmVwZW5kZWQpOworICAgIFRyYW5zbGF0ZShzdGF0aWNfY2FzdDxmbG9hdD4oeCksIHN0YXRpY19jYXN0PGZsb2F0Pih5KSwgYlByZXBlbmRlZCk7CiAgIH0KIAotICB2b2lkIFNjYWxlKEZYX0ZMT0FUIHN4LCBGWF9GTE9BVCBzeSwgYm9vbCBiUHJlcGVuZGVkID0gZmFsc2UpOwotICB2b2lkIFJvdGF0ZShGWF9GTE9BVCBmUmFkaWFuLCBib29sIGJQcmVwZW5kZWQgPSBmYWxzZSk7Ci0gIHZvaWQgUm90YXRlQXQoRlhfRkxPQVQgZlJhZGlhbiwKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCB4LAotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHksCi0gICAgICAgICAgICAgICAgYm9vbCBiUHJlcGVuZGVkID0gZmFsc2UpOworICB2b2lkIFNjYWxlKGZsb2F0IHN4LCBmbG9hdCBzeSwgYm9vbCBiUHJlcGVuZGVkID0gZmFsc2UpOworICB2b2lkIFJvdGF0ZShmbG9hdCBmUmFkaWFuLCBib29sIGJQcmVwZW5kZWQgPSBmYWxzZSk7CisgIHZvaWQgUm90YXRlQXQoZmxvYXQgZlJhZGlhbiwgZmxvYXQgeCwgZmxvYXQgeSwgYm9vbCBiUHJlcGVuZGVkID0gZmFsc2UpOwogCi0gIHZvaWQgU2hlYXIoRlhfRkxPQVQgZkFscGhhUmFkaWFuLAotICAgICAgICAgICAgIEZYX0ZMT0FUIGZCZXRhUmFkaWFuLAotICAgICAgICAgICAgIGJvb2wgYlByZXBlbmRlZCA9IGZhbHNlKTsKKyAgdm9pZCBTaGVhcihmbG9hdCBmQWxwaGFSYWRpYW4sIGZsb2F0IGZCZXRhUmFkaWFuLCBib29sIGJQcmVwZW5kZWQgPSBmYWxzZSk7CiAKICAgdm9pZCBNYXRjaFJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgZGVzdCwgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgc3JjKTsKIAotICBGWF9GTE9BVCBHZXRYVW5pdCgpIGNvbnN0OwotICBGWF9GTE9BVCBHZXRZVW5pdCgpIGNvbnN0OworICBmbG9hdCBHZXRYVW5pdCgpIGNvbnN0OworICBmbG9hdCBHZXRZVW5pdCgpIGNvbnN0OwogICBDRlhfRmxvYXRSZWN0IEdldFVuaXRSZWN0KCkgY29uc3Q7CiAKLSAgRlhfRkxPQVQgVHJhbnNmb3JtWERpc3RhbmNlKEZYX0ZMT0FUIGR4KSBjb25zdDsKLSAgRlhfRkxPQVQgVHJhbnNmb3JtRGlzdGFuY2UoRlhfRkxPQVQgZHgsIEZYX0ZMT0FUIGR5KSBjb25zdDsKLSAgRlhfRkxPQVQgVHJhbnNmb3JtRGlzdGFuY2UoRlhfRkxPQVQgZGlzdGFuY2UpIGNvbnN0OworICBmbG9hdCBUcmFuc2Zvcm1YRGlzdGFuY2UoZmxvYXQgZHgpIGNvbnN0OworICBmbG9hdCBUcmFuc2Zvcm1EaXN0YW5jZShmbG9hdCBkaXN0YW5jZSkgY29uc3Q7CiAKICAgQ0ZYX1BvaW50RiBUcmFuc2Zvcm0oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIGNvbnN0OwogCi0gIHZvaWQgVHJhbnNmb3JtUmVjdChDRlhfUmVjdEYmIHJlY3QpIGNvbnN0OwotICB2b2lkIFRyYW5zZm9ybVJlY3QoRlhfRkxPQVQmIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgdG9wLAotICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGJvdHRvbSkgY29uc3Q7Ci0gIHZvaWQgVHJhbnNmb3JtUmVjdChDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdCB7Ci0gICAgVHJhbnNmb3JtUmVjdChyZWN0LmxlZnQsIHJlY3QucmlnaHQsIHJlY3QudG9wLCByZWN0LmJvdHRvbSk7Ci0gIH0KKyAgc3RkOjp0dXBsZTxmbG9hdCwgZmxvYXQsIGZsb2F0LCBmbG9hdD4gVHJhbnNmb3JtUmVjdCgKKyAgICAgIGNvbnN0IGZsb2F0JiBsZWZ0LAorICAgICAgY29uc3QgZmxvYXQmIHJpZ2h0LAorICAgICAgY29uc3QgZmxvYXQmIHRvcCwKKyAgICAgIGNvbnN0IGZsb2F0JiBib3R0b20pIGNvbnN0OworICBDRlhfUmVjdEYgVHJhbnNmb3JtUmVjdChjb25zdCBDRlhfUmVjdEYmIHJlY3QpIGNvbnN0OworICBDRlhfRmxvYXRSZWN0IFRyYW5zZm9ybVJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3Q7CiAKLSAgRlhfRkxPQVQgYTsKLSAgRlhfRkxPQVQgYjsKLSAgRlhfRkxPQVQgYzsKLSAgRlhfRkxPQVQgZDsKLSAgRlhfRkxPQVQgZTsKLSAgRlhfRkxPQVQgZjsKKyAgZmxvYXQgYTsKKyAgZmxvYXQgYjsKKyAgZmxvYXQgYzsKKyAgZmxvYXQgZDsKKyAgZmxvYXQgZTsKKyAgZmxvYXQgZjsKIAogIHByaXZhdGU6CiAgIHZvaWQgQ29uY2F0SW50ZXJuYWwoY29uc3QgQ0ZYX01hdHJpeCYgb3RoZXIsIGJvb2wgcHJlcGVuZCk7CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXNfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNjhhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDI5MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK1RFU1QoQ0ZYX0Zsb2F0UmVjdCwgR2V0QkJveCkgeworICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBDRlhfRmxvYXRSZWN0OjpHZXRCQm94KG51bGxwdHIsIDApOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5sZWZ0KTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuMGYsIHJlY3QuYm90dG9tKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuMGYsIHJlY3QucmlnaHQpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC50b3ApOworCisgIHN0ZDo6dmVjdG9yPENGWF9Qb2ludEY+IGRhdGE7CisgIGRhdGEuZW1wbGFjZV9iYWNrKDAuMGYsIDAuMGYpOworICByZWN0ID0gQ0ZYX0Zsb2F0UmVjdDo6R2V0QkJveChkYXRhLmRhdGEoKSwgMCk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LmxlZnQpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5ib3R0b20pOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5yaWdodCk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LnRvcCk7CisgIHJlY3QgPSBDRlhfRmxvYXRSZWN0OjpHZXRCQm94KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LmxlZnQpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5ib3R0b20pOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5yaWdodCk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LnRvcCk7CisKKyAgZGF0YS5lbXBsYWNlX2JhY2soMi41ZiwgNi4yZik7CisgIGRhdGEuZW1wbGFjZV9iYWNrKDEuNWYsIDYuMmYpOworICByZWN0ID0gQ0ZYX0Zsb2F0UmVjdDo6R2V0QkJveChkYXRhLmRhdGEoKSwgMik7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LmxlZnQpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5ib3R0b20pOworICBFWFBFQ1RfRkxPQVRfRVEoMi41ZiwgcmVjdC5yaWdodCk7CisgIEVYUEVDVF9GTE9BVF9FUSg2LjJmLCByZWN0LnRvcCk7CisKKyAgcmVjdCA9IENGWF9GbG9hdFJlY3Q6OkdldEJCb3goZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuMGYsIHJlY3QubGVmdCk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LmJvdHRvbSk7CisgIEVYUEVDVF9GTE9BVF9FUSgyLjVmLCByZWN0LnJpZ2h0KTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDYuMmYsIHJlY3QudG9wKTsKKworICBkYXRhLmVtcGxhY2VfYmFjaygyLjVmLCA2LjNmKTsKKyAgcmVjdCA9IENGWF9GbG9hdFJlY3Q6OkdldEJCb3goZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuMGYsIHJlY3QubGVmdCk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LmJvdHRvbSk7CisgIEVYUEVDVF9GTE9BVF9FUSgyLjVmLCByZWN0LnJpZ2h0KTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDYuM2YsIHJlY3QudG9wKTsKKworICBkYXRhLmVtcGxhY2VfYmFjaygtMy4wZiwgNi4zZik7CisgIHJlY3QgPSBDRlhfRmxvYXRSZWN0OjpHZXRCQm94KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7CisgIEVYUEVDVF9GTE9BVF9FUSgtMy4wZiwgcmVjdC5sZWZ0KTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuMGYsIHJlY3QuYm90dG9tKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDIuNWYsIHJlY3QucmlnaHQpOworICBFWFBFQ1RfRkxPQVRfRVEoNi4zZiwgcmVjdC50b3ApOworCisgIGRhdGEuZW1wbGFjZV9iYWNrKDQuMGYsIC04LjBmKTsKKyAgcmVjdCA9IENGWF9GbG9hdFJlY3Q6OkdldEJCb3goZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKC0zLjBmLCByZWN0LmxlZnQpOworICBFWFBFQ1RfRkxPQVRfRVEoLTguMGYsIHJlY3QuYm90dG9tKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDQuMGYsIHJlY3QucmlnaHQpOworICBFWFBFQ1RfRkxPQVRfRVEoNi4zZiwgcmVjdC50b3ApOworfQorCitURVNUKENGWF9GbG9hdFJlY3QsIE5vcm1hbGl6ZSkgeworICBDRlhfRmxvYXRSZWN0IHJlY3Q7CisgIHJlY3QuTm9ybWFsaXplKCk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LmxlZnQpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5ib3R0b20pOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5yaWdodCk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LnRvcCk7CisKKyAgcmVjdCA9IENGWF9GbG9hdFJlY3QoLTEuMGYsIC0zLjBmLCA0LjVmLCAzLjJmKTsKKyAgcmVjdC5Ob3JtYWxpemUoKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKC0xLjBmLCByZWN0LmxlZnQpOworICBFWFBFQ1RfRkxPQVRfRVEoLTMuMGYsIHJlY3QuYm90dG9tKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDQuNWYsIHJlY3QucmlnaHQpOworICBFWFBFQ1RfRkxPQVRfRVEoMy4yZiwgcmVjdC50b3ApOworICByZWN0LlNjYWxlKC0xLjBmKTsKKyAgcmVjdC5Ob3JtYWxpemUoKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKC00LjVmLCByZWN0LmxlZnQpOworICBFWFBFQ1RfRkxPQVRfRVEoLTMuMmYsIHJlY3QuYm90dG9tKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDEuMGYsIHJlY3QucmlnaHQpOworICBFWFBFQ1RfRkxPQVRfRVEoMy4wZiwgcmVjdC50b3ApOworfQorCitURVNUKENGWF9GbG9hdFJlY3QsIFNjYWxlKSB7CisgIENGWF9GbG9hdFJlY3QgcmVjdCgtMS4wZiwgLTMuMGYsIDQuNWYsIDMuMmYpOworICByZWN0LlNjYWxlKDEuMGYpOworICBFWFBFQ1RfRkxPQVRfRVEoLTEuMGYsIHJlY3QubGVmdCk7CisgIEVYUEVDVF9GTE9BVF9FUSgtMy4wZiwgcmVjdC5ib3R0b20pOworICBFWFBFQ1RfRkxPQVRfRVEoNC41ZiwgcmVjdC5yaWdodCk7CisgIEVYUEVDVF9GTE9BVF9FUSgzLjJmLCByZWN0LnRvcCk7CisgIHJlY3QuU2NhbGUoMC41Zik7CisgIEVYUEVDVF9GTE9BVF9FUSgtMC41LCByZWN0LmxlZnQpOworICBFWFBFQ1RfRkxPQVRfRVEoLTEuNSwgcmVjdC5ib3R0b20pOworICBFWFBFQ1RfRkxPQVRfRVEoMi4yNWYsIHJlY3QucmlnaHQpOworICBFWFBFQ1RfRkxPQVRfRVEoMS42ZiwgcmVjdC50b3ApOworICByZWN0LlNjYWxlKDIuMGYpOworICBFWFBFQ1RfRkxPQVRfRVEoLTEuMGYsIHJlY3QubGVmdCk7CisgIEVYUEVDVF9GTE9BVF9FUSgtMy4wZiwgcmVjdC5ib3R0b20pOworICBFWFBFQ1RfRkxPQVRfRVEoNC41ZiwgcmVjdC5yaWdodCk7CisgIEVYUEVDVF9GTE9BVF9FUSgzLjJmLCByZWN0LnRvcCk7CisgIHJlY3QuU2NhbGUoLTEuMGYpOworICBFWFBFQ1RfRkxPQVRfRVEoMS4wZiwgcmVjdC5sZWZ0KTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDMuMGYsIHJlY3QuYm90dG9tKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKC00LjVmLCByZWN0LnJpZ2h0KTsKKyAgRVhQRUNUX0ZMT0FUX0VRKC0zLjJmLCByZWN0LnRvcCk7CisgIHJlY3QuU2NhbGUoMC4wZik7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LmxlZnQpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5ib3R0b20pOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5yaWdodCk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LnRvcCk7Cit9CisKK1RFU1QoQ0ZYX0Zsb2F0UmVjdCwgU2NhbGVFbXB0eSkgeworICBDRlhfRmxvYXRSZWN0IHJlY3Q7CisgIHJlY3QuU2NhbGUoMS4wZik7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LmxlZnQpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5ib3R0b20pOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5yaWdodCk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LnRvcCk7CisgIHJlY3QuU2NhbGUoMC41Zik7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LmxlZnQpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5ib3R0b20pOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5yaWdodCk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LnRvcCk7CisgIHJlY3QuU2NhbGUoMi4wZik7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LmxlZnQpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5ib3R0b20pOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5yaWdodCk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LnRvcCk7CisgIHJlY3QuU2NhbGUoMC4wZik7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LmxlZnQpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5ib3R0b20pOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5yaWdodCk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LnRvcCk7Cit9CisKK1RFU1QoQ0ZYX0Zsb2F0UmVjdCwgU2NhbGVGcm9tQ2VudGVyUG9pbnQpIHsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0KC0xLjBmLCAtMy4wZiwgNC41ZiwgMy4yZik7CisgIHJlY3QuU2NhbGVGcm9tQ2VudGVyUG9pbnQoMS4wZik7CisgIEVYUEVDVF9GTE9BVF9FUSgtMS4wZiwgcmVjdC5sZWZ0KTsKKyAgRVhQRUNUX0ZMT0FUX0VRKC0zLjBmLCByZWN0LmJvdHRvbSk7CisgIEVYUEVDVF9GTE9BVF9FUSg0LjVmLCByZWN0LnJpZ2h0KTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDMuMmYsIHJlY3QudG9wKTsKKyAgcmVjdC5TY2FsZUZyb21DZW50ZXJQb2ludCgwLjVmKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuMzc1ZiwgcmVjdC5sZWZ0KTsKKyAgRVhQRUNUX0ZMT0FUX0VRKC0xLjQ1ZiwgcmVjdC5ib3R0b20pOworICBFWFBFQ1RfRkxPQVRfRVEoMy4xMjVmLCByZWN0LnJpZ2h0KTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDEuNjVmLCByZWN0LnRvcCk7CisgIHJlY3QuU2NhbGVGcm9tQ2VudGVyUG9pbnQoMi4wZik7CisgIEVYUEVDVF9GTE9BVF9FUSgtMS4wZiwgcmVjdC5sZWZ0KTsKKyAgRVhQRUNUX0ZMT0FUX0VRKC0zLjBmLCByZWN0LmJvdHRvbSk7CisgIEVYUEVDVF9GTE9BVF9FUSg0LjVmLCByZWN0LnJpZ2h0KTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDMuMmYsIHJlY3QudG9wKTsKKyAgcmVjdC5TY2FsZUZyb21DZW50ZXJQb2ludCgtMS4wZik7CisgIEVYUEVDVF9GTE9BVF9FUSg0LjVmLCByZWN0LmxlZnQpOworICBFWFBFQ1RfRkxPQVRfRVEoMy4yZiwgcmVjdC5ib3R0b20pOworICBFWFBFQ1RfRkxPQVRfRVEoLTEuMGYsIHJlY3QucmlnaHQpOworICBFWFBFQ1RfRkxPQVRfRVEoLTMuMGYsIHJlY3QudG9wKTsKKyAgcmVjdC5TY2FsZUZyb21DZW50ZXJQb2ludCgwLjBmKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDEuNzVmLCByZWN0LmxlZnQpOworICBFWFBFQ1RfTkVBUigwLjFmLCByZWN0LmJvdHRvbSwgMC4wMDFmKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDEuNzVmLCByZWN0LnJpZ2h0KTsKKyAgRVhQRUNUX05FQVIoMC4xZiwgcmVjdC50b3AsIDAuMDAxZik7Cit9CisKK1RFU1QoQ0ZYX0Zsb2F0UmVjdCwgU2NhbGVGcm9tQ2VudGVyUG9pbnRFbXB0eSkgeworICBDRlhfRmxvYXRSZWN0IHJlY3Q7CisgIHJlY3QuU2NhbGVGcm9tQ2VudGVyUG9pbnQoMS4wZik7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LmxlZnQpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5ib3R0b20pOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5yaWdodCk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LnRvcCk7CisgIHJlY3QuU2NhbGVGcm9tQ2VudGVyUG9pbnQoMC41Zik7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LmxlZnQpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5ib3R0b20pOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5yaWdodCk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LnRvcCk7CisgIHJlY3QuU2NhbGVGcm9tQ2VudGVyUG9pbnQoMi4wZik7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LmxlZnQpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5ib3R0b20pOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5yaWdodCk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LnRvcCk7CisgIHJlY3QuU2NhbGVGcm9tQ2VudGVyUG9pbnQoMC4wZik7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LmxlZnQpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5ib3R0b20pOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wZiwgcmVjdC5yaWdodCk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZWN0LnRvcCk7Cit9CisKKyNpZm5kZWYgTkRFQlVHCitURVNUKENGWF9GbG9hdFJlY3QsIFByaW50KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0OworICBvcyA8PCByZWN0OworICBFWFBFQ1RfU1RSRVEoInJlY3RbMHgwICgwLCAwKV0iLCBvcy5zdHIoKS5jX3N0cigpKTsKKworICBvcy5zdHIoIiIpOworICByZWN0ID0gQ0ZYX0Zsb2F0UmVjdCgxMCwgMjAsIDE0LCAyMyk7CisgIG9zIDw8IHJlY3Q7CisgIEVYUEVDVF9TVFJFUSgicmVjdFs0eDMgKDEwLCAyMCldIiwgb3Muc3RyKCkuY19zdHIoKSk7CisKKyAgb3Muc3RyKCIiKTsKKyAgcmVjdCA9IENGWF9GbG9hdFJlY3QoMTAuNSwgMjAuNSwgMTQuNzUsIDIzLjc1KTsKKyAgb3MgPDwgcmVjdDsKKyAgRVhQRUNUX1NUUkVRKCJyZWN0WzQuMjV4My4yNSAoMTAuNSwgMjAuNSldIiwgb3Muc3RyKCkuY19zdHIoKSk7Cit9CisjZW5kaWYKKworVEVTVChDRlhfTWF0cml4LCBSZXZlcnNlSWRlbnRpdHkpIHsKKyAgQ0ZYX01hdHJpeCBtOworICBtLlNldElkZW50aXR5KCk7CisgIENGWF9NYXRyaXggcmV2ID0gbS5HZXRJbnZlcnNlKCk7CisKKyAgRVhQRUNUX0ZMT0FUX0VRKDEuMCwgcmV2LmEpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wLCByZXYuYik7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjAsIHJldi5jKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDEuMCwgcmV2LmQpOworICBFWFBFQ1RfRkxPQVRfRVEoMC4wLCByZXYuZSk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjAsIHJldi5mKTsKKworICBDRlhfUG9pbnRGIGV4cGVjdGVkKDIsIDMpOworICBDRlhfUG9pbnRGIHJlc3VsdCA9IHJldi5UcmFuc2Zvcm0obS5UcmFuc2Zvcm0oQ0ZYX1BvaW50RigyLCAzKSkpOworICBFWFBFQ1RfRkxPQVRfRVEoZXhwZWN0ZWQueCwgcmVzdWx0LngpOworICBFWFBFQ1RfRkxPQVRfRVEoZXhwZWN0ZWQueSwgcmVzdWx0LnkpOworfQorCitURVNUKENGWF9NYXRyaXgsIFJldmVyc2UpIHsKKyAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBkYXRhWzZdID0gezMsIDAsIDIsIDMsIDEsIDR9OworICBDRlhfTWF0cml4IG0oZGF0YSk7CisgIENGWF9NYXRyaXggcmV2ID0gbS5HZXRJbnZlcnNlKCk7CisKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuMzMzMzMzMzRmLCByZXYuYSk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjBmLCByZXYuYik7CisgIEVYUEVDVF9GTE9BVF9FUSgtMC4yMjIyMjIyMmYsIHJldi5jKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuMzMzMzMzMzRmLCByZXYuZCk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLjU1NTU1NTU2ZiwgcmV2LmUpOworICBFWFBFQ1RfRkxPQVRfRVEoLTEuMzMzMzMzNGYsIHJldi5mKTsKKworICBDRlhfUG9pbnRGIGV4cGVjdGVkKDIsIDMpOworICBDRlhfUG9pbnRGIHJlc3VsdCA9IHJldi5UcmFuc2Zvcm0obS5UcmFuc2Zvcm0oQ0ZYX1BvaW50RigyLCAzKSkpOworICBFWFBFQ1RfRkxPQVRfRVEoZXhwZWN0ZWQueCwgcmVzdWx0LngpOworICBFWFBFQ1RfRkxPQVRfRVEoZXhwZWN0ZWQueSwgcmVzdWx0LnkpOworfQorCisvLyBOb3RlLCBJIHRoaW5rIHRoZXNlIGFyZSBhIGJ1ZyBhbmQgdGhlIG1hdHJpeCBzaG91bGQgYmUgdGhlIGlkZW50aXR5LgorVEVTVChDRlhfTWF0cml4LCBSZXZlcnNlQ1I3MDIwNDEpIHsKKyAgLy8gVGhlIGRldGVybWluYXRlIGlzIDwgc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmVwc2lsb24oKQorICBzdGF0aWMgY29uc3RleHByIGZsb2F0IGRhdGFbNl0gPSB7MC45NDczNjg0NDNmLCAtMC4xMDg5NDczNjZmLCAtMC45MjMwNzY5MjhmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMDYxNTM4NDZmLCAxOC4wZiwgICAgICAgICA3ODcuOTI5OTkzZn07CisgIENGWF9NYXRyaXggbShkYXRhKTsKKyAgQ0ZYX01hdHJpeCByZXYgPSBtLkdldEludmVyc2UoKTsKKworICBFWFBFQ1RfRkxPQVRfRVEoMTQyNDc3MjguMGYsIHJldi5hKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDE0NjIyNjY4LjBmLCByZXYuYik7CisgIEVYUEVDVF9GTE9BVF9FUSgxLjIzODkzMjllKzA4ZiwgcmV2LmMpOworICBFWFBFQ1RfRkxPQVRfRVEoMS4yNzE1MzY0ZSswOGYsIHJldi5kKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKC05Ljc4NzU2OThlKzEwZiwgcmV2LmUpOworICBFWFBFQ1RfRkxPQVRfRVEoLTEuMDA0NTEzOGUrMTFmLCByZXYuZik7CisKKyAgLy8gU2hvdWxkIGJlIDIsIDMKKyAgQ0ZYX1BvaW50RiBleHBlY3RlZCgwLCAwKTsKKyAgQ0ZYX1BvaW50RiByZXN1bHQgPSByZXYuVHJhbnNmb3JtKG0uVHJhbnNmb3JtKENGWF9Qb2ludEYoMiwgMykpKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKGV4cGVjdGVkLngsIHJlc3VsdC54KTsKKyAgRVhQRUNUX0ZMT0FUX0VRKGV4cGVjdGVkLnksIHJlc3VsdC55KTsKK30KKworVEVTVChDRlhfTWF0cml4LCBSZXZlcnNlQ1I3MTQxODcpIHsKKyAgLy8gVGhlIGRldGVybWluYXRlIGlzIDwgc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmVwc2lsb24oKQorICBzdGF0aWMgY29uc3RleHByIGZsb2F0IGRhdGFbNl0gPSB7MC4wMDAwMzdmLCAgMC4wZiwgICAgICAgIDAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwMzdmLCAxODIuNDEzMTAxZiwgMTM2Ljk3NzY0NmZ9OworICBDRlhfTWF0cml4IG0oZGF0YSk7CisgIENGWF9NYXRyaXggcmV2ID0gbS5HZXRJbnZlcnNlKCk7CisKKyAgRVhQRUNUX0ZMT0FUX0VRKDI3MDI3LjAyNWYsIHJldi5hKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuMGYsIHJldi5iKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDAuMGYsIHJldi5jKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKC0yNzAyNy4wMjVmLCByZXYuZCk7CisgIEVYUEVDVF9GTE9BVF9FUSgtNDkzMDA4My41ZiwgcmV2LmUpOworICBFWFBFQ1RfRkxPQVRfRVEoMzcwMjA5OC4yZiwgcmV2LmYpOworCisgIC8vIFNob3VsZCBiZSAzIC4uLi4KKyAgQ0ZYX1BvaW50RiBleHBlY3RlZCgyLCAyLjc1KTsKKyAgQ0ZYX1BvaW50RiByZXN1bHQgPSByZXYuVHJhbnNmb3JtKG0uVHJhbnNmb3JtKENGWF9Qb2ludEYoMiwgMykpKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKGV4cGVjdGVkLngsIHJlc3VsdC54KTsKKyAgRVhQRUNUX0ZMT0FUX0VRKGV4cGVjdGVkLnksIHJlc3VsdC55KTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvZnhfZXh0LmggYi9jb3JlL2Z4Y3J0L2Z4X2V4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjAzOTM4Li4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjcnQvZnhfZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlhDUlRfRlhfRVhUX0hfCi0jZGVmaW5lIENPUkVfRlhDUlRfRlhfRVhUX0hfCi0KLSNpbmNsdWRlIDxjY3R5cGU+Ci0jaW5jbHVkZSA8Y3djdHlwZT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0KLSNkZWZpbmUgRlhfSU5WQUxJRF9PRkZTRVQgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KC0xKQotCi1GWF9GTE9BVCBGWFNZU190YW4oRlhfRkxPQVQgYSk7Ci1GWF9GTE9BVCBGWFNZU19sb2diKEZYX0ZMT0FUIGIsIEZYX0ZMT0FUIHgpOwotRlhfRkxPQVQgRlhTWVNfc3RydG9mKGNvbnN0IEZYX0NIQVIqIHBjc1N0ciwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGggPSAtMSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBwVXNlZExlbiA9IG51bGxwdHIpOwotRlhfRkxPQVQgRlhTWVNfd2NzdG9mKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoID0gLTEsCi0gICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcFVzZWRMZW4gPSBudWxscHRyKTsKLUZYX1dDSEFSKiBGWFNZU193Y3NuY3B5KEZYX1dDSEFSKiBkc3RTdHIsIGNvbnN0IEZYX1dDSEFSKiBzcmNTdHIsIHNpemVfdCBjb3VudCk7Ci1pbnQzMl90IEZYU1lTX3djc25pY21wKGNvbnN0IEZYX1dDSEFSKiBzMSwgY29uc3QgRlhfV0NIQVIqIHMyLCBzaXplX3QgY291bnQpOwotaW50MzJfdCBGWFNZU19zdHJuaWNtcChjb25zdCBGWF9DSEFSKiBzMSwgY29uc3QgRlhfQ0hBUiogczIsIHNpemVfdCBjb3VudCk7Ci0KLWlubGluZSBib29sIEZYU1lTX2lzbG93ZXIoaW50MzJfdCBjaCkgewotICByZXR1cm4gY2ggPj0gJ2EnICYmIGNoIDw9ICd6JzsKLX0KLWlubGluZSBib29sIEZYU1lTX2lzdXBwZXIoaW50MzJfdCBjaCkgewotICByZXR1cm4gY2ggPj0gJ0EnICYmIGNoIDw9ICdaJzsKLX0KLWlubGluZSBpbnQzMl90IEZYU1lTX3RvbG93ZXIoaW50MzJfdCBjaCkgewotICByZXR1cm4gY2ggPCAnQScgfHwgY2ggPiAnWicgPyBjaCA6IChjaCArIDB4MjApOwotfQotaW5saW5lIGludDMyX3QgRlhTWVNfdG91cHBlcihpbnQzMl90IGNoKSB7Ci0gIHJldHVybiBjaCA8ICdhJyB8fCBjaCA+ICd6JyA/IGNoIDogKGNoIC0gMHgyMCk7Ci19Ci1pbmxpbmUgYm9vbCBGWFNZU19pc3dhbHBoYSh3Y2hhcl90IHdjaCkgewotICByZXR1cm4gKHdjaCA+PSBMJ0EnICYmIHdjaCA8PSBMJ1onKSB8fCAod2NoID49IEwnYScgJiYgd2NoIDw9IEwneicpOwotfQotaW5saW5lIGJvb2wgRlhTWVNfaXN3ZGlnaXQod2NoYXJfdCB3Y2gpIHsKLSAgcmV0dXJuIHdjaCA+PSBMJzAnICYmIHdjaCA8PSBMJzknOwotfQotaW5saW5lIGJvb2wgRlhTWVNfaXN3YWxudW0od2NoYXJfdCB3Y2gpIHsKLSAgcmV0dXJuIEZYU1lTX2lzd2FscGhhKHdjaCkgfHwgRlhTWVNfaXN3ZGlnaXQod2NoKTsKLX0KLWlubGluZSBib29sIEZYU1lTX2lzd3NwYWNlKEZYX1dDSEFSIGMpIHsKLSAgcmV0dXJuIChjID09IDB4MjApIHx8IChjID09IDB4MGQpIHx8IChjID09IDB4MGEpIHx8IChjID09IDB4MDkpOwotfQotCi1pbmxpbmUgaW50IEZYU1lTX3RvSGV4RGlnaXQoY29uc3QgRlhfQ0hBUiBjKSB7Ci0gIGlmICghc3RkOjppc3hkaWdpdChjKSkKLSAgICByZXR1cm4gMDsKLSAgY2hhciB1cGNoYXIgPSBzdGQ6OnRvdXBwZXIoYyk7Ci0gIHJldHVybiB1cGNoYXIgPiAnOScgPyB1cGNoYXIgLSAnQScgKyAxMCA6IHVwY2hhciAtICcwJzsKLX0KLQotaW5saW5lIGJvb2wgRlhTWVNfaXNEZWNpbWFsRGlnaXQoY29uc3QgRlhfQ0hBUiBjKSB7Ci0gIHJldHVybiAhIXN0ZDo6aXNkaWdpdChjKTsKLX0KLQotaW5saW5lIGJvb2wgRlhTWVNfaXNEZWNpbWFsRGlnaXQoY29uc3QgRlhfV0NIQVIgYykgewotICByZXR1cm4gISFzdGQ6Omlzd2RpZ2l0KGMpOwotfQotCi1pbmxpbmUgaW50IEZYU1lTX3RvRGVjaW1hbERpZ2l0KGNvbnN0IEZYX0NIQVIgYykgewotICByZXR1cm4gc3RkOjppc2RpZ2l0KGMpID8gYyAtICcwJyA6IDA7Ci19Ci0KLWlubGluZSBpbnQgRlhTWVNfdG9EZWNpbWFsRGlnaXQoY29uc3QgRlhfV0NIQVIgYykgewotICByZXR1cm4gc3RkOjppc3dkaWdpdChjKSA/IGMgLSBMJzAnIDogMDsKLX0KLQotRlhfRkxPQVQgRlhTWVNfRnJhY3Rpb25hbFNjYWxlKHNpemVfdCBzY2FsZV9mYWN0b3IsIGludCB2YWx1ZSk7Ci1pbnQgRlhTWVNfRnJhY3Rpb25hbFNjYWxlQ291bnQoKTsKLQotdm9pZCogRlhfUmFuZG9tX01UX1N0YXJ0KHVpbnQzMl90IGR3U2VlZCk7Ci12b2lkIEZYX1JhbmRvbV9NVF9DbG9zZSh2b2lkKiBwQ29udGV4dCk7Ci11aW50MzJfdCBGWF9SYW5kb21fTVRfR2VuZXJhdGUodm9pZCogcENvbnRleHQpOwotdm9pZCBGWF9SYW5kb21fR2VuZXJhdGVCYXNlKHVpbnQzMl90KiBwQnVmZmVyLCBpbnQzMl90IGlDb3VudCk7Ci12b2lkIEZYX1JhbmRvbV9HZW5lcmF0ZU1UKHVpbnQzMl90KiBwQnVmZmVyLCBpbnQzMl90IGlDb3VudCk7Ci12b2lkIEZYX1JhbmRvbV9HZW5lcmF0ZUNyeXB0byh1aW50MzJfdCogcEJ1ZmZlciwgaW50MzJfdCBpQ291bnQpOwotCi0jaWZkZWYgUERGX0VOQUJMRV9YRkEKLXN0cnVjdCBGWF9HVUlEIHsKLSAgdWludDMyX3QgZGF0YTE7Ci0gIHVpbnQxNl90IGRhdGEyOwotICB1aW50MTZfdCBkYXRhMzsKLSAgdWludDhfdCBkYXRhNFs4XTsKLX07Ci12b2lkIEZYX0dVSURfQ3JlYXRlVjQoRlhfR1VJRCogcEdVSUQpOwotdm9pZCBGWF9HVUlEX1RvU3RyaW5nKGNvbnN0IEZYX0dVSUQqIHBHVUlELAotICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBic1N0ciwKLSAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXBhcmF0b3IgPSB0cnVlKTsKLSNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKLQotI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0ZYX0VYVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF9leHRlbnNpb24uY3BwIGIvY29yZS9meGNydC9meF9leHRlbnNpb24uY3BwCmluZGV4IDViNTc3ZjcuLjYyY2Y4YTAgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmNwcAorKysgYi9jb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5jcHAKQEAgLTQsNDUyICs0LDE4IEBACiAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8Y3djdHlwZT4KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dC5oIgotCi0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotI2luY2x1ZGUgPHdpbmNyeXB0Lmg+Ci0jZWxzZQotI2luY2x1ZGUgPGN0aW1lPgotI2VuZGlmCi0KLW5hbWVzcGFjZSB7Ci0KLSNpZmRlZiBQREZfRU5BQkxFX1hGQQotCi1jbGFzcyBDRlhfQ1JURmlsZUFjY2VzcyA6IHB1YmxpYyBJRlhfRmlsZUFjY2VzcyB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KLSAgZnJpZW5kIENGWF9SZXRhaW5QdHI8VD4gcGRmaXVtOjpNYWtlUmV0YWluKEFyZ3MmJi4uLiBhcmdzKTsKLQotICAvLyBJRlhfRmlsZUFjY2VzcwotICB2b2lkIEdldFBhdGgoQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0aCkgb3ZlcnJpZGU7Ci0gIENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlU3RyZWFtPiBDcmVhdGVGaWxlU3RyZWFtKHVpbnQzMl90IGR3TW9kZXMpIG92ZXJyaWRlOwotCi0gIGJvb2wgSW5pdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUGF0aCk7Ci0KLSBwcml2YXRlOgotICBDRlhfQ1JURmlsZUFjY2VzcygpOwotICB+Q0ZYX0NSVEZpbGVBY2Nlc3MoKSBvdmVycmlkZTsKLQotICBDRlhfV2lkZVN0cmluZyBtX3BhdGg7Ci19OwotCi1DRlhfQ1JURmlsZUFjY2Vzczo6Q0ZYX0NSVEZpbGVBY2Nlc3MoKSB7fQotCi1DRlhfQ1JURmlsZUFjY2Vzczo6fkNGWF9DUlRGaWxlQWNjZXNzKCkge30KLQotdm9pZCBDRlhfQ1JURmlsZUFjY2Vzczo6R2V0UGF0aChDRlhfV2lkZVN0cmluZyYgd3NQYXRoKSB7Ci0gIHdzUGF0aCA9IG1fcGF0aDsKLX0KLQotQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVTdHJlYW0+IENGWF9DUlRGaWxlQWNjZXNzOjpDcmVhdGVGaWxlU3RyZWFtKAotICAgIHVpbnQzMl90IGR3TW9kZXMpIHsKLSAgcmV0dXJuIElGWF9TZWVrYWJsZVN0cmVhbTo6Q3JlYXRlRnJvbUZpbGVuYW1lKG1fcGF0aC5jX3N0cigpLCBkd01vZGVzKTsKLX0KLQotYm9vbCBDRlhfQ1JURmlsZUFjY2Vzczo6SW5pdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUGF0aCkgewotICBtX3BhdGggPSB3c1BhdGg7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCi0KLWNsYXNzIENGWF9DUlRGaWxlU3RyZWFtIGZpbmFsIDogcHVibGljIElGWF9TZWVrYWJsZVN0cmVhbSB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KLSAgZnJpZW5kIENGWF9SZXRhaW5QdHI8VD4gcGRmaXVtOjpNYWtlUmV0YWluKEFyZ3MmJi4uLiBhcmdzKTsKLQotICAvLyBJRlhfU2Vla2FibGVTdHJlYW06Ci0gIEZYX0ZJTEVTSVpFIEdldFNpemUoKSBvdmVycmlkZTsKLSAgYm9vbCBJc0VPRigpIG92ZXJyaWRlOwotICBGWF9GSUxFU0laRSBHZXRQb3NpdGlvbigpIG92ZXJyaWRlOwotICBib29sIFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwotICBzaXplX3QgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwotICBib29sIFdyaXRlQmxvY2soY29uc3Qgdm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKLSAgYm9vbCBGbHVzaCgpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgZXhwbGljaXQgQ0ZYX0NSVEZpbGVTdHJlYW0oc3RkOjp1bmlxdWVfcHRyPElGWENSVF9GaWxlQWNjZXNzPiBwRkEpOwotICB+Q0ZYX0NSVEZpbGVTdHJlYW0oKSBvdmVycmlkZTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8SUZYQ1JUX0ZpbGVBY2Nlc3M+IG1fcEZpbGU7Ci19OwotCi1DRlhfQ1JURmlsZVN0cmVhbTo6Q0ZYX0NSVEZpbGVTdHJlYW0oc3RkOjp1bmlxdWVfcHRyPElGWENSVF9GaWxlQWNjZXNzPiBwRkEpCi0gICAgOiBtX3BGaWxlKHN0ZDo6bW92ZShwRkEpKSB7fQotCi1DRlhfQ1JURmlsZVN0cmVhbTo6fkNGWF9DUlRGaWxlU3RyZWFtKCkge30KLQotRlhfRklMRVNJWkUgQ0ZYX0NSVEZpbGVTdHJlYW06OkdldFNpemUoKSB7Ci0gIHJldHVybiBtX3BGaWxlLT5HZXRTaXplKCk7Ci19Ci0KLWJvb2wgQ0ZYX0NSVEZpbGVTdHJlYW06OklzRU9GKCkgewotICByZXR1cm4gR2V0UG9zaXRpb24oKSA+PSBHZXRTaXplKCk7Ci19Ci0KLUZYX0ZJTEVTSVpFIENGWF9DUlRGaWxlU3RyZWFtOjpHZXRQb3NpdGlvbigpIHsKLSAgcmV0dXJuIG1fcEZpbGUtPkdldFBvc2l0aW9uKCk7Ci19Ci0KLWJvb2wgQ0ZYX0NSVEZpbGVTdHJlYW06OlJlYWRCbG9jayh2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7Ci0gIHJldHVybiBtX3BGaWxlLT5SZWFkUG9zKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSA+IDA7Ci19Ci0KLXNpemVfdCBDRlhfQ1JURmlsZVN0cmVhbTo6UmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKLSAgcmV0dXJuIG1fcEZpbGUtPlJlYWQoYnVmZmVyLCBzaXplKTsKLX0KLQotYm9vbCBDRlhfQ1JURmlsZVN0cmVhbTo6V3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsKLSAgcmV0dXJuICEhbV9wRmlsZS0+V3JpdGVQb3MoYnVmZmVyLCBzaXplLCBvZmZzZXQpOwotfQotCi1ib29sIENGWF9DUlRGaWxlU3RyZWFtOjpGbHVzaCgpIHsKLSAgcmV0dXJuIG1fcEZpbGUtPkZsdXNoKCk7Ci19Ci0KLSNkZWZpbmUgRlhfTUVNU1RSRUFNX0Jsb2NrU2l6ZSAoNjQgKiAxMDI0KQotI2RlZmluZSBGWF9NRU1TVFJFQU1fQ29uc2VjdXRpdmUgMHgwMQotI2RlZmluZSBGWF9NRU1TVFJFQU1fVGFrZU92ZXIgMHgwMgotCi1jbGFzcyBDRlhfTWVtb3J5U3RyZWFtIGZpbmFsIDogcHVibGljIElGWF9NZW1vcnlTdHJlYW0gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3M+Ci0gIGZyaWVuZCBDRlhfUmV0YWluUHRyPFQ+IHBkZml1bTo6TWFrZVJldGFpbihBcmdzJiYuLi4gYXJncyk7Ci0KLSAgLy8gSUZYX01lbW9yeVN0cmVhbQotICBGWF9GSUxFU0laRSBHZXRTaXplKCkgb3ZlcnJpZGU7Ci0gIGJvb2wgSXNFT0YoKSBvdmVycmlkZTsKLSAgRlhfRklMRVNJWkUgR2V0UG9zaXRpb24oKSBvdmVycmlkZTsKLSAgYm9vbCBSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKLSAgc2l6ZV90IFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKLSAgYm9vbCBXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgRmx1c2goKSBvdmVycmlkZTsKLSAgYm9vbCBJc0NvbnNlY3V0aXZlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgRXN0aW1hdGVTaXplKHNpemVfdCBuSW5pdFNpemUsIHNpemVfdCBuR3Jvd1NpemUpIG92ZXJyaWRlOwotICB1aW50OF90KiBHZXRCdWZmZXIoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBBdHRhY2hCdWZmZXIodWludDhfdCogcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5TaXplLAotICAgICAgICAgICAgICAgICAgICBib29sIGJUYWtlT3ZlciA9IGZhbHNlKSBvdmVycmlkZTsKLSAgdm9pZCBEZXRhY2hCdWZmZXIoKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIGV4cGxpY2l0IENGWF9NZW1vcnlTdHJlYW0oYm9vbCBiQ29uc2VjdXRpdmUpOwotICBDRlhfTWVtb3J5U3RyZWFtKHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBuU2l6ZSwgYm9vbCBiVGFrZU92ZXIpOwotICB+Q0ZYX01lbW9yeVN0cmVhbSgpIG92ZXJyaWRlOwotCi0gIGJvb2wgRXhwYW5kQmxvY2tzKHNpemVfdCBzaXplKTsKLQotICBDRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90Kj4gbV9CbG9ja3M7Ci0gIHNpemVfdCBtX25Ub3RhbFNpemU7Ci0gIHNpemVfdCBtX25DdXJTaXplOwotICBzaXplX3QgbV9uQ3VyUG9zOwotICBzaXplX3QgbV9uR3Jvd1NpemU7Ci0gIHVpbnQzMl90IG1fZHdGbGFnczsKLX07Ci0KLUNGWF9NZW1vcnlTdHJlYW06OkNGWF9NZW1vcnlTdHJlYW0oYm9vbCBiQ29uc2VjdXRpdmUpCi0gICAgOiBtX25Ub3RhbFNpemUoMCksCi0gICAgICBtX25DdXJTaXplKDApLAotICAgICAgbV9uQ3VyUG9zKDApLAotICAgICAgbV9uR3Jvd1NpemUoRlhfTUVNU1RSRUFNX0Jsb2NrU2l6ZSkgewotICBtX2R3RmxhZ3MgPQotICAgICAgRlhfTUVNU1RSRUFNX1Rha2VPdmVyIHwgKGJDb25zZWN1dGl2ZSA/IEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZSA6IDApOwotfQotCi1DRlhfTWVtb3J5U3RyZWFtOjpDRlhfTWVtb3J5U3RyZWFtKHVpbnQ4X3QqIHBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVGFrZU92ZXIpCi0gICAgOiBtX25Ub3RhbFNpemUoblNpemUpLAotICAgICAgbV9uQ3VyU2l6ZShuU2l6ZSksCi0gICAgICBtX25DdXJQb3MoMCksCi0gICAgICBtX25Hcm93U2l6ZShGWF9NRU1TVFJFQU1fQmxvY2tTaXplKSB7Ci0gIG1fQmxvY2tzLkFkZChwQnVmZmVyKTsKLSAgbV9kd0ZsYWdzID0KLSAgICAgIEZYX01FTVNUUkVBTV9Db25zZWN1dGl2ZSB8IChiVGFrZU92ZXIgPyBGWF9NRU1TVFJFQU1fVGFrZU92ZXIgOiAwKTsKLX0KLQotQ0ZYX01lbW9yeVN0cmVhbTo6fkNGWF9NZW1vcnlTdHJlYW0oKSB7Ci0gIGlmIChtX2R3RmxhZ3MgJiBGWF9NRU1TVFJFQU1fVGFrZU92ZXIpIHsKLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX0Jsb2Nrcy5HZXRTaXplKCk7IGkrKykgewotICAgICAgRlhfRnJlZShtX0Jsb2Nrc1tpXSk7Ci0gICAgfQotICB9Ci0gIG1fQmxvY2tzLlJlbW92ZUFsbCgpOwotfQotCi1GWF9GSUxFU0laRSBDRlhfTWVtb3J5U3RyZWFtOjpHZXRTaXplKCkgewotICByZXR1cm4gKEZYX0ZJTEVTSVpFKW1fbkN1clNpemU7Ci19Ci0KLWJvb2wgQ0ZYX01lbW9yeVN0cmVhbTo6SXNFT0YoKSB7Ci0gIHJldHVybiBtX25DdXJQb3MgPj0gKHNpemVfdClHZXRTaXplKCk7Ci19Ci0KLUZYX0ZJTEVTSVpFIENGWF9NZW1vcnlTdHJlYW06OkdldFBvc2l0aW9uKCkgewotICByZXR1cm4gKEZYX0ZJTEVTSVpFKW1fbkN1clBvczsKLX0KLQotYm9vbCBDRlhfTWVtb3J5U3RyZWFtOjpSZWFkQmxvY2sodm9pZCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsKLSAgaWYgKCFidWZmZXIgfHwgIXNpemUgfHwgb2Zmc2V0IDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgRlhfU0FGRV9TSVpFX1QgbmV3UG9zID0gc2l6ZTsKLSAgbmV3UG9zICs9IG9mZnNldDsKLSAgaWYgKCFuZXdQb3MuSXNWYWxpZCgpIHx8IG5ld1Bvcy5WYWx1ZU9yRGVmYXVsdCgwKSA9PSAwIHx8Ci0gICAgICBuZXdQb3MuVmFsdWVPckRpZSgpID4gbV9uQ3VyU2l6ZSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIG1fbkN1clBvcyA9IG5ld1Bvcy5WYWx1ZU9yRGllKCk7Ci0gIGlmIChtX2R3RmxhZ3MgJiBGWF9NRU1TVFJFQU1fQ29uc2VjdXRpdmUpIHsKLSAgICBGWFNZU19tZW1jcHkoYnVmZmVyLCBtX0Jsb2Nrc1swXSArIChzaXplX3Qpb2Zmc2V0LCBzaXplKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBzaXplX3QgblN0YXJ0QmxvY2sgPSAoc2l6ZV90KW9mZnNldCAvIG1fbkdyb3dTaXplOwotICBvZmZzZXQgLT0gKEZYX0ZJTEVTSVpFKShuU3RhcnRCbG9jayAqIG1fbkdyb3dTaXplKTsKLSAgd2hpbGUgKHNpemUpIHsKLSAgICBzaXplX3QgblJlYWQgPSBtX25Hcm93U2l6ZSAtIChzaXplX3Qpb2Zmc2V0OwotICAgIGlmIChuUmVhZCA+IHNpemUpIHsKLSAgICAgIG5SZWFkID0gc2l6ZTsKLSAgICB9Ci0gICAgRlhTWVNfbWVtY3B5KGJ1ZmZlciwgbV9CbG9ja3NbKGludCluU3RhcnRCbG9ja10gKyAoc2l6ZV90KW9mZnNldCwgblJlYWQpOwotICAgIGJ1ZmZlciA9ICgodWludDhfdCopYnVmZmVyKSArIG5SZWFkOwotICAgIHNpemUgLT0gblJlYWQ7Ci0gICAgblN0YXJ0QmxvY2srKzsKLSAgICBvZmZzZXQgPSAwOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zaXplX3QgQ0ZYX01lbW9yeVN0cmVhbTo6UmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKLSAgaWYgKG1fbkN1clBvcyA+PSBtX25DdXJTaXplKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgc2l6ZV90IG5SZWFkID0gc3RkOjptaW4oc2l6ZSwgbV9uQ3VyU2l6ZSAtIG1fbkN1clBvcyk7Ci0gIGlmICghUmVhZEJsb2NrKGJ1ZmZlciwgKGludDMyX3QpbV9uQ3VyUG9zLCBuUmVhZCkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gblJlYWQ7Ci19Ci0KLWJvb2wgQ0ZYX01lbW9yeVN0cmVhbTo6V3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7Ci0gIGlmICghYnVmZmVyIHx8ICFzaXplKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAobV9kd0ZsYWdzICYgRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlKSB7Ci0gICAgRlhfU0FGRV9TSVpFX1QgbmV3UG9zID0gc2l6ZTsKLSAgICBuZXdQb3MgKz0gb2Zmc2V0OwotICAgIGlmICghbmV3UG9zLklzVmFsaWQoKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIG1fbkN1clBvcyA9IG5ld1Bvcy5WYWx1ZU9yRGllKCk7Ci0gICAgaWYgKG1fbkN1clBvcyA+IG1fblRvdGFsU2l6ZSkgewotICAgICAgbV9uVG90YWxTaXplID0gKG1fbkN1clBvcyArIG1fbkdyb3dTaXplIC0gMSkgLyBtX25Hcm93U2l6ZSAqIG1fbkdyb3dTaXplOwotICAgICAgaWYgKG1fQmxvY2tzLkdldFNpemUoKSA8IDEpIHsKLSAgICAgICAgdWludDhfdCogYmxvY2sgPSBGWF9BbGxvYyh1aW50OF90LCBtX25Ub3RhbFNpemUpOwotICAgICAgICBtX0Jsb2Nrcy5BZGQoYmxvY2spOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbV9CbG9ja3NbMF0gPSBGWF9SZWFsbG9jKHVpbnQ4X3QsIG1fQmxvY2tzWzBdLCBtX25Ub3RhbFNpemUpOwotICAgICAgfQotICAgICAgaWYgKCFtX0Jsb2Nrc1swXSkgewotICAgICAgICBtX0Jsb2Nrcy5SZW1vdmVBbGwoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBGWFNZU19tZW1jcHkobV9CbG9ja3NbMF0gKyAoc2l6ZV90KW9mZnNldCwgYnVmZmVyLCBzaXplKTsKLSAgICBpZiAobV9uQ3VyU2l6ZSA8IG1fbkN1clBvcykgewotICAgICAgbV9uQ3VyU2l6ZSA9IG1fbkN1clBvczsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBGWF9TQUZFX1NJWkVfVCBuZXdQb3MgPSBzaXplOwotICBuZXdQb3MgKz0gb2Zmc2V0OwotICBpZiAoIW5ld1Bvcy5Jc1ZhbGlkKCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIUV4cGFuZEJsb2NrcyhuZXdQb3MuVmFsdWVPckRpZSgpKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBtX25DdXJQb3MgPSBuZXdQb3MuVmFsdWVPckRpZSgpOwotICBzaXplX3QgblN0YXJ0QmxvY2sgPSAoc2l6ZV90KW9mZnNldCAvIG1fbkdyb3dTaXplOwotICBvZmZzZXQgLT0gKEZYX0ZJTEVTSVpFKShuU3RhcnRCbG9jayAqIG1fbkdyb3dTaXplKTsKLSAgd2hpbGUgKHNpemUpIHsKLSAgICBzaXplX3QgbldyaXRlID0gbV9uR3Jvd1NpemUgLSAoc2l6ZV90KW9mZnNldDsKLSAgICBpZiAobldyaXRlID4gc2l6ZSkgewotICAgICAgbldyaXRlID0gc2l6ZTsKLSAgICB9Ci0gICAgRlhTWVNfbWVtY3B5KG1fQmxvY2tzWyhpbnQpblN0YXJ0QmxvY2tdICsgKHNpemVfdClvZmZzZXQsIGJ1ZmZlciwgbldyaXRlKTsKLSAgICBidWZmZXIgPSAoKHVpbnQ4X3QqKWJ1ZmZlcikgKyBuV3JpdGU7Ci0gICAgc2l6ZSAtPSBuV3JpdGU7Ci0gICAgblN0YXJ0QmxvY2srKzsKLSAgICBvZmZzZXQgPSAwOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENGWF9NZW1vcnlTdHJlYW06OkZsdXNoKCkgewotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDRlhfTWVtb3J5U3RyZWFtOjpJc0NvbnNlY3V0aXZlKCkgY29uc3QgewotICByZXR1cm4gISEobV9kd0ZsYWdzICYgRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlKTsKLX0KLQotdm9pZCBDRlhfTWVtb3J5U3RyZWFtOjpFc3RpbWF0ZVNpemUoc2l6ZV90IG5Jbml0U2l6ZSwgc2l6ZV90IG5Hcm93U2l6ZSkgewotICBpZiAobV9kd0ZsYWdzICYgRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlKSB7Ci0gICAgaWYgKG1fQmxvY2tzLkdldFNpemUoKSA8IDEpIHsKLSAgICAgIHVpbnQ4X3QqIHBCbG9jayA9Ci0gICAgICAgICAgRlhfQWxsb2ModWludDhfdCwgc3RkOjptYXgobkluaXRTaXplLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDQwOTYpKSk7Ci0gICAgICBtX0Jsb2Nrcy5BZGQocEJsb2NrKTsKLSAgICB9Ci0gICAgbV9uR3Jvd1NpemUgPSBzdGQ6Om1heChuR3Jvd1NpemUsIHN0YXRpY19jYXN0PHNpemVfdD4oNDA5NikpOwotICB9IGVsc2UgaWYgKG1fQmxvY2tzLkdldFNpemUoKSA8IDEpIHsKLSAgICBtX25Hcm93U2l6ZSA9IHN0ZDo6bWF4KG5Hcm93U2l6ZSwgc3RhdGljX2Nhc3Q8c2l6ZV90Pig0MDk2KSk7Ci0gIH0KLX0KLQotdWludDhfdCogQ0ZYX01lbW9yeVN0cmVhbTo6R2V0QnVmZmVyKCkgY29uc3QgewotICByZXR1cm4gbV9CbG9ja3MuR2V0U2l6ZSgpID8gbV9CbG9ja3NbMF0gOiBudWxscHRyOwotfQotCi12b2lkIENGWF9NZW1vcnlTdHJlYW06OkF0dGFjaEJ1ZmZlcih1aW50OF90KiBwQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVGFrZU92ZXIpIHsKLSAgaWYgKCEobV9kd0ZsYWdzICYgRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlKSkKLSAgICByZXR1cm47Ci0KLSAgbV9CbG9ja3MuUmVtb3ZlQWxsKCk7Ci0gIG1fQmxvY2tzLkFkZChwQnVmZmVyKTsKLSAgbV9uVG90YWxTaXplID0gbV9uQ3VyU2l6ZSA9IG5TaXplOwotICBtX25DdXJQb3MgPSAwOwotICBtX2R3RmxhZ3MgPQotICAgICAgRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlIHwgKGJUYWtlT3ZlciA/IEZYX01FTVNUUkVBTV9UYWtlT3ZlciA6IDApOwotfQotCi12b2lkIENGWF9NZW1vcnlTdHJlYW06OkRldGFjaEJ1ZmZlcigpIHsKLSAgaWYgKCEobV9kd0ZsYWdzICYgRlhfTUVNU1RSRUFNX0NvbnNlY3V0aXZlKSkgewotICAgIHJldHVybjsKLSAgfQotICBtX0Jsb2Nrcy5SZW1vdmVBbGwoKTsKLSAgbV9uVG90YWxTaXplID0gbV9uQ3VyU2l6ZSA9IG1fbkN1clBvcyA9IDA7Ci0gIG1fZHdGbGFncyA9IEZYX01FTVNUUkVBTV9UYWtlT3ZlcjsKLX0KLQotYm9vbCBDRlhfTWVtb3J5U3RyZWFtOjpFeHBhbmRCbG9ja3Moc2l6ZV90IHNpemUpIHsKLSAgaWYgKG1fbkN1clNpemUgPCBzaXplKSB7Ci0gICAgbV9uQ3VyU2l6ZSA9IHNpemU7Ci0gIH0KLSAgaWYgKHNpemUgPD0gbV9uVG90YWxTaXplKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaW50MzJfdCBpQ291bnQgPSBtX0Jsb2Nrcy5HZXRTaXplKCk7Ci0gIHNpemUgPSAoc2l6ZSAtIG1fblRvdGFsU2l6ZSArIG1fbkdyb3dTaXplIC0gMSkgLyBtX25Hcm93U2l6ZTsKLSAgbV9CbG9ja3MuU2V0U2l6ZShtX0Jsb2Nrcy5HZXRTaXplKCkgKyAoaW50MzJfdClzaXplKTsKLSAgd2hpbGUgKHNpemUtLSkgewotICAgIHVpbnQ4X3QqIHBCbG9jayA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fbkdyb3dTaXplKTsKLSAgICBtX0Jsb2Nrcy5TZXRBdChpQ291bnQrKywgcEJsb2NrKTsKLSAgICBtX25Ub3RhbFNpemUgKz0gbV9uR3Jvd1NpemU7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0jaWZkZWYgUERGX0VOQUJMRV9YRkEKLUNGWF9SZXRhaW5QdHI8SUZYX0ZpbGVBY2Nlc3M+IElGWF9GaWxlQWNjZXNzOjpDcmVhdGVEZWZhdWx0KAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NQYXRoKSB7Ci0gIGlmICh3c1BhdGguR2V0TGVuZ3RoKCkgPT0gMCkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBhdXRvIHBGQSA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfQ1JURmlsZUFjY2Vzcz4oKTsKLSAgcEZBLT5Jbml0KHdzUGF0aCk7Ci0gIHJldHVybiBwRkE7Ci19Ci0jZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCi0KLS8vIHN0YXRpYwotQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVTdHJlYW0+IElGWF9TZWVrYWJsZVN0cmVhbTo6Q3JlYXRlRnJvbUZpbGVuYW1lKAotICAgIGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLAotICAgIHVpbnQzMl90IGR3TW9kZXMpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPElGWENSVF9GaWxlQWNjZXNzPiBwRkEoSUZYQ1JUX0ZpbGVBY2Nlc3M6OkNyZWF0ZSgpKTsKLSAgaWYgKCFwRkEtPk9wZW4oZmlsZW5hbWUsIGR3TW9kZXMpKQotICAgIHJldHVybiBudWxscHRyOwotICByZXR1cm4gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9DUlRGaWxlU3RyZWFtPihzdGQ6Om1vdmUocEZBKSk7Ci19Ci0KLS8vIHN0YXRpYwotQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVTdHJlYW0+IElGWF9TZWVrYWJsZVN0cmVhbTo6Q3JlYXRlRnJvbUZpbGVuYW1lKAotICAgIGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSwKLSAgICB1aW50MzJfdCBkd01vZGVzKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxJRlhDUlRfRmlsZUFjY2Vzcz4gcEZBKElGWENSVF9GaWxlQWNjZXNzOjpDcmVhdGUoKSk7Ci0gIGlmICghcEZBLT5PcGVuKGZpbGVuYW1lLCBkd01vZGVzKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIHBkZml1bTo6TWFrZVJldGFpbjxDRlhfQ1JURmlsZVN0cmVhbT4oc3RkOjptb3ZlKHBGQSkpOwotfQotCi0vLyBzdGF0aWMKLUNGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4KLUlGWF9TZWVrYWJsZVJlYWRTdHJlYW06OkNyZWF0ZUZyb21GaWxlbmFtZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSkgewotICByZXR1cm4gSUZYX1NlZWthYmxlU3RyZWFtOjpDcmVhdGVGcm9tRmlsZW5hbWUoZmlsZW5hbWUsIEZYX0ZJTEVNT0RFX1JlYWRPbmx5KTsKLX0KLQotLy8gc3RhdGljCi1DRlhfUmV0YWluUHRyPElGWF9NZW1vcnlTdHJlYW0+IElGWF9NZW1vcnlTdHJlYW06OkNyZWF0ZSh1aW50OF90KiBwQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGR3U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRha2VPdmVyKSB7Ci0gIHJldHVybiBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX01lbW9yeVN0cmVhbT4ocEJ1ZmZlciwgZHdTaXplLCBiVGFrZU92ZXIpOwotfQotCi0vLyBzdGF0aWMKLUNGWF9SZXRhaW5QdHI8SUZYX01lbW9yeVN0cmVhbT4gSUZYX01lbW9yeVN0cmVhbTo6Q3JlYXRlKGJvb2wgYkNvbnNlY3V0aXZlKSB7Ci0gIHJldHVybiBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX01lbW9yeVN0cmVhbT4oYkNvbnNlY3V0aXZlKTsKLX0KLQotRlhfRkxPQVQgRlhTWVNfdGFuKEZYX0ZMT0FUIGEpIHsKLSAgcmV0dXJuIChGWF9GTE9BVCl0YW4oYSk7Ci19Ci1GWF9GTE9BVCBGWFNZU19sb2diKEZYX0ZMT0FUIGIsIEZYX0ZMT0FUIHgpIHsKLSAgcmV0dXJuIEZYU1lTX2xvZyh4KSAvIEZYU1lTX2xvZyhiKTsKLX0KLUZYX0ZMT0FUIEZYU1lTX3N0cnRvZihjb25zdCBGWF9DSEFSKiBwY3NTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBVc2VkTGVuKSB7Ci0gIEFTU0VSVChwY3NTdHIpOwotICBpZiAoaUxlbmd0aCA8IDApIHsKLSAgICBpTGVuZ3RoID0gKGludDMyX3QpRlhTWVNfc3RybGVuKHBjc1N0cik7Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3MgPQotICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChDRlhfQnl0ZVN0cmluZ0MocGNzU3RyLCBpTGVuZ3RoKSk7Ci0gIHJldHVybiBGWFNZU193Y3N0b2Yod3MuY19zdHIoKSwgaUxlbmd0aCwgcFVzZWRMZW4pOwotfQotRlhfRkxPQVQgRlhTWVNfd2NzdG9mKGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBVc2VkTGVuKSB7CitmbG9hdCBGWFNZU193Y3N0b2YoY29uc3Qgd2NoYXJfdCogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIGludDMyX3QqIHBVc2VkTGVuKSB7CiAgIEFTU0VSVChwd3NTdHIpOwotICBpZiAoaUxlbmd0aCA8IDApIHsKLSAgICBpTGVuZ3RoID0gKGludDMyX3QpRlhTWVNfd2NzbGVuKHB3c1N0cik7Ci0gIH0KLSAgaWYgKGlMZW5ndGggPT0gMCkgeworICBpZiAoaUxlbmd0aCA8IDApCisgICAgaUxlbmd0aCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHdjc2xlbihwd3NTdHIpKTsKKyAgaWYgKGlMZW5ndGggPT0gMCkKICAgICByZXR1cm4gMC4wZjsKLSAgfQorCiAgIGludDMyX3QgaVVzZWRMZW4gPSAwOwogICBib29sIGJOZWd0aXZlID0gZmFsc2U7CiAgIHN3aXRjaCAocHdzU3RyW2lVc2VkTGVuXSkgewpAQCAtNDU5LDIxOCArMjUsMTMwIEBACiAgICAgICBpVXNlZExlbisrOwogICAgICAgYnJlYWs7CiAgIH0KLSAgRlhfRkxPQVQgZlZhbHVlID0gMC4wZjsKKworICBmbG9hdCBmVmFsdWUgPSAwLjBmOwogICB3aGlsZSAoaVVzZWRMZW4gPCBpTGVuZ3RoKSB7Ci0gICAgRlhfV0NIQVIgd2NoID0gcHdzU3RyW2lVc2VkTGVuXTsKLSAgICBpZiAod2NoID49IEwnMCcgJiYgd2NoIDw9IEwnOScpIHsKLSAgICAgIGZWYWx1ZSA9IGZWYWx1ZSAqIDEwLjBmICsgKHdjaCAtIEwnMCcpOwotICAgIH0gZWxzZSB7CisgICAgd2NoYXJfdCB3Y2ggPSBwd3NTdHJbaVVzZWRMZW5dOworICAgIGlmICghc3RkOjppc3dkaWdpdCh3Y2gpKQogICAgICAgYnJlYWs7Ci0gICAgfQorCisgICAgZlZhbHVlID0gZlZhbHVlICogMTAuMGYgKyAod2NoIC0gTCcwJyk7CiAgICAgaVVzZWRMZW4rKzsKICAgfQorCiAgIGlmIChpVXNlZExlbiA8IGlMZW5ndGggJiYgcHdzU3RyW2lVc2VkTGVuXSA9PSBMJy4nKSB7Ci0gICAgRlhfRkxPQVQgZlByZWNpc2UgPSAwLjFmOworICAgIGZsb2F0IGZQcmVjaXNlID0gMC4xZjsKICAgICB3aGlsZSAoKytpVXNlZExlbiA8IGlMZW5ndGgpIHsKLSAgICAgIEZYX1dDSEFSIHdjaCA9IHB3c1N0cltpVXNlZExlbl07Ci0gICAgICBpZiAod2NoID49IEwnMCcgJiYgd2NoIDw9IEwnOScpIHsKLSAgICAgICAgZlZhbHVlICs9ICh3Y2ggLSBMJzAnKSAqIGZQcmVjaXNlOwotICAgICAgICBmUHJlY2lzZSAqPSAwLjFmOwotICAgICAgfSBlbHNlIHsKKyAgICAgIHdjaGFyX3Qgd2NoID0gcHdzU3RyW2lVc2VkTGVuXTsKKyAgICAgIGlmICghc3RkOjppc3dkaWdpdCh3Y2gpKQogICAgICAgICBicmVhazsKLSAgICAgIH0KKworICAgICAgZlZhbHVlICs9ICh3Y2ggLSBMJzAnKSAqIGZQcmVjaXNlOworICAgICAgZlByZWNpc2UgKj0gMC4xZjsKICAgICB9CiAgIH0KLSAgaWYgKHBVc2VkTGVuKSB7CisgIGlmIChwVXNlZExlbikKICAgICAqcFVzZWRMZW4gPSBpVXNlZExlbjsKLSAgfQorCiAgIHJldHVybiBiTmVndGl2ZSA/IC1mVmFsdWUgOiBmVmFsdWU7CiB9Ci1GWF9XQ0hBUiogRlhTWVNfd2NzbmNweShGWF9XQ0hBUiogZHN0U3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHNyY1N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCkgeworCit3Y2hhcl90KiBGWFNZU193Y3NuY3B5KHdjaGFyX3QqIGRzdFN0ciwgY29uc3Qgd2NoYXJfdCogc3JjU3RyLCBzaXplX3QgY291bnQpIHsKICAgQVNTRVJUKGRzdFN0ciAmJiBzcmNTdHIgJiYgY291bnQgPiAwKTsKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKQotICAgIGlmICgoZHN0U3RyW2ldID0gc3JjU3RyW2ldKSA9PSBMJ1wwJykgeworICAgIGlmICgoZHN0U3RyW2ldID0gc3JjU3RyW2ldKSA9PSBMJ1wwJykKICAgICAgIGJyZWFrOwotICAgIH0KICAgcmV0dXJuIGRzdFN0cjsKIH0KLWludDMyX3QgRlhTWVNfd2NzbmljbXAoY29uc3QgRlhfV0NIQVIqIHMxLCBjb25zdCBGWF9XQ0hBUiogczIsIHNpemVfdCBjb3VudCkgeworCitpbnQzMl90IEZYU1lTX3djc25pY21wKGNvbnN0IHdjaGFyX3QqIHMxLCBjb25zdCB3Y2hhcl90KiBzMiwgc2l6ZV90IGNvdW50KSB7CiAgIEFTU0VSVChzMSAmJiBzMiAmJiBjb3VudCA+IDApOwotICBGWF9XQ0hBUiB3Y2gxID0gMCwgd2NoMiA9IDA7CisgIHdjaGFyX3Qgd2NoMSA9IDAsIHdjaDIgPSAwOwogICB3aGlsZSAoY291bnQtLSA+IDApIHsKLSAgICB3Y2gxID0gKEZYX1dDSEFSKUZYU1lTX3RvbG93ZXIoKnMxKyspOwotICAgIHdjaDIgPSAoRlhfV0NIQVIpRlhTWVNfdG9sb3dlcigqczIrKyk7Ci0gICAgaWYgKHdjaDEgIT0gd2NoMikgeworICAgIHdjaDEgPSBzdGF0aWNfY2FzdDx3Y2hhcl90PihGWFNZU190b2xvd2VyKCpzMSsrKSk7CisgICAgd2NoMiA9IHN0YXRpY19jYXN0PHdjaGFyX3Q+KEZYU1lTX3RvbG93ZXIoKnMyKyspKTsKKyAgICBpZiAod2NoMSAhPSB3Y2gyKQogICAgICAgYnJlYWs7Ci0gICAgfQogICB9CiAgIHJldHVybiB3Y2gxIC0gd2NoMjsKIH0KLWludDMyX3QgRlhTWVNfc3RybmljbXAoY29uc3QgRlhfQ0hBUiogczEsIGNvbnN0IEZYX0NIQVIqIHMyLCBzaXplX3QgY291bnQpIHsKLSAgQVNTRVJUKHMxICYmIHMyICYmIGNvdW50ID4gMCk7Ci0gIEZYX0NIQVIgY2gxID0gMCwgY2gyID0gMDsKLSAgd2hpbGUgKGNvdW50LS0gPiAwKSB7Ci0gICAgY2gxID0gKEZYX0NIQVIpRlhTWVNfdG9sb3dlcigqczErKyk7Ci0gICAgY2gyID0gKEZYX0NIQVIpRlhTWVNfdG9sb3dlcigqczIrKyk7Ci0gICAgaWYgKGNoMSAhPSBjaDIpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gY2gxIC0gY2gyOwotfQogCi11aW50MzJfdCBGWF9IYXNoQ29kZV9HZXRBKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyLCBib29sIGJJZ25vcmVDYXNlKSB7Cit1aW50MzJfdCBGWF9IYXNoQ29kZV9HZXRBKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIsIGJvb2wgYklnbm9yZUNhc2UpIHsKICAgdWludDMyX3QgZHdIYXNoQ29kZSA9IDA7CiAgIGlmIChiSWdub3JlQ2FzZSkgewotICAgIGZvciAoRlhfU1RSU0laRSBpID0gMDsgaSA8IHN0ci5HZXRMZW5ndGgoKTsgKytpKQotICAgICAgZHdIYXNoQ29kZSA9IDMxICogZHdIYXNoQ29kZSArIEZYU1lTX3RvbG93ZXIoc3RyLkNoYXJBdChpKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBjIDogc3RyKQorICAgICAgZHdIYXNoQ29kZSA9IDMxICogZHdIYXNoQ29kZSArIEZYU1lTX3RvbG93ZXIoYyk7CiAgIH0gZWxzZSB7Ci0gICAgZm9yIChGWF9TVFJTSVpFIGkgPSAwOyBpIDwgc3RyLkdldExlbmd0aCgpOyArK2kpCi0gICAgICBkd0hhc2hDb2RlID0gMzEgKiBkd0hhc2hDb2RlICsgc3RyLkNoYXJBdChpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGMgOiBzdHIpCisgICAgICBkd0hhc2hDb2RlID0gMzEgKiBkd0hhc2hDb2RlICsgYzsKICAgfQogICByZXR1cm4gZHdIYXNoQ29kZTsKIH0KIAotdWludDMyX3QgRlhfSGFzaENvZGVfR2V0Vyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0ciwgYm9vbCBiSWdub3JlQ2FzZSkgewordWludDMyX3QgRlhfSGFzaENvZGVfR2V0Vyhjb25zdCBXaWRlU3RyaW5nVmlldyYgc3RyLCBib29sIGJJZ25vcmVDYXNlKSB7CiAgIHVpbnQzMl90IGR3SGFzaENvZGUgPSAwOwogICBpZiAoYklnbm9yZUNhc2UpIHsKLSAgICBmb3IgKEZYX1NUUlNJWkUgaSA9IDA7IGkgPCBzdHIuR2V0TGVuZ3RoKCk7ICsraSkKLSAgICAgIGR3SGFzaENvZGUgPSAxMzEzICogZHdIYXNoQ29kZSArIEZYU1lTX3RvbG93ZXIoc3RyLkNoYXJBdChpKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBjIDogc3RyKQorICAgICAgZHdIYXNoQ29kZSA9IDEzMTMgKiBkd0hhc2hDb2RlICsgRlhTWVNfdG9sb3dlcihjKTsKICAgfSBlbHNlIHsKLSAgICBmb3IgKEZYX1NUUlNJWkUgaSA9IDA7IGkgPCBzdHIuR2V0TGVuZ3RoKCk7ICsraSkKLSAgICAgIGR3SGFzaENvZGUgPSAxMzEzICogZHdIYXNoQ29kZSArIHN0ci5DaGFyQXQoaSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBjIDogc3RyKQorICAgICAgZHdIYXNoQ29kZSA9IDEzMTMgKiBkd0hhc2hDb2RlICsgYzsKICAgfQogICByZXR1cm4gZHdIYXNoQ29kZTsKIH0KIAotdm9pZCogRlhfUmFuZG9tX01UX1N0YXJ0KHVpbnQzMl90IGR3U2VlZCkgewotICBGWF9NVFJBTkRPTUNPTlRFWFQqIHBDb250ZXh0ID0gRlhfQWxsb2MoRlhfTVRSQU5ET01DT05URVhULCAxKTsKLSAgcENvbnRleHQtPm10WzBdID0gZHdTZWVkOwotICB1aW50MzJfdCYgaSA9IHBDb250ZXh0LT5tdGk7Ci0gIHVpbnQzMl90KiBwQnVmID0gcENvbnRleHQtPm10OwotICBmb3IgKGkgPSAxOyBpIDwgTVRfTjsgaSsrKSB7Ci0gICAgcEJ1ZltpXSA9ICgxODEyNDMzMjUzVUwgKiAocEJ1ZltpIC0gMV0gXiAocEJ1ZltpIC0gMV0gPj4gMzApKSArIGkpOwotICB9Ci0gIHBDb250ZXh0LT5iSGF2ZVNlZWQgPSB0cnVlOwotICByZXR1cm4gcENvbnRleHQ7Ci19Ci11aW50MzJfdCBGWF9SYW5kb21fTVRfR2VuZXJhdGUodm9pZCogcENvbnRleHQpIHsKLSAgQVNTRVJUKHBDb250ZXh0KTsKLSAgRlhfTVRSQU5ET01DT05URVhUKiBwTVRDID0gc3RhdGljX2Nhc3Q8RlhfTVRSQU5ET01DT05URVhUKj4ocENvbnRleHQpOwotICB1aW50MzJfdCB2OwotICBzdGF0aWMgdWludDMyX3QgbWFnWzJdID0gezAsIE1UX01hdHJpeF9BfTsKLSAgdWludDMyX3QmIG10aSA9IHBNVEMtPm10aTsKLSAgdWludDMyX3QqIHBCdWYgPSBwTVRDLT5tdDsKLSAgaWYgKChpbnQpbXRpIDwgMCB8fCBtdGkgPj0gTVRfTikgewotICAgIGlmIChtdGkgPiBNVF9OICYmICFwTVRDLT5iSGF2ZVNlZWQpIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICB1aW50MzJfdCBrazsKLSAgICBmb3IgKGtrID0gMDsga2sgPCBNVF9OIC0gTVRfTTsga2srKykgewotICAgICAgdiA9IChwQnVmW2trXSAmIE1UX1VwcGVyX01hc2spIHwgKHBCdWZba2sgKyAxXSAmIE1UX0xvd2VyX01hc2spOwotICAgICAgcEJ1Zltra10gPSBwQnVmW2trICsgTVRfTV0gXiAodiA+PiAxKSBeIG1hZ1t2ICYgMV07Ci0gICAgfQotICAgIGZvciAoOyBrayA8IE1UX04gLSAxOyBraysrKSB7Ci0gICAgICB2ID0gKHBCdWZba2tdICYgTVRfVXBwZXJfTWFzaykgfCAocEJ1ZltrayArIDFdICYgTVRfTG93ZXJfTWFzayk7Ci0gICAgICBwQnVmW2trXSA9IHBCdWZba2sgKyAoTVRfTSAtIE1UX04pXSBeICh2ID4+IDEpIF4gbWFnW3YgJiAxXTsKLSAgICB9Ci0gICAgdiA9IChwQnVmW01UX04gLSAxXSAmIE1UX1VwcGVyX01hc2spIHwgKHBCdWZbMF0gJiBNVF9Mb3dlcl9NYXNrKTsKLSAgICBwQnVmW01UX04gLSAxXSA9IHBCdWZbTVRfTSAtIDFdIF4gKHYgPj4gMSkgXiBtYWdbdiAmIDFdOwotICAgIG10aSA9IDA7Ci0gIH0KLSAgdiA9IHBCdWZbbXRpKytdOwotICB2IF49ICh2ID4+IDExKTsKLSAgdiBePSAodiA8PCA3KSAmIDB4OWQyYzU2ODBVTDsKLSAgdiBePSAodiA8PCAxNSkgJiAweGVmYzYwMDAwVUw7Ci0gIHYgXj0gKHYgPj4gMTgpOwotICByZXR1cm4gdjsKLX0KLXZvaWQgRlhfUmFuZG9tX01UX0Nsb3NlKHZvaWQqIHBDb250ZXh0KSB7Ci0gIEFTU0VSVChwQ29udGV4dCk7Ci0gIEZYX0ZyZWUocENvbnRleHQpOwotfQotdm9pZCBGWF9SYW5kb21fR2VuZXJhdGVNVCh1aW50MzJfdCogcEJ1ZmZlciwgaW50MzJfdCBpQ291bnQpIHsKLSAgdWludDMyX3QgZHdTZWVkOwotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgaWYgKCFGWF9HZW5lcmF0ZUNyeXB0b1JhbmRvbSgmZHdTZWVkLCAxKSkgewotICAgIEZYX1JhbmRvbV9HZW5lcmF0ZUJhc2UoJmR3U2VlZCwgMSk7Ci0gIH0KLSNlbHNlCi0gIEZYX1JhbmRvbV9HZW5lcmF0ZUJhc2UoJmR3U2VlZCwgMSk7Ci0jZW5kaWYKLSAgdm9pZCogcENvbnRleHQgPSBGWF9SYW5kb21fTVRfU3RhcnQoZHdTZWVkKTsKLSAgd2hpbGUgKGlDb3VudC0tID4gMCkgewotICAgICpwQnVmZmVyKysgPSBGWF9SYW5kb21fTVRfR2VuZXJhdGUocENvbnRleHQpOwotICB9Ci0gIEZYX1JhbmRvbV9NVF9DbG9zZShwQ29udGV4dCk7Ci19Ci12b2lkIEZYX1JhbmRvbV9HZW5lcmF0ZUJhc2UodWludDMyX3QqIHBCdWZmZXIsIGludDMyX3QgaUNvdW50KSB7Ci0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotICBTWVNURU1USU1FIHN0MSwgc3QyOwotICA6OkdldFN5c3RlbVRpbWUoJnN0MSk7Ci0gIGRvIHsKLSAgICA6OkdldFN5c3RlbVRpbWUoJnN0Mik7Ci0gIH0gd2hpbGUgKEZYU1lTX21lbWNtcCgmc3QxLCAmc3QyLCBzaXplb2YoU1lTVEVNVElNRSkpID09IDApOwotICB1aW50MzJfdCBkd0hhc2gxID0KLSAgICAgIEZYX0hhc2hDb2RlX0dldEEoQ0ZYX0J5dGVTdHJpbmdDKCh1aW50OF90Kikmc3QxLCBzaXplb2Yoc3QxKSksIHRydWUpOwotICB1aW50MzJfdCBkd0hhc2gyID0KLSAgICAgIEZYX0hhc2hDb2RlX0dldEEoQ0ZYX0J5dGVTdHJpbmdDKCh1aW50OF90Kikmc3QyLCBzaXplb2Yoc3QyKSksIHRydWUpOwotICA6OnNyYW5kKChkd0hhc2gxIDw8IDE2KSB8ICh1aW50MzJfdClkd0hhc2gyKTsKLSNlbHNlCi0gIHRpbWVfdCB0bUxhc3QgPSB0aW1lKG51bGxwdHIpOwotICB0aW1lX3QgdG1DdXI7Ci0gIHdoaWxlICgodG1DdXIgPSB0aW1lKG51bGxwdHIpKSA9PSB0bUxhc3QpIHsKLSAgICBjb250aW51ZTsKLSAgfQotCi0gIDo6c3JhbmQoKHRtQ3VyIDw8IDE2KSB8ICh0bUxhc3QgJiAweEZGRkYpKTsKLSNlbmRpZgotICB3aGlsZSAoaUNvdW50LS0gPiAwKSB7Ci0gICAgKnBCdWZmZXIrKyA9ICh1aW50MzJfdCkoKDo6cmFuZCgpIDw8IDE2KSB8ICg6OnJhbmQoKSAmIDB4RkZGRikpOwotICB9Ci19Ci0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotYm9vbCBGWF9HZW5lcmF0ZUNyeXB0b1JhbmRvbSh1aW50MzJfdCogcEJ1ZmZlciwgaW50MzJfdCBpQ291bnQpIHsKLSAgSENSWVBUUFJPViBoQ1AgPSAwOwotICBpZiAoITo6Q3J5cHRBY3F1aXJlQ29udGV4dCgmaENQLCBudWxscHRyLCBudWxscHRyLCBQUk9WX1JTQV9GVUxMLCAwKSB8fAotICAgICAgIWhDUCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICA6OkNyeXB0R2VuUmFuZG9tKGhDUCwgaUNvdW50ICogc2l6ZW9mKHVpbnQzMl90KSwgKHVpbnQ4X3QqKXBCdWZmZXIpOwotICA6OkNyeXB0UmVsZWFzZUNvbnRleHQoaENQLCAwKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYKLXZvaWQgRlhfUmFuZG9tX0dlbmVyYXRlQ3J5cHRvKHVpbnQzMl90KiBwQnVmZmVyLCBpbnQzMl90IGlDb3VudCkgewotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgRlhfR2VuZXJhdGVDcnlwdG9SYW5kb20ocEJ1ZmZlciwgaUNvdW50KTsKLSNlbHNlCi0gIEZYX1JhbmRvbV9HZW5lcmF0ZUJhc2UocEJ1ZmZlciwgaUNvdW50KTsKLSNlbmRpZgordm9pZCBGWFNZU19JbnRUb1R3b0hleENoYXJzKHVpbnQ4X3QgbiwgY2hhciogYnVmKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyIGtIZXhbXSA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKKyAgYnVmWzBdID0ga0hleFtuIC8gMTZdOworICBidWZbMV0gPSBrSGV4W24gJSAxNl07CiB9CiAKLSNpZmRlZiBQREZfRU5BQkxFX1hGQQotc3RhdGljIGNvbnN0IEZYX0NIQVIgZ3NfRlhfcEhleENoYXJzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7Ci12b2lkIEZYX0dVSURfQ3JlYXRlVjQoRlhfR1VJRCogcEdVSUQpIHsKLSAgRlhfUmFuZG9tX0dlbmVyYXRlTVQoKHVpbnQzMl90KilwR1VJRCwgNCk7Ci0gIHVpbnQ4X3QmIGIgPSAoKHVpbnQ4X3QqKXBHVUlEKVs2XTsKLSAgYiA9IChiICYgMHgwRikgfCAweDQwOwordm9pZCBGWFNZU19JbnRUb0ZvdXJIZXhDaGFycyh1aW50MTZfdCBuLCBjaGFyKiBidWYpIHsKKyAgRlhTWVNfSW50VG9Ud29IZXhDaGFycyhuIC8gMjU2LCBidWYpOworICBGWFNZU19JbnRUb1R3b0hleENoYXJzKG4gJSAyNTYsIGJ1ZiArIDIpOwogfQotdm9pZCBGWF9HVUlEX1RvU3RyaW5nKGNvbnN0IEZYX0dVSUQqIHBHVUlELAotICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBic1N0ciwKLSAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXBhcmF0b3IpIHsKLSAgRlhfQ0hBUiogcEJ1ZiA9IGJzU3RyLkdldEJ1ZmZlcig0MCk7Ci0gIHVpbnQ4X3QgYjsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgIGIgPSAoKGNvbnN0IHVpbnQ4X3QqKXBHVUlEKVtpXTsKLSAgICAqcEJ1ZisrID0gZ3NfRlhfcEhleENoYXJzW2IgPj4gNF07Ci0gICAgKnBCdWYrKyA9IGdzX0ZYX3BIZXhDaGFyc1tiICYgMHgwRl07Ci0gICAgaWYgKGJTZXBhcmF0b3IgJiYgKGkgPT0gMyB8fCBpID09IDUgfHwgaSA9PSA3IHx8IGkgPT0gOSkpIHsKLSAgICAgICpwQnVmKysgPSBMJy0nOwotICAgIH0KKworc2l6ZV90IEZYU1lTX1RvVVRGMTZCRSh1aW50MzJfdCB1bmljb2RlLCBjaGFyKiBidWYpIHsKKyAgQVNTRVJUKHVuaWNvZGUgPD0gMHhEN0ZGIHx8ICh1bmljb2RlID4gMHhERkZGICYmIHVuaWNvZGUgPD0gMHgxMEZGRkYpKTsKKyAgaWYgKHVuaWNvZGUgPD0gMHhGRkZGKSB7CisgICAgRlhTWVNfSW50VG9Gb3VySGV4Q2hhcnModW5pY29kZSwgYnVmKTsKKyAgICByZXR1cm4gNDsKICAgfQotICBic1N0ci5SZWxlYXNlQnVmZmVyKGJTZXBhcmF0b3IgPyAzNiA6IDMyKTsKKyAgdW5pY29kZSAtPSAweDAxMDAwMDsKKyAgLy8gSGlnaCB0ZW4gYml0cyBwbHVzIDB4RDgwMAorICBGWFNZU19JbnRUb0ZvdXJIZXhDaGFycygweEQ4MDAgKyB1bmljb2RlIC8gMHg0MDAsIGJ1Zik7CisgIC8vIExvdyB0ZW4gYml0cyBwbHVzIDB4REMwMAorICBGWFNZU19JbnRUb0ZvdXJIZXhDaGFycygweERDMDAgKyB1bmljb2RlICUgMHg0MDAsIGJ1ZiArIDQpOworICByZXR1cm4gODsKIH0KLSNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKwordWludDMyX3QgR2V0Qml0czMyKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCBpbnQgYml0cG9zLCBpbnQgbmJpdHMpIHsKKyAgQVNTRVJUKDAgPCBuYml0cyAmJiBuYml0cyA8PSAzMik7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGFQdHIgPSAmcERhdGFbYml0cG9zIC8gOF07CisgIGludCBiaXRTaGlmdDsKKyAgaW50IGJpdE1hc2s7CisgIGludCBkc3RTaGlmdDsKKyAgaW50IGJpdENvdW50ID0gYml0cG9zICYgMHgwNzsKKyAgaWYgKG5iaXRzIDwgOCAmJiBuYml0cyArIGJpdENvdW50IDw9IDgpIHsKKyAgICBiaXRTaGlmdCA9IDggLSBuYml0cyAtIGJpdENvdW50OworICAgIGJpdE1hc2sgPSAoMSA8PCBuYml0cykgLSAxOworICAgIGRzdFNoaWZ0ID0gMDsKKyAgfSBlbHNlIHsKKyAgICBiaXRTaGlmdCA9IDA7CisgICAgaW50IGJpdE9mZnNldCA9IDggLSBiaXRDb3VudDsKKyAgICBiaXRNYXNrID0gKDEgPDwgc3RkOjptaW4oYml0T2Zmc2V0LCBuYml0cykpIC0gMTsKKyAgICBkc3RTaGlmdCA9IG5iaXRzIC0gYml0T2Zmc2V0OworICB9CisgIHVpbnQzMl90IHJlc3VsdCA9CisgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oKCpkYXRhUHRyKysgPj4gYml0U2hpZnQgJiBiaXRNYXNrKSA8PCBkc3RTaGlmdCk7CisgIHdoaWxlIChkc3RTaGlmdCA+PSA4KSB7CisgICAgZHN0U2hpZnQgLT0gODsKKyAgICByZXN1bHQgfD0gKmRhdGFQdHIrKyA8PCBkc3RTaGlmdDsKKyAgfQorICBpZiAoZHN0U2hpZnQgPiAwKSB7CisgICAgYml0U2hpZnQgPSA4IC0gZHN0U2hpZnQ7CisgICAgYml0TWFzayA9ICgxIDw8IGRzdFNoaWZ0KSAtIDE7CisgICAgcmVzdWx0IHw9ICpkYXRhUHRyKysgPj4gYml0U2hpZnQgJiBiaXRNYXNrOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIGIvY29yZS9meGNydC9meF9leHRlbnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDJkNThkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9meF9leHRlbnNpb24uaApAQCAtMCwwICsxLDkxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENSVF9GWF9FWFRFTlNJT05fSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9GWF9FWFRFTlNJT05fSF8KKworI2luY2x1ZGUgPGNjdHlwZT4KKyNpbmNsdWRlIDxjd2N0eXBlPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisKKyNkZWZpbmUgRlhfSU5WQUxJRF9PRkZTRVQgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KC0xKQorCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyNkZWZpbmUgRlhfSXNPZGQoYSkgKChhKSYxKQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCitmbG9hdCBGWFNZU193Y3N0b2YoY29uc3Qgd2NoYXJfdCogcHdzU3RyLAorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IC0xLAorICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBVc2VkTGVuID0gbnVsbHB0cik7Cit3Y2hhcl90KiBGWFNZU193Y3NuY3B5KHdjaGFyX3QqIGRzdFN0ciwgY29uc3Qgd2NoYXJfdCogc3JjU3RyLCBzaXplX3QgY291bnQpOworaW50MzJfdCBGWFNZU193Y3NuaWNtcChjb25zdCB3Y2hhcl90KiBzMSwgY29uc3Qgd2NoYXJfdCogczIsIHNpemVfdCBjb3VudCk7CisKK2lubGluZSBib29sIEZYU1lTX2lzbG93ZXIoaW50MzJfdCBjaCkgeworICByZXR1cm4gY2ggPj0gJ2EnICYmIGNoIDw9ICd6JzsKK30KKworaW5saW5lIGJvb2wgRlhTWVNfaXN1cHBlcihpbnQzMl90IGNoKSB7CisgIHJldHVybiBjaCA+PSAnQScgJiYgY2ggPD0gJ1onOworfQorCitpbmxpbmUgaW50MzJfdCBGWFNZU190b2xvd2VyKGludDMyX3QgY2gpIHsKKyAgcmV0dXJuIGNoIDwgJ0EnIHx8IGNoID4gJ1onID8gY2ggOiAoY2ggKyAweDIwKTsKK30KKworaW5saW5lIGludDMyX3QgRlhTWVNfdG91cHBlcihpbnQzMl90IGNoKSB7CisgIHJldHVybiBjaCA8ICdhJyB8fCBjaCA+ICd6JyA/IGNoIDogKGNoIC0gMHgyMCk7Cit9CisKK2lubGluZSBib29sIEZYU1lTX2lzd2FscGhhKHdjaGFyX3Qgd2NoKSB7CisgIHJldHVybiBGWFNZU19pc3VwcGVyKHdjaCkgfHwgRlhTWVNfaXNsb3dlcih3Y2gpOworfQorCitpbmxpbmUgYm9vbCBGWFNZU19pc3dhbG51bSh3Y2hhcl90IHdjaCkgeworICByZXR1cm4gRlhTWVNfaXN3YWxwaGEod2NoKSB8fCBzdGQ6Omlzd2RpZ2l0KHdjaCk7Cit9CisKK2lubGluZSBib29sIEZYU1lTX2lzd3NwYWNlKHdjaGFyX3QgYykgeworICByZXR1cm4gKGMgPT0gMHgyMCkgfHwgKGMgPT0gMHgwZCkgfHwgKGMgPT0gMHgwYSkgfHwgKGMgPT0gMHgwOSk7Cit9CisKK2lubGluZSBib29sIEZYU1lTX2lzSGV4RGlnaXQoY29uc3QgY2hhciBjKSB7CisgIHJldHVybiAhKChjICYgMHg4MCkgfHwgIXN0ZDo6aXN4ZGlnaXQoYykpOworfQorCitpbmxpbmUgaW50IEZYU1lTX0hleENoYXJUb0ludChjb25zdCBjaGFyIGMpIHsKKyAgaWYgKCFGWFNZU19pc0hleERpZ2l0KGMpKQorICAgIHJldHVybiAwOworICBjaGFyIHVwY2hhciA9IHN0ZDo6dG91cHBlcihjKTsKKyAgcmV0dXJuIHVwY2hhciA+ICc5JyA/IHVwY2hhciAtICdBJyArIDEwIDogdXBjaGFyIC0gJzAnOworfQorCitpbmxpbmUgYm9vbCBGWFNZU19pc0RlY2ltYWxEaWdpdChjb25zdCBjaGFyIGMpIHsKKyAgcmV0dXJuICEoKGMgJiAweDgwKSB8fCAhc3RkOjppc2RpZ2l0KGMpKTsKK30KKworaW5saW5lIGJvb2wgRlhTWVNfaXNEZWNpbWFsRGlnaXQoY29uc3Qgd2NoYXJfdCBjKSB7CisgIHJldHVybiAhIXN0ZDo6aXN3ZGlnaXQoYyk7Cit9CisKK2lubGluZSBpbnQgRlhTWVNfRGVjaW1hbENoYXJUb0ludChjb25zdCBjaGFyIGMpIHsKKyAgcmV0dXJuIEZYU1lTX2lzRGVjaW1hbERpZ2l0KGMpID8gYyAtICcwJyA6IDA7Cit9CisKK2lubGluZSBpbnQgRlhTWVNfRGVjaW1hbENoYXJUb0ludChjb25zdCB3Y2hhcl90IGMpIHsKKyAgcmV0dXJuIHN0ZDo6aXN3ZGlnaXQoYykgPyBjIC0gTCcwJyA6IDA7Cit9CisKK3ZvaWQgRlhTWVNfSW50VG9Ud29IZXhDaGFycyh1aW50OF90IGMsIGNoYXIqIGJ1Zik7CisKK3ZvaWQgRlhTWVNfSW50VG9Gb3VySGV4Q2hhcnModWludDE2X3QgYywgY2hhciogYnVmKTsKKworc2l6ZV90IEZYU1lTX1RvVVRGMTZCRSh1aW50MzJfdCB1bmljb2RlLCBjaGFyKiBidWYpOworCit1aW50MzJfdCBHZXRCaXRzMzIoY29uc3QgdWludDhfdCogcERhdGEsIGludCBiaXRwb3MsIGludCBuYml0cyk7CisKKyNlbmRpZiAgLy8gQ09SRV9GWENSVF9GWF9FWFRFTlNJT05fSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uX3VuaXR0ZXN0LmNwcAppbmRleCAzNzM5YTNkLi4wNTAwYTE0IDEwMDY0NAotLS0gYS9jb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbl91bml0dGVzdC5jcHAKKysrIGIvY29yZS9meGNydC9meF9leHRlbnNpb25fdW5pdHRlc3QuY3BwCkBAIC0yLDIyICsyLDM0IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9leHRlbnNpb24uaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCituYW1lc3BhY2UgewogCi1URVNUKGZ4Y3J0LCBGWFNZU190b0hleERpZ2l0KSB7Ci0gIEVYUEVDVF9FUSgxMCwgRlhTWVNfdG9IZXhEaWdpdCgnYScpKTsKLSAgRVhQRUNUX0VRKDEwLCBGWFNZU190b0hleERpZ2l0KCdBJykpOwotICBFWFBFQ1RfRVEoNywgRlhTWVNfdG9IZXhEaWdpdCgnNycpKTsKLSAgRVhQRUNUX0VRKDAsIEZYU1lTX3RvSGV4RGlnaXQoJ2knKSk7Cit1aW50MzJfdCBSZWZlcmVuY2VHZXRCaXRzMzIoY29uc3QgdWludDhfdCogcERhdGEsIGludCBiaXRwb3MsIGludCBuYml0cykgeworICBpbnQgcmVzdWx0ID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYml0czsgaSsrKSB7CisgICAgaWYgKHBEYXRhWyhiaXRwb3MgKyBpKSAvIDhdICYgKDEgPDwgKDcgLSAoYml0cG9zICsgaSkgJSA4KSkpCisgICAgICByZXN1bHQgfD0gMSA8PCAobmJpdHMgLSBpIC0gMSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKIH0KIAotVEVTVChmeGNydCwgRlhTWVNfdG9EZWNpbWFsRGlnaXQpIHsKLSAgRVhQRUNUX0VRKDcsIEZYU1lTX3RvRGVjaW1hbERpZ2l0KCc3JykpOwotICBFWFBFQ1RfRVEoMCwgRlhTWVNfdG9EZWNpbWFsRGlnaXQoJ2EnKSk7Ci0gIEVYUEVDVF9FUSg3LCBGWFNZU190b0RlY2ltYWxEaWdpdChMJzcnKSk7Ci0gIEVYUEVDVF9FUSgwLCBGWFNZU190b0RlY2ltYWxEaWdpdChMJ2EnKSk7Cit9ICAvLyBuYW1lc3BhY2UKKworVEVTVChmeGNydCwgRlhTWVNfSGV4Q2hhclRvSW50KSB7CisgIEVYUEVDVF9FUSgxMCwgRlhTWVNfSGV4Q2hhclRvSW50KCdhJykpOworICBFWFBFQ1RfRVEoMTAsIEZYU1lTX0hleENoYXJUb0ludCgnQScpKTsKKyAgRVhQRUNUX0VRKDcsIEZYU1lTX0hleENoYXJUb0ludCgnNycpKTsKKyAgRVhQRUNUX0VRKDAsIEZYU1lTX0hleENoYXJUb0ludCgnaScpKTsKK30KKworVEVTVChmeGNydCwgRlhTWVNfRGVjaW1hbENoYXJUb0ludCkgeworICBFWFBFQ1RfRVEoNywgRlhTWVNfRGVjaW1hbENoYXJUb0ludCgnNycpKTsKKyAgRVhQRUNUX0VRKDAsIEZYU1lTX0RlY2ltYWxDaGFyVG9JbnQoJ2EnKSk7CisgIEVYUEVDVF9FUSg3LCBGWFNZU19EZWNpbWFsQ2hhclRvSW50KEwnNycpKTsKKyAgRVhQRUNUX0VRKDAsIEZYU1lTX0RlY2ltYWxDaGFyVG9JbnQoTCdhJykpOwogfQogCiBURVNUKGZ4Y3J0LCBGWFNZU19pc0RlY2ltYWxEaWdpdCkgewpAQCAtNDAsMyArNTIsNjMgQEAKICAgRVhQRUNUX0VRKDk3dSwgRlhfSGFzaENvZGVfR2V0VyhMIkEiLCB0cnVlKSk7CiAgIEVYUEVDVF9FUSgxMzEzICogNjV1ICsgNjZ1LCBGWF9IYXNoQ29kZV9HZXRXKEwiQUIiLCBmYWxzZSkpOwogfQorCitURVNUKGZ4Y3J0LCBGWFNZU19JbnRUb1R3b0hleENoYXJzKSB7CisgIGNoYXIgYnVmWzNdID0gezB9OworICBGWFNZU19JbnRUb1R3b0hleENoYXJzKDB4MCwgYnVmKTsKKyAgRVhQRUNUX1NUUkVRKCIwMCIsIGJ1Zik7CisgIEZYU1lTX0ludFRvVHdvSGV4Q2hhcnMoMHg5LCBidWYpOworICBFWFBFQ1RfU1RSRVEoIjA5IiwgYnVmKTsKKyAgRlhTWVNfSW50VG9Ud29IZXhDaGFycygweEEsIGJ1Zik7CisgIEVYUEVDVF9TVFJFUSgiMEEiLCBidWYpOworICBGWFNZU19JbnRUb1R3b0hleENoYXJzKDB4OEMsIGJ1Zik7CisgIEVYUEVDVF9TVFJFUSgiOEMiLCBidWYpOworICBGWFNZU19JbnRUb1R3b0hleENoYXJzKDB4QkUsIGJ1Zik7CisgIEVYUEVDVF9TVFJFUSgiQkUiLCBidWYpOworICBGWFNZU19JbnRUb1R3b0hleENoYXJzKDB4RDAsIGJ1Zik7CisgIEVYUEVDVF9TVFJFUSgiRDAiLCBidWYpOworICBGWFNZU19JbnRUb1R3b0hleENoYXJzKDB4RkYsIGJ1Zik7CisgIEVYUEVDVF9TVFJFUSgiRkYiLCBidWYpOworfQorCitURVNUKGZ4Y3J0LCBGWFNZU19JbnRUb0ZvdXJIZXhDaGFycykgeworICBjaGFyIGJ1Zls1XSA9IHswfTsKKyAgRlhTWVNfSW50VG9Gb3VySGV4Q2hhcnMoMHgwLCBidWYpOworICBFWFBFQ1RfU1RSRVEoIjAwMDAiLCBidWYpOworICBGWFNZU19JbnRUb0ZvdXJIZXhDaGFycygweEEyMywgYnVmKTsKKyAgRVhQRUNUX1NUUkVRKCIwQTIzIiwgYnVmKTsKKyAgRlhTWVNfSW50VG9Gb3VySGV4Q2hhcnMoMHhCNzAxLCBidWYpOworICBFWFBFQ1RfU1RSRVEoIkI3MDEiLCBidWYpOworICBGWFNZU19JbnRUb0ZvdXJIZXhDaGFycygweEZGRkYsIGJ1Zik7CisgIEVYUEVDVF9TVFJFUSgiRkZGRiIsIGJ1Zik7Cit9CisKK1RFU1QoZnhjcnQsIEZYU1lTX1RvVVRGMTZCRSkgeworICBjaGFyIGJ1Zls5XSA9IHswfTsKKyAgLy8gVGVzdCBVKzAwMDAgdG8gVStEN0ZGIGFuZCBVK0UwMDAgdG8gVStGRkZGCisgIEVYUEVDVF9FUSg0VSwgRlhTWVNfVG9VVEYxNkJFKDB4MCwgYnVmKSk7CisgIEVYUEVDVF9TVFJFUSgiMDAwMCIsIGJ1Zik7CisgIEVYUEVDVF9FUSg0VSwgRlhTWVNfVG9VVEYxNkJFKDB4RDdGRiwgYnVmKSk7CisgIEVYUEVDVF9TVFJFUSgiRDdGRiIsIGJ1Zik7CisgIEVYUEVDVF9FUSg0VSwgRlhTWVNfVG9VVEYxNkJFKDB4RTAwMCwgYnVmKSk7CisgIEVYUEVDVF9TVFJFUSgiRTAwMCIsIGJ1Zik7CisgIEVYUEVDVF9FUSg0VSwgRlhTWVNfVG9VVEYxNkJFKDB4RkZGRiwgYnVmKSk7CisgIEVYUEVDVF9TVFJFUSgiRkZGRiIsIGJ1Zik7CisgIC8vIFRlc3QgVSsxMDAwMCB0byBVKzEwRkZGRgorICBFWFBFQ1RfRVEoOFUsIEZYU1lTX1RvVVRGMTZCRSgweDEwMDAwLCBidWYpKTsKKyAgRVhQRUNUX1NUUkVRKCJEODAwREMwMCIsIGJ1Zik7CisgIEVYUEVDVF9FUSg4VSwgRlhTWVNfVG9VVEYxNkJFKDB4MTBGRkZGLCBidWYpKTsKKyAgRVhQRUNUX1NUUkVRKCJEQkZGREZGRiIsIGJ1Zik7CisgIEVYUEVDVF9FUSg4VSwgRlhTWVNfVG9VVEYxNkJFKDB4MjAwM0UsIGJ1ZikpOworICBFWFBFQ1RfU1RSRVEoIkQ4NDBEQzNFIiwgYnVmKTsKK30KKworVEVTVChmeGNydCwgR2V0Qml0czMyKSB7CisgIHVuc2lnbmVkIGNoYXIgZGF0YVtdID0gezB4REUsIDB4M0YsIDB4QjEsIDB4N0MsIDB4MTIsIDB4OUEsIDB4MDQsIDB4NTZ9OworICBmb3IgKGludCBuYml0cyA9IDE7IG5iaXRzIDw9IDMyOyArK25iaXRzKSB7CisgICAgZm9yIChpbnQgYml0cG9zID0gMDsgYml0cG9zIDwgKGludClzaXplb2YoZGF0YSkgKiA4IC0gbmJpdHM7ICsrYml0cG9zKSB7CisgICAgICBFWFBFQ1RfRVEoUmVmZXJlbmNlR2V0Qml0czMyKGRhdGEsIGJpdHBvcywgbmJpdHMpLAorICAgICAgICAgICAgICAgIEdldEJpdHMzMihkYXRhLCBiaXRwb3MsIG5iaXRzKSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Z4X21lbW9yeS5jcHAgYi9jb3JlL2Z4Y3J0L2Z4X21lbW9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExMzVhZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvZnhfbWVtb3J5LmNwcApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc2FmZV90eXBlcy5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBGb3IgYWJvcnQoKS4KKworcGRmaXVtOjpiYXNlOjpQYXJ0aXRpb25BbGxvY2F0b3JHZW5lcmljIGdBcnJheUJ1ZmZlclBhcnRpdGlvbkFsbG9jYXRvcjsKK3BkZml1bTo6YmFzZTo6UGFydGl0aW9uQWxsb2NhdG9yR2VuZXJpYyBnR2VuZXJhbFBhcnRpdGlvbkFsbG9jYXRvcjsKK3BkZml1bTo6YmFzZTo6UGFydGl0aW9uQWxsb2NhdG9yR2VuZXJpYyBnU3RyaW5nUGFydGl0aW9uQWxsb2NhdG9yOworCit2b2lkIEZYTUVNX0luaXRpYWxpemVQYXJ0aXRpb25BbGxvYygpIHsKKyAgc3RhdGljIGJvb2wgc19nUGFydGl0aW9uQWxsb2NhdG9yc0luaXRpYWxpemVkID0gZmFsc2U7CisgIGlmICghc19nUGFydGl0aW9uQWxsb2NhdG9yc0luaXRpYWxpemVkKSB7CisgICAgcGRmaXVtOjpiYXNlOjpQYXJ0aXRpb25BbGxvY0dsb2JhbEluaXQoRlhfT3V0T2ZNZW1vcnlUZXJtaW5hdGUpOworICAgIGdBcnJheUJ1ZmZlclBhcnRpdGlvbkFsbG9jYXRvci5pbml0KCk7CisgICAgZ0dlbmVyYWxQYXJ0aXRpb25BbGxvY2F0b3IuaW5pdCgpOworICAgIGdTdHJpbmdQYXJ0aXRpb25BbGxvY2F0b3IuaW5pdCgpOworICAgIHNfZ1BhcnRpdGlvbkFsbG9jYXRvcnNJbml0aWFsaXplZCA9IHRydWU7CisgIH0KK30KKwordm9pZCogRlhNRU1fRGVmYXVsdEFsbG9jKHNpemVfdCBieXRlX3NpemUpIHsKKyAgcmV0dXJuIHBkZml1bTo6YmFzZTo6UGFydGl0aW9uQWxsb2NHZW5lcmljRmxhZ3MoCisgICAgICBnR2VuZXJhbFBhcnRpdGlvbkFsbG9jYXRvci5yb290KCksIHBkZml1bTo6YmFzZTo6UGFydGl0aW9uQWxsb2NSZXR1cm5OdWxsLAorICAgICAgYnl0ZV9zaXplLCAiR2VuZXJhbFBhcnRpdGlvbiIpOworfQorCit2b2lkKiBGWE1FTV9EZWZhdWx0Q2FsbG9jKHNpemVfdCBudW1fZWxlbXMsIHNpemVfdCBieXRlX3NpemUpIHsKKyAgcmV0dXJuIEZYX1NhZmVBbGxvYyhudW1fZWxlbXMsIGJ5dGVfc2l6ZSk7Cit9CisKK3ZvaWQqIEZYTUVNX0RlZmF1bHRSZWFsbG9jKHZvaWQqIHBvaW50ZXIsIHNpemVfdCBuZXdfc2l6ZSkgeworICByZXR1cm4gcGRmaXVtOjpiYXNlOjpQYXJ0aXRpb25SZWFsbG9jR2VuZXJpYygKKyAgICAgIGdHZW5lcmFsUGFydGl0aW9uQWxsb2NhdG9yLnJvb3QoKSwgcG9pbnRlciwgbmV3X3NpemUsICJHZW5lcmFsUGFydGl0aW9uIik7Cit9CisKK3ZvaWQgRlhNRU1fRGVmYXVsdEZyZWUodm9pZCogcG9pbnRlcikgeworICBwZGZpdW06OmJhc2U6OlBhcnRpdGlvbkZyZWUocG9pbnRlcik7Cit9CisKK05FVkVSX0lOTElORSB2b2lkIEZYX091dE9mTWVtb3J5VGVybWluYXRlKCkgeworICAvLyBUZXJtaW1hdGUgY2xlYW5seSBpZiB3ZSBjYW4sIGVsc2UgY3Jhc2ggYXQgYSBzcGVjaWZpYyBhZGRyZXNzICgweGJkKS4KKyAgYWJvcnQoKTsKKyNpZm5kZWYgX1dJTjMyCisgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAoKikoKT4oMHhiZCkoKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF9tZW1vcnkuaCBiL2NvcmUvZnhjcnQvZnhfbWVtb3J5LmgKaW5kZXggMGFkMjhjZS4uZWNmM2U0MiAxMDA2NDQKLS0tIGEvY29yZS9meGNydC9meF9tZW1vcnkuaAorKysgYi9jb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oCkBAIC0xNCw5ICsxNCwxMCBAQAogI2VuZGlmCiAKIC8vIEZvciBleHRlcm5hbCBDIGxpYnJhcmllcyB0byBtYWxsb2MgdGhyb3VnaCBQREZpdW0uIFRoZXNlIG1heSByZXR1cm4gbnVsbHB0ci4KLXZvaWQqIEZYTUVNX0RlZmF1bHRBbGxvYyhzaXplX3QgYnl0ZV9zaXplLCBpbnQgZmxhZ3MpOwotdm9pZCogRlhNRU1fRGVmYXVsdFJlYWxsb2Modm9pZCogcG9pbnRlciwgc2l6ZV90IG5ld19zaXplLCBpbnQgZmxhZ3MpOwotdm9pZCBGWE1FTV9EZWZhdWx0RnJlZSh2b2lkKiBwb2ludGVyLCBpbnQgZmxhZ3MpOwordm9pZCogRlhNRU1fRGVmYXVsdEFsbG9jKHNpemVfdCBieXRlX3NpemUpOwordm9pZCogRlhNRU1fRGVmYXVsdENhbGxvYyhzaXplX3QgbnVtX2VsZW1zLCBzaXplX3QgYnl0ZV9zaXplKTsKK3ZvaWQqIEZYTUVNX0RlZmF1bHRSZWFsbG9jKHZvaWQqIHBvaW50ZXIsIHNpemVfdCBuZXdfc2l6ZSk7Cit2b2lkIEZYTUVNX0RlZmF1bHRGcmVlKHZvaWQqIHBvaW50ZXIpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0gIC8vIGV4dGVybiAiQyIKQEAgLTI2LDI4ICsyNyw1NCBAQAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxuZXc+CiAKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2FsbG9jYXRvci9wYXJ0aXRpb25fYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvYy5oIgorCitleHRlcm4gcGRmaXVtOjpiYXNlOjpQYXJ0aXRpb25BbGxvY2F0b3JHZW5lcmljIGdBcnJheUJ1ZmZlclBhcnRpdGlvbkFsbG9jYXRvcjsKK2V4dGVybiBwZGZpdW06OmJhc2U6OlBhcnRpdGlvbkFsbG9jYXRvckdlbmVyaWMgZ0dlbmVyYWxQYXJ0aXRpb25BbGxvY2F0b3I7CitleHRlcm4gcGRmaXVtOjpiYXNlOjpQYXJ0aXRpb25BbGxvY2F0b3JHZW5lcmljIGdTdHJpbmdQYXJ0aXRpb25BbGxvY2F0b3I7CisKK3ZvaWQgRlhNRU1fSW5pdGlhbGl6ZVBhcnRpdGlvbkFsbG9jKCk7CiBORVZFUl9JTkxJTkUgdm9pZCBGWF9PdXRPZk1lbW9yeVRlcm1pbmF0ZSgpOwogCitpbmxpbmUgdm9pZCogRlhfU2FmZUFsbG9jKHNpemVfdCBudW1fbWVtYmVycywgc2l6ZV90IG1lbWJlcl9zaXplKSB7CisgIEZYX1NBRkVfU0laRV9UIHRvdGFsID0gbWVtYmVyX3NpemU7CisgIHRvdGFsICo9IG51bV9tZW1iZXJzOworICBpZiAoIXRvdGFsLklzVmFsaWQoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICB2b2lkKiByZXN1bHQgPSBwZGZpdW06OmJhc2U6OlBhcnRpdGlvbkFsbG9jR2VuZXJpY0ZsYWdzKAorICAgICAgZ0dlbmVyYWxQYXJ0aXRpb25BbGxvY2F0b3Iucm9vdCgpLCBwZGZpdW06OmJhc2U6OlBhcnRpdGlvbkFsbG9jUmV0dXJuTnVsbCwKKyAgICAgIHRvdGFsLlZhbHVlT3JEaWUoKSwgIkdlbmVyYWxQYXJ0aXRpb24iKTsKKyAgaWYgKHJlc3VsdCkKKyAgICBtZW1zZXQocmVzdWx0LCAwLCB0b3RhbC5WYWx1ZU9yRGllKCkpOworICByZXR1cm4gcmVzdWx0OworfQorCiBpbmxpbmUgdm9pZCogRlhfU2FmZVJlYWxsb2Modm9pZCogcHRyLCBzaXplX3QgbnVtX21lbWJlcnMsIHNpemVfdCBtZW1iZXJfc2l6ZSkgewotICBpZiAobnVtX21lbWJlcnMgPCBzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpIC8gbWVtYmVyX3NpemUpIHsKLSAgICByZXR1cm4gcmVhbGxvYyhwdHIsIG51bV9tZW1iZXJzICogbWVtYmVyX3NpemUpOwotICB9Ci0gIHJldHVybiBudWxscHRyOworICBGWF9TQUZFX1NJWkVfVCBzaXplID0gbnVtX21lbWJlcnM7CisgIHNpemUgKj0gbWVtYmVyX3NpemU7CisgIGlmICghc2l6ZS5Jc1ZhbGlkKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgcmV0dXJuIHBkZml1bTo6YmFzZTo6UGFydGl0aW9uUmVhbGxvY0dlbmVyaWMoCisgICAgICBnR2VuZXJhbFBhcnRpdGlvbkFsbG9jYXRvci5yb290KCksIHB0ciwgc2l6ZS5WYWx1ZU9yRGllKCksCisgICAgICAiR2VuZXJhbFBhcnRpdGlvbiIpOwogfQogCiBpbmxpbmUgdm9pZCogRlhfQWxsb2NPckRpZShzaXplX3QgbnVtX21lbWJlcnMsIHNpemVfdCBtZW1iZXJfc2l6ZSkgewogICAvLyBUT0RPKHRzZXBleik6IFNlZSBpZiB3ZSBjYW4gYXZvaWQgdGhlIGltcGxpY2l0IG1lbXNldCgwKS4KLSAgaWYgKHZvaWQqIHJlc3VsdCA9IGNhbGxvYyhudW1fbWVtYmVycywgbWVtYmVyX3NpemUpKSB7CisgIGlmICh2b2lkKiByZXN1bHQgPSBGWF9TYWZlQWxsb2MobnVtX21lbWJlcnMsIG1lbWJlcl9zaXplKSkKICAgICByZXR1cm4gcmVzdWx0OwotICB9CisKICAgRlhfT3V0T2ZNZW1vcnlUZXJtaW5hdGUoKTsgIC8vIE5ldmVyIHJldHVybnMuCiAgIHJldHVybiBudWxscHRyOyAgICAgICAgICAgICAvLyBTdXBwcmVzcyBjb21waWxlciB3YXJuaW5nLgogfQogCiBpbmxpbmUgdm9pZCogRlhfQWxsb2NPckRpZTJEKHNpemVfdCB3LCBzaXplX3QgaCwgc2l6ZV90IG1lbWJlcl9zaXplKSB7Ci0gIGlmICh3IDwgc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSAvIGgpIHsKKyAgaWYgKHcgPCBzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpIC8gaCkKICAgICByZXR1cm4gRlhfQWxsb2NPckRpZSh3ICogaCwgbWVtYmVyX3NpemUpOwotICB9CisKICAgRlhfT3V0T2ZNZW1vcnlUZXJtaW5hdGUoKTsgIC8vIE5ldmVyIHJldHVybnMuCiAgIHJldHVybiBudWxscHRyOyAgICAgICAgICAgICAvLyBTdXBwcmVzcyBjb21waWxlciB3YXJuaW5nLgogfQpAQCAtNTUsMjUgKzgyLDM5IEBACiBpbmxpbmUgdm9pZCogRlhfUmVhbGxvY09yRGllKHZvaWQqIHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9tZW1iZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWVtYmVyX3NpemUpIHsKLSAgaWYgKHZvaWQqIHJlc3VsdCA9IEZYX1NhZmVSZWFsbG9jKHB0ciwgbnVtX21lbWJlcnMsIG1lbWJlcl9zaXplKSkgeworICBpZiAodm9pZCogcmVzdWx0ID0gRlhfU2FmZVJlYWxsb2MocHRyLCBudW1fbWVtYmVycywgbWVtYmVyX3NpemUpKQogICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KKwogICBGWF9PdXRPZk1lbW9yeVRlcm1pbmF0ZSgpOyAgLy8gTmV2ZXIgcmV0dXJucy4KICAgcmV0dXJuIG51bGxwdHI7ICAgICAgICAgICAgIC8vIFN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmcuCiB9CiAKLS8vIE5ldmVyIHJldHVybnMgbnVsbHB0ci4KLSNkZWZpbmUgRlhfQWxsb2ModHlwZSwgc2l6ZSkgKHR5cGUqKUZYX0FsbG9jT3JEaWUoc2l6ZSwgc2l6ZW9mKHR5cGUpKQotI2RlZmluZSBGWF9BbGxvYzJEKHR5cGUsIHcsIGgpICh0eXBlKilGWF9BbGxvY09yRGllMkQodywgaCwgc2l6ZW9mKHR5cGUpKQorLy8gVGhlc2UgbmV2ZXIgcmV0dXJuIG51bGxwdHIuCisjZGVmaW5lIEZYX0FsbG9jKHR5cGUsIHNpemUpIFwKKyAgc3RhdGljX2Nhc3Q8dHlwZSo+KEZYX0FsbG9jT3JEaWUoc2l6ZSwgc2l6ZW9mKHR5cGUpKSkKKyNkZWZpbmUgRlhfQWxsb2MyRCh0eXBlLCB3LCBoKSBcCisgIHN0YXRpY19jYXN0PHR5cGUqPihGWF9BbGxvY09yRGllMkQodywgaCwgc2l6ZW9mKHR5cGUpKSkKICNkZWZpbmUgRlhfUmVhbGxvYyh0eXBlLCBwdHIsIHNpemUpIFwKLSAgKHR5cGUqKUZYX1JlYWxsb2NPckRpZShwdHIsIHNpemUsIHNpemVvZih0eXBlKSkKKyAgc3RhdGljX2Nhc3Q8dHlwZSo+KEZYX1JlYWxsb2NPckRpZShwdHIsIHNpemUsIHNpemVvZih0eXBlKSkpCiAKIC8vIE1heSByZXR1cm4gbnVsbHB0ci4KLSNkZWZpbmUgRlhfVHJ5QWxsb2ModHlwZSwgc2l6ZSkgKHR5cGUqKWNhbGxvYyhzaXplLCBzaXplb2YodHlwZSkpCisjZGVmaW5lIEZYX1RyeUFsbG9jKHR5cGUsIHNpemUpIFwKKyAgc3RhdGljX2Nhc3Q8dHlwZSo+KEZYX1NhZmVBbGxvYyhzaXplLCBzaXplb2YodHlwZSkpKQogI2RlZmluZSBGWF9UcnlSZWFsbG9jKHR5cGUsIHB0ciwgc2l6ZSkgXAotICAodHlwZSopRlhfU2FmZVJlYWxsb2MocHRyLCBzaXplLCBzaXplb2YodHlwZSkpCisgIHN0YXRpY19jYXN0PHR5cGUqPihGWF9TYWZlUmVhbGxvYyhwdHIsIHNpemUsIHNpemVvZih0eXBlKSkpCiAKLSNkZWZpbmUgRlhfRnJlZShwdHIpIGZyZWUocHRyKQoraW5saW5lIHZvaWQgRlhfRnJlZSh2b2lkKiBwdHIpIHsKKyAgLy8gVE9ETyhwYWxtZXIpOiBSZW1vdmluZyB0aGlzIGNoZWNrIGV4cG9zZXMgY3Jhc2hlcyB3aGVuIFBERml1bSBjYWxsZXJzCisgIC8vIGF0dGVtcHQgdG8gZnJlZSB8bnVsbHB0cnwuIEFsdGhvdWdoIGxpYmMncyB8ZnJlZXwgYWxsb3dzIGZyZWVpbmcgfE5VTEx8LCBubworICAvLyBvdGhlciBQYXJ0aXRpb24gQWxsb2MgY2FsbGVycyBuZWVkIHRoaXMgdG9sZXJhbnQgYmVoYXZpb3IuIEFkZGl0aW9uYWxseSwKKyAgLy8gY2hlY2tpbmcgZm9yIHxudWxscHRyfCBhZGRzIGEgYnJhbmNoIHRvIHxQYXJ0aXRpb25GcmVlfCwgYW5kIGl0J3MgbmljZSB0bworICAvLyBub3QgaGF2ZSB0byBoYXZlIHRoYXQuCisgIC8vCisgIC8vIFNvIHRoaXMgY2hlY2sgaXMgaGlkaW5nICh3aGF0IEkgY29uc2lkZXIgdG8gYmUpIGJ1Z3MsIGFuZCB3ZSBzaG91bGQgdHJ5IHRvCisgIC8vIGZpeCB0aGVtLiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvcGRmaXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NjkwCisgIGlmIChwdHIpCisgICAgcGRmaXVtOjpiYXNlOjpQYXJ0aXRpb25GcmVlKHB0cik7Cit9CiAKIC8vIFRoZSBGWF9BcnJheVNpemUoYXJyKSBtYWNybyByZXR1cm5zIHRoZSAjIG9mIGVsZW1lbnRzIGluIGFuIGFycmF5IGFyci4KIC8vIFRoZSBleHByZXNzaW9uIGlzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50LCBhbmQgdGhlcmVmb3JlIGNhbiBiZQpAQCAtOTUsMTIgKzEzNiw2IEBACiAgIGlubGluZSB2b2lkIG9wZXJhdG9yKCkodm9pZCogcHRyKSBjb25zdCB7IEZYX0ZyZWUocHRyKTsgfQogfTsKIAotLy8gVXNlZCB3aXRoIHN0ZDo6dW5pcXVlX3B0ciB0byBSZWxlYXNlKCkgb2JqZWN0cyB0aGF0IGNhbid0IGJlIGRlbGV0ZWQuCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLXN0cnVjdCBSZWxlYXNlRGVsZXRlciB7Ci0gIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoVCogcHRyKSBjb25zdCB7IHB0ci0+UmVsZWFzZSgpOyB9Ci19OwotCiAjZW5kaWYgIC8vIF9fY3BsdXNwbHVzCiAKICNlbmRpZiAgLy8gQ09SRV9GWENSVF9GWF9NRU1PUllfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvZnhfbWVtb3J5X3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnhjcnQvZnhfbWVtb3J5X3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODU2YmI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9meF9tZW1vcnlfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsODEgQEAKKy8vIENvcHlyaWdodCAyMDE1IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCisKKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3Qgc2l6ZV90IGtNYXhCeXRlQWxsb2MgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpOworY29uc3Qgc2l6ZV90IGtNYXhJbnRBbGxvYyA9IGtNYXhCeXRlQWxsb2MgLyBzaXplb2YoaW50KTsKK2NvbnN0IHNpemVfdCBrT3ZlcmZsb3dJbnRBbGxvYyA9IGtNYXhJbnRBbGxvYyArIDEwMDsKK2NvbnN0IHNpemVfdCBrV2lkdGggPSA2NDA7Citjb25zdCBzaXplX3Qga092ZXJmbG93SW50QWxsb2MyRCA9IGtNYXhJbnRBbGxvYyAvIGtXaWR0aCArIDEwOworCit9ICAvLyBuYW1lc3BhY2UKKworLy8gVE9ETyh0c2VwZXopOiByZS1lbmFibGUgT09NIHRlc3RzIGlmIHdlIGNhbiBmaW5kIGEgd2F5IHRvCisvLyBwcmV2ZW50IGl0IGZyb20gaG9zaW5nIHRoZSBib3RzLgorVEVTVChmeGNydCwgRElTQUJMRURfRlhfQWxsb2NPT00pIHsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRCgodm9pZClGWF9BbGxvYyhpbnQsIGtNYXhJbnRBbGxvYyksICIiKTsKKworICBpbnQqIHB0ciA9IEZYX0FsbG9jKGludCwgMSk7CisgIEVYUEVDVF9UUlVFKHB0cik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoKHZvaWQpRlhfUmVhbGxvYyhpbnQsIHB0ciwga01heEludEFsbG9jKSwgIiIpOworICBGWF9GcmVlKHB0cik7Cit9CisKK1RFU1QoZnhjcnQsIEZYX0FsbG9jT3ZlcmZsb3cpIHsKKyAgLy8gfHB0cnwgbmVlZHMgdG8gYmUgZGVmaW5lZCBhbmQgdXNlZCB0byBhdm9pZCBDbGFuZyBvcHRpbWl6ZXMgYXdheSB0aGUKKyAgLy8gRlhfQWxsb2MoKSBzdGF0ZW1lbnQgb3ZlcnplYWxvdXNseSBmb3Igb3B0aW1pemVkIGJ1aWxkcy4KKyAgaW50KiBwdHIgPSBudWxscHRyOworICBFWFBFQ1RfREVBVEhfSUZfU1VQUE9SVEVEKHB0ciA9IEZYX0FsbG9jKGludCwga092ZXJmbG93SW50QWxsb2MpLCAiIikgPDwgcHRyOworCisgIHB0ciA9IEZYX0FsbG9jKGludCwgMSk7CisgIEVYUEVDVF9UUlVFKHB0cik7CisgIEVYUEVDVF9ERUFUSF9JRl9TVVBQT1JURUQoKHZvaWQpRlhfUmVhbGxvYyhpbnQsIHB0ciwga092ZXJmbG93SW50QWxsb2MpLCAiIik7CisgIEZYX0ZyZWUocHRyKTsKK30KKworVEVTVChmeGNydCwgRlhfQWxsb2NPdmVyZmxvdzJEKSB7CisgIC8vIHxwdHJ8IG5lZWRzIHRvIGJlIGRlZmluZWQgYW5kIHVzZWQgdG8gYXZvaWQgQ2xhbmcgb3B0aW1pemVzIGF3YXkgdGhlCisgIC8vIEZYX0FsbG9jKCkgc3RhdGVtZW50IG92ZXJ6ZWFsb3VzbHkgZm9yIG9wdGltaXplZCBidWlsZHMuCisgIGludCogcHRyID0gbnVsbHB0cjsKKyAgRVhQRUNUX0RFQVRIX0lGX1NVUFBPUlRFRChwdHIgPSBGWF9BbGxvYzJEKGludCwga1dpZHRoLCBrT3ZlcmZsb3dJbnRBbGxvYzJEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIikKKyAgICAgIDw8IHB0cjsKK30KKworVEVTVChmeGNydCwgRElTQUJMRURfRlhfVHJ5QWxsb2NPT00pIHsKKyAgRVhQRUNUX0ZBTFNFKEZYX1RyeUFsbG9jKGludCwga01heEludEFsbG9jKSk7CisKKyAgaW50KiBwdHIgPSBGWF9BbGxvYyhpbnQsIDEpOworICBFWFBFQ1RfVFJVRShwdHIpOworICBFWFBFQ1RfRkFMU0UoRlhfVHJ5UmVhbGxvYyhpbnQsIHB0ciwga01heEludEFsbG9jKSk7CisgIEZYX0ZyZWUocHRyKTsKK30KKworVEVTVChmeGNydCwgRlhfVHJ5QWxsb2NPdmVyZmxvdykgeworICAvLyB8cHRyfCBuZWVkcyB0byBiZSBkZWZpbmVkIGFuZCB1c2VkIHRvIGF2b2lkIENsYW5nIG9wdGltaXplcyBhd2F5IHRoZQorICAvLyBjYWxsb2MoKSBzdGF0ZW1lbnQgb3ZlcnplYWxvdXNseSBmb3Igb3B0aW1pemVkIGJ1aWxkcy4KKyAgaW50KiBwdHIgPSAoaW50KiljYWxsb2Moc2l6ZW9mKGludCksIGtPdmVyZmxvd0ludEFsbG9jKTsKKyAgRVhQRUNUX0ZBTFNFKHB0cikgPDwgcHRyOworCisgIHB0ciA9IEZYX0FsbG9jKGludCwgMSk7CisgIEVYUEVDVF9UUlVFKHB0cik7CisgIEVYUEVDVF9GQUxTRShGWF9UcnlSZWFsbG9jKGludCwgcHRyLCBrT3ZlcmZsb3dJbnRBbGxvYykpOworICBGWF9GcmVlKHB0cik7Cit9CisKK1RFU1QoZnhjcnQsIERJU0FCTEVEX0ZYTUVNX0RlZmF1bHRPT00pIHsKKyAgRVhQRUNUX0ZBTFNFKEZYTUVNX0RlZmF1bHRBbGxvYyhrTWF4Qnl0ZUFsbG9jKSk7CisKKyAgdm9pZCogcHRyID0gRlhNRU1fRGVmYXVsdEFsbG9jKDEpOworICBFWFBFQ1RfVFJVRShwdHIpOworICBFWFBFQ1RfRkFMU0UoRlhNRU1fRGVmYXVsdFJlYWxsb2MocHRyLCBrTWF4Qnl0ZUFsbG9jKSk7CisgIEZYTUVNX0RlZmF1bHRGcmVlKHB0cik7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Z4X3JhbmRvbS5jcHAgYi9jb3JlL2Z4Y3J0L2Z4X3JhbmRvbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmODRkNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvZnhfcmFuZG9tLmNwcApAQCAtMCwwICsxLDEzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9yYW5kb20uaCIKKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorCisjZGVmaW5lIE1UX04gODQ4CisjZGVmaW5lIE1UX00gNDU2CisjZGVmaW5lIE1UX01hdHJpeF9BIDB4OTkwOGIwZGYKKyNkZWZpbmUgTVRfVXBwZXJfTWFzayAweDgwMDAwMDAwCisjZGVmaW5lIE1UX0xvd2VyX01hc2sgMHg3ZmZmZmZmZgorCisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KKyNpbmNsdWRlIDx3aW5jcnlwdC5oPgorI2Vsc2UgIC8vIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZiAgLy8gX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KKworbmFtZXNwYWNlIHsKKworc3RydWN0IE1UQ29udGV4dCB7CisgIHVpbnQzMl90IG10aTsKKyAgdWludDMyX3QgbXRbTVRfTl07Cit9OworCitib29sIGdfYkhhdmVHbG9iYWxTZWVkID0gZmFsc2U7Cit1aW50MzJfdCBnX25HbG9iYWxTZWVkID0gMDsKKworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCitib29sIEdlbmVyYXRlU2VlZEZyb21DcnlwdG9SYW5kb20odWludDMyX3QqIHBTZWVkKSB7CisgIEhDUllQVFBST1YgaENQID0gMDsKKyAgaWYgKCE6OkNyeXB0QWNxdWlyZUNvbnRleHQoJmhDUCwgbnVsbHB0ciwgbnVsbHB0ciwgUFJPVl9SU0FfRlVMTCwgMCkgfHwKKyAgICAgICFoQ1ApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgOjpDcnlwdEdlblJhbmRvbShoQ1AsIHNpemVvZih1aW50MzJfdCksIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KHBTZWVkKSk7CisgIDo6Q3J5cHRSZWxlYXNlQ29udGV4dChoQ1AsIDApOworICByZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZgorCit1aW50MzJfdCBHZW5lcmF0ZVNlZWRGcm9tRW52aXJvbm1lbnQoKSB7CisgIGNoYXIgYzsKKyAgdWludHB0cl90IHAgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oJmMpOworICB1aW50MzJfdCBzZWVkID0gfnN0YXRpY19jYXN0PHVpbnQzMl90PihwID4+IDMpOworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisgIFNZU1RFTVRJTUUgc3Q7CisgIEdldFN5c3RlbVRpbWUoJnN0KTsKKyAgc2VlZCBePSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3Qud1NlY29uZCkgKiAxMDAwMDAwOworICBzZWVkIF49IHN0YXRpY19jYXN0PHVpbnQzMl90PihzdC53TWlsbGlzZWNvbmRzKSAqIDEwMDA7CisgIHNlZWQgXj0gR2V0Q3VycmVudFByb2Nlc3NJZCgpOworI2Vsc2UgICAvLyBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXworICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgZ2V0dGltZW9mZGF5KCZ0diwgMCk7CisgIHNlZWQgXj0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHR2LnR2X3NlYykgKiAxMDAwMDAwOworICBzZWVkIF49IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0di50dl91c2VjKTsKKyAgc2VlZCBePSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZ2V0cGlkKCkpOworI2VuZGlmICAvLyBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXworICByZXR1cm4gc2VlZDsKK30KKwordm9pZCogQ29udGV4dEZyb21OZXh0R2xvYmFsU2VlZCgpIHsKKyAgaWYgKCFnX2JIYXZlR2xvYmFsU2VlZCkgeworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisgICAgaWYgKCFHZW5lcmF0ZVNlZWRGcm9tQ3J5cHRvUmFuZG9tKCZnX25HbG9iYWxTZWVkKSkKKyAgICAgIGdfbkdsb2JhbFNlZWQgPSBHZW5lcmF0ZVNlZWRGcm9tRW52aXJvbm1lbnQoKTsKKyNlbHNlICAgLy8gX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KKyAgICBnX25HbG9iYWxTZWVkID0gR2VuZXJhdGVTZWVkRnJvbUVudmlyb25tZW50KCk7CisjZW5kaWYgIC8vIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisgICAgZ19iSGF2ZUdsb2JhbFNlZWQgPSB0cnVlOworICB9CisgIHJldHVybiBGWF9SYW5kb21fTVRfU3RhcnQoKytnX25HbG9iYWxTZWVkKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK3ZvaWQqIEZYX1JhbmRvbV9NVF9TdGFydCh1aW50MzJfdCBkd1NlZWQpIHsKKyAgTVRDb250ZXh0KiBwQ29udGV4dCA9IEZYX0FsbG9jKE1UQ29udGV4dCwgMSk7CisgIHVpbnQzMl90KiBwQnVmID0gcENvbnRleHQtPm10OworICBwQnVmWzBdID0gZHdTZWVkOworICBmb3IgKHVpbnQzMl90IGkgPSAxOyBpIDwgTVRfTjsgaSsrKQorICAgIHBCdWZbaV0gPSAoMTgxMjQzMzI1M1VMICogKHBCdWZbaSAtIDFdIF4gKHBCdWZbaSAtIDFdID4+IDMwKSkgKyBpKTsKKworICBwQ29udGV4dC0+bXRpID0gTVRfTjsKKyAgcmV0dXJuIHBDb250ZXh0OworfQorCit1aW50MzJfdCBGWF9SYW5kb21fTVRfR2VuZXJhdGUodm9pZCogcENvbnRleHQpIHsKKyAgTVRDb250ZXh0KiBwTVRDID0gc3RhdGljX2Nhc3Q8TVRDb250ZXh0Kj4ocENvbnRleHQpOworICB1aW50MzJfdCogcEJ1ZiA9IHBNVEMtPm10OworICB1aW50MzJfdCB2OworICBpZiAocE1UQy0+bXRpID49IE1UX04pIHsKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgbWFnWzJdID0gezAsIE1UX01hdHJpeF9BfTsKKyAgICB1aW50MzJfdCBrazsKKyAgICBmb3IgKGtrID0gMDsga2sgPCBNVF9OIC0gTVRfTTsga2srKykgeworICAgICAgdiA9IChwQnVmW2trXSAmIE1UX1VwcGVyX01hc2spIHwgKHBCdWZba2sgKyAxXSAmIE1UX0xvd2VyX01hc2spOworICAgICAgcEJ1Zltra10gPSBwQnVmW2trICsgTVRfTV0gXiAodiA+PiAxKSBeIG1hZ1t2ICYgMV07CisgICAgfQorICAgIGZvciAoOyBrayA8IE1UX04gLSAxOyBraysrKSB7CisgICAgICB2ID0gKHBCdWZba2tdICYgTVRfVXBwZXJfTWFzaykgfCAocEJ1ZltrayArIDFdICYgTVRfTG93ZXJfTWFzayk7CisgICAgICBwQnVmW2trXSA9IHBCdWZba2sgKyAoTVRfTSAtIE1UX04pXSBeICh2ID4+IDEpIF4gbWFnW3YgJiAxXTsKKyAgICB9CisgICAgdiA9IChwQnVmW01UX04gLSAxXSAmIE1UX1VwcGVyX01hc2spIHwgKHBCdWZbMF0gJiBNVF9Mb3dlcl9NYXNrKTsKKyAgICBwQnVmW01UX04gLSAxXSA9IHBCdWZbTVRfTSAtIDFdIF4gKHYgPj4gMSkgXiBtYWdbdiAmIDFdOworICAgIHBNVEMtPm10aSA9IDA7CisgIH0KKyAgdiA9IHBCdWZbcE1UQy0+bXRpKytdOworICB2IF49ICh2ID4+IDExKTsKKyAgdiBePSAodiA8PCA3KSAmIDB4OWQyYzU2ODBVTDsKKyAgdiBePSAodiA8PCAxNSkgJiAweGVmYzYwMDAwVUw7CisgIHYgXj0gKHYgPj4gMTgpOworICByZXR1cm4gdjsKK30KKwordm9pZCBGWF9SYW5kb21fTVRfQ2xvc2Uodm9pZCogcENvbnRleHQpIHsKKyAgRlhfRnJlZShwQ29udGV4dCk7Cit9CisKK3ZvaWQgRlhfUmFuZG9tX0dlbmVyYXRlTVQodWludDMyX3QqIHBCdWZmZXIsIGludDMyX3QgaUNvdW50KSB7CisgIHZvaWQqIHBDb250ZXh0ID0gQ29udGV4dEZyb21OZXh0R2xvYmFsU2VlZCgpOworICB3aGlsZSAoaUNvdW50LS0gPiAwKQorICAgICpwQnVmZmVyKysgPSBGWF9SYW5kb21fTVRfR2VuZXJhdGUocENvbnRleHQpOworCisgIEZYX1JhbmRvbV9NVF9DbG9zZShwQ29udGV4dCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Z4X3JhbmRvbS5oIGIvY29yZS9meGNydC9meF9yYW5kb20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmQ1MTRiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9meF9yYW5kb20uaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENSVF9GWF9SQU5ET01fSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9GWF9SQU5ET01fSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCit2b2lkKiBGWF9SYW5kb21fTVRfU3RhcnQodWludDMyX3QgZHdTZWVkKTsKK3ZvaWQgRlhfUmFuZG9tX01UX0Nsb3NlKHZvaWQqIHBDb250ZXh0KTsKK3VpbnQzMl90IEZYX1JhbmRvbV9NVF9HZW5lcmF0ZSh2b2lkKiBwQ29udGV4dCk7CisKK3ZvaWQgRlhfUmFuZG9tX0dlbmVyYXRlTVQodWludDMyX3QqIHBCdWZmZXIsIGludDMyX3QgaUNvdW50KTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0ZYX1JBTkRPTV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF9yYW5kb21fdW5pdHRlc3QuY3BwIGIvY29yZS9meGNydC9meF9yYW5kb21fdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwN2YxNDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2Z4X3JhbmRvbV91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9yYW5kb20uaCIKKworI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCitURVNUKEZYX1JhbmRvbSwgR2VuZXJhdGVNVDM2MDB0aW1lcykgeworICAvLyBQcm92ZSB0aGlzIGRvZXNuJ3Qgc3BpbiB3YWl0IGZvciBhIHNlY29uZCBlYWNoIHRpbWUuCisgIC8vIFNpbmNlIG91ciBnbG9iYWwgc2VlZHMgYXJlIHNlcXVlbnRpYWwsIHRoZXkgd29udCd0IGNvbGxpZGUgb25jZQorICAvLyBzZWVkZWQgdW50aWwgMl4zMiBjYWxscywgYW5kIGlmIHRoZSBQTlJHIGlzIGFueSBnb29kLCB3ZSB3b24ndAorICAvLyBnZXQgdGhlIHNhbWUgc2VxdWVuY2UgZnJvbSBkaWZmZXJlbnQgc2VlZHMsIGVzcC4gd2l0aCB0aGlzIGZldworICAvLyBpdGVyYXRpb25zLgorICBzdGQ6OnNldDxzdGQ6OmFycmF5PHVpbnQzMl90LCAxNj4+IHNlZW47CisgIHN0ZDo6YXJyYXk8dWludDMyX3QsIDE2PiBjdXJyZW50OworICBmb3IgKGludCBpID0gMDsgaSA8IDM2MDA7ICsraSkgeworICAgIEZYX1JhbmRvbV9HZW5lcmF0ZU1UKGN1cnJlbnQuZGF0YSgpLCAxNik7CisgICAgRVhQRUNUX1RSVUUoc2Vlbi5pbnNlcnQoY3VycmVudCkuc2Vjb25kKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF9zYWZlX3R5cGVzLmggYi9jb3JlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaAppbmRleCA2NmRiYzU3Li41MWViODljIDEwMDY0NAotLS0gYS9jb3JlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaAorKysgYi9jb3JlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaApAQCAtNyw3ICs3LDYgQEAKIAogI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gRm9yIHNpemVfdC4KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyZWFtLmgiICAvLyBmb3IgRlhfRklMRVNJWkUuCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfbWF0aC5oIgogCkBAIC0xNSw2ICsxNCw1IEBACiB0eXBlZGVmIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8aW50MzJfdD4gRlhfU0FGRV9JTlQzMjsKIHR5cGVkZWYgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxzaXplX3Q+IEZYX1NBRkVfU0laRV9UOwogdHlwZWRlZiBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPEZYX0ZJTEVTSVpFPiBGWF9TQUZFX0ZJTEVTSVpFOwotdHlwZWRlZiBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPEZYX1NUUlNJWkU+IEZYX1NBRkVfU1RSU0laRTsKIAogI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0ZYX1NBRkVfVFlQRVNfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvZnhfc3RyZWFtLmNwcCBiL2NvcmUvZnhjcnQvZnhfc3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDc1YWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9meF9zdHJlYW0uY3BwCkBAIC0wLDAgKzEsMTU0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmVhbS5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc2FmZV90eXBlcy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvaWZ4X2ZpbGVhY2Nlc3MuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENGWF9DUlRGaWxlU3RyZWFtIGZpbmFsIDogcHVibGljIElGWF9TZWVrYWJsZVN0cmVhbSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KKyAgZnJpZW5kIFJldGFpblB0cjxUPiBwZGZpdW06Ok1ha2VSZXRhaW4oQXJncyYmLi4uIGFyZ3MpOworCisgIC8vIElGWF9TZWVrYWJsZVN0cmVhbToKKyAgRlhfRklMRVNJWkUgR2V0U2l6ZSgpIG92ZXJyaWRlIHsgcmV0dXJuIG1fcEZpbGUtPkdldFNpemUoKTsgfQorICBib29sIElzRU9GKCkgb3ZlcnJpZGUgeyByZXR1cm4gR2V0UG9zaXRpb24oKSA+PSBHZXRTaXplKCk7IH0KKyAgRlhfRklMRVNJWkUgR2V0UG9zaXRpb24oKSBvdmVycmlkZSB7IHJldHVybiBtX3BGaWxlLT5HZXRQb3NpdGlvbigpOyB9CisgIGJvb2wgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBtX3BGaWxlLT5SZWFkUG9zKGJ1ZmZlciwgc2l6ZSwgb2Zmc2V0KSA+IDA7CisgIH0KKyAgc2l6ZV90IFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIG1fcEZpbGUtPlJlYWQoYnVmZmVyLCBzaXplKTsKKyAgfQorICBib29sIFdyaXRlQmxvY2soY29uc3Qgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gISFtX3BGaWxlLT5Xcml0ZVBvcyhidWZmZXIsIHNpemUsIG9mZnNldCk7CisgIH0KKyAgYm9vbCBGbHVzaCgpIG92ZXJyaWRlIHsgcmV0dXJuIG1fcEZpbGUtPkZsdXNoKCk7IH0KKworIHByaXZhdGU6CisgIGV4cGxpY2l0IENGWF9DUlRGaWxlU3RyZWFtKHN0ZDo6dW5pcXVlX3B0cjxJRlhfRmlsZUFjY2Vzcz4gcEZBKQorICAgICAgOiBtX3BGaWxlKHN0ZDo6bW92ZShwRkEpKSB7fQorICB+Q0ZYX0NSVEZpbGVTdHJlYW0oKSBvdmVycmlkZSB7fQorCisgIHN0ZDo6dW5pcXVlX3B0cjxJRlhfRmlsZUFjY2Vzcz4gbV9wRmlsZTsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK1JldGFpblB0cjxJRlhfU2Vla2FibGVTdHJlYW0+IElGWF9TZWVrYWJsZVN0cmVhbTo6Q3JlYXRlRnJvbUZpbGVuYW1lKAorICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorICAgIHVpbnQzMl90IGR3TW9kZXMpIHsKKyAgc3RkOjp1bmlxdWVfcHRyPElGWF9GaWxlQWNjZXNzPiBwRkEgPSBJRlhfRmlsZUFjY2Vzczo6Q3JlYXRlKCk7CisgIGlmICghcEZBLT5PcGVuKGZpbGVuYW1lLCBkd01vZGVzKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIHBkZml1bTo6TWFrZVJldGFpbjxDRlhfQ1JURmlsZVN0cmVhbT4oc3RkOjptb3ZlKHBGQSkpOworfQorCisvLyBzdGF0aWMKK1JldGFpblB0cjxJRlhfU2Vla2FibGVTdHJlYW0+IElGWF9TZWVrYWJsZVN0cmVhbTo6Q3JlYXRlRnJvbUZpbGVuYW1lKAorICAgIGNvbnN0IHdjaGFyX3QqIGZpbGVuYW1lLAorICAgIHVpbnQzMl90IGR3TW9kZXMpIHsKKyAgc3RkOjp1bmlxdWVfcHRyPElGWF9GaWxlQWNjZXNzPiBwRkEgPSBJRlhfRmlsZUFjY2Vzczo6Q3JlYXRlKCk7CisgIGlmICghcEZBLT5PcGVuKGZpbGVuYW1lLCBkd01vZGVzKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIHBkZml1bTo6TWFrZVJldGFpbjxDRlhfQ1JURmlsZVN0cmVhbT4oc3RkOjptb3ZlKHBGQSkpOworfQorCisvLyBzdGF0aWMKK1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBJRlhfU2Vla2FibGVSZWFkU3RyZWFtOjpDcmVhdGVGcm9tRmlsZW5hbWUoCisgICAgY29uc3QgY2hhciogZmlsZW5hbWUpIHsKKyAgcmV0dXJuIElGWF9TZWVrYWJsZVN0cmVhbTo6Q3JlYXRlRnJvbUZpbGVuYW1lKGZpbGVuYW1lLCBGWF9GSUxFTU9ERV9SZWFkT25seSk7Cit9CisKK2Jvb2wgSUZYX1NlZWthYmxlV3JpdGVTdHJlYW06OldyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKSB7CisgIHJldHVybiBXcml0ZUJsb2NrKHBEYXRhLCBHZXRTaXplKCksIHNpemUpOworfQorCitib29sIElGWF9TZWVrYWJsZVJlYWRTdHJlYW06OklzRU9GKCkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK0ZYX0ZJTEVTSVpFIElGWF9TZWVrYWJsZVJlYWRTdHJlYW06OkdldFBvc2l0aW9uKCkgeworICByZXR1cm4gMDsKK30KKworc2l6ZV90IElGWF9TZWVrYWJsZVJlYWRTdHJlYW06OlJlYWRCbG9jayh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSB7CisgIHJldHVybiAwOworfQorCitib29sIElGWF9TZWVrYWJsZVN0cmVhbTo6V3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSB7CisgIHJldHVybiBXcml0ZUJsb2NrKGJ1ZmZlciwgR2V0U2l6ZSgpLCBzaXplKTsKK30KKworYm9vbCBJRlhfU2Vla2FibGVTdHJlYW06OldyaXRlU3RyaW5nKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIpIHsKKyAgcmV0dXJuIFdyaXRlQmxvY2soc3RyLnVudGVybWluYXRlZF9jX3N0cigpLCBzdHIuR2V0TGVuZ3RoKCkpOworfQorCitGWF9GaWxlSGFuZGxlKiBGWF9PcGVuRm9sZGVyKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXworICBhdXRvIHBEYXRhID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGaW5kRmlsZURhdGFBPigpOworICBwRGF0YS0+bV9IYW5kbGUgPQorICAgICAgRmluZEZpcnN0RmlsZUV4QSgoQnl0ZVN0cmluZyhwYXRoKSArICIvKi4qIikuY19zdHIoKSwgRmluZEV4SW5mb1N0YW5kYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPm1fRmluZERhdGEsIEZpbmRFeFNlYXJjaE5hbWVNYXRjaCwgbnVsbHB0ciwgMCk7CisgIGlmIChwRGF0YS0+bV9IYW5kbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgcERhdGEtPm1fYkVuZCA9IGZhbHNlOworICByZXR1cm4gcERhdGEucmVsZWFzZSgpOworI2Vsc2UKKyAgcmV0dXJuIG9wZW5kaXIocGF0aCk7CisjZW5kaWYKK30KKworYm9vbCBGWF9HZXROZXh0RmlsZShGWF9GaWxlSGFuZGxlKiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHJpbmcqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICBib29sKiBiRm9sZGVyKSB7CisgIGlmICghaGFuZGxlKQorICAgIHJldHVybiBmYWxzZTsKKworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisgIGlmIChoYW5kbGUtPm1fYkVuZCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgKmZpbGVuYW1lID0gaGFuZGxlLT5tX0ZpbmREYXRhLmNGaWxlTmFtZTsKKyAgKmJGb2xkZXIgPQorICAgICAgKGhhbmRsZS0+bV9GaW5kRGF0YS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSAhPSAwOworICBpZiAoIUZpbmROZXh0RmlsZUEoaGFuZGxlLT5tX0hhbmRsZSwgJmhhbmRsZS0+bV9GaW5kRGF0YSkpCisgICAgaGFuZGxlLT5tX2JFbmQgPSB0cnVlOworICByZXR1cm4gdHJ1ZTsKKyNlbHNlCisgIHN0cnVjdCBkaXJlbnQqIGRlID0gcmVhZGRpcihoYW5kbGUpOworICBpZiAoIWRlKQorICAgIHJldHVybiBmYWxzZTsKKyAgKmZpbGVuYW1lID0gZGUtPmRfbmFtZTsKKyAgKmJGb2xkZXIgPSBkZS0+ZF90eXBlID09IERUX0RJUjsKKyAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30KKwordm9pZCBGWF9DbG9zZUZvbGRlcihGWF9GaWxlSGFuZGxlKiBoYW5kbGUpIHsKKyAgaWYgKCFoYW5kbGUpCisgICAgcmV0dXJuOworCisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KKyAgRmluZENsb3NlKGhhbmRsZS0+bV9IYW5kbGUpOworICBkZWxldGUgaGFuZGxlOworI2Vsc2UKKyAgY2xvc2VkaXIoaGFuZGxlKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF9zdHJlYW0uaCBiL2NvcmUvZnhjcnQvZnhfc3RyZWFtLmgKaW5kZXggMmY0YjVhZC4uOGQwYTU5NiAxMDA2NDQKLS0tIGEvY29yZS9meGNydC9meF9zdHJlYW0uaAorKysgYi9jb3JlL2Z4Y3J0L2Z4X3N0cmVhbS5oCkBAIC03LDE4ICs3LDE3IEBACiAjaWZuZGVmIENPUkVfRlhDUlRfRlhfU1RSRUFNX0hfCiAjZGVmaW5lIENPUkVfRlhDUlRfRlhfU1RSRUFNX0hfCiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgogCi0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCiAjaW5jbHVkZSA8ZGlyZWN0Lmg+CiAKIGNsYXNzIENGaW5kRmlsZURhdGFBOwogdHlwZWRlZiBDRmluZEZpbGVEYXRhQSBGWF9GaWxlSGFuZGxlOwotI2RlZmluZSBGWF9GSUxFU0laRSBpbnQzMl90CiAKLSNlbHNlCisjZWxzZSAgLy8gX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KIAogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CkBAIC0yNiwzNSArMjUsMzAgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2lmbmRlZiBPX0JJTkFSWQotI2RlZmluZSBPX0JJTkFSWSAwCi0jZW5kaWYgIC8vIE9fQklOQVJZCi0KLSNpZm5kZWYgT19MQVJHRUZJTEUKLSNkZWZpbmUgT19MQVJHRUZJTEUgMAotI2VuZGlmICAvLyBPX0xBUkdFRklMRQotCiB0eXBlZGVmIERJUiBGWF9GaWxlSGFuZGxlOwotI2RlZmluZSBGWF9GSUxFU0laRSBvZmZfdAotI2VuZGlmICAvLyBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisjZW5kaWYgIC8vIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCiAKLUZYX0ZpbGVIYW5kbGUqIEZYX09wZW5Gb2xkZXIoY29uc3QgRlhfQ0hBUiogcGF0aCk7Ci1ib29sIEZYX0dldE5leHRGaWxlKEZYX0ZpbGVIYW5kbGUqIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcqIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICBib29sKiBiRm9sZGVyKTsKK0ZYX0ZpbGVIYW5kbGUqIEZYX09wZW5Gb2xkZXIoY29uc3QgY2hhciogcGF0aCk7Citib29sIEZYX0dldE5leHRGaWxlKEZYX0ZpbGVIYW5kbGUqIGhhbmRsZSwgQnl0ZVN0cmluZyogZmlsZW5hbWUsIGJvb2wqIGJGb2xkZXIpOwogdm9pZCBGWF9DbG9zZUZvbGRlcihGWF9GaWxlSGFuZGxlKiBoYW5kbGUpOwotRlhfV0NIQVIgRlhfR2V0Rm9sZGVyU2VwYXJhdG9yKCk7CiAKLSNkZWZpbmUgRlhfRklMRU1PREVfV3JpdGUgMAogI2RlZmluZSBGWF9GSUxFTU9ERV9SZWFkT25seSAxCiAjZGVmaW5lIEZYX0ZJTEVNT0RFX1RydW5jYXRlIDIKIAotY2xhc3MgSUZYX1dyaXRlU3RyZWFtIDogdmlydHVhbCBwdWJsaWMgQ0ZYX1JldGFpbmFibGUgeworY2xhc3MgSUZYX1dyaXRlU3RyZWFtIDogdmlydHVhbCBwdWJsaWMgUmV0YWluYWJsZSB7CiAgcHVibGljOgogICB2aXJ0dWFsIGJvb2wgV3JpdGVCbG9jayhjb25zdCB2b2lkKiBwRGF0YSwgc2l6ZV90IHNpemUpID0gMDsKKyAgdmlydHVhbCBib29sIFdyaXRlU3RyaW5nKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIpID0gMDsKIH07CiAKLWNsYXNzIElGWF9SZWFkU3RyZWFtIDogdmlydHVhbCBwdWJsaWMgQ0ZYX1JldGFpbmFibGUgeworY2xhc3MgSUZYX0FyY2hpdmVTdHJlYW0gOiBwdWJsaWMgSUZYX1dyaXRlU3RyZWFtIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgYm9vbCBXcml0ZUJ5dGUodWludDhfdCBieXRlKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBXcml0ZURXb3JkKHVpbnQzMl90IGkpID0gMDsKKyAgdmlydHVhbCBGWF9GSUxFU0laRSBDdXJyZW50T2Zmc2V0KCkgY29uc3QgPSAwOworfTsKKworY2xhc3MgSUZYX1JlYWRTdHJlYW0gOiB2aXJ0dWFsIHB1YmxpYyBSZXRhaW5hYmxlIHsKICBwdWJsaWM6CiAgIHZpcnR1YWwgYm9vbCBJc0VPRigpID0gMDsKICAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRQb3NpdGlvbigpID0gMDsKQEAgLTc1LDggKzY5LDggQEAKIAogY2xhc3MgSUZYX1NlZWthYmxlUmVhZFN0cmVhbSA6IHB1YmxpYyBJRlhfUmVhZFN0cmVhbSB7CiAgcHVibGljOgotICBzdGF0aWMgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBDcmVhdGVGcm9tRmlsZW5hbWUoCi0gICAgICBjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSk7CisgIHN0YXRpYyBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gQ3JlYXRlRnJvbUZpbGVuYW1lKAorICAgICAgY29uc3QgY2hhciogZmlsZW5hbWUpOwogCiAgIC8vIElGWF9SZWFkU3RyZWFtOgogICBib29sIElzRU9GKCkgb3ZlcnJpZGU7CkBAIC05MCwxMiArODQsMTEgQEAKIGNsYXNzIElGWF9TZWVrYWJsZVN0cmVhbSA6IHB1YmxpYyBJRlhfU2Vla2FibGVSZWFkU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIElGWF9TZWVrYWJsZVdyaXRlU3RyZWFtIHsKICBwdWJsaWM6Ci0gIHN0YXRpYyBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVN0cmVhbT4gQ3JlYXRlRnJvbUZpbGVuYW1lKAotICAgICAgY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUsCi0gICAgICB1aW50MzJfdCBkd01vZGVzKTsKKyAgc3RhdGljIFJldGFpblB0cjxJRlhfU2Vla2FibGVTdHJlYW0+IENyZWF0ZUZyb21GaWxlbmFtZShjb25zdCBjaGFyKiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd01vZGVzKTsKIAotICBzdGF0aWMgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVTdHJlYW0+IENyZWF0ZUZyb21GaWxlbmFtZSgKLSAgICAgIGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSwKKyAgc3RhdGljIFJldGFpblB0cjxJRlhfU2Vla2FibGVTdHJlYW0+IENyZWF0ZUZyb21GaWxlbmFtZSgKKyAgICAgIGNvbnN0IHdjaGFyX3QqIGZpbGVuYW1lLAogICAgICAgdWludDMyX3QgZHdNb2Rlcyk7CiAKICAgLy8gSUZYX1NlZWthYmxlUmVhZFN0cmVhbToKQEAgLTExMCw1MSArMTAzLDEyIEBACiAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUgPSAwOwogICBib29sIFdyaXRlQmxvY2soY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgIGJvb2wgV3JpdGVTdHJpbmcoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN0cikgb3ZlcnJpZGU7CisKICAgYm9vbCBGbHVzaCgpIG92ZXJyaWRlID0gMDsKIH07CiAKLWNsYXNzIElGWF9NZW1vcnlTdHJlYW0gOiBwdWJsaWMgSUZYX1NlZWthYmxlU3RyZWFtIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBDRlhfUmV0YWluUHRyPElGWF9NZW1vcnlTdHJlYW0+IENyZWF0ZSh1aW50OF90KiBwQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVGFrZU92ZXIgPSBmYWxzZSk7Ci0gIHN0YXRpYyBDRlhfUmV0YWluUHRyPElGWF9NZW1vcnlTdHJlYW0+IENyZWF0ZShib29sIGJDb25zZWN1dGl2ZSA9IGZhbHNlKTsKLQotICB2aXJ0dWFsIGJvb2wgSXNDb25zZWN1dGl2ZSgpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIEVzdGltYXRlU2l6ZShzaXplX3QgbkluaXRTaXplLCBzaXplX3Qgbkdyb3dTaXplKSA9IDA7Ci0gIHZpcnR1YWwgdWludDhfdCogR2V0QnVmZmVyKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgQXR0YWNoQnVmZmVyKHVpbnQ4X3QqIHBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5TaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRha2VPdmVyID0gZmFsc2UpID0gMDsKLSAgdmlydHVhbCB2b2lkIERldGFjaEJ1ZmZlcigpID0gMDsKLX07Ci0KLWNsYXNzIElGWF9CdWZmZXJlZFJlYWRTdHJlYW0gOiBwdWJsaWMgSUZYX1JlYWRTdHJlYW0gewotIHB1YmxpYzoKLSAgLy8gSUZYX1JlYWRTdHJlYW06Ci0gIGJvb2wgSXNFT0YoKSBvdmVycmlkZSA9IDA7Ci0gIEZYX0ZJTEVTSVpFIEdldFBvc2l0aW9uKCkgb3ZlcnJpZGUgPSAwOwotICBzaXplX3QgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIG92ZXJyaWRlID0gMDsKLQotICB2aXJ0dWFsIGJvb2wgUmVhZE5leHRCbG9jayhib29sIGJSZXN0YXJ0ID0gZmFsc2UpID0gMDsKLSAgdmlydHVhbCBjb25zdCB1aW50OF90KiBHZXRCbG9ja0J1ZmZlcigpID0gMDsKLSAgdmlydHVhbCBzaXplX3QgR2V0QmxvY2tTaXplKCkgPSAwOwotICB2aXJ0dWFsIEZYX0ZJTEVTSVpFIEdldEJsb2NrT2Zmc2V0KCkgPSAwOwotfTsKLQotI2lmZGVmIFBERl9FTkFCTEVfWEZBCi1jbGFzcyBJRlhfRmlsZUFjY2VzcyA6IHB1YmxpYyBDRlhfUmV0YWluYWJsZSB7Ci0gcHVibGljOgotICBzdGF0aWMgQ0ZYX1JldGFpblB0cjxJRlhfRmlsZUFjY2Vzcz4gQ3JlYXRlRGVmYXVsdCgKLSAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NQYXRoKTsKLQotICB2aXJ0dWFsIHZvaWQgR2V0UGF0aChDRlhfV2lkZVN0cmluZyYgd3NQYXRoKSA9IDA7Ci0gIHZpcnR1YWwgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVTdHJlYW0+IENyZWF0ZUZpbGVTdHJlYW0oCi0gICAgICB1aW50MzJfdCBkd01vZGVzKSA9IDA7Ci19OwotI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQotCi0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCiBjbGFzcyBDRmluZEZpbGVEYXRhIHsKICBwdWJsaWM6CiAgIHZpcnR1YWwgfkNGaW5kRmlsZURhdGEoKSB7fQpAQCAtMTY3LDEyICsxMjEsNiBAQAogICB+Q0ZpbmRGaWxlRGF0YUEoKSBvdmVycmlkZSB7fQogICBXSU4zMl9GSU5EX0RBVEFBIG1fRmluZERhdGE7CiB9OwotCi1jbGFzcyBDRmluZEZpbGVEYXRhVyA6IHB1YmxpYyBDRmluZEZpbGVEYXRhIHsKLSBwdWJsaWM6Ci0gIH5DRmluZEZpbGVEYXRhVygpIG92ZXJyaWRlIHt9Ci0gIFdJTjMyX0ZJTkRfREFUQVcgbV9GaW5kRGF0YTsKLX07CiAjZW5kaWYKIAogI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0ZYX1NUUkVBTV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF9zdHJpbmcuY3BwIGIvY29yZS9meGNydC9meF9zdHJpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZWIzYTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2Z4X3N0cmluZy5jcHAKQEAgLTAsMCArMSwyMzIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENGWF9VVEY4RW5jb2RlciB7CisgcHVibGljOgorICBDRlhfVVRGOEVuY29kZXIoKSB7fQorICB+Q0ZYX1VURjhFbmNvZGVyKCkge30KKworICB2b2lkIElucHV0KHdjaGFyX3QgdW5pY29kZUFzV2NoYXIpIHsKKyAgICB1aW50MzJfdCB1bmljb2RlID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHVuaWNvZGVBc1djaGFyKTsKKyAgICBpZiAodW5pY29kZSA8IDB4ODApIHsKKyAgICAgIG1fQnVmZmVyLnB1c2hfYmFjayh1bmljb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKHVuaWNvZGUgPj0gMHg4MDAwMDAwMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgICBpbnQgbmJ5dGVzID0gMDsKKyAgICAgIGlmICh1bmljb2RlIDwgMHg4MDApCisgICAgICAgIG5ieXRlcyA9IDI7CisgICAgICBlbHNlIGlmICh1bmljb2RlIDwgMHgxMDAwMCkKKyAgICAgICAgbmJ5dGVzID0gMzsKKyAgICAgIGVsc2UgaWYgKHVuaWNvZGUgPCAweDIwMDAwMCkKKyAgICAgICAgbmJ5dGVzID0gNDsKKyAgICAgIGVsc2UgaWYgKHVuaWNvZGUgPCAweDQwMDAwMDApCisgICAgICAgIG5ieXRlcyA9IDU7CisgICAgICBlbHNlCisgICAgICAgIG5ieXRlcyA9IDY7CisKKyAgICAgIHN0YXRpYyB1aW50OF90IHByZWZpeFtdID0gezB4YzAsIDB4ZTAsIDB4ZjAsIDB4ZjgsIDB4ZmN9OworICAgICAgaW50IG9yZGVyID0gMSA8PCAoKG5ieXRlcyAtIDEpICogNik7CisgICAgICBpbnQgY29kZSA9IHVuaWNvZGVBc1djaGFyOworICAgICAgbV9CdWZmZXIucHVzaF9iYWNrKHByZWZpeFtuYnl0ZXMgLSAyXSB8IChjb2RlIC8gb3JkZXIpKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmJ5dGVzIC0gMTsgaSsrKSB7CisgICAgICAgIGNvZGUgPSBjb2RlICUgb3JkZXI7CisgICAgICAgIG9yZGVyID4+PSA2OworICAgICAgICBtX0J1ZmZlci5wdXNoX2JhY2soMHg4MCB8IChjb2RlIC8gb3JkZXIpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBUaGUgZGF0YSByZXR1cm5lZCBieSBHZXRSZXN1bHQoKSBpcyBpbnZhbGlkYXRlZCB3aGVuIHRoaXMgaXMgbW9kaWZpZWQgYnkKKyAgLy8gYXBwZW5kaW5nIGFueSBkYXRhLgorICBCeXRlU3RyaW5nVmlldyBHZXRSZXN1bHQoKSBjb25zdCB7CisgICAgcmV0dXJuIEJ5dGVTdHJpbmdWaWV3KG1fQnVmZmVyLmRhdGEoKSwgbV9CdWZmZXIuc2l6ZSgpKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbV9CdWZmZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworQnl0ZVN0cmluZyBGWF9VVEY4RW5jb2RlKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c1N0cikgeworICBzaXplX3QgbGVuID0gd3NTdHIuR2V0TGVuZ3RoKCk7CisgIGNvbnN0IHdjaGFyX3QqIHBTdHIgPSB3c1N0ci51bnRlcm1pbmF0ZWRfY19zdHIoKTsKKyAgQ0ZYX1VURjhFbmNvZGVyIGVuY29kZXI7CisgIHdoaWxlIChsZW4tLSA+IDApCisgICAgZW5jb2Rlci5JbnB1dCgqcFN0cisrKTsKKworICByZXR1cm4gQnl0ZVN0cmluZyhlbmNvZGVyLkdldFJlc3VsdCgpKTsKK30KKworbmFtZXNwYWNlIHsKKworY29uc3QgZmxvYXQgZnJhY3Rpb25fc2NhbGVzW10gPSB7MC4xZiwgICAgICAgICAgMC4wMWYsICAgICAgICAgMC4wMDFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAxZiwgICAgICAgMC4wMDAwMWYsICAgICAgMC4wMDAwMDFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAxZiwgICAgMC4wMDAwMDAwMWYsICAgMC4wMDAwMDAwMDFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAwMDAxZiwgMC4wMDAwMDAwMDAwMWZ9OworCitmbG9hdCBGcmFjdGlvbmFsU2NhbGUoc2l6ZV90IHNjYWxlX2ZhY3RvciwgaW50IHZhbHVlKSB7CisgIHJldHVybiBmcmFjdGlvbl9zY2FsZXNbc2NhbGVfZmFjdG9yXSAqIHZhbHVlOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworYm9vbCBGWF9hdG9udW0oY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN0cmMsIHZvaWQqIHBEYXRhKSB7CisgIGlmIChzdHJjLkNvbnRhaW5zKCcuJykpIHsKKyAgICBmbG9hdCogcEZsb2F0ID0gc3RhdGljX2Nhc3Q8ZmxvYXQqPihwRGF0YSk7CisgICAgKnBGbG9hdCA9IEZYX2F0b2Yoc3RyYyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gTm90ZSwgbnVtYmVycyBpbiBQREYgYXJlIHR5cGljYWxseSBvZiB0aGUgZm9ybSAxMjMsIC0xMjMsIGV0Yy4gQnV0LAorICAvLyBmb3IgdGhpbmdzIGxpa2UgdGhlIFBlcm1pc3Npb25zIG9uIHRoZSBlbmNyeXB0aW9uIGhhc2ggdGhlIG51bWJlciBpcworICAvLyBhY3R1YWxseSBhbiB1bnNpZ25lZCB2YWx1ZS4gV2UgdXNlIGEgdWludDMyX3Qgc28gd2UgY2FuIGRlYWwgd2l0aCB0aGUKKyAgLy8gdW5zaWduZWQgYW5kIHRoZW4gY2hlY2sgZm9yIG92ZXJmbG93IGlmIHRoZSB1c2VyIGFjdHVhbGx5IHNpZ25lZCB0aGUgdmFsdWUuCisgIC8vIFRoZSBQZXJtaXNzaW9ucyBmbGFnIGlzIGxpc3RlZCBpbiBUYWJsZSAzLjIwIFBERiAxLjcgc3BlYy4KKyAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzx1aW50MzJfdD4gaW50ZWdlciA9IDA7CisgIGJvb2wgYk5lZ2F0aXZlID0gZmFsc2U7CisgIGJvb2wgYlNpZ25lZCA9IGZhbHNlOworICBzaXplX3QgY2MgPSAwOworICBpZiAoc3RyY1swXSA9PSAnKycpIHsKKyAgICBjYysrOworICAgIGJTaWduZWQgPSB0cnVlOworICB9IGVsc2UgaWYgKHN0cmNbMF0gPT0gJy0nKSB7CisgICAgYk5lZ2F0aXZlID0gdHJ1ZTsKKyAgICBiU2lnbmVkID0gdHJ1ZTsKKyAgICBjYysrOworICB9CisKKyAgd2hpbGUgKGNjIDwgc3RyYy5HZXRMZW5ndGgoKSAmJiBzdGQ6OmlzZGlnaXQoc3RyY1tjY10pKSB7CisgICAgaW50ZWdlciA9IGludGVnZXIgKiAxMCArIEZYU1lTX0RlY2ltYWxDaGFyVG9JbnQoc3RyYy5DaGFyQXQoY2MpKTsKKyAgICBpZiAoIWludGVnZXIuSXNWYWxpZCgpKQorICAgICAgYnJlYWs7CisgICAgY2MrKzsKKyAgfQorCisgIC8vIFdlIGhhdmUgYSBzaWduLCBhbmQgdGhlIHZhbHVlIHdhcyBncmVhdGVyIHRoZW4gYSByZWd1bGFyIGludGVnZXIKKyAgLy8gd2UndmUgb3ZlcmZsb3dlZCwgcmVzZXQgdG8gdGhlIGRlZmF1bHQgdmFsdWUuCisgIGlmIChiU2lnbmVkKSB7CisgICAgaWYgKGJOZWdhdGl2ZSkgeworICAgICAgaWYgKGludGVnZXIuVmFsdWVPckRlZmF1bHQoMCkgPgorICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpKSArIDEpIHsKKyAgICAgICAgaW50ZWdlciA9IDA7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChpbnRlZ2VyLlZhbHVlT3JEZWZhdWx0KDApID4KKyAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpKSkgeworICAgICAgaW50ZWdlciA9IDA7CisgICAgfQorICB9CisKKyAgLy8gU3dpdGNoIGJhY2sgdG8gdGhlIGludCBzcGFjZSBzbyB3ZSBjYW4gZmxpcCB0byBhIG5lZ2F0aXZlIGlmIHdlIG5lZWQuCisgIHVpbnQzMl90IHVWYWx1ZSA9IGludGVnZXIuVmFsdWVPckRlZmF1bHQoMCk7CisgIGludDMyX3QgdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQ+KHVWYWx1ZSk7CisgIGlmIChiTmVnYXRpdmUpCisgICAgdmFsdWUgPSAtdmFsdWU7CisKKyAgaW50KiBwSW50ID0gc3RhdGljX2Nhc3Q8aW50Kj4ocERhdGEpOworICAqcEludCA9IHZhbHVlOworICByZXR1cm4gdHJ1ZTsKK30KKworZmxvYXQgRlhfYXRvZihjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyYykgeworICBpZiAoc3RyYy5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIDAuMDsKKworICBpbnQgY2MgPSAwOworICBib29sIGJOZWdhdGl2ZSA9IGZhbHNlOworICBpbnQgbGVuID0gc3RyYy5HZXRMZW5ndGgoKTsKKyAgaWYgKHN0cmNbMF0gPT0gJysnKSB7CisgICAgY2MrKzsKKyAgfSBlbHNlIGlmIChzdHJjWzBdID09ICctJykgeworICAgIGJOZWdhdGl2ZSA9IHRydWU7CisgICAgY2MrKzsKKyAgfQorICB3aGlsZSAoY2MgPCBsZW4pIHsKKyAgICBpZiAoc3RyY1tjY10gIT0gJysnICYmIHN0cmNbY2NdICE9ICctJykKKyAgICAgIGJyZWFrOworICAgIGNjKys7CisgIH0KKyAgZmxvYXQgdmFsdWUgPSAwOworICB3aGlsZSAoY2MgPCBsZW4pIHsKKyAgICBpZiAoc3RyY1tjY10gPT0gJy4nKQorICAgICAgYnJlYWs7CisgICAgdmFsdWUgPSB2YWx1ZSAqIDEwICsgRlhTWVNfRGVjaW1hbENoYXJUb0ludChzdHJjLkNoYXJBdChjYykpOworICAgIGNjKys7CisgIH0KKyAgaW50IHNjYWxlID0gMDsKKyAgaWYgKGNjIDwgbGVuICYmIHN0cmNbY2NdID09ICcuJykgeworICAgIGNjKys7CisgICAgd2hpbGUgKGNjIDwgbGVuKSB7CisgICAgICB2YWx1ZSArPSBGcmFjdGlvbmFsU2NhbGUoc2NhbGUsIEZYU1lTX0RlY2ltYWxDaGFyVG9JbnQoc3RyYy5DaGFyQXQoY2MpKSk7CisgICAgICBzY2FsZSsrOworICAgICAgaWYgKHNjYWxlID09IEZYX0FycmF5U2l6ZShmcmFjdGlvbl9zY2FsZXMpKQorICAgICAgICBicmVhazsKKyAgICAgIGNjKys7CisgICAgfQorICB9CisgIHJldHVybiBiTmVnYXRpdmUgPyAtdmFsdWUgOiB2YWx1ZTsKK30KKworZmxvYXQgRlhfYXRvZihjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NTdHIpIHsKKyAgcmV0dXJuIEZYX2F0b2YoRlhfVVRGOEVuY29kZSh3c1N0cikuY19zdHIoKSk7Cit9CisKK3NpemVfdCBGWF9mdG9hKGZsb2F0IGQsIGNoYXIqIGJ1ZikgeworICBidWZbMF0gPSAnMCc7CisgIGJ1ZlsxXSA9ICdcMCc7CisgIGlmIChkID09IDAuMGYpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICBib29sIGJOZWdhdGl2ZSA9IGZhbHNlOworICBpZiAoZCA8IDApIHsKKyAgICBiTmVnYXRpdmUgPSB0cnVlOworICAgIGQgPSAtZDsKKyAgfQorICBpbnQgc2NhbGUgPSAxOworICBpbnQgc2NhbGVkID0gRlhTWVNfcm91bmQoZCk7CisgIHdoaWxlIChzY2FsZWQgPCAxMDAwMDApIHsKKyAgICBpZiAoc2NhbGUgPT0gMTAwMDAwMCkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHNjYWxlICo9IDEwOworICAgIHNjYWxlZCA9IEZYU1lTX3JvdW5kKGQgKiBzY2FsZSk7CisgIH0KKyAgaWYgKHNjYWxlZCA9PSAwKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgY2hhciBidWYyWzMyXTsKKyAgc2l6ZV90IGJ1Zl9zaXplID0gMDsKKyAgaWYgKGJOZWdhdGl2ZSkgeworICAgIGJ1ZltidWZfc2l6ZSsrXSA9ICctJzsKKyAgfQorICBpbnQgaSA9IHNjYWxlZCAvIHNjYWxlOworICBGWFNZU19pdG9hKGksIGJ1ZjIsIDEwKTsKKyAgc2l6ZV90IGxlbiA9IHN0cmxlbihidWYyKTsKKyAgbWVtY3B5KGJ1ZiArIGJ1Zl9zaXplLCBidWYyLCBsZW4pOworICBidWZfc2l6ZSArPSBsZW47CisgIGludCBmcmFjdGlvbiA9IHNjYWxlZCAlIHNjYWxlOworICBpZiAoZnJhY3Rpb24gPT0gMCkgeworICAgIHJldHVybiBidWZfc2l6ZTsKKyAgfQorICBidWZbYnVmX3NpemUrK10gPSAnLic7CisgIHNjYWxlIC89IDEwOworICB3aGlsZSAoZnJhY3Rpb24pIHsKKyAgICBidWZbYnVmX3NpemUrK10gPSAnMCcgKyBmcmFjdGlvbiAvIHNjYWxlOworICAgIGZyYWN0aW9uICU9IHNjYWxlOworICAgIHNjYWxlIC89IDEwOworICB9CisgIHJldHVybiBidWZfc2l6ZTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvZnhfc3RyaW5nLmggYi9jb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oCmluZGV4IGNkOTNmMjcuLjRjMjQxODEgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjcnQvZnhfc3RyaW5nLmgKKysrIGIvY29yZS9meGNydC9meF9zdHJpbmcuaApAQCAtNyw0NTMgKzcsMTcgQEAKICNpZm5kZWYgQ09SRV9GWENSVF9GWF9TVFJJTkdfSF8KICNkZWZpbmUgQ09SRV9GWENSVF9GWF9TVFJJTkdfSF8KIAotI2luY2x1ZGUgPHN0ZGludC5oPiAgLy8gRm9yIGludHB0cl90LgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGZ1bmN0aW9uYWw+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfc3RyaW5nX2NfdGVtcGxhdGUuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9zdHJpbmdfZGF0YV90ZW1wbGF0ZS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLQotY2xhc3MgQ0ZYX0J5dGVTdHJpbmc7Ci1jbGFzcyBDRlhfV2lkZVN0cmluZzsKLQotdXNpbmcgQ0ZYX0J5dGVTdHJpbmdDID0gQ0ZYX1N0cmluZ0NUZW1wbGF0ZTxGWF9DSEFSPjsKLXVzaW5nIENGWF9XaWRlU3RyaW5nQyA9IENGWF9TdHJpbmdDVGVtcGxhdGU8RlhfV0NIQVI+OworI2luY2x1ZGUgImNvcmUvZnhjcnQvYnl0ZXN0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvd2lkZXN0cmluZy5oIgogCiAjZGVmaW5lIEZYQlNUUl9JRChjMSwgYzIsIGMzLCBjNCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgKCgodWludDMyX3QpYzEgPDwgMjQpIHwgKCh1aW50MzJfdCljMiA8PCAxNikgfCAoKHVpbnQzMl90KWMzIDw8IDgpIHwgXAogICAgKCh1aW50MzJfdCljNCkpCiAKLS8vIEEgbXV0YWJsZSBzdHJpbmcgd2l0aCBzaGFyZWQgYnVmZmVycyB1c2luZyBjb3B5LW9uLXdyaXRlIHNlbWFudGljcyB0aGF0Ci0vLyBhdm9pZHMgdGhlIGNvc3Qgb2Ygc3RkOjpzdHJpbmcncyBpdGVyYXRvciBzdGFiaWxpdHkgZ3VhcmFudGVlcy4KLWNsYXNzIENGWF9CeXRlU3RyaW5nIHsKLSBwdWJsaWM6Ci0gIHVzaW5nIENoYXJUeXBlID0gRlhfQ0hBUjsKLQotICBDRlhfQnl0ZVN0cmluZygpOwotICBDRlhfQnl0ZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgb3RoZXIpOwotICBDRlhfQnl0ZVN0cmluZyhDRlhfQnl0ZVN0cmluZyYmIG90aGVyKTsKLQotICAvLyBEZWxpYmVyYXRlbHkgaW1wbGljaXQgdG8gYXZvaWQgY2FsbGluZyBvbiBldmVyeSBzdHJpbmcgbGl0ZXJhbC4KLSAgLy8gTk9MSU5UTkVYVExJTkUocnVudGltZS9leHBsaWNpdCkKLSAgQ0ZYX0J5dGVTdHJpbmcoY2hhciBjaCk7Ci0gIC8vIE5PTElOVE5FWFRMSU5FKHJ1bnRpbWUvZXhwbGljaXQpCi0gIENGWF9CeXRlU3RyaW5nKGNvbnN0IEZYX0NIQVIqIHB0cik7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcoY29uc3QgRlhfQ0hBUiogcHRyLCBGWF9TVFJTSVpFIGxlbik7Ci0gIENGWF9CeXRlU3RyaW5nKGNvbnN0IHVpbnQ4X3QqIHB0ciwgRlhfU1RSU0laRSBsZW4pOwotCi0gIGV4cGxpY2l0IENGWF9CeXRlU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnN0cmMpOwotICBDRlhfQnl0ZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzdHJjMSwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic3RyYzIpOwotCi0gIH5DRlhfQnl0ZVN0cmluZygpOwotCi0gIHZvaWQgY2xlYXIoKSB7IG1fcERhdGEuUmVzZXQoKTsgfQotCi0gIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBGcm9tVW5pY29kZShjb25zdCBGWF9XQ0hBUiogcHRyLCBGWF9TVFJTSVpFIGxlbiA9IC0xKTsKLSAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEZyb21Vbmljb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOwotCi0gIC8vIEV4cGxpY2l0IGNvbnZlcnNpb24gdG8gQy1zdHlsZSBzdHJpbmcuCi0gIC8vIE5vdGU6IEFueSBzdWJzZXF1ZW50IG1vZGlmaWNhdGlvbiBvZiB8dGhpc3wgd2lsbCBpbnZhbGlkYXRlIHRoZSByZXN1bHQuCi0gIGNvbnN0IEZYX0NIQVIqIGNfc3RyKCkgY29uc3QgeyByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fU3RyaW5nIDogIiI7IH0KLQotICAvLyBFeHBsaWNpdCBjb252ZXJzaW9uIHRvIHVpbnQ4X3QqLgotICAvLyBOb3RlOiBBbnkgc3Vic2VxdWVudCBtb2RpZmljYXRpb24gb2YgfHRoaXN8IHdpbGwgaW52YWxpZGF0ZSB0aGUgcmVzdWx0LgotICBjb25zdCB1aW50OF90KiByYXdfc3RyKCkgY29uc3QgewotICAgIHJldHVybiBtX3BEYXRhID8gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4obV9wRGF0YS0+bV9TdHJpbmcpCi0gICAgICAgICAgICAgICAgICAgOiBudWxscHRyOwotICB9Ci0KLSAgLy8gRXhwbGljaXQgY29udmVyc2lvbiB0byBDRlhfQnl0ZVN0cmluZ0MuCi0gIC8vIE5vdGU6IEFueSBzdWJzZXF1ZW50IG1vZGlmaWNhdGlvbiBvZiB8dGhpc3wgd2lsbCBpbnZhbGlkYXRlIHRoZSByZXN1bHQuCi0gIENGWF9CeXRlU3RyaW5nQyBBc1N0cmluZ0MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nQyhyYXdfc3RyKCksIEdldExlbmd0aCgpKTsKLSAgfQotCi0gIEZYX1NUUlNJWkUgR2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggOiAwOyB9Ci0gIGJvb2wgSXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICFHZXRMZW5ndGgoKTsgfQotCi0gIGludCBDb21wYXJlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSBjb25zdDsKLSAgYm9vbCBFcXVhbE5vQ2FzZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgY29uc3Q7Ci0KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNoYXIqIHB0cikgY29uc3Q7Ci0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgY29uc3Q7Ci0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDRlhfQnl0ZVN0cmluZyYgb3RoZXIpIGNvbnN0OwotCi0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBjaGFyKiBwdHIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gcHRyKTsgfQotICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gc3RyKTsgfQotICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG90aGVyKSBjb25zdCB7Ci0gICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOwotICB9Ci0KLSAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikgY29uc3Q7Ci0KLSAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG9wZXJhdG9yPShjb25zdCBGWF9DSEFSKiBzdHIpOwotICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgb3BlcmF0b3I9KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnN0cmMpOwotICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgb3BlcmF0b3I9KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmdTcmMpOwotCi0gIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBvcGVyYXRvcis9KEZYX0NIQVIgY2gpOwotICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgb3BlcmF0b3IrPShjb25zdCBGWF9DSEFSKiBzdHIpOwotICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgb3BlcmF0b3IrPShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKTsKLSAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG9wZXJhdG9yKz0oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic3RyYyk7Ci0KLSAgdWludDhfdCBHZXRBdChGWF9TVFJTSVpFIG5JbmRleCkgY29uc3QgewotICAgIHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9TdHJpbmdbbkluZGV4XSA6IDA7Ci0gIH0KLQotICB1aW50OF90IG9wZXJhdG9yW10oRlhfU1RSU0laRSBuSW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fU3RyaW5nW25JbmRleF0gOiAwOwotICB9Ci0KLSAgdm9pZCBTZXRBdChGWF9TVFJTSVpFIG5JbmRleCwgRlhfQ0hBUiBjaCk7Ci0gIEZYX1NUUlNJWkUgSW5zZXJ0KEZYX1NUUlNJWkUgaW5kZXgsIEZYX0NIQVIgY2gpOwotICBGWF9TVFJTSVpFIERlbGV0ZShGWF9TVFJTSVpFIGluZGV4LCBGWF9TVFJTSVpFIGNvdW50ID0gMSk7Ci0KLSAgdm9pZCBGb3JtYXQoY29uc3QgRlhfQ0hBUiogbHBzekZvcm1hdCwgLi4uKTsKLSAgdm9pZCBGb3JtYXRWKGNvbnN0IEZYX0NIQVIqIGxwc3pGb3JtYXQsIHZhX2xpc3QgYXJnTGlzdCk7Ci0KLSAgdm9pZCBSZXNlcnZlKEZYX1NUUlNJWkUgbGVuKTsKLSAgRlhfQ0hBUiogR2V0QnVmZmVyKEZYX1NUUlNJWkUgbGVuKTsKLSAgdm9pZCBSZWxlYXNlQnVmZmVyKEZYX1NUUlNJWkUgbGVuID0gLTEpOwotCi0gIENGWF9CeXRlU3RyaW5nIE1pZChGWF9TVFJTSVpFIGZpcnN0KSBjb25zdDsKLSAgQ0ZYX0J5dGVTdHJpbmcgTWlkKEZYX1NUUlNJWkUgZmlyc3QsIEZYX1NUUlNJWkUgY291bnQpIGNvbnN0OwotICBDRlhfQnl0ZVN0cmluZyBMZWZ0KEZYX1NUUlNJWkUgY291bnQpIGNvbnN0OwotICBDRlhfQnl0ZVN0cmluZyBSaWdodChGWF9TVFJTSVpFIGNvdW50KSBjb25zdDsKLQotICBGWF9TVFJTSVpFIEZpbmQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBscHN6U3ViLCBGWF9TVFJTSVpFIHN0YXJ0ID0gMCkgY29uc3Q7Ci0gIEZYX1NUUlNJWkUgRmluZChGWF9DSEFSIGNoLCBGWF9TVFJTSVpFIHN0YXJ0ID0gMCkgY29uc3Q7Ci0gIEZYX1NUUlNJWkUgUmV2ZXJzZUZpbmQoRlhfQ0hBUiBjaCkgY29uc3Q7Ci0KLSAgdm9pZCBNYWtlTG93ZXIoKTsKLSAgdm9pZCBNYWtlVXBwZXIoKTsKLQotICB2b2lkIFRyaW1SaWdodCgpOwotICB2b2lkIFRyaW1SaWdodChGWF9DSEFSIGNoVGFyZ2V0KTsKLSAgdm9pZCBUcmltUmlnaHQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBscHN6VGFyZ2V0cyk7Ci0KLSAgdm9pZCBUcmltTGVmdCgpOwotICB2b2lkIFRyaW1MZWZ0KEZYX0NIQVIgY2hUYXJnZXQpOwotICB2b2lkIFRyaW1MZWZ0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbHBzelRhcmdldHMpOwotCi0gIEZYX1NUUlNJWkUgUmVwbGFjZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGxwc3pPbGQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGxwc3pOZXcpOwotCi0gIEZYX1NUUlNJWkUgUmVtb3ZlKEZYX0NIQVIgY2gpOwotCi0gIENGWF9XaWRlU3RyaW5nIFVURjhEZWNvZGUoKSBjb25zdDsKLQotICB1aW50MzJfdCBHZXRJRChGWF9TVFJTSVpFIHN0YXJ0X3BvcyA9IDApIGNvbnN0OwotCi0jZGVmaW5lIEZYRk9STUFUX1NJR05FRCAxCi0jZGVmaW5lIEZYRk9STUFUX0hFWCAyCi0jZGVmaW5lIEZYRk9STUFUX0NBUElUQUwgNAotCi0gIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBGb3JtYXRJbnRlZ2VyKGludCBpLCB1aW50MzJfdCBmbGFncyA9IDApOwotICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgRm9ybWF0RmxvYXQoRlhfRkxPQVQgZiwgaW50IHByZWNpc2lvbiA9IDApOwotCi0gcHJvdGVjdGVkOgotICB1c2luZyBTdHJpbmdEYXRhID0gQ0ZYX1N0cmluZ0RhdGFUZW1wbGF0ZTxGWF9DSEFSPjsKLQotICB2b2lkIFJlYWxsb2NCZWZvcmVXcml0ZShGWF9TVFJTSVpFIG5OZXdMZW4pOwotICB2b2lkIEFsbG9jQmVmb3JlV3JpdGUoRlhfU1RSU0laRSBuTmV3TGVuKTsKLSAgdm9pZCBBbGxvY0NvcHkoQ0ZYX0J5dGVTdHJpbmcmIGRlc3QsCi0gICAgICAgICAgICAgICAgIEZYX1NUUlNJWkUgbkNvcHlMZW4sCi0gICAgICAgICAgICAgICAgIEZYX1NUUlNJWkUgbkNvcHlJbmRleCkgY29uc3Q7Ci0gIHZvaWQgQXNzaWduQ29weShjb25zdCBGWF9DSEFSKiBwU3JjRGF0YSwgRlhfU1RSU0laRSBuU3JjTGVuKTsKLSAgdm9pZCBDb25jYXQoY29uc3QgRlhfQ0hBUiogbHBzelNyY0RhdGEsIEZYX1NUUlNJWkUgblNyY0xlbik7Ci0KLSAgQ0ZYX1JldGFpblB0cjxTdHJpbmdEYXRhPiBtX3BEYXRhOwotCi0gIGZyaWVuZCBjbGFzcyBmeGNydF9CeXRlU3RyaW5nQ29uY2F0X1Rlc3Q7Ci0gIGZyaWVuZCBjbGFzcyBmeGNydF9CeXRlU3RyaW5nUG9vbF9UZXN0OwotfTsKLQotaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBjaGFyKiBsaHMsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiByaHMpIHsKLSAgcmV0dXJuIHJocyA9PSBsaHM7Ci19Ci1pbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbGhzLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgcmhzKSB7Ci0gIHJldHVybiByaHMgPT0gbGhzOwotfQotaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBjaGFyKiBsaHMsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiByaHMpIHsKLSAgcmV0dXJuIHJocyAhPSBsaHM7Ci19Ci1pbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbGhzLCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgcmhzKSB7Ci0gIHJldHVybiByaHMgIT0gbGhzOwotfQotCi1pbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIyKSB7Ci0gIHJldHVybiBDRlhfQnl0ZVN0cmluZyhzdHIxLCBzdHIyKTsKLX0KLWlubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvcisoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBzdHIyKSB7Ci0gIHJldHVybiBDRlhfQnl0ZVN0cmluZyhzdHIxLCBzdHIyKTsKLX0KLWlubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvcisoY29uc3QgRlhfQ0hBUiogc3RyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIyKSB7Ci0gIHJldHVybiBDRlhfQnl0ZVN0cmluZyhzdHIxLCBzdHIyKTsKLX0KLWlubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvcisoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIxLCBGWF9DSEFSIGNoKSB7Ci0gIHJldHVybiBDRlhfQnl0ZVN0cmluZyhzdHIxLCBDRlhfQnl0ZVN0cmluZ0MoY2gpKTsKLX0KLWlubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvcisoRlhfQ0hBUiBjaCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIyKSB7Ci0gIHJldHVybiBDRlhfQnl0ZVN0cmluZyhjaCwgc3RyMik7Ci19Ci1pbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyMikgewotICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoc3RyMS5Bc1N0cmluZ0MoKSwgc3RyMi5Bc1N0cmluZ0MoKSk7Ci19Ci1pbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIxLCBGWF9DSEFSIGNoKSB7Ci0gIHJldHVybiBDRlhfQnl0ZVN0cmluZyhzdHIxLkFzU3RyaW5nQygpLCBDRlhfQnl0ZVN0cmluZ0MoY2gpKTsKLX0KLWlubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvcisoRlhfQ0hBUiBjaCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cjIpIHsKLSAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKGNoLCBzdHIyLkFzU3RyaW5nQygpKTsKLX0KLWlubGluZSBDRlhfQnl0ZVN0cmluZyBvcGVyYXRvcisoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIHN0cjIpIHsKLSAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHN0cjEuQXNTdHJpbmdDKCksIHN0cjIpOwotfQotaW5saW5lIENGWF9CeXRlU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBGWF9DSEFSKiBzdHIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyMikgewotICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoc3RyMSwgc3RyMi5Bc1N0cmluZ0MoKSk7Ci19Ci1pbmxpbmUgQ0ZYX0J5dGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cjIpIHsKLSAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHN0cjEuQXNTdHJpbmdDKCksIHN0cjIpOwotfQotaW5saW5lIENGWF9CeXRlU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIyKSB7Ci0gIHJldHVybiBDRlhfQnl0ZVN0cmluZyhzdHIxLCBzdHIyLkFzU3RyaW5nQygpKTsKLX0KLQotLy8gQSBtdXRhYmxlIHN0cmluZyB3aXRoIHNoYXJlZCBidWZmZXJzIHVzaW5nIGNvcHktb24td3JpdGUgc2VtYW50aWNzIHRoYXQKLS8vIGF2b2lkcyB0aGUgY29zdCBvZiBzdGQ6OnN0cmluZydzIGl0ZXJhdG9yIHN0YWJpbGl0eSBndWFyYW50ZWVzLgotY2xhc3MgQ0ZYX1dpZGVTdHJpbmcgewotIHB1YmxpYzoKLSAgdXNpbmcgQ2hhclR5cGUgPSBGWF9XQ0hBUjsKLQotICBDRlhfV2lkZVN0cmluZygpOwotICBDRlhfV2lkZVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgb3RoZXIpOwotICBDRlhfV2lkZVN0cmluZyhDRlhfV2lkZVN0cmluZyYmIG90aGVyKTsKLQotICAvLyBEZWxpYmVyYXRlbHkgaW1wbGljaXQgdG8gYXZvaWQgY2FsbGluZyBvbiBldmVyeSBzdHJpbmcgbGl0ZXJhbC4KLSAgLy8gTk9MSU5UTkVYVExJTkUocnVudGltZS9leHBsaWNpdCkKLSAgQ0ZYX1dpZGVTdHJpbmcoRlhfV0NIQVIgY2gpOwotICAvLyBOT0xJTlRORVhUTElORShydW50aW1lL2V4cGxpY2l0KQotICBDRlhfV2lkZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcHRyKTsKLQotICBDRlhfV2lkZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcHRyLCBGWF9TVFJTSVpFIGxlbik7Ci0KLSAgZXhwbGljaXQgQ0ZYX1dpZGVTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIpOwotICBDRlhfV2lkZVN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cjEsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyMik7Ci0KLSAgfkNGWF9XaWRlU3RyaW5nKCk7Ci0KLSAgc3RhdGljIENGWF9XaWRlU3RyaW5nIEZyb21Mb2NhbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7Ci0gIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBGcm9tQ29kZVBhZ2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29kZXBhZ2UpOwotCi0gIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBGcm9tVVRGOChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7Ci0gIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBGcm9tVVRGMTZMRShjb25zdCB1bnNpZ25lZCBzaG9ydCogc3RyLCBGWF9TVFJTSVpFIGxlbik7Ci0KLSAgc3RhdGljIEZYX1NUUlNJWkUgV1N0cmluZ0xlbmd0aChjb25zdCB1bnNpZ25lZCBzaG9ydCogc3RyKTsKLQotICAvLyBFeHBsaWNpdCBjb252ZXJzaW9uIHRvIEMtc3R5bGUgd2lkZSBzdHJpbmcuCi0gIC8vIE5vdGU6IEFueSBzdWJzZXF1ZW50IG1vZGlmaWNhdGlvbiBvZiB8dGhpc3wgd2lsbCBpbnZhbGlkYXRlIHRoZSByZXN1bHQuCi0gIGNvbnN0IEZYX1dDSEFSKiBjX3N0cigpIGNvbnN0IHsgcmV0dXJuIG1fcERhdGEgPyBtX3BEYXRhLT5tX1N0cmluZyA6IEwiIjsgfQotCi0gIC8vIEV4cGxpY2l0IGNvbnZlcnNpb24gdG8gQ0ZYX1dpZGVTdHJpbmdDLgotICAvLyBOb3RlOiBBbnkgc3Vic2VxdWVudCBtb2RpZmljYXRpb24gb2YgfHRoaXN8IHdpbGwgaW52YWxpZGF0ZSB0aGUgcmVzdWx0LgotICBDRlhfV2lkZVN0cmluZ0MgQXNTdHJpbmdDKCkgY29uc3QgewotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZ0MoY19zdHIoKSwgR2V0TGVuZ3RoKCkpOwotICB9Ci0KLSAgdm9pZCBjbGVhcigpIHsgbV9wRGF0YS5SZXNldCgpOyB9Ci0KLSAgRlhfU1RSU0laRSBHZXRMZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA6IDA7IH0KLSAgYm9vbCBJc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gIUdldExlbmd0aCgpOyB9Ci0KLSAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG9wZXJhdG9yPShjb25zdCBGWF9XQ0hBUiogc3RyKTsKLSAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG9wZXJhdG9yPShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nU3JjKTsKLSAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG9wZXJhdG9yPShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cmluZ1NyYyk7Ci0KLSAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG9wZXJhdG9yKz0oY29uc3QgRlhfV0NIQVIqIHN0cik7Ci0gIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBvcGVyYXRvcis9KEZYX1dDSEFSIGNoKTsKLSAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG9wZXJhdG9yKz0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7Ci0gIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBvcGVyYXRvcis9KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKTsKLQotICBib29sIG9wZXJhdG9yPT0oY29uc3Qgd2NoYXJfdCogcHRyKSBjb25zdDsKLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKSBjb25zdDsKLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBvdGhlcikgY29uc3Q7Ci0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHdjaGFyX3QqIHB0cikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBwdHIpOyB9Ci0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBzdHIpOyB9Ci0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDRlhfV2lkZVN0cmluZyYgb3RoZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7Ci0gIH0KLQotICBib29sIG9wZXJhdG9yPChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKSBjb25zdDsKLQotICBGWF9XQ0hBUiBHZXRBdChGWF9TVFJTSVpFIG5JbmRleCkgY29uc3QgewotICAgIHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9TdHJpbmdbbkluZGV4XSA6IDA7Ci0gIH0KLQotICBGWF9XQ0hBUiBvcGVyYXRvcltdKEZYX1NUUlNJWkUgbkluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIG1fcERhdGEgPyBtX3BEYXRhLT5tX1N0cmluZ1tuSW5kZXhdIDogMDsKLSAgfQotCi0gIHZvaWQgU2V0QXQoRlhfU1RSU0laRSBuSW5kZXgsIEZYX1dDSEFSIGNoKTsKLQotICBpbnQgQ29tcGFyZShjb25zdCBGWF9XQ0hBUiogc3RyKSBjb25zdDsKLSAgaW50IENvbXBhcmUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikgY29uc3Q7Ci0gIGludCBDb21wYXJlTm9DYXNlKGNvbnN0IEZYX1dDSEFSKiBzdHIpIGNvbnN0OwotCi0gIENGWF9XaWRlU3RyaW5nIE1pZChGWF9TVFJTSVpFIGZpcnN0KSBjb25zdDsKLSAgQ0ZYX1dpZGVTdHJpbmcgTWlkKEZYX1NUUlNJWkUgZmlyc3QsIEZYX1NUUlNJWkUgY291bnQpIGNvbnN0OwotICBDRlhfV2lkZVN0cmluZyBMZWZ0KEZYX1NUUlNJWkUgY291bnQpIGNvbnN0OwotICBDRlhfV2lkZVN0cmluZyBSaWdodChGWF9TVFJTSVpFIGNvdW50KSBjb25zdDsKLQotICBGWF9TVFJTSVpFIEluc2VydChGWF9TVFJTSVpFIGluZGV4LCBGWF9XQ0hBUiBjaCk7Ci0gIEZYX1NUUlNJWkUgRGVsZXRlKEZYX1NUUlNJWkUgaW5kZXgsIEZYX1NUUlNJWkUgY291bnQgPSAxKTsKLQotICB2b2lkIEZvcm1hdChjb25zdCBGWF9XQ0hBUiogbHBzekZvcm1hdCwgLi4uKTsKLSAgdm9pZCBGb3JtYXRWKGNvbnN0IEZYX1dDSEFSKiBscHN6Rm9ybWF0LCB2YV9saXN0IGFyZ0xpc3QpOwotCi0gIHZvaWQgTWFrZUxvd2VyKCk7Ci0gIHZvaWQgTWFrZVVwcGVyKCk7Ci0KLSAgdm9pZCBUcmltUmlnaHQoKTsKLSAgdm9pZCBUcmltUmlnaHQoRlhfV0NIQVIgY2hUYXJnZXQpOwotICB2b2lkIFRyaW1SaWdodChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHBUYXJnZXRzKTsKLQotICB2b2lkIFRyaW1MZWZ0KCk7Ci0gIHZvaWQgVHJpbUxlZnQoRlhfV0NIQVIgY2hUYXJnZXQpOwotICB2b2lkIFRyaW1MZWZ0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcFRhcmdldHMpOwotCi0gIHZvaWQgUmVzZXJ2ZShGWF9TVFJTSVpFIGxlbik7Ci0gIEZYX1dDSEFSKiBHZXRCdWZmZXIoRlhfU1RSU0laRSBsZW4pOwotICB2b2lkIFJlbGVhc2VCdWZmZXIoRlhfU1RSU0laRSBsZW4gPSAtMSk7Ci0KLSAgaW50IEdldEludGVnZXIoKSBjb25zdDsKLSAgRlhfRkxPQVQgR2V0RmxvYXQoKSBjb25zdDsKLQotICBGWF9TVFJTSVpFIEZpbmQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwU3ViLCBGWF9TVFJTSVpFIHN0YXJ0ID0gMCkgY29uc3Q7Ci0gIEZYX1NUUlNJWkUgRmluZChGWF9XQ0hBUiBjaCwgRlhfU1RSU0laRSBzdGFydCA9IDApIGNvbnN0OwotICBGWF9TVFJTSVpFIFJlcGxhY2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwT2xkLCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHBOZXcpOwotICBGWF9TVFJTSVpFIFJlbW92ZShGWF9XQ0hBUiBjaCk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgVVRGOEVuY29kZSgpIGNvbnN0OwotICBDRlhfQnl0ZVN0cmluZyBVVEYxNkxFX0VuY29kZSgpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgotICB1c2luZyBTdHJpbmdEYXRhID0gQ0ZYX1N0cmluZ0RhdGFUZW1wbGF0ZTxGWF9XQ0hBUj47Ci0KLSAgdm9pZCBSZWFsbG9jQmVmb3JlV3JpdGUoRlhfU1RSU0laRSBuTGVuKTsKLSAgdm9pZCBBbGxvY0JlZm9yZVdyaXRlKEZYX1NUUlNJWkUgbkxlbik7Ci0gIHZvaWQgQWxsb2NDb3B5KENGWF9XaWRlU3RyaW5nJiBkZXN0LAotICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIG5Db3B5TGVuLAotICAgICAgICAgICAgICAgICBGWF9TVFJTSVpFIG5Db3B5SW5kZXgpIGNvbnN0OwotICB2b2lkIEFzc2lnbkNvcHkoY29uc3QgRlhfV0NIQVIqIHBTcmNEYXRhLCBGWF9TVFJTSVpFIG5TcmNMZW4pOwotICB2b2lkIENvbmNhdChjb25zdCBGWF9XQ0hBUiogbHBzelNyY0RhdGEsIEZYX1NUUlNJWkUgblNyY0xlbik7Ci0KLSAgQ0ZYX1JldGFpblB0cjxTdHJpbmdEYXRhPiBtX3BEYXRhOwotCi0gIGZyaWVuZCBjbGFzcyBmeGNydF9XaWRlU3RyaW5nQ29uY2F0SW5QbGFjZV9UZXN0OwotICBmcmllbmQgY2xhc3MgZnhjcnRfV2lkZVN0cmluZ1Bvb2xfVGVzdDsKLX07Ci0KLWlubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvcisoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cjIpIHsKLSAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKHN0cjEsIHN0cjIpOwotfQotaW5saW5lIENGWF9XaWRlU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBzdHIyKSB7Ci0gIHJldHVybiBDRlhfV2lkZVN0cmluZyhzdHIxLCBzdHIyKTsKLX0KLWlubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvcisoY29uc3QgRlhfV0NIQVIqIHN0cjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyMikgewotICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoc3RyMSwgc3RyMik7Ci19Ci1pbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyMSwgRlhfV0NIQVIgY2gpIHsKLSAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKHN0cjEsIENGWF9XaWRlU3RyaW5nQyhjaCkpOwotfQotaW5saW5lIENGWF9XaWRlU3RyaW5nIG9wZXJhdG9yKyhGWF9XQ0hBUiBjaCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIyKSB7Ci0gIHJldHVybiBDRlhfV2lkZVN0cmluZyhjaCwgc3RyMik7Ci19Ci1pbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyMikgewotICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoc3RyMS5Bc1N0cmluZ0MoKSwgc3RyMi5Bc1N0cmluZ0MoKSk7Ci19Ci1pbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIxLCBGWF9XQ0hBUiBjaCkgewotICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoc3RyMS5Bc1N0cmluZ0MoKSwgQ0ZYX1dpZGVTdHJpbmdDKGNoKSk7Ci19Ci1pbmxpbmUgQ0ZYX1dpZGVTdHJpbmcgb3BlcmF0b3IrKEZYX1dDSEFSIGNoLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyMikgewotICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoY2gsIHN0cjIuQXNTdHJpbmdDKCkpOwotfQotaW5saW5lIENGWF9XaWRlU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHN0cjIpIHsKLSAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKHN0cjEuQXNTdHJpbmdDKCksIHN0cjIpOwotfQotaW5saW5lIENGWF9XaWRlU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBGWF9XQ0hBUiogc3RyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cjIpIHsKLSAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKHN0cjEsIHN0cjIuQXNTdHJpbmdDKCkpOwotfQotaW5saW5lIENGWF9XaWRlU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIyKSB7Ci0gIHJldHVybiBDRlhfV2lkZVN0cmluZyhzdHIxLkFzU3RyaW5nQygpLCBzdHIyKTsKLX0KLWlubGluZSBDRlhfV2lkZVN0cmluZyBvcGVyYXRvcisoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyMikgewotICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoc3RyMSwgc3RyMi5Bc1N0cmluZ0MoKSk7Ci19Ci1pbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHdjaGFyX3QqIGxocywgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHJocykgewotICByZXR1cm4gcmhzID09IGxoczsKLX0KLWlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBsaHMsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiByaHMpIHsKLSAgcmV0dXJuIHJocyA9PSBsaHM7Ci19Ci1pbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHdjaGFyX3QqIGxocywgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHJocykgewotICByZXR1cm4gcmhzICE9IGxoczsKLX0KLWlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBsaHMsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiByaHMpIHsKLSAgcmV0dXJuIHJocyAhPSBsaHM7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIEZYX1VURjhFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1N0cik7Ci1GWF9GTE9BVCBGWF9hdG9mKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKTsKLWlubGluZSBGWF9GTE9BVCBGWF9hdG9mKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NTdHIpIHsKLSAgcmV0dXJuIEZYX2F0b2YoRlhfVVRGOEVuY29kZSh3c1N0cikuY19zdHIoKSk7Ci19Ci1ib29sIEZYX2F0b251bShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0ciwgdm9pZCogcERhdGEpOwotRlhfU1RSU0laRSBGWF9mdG9hKEZYX0ZMT0FUIGYsIEZYX0NIQVIqIGJ1Zik7Ci0KLXVpbnQzMl90IEZYX0hhc2hDb2RlX0dldEEoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIsIGJvb2wgYklnbm9yZUNhc2UpOwotdWludDMyX3QgRlhfSGFzaENvZGVfR2V0Vyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0ciwgYm9vbCBiSWdub3JlQ2FzZSk7Ci0KLW5hbWVzcGFjZSBzdGQgewotCi10ZW1wbGF0ZSA8Pgotc3RydWN0IGhhc2g8Q0ZYX0J5dGVTdHJpbmc+IHsKLSAgc3RkOjpzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKSBjb25zdCB7Ci0gICAgcmV0dXJuIEZYX0hhc2hDb2RlX0dldEEoc3RyLkFzU3RyaW5nQygpLCBmYWxzZSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDw+Ci1zdHJ1Y3QgaGFzaDxDRlhfV2lkZVN0cmluZz4gewotICBzdGQ6OnNpemVfdCBvcGVyYXRvcigpKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIGNvbnN0IHsKLSAgICByZXR1cm4gRlhfSGFzaENvZGVfR2V0VyhzdHIuQXNTdHJpbmdDKCksIGZhbHNlKTsKLSAgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHN0ZAotCi1leHRlcm4gdGVtcGxhdGUgc3RydWN0IHN0ZDo6aGFzaDxDRlhfQnl0ZVN0cmluZz47Ci1leHRlcm4gdGVtcGxhdGUgc3RydWN0IHN0ZDo6aGFzaDxDRlhfV2lkZVN0cmluZz47CitCeXRlU3RyaW5nIEZYX1VURjhFbmNvZGUoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzU3RyKTsKK2Zsb2F0IEZYX2F0b2YoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN0cik7CitmbG9hdCBGWF9hdG9mKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c1N0cik7Citib29sIEZYX2F0b251bShjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyLCB2b2lkKiBwRGF0YSk7CitzaXplX3QgRlhfZnRvYShmbG9hdCBmLCBjaGFyKiBidWYpOwogCiAjZW5kaWYgIC8vIENPUkVfRlhDUlRfRlhfU1RSSU5HX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Z4X3N0cmluZ191bml0dGVzdC5jcHAgYi9jb3JlL2Z4Y3J0L2Z4X3N0cmluZ191bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxMTE2NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvZnhfc3RyaW5nX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDUzIEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCitURVNUKGZ4c3RyaW5nLCBGWF9hdG9udW0pIHsKKyAgaW50IGk7CisgIEVYUEVDVF9UUlVFKEZYX2F0b251bSgiMTAiLCAmaSkpOworICBFWFBFQ1RfRVEoMTAsIGkpOworCisgIEVYUEVDVF9UUlVFKEZYX2F0b251bSgiLTEwIiwgJmkpKTsKKyAgRVhQRUNUX0VRKC0xMCwgaSk7CisKKyAgRVhQRUNUX1RSVUUoRlhfYXRvbnVtKCIrMTAiLCAmaSkpOworICBFWFBFQ1RfRVEoMTAsIGkpOworCisgIEVYUEVDVF9UUlVFKEZYX2F0b251bSgiLTIxNDc0ODM2NDgiLCAmaSkpOworICBFWFBFQ1RfRVEoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKSwgaSk7CisKKyAgRVhQRUNUX1RSVUUoRlhfYXRvbnVtKCIyMTQ3NDgzNjQ3IiwgJmkpKTsKKyAgRVhQRUNUX0VRKDIxNDc0ODM2NDcsIGkpOworCisgIC8vIFZhbHVlIG92ZXJmbG93cy4KKyAgRVhQRUNUX1RSVUUoRlhfYXRvbnVtKCItMjE0NzQ4MzY0OSIsICZpKSk7CisgIEVYUEVDVF9FUSgwLCBpKTsKKworICAvLyBWYWx1ZSBvdmVyZmxvd3MuCisgIEVYUEVDVF9UUlVFKEZYX2F0b251bSgiKzIxNDc0ODM2NDgiLCAmaSkpOworICBFWFBFQ1RfRVEoMCwgaSk7CisKKyAgLy8gVmFsdWUgb3ZlcmZsb3dzLgorICBFWFBFQ1RfVFJVRShGWF9hdG9udW0oIjQyMjM0MjM0OTQ5NjUyNTIiLCAmaSkpOworICBFWFBFQ1RfRVEoMCwgaSk7CisKKyAgLy8gTm8gZXhwbGljaXQgc2lnbiB3aWxsIGFsbG93IHRoZSBudW1iZXIgdG8gZ28gbmVnYXRpdmUuIFRoaXMgaXMgZm9yIHRoaW5ncworICAvLyBsaWtlIHRoZSBlbmNyeXB0aW9uIFBlcm1pc3Npb25zIGZsYWcgKFRhYmxlIDMuMjAgUERGIDEuNyBzcGVjKQorICBFWFBFQ1RfVFJVRShGWF9hdG9udW0oIjQyOTQ5NjUyNTIiLCAmaSkpOworICBFWFBFQ1RfRVEoLTIwNDQsIGkpOworCisgIEVYUEVDVF9UUlVFKEZYX2F0b251bSgiLTQyOTQ5NjUyNTIiLCAmaSkpOworICBFWFBFQ1RfRVEoMCwgaSk7CisKKyAgRVhQRUNUX1RSVUUoRlhfYXRvbnVtKCIrNDI5NDk2NTI1MiIsICZpKSk7CisgIEVYUEVDVF9FUSgwLCBpKTsKKworICBmbG9hdCBmOworICBFWFBFQ1RfRkFMU0UoRlhfYXRvbnVtKCIzLjI0IiwgJmYpKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDMuMjRmLCBmKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvZnhfc3lzdGVtLmNwcCBiL2NvcmUvZnhjcnQvZnhfc3lzdGVtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWNlZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9meF9zeXN0ZW0uY3BwCkBAIC0wLDAgKzEsMjQyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorCisjaW5jbHVkZSA8bGltaXRzPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9leHRlbnNpb24uaCIKKworbmFtZXNwYWNlIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEludFR5cGUsIHR5cGVuYW1lIENoYXJUeXBlPgorSW50VHlwZSBGWFNZU19TdHJUb0ludChjb25zdCBDaGFyVHlwZSogc3RyKSB7CisgIGlmICghc3RyKQorICAgIHJldHVybiAwOworCisgIC8vIFByb2Nlc3MgdGhlIHNpZ24uCisgIGJvb2wgbmVnID0gKnN0ciA9PSAnLSc7CisgIGlmIChuZWcgfHwgKnN0ciA9PSAnKycpCisgICAgc3RyKys7CisKKyAgSW50VHlwZSBudW0gPSAwOworICB3aGlsZSAoKnN0ciAmJiBGWFNZU19pc0RlY2ltYWxEaWdpdCgqc3RyKSkgeworICAgIEludFR5cGUgdmFsID0gRlhTWVNfRGVjaW1hbENoYXJUb0ludCgqc3RyKTsKKyAgICBpZiAobnVtID4gKHN0ZDo6bnVtZXJpY19saW1pdHM8SW50VHlwZT46Om1heCgpIC0gdmFsKSAvIDEwKSB7CisgICAgICBpZiAobmVnICYmIHN0ZDo6bnVtZXJpY19saW1pdHM8SW50VHlwZT46OmlzX3NpZ25lZCkgeworICAgICAgICAvLyBSZXR1cm4gTUlOIHdoZW4gdGhlIHJlcHJlc2VudGVkIG51bWJlciBpcyBzaWduZWQgdHlwZSBhbmQgaXMgc21hbGxlcgorICAgICAgICAvLyB0aGFuIHRoZSBtaW4gdmFsdWUuCisgICAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPEludFR5cGU+OjptaW4oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFJldHVybiBNQVggd2hlbiB0aGUgcmVwcmVzZW50ZWQgbnVtYmVyIGlzIHNpZ25lZCB0eXBlIGFuZCBpcyBsYXJnZXIKKyAgICAgICAgLy8gdGhhbiB0aGUgbWF4IHZhbHVlLCBvciB0aGUgbnVtYmVyIGlzIHVuc2lnbmVkIHR5cGUgYW5kIG91dCBvZiByYW5nZS4KKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8SW50VHlwZT46Om1heCgpOworICAgICAgfQorICAgIH0KKworICAgIG51bSA9IG51bSAqIDEwICsgdmFsOworICAgIHN0cisrOworICB9CisgIC8vIFdoZW4gaXQgaXMgYSBuZWdhdGl2ZSB2YWx1ZSwgLW51bSBzaG91bGQgYmUgcmV0dXJuZWQuIFNpbmNlIG51bSBtYXkgYmUgb2YKKyAgLy8gdW5zaWduZWQgdHlwZSwgdXNlIH5udW0gKyAxIHRvIGF2b2lkIHRoZSB3YXJuaW5nIG9mIGFwcGx5aW5nIHVuYXJ5IG1pbnVzCisgIC8vIG9wZXJhdG9yIHRvIHVuc2lnbmVkIHR5cGUuCisgIHJldHVybiBuZWcgPyB+bnVtICsgMSA6IG51bTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFVULCB0eXBlbmFtZSBTVFJfVD4KK1NUUl9UIEZYU1lTX0ludFRvU3RyKFQgdmFsdWUsIFNUUl9UIHN0ciwgaW50IHJhZGl4KSB7CisgIGlmIChyYWRpeCA8IDIgfHwgcmFkaXggPiAxNikgeworICAgIHN0clswXSA9IDA7CisgICAgcmV0dXJuIHN0cjsKKyAgfQorICBpZiAodmFsdWUgPT0gMCkgeworICAgIHN0clswXSA9ICcwJzsKKyAgICBzdHJbMV0gPSAwOworICAgIHJldHVybiBzdHI7CisgIH0KKyAgaW50IGkgPSAwOworICBVVCB1dmFsdWU7CisgIGlmICh2YWx1ZSA8IDApIHsKKyAgICBzdHJbaSsrXSA9ICctJzsKKyAgICAvLyBTdGFuZGFyZCB0cmljayB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3VyIHdoZW4gbmVnYXRpbmcgSU5UX01JTi4KKyAgICB1dmFsdWUgPSBzdGF0aWNfY2FzdDxVVD4oLSh2YWx1ZSArIDEpKSArIDE7CisgIH0gZWxzZSB7CisgICAgdXZhbHVlID0gdmFsdWU7CisgIH0KKyAgaW50IGRpZ2l0cyA9IDE7CisgIFQgb3JkZXIgPSB1dmFsdWUgLyByYWRpeDsKKyAgd2hpbGUgKG9yZGVyID4gMCkgeworICAgIGRpZ2l0cysrOworICAgIG9yZGVyID0gb3JkZXIgLyByYWRpeDsKKyAgfQorICBmb3IgKGludCBkID0gZGlnaXRzIC0gMTsgZCA+IC0xOyBkLS0pIHsKKyAgICBzdHJbZCArIGldID0gIjAxMjM0NTY3ODlhYmNkZWYiW3V2YWx1ZSAlIHJhZGl4XTsKKyAgICB1dmFsdWUgLz0gcmFkaXg7CisgIH0KKyAgc3RyW2RpZ2l0cyArIGldID0gMDsKKyAgcmV0dXJuIHN0cjsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2ludCBGWFNZU19yb3VuZChmbG9hdCBkKSB7CisgIGlmIChkIDwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCkpKQorICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpOworICBpZiAoZCA+IHN0YXRpY19jYXN0PGZsb2F0PihzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpKSkKKyAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4ocm91bmQoZCkpOworfQorCitpbnQzMl90IEZYU1lTX2F0b2koY29uc3QgY2hhciogc3RyKSB7CisgIHJldHVybiBGWFNZU19TdHJUb0ludDxpbnQzMl90LCBjaGFyPihzdHIpOworfQordWludDMyX3QgRlhTWVNfYXRvdWkoY29uc3QgY2hhciogc3RyKSB7CisgIHJldHVybiBGWFNZU19TdHJUb0ludDx1aW50MzJfdD4oc3RyKTsKK30KK2ludDMyX3QgRlhTWVNfd3RvaShjb25zdCB3Y2hhcl90KiBzdHIpIHsKKyAgcmV0dXJuIEZYU1lTX1N0clRvSW50PGludDMyX3QsIHdjaGFyX3Q+KHN0cik7Cit9CitpbnQ2NF90IEZYU1lTX2F0b2k2NChjb25zdCBjaGFyKiBzdHIpIHsKKyAgcmV0dXJuIEZYU1lTX1N0clRvSW50PGludDY0X3QsIGNoYXI+KHN0cik7Cit9Citjb25zdCBjaGFyKiBGWFNZU19pNjR0b2EoaW50NjRfdCB2YWx1ZSwgY2hhciogc3RyLCBpbnQgcmFkaXgpIHsKKyAgcmV0dXJuIEZYU1lTX0ludFRvU3RyPGludDY0X3QsIHVpbnQ2NF90LCBjaGFyKj4odmFsdWUsIHN0ciwgcmFkaXgpOworfQorCisjaWYgX0ZYX1BMQVRGT1JNXyAhPSBfRlhfUExBVEZPUk1fV0lORE9XU18KKworaW50IEZYU1lTX0dldEFDUCgpIHsKKyAgcmV0dXJuIDA7Cit9CisKK2NoYXIqIEZYU1lTX3N0cmx3cihjaGFyKiBzdHIpIHsKKyAgaWYgKCFzdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBjaGFyKiBzID0gc3RyOworICB3aGlsZSAoKnN0cikgeworICAgICpzdHIgPSBGWFNZU190b2xvd2VyKCpzdHIpOworICAgIHN0cisrOworICB9CisgIHJldHVybiBzOworfQorY2hhciogRlhTWVNfc3RydXByKGNoYXIqIHN0cikgeworICBpZiAoIXN0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGNoYXIqIHMgPSBzdHI7CisgIHdoaWxlICgqc3RyKSB7CisgICAgKnN0ciA9IEZYU1lTX3RvdXBwZXIoKnN0cik7CisgICAgc3RyKys7CisgIH0KKyAgcmV0dXJuIHM7Cit9Cit3Y2hhcl90KiBGWFNZU193Y3Nsd3Iod2NoYXJfdCogc3RyKSB7CisgIGlmICghc3RyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgd2NoYXJfdCogcyA9IHN0cjsKKyAgd2hpbGUgKCpzdHIpIHsKKyAgICAqc3RyID0gRlhTWVNfdG9sb3dlcigqc3RyKTsKKyAgICBzdHIrKzsKKyAgfQorICByZXR1cm4gczsKK30KK3djaGFyX3QqIEZYU1lTX3djc3Vwcih3Y2hhcl90KiBzdHIpIHsKKyAgaWYgKCFzdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICB3Y2hhcl90KiBzID0gc3RyOworICB3aGlsZSAoKnN0cikgeworICAgICpzdHIgPSBGWFNZU190b3VwcGVyKCpzdHIpOworICAgIHN0cisrOworICB9CisgIHJldHVybiBzOworfQorCitpbnQgRlhTWVNfc3RyaWNtcChjb25zdCBjaGFyKiBkc3QsIGNvbnN0IGNoYXIqIHNyYykgeworICBpbnQgZjsKKyAgaW50IGw7CisgIGRvIHsKKyAgICBmID0gRlhTWVNfdG91cHBlcigqZHN0KTsKKyAgICBsID0gRlhTWVNfdG91cHBlcigqc3JjKTsKKyAgICArK2RzdDsKKyAgICArK3NyYzsKKyAgfSB3aGlsZSAoZiAmJiBmID09IGwpOworICByZXR1cm4gZiAtIGw7Cit9CisKK2ludCBGWFNZU193Y3NpY21wKGNvbnN0IHdjaGFyX3QqIGRzdCwgY29uc3Qgd2NoYXJfdCogc3JjKSB7CisgIHdjaGFyX3QgZjsKKyAgd2NoYXJfdCBsOworICBkbyB7CisgICAgZiA9IEZYU1lTX3RvdXBwZXIoKmRzdCk7CisgICAgbCA9IEZYU1lTX3RvdXBwZXIoKnNyYyk7CisgICAgKytkc3Q7CisgICAgKytzcmM7CisgIH0gd2hpbGUgKGYgJiYgZiA9PSBsKTsKKyAgcmV0dXJuIGYgLSBsOworfQorCitjaGFyKiBGWFNZU19pdG9hKGludCB2YWx1ZSwgY2hhciogc3RyLCBpbnQgcmFkaXgpIHsKKyAgcmV0dXJuIEZYU1lTX0ludFRvU3RyPGludDMyX3QsIHVpbnQzMl90LCBjaGFyKj4odmFsdWUsIHN0ciwgcmFkaXgpOworfQorCitpbnQgRlhTWVNfV2lkZUNoYXJUb011bHRpQnl0ZSh1aW50MzJfdCBjb2RlcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiB3c3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVmYXVsdF9zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHBVc2VEZWZhdWx0KSB7CisgIGludCBsZW4gPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IHdsZW47IGkrKykgeworICAgIGlmICh3c3RyW2ldIDwgMHgxMDApIHsKKyAgICAgIGlmIChidWYgJiYgbGVuIDwgYnVmbGVuKQorICAgICAgICBidWZbbGVuXSA9IHN0YXRpY19jYXN0PGNoYXI+KHdzdHJbaV0pOworICAgICAgbGVuKys7CisgICAgfQorICB9CisgIHJldHVybiBsZW47Cit9CitpbnQgRlhTWVNfTXVsdGlCeXRlVG9XaWRlQ2hhcih1aW50MzJfdCBjb2RlcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBic3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90KiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmbGVuKSB7CisgIGludCB3bGVuID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBibGVuOyBpKyspIHsKKyAgICBpZiAoYnVmICYmIHdsZW4gPCBidWZsZW4pIHsKKyAgICAgIGJ1Zlt3bGVuXSA9IGJzdHJbaV07CisgICAgfQorICAgIHdsZW4rKzsKKyAgfQorICByZXR1cm4gd2xlbjsKK30KKworI2Vsc2UgIC8vIF9GWF9QTEFURk9STV8gIT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisKK3NpemVfdCBGWFNZU193Y3NmdGltZSh3Y2hhcl90KiBzdHJEZXN0LAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtYXhzaXplLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdG0qIHRpbWVwdHIpIHsKKyAgLy8gQXZvaWQgdHJpcHBpbmcgYW4gaW52YWxpZCBwYXJhbWV0ZXIgaGFuZGxlciBhbmQgY3Jhc2hpbmcgcHJvY2Vzcy4KKyAgLy8gTm90ZTogbGVhcCBzZWNvbmRzIG1heSBjYXVzZSB0bV9zZWMgPT0gNjAuCisgIGlmICh0aW1lcHRyLT50bV95ZWFyIDwgLTE5MDAgfHwgdGltZXB0ci0+dG1feWVhciA+IDgwOTkgfHwKKyAgICAgIHRpbWVwdHItPnRtX21vbiA8IDAgfHwgdGltZXB0ci0+dG1fbW9uID4gMTEgfHwgdGltZXB0ci0+dG1fbWRheSA8IDEgfHwKKyAgICAgIHRpbWVwdHItPnRtX21kYXkgPiAzMSB8fCB0aW1lcHRyLT50bV9ob3VyIDwgMCB8fCB0aW1lcHRyLT50bV9ob3VyID4gMjMgfHwKKyAgICAgIHRpbWVwdHItPnRtX21pbiA8IDAgfHwgdGltZXB0ci0+dG1fbWluID4gNTkgfHwgdGltZXB0ci0+dG1fc2VjIDwgMCB8fAorICAgICAgdGltZXB0ci0+dG1fc2VjID4gNjAgfHwgdGltZXB0ci0+dG1fd2RheSA8IDAgfHwgdGltZXB0ci0+dG1fd2RheSA+IDYgfHwKKyAgICAgIHRpbWVwdHItPnRtX3lkYXkgPCAwIHx8IHRpbWVwdHItPnRtX3lkYXkgPiAzNjUpIHsKKyAgICBzdHJEZXN0WzBdID0gTCdcMCc7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIHdjc2Z0aW1lKHN0ckRlc3QsIG1heHNpemUsIGZvcm1hdCwgdGltZXB0cik7Cit9CisKKyNlbmRpZiAgLy8gX0ZYX1BMQVRGT1JNXyAhPSBfRlhfUExBVEZPUk1fV0lORE9XU18KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvZnhfc3lzdGVtLmggYi9jb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oCmluZGV4IGMzMWJlZjkuLjhhZDIzYTEgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjcnQvZnhfc3lzdGVtLmgKKysrIGIvY29yZS9meGNydC9meF9zeXN0ZW0uaApAQCAtMTgsMzQgKzE4LDM4IEBACiAjaW5jbHVkZSA8d2NoYXIuaD4KIAogLy8gX0ZYX09TXyB2YWx1ZXM6Ci0jZGVmaW5lIF9GWF9XSU4zMl9ERVNLVE9QXyAxCi0jZGVmaW5lIF9GWF9XSU42NF9ERVNLVE9QXyAyCi0jZGVmaW5lIF9GWF9MSU5VWF9ERVNLVE9QXyA0Ci0jZGVmaW5lIF9GWF9NQUNPU1hfIDcKLSNkZWZpbmUgX0ZYX0FORFJPSURfIDEyCisjZGVmaW5lIF9GWF9PU19XSU4zMl8gMQorI2RlZmluZSBfRlhfT1NfV0lONjRfIDIKKyNkZWZpbmUgX0ZYX09TX0xJTlVYXyA0CisjZGVmaW5lIF9GWF9PU19NQUNPU1hfIDcKKyNkZWZpbmUgX0ZYX09TX0FORFJPSURfIDEyCisjZGVmaW5lIF9GWF9PU19XQVNNXyAxMwogCi0vLyBfRlhNX1BMQVRGT1JNXyB2YWx1ZXM7Ci0jZGVmaW5lIF9GWE1fUExBVEZPUk1fV0lORE9XU18gMSAgLy8gX0ZYX1dJTjMyX0RFU0tUT1BfIG9yIF9GWF9XSU42NF9ERVNLVE9QXy4KLSNkZWZpbmUgX0ZYTV9QTEFURk9STV9MSU5VWF8gMiAgICAvLyBfRlhfTElOVVhfREVTS1RPUF8gYWx3YXlzLgotI2RlZmluZSBfRlhNX1BMQVRGT1JNX0FQUExFXyAzICAgIC8vIF9GWF9NQUNPU1hfIGFsd2F5cy4KLSNkZWZpbmUgX0ZYTV9QTEFURk9STV9BTkRST0lEXyA0ICAvLyBfRlhfQU5EUk9JRF8gYWx3YXlzLgorLy8gX0ZYX1BMQVRGT1JNXyB2YWx1ZXM7CisjZGVmaW5lIF9GWF9QTEFURk9STV9XSU5ET1dTXyAxICAvLyBfRlhfT1NfV0lOMzJfIG9yIF9GWF9PU19XSU42NF8uCisjZGVmaW5lIF9GWF9QTEFURk9STV9MSU5VWF8gMiAgICAvLyBfRlhfT1NfTElOVVhfIG9yIF9GWF9PU19XQVNNXy4KKyNkZWZpbmUgX0ZYX1BMQVRGT1JNX0FQUExFXyAzICAgIC8vIF9GWF9PU19NQUNPU1hfIGFsd2F5cy4KKyNkZWZpbmUgX0ZYX1BMQVRGT1JNX0FORFJPSURfIDQgIC8vIF9GWF9PU19BTkRST0lEXyBhbHdheXMuCiAKICNpZm5kZWYgX0ZYX09TXwogI2lmIGRlZmluZWQoX19BTkRST0lEX18pCi0jZGVmaW5lIF9GWF9PU18gX0ZYX0FORFJPSURfCi0jZGVmaW5lIF9GWE1fUExBVEZPUk1fIF9GWE1fUExBVEZPUk1fQU5EUk9JRF8KKyNkZWZpbmUgX0ZYX09TXyBfRlhfT1NfQU5EUk9JRF8KKyNkZWZpbmUgX0ZYX1BMQVRGT1JNXyBfRlhfUExBVEZPUk1fQU5EUk9JRF8KICNlbGlmIGRlZmluZWQoX1dJTjMyKQotI2RlZmluZSBfRlhfT1NfIF9GWF9XSU4zMl9ERVNLVE9QXwotI2RlZmluZSBfRlhNX1BMQVRGT1JNXyBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisjZGVmaW5lIF9GWF9PU18gX0ZYX09TX1dJTjMyXworI2RlZmluZSBfRlhfUExBVEZPUk1fIF9GWF9QTEFURk9STV9XSU5ET1dTXwogI2VsaWYgZGVmaW5lZChfV0lONjQpCi0jZGVmaW5lIF9GWF9PU18gX0ZYX1dJTjY0X0RFU0tUT1BfCi0jZGVmaW5lIF9GWE1fUExBVEZPUk1fIF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNkZWZpbmUgX0ZYX09TXyBfRlhfT1NfV0lONjRfCisjZGVmaW5lIF9GWF9QTEFURk9STV8gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCiAjZWxpZiBkZWZpbmVkKF9fbGludXhfXykKLSNkZWZpbmUgX0ZYX09TXyBfRlhfTElOVVhfREVTS1RPUF8KLSNkZWZpbmUgX0ZYTV9QTEFURk9STV8gX0ZYTV9QTEFURk9STV9MSU5VWF8KKyNkZWZpbmUgX0ZYX09TXyBfRlhfT1NfTElOVVhfCisjZGVmaW5lIF9GWF9QTEFURk9STV8gX0ZYX1BMQVRGT1JNX0xJTlVYXwogI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCi0jZGVmaW5lIF9GWF9PU18gX0ZYX01BQ09TWF8KLSNkZWZpbmUgX0ZYTV9QTEFURk9STV8gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyNkZWZpbmUgX0ZYX09TXyBfRlhfT1NfTUFDT1NYXworI2RlZmluZSBfRlhfUExBVEZPUk1fIF9GWF9QTEFURk9STV9BUFBMRV8KKyNlbGlmIGRlZmluZWQoX19hc21qc19fKSB8fCBkZWZpbmVkKF9fd2FzbV9fKQorI2RlZmluZSBfRlhfT1NfIF9GWF9PU19XQVNNXworI2RlZmluZSBfRlhfUExBVEZPUk1fIF9GWF9QTEFURk9STV9MSU5VWF8KICNlbmRpZgogI2VuZGlmICAvLyBfRlhfT1NfCiAKQEAgLTUzLDE1NSArNTcsMTEyIEBACiAjZXJyb3IgU29ycnksIGNhbiBub3QgZmlndXJlIG91dCB0YXJnZXQgT1MuIFBsZWFzZSBzcGVjaWZ5IF9GWF9PU18gbWFjcm8uCiAjZW5kaWYKIAotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDE5MDAKKyNlcnJvciBTb3JyeSwgVkMrKyAyMDE1IG9yIGxhdGVyIGlzIHJlcXVpcmVkIHRvIGNvbXBpbGUgUERGaXVtLgorI2VuZGlmICAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDE5MDAKKworI2lmIF9GWF9PU18gPT0gX0ZYX09TX1dBU01fICYmIGRlZmluZWQoUERGX0VOQUJMRV9WOCkKKyNlcnJvciBDYW5ub3QgY29tcGlsZSB2OCB3aXRoIHdhc20uCisjZW5kaWYgIC8vIFBERl9FTkFCTEVfVjgKKworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCiAjaW5jbHVkZSA8d2luZG93cy5oPgogI2luY2x1ZGUgPHNhbC5oPgotI2VuZGlmCisjZW5kaWYgIC8vIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCiAKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXwogI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KICNpbmNsdWRlIDxsaWJrZXJuL09TQXRvbWljLmg+Ci0jZW5kaWYKKyNlbmRpZiAgLy8gX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYgIC8vIF9fY3BsdXNwbHVzCiAKLXR5cGVkZWYgdm9pZCogRlhfUE9TSVRJT047ICAvLyBLZWVwIHVudGlsIGZ4Y3J0IGNvbnRhaW5lcnMgZ29uZQotdHlwZWRlZiBmbG9hdCBGWF9GTE9BVDsgICAgIC8vIEtlZXAsIGFsbG93IHVwZ3JhZGUgdG8gZG91Ymxlcy4KLXR5cGVkZWYgZG91YmxlIEZYX0RPVUJMRTsgICAvLyBLZWVwLCBhbGxvdyBkb3duZ3JhZGUgdG8gZmxvYXRzLgotdHlwZWRlZiBjaGFyIEZYX0NIQVI7ICAgICAgIC8vIEtlZXAsIHF1ZXN0aW9uYWJsZSBzaWduZWRuZXNzLgotdHlwZWRlZiB3Y2hhcl90IEZYX1dDSEFSOyAgIC8vIEtlZXAsIG1heWJlIGJhZCBwbGF0Zm9ybSB3Y2hhcnMuCi0KICNkZWZpbmUgSXNGbG9hdFplcm8oZikgKChmKSA8IDAuMDAwMSAmJiAoZikgPiAtMC4wMDAxKQogI2RlZmluZSBJc0Zsb2F0QmlnZ2VyKGZhLCBmYikgKChmYSkgPiAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCiAjZGVmaW5lIElzRmxvYXRTbWFsbGVyKGZhLCBmYikgKChmYSkgPCAoZmIpICYmICFJc0Zsb2F0WmVybygoZmEpIC0gKGZiKSkpCiAjZGVmaW5lIElzRmxvYXRFcXVhbChmYSwgZmIpIElzRmxvYXRaZXJvKChmYSkgLSAoZmIpKQogCi0vLyBQREZpdW0gc3RyaW5nIHNpemVzIGFyZSBsaW1pdGVkIHRvIDJeMzEtMSwgYW5kIHRoZSB2YWx1ZSBpcyBzaWduZWQgdG8KLS8vIGFsbG93IC0xIGFzIGEgcGxhY2Vob2xkZXIgZm9yICJ1bmtub3duIi4KLS8vIFRPRE8ocGFsbWVyKTogaXQgc2hvdWxkIGJlIGEgfHNpemVfdHwsIG9yIGF0IGxlYXN0IHVuc2lnbmVkLgotdHlwZWRlZiBpbnQgRlhfU1RSU0laRTsKKy8vIFBERml1bSBmaWxlIHNpemVzIG1hdGNoIHRoZSBwbGF0Zm9ybSwgYnV0IFBERml1bSBpdHNlbGYgZG9lcyBub3Qgc3VwcG9ydAorLy8gZmlsZXMgbGFyZ2VyIHRoYW4gMkdCIGV2ZW4gaWYgdGhlIHBsYXRmb3JtIGRvZXMuIFRoZSB2YWx1ZSBtdXN0IGJlIHNpZ25lZAorLy8gdG8gc3VwcG9ydCAtMSBlcnJvciByZXR1cm5zLgorLy8gVE9ETyh0c2VwZXopOiBzdXBwb3J0IGxhcmdlciBmaWxlcy4KKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXworI2RlZmluZSBGWF9GSUxFU0laRSBpbnQzMl90CisjZWxzZSAgLy8gX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KKyNkZWZpbmUgRlhfRklMRVNJWkUgb2ZmX3QKKyNlbmRpZiAgLy8gX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KIAogI2lmbmRlZiBBU1NFUlQKICNpZm5kZWYgTkRFQlVHCiAjZGVmaW5lIEFTU0VSVCBhc3NlcnQKICNlbHNlCiAjZGVmaW5lIEFTU0VSVChhKQotI2VuZGlmCi0jZW5kaWYKKyNlbmRpZiAgLy8gTkRFQlVHCisjZW5kaWYgIC8vIEFTU0VSVAogCiAjaWYgZGVmaW5lZChfX2NsYW5nX18pIHx8IGRlZmluZWQoX19HTlVDX18pCiAjZGVmaW5lIFBERklVTV9JTU1FRElBVEVfQ1JBU0goKSBfX2J1aWx0aW5fdHJhcCgpCiAjZWxzZQogI2RlZmluZSBQREZJVU1fSU1NRURJQVRFX0NSQVNIKCkgKCh2b2lkKSgqKHZvbGF0aWxlIGNoYXIqKTAgPSAwKSkKLSNlbmRpZgorI2VuZGlmICAvLyBkZWZpbmVkKF9fY2xhbmdfXykgfHwgZGVmaW5lZChfX0dOVUNfXykKIAogLy8gTV9QSSBub3QgdW5pdmVyc2FsbHkgcHJlc2VudCBvbiBhbGwgcGxhdGZvcm1zLgogI2RlZmluZSBGWF9QSSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0MzM4MzI3OTVmCiAjZGVmaW5lIEZYX0JFWklFUiAwLjU1MjI4NDc0OTgzMDhmCiAKIC8vIE5PVEU6IHByZXZlbnQgdXNlIG9mIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBzbnByaW50ZigpIHNpbmNlIHNvbWUgcGxhdGZvcm1zCi0vLyBoYXZlIGRpZmZlcmVudCByZXR1cm4gdmFsdWVzIChlLmcuIHdpbmRvd3MgX3ZzbnByaW50ZigpKSwgYW5kIHByb3ZpZGUKLS8vIHZlcnNpb25zIHRoYXQgYWx3YXlzIE5VTC10ZXJtaW5hdGUuCi0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXyAmJiBfTVNDX1ZFUiA8IDE5MDAKLXZvaWQgRlhTWVNfc25wcmludGYoY2hhciogc3RyLAotICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgX1ByaW50Zl9mb3JtYXRfc3RyaW5nXyBjb25zdCBjaGFyKiBmbXQsCi0gICAgICAgICAgICAgICAgICAgIC4uLik7Ci12b2lkIEZYU1lTX3ZzbnByaW50ZihjaGFyKiBzdHIsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyKiBmbXQsIHZhX2xpc3QgYXApOwotI2Vsc2UKKy8vIGhhdmUgZGlmZmVyZW50IHJldHVybiB2YWx1ZXMuCiAjZGVmaW5lIEZYU1lTX3NucHJpbnRmICh2b2lkKXNucHJpbnRmCiAjZGVmaW5lIEZYU1lTX3ZzbnByaW50ZiAodm9pZCl2c25wcmludGYKLSNlbmRpZgotCiAjZGVmaW5lIEZYU1lTX3NwcmludGYgRE9fTk9UX1VTRV9TUFJJTlRGX0RJRV9ESUVfRElFCiAjZGVmaW5lIEZYU1lTX3ZzcHJpbnRmIERPX05PVF9VU0VfVlNQUklOVEZfRElFX0RJRV9ESUUKLSNkZWZpbmUgRlhTWVNfc3RybmNtcCBzdHJuY21wCi0jZGVmaW5lIEZYU1lTX3N0cmNtcCBzdHJjbXAKLSNkZWZpbmUgRlhTWVNfc3RyY3B5IHN0cmNweQotI2RlZmluZSBGWFNZU19zdHJuY3B5IHN0cm5jcHkKLSNkZWZpbmUgRlhTWVNfc3Ryc3RyIHN0cnN0cgotI2RlZmluZSBGWFNZU19GSUxFIEZJTEUKLSNkZWZpbmUgRlhTWVNfZm9wZW4gZm9wZW4KLSNkZWZpbmUgRlhTWVNfZmNsb3NlIGZjbG9zZQotI2RlZmluZSBGWFNZU19TRUVLX0VORCBTRUVLX0VORAotI2RlZmluZSBGWFNZU19TRUVLX1NFVCBTRUVLX1NFVAotI2RlZmluZSBGWFNZU19mc2VlayBmc2VlawotI2RlZmluZSBGWFNZU19mdGVsbCBmdGVsbAotI2RlZmluZSBGWFNZU19mcmVhZCBmcmVhZAotI2RlZmluZSBGWFNZU19md3JpdGUgZndyaXRlCi0jZGVmaW5lIEZYU1lTX2ZwcmludGYgZnByaW50ZgotI2RlZmluZSBGWFNZU19mZmx1c2ggZmZsdXNoCi0KLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0jaWZkZWYgX05BVElWRV9XQ0hBUl9UX0RFRklORUQKLSNkZWZpbmUgRlhTWVNfd2ZvcGVuKGYsIG0pIF93Zm9wZW4oKGNvbnN0IHdjaGFyX3QqKShmKSwgKGNvbnN0IHdjaGFyX3QqKShtKSkKLSNlbHNlCi0jZGVmaW5lIEZYU1lTX3dmb3BlbiBfd2ZvcGVuCi0jZW5kaWYKLSNlbHNlCi1GWFNZU19GSUxFKiBGWFNZU193Zm9wZW4oY29uc3QgRlhfV0NIQVIqIGZpbGVuYW1lLCBjb25zdCBGWF9XQ0hBUiogbW9kZSk7Ci0jZW5kaWYgIC8vIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9ICAvLyBleHRlcm4gIkMiCiAKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfY29udmVyc2lvbnMuaCIKIAotI2RlZmluZSBGWFNZU19zdHJsZW4ocHRyKSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxGWF9TVFJTSVpFPihzdHJsZW4ocHRyKSkKLSNkZWZpbmUgRlhTWVNfd2NzbGVuKHB0cikgcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8RlhfU1RSU0laRT4od2NzbGVuKHB0cikpCi0KIC8vIE92ZXJsb2FkZWQgZnVuY3Rpb25zIGZvciBDKysgdGVtcGxhdGVzCi1pbmxpbmUgRlhfU1RSU0laRSBGWFNZU19sZW4oY29uc3QgRlhfQ0hBUiogcHRyKSB7Ci0gIHJldHVybiBGWFNZU19zdHJsZW4ocHRyKTsKK2lubGluZSBzaXplX3QgRlhTWVNfbGVuKGNvbnN0IGNoYXIqIHB0cikgeworICByZXR1cm4gc3RybGVuKHB0cik7CiB9CiAKLWlubGluZSBGWF9TVFJTSVpFIEZYU1lTX2xlbihjb25zdCBGWF9XQ0hBUiogcHRyKSB7Ci0gIHJldHVybiBGWFNZU193Y3NsZW4ocHRyKTsKK2lubGluZSBzaXplX3QgRlhTWVNfbGVuKGNvbnN0IHdjaGFyX3QqIHB0cikgeworICByZXR1cm4gd2NzbGVuKHB0cik7CiB9CiAKLWlubGluZSBpbnQgRlhTWVNfY21wKGNvbnN0IEZYX0NIQVIqIHB0cjEsIGNvbnN0IEZYX0NIQVIqIHB0cjIsIHNpemVfdCBsZW4pIHsKK2lubGluZSBpbnQgRlhTWVNfY21wKGNvbnN0IGNoYXIqIHB0cjEsIGNvbnN0IGNoYXIqIHB0cjIsIHNpemVfdCBsZW4pIHsKICAgcmV0dXJuIG1lbWNtcChwdHIxLCBwdHIyLCBsZW4pOwogfQogCi1pbmxpbmUgaW50IEZYU1lTX2NtcChjb25zdCBGWF9XQ0hBUiogcHRyMSwgY29uc3QgRlhfV0NIQVIqIHB0cjIsIHNpemVfdCBsZW4pIHsKK2lubGluZSBpbnQgRlhTWVNfY21wKGNvbnN0IHdjaGFyX3QqIHB0cjEsIGNvbnN0IHdjaGFyX3QqIHB0cjIsIHNpemVfdCBsZW4pIHsKICAgcmV0dXJuIHdtZW1jbXAocHRyMSwgcHRyMiwgbGVuKTsKIH0KIAotaW5saW5lIGNvbnN0IEZYX0NIQVIqIEZYU1lTX2Nocihjb25zdCBGWF9DSEFSKiBwdHIsIEZYX0NIQVIgY2gsIHNpemVfdCBsZW4pIHsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRlhfQ0hBUio+KG1lbWNocihwdHIsIGNoLCBsZW4pKTsKK2lubGluZSBjb25zdCBjaGFyKiBGWFNZU19jaHIoY29uc3QgY2hhciogcHRyLCBjaGFyIGNoLCBzaXplX3QgbGVuKSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihtZW1jaHIocHRyLCBjaCwgbGVuKSk7CiB9CiAKLWlubGluZSBjb25zdCBGWF9XQ0hBUiogRlhTWVNfY2hyKGNvbnN0IEZYX1dDSEFSKiBwdHIsIEZYX1dDSEFSIGNoLCBzaXplX3QgbGVuKSB7CitpbmxpbmUgY29uc3Qgd2NoYXJfdCogRlhTWVNfY2hyKGNvbnN0IHdjaGFyX3QqIHB0ciwgd2NoYXJfdCBjaCwgc2l6ZV90IGxlbikgewogICByZXR1cm4gd21lbWNocihwdHIsIGNoLCBsZW4pOwogfQogCiBleHRlcm4gIkMiIHsKLSNlbHNlCi0jZGVmaW5lIEZYU1lTX3N0cmxlbihwdHIpICgoRlhfU1RSU0laRSlzdHJsZW4ocHRyKSkKLSNkZWZpbmUgRlhTWVNfd2NzbGVuKHB0cikgKChGWF9TVFJTSVpFKXdjc2xlbihwdHIpKQotI2VuZGlmCisjZW5kaWYgIC8vIF9fY3BsdXNwbHVzCiAKLSNkZWZpbmUgRlhTWVNfd2NzY21wIHdjc2NtcAotI2RlZmluZSBGWFNZU193Y3NzdHIgd2Nzc3RyCi0jZGVmaW5lIEZYU1lTX3djc25jbXAgd2NzbmNtcAotI2RlZmluZSBGWFNZU192c3dwcmludGYgdnN3cHJpbnRmCi0jZGVmaW5lIEZYU1lTX21ic3Rvd2NzIG1ic3Rvd2NzCi0jZGVmaW5lIEZYU1lTX3djc3RvbWJzIHdjc3RvbWJzCi0jZGVmaW5lIEZYU1lTX21lbWNtcCBtZW1jbXAKLSNkZWZpbmUgRlhTWVNfbWVtY3B5IG1lbWNweQotI2RlZmluZSBGWFNZU19tZW1tb3ZlIG1lbW1vdmUKLSNkZWZpbmUgRlhTWVNfbWVtc2V0IG1lbXNldAotI2RlZmluZSBGWFNZU19xc29ydCBxc29ydAotI2RlZmluZSBGWFNZU19ic2VhcmNoIGJzZWFyY2gKLQotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXwogI2RlZmluZSBGWFNZU19HZXRBQ1AgR2V0QUNQCiAjZGVmaW5lIEZYU1lTX2l0b2EgX2l0b2EKICNkZWZpbmUgRlhTWVNfc3RybHdyIF9zdHJsd3IKICNkZWZpbmUgRlhTWVNfc3RydXByIF9zdHJ1cHIKICNkZWZpbmUgRlhTWVNfc3RyaWNtcCBfc3RyaWNtcAorI2RlZmluZSBGWFNZU19wb3coYSwgYikgKGZsb2F0KXBvd2YoYSwgYikKK3NpemVfdCBGWFNZU193Y3NmdGltZSh3Y2hhcl90KiBzdHJEZXN0LAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtYXhzaXplLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdG0qIHRpbWVwdHIpOwogI2lmZGVmIF9OQVRJVkVfV0NIQVJfVF9ERUZJTkVECiAjZGVmaW5lIEZYU1lTX3djc2ljbXAoc3RyMSwgc3RyMikgX3djc2ljbXAoKHdjaGFyX3QqKShzdHIxKSwgKHdjaGFyX3QqKShzdHIyKSkKICNkZWZpbmUgRlhTWVNfV2lkZUNoYXJUb011bHRpQnl0ZShwMSwgcDIsIHAzLCBwNCwgcDUsIHA2LCBwNywgcDgpIFwKQEAgLTIxMCwxNiArMTcxLDE2IEBACiAgIE11bHRpQnl0ZVRvV2lkZUNoYXIocDEsIHAyLCBwMywgcDQsICh3Y2hhcl90KikocDUpLCBwNikKICNkZWZpbmUgRlhTWVNfd2NzbHdyKHN0cikgX3djc2x3cigod2NoYXJfdCopKHN0cikpCiAjZGVmaW5lIEZYU1lTX3djc3VwcihzdHIpIF93Y3N1cHIoKHdjaGFyX3QqKShzdHIpKQotI2Vsc2UKKyNlbHNlICAvLyBfTkFUSVZFX1dDSEFSX1RfREVGSU5FRAogI2RlZmluZSBGWFNZU193Y3NpY21wIF93Y3NpY21wCiAjZGVmaW5lIEZYU1lTX1dpZGVDaGFyVG9NdWx0aUJ5dGUgV2lkZUNoYXJUb011bHRpQnl0ZQogI2RlZmluZSBGWFNZU19NdWx0aUJ5dGVUb1dpZGVDaGFyIE11bHRpQnl0ZVRvV2lkZUNoYXIKICNkZWZpbmUgRlhTWVNfd2NzbHdyIF93Y3Nsd3IKICNkZWZpbmUgRlhTWVNfd2NzdXByIF93Y3N1cHIKLSNlbmRpZgotI2RlZmluZSBGWFNZU19HZXRGdWxsUGF0aE5hbWUgR2V0RnVsbFBhdGhOYW1lCi0jZGVmaW5lIEZYU1lTX0dldE1vZHVsZUZpbGVOYW1lIEdldE1vZHVsZUZpbGVOYW1lCi0jZWxzZQorI2VuZGlmICAvLyBfTkFUSVZFX1dDSEFSX1RfREVGSU5FRAorCisjZWxzZSAgLy8gX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KKwogaW50IEZYU1lTX0dldEFDUCgpOwogY2hhciogRlhTWVNfaXRvYShpbnQgdmFsdWUsIGNoYXIqIHN0ciwgaW50IHJhZGl4KTsKIGludCBGWFNZU19XaWRlQ2hhclRvTXVsdGlCeXRlKHVpbnQzMl90IGNvZGVwYWdlLApAQCAtMjM2LDY0ICsxOTcsNDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCogYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zmxlbik7Ci11aW50MzJfdCBGWFNZU19HZXRGdWxsUGF0aE5hbWUoY29uc3QgY2hhciogZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYnVmbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiogZmlsZXBhcnQpOwotdWludDMyX3QgRlhTWVNfR2V0TW9kdWxlRmlsZU5hbWUodm9pZCogaE1vZHVsZSwgY2hhciogYnVmLCB1aW50MzJfdCBidWZzaXplKTsKIGNoYXIqIEZYU1lTX3N0cmx3cihjaGFyKiBzdHIpOwogY2hhciogRlhTWVNfc3RydXByKGNoYXIqIHN0cik7CiBpbnQgRlhTWVNfc3RyaWNtcChjb25zdCBjaGFyKiwgY29uc3QgY2hhciopOwogaW50IEZYU1lTX3djc2ljbXAoY29uc3Qgd2NoYXJfdCogc3RyMSwgY29uc3Qgd2NoYXJfdCogc3RyMik7CiB3Y2hhcl90KiBGWFNZU193Y3Nsd3Iod2NoYXJfdCogc3RyKTsKIHdjaGFyX3QqIEZYU1lTX3djc3Vwcih3Y2hhcl90KiBzdHIpOwotI2VuZGlmICAvLyBfRlhNX1BMQVRGT1JNID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNkZWZpbmUgRlhTWVNfcG93KGEsIGIpIChmbG9hdClwb3coYSwgYikKKyNkZWZpbmUgRlhTWVNfd2NzZnRpbWUgd2NzZnRpbWUKKyNlbmRpZiAgLy8gX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KIAotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSNkZWZpbmUgRlhTWVNfcG93KGEsIGIpIChGWF9GTE9BVCkgcG93ZihhLCBiKQotI2Vsc2UKLSNkZWZpbmUgRlhTWVNfcG93KGEsIGIpIChGWF9GTE9BVCkgcG93KGEsIGIpCi0jZW5kaWYKLSNkZWZpbmUgRlhTWVNfc3FydChhKSAoRlhfRkxPQVQpIHNxcnQoYSkKLSNkZWZpbmUgRlhTWVNfZmFicyhhKSAoRlhfRkxPQVQpIGZhYnMoYSkKLSNkZWZpbmUgRlhTWVNfYXRhbjIoYSwgYikgKEZYX0ZMT0FUKSBhdGFuMihhLCBiKQotI2RlZmluZSBGWFNZU19jZWlsKGEpIChGWF9GTE9BVCkgY2VpbChhKQotI2RlZmluZSBGWFNZU19mbG9vcihhKSAoRlhfRkxPQVQpIGZsb29yKGEpCi0jZGVmaW5lIEZYU1lTX2NvcyhhKSAoRlhfRkxPQVQpIGNvcyhhKQotI2RlZmluZSBGWFNZU19hY29zKGEpIChGWF9GTE9BVCkgYWNvcyhhKQotI2RlZmluZSBGWFNZU19zaW4oYSkgKEZYX0ZMT0FUKSBzaW4oYSkKLSNkZWZpbmUgRlhTWVNfbG9nKGEpIChGWF9GTE9BVCkgbG9nKGEpCi0jZGVmaW5lIEZYU1lTX2xvZzEwKGEpIChGWF9GTE9BVCkgbG9nMTAoYSkKLSNkZWZpbmUgRlhTWVNfZm1vZChhLCBiKSAoRlhfRkxPQVQpIGZtb2QoYSwgYikKLSNkZWZpbmUgRlhTWVNfYWJzIGFicworI2RlZmluZSBGWFdPUkRfR0VUX0xTQkZJUlNUKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChzdGF0aWNfY2FzdDx1aW50MTZfdD4oKHN0YXRpY19jYXN0PHVpbnQxNl90PihwWzFdKSA8PCA4KSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHBbMF0pKSkpCisjZGVmaW5lIEZYV09SRF9HRVRfTVNCRklSU1QocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHN0YXRpY19jYXN0PHVpbnQxNl90Pigoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHBbMF0pIDw8IDgpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MTZfdD4ocFsxXSkpKSkKICNkZWZpbmUgRlhEV09SRF9HRVRfTFNCRklSU1QocCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICgoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBbM10pIDw8IDI0KSB8IChzdGF0aWNfY2FzdDx1aW50MzJfdD4ocFsyXSkgPDwgMTYpIHwgXAogICAgKHN0YXRpY19jYXN0PHVpbnQzMl90PihwWzFdKSA8PCA4KSB8IChzdGF0aWNfY2FzdDx1aW50MzJfdD4ocFswXSkpKQogI2RlZmluZSBGWERXT1JEX0dFVF9NU0JGSVJTVChwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgKChzdGF0aWNfY2FzdDx1aW50MzJfdD4ocFswXSkgPDwgMjQpIHwgKHN0YXRpY19jYXN0PHVpbnQzMl90PihwWzFdKSA8PCAxNikgfCBcCiAgICAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBbMl0pIDw8IDgpIHwgKHN0YXRpY19jYXN0PHVpbnQzMl90PihwWzNdKSkpCi0jZGVmaW5lIEZYU1lTX0hJQllURSh3b3JkKSAoKHVpbnQ4X3QpKCh3b3JkKSA+PiA4KSkKLSNkZWZpbmUgRlhTWVNfTE9CWVRFKHdvcmQpICgodWludDhfdCkod29yZCkpCi0jZGVmaW5lIEZYU1lTX0hJV09SRChkd29yZCkgKCh1aW50MTZfdCkoKGR3b3JkKSA+PiAxNikpCi0jZGVmaW5lIEZYU1lTX0xPV09SRChkd29yZCkgKCh1aW50MTZfdCkoZHdvcmQpKQotaW50MzJfdCBGWFNZU19hdG9pKGNvbnN0IEZYX0NIQVIqIHN0cik7Ci11aW50MzJfdCBGWFNZU19hdG91aShjb25zdCBGWF9DSEFSKiBzdHIpOwotaW50MzJfdCBGWFNZU193dG9pKGNvbnN0IEZYX1dDSEFSKiBzdHIpOwotaW50NjRfdCBGWFNZU19hdG9pNjQoY29uc3QgRlhfQ0hBUiogc3RyKTsKLWludDY0X3QgRlhTWVNfd3RvaTY0KGNvbnN0IEZYX1dDSEFSKiBzdHIpOwotY29uc3QgRlhfQ0hBUiogRlhTWVNfaTY0dG9hKGludDY0X3QgdmFsdWUsIEZYX0NIQVIqIHN0ciwgaW50IHJhZGl4KTsKLWludCBGWFNZU19yb3VuZChGWF9GTE9BVCBmKTsKLSNkZWZpbmUgRlhTWVNfc3FydDIoYSwgYikgKEZYX0ZMT0FUKSBGWFNZU19zcXJ0KChhKSAqIChhKSArIChiKSAqIChiKSkKK2ludDMyX3QgRlhTWVNfYXRvaShjb25zdCBjaGFyKiBzdHIpOwordWludDMyX3QgRlhTWVNfYXRvdWkoY29uc3QgY2hhciogc3RyKTsKK2ludDMyX3QgRlhTWVNfd3RvaShjb25zdCB3Y2hhcl90KiBzdHIpOworaW50NjRfdCBGWFNZU19hdG9pNjQoY29uc3QgY2hhciogc3RyKTsKK2NvbnN0IGNoYXIqIEZYU1lTX2k2NHRvYShpbnQ2NF90IHZhbHVlLCBjaGFyKiBzdHIsIGludCByYWRpeCk7CitpbnQgRlhTWVNfcm91bmQoZmxvYXQgZik7CisjZGVmaW5lIEZYU1lTX3NxcnQyKGEsIGIpIChmbG9hdClzcXJ0KChhKSAqIChhKSArIChiKSAqIChiKSkKICNpZmRlZiBfX2NwbHVzcGx1cwotfTsKLSNlbmRpZgorfSAgLy8gZXh0ZXJuIEMKKyNlbmRpZiAgLy8gX19jcGx1c3BsdXMKIAogLy8gVG8gcHJpbnQgYSBzaXplX3QgdmFsdWUgaW4gYSBwb3J0YWJsZSB3YXk6CiAvLyAgIHNpemVfdCBzaXplOwogLy8gICBwcmludGYoInh5ejogJSIgUFJJdVMsIHNpemUpOwogLy8gVGhlICJ1IiBpbiB0aGUgbWFjcm8gY29ycmVzcG9uZHMgdG8gJXUsIGFuZCBTIGlzIGZvciAic2l6ZSIuCi0KLSNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisjaWYgX0ZYX1BMQVRGT1JNXyAhPSBfRlhfUExBVEZPUk1fV0lORE9XU18KIAogI2lmIChkZWZpbmVkKF9JTlRUWVBFU19IKSB8fCBkZWZpbmVkKF9JTlRUWVBFU19IXykpICYmICFkZWZpbmVkKFBSSWQ2NCkKICNlcnJvciAiaW50dHlwZXMuaCBoYXMgYWxyZWFkeSBiZWVuIGluY2x1ZGVkIGJlZm9yZSB0aGlzIGhlYWRlciBmaWxlLCBidXQgIgpAQCAtMzEwLDIwICsyNTEsMjAgQEAKICNkZWZpbmUgUFJJdVMgInp1IgogI2VuZGlmCiAKLSNlbHNlICAvLyBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisjZWxzZSAgLy8gX0ZYX1BMQVRGT1JNXyAhPSBfRlhfUExBVEZPUk1fV0lORE9XU18KIAogI2lmICFkZWZpbmVkKFBSSXVTKQogI2RlZmluZSBQUkl1UyAiSXUiCiAjZW5kaWYKIAotI2VuZGlmICAvLyBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisjZW5kaWYgIC8vIF9GWF9QTEFURk9STV8gIT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCiAKIC8vIFByZXZlbnQgYSBmdW5jdGlvbiBmcm9tIGV2ZXIgYmVpbmcgaW5saW5lZCwgdHlwaWNhbGx5IGJlY2F1c2Ugd2UnZAogLy8gbGlrZSBpdCB0byBhcHBlYXIgaW4gc3RhY2sgdHJhY2VzLgotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXwogI2RlZmluZSBORVZFUl9JTkxJTkUgX19kZWNsc3BlYyhub2lubGluZSkKLSNlbHNlICAvLyBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisjZWxzZSAgLy8gX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KICNkZWZpbmUgTkVWRVJfSU5MSU5FIF9fYXR0cmlidXRlX18oKF9fbm9pbmxpbmVfXykpCi0jZW5kaWYgIC8vIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNlbmRpZiAgLy8gX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KIAogI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0ZYX1NZU1RFTV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF9zeXN0ZW1fdW5pdHRlc3QuY3BwIGIvY29yZS9meGNydC9meF9zeXN0ZW1fdW5pdHRlc3QuY3BwCmluZGV4IDRhYjM3YzcuLjczZjljNzUgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjcnQvZnhfc3lzdGVtX3VuaXR0ZXN0LmNwcAorKysgYi9jb3JlL2Z4Y3J0L2Z4X3N5c3RlbV91bml0dGVzdC5jcHAKQEAgLTMsOTEgKzMsOTAgQEAKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKICNpbmNsdWRlIDxsaW1pdHM+Ci0jaW5jbHVkZSA8c3RyaW5nPgogCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotI2luY2x1ZGUgInRlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAKIC8vIFVuaXQgdGVzdCBjb3ZlcmluZyBjYXNlcyB3aGVyZSBQREZpdW0gcmVwbGFjZXMgd2VsbC1rbm93biBsaWJyYXJ5CiAvLyBmdW5jdGlvbmFsaXR5IG9uIGFueSBnaXZlbiBwbGF0Zm9ybW4uCiAKLSNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisjaWYgX0ZYX1BMQVRGT1JNXyAhPSBfRlhfUExBVEZPUk1fV0lORE9XU18KIAogbmFtZXNwYWNlIHsKIAotY29uc3QgRlhfQ0hBUiBrU2VudGluZWwgPSAweDdmOworY29uc3QgY2hhciBrU2VudGluZWwgPSAweDdmOwogCiB2b2lkIENoZWNrMzJCaXRCYXNlMTZJdG9hKGludDMyX3QgaW5wdXQsIGNvbnN0IGNoYXIqIGV4cGVjdGVkX291dHB1dCkgewogICBjb25zdCBzaXplX3Qga0J1ZkxlbiA9IDExOyAgLy8gIi0iICsgOCBkaWdpdHMgKyBOVUwgKyBzZW50aW5lbC4KLSAgRlhfQ0hBUiBidWZba0J1Zkxlbl07CisgIGNoYXIgYnVmW2tCdWZMZW5dOwogICBidWZba0J1ZkxlbiAtIDFdID0ga1NlbnRpbmVsOwogICBGWFNZU19pdG9hKGlucHV0LCBidWYsIDE2KTsKLSAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKGV4cGVjdGVkX291dHB1dCksIGJ1Zik7CisgIEVYUEVDVF9TVFJFUShleHBlY3RlZF9vdXRwdXQsIGJ1Zik7CiAgIEVYUEVDVF9FUShrU2VudGluZWwsIGJ1ZltrQnVmTGVuIC0gMV0pOwogfQogCiB2b2lkIENoZWNrMzJCaXRCYXNlMTBJdG9hKGludDMyX3QgaW5wdXQsIGNvbnN0IGNoYXIqIGV4cGVjdGVkX291dHB1dCkgewogICBjb25zdCBzaXplX3Qga0J1ZkxlbiA9IDEzOyAgLy8gIi0iICsgMTAgZGlnaXRzICsgTlVMICsgc2VudGluZWwuCi0gIEZYX0NIQVIgYnVmW2tCdWZMZW5dOworICBjaGFyIGJ1ZltrQnVmTGVuXTsKICAgYnVmW2tCdWZMZW4gLSAxXSA9IGtTZW50aW5lbDsKICAgRlhTWVNfaXRvYShpbnB1dCwgYnVmLCAxMCk7Ci0gIEVYUEVDVF9FUShzdGQ6OnN0cmluZyhleHBlY3RlZF9vdXRwdXQpLCBidWYpOworICBFWFBFQ1RfU1RSRVEoZXhwZWN0ZWRfb3V0cHV0LCBidWYpOwogICBFWFBFQ1RfRVEoa1NlbnRpbmVsLCBidWZba0J1ZkxlbiAtIDFdKTsKIH0KIAogdm9pZCBDaGVjazMyQml0QmFzZTJJdG9hKGludDMyX3QgaW5wdXQsIGNvbnN0IGNoYXIqIGV4cGVjdGVkX291dHB1dCkgewogICBjb25zdCBzaXplX3Qga0J1ZkxlbiA9IDM1OyAgLy8gIi0iICsgMzIgZGlnaXRzICsgTlVMICsgc2VudGluZWwuCi0gIEZYX0NIQVIgYnVmW2tCdWZMZW5dOworICBjaGFyIGJ1ZltrQnVmTGVuXTsKICAgYnVmW2tCdWZMZW4gLSAxXSA9IGtTZW50aW5lbDsKICAgRlhTWVNfaXRvYShpbnB1dCwgYnVmLCAyKTsKLSAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKGV4cGVjdGVkX291dHB1dCksIGJ1Zik7CisgIEVYUEVDVF9TVFJFUShleHBlY3RlZF9vdXRwdXQsIGJ1Zik7CiAgIEVYUEVDVF9FUShrU2VudGluZWwsIGJ1ZltrQnVmTGVuIC0gMV0pOwogfQogCiB2b2lkIENoZWNrNjRCaXRCYXNlMTZJdG9hKGludDY0X3QgaW5wdXQsIGNvbnN0IGNoYXIqIGV4cGVjdGVkX291dHB1dCkgewogICBjb25zdCBzaXplX3Qga0J1ZkxlbiA9IDE5OyAgLy8gIi0iICsgMTYgZGlnaXRzICsgTlVMICsgc2VudGluZWwuCi0gIEZYX0NIQVIgYnVmW2tCdWZMZW5dOworICBjaGFyIGJ1ZltrQnVmTGVuXTsKICAgYnVmW2tCdWZMZW4gLSAxXSA9IGtTZW50aW5lbDsKICAgRlhTWVNfaTY0dG9hKGlucHV0LCBidWYsIDE2KTsKLSAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKGV4cGVjdGVkX291dHB1dCksIGJ1Zik7CisgIEVYUEVDVF9TVFJFUShleHBlY3RlZF9vdXRwdXQsIGJ1Zik7CiAgIEVYUEVDVF9FUShrU2VudGluZWwsIGJ1ZltrQnVmTGVuIC0gMV0pOwogfQogCiB2b2lkIENoZWNrNjRCaXRCYXNlMTBJdG9hKGludDY0X3QgaW5wdXQsIGNvbnN0IGNoYXIqIGV4cGVjdGVkX291dHB1dCkgewogICBjb25zdCBzaXplX3Qga0J1ZkxlbiA9IDIyOyAgLy8gIi0iICsgMTkgZGlnaXRzICsgTlVMICsgc2VudGluZWwuCi0gIEZYX0NIQVIgYnVmW2tCdWZMZW5dOworICBjaGFyIGJ1ZltrQnVmTGVuXTsKICAgYnVmW2tCdWZMZW4gLSAxXSA9IGtTZW50aW5lbDsKICAgRlhTWVNfaTY0dG9hKGlucHV0LCBidWYsIDEwKTsKLSAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKGV4cGVjdGVkX291dHB1dCksIGJ1Zik7CisgIEVYUEVDVF9TVFJFUShleHBlY3RlZF9vdXRwdXQsIGJ1Zik7CiAgIEVYUEVDVF9FUShrU2VudGluZWwsIGJ1ZltrQnVmTGVuIC0gMV0pOwogfQogCiB2b2lkIENoZWNrNjRCaXRCYXNlMkl0b2EoaW50NjRfdCBpbnB1dCwgY29uc3QgY2hhciogZXhwZWN0ZWRfb3V0cHV0KSB7CiAgIGNvbnN0IHNpemVfdCBrQnVmTGVuID0gNjc7ICAvLyAiLSIgKyA2NCBkaWdpdHMgKyBOVUwgKyBzZW50aW5lbC4KLSAgRlhfQ0hBUiBidWZba0J1Zkxlbl07CisgIGNoYXIgYnVmW2tCdWZMZW5dOwogICBidWZba0J1ZkxlbiAtIDFdID0ga1NlbnRpbmVsOwogICBGWFNZU19pNjR0b2EoaW5wdXQsIGJ1ZiwgMik7Ci0gIEVYUEVDVF9FUShzdGQ6OnN0cmluZyhleHBlY3RlZF9vdXRwdXQpLCBidWYpOworICBFWFBFQ1RfU1RSRVEoZXhwZWN0ZWRfb3V0cHV0LCBidWYpOwogICBFWFBFQ1RfRVEoa1NlbnRpbmVsLCBidWZba0J1ZkxlbiAtIDFdKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCiAKIFRFU1QoZnhjcnQsIEZYU1lTX2l0b2FfSW52YWxpZFJhZGl4KSB7Ci0gIEZYX0NIQVIgYnVmWzMyXTsKKyAgY2hhciBidWZbMzJdOwogCiAgIEZYU1lTX2l0b2EoNDIsIGJ1ZiwgMTcpOyAgLy8gT3VycyBzdG9wcyBhdCAxNi4KLSAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKCIiKSwgYnVmKTsKKyAgRVhQRUNUX1NUUkVRKCIiLCBidWYpOwogCiAgIEZYU1lTX2l0b2EoNDIsIGJ1ZiwgMSk7Ci0gIEVYUEVDVF9FUShzdGQ6OnN0cmluZygiIiksIGJ1Zik7CisgIEVYUEVDVF9TVFJFUSgiIiwgYnVmKTsKIAogICBGWFNZU19pdG9hKDQyLCBidWYsIDApOwotICBFWFBFQ1RfRVEoc3RkOjpzdHJpbmcoIiIpLCBidWYpOworICBFWFBFQ1RfU1RSRVEoIiIsIGJ1Zik7CiAKICAgRlhTWVNfaXRvYSg0MiwgYnVmLCAtMSk7Ci0gIEVYUEVDVF9FUShzdGQ6OnN0cmluZygiIiksIGJ1Zik7CisgIEVYUEVDVF9TVFJFUSgiIiwgYnVmKTsKIH0KIAogVEVTVChmeGNydCwgRlhTWVNfaXRvYSkgewpAQCAtMTE1LDE5ICsxMTQsMTkgQEAKIH0KIAogVEVTVChmeGNydCwgRlhTWVNfaTY0dG9hX0ludmFsaWRSYWRpeCkgewotICBGWF9DSEFSIGJ1ZlszMl07CisgIGNoYXIgYnVmWzMyXTsKIAogICBGWFNZU19pNjR0b2EoNDIsIGJ1ZiwgMTcpOyAgLy8gT3VycyBzdG9wcyBhdCAxNi4KLSAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKCIiKSwgYnVmKTsKKyAgRVhQRUNUX1NUUkVRKCIiLCBidWYpOwogCiAgIEZYU1lTX2k2NHRvYSg0MiwgYnVmLCAxKTsKLSAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKCIiKSwgYnVmKTsKKyAgRVhQRUNUX1NUUkVRKCIiLCBidWYpOwogCiAgIEZYU1lTX2k2NHRvYSg0MiwgYnVmLCAwKTsKLSAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKCIiKSwgYnVmKTsKKyAgRVhQRUNUX1NUUkVRKCIiLCBidWYpOwogCiAgIEZYU1lTX2k2NHRvYSg0MiwgYnVmLCAtMSk7Ci0gIEVYUEVDVF9FUShzdGQ6OnN0cmluZygiIiksIGJ1Zik7CisgIEVYUEVDVF9TVFJFUSgiIiwgYnVmKTsKIH0KIAogVEVTVChmeGNydCwgRlhTWVNfaTY0dG9hKSB7CkBAIC0xNTksNCArMTU4LDEzNiBAQAogICAgICAgIjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSIpOwogfQogCi0jZW5kaWYgIC8vIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNlbmRpZiAgLy8gX0ZYX1BMQVRGT1JNXyAhPSBfRlhfUExBVEZPUk1fV0lORE9XU18KKworVEVTVChmeGNydCwgRlhTWVNfd2NzZnRpbWUpIHsKKyAgc3RydWN0IHRtIGdvb2RfdGltZSA9IHt9OworICBnb29kX3RpbWUudG1feWVhciA9IDc0OyAgLy8gMTkwMC1iYXNlZC4KKyAgZ29vZF90aW1lLnRtX21vbiA9IDc7ICAgIC8vIDAtYmFzZWQuCisgIGdvb2RfdGltZS50bV9tZGF5ID0gOTsgICAvLyAxLWJhc2VkLgorICBnb29kX3RpbWUudG1faG91ciA9IDExOworICBnb29kX3RpbWUudG1fbWluID0gNTk7CisgIGdvb2RfdGltZS50bV9zZWMgPSA1OTsKKworICB3Y2hhcl90IGJ1ZlsxMDBdID0ge307CisgIEVYUEVDVF9FUSgxOXUsIEZYU1lTX3djc2Z0aW1lKGJ1ZiwgRlhfQXJyYXlTaXplKGJ1ZiksIEwiJVktJW0tJWRUJUg6JU06JVMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ29vZF90aW1lKSk7CisgIEVYUEVDVF9TVFJFUShMIjE5NzQtMDgtMDlUMTE6NTk6NTkiLCBidWYpOworCisgIC8vIEVuc3VyZSB3Y3NmdGltZSBoYW5kbGVzIGEgd2lkZSByYW5nZSBvZiB5ZWFycyB3aXRob3V0IGNyYXNoaW5nLgorICBzdHJ1Y3QgdG0geWVhcl90aW1lID0ge307CisgIHllYXJfdGltZS50bV9tb24gPSA3OyAgIC8vIDAtYmFzZWQuCisgIHllYXJfdGltZS50bV9tZGF5ID0gOTsgIC8vIDEtYmFzZWQuCisgIHllYXJfdGltZS50bV9ob3VyID0gMTE7CisgIHllYXJfdGltZS50bV9taW4gPSA1OTsKKyAgeWVhcl90aW1lLnRtX3NlYyA9IDU5OworCisgIGZvciAoaW50IHllYXIgPSAtMjUwMDsgeWVhciA8PSA4NTAwOyArK3llYXIpIHsKKyAgICB5ZWFyX3RpbWUudG1feWVhciA9IHllYXI7CisgICAgd2NoYXJfdCB5ZWFyX2J1ZlsxMDBdID0ge307CisgICAgRlhTWVNfd2NzZnRpbWUoeWVhcl9idWYsIEZYX0FycmF5U2l6ZSh5ZWFyX2J1ZiksIEwiJVktJW0tJWRUJUg6JU06JVMiLAorICAgICAgICAgICAgICAgICAgICZ5ZWFyX3RpbWUpOworICB9CisKKyAgLy8gRW5zdXJlIHdjc2Z0aW1lIGhhbmRsZXMgYmFkIHllYXJzLCBldGMuIHdpdGhvdXQgY3Jhc2hpbmcuCisgIHN0cnVjdCB0bSBiYWRfdGltZSA9IHt9OworICBiYWRfdGltZS50bV95ZWFyID0gLTE7CisgIGJhZF90aW1lLnRtX21vbiA9IC0xOworICBiYWRfdGltZS50bV9tZGF5ID0gLTE7CisgIGJhZF90aW1lLnRtX2hvdXIgPSAtMTsKKyAgYmFkX3RpbWUudG1fbWluID0gLTE7CisgIGJhZF90aW1lLnRtX3NlYyA9IC0xOworCisgIEZYU1lTX3djc2Z0aW1lKGJ1ZiwgRlhfQXJyYXlTaXplKGJ1ZiksIEwiJXktJW0tJWRUJUg6JU06JVMiLCAmYmFkX3RpbWUpOworCisgIC8vIEVuc3VyZSB3Y3NmdGltZSBoYW5kbGVzIGJhZC1pc2ggZGF5IHdpdGhvdXQgY3Jhc2hpbmcgKEZlYiAzMCkuCisgIHN0cnVjdCB0bSBmZWJfdGltZSA9IHt9OworICBmZWJfdGltZS50bV95ZWFyID0gMTE1OyAgLy8gMTkwMC1iYXNlZC4KKyAgZmViX3RpbWUudG1fbW9uID0gMTsgICAgIC8vIDAtYmFzZWQuCisgIGZlYl90aW1lLnRtX21kYXkgPSAzMDsgICAvLyAxLWJhc2VkLgorICBmZWJfdGltZS50bV9ob3VyID0gMTI7CisgIGZlYl90aW1lLnRtX21pbiA9IDAwOworICBmZWJfdGltZS50bV9zZWMgPSAwMDsKKworICBGWFNZU193Y3NmdGltZShidWYsIEZYX0FycmF5U2l6ZShidWYpLCBMIiV5LSVtLSVkVCVIOiVNOiVTIiwgJmZlYl90aW1lKTsKK30KKworVEVTVChmeGNydCwgRlhTWVNfYXRvaSkgeworICBFWFBFQ1RfRVEoMCwgRlhTWVNfYXRvaSgiIikpOworICBFWFBFQ1RfRVEoMCwgRlhTWVNfYXRvaSgiMCIpKTsKKyAgRVhQRUNUX0VRKC0xLCBGWFNZU19hdG9pKCItMSIpKTsKKyAgRVhQRUNUX0VRKDIzNDUsIEZYU1lTX2F0b2koIjIzNDUiKSk7CisgIEVYUEVDVF9FUSgtMjE0NzQ4MzY0NywgRlhTWVNfYXRvaSgiLTIxNDc0ODM2NDciKSk7CisgIC8vIEhhbmRsZSB0aGUgc2lnbi4KKyAgRVhQRUNUX0VRKC0yMzQ1LCBGWFNZU19hdG9pKCItMjM0NSIpKTsKKyAgRVhQRUNUX0VRKDIzNDUsIEZYU1lTX2F0b2koIisyMzQ1IikpOworICAvLyBUaGUgbWF4IHZhbHVlLgorICBFWFBFQ1RfRVEoMjE0NzQ4MzY0NywgRlhTWVNfYXRvaSgiMjE0NzQ4MzY0NyIpKTsKKyAgLy8gVGhlIG1pbiB2YWx1ZS4gV3JpdHRlbiBpbiAtMSBmb3JtYXQgdG8gYXZvaWQgInVuYXJ5IG1pbnVzIG9wZXJhdG9yIGFwcGxpZWQKKyAgLy8gdG8gdW5zaWduZWQgdHlwZSIgd2FybmluZy4KKyAgRVhQRUNUX0VRKC0yMTQ3NDgzNjQ3IC0gMSwgRlhTWVNfYXRvaSgiLTIxNDc0ODM2NDgiKSk7CisgIC8vIFdpdGggaW52YWxpZCBjaGFyLgorICBFWFBFQ1RfRVEoOSwgRlhTWVNfYXRvaSgiOXg5IikpOworCisgIC8vIE91dCBvZiByYW5nZSB2YWx1ZXMuCisgIEVYUEVDVF9FUSgyMTQ3NDgzNjQ3LCBGWFNZU19hdG9pKCIyMTQ3NDgzNjIzNDIzNDEyMzQ4IikpOworICBFWFBFQ1RfRVEoMjE0NzQ4MzY0NywgRlhTWVNfYXRvaSgiMjE0NzQ4MzY0OCIpKTsKKyAgRVhQRUNUX0VRKC0yMTQ3NDgzNjQ3IC0gMSwgRlhTWVNfYXRvaSgiLTIxNDc0ODM2NTAiKSk7Cit9CisKK1RFU1QoZnhjcnQsIEZYU1lTX2F0b2k2NCkgeworICBFWFBFQ1RfRVEoMCwgRlhTWVNfYXRvaTY0KCIiKSk7CisgIEVYUEVDVF9FUSgwLCBGWFNZU19hdG9pNjQoIjAiKSk7CisgIEVYUEVDVF9FUSgtMSwgRlhTWVNfYXRvaTY0KCItMSIpKTsKKyAgRVhQRUNUX0VRKDIzNDUsIEZYU1lTX2F0b2k2NCgiMjM0NSIpKTsKKyAgRVhQRUNUX0VRKC05MjIzMzcyMDM2ODU0Nzc1ODA3TEwsIEZYU1lTX2F0b2k2NCgiLTkyMjMzNzIwMzY4NTQ3NzU4MDciKSk7CisgIC8vIEhhbmRsZSB0aGUgc2lnbi4KKyAgRVhQRUNUX0VRKC0yMzQ1LCBGWFNZU19hdG9pNjQoIi0yMzQ1IikpOworICBFWFBFQ1RfRVEoMjM0NSwgRlhTWVNfYXRvaTY0KCIrMjM0NSIpKTsKKyAgLy8gVGhlIG1heCB2YWx1ZS4KKyAgRVhQRUNUX0VRKDkyMjMzNzIwMzY4NTQ3NzU4MDdMTCwgRlhTWVNfYXRvaTY0KCI5MjIzMzcyMDM2ODU0Nzc1ODA3IikpOworICAvLyBUaGUgbWluIHZhbHVlLiBXcml0dGVuIGluIC0xIGZvcm1hdCB0byBhdm9pZCBpbXBsaWNpdCB1bnNpZ25lZCB3YXJuaW5nLgorICBFWFBFQ1RfRVEoLTkyMjMzNzIwMzY4NTQ3NzU4MDdMTCAtIDFMTCwgRlhTWVNfYXRvaTY0KCItOTIyMzM3MjAzNjg1NDc3NTgwOCIpKTsKKyAgLy8gV2l0aCBpbnZhbGlkIGNoYXIuCisgIEVYUEVDVF9FUSg5LCBGWFNZU19hdG9pNjQoIjl4OSIpKTsKKworICAvLyBPdXQgb2YgcmFuZ2UgdmFsdWVzLgorICBFWFBFQ1RfRVEoOTIyMzM3MjAzNjg1NDc3NTgwN0xMLCBGWFNZU19hdG9pNjQoIjkyMjMzNzIwMzY4NTQ3MTIzNDEyMzQ3NTgwNyIpKTsKKyAgRVhQRUNUX0VRKDkyMjMzNzIwMzY4NTQ3NzU4MDdMTCwgRlhTWVNfYXRvaTY0KCI5MjIzMzcyMDM2ODU0Nzc1ODA4IikpOworICBFWFBFQ1RfRVEoLTkyMjMzNzIwMzY4NTQ3NzU4MDdMTCAtIDFMTCwgRlhTWVNfYXRvaTY0KCItOTIyMzM3MjAzNjg1NDc3NTgxMCIpKTsKK30KKworVEVTVChmeGNydCwgRlhTWVNfd3RvaSkgeworICBFWFBFQ1RfRVEoMCwgRlhTWVNfd3RvaShMIiIpKTsKKyAgRVhQRUNUX0VRKDAsIEZYU1lTX3d0b2koTCIwIikpOworICBFWFBFQ1RfRVEoLTEsIEZYU1lTX3d0b2koTCItMSIpKTsKKyAgRVhQRUNUX0VRKDIzNDUsIEZYU1lTX3d0b2koTCIyMzQ1IikpOworICBFWFBFQ1RfRVEoLTIxNDc0ODM2NDcsIEZYU1lTX3d0b2koTCItMjE0NzQ4MzY0NyIpKTsKKyAgLy8gVGhlIG1heCB2YWx1ZS4KKyAgRVhQRUNUX0VRKDIxNDc0ODM2NDcsIEZYU1lTX3d0b2koTCIyMTQ3NDgzNjQ3IikpOworICAvLyBUaGUgbWluIHZhbHVlLgorICBFWFBFQ1RfRVEoLTIxNDc0ODM2NDcgLSAxLCBGWFNZU193dG9pKEwiLTIxNDc0ODM2NDgiKSk7CisKKyAgLy8gT3V0IG9mIHJhbmdlIHZhbHVlcy4KKyAgRVhQRUNUX0VRKDIxNDc0ODM2NDcsIEZYU1lTX3d0b2koTCIyMTQ3NDgzNjIzNDIzNDEyMzQ4IikpOworICBFWFBFQ1RfRVEoMjE0NzQ4MzY0NywgRlhTWVNfd3RvaShMIjIxNDc0ODM2NDgiKSk7CisgIEVYUEVDVF9FUSgtMjE0NzQ4MzY0NyAtIDEsIEZYU1lTX3d0b2koTCItMjE0NzQ4MzY1MiIpKTsKK30KKworVEVTVChmeGNydCwgRlhTWVNfYXRvdWkpIHsKKyAgRVhQRUNUX0VRKDB1LCBGWFNZU19hdG91aSgiIikpOworICBFWFBFQ1RfRVEoMHUsIEZYU1lTX2F0b3VpKCIwIikpOworICBFWFBFQ1RfRVEoNDI5NDk2NzI5NSwgRlhTWVNfYXRvdWkoIi0xIikpOworICBFWFBFQ1RfRVEoMjM0NXUsIEZYU1lTX2F0b3VpKCIyMzQ1IikpOworICAvLyBIYW5kbGUgdGhlIHNpZ24uCisgIEVYUEVDVF9FUSg0Mjk0OTY0OTUxLCBGWFNZU19hdG91aSgiLTIzNDUiKSk7CisgIEVYUEVDVF9FUSgyMzQ1dSwgRlhTWVNfYXRvdWkoIisyMzQ1IikpOworICAvLyBUaGUgbWF4IHZhbHVlLgorICBFWFBFQ1RfRVEoNDI5NDk2NzI5NSwgRlhTWVNfYXRvdWkoIjQyOTQ5NjcyOTUiKSk7CisgIEVYUEVDVF9FUSg5dSwgRlhTWVNfYXRvdWkoIjl4OSIpKTsKKworICAvLyBPdXQgb2YgcmFuZ2UgdmFsdWVzLgorICBFWFBFQ1RfRVEoNDI5NDk2NzI5NSwgRlhTWVNfYXRvdWkoIjIxNDc0ODM2MjM0MjM0MTIzNDgiKSk7CisgIEVYUEVDVF9FUSg0Mjk0OTY3Mjk1LCBGWFNZU19hdG91aSgiNDI5NDk2NzI5NiIpKTsKKyAgRVhQRUNUX0VRKDQyOTQ5NjcyOTUsIEZYU1lTX2F0b3VpKCItNDI5NDk2NzM0NSIpKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvZnhfdWNkLmggYi9jb3JlL2Z4Y3J0L2Z4X3VjZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjRiYWQwLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjcnQvZnhfdWNkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlhDUlRfRlhfVUNEX0hfCi0jZGVmaW5lIENPUkVfRlhDUlRfRlhfVUNEX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgotCi0jZGVmaW5lIEZYX0JJRElDTEFTU0JJVFMgNgotI2RlZmluZSBGWF9CSURJQ0xBU1NCSVRTTUFTSyAoMzEgPDwgRlhfQklESUNMQVNTQklUUykKLQotZW51bSBGWF9CSURJQ0xBU1MgewotICBGWF9CSURJQ0xBU1NfT04gPSAwLCAgICAvLyBPdGhlciBOZXV0cmFsCi0gIEZYX0JJRElDTEFTU19MID0gMSwgICAgIC8vIExlZnQgTGV0dGVyCi0gIEZYX0JJRElDTEFTU19SID0gMiwgICAgIC8vIFJpZ2h0IExldHRlcgotICBGWF9CSURJQ0xBU1NfQU4gPSAzLCAgICAvLyBBcmFiaWMgTnVtYmVyCi0gIEZYX0JJRElDTEFTU19FTiA9IDQsICAgIC8vIEV1cm9wZWFuIE51bWJlcgotICBGWF9CSURJQ0xBU1NfQUwgPSA1LCAgICAvLyBBcmFiaWMgTGV0dGVyCi0gIEZYX0JJRElDTEFTU19OU00gPSA2LCAgIC8vIE5vbi1zcGFjaW5nIE1hcmsKLSAgRlhfQklESUNMQVNTX0NTID0gNywgICAgLy8gQ29tbW9uIE51bWJlciBTZXBhcmF0b3IKLSAgRlhfQklESUNMQVNTX0VTID0gOCwgICAgLy8gRXVyb3BlYW4gU2VwYXJhdG9yCi0gIEZYX0JJRElDTEFTU19FVCA9IDksICAgIC8vIEV1cm9wZWFuIE51bWJlciBUZXJtaW5hdG9yCi0gIEZYX0JJRElDTEFTU19CTiA9IDEwLCAgIC8vIEJvdW5kYXJ5IE5ldXRyYWwKLSAgRlhfQklESUNMQVNTX1MgPSAxMSwgICAgLy8gU2VnbWVudCBTZXBhcmF0b3IKLSAgRlhfQklESUNMQVNTX1dTID0gMTIsICAgLy8gV2hpdGVzcGFjZQotICBGWF9CSURJQ0xBU1NfQiA9IDEzLCAgICAvLyBQYXJhZ3JhcGggU2VwYXJhdG9yCi0gIEZYX0JJRElDTEFTU19STE8gPSAxNCwgIC8vIFJpZ2h0LXRvLUxlZnQgT3ZlcnJpZGUKLSAgRlhfQklESUNMQVNTX1JMRSA9IDE1LCAgLy8gUmlnaHQtdG8tTGVmdCBFbWJlZGRpbmcKLSAgRlhfQklESUNMQVNTX0xSTyA9IDE2LCAgLy8gTGVmdC10by1SaWdodCBPdmVycmlkZQotICBGWF9CSURJQ0xBU1NfTFJFID0gMTcsICAvLyBMZWZ0LXRvLVJpZ2h0IEVtYmVkZGluZwotICBGWF9CSURJQ0xBU1NfUERGID0gMTgsICAvLyBQb3AgRGlyZWN0aW9uYWwgRm9ybWF0Ci0gIEZYX0JJRElDTEFTU19OID0gRlhfQklESUNMQVNTX09OLAotfTsKLQotZXh0ZXJuIGNvbnN0IHVpbnQzMl90IGtUZXh0TGF5b3V0Q29kZVByb3BlcnRpZXNbXTsKLWV4dGVybiBjb25zdCBzaXplX3Qga1RleHRMYXlvdXRDb2RlUHJvcGVydGllc1NpemU7Ci0KLWV4dGVybiBjb25zdCB1aW50MTZfdCBrRlhUZXh0TGF5b3V0VmVydGljYWxNaXJyb3JbXTsKLWV4dGVybiBjb25zdCBzaXplX3Qga0ZYVGV4dExheW91dFZlcnRpY2FsTWlycm9yU2l6ZTsKLQotZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGtGWFRleHRMYXlvdXRCaWRpTWlycm9yW107Ci1leHRlcm4gY29uc3Qgc2l6ZV90IGtGWFRleHRMYXlvdXRCaWRpTWlycm9yU2l6ZTsKLQotdWludDMyX3QgRlhfR2V0VW5pY29kZVByb3BlcnRpZXMoRlhfV0NIQVIgd2NoKTsKLUZYX1dDSEFSIEZYX0dldE1pcnJvckNoYXIoRlhfV0NIQVIgd2NoLCBib29sIGJSVEwsIGJvb2wgYlZlcnRpY2FsKTsKLQotI2lmZGVmIFBERl9FTkFCTEVfWEZBCi1lbnVtIEZYX0NIQVJCUkVBS1BST1AgewotICBGWF9DQlBfT1AgPSAwLAotICBGWF9DQlBfQ0wgPSAxLAotICBGWF9DQlBfUVUgPSAyLAotICBGWF9DQlBfR0wgPSAzLAotICBGWF9DQlBfTlMgPSA0LAotICBGWF9DQlBfRVggPSA1LAotICBGWF9DQlBfU1kgPSA2LAotICBGWF9DQlBfSVMgPSA3LAotICBGWF9DQlBfUFIgPSA4LAotICBGWF9DQlBfUE8gPSA5LAotICBGWF9DQlBfTlUgPSAxMCwKLSAgRlhfQ0JQX0FMID0gMTEsCi0gIEZYX0NCUF9JRCA9IDEyLAotICBGWF9DQlBfSU4gPSAxMywKLSAgRlhfQ0JQX0hZID0gMTQsCi0gIEZYX0NCUF9CQSA9IDE1LAotICBGWF9DQlBfQkIgPSAxNiwKLSAgRlhfQ0JQX0IyID0gMTcsCi0gIEZYX0NCUF9aVyA9IDE4LAotICBGWF9DQlBfQ00gPSAxOSwKLSAgRlhfQ0JQX1dKID0gMjAsCi0gIEZYX0NCUF9IMiA9IDIxLAotICBGWF9DQlBfSDMgPSAyMiwKLSAgRlhfQ0JQX0pMID0gMjMsCi0gIEZYX0NCUF9KViA9IDI0LAotICBGWF9DQlBfSlQgPSAyNSwKLQotICBGWF9DQlBfQksgPSAyNiwKLSAgRlhfQ0JQX0NSID0gMjcsCi0gIEZYX0NCUF9MRiA9IDI4LAotICBGWF9DQlBfTkwgPSAyOSwKLSAgRlhfQ0JQX1NBID0gMzAsCi0gIEZYX0NCUF9TRyA9IDMxLAotICBGWF9DQlBfQ0IgPSAzMiwKLSAgRlhfQ0JQX1hYID0gMzMsCi0gIEZYX0NCUF9BSSA9IDM0LAotICBGWF9DQlBfU1AgPSAzNSwKLSAgRlhfQ0JQX1RCID0gMzcsCi0gIEZYX0NCUF9OT05FID0gMzYsCi19OwotCi0jZGVmaW5lIEZYX0NIQVJUWVBFQklUUyAxMQotI2RlZmluZSBGWF9DSEFSVFlQRUJJVFNNQVNLICgxNSA8PCBGWF9DSEFSVFlQRUJJVFMpCi1lbnVtIEZYX0NIQVJUWVBFIHsKLSAgRlhfQ0hBUlRZUEVfVW5rbm93biA9IDAsCi0gIEZYX0NIQVJUWVBFX1RhYiA9ICgxIDw8IEZYX0NIQVJUWVBFQklUUyksCi0gIEZYX0NIQVJUWVBFX1NwYWNlID0gKDIgPDwgRlhfQ0hBUlRZUEVCSVRTKSwKLSAgRlhfQ0hBUlRZUEVfQ29udHJvbCA9ICgzIDw8IEZYX0NIQVJUWVBFQklUUyksCi0gIEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uID0gKDQgPDwgRlhfQ0hBUlRZUEVCSVRTKSwKLSAgRlhfQ0hBUlRZUEVfTnVtZXJpYyA9ICg1IDw8IEZYX0NIQVJUWVBFQklUUyksCi0gIEZYX0NIQVJUWVBFX05vcm1hbCA9ICg2IDw8IEZYX0NIQVJUWVBFQklUUyksCi0gIEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYgPSAoNyA8PCBGWF9DSEFSVFlQRUJJVFMpLAotICBGWF9DSEFSVFlQRV9BcmFiaWNTcGVjaWFsID0gKDggPDwgRlhfQ0hBUlRZUEVCSVRTKSwKLSAgRlhfQ0hBUlRZUEVfQXJhYmljRGlzdG9ydGlvbiA9ICg5IDw8IEZYX0NIQVJUWVBFQklUUyksCi0gIEZYX0NIQVJUWVBFX0FyYWJpY05vcm1hbCA9ICgxMCA8PCBGWF9DSEFSVFlQRUJJVFMpLAotICBGWF9DSEFSVFlQRV9BcmFiaWNGb3JtID0gKDExIDw8IEZYX0NIQVJUWVBFQklUUyksCi0gIEZYX0NIQVJUWVBFX0FyYWJpYyA9ICgxMiA8PCBGWF9DSEFSVFlQRUJJVFMpLAotfTsKLWlubGluZSBGWF9DSEFSVFlQRSBHZXRDaGFyVHlwZUZyb21Qcm9wKHVpbnQzMl90IHByb3ApIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PEZYX0NIQVJUWVBFPihwcm9wICYgRlhfQ0hBUlRZUEVCSVRTTUFTSyk7Ci19Ci0KLWJvb2wgRlhfSXNDdHJsQ29kZShGWF9XQ0hBUiBjaCk7Ci1GWF9XQ0hBUiBGWF9HZXRNaXJyb3JDaGFyKEZYX1dDSEFSIHdjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdQcm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUlRMLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJWZXJ0aWNhbCk7Ci1jbGFzcyBDRlhfQ2hhciB7Ci0gcHVibGljOgotICBDRlhfQ2hhcigpCi0gICAgICA6IG1fd0NoYXJDb2RlKDApLAotICAgICAgICBtX25CcmVha1R5cGUoMCksCi0gICAgICAgIG1fZHdDaGFyUHJvcHMoMCksCi0gICAgICAgIG1faUNoYXJXaWR0aCgwKSwKLSAgICAgICAgbV9pSG9yaXpvbnRhbFNjYWxlKDEwMCksCi0gICAgICAgIG1faVZlcnRpY2FsU2NhbGUoMTAwKSB7fQotCi0gIENGWF9DaGFyKHVpbnQxNl90IHdDaGFyQ29kZSwgdWludDMyX3QgZHdDaGFyUHJvcHMpCi0gICAgICA6IG1fd0NoYXJDb2RlKHdDaGFyQ29kZSksCi0gICAgICAgIG1fbkJyZWFrVHlwZSgwKSwKLSAgICAgICAgbV9kd0NoYXJQcm9wcyhkd0NoYXJQcm9wcyksCi0gICAgICAgIG1faUNoYXJXaWR0aCgwKSwKLSAgICAgICAgbV9pSG9yaXpvbnRhbFNjYWxlKDEwMCksCi0gICAgICAgIG1faVZlcnRpY2FsU2NhbGUoMTAwKSB7fQotCi0gIEZYX0NIQVJUWVBFIEdldENoYXJUeXBlKCkgY29uc3QgeyByZXR1cm4gR2V0Q2hhclR5cGVGcm9tUHJvcChtX2R3Q2hhclByb3BzKTsgfQotCi0gIHVpbnQxNl90IG1fd0NoYXJDb2RlOwotICB1aW50OF90IG1fbkJyZWFrVHlwZTsKLSAgdWludDMyX3QgbV9kd0NoYXJQcm9wczsKLSAgaW50MzJfdCBtX2lDaGFyV2lkdGg7Ci0gIGludDMyX3QgbV9pSG9yaXpvbnRhbFNjYWxlOwotICBpbnQzMl90IG1faVZlcnRpY2FsU2NhbGU7Ci19OwotCi1jbGFzcyBDRlhfVHh0Q2hhciA6IHB1YmxpYyBDRlhfQ2hhciB7Ci0gcHVibGljOgotICBDRlhfVHh0Q2hhcigpCi0gICAgICA6IG1fblJvdGF0aW9uKDApLAotICAgICAgICBtX2R3Q2hhclN0eWxlcygwKSwKLSAgICAgICAgbV9kd1N0YXR1cygwKSwKLSAgICAgICAgbV9pQmlkaUNsYXNzKDApLAotICAgICAgICBtX2lCaWRpTGV2ZWwoMCksCi0gICAgICAgIG1faUJpZGlQb3MoMCksCi0gICAgICAgIG1faUJpZGlPcmRlcigwKSwKLSAgICAgICAgbV9wVXNlckRhdGEobnVsbHB0cikge30KLQotICBpbnQ4X3QgbV9uUm90YXRpb247Ci0gIHVpbnQzMl90IG1fZHdDaGFyU3R5bGVzOwotICB1aW50MzJfdCBtX2R3U3RhdHVzOwotICBpbnQxNl90IG1faUJpZGlDbGFzczsKLSAgaW50MTZfdCBtX2lCaWRpTGV2ZWw7Ci0gIGludDE2X3QgbV9pQmlkaVBvczsKLSAgaW50MTZfdCBtX2lCaWRpT3JkZXI7Ci0gIHZvaWQqIG1fcFVzZXJEYXRhOwotfTsKLQotZW51bSBjbGFzcyBDRlhfUlRGQnJlYWtUeXBlIHsgTm9uZSA9IDAsIFBpZWNlLCBMaW5lLCBQYXJhZ3JhcGgsIFBhZ2UgfTsKLQotY2xhc3MgQ0ZYX1JURkNoYXIgOiBwdWJsaWMgQ0ZYX0NoYXIgewotIHB1YmxpYzoKLSAgQ0ZYX1JURkNoYXIoKTsKLSAgQ0ZYX1JURkNoYXIoY29uc3QgQ0ZYX1JURkNoYXImIG90aGVyKTsKLSAgfkNGWF9SVEZDaGFyKCk7Ci0KLSAgQ0ZYX1JURkJyZWFrVHlwZSBtX2R3U3RhdHVzOwotICBpbnQzMl90IG1faUZvbnRTaXplOwotICBpbnQzMl90IG1faUZvbnRIZWlnaHQ7Ci0gIGludDE2X3QgbV9pQmlkaUNsYXNzOwotICBpbnQxNl90IG1faUJpZGlMZXZlbDsKLSAgaW50MTZfdCBtX2lCaWRpUG9zOwotICBpbnQxNl90IG1faUJpZGlPcmRlcjsKLSAgdWludDMyX3QgbV9kd0lkZW50aXR5OwotICBDRlhfUmV0YWluUHRyPENGWF9SZXRhaW5hYmxlPiBtX3BVc2VyRGF0YTsKLX07Ci0KLWlubGluZSBDRlhfUlRGQ2hhcjo6Q0ZYX1JURkNoYXIoKQotICAgIDogbV9kd1N0YXR1cyhDRlhfUlRGQnJlYWtUeXBlOjpOb25lKSwKLSAgICAgIG1faUZvbnRTaXplKDApLAotICAgICAgbV9pRm9udEhlaWdodCgwKSwKLSAgICAgIG1faUJpZGlDbGFzcygwKSwKLSAgICAgIG1faUJpZGlMZXZlbCgwKSwKLSAgICAgIG1faUJpZGlQb3MoMCksCi0gICAgICBtX2R3SWRlbnRpdHkoMCksCi0gICAgICBtX3BVc2VyRGF0YShudWxscHRyKSB7fQotCi1pbmxpbmUgQ0ZYX1JURkNoYXI6OkNGWF9SVEZDaGFyKGNvbnN0IENGWF9SVEZDaGFyJiBvdGhlcikgPSBkZWZhdWx0OwotaW5saW5lIENGWF9SVEZDaGFyOjp+Q0ZYX1JURkNoYXIoKSA9IGRlZmF1bHQ7Ci0KLSNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKLQotI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0ZYX1VDRF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF91Y2RkYXRhLmNwcCBiL2NvcmUvZnhjcnQvZnhfdWNkZGF0YS5jcHAKaW5kZXggYjg2NjFiOC4uNTI3ZWFjZiAxMDA2NDQKLS0tIGEvY29yZS9meGNydC9meF91Y2RkYXRhLmNwcAorKysgYi9jb3JlL2Z4Y3J0L2Z4X3VjZGRhdGEuY3BwCkBAIC00LDggKzQsOSBAQAogCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfdWNkLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF91Y2RkYXRhLmgiCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgogCiBjb25zdCB1aW50MzJfdCBrVGV4dExheW91dENvZGVQcm9wZXJ0aWVzW10gPSB7CiAgICAgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywgMHhmZmZlOWE5MywKQEAgLTEwOTM2LDE5ICsxMDkzNyw2IEBACiBjb25zdCBzaXplX3Qga1RleHRMYXlvdXRDb2RlUHJvcGVydGllc1NpemUgPQogICAgIEZYX0FycmF5U2l6ZShrVGV4dExheW91dENvZGVQcm9wZXJ0aWVzKTsKIAotY29uc3QgdWludDE2X3Qga0ZYVGV4dExheW91dFZlcnRpY2FsTWlycm9yW10gPSB7Ci0gICAgMHhGRTMzLCAweEZFMzIsIDB4RkUzMSwgMHhGRTQxLCAweEZFNDIsIDB4RkU0MywgMHhGRTQ0LCAweEZFM0YsCi0gICAgMHhGRTQwLCAweEZFM0QsIDB4RkUzRSwgMHhGRTQxLCAweEZFNDIsIDB4RkU0MywgMHhGRTQ0LCAweEZFM0IsCi0gICAgMHhGRTNDLCAweEZFMzksIDB4RkUzQSwgMHhGRTM0LCAweEZFMzUsIDB4RkUzNiwgMHhGRTM3LCAweEZFMzgsCi0gICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCi0gICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCi0gICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCi0gICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCi0gICAgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsIDB4RkVGRiwgMHhGRUZGLCAweEZFRkYsCi19OwotY29uc3Qgc2l6ZV90IGtGWFRleHRMYXlvdXRWZXJ0aWNhbE1pcnJvclNpemUgPQotICAgIEZYX0FycmF5U2l6ZShrRlhUZXh0TGF5b3V0VmVydGljYWxNaXJyb3IpOwotCiBjb25zdCB1aW50MTZfdCBrRlhUZXh0TGF5b3V0QmlkaU1pcnJvcltdID0gewogICAgIDB4MDAyOSwgMHgwMDI4LCAweDAwM0UsIDB4MDAzQywgMHgwMDVELCAweDAwNUIsIDB4MDA3RCwgMHgwMDdCLCAweDAwQkIsCiAgICAgMHgwMEFCLCAweDBGM0IsIDB4MEYzQSwgMHgwRjNELCAweDBGM0MsIDB4MTY5QywgMHgxNjlCLCAweDIwMTksIDB4MjAxOCwKZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvZnhfdWNkZGF0YS5oIGIvY29yZS9meGNydC9meF91Y2RkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhNmI5NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvZnhfdWNkZGF0YS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX0ZYX1VDRERBVEFfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9GWF9VQ0REQVRBX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorCitleHRlcm4gY29uc3QgdWludDMyX3Qga1RleHRMYXlvdXRDb2RlUHJvcGVydGllc1tdOworZXh0ZXJuIGNvbnN0IHNpemVfdCBrVGV4dExheW91dENvZGVQcm9wZXJ0aWVzU2l6ZTsKKworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IGtGWFRleHRMYXlvdXRCaWRpTWlycm9yW107CitleHRlcm4gY29uc3Qgc2l6ZV90IGtGWFRleHRMYXlvdXRCaWRpTWlycm9yU2l6ZTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0ZYX1VDRERBVEFfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvZnhfdW5pY29kZS5jcHAgYi9jb3JlL2Z4Y3J0L2Z4X3VuaWNvZGUuY3BwCmluZGV4IGU2ZjQyM2UuLmFhZmRiYTEgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhjcnQvZnhfdW5pY29kZS5jcHAKKysrIGIvY29yZS9meGNydC9meF91bmljb2RlLmNwcApAQCAtNCw2NCArNCwzOCBAQAogCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF91Y2QuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3VuaWNvZGUuaCIKIAotdWludDMyX3QgRlhfR2V0VW5pY29kZVByb3BlcnRpZXMoRlhfV0NIQVIgd2NoKSB7CisjaW5jbHVkZSAiY29yZS9meGNydC9meF91Y2RkYXRhLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciB1aW50MzJfdCBrTWlycm9yQml0cyA9IDIzOworY29uc3RleHByIHVpbnQzMl90IGtNaXJyb3JNYXNrID0gMHgxRkZVIDw8IGtNaXJyb3JCaXRzOworCit3Y2hhcl90IEdldE1pcnJvckNoYXIod2NoYXJfdCB3Y2gsIHVpbnQzMl90IGR3UHJvcHMpIHsKKyAgdWludDMyX3QgZHdUZW1wID0gKGR3UHJvcHMgJiBrTWlycm9yTWFzayk7CisgIGlmIChkd1RlbXAgPT0ga01pcnJvck1hc2spCisgICAgcmV0dXJuIHdjaDsKKyAgc2l6ZV90IGlkeCA9IGR3VGVtcCA+PiBrTWlycm9yQml0czsKKyAgcmV0dXJuIGlkeCA8IGtGWFRleHRMYXlvdXRCaWRpTWlycm9yU2l6ZSA/IGtGWFRleHRMYXlvdXRCaWRpTWlycm9yW2lkeF0gOiB3Y2g7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCit1aW50MzJfdCBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3Y2hhcl90IHdjaCkgewogICBzaXplX3QgaWR4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90Pih3Y2gpOwogICBpZiAoaWR4IDwga1RleHRMYXlvdXRDb2RlUHJvcGVydGllc1NpemUpCi0gICAgcmV0dXJuIGtUZXh0TGF5b3V0Q29kZVByb3BlcnRpZXNbKHVpbnQxNl90KXdjaF07CisgICAgcmV0dXJuIGtUZXh0TGF5b3V0Q29kZVByb3BlcnRpZXNbaWR4XTsKICAgcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBQREZfRU5BQkxFX1hGQQotYm9vbCBGWF9Jc0N0cmxDb2RlKEZYX1dDSEFSIGNoKSB7Ci0gIHVpbnQzMl90IGR3UmV0ID0gKEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKGNoKSAmIEZYX0NIQVJUWVBFQklUU01BU0spOwotICByZXR1cm4gZHdSZXQgPT0gRlhfQ0hBUlRZUEVfVGFiIHx8IGR3UmV0ID09IEZYX0NIQVJUWVBFX0NvbnRyb2w7Ci19Ci0jZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCi0KLUZYX1dDSEFSIEZYX0dldE1pcnJvckNoYXIoRlhfV0NIQVIgd2NoLCBib29sIGJSVEwsIGJvb2wgYlZlcnRpY2FsKSB7Ci0gIHVpbnQzMl90IGR3UHJvcHMgPSBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3Y2gpOwotICB1aW50MzJfdCBkd1RlbXAgPSAoZHdQcm9wcyAmIDB4RkY4MDAwMDApOwotICBpZiAoYlJUTCAmJiBkd1RlbXAgPCAweEZGODAwMDAwKSB7Ci0gICAgc2l6ZV90IGlkeCA9IGR3VGVtcCA+PiAyMzsKLSAgICBpZiAoaWR4IDwga0ZYVGV4dExheW91dEJpZGlNaXJyb3JTaXplKSB7Ci0gICAgICB3Y2ggPSBrRlhUZXh0TGF5b3V0QmlkaU1pcnJvcltpZHhdOwotICAgICAgZHdQcm9wcyA9IEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKHdjaCk7Ci0gICAgfQotICB9Ci0gIGlmIChiVmVydGljYWwpIHsKLSAgICBkd1RlbXAgPSAoZHdQcm9wcyAmIDB4MDA3RTAwMDApOwotICAgIGlmIChkd1RlbXAgPCAweDAwN0UwMDAwKSB7Ci0gICAgICBzaXplX3QgaWR4ID0gZHdUZW1wID4+IDE3OwotICAgICAgaWYgKGlkeCA8IGtGWFRleHRMYXlvdXRWZXJ0aWNhbE1pcnJvclNpemUpCi0gICAgICAgIHdjaCA9IGtGWFRleHRMYXlvdXRWZXJ0aWNhbE1pcnJvcltpZHhdOwotICAgIH0KLSAgfQotICByZXR1cm4gd2NoOword2NoYXJfdCBGWF9HZXRNaXJyb3JDaGFyKHdjaGFyX3Qgd2NoKSB7CisgIHJldHVybiBHZXRNaXJyb3JDaGFyKHdjaCwgRlhfR2V0VW5pY29kZVByb3BlcnRpZXMod2NoKSk7CiB9CiAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQotRlhfV0NIQVIgRlhfR2V0TWlycm9yQ2hhcihGWF9XQ0hBUiB3Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3UHJvcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJUTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVmVydGljYWwpIHsKLSAgdWludDMyX3QgZHdUZW1wID0gKGR3UHJvcHMgJiAweEZGODAwMDAwKTsKLSAgaWYgKGJSVEwgJiYgZHdUZW1wIDwgMHhGRjgwMDAwMCkgewotICAgIHNpemVfdCBpZHggPSBkd1RlbXAgPj4gMjM7Ci0gICAgaWYgKGlkeCA8IGtGWFRleHRMYXlvdXRCaWRpTWlycm9yU2l6ZSkgewotICAgICAgd2NoID0ga0ZYVGV4dExheW91dEJpZGlNaXJyb3JbaWR4XTsKLSAgICAgIGR3UHJvcHMgPSBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3Y2gpOwotICAgIH0KLSAgfQotICBpZiAoYlZlcnRpY2FsKSB7Ci0gICAgZHdUZW1wID0gKGR3UHJvcHMgJiAweDAwN0UwMDAwKTsKLSAgICBpZiAoZHdUZW1wIDwgMHgwMDdFMDAwMCkgewotICAgICAgc2l6ZV90IGlkeCA9IGR3VGVtcCA+PiAxNzsKLSAgICAgIGlmIChpZHggPCBrRlhUZXh0TGF5b3V0VmVydGljYWxNaXJyb3JTaXplKQotICAgICAgICB3Y2ggPSBrRlhUZXh0TGF5b3V0VmVydGljYWxNaXJyb3JbaWR4XTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHdjaDsKK3djaGFyX3QgRlhfR2V0TWlycm9yQ2hhcih3Y2hhcl90IHdjaCwgdWludDMyX3QgZHdQcm9wcykgeworICByZXR1cm4gR2V0TWlycm9yQ2hhcih3Y2gsIGR3UHJvcHMpOwogfQogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF91bmljb2RlLmggYi9jb3JlL2Z4Y3J0L2Z4X3VuaWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODY1N2JkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9meF91bmljb2RlLmgKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfRlhfVU5JQ09ERV9IXworI2RlZmluZSBDT1JFX0ZYQ1JUX0ZYX1VOSUNPREVfSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgorCit1aW50MzJfdCBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3Y2hhcl90IHdjaCk7Cit3Y2hhcl90IEZYX0dldE1pcnJvckNoYXIod2NoYXJfdCB3Y2gpOworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKworLy8gQXMgZGVmaW5lZCBpbiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIxNAorY29uc3RleHByIHVpbnQ4X3Qga0JyZWFrUHJvcGVydHlTcGFjZSA9IDM1OworY29uc3RleHByIHVpbnQ4X3Qga0JyZWFrUHJvcGVydHlUQiA9IDM3OyAgLy8gRG9uJ3Qga25vdyB3aGF0IHRoaXMgaXMgLi4uCisKK2NvbnN0ZXhwciB1aW50MzJfdCBGWF9DSEFSVFlQRUJJVFMgPSAxMTsKK2NvbnN0ZXhwciB1aW50MzJfdCBGWF9DSEFSVFlQRUJJVFNNQVNLID0gMHhGIDw8IEZYX0NIQVJUWVBFQklUUzsKKworZW51bSBGWF9DSEFSVFlQRSB7CisgIEZYX0NIQVJUWVBFX1Vua25vd24gPSAwLAorICBGWF9DSEFSVFlQRV9UYWIgPSAoMSA8PCBGWF9DSEFSVFlQRUJJVFMpLAorICBGWF9DSEFSVFlQRV9TcGFjZSA9ICgyIDw8IEZYX0NIQVJUWVBFQklUUyksCisgIEZYX0NIQVJUWVBFX0NvbnRyb2wgPSAoMyA8PCBGWF9DSEFSVFlQRUJJVFMpLAorICBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbiA9ICg0IDw8IEZYX0NIQVJUWVBFQklUUyksCisgIEZYX0NIQVJUWVBFX051bWVyaWMgPSAoNSA8PCBGWF9DSEFSVFlQRUJJVFMpLAorICBGWF9DSEFSVFlQRV9Ob3JtYWwgPSAoNiA8PCBGWF9DSEFSVFlQRUJJVFMpLAorICBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmID0gKDcgPDwgRlhfQ0hBUlRZUEVCSVRTKSwKKyAgRlhfQ0hBUlRZUEVfQXJhYmljU3BlY2lhbCA9ICg4IDw8IEZYX0NIQVJUWVBFQklUUyksCisgIEZYX0NIQVJUWVBFX0FyYWJpY0Rpc3RvcnRpb24gPSAoOSA8PCBGWF9DSEFSVFlQRUJJVFMpLAorICBGWF9DSEFSVFlQRV9BcmFiaWNOb3JtYWwgPSAoMTAgPDwgRlhfQ0hBUlRZUEVCSVRTKSwKKyAgRlhfQ0hBUlRZUEVfQXJhYmljRm9ybSA9ICgxMSA8PCBGWF9DSEFSVFlQRUJJVFMpLAorICBGWF9DSEFSVFlQRV9BcmFiaWMgPSAoMTIgPDwgRlhfQ0hBUlRZUEVCSVRTKSwKK307CisKK2lubGluZSBGWF9DSEFSVFlQRSBHZXRDaGFyVHlwZUZyb21Qcm9wKHVpbnQzMl90IHByb3ApIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEZYX0NIQVJUWVBFPihwcm9wICYgRlhfQ0hBUlRZUEVCSVRTTUFTSyk7Cit9CisKK3djaGFyX3QgRlhfR2V0TWlycm9yQ2hhcih3Y2hhcl90IHdjaCwgdWludDMyX3QgZHdQcm9wcyk7CisKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0ZYX1VOSUNPREVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvZnhfeG1sLmggYi9jb3JlL2Z4Y3J0L2Z4X3htbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2YxOTE1Li4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjcnQvZnhfeG1sLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlhDUlRfRlhfWE1MX0hfCi0jZGVmaW5lIENPUkVfRlhDUlRfRlhfWE1MX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgotCi1jbGFzcyBDWE1MX0F0dHJJdGVtIHsKLSBwdWJsaWM6Ci0gIGJvb2wgTWF0Y2hlcyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3BhY2UsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKSBjb25zdDsKLQotICBDRlhfQnl0ZVN0cmluZyBtX1FTcGFjZU5hbWU7Ci0gIENGWF9CeXRlU3RyaW5nIG1fQXR0ck5hbWU7Ci0gIENGWF9XaWRlU3RyaW5nIG1fVmFsdWU7Ci19OwotCi1jbGFzcyBDWE1MX0F0dHJNYXAgewotIHB1YmxpYzoKLSAgQ1hNTF9BdHRyTWFwKCk7Ci0gIH5DWE1MX0F0dHJNYXAoKTsKLQotICBjb25zdCBDRlhfV2lkZVN0cmluZyogTG9va3VwKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkgY29uc3Q7Ci0gIGludCBHZXRTaXplKCkgY29uc3Q7Ci0gIENYTUxfQXR0ckl0ZW0mIEdldEF0KGludCBpbmRleCkgY29uc3Q7Ci0KLSAgdm9pZCBTZXRBdChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3BhY2UsCi0gICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlKTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8Q1hNTF9BdHRySXRlbT4+IG1fcE1hcDsKLX07Ci0KLWNsYXNzIENYTUxfQ29udGVudCB7Ci0gcHVibGljOgotICBDWE1MX0NvbnRlbnQoKSA6IG1fYkNEQVRBKGZhbHNlKSwgbV9Db250ZW50KCkge30KLSAgdm9pZCBTZXQoYm9vbCBiQ0RBVEEsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudCkgewotICAgIG1fYkNEQVRBID0gYkNEQVRBOwotICAgIG1fQ29udGVudCA9IGNvbnRlbnQ7Ci0gIH0KLQotICBib29sIG1fYkNEQVRBOwotICBDRlhfV2lkZVN0cmluZyBtX0NvbnRlbnQ7Ci19OwotCi1jbGFzcyBDWE1MX0VsZW1lbnQgewotIHB1YmxpYzoKLSAgZW51bSBDaGlsZFR5cGUgeyBJbnZhbGlkLCBFbGVtZW50LCBDb250ZW50IH07Ci0KLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDWE1MX0VsZW1lbnQ+IFBhcnNlKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzaXplKTsKLQotICBDWE1MX0VsZW1lbnQoY29uc3QgQ1hNTF9FbGVtZW50KiBwUGFyZW50LAotICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBxU3BhY2UsCi0gICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZ25hbWUpOwotICB+Q1hNTF9FbGVtZW50KCk7Ci0KLSAgdm9pZCBFbXB0eSgpOwotICBDRlhfQnl0ZVN0cmluZyBHZXRUYWdOYW1lKGJvb2wgYlF1YWxpZmllZCA9IGZhbHNlKSBjb25zdDsKLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0TmFtZXNwYWNlKGJvb2wgYlF1YWxpZmllZCA9IGZhbHNlKSBjb25zdDsKLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0TmFtZXNwYWNlVVJJKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBxTmFtZSkgY29uc3Q7Ci0gIGNvbnN0IENYTUxfRWxlbWVudCogR2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4gbV9wUGFyZW50OyB9Ci0gIHVpbnQzMl90IENvdW50QXR0cnMoKSBjb25zdCB7IHJldHVybiBtX0F0dHJNYXAuR2V0U2l6ZSgpOyB9Ci0gIHZvaWQgR2V0QXR0ckJ5SW5kZXgoaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgdmFsdWUpIGNvbnN0OwotICBib29sIEhhc0F0dHIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBxTmFtZSkgY29uc3Q7Ci0gIGJvb2wgR2V0QXR0clZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGF0dHJpYnV0ZSkgY29uc3Q7Ci0gIENGWF9XaWRlU3RyaW5nIEdldEF0dHJWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0IHsKLSAgICBDRlhfV2lkZVN0cmluZyBhdHRyOwotICAgIEdldEF0dHJWYWx1ZShuYW1lLCBhdHRyKTsKLSAgICByZXR1cm4gYXR0cjsKLSAgfQotCi0gIGJvb2wgR2V0QXR0clZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGF0dHJpYnV0ZSkgY29uc3Q7Ci0gIENGWF9XaWRlU3RyaW5nIEdldEF0dHJWYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lKSBjb25zdCB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgYXR0cjsKLSAgICBHZXRBdHRyVmFsdWUoc3BhY2UsIG5hbWUsIGF0dHIpOwotICAgIHJldHVybiBhdHRyOwotICB9Ci0KLSAgYm9vbCBHZXRBdHRySW50ZWdlcihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIGludCYgYXR0cmlidXRlKSBjb25zdDsKLSAgaW50IEdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QgewotICAgIGludCBhdHRyID0gMDsKLSAgICBHZXRBdHRySW50ZWdlcihuYW1lLCBhdHRyKTsKLSAgICByZXR1cm4gYXR0cjsKLSAgfQotCi0gIGJvb2wgR2V0QXR0ckludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgaW50JiBhdHRyaWJ1dGUpIGNvbnN0OwotICBpbnQgR2V0QXR0ckludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSkgY29uc3QgewotICAgIGludCBhdHRyID0gMDsKLSAgICBHZXRBdHRySW50ZWdlcihzcGFjZSwgbmFtZSwgYXR0cik7Ci0gICAgcmV0dXJuIGF0dHI7Ci0gIH0KLQotICBib29sIEdldEF0dHJGbG9hdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsIEZYX0ZMT0FUJiBhdHRyaWJ1dGUpIGNvbnN0OwotICBGWF9GTE9BVCBHZXRBdHRyRmxvYXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lKSBjb25zdCB7Ci0gICAgRlhfRkxPQVQgYXR0ciA9IDA7Ci0gICAgR2V0QXR0ckZsb2F0KG5hbWUsIGF0dHIpOwotICAgIHJldHVybiBhdHRyOwotICB9Ci0KLSAgYm9vbCBHZXRBdHRyRmxvYXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgYXR0cmlidXRlKSBjb25zdDsKLSAgRlhfRkxPQVQgR2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0IHsKLSAgICBGWF9GTE9BVCBhdHRyID0gMDsKLSAgICBHZXRBdHRyRmxvYXQoc3BhY2UsIG5hbWUsIGF0dHIpOwotICAgIHJldHVybiBhdHRyOwotICB9Ci0KLSAgdWludDMyX3QgQ291bnRDaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIG1fQ2hpbGRyZW4uc2l6ZSgpOyB9Ci0gIENoaWxkVHlwZSBHZXRDaGlsZFR5cGUodWludDMyX3QgaW5kZXgpIGNvbnN0OwotICBDRlhfV2lkZVN0cmluZyBHZXRDb250ZW50KHVpbnQzMl90IGluZGV4KSBjb25zdDsKLSAgQ1hNTF9FbGVtZW50KiBHZXRFbGVtZW50KHVpbnQzMl90IGluZGV4KSBjb25zdDsKLSAgQ1hNTF9FbGVtZW50KiBHZXRFbGVtZW50KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZykgY29uc3QgewotICAgIHJldHVybiBHZXRFbGVtZW50KHNwYWNlLCB0YWcsIDApOwotICB9Ci0KLSAgdWludDMyX3QgQ291bnRFbGVtZW50cyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFnKSBjb25zdDsKLSAgQ1hNTF9FbGVtZW50KiBHZXRFbGVtZW50KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3Q7Ci0KLSAgdWludDMyX3QgRmluZEVsZW1lbnQoQ1hNTF9FbGVtZW50KiBwQ2hpbGQpIGNvbnN0OwotICB2b2lkIFNldFRhZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHFUYWdOYW1lKTsKLSAgdm9pZCBSZW1vdmVDaGlsZHJlbigpOwotICB2b2lkIFJlbW92ZUNoaWxkKHVpbnQzMl90IGluZGV4KTsKLQotIHByb3RlY3RlZDoKLSAgc3RydWN0IENoaWxkUmVjb3JkIHsKLSAgICBDaGlsZFR5cGUgdHlwZTsKLSAgICB2b2lkKiBjaGlsZDsgIC8vIENYTUxfRWxlbWVudCBhbmQgQ1hNTF9Db250ZW50IGxhY2sgYSBjb21tb24gYW5jZXN0b3IuCi0gIH07Ci0KLSAgY29uc3QgQ1hNTF9FbGVtZW50KiBjb25zdCBtX3BQYXJlbnQ7Ci0gIENGWF9CeXRlU3RyaW5nIG1fUVNwYWNlTmFtZTsKLSAgQ0ZYX0J5dGVTdHJpbmcgbV9UYWdOYW1lOwotICBDWE1MX0F0dHJNYXAgbV9BdHRyTWFwOwotICBzdGQ6OnZlY3RvcjxDaGlsZFJlY29yZD4gbV9DaGlsZHJlbjsKLQotICBmcmllbmQgY2xhc3MgQ1hNTF9QYXJzZXI7Ci0gIGZyaWVuZCBjbGFzcyBDWE1MX0NvbXBvc2VyOwotfTsKLQotI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0ZYX1hNTF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF94bWxfY29tcG9zZXIuY3BwIGIvY29yZS9meGNydC9meF94bWxfY29tcG9zZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzdkNjRjLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjcnQvZnhfeG1sX2NvbXBvc2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sX2ludC5oIgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF94bWwuaCIKLQotdm9pZCBGWF9YTUxfU3BsaXRRdWFsaWZpZWROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGdWxsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MmIGJzU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDJiBic05hbWUpIHsKLSAgaWYgKGJzRnVsbE5hbWUuSXNFbXB0eSgpKQotICAgIHJldHVybjsKLQotICBGWF9TVFJTSVpFIGlTdGFydCA9IGJzRnVsbE5hbWUuRmluZCgnOicpOwotICBpZiAoaVN0YXJ0ID09IC0xKSB7Ci0gICAgYnNOYW1lID0gYnNGdWxsTmFtZTsKLSAgfSBlbHNlIHsKLSAgICBic1NwYWNlID0gYnNGdWxsTmFtZS5NaWQoMCwgaVN0YXJ0KTsKLSAgICBic05hbWUgPSBic0Z1bGxOYW1lLk1pZChpU3RhcnQgKyAxKTsKLSAgfQotfQotCi12b2lkIENYTUxfRWxlbWVudDo6U2V0VGFnKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgcVRhZ05hbWUpIHsKLSAgQVNTRVJUKCFxVGFnTmFtZS5Jc0VtcHR5KCkpOwotICBDRlhfQnl0ZVN0cmluZ0MgYnNTcGFjZTsKLSAgQ0ZYX0J5dGVTdHJpbmdDIGJzTmFtZTsKLSAgRlhfWE1MX1NwbGl0UXVhbGlmaWVkTmFtZShxVGFnTmFtZSwgYnNTcGFjZSwgYnNOYW1lKTsKLSAgbV9RU3BhY2VOYW1lID0gYnNTcGFjZTsKLSAgbV9UYWdOYW1lID0gYnNOYW1lOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meF94bWxfcGFyc2VyLmNwcCBiL2NvcmUvZnhjcnQvZnhfeG1sX3BhcnNlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MWFhZTcuLjAwMDAwMDAKLS0tIGEvY29yZS9meGNydC9meF94bWxfcGFyc2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDkxOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF94bWwuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbF9pbnQuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgotCi1uYW1lc3BhY2UgewotCi0jZGVmaW5lIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfTm9ybWFsIDB4MDAKLSNkZWZpbmUgRlhDUlRNX1hNTF9DSEFSVFlQRV9TcGFjZUNoYXIgMHgwMQotI2RlZmluZSBGWENSVE1fWE1MX0NIQVJUWVBFX0xldHRlciAweDAyCi0jZGVmaW5lIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfRGlnaXRhbCAweDA0Ci0jZGVmaW5lIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfTmFtZUludHJvIDB4MDgKLSNkZWZpbmUgRlhDUlRNX1hNTF9DSEFSVFlQRV9OYW1lQ2hhciAweDEwCi0jZGVmaW5lIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfSGV4RGlnaXRhbCAweDIwCi0jZGVmaW5lIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfSGV4TG93ZXJMZXR0ZXIgMHg0MAotI2RlZmluZSBGWENSVE1fWE1MX0NIQVJUWVBFX0hleFVwcGVyTGV0dGVyIDB4NjAKLSNkZWZpbmUgRlhDUlRNX1hNTF9DSEFSVFlQRV9IZXhDaGFyIDB4NjAKLQotY29uc3QgdWludDhfdCBnX0ZYQ1JUX1hNTF9CeXRlVHlwZXNbMjU2XSA9IHsKLSAgICAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAotICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCi0gICAgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLAotICAgIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzQsIDB4MzQsIDB4MDgsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3QSwgMHg3QSwgMHg3QSwgMHg3QSwgMHg3QSwgMHg3QSwgMHgxQSwKLSAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAotICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsCi0gICAgMHgwMCwgMHg1QSwgMHg1QSwgMHg1QSwgMHg1QSwgMHg1QSwgMHg1QSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKLSAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAotICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCi0gICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKLSAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAotICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCi0gICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKLSAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAotICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCi0gICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKLSAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAotICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCi0gICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKLSAgICAweDFBLCAweDFBLCAweDAxLCAweDAxLAotfTsKLQotYm9vbCBnX0ZYQ1JUX1hNTF9Jc1doaXRlU3BhY2UodWludDhfdCBjaCkgewotICByZXR1cm4gISEoZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfU3BhY2VDaGFyKTsKLX0KLQotYm9vbCBnX0ZYQ1JUX1hNTF9Jc0RpZ2l0YWwodWludDhfdCBjaCkgewotICByZXR1cm4gISEoZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfRGlnaXRhbCk7Ci19Ci0KLWJvb2wgZ19GWENSVF9YTUxfSXNOYW1lSW50cm8odWludDhfdCBjaCkgewotICByZXR1cm4gISEoZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfTmFtZUludHJvKTsKLX0KLQotYm9vbCBnX0ZYQ1JUX1hNTF9Jc05hbWVDaGFyKHVpbnQ4X3QgY2gpIHsKLSAgcmV0dXJuICEhKGdfRlhDUlRfWE1MX0J5dGVUeXBlc1tjaF0gJiBGWENSVE1fWE1MX0NIQVJUWVBFX05hbWVDaGFyKTsKLX0KLQotY2xhc3MgQ1hNTF9EYXRhQnVmQWNjIDogcHVibGljIElGWF9CdWZmZXJlZFJlYWRTdHJlYW0gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3M+Ci0gIGZyaWVuZCBDRlhfUmV0YWluUHRyPFQ+IHBkZml1bTo6TWFrZVJldGFpbihBcmdzJiYuLi4gYXJncyk7Ci0KLSAgLy8gSUZYX0J1ZmZlcmVkUmVhZFN0cmVhbQotICBib29sIElzRU9GKCkgb3ZlcnJpZGU7Ci0gIEZYX0ZJTEVTSVpFIEdldFBvc2l0aW9uKCkgb3ZlcnJpZGU7Ci0gIHNpemVfdCBSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgUmVhZE5leHRCbG9jayhib29sIGJSZXN0YXJ0KSBvdmVycmlkZTsKLSAgY29uc3QgdWludDhfdCogR2V0QmxvY2tCdWZmZXIoKSBvdmVycmlkZTsKLSAgc2l6ZV90IEdldEJsb2NrU2l6ZSgpIG92ZXJyaWRlOwotICBGWF9GSUxFU0laRSBHZXRCbG9ja09mZnNldCgpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgQ1hNTF9EYXRhQnVmQWNjKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBzaXplKTsKLSAgfkNYTUxfRGF0YUJ1ZkFjYygpIG92ZXJyaWRlOwotCi0gIGNvbnN0IHVpbnQ4X3QqIG1fcEJ1ZmZlcjsKLSAgc2l6ZV90IG1fZHdTaXplOwotICBzaXplX3QgbV9kd0N1clBvczsKLX07Ci0KLUNYTUxfRGF0YUJ1ZkFjYzo6Q1hNTF9EYXRhQnVmQWNjKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBzaXplKQotICAgIDogbV9wQnVmZmVyKHBCdWZmZXIpLCBtX2R3U2l6ZShzaXplKSwgbV9kd0N1clBvcygwKSB7fQotCi1DWE1MX0RhdGFCdWZBY2M6On5DWE1MX0RhdGFCdWZBY2MoKSB7fQotCi1ib29sIENYTUxfRGF0YUJ1ZkFjYzo6SXNFT0YoKSB7Ci0gIHJldHVybiBtX2R3Q3VyUG9zID49IG1fZHdTaXplOwotfQotCi1GWF9GSUxFU0laRSBDWE1MX0RhdGFCdWZBY2M6OkdldFBvc2l0aW9uKCkgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8RlhfRklMRVNJWkU+KG1fZHdDdXJQb3MpOwotfQotCi1zaXplX3QgQ1hNTF9EYXRhQnVmQWNjOjpSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgewotICByZXR1cm4gMDsKLX0KLQotYm9vbCBDWE1MX0RhdGFCdWZBY2M6OlJlYWROZXh0QmxvY2soYm9vbCBiUmVzdGFydCkgewotICBpZiAoYlJlc3RhcnQpCi0gICAgbV9kd0N1clBvcyA9IDA7Ci0KLSAgaWYgKG1fZHdDdXJQb3MgPCBtX2R3U2l6ZSkgewotICAgIG1fZHdDdXJQb3MgPSBtX2R3U2l6ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWNvbnN0IHVpbnQ4X3QqIENYTUxfRGF0YUJ1ZkFjYzo6R2V0QmxvY2tCdWZmZXIoKSB7Ci0gIHJldHVybiBtX3BCdWZmZXI7Ci19Ci0KLXNpemVfdCBDWE1MX0RhdGFCdWZBY2M6OkdldEJsb2NrU2l6ZSgpIHsKLSAgcmV0dXJuIG1fZHdTaXplOwotfQotCi1GWF9GSUxFU0laRSBDWE1MX0RhdGFCdWZBY2M6OkdldEJsb2NrT2Zmc2V0KCkgewotICByZXR1cm4gMDsKLX0KLQotY2xhc3MgQ1hNTF9EYXRhU3RtQWNjIDogcHVibGljIElGWF9CdWZmZXJlZFJlYWRTdHJlYW0gewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3M+Ci0gIGZyaWVuZCBDRlhfUmV0YWluUHRyPFQ+IHBkZml1bTo6TWFrZVJldGFpbihBcmdzJiYuLi4gYXJncyk7Ci0KLSAgLy8gSUZYX0J1ZmZlcmVkUmVhZFN0cmVhbQotICBib29sIElzRU9GKCkgb3ZlcnJpZGU7Ci0gIEZYX0ZJTEVTSVpFIEdldFBvc2l0aW9uKCkgb3ZlcnJpZGU7Ci0gIHNpemVfdCBSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgUmVhZE5leHRCbG9jayhib29sIGJSZXN0YXJ0KSBvdmVycmlkZTsKLSAgY29uc3QgdWludDhfdCogR2V0QmxvY2tCdWZmZXIoKSBvdmVycmlkZTsKLSAgc2l6ZV90IEdldEJsb2NrU2l6ZSgpIG92ZXJyaWRlOwotICBGWF9GSUxFU0laRSBHZXRCbG9ja09mZnNldCgpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgZXhwbGljaXQgQ1hNTF9EYXRhU3RtQWNjKAotICAgICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGVSZWFkKTsKLSAgfkNYTUxfRGF0YVN0bUFjYygpIG92ZXJyaWRlOwotCi0gIENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gbV9wRmlsZVJlYWQ7Ci0gIHVpbnQ4X3QqIG1fcEJ1ZmZlcjsKLSAgRlhfRklMRVNJWkUgbV9uU3RhcnQ7Ci0gIHNpemVfdCBtX2R3U2l6ZTsKLX07Ci0KLUNYTUxfRGF0YVN0bUFjYzo6Q1hNTF9EYXRhU3RtQWNjKAotICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBGaWxlUmVhZCkKLSAgICA6IG1fcEZpbGVSZWFkKHBGaWxlUmVhZCksIG1fcEJ1ZmZlcihudWxscHRyKSwgbV9uU3RhcnQoMCksIG1fZHdTaXplKDApIHsKLSAgQVNTRVJUKG1fcEZpbGVSZWFkKTsKLX0KLQotQ1hNTF9EYXRhU3RtQWNjOjp+Q1hNTF9EYXRhU3RtQWNjKCkgewotICBGWF9GcmVlKG1fcEJ1ZmZlcik7Ci19Ci0KLWJvb2wgQ1hNTF9EYXRhU3RtQWNjOjpJc0VPRigpIHsKLSAgcmV0dXJuIG1fblN0YXJ0ICsgc3RhdGljX2Nhc3Q8RlhfRklMRVNJWkU+KG1fZHdTaXplKSA+PQotICAgICAgICAgbV9wRmlsZVJlYWQtPkdldFNpemUoKTsKLX0KLQotRlhfRklMRVNJWkUgQ1hNTF9EYXRhU3RtQWNjOjpHZXRQb3NpdGlvbigpIHsKLSAgcmV0dXJuIG1fblN0YXJ0ICsgc3RhdGljX2Nhc3Q8RlhfRklMRVNJWkU+KG1fZHdTaXplKTsKLX0KLQotc2l6ZV90IENYTUxfRGF0YVN0bUFjYzo6UmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLWJvb2wgQ1hNTF9EYXRhU3RtQWNjOjpSZWFkTmV4dEJsb2NrKGJvb2wgYlJlc3RhcnQpIHsKLSAgaWYgKGJSZXN0YXJ0KQotICAgIG1fblN0YXJ0ID0gMDsKLQotICBGWF9GSUxFU0laRSBuTGVuZ3RoID0gbV9wRmlsZVJlYWQtPkdldFNpemUoKTsKLSAgbV9uU3RhcnQgKz0gc3RhdGljX2Nhc3Q8RlhfRklMRVNJWkU+KG1fZHdTaXplKTsKLSAgaWYgKG1fblN0YXJ0ID49IG5MZW5ndGgpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN0YXRpYyBjb25zdCBGWF9GSUxFU0laRSBGWF9YTUxEQVRBU1RSRUFNX0J1ZmZlclNpemUgPSAzMiAqIDEwMjQ7Ci0gIG1fZHdTaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PigKLSAgICAgIHN0ZDo6bWluKEZYX1hNTERBVEFTVFJFQU1fQnVmZmVyU2l6ZSwgbkxlbmd0aCAtIG1fblN0YXJ0KSk7Ci0gIGlmICghbV9wQnVmZmVyKQotICAgIG1fcEJ1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fZHdTaXplKTsKLQotICByZXR1cm4gbV9wRmlsZVJlYWQtPlJlYWRCbG9jayhtX3BCdWZmZXIsIG1fblN0YXJ0LCBtX2R3U2l6ZSk7Ci19Ci0KLWNvbnN0IHVpbnQ4X3QqIENYTUxfRGF0YVN0bUFjYzo6R2V0QmxvY2tCdWZmZXIoKSB7Ci0gIHJldHVybiAoY29uc3QgdWludDhfdCopbV9wQnVmZmVyOwotfQotCi1zaXplX3QgQ1hNTF9EYXRhU3RtQWNjOjpHZXRCbG9ja1NpemUoKSB7Ci0gIHJldHVybiBtX2R3U2l6ZTsKLX0KLQotRlhfRklMRVNJWkUgQ1hNTF9EYXRhU3RtQWNjOjpHZXRCbG9ja09mZnNldCgpIHsKLSAgcmV0dXJuIG1fblN0YXJ0OwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotQ1hNTF9QYXJzZXI6OkNYTUxfUGFyc2VyKCkKLSAgICA6IG1fbk9mZnNldCgwKSwKLSAgICAgIG1fcEJ1ZmZlcihudWxscHRyKSwKLSAgICAgIG1fZHdCdWZmZXJTaXplKDApLAotICAgICAgbV9uQnVmZmVyT2Zmc2V0KDApLAotICAgICAgbV9kd0luZGV4KDApIHt9Ci0KLUNYTUxfUGFyc2VyOjp+Q1hNTF9QYXJzZXIoKSB7fQotCi1ib29sIENYTUxfUGFyc2VyOjpJbml0KGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBzaXplKSB7Ci0gIG1fcERhdGFBY2MgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q1hNTF9EYXRhQnVmQWNjPihwQnVmZmVyLCBzaXplKTsKLSAgbV9uT2Zmc2V0ID0gMDsKLSAgcmV0dXJuIFJlYWROZXh0QmxvY2soKTsKLX0KLQotYm9vbCBDWE1MX1BhcnNlcjo6UmVhZE5leHRCbG9jaygpIHsKLSAgaWYgKCFtX3BEYXRhQWNjLT5SZWFkTmV4dEJsb2NrKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG1fcEJ1ZmZlciA9IG1fcERhdGFBY2MtPkdldEJsb2NrQnVmZmVyKCk7Ci0gIG1fZHdCdWZmZXJTaXplID0gbV9wRGF0YUFjYy0+R2V0QmxvY2tTaXplKCk7Ci0gIG1fbkJ1ZmZlck9mZnNldCA9IG1fcERhdGFBY2MtPkdldEJsb2NrT2Zmc2V0KCk7Ci0gIG1fZHdJbmRleCA9IDA7Ci0gIHJldHVybiBtX2R3QnVmZmVyU2l6ZSA+IDA7Ci19Ci0KLWJvb2wgQ1hNTF9QYXJzZXI6OklzRU9GKCkgewotICByZXR1cm4gbV9wRGF0YUFjYy0+SXNFT0YoKSAmJiBtX2R3SW5kZXggPj0gbV9kd0J1ZmZlclNpemU7Ci19Ci0KLXZvaWQgQ1hNTF9QYXJzZXI6OlNraXBXaGl0ZVNwYWNlcygpIHsKLSAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgc3RhdGljX2Nhc3Q8RlhfRklMRVNJWkU+KG1fZHdJbmRleCk7Ci0gIGlmIChJc0VPRigpKQotICAgIHJldHVybjsKLQotICBkbyB7Ci0gICAgd2hpbGUgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplICYmCi0gICAgICAgICAgIGdfRlhDUlRfWE1MX0lzV2hpdGVTcGFjZShtX3BCdWZmZXJbbV9kd0luZGV4XSkpIHsKLSAgICAgIG1fZHdJbmRleCsrOwotICAgIH0KLSAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyBzdGF0aWNfY2FzdDxGWF9GSUxFU0laRT4obV9kd0luZGV4KTsKLSAgICBpZiAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUgfHwgSXNFT0YoKSkKLSAgICAgIGJyZWFrOwotICB9IHdoaWxlIChSZWFkTmV4dEJsb2NrKCkpOwotfQotCi12b2lkIENYTUxfUGFyc2VyOjpHZXROYW1lKENGWF9CeXRlU3RyaW5nKiBzcGFjZSwgQ0ZYX0J5dGVTdHJpbmcqIG5hbWUpIHsKLSAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgc3RhdGljX2Nhc3Q8RlhfRklMRVNJWkU+KG1fZHdJbmRleCk7Ci0gIGlmIChJc0VPRigpKQotICAgIHJldHVybjsKLQotICBDRlhfQnl0ZVRleHRCdWYgYnVmOwotICB1aW50OF90IGNoOwotICBkbyB7Ci0gICAgd2hpbGUgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplKSB7Ci0gICAgICBjaCA9IG1fcEJ1ZmZlclttX2R3SW5kZXhdOwotICAgICAgaWYgKGNoID09ICc6JykgewotICAgICAgICAqc3BhY2UgPSBidWYuQXNTdHJpbmdDKCk7Ci0gICAgICAgIGJ1Zi5DbGVhcigpOwotICAgICAgfSBlbHNlIGlmIChnX0ZYQ1JUX1hNTF9Jc05hbWVDaGFyKGNoKSkgewotICAgICAgICBidWYuQXBwZW5kQ2hhcihjaCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIG1fZHdJbmRleCsrOwotICAgIH0KLSAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyBzdGF0aWNfY2FzdDxGWF9GSUxFU0laRT4obV9kd0luZGV4KTsKLSAgICBpZiAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUgfHwgSXNFT0YoKSkKLSAgICAgIGJyZWFrOwotICB9IHdoaWxlIChSZWFkTmV4dEJsb2NrKCkpOwotICAqbmFtZSA9IGJ1Zi5Bc1N0cmluZ0MoKTsKLX0KLQotdm9pZCBDWE1MX1BhcnNlcjo6U2tpcExpdGVyYWxzKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSB7Ci0gIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX2R3SW5kZXgpOwotICBpZiAoSXNFT0YoKSkgewotICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IGkgPSAwLCBpTGVuID0gc3RyLkdldExlbmd0aCgpOwotICBkbyB7Ci0gICAgd2hpbGUgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplKSB7Ci0gICAgICBpZiAoc3RyLkdldEF0KGkpICE9IG1fcEJ1ZmZlclttX2R3SW5kZXgrK10pIHsKLSAgICAgICAgaSA9IDA7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaSsrOwotICAgICAgaWYgKGkgPT0gaUxlbikKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX2R3SW5kZXgpOwotICAgIGlmIChpID09IGlMZW4pCi0gICAgICByZXR1cm47Ci0KLSAgICBpZiAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUgfHwgSXNFT0YoKSkKLSAgICAgIGJyZWFrOwotICB9IHdoaWxlIChSZWFkTmV4dEJsb2NrKCkpOwotICB3aGlsZSAoIW1fcERhdGFBY2MtPklzRU9GKCkpIHsKLSAgICBSZWFkTmV4dEJsb2NrKCk7Ci0gICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgc3RhdGljX2Nhc3Q8RlhfRklMRVNJWkU+KG1fZHdCdWZmZXJTaXplKTsKLSAgfQotICBtX2R3SW5kZXggPSBtX2R3QnVmZmVyU2l6ZTsKLX0KLQotdWludDMyX3QgQ1hNTF9QYXJzZXI6OkdldENoYXJSZWYoKSB7Ci0gIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX2R3SW5kZXgpOwotICBpZiAoSXNFT0YoKSkKLSAgICByZXR1cm4gMDsKLQotICB1aW50OF90IGNoOwotICBpbnQzMl90IGlTdGF0ZSA9IDA7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBidWY7Ci0gIHVpbnQzMl90IGNvZGUgPSAwOwotICBkbyB7Ci0gICAgd2hpbGUgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplKSB7Ci0gICAgICBjaCA9IG1fcEJ1ZmZlclttX2R3SW5kZXhdOwotICAgICAgc3dpdGNoIChpU3RhdGUpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgIGlmIChjaCA9PSAnIycpIHsKLSAgICAgICAgICAgIG1fZHdJbmRleCsrOwotICAgICAgICAgICAgaVN0YXRlID0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBpU3RhdGUgPSAxOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgbV9kd0luZGV4Kys7Ci0gICAgICAgICAgaWYgKGNoID09ICc7JykgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDIHJlZiA9IGJ1Zi5Bc1N0cmluZ0MoKTsKLSAgICAgICAgICAgIGlmIChyZWYgPT0gImd0IikKLSAgICAgICAgICAgICAgY29kZSA9ICc+JzsKLSAgICAgICAgICAgIGVsc2UgaWYgKHJlZiA9PSAibHQiKQotICAgICAgICAgICAgICBjb2RlID0gJzwnOwotICAgICAgICAgICAgZWxzZSBpZiAocmVmID09ICJhbXAiKQotICAgICAgICAgICAgICBjb2RlID0gJyYnOwotICAgICAgICAgICAgZWxzZSBpZiAocmVmID09ICJhcG9zIikKLSAgICAgICAgICAgICAgY29kZSA9ICdcJyc7Ci0gICAgICAgICAgICBlbHNlIGlmIChyZWYgPT0gInF1b3QiKQotICAgICAgICAgICAgICBjb2RlID0gJyInOwotICAgICAgICAgICAgaVN0YXRlID0gMTA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnVmLkFwcGVuZEJ5dGUoY2gpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgaWYgKGNoID09ICd4JykgewotICAgICAgICAgICAgbV9kd0luZGV4Kys7Ci0gICAgICAgICAgICBpU3RhdGUgPSA0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlTdGF0ZSA9IDM7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICBtX2R3SW5kZXgrKzsKLSAgICAgICAgICBpZiAoY2ggPT0gJzsnKSB7Ci0gICAgICAgICAgICBpU3RhdGUgPSAxMDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZ19GWENSVF9YTUxfSXNEaWdpdGFsKGNoKSkKLSAgICAgICAgICAgIGNvZGUgPSBjb2RlICogMTAgKyBGWFNZU190b0RlY2ltYWxEaWdpdChzdGF0aWNfY2FzdDxGWF9XQ0hBUj4oY2gpKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgIG1fZHdJbmRleCsrOwotICAgICAgICAgIGlmIChjaCA9PSAnOycpIHsKLSAgICAgICAgICAgIGlTdGF0ZSA9IDEwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIHVpbnQ4X3QgbkhleCA9Ci0gICAgICAgICAgICAgIGdfRlhDUlRfWE1MX0J5dGVUeXBlc1tjaF0gJiBGWENSVE1fWE1MX0NIQVJUWVBFX0hleENoYXI7Ci0gICAgICAgICAgaWYgKG5IZXgpIHsKLSAgICAgICAgICAgIGlmIChuSGV4ID09IEZYQ1JUTV9YTUxfQ0hBUlRZUEVfSGV4RGlnaXRhbCkgewotICAgICAgICAgICAgICBjb2RlID0KLSAgICAgICAgICAgICAgICAgIChjb2RlIDw8IDQpICsgRlhTWVNfdG9EZWNpbWFsRGlnaXQoc3RhdGljX2Nhc3Q8RlhfV0NIQVI+KGNoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG5IZXggPT0gRlhDUlRNX1hNTF9DSEFSVFlQRV9IZXhMb3dlckxldHRlcikgewotICAgICAgICAgICAgICBjb2RlID0gKGNvZGUgPDwgNCkgKyBjaCAtIDg3OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgY29kZSA9IChjb2RlIDw8IDQpICsgY2ggLSA1NTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoaVN0YXRlID09IDEwKQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgc3RhdGljX2Nhc3Q8RlhfRklMRVNJWkU+KG1fZHdJbmRleCk7Ci0gICAgaWYgKGlTdGF0ZSA9PSAxMCB8fCBtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSB8fCBJc0VPRigpKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0gd2hpbGUgKFJlYWROZXh0QmxvY2soKSk7Ci0gIHJldHVybiBjb2RlOwotfQotCi12b2lkIENYTUxfUGFyc2VyOjpHZXRBdHRyVmFsdWUoQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlKSB7Ci0gIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX2R3SW5kZXgpOwotICBpZiAoSXNFT0YoKSkKLSAgICByZXR1cm47Ci0KLSAgQ0ZYX1VURjhEZWNvZGVyIGRlY29kZXI7Ci0gIHVpbnQ4X3QgbWFyayA9IDAsIGNoID0gMDsKLSAgZG8gewotICAgIHdoaWxlIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSkgewotICAgICAgY2ggPSBtX3BCdWZmZXJbbV9kd0luZGV4XTsKLSAgICAgIGlmIChtYXJrID09IDApIHsKLSAgICAgICAgaWYgKGNoICE9ICdcJycgJiYgY2ggIT0gJyInKQotICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBtYXJrID0gY2g7Ci0gICAgICAgIG1fZHdJbmRleCsrOwotICAgICAgICBjaCA9IDA7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgbV9kd0luZGV4Kys7Ci0gICAgICBpZiAoY2ggPT0gbWFyaykKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmIChjaCA9PSAnJicpIHsKLSAgICAgICAgZGVjb2Rlci5BcHBlbmRDaGFyKEdldENoYXJSZWYoKSk7Ci0gICAgICAgIGlmIChJc0VPRigpKSB7Ci0gICAgICAgICAgdmFsdWUgPSBkZWNvZGVyLkdldFJlc3VsdCgpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZGVjb2Rlci5JbnB1dChjaCk7Ci0gICAgICB9Ci0gICAgfQotICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX2R3SW5kZXgpOwotICAgIGlmIChjaCA9PSBtYXJrIHx8IG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplIHx8IElzRU9GKCkpCi0gICAgICBicmVhazsKLSAgfSB3aGlsZSAoUmVhZE5leHRCbG9jaygpKTsKLSAgdmFsdWUgPSBkZWNvZGVyLkdldFJlc3VsdCgpOwotfQotCi12b2lkIENYTUxfUGFyc2VyOjpHZXRUYWdOYW1lKGJvb2wgYlN0YXJ0VGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBiRW5kVGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyogc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nKiBuYW1lKSB7Ci0gIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX2R3SW5kZXgpOwotICBpZiAoSXNFT0YoKSkKLSAgICByZXR1cm47Ci0KLSAgKmJFbmRUYWcgPSBmYWxzZTsKLSAgdWludDhfdCBjaDsKLSAgaW50MzJfdCBpU3RhdGUgPSBiU3RhcnRUYWcgPyAxIDogMDsKLSAgZG8gewotICAgIHdoaWxlIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSkgewotICAgICAgY2ggPSBtX3BCdWZmZXJbbV9kd0luZGV4XTsKLSAgICAgIHN3aXRjaCAoaVN0YXRlKSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICBtX2R3SW5kZXgrKzsKLSAgICAgICAgICBpZiAoY2ggIT0gJzwnKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBpU3RhdGUgPSAxOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgaWYgKGNoID09ICc/JykgewotICAgICAgICAgICAgbV9kd0luZGV4Kys7Ci0gICAgICAgICAgICBTa2lwTGl0ZXJhbHMoIj8+Iik7Ci0gICAgICAgICAgICBpU3RhdGUgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChjaCA9PSAnIScpIHsKLSAgICAgICAgICAgIG1fZHdJbmRleCsrOwotICAgICAgICAgICAgU2tpcExpdGVyYWxzKCItLT4iKTsKLSAgICAgICAgICAgIGlTdGF0ZSA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGNoID09ICcvJykgewotICAgICAgICAgICAgbV9kd0luZGV4Kys7Ci0gICAgICAgICAgICBHZXROYW1lKHNwYWNlLCBuYW1lKTsKLSAgICAgICAgICAgICpiRW5kVGFnID0gdHJ1ZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgR2V0TmFtZShzcGFjZSwgbmFtZSk7Ci0gICAgICAgICAgICAqYkVuZFRhZyA9IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX2R3SW5kZXgpOwotICAgIGlmIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSB8fCBJc0VPRigpKQotICAgICAgYnJlYWs7Ci0gIH0gd2hpbGUgKFJlYWROZXh0QmxvY2soKSk7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxDWE1MX0VsZW1lbnQ+IENYTUxfUGFyc2VyOjpQYXJzZUVsZW1lbnQoQ1hNTF9FbGVtZW50KiBwUGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTdGFydFRhZykgewotICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyBzdGF0aWNfY2FzdDxGWF9GSUxFU0laRT4obV9kd0luZGV4KTsKLSAgaWYgKElzRU9GKCkpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgdGFnX25hbWU7Ci0gIENGWF9CeXRlU3RyaW5nIHRhZ19zcGFjZTsKLSAgYm9vbCBiRW5kVGFnOwotICBHZXRUYWdOYW1lKGJTdGFydFRhZywgJmJFbmRUYWcsICZ0YWdfc3BhY2UsICZ0YWdfbmFtZSk7Ci0gIGlmICh0YWdfbmFtZS5Jc0VtcHR5KCkgfHwgYkVuZFRhZykKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBhdXRvIHBFbGVtZW50ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYTUxfRWxlbWVudD4oCi0gICAgICBwUGFyZW50LCB0YWdfc3BhY2UuQXNTdHJpbmdDKCksIHRhZ19uYW1lLkFzU3RyaW5nQygpKTsKLSAgZG8gewotICAgIENGWF9CeXRlU3RyaW5nIGF0dHJfc3BhY2U7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYXR0cl9uYW1lOwotICAgIHdoaWxlIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSkgewotICAgICAgU2tpcFdoaXRlU3BhY2VzKCk7Ci0gICAgICBpZiAoSXNFT0YoKSkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmICghZ19GWENSVF9YTUxfSXNOYW1lSW50cm8obV9wQnVmZmVyW21fZHdJbmRleF0pKQotICAgICAgICBicmVhazsKLQotICAgICAgR2V0TmFtZSgmYXR0cl9zcGFjZSwgJmF0dHJfbmFtZSk7Ci0gICAgICBTa2lwV2hpdGVTcGFjZXMoKTsKLSAgICAgIGlmIChJc0VPRigpKQotICAgICAgICBicmVhazsKLQotICAgICAgaWYgKG1fcEJ1ZmZlclttX2R3SW5kZXhdICE9ICc9JykKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIG1fZHdJbmRleCsrOwotICAgICAgU2tpcFdoaXRlU3BhY2VzKCk7Ci0gICAgICBpZiAoSXNFT0YoKSkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIENGWF9XaWRlU3RyaW5nIGF0dHJfdmFsdWU7Ci0gICAgICBHZXRBdHRyVmFsdWUoYXR0cl92YWx1ZSk7Ci0gICAgICBwRWxlbWVudC0+bV9BdHRyTWFwLlNldEF0KGF0dHJfc3BhY2UsIGF0dHJfbmFtZSwgYXR0cl92YWx1ZSk7Ci0gICAgfQotICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX2R3SW5kZXgpOwotICAgIGlmIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSB8fCBJc0VPRigpKQotICAgICAgYnJlYWs7Ci0gIH0gd2hpbGUgKFJlYWROZXh0QmxvY2soKSk7Ci0gIFNraXBXaGl0ZVNwYWNlcygpOwotICBpZiAoSXNFT0YoKSkKLSAgICByZXR1cm4gcEVsZW1lbnQ7Ci0KLSAgdWludDhfdCBjaCA9IG1fcEJ1ZmZlclttX2R3SW5kZXgrK107Ci0gIGlmIChjaCA9PSAnLycpIHsKLSAgICBtX2R3SW5kZXgrKzsKLSAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyBzdGF0aWNfY2FzdDxGWF9GSUxFU0laRT4obV9kd0luZGV4KTsKLSAgICByZXR1cm4gcEVsZW1lbnQ7Ci0gIH0KLSAgaWYgKGNoICE9ICc+JykgewotICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX2R3SW5kZXgpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIFNraXBXaGl0ZVNwYWNlcygpOwotICBpZiAoSXNFT0YoKSkKLSAgICByZXR1cm4gcEVsZW1lbnQ7Ci0KLSAgQ0ZYX1VURjhEZWNvZGVyIGRlY29kZXI7Ci0gIENGWF9XaWRlVGV4dEJ1ZiBjb250ZW50OwotICBib29sIGJDREFUQSA9IGZhbHNlOwotICBpbnQzMl90IGlTdGF0ZSA9IDA7Ci0gIGRvIHsKLSAgICB3aGlsZSAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUpIHsKLSAgICAgIGNoID0gbV9wQnVmZmVyW21fZHdJbmRleCsrXTsKLSAgICAgIHN3aXRjaCAoaVN0YXRlKSB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICBpZiAoY2ggPT0gJzwnKSB7Ci0gICAgICAgICAgICBpU3RhdGUgPSAxOwotICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyYnKSB7Ci0gICAgICAgICAgICBkZWNvZGVyLkNsZWFyU3RhdHVzKCk7Ci0gICAgICAgICAgICBkZWNvZGVyLkFwcGVuZENoYXIoR2V0Q2hhclJlZigpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVjb2Rlci5JbnB1dChjaCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgaWYgKGNoID09ICchJykgewotICAgICAgICAgICAgaVN0YXRlID0gMjsKLSAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc/JykgewotICAgICAgICAgICAgU2tpcExpdGVyYWxzKCI/PiIpOwotICAgICAgICAgICAgU2tpcFdoaXRlU3BhY2VzKCk7Ci0gICAgICAgICAgICBpU3RhdGUgPSAwOwotICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJy8nKSB7Ci0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzcGFjZTsKLSAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWU7Ci0gICAgICAgICAgICBHZXROYW1lKCZzcGFjZSwgJm5hbWUpOwotICAgICAgICAgICAgU2tpcFdoaXRlU3BhY2VzKCk7Ci0gICAgICAgICAgICBtX2R3SW5kZXgrKzsKLSAgICAgICAgICAgIGlTdGF0ZSA9IDEwOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb250ZW50IDw8IGRlY29kZXIuR2V0UmVzdWx0KCk7Ci0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBkYXRhU3RyID0gY29udGVudC5NYWtlU3RyaW5nKCk7Ci0gICAgICAgICAgICBpZiAoIWJDREFUQSkKLSAgICAgICAgICAgICAgZGF0YVN0ci5UcmltUmlnaHQoTCIgXHRcclxuIik7Ci0KLSAgICAgICAgICAgIEluc2VydENvbnRlbnRTZWdtZW50KGJDREFUQSwgZGF0YVN0ci5Bc1N0cmluZ0MoKSwgcEVsZW1lbnQuZ2V0KCkpOwotICAgICAgICAgICAgY29udGVudC5DbGVhcigpOwotICAgICAgICAgICAgZGVjb2Rlci5DbGVhcigpOwotICAgICAgICAgICAgYkNEQVRBID0gZmFsc2U7Ci0gICAgICAgICAgICBpU3RhdGUgPSAwOwotICAgICAgICAgICAgbV9kd0luZGV4LS07Ci0gICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hNTF9FbGVtZW50PiBwU3ViRWxlbWVudCgKLSAgICAgICAgICAgICAgICBQYXJzZUVsZW1lbnQocEVsZW1lbnQuZ2V0KCksIHRydWUpKTsKLSAgICAgICAgICAgIGlmICghcFN1YkVsZW1lbnQpCi0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBwRWxlbWVudC0+bV9DaGlsZHJlbi5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAge0NYTUxfRWxlbWVudDo6RWxlbWVudCwgcFN1YkVsZW1lbnQucmVsZWFzZSgpfSk7Ci0gICAgICAgICAgICBTa2lwV2hpdGVTcGFjZXMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjoKLSAgICAgICAgICBpZiAoY2ggPT0gJ1snKSB7Ci0gICAgICAgICAgICBTa2lwTGl0ZXJhbHMoIl1dPiIpOwotICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJy0nKSB7Ci0gICAgICAgICAgICBtX2R3SW5kZXgrKzsKLSAgICAgICAgICAgIFNraXBMaXRlcmFscygiLS0+Iik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFNraXBMaXRlcmFscygiPiIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBkZWNvZGVyLkNsZWFyKCk7Ci0gICAgICAgICAgU2tpcFdoaXRlU3BhY2VzKCk7Ci0gICAgICAgICAgaVN0YXRlID0gMDsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChpU3RhdGUgPT0gMTApIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX2R3SW5kZXgpOwotICAgIGlmIChpU3RhdGUgPT0gMTAgfHwgbV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUgfHwgSXNFT0YoKSkKLSAgICAgIGJyZWFrOwotICB9IHdoaWxlIChSZWFkTmV4dEJsb2NrKCkpOwotICBjb250ZW50IDw8IGRlY29kZXIuR2V0UmVzdWx0KCk7Ci0gIENGWF9XaWRlU3RyaW5nIGRhdGFTdHIgPSBjb250ZW50Lk1ha2VTdHJpbmcoKTsKLSAgZGF0YVN0ci5UcmltUmlnaHQoTCIgXHRcclxuIik7Ci0KLSAgSW5zZXJ0Q29udGVudFNlZ21lbnQoYkNEQVRBLCBkYXRhU3RyLkFzU3RyaW5nQygpLCBwRWxlbWVudC5nZXQoKSk7Ci0gIGNvbnRlbnQuQ2xlYXIoKTsKLSAgZGVjb2Rlci5DbGVhcigpOwotICBiQ0RBVEEgPSBmYWxzZTsKLSAgcmV0dXJuIHBFbGVtZW50OwotfQotCi12b2lkIENYTUxfUGFyc2VyOjpJbnNlcnRDb250ZW50U2VnbWVudChib29sIGJDREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYTUxfRWxlbWVudCogcEVsZW1lbnQpIHsKLSAgaWYgKGNvbnRlbnQuSXNFbXB0eSgpKQotICAgIHJldHVybjsKLQotICBDWE1MX0NvbnRlbnQqIHBDb250ZW50ID0gbmV3IENYTUxfQ29udGVudDsKLSAgcENvbnRlbnQtPlNldChiQ0RBVEEsIGNvbnRlbnQpOwotICBwRWxlbWVudC0+bV9DaGlsZHJlbi5wdXNoX2JhY2soe0NYTUxfRWxlbWVudDo6Q29udGVudCwgcENvbnRlbnR9KTsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPENYTUxfRWxlbWVudD4gQ1hNTF9FbGVtZW50OjpQYXJzZShjb25zdCB2b2lkKiBwQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgewotICBDWE1MX1BhcnNlciBwYXJzZXI7Ci0gIGlmICghcGFyc2VyLkluaXQoc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KHBCdWZmZXIpLCBzaXplKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIHBhcnNlci5QYXJzZUVsZW1lbnQobnVsbHB0ciwgZmFsc2UpOwotfQotCi1DWE1MX0VsZW1lbnQ6OkNYTUxfRWxlbWVudChjb25zdCBDWE1MX0VsZW1lbnQqIHBQYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHFTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdGFnbmFtZSkKLSAgICA6IG1fcFBhcmVudChwUGFyZW50KSwgbV9RU3BhY2VOYW1lKHFTcGFjZSksIG1fVGFnTmFtZSh0YWduYW1lKSB7fQotCi1DWE1MX0VsZW1lbnQ6On5DWE1MX0VsZW1lbnQoKSB7Ci0gIEVtcHR5KCk7Ci19Ci0KLXZvaWQgQ1hNTF9FbGVtZW50OjpFbXB0eSgpIHsKLSAgUmVtb3ZlQ2hpbGRyZW4oKTsKLX0KLXZvaWQgQ1hNTF9FbGVtZW50OjpSZW1vdmVDaGlsZHJlbigpIHsKLSAgZm9yIChjb25zdCBDaGlsZFJlY29yZCYgcmVjb3JkIDogbV9DaGlsZHJlbikgewotICAgIGlmIChyZWNvcmQudHlwZSA9PSBDb250ZW50KSB7Ci0gICAgICBkZWxldGUgc3RhdGljX2Nhc3Q8Q1hNTF9Db250ZW50Kj4ocmVjb3JkLmNoaWxkKTsKLSAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09IEVsZW1lbnQpIHsKLSAgICAgIENYTUxfRWxlbWVudCogY2hpbGQgPSBzdGF0aWNfY2FzdDxDWE1MX0VsZW1lbnQqPihyZWNvcmQuY2hpbGQpOwotICAgICAgY2hpbGQtPlJlbW92ZUNoaWxkcmVuKCk7Ci0gICAgICBkZWxldGUgY2hpbGQ7Ci0gICAgfQotICB9Ci0gIG1fQ2hpbGRyZW4uY2xlYXIoKTsKLX0KLUNGWF9CeXRlU3RyaW5nIENYTUxfRWxlbWVudDo6R2V0VGFnTmFtZShib29sIGJRdWFsaWZpZWQpIGNvbnN0IHsKLSAgaWYgKCFiUXVhbGlmaWVkIHx8IG1fUVNwYWNlTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICByZXR1cm4gbV9UYWdOYW1lOwotICB9Ci0gIENGWF9CeXRlU3RyaW5nIGJzVGFnID0gbV9RU3BhY2VOYW1lOwotICBic1RhZyArPSAiOiI7Ci0gIGJzVGFnICs9IG1fVGFnTmFtZTsKLSAgcmV0dXJuIGJzVGFnOwotfQotCi1DRlhfQnl0ZVN0cmluZyBDWE1MX0VsZW1lbnQ6OkdldE5hbWVzcGFjZShib29sIGJRdWFsaWZpZWQpIGNvbnN0IHsKLSAgcmV0dXJuIGJRdWFsaWZpZWQgPyBtX1FTcGFjZU5hbWUgOiBHZXROYW1lc3BhY2VVUkkobV9RU3BhY2VOYW1lKTsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgQ1hNTF9FbGVtZW50OjpHZXROYW1lc3BhY2VVUkkoCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHFOYW1lKSBjb25zdCB7Ci0gIGNvbnN0IENGWF9XaWRlU3RyaW5nKiBwd3NTcGFjZTsKLSAgY29uc3QgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCA9IHRoaXM7Ci0gIGRvIHsKLSAgICBpZiAocU5hbWUuSXNFbXB0eSgpKQotICAgICAgcHdzU3BhY2UgPSBwRWxlbWVudC0+bV9BdHRyTWFwLkxvb2t1cCgiIiwgInhtbG5zIik7Ci0gICAgZWxzZQotICAgICAgcHdzU3BhY2UgPSBwRWxlbWVudC0+bV9BdHRyTWFwLkxvb2t1cCgieG1sbnMiLCBxTmFtZSk7Ci0gICAgaWYgKHB3c1NwYWNlKQotICAgICAgYnJlYWs7Ci0KLSAgICBwRWxlbWVudCA9IHBFbGVtZW50LT5HZXRQYXJlbnQoKTsKLSAgfSB3aGlsZSAocEVsZW1lbnQpOwotICByZXR1cm4gcHdzU3BhY2UgPyBwd3NTcGFjZS0+VVRGOEVuY29kZSgpIDogQ0ZYX0J5dGVTdHJpbmcoKTsKLX0KLQotdm9pZCBDWE1MX0VsZW1lbnQ6OkdldEF0dHJCeUluZGV4KGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlKSBjb25zdCB7Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbV9BdHRyTWFwLkdldFNpemUoKSkKLSAgICByZXR1cm47Ci0KLSAgQ1hNTF9BdHRySXRlbSYgaXRlbSA9IG1fQXR0ck1hcC5HZXRBdChpbmRleCk7Ci0gIHNwYWNlID0gaXRlbS5tX1FTcGFjZU5hbWU7Ci0gIG5hbWUgPSBpdGVtLm1fQXR0ck5hbWU7Ci0gIHZhbHVlID0gaXRlbS5tX1ZhbHVlOwotfQotCi1ib29sIENYTUxfRWxlbWVudDo6SGFzQXR0cihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0IHsKLSAgQ0ZYX0J5dGVTdHJpbmdDIGJzU3BhY2U7Ci0gIENGWF9CeXRlU3RyaW5nQyBic05hbWU7Ci0gIEZYX1hNTF9TcGxpdFF1YWxpZmllZE5hbWUobmFtZSwgYnNTcGFjZSwgYnNOYW1lKTsKLSAgcmV0dXJuICEhbV9BdHRyTWFwLkxvb2t1cChDRlhfQnl0ZVN0cmluZyhic1NwYWNlKSwgQ0ZYX0J5dGVTdHJpbmcoYnNOYW1lKSk7Ci19Ci0KLWJvb2wgQ1hNTF9FbGVtZW50OjpHZXRBdHRyVmFsdWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgYXR0cmlidXRlKSBjb25zdCB7Ci0gIENGWF9CeXRlU3RyaW5nQyBic1NwYWNlOwotICBDRlhfQnl0ZVN0cmluZ0MgYnNOYW1lOwotICBGWF9YTUxfU3BsaXRRdWFsaWZpZWROYW1lKG5hbWUsIGJzU3BhY2UsIGJzTmFtZSk7Ci0gIHJldHVybiBHZXRBdHRyVmFsdWUoYnNTcGFjZSwgYnNOYW1lLCBhdHRyaWJ1dGUpOwotfQotCi1ib29sIENYTUxfRWxlbWVudDo6R2V0QXR0clZhbHVlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGF0dHJpYnV0ZSkgY29uc3QgewotICBjb25zdCBDRlhfV2lkZVN0cmluZyogcFZhbHVlID0KLSAgICAgIG1fQXR0ck1hcC5Mb29rdXAoQ0ZYX0J5dGVTdHJpbmcoc3BhY2UpLCBDRlhfQnl0ZVN0cmluZyhuYW1lKSk7Ci0gIGlmICghcFZhbHVlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhdHRyaWJ1dGUgPSAqcFZhbHVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDWE1MX0VsZW1lbnQ6OkdldEF0dHJJbnRlZ2VyKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGF0dHJpYnV0ZSkgY29uc3QgewotICBDRlhfQnl0ZVN0cmluZ0MgYnNTcGFjZTsKLSAgQ0ZYX0J5dGVTdHJpbmdDIGJzTmFtZTsKLSAgRlhfWE1MX1NwbGl0UXVhbGlmaWVkTmFtZShuYW1lLCBic1NwYWNlLCBic05hbWUpOwotICBjb25zdCBDRlhfV2lkZVN0cmluZyogcHdzVmFsdWUgPQotICAgICAgbV9BdHRyTWFwLkxvb2t1cChDRlhfQnl0ZVN0cmluZyhic1NwYWNlKSwgQ0ZYX0J5dGVTdHJpbmcoYnNOYW1lKSk7Ci0gIGlmICghcHdzVmFsdWUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGF0dHJpYnV0ZSA9IHB3c1ZhbHVlLT5HZXRJbnRlZ2VyKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENYTUxfRWxlbWVudDo6R2V0QXR0ckludGVnZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBhdHRyaWJ1dGUpIGNvbnN0IHsKLSAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcqIHB3c1ZhbHVlID0KLSAgICAgIG1fQXR0ck1hcC5Mb29rdXAoQ0ZYX0J5dGVTdHJpbmcoc3BhY2UpLCBDRlhfQnl0ZVN0cmluZyhuYW1lKSk7Ci0gIGlmICghcHdzVmFsdWUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGF0dHJpYnV0ZSA9IHB3c1ZhbHVlLT5HZXRJbnRlZ2VyKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENYTUxfRWxlbWVudDo6R2V0QXR0ckZsb2F0KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGF0dHJpYnV0ZSkgY29uc3QgewotICBDRlhfQnl0ZVN0cmluZ0MgYnNTcGFjZTsKLSAgQ0ZYX0J5dGVTdHJpbmdDIGJzTmFtZTsKLSAgRlhfWE1MX1NwbGl0UXVhbGlmaWVkTmFtZShuYW1lLCBic1NwYWNlLCBic05hbWUpOwotICByZXR1cm4gR2V0QXR0ckZsb2F0KGJzU3BhY2UsIGJzTmFtZSwgYXR0cmlidXRlKTsKLX0KLQotYm9vbCBDWE1MX0VsZW1lbnQ6OkdldEF0dHJGbG9hdChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBhdHRyaWJ1dGUpIGNvbnN0IHsKLSAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcqIHBWYWx1ZSA9Ci0gICAgICBtX0F0dHJNYXAuTG9va3VwKENGWF9CeXRlU3RyaW5nKHNwYWNlKSwgQ0ZYX0J5dGVTdHJpbmcobmFtZSkpOwotICBpZiAoIXBWYWx1ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYXR0cmlidXRlID0gcFZhbHVlLT5HZXRGbG9hdCgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotQ1hNTF9FbGVtZW50OjpDaGlsZFR5cGUgQ1hNTF9FbGVtZW50OjpHZXRDaGlsZFR5cGUodWludDMyX3QgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIGluZGV4IDwgbV9DaGlsZHJlbi5zaXplKCkgPyBtX0NoaWxkcmVuW2luZGV4XS50eXBlIDogSW52YWxpZDsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ1hNTF9FbGVtZW50OjpHZXRDb250ZW50KHVpbnQzMl90IGluZGV4KSBjb25zdCB7Ci0gIGlmIChpbmRleCA8IG1fQ2hpbGRyZW4uc2l6ZSgpICYmIG1fQ2hpbGRyZW5baW5kZXhdLnR5cGUgPT0gQ29udGVudCkgewotICAgIENYTUxfQ29udGVudCogcENvbnRlbnQgPQotICAgICAgICBzdGF0aWNfY2FzdDxDWE1MX0NvbnRlbnQqPihtX0NoaWxkcmVuW2luZGV4XS5jaGlsZCk7Ci0gICAgaWYgKHBDb250ZW50KQotICAgICAgcmV0dXJuIHBDb250ZW50LT5tX0NvbnRlbnQ7Ci0gIH0KLSAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci19Ci0KLUNYTUxfRWxlbWVudCogQ1hNTF9FbGVtZW50OjpHZXRFbGVtZW50KHVpbnQzMl90IGluZGV4KSBjb25zdCB7Ci0gIGlmIChpbmRleCA8IG1fQ2hpbGRyZW4uc2l6ZSgpICYmIG1fQ2hpbGRyZW5baW5kZXhdLnR5cGUgPT0gRWxlbWVudCkKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hNTF9FbGVtZW50Kj4obV9DaGlsZHJlbltpbmRleF0uY2hpbGQpOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotdWludDMyX3QgQ1hNTF9FbGVtZW50OjpDb3VudEVsZW1lbnRzKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWcpIGNvbnN0IHsKLSAgaW50IGNvdW50ID0gMDsKLSAgZm9yIChjb25zdCBDaGlsZFJlY29yZCYgcmVjb3JkIDogbV9DaGlsZHJlbikgewotICAgIGlmIChyZWNvcmQudHlwZSAhPSBFbGVtZW50KQotICAgICAgY29udGludWU7Ci0KLSAgICBDWE1MX0VsZW1lbnQqIHBLaWQgPSBzdGF0aWNfY2FzdDxDWE1MX0VsZW1lbnQqPihyZWNvcmQuY2hpbGQpOwotICAgIGlmICgoc3BhY2UuSXNFbXB0eSgpIHx8IHBLaWQtPm1fUVNwYWNlTmFtZSA9PSBzcGFjZSkgJiYKLSAgICAgICAgcEtpZC0+bV9UYWdOYW1lID09IHRhZykgewotICAgICAgY291bnQrKzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGNvdW50OwotfQotCi1DWE1MX0VsZW1lbnQqIENYTUxfRWxlbWVudDo6R2V0RWxlbWVudChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0IHsKLSAgaWYgKGluZGV4IDwgMCkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBmb3IgKGNvbnN0IENoaWxkUmVjb3JkJiByZWNvcmQgOiBtX0NoaWxkcmVuKSB7Ci0gICAgaWYgKHJlY29yZC50eXBlICE9IEVsZW1lbnQpCi0gICAgICBjb250aW51ZTsKLQotICAgIENYTUxfRWxlbWVudCogcEtpZCA9IHN0YXRpY19jYXN0PENYTUxfRWxlbWVudCo+KHJlY29yZC5jaGlsZCk7Ci0gICAgaWYgKChzcGFjZS5Jc0VtcHR5KCkgfHwgcEtpZC0+bV9RU3BhY2VOYW1lID09IHNwYWNlKSAmJgotICAgICAgICBwS2lkLT5tX1RhZ05hbWUgPT0gdGFnKSB7Ci0gICAgICBpZiAoaW5kZXgtLSA9PSAwKQotICAgICAgICByZXR1cm4gcEtpZDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLXVpbnQzMl90IENYTUxfRWxlbWVudDo6RmluZEVsZW1lbnQoQ1hNTF9FbGVtZW50KiBwQ2hpbGQpIGNvbnN0IHsKLSAgaW50IGluZGV4ID0gMDsKLSAgZm9yIChjb25zdCBDaGlsZFJlY29yZCYgcmVjb3JkIDogbV9DaGlsZHJlbikgewotICAgIGlmIChyZWNvcmQudHlwZSA9PSBFbGVtZW50ICYmCi0gICAgICAgIHN0YXRpY19jYXN0PENYTUxfRWxlbWVudCo+KHJlY29yZC5jaGlsZCkgPT0gcENoaWxkKSB7Ci0gICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotICAgICsraW5kZXg7Ci0gIH0KLSAgcmV0dXJuICh1aW50MzJfdCktMTsKLX0KLQotYm9vbCBDWE1MX0F0dHJJdGVtOjpNYXRjaGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkgY29uc3QgewotICByZXR1cm4gKHNwYWNlLklzRW1wdHkoKSB8fCBtX1FTcGFjZU5hbWUgPT0gc3BhY2UpICYmIG1fQXR0ck5hbWUgPT0gbmFtZTsKLX0KLQotQ1hNTF9BdHRyTWFwOjpDWE1MX0F0dHJNYXAoKSB7fQotCi1DWE1MX0F0dHJNYXA6On5DWE1MX0F0dHJNYXAoKSB7fQotCi1jb25zdCBDRlhfV2lkZVN0cmluZyogQ1hNTF9BdHRyTWFwOjpMb29rdXAoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lKSBjb25zdCB7Ci0gIGlmICghbV9wTWFwKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIGZvciAoY29uc3QgYXV0byYgaXRlbSA6ICptX3BNYXApIHsKLSAgICBpZiAoaXRlbS5NYXRjaGVzKHNwYWNlLCBuYW1lKSkKLSAgICAgIHJldHVybiAmaXRlbS5tX1ZhbHVlOwotICB9Ci0gIHJldHVybiBudWxscHRyOwotfQotCi12b2lkIENYTUxfQXR0ck1hcDo6U2V0QXQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSkgewotICBpZiAoIW1fcE1hcCkKLSAgICBtX3BNYXAgPSBwZGZpdW06Ok1ha2VVbmlxdWU8c3RkOjp2ZWN0b3I8Q1hNTF9BdHRySXRlbT4+KCk7Ci0KLSAgZm9yIChDWE1MX0F0dHJJdGVtJiBpdGVtIDogKm1fcE1hcCkgewotICAgIGlmIChpdGVtLk1hdGNoZXMoc3BhY2UsIG5hbWUpKSB7Ci0gICAgICBpdGVtLm1fVmFsdWUgPSB2YWx1ZTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICBtX3BNYXAtPnB1c2hfYmFjayh7c3BhY2UsIG5hbWUsIENGWF9XaWRlU3RyaW5nKHZhbHVlKX0pOwotfQotCi1pbnQgQ1hNTF9BdHRyTWFwOjpHZXRTaXplKCkgY29uc3QgewotICByZXR1cm4gbV9wTWFwID8gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQ+KCptX3BNYXApIDogMDsKLX0KLQotQ1hNTF9BdHRySXRlbSYgQ1hNTF9BdHRyTWFwOjpHZXRBdChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuICgqbV9wTWFwKVtpbmRleF07Ci19CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Z4Y3J0X3Bvc2l4LmNwcCBiL2NvcmUvZnhjcnQvZnhjcnRfcG9zaXguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTZmMTY0Li4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjcnQvZnhjcnRfcG9zaXguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhjcnRfcG9zaXguaCIKLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLQotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfIHx8IFwKLSAgICBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXyB8fCBcCi0gICAgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BTkRST0lEXwotCi0vLyBzdGF0aWMKLUlGWENSVF9GaWxlQWNjZXNzKiBJRlhDUlRfRmlsZUFjY2Vzczo6Q3JlYXRlKCkgewotICByZXR1cm4gbmV3IENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OwotfQotCi12b2lkIEZYQ1JUX1Bvc2l4X0dldEZpbGVNb2RlKHVpbnQzMl90IGR3TW9kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5GbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbk1hc2tzKSB7Ci0gIG5GbGFncyA9IE9fQklOQVJZIHwgT19MQVJHRUZJTEU7Ci0gIGlmIChkd01vZGVzICYgRlhfRklMRU1PREVfUmVhZE9ubHkpIHsKLSAgICBuRmxhZ3MgfD0gT19SRE9OTFk7Ci0gICAgbk1hc2tzID0gMDsKLSAgfSBlbHNlIHsKLSAgICBuRmxhZ3MgfD0gT19SRFdSIHwgT19DUkVBVDsKLSAgICBpZiAoZHdNb2RlcyAmIEZYX0ZJTEVNT0RFX1RydW5jYXRlKSB7Ci0gICAgICBuRmxhZ3MgfD0gT19UUlVOQzsKLSAgICB9Ci0gICAgbk1hc2tzID0gU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USDsKLSAgfQotfQotQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OkNGWENSVF9GaWxlQWNjZXNzX1Bvc2l4KCkgOiBtX25GRCgtMSkge30KLUNGWENSVF9GaWxlQWNjZXNzX1Bvc2l4Ojp+Q0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXgoKSB7Ci0gIENsb3NlKCk7Ci19Ci0KLWJvb2wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6Ok9wZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdNb2RlKSB7Ci0gIGlmIChtX25GRCA+IC0xKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbnQzMl90IG5GbGFnczsKLSAgaW50MzJfdCBuTWFza3M7Ci0gIEZYQ1JUX1Bvc2l4X0dldEZpbGVNb2RlKGR3TW9kZSwgbkZsYWdzLCBuTWFza3MpOwotICBtX25GRCA9IG9wZW4oZmlsZU5hbWUuY19zdHIoKSwgbkZsYWdzLCBuTWFza3MpOwotICByZXR1cm4gbV9uRkQgPiAtMTsKLX0KLQotYm9vbCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6T3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd01vZGUpIHsKLSAgcmV0dXJuIE9wZW4oRlhfVVRGOEVuY29kZShmaWxlTmFtZSkuQXNTdHJpbmdDKCksIGR3TW9kZSk7Ci19Ci0KLXZvaWQgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OkNsb3NlKCkgewotICBpZiAobV9uRkQgPCAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGNsb3NlKG1fbkZEKTsKLSAgbV9uRkQgPSAtMTsKLX0KLUZYX0ZJTEVTSVpFIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpHZXRTaXplKCkgY29uc3QgewotICBpZiAobV9uRkQgPCAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgc3RydWN0IHN0YXQgczsKLSAgRlhTWVNfbWVtc2V0KCZzLCAwLCBzaXplb2YocykpOwotICBmc3RhdChtX25GRCwgJnMpOwotICByZXR1cm4gcy5zdF9zaXplOwotfQotRlhfRklMRVNJWkUgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OkdldFBvc2l0aW9uKCkgY29uc3QgewotICBpZiAobV9uRkQgPCAwKSB7Ci0gICAgcmV0dXJuIChGWF9GSUxFU0laRSktMTsKLSAgfQotICByZXR1cm4gbHNlZWsobV9uRkQsIDAsIFNFRUtfQ1VSKTsKLX0KLUZYX0ZJTEVTSVpFIENGWENSVF9GaWxlQWNjZXNzX1Bvc2l4OjpTZXRQb3NpdGlvbihGWF9GSUxFU0laRSBwb3MpIHsKLSAgaWYgKG1fbkZEIDwgMCkgewotICAgIHJldHVybiAoRlhfRklMRVNJWkUpLTE7Ci0gIH0KLSAgcmV0dXJuIGxzZWVrKG1fbkZELCBwb3MsIFNFRUtfU0VUKTsKLX0KLXNpemVfdCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6UmVhZCh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpIHsKLSAgaWYgKG1fbkZEIDwgMCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiByZWFkKG1fbkZELCBwQnVmZmVyLCBzekJ1ZmZlcik7Ci19Ci1zaXplX3QgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OldyaXRlKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikgewotICBpZiAobV9uRkQgPCAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIHdyaXRlKG1fbkZELCBwQnVmZmVyLCBzekJ1ZmZlcik7Ci19Ci1zaXplX3QgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OlJlYWRQb3Modm9pZCogcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3pCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgcG9zKSB7Ci0gIGlmIChtX25GRCA8IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAocG9zID49IEdldFNpemUoKSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIGlmIChTZXRQb3NpdGlvbihwb3MpID09IChGWF9GSUxFU0laRSktMSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBSZWFkKHBCdWZmZXIsIHN6QnVmZmVyKTsKLX0KLXNpemVfdCBDRlhDUlRfRmlsZUFjY2Vzc19Qb3NpeDo6V3JpdGVQb3MoY29uc3Qgdm9pZCogcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHN6QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBwb3MpIHsKLSAgaWYgKG1fbkZEIDwgMCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIGlmIChTZXRQb3NpdGlvbihwb3MpID09IChGWF9GSUxFU0laRSktMSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBXcml0ZShwQnVmZmVyLCBzekJ1ZmZlcik7Ci19Ci0KLWJvb2wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OkZsdXNoKCkgewotICBpZiAobV9uRkQgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gZnN5bmMobV9uRkQpID4gLTE7Ci19Ci0KLWJvb2wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXg6OlRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSkgewotICBpZiAobV9uRkQgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gIWZ0cnVuY2F0ZShtX25GRCwgc3pGaWxlKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Z4Y3J0X3Bvc2l4LmggYi9jb3JlL2Z4Y3J0L2Z4Y3J0X3Bvc2l4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZmFhNWMuLjAwMDAwMDAKLS0tIGEvY29yZS9meGNydC9meGNydF9wb3NpeC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlhDUlRfRlhDUlRfUE9TSVhfSF8KLSNkZWZpbmUgQ09SRV9GWENSVF9GWENSVF9QT1NJWF9IXwotCi0jaW5jbHVkZSAiY29yZS9meGNydC9leHRlbnNpb24uaCIKLQotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfIHx8IFwKLSAgICBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXyB8fCBcCi0gICAgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BTkRST0lEXwotY2xhc3MgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXggOiBwdWJsaWMgSUZYQ1JUX0ZpbGVBY2Nlc3MgewotIHB1YmxpYzoKLSAgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfUG9zaXgoKTsKLSAgfkNGWENSVF9GaWxlQWNjZXNzX1Bvc2l4KCkgb3ZlcnJpZGU7Ci0KLSAgLy8gSUZYQ1JUX0ZpbGVBY2Nlc3M6Ci0gIGJvb2wgT3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLCB1aW50MzJfdCBkd01vZGUpIG92ZXJyaWRlOwotICBib29sIE9wZW4oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBmaWxlTmFtZSwgdWludDMyX3QgZHdNb2RlKSBvdmVycmlkZTsKLSAgdm9pZCBDbG9zZSgpIG92ZXJyaWRlOwotICBGWF9GSUxFU0laRSBHZXRTaXplKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIEZYX0ZJTEVTSVpFIEdldFBvc2l0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIEZYX0ZJTEVTSVpFIFNldFBvc2l0aW9uKEZYX0ZJTEVTSVpFIHBvcykgb3ZlcnJpZGU7Ci0gIHNpemVfdCBSZWFkKHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikgb3ZlcnJpZGU7Ci0gIHNpemVfdCBXcml0ZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpIG92ZXJyaWRlOwotICBzaXplX3QgUmVhZFBvcyh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIsIEZYX0ZJTEVTSVpFIHBvcykgb3ZlcnJpZGU7Ci0gIHNpemVfdCBXcml0ZVBvcyhjb25zdCB2b2lkKiBwQnVmZmVyLAotICAgICAgICAgICAgICAgICAgc2l6ZV90IHN6QnVmZmVyLAotICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgcG9zKSBvdmVycmlkZTsKLSAgYm9vbCBGbHVzaCgpIG92ZXJyaWRlOwotICBib29sIFRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSkgb3ZlcnJpZGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGludDMyX3QgbV9uRkQ7Ci19OwotI2VuZGlmCi0KLSNlbmRpZiAgLy8gQ09SRV9GWENSVF9GWENSVF9QT1NJWF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9meGNydF9zdHJlYW0uY3BwIGIvY29yZS9meGNydC9meGNydF9zdHJlYW0uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWZlNjMyLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjcnQvZnhjcnRfc3RyZWFtLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyZWFtLmgiCi0KLWJvb2wgSUZYX1NlZWthYmxlV3JpdGVTdHJlYW06OldyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKSB7Ci0gIHJldHVybiBXcml0ZUJsb2NrKHBEYXRhLCBHZXRTaXplKCksIHNpemUpOwotfQotCi1ib29sIElGWF9TZWVrYWJsZVJlYWRTdHJlYW06OklzRU9GKCkgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLUZYX0ZJTEVTSVpFIElGWF9TZWVrYWJsZVJlYWRTdHJlYW06OkdldFBvc2l0aW9uKCkgewotICByZXR1cm4gMDsKLX0KLQotc2l6ZV90IElGWF9TZWVrYWJsZVJlYWRTdHJlYW06OlJlYWRCbG9jayh2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSB7Ci0gIHJldHVybiAwOwotfQotCi1ib29sIElGWF9TZWVrYWJsZVN0cmVhbTo6V3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplKSB7Ci0gIHJldHVybiBXcml0ZUJsb2NrKGJ1ZmZlciwgR2V0U2l6ZSgpLCBzaXplKTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvZnhjcnRfd2luZG93cy5jcHAgYi9jb3JlL2Z4Y3J0L2Z4Y3J0X3dpbmRvd3MuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzgzMzg3Li4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjcnQvZnhjcnRfd2luZG93cy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meGNydF93aW5kb3dzLmgiCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotCi0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotCi0vLyBzdGF0aWMKLUlGWENSVF9GaWxlQWNjZXNzKiBJRlhDUlRfRmlsZUFjY2Vzczo6Q3JlYXRlKCkgewotICByZXR1cm4gbmV3IENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OwotfQotCi12b2lkIEZYQ1JUX1dpbmRvd3NfR2V0RmlsZU1vZGUodWludDMyX3QgZHdNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBkd0FjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgZHdTaGFyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgZHdDcmVhdGlvbikgewotICBkd0FjY2VzcyA9IEdFTkVSSUNfUkVBRDsKLSAgZHdTaGFyZSA9IEZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEU7Ci0gIGlmICghKGR3TW9kZSAmIEZYX0ZJTEVNT0RFX1JlYWRPbmx5KSkgewotICAgIGR3QWNjZXNzIHw9IEdFTkVSSUNfV1JJVEU7Ci0gICAgZHdDcmVhdGlvbiA9IChkd01vZGUgJiBGWF9GSUxFTU9ERV9UcnVuY2F0ZSkgPyBDUkVBVEVfQUxXQVlTIDogT1BFTl9BTFdBWVM7Ci0gIH0gZWxzZSB7Ci0gICAgZHdDcmVhdGlvbiA9IE9QRU5fRVhJU1RJTkc7Ci0gIH0KLX0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotV0lOQkFTRUFQSSBCT09MIFdJTkFQSSBHZXRGaWxlU2l6ZUV4KEhBTkRMRSBoRmlsZSwgUExBUkdFX0lOVEVHRVIgbHBGaWxlU2l6ZSk7Ci1XSU5CQVNFQVBJIEJPT0wgV0lOQVBJIFNldEZpbGVQb2ludGVyRXgoSEFORExFIGhGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExBUkdFX0lOVEVHRVIgbGlEaXN0YW5jZVRvTW92ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTEFSR0VfSU5URUdFUiBscE5ld0ZpbGVQb2ludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3TW92ZU1ldGhvZCk7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCi1DRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6Q0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQoKSA6IG1faEZpbGUobnVsbHB0cikge30KLQotQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6On5DRlhDUlRfRmlsZUFjY2Vzc19XaW42NCgpIHsKLSAgQ2xvc2UoKTsKLX0KLQotYm9vbCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6T3Blbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd01vZGUpIHsKLSAgaWYgKG1faEZpbGUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHVpbnQzMl90IGR3QWNjZXNzLCBkd1NoYXJlLCBkd0NyZWF0aW9uOwotICBGWENSVF9XaW5kb3dzX0dldEZpbGVNb2RlKGR3TW9kZSwgZHdBY2Nlc3MsIGR3U2hhcmUsIGR3Q3JlYXRpb24pOwotICBtX2hGaWxlID0gOjpDcmVhdGVGaWxlQShmaWxlTmFtZS5jX3N0cigpLCBkd0FjY2VzcywgZHdTaGFyZSwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZHdDcmVhdGlvbiwgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBudWxscHRyKTsKLSAgaWYgKG1faEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0gICAgbV9oRmlsZSA9IG51bGxwdHI7Ci0KLSAgcmV0dXJuICEhbV9oRmlsZTsKLX0KLQotYm9vbCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6T3Blbihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGZpbGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd01vZGUpIHsKLSAgaWYgKG1faEZpbGUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHVpbnQzMl90IGR3QWNjZXNzLCBkd1NoYXJlLCBkd0NyZWF0aW9uOwotICBGWENSVF9XaW5kb3dzX0dldEZpbGVNb2RlKGR3TW9kZSwgZHdBY2Nlc3MsIGR3U2hhcmUsIGR3Q3JlYXRpb24pOwotICBtX2hGaWxlID0gOjpDcmVhdGVGaWxlVygoTFBDV1NUUilmaWxlTmFtZS5jX3N0cigpLCBkd0FjY2VzcywgZHdTaGFyZSwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZHdDcmVhdGlvbiwgRklMRV9BVFRSSUJVVEVfTk9STUFMLCBudWxscHRyKTsKLSAgaWYgKG1faEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCi0gICAgbV9oRmlsZSA9IG51bGxwdHI7Ci0KLSAgcmV0dXJuICEhbV9oRmlsZTsKLX0KLQotdm9pZCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6Q2xvc2UoKSB7Ci0gIGlmICghbV9oRmlsZSkKLSAgICByZXR1cm47Ci0KLSAgOjpDbG9zZUhhbmRsZShtX2hGaWxlKTsKLSAgbV9oRmlsZSA9IG51bGxwdHI7Ci19Ci0KLUZYX0ZJTEVTSVpFIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpHZXRTaXplKCkgY29uc3QgewotICBpZiAoIW1faEZpbGUpCi0gICAgcmV0dXJuIDA7Ci0KLSAgTEFSR0VfSU5URUdFUiBzaXplID0ge307Ci0gIGlmICghOjpHZXRGaWxlU2l6ZUV4KG1faEZpbGUsICZzaXplKSkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gKEZYX0ZJTEVTSVpFKXNpemUuUXVhZFBhcnQ7Ci19Ci0KLUZYX0ZJTEVTSVpFIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpHZXRQb3NpdGlvbigpIGNvbnN0IHsKLSAgaWYgKCFtX2hGaWxlKQotICAgIHJldHVybiAoRlhfRklMRVNJWkUpLTE7Ci0KLSAgTEFSR0VfSU5URUdFUiBkaXN0ID0ge307Ci0gIExBUkdFX0lOVEVHRVIgbmV3UG9zID0ge307Ci0gIGlmICghOjpTZXRGaWxlUG9pbnRlckV4KG1faEZpbGUsIGRpc3QsICZuZXdQb3MsIEZJTEVfQ1VSUkVOVCkpCi0gICAgcmV0dXJuIChGWF9GSUxFU0laRSktMTsKLQotICByZXR1cm4gKEZYX0ZJTEVTSVpFKW5ld1Bvcy5RdWFkUGFydDsKLX0KLQotRlhfRklMRVNJWkUgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OlNldFBvc2l0aW9uKEZYX0ZJTEVTSVpFIHBvcykgewotICBpZiAoIW1faEZpbGUpCi0gICAgcmV0dXJuIChGWF9GSUxFU0laRSktMTsKLQotICBMQVJHRV9JTlRFR0VSIGRpc3Q7Ci0gIGRpc3QuUXVhZFBhcnQgPSBwb3M7Ci0gIExBUkdFX0lOVEVHRVIgbmV3UG9zID0ge307Ci0gIGlmICghOjpTZXRGaWxlUG9pbnRlckV4KG1faEZpbGUsIGRpc3QsICZuZXdQb3MsIEZJTEVfQkVHSU4pKQotICAgIHJldHVybiAoRlhfRklMRVNJWkUpLTE7Ci0KLSAgcmV0dXJuIChGWF9GSUxFU0laRSluZXdQb3MuUXVhZFBhcnQ7Ci19Ci0KLXNpemVfdCBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NDo6UmVhZCh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpIHsKLSAgaWYgKCFtX2hGaWxlKQotICAgIHJldHVybiAwOwotCi0gIHNpemVfdCBzelJlYWQgPSAwOwotICBpZiAoITo6UmVhZEZpbGUobV9oRmlsZSwgcEJ1ZmZlciwgKERXT1JEKXN6QnVmZmVyLCAoTFBEV09SRCkmc3pSZWFkLAotICAgICAgICAgICAgICAgICAgbnVsbHB0cikpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gc3pSZWFkOwotfQotCi1zaXplX3QgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OldyaXRlKGNvbnN0IHZvaWQqIHBCdWZmZXIsIHNpemVfdCBzekJ1ZmZlcikgewotICBpZiAoIW1faEZpbGUpCi0gICAgcmV0dXJuIDA7Ci0KLSAgc2l6ZV90IHN6V3JpdGUgPSAwOwotICBpZiAoITo6V3JpdGVGaWxlKG1faEZpbGUsIHBCdWZmZXIsIChEV09SRClzekJ1ZmZlciwgKExQRFdPUkQpJnN6V3JpdGUsCi0gICAgICAgICAgICAgICAgICAgbnVsbHB0cikpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gc3pXcml0ZTsKLX0KLQotc2l6ZV90IENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpSZWFkUG9zKHZvaWQqIHBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHN6QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIHBvcykgewotICBpZiAoIW1faEZpbGUpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKHBvcyA+PSBHZXRTaXplKCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKFNldFBvc2l0aW9uKHBvcykgPT0gKEZYX0ZJTEVTSVpFKS0xKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiBSZWFkKHBCdWZmZXIsIHN6QnVmZmVyKTsKLX0KLQotc2l6ZV90IENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpXcml0ZVBvcyhjb25zdCB2b2lkKiBwQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3pCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIHBvcykgewotICBpZiAoIW1faEZpbGUpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAoU2V0UG9zaXRpb24ocG9zKSA9PSAoRlhfRklMRVNJWkUpLTEpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gV3JpdGUocEJ1ZmZlciwgc3pCdWZmZXIpOwotfQotCi1ib29sIENGWENSVF9GaWxlQWNjZXNzX1dpbjY0OjpGbHVzaCgpIHsKLSAgaWYgKCFtX2hGaWxlKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gISE6OkZsdXNoRmlsZUJ1ZmZlcnMobV9oRmlsZSk7Ci19Ci0KLWJvb2wgQ0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQ6OlRydW5jYXRlKEZYX0ZJTEVTSVpFIHN6RmlsZSkgewotICBpZiAoU2V0UG9zaXRpb24oc3pGaWxlKSA9PSAoRlhfRklMRVNJWkUpLTEpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHJldHVybiAhITo6U2V0RW5kT2ZGaWxlKG1faEZpbGUpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L2Z4Y3J0X3dpbmRvd3MuaCBiL2NvcmUvZnhjcnQvZnhjcnRfd2luZG93cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGY5NDgzLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjcnQvZnhjcnRfd2luZG93cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlhDUlRfRlhDUlRfV0lORE9XU19IXwotI2RlZmluZSBDT1JFX0ZYQ1JUX0ZYQ1JUX1dJTkRPV1NfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZXh0ZW5zaW9uLmgiCi0KLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi1jbGFzcyBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NCA6IHB1YmxpYyBJRlhDUlRfRmlsZUFjY2VzcyB7Ci0gcHVibGljOgotICBDRlhDUlRfRmlsZUFjY2Vzc19XaW42NCgpOwotICB+Q0ZYQ1JUX0ZpbGVBY2Nlc3NfV2luNjQoKSBvdmVycmlkZTsKLQotICAvLyBJRlhDUlRfRmlsZUFjY2VzcwotICBib29sIE9wZW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBmaWxlTmFtZSwgdWludDMyX3QgZHdNb2RlKSBvdmVycmlkZTsKLSAgYm9vbCBPcGVuKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZmlsZU5hbWUsIHVpbnQzMl90IGR3TW9kZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgQ2xvc2UoKSBvdmVycmlkZTsKLSAgRlhfRklMRVNJWkUgR2V0U2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwotICBGWF9GSUxFU0laRSBHZXRQb3NpdGlvbigpIGNvbnN0IG92ZXJyaWRlOwotICBGWF9GSUxFU0laRSBTZXRQb3NpdGlvbihGWF9GSUxFU0laRSBwb3MpIG92ZXJyaWRlOwotICBzaXplX3QgUmVhZCh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpIG92ZXJyaWRlOwotICBzaXplX3QgV3JpdGUoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKSBvdmVycmlkZTsKLSAgc2l6ZV90IFJlYWRQb3Modm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpIG92ZXJyaWRlOwotICBzaXplX3QgV3JpdGVQb3MoY29uc3Qgdm9pZCogcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgIHNpemVfdCBzekJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgIEZYX0ZJTEVTSVpFIHBvcykgb3ZlcnJpZGU7Ci0gIGJvb2wgRmx1c2goKSBvdmVycmlkZTsKLSAgYm9vbCBUcnVuY2F0ZShGWF9GSUxFU0laRSBzekZpbGUpIG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICB2b2lkKiBtX2hGaWxlOwotfTsKLSNlbmRpZgotCi0jZW5kaWYgIC8vIENPUkVfRlhDUlRfRlhDUlRfV0lORE9XU19IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9pZnhfZmlsZWFjY2Vzcy5oIGIvY29yZS9meGNydC9pZnhfZmlsZWFjY2Vzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZmUyYjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2lmeF9maWxlYWNjZXNzLmgKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfSUZYX0ZJTEVBQ0NFU1NfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9JRlhfRklMRUFDQ0VTU19IXworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc2FmZV90eXBlcy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKworY2xhc3MgSUZYX0ZpbGVBY2Nlc3MgeworIHB1YmxpYzoKKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxJRlhfRmlsZUFjY2Vzcz4gQ3JlYXRlKCk7CisgIHZpcnR1YWwgfklGWF9GaWxlQWNjZXNzKCkge30KKworICB2aXJ0dWFsIGJvb2wgT3Blbihjb25zdCBCeXRlU3RyaW5nVmlldyYgZmlsZU5hbWUsIHVpbnQzMl90IGR3TW9kZSkgPSAwOworICB2aXJ0dWFsIGJvb2wgT3Blbihjb25zdCBXaWRlU3RyaW5nVmlldyYgZmlsZU5hbWUsIHVpbnQzMl90IGR3TW9kZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgQ2xvc2UoKSA9IDA7CisgIHZpcnR1YWwgRlhfRklMRVNJWkUgR2V0U2l6ZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBGWF9GSUxFU0laRSBHZXRQb3NpdGlvbigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBGWF9GSUxFU0laRSBTZXRQb3NpdGlvbihGWF9GSUxFU0laRSBwb3MpID0gMDsKKyAgdmlydHVhbCBzaXplX3QgUmVhZCh2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc3pCdWZmZXIpID0gMDsKKyAgdmlydHVhbCBzaXplX3QgV3JpdGUoY29uc3Qgdm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyKSA9IDA7CisgIHZpcnR1YWwgc2l6ZV90IFJlYWRQb3Modm9pZCogcEJ1ZmZlciwgc2l6ZV90IHN6QnVmZmVyLCBGWF9GSUxFU0laRSBwb3MpID0gMDsKKyAgdmlydHVhbCBzaXplX3QgV3JpdGVQb3MoY29uc3Qgdm9pZCogcEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHN6QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBwb3MpID0gMDsKKyAgdmlydHVhbCBib29sIEZsdXNoKCkgPSAwOworICB2aXJ0dWFsIGJvb2wgVHJ1bmNhdGUoRlhfRklMRVNJWkUgc3pGaWxlKSA9IDA7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfSUZYX0ZJTEVBQ0NFU1NfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvaWZ4X2xvY2FsZS5oIGIvY29yZS9meGNydC9pZnhfbG9jYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxOGU3YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvaWZ4X2xvY2FsZS5oCkBAIC0wLDAgKzEsNzYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX0lGWF9MT0NBTEVfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9JRlhfTE9DQUxFX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9kYXRldGltZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisKK2VudW0gRlhfTE9DQUxFTlVNU1lNQk9MIHsKKyAgRlhfTE9DQUxFTlVNU1lNQk9MX0RlY2ltYWwsCisgIEZYX0xPQ0FMRU5VTVNZTUJPTF9Hcm91cGluZywKKyAgRlhfTE9DQUxFTlVNU1lNQk9MX1BlcmNlbnQsCisgIEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywKKyAgRlhfTE9DQUxFTlVNU1lNQk9MX1plcm8sCisgIEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbCwKKyAgRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5TmFtZSwKK307CisKK2VudW0gRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSB7CisgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRGVmYXVsdCwKKyAgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9TaG9ydCwKKyAgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW0sCisgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbCwKKyAgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9Mb25nLAorfTsKKworZW51bSBGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSB7CisgIEZYX0xPQ0FMRU5VTVBBVFRFUk5fUGVyY2VudCwKKyAgRlhfTE9DQUxFTlVNUEFUVEVSTl9DdXJyZW5jeSwKKyAgRlhfTE9DQUxFTlVNUEFUVEVSTl9EZWNpbWFsLAorICBGWF9MT0NBTEVOVU1QQVRURVJOX0ludGVnZXIsCit9OworCitlbnVtIEZYX0xPQ0FMRUNBVEVHT1JZIHsKKyAgRlhfTE9DQUxFQ0FURUdPUllfVW5rbm93biwKKyAgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZSwKKyAgRlhfTE9DQUxFQ0FURUdPUllfVGltZSwKKyAgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWUsCisgIEZYX0xPQ0FMRUNBVEVHT1JZX051bSwKKyAgRlhfTE9DQUxFQ0FURUdPUllfVGV4dCwKKyAgRlhfTE9DQUxFQ0FURUdPUllfWmVybywKKyAgRlhfTE9DQUxFQ0FURUdPUllfTnVsbCwKK307CisKK2VudW0gRlhfREFURVRJTUVUWVBFIHsKKyAgRlhfREFURVRJTUVUWVBFX1Vua25vd24sCisgIEZYX0RBVEVUSU1FVFlQRV9EYXRlLAorICBGWF9EQVRFVElNRVRZUEVfVGltZSwKKyAgRlhfREFURVRJTUVUWVBFX0RhdGVUaW1lLAorICBGWF9EQVRFVElNRVRZUEVfVGltZURhdGUsCit9OworCitjbGFzcyBJRlhfTG9jYWxlIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklGWF9Mb2NhbGUoKSB7fQorCisgIHZpcnR1YWwgV2lkZVN0cmluZyBHZXROYW1lKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIFdpZGVTdHJpbmcgR2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MIGVUeXBlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgV2lkZVN0cmluZyBHZXREYXRlVGltZVN5bWJvbHMoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgV2lkZVN0cmluZyBHZXRNb250aE5hbWUoaW50MzJfdCBuTW9udGgsIGJvb2wgYkFiYnIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBXaWRlU3RyaW5nIEdldERheU5hbWUoaW50MzJfdCBuV2VlaywgYm9vbCBiQWJicikgY29uc3QgPSAwOworICB2aXJ0dWFsIFdpZGVTdHJpbmcgR2V0TWVyaWRpZW1OYW1lKGJvb2wgYkFNKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgRlhfVElNRVpPTkUgR2V0VGltZVpvbmUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgV2lkZVN0cmluZyBHZXRFcmFOYW1lKGJvb2wgYkFEKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgV2lkZVN0cmluZyBHZXREYXRlUGF0dGVybigKKyAgICAgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBXaWRlU3RyaW5nIEdldFRpbWVQYXR0ZXJuKAorICAgICAgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIFdpZGVTdHJpbmcgR2V0TnVtUGF0dGVybihGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSBlVHlwZSkgY29uc3QgPSAwOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0lGWF9MT0NBTEVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvaWZ4X3BhdXNlaW5kaWNhdG9yLmggYi9jb3JlL2Z4Y3J0L2lmeF9wYXVzZWluZGljYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YzYwMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L2lmeF9wYXVzZWluZGljYXRvci5oCkBAIC0wLDAgKzEsMTYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX0lGWF9QQVVTRUlORElDQVRPUl9IXworI2RlZmluZSBDT1JFX0ZYQ1JUX0lGWF9QQVVTRUlORElDQVRPUl9IXworCitjbGFzcyBJRlhfUGF1c2VJbmRpY2F0b3IgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+SUZYX1BhdXNlSW5kaWNhdG9yKCkge30KKyAgdmlydHVhbCBib29sIE5lZWRUb1BhdXNlTm93KCkgPSAwOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX0lGWF9QQVVTRUlORElDQVRPUl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9tYXliZV9vd25lZC5oIGIvY29yZS9meGNydC9tYXliZV9vd25lZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZGQ2ODYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L21heWJlX293bmVkLmgKQEAgLTAsMCArMSw5MiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIENPUkVfRlhDUlRfTUFZQkVfT1dORURfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9NQVlCRV9PV05FRF9IXworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9tZW1vcnkuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorCituYW1lc3BhY2UgZnhjcnQgeworCisvLyBBIHRlbXBsYXRlIHRoYXQgY2FuIGhvbGQgZWl0aGVyIG93bmVkIG9yIHVub3duZWQgcmVmZXJlbmNlcywgYW5kIGNsZWFucyB1cAorLy8gYXBwcm9wcmlhdGVseS4gIFBvc3NpYmx5IHRoZSBtb3N0IHBlcm5pY2lvdXMgYW50aS1wYXR0ZXJuIGltYWdpbmFibGUsIGJ1dAorLy8gaXQgY3JvcHMgdXAgdGhyb3VnaG91dCB0aGUgY29kZWJhc2UgZHVlIHRvIGEgZGVzaXJlIHRvIGF2b2lkIGNvcHlpbmctaW4KKy8vIG9iamVjdHMgb3IgZGF0YS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBEID0gc3RkOjpkZWZhdWx0X2RlbGV0ZTxUPj4KK2NsYXNzIE1heWJlT3duZWQgeworIHB1YmxpYzoKKyAgTWF5YmVPd25lZCgpIDogbV9wT2JqKG51bGxwdHIpIHt9CisgIGV4cGxpY2l0IE1heWJlT3duZWQoVCogcHRyKSA6IG1fcE9iaihwdHIpIHt9CisgIGV4cGxpY2l0IE1heWJlT3duZWQoc3RkOjp1bmlxdWVfcHRyPFQsIEQ+IHB0cikKKyAgICAgIDogbV9wT3duZWRPYmooc3RkOjptb3ZlKHB0cikpLCBtX3BPYmoobV9wT3duZWRPYmouZ2V0KCkpIHt9CisKKyAgTWF5YmVPd25lZChjb25zdCBNYXliZU93bmVkJiB0aGF0KSA9IGRlbGV0ZTsKKyAgTWF5YmVPd25lZChNYXliZU93bmVkJiYgdGhhdCkgbm9leGNlcHQKKyAgICAgIDogbV9wT3duZWRPYmoodGhhdC5tX3BPd25lZE9iai5yZWxlYXNlKCkpLCBtX3BPYmoodGhhdC5tX3BPYmopIHsKKyAgICB0aGF0Lm1fcE9iaiA9IG51bGxwdHI7CisgIH0KKworICB2b2lkIFJlc2V0KHN0ZDo6dW5pcXVlX3B0cjxULCBEPiBwdHIpIHsKKyAgICBtX3BPd25lZE9iaiA9IHN0ZDo6bW92ZShwdHIpOworICAgIG1fcE9iaiA9IG1fcE93bmVkT2JqLmdldCgpOworICB9CisgIHZvaWQgUmVzZXQoVCogcHRyID0gbnVsbHB0cikgeworICAgIG1fcE93bmVkT2JqLnJlc2V0KCk7CisgICAgbV9wT2JqID0gcHRyOworICB9CisKKyAgYm9vbCBJc093bmVkKCkgY29uc3QgeyByZXR1cm4gISFtX3BPd25lZE9iajsgfQorICBUKiBHZXQoKSBjb25zdCB7IHJldHVybiBtX3BPYmo7IH0KKyAgc3RkOjp1bmlxdWVfcHRyPFQsIEQ+IFJlbGVhc2UoKSB7CisgICAgQVNTRVJUKElzT3duZWQoKSk7CisgICAgcmV0dXJuIHN0ZDo6bW92ZShtX3BPd25lZE9iaik7CisgIH0KKworICBNYXliZU93bmVkJiBvcGVyYXRvcj0oY29uc3QgTWF5YmVPd25lZCYgdGhhdCkgPSBkZWxldGU7CisgIE1heWJlT3duZWQmIG9wZXJhdG9yPShNYXliZU93bmVkJiYgdGhhdCkgeworICAgIG1fcE93bmVkT2JqID0gc3RkOjptb3ZlKHRoYXQubV9wT3duZWRPYmopOworICAgIG1fcE9iaiA9IHRoYXQubV9wT2JqOworICAgIHRoYXQubV9wT2JqID0gbnVsbHB0cjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgTWF5YmVPd25lZCYgb3BlcmF0b3I9KFQqIHB0cikgeworICAgIFJlc2V0KHB0cik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIE1heWJlT3duZWQmIG9wZXJhdG9yPShzdGQ6OnVuaXF1ZV9wdHI8VCwgRD4gcHRyKSB7CisgICAgUmVzZXQoc3RkOjptb3ZlKHB0cikpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYXliZU93bmVkJiB0aGF0KSBjb25zdCB7IHJldHVybiBHZXQoKSA9PSB0aGF0LkdldCgpOyB9CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8VCwgRD4mIHB0cikgY29uc3QgeworICAgIHJldHVybiBHZXQoKSA9PSBwdHIuZ2V0KCk7CisgIH0KKyAgYm9vbCBvcGVyYXRvcj09KFQqIHB0cikgY29uc3QgeyByZXR1cm4gR2V0KCkgPT0gcHRyOyB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1heWJlT3duZWQmIHRoYXQpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gdGhhdCk7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxULCBEPiBwdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSBwdHIpOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShUKiBwdHIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gcHRyKTsgfQorCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAhIW1fcE9iajsgfQorICBUJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqbV9wT2JqOyB9CisgIFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBtX3BPYmo7IH0KKworIHByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxULCBEPiBtX3BPd25lZE9iajsKKyAgVCogbV9wT2JqOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGZ4Y3J0CisKK3VzaW5nIGZ4Y3J0OjpNYXliZU93bmVkOworCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfTUFZQkVfT1dORURfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvbWF5YmVfb3duZWRfdW5pdHRlc3QuY3BwIGIvY29yZS9meGNydC9tYXliZV9vd25lZF91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE4MjY0NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvbWF5YmVfb3duZWRfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTgxIEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L21heWJlX293bmVkLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgZnhjcnQgeworbmFtZXNwYWNlIHsKKworY2xhc3MgUHNldWRvRGVsZXRhYmxlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFBzZXVkb0RlbGV0YWJsZShpbnQgaWQsIGludCogY291bnRfbG9jYXRpb24pCisgICAgICA6IGlkXyhpZCksIGNvdW50X2xvY2F0aW9uXyhjb3VudF9sb2NhdGlvbikge30KKyAgflBzZXVkb0RlbGV0YWJsZSgpIHsgKysoKmNvdW50X2xvY2F0aW9uXyk7IH0KKyAgaW50IEdldElEKCkgY29uc3QgeyByZXR1cm4gaWRfOyB9CisKKyBwcml2YXRlOgorICBpbnQgaWRfOworICBpbnQqIGNvdW50X2xvY2F0aW9uXzsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitURVNUKE1heWJlT3duZWQsIE51bGwpIHsKKyAgTWF5YmVPd25lZDxQc2V1ZG9EZWxldGFibGU+IHB0cjE7CisgIEVYUEVDVF9GQUxTRShwdHIxLklzT3duZWQoKSk7CisgIEVYUEVDVF9GQUxTRShwdHIxKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIHB0cjEuR2V0KCkpOworCisgIE1heWJlT3duZWQ8UHNldWRvRGVsZXRhYmxlPiBwdHIyOworICBFWFBFQ1RfVFJVRShwdHIxID09IHB0cjIpOworICBFWFBFQ1RfRkFMU0UocHRyMSAhPSBwdHIyKTsKK30KKworVEVTVChNYXliZU93bmVkLCBOb3RPd25lZCkgeworICBpbnQgZGVsZXRlX2NvdW50ID0gMDsKKyAgUHNldWRvRGVsZXRhYmxlIHRoaW5nMSgxMDAsICZkZWxldGVfY291bnQpOworICB7CisgICAgTWF5YmVPd25lZDxQc2V1ZG9EZWxldGFibGU+IHB0cigmdGhpbmcxKTsKKyAgICBFWFBFQ1RfRkFMU0UocHRyLklzT3duZWQoKSk7CisgICAgRVhQRUNUX0VRKHB0ci5HZXQoKSwgJnRoaW5nMSk7CisgICAgRVhQRUNUX0VRKDEwMCwgcHRyLT5HZXRJRCgpKTsKKyAgICBFWFBFQ1RfVFJVRShwdHIgPT0gJnRoaW5nMSk7CisgICAgRVhQRUNUX0ZBTFNFKHB0ciAhPSAmdGhpbmcxKTsKKworICAgIE1heWJlT3duZWQ8UHNldWRvRGVsZXRhYmxlPiBlbXB0eTsKKyAgICBFWFBFQ1RfRkFMU0UocHRyID09IGVtcHR5KTsKKyAgICBFWFBFQ1RfVFJVRShwdHIgIT0gZW1wdHkpOworICB9CisgIEVYUEVDVF9FUSgwLCBkZWxldGVfY291bnQpOworCisgIGRlbGV0ZV9jb3VudCA9IDA7CisgIFBzZXVkb0RlbGV0YWJsZSB0aGluZzIoMjAwLCAmZGVsZXRlX2NvdW50KTsKKyAgeworICAgIE1heWJlT3duZWQ8UHNldWRvRGVsZXRhYmxlPiBwdHIoJnRoaW5nMSk7CisgICAgcHRyID0gJnRoaW5nMjsKKyAgICBFWFBFQ1RfRkFMU0UocHRyLklzT3duZWQoKSk7CisgICAgRVhQRUNUX0VRKHB0ci5HZXQoKSwgJnRoaW5nMik7CisgICAgRVhQRUNUX0VRKDIwMCwgcHRyLT5HZXRJRCgpKTsKKyAgfQorICBFWFBFQ1RfRVEoMCwgZGVsZXRlX2NvdW50KTsKKworICBkZWxldGVfY291bnQgPSAwOworICBpbnQgb3duZWRfZGVsZXRlX2NvdW50ID0gMDsKKyAgeworICAgIE1heWJlT3duZWQ8UHNldWRvRGVsZXRhYmxlPiBwdHIoJnRoaW5nMSk7CisgICAgRVhQRUNUX0VRKDEwMCwgcHRyLT5HZXRJRCgpKTsKKyAgICBwdHIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8UHNldWRvRGVsZXRhYmxlPigzMDAsICZvd25lZF9kZWxldGVfY291bnQpOworICAgIEVYUEVDVF9UUlVFKHB0ci5Jc093bmVkKCkpOworICAgIEVYUEVDVF9FUSgzMDAsIHB0ci0+R2V0SUQoKSk7CisgIH0KKyAgRVhQRUNUX0VRKDAsIGRlbGV0ZV9jb3VudCk7CisgIEVYUEVDVF9FUSgxLCBvd25lZF9kZWxldGVfY291bnQpOworfQorCitURVNUKE1heWJlT3duZWQsIE93bmVkKSB7CisgIGludCBkZWxldGVfY291bnQgPSAwOworICB7CisgICAgTWF5YmVPd25lZDxQc2V1ZG9EZWxldGFibGU+IHB0cigKKyAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPFBzZXVkb0RlbGV0YWJsZT4oMTAwLCAmZGVsZXRlX2NvdW50KSk7CisgICAgRVhQRUNUX1RSVUUocHRyLklzT3duZWQoKSk7CisgICAgRVhQRUNUX0VRKDEwMCwgcHRyLT5HZXRJRCgpKTsKKworICAgIE1heWJlT3duZWQ8UHNldWRvRGVsZXRhYmxlPiBlbXB0eTsKKyAgICBFWFBFQ1RfRkFMU0UocHRyID09IGVtcHR5KTsKKyAgICBFWFBFQ1RfVFJVRShwdHIgIT0gZW1wdHkpOworICB9CisgIEVYUEVDVF9FUSgxLCBkZWxldGVfY291bnQpOworCisgIGRlbGV0ZV9jb3VudCA9IDA7CisgIHsKKyAgICBNYXliZU93bmVkPFBzZXVkb0RlbGV0YWJsZT4gcHRyKAorICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8UHNldWRvRGVsZXRhYmxlPigyMDAsICZkZWxldGVfY291bnQpKTsKKyAgICBwdHIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8UHNldWRvRGVsZXRhYmxlPigzMDAsICZkZWxldGVfY291bnQpOworICAgIEVYUEVDVF9UUlVFKHB0ci5Jc093bmVkKCkpOworICAgIEVYUEVDVF9FUSgzMDAsIHB0ci0+R2V0SUQoKSk7CisgICAgRVhQRUNUX0VRKDEsIGRlbGV0ZV9jb3VudCk7CisgIH0KKyAgRVhQRUNUX0VRKDIsIGRlbGV0ZV9jb3VudCk7CisKKyAgZGVsZXRlX2NvdW50ID0gMDsKKyAgaW50IHVub3duZWRfZGVsZXRlX2NvdW50ID0gMDsKKyAgUHNldWRvRGVsZXRhYmxlIHRoaW5nMig0MDAsICZ1bm93bmVkX2RlbGV0ZV9jb3VudCk7CisgIHsKKyAgICBNYXliZU93bmVkPFBzZXVkb0RlbGV0YWJsZT4gcHRyKAorICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8UHNldWRvRGVsZXRhYmxlPig1MDAsICZkZWxldGVfY291bnQpKTsKKyAgICBwdHIgPSAmdGhpbmcyOworICAgIEVYUEVDVF9GQUxTRShwdHIuSXNPd25lZCgpKTsKKyAgICBFWFBFQ1RfRVEoNDAwLCBwdHItPkdldElEKCkpOworICAgIEVYUEVDVF9FUSgxLCBkZWxldGVfY291bnQpOworICAgIEVYUEVDVF9FUSgwLCB1bm93bmVkX2RlbGV0ZV9jb3VudCk7CisgIH0KKyAgRVhQRUNUX0VRKDEsIGRlbGV0ZV9jb3VudCk7CisgIEVYUEVDVF9FUSgwLCB1bm93bmVkX2RlbGV0ZV9jb3VudCk7Cit9CisKK1RFU1QoTWF5YmVPd25lZCwgUmVsZWFzZSkgeworICBpbnQgZGVsZXRlX2NvdW50ID0gMDsKKyAgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxQc2V1ZG9EZWxldGFibGU+IHN0b2xlbjsKKyAgICB7CisgICAgICBNYXliZU93bmVkPFBzZXVkb0RlbGV0YWJsZT4gcHRyKAorICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxQc2V1ZG9EZWxldGFibGU+KDEwMCwgJmRlbGV0ZV9jb3VudCkpOworICAgICAgRVhQRUNUX1RSVUUocHRyLklzT3duZWQoKSk7CisgICAgICBzdG9sZW4gPSBwdHIuUmVsZWFzZSgpOworICAgICAgRVhQRUNUX0ZBTFNFKHB0ci5Jc093bmVkKCkpOworICAgICAgRVhQRUNUX0VRKHB0ciwgc3RvbGVuKTsKKyAgICAgIEVYUEVDVF9FUSgwLCBkZWxldGVfY291bnQpOworICAgIH0KKyAgICBFWFBFQ1RfRVEoMCwgZGVsZXRlX2NvdW50KTsKKyAgfQorICBFWFBFQ1RfRVEoMSwgZGVsZXRlX2NvdW50KTsKK30KKworVEVTVChNYXliZU93bmVkLCBNb3ZlKSB7CisgIGludCBkZWxldGVfY291bnQgPSAwOworICBQc2V1ZG9EZWxldGFibGUgdGhpbmcxKDEwMCwgJmRlbGV0ZV9jb3VudCk7CisgIHsKKyAgICBNYXliZU93bmVkPFBzZXVkb0RlbGV0YWJsZT4gcHRyMSgmdGhpbmcxKTsKKyAgICBNYXliZU93bmVkPFBzZXVkb0RlbGV0YWJsZT4gcHRyMigKKyAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPFBzZXVkb0RlbGV0YWJsZT4oMjAwLCAmZGVsZXRlX2NvdW50KSk7CisgICAgRVhQRUNUX0ZBTFNFKHB0cjEuSXNPd25lZCgpKTsKKyAgICBFWFBFQ1RfVFJVRShwdHIyLklzT3duZWQoKSk7CisKKyAgICBNYXliZU93bmVkPFBzZXVkb0RlbGV0YWJsZT4gcHRyMyhzdGQ6Om1vdmUocHRyMSkpOworICAgIE1heWJlT3duZWQ8UHNldWRvRGVsZXRhYmxlPiBwdHI0KHN0ZDo6bW92ZShwdHIyKSk7CisgICAgRVhQRUNUX0ZBTFNFKHB0cjEuSXNPd25lZCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UocHRyMi5Jc093bmVkKCkpOworICAgIEVYUEVDVF9GQUxTRShwdHIzLklzT3duZWQoKSk7CisgICAgRVhQRUNUX1RSVUUocHRyNC5Jc093bmVkKCkpOworICAgIEVYUEVDVF9FUSgwLCBkZWxldGVfY291bnQpOworICAgIEVYUEVDVF9FUShudWxscHRyLCBwdHIxLkdldCgpKTsKKyAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcHRyMi5HZXQoKSk7CisgICAgRVhQRUNUX0VRKDEwMCwgcHRyMy0+R2V0SUQoKSk7CisgICAgRVhQRUNUX0VRKDIwMCwgcHRyNC0+R2V0SUQoKSk7CisKKyAgICBNYXliZU93bmVkPFBzZXVkb0RlbGV0YWJsZT4gcHRyNTsKKyAgICBNYXliZU93bmVkPFBzZXVkb0RlbGV0YWJsZT4gcHRyNjsKKyAgICBwdHI1ID0gc3RkOjptb3ZlKHB0cjMpOworICAgIHB0cjYgPSBzdGQ6Om1vdmUocHRyNCk7CisgICAgRVhQRUNUX0ZBTFNFKHB0cjMuSXNPd25lZCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UocHRyNC5Jc093bmVkKCkpOworICAgIEVYUEVDVF9GQUxTRShwdHI1LklzT3duZWQoKSk7CisgICAgRVhQRUNUX1RSVUUocHRyNi5Jc093bmVkKCkpOworICAgIEVYUEVDVF9FUSgwLCBkZWxldGVfY291bnQpOworICAgIEVYUEVDVF9FUShudWxscHRyLCBwdHIzLkdldCgpKTsKKyAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcHRyNC5HZXQoKSk7CisgICAgRVhQRUNUX0VRKDEwMCwgcHRyNS0+R2V0SUQoKSk7CisgICAgRVhQRUNUX0VRKDIwMCwgcHRyNi0+R2V0SUQoKSk7CisgIH0KKyAgRVhQRUNUX0VRKDEsIGRlbGV0ZV9jb3VudCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBmeGNydApkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9vYnNlcnZhYmxlLmggYi9jb3JlL2Z4Y3J0L29ic2VydmFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDEzYjc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9vYnNlcnZhYmxlLmgKQEAgLTAsMCArMSw4NyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIENPUkVfRlhDUlRfT0JTRVJWQUJMRV9IXworI2RlZmluZSBDT1JFX0ZYQ1JUX09CU0VSVkFCTEVfSF8KKworI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorCituYW1lc3BhY2UgZnhjcnQgeworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NsYXNzIE9ic2VydmFibGUgeworIHB1YmxpYzoKKyAgY2xhc3MgT2JzZXJ2ZWRQdHIgeworICAgcHVibGljOgorICAgIE9ic2VydmVkUHRyKCkgOiBtX3BPYnNlcnZhYmxlKG51bGxwdHIpIHt9CisgICAgZXhwbGljaXQgT2JzZXJ2ZWRQdHIoVCogcE9ic2VydmFibGUpIDogbV9wT2JzZXJ2YWJsZShwT2JzZXJ2YWJsZSkgeworICAgICAgaWYgKG1fcE9ic2VydmFibGUpCisgICAgICAgIG1fcE9ic2VydmFibGUtPkFkZE9ic2VydmVkUHRyKHRoaXMpOworICAgIH0KKyAgICBPYnNlcnZlZFB0cihjb25zdCBPYnNlcnZlZFB0ciYgdGhhdCkgOiBPYnNlcnZlZFB0cih0aGF0LkdldCgpKSB7fQorICAgIH5PYnNlcnZlZFB0cigpIHsKKyAgICAgIGlmIChtX3BPYnNlcnZhYmxlKQorICAgICAgICBtX3BPYnNlcnZhYmxlLT5SZW1vdmVPYnNlcnZlZFB0cih0aGlzKTsKKyAgICB9CisgICAgdm9pZCBSZXNldChUKiBwT2JzZXJ2YWJsZSA9IG51bGxwdHIpIHsKKyAgICAgIGlmIChtX3BPYnNlcnZhYmxlKQorICAgICAgICBtX3BPYnNlcnZhYmxlLT5SZW1vdmVPYnNlcnZlZFB0cih0aGlzKTsKKyAgICAgIG1fcE9ic2VydmFibGUgPSBwT2JzZXJ2YWJsZTsKKyAgICAgIGlmIChtX3BPYnNlcnZhYmxlKQorICAgICAgICBtX3BPYnNlcnZhYmxlLT5BZGRPYnNlcnZlZFB0cih0aGlzKTsKKyAgICB9CisgICAgdm9pZCBPbkRlc3Ryb3koKSB7CisgICAgICBBU1NFUlQobV9wT2JzZXJ2YWJsZSk7CisgICAgICBtX3BPYnNlcnZhYmxlID0gbnVsbHB0cjsKKyAgICB9CisgICAgT2JzZXJ2ZWRQdHImIG9wZXJhdG9yPShjb25zdCBPYnNlcnZlZFB0ciYgdGhhdCkgeworICAgICAgUmVzZXQodGhhdC5HZXQoKSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBPYnNlcnZlZFB0ciYgdGhhdCkgY29uc3QgeworICAgICAgcmV0dXJuIG1fcE9ic2VydmFibGUgPT0gdGhhdC5tX3BPYnNlcnZhYmxlOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgT2JzZXJ2ZWRQdHImIHRoYXQpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gdGhhdCk7IH0KKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gISFtX3BPYnNlcnZhYmxlOyB9CisgICAgVCogR2V0KCkgY29uc3QgeyByZXR1cm4gbV9wT2JzZXJ2YWJsZTsgfQorICAgIFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICptX3BPYnNlcnZhYmxlOyB9CisgICAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIG1fcE9ic2VydmFibGU7IH0KKworICAgcHJpdmF0ZToKKyAgICBUKiBtX3BPYnNlcnZhYmxlOworICB9OworCisgIE9ic2VydmFibGUoKSA9IGRlZmF1bHQ7CisgIE9ic2VydmFibGUoY29uc3QgT2JzZXJ2YWJsZSYgdGhhdCkgPSBkZWxldGU7CisgIH5PYnNlcnZhYmxlKCkgeyBOb3RpZnlPYnNlcnZlZFB0cnMoKTsgfQorICB2b2lkIEFkZE9ic2VydmVkUHRyKE9ic2VydmVkUHRyKiBwT2JzZXJ2ZWRQdHIpIHsKKyAgICBBU1NFUlQoIXBkZml1bTo6Q29udGFpbnNLZXkobV9PYnNlcnZlZFB0cnMsIHBPYnNlcnZlZFB0cikpOworICAgIG1fT2JzZXJ2ZWRQdHJzLmluc2VydChwT2JzZXJ2ZWRQdHIpOworICB9CisgIHZvaWQgUmVtb3ZlT2JzZXJ2ZWRQdHIoT2JzZXJ2ZWRQdHIqIHBPYnNlcnZlZFB0cikgeworICAgIEFTU0VSVChwZGZpdW06OkNvbnRhaW5zS2V5KG1fT2JzZXJ2ZWRQdHJzLCBwT2JzZXJ2ZWRQdHIpKTsKKyAgICBtX09ic2VydmVkUHRycy5lcmFzZShwT2JzZXJ2ZWRQdHIpOworICB9CisgIHZvaWQgTm90aWZ5T2JzZXJ2ZWRQdHJzKCkgeworICAgIGZvciAoYXV0byogcE9ic2VydmVkUHRyIDogbV9PYnNlcnZlZFB0cnMpCisgICAgICBwT2JzZXJ2ZWRQdHItPk9uRGVzdHJveSgpOworICAgIG1fT2JzZXJ2ZWRQdHJzLmNsZWFyKCk7CisgIH0KKyAgT2JzZXJ2YWJsZSYgb3BlcmF0b3I9KGNvbnN0IE9ic2VydmFibGUmIHRoYXQpID0gZGVsZXRlOworCisgcHJvdGVjdGVkOgorICBzaXplX3QgQWN0aXZlT2JzZXJ2ZWRQdHJzRm9yVGVzdGluZygpIGNvbnN0IHsgcmV0dXJuIG1fT2JzZXJ2ZWRQdHJzLnNpemUoKTsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjpzZXQ8T2JzZXJ2ZWRQdHIqPiBtX09ic2VydmVkUHRyczsKK307CisKK30gIC8vIG5hbWVzcGFjZSBmeGNydAorCit1c2luZyBmeGNydDo6T2JzZXJ2YWJsZTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX09CU0VSVkFCTEVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvb2JzZXJ2YWJsZV91bml0dGVzdC5jcHAgYi9jb3JlL2Z4Y3J0L29ic2VydmFibGVfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNjQ3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L29ic2VydmFibGVfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTg4IEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L29ic2VydmFibGUuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSBmeGNydCB7CituYW1lc3BhY2UgeworCitjbGFzcyBQc2V1ZG9PYnNlcnZhYmxlIDogcHVibGljIE9ic2VydmFibGU8UHNldWRvT2JzZXJ2YWJsZT4geworIHB1YmxpYzoKKyAgUHNldWRvT2JzZXJ2YWJsZSgpIHt9CisgIGludCBTb21lTWV0aG9kKCkgeyByZXR1cm4gNDI7IH0KKyAgc2l6ZV90IEFjdGl2ZU9ic2VydmVkUHRycygpIGNvbnN0IHsgcmV0dXJuIEFjdGl2ZU9ic2VydmVkUHRyc0ZvclRlc3RpbmcoKTsgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK1RFU1QoT2JzZXJ2ZVB0ciwgTnVsbCkgeworICBQc2V1ZG9PYnNlcnZhYmxlOjpPYnNlcnZlZFB0ciBwdHI7CisgIEVYUEVDVF9FUShudWxscHRyLCBwdHIuR2V0KCkpOworfQorCitURVNUKE9ic2VydmVQdHIsIExpdmVzTG9uZ2VyKSB7CisgIFBzZXVkb09ic2VydmFibGUqIHBPYnMgPSBuZXcgUHNldWRvT2JzZXJ2YWJsZTsKKyAgUHNldWRvT2JzZXJ2YWJsZTo6T2JzZXJ2ZWRQdHIgcHRyKHBPYnMpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgcHRyLkdldCgpKTsKKyAgRVhQRUNUX0VRKDF1LCBwT2JzLT5BY3RpdmVPYnNlcnZlZFB0cnMoKSk7CisgIGRlbGV0ZSBwT2JzOworICBFWFBFQ1RfRVEobnVsbHB0ciwgcHRyLkdldCgpKTsKK30KKworVEVTVChPYnNlcnZlUHRyLCBMaXZlc1Nob3J0ZXIpIHsKKyAgUHNldWRvT2JzZXJ2YWJsZSBvYnM7CisgIHsKKyAgICBQc2V1ZG9PYnNlcnZhYmxlOjpPYnNlcnZlZFB0ciBwdHIoJm9icyk7CisgICAgRVhQRUNUX05FKG51bGxwdHIsIHB0ci5HZXQoKSk7CisgICAgRVhQRUNUX0VRKDF1LCBvYnMuQWN0aXZlT2JzZXJ2ZWRQdHJzKCkpOworICB9CisgIEVYUEVDVF9FUSgwdSwgb2JzLkFjdGl2ZU9ic2VydmVkUHRycygpKTsKK30KKworVEVTVChPYnNlcnZlUHRyLCBDb3B5Q29uc3RydWN0KSB7CisgIFBzZXVkb09ic2VydmFibGUgb2JzOworICB7CisgICAgUHNldWRvT2JzZXJ2YWJsZTo6T2JzZXJ2ZWRQdHIgcHRyKCZvYnMpOworICAgIEVYUEVDVF9ORShudWxscHRyLCBwdHIuR2V0KCkpOworICAgIEVYUEVDVF9FUSgxdSwgb2JzLkFjdGl2ZU9ic2VydmVkUHRycygpKTsKKyAgICB7CisgICAgICBQc2V1ZG9PYnNlcnZhYmxlOjpPYnNlcnZlZFB0ciBwdHIyKHB0cik7CisgICAgICBFWFBFQ1RfTkUobnVsbHB0ciwgcHRyMi5HZXQoKSk7CisgICAgICBFWFBFQ1RfRVEoMnUsIG9icy5BY3RpdmVPYnNlcnZlZFB0cnMoKSk7CisgICAgfQorICAgIEVYUEVDVF9FUSgxdSwgb2JzLkFjdGl2ZU9ic2VydmVkUHRycygpKTsKKyAgfQorICBFWFBFQ1RfRVEoMHUsIG9icy5BY3RpdmVPYnNlcnZlZFB0cnMoKSk7Cit9CisKK1RFU1QoT2JzZXJ2ZVB0ciwgQ29weUFzc2lnbikgeworICBQc2V1ZG9PYnNlcnZhYmxlIG9iczsKKyAgeworICAgIFBzZXVkb09ic2VydmFibGU6Ok9ic2VydmVkUHRyIHB0cigmb2JzKTsKKyAgICBFWFBFQ1RfTkUobnVsbHB0ciwgcHRyLkdldCgpKTsKKyAgICBFWFBFQ1RfRVEoMXUsIG9icy5BY3RpdmVPYnNlcnZlZFB0cnMoKSk7CisgICAgeworICAgICAgUHNldWRvT2JzZXJ2YWJsZTo6T2JzZXJ2ZWRQdHIgcHRyMjsKKyAgICAgIHB0cjIgPSBwdHI7CisgICAgICBFWFBFQ1RfTkUobnVsbHB0ciwgcHRyMi5HZXQoKSk7CisgICAgICBFWFBFQ1RfRVEoMnUsIG9icy5BY3RpdmVPYnNlcnZlZFB0cnMoKSk7CisgICAgfQorICAgIEVYUEVDVF9FUSgxdSwgb2JzLkFjdGl2ZU9ic2VydmVkUHRycygpKTsKKyAgfQorICBFWFBFQ1RfRVEoMHUsIG9icy5BY3RpdmVPYnNlcnZlZFB0cnMoKSk7Cit9CisKK1RFU1QoT2JzZXJ2ZVB0ciwgVmVjdG9yKSB7CisgIFBzZXVkb09ic2VydmFibGUgb2JzOworICB7CisgICAgc3RkOjp2ZWN0b3I8UHNldWRvT2JzZXJ2YWJsZTo6T2JzZXJ2ZWRQdHI+IHZlYzE7CisgICAgc3RkOjp2ZWN0b3I8UHNldWRvT2JzZXJ2YWJsZTo6T2JzZXJ2ZWRQdHI+IHZlYzI7CisgICAgdmVjMS5lbXBsYWNlX2JhY2soJm9icyk7CisgICAgdmVjMS5lbXBsYWNlX2JhY2soJm9icyk7CisgICAgRVhQRUNUX05FKG51bGxwdHIsIHZlYzFbMF0uR2V0KCkpOworICAgIEVYUEVDVF9ORShudWxscHRyLCB2ZWMxWzFdLkdldCgpKTsKKyAgICBFWFBFQ1RfRVEoMnUsIG9icy5BY3RpdmVPYnNlcnZlZFB0cnMoKSk7CisgICAgdmVjMiA9IHZlYzE7CisgICAgRVhQRUNUX05FKG51bGxwdHIsIHZlYzJbMF0uR2V0KCkpOworICAgIEVYUEVDVF9ORShudWxscHRyLCB2ZWMyWzFdLkdldCgpKTsKKyAgICBFWFBFQ1RfRVEoNHUsIG9icy5BY3RpdmVPYnNlcnZlZFB0cnMoKSk7CisgICAgdmVjMS5jbGVhcigpOworICAgIEVYUEVDVF9FUSgydSwgb2JzLkFjdGl2ZU9ic2VydmVkUHRycygpKTsKKyAgICB2ZWMyLnJlc2l6ZSgxMDAwMCk7CisgICAgRVhQRUNUX0VRKDJ1LCBvYnMuQWN0aXZlT2JzZXJ2ZWRQdHJzKCkpOworICAgIHZlYzIucmVzaXplKDApOworICAgIEVYUEVDVF9FUSgwdSwgb2JzLkFjdGl2ZU9ic2VydmVkUHRycygpKTsKKyAgfQorICBFWFBFQ1RfRVEoMHUsIG9icy5BY3RpdmVPYnNlcnZlZFB0cnMoKSk7Cit9CisKK1RFU1QoT2JzZXJ2ZVB0ciwgVmVjdG9yQXV0b0NsZWFyKSB7CisgIHN0ZDo6dmVjdG9yPFBzZXVkb09ic2VydmFibGU6Ok9ic2VydmVkUHRyPiB2ZWMxOworICB7CisgICAgUHNldWRvT2JzZXJ2YWJsZSBvYnM7CisgICAgdmVjMS5lbXBsYWNlX2JhY2soJm9icyk7CisgICAgdmVjMS5lbXBsYWNlX2JhY2soJm9icyk7CisgICAgRVhQRUNUX05FKG51bGxwdHIsIHZlYzFbMF0uR2V0KCkpOworICAgIEVYUEVDVF9ORShudWxscHRyLCB2ZWMxWzFdLkdldCgpKTsKKyAgICBFWFBFQ1RfRVEoMnUsIG9icy5BY3RpdmVPYnNlcnZlZFB0cnMoKSk7CisgIH0KKyAgRVhQRUNUX0VRKG51bGxwdHIsIHZlYzFbMF0uR2V0KCkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgdmVjMVsxXS5HZXQoKSk7Cit9CisKK1RFU1QoT2JzZXJ2ZVB0ciwgUmVzZXROdWxsKSB7CisgIFBzZXVkb09ic2VydmFibGUgb2JzOworICBQc2V1ZG9PYnNlcnZhYmxlOjpPYnNlcnZlZFB0ciBwdHIoJm9icyk7CisgIEVYUEVDVF9FUSgxdSwgb2JzLkFjdGl2ZU9ic2VydmVkUHRycygpKTsKKyAgcHRyLlJlc2V0KCk7CisgIEVYUEVDVF9FUSgwdSwgb2JzLkFjdGl2ZU9ic2VydmVkUHRycygpKTsKK30KKworVEVTVChPYnNlcnZlUHRyLCBSZXNldCkgeworICBQc2V1ZG9PYnNlcnZhYmxlIG9iczE7CisgIFBzZXVkb09ic2VydmFibGUgb2JzMjsKKyAgUHNldWRvT2JzZXJ2YWJsZTo6T2JzZXJ2ZWRQdHIgcHRyKCZvYnMxKTsKKyAgRVhQRUNUX0VRKDF1LCBvYnMxLkFjdGl2ZU9ic2VydmVkUHRycygpKTsKKyAgRVhQRUNUX0VRKDB1LCBvYnMyLkFjdGl2ZU9ic2VydmVkUHRycygpKTsKKyAgcHRyLlJlc2V0KCZvYnMyKTsKKyAgRVhQRUNUX0VRKDB1LCBvYnMxLkFjdGl2ZU9ic2VydmVkUHRycygpKTsKKyAgRVhQRUNUX0VRKDF1LCBvYnMyLkFjdGl2ZU9ic2VydmVkUHRycygpKTsKK30KKworVEVTVChPYnNlcnZlUHRyLCBFcXVhbHMpIHsKKyAgUHNldWRvT2JzZXJ2YWJsZSBvYmoxOworICBQc2V1ZG9PYnNlcnZhYmxlIG9iajI7CisgIFBzZXVkb09ic2VydmFibGU6Ok9ic2VydmVkUHRyIG51bGxfcHRyMTsKKyAgUHNldWRvT2JzZXJ2YWJsZTo6T2JzZXJ2ZWRQdHIgb2JqMV9wdHIxKCZvYmoxKTsKKyAgUHNldWRvT2JzZXJ2YWJsZTo6T2JzZXJ2ZWRQdHIgb2JqMl9wdHIxKCZvYmoyKTsKKyAgeworICAgIFBzZXVkb09ic2VydmFibGU6Ok9ic2VydmVkUHRyIG51bGxfcHRyMjsKKyAgICBFWFBFQ1RfVFJVRShudWxsX3B0cjEgPT0gbnVsbF9wdHIyKTsKKworICAgIFBzZXVkb09ic2VydmFibGU6Ok9ic2VydmVkUHRyIG9iajFfcHRyMigmb2JqMSk7CisgICAgRVhQRUNUX1RSVUUob2JqMV9wdHIxID09IG9iajFfcHRyMik7CisKKyAgICBQc2V1ZG9PYnNlcnZhYmxlOjpPYnNlcnZlZFB0ciBvYmoyX3B0cjIoJm9iajIpOworICAgIEVYUEVDVF9UUlVFKG9iajJfcHRyMSA9PSBvYmoyX3B0cjIpOworICB9CisgIEVYUEVDVF9GQUxTRShudWxsX3B0cjEgPT0gb2JqMV9wdHIxKTsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfcHRyMSA9PSBvYmoyX3B0cjEpOworICBFWFBFQ1RfRkFMU0Uob2JqMV9wdHIxID09IG9iajJfcHRyMSk7Cit9CisKK1RFU1QoT2JzZXJ2ZVB0ciwgTm90RXF1YWxzKSB7CisgIFBzZXVkb09ic2VydmFibGUgb2JqMTsKKyAgUHNldWRvT2JzZXJ2YWJsZSBvYmoyOworICBQc2V1ZG9PYnNlcnZhYmxlOjpPYnNlcnZlZFB0ciBudWxsX3B0cjE7CisgIFBzZXVkb09ic2VydmFibGU6Ok9ic2VydmVkUHRyIG9iajFfcHRyMSgmb2JqMSk7CisgIFBzZXVkb09ic2VydmFibGU6Ok9ic2VydmVkUHRyIG9iajJfcHRyMSgmb2JqMik7CisgIHsKKyAgICBQc2V1ZG9PYnNlcnZhYmxlOjpPYnNlcnZlZFB0ciBudWxsX3B0cjI7CisgICAgUHNldWRvT2JzZXJ2YWJsZTo6T2JzZXJ2ZWRQdHIgb2JqMV9wdHIyKCZvYmoxKTsKKyAgICBQc2V1ZG9PYnNlcnZhYmxlOjpPYnNlcnZlZFB0ciBvYmoyX3B0cjIoJm9iajIpOworICAgIEVYUEVDVF9GQUxTRShudWxsX3B0cjEgIT0gbnVsbF9wdHIyKTsKKyAgICBFWFBFQ1RfRkFMU0Uob2JqMV9wdHIxICE9IG9iajFfcHRyMik7CisgICAgRVhQRUNUX0ZBTFNFKG9iajJfcHRyMSAhPSBvYmoyX3B0cjIpOworICB9CisgIEVYUEVDVF9UUlVFKG51bGxfcHRyMSAhPSBvYmoxX3B0cjEpOworICBFWFBFQ1RfVFJVRShudWxsX3B0cjEgIT0gb2JqMl9wdHIxKTsKKyAgRVhQRUNUX1RSVUUob2JqMV9wdHIxICE9IG9iajJfcHRyMSk7Cit9CisKK1RFU1QoT2JzZXJ2ZVB0ciwgQm9vbCkgeworICBQc2V1ZG9PYnNlcnZhYmxlIG9iajE7CisgIFBzZXVkb09ic2VydmFibGU6Ok9ic2VydmVkUHRyIG51bGxfcHRyOworICBQc2V1ZG9PYnNlcnZhYmxlOjpPYnNlcnZlZFB0ciBvYmoxX3B0cigmb2JqMSk7CisgIGJvb2wgbnVsbF9ib29sID0gISFudWxsX3B0cjsKKyAgYm9vbCBvYmoxX2Jvb2wgPSAhIW9iajFfcHRyOworICBFWFBFQ1RfRkFMU0UobnVsbF9ib29sKTsKKyAgRVhQRUNUX1RSVUUob2JqMV9ib29sKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGZ4Y3J0CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCBiL2NvcmUvZnhjcnQvcmV0YWluX3B0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNGIxZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaApAQCAtMCwwICsxLDEzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIENPUkVfRlhDUlRfUkVUQUlOX1BUUl9IXworI2RlZmluZSBDT1JFX0ZYQ1JUX1JFVEFJTl9QVFJfSF8KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorCituYW1lc3BhY2UgZnhjcnQgeworCisvLyBVc2VkIHdpdGggc3RkOjp1bmlxdWVfcHRyIHRvIFJlbGVhc2UoKSBvYmplY3RzIHRoYXQgY2FuJ3QgYmUgZGVsZXRlZC4KK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IFJlbGVhc2VEZWxldGVyIHsKKyAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShUKiBwdHIpIGNvbnN0IHsgcHRyLT5SZWxlYXNlKCk7IH0KK307CisKKy8vIEFuYWxvZ291cyB0byBiYXNlJ3Mgc2NvcGVkX3JlZnB0ci4KK3RlbXBsYXRlIDxjbGFzcyBUPgorY2xhc3MgUmV0YWluUHRyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFJldGFpblB0cihUKiBwT2JqKSA6IG1fcE9iaihwT2JqKSB7CisgICAgaWYgKG1fcE9iaikKKyAgICAgIG1fcE9iai0+UmV0YWluKCk7CisgIH0KKworICBSZXRhaW5QdHIoKSA9IGRlZmF1bHQ7CisgIFJldGFpblB0cihjb25zdCBSZXRhaW5QdHImIHRoYXQpIDogUmV0YWluUHRyKHRoYXQuR2V0KCkpIHt9CisgIFJldGFpblB0cihSZXRhaW5QdHImJiB0aGF0KSBub2V4Y2VwdCB7IFN3YXAodGhhdCk7IH0KKworICAvLyBEZWxpYmVyYXRlbHkgaW1wbGljaXQgdG8gYWxsb3cgcmV0dXJuaW5nIG51bGxwdHJzLgorICAvLyBOT0xJTlRORVhUTElORShydW50aW1lL2V4cGxpY2l0KQorICBSZXRhaW5QdHIoc3RkOjpudWxscHRyX3QgcHRyKSB7fQorCisgIHRlbXBsYXRlIDxjbGFzcyBVPgorICBSZXRhaW5QdHIoY29uc3QgUmV0YWluUHRyPFU+JiB0aGF0KSA6IFJldGFpblB0cih0aGF0LkdldCgpKSB7fQorCisgIHRlbXBsYXRlIDxjbGFzcyBVPgorICBSZXRhaW5QdHI8VT4gQXMoKSBjb25zdCB7CisgICAgcmV0dXJuIFJldGFpblB0cjxVPihzdGF0aWNfY2FzdDxVKj4oR2V0KCkpKTsKKyAgfQorCisgIHZvaWQgUmVzZXQoVCogb2JqID0gbnVsbHB0cikgeworICAgIGlmIChvYmopCisgICAgICBvYmotPlJldGFpbigpOworICAgIG1fcE9iai5yZXNldChvYmopOworICB9CisKKyAgVCogR2V0KCkgY29uc3QgeyByZXR1cm4gbV9wT2JqLmdldCgpOyB9CisgIHZvaWQgU3dhcChSZXRhaW5QdHImIHRoYXQpIHsgbV9wT2JqLnN3YXAodGhhdC5tX3BPYmopOyB9CisKKyAgLy8gVXNlZnVsIGZvciBwYXNzaW5nIG5vdGlvbiBvZiBvYmplY3Qgb3duZXJzaGlwIGFjcm9zcyBhIEMgQVBJLgorICBUKiBMZWFrKCkgeyByZXR1cm4gbV9wT2JqLnJlbGVhc2UoKTsgfQorICB2b2lkIFVubGVhayhUKiBwdHIpIHsgbV9wT2JqLnJlc2V0KHB0cik7IH0KKworICBSZXRhaW5QdHImIG9wZXJhdG9yPShjb25zdCBSZXRhaW5QdHImIHRoYXQpIHsKKyAgICBpZiAoKnRoaXMgIT0gdGhhdCkKKyAgICAgIFJlc2V0KHRoYXQuR2V0KCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFJldGFpblB0ciYgb3BlcmF0b3I9KFJldGFpblB0ciYmIHRoYXQpIHsKKyAgICBtX3BPYmoucmVzZXQodGhhdC5MZWFrKCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZXRhaW5QdHImIHRoYXQpIGNvbnN0IHsgcmV0dXJuIEdldCgpID09IHRoYXQuR2V0KCk7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFJldGFpblB0ciYgdGhhdCkgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSB0aGF0KTsgfQorCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFJldGFpblB0ciYgdGhhdCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6Omxlc3M8VCo+KCkoR2V0KCksIHRoYXQuR2V0KCkpOworICB9CisKKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuICEhbV9wT2JqOyB9CisgIFQmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICptX3BPYmouZ2V0KCk7IH0KKyAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIG1fcE9iai5nZXQoKTsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPFQsIFJlbGVhc2VEZWxldGVyPFQ+PiBtX3BPYmo7Cit9OworCisvLyBUcml2aWFsIGltcGxlbWVudGF0aW9uIC0gaW50ZXJuYWwgcmVmIGNvdW50IHdpdGggdmlydHVhbCBkZXN0cnVjdG9yLgorY2xhc3MgUmV0YWluYWJsZSB7CisgcHVibGljOgorICBib29sIEhhc09uZVJlZigpIGNvbnN0IHsgcmV0dXJuIG1fblJlZkNvdW50ID09IDE7IH0KKworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB+UmV0YWluYWJsZSgpID0gZGVmYXVsdDsKKworIHByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBmcmllbmQgc3RydWN0IFJlbGVhc2VEZWxldGVyOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBmcmllbmQgY2xhc3MgUmV0YWluUHRyOworCisgIHZvaWQgUmV0YWluKCkgeyArK21fblJlZkNvdW50OyB9CisgIHZvaWQgUmVsZWFzZSgpIHsKKyAgICBBU1NFUlQobV9uUmVmQ291bnQgPiAwKTsKKyAgICBpZiAoLS1tX25SZWZDb3VudCA9PSAwKQorICAgICAgZGVsZXRlIHRoaXM7CisgIH0KKworICBpbnRwdHJfdCBtX25SZWZDb3VudCA9IDA7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZnhjcnQKKwordXNpbmcgZnhjcnQ6OlJlbGVhc2VEZWxldGVyOwordXNpbmcgZnhjcnQ6OlJldGFpblB0cjsKK3VzaW5nIGZ4Y3J0OjpSZXRhaW5hYmxlOworCituYW1lc3BhY2UgcGRmaXVtIHsKKworLy8gSGVscGVyIHRvIG1ha2UgYSBSZXRhaW5QdHIgYWxvbmcgdGhlIGxpbmVzIG9mIHN0ZDo6bWFrZV91bmlxdWU8PigpLAorLy8gb3IgcGRmaXVtOjpNYWtlVW5pcXVlPD4oKS4gQXJndW1lbnRzIGFyZSBmb3J3YXJkZWQgdG8gVCdzIGNvbnN0cnVjdG9yLgorLy8gQ2xhc3NlcyBtYW5hZ2VkIGJ5IFJldGFpblB0ciBzaG91bGQgaGF2ZSBwcm90ZWN0ZWQgKG9yIHByaXZhdGUpCisvLyBjb25zdHJ1Y3RvcnMsIGFuZCBzaG91bGQgZnJpZW5kIHRoaXMgZnVuY3Rpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KK1JldGFpblB0cjxUPiBNYWtlUmV0YWluKEFyZ3MmJi4uLiBhcmdzKSB7CisgIHJldHVybiBSZXRhaW5QdHI8VD4obmV3IFQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBwZGZpdW0KKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX1JFVEFJTl9QVFJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvcmV0YWluX3B0cl91bml0dGVzdC5jcHAgYi9jb3JlL2Z4Y3J0L3JldGFpbl9wdHJfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YjI5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L3JldGFpbl9wdHJfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMzAzIEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSBmeGNydCB7CituYW1lc3BhY2UgeworCitjbGFzcyBQc2V1ZG9SZXRhaW5hYmxlIHsKKyBwdWJsaWM6CisgIFBzZXVkb1JldGFpbmFibGUoKSA6IHJldGFpbl9jb3VudF8oMCksIHJlbGVhc2VfY291bnRfKDApIHt9CisgIHZvaWQgUmV0YWluKCkgeyArK3JldGFpbl9jb3VudF87IH0KKyAgdm9pZCBSZWxlYXNlKCkgeyArK3JlbGVhc2VfY291bnRfOyB9CisgIGludCByZXRhaW5fY291bnQoKSBjb25zdCB7IHJldHVybiByZXRhaW5fY291bnRfOyB9CisgIGludCByZWxlYXNlX2NvdW50KCkgY29uc3QgeyByZXR1cm4gcmVsZWFzZV9jb3VudF87IH0KKworIHByaXZhdGU6CisgIGludCByZXRhaW5fY291bnRfOworICBpbnQgcmVsZWFzZV9jb3VudF87Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVChSZXRhaW5QdHIsIE51bGwpIHsKKyAgUmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+IHB0cjsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIHB0ci5HZXQoKSk7Cit9CisKK1RFU1QoUmV0YWluUHRyLCBOb3JtYWwpIHsKKyAgUHNldWRvUmV0YWluYWJsZSBvYmo7CisgIHsKKyAgICBSZXRhaW5QdHI8UHNldWRvUmV0YWluYWJsZT4gcHRyKCZvYmopOworICAgIEVYUEVDVF9FUSgmb2JqLCBwdHIuR2V0KCkpOworICAgIEVYUEVDVF9FUSgxLCBvYmoucmV0YWluX2NvdW50KCkpOworICAgIEVYUEVDVF9FUSgwLCBvYmoucmVsZWFzZV9jb3VudCgpKTsKKyAgfQorICBFWFBFQ1RfRVEoMSwgb2JqLnJldGFpbl9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDEsIG9iai5yZWxlYXNlX2NvdW50KCkpOworfQorCitURVNUKFJldGFpblB0ciwgQ29weUN0b3IpIHsKKyAgUHNldWRvUmV0YWluYWJsZSBvYmo7CisgIHsKKyAgICBSZXRhaW5QdHI8UHNldWRvUmV0YWluYWJsZT4gcHRyMSgmb2JqKTsKKyAgICB7CisgICAgICBSZXRhaW5QdHI8UHNldWRvUmV0YWluYWJsZT4gcHRyMihwdHIxKTsKKyAgICAgIEVYUEVDVF9FUSgyLCBvYmoucmV0YWluX2NvdW50KCkpOworICAgICAgRVhQRUNUX0VRKDAsIG9iai5yZWxlYXNlX2NvdW50KCkpOworICAgIH0KKyAgICBFWFBFQ1RfRVEoMiwgb2JqLnJldGFpbl9jb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMSwgb2JqLnJlbGVhc2VfY291bnQoKSk7CisgIH0KKyAgRVhQRUNUX0VRKDIsIG9iai5yZXRhaW5fY291bnQoKSk7CisgIEVYUEVDVF9FUSgyLCBvYmoucmVsZWFzZV9jb3VudCgpKTsKK30KKworVEVTVChSZXRhaW5QdHIsIE1vdmVDdG9yKSB7CisgIFBzZXVkb1JldGFpbmFibGUgb2JqOworICB7CisgICAgUmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+IHB0cjEoJm9iaik7CisgICAgeworICAgICAgUmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+IHB0cjIoc3RkOjptb3ZlKHB0cjEpKTsKKyAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwdHIxLkdldCgpKTsKKyAgICAgIEVYUEVDVF9FUSgmb2JqLCBwdHIyLkdldCgpKTsKKyAgICAgIEVYUEVDVF9FUSgxLCBvYmoucmV0YWluX2NvdW50KCkpOworICAgICAgRVhQRUNUX0VRKDAsIG9iai5yZWxlYXNlX2NvdW50KCkpOworICAgIH0KKyAgICBFWFBFQ1RfRVEoMSwgb2JqLnJldGFpbl9jb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMSwgb2JqLnJlbGVhc2VfY291bnQoKSk7CisgIH0KKyAgRVhQRUNUX0VRKDEsIG9iai5yZXRhaW5fY291bnQoKSk7CisgIEVYUEVDVF9FUSgxLCBvYmoucmVsZWFzZV9jb3VudCgpKTsKK30KKworVEVTVChSZXRhaW5QdHIsIFJlc2V0TnVsbCkgeworICBQc2V1ZG9SZXRhaW5hYmxlIG9iajsKKyAgeworICAgIFJldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBwdHIoJm9iaik7CisgICAgcHRyLlJlc2V0KCk7CisgICAgRVhQRUNUX0VRKDEsIG9iai5yZXRhaW5fY291bnQoKSk7CisgICAgRVhQRUNUX0VRKDEsIG9iai5yZWxlYXNlX2NvdW50KCkpOworICB9CisgIEVYUEVDVF9FUSgxLCBvYmoucmV0YWluX2NvdW50KCkpOworICBFWFBFQ1RfRVEoMSwgb2JqLnJlbGVhc2VfY291bnQoKSk7Cit9CisKK1RFU1QoUmV0YWluUHRyLCBSZXNldCkgeworICBQc2V1ZG9SZXRhaW5hYmxlIG9iajE7CisgIFBzZXVkb1JldGFpbmFibGUgb2JqMjsKKyAgeworICAgIFJldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBwdHIoJm9iajEpOworICAgIHB0ci5SZXNldCgmb2JqMik7CisgICAgRVhQRUNUX0VRKDEsIG9iajEucmV0YWluX2NvdW50KCkpOworICAgIEVYUEVDVF9FUSgxLCBvYmoxLnJlbGVhc2VfY291bnQoKSk7CisgICAgRVhQRUNUX0VRKDEsIG9iajIucmV0YWluX2NvdW50KCkpOworICAgIEVYUEVDVF9FUSgwLCBvYmoyLnJlbGVhc2VfY291bnQoKSk7CisgIH0KKyAgRVhQRUNUX0VRKDEsIG9iajEucmV0YWluX2NvdW50KCkpOworICBFWFBFQ1RfRVEoMSwgb2JqMS5yZWxlYXNlX2NvdW50KCkpOworICBFWFBFQ1RfRVEoMSwgb2JqMi5yZXRhaW5fY291bnQoKSk7CisgIEVYUEVDVF9FUSgxLCBvYmoyLnJlbGVhc2VfY291bnQoKSk7Cit9CisKK1RFU1QoUmV0YWluUHRyLCBTd2FwKSB7CisgIFBzZXVkb1JldGFpbmFibGUgb2JqMTsKKyAgUHNldWRvUmV0YWluYWJsZSBvYmoyOworICB7CisgICAgUmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+IHB0cjEoJm9iajEpOworICAgIHsKKyAgICAgIFJldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBwdHIyKCZvYmoyKTsKKyAgICAgIHB0cjEuU3dhcChwdHIyKTsKKyAgICAgIEVYUEVDVF9FUSgxLCBvYmoxLnJldGFpbl9jb3VudCgpKTsKKyAgICAgIEVYUEVDVF9FUSgwLCBvYmoxLnJlbGVhc2VfY291bnQoKSk7CisgICAgICBFWFBFQ1RfRVEoMSwgb2JqMi5yZXRhaW5fY291bnQoKSk7CisgICAgICBFWFBFQ1RfRVEoMCwgb2JqMi5yZWxlYXNlX2NvdW50KCkpOworICAgIH0KKyAgICBFWFBFQ1RfRVEoMSwgb2JqMS5yZXRhaW5fY291bnQoKSk7CisgICAgRVhQRUNUX0VRKDEsIG9iajEucmVsZWFzZV9jb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMSwgb2JqMi5yZXRhaW5fY291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIG9iajIucmVsZWFzZV9jb3VudCgpKTsKKyAgfQorICBFWFBFQ1RfRVEoMSwgb2JqMS5yZXRhaW5fY291bnQoKSk7CisgIEVYUEVDVF9FUSgxLCBvYmoxLnJlbGVhc2VfY291bnQoKSk7CisgIEVYUEVDVF9FUSgxLCBvYmoyLnJldGFpbl9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDEsIG9iajIucmVsZWFzZV9jb3VudCgpKTsKK30KKworVEVTVChSZXRhaW5QdHIsIExlYWspIHsKKyAgUHNldWRvUmV0YWluYWJsZSBvYmo7CisgIFBzZXVkb1JldGFpbmFibGUqIGxlYWs7CisgIHsKKyAgICBSZXRhaW5QdHI8UHNldWRvUmV0YWluYWJsZT4gcHRyKCZvYmopOworICAgIGxlYWsgPSBwdHIuTGVhaygpOworICAgIEVYUEVDVF9FUSgxLCBvYmoucmV0YWluX2NvdW50KCkpOworICAgIEVYUEVDVF9FUSgwLCBvYmoucmVsZWFzZV9jb3VudCgpKTsKKyAgfQorICBFWFBFQ1RfRVEoMSwgb2JqLnJldGFpbl9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDAsIG9iai5yZWxlYXNlX2NvdW50KCkpOworICB7CisgICAgUmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+IHB0cjsKKyAgICBwdHIuVW5sZWFrKGxlYWspOworICAgIEVYUEVDVF9FUSgxLCBvYmoucmV0YWluX2NvdW50KCkpOworICAgIEVYUEVDVF9FUSgwLCBvYmoucmVsZWFzZV9jb3VudCgpKTsKKyAgfQorICBFWFBFQ1RfRVEoMSwgb2JqLnJldGFpbl9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDEsIG9iai5yZWxlYXNlX2NvdW50KCkpOworfQorCitURVNUKFJldGFpblB0ciwgU3dhcE51bGwpIHsKKyAgUHNldWRvUmV0YWluYWJsZSBvYmoxOworICB7CisgICAgUmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+IHB0cjEoJm9iajEpOworICAgIHsKKyAgICAgIFJldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBwdHIyOworICAgICAgcHRyMS5Td2FwKHB0cjIpOworICAgICAgRVhQRUNUX0ZBTFNFKHB0cjEpOworICAgICAgRVhQRUNUX1RSVUUocHRyMik7CisgICAgICBFWFBFQ1RfRVEoMSwgb2JqMS5yZXRhaW5fY291bnQoKSk7CisgICAgICBFWFBFQ1RfRVEoMCwgb2JqMS5yZWxlYXNlX2NvdW50KCkpOworICAgIH0KKyAgICBFWFBFQ1RfRVEoMSwgb2JqMS5yZXRhaW5fY291bnQoKSk7CisgICAgRVhQRUNUX0VRKDEsIG9iajEucmVsZWFzZV9jb3VudCgpKTsKKyAgfQorICBFWFBFQ1RfRVEoMSwgb2JqMS5yZXRhaW5fY291bnQoKSk7CisgIEVYUEVDVF9FUSgxLCBvYmoxLnJlbGVhc2VfY291bnQoKSk7Cit9CisKK1RFU1QoUmV0YWluUHRyLCBBc3NpZ24pIHsKKyAgUHNldWRvUmV0YWluYWJsZSBvYmo7CisgIHsKKyAgICBSZXRhaW5QdHI8UHNldWRvUmV0YWluYWJsZT4gcHRyKCZvYmopOworICAgIHsKKyAgICAgIFJldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBwdHIyOworICAgICAgcHRyMiA9IHB0cjsKKyAgICAgIEVYUEVDVF9FUSgyLCBvYmoucmV0YWluX2NvdW50KCkpOworICAgICAgRVhQRUNUX0VRKDAsIG9iai5yZWxlYXNlX2NvdW50KCkpOworICAgIH0KKyAgICBFWFBFQ1RfRVEoMiwgb2JqLnJldGFpbl9jb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMSwgb2JqLnJlbGVhc2VfY291bnQoKSk7CisgIH0KKyAgRVhQRUNUX0VRKDIsIG9iai5yZXRhaW5fY291bnQoKSk7CisgIEVYUEVDVF9FUSgyLCBvYmoucmVsZWFzZV9jb3VudCgpKTsKK30KKworVEVTVChSZXRhaW5QdHIsIE1vdmVBc3NpZ24pIHsKKyAgUHNldWRvUmV0YWluYWJsZSBvYmo7CisgIHsKKyAgICBSZXRhaW5QdHI8UHNldWRvUmV0YWluYWJsZT4gcHRyMSgmb2JqKTsKKyAgICB7CisgICAgICBSZXRhaW5QdHI8UHNldWRvUmV0YWluYWJsZT4gcHRyMjsKKyAgICAgIEVYUEVDVF9FUSgmb2JqLCBwdHIxLkdldCgpKTsKKyAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwdHIyLkdldCgpKTsKKyAgICAgIHB0cjIgPSBzdGQ6Om1vdmUocHRyMSk7CisgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcHRyMS5HZXQoKSk7CisgICAgICBFWFBFQ1RfRVEoJm9iaiwgcHRyMi5HZXQoKSk7CisgICAgICBFWFBFQ1RfRVEoMSwgb2JqLnJldGFpbl9jb3VudCgpKTsKKyAgICAgIEVYUEVDVF9FUSgwLCBvYmoucmVsZWFzZV9jb3VudCgpKTsKKyAgICB9CisgICAgRVhQRUNUX0VRKDEsIG9iai5yZXRhaW5fY291bnQoKSk7CisgICAgRVhQRUNUX0VRKDEsIG9iai5yZWxlYXNlX2NvdW50KCkpOworICB9CisgIEVYUEVDVF9FUSgxLCBvYmoucmV0YWluX2NvdW50KCkpOworICBFWFBFQ1RfRVEoMSwgb2JqLnJlbGVhc2VfY291bnQoKSk7Cit9CisKK1RFU1QoUmV0YWluUHRyLCBFcXVhbHMpIHsKKyAgUHNldWRvUmV0YWluYWJsZSBvYmoxOworICBQc2V1ZG9SZXRhaW5hYmxlIG9iajI7CisgIFJldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBudWxsX3B0cjE7CisgIFJldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBvYmoxX3B0cjEoJm9iajEpOworICBSZXRhaW5QdHI8UHNldWRvUmV0YWluYWJsZT4gb2JqMl9wdHIxKCZvYmoyKTsKKyAgeworICAgIFJldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBudWxsX3B0cjI7CisgICAgRVhQRUNUX1RSVUUobnVsbF9wdHIxID09IG51bGxfcHRyMik7CisKKyAgICBSZXRhaW5QdHI8UHNldWRvUmV0YWluYWJsZT4gb2JqMV9wdHIyKCZvYmoxKTsKKyAgICBFWFBFQ1RfVFJVRShvYmoxX3B0cjEgPT0gb2JqMV9wdHIyKTsKKworICAgIFJldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBvYmoyX3B0cjIoJm9iajIpOworICAgIEVYUEVDVF9UUlVFKG9iajJfcHRyMSA9PSBvYmoyX3B0cjIpOworICB9CisgIEVYUEVDVF9GQUxTRShudWxsX3B0cjEgPT0gb2JqMV9wdHIxKTsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfcHRyMSA9PSBvYmoyX3B0cjEpOworICBFWFBFQ1RfRkFMU0Uob2JqMV9wdHIxID09IG9iajJfcHRyMSk7Cit9CisKK1RFU1QoUmV0YWluUHRyLCBOb3RFcXVhbHMpIHsKKyAgUHNldWRvUmV0YWluYWJsZSBvYmoxOworICBQc2V1ZG9SZXRhaW5hYmxlIG9iajI7CisgIFJldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBudWxsX3B0cjE7CisgIFJldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBvYmoxX3B0cjEoJm9iajEpOworICBSZXRhaW5QdHI8UHNldWRvUmV0YWluYWJsZT4gb2JqMl9wdHIxKCZvYmoyKTsKKyAgeworICAgIFJldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBudWxsX3B0cjI7CisgICAgUmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+IG9iajFfcHRyMigmb2JqMSk7CisgICAgUmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+IG9iajJfcHRyMigmb2JqMik7CisgICAgRVhQRUNUX0ZBTFNFKG51bGxfcHRyMSAhPSBudWxsX3B0cjIpOworICAgIEVYUEVDVF9GQUxTRShvYmoxX3B0cjEgIT0gb2JqMV9wdHIyKTsKKyAgICBFWFBFQ1RfRkFMU0Uob2JqMl9wdHIxICE9IG9iajJfcHRyMik7CisgIH0KKyAgRVhQRUNUX1RSVUUobnVsbF9wdHIxICE9IG9iajFfcHRyMSk7CisgIEVYUEVDVF9UUlVFKG51bGxfcHRyMSAhPSBvYmoyX3B0cjEpOworICBFWFBFQ1RfVFJVRShvYmoxX3B0cjEgIT0gb2JqMl9wdHIxKTsKK30KKworVEVTVChSZXRhaW5QdHIsIExlc3NUaGFuKSB7CisgIFBzZXVkb1JldGFpbmFibGUgb2Jqc1syXTsKKyAgUmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+IG9iajFfcHRyKCZvYmpzWzBdKTsKKyAgUmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+IG9iajJfcHRyKCZvYmpzWzFdKTsKKyAgRVhQRUNUX1RSVUUob2JqMV9wdHIgPCBvYmoyX3B0cik7CisgIEVYUEVDVF9GQUxTRShvYmoyX3B0ciA8IG9iajFfcHRyKTsKK30KKworVEVTVChSZXRhaW5QdHIsIEJvb2wpIHsKKyAgUHNldWRvUmV0YWluYWJsZSBvYmoxOworICBSZXRhaW5QdHI8UHNldWRvUmV0YWluYWJsZT4gbnVsbF9wdHI7CisgIFJldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPiBvYmoxX3B0cigmb2JqMSk7CisgIGJvb2wgbnVsbF9ib29sID0gISFudWxsX3B0cjsKKyAgYm9vbCBvYmoxX2Jvb2wgPSAhIW9iajFfcHRyOworICBFWFBFQ1RfRkFMU0UobnVsbF9ib29sKTsKKyAgRVhQRUNUX1RSVUUob2JqMV9ib29sKTsKK30KKworVEVTVChSZXRhaW5QdHIsIE1ha2VSZXRhaW5lZCkgeworICBhdXRvIHB0ciA9IHBkZml1bTo6TWFrZVJldGFpbjxSZXRhaW5hYmxlPigpOworICBFWFBFQ1RfVFJVRShwdHItPkhhc09uZVJlZigpKTsKKyAgeworICAgIFJldGFpblB0cjxSZXRhaW5hYmxlPiBvdGhlciA9IHB0cjsKKyAgICBFWFBFQ1RfRkFMU0UocHRyLT5IYXNPbmVSZWYoKSk7CisgIH0KKyAgRVhQRUNUX1RSVUUocHRyLT5IYXNPbmVSZWYoKSk7Cit9CisKK1RFU1QoUmV0YWluUHRyLCBWZWN0b3JNb3ZlKSB7CisgIC8vIFByb3ZlcyBtb3ZlIGN0b3IgaXMgc2VsZWN0ZWQgYnkgc3RkOjp2ZWN0b3Igb3ZlciBjb3B5L2RlbGV0ZSwgdGhpcworICAvLyBtYXkgcmVxdWlyZSB0aGUgY3RvciB0byBiZSBtYXJrZWQgIm5vZXhjZXB0Ii4KKyAgUHNldWRvUmV0YWluYWJsZSBvYmo7CisgIHsKKyAgICBSZXRhaW5QdHI8UHNldWRvUmV0YWluYWJsZT4gcHRyKCZvYmopOworICAgIHN0ZDo6dmVjdG9yPFJldGFpblB0cjxQc2V1ZG9SZXRhaW5hYmxlPj4gdmVjMTsKKyAgICB2ZWMxLnB1c2hfYmFjayhzdGQ6Om1vdmUocHRyKSk7CisgICAgRVhQRUNUX0VRKDEsIG9iai5yZXRhaW5fY291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIG9iai5yZWxlYXNlX2NvdW50KCkpOworCisgICAgc3RkOjp2ZWN0b3I8UmV0YWluUHRyPFBzZXVkb1JldGFpbmFibGU+PiB2ZWMyID0gc3RkOjptb3ZlKHZlYzEpOworICAgIEVYUEVDVF9FUSgxLCBvYmoucmV0YWluX2NvdW50KCkpOworICAgIEVYUEVDVF9FUSgwLCBvYmoucmVsZWFzZV9jb3VudCgpKTsKKworICAgIHZlYzIucmVzaXplKDQwOTYpOworICAgIEVYUEVDVF9FUSgxLCBvYmoucmV0YWluX2NvdW50KCkpOworICAgIEVYUEVDVF9FUSgwLCBvYmoucmVsZWFzZV9jb3VudCgpKTsKKyAgfQorICBFWFBFQ1RfRVEoMSwgb2JqLnJldGFpbl9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDEsIG9iai5yZWxlYXNlX2NvdW50KCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgZnhjcnQKZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvc2hhcmVkX2NvcHlfb25fd3JpdGUuaCBiL2NvcmUvZnhjcnQvc2hhcmVkX2NvcHlfb25fd3JpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2Q3YTJhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9zaGFyZWRfY29weV9vbl93cml0ZS5oCkBAIC0wLDAgKzEsNjUgQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX1NIQVJFRF9DT1BZX09OX1dSSVRFX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfU0hBUkVEX0NPUFlfT05fV1JJVEVfSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisKK25hbWVzcGFjZSBmeGNydCB7CisKKy8vIEEgc2hhcmVkIG9iamVjdCB3aXRoIENvcHkgb24gV3JpdGUgc2VtYW50aWNzIHRoYXQgbWFrZXMgaXQgYXBwZWFyIGFzCisvLyBpZiBlYWNoIG9uZSB3ZXJlIGluZGVwZW5kZW50LgordGVtcGxhdGUgPGNsYXNzIE9iakNsYXNzPgorY2xhc3MgU2hhcmVkQ29weU9uV3JpdGUgeworIHB1YmxpYzoKKyAgU2hhcmVkQ29weU9uV3JpdGUoKSB7fQorICBTaGFyZWRDb3B5T25Xcml0ZShjb25zdCBTaGFyZWRDb3B5T25Xcml0ZSYgb3RoZXIpCisgICAgICA6IG1fcE9iamVjdChvdGhlci5tX3BPYmplY3QpIHt9CisgIH5TaGFyZWRDb3B5T25Xcml0ZSgpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+CisgIE9iakNsYXNzKiBFbXBsYWNlKEFyZ3MuLi4gcGFyYW1zKSB7CisgICAgbV9wT2JqZWN0LlJlc2V0KG5ldyBPYmpDbGFzcyhwYXJhbXMuLi4pKTsKKyAgICByZXR1cm4gbV9wT2JqZWN0LkdldCgpOworICB9CisKKyAgU2hhcmVkQ29weU9uV3JpdGUmIG9wZXJhdG9yPShjb25zdCBTaGFyZWRDb3B5T25Xcml0ZSYgdGhhdCkgeworICAgIGlmICgqdGhpcyAhPSB0aGF0KQorICAgICAgbV9wT2JqZWN0ID0gdGhhdC5tX3BPYmplY3Q7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdm9pZCBTZXROdWxsKCkgeyBtX3BPYmplY3QuUmVzZXQoKTsgfQorICBjb25zdCBPYmpDbGFzcyogR2V0T2JqZWN0KCkgY29uc3QgeyByZXR1cm4gbV9wT2JqZWN0LkdldCgpOyB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+CisgIE9iakNsYXNzKiBHZXRQcml2YXRlQ29weShBcmdzLi4uIHBhcmFtcykgeworICAgIGlmICghbV9wT2JqZWN0KQorICAgICAgcmV0dXJuIEVtcGxhY2UocGFyYW1zLi4uKTsKKyAgICBpZiAoIW1fcE9iamVjdC0+SGFzT25lUmVmKCkpCisgICAgICBtX3BPYmplY3QuUmVzZXQobmV3IE9iakNsYXNzKCptX3BPYmplY3QpKTsKKyAgICByZXR1cm4gbV9wT2JqZWN0LkdldCgpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNoYXJlZENvcHlPbldyaXRlJiB0aGF0KSBjb25zdCB7CisgICAgcmV0dXJuIG1fcE9iamVjdCA9PSB0aGF0Lm1fcE9iamVjdDsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgU2hhcmVkQ29weU9uV3JpdGUmIHRoYXQpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSB0aGF0KTsKKyAgfQorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gISFtX3BPYmplY3Q7IH0KKworIHByaXZhdGU6CisgIFJldGFpblB0cjxPYmpDbGFzcz4gbV9wT2JqZWN0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGZ4Y3J0CisKK3VzaW5nIGZ4Y3J0OjpTaGFyZWRDb3B5T25Xcml0ZTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX1NIQVJFRF9DT1BZX09OX1dSSVRFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L3NoYXJlZF9jb3B5X29uX3dyaXRlX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnhjcnQvc2hhcmVkX2NvcHlfb25fd3JpdGVfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZTMzZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L3NoYXJlZF9jb3B5X29uX3dyaXRlX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDEzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY29yZS9meGNydC9zaGFyZWRfY29weV9vbl93cml0ZS5oIgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgZnhjcnQgeworbmFtZXNwYWNlIHsKKworY2xhc3MgT2JzZXJ2ZXIgeworIHB1YmxpYzoKKyAgdm9pZCBPbkNvbnN0cnVjdChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeyBjb25zdHJ1Y3Rpb25fY291bnRzX1tuYW1lXSsrOyB9CisgIHZvaWQgT25EZXN0cnVjdChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeyBkZXN0cnVjdGlvbl9jb3VudHNfW25hbWVdKys7IH0KKyAgaW50IEdldENvbnN0cnVjdGlvbkNvdW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgcmV0dXJuIGNvbnN0cnVjdGlvbl9jb3VudHNfW25hbWVdOworICB9CisgIGludCBHZXREZXN0cnVjdGlvbkNvdW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgcmV0dXJuIGRlc3RydWN0aW9uX2NvdW50c19bbmFtZV07CisgIH0KKworIHByaXZhdGU6CisgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBpbnQ+IGNvbnN0cnVjdGlvbl9jb3VudHNfOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgaW50PiBkZXN0cnVjdGlvbl9jb3VudHNfOworfTsKKworY2xhc3MgT2JqZWN0IDogcHVibGljIFJldGFpbmFibGUgeworIHB1YmxpYzoKKyAgT2JqZWN0KE9ic2VydmVyKiBvYnNlcnZlciwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpCisgICAgICA6IG5hbWVfKG5hbWUpLCBvYnNlcnZlcl8ob2JzZXJ2ZXIpIHsKKyAgICBvYnNlcnZlci0+T25Db25zdHJ1Y3QobmFtZV8pOworICB9CisgIE9iamVjdChjb25zdCBPYmplY3QmIHRoYXQpIDogbmFtZV8odGhhdC5uYW1lXyksIG9ic2VydmVyXyh0aGF0Lm9ic2VydmVyXykgeworICAgIG9ic2VydmVyXy0+T25Db25zdHJ1Y3QobmFtZV8pOworICB9CisgIH5PYmplY3QoKSBvdmVycmlkZSB7IG9ic2VydmVyXy0+T25EZXN0cnVjdChuYW1lXyk7IH0KKworIHByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIG5hbWVfOworICBPYnNlcnZlciogb2JzZXJ2ZXJfOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK1RFU1QoU2hhcmVkQ29weU9uV3JpdGUsIE51bGwpIHsKKyAgT2JzZXJ2ZXIgb2JzZXJ2ZXI7CisgIHsKKyAgICBTaGFyZWRDb3B5T25Xcml0ZTxPYmplY3Q+IHB0cjsKKyAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcHRyLkdldE9iamVjdCgpKTsKKyAgfQorfQorCitURVNUKFNoYXJlZENvcHlPbldyaXRlLCBDb3B5KSB7CisgIE9ic2VydmVyIG9ic2VydmVyOworICB7CisgICAgU2hhcmVkQ29weU9uV3JpdGU8T2JqZWN0PiBwdHIxOworICAgIHB0cjEuRW1wbGFjZSgmb2JzZXJ2ZXIsIHN0ZDo6c3RyaW5nKCJvbmUiKSk7CisgICAgeworICAgICAgU2hhcmVkQ29weU9uV3JpdGU8T2JqZWN0PiBwdHIyID0gcHRyMTsKKyAgICAgIEVYUEVDVF9FUSgxLCBvYnNlcnZlci5HZXRDb25zdHJ1Y3Rpb25Db3VudCgib25lIikpOworICAgICAgRVhQRUNUX0VRKDAsIG9ic2VydmVyLkdldERlc3RydWN0aW9uQ291bnQoIm9uZSIpKTsKKyAgICB9CisgICAgeworICAgICAgU2hhcmVkQ29weU9uV3JpdGU8T2JqZWN0PiBwdHIzKHB0cjEpOworICAgICAgRVhQRUNUX0VRKDEsIG9ic2VydmVyLkdldENvbnN0cnVjdGlvbkNvdW50KCJvbmUiKSk7CisgICAgICBFWFBFQ1RfRVEoMCwgb2JzZXJ2ZXIuR2V0RGVzdHJ1Y3Rpb25Db3VudCgib25lIikpOworICAgIH0KKyAgICBFWFBFQ1RfRVEoMSwgb2JzZXJ2ZXIuR2V0Q29uc3RydWN0aW9uQ291bnQoIm9uZSIpKTsKKyAgICBFWFBFQ1RfRVEoMCwgb2JzZXJ2ZXIuR2V0RGVzdHJ1Y3Rpb25Db3VudCgib25lIikpOworICB9CisgIEVYUEVDVF9FUSgxLCBvYnNlcnZlci5HZXREZXN0cnVjdGlvbkNvdW50KCJvbmUiKSk7Cit9CisKK1RFU1QoU2hhcmVkQ29weU9uV3JpdGUsIEFzc2lnbk92ZXJPbGQpIHsKKyAgT2JzZXJ2ZXIgb2JzZXJ2ZXI7CisgIHsKKyAgICBTaGFyZWRDb3B5T25Xcml0ZTxPYmplY3Q+IHB0cjE7CisgICAgcHRyMS5FbXBsYWNlKCZvYnNlcnZlciwgc3RkOjpzdHJpbmcoIm9uZSIpKTsKKyAgICBwdHIxLkVtcGxhY2UoJm9ic2VydmVyLCBzdGQ6OnN0cmluZygidHdvIikpOworICAgIEVYUEVDVF9FUSgxLCBvYnNlcnZlci5HZXRDb25zdHJ1Y3Rpb25Db3VudCgib25lIikpOworICAgIEVYUEVDVF9FUSgxLCBvYnNlcnZlci5HZXRDb25zdHJ1Y3Rpb25Db3VudCgidHdvIikpOworICAgIEVYUEVDVF9FUSgxLCBvYnNlcnZlci5HZXREZXN0cnVjdGlvbkNvdW50KCJvbmUiKSk7CisgICAgRVhQRUNUX0VRKDAsIG9ic2VydmVyLkdldERlc3RydWN0aW9uQ291bnQoInR3byIpKTsKKyAgfQorICBFWFBFQ1RfRVEoMSwgb2JzZXJ2ZXIuR2V0RGVzdHJ1Y3Rpb25Db3VudCgidHdvIikpOworfQorCitURVNUKFNoYXJlZENvcHlPbldyaXRlLCBBc3NpZ25PdmVyUmV0YWluZWQpIHsKKyAgT2JzZXJ2ZXIgb2JzZXJ2ZXI7CisgIHsKKyAgICBTaGFyZWRDb3B5T25Xcml0ZTxPYmplY3Q+IHB0cjE7CisgICAgcHRyMS5FbXBsYWNlKCZvYnNlcnZlciwgc3RkOjpzdHJpbmcoIm9uZSIpKTsKKyAgICBTaGFyZWRDb3B5T25Xcml0ZTxPYmplY3Q+IHB0cjIocHRyMSk7CisgICAgcHRyMS5FbXBsYWNlKCZvYnNlcnZlciwgc3RkOjpzdHJpbmcoInR3byIpKTsKKyAgICBFWFBFQ1RfRVEoMSwgb2JzZXJ2ZXIuR2V0Q29uc3RydWN0aW9uQ291bnQoIm9uZSIpKTsKKyAgICBFWFBFQ1RfRVEoMSwgb2JzZXJ2ZXIuR2V0Q29uc3RydWN0aW9uQ291bnQoInR3byIpKTsKKyAgICBFWFBFQ1RfRVEoMCwgb2JzZXJ2ZXIuR2V0RGVzdHJ1Y3Rpb25Db3VudCgib25lIikpOworICAgIEVYUEVDVF9FUSgwLCBvYnNlcnZlci5HZXREZXN0cnVjdGlvbkNvdW50KCJ0d28iKSk7CisgIH0KKyAgRVhQRUNUX0VRKDEsIG9ic2VydmVyLkdldERlc3RydWN0aW9uQ291bnQoIm9uZSIpKTsKKyAgRVhQRUNUX0VRKDEsIG9ic2VydmVyLkdldERlc3RydWN0aW9uQ291bnQoInR3byIpKTsKK30KKworVEVTVChTaGFyZWRDb3B5T25Xcml0ZSwgR2V0TW9kaWZ5KSB7CisgIE9ic2VydmVyIG9ic2VydmVyOworICB7CisgICAgU2hhcmVkQ29weU9uV3JpdGU8T2JqZWN0PiBwdHI7CisgICAgRVhQRUNUX05FKG51bGxwdHIsIHB0ci5HZXRQcml2YXRlQ29weSgmb2JzZXJ2ZXIsIHN0ZDo6c3RyaW5nKCJvbmUiKSkpOworICAgIEVYUEVDVF9FUSgxLCBvYnNlcnZlci5HZXRDb25zdHJ1Y3Rpb25Db3VudCgib25lIikpOworICAgIEVYUEVDVF9FUSgwLCBvYnNlcnZlci5HZXREZXN0cnVjdGlvbkNvdW50KCJvbmUiKSk7CisKKyAgICBFWFBFQ1RfTkUobnVsbHB0ciwgcHRyLkdldFByaXZhdGVDb3B5KCZvYnNlcnZlciwgc3RkOjpzdHJpbmcoIm9uZSIpKSk7CisgICAgRVhQRUNUX0VRKDEsIG9ic2VydmVyLkdldENvbnN0cnVjdGlvbkNvdW50KCJvbmUiKSk7CisgICAgRVhQRUNUX0VRKDAsIG9ic2VydmVyLkdldERlc3RydWN0aW9uQ291bnQoIm9uZSIpKTsKKyAgICB7CisgICAgICBTaGFyZWRDb3B5T25Xcml0ZTxPYmplY3Q+IG90aGVyKHB0cik7CisgICAgICBFWFBFQ1RfTkUobnVsbHB0ciwgcHRyLkdldFByaXZhdGVDb3B5KCZvYnNlcnZlciwgc3RkOjpzdHJpbmcoIm9uZSIpKSk7CisgICAgICBFWFBFQ1RfRVEoMiwgb2JzZXJ2ZXIuR2V0Q29uc3RydWN0aW9uQ291bnQoIm9uZSIpKTsKKyAgICAgIEVYUEVDVF9FUSgwLCBvYnNlcnZlci5HZXREZXN0cnVjdGlvbkNvdW50KCJvbmUiKSk7CisgICAgfQorICAgIEVYUEVDVF9FUSgyLCBvYnNlcnZlci5HZXRDb25zdHJ1Y3Rpb25Db3VudCgib25lIikpOworICAgIEVYUEVDVF9FUSgxLCBvYnNlcnZlci5HZXREZXN0cnVjdGlvbkNvdW50KCJvbmUiKSk7CisgIH0KKyAgRVhQRUNUX0VRKDIsIG9ic2VydmVyLkdldERlc3RydWN0aW9uQ291bnQoIm9uZSIpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGZ4Y3J0CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L3N0cmluZ19kYXRhX3RlbXBsYXRlLmggYi9jb3JlL2Z4Y3J0L3N0cmluZ19kYXRhX3RlbXBsYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3OTdjMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvc3RyaW5nX2RhdGFfdGVtcGxhdGUuaApAQCAtMCwwICsxLDExOSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfU1RSSU5HX0RBVEFfVEVNUExBVEVfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9TVFJJTkdfREFUQV9URU1QTEFURV9IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9tZW1vcnkuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9tYXRoLmgiCisKK25hbWVzcGFjZSBmeGNydCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFyVHlwZT4KK2NsYXNzIFN0cmluZ0RhdGFUZW1wbGF0ZSB7CisgcHVibGljOgorICBzdGF0aWMgU3RyaW5nRGF0YVRlbXBsYXRlKiBDcmVhdGUoc2l6ZV90IG5MZW4pIHsKKyAgICBBU1NFUlQobkxlbiA+IDApOworCisgICAgLy8gQ2FsY3VsYXRlIHNwYWNlIG5lZWRlZCBmb3IgdGhlIGZpeGVkIHBvcnRpb24gb2YgdGhlIHN0cnVjdCBwbHVzIHRoZQorICAgIC8vIE5VTCBjaGFyIHRoYXQgaXMgbm90IGluY2x1ZGVkIGluIHxtX25BbGxvY0xlbmd0aHwuCisgICAgaW50IG92ZXJoZWFkID0gb2Zmc2V0b2YoU3RyaW5nRGF0YVRlbXBsYXRlLCBtX1N0cmluZykgKyBzaXplb2YoQ2hhclR5cGUpOworICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8c2l6ZV90PiBuU2l6ZSA9IG5MZW47CisgICAgblNpemUgKj0gc2l6ZW9mKENoYXJUeXBlKTsKKyAgICBuU2l6ZSArPSBvdmVyaGVhZDsKKworICAgIC8vIE5vdyByb3VuZCB0byBhbiA4LWJ5dGUgYm91bmRhcnkuIFdlJ2QgZXhwZWN0IHRoYXQgdGhpcyBpcyB0aGUgbWluaW11bQorICAgIC8vIGdyYW51bGFyaXR5IG9mIGFueSBvZiB0aGUgdW5kZXJseWluZyBhbGxvY2F0b3JzLCBzbyB0aGVyZSBtYXkgYmUgY2FzZXMKKyAgICAvLyB3aGVyZSB3ZSBjYW4gc2F2ZSBhIHJlLWFsbG9jIHdoZW4gYWRkaW5nIGEgZmV3IGNoYXJhY3RlcnMgdG8gYSBzdHJpbmcKKyAgICAvLyBieSB1c2luZyB0aGlzIG90aGVyd2lzZSB3YXN0ZWQgc3BhY2UuCisgICAgblNpemUgKz0gNzsKKyAgICBuU2l6ZSAmPSB+NzsKKyAgICBzaXplX3QgdG90YWxTaXplID0gblNpemUuVmFsdWVPckRpZSgpOworICAgIHNpemVfdCB1c2FibGVMZW4gPSAodG90YWxTaXplIC0gb3ZlcmhlYWQpIC8gc2l6ZW9mKENoYXJUeXBlKTsKKyAgICBBU1NFUlQodXNhYmxlTGVuID49IG5MZW4pOworCisgICAgdm9pZCogcERhdGEgPSBwZGZpdW06OmJhc2U6OlBhcnRpdGlvbkFsbG9jR2VuZXJpYygKKyAgICAgICAgZ1N0cmluZ1BhcnRpdGlvbkFsbG9jYXRvci5yb290KCksIHRvdGFsU2l6ZSwgIlN0cmluZ0RhdGFUZW1wbGF0ZSIpOworICAgIHJldHVybiBuZXcgKHBEYXRhKSBTdHJpbmdEYXRhVGVtcGxhdGUobkxlbiwgdXNhYmxlTGVuKTsKKyAgfQorCisgIHN0YXRpYyBTdHJpbmdEYXRhVGVtcGxhdGUqIENyZWF0ZShjb25zdCBTdHJpbmdEYXRhVGVtcGxhdGUmIG90aGVyKSB7CisgICAgU3RyaW5nRGF0YVRlbXBsYXRlKiByZXN1bHQgPSBDcmVhdGUob3RoZXIubV9uRGF0YUxlbmd0aCk7CisgICAgcmVzdWx0LT5Db3B5Q29udGVudHMob3RoZXIpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICBzdGF0aWMgU3RyaW5nRGF0YVRlbXBsYXRlKiBDcmVhdGUoY29uc3QgQ2hhclR5cGUqIHBTdHIsIHNpemVfdCBuTGVuKSB7CisgICAgU3RyaW5nRGF0YVRlbXBsYXRlKiByZXN1bHQgPSBDcmVhdGUobkxlbik7CisgICAgcmVzdWx0LT5Db3B5Q29udGVudHMocFN0ciwgbkxlbik7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgIHZvaWQgUmV0YWluKCkgeyArK21fblJlZnM7IH0KKyAgdm9pZCBSZWxlYXNlKCkgeworICAgIGlmICgtLW1fblJlZnMgPD0gMCkKKyAgICAgIHBkZml1bTo6YmFzZTo6UGFydGl0aW9uRnJlZUdlbmVyaWMoZ1N0cmluZ1BhcnRpdGlvbkFsbG9jYXRvci5yb290KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOworICB9CisKKyAgYm9vbCBDYW5PcGVyYXRlSW5QbGFjZShzaXplX3QgblRvdGFsTGVuKSBjb25zdCB7CisgICAgcmV0dXJuIG1fblJlZnMgPD0gMSAmJiBuVG90YWxMZW4gPD0gbV9uQWxsb2NMZW5ndGg7CisgIH0KKworICB2b2lkIENvcHlDb250ZW50cyhjb25zdCBTdHJpbmdEYXRhVGVtcGxhdGUmIG90aGVyKSB7CisgICAgQVNTRVJUKG90aGVyLm1fbkRhdGFMZW5ndGggPD0gbV9uQWxsb2NMZW5ndGgpOworICAgIG1lbWNweShtX1N0cmluZywgb3RoZXIubV9TdHJpbmcsCisgICAgICAgICAgIChvdGhlci5tX25EYXRhTGVuZ3RoICsgMSkgKiBzaXplb2YoQ2hhclR5cGUpKTsKKyAgfQorCisgIHZvaWQgQ29weUNvbnRlbnRzKGNvbnN0IENoYXJUeXBlKiBwU3RyLCBzaXplX3QgbkxlbikgeworICAgIEFTU0VSVChuTGVuID49IDAgJiYgbkxlbiA8PSBtX25BbGxvY0xlbmd0aCk7CisgICAgbWVtY3B5KG1fU3RyaW5nLCBwU3RyLCBuTGVuICogc2l6ZW9mKENoYXJUeXBlKSk7CisgICAgbV9TdHJpbmdbbkxlbl0gPSAwOworICB9CisKKyAgdm9pZCBDb3B5Q29udGVudHNBdChzaXplX3Qgb2Zmc2V0LCBjb25zdCBDaGFyVHlwZSogcFN0ciwgc2l6ZV90IG5MZW4pIHsKKyAgICBBU1NFUlQob2Zmc2V0ID49IDAgJiYgbkxlbiA+PSAwICYmIG9mZnNldCArIG5MZW4gPD0gbV9uQWxsb2NMZW5ndGgpOworICAgIG1lbWNweShtX1N0cmluZyArIG9mZnNldCwgcFN0ciwgbkxlbiAqIHNpemVvZihDaGFyVHlwZSkpOworICAgIG1fU3RyaW5nW29mZnNldCArIG5MZW5dID0gMDsKKyAgfQorCisgIC8vIFRvIGVuc3VyZSByZWYgY291bnRzIGRvIG5vdCBvdmVyZmxvdywgY29uc2lkZXIgdGhlIHdvcnN0IHBvc3NpYmxlIGNhc2U6CisgIC8vIHRoZSBlbnRpcmUgYWRkcmVzcyBzcGFjZSBjb250YWlucyBub3RoaW5nIGJ1dCBwb2ludGVycyB0byB0aGlzIG9iamVjdC4KKyAgLy8gU2luY2UgdGhlIGNvdW50IGluY3JlbWVudHMgd2l0aCBlYWNoIG5ldyBwb2ludGVyLCB0aGUgbGFyZ2VzdCB2YWx1ZSBpcworICAvLyB0aGUgbnVtYmVyIG9mIHBvaW50ZXJzIHRoYXQgY2FuIGZpdCBpbnRvIHRoZSBhZGRyZXNzIHNwYWNlLiBUaGUgc2l6ZSBvZgorICAvLyB0aGUgYWRkcmVzcyBzcGFjZSBpdHNlbGYgaXMgYSBnb29kIHVwcGVyIGJvdW5kIG9uIGl0LgorICBpbnRwdHJfdCBtX25SZWZzOworCisgIC8vIFRoZXNlIGxlbmd0aHMgYXJlIGluIHRlcm1zIG9mIG51bWJlciBvZiBjaGFyYWN0ZXJzLCBub3QgYnl0ZXMsIGFuZCBkbyBub3QKKyAgLy8gaW5jbHVkZSB0aGUgdGVybWluYXRpbmcgTlVMIGNoYXJhY3RlciwgYnV0IHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBpcyBzaXplZAorICAvLyB0byBiZSBjYXBhYmxlIG9mIGhvbGRpbmcgaXQuCisgIHNpemVfdCBtX25EYXRhTGVuZ3RoOworICBzaXplX3QgbV9uQWxsb2NMZW5ndGg7CisKKyAgLy8gTm90IHJlYWxseSAxLCB2YXJpYWJsZSBzaXplLgorICBDaGFyVHlwZSBtX1N0cmluZ1sxXTsKKworIHByaXZhdGU6CisgIFN0cmluZ0RhdGFUZW1wbGF0ZShzaXplX3QgZGF0YUxlbiwgc2l6ZV90IGFsbG9jTGVuKQorICAgICAgOiBtX25SZWZzKDApLCBtX25EYXRhTGVuZ3RoKGRhdGFMZW4pLCBtX25BbGxvY0xlbmd0aChhbGxvY0xlbikgeworICAgIEFTU0VSVChkYXRhTGVuID49IDApOworICAgIEFTU0VSVChkYXRhTGVuIDw9IGFsbG9jTGVuKTsKKyAgICBtX1N0cmluZ1tkYXRhTGVuXSA9IDA7CisgIH0KKworICB+U3RyaW5nRGF0YVRlbXBsYXRlKCkgPSBkZWxldGU7Cit9OworCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgU3RyaW5nRGF0YVRlbXBsYXRlPGNoYXI+OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIFN0cmluZ0RhdGFUZW1wbGF0ZTx3Y2hhcl90PjsKKworfSAgLy8gbmFtZXNwYWNlIGZ4Y3J0CisKK3VzaW5nIGZ4Y3J0OjpTdHJpbmdEYXRhVGVtcGxhdGU7CisKKyNlbmRpZiAgLy8gQ09SRV9GWENSVF9TVFJJTkdfREFUQV9URU1QTEFURV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC9zdHJpbmdfcG9vbF90ZW1wbGF0ZS5oIGIvY29yZS9meGNydC9zdHJpbmdfcG9vbF90ZW1wbGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmOWZiMDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L3N0cmluZ19wb29sX3RlbXBsYXRlLmgKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfU1RSSU5HX1BPT0xfVEVNUExBVEVfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9TVFJJTkdfUE9PTF9URU1QTEFURV9IXworCisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisKK25hbWVzcGFjZSBmeGNydCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmdUeXBlPgorY2xhc3MgU3RyaW5nUG9vbFRlbXBsYXRlIHsKKyBwdWJsaWM6CisgIFN0cmluZ1R5cGUgSW50ZXJuKGNvbnN0IFN0cmluZ1R5cGUmIHN0cikgeyByZXR1cm4gKm1fUG9vbC5pbnNlcnQoc3RyKS5maXJzdDsgfQorICB2b2lkIENsZWFyKCkgeyBtX1Bvb2wuY2xlYXIoKTsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjp1bm9yZGVyZWRfc2V0PFN0cmluZ1R5cGU+IG1fUG9vbDsKK307CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBTdHJpbmdQb29sVGVtcGxhdGU8Qnl0ZVN0cmluZz47CitleHRlcm4gdGVtcGxhdGUgY2xhc3MgU3RyaW5nUG9vbFRlbXBsYXRlPFdpZGVTdHJpbmc+OworCit9ICAvLyBuYW1lc3BhY2UgZnhjcnQKKwordXNpbmcgZnhjcnQ6OlN0cmluZ1Bvb2xUZW1wbGF0ZTsKKwordXNpbmcgQnl0ZVN0cmluZ1Bvb2wgPSBTdHJpbmdQb29sVGVtcGxhdGU8Qnl0ZVN0cmluZz47Cit1c2luZyBXaWRlU3RyaW5nUG9vbCA9IFN0cmluZ1Bvb2xUZW1wbGF0ZTxXaWRlU3RyaW5nPjsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX1NUUklOR19QT09MX1RFTVBMQVRFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L3N0cmluZ19wb29sX3RlbXBsYXRlX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnhjcnQvc3RyaW5nX3Bvb2xfdGVtcGxhdGVfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxN2UzM2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L3N0cmluZ19wb29sX3RlbXBsYXRlX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDk3IEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3N0cmluZ19wb29sX3RlbXBsYXRlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIGZ4Y3J0IHsKKworVEVTVChTdHJpbmdQb29sLCBCeXRlU3RyaW5nKSB7CisgIEJ5dGVTdHJpbmdQb29sIHBvb2w7CisKKyAgQnl0ZVN0cmluZyBudWxsMTsKKyAgQnl0ZVN0cmluZyBudWxsMjsKKyAgQnl0ZVN0cmluZyBnb2F0czEoImdvYXRzIik7CisgIEJ5dGVTdHJpbmcgZ29hdHMyKCJnb2F0cyIpOworCisgIC8vIFVuZGVybHlpbmcgc3RvcmFnZSwgaWYgbm9uLW51bGwsIGlzIG5vdCBzaGFyZWQuCisgIEVYUEVDVF9FUShudWxscHRyLCBudWxsMS5tX3BEYXRhLkdldCgpKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIG51bGwyLm1fcERhdGEuR2V0KCkpOworICBFWFBFQ1RfTkUoZ29hdHMxLm1fcERhdGEsIGdvYXRzMi5tX3BEYXRhKTsKKworICBCeXRlU3RyaW5nIGludGVybmVkX251bGwxID0gcG9vbC5JbnRlcm4obnVsbDEpOworICBCeXRlU3RyaW5nIGludGVybmVkX251bGwyID0gcG9vbC5JbnRlcm4obnVsbDIpOworICBCeXRlU3RyaW5nIGludGVybmVkX2dvYXRzMSA9IHBvb2wuSW50ZXJuKGdvYXRzMSk7CisgIEJ5dGVTdHJpbmcgaW50ZXJuZWRfZ29hdHMyID0gcG9vbC5JbnRlcm4oZ29hdHMyKTsKKworICAvLyBTdHJpbmdzIGFyZSBsb2dpY2FsbHkgZXF1YWwgYWZ0ZXIgYmVpbmcgaW50ZXJuZWQuCisgIEVYUEVDVF9FUShudWxsMSwgaW50ZXJuZWRfbnVsbDEpOworICBFWFBFQ1RfRVEobnVsbDIsIGludGVybmVkX251bGwyKTsKKyAgRVhQRUNUX0VRKGdvYXRzMSwgaW50ZXJuZWRfZ29hdHMxKTsKKyAgRVhQRUNUX0VRKGdvYXRzMiwgaW50ZXJuZWRfZ29hdHMyKTsKKworICAvLyBJbnRlcm5lZCB1bmRlcmx5aW5nIHN0b3JhZ2UsIGlmIG5vbi1udWxsLCBiZWxvbmdzIHRvIGZpcnN0IHNlZW4uCisgIEVYUEVDVF9FUShudWxscHRyLCBpbnRlcm5lZF9udWxsMS5tX3BEYXRhLkdldCgpKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIGludGVybmVkX251bGwyLm1fcERhdGEuR2V0KCkpOworICBFWFBFQ1RfRVEoZ29hdHMxLm1fcERhdGEsIGludGVybmVkX2dvYXRzMS5tX3BEYXRhKTsKKyAgRVhQRUNUX0VRKGdvYXRzMS5tX3BEYXRhLCBpbnRlcm5lZF9nb2F0czIubV9wRGF0YSk7CisKKyAgcG9vbC5DbGVhcigpOworICBCeXRlU3RyaW5nIHJlaW50ZXJuZWRfbnVsbDIgPSBwb29sLkludGVybihudWxsMik7CisgIEJ5dGVTdHJpbmcgcmVpbnRlcm5lZF9udWxsMSA9IHBvb2wuSW50ZXJuKG51bGwyKTsKKyAgQnl0ZVN0cmluZyByZWludGVybmVkX2dvYXRzMiA9IHBvb2wuSW50ZXJuKGdvYXRzMik7CisgIEJ5dGVTdHJpbmcgcmVpbnRlcm5lZF9nb2F0czEgPSBwb29sLkludGVybihnb2F0czIpOworCisgIC8vIEFmdGVyIGNsZWFyaW5nIHBvb2wsIHN0b3JhZ2Ugd2FzIHJlLWludGVybmVkIHVzaW5nIHNlY29uZCBzdHJpbmdzLgorICBFWFBFQ1RfRVEobnVsbHB0ciwgaW50ZXJuZWRfbnVsbDEubV9wRGF0YS5HZXQoKSk7CisgIEVYUEVDVF9FUShudWxscHRyLCBpbnRlcm5lZF9udWxsMi5tX3BEYXRhLkdldCgpKTsKKyAgRVhQRUNUX0VRKGdvYXRzMi5tX3BEYXRhLCByZWludGVybmVkX2dvYXRzMS5tX3BEYXRhKTsKKyAgRVhQRUNUX0VRKGdvYXRzMi5tX3BEYXRhLCByZWludGVybmVkX2dvYXRzMi5tX3BEYXRhKTsKK30KKworVEVTVChTdHJpbmdQb29sLCBXaWRlU3RyaW5nKSB7CisgIFdpZGVTdHJpbmdQb29sIHBvb2w7CisKKyAgV2lkZVN0cmluZyBudWxsMTsKKyAgV2lkZVN0cmluZyBudWxsMjsKKyAgV2lkZVN0cmluZyBnb2F0czEoTCJnb2F0cyIpOworICBXaWRlU3RyaW5nIGdvYXRzMihMImdvYXRzIik7CisKKyAgLy8gVW5kZXJseWluZyBzdG9yYWdlLCBpZiBub24tbnVsbCwgaXMgbm90IHNoYXJlZC4KKyAgRVhQRUNUX0VRKG51bGxwdHIsIG51bGwxLm1fcERhdGEuR2V0KCkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgbnVsbDIubV9wRGF0YS5HZXQoKSk7CisgIEVYUEVDVF9ORShnb2F0czEubV9wRGF0YSwgZ29hdHMyLm1fcERhdGEpOworCisgIFdpZGVTdHJpbmcgaW50ZXJuZWRfbnVsbDEgPSBwb29sLkludGVybihudWxsMSk7CisgIFdpZGVTdHJpbmcgaW50ZXJuZWRfbnVsbDIgPSBwb29sLkludGVybihudWxsMik7CisgIFdpZGVTdHJpbmcgaW50ZXJuZWRfZ29hdHMxID0gcG9vbC5JbnRlcm4oZ29hdHMxKTsKKyAgV2lkZVN0cmluZyBpbnRlcm5lZF9nb2F0czIgPSBwb29sLkludGVybihnb2F0czIpOworCisgIC8vIFN0cmluZ3MgYXJlIGxvZ2ljYWxseSBlcXVhbCBhZnRlciBiZWluZyBpbnRlcm5lZC4KKyAgRVhQRUNUX0VRKG51bGwxLCBpbnRlcm5lZF9udWxsMSk7CisgIEVYUEVDVF9FUShudWxsMiwgaW50ZXJuZWRfbnVsbDIpOworICBFWFBFQ1RfRVEoZ29hdHMxLCBpbnRlcm5lZF9nb2F0czEpOworICBFWFBFQ1RfRVEoZ29hdHMyLCBpbnRlcm5lZF9nb2F0czIpOworCisgIC8vIEludGVybmVkIHVuZGVybHlpbmcgc3RvcmFnZSwgaWYgbm9uLW51bGwsIGJlbG9uZ3MgdG8gZmlyc3Qgc2Vlbi4KKyAgRVhQRUNUX0VRKG51bGxwdHIsIGludGVybmVkX251bGwxLm1fcERhdGEuR2V0KCkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgaW50ZXJuZWRfbnVsbDIubV9wRGF0YS5HZXQoKSk7CisgIEVYUEVDVF9FUShnb2F0czEubV9wRGF0YSwgaW50ZXJuZWRfZ29hdHMxLm1fcERhdGEpOworICBFWFBFQ1RfRVEoZ29hdHMxLm1fcERhdGEsIGludGVybmVkX2dvYXRzMi5tX3BEYXRhKTsKKworICBwb29sLkNsZWFyKCk7CisgIFdpZGVTdHJpbmcgcmVpbnRlcm5lZF9udWxsMiA9IHBvb2wuSW50ZXJuKG51bGwyKTsKKyAgV2lkZVN0cmluZyByZWludGVybmVkX251bGwxID0gcG9vbC5JbnRlcm4obnVsbDIpOworICBXaWRlU3RyaW5nIHJlaW50ZXJuZWRfZ29hdHMyID0gcG9vbC5JbnRlcm4oZ29hdHMyKTsKKyAgV2lkZVN0cmluZyByZWludGVybmVkX2dvYXRzMSA9IHBvb2wuSW50ZXJuKGdvYXRzMik7CisKKyAgLy8gQWZ0ZXIgY2xlYXJpbmcgcG9vbCwgc3RvcmFnZSB3YXMgcmUtaW50ZXJuZWQgdXNpbmcgc2Vjb25kIHN0cmluZ3MuCisgIEVYUEVDVF9FUShudWxscHRyLCBpbnRlcm5lZF9udWxsMS5tX3BEYXRhLkdldCgpKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIGludGVybmVkX251bGwyLm1fcERhdGEuR2V0KCkpOworICBFWFBFQ1RfRVEoZ29hdHMyLm1fcERhdGEsIHJlaW50ZXJuZWRfZ29hdHMxLm1fcERhdGEpOworICBFWFBFQ1RfRVEoZ29hdHMyLm1fcERhdGEsIHJlaW50ZXJuZWRfZ29hdHMyLm1fcERhdGEpOworfQorCit9ICAvLyBuYW1lc3BhY2UgZnhjcnQKZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvc3RyaW5nX3ZpZXdfdGVtcGxhdGUuaCBiL2NvcmUvZnhjcnQvc3RyaW5nX3ZpZXdfdGVtcGxhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTQzNmQzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC9zdHJpbmdfdmlld190ZW1wbGF0ZS5oCkBAIC0wLDAgKzEsMjQ5IEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENSVF9TVFJJTkdfVklFV19URU1QTEFURV9IXworI2RlZmluZSBDT1JFX0ZYQ1JUX1NUUklOR19WSUVXX1RFTVBMQVRFX0hfCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL29wdGlvbmFsLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorCituYW1lc3BhY2UgZnhjcnQgeworCisvLyBBbiBpbW11dGFibGUgc3RyaW5nIHdpdGggY2FsbGVyLXByb3ZpZGVkIHN0b3JhZ2Ugd2hpY2ggbXVzdCBvdXRsaXZlIHRoZQorLy8gc3RyaW5nIGl0c2VsZi4gVGhlc2UgYXJlIG5vdCBuZWNlc3NhcmlseSBudWwtdGVybWluYXRlZCwgc28gdGhhdCBzdWJzdHJpbmcKKy8vIGV4dHJhY3Rpb24gKHZpYSB0aGUgTWlkKCksIExlZnQoKSwgYW5kIFJpZ2h0KCkgbWV0aG9kcykgaXMgY29weS1mcmVlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBTdHJpbmdWaWV3VGVtcGxhdGUgeworIHB1YmxpYzoKKyAgdXNpbmcgQ2hhclR5cGUgPSBUOworICB1c2luZyBVbnNpZ25lZFR5cGUgPSB0eXBlbmFtZSBzdGQ6Om1ha2VfdW5zaWduZWQ8Q2hhclR5cGU+Ojp0eXBlOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IGNvbnN0IENoYXJUeXBlKjsKKyAgdXNpbmcgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciA9IHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj47CisKKyAgU3RyaW5nVmlld1RlbXBsYXRlKCkgOiBtX1B0cihudWxscHRyKSwgbV9MZW5ndGgoMCkge30KKworICAvLyBEZWxpYmVyYXRlbHkgaW1wbGljaXQgdG8gYXZvaWQgY2FsbGluZyBvbiBldmVyeSBzdHJpbmcgbGl0ZXJhbC4KKyAgLy8gTk9MSU5UTkVYVExJTkUocnVudGltZS9leHBsaWNpdCkKKyAgU3RyaW5nVmlld1RlbXBsYXRlKGNvbnN0IENoYXJUeXBlKiBwdHIpCisgICAgICA6IG1fUHRyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVW5zaWduZWRUeXBlKj4ocHRyKSksCisgICAgICAgIG1fTGVuZ3RoKHB0ciA/IEZYU1lTX2xlbihwdHIpIDogMCkge30KKworICBTdHJpbmdWaWV3VGVtcGxhdGUoY29uc3QgQ2hhclR5cGUqIHB0ciwgc2l6ZV90IGxlbikKKyAgICAgIDogbV9QdHIocmVpbnRlcnByZXRfY2FzdDxjb25zdCBVbnNpZ25lZFR5cGUqPihwdHIpKSwgbV9MZW5ndGgobGVuKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVID0gVW5zaWduZWRUeXBlPgorICBTdHJpbmdWaWV3VGVtcGxhdGUoCisgICAgICBjb25zdCBVbnNpZ25lZFR5cGUqIHB0ciwKKyAgICAgIHNpemVfdCBzaXplLAorICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfc2FtZTxVLCBDaGFyVHlwZT46OnZhbHVlPjo6dHlwZSogPSAwKQorICAgICAgOiBtX1B0cihwdHIpLCBtX0xlbmd0aChzaXplKSB7fQorCisgIC8vIERlbGliZXJhdGVseSBpbXBsaWNpdCB0byBhdm9pZCBjYWxsaW5nIG9uIGV2ZXJ5IHN0cmluZyBsaXRlcmFsLgorICAvLyB8Y2h8IG11c3QgYmUgYW4gbHZhbHVlIHRoYXQgb3V0bGl2ZXMgdGhlIFN0cmluZ1ZpZXdUZW1wbGF0ZS4KKyAgLy8gTk9MSU5UTkVYVExJTkUocnVudGltZS9leHBsaWNpdCkKKyAgU3RyaW5nVmlld1RlbXBsYXRlKENoYXJUeXBlJiBjaCkgeworICAgIG1fUHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVbnNpZ25lZFR5cGUqPigmY2gpOworICAgIG1fTGVuZ3RoID0gMTsKKyAgfQorCisgIFN0cmluZ1ZpZXdUZW1wbGF0ZShjb25zdCBTdHJpbmdWaWV3VGVtcGxhdGUmIHNyYykgeworICAgIG1fUHRyID0gc3JjLm1fUHRyOworICAgIG1fTGVuZ3RoID0gc3JjLm1fTGVuZ3RoOworICB9CisKKyAgLy8gQW55IGNoYW5nZXMgdG8gfHZlY3wgaW52YWxpZGF0ZSB0aGUgc3RyaW5nLgorICBleHBsaWNpdCBTdHJpbmdWaWV3VGVtcGxhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8VW5zaWduZWRUeXBlPiYgdmVjKSB7CisgICAgbV9MZW5ndGggPSB2ZWMuc2l6ZSgpOworICAgIG1fUHRyID0gbV9MZW5ndGggPyB2ZWMuZGF0YSgpIDogbnVsbHB0cjsKKyAgfQorCisgIFN0cmluZ1ZpZXdUZW1wbGF0ZSYgb3BlcmF0b3I9KGNvbnN0IENoYXJUeXBlKiBzcmMpIHsKKyAgICBtX1B0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVW5zaWduZWRUeXBlKj4oc3JjKTsKKyAgICBtX0xlbmd0aCA9IHNyYyA/IEZYU1lTX2xlbihzcmMpIDogMDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBTdHJpbmdWaWV3VGVtcGxhdGUmIG9wZXJhdG9yPShjb25zdCBTdHJpbmdWaWV3VGVtcGxhdGUmIHNyYykgeworICAgIG1fUHRyID0gc3JjLm1fUHRyOworICAgIG1fTGVuZ3RoID0gc3JjLm1fTGVuZ3RoOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IENoYXJUeXBlKj4obV9QdHIuR2V0KCkpOworICB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9QdHIgPyByZWludGVycHJldF9jYXN0PGNvbnN0IENoYXJUeXBlKj4obV9QdHIuR2V0KCkpICsgbV9MZW5ndGgKKyAgICAgICAgICAgICAgICAgOiBudWxscHRyOworICB9CisKKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOworICB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDaGFyVHlwZSogcHRyKSBjb25zdCB7CisgICAgcmV0dXJuIEZYU1lTX2xlbihwdHIpID09IG1fTGVuZ3RoICYmCisgICAgICAgICAgIEZYU1lTX2NtcChwdHIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ2hhclR5cGUqPihtX1B0ci5HZXQoKSksCisgICAgICAgICAgICAgICAgICAgICBtX0xlbmd0aCkgPT0gMDsKKyAgfQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgU3RyaW5nVmlld1RlbXBsYXRlJiBvdGhlcikgY29uc3QgeworICAgIHJldHVybiBvdGhlci5tX0xlbmd0aCA9PSBtX0xlbmd0aCAmJgorICAgICAgICAgICBGWFNZU19jbXAocmVpbnRlcnByZXRfY2FzdDxjb25zdCBDaGFyVHlwZSo+KG90aGVyLm1fUHRyLkdldCgpKSwKKyAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ2hhclR5cGUqPihtX1B0ci5HZXQoKSksCisgICAgICAgICAgICAgICAgICAgICBtX0xlbmd0aCkgPT0gMDsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ2hhclR5cGUqIHB0cikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBwdHIpOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTdHJpbmdWaWV3VGVtcGxhdGUmIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICB9CisKKyAgdWludDMyX3QgR2V0SUQoKSBjb25zdCB7CisgICAgaWYgKG1fTGVuZ3RoID09IDApCisgICAgICByZXR1cm4gMDsKKworICAgIHVpbnQzMl90IHN0cmlkID0gMDsKKyAgICBzaXplX3Qgc2l6ZSA9IHN0ZDo6bWluKHN0YXRpY19jYXN0PHNpemVfdD4oNCksIG1fTGVuZ3RoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICAgIHN0cmlkID0gc3RyaWQgKiAyNTYgKyBtX1B0ci5HZXQoKVtpXTsKKworICAgIHJldHVybiBzdHJpZCA8PCAoKDQgLSBzaXplKSAqIDgpOworICB9CisKKyAgY29uc3QgVW5zaWduZWRUeXBlKiByYXdfc3RyKCkgY29uc3QgeyByZXR1cm4gbV9QdHIuR2V0KCk7IH0KKyAgY29uc3QgQ2hhclR5cGUqIHVudGVybWluYXRlZF9jX3N0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDaGFyVHlwZSo+KG1fUHRyLkdldCgpKTsKKyAgfQorCisgIHNpemVfdCBHZXRMZW5ndGgoKSBjb25zdCB7IHJldHVybiBtX0xlbmd0aDsgfQorICBib29sIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX0xlbmd0aCA9PSAwOyB9CisgIGJvb2wgSXNWYWxpZEluZGV4KHNpemVfdCBpbmRleCkgY29uc3QgeyByZXR1cm4gaW5kZXggPCBHZXRMZW5ndGgoKTsgfQorICBib29sIElzVmFsaWRMZW5ndGgoc2l6ZV90IGxlbmd0aCkgY29uc3QgeyByZXR1cm4gbGVuZ3RoIDw9IEdldExlbmd0aCgpOyB9CisKKyAgY29uc3QgVW5zaWduZWRUeXBlJiBvcGVyYXRvcltdKGNvbnN0IHNpemVfdCBpbmRleCkgY29uc3QgeworICAgIEFTU0VSVChJc1ZhbGlkSW5kZXgoaW5kZXgpKTsKKyAgICByZXR1cm4gbV9QdHIuR2V0KClbaW5kZXhdOworICB9CisKKyAgVW5zaWduZWRUeXBlIEZpcnN0KCkgY29uc3QgeyByZXR1cm4gR2V0TGVuZ3RoKCkgPyAoKnRoaXMpWzBdIDogMDsgfQorCisgIFVuc2lnbmVkVHlwZSBMYXN0KCkgY29uc3QgeworICAgIHJldHVybiBHZXRMZW5ndGgoKSA/ICgqdGhpcylbR2V0TGVuZ3RoKCkgLSAxXSA6IDA7CisgIH0KKworICBjb25zdCBDaGFyVHlwZSBDaGFyQXQoY29uc3Qgc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgQVNTRVJUKElzVmFsaWRJbmRleChpbmRleCkpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDaGFyVHlwZT4obV9QdHIuR2V0KClbaW5kZXhdKTsKKyAgfQorCisgIE9wdGlvbmFsPHNpemVfdD4gRmluZChDaGFyVHlwZSBjaCkgY29uc3QgeworICAgIGNvbnN0IGF1dG8qIGZvdW5kID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVbnNpZ25lZFR5cGUqPihGWFNZU19jaHIoCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ2hhclR5cGUqPihtX1B0ci5HZXQoKSksIGNoLCBtX0xlbmd0aCkpOworCisgICAgcmV0dXJuIGZvdW5kID8gT3B0aW9uYWw8c2l6ZV90Pihmb3VuZCAtIG1fUHRyLkdldCgpKSA6IE9wdGlvbmFsPHNpemVfdD4oKTsKKyAgfQorCisgIGJvb2wgQ29udGFpbnMoQ2hhclR5cGUgY2gpIGNvbnN0IHsgcmV0dXJuIEZpbmQoY2gpLmhhc192YWx1ZSgpOyB9CisKKyAgU3RyaW5nVmlld1RlbXBsYXRlIE1pZChzaXplX3QgZmlyc3QsIHNpemVfdCBjb3VudCkgY29uc3QgeworICAgIGlmICghbV9QdHIuR2V0KCkpCisgICAgICByZXR1cm4gU3RyaW5nVmlld1RlbXBsYXRlKCk7CisKKyAgICBpZiAoIUlzVmFsaWRJbmRleChmaXJzdCkpCisgICAgICByZXR1cm4gU3RyaW5nVmlld1RlbXBsYXRlKCk7CisKKyAgICBpZiAoY291bnQgPT0gMCB8fCAhSXNWYWxpZExlbmd0aChjb3VudCkpCisgICAgICByZXR1cm4gU3RyaW5nVmlld1RlbXBsYXRlKCk7CisKKyAgICBpZiAoIUlzVmFsaWRJbmRleChmaXJzdCArIGNvdW50IC0gMSkpCisgICAgICByZXR1cm4gU3RyaW5nVmlld1RlbXBsYXRlKCk7CisKKyAgICByZXR1cm4gU3RyaW5nVmlld1RlbXBsYXRlKG1fUHRyLkdldCgpICsgZmlyc3QsIGNvdW50KTsKKyAgfQorCisgIFN0cmluZ1ZpZXdUZW1wbGF0ZSBMZWZ0KHNpemVfdCBjb3VudCkgY29uc3QgeworICAgIGlmIChjb3VudCA9PSAwIHx8ICFJc1ZhbGlkTGVuZ3RoKGNvdW50KSkKKyAgICAgIHJldHVybiBTdHJpbmdWaWV3VGVtcGxhdGUoKTsKKyAgICByZXR1cm4gTWlkKDAsIGNvdW50KTsKKyAgfQorCisgIFN0cmluZ1ZpZXdUZW1wbGF0ZSBSaWdodChzaXplX3QgY291bnQpIGNvbnN0IHsKKyAgICBpZiAoY291bnQgPT0gMCB8fCAhSXNWYWxpZExlbmd0aChjb3VudCkpCisgICAgICByZXR1cm4gU3RyaW5nVmlld1RlbXBsYXRlKCk7CisgICAgcmV0dXJuIE1pZChHZXRMZW5ndGgoKSAtIGNvdW50LCBjb3VudCk7CisgIH0KKworICBTdHJpbmdWaWV3VGVtcGxhdGUgVHJpbW1lZFJpZ2h0KENoYXJUeXBlIGNoKSBjb25zdCB7CisgICAgaWYgKElzRW1wdHkoKSkKKyAgICAgIHJldHVybiBTdHJpbmdWaWV3VGVtcGxhdGUoKTsKKworICAgIHNpemVfdCBwb3MgPSBHZXRMZW5ndGgoKTsKKyAgICB3aGlsZSAocG9zICYmIENoYXJBdChwb3MgLSAxKSA9PSBjaCkKKyAgICAgIHBvcy0tOworCisgICAgaWYgKHBvcyA9PSAwKQorICAgICAgcmV0dXJuIFN0cmluZ1ZpZXdUZW1wbGF0ZSgpOworCisgICAgcmV0dXJuIFN0cmluZ1ZpZXdUZW1wbGF0ZShtX1B0ci5HZXQoKSwgcG9zKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFN0cmluZ1ZpZXdUZW1wbGF0ZSYgdGhhdCkgY29uc3QgeworICAgIGludCByZXN1bHQgPSBGWFNZU19jbXAocmVpbnRlcnByZXRfY2FzdDxjb25zdCBDaGFyVHlwZSo+KG1fUHRyLkdldCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ2hhclR5cGUqPih0aGF0Lm1fUHRyLkdldCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKG1fTGVuZ3RoLCB0aGF0Lm1fTGVuZ3RoKSk7CisgICAgcmV0dXJuIHJlc3VsdCA8IDAgfHwgKHJlc3VsdCA9PSAwICYmIG1fTGVuZ3RoIDwgdGhhdC5tX0xlbmd0aCk7CisgIH0KKworICBib29sIG9wZXJhdG9yPihjb25zdCBTdHJpbmdWaWV3VGVtcGxhdGUmIHRoYXQpIGNvbnN0IHsKKyAgICBpbnQgcmVzdWx0ID0gRlhTWVNfY21wKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ2hhclR5cGUqPihtX1B0ci5HZXQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IENoYXJUeXBlKj4odGhhdC5tX1B0ci5HZXQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1pbihtX0xlbmd0aCwgdGhhdC5tX0xlbmd0aCkpOworICAgIHJldHVybiByZXN1bHQgPiAwIHx8IChyZXN1bHQgPT0gMCAmJiBtX0xlbmd0aCA+IHRoYXQubV9MZW5ndGgpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIFVub3duZWRQdHI8Y29uc3QgVW5zaWduZWRUeXBlPiBtX1B0cjsKKyAgc2l6ZV90IG1fTGVuZ3RoOworCisgcHJpdmF0ZToKKyAgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCkgdGhyb3coKSB7IHJldHVybiBudWxscHRyOyB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVCogbGhzLCBjb25zdCBTdHJpbmdWaWV3VGVtcGxhdGU8VD4mIHJocykgeworICByZXR1cm4gcmhzID09IGxoczsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUKiBsaHMsIGNvbnN0IFN0cmluZ1ZpZXdUZW1wbGF0ZTxUPiYgcmhzKSB7CisgIHJldHVybiByaHMgIT0gbGhzOworfQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgVCogbGhzLCBjb25zdCBTdHJpbmdWaWV3VGVtcGxhdGU8VD4mIHJocykgeworICByZXR1cm4gcmhzID4gbGhzOworfQorCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgU3RyaW5nVmlld1RlbXBsYXRlPGNoYXI+OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIFN0cmluZ1ZpZXdUZW1wbGF0ZTx3Y2hhcl90PjsKKwordXNpbmcgQnl0ZVN0cmluZ1ZpZXcgPSBTdHJpbmdWaWV3VGVtcGxhdGU8Y2hhcj47Cit1c2luZyBXaWRlU3RyaW5nVmlldyA9IFN0cmluZ1ZpZXdUZW1wbGF0ZTx3Y2hhcl90PjsKKworfSAgLy8gbmFtZXNwYWNlIGZ4Y3J0CisKK3VzaW5nIEJ5dGVTdHJpbmdWaWV3ID0gZnhjcnQ6OkJ5dGVTdHJpbmdWaWV3OwordXNpbmcgV2lkZVN0cmluZ1ZpZXcgPSBmeGNydDo6V2lkZVN0cmluZ1ZpZXc7CisKKyNlbmRpZiAgLy8gQ09SRV9GWENSVF9TVFJJTkdfVklFV19URU1QTEFURV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC91bm93bmVkX3B0ci5oIGIvY29yZS9meGNydC91bm93bmVkX3B0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NzUzY2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX1VOT1dORURfUFRSX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfVU5PV05FRF9QVFJfSF8KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKy8vIFVub3duZWRQdHIgaXMgYSBzbWFydCBwb2ludGVyIGNsYXNzIHRoYXQgYmVoYXZlcyB2ZXJ5IG11Y2ggbGlrZSBhCisvLyBzdGFuZGFyZCBDLXN0eWxlIHBvaW50ZXIuIFRoZSBhZHZhbnRhZ2VzIG9mIHVzaW5nIGl0IG92ZXIgcmF3CisvLyBwb2ludGVycyBhcmU6CisvLworLy8gMS4gSXQgZG9jdW1lbnRzIHRoZSBuYXR1cmUgb2YgdGhlIHBvaW50ZXIgd2l0aCBubyBuZWVkIHRvIGFkZCBhIGNvbW1lbnQKKy8vICAgIGV4cGxhaW5pbmcgdGhhdCBpcyBpdCAvLyBOb3Qgb3duZWQuIEFkZGl0aW9uYWxseSwgYW4gYXR0ZW1wdCB0byBkZWxldGUKKy8vICAgIGFuIHVub3duZWQgcHRyIHdpbGwgZmFpbCB0byBjb21waWxlIHJhdGhlciB0aGFuIHNpbGVudGx5IHN1Y2NlZWRpbmcsCisvLyAgICBzaW5jZSBpdCBpcyBhIGNsYXNzIGFuZCBub3QgYSByYXcgcG9pbnRlci4KKy8vCisvLyAyLiBXaGVuIGJ1aWx0IGZvciBhIG1lbW9yeSB0b29sIGxpa2UgQVNBTiwgdGhlIGNsYXNzIHByb3ZpZGVzIGEgZGVzdHJ1Y3RvcgorLy8gICAgd2hpY2ggY2hlY2tzIHRoYXQgdGhlIG9iamVjdCBiZWluZyBwb2ludGVkIHRvIGlzIHN0aWxsIGFsaXZlLgorLy8KKy8vIEhlbmNlLCB3aGVuIHVzaW5nIFVub3duZWRQdHIsIG5vIGRhbmdsaW5nIHBvaW50ZXJzIGFyZSBldmVyIHBlcm1pdHRlZCwKKy8vIGV2ZW4gaWYgdGhleSBhcmUgbm90IGRlLXJlZmVyZW5jZWQgYWZ0ZXIgYmVjb21pbmcgZGFuZ2xpbmcuIFRoZSBzdHlsZSBvZgorLy8gcHJvZ3JhbW1pbmcgcmVxdWlyZWQgaXMgdGhhdCB0aGUgbGlmZXRpbWUgYW4gb2JqZWN0IGNvbnRhaW5pbmcgYW4KKy8vIFVub3duZWRQdHIgbXVzdCBiZSBzdHJpY3RseSBsZXNzIHRoYW4gdGhlIG9iamVjdCB0byB3aGljaCBpdCBwb2ludHMuCisvLworLy8gVGhlIHNhbWUgY2hlY2tzIGFyZSBhbHNvIHBlcmZvcm1lZCBhdCBhc3NpZ25tZW50IHRpbWUgdG8gcHJvdmUgdGhhdCB0aGUKKy8vIG9sZCB2YWx1ZSB3YXMgbm90IGEgZGFuZ2xpbmcgcG9pbnRlciwgZWl0aGVyLgorLy8KKy8vIFRoZSBhcnJheSBpbmRleGluZyBvcGVyYXRpb24gW10gaXMgbm90IHN1cHBvcnRlZCBvbiBhbiB1bm93bmVkIHB0ciwKKy8vIGJlY2F1c2UgYW4gdW5vd25lZCBwdHIgZXhwcmVzc2VzIGEgb25lIHRvIG9uZSByZWxhdGlvbnNoaXAgd2l0aCBzb21lCisvLyBvdGhlciBoZWFwIG9iamVjdC4KKworbmFtZXNwYWNlIGZ4Y3J0IHsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitjbGFzcyBVbm93bmVkUHRyIHsKKyBwdWJsaWM6CisgIFVub3duZWRQdHIoKSA9IGRlZmF1bHQ7CisgIFVub3duZWRQdHIoY29uc3QgVW5vd25lZFB0ciYgdGhhdCkgOiBVbm93bmVkUHRyKHRoYXQuR2V0KCkpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIGV4cGxpY2l0IFVub3duZWRQdHIoVSogcE9iaikgOiBtX3BPYmoocE9iaikge30KKworICAvLyBEZWxpYmVyYXRlbHkgaW1wbGljaXQgdG8gYWxsb3cgcmV0dXJuaW5nIG51bGxwdHJzLgorICAvLyBOT0xJTlRORVhUTElORShydW50aW1lL2V4cGxpY2l0KQorICBVbm93bmVkUHRyKHN0ZDo6bnVsbHB0cl90IHB0cikge30KKworICB+VW5vd25lZFB0cigpIHsgUHJvYmVGb3JMb3dTZXZlcml0eUxpZmV0aW1lSXNzdWUoKTsgfQorCisgIFVub3duZWRQdHImIG9wZXJhdG9yPShUKiB0aGF0KSB7CisgICAgUHJvYmVGb3JMb3dTZXZlcml0eUxpZmV0aW1lSXNzdWUoKTsKKyAgICBtX3BPYmogPSB0aGF0OworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFVub3duZWRQdHImIG9wZXJhdG9yPShjb25zdCBVbm93bmVkUHRyJiB0aGF0KSB7CisgICAgUHJvYmVGb3JMb3dTZXZlcml0eUxpZmV0aW1lSXNzdWUoKTsKKyAgICBpZiAoKnRoaXMgIT0gdGhhdCkKKyAgICAgIG1fcE9iaiA9IHRoYXQuR2V0KCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFVub3duZWRQdHImIHRoYXQpIGNvbnN0IHsgcmV0dXJuIEdldCgpID09IHRoYXQuR2V0KCk7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFVub3duZWRQdHImIHRoYXQpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gdGhhdCk7IH0KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgVW5vd25lZFB0ciYgdGhhdCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6Omxlc3M8VCo+KCkoR2V0KCksIHRoYXQuR2V0KCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBVKiB0aGF0KSBjb25zdCB7CisgICAgcmV0dXJuIEdldCgpID09IHRoYXQ7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFUqIHRoYXQpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSB0aGF0KTsKKyAgfQorCisgIFQqIEdldCgpIGNvbnN0IHsgcmV0dXJuIG1fcE9iajsgfQorCisgIFQqIFJlbGVhc2UoKSB7CisgICAgUHJvYmVGb3JMb3dTZXZlcml0eUxpZmV0aW1lSXNzdWUoKTsKKyAgICBUKiBwVGVtcCA9IG51bGxwdHI7CisgICAgc3RkOjpzd2FwKHBUZW1wLCBtX3BPYmopOworICAgIHJldHVybiBwVGVtcDsKKyAgfQorCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAhIW1fcE9iajsgfQorICBUJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqbV9wT2JqOyB9CisgIFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBtX3BPYmo7IH0KKworIHByaXZhdGU6CisgIGlubGluZSB2b2lkIFByb2JlRm9yTG93U2V2ZXJpdHlMaWZldGltZUlzc3VlKCkgeworI2lmIGRlZmluZWQoTUVNT1JZX1RPT0xfUkVQTEFDRVNfQUxMT0NBVE9SKQorICAgIGlmIChtX3BPYmopCisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHZvbGF0aWxlIHVpbnQ4X3QqPihtX3BPYmopWzBdOworI2VuZGlmCisgIH0KKworICBUKiBtX3BPYmogPSBudWxscHRyOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFUqIGxocywgY29uc3QgVW5vd25lZFB0cjxUPiYgcmhzKSB7CisgIHJldHVybiByaHMgPT0gbGhzOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgVSogbGhzLCBjb25zdCBVbm93bmVkUHRyPFQ+JiByaHMpIHsKKyAgcmV0dXJuIHJocyAhPSBsaHM7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBmeGNydAorCit1c2luZyBmeGNydDo6VW5vd25lZFB0cjsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX1VOT1dORURfUFRSX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L3Vub3duZWRfcHRyX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnhjcnQvdW5vd25lZF9wdHJfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZGZmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L3Vub3duZWRfcHRyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDE0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIGZ4Y3J0IHsKK25hbWVzcGFjZSB7CisKK2NsYXNzIENsaW5rIHsKKyBwdWJsaWM6CisgIFVub3duZWRQdHI8Q2xpbms+IG5leHRfID0gbnVsbHB0cjsKK307CisKK3ZvaWQgRGVsZXRlRGFuZ2xpbmcoKSB7CisgIENsaW5rKiBwdHIxID0gbmV3IENsaW5rKCk7CisgIENsaW5rKiBwdHIyID0gbmV3IENsaW5rKCk7CisgIHB0cjItPm5leHRfID0gcHRyMTsKKyAgZGVsZXRlIHB0cjE7CisgIGRlbGV0ZSBwdHIyOworfQorCit2b2lkIEFzc2lnbkRhbmdsaW5nKCkgeworICBDbGluayogcHRyMSA9IG5ldyBDbGluaygpOworICBDbGluayogcHRyMiA9IG5ldyBDbGluaygpOworICBwdHIyLT5uZXh0XyA9IHB0cjE7CisgIGRlbGV0ZSBwdHIxOworICBwdHIyLT5uZXh0XyA9IG51bGxwdHI7CisgIGRlbGV0ZSBwdHIyOworfQorCit2b2lkIFJlbGVhc2VEYW5nbGluZygpIHsKKyAgQ2xpbmsqIHB0cjEgPSBuZXcgQ2xpbmsoKTsKKyAgQ2xpbmsqIHB0cjIgPSBuZXcgQ2xpbmsoKTsKKyAgcHRyMi0+bmV4dF8gPSBwdHIxOworICBkZWxldGUgcHRyMTsKKyAgcHRyMi0+bmV4dF8uUmVsZWFzZSgpOworICBkZWxldGUgcHRyMjsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK1RFU1QoVW5vd25lZFB0ciwgUHRyT2spIHsKKyAgQ2xpbmsqIHB0cjEgPSBuZXcgQ2xpbmsoKTsKKyAgQ2xpbmsqIHB0cjIgPSBuZXcgQ2xpbmsoKTsKKyAgcHRyMi0+bmV4dF8gPSBwdHIxOworICBkZWxldGUgcHRyMjsKKyAgZGVsZXRlIHB0cjE7Cit9CisKK1RFU1QoVW5vd25lZFB0ciwgUHRyTm90T2spIHsKKyNpZiBkZWZpbmVkKEFERFJFU1NfU0FOSVRJWkVSKQorICBFWFBFQ1RfREVBVEgoRGVsZXRlRGFuZ2xpbmcoKSwgIiIpOworI2Vsc2UKKyAgRGVsZXRlRGFuZ2xpbmcoKTsKKyNlbmRpZgorfQorCitURVNUKFVub3duZWRQdHIsIEFzc2lnbk9rKSB7CisgIENsaW5rKiBwdHIxID0gbmV3IENsaW5rKCk7CisgIENsaW5rKiBwdHIyID0gbmV3IENsaW5rKCk7CisgIHB0cjItPm5leHRfID0gcHRyMTsKKyAgcHRyMi0+bmV4dF8gPSBudWxscHRyOworICBkZWxldGUgcHRyMjsKKyAgZGVsZXRlIHB0cjE7Cit9CisKK1RFU1QoVW5vd25lZFB0ciwgQXNzaWduTm90T2spIHsKKyNpZiBkZWZpbmVkKEFERFJFU1NfU0FOSVRJWkVSKQorICBFWFBFQ1RfREVBVEgoQXNzaWduRGFuZ2xpbmcoKSwgIiIpOworI2Vsc2UKKyAgQXNzaWduRGFuZ2xpbmcoKTsKKyNlbmRpZgorfQorCitURVNUKFVub3duZWRQdHIsIFJlbGVhc2VPaykgeworICBDbGluayogcHRyMSA9IG5ldyBDbGluaygpOworICBDbGluayogcHRyMiA9IG5ldyBDbGluaygpOworICBwdHIyLT5uZXh0XyA9IHB0cjE7CisgIHB0cjItPm5leHRfLlJlbGVhc2UoKTsKKyAgZGVsZXRlIHB0cjE7CisgIGRlbGV0ZSBwdHIyOworfQorCitURVNUKFVub3duZWRQdHIsIFJlbGVhc2VOb3RPaykgeworI2lmIGRlZmluZWQoQUREUkVTU19TQU5JVElaRVIpCisgIEVYUEVDVF9ERUFUSChSZWxlYXNlRGFuZ2xpbmcoKSwgIiIpOworI2Vsc2UKKyAgUmVsZWFzZURhbmdsaW5nKCk7CisjZW5kaWYKK30KKworVEVTVChVbm93bmVkUHRyLCBPcGVyYXRvckVRKSB7CisgIGludCBmb287CisgIFVub3duZWRQdHI8aW50PiBwdHIxOworICBFWFBFQ1RfVFJVRShwdHIxID09IHB0cjEpOworCisgIFVub3duZWRQdHI8aW50PiBwdHIyOworICBFWFBFQ1RfVFJVRShwdHIxID09IHB0cjIpOworCisgIFVub3duZWRQdHI8aW50PiBwdHIzKCZmb28pOworICBFWFBFQ1RfVFJVRSgmZm9vID09IHB0cjMpOworICBFWFBFQ1RfVFJVRShwdHIzID09ICZmb28pOworICBFWFBFQ1RfRkFMU0UocHRyMSA9PSBwdHIzKTsKKworICBwdHIxID0gJmZvbzsKKyAgRVhQRUNUX1RSVUUocHRyMSA9PSBwdHIzKTsKK30KKworVEVTVChVbm93bmVkUHRyLCBPcGVyYXRvck5FKSB7CisgIGludCBmb287CisgIFVub3duZWRQdHI8aW50PiBwdHIxOworICBFWFBFQ1RfRkFMU0UocHRyMSAhPSBwdHIxKTsKKworICBVbm93bmVkUHRyPGludD4gcHRyMjsKKyAgRVhQRUNUX0ZBTFNFKHB0cjEgIT0gcHRyMik7CisKKyAgVW5vd25lZFB0cjxpbnQ+IHB0cjMoJmZvbyk7CisgIEVYUEVDVF9GQUxTRSgmZm9vICE9IHB0cjMpOworICBFWFBFQ1RfRkFMU0UocHRyMyAhPSAmZm9vKTsKKyAgRVhQRUNUX1RSVUUocHRyMSAhPSBwdHIzKTsKKworICBwdHIxID0gJmZvbzsKKyAgRVhQRUNUX0ZBTFNFKHB0cjEgIT0gcHRyMyk7Cit9CisKK1RFU1QoVW5vd25lZFB0ciwgT3BlcmF0b3JMVCkgeworICBpbnQgZm9vc1syXTsKKyAgVW5vd25lZFB0cjxpbnQ+IHB0cjEoJmZvb3NbMF0pOworICBVbm93bmVkUHRyPGludD4gcHRyMigmZm9vc1sxXSk7CisKKyAgRVhQRUNUX0ZBTFNFKHB0cjEgPCBwdHIxKTsKKyAgRVhQRUNUX1RSVUUocHRyMSA8IHB0cjIpOworICBFWFBFQ1RfRkFMU0UocHRyMiA8IHB0cjEpOworfQorCit9ICAvLyBuYW1lc3BhY2UgZnhjcnQKZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvd2Vha19wdHIuaCBiL2NvcmUvZnhjcnQvd2Vha19wdHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWMzOTQyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC93ZWFrX3B0ci5oCkBAIC0wLDAgKzEsOTIgQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX1dFQUtfUFRSX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfV0VBS19QVFJfSF8KKworI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgorCituYW1lc3BhY2UgZnhjcnQgeworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgRCA9IHN0ZDo6ZGVmYXVsdF9kZWxldGU8VD4+CitjbGFzcyBXZWFrUHRyIHsKKyBwdWJsaWM6CisgIFdlYWtQdHIoKSA9IGRlZmF1bHQ7CisgIFdlYWtQdHIoY29uc3QgV2Vha1B0ciYgdGhhdCkgOiBtX3BIYW5kbGUodGhhdC5tX3BIYW5kbGUpIHt9CisgIFdlYWtQdHIoV2Vha1B0ciYmIHRoYXQpIG5vZXhjZXB0IHsgU3dhcCh0aGF0KTsgfQorICBleHBsaWNpdCBXZWFrUHRyKHN0ZDo6dW5pcXVlX3B0cjxULCBEPiBwT2JqKQorICAgICAgOiBtX3BIYW5kbGUobmV3IEhhbmRsZShzdGQ6Om1vdmUocE9iaikpKSB7fQorCisgIC8vIERlbGliZXJhdGVseSBpbXBsaWNpdCB0byBhbGxvdyBwYXNzaW5nIG51bGxwdHIuCisgIC8vIE5PTElOVE5FWFRMSU5FKHJ1bnRpbWUvZXhwbGljaXQpCisgIFdlYWtQdHIoc3RkOjpudWxscHRyX3QgYXJnKSB7fQorCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBtX3BIYW5kbGUgJiYgISFtX3BIYW5kbGUtPkdldCgpOyB9CisgIGJvb2wgSGFzT25lUmVmKCkgY29uc3QgeyByZXR1cm4gbV9wSGFuZGxlICYmIG1fcEhhbmRsZS0+SGFzT25lUmVmKCk7IH0KKyAgVCogb3BlcmF0b3ItPigpIHsgcmV0dXJuIG1fcEhhbmRsZS0+R2V0KCk7IH0KKyAgY29uc3QgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIG1fcEhhbmRsZS0+R2V0KCk7IH0KKyAgV2Vha1B0ciYgb3BlcmF0b3I9KGNvbnN0IFdlYWtQdHImIHRoYXQpIHsKKyAgICBtX3BIYW5kbGUgPSB0aGF0Lm1fcEhhbmRsZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFdlYWtQdHImIHRoYXQpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9wSGFuZGxlID09IHRoYXQubV9wSGFuZGxlOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBXZWFrUHRyJiB0aGF0KSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHRoYXQpOyB9CisKKyAgVCogR2V0KCkgY29uc3QgeyByZXR1cm4gbV9wSGFuZGxlID8gbV9wSGFuZGxlLT5HZXQoKSA6IG51bGxwdHI7IH0KKyAgdm9pZCBEZWxldGVPYmplY3QoKSB7CisgICAgaWYgKG1fcEhhbmRsZSkgeworICAgICAgbV9wSGFuZGxlLT5DbGVhcigpOworICAgICAgbV9wSGFuZGxlLlJlc2V0KCk7CisgICAgfQorICB9CisgIHZvaWQgUmVzZXQoKSB7IG1fcEhhbmRsZS5SZXNldCgpOyB9CisgIHZvaWQgUmVzZXQoc3RkOjp1bmlxdWVfcHRyPFQsIEQ+IHBPYmopIHsKKyAgICBtX3BIYW5kbGUuUmVzZXQobmV3IEhhbmRsZShzdGQ6Om1vdmUocE9iaikpKTsKKyAgfQorICB2b2lkIFN3YXAoV2Vha1B0ciYgdGhhdCkgeyBtX3BIYW5kbGUuU3dhcCh0aGF0Lm1fcEhhbmRsZSk7IH0KKworIHByaXZhdGU6CisgIGNsYXNzIEhhbmRsZSB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgSGFuZGxlKHN0ZDo6dW5pcXVlX3B0cjxULCBEPiBwdHIpCisgICAgICAgIDogbV9uQ291bnQoMCksIG1fcE9iaihzdGQ6Om1vdmUocHRyKSkge30KKyAgICB2b2lkIFJlc2V0KHN0ZDo6dW5pcXVlX3B0cjxULCBEPiBwdHIpIHsgbV9wT2JqID0gc3RkOjptb3ZlKHB0cik7IH0KKyAgICB2b2lkIENsZWFyKCkgeyAgICAgLy8gTm93IHlvdSdyZSBhbGwgd2VhayBwdHJzIC4uLgorICAgICAgbV9wT2JqLnJlc2V0KCk7ICAvLyB1bmlxdWVfcHRyIG51bGxzIGZpcnN0IGJlZm9yZSBpbnZva2luZyBkZWxldGUuCisgICAgfQorICAgIFQqIEdldCgpIGNvbnN0IHsgcmV0dXJuIG1fcE9iai5nZXQoKTsgfQorICAgIFQqIFJldGFpbigpIHsKKyAgICAgICsrbV9uQ291bnQ7CisgICAgICByZXR1cm4gbV9wT2JqLmdldCgpOworICAgIH0KKyAgICB2b2lkIFJlbGVhc2UoKSB7CisgICAgICBpZiAoLS1tX25Db3VudCA9PSAwKQorICAgICAgICBkZWxldGUgdGhpczsKKyAgICB9CisgICAgYm9vbCBIYXNPbmVSZWYoKSBjb25zdCB7IHJldHVybiBtX25Db3VudCA9PSAxOyB9CisKKyAgIHByaXZhdGU6CisgICAgfkhhbmRsZSgpID0gZGVmYXVsdDsKKworICAgIGludHB0cl90IG1fbkNvdW50OworICAgIHN0ZDo6dW5pcXVlX3B0cjxULCBEPiBtX3BPYmo7CisgIH07CisKKyAgUmV0YWluUHRyPEhhbmRsZT4gbV9wSGFuZGxlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGZ4Y3J0CisKK3VzaW5nIGZ4Y3J0OjpXZWFrUHRyOworCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfV0VBS19QVFJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQvd2Vha19wdHJfdW5pdHRlc3QuY3BwIGIvY29yZS9meGNydC93ZWFrX3B0cl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJhNzIzMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvd2Vha19wdHJfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTc2IEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3dlYWtfcHRyLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSBmeGNydCB7CituYW1lc3BhY2UgeworCitjbGFzcyBQc2V1ZG9EZWxldGFibGU7Cit1c2luZyBXZWFrVGVzdFB0ciA9IFdlYWtQdHI8UHNldWRvRGVsZXRhYmxlLCBSZWxlYXNlRGVsZXRlcjxQc2V1ZG9EZWxldGFibGU+PjsKK3VzaW5nIFVuaXF1ZVRlc3RQdHIgPQorICAgIHN0ZDo6dW5pcXVlX3B0cjxQc2V1ZG9EZWxldGFibGUsIFJlbGVhc2VEZWxldGVyPFBzZXVkb0RlbGV0YWJsZT4+OworCitjbGFzcyBQc2V1ZG9EZWxldGFibGUgeworIHB1YmxpYzoKKyAgUHNldWRvRGVsZXRhYmxlKCkgOiBkZWxldGVfY291bnRfKDApIHt9CisgIHZvaWQgUmVsZWFzZSgpIHsKKyAgICArK2RlbGV0ZV9jb3VudF87CisgICAgbmV4dF8uUmVzZXQoKTsKKyAgfQorICB2b2lkIFNldE5leHQoY29uc3QgV2Vha1Rlc3RQdHImIG5leHQpIHsgbmV4dF8gPSBuZXh0OyB9CisgIGludCBkZWxldGVfY291bnQoKSBjb25zdCB7IHJldHVybiBkZWxldGVfY291bnRfOyB9CisKKyBwcml2YXRlOgorICBpbnQgZGVsZXRlX2NvdW50XzsKKyAgV2Vha1Rlc3RQdHIgbmV4dF87Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworVEVTVChXZWFrUHRyLCBOdWxsKSB7CisgIFdlYWtUZXN0UHRyIHB0cjE7CisgIEVYUEVDVF9GQUxTRShwdHIxKTsKKworICBXZWFrVGVzdFB0ciBwdHIyOworICBFWFBFQ1RfVFJVRShwdHIxID09IHB0cjIpOworICBFWFBFQ1RfRkFMU0UocHRyMSAhPSBwdHIyKTsKKworICBXZWFrVGVzdFB0ciBwdHIzKHB0cjEpOworICBFWFBFQ1RfVFJVRShwdHIxID09IHB0cjMpOworICBFWFBFQ1RfRkFMU0UocHRyMSAhPSBwdHIzKTsKKworICBXZWFrVGVzdFB0ciBwdHI0ID0gcHRyMTsKKyAgRVhQRUNUX1RSVUUocHRyMSA9PSBwdHI0KTsKKyAgRVhQRUNUX0ZBTFNFKHB0cjEgIT0gcHRyNCk7Cit9CisKK1RFU1QoV2Vha1B0ciwgTm9uTnVsbCkgeworICBQc2V1ZG9EZWxldGFibGUgdGhpbmc7CisgIEVYUEVDVF9FUSgwLCB0aGluZy5kZWxldGVfY291bnQoKSk7CisgIHsKKyAgICBVbmlxdWVUZXN0UHRyIHVuaXF1ZSgmdGhpbmcpOworICAgIFdlYWtUZXN0UHRyIHB0cjEoc3RkOjptb3ZlKHVuaXF1ZSkpOworICAgIEVYUEVDVF9UUlVFKHB0cjEpOworICAgIEVYUEVDVF9FUSgmdGhpbmcsIHB0cjEuR2V0KCkpOworCisgICAgV2Vha1Rlc3RQdHIgcHRyMjsKKyAgICBFWFBFQ1RfRkFMU0UocHRyMSA9PSBwdHIyKTsKKyAgICBFWFBFQ1RfVFJVRShwdHIxICE9IHB0cjIpOworICAgIHsKKyAgICAgIFdlYWtUZXN0UHRyIHB0cjMocHRyMSk7CisgICAgICBFWFBFQ1RfVFJVRShwdHIxID09IHB0cjMpOworICAgICAgRVhQRUNUX0ZBTFNFKHB0cjEgIT0gcHRyMyk7CisgICAgICBFWFBFQ1RfRVEoJnRoaW5nLCBwdHIzLkdldCgpKTsKKyAgICAgIHsKKyAgICAgICAgV2Vha1Rlc3RQdHIgcHRyNCA9IHB0cjE7CisgICAgICAgIEVYUEVDVF9UUlVFKHB0cjEgPT0gcHRyNCk7CisgICAgICAgIEVYUEVDVF9GQUxTRShwdHIxICE9IHB0cjQpOworICAgICAgICBFWFBFQ1RfRVEoJnRoaW5nLCBwdHI0LkdldCgpKTsKKyAgICAgIH0KKyAgICB9CisgICAgRVhQRUNUX0VRKDAsIHRoaW5nLmRlbGV0ZV9jb3VudCgpKTsKKyAgfQorICBFWFBFQ1RfRVEoMSwgdGhpbmcuZGVsZXRlX2NvdW50KCkpOworfQorCitURVNUKFdlYWtQdHIsIFJlc2V0TnVsbCkgeworICBQc2V1ZG9EZWxldGFibGUgdGhpbmc7CisgIHsKKyAgICBVbmlxdWVUZXN0UHRyIHVuaXF1ZSgmdGhpbmcpOworICAgIFdlYWtUZXN0UHRyIHB0cjEoc3RkOjptb3ZlKHVuaXF1ZSkpOworICAgIFdlYWtUZXN0UHRyIHB0cjIgPSBwdHIxOworICAgIHB0cjEuUmVzZXQoKTsKKyAgICBFWFBFQ1RfRkFMU0UocHRyMSk7CisgICAgRVhQRUNUX0VRKG51bGxwdHIsIHB0cjEuR2V0KCkpOworICAgIEVYUEVDVF9UUlVFKHB0cjIpOworICAgIEVYUEVDVF9FUSgmdGhpbmcsIHB0cjIuR2V0KCkpOworICAgIEVYUEVDVF9GQUxTRShwdHIxID09IHB0cjIpOworICAgIEVYUEVDVF9UUlVFKHB0cjEgIT0gcHRyMik7CisgICAgRVhQRUNUX0VRKDAsIHRoaW5nLmRlbGV0ZV9jb3VudCgpKTsKKyAgfQorICBFWFBFQ1RfRVEoMSwgdGhpbmcuZGVsZXRlX2NvdW50KCkpOworfQorCitURVNUKFdlYWtQdHIsIFJlc2V0Tm9uTnVsbCkgeworICBQc2V1ZG9EZWxldGFibGUgdGhpbmcxOworICBQc2V1ZG9EZWxldGFibGUgdGhpbmcyOworICB7CisgICAgVW5pcXVlVGVzdFB0ciB1bmlxdWUxKCZ0aGluZzEpOworICAgIFdlYWtUZXN0UHRyIHB0cjEoc3RkOjptb3ZlKHVuaXF1ZTEpKTsKKyAgICBXZWFrVGVzdFB0ciBwdHIyID0gcHRyMTsKKyAgICBVbmlxdWVUZXN0UHRyIHVuaXF1ZTIoJnRoaW5nMik7CisgICAgcHRyMi5SZXNldChzdGQ6Om1vdmUodW5pcXVlMikpOworICAgIEVYUEVDVF9UUlVFKHB0cjEpOworICAgIEVYUEVDVF9FUSgmdGhpbmcxLCBwdHIxLkdldCgpKTsKKyAgICBFWFBFQ1RfVFJVRShwdHIyKTsKKyAgICBFWFBFQ1RfRVEoJnRoaW5nMiwgcHRyMi5HZXQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKHB0cjEgPT0gcHRyMik7CisgICAgRVhQRUNUX1RSVUUocHRyMSAhPSBwdHIyKTsKKyAgICBFWFBFQ1RfRVEoMCwgdGhpbmcxLmRlbGV0ZV9jb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgdGhpbmcyLmRlbGV0ZV9jb3VudCgpKTsKKyAgfQorICBFWFBFQ1RfRVEoMSwgdGhpbmcxLmRlbGV0ZV9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDEsIHRoaW5nMi5kZWxldGVfY291bnQoKSk7Cit9CisKK1RFU1QoV2Vha1B0ciwgRGVsZXRlT2JqZWN0KSB7CisgIFBzZXVkb0RlbGV0YWJsZSB0aGluZzsKKyAgeworICAgIFVuaXF1ZVRlc3RQdHIgdW5pcXVlKCZ0aGluZyk7CisgICAgV2Vha1Rlc3RQdHIgcHRyMShzdGQ6Om1vdmUodW5pcXVlKSk7CisgICAgV2Vha1Rlc3RQdHIgcHRyMiA9IHB0cjE7CisgICAgcHRyMS5EZWxldGVPYmplY3QoKTsKKyAgICBFWFBFQ1RfRkFMU0UocHRyMSk7CisgICAgRVhQRUNUX0VRKG51bGxwdHIsIHB0cjEuR2V0KCkpOworICAgIEVYUEVDVF9GQUxTRShwdHIyKTsKKyAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcHRyMi5HZXQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKHB0cjEgPT0gcHRyMik7CisgICAgRVhQRUNUX1RSVUUocHRyMSAhPSBwdHIyKTsKKyAgICBFWFBFQ1RfRVEoMSwgdGhpbmcuZGVsZXRlX2NvdW50KCkpOworICB9CisgIEVYUEVDVF9FUSgxLCB0aGluZy5kZWxldGVfY291bnQoKSk7Cit9CisKK1RFU1QoV2Vha1B0ciwgQ3ljbGljKSB7CisgIFBzZXVkb0RlbGV0YWJsZSB0aGluZzE7CisgIFBzZXVkb0RlbGV0YWJsZSB0aGluZzI7CisgIHsKKyAgICBVbmlxdWVUZXN0UHRyIHVuaXF1ZTEoJnRoaW5nMSk7CisgICAgVW5pcXVlVGVzdFB0ciB1bmlxdWUyKCZ0aGluZzIpOworICAgIFdlYWtUZXN0UHRyIHB0cjEoc3RkOjptb3ZlKHVuaXF1ZTEpKTsKKyAgICBXZWFrVGVzdFB0ciBwdHIyKHN0ZDo6bW92ZSh1bmlxdWUyKSk7CisgICAgcHRyMS0+U2V0TmV4dChwdHIyKTsKKyAgICBwdHIyLT5TZXROZXh0KHB0cjEpOworICB9CisgIC8vIExlYWtzIHdpdGhvdXQgZXhwbGljaXQgY2xlYXIuCisgIEVYUEVDVF9FUSgwLCB0aGluZzEuZGVsZXRlX2NvdW50KCkpOworICBFWFBFQ1RfRVEoMCwgdGhpbmcyLmRlbGV0ZV9jb3VudCgpKTsKK30KKworVEVTVChXZWFrUHRyLCBDeWNsaWNEZWxldGVPYmplY3QpIHsKKyAgUHNldWRvRGVsZXRhYmxlIHRoaW5nMTsKKyAgUHNldWRvRGVsZXRhYmxlIHRoaW5nMjsKKyAgeworICAgIFVuaXF1ZVRlc3RQdHIgdW5pcXVlMSgmdGhpbmcxKTsKKyAgICBVbmlxdWVUZXN0UHRyIHVuaXF1ZTIoJnRoaW5nMik7CisgICAgV2Vha1Rlc3RQdHIgcHRyMShzdGQ6Om1vdmUodW5pcXVlMSkpOworICAgIFdlYWtUZXN0UHRyIHB0cjIoc3RkOjptb3ZlKHVuaXF1ZTIpKTsKKyAgICBwdHIxLT5TZXROZXh0KHB0cjIpOworICAgIHB0cjItPlNldE5leHQocHRyMSk7CisgICAgcHRyMS5EZWxldGVPYmplY3QoKTsKKyAgICBFWFBFQ1RfRVEoMSwgdGhpbmcxLmRlbGV0ZV9jb3VudCgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgdGhpbmcyLmRlbGV0ZV9jb3VudCgpKTsKKyAgfQorICBFWFBFQ1RfRVEoMSwgdGhpbmcxLmRlbGV0ZV9jb3VudCgpKTsKKyAgRVhQRUNUX0VRKDEsIHRoaW5nMi5kZWxldGVfY291bnQoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBmeGNydApkaWZmIC0tZ2l0IGEvY29yZS9meGNydC93aWRlc3RyaW5nLmNwcCBiL2NvcmUvZnhjcnQvd2lkZXN0cmluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0NzU2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQvd2lkZXN0cmluZy5jcHAKQEAgLTAsMCArMSwxMDgyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3dpZGVzdHJpbmcuaCIKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNjdHlwZT4KKyNpbmNsdWRlIDxjd2N0eXBlPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfdXRmOGRlY29kZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2NvZGVwYWdlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9leHRlbnNpb24uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3N0cmluZ19wb29sX3RlbXBsYXRlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX21hdGguaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisKK3RlbXBsYXRlIGNsYXNzIGZ4Y3J0OjpTdHJpbmdEYXRhVGVtcGxhdGU8d2NoYXJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBmeGNydDo6U3RyaW5nVmlld1RlbXBsYXRlPHdjaGFyX3Q+OwordGVtcGxhdGUgY2xhc3MgZnhjcnQ6OlN0cmluZ1Bvb2xUZW1wbGF0ZTxXaWRlU3RyaW5nPjsKK3RlbXBsYXRlIHN0cnVjdCBzdGQ6Omhhc2g8V2lkZVN0cmluZz47CisKKyNkZWZpbmUgRk9SQ0VfQU5TSSAweDEwMDAwCisjZGVmaW5lIEZPUkNFX1VOSUNPREUgMHgyMDAwMAorI2RlZmluZSBGT1JDRV9JTlQ2NCAweDQwMDAwCisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtXaWRlVHJpbUNoYXJzW10gPSBMIlx4MDlceDBhXHgwYlx4MGNceDBkXHgyMCI7CisKK2NvbnN0IHdjaGFyX3QqIEZYX3djc3N0cihjb25zdCB3Y2hhcl90KiBoYXlzdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGF5c3RhY2tfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIG5lZWRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmVlZGxlX2xlbikgeworICBpZiAobmVlZGxlX2xlbiA+IGhheXN0YWNrX2xlbiB8fCBuZWVkbGVfbGVuID09IDApIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBjb25zdCB3Y2hhcl90KiBlbmRfcHRyID0gaGF5c3RhY2sgKyBoYXlzdGFja19sZW4gLSBuZWVkbGVfbGVuOworICB3aGlsZSAoaGF5c3RhY2sgPD0gZW5kX3B0cikgeworICAgIGludCBpID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgaWYgKGhheXN0YWNrW2ldICE9IG5lZWRsZVtpXSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGkrKzsKKyAgICAgIGlmIChpID09IG5lZWRsZV9sZW4pIHsKKyAgICAgICAgcmV0dXJuIGhheXN0YWNrOworICAgICAgfQorICAgIH0KKyAgICBoYXlzdGFjaysrOworICB9CisgIHJldHVybiBudWxscHRyOworfQorCitPcHRpb25hbDxzaXplX3Q+IEd1ZXNzU2l6ZUZvclZTV1ByaW50Zihjb25zdCB3Y2hhcl90KiBwRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdMaXN0KSB7CisgIHNpemVfdCBuTWF4TGVuID0gMDsKKyAgZm9yIChjb25zdCB3Y2hhcl90KiBwU3RyID0gcEZvcm1hdDsgKnBTdHIgIT0gMDsgcFN0cisrKSB7CisgICAgaWYgKCpwU3RyICE9ICclJyB8fCAqKHBTdHIgPSBwU3RyICsgMSkgPT0gJyUnKSB7CisgICAgICArK25NYXhMZW47CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IG5JdGVtTGVuID0gMDsKKyAgICBpbnQgbldpZHRoID0gMDsKKyAgICBmb3IgKDsgKnBTdHIgIT0gMDsgcFN0cisrKSB7CisgICAgICBpZiAoKnBTdHIgPT0gJyMnKSB7CisgICAgICAgIG5NYXhMZW4gKz0gMjsKKyAgICAgIH0gZWxzZSBpZiAoKnBTdHIgPT0gJyonKSB7CisgICAgICAgIG5XaWR0aCA9IHZhX2FyZyhhcmdMaXN0LCBpbnQpOworICAgICAgfSBlbHNlIGlmICgqcFN0ciAhPSAnLScgJiYgKnBTdHIgIT0gJysnICYmICpwU3RyICE9ICcwJyAmJiAqcFN0ciAhPSAnICcpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmIChuV2lkdGggPT0gMCkgeworICAgICAgbldpZHRoID0gRlhTWVNfd3RvaShwU3RyKTsKKyAgICAgIHdoaWxlIChzdGQ6Omlzd2RpZ2l0KCpwU3RyKSkKKyAgICAgICAgKytwU3RyOworICAgIH0KKyAgICBpZiAobldpZHRoIDwgMCB8fCBuV2lkdGggPiAxMjggKiAxMDI0KQorICAgICAgcmV0dXJuIE9wdGlvbmFsPHNpemVfdD4oKTsKKyAgICBpbnQgblByZWNpc2lvbiA9IDA7CisgICAgaWYgKCpwU3RyID09ICcuJykgeworICAgICAgcFN0cisrOworICAgICAgaWYgKCpwU3RyID09ICcqJykgeworICAgICAgICBuUHJlY2lzaW9uID0gdmFfYXJnKGFyZ0xpc3QsIGludCk7CisgICAgICAgIHBTdHIrKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG5QcmVjaXNpb24gPSBGWFNZU193dG9pKHBTdHIpOworICAgICAgICB3aGlsZSAoc3RkOjppc3dkaWdpdCgqcFN0cikpCisgICAgICAgICAgKytwU3RyOworICAgICAgfQorICAgIH0KKyAgICBpZiAoblByZWNpc2lvbiA8IDAgfHwgblByZWNpc2lvbiA+IDEyOCAqIDEwMjQpCisgICAgICByZXR1cm4gT3B0aW9uYWw8c2l6ZV90PigpOworICAgIGludCBuTW9kaWZpZXIgPSAwOworICAgIGlmICgqcFN0ciA9PSBMJ0knICYmICoocFN0ciArIDEpID09IEwnNicgJiYgKihwU3RyICsgMikgPT0gTCc0JykgeworICAgICAgcFN0ciArPSAzOworICAgICAgbk1vZGlmaWVyID0gRk9SQ0VfSU5UNjQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAoKnBTdHIpIHsKKyAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgbk1vZGlmaWVyID0gRk9SQ0VfQU5TSTsKKyAgICAgICAgICBwU3RyKys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2wnOgorICAgICAgICAgIG5Nb2RpZmllciA9IEZPUkNFX1VOSUNPREU7CisgICAgICAgICAgcFN0cisrOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdGJzoKKyAgICAgICAgY2FzZSAnTic6CisgICAgICAgIGNhc2UgJ0wnOgorICAgICAgICAgIHBTdHIrKzsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgc3dpdGNoICgqcFN0ciB8IG5Nb2RpZmllcikgeworICAgICAgY2FzZSAnYyc6CisgICAgICBjYXNlICdDJzoKKyAgICAgICAgbkl0ZW1MZW4gPSAyOworICAgICAgICB2YV9hcmcoYXJnTGlzdCwgaW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdjJyB8IEZPUkNFX0FOU0k6CisgICAgICBjYXNlICdDJyB8IEZPUkNFX0FOU0k6CisgICAgICAgIG5JdGVtTGVuID0gMjsKKyAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIGludCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnYycgfCBGT1JDRV9VTklDT0RFOgorICAgICAgY2FzZSAnQycgfCBGT1JDRV9VTklDT0RFOgorICAgICAgICBuSXRlbUxlbiA9IDI7CisgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ3MnOiB7CisgICAgICAgIGNvbnN0IHdjaGFyX3QqIHBzdHJOZXh0QXJnID0gdmFfYXJnKGFyZ0xpc3QsIGNvbnN0IHdjaGFyX3QqKTsKKyAgICAgICAgaWYgKHBzdHJOZXh0QXJnKSB7CisgICAgICAgICAgbkl0ZW1MZW4gPSB3Y3NsZW4ocHN0ck5leHRBcmcpOworICAgICAgICAgIGlmIChuSXRlbUxlbiA8IDEpIHsKKyAgICAgICAgICAgIG5JdGVtTGVuID0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbkl0ZW1MZW4gPSA2OworICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSAnUyc6IHsKKyAgICAgICAgY29uc3QgY2hhciogcHN0ck5leHRBcmcgPSB2YV9hcmcoYXJnTGlzdCwgY29uc3QgY2hhciopOworICAgICAgICBpZiAocHN0ck5leHRBcmcpIHsKKyAgICAgICAgICBuSXRlbUxlbiA9IHN0cmxlbihwc3RyTmV4dEFyZyk7CisgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgMSkgeworICAgICAgICAgICAgbkl0ZW1MZW4gPSAxOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuSXRlbUxlbiA9IDY7CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlICdzJyB8IEZPUkNFX0FOU0k6CisgICAgICBjYXNlICdTJyB8IEZPUkNFX0FOU0k6IHsKKyAgICAgICAgY29uc3QgY2hhciogcHN0ck5leHRBcmcgPSB2YV9hcmcoYXJnTGlzdCwgY29uc3QgY2hhciopOworICAgICAgICBpZiAocHN0ck5leHRBcmcpIHsKKyAgICAgICAgICBuSXRlbUxlbiA9IHN0cmxlbihwc3RyTmV4dEFyZyk7CisgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgMSkgeworICAgICAgICAgICAgbkl0ZW1MZW4gPSAxOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuSXRlbUxlbiA9IDY7CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlICdzJyB8IEZPUkNFX1VOSUNPREU6CisgICAgICBjYXNlICdTJyB8IEZPUkNFX1VOSUNPREU6IHsKKyAgICAgICAgY29uc3Qgd2NoYXJfdCogcHN0ck5leHRBcmcgPSB2YV9hcmcoYXJnTGlzdCwgd2NoYXJfdCopOworICAgICAgICBpZiAocHN0ck5leHRBcmcpIHsKKyAgICAgICAgICBuSXRlbUxlbiA9IHdjc2xlbihwc3RyTmV4dEFyZyk7CisgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgMSkgeworICAgICAgICAgICAgbkl0ZW1MZW4gPSAxOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBuSXRlbUxlbiA9IDY7CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgfQorICAgIGlmIChuSXRlbUxlbiAhPSAwKSB7CisgICAgICBpZiAoblByZWNpc2lvbiAhPSAwICYmIG5JdGVtTGVuID4gblByZWNpc2lvbikgeworICAgICAgICBuSXRlbUxlbiA9IG5QcmVjaXNpb247CisgICAgICB9CisgICAgICBpZiAobkl0ZW1MZW4gPCBuV2lkdGgpIHsKKyAgICAgICAgbkl0ZW1MZW4gPSBuV2lkdGg7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAoKnBTdHIpIHsKKyAgICAgICAgY2FzZSAnZCc6CisgICAgICAgIGNhc2UgJ2knOgorICAgICAgICBjYXNlICd1JzoKKyAgICAgICAgY2FzZSAneCc6CisgICAgICAgIGNhc2UgJ1gnOgorICAgICAgICBjYXNlICdvJzoKKyAgICAgICAgICBpZiAobk1vZGlmaWVyICYgRk9SQ0VfSU5UNjQpIHsKKyAgICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCBpbnQ2NF90KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdmFfYXJnKGFyZ0xpc3QsIGludCk7CisgICAgICAgICAgfQorICAgICAgICAgIG5JdGVtTGVuID0gMzI7CisgICAgICAgICAgaWYgKG5JdGVtTGVuIDwgbldpZHRoICsgblByZWNpc2lvbikgeworICAgICAgICAgICAgbkl0ZW1MZW4gPSBuV2lkdGggKyBuUHJlY2lzaW9uOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnYSc6CisgICAgICAgIGNhc2UgJ0EnOgorICAgICAgICBjYXNlICdlJzoKKyAgICAgICAgY2FzZSAnRSc6CisgICAgICAgIGNhc2UgJ2cnOgorICAgICAgICBjYXNlICdHJzoKKyAgICAgICAgICB2YV9hcmcoYXJnTGlzdCwgZG91YmxlKTsKKyAgICAgICAgICBuSXRlbUxlbiA9IDEyODsKKyAgICAgICAgICBpZiAobkl0ZW1MZW4gPCBuV2lkdGggKyBuUHJlY2lzaW9uKSB7CisgICAgICAgICAgICBuSXRlbUxlbiA9IG5XaWR0aCArIG5QcmVjaXNpb247CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdmJzoKKyAgICAgICAgICBpZiAobldpZHRoICsgblByZWNpc2lvbiA+IDEwMCkgeworICAgICAgICAgICAgbkl0ZW1MZW4gPSBuUHJlY2lzaW9uICsgbldpZHRoICsgMTI4OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkb3VibGUgZjsKKyAgICAgICAgICAgIGNoYXIgcHN6VGVtcFsyNTZdOworICAgICAgICAgICAgZiA9IHZhX2FyZyhhcmdMaXN0LCBkb3VibGUpOworICAgICAgICAgICAgRlhTWVNfc25wcmludGYocHN6VGVtcCwgc2l6ZW9mKHBzelRlbXApLCAiJSouKmYiLCBuV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuUHJlY2lzaW9uICsgNiwgZik7CisgICAgICAgICAgICBuSXRlbUxlbiA9IHN0cmxlbihwc3pUZW1wKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3AnOgorICAgICAgICAgIHZhX2FyZyhhcmdMaXN0LCB2b2lkKik7CisgICAgICAgICAgbkl0ZW1MZW4gPSAzMjsKKyAgICAgICAgICBpZiAobkl0ZW1MZW4gPCBuV2lkdGggKyBuUHJlY2lzaW9uKSB7CisgICAgICAgICAgICBuSXRlbUxlbiA9IG5XaWR0aCArIG5QcmVjaXNpb247CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICduJzoKKyAgICAgICAgICB2YV9hcmcoYXJnTGlzdCwgaW50Kik7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIG5NYXhMZW4gKz0gbkl0ZW1MZW47CisgIH0KKyAgbk1heExlbiArPSAzMjsgIC8vIEZ1ZGdlIGZhY3Rvci4KKyAgcmV0dXJuIE9wdGlvbmFsPHNpemVfdD4obk1heExlbik7Cit9CisKKy8vIFJldHVybnMgc3RyaW5nIHVubGVzcyB3ZSByYW4gb3V0IG9mIHNwYWNlLgorT3B0aW9uYWw8V2lkZVN0cmluZz4gVHJ5VlNXUHJpbnRmKHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHBGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdMaXN0KSB7CisgIFdpZGVTdHJpbmcgc3RyOworICB3Y2hhcl90KiBidWZmZXIgPSBzdHIuR2V0QnVmZmVyKHNpemUpOworCisgIC8vIEluIHRoZSBmb2xsb3dpbmcgdHdvIGNhbGxzLCB0aGVyZSdzIGFsd2F5cyBzcGFjZSBpbiB0aGUgYnVmZmVyIGZvcgorICAvLyBhIHRlcm1pbmF0aW5nIE5VTCB0aGF0J3Mgbm90IGluY2x1ZGVkIGluIG5NYXhMZW4uCisgIC8vIEZvciB2c3dwcmludGYoKSwgTVNBTiB3b24ndCB1bnRhaW50IHRoZSBidWZmZXIgb24gYSB0cnVuY2F0ZWQgd3JpdGUncworICAvLyAtMSByZXR1cm4gY29kZSBldmVuIHRob3VnaCB0aGUgYnVmZmVyIGlzIHdyaXR0ZW4uIFByb2JhYmx5IGp1c3QgYXMgd2VsbAorICAvLyBub3QgdG8gdHJ1c3QgdGhlIHZlbmRvcidzIGltcGxlbWVudGF0aW9uIHRvIHdyaXRlIGFueXRoaW5nIGFueXdheXMuCisgIC8vIFNlZSBodHRwczovL2NyYnVnLmNvbS83MDU5MTIuCisgIG1lbXNldChidWZmZXIsIDAsIChzaXplICsgMSkgKiBzaXplb2Yod2NoYXJfdCkpOworICBpbnQgcmV0ID0gdnN3cHJpbnRmKGJ1ZmZlciwgc2l6ZSArIDEsIHBGb3JtYXQsIGFyZ0xpc3QpOworCisgIGJvb2wgYlN1ZmZpY2llbnRCdWZmZXIgPSByZXQgPj0gMCB8fCBidWZmZXJbc2l6ZSAtIDFdID09IDA7CisgIGlmICghYlN1ZmZpY2llbnRCdWZmZXIpCisgICAgcmV0dXJuIHt9OworCisgIHN0ci5SZWxlYXNlQnVmZmVyKHN0ci5HZXRTdHJpbmdMZW5ndGgoKSk7CisgIHJldHVybiB7c3RyfTsKK30KKworI2lmbmRlZiBOREVCVUcKK2Jvb2wgSXNWYWxpZFdpZGVDb2RlUGFnZSh1aW50MTZfdCBjb2RlcGFnZSkgeworICBzd2l0Y2ggKGNvZGVwYWdlKSB7CisgICAgY2FzZSBGWF9DT0RFUEFHRV9EZWZBTlNJOgorICAgIGNhc2UgRlhfQ09ERVBBR0VfU2hpZnRKSVM6CisgICAgY2FzZSBGWF9DT0RFUEFHRV9DaGluZXNlU2ltcGxpZmllZDoKKyAgICBjYXNlIEZYX0NPREVQQUdFX0hhbmd1bDoKKyAgICBjYXNlIEZYX0NPREVQQUdFX0NoaW5lc2VUcmFkaXRpb25hbDoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKyNlbmRpZgorCitXaWRlU3RyaW5nIEdldFdpZGVTdHJpbmcodWludDE2X3QgY29kZXBhZ2UsIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBic3RyKSB7CisjaWZuZGVmIE5ERUJVRworICBBU1NFUlQoSXNWYWxpZFdpZGVDb2RlUGFnZShjb2RlcGFnZSkpOworI2VuZGlmCisKKyAgaW50IHNyY19sZW4gPSBic3RyLkdldExlbmd0aCgpOworICBpbnQgZGVzdF9sZW4gPSBGWFNZU19NdWx0aUJ5dGVUb1dpZGVDaGFyKAorICAgICAgY29kZXBhZ2UsIDAsIGJzdHIudW50ZXJtaW5hdGVkX2Nfc3RyKCksIHNyY19sZW4sIG51bGxwdHIsIDApOworICBpZiAoIWRlc3RfbGVuKQorICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CisKKyAgV2lkZVN0cmluZyB3c3RyOworICB3Y2hhcl90KiBkZXN0X2J1ZiA9IHdzdHIuR2V0QnVmZmVyKGRlc3RfbGVuKTsKKyAgRlhTWVNfTXVsdGlCeXRlVG9XaWRlQ2hhcihjb2RlcGFnZSwgMCwgYnN0ci51bnRlcm1pbmF0ZWRfY19zdHIoKSwgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2J1ZiwgZGVzdF9sZW4pOworICB3c3RyLlJlbGVhc2VCdWZmZXIoZGVzdF9sZW4pOworICByZXR1cm4gd3N0cjsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBmeGNydCB7CisKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKFdpZGVTdHJpbmcpIDw9IHNpemVvZih3Y2hhcl90KiksCisgICAgICAgICAgICAgICJTdHJpbmdzIG11c3Qgbm90IHJlcXVpcmUgbW9yZSBzcGFjZSB0aGFuIHBvaW50ZXJzIik7CisKKy8vIHN0YXRpYworV2lkZVN0cmluZyBXaWRlU3RyaW5nOjpGb3JtYXRWKGNvbnN0IHdjaGFyX3QqIGZvcm1hdCwgdmFfbGlzdCBhcmdMaXN0KSB7CisgIHZhX2xpc3QgYXJnTGlzdENvcHk7CisgIHZhX2NvcHkoYXJnTGlzdENvcHksIGFyZ0xpc3QpOworICBpbnQgbWF4TGVuID0gdnN3cHJpbnRmKG51bGxwdHIsIDAsIGZvcm1hdCwgYXJnTGlzdENvcHkpOworICB2YV9lbmQoYXJnTGlzdENvcHkpOworCisgIGlmIChtYXhMZW4gPD0gMCkgeworICAgIHZhX2NvcHkoYXJnTGlzdENvcHksIGFyZ0xpc3QpOworICAgIGF1dG8gZ3Vlc3MgPSBHdWVzc1NpemVGb3JWU1dQcmludGYoZm9ybWF0LCBhcmdMaXN0Q29weSk7CisgICAgdmFfZW5kKGFyZ0xpc3RDb3B5KTsKKworICAgIGlmICghZ3Vlc3MuaGFzX3ZhbHVlKCkpCisgICAgICByZXR1cm4gTCIiOworICAgIG1heExlbiA9IHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PGludD4oZ3Vlc3MudmFsdWUoKSk7CisgIH0KKworICB3aGlsZSAobWF4TGVuIDwgMzIgKiAxMDI0KSB7CisgICAgdmFfY29weShhcmdMaXN0Q29weSwgYXJnTGlzdCk7CisgICAgT3B0aW9uYWw8V2lkZVN0cmluZz4gcmV0ID0KKyAgICAgICAgVHJ5VlNXUHJpbnRmKHN0YXRpY19jYXN0PHNpemVfdD4obWF4TGVuKSwgZm9ybWF0LCBhcmdMaXN0Q29weSk7CisgICAgdmFfZW5kKGFyZ0xpc3RDb3B5KTsKKworICAgIGlmIChyZXQpCisgICAgICByZXR1cm4gKnJldDsKKyAgICBtYXhMZW4gKj0gMjsKKyAgfQorICByZXR1cm4gTCIiOworfQorCisvLyBzdGF0aWMKK1dpZGVTdHJpbmcgV2lkZVN0cmluZzo6Rm9ybWF0KGNvbnN0IHdjaGFyX3QqIHBGb3JtYXQsIC4uLikgeworICB2YV9saXN0IGFyZ0xpc3Q7CisgIHZhX3N0YXJ0KGFyZ0xpc3QsIHBGb3JtYXQpOworICBXaWRlU3RyaW5nIHJldCA9IEZvcm1hdFYocEZvcm1hdCwgYXJnTGlzdCk7CisgIHZhX2VuZChhcmdMaXN0KTsKKyAgcmV0dXJuIHJldDsKK30KKworV2lkZVN0cmluZzo6V2lkZVN0cmluZygpIHt9CisKK1dpZGVTdHJpbmc6OldpZGVTdHJpbmcoY29uc3QgV2lkZVN0cmluZyYgb3RoZXIpIDogbV9wRGF0YShvdGhlci5tX3BEYXRhKSB7fQorCitXaWRlU3RyaW5nOjpXaWRlU3RyaW5nKFdpZGVTdHJpbmcmJiBvdGhlcikgbm9leGNlcHQgeworICBtX3BEYXRhLlN3YXAob3RoZXIubV9wRGF0YSk7Cit9CisKK1dpZGVTdHJpbmc6OldpZGVTdHJpbmcoY29uc3Qgd2NoYXJfdCogcFN0ciwgc2l6ZV90IG5MZW4pIHsKKyAgaWYgKG5MZW4pCisgICAgbV9wRGF0YS5SZXNldChTdHJpbmdEYXRhOjpDcmVhdGUocFN0ciwgbkxlbikpOworfQorCitXaWRlU3RyaW5nOjpXaWRlU3RyaW5nKHdjaGFyX3QgY2gpIHsKKyAgbV9wRGF0YS5SZXNldChTdHJpbmdEYXRhOjpDcmVhdGUoMSkpOworICBtX3BEYXRhLT5tX1N0cmluZ1swXSA9IGNoOworfQorCitXaWRlU3RyaW5nOjpXaWRlU3RyaW5nKGNvbnN0IHdjaGFyX3QqIHB0cikKKyAgICA6IFdpZGVTdHJpbmcocHRyLCBwdHIgPyB3Y3NsZW4ocHRyKSA6IDApIHt9CisKK1dpZGVTdHJpbmc6OldpZGVTdHJpbmcoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHN0cmluZ1NyYykgeworICBpZiAoIXN0cmluZ1NyYy5Jc0VtcHR5KCkpIHsKKyAgICBtX3BEYXRhLlJlc2V0KFN0cmluZ0RhdGE6OkNyZWF0ZShzdHJpbmdTcmMudW50ZXJtaW5hdGVkX2Nfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nU3JjLkdldExlbmd0aCgpKSk7CisgIH0KK30KKworV2lkZVN0cmluZzo6V2lkZVN0cmluZyhjb25zdCBXaWRlU3RyaW5nVmlldyYgc3RyMSwgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHN0cjIpIHsKKyAgRlhfU0FGRV9TSVpFX1QgblNhZmVMZW4gPSBzdHIxLkdldExlbmd0aCgpOworICBuU2FmZUxlbiArPSBzdHIyLkdldExlbmd0aCgpOworCisgIHNpemVfdCBuTmV3TGVuID0gblNhZmVMZW4uVmFsdWVPckRpZSgpOworICBpZiAobk5ld0xlbiA9PSAwKQorICAgIHJldHVybjsKKworICBtX3BEYXRhLlJlc2V0KFN0cmluZ0RhdGE6OkNyZWF0ZShuTmV3TGVuKSk7CisgIG1fcERhdGEtPkNvcHlDb250ZW50cyhzdHIxLnVudGVybWluYXRlZF9jX3N0cigpLCBzdHIxLkdldExlbmd0aCgpKTsKKyAgbV9wRGF0YS0+Q29weUNvbnRlbnRzQXQoc3RyMS5HZXRMZW5ndGgoKSwgc3RyMi51bnRlcm1pbmF0ZWRfY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyMi5HZXRMZW5ndGgoKSk7Cit9CisKK1dpZGVTdHJpbmc6OldpZGVTdHJpbmcoY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFdpZGVTdHJpbmdWaWV3PiYgbGlzdCkgeworICBGWF9TQUZFX1NJWkVfVCBuU2FmZUxlbiA9IDA7CisgIGZvciAoY29uc3QgYXV0byYgaXRlbSA6IGxpc3QpCisgICAgblNhZmVMZW4gKz0gaXRlbS5HZXRMZW5ndGgoKTsKKworICBzaXplX3Qgbk5ld0xlbiA9IG5TYWZlTGVuLlZhbHVlT3JEaWUoKTsKKyAgaWYgKG5OZXdMZW4gPT0gMCkKKyAgICByZXR1cm47CisKKyAgbV9wRGF0YS5SZXNldChTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbikpOworCisgIHNpemVfdCBuT2Zmc2V0ID0gMDsKKyAgZm9yIChjb25zdCBhdXRvJiBpdGVtIDogbGlzdCkgeworICAgIG1fcERhdGEtPkNvcHlDb250ZW50c0F0KG5PZmZzZXQsIGl0ZW0udW50ZXJtaW5hdGVkX2Nfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5HZXRMZW5ndGgoKSk7CisgICAgbk9mZnNldCArPSBpdGVtLkdldExlbmd0aCgpOworICB9Cit9CisKK1dpZGVTdHJpbmc6On5XaWRlU3RyaW5nKCkge30KKworY29uc3QgV2lkZVN0cmluZyYgV2lkZVN0cmluZzo6b3BlcmF0b3I9KGNvbnN0IHdjaGFyX3QqIHBTdHIpIHsKKyAgaWYgKCFwU3RyIHx8ICFwU3RyWzBdKQorICAgIGNsZWFyKCk7CisgIGVsc2UKKyAgICBBc3NpZ25Db3B5KHBTdHIsIHdjc2xlbihwU3RyKSk7CisKKyAgcmV0dXJuICp0aGlzOworfQorCitjb25zdCBXaWRlU3RyaW5nJiBXaWRlU3RyaW5nOjpvcGVyYXRvcj0oY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHN0cmluZ1NyYykgeworICBpZiAoc3RyaW5nU3JjLklzRW1wdHkoKSkKKyAgICBjbGVhcigpOworICBlbHNlCisgICAgQXNzaWduQ29weShzdHJpbmdTcmMudW50ZXJtaW5hdGVkX2Nfc3RyKCksIHN0cmluZ1NyYy5HZXRMZW5ndGgoKSk7CisKKyAgcmV0dXJuICp0aGlzOworfQorCitjb25zdCBXaWRlU3RyaW5nJiBXaWRlU3RyaW5nOjpvcGVyYXRvcj0oY29uc3QgV2lkZVN0cmluZyYgc3RyaW5nU3JjKSB7CisgIGlmIChtX3BEYXRhICE9IHN0cmluZ1NyYy5tX3BEYXRhKQorICAgIG1fcERhdGEgPSBzdHJpbmdTcmMubV9wRGF0YTsKKworICByZXR1cm4gKnRoaXM7Cit9CisKK2NvbnN0IFdpZGVTdHJpbmcmIFdpZGVTdHJpbmc6Om9wZXJhdG9yKz0oY29uc3Qgd2NoYXJfdCogcFN0cikgeworICBpZiAocFN0cikKKyAgICBDb25jYXQocFN0ciwgd2NzbGVuKHBTdHIpKTsKKworICByZXR1cm4gKnRoaXM7Cit9CisKK2NvbnN0IFdpZGVTdHJpbmcmIFdpZGVTdHJpbmc6Om9wZXJhdG9yKz0od2NoYXJfdCBjaCkgeworICBDb25jYXQoJmNoLCAxKTsKKyAgcmV0dXJuICp0aGlzOworfQorCitjb25zdCBXaWRlU3RyaW5nJiBXaWRlU3RyaW5nOjpvcGVyYXRvcis9KGNvbnN0IFdpZGVTdHJpbmcmIHN0cikgeworICBpZiAoc3RyLm1fcERhdGEpCisgICAgQ29uY2F0KHN0ci5tX3BEYXRhLT5tX1N0cmluZywgc3RyLm1fcERhdGEtPm1fbkRhdGFMZW5ndGgpOworCisgIHJldHVybiAqdGhpczsKK30KKworY29uc3QgV2lkZVN0cmluZyYgV2lkZVN0cmluZzo6b3BlcmF0b3IrPShjb25zdCBXaWRlU3RyaW5nVmlldyYgc3RyKSB7CisgIGlmICghc3RyLklzRW1wdHkoKSkKKyAgICBDb25jYXQoc3RyLnVudGVybWluYXRlZF9jX3N0cigpLCBzdHIuR2V0TGVuZ3RoKCkpOworCisgIHJldHVybiAqdGhpczsKK30KKworYm9vbCBXaWRlU3RyaW5nOjpvcGVyYXRvcj09KGNvbnN0IHdjaGFyX3QqIHB0cikgY29uc3QgeworICBpZiAoIW1fcERhdGEpCisgICAgcmV0dXJuICFwdHIgfHwgIXB0clswXTsKKworICBpZiAoIXB0cikKKyAgICByZXR1cm4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9PSAwOworCisgIHJldHVybiB3Y3NsZW4ocHRyKSA9PSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICYmCisgICAgICAgICB3bWVtY21wKHB0ciwgbV9wRGF0YS0+bV9TdHJpbmcsIG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpID09IDA7Cit9CisKK2Jvb2wgV2lkZVN0cmluZzo6b3BlcmF0b3I9PShjb25zdCBXaWRlU3RyaW5nVmlldyYgc3RyKSBjb25zdCB7CisgIGlmICghbV9wRGF0YSkKKyAgICByZXR1cm4gc3RyLklzRW1wdHkoKTsKKworICByZXR1cm4gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9PSBzdHIuR2V0TGVuZ3RoKCkgJiYKKyAgICAgICAgIHdtZW1jbXAobV9wRGF0YS0+bV9TdHJpbmcsIHN0ci51bnRlcm1pbmF0ZWRfY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgc3RyLkdldExlbmd0aCgpKSA9PSAwOworfQorCitib29sIFdpZGVTdHJpbmc6Om9wZXJhdG9yPT0oY29uc3QgV2lkZVN0cmluZyYgb3RoZXIpIGNvbnN0IHsKKyAgaWYgKG1fcERhdGEgPT0gb3RoZXIubV9wRGF0YSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoSXNFbXB0eSgpKQorICAgIHJldHVybiBvdGhlci5Jc0VtcHR5KCk7CisKKyAgaWYgKG90aGVyLklzRW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIG90aGVyLm1fcERhdGEtPm1fbkRhdGFMZW5ndGggPT0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAmJgorICAgICAgICAgd21lbWNtcChvdGhlci5tX3BEYXRhLT5tX1N0cmluZywgbV9wRGF0YS0+bV9TdHJpbmcsCisgICAgICAgICAgICAgICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpID09IDA7Cit9CisKK2Jvb2wgV2lkZVN0cmluZzo6b3BlcmF0b3I8KGNvbnN0IHdjaGFyX3QqIHB0cikgY29uc3QgeworICByZXR1cm4gQ29tcGFyZShwdHIpIDwgMDsKK30KKworYm9vbCBXaWRlU3RyaW5nOjpvcGVyYXRvcjwoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHN0cikgY29uc3QgeworICBpZiAoIW1fcERhdGEgJiYgIXN0ci51bnRlcm1pbmF0ZWRfY19zdHIoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChjX3N0cigpID09IHN0ci51bnRlcm1pbmF0ZWRfY19zdHIoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc2l6ZV90IGxlbiA9IEdldExlbmd0aCgpOworICBzaXplX3Qgb3RoZXJfbGVuID0gc3RyLkdldExlbmd0aCgpOworICBpbnQgcmVzdWx0ID0KKyAgICAgIHdtZW1jbXAoY19zdHIoKSwgc3RyLnVudGVybWluYXRlZF9jX3N0cigpLCBzdGQ6Om1pbihsZW4sIG90aGVyX2xlbikpOworICByZXR1cm4gcmVzdWx0IDwgMCB8fCAocmVzdWx0ID09IDAgJiYgbGVuIDwgb3RoZXJfbGVuKTsKK30KKworYm9vbCBXaWRlU3RyaW5nOjpvcGVyYXRvcjwoY29uc3QgV2lkZVN0cmluZyYgb3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIENvbXBhcmUob3RoZXIpIDwgMDsKK30KKwordm9pZCBXaWRlU3RyaW5nOjpBc3NpZ25Db3B5KGNvbnN0IHdjaGFyX3QqIHBTcmNEYXRhLCBzaXplX3QgblNyY0xlbikgeworICBBbGxvY0JlZm9yZVdyaXRlKG5TcmNMZW4pOworICBtX3BEYXRhLT5Db3B5Q29udGVudHMocFNyY0RhdGEsIG5TcmNMZW4pOworICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gblNyY0xlbjsKK30KKwordm9pZCBXaWRlU3RyaW5nOjpSZWFsbG9jQmVmb3JlV3JpdGUoc2l6ZV90IG5OZXdMZW5ndGgpIHsKKyAgaWYgKG1fcERhdGEgJiYgbV9wRGF0YS0+Q2FuT3BlcmF0ZUluUGxhY2Uobk5ld0xlbmd0aCkpCisgICAgcmV0dXJuOworCisgIGlmIChuTmV3TGVuZ3RoID09IDApIHsKKyAgICBjbGVhcigpOworICAgIHJldHVybjsKKyAgfQorCisgIFJldGFpblB0cjxTdHJpbmdEYXRhPiBwTmV3RGF0YShTdHJpbmdEYXRhOjpDcmVhdGUobk5ld0xlbmd0aCkpOworICBpZiAobV9wRGF0YSkgeworICAgIHNpemVfdCBuQ29weUxlbmd0aCA9IHN0ZDo6bWluKG1fcERhdGEtPm1fbkRhdGFMZW5ndGgsIG5OZXdMZW5ndGgpOworICAgIHBOZXdEYXRhLT5Db3B5Q29udGVudHMobV9wRGF0YS0+bV9TdHJpbmcsIG5Db3B5TGVuZ3RoKTsKKyAgICBwTmV3RGF0YS0+bV9uRGF0YUxlbmd0aCA9IG5Db3B5TGVuZ3RoOworICB9IGVsc2UgeworICAgIHBOZXdEYXRhLT5tX25EYXRhTGVuZ3RoID0gMDsKKyAgfQorICBwTmV3RGF0YS0+bV9TdHJpbmdbcE5ld0RhdGEtPm1fbkRhdGFMZW5ndGhdID0gMDsKKyAgbV9wRGF0YS5Td2FwKHBOZXdEYXRhKTsKK30KKwordm9pZCBXaWRlU3RyaW5nOjpBbGxvY0JlZm9yZVdyaXRlKHNpemVfdCBuTmV3TGVuZ3RoKSB7CisgIGlmIChtX3BEYXRhICYmIG1fcERhdGEtPkNhbk9wZXJhdGVJblBsYWNlKG5OZXdMZW5ndGgpKQorICAgIHJldHVybjsKKworICBpZiAobk5ld0xlbmd0aCA9PSAwKSB7CisgICAgY2xlYXIoKTsKKyAgICByZXR1cm47CisgIH0KKworICBtX3BEYXRhLlJlc2V0KFN0cmluZ0RhdGE6OkNyZWF0ZShuTmV3TGVuZ3RoKSk7Cit9CisKK3ZvaWQgV2lkZVN0cmluZzo6UmVsZWFzZUJ1ZmZlcihzaXplX3Qgbk5ld0xlbmd0aCkgeworICBpZiAoIW1fcERhdGEpCisgICAgcmV0dXJuOworCisgIG5OZXdMZW5ndGggPSBzdGQ6Om1pbihuTmV3TGVuZ3RoLCBtX3BEYXRhLT5tX25BbGxvY0xlbmd0aCk7CisgIGlmIChuTmV3TGVuZ3RoID09IDApIHsKKyAgICBjbGVhcigpOworICAgIHJldHVybjsKKyAgfQorCisgIEFTU0VSVChtX3BEYXRhLT5tX25SZWZzID09IDEpOworICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gbk5ld0xlbmd0aDsKKyAgbV9wRGF0YS0+bV9TdHJpbmdbbk5ld0xlbmd0aF0gPSAwOworICBpZiAobV9wRGF0YS0+bV9uQWxsb2NMZW5ndGggLSBuTmV3TGVuZ3RoID49IDMyKSB7CisgICAgLy8gT3ZlciBhcmJpdHJhcnkgdGhyZXNob2xkLCBzbyBwYXkgdGhlIHByaWNlIHRvIHJlbG9jYXRlLiAgRm9yY2UgY29weSB0bworICAgIC8vIGFsd2F5cyBvY2N1ciBieSBob2xkaW5nIGEgc2Vjb25kIHJlZmVyZW5jZSB0byB0aGUgc3RyaW5nLgorICAgIFdpZGVTdHJpbmcgcHJlc2VydmUoKnRoaXMpOworICAgIFJlYWxsb2NCZWZvcmVXcml0ZShuTmV3TGVuZ3RoKTsKKyAgfQorfQorCit2b2lkIFdpZGVTdHJpbmc6OlJlc2VydmUoc2l6ZV90IGxlbikgeworICBHZXRCdWZmZXIobGVuKTsKK30KKword2NoYXJfdCogV2lkZVN0cmluZzo6R2V0QnVmZmVyKHNpemVfdCBuTWluQnVmTGVuZ3RoKSB7CisgIGlmICghbV9wRGF0YSkgeworICAgIGlmIChuTWluQnVmTGVuZ3RoID09IDApCisgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIG1fcERhdGEuUmVzZXQoU3RyaW5nRGF0YTo6Q3JlYXRlKG5NaW5CdWZMZW5ndGgpKTsKKyAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoID0gMDsKKyAgICBtX3BEYXRhLT5tX1N0cmluZ1swXSA9IDA7CisgICAgcmV0dXJuIG1fcERhdGEtPm1fU3RyaW5nOworICB9CisKKyAgaWYgKG1fcERhdGEtPkNhbk9wZXJhdGVJblBsYWNlKG5NaW5CdWZMZW5ndGgpKQorICAgIHJldHVybiBtX3BEYXRhLT5tX1N0cmluZzsKKworICBuTWluQnVmTGVuZ3RoID0gc3RkOjptYXgobk1pbkJ1Zkxlbmd0aCwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCk7CisgIGlmIChuTWluQnVmTGVuZ3RoID09IDApCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgUmV0YWluUHRyPFN0cmluZ0RhdGE+IHBOZXdEYXRhKFN0cmluZ0RhdGE6OkNyZWF0ZShuTWluQnVmTGVuZ3RoKSk7CisgIHBOZXdEYXRhLT5Db3B5Q29udGVudHMoKm1fcERhdGEpOworICBwTmV3RGF0YS0+bV9uRGF0YUxlbmd0aCA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7CisgIG1fcERhdGEuU3dhcChwTmV3RGF0YSk7CisgIHJldHVybiBtX3BEYXRhLT5tX1N0cmluZzsKK30KKworc2l6ZV90IFdpZGVTdHJpbmc6OkRlbGV0ZShzaXplX3QgaW5kZXgsIHNpemVfdCBjb3VudCkgeworICBpZiAoIW1fcERhdGEpCisgICAgcmV0dXJuIDA7CisKKyAgc2l6ZV90IG9sZF9sZW5ndGggPSBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOworICBpZiAoY291bnQgPT0gMCB8fAorICAgICAgaW5kZXggIT0gcGRmaXVtOjpjbGFtcChpbmRleCwgc3RhdGljX2Nhc3Q8c2l6ZV90PigwKSwgb2xkX2xlbmd0aCkpCisgICAgcmV0dXJuIG9sZF9sZW5ndGg7CisKKyAgc2l6ZV90IHJlbW92YWxfbGVuZ3RoID0gaW5kZXggKyBjb3VudDsKKyAgaWYgKHJlbW92YWxfbGVuZ3RoID4gb2xkX2xlbmd0aCkKKyAgICByZXR1cm4gb2xkX2xlbmd0aDsKKworICBSZWFsbG9jQmVmb3JlV3JpdGUob2xkX2xlbmd0aCk7CisgIHNpemVfdCBjaGFyc190b19jb3B5ID0gb2xkX2xlbmd0aCAtIHJlbW92YWxfbGVuZ3RoICsgMTsKKyAgd21lbW1vdmUobV9wRGF0YS0+bV9TdHJpbmcgKyBpbmRleCwgbV9wRGF0YS0+bV9TdHJpbmcgKyByZW1vdmFsX2xlbmd0aCwKKyAgICAgICAgICAgY2hhcnNfdG9fY29weSk7CisgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBvbGRfbGVuZ3RoIC0gY291bnQ7CisgIHJldHVybiBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOworfQorCit2b2lkIFdpZGVTdHJpbmc6OkNvbmNhdChjb25zdCB3Y2hhcl90KiBwU3JjRGF0YSwgc2l6ZV90IG5TcmNMZW4pIHsKKyAgaWYgKCFwU3JjRGF0YSB8fCBuU3JjTGVuID09IDApCisgICAgcmV0dXJuOworCisgIGlmICghbV9wRGF0YSkgeworICAgIG1fcERhdGEuUmVzZXQoU3RyaW5nRGF0YTo6Q3JlYXRlKHBTcmNEYXRhLCBuU3JjTGVuKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKG1fcERhdGEtPkNhbk9wZXJhdGVJblBsYWNlKG1fcERhdGEtPm1fbkRhdGFMZW5ndGggKyBuU3JjTGVuKSkgeworICAgIG1fcERhdGEtPkNvcHlDb250ZW50c0F0KG1fcERhdGEtPm1fbkRhdGFMZW5ndGgsIHBTcmNEYXRhLCBuU3JjTGVuKTsKKyAgICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoICs9IG5TcmNMZW47CisgICAgcmV0dXJuOworICB9CisKKyAgUmV0YWluUHRyPFN0cmluZ0RhdGE+IHBOZXdEYXRhKAorICAgICAgU3RyaW5nRGF0YTo6Q3JlYXRlKG1fcERhdGEtPm1fbkRhdGFMZW5ndGggKyBuU3JjTGVuKSk7CisgIHBOZXdEYXRhLT5Db3B5Q29udGVudHMoKm1fcERhdGEpOworICBwTmV3RGF0YS0+Q29weUNvbnRlbnRzQXQobV9wRGF0YS0+bV9uRGF0YUxlbmd0aCwgcFNyY0RhdGEsIG5TcmNMZW4pOworICBtX3BEYXRhLlN3YXAocE5ld0RhdGEpOworfQorCitCeXRlU3RyaW5nIFdpZGVTdHJpbmc6OlVURjhFbmNvZGUoKSBjb25zdCB7CisgIHJldHVybiBGWF9VVEY4RW5jb2RlKEFzU3RyaW5nVmlldygpKTsKK30KKworQnl0ZVN0cmluZyBXaWRlU3RyaW5nOjpVVEYxNkxFX0VuY29kZSgpIGNvbnN0IHsKKyAgaWYgKCFtX3BEYXRhKSB7CisgICAgcmV0dXJuIEJ5dGVTdHJpbmcoIlwwXDAiLCAyKTsKKyAgfQorICBpbnQgbGVuID0gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKKyAgQnl0ZVN0cmluZyByZXN1bHQ7CisgIGNoYXIqIGJ1ZmZlciA9IHJlc3VsdC5HZXRCdWZmZXIobGVuICogMiArIDIpOworICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgYnVmZmVyW2kgKiAyXSA9IG1fcERhdGEtPm1fU3RyaW5nW2ldICYgMHhmZjsKKyAgICBidWZmZXJbaSAqIDIgKyAxXSA9IG1fcERhdGEtPm1fU3RyaW5nW2ldID4+IDg7CisgIH0KKyAgYnVmZmVyW2xlbiAqIDJdID0gMDsKKyAgYnVmZmVyW2xlbiAqIDIgKyAxXSA9IDA7CisgIHJlc3VsdC5SZWxlYXNlQnVmZmVyKGxlbiAqIDIgKyAyKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworV2lkZVN0cmluZyBXaWRlU3RyaW5nOjpNaWQoc2l6ZV90IGZpcnN0LCBzaXplX3QgY291bnQpIGNvbnN0IHsKKyAgaWYgKCFtX3BEYXRhKQorICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CisKKyAgaWYgKCFJc1ZhbGlkSW5kZXgoZmlyc3QpKQorICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CisKKyAgaWYgKGNvdW50ID09IDAgfHwgIUlzVmFsaWRMZW5ndGgoY291bnQpKQorICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CisKKyAgaWYgKCFJc1ZhbGlkSW5kZXgoZmlyc3QgKyBjb3VudCAtIDEpKQorICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CisKKyAgaWYgKGZpcnN0ID09IDAgJiYgY291bnQgPT0gR2V0TGVuZ3RoKCkpCisgICAgcmV0dXJuICp0aGlzOworCisgIFdpZGVTdHJpbmcgZGVzdDsKKyAgQWxsb2NDb3B5KGRlc3QsIGNvdW50LCBmaXJzdCk7CisgIHJldHVybiBkZXN0OworfQorCitXaWRlU3RyaW5nIFdpZGVTdHJpbmc6OkxlZnQoc2l6ZV90IGNvdW50KSBjb25zdCB7CisgIGlmIChjb3VudCA9PSAwIHx8ICFJc1ZhbGlkTGVuZ3RoKGNvdW50KSkKKyAgICByZXR1cm4gV2lkZVN0cmluZygpOworICByZXR1cm4gTWlkKDAsIGNvdW50KTsKK30KKworV2lkZVN0cmluZyBXaWRlU3RyaW5nOjpSaWdodChzaXplX3QgY291bnQpIGNvbnN0IHsKKyAgaWYgKGNvdW50ID09IDAgfHwgIUlzVmFsaWRMZW5ndGgoY291bnQpKQorICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CisgIHJldHVybiBNaWQoR2V0TGVuZ3RoKCkgLSBjb3VudCwgY291bnQpOworfQorCit2b2lkIFdpZGVTdHJpbmc6OkFsbG9jQ29weShXaWRlU3RyaW5nJiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5Db3B5TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5Db3B5SW5kZXgpIGNvbnN0IHsKKyAgaWYgKG5Db3B5TGVuID09IDApCisgICAgcmV0dXJuOworCisgIFJldGFpblB0cjxTdHJpbmdEYXRhPiBwTmV3RGF0YSgKKyAgICAgIFN0cmluZ0RhdGE6OkNyZWF0ZShtX3BEYXRhLT5tX1N0cmluZyArIG5Db3B5SW5kZXgsIG5Db3B5TGVuKSk7CisgIGRlc3QubV9wRGF0YS5Td2FwKHBOZXdEYXRhKTsKK30KKworc2l6ZV90IFdpZGVTdHJpbmc6Okluc2VydChzaXplX3QgbG9jYXRpb24sIHdjaGFyX3QgY2gpIHsKKyAgY29uc3Qgc2l6ZV90IGN1cl9sZW5ndGggPSBtX3BEYXRhID8gbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA6IDA7CisgIGlmICghSXNWYWxpZExlbmd0aChsb2NhdGlvbikpCisgICAgcmV0dXJuIGN1cl9sZW5ndGg7CisKKyAgY29uc3Qgc2l6ZV90IG5ld19sZW5ndGggPSBjdXJfbGVuZ3RoICsgMTsKKyAgUmVhbGxvY0JlZm9yZVdyaXRlKG5ld19sZW5ndGgpOworICB3bWVtbW92ZShtX3BEYXRhLT5tX1N0cmluZyArIGxvY2F0aW9uICsgMSwgbV9wRGF0YS0+bV9TdHJpbmcgKyBsb2NhdGlvbiwKKyAgICAgICAgICAgbmV3X2xlbmd0aCAtIGxvY2F0aW9uKTsKKyAgbV9wRGF0YS0+bV9TdHJpbmdbbG9jYXRpb25dID0gY2g7CisgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuZXdfbGVuZ3RoOworICByZXR1cm4gbmV3X2xlbmd0aDsKK30KKworT3B0aW9uYWw8c2l6ZV90PiBXaWRlU3RyaW5nOjpGaW5kKHdjaGFyX3QgY2gsIHNpemVfdCBzdGFydCkgY29uc3QgeworICBpZiAoIW1fcERhdGEpCisgICAgcmV0dXJuIE9wdGlvbmFsPHNpemVfdD4oKTsKKworICBpZiAoIUlzVmFsaWRJbmRleChzdGFydCkpCisgICAgcmV0dXJuIE9wdGlvbmFsPHNpemVfdD4oKTsKKworICBjb25zdCB3Y2hhcl90KiBwU3RyID0KKyAgICAgIHdtZW1jaHIobV9wRGF0YS0+bV9TdHJpbmcgKyBzdGFydCwgY2gsIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggLSBzdGFydCk7CisgIHJldHVybiBwU3RyID8gT3B0aW9uYWw8c2l6ZV90PihzdGF0aWNfY2FzdDxzaXplX3Q+KHBTdHIgLSBtX3BEYXRhLT5tX1N0cmluZykpCisgICAgICAgICAgICAgIDogT3B0aW9uYWw8c2l6ZV90PigpOworfQorCitPcHRpb25hbDxzaXplX3Q+IFdpZGVTdHJpbmc6OkZpbmQoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHN1YlN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3RhcnQpIGNvbnN0IHsKKyAgaWYgKCFtX3BEYXRhKQorICAgIHJldHVybiBPcHRpb25hbDxzaXplX3Q+KCk7CisKKyAgaWYgKCFJc1ZhbGlkSW5kZXgoc3RhcnQpKQorICAgIHJldHVybiBPcHRpb25hbDxzaXplX3Q+KCk7CisKKyAgY29uc3Qgd2NoYXJfdCogcFN0ciA9CisgICAgICBGWF93Y3NzdHIobV9wRGF0YS0+bV9TdHJpbmcgKyBzdGFydCwgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCAtIHN0YXJ0LAorICAgICAgICAgICAgICAgIHN1YlN0ci51bnRlcm1pbmF0ZWRfY19zdHIoKSwgc3ViU3RyLkdldExlbmd0aCgpKTsKKyAgcmV0dXJuIHBTdHIgPyBPcHRpb25hbDxzaXplX3Q+KHN0YXRpY19jYXN0PHNpemVfdD4ocFN0ciAtIG1fcERhdGEtPm1fU3RyaW5nKSkKKyAgICAgICAgICAgICAgOiBPcHRpb25hbDxzaXplX3Q+KCk7Cit9CisKK3ZvaWQgV2lkZVN0cmluZzo6TWFrZUxvd2VyKCkgeworICBpZiAoIW1fcERhdGEpCisgICAgcmV0dXJuOworCisgIFJlYWxsb2NCZWZvcmVXcml0ZShtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKTsKKyAgRlhTWVNfd2NzbHdyKG1fcERhdGEtPm1fU3RyaW5nKTsKK30KKwordm9pZCBXaWRlU3RyaW5nOjpNYWtlVXBwZXIoKSB7CisgIGlmICghbV9wRGF0YSkKKyAgICByZXR1cm47CisKKyAgUmVhbGxvY0JlZm9yZVdyaXRlKG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpOworICBGWFNZU193Y3N1cHIobV9wRGF0YS0+bV9TdHJpbmcpOworfQorCitzaXplX3QgV2lkZVN0cmluZzo6UmVtb3ZlKHdjaGFyX3QgY2hSZW1vdmUpIHsKKyAgaWYgKCFtX3BEYXRhIHx8IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPCAxKQorICAgIHJldHVybiAwOworCisgIHdjaGFyX3QqIHBzdHJTb3VyY2UgPSBtX3BEYXRhLT5tX1N0cmluZzsKKyAgd2NoYXJfdCogcHN0ckVuZCA9IG1fcERhdGEtPm1fU3RyaW5nICsgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aDsKKyAgd2hpbGUgKHBzdHJTb3VyY2UgPCBwc3RyRW5kKSB7CisgICAgaWYgKCpwc3RyU291cmNlID09IGNoUmVtb3ZlKQorICAgICAgYnJlYWs7CisgICAgcHN0clNvdXJjZSsrOworICB9CisgIGlmIChwc3RyU291cmNlID09IHBzdHJFbmQpCisgICAgcmV0dXJuIDA7CisKKyAgcHRyZGlmZl90IGNvcGllZCA9IHBzdHJTb3VyY2UgLSBtX3BEYXRhLT5tX1N0cmluZzsKKyAgUmVhbGxvY0JlZm9yZVdyaXRlKG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpOworICBwc3RyU291cmNlID0gbV9wRGF0YS0+bV9TdHJpbmcgKyBjb3BpZWQ7CisgIHBzdHJFbmQgPSBtX3BEYXRhLT5tX1N0cmluZyArIG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7CisKKyAgd2NoYXJfdCogcHN0ckRlc3QgPSBwc3RyU291cmNlOworICB3aGlsZSAocHN0clNvdXJjZSA8IHBzdHJFbmQpIHsKKyAgICBpZiAoKnBzdHJTb3VyY2UgIT0gY2hSZW1vdmUpIHsKKyAgICAgICpwc3RyRGVzdCA9ICpwc3RyU291cmNlOworICAgICAgcHN0ckRlc3QrKzsKKyAgICB9CisgICAgcHN0clNvdXJjZSsrOworICB9CisKKyAgKnBzdHJEZXN0ID0gMDsKKyAgc2l6ZV90IGNvdW50ID0gc3RhdGljX2Nhc3Q8c2l6ZV90Pihwc3RyU291cmNlIC0gcHN0ckRlc3QpOworICBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoIC09IGNvdW50OworICByZXR1cm4gY291bnQ7Cit9CisKK3NpemVfdCBXaWRlU3RyaW5nOjpSZXBsYWNlKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBwT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHBOZXcpIHsKKyAgaWYgKCFtX3BEYXRhIHx8IHBPbGQuSXNFbXB0eSgpKQorICAgIHJldHVybiAwOworCisgIHNpemVfdCBuU291cmNlTGVuID0gcE9sZC5HZXRMZW5ndGgoKTsKKyAgc2l6ZV90IG5SZXBsYWNlbWVudExlbiA9IHBOZXcuR2V0TGVuZ3RoKCk7CisgIHNpemVfdCBjb3VudCA9IDA7CisgIGNvbnN0IHdjaGFyX3QqIHBTdGFydCA9IG1fcERhdGEtPm1fU3RyaW5nOworICB3Y2hhcl90KiBwRW5kID0gbV9wRGF0YS0+bV9TdHJpbmcgKyBtX3BEYXRhLT5tX25EYXRhTGVuZ3RoOworICB3aGlsZSAoMSkgeworICAgIGNvbnN0IHdjaGFyX3QqIHBUYXJnZXQgPQorICAgICAgICBGWF93Y3NzdHIocFN0YXJ0LCBzdGF0aWNfY2FzdDxzaXplX3Q+KHBFbmQgLSBwU3RhcnQpLAorICAgICAgICAgICAgICAgICAgcE9sZC51bnRlcm1pbmF0ZWRfY19zdHIoKSwgblNvdXJjZUxlbik7CisgICAgaWYgKCFwVGFyZ2V0KQorICAgICAgYnJlYWs7CisKKyAgICBjb3VudCsrOworICAgIHBTdGFydCA9IHBUYXJnZXQgKyBuU291cmNlTGVuOworICB9CisgIGlmIChjb3VudCA9PSAwKQorICAgIHJldHVybiAwOworCisgIHNpemVfdCBuTmV3TGVuZ3RoID0KKyAgICAgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggKyAoblJlcGxhY2VtZW50TGVuIC0gblNvdXJjZUxlbikgKiBjb3VudDsKKworICBpZiAobk5ld0xlbmd0aCA9PSAwKSB7CisgICAgY2xlYXIoKTsKKyAgICByZXR1cm4gY291bnQ7CisgIH0KKworICBSZXRhaW5QdHI8U3RyaW5nRGF0YT4gcE5ld0RhdGEoU3RyaW5nRGF0YTo6Q3JlYXRlKG5OZXdMZW5ndGgpKTsKKyAgcFN0YXJ0ID0gbV9wRGF0YS0+bV9TdHJpbmc7CisgIHdjaGFyX3QqIHBEZXN0ID0gcE5ld0RhdGEtPm1fU3RyaW5nOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBjb25zdCB3Y2hhcl90KiBwVGFyZ2V0ID0KKyAgICAgICAgRlhfd2Nzc3RyKHBTdGFydCwgc3RhdGljX2Nhc3Q8c2l6ZV90PihwRW5kIC0gcFN0YXJ0KSwKKyAgICAgICAgICAgICAgICAgIHBPbGQudW50ZXJtaW5hdGVkX2Nfc3RyKCksIG5Tb3VyY2VMZW4pOworICAgIHdtZW1jcHkocERlc3QsIHBTdGFydCwgcFRhcmdldCAtIHBTdGFydCk7CisgICAgcERlc3QgKz0gcFRhcmdldCAtIHBTdGFydDsKKyAgICB3bWVtY3B5KHBEZXN0LCBwTmV3LnVudGVybWluYXRlZF9jX3N0cigpLCBwTmV3LkdldExlbmd0aCgpKTsKKyAgICBwRGVzdCArPSBwTmV3LkdldExlbmd0aCgpOworICAgIHBTdGFydCA9IHBUYXJnZXQgKyBuU291cmNlTGVuOworICB9CisgIHdtZW1jcHkocERlc3QsIHBTdGFydCwgcEVuZCAtIHBTdGFydCk7CisgIG1fcERhdGEuU3dhcChwTmV3RGF0YSk7CisgIHJldHVybiBjb3VudDsKK30KKworLy8gc3RhdGljCitXaWRlU3RyaW5nIFdpZGVTdHJpbmc6OkZyb21Mb2NhbChjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyKSB7CisgIHJldHVybiBGcm9tQ29kZVBhZ2Uoc3RyLCAwKTsKK30KKworLy8gc3RhdGljCitXaWRlU3RyaW5nIFdpZGVTdHJpbmc6OkZyb21Db2RlUGFnZShjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29kZXBhZ2UpIHsKKyAgcmV0dXJuIEdldFdpZGVTdHJpbmcoY29kZXBhZ2UsIHN0cik7Cit9CisKKy8vIHN0YXRpYworV2lkZVN0cmluZyBXaWRlU3RyaW5nOjpGcm9tVVRGOChjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyKSB7CisgIGlmIChzdHIuSXNFbXB0eSgpKQorICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CisKKyAgQ0ZYX1VURjhEZWNvZGVyIGRlY29kZXI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyLkdldExlbmd0aCgpOyBpKyspCisgICAgZGVjb2Rlci5JbnB1dChzdHJbaV0pOworCisgIHJldHVybiBXaWRlU3RyaW5nKGRlY29kZXIuR2V0UmVzdWx0KCkpOworfQorCisvLyBzdGF0aWMKK1dpZGVTdHJpbmcgV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoY29uc3QgdW5zaWduZWQgc2hvcnQqIHdzdHIsIHNpemVfdCB3bGVuKSB7CisgIGlmICghd3N0ciB8fCB3bGVuID09IDApIHsKKyAgICByZXR1cm4gV2lkZVN0cmluZygpOworICB9CisKKyAgV2lkZVN0cmluZyByZXN1bHQ7CisgIHdjaGFyX3QqIGJ1ZiA9IHJlc3VsdC5HZXRCdWZmZXIod2xlbik7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgd2xlbjsgaSsrKSB7CisgICAgYnVmW2ldID0gd3N0cltpXTsKKyAgfQorICByZXN1bHQuUmVsZWFzZUJ1ZmZlcih3bGVuKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBXaWRlU3RyaW5nOjpTZXRBdChzaXplX3QgaW5kZXgsIHdjaGFyX3QgYykgeworICBBU1NFUlQoSXNWYWxpZEluZGV4KGluZGV4KSk7CisgIFJlYWxsb2NCZWZvcmVXcml0ZShtX3BEYXRhLT5tX25EYXRhTGVuZ3RoKTsKKyAgbV9wRGF0YS0+bV9TdHJpbmdbaW5kZXhdID0gYzsKK30KKworaW50IFdpZGVTdHJpbmc6OkNvbXBhcmUoY29uc3Qgd2NoYXJfdCogbHBzeikgY29uc3QgeworICBpZiAobV9wRGF0YSkKKyAgICByZXR1cm4gbHBzeiA/IHdjc2NtcChtX3BEYXRhLT5tX1N0cmluZywgbHBzeikgOiAxOworICByZXR1cm4gKCFscHN6IHx8IGxwc3pbMF0gPT0gMCkgPyAwIDogLTE7Cit9CisKK2ludCBXaWRlU3RyaW5nOjpDb21wYXJlKGNvbnN0IFdpZGVTdHJpbmcmIHN0cikgY29uc3QgeworICBpZiAoIW1fcERhdGEpCisgICAgcmV0dXJuIHN0ci5tX3BEYXRhID8gLTEgOiAwOworICBpZiAoIXN0ci5tX3BEYXRhKQorICAgIHJldHVybiAxOworCisgIHNpemVfdCB0aGlzX2xlbiA9IG1fcERhdGEtPm1fbkRhdGFMZW5ndGg7CisgIHNpemVfdCB0aGF0X2xlbiA9IHN0ci5tX3BEYXRhLT5tX25EYXRhTGVuZ3RoOworICBzaXplX3QgbWluX2xlbiA9IHN0ZDo6bWluKHRoaXNfbGVuLCB0aGF0X2xlbik7CisgIGludCByZXN1bHQgPSB3bWVtY21wKG1fcERhdGEtPm1fU3RyaW5nLCBzdHIubV9wRGF0YS0+bV9TdHJpbmcsIG1pbl9sZW4pOworICBpZiAocmVzdWx0ICE9IDApCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgaWYgKHRoaXNfbGVuID09IHRoYXRfbGVuKQorICAgIHJldHVybiAwOworICByZXR1cm4gdGhpc19sZW4gPCB0aGF0X2xlbjsKK30KKworaW50IFdpZGVTdHJpbmc6OkNvbXBhcmVOb0Nhc2UoY29uc3Qgd2NoYXJfdCogbHBzeikgY29uc3QgeworICBpZiAobV9wRGF0YSkKKyAgICByZXR1cm4gbHBzeiA/IEZYU1lTX3djc2ljbXAobV9wRGF0YS0+bV9TdHJpbmcsIGxwc3opIDogMTsKKyAgcmV0dXJuICghbHBzeiB8fCBscHN6WzBdID09IDApID8gMCA6IC0xOworfQorCitzaXplX3QgV2lkZVN0cmluZzo6V1N0cmluZ0xlbmd0aChjb25zdCB1bnNpZ25lZCBzaG9ydCogc3RyKSB7CisgIHNpemVfdCBsZW4gPSAwOworICBpZiAoc3RyKQorICAgIHdoaWxlIChzdHJbbGVuXSkKKyAgICAgIGxlbisrOworICByZXR1cm4gbGVuOworfQorCit2b2lkIFdpZGVTdHJpbmc6OlRyaW0oKSB7CisgIFRyaW1SaWdodChrV2lkZVRyaW1DaGFycyk7CisgIFRyaW1MZWZ0KGtXaWRlVHJpbUNoYXJzKTsKK30KKwordm9pZCBXaWRlU3RyaW5nOjpUcmltKHdjaGFyX3QgdGFyZ2V0KSB7CisgIHdjaGFyX3Qgc3RyWzJdID0ge3RhcmdldCwgMH07CisgIFRyaW1SaWdodChzdHIpOworICBUcmltTGVmdChzdHIpOworfQorCit2b2lkIFdpZGVTdHJpbmc6OlRyaW0oY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHRhcmdldHMpIHsKKyAgVHJpbVJpZ2h0KHRhcmdldHMpOworICBUcmltTGVmdCh0YXJnZXRzKTsKK30KKwordm9pZCBXaWRlU3RyaW5nOjpUcmltTGVmdCgpIHsKKyAgVHJpbUxlZnQoa1dpZGVUcmltQ2hhcnMpOworfQorCit2b2lkIFdpZGVTdHJpbmc6OlRyaW1MZWZ0KHdjaGFyX3QgdGFyZ2V0KSB7CisgIHdjaGFyX3Qgc3RyWzJdID0ge3RhcmdldCwgMH07CisgIFRyaW1MZWZ0KHN0cik7Cit9CisKK3ZvaWQgV2lkZVN0cmluZzo6VHJpbUxlZnQoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHRhcmdldHMpIHsKKyAgaWYgKCFtX3BEYXRhIHx8IHRhcmdldHMuSXNFbXB0eSgpKQorICAgIHJldHVybjsKKworICBzaXplX3QgbGVuID0gR2V0TGVuZ3RoKCk7CisgIGlmIChsZW4gPT0gMCkKKyAgICByZXR1cm47CisKKyAgc2l6ZV90IHBvcyA9IDA7CisgIHdoaWxlIChwb3MgPCBsZW4pIHsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgd2hpbGUgKGkgPCB0YXJnZXRzLkdldExlbmd0aCgpICYmCisgICAgICAgICAgIHRhcmdldHMuQ2hhckF0KGkpICE9IG1fcERhdGEtPm1fU3RyaW5nW3Bvc10pIHsKKyAgICAgIGkrKzsKKyAgICB9CisgICAgaWYgKGkgPT0gdGFyZ2V0cy5HZXRMZW5ndGgoKSkKKyAgICAgIGJyZWFrOworICAgIHBvcysrOworICB9CisgIGlmICghcG9zKQorICAgIHJldHVybjsKKworICBSZWFsbG9jQmVmb3JlV3JpdGUobGVuKTsKKyAgc2l6ZV90IG5EYXRhTGVuZ3RoID0gbGVuIC0gcG9zOworICBtZW1tb3ZlKG1fcERhdGEtPm1fU3RyaW5nLCBtX3BEYXRhLT5tX1N0cmluZyArIHBvcywKKyAgICAgICAgICAobkRhdGFMZW5ndGggKyAxKSAqIHNpemVvZih3Y2hhcl90KSk7CisgIG1fcERhdGEtPm1fbkRhdGFMZW5ndGggPSBuRGF0YUxlbmd0aDsKK30KKwordm9pZCBXaWRlU3RyaW5nOjpUcmltUmlnaHQoKSB7CisgIFRyaW1SaWdodChrV2lkZVRyaW1DaGFycyk7Cit9CisKK3ZvaWQgV2lkZVN0cmluZzo6VHJpbVJpZ2h0KHdjaGFyX3QgdGFyZ2V0KSB7CisgIHdjaGFyX3Qgc3RyWzJdID0ge3RhcmdldCwgMH07CisgIFRyaW1SaWdodChzdHIpOworfQorCit2b2lkIFdpZGVTdHJpbmc6OlRyaW1SaWdodChjb25zdCBXaWRlU3RyaW5nVmlldyYgdGFyZ2V0cykgeworICBpZiAoSXNFbXB0eSgpIHx8IHRhcmdldHMuSXNFbXB0eSgpKQorICAgIHJldHVybjsKKworICBzaXplX3QgcG9zID0gR2V0TGVuZ3RoKCk7CisgIHdoaWxlIChwb3MgJiYgdGFyZ2V0cy5Db250YWlucyhtX3BEYXRhLT5tX1N0cmluZ1twb3MgLSAxXSkpCisgICAgcG9zLS07CisKKyAgaWYgKHBvcyA8IG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpIHsKKyAgICBSZWFsbG9jQmVmb3JlV3JpdGUobV9wRGF0YS0+bV9uRGF0YUxlbmd0aCk7CisgICAgbV9wRGF0YS0+bV9TdHJpbmdbcG9zXSA9IDA7CisgICAgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA9IHBvczsKKyAgfQorfQorCitmbG9hdCBGWF93dG9mKGNvbnN0IHdjaGFyX3QqIHN0ciwgaW50IGxlbikgeworICBpZiAobGVuID09IDApIHsKKyAgICByZXR1cm4gMC4wOworICB9CisgIGludCBjYyA9IDA7CisgIGJvb2wgYk5lZ2F0aXZlID0gZmFsc2U7CisgIGlmIChzdHJbMF0gPT0gJysnKSB7CisgICAgY2MrKzsKKyAgfSBlbHNlIGlmIChzdHJbMF0gPT0gJy0nKSB7CisgICAgYk5lZ2F0aXZlID0gdHJ1ZTsKKyAgICBjYysrOworICB9CisgIGludCBpbnRlZ2VyID0gMDsKKyAgd2hpbGUgKGNjIDwgbGVuKSB7CisgICAgaWYgKHN0cltjY10gPT0gJy4nKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaW50ZWdlciA9IGludGVnZXIgKiAxMCArIEZYU1lTX0RlY2ltYWxDaGFyVG9JbnQoc3RyW2NjXSk7CisgICAgY2MrKzsKKyAgfQorICBmbG9hdCBmcmFjdGlvbiA9IDA7CisgIGlmIChzdHJbY2NdID09ICcuJykgeworICAgIGNjKys7CisgICAgZmxvYXQgc2NhbGUgPSAwLjFmOworICAgIHdoaWxlIChjYyA8IGxlbikgeworICAgICAgZnJhY3Rpb24gKz0gc2NhbGUgKiBGWFNZU19EZWNpbWFsQ2hhclRvSW50KHN0cltjY10pOworICAgICAgc2NhbGUgKj0gMC4xZjsKKyAgICAgIGNjKys7CisgICAgfQorICB9CisgIGZyYWN0aW9uICs9IHN0YXRpY19jYXN0PGZsb2F0PihpbnRlZ2VyKTsKKyAgcmV0dXJuIGJOZWdhdGl2ZSA/IC1mcmFjdGlvbiA6IGZyYWN0aW9uOworfQorCitpbnQgV2lkZVN0cmluZzo6R2V0SW50ZWdlcigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcERhdGEgPyBGWFNZU193dG9pKG1fcERhdGEtPm1fU3RyaW5nKSA6IDA7Cit9CisKK2Zsb2F0IFdpZGVTdHJpbmc6OkdldEZsb2F0KCkgY29uc3QgeworICByZXR1cm4gbV9wRGF0YSA/IEZYX3d0b2YobV9wRGF0YS0+bV9TdHJpbmcsIG1fcERhdGEtPm1fbkRhdGFMZW5ndGgpIDogMC4wZjsKK30KKworc3RkOjp3b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Ondvc3RyZWFtJiBvcywgY29uc3QgV2lkZVN0cmluZyYgc3RyKSB7CisgIHJldHVybiBvcy53cml0ZShzdHIuY19zdHIoKSwgc3RyLkdldExlbmd0aCgpKTsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFdpZGVTdHJpbmcmIHN0cikgeworICBvcyA8PCBzdHIuVVRGOEVuY29kZSgpOworICByZXR1cm4gb3M7Cit9CisKK3N0ZDo6d29zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjp3b3N0cmVhbSYgb3MsIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBzdHIpIHsKKyAgcmV0dXJuIG9zLndyaXRlKHN0ci51bnRlcm1pbmF0ZWRfY19zdHIoKSwgc3RyLkdldExlbmd0aCgpKTsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBzdHIpIHsKKyAgb3MgPDwgRlhfVVRGOEVuY29kZShzdHIpOworICByZXR1cm4gb3M7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBmeGNydApkaWZmIC0tZ2l0IGEvY29yZS9meGNydC93aWRlc3RyaW5nLmggYi9jb3JlL2Z4Y3J0L3dpZGVzdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGE0MjNkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC93aWRlc3RyaW5nLmgKQEAgLTAsMCArMSwyODcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX1dJREVTVFJJTkdfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9XSURFU1RSSU5HX0hfCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9zdHJpbmdfZGF0YV90ZW1wbGF0ZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvc3RyaW5nX3ZpZXdfdGVtcGxhdGUuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL29wdGlvbmFsLmgiCisKKworbmFtZXNwYWNlIGZ4Y3J0IHsKKworY2xhc3MgQnl0ZVN0cmluZzsKK2NsYXNzIFN0cmluZ1Bvb2xfV2lkZVN0cmluZ19UZXN0OworY2xhc3MgV2lkZVN0cmluZ19Db25jYXRJblBsYWNlX1Rlc3Q7CisKKy8vIEEgbXV0YWJsZSBzdHJpbmcgd2l0aCBzaGFyZWQgYnVmZmVycyB1c2luZyBjb3B5LW9uLXdyaXRlIHNlbWFudGljcyB0aGF0CisvLyBhdm9pZHMgdGhlIGNvc3Qgb2Ygc3RkOjpzdHJpbmcncyBpdGVyYXRvciBzdGFiaWxpdHkgZ3VhcmFudGVlcy4KK2NsYXNzIFdpZGVTdHJpbmcgeworIHB1YmxpYzoKKyAgdXNpbmcgQ2hhclR5cGUgPSB3Y2hhcl90OworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IGNvbnN0IENoYXJUeXBlKjsKKyAgdXNpbmcgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciA9IHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj47CisKKyAgc3RhdGljIFdpZGVTdHJpbmcgRm9ybWF0KGNvbnN0IHdjaGFyX3QqIGxwc3pGb3JtYXQsIC4uLikgV0FSTl9VTlVTRURfUkVTVUxUOworICBzdGF0aWMgV2lkZVN0cmluZyBGb3JtYXRWKGNvbnN0IHdjaGFyX3QqIGxwc3pGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCBhcmdMaXN0KSBXQVJOX1VOVVNFRF9SRVNVTFQ7CisKKyAgV2lkZVN0cmluZygpOworICBXaWRlU3RyaW5nKGNvbnN0IFdpZGVTdHJpbmcmIG90aGVyKTsKKyAgV2lkZVN0cmluZyhXaWRlU3RyaW5nJiYgb3RoZXIpIG5vZXhjZXB0OworCisgIC8vIERlbGliZXJhdGVseSBpbXBsaWNpdCB0byBhdm9pZCBjYWxsaW5nIG9uIGV2ZXJ5IHN0cmluZyBsaXRlcmFsLgorICAvLyBOT0xJTlRORVhUTElORShydW50aW1lL2V4cGxpY2l0KQorICBXaWRlU3RyaW5nKHdjaGFyX3QgY2gpOworICAvLyBOT0xJTlRORVhUTElORShydW50aW1lL2V4cGxpY2l0KQorICBXaWRlU3RyaW5nKGNvbnN0IHdjaGFyX3QqIHB0cik7CisKKyAgLy8gTm8gaW1wbGljaXQgY29udmVyc2lvbnMgZnJvbSBieXRlIHN0cmluZ3MuCisgIC8vIE5PTElOVE5FWFRMSU5FKHJ1bnRpbWUvZXhwbGljaXQpCisgIFdpZGVTdHJpbmcoY2hhcikgPSBkZWxldGU7CisKKyAgV2lkZVN0cmluZyhjb25zdCB3Y2hhcl90KiBwdHIsIHNpemVfdCBsZW4pOworCisgIGV4cGxpY2l0IFdpZGVTdHJpbmcoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHN0cik7CisgIFdpZGVTdHJpbmcoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHN0cjEsIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBzdHIyKTsKKyAgV2lkZVN0cmluZyhjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8V2lkZVN0cmluZ1ZpZXc+JiBsaXN0KTsKKworICB+V2lkZVN0cmluZygpOworCisgIHN0YXRpYyBXaWRlU3RyaW5nIEZyb21Mb2NhbChjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyKSBXQVJOX1VOVVNFRF9SRVNVTFQ7CisgIHN0YXRpYyBXaWRlU3RyaW5nIEZyb21Db2RlUGFnZShjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgY29kZXBhZ2UpIFdBUk5fVU5VU0VEX1JFU1VMVDsKKworICBzdGF0aWMgV2lkZVN0cmluZyBGcm9tVVRGOChjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyKSBXQVJOX1VOVVNFRF9SRVNVTFQ7CisgIHN0YXRpYyBXaWRlU3RyaW5nIEZyb21VVEYxNkxFKGNvbnN0IHVuc2lnbmVkIHNob3J0KiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pIFdBUk5fVU5VU0VEX1JFU1VMVDsKKworICBzdGF0aWMgc2l6ZV90IFdTdHJpbmdMZW5ndGgoY29uc3QgdW5zaWduZWQgc2hvcnQqIHN0cikgV0FSTl9VTlVTRURfUkVTVUxUOworCisgIC8vIEV4cGxpY2l0IGNvbnZlcnNpb24gdG8gQy1zdHlsZSB3aWRlIHN0cmluZy4KKyAgLy8gTm90ZTogQW55IHN1YnNlcXVlbnQgbW9kaWZpY2F0aW9uIG9mIHx0aGlzfCB3aWxsIGludmFsaWRhdGUgdGhlIHJlc3VsdC4KKyAgY29uc3Qgd2NoYXJfdCogY19zdHIoKSBjb25zdCB7IHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9TdHJpbmcgOiBMIiI7IH0KKworICAvLyBFeHBsaWNpdCBjb252ZXJzaW9uIHRvIFdpZGVTdHJpbmdWaWV3LgorICAvLyBOb3RlOiBBbnkgc3Vic2VxdWVudCBtb2RpZmljYXRpb24gb2YgfHRoaXN8IHdpbGwgaW52YWxpZGF0ZSB0aGUgcmVzdWx0LgorICBXaWRlU3RyaW5nVmlldyBBc1N0cmluZ1ZpZXcoKSBjb25zdCB7CisgICAgcmV0dXJuIFdpZGVTdHJpbmdWaWV3KGNfc3RyKCksIEdldExlbmd0aCgpKTsKKyAgfQorCisgIC8vIE5vdGU6IEFueSBzdWJzZXF1ZW50IG1vZGlmaWNhdGlvbiBvZiB8dGhpc3wgd2lsbCBpbnZhbGlkYXRlIGl0ZXJhdG9ycy4KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9TdHJpbmcgOiBudWxscHRyOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fU3RyaW5nICsgbV9wRGF0YS0+bV9uRGF0YUxlbmd0aCA6IG51bGxwdHI7CisgIH0KKworICAvLyBOb3RlOiBBbnkgc3Vic2VxdWVudCBtb2RpZmljYXRpb24gb2YgfHRoaXN8IHdpbGwgaW52YWxpZGF0ZSBpdGVyYXRvcnMuCisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsKKyAgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7CisgIH0KKworICB2b2lkIGNsZWFyKCkgeyBtX3BEYXRhLlJlc2V0KCk7IH0KKworICBzaXplX3QgR2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9wRGF0YSA/IG1fcERhdGEtPm1fbkRhdGFMZW5ndGggOiAwOyB9CisgIHNpemVfdCBHZXRTdHJpbmdMZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fcERhdGEgPyB3Y3NsZW4obV9wRGF0YS0+bV9TdHJpbmcpIDogMDsKKyAgfQorICBib29sIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiAhR2V0TGVuZ3RoKCk7IH0KKyAgYm9vbCBJc1ZhbGlkSW5kZXgoc2l6ZV90IGluZGV4KSBjb25zdCB7IHJldHVybiBpbmRleCA8IEdldExlbmd0aCgpOyB9CisgIGJvb2wgSXNWYWxpZExlbmd0aChzaXplX3QgbGVuZ3RoKSBjb25zdCB7IHJldHVybiBsZW5ndGggPD0gR2V0TGVuZ3RoKCk7IH0KKworICBjb25zdCBXaWRlU3RyaW5nJiBvcGVyYXRvcj0oY29uc3Qgd2NoYXJfdCogc3RyKTsKKyAgY29uc3QgV2lkZVN0cmluZyYgb3BlcmF0b3I9KGNvbnN0IFdpZGVTdHJpbmcmIHN0cmluZ1NyYyk7CisgIGNvbnN0IFdpZGVTdHJpbmcmIG9wZXJhdG9yPShjb25zdCBXaWRlU3RyaW5nVmlldyYgc3RyaW5nU3JjKTsKKworICBjb25zdCBXaWRlU3RyaW5nJiBvcGVyYXRvcis9KGNvbnN0IHdjaGFyX3QqIHN0cik7CisgIGNvbnN0IFdpZGVTdHJpbmcmIG9wZXJhdG9yKz0od2NoYXJfdCBjaCk7CisgIGNvbnN0IFdpZGVTdHJpbmcmIG9wZXJhdG9yKz0oY29uc3QgV2lkZVN0cmluZyYgc3RyKTsKKyAgY29uc3QgV2lkZVN0cmluZyYgb3BlcmF0b3IrPShjb25zdCBXaWRlU3RyaW5nVmlldyYgc3RyKTsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3Qgd2NoYXJfdCogcHRyKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBzdHIpIGNvbnN0OworICBib29sIG9wZXJhdG9yPT0oY29uc3QgV2lkZVN0cmluZyYgb3RoZXIpIGNvbnN0OworCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCB3Y2hhcl90KiBwdHIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gcHRyKTsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHN0cikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBzdHIpOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBXaWRlU3RyaW5nJiBvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7IH0KKworICBib29sIG9wZXJhdG9yPChjb25zdCB3Y2hhcl90KiBwdHIpIGNvbnN0OworICBib29sIG9wZXJhdG9yPChjb25zdCBXaWRlU3RyaW5nVmlldyYgc3RyKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgV2lkZVN0cmluZyYgb3RoZXIpIGNvbnN0OworCisgIENoYXJUeXBlIG9wZXJhdG9yW10oY29uc3Qgc2l6ZV90IGluZGV4KSBjb25zdCB7CisgICAgQVNTRVJUKElzVmFsaWRJbmRleChpbmRleCkpOworICAgIHJldHVybiBtX3BEYXRhID8gbV9wRGF0YS0+bV9TdHJpbmdbaW5kZXhdIDogMDsKKyAgfQorCisgIENoYXJUeXBlIEZpcnN0KCkgY29uc3QgeyByZXR1cm4gR2V0TGVuZ3RoKCkgPyAoKnRoaXMpWzBdIDogMDsgfQorICBDaGFyVHlwZSBMYXN0KCkgY29uc3QgeyByZXR1cm4gR2V0TGVuZ3RoKCkgPyAoKnRoaXMpW0dldExlbmd0aCgpIC0gMV0gOiAwOyB9CisKKyAgdm9pZCBTZXRBdChzaXplX3QgaW5kZXgsIHdjaGFyX3QgYyk7CisKKyAgaW50IENvbXBhcmUoY29uc3Qgd2NoYXJfdCogc3RyKSBjb25zdDsKKyAgaW50IENvbXBhcmUoY29uc3QgV2lkZVN0cmluZyYgc3RyKSBjb25zdDsKKyAgaW50IENvbXBhcmVOb0Nhc2UoY29uc3Qgd2NoYXJfdCogc3RyKSBjb25zdDsKKworICBXaWRlU3RyaW5nIE1pZChzaXplX3QgZmlyc3QsIHNpemVfdCBjb3VudCkgY29uc3Q7CisgIFdpZGVTdHJpbmcgTGVmdChzaXplX3QgY291bnQpIGNvbnN0OworICBXaWRlU3RyaW5nIFJpZ2h0KHNpemVfdCBjb3VudCkgY29uc3Q7CisKKyAgc2l6ZV90IEluc2VydChzaXplX3QgaW5kZXgsIHdjaGFyX3QgY2gpOworICBzaXplX3QgSW5zZXJ0QXRGcm9udCh3Y2hhcl90IGNoKSB7IHJldHVybiBJbnNlcnQoMCwgY2gpOyB9CisgIHNpemVfdCBJbnNlcnRBdEJhY2sod2NoYXJfdCBjaCkgeyByZXR1cm4gSW5zZXJ0KEdldExlbmd0aCgpLCBjaCk7IH0KKyAgc2l6ZV90IERlbGV0ZShzaXplX3QgaW5kZXgsIHNpemVfdCBjb3VudCA9IDEpOworCisgIHZvaWQgTWFrZUxvd2VyKCk7CisgIHZvaWQgTWFrZVVwcGVyKCk7CisKKyAgdm9pZCBUcmltKCk7CisgIHZvaWQgVHJpbSh3Y2hhcl90IHRhcmdldCk7CisgIHZvaWQgVHJpbShjb25zdCBXaWRlU3RyaW5nVmlldyYgdGFyZ2V0cyk7CisKKyAgdm9pZCBUcmltTGVmdCgpOworICB2b2lkIFRyaW1MZWZ0KHdjaGFyX3QgdGFyZ2V0KTsKKyAgdm9pZCBUcmltTGVmdChjb25zdCBXaWRlU3RyaW5nVmlldyYgdGFyZ2V0cyk7CisKKyAgdm9pZCBUcmltUmlnaHQoKTsKKyAgdm9pZCBUcmltUmlnaHQod2NoYXJfdCB0YXJnZXQpOworICB2b2lkIFRyaW1SaWdodChjb25zdCBXaWRlU3RyaW5nVmlldyYgdGFyZ2V0cyk7CisKKyAgdm9pZCBSZXNlcnZlKHNpemVfdCBsZW4pOworICB3Y2hhcl90KiBHZXRCdWZmZXIoc2l6ZV90IGxlbik7CisgIHZvaWQgUmVsZWFzZUJ1ZmZlcihzaXplX3QgbGVuKTsKKworICBpbnQgR2V0SW50ZWdlcigpIGNvbnN0OworICBmbG9hdCBHZXRGbG9hdCgpIGNvbnN0OworCisgIE9wdGlvbmFsPHNpemVfdD4gRmluZChjb25zdCBXaWRlU3RyaW5nVmlldyYgcFN1Yiwgc2l6ZV90IHN0YXJ0ID0gMCkgY29uc3Q7CisgIE9wdGlvbmFsPHNpemVfdD4gRmluZCh3Y2hhcl90IGNoLCBzaXplX3Qgc3RhcnQgPSAwKSBjb25zdDsKKworICBib29sIENvbnRhaW5zKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBscHN6U3ViLCBzaXplX3Qgc3RhcnQgPSAwKSBjb25zdCB7CisgICAgcmV0dXJuIEZpbmQobHBzelN1Yiwgc3RhcnQpLmhhc192YWx1ZSgpOworICB9CisKKyAgYm9vbCBDb250YWlucyhjaGFyIGNoLCBzaXplX3Qgc3RhcnQgPSAwKSBjb25zdCB7CisgICAgcmV0dXJuIEZpbmQoY2gsIHN0YXJ0KS5oYXNfdmFsdWUoKTsKKyAgfQorCisgIHNpemVfdCBSZXBsYWNlKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBwT2xkLCBjb25zdCBXaWRlU3RyaW5nVmlldyYgcE5ldyk7CisgIHNpemVfdCBSZW1vdmUod2NoYXJfdCBjaCk7CisKKyAgQnl0ZVN0cmluZyBVVEY4RW5jb2RlKCkgY29uc3Q7CisKKyAgLy8gVGhpcyBtZXRob2Qgd2lsbCBhZGQgXDBcMCB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgdG8gcmVwcmVzZW50IHRoZQorICAvLyB3aWRlIHN0cmluZyB0ZXJtaW5hdG9yLiBUaGVzZSB2YWx1ZXMgYXJlIGluIHRoZSBzdHJpbmcsIG5vdCBqdXN0IHRoZSBkYXRhLAorICAvLyBzbyBHZXRMZW5ndGgoKSB3aWxsIGluY2x1ZGUgdGhlbS4KKyAgQnl0ZVN0cmluZyBVVEYxNkxFX0VuY29kZSgpIGNvbnN0OworCisgcHJvdGVjdGVkOgorICB1c2luZyBTdHJpbmdEYXRhID0gU3RyaW5nRGF0YVRlbXBsYXRlPHdjaGFyX3Q+OworCisgIHZvaWQgUmVhbGxvY0JlZm9yZVdyaXRlKHNpemVfdCBuTGVuKTsKKyAgdm9pZCBBbGxvY0JlZm9yZVdyaXRlKHNpemVfdCBuTGVuKTsKKyAgdm9pZCBBbGxvY0NvcHkoV2lkZVN0cmluZyYgZGVzdCwgc2l6ZV90IG5Db3B5TGVuLCBzaXplX3QgbkNvcHlJbmRleCkgY29uc3Q7CisgIHZvaWQgQXNzaWduQ29weShjb25zdCB3Y2hhcl90KiBwU3JjRGF0YSwgc2l6ZV90IG5TcmNMZW4pOworICB2b2lkIENvbmNhdChjb25zdCB3Y2hhcl90KiBscHN6U3JjRGF0YSwgc2l6ZV90IG5TcmNMZW4pOworCisgIFJldGFpblB0cjxTdHJpbmdEYXRhPiBtX3BEYXRhOworCisgIGZyaWVuZCBXaWRlU3RyaW5nX0NvbmNhdEluUGxhY2VfVGVzdDsKKyAgZnJpZW5kIFN0cmluZ1Bvb2xfV2lkZVN0cmluZ19UZXN0OworfTsKKworaW5saW5lIFdpZGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBzdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBzdHIyKSB7CisgIHJldHVybiBXaWRlU3RyaW5nKHN0cjEsIHN0cjIpOworfQoraW5saW5lIFdpZGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBzdHIxLCBjb25zdCB3Y2hhcl90KiBzdHIyKSB7CisgIHJldHVybiBXaWRlU3RyaW5nKHN0cjEsIHN0cjIpOworfQoraW5saW5lIFdpZGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IHdjaGFyX3QqIHN0cjEsIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBzdHIyKSB7CisgIHJldHVybiBXaWRlU3RyaW5nKHN0cjEsIHN0cjIpOworfQoraW5saW5lIFdpZGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBzdHIxLCB3Y2hhcl90IGNoKSB7CisgIHJldHVybiBXaWRlU3RyaW5nKHN0cjEsIFdpZGVTdHJpbmdWaWV3KGNoKSk7Cit9CitpbmxpbmUgV2lkZVN0cmluZyBvcGVyYXRvcisod2NoYXJfdCBjaCwgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHN0cjIpIHsKKyAgcmV0dXJuIFdpZGVTdHJpbmcoY2gsIHN0cjIpOworfQoraW5saW5lIFdpZGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IFdpZGVTdHJpbmcmIHN0cjEsIGNvbnN0IFdpZGVTdHJpbmcmIHN0cjIpIHsKKyAgcmV0dXJuIFdpZGVTdHJpbmcoc3RyMS5Bc1N0cmluZ1ZpZXcoKSwgc3RyMi5Bc1N0cmluZ1ZpZXcoKSk7Cit9CitpbmxpbmUgV2lkZVN0cmluZyBvcGVyYXRvcisoY29uc3QgV2lkZVN0cmluZyYgc3RyMSwgd2NoYXJfdCBjaCkgeworICByZXR1cm4gV2lkZVN0cmluZyhzdHIxLkFzU3RyaW5nVmlldygpLCBXaWRlU3RyaW5nVmlldyhjaCkpOworfQoraW5saW5lIFdpZGVTdHJpbmcgb3BlcmF0b3IrKHdjaGFyX3QgY2gsIGNvbnN0IFdpZGVTdHJpbmcmIHN0cjIpIHsKKyAgcmV0dXJuIFdpZGVTdHJpbmcoY2gsIHN0cjIuQXNTdHJpbmdWaWV3KCkpOworfQoraW5saW5lIFdpZGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IFdpZGVTdHJpbmcmIHN0cjEsIGNvbnN0IHdjaGFyX3QqIHN0cjIpIHsKKyAgcmV0dXJuIFdpZGVTdHJpbmcoc3RyMS5Bc1N0cmluZ1ZpZXcoKSwgc3RyMik7Cit9CitpbmxpbmUgV2lkZVN0cmluZyBvcGVyYXRvcisoY29uc3Qgd2NoYXJfdCogc3RyMSwgY29uc3QgV2lkZVN0cmluZyYgc3RyMikgeworICByZXR1cm4gV2lkZVN0cmluZyhzdHIxLCBzdHIyLkFzU3RyaW5nVmlldygpKTsKK30KK2lubGluZSBXaWRlU3RyaW5nIG9wZXJhdG9yKyhjb25zdCBXaWRlU3RyaW5nJiBzdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBzdHIyKSB7CisgIHJldHVybiBXaWRlU3RyaW5nKHN0cjEuQXNTdHJpbmdWaWV3KCksIHN0cjIpOworfQoraW5saW5lIFdpZGVTdHJpbmcgb3BlcmF0b3IrKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBzdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHN0cjIpIHsKKyAgcmV0dXJuIFdpZGVTdHJpbmcoc3RyMSwgc3RyMi5Bc1N0cmluZ1ZpZXcoKSk7Cit9CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHdjaGFyX3QqIGxocywgY29uc3QgV2lkZVN0cmluZyYgcmhzKSB7CisgIHJldHVybiByaHMgPT0gbGhzOworfQoraW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBXaWRlU3RyaW5nVmlldyYgbGhzLCBjb25zdCBXaWRlU3RyaW5nJiByaHMpIHsKKyAgcmV0dXJuIHJocyA9PSBsaHM7Cit9CitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHdjaGFyX3QqIGxocywgY29uc3QgV2lkZVN0cmluZyYgcmhzKSB7CisgIHJldHVybiByaHMgIT0gbGhzOworfQoraW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBXaWRlU3RyaW5nVmlldyYgbGhzLCBjb25zdCBXaWRlU3RyaW5nJiByaHMpIHsKKyAgcmV0dXJuIHJocyAhPSBsaHM7Cit9CitpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3Qgd2NoYXJfdCogbGhzLCBjb25zdCBXaWRlU3RyaW5nJiByaHMpIHsKKyAgcmV0dXJuIHJocy5Db21wYXJlKGxocykgPiAwOworfQorCitzdGQ6Ondvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6d29zdHJlYW0mIG9zLCBjb25zdCBXaWRlU3RyaW5nJiBzdHIpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFdpZGVTdHJpbmcmIHN0cik7CitzdGQ6Ondvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6d29zdHJlYW0mIG9zLCBjb25zdCBXaWRlU3RyaW5nVmlldyYgc3RyKTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBXaWRlU3RyaW5nVmlldyYgc3RyKTsKKworfSAgLy8gbmFtZXNwYWNlIGZ4Y3J0CisKK3VzaW5nIFdpZGVTdHJpbmcgPSBmeGNydDo6V2lkZVN0cmluZzsKKwordWludDMyX3QgRlhfSGFzaENvZGVfR2V0Vyhjb25zdCBXaWRlU3RyaW5nVmlldyYgc3RyLCBib29sIGJJZ25vcmVDYXNlKTsKKworbmFtZXNwYWNlIHN0ZCB7CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgaGFzaDxXaWRlU3RyaW5nPiB7CisgIHN0ZDo6c2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgV2lkZVN0cmluZyYgc3RyKSBjb25zdCB7CisgICAgcmV0dXJuIEZYX0hhc2hDb2RlX0dldFcoc3RyLkFzU3RyaW5nVmlldygpLCBmYWxzZSk7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBzdGQKKworZXh0ZXJuIHRlbXBsYXRlIHN0cnVjdCBzdGQ6Omhhc2g8V2lkZVN0cmluZz47CisKKyNlbmRpZiAgLy8gQ09SRV9GWENSVF9XSURFU1RSSU5HX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L3dpZGVzdHJpbmdfdW5pdHRlc3QuY3BwIGIvY29yZS9meGNydC93aWRlc3RyaW5nX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmI5ZThjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC93aWRlc3RyaW5nX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDE2NzkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvd2lkZXN0cmluZy5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSBmeGNydCB7CisKK1RFU1QoV2lkZVN0cmluZywgRWxlbWVudEFjY2VzcykgeworICBjb25zdCBXaWRlU3RyaW5nIGFiYyhMImFiYyIpOworICBFWFBFQ1RfRVEoTCdhJywgYWJjWzBdKTsKKyAgRVhQRUNUX0VRKEwnYicsIGFiY1sxXSk7CisgIEVYUEVDVF9FUShMJ2MnLCBhYmNbMl0pOworI2lmbmRlZiBOREVCVUcKKyAgRVhQRUNUX0RFQVRIKHsgYWJjWzRdOyB9LCAiLioiKTsKKyNlbmRpZgorCisgIFdpZGVTdHJpbmcgbXV0YWJsZV9hYmMgPSBhYmM7CisgIEVYUEVDVF9FUShhYmMuY19zdHIoKSwgbXV0YWJsZV9hYmMuY19zdHIoKSk7CisgIEVYUEVDVF9FUShMJ2EnLCBtdXRhYmxlX2FiY1swXSk7CisgIEVYUEVDVF9FUShMJ2InLCBtdXRhYmxlX2FiY1sxXSk7CisgIEVYUEVDVF9FUShMJ2MnLCBtdXRhYmxlX2FiY1syXSk7CisgIEVYUEVDVF9FUShhYmMuY19zdHIoKSwgbXV0YWJsZV9hYmMuY19zdHIoKSk7CisgIEVYUEVDVF9FUShMImFiYyIsIGFiYyk7CisKKyAgY29uc3Qgd2NoYXJfdCogY19zdHIgPSBhYmMuY19zdHIoKTsKKyAgbXV0YWJsZV9hYmMuU2V0QXQoMCwgTCdkJyk7CisgIEVYUEVDVF9FUShjX3N0ciwgYWJjLmNfc3RyKCkpOworICBFWFBFQ1RfTkUoY19zdHIsIG11dGFibGVfYWJjLmNfc3RyKCkpOworICBFWFBFQ1RfRVEoTCJhYmMiLCBhYmMpOworICBFWFBFQ1RfRVEoTCJkYmMiLCBtdXRhYmxlX2FiYyk7CisKKyAgbXV0YWJsZV9hYmMuU2V0QXQoMSwgTCdlJyk7CisgIEVYUEVDVF9FUShMImFiYyIsIGFiYyk7CisgIEVYUEVDVF9FUShMImRlYyIsIG11dGFibGVfYWJjKTsKKworICBtdXRhYmxlX2FiYy5TZXRBdCgyLCBMJ2YnKTsKKyAgRVhQRUNUX0VRKEwiYWJjIiwgYWJjKTsKKyAgRVhQRUNUX0VRKEwiZGVmIiwgbXV0YWJsZV9hYmMpOworI2lmbmRlZiBOREVCVUcKKyAgRVhQRUNUX0RFQVRIKHsgbXV0YWJsZV9hYmMuU2V0QXQoMywgTCdnJyk7IH0sICIuKiIpOworICBFWFBFQ1RfRVEoTCJhYmMiLCBhYmMpOworI2VuZGlmCit9CisKK1RFU1QoV2lkZVN0cmluZywgT3BlcmF0b3JMVCkgeworICBXaWRlU3RyaW5nIGVtcHR5OworICBXaWRlU3RyaW5nIGEoTCJhIik7CisgIFdpZGVTdHJpbmcgYWJjKEwiXHgwMTEwcXEiKTsgIC8vIENvbWVzIGJlZm9yZSBkZXNwaXRlIGVuZGlhbm5lc3MuCisgIFdpZGVTdHJpbmcgZGVmKEwiXHgxMDAxcXEiKTsgIC8vIENvbWVzIGFmdGVyIGRlc3BpdGUgZW5kaWFubmVzcy4KKyAgV2lkZVN0cmluZ1ZpZXcgdl9lbXB0eTsKKyAgV2lkZVN0cmluZ1ZpZXcgdl9hKEwiYSIpOworICBXaWRlU3RyaW5nVmlldyB2X2FiYyhMIlx4MDExMHFxIik7CisgIFdpZGVTdHJpbmdWaWV3IHZfZGVmKEwiXHgxMDAxcXEiKTsKKyAgY29uc3Qgd2NoYXJfdCogY29uc3QgY19udWxsID0gbnVsbHB0cjsKKyAgY29uc3Qgd2NoYXJfdCogY29uc3QgY19lbXB0eSA9IEwiIjsKKyAgY29uc3Qgd2NoYXJfdCogY29uc3QgY19hID0gTCJhIjsKKyAgY29uc3Qgd2NoYXJfdCogY29uc3QgY19hYmMgPSBMIlx4MDExMHFxIjsKKyAgY29uc3Qgd2NoYXJfdCogY29uc3QgY19kZWYgPSBMIlx4MTAwMXFxIjsKKworICBFWFBFQ1RfRkFMU0UoZW1wdHkgPCBlbXB0eSk7CisgIEVYUEVDVF9GQUxTRShhIDwgYSk7CisgIEVYUEVDVF9GQUxTRShhYmMgPCBhYmMpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGNfbnVsbCA8IGVtcHR5KTsKKyAgRVhQRUNUX0ZBTFNFKGNfZW1wdHkgPCBlbXB0eSk7CisgIEVYUEVDVF9GQUxTRShjX2EgPCBhKTsKKyAgRVhQRUNUX0ZBTFNFKGNfYWJjIDwgYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGNfZGVmIDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5IDwgY19udWxsKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5IDwgY19lbXB0eSk7CisgIEVYUEVDVF9GQUxTRShhIDwgY19hKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IGNfYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGNfZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5IDwgdl9lbXB0eSk7CisgIEVYUEVDVF9GQUxTRShhIDwgdl9hKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IHZfYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IHZfZGVmKTsKKworICBFWFBFQ1RfVFJVRShlbXB0eSA8IGEpOworICBFWFBFQ1RfRkFMU0UoYSA8IGVtcHR5KTsKKyAgRVhQRUNUX1RSVUUoY19udWxsIDwgYSk7CisgIEVYUEVDVF9UUlVFKGNfZW1wdHkgPCBhKTsKKyAgRVhQRUNUX0ZBTFNFKGNfYSA8IGVtcHR5KTsKKyAgRVhQRUNUX1RSVUUoZW1wdHkgPCBjX2EpOworICBFWFBFQ1RfRkFMU0UoYSA8IGNfbnVsbCk7CisgIEVYUEVDVF9GQUxTRShhIDwgY19lbXB0eSk7CisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgdl9hKTsKKyAgRVhQRUNUX0ZBTFNFKGEgPCB2X2VtcHR5KTsKKworICBFWFBFQ1RfVFJVRShlbXB0eSA8IGFiYyk7CisgIEVYUEVDVF9GQUxTRShhYmMgPCBlbXB0eSk7CisgIEVYUEVDVF9UUlVFKGNfbnVsbCA8IGFiYyk7CisgIEVYUEVDVF9UUlVFKGNfZW1wdHkgPCBhYmMpOworICBFWFBFQ1RfRkFMU0UoY19hYmMgPCBlbXB0eSk7CisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgY19hYmMpOworICBFWFBFQ1RfRkFMU0UoYWJjIDwgY19udWxsKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IGNfZW1wdHkpOworICBFWFBFQ1RfVFJVRShlbXB0eSA8IHZfYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IHZfZW1wdHkpOworCisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGVtcHR5KTsKKyAgRVhQRUNUX1RSVUUoY19udWxsIDwgZGVmKTsKKyAgRVhQRUNUX1RSVUUoY19lbXB0eSA8IGRlZik7CisgIEVYUEVDVF9GQUxTRShjX2RlZiA8IGVtcHR5KTsKKyAgRVhQRUNUX1RSVUUoZW1wdHkgPCBjX2RlZik7CisgIEVYUEVDVF9GQUxTRShkZWYgPCBjX251bGwpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgY19lbXB0eSk7CisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgdl9kZWYpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgdl9lbXB0eSk7CisKKyAgRVhQRUNUX1RSVUUoYSA8IGFiYyk7CisgIEVYUEVDVF9GQUxTRShhYmMgPCBhKTsKKyAgRVhQRUNUX1RSVUUoY19hIDwgYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGNfYWJjIDwgYSk7CisgIEVYUEVDVF9UUlVFKGEgPCBjX2FiYyk7CisgIEVYUEVDVF9GQUxTRShhYmMgPCBjX2EpOworICBFWFBFQ1RfVFJVRShhIDwgdl9hYmMpOworICBFWFBFQ1RfRkFMU0UoYWJjIDwgdl9hKTsKKworICBFWFBFQ1RfVFJVRShhIDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGEpOworICBFWFBFQ1RfVFJVRShjX2EgPCBkZWYpOworICBFWFBFQ1RfRkFMU0UoY19kZWYgPCBhKTsKKyAgRVhQRUNUX1RSVUUoYSA8IGNfZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGNfYSk7CisgIEVYUEVDVF9UUlVFKGEgPCB2X2RlZik7CisgIEVYUEVDVF9GQUxTRShkZWYgPCB2X2EpOworCisgIEVYUEVDVF9UUlVFKGFiYyA8IGRlZik7CisgIEVYUEVDVF9GQUxTRShkZWYgPCBhYmMpOworICBFWFBFQ1RfVFJVRShjX2FiYyA8IGRlZik7CisgIEVYUEVDVF9GQUxTRShjX2RlZiA8IGFiYyk7CisgIEVYUEVDVF9UUlVFKGFiYyA8IGNfZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGNfYWJjKTsKKyAgRVhQRUNUX1RSVUUoYWJjIDwgdl9kZWYpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgdl9hYmMpOworfQorCitURVNUKFdpZGVTdHJpbmcsIE9wZXJhdG9yRVEpIHsKKyAgV2lkZVN0cmluZyBudWxsX3N0cmluZzsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOworCisgIFdpZGVTdHJpbmcgZW1wdHlfc3RyaW5nKEwiIik7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOworCisgIFdpZGVTdHJpbmcgZGVsZXRlZF9zdHJpbmcoTCJoZWxsbyIpOworICBkZWxldGVkX3N0cmluZy5EZWxldGUoMCwgNSk7CisgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBkZWxldGVkX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7CisKKyAgV2lkZVN0cmluZyB3aWRlX3N0cmluZyhMImhlbGxvIik7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nID09IHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSBkZWxldGVkX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyA9PSB3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgPT0gd2lkZV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgPT0gd2lkZV9zdHJpbmcpOworCisgIFdpZGVTdHJpbmcgd2lkZV9zdHJpbmdfc2FtZTEoTCJoZWxsbyIpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZ19zYW1lMSk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX3NhbWUxID09IHdpZGVfc3RyaW5nKTsKKworICBXaWRlU3RyaW5nIHdpZGVfc3RyaW5nX3NhbWUyKHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgPT0gd2lkZV9zdHJpbmdfc2FtZTIpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19zYW1lMiA9PSB3aWRlX3N0cmluZyk7CisKKyAgV2lkZVN0cmluZyB3aWRlX3N0cmluZzEoTCJoZSIpOworICBXaWRlU3RyaW5nIHdpZGVfc3RyaW5nMihMImhlbGxwIik7CisgIFdpZGVTdHJpbmcgd2lkZV9zdHJpbmczKEwiaGVsbG9kIik7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSB3aWRlX3N0cmluZzEpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gd2lkZV9zdHJpbmcyKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IHdpZGVfc3RyaW5nMyk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZzEgPT0gd2lkZV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcyID09IHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nMyA9PSB3aWRlX3N0cmluZyk7CisKKyAgV2lkZVN0cmluZ1ZpZXcgbnVsbF9zdHJpbmdfYzsKKyAgV2lkZVN0cmluZ1ZpZXcgZW1wdHlfc3RyaW5nX2MoTCIiKTsKKyAgRVhQRUNUX1RSVUUobnVsbF9zdHJpbmcgPT0gbnVsbF9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGVtcHR5X3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IG51bGxfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRShkZWxldGVkX3N0cmluZyA9PSBudWxsX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gZW1wdHlfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZ19jID09IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nX2MgPT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZ19jID09IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZ19jID09IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nX2MgPT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHJpbmdfYyA9PSBkZWxldGVkX3N0cmluZyk7CisKKyAgV2lkZVN0cmluZ1ZpZXcgd2lkZV9zdHJpbmdfY19zYW1lMShMImhlbGxvIik7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nID09IHdpZGVfc3RyaW5nX2Nfc2FtZTEpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jX3NhbWUxID09IHdpZGVfc3RyaW5nKTsKKworICBXaWRlU3RyaW5nVmlldyB3aWRlX3N0cmluZ19jMShMImhlIik7CisgIFdpZGVTdHJpbmdWaWV3IHdpZGVfc3RyaW5nX2MyKEwiaGVsbHAiKTsKKyAgV2lkZVN0cmluZ1ZpZXcgd2lkZV9zdHJpbmdfYzMoTCJoZWxsb2QiKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IHdpZGVfc3RyaW5nX2MxKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IHdpZGVfc3RyaW5nX2MyKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IHdpZGVfc3RyaW5nX2MzKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MxID09IHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MyID09IHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MzID09IHdpZGVfc3RyaW5nKTsKKworICBjb25zdCB3Y2hhcl90KiBjb25zdCBjX251bGxfc3RyaW5nID0gbnVsbHB0cjsKKyAgY29uc3Qgd2NoYXJfdCogY29uc3QgY19lbXB0eV9zdHJpbmcgPSBMIiI7CisgIEVYUEVDVF9UUlVFKG51bGxfc3RyaW5nID09IGNfbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyA9PSBjX2VtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyA9PSBjX251bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZW1wdHlfc3RyaW5nID09IGNfZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoZGVsZXRlZF9zdHJpbmcgPT0gY19udWxsX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nID09IGNfZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoY19udWxsX3N0cmluZyA9PSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGNfZW1wdHlfc3RyaW5nID09IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoY19udWxsX3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShjX2VtcHR5X3N0cmluZyA9PSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShjX251bGxfc3RyaW5nID09IGRlbGV0ZWRfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoY19lbXB0eV9zdHJpbmcgPT0gZGVsZXRlZF9zdHJpbmcpOworCisgIGNvbnN0IHdjaGFyX3QqIGNvbnN0IGNfc3RyaW5nX3NhbWUxID0gTCJoZWxsbyI7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nID09IGNfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX1RSVUUoY19zdHJpbmdfc2FtZTEgPT0gd2lkZV9zdHJpbmcpOworCisgIGNvbnN0IHdjaGFyX3QqIGNvbnN0IGNfc3RyaW5nMSA9IEwiaGUiOworICBjb25zdCB3Y2hhcl90KiBjb25zdCBjX3N0cmluZzIgPSBMImhlbGxwIjsKKyAgY29uc3Qgd2NoYXJfdCogY29uc3QgY19zdHJpbmczID0gTCJoZWxsb2QiOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmcgPT0gY19zdHJpbmcxKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nID09IGNfc3RyaW5nMik7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyA9PSBjX3N0cmluZzMpOworICBFWFBFQ1RfRkFMU0UoY19zdHJpbmcxID09IHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nMiA9PSB3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShjX3N0cmluZzMgPT0gd2lkZV9zdHJpbmcpOworfQorCitURVNUKFdpZGVTdHJpbmcsIE9wZXJhdG9yTkUpIHsKKyAgV2lkZVN0cmluZyBudWxsX3N0cmluZzsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IG51bGxfc3RyaW5nKTsKKworICBXaWRlU3RyaW5nIGVtcHR5X3N0cmluZyhMIiIpOworICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKKworICBXaWRlU3RyaW5nIGRlbGV0ZWRfc3RyaW5nKEwiaGVsbG8iKTsKKyAgZGVsZXRlZF9zdHJpbmcuRGVsZXRlKDAsIDUpOworICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGRlbGV0ZWRfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7CisKKyAgV2lkZVN0cmluZyB3aWRlX3N0cmluZyhMImhlbGxvIik7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyAhPSB3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gZGVsZXRlZF9zdHJpbmcpOworICBFWFBFQ1RfVFJVRShudWxsX3N0cmluZyAhPSB3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGVtcHR5X3N0cmluZyAhPSB3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKGRlbGV0ZWRfc3RyaW5nICE9IHdpZGVfc3RyaW5nKTsKKworICBXaWRlU3RyaW5nIHdpZGVfc3RyaW5nX3NhbWUxKEwiaGVsbG8iKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nICE9IHdpZGVfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX3NhbWUxICE9IHdpZGVfc3RyaW5nKTsKKworICBXaWRlU3RyaW5nIHdpZGVfc3RyaW5nX3NhbWUyKHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nICE9IHdpZGVfc3RyaW5nX3NhbWUyKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX3NhbWUyICE9IHdpZGVfc3RyaW5nKTsKKworICBXaWRlU3RyaW5nIHdpZGVfc3RyaW5nMShMImhlIik7CisgIFdpZGVTdHJpbmcgd2lkZV9zdHJpbmcyKEwiaGVsbHAiKTsKKyAgV2lkZVN0cmluZyB3aWRlX3N0cmluZzMoTCJoZWxsb2QiKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmcxKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmcyKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmczKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcxICE9IHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcyICE9IHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmczICE9IHdpZGVfc3RyaW5nKTsKKworICBXaWRlU3RyaW5nVmlldyBudWxsX3N0cmluZ19jOworICBXaWRlU3RyaW5nVmlldyBlbXB0eV9zdHJpbmdfYyhMIiIpOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gbnVsbF9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZyAhPSBlbXB0eV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gbnVsbF9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcgIT0gZW1wdHlfc3RyaW5nX2MpOworICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gbnVsbF9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShkZWxldGVkX3N0cmluZyAhPSBlbXB0eV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZ19jICE9IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZ19jICE9IG51bGxfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nX2MgIT0gZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGVtcHR5X3N0cmluZ19jICE9IGVtcHR5X3N0cmluZyk7CisKKyAgV2lkZVN0cmluZ1ZpZXcgd2lkZV9zdHJpbmdfY19zYW1lMShMImhlbGxvIik7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZyAhPSB3aWRlX3N0cmluZ19jX3NhbWUxKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2Nfc2FtZTEgIT0gd2lkZV9zdHJpbmcpOworCisgIFdpZGVTdHJpbmdWaWV3IHdpZGVfc3RyaW5nX2MxKEwiaGUiKTsKKyAgV2lkZVN0cmluZ1ZpZXcgd2lkZV9zdHJpbmdfYzIoTCJoZWxscCIpOworICBXaWRlU3RyaW5nVmlldyB3aWRlX3N0cmluZ19jMyhMImhlbGxvZCIpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZyAhPSB3aWRlX3N0cmluZ19jMSk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nICE9IHdpZGVfc3RyaW5nX2MyKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gd2lkZV9zdHJpbmdfYzMpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jMSAhPSB3aWRlX3N0cmluZyk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MyICE9IHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYzMgIT0gd2lkZV9zdHJpbmcpOworCisgIGNvbnN0IHdjaGFyX3QqIGNvbnN0IGNfbnVsbF9zdHJpbmcgPSBudWxscHRyOworICBjb25zdCB3Y2hhcl90KiBjb25zdCBjX2VtcHR5X3N0cmluZyA9IEwiIjsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nICE9IGNfbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcgIT0gY19lbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGNfbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nICE9IGNfZW1wdHlfc3RyaW5nKTsKKyAgRVhQRUNUX0ZBTFNFKGRlbGV0ZWRfc3RyaW5nICE9IGNfbnVsbF9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoZGVsZXRlZF9zdHJpbmcgIT0gY19lbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoY19udWxsX3N0cmluZyAhPSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShjX2VtcHR5X3N0cmluZyAhPSBudWxsX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShjX251bGxfc3RyaW5nICE9IGVtcHR5X3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShjX2VtcHR5X3N0cmluZyAhPSBlbXB0eV9zdHJpbmcpOworICBFWFBFQ1RfRkFMU0UoY19udWxsX3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7CisgIEVYUEVDVF9GQUxTRShjX2VtcHR5X3N0cmluZyAhPSBkZWxldGVkX3N0cmluZyk7CisKKyAgY29uc3Qgd2NoYXJfdCogY29uc3QgY19zdHJpbmdfc2FtZTEgPSBMImhlbGxvIjsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nICE9IGNfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX0ZBTFNFKGNfc3RyaW5nX3NhbWUxICE9IHdpZGVfc3RyaW5nKTsKKworICBjb25zdCB3Y2hhcl90KiBjb25zdCBjX3N0cmluZzEgPSBMImhlIjsKKyAgY29uc3Qgd2NoYXJfdCogY29uc3QgY19zdHJpbmcyID0gTCJoZWxscCI7CisgIGNvbnN0IHdjaGFyX3QqIGNvbnN0IGNfc3RyaW5nMyA9IEwiaGVsbG9kIjsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gY19zdHJpbmcxKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gY19zdHJpbmcyKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcgIT0gY19zdHJpbmczKTsKKyAgRVhQRUNUX1RSVUUoY19zdHJpbmcxICE9IHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoY19zdHJpbmcyICE9IHdpZGVfc3RyaW5nKTsKKyAgRVhQRUNUX1RSVUUoY19zdHJpbmczICE9IHdpZGVfc3RyaW5nKTsKK30KKworVEVTVChXaWRlU3RyaW5nLCBDb25jYXRJblBsYWNlKSB7CisgIFdpZGVTdHJpbmcgZnJlZDsKKyAgZnJlZC5Db25jYXQoTCJGUkVEIiwgNCk7CisgIEVYUEVDVF9FUShMIkZSRUQiLCBmcmVkKTsKKworICBmcmVkLkNvbmNhdChMIkRZIiwgMik7CisgIEVYUEVDVF9FUShMIkZSRUREWSIsIGZyZWQpOworCisgIGZyZWQuRGVsZXRlKDMsIDMpOworICBFWFBFQ1RfRVEoTCJGUkUiLCBmcmVkKTsKKworICBmcmVkLkNvbmNhdChMIkQiLCAxKTsKKyAgRVhQRUNUX0VRKEwiRlJFRCIsIGZyZWQpOworCisgIFdpZGVTdHJpbmcgY29weSA9IGZyZWQ7CisgIGZyZWQuQ29uY2F0KEwiRFkiLCAyKTsKKyAgRVhQRUNUX0VRKEwiRlJFRERZIiwgZnJlZCk7CisgIEVYUEVDVF9FUShMIkZSRUQiLCBjb3B5KTsKK30KKworVEVTVChXaWRlU3RyaW5nLCBSZW1vdmUpIHsKKyAgV2lkZVN0cmluZyBmcmVlZChMIkZSRUVEIik7CisgIGZyZWVkLlJlbW92ZShMJ0UnKTsKKyAgRVhQRUNUX0VRKEwiRlJEIiwgZnJlZWQpOworICBmcmVlZC5SZW1vdmUoTCdGJyk7CisgIEVYUEVDVF9FUShMIlJEIiwgZnJlZWQpOworICBmcmVlZC5SZW1vdmUoTCdEJyk7CisgIEVYUEVDVF9FUShMIlIiLCBmcmVlZCk7CisgIGZyZWVkLlJlbW92ZShMJ1gnKTsKKyAgRVhQRUNUX0VRKEwiUiIsIGZyZWVkKTsKKyAgZnJlZWQuUmVtb3ZlKEwnUicpOworICBFWFBFQ1RfRVEoTCIiLCBmcmVlZCk7CisKKyAgV2lkZVN0cmluZyBlbXB0eTsKKyAgZW1wdHkuUmVtb3ZlKEwnWCcpOworICBFWFBFQ1RfRVEoTCIiLCBlbXB0eSk7Cit9CisKK1RFU1QoV2lkZVN0cmluZywgUmVtb3ZlQ29waWVzKSB7CisgIFdpZGVTdHJpbmcgZnJlZWQoTCJGUkVFRCIpOworICBjb25zdCB3Y2hhcl90KiBvbGRfYnVmZmVyID0gZnJlZWQuY19zdHIoKTsKKworICAvLyBObyBjaGFuZ2Ugd2l0aCBzaW5nbGUgcmVmZXJlbmNlIC0gbm8gY29weS4KKyAgZnJlZWQuUmVtb3ZlKEwnUScpOworICBFWFBFQ1RfRVEoTCJGUkVFRCIsIGZyZWVkKTsKKyAgRVhQRUNUX0VRKG9sZF9idWZmZXIsIGZyZWVkLmNfc3RyKCkpOworCisgIC8vIENoYW5nZSB3aXRoIHNpbmdsZSByZWZlcmVuY2UgLSBubyBjb3B5LgorICBmcmVlZC5SZW1vdmUoTCdFJyk7CisgIEVYUEVDVF9FUShMIkZSRCIsIGZyZWVkKTsKKyAgRVhQRUNUX0VRKG9sZF9idWZmZXIsIGZyZWVkLmNfc3RyKCkpOworCisgIC8vIE5vIGNoYW5nZSB3aXRoIG11bHRpcGxlIHJlZmVyZW5jZXMgLSBubyBjb3B5LgorICBXaWRlU3RyaW5nIHNoYXJlZChmcmVlZCk7CisgIGZyZWVkLlJlbW92ZShMJ1EnKTsKKyAgRVhQRUNUX0VRKEwiRlJEIiwgZnJlZWQpOworICBFWFBFQ1RfRVEob2xkX2J1ZmZlciwgZnJlZWQuY19zdHIoKSk7CisgIEVYUEVDVF9FUShvbGRfYnVmZmVyLCBzaGFyZWQuY19zdHIoKSk7CisKKyAgLy8gQ2hhbmdlIHdpdGggbXVsdGlwbGUgcmVmZXJlbmNlcyAtLSBtdXN0IGNvcHkuCisgIGZyZWVkLlJlbW92ZShMJ0QnKTsKKyAgRVhQRUNUX0VRKEwiRlIiLCBmcmVlZCk7CisgIEVYUEVDVF9ORShvbGRfYnVmZmVyLCBmcmVlZC5jX3N0cigpKTsKKyAgRVhQRUNUX0VRKEwiRlJEIiwgc2hhcmVkKTsKKyAgRVhQRUNUX0VRKG9sZF9idWZmZXIsIHNoYXJlZC5jX3N0cigpKTsKK30KKworVEVTVChXaWRlU3RyaW5nLCBSZXBsYWNlKSB7CisgIFdpZGVTdHJpbmcgZnJlZChMIkZSRUQiKTsKKyAgZnJlZC5SZXBsYWNlKEwiRlIiLCBMIkJMIik7CisgIEVYUEVDVF9FUShMIkJMRUQiLCBmcmVkKTsKKyAgZnJlZC5SZXBsYWNlKEwiRCIsIEwiRERZIik7CisgIEVYUEVDVF9FUShMIkJMRUREWSIsIGZyZWQpOworICBmcmVkLlJlcGxhY2UoTCJMRUREIiwgTCIiKTsKKyAgRVhQRUNUX0VRKEwiQlkiLCBmcmVkKTsKKyAgZnJlZC5SZXBsYWNlKEwiWCIsIEwiQ0xBTVMiKTsKKyAgRVhQRUNUX0VRKEwiQlkiLCBmcmVkKTsKKyAgZnJlZC5SZXBsYWNlKEwiQlkiLCBMIkhJIik7CisgIEVYUEVDVF9FUShMIkhJIiwgZnJlZCk7CisgIGZyZWQuUmVwbGFjZShMIiIsIEwiQ0xBTVMiKTsKKyAgRVhQRUNUX0VRKEwiSEkiLCBmcmVkKTsKKyAgZnJlZC5SZXBsYWNlKEwiSEkiLCBMIiIpOworICBFWFBFQ1RfRVEoTCIiLCBmcmVkKTsKK30KKworVEVTVChXaWRlU3RyaW5nLCBJbnNlcnQpIHsKKyAgV2lkZVN0cmluZyBmcmVkKEwiRlJFRCIpOworICBFWFBFQ1RfRVEoNXUsIGZyZWQuSW5zZXJ0KDAsICdTJykpOworICBFWFBFQ1RfRVEoTCJTRlJFRCIsIGZyZWQpOworICBFWFBFQ1RfRVEoNnUsIGZyZWQuSW5zZXJ0KDEsICdUJykpOworICBFWFBFQ1RfRVEoTCJTVEZSRUQiLCBmcmVkKTsKKyAgRVhQRUNUX0VRKDd1LCBmcmVkLkluc2VydCg0LCAnVScpKTsKKyAgRVhQRUNUX0VRKEwiU1RGUlVFRCIsIGZyZWQpOworICBFWFBFQ1RfRVEoOHUsIGZyZWQuSW5zZXJ0KDcsICdWJykpOworICBFWFBFQ1RfRVEoTCJTVEZSVUVEViIsIGZyZWQpOworICBFWFBFQ1RfRVEoOHUsIGZyZWQuSW5zZXJ0KDEyLCAnUCcpKTsKKyAgRVhQRUNUX0VRKEwiU1RGUlVFRFYiLCBmcmVkKTsKKyAgeworICAgIFdpZGVTdHJpbmcgZW1wdHk7CisgICAgRVhQRUNUX0VRKDF1LCBlbXB0eS5JbnNlcnQoMCwgJ1gnKSk7CisgICAgRVhQRUNUX0VRKEwiWCIsIGVtcHR5KTsKKyAgfQorICB7CisgICAgV2lkZVN0cmluZyBlbXB0eTsKKyAgICBFWFBFQ1RfRVEoMHUsIGVtcHR5Lkluc2VydCg1LCAnWCcpKTsKKyAgICBFWFBFQ1RfTkUoTCJYIiwgZW1wdHkpOworICB9Cit9CisKK1RFU1QoV2lkZVN0cmluZywgSW5zZXJ0QXRGcm9udEFuZEluc2VydEF0QmFjaykgeworICB7CisgICAgV2lkZVN0cmluZyBlbXB0eTsKKyAgICBFWFBFQ1RfRVEoMXUsIGVtcHR5Lkluc2VydEF0RnJvbnQoJ0QnKSk7CisgICAgRVhQRUNUX0VRKEwiRCIsIGVtcHR5KTsKKyAgICBFWFBFQ1RfRVEoMnUsIGVtcHR5Lkluc2VydEF0RnJvbnQoJ0UnKSk7CisgICAgRVhQRUNUX0VRKEwiRUQiLCBlbXB0eSk7CisgICAgRVhQRUNUX0VRKDN1LCBlbXB0eS5JbnNlcnRBdEZyb250KCdSJykpOworICAgIEVYUEVDVF9FUShMIlJFRCIsIGVtcHR5KTsKKyAgICBFWFBFQ1RfRVEoNHUsIGVtcHR5Lkluc2VydEF0RnJvbnQoJ0YnKSk7CisgICAgRVhQRUNUX0VRKEwiRlJFRCIsIGVtcHR5KTsKKyAgfQorICB7CisgICAgV2lkZVN0cmluZyBlbXB0eTsKKyAgICBFWFBFQ1RfRVEoMXUsIGVtcHR5Lkluc2VydEF0QmFjaygnRicpKTsKKyAgICBFWFBFQ1RfRVEoTCJGIiwgZW1wdHkpOworICAgIEVYUEVDVF9FUSgydSwgZW1wdHkuSW5zZXJ0QXRCYWNrKCdSJykpOworICAgIEVYUEVDVF9FUShMIkZSIiwgZW1wdHkpOworICAgIEVYUEVDVF9FUSgzdSwgZW1wdHkuSW5zZXJ0QXRCYWNrKCdFJykpOworICAgIEVYUEVDVF9FUShMIkZSRSIsIGVtcHR5KTsKKyAgICBFWFBFQ1RfRVEoNHUsIGVtcHR5Lkluc2VydEF0QmFjaygnRCcpKTsKKyAgICBFWFBFQ1RfRVEoTCJGUkVEIiwgZW1wdHkpOworICB9CisgIHsKKyAgICBXaWRlU3RyaW5nIGVtcHR5OworICAgIEVYUEVDVF9FUSgxdSwgZW1wdHkuSW5zZXJ0QXRCYWNrKCdFJykpOworICAgIEVYUEVDVF9FUShMIkUiLCBlbXB0eSk7CisgICAgRVhQRUNUX0VRKDJ1LCBlbXB0eS5JbnNlcnRBdEZyb250KCdSJykpOworICAgIEVYUEVDVF9FUShMIlJFIiwgZW1wdHkpOworICAgIEVYUEVDVF9FUSgzdSwgZW1wdHkuSW5zZXJ0QXRCYWNrKCdEJykpOworICAgIEVYUEVDVF9FUShMIlJFRCIsIGVtcHR5KTsKKyAgICBFWFBFQ1RfRVEoNHUsIGVtcHR5Lkluc2VydEF0RnJvbnQoJ0YnKSk7CisgICAgRVhQRUNUX0VRKEwiRlJFRCIsIGVtcHR5KTsKKyAgfQorfQorCitURVNUKFdpZGVTdHJpbmcsIERlbGV0ZSkgeworICBXaWRlU3RyaW5nIGZyZWQoTCJGUkVEIik7CisgIEVYUEVDVF9FUSg0dSwgZnJlZC5EZWxldGUoMCwgMCkpOworICBFWFBFQ1RfRVEoTCJGUkVEIiwgZnJlZCk7CisgIEVYUEVDVF9FUSgydSwgZnJlZC5EZWxldGUoMCwgMikpOworICBFWFBFQ1RfRVEoTCJFRCIsIGZyZWQpOworICBFWFBFQ1RfRVEoMXUsIGZyZWQuRGVsZXRlKDEpKTsKKyAgRVhQRUNUX0VRKEwiRSIsIGZyZWQpOworICBFWFBFQ1RfRVEoMHUsIGZyZWQuRGVsZXRlKDApKTsKKyAgRVhQRUNUX0VRKEwiIiwgZnJlZCk7CisgIEVYUEVDVF9FUSgwdSwgZnJlZC5EZWxldGUoMCkpOworICBFWFBFQ1RfRVEoTCIiLCBmcmVkKTsKKworICBXaWRlU3RyaW5nIGVtcHR5OworICBFWFBFQ1RfRVEoMHUsIGVtcHR5LkRlbGV0ZSgwKSk7CisgIEVYUEVDVF9FUShMIiIsIGVtcHR5KTsKKyAgRVhQRUNUX0VRKDB1LCBlbXB0eS5EZWxldGUoMSkpOworICBFWFBFQ1RfRVEoTCIiLCBlbXB0eSk7Cit9CisKK1RFU1QoV2lkZVN0cmluZywgTWlkKSB7CisgIFdpZGVTdHJpbmcgZnJlZChMIkZSRUQiKTsKKyAgRVhQRUNUX0VRKEwiIiwgZnJlZC5NaWQoMCwgMCkpOworICBFWFBFQ1RfRVEoTCIiLCBmcmVkLk1pZCgzLCAwKSk7CisgIEVYUEVDVF9FUShMIkZSRUQiLCBmcmVkLk1pZCgwLCA0KSk7CisgIEVYUEVDVF9FUShMIlJFRCIsIGZyZWQuTWlkKDEsIDMpKTsKKyAgRVhQRUNUX0VRKEwiRUQiLCBmcmVkLk1pZCgyLCAyKSk7CisgIEVYUEVDVF9FUShMIkQiLCBmcmVkLk1pZCgzLCAxKSk7CisgIEVYUEVDVF9FUShMIkYiLCBmcmVkLk1pZCgwLCAxKSk7CisgIEVYUEVDVF9FUShMIlIiLCBmcmVkLk1pZCgxLCAxKSk7CisgIEVYUEVDVF9FUShMIkUiLCBmcmVkLk1pZCgyLCAxKSk7CisgIEVYUEVDVF9FUShMIkQiLCBmcmVkLk1pZCgzLCAxKSk7CisgIEVYUEVDVF9FUShMIkZSIiwgZnJlZC5NaWQoMCwgMikpOworICBFWFBFQ1RfRVEoTCJGUkVEIiwgZnJlZC5NaWQoMCwgNCkpOworICBFWFBFQ1RfRVEoTCIiLCBmcmVkLk1pZCgwLCAxMCkpOworCisgIEVYUEVDVF9FUShMIiIsIGZyZWQuTWlkKDEsIDQpKTsKKyAgRVhQRUNUX0VRKEwiIiwgZnJlZC5NaWQoNCwgMSkpOworCisgIFdpZGVTdHJpbmcgZW1wdHk7CisgIEVYUEVDVF9FUShMIiIsIGVtcHR5Lk1pZCgwLCAwKSk7Cit9CisKK1RFU1QoV2lkZVN0cmluZywgTGVmdCkgeworICBXaWRlU3RyaW5nIGZyZWQoTCJGUkVEIik7CisgIEVYUEVDVF9FUShMIiIsIGZyZWQuTGVmdCgwKSk7CisgIEVYUEVDVF9FUShMIkYiLCBmcmVkLkxlZnQoMSkpOworICBFWFBFQ1RfRVEoTCJGUiIsIGZyZWQuTGVmdCgyKSk7CisgIEVYUEVDVF9FUShMIkZSRSIsIGZyZWQuTGVmdCgzKSk7CisgIEVYUEVDVF9FUShMIkZSRUQiLCBmcmVkLkxlZnQoNCkpOworCisgIEVYUEVDVF9FUShMIiIsIGZyZWQuTGVmdCg1KSk7CisKKyAgV2lkZVN0cmluZyBlbXB0eTsKKyAgRVhQRUNUX0VRKEwiIiwgZW1wdHkuTGVmdCgwKSk7CisgIEVYUEVDVF9FUShMIiIsIGVtcHR5LkxlZnQoMSkpOworfQorCitURVNUKFdpZGVTdHJpbmcsIFJpZ2h0KSB7CisgIFdpZGVTdHJpbmcgZnJlZChMIkZSRUQiKTsKKyAgRVhQRUNUX0VRKEwiIiwgZnJlZC5SaWdodCgwKSk7CisgIEVYUEVDVF9FUShMIkQiLCBmcmVkLlJpZ2h0KDEpKTsKKyAgRVhQRUNUX0VRKEwiRUQiLCBmcmVkLlJpZ2h0KDIpKTsKKyAgRVhQRUNUX0VRKEwiUkVEIiwgZnJlZC5SaWdodCgzKSk7CisgIEVYUEVDVF9FUShMIkZSRUQiLCBmcmVkLlJpZ2h0KDQpKTsKKworICBFWFBFQ1RfRVEoTCIiLCBmcmVkLlJpZ2h0KDUpKTsKKworICBXaWRlU3RyaW5nIGVtcHR5OworICBFWFBFQ1RfRVEoTCIiLCBlbXB0eS5SaWdodCgwKSk7CisgIEVYUEVDVF9FUShMIiIsIGVtcHR5LlJpZ2h0KDEpKTsKK30KKworVEVTVChXaWRlU3RyaW5nLCBGaW5kKSB7CisgIFdpZGVTdHJpbmcgbnVsbF9zdHJpbmc7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZy5GaW5kKEwnYScpLmhhc192YWx1ZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG51bGxfc3RyaW5nLkZpbmQoTCdcMCcpLmhhc192YWx1ZSgpKTsKKworICBXaWRlU3RyaW5nIGVtcHR5X3N0cmluZyhMIiIpOworICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nLkZpbmQoTCdhJykuaGFzX3ZhbHVlKCkpOworICBFWFBFQ1RfRkFMU0UoZW1wdHlfc3RyaW5nLkZpbmQoTCdcMCcpLmhhc192YWx1ZSgpKTsKKworICBPcHRpb25hbDxzaXplX3Q+IHJlc3VsdDsKKyAgV2lkZVN0cmluZyBzaW5nbGVfc3RyaW5nKEwiYSIpOworICByZXN1bHQgPSBzaW5nbGVfc3RyaW5nLkZpbmQoTCdhJyk7CisgIEFTU0VSVF9UUlVFKHJlc3VsdC5oYXNfdmFsdWUoKSk7CisgIEVYUEVDVF9FUSgwdSwgcmVzdWx0LnZhbHVlKCkpOworICBFWFBFQ1RfRkFMU0Uoc2luZ2xlX3N0cmluZy5GaW5kKEwnYicpLmhhc192YWx1ZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKHNpbmdsZV9zdHJpbmcuRmluZChMJ1wwJykuaGFzX3ZhbHVlKCkpOworCisgIFdpZGVTdHJpbmcgbG9uZ2VyX3N0cmluZyhMImFiY2NjIik7CisgIHJlc3VsdCA9IGxvbmdlcl9zdHJpbmcuRmluZChMJ2EnKTsKKyAgQVNTRVJUX1RSVUUocmVzdWx0Lmhhc192YWx1ZSgpKTsKKyAgRVhQRUNUX0VRKDB1LCByZXN1bHQudmFsdWUoKSk7CisgIHJlc3VsdCA9IGxvbmdlcl9zdHJpbmcuRmluZChMJ2MnKTsKKyAgQVNTRVJUX1RSVUUocmVzdWx0Lmhhc192YWx1ZSgpKTsKKyAgRVhQRUNUX0VRKDJ1LCByZXN1bHQudmFsdWUoKSk7CisgIHJlc3VsdCA9IGxvbmdlcl9zdHJpbmcuRmluZChMJ2MnLCAzKTsKKyAgQVNTRVJUX1RSVUUocmVzdWx0Lmhhc192YWx1ZSgpKTsKKyAgRVhQRUNUX0VRKDN1LCByZXN1bHQudmFsdWUoKSk7CisgIEVYUEVDVF9GQUxTRShsb25nZXJfc3RyaW5nLkZpbmQoTCdcMCcpLmhhc192YWx1ZSgpKTsKKworICByZXN1bHQgPSBsb25nZXJfc3RyaW5nLkZpbmQoTCJhYiIpOworICBBU1NFUlRfVFJVRShyZXN1bHQuaGFzX3ZhbHVlKCkpOworICBFWFBFQ1RfRVEoMHUsIHJlc3VsdC52YWx1ZSgpKTsKKyAgcmVzdWx0ID0gbG9uZ2VyX3N0cmluZy5GaW5kKEwiY2NjIik7CisgIEFTU0VSVF9UUlVFKHJlc3VsdC5oYXNfdmFsdWUoKSk7CisgIEVYUEVDVF9FUSgydSwgcmVzdWx0LnZhbHVlKCkpOworICByZXN1bHQgPSBsb25nZXJfc3RyaW5nLkZpbmQoTCJjYyIsIDMpOworICBBU1NFUlRfVFJVRShyZXN1bHQuaGFzX3ZhbHVlKCkpOworICBFWFBFQ1RfRVEoM3UsIHJlc3VsdC52YWx1ZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKGxvbmdlcl9zdHJpbmcuRmluZChMImQiKS5oYXNfdmFsdWUoKSk7CisKKyAgV2lkZVN0cmluZyBoaWJ5dGVfc3RyaW5nKAorICAgICAgTCJhYlx4ZmY4YyIKKyAgICAgIEwiZGVmIik7CisgIHJlc3VsdCA9IGhpYnl0ZV9zdHJpbmcuRmluZChMJ1x4ZmY4YycpOworICBBU1NFUlRfVFJVRShyZXN1bHQuaGFzX3ZhbHVlKCkpOworICBFWFBFQ1RfRVEoMnUsIHJlc3VsdC52YWx1ZSgpKTsKK30KKworVEVTVChXaWRlU3RyaW5nLCBVcHBlckxvd2VyKSB7CisgIFdpZGVTdHJpbmcgZnJlZChMIkYtUmUuNDJEIik7CisgIGZyZWQuTWFrZUxvd2VyKCk7CisgIEVYUEVDVF9FUShMImYtcmUuNDJkIiwgZnJlZCk7CisgIGZyZWQuTWFrZVVwcGVyKCk7CisgIEVYUEVDVF9FUShMIkYtUkUuNDJEIiwgZnJlZCk7CisKKyAgV2lkZVN0cmluZyBlbXB0eTsKKyAgZW1wdHkuTWFrZUxvd2VyKCk7CisgIEVYUEVDVF9FUShMIiIsIGVtcHR5KTsKKyAgZW1wdHkuTWFrZVVwcGVyKCk7CisgIEVYUEVDVF9FUShMIiIsIGVtcHR5KTsKK30KKworVEVTVChXaWRlU3RyaW5nLCBUcmltKSB7CisgIFdpZGVTdHJpbmcgZnJlZChMIiAgRlJFRCAgIik7CisgIGZyZWQuVHJpbSgpOworICBFWFBFQ1RfRVEoTCJGUkVEIiwgZnJlZCk7CisgIGZyZWQuVHJpbShMJ0UnKTsKKyAgRVhQRUNUX0VRKEwiRlJFRCIsIGZyZWQpOworICBmcmVkLlRyaW0oTCdGJyk7CisgIEVYUEVDVF9FUShMIlJFRCIsIGZyZWQpOworICBmcmVkLlRyaW0oTCJFUlAiKTsKKyAgRVhQRUNUX0VRKEwiRCIsIGZyZWQpOworCisgIFdpZGVTdHJpbmcgYmxhbmsoTCIgICAiKTsKKyAgYmxhbmsuVHJpbShMIkVSUCIpOworICBFWFBFQ1RfRVEoTCIgICAiLCBibGFuayk7CisgIGJsYW5rLlRyaW0oTCdFJyk7CisgIEVYUEVDVF9FUShMIiAgICIsIGJsYW5rKTsKKyAgYmxhbmsuVHJpbSgpOworICBFWFBFQ1RfRVEoTCIiLCBibGFuayk7CisKKyAgV2lkZVN0cmluZyBlbXB0eTsKKyAgZW1wdHkuVHJpbShMIkVSUCIpOworICBFWFBFQ1RfRVEoTCIiLCBlbXB0eSk7CisgIGVtcHR5LlRyaW0oTCdFJyk7CisgIEVYUEVDVF9FUShMIiIsIGVtcHR5KTsKKyAgZW1wdHkuVHJpbSgpOworICBFWFBFQ1RfRVEoTCIiLCBlbXB0eSk7CisKKyAgV2lkZVN0cmluZyBhYmMoTCIgIEFCQ0NCQSAgIik7CisgIGFiYy5UcmltKEwiQSIpOworICBFWFBFQ1RfRVEoTCIgIEFCQ0NCQSAgIiwgYWJjKTsKKyAgYWJjLlRyaW0oTCIgQSIpOworICBFWFBFQ1RfRVEoTCJCQ0NCIiwgYWJjKTsKK30KKworVEVTVChXaWRlU3RyaW5nLCBUcmltTGVmdCkgeworICBXaWRlU3RyaW5nIGZyZWQoTCIgIEZSRUQgICIpOworICBmcmVkLlRyaW1MZWZ0KCk7CisgIEVYUEVDVF9FUShMIkZSRUQgICIsIGZyZWQpOworICBmcmVkLlRyaW1MZWZ0KEwnRScpOworICBFWFBFQ1RfRVEoTCJGUkVEICAiLCBmcmVkKTsKKyAgZnJlZC5UcmltTGVmdChMJ0YnKTsKKyAgRVhQRUNUX0VRKEwiUkVEICAiLCBmcmVkKTsKKyAgZnJlZC5UcmltTGVmdChMIkVSUCIpOworICBFWFBFQ1RfRVEoTCJEICAiLCBmcmVkKTsKKworICBXaWRlU3RyaW5nIGJsYW5rKEwiICAgIik7CisgIGJsYW5rLlRyaW1MZWZ0KEwiRVJQIik7CisgIEVYUEVDVF9FUShMIiAgICIsIGJsYW5rKTsKKyAgYmxhbmsuVHJpbUxlZnQoTCdFJyk7CisgIEVYUEVDVF9FUShMIiAgICIsIGJsYW5rKTsKKyAgYmxhbmsuVHJpbUxlZnQoKTsKKyAgRVhQRUNUX0VRKEwiIiwgYmxhbmspOworCisgIFdpZGVTdHJpbmcgZW1wdHk7CisgIGVtcHR5LlRyaW1MZWZ0KEwiRVJQIik7CisgIEVYUEVDVF9FUShMIiIsIGVtcHR5KTsKKyAgZW1wdHkuVHJpbUxlZnQoTCdFJyk7CisgIEVYUEVDVF9FUShMIiIsIGVtcHR5KTsKKyAgZW1wdHkuVHJpbUxlZnQoKTsKKyAgRVhQRUNUX0VRKEwiIiwgZW1wdHkpOworfQorCitURVNUKFdpZGVTdHJpbmcsIFRyaW1MZWZ0Q29waWVzKSB7CisgIHsKKyAgICAvLyBXaXRoIGEgc2luZ2xlIHJlZmVyZW5jZSwgbm8gY29weSB0YWtlcyBwbGFjZS4KKyAgICBXaWRlU3RyaW5nIGZyZWQoTCIgIEZSRUQgICIpOworICAgIGNvbnN0IHdjaGFyX3QqIG9sZF9idWZmZXIgPSBmcmVkLmNfc3RyKCk7CisgICAgZnJlZC5UcmltTGVmdCgpOworICAgIEVYUEVDVF9FUShMIkZSRUQgICIsIGZyZWQpOworICAgIEVYUEVDVF9FUShvbGRfYnVmZmVyLCBmcmVkLmNfc3RyKCkpOworICB9CisgIHsKKyAgICAvLyBXaXRoIG11bHRpcGxlIHJlZmVyZW5jZXMsIHdlIG11c3QgY29weS4KKyAgICBXaWRlU3RyaW5nIGZyZWQoTCIgIEZSRUQgICIpOworICAgIFdpZGVTdHJpbmcgb3RoZXJfZnJlZCA9IGZyZWQ7CisgICAgY29uc3Qgd2NoYXJfdCogb2xkX2J1ZmZlciA9IGZyZWQuY19zdHIoKTsKKyAgICBmcmVkLlRyaW1MZWZ0KCk7CisgICAgRVhQRUNUX0VRKEwiRlJFRCAgIiwgZnJlZCk7CisgICAgRVhQRUNUX0VRKEwiICBGUkVEICAiLCBvdGhlcl9mcmVkKTsKKyAgICBFWFBFQ1RfTkUob2xkX2J1ZmZlciwgZnJlZC5jX3N0cigpKTsKKyAgfQorICB7CisgICAgLy8gV2l0aCBtdWx0aXBsZSByZWZlcmVuY2VzLCBidXQgbm8gbW9kaWZpY2F0aW9ucywgbm8gY29weS4KKyAgICBXaWRlU3RyaW5nIGZyZWQoTCJGUkVEIik7CisgICAgV2lkZVN0cmluZyBvdGhlcl9mcmVkID0gZnJlZDsKKyAgICBjb25zdCB3Y2hhcl90KiBvbGRfYnVmZmVyID0gZnJlZC5jX3N0cigpOworICAgIGZyZWQuVHJpbUxlZnQoKTsKKyAgICBFWFBFQ1RfRVEoTCJGUkVEIiwgZnJlZCk7CisgICAgRVhQRUNUX0VRKEwiRlJFRCIsIG90aGVyX2ZyZWQpOworICAgIEVYUEVDVF9FUShvbGRfYnVmZmVyLCBmcmVkLmNfc3RyKCkpOworICB9Cit9CisKK1RFU1QoV2lkZVN0cmluZywgVHJpbVJpZ2h0KSB7CisgIFdpZGVTdHJpbmcgZnJlZChMIiAgRlJFRCAgIik7CisgIGZyZWQuVHJpbVJpZ2h0KCk7CisgIEVYUEVDVF9FUShMIiAgRlJFRCIsIGZyZWQpOworICBmcmVkLlRyaW1SaWdodChMJ0UnKTsKKyAgRVhQRUNUX0VRKEwiICBGUkVEIiwgZnJlZCk7CisgIGZyZWQuVHJpbVJpZ2h0KEwnRCcpOworICBFWFBFQ1RfRVEoTCIgIEZSRSIsIGZyZWQpOworICBmcmVkLlRyaW1SaWdodChMIkVSUCIpOworICBFWFBFQ1RfRVEoTCIgIEYiLCBmcmVkKTsKKworICBXaWRlU3RyaW5nIGJsYW5rKEwiICAgIik7CisgIGJsYW5rLlRyaW1SaWdodChMIkVSUCIpOworICBFWFBFQ1RfRVEoTCIgICAiLCBibGFuayk7CisgIGJsYW5rLlRyaW1SaWdodChMJ0UnKTsKKyAgRVhQRUNUX0VRKEwiICAgIiwgYmxhbmspOworICBibGFuay5UcmltUmlnaHQoKTsKKyAgRVhQRUNUX0VRKEwiIiwgYmxhbmspOworCisgIFdpZGVTdHJpbmcgZW1wdHk7CisgIGVtcHR5LlRyaW1SaWdodChMIkVSUCIpOworICBFWFBFQ1RfRVEoTCIiLCBlbXB0eSk7CisgIGVtcHR5LlRyaW1SaWdodChMJ0UnKTsKKyAgRVhQRUNUX0VRKEwiIiwgZW1wdHkpOworICBlbXB0eS5UcmltUmlnaHQoKTsKKyAgRVhQRUNUX0VRKEwiIiwgZW1wdHkpOworfQorCitURVNUKFdpZGVTdHJpbmcsIFRyaW1SaWdodENvcGllcykgeworICB7CisgICAgLy8gV2l0aCBhIHNpbmdsZSByZWZlcmVuY2UsIG5vIGNvcHkgdGFrZXMgcGxhY2UuCisgICAgV2lkZVN0cmluZyBmcmVkKEwiICBGUkVEICAiKTsKKyAgICBjb25zdCB3Y2hhcl90KiBvbGRfYnVmZmVyID0gZnJlZC5jX3N0cigpOworICAgIGZyZWQuVHJpbVJpZ2h0KCk7CisgICAgRVhQRUNUX0VRKEwiICBGUkVEIiwgZnJlZCk7CisgICAgRVhQRUNUX0VRKG9sZF9idWZmZXIsIGZyZWQuY19zdHIoKSk7CisgIH0KKyAgeworICAgIC8vIFdpdGggbXVsdGlwbGUgcmVmZXJlbmNlcywgd2UgbXVzdCBjb3B5LgorICAgIFdpZGVTdHJpbmcgZnJlZChMIiAgRlJFRCAgIik7CisgICAgV2lkZVN0cmluZyBvdGhlcl9mcmVkID0gZnJlZDsKKyAgICBjb25zdCB3Y2hhcl90KiBvbGRfYnVmZmVyID0gZnJlZC5jX3N0cigpOworICAgIGZyZWQuVHJpbVJpZ2h0KCk7CisgICAgRVhQRUNUX0VRKEwiICBGUkVEIiwgZnJlZCk7CisgICAgRVhQRUNUX0VRKEwiICBGUkVEICAiLCBvdGhlcl9mcmVkKTsKKyAgICBFWFBFQ1RfTkUob2xkX2J1ZmZlciwgZnJlZC5jX3N0cigpKTsKKyAgfQorICB7CisgICAgLy8gV2l0aCBtdWx0aXBsZSByZWZlcmVuY2VzLCBidXQgbm8gbW9kaWZpY2F0aW9ucywgbm8gY29weS4KKyAgICBXaWRlU3RyaW5nIGZyZWQoTCJGUkVEIik7CisgICAgV2lkZVN0cmluZyBvdGhlcl9mcmVkID0gZnJlZDsKKyAgICBjb25zdCB3Y2hhcl90KiBvbGRfYnVmZmVyID0gZnJlZC5jX3N0cigpOworICAgIGZyZWQuVHJpbVJpZ2h0KCk7CisgICAgRVhQRUNUX0VRKEwiRlJFRCIsIGZyZWQpOworICAgIEVYUEVDVF9FUShMIkZSRUQiLCBvdGhlcl9mcmVkKTsKKyAgICBFWFBFQ1RfRVEob2xkX2J1ZmZlciwgZnJlZC5jX3N0cigpKTsKKyAgfQorfQorCitURVNUKFdpZGVTdHJpbmcsIFJlc2VydmUpIHsKKyAgeworICAgIFdpZGVTdHJpbmcgc3RyOworICAgIHN0ci5SZXNlcnZlKDYpOworICAgIGNvbnN0IHdjaGFyX3QqIG9sZF9idWZmZXIgPSBzdHIuY19zdHIoKTsKKyAgICBzdHIgKz0gTCJBQkNERUYiOworICAgIEVYUEVDVF9FUShvbGRfYnVmZmVyLCBzdHIuY19zdHIoKSk7CisgICAgc3RyICs9IEwiQmxhaCBCbGFoIEJsYWggQmxhaCBCbGFoIEJsYWgiOworICAgIEVYUEVDVF9ORShvbGRfYnVmZmVyLCBzdHIuY19zdHIoKSk7CisgIH0KKyAgeworICAgIFdpZGVTdHJpbmcgc3RyKEwiQSIpOworICAgIHN0ci5SZXNlcnZlKDYpOworICAgIGNvbnN0IHdjaGFyX3QqIG9sZF9idWZmZXIgPSBzdHIuY19zdHIoKTsKKyAgICBzdHIgKz0gTCJCQ0RFRiI7CisgICAgRVhQRUNUX0VRKG9sZF9idWZmZXIsIHN0ci5jX3N0cigpKTsKKyAgICBzdHIgKz0gTCJCbGFoIEJsYWggQmxhaCBCbGFoIEJsYWggQmxhaCI7CisgICAgRVhQRUNUX05FKG9sZF9idWZmZXIsIHN0ci5jX3N0cigpKTsKKyAgfQorfQorCitURVNUKFdpZGVTdHJpbmcsIEdldEJ1ZmZlcikgeworICB7CisgICAgV2lkZVN0cmluZyBzdHI7CisgICAgd2NoYXJfdCogYnVmZmVyID0gc3RyLkdldEJ1ZmZlcigxMik7CisgICAgd2NzY3B5KGJ1ZmZlciwgTCJjbGFtcyIpOworICAgIHN0ci5SZWxlYXNlQnVmZmVyKHN0ci5HZXRTdHJpbmdMZW5ndGgoKSk7CisgICAgRVhQRUNUX0VRKEwiY2xhbXMiLCBzdHIpOworICB9CisgIHsKKyAgICBXaWRlU3RyaW5nIHN0cihMImNsIik7CisgICAgd2NoYXJfdCogYnVmZmVyID0gc3RyLkdldEJ1ZmZlcigxMik7CisgICAgd2NzY3B5KGJ1ZmZlciArIDIsIEwiYW1zIik7CisgICAgc3RyLlJlbGVhc2VCdWZmZXIoc3RyLkdldFN0cmluZ0xlbmd0aCgpKTsKKyAgICBFWFBFQ1RfRVEoTCJjbGFtcyIsIHN0cik7CisgIH0KK30KKworVEVTVChXaWRlU3RyaW5nLCBSZWxlYXNlQnVmZmVyKSB7CisgIHsKKyAgICBXaWRlU3RyaW5nIHN0cjsKKyAgICBzdHIuUmVzZXJ2ZSgxMik7CisgICAgc3RyICs9IEwiY2xhbXMiOworICAgIGNvbnN0IHdjaGFyX3QqIG9sZF9idWZmZXIgPSBzdHIuY19zdHIoKTsKKyAgICBzdHIuUmVsZWFzZUJ1ZmZlcig0KTsKKyAgICBFWFBFQ1RfRVEob2xkX2J1ZmZlciwgc3RyLmNfc3RyKCkpOworICAgIEVYUEVDVF9FUShMImNsYW0iLCBzdHIpOworICB9CisgIHsKKyAgICBXaWRlU3RyaW5nIHN0cihMImMiKTsKKyAgICBzdHIuUmVzZXJ2ZSgxMik7CisgICAgc3RyICs9IEwibGFtcyI7CisgICAgY29uc3Qgd2NoYXJfdCogb2xkX2J1ZmZlciA9IHN0ci5jX3N0cigpOworICAgIHN0ci5SZWxlYXNlQnVmZmVyKDQpOworICAgIEVYUEVDVF9FUShvbGRfYnVmZmVyLCBzdHIuY19zdHIoKSk7CisgICAgRVhQRUNUX0VRKEwiY2xhbSIsIHN0cik7CisgIH0KKyAgeworICAgIFdpZGVTdHJpbmcgc3RyOworICAgIHN0ci5SZXNlcnZlKDIwMCk7CisgICAgc3RyICs9IEwiY2xhbXMiOworICAgIGNvbnN0IHdjaGFyX3QqIG9sZF9idWZmZXIgPSBzdHIuY19zdHIoKTsKKyAgICBzdHIuUmVsZWFzZUJ1ZmZlcig0KTsKKyAgICBFWFBFQ1RfTkUob2xkX2J1ZmZlciwgc3RyLmNfc3RyKCkpOworICAgIEVYUEVDVF9FUShMImNsYW0iLCBzdHIpOworICB9CisgIHsKKyAgICBXaWRlU3RyaW5nIHN0cihMImMiKTsKKyAgICBzdHIuUmVzZXJ2ZSgyMDApOworICAgIHN0ciArPSBMImxhbXMiOworICAgIGNvbnN0IHdjaGFyX3QqIG9sZF9idWZmZXIgPSBzdHIuY19zdHIoKTsKKyAgICBzdHIuUmVsZWFzZUJ1ZmZlcig0KTsKKyAgICBFWFBFQ1RfTkUob2xkX2J1ZmZlciwgc3RyLmNfc3RyKCkpOworICAgIEVYUEVDVF9FUShMImNsYW0iLCBzdHIpOworICB9Cit9CisKK1RFU1QoV2lkZVN0cmluZywgRW1wdHlSZXZlcnNlSXRlcmF0b3IpIHsKKyAgV2lkZVN0cmluZyBlbXB0eTsKKyAgYXV0byBpdGVyID0gZW1wdHkucmJlZ2luKCk7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPT0gZW1wdHkucmVuZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKGl0ZXIgIT0gZW1wdHkucmVuZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKGl0ZXIgPCBlbXB0eS5yZW5kKCkpOworfQorCitURVNUKFdpZGVTdHJpbmcsIE9uZUNoYXJSZXZlcnNlSXRlcmF0b3IpIHsKKyAgV2lkZVN0cmluZyBvbmVfc3RyKEwiYSIpOworICBhdXRvIGl0ZXIgPSBvbmVfc3RyLnJiZWdpbigpOworICBFWFBFQ1RfRkFMU0UoaXRlciA9PSBvbmVfc3RyLnJlbmQoKSk7CisgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gb25lX3N0ci5yZW5kKCkpOworICBFWFBFQ1RfVFJVRShpdGVyIDwgb25lX3N0ci5yZW5kKCkpOworCisgIGNoYXIgY2ggPSAqaXRlcisrOworICBFWFBFQ1RfRVEoJ2EnLCBjaCk7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPT0gb25lX3N0ci5yZW5kKCkpOworICBFWFBFQ1RfRkFMU0UoaXRlciAhPSBvbmVfc3RyLnJlbmQoKSk7CisgIEVYUEVDVF9GQUxTRShpdGVyIDwgb25lX3N0ci5yZW5kKCkpOworfQorCitURVNUKFdpZGVTdHJpbmcsIE11bHRpQ2hhclJldmVyc2VJdGVyYXRvcikgeworICBXaWRlU3RyaW5nIG11bHRpX3N0cihMImFiY2QiKTsKKyAgYXV0byBpdGVyID0gbXVsdGlfc3RyLnJiZWdpbigpOworICBFWFBFQ1RfRkFMU0UoaXRlciA9PSBtdWx0aV9zdHIucmVuZCgpKTsKKworICBjaGFyIGNoID0gKml0ZXIrKzsKKyAgRVhQRUNUX0VRKCdkJywgY2gpOworICBFWFBFQ1RfRVEoJ2MnLCAqaXRlcik7CisgIEVYUEVDVF9GQUxTRShpdGVyID09IG11bHRpX3N0ci5yZW5kKCkpOworCisgIGNoID0gKigrK2l0ZXIpOworICBFWFBFQ1RfRVEoJ2InLCBjaCk7CisgIEVYUEVDVF9FUSgnYicsICppdGVyKTsKKyAgRVhQRUNUX0ZBTFNFKGl0ZXIgPT0gbXVsdGlfc3RyLnJlbmQoKSk7CisKKyAgY2ggPSAqaXRlcisrOworICBFWFBFQ1RfRVEoJ2InLCBjaCk7CisgIEVYUEVDVF9FUSgnYScsICppdGVyKTsKKyAgRVhQRUNUX0ZBTFNFKGl0ZXIgPT0gbXVsdGlfc3RyLnJlbmQoKSk7CisKKyAgY2ggPSAqaXRlcisrOworICBFWFBFQ1RfRVEoJ2EnLCBjaCk7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPT0gbXVsdGlfc3RyLnJlbmQoKSk7CisKKyAgY2ggPSAqKC0taXRlcik7CisgIEVYUEVDVF9FUSgnYScsIGNoKTsKKyAgRVhQRUNUX0VRKCdhJywgKml0ZXIpOworICBFWFBFQ1RfRkFMU0UoaXRlciA9PSBtdWx0aV9zdHIucmVuZCgpKTsKKworICBjaCA9ICppdGVyLS07CisgIEVYUEVDVF9FUSgnYScsIGNoKTsKKyAgRVhQRUNUX0VRKCdiJywgKml0ZXIpOworICBFWFBFQ1RfRkFMU0UoaXRlciA9PSBtdWx0aV9zdHIucmVuZCgpKTsKKworICBjaCA9ICppdGVyLS07CisgIEVYUEVDVF9FUSgnYicsIGNoKTsKKyAgRVhQRUNUX0VRKCdjJywgKml0ZXIpOworICBFWFBFQ1RfRkFMU0UoaXRlciA9PSBtdWx0aV9zdHIucmVuZCgpKTsKKworICBjaCA9ICooLS1pdGVyKTsKKyAgRVhQRUNUX0VRKCdkJywgY2gpOworICBFWFBFQ1RfRVEoJ2QnLCAqaXRlcik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPT0gbXVsdGlfc3RyLnJiZWdpbigpKTsKK30KKworVEVTVChXaWRlU3RyaW5nLCBVVEYxNkxFX0VuY29kZSkgeworICBzdHJ1Y3QgVVRGMTZMRUVuY29kZUNhc2UgeworICAgIFdpZGVTdHJpbmcgd3M7CisgICAgQnl0ZVN0cmluZyBiczsKKyAgfSBjb25zdCB1dGYxNmxlX2VuY29kZV9jYXNlc1tdID0geworICAgICAge0wiIiwgQnl0ZVN0cmluZygiXDBcMCIsIDIpfSwKKyAgICAgIHtMImFiYyIsIEJ5dGVTdHJpbmcoImFcMGJcMGNcMFwwXDAiLCA4KX0sCisgICAgICB7TCJhYmNkZWYiLCBCeXRlU3RyaW5nKCJhXDBiXDBjXDBkXDBlXDBmXDBcMFwwIiwgMTQpfSwKKyAgICAgIHtMImFiY1wwZGVmIiwgQnl0ZVN0cmluZygiYVwwYlwwY1wwXDBcMCIsIDgpfSwKKyAgICAgIHtMIlx4YWFiYlx4Y2NkZCIsIEJ5dGVTdHJpbmcoIlx4YmJceGFhXHhkZFx4Y2NcMFwwIiwgNil9LAorICAgICAge0wiXHgzMTMyXHg2MTYyIiwgQnl0ZVN0cmluZygiXHgzMlx4MzFceDYyXHg2MVwwXDAiLCA2KX0sCisgIH07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodXRmMTZsZV9lbmNvZGVfY2FzZXMpOyArK2kpIHsKKyAgICBFWFBFQ1RfRVEodXRmMTZsZV9lbmNvZGVfY2FzZXNbaV0uYnMsCisgICAgICAgICAgICAgIHV0ZjE2bGVfZW5jb2RlX2Nhc2VzW2ldLndzLlVURjE2TEVfRW5jb2RlKCkpCisgICAgICAgIDw8ICIgZm9yIGNhc2UgbnVtYmVyICIgPDwgaTsKKyAgfQorfQorCitURVNUKFdpZGVTdHJpbmdWaWV3LCBGcm9tVmVjdG9yKSB7CisgIHN0ZDo6dmVjdG9yPFdpZGVTdHJpbmdWaWV3OjpVbnNpZ25lZFR5cGU+IG51bGxfdmVjOworICBXaWRlU3RyaW5nVmlldyBudWxsX3N0cmluZyhudWxsX3ZlYyk7CisgIEVYUEVDVF9FUSgwdSwgbnVsbF9zdHJpbmcuR2V0TGVuZ3RoKCkpOworCisgIHN0ZDo6dmVjdG9yPFdpZGVTdHJpbmdWaWV3OjpVbnNpZ25lZFR5cGU+IGxvd2VyX2FfdmVjKAorICAgICAgMTAsIHN0YXRpY19jYXN0PFdpZGVTdHJpbmdWaWV3OjpVbnNpZ25lZFR5cGU+KEwnYScpKTsKKyAgV2lkZVN0cmluZ1ZpZXcgbG93ZXJfYV9zdHJpbmcobG93ZXJfYV92ZWMpOworICBFWFBFQ1RfRVEoMTB1LCBsb3dlcl9hX3N0cmluZy5HZXRMZW5ndGgoKSk7CisgIEVYUEVDVF9FUShMImFhYWFhYWFhYWEiLCBsb3dlcl9hX3N0cmluZyk7CisKKyAgc3RkOjp2ZWN0b3I8V2lkZVN0cmluZ1ZpZXc6OlVuc2lnbmVkVHlwZT4gY2xlYXJlZF92ZWM7CisgIGNsZWFyZWRfdmVjLnB1c2hfYmFjayg0Mik7CisgIGNsZWFyZWRfdmVjLnBvcF9iYWNrKCk7CisgIFdpZGVTdHJpbmdWaWV3IGNsZWFyZWRfc3RyaW5nKGNsZWFyZWRfdmVjKTsKKyAgRVhQRUNUX0VRKDB1LCBjbGVhcmVkX3N0cmluZy5HZXRMZW5ndGgoKSk7CisgIEVYUEVDVF9FUShudWxscHRyLCBjbGVhcmVkX3N0cmluZy5yYXdfc3RyKCkpOworfQorCitURVNUKFdpZGVTdHJpbmdWaWV3LCBFbGVtZW50QWNjZXNzKSB7CisgIFdpZGVTdHJpbmdWaWV3IGFiYyhMImFiYyIpOworICBFWFBFQ1RfRVEoTCdhJywgc3RhdGljX2Nhc3Q8d2NoYXJfdD4oYWJjWzBdKSk7CisgIEVYUEVDVF9FUShMJ2InLCBzdGF0aWNfY2FzdDx3Y2hhcl90PihhYmNbMV0pKTsKKyAgRVhQRUNUX0VRKEwnYycsIHN0YXRpY19jYXN0PHdjaGFyX3Q+KGFiY1syXSkpOworI2lmbmRlZiBOREVCVUcKKyAgRVhQRUNUX0RFQVRIKHsgYWJjWzRdOyB9LCAiLioiKTsKKyNlbmRpZgorfQorCitURVNUKFdpZGVTdHJpbmdWaWV3LCBPcGVyYXRvckxUKSB7CisgIFdpZGVTdHJpbmdWaWV3IGVtcHR5OworICBXaWRlU3RyaW5nVmlldyBhKEwiYSIpOworICBXaWRlU3RyaW5nVmlldyBhYmMoTCJceDAxMTBxcSIpOyAgLy8gQ29tZXMgSW5zZXJ0QXRGcm9udCBkZXNwaXRlIGVuZGlhbm5lc3MuCisgIFdpZGVTdHJpbmdWaWV3IGRlZihMIlx4MTAwMXFxIik7ICAvLyBDb21lcyBJbnNlcnRBdEJhY2sgZGVzcGl0ZSBlbmRpYW5uZXNzLgorICBjb25zdCB3Y2hhcl90KiBjb25zdCBjX251bGwgPSBudWxscHRyOworICBjb25zdCB3Y2hhcl90KiBjb25zdCBjX2VtcHR5ID0gTCIiOworICBjb25zdCB3Y2hhcl90KiBjb25zdCBjX2EgPSBMImEiOworICBjb25zdCB3Y2hhcl90KiBjb25zdCBjX2FiYyA9IEwiXHgwMTEwcXEiOworICBjb25zdCB3Y2hhcl90KiBjb25zdCBjX2RlZiA9IEwiXHgxMDAxcXEiOworCisgIEVYUEVDVF9GQUxTRShlbXB0eSA8IGVtcHR5KTsKKyAgRVhQRUNUX0ZBTFNFKGEgPCBhKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IGFiYyk7CisgIEVYUEVDVF9GQUxTRShkZWYgPCBkZWYpOworICBFWFBFQ1RfRkFMU0UoY19udWxsIDwgZW1wdHkpOworICBFWFBFQ1RfRkFMU0UoY19lbXB0eSA8IGVtcHR5KTsKKyAgRVhQRUNUX0ZBTFNFKGNfYSA8IGEpOworICBFWFBFQ1RfRkFMU0UoY19hYmMgPCBhYmMpOworICBFWFBFQ1RfRkFMU0UoY19kZWYgPCBkZWYpOworICBFWFBFQ1RfRkFMU0UoZW1wdHkgPCBjX251bGwpOworICBFWFBFQ1RfRkFMU0UoZW1wdHkgPCBjX2VtcHR5KTsKKyAgRVhQRUNUX0ZBTFNFKGEgPCBjX2EpOworICBFWFBFQ1RfRkFMU0UoYWJjIDwgY19hYmMpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgY19kZWYpOworCisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgYSk7CisgIEVYUEVDVF9GQUxTRShhIDwgZW1wdHkpOworICBFWFBFQ1RfVFJVRShlbXB0eSA8IGNfYSk7CisgIEVYUEVDVF9GQUxTRShhIDwgY19udWxsKTsKKyAgRVhQRUNUX0ZBTFNFKGEgPCBjX2VtcHR5KTsKKworICBFWFBFQ1RfVFJVRShlbXB0eSA8IGFiYyk7CisgIEVYUEVDVF9GQUxTRShhYmMgPCBlbXB0eSk7CisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgY19hYmMpOworICBFWFBFQ1RfRkFMU0UoYWJjIDwgY19udWxsKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IGNfZW1wdHkpOworCisgIEVYUEVDVF9UUlVFKGVtcHR5IDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGVtcHR5KTsKKyAgRVhQRUNUX1RSVUUoZW1wdHkgPCBjX2RlZik7CisgIEVYUEVDVF9GQUxTRShkZWYgPCBjX251bGwpOworICBFWFBFQ1RfRkFMU0UoZGVmIDwgY19lbXB0eSk7CisKKyAgRVhQRUNUX1RSVUUoYSA8IGFiYyk7CisgIEVYUEVDVF9GQUxTRShhYmMgPCBhKTsKKyAgRVhQRUNUX1RSVUUoYSA8IGNfYWJjKTsKKyAgRVhQRUNUX0ZBTFNFKGFiYyA8IGNfYSk7CisKKyAgRVhQRUNUX1RSVUUoYSA8IGRlZik7CisgIEVYUEVDVF9GQUxTRShkZWYgPCBhKTsKKyAgRVhQRUNUX1RSVUUoYSA8IGNfZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGNfYSk7CisKKyAgRVhQRUNUX1RSVUUoYWJjIDwgZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGFiYyk7CisgIEVYUEVDVF9UUlVFKGFiYyA8IGNfZGVmKTsKKyAgRVhQRUNUX0ZBTFNFKGRlZiA8IGNfYWJjKTsKK30KKworVEVTVChXaWRlU3RyaW5nVmlldywgT3BlcmF0b3JFUSkgeworICBXaWRlU3RyaW5nVmlldyB3aWRlX3N0cmluZ19jKEwiaGVsbG8iKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyA9PSB3aWRlX3N0cmluZ19jKTsKKworICBXaWRlU3RyaW5nVmlldyB3aWRlX3N0cmluZ19jX3NhbWUxKEwiaGVsbG8iKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyA9PSB3aWRlX3N0cmluZ19jX3NhbWUxKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfY19zYW1lMSA9PSB3aWRlX3N0cmluZ19jKTsKKworICBXaWRlU3RyaW5nVmlldyB3aWRlX3N0cmluZ19jX3NhbWUyKHdpZGVfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jID09IHdpZGVfc3RyaW5nX2Nfc2FtZTIpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jX3NhbWUyID09IHdpZGVfc3RyaW5nX2MpOworCisgIFdpZGVTdHJpbmdWaWV3IHdpZGVfc3RyaW5nX2MxKEwiaGUiKTsKKyAgV2lkZVN0cmluZ1ZpZXcgd2lkZV9zdHJpbmdfYzIoTCJoZWxscCIpOworICBXaWRlU3RyaW5nVmlldyB3aWRlX3N0cmluZ19jMyhMImhlbGxvZCIpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyA9PSB3aWRlX3N0cmluZ19jMSk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IHdpZGVfc3RyaW5nX2MyKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgPT0gd2lkZV9zdHJpbmdfYzMpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYzEgPT0gd2lkZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jMiA9PSB3aWRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MzID09IHdpZGVfc3RyaW5nX2MpOworCisgIFdpZGVTdHJpbmcgd2lkZV9zdHJpbmdfc2FtZTEoTCJoZWxsbyIpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jID09IHdpZGVfc3RyaW5nX3NhbWUxKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfc2FtZTEgPT0gd2lkZV9zdHJpbmdfYyk7CisKKyAgV2lkZVN0cmluZyB3aWRlX3N0cmluZzEoTCJoZSIpOworICBXaWRlU3RyaW5nIHdpZGVfc3RyaW5nMihMImhlbGxwIik7CisgIFdpZGVTdHJpbmcgd2lkZV9zdHJpbmczKEwiaGVsbG9kIik7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IHdpZGVfc3RyaW5nMSk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IHdpZGVfc3RyaW5nMik7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jID09IHdpZGVfc3RyaW5nMyk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZzEgPT0gd2lkZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZzIgPT0gd2lkZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZzMgPT0gd2lkZV9zdHJpbmdfYyk7CisKKyAgY29uc3Qgd2NoYXJfdCogY29uc3QgY19zdHJpbmdfc2FtZTEgPSBMImhlbGxvIjsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyA9PSBjX3N0cmluZ19zYW1lMSk7CisgIEVYUEVDVF9UUlVFKGNfc3RyaW5nX3NhbWUxID09IHdpZGVfc3RyaW5nX2MpOworCisgIGNvbnN0IHdjaGFyX3QqIGNvbnN0IGNfc3RyaW5nMSA9IEwiaGUiOworICBjb25zdCB3Y2hhcl90KiBjb25zdCBjX3N0cmluZzIgPSBMImhlbGxwIjsKKyAgY29uc3Qgd2NoYXJfdCogY29uc3QgY19zdHJpbmczID0gTCJoZWxsb2QiOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyA9PSBjX3N0cmluZzEpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyA9PSBjX3N0cmluZzIpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyA9PSBjX3N0cmluZzMpOworCisgIEVYUEVDVF9GQUxTRShjX3N0cmluZzEgPT0gd2lkZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShjX3N0cmluZzIgPT0gd2lkZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9GQUxTRShjX3N0cmluZzMgPT0gd2lkZV9zdHJpbmdfYyk7Cit9CisKK1RFU1QoV2lkZVN0cmluZ1ZpZXcsIE9wZXJhdG9yTkUpIHsKKyAgV2lkZVN0cmluZ1ZpZXcgd2lkZV9zdHJpbmdfYyhMImhlbGxvIik7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nX2MpOworCisgIFdpZGVTdHJpbmdWaWV3IHdpZGVfc3RyaW5nX2Nfc2FtZTEoTCJoZWxsbyIpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyAhPSB3aWRlX3N0cmluZ19jX3NhbWUxKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2Nfc2FtZTEgIT0gd2lkZV9zdHJpbmdfYyk7CisKKyAgV2lkZVN0cmluZ1ZpZXcgd2lkZV9zdHJpbmdfY19zYW1lMih3aWRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX0ZBTFNFKHdpZGVfc3RyaW5nX2MgIT0gd2lkZV9zdHJpbmdfY19zYW1lMik7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19jX3NhbWUyICE9IHdpZGVfc3RyaW5nX2MpOworCisgIFdpZGVTdHJpbmdWaWV3IHdpZGVfc3RyaW5nX2MxKEwiaGUiKTsKKyAgV2lkZVN0cmluZ1ZpZXcgd2lkZV9zdHJpbmdfYzIoTCJoZWxscCIpOworICBXaWRlU3RyaW5nVmlldyB3aWRlX3N0cmluZ19jMyhMImhlbGxvZCIpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nX2MxKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyAhPSB3aWRlX3N0cmluZ19jMik7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgIT0gd2lkZV9zdHJpbmdfYzMpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jMSAhPSB3aWRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYzIgIT0gd2lkZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MzICE9IHdpZGVfc3RyaW5nX2MpOworCisgIFdpZGVTdHJpbmcgd2lkZV9zdHJpbmdfc2FtZTEoTCJoZWxsbyIpOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyAhPSB3aWRlX3N0cmluZ19zYW1lMSk7CisgIEVYUEVDVF9GQUxTRSh3aWRlX3N0cmluZ19zYW1lMSAhPSB3aWRlX3N0cmluZ19jKTsKKworICBXaWRlU3RyaW5nIHdpZGVfc3RyaW5nMShMImhlIik7CisgIFdpZGVTdHJpbmcgd2lkZV9zdHJpbmcyKEwiaGVsbHAiKTsKKyAgV2lkZVN0cmluZyB3aWRlX3N0cmluZzMoTCJoZWxsb2QiKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyAhPSB3aWRlX3N0cmluZzEpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jICE9IHdpZGVfc3RyaW5nMik7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgIT0gd2lkZV9zdHJpbmczKTsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmcxICE9IHdpZGVfc3RyaW5nX2MpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZzIgIT0gd2lkZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nMyAhPSB3aWRlX3N0cmluZ19jKTsKKworICBjb25zdCB3Y2hhcl90KiBjb25zdCBjX3N0cmluZ19zYW1lMSA9IEwiaGVsbG8iOworICBFWFBFQ1RfRkFMU0Uod2lkZV9zdHJpbmdfYyAhPSBjX3N0cmluZ19zYW1lMSk7CisgIEVYUEVDVF9GQUxTRShjX3N0cmluZ19zYW1lMSAhPSB3aWRlX3N0cmluZ19jKTsKKworICBjb25zdCB3Y2hhcl90KiBjb25zdCBjX3N0cmluZzEgPSBMImhlIjsKKyAgY29uc3Qgd2NoYXJfdCogY29uc3QgY19zdHJpbmcyID0gTCJoZWxscCI7CisgIGNvbnN0IHdjaGFyX3QqIGNvbnN0IGNfc3RyaW5nMyA9IEwiaGVsbG9kIjsKKyAgRVhQRUNUX1RSVUUod2lkZV9zdHJpbmdfYyAhPSBjX3N0cmluZzEpOworICBFWFBFQ1RfVFJVRSh3aWRlX3N0cmluZ19jICE9IGNfc3RyaW5nMik7CisgIEVYUEVDVF9UUlVFKHdpZGVfc3RyaW5nX2MgIT0gY19zdHJpbmczKTsKKworICBFWFBFQ1RfVFJVRShjX3N0cmluZzEgIT0gd2lkZV9zdHJpbmdfYyk7CisgIEVYUEVDVF9UUlVFKGNfc3RyaW5nMiAhPSB3aWRlX3N0cmluZ19jKTsKKyAgRVhQRUNUX1RSVUUoY19zdHJpbmczICE9IHdpZGVfc3RyaW5nX2MpOworfQorCitURVNUKFdpZGVTdHJpbmdWaWV3LCBGaW5kKSB7CisgIFdpZGVTdHJpbmdWaWV3IG51bGxfc3RyaW5nOworICBFWFBFQ1RfRkFMU0UobnVsbF9zdHJpbmcuRmluZChMJ2EnKS5oYXNfdmFsdWUoKSk7CisgIEVYUEVDVF9GQUxTRShudWxsX3N0cmluZy5GaW5kKEwnXDAnKS5oYXNfdmFsdWUoKSk7CisKKyAgV2lkZVN0cmluZ1ZpZXcgZW1wdHlfc3RyaW5nKEwiIik7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcuRmluZChMJ2EnKS5oYXNfdmFsdWUoKSk7CisgIEVYUEVDVF9GQUxTRShlbXB0eV9zdHJpbmcuRmluZChMJ1wwJykuaGFzX3ZhbHVlKCkpOworCisgIE9wdGlvbmFsPHNpemVfdD4gcmVzdWx0OworICBXaWRlU3RyaW5nVmlldyBzaW5nbGVfc3RyaW5nKEwiYSIpOworICByZXN1bHQgPSBzaW5nbGVfc3RyaW5nLkZpbmQoTCdhJyk7CisgIEFTU0VSVF9UUlVFKHJlc3VsdC5oYXNfdmFsdWUoKSk7CisgIEVYUEVDVF9FUSgwdSwgcmVzdWx0LnZhbHVlKCkpOworICBFWFBFQ1RfRkFMU0Uoc2luZ2xlX3N0cmluZy5GaW5kKEwnYicpLmhhc192YWx1ZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKHNpbmdsZV9zdHJpbmcuRmluZChMJ1wwJykuaGFzX3ZhbHVlKCkpOworCisgIFdpZGVTdHJpbmdWaWV3IGxvbmdlcl9zdHJpbmcoTCJhYmNjYyIpOworICByZXN1bHQgPSBsb25nZXJfc3RyaW5nLkZpbmQoTCdhJyk7CisgIEFTU0VSVF9UUlVFKHJlc3VsdC5oYXNfdmFsdWUoKSk7CisgIEVYUEVDVF9FUSgwdSwgcmVzdWx0LnZhbHVlKCkpOworICByZXN1bHQgPSBsb25nZXJfc3RyaW5nLkZpbmQoTCdjJyk7CisgIEFTU0VSVF9UUlVFKHJlc3VsdC5oYXNfdmFsdWUoKSk7CisgIEVYUEVDVF9FUSgydSwgcmVzdWx0LnZhbHVlKCkpOworICBFWFBFQ1RfRkFMU0UobG9uZ2VyX3N0cmluZy5GaW5kKEwnZCcpLmhhc192YWx1ZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKGxvbmdlcl9zdHJpbmcuRmluZChMJ1wwJykuaGFzX3ZhbHVlKCkpOworCisgIFdpZGVTdHJpbmdWaWV3IGhpYnl0ZV9zdHJpbmcoCisgICAgICBMImFiXHhGRjhjIgorICAgICAgTCJkZWYiKTsKKyAgcmVzdWx0ID0gaGlieXRlX3N0cmluZy5GaW5kKEwnXHhGRjhjJyk7CisgIEFTU0VSVF9UUlVFKHJlc3VsdC5oYXNfdmFsdWUoKSk7CisgIEVYUEVDVF9FUSgydSwgcmVzdWx0LnZhbHVlKCkpOworfQorCitURVNUKFdpZGVTdHJpbmdWaWV3LCBOdWxsSXRlcmF0b3IpIHsKKyAgV2lkZVN0cmluZ1ZpZXcgbnVsbF9zdHI7CisgIGludDMyX3Qgc3VtID0gMDsKKyAgYm9vbCBhbnlfcHJlc2VudCA9IGZhbHNlOworICBmb3IgKGNvbnN0IGF1dG8mIGMgOiBudWxsX3N0cikgeworICAgIHN1bSArPSBjOyAgLy8gQXZvaWQgdW51c2VkIGFyZyB3YXJuaW5ncy4KKyAgICBhbnlfcHJlc2VudCA9IHRydWU7CisgIH0KKyAgRVhQRUNUX0ZBTFNFKGFueV9wcmVzZW50KTsKKyAgRVhQRUNUX0VRKDAsIHN1bSk7Cit9CisKK1RFU1QoV2lkZVN0cmluZ1ZpZXcsIEVtcHR5SXRlcmF0b3IpIHsKKyAgV2lkZVN0cmluZ1ZpZXcgZW1wdHlfc3RyKEwiIik7CisgIGludDMyX3Qgc3VtID0gMDsKKyAgYm9vbCBhbnlfcHJlc2VudCA9IGZhbHNlOworICBmb3IgKGNvbnN0IGF1dG8mIGMgOiBlbXB0eV9zdHIpIHsKKyAgICBhbnlfcHJlc2VudCA9IHRydWU7CisgICAgc3VtICs9IGM7ICAvLyBBdm9pZCB1bnVzZWQgYXJnIHdhcm5pbmdzLgorICB9CisgIEVYUEVDVF9GQUxTRShhbnlfcHJlc2VudCk7CisgIEVYUEVDVF9FUSgwLCBzdW0pOworfQorCitURVNUKFdpZGVTdHJpbmdWaWV3LCBPbmVDaGFySXRlcmF0b3IpIHsKKyAgV2lkZVN0cmluZ1ZpZXcgb25lX3N0cihMImEiKTsKKyAgaW50MzJfdCBzdW0gPSAwOworICBib29sIGFueV9wcmVzZW50ID0gZmFsc2U7CisgIGZvciAoY29uc3QgYXV0byYgYyA6IG9uZV9zdHIpIHsKKyAgICBhbnlfcHJlc2VudCA9IHRydWU7CisgICAgc3VtICs9IGM7ICAvLyBBdm9pZCB1bnVzZWQgYXJnIHdhcm5pbmdzLgorICB9CisgIEVYUEVDVF9UUlVFKGFueV9wcmVzZW50KTsKKyAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PGludDMyX3Q+KEwnYScpLCBzdW0pOworfQorCitURVNUKFdpZGVTdHJpbmdWaWV3LCBNdWx0aUNoYXJJdGVyYXRvcikgeworICBXaWRlU3RyaW5nVmlldyBvbmVfc3RyKEwiYWJjIik7CisgIGludDMyX3Qgc3VtID0gMDsKKyAgYm9vbCBhbnlfcHJlc2VudCA9IGZhbHNlOworICBmb3IgKGNvbnN0IGF1dG8mIGMgOiBvbmVfc3RyKSB7CisgICAgYW55X3ByZXNlbnQgPSB0cnVlOworICAgIHN1bSArPSBjOyAgLy8gQXZvaWQgdW51c2VkIGFyZyB3YXJuaW5ncy4KKyAgfQorICBFWFBFQ1RfVFJVRShhbnlfcHJlc2VudCk7CisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxpbnQzMl90PihMJ2EnICsgTCdiJyArIEwnYycpLCBzdW0pOworfQorCitURVNUKFdpZGVTdHJpbmdWaWV3LCBFbXB0eVJldmVyc2VJdGVyYXRvcikgeworICBXaWRlU3RyaW5nVmlldyBlbXB0eTsKKyAgYXV0byBpdGVyID0gZW1wdHkucmJlZ2luKCk7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPT0gZW1wdHkucmVuZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKGl0ZXIgIT0gZW1wdHkucmVuZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKGl0ZXIgPCBlbXB0eS5yZW5kKCkpOworfQorCitURVNUKFdpZGVTdHJpbmdWaWV3LCBPbmVDaGFyUmV2ZXJzZUl0ZXJhdG9yKSB7CisgIFdpZGVTdHJpbmdWaWV3IG9uZV9zdHIoTCJhIik7CisgIGF1dG8gaXRlciA9IG9uZV9zdHIucmJlZ2luKCk7CisgIEVYUEVDVF9GQUxTRShpdGVyID09IG9uZV9zdHIucmVuZCgpKTsKKyAgRVhQRUNUX1RSVUUoaXRlciAhPSBvbmVfc3RyLnJlbmQoKSk7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPCBvbmVfc3RyLnJlbmQoKSk7CisKKyAgY2hhciBjaCA9ICppdGVyKys7CisgIEVYUEVDVF9FUSgnYScsIGNoKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA9PSBvbmVfc3RyLnJlbmQoKSk7CisgIEVYUEVDVF9GQUxTRShpdGVyICE9IG9uZV9zdHIucmVuZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKGl0ZXIgPCBvbmVfc3RyLnJlbmQoKSk7Cit9CisKK1RFU1QoV2lkZVN0cmluZ1ZpZXcsIE11bHRpQ2hhclJldmVyc2VJdGVyYXRvcikgeworICBXaWRlU3RyaW5nVmlldyBtdWx0aV9zdHIoTCJhYmNkIik7CisgIGF1dG8gaXRlciA9IG11bHRpX3N0ci5yYmVnaW4oKTsKKyAgRVhQRUNUX0ZBTFNFKGl0ZXIgPT0gbXVsdGlfc3RyLnJlbmQoKSk7CisKKyAgY2hhciBjaCA9ICppdGVyKys7CisgIEVYUEVDVF9FUSgnZCcsIGNoKTsKKyAgRVhQRUNUX0VRKCdjJywgKml0ZXIpOworICBFWFBFQ1RfRkFMU0UoaXRlciA9PSBtdWx0aV9zdHIucmVuZCgpKTsKKworICBjaCA9ICooKytpdGVyKTsKKyAgRVhQRUNUX0VRKCdiJywgY2gpOworICBFWFBFQ1RfRVEoJ2InLCAqaXRlcik7CisgIEVYUEVDVF9GQUxTRShpdGVyID09IG11bHRpX3N0ci5yZW5kKCkpOworCisgIGNoID0gKml0ZXIrKzsKKyAgRVhQRUNUX0VRKCdiJywgY2gpOworICBFWFBFQ1RfRVEoJ2EnLCAqaXRlcik7CisgIEVYUEVDVF9GQUxTRShpdGVyID09IG11bHRpX3N0ci5yZW5kKCkpOworCisgIGNoID0gKml0ZXIrKzsKKyAgRVhQRUNUX0VRKCdhJywgY2gpOworICBFWFBFQ1RfVFJVRShpdGVyID09IG11bHRpX3N0ci5yZW5kKCkpOworCisgIGNoID0gKigtLWl0ZXIpOworICBFWFBFQ1RfRVEoJ2EnLCBjaCk7CisgIEVYUEVDVF9FUSgnYScsICppdGVyKTsKKyAgRVhQRUNUX0ZBTFNFKGl0ZXIgPT0gbXVsdGlfc3RyLnJlbmQoKSk7CisKKyAgY2ggPSAqaXRlci0tOworICBFWFBFQ1RfRVEoJ2EnLCBjaCk7CisgIEVYUEVDVF9FUSgnYicsICppdGVyKTsKKyAgRVhQRUNUX0ZBTFNFKGl0ZXIgPT0gbXVsdGlfc3RyLnJlbmQoKSk7CisKKyAgY2ggPSAqaXRlci0tOworICBFWFBFQ1RfRVEoJ2InLCBjaCk7CisgIEVYUEVDVF9FUSgnYycsICppdGVyKTsKKyAgRVhQRUNUX0ZBTFNFKGl0ZXIgPT0gbXVsdGlfc3RyLnJlbmQoKSk7CisKKyAgY2ggPSAqKC0taXRlcik7CisgIEVYUEVDVF9FUSgnZCcsIGNoKTsKKyAgRVhQRUNUX0VRKCdkJywgKml0ZXIpOworICBFWFBFQ1RfVFJVRShpdGVyID09IG11bHRpX3N0ci5yYmVnaW4oKSk7Cit9CisKK1RFU1QoV2lkZVN0cmluZ1ZpZXcsIEFueUFsbE5vbmVPZikgeworICBXaWRlU3RyaW5nVmlldyBzdHIoTCJhYWFhYWFhYWFhYWFhYWFhYWIiKTsKKyAgRVhQRUNUX0ZBTFNFKHN0ZDo6YWxsX29mKHN0ci5iZWdpbigpLCBzdHIuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCB3Y2hhcl90JiBjKSB7IHJldHVybiBjID09IEwnYSc7IH0pKTsKKworICBFWFBFQ1RfRkFMU0Uoc3RkOjpub25lX29mKHN0ci5iZWdpbigpLCBzdHIuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3Qgd2NoYXJfdCYgYykgeyByZXR1cm4gYyA9PSBMJ2EnOyB9KSk7CisKKyAgRVhQRUNUX1RSVUUoc3RkOjphbnlfb2Yoc3RyLmJlZ2luKCksIHN0ci5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3Qgd2NoYXJfdCYgYykgeyByZXR1cm4gYyA9PSBMJ2EnOyB9KSk7CisKKyAgRVhQRUNUX1RSVUUocGRmaXVtOjpDb250YWluc1ZhbHVlKHN0ciwgTCdhJykpOworICBFWFBFQ1RfVFJVRShwZGZpdW06OkNvbnRhaW5zVmFsdWUoc3RyLCBMJ2InKSk7CisgIEVYUEVDVF9GQUxTRShwZGZpdW06OkNvbnRhaW5zVmFsdWUoc3RyLCBMJ3onKSk7Cit9CisKK1RFU1QoV2lkZVN0cmluZ1ZpZXcsIFRyaW1tZWRSaWdodCkgeworICBXaWRlU3RyaW5nVmlldyBmcmVkKEwiRlJFRCIpOworICBFWFBFQ1RfRVEoTCJGUkVEIiwgZnJlZC5UcmltbWVkUmlnaHQoTCdFJykpOworICBFWFBFQ1RfRVEoTCJGUkUiLCBmcmVkLlRyaW1tZWRSaWdodChMJ0QnKSk7CisgIFdpZGVTdHJpbmdWaWV3IGZyZWRkKEwiRlJFREQiKTsKKyAgRVhQRUNUX0VRKEwiRlJFIiwgZnJlZC5UcmltbWVkUmlnaHQoTCdEJykpOworfQorCitURVNUKFdpZGVTdHJpbmcsIEZvcm1hdFdpZHRoKSB7CisgIEVYUEVDVF9FUShMIiAgICAxIiwgV2lkZVN0cmluZzo6Rm9ybWF0KEwiJTVkIiwgMSkpOworICBFWFBFQ1RfRVEoTCIxIiwgV2lkZVN0cmluZzo6Rm9ybWF0KEwiJWQiLCAxKSk7CisgIEVYUEVDVF9FUShMIiAgICAxIiwgV2lkZVN0cmluZzo6Rm9ybWF0KEwiJSpkIiwgNSwgMSkpOworICBFWFBFQ1RfRVEoTCIxIiwgV2lkZVN0cmluZzo6Rm9ybWF0KEwiJS0xZCIsIDEpKTsKKyAgRVhQRUNUX0VRKEwiMSIsIFdpZGVTdHJpbmc6OkZvcm1hdChMIiUwZCIsIDEpKTsKKyAgRVhQRUNUX0VRKEwiIiwgV2lkZVN0cmluZzo6Rm9ybWF0KEwiJTEwNDg1NzZkIiwgMSkpOworfQorCitURVNUKFdpZGVTdHJpbmcsIEZvcm1hdFByZWNpc2lvbikgeworICBFWFBFQ1RfRVEoTCIxLjEyIiwgV2lkZVN0cmluZzo6Rm9ybWF0KEwiJS4yZiIsIDEuMTIzNDUpKTsKKyAgRVhQRUNUX0VRKEwiMS4xMjMiLCBXaWRlU3RyaW5nOjpGb3JtYXQoTCIlLipmIiwgMywgMS4xMjM0NSkpOworICBFWFBFQ1RfRVEoTCIxLjEyMzQ1MCIsIFdpZGVTdHJpbmc6OkZvcm1hdChMIiVmIiwgMS4xMjM0NSkpOworICBFWFBFQ1RfRVEoTCIxLjEyMzQ1MCIsIFdpZGVTdHJpbmc6OkZvcm1hdChMIiUtMWYiLCAxLjEyMzQ1KSk7CisgIEVYUEVDVF9FUShMIjEuMTIzNDUwIiwgV2lkZVN0cmluZzo6Rm9ybWF0KEwiJTBmIiwgMS4xMjM0NSkpOworICBFWFBFQ1RfRVEoTCIiLCBXaWRlU3RyaW5nOjpGb3JtYXQoTCIlLjEwNDg1NzZmIiwgMS4yKSk7Cit9CisKK1RFU1QoV2lkZVN0cmluZywgRm9ybWF0T3V0T2ZSYW5nZUNoYXIpIHsKKyAgRVhQRUNUX05FKEwiIiwgV2lkZVN0cmluZzo6Rm9ybWF0KEwidW5zdXBwb3J0ZWQgY2hhciAnJWMnIiwgMHgwMEZGMDBGRikpOworfQorCitURVNUKFdpZGVTdHJpbmcsIEVtcHR5KSB7CisgIFdpZGVTdHJpbmcgZW1wdHlfc3RyOworICBFWFBFQ1RfVFJVRShlbXB0eV9zdHIuSXNFbXB0eSgpKTsKKyAgRVhQRUNUX0VRKDB1LCBlbXB0eV9zdHIuR2V0TGVuZ3RoKCkpOworICBjb25zdCB3Y2hhcl90KiBjc3RyID0gZW1wdHlfc3RyLmNfc3RyKCk7CisgIEVYUEVDVF9FUSgwdSwgd2NzbGVuKGNzdHIpKTsKK30KKworVEVTVChDRlhfV2lkU3RyaW5nLCBJbml0aWFsaXplckxpc3QpIHsKKyAgV2lkZVN0cmluZyBtYW55X3N0cih7TCJjbGFtcyIsIEwiIGFuZCAiLCBMIm95c3RlcnMifSk7CisgIEVYUEVDVF9FUShMImNsYW1zIGFuZCBveXN0ZXJzIiwgbWFueV9zdHIpOworICBtYW55X3N0ciA9IHtMImZpc2giLCBMIiBhbmQgIiwgTCJjaGlwcyIsIEwiIGFuZCAiLCBMInNvZGEifTsKKyAgRVhQRUNUX0VRKEwiZmlzaCBhbmQgY2hpcHMgYW5kIHNvZGEiLCBtYW55X3N0cik7Cit9CisKK1RFU1QoV2lkZVN0cmluZywgTnVsbEl0ZXJhdG9yKSB7CisgIFdpZGVTdHJpbmcgbnVsbF9zdHI7CisgIGludDMyX3Qgc3VtID0gMDsKKyAgYm9vbCBhbnlfcHJlc2VudCA9IGZhbHNlOworICBmb3IgKGNvbnN0IGF1dG8mIGMgOiBudWxsX3N0cikgeworICAgIHN1bSArPSBjOyAgLy8gQXZvaWQgdW51c2VkIGFyZyB3YXJuaW5ncy4KKyAgICBhbnlfcHJlc2VudCA9IHRydWU7CisgIH0KKyAgRVhQRUNUX0ZBTFNFKGFueV9wcmVzZW50KTsKKyAgRVhQRUNUX0VRKDAsIHN1bSk7Cit9CisKK1RFU1QoV2lkZVN0cmluZywgRW1wdHlJdGVyYXRvcikgeworICBXaWRlU3RyaW5nIGVtcHR5X3N0cihMIiIpOworICBpbnQzMl90IHN1bSA9IDA7CisgIGJvb2wgYW55X3ByZXNlbnQgPSBmYWxzZTsKKyAgZm9yIChjb25zdCBhdXRvJiBjIDogZW1wdHlfc3RyKSB7CisgICAgYW55X3ByZXNlbnQgPSB0cnVlOworICAgIHN1bSArPSBjOyAgLy8gQXZvaWQgdW51c2VkIGFyZyB3YXJuaW5ncy4KKyAgfQorICBFWFBFQ1RfRkFMU0UoYW55X3ByZXNlbnQpOworICBFWFBFQ1RfRVEoMCwgc3VtKTsKK30KKworVEVTVChXaWRlU3RyaW5nLCBPbmVDaGFySXRlcmF0b3IpIHsKKyAgV2lkZVN0cmluZyBvbmVfc3RyKEwiYSIpOworICBpbnQzMl90IHN1bSA9IDA7CisgIGJvb2wgYW55X3ByZXNlbnQgPSBmYWxzZTsKKyAgZm9yIChjb25zdCBhdXRvJiBjIDogb25lX3N0cikgeworICAgIGFueV9wcmVzZW50ID0gdHJ1ZTsKKyAgICBzdW0gKz0gYzsgIC8vIEF2b2lkIHVudXNlZCBhcmcgd2FybmluZ3MuCisgIH0KKyAgRVhQRUNUX1RSVUUoYW55X3ByZXNlbnQpOworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8aW50MzJfdD4oTCdhJyksIHN1bSk7Cit9CisKK1RFU1QoV2lkZVN0cmluZywgTXVsdGlDaGFySXRlcmF0b3IpIHsKKyAgV2lkZVN0cmluZyBvbmVfc3RyKEwiYWJjIik7CisgIGludDMyX3Qgc3VtID0gMDsKKyAgYm9vbCBhbnlfcHJlc2VudCA9IGZhbHNlOworICBmb3IgKGNvbnN0IGF1dG8mIGMgOiBvbmVfc3RyKSB7CisgICAgYW55X3ByZXNlbnQgPSB0cnVlOworICAgIHN1bSArPSBjOyAgLy8gQXZvaWQgdW51c2VkIGFyZyB3YXJuaW5ncy4KKyAgfQorICBFWFBFQ1RfVFJVRShhbnlfcHJlc2VudCk7CisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxpbnQzMl90PihMJ2EnICsgTCdiJyArIEwnYycpLCBzdW0pOworfQorCitURVNUKFdpZGVTdHJpbmcsIEFueUFsbE5vbmVPZikgeworICBXaWRlU3RyaW5nIHN0cihMImFhYWFhYWFhYWFhYWFhYWFhYiIpOworICBFWFBFQ1RfRkFMU0Uoc3RkOjphbGxfb2Yoc3RyLmJlZ2luKCksIHN0ci5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IHdjaGFyX3QmIGMpIHsgcmV0dXJuIGMgPT0gTCdhJzsgfSkpOworCisgIEVYUEVDVF9GQUxTRShzdGQ6Om5vbmVfb2Yoc3RyLmJlZ2luKCksIHN0ci5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCB3Y2hhcl90JiBjKSB7IHJldHVybiBjID09IEwnYSc7IH0pKTsKKworICBFWFBFQ1RfVFJVRShzdGQ6OmFueV9vZihzdHIuYmVnaW4oKSwgc3RyLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCB3Y2hhcl90JiBjKSB7IHJldHVybiBjID09IEwnYSc7IH0pKTsKKworICBFWFBFQ1RfVFJVRShwZGZpdW06OkNvbnRhaW5zVmFsdWUoc3RyLCBMJ2EnKSk7CisgIEVYUEVDVF9UUlVFKHBkZml1bTo6Q29udGFpbnNWYWx1ZShzdHIsIEwnYicpKTsKKyAgRVhQRUNUX0ZBTFNFKHBkZml1bTo6Q29udGFpbnNWYWx1ZShzdHIsIEwneicpKTsKK30KKworVEVTVChXaWRlU3RyaW5nLCBPU3RyZWFtT3ZlcmxvYWQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0cmVhbTsKKworICAvLyBCYXNpYyBjYXNlLCBlbXB0eSBzdHJpbmcKKyAgV2lkZVN0cmluZyBzdHI7CisgIHN0cmVhbSA8PCBzdHI7CisgIEVYUEVDVF9FUSgiIiwgc3RyZWFtLnN0cigpKTsKKworICAvLyBCYXNpYyBjYXNlLCB3aWRlIGNoYXJhY3RlcgorICBzdHIgPSBMIlx1MjBBQyI7CisgIHN0cmVhbSA8PCBzdHI7CisgIEVYUEVDVF9FUSgiXHUyMEFDIiwgc3RyZWFtLnN0cigpKTsKKworICAvLyBCYXNpYyBjYXNlLCBub24tZW1wdHkgc3RyaW5nCisgIHN0ciA9IEwiZGVmIjsKKyAgc3RyZWFtLnN0cigiIik7CisgIHN0cmVhbSA8PCAiYWJjIiA8PCBzdHIgPDwgImdoaSI7CisgIEVYUEVDVF9FUSgiYWJjZGVmZ2hpIiwgc3RyZWFtLnN0cigpKTsKKworICAvLyBDaGFuZ2luZyB0aGUgV2lkZVN0cmluZyBkb2VzIG5vdCBjaGFuZ2UgdGhlIHN0cmVhbSBpdCB3YXMgd3JpdHRlbiB0by4KKyAgc3RyID0gTCIxMjMiOworICBFWFBFQ1RfRVEoImFiY2RlZmdoaSIsIHN0cmVhbS5zdHIoKSk7CisKKyAgLy8gV3JpdGluZyBpdCBhZ2FpbiB0byB0aGUgc3RyZWFtIHdpbGwgdXNlIHRoZSBsYXRlc3QgdmFsdWUuCisgIHN0cmVhbS5zdHIoIiIpOworICBzdHJlYW0gPDwgImFiYyIgPDwgc3RyIDw8ICJnaGkiOworICBFWFBFQ1RfRVEoImFiYzEyM2doaSIsIHN0cmVhbS5zdHIoKSk7CisKKyAgd2NoYXJfdCBzdHJpbmdXaXRoTnVsbHNbXXsneCcsICd5JywgJ1wwJywgJ3onfTsKKworICAvLyBXcml0aW5nIGEgV2lkZVN0cmluZyB3aXRoIG51bGxzIGFuZCBubyBzcGVjaWZpZWQgbGVuZ3RoIHRyZWF0cyBpdCBhcworICAvLyBhIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KKyAgc3RyID0gV2lkZVN0cmluZyhzdHJpbmdXaXRoTnVsbHMpOworICBFWFBFQ1RfRVEoMnUsIHN0ci5HZXRMZW5ndGgoKSk7CisgIHN0cmVhbS5zdHIoIiIpOworICBzdHJlYW0gPDwgc3RyOworICBFWFBFQ1RfRVEoMnUsIHN0cmVhbS50ZWxscCgpKTsKKworICAvLyBXcml0aW5nIGEgV2lkZVN0cmluZyB3aXRoIG51bGxzIGJ1dCBzcGVjaWZ5aW5nIGl0cyBsZW5ndGggdHJlYXRzIGl0IGFzCisgIC8vIGEgQysrLXN0eWxlIHN0cmluZy4KKyAgc3RyID0gV2lkZVN0cmluZyhzdHJpbmdXaXRoTnVsbHMsIDQpOworICBFWFBFQ1RfRVEoNHUsIHN0ci5HZXRMZW5ndGgoKSk7CisgIHN0cmVhbS5zdHIoIiIpOworICBzdHJlYW0gPDwgc3RyOworICBFWFBFQ1RfRVEoNHUsIHN0cmVhbS50ZWxscCgpKTsKKworICAvLyA8PCBvcGVyYXRvcnMgY2FuIGJlIGNoYWluZWQuCisgIFdpZGVTdHJpbmcgc3RyMShMImFiYyIpOworICBXaWRlU3RyaW5nIHN0cjIoTCJkZWYiKTsKKyAgc3RyZWFtLnN0cigiIik7CisgIHN0cmVhbSA8PCBzdHIxIDw8IHN0cjI7CisgIEVYUEVDVF9FUSgiYWJjZGVmIiwgc3RyZWFtLnN0cigpKTsKK30KKworVEVTVChXaWRlU3RyaW5nLCBXaWRlT1N0cmVhbU92ZXJsb2FkKSB7CisgIHN0ZDo6d29zdHJpbmdzdHJlYW0gc3RyZWFtOworCisgIC8vIEJhc2ljIGNhc2UsIGVtcHR5IHN0cmluZworICBXaWRlU3RyaW5nIHN0cjsKKyAgc3RyZWFtIDw8IHN0cjsKKyAgRVhQRUNUX0VRKEwiIiwgc3RyZWFtLnN0cigpKTsKKworICAvLyBCYXNpYyBjYXNlLCB3aWRlIGNoYXJhY3RlcgorICBzdHIgPSBMIlx1MjBBQyI7CisgIHN0cmVhbSA8PCBzdHI7CisgIEVYUEVDVF9FUShMIlx1MjBBQyIsIHN0cmVhbS5zdHIoKSk7CisKKyAgLy8gQmFzaWMgY2FzZSwgbm9uLWVtcHR5IHN0cmluZworICBzdHIgPSBMImRlZiI7CisgIHN0cmVhbS5zdHIoTCIiKTsKKyAgc3RyZWFtIDw8IEwiYWJjIiA8PCBzdHIgPDwgTCJnaGkiOworICBFWFBFQ1RfRVEoTCJhYmNkZWZnaGkiLCBzdHJlYW0uc3RyKCkpOworCisgIC8vIENoYW5naW5nIHRoZSBXaWRlU3RyaW5nIGRvZXMgbm90IGNoYW5nZSB0aGUgc3RyZWFtIGl0IHdhcyB3cml0dGVuIHRvLgorICBzdHIgPSBMIjEyMyI7CisgIEVYUEVDVF9FUShMImFiY2RlZmdoaSIsIHN0cmVhbS5zdHIoKSk7CisKKyAgLy8gV3JpdGluZyBpdCBhZ2FpbiB0byB0aGUgc3RyZWFtIHdpbGwgdXNlIHRoZSBsYXRlc3QgdmFsdWUuCisgIHN0cmVhbS5zdHIoTCIiKTsKKyAgc3RyZWFtIDw8IEwiYWJjIiA8PCBzdHIgPDwgTCJnaGkiOworICBFWFBFQ1RfRVEoTCJhYmMxMjNnaGkiLCBzdHJlYW0uc3RyKCkpOworCisgIHdjaGFyX3Qgc3RyaW5nV2l0aE51bGxzW117J3gnLCAneScsICdcMCcsICd6J307CisKKyAgLy8gV3JpdGluZyBhIFdpZGVTdHJpbmcgd2l0aCBudWxscyBhbmQgbm8gc3BlY2lmaWVkIGxlbmd0aCB0cmVhdHMgaXQgYXMKKyAgLy8gYSBDLXN0eWxlIG51bGwtdGVybWluYXRlZCBzdHJpbmcuCisgIHN0ciA9IFdpZGVTdHJpbmcoc3RyaW5nV2l0aE51bGxzKTsKKyAgRVhQRUNUX0VRKDJ1LCBzdHIuR2V0TGVuZ3RoKCkpOworICBzdHJlYW0uc3RyKEwiIik7CisgIHN0cmVhbSA8PCBzdHI7CisgIEVYUEVDVF9FUSgydSwgc3RyZWFtLnRlbGxwKCkpOworCisgIC8vIFdyaXRpbmcgYSBXaWRlU3RyaW5nIHdpdGggbnVsbHMgYnV0IHNwZWNpZnlpbmcgaXRzIGxlbmd0aCB0cmVhdHMgaXQgYXMKKyAgLy8gYSBDKystc3R5bGUgc3RyaW5nLgorICBzdHIgPSBXaWRlU3RyaW5nKHN0cmluZ1dpdGhOdWxscywgNCk7CisgIEVYUEVDVF9FUSg0dSwgc3RyLkdldExlbmd0aCgpKTsKKyAgc3RyZWFtLnN0cihMIiIpOworICBzdHJlYW0gPDwgc3RyOworICBFWFBFQ1RfRVEoNHUsIHN0cmVhbS50ZWxscCgpKTsKKworICAvLyA8PCBvcGVyYXRvcnMgY2FuIGJlIGNoYWluZWQuCisgIFdpZGVTdHJpbmcgc3RyMShMImFiYyIpOworICBXaWRlU3RyaW5nIHN0cjIoTCJkZWYiKTsKKyAgc3RyZWFtLnN0cihMIiIpOworICBzdHJlYW0gPDwgc3RyMSA8PCBzdHIyOworICBFWFBFQ1RfRVEoTCJhYmNkZWYiLCBzdHJlYW0uc3RyKCkpOworfQorCitURVNUKFdpZGVTdHJpbmdWaWV3LCBPU3RyZWFtT3ZlcmxvYWQpIHsKKyAgLy8gQmFzaWMgY2FzZSwgZW1wdHkgc3RyaW5nCisgIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RyZWFtOworICAgIFdpZGVTdHJpbmdWaWV3IHN0cjsKKyAgICBzdHJlYW0gPDwgc3RyOworICAgIEVYUEVDVF9FUSgiIiwgc3RyZWFtLnN0cigpKTsKKyAgfQorCisgIC8vIEJhc2ljIGNhc2UsIG5vbi1lbXB0eSBzdHJpbmcKKyAgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzdHJlYW07CisgICAgV2lkZVN0cmluZ1ZpZXcgc3RyKEwiZGVmIik7CisgICAgc3RyZWFtIDw8ICJhYmMiIDw8IHN0ciA8PCAiZ2hpIjsKKyAgICBFWFBFQ1RfRVEoImFiY2RlZmdoaSIsIHN0cmVhbS5zdHIoKSk7CisgIH0KKworICAvLyBCYXNpYyBjYXNlLCB3aWRlIGNoYXJhY3RlcgorICB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0cmVhbTsKKyAgICBXaWRlU3RyaW5nVmlldyBzdHIoTCJcdTIwQUMiKTsKKyAgICBzdHJlYW0gPDwgc3RyOworICAgIEVYUEVDVF9FUSgiXHUyMEFDIiwgc3RyZWFtLnN0cigpKTsKKyAgfQorCisgIC8vIENoYW5naW5nIHRoZSBXaWRlU3RyaW5nVmlldyBkb2VzIG5vdCBjaGFuZ2UgdGhlIHN0cmVhbSBpdCB3YXMgd3JpdHRlbiB0by4KKyAgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzdHJlYW07CisgICAgV2lkZVN0cmluZ1ZpZXcgc3RyKEwiYWJjIik7CisgICAgc3RyZWFtIDw8IHN0cjsKKyAgICBzdHIgPSBMIjEyMyI7CisgICAgRVhQRUNUX0VRKCJhYmMiLCBzdHJlYW0uc3RyKCkpOworICB9CisKKyAgLy8gV3JpdGluZyBpdCBhZ2FpbiB0byB0aGUgc3RyZWFtIHdpbGwgdXNlIHRoZSBsYXRlc3QgdmFsdWUuCisgIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RyZWFtOworICAgIFdpZGVTdHJpbmdWaWV3IHN0cihMImFiYyIpOworICAgIHN0cmVhbSA8PCBzdHI7CisgICAgc3RyZWFtLnN0cigiIik7CisgICAgc3RyID0gTCIxMjMiOworICAgIHN0cmVhbSA8PCBzdHI7CisgICAgRVhQRUNUX0VRKCIxMjMiLCBzdHJlYW0uc3RyKCkpOworICB9CisKKyAgLy8gV3JpdGluZyBhIFdpZGVTdHJpbmdWaWV3IHdpdGggbnVsbHMgYW5kIG5vIHNwZWNpZmllZCBsZW5ndGggdHJlYXRzIGl0IGFzCisgIC8vIGEgQy1zdHlsZSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLgorICB7CisgICAgd2NoYXJfdCBzdHJpbmdXaXRoTnVsbHNbXXsneCcsICd5JywgJ1wwJywgJ3onfTsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RyZWFtOworICAgIFdpZGVTdHJpbmdWaWV3IHN0cihzdHJpbmdXaXRoTnVsbHMpOworICAgIEVYUEVDVF9FUSgydSwgc3RyLkdldExlbmd0aCgpKTsKKyAgICBzdHJlYW0gPDwgc3RyOworICAgIEVYUEVDVF9FUSgydSwgc3RyZWFtLnRlbGxwKCkpOworICAgIHN0ciA9IEwiIjsKKyAgfQorCisgIC8vIFdyaXRpbmcgYSBXaWRlU3RyaW5nVmlldyB3aXRoIG51bGxzIGJ1dCBzcGVjaWZ5aW5nIGl0cyBsZW5ndGggdHJlYXRzIGl0IGFzCisgIC8vIGEgQysrLXN0eWxlIHN0cmluZy4KKyAgeworICAgIHdjaGFyX3Qgc3RyaW5nV2l0aE51bGxzW117J3gnLCAneScsICdcMCcsICd6J307CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0cmVhbTsKKyAgICBXaWRlU3RyaW5nVmlldyBzdHIoc3RyaW5nV2l0aE51bGxzLCA0KTsKKyAgICBFWFBFQ1RfRVEoNHUsIHN0ci5HZXRMZW5ndGgoKSk7CisgICAgc3RyZWFtIDw8IHN0cjsKKyAgICBFWFBFQ1RfRVEoNHUsIHN0cmVhbS50ZWxscCgpKTsKKyAgICBzdHIgPSBMIiI7CisgIH0KKworICAvLyA8PCBvcGVyYXRvcnMgY2FuIGJlIGNoYWluZWQuCisgIHsKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RyZWFtOworICAgIFdpZGVTdHJpbmdWaWV3IHN0cjEoTCJhYmMiKTsKKyAgICBXaWRlU3RyaW5nVmlldyBzdHIyKEwiZGVmIik7CisgICAgc3RyZWFtIDw8IHN0cjEgPDwgc3RyMjsKKyAgICBFWFBFQ1RfRVEoImFiY2RlZiIsIHN0cmVhbS5zdHIoKSk7CisgIH0KK30KKworVEVTVChXaWRlU3RyaW5nVmlldywgV2lkZU9TdHJlYW1PdmVybG9hZCkgeworICAvLyBCYXNpYyBjYXNlLCBlbXB0eSBzdHJpbmcKKyAgeworICAgIHN0ZDo6d29zdHJpbmdzdHJlYW0gc3RyZWFtOworICAgIFdpZGVTdHJpbmdWaWV3IHN0cjsKKyAgICBzdHJlYW0gPDwgc3RyOworICAgIEVYUEVDVF9FUShMIiIsIHN0cmVhbS5zdHIoKSk7CisgIH0KKworICAvLyBCYXNpYyBjYXNlLCBub24tZW1wdHkgc3RyaW5nCisgIHsKKyAgICBzdGQ6Ondvc3RyaW5nc3RyZWFtIHN0cmVhbTsKKyAgICBXaWRlU3RyaW5nVmlldyBzdHIoTCJkZWYiKTsKKyAgICBzdHJlYW0gPDwgImFiYyIgPDwgc3RyIDw8ICJnaGkiOworICAgIEVYUEVDVF9FUShMImFiY2RlZmdoaSIsIHN0cmVhbS5zdHIoKSk7CisgIH0KKworICAvLyBCYXNpYyBjYXNlLCB3aWRlIGNoYXJhY3RlcgorICB7CisgICAgc3RkOjp3b3N0cmluZ3N0cmVhbSBzdHJlYW07CisgICAgV2lkZVN0cmluZ1ZpZXcgc3RyKEwiXHUyMEFDIik7CisgICAgc3RyZWFtIDw8IHN0cjsKKyAgICBFWFBFQ1RfRVEoTCJcdTIwQUMiLCBzdHJlYW0uc3RyKCkpOworICB9CisKKyAgLy8gQ2hhbmdpbmcgdGhlIFdpZGVTdHJpbmdWaWV3IGRvZXMgbm90IGNoYW5nZSB0aGUgc3RyZWFtIGl0IHdhcyB3cml0dGVuIHRvLgorICB7CisgICAgc3RkOjp3b3N0cmluZ3N0cmVhbSBzdHJlYW07CisgICAgV2lkZVN0cmluZ1ZpZXcgc3RyKEwiYWJjIik7CisgICAgc3RyZWFtIDw8IHN0cjsKKyAgICBzdHIgPSBMIjEyMyI7CisgICAgRVhQRUNUX0VRKEwiYWJjIiwgc3RyZWFtLnN0cigpKTsKKyAgfQorCisgIC8vIFdyaXRpbmcgaXQgYWdhaW4gdG8gdGhlIHN0cmVhbSB3aWxsIHVzZSB0aGUgbGF0ZXN0IHZhbHVlLgorICB7CisgICAgc3RkOjp3b3N0cmluZ3N0cmVhbSBzdHJlYW07CisgICAgV2lkZVN0cmluZ1ZpZXcgc3RyKEwiYWJjIik7CisgICAgc3RyZWFtIDw8IHN0cjsKKyAgICBzdHJlYW0uc3RyKEwiIik7CisgICAgc3RyID0gTCIxMjMiOworICAgIHN0cmVhbSA8PCBzdHI7CisgICAgRVhQRUNUX0VRKEwiMTIzIiwgc3RyZWFtLnN0cigpKTsKKyAgfQorCisgIC8vIFdyaXRpbmcgYSBXaWRlU3RyaW5nVmlldyB3aXRoIG51bGxzIGFuZCBubyBzcGVjaWZpZWQgbGVuZ3RoIHRyZWF0cyBpdCBhcworICAvLyBhIEMtc3R5bGUgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4KKyAgeworICAgIHdjaGFyX3Qgc3RyaW5nV2l0aE51bGxzW117J3gnLCAneScsICdcMCcsICd6J307CisgICAgc3RkOjp3b3N0cmluZ3N0cmVhbSBzdHJlYW07CisgICAgV2lkZVN0cmluZ1ZpZXcgc3RyKHN0cmluZ1dpdGhOdWxscyk7CisgICAgRVhQRUNUX0VRKDJ1LCBzdHIuR2V0TGVuZ3RoKCkpOworICAgIHN0cmVhbSA8PCBzdHI7CisgICAgRVhQRUNUX0VRKDJ1LCBzdHJlYW0udGVsbHAoKSk7CisgIH0KKworICAvLyBXcml0aW5nIGEgV2lkZVN0cmluZ1ZpZXcgd2l0aCBudWxscyBidXQgc3BlY2lmeWluZyBpdHMgbGVuZ3RoIHRyZWF0cyBpdCBhcworICAvLyBhIEMrKy1zdHlsZSBzdHJpbmcuCisgIHsKKyAgICB3Y2hhcl90IHN0cmluZ1dpdGhOdWxsc1tdeyd4JywgJ3knLCAnXDAnLCAneid9OworICAgIHN0ZDo6d29zdHJpbmdzdHJlYW0gc3RyZWFtOworICAgIFdpZGVTdHJpbmdWaWV3IHN0cihzdHJpbmdXaXRoTnVsbHMsIDQpOworICAgIEVYUEVDVF9FUSg0dSwgc3RyLkdldExlbmd0aCgpKTsKKyAgICBzdHJlYW0gPDwgc3RyOworICAgIEVYUEVDVF9FUSg0dSwgc3RyZWFtLnRlbGxwKCkpOworICB9CisKKyAgLy8gPDwgb3BlcmF0b3JzIGNhbiBiZSBjaGFpbmVkLgorICB7CisgICAgc3RkOjp3b3N0cmluZ3N0cmVhbSBzdHJlYW07CisgICAgV2lkZVN0cmluZ1ZpZXcgc3RyMShMImFiYyIpOworICAgIFdpZGVTdHJpbmdWaWV3IHN0cjIoTCJkZWYiKTsKKyAgICBzdHJlYW0gPDwgc3RyMSA8PCBzdHIyOworICAgIEVYUEVDVF9FUShMImFiY2RlZiIsIHN0cmVhbS5zdHIoKSk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGZ4Y3J0CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L3htbC9jZnhfc2F4Y29udGV4dC5jcHAgYi9jb3JlL2Z4Y3J0L3htbC9jZnhfc2F4Y29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyZjBjNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQveG1sL2NmeF9zYXhjb250ZXh0LmNwcApAQCAtMCwwICsxLDkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF9zYXhjb250ZXh0LmgiCisKK0NGWF9TQVhDb250ZXh0OjpDRlhfU0FYQ29udGV4dCgpIDogbV9lTm9kZShDRlhfU0FYSXRlbTo6VHlwZTo6VW5rbm93bikge30KKworQ0ZYX1NBWENvbnRleHQ6On5DRlhfU0FYQ29udGV4dCgpIHt9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L3htbC9jZnhfc2F4Y29udGV4dC5oIGIvY29yZS9meGNydC94bWwvY2Z4X3NheGNvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGQ3NGEzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC94bWwvY2Z4X3NheGNvbnRleHQuaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENSVF9YTUxfQ0ZYX1NBWENPTlRFWFRfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9YTUxfQ0ZYX1NBWENPTlRFWFRfSF8KKworI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF9zYXhyZWFkZXIuaCIKKworY2xhc3MgQ0ZYX1NBWENvbnRleHQgeworIHB1YmxpYzoKKyAgQ0ZYX1NBWENvbnRleHQoKTsKKyAgfkNGWF9TQVhDb250ZXh0KCk7CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIG1fVGV4dEJ1ZjsKKyAgQnl0ZVN0cmluZyBtX2JzVGFnTmFtZTsKKyAgQ0ZYX1NBWEl0ZW06OlR5cGUgbV9lTm9kZTsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWENSVF9YTUxfQ0ZYX1NBWENPTlRFWFRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQveG1sL2NmeF9zYXhyZWFkZXIuY3BwIGIvY29yZS9meGNydC94bWwvY2Z4X3NheHJlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyMTQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQveG1sL2NmeF9zYXhyZWFkZXIuY3BwCkBAIC0wLDAgKzEsNzQ0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfc2F4cmVhZGVyLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3NheHJlYWRlcmhhbmRsZXIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorCitlbnVtIGNsYXNzIENGWF9TYXhNb2RlIHsKKyAgVGV4dCA9IDAsCisgIE5vZGVTdGFydCwKKyAgRGVjbE9yQ29tbWVudCwKKyAgRGVjbE5vZGUsCisgIENvbW1lbnQsCisgIENvbW1lbnRDb250ZW50LAorICBUYWdOYW1lLAorICBUYWdBdHRyaWJ1dGVOYW1lLAorICBUYWdBdHRyaWJ1dGVFcXVhbCwKKyAgVGFnQXR0cmlidXRlVmFsdWUsCisgIFRhZ01heWJlQ2xvc2UsCisgIFRhZ0Nsb3NlLAorICBUYWdFbmQsCisgIFRhcmdldERhdGEsCit9OworCitjbGFzcyBDRlhfU0FYQ29tbWVudENvbnRleHQgeworIHB1YmxpYzoKKyAgQ0ZYX1NBWENvbW1lbnRDb250ZXh0KCkgOiBtX2lIZWFkZXJDb3VudCgwKSwgbV9pVGFpbENvdW50KDApIHt9CisgIGludDMyX3QgbV9pSGVhZGVyQ291bnQ7CisgIGludDMyX3QgbV9pVGFpbENvdW50OworfTsKKworbmFtZXNwYWNlIHsKKworY29uc3QgdWludDMyX3Qga1NheEZpbGVCdWZTaXplID0gMzI3Njg7CisKK30gIC8vIG5hbWVzcGFjZQorCitDRlhfU0FYRmlsZTo6Q0ZYX1NBWEZpbGUoKQorICAgIDogbV9kd1N0YXJ0KDApLAorICAgICAgbV9kd0VuZCgwKSwKKyAgICAgIG1fZHdDdXIoMCksCisgICAgICBtX3BCdWYobnVsbHB0ciksCisgICAgICBtX2R3QnVmU2l6ZSgwKSwKKyAgICAgIG1fZHdCdWZJbmRleCgwKSB7fQorCitDRlhfU0FYRmlsZTo6fkNGWF9TQVhGaWxlKCkge30KKworYm9vbCBDRlhfU0FYRmlsZTo6U3RhcnRGaWxlKGNvbnN0IFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0xlbikgeworICBBU1NFUlQoIW1fcEZpbGUgJiYgcEZpbGUpOworICB1aW50MzJfdCBkd1NpemUgPSBwRmlsZS0+R2V0U2l6ZSgpOworICBpZiAoZHdTdGFydCA+PSBkd1NpemUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChkd0xlbiA9PSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oLTEpIHx8IGR3U3RhcnQgKyBkd0xlbiA+IGR3U2l6ZSkKKyAgICBkd0xlbiA9IGR3U2l6ZSAtIGR3U3RhcnQ7CisKKyAgaWYgKGR3TGVuID09IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIG1fZHdCdWZTaXplID0gc3RkOjptaW4oZHdMZW4sIGtTYXhGaWxlQnVmU2l6ZSk7CisgIG1fcEJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fZHdCdWZTaXplKTsKKyAgaWYgKCFwRmlsZS0+UmVhZEJsb2NrKG1fcEJ1ZiwgZHdTdGFydCwgbV9kd0J1ZlNpemUpKQorICAgIHJldHVybiBmYWxzZTsKKworICBtX2R3U3RhcnQgPSBkd1N0YXJ0OworICBtX2R3RW5kID0gZHdTdGFydCArIGR3TGVuOworICBtX2R3Q3VyID0gZHdTdGFydDsKKyAgbV9wRmlsZSA9IHBGaWxlOworICBtX2R3QnVmSW5kZXggPSAwOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDRlhfU0FYRmlsZTo6UmVhZE5leHRCbG9jaygpIHsKKyAgQVNTRVJUKG1fcEZpbGUpOworICB1aW50MzJfdCBkd1NpemUgPSBtX2R3RW5kIC0gbV9kd0N1cjsKKyAgaWYgKGR3U2l6ZSA9PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1fZHdCdWZTaXplID0gc3RkOjptaW4oZHdTaXplLCBrU2F4RmlsZUJ1ZlNpemUpOworICBpZiAoIW1fcEZpbGUtPlJlYWRCbG9jayhtX3BCdWYsIG1fZHdDdXIsIG1fZHdCdWZTaXplKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBtX2R3QnVmSW5kZXggPSAwOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDRlhfU0FYRmlsZTo6UmVzZXQoKSB7CisgIGlmIChtX3BCdWYpIHsKKyAgICBGWF9GcmVlKG1fcEJ1Zik7CisgICAgbV9wQnVmID0gbnVsbHB0cjsKKyAgfQorICBtX3BGaWxlID0gbnVsbHB0cjsKK30KKworQ0ZYX1NBWFJlYWRlcjo6Q0ZYX1NBWFJlYWRlcigpCisgICAgOiBtX0ZpbGUoKSwKKyAgICAgIG1fcEhhbmRsZXIobnVsbHB0ciksCisgICAgICBtX2lTdGF0ZSgtMSksCisgICAgICBtX2R3SXRlbUlEKDApLAorICAgICAgbV9kd1BhcnNlTW9kZSgwKSB7CisgIG1fRGF0YS5yZXNlcnZlKDI1Nik7CisgIG1fTmFtZS5yZXNlcnZlKDI1Nik7Cit9CisKK0NGWF9TQVhSZWFkZXI6On5DRlhfU0FYUmVhZGVyKCkgeworICBSZXNldCgpOworfQorCit2b2lkIENGWF9TQVhSZWFkZXI6OlJlc2V0KCkgeworICBtX0ZpbGUuUmVzZXQoKTsKKyAgbV9pU3RhdGUgPSAtMTsKKyAgbV9TdGFjayA9IHN0ZDo6c3RhY2s8c3RkOjp1bmlxdWVfcHRyPENGWF9TQVhJdGVtPj4oKTsKKyAgbV9kd0l0ZW1JRCA9IDA7CisgIG1fU2tpcFN0YWNrID0gc3RkOjpzdGFjazxjaGFyPigpOworICBtX1NraXBDaGFyID0gMDsKKyAgbV9wQ29tbWVudENvbnRleHQucmVzZXQoKTsKKyAgQ2xlYXJEYXRhKCk7CisgIENsZWFyTmFtZSgpOworfQorCit2b2lkIENGWF9TQVhSZWFkZXI6OlB1c2goKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfU0FYSXRlbT4gcE5ldyA9CisgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX1NBWEl0ZW0+KCsrbV9kd0l0ZW1JRCk7CisgIGlmICghbV9TdGFjay5lbXB0eSgpKQorICAgIHBOZXctPm1fYlNraXAgPSBtX1N0YWNrLnRvcCgpLT5tX2JTa2lwOworICBtX1N0YWNrLnB1c2goc3RkOjptb3ZlKHBOZXcpKTsKK30KKwordm9pZCBDRlhfU0FYUmVhZGVyOjpQb3AoKSB7CisgIGlmICghbV9TdGFjay5lbXB0eSgpKQorICAgIG1fU3RhY2sucG9wKCk7Cit9CisKK0NGWF9TQVhJdGVtKiBDRlhfU0FYUmVhZGVyOjpHZXRDdXJyZW50SXRlbSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fU3RhY2suZW1wdHkoKSA/IG51bGxwdHIgOiBtX1N0YWNrLnRvcCgpLmdldCgpOworfQorCit2b2lkIENGWF9TQVhSZWFkZXI6OkNsZWFyRGF0YSgpIHsKKyAgbV9EYXRhLmNsZWFyKCk7CisgIG1faUVudGl0eVN0YXJ0ID0gLTE7Cit9CisKK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6Q2xlYXJOYW1lKCkgeworICBtX05hbWUuY2xlYXIoKTsKK30KKwordm9pZCBDRlhfU0FYUmVhZGVyOjpBcHBlbmRUb0RhdGEodWludDhfdCBjaCkgeworICBtX0RhdGEucHVzaF9iYWNrKGNoKTsKK30KKwordm9pZCBDRlhfU0FYUmVhZGVyOjpBcHBlbmRUb05hbWUodWludDhfdCBjaCkgeworICBtX05hbWUucHVzaF9iYWNrKGNoKTsKK30KKwordm9pZCBDRlhfU0FYUmVhZGVyOjpCYWNrVXBBbmRSZXBsYWNlRGF0YUF0KGludDMyX3QgaW5kZXgsIHVpbnQ4X3QgY2gpIHsKKyAgQVNTRVJUKGluZGV4ID4gLTEpOworICBtX0RhdGEuZXJhc2UobV9EYXRhLmJlZ2luKCkgKyBpbmRleCwgbV9EYXRhLmVuZCgpKTsKKyAgQXBwZW5kVG9EYXRhKGNoKTsKK30KKworaW50MzJfdCBDRlhfU0FYUmVhZGVyOjpDdXJyZW50RGF0YUluZGV4KCkgY29uc3QgeworICByZXR1cm4gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX0RhdGEpIC0gMTsKK30KKworYm9vbCBDRlhfU0FYUmVhZGVyOjpJc0VudGl0eVN0YXJ0KHVpbnQ4X3QgY2gpIGNvbnN0IHsKKyAgcmV0dXJuIG1faUVudGl0eVN0YXJ0ID09IC0xICYmIGNoID09ICcmJzsKK30KKworYm9vbCBDRlhfU0FYUmVhZGVyOjpJc0VudGl0eUVuZCh1aW50OF90IGNoKSBjb25zdCB7CisgIHJldHVybiBtX2lFbnRpdHlTdGFydCAhPSAtMSAmJiBjaCA9PSAnOyc7Cit9CisKK2Jvb2wgQ0ZYX1NBWFJlYWRlcjo6U2tpcFNwYWNlKHVpbnQ4X3QgY2gpIHsKKyAgcmV0dXJuIChtX2R3UGFyc2VNb2RlICYgQ0ZYX1NheFBhcnNlTW9kZV9Ob3RTa2lwU3BhY2UpID09IDAgJiYgY2ggPCAweDIxOworfQorCitpbnQzMl90IENGWF9TQVhSZWFkZXI6OlN0YXJ0UGFyc2UoCisgICAgY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZSwKKyAgICB1aW50MzJfdCBkd1N0YXJ0LAorICAgIHVpbnQzMl90IGR3TGVuLAorICAgIHVpbnQzMl90IGR3UGFyc2VNb2RlKSB7CisgIFJlc2V0KCk7CisgIGlmICghbV9GaWxlLlN0YXJ0RmlsZShwRmlsZSwgZHdTdGFydCwgZHdMZW4pKQorICAgIHJldHVybiAtMTsKKworICBtX2lTdGF0ZSA9IDA7CisgIG1fZU1vZGUgPSBDRlhfU2F4TW9kZTo6VGV4dDsKKyAgbV9lUHJldk1vZGUgPSBDRlhfU2F4TW9kZTo6VGV4dDsKKyAgbV9iQ2hhckRhdGEgPSBmYWxzZTsKKyAgbV9kd0RhdGFPZmZzZXQgPSAwOworICBtX2R3UGFyc2VNb2RlID0gZHdQYXJzZU1vZGU7CisgIG1fU3RhY2sucHVzaChwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX1NBWEl0ZW0+KCsrbV9kd0l0ZW1JRCkpOworICByZXR1cm4gMDsKK30KKworaW50MzJfdCBDRlhfU0FYUmVhZGVyOjpDb250aW51ZVBhcnNlKCkgeworICBpZiAobV9pU3RhdGUgPCAwIHx8IG1faVN0YXRlID4gOTkpCisgICAgcmV0dXJuIG1faVN0YXRlOworCisgIHdoaWxlIChtX0ZpbGUubV9kd0N1ciA8IG1fRmlsZS5tX2R3RW5kKSB7CisgICAgdWludDMyX3QmIGluZGV4ID0gbV9GaWxlLm1fZHdCdWZJbmRleDsKKyAgICB1aW50MzJfdCBzaXplID0gbV9GaWxlLm1fZHdCdWZTaXplOworICAgIGNvbnN0IHVpbnQ4X3QqIHBCdWYgPSBtX0ZpbGUubV9wQnVmOworICAgIHdoaWxlIChpbmRleCA8IHNpemUpIHsKKyAgICAgIG1fQ3VyQnl0ZSA9IHBCdWZbaW5kZXhdOworICAgICAgUGFyc2VJbnRlcm5hbCgpOworICAgICAgaW5kZXgrKzsKKyAgICB9CisgICAgbV9GaWxlLm1fZHdDdXIgKz0gaW5kZXg7CisgICAgbV9pU3RhdGUgPSAobV9GaWxlLm1fZHdDdXIgLSBtX0ZpbGUubV9kd1N0YXJ0KSAqIDEwMCAvCisgICAgICAgICAgICAgICAobV9GaWxlLm1fZHdFbmQgLSBtX0ZpbGUubV9kd1N0YXJ0KTsKKyAgICBpZiAobV9GaWxlLm1fZHdDdXIgPj0gbV9GaWxlLm1fZHdFbmQpCisgICAgICBicmVhazsKKyAgICBpZiAoIW1fRmlsZS5SZWFkTmV4dEJsb2NrKCkpIHsKKyAgICAgIG1faVN0YXRlID0gLTI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgbV9kd0RhdGFPZmZzZXQgPSAwOworICB9CisgIHJldHVybiBtX2lTdGF0ZTsKK30KKwordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZUludGVybmFsKCkgeworICBzd2l0Y2ggKG1fZU1vZGUpIHsKKyAgICBjYXNlIENGWF9TYXhNb2RlOjpUZXh0OgorICAgICAgUGFyc2VUZXh0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENGWF9TYXhNb2RlOjpOb2RlU3RhcnQ6CisgICAgICBQYXJzZU5vZGVTdGFydCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDRlhfU2F4TW9kZTo6RGVjbE9yQ29tbWVudDoKKyAgICAgIFBhcnNlRGVjbE9yQ29tbWVudCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDRlhfU2F4TW9kZTo6RGVjbE5vZGU6CisgICAgICBQYXJzZURlY2xOb2RlKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENGWF9TYXhNb2RlOjpDb21tZW50OgorICAgICAgUGFyc2VDb21tZW50KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENGWF9TYXhNb2RlOjpDb21tZW50Q29udGVudDoKKyAgICAgIFBhcnNlQ29tbWVudENvbnRlbnQoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0ZYX1NheE1vZGU6OlRhZ05hbWU6CisgICAgICBQYXJzZVRhZ05hbWUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0ZYX1NheE1vZGU6OlRhZ0F0dHJpYnV0ZU5hbWU6CisgICAgICBQYXJzZVRhZ0F0dHJpYnV0ZU5hbWUoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0ZYX1NheE1vZGU6OlRhZ0F0dHJpYnV0ZUVxdWFsOgorICAgICAgUGFyc2VUYWdBdHRyaWJ1dGVFcXVhbCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDRlhfU2F4TW9kZTo6VGFnQXR0cmlidXRlVmFsdWU6CisgICAgICBQYXJzZVRhZ0F0dHJpYnV0ZVZhbHVlKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENGWF9TYXhNb2RlOjpUYWdNYXliZUNsb3NlOgorICAgICAgUGFyc2VNYXliZUNsb3NlKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENGWF9TYXhNb2RlOjpUYWdDbG9zZToKKyAgICAgIFBhcnNlVGFnQ2xvc2UoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0ZYX1NheE1vZGU6OlRhZ0VuZDoKKyAgICAgIFBhcnNlVGFnRW5kKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENGWF9TYXhNb2RlOjpUYXJnZXREYXRhOgorICAgICAgUGFyc2VUYXJnZXREYXRhKCk7CisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlQ2hhcih1aW50OF90IGNoKSB7CisgIEFwcGVuZFRvRGF0YShjaCk7CisgIGlmIChJc0VudGl0eVN0YXJ0KGNoKSkgeworICAgIG1faUVudGl0eVN0YXJ0ID0gQ3VycmVudERhdGFJbmRleCgpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIUlzRW50aXR5RW5kKGNoKSkKKyAgICByZXR1cm47CisKKyAgLy8gTm8gbWF0dGVyIHdoYXQsIHdlJ3JlIG5vIGxvbmdlciBpbiBhbiBlbnRpdHkuCisgIEFTU0VSVChtX2lFbnRpdHlTdGFydCA+IC0xKTsKKyAgaW50MzJfdCBpU2F2ZVN0YXJ0ID0gbV9pRW50aXR5U3RhcnQ7CisgIG1faUVudGl0eVN0YXJ0ID0gLTE7CisKKyAgLy8gTk9URTogUmVsaWVzIG9uIG5lZ2F0aXZlIGxlbmd0aHMgYmVpbmcgdHJlYXRlZCBhcyBlbXB0eSBzdHJpbmdzLgorICBCeXRlU3RyaW5nIGNzRW50aXR5KG1fRGF0YS5kYXRhKCkgKyBpU2F2ZVN0YXJ0ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50RGF0YUluZGV4KCkgLSBpU2F2ZVN0YXJ0IC0gMSk7CisgIGludDMyX3QgaUxlbiA9IGNzRW50aXR5LkdldExlbmd0aCgpOworICBpZiAoaUxlbiA9PSAwKQorICAgIHJldHVybjsKKworICBpZiAoY3NFbnRpdHlbMF0gPT0gJyMnKSB7CisgICAgaWYgKChtX2R3UGFyc2VNb2RlICYgQ0ZYX1NheFBhcnNlTW9kZV9Ob3RDb252ZXJ0X3NoYXJwKSA9PSAwKSB7CisgICAgICBjaCA9IDA7CisgICAgICB1aW50OF90IHc7CisgICAgICBpZiAoaUxlbiA+IDEgJiYgY3NFbnRpdHlbMV0gPT0gJ3gnKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMjsgaSA8IGlMZW47IGkrKykgeworICAgICAgICAgIHcgPSBjc0VudGl0eVtpXTsKKyAgICAgICAgICBpZiAodyA+PSAnMCcgJiYgdyA8PSAnOScpCisgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSAnMCc7CisgICAgICAgICAgZWxzZSBpZiAodyA+PSAnQScgJiYgdyA8PSAnRicpCisgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSA1NTsKKyAgICAgICAgICBlbHNlIGlmICh3ID49ICdhJyAmJiB3IDw9ICdmJykKKyAgICAgICAgICAgIGNoID0gKGNoIDw8IDQpICsgdyAtIDg3OworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBpTGVuOyBpKyspIHsKKyAgICAgICAgICB3ID0gY3NFbnRpdHlbaV07CisgICAgICAgICAgaWYgKHcgPCAnMCcgfHwgdyA+ICc5JykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNoID0gY2ggKiAxMCArIHcgLSAnMCc7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChjaCAhPSAwKQorICAgICAgICBCYWNrVXBBbmRSZXBsYWNlRGF0YUF0KGlTYXZlU3RhcnQsIGNoKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGlmIChjc0VudGl0eSA9PSAiYW1wIikgeworICAgIGlmICgobV9kd1BhcnNlTW9kZSAmIENGWF9TYXhQYXJzZU1vZGVfTm90Q29udmVydF9hbXApID09IDApCisgICAgICBCYWNrVXBBbmRSZXBsYWNlRGF0YUF0KGlTYXZlU3RhcnQsICcmJyk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChjc0VudGl0eSA9PSAibHQiKSB7CisgICAgaWYgKChtX2R3UGFyc2VNb2RlICYgQ0ZYX1NheFBhcnNlTW9kZV9Ob3RDb252ZXJ0X2x0KSA9PSAwKQorICAgICAgQmFja1VwQW5kUmVwbGFjZURhdGFBdChpU2F2ZVN0YXJ0LCAnPCcpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoY3NFbnRpdHkgPT0gImd0IikgeworICAgIGlmICgobV9kd1BhcnNlTW9kZSAmIENGWF9TYXhQYXJzZU1vZGVfTm90Q29udmVydF9ndCkgPT0gMCkKKyAgICAgIEJhY2tVcEFuZFJlcGxhY2VEYXRhQXQoaVNhdmVTdGFydCwgJz4nKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGNzRW50aXR5ID09ICJhcG9zIikgeworICAgIGlmICgobV9kd1BhcnNlTW9kZSAmIENGWF9TYXhQYXJzZU1vZGVfTm90Q29udmVydF9hcG9zKSA9PSAwKQorICAgICAgQmFja1VwQW5kUmVwbGFjZURhdGFBdChpU2F2ZVN0YXJ0LCAnXCcnKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGNzRW50aXR5ID09ICJxdW90IikgeworICAgIGlmICgobV9kd1BhcnNlTW9kZSAmIENGWF9TYXhQYXJzZU1vZGVfTm90Q29udmVydF9xdW90KSA9PSAwKQorICAgICAgQmFja1VwQW5kUmVwbGFjZURhdGFBdChpU2F2ZVN0YXJ0LCAnXCInKTsKKyAgICByZXR1cm47CisgIH0KK30KKwordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZVRleHQoKSB7CisgIGlmIChtX0N1ckJ5dGUgPT0gJzwnKSB7CisgICAgaWYgKCFtX0RhdGEuZW1wdHkoKSkgeworICAgICAgTm90aWZ5RGF0YSgpOworICAgICAgQ2xlYXJEYXRhKCk7CisgICAgfQorICAgIFB1c2goKTsKKyAgICBtX2R3Tm9kZVBvcyA9IG1fRmlsZS5tX2R3Q3VyICsgbV9GaWxlLm1fZHdCdWZJbmRleDsKKyAgICBtX2VNb2RlID0gQ0ZYX1NheE1vZGU6Ok5vZGVTdGFydDsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fRGF0YS5lbXB0eSgpICYmIFNraXBTcGFjZShtX0N1ckJ5dGUpKQorICAgIHJldHVybjsKKworICBQYXJzZUNoYXIobV9DdXJCeXRlKTsKK30KKwordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZU5vZGVTdGFydCgpIHsKKyAgaWYgKG1fQ3VyQnl0ZSA9PSAnPycpIHsKKyAgICBHZXRDdXJyZW50SXRlbSgpLT5tX2VOb2RlID0gQ0ZYX1NBWEl0ZW06OlR5cGU6Okluc3RydWN0aW9uOworICAgIG1fZU1vZGUgPSBDRlhfU2F4TW9kZTo6VGFnTmFtZTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fQ3VyQnl0ZSA9PSAnIScpIHsKKyAgICBtX2VNb2RlID0gQ0ZYX1NheE1vZGU6OkRlY2xPckNvbW1lbnQ7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX0N1ckJ5dGUgPT0gJy8nKSB7CisgICAgbV9lTW9kZSA9IENGWF9TYXhNb2RlOjpUYWdFbmQ7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX0N1ckJ5dGUgPT0gJz4nKSB7CisgICAgUG9wKCk7CisgICAgbV9lTW9kZSA9IENGWF9TYXhNb2RlOjpUZXh0OworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9DdXJCeXRlID4gMHgyMCkgeworICAgIG1fZHdEYXRhT2Zmc2V0ID0gbV9GaWxlLm1fZHdCdWZJbmRleDsKKyAgICBHZXRDdXJyZW50SXRlbSgpLT5tX2VOb2RlID0gQ0ZYX1NBWEl0ZW06OlR5cGU6OlRhZzsKKyAgICBtX2VNb2RlID0gQ0ZYX1NheE1vZGU6OlRhZ05hbWU7CisgICAgQXBwZW5kVG9EYXRhKG1fQ3VyQnl0ZSk7CisgIH0KK30KKwordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZURlY2xPckNvbW1lbnQoKSB7CisgIGlmIChtX0N1ckJ5dGUgPT0gJy0nKSB7CisgICAgbV9lTW9kZSA9IENGWF9TYXhNb2RlOjpDb21tZW50OworICAgIEdldEN1cnJlbnRJdGVtKCktPm1fZU5vZGUgPSBDRlhfU0FYSXRlbTo6VHlwZTo6Q29tbWVudDsKKyAgICBpZiAoIW1fcENvbW1lbnRDb250ZXh0KQorICAgICAgbV9wQ29tbWVudENvbnRleHQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX1NBWENvbW1lbnRDb250ZXh0PigpOworICAgIG1fcENvbW1lbnRDb250ZXh0LT5tX2lIZWFkZXJDb3VudCA9IDE7CisgICAgbV9wQ29tbWVudENvbnRleHQtPm1faVRhaWxDb3VudCA9IDA7CisgICAgcmV0dXJuOworICB9CisgIG1fZU1vZGUgPSBDRlhfU2F4TW9kZTo6RGVjbE5vZGU7CisgIG1fZHdEYXRhT2Zmc2V0ID0gbV9GaWxlLm1fZHdCdWZJbmRleDsKKyAgbV9Ta2lwQ2hhciA9ICc+JzsKKyAgbV9Ta2lwU3RhY2sucHVzaCgnPicpOworICBTa2lwTm9kZSgpOworfQorCit2b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlQ29tbWVudCgpIHsKKyAgbV9wQ29tbWVudENvbnRleHQtPm1faUhlYWRlckNvdW50ID0gMjsKKyAgbV9kd05vZGVQb3MgPSBtX0ZpbGUubV9kd0N1ciArIG1fRmlsZS5tX2R3QnVmSW5kZXg7CisgIG1fZU1vZGUgPSBDRlhfU2F4TW9kZTo6Q29tbWVudENvbnRlbnQ7Cit9CisKK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VDb21tZW50Q29udGVudCgpIHsKKyAgaWYgKG1fQ3VyQnl0ZSA9PSAnLScpIHsKKyAgICBtX3BDb21tZW50Q29udGV4dC0+bV9pVGFpbENvdW50Kys7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX0N1ckJ5dGUgPT0gJz4nICYmIG1fcENvbW1lbnRDb250ZXh0LT5tX2lUYWlsQ291bnQgPT0gMikgeworICAgIE5vdGlmeVRhcmdldERhdGEoKTsKKyAgICBDbGVhckRhdGEoKTsKKyAgICBQb3AoKTsKKyAgICBtX2VNb2RlID0gQ0ZYX1NheE1vZGU6OlRleHQ7CisgICAgcmV0dXJuOworICB9CisgIHdoaWxlIChtX3BDb21tZW50Q29udGV4dC0+bV9pVGFpbENvdW50ID4gMCkgeworICAgIEFwcGVuZFRvRGF0YSgnLScpOworICAgIG1fcENvbW1lbnRDb250ZXh0LT5tX2lUYWlsQ291bnQtLTsKKyAgfQorICBBcHBlbmRUb0RhdGEobV9DdXJCeXRlKTsKK30KKwordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZURlY2xOb2RlKCkgeworICBTa2lwTm9kZSgpOworfQorCit2b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlVGFnTmFtZSgpIHsKKyAgaWYgKG1fQ3VyQnl0ZSA8IDB4MjEgfHwgbV9DdXJCeXRlID09ICcvJyB8fCBtX0N1ckJ5dGUgPT0gJz4nIHx8CisgICAgICBtX0N1ckJ5dGUgPT0gJz8nKSB7CisgICAgTm90aWZ5RW50ZXIoKTsKKyAgICBDbGVhckRhdGEoKTsKKyAgICBpZiAobV9DdXJCeXRlIDwgMHgyMSkgeworICAgICAgQ2xlYXJOYW1lKCk7CisgICAgICBtX2VNb2RlID0gQ0ZYX1NheE1vZGU6OlRhZ0F0dHJpYnV0ZU5hbWU7CisgICAgfSBlbHNlIGlmIChtX0N1ckJ5dGUgPT0gJy8nIHx8IG1fQ3VyQnl0ZSA9PSAnPycpIHsKKyAgICAgIG1fZVByZXZNb2RlID0gbV9lTW9kZTsKKyAgICAgIG1fZU1vZGUgPSBDRlhfU2F4TW9kZTo6VGFnTWF5YmVDbG9zZTsKKyAgICB9IGVsc2UgeworICAgICAgTm90aWZ5QnJlYWsoKTsKKyAgICAgIG1fZU1vZGUgPSBDRlhfU2F4TW9kZTo6VGV4dDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgQXBwZW5kVG9EYXRhKG1fQ3VyQnl0ZSk7CisgIH0KK30KKwordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ0F0dHJpYnV0ZU5hbWUoKSB7CisgIGlmIChtX0N1ckJ5dGUgPCAweDIxIHx8IG1fQ3VyQnl0ZSA9PSAnPScpIHsKKyAgICBpZiAobV9OYW1lLmVtcHR5KCkgJiYgbV9DdXJCeXRlIDwgMHgyMSkKKyAgICAgIHJldHVybjsKKworICAgIG1fU2tpcENoYXIgPSAwOworICAgIG1fZU1vZGUgPSBtX0N1ckJ5dGUgPT0gJz0nID8gQ0ZYX1NheE1vZGU6OlRhZ0F0dHJpYnV0ZVZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDRlhfU2F4TW9kZTo6VGFnQXR0cmlidXRlRXF1YWw7CisgICAgQ2xlYXJEYXRhKCk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX0N1ckJ5dGUgPT0gJy8nIHx8IG1fQ3VyQnl0ZSA9PSAnPicgfHwgbV9DdXJCeXRlID09ICc/JykgeworICAgIGlmIChtX0N1ckJ5dGUgPT0gJy8nIHx8IG1fQ3VyQnl0ZSA9PSAnPycpIHsKKyAgICAgIG1fZVByZXZNb2RlID0gbV9lTW9kZTsKKyAgICAgIG1fZU1vZGUgPSBDRlhfU2F4TW9kZTo6VGFnTWF5YmVDbG9zZTsKKyAgICB9IGVsc2UgeworICAgICAgTm90aWZ5QnJlYWsoKTsKKyAgICAgIG1fZU1vZGUgPSBDRlhfU2F4TW9kZTo6VGV4dDsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX05hbWUuZW1wdHkoKSkKKyAgICBtX2R3RGF0YU9mZnNldCA9IG1fRmlsZS5tX2R3QnVmSW5kZXg7CisgIEFwcGVuZFRvTmFtZShtX0N1ckJ5dGUpOworfQorCit2b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlVGFnQXR0cmlidXRlRXF1YWwoKSB7CisgIGlmIChtX0N1ckJ5dGUgPT0gJz0nKSB7CisgICAgbV9Ta2lwQ2hhciA9IDA7CisgICAgbV9lTW9kZSA9IENGWF9TYXhNb2RlOjpUYWdBdHRyaWJ1dGVWYWx1ZTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKEdldEN1cnJlbnRJdGVtKCktPm1fZU5vZGUgPT0gQ0ZYX1NBWEl0ZW06OlR5cGU6Okluc3RydWN0aW9uKSB7CisgICAgQXBwZW5kVG9OYW1lKDB4MjApOworICAgIG1fZU1vZGUgPSBDRlhfU2F4TW9kZTo6VGFyZ2V0RGF0YTsKKyAgICBQYXJzZVRhcmdldERhdGEoKTsKKyAgfQorfQorCit2b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlVGFnQXR0cmlidXRlVmFsdWUoKSB7CisgIGlmIChtX1NraXBDaGFyKSB7CisgICAgaWYgKG1fU2tpcENoYXIgPT0gbV9DdXJCeXRlKSB7CisgICAgICBOb3RpZnlBdHRyaWJ1dGUoKTsKKyAgICAgIENsZWFyRGF0YSgpOworICAgICAgQ2xlYXJOYW1lKCk7CisgICAgICBtX1NraXBDaGFyID0gMDsKKyAgICAgIG1fZU1vZGUgPSBDRlhfU2F4TW9kZTo6VGFnQXR0cmlidXRlTmFtZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgUGFyc2VDaGFyKG1fQ3VyQnl0ZSk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX0N1ckJ5dGUgPCAweDIxKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX0RhdGEuZW1wdHkoKSkgeworICAgIGlmIChtX0N1ckJ5dGUgPT0gJ1wnJyB8fCBtX0N1ckJ5dGUgPT0gJ1wiJykKKyAgICAgIG1fU2tpcENoYXIgPSBtX0N1ckJ5dGU7CisgIH0KK30KKwordm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZU1heWJlQ2xvc2UoKSB7CisgIGlmIChtX0N1ckJ5dGUgPT0gJz4nKSB7CisgICAgaWYgKEdldEN1cnJlbnRJdGVtKCktPm1fZU5vZGUgPT0gQ0ZYX1NBWEl0ZW06OlR5cGU6Okluc3RydWN0aW9uKSB7CisgICAgICBOb3RpZnlUYXJnZXREYXRhKCk7CisgICAgICBDbGVhckRhdGEoKTsKKyAgICAgIENsZWFyTmFtZSgpOworICAgIH0KKyAgICBQYXJzZVRhZ0Nsb3NlKCk7CisgICAgbV9lTW9kZSA9IENGWF9TYXhNb2RlOjpUZXh0OworICB9IGVsc2UgaWYgKG1fZVByZXZNb2RlID09IENGWF9TYXhNb2RlOjpUYWdOYW1lKSB7CisgICAgQXBwZW5kVG9EYXRhKCcvJyk7CisgICAgbV9lTW9kZSA9IENGWF9TYXhNb2RlOjpUYWdOYW1lOworICAgIG1fZVByZXZNb2RlID0gQ0ZYX1NheE1vZGU6OlRleHQ7CisgICAgUGFyc2VUYWdOYW1lKCk7CisgIH0gZWxzZSBpZiAobV9lUHJldk1vZGUgPT0gQ0ZYX1NheE1vZGU6OlRhZ0F0dHJpYnV0ZU5hbWUpIHsKKyAgICBBcHBlbmRUb05hbWUoJy8nKTsKKyAgICBtX2VNb2RlID0gQ0ZYX1NheE1vZGU6OlRhZ0F0dHJpYnV0ZU5hbWU7CisgICAgbV9lUHJldk1vZGUgPSBDRlhfU2F4TW9kZTo6VGV4dDsKKyAgICBQYXJzZVRhZ0F0dHJpYnV0ZU5hbWUoKTsKKyAgfSBlbHNlIGlmIChtX2VQcmV2TW9kZSA9PSBDRlhfU2F4TW9kZTo6VGFyZ2V0RGF0YSkgeworICAgIEFwcGVuZFRvTmFtZSgnPycpOworICAgIG1fZU1vZGUgPSBDRlhfU2F4TW9kZTo6VGFyZ2V0RGF0YTsKKyAgICBtX2VQcmV2TW9kZSA9IENGWF9TYXhNb2RlOjpUZXh0OworICAgIFBhcnNlVGFyZ2V0RGF0YSgpOworICB9Cit9Cit2b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlVGFnQ2xvc2UoKSB7CisgIG1fZHdOb2RlUG9zID0gbV9GaWxlLm1fZHdDdXIgKyBtX0ZpbGUubV9kd0J1ZkluZGV4OworICBOb3RpZnlDbG9zZSgpOworICBQb3AoKTsKK30KK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VUYWdFbmQoKSB7CisgIGlmIChtX0N1ckJ5dGUgPCAweDIxKSB7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX0N1ckJ5dGUgPT0gJz4nKSB7CisgICAgUG9wKCk7CisgICAgbV9kd05vZGVQb3MgPSBtX0ZpbGUubV9kd0N1ciArIG1fRmlsZS5tX2R3QnVmSW5kZXg7CisgICAgTm90aWZ5RW5kKCk7CisgICAgQ2xlYXJEYXRhKCk7CisgICAgUG9wKCk7CisgICAgbV9lTW9kZSA9IENGWF9TYXhNb2RlOjpUZXh0OworICB9IGVsc2UgeworICAgIFBhcnNlQ2hhcihtX0N1ckJ5dGUpOworICB9Cit9Cit2b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlVGFyZ2V0RGF0YSgpIHsKKyAgaWYgKG1fQ3VyQnl0ZSA9PSAnPycpIHsKKyAgICBtX2VQcmV2TW9kZSA9IG1fZU1vZGU7CisgICAgbV9lTW9kZSA9IENGWF9TYXhNb2RlOjpUYWdNYXliZUNsb3NlOworICB9IGVsc2UgeworICAgIEFwcGVuZFRvTmFtZShtX0N1ckJ5dGUpOworICB9Cit9Cit2b2lkIENGWF9TQVhSZWFkZXI6OlNraXBOb2RlKCkgeworICBpZiAobV9Ta2lwQ2hhciA9PSAnXCcnIHx8IG1fU2tpcENoYXIgPT0gJ1wiJykgeworICAgIGlmIChtX0N1ckJ5dGUgIT0gbV9Ta2lwQ2hhcikKKyAgICAgIHJldHVybjsKKworICAgIEFTU0VSVCghbV9Ta2lwU3RhY2suZW1wdHkoKSk7CisgICAgbV9Ta2lwU3RhY2sucG9wKCk7CisgICAgbV9Ta2lwQ2hhciA9ICFtX1NraXBTdGFjay5lbXB0eSgpID8gbV9Ta2lwU3RhY2sudG9wKCkgOiAwOworICAgIHJldHVybjsKKyAgfQorICBzd2l0Y2ggKG1fQ3VyQnl0ZSkgeworICAgIGNhc2UgJzwnOgorICAgICAgbV9Ta2lwQ2hhciA9ICc+JzsKKyAgICAgIG1fU2tpcFN0YWNrLnB1c2goJz4nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1snOgorICAgICAgbV9Ta2lwQ2hhciA9ICddJzsKKyAgICAgIG1fU2tpcFN0YWNrLnB1c2goJ10nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJygnOgorICAgICAgbV9Ta2lwQ2hhciA9ICcpJzsKKyAgICAgIG1fU2tpcFN0YWNrLnB1c2goJyknKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1wnJzoKKyAgICAgIG1fU2tpcENoYXIgPSAnXCcnOworICAgICAgbV9Ta2lwU3RhY2sucHVzaCgnXCcnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgJ1wiJzoKKyAgICAgIG1fU2tpcENoYXIgPSAnXCInOworICAgICAgbV9Ta2lwU3RhY2sucHVzaCgnXCInKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAobV9DdXJCeXRlID09IG1fU2tpcENoYXIpIHsKKyAgICAgICAgbV9Ta2lwU3RhY2sucG9wKCk7CisgICAgICAgIG1fU2tpcENoYXIgPSAhbV9Ta2lwU3RhY2suZW1wdHkoKSA/IG1fU2tpcFN0YWNrLnRvcCgpIDogMDsKKyAgICAgICAgaWYgKG1fU2tpcFN0YWNrLmVtcHR5KCkgJiYgbV9DdXJCeXRlID09ICc+JykgeworICAgICAgICAgIGlmIChtX0RhdGEuc2l6ZSgpID49IDkgJiYgbWVtY21wKG1fRGF0YS5kYXRhKCksICJbQ0RBVEFbIiwgNykgPT0gMCAmJgorICAgICAgICAgICAgICBtZW1jbXAobV9EYXRhLmRhdGEoKSArIG1fRGF0YS5zaXplKCkgLSAyLCAiXV0iLCAyKSA9PSAwKSB7CisgICAgICAgICAgICBQb3AoKTsKKyAgICAgICAgICAgIG1fRGF0YS5lcmFzZShtX0RhdGEuYmVnaW4oKSwgbV9EYXRhLmJlZ2luKCkgKyA3KTsKKyAgICAgICAgICAgIG1fRGF0YS5lcmFzZShtX0RhdGEuZW5kKCkgLSAyLCBtX0RhdGEuZW5kKCkpOworICAgICAgICAgICAgbV9iQ2hhckRhdGEgPSB0cnVlOworICAgICAgICAgICAgTm90aWZ5RGF0YSgpOworICAgICAgICAgICAgbV9iQ2hhckRhdGEgPSBmYWxzZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUG9wKCk7CisgICAgICAgICAgfQorICAgICAgICAgIENsZWFyRGF0YSgpOworICAgICAgICAgIG1fZU1vZGUgPSBDRlhfU2F4TW9kZTo6VGV4dDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKCFtX1NraXBTdGFjay5lbXB0eSgpKQorICAgIFBhcnNlQ2hhcihtX0N1ckJ5dGUpOworfQorCit2b2lkIENGWF9TQVhSZWFkZXI6Ok5vdGlmeURhdGEoKSB7CisgIGlmICghbV9wSGFuZGxlcikKKyAgICByZXR1cm47CisKKyAgQ0ZYX1NBWEl0ZW0qIHBJdGVtID0gR2V0Q3VycmVudEl0ZW0oKTsKKyAgaWYgKCFwSXRlbSkKKyAgICByZXR1cm47CisKKyAgaWYgKHBJdGVtLT5tX2VOb2RlID09IENGWF9TQVhJdGVtOjpUeXBlOjpUYWcpCisgICAgbV9wSGFuZGxlci0+T25UYWdEYXRhKAorICAgICAgICBwSXRlbS0+bV9wTm9kZSwKKyAgICAgICAgbV9iQ2hhckRhdGEgPyBDRlhfU0FYSXRlbTo6VHlwZTo6Q2hhckRhdGEgOiBDRlhfU0FYSXRlbTo6VHlwZTo6VGV4dCwKKyAgICAgICAgQnl0ZVN0cmluZ1ZpZXcobV9EYXRhKSwgbV9GaWxlLm1fZHdDdXIgKyBtX2R3RGF0YU9mZnNldCk7Cit9CisKK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6Tm90aWZ5RW50ZXIoKSB7CisgIGlmICghbV9wSGFuZGxlcikKKyAgICByZXR1cm47CisKKyAgQ0ZYX1NBWEl0ZW0qIHBJdGVtID0gR2V0Q3VycmVudEl0ZW0oKTsKKyAgaWYgKCFwSXRlbSkKKyAgICByZXR1cm47CisKKyAgaWYgKHBJdGVtLT5tX2VOb2RlID09IENGWF9TQVhJdGVtOjpUeXBlOjpUYWcgfHwKKyAgICAgIHBJdGVtLT5tX2VOb2RlID09IENGWF9TQVhJdGVtOjpUeXBlOjpJbnN0cnVjdGlvbikgeworICAgIHBJdGVtLT5tX3BOb2RlID0gbV9wSGFuZGxlci0+T25UYWdFbnRlcihCeXRlU3RyaW5nVmlldyhtX0RhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSXRlbS0+bV9lTm9kZSwgbV9kd05vZGVQb3MpOworICB9Cit9CisKK3ZvaWQgQ0ZYX1NBWFJlYWRlcjo6Tm90aWZ5QXR0cmlidXRlKCkgeworICBpZiAoIW1fcEhhbmRsZXIpCisgICAgcmV0dXJuOworCisgIENGWF9TQVhJdGVtKiBwSXRlbSA9IEdldEN1cnJlbnRJdGVtKCk7CisgIGlmICghcEl0ZW0pCisgICAgcmV0dXJuOworCisgIGlmIChwSXRlbS0+bV9lTm9kZSA9PSBDRlhfU0FYSXRlbTo6VHlwZTo6VGFnIHx8CisgICAgICBwSXRlbS0+bV9lTm9kZSA9PSBDRlhfU0FYSXRlbTo6VHlwZTo6SW5zdHJ1Y3Rpb24pIHsKKyAgICBtX3BIYW5kbGVyLT5PblRhZ0F0dHJpYnV0ZShwSXRlbS0+bV9wTm9kZSwgQnl0ZVN0cmluZ1ZpZXcobV9OYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nVmlldyhtX0RhdGEpKTsKKyAgfQorfQorCit2b2lkIENGWF9TQVhSZWFkZXI6Ok5vdGlmeUJyZWFrKCkgeworICBpZiAoIW1fcEhhbmRsZXIpCisgICAgcmV0dXJuOworCisgIENGWF9TQVhJdGVtKiBwSXRlbSA9IEdldEN1cnJlbnRJdGVtKCk7CisgIGlmICghcEl0ZW0pCisgICAgcmV0dXJuOworCisgIGlmIChwSXRlbS0+bV9lTm9kZSA9PSBDRlhfU0FYSXRlbTo6VHlwZTo6VGFnKQorICAgIG1fcEhhbmRsZXItPk9uVGFnQnJlYWsocEl0ZW0tPm1fcE5vZGUpOworfQorCit2b2lkIENGWF9TQVhSZWFkZXI6Ok5vdGlmeUNsb3NlKCkgeworICBpZiAoIW1fcEhhbmRsZXIpCisgICAgcmV0dXJuOworCisgIENGWF9TQVhJdGVtKiBwSXRlbSA9IEdldEN1cnJlbnRJdGVtKCk7CisgIGlmICghcEl0ZW0pCisgICAgcmV0dXJuOworCisgIGlmIChwSXRlbS0+bV9lTm9kZSA9PSBDRlhfU0FYSXRlbTo6VHlwZTo6VGFnIHx8CisgICAgICBwSXRlbS0+bV9lTm9kZSA9PSBDRlhfU0FYSXRlbTo6VHlwZTo6SW5zdHJ1Y3Rpb24pIHsKKyAgICBtX3BIYW5kbGVyLT5PblRhZ0Nsb3NlKHBJdGVtLT5tX3BOb2RlLCBtX2R3Tm9kZVBvcyk7CisgIH0KK30KKwordm9pZCBDRlhfU0FYUmVhZGVyOjpOb3RpZnlFbmQoKSB7CisgIGlmICghbV9wSGFuZGxlcikKKyAgICByZXR1cm47CisKKyAgQ0ZYX1NBWEl0ZW0qIHBJdGVtID0gR2V0Q3VycmVudEl0ZW0oKTsKKyAgaWYgKCFwSXRlbSkKKyAgICByZXR1cm47CisKKyAgaWYgKHBJdGVtLT5tX2VOb2RlID09IENGWF9TQVhJdGVtOjpUeXBlOjpUYWcpCisgICAgbV9wSGFuZGxlci0+T25UYWdFbmQocEl0ZW0tPm1fcE5vZGUsIEJ5dGVTdHJpbmdWaWV3KG1fRGF0YSksIG1fZHdOb2RlUG9zKTsKK30KKwordm9pZCBDRlhfU0FYUmVhZGVyOjpOb3RpZnlUYXJnZXREYXRhKCkgeworICBpZiAoIW1fcEhhbmRsZXIpCisgICAgcmV0dXJuOworCisgIENGWF9TQVhJdGVtKiBwSXRlbSA9IEdldEN1cnJlbnRJdGVtKCk7CisgIGlmICghcEl0ZW0pCisgICAgcmV0dXJuOworCisgIGlmIChwSXRlbS0+bV9lTm9kZSA9PSBDRlhfU0FYSXRlbTo6VHlwZTo6SW5zdHJ1Y3Rpb24pIHsKKyAgICBtX3BIYW5kbGVyLT5PblRhcmdldERhdGEocEl0ZW0tPm1fcE5vZGUsIHBJdGVtLT5tX2VOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nVmlldyhtX05hbWUpLCBtX2R3Tm9kZVBvcyk7CisgIH0gZWxzZSBpZiAocEl0ZW0tPm1fZU5vZGUgPT0gQ0ZYX1NBWEl0ZW06OlR5cGU6OkNvbW1lbnQpIHsKKyAgICBtX3BIYW5kbGVyLT5PblRhcmdldERhdGEocEl0ZW0tPm1fcE5vZGUsIHBJdGVtLT5tX2VOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nVmlldyhtX0RhdGEpLCBtX2R3Tm9kZVBvcyk7CisgIH0KK30KKwordm9pZCBDRlhfU0FYUmVhZGVyOjpTa2lwQ3VycmVudE5vZGUoKSB7CisgIENGWF9TQVhJdGVtKiBwSXRlbSA9IEdldEN1cnJlbnRJdGVtKCk7CisgIGlmIChwSXRlbSkKKyAgICBwSXRlbS0+bV9iU2tpcCA9IHRydWU7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L3htbC9jZnhfc2F4cmVhZGVyLmggYi9jb3JlL2Z4Y3J0L3htbC9jZnhfc2F4cmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZmNzU1ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQveG1sL2NmeF9zYXhyZWFkZXIuaApAQCAtMCwwICsxLDE3NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfWE1MX0NGWF9TQVhSRUFERVJfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9YTUxfQ0ZYX1NBWFJFQURFUl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0YWNrPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisKK2NsYXNzIENGWF9TQVhDb21tZW50Q29udGV4dDsKK2NsYXNzIENGWF9TQVhDb250ZXh0OworY2xhc3MgSUZYX1NlZWthYmxlUmVhZFN0cmVhbTsKK2VudW0gY2xhc3MgQ0ZYX1NheE1vZGU7CisKK2NsYXNzIENGWF9TQVhJdGVtIHsKKyBwdWJsaWM6CisgIGVudW0gY2xhc3MgVHlwZSB7CisgICAgVW5rbm93biA9IDAsCisgICAgSW5zdHJ1Y3Rpb24sCisgICAgRGVjbGFyYXRpb24sCisgICAgQ29tbWVudCwKKyAgICBUYWcsCisgICAgVGV4dCwKKyAgICBDaGFyRGF0YSwKKyAgfTsKKworICBleHBsaWNpdCBDRlhfU0FYSXRlbSh1aW50MzJfdCBpZCkKKyAgICAgIDogbV9wTm9kZShudWxscHRyKSwgbV9lTm9kZShUeXBlOjpVbmtub3duKSwgbV9kd0lEKGlkKSwgbV9iU2tpcChmYWxzZSkge30KKworICBDRlhfU0FYQ29udGV4dCogbV9wTm9kZTsKKyAgVHlwZSBtX2VOb2RlOworICBjb25zdCB1aW50MzJfdCBtX2R3SUQ7CisgIGJvb2wgbV9iU2tpcDsKK307CisKK2NsYXNzIENGWF9TQVhGaWxlIHsKKyBwdWJsaWM6CisgIENGWF9TQVhGaWxlKCk7CisgIH5DRlhfU0FYRmlsZSgpOworCisgIGJvb2wgU3RhcnRGaWxlKGNvbnN0IFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGUsCisgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhcnQsCisgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3TGVuKTsKKyAgYm9vbCBSZWFkTmV4dEJsb2NrKCk7CisgIHZvaWQgUmVzZXQoKTsKKworICBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gbV9wRmlsZTsKKyAgdWludDMyX3QgbV9kd1N0YXJ0OworICB1aW50MzJfdCBtX2R3RW5kOworICB1aW50MzJfdCBtX2R3Q3VyOworICB1aW50OF90KiBtX3BCdWY7CisgIHVpbnQzMl90IG1fZHdCdWZTaXplOworICB1aW50MzJfdCBtX2R3QnVmSW5kZXg7Cit9OworCitlbnVtIENGWF9TYXhQYXJzZU1vZGUgeworICBDRlhfU2F4UGFyc2VNb2RlX05vdENvbnZlcnRfYW1wID0gMSA8PCAwLAorICBDRlhfU2F4UGFyc2VNb2RlX05vdENvbnZlcnRfbHQgPSAxIDw8IDEsCisgIENGWF9TYXhQYXJzZU1vZGVfTm90Q29udmVydF9ndCA9IDEgPDwgMiwKKyAgQ0ZYX1NheFBhcnNlTW9kZV9Ob3RDb252ZXJ0X2Fwb3MgPSAxIDw8IDMsCisgIENGWF9TYXhQYXJzZU1vZGVfTm90Q29udmVydF9xdW90ID0gMSA8PCA0LAorICBDRlhfU2F4UGFyc2VNb2RlX05vdENvbnZlcnRfc2hhcnAgPSAxIDw8IDUsCisgIENGWF9TYXhQYXJzZU1vZGVfTm90U2tpcFNwYWNlID0gMSA8PCA2Cit9OworCitjbGFzcyBDRlhfU0FYUmVhZGVyIHsKKyBwdWJsaWM6CisgIGNsYXNzIEhhbmRsZXJJZmFjZSB7CisgICBwdWJsaWM6CisgICAgdmlydHVhbCB+SGFuZGxlcklmYWNlKCkge30KKyAgICB2aXJ0dWFsIENGWF9TQVhDb250ZXh0KiBPblRhZ0VudGVyKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBic1RhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfU0FYSXRlbTo6VHlwZSBlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhcnRQb3MpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgT25UYWdBdHRyaWJ1dGUoQ0ZYX1NBWENvbnRleHQqIHBUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBic0F0dHJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgYnNWYWx1ZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBPblRhZ0JyZWFrKENGWF9TQVhDb250ZXh0KiBwVGFnKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIE9uVGFnRGF0YShDRlhfU0FYQ29udGV4dCogcFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9TQVhJdGVtOjpUeXBlIGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhcnRQb3MpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgT25UYWdDbG9zZShDRlhfU0FYQ29udGV4dCogcFRhZywgdWludDMyX3QgZHdFbmRQb3MpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgT25UYWdFbmQoQ0ZYX1NBWENvbnRleHQqIHBUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBic1RhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RW5kUG9zKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIE9uVGFyZ2V0RGF0YShDRlhfU0FYQ29udGV4dCogcFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9TQVhJdGVtOjpUeXBlIGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhcnRQb3MpID0gMDsKKyAgfTsKKworICBDRlhfU0FYUmVhZGVyKCk7CisgIH5DRlhfU0FYUmVhZGVyKCk7CisKKyAgaW50MzJfdCBTdGFydFBhcnNlKGNvbnN0IFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGUsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXJ0ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3TGVuID0gLTEsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1BhcnNlTW9kZSA9IDApOworICBpbnQzMl90IENvbnRpbnVlUGFyc2UoKTsKKyAgdm9pZCBTZXRIYW5kbGVyKEhhbmRsZXJJZmFjZSogcEhhbmRsZXIpIHsgbV9wSGFuZGxlciA9IHBIYW5kbGVyOyB9CisKKyBwcml2YXRlOgorICB2b2lkIFBhcnNlSW50ZXJuYWwoKTsKKyAgdm9pZCBTa2lwQ3VycmVudE5vZGUoKTsKKyAgdm9pZCBBcHBlbmREYXRhKHVpbnQ4X3QgY2gpOworICB2b2lkIEFwcGVuZE5hbWUodWludDhfdCBjaCk7CisgIHZvaWQgUGFyc2VUZXh0KCk7CisgIHZvaWQgUGFyc2VOb2RlU3RhcnQoKTsKKyAgdm9pZCBQYXJzZUluc3RydWN0aW9uKCk7CisgIHZvaWQgUGFyc2VEZWNsT3JDb21tZW50KCk7CisgIHZvaWQgUGFyc2VEZWNsTm9kZSgpOworICB2b2lkIFBhcnNlQ29tbWVudCgpOworICB2b2lkIFBhcnNlQ29tbWVudENvbnRlbnQoKTsKKyAgdm9pZCBQYXJzZVRhZ05hbWUoKTsKKyAgdm9pZCBQYXJzZVRhZ0F0dHJpYnV0ZU5hbWUoKTsKKyAgdm9pZCBQYXJzZVRhZ0F0dHJpYnV0ZUVxdWFsKCk7CisgIHZvaWQgUGFyc2VUYWdBdHRyaWJ1dGVWYWx1ZSgpOworICB2b2lkIFBhcnNlTWF5YmVDbG9zZSgpOworICB2b2lkIFBhcnNlVGFnQ2xvc2UoKTsKKyAgdm9pZCBQYXJzZVRhZ0VuZCgpOworICB2b2lkIFBhcnNlVGFyZ2V0RGF0YSgpOworICB2b2lkIFJlc2V0KCk7CisgIHZvaWQgQ2xlYXJEYXRhKCk7CisgIHZvaWQgQ2xlYXJOYW1lKCk7CisgIHZvaWQgQXBwZW5kVG9EYXRhKHVpbnQ4X3QgY2gpOworICB2b2lkIEFwcGVuZFRvTmFtZSh1aW50OF90IGNoKTsKKyAgdm9pZCBCYWNrVXBBbmRSZXBsYWNlRGF0YUF0KGludDMyX3QgaW5kZXgsIHVpbnQ4X3QgY2gpOworICBib29sIElzRW50aXR5U3RhcnQodWludDhfdCBjaCkgY29uc3Q7CisgIGJvb2wgSXNFbnRpdHlFbmQodWludDhfdCBjaCkgY29uc3Q7CisgIGludDMyX3QgQ3VycmVudERhdGFJbmRleCgpIGNvbnN0OworICB2b2lkIFB1c2goKTsKKyAgdm9pZCBQb3AoKTsKKyAgQ0ZYX1NBWEl0ZW0qIEdldEN1cnJlbnRJdGVtKCkgY29uc3Q7CisgIGJvb2wgU2tpcFNwYWNlKHVpbnQ4X3QgY2gpOworICB2b2lkIFNraXBOb2RlKCk7CisgIHZvaWQgTm90aWZ5RGF0YSgpOworICB2b2lkIE5vdGlmeUVudGVyKCk7CisgIHZvaWQgTm90aWZ5QXR0cmlidXRlKCk7CisgIHZvaWQgTm90aWZ5QnJlYWsoKTsKKyAgdm9pZCBOb3RpZnlDbG9zZSgpOworICB2b2lkIE5vdGlmeUVuZCgpOworICB2b2lkIE5vdGlmeVRhcmdldERhdGEoKTsKKyAgdm9pZCBSZWFsbG9jRGF0YUJ1ZmZlcigpOworICB2b2lkIFJlYWxsb2NOYW1lQnVmZmVyKCk7CisgIHZvaWQgUGFyc2VDaGFyKHVpbnQ4X3QgY2gpOworCisgIENGWF9TQVhGaWxlIG1fRmlsZTsKKyAgSGFuZGxlcklmYWNlKiBtX3BIYW5kbGVyOworICBpbnQzMl90IG1faVN0YXRlOworICBzdGQ6OnN0YWNrPHN0ZDo6dW5pcXVlX3B0cjxDRlhfU0FYSXRlbT4+IG1fU3RhY2s7CisgIHVpbnQzMl90IG1fZHdJdGVtSUQ7CisgIENGWF9TYXhNb2RlIG1fZU1vZGU7CisgIENGWF9TYXhNb2RlIG1fZVByZXZNb2RlOworICBib29sIG1fYkNoYXJEYXRhOworICB1aW50OF90IG1fQ3VyQnl0ZTsKKyAgdWludDMyX3QgbV9kd0RhdGFPZmZzZXQ7CisgIHN0ZDo6c3RhY2s8Y2hhcj4gbV9Ta2lwU3RhY2s7CisgIHVpbnQ4X3QgbV9Ta2lwQ2hhcjsKKyAgdWludDMyX3QgbV9kd05vZGVQb3M7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1fRGF0YTsKKyAgaW50MzJfdCBtX2lFbnRpdHlTdGFydDsgIC8vIEluZGV4IGludG8gbV9EYXRhLgorICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtX05hbWU7CisgIHVpbnQzMl90IG1fZHdQYXJzZU1vZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfU0FYQ29tbWVudENvbnRleHQ+IG1fcENvbW1lbnRDb250ZXh0OworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX1hNTF9DRlhfU0FYUkVBREVSX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L3htbC9jZnhfc2F4cmVhZGVyX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnhjcnQveG1sL2NmeF9zYXhyZWFkZXJfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZDA2MzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L3htbC9jZnhfc2F4cmVhZGVyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDE1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgVGhlIFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF9zYXhyZWFkZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9tZW1vcnlzdHJlYW0uaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5oIgorCit1c2luZyB0ZXN0aW5nOjpfOwordXNpbmcgdGVzdGluZzo6RXE7Cit1c2luZyB0ZXN0aW5nOjpSZXR1cm47CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vY2tIYW5kbGVyIDogcHVibGljIENGWF9TQVhSZWFkZXI6OkhhbmRsZXJJZmFjZSB7CisgcHVibGljOgorICBNT0NLX01FVEhPRDMoT25UYWdFbnRlciwKKyAgICAgICAgICAgICAgIENGWF9TQVhDb250ZXh0Kihjb25zdCBCeXRlU3RyaW5nVmlldyYgYnNUYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9TQVhJdGVtOjpUeXBlIGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhcnRQb3MpKTsKKyAgTU9DS19NRVRIT0QzKE9uVGFnQXR0cmlidXRlLAorICAgICAgICAgICAgICAgdm9pZChDRlhfU0FYQ29udGV4dCogcFRhZywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzQXR0cmksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBic1ZhbHVlKSk7CisgIE1PQ0tfTUVUSE9EMShPblRhZ0JyZWFrLCB2b2lkKENGWF9TQVhDb250ZXh0KiBwVGFnKSk7CisgIE1PQ0tfTUVUSE9ENChPblRhZ0RhdGEsCisgICAgICAgICAgICAgICB2b2lkKENGWF9TQVhDb250ZXh0KiBwVGFnLAorICAgICAgICAgICAgICAgICAgICBDRlhfU0FYSXRlbTo6VHlwZSBlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGFydFBvcykpOworICBNT0NLX01FVEhPRDIoT25UYWdDbG9zZSwgdm9pZChDRlhfU0FYQ29udGV4dCogcFRhZywgdWludDMyX3QgZHdFbmRQb3MpKTsKKyAgTU9DS19NRVRIT0QzKE9uVGFnRW5kLAorICAgICAgICAgICAgICAgdm9pZChDRlhfU0FYQ29udGV4dCogcFRhZywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdFbmRQb3MpKTsKKyAgTU9DS19NRVRIT0Q0KE9uVGFyZ2V0RGF0YSwKKyAgICAgICAgICAgICAgIHZvaWQoQ0ZYX1NBWENvbnRleHQqIHBUYWcsCisgICAgICAgICAgICAgICAgICAgIENGWF9TQVhJdGVtOjpUeXBlIGVUeXBlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgYnNEYXRhLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXJ0UG9zKSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQ0ZYX1NBWFJlYWRlclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICB2b2lkIFNldEhhbmRsZXIoQ0ZYX1NBWFJlYWRlcjo6SGFuZGxlcklmYWNlKiBoYW5kbGVyKSB7CisgICAgcmVhZGVyXy5TZXRIYW5kbGVyKGhhbmRsZXIpOworICB9CisKKyAgYm9vbCBTdGFydFBhcnNlKGNoYXIqIHN0cikgeworICAgIHJldHVybiByZWFkZXJfLlN0YXJ0UGFyc2UoCisgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX01lbW9yeVN0cmVhbT4oCisgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oc3RyKSwgc3RybGVuKHN0ciksIGZhbHNlKSwKKyAgICAgICAgICAgICAgIDAsIHN0YXRpY19jYXN0PHVpbnQzMl90PigtMSksCisgICAgICAgICAgICAgICBDRlhfU2F4UGFyc2VNb2RlX05vdFNraXBTcGFjZSkgPj0gMDsKKyAgfQorCisgIGludDMyX3QgQ29udGludWVQYXJzZSgpIHsKKyAgICBpbnQzMl90IHJldDsKKyAgICBkbyB7CisgICAgICByZXQgPSByZWFkZXJfLkNvbnRpbnVlUGFyc2UoKTsKKyAgICB9IHdoaWxlIChyZXQgPj0gMCAmJiByZXQgPCAxMDApOworICAgIHJldHVybiByZXQ7CisgIH0KKworIHByaXZhdGU6CisgIENGWF9TQVhSZWFkZXIgcmVhZGVyXzsKK307CisKK1RFU1RfRihDRlhfU0FYUmVhZGVyVGVzdCwgTnVsbCkgeworICBjaGFyIGRhdGFbXSA9ICIiOworICBBU1NFUlRfRkFMU0UoU3RhcnRQYXJzZShkYXRhKSk7Cit9CisKK1RFU1RfRihDRlhfU0FYUmVhZGVyVGVzdCwgU2ltcGxlVGV4dCkgeworICBNb2NrSGFuZGxlciBtb2NrOworICBTZXRIYW5kbGVyKCZtb2NrKTsKKworICBjaGFyIGRhdGFbXSA9ICJjbGFtcyI7CisgIEFTU0VSVF9UUlVFKFN0YXJ0UGFyc2UoZGF0YSkpOworICBFWFBFQ1RfRVEoMTAwLCBDb250aW51ZVBhcnNlKCkpOworfQorCitURVNUX0YoQ0ZYX1NBWFJlYWRlclRlc3QsIFNpbXBsZVRhZykgeworICBNb2NrSGFuZGxlciBtb2NrOworICBFWFBFQ1RfQ0FMTChtb2NrLCBPblRhZ0VudGVyKEVxKCJjbGFtcyIpLCBfLCBfKSk7CisgIEVYUEVDVF9DQUxMKG1vY2ssIE9uVGFnQnJlYWsoXykpOworICBTZXRIYW5kbGVyKCZtb2NrKTsKKworICBjaGFyIGRhdGFbXSA9ICI8Y2xhbXM+IjsKKyAgQVNTRVJUX1RSVUUoU3RhcnRQYXJzZShkYXRhKSk7CisgIEVYUEVDVF9FUSgxMDAsIENvbnRpbnVlUGFyc2UoKSk7Cit9CisKK1RFU1RfRihDRlhfU0FYUmVhZGVyVGVzdCwgQXR0cmlidXRlVGFnKSB7CisgIE1vY2tIYW5kbGVyIG1vY2s7CisgIEVYUEVDVF9DQUxMKG1vY2ssIE9uVGFnRW50ZXIoRXEoImNsYW1zIiksIF8sIF8pKTsKKyAgRVhQRUNUX0NBTEwobW9jaywgT25UYWdBdHRyaWJ1dGUoXywgRXEoInNpemUiKSwgRXEoInNtYWxsIikpKTsKKyAgRVhQRUNUX0NBTEwobW9jaywgT25UYWdBdHRyaWJ1dGUoXywgRXEoImNvbG9yIiksIEVxKCJyZWQiKSkpOworICBFWFBFQ1RfQ0FMTChtb2NrLCBPblRhZ0JyZWFrKF8pKTsKKyAgU2V0SGFuZGxlcigmbW9jayk7CisKKyAgY2hhciBkYXRhW10gPSAiPGNsYW1zIHNpemU9J3NtYWxsJyBjb2xvcj0ncmVkJz4iOworICBBU1NFUlRfVFJVRShTdGFydFBhcnNlKGRhdGEpKTsKKyAgRVhQRUNUX0VRKDEwMCwgQ29udGludWVQYXJzZSgpKTsKK30KKworVEVTVF9GKENGWF9TQVhSZWFkZXJUZXN0LCBBdHRyaWJ1dGVFbnRpdHlUYWcpIHsKKyAgTW9ja0hhbmRsZXIgbW9jazsKKyAgRVhQRUNUX0NBTEwobW9jaywgT25UYWdFbnRlcihFcSgiY2xhbXMiKSwgXywgXykpOworICBFWFBFQ1RfQ0FMTChtb2NrLCBPblRhZ0F0dHJpYnV0ZShfLCBFcSgicHJlZGljYXRlIiksIEVxKCIxIDwgMiIpKSk7CisgIEVYUEVDVF9DQUxMKG1vY2ssIE9uVGFnQnJlYWsoXykpOworICBTZXRIYW5kbGVyKCZtb2NrKTsKKworICBjaGFyIGRhdGFbXSA9ICI8Y2xhbXMgcHJlZGljYXRlPScxICZsdDsgMic+IjsKKyAgQVNTRVJUX1RSVUUoU3RhcnRQYXJzZShkYXRhKSk7CisgIEVYUEVDVF9FUSgxMDAsIENvbnRpbnVlUGFyc2UoKSk7Cit9CisKK1RFU1RfRihDRlhfU0FYUmVhZGVyVGVzdCwgVGV4dFdpdGhpblRhZykgeworICBNb2NrSGFuZGxlciBtb2NrOworICBFWFBFQ1RfQ0FMTChtb2NrLCBPblRhZ0VudGVyKEVxKCJiIiksIF8sIF8pKTsKKyAgRVhQRUNUX0NBTEwobW9jaywgT25UYWdCcmVhayhfKSk7CisgIEVYUEVDVF9DQUxMKG1vY2ssIE9uVGFnRGF0YShfLCBfLCBFcSgiYmlmZiIpLCBfKSk7CisgIEVYUEVDVF9DQUxMKG1vY2ssIE9uVGFnRW5kKF8sIEVxKCJiIiksIF8pKTsKKyAgU2V0SGFuZGxlcigmbW9jayk7CisKKyAgY2hhciBkYXRhW10gPSAiPGI+YmlmZjwvYj4iOworICBBU1NFUlRfVFJVRShTdGFydFBhcnNlKGRhdGEpKTsKKyAgRVhQRUNUX0VRKDEwMCwgQ29udGludWVQYXJzZSgpKTsKK30KKworVEVTVF9GKENGWF9TQVhSZWFkZXJUZXN0LCBidWdfNzExNDU5KSB7CisgIGNoYXIgZGF0YVtdID0KKyAgICAgICImYTx0YWcgIgorICAgICAgImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSIKKyAgICAgICJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiCisgICAgICAiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIgorICAgICAgImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSIKKyAgICAgICJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiCisgICAgICAiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIgorICAgICAgImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSIKKyAgICAgICJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEiCisgICAgICAiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhIgorICAgICAgImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSIKKyAgICAgICI+eDsiOworICBBU1NFUlRfVFJVRShTdGFydFBhcnNlKGRhdGEpKTsKKyAgRVhQRUNUX0VRKDEwMCwgQ29udGludWVQYXJzZSgpKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQveG1sL2NmeF9zYXhyZWFkZXJoYW5kbGVyLmNwcCBiL2NvcmUvZnhjcnQveG1sL2NmeF9zYXhyZWFkZXJoYW5kbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjU1Y2U5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC94bWwvY2Z4X3NheHJlYWRlcmhhbmRsZXIuY3BwCkBAIC0wLDAgKzEsMTI4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfc2F4cmVhZGVyaGFuZGxlci5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfY2hlY2tzdW1jb250ZXh0LmgiCisKK0NGWF9TQVhSZWFkZXJIYW5kbGVyOjpDRlhfU0FYUmVhZGVySGFuZGxlcihDRlhfQ2hlY2tzdW1Db250ZXh0KiBwQ29udGV4dCkKKyAgICA6IG1fcENvbnRleHQocENvbnRleHQpIHsKKyAgQVNTRVJUKG1fcENvbnRleHQpOworfQorCitDRlhfU0FYUmVhZGVySGFuZGxlcjo6fkNGWF9TQVhSZWFkZXJIYW5kbGVyKCkge30KKworQ0ZYX1NBWENvbnRleHQqIENGWF9TQVhSZWFkZXJIYW5kbGVyOjpPblRhZ0VudGVyKAorICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBic1RhZ05hbWUsCisgICAgQ0ZYX1NBWEl0ZW06OlR5cGUgZVR5cGUsCisgICAgdWludDMyX3QgZHdTdGFydFBvcykgeworICBVcGRhdGVDaGVja3N1bSh0cnVlKTsKKyAgaWYgKGVUeXBlICE9IENGWF9TQVhJdGVtOjpUeXBlOjpUYWcgJiYKKyAgICAgIGVUeXBlICE9IENGWF9TQVhJdGVtOjpUeXBlOjpJbnN0cnVjdGlvbikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgbV9TQVhDb250ZXh0Lm1fZU5vZGUgPSBlVHlwZTsKKyAgbV9TQVhDb250ZXh0Lm1fVGV4dEJ1ZiA8PCAiPCI7CisgIGlmIChlVHlwZSA9PSBDRlhfU0FYSXRlbTo6VHlwZTo6SW5zdHJ1Y3Rpb24pCisgICAgbV9TQVhDb250ZXh0Lm1fVGV4dEJ1ZiA8PCAiPyI7CisKKyAgbV9TQVhDb250ZXh0Lm1fVGV4dEJ1ZiA8PCBic1RhZ05hbWU7CisgIG1fU0FYQ29udGV4dC5tX2JzVGFnTmFtZSA9IGJzVGFnTmFtZTsKKyAgcmV0dXJuICZtX1NBWENvbnRleHQ7Cit9CisKK3ZvaWQgQ0ZYX1NBWFJlYWRlckhhbmRsZXI6Ok9uVGFnQXR0cmlidXRlKENGWF9TQVhDb250ZXh0KiBwVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzQXR0cmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgYnNWYWx1ZSkgeworICBpZiAoIXBUYWcpCisgICAgcmV0dXJuOworICBwVGFnLT5tX1RleHRCdWYgPDwgIiAiIDw8IGJzQXR0cmkgPDwgIj1cIiIgPDwgYnNWYWx1ZSA8PCAiXCIiOworfQorCit2b2lkIENGWF9TQVhSZWFkZXJIYW5kbGVyOjpPblRhZ0JyZWFrKENGWF9TQVhDb250ZXh0KiBwVGFnKSB7CisgIGlmICghcFRhZykKKyAgICByZXR1cm47CisKKyAgcFRhZy0+bV9UZXh0QnVmIDw8ICI+IjsKKyAgVXBkYXRlQ2hlY2tzdW0oZmFsc2UpOworfQorCit2b2lkIENGWF9TQVhSZWFkZXJIYW5kbGVyOjpPblRhZ0RhdGEoQ0ZYX1NBWENvbnRleHQqIHBUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1NBWEl0ZW06OlR5cGUgZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXJ0UG9zKSB7CisgIGlmICghcFRhZykKKyAgICByZXR1cm47CisKKyAgaWYgKGVUeXBlID09IENGWF9TQVhJdGVtOjpUeXBlOjpDaGFyRGF0YSkKKyAgICBwVGFnLT5tX1RleHRCdWYgPDwgIjwhW0NEQVRBWyI7CisKKyAgcFRhZy0+bV9UZXh0QnVmIDw8IGJzRGF0YTsKKyAgaWYgKGVUeXBlID09IENGWF9TQVhJdGVtOjpUeXBlOjpDaGFyRGF0YSkKKyAgICBwVGFnLT5tX1RleHRCdWYgPDwgIl1dPiI7Cit9CisKK3ZvaWQgQ0ZYX1NBWFJlYWRlckhhbmRsZXI6Ok9uVGFnQ2xvc2UoQ0ZYX1NBWENvbnRleHQqIHBUYWcsIHVpbnQzMl90IGR3RW5kUG9zKSB7CisgIGlmICghcFRhZykKKyAgICByZXR1cm47CisKKyAgaWYgKHBUYWctPm1fZU5vZGUgPT0gQ0ZYX1NBWEl0ZW06OlR5cGU6Okluc3RydWN0aW9uKQorICAgIHBUYWctPm1fVGV4dEJ1ZiA8PCAiPz4iOworICBlbHNlIGlmIChwVGFnLT5tX2VOb2RlID09IENGWF9TQVhJdGVtOjpUeXBlOjpUYWcpCisgICAgcFRhZy0+bV9UZXh0QnVmIDw8ICI+PC8iIDw8IHBUYWctPm1fYnNUYWdOYW1lLkFzU3RyaW5nVmlldygpIDw8ICI+IjsKKworICBVcGRhdGVDaGVja3N1bShmYWxzZSk7Cit9CisKK3ZvaWQgQ0ZYX1NBWFJlYWRlckhhbmRsZXI6Ok9uVGFnRW5kKENGWF9TQVhDb250ZXh0KiBwVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RW5kUG9zKSB7CisgIGlmICghcFRhZykKKyAgICByZXR1cm47CisKKyAgcFRhZy0+bV9UZXh0QnVmIDw8ICI8LyIgPDwgYnNUYWdOYW1lIDw8ICI+IjsKKyAgVXBkYXRlQ2hlY2tzdW0oZmFsc2UpOworfQorCit2b2lkIENGWF9TQVhSZWFkZXJIYW5kbGVyOjpPblRhcmdldERhdGEoQ0ZYX1NBWENvbnRleHQqIHBUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1NBWEl0ZW06OlR5cGUgZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXJ0UG9zKSB7CisgIGlmICghcFRhZyAmJiBlVHlwZSAhPSBDRlhfU0FYSXRlbTo6VHlwZTo6Q29tbWVudCkKKyAgICByZXR1cm47CisKKyAgaWYgKGVUeXBlID09IENGWF9TQVhJdGVtOjpUeXBlOjpDb21tZW50KSB7CisgICAgbV9TQVhDb250ZXh0Lm1fVGV4dEJ1ZiA8PCAiPCEtLSIgPDwgYnNEYXRhIDw8ICItLT4iOworICAgIFVwZGF0ZUNoZWNrc3VtKGZhbHNlKTsKKyAgfSBlbHNlIHsKKyAgICBwVGFnLT5tX1RleHRCdWYgPDwgIiAiIDw8IGJzRGF0YTsKKyAgfQorfQorCit2b2lkIENGWF9TQVhSZWFkZXJIYW5kbGVyOjpVcGRhdGVDaGVja3N1bShib29sIGJDaGVja1NwYWNlKSB7CisgIGludDMyX3QgaUxlbmd0aCA9IG1fU0FYQ29udGV4dC5tX1RleHRCdWYudGVsbHAoKTsKKyAgaWYgKGlMZW5ndGggPCAxKQorICAgIHJldHVybjsKKworICBzdGQ6OnN0cmluZyBzQnVmZmVyID0gbV9TQVhDb250ZXh0Lm1fVGV4dEJ1Zi5zdHIoKTsKKyAgY29uc3QgdWludDhfdCogcEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHNCdWZmZXIuY19zdHIoKSk7CisgIGJvb2wgYlVwZGF0YSA9IHRydWU7CisgIGlmIChiQ2hlY2tTcGFjZSkgeworICAgIGJVcGRhdGEgPSBmYWxzZTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGVuZ3RoOyBpKyspIHsKKyAgICAgIGJVcGRhdGEgPSAocEJ1ZmZlcltpXSA+IDB4MjApOworICAgICAgaWYgKGJVcGRhdGEpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoYlVwZGF0YSkKKyAgICBtX3BDb250ZXh0LT5VcGRhdGUoQnl0ZVN0cmluZ1ZpZXcocEJ1ZmZlciwgaUxlbmd0aCkpOworCisgIG1fU0FYQ29udGV4dC5tX1RleHRCdWYuc3RyKCIiKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQveG1sL2NmeF9zYXhyZWFkZXJoYW5kbGVyLmggYi9jb3JlL2Z4Y3J0L3htbC9jZnhfc2F4cmVhZGVyaGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MzAwOGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L3htbC9jZnhfc2F4cmVhZGVyaGFuZGxlci5oCkBAIC0wLDAgKzEsNDggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX1hNTF9DRlhfU0FYUkVBREVSSEFORExFUl9IXworI2RlZmluZSBDT1JFX0ZYQ1JUX1hNTF9DRlhfU0FYUkVBREVSSEFORExFUl9IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfc2F4Y29udGV4dC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF9zYXhyZWFkZXIuaCIKKworY2xhc3MgQ0ZYX0NoZWNrc3VtQ29udGV4dDsKKworY2xhc3MgQ0ZYX1NBWFJlYWRlckhhbmRsZXIgOiBwdWJsaWMgQ0ZYX1NBWFJlYWRlcjo6SGFuZGxlcklmYWNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENGWF9TQVhSZWFkZXJIYW5kbGVyKENGWF9DaGVja3N1bUNvbnRleHQqIHBDb250ZXh0KTsKKyAgfkNGWF9TQVhSZWFkZXJIYW5kbGVyKCkgb3ZlcnJpZGU7CisKKyAgQ0ZYX1NBWENvbnRleHQqIE9uVGFnRW50ZXIoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1NBWEl0ZW06OlR5cGUgZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhcnRQb3MpIG92ZXJyaWRlOworICB2b2lkIE9uVGFnQXR0cmlidXRlKENGWF9TQVhDb250ZXh0KiBwVGFnLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBic0F0dHJpLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBic1ZhbHVlKSBvdmVycmlkZTsKKyAgdm9pZCBPblRhZ0JyZWFrKENGWF9TQVhDb250ZXh0KiBwVGFnKSBvdmVycmlkZTsKKyAgdm9pZCBPblRhZ0RhdGEoQ0ZYX1NBWENvbnRleHQqIHBUYWcsCisgICAgICAgICAgICAgICAgIENGWF9TQVhJdGVtOjpUeXBlIGVUeXBlLAorICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgYnNEYXRhLAorICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXJ0UG9zKSBvdmVycmlkZTsKKyAgdm9pZCBPblRhZ0Nsb3NlKENGWF9TQVhDb250ZXh0KiBwVGFnLCB1aW50MzJfdCBkd0VuZFBvcykgb3ZlcnJpZGU7CisgIHZvaWQgT25UYWdFbmQoQ0ZYX1NBWENvbnRleHQqIHBUYWcsCisgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzVGFnTmFtZSwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0VuZFBvcykgb3ZlcnJpZGU7CisgIHZvaWQgT25UYXJnZXREYXRhKENGWF9TQVhDb250ZXh0KiBwVGFnLAorICAgICAgICAgICAgICAgICAgICBDRlhfU0FYSXRlbTo6VHlwZSBlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGFydFBvcykgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICB2b2lkIFVwZGF0ZUNoZWNrc3VtKGJvb2wgYkNoZWNrU3BhY2UpOworCisgIENGWF9DaGVja3N1bUNvbnRleHQqIG1fcENvbnRleHQ7CisgIENGWF9TQVhDb250ZXh0IG1fU0FYQ29udGV4dDsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWENSVF9YTUxfQ0ZYX1NBWFJFQURFUkhBTkRMRVJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQveG1sL2NmeF94bWxhdHRyaWJ1dGVub2RlLmNwcCBiL2NvcmUvZnhjcnQveG1sL2NmeF94bWxhdHRyaWJ1dGVub2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTA0NzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC94bWwvY2Z4X3htbGF0dHJpYnV0ZW5vZGUuY3BwCkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWxhdHRyaWJ1dGVub2RlLmgiCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorCitDRlhfWE1MQXR0cmlidXRlTm9kZTo6Q0ZYX1hNTEF0dHJpYnV0ZU5vZGUoY29uc3QgV2lkZVN0cmluZyYgbmFtZSkKKyAgICA6IENGWF9YTUxOb2RlKCksIG5hbWVfKG5hbWUpIHsKKyAgQVNTRVJUKG5hbWVfLkdldExlbmd0aCgpID4gMCk7Cit9CisKK0NGWF9YTUxBdHRyaWJ1dGVOb2RlOjp+Q0ZYX1hNTEF0dHJpYnV0ZU5vZGUoKSB7fQorCitib29sIENGWF9YTUxBdHRyaWJ1dGVOb2RlOjpIYXNBdHRyaWJ1dGUoY29uc3QgV2lkZVN0cmluZyYgbmFtZSkgY29uc3QgeworICByZXR1cm4gYXR0cnNfLmZpbmQobmFtZSkgIT0gYXR0cnNfLmVuZCgpOworfQorCitXaWRlU3RyaW5nIENGWF9YTUxBdHRyaWJ1dGVOb2RlOjpHZXRTdHJpbmcoY29uc3QgV2lkZVN0cmluZyYgbmFtZSkgY29uc3QgeworICBhdXRvIGl0ID0gYXR0cnNfLmZpbmQobmFtZSk7CisgIHJldHVybiBpdCAhPSBhdHRyc18uZW5kKCkgPyBpdC0+c2Vjb25kIDogV2lkZVN0cmluZygpOworfQorCit2b2lkIENGWF9YTUxBdHRyaWJ1dGVOb2RlOjpTZXRTdHJpbmcoY29uc3QgV2lkZVN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB2YWx1ZSkgeworICBhdHRyc19bbmFtZV0gPSB2YWx1ZTsKK30KKwordm9pZCBDRlhfWE1MQXR0cmlidXRlTm9kZTo6UmVtb3ZlQXR0cmlidXRlKGNvbnN0IFdpZGVTdHJpbmcmIG5hbWUpIHsKKyAgYXR0cnNfLmVyYXNlKG5hbWUpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC94bWwvY2Z4X3htbGF0dHJpYnV0ZW5vZGUuaCBiL2NvcmUvZnhjcnQveG1sL2NmeF94bWxhdHRyaWJ1dGVub2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFjOWI4NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQveG1sL2NmeF94bWxhdHRyaWJ1dGVub2RlLmgKQEAgLTAsMCArMSw0NCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfWE1MX0NGWF9YTUxBVFRSSUJVVEVOT0RFX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfWE1MX0NGWF9YTUxBVFRSSUJVVEVOT0RFX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sbm9kZS5oIgorCitjbGFzcyBDRlhfWE1MQXR0cmlidXRlTm9kZSA6IHB1YmxpYyBDRlhfWE1MTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDRlhfWE1MQXR0cmlidXRlTm9kZShjb25zdCBXaWRlU3RyaW5nJiBuYW1lKTsKKyAgfkNGWF9YTUxBdHRyaWJ1dGVOb2RlKCkgb3ZlcnJpZGU7CisKKyAgLy8gQ0ZYX1hNTE5vZGUKKyAgRlhfWE1MTk9ERVRZUEUgR2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlID0gMDsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWF9YTUxOb2RlPiBDbG9uZSgpIG92ZXJyaWRlID0gMDsKKworICBXaWRlU3RyaW5nIEdldE5hbWUoKSBjb25zdCB7IHJldHVybiBuYW1lXzsgfQorICBjb25zdCBzdGQ6Om1hcDxXaWRlU3RyaW5nLCBXaWRlU3RyaW5nPiYgR2V0QXR0cmlidXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gYXR0cnNfOworICB9CisgIHZvaWQgU2V0QXR0cmlidXRlcyhjb25zdCBzdGQ6Om1hcDxXaWRlU3RyaW5nLCBXaWRlU3RyaW5nPiYgYXR0cnMpIHsKKyAgICBhdHRyc18gPSBhdHRyczsKKyAgfQorICBib29sIEhhc0F0dHJpYnV0ZShjb25zdCBXaWRlU3RyaW5nJiBuYW1lKSBjb25zdDsKKworICB2b2lkIFNldFN0cmluZyhjb25zdCBXaWRlU3RyaW5nJiBuYW1lLCBjb25zdCBXaWRlU3RyaW5nJiB2YWx1ZSk7CisgIFdpZGVTdHJpbmcgR2V0U3RyaW5nKGNvbnN0IFdpZGVTdHJpbmcmIG5hbWUpIGNvbnN0OworCisgIHZvaWQgUmVtb3ZlQXR0cmlidXRlKGNvbnN0IFdpZGVTdHJpbmcmIG5hbWUpOworCisgcHJpdmF0ZToKKyAgV2lkZVN0cmluZyBuYW1lXzsKKyAgc3RkOjptYXA8V2lkZVN0cmluZywgV2lkZVN0cmluZz4gYXR0cnNfOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX1hNTF9DRlhfWE1MQVRUUklCVVRFTk9ERV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC94bWwvY2Z4X3htbGNoYXJkYXRhLmNwcCBiL2NvcmUvZnhjcnQveG1sL2NmeF94bWxjaGFyZGF0YS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAyZDEzOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQveG1sL2NmeF94bWxjaGFyZGF0YS5jcHAKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbGNoYXJkYXRhLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK0NGWF9YTUxDaGFyRGF0YTo6Q0ZYX1hNTENoYXJEYXRhKGNvbnN0IFdpZGVTdHJpbmcmIHdzQ0RhdGEpCisgICAgOiBDRlhfWE1MVGV4dCh3c0NEYXRhKSB7fQorCitDRlhfWE1MQ2hhckRhdGE6On5DRlhfWE1MQ2hhckRhdGEoKSB7fQorCitGWF9YTUxOT0RFVFlQRSBDRlhfWE1MQ2hhckRhdGE6OkdldFR5cGUoKSBjb25zdCB7CisgIHJldHVybiBGWF9YTUxOT0RFX0NoYXJEYXRhOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1hNTE5vZGU+IENGWF9YTUxDaGFyRGF0YTo6Q2xvbmUoKSB7CisgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX1hNTENoYXJEYXRhPihHZXRUZXh0KCkpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC94bWwvY2Z4X3htbGNoYXJkYXRhLmggYi9jb3JlL2Z4Y3J0L3htbC9jZnhfeG1sY2hhcmRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQ3MTBmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC94bWwvY2Z4X3htbGNoYXJkYXRhLmgKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfWE1MX0NGWF9YTUxDSEFSREFUQV9IXworI2RlZmluZSBDT1JFX0ZYQ1JUX1hNTF9DRlhfWE1MQ0hBUkRBVEFfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbHRleHQuaCIKKworY2xhc3MgQ0ZYX1hNTENoYXJEYXRhIDogcHVibGljIENGWF9YTUxUZXh0IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENGWF9YTUxDaGFyRGF0YShjb25zdCBXaWRlU3RyaW5nJiB3c0NEYXRhKTsKKyAgfkNGWF9YTUxDaGFyRGF0YSgpIG92ZXJyaWRlOworCisgIEZYX1hNTE5PREVUWVBFIEdldFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWF9YTUxOb2RlPiBDbG9uZSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX1hNTF9DRlhfWE1MQ0hBUkRBVEFfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQveG1sL2NmeF94bWxkb2MuY3BwIGIvY29yZS9meGNydC94bWwvY2Z4X3htbGRvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZjMzYwNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQveG1sL2NmeF94bWxkb2MuY3BwCkBAIC0wLDAgKzEsMTYwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sZG9jLmgiCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29kZXBhZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sY2hhcmRhdGEuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sZWxlbWVudC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWxpbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWxub2RlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbHRleHQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorCitDRlhfWE1MRG9jOjpDRlhfWE1MRG9jKCkKKyAgICA6IG1faVN0YXR1cygwKSwgbV9wUm9vdChwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX1hNTE5vZGU+KCkpIHsKKyAgbV9wUm9vdC0+SW5zZXJ0Q2hpbGROb2RlKG5ldyBDRlhfWE1MSW5zdHJ1Y3Rpb24oTCJ4bWwiKSk7Cit9CisKK0NGWF9YTUxEb2M6On5DRlhfWE1MRG9jKCkge30KKworYm9vbCBDRlhfWE1MRG9jOjpMb2FkWE1MKHN0ZDo6dW5pcXVlX3B0cjxDRlhfWE1MUGFyc2VyPiBwWE1MUGFyc2VyKSB7CisgIGlmICghcFhNTFBhcnNlcikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbV9pU3RhdHVzID0gMDsKKyAgbV9wU3RyZWFtLlJlc2V0KCk7CisgIG1fcFJvb3QtPkRlbGV0ZUNoaWxkcmVuKCk7CisgIG1fcFhNTFBhcnNlciA9IHN0ZDo6bW92ZShwWE1MUGFyc2VyKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2ludDMyX3QgQ0ZYX1hNTERvYzo6RG9Mb2FkKCkgeworICBpZiAobV9pU3RhdHVzIDwgMTAwKQorICAgIG1faVN0YXR1cyA9IG1fcFhNTFBhcnNlci0+RG9QYXJzZXIoKTsKKworICByZXR1cm4gbV9pU3RhdHVzOworfQorCit2b2lkIENGWF9YTUxEb2M6OkNsb3NlWE1MKCkgeworICBtX3BYTUxQYXJzZXIucmVzZXQoKTsKK30KKwordm9pZCBDRlhfWE1MRG9jOjpTYXZlWE1MTm9kZSgKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX1NlZWthYmxlU3RyZWFtUHJveHk+JiBwWE1MU3RyZWFtLAorICAgIENGWF9YTUxOb2RlKiBwSU5vZGUpIHsKKyAgQ0ZYX1hNTE5vZGUqIHBOb2RlID0gKENGWF9YTUxOb2RlKilwSU5vZGU7CisgIHN3aXRjaCAocE5vZGUtPkdldFR5cGUoKSkgeworICAgIGNhc2UgRlhfWE1MTk9ERV9JbnN0cnVjdGlvbjogeworICAgICAgQ0ZYX1hNTEluc3RydWN0aW9uKiBwSW5zdHJ1Y3Rpb24gPSAoQ0ZYX1hNTEluc3RydWN0aW9uKilwTm9kZTsKKyAgICAgIGlmIChwSW5zdHJ1Y3Rpb24tPkdldE5hbWUoKS5Db21wYXJlTm9DYXNlKEwieG1sIikgPT0gMCkgeworICAgICAgICBXaWRlU3RyaW5nIHdzID0gTCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCIiOworICAgICAgICB1aW50MTZfdCB3Q29kZVBhZ2UgPSBwWE1MU3RyZWFtLT5HZXRDb2RlUGFnZSgpOworICAgICAgICBpZiAod0NvZGVQYWdlID09IEZYX0NPREVQQUdFX1VURjE2TEUpIHsKKyAgICAgICAgICB3cyArPSBMIlVURi0xNiI7CisgICAgICAgIH0gZWxzZSBpZiAod0NvZGVQYWdlID09IEZYX0NPREVQQUdFX1VURjE2QkUpIHsKKyAgICAgICAgICB3cyArPSBMIlVURi0xNmJlIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB3cyArPSBMIlVURi04IjsKKyAgICAgICAgfQorICAgICAgICB3cyArPSBMIlwiPz4iOworICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cy5Bc1N0cmluZ1ZpZXcoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBXaWRlU3RyaW5nIHdzID0KKyAgICAgICAgICAgIFdpZGVTdHJpbmc6OkZvcm1hdChMIjw/JWxzIiwgcEluc3RydWN0aW9uLT5HZXROYW1lKCkuY19zdHIoKSk7CisgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLkFzU3RyaW5nVmlldygpKTsKKworICAgICAgICBmb3IgKGF1dG8gaXQgOiBwSW5zdHJ1Y3Rpb24tPkdldEF0dHJpYnV0ZXMoKSkgeworICAgICAgICAgIFdpZGVTdHJpbmcgd3NWYWx1ZSA9IGl0LnNlY29uZDsKKyAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCImIiwgTCImYW1wOyIpOworICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIjwiLCBMIiZsdDsiKTsKKyAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCI+IiwgTCImZ3Q7Iik7CisgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiXCciLCBMIiZhcG9zOyIpOworICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIlwiIiwgTCImcXVvdDsiKTsKKworICAgICAgICAgIHdzID0gTCIgIjsKKyAgICAgICAgICB3cyArPSBpdC5maXJzdDsKKyAgICAgICAgICB3cyArPSBMIj1cIiI7CisgICAgICAgICAgd3MgKz0gd3NWYWx1ZTsKKyAgICAgICAgICB3cyArPSBMIlwiIjsKKyAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cy5Bc1N0cmluZ1ZpZXcoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8gdGFyZ2V0IDogcEluc3RydWN0aW9uLT5HZXRUYXJnZXREYXRhKCkpIHsKKyAgICAgICAgICB3cyA9IEwiIFwiIjsKKyAgICAgICAgICB3cyArPSB0YXJnZXQ7CisgICAgICAgICAgd3MgKz0gTCJcIiI7CisgICAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MuQXNTdHJpbmdWaWV3KCkpOworICAgICAgICB9CisgICAgICAgIHdzID0gTCI/PiI7CisgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLkFzU3RyaW5nVmlldygpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZYX1hNTE5PREVfRWxlbWVudDogeworICAgICAgV2lkZVN0cmluZyB3czsKKyAgICAgIHdzID0gTCI8IjsKKyAgICAgIHdzICs9IHN0YXRpY19jYXN0PENGWF9YTUxFbGVtZW50Kj4ocE5vZGUpLT5HZXROYW1lKCk7CisgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cy5Bc1N0cmluZ1ZpZXcoKSk7CisKKyAgICAgIGZvciAoYXV0byBpdCA6IHN0YXRpY19jYXN0PENGWF9YTUxFbGVtZW50Kj4ocE5vZGUpLT5HZXRBdHRyaWJ1dGVzKCkpIHsKKyAgICAgICAgV2lkZVN0cmluZyB3c1ZhbHVlID0gaXQuc2Vjb25kOworICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCImIiwgTCImYW1wOyIpOworICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCI8IiwgTCImbHQ7Iik7CisgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIj4iLCBMIiZndDsiKTsKKyAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiXCciLCBMIiZhcG9zOyIpOworICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCJcIiIsIEwiJnF1b3Q7Iik7CisKKyAgICAgICAgd3MgPSBMIiAiOworICAgICAgICB3cyArPSBpdC5maXJzdDsKKyAgICAgICAgd3MgKz0gTCI9XCIiOworICAgICAgICB3cyArPSB3c1ZhbHVlOworICAgICAgICB3cyArPSBMIlwiIjsKKyAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MuQXNTdHJpbmdWaWV3KCkpOworICAgICAgfQorICAgICAgaWYgKHBOb2RlLT5tX3BDaGlsZCkgeworICAgICAgICB3cyA9IEwiXG4+IjsKKyAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MuQXNTdHJpbmdWaWV3KCkpOworICAgICAgICBDRlhfWE1MTm9kZSogcENoaWxkID0gcE5vZGUtPm1fcENoaWxkOworICAgICAgICB3aGlsZSAocENoaWxkKSB7CisgICAgICAgICAgU2F2ZVhNTE5vZGUocFhNTFN0cmVhbSwgc3RhdGljX2Nhc3Q8Q0ZYX1hNTE5vZGUqPihwQ2hpbGQpKTsKKyAgICAgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPm1fcE5leHQ7CisgICAgICAgIH0KKyAgICAgICAgd3MgPSBMIjwvIjsKKyAgICAgICAgd3MgKz0gc3RhdGljX2Nhc3Q8Q0ZYX1hNTEVsZW1lbnQqPihwTm9kZSktPkdldE5hbWUoKTsKKyAgICAgICAgd3MgKz0gTCJcbj4iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgd3MgPSBMIlxuLz4iOworICAgICAgfQorICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MuQXNTdHJpbmdWaWV3KCkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRlhfWE1MTk9ERV9UZXh0OiB7CisgICAgICBXaWRlU3RyaW5nIHdzID0gc3RhdGljX2Nhc3Q8Q0ZYX1hNTFRleHQqPihwTm9kZSktPkdldFRleHQoKTsKKyAgICAgIHdzLlJlcGxhY2UoTCImIiwgTCImYW1wOyIpOworICAgICAgd3MuUmVwbGFjZShMIjwiLCBMIiZsdDsiKTsKKyAgICAgIHdzLlJlcGxhY2UoTCI+IiwgTCImZ3Q7Iik7CisgICAgICB3cy5SZXBsYWNlKEwiXCciLCBMIiZhcG9zOyIpOworICAgICAgd3MuUmVwbGFjZShMIlwiIiwgTCImcXVvdDsiKTsKKyAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLkFzU3RyaW5nVmlldygpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZYX1hNTE5PREVfQ2hhckRhdGE6IHsKKyAgICAgIFdpZGVTdHJpbmcgd3MgPSBMIjwhW0NEQVRBWyI7CisgICAgICB3cyArPSBzdGF0aWNfY2FzdDxDRlhfWE1MQ2hhckRhdGEqPihwTm9kZSktPkdldFRleHQoKTsKKyAgICAgIHdzICs9IEwiXV0+IjsKKyAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLkFzU3RyaW5nVmlldygpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZYX1hNTE5PREVfVW5rbm93bjoKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQveG1sL2NmeF94bWxkb2MuaCBiL2NvcmUvZnhjcnQveG1sL2NmeF94bWxkb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGRlN2ZkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC94bWwvY2Z4X3htbGRvYy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX1hNTF9DRlhfWE1MRE9DX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfWE1MX0NGWF9YTUxET0NfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3NlZWthYmxlc3RyZWFtcHJveHkuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sbm9kZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWxwYXJzZXIuaCIKKworY2xhc3MgQ0ZYX1hNTERvYyB7CisgcHVibGljOgorICBDRlhfWE1MRG9jKCk7CisgIH5DRlhfWE1MRG9jKCk7CisKKyAgYm9vbCBMb2FkWE1MKHN0ZDo6dW5pcXVlX3B0cjxDRlhfWE1MUGFyc2VyPiBwWE1MUGFyc2VyKTsKKyAgaW50MzJfdCBEb0xvYWQoKTsKKyAgdm9pZCBDbG9zZVhNTCgpOworCisgIENGWF9YTUxOb2RlKiBHZXRSb290KCkgY29uc3QgeyByZXR1cm4gbV9wUm9vdC5nZXQoKTsgfQorICB2b2lkIFNhdmVYTUxOb2RlKGNvbnN0IFJldGFpblB0cjxDRlhfU2Vla2FibGVTdHJlYW1Qcm94eT4mIHBYTUxTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgQ0ZYX1hNTE5vZGUqIHBOb2RlKTsKKworIHByaXZhdGU6CisgIGludDMyX3QgbV9pU3RhdHVzOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1hNTE5vZGU+IG1fcFJvb3Q7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfWE1MUGFyc2VyPiBtX3BYTUxQYXJzZXI7CisgIFJldGFpblB0cjxDRlhfU2Vla2FibGVTdHJlYW1Qcm94eT4gbV9wU3RyZWFtOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX1hNTF9DRlhfWE1MRE9DX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L3htbC9jZnhfeG1sZWxlbWVudC5jcHAgYi9jb3JlL2Z4Y3J0L3htbC9jZnhfeG1sZWxlbWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMxN2U5YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQveG1sL2NmeF94bWxlbGVtZW50LmNwcApAQCAtMCwwICsxLDEwMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbGVsZW1lbnQuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF93aWRldGV4dGJ1Zi5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbGNoYXJkYXRhLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbHRleHQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorCitDRlhfWE1MRWxlbWVudDo6Q0ZYX1hNTEVsZW1lbnQoY29uc3QgV2lkZVN0cmluZyYgd3NUYWcpCisgICAgOiBDRlhfWE1MQXR0cmlidXRlTm9kZSh3c1RhZykge30KKworQ0ZYX1hNTEVsZW1lbnQ6On5DRlhfWE1MRWxlbWVudCgpIHt9CisKK0ZYX1hNTE5PREVUWVBFIENGWF9YTUxFbGVtZW50OjpHZXRUeXBlKCkgY29uc3QgeworICByZXR1cm4gRlhfWE1MTk9ERV9FbGVtZW50OworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1hNTE5vZGU+IENGWF9YTUxFbGVtZW50OjpDbG9uZSgpIHsKKyAgYXV0byBwQ2xvbmUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX1hNTEVsZW1lbnQ+KEdldE5hbWUoKSk7CisgIHBDbG9uZS0+U2V0QXR0cmlidXRlcyhHZXRBdHRyaWJ1dGVzKCkpOworCisgIFdpZGVTdHJpbmcgd3NUZXh0OworICBDRlhfWE1MTm9kZSogcENoaWxkID0gbV9wQ2hpbGQ7CisgIHdoaWxlIChwQ2hpbGQpIHsKKyAgICBzd2l0Y2ggKHBDaGlsZC0+R2V0VHlwZSgpKSB7CisgICAgICBjYXNlIEZYX1hNTE5PREVfVGV4dDoKKyAgICAgICAgd3NUZXh0ICs9IHN0YXRpY19jYXN0PENGWF9YTUxUZXh0Kj4ocENoaWxkKS0+R2V0VGV4dCgpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBwQ2hpbGQgPSBwQ2hpbGQtPm1fcE5leHQ7CisgIH0KKyAgcENsb25lLT5TZXRUZXh0RGF0YSh3c1RleHQpOworICByZXR1cm4gc3RkOjptb3ZlKHBDbG9uZSk7Cit9CisKK1dpZGVTdHJpbmcgQ0ZYX1hNTEVsZW1lbnQ6OkdldExvY2FsVGFnTmFtZSgpIGNvbnN0IHsKKyAgYXV0byBwb3MgPSBHZXROYW1lKCkuRmluZChMJzonKTsKKyAgcmV0dXJuIHBvcy5oYXNfdmFsdWUoKQorICAgICAgICAgICAgID8gR2V0TmFtZSgpLlJpZ2h0KEdldE5hbWUoKS5HZXRMZW5ndGgoKSAtIHBvcy52YWx1ZSgpIC0gMSkKKyAgICAgICAgICAgICA6IEdldE5hbWUoKTsKK30KKworV2lkZVN0cmluZyBDRlhfWE1MRWxlbWVudDo6R2V0TmFtZXNwYWNlUHJlZml4KCkgY29uc3QgeworICBhdXRvIHBvcyA9IEdldE5hbWUoKS5GaW5kKEwnOicpOworICByZXR1cm4gcG9zLmhhc192YWx1ZSgpID8gR2V0TmFtZSgpLkxlZnQocG9zLnZhbHVlKCkpIDogV2lkZVN0cmluZygpOworfQorCitXaWRlU3RyaW5nIENGWF9YTUxFbGVtZW50OjpHZXROYW1lc3BhY2VVUkkoKSBjb25zdCB7CisgIFdpZGVTdHJpbmcgd3NBdHRyaShMInhtbG5zIik7CisgIFdpZGVTdHJpbmcgd3NQcmVmaXggPSBHZXROYW1lc3BhY2VQcmVmaXgoKTsKKyAgaWYgKHdzUHJlZml4LkdldExlbmd0aCgpID4gMCkgeworICAgIHdzQXR0cmkgKz0gTCI6IjsKKyAgICB3c0F0dHJpICs9IHdzUHJlZml4OworICB9CisKKyAgYXV0byogcE5vZGUgPSBzdGF0aWNfY2FzdDxjb25zdCBDRlhfWE1MTm9kZSo+KHRoaXMpOworICB3aGlsZSAocE5vZGUpIHsKKyAgICBpZiAocE5vZGUtPkdldFR5cGUoKSAhPSBGWF9YTUxOT0RFX0VsZW1lbnQpCisgICAgICBicmVhazsKKworICAgIGF1dG8qIHBFbGVtZW50ID0gc3RhdGljX2Nhc3Q8Y29uc3QgQ0ZYX1hNTEVsZW1lbnQqPihwTm9kZSk7CisgICAgaWYgKCFwRWxlbWVudC0+SGFzQXR0cmlidXRlKHdzQXR0cmkpKSB7CisgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShDRlhfWE1MTm9kZTo6UGFyZW50KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICByZXR1cm4gcEVsZW1lbnQtPkdldFN0cmluZyh3c0F0dHJpKTsKKyAgfQorICByZXR1cm4gV2lkZVN0cmluZygpOworfQorCitXaWRlU3RyaW5nIENGWF9YTUxFbGVtZW50OjpHZXRUZXh0RGF0YSgpIGNvbnN0IHsKKyAgQ0ZYX1dpZGVUZXh0QnVmIGJ1ZmZlcjsKKyAgQ0ZYX1hNTE5vZGUqIHBDaGlsZCA9IG1fcENoaWxkOworICB3aGlsZSAocENoaWxkKSB7CisgICAgc3dpdGNoIChwQ2hpbGQtPkdldFR5cGUoKSkgeworICAgICAgY2FzZSBGWF9YTUxOT0RFX1RleHQ6CisgICAgICBjYXNlIEZYX1hNTE5PREVfQ2hhckRhdGE6CisgICAgICAgIGJ1ZmZlciA8PCBzdGF0aWNfY2FzdDxDRlhfWE1MVGV4dCo+KHBDaGlsZCktPkdldFRleHQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0OworICB9CisgIHJldHVybiBidWZmZXIuTWFrZVN0cmluZygpOworfQorCit2b2lkIENGWF9YTUxFbGVtZW50OjpTZXRUZXh0RGF0YShjb25zdCBXaWRlU3RyaW5nJiB3c1RleHQpIHsKKyAgaWYgKHdzVGV4dC5HZXRMZW5ndGgoKSA8IDEpCisgICAgcmV0dXJuOworICBJbnNlcnRDaGlsZE5vZGUobmV3IENGWF9YTUxUZXh0KHdzVGV4dCkpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC94bWwvY2Z4X3htbGVsZW1lbnQuaCBiL2NvcmUvZnhjcnQveG1sL2NmeF94bWxlbGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllM2FmNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQveG1sL2NmeF94bWxlbGVtZW50LmgKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfWE1MX0NGWF9YTUxFTEVNRU5UX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfWE1MX0NGWF9YTUxFTEVNRU5UX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sYXR0cmlidXRlbm9kZS5oIgorCitjbGFzcyBDRlhfWE1MRWxlbWVudCA6IHB1YmxpYyBDRlhfWE1MQXR0cmlidXRlTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDRlhfWE1MRWxlbWVudChjb25zdCBXaWRlU3RyaW5nJiB3c1RhZyk7CisgIH5DRlhfWE1MRWxlbWVudCgpIG92ZXJyaWRlOworCisgIC8vIENGWF9YTUxOb2RlCisgIEZYX1hNTE5PREVUWVBFIEdldFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWF9YTUxOb2RlPiBDbG9uZSgpIG92ZXJyaWRlOworCisgIFdpZGVTdHJpbmcgR2V0TG9jYWxUYWdOYW1lKCkgY29uc3Q7CisgIFdpZGVTdHJpbmcgR2V0TmFtZXNwYWNlUHJlZml4KCkgY29uc3Q7CisgIFdpZGVTdHJpbmcgR2V0TmFtZXNwYWNlVVJJKCkgY29uc3Q7CisKKyAgV2lkZVN0cmluZyBHZXRUZXh0RGF0YSgpIGNvbnN0OworICB2b2lkIFNldFRleHREYXRhKGNvbnN0IFdpZGVTdHJpbmcmIHdzVGV4dCk7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfWE1MX0NGWF9YTUxFTEVNRU5UX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L3htbC9jZnhfeG1saW5zdHJ1Y3Rpb24uY3BwIGIvY29yZS9meGNydC94bWwvY2Z4X3htbGluc3RydWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWE0YTJlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC94bWwvY2Z4X3htbGluc3RydWN0aW9uLmNwcApAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1saW5zdHJ1Y3Rpb24uaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisKK0NGWF9YTUxJbnN0cnVjdGlvbjo6Q0ZYX1hNTEluc3RydWN0aW9uKGNvbnN0IFdpZGVTdHJpbmcmIHdzVGFyZ2V0KQorICAgIDogQ0ZYX1hNTEF0dHJpYnV0ZU5vZGUod3NUYXJnZXQpIHt9CisKK0NGWF9YTUxJbnN0cnVjdGlvbjo6fkNGWF9YTUxJbnN0cnVjdGlvbigpIHt9CisKK0ZYX1hNTE5PREVUWVBFIENGWF9YTUxJbnN0cnVjdGlvbjo6R2V0VHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEZYX1hNTE5PREVfSW5zdHJ1Y3Rpb247Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxDRlhfWE1MTm9kZT4gQ0ZYX1hNTEluc3RydWN0aW9uOjpDbG9uZSgpIHsKKyAgYXV0byBwQ2xvbmUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX1hNTEluc3RydWN0aW9uPihHZXROYW1lKCkpOworICBwQ2xvbmUtPlNldEF0dHJpYnV0ZXMoR2V0QXR0cmlidXRlcygpKTsKKyAgcENsb25lLT5tX1RhcmdldERhdGEgPSBtX1RhcmdldERhdGE7CisgIHJldHVybiBzdGQ6Om1vdmUocENsb25lKTsKK30KKwordm9pZCBDRlhfWE1MSW5zdHJ1Y3Rpb246OkFwcGVuZERhdGEoY29uc3QgV2lkZVN0cmluZyYgd3NEYXRhKSB7CisgIG1fVGFyZ2V0RGF0YS5wdXNoX2JhY2sod3NEYXRhKTsKK30KKwordm9pZCBDRlhfWE1MSW5zdHJ1Y3Rpb246OlJlbW92ZURhdGEoaW50MzJfdCBpbmRleCkgeworICBpZiAocGRmaXVtOjpJbmRleEluQm91bmRzKG1fVGFyZ2V0RGF0YSwgaW5kZXgpKQorICAgIG1fVGFyZ2V0RGF0YS5lcmFzZShtX1RhcmdldERhdGEuYmVnaW4oKSArIGluZGV4KTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQveG1sL2NmeF94bWxpbnN0cnVjdGlvbi5oIGIvY29yZS9meGNydC94bWwvY2Z4X3htbGluc3RydWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyN2RhZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQveG1sL2NmeF94bWxpbnN0cnVjdGlvbi5oCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX1hNTF9DRlhfWE1MSU5TVFJVQ1RJT05fSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9YTUxfQ0ZYX1hNTElOU1RSVUNUSU9OX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sYXR0cmlidXRlbm9kZS5oIgorCitjbGFzcyBDRlhfWE1MSW5zdHJ1Y3Rpb24gOiBwdWJsaWMgQ0ZYX1hNTEF0dHJpYnV0ZU5vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0ZYX1hNTEluc3RydWN0aW9uKGNvbnN0IFdpZGVTdHJpbmcmIHdzVGFyZ2V0KTsKKyAgfkNGWF9YTUxJbnN0cnVjdGlvbigpIG92ZXJyaWRlOworCisgIC8vIENGWF9YTUxOb2RlCisgIEZYX1hNTE5PREVUWVBFIEdldFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWF9YTUxOb2RlPiBDbG9uZSgpIG92ZXJyaWRlOworCisgIGNvbnN0IHN0ZDo6dmVjdG9yPFdpZGVTdHJpbmc+JiBHZXRUYXJnZXREYXRhKCkgY29uc3QgeyByZXR1cm4gbV9UYXJnZXREYXRhOyB9CisgIHZvaWQgQXBwZW5kRGF0YShjb25zdCBXaWRlU3RyaW5nJiB3c0RhdGEpOworICB2b2lkIFJlbW92ZURhdGEoaW50MzJfdCBpbmRleCk7CisKKyBwcml2YXRlOgorICBzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nPiBtX1RhcmdldERhdGE7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfWE1MX0NGWF9YTUxJTlNUUlVDVElPTl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC94bWwvY2Z4X3htbG5vZGUuY3BwIGIvY29yZS9meGNydC94bWwvY2Z4X3htbG5vZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxODg5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L3htbC9jZnhfeG1sbm9kZS5jcHAKQEAgLTAsMCArMSw0MzkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWxub2RlLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2NvZGVwYWdlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbGNoYXJkYXRhLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbGVsZW1lbnQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1saW5zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sdGV4dC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKKworQ0ZYX1hNTE5vZGU6OkNGWF9YTUxOb2RlKCkKKyAgICA6IG1fcFBhcmVudChudWxscHRyKSwKKyAgICAgIG1fcENoaWxkKG51bGxwdHIpLAorICAgICAgbV9wUHJpb3IobnVsbHB0ciksCisgICAgICBtX3BOZXh0KG51bGxwdHIpIHt9CisKK0ZYX1hNTE5PREVUWVBFIENGWF9YTUxOb2RlOjpHZXRUeXBlKCkgY29uc3QgeworICByZXR1cm4gRlhfWE1MTk9ERV9Vbmtub3duOworfQorCitDRlhfWE1MTm9kZTo6fkNGWF9YTUxOb2RlKCkgeworICBEZWxldGVDaGlsZHJlbigpOworfQorCit2b2lkIENGWF9YTUxOb2RlOjpEZWxldGVDaGlsZHJlbigpIHsKKyAgQ0ZYX1hNTE5vZGUqIHBDaGlsZCA9IG1fcENoaWxkOworICB3aGlsZSAocENoaWxkKSB7CisgICAgQ0ZYX1hNTE5vZGUqIHBOZXh0ID0gcENoaWxkLT5tX3BOZXh0OworICAgIGRlbGV0ZSBwQ2hpbGQ7CisgICAgcENoaWxkID0gcE5leHQ7CisgIH0KKyAgbV9wQ2hpbGQgPSBudWxscHRyOworfQorCitpbnQzMl90IENGWF9YTUxOb2RlOjpDb3VudENoaWxkTm9kZXMoKSBjb25zdCB7CisgIGludDMyX3QgaUNvdW50ID0gMDsKKyAgQ0ZYX1hNTE5vZGUqIHBDaGlsZCA9IG1fcENoaWxkOworICB3aGlsZSAocENoaWxkKSB7CisgICAgaUNvdW50Kys7CisgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0OworICB9CisgIHJldHVybiBpQ291bnQ7Cit9CisKK0NGWF9YTUxOb2RlKiBDRlhfWE1MTm9kZTo6R2V0Q2hpbGROb2RlKGludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgQ0ZYX1hNTE5vZGUqIHBDaGlsZCA9IG1fcENoaWxkOworICB3aGlsZSAocENoaWxkKSB7CisgICAgaWYgKGluZGV4ID09IDApIHsKKyAgICAgIHJldHVybiBwQ2hpbGQ7CisgICAgfQorICAgIGluZGV4LS07CisgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0OworICB9CisgIHJldHVybiBudWxscHRyOworfQorCitpbnQzMl90IENGWF9YTUxOb2RlOjpHZXRDaGlsZE5vZGVJbmRleChDRlhfWE1MTm9kZSogcE5vZGUpIGNvbnN0IHsKKyAgaW50MzJfdCBpbmRleCA9IDA7CisgIENGWF9YTUxOb2RlKiBwQ2hpbGQgPSBtX3BDaGlsZDsKKyAgd2hpbGUgKHBDaGlsZCkgeworICAgIGlmIChwQ2hpbGQgPT0gcE5vZGUpIHsKKyAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisgICAgaW5kZXgrKzsKKyAgICBwQ2hpbGQgPSBwQ2hpbGQtPm1fcE5leHQ7CisgIH0KKyAgcmV0dXJuIC0xOworfQorCitDRlhfWE1MTm9kZSogQ0ZYX1hNTE5vZGU6OkdldFBhdGgoY29uc3Qgd2NoYXJfdCogcFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlF1YWxpZmllZE5hbWUpIGNvbnN0IHsKKyAgQVNTRVJUKHBQYXRoKTsKKyAgaWYgKGlMZW5ndGggPCAwKSB7CisgICAgaUxlbmd0aCA9IHdjc2xlbihwUGF0aCk7CisgIH0KKyAgaWYgKGlMZW5ndGggPT0gMCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIFdpZGVTdHJpbmcgY3NQYXRoOworICBjb25zdCB3Y2hhcl90KiBwU3RhcnQgPSBwUGF0aDsKKyAgY29uc3Qgd2NoYXJfdCogcEVuZCA9IHBQYXRoICsgaUxlbmd0aDsKKyAgd2NoYXJfdCBjaDsKKyAgd2hpbGUgKHBTdGFydCA8IHBFbmQpIHsKKyAgICBjaCA9ICpwU3RhcnQrKzsKKyAgICBpZiAoY2ggPT0gTCcvJykKKyAgICAgIGJyZWFrOworICAgIGNzUGF0aCArPSBjaDsKKyAgfQorICBpTGVuZ3RoIC09IHBTdGFydCAtIHBQYXRoOworICBDRlhfWE1MTm9kZSogcEZpbmQgPSBudWxscHRyOworICBpZiAoY3NQYXRoLkdldExlbmd0aCgpIDwgMSkgeworICAgIHBGaW5kID0gR2V0Tm9kZUl0ZW0oQ0ZYX1hNTE5vZGU6OlJvb3QpOworICB9IGVsc2UgaWYgKGNzUGF0aC5Db21wYXJlKEwiLi4iKSA9PSAwKSB7CisgICAgcEZpbmQgPSBtX3BQYXJlbnQ7CisgIH0gZWxzZSBpZiAoY3NQYXRoLkNvbXBhcmUoTCIuIikgPT0gMCkgeworICAgIHBGaW5kID0gKENGWF9YTUxOb2RlKil0aGlzOworICB9IGVsc2UgeworICAgIFdpZGVTdHJpbmcgd3NUYWc7CisgICAgQ0ZYX1hNTE5vZGUqIHBOb2RlID0gbV9wQ2hpbGQ7CisgICAgd2hpbGUgKHBOb2RlKSB7CisgICAgICBpZiAocE5vZGUtPkdldFR5cGUoKSA9PSBGWF9YTUxOT0RFX0VsZW1lbnQpIHsKKyAgICAgICAgaWYgKGJRdWFsaWZpZWROYW1lKQorICAgICAgICAgIHdzVGFnID0gc3RhdGljX2Nhc3Q8Q0ZYX1hNTEVsZW1lbnQqPihwTm9kZSktPkdldE5hbWUoKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHdzVGFnID0gc3RhdGljX2Nhc3Q8Q0ZYX1hNTEVsZW1lbnQqPihwTm9kZSktPkdldExvY2FsVGFnTmFtZSgpOworCisgICAgICAgIGlmICh3c1RhZy5Db21wYXJlKGNzUGF0aCkgPT0gMCkgeworICAgICAgICAgIGlmIChpTGVuZ3RoIDwgMSkKKyAgICAgICAgICAgIHBGaW5kID0gcE5vZGU7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgcEZpbmQgPSBwTm9kZS0+R2V0UGF0aChwU3RhcnQsIGlMZW5ndGgsIGJRdWFsaWZpZWROYW1lKTsKKworICAgICAgICAgIGlmIChwRmluZCkKKyAgICAgICAgICAgIHJldHVybiBwRmluZDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcE5vZGUgPSBwTm9kZS0+bV9wTmV4dDsKKyAgICB9CisgIH0KKyAgaWYgKCFwRmluZCB8fCBpTGVuZ3RoIDwgMSkKKyAgICByZXR1cm4gcEZpbmQ7CisgIHJldHVybiBwRmluZC0+R2V0UGF0aChwU3RhcnQsIGlMZW5ndGgsIGJRdWFsaWZpZWROYW1lKTsKK30KKworaW50MzJfdCBDRlhfWE1MTm9kZTo6SW5zZXJ0Q2hpbGROb2RlKENGWF9YTUxOb2RlKiBwTm9kZSwgaW50MzJfdCBpbmRleCkgeworICBwTm9kZS0+bV9wUGFyZW50ID0gdGhpczsKKyAgaWYgKCFtX3BDaGlsZCkgeworICAgIG1fcENoaWxkID0gcE5vZGU7CisgICAgcE5vZGUtPm1fcFByaW9yID0gbnVsbHB0cjsKKyAgICBwTm9kZS0+bV9wTmV4dCA9IG51bGxwdHI7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGluZGV4ID09IDApIHsKKyAgICBwTm9kZS0+bV9wTmV4dCA9IG1fcENoaWxkOworICAgIHBOb2RlLT5tX3BQcmlvciA9IG51bGxwdHI7CisgICAgbV9wQ2hpbGQtPm1fcFByaW9yID0gcE5vZGU7CisgICAgbV9wQ2hpbGQgPSBwTm9kZTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpbnQzMl90IGlDb3VudCA9IDA7CisgIENGWF9YTUxOb2RlKiBwRmluZCA9IG1fcENoaWxkOworICB3aGlsZSAoKytpQ291bnQgIT0gaW5kZXggJiYgcEZpbmQtPm1fcE5leHQpIHsKKyAgICBwRmluZCA9IHBGaW5kLT5tX3BOZXh0OworICB9CisgIHBOb2RlLT5tX3BQcmlvciA9IHBGaW5kOworICBwTm9kZS0+bV9wTmV4dCA9IHBGaW5kLT5tX3BOZXh0OworICBpZiAocEZpbmQtPm1fcE5leHQpCisgICAgcEZpbmQtPm1fcE5leHQtPm1fcFByaW9yID0gcE5vZGU7CisgIHBGaW5kLT5tX3BOZXh0ID0gcE5vZGU7CisgIHJldHVybiBpQ291bnQ7Cit9CisKK3ZvaWQgQ0ZYX1hNTE5vZGU6OlJlbW92ZUNoaWxkTm9kZShDRlhfWE1MTm9kZSogcE5vZGUpIHsKKyAgQVNTRVJUKG1fcENoaWxkICYmIHBOb2RlKTsKKyAgaWYgKG1fcENoaWxkID09IHBOb2RlKSB7CisgICAgbV9wQ2hpbGQgPSBwTm9kZS0+bV9wTmV4dDsKKyAgfSBlbHNlIHsKKyAgICBwTm9kZS0+bV9wUHJpb3ItPm1fcE5leHQgPSBwTm9kZS0+bV9wTmV4dDsKKyAgfQorICBpZiAocE5vZGUtPm1fcE5leHQpCisgICAgcE5vZGUtPm1fcE5leHQtPm1fcFByaW9yID0gcE5vZGUtPm1fcFByaW9yOworICBwTm9kZS0+bV9wUGFyZW50ID0gbnVsbHB0cjsKKyAgcE5vZGUtPm1fcE5leHQgPSBudWxscHRyOworICBwTm9kZS0+bV9wUHJpb3IgPSBudWxscHRyOworfQorCitDRlhfWE1MTm9kZSogQ0ZYX1hNTE5vZGU6OkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpOb2RlSXRlbSBlSXRlbSkgY29uc3QgeworICBzd2l0Y2ggKGVJdGVtKSB7CisgICAgY2FzZSBDRlhfWE1MTm9kZTo6Um9vdDogeworICAgICAgQ0ZYX1hNTE5vZGUqIHBQYXJlbnQgPSAoQ0ZYX1hNTE5vZGUqKXRoaXM7CisgICAgICB3aGlsZSAocFBhcmVudC0+bV9wUGFyZW50KSB7CisgICAgICAgIHBQYXJlbnQgPSBwUGFyZW50LT5tX3BQYXJlbnQ7CisgICAgICB9CisgICAgICByZXR1cm4gcFBhcmVudDsKKyAgICB9CisgICAgY2FzZSBDRlhfWE1MTm9kZTo6UGFyZW50OgorICAgICAgcmV0dXJuIG1fcFBhcmVudDsKKyAgICBjYXNlIENGWF9YTUxOb2RlOjpGaXJzdFNpYmxpbmc6IHsKKyAgICAgIENGWF9YTUxOb2RlKiBwSXRlbSA9IChDRlhfWE1MTm9kZSopdGhpczsKKyAgICAgIHdoaWxlIChwSXRlbS0+bV9wUHJpb3IpIHsKKyAgICAgICAgcEl0ZW0gPSBwSXRlbS0+bV9wUHJpb3I7CisgICAgICB9CisgICAgICByZXR1cm4gcEl0ZW0gPT0gKENGWF9YTUxOb2RlKil0aGlzID8gbnVsbHB0ciA6IHBJdGVtOworICAgIH0KKyAgICBjYXNlIENGWF9YTUxOb2RlOjpQcmlvclNpYmxpbmc6CisgICAgICByZXR1cm4gbV9wUHJpb3I7CisgICAgY2FzZSBDRlhfWE1MTm9kZTo6TmV4dFNpYmxpbmc6CisgICAgICByZXR1cm4gbV9wTmV4dDsKKyAgICBjYXNlIENGWF9YTUxOb2RlOjpMYXN0U2libGluZzogeworICAgICAgQ0ZYX1hNTE5vZGUqIHBJdGVtID0gKENGWF9YTUxOb2RlKil0aGlzOworICAgICAgd2hpbGUgKHBJdGVtLT5tX3BOZXh0KQorICAgICAgICBwSXRlbSA9IHBJdGVtLT5tX3BOZXh0OworICAgICAgcmV0dXJuIHBJdGVtID09IChDRlhfWE1MTm9kZSopdGhpcyA/IG51bGxwdHIgOiBwSXRlbTsKKyAgICB9CisgICAgY2FzZSBDRlhfWE1MTm9kZTo6Rmlyc3ROZWlnaGJvcjogeworICAgICAgQ0ZYX1hNTE5vZGUqIHBQYXJlbnQgPSAoQ0ZYX1hNTE5vZGUqKXRoaXM7CisgICAgICB3aGlsZSAocFBhcmVudC0+bV9wUGFyZW50KQorICAgICAgICBwUGFyZW50ID0gcFBhcmVudC0+bV9wUGFyZW50OworICAgICAgcmV0dXJuIHBQYXJlbnQgPT0gKENGWF9YTUxOb2RlKil0aGlzID8gbnVsbHB0ciA6IHBQYXJlbnQ7CisgICAgfQorICAgIGNhc2UgQ0ZYX1hNTE5vZGU6OlByaW9yTmVpZ2hib3I6IHsKKyAgICAgIGlmICghbV9wUHJpb3IpCisgICAgICAgIHJldHVybiBtX3BQYXJlbnQ7CisKKyAgICAgIENGWF9YTUxOb2RlKiBwSXRlbSA9IG1fcFByaW9yOworICAgICAgd2hpbGUgKHBJdGVtLT5tX3BDaGlsZCkgeworICAgICAgICBwSXRlbSA9IHBJdGVtLT5tX3BDaGlsZDsKKyAgICAgICAgd2hpbGUgKHBJdGVtLT5tX3BOZXh0KQorICAgICAgICAgIHBJdGVtID0gcEl0ZW0tPm1fcE5leHQ7CisgICAgICB9CisgICAgICByZXR1cm4gcEl0ZW07CisgICAgfQorICAgIGNhc2UgQ0ZYX1hNTE5vZGU6Ok5leHROZWlnaGJvcjogeworICAgICAgaWYgKG1fcENoaWxkKQorICAgICAgICByZXR1cm4gbV9wQ2hpbGQ7CisgICAgICBpZiAobV9wTmV4dCkKKyAgICAgICAgcmV0dXJuIG1fcE5leHQ7CisgICAgICBDRlhfWE1MTm9kZSogcEl0ZW0gPSBtX3BQYXJlbnQ7CisgICAgICB3aGlsZSAocEl0ZW0pIHsKKyAgICAgICAgaWYgKHBJdGVtLT5tX3BOZXh0KQorICAgICAgICAgIHJldHVybiBwSXRlbS0+bV9wTmV4dDsKKyAgICAgICAgcEl0ZW0gPSBwSXRlbS0+bV9wUGFyZW50OworICAgICAgfQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNhc2UgQ0ZYX1hNTE5vZGU6Okxhc3ROZWlnaGJvcjogeworICAgICAgQ0ZYX1hNTE5vZGUqIHBJdGVtID0gKENGWF9YTUxOb2RlKil0aGlzOworICAgICAgd2hpbGUgKHBJdGVtLT5tX3BQYXJlbnQpIHsKKyAgICAgICAgcEl0ZW0gPSBwSXRlbS0+bV9wUGFyZW50OworICAgICAgfQorICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgd2hpbGUgKHBJdGVtLT5tX3BOZXh0KQorICAgICAgICAgIHBJdGVtID0gcEl0ZW0tPm1fcE5leHQ7CisgICAgICAgIGlmICghcEl0ZW0tPm1fcENoaWxkKQorICAgICAgICAgIGJyZWFrOworICAgICAgICBwSXRlbSA9IHBJdGVtLT5tX3BDaGlsZDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBwSXRlbSA9PSAoQ0ZYX1hNTE5vZGUqKXRoaXMgPyBudWxscHRyIDogcEl0ZW07CisgICAgfQorICAgIGNhc2UgQ0ZYX1hNTE5vZGU6OkZpcnN0Q2hpbGQ6CisgICAgICByZXR1cm4gbV9wQ2hpbGQ7CisgICAgY2FzZSBDRlhfWE1MTm9kZTo6TGFzdENoaWxkOiB7CisgICAgICBpZiAoIW1fcENoaWxkKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgICAgQ0ZYX1hNTE5vZGUqIHBDaGlsZCA9IG1fcENoaWxkOworICAgICAgd2hpbGUgKHBDaGlsZC0+bV9wTmV4dCkKKyAgICAgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0OworICAgICAgcmV0dXJuIHBDaGlsZDsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBudWxscHRyOworfQorCitpbnQzMl90IENGWF9YTUxOb2RlOjpHZXROb2RlTGV2ZWwoKSBjb25zdCB7CisgIGludDMyX3QgaUxldmVsID0gMDsKKyAgY29uc3QgQ0ZYX1hNTE5vZGUqIHBJdGVtID0gbV9wUGFyZW50OworICB3aGlsZSAocEl0ZW0pIHsKKyAgICBpTGV2ZWwrKzsKKyAgICBwSXRlbSA9IHBJdGVtLT5tX3BQYXJlbnQ7CisgIH0KKyAgcmV0dXJuIGlMZXZlbDsKK30KKworYm9vbCBDRlhfWE1MTm9kZTo6SW5zZXJ0Tm9kZUl0ZW0oQ0ZYX1hNTE5vZGU6Ok5vZGVJdGVtIGVJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1hNTE5vZGUqIHBOb2RlKSB7CisgIHN3aXRjaCAoZUl0ZW0pIHsKKyAgICBjYXNlIENGWF9YTUxOb2RlOjpOZXh0U2libGluZzogeworICAgICAgcE5vZGUtPm1fcFBhcmVudCA9IG1fcFBhcmVudDsKKyAgICAgIHBOb2RlLT5tX3BOZXh0ID0gbV9wTmV4dDsKKyAgICAgIHBOb2RlLT5tX3BQcmlvciA9IHRoaXM7CisgICAgICBpZiAobV9wTmV4dCkgeworICAgICAgICBtX3BOZXh0LT5tX3BQcmlvciA9IHBOb2RlOworICAgICAgfQorICAgICAgbV9wTmV4dCA9IHBOb2RlOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgQ0ZYX1hNTE5vZGU6OlByaW9yU2libGluZzogeworICAgICAgcE5vZGUtPm1fcFBhcmVudCA9IG1fcFBhcmVudDsKKyAgICAgIHBOb2RlLT5tX3BOZXh0ID0gdGhpczsKKyAgICAgIHBOb2RlLT5tX3BQcmlvciA9IG1fcFByaW9yOworICAgICAgaWYgKG1fcFByaW9yKSB7CisgICAgICAgIG1fcFByaW9yLT5tX3BOZXh0ID0gcE5vZGU7CisgICAgICB9IGVsc2UgaWYgKG1fcFBhcmVudCkgeworICAgICAgICBtX3BQYXJlbnQtPm1fcENoaWxkID0gcE5vZGU7CisgICAgICB9CisgICAgICBtX3BQcmlvciA9IHBOb2RlOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworQ0ZYX1hNTE5vZGUqIENGWF9YTUxOb2RlOjpSZW1vdmVOb2RlSXRlbShDRlhfWE1MTm9kZTo6Tm9kZUl0ZW0gZUl0ZW0pIHsKKyAgQ0ZYX1hNTE5vZGUqIHBOb2RlID0gbnVsbHB0cjsKKyAgc3dpdGNoIChlSXRlbSkgeworICAgIGNhc2UgQ0ZYX1hNTE5vZGU6Ok5leHRTaWJsaW5nOgorICAgICAgaWYgKG1fcE5leHQpIHsKKyAgICAgICAgcE5vZGUgPSBtX3BOZXh0OworICAgICAgICBtX3BOZXh0ID0gcE5vZGUtPm1fcE5leHQ7CisgICAgICAgIGlmIChtX3BOZXh0KSB7CisgICAgICAgICAgbV9wTmV4dC0+bV9wUHJpb3IgPSB0aGlzOworICAgICAgICB9CisgICAgICAgIHBOb2RlLT5tX3BQYXJlbnQgPSBudWxscHRyOworICAgICAgICBwTm9kZS0+bV9wTmV4dCA9IG51bGxwdHI7CisgICAgICAgIHBOb2RlLT5tX3BQcmlvciA9IG51bGxwdHI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHBOb2RlOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1hNTE5vZGU+IENGWF9YTUxOb2RlOjpDbG9uZSgpIHsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3ZvaWQgQ0ZYX1hNTE5vZGU6OlNhdmVYTUxOb2RlKAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfU2Vla2FibGVTdHJlYW1Qcm94eT4mIHBYTUxTdHJlYW0pIHsKKyAgQ0ZYX1hNTE5vZGUqIHBOb2RlID0gKENGWF9YTUxOb2RlKil0aGlzOworICBzd2l0Y2ggKHBOb2RlLT5HZXRUeXBlKCkpIHsKKyAgICBjYXNlIEZYX1hNTE5PREVfSW5zdHJ1Y3Rpb246IHsKKyAgICAgIFdpZGVTdHJpbmcgd3M7CisgICAgICBDRlhfWE1MSW5zdHJ1Y3Rpb24qIHBJbnN0cnVjdGlvbiA9IChDRlhfWE1MSW5zdHJ1Y3Rpb24qKXBOb2RlOworICAgICAgaWYgKHBJbnN0cnVjdGlvbi0+R2V0TmFtZSgpLkNvbXBhcmVOb0Nhc2UoTCJ4bWwiKSA9PSAwKSB7CisgICAgICAgIHdzID0gTCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCIiOworICAgICAgICB1aW50MTZfdCB3Q29kZVBhZ2UgPSBwWE1MU3RyZWFtLT5HZXRDb2RlUGFnZSgpOworICAgICAgICBpZiAod0NvZGVQYWdlID09IEZYX0NPREVQQUdFX1VURjE2TEUpIHsKKyAgICAgICAgICB3cyArPSBMIlVURi0xNiI7CisgICAgICAgIH0gZWxzZSBpZiAod0NvZGVQYWdlID09IEZYX0NPREVQQUdFX1VURjE2QkUpIHsKKyAgICAgICAgICB3cyArPSBMIlVURi0xNmJlIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB3cyArPSBMIlVURi04IjsKKyAgICAgICAgfQorICAgICAgICB3cyArPSBMIlwiPz4iOworICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cy5Bc1N0cmluZ1ZpZXcoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICB3cyA9IFdpZGVTdHJpbmc6OkZvcm1hdChMIjw/JWxzIiwgcEluc3RydWN0aW9uLT5HZXROYW1lKCkuY19zdHIoKSk7CisgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLkFzU3RyaW5nVmlldygpKTsKKworICAgICAgICBmb3IgKGF1dG8gaXQgOiBwSW5zdHJ1Y3Rpb24tPkdldEF0dHJpYnV0ZXMoKSkgeworICAgICAgICAgIFdpZGVTdHJpbmcgd3NWYWx1ZSA9IGl0LnNlY29uZDsKKyAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCImIiwgTCImYW1wOyIpOworICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIjwiLCBMIiZsdDsiKTsKKyAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCI+IiwgTCImZ3Q7Iik7CisgICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiXCciLCBMIiZhcG9zOyIpOworICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIlwiIiwgTCImcXVvdDsiKTsKKworICAgICAgICAgIHdzID0gTCIgIjsKKyAgICAgICAgICB3cyArPSBpdC5maXJzdDsKKyAgICAgICAgICB3cyArPSBMIj1cIiI7CisgICAgICAgICAgd3MgKz0gd3NWYWx1ZTsKKyAgICAgICAgICB3cyArPSBMIlwiIjsKKyAgICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cy5Bc1N0cmluZ1ZpZXcoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8gdGFyZ2V0IDogcEluc3RydWN0aW9uLT5HZXRUYXJnZXREYXRhKCkpIHsKKyAgICAgICAgICB3cyA9IEwiIFwiIjsKKyAgICAgICAgICB3cyArPSB0YXJnZXQ7CisgICAgICAgICAgd3MgKz0gTCJcIiI7CisgICAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MuQXNTdHJpbmdWaWV3KCkpOworICAgICAgICB9CisgICAgICAgIHdzID0gTCI/PiI7CisgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLkFzU3RyaW5nVmlldygpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZYX1hNTE5PREVfRWxlbWVudDogeworICAgICAgV2lkZVN0cmluZyB3czsKKyAgICAgIHdzID0gTCI8IjsKKyAgICAgIHdzICs9IHN0YXRpY19jYXN0PENGWF9YTUxFbGVtZW50Kj4ocE5vZGUpLT5HZXROYW1lKCk7CisgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cy5Bc1N0cmluZ1ZpZXcoKSk7CisKKyAgICAgIGZvciAoYXV0byBpdCA6IHN0YXRpY19jYXN0PENGWF9YTUxFbGVtZW50Kj4ocE5vZGUpLT5HZXRBdHRyaWJ1dGVzKCkpIHsKKyAgICAgICAgV2lkZVN0cmluZyB3c1ZhbHVlID0gaXQuc2Vjb25kOworICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCImIiwgTCImYW1wOyIpOworICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCI8IiwgTCImbHQ7Iik7CisgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIj4iLCBMIiZndDsiKTsKKyAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiXCciLCBMIiZhcG9zOyIpOworICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCJcIiIsIEwiJnF1b3Q7Iik7CisKKyAgICAgICAgd3MgPSBMIiAiOworICAgICAgICB3cyArPSBpdC5maXJzdDsKKyAgICAgICAgd3MgKz0gTCI9XCIiOworICAgICAgICB3cyArPSB3c1ZhbHVlOworICAgICAgICB3cyArPSBMIlwiIjsKKyAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MuQXNTdHJpbmdWaWV3KCkpOworICAgICAgfQorICAgICAgaWYgKHBOb2RlLT5tX3BDaGlsZCkgeworICAgICAgICB3cyA9IEwiXG4+IjsKKyAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MuQXNTdHJpbmdWaWV3KCkpOworICAgICAgICBDRlhfWE1MTm9kZSogcENoaWxkID0gcE5vZGUtPm1fcENoaWxkOworICAgICAgICB3aGlsZSAocENoaWxkKSB7CisgICAgICAgICAgcENoaWxkLT5TYXZlWE1MTm9kZShwWE1MU3RyZWFtKTsKKyAgICAgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPm1fcE5leHQ7CisgICAgICAgIH0KKyAgICAgICAgd3MgPSBMIjwvIjsKKyAgICAgICAgd3MgKz0gc3RhdGljX2Nhc3Q8Q0ZYX1hNTEVsZW1lbnQqPihwTm9kZSktPkdldE5hbWUoKTsKKyAgICAgICAgd3MgKz0gTCJcbj4iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgd3MgPSBMIlxuLz4iOworICAgICAgfQorICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MuQXNTdHJpbmdWaWV3KCkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRlhfWE1MTk9ERV9UZXh0OiB7CisgICAgICBXaWRlU3RyaW5nIHdzID0gc3RhdGljX2Nhc3Q8Q0ZYX1hNTFRleHQqPihwTm9kZSktPkdldFRleHQoKTsKKyAgICAgIHdzLlJlcGxhY2UoTCImIiwgTCImYW1wOyIpOworICAgICAgd3MuUmVwbGFjZShMIjwiLCBMIiZsdDsiKTsKKyAgICAgIHdzLlJlcGxhY2UoTCI+IiwgTCImZ3Q7Iik7CisgICAgICB3cy5SZXBsYWNlKEwiXCciLCBMIiZhcG9zOyIpOworICAgICAgd3MuUmVwbGFjZShMIlwiIiwgTCImcXVvdDsiKTsKKyAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLkFzU3RyaW5nVmlldygpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZYX1hNTE5PREVfQ2hhckRhdGE6IHsKKyAgICAgIFdpZGVTdHJpbmcgd3MgPSBMIjwhW0NEQVRBWyI7CisgICAgICB3cyArPSBzdGF0aWNfY2FzdDxDRlhfWE1MQ2hhckRhdGEqPihwTm9kZSktPkdldFRleHQoKTsKKyAgICAgIHdzICs9IEwiXV0+IjsKKyAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLkFzU3RyaW5nVmlldygpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZYX1hNTE5PREVfVW5rbm93bjoKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQveG1sL2NmeF94bWxub2RlLmggYi9jb3JlL2Z4Y3J0L3htbC9jZnhfeG1sbm9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OGIzYmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L3htbC9jZnhfeG1sbm9kZS5oCkBAIC0wLDAgKzEsNzUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX1hNTF9DRlhfWE1MTk9ERV9IXworI2RlZmluZSBDT1JFX0ZYQ1JUX1hNTF9DRlhfWE1MTk9ERV9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfc2Vla2FibGVzdHJlYW1wcm94eS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgorCitlbnVtIEZYX1hNTE5PREVUWVBFIHsKKyAgRlhfWE1MTk9ERV9Vbmtub3duID0gMCwKKyAgRlhfWE1MTk9ERV9JbnN0cnVjdGlvbiwKKyAgRlhfWE1MTk9ERV9FbGVtZW50LAorICBGWF9YTUxOT0RFX1RleHQsCisgIEZYX1hNTE5PREVfQ2hhckRhdGEsCit9OworCitzdHJ1Y3QgRlhfWE1MTk9ERSB7CisgIGludDMyX3QgaU5vZGVOdW07CisgIEZYX1hNTE5PREVUWVBFIGVOb2RlVHlwZTsKK307CisKK2NsYXNzIENGWF9YTUxOb2RlIHsKKyBwdWJsaWM6CisgIGVudW0gTm9kZUl0ZW0geworICAgIFJvb3QgPSAwLAorICAgIFBhcmVudCwKKyAgICBGaXJzdFNpYmxpbmcsCisgICAgUHJpb3JTaWJsaW5nLAorICAgIE5leHRTaWJsaW5nLAorICAgIExhc3RTaWJsaW5nLAorICAgIEZpcnN0TmVpZ2hib3IsCisgICAgUHJpb3JOZWlnaGJvciwKKyAgICBOZXh0TmVpZ2hib3IsCisgICAgTGFzdE5laWdoYm9yLAorICAgIEZpcnN0Q2hpbGQsCisgICAgTGFzdENoaWxkCisgIH07CisKKyAgQ0ZYX1hNTE5vZGUoKTsKKyAgdmlydHVhbCB+Q0ZYX1hNTE5vZGUoKTsKKworICB2aXJ0dWFsIEZYX1hNTE5PREVUWVBFIEdldFR5cGUoKSBjb25zdDsKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1hNTE5vZGU+IENsb25lKCk7CisKKyAgaW50MzJfdCBDb3VudENoaWxkTm9kZXMoKSBjb25zdDsKKyAgQ0ZYX1hNTE5vZGUqIEdldENoaWxkTm9kZShpbnQzMl90IGluZGV4KSBjb25zdDsKKyAgaW50MzJfdCBHZXRDaGlsZE5vZGVJbmRleChDRlhfWE1MTm9kZSogcE5vZGUpIGNvbnN0OworICBpbnQzMl90IEluc2VydENoaWxkTm9kZShDRlhfWE1MTm9kZSogcE5vZGUsIGludDMyX3QgaW5kZXggPSAtMSk7CisgIHZvaWQgUmVtb3ZlQ2hpbGROb2RlKENGWF9YTUxOb2RlKiBwTm9kZSk7CisgIHZvaWQgRGVsZXRlQ2hpbGRyZW4oKTsKKworICBDRlhfWE1MTm9kZSogR2V0UGF0aChjb25zdCB3Y2hhcl90KiBwUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoID0gLTEsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlF1YWxpZmllZE5hbWUgPSB0cnVlKSBjb25zdDsKKworICBpbnQzMl90IEdldE5vZGVMZXZlbCgpIGNvbnN0OworICBDRlhfWE1MTm9kZSogR2V0Tm9kZUl0ZW0oQ0ZYX1hNTE5vZGU6Ok5vZGVJdGVtIGVJdGVtKSBjb25zdDsKKyAgYm9vbCBJbnNlcnROb2RlSXRlbShDRlhfWE1MTm9kZTo6Tm9kZUl0ZW0gZUl0ZW0sIENGWF9YTUxOb2RlKiBwTm9kZSk7CisgIENGWF9YTUxOb2RlKiBSZW1vdmVOb2RlSXRlbShDRlhfWE1MTm9kZTo6Tm9kZUl0ZW0gZUl0ZW0pOworCisgIHZvaWQgU2F2ZVhNTE5vZGUoY29uc3QgUmV0YWluUHRyPENGWF9TZWVrYWJsZVN0cmVhbVByb3h5PiYgcFhNTFN0cmVhbSk7CisKKyAgQ0ZYX1hNTE5vZGUqIG1fcFBhcmVudDsKKyAgQ0ZYX1hNTE5vZGUqIG1fcENoaWxkOworICBDRlhfWE1MTm9kZSogbV9wUHJpb3I7CisgIENGWF9YTUxOb2RlKiBtX3BOZXh0OworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX1hNTF9DRlhfWE1MTk9ERV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC94bWwvY2Z4X3htbHBhcnNlci5jcHAgYi9jb3JlL2Z4Y3J0L3htbC9jZnhfeG1scGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjA4YjA2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC94bWwvY2Z4X3htbHBhcnNlci5jcHAKQEAgLTAsMCArMSwxNjcgQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWxwYXJzZXIuaCIKKworI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWxjaGFyZGF0YS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWxlbGVtZW50LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbGluc3RydWN0aW9uLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbG5vZGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sdGV4dC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworQ0ZYX1hNTFBhcnNlcjo6Q0ZYX1hNTFBhcnNlcihDRlhfWE1MTm9kZSogcFBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPENGWF9TZWVrYWJsZVN0cmVhbVByb3h5PiYgcFN0cmVhbSkKKyAgICA6IG1fbkVsZW1lbnRTdGFydCgwKSwKKyAgICAgIG1fZHdDaGVja1N0YXR1cygwKSwKKyAgICAgIG1fZHdDdXJyZW50Q2hlY2tTdGF0dXMoMCksCisgICAgICBtX3BTdHJlYW0ocFN0cmVhbSksCisgICAgICBtX3BQYXJzZXIocGRmaXVtOjpNYWtlVW5pcXVlPENGWF9YTUxTeW50YXhQYXJzZXI+KG1fcFN0cmVhbSkpLAorICAgICAgbV9wUGFyZW50KHBQYXJlbnQpLAorICAgICAgbV9wQ2hpbGQobnVsbHB0ciksCisgICAgICBtX3N5bnRheFBhcnNlclJlc3VsdChGWF9YbWxTeW50YXhSZXN1bHQ6Ok5vbmUpIHsKKyAgQVNTRVJUKG1fcFBhcmVudCAmJiBtX3BTdHJlYW0pOworICBtX05vZGVTdGFjay5wdXNoKG1fcFBhcmVudCk7Cit9CisKK0NGWF9YTUxQYXJzZXI6On5DRlhfWE1MUGFyc2VyKCkge30KKworaW50MzJfdCBDRlhfWE1MUGFyc2VyOjpEb1BhcnNlcigpIHsKKyAgaWYgKG1fc3ludGF4UGFyc2VyUmVzdWx0ID09IEZYX1htbFN5bnRheFJlc3VsdDo6RXJyb3IpCisgICAgcmV0dXJuIC0xOworICBpZiAobV9zeW50YXhQYXJzZXJSZXN1bHQgPT0gRlhfWG1sU3ludGF4UmVzdWx0OjpFbmRPZlN0cmluZykKKyAgICByZXR1cm4gMTAwOworCisgIGludDMyX3QgaUNvdW50ID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBtX3N5bnRheFBhcnNlclJlc3VsdCA9IG1fcFBhcnNlci0+RG9TeW50YXhQYXJzZSgpOworICAgIHN3aXRjaCAobV9zeW50YXhQYXJzZXJSZXN1bHQpIHsKKyAgICAgIGNhc2UgRlhfWG1sU3ludGF4UmVzdWx0OjpJbnN0cnVjdGlvbk9wZW46CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWF9YbWxTeW50YXhSZXN1bHQ6Okluc3RydWN0aW9uQ2xvc2U6CisgICAgICAgIGlmIChtX3BDaGlsZCkgeworICAgICAgICAgIGlmIChtX3BDaGlsZC0+R2V0VHlwZSgpICE9IEZYX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsKKyAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyUmVzdWx0ID0gRlhfWG1sU3ludGF4UmVzdWx0OjpFcnJvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtX3BDaGlsZCA9IG1fcFBhcmVudDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudE9wZW46CisgICAgICAgIGlmIChtX2R3Q2hlY2tTdGF0dXMgIT0gMHgwMyAmJiBtX05vZGVTdGFjay5zaXplKCkgPT0gMikKKyAgICAgICAgICBtX25FbGVtZW50U3RhcnQgPSBtX3BQYXJzZXItPkdldEN1cnJlbnRQb3MoKSAtIDE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWF9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRCcmVhazoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudENsb3NlOgorICAgICAgICBpZiAobV9wQ2hpbGQtPkdldFR5cGUoKSAhPSBGWF9YTUxOT0RFX0VsZW1lbnQpIHsKKyAgICAgICAgICBtX3N5bnRheFBhcnNlclJlc3VsdCA9IEZYX1htbFN5bnRheFJlc3VsdDo6RXJyb3I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbV93czEgPSBtX3BQYXJzZXItPkdldFRhZ05hbWUoKTsKKyAgICAgICAgbV93czIgPSBzdGF0aWNfY2FzdDxDRlhfWE1MRWxlbWVudCo+KG1fcENoaWxkKS0+R2V0TmFtZSgpOworICAgICAgICBpZiAobV93czEuR2V0TGVuZ3RoKCkgPiAwICYmIG1fd3MxICE9IG1fd3MyKSB7CisgICAgICAgICAgbV9zeW50YXhQYXJzZXJSZXN1bHQgPSBGWF9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghbV9Ob2RlU3RhY2suZW1wdHkoKSkKKyAgICAgICAgICBtX05vZGVTdGFjay5wb3AoKTsKKyAgICAgICAgaWYgKG1fTm9kZVN0YWNrLmVtcHR5KCkpIHsKKyAgICAgICAgICBtX3N5bnRheFBhcnNlclJlc3VsdCA9IEZYX1htbFN5bnRheFJlc3VsdDo6RXJyb3I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fZHdDdXJyZW50Q2hlY2tTdGF0dXMgIT0gMCAmJiBtX05vZGVTdGFjay5zaXplKCkgPT0gMikgeworICAgICAgICAgIG1fblNpemVbbV9kd0N1cnJlbnRDaGVja1N0YXR1cyAtIDFdID0KKyAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRDdXJyZW50QmluYXJ5UG9zKCkgLQorICAgICAgICAgICAgICBtX25TdGFydFttX2R3Q3VycmVudENoZWNrU3RhdHVzIC0gMV07CisgICAgICAgICAgbV9kd0N1cnJlbnRDaGVja1N0YXR1cyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgbV9wUGFyZW50ID0gbV9Ob2RlU3RhY2sudG9wKCk7CisgICAgICAgIG1fcENoaWxkID0gbV9wUGFyZW50OworICAgICAgICBpQ291bnQrKzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYX1htbFN5bnRheFJlc3VsdDo6VGFyZ2V0TmFtZToKKyAgICAgICAgbV93czEgPSBtX3BQYXJzZXItPkdldFRhcmdldE5hbWUoKTsKKyAgICAgICAgaWYgKG1fd3MxID09IEwib3JpZ2luYWxYRkFWZXJzaW9uIiB8fCBtX3dzMSA9PSBMImFjcm9iYXQiKSB7CisgICAgICAgICAgbV9wQ2hpbGQgPSBuZXcgQ0ZYX1hNTEluc3RydWN0aW9uKG1fd3MxKTsKKyAgICAgICAgICBtX3BQYXJlbnQtPkluc2VydENoaWxkTm9kZShtX3BDaGlsZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbV9wQ2hpbGQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIG1fd3MxLmNsZWFyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWF9YbWxTeW50YXhSZXN1bHQ6OlRhZ05hbWU6CisgICAgICAgIG1fd3MxID0gbV9wUGFyc2VyLT5HZXRUYWdOYW1lKCk7CisgICAgICAgIG1fcENoaWxkID0gbmV3IENGWF9YTUxFbGVtZW50KG1fd3MxKTsKKyAgICAgICAgbV9wUGFyZW50LT5JbnNlcnRDaGlsZE5vZGUobV9wQ2hpbGQpOworICAgICAgICBtX05vZGVTdGFjay5wdXNoKG1fcENoaWxkKTsKKyAgICAgICAgbV9wUGFyZW50ID0gbV9wQ2hpbGQ7CisKKyAgICAgICAgaWYgKG1fZHdDaGVja1N0YXR1cyAhPSAweDAzICYmIG1fTm9kZVN0YWNrLnNpemUoKSA9PSAzKSB7CisgICAgICAgICAgV2lkZVN0cmluZyB3c1RhZyA9CisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENGWF9YTUxFbGVtZW50Kj4obV9wQ2hpbGQpLT5HZXRMb2NhbFRhZ05hbWUoKTsKKyAgICAgICAgICBpZiAod3NUYWcgPT0gTCJ0ZW1wbGF0ZSIpIHsKKyAgICAgICAgICAgIG1fZHdDaGVja1N0YXR1cyB8PSAweDAxOworICAgICAgICAgICAgbV9kd0N1cnJlbnRDaGVja1N0YXR1cyA9IDB4MDE7CisgICAgICAgICAgICBtX25TdGFydFswXSA9IG1fcFBhcnNlci0+R2V0Q3VycmVudEJpbmFyeVBvcygpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fcFBhcnNlci0+R2V0Q3VycmVudFBvcygpIC0gbV9uRWxlbWVudFN0YXJ0KTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHdzVGFnID09IEwiZGF0YXNldHMiKSB7CisgICAgICAgICAgICBtX2R3Q2hlY2tTdGF0dXMgfD0gMHgwMjsKKyAgICAgICAgICAgIG1fZHdDdXJyZW50Q2hlY2tTdGF0dXMgPSAweDAyOworICAgICAgICAgICAgbV9uU3RhcnRbMV0gPSBtX3BQYXJzZXItPkdldEN1cnJlbnRCaW5hcnlQb3MoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3BQYXJzZXItPkdldEN1cnJlbnRQb3MoKSAtIG1fbkVsZW1lbnRTdGFydCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWF9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpTmFtZToKKyAgICAgICAgbV93czEgPSBtX3BQYXJzZXItPkdldEF0dHJpYnV0ZU5hbWUoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYX1htbFN5bnRheFJlc3VsdDo6QXR0cmlWYWx1ZToKKyAgICAgICAgaWYgKG1fcENoaWxkKSB7CisgICAgICAgICAgbV93czIgPSBtX3BQYXJzZXItPkdldEF0dHJpYnV0ZU5hbWUoKTsKKyAgICAgICAgICBpZiAobV9wQ2hpbGQtPkdldFR5cGUoKSA9PSBGWF9YTUxOT0RFX0VsZW1lbnQpCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxDRlhfWE1MRWxlbWVudCo+KG1fcENoaWxkKS0+U2V0U3RyaW5nKG1fd3MxLCBtX3dzMik7CisgICAgICAgIH0KKyAgICAgICAgbV93czEuY2xlYXIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYX1htbFN5bnRheFJlc3VsdDo6VGV4dDoKKyAgICAgICAgbV93czEgPSBtX3BQYXJzZXItPkdldFRleHREYXRhKCk7CisgICAgICAgIG1fcENoaWxkID0gbmV3IENGWF9YTUxUZXh0KG1fd3MxKTsKKyAgICAgICAgbV9wUGFyZW50LT5JbnNlcnRDaGlsZE5vZGUobV9wQ2hpbGQpOworICAgICAgICBtX3BDaGlsZCA9IG1fcFBhcmVudDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYX1htbFN5bnRheFJlc3VsdDo6Q0RhdGE6CisgICAgICAgIG1fd3MxID0gbV9wUGFyc2VyLT5HZXRUZXh0RGF0YSgpOworICAgICAgICBtX3BDaGlsZCA9IG5ldyBDRlhfWE1MQ2hhckRhdGEobV93czEpOworICAgICAgICBtX3BQYXJlbnQtPkluc2VydENoaWxkTm9kZShtX3BDaGlsZCk7CisgICAgICAgIG1fcENoaWxkID0gbV9wUGFyZW50OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlhfWG1sU3ludGF4UmVzdWx0OjpUYXJnZXREYXRhOgorICAgICAgICBpZiAobV9wQ2hpbGQpIHsKKyAgICAgICAgICBpZiAobV9wQ2hpbGQtPkdldFR5cGUoKSAhPSBGWF9YTUxOT0RFX0luc3RydWN0aW9uKSB7CisgICAgICAgICAgICBtX3N5bnRheFBhcnNlclJlc3VsdCA9IEZYX1htbFN5bnRheFJlc3VsdDo6RXJyb3I7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgYXV0byogaW5zdHJ1Y3Rpb24gPSBzdGF0aWNfY2FzdDxDRlhfWE1MSW5zdHJ1Y3Rpb24qPihtX3BDaGlsZCk7CisgICAgICAgICAgaWYgKCFtX3dzMS5Jc0VtcHR5KCkpCisgICAgICAgICAgICBpbnN0cnVjdGlvbi0+QXBwZW5kRGF0YShtX3dzMSk7CisgICAgICAgICAgaW5zdHJ1Y3Rpb24tPkFwcGVuZERhdGEobV9wUGFyc2VyLT5HZXRUYXJnZXREYXRhKCkpOworICAgICAgICB9CisgICAgICAgIG1fd3MxLmNsZWFyKCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChtX3N5bnRheFBhcnNlclJlc3VsdCA9PSBGWF9YbWxTeW50YXhSZXN1bHQ6OkVycm9yIHx8CisgICAgICAgIG1fc3ludGF4UGFyc2VyUmVzdWx0ID09IEZYX1htbFN5bnRheFJlc3VsdDo6RW5kT2ZTdHJpbmcpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gKG1fc3ludGF4UGFyc2VyUmVzdWx0ID09IEZYX1htbFN5bnRheFJlc3VsdDo6RXJyb3IgfHwKKyAgICAgICAgICBtX05vZGVTdGFjay5zaXplKCkgIT0gMSkKKyAgICAgICAgICAgICA/IC0xCisgICAgICAgICAgICAgOiBtX3BQYXJzZXItPkdldFN0YXR1cygpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC94bWwvY2Z4X3htbHBhcnNlci5oIGIvY29yZS9meGNydC94bWwvY2Z4X3htbHBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMzhmNmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L3htbC9jZnhfeG1scGFyc2VyLmgKQEAgLTAsMCArMSw0NiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfWE1MX0NGWF9YTUxQQVJTRVJfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9YTUxfQ0ZYX1hNTFBBUlNFUl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0YWNrPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sc3ludGF4cGFyc2VyLmgiCisKK2NsYXNzIENGWF9YTUxFbGVtZW50OworY2xhc3MgQ0ZYX1hNTE5vZGU7CitjbGFzcyBDRlhfU2Vla2FibGVTdHJlYW1Qcm94eTsKKworY2xhc3MgQ0ZYX1hNTFBhcnNlciB7CisgcHVibGljOgorICBDRlhfWE1MUGFyc2VyKENGWF9YTUxOb2RlKiBwUGFyZW50LAorICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfU2Vla2FibGVTdHJlYW1Qcm94eT4mIHBTdHJlYW0pOworICB+Q0ZYX1hNTFBhcnNlcigpOworCisgIGludDMyX3QgRG9QYXJzZXIoKTsKKworICBGWF9GSUxFU0laRSBtX25TdGFydFsyXTsKKyAgc2l6ZV90IG1fblNpemVbMl07CisgIEZYX0ZJTEVTSVpFIG1fbkVsZW1lbnRTdGFydDsKKyAgdWludDE2X3QgbV9kd0NoZWNrU3RhdHVzOworICB1aW50MTZfdCBtX2R3Q3VycmVudENoZWNrU3RhdHVzOworCisgcHJpdmF0ZToKKyAgUmV0YWluUHRyPENGWF9TZWVrYWJsZVN0cmVhbVByb3h5PiBtX3BTdHJlYW07CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfWE1MU3ludGF4UGFyc2VyPiBtX3BQYXJzZXI7CisgIENGWF9YTUxOb2RlKiBtX3BQYXJlbnQ7CisgIENGWF9YTUxOb2RlKiBtX3BDaGlsZDsKKyAgc3RkOjpzdGFjazxDRlhfWE1MTm9kZSo+IG1fTm9kZVN0YWNrOworICBXaWRlU3RyaW5nIG1fd3MxOworICBXaWRlU3RyaW5nIG1fd3MyOworICBGWF9YbWxTeW50YXhSZXN1bHQgbV9zeW50YXhQYXJzZXJSZXN1bHQ7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfWE1MX0NGWF9YTUxQQVJTRVJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQveG1sL2NmeF94bWxzeW50YXhwYXJzZXIuY3BwIGIvY29yZS9meGNydC94bWwvY2Z4X3htbHN5bnRheHBhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBjYzFhNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQveG1sL2NmeF94bWxzeW50YXhwYXJzZXIuY3BwCkBAIC0wLDAgKzEsNjk0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sc3ludGF4cGFyc2VyLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3djdHlwZT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IHVpbnQzMl90IGtNYXhDaGFyUmFuZ2UgPSAweDEwZmZmZjsKKworYm9vbCBJc1hNTFdoaXRlU3BhY2Uod2NoYXJfdCBjaCkgeworICByZXR1cm4gY2ggPT0gTCcgJyB8fCBjaCA9PSAweDBBIHx8IGNoID09IDB4MEQgfHwgY2ggPT0gMHgwOTsKK30KKworc3RydWN0IEZYX1hNTE5BTUVDSEFSIHsKKyAgdWludDE2X3Qgd1N0YXJ0OworICB1aW50MTZfdCB3RW5kOworICBib29sIGJTdGFydENoYXI7Cit9OworCitjb25zdCBGWF9YTUxOQU1FQ0hBUiBnX1hNTE5hbWVDaGFyc1tdID0geworICAgIHtMJy0nLCBMJy4nLCBmYWxzZX0sICAgIHtMJzAnLCBMJzknLCBmYWxzZX0sICAgICB7TCc6JywgTCc6JywgZmFsc2V9LAorICAgIHtMJ0EnLCBMJ1onLCB0cnVlfSwgICAgIHtMJ18nLCBMJ18nLCB0cnVlfSwgICAgICB7TCdhJywgTCd6JywgdHJ1ZX0sCisgICAgezB4QjcsIDB4QjcsIGZhbHNlfSwgICAgezB4QzAsIDB4RDYsIHRydWV9LCAgICAgIHsweEQ4LCAweEY2LCB0cnVlfSwKKyAgICB7MHhGOCwgMHgwMkZGLCB0cnVlfSwgICB7MHgwMzAwLCAweDAzNkYsIGZhbHNlfSwgezB4MDM3MCwgMHgwMzdELCB0cnVlfSwKKyAgICB7MHgwMzdGLCAweDFGRkYsIHRydWV9LCB7MHgyMDBDLCAweDIwMEQsIHRydWV9LCAgezB4MjAzRiwgMHgyMDQwLCBmYWxzZX0sCisgICAgezB4MjA3MCwgMHgyMThGLCB0cnVlfSwgezB4MkMwMCwgMHgyRkVGLCB0cnVlfSwgIHsweDMwMDEsIDB4RDdGRiwgdHJ1ZX0sCisgICAgezB4RjkwMCwgMHhGRENGLCB0cnVlfSwgezB4RkRGMCwgMHhGRkZELCB0cnVlfSwKK307CisKKworaW50MzJfdCBHZXRVVEY4RW5jb2RlTGVuZ3RoKGNvbnN0IHN0ZDo6dmVjdG9yPHdjaGFyX3Q+JiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgaVNyY0xlbikgeworICB1aW50MzJfdCB1bmljb2RlID0gMDsKKyAgaW50MzJfdCBpRHN0TnVtID0gMDsKKyAgY29uc3Qgd2NoYXJfdCogcFNyYyA9IHNyYy5kYXRhKCk7CisgIHdoaWxlIChpU3JjTGVuLS0gPiAwKSB7CisgICAgdW5pY29kZSA9ICpwU3JjKys7CisgICAgaW50IG5ieXRlcyA9IDA7CisgICAgaWYgKCh1aW50MzJfdCl1bmljb2RlIDwgMHg4MCkgeworICAgICAgbmJ5dGVzID0gMTsKKyAgICB9IGVsc2UgaWYgKCh1aW50MzJfdCl1bmljb2RlIDwgMHg4MDApIHsKKyAgICAgIG5ieXRlcyA9IDI7CisgICAgfSBlbHNlIGlmICgodWludDMyX3QpdW5pY29kZSA8IDB4MTAwMDApIHsKKyAgICAgIG5ieXRlcyA9IDM7CisgICAgfSBlbHNlIGlmICgodWludDMyX3QpdW5pY29kZSA8IDB4MjAwMDAwKSB7CisgICAgICBuYnl0ZXMgPSA0OworICAgIH0gZWxzZSBpZiAoKHVpbnQzMl90KXVuaWNvZGUgPCAweDQwMDAwMDApIHsKKyAgICAgIG5ieXRlcyA9IDU7CisgICAgfSBlbHNlIHsKKyAgICAgIG5ieXRlcyA9IDY7CisgICAgfQorICAgIGlEc3ROdW0gKz0gbmJ5dGVzOworICB9CisgIHJldHVybiBpRHN0TnVtOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitib29sIENGWF9YTUxTeW50YXhQYXJzZXI6OklzWE1MTmFtZUNoYXIod2NoYXJfdCBjaCwgYm9vbCBiRmlyc3RDaGFyKSB7CisgIGF1dG8qIGl0ID0gc3RkOjpsb3dlcl9ib3VuZCgKKyAgICAgIHN0ZDo6YmVnaW4oZ19YTUxOYW1lQ2hhcnMpLCBzdGQ6OmVuZChnX1hNTE5hbWVDaGFycyksIGNoLAorICAgICAgW10oY29uc3QgRlhfWE1MTkFNRUNIQVImIGFyZywgd2NoYXJfdCBjaCkgeyByZXR1cm4gYXJnLndFbmQgPCBjaDsgfSk7CisgIHJldHVybiBpdCAhPSBzdGQ6OmVuZChnX1hNTE5hbWVDaGFycykgJiYgY2ggPj0gaXQtPndTdGFydCAmJgorICAgICAgICAgKCFiRmlyc3RDaGFyIHx8IGl0LT5iU3RhcnRDaGFyKTsKK30KKworQ0ZYX1hNTFN5bnRheFBhcnNlcjo6Q0ZYX1hNTFN5bnRheFBhcnNlcigKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX1NlZWthYmxlU3RyZWFtUHJveHk+JiBwU3RyZWFtKQorICAgIDogbV9wU3RyZWFtKHBTdHJlYW0pLAorICAgICAgbV9pWE1MUGxhbmVTaXplKDMyICogMTAyNCksCisgICAgICBtX2lDdXJyZW50UG9zKDApLAorICAgICAgbV9pQ3VycmVudE5vZGVOdW0oLTEpLAorICAgICAgbV9pTGFzdE5vZGVOdW0oLTEpLAorICAgICAgbV9pUGFyc2VkQnl0ZXMoMCksCisgICAgICBtX1BhcnNlZENoYXJzKDApLAorICAgICAgbV9pQnVmZmVyQ2hhcnMoMCksCisgICAgICBtX2JFT1MoZmFsc2UpLAorICAgICAgbV9TdGFydCgwKSwKKyAgICAgIG1fRW5kKDApLAorICAgICAgbV9pQWxsb2NTdGVwKG1fQmxvY2tCdWZmZXIuR2V0QWxsb2NTdGVwKCkpLAorICAgICAgbV9wQ3VycmVudEJsb2NrKG51bGxwdHIpLAorICAgICAgbV9pSW5kZXhJbkJsb2NrKDApLAorICAgICAgbV9pVGV4dERhdGFMZW5ndGgoMCksCisgICAgICBtX3N5bnRheFBhcnNlclJlc3VsdChGWF9YbWxTeW50YXhSZXN1bHQ6Ok5vbmUpLAorICAgICAgbV9zeW50YXhQYXJzZXJTdGF0ZShGREVfWG1sU3ludGF4U3RhdGU6OlRleHQpLAorICAgICAgbV93UXVvdGF0aW9uTWFyaygwKSwKKyAgICAgIG1faUVudGl0eVN0YXJ0KC0xKSB7CisgIEFTU0VSVChwU3RyZWFtKTsKKworICBtX0N1ck5vZGUuaU5vZGVOdW0gPSAtMTsKKyAgbV9DdXJOb2RlLmVOb2RlVHlwZSA9IEZYX1hNTE5PREVfVW5rbm93bjsKKworICBtX2lYTUxQbGFuZVNpemUgPQorICAgICAgc3RkOjptaW4obV9pWE1MUGxhbmVTaXplLAorICAgICAgICAgICAgICAgcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8c2l6ZV90PihtX3BTdHJlYW0tPkdldExlbmd0aCgpKSk7CisgIG1faUN1cnJlbnRQb3MgPSBtX3BTdHJlYW0tPkdldEJPTUxlbmd0aCgpOworCisgIEZYX1NBRkVfU0laRV9UIGFsbG9jX3NpemVfc2FmZSA9IG1faVhNTFBsYW5lU2l6ZTsKKyAgYWxsb2Nfc2l6ZV9zYWZlICs9IDE7ICAvLyBGb3IgTlVMLgorICBpZiAoIWFsbG9jX3NpemVfc2FmZS5Jc1ZhbGlkKCkgfHwgYWxsb2Nfc2l6ZV9zYWZlLlZhbHVlT3JEaWUoKSA8PSAwKSB7CisgICAgbV9zeW50YXhQYXJzZXJSZXN1bHQgPSBGWF9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOworICAgIHJldHVybjsKKyAgfQorCisgIG1fQnVmZmVyLnJlc2l6ZShwZGZpdW06OmJhc2U6OlZhbHVlT3JEaWVGb3JUeXBlPHNpemVfdD4oYWxsb2Nfc2l6ZV9zYWZlKSk7CisKKyAgbV9CbG9ja0J1ZmZlci5Jbml0QnVmZmVyKCk7CisgIHN0ZDo6dGllKG1fcEN1cnJlbnRCbG9jaywgbV9pSW5kZXhJbkJsb2NrKSA9CisgICAgICBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKCk7Cit9CisKK0NGWF9YTUxTeW50YXhQYXJzZXI6On5DRlhfWE1MU3ludGF4UGFyc2VyKCkge30KKworRlhfWG1sU3ludGF4UmVzdWx0IENGWF9YTUxTeW50YXhQYXJzZXI6OkRvU3ludGF4UGFyc2UoKSB7CisgIGlmIChtX3N5bnRheFBhcnNlclJlc3VsdCA9PSBGWF9YbWxTeW50YXhSZXN1bHQ6OkVycm9yIHx8CisgICAgICBtX3N5bnRheFBhcnNlclJlc3VsdCA9PSBGWF9YbWxTeW50YXhSZXN1bHQ6OkVuZE9mU3RyaW5nKSB7CisgICAgcmV0dXJuIG1fc3ludGF4UGFyc2VyUmVzdWx0OworICB9CisKKyAgRlhfRklMRVNJWkUgaVN0cmVhbUxlbmd0aCA9IG1fcFN0cmVhbS0+R2V0TGVuZ3RoKCk7CisgIEZYX0ZJTEVTSVpFIGlQb3M7CisKKyAgRlhfWG1sU3ludGF4UmVzdWx0IHN5bnRheFBhcnNlclJlc3VsdCA9IEZYX1htbFN5bnRheFJlc3VsdDo6Tm9uZTsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAobV9TdGFydCA+PSBtX0VuZCkgeworICAgICAgaWYgKG1fYkVPUyB8fCBtX2lDdXJyZW50UG9zID49IGlTdHJlYW1MZW5ndGgpIHsKKyAgICAgICAgbV9zeW50YXhQYXJzZXJSZXN1bHQgPSBGWF9YbWxTeW50YXhSZXN1bHQ6OkVuZE9mU3RyaW5nOworICAgICAgICByZXR1cm4gbV9zeW50YXhQYXJzZXJSZXN1bHQ7CisgICAgICB9CisgICAgICBtX1BhcnNlZENoYXJzICs9IG1fRW5kOworICAgICAgbV9pUGFyc2VkQnl0ZXMgPSBtX2lDdXJyZW50UG9zOworICAgICAgaWYgKG1fcFN0cmVhbS0+R2V0UG9zaXRpb24oKSAhPSBtX2lDdXJyZW50UG9zKQorICAgICAgICBtX3BTdHJlYW0tPlNlZWsoQ0ZYX1NlZWthYmxlU3RyZWFtUHJveHk6OkZyb206OkJlZ2luLCBtX2lDdXJyZW50UG9zKTsKKworICAgICAgbV9pQnVmZmVyQ2hhcnMgPQorICAgICAgICAgIG1fcFN0cmVhbS0+UmVhZFN0cmluZyhtX0J1ZmZlci5kYXRhKCksIG1faVhNTFBsYW5lU2l6ZSwgJm1fYkVPUyk7CisgICAgICBpUG9zID0gbV9wU3RyZWFtLT5HZXRQb3NpdGlvbigpOworICAgICAgaWYgKG1faUJ1ZmZlckNoYXJzIDwgMSkgeworICAgICAgICBtX2lDdXJyZW50UG9zID0gaVN0cmVhbUxlbmd0aDsKKyAgICAgICAgbV9zeW50YXhQYXJzZXJSZXN1bHQgPSBGWF9YbWxTeW50YXhSZXN1bHQ6OkVuZE9mU3RyaW5nOworICAgICAgICByZXR1cm4gbV9zeW50YXhQYXJzZXJSZXN1bHQ7CisgICAgICB9CisgICAgICBtX2lDdXJyZW50UG9zID0gaVBvczsKKyAgICAgIG1fU3RhcnQgPSAwOworICAgICAgbV9FbmQgPSBtX2lCdWZmZXJDaGFyczsKKyAgICB9CisKKyAgICB3aGlsZSAobV9TdGFydCA8IG1fRW5kKSB7CisgICAgICB3Y2hhcl90IGNoID0gbV9CdWZmZXJbbV9TdGFydF07CisgICAgICBzd2l0Y2ggKG1fc3ludGF4UGFyc2VyU3RhdGUpIHsKKyAgICAgICAgY2FzZSBGREVfWG1sU3ludGF4U3RhdGU6OlRleHQ6CisgICAgICAgICAgaWYgKGNoID09IEwnPCcpIHsKKyAgICAgICAgICAgIGlmICghbV9CbG9ja0J1ZmZlci5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX0Jsb2NrQnVmZmVyLkdldERhdGFMZW5ndGgoKTsKKyAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5SZXNldCh0cnVlKTsKKyAgICAgICAgICAgICAgc3RkOjp0aWUobV9wQ3VycmVudEJsb2NrLCBtX2lJbmRleEluQmxvY2spID0KKyAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2soKTsKKyAgICAgICAgICAgICAgbV9pRW50aXR5U3RhcnQgPSAtMTsKKyAgICAgICAgICAgICAgc3ludGF4UGFyc2VyUmVzdWx0ID0gRlhfWG1sU3ludGF4UmVzdWx0OjpUZXh0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgbV9TdGFydCsrOworICAgICAgICAgICAgICBtX3N5bnRheFBhcnNlclN0YXRlID0gRkRFX1htbFN5bnRheFN0YXRlOjpOb2RlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQYXJzZVRleHRDaGFyKGNoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRkRFX1htbFN5bnRheFN0YXRlOjpOb2RlOgorICAgICAgICAgIGlmIChjaCA9PSBMJyEnKSB7CisgICAgICAgICAgICBtX1N0YXJ0Kys7CisgICAgICAgICAgICBtX3N5bnRheFBhcnNlclN0YXRlID0gRkRFX1htbFN5bnRheFN0YXRlOjpTa2lwQ29tbWVudE9yRGVjbDsKKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IEwnLycpIHsKKyAgICAgICAgICAgIG1fU3RhcnQrKzsKKyAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OkNsb3NlRWxlbWVudDsKKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IEwnPycpIHsKKyAgICAgICAgICAgIG1faUxhc3ROb2RlTnVtKys7CisgICAgICAgICAgICBtX2lDdXJyZW50Tm9kZU51bSA9IG1faUxhc3ROb2RlTnVtOworICAgICAgICAgICAgbV9DdXJOb2RlLmlOb2RlTnVtID0gbV9pTGFzdE5vZGVOdW07CisgICAgICAgICAgICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRlhfWE1MTk9ERV9JbnN0cnVjdGlvbjsKKyAgICAgICAgICAgIG1fWE1MTm9kZVN0YWNrLnB1c2gobV9DdXJOb2RlKTsKKyAgICAgICAgICAgIG1fU3RhcnQrKzsKKyAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OlRhcmdldDsKKyAgICAgICAgICAgIHN5bnRheFBhcnNlclJlc3VsdCA9IEZYX1htbFN5bnRheFJlc3VsdDo6SW5zdHJ1Y3Rpb25PcGVuOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX2lMYXN0Tm9kZU51bSsrOworICAgICAgICAgICAgbV9pQ3VycmVudE5vZGVOdW0gPSBtX2lMYXN0Tm9kZU51bTsKKyAgICAgICAgICAgIG1fQ3VyTm9kZS5pTm9kZU51bSA9IG1faUxhc3ROb2RlTnVtOworICAgICAgICAgICAgbV9DdXJOb2RlLmVOb2RlVHlwZSA9IEZYX1hNTE5PREVfRWxlbWVudDsKKyAgICAgICAgICAgIG1fWE1MTm9kZVN0YWNrLnB1c2gobV9DdXJOb2RlKTsKKyAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OlRhZzsKKyAgICAgICAgICAgIHN5bnRheFBhcnNlclJlc3VsdCA9IEZYX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudE9wZW47CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZERV9YbWxTeW50YXhTdGF0ZTo6VGFyZ2V0OgorICAgICAgICBjYXNlIEZERV9YbWxTeW50YXhTdGF0ZTo6VGFnOgorICAgICAgICAgIGlmICghSXNYTUxOYW1lQ2hhcihjaCwgbV9CbG9ja0J1ZmZlci5Jc0VtcHR5KCkpKSB7CisgICAgICAgICAgICBpZiAobV9CbG9ja0J1ZmZlci5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJSZXN1bHQgPSBGWF9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOworICAgICAgICAgICAgICByZXR1cm4gbV9zeW50YXhQYXJzZXJSZXN1bHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9CbG9ja0J1ZmZlci5HZXREYXRhTGVuZ3RoKCk7CisgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KHRydWUpOworICAgICAgICAgICAgc3RkOjp0aWUobV9wQ3VycmVudEJsb2NrLCBtX2lJbmRleEluQmxvY2spID0KKyAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKCk7CisgICAgICAgICAgICBpZiAobV9zeW50YXhQYXJzZXJTdGF0ZSAhPSBGREVfWG1sU3ludGF4U3RhdGU6OlRhcmdldCkKKyAgICAgICAgICAgICAgc3ludGF4UGFyc2VyUmVzdWx0ID0gRlhfWG1sU3ludGF4UmVzdWx0OjpUYWdOYW1lOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBzeW50YXhQYXJzZXJSZXN1bHQgPSBGWF9YbWxTeW50YXhSZXN1bHQ6OlRhcmdldE5hbWU7CisKKyAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OkF0dHJpTmFtZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG1faUluZGV4SW5CbG9jayA9PSBtX2lBbGxvY1N0ZXApIHsKKyAgICAgICAgICAgICAgc3RkOjp0aWUobV9wQ3VycmVudEJsb2NrLCBtX2lJbmRleEluQmxvY2spID0KKyAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2soKTsKKyAgICAgICAgICAgICAgaWYgKCFtX3BDdXJyZW50QmxvY2spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRlhfWG1sU3ludGF4UmVzdWx0OjpFcnJvcjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrW21faUluZGV4SW5CbG9jaysrXSA9IGNoOworICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5JbmNyZW1lbnREYXRhTGVuZ3RoKCk7CisgICAgICAgICAgICBtX1N0YXJ0Kys7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZERV9YbWxTeW50YXhTdGF0ZTo6QXR0cmlOYW1lOgorICAgICAgICAgIGlmIChtX0Jsb2NrQnVmZmVyLklzRW1wdHkoKSAmJiBJc1hNTFdoaXRlU3BhY2UoY2gpKSB7CisgICAgICAgICAgICBtX1N0YXJ0Kys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFJc1hNTE5hbWVDaGFyKGNoLCBtX0Jsb2NrQnVmZmVyLklzRW1wdHkoKSkpIHsKKyAgICAgICAgICAgIGlmIChtX0Jsb2NrQnVmZmVyLklzRW1wdHkoKSkgeworICAgICAgICAgICAgICBpZiAobV9DdXJOb2RlLmVOb2RlVHlwZSA9PSBGWF9YTUxOT0RFX0VsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2ggPT0gTCc+JyB8fCBjaCA9PSBMJy8nKSB7CisgICAgICAgICAgICAgICAgICBtX3N5bnRheFBhcnNlclN0YXRlID0gRkRFX1htbFN5bnRheFN0YXRlOjpCcmVha0VsZW1lbnQ7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0gZWxzZSBpZiAobV9DdXJOb2RlLmVOb2RlVHlwZSA9PSBGWF9YTUxOT0RFX0luc3RydWN0aW9uKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoID09IEwnPycpIHsKKyAgICAgICAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OkNsb3NlSW5zdHJ1Y3Rpb247CisgICAgICAgICAgICAgICAgICBtX1N0YXJ0Kys7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OlRhcmdldERhdGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyUmVzdWx0ID0gRlhfWG1sU3ludGF4UmVzdWx0OjpFcnJvcjsKKyAgICAgICAgICAgICAgcmV0dXJuIG1fc3ludGF4UGFyc2VyUmVzdWx0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgaWYgKG1fQ3VyTm9kZS5lTm9kZVR5cGUgPT0gRlhfWE1MTk9ERV9JbnN0cnVjdGlvbikgeworICAgICAgICAgICAgICAgIGlmIChjaCAhPSAnPScgJiYgIUlzWE1MV2hpdGVTcGFjZShjaCkpIHsKKyAgICAgICAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OlRhcmdldERhdGE7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX0Jsb2NrQnVmZmVyLkdldERhdGFMZW5ndGgoKTsKKyAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5SZXNldCh0cnVlKTsKKyAgICAgICAgICAgICAgc3RkOjp0aWUobV9wQ3VycmVudEJsb2NrLCBtX2lJbmRleEluQmxvY2spID0KKyAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2soKTsKKyAgICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJTdGF0ZSA9IEZERV9YbWxTeW50YXhTdGF0ZTo6QXR0cmlFcXVhbFNpZ247CisgICAgICAgICAgICAgIHN5bnRheFBhcnNlclJlc3VsdCA9IEZYX1htbFN5bnRheFJlc3VsdDo6QXR0cmlOYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobV9pSW5kZXhJbkJsb2NrID09IG1faUFsbG9jU3RlcCkgeworICAgICAgICAgICAgICBzdGQ6OnRpZShtX3BDdXJyZW50QmxvY2ssIG1faUluZGV4SW5CbG9jaykgPQorICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jaygpOworICAgICAgICAgICAgICBpZiAoIW1fcEN1cnJlbnRCbG9jaykgeworICAgICAgICAgICAgICAgIHJldHVybiBGWF9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2tbbV9pSW5kZXhJbkJsb2NrKytdID0gY2g7CisgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkluY3JlbWVudERhdGFMZW5ndGgoKTsKKyAgICAgICAgICAgIG1fU3RhcnQrKzsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRkRFX1htbFN5bnRheFN0YXRlOjpBdHRyaUVxdWFsU2lnbjoKKyAgICAgICAgICBpZiAoSXNYTUxXaGl0ZVNwYWNlKGNoKSkgeworICAgICAgICAgICAgbV9TdGFydCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChjaCAhPSBMJz0nKSB7CisgICAgICAgICAgICBpZiAobV9DdXJOb2RlLmVOb2RlVHlwZSA9PSBGWF9YTUxOT0RFX0luc3RydWN0aW9uKSB7CisgICAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OlRhcmdldERhdGE7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJSZXN1bHQgPSBGWF9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOworICAgICAgICAgICAgcmV0dXJuIG1fc3ludGF4UGFyc2VyUmVzdWx0OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX3N5bnRheFBhcnNlclN0YXRlID0gRkRFX1htbFN5bnRheFN0YXRlOjpBdHRyaVF1b3RhdGlvbjsKKyAgICAgICAgICAgIG1fU3RhcnQrKzsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRkRFX1htbFN5bnRheFN0YXRlOjpBdHRyaVF1b3RhdGlvbjoKKyAgICAgICAgICBpZiAoSXNYTUxXaGl0ZVNwYWNlKGNoKSkgeworICAgICAgICAgICAgbV9TdGFydCsrOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChjaCAhPSBMJ1wiJyAmJiBjaCAhPSBMJ1wnJykgeworICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJSZXN1bHQgPSBGWF9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOworICAgICAgICAgICAgcmV0dXJuIG1fc3ludGF4UGFyc2VyUmVzdWx0OworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtX3dRdW90YXRpb25NYXJrID0gY2g7CisgICAgICAgICAgICBtX3N5bnRheFBhcnNlclN0YXRlID0gRkRFX1htbFN5bnRheFN0YXRlOjpBdHRyaVZhbHVlOworICAgICAgICAgICAgbV9TdGFydCsrOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGREVfWG1sU3ludGF4U3RhdGU6OkF0dHJpVmFsdWU6CisgICAgICAgICAgaWYgKGNoID09IG1fd1F1b3RhdGlvbk1hcmspIHsKKyAgICAgICAgICAgIGlmIChtX2lFbnRpdHlTdGFydCA+IC0xKSB7CisgICAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyUmVzdWx0ID0gRlhfWG1sU3ludGF4UmVzdWx0OjpFcnJvcjsKKyAgICAgICAgICAgICAgcmV0dXJuIG1fc3ludGF4UGFyc2VyUmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX0Jsb2NrQnVmZmVyLkdldERhdGFMZW5ndGgoKTsKKyAgICAgICAgICAgIG1fd1F1b3RhdGlvbk1hcmsgPSAwOworICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5SZXNldCh0cnVlKTsKKyAgICAgICAgICAgIHN0ZDo6dGllKG1fcEN1cnJlbnRCbG9jaywgbV9pSW5kZXhJbkJsb2NrKSA9CisgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jaygpOworICAgICAgICAgICAgbV9TdGFydCsrOworICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJTdGF0ZSA9IEZERV9YbWxTeW50YXhTdGF0ZTo6QXR0cmlOYW1lOworICAgICAgICAgICAgc3ludGF4UGFyc2VyUmVzdWx0ID0gRlhfWG1sU3ludGF4UmVzdWx0OjpBdHRyaVZhbHVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQYXJzZVRleHRDaGFyKGNoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRkRFX1htbFN5bnRheFN0YXRlOjpDbG9zZUluc3RydWN0aW9uOgorICAgICAgICAgIGlmIChjaCAhPSBMJz4nKSB7CisgICAgICAgICAgICBpZiAobV9pSW5kZXhJbkJsb2NrID09IG1faUFsbG9jU3RlcCkgeworICAgICAgICAgICAgICBzdGQ6OnRpZShtX3BDdXJyZW50QmxvY2ssIG1faUluZGV4SW5CbG9jaykgPQorICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jaygpOworICAgICAgICAgICAgICBpZiAoIW1fcEN1cnJlbnRCbG9jaykgeworICAgICAgICAgICAgICAgIHJldHVybiBGWF9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2tbbV9pSW5kZXhJbkJsb2NrKytdID0gY2g7CisgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkluY3JlbWVudERhdGFMZW5ndGgoKTsKKyAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OlRhcmdldERhdGE7CisgICAgICAgICAgfSBlbHNlIGlmICghbV9CbG9ja0J1ZmZlci5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9CbG9ja0J1ZmZlci5HZXREYXRhTGVuZ3RoKCk7CisgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KHRydWUpOworICAgICAgICAgICAgc3RkOjp0aWUobV9wQ3VycmVudEJsb2NrLCBtX2lJbmRleEluQmxvY2spID0KKyAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKCk7CisgICAgICAgICAgICBzeW50YXhQYXJzZXJSZXN1bHQgPSBGWF9YbWxTeW50YXhSZXN1bHQ6OlRhcmdldERhdGE7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1fU3RhcnQrKzsKKyAgICAgICAgICAgIGlmIChtX1hNTE5vZGVTdGFjay5lbXB0eSgpKSB7CisgICAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyUmVzdWx0ID0gRlhfWG1sU3ludGF4UmVzdWx0OjpFcnJvcjsKKyAgICAgICAgICAgICAgcmV0dXJuIG1fc3ludGF4UGFyc2VyUmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9YTUxOb2RlU3RhY2sucG9wKCk7CisgICAgICAgICAgICBpZiAoIW1fWE1MTm9kZVN0YWNrLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgbV9DdXJOb2RlID0gbV9YTUxOb2RlU3RhY2sudG9wKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBtX0N1ck5vZGUuaU5vZGVOdW0gPSAtMTsKKyAgICAgICAgICAgICAgbV9DdXJOb2RlLmVOb2RlVHlwZSA9IEZYX1hNTE5PREVfVW5rbm93bjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1faUN1cnJlbnROb2RlTnVtID0gbV9DdXJOb2RlLmlOb2RlTnVtOworICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5SZXNldCh0cnVlKTsKKyAgICAgICAgICAgIHN0ZDo6dGllKG1fcEN1cnJlbnRCbG9jaywgbV9pSW5kZXhJbkJsb2NrKSA9CisgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jaygpOworICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJTdGF0ZSA9IEZERV9YbWxTeW50YXhTdGF0ZTo6VGV4dDsKKyAgICAgICAgICAgIHN5bnRheFBhcnNlclJlc3VsdCA9IEZYX1htbFN5bnRheFJlc3VsdDo6SW5zdHJ1Y3Rpb25DbG9zZTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRkRFX1htbFN5bnRheFN0YXRlOjpCcmVha0VsZW1lbnQ6CisgICAgICAgICAgaWYgKGNoID09IEwnPicpIHsKKyAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OlRleHQ7CisgICAgICAgICAgICBzeW50YXhQYXJzZXJSZXN1bHQgPSBGWF9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRCcmVhazsKKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IEwnLycpIHsKKyAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OkNsb3NlRWxlbWVudDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJSZXN1bHQgPSBGWF9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOworICAgICAgICAgICAgcmV0dXJuIG1fc3ludGF4UGFyc2VyUmVzdWx0OworICAgICAgICAgIH0KKyAgICAgICAgICBtX1N0YXJ0Kys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRkRFX1htbFN5bnRheFN0YXRlOjpDbG9zZUVsZW1lbnQ6CisgICAgICAgICAgaWYgKCFJc1hNTE5hbWVDaGFyKGNoLCBtX0Jsb2NrQnVmZmVyLklzRW1wdHkoKSkpIHsKKyAgICAgICAgICAgIGlmIChjaCA9PSBMJz4nKSB7CisgICAgICAgICAgICAgIGlmIChtX1hNTE5vZGVTdGFjay5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJSZXN1bHQgPSBGWF9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOworICAgICAgICAgICAgICAgIHJldHVybiBtX3N5bnRheFBhcnNlclJlc3VsdDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBtX1hNTE5vZGVTdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgaWYgKCFtX1hNTE5vZGVTdGFjay5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbV9DdXJOb2RlID0gbV9YTUxOb2RlU3RhY2sudG9wKCk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbV9DdXJOb2RlLmlOb2RlTnVtID0gLTE7CisgICAgICAgICAgICAgICAgbV9DdXJOb2RlLmVOb2RlVHlwZSA9IEZYX1hNTE5PREVfVW5rbm93bjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBtX2lDdXJyZW50Tm9kZU51bSA9IG1fQ3VyTm9kZS5pTm9kZU51bTsKKyAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX0Jsb2NrQnVmZmVyLkdldERhdGFMZW5ndGgoKTsKKyAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5SZXNldCh0cnVlKTsKKyAgICAgICAgICAgICAgc3RkOjp0aWUobV9wQ3VycmVudEJsb2NrLCBtX2lJbmRleEluQmxvY2spID0KKyAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2soKTsKKyAgICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJTdGF0ZSA9IEZERV9YbWxTeW50YXhTdGF0ZTo6VGV4dDsKKyAgICAgICAgICAgICAgc3ludGF4UGFyc2VyUmVzdWx0ID0gRlhfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50Q2xvc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFJc1hNTFdoaXRlU3BhY2UoY2gpKSB7CisgICAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyUmVzdWx0ID0gRlhfWG1sU3ludGF4UmVzdWx0OjpFcnJvcjsKKyAgICAgICAgICAgICAgcmV0dXJuIG1fc3ludGF4UGFyc2VyUmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobV9pSW5kZXhJbkJsb2NrID09IG1faUFsbG9jU3RlcCkgeworICAgICAgICAgICAgICBzdGQ6OnRpZShtX3BDdXJyZW50QmxvY2ssIG1faUluZGV4SW5CbG9jaykgPQorICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jaygpOworICAgICAgICAgICAgICBpZiAoIW1fcEN1cnJlbnRCbG9jaykgeworICAgICAgICAgICAgICAgIHJldHVybiBGWF9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2tbbV9pSW5kZXhJbkJsb2NrKytdID0gY2g7CisgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkluY3JlbWVudERhdGFMZW5ndGgoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgbV9TdGFydCsrOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZERV9YbWxTeW50YXhTdGF0ZTo6U2tpcENvbW1lbnRPckRlY2w6CisgICAgICAgICAgaWYgKEZYU1lTX3djc25pY21wKG1fQnVmZmVyLmRhdGEoKSArIG1fU3RhcnQsIEwiLS0iLCAyKSA9PSAwKSB7CisgICAgICAgICAgICBtX1N0YXJ0ICs9IDI7CisgICAgICAgICAgICBtX3N5bnRheFBhcnNlclN0YXRlID0gRkRFX1htbFN5bnRheFN0YXRlOjpTa2lwQ29tbWVudDsKKyAgICAgICAgICB9IGVsc2UgaWYgKEZYU1lTX3djc25pY21wKG1fQnVmZmVyLmRhdGEoKSArIG1fU3RhcnQsIEwiW0NEQVRBWyIsIDcpID09CisgICAgICAgICAgICAgICAgICAgICAwKSB7CisgICAgICAgICAgICBtX1N0YXJ0ICs9IDc7CisgICAgICAgICAgICBtX3N5bnRheFBhcnNlclN0YXRlID0gRkRFX1htbFN5bnRheFN0YXRlOjpTa2lwQ0RhdGE7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OlNraXBEZWNsTm9kZTsKKyAgICAgICAgICAgIG1fU2tpcENoYXIgPSBMJz4nOworICAgICAgICAgICAgbV9Ta2lwU3RhY2sucHVzaChMJz4nKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRkRFX1htbFN5bnRheFN0YXRlOjpTa2lwQ0RhdGE6IHsKKyAgICAgICAgICBpZiAoRlhTWVNfd2NzbmljbXAobV9CdWZmZXIuZGF0YSgpICsgbV9TdGFydCwgTCJdXT4iLCAzKSA9PSAwKSB7CisgICAgICAgICAgICBtX1N0YXJ0ICs9IDM7CisgICAgICAgICAgICBzeW50YXhQYXJzZXJSZXN1bHQgPSBGWF9YbWxTeW50YXhSZXN1bHQ6OkNEYXRhOworICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX0Jsb2NrQnVmZmVyLkdldERhdGFMZW5ndGgoKTsKKyAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQodHJ1ZSk7CisgICAgICAgICAgICBzdGQ6OnRpZShtX3BDdXJyZW50QmxvY2ssIG1faUluZGV4SW5CbG9jaykgPQorICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2soKTsKKyAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OlRleHQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtX2lJbmRleEluQmxvY2sgPT0gbV9pQWxsb2NTdGVwKSB7CisgICAgICAgICAgICAgIHN0ZDo6dGllKG1fcEN1cnJlbnRCbG9jaywgbV9pSW5kZXhJbkJsb2NrKSA9CisgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKCk7CisgICAgICAgICAgICAgIGlmICghbV9wQ3VycmVudEJsb2NrKQorICAgICAgICAgICAgICAgIHJldHVybiBGWF9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrW21faUluZGV4SW5CbG9jaysrXSA9IGNoOworICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5JbmNyZW1lbnREYXRhTGVuZ3RoKCk7CisgICAgICAgICAgICBtX1N0YXJ0Kys7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgRkRFX1htbFN5bnRheFN0YXRlOjpTa2lwRGVjbE5vZGU6CisgICAgICAgICAgaWYgKG1fU2tpcENoYXIgPT0gTCdcJycgfHwgbV9Ta2lwQ2hhciA9PSBMJ1wiJykgeworICAgICAgICAgICAgbV9TdGFydCsrOworICAgICAgICAgICAgaWYgKGNoICE9IG1fU2tpcENoYXIpCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBtX1NraXBTdGFjay5wb3AoKTsKKyAgICAgICAgICAgIGlmIChtX1NraXBTdGFjay5lbXB0eSgpKQorICAgICAgICAgICAgICBtX3N5bnRheFBhcnNlclN0YXRlID0gRkRFX1htbFN5bnRheFN0YXRlOjpUZXh0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBtX1NraXBDaGFyID0gbV9Ta2lwU3RhY2sudG9wKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAoY2gpIHsKKyAgICAgICAgICAgICAgY2FzZSBMJzwnOgorICAgICAgICAgICAgICAgIG1fU2tpcENoYXIgPSBMJz4nOworICAgICAgICAgICAgICAgIG1fU2tpcFN0YWNrLnB1c2goTCc+Jyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgTCdbJzoKKyAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gTCddJzsKKyAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5wdXNoKEwnXScpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBjYXNlIEwnKCc6CisgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IEwnKSc7CisgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2sucHVzaChMJyknKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgY2FzZSBMJ1wnJzoKKyAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gTCdcJyc7CisgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2sucHVzaChMJ1wnJyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIGNhc2UgTCdcIic6CisgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IEwnXCInOworICAgICAgICAgICAgICAgIG1fU2tpcFN0YWNrLnB1c2goTCdcIicpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChjaCA9PSBtX1NraXBDaGFyKSB7CisgICAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgICAgIGlmIChtX1NraXBTdGFjay5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX0Jsb2NrQnVmZmVyLkdldERhdGFMZW5ndGgoKSA+PSA5KQorICAgICAgICAgICAgICAgICAgICAgICh2b2lkKW1fQmxvY2tCdWZmZXIuR2V0VGV4dERhdGEoMCwgNyk7CisKKyAgICAgICAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX0Jsb2NrQnVmZmVyLkdldERhdGFMZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5SZXNldCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp0aWUobV9wQ3VycmVudEJsb2NrLCBtX2lJbmRleEluQmxvY2spID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJTdGF0ZSA9IEZERV9YbWxTeW50YXhTdGF0ZTo6VGV4dDsKKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1fU2tpcENoYXIgPSBtX1NraXBTdGFjay50b3AoKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1fU2tpcFN0YWNrLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgaWYgKG1faUluZGV4SW5CbG9jayA9PSBtX2lBbGxvY1N0ZXApIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnRpZShtX3BDdXJyZW50QmxvY2ssIG1faUluZGV4SW5CbG9jaykgPQorICAgICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKCFtX3BDdXJyZW50QmxvY2spIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBGWF9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2tbbV9pSW5kZXhJbkJsb2NrKytdID0gY2g7CisgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuSW5jcmVtZW50RGF0YUxlbmd0aCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbV9TdGFydCsrOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGREVfWG1sU3ludGF4U3RhdGU6OlNraXBDb21tZW50OgorICAgICAgICAgIGlmIChGWFNZU193Y3NuaWNtcChtX0J1ZmZlci5kYXRhKCkgKyBtX1N0YXJ0LCBMIi0tPiIsIDMpID09IDApIHsKKyAgICAgICAgICAgIG1fU3RhcnQgKz0gMjsKKyAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OlRleHQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgbV9TdGFydCsrOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZERV9YbWxTeW50YXhTdGF0ZTo6VGFyZ2V0RGF0YToKKyAgICAgICAgICBpZiAoSXNYTUxXaGl0ZVNwYWNlKGNoKSkgeworICAgICAgICAgICAgaWYgKG1fQmxvY2tCdWZmZXIuSXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgIG1fU3RhcnQrKzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobV93UXVvdGF0aW9uTWFyayA9PSAwKSB7CisgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9CbG9ja0J1ZmZlci5HZXREYXRhTGVuZ3RoKCk7CisgICAgICAgICAgICAgIG1fd1F1b3RhdGlvbk1hcmsgPSAwOworICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KHRydWUpOworICAgICAgICAgICAgICBzdGQ6OnRpZShtX3BDdXJyZW50QmxvY2ssIG1faUluZGV4SW5CbG9jaykgPQorICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jaygpOworICAgICAgICAgICAgICBtX1N0YXJ0Kys7CisgICAgICAgICAgICAgIHN5bnRheFBhcnNlclJlc3VsdCA9IEZYX1htbFN5bnRheFJlc3VsdDo6VGFyZ2V0RGF0YTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChjaCA9PSAnPycpIHsKKyAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OkNsb3NlSW5zdHJ1Y3Rpb247CisgICAgICAgICAgICBtX1N0YXJ0Kys7CisgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXCInKSB7CisgICAgICAgICAgICBpZiAobV93UXVvdGF0aW9uTWFyayA9PSAwKSB7CisgICAgICAgICAgICAgIG1fd1F1b3RhdGlvbk1hcmsgPSBjaDsKKyAgICAgICAgICAgICAgbV9TdGFydCsrOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBtX3dRdW90YXRpb25NYXJrKSB7CisgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9CbG9ja0J1ZmZlci5HZXREYXRhTGVuZ3RoKCk7CisgICAgICAgICAgICAgIG1fd1F1b3RhdGlvbk1hcmsgPSAwOworICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KHRydWUpOworICAgICAgICAgICAgICBzdGQ6OnRpZShtX3BDdXJyZW50QmxvY2ssIG1faUluZGV4SW5CbG9jaykgPQorICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jaygpOworICAgICAgICAgICAgICBtX1N0YXJ0Kys7CisgICAgICAgICAgICAgIHN5bnRheFBhcnNlclJlc3VsdCA9IEZYX1htbFN5bnRheFJlc3VsdDo6VGFyZ2V0RGF0YTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyUmVzdWx0ID0gRlhfWG1sU3ludGF4UmVzdWx0OjpFcnJvcjsKKyAgICAgICAgICAgICAgcmV0dXJuIG1fc3ludGF4UGFyc2VyUmVzdWx0OworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobV9pSW5kZXhJbkJsb2NrID09IG1faUFsbG9jU3RlcCkgeworICAgICAgICAgICAgICBzdGQ6OnRpZShtX3BDdXJyZW50QmxvY2ssIG1faUluZGV4SW5CbG9jaykgPQorICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jaygpOworICAgICAgICAgICAgICBpZiAoIW1fcEN1cnJlbnRCbG9jaykgeworICAgICAgICAgICAgICAgIHJldHVybiBGWF9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2tbbV9pSW5kZXhJbkJsb2NrKytdID0gY2g7CisgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkluY3JlbWVudERhdGFMZW5ndGgoKTsKKyAgICAgICAgICAgIG1fU3RhcnQrKzsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoc3ludGF4UGFyc2VyUmVzdWx0ICE9IEZYX1htbFN5bnRheFJlc3VsdDo6Tm9uZSkKKyAgICAgICAgcmV0dXJuIHN5bnRheFBhcnNlclJlc3VsdDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEZYX1htbFN5bnRheFJlc3VsdDo6VGV4dDsKK30KKworaW50MzJfdCBDRlhfWE1MU3ludGF4UGFyc2VyOjpHZXRTdGF0dXMoKSBjb25zdCB7CisgIGlmICghbV9wU3RyZWFtKQorICAgIHJldHVybiAtMTsKKworICBpbnQzMl90IGlTdHJlYW1MZW5ndGggPSBtX3BTdHJlYW0tPkdldExlbmd0aCgpOworICBpZiAoaVN0cmVhbUxlbmd0aCA8IDEpCisgICAgcmV0dXJuIDEwMDsKKworICBpZiAobV9zeW50YXhQYXJzZXJSZXN1bHQgPT0gRlhfWG1sU3ludGF4UmVzdWx0OjpFcnJvcikKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKG1fc3ludGF4UGFyc2VyUmVzdWx0ID09IEZYX1htbFN5bnRheFJlc3VsdDo6RW5kT2ZTdHJpbmcpCisgICAgcmV0dXJuIDEwMDsKKyAgcmV0dXJuIG1faVBhcnNlZEJ5dGVzICogMTAwIC8gaVN0cmVhbUxlbmd0aDsKK30KKworRlhfRklMRVNJWkUgQ0ZYX1hNTFN5bnRheFBhcnNlcjo6R2V0Q3VycmVudEJpbmFyeVBvcygpIGNvbnN0IHsKKyAgaWYgKCFtX3BTdHJlYW0pCisgICAgcmV0dXJuIDA7CisKKyAgaW50MzJfdCBuRHN0TGVuID0gR2V0VVRGOEVuY29kZUxlbmd0aChtX0J1ZmZlciwgbV9TdGFydCk7CisgIHJldHVybiBtX2lQYXJzZWRCeXRlcyArIG5Ec3RMZW47Cit9CisKK3ZvaWQgQ0ZYX1hNTFN5bnRheFBhcnNlcjo6UGFyc2VUZXh0Q2hhcih3Y2hhcl90IGNoYXJhY3RlcikgeworICBpZiAobV9pSW5kZXhJbkJsb2NrID09IG1faUFsbG9jU3RlcCkgeworICAgIHN0ZDo6dGllKG1fcEN1cnJlbnRCbG9jaywgbV9pSW5kZXhJbkJsb2NrKSA9CisgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2soKTsKKyAgICBpZiAoIW1fcEN1cnJlbnRCbG9jaykKKyAgICAgIHJldHVybjsKKyAgfQorCisgIG1fcEN1cnJlbnRCbG9ja1ttX2lJbmRleEluQmxvY2srK10gPSBjaGFyYWN0ZXI7CisgIG1fQmxvY2tCdWZmZXIuSW5jcmVtZW50RGF0YUxlbmd0aCgpOworICBpZiAobV9pRW50aXR5U3RhcnQgPiAtMSAmJiBjaGFyYWN0ZXIgPT0gTCc7JykgeworICAgIFdpZGVTdHJpbmcgY3NFbnRpdHkgPSBtX0Jsb2NrQnVmZmVyLkdldFRleHREYXRhKAorICAgICAgICBtX2lFbnRpdHlTdGFydCArIDEsCisgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0RGF0YUxlbmd0aCgpIC0gMSAtIG1faUVudGl0eVN0YXJ0IC0gMSk7CisgICAgaW50MzJfdCBpTGVuID0gY3NFbnRpdHkuR2V0TGVuZ3RoKCk7CisgICAgaWYgKGlMZW4gPiAwKSB7CisgICAgICBpZiAoY3NFbnRpdHlbMF0gPT0gTCcjJykgeworICAgICAgICB1aW50MzJfdCBjaCA9IDA7CisgICAgICAgIHdjaGFyX3QgdzsKKyAgICAgICAgaWYgKGlMZW4gPiAxICYmIGNzRW50aXR5WzFdID09IEwneCcpIHsKKyAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDI7IGkgPCBpTGVuOyBpKyspIHsKKyAgICAgICAgICAgIHcgPSBjc0VudGl0eVtpXTsKKyAgICAgICAgICAgIGlmIChzdGQ6Omlzd2RpZ2l0KHcpKQorICAgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSBMJzAnOworICAgICAgICAgICAgZWxzZSBpZiAodyA+PSBMJ0EnICYmIHcgPD0gTCdGJykKKyAgICAgICAgICAgICAgY2ggPSAoY2ggPDwgNCkgKyB3IC0gNTU7CisgICAgICAgICAgICBlbHNlIGlmICh3ID49IEwnYScgJiYgdyA8PSBMJ2YnKQorICAgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSA4NzsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IGlMZW47IGkrKykgeworICAgICAgICAgICAgdyA9IGNzRW50aXR5W2ldOworICAgICAgICAgICAgaWYgKCFzdGQ6Omlzd2RpZ2l0KHcpKQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNoID0gY2ggKiAxMCArIHcgLSBMJzAnOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY2ggPiBrTWF4Q2hhclJhbmdlKQorICAgICAgICAgIGNoID0gJyAnOworCisgICAgICAgIGNoYXJhY3RlciA9IHN0YXRpY19jYXN0PHdjaGFyX3Q+KGNoKTsKKyAgICAgICAgaWYgKGNoYXJhY3RlciAhPSAwKSB7CisgICAgICAgICAgbV9CbG9ja0J1ZmZlci5TZXRUZXh0Q2hhcihtX2lFbnRpdHlTdGFydCwgY2hhcmFjdGVyKTsKKyAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoY3NFbnRpdHkuQ29tcGFyZShMImFtcCIpID09IDApIHsKKyAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlNldFRleHRDaGFyKG1faUVudGl0eVN0YXJ0LCBMJyYnKTsKKyAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOworICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJsdCIpID09IDApIHsKKyAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlNldFRleHRDaGFyKG1faUVudGl0eVN0YXJ0LCBMJzwnKTsKKyAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOworICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJndCIpID09IDApIHsKKyAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlNldFRleHRDaGFyKG1faUVudGl0eVN0YXJ0LCBMJz4nKTsKKyAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOworICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJhcG9zIikgPT0gMCkgeworICAgICAgICAgIG1fQmxvY2tCdWZmZXIuU2V0VGV4dENoYXIobV9pRW50aXR5U3RhcnQsIEwnXCcnKTsKKyAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOworICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJxdW90IikgPT0gMCkgeworICAgICAgICAgIG1fQmxvY2tCdWZmZXIuU2V0VGV4dENoYXIobV9pRW50aXR5U3RhcnQsIEwnXCInKTsKKyAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGlmIChtX2lFbnRpdHlTdGFydCA+PSAwICYmCisgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0RGF0YUxlbmd0aCgpID4gc3RhdGljX2Nhc3Q8c2l6ZV90PihtX2lFbnRpdHlTdGFydCkpIHsKKyAgICAgIG1fQmxvY2tCdWZmZXIuRGVsZXRlVGV4dENoYXJzKG1fQmxvY2tCdWZmZXIuR2V0RGF0YUxlbmd0aCgpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faUVudGl0eVN0YXJ0KTsKKyAgICB9CisgICAgc3RkOjp0aWUobV9wQ3VycmVudEJsb2NrLCBtX2lJbmRleEluQmxvY2spID0KKyAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jaygpOworICAgIG1faUVudGl0eVN0YXJ0ID0gLTE7CisgIH0gZWxzZSBpZiAobV9pRW50aXR5U3RhcnQgPCAwICYmIGNoYXJhY3RlciA9PSBMJyYnKSB7CisgICAgbV9pRW50aXR5U3RhcnQgPSBtX0Jsb2NrQnVmZmVyLkdldERhdGFMZW5ndGgoKSAtIDE7CisgIH0KKyAgbV9TdGFydCsrOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC94bWwvY2Z4X3htbHN5bnRheHBhcnNlci5oIGIvY29yZS9meGNydC94bWwvY2Z4X3htbHN5bnRheHBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5M2JiYjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L3htbC9jZnhfeG1sc3ludGF4cGFyc2VyLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX1hNTF9DRlhfWE1MU1lOVEFYUEFSU0VSX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfWE1MX0NGWF9YTUxTWU5UQVhQQVJTRVJfSF8KKworI2luY2x1ZGUgPHN0YWNrPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X2Jsb2NrYnVmZmVyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfc2Vla2FibGVzdHJlYW1wcm94eS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbG5vZGUuaCIKKworZW51bSBjbGFzcyBGWF9YbWxTeW50YXhSZXN1bHQgeworICBOb25lLAorICBJbnN0cnVjdGlvbk9wZW4sCisgIEluc3RydWN0aW9uQ2xvc2UsCisgIEVsZW1lbnRPcGVuLAorICBFbGVtZW50QnJlYWssCisgIEVsZW1lbnRDbG9zZSwKKyAgVGFyZ2V0TmFtZSwKKyAgVGFnTmFtZSwKKyAgQXR0cmlOYW1lLAorICBBdHRyaVZhbHVlLAorICBUZXh0LAorICBDRGF0YSwKKyAgVGFyZ2V0RGF0YSwKKyAgRXJyb3IsCisgIEVuZE9mU3RyaW5nCit9OworCitjbGFzcyBDRlhfWE1MU3ludGF4UGFyc2VyIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBib29sIElzWE1MTmFtZUNoYXIod2NoYXJfdCBjaCwgYm9vbCBiRmlyc3RDaGFyKTsKKworICBleHBsaWNpdCBDRlhfWE1MU3ludGF4UGFyc2VyKAorICAgICAgY29uc3QgUmV0YWluUHRyPENGWF9TZWVrYWJsZVN0cmVhbVByb3h5PiYgcFN0cmVhbSk7CisgIH5DRlhfWE1MU3ludGF4UGFyc2VyKCk7CisKKyAgRlhfWG1sU3ludGF4UmVzdWx0IERvU3ludGF4UGFyc2UoKTsKKworICBpbnQzMl90IEdldFN0YXR1cygpIGNvbnN0OworICBGWF9GSUxFU0laRSBHZXRDdXJyZW50UG9zKCkgY29uc3QgeyByZXR1cm4gbV9QYXJzZWRDaGFycyArIG1fU3RhcnQ7IH0KKyAgRlhfRklMRVNJWkUgR2V0Q3VycmVudEJpbmFyeVBvcygpIGNvbnN0OworICBpbnQzMl90IEdldEN1cnJlbnROb2RlTnVtYmVyKCkgY29uc3QgeyByZXR1cm4gbV9pQ3VycmVudE5vZGVOdW07IH0KKyAgaW50MzJfdCBHZXRMYXN0Tm9kZU51bWJlcigpIGNvbnN0IHsgcmV0dXJuIG1faUxhc3ROb2RlTnVtOyB9CisKKyAgV2lkZVN0cmluZyBHZXRUYXJnZXROYW1lKCkgY29uc3QgeworICAgIHJldHVybiBtX0Jsb2NrQnVmZmVyLkdldFRleHREYXRhKDAsIG1faVRleHREYXRhTGVuZ3RoKTsKKyAgfQorCisgIFdpZGVTdHJpbmcgR2V0VGFnTmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9CbG9ja0J1ZmZlci5HZXRUZXh0RGF0YSgwLCBtX2lUZXh0RGF0YUxlbmd0aCk7CisgIH0KKworICBXaWRlU3RyaW5nIEdldEF0dHJpYnV0ZU5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fQmxvY2tCdWZmZXIuR2V0VGV4dERhdGEoMCwgbV9pVGV4dERhdGFMZW5ndGgpOworICB9CisKKyAgV2lkZVN0cmluZyBHZXRBdHRyaWJ1dGVWYWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9CbG9ja0J1ZmZlci5HZXRUZXh0RGF0YSgwLCBtX2lUZXh0RGF0YUxlbmd0aCk7CisgIH0KKworICBXaWRlU3RyaW5nIEdldFRleHREYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtX0Jsb2NrQnVmZmVyLkdldFRleHREYXRhKDAsIG1faVRleHREYXRhTGVuZ3RoKTsKKyAgfQorCisgIFdpZGVTdHJpbmcgR2V0VGFyZ2V0RGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9CbG9ja0J1ZmZlci5HZXRUZXh0RGF0YSgwLCBtX2lUZXh0RGF0YUxlbmd0aCk7CisgIH0KKworIHByb3RlY3RlZDoKKyAgZW51bSBjbGFzcyBGREVfWG1sU3ludGF4U3RhdGUgeworICAgIFRleHQsCisgICAgTm9kZSwKKyAgICBUYXJnZXQsCisgICAgVGFnLAorICAgIEF0dHJpTmFtZSwKKyAgICBBdHRyaUVxdWFsU2lnbiwKKyAgICBBdHRyaVF1b3RhdGlvbiwKKyAgICBBdHRyaVZhbHVlLAorICAgIEVudGl0eSwKKyAgICBFbnRpdHlEZWNpbWFsLAorICAgIEVudGl0eUhleCwKKyAgICBDbG9zZUluc3RydWN0aW9uLAorICAgIEJyZWFrRWxlbWVudCwKKyAgICBDbG9zZUVsZW1lbnQsCisgICAgU2tpcERlY2xOb2RlLAorICAgIERlY2xDaGFyRGF0YSwKKyAgICBTa2lwQ29tbWVudCwKKyAgICBTa2lwQ29tbWVudE9yRGVjbCwKKyAgICBTa2lwQ0RhdGEsCisgICAgVGFyZ2V0RGF0YQorICB9OworCisgIHZvaWQgUGFyc2VUZXh0Q2hhcih3Y2hhcl90IGNoKTsKKworICBSZXRhaW5QdHI8Q0ZYX1NlZWthYmxlU3RyZWFtUHJveHk+IG1fcFN0cmVhbTsKKyAgc2l6ZV90IG1faVhNTFBsYW5lU2l6ZTsKKyAgRlhfRklMRVNJWkUgbV9pQ3VycmVudFBvczsKKyAgaW50MzJfdCBtX2lDdXJyZW50Tm9kZU51bTsKKyAgaW50MzJfdCBtX2lMYXN0Tm9kZU51bTsKKyAgaW50MzJfdCBtX2lQYXJzZWRCeXRlczsKKyAgRlhfRklMRVNJWkUgbV9QYXJzZWRDaGFyczsKKyAgc3RkOjp2ZWN0b3I8d2NoYXJfdD4gbV9CdWZmZXI7CisgIHNpemVfdCBtX2lCdWZmZXJDaGFyczsKKyAgYm9vbCBtX2JFT1M7CisgIEZYX0ZJTEVTSVpFIG1fU3RhcnQ7ICAvLyBTdGFydCBwb3NpdGlvbiBpbiBtX0J1ZmZlcgorICBGWF9GSUxFU0laRSBtX0VuZDsgICAgLy8gRW5kIHBvc2l0aW9uIGluIG1fQnVmZmVyCisgIEZYX1hNTE5PREUgbV9DdXJOb2RlOworICBzdGQ6OnN0YWNrPEZYX1hNTE5PREU+IG1fWE1MTm9kZVN0YWNrOworICBDRlhfQmxvY2tCdWZmZXIgbV9CbG9ja0J1ZmZlcjsKKyAgaW50MzJfdCBtX2lBbGxvY1N0ZXA7CisgIHdjaGFyX3QqIG1fcEN1cnJlbnRCbG9jazsgIC8vIFBvaW50ZXIgaW50byBDRlhfQmxvY2tCdWZmZXIKKyAgaW50MzJfdCBtX2lJbmRleEluQmxvY2s7CisgIGludDMyX3QgbV9pVGV4dERhdGFMZW5ndGg7CisgIEZYX1htbFN5bnRheFJlc3VsdCBtX3N5bnRheFBhcnNlclJlc3VsdDsKKyAgRkRFX1htbFN5bnRheFN0YXRlIG1fc3ludGF4UGFyc2VyU3RhdGU7CisgIHdjaGFyX3QgbV93UXVvdGF0aW9uTWFyazsKKyAgaW50MzJfdCBtX2lFbnRpdHlTdGFydDsKKyAgc3RkOjpzdGFjazx3Y2hhcl90PiBtX1NraXBTdGFjazsKKyAgd2NoYXJfdCBtX1NraXBDaGFyOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX1hNTF9DRlhfWE1MU1lOVEFYUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L3htbC9jZnhfeG1sc3ludGF4cGFyc2VyX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnhjcnQveG1sL2NmeF94bWxzeW50YXhwYXJzZXJfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZjdjNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L3htbC9jZnhfeG1sc3ludGF4cGFyc2VyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDU0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbHN5bnRheHBhcnNlci5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfc2Vla2FibGVzdHJlYW1wcm94eS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29kZXBhZ2UuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5oIgorCitURVNUKENGWF9YTUxTeW50YXhQYXJzZXJUZXN0LCBDRGF0YSkgeworICBjb25zdCBjaGFyKiBpbnB1dCA9CisgICAgICAiPHNjcmlwdCBjb250ZW50VHlwZT1cImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdFwiPlxuIgorICAgICAgIiAgPCFbQ0RBVEFbXG4iCisgICAgICAiICAgIGlmIChhWzFdIDwgMylcbiIKKyAgICAgICIgICAgICBhcHAuYWxlcnQoXCJUY2xhbXNcIik7XG4iCisgICAgICAiICBdXT5cbiIKKyAgICAgICI8L3NjcmlwdD4iOworCisgIGNvbnN0IHdjaGFyX3QqIGNkYXRhID0KKyAgICAgIEwiXG4iCisgICAgICBMIiAgICBpZiAoYVsxXSA8IDMpXG4iCisgICAgICBMIiAgICAgIGFwcC5hbGVydChcIlRjbGFtc1wiKTtcbiIKKyAgICAgIEwiICAiOworCisgIFJldGFpblB0cjxDRlhfU2Vla2FibGVTdHJlYW1Qcm94eT4gc3RyZWFtID0KKyAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDRlhfU2Vla2FibGVTdHJlYW1Qcm94eT4oCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjaGFyKj4oaW5wdXQpKSwgc3RybGVuKGlucHV0KSk7CisgIHN0cmVhbS0+U2V0Q29kZVBhZ2UoRlhfQ09ERVBBR0VfVVRGOCk7CisKKyAgQ0ZYX1hNTFN5bnRheFBhcnNlciBwYXJzZXIoc3RyZWFtKTsKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudE9wZW4sIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpUYWdOYW1lLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwic2NyaXB0IiwgcGFyc2VyLkdldFRhZ05hbWUoKSk7CisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6QXR0cmlOYW1lLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwiY29udGVudFR5cGUiLCBwYXJzZXIuR2V0QXR0cmlidXRlTmFtZSgpKTsKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6QXR0cmlWYWx1ZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIsIHBhcnNlci5HZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50QnJlYWssIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpUZXh0LCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwiXG4gICIsIHBhcnNlci5HZXRUZXh0RGF0YSgpKTsKKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpDRGF0YSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShjZGF0YSwgcGFyc2VyLkdldFRleHREYXRhKCkpOworCisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OlRleHQsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJcbiIsIHBhcnNlci5HZXRUZXh0RGF0YSgpKTsKKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50Q2xvc2UsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJzY3JpcHQiLCBwYXJzZXIuR2V0VGFnTmFtZSgpKTsKKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpFbmRPZlN0cmluZywgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Cit9CisKK1RFU1QoQ0ZYX1hNTFN5bnRheFBhcnNlclRlc3QsIENEYXRhV2l0aElubmVyU2NyaXB0KSB7CisgIGNvbnN0IGNoYXIqIGlucHV0ID0KKyAgICAgICI8c2NyaXB0IGNvbnRlbnRUeXBlPVwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0XCI+XG4iCisgICAgICAiICA8IVtDREFUQVtcbiIKKyAgICAgICIgICAgaWYgKGFbMV0gPCAzKVxuIgorICAgICAgIiAgICAgIGFwcC5hbGVydChcIlRjbGFtc1wiKTtcbiIKKyAgICAgICIgICAgPC9zY3JpcHQ+XG4iCisgICAgICAiICBdXT5cbiIKKyAgICAgICI8L3NjcmlwdD4iOworCisgIGNvbnN0IHdjaGFyX3QqIGNkYXRhID0KKyAgICAgIEwiXG4iCisgICAgICBMIiAgICBpZiAoYVsxXSA8IDMpXG4iCisgICAgICBMIiAgICAgIGFwcC5hbGVydChcIlRjbGFtc1wiKTtcbiIKKyAgICAgIEwiICAgIDwvc2NyaXB0PlxuIgorICAgICAgTCIgICI7CisKKyAgUmV0YWluUHRyPENGWF9TZWVrYWJsZVN0cmVhbVByb3h5PiBzdHJlYW0gPQorICAgICAgcGRmaXVtOjpNYWtlUmV0YWluPENGWF9TZWVrYWJsZVN0cmVhbVByb3h5PigKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNoYXIqPihpbnB1dCkpLCBzdHJsZW4oaW5wdXQpKTsKKyAgc3RyZWFtLT5TZXRDb2RlUGFnZShGWF9DT0RFUEFHRV9VVEY4KTsKKworICBDRlhfWE1MU3ludGF4UGFyc2VyIHBhcnNlcihzdHJlYW0pOworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50T3BlbiwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OlRhZ05hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJzY3JpcHQiLCBwYXJzZXIuR2V0VGFnTmFtZSgpKTsKKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpBdHRyaU5hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJjb250ZW50VHlwZSIsIHBhcnNlci5HZXRBdHRyaWJ1dGVOYW1lKCkpOworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpBdHRyaVZhbHVlLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IiwgcGFyc2VyLkdldEF0dHJpYnV0ZVZhbHVlKCkpOworCisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRCcmVhaywgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OlRleHQsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJcbiAgIiwgcGFyc2VyLkdldFRleHREYXRhKCkpOworCisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkNEYXRhLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKGNkYXRhLCBwYXJzZXIuR2V0VGV4dERhdGEoKSk7CisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6VGV4dCwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMIlxuIiwgcGFyc2VyLkdldFRleHREYXRhKCkpOworCisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRDbG9zZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMInNjcmlwdCIsIHBhcnNlci5HZXRUYWdOYW1lKCkpOworCisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkVuZE9mU3RyaW5nLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKK30KKworVEVTVChDRlhfWE1MU3ludGF4UGFyc2VyVGVzdCwgQXJyb3dCYW5nQXJyb3cpIHsKKyAgY29uc3QgY2hhciogaW5wdXQgPQorICAgICAgIjxzY3JpcHQgY29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHRcIj5cbiIKKyAgICAgICIgIDwhPlxuIgorICAgICAgIjwvc2NyaXB0PiI7CisKKyAgUmV0YWluUHRyPENGWF9TZWVrYWJsZVN0cmVhbVByb3h5PiBzdHJlYW0gPQorICAgICAgcGRmaXVtOjpNYWtlUmV0YWluPENGWF9TZWVrYWJsZVN0cmVhbVByb3h5PigKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNoYXIqPihpbnB1dCkpLCBzdHJsZW4oaW5wdXQpKTsKKyAgc3RyZWFtLT5TZXRDb2RlUGFnZShGWF9DT0RFUEFHRV9VVEY4KTsKKworICBDRlhfWE1MU3ludGF4UGFyc2VyIHBhcnNlcihzdHJlYW0pOworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50T3BlbiwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OlRhZ05hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworCisgIEFTU0VSVF9FUShMInNjcmlwdCIsIHBhcnNlci5HZXRUYWdOYW1lKCkpOworCisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpTmFtZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMImNvbnRlbnRUeXBlIiwgcGFyc2VyLkdldEF0dHJpYnV0ZU5hbWUoKSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpVmFsdWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiLCBwYXJzZXIuR2V0QXR0cmlidXRlVmFsdWUoKSk7CisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudEJyZWFrLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6VGV4dCwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMIlxuICAiLCBwYXJzZXIuR2V0VGV4dERhdGEoKSk7CisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6VGV4dCwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMIlxuIiwgcGFyc2VyLkdldFRleHREYXRhKCkpOworCisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRDbG9zZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMInNjcmlwdCIsIHBhcnNlci5HZXRUYWdOYW1lKCkpOworCisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkVuZE9mU3RyaW5nLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKK30KKworVEVTVChDRlhfWE1MU3ludGF4UGFyc2VyVGVzdCwgQXJyb3dCYW5nQnJhY2tldEFycm93KSB7CisgIGNvbnN0IGNoYXIqIGlucHV0ID0KKyAgICAgICI8c2NyaXB0IGNvbnRlbnRUeXBlPVwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0XCI+XG4iCisgICAgICAiICA8IVs+XG4iCisgICAgICAiPC9zY3JpcHQ+IjsKKworICBSZXRhaW5QdHI8Q0ZYX1NlZWthYmxlU3RyZWFtUHJveHk+IHN0cmVhbSA9CisgICAgICBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX1NlZWthYmxlU3RyZWFtUHJveHk+KAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2hhcio+KGlucHV0KSksIHN0cmxlbihpbnB1dCkpOworICBzdHJlYW0tPlNldENvZGVQYWdlKEZYX0NPREVQQUdFX1VURjgpOworCisgIENGWF9YTUxTeW50YXhQYXJzZXIgcGFyc2VyKHN0cmVhbSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRPcGVuLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6VGFnTmFtZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMInNjcmlwdCIsIHBhcnNlci5HZXRUYWdOYW1lKCkpOworCisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpTmFtZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMImNvbnRlbnRUeXBlIiwgcGFyc2VyLkdldEF0dHJpYnV0ZU5hbWUoKSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpVmFsdWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiLCBwYXJzZXIuR2V0QXR0cmlidXRlVmFsdWUoKSk7CisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudEJyZWFrLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6VGV4dCwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMIlxuICAiLCBwYXJzZXIuR2V0VGV4dERhdGEoKSk7CisKKyAgLy8gUGFyc2VyIHdhbGtzIHRvIGVuZCBvZiBpbnB1dC4KKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpFbmRPZlN0cmluZywgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Cit9CisKK1RFU1QoQ0ZYX1hNTFN5bnRheFBhcnNlclRlc3QsIEluY29tcGxldGVDRGF0YSkgeworICBjb25zdCBjaGFyKiBpbnB1dCA9CisgICAgICAiPHNjcmlwdCBjb250ZW50VHlwZT1cImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdFwiPlxuIgorICAgICAgIiAgPCFbQ0RBVEE+XG4iCisgICAgICAiPC9zY3JpcHQ+IjsKKworICBSZXRhaW5QdHI8Q0ZYX1NlZWthYmxlU3RyZWFtUHJveHk+IHN0cmVhbSA9CisgICAgICBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX1NlZWthYmxlU3RyZWFtUHJveHk+KAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2hhcio+KGlucHV0KSksIHN0cmxlbihpbnB1dCkpOworICBzdHJlYW0tPlNldENvZGVQYWdlKEZYX0NPREVQQUdFX1VURjgpOworCisgIENGWF9YTUxTeW50YXhQYXJzZXIgcGFyc2VyKHN0cmVhbSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRPcGVuLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6VGFnTmFtZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMInNjcmlwdCIsIHBhcnNlci5HZXRUYWdOYW1lKCkpOworCisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpTmFtZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMImNvbnRlbnRUeXBlIiwgcGFyc2VyLkdldEF0dHJpYnV0ZU5hbWUoKSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpVmFsdWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiLCBwYXJzZXIuR2V0QXR0cmlidXRlVmFsdWUoKSk7CisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudEJyZWFrLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6VGV4dCwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMIlxuICAiLCBwYXJzZXIuR2V0VGV4dERhdGEoKSk7CisKKyAgLy8gUGFyc2VyIHdhbGtzIHRvIGVuZCBvZiBpbnB1dC4KKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpFbmRPZlN0cmluZywgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Cit9CisKK1RFU1QoQ0ZYX1hNTFN5bnRheFBhcnNlclRlc3QsIFVuQ2xvc2VkQ0RhdGEpIHsKKyAgY29uc3QgY2hhciogaW5wdXQgPQorICAgICAgIjxzY3JpcHQgY29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHRcIj5cbiIKKyAgICAgICIgIDwhW0NEQVRBW1xuIgorICAgICAgIjwvc2NyaXB0PiI7CisKKyAgUmV0YWluUHRyPENGWF9TZWVrYWJsZVN0cmVhbVByb3h5PiBzdHJlYW0gPQorICAgICAgcGRmaXVtOjpNYWtlUmV0YWluPENGWF9TZWVrYWJsZVN0cmVhbVByb3h5PigKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNoYXIqPihpbnB1dCkpLCBzdHJsZW4oaW5wdXQpKTsKKyAgc3RyZWFtLT5TZXRDb2RlUGFnZShGWF9DT0RFUEFHRV9VVEY4KTsKKworICBDRlhfWE1MU3ludGF4UGFyc2VyIHBhcnNlcihzdHJlYW0pOworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50T3BlbiwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OlRhZ05hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJzY3JpcHQiLCBwYXJzZXIuR2V0VGFnTmFtZSgpKTsKKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpBdHRyaU5hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJjb250ZW50VHlwZSIsIHBhcnNlci5HZXRBdHRyaWJ1dGVOYW1lKCkpOworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpBdHRyaVZhbHVlLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IiwgcGFyc2VyLkdldEF0dHJpYnV0ZVZhbHVlKCkpOworCisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRCcmVhaywgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OlRleHQsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJcbiAgIiwgcGFyc2VyLkdldFRleHREYXRhKCkpOworCisgIC8vIFBhcnNlciB3YWxrcyB0byBlbmQgb2YgaW5wdXQuCisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6RW5kT2ZTdHJpbmcsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworfQorCitURVNUKENGWF9YTUxTeW50YXhQYXJzZXJUZXN0LCBFbXB0eUNEYXRhKSB7CisgIGNvbnN0IGNoYXIqIGlucHV0ID0KKyAgICAgICI8c2NyaXB0IGNvbnRlbnRUeXBlPVwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0XCI+XG4iCisgICAgICAiICA8IVtDREFUQVtdXT5cbiIKKyAgICAgICI8L3NjcmlwdD4iOworCisgIFJldGFpblB0cjxDRlhfU2Vla2FibGVTdHJlYW1Qcm94eT4gc3RyZWFtID0KKyAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDRlhfU2Vla2FibGVTdHJlYW1Qcm94eT4oCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjaGFyKj4oaW5wdXQpKSwgc3RybGVuKGlucHV0KSk7CisgIHN0cmVhbS0+U2V0Q29kZVBhZ2UoRlhfQ09ERVBBR0VfVVRGOCk7CisKKyAgQ0ZYX1hNTFN5bnRheFBhcnNlciBwYXJzZXIoc3RyZWFtKTsKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudE9wZW4sIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpUYWdOYW1lLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwic2NyaXB0IiwgcGFyc2VyLkdldFRhZ05hbWUoKSk7CisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6QXR0cmlOYW1lLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwiY29udGVudFR5cGUiLCBwYXJzZXIuR2V0QXR0cmlidXRlTmFtZSgpKTsKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6QXR0cmlWYWx1ZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIsIHBhcnNlci5HZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50QnJlYWssIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpUZXh0LCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwiXG4gICIsIHBhcnNlci5HZXRUZXh0RGF0YSgpKTsKKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpDRGF0YSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMIiIsIHBhcnNlci5HZXRUZXh0RGF0YSgpKTsKKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpUZXh0LCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwiXG4iLCBwYXJzZXIuR2V0VGV4dERhdGEoKSk7CisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudENsb3NlLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwic2NyaXB0IiwgcGFyc2VyLkdldFRhZ05hbWUoKSk7CisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6RW5kT2ZTdHJpbmcsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworfQorCitURVNUKENGWF9YTUxTeW50YXhQYXJzZXJUZXN0LCBDb21tZW50KSB7CisgIGNvbnN0IGNoYXIqIGlucHV0ID0KKyAgICAgICI8c2NyaXB0IGNvbnRlbnRUeXBlPVwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0XCI+XG4iCisgICAgICAiICA8IS0tIEEgQ29tbWVudCAtLT5cbiIKKyAgICAgICI8L3NjcmlwdD4iOworCisgIFJldGFpblB0cjxDRlhfU2Vla2FibGVTdHJlYW1Qcm94eT4gc3RyZWFtID0KKyAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDRlhfU2Vla2FibGVTdHJlYW1Qcm94eT4oCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjaGFyKj4oaW5wdXQpKSwgc3RybGVuKGlucHV0KSk7CisgIHN0cmVhbS0+U2V0Q29kZVBhZ2UoRlhfQ09ERVBBR0VfVVRGOCk7CisKKyAgQ0ZYX1hNTFN5bnRheFBhcnNlciBwYXJzZXIoc3RyZWFtKTsKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudE9wZW4sIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpUYWdOYW1lLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwic2NyaXB0IiwgcGFyc2VyLkdldFRhZ05hbWUoKSk7CisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6QXR0cmlOYW1lLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwiY29udGVudFR5cGUiLCBwYXJzZXIuR2V0QXR0cmlidXRlTmFtZSgpKTsKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6QXR0cmlWYWx1ZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIsIHBhcnNlci5HZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50QnJlYWssIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpUZXh0LCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwiXG4gICIsIHBhcnNlci5HZXRUZXh0RGF0YSgpKTsKKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpUZXh0LCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwiXG4iLCBwYXJzZXIuR2V0VGV4dERhdGEoKSk7CisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudENsb3NlLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwic2NyaXB0IiwgcGFyc2VyLkdldFRhZ05hbWUoKSk7CisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6RW5kT2ZTdHJpbmcsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworfQorCitURVNUKENGWF9YTUxTeW50YXhQYXJzZXJUZXN0LCBJbmNvcnJlY3RDb21tZW50U3RhcnQpIHsKKyAgY29uc3QgY2hhciogaW5wdXQgPQorICAgICAgIjxzY3JpcHQgY29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHRcIj5cbiIKKyAgICAgICIgIDwhLSBBIENvbW1lbnQgLS0+XG4iCisgICAgICAiPC9zY3JpcHQ+IjsKKworICBSZXRhaW5QdHI8Q0ZYX1NlZWthYmxlU3RyZWFtUHJveHk+IHN0cmVhbSA9CisgICAgICBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX1NlZWthYmxlU3RyZWFtUHJveHk+KAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2hhcio+KGlucHV0KSksIHN0cmxlbihpbnB1dCkpOworICBzdHJlYW0tPlNldENvZGVQYWdlKEZYX0NPREVQQUdFX1VURjgpOworCisgIENGWF9YTUxTeW50YXhQYXJzZXIgcGFyc2VyKHN0cmVhbSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRPcGVuLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6VGFnTmFtZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMInNjcmlwdCIsIHBhcnNlci5HZXRUYWdOYW1lKCkpOworCisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpTmFtZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMImNvbnRlbnRUeXBlIiwgcGFyc2VyLkdldEF0dHJpYnV0ZU5hbWUoKSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpVmFsdWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiLCBwYXJzZXIuR2V0QXR0cmlidXRlVmFsdWUoKSk7CisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudEJyZWFrLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6VGV4dCwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMIlxuICAiLCBwYXJzZXIuR2V0VGV4dERhdGEoKSk7CisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6VGV4dCwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMIlxuIiwgcGFyc2VyLkdldFRleHREYXRhKCkpOworCisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRDbG9zZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMInNjcmlwdCIsIHBhcnNlci5HZXRUYWdOYW1lKCkpOworCisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkVuZE9mU3RyaW5nLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKK30KKworVEVTVChDRlhfWE1MU3ludGF4UGFyc2VyVGVzdCwgQ29tbWVudEVtcHR5KSB7CisgIGNvbnN0IGNoYXIqIGlucHV0ID0KKyAgICAgICI8c2NyaXB0IGNvbnRlbnRUeXBlPVwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0XCI+XG4iCisgICAgICAiICA8IS0tLS0+XG4iCisgICAgICAiPC9zY3JpcHQ+IjsKKworICBSZXRhaW5QdHI8Q0ZYX1NlZWthYmxlU3RyZWFtUHJveHk+IHN0cmVhbSA9CisgICAgICBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX1NlZWthYmxlU3RyZWFtUHJveHk+KAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2hhcio+KGlucHV0KSksIHN0cmxlbihpbnB1dCkpOworICBzdHJlYW0tPlNldENvZGVQYWdlKEZYX0NPREVQQUdFX1VURjgpOworCisgIENGWF9YTUxTeW50YXhQYXJzZXIgcGFyc2VyKHN0cmVhbSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRPcGVuLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6VGFnTmFtZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMInNjcmlwdCIsIHBhcnNlci5HZXRUYWdOYW1lKCkpOworCisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpTmFtZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMImNvbnRlbnRUeXBlIiwgcGFyc2VyLkdldEF0dHJpYnV0ZU5hbWUoKSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpVmFsdWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiLCBwYXJzZXIuR2V0QXR0cmlidXRlVmFsdWUoKSk7CisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudEJyZWFrLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6VGV4dCwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMIlxuICAiLCBwYXJzZXIuR2V0VGV4dERhdGEoKSk7CisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6VGV4dCwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMIlxuIiwgcGFyc2VyLkdldFRleHREYXRhKCkpOworCisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRDbG9zZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMInNjcmlwdCIsIHBhcnNlci5HZXRUYWdOYW1lKCkpOworCisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkVuZE9mU3RyaW5nLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKK30KKworVEVTVChDRlhfWE1MU3ludGF4UGFyc2VyVGVzdCwgQ29tbWVudFRocmVlRGFzaCkgeworICBjb25zdCBjaGFyKiBpbnB1dCA9CisgICAgICAiPHNjcmlwdCBjb250ZW50VHlwZT1cImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdFwiPlxuIgorICAgICAgIiAgPCEtLS0+XG4iCisgICAgICAiPC9zY3JpcHQ+IjsKKworICBSZXRhaW5QdHI8Q0ZYX1NlZWthYmxlU3RyZWFtUHJveHk+IHN0cmVhbSA9CisgICAgICBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX1NlZWthYmxlU3RyZWFtUHJveHk+KAorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8Y2hhcio+KGlucHV0KSksIHN0cmxlbihpbnB1dCkpOworICBzdHJlYW0tPlNldENvZGVQYWdlKEZYX0NPREVQQUdFX1VURjgpOworCisgIENGWF9YTUxTeW50YXhQYXJzZXIgcGFyc2VyKHN0cmVhbSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRPcGVuLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6VGFnTmFtZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMInNjcmlwdCIsIHBhcnNlci5HZXRUYWdOYW1lKCkpOworCisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpTmFtZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMImNvbnRlbnRUeXBlIiwgcGFyc2VyLkdldEF0dHJpYnV0ZU5hbWUoKSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpVmFsdWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiLCBwYXJzZXIuR2V0QXR0cmlidXRlVmFsdWUoKSk7CisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudEJyZWFrLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6VGV4dCwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMIlxuICAiLCBwYXJzZXIuR2V0VGV4dERhdGEoKSk7CisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6RW5kT2ZTdHJpbmcsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworfQorCitURVNUKENGWF9YTUxTeW50YXhQYXJzZXJUZXN0LCBDb21tZW50VHdvRGFzaCkgeworICBjb25zdCBjaGFyKiBpbnB1dCA9CisgICAgICAiPHNjcmlwdCBjb250ZW50VHlwZT1cImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdFwiPlxuIgorICAgICAgIiAgPCEtLT5cbiIKKyAgICAgICI8L3NjcmlwdD4iOworCisgIFJldGFpblB0cjxDRlhfU2Vla2FibGVTdHJlYW1Qcm94eT4gc3RyZWFtID0KKyAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDRlhfU2Vla2FibGVTdHJlYW1Qcm94eT4oCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxjaGFyKj4oaW5wdXQpKSwgc3RybGVuKGlucHV0KSk7CisgIHN0cmVhbS0+U2V0Q29kZVBhZ2UoRlhfQ09ERVBBR0VfVVRGOCk7CisKKyAgQ0ZYX1hNTFN5bnRheFBhcnNlciBwYXJzZXIoc3RyZWFtKTsKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudE9wZW4sIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpUYWdOYW1lLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwic2NyaXB0IiwgcGFyc2VyLkdldFRhZ05hbWUoKSk7CisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6QXR0cmlOYW1lLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwiY29udGVudFR5cGUiLCBwYXJzZXIuR2V0QXR0cmlidXRlTmFtZSgpKTsKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6QXR0cmlWYWx1ZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShMImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIsIHBhcnNlci5HZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50QnJlYWssIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpUZXh0LCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwiXG4gICIsIHBhcnNlci5HZXRUZXh0RGF0YSgpKTsKKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpFbmRPZlN0cmluZywgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Cit9CisKK1RFU1QoQ0ZYX1hNTFN5bnRheFBhcnNlclRlc3QsIEVudGl0aWVzKSB7CisgIGNvbnN0IGNoYXIqIGlucHV0ID0KKyAgICAgICI8c2NyaXB0IGNvbnRlbnRUeXBlPVwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0XCI+IgorICAgICAgIiYjNjY7IgorICAgICAgIiYjeDU0OyIKKyAgICAgICImI3gwMDAwMDAwMDAwMDAwMDAwMDA0ODsiCisgICAgICAiJiN4MDAwMDAwMDAwMDAwMDAwMEFCNDg7IgorICAgICAgIiYjeDAwMDAwMDAwMDAwMDAwMDAwMDA7IgorICAgICAgIjwvc2NyaXB0PiI7CisKKyAgUmV0YWluUHRyPENGWF9TZWVrYWJsZVN0cmVhbVByb3h5PiBzdHJlYW0gPQorICAgICAgcGRmaXVtOjpNYWtlUmV0YWluPENGWF9TZWVrYWJsZVN0cmVhbVByb3h5PigKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNoYXIqPihpbnB1dCkpLCBzdHJsZW4oaW5wdXQpKTsKKyAgc3RyZWFtLT5TZXRDb2RlUGFnZShGWF9DT0RFUEFHRV9VVEY4KTsKKworICBDRlhfWE1MU3ludGF4UGFyc2VyIHBhcnNlcihzdHJlYW0pOworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50T3BlbiwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OlRhZ05hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJzY3JpcHQiLCBwYXJzZXIuR2V0VGFnTmFtZSgpKTsKKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpBdHRyaU5hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJjb250ZW50VHlwZSIsIHBhcnNlci5HZXRBdHRyaWJ1dGVOYW1lKCkpOworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpBdHRyaVZhbHVlLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IiwgcGFyc2VyLkdldEF0dHJpYnV0ZVZhbHVlKCkpOworCisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRCcmVhaywgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OlRleHQsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJCVEhceGFiNDgiLCBwYXJzZXIuR2V0VGV4dERhdGEoKSk7CisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudENsb3NlLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwic2NyaXB0IiwgcGFyc2VyLkdldFRhZ05hbWUoKSk7CisKKyAgQVNTRVJUX0VRKEZYX1htbFN5bnRheFJlc3VsdDo6RW5kT2ZTdHJpbmcsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworfQorCitURVNUKENGWF9YTUxTeW50YXhQYXJzZXJUZXN0LCBFbnRpdHlPdmVyZmxvd0hleCkgeworICBjb25zdCBjaGFyKiBpbnB1dCA9CisgICAgICAiPHNjcmlwdCBjb250ZW50VHlwZT1cImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdFwiPiIKKyAgICAgICImI3hhREJERkZGRkY7IgorICAgICAgIiYjeGFmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY7IgorICAgICAgIjwvc2NyaXB0PiI7CisKKyAgUmV0YWluUHRyPENGWF9TZWVrYWJsZVN0cmVhbVByb3h5PiBzdHJlYW0gPQorICAgICAgcGRmaXVtOjpNYWtlUmV0YWluPENGWF9TZWVrYWJsZVN0cmVhbVByb3h5PigKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNoYXIqPihpbnB1dCkpLCBzdHJsZW4oaW5wdXQpKTsKKyAgc3RyZWFtLT5TZXRDb2RlUGFnZShGWF9DT0RFUEFHRV9VVEY4KTsKKworICBDRlhfWE1MU3ludGF4UGFyc2VyIHBhcnNlcihzdHJlYW0pOworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50T3BlbiwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OlRhZ05hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJzY3JpcHQiLCBwYXJzZXIuR2V0VGFnTmFtZSgpKTsKKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpBdHRyaU5hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJjb250ZW50VHlwZSIsIHBhcnNlci5HZXRBdHRyaWJ1dGVOYW1lKCkpOworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpBdHRyaVZhbHVlLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IiwgcGFyc2VyLkdldEF0dHJpYnV0ZVZhbHVlKCkpOworCisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRCcmVhaywgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OlRleHQsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCIgICIsIHBhcnNlci5HZXRUZXh0RGF0YSgpKTsKKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50Q2xvc2UsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJzY3JpcHQiLCBwYXJzZXIuR2V0VGFnTmFtZSgpKTsKKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpFbmRPZlN0cmluZywgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Cit9CisKK1RFU1QoQ0ZYX1hNTFN5bnRheFBhcnNlclRlc3QsIEVudGl0eU92ZXJmbG93RGVjaW1hbCkgeworICBjb25zdCBjaGFyKiBpbnB1dCA9CisgICAgICAiPHNjcmlwdCBjb250ZW50VHlwZT1cImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdFwiPiIKKyAgICAgICImIzI5MTQ5MTAyMDU7IgorICAgICAgIiYjMjkxNDkxMDIwNTIzNDIzNDIxMzQ1MjEzNDEyMzQ1MTIzNTEyMzQyMTM0NTIzMTU7IgorICAgICAgIjwvc2NyaXB0PiI7CisKKyAgUmV0YWluUHRyPENGWF9TZWVrYWJsZVN0cmVhbVByb3h5PiBzdHJlYW0gPQorICAgICAgcGRmaXVtOjpNYWtlUmV0YWluPENGWF9TZWVrYWJsZVN0cmVhbVByb3h5PigKKyAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNoYXIqPihpbnB1dCkpLCBzdHJsZW4oaW5wdXQpKTsKKyAgc3RyZWFtLT5TZXRDb2RlUGFnZShGWF9DT0RFUEFHRV9VVEY4KTsKKworICBDRlhfWE1MU3ludGF4UGFyc2VyIHBhcnNlcihzdHJlYW0pOworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50T3BlbiwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OlRhZ05hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJzY3JpcHQiLCBwYXJzZXIuR2V0VGFnTmFtZSgpKTsKKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpBdHRyaU5hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJjb250ZW50VHlwZSIsIHBhcnNlci5HZXRBdHRyaWJ1dGVOYW1lKCkpOworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpBdHRyaVZhbHVlLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKKyAgQVNTRVJUX0VRKEwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IiwgcGFyc2VyLkdldEF0dHJpYnV0ZVZhbHVlKCkpOworCisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRCcmVhaywgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7CisgIEFTU0VSVF9FUShGWF9YbWxTeW50YXhSZXN1bHQ6OlRleHQsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCIgICIsIHBhcnNlci5HZXRUZXh0RGF0YSgpKTsKKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50Q2xvc2UsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOworICBBU1NFUlRfRVEoTCJzY3JpcHQiLCBwYXJzZXIuR2V0VGFnTmFtZSgpKTsKKworICBBU1NFUlRfRVEoRlhfWG1sU3ludGF4UmVzdWx0OjpFbmRPZlN0cmluZywgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Cit9CisKK1RFU1QoQ0ZYX1hNTFN5bnRheFBhcnNlclRlc3QsIElzWE1MTmFtZUNoYXIpIHsKKyAgRVhQRUNUX0ZBTFNFKENGWF9YTUxTeW50YXhQYXJzZXI6OklzWE1MTmFtZUNoYXIoTCctJywgdHJ1ZSkpOworICBFWFBFQ1RfVFJVRShDRlhfWE1MU3ludGF4UGFyc2VyOjpJc1hNTE5hbWVDaGFyKEwnLScsIGZhbHNlKSk7CisKKyAgRVhQRUNUX0ZBTFNFKENGWF9YTUxTeW50YXhQYXJzZXI6OklzWE1MTmFtZUNoYXIoMHgyMDY5LCB0cnVlKSk7CisgIEVYUEVDVF9UUlVFKENGWF9YTUxTeW50YXhQYXJzZXI6OklzWE1MTmFtZUNoYXIoMHgyMDcwLCB0cnVlKSk7CisgIEVYUEVDVF9UUlVFKENGWF9YTUxTeW50YXhQYXJzZXI6OklzWE1MTmFtZUNoYXIoMHgyMDczLCB0cnVlKSk7CisgIEVYUEVDVF9UUlVFKENGWF9YTUxTeW50YXhQYXJzZXI6OklzWE1MTmFtZUNoYXIoMHgyMThGLCB0cnVlKSk7CisgIEVYUEVDVF9GQUxTRShDRlhfWE1MU3ludGF4UGFyc2VyOjpJc1hNTE5hbWVDaGFyKDB4MjE5MCwgdHJ1ZSkpOworCisgIEVYUEVDVF9GQUxTRShDRlhfWE1MU3ludGF4UGFyc2VyOjpJc1hNTE5hbWVDaGFyKDB4RkRFRiwgdHJ1ZSkpOworICBFWFBFQ1RfVFJVRShDRlhfWE1MU3ludGF4UGFyc2VyOjpJc1hNTE5hbWVDaGFyKDB4RkRGMCwgdHJ1ZSkpOworICBFWFBFQ1RfVFJVRShDRlhfWE1MU3ludGF4UGFyc2VyOjpJc1hNTE5hbWVDaGFyKDB4RkRGMSwgdHJ1ZSkpOworICBFWFBFQ1RfVFJVRShDRlhfWE1MU3ludGF4UGFyc2VyOjpJc1hNTE5hbWVDaGFyKDB4RkZGRCwgdHJ1ZSkpOworICBFWFBFQ1RfRkFMU0UoQ0ZYX1hNTFN5bnRheFBhcnNlcjo6SXNYTUxOYW1lQ2hhcigweEZGRkUsIHRydWUpKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQveG1sL2NmeF94bWx0ZXh0LmNwcCBiL2NvcmUvZnhjcnQveG1sL2NmeF94bWx0ZXh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2FkMDQzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC94bWwvY2Z4X3htbHRleHQuY3BwCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWx0ZXh0LmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK0NGWF9YTUxUZXh0OjpDRlhfWE1MVGV4dChjb25zdCBXaWRlU3RyaW5nJiB3c1RleHQpCisgICAgOiBDRlhfWE1MTm9kZSgpLCBtX3dzVGV4dCh3c1RleHQpIHt9CisKK0NGWF9YTUxUZXh0Ojp+Q0ZYX1hNTFRleHQoKSB7fQorCitGWF9YTUxOT0RFVFlQRSBDRlhfWE1MVGV4dDo6R2V0VHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEZYX1hNTE5PREVfVGV4dDsKK30KKworc3RkOjp1bmlxdWVfcHRyPENGWF9YTUxOb2RlPiBDRlhfWE1MVGV4dDo6Q2xvbmUoKSB7CisgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX1hNTFRleHQ+KG1fd3NUZXh0KTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQveG1sL2NmeF94bWx0ZXh0LmggYi9jb3JlL2Z4Y3J0L3htbC9jZnhfeG1sdGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZjM1ODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L3htbC9jZnhfeG1sdGV4dC5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX1hNTF9DRlhfWE1MVEVYVF9IXworI2RlZmluZSBDT1JFX0ZYQ1JUX1hNTF9DRlhfWE1MVEVYVF9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sbm9kZS5oIgorCitjbGFzcyBDRlhfWE1MVGV4dCA6IHB1YmxpYyBDRlhfWE1MTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDRlhfWE1MVGV4dChjb25zdCBXaWRlU3RyaW5nJiB3c1RleHQpOworICB+Q0ZYX1hNTFRleHQoKSBvdmVycmlkZTsKKworICAvLyBDRlhfWE1MTm9kZQorICBGWF9YTUxOT0RFVFlQRSBHZXRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfWE1MTm9kZT4gQ2xvbmUoKSBvdmVycmlkZTsKKworICBXaWRlU3RyaW5nIEdldFRleHQoKSBjb25zdCB7IHJldHVybiBtX3dzVGV4dDsgfQorICB2b2lkIFNldFRleHQoY29uc3QgV2lkZVN0cmluZyYgd3NUZXh0KSB7IG1fd3NUZXh0ID0gd3NUZXh0OyB9CisKKyBwcml2YXRlOgorICBXaWRlU3RyaW5nIG1fd3NUZXh0OworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX1hNTF9DRlhfWE1MVEVYVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC94bWwvY3htbF9hdHRyaXRlbS5jcHAgYi9jb3JlL2Z4Y3J0L3htbC9jeG1sX2F0dHJpdGVtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmJmM2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC94bWwvY3htbF9hdHRyaXRlbS5jcHAKQEAgLTAsMCArMSwxMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY3htbF9hdHRyaXRlbS5oIgorCitib29sIENYTUxfQXR0ckl0ZW06Ok1hdGNoZXMoY29uc3QgQnl0ZVN0cmluZyYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgbmFtZSkgY29uc3QgeworICByZXR1cm4gKHNwYWNlLklzRW1wdHkoKSB8fCBtX1FTcGFjZU5hbWUgPT0gc3BhY2UpICYmIG1fQXR0ck5hbWUgPT0gbmFtZTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQveG1sL2N4bWxfYXR0cml0ZW0uaCBiL2NvcmUvZnhjcnQveG1sL2N4bWxfYXR0cml0ZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGQ4Mjk1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC94bWwvY3htbF9hdHRyaXRlbS5oCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX1hNTF9DWE1MX0FUVFJJVEVNX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfWE1MX0NYTUxfQVRUUklURU1fSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisKK2NsYXNzIENYTUxfQXR0ckl0ZW0geworIHB1YmxpYzoKKyAgYm9vbCBNYXRjaGVzKGNvbnN0IEJ5dGVTdHJpbmcmIHNwYWNlLCBjb25zdCBCeXRlU3RyaW5nJiBuYW1lKSBjb25zdDsKKworICBCeXRlU3RyaW5nIG1fUVNwYWNlTmFtZTsKKyAgQnl0ZVN0cmluZyBtX0F0dHJOYW1lOworICBXaWRlU3RyaW5nIG1fVmFsdWU7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfWE1MX0NYTUxfQVRUUklURU1fSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQveG1sL2N4bWxfY29udGVudC5jcHAgYi9jb3JlL2Z4Y3J0L3htbC9jeG1sX2NvbnRlbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMzUwMDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L3htbC9jeG1sX2NvbnRlbnQuY3BwCkBAIC0wLDAgKzEsMjAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2N4bWxfY29udGVudC5oIgorCitDWE1MX0NvbnRlbnQ6OkNYTUxfQ29udGVudChib29sIGJDREFUQSwgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnQpCisgICAgOiBtX2JDREFUQShiQ0RBVEEpLCBtX0NvbnRlbnQoY29udGVudCkge30KKworQ1hNTF9Db250ZW50Ojp+Q1hNTF9Db250ZW50KCkge30KKworQ1hNTF9Db250ZW50KiBDWE1MX0NvbnRlbnQ6OkFzQ29udGVudCgpIHsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK2NvbnN0IENYTUxfQ29udGVudCogQ1hNTF9Db250ZW50OjpBc0NvbnRlbnQoKSBjb25zdCB7CisgIHJldHVybiB0aGlzOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC94bWwvY3htbF9jb250ZW50LmggYi9jb3JlL2Z4Y3J0L3htbC9jeG1sX2NvbnRlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2MxYWJmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC94bWwvY3htbF9jb250ZW50LmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfWE1MX0NYTUxfQ09OVEVOVF9IXworI2RlZmluZSBDT1JFX0ZYQ1JUX1hNTF9DWE1MX0NPTlRFTlRfSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY3htbF9vYmplY3QuaCIKKworY2xhc3MgQ1hNTF9Db250ZW50IDogcHVibGljIENYTUxfT2JqZWN0IHsKKyBwdWJsaWM6CisgIENYTUxfQ29udGVudChib29sIGJDREFUQSwgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnQpOworICB+Q1hNTF9Db250ZW50KCkgb3ZlcnJpZGU7CisKKyAgLy8gQ1hNTF9PYmplY3Q6CisgIENYTUxfQ29udGVudCogQXNDb250ZW50KCkgb3ZlcnJpZGU7CisgIGNvbnN0IENYTUxfQ29udGVudCogQXNDb250ZW50KCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBtX2JDREFUQTsKKyAgV2lkZVN0cmluZyBtX0NvbnRlbnQ7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfWE1MX0NYTUxfQ09OVEVOVF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC94bWwvY3htbF9kYXRhYnVmYWNjLmNwcCBiL2NvcmUvZnhjcnQveG1sL2N4bWxfZGF0YWJ1ZmFjYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNlMmUxZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQveG1sL2N4bWxfZGF0YWJ1ZmFjYy5jcHAKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY3htbF9kYXRhYnVmYWNjLmgiCisKK0NYTUxfRGF0YUJ1ZkFjYzo6Q1hNTF9EYXRhQnVmQWNjKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIHNpemVfdCBzaXplKQorICAgIDogbV9wQnVmZmVyKHBCdWZmZXIpLCBtX2R3U2l6ZShzaXplKSwgbV9kd0N1clBvcygwKSB7fQorCitDWE1MX0RhdGFCdWZBY2M6On5DWE1MX0RhdGFCdWZBY2MoKSB7fQorCitib29sIENYTUxfRGF0YUJ1ZkFjYzo6UmVhZE5leHRCbG9jaygpIHsKKyAgaWYgKG1fZHdDdXJQb3MgPj0gbV9kd1NpemUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG1fZHdDdXJQb3MgPSBtX2R3U2l6ZTsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L3htbC9jeG1sX2RhdGFidWZhY2MuaCBiL2NvcmUvZnhjcnQveG1sL2N4bWxfZGF0YWJ1ZmFjYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYjQ0YjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Y3J0L3htbC9jeG1sX2RhdGFidWZhY2MuaApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWENSVF9YTUxfQ1hNTF9EQVRBQlVGQUNDX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfWE1MX0NYTUxfREFUQUJVRkFDQ19IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKworY2xhc3MgQ1hNTF9EYXRhQnVmQWNjIHsKKyBwdWJsaWM6CisgIENYTUxfRGF0YUJ1ZkFjYyhjb25zdCB1aW50OF90KiBwQnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisgIH5DWE1MX0RhdGFCdWZBY2MoKTsKKworICBib29sIElzRU9GKCkgY29uc3QgeyByZXR1cm4gbV9kd0N1clBvcyA+PSBtX2R3U2l6ZTsgfQorICBGWF9GSUxFU0laRSBHZXRQb3NpdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RlhfRklMRVNJWkU+KG1fZHdDdXJQb3MpOworICB9CisgIGJvb2wgUmVhZE5leHRCbG9jaygpOworICBjb25zdCB1aW50OF90KiBHZXRCbG9ja0J1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1fcEJ1ZmZlcjsgfQorICBzaXplX3QgR2V0QmxvY2tTaXplKCkgY29uc3QgeyByZXR1cm4gbV9kd1NpemU7IH0KKworIHByaXZhdGU6CisgIGNvbnN0IHVpbnQ4X3QqIG1fcEJ1ZmZlcjsKKyAgc2l6ZV90IG1fZHdTaXplOworICBzaXplX3QgbV9kd0N1clBvczsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWENSVF9YTUxfQ1hNTF9EQVRBQlVGQUNDX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L3htbC9jeG1sX2VsZW1lbnQuY3BwIGIvY29yZS9meGNydC94bWwvY3htbF9lbGVtZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDQyZThlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC94bWwvY3htbF9lbGVtZW50LmNwcApAQCAtMCwwICsxLDE2NSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY3htbF9lbGVtZW50LmgiCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jeG1sX2NvbnRlbnQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jeG1sX3BhcnNlci5oIgorCituYW1lc3BhY2UgeworCit2b2lkIFNwbGl0UXVhbGlmaWVkTmFtZShjb25zdCBCeXRlU3RyaW5nVmlldyYgYnNGdWxsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHJpbmdWaWV3KiBic1NwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0cmluZ1ZpZXcqIGJzTmFtZSkgeworICBpZiAoYnNGdWxsTmFtZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuOworCisgIGF1dG8gaVN0YXJ0ID0gYnNGdWxsTmFtZS5GaW5kKCc6Jyk7CisgIGlmIChpU3RhcnQuaGFzX3ZhbHVlKCkpIHsKKyAgICAqYnNTcGFjZSA9IGJzRnVsbE5hbWUuTGVmdChpU3RhcnQudmFsdWUoKSk7CisgICAgKmJzTmFtZSA9IGJzRnVsbE5hbWUuUmlnaHQoYnNGdWxsTmFtZS5HZXRMZW5ndGgoKSAtIChpU3RhcnQudmFsdWUoKSArIDEpKTsKKyAgfSBlbHNlIHsKKyAgICAqYnNOYW1lID0gYnNGdWxsTmFtZTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitzdGQ6OnVuaXF1ZV9wdHI8Q1hNTF9FbGVtZW50PiBDWE1MX0VsZW1lbnQ6OlBhcnNlKGNvbnN0IHZvaWQqIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7CisgIENYTUxfUGFyc2VyIHBhcnNlcjsKKyAgaWYgKCFwYXJzZXIuSW5pdChzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4ocEJ1ZmZlciksIHNpemUpKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gcGFyc2VyLlBhcnNlRWxlbWVudChudWxscHRyLCBmYWxzZSk7Cit9CisKK0NYTUxfRWxlbWVudDo6Q1hNTF9FbGVtZW50KGNvbnN0IENYTUxfRWxlbWVudCogcFBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBxU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgdGFnbmFtZSkKKyAgICA6IG1fcFBhcmVudChwUGFyZW50KSwgbV9RU3BhY2VOYW1lKHFTcGFjZSksIG1fVGFnTmFtZSh0YWduYW1lKSB7fQorCitDWE1MX0VsZW1lbnQ6On5DWE1MX0VsZW1lbnQoKSB7fQorCitDWE1MX0VsZW1lbnQqIENYTUxfRWxlbWVudDo6QXNFbGVtZW50KCkgeworICByZXR1cm4gdGhpczsKK30KKworY29uc3QgQ1hNTF9FbGVtZW50KiBDWE1MX0VsZW1lbnQ6OkFzRWxlbWVudCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK0J5dGVTdHJpbmcgQ1hNTF9FbGVtZW50OjpHZXRUYWdOYW1lKCkgY29uc3QgeworICByZXR1cm4gbV9UYWdOYW1lOworfQorCitCeXRlU3RyaW5nIENYTUxfRWxlbWVudDo6R2V0TmFtZXNwYWNlVVJJKGNvbnN0IEJ5dGVTdHJpbmcmIHFOYW1lKSBjb25zdCB7CisgIGNvbnN0IENYTUxfRWxlbWVudCogcEVsZW1lbnQgPSB0aGlzOworICBkbyB7CisgICAgY29uc3QgV2lkZVN0cmluZyogcHdzU3BhY2U7CisgICAgaWYgKHFOYW1lLklzRW1wdHkoKSkKKyAgICAgIHB3c1NwYWNlID0gcEVsZW1lbnQtPkxvb2t1cCgiIiwgInhtbG5zIik7CisgICAgZWxzZQorICAgICAgcHdzU3BhY2UgPSBwRWxlbWVudC0+TG9va3VwKCJ4bWxucyIsIHFOYW1lKTsKKyAgICBpZiAocHdzU3BhY2UpCisgICAgICByZXR1cm4gcHdzU3BhY2UtPlVURjhFbmNvZGUoKTsKKworICAgIHBFbGVtZW50ID0gcEVsZW1lbnQtPkdldFBhcmVudCgpOworICB9IHdoaWxlIChwRWxlbWVudCk7CisgIHJldHVybiBCeXRlU3RyaW5nKCk7Cit9CisKK3ZvaWQgQ1hNTF9FbGVtZW50OjpHZXRBdHRyQnlJbmRleChzaXplX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0cmluZyogc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0cmluZyogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nKiB2YWx1ZSkgY29uc3QgeworICBpZiAoaW5kZXggPj0gbV9BdHRyTWFwLnNpemUoKSkKKyAgICByZXR1cm47CisKKyAgY29uc3QgQ1hNTF9BdHRySXRlbSYgaXRlbSA9IG1fQXR0ck1hcFtpbmRleF07CisgICpzcGFjZSA9IGl0ZW0ubV9RU3BhY2VOYW1lOworICAqbmFtZSA9IGl0ZW0ubV9BdHRyTmFtZTsKKyAgKnZhbHVlID0gaXRlbS5tX1ZhbHVlOworfQorCitXaWRlU3RyaW5nIENYTUxfRWxlbWVudDo6R2V0QXR0clZhbHVlKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBuYW1lKSBjb25zdCB7CisgIEJ5dGVTdHJpbmdWaWV3IGJzU3BhY2U7CisgIEJ5dGVTdHJpbmdWaWV3IGJzTmFtZTsKKyAgU3BsaXRRdWFsaWZpZWROYW1lKG5hbWUsICZic1NwYWNlLCAmYnNOYW1lKTsKKworICBXaWRlU3RyaW5nIGF0dHI7CisgIGNvbnN0IFdpZGVTdHJpbmcqIHBWYWx1ZSA9IExvb2t1cChCeXRlU3RyaW5nKGJzU3BhY2UpLCBCeXRlU3RyaW5nKGJzTmFtZSkpOworICBpZiAocFZhbHVlKQorICAgIGF0dHIgPSAqcFZhbHVlOworICByZXR1cm4gYXR0cjsKK30KKworaW50IENYTUxfRWxlbWVudDo6R2V0QXR0ckludGVnZXIoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIG5hbWUpIGNvbnN0IHsKKyAgQnl0ZVN0cmluZ1ZpZXcgYnNTcGFjZTsKKyAgQnl0ZVN0cmluZ1ZpZXcgYnNOYW1lOworICBTcGxpdFF1YWxpZmllZE5hbWUobmFtZSwgJmJzU3BhY2UsICZic05hbWUpOworCisgIGNvbnN0IFdpZGVTdHJpbmcqIHB3c1ZhbHVlID0gTG9va3VwKEJ5dGVTdHJpbmcoYnNTcGFjZSksIEJ5dGVTdHJpbmcoYnNOYW1lKSk7CisgIHJldHVybiBwd3NWYWx1ZSA/IHB3c1ZhbHVlLT5HZXRJbnRlZ2VyKCkgOiAwOworfQorCitzaXplX3QgQ1hNTF9FbGVtZW50OjpDb3VudEVsZW1lbnRzKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHRhZykgY29uc3QgeworICBzaXplX3QgY291bnQgPSAwOworICBmb3IgKGNvbnN0IGF1dG8mIHBDaGlsZCA6IG1fQ2hpbGRyZW4pIHsKKyAgICBjb25zdCBDWE1MX0VsZW1lbnQqIHBLaWQgPSBwQ2hpbGQtPkFzRWxlbWVudCgpOworICAgIGlmIChNYXRjaGVzRWxlbWVudChwS2lkLCBzcGFjZSwgdGFnKSkKKyAgICAgIGNvdW50Kys7CisgIH0KKyAgcmV0dXJuIGNvdW50OworfQorCitDWE1MX09iamVjdCogQ1hNTF9FbGVtZW50OjpHZXRDaGlsZChzaXplX3QgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIGluZGV4IDwgbV9DaGlsZHJlbi5zaXplKCkgPyBtX0NoaWxkcmVuW2luZGV4XS5nZXQoKSA6IG51bGxwdHI7Cit9CisKK0NYTUxfRWxlbWVudCogQ1hNTF9FbGVtZW50OjpHZXRFbGVtZW50KGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnRoKSBjb25zdCB7CisgIGZvciAoY29uc3QgYXV0byYgcENoaWxkIDogbV9DaGlsZHJlbikgeworICAgIENYTUxfRWxlbWVudCogcEtpZCA9IHBDaGlsZC0+QXNFbGVtZW50KCk7CisgICAgaWYgKE1hdGNoZXNFbGVtZW50KHBLaWQsIHNwYWNlLCB0YWcpKSB7CisgICAgICBpZiAobnRoID09IDApCisgICAgICAgIHJldHVybiBwS2lkOworICAgICAgLS1udGg7CisgICAgfQorICB9CisgIHJldHVybiBudWxscHRyOworfQorCit2b2lkIENYTUxfRWxlbWVudDo6U2V0QXR0cmlidXRlKGNvbnN0IEJ5dGVTdHJpbmcmIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB2YWx1ZSkgeworICBmb3IgKENYTUxfQXR0ckl0ZW0mIGl0ZW0gOiBtX0F0dHJNYXApIHsKKyAgICBpZiAoaXRlbS5NYXRjaGVzKHNwYWNlLCBuYW1lKSkgeworICAgICAgaXRlbS5tX1ZhbHVlID0gdmFsdWU7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIG1fQXR0ck1hcC5wdXNoX2JhY2soe3NwYWNlLCBuYW1lLCBXaWRlU3RyaW5nKHZhbHVlKX0pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQ1hNTF9FbGVtZW50OjpNYXRjaGVzRWxlbWVudChjb25zdCBDWE1MX0VsZW1lbnQqIHBLaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiB0YWcpIHsKKyAgcmV0dXJuIHBLaWQgJiYgcEtpZC0+bV9UYWdOYW1lID09IHRhZyAmJgorICAgICAgICAgKHNwYWNlLklzRW1wdHkoKSB8fCBwS2lkLT5tX1FTcGFjZU5hbWUgPT0gc3BhY2UpOworfQorCitjb25zdCBXaWRlU3RyaW5nKiBDWE1MX0VsZW1lbnQ6Okxvb2t1cChjb25zdCBCeXRlU3RyaW5nJiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIG5hbWUpIGNvbnN0IHsKKyAgZm9yIChjb25zdCBDWE1MX0F0dHJJdGVtJiBpdGVtIDogbV9BdHRyTWFwKSB7CisgICAgaWYgKGl0ZW0uTWF0Y2hlcyhzcGFjZSwgbmFtZSkpCisgICAgICByZXR1cm4gJml0ZW0ubV9WYWx1ZTsKKyAgfQorICByZXR1cm4gbnVsbHB0cjsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQveG1sL2N4bWxfZWxlbWVudC5oIGIvY29yZS9meGNydC94bWwvY3htbF9lbGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwNDlkNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQveG1sL2N4bWxfZWxlbWVudC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYQ1JUX1hNTF9DWE1MX0VMRU1FTlRfSF8KKyNkZWZpbmUgQ09SRV9GWENSVF9YTUxfQ1hNTF9FTEVNRU5UX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jeG1sX2F0dHJpdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY3htbF9vYmplY3QuaCIKKworY2xhc3MgQ1hNTF9FbGVtZW50IDogcHVibGljIENYTUxfT2JqZWN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Q1hNTF9FbGVtZW50PiBQYXJzZShjb25zdCB2b2lkKiBwQnVmZmVyLCBzaXplX3Qgc2l6ZSk7CisKKyAgQ1hNTF9FbGVtZW50KGNvbnN0IENYTUxfRWxlbWVudCogcFBhcmVudCwKKyAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBxU3BhY2UsCisgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgdGFnbmFtZSk7CisgIH5DWE1MX0VsZW1lbnQoKSBvdmVycmlkZTsKKworICAvLyBDWE1MX09iamVjdDoKKyAgQ1hNTF9FbGVtZW50KiBBc0VsZW1lbnQoKSBvdmVycmlkZTsKKyAgY29uc3QgQ1hNTF9FbGVtZW50KiBBc0VsZW1lbnQoKSBjb25zdCBvdmVycmlkZTsKKworICBCeXRlU3RyaW5nIEdldFRhZ05hbWUoKSBjb25zdDsKKyAgQnl0ZVN0cmluZyBHZXROYW1lc3BhY2VVUkkoY29uc3QgQnl0ZVN0cmluZyYgcU5hbWUpIGNvbnN0OworICBjb25zdCBDWE1MX0VsZW1lbnQqIEdldFBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcFBhcmVudC5HZXQoKTsgfQorICBzaXplX3QgQ291bnRBdHRycygpIGNvbnN0IHsgcmV0dXJuIG1fQXR0ck1hcC5zaXplKCk7IH0KKyAgdm9pZCBHZXRBdHRyQnlJbmRleChzaXplX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0cmluZyogc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0cmluZyogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nKiB2YWx1ZSkgY29uc3Q7CisgIFdpZGVTdHJpbmcgR2V0QXR0clZhbHVlKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBuYW1lKSBjb25zdDsKKworICBpbnQgR2V0QXR0ckludGVnZXIoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIG5hbWUpIGNvbnN0OworCisgIHZvaWQgQXBwZW5kQ2hpbGQoc3RkOjp1bmlxdWVfcHRyPENYTUxfT2JqZWN0PiBjaGlsZCkgeworICAgIG1fQ2hpbGRyZW4ucHVzaF9iYWNrKHN0ZDo6bW92ZShjaGlsZCkpOworICB9CisKKyAgc2l6ZV90IENvdW50Q2hpbGRyZW4oKSBjb25zdCB7IHJldHVybiBtX0NoaWxkcmVuLnNpemUoKTsgfQorICBzaXplX3QgQ291bnRFbGVtZW50cyhjb25zdCBCeXRlU3RyaW5nVmlldyYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiB0YWcpIGNvbnN0OworICBDWE1MX09iamVjdCogR2V0Q2hpbGQoc2l6ZV90IGluZGV4KSBjb25zdDsKKyAgQ1hNTF9FbGVtZW50KiBHZXRFbGVtZW50KGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnRoKSBjb25zdDsKKworICB2b2lkIFNldEF0dHJpYnV0ZShjb25zdCBCeXRlU3RyaW5nJiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgdmFsdWUpOworCisgcHJpdmF0ZToKKyAgc3RhdGljIGJvb2wgTWF0Y2hlc0VsZW1lbnQoY29uc3QgQ1hNTF9FbGVtZW50KiBwS2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiB0YWcpOworCisgIGNvbnN0IFdpZGVTdHJpbmcqIExvb2t1cChjb25zdCBCeXRlU3RyaW5nJiBzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIG5hbWUpIGNvbnN0OworCisgIFVub3duZWRQdHI8Y29uc3QgQ1hNTF9FbGVtZW50PiBjb25zdCBtX3BQYXJlbnQ7CisgIGNvbnN0IEJ5dGVTdHJpbmcgbV9RU3BhY2VOYW1lOworICBjb25zdCBCeXRlU3RyaW5nIG1fVGFnTmFtZTsKKyAgc3RkOjp2ZWN0b3I8Q1hNTF9BdHRySXRlbT4gbV9BdHRyTWFwOworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1hNTF9PYmplY3Q+PiBtX0NoaWxkcmVuOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX1hNTF9DWE1MX0VMRU1FTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhjcnQveG1sL2N4bWxfb2JqZWN0LmNwcCBiL2NvcmUvZnhjcnQveG1sL2N4bWxfb2JqZWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWU4OGNiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGNydC94bWwvY3htbF9vYmplY3QuY3BwCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2N4bWxfb2JqZWN0LmgiCisKK0NYTUxfT2JqZWN0Ojp+Q1hNTF9PYmplY3QoKSB7fQorCitDWE1MX0NvbnRlbnQqIENYTUxfT2JqZWN0OjpBc0NvbnRlbnQoKSB7CisgIHJldHVybiBudWxscHRyOworfQorCitDWE1MX0VsZW1lbnQqIENYTUxfT2JqZWN0OjpBc0VsZW1lbnQoKSB7CisgIHJldHVybiBudWxscHRyOworfQorCitjb25zdCBDWE1MX0NvbnRlbnQqIENYTUxfT2JqZWN0OjpBc0NvbnRlbnQoKSBjb25zdCB7CisgIHJldHVybiBudWxscHRyOworfQorCitjb25zdCBDWE1MX0VsZW1lbnQqIENYTUxfT2JqZWN0OjpBc0VsZW1lbnQoKSBjb25zdCB7CisgIHJldHVybiBudWxscHRyOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC94bWwvY3htbF9vYmplY3QuaCBiL2NvcmUvZnhjcnQveG1sL2N4bWxfb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAwOTM1OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQveG1sL2N4bWxfb2JqZWN0LmgKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfWE1MX0NYTUxfT0JKRUNUX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfWE1MX0NYTUxfT0JKRUNUX0hfCisKK2NsYXNzIENYTUxfQ29udGVudDsKK2NsYXNzIENYTUxfRWxlbWVudDsKKworY2xhc3MgQ1hNTF9PYmplY3QgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+Q1hNTF9PYmplY3QoKTsKKworICB2aXJ0dWFsIENYTUxfQ29udGVudCogQXNDb250ZW50KCk7CisgIHZpcnR1YWwgY29uc3QgQ1hNTF9Db250ZW50KiBBc0NvbnRlbnQoKSBjb25zdDsKKworICB2aXJ0dWFsIENYTUxfRWxlbWVudCogQXNFbGVtZW50KCk7CisgIHZpcnR1YWwgY29uc3QgQ1hNTF9FbGVtZW50KiBBc0VsZW1lbnQoKSBjb25zdDsKKworIHByb3RlY3RlZDoKKyAgQ1hNTF9PYmplY3QoKSB7fQorfTsKKworaW5saW5lIENYTUxfQ29udGVudCogVG9Db250ZW50KENYTUxfT2JqZWN0KiBwT2JqKSB7CisgIHJldHVybiBwT2JqID8gcE9iai0+QXNDb250ZW50KCkgOiBudWxscHRyOworfQorCitpbmxpbmUgY29uc3QgQ1hNTF9Db250ZW50KiBUb0NvbnRlbnQoY29uc3QgQ1hNTF9PYmplY3QqIHBPYmopIHsKKyAgcmV0dXJuIHBPYmogPyBwT2JqLT5Bc0NvbnRlbnQoKSA6IG51bGxwdHI7Cit9CisKK2lubGluZSBDWE1MX0VsZW1lbnQqIFRvRWxlbWVudChDWE1MX09iamVjdCogcE9iaikgeworICByZXR1cm4gcE9iaiA/IHBPYmotPkFzRWxlbWVudCgpIDogbnVsbHB0cjsKK30KKworaW5saW5lIGNvbnN0IENYTUxfRWxlbWVudCogVG9FbGVtZW50KGNvbnN0IENYTUxfT2JqZWN0KiBwT2JqKSB7CisgIHJldHVybiBwT2JqID8gcE9iai0+QXNFbGVtZW50KCkgOiBudWxscHRyOworfQorCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfWE1MX0NYTUxfT0JKRUNUX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L3htbC9jeG1sX3BhcnNlci5jcHAgYi9jb3JlL2Z4Y3J0L3htbC9jeG1sX3BhcnNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1ZmQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQveG1sL2N4bWxfcGFyc2VyLmNwcApAQCAtMCwwICsxLDUyOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3V0ZjhkZWNvZGVyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfd2lkZXRleHRidWYuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2N4bWxfY29udGVudC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2N4bWxfZWxlbWVudC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2N4bWxfcGFyc2VyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworI2RlZmluZSBGWENSVE1fWE1MX0NIQVJUWVBFX05vcm1hbCAweDAwCisjZGVmaW5lIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfU3BhY2VDaGFyIDB4MDEKKyNkZWZpbmUgRlhDUlRNX1hNTF9DSEFSVFlQRV9MZXR0ZXIgMHgwMgorI2RlZmluZSBGWENSVE1fWE1MX0NIQVJUWVBFX0RpZ2l0YWwgMHgwNAorI2RlZmluZSBGWENSVE1fWE1MX0NIQVJUWVBFX05hbWVJbnRybyAweDA4CisjZGVmaW5lIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfTmFtZUNoYXIgMHgxMAorI2RlZmluZSBGWENSVE1fWE1MX0NIQVJUWVBFX0hleERpZ2l0YWwgMHgyMAorI2RlZmluZSBGWENSVE1fWE1MX0NIQVJUWVBFX0hleExvd2VyTGV0dGVyIDB4NDAKKyNkZWZpbmUgRlhDUlRNX1hNTF9DSEFSVFlQRV9IZXhVcHBlckxldHRlciAweDYwCisjZGVmaW5lIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfSGV4Q2hhciAweDYwCisKK2NvbnN0IHVpbnQ4X3QgZ19GWENSVF9YTUxfQnl0ZVR5cGVzWzI1Nl0gPSB7CisgICAgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwKKyAgICAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorICAgIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwKKyAgICAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDA4LCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N0EsIDB4N0EsIDB4N0EsIDB4N0EsIDB4N0EsIDB4N0EsIDB4MUEsCisgICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKKyAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDE4LAorICAgIDB4MDAsIDB4NUEsIDB4NUEsIDB4NUEsIDB4NUEsIDB4NUEsIDB4NUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCisgICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKKyAgICAweDFBLCAweDFBLCAweDFBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAorICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCisgICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKKyAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAorICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCisgICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKKyAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAorICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCisgICAgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwgMHgxQSwKKyAgICAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLCAweDFBLAorICAgIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsIDB4MUEsCisgICAgMHgxQSwgMHgxQSwgMHgwMSwgMHgwMSwKK307CisKK2NvbnN0ZXhwciBpbnQga01heERlcHRoID0gMTAyNDsKKworYm9vbCBnX0ZYQ1JUX1hNTF9Jc1doaXRlU3BhY2UodWludDhfdCBjaCkgeworICByZXR1cm4gISEoZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfU3BhY2VDaGFyKTsKK30KKworYm9vbCBnX0ZYQ1JUX1hNTF9Jc0RpZ2l0YWwodWludDhfdCBjaCkgeworICByZXR1cm4gISEoZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfRGlnaXRhbCk7Cit9CisKK2Jvb2wgZ19GWENSVF9YTUxfSXNOYW1lSW50cm8odWludDhfdCBjaCkgeworICByZXR1cm4gISEoZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfTmFtZUludHJvKTsKK30KKworYm9vbCBnX0ZYQ1JUX1hNTF9Jc05hbWVDaGFyKHVpbnQ4X3QgY2gpIHsKKyAgcmV0dXJuICEhKGdfRlhDUlRfWE1MX0J5dGVUeXBlc1tjaF0gJiBGWENSVE1fWE1MX0NIQVJUWVBFX05hbWVDaGFyKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0NYTUxfUGFyc2VyOjpDWE1MX1BhcnNlcigpCisgICAgOiBtX25PZmZzZXQoMCksCisgICAgICBtX3BCdWZmZXIobnVsbHB0ciksCisgICAgICBtX2R3QnVmZmVyU2l6ZSgwKSwKKyAgICAgIG1fbkJ1ZmZlck9mZnNldCgwKSwKKyAgICAgIG1fZHdJbmRleCgwKSB7fQorCitDWE1MX1BhcnNlcjo6fkNYTUxfUGFyc2VyKCkge30KKworYm9vbCBDWE1MX1BhcnNlcjo6SW5pdChjb25zdCB1aW50OF90KiBwQnVmZmVyLCBzaXplX3Qgc2l6ZSkgeworICBtX3BEYXRhQWNjID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYTUxfRGF0YUJ1ZkFjYz4ocEJ1ZmZlciwgc2l6ZSk7CisgIG1fbk9mZnNldCA9IDA7CisgIHJldHVybiBSZWFkTmV4dEJsb2NrKCk7Cit9CisKK2Jvb2wgQ1hNTF9QYXJzZXI6OlJlYWROZXh0QmxvY2soKSB7CisgIGlmICghbV9wRGF0YUFjYy0+UmVhZE5leHRCbG9jaygpKQorICAgIHJldHVybiBmYWxzZTsKKworICBtX3BCdWZmZXIgPSBtX3BEYXRhQWNjLT5HZXRCbG9ja0J1ZmZlcigpOworICBtX2R3QnVmZmVyU2l6ZSA9IG1fcERhdGFBY2MtPkdldEJsb2NrU2l6ZSgpOworICBtX25CdWZmZXJPZmZzZXQgPSAwOworICBtX2R3SW5kZXggPSAwOworICByZXR1cm4gbV9kd0J1ZmZlclNpemUgPiAwOworfQorCitib29sIENYTUxfUGFyc2VyOjpJc0VPRigpIHsKKyAgcmV0dXJuIG1fcERhdGFBY2MtPklzRU9GKCkgJiYgbV9kd0luZGV4ID49IG1fZHdCdWZmZXJTaXplOworfQorCit2b2lkIENYTUxfUGFyc2VyOjpTa2lwV2hpdGVTcGFjZXMoKSB7CisgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX2R3SW5kZXgpOworICBpZiAoSXNFT0YoKSkKKyAgICByZXR1cm47CisKKyAgZG8geworICAgIHdoaWxlIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSAmJgorICAgICAgICAgICBnX0ZYQ1JUX1hNTF9Jc1doaXRlU3BhY2UobV9wQnVmZmVyW21fZHdJbmRleF0pKSB7CisgICAgICBtX2R3SW5kZXgrKzsKKyAgICB9CisgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgc3RhdGljX2Nhc3Q8RlhfRklMRVNJWkU+KG1fZHdJbmRleCk7CisgICAgaWYgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplIHx8IElzRU9GKCkpCisgICAgICBicmVhazsKKyAgfSB3aGlsZSAoUmVhZE5leHRCbG9jaygpKTsKK30KKwordm9pZCBDWE1MX1BhcnNlcjo6R2V0TmFtZShCeXRlU3RyaW5nKiBzcGFjZSwgQnl0ZVN0cmluZyogbmFtZSkgeworICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyBzdGF0aWNfY2FzdDxGWF9GSUxFU0laRT4obV9kd0luZGV4KTsKKyAgaWYgKElzRU9GKCkpCisgICAgcmV0dXJuOworCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBidWY7CisgIGRvIHsKKyAgICB3aGlsZSAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUpIHsKKyAgICAgIHVpbnQ4X3QgY2ggPSBtX3BCdWZmZXJbbV9kd0luZGV4XTsKKyAgICAgIGlmIChjaCA9PSAnOicpIHsKKyAgICAgICAgKnNwYWNlID0gQnl0ZVN0cmluZyhidWYpOworICAgICAgICBidWYuc3RyKCIiKTsKKyAgICAgIH0gZWxzZSBpZiAoZ19GWENSVF9YTUxfSXNOYW1lQ2hhcihjaCkpIHsKKyAgICAgICAgYnVmIDw8IHN0YXRpY19jYXN0PGNoYXI+KGNoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgbV9kd0luZGV4Kys7CisgICAgfQorICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX2R3SW5kZXgpOworICAgIGlmIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSB8fCBJc0VPRigpKQorICAgICAgYnJlYWs7CisgIH0gd2hpbGUgKFJlYWROZXh0QmxvY2soKSk7CisgICpuYW1lID0gQnl0ZVN0cmluZyhidWYpOworfQorCit2b2lkIENYTUxfUGFyc2VyOjpTa2lwTGl0ZXJhbHMoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN0cikgeworICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyBzdGF0aWNfY2FzdDxGWF9GSUxFU0laRT4obV9kd0luZGV4KTsKKyAgaWYgKElzRU9GKCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaW50MzJfdCBpID0gMCwgaUxlbiA9IHN0ci5HZXRMZW5ndGgoKTsKKyAgZG8geworICAgIHdoaWxlIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSkgeworICAgICAgaWYgKHN0cltpXSAhPSBtX3BCdWZmZXJbbV9kd0luZGV4KytdKSB7CisgICAgICAgIGkgPSAwOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGkrKzsKKyAgICAgIGlmIChpID09IGlMZW4pCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyBzdGF0aWNfY2FzdDxGWF9GSUxFU0laRT4obV9kd0luZGV4KTsKKyAgICBpZiAoaSA9PSBpTGVuKQorICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplIHx8IElzRU9GKCkpCisgICAgICBicmVhazsKKyAgfSB3aGlsZSAoUmVhZE5leHRCbG9jaygpKTsKKyAgd2hpbGUgKCFtX3BEYXRhQWNjLT5Jc0VPRigpKSB7CisgICAgUmVhZE5leHRCbG9jaygpOworICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX2R3QnVmZmVyU2l6ZSk7CisgIH0KKyAgbV9kd0luZGV4ID0gbV9kd0J1ZmZlclNpemU7Cit9CisKK3VpbnQzMl90IENYTUxfUGFyc2VyOjpHZXRDaGFyUmVmKCkgeworICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyBzdGF0aWNfY2FzdDxGWF9GSUxFU0laRT4obV9kd0luZGV4KTsKKyAgaWYgKElzRU9GKCkpCisgICAgcmV0dXJuIDA7CisKKyAgdWludDhfdCBjaDsKKyAgaW50MzJfdCBpU3RhdGUgPSAwOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gYnVmOworICB1aW50MzJfdCBjb2RlID0gMDsKKyAgZG8geworICAgIHdoaWxlIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSkgeworICAgICAgY2ggPSBtX3BCdWZmZXJbbV9kd0luZGV4XTsKKyAgICAgIHN3aXRjaCAoaVN0YXRlKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBpZiAoY2ggPT0gJyMnKSB7CisgICAgICAgICAgICBtX2R3SW5kZXgrKzsKKyAgICAgICAgICAgIGlTdGF0ZSA9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaVN0YXRlID0gMTsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIG1fZHdJbmRleCsrOworICAgICAgICAgIGlmIChjaCA9PSAnOycpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHJlZiA9IGJ1Zi5zdHIoKTsKKyAgICAgICAgICAgIGlmIChyZWYgPT0gImd0IikKKyAgICAgICAgICAgICAgY29kZSA9ICc+JzsKKyAgICAgICAgICAgIGVsc2UgaWYgKHJlZiA9PSAibHQiKQorICAgICAgICAgICAgICBjb2RlID0gJzwnOworICAgICAgICAgICAgZWxzZSBpZiAocmVmID09ICJhbXAiKQorICAgICAgICAgICAgICBjb2RlID0gJyYnOworICAgICAgICAgICAgZWxzZSBpZiAocmVmID09ICJhcG9zIikKKyAgICAgICAgICAgICAgY29kZSA9ICdcJyc7CisgICAgICAgICAgICBlbHNlIGlmIChyZWYgPT0gInF1b3QiKQorICAgICAgICAgICAgICBjb2RlID0gJyInOworICAgICAgICAgICAgaVN0YXRlID0gMTA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgYnVmIDw8IHN0YXRpY19jYXN0PGNoYXI+KGNoKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIGlmIChjaCA9PSAneCcpIHsKKyAgICAgICAgICAgIG1fZHdJbmRleCsrOworICAgICAgICAgICAgaVN0YXRlID0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpU3RhdGUgPSAzOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgbV9kd0luZGV4Kys7CisgICAgICAgICAgaWYgKGNoID09ICc7JykgeworICAgICAgICAgICAgaVN0YXRlID0gMTA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGdfRlhDUlRfWE1MX0lzRGlnaXRhbChjaCkpCisgICAgICAgICAgICBjb2RlID0gY29kZSAqIDEwICsgRlhTWVNfRGVjaW1hbENoYXJUb0ludChzdGF0aWNfY2FzdDx3Y2hhcl90PihjaCkpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgbV9kd0luZGV4Kys7CisgICAgICAgICAgaWYgKGNoID09ICc7JykgeworICAgICAgICAgICAgaVN0YXRlID0gMTA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgdWludDhfdCBuSGV4ID0KKyAgICAgICAgICAgICAgZ19GWENSVF9YTUxfQnl0ZVR5cGVzW2NoXSAmIEZYQ1JUTV9YTUxfQ0hBUlRZUEVfSGV4Q2hhcjsKKyAgICAgICAgICBpZiAobkhleCkgeworICAgICAgICAgICAgaWYgKG5IZXggPT0gRlhDUlRNX1hNTF9DSEFSVFlQRV9IZXhEaWdpdGFsKSB7CisgICAgICAgICAgICAgIGNvZGUgPSAoY29kZSA8PCA0KSArCisgICAgICAgICAgICAgICAgICAgICBGWFNZU19EZWNpbWFsQ2hhclRvSW50KHN0YXRpY19jYXN0PHdjaGFyX3Q+KGNoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG5IZXggPT0gRlhDUlRNX1hNTF9DSEFSVFlQRV9IZXhMb3dlckxldHRlcikgeworICAgICAgICAgICAgICBjb2RlID0gKGNvZGUgPDwgNCkgKyBjaCAtIDg3OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgY29kZSA9IChjb2RlIDw8IDQpICsgY2ggLSA1NTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoaVN0YXRlID09IDEwKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgc3RhdGljX2Nhc3Q8RlhfRklMRVNJWkU+KG1fZHdJbmRleCk7CisgICAgaWYgKGlTdGF0ZSA9PSAxMCB8fCBtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSB8fCBJc0VPRigpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0gd2hpbGUgKFJlYWROZXh0QmxvY2soKSk7CisgIHJldHVybiBjb2RlOworfQorCitXaWRlU3RyaW5nIENYTUxfUGFyc2VyOjpHZXRBdHRyVmFsdWUoKSB7CisgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX2R3SW5kZXgpOworICBpZiAoSXNFT0YoKSkKKyAgICByZXR1cm4gV2lkZVN0cmluZygpOworCisgIENGWF9VVEY4RGVjb2RlciBkZWNvZGVyOworICB1aW50OF90IG1hcmsgPSAwOworICB1aW50OF90IGNoID0gMDsKKyAgZG8geworICAgIHdoaWxlIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSkgeworICAgICAgY2ggPSBtX3BCdWZmZXJbbV9kd0luZGV4XTsKKyAgICAgIGlmIChtYXJrID09IDApIHsKKyAgICAgICAgaWYgKGNoICE9ICdcJycgJiYgY2ggIT0gJyInKQorICAgICAgICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CisKKyAgICAgICAgbWFyayA9IGNoOworICAgICAgICBtX2R3SW5kZXgrKzsKKyAgICAgICAgY2ggPSAwOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIG1fZHdJbmRleCsrOworICAgICAgaWYgKGNoID09IG1hcmspCisgICAgICAgIGJyZWFrOworCisgICAgICBpZiAoY2ggPT0gJyYnKSB7CisgICAgICAgIGRlY29kZXIuQXBwZW5kQ29kZVBvaW50KEdldENoYXJSZWYoKSk7CisgICAgICAgIGlmIChJc0VPRigpKQorICAgICAgICAgIHJldHVybiBXaWRlU3RyaW5nKGRlY29kZXIuR2V0UmVzdWx0KCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGVjb2Rlci5JbnB1dChjaCk7CisgICAgICB9CisgICAgfQorICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX2R3SW5kZXgpOworICAgIGlmIChjaCA9PSBtYXJrIHx8IG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplIHx8IElzRU9GKCkpCisgICAgICBicmVhazsKKyAgfSB3aGlsZSAoUmVhZE5leHRCbG9jaygpKTsKKyAgcmV0dXJuIFdpZGVTdHJpbmcoZGVjb2Rlci5HZXRSZXN1bHQoKSk7Cit9CisKK3ZvaWQgQ1hNTF9QYXJzZXI6OkdldFRhZ05hbWUoYm9vbCBiU3RhcnRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGJFbmRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHJpbmcqIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nKiBuYW1lKSB7CisgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX2R3SW5kZXgpOworICBpZiAoSXNFT0YoKSkKKyAgICByZXR1cm47CisKKyAgKmJFbmRUYWcgPSBmYWxzZTsKKyAgdWludDhfdCBjaDsKKyAgaW50MzJfdCBpU3RhdGUgPSBiU3RhcnRUYWcgPyAxIDogMDsKKyAgZG8geworICAgIHdoaWxlIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSkgeworICAgICAgY2ggPSBtX3BCdWZmZXJbbV9kd0luZGV4XTsKKyAgICAgIHN3aXRjaCAoaVN0YXRlKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBtX2R3SW5kZXgrKzsKKyAgICAgICAgICBpZiAoY2ggIT0gJzwnKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBpU3RhdGUgPSAxOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgaWYgKGNoID09ICc/JykgeworICAgICAgICAgICAgbV9kd0luZGV4Kys7CisgICAgICAgICAgICBTa2lwTGl0ZXJhbHMoIj8+Iik7CisgICAgICAgICAgICBpU3RhdGUgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChjaCA9PSAnIScpIHsKKyAgICAgICAgICAgIG1fZHdJbmRleCsrOworICAgICAgICAgICAgU2tpcExpdGVyYWxzKCItLT4iKTsKKyAgICAgICAgICAgIGlTdGF0ZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGNoID09ICcvJykgeworICAgICAgICAgICAgbV9kd0luZGV4Kys7CisgICAgICAgICAgICBHZXROYW1lKHNwYWNlLCBuYW1lKTsKKyAgICAgICAgICAgICpiRW5kVGFnID0gdHJ1ZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR2V0TmFtZShzcGFjZSwgbmFtZSk7CisgICAgICAgICAgICAqYkVuZFRhZyA9IGZhbHNlOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX2R3SW5kZXgpOworICAgIGlmIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSB8fCBJc0VPRigpKQorICAgICAgYnJlYWs7CisgIH0gd2hpbGUgKFJlYWROZXh0QmxvY2soKSk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxDWE1MX0VsZW1lbnQ+IENYTUxfUGFyc2VyOjpQYXJzZUVsZW1lbnQoQ1hNTF9FbGVtZW50KiBwUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTdGFydFRhZykgeworICByZXR1cm4gUGFyc2VFbGVtZW50SW50ZXJuYWwocFBhcmVudCwgYlN0YXJ0VGFnLCAwKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPENYTUxfRWxlbWVudD4gQ1hNTF9QYXJzZXI6OlBhcnNlRWxlbWVudEludGVybmFsKAorICAgIENYTUxfRWxlbWVudCogcFBhcmVudCwKKyAgICBib29sIGJTdGFydFRhZywKKyAgICBpbnQgbkRlcHRoKSB7CisgIGlmIChuRGVwdGggPiBrTWF4RGVwdGgpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgc3RhdGljX2Nhc3Q8RlhfRklMRVNJWkU+KG1fZHdJbmRleCk7CisgIGlmIChJc0VPRigpKQorICAgIHJldHVybiBudWxscHRyOworCisgIEJ5dGVTdHJpbmcgdGFnX25hbWU7CisgIEJ5dGVTdHJpbmcgdGFnX3NwYWNlOworICBib29sIGJFbmRUYWc7CisgIEdldFRhZ05hbWUoYlN0YXJ0VGFnLCAmYkVuZFRhZywgJnRhZ19zcGFjZSwgJnRhZ19uYW1lKTsKKyAgaWYgKHRhZ19uYW1lLklzRW1wdHkoKSB8fCBiRW5kVGFnKQorICAgIHJldHVybiBudWxscHRyOworCisgIGF1dG8gcEVsZW1lbnQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hNTF9FbGVtZW50PigKKyAgICAgIHBQYXJlbnQsIHRhZ19zcGFjZS5Bc1N0cmluZ1ZpZXcoKSwgdGFnX25hbWUuQXNTdHJpbmdWaWV3KCkpOworICBkbyB7CisgICAgQnl0ZVN0cmluZyBhdHRyX3NwYWNlOworICAgIEJ5dGVTdHJpbmcgYXR0cl9uYW1lOworICAgIHdoaWxlIChtX2R3SW5kZXggPCBtX2R3QnVmZmVyU2l6ZSkgeworICAgICAgU2tpcFdoaXRlU3BhY2VzKCk7CisgICAgICBpZiAoSXNFT0YoKSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGlmICghZ19GWENSVF9YTUxfSXNOYW1lSW50cm8obV9wQnVmZmVyW21fZHdJbmRleF0pKQorICAgICAgICBicmVhazsKKworICAgICAgR2V0TmFtZSgmYXR0cl9zcGFjZSwgJmF0dHJfbmFtZSk7CisgICAgICBTa2lwV2hpdGVTcGFjZXMoKTsKKyAgICAgIGlmIChJc0VPRigpKQorICAgICAgICBicmVhazsKKworICAgICAgaWYgKG1fcEJ1ZmZlclttX2R3SW5kZXhdICE9ICc9JykKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIG1fZHdJbmRleCsrOworICAgICAgU2tpcFdoaXRlU3BhY2VzKCk7CisgICAgICBpZiAoSXNFT0YoKSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIFdpZGVTdHJpbmcgYXR0cl92YWx1ZSA9IEdldEF0dHJWYWx1ZSgpOworICAgICAgcEVsZW1lbnQtPlNldEF0dHJpYnV0ZShhdHRyX3NwYWNlLCBhdHRyX25hbWUsIGF0dHJfdmFsdWUpOworICAgIH0KKyAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyBzdGF0aWNfY2FzdDxGWF9GSUxFU0laRT4obV9kd0luZGV4KTsKKyAgICBpZiAobV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUgfHwgSXNFT0YoKSkKKyAgICAgIGJyZWFrOworICB9IHdoaWxlIChSZWFkTmV4dEJsb2NrKCkpOworICBTa2lwV2hpdGVTcGFjZXMoKTsKKyAgaWYgKElzRU9GKCkpCisgICAgcmV0dXJuIHBFbGVtZW50OworCisgIHVpbnQ4X3QgY2ggPSBtX3BCdWZmZXJbbV9kd0luZGV4KytdOworICBpZiAoY2ggPT0gJy8nKSB7CisgICAgbV9kd0luZGV4Kys7CisgICAgbV9uT2Zmc2V0ID0gbV9uQnVmZmVyT2Zmc2V0ICsgc3RhdGljX2Nhc3Q8RlhfRklMRVNJWkU+KG1fZHdJbmRleCk7CisgICAgcmV0dXJuIHBFbGVtZW50OworICB9CisgIGlmIChjaCAhPSAnPicpIHsKKyAgICBtX25PZmZzZXQgPSBtX25CdWZmZXJPZmZzZXQgKyBzdGF0aWNfY2FzdDxGWF9GSUxFU0laRT4obV9kd0luZGV4KTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBTa2lwV2hpdGVTcGFjZXMoKTsKKyAgaWYgKElzRU9GKCkpCisgICAgcmV0dXJuIHBFbGVtZW50OworCisgIENGWF9VVEY4RGVjb2RlciBkZWNvZGVyOworICBDRlhfV2lkZVRleHRCdWYgY29udGVudDsKKyAgYm9vbCBiQ0RBVEEgPSBmYWxzZTsKKyAgaW50MzJfdCBpU3RhdGUgPSAwOworICBkbyB7CisgICAgd2hpbGUgKG1fZHdJbmRleCA8IG1fZHdCdWZmZXJTaXplKSB7CisgICAgICBjaCA9IG1fcEJ1ZmZlclttX2R3SW5kZXgrK107CisgICAgICBzd2l0Y2ggKGlTdGF0ZSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgaWYgKGNoID09ICc8JykgeworICAgICAgICAgICAgaVN0YXRlID0gMTsKKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcmJykgeworICAgICAgICAgICAgZGVjb2Rlci5DbGVhclN0YXR1cygpOworICAgICAgICAgICAgZGVjb2Rlci5BcHBlbmRDb2RlUG9pbnQoR2V0Q2hhclJlZigpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVjb2Rlci5JbnB1dChjaCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgaWYgKGNoID09ICchJykgeworICAgICAgICAgICAgaVN0YXRlID0gMjsKKyAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc/JykgeworICAgICAgICAgICAgU2tpcExpdGVyYWxzKCI/PiIpOworICAgICAgICAgICAgU2tpcFdoaXRlU3BhY2VzKCk7CisgICAgICAgICAgICBpU3RhdGUgPSAwOworICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJy8nKSB7CisgICAgICAgICAgICBCeXRlU3RyaW5nIHNwYWNlOworICAgICAgICAgICAgQnl0ZVN0cmluZyBuYW1lOworICAgICAgICAgICAgR2V0TmFtZSgmc3BhY2UsICZuYW1lKTsKKyAgICAgICAgICAgIFNraXBXaGl0ZVNwYWNlcygpOworICAgICAgICAgICAgbV9kd0luZGV4Kys7CisgICAgICAgICAgICBpU3RhdGUgPSAxMDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udGVudCA8PCBkZWNvZGVyLkdldFJlc3VsdCgpOworICAgICAgICAgICAgV2lkZVN0cmluZyBkYXRhU3RyID0gY29udGVudC5NYWtlU3RyaW5nKCk7CisgICAgICAgICAgICBpZiAoIWJDREFUQSkKKyAgICAgICAgICAgICAgZGF0YVN0ci5UcmltUmlnaHQoTCIgXHRcclxuIik7CisKKyAgICAgICAgICAgIEluc2VydENvbnRlbnRTZWdtZW50KGJDREFUQSwgZGF0YVN0ci5Bc1N0cmluZ1ZpZXcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFbGVtZW50LmdldCgpKTsKKyAgICAgICAgICAgIGNvbnRlbnQuQ2xlYXIoKTsKKyAgICAgICAgICAgIGRlY29kZXIuQ2xlYXIoKTsKKyAgICAgICAgICAgIGJDREFUQSA9IGZhbHNlOworICAgICAgICAgICAgaVN0YXRlID0gMDsKKyAgICAgICAgICAgIG1fZHdJbmRleC0tOworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYTUxfRWxlbWVudD4gcFN1YkVsZW1lbnQgPQorICAgICAgICAgICAgICAgIFBhcnNlRWxlbWVudEludGVybmFsKHBFbGVtZW50LmdldCgpLCB0cnVlLCBuRGVwdGggKyAxKTsKKyAgICAgICAgICAgIGlmICghcFN1YkVsZW1lbnQpCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBwRWxlbWVudC0+QXBwZW5kQ2hpbGQoc3RkOjptb3ZlKHBTdWJFbGVtZW50KSk7CisgICAgICAgICAgICBTa2lwV2hpdGVTcGFjZXMoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICBpZiAoY2ggPT0gJ1snKSB7CisgICAgICAgICAgICBTa2lwTGl0ZXJhbHMoIl1dPiIpOworICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJy0nKSB7CisgICAgICAgICAgICBtX2R3SW5kZXgrKzsKKyAgICAgICAgICAgIFNraXBMaXRlcmFscygiLS0+Iik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNraXBMaXRlcmFscygiPiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBkZWNvZGVyLkNsZWFyKCk7CisgICAgICAgICAgU2tpcFdoaXRlU3BhY2VzKCk7CisgICAgICAgICAgaVN0YXRlID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChpU3RhdGUgPT0gMTApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIG1fbk9mZnNldCA9IG1fbkJ1ZmZlck9mZnNldCArIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX2R3SW5kZXgpOworICAgIGlmIChpU3RhdGUgPT0gMTAgfHwgbV9kd0luZGV4IDwgbV9kd0J1ZmZlclNpemUgfHwgSXNFT0YoKSkKKyAgICAgIGJyZWFrOworICB9IHdoaWxlIChSZWFkTmV4dEJsb2NrKCkpOworICBjb250ZW50IDw8IGRlY29kZXIuR2V0UmVzdWx0KCk7CisgIFdpZGVTdHJpbmcgZGF0YVN0ciA9IGNvbnRlbnQuTWFrZVN0cmluZygpOworICBkYXRhU3RyLlRyaW1SaWdodChMIiBcdFxyXG4iKTsKKworICBJbnNlcnRDb250ZW50U2VnbWVudChiQ0RBVEEsIGRhdGFTdHIuQXNTdHJpbmdWaWV3KCksIHBFbGVtZW50LmdldCgpKTsKKyAgY29udGVudC5DbGVhcigpOworICBkZWNvZGVyLkNsZWFyKCk7CisgIGJDREFUQSA9IGZhbHNlOworICByZXR1cm4gcEVsZW1lbnQ7Cit9CisKK3ZvaWQgQ1hNTF9QYXJzZXI6Okluc2VydENvbnRlbnRTZWdtZW50KGJvb2wgYkNEQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWE1MX0VsZW1lbnQqIHBFbGVtZW50KSB7CisgIGlmIChjb250ZW50LklzRW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgcEVsZW1lbnQtPkFwcGVuZENoaWxkKHBkZml1bTo6TWFrZVVuaXF1ZTxDWE1MX0NvbnRlbnQ+KGJDREFUQSwgY29udGVudCkpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGNydC94bWwvY3htbF9wYXJzZXIuaCBiL2NvcmUvZnhjcnQveG1sL2N4bWxfcGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmMTMwMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhjcnQveG1sL2N4bWxfcGFyc2VyLmgKQEAgLTAsMCArMSw1NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhDUlRfWE1MX0NYTUxfUEFSU0VSX0hfCisjZGVmaW5lIENPUkVfRlhDUlRfWE1MX0NYTUxfUEFSU0VSX0hfCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJlYW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jeG1sX2RhdGFidWZhY2MuaCIKKworY2xhc3MgQ0ZYX1VURjhEZWNvZGVyOworY2xhc3MgQ1hNTF9FbGVtZW50OworCitjbGFzcyBDWE1MX1BhcnNlciB7CisgcHVibGljOgorICBDWE1MX1BhcnNlcigpOworICB+Q1hNTF9QYXJzZXIoKTsKKworICBib29sIEluaXQoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgc2l6ZV90IHNpemUpOworICBib29sIFJlYWROZXh0QmxvY2soKTsKKyAgYm9vbCBJc0VPRigpOworICBib29sIEhhdmVBdmFpbERhdGEoKTsKKyAgdm9pZCBTa2lwV2hpdGVTcGFjZXMoKTsKKyAgdm9pZCBHZXROYW1lKEJ5dGVTdHJpbmcqIHNwYWNlLCBCeXRlU3RyaW5nKiBuYW1lKTsKKyAgV2lkZVN0cmluZyBHZXRBdHRyVmFsdWUoKTsKKyAgdWludDMyX3QgR2V0Q2hhclJlZigpOworICB2b2lkIEdldFRhZ05hbWUoYm9vbCBiU3RhcnRUYWcsCisgICAgICAgICAgICAgICAgICBib29sKiBiRW5kVGFnLAorICAgICAgICAgICAgICAgICAgQnl0ZVN0cmluZyogc3BhY2UsCisgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nKiBuYW1lKTsKKyAgdm9pZCBTa2lwTGl0ZXJhbHMoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN0cik7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWE1MX0VsZW1lbnQ+IFBhcnNlRWxlbWVudChDWE1MX0VsZW1lbnQqIHBQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTdGFydFRhZyk7CisgIHZvaWQgSW5zZXJ0Q29udGVudFNlZ21lbnQoYm9vbCBiQ0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCk7CisgIHZvaWQgSW5zZXJ0Q0RBVEFTZWdtZW50KENGWF9VVEY4RGVjb2RlciYgZGVjb2RlciwgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCk7CisKKyBwcml2YXRlOgorICBzdGQ6OnVuaXF1ZV9wdHI8Q1hNTF9FbGVtZW50PiBQYXJzZUVsZW1lbnRJbnRlcm5hbChDWE1MX0VsZW1lbnQqIHBQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0YXJ0VGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkRlcHRoKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hNTF9EYXRhQnVmQWNjPiBtX3BEYXRhQWNjOworICBGWF9GSUxFU0laRSBtX25PZmZzZXQ7CisgIGNvbnN0IHVpbnQ4X3QqIG1fcEJ1ZmZlcjsKKyAgc2l6ZV90IG1fZHdCdWZmZXJTaXplOworICBGWF9GSUxFU0laRSBtX25CdWZmZXJPZmZzZXQ7CisgIHNpemVfdCBtX2R3SW5kZXg7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhDUlRfWE1MX0NYTUxfUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Y3J0L3htbF9pbnQuaCBiL2NvcmUvZnhjcnQveG1sX2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmE3ZGE5Li4wMDAwMDAwCi0tLSBhL2NvcmUvZnhjcnQveG1sX2ludC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlhDUlRfWE1MX0lOVF9IXwotI2RlZmluZSBDT1JFX0ZYQ1JUX1hNTF9JTlRfSF8KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmVhbS5oIgotCi1jbGFzcyBDRlhfVVRGOERlY29kZXI7Ci1jbGFzcyBDWE1MX0VsZW1lbnQ7Ci0KLWNsYXNzIENYTUxfUGFyc2VyIHsKLSBwdWJsaWM6Ci0gIENYTUxfUGFyc2VyKCk7Ci0gIH5DWE1MX1BhcnNlcigpOwotCi0gIGJvb2wgSW5pdChjb25zdCB1aW50OF90KiBwQnVmZmVyLCBzaXplX3Qgc2l6ZSk7Ci0gIGJvb2wgUmVhZE5leHRCbG9jaygpOwotICBib29sIElzRU9GKCk7Ci0gIGJvb2wgSGF2ZUF2YWlsRGF0YSgpOwotICB2b2lkIFNraXBXaGl0ZVNwYWNlcygpOwotICB2b2lkIEdldE5hbWUoQ0ZYX0J5dGVTdHJpbmcqIHNwYWNlLCBDRlhfQnl0ZVN0cmluZyogbmFtZSk7Ci0gIHZvaWQgR2V0QXR0clZhbHVlKENGWF9XaWRlU3RyaW5nJiB2YWx1ZSk7Ci0gIHVpbnQzMl90IEdldENoYXJSZWYoKTsKLSAgdm9pZCBHZXRUYWdOYW1lKGJvb2wgYlN0YXJ0VGFnLAotICAgICAgICAgICAgICAgICAgYm9vbCogYkVuZFRhZywKLSAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nKiBzcGFjZSwKLSAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nKiBuYW1lKTsKLSAgdm9pZCBTa2lwTGl0ZXJhbHMoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hNTF9FbGVtZW50PiBQYXJzZUVsZW1lbnQoQ1hNTF9FbGVtZW50KiBwUGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3RhcnRUYWcpOwotICB2b2lkIEluc2VydENvbnRlbnRTZWdtZW50KGJvb2wgYkNEQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWE1MX0VsZW1lbnQqIHBFbGVtZW50KTsKLSAgdm9pZCBJbnNlcnRDREFUQVNlZ21lbnQoQ0ZYX1VURjhEZWNvZGVyJiBkZWNvZGVyLCBDWE1MX0VsZW1lbnQqIHBFbGVtZW50KTsKLQotICBDRlhfUmV0YWluUHRyPElGWF9CdWZmZXJlZFJlYWRTdHJlYW0+IG1fcERhdGFBY2M7Ci0gIEZYX0ZJTEVTSVpFIG1fbk9mZnNldDsKLSAgY29uc3QgdWludDhfdCogbV9wQnVmZmVyOwotICBzaXplX3QgbV9kd0J1ZmZlclNpemU7Ci0gIEZYX0ZJTEVTSVpFIG1fbkJ1ZmZlck9mZnNldDsKLSAgc2l6ZV90IG1fZHdJbmRleDsKLX07Ci0KLXZvaWQgRlhfWE1MX1NwbGl0UXVhbGlmaWVkTmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRnVsbE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDJiBic1NwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyYgYnNOYW1lKTsKLQotI2VuZGlmICAvLyBDT1JFX0ZYQ1JUX1hNTF9JTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9nZS9ERVBTIGIvY29yZS9meGdlL0RFUFMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvcmUvZnhnZS9nZS9ERVBTCnJlbmFtZSB0byBjb3JlL2Z4Z2UvREVQUwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2FnZy9meF9hZ2dfZHJpdmVyLmNwcCBiL2NvcmUvZnhnZS9hZ2cvZnhfYWdnX2RyaXZlci5jcHAKaW5kZXggOGM3Mjc3Ny4uYjM5NGZhYyAxMDA2NDQKLS0tIGEvY29yZS9meGdlL2FnZy9meF9hZ2dfZHJpdmVyLmNwcAorKysgYi9jb3JlL2Z4Z2UvYWdnL2Z4X2FnZ19kcml2ZXIuY3BwCkBAIC05LDE3ICs5LDEyIEBACiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPHV0aWxpdHk+CiAKLSNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvZnhfY29kZWMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZnhnZWRldmljZS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZ2Vtb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2NsaXByZ24uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2RlZmF1bHRyZW5kZXJkZXZpY2UuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGVkYXRhLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2RpYi9kaWJfaW50LmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2dlL2NmeF9jbGlwcmduLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2dlL2Z4X3RleHRfaW50LmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2lmeF9yZW5kZXJkZXZpY2Vkcml2ZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9pbWFnZXJlbmRlcmVyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfaW1hZ2VzdHJldGNoZXIuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfY29udl9kYXNoLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYWdnMjMvYWdnX2NvbnZfc3Ryb2tlLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYWdnMjMvYWdnX2N1cnZlcy5oIgpAQCAtMjksMTkgKzI0LDI1IEBACiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYWdnMjMvYWdnX3JlbmRlcmVyX3NjYW5saW5lLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYWdnMjMvYWdnX3NjYW5saW5lX3UuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgogCiBuYW1lc3BhY2UgewogCitjb25zdCBmbG9hdCBrTWF4UG9zID0gMzIwMDAuMGY7CisKIENGWF9Qb2ludEYgSGFyZENsaXAoY29uc3QgQ0ZYX1BvaW50RiYgcG9zKSB7Ci0gIHJldHVybiBDRlhfUG9pbnRGKHN0ZDo6bWF4KHN0ZDo6bWluKHBvcy54LCA1MDAwMC4wZiksIC01MDAwMC4wZiksCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6bWF4KHN0ZDo6bWluKHBvcy55LCA1MDAwMC4wZiksIC01MDAwMC4wZikpOworICByZXR1cm4gQ0ZYX1BvaW50RihwZGZpdW06OmNsYW1wKHBvcy54LCAta01heFBvcywga01heFBvcyksCisgICAgICAgICAgICAgICAgICAgIHBkZml1bTo6Y2xhbXAocG9zLnksIC1rTWF4UG9zLCBrTWF4UG9zKSk7CiB9CiAKLXZvaWQgUmdiQnl0ZU9yZGVyU2V0UGl4ZWwoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgeCwgaW50IHksIHVpbnQzMl90IGFyZ2IpIHsKK3ZvaWQgUmdiQnl0ZU9yZGVyU2V0UGl4ZWwoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXJnYikgewogICBpZiAoeCA8IDAgfHwgeCA+PSBwQml0bWFwLT5HZXRXaWR0aCgpIHx8IHkgPCAwIHx8IHkgPj0gcEJpdG1hcC0+R2V0SGVpZ2h0KCkpCiAgICAgcmV0dXJuOwogCi0gIHVpbnQ4X3QqIHBvcyA9ICh1aW50OF90KilwQml0bWFwLT5HZXRCdWZmZXIoKSArIHkgKiBwQml0bWFwLT5HZXRQaXRjaCgpICsKKyAgdWludDhfdCogcG9zID0gcEJpdG1hcC0+R2V0QnVmZmVyKCkgKyB5ICogcEJpdG1hcC0+R2V0UGl0Y2goKSArCiAgICAgICAgICAgICAgICAgIHggKiBwQml0bWFwLT5HZXRCUFAoKSAvIDg7CiAgIGlmIChwQml0bWFwLT5HZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKSB7CiAgICAgRlhBUkdCX1NFVFJHQk9SREVSRElCKHBvcywgYXJnYik7CkBAIC01NCw3ICs1NSw3IEBACiAgIHBvc1syXSA9IChGWEFSR0JfQihhcmdiKSAqIGFscGhhICsgcG9zWzJdICogKDI1NSAtIGFscGhhKSkgLyAyNTU7CiB9CiAKLXZvaWQgUmdiQnl0ZU9yZGVyQ29tcG9zaXRlUmVjdChDRlhfRElCaXRtYXAqIHBCaXRtYXAsCit2b2lkIFJnYkJ5dGVPcmRlckNvbXBvc2l0ZVJlY3QoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCkBAIC03MSw3ICs3Miw2IEBACiAgIGludCBzcmNfZyA9IEZYQVJHQl9HKGFyZ2IpOwogICBpbnQgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKICAgaW50IEJwcCA9IHBCaXRtYXAtPkdldEJQUCgpIC8gODsKLSAgYm9vbCBiQWxwaGEgPSBwQml0bWFwLT5IYXNBbHBoYSgpOwogICBpbnQgZGliX2FyZ2IgPSBGWEFSR0JfVE9CR1JPUkRFUkRJQihhcmdiKTsKICAgdWludDhfdCogcEJ1ZmZlciA9IHBCaXRtYXAtPkdldEJ1ZmZlcigpOwogICBpZiAoc3JjX2FscGhhID09IDI1NSkgewpAQCAtNzksNyArNzksNyBAQAogICAgICAgdWludDhfdCogZGVzdF9zY2FuID0KICAgICAgICAgICBwQnVmZmVyICsgcm93ICogcEJpdG1hcC0+R2V0UGl0Y2goKSArIHJlY3QubGVmdCAqIEJwcDsKICAgICAgIGlmIChCcHAgPT0gNCkgewotICAgICAgICB1aW50MzJfdCogc2NhbiA9ICh1aW50MzJfdCopZGVzdF9zY2FuOworICAgICAgICB1aW50MzJfdCogc2NhbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPihkZXN0X3NjYW4pOwogICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspCiAgICAgICAgICAgKnNjYW4rKyA9IGRpYl9hcmdiOwogICAgICAgfSBlbHNlIHsKQEAgLTkyLDYgKzkyLDcgQEAKICAgICB9CiAgICAgcmV0dXJuOwogICB9CisgIGJvb2wgYkFscGhhID0gcEJpdG1hcC0+SGFzQWxwaGEoKTsKICAgZm9yIChpbnQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyByb3crKykgewogICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IHBCdWZmZXIgKyByb3cgKiBwQml0bWFwLT5HZXRQaXRjaCgpICsgcmVjdC5sZWZ0ICogQnBwOwogICAgIGlmIChiQWxwaGEpIHsKQEAgLTExNCwyNyArMTE1LDI3IEBACiAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOwogICAgICAgICBkZXN0X3NjYW4gKz0gMjsKICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgc3JjX2FscGhhKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGlmIChCcHAgPT0gNCkKICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgc3JjX2FscGhhKTsKLSAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgc3JjX2FscGhhKTsKLSAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgIGlmIChCcHAgPT0gNCkKLSAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgIH0KICAgICB9CiAgIH0KIH0KIAotdm9pZCBSZ2JCeXRlT3JkZXJUcmFuc2ZlckJpdG1hcChDRlhfRElCaXRtYXAqIHBCaXRtYXAsCit2b2lkIFJnYkJ5dGVPcmRlclRyYW5zZmVyQml0bWFwKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwQml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwU3JjQml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wKSB7CiAgIGlmICghcEJpdG1hcCkKQEAgLTE1NSw3ICsxNTYsOCBAQAogICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGJ1ZmZlciArIChkZXN0X3RvcCArIHJvdykgKiBwaXRjaCArIGRlc3RfbGVmdCAqIEJwcDsKICAgICAgIHVpbnQ4X3QqIHNyY19zY2FuID0KLSAgICAgICAgICAodWludDhfdCopcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIEJwcDsKKyAgICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QqPihwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSkgKworICAgICAgICAgIHNyY19sZWZ0ICogQnBwOwogICAgICAgaWYgKEJwcCA9PSA0KSB7CiAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewogICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfc2NhblszXSwgc3JjX3NjYW5bMF0sCkBAIC0xNjMsMTMgKzE2NSwxMyBAQAogICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwogICAgICAgICAgIHNyY19zY2FuICs9IDQ7CiAgICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19zY2FuWzJdOwotICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19zY2FuWzFdOwotICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19zY2FuWzBdOwotICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgIH0KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3NjYW5bMl07CisgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19zY2FuWzFdOworICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfc2NhblswXTsKKyAgICAgICAgc3JjX3NjYW4gKz0gMzsKICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuOwpAQCAtMTc3LDE5MCArMTc5LDc2IEBACiAKICAgdWludDhfdCogZGVzdF9idWYgPSBidWZmZXIgKyBkZXN0X3RvcCAqIHBpdGNoICsgZGVzdF9sZWZ0ICogQnBwOwogICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfUmdiKSB7Ci0gICAgaWYgKHNyY19mb3JtYXQgPT0gRlhESUJfUmdiMzIpIHsKLSAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKLSAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBwaXRjaDsKLSAgICAgICAgdWludDhfdCogc3JjX3NjYW4gPQotICAgICAgICAgICAgKHVpbnQ4X3QqKXBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiA0OwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfc2NhblsyXTsKLSAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfc2NhblsxXTsKLSAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfc2NhblswXTsKLSAgICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFTU0VSVChmYWxzZSk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChkZXN0X2Zvcm1hdCA9PSBGWERJQl9BcmdiIHx8IGRlc3RfZm9ybWF0ID09IEZYRElCX1JnYjMyKSB7Ci0gICAgaWYgKHNyY19mb3JtYXQgPT0gRlhESUJfUmdiKSB7Ci0gICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7Ci0gICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9ICh1aW50OF90KikoZGVzdF9idWYgKyByb3cgKiBwaXRjaCk7Ci0gICAgICAgIHVpbnQ4X3QqIHNyY19zY2FuID0KLSAgICAgICAgICAgICh1aW50OF90KilwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogMzsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKDB4ZmYsIHNyY19zY2FuWzBdLCBzcmNfc2NhblsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW5bMl0pKTsKLSAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChzcmNfZm9ybWF0ID09IEZYRElCX1JnYjMyKSB7Ci0gICAgICBBU1NFUlQoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYik7Ci0gICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7Ci0gICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogcGl0Y2g7Ci0gICAgICAgIHVpbnQ4X3QqIHNyY19zY2FuID0KLSAgICAgICAgICAgICh1aW50OF90KikocFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIDQpOwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0UoMHhmZiwgc3JjX3NjYW5bMF0sIHNyY19zY2FuWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhblsyXSkpOwotICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgIH0KKyAgICBBU1NFUlQoc3JjX2Zvcm1hdCA9PSBGWERJQl9SZ2IzMik7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBwaXRjaDsKKyAgICAgIHVpbnQ4X3QqIHNyY19zY2FuID0KKyAgICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QqPihwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSkgKworICAgICAgICAgIHNyY19sZWZ0ICogNDsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfc2NhblsyXTsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3NjYW5bMV07CisgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19zY2FuWzBdOworICAgICAgICBzcmNfc2NhbiArPSA0OwogICAgICAgfQogICAgIH0KICAgICByZXR1cm47CiAgIH0KIAotICBBU1NFUlQoZmFsc2UpOworICBBU1NFUlQoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYiB8fCBkZXN0X2Zvcm1hdCA9PSBGWERJQl9SZ2IzMik7CisgIGlmIChzcmNfZm9ybWF0ID09IEZYRElCX1JnYikgeworICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogcGl0Y2g7CisgICAgICB1aW50OF90KiBzcmNfc2NhbiA9CisgICAgICAgICAgY29uc3RfY2FzdDx1aW50OF90Kj4ocFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykpICsKKyAgICAgICAgICBzcmNfbGVmdCAqIDM7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX01BS0UoMHhmZiwgc3JjX3NjYW5bMF0sIHNyY19zY2FuWzFdLCBzcmNfc2NhblsyXSkpOworICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgc3JjX3NjYW4gKz0gMzsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGlmIChzcmNfZm9ybWF0ICE9IEZYRElCX1JnYjMyKQorICAgIHJldHVybjsKKyAgQVNTRVJUKGRlc3RfZm9ybWF0ID09IEZYRElCX0FyZ2IpOworICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBwaXRjaDsKKyAgICB1aW50OF90KiBzcmNfc2NhbiA9CisgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCo+KHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpKSArCisgICAgICAgIHNyY19sZWZ0ICogNDsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICBGWEFSR0JfTUFLRSgweGZmLCBzcmNfc2NhblswXSwgc3JjX3NjYW5bMV0sIHNyY19zY2FuWzJdKSk7CisgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgfQorICB9CiB9CiAKLUZYX0FSR0IgRGVmYXVsdENNWUsyQVJHQihGWF9DTVlLIGNteWssIHVpbnQ4X3QgYWxwaGEpIHsKLSAgdWludDhfdCByLCBnLCBiOwotICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNteWspLCBGWFNZU19HZXRNVmFsdWUoY215ayksCi0gICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoY215ayksIEZYU1lTX0dldEtWYWx1ZShjbXlrKSwgciwgZywgYik7Ci0gIHJldHVybiBBcmdiRW5jb2RlKGFscGhhLCByLCBnLCBiKTsKLX0KLQotYm9vbCBEaWJTZXRQaXhlbChDRlhfRElCaXRtYXAqIHBEZXZpY2UsCitib29sIERpYlNldFBpeGVsKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwRGV2aWNlLAogICAgICAgICAgICAgICAgICBpbnQgeCwKICAgICAgICAgICAgICAgICAgaW50IHksCi0gICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yLAotICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKLSAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgewotICBib29sIGJPYmpDTVlLID0gISFGWEdFVEZMQUdfQ09MT1JUWVBFKGFscGhhX2ZsYWcpOwotICBpbnQgYWxwaGEgPSBiT2JqQ01ZSyA/IEZYR0VURkxBR19BTFBIQV9GSUxMKGFscGhhX2ZsYWcpIDogRlhBUkdCX0EoY29sb3IpOwotICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgIENDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQotICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICBjb2xvciA9IGJPYmpDTVlLID8gRlhDTVlLX1RPRElCKGNvbG9yKSA6IEZYQVJHQl9UT0RJQihjb2xvcik7Ci0gICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKSZjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCopJmNvbG9yLCAxKTsKLSAgICBjb2xvciA9IGJPYmpDTVlLID8gRlhDTVlLX1RPRElCKGNvbG9yKSA6IEZYQVJHQl9UT0RJQihjb2xvcik7Ci0gICAgaWYgKCFwRGV2aWNlLT5Jc0NteWtJbWFnZSgpKSB7Ci0gICAgICBjb2xvciA9IChjb2xvciAmIDB4ZmZmZmZmKSB8IChhbHBoYSA8PCAyNCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChwRGV2aWNlLT5Jc0NteWtJbWFnZSgpKSB7Ci0gICAgICBpZiAoIWJPYmpDTVlLKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChiT2JqQ01ZSykKLSAgICAgICAgY29sb3IgPSBEZWZhdWx0Q01ZSzJBUkdCKGNvbG9yLCBhbHBoYSk7Ci0gICAgfQotICB9CisgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yKSB7CisgIGludCBhbHBoYSA9IEZYQVJHQl9BKGNvbG9yKTsKKyAgaWYgKHBEZXZpY2UtPklzQ215a0ltYWdlKCkpCisgICAgcmV0dXJuIGZhbHNlOworCiAgIHBEZXZpY2UtPlNldFBpeGVsKHgsIHksIGNvbG9yKTsKLSAgaWYgKHBEZXZpY2UtPm1fcEFscGhhTWFzaykgeworICBpZiAocERldmljZS0+bV9wQWxwaGFNYXNrKQogICAgIHBEZXZpY2UtPm1fcEFscGhhTWFzay0+U2V0UGl4ZWwoeCwgeSwgYWxwaGEgPDwgMjQpOwotICB9CiAgIHJldHVybiB0cnVlOwogfQogCi19ICAvLyBuYW1lc3BhY2UKLQotdm9pZCBDQWdnX1BhdGhEYXRhOjpCdWlsZFBhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSkgewotICBjb25zdCBzdGQ6OnZlY3RvcjxGWF9QQVRIUE9JTlQ+JiBwUG9pbnRzID0gcFBhdGhEYXRhLT5HZXRQb2ludHMoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwUG9pbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgQ0ZYX1BvaW50RiBwb3MgPSBwUG9pbnRzW2ldLm1fUG9pbnQ7Ci0gICAgaWYgKHBPYmplY3QyRGV2aWNlKQotICAgICAgcG9zID0gcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybShwb3MpOwotCi0gICAgcG9zID0gSGFyZENsaXAocG9zKTsKLSAgICBGWFBUX1RZUEUgcG9pbnRfdHlwZSA9IHBQb2ludHNbaV0ubV9UeXBlOwotICAgIGlmIChwb2ludF90eXBlID09IEZYUFRfVFlQRTo6TW92ZVRvKSB7Ci0gICAgICBtX1BhdGhEYXRhLm1vdmVfdG8ocG9zLngsIHBvcy55KTsKLSAgICB9IGVsc2UgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9UWVBFOjpMaW5lVG8pIHsKLSAgICAgIGlmIChwUG9pbnRzW2kgLSAxXS5Jc1R5cGVBbmRPcGVuKEZYUFRfVFlQRTo6TW92ZVRvKSAmJgotICAgICAgICAgIChpID09IHBQb2ludHMuc2l6ZSgpIC0gMSB8fAotICAgICAgICAgICBwUG9pbnRzW2kgKyAxXS5Jc1R5cGVBbmRPcGVuKEZYUFRfVFlQRTo6TW92ZVRvKSkgJiYKLSAgICAgICAgICBwUG9pbnRzW2ldLm1fUG9pbnQgPT0gcFBvaW50c1tpIC0gMV0ubV9Qb2ludCkgewotICAgICAgICBwb3MueCArPSAxOwotICAgICAgfQotICAgICAgbV9QYXRoRGF0YS5saW5lX3RvKHBvcy54LCBwb3MueSk7Ci0gICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfVFlQRTo6QmV6aWVyVG8pIHsKLSAgICAgIENGWF9Qb2ludEYgcG9zMCA9IHBQb2ludHNbaSAtIDFdLm1fUG9pbnQ7Ci0gICAgICBDRlhfUG9pbnRGIHBvczIgPSBwUG9pbnRzW2kgKyAxXS5tX1BvaW50OwotICAgICAgQ0ZYX1BvaW50RiBwb3MzID0gcFBvaW50c1tpICsgMl0ubV9Qb2ludDsKLSAgICAgIGlmIChwT2JqZWN0MkRldmljZSkgewotICAgICAgICBwb3MwID0gcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybShwb3MwKTsKLSAgICAgICAgcG9zMiA9IHBPYmplY3QyRGV2aWNlLT5UcmFuc2Zvcm0ocG9zMik7Ci0gICAgICAgIHBvczMgPSBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHBvczMpOwotICAgICAgfQotICAgICAgcG9zMCA9IEhhcmRDbGlwKHBvczApOwotICAgICAgcG9zMiA9IEhhcmRDbGlwKHBvczIpOwotICAgICAgcG9zMyA9IEhhcmRDbGlwKHBvczMpOwotICAgICAgYWdnOjpjdXJ2ZTQgY3VydmUocG9zMC54LCBwb3MwLnksIHBvcy54LCBwb3MueSwgcG9zMi54LCBwb3MyLnksIHBvczMueCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvczMueSk7Ci0gICAgICBpICs9IDI7Ci0gICAgICBtX1BhdGhEYXRhLmFkZF9wYXRoX2N1cnZlKGN1cnZlKTsKLSAgICB9Ci0gICAgaWYgKHBQb2ludHNbaV0ubV9DbG9zZUZpZ3VyZSkKLSAgICAgIG1fUGF0aERhdGEuZW5kX3BvbHkoKTsKLSAgfQotfQotCi1uYW1lc3BhY2UgYWdnIHsKLQotdGVtcGxhdGUgPGNsYXNzIEJhc2VSZW5kZXJlcj4KLWNsYXNzIHJlbmRlcmVyX3NjYW5saW5lX2FhX29mZnNldCB7Ci0gcHVibGljOgotICB0eXBlZGVmIEJhc2VSZW5kZXJlciBiYXNlX3Jlbl90eXBlOwotICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfcmVuX3R5cGU6OmNvbG9yX3R5cGUgY29sb3JfdHlwZTsKLSAgcmVuZGVyZXJfc2NhbmxpbmVfYWFfb2Zmc2V0KGJhc2VfcmVuX3R5cGUmIHJlbiwgdW5zaWduZWQgbGVmdCwgdW5zaWduZWQgdG9wKQotICAgICAgOiBtX3JlbigmcmVuKSwgbV9sZWZ0KGxlZnQpLCBtX3RvcCh0b3ApIHt9Ci0gIHZvaWQgY29sb3IoY29uc3QgY29sb3JfdHlwZSYgYykgeyBtX2NvbG9yID0gYzsgfQotICBjb25zdCBjb2xvcl90eXBlJiBjb2xvcigpIGNvbnN0IHsgcmV0dXJuIG1fY29sb3I7IH0KLSAgdm9pZCBwcmVwYXJlKHVuc2lnbmVkKSB7fQotICB0ZW1wbGF0ZSA8Y2xhc3MgU2NhbmxpbmU+Ci0gIHZvaWQgcmVuZGVyKGNvbnN0IFNjYW5saW5lJiBzbCkgewotICAgIGludCB5ID0gc2wueSgpOwotICAgIHVuc2lnbmVkIG51bV9zcGFucyA9IHNsLm51bV9zcGFucygpOwotICAgIHR5cGVuYW1lIFNjYW5saW5lOjpjb25zdF9pdGVyYXRvciBzcGFuID0gc2wuYmVnaW4oKTsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICBpbnQgeCA9IHNwYW4tPng7Ci0gICAgICBpZiAoc3Bhbi0+bGVuID4gMCkgewotICAgICAgICBtX3Jlbi0+YmxlbmRfc29saWRfaHNwYW4oeCAtIG1fbGVmdCwgeSAtIG1fdG9wLCAodW5zaWduZWQpc3Bhbi0+bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb2xvciwgc3Bhbi0+Y292ZXJzKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fcmVuLT5ibGVuZF9obGluZSh4IC0gbV9sZWZ0LCB5IC0gbV90b3AsICh1bnNpZ25lZCkoeCAtIHNwYW4tPmxlbiAtIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb2xvciwgKihzcGFuLT5jb3ZlcnMpKTsKLSAgICAgIH0KLSAgICAgIGlmICgtLW51bV9zcGFucyA9PSAwKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgKytzcGFuOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgYmFzZV9yZW5fdHlwZSogbV9yZW47Ci0gIGNvbG9yX3R5cGUgbV9jb2xvcjsKLSAgdW5zaWduZWQgbV9sZWZ0LCBtX3RvcDsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhZ2cKLQotc3RhdGljIHZvaWQgUmFzdGVyaXplU3Ryb2tlKGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSYgcmFzdGVyaXplciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2c6OnBhdGhfc3RvcmFnZSYgcGF0aF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc2NhbGUgPSAxLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0cm9rZUFkanVzdCA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRleHRNb2RlID0gZmFsc2UpIHsKK3ZvaWQgUmFzdGVyaXplU3Ryb2tlKGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSogcmFzdGVyaXplciwKKyAgICAgICAgICAgICAgICAgICAgIGFnZzo6cGF0aF9zdG9yYWdlKiBwYXRoX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0cm9rZUFkanVzdCwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRleHRNb2RlKSB7CiAgIGFnZzo6bGluZV9jYXBfZSBjYXA7CiAgIHN3aXRjaCAocEdyYXBoU3RhdGUtPm1fTGluZUNhcCkgewogICAgIGNhc2UgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwUm91bmQ6CkBAIC0zODUsMjkgKzI3MywyNCBAQAogICAgICAgam9pbiA9IGFnZzo6bWl0ZXJfam9pbl9yZXZlcnQ7CiAgICAgICBicmVhazsKICAgfQotICBGWF9GTE9BVCB3aWR0aCA9IHBHcmFwaFN0YXRlLT5tX0xpbmVXaWR0aCAqIHNjYWxlOwotICBGWF9GTE9BVCB1bml0ID0gMS5mOworICBmbG9hdCB3aWR0aCA9IHBHcmFwaFN0YXRlLT5tX0xpbmVXaWR0aCAqIHNjYWxlOworICBmbG9hdCB1bml0ID0gMS4wZjsKICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CiAgICAgdW5pdCA9CiAgICAgICAgIDEuMGYgLyAoKHBPYmplY3QyRGV2aWNlLT5HZXRYVW5pdCgpICsgcE9iamVjdDJEZXZpY2UtPkdldFlVbml0KCkpIC8gMik7CiAgIH0KLSAgaWYgKHdpZHRoIDwgdW5pdCkgewotICAgIHdpZHRoID0gdW5pdDsKLSAgfQorICB3aWR0aCA9IHN0ZDo6bWF4KHdpZHRoLCB1bml0KTsKICAgaWYgKHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheSkgewogICAgIHR5cGVkZWYgYWdnOjpjb252X2Rhc2g8YWdnOjpwYXRoX3N0b3JhZ2U+IGRhc2hfY29udmVydGVyOwotICAgIGRhc2hfY29udmVydGVyIGRhc2gocGF0aF9kYXRhKTsKKyAgICBkYXNoX2NvbnZlcnRlciBkYXNoKCpwYXRoX2RhdGEpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCArIDEpIC8gMjsgaSsrKSB7Ci0gICAgICBGWF9GTE9BVCBvbiA9IHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheVtpICogMl07Ci0gICAgICBpZiAob24gPD0gMC4wMDAwMDFmKSB7CisgICAgICBmbG9hdCBvbiA9IHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheVtpICogMl07CisgICAgICBpZiAob24gPD0gMC4wMDAwMDFmKQogICAgICAgICBvbiA9IDEuMGYgLyAxMDsKLSAgICAgIH0KLSAgICAgIEZYX0ZMT0FUIG9mZiA9IGkgKiAyICsgMSA9PSBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQKLSAgICAgICAgICAgICAgICAgICAgICAgICA/IG9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgOiBwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXlbaSAqIDIgKyAxXTsKLSAgICAgIGlmIChvZmYgPCAwKSB7Ci0gICAgICAgIG9mZiA9IDA7Ci0gICAgICB9CisgICAgICBmbG9hdCBvZmYgPSBpICogMiArIDEgPT0gcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50CisgICAgICAgICAgICAgICAgICAgICAgPyBvbgorICAgICAgICAgICAgICAgICAgICAgIDogcEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5W2kgKiAyICsgMV07CisgICAgICBvZmYgPSBzdGQ6Om1heChvZmYsIDAuMGYpOwogICAgICAgZGFzaC5hZGRfZGFzaChvbiAqIHNjYWxlLCBvZmYgKiBzY2FsZSk7CiAgICAgfQogICAgIGRhc2guZGFzaF9zdGFydChwR3JhcGhTdGF0ZS0+bV9EYXNoUGhhc2UgKiBzY2FsZSk7CkBAIC00MTcsMjMgKzMwMCw4MTYgQEAKICAgICBzdHJva2UubGluZV9jYXAoY2FwKTsKICAgICBzdHJva2UubWl0ZXJfbGltaXQocEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCk7CiAgICAgc3Ryb2tlLndpZHRoKHdpZHRoKTsKLSAgICByYXN0ZXJpemVyLmFkZF9wYXRoX3RyYW5zZm9ybWVkKHN0cm9rZSwgcE9iamVjdDJEZXZpY2UpOworICAgIHJhc3Rlcml6ZXItPmFkZF9wYXRoX3RyYW5zZm9ybWVkKHN0cm9rZSwgcE9iamVjdDJEZXZpY2UpOworICAgIHJldHVybjsKKyAgfQorICBhZ2c6OmNvbnZfc3Ryb2tlPGFnZzo6cGF0aF9zdG9yYWdlPiBzdHJva2UoKnBhdGhfZGF0YSk7CisgIHN0cm9rZS5saW5lX2pvaW4oam9pbik7CisgIHN0cm9rZS5saW5lX2NhcChjYXApOworICBzdHJva2UubWl0ZXJfbGltaXQocEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCk7CisgIHN0cm9rZS53aWR0aCh3aWR0aCk7CisgIHJhc3Rlcml6ZXItPmFkZF9wYXRoX3RyYW5zZm9ybWVkKHN0cm9rZSwgcE9iamVjdDJEZXZpY2UpOworfQorCitjbGFzcyBDRlhfUmVuZGVyZXIgeworIHB1YmxpYzoKKyAgLy8gTmVlZGVkIGZvciBhZ2cgY2FsbGVyCisgIHZvaWQgcHJlcGFyZSh1bnNpZ25lZCkge30KKworICB2b2lkIENvbXBvc2l0ZVNwYW4odWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRGVzdEFscGhhLAorICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4pOworCisgIHZvaWQgQ29tcG9zaXRlU3BhbjFicHAodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworCisgIHZvaWQgQ29tcG9zaXRlU3BhbkdyYXkodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworCisgIHZvaWQgQ29tcG9zaXRlU3BhbkFSR0IodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworCisgIHZvaWQgQ29tcG9zaXRlU3BhblJHQih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworCisgIHZvaWQgQ29tcG9zaXRlU3BhbkNNWUsodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pOworCisgIGJvb2wgSW5pdChjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcERldmljZSwKKyAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwT3JpRGV2aWNlLAorICAgICAgICAgICAgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLAorICAgICAgICAgICAgdWludDMyX3QgY29sb3IsCisgICAgICAgICAgICBib29sIGJGdWxsQ292ZXIsCisgICAgICAgICAgICBib29sIGJSZ2JCeXRlT3JkZXIpOworCisgIHRlbXBsYXRlIDxjbGFzcyBTY2FubGluZT4KKyAgdm9pZCByZW5kZXIoY29uc3QgU2NhbmxpbmUmIHNsKTsKKworIHByaXZhdGU6CisgIHZvaWQgKENGWF9SZW5kZXJlcjo6KmNvbXBvc2l0ZV9zcGFuKSh1aW50OF90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90Kik7CisKKyAgdm9pZCBDb21wb3NpdGVTcGFuMWJwcEhlbHBlcih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbF9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0KTsKKworICBpbmxpbmUgaW50IEdldFNyY0FscGhhKGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwgaW50IGNvbCkgY29uc3QgeworICAgIHJldHVybiBjbGlwX3NjYW4gPyBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgOiBtX0FscGhhOworICB9CisKKyAgaW5saW5lIGludCBHZXRTb3VyY2VBbHBoYShjb25zdCB1aW50OF90KiBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sKSBjb25zdCB7CisgICAgcmV0dXJuIGNsaXBfc2NhbiA/IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NQorICAgICAgICAgICAgICAgICAgICAgOiBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OworICB9CisKKyAgaW5saW5lIGludCBHZXRDb2xTdGFydChpbnQgc3Bhbl9sZWZ0LCBpbnQgY2xpcF9sZWZ0KSBjb25zdCB7CisgICAgcmV0dXJuIHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7CisgIH0KKworICBpbmxpbmUgaW50IEdldENvbEVuZChpbnQgc3Bhbl9sZWZ0LCBpbnQgc3Bhbl9sZW4sIGludCBjbGlwX3JpZ2h0KSBjb25zdCB7CisgICAgcmV0dXJuIHNwYW5fbGVmdCArIHNwYW5fbGVuIDwgY2xpcF9yaWdodCA/IHNwYW5fbGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQ7CisgIH0KKworICBpbnQgbV9BbHBoYTsKKyAgaW50IG1fUmVkOworICBpbnQgbV9HcmVlbjsKKyAgaW50IG1fQmx1ZTsKKyAgaW50IG1fR3JheTsKKyAgdWludDMyX3QgbV9Db2xvcjsKKyAgYm9vbCBtX2JGdWxsQ292ZXI7CisgIGJvb2wgbV9iUmdiQnl0ZU9yZGVyOworICBGWF9SRUNUIG1fQ2xpcEJveDsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gbV9wT3JpRGV2aWNlOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBtX3BDbGlwTWFzazsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gbV9wRGV2aWNlOworICBVbm93bmVkUHRyPGNvbnN0IENGWF9DbGlwUmduPiBtX3BDbGlwUmduOworfTsKKwordm9pZCBDRlhfUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW4odWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3JpX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRGVzdEFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvdmVyX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOworICBpbnQgY29sX3N0YXJ0ID0gR2V0Q29sU3RhcnQoc3Bhbl9sZWZ0LCBjbGlwX2xlZnQpOworICBpbnQgY29sX2VuZCA9IEdldENvbEVuZChzcGFuX2xlZnQsIHNwYW5fbGVuLCBjbGlwX3JpZ2h0KTsKKyAgaWYgKEJwcCkgeworICAgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgKiBCcHA7CisgICAgb3JpX3NjYW4gKz0gY29sX3N0YXJ0ICogQnBwOwogICB9IGVsc2UgewotICAgIGFnZzo6Y29udl9zdHJva2U8YWdnOjpwYXRoX3N0b3JhZ2U+IHN0cm9rZShwYXRoX2RhdGEpOwotICAgIHN0cm9rZS5saW5lX2pvaW4oam9pbik7Ci0gICAgc3Ryb2tlLmxpbmVfY2FwKGNhcCk7Ci0gICAgc3Ryb2tlLm1pdGVyX2xpbWl0KHBHcmFwaFN0YXRlLT5tX01pdGVyTGltaXQpOwotICAgIHN0cm9rZS53aWR0aCh3aWR0aCk7Ci0gICAgcmFzdGVyaXplci5hZGRfcGF0aF90cmFuc2Zvcm1lZChzdHJva2UsIHBPYmplY3QyRGV2aWNlKTsKKyAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0IC8gODsKKyAgICBvcmlfc2NhbiArPSBjb2xfc3RhcnQgLyA4OworICB9CisgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKKyAgICBpZiAoQnBwID09IDQgJiYgYkRlc3RBbHBoYSkgeworICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgICBpbnQgc3JjX2FscGhhID0gR2V0U3JjQWxwaGEoY2xpcF9zY2FuLCBjb2wpOworICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgICAgb3JpX3NjYW5bM10gKyBzcmNfYWxwaGEgLSBvcmlfc2NhblszXSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgeworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX1JlZCwgYWxwaGFfcmF0aW8pOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgIG9yaV9zY2FuKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW50IHIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9SZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICBpbnQgZyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgaW50IGIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgb3JpX3NjYW4rKzsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgciwgY292ZXJfc2Nhbltjb2xdKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbltjb2xdKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYiwgY292ZXJfc2Nhbltjb2xdKTsKKyAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoQnBwID09IDMgfHwgQnBwID09IDQpIHsKKyAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgICAgaW50IHNyY19hbHBoYSA9IEdldFNyY0FscGhhKGNsaXBfc2NhbiwgY29sKTsKKyAgICAgICAgaW50IHIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9SZWQsIHNyY19hbHBoYSk7CisgICAgICAgIGludCBnID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7CisgICAgICAgIGludCBiID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYSk7CisgICAgICAgIG9yaV9zY2FuICs9IEJwcCAtIDI7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCByLCBjb3Zlcl9zY2FuW2NvbF0pOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGcsIGNvdmVyX3NjYW5bY29sXSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYiwgY292ZXJfc2Nhbltjb2xdKTsKKyAgICAgICAgZGVzdF9zY2FuICs9IEJwcCAtIDI7CisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBpZiAoQnBwID09IDQgJiYgYkRlc3RBbHBoYSkgeworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGEgPSBHZXRTcmNBbHBoYShjbGlwX3NjYW4sIGNvbCk7CisgICAgICBpbnQgc3JjX2FscGhhX2NvdmVyZWQgPSBzcmNfYWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gLyAyNTU7CisgICAgICBpZiAoc3JjX2FscGhhX2NvdmVyZWQgPT0gMCkgeworICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoY292ZXJfc2Nhbltjb2xdID09IDI1NSkgeworICAgICAgICBkZXN0X3NjYW5bM10gPSBzcmNfYWxwaGFfY292ZXJlZDsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOworICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOworICAgICAgICAqZGVzdF9zY2FuID0gbV9SZWQ7CisgICAgICAgIGRlc3Rfc2NhbiArPSAyOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChkZXN0X3NjYW5bM10gPT0gMCkgeworICAgICAgICBkZXN0X3NjYW5bM10gPSBzcmNfYWxwaGFfY292ZXJlZDsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOworICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOworICAgICAgICAqZGVzdF9zY2FuID0gbV9SZWQ7CisgICAgICAgIGRlc3Rfc2NhbiArPSAyOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHVpbnQ4X3QgY292ZXIgPSBjb3Zlcl9zY2FuW2NvbF07CisgICAgICBkZXN0X3NjYW5bM10gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bM10sIHNyY19hbHBoYSwgY292ZXIpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgY292ZXIpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgY292ZXIpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGNvdmVyKTsKKyAgICAgIGRlc3Rfc2NhbiArPSAyOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYgKEJwcCA9PSAzIHx8IEJwcCA9PSA0KSB7CisgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgaW50IHNyY19hbHBoYSA9IEdldFNyY0FscGhhKGNsaXBfc2NhbiwgY29sKTsKKyAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgc3JjX2FscGhhKTsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIHNyY19hbHBoYSk7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOworICAgICAgICBkZXN0X3NjYW4gKz0gQnBwIC0gMjsKKyAgICAgICAgb3JpX3NjYW4gKz0gQnBwIC0gMjsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnQgYiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0JsdWUsIHNyY19hbHBoYSk7CisgICAgICBpbnQgZyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyZWVuLCBzcmNfYWxwaGEpOworICAgICAgaW50IHIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOworICAgICAgb3JpX3NjYW4gKz0gQnBwIC0gMjsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBiLCBjb3Zlcl9zY2FuW2NvbF0pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbltjb2xdKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHIsIGNvdmVyX3NjYW5bY29sXSk7CisgICAgICBkZXN0X3NjYW4gKz0gQnBwIC0gMjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYgKEJwcCA9PSAxKSB7CisgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgaW50IHNyY19hbHBoYSA9IEdldFNyY0FscGhhKGNsaXBfc2NhbiwgY29sKTsKKyAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyYXksIHNyY19hbHBoYSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaW50IGdyYXkgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmF5LCBzcmNfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNvdmVyX3NjYW5bY29sXSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIENvbXBvc2l0ZVNwYW4xYnBwSGVscGVyKGRlc3Rfc2NhbiwgY29sX3N0YXJ0LCBjb2xfZW5kLCBjb3Zlcl9zY2FuLCBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5fbGVmdCk7Cit9CisKK3ZvaWQgQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuMWJwcCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICBBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7CisgIEFTU0VSVCghbV9wRGV2aWNlLT5Jc0NteWtJbWFnZSgpKTsKKyAgaW50IGNvbF9zdGFydCA9IEdldENvbFN0YXJ0KHNwYW5fbGVmdCwgY2xpcF9sZWZ0KTsKKyAgaW50IGNvbF9lbmQgPSBHZXRDb2xFbmQoc3Bhbl9sZWZ0LCBzcGFuX2xlbiwgY2xpcF9yaWdodCk7CisgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgLyA4OworICBDb21wb3NpdGVTcGFuMWJwcEhlbHBlcihkZXN0X3NjYW4sIGNvbF9zdGFydCwgY29sX2VuZCwgY292ZXJfc2NhbiwgY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuX2xlZnQpOworfQorCit2b2lkIENGWF9SZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkdyYXkodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW5fbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY292ZXJfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKKyAgQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOworICBpbnQgY29sX3N0YXJ0ID0gR2V0Q29sU3RhcnQoc3Bhbl9sZWZ0LCBjbGlwX2xlZnQpOworICBpbnQgY29sX2VuZCA9IEdldENvbEVuZChzcGFuX2xlZnQsIHNwYW5fbGVuLCBjbGlwX3JpZ2h0KTsKKyAgZGVzdF9zY2FuICs9IGNvbF9zdGFydDsKKyAgaWYgKGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGEgPSBtX2JGdWxsQ292ZXIgPyBHZXRTcmNBbHBoYShjbGlwX3NjYW4sIGNvbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHZXRTb3VyY2VBbHBoYShjb3Zlcl9zY2FuLCBjbGlwX3NjYW4sIGNvbCk7CisgICAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IG1fR3JheTsKKyAgICAgICAgICAqZGVzdF9leHRyYV9hbHBoYV9zY2FuID0gbV9BbHBoYTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBzcmNfYWxwaGEgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgICAqZGVzdF9leHRyYV9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JheSwgYWxwaGFfcmF0aW8pOworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBkZXN0X2V4dHJhX2FscGhhX3NjYW4rKzsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgIGludCBzcmNfYWxwaGEgPSBHZXRTb3VyY2VBbHBoYShjb3Zlcl9zY2FuLCBjbGlwX3NjYW4sIGNvbCk7CisgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpCisgICAgICAgICpkZXN0X3NjYW4gPSBtX0dyYXk7CisgICAgICBlbHNlCisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyYXksIHNyY19hbHBoYSk7CisgICAgfQorICAgIGRlc3Rfc2NhbisrOwogICB9CiB9CiAKLUNGWF9BZ2dEZXZpY2VEcml2ZXI6OkNGWF9BZ2dEZXZpY2VEcml2ZXIoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZ2JCeXRlT3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiR3JvdXBLbm9ja291dCkKK3ZvaWQgQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuQVJHQih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICBpbnQgY29sX3N0YXJ0ID0gR2V0Q29sU3RhcnQoc3Bhbl9sZWZ0LCBjbGlwX2xlZnQpOworICBpbnQgY29sX2VuZCA9IEdldENvbEVuZChzcGFuX2xlZnQsIHNwYW5fbGVuLCBjbGlwX3JpZ2h0KTsKKyAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAqIEJwcDsKKyAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgeworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGEgPSBtX2JGdWxsQ292ZXIgPyBHZXRTcmNBbHBoYShjbGlwX3NjYW4sIGNvbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHZXRTb3VyY2VBbHBoYShjb3Zlcl9zY2FuLCBjbGlwX3NjYW4sIGNvbCk7CisgICAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oZGVzdF9zY2FuKSkgPSBtX0NvbG9yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSArIHNyY19hbHBoYSAtIGRlc3Rfc2NhblszXSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOworICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgZGVzdF9zY2FuICs9IDI7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgIGludCBzcmNfYWxwaGEgPSBtX2JGdWxsQ292ZXIgPyBHZXRTcmNBbHBoYShjbGlwX3NjYW4sIGNvbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogR2V0U291cmNlQWxwaGEoY292ZXJfc2NhbiwgY2xpcF9zY2FuLCBjb2wpOworICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KGRlc3Rfc2NhbikpID0gbV9Db2xvcjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkZXN0X3NjYW5bM10gPT0gMCkgeworICAgICAgICAgIGRlc3Rfc2NhblszXSA9IHNyY19hbHBoYTsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gbV9SZWQ7CisgICAgICAgICAgZGVzdF9zY2FuICs9IDI7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICAgIGRlc3Rfc2NhblszXSArIHNyY19hbHBoYSAtIGRlc3Rfc2NhblszXSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgYWxwaGFfcmF0aW8pOworICAgICAgICBkZXN0X3NjYW4gKz0gMjsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorICAgIGRlc3Rfc2NhbiArPSBCcHA7CisgIH0KK30KKwordm9pZCBDRlhfUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW5SR0IodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7CisgIGludCBjb2xfc3RhcnQgPSBHZXRDb2xTdGFydChzcGFuX2xlZnQsIGNsaXBfbGVmdCk7CisgIGludCBjb2xfZW5kID0gR2V0Q29sRW5kKHNwYW5fbGVmdCwgc3Bhbl9sZW4sIGNsaXBfcmlnaHQpOworICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0ICogQnBwOworICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7CisgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgICAgaW50IHNyY19hbHBoYSA9IEdldFNvdXJjZUFscGhhKGNvdmVyX3NjYW4sIGNsaXBfc2NhbiwgY29sKTsKKyAgICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgICBpZiAoQnBwID09IDQpIHsKKyAgICAgICAgICAgICoodWludDMyX3QqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7CisgICAgICAgICAgfSBlbHNlIGlmIChCcHAgPT0gMykgeworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9SZWQ7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgc3JjX2FscGhhKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgc3JjX2FscGhhKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBzcmNfYWxwaGEpOworICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHAgLSAyOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICB9CisgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYgKEJwcCA9PSAzICYmIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGEgPSBtX2JGdWxsQ292ZXIgPyBHZXRTcmNBbHBoYShjbGlwX3NjYW4sIGNvbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHZXRTb3VyY2VBbHBoYShjb3Zlcl9zY2FuLCBjbGlwX3NjYW4sIGNvbCk7CisgICAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3RhdGljX2Nhc3Q8dWludDhfdD4obV9CbHVlKTsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzdGF0aWNfY2FzdDx1aW50OF90PihtX0dyZWVuKTsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzdGF0aWNfY2FzdDx1aW50OF90PihtX1JlZCk7CisgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gc3RhdGljX2Nhc3Q8dWludDhfdD4obV9BbHBoYSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0gKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICsgc3JjX2FscGhhIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogc3JjX2FscGhhIC8gMjU1OworICAgICAgICAqZGVzdF9leHRyYV9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBhbHBoYV9yYXRpbyk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGRlc3RfZXh0cmFfYWxwaGFfc2NhbisrOworICAgICAgZGVzdF9zY2FuICs9IEJwcDsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhID0gbV9iRnVsbENvdmVyID8gR2V0U3JjQWxwaGEoY2xpcF9zY2FuLCBjb2wpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdldFNvdXJjZUFscGhhKGNvdmVyX3NjYW4sIGNsaXBfc2NhbiwgY29sKTsKKyAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgICBpZiAoQnBwID09IDQpIHsKKyAgICAgICAgICAqKHVpbnQzMl90KilkZXN0X3NjYW4gPSBtX0NvbG9yOworICAgICAgICB9IGVsc2UgaWYgKEJwcCA9PSAzKSB7CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9SZWQ7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIHNyY19hbHBoYSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgc3JjX2FscGhhKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgc3JjX2FscGhhKTsKKyAgICAgICAgZGVzdF9zY2FuICs9IEJwcCAtIDI7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gQnBwOworICB9Cit9CisKK3ZvaWQgQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuQ01ZSyh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICBBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7CisgIGludCBjb2xfc3RhcnQgPSBHZXRDb2xTdGFydChzcGFuX2xlZnQsIGNsaXBfbGVmdCk7CisgIGludCBjb2xfZW5kID0gR2V0Q29sRW5kKHNwYW5fbGVmdCwgc3Bhbl9sZW4sIGNsaXBfcmlnaHQpOworICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0ICogNDsKKyAgaWYgKGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgeworICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGEgPSBtX2JGdWxsQ292ZXIgPyBHZXRTcmNBbHBoYShjbGlwX3NjYW4sIGNvbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHZXRTb3VyY2VBbHBoYShjb3Zlcl9zY2FuLCBjbGlwX3NjYW4sIGNvbCk7CisgICAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICAgICAgKihyZWludGVycHJldF9jYXN0PEZYX0NNWUsqPihkZXN0X3NjYW4pKSA9IG1fQ29sb3I7CisgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbiA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KG1fQWxwaGEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9ICgqZGVzdF9leHRyYV9hbHBoYV9zY2FuKSArIHNyY19hbHBoYSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogc3JjX2FscGhhIC8gMjU1OworICAgICAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7CisgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmVlbiwgYWxwaGFfcmF0aW8pOworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmF5LCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGRlc3RfZXh0cmFfYWxwaGFfc2NhbisrOworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYSA9IEdldFNvdXJjZUFscGhhKGNvdmVyX3NjYW4sIGNsaXBfc2NhbiwgY29sKTsKKyAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8RlhfQ01ZSyo+KGRlc3Rfc2NhbikpID0gbV9Db2xvcjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgc3JjX2FscGhhKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGEpOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyYXksIHNyY19hbHBoYSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICB9CisgICAgZGVzdF9zY2FuICs9IDQ7CisgIH0KK30KKworYm9vbCBDRlhfUmVuZGVyZXI6OkluaXQoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcE9yaURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRnVsbENvdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmdiQnl0ZU9yZGVyKSB7CisgIG1fcERldmljZSA9IHBEZXZpY2U7CisgIG1fcENsaXBSZ24gPSBwQ2xpcFJnbjsKKyAgY29tcG9zaXRlX3NwYW4gPSBudWxscHRyOworICBtX2JSZ2JCeXRlT3JkZXIgPSBiUmdiQnl0ZU9yZGVyOworICBtX3BPcmlEZXZpY2UgPSBwT3JpRGV2aWNlOworICBpZiAobV9wQ2xpcFJnbikgeworICAgIG1fQ2xpcEJveCA9IG1fcENsaXBSZ24tPkdldEJveCgpOworICB9IGVsc2UgeworICAgIG1fQ2xpcEJveC5sZWZ0ID0gbV9DbGlwQm94LnRvcCA9IDA7CisgICAgbV9DbGlwQm94LnJpZ2h0ID0gbV9wRGV2aWNlLT5HZXRXaWR0aCgpOworICAgIG1fQ2xpcEJveC5ib3R0b20gPSBtX3BEZXZpY2UtPkdldEhlaWdodCgpOworICB9CisgIG1fcENsaXBNYXNrID0gbnVsbHB0cjsKKyAgaWYgKG1fcENsaXBSZ24gJiYgbV9wQ2xpcFJnbi0+R2V0VHlwZSgpID09IENGWF9DbGlwUmduOjpNYXNrRikKKyAgICBtX3BDbGlwTWFzayA9IG1fcENsaXBSZ24tPkdldE1hc2soKTsKKyAgbV9iRnVsbENvdmVyID0gYkZ1bGxDb3ZlcjsKKyAgYm9vbCBiRGV2aWNlQ01ZSyA9IHBEZXZpY2UtPklzQ215a0ltYWdlKCk7CisgIG1fQWxwaGEgPSBGWEFSR0JfQShjb2xvcik7CisgIGlmIChtX3BEZXZpY2UtPkdldEJQUCgpID09IDgpIHsKKyAgICBBU1NFUlQoIW1fYlJnYkJ5dGVPcmRlcik7CisgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheTsKKyAgICBpZiAobV9wRGV2aWNlLT5Jc0FscGhhTWFzaygpKQorICAgICAgbV9HcmF5ID0gMjU1OworICAgIGVsc2UKKyAgICAgIG1fR3JheSA9IEZYUkdCMkdSQVkoRlhBUkdCX1IoY29sb3IpLCBGWEFSR0JfRyhjb2xvciksIEZYQVJHQl9CKGNvbG9yKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKGJEZXZpY2VDTVlLKSB7CisgICAgQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOworICAgIGNvbXBvc2l0ZV9zcGFuID0gJkNGWF9SZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkNNWUs7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbXBvc2l0ZV9zcGFuID0gKHBEZXZpY2UtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpCisgICAgICAgICAgICAgICAgICAgICAgID8gJkNGWF9SZW5kZXJlcjo6Q29tcG9zaXRlU3BhbkFSR0IKKyAgICAgICAgICAgICAgICAgICAgICAgOiAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCOworICBpZiAobV9iUmdiQnl0ZU9yZGVyKQorICAgIG1fQ29sb3IgPSBGWEFSR0JfVE9CR1JPUkRFUkRJQihjb2xvcik7CisgIGVsc2UKKyAgICBtX0NvbG9yID0gRlhBUkdCX1RPRElCKGNvbG9yKTsKKyAgc3RkOjp0aWUobV9BbHBoYSwgbV9SZWQsIG1fR3JlZW4sIG1fQmx1ZSkgPSBBcmdiRGVjb2RlKGNvbG9yKTsKKyAgaWYgKG1fcERldmljZS0+R2V0QlBQKCkgPT0gMSkKKyAgICBjb21wb3NpdGVfc3BhbiA9ICZDRlhfUmVuZGVyZXI6OkNvbXBvc2l0ZVNwYW4xYnBwOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFNjYW5saW5lPgordm9pZCBDRlhfUmVuZGVyZXI6OnJlbmRlcihjb25zdCBTY2FubGluZSYgc2wpIHsKKyAgaWYgKCFtX3BPcmlEZXZpY2UgJiYgIWNvbXBvc2l0ZV9zcGFuKQorICAgIHJldHVybjsKKworICBpbnQgeSA9IHNsLnkoKTsKKyAgaWYgKHkgPCBtX0NsaXBCb3gudG9wIHx8IHkgPj0gbV9DbGlwQm94LmJvdHRvbSkKKyAgICByZXR1cm47CisKKyAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wRGV2aWNlLT5HZXRCdWZmZXIoKSArIG1fcERldmljZS0+R2V0UGl0Y2goKSAqIHk7CisgIHVpbnQ4X3QqIGRlc3Rfc2Nhbl9leHRyYV9hbHBoYSA9IG51bGxwdHI7CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBBbHBoYU1hc2sgPSBtX3BEZXZpY2UtPm1fcEFscGhhTWFzazsKKyAgaWYgKHBBbHBoYU1hc2spIHsKKyAgICBkZXN0X3NjYW5fZXh0cmFfYWxwaGEgPQorICAgICAgICBwQWxwaGFNYXNrLT5HZXRCdWZmZXIoKSArIHBBbHBoYU1hc2stPkdldFBpdGNoKCkgKiB5OworICB9CisgIHVpbnQ4X3QqIG9yaV9zY2FuID0gbnVsbHB0cjsKKyAgaWYgKG1fcE9yaURldmljZSkKKyAgICBvcmlfc2NhbiA9IG1fcE9yaURldmljZS0+R2V0QnVmZmVyKCkgKyBtX3BPcmlEZXZpY2UtPkdldFBpdGNoKCkgKiB5OworICBpbnQgQnBwID0gbV9wRGV2aWNlLT5HZXRCUFAoKSAvIDg7CisgIGJvb2wgYkRlc3RBbHBoYSA9IG1fcERldmljZS0+SGFzQWxwaGEoKSB8fCBtX3BEZXZpY2UtPklzQWxwaGFNYXNrKCk7CisgIHVuc2lnbmVkIG51bV9zcGFucyA9IHNsLm51bV9zcGFucygpOworICB0eXBlbmFtZSBTY2FubGluZTo6Y29uc3RfaXRlcmF0b3Igc3BhbiA9IHNsLmJlZ2luKCk7CisgIHdoaWxlICgxKSB7CisgICAgaWYgKHNwYW4tPmxlbiA8PSAwKQorICAgICAgYnJlYWs7CisKKyAgICBpbnQgeCA9IHNwYW4tPng7CisgICAgdWludDhfdCogZGVzdF9wb3MgPSBudWxscHRyOworICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfcG9zID0gbnVsbHB0cjsKKyAgICB1aW50OF90KiBvcmlfcG9zID0gbnVsbHB0cjsKKyAgICBpZiAoQnBwKSB7CisgICAgICBvcmlfcG9zID0gb3JpX3NjYW4gPyBvcmlfc2NhbiArIHggKiBCcHAgOiBudWxscHRyOworICAgICAgZGVzdF9wb3MgPSBkZXN0X3NjYW4gKyB4ICogQnBwOworICAgICAgZGVzdF9leHRyYV9hbHBoYV9wb3MgPQorICAgICAgICAgIGRlc3Rfc2Nhbl9leHRyYV9hbHBoYSA/IGRlc3Rfc2Nhbl9leHRyYV9hbHBoYSArIHggOiBudWxscHRyOworICAgIH0gZWxzZSB7CisgICAgICBkZXN0X3BvcyA9IGRlc3Rfc2NhbiArIHggLyA4OworICAgICAgb3JpX3BvcyA9IG9yaV9zY2FuID8gb3JpX3NjYW4gKyB4IC8gOCA6IG51bGxwdHI7CisgICAgfQorICAgIHVpbnQ4X3QqIGNsaXBfcG9zID0gbnVsbHB0cjsKKyAgICBpZiAobV9wQ2xpcE1hc2spIHsKKyAgICAgIGNsaXBfcG9zID0gbV9wQ2xpcE1hc2stPkdldEJ1ZmZlcigpICsKKyAgICAgICAgICAgICAgICAgKHkgLSBtX0NsaXBCb3gudG9wKSAqIG1fcENsaXBNYXNrLT5HZXRQaXRjaCgpICsgeCAtCisgICAgICAgICAgICAgICAgIG1fQ2xpcEJveC5sZWZ0OworICAgIH0KKyAgICBpZiAob3JpX3BvcykgeworICAgICAgQ29tcG9zaXRlU3BhbihkZXN0X3Bvcywgb3JpX3BvcywgQnBwLCBiRGVzdEFscGhhLCB4LCBzcGFuLT5sZW4sCisgICAgICAgICAgICAgICAgICAgIHNwYW4tPmNvdmVycywgbV9DbGlwQm94LmxlZnQsIG1fQ2xpcEJveC5yaWdodCwgY2xpcF9wb3MpOworICAgIH0gZWxzZSB7CisgICAgICAodGhpcy0+KmNvbXBvc2l0ZV9zcGFuKShkZXN0X3BvcywgQnBwLCB4LCBzcGFuLT5sZW4sIHNwYW4tPmNvdmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQ2xpcEJveC5sZWZ0LCBtX0NsaXBCb3gucmlnaHQsIGNsaXBfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9leHRyYV9hbHBoYV9wb3MpOworICAgIH0KKyAgICBpZiAoLS1udW1fc3BhbnMgPT0gMCkKKyAgICAgIGJyZWFrOworCisgICAgKytzcGFuOworICB9Cit9CisKK3ZvaWQgQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuMWJwcEhlbHBlcih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbF9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb3Zlcl9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0KSB7CisgIGludCBpbmRleCA9IDA7CisgIGlmIChtX3BEZXZpY2UtPkdldFBhbGV0dGUoKSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICBpZiAoRlhBUkdCX1RPRElCKG1fcERldmljZS0+R2V0UGFsZXR0ZSgpW2ldKSA9PSBtX0NvbG9yKQorICAgICAgICBpbmRleCA9IGk7CisgICAgfQorICB9IGVsc2UgeworICAgIGluZGV4ID0gKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KG1fQ29sb3IpID09IDB4ZmYpID8gMSA6IDA7CisgIH0KKyAgdWludDhfdCogZGVzdF9zY2FuMSA9IGRlc3Rfc2NhbjsKKyAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgeworICAgIGludCBzcmNfYWxwaGEgPSBHZXRTb3VyY2VBbHBoYShjb3Zlcl9zY2FuLCBjbGlwX3NjYW4sIGNvbCk7CisgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgaWYgKCFpbmRleCkKKyAgICAgICAgKmRlc3Rfc2NhbjEgJj0gfigxIDw8ICg3IC0gKGNvbCArIHNwYW5fbGVmdCkgJSA4KSk7CisgICAgICBlbHNlCisgICAgICAgICpkZXN0X3NjYW4xIHw9IDEgPDwgKDcgLSAoY29sICsgc3Bhbl9sZWZ0KSAlIDgpOworICAgIH0KKyAgICBkZXN0X3NjYW4xID0gZGVzdF9zY2FuICsgKHNwYW5fbGVmdCAlIDggKyBjb2wgLSBjb2xfc3RhcnQgKyAxKSAvIDg7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBhZ2cgeworCit0ZW1wbGF0ZSA8Y2xhc3MgQmFzZVJlbmRlcmVyPgorY2xhc3MgcmVuZGVyZXJfc2NhbmxpbmVfYWFfb2Zmc2V0IHsKKyBwdWJsaWM6CisgIHR5cGVkZWYgQmFzZVJlbmRlcmVyIGJhc2VfcmVuX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV9yZW5fdHlwZTo6Y29sb3JfdHlwZSBjb2xvcl90eXBlOworICByZW5kZXJlcl9zY2FubGluZV9hYV9vZmZzZXQoYmFzZV9yZW5fdHlwZSYgcmVuLCB1bnNpZ25lZCBsZWZ0LCB1bnNpZ25lZCB0b3ApCisgICAgICA6IG1fcmVuKCZyZW4pLCBtX2xlZnQobGVmdCksIG1fdG9wKHRvcCkge30KKyAgdm9pZCBjb2xvcihjb25zdCBjb2xvcl90eXBlJiBjKSB7IG1fY29sb3IgPSBjOyB9CisgIGNvbnN0IGNvbG9yX3R5cGUmIGNvbG9yKCkgY29uc3QgeyByZXR1cm4gbV9jb2xvcjsgfQorICB2b2lkIHByZXBhcmUodW5zaWduZWQpIHt9CisgIHRlbXBsYXRlIDxjbGFzcyBTY2FubGluZT4KKyAgdm9pZCByZW5kZXIoY29uc3QgU2NhbmxpbmUmIHNsKSB7CisgICAgaW50IHkgPSBzbC55KCk7CisgICAgdW5zaWduZWQgbnVtX3NwYW5zID0gc2wubnVtX3NwYW5zKCk7CisgICAgdHlwZW5hbWUgU2NhbmxpbmU6OmNvbnN0X2l0ZXJhdG9yIHNwYW4gPSBzbC5iZWdpbigpOworICAgIHdoaWxlICgxKSB7CisgICAgICBpbnQgeCA9IHNwYW4tPng7CisgICAgICBpZiAoc3Bhbi0+bGVuID4gMCkgeworICAgICAgICBtX3Jlbi0+YmxlbmRfc29saWRfaHNwYW4oeCAtIG1fbGVmdCwgeSAtIG1fdG9wLCAodW5zaWduZWQpc3Bhbi0+bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb2xvciwgc3Bhbi0+Y292ZXJzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fcmVuLT5ibGVuZF9obGluZSh4IC0gbV9sZWZ0LCB5IC0gbV90b3AsICh1bnNpZ25lZCkoeCAtIHNwYW4tPmxlbiAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb2xvciwgKihzcGFuLT5jb3ZlcnMpKTsKKyAgICAgIH0KKyAgICAgIGlmICgtLW51bV9zcGFucyA9PSAwKQorICAgICAgICBicmVhazsKKworICAgICAgKytzcGFuOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgYmFzZV9yZW5fdHlwZSogbV9yZW47CisgIGNvbG9yX3R5cGUgbV9jb2xvcjsKKyAgdW5zaWduZWQgbV9sZWZ0LCBtX3RvcDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhZ2cKKwordm9pZCBDQWdnX1BhdGhEYXRhOjpCdWlsZFBhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSkgeworICBjb25zdCBzdGQ6OnZlY3RvcjxGWF9QQVRIUE9JTlQ+JiBwUG9pbnRzID0gcFBhdGhEYXRhLT5HZXRQb2ludHMoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwUG9pbnRzLnNpemUoKTsgaSsrKSB7CisgICAgQ0ZYX1BvaW50RiBwb3MgPSBwUG9pbnRzW2ldLm1fUG9pbnQ7CisgICAgaWYgKHBPYmplY3QyRGV2aWNlKQorICAgICAgcG9zID0gcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybShwb3MpOworCisgICAgcG9zID0gSGFyZENsaXAocG9zKTsKKyAgICBGWFBUX1RZUEUgcG9pbnRfdHlwZSA9IHBQb2ludHNbaV0ubV9UeXBlOworICAgIGlmIChwb2ludF90eXBlID09IEZYUFRfVFlQRTo6TW92ZVRvKSB7CisgICAgICBtX1BhdGhEYXRhLm1vdmVfdG8ocG9zLngsIHBvcy55KTsKKyAgICB9IGVsc2UgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9UWVBFOjpMaW5lVG8pIHsKKyAgICAgIGlmIChpID4gMCAmJiBwUG9pbnRzW2kgLSAxXS5Jc1R5cGVBbmRPcGVuKEZYUFRfVFlQRTo6TW92ZVRvKSAmJgorICAgICAgICAgIChpID09IHBQb2ludHMuc2l6ZSgpIC0gMSB8fAorICAgICAgICAgICBwUG9pbnRzW2kgKyAxXS5Jc1R5cGVBbmRPcGVuKEZYUFRfVFlQRTo6TW92ZVRvKSkgJiYKKyAgICAgICAgICBwUG9pbnRzW2ldLm1fUG9pbnQgPT0gcFBvaW50c1tpIC0gMV0ubV9Qb2ludCkgeworICAgICAgICBwb3MueCArPSAxOworICAgICAgfQorICAgICAgbV9QYXRoRGF0YS5saW5lX3RvKHBvcy54LCBwb3MueSk7CisgICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfVFlQRTo6QmV6aWVyVG8pIHsKKyAgICAgIGlmIChpID4gMCAmJiBpICsgMiA8IHBQb2ludHMuc2l6ZSgpKSB7CisgICAgICAgIENGWF9Qb2ludEYgcG9zMCA9IHBQb2ludHNbaSAtIDFdLm1fUG9pbnQ7CisgICAgICAgIENGWF9Qb2ludEYgcG9zMiA9IHBQb2ludHNbaSArIDFdLm1fUG9pbnQ7CisgICAgICAgIENGWF9Qb2ludEYgcG9zMyA9IHBQb2ludHNbaSArIDJdLm1fUG9pbnQ7CisgICAgICAgIGlmIChwT2JqZWN0MkRldmljZSkgeworICAgICAgICAgIHBvczAgPSBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHBvczApOworICAgICAgICAgIHBvczIgPSBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHBvczIpOworICAgICAgICAgIHBvczMgPSBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHBvczMpOworICAgICAgICB9CisgICAgICAgIHBvczAgPSBIYXJkQ2xpcChwb3MwKTsKKyAgICAgICAgcG9zMiA9IEhhcmRDbGlwKHBvczIpOworICAgICAgICBwb3MzID0gSGFyZENsaXAocG9zMyk7CisgICAgICAgIGFnZzo6Y3VydmU0IGN1cnZlKHBvczAueCwgcG9zMC55LCBwb3MueCwgcG9zLnksIHBvczIueCwgcG9zMi55LCBwb3MzLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBvczMueSk7CisgICAgICAgIGkgKz0gMjsKKyAgICAgICAgbV9QYXRoRGF0YS5hZGRfcGF0aF9jdXJ2ZShjdXJ2ZSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChwUG9pbnRzW2ldLm1fQ2xvc2VGaWd1cmUpCisgICAgICBtX1BhdGhEYXRhLmVuZF9wb2x5KCk7CisgIH0KK30KKworQ0ZYX0FnZ0RldmljZURyaXZlcjo6Q0ZYX0FnZ0RldmljZURyaXZlcigKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcCwKKyAgICBib29sIGJSZ2JCeXRlT3JkZXIsCisgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBPcmlEZXZpY2UsCisgICAgYm9vbCBiR3JvdXBLbm9ja291dCkKICAgICA6IG1fcEJpdG1hcChwQml0bWFwKSwKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXwogICAgICAgbV9wUGxhdGZvcm1HcmFwaGljcyhudWxscHRyKSwKICNlbmRpZgogICAgICAgbV9GaWxsRmxhZ3MoMCksCkBAIC00NTEsNyArMTEyNyw3IEBACiAgIHJldHVybiBtX3BCaXRtYXAtPkdldEJ1ZmZlcigpOwogfQogCi0jaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyNpZiBfRlhfUExBVEZPUk1fICE9IF9GWF9QTEFURk9STV9BUFBMRV8KIHZvaWQgQ0ZYX0FnZ0RldmljZURyaXZlcjo6SW5pdFBsYXRmb3JtKCkge30KIAogdm9pZCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpEZXN0cm95UGxhdGZvcm0oKSB7fQpAQCAtNDYwLDExICsxMTM2LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yKSB7CiAgIHJldHVybiBmYWxzZTsKIH0KLSNlbmRpZiAgLy8gX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KKyNlbmRpZiAgLy8gX0ZYX1BMQVRGT1JNXyAhPSBfRlhfUExBVEZPUk1fQVBQTEVfCiAKIGludCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpHZXREZXZpY2VDYXBzKGludCBjYXBzX2lkKSBjb25zdCB7CiAgIHN3aXRjaCAoY2Fwc19pZCkgewpAQCAtNDg1LDE5ICsxMTYxLDE4IEBACiAgICAgICBpZiAobV9wQml0bWFwLT5IYXNBbHBoYSgpKSB7CiAgICAgICAgIGZsYWdzIHw9IEZYUkNfQUxQSEFfT1VUUFVUOwogICAgICAgfSBlbHNlIGlmIChtX3BCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgaWYgKG1fcEJpdG1hcC0+R2V0QlBQKCkgPT0gMSkgeworICAgICAgICBpZiAobV9wQml0bWFwLT5HZXRCUFAoKSA9PSAxKQogICAgICAgICAgIGZsYWdzIHw9IEZYUkNfQklUTUFTS19PVVRQVVQ7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGVsc2UKICAgICAgICAgICBmbGFncyB8PSBGWFJDX0JZVEVNQVNLX09VVFBVVDsKLSAgICAgICAgfQogICAgICAgfQotICAgICAgaWYgKG1fcEJpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgeworICAgICAgaWYgKG1fcEJpdG1hcC0+SXNDbXlrSW1hZ2UoKSkKICAgICAgICAgZmxhZ3MgfD0gRlhSQ19DTVlLX09VVFBVVDsKLSAgICAgIH0KICAgICAgIHJldHVybiBmbGFnczsKICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOwogICB9Ci0gIHJldHVybiAwOwogfQogCiB2b2lkIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlNhdmVTdGF0ZSgpIHsKQEAgLTUyNiw4ICsxMjAxLDcgQEAKICAgRlhfUkVDVCBwYXRoX3JlY3QocmFzdGVyaXplci5taW5feCgpLCByYXN0ZXJpemVyLm1pbl95KCksCiAgICAgICAgICAgICAgICAgICAgIHJhc3Rlcml6ZXIubWF4X3goKSArIDEsIHJhc3Rlcml6ZXIubWF4X3koKSArIDEpOwogICBwYXRoX3JlY3QuSW50ZXJzZWN0KG1fcENsaXBSZ24tPkdldEJveCgpKTsKLSAgQ0ZYX0RJQml0bWFwUmVmIG1hc2s7Ci0gIENGWF9ESUJpdG1hcCogcFRoaXNMYXllciA9IG1hc2suRW1wbGFjZSgpOworICBhdXRvIHBUaGlzTGF5ZXIgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOwogICBwVGhpc0xheWVyLT5DcmVhdGUocGF0aF9yZWN0LldpZHRoKCksIHBhdGhfcmVjdC5IZWlnaHQoKSwgRlhESUJfOGJwcE1hc2spOwogICBwVGhpc0xheWVyLT5DbGVhcigwKTsKICAgYWdnOjpyZW5kZXJpbmdfYnVmZmVyIHJhd19idWYocFRoaXNMYXllci0+R2V0QnVmZmVyKCksIHBUaGlzTGF5ZXItPkdldFdpZHRoKCksCkBAIC01NDEsNyArMTIxNSw3IEBACiAgIGFnZzo6c2NhbmxpbmVfdTggc2NhbmxpbmU7CiAgIGFnZzo6cmVuZGVyX3NjYW5saW5lcyhyYXN0ZXJpemVyLCBzY2FubGluZSwgZmluYWxfcmVuZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgKG1fRmlsbEZsYWdzICYgRlhGSUxMX05PUEFUSFNNT09USCkgIT0gMCk7Ci0gIG1fcENsaXBSZ24tPkludGVyc2VjdE1hc2tGKHBhdGhfcmVjdC5sZWZ0LCBwYXRoX3JlY3QudG9wLCBtYXNrKTsKKyAgbV9wQ2xpcFJnbi0+SW50ZXJzZWN0TWFza0YocGF0aF9yZWN0LmxlZnQsIHBhdGhfcmVjdC50b3AsIHBUaGlzTGF5ZXIpOwogfQogCiBib29sIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCkBAIC01NTYsOSArMTIzMCw5IEBACiAgIGlmIChzaXplID09IDUgfHwgc2l6ZSA9PSA0KSB7CiAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0ZjsKICAgICBpZiAocFBhdGhEYXRhLT5Jc1JlY3QocE9iamVjdDJEZXZpY2UsICZyZWN0ZikpIHsKLSAgICAgIHJlY3RmLkludGVyc2VjdCgKLSAgICAgICAgICBDRlhfRmxvYXRSZWN0KDAsIDAsIChGWF9GTE9BVClHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpLAotICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKUdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKSk7CisgICAgICByZWN0Zi5JbnRlcnNlY3QoQ0ZYX0Zsb2F0UmVjdCgKKyAgICAgICAgICAwLCAwLCBzdGF0aWNfY2FzdDxmbG9hdD4oR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSksCisgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKSkpOwogICAgICAgRlhfUkVDVCByZWN0ID0gcmVjdGYuR2V0T3V0ZXJSZWN0KCk7CiAgICAgICBtX3BDbGlwUmduLT5JbnRlcnNlY3RSZWN0KHJlY3QpOwogICAgICAgcmV0dXJuIHRydWU7CkBAIC01NjgsOCArMTI0Miw5IEBACiAgIHBhdGhfZGF0YS5CdWlsZFBhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSk7CiAgIHBhdGhfZGF0YS5tX1BhdGhEYXRhLmVuZF9wb2x5KCk7CiAgIGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSByYXN0ZXJpemVyOwotICByYXN0ZXJpemVyLmNsaXBfYm94KDAuMGYsIDAuMGYsIChGWF9GTE9BVCkoR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSksCi0gICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSkpOworICByYXN0ZXJpemVyLmNsaXBfYm94KDAuMGYsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkpLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSkpOwogICByYXN0ZXJpemVyLmFkZF9wYXRoKHBhdGhfZGF0YS5tX1BhdGhEYXRhKTsKICAgcmFzdGVyaXplci5maWxsaW5nX3J1bGUoKGZpbGxfbW9kZSAmIDMpID09IEZYRklMTF9XSU5ESU5HCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFnZzo6ZmlsbF9ub25femVybwpAQCAtNTg5LDg0MyArMTI2NCwxNiBAQAogICBDQWdnX1BhdGhEYXRhIHBhdGhfZGF0YTsKICAgcGF0aF9kYXRhLkJ1aWxkUGF0aChwUGF0aERhdGEsIG51bGxwdHIpOwogICBhZ2c6OnJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEgcmFzdGVyaXplcjsKLSAgcmFzdGVyaXplci5jbGlwX2JveCgwLjBmLCAwLjBmLCAoRlhfRkxPQVQpKEdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkpLAotICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCkoR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKLSAgUmFzdGVyaXplU3Ryb2tlKHJhc3Rlcml6ZXIsIHBhdGhfZGF0YS5tX1BhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgIHBHcmFwaFN0YXRlKTsKKyAgcmFzdGVyaXplci5jbGlwX2JveCgwLjBmLCAwLjBmLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKKyAgUmFzdGVyaXplU3Ryb2tlKCZyYXN0ZXJpemVyLCAmcGF0aF9kYXRhLm1fUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgcEdyYXBoU3RhdGUsIDEuMGYsIGZhbHNlLCBmYWxzZSk7CiAgIHJhc3Rlcml6ZXIuZmlsbGluZ19ydWxlKGFnZzo6ZmlsbF9ub25femVybyk7CiAgIFNldENsaXBNYXNrKHJhc3Rlcml6ZXIpOwogICByZXR1cm4gdHJ1ZTsKIH0KIAotY2xhc3MgQ0ZYX1JlbmRlcmVyIHsKLSBwcml2YXRlOgotICBpbnQgbV9BbHBoYSwgbV9SZWQsIG1fR3JlZW4sIG1fQmx1ZSwgbV9HcmF5OwotICB1aW50MzJfdCBtX0NvbG9yOwotICBib29sIG1fYkZ1bGxDb3ZlcjsKLSAgYm9vbCBtX2JSZ2JCeXRlT3JkZXI7Ci0gIENGWF9ESUJpdG1hcCogbV9wT3JpRGV2aWNlOwotICBGWF9SRUNUIG1fQ2xpcEJveDsKLSAgY29uc3QgQ0ZYX0RJQml0bWFwKiBtX3BDbGlwTWFzazsKLSAgQ0ZYX0RJQml0bWFwKiBtX3BEZXZpY2U7Ci0gIGNvbnN0IENGWF9DbGlwUmduKiBtX3BDbGlwUmduOwotICB2b2lkIChDRlhfUmVuZGVyZXI6Oipjb21wb3NpdGVfc3BhbikodWludDhfdCosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCopOwotCi0gcHVibGljOgotICB2b2lkIHByZXBhcmUodW5zaWduZWQpIHt9Ci0KLSAgdm9pZCBDb21wb3NpdGVTcGFuKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkRlc3RBbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuKSB7Ci0gICAgQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOwotICAgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOwotICAgIGludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQKLSAgICAgICAgICAgICAgICAgICAgICA/IHNwYW5fbGVuCi0gICAgICAgICAgICAgICAgICAgICAgOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7Ci0gICAgaWYgKEJwcCkgewotICAgICAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAqIEJwcDsKLSAgICAgIG9yaV9zY2FuICs9IGNvbF9zdGFydCAqIEJwcDsKLSAgICB9IGVsc2UgewotICAgICAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAvIDg7Ci0gICAgICBvcmlfc2NhbiArPSBjb2xfc3RhcnQgLyA4OwotICAgIH0KLSAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7Ci0gICAgICBpZiAoQnBwID09IDQgJiYgYkRlc3RBbHBoYSkgewotICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7Ci0gICAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7Ci0gICAgICAgICAgfQotICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9Ci0gICAgICAgICAgICAgIG9yaV9zY2FuWzNdICsgc3JjX2FscGhhIC0gb3JpX3NjYW5bM10gKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX1JlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgICAgb3JpX3NjYW4rKzsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IHIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9SZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGludCBnID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGludCBiID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgb3JpX3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCByLCBjb3Zlcl9zY2FuW2NvbF0pOwotICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbltjb2xdKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGIsIGNvdmVyX3NjYW5bY29sXSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKEJwcCA9PSAzIHx8IEJwcCA9PSA0KSB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKLSAgICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaW50IHIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9SZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgaW50IGcgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgc3JjX2FscGhhKTsKLSAgICAgICAgICBpbnQgYiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbiwgbV9CbHVlLCBzcmNfYWxwaGEpOwotICAgICAgICAgIG9yaV9zY2FuICs9IEJwcCAtIDI7Ci0gICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHIsIGNvdmVyX3NjYW5bY29sXSk7Ci0gICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGcsIGNvdmVyX3NjYW5bY29sXSk7Ci0gICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGIsIGNvdmVyX3NjYW5bY29sXSk7Ci0gICAgICAgICAgZGVzdF9zY2FuICs9IEJwcCAtIDI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKEJwcCA9PSA0ICYmIGJEZXN0QWxwaGEpIHsKLSAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOwotICAgICAgICB9Ci0gICAgICAgIGludCBzcmNfYWxwaGFfY292ZXJlZCA9IHNyY19hbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgaWYgKHNyY19hbHBoYV9jb3ZlcmVkID09IDApIHsKLSAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY292ZXJfc2Nhbltjb2xdID09IDI1NSkgewotICAgICAgICAgIGRlc3Rfc2NhblszXSA9IHNyY19hbHBoYV9jb3ZlcmVkOwotICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKLSAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOwotICAgICAgICAgICpkZXN0X3NjYW4gPSBtX1JlZDsKLSAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoZGVzdF9zY2FuWzNdID09IDApIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IHNyY19hbHBoYV9jb3ZlcmVkOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBtX1JlZDsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIHVpbnQ4X3QgY292ZXIgPSBjb3Zlcl9zY2FuW2NvbF07Ci0gICAgICAgICAgZGVzdF9zY2FuWzNdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzNdLCBzcmNfYWxwaGEsIGNvdmVyKTsKLSAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBjb3Zlcik7Ci0gICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGNvdmVyKTsKLSAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGNvdmVyKTsKLSAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoQnBwID09IDMgfHwgQnBwID09IDQpIHsKLSAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKLSAgICAgICAgICAqZGVzdF9zY2FuKysgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBzcmNfYWxwaGEpOwotICAgICAgICAgICpkZXN0X3NjYW4rKyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyZWVuLCBzcmNfYWxwaGEpOwotICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOwotICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHAgLSAyOwotICAgICAgICAgIG9yaV9zY2FuICs9IEJwcCAtIDI7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBzcmNfYWxwaGEpOwotICAgICAgICBpbnQgZyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyZWVuLCBzcmNfYWxwaGEpOwotICAgICAgICBpbnQgciA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgIG9yaV9zY2FuICs9IEJwcCAtIDI7Ci0gICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBiLCBjb3Zlcl9zY2FuW2NvbF0pOwotICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGcsIGNvdmVyX3NjYW5bY29sXSk7Ci0gICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgciwgY292ZXJfc2Nhbltjb2xdKTsKLSAgICAgICAgZGVzdF9zY2FuICs9IEJwcCAtIDI7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoQnBwID09IDEpIHsKLSAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKLSAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JheSwgc3JjX2FscGhhKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpbnQgZ3JheSA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyYXksIHNyY19hbHBoYSk7Ci0gICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNvdmVyX3NjYW5bY29sXSk7Ci0gICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgIGlmIChtX3BEZXZpY2UtPkdldFBhbGV0dGUoKSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAgIGlmIChGWEFSR0JfVE9ESUIobV9wRGV2aWNlLT5HZXRQYWxldHRlKClbaV0pID09IG1fQ29sb3IpIHsKLSAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGV4ID0gKCh1aW50OF90KW1fQ29sb3IgPT0gMHhmZikgPyAxIDogMDsKLSAgICAgIH0KLSAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbjEgPSBkZXN0X3NjYW47Ci0gICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7Ci0gICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgaWYgKCFpbmRleCkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbjEgJj0gfigxIDw8ICg3IC0gKGNvbCArIHNwYW5fbGVmdCkgJSA4KSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4xIHw9IDEgPDwgKDcgLSAoY29sICsgc3Bhbl9sZWZ0KSAlIDgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4xID0gZGVzdF9zY2FuICsgKHNwYW5fbGVmdCAlIDggKyBjb2wgLSBjb2xfc3RhcnQgKyAxKSAvIDg7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBDb21wb3NpdGVTcGFuMWJwcCh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgewotICAgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKLSAgICBBU1NFUlQoIW1fcERldmljZS0+SXNDbXlrSW1hZ2UoKSk7Ci0gICAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7Ci0gICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodAotICAgICAgICAgICAgICAgICAgICAgID8gc3Bhbl9sZW4KLSAgICAgICAgICAgICAgICAgICAgICA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKLSAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0IC8gODsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIGlmIChtX3BEZXZpY2UtPkdldFBhbGV0dGUoKSkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgaWYgKEZYQVJHQl9UT0RJQihtX3BEZXZpY2UtPkdldFBhbGV0dGUoKVtpXSkgPT0gbV9Db2xvcikgewotICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRleCA9ICgodWludDhfdCltX0NvbG9yID09IDB4ZmYpID8gMSA6IDA7Ci0gICAgfQotICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbjEgPSBkZXN0X3NjYW47Ci0gICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgewotICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgIH0KLSAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgaWYgKCFpbmRleCkgewotICAgICAgICAgICpkZXN0X3NjYW4xICY9IH4oMSA8PCAoNyAtIChjb2wgKyBzcGFuX2xlZnQpICUgOCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICpkZXN0X3NjYW4xIHw9IDEgPDwgKDcgLSAoY29sICsgc3Bhbl9sZWZ0KSAlIDgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBkZXN0X3NjYW4xID0gZGVzdF9zY2FuICsgKHNwYW5fbGVmdCAlIDggKyBjb2wgLSBjb2xfc3RhcnQgKyAxKSAvIDg7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBDb21wb3NpdGVTcGFuR3JheSh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgewotICAgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKLSAgICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLSAgICBpbnQgY29sX2VuZCA9IChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgPyBzcGFuX2xlbgotICAgICAgICAgICAgICAgICAgICAgIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotICAgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQ7Ci0gICAgaWYgKGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgewotICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgewotICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICBpZiAobV9iRnVsbENvdmVyKSB7Ci0gICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IG1fR3JheTsKLSAgICAgICAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4gPSBtX0FscGhhOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBzcmNfYWxwaGEgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmF5LCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZXN0X2V4dHJhX2FscGhhX3NjYW4rKzsKLSAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IG1fR3JheTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JheSwgc3JjX2FscGhhKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBDb21wb3NpdGVTcGFuQVJHQih1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgewotICAgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOwotICAgIGludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQKLSAgICAgICAgICAgICAgICAgICAgICA/IHNwYW5fbGVuCi0gICAgICAgICAgICAgICAgICAgICAgOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7Ci0gICAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAqIEJwcDsKLSAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7Ci0gICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7Ci0gICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKLSAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAqKHVpbnQzMl90KilkZXN0X3NjYW4gPSBtX0NvbG9yOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQotICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSArIHNyY19hbHBoYSAtIGRlc3Rfc2NhblszXSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7Ci0gICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgewotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICoodWludDMyX3QqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKGRlc3Rfc2NhblszXSA9PSAwKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IG1fUmVkOwotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KLSAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdICsgc3JjX2FscGhhIC0gZGVzdF9zY2FuWzNdICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZGVzdF9zY2FuICs9IEJwcDsKLSAgICB9Ci0gIH0KLQotICB2b2lkIENvbXBvc2l0ZVNwYW5SR0IodWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7Ci0gICAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7Ci0gICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodAotICAgICAgICAgICAgICAgICAgICAgID8gc3Bhbl9sZW4KLSAgICAgICAgICAgICAgICAgICAgICA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKLSAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0ICogQnBwOwotICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKLSAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgaWYgKEJwcCA9PSA0KSB7Ci0gICAgICAgICAgICAgICoodWludDMyX3QqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEJwcCA9PSAzKSB7Ci0gICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fUmVkOwotICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOwotICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcCAtIDI7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKEJwcCA9PSAzICYmIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgewotICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgewotICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICBpZiAobV9iRnVsbENvdmVyKSB7Ci0gICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9CbHVlOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9HcmVlbjsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KW1fUmVkOwotICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gKHVpbnQ4X3QpbV9BbHBoYTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBzcmNfYWxwaGEgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9leHRyYV9hbHBoYV9zY2FuKys7Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgewotICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgIGlmIChCcHAgPT0gNCkgewotICAgICAgICAgICAgICAqKHVpbnQzMl90KilkZXN0X3NjYW4gPSBtX0NvbG9yOwotICAgICAgICAgICAgfSBlbHNlIGlmIChCcHAgPT0gMykgewotICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7Ci0gICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47Ci0gICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fUmVkOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHAgLSAyOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBDb21wb3NpdGVTcGFuQ01ZSyh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgewotICAgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKLSAgICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLSAgICBpbnQgY29sX2VuZCA9IChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgPyBzcGFuX2xlbgotICAgICAgICAgICAgICAgICAgICAgIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotICAgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgKiA0OwotICAgIGlmIChkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKLSAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgewotICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICooRlhfQ01ZSyopZGVzdF9zY2FuID0gbV9Db2xvcjsKLSAgICAgICAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4gPSAodWludDhfdCltX0FscGhhOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBzcmNfYWxwaGEgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmF5LCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZXN0X2V4dHJhX2FscGhhX3NjYW4rKzsKLSAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgKihGWF9DTVlLKilkZXN0X3NjYW4gPSBtX0NvbG9yOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmF5LCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIFNjYW5saW5lPgotICB2b2lkIHJlbmRlcihjb25zdCBTY2FubGluZSYgc2wpIHsKLSAgICBpZiAoIW1fcE9yaURldmljZSAmJiAhY29tcG9zaXRlX3NwYW4pIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IHkgPSBzbC55KCk7Ci0gICAgaWYgKHkgPCBtX0NsaXBCb3gudG9wIHx8IHkgPj0gbV9DbGlwQm94LmJvdHRvbSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BEZXZpY2UtPkdldEJ1ZmZlcigpICsgbV9wRGV2aWNlLT5HZXRQaXRjaCgpICogeTsKLSAgICB1aW50OF90KiBkZXN0X3NjYW5fZXh0cmFfYWxwaGEgPSBudWxscHRyOwotICAgIENGWF9ESUJpdG1hcCogcEFscGhhTWFzayA9IG1fcERldmljZS0+bV9wQWxwaGFNYXNrOwotICAgIGlmIChwQWxwaGFNYXNrKSB7Ci0gICAgICBkZXN0X3NjYW5fZXh0cmFfYWxwaGEgPQotICAgICAgICAgIHBBbHBoYU1hc2stPkdldEJ1ZmZlcigpICsgcEFscGhhTWFzay0+R2V0UGl0Y2goKSAqIHk7Ci0gICAgfQotICAgIHVpbnQ4X3QqIG9yaV9zY2FuID0gbnVsbHB0cjsKLSAgICBpZiAobV9wT3JpRGV2aWNlKSB7Ci0gICAgICBvcmlfc2NhbiA9IG1fcE9yaURldmljZS0+R2V0QnVmZmVyKCkgKyBtX3BPcmlEZXZpY2UtPkdldFBpdGNoKCkgKiB5OwotICAgIH0KLSAgICBpbnQgQnBwID0gbV9wRGV2aWNlLT5HZXRCUFAoKSAvIDg7Ci0gICAgYm9vbCBiRGVzdEFscGhhID0gbV9wRGV2aWNlLT5IYXNBbHBoYSgpIHx8IG1fcERldmljZS0+SXNBbHBoYU1hc2soKTsKLSAgICB1bnNpZ25lZCBudW1fc3BhbnMgPSBzbC5udW1fc3BhbnMoKTsKLSAgICB0eXBlbmFtZSBTY2FubGluZTo6Y29uc3RfaXRlcmF0b3Igc3BhbiA9IHNsLmJlZ2luKCk7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgIGludCB4ID0gc3Bhbi0+eDsKLSAgICAgIEFTU0VSVChzcGFuLT5sZW4gPiAwKTsKLSAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gbnVsbHB0cjsKLSAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfcG9zID0gbnVsbHB0cjsKLSAgICAgIHVpbnQ4X3QqIG9yaV9wb3MgPSBudWxscHRyOwotICAgICAgaWYgKEJwcCkgewotICAgICAgICBvcmlfcG9zID0gb3JpX3NjYW4gPyBvcmlfc2NhbiArIHggKiBCcHAgOiBudWxscHRyOwotICAgICAgICBkZXN0X3BvcyA9IGRlc3Rfc2NhbiArIHggKiBCcHA7Ci0gICAgICAgIGRlc3RfZXh0cmFfYWxwaGFfcG9zID0KLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9leHRyYV9hbHBoYSA/IGRlc3Rfc2Nhbl9leHRyYV9hbHBoYSArIHggOiBudWxscHRyOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZGVzdF9wb3MgPSBkZXN0X3NjYW4gKyB4IC8gODsKLSAgICAgICAgb3JpX3BvcyA9IG9yaV9zY2FuID8gb3JpX3NjYW4gKyB4IC8gOCA6IG51bGxwdHI7Ci0gICAgICB9Ci0gICAgICB1aW50OF90KiBjbGlwX3BvcyA9IG51bGxwdHI7Ci0gICAgICBpZiAobV9wQ2xpcE1hc2spIHsKLSAgICAgICAgY2xpcF9wb3MgPSBtX3BDbGlwTWFzay0+R2V0QnVmZmVyKCkgKwotICAgICAgICAgICAgICAgICAgICh5IC0gbV9DbGlwQm94LnRvcCkgKiBtX3BDbGlwTWFzay0+R2V0UGl0Y2goKSArIHggLQotICAgICAgICAgICAgICAgICAgIG1fQ2xpcEJveC5sZWZ0OwotICAgICAgfQotICAgICAgaWYgKG9yaV9wb3MpIHsKLSAgICAgICAgQ29tcG9zaXRlU3BhbihkZXN0X3Bvcywgb3JpX3BvcywgQnBwLCBiRGVzdEFscGhhLCB4LCBzcGFuLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgc3Bhbi0+Y292ZXJzLCBtX0NsaXBCb3gubGVmdCwgbV9DbGlwQm94LnJpZ2h0LCBjbGlwX3Bvcyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAodGhpcy0+KmNvbXBvc2l0ZV9zcGFuKShkZXN0X3BvcywgQnBwLCB4LCBzcGFuLT5sZW4sIHNwYW4tPmNvdmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9DbGlwQm94LmxlZnQsIG1fQ2xpcEJveC5yaWdodCwgY2xpcF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfZXh0cmFfYWxwaGFfcG9zKTsKLSAgICAgIH0KLSAgICAgIGlmICgtLW51bV9zcGFucyA9PSAwKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgKytzcGFuOwotICAgIH0KLSAgfQotCi0gIGJvb2wgSW5pdChDRlhfRElCaXRtYXAqIHBEZXZpY2UsCi0gICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsCi0gICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCi0gICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKLSAgICAgICAgICAgIGJvb2wgYkZ1bGxDb3ZlciwKLSAgICAgICAgICAgIGJvb2wgYlJnYkJ5dGVPcmRlciwKLSAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKLSAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBudWxscHRyKSB7Ci0gICAgbV9wRGV2aWNlID0gcERldmljZTsKLSAgICBtX3BDbGlwUmduID0gcENsaXBSZ247Ci0gICAgY29tcG9zaXRlX3NwYW4gPSBudWxscHRyOwotICAgIG1fYlJnYkJ5dGVPcmRlciA9IGJSZ2JCeXRlT3JkZXI7Ci0gICAgbV9wT3JpRGV2aWNlID0gcE9yaURldmljZTsKLSAgICBpZiAobV9wQ2xpcFJnbikgewotICAgICAgbV9DbGlwQm94ID0gbV9wQ2xpcFJnbi0+R2V0Qm94KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1fQ2xpcEJveC5sZWZ0ID0gbV9DbGlwQm94LnRvcCA9IDA7Ci0gICAgICBtX0NsaXBCb3gucmlnaHQgPSBtX3BEZXZpY2UtPkdldFdpZHRoKCk7Ci0gICAgICBtX0NsaXBCb3guYm90dG9tID0gbV9wRGV2aWNlLT5HZXRIZWlnaHQoKTsKLSAgICB9Ci0gICAgbV9wQ2xpcE1hc2sgPSBudWxscHRyOwotICAgIGlmIChtX3BDbGlwUmduICYmIG1fcENsaXBSZ24tPkdldFR5cGUoKSA9PSBDRlhfQ2xpcFJnbjo6TWFza0YpIHsKLSAgICAgIG1fcENsaXBNYXNrID0gbV9wQ2xpcFJnbi0+R2V0TWFzaygpLkdldE9iamVjdCgpOwotICAgIH0KLSAgICBtX2JGdWxsQ292ZXIgPSBiRnVsbENvdmVyOwotICAgIGJvb2wgYk9iamVjdENNWUsgPSAhIUZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZyk7Ci0gICAgYm9vbCBiRGV2aWNlQ01ZSyA9IHBEZXZpY2UtPklzQ215a0ltYWdlKCk7Ci0gICAgbV9BbHBoYSA9IGJPYmplY3RDTVlLID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShjb2xvcik7Ci0gICAgQ0NvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IG51bGxwdHI7Ci0gICAgaWYgKCFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpIHx8Ci0gICAgICAgICFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKSkgewotICAgICAgcEljY1RyYW5zZm9ybSA9IG51bGxwdHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICB9Ci0gICAgaWYgKG1fcERldmljZS0+R2V0QlBQKCkgPT0gOCkgewotICAgICAgQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOwotICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheTsKLSAgICAgIGlmIChtX3BEZXZpY2UtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgbV9HcmF5ID0gMjU1OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICB1aW50OF90IGdyYXk7Ci0gICAgICAgICAgY29sb3IgPSBiT2JqZWN0Q01ZSyA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOwotICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KikmY29sb3IsIDEpOwotICAgICAgICAgIG1fR3JheSA9IGdyYXk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKGJPYmplY3RDTVlLKSB7Ci0gICAgICAgICAgICB1aW50OF90IHIsIGcsIGI7Ci0gICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0TVZhbHVlKGNvbG9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoY29sb3IpLCBGWFNZU19HZXRLVmFsdWUoY29sb3IpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIpOwotICAgICAgICAgICAgbV9HcmF5ID0gRlhSR0IyR1JBWShyLCBnLCBiKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9HcmF5ID0KLSAgICAgICAgICAgICAgICBGWFJHQjJHUkFZKEZYQVJHQl9SKGNvbG9yKSwgRlhBUkdCX0coY29sb3IpLCBGWEFSR0JfQihjb2xvcikpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmIChiRGV2aWNlQ01ZSykgewotICAgICAgQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOwotICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuQ01ZSzsKLSAgICAgIGlmIChiT2JqZWN0Q01ZSykgewotICAgICAgICBtX0NvbG9yID0gRlhDTVlLX1RPRElCKGNvbG9yKTsKLSAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAodWludDhfdCopJm1fQ29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKSZtX0NvbG9yLCAxKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGNvbG9yID0gRlhBUkdCX1RPRElCKGNvbG9yKTsKLSAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKSZtX0NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopJmNvbG9yLCAxKTsKLSAgICAgIH0KLSAgICAgIG1fUmVkID0gKCh1aW50OF90KikmbV9Db2xvcilbMF07Ci0gICAgICBtX0dyZWVuID0gKCh1aW50OF90KikmbV9Db2xvcilbMV07Ci0gICAgICBtX0JsdWUgPSAoKHVpbnQ4X3QqKSZtX0NvbG9yKVsyXTsKLSAgICAgIG1fR3JheSA9ICgodWludDhfdCopJm1fQ29sb3IpWzNdOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb21wb3NpdGVfc3BhbiA9IChwRGV2aWNlLT5HZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuQVJHQgotICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCOwotICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgY29sb3IgPSBiT2JqZWN0Q01ZSyA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOwotICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAodWludDhfdCopJm1fQ29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KikmY29sb3IsIDEpOwotICAgICAgICAoKHVpbnQ4X3QqKSZtX0NvbG9yKVszXSA9IG1fQWxwaGE7Ci0gICAgICAgIG1fUmVkID0gKCh1aW50OF90KikmbV9Db2xvcilbMl07Ci0gICAgICAgIG1fR3JlZW4gPSAoKHVpbnQ4X3QqKSZtX0NvbG9yKVsxXTsKLSAgICAgICAgbV9CbHVlID0gKCh1aW50OF90KikmbV9Db2xvcilbMF07Ci0gICAgICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKLSAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPRElCKG1fQ29sb3IpOwotICAgICAgICAgIG1fQ29sb3IgPSBGWEFSR0JfVE9CR1JPUkRFUkRJQihtX0NvbG9yKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGJPYmplY3RDTVlLKSB7Ci0gICAgICAgICAgdWludDhfdCByLCBnLCBiOwotICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoY29sb3IpLCBGWFNZU19HZXRNVmFsdWUoY29sb3IpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoY29sb3IpLCBGWFNZU19HZXRLVmFsdWUoY29sb3IpLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLCBiKTsKLSAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX01BS0UobV9BbHBoYSwgciwgZywgYik7Ci0gICAgICAgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgewotICAgICAgICAgICAgbV9Db2xvciA9IEZYQVJHQl9UT0JHUk9SREVSRElCKG1fQ29sb3IpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPRElCKG1fQ29sb3IpOwotICAgICAgICAgIH0KLSAgICAgICAgICBtX1JlZCA9IHI7Ci0gICAgICAgICAgbV9HcmVlbiA9IGc7Ci0gICAgICAgICAgbV9CbHVlID0gYjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7Ci0gICAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPQkdST1JERVJESUIoY29sb3IpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPRElCKGNvbG9yKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgQXJnYkRlY29kZShjb2xvciwgbV9BbHBoYSwgbV9SZWQsIG1fR3JlZW4sIG1fQmx1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fcERldmljZS0+R2V0QlBQKCkgPT0gMSkgewotICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuMWJwcDsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX07Ci0KIGludCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpHZXREcml2ZXJUeXBlKCkgY29uc3QgewogICByZXR1cm4gMTsKIH0KQEAgLTE0MzQsMTMgKzEyODIsMTEgQEAKICAgICBhZ2c6OnJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEmIHJhc3Rlcml6ZXIsCiAgICAgdWludDMyX3QgY29sb3IsCiAgICAgYm9vbCBiRnVsbENvdmVyLAotICAgIGJvb2wgYkdyb3VwS25vY2tvdXQsCi0gICAgaW50IGFscGhhX2ZsYWcsCi0gICAgdm9pZCogcEljY1RyYW5zZm9ybSkgewotICBDRlhfRElCaXRtYXAqIHB0ID0gYkdyb3VwS25vY2tvdXQgPyBtX3BPcmlEZXZpY2UgOiBudWxscHRyOworICAgIGJvb2wgYkdyb3VwS25vY2tvdXQpIHsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcHQgPSBiR3JvdXBLbm9ja291dCA/IG1fcE9yaURldmljZSA6IG51bGxwdHI7CiAgIENGWF9SZW5kZXJlciByZW5kZXI7CiAgIGlmICghcmVuZGVyLkluaXQobV9wQml0bWFwLCBwdCwgbV9wQ2xpcFJnbi5nZXQoKSwgY29sb3IsIGJGdWxsQ292ZXIsCi0gICAgICAgICAgICAgICAgICAgbV9iUmdiQnl0ZU9yZGVyLCBhbHBoYV9mbGFnLCBwSWNjVHJhbnNmb3JtKSkgeworICAgICAgICAgICAgICAgICAgIG1fYlJnYkJ5dGVPcmRlcikpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KICAgYWdnOjpzY2FubGluZV91OCBzY2FubGluZTsKQEAgLTE0NjcsMTUgKzEzMTMsMTUgQEAKICAgICBDQWdnX1BhdGhEYXRhIHBhdGhfZGF0YTsKICAgICBwYXRoX2RhdGEuQnVpbGRQYXRoKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UpOwogICAgIGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSByYXN0ZXJpemVyOwotICAgIHJhc3Rlcml6ZXIuY2xpcF9ib3goMC4wZiwgMC4wZiwgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCkoR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKKyAgICByYXN0ZXJpemVyLmNsaXBfYm94KDAuMGYsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKICAgICByYXN0ZXJpemVyLmFkZF9wYXRoKHBhdGhfZGF0YS5tX1BhdGhEYXRhKTsKICAgICByYXN0ZXJpemVyLmZpbGxpbmdfcnVsZSgoZmlsbF9tb2RlICYgMykgPT0gRlhGSUxMX1dJTkRJTkcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhZ2c6OmZpbGxfbm9uX3plcm8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhZ2c6OmZpbGxfZXZlbl9vZGQpOwogICAgIGlmICghUmVuZGVyUmFzdGVyaXplcihyYXN0ZXJpemVyLCBmaWxsX2NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAhIShmaWxsX21vZGUgJiBGWEZJTExfRlVMTENPVkVSKSwgZmFsc2UsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICEhKGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIpLCBmYWxzZSkpIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgIH0KQEAgLTE0ODcsNDAgKzEzMzMsMzcgQEAKICAgICBDQWdnX1BhdGhEYXRhIHBhdGhfZGF0YTsKICAgICBwYXRoX2RhdGEuQnVpbGRQYXRoKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UpOwogICAgIGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSByYXN0ZXJpemVyOwotICAgIHJhc3Rlcml6ZXIuY2xpcF9ib3goMC4wZiwgMC4wZiwgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCkoR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKLSAgICBSYXN0ZXJpemVTdHJva2UocmFzdGVyaXplciwgcGF0aF9kYXRhLm1fUGF0aERhdGEsIG51bGxwdHIsIHBHcmFwaFN0YXRlLCAxLAorICAgIHJhc3Rlcml6ZXIuY2xpcF9ib3goMC4wZiwgMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSkpOworICAgIFJhc3Rlcml6ZVN0cm9rZSgmcmFzdGVyaXplciwgJnBhdGhfZGF0YS5tX1BhdGhEYXRhLCBudWxscHRyLCBwR3JhcGhTdGF0ZSwgMSwKICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICEhKGZpbGxfbW9kZSAmIEZYX1NUUk9LRV9URVhUX01PREUpKTsKICAgICByZXR1cm4gUmVuZGVyUmFzdGVyaXplcihyYXN0ZXJpemVyLCBzdHJva2VfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgISEoZmlsbF9tb2RlICYgRlhGSUxMX0ZVTExDT1ZFUiksIG1fYkdyb3VwS25vY2tvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgISEoZmlsbF9tb2RlICYgRlhGSUxMX0ZVTExDT1ZFUiksIG1fYkdyb3VwS25vY2tvdXQpOwogICB9CiAgIENGWF9NYXRyaXggbWF0cml4MTsKICAgQ0ZYX01hdHJpeCBtYXRyaXgyOwogICBpZiAocE9iamVjdDJEZXZpY2UpIHsKLSAgICBtYXRyaXgxLmEgPQotICAgICAgICBzdGQ6Om1heChGWFNZU19mYWJzKHBPYmplY3QyRGV2aWNlLT5hKSwgRlhTWVNfZmFicyhwT2JqZWN0MkRldmljZS0+YikpOworICAgIG1hdHJpeDEuYSA9IHN0ZDo6bWF4KGZhYnMocE9iamVjdDJEZXZpY2UtPmEpLCBmYWJzKHBPYmplY3QyRGV2aWNlLT5iKSk7CiAgICAgbWF0cml4MS5kID0gbWF0cml4MS5hOwogICAgIG1hdHJpeDIgPSBDRlhfTWF0cml4KAogICAgICAgICBwT2JqZWN0MkRldmljZS0+YSAvIG1hdHJpeDEuYSwgcE9iamVjdDJEZXZpY2UtPmIgLyBtYXRyaXgxLmEsCiAgICAgICAgIHBPYmplY3QyRGV2aWNlLT5jIC8gbWF0cml4MS5kLCBwT2JqZWN0MkRldmljZS0+ZCAvIG1hdHJpeDEuZCwgMCwgMCk7CiAKLSAgICBDRlhfTWF0cml4IG10UmVydmVzZTsKLSAgICBtdFJlcnZlc2UuU2V0UmV2ZXJzZShtYXRyaXgyKTsKICAgICBtYXRyaXgxID0gKnBPYmplY3QyRGV2aWNlOwotICAgIG1hdHJpeDEuQ29uY2F0KG10UmVydmVzZSk7CisgICAgbWF0cml4MS5Db25jYXQobWF0cml4Mi5HZXRJbnZlcnNlKCkpOwogICB9CiAKICAgQ0FnZ19QYXRoRGF0YSBwYXRoX2RhdGE7CiAgIHBhdGhfZGF0YS5CdWlsZFBhdGgocFBhdGhEYXRhLCAmbWF0cml4MSk7CiAgIGFnZzo6cmFzdGVyaXplcl9zY2FubGluZV9hYSByYXN0ZXJpemVyOwotICByYXN0ZXJpemVyLmNsaXBfYm94KDAuMGYsIDAuMGYsIChGWF9GTE9BVCkoR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSksCi0gICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSkpOwotICBSYXN0ZXJpemVTdHJva2UocmFzdGVyaXplciwgcGF0aF9kYXRhLm1fUGF0aERhdGEsICZtYXRyaXgyLCBwR3JhcGhTdGF0ZSwKKyAgcmFzdGVyaXplci5jbGlwX2JveCgwLjBmLCAwLjBmLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKTsKKyAgUmFzdGVyaXplU3Ryb2tlKCZyYXN0ZXJpemVyLCAmcGF0aF9kYXRhLm1fUGF0aERhdGEsICZtYXRyaXgyLCBwR3JhcGhTdGF0ZSwKICAgICAgICAgICAgICAgICAgIG1hdHJpeDEuYSwgZmFsc2UsICEhKGZpbGxfbW9kZSAmIEZYX1NUUk9LRV9URVhUX01PREUpKTsKICAgcmV0dXJuIFJlbmRlclJhc3Rlcml6ZXIocmFzdGVyaXplciwgc3Ryb2tlX2NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAhIShmaWxsX21vZGUgJiBGWEZJTExfRlVMTENPVkVSKSwgbV9iR3JvdXBLbm9ja291dCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICEhKGZpbGxfbW9kZSAmIEZYRklMTF9GVUxMQ09WRVIpLCBtX2JHcm91cEtub2Nrb3V0KTsKIH0KIAogYm9vbCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpTZXRQaXhlbChpbnQgeCwgaW50IHksIHVpbnQzMl90IGNvbG9yKSB7CkBAIC0xNTI5LDcgKzEzNzIsNyBAQAogCiAgIGlmICghbV9wQ2xpcFJnbikgewogICAgIGlmICghbV9iUmdiQnl0ZU9yZGVyKQotICAgICAgcmV0dXJuIERpYlNldFBpeGVsKG1fcEJpdG1hcCwgeCwgeSwgY29sb3IsIDAsIG51bGxwdHIpOworICAgICAgcmV0dXJuIERpYlNldFBpeGVsKG1fcEJpdG1hcCwgeCwgeSwgY29sb3IpOwogICAgIFJnYkJ5dGVPcmRlclNldFBpeGVsKG1fcEJpdG1hcCwgeCwgeSwgY29sb3IpOwogICAgIHJldHVybiB0cnVlOwogICB9CkBAIC0xNTM4LDIxICsxMzgxLDIxIEBACiAKICAgaWYgKG1fcENsaXBSZ24tPkdldFR5cGUoKSA9PSBDRlhfQ2xpcFJnbjo6UmVjdEkpIHsKICAgICBpZiAoIW1fYlJnYkJ5dGVPcmRlcikKLSAgICAgIHJldHVybiBEaWJTZXRQaXhlbChtX3BCaXRtYXAsIHgsIHksIGNvbG9yLCAwLCBudWxscHRyKTsKKyAgICAgIHJldHVybiBEaWJTZXRQaXhlbChtX3BCaXRtYXAsIHgsIHksIGNvbG9yKTsKICAgICBSZ2JCeXRlT3JkZXJTZXRQaXhlbChtX3BCaXRtYXAsIHgsIHksIGNvbG9yKTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogICBpZiAobV9wQ2xpcFJnbi0+R2V0VHlwZSgpICE9IENGWF9DbGlwUmduOjpNYXNrRikKICAgICByZXR1cm4gdHJ1ZTsKIAotICBjb25zdCBDRlhfRElCaXRtYXAqIHBNYXNrID0gbV9wQ2xpcFJnbi0+R2V0TWFzaygpLkdldE9iamVjdCgpOwotICBpbnQgbmV3X2FscGhhID0gRlhBUkdCX0EoY29sb3IpICogcE1hc2stPkdldFNjYW5saW5lKHkpW3hdIC8gMjU1OworICBpbnQgbmV3X2FscGhhID0KKyAgICAgIEZYQVJHQl9BKGNvbG9yKSAqIG1fcENsaXBSZ24tPkdldE1hc2soKS0+R2V0U2NhbmxpbmUoeSlbeF0gLyAyNTU7CiAgIGNvbG9yID0gKGNvbG9yICYgMHhmZmZmZmYpIHwgKG5ld19hbHBoYSA8PCAyNCk7CiAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKICAgICBSZ2JCeXRlT3JkZXJTZXRQaXhlbChtX3BCaXRtYXAsIHgsIHksIGNvbG9yKTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQotICByZXR1cm4gRGliU2V0UGl4ZWwobV9wQml0bWFwLCB4LCB5LCBjb2xvciwgMCwgbnVsbHB0cik7CisgIHJldHVybiBEaWJTZXRQaXhlbChtX3BCaXRtYXAsIHgsIHksIGNvbG9yKTsKIH0KIAogYm9vbCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpGaWxsUmVjdFdpdGhCbGVuZChjb25zdCBGWF9SRUNUKiBwUmVjdCwKQEAgLTE1NzksMTUgKzE0MjIsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9jb2xvcik7CiAgICAgfSBlbHNlIHsKICAgICAgIG1fcEJpdG1hcC0+Q29tcG9zaXRlUmVjdChkcmF3X3JlY3QubGVmdCwgZHJhd19yZWN0LnRvcCwgZHJhd19yZWN0LldpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd19yZWN0LkhlaWdodCgpLCBmaWxsX2NvbG9yLCAwLCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X3JlY3QuSGVpZ2h0KCksIGZpbGxfY29sb3IsIDApOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKICAgfQotICBtX3BCaXRtYXAtPkNvbXBvc2l0ZU1hc2soCi0gICAgICBkcmF3X3JlY3QubGVmdCwgZHJhd19yZWN0LnRvcCwgZHJhd19yZWN0LldpZHRoKCksIGRyYXdfcmVjdC5IZWlnaHQoKSwKLSAgICAgIG1fcENsaXBSZ24tPkdldE1hc2soKS5HZXRPYmplY3QoKSwgZmlsbF9jb2xvciwKLSAgICAgIGRyYXdfcmVjdC5sZWZ0IC0gY2xpcF9yZWN0LmxlZnQsIGRyYXdfcmVjdC50b3AgLSBjbGlwX3JlY3QudG9wLAotICAgICAgRlhESUJfQkxFTkRfTk9STUFMLCBudWxscHRyLCBtX2JSZ2JCeXRlT3JkZXIsIDAsIG51bGxwdHIpOworICBtX3BCaXRtYXAtPkNvbXBvc2l0ZU1hc2soZHJhd19yZWN0LmxlZnQsIGRyYXdfcmVjdC50b3AsIGRyYXdfcmVjdC5XaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd19yZWN0LkhlaWdodCgpLCBtX3BDbGlwUmduLT5HZXRNYXNrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2NvbG9yLCBkcmF3X3JlY3QubGVmdCAtIGNsaXBfcmVjdC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd19yZWN0LnRvcCAtIGNsaXBfcmVjdC50b3AsIEZYRElCX0JMRU5EX05PUk1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIG1fYlJnYkJ5dGVPcmRlciwgMCk7CiAgIHJldHVybiB0cnVlOwogfQogCkBAIC0xNjAyLDEzICsxNDQ1LDE1IEBACiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENGWF9BZ2dEZXZpY2VEcml2ZXI6OkdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wKSB7Citib29sIENGWF9BZ2dEZXZpY2VEcml2ZXI6OkdldERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCkgewogICBpZiAoIW1fcEJpdG1hcCB8fCAhbV9wQml0bWFwLT5HZXRCdWZmZXIoKSkKICAgICByZXR1cm4gdHJ1ZTsKIAogICBGWF9SRUNUIHJlY3QobGVmdCwgdG9wLCBsZWZ0ICsgcEJpdG1hcC0+R2V0V2lkdGgoKSwKICAgICAgICAgICAgICAgIHRvcCArIHBCaXRtYXAtPkdldEhlaWdodCgpKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gcEJhY2s7CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBCYWNrOwogICBpZiAobV9wT3JpRGV2aWNlKSB7CiAgICAgcEJhY2sgPSBtX3BPcmlEZXZpY2UtPkNsb25lKCZyZWN0KTsKICAgICBpZiAoIXBCYWNrKQpAQCAtMTYyNiwxOCArMTQ3MSwxOCBAQAogICB0b3AgPSBzdGQ6Om1pbih0b3AsIDApOwogICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7CiAgICAgUmdiQnl0ZU9yZGVyVHJhbnNmZXJCaXRtYXAocEJpdG1hcCwgMCwgMCwgcmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCYWNrLmdldCgpLCBsZWZ0LCB0b3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCYWNrLCBsZWZ0LCB0b3ApOwogICAgIHJldHVybiB0cnVlOwogICB9Ci0gIHJldHVybiBwQml0bWFwLT5UcmFuc2ZlckJpdG1hcCgwLCAwLCByZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCksIHBCYWNrLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCwgdG9wKTsKKyAgcmV0dXJuIHBCaXRtYXAtPlRyYW5zZmVyQml0bWFwKDAsIDAsIHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgcEJhY2ssIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3ApOwogfQogCi1DRlhfRElCaXRtYXAqIENGWF9BZ2dEZXZpY2VEcml2ZXI6OkdldEJhY2tEcm9wKCkgeworUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gQ0ZYX0FnZ0RldmljZURyaXZlcjo6R2V0QmFja0Ryb3AoKSB7CiAgIHJldHVybiBtX3BPcmlEZXZpY2U7CiB9CiAKLWJvb2wgQ0ZYX0FnZ0RldmljZURyaXZlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCitib29sIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlNldERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmdiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKQEAgLTE2NDcsMTcgKzE0OTIsMTcgQEAKICAgICByZXR1cm4gdHJ1ZTsKIAogICBpZiAocEJpdG1hcC0+SXNBbHBoYU1hc2soKSkgewotICAgIHJldHVybiBtX3BCaXRtYXAtPkNvbXBvc2l0ZU1hc2soCi0gICAgICAgIGxlZnQsIHRvcCwgcFNyY1JlY3QtPldpZHRoKCksIHBTcmNSZWN0LT5IZWlnaHQoKSwgcEJpdG1hcCwgYXJnYiwKLSAgICAgICAgcFNyY1JlY3QtPmxlZnQsIHBTcmNSZWN0LT50b3AsIGJsZW5kX3R5cGUsIG1fcENsaXBSZ24uZ2V0KCksCi0gICAgICAgIG1fYlJnYkJ5dGVPcmRlciwgMCwgbnVsbHB0cik7CisgICAgcmV0dXJuIG1fcEJpdG1hcC0+Q29tcG9zaXRlTWFzayhsZWZ0LCB0b3AsIHBTcmNSZWN0LT5XaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY1JlY3QtPkhlaWdodCgpLCBwQml0bWFwLCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY1JlY3QtPmxlZnQsIHBTcmNSZWN0LT50b3AsIGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDbGlwUmduLmdldCgpLCBtX2JSZ2JCeXRlT3JkZXIsIDApOwogICB9CiAgIHJldHVybiBtX3BCaXRtYXAtPkNvbXBvc2l0ZUJpdG1hcCgKICAgICAgIGxlZnQsIHRvcCwgcFNyY1JlY3QtPldpZHRoKCksIHBTcmNSZWN0LT5IZWlnaHQoKSwgcEJpdG1hcCwgcFNyY1JlY3QtPmxlZnQsCi0gICAgICBwU3JjUmVjdC0+dG9wLCBibGVuZF90eXBlLCBtX3BDbGlwUmduLmdldCgpLCBtX2JSZ2JCeXRlT3JkZXIsIG51bGxwdHIpOworICAgICAgcFNyY1JlY3QtPnRvcCwgYmxlbmRfdHlwZSwgbV9wQ2xpcFJnbi5nZXQoKSwgbV9iUmdiQnl0ZU9yZGVyKTsKIH0KIAotYm9vbCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCitib29sIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlN0cmV0Y2hESUJpdHMoY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFyZ2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCkBAIC0xNjgxLDcgKzE1MjYsNyBAQAogICBkZXN0X2NsaXAuSW50ZXJzZWN0KCpwQ2xpcFJlY3QpOwogICBDRlhfQml0bWFwQ29tcG9zZXIgY29tcG9zZXI7CiAgIGNvbXBvc2VyLkNvbXBvc2UobV9wQml0bWFwLCBtX3BDbGlwUmduLmdldCgpLCAyNTUsIGFyZ2IsIGRlc3RfY2xpcCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBtX2JSZ2JCeXRlT3JkZXIsIDAsIG51bGxwdHIsIGJsZW5kX3R5cGUpOworICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgbV9iUmdiQnl0ZU9yZGVyLCAwLCBibGVuZF90eXBlKTsKICAgZGVzdF9jbGlwLk9mZnNldCgtZGVzdF9yZWN0LmxlZnQsIC1kZXN0X3JlY3QudG9wKTsKICAgQ0ZYX0ltYWdlU3RyZXRjaGVyIHN0cmV0Y2hlcigmY29tcG9zZXIsIHBTb3VyY2UsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfY2xpcCwgZmxhZ3MpOwpAQCAtMTY5MCw0NiArMTUzNSwzNyBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZW5kZXJfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7Citib29sIENGWF9BZ2dEZXZpY2VEcml2ZXI6OlN0YXJ0RElCaXRzKAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNvdXJjZSwKKyAgICBpbnQgYml0bWFwX2FscGhhLAorICAgIHVpbnQzMl90IGFyZ2IsCisgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICB1aW50MzJfdCByZW5kZXJfZmxhZ3MsCisgICAgc3RkOjp1bmlxdWVfcHRyPENGWF9JbWFnZVJlbmRlcmVyPiogaGFuZGxlLAorICAgIGludCBibGVuZF90eXBlKSB7CiAgIGlmICghbV9wQml0bWFwLT5HZXRCdWZmZXIoKSkKICAgICByZXR1cm4gdHJ1ZTsKIAotICBDRlhfSW1hZ2VSZW5kZXJlciogcFJlbmRlcmVyID0gbmV3IENGWF9JbWFnZVJlbmRlcmVyOwotICBwUmVuZGVyZXItPlN0YXJ0KG1fcEJpdG1hcCwgbV9wQ2xpcFJnbi5nZXQoKSwgcFNvdXJjZSwgYml0bWFwX2FscGhhLCBhcmdiLAotICAgICAgICAgICAgICAgICAgIHBNYXRyaXgsIHJlbmRlcl9mbGFncywgbV9iUmdiQnl0ZU9yZGVyLCAwLCBudWxscHRyKTsKLSAgaGFuZGxlID0gcFJlbmRlcmVyOworICAqaGFuZGxlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9JbWFnZVJlbmRlcmVyPigKKyAgICAgIG1fcEJpdG1hcCwgbV9wQ2xpcFJnbi5nZXQoKSwgcFNvdXJjZSwgYml0bWFwX2FscGhhLCBhcmdiLCBwTWF0cml4LAorICAgICAgcmVuZGVyX2ZsYWdzLCBtX2JSZ2JCeXRlT3JkZXIpOwogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDRlhfQWdnRGV2aWNlRHJpdmVyOjpDb250aW51ZURJQml0cyh2b2lkKiBwSGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkgewotICBpZiAoIW1fcEJpdG1hcC0+R2V0QnVmZmVyKCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gKChDRlhfSW1hZ2VSZW5kZXJlciopcEhhbmRsZSktPkNvbnRpbnVlKHBQYXVzZSk7Ci19Ci0KLXZvaWQgQ0ZYX0FnZ0RldmljZURyaXZlcjo6Q2FuY2VsRElCaXRzKHZvaWQqIHBIYW5kbGUpIHsKLSAgaWYgKCFtX3BCaXRtYXAtPkdldEJ1ZmZlcigpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGRlbGV0ZSAoQ0ZYX0ltYWdlUmVuZGVyZXIqKXBIYW5kbGU7Citib29sIENGWF9BZ2dEZXZpY2VEcml2ZXI6OkNvbnRpbnVlRElCaXRzKENGWF9JbWFnZVJlbmRlcmVyKiBwSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSkgeworICByZXR1cm4gbV9wQml0bWFwLT5HZXRCdWZmZXIoKSA/IHBIYW5kbGUtPkNvbnRpbnVlKHBQYXVzZSkgOiB0cnVlOwogfQogCiAjaWZuZGVmIF9TS0lBX1NVUFBPUlRfCi1DRlhfRnhnZURldmljZTo6Q0ZYX0Z4Z2VEZXZpY2UoKSB7Ci0gIG1fYk93bmVkQml0bWFwID0gZmFsc2U7Ci19CitDRlhfRGVmYXVsdFJlbmRlckRldmljZTo6Q0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2UoKSB7fQogCi1ib29sIENGWF9GeGdlRGV2aWNlOjpBdHRhY2goQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJnYkJ5dGVPcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiR3JvdXBLbm9ja291dCkgeworQ0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2U6On5DRlhfRGVmYXVsdFJlbmRlckRldmljZSgpIHt9CisKK2Jvb2wgQ0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2U6OkF0dGFjaChjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZ2JCeXRlT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBPcmlEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiR3JvdXBLbm9ja291dCkgewogICBpZiAoIXBCaXRtYXApCiAgICAgcmV0dXJuIGZhbHNlOwogCkBAIC0xNzM5LDI1ICsxNTc1LDE5IEBACiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENGWF9GeGdlRGV2aWNlOjpDcmVhdGUoaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UpIHsKLSAgbV9iT3duZWRCaXRtYXAgPSB0cnVlOwotICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOwotICBpZiAoIXBCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpKSB7Ci0gICAgZGVsZXRlIHBCaXRtYXA7Citib29sIENGWF9EZWZhdWx0UmVuZGVyRGV2aWNlOjpDcmVhdGUoCisgICAgaW50IHdpZHRoLAorICAgIGludCBoZWlnaHQsCisgICAgRlhESUJfRm9ybWF0IGZvcm1hdCwKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcE9yaURldmljZSkgeworICBhdXRvIHBCaXRtYXAgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOworICBpZiAoIXBCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQpKQogICAgIHJldHVybiBmYWxzZTsKLSAgfQorCiAgIFNldEJpdG1hcChwQml0bWFwKTsKICAgU2V0RGV2aWNlRHJpdmVyKHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfQWdnRGV2aWNlRHJpdmVyPihwQml0bWFwLCBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3JpRGV2aWNlLCBmYWxzZSkpOwogICByZXR1cm4gdHJ1ZTsKIH0KIAotQ0ZYX0Z4Z2VEZXZpY2U6On5DRlhfRnhnZURldmljZSgpIHsKLSAgaWYgKG1fYk93bmVkQml0bWFwKSB7Ci0gICAgZGVsZXRlIEdldEJpdG1hcCgpOwotICB9Ci19CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9hZ2cvZnhfYWdnX2RyaXZlci5oIGIvY29yZS9meGdlL2FnZy9meF9hZ2dfZHJpdmVyLmgKaW5kZXggOGRhNjMzOS4uOTI1MDBjMyAxMDA2NDQKLS0tIGEvY29yZS9meGdlL2FnZy9meF9hZ2dfZHJpdmVyLmgKKysrIGIvY29yZS9meGdlL2FnZy9meF9hZ2dfZHJpdmVyLmgKQEAgLTMyLDkgKzMyLDkgQEAKIAogY2xhc3MgQ0ZYX0FnZ0RldmljZURyaXZlciA6IHB1YmxpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyIHsKICBwdWJsaWM6Ci0gIENGWF9BZ2dEZXZpY2VEcml2ZXIoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICBDRlhfQWdnRGV2aWNlRHJpdmVyKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwQml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJnYkJ5dGVPcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBPcmlEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiR3JvdXBLbm9ja291dCk7CiAgIH5DRlhfQWdnRGV2aWNlRHJpdmVyKCkgb3ZlcnJpZGU7CiAKQEAgLTYzLDE1ICs2MywxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpbGxfY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIG92ZXJyaWRlOwogICBib29sIEdldENsaXBCb3goRlhfUkVDVCogcFJlY3QpIG92ZXJyaWRlOwotICBib29sIEdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wKSBvdmVycmlkZTsKLSAgQ0ZYX0RJQml0bWFwKiBHZXRCYWNrRHJvcCgpIG92ZXJyaWRlOwotICBib29sIFNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICBib29sIEdldERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgIGludCB0b3ApIG92ZXJyaWRlOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBHZXRCYWNrRHJvcCgpIG92ZXJyaWRlOworICBib29sIFNldERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yLAogICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCiAgICAgICAgICAgICAgICAgIGludCB0b3AsCiAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSBvdmVycmlkZTsKLSAgYm9vbCBTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgIGJvb2wgU3RyZXRjaERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCiAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCkBAIC04MCw0NCArODIsNDIgQEAKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIG92ZXJyaWRlOwotICBib29sIFN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgIGJvb2wgU3RhcnRESUJpdHMoY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwQml0bWFwLAogICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCiAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICB2b2lkKiYgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfSW1hZ2VSZW5kZXJlcj4qIGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgQ29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgQ2FuY2VsRElCaXRzKHZvaWQqIGhhbmRsZSkgb3ZlcnJpZGU7CisgIGJvb2wgQ29udGludWVESUJpdHMoQ0ZYX0ltYWdlUmVuZGVyZXIqIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSkgb3ZlcnJpZGU7CiAgIGJvb2wgRHJhd0RldmljZVRleHQoaW50IG5DaGFycywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IpIG92ZXJyaWRlOwogICBpbnQgR2V0RHJpdmVyVHlwZSgpIGNvbnN0IG92ZXJyaWRlOwogCiAgIGJvb2wgUmVuZGVyUmFzdGVyaXplcihhZ2c6OnJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEmIHJhc3Rlcml6ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZ1bGxDb3ZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkdyb3VwS25vY2tvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiR3JvdXBLbm9ja291dCk7CiAKICAgdm9pZCBTZXRDbGlwTWFzayhhZ2c6OnJhc3Rlcml6ZXJfc2NhbmxpbmVfYWEmIHJhc3Rlcml6ZXIpOwogCiAgIHZpcnR1YWwgdWludDhfdCogR2V0QnVmZmVyKCkgY29uc3Q7CiAKICBwcml2YXRlOgotICBDRlhfRElCaXRtYXAqIG1fcEJpdG1hcDsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gbV9wQml0bWFwOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0NsaXBSZ24+IG1fcENsaXBSZ247CiAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhfQ2xpcFJnbj4+IG1fU3RhdGVTdGFjazsKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXwogICB2b2lkKiBtX3BQbGF0Zm9ybUdyYXBoaWNzOwogI2VuZGlmCiAgIGludCBtX0ZpbGxGbGFnczsKICAgYm9vbCBtX2JSZ2JCeXRlT3JkZXI7Ci0gIENGWF9ESUJpdG1hcCogbV9wT3JpRGV2aWNlOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBtX3BPcmlEZXZpY2U7CiAgIGJvb2wgbV9iR3JvdXBLbm9ja291dDsKIH07CiAKZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWJ1ZmZlcmZvbnQuY3BwIGIvY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhYnVmZmVyZm9udC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZjZTQ4MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWJ1ZmZlcmZvbnQuY3BwCkBAIC0wLDAgKzEsMTYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWJ1ZmZlcmZvbnQuaCIKKworQ0ZQRl9Ta2lhQnVmZmVyRm9udDo6Q0ZQRl9Ta2lhQnVmZmVyRm9udCgpCisgICAgOiBtX3BCdWZmZXIobnVsbHB0ciksIG1fc3pCdWZmZXIoMCkge30KKworQ0ZQRl9Ta2lhQnVmZmVyRm9udDo6fkNGUEZfU2tpYUJ1ZmZlckZvbnQoKSA9IGRlZmF1bHQ7CisKK2ludDMyX3QgQ0ZQRl9Ta2lhQnVmZmVyRm9udDo6R2V0VHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEZQRl9TS0lBRk9OVFRZUEVfQnVmZmVyOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhYnVmZmVyZm9udC5oIGIvY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhYnVmZmVyZm9udC5oCmluZGV4IDAyZmRhZGUuLjNhOTRhNTEgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWJ1ZmZlcmZvbnQuaAorKysgYi9jb3JlL2Z4Z2UvYW5kcm9pZC9jZnBmX3NraWFidWZmZXJmb250LmgKQEAgLTEzLDEwICsxMywxMSBAQAogCiBjbGFzcyBDRlBGX1NraWFCdWZmZXJGb250IDogcHVibGljIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yIHsKICBwdWJsaWM6Ci0gIENGUEZfU2tpYUJ1ZmZlckZvbnQoKSA6IG1fcEJ1ZmZlcihudWxscHRyKSwgbV9zekJ1ZmZlcigwKSB7fQorICBDRlBGX1NraWFCdWZmZXJGb250KCk7CisgIH5DRlBGX1NraWFCdWZmZXJGb250KCkgb3ZlcnJpZGU7CiAKICAgLy8gQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IKLSAgaW50MzJfdCBHZXRUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gRlBGX1NLSUFGT05UVFlQRV9CdWZmZXI7IH0KKyAgaW50MzJfdCBHZXRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgdm9pZCogbV9wQnVmZmVyOwogICBzaXplX3QgbV9zekJ1ZmZlcjsKZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWRldmljZW1vZHVsZS5jcHAgYi9jb3JlL2Z4Z2UvYW5kcm9pZC9jZnBmX3NraWFkZXZpY2Vtb2R1bGUuY3BwCmluZGV4IDdiZGY2NDYuLmJiM2Y3MGEgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWRldmljZW1vZHVsZS5jcHAKKysrIGIvY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhZGV2aWNlbW9kdWxlLmNwcApAQCAtNiw3ICs2LDEwIEBACiAKICNpbmNsdWRlICJjb3JlL2Z4Z2UvYW5kcm9pZC9jZnBmX3NraWFkZXZpY2Vtb2R1bGUuaCIKIAorI2luY2x1ZGUgPHV0aWxpdHk+CisKICNpbmNsdWRlICJjb3JlL2Z4Z2UvYW5kcm9pZC9jZnBmX3NraWFmb250bWdyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogCiBuYW1lc3BhY2UgewogCkBAIC0yMCw5ICsyMyw5IEBACiAgIHJldHVybiBnc19wUEZNb2R1bGU7CiB9CiAKLUNGUEZfU2tpYURldmljZU1vZHVsZTo6fkNGUEZfU2tpYURldmljZU1vZHVsZSgpIHsKLSAgZGVsZXRlIG1fcEZvbnRNZ3I7Ci19CitDRlBGX1NraWFEZXZpY2VNb2R1bGU6OkNGUEZfU2tpYURldmljZU1vZHVsZSgpIHt9CisKK0NGUEZfU2tpYURldmljZU1vZHVsZTo6fkNGUEZfU2tpYURldmljZU1vZHVsZSgpIHt9CiAKIHZvaWQgQ0ZQRl9Ta2lhRGV2aWNlTW9kdWxlOjpEZXN0cm95KCkgewogICBkZWxldGUgZ3NfcFBGTW9kdWxlOwpAQCAtMzEsMTEgKzM0LDEwIEBACiAKIENGUEZfU2tpYUZvbnRNZ3IqIENGUEZfU2tpYURldmljZU1vZHVsZTo6R2V0Rm9udE1ncigpIHsKICAgaWYgKCFtX3BGb250TWdyKSB7Ci0gICAgbV9wRm9udE1nciA9IG5ldyBDRlBGX1NraWFGb250TWdyOwotICAgIGlmICghbV9wRm9udE1nci0+SW5pdEZUTGlicmFyeSgpKSB7Ci0gICAgICBkZWxldGUgbV9wRm9udE1ncjsKKyAgICBhdXRvIHBOZXdNZ3IgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZQRl9Ta2lhRm9udE1ncj4oKTsKKyAgICBpZiAoIXBOZXdNZ3ItPkluaXRGVExpYnJhcnkoKSkKICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KKyAgICBtX3BGb250TWdyID0gc3RkOjptb3ZlKHBOZXdNZ3IpOwogICB9Ci0gIHJldHVybiBtX3BGb250TWdyOworICByZXR1cm4gbV9wRm9udE1nci5nZXQoKTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWRldmljZW1vZHVsZS5oIGIvY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhZGV2aWNlbW9kdWxlLmgKaW5kZXggMzI2MTgyMC4uNTU4YjA4NCAxMDA2NDQKLS0tIGEvY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhZGV2aWNlbW9kdWxlLmgKKysrIGIvY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhZGV2aWNlbW9kdWxlLmgKQEAgLTcsMTggKzcsMjAgQEAKICNpZm5kZWYgQ09SRV9GWEdFX0FORFJPSURfQ0ZQRl9TS0lBREVWSUNFTU9EVUxFX0hfCiAjZGVmaW5lIENPUkVfRlhHRV9BTkRST0lEX0NGUEZfU0tJQURFVklDRU1PRFVMRV9IXwogCisjaW5jbHVkZSA8bWVtb3J5PgorCiBjbGFzcyBDRlBGX1NraWFGb250TWdyOwogCiBjbGFzcyBDRlBGX1NraWFEZXZpY2VNb2R1bGUgewogIHB1YmxpYzoKLSAgQ0ZQRl9Ta2lhRGV2aWNlTW9kdWxlKCkgOiBtX3BGb250TWdyKG51bGxwdHIpIHt9CisgIENGUEZfU2tpYURldmljZU1vZHVsZSgpOwogICB+Q0ZQRl9Ta2lhRGV2aWNlTW9kdWxlKCk7CiAKICAgdm9pZCBEZXN0cm95KCk7CiAgIENGUEZfU2tpYUZvbnRNZ3IqIEdldEZvbnRNZ3IoKTsKIAogIHByb3RlY3RlZDoKLSAgQ0ZQRl9Ta2lhRm9udE1nciogbV9wRm9udE1ncjsKKyAgc3RkOjp1bmlxdWVfcHRyPENGUEZfU2tpYUZvbnRNZ3I+IG1fcEZvbnRNZ3I7CiB9OwogCiBDRlBGX1NraWFEZXZpY2VNb2R1bGUqIENGUEZfR2V0U2tpYURldmljZU1vZHVsZSgpOwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhZmlsZWZvbnQuY3BwIGIvY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhZmlsZWZvbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZGY1OGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Z2UvYW5kcm9pZC9jZnBmX3NraWFmaWxlZm9udC5jcHAKQEAgLTAsMCArMSwxNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhZmlsZWZvbnQuaCIKKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyZWFtLmgiCisKK0NGUEZfU2tpYUZpbGVGb250OjpDRlBGX1NraWFGaWxlRm9udCgpID0gZGVmYXVsdDsKKworQ0ZQRl9Ta2lhRmlsZUZvbnQ6On5DRlBGX1NraWFGaWxlRm9udCgpID0gZGVmYXVsdDsKKworaW50MzJfdCBDRlBGX1NraWFGaWxlRm9udDo6R2V0VHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEZQRl9TS0lBRk9OVFRZUEVfRmlsZTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWZpbGVmb250LmggYi9jb3JlL2Z4Z2UvYW5kcm9pZC9jZnBmX3NraWFmaWxlZm9udC5oCmluZGV4IDJjOWZjOTAuLjVlMmViYmMgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWZpbGVmb250LmgKKysrIGIvY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhZmlsZWZvbnQuaApAQCAtNyw3ICs3LDcgQEAKICNpZm5kZWYgQ09SRV9GWEdFX0FORFJPSURfQ0ZQRl9TS0lBRklMRUZPTlRfSF8KICNkZWZpbmUgQ09SRV9GWEdFX0FORFJPSURfQ0ZQRl9TS0lBRklMRUZPTlRfSF8KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvYW5kcm9pZC9jZnBmX3NraWFmb250ZGVzY3JpcHRvci5oIgogCiBjbGFzcyBJRlhfU2Vla2FibGVSZWFkU3RyZWFtOwpAQCAtMTYsMTIgKzE2LDEzIEBACiAKIGNsYXNzIENGUEZfU2tpYUZpbGVGb250IDogcHVibGljIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yIHsKICBwdWJsaWM6Ci0gIENGUEZfU2tpYUZpbGVGb250KCkge30KKyAgQ0ZQRl9Ta2lhRmlsZUZvbnQoKTsKKyAgfkNGUEZfU2tpYUZpbGVGb250KCkgb3ZlcnJpZGU7CiAKICAgLy8gQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IKLSAgaW50MzJfdCBHZXRUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gRlBGX1NLSUFGT05UVFlQRV9GaWxlOyB9CisgIGludDMyX3QgR2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlOwogCi0gIENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gbV9wRmlsZTsKKyAgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IG1fcEZpbGU7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlhHRV9BTkRST0lEX0NGUEZfU0tJQUZJTEVGT05UX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvYW5kcm9pZC9jZnBmX3NraWFmb250LmNwcCBiL2NvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWZvbnQuY3BwCmluZGV4IDVlMTFlZmEuLjFjYTBmNTcgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWZvbnQuY3BwCisrKyBiL2NvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWZvbnQuY3BwCkBAIC00MSwxOSArNDEsMTkgQEAKICAgcmV0dXJuIHRoaXM7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENGUEZfU2tpYUZvbnQ6OkdldEZhbWlseU5hbWUoKSB7CitCeXRlU3RyaW5nIENGUEZfU2tpYUZvbnQ6OkdldEZhbWlseU5hbWUoKSB7CiAgIGlmICghbV9GYWNlKQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoRlhGVF9HZXRfRmFjZV9GYW1pbHlfTmFtZShtX0ZhY2UpKTsKKyAgICByZXR1cm4gQnl0ZVN0cmluZygpOworICByZXR1cm4gQnl0ZVN0cmluZyhGWEZUX0dldF9GYWNlX0ZhbWlseV9OYW1lKG1fRmFjZSkpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDRlBGX1NraWFGb250OjpHZXRQc05hbWUoKSB7CitCeXRlU3RyaW5nIENGUEZfU2tpYUZvbnQ6OkdldFBzTmFtZSgpIHsKICAgaWYgKCFtX0ZhY2UpCi0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7CisgICAgcmV0dXJuIEJ5dGVTdHJpbmcoKTsKICAgcmV0dXJuIEZYRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZShtX0ZhY2UpOwogfQogCi1pbnQzMl90IENGUEZfU2tpYUZvbnQ6OkdldEdseXBoSW5kZXgoRlhfV0NIQVIgd1VuaWNvZGUpIHsKK2ludDMyX3QgQ0ZQRl9Ta2lhRm9udDo6R2V0R2x5cGhJbmRleCh3Y2hhcl90IHdVbmljb2RlKSB7CiAgIGlmICghbV9GYWNlKQogICAgIHJldHVybiB3VW5pY29kZTsKICAgaWYgKEZYRlRfU2VsZWN0X0NoYXJtYXAobV9GYWNlLCBGWEZUX0VOQ09ESU5HX1VOSUNPREUpKQpAQCAtMTgxLDcgKzE4MSw3IEBACiAKIGJvb2wgQ0ZQRl9Ta2lhRm9udDo6SW5pdEZvbnQoQ0ZQRl9Ta2lhRm9udE1nciogcEZvbnRNZ3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yKiBwRm9udERlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzRmFtaWx5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHVDaGFyc2V0KSB7CiAgIGlmICghcEZvbnRNZ3IgfHwgIXBGb250RGVzKQpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhZm9udC5oIGIvY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhZm9udC5oCmluZGV4IGI3MmMxMTEuLjFiMmY2MDUgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWZvbnQuaAorKysgYi9jb3JlL2Z4Z2UvYW5kcm9pZC9jZnBmX3NraWFmb250LmgKQEAgLTgsNiArOCw3IEBACiAjZGVmaW5lIENPUkVfRlhHRV9BTkRST0lEX0NGUEZfU0tJQUZPTlRfSF8KIAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mb250LmgiCiAKIGNsYXNzIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yOwpAQCAtMjEsMTEgKzIyLDExIEBACiAgIHZvaWQgUmVsZWFzZSgpOwogICBDRlBGX1NraWFGb250KiBSZXRhaW4oKTsKIAotICBDRlhfQnl0ZVN0cmluZyBHZXRGYW1pbHlOYW1lKCk7Ci0gIENGWF9CeXRlU3RyaW5nIEdldFBzTmFtZSgpOworICBCeXRlU3RyaW5nIEdldEZhbWlseU5hbWUoKTsKKyAgQnl0ZVN0cmluZyBHZXRQc05hbWUoKTsKICAgdWludDMyX3QgR2V0Rm9udFN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9kd1N0eWxlOyB9CiAgIHVpbnQ4X3QgR2V0Q2hhcnNldCgpIGNvbnN0IHsgcmV0dXJuIG1fdUNoYXJzZXQ7IH0KLSAgaW50MzJfdCBHZXRHbHlwaEluZGV4KEZYX1dDSEFSIHdVbmljb2RlKTsKKyAgaW50MzJfdCBHZXRHbHlwaEluZGV4KHdjaGFyX3Qgd1VuaWNvZGUpOwogICBpbnQzMl90IEdldEdseXBoV2lkdGgoaW50MzJfdCBpR2x5cGhJbmRleCk7CiAgIGludDMyX3QgR2V0QXNjZW50KCkgY29uc3Q7CiAgIGludDMyX3QgR2V0RGVzY2VudCgpIGNvbnN0OwpAQCAtMzcsMTMgKzM4LDEzIEBACiAKICAgYm9vbCBJbml0Rm9udChDRlBGX1NraWFGb250TWdyKiBwRm9udE1nciwKICAgICAgICAgICAgICAgICBDRlBGX1NraWFGb250RGVzY3JpcHRvciogcEZvbnREZXMsCi0gICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhbWlseSwKKyAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgYnNGYW1pbHksCiAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdHlsZSwKICAgICAgICAgICAgICAgICB1aW50OF90IHVDaGFyc2V0KTsKIAogIHByaXZhdGU6Ci0gIENGUEZfU2tpYUZvbnRNZ3IqIG1fcEZvbnRNZ3I7Ci0gIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yKiBtX3BGb250RGVzOworICBVbm93bmVkUHRyPENGUEZfU2tpYUZvbnRNZ3I+IG1fcEZvbnRNZ3I7CisgIFVub3duZWRQdHI8Q0ZQRl9Ta2lhRm9udERlc2NyaXB0b3I+IG1fcEZvbnREZXM7CiAgIEZYRlRfRmFjZSBtX0ZhY2U7CiAgIHVpbnQzMl90IG1fZHdTdHlsZTsKICAgdWludDhfdCBtX3VDaGFyc2V0OwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhZm9udGRlc2NyaXB0b3IuY3BwIGIvY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhZm9udGRlc2NyaXB0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZDQ0ODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Z2UvYW5kcm9pZC9jZnBmX3NraWFmb250ZGVzY3JpcHRvci5jcHAKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhZm9udGRlc2NyaXB0b3IuaCIKKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCisKK0NGUEZfU2tpYUZvbnREZXNjcmlwdG9yOjpDRlBGX1NraWFGb250RGVzY3JpcHRvcigpCisgICAgOiBtX3BGYW1pbHkobnVsbHB0ciksCisgICAgICBtX2R3U3R5bGUoMCksCisgICAgICBtX2lGYWNlSW5kZXgoMCksCisgICAgICBtX2R3Q2hhcnNldHMoMCksCisgICAgICBtX2lHbHlwaE51bSgwKSB7fQorCitDRlBGX1NraWFGb250RGVzY3JpcHRvcjo6fkNGUEZfU2tpYUZvbnREZXNjcmlwdG9yKCkgeworICBGWF9GcmVlKG1fcEZhbWlseSk7Cit9CisKK2ludDMyX3QgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3I6OkdldFR5cGUoKSBjb25zdCB7CisgIHJldHVybiBGUEZfU0tJQUZPTlRUWVBFX1Vua25vd247Cit9CisKK3ZvaWQgQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3I6OlNldEZhbWlseShjb25zdCBjaGFyKiBwRmFtaWx5KSB7CisgIEZYX0ZyZWUobV9wRmFtaWx5KTsKKyAgaW50MzJfdCBpU2l6ZSA9IHN0cmxlbihwRmFtaWx5KTsKKyAgbV9wRmFtaWx5ID0gRlhfQWxsb2MoY2hhciwgaVNpemUgKyAxKTsKKyAgbWVtY3B5KG1fcEZhbWlseSwgcEZhbWlseSwgaVNpemUgKiBzaXplb2YoY2hhcikpOworICBtX3BGYW1pbHlbaVNpemVdID0gMDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWZvbnRkZXNjcmlwdG9yLmggYi9jb3JlL2Z4Z2UvYW5kcm9pZC9jZnBmX3NraWFmb250ZGVzY3JpcHRvci5oCmluZGV4IDU3Yjg1NDAuLjAwYTE5ZWMgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWZvbnRkZXNjcmlwdG9yLmgKKysrIGIvY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhZm9udGRlc2NyaXB0b3IuaApAQCAtMTMsMjQgKzEzLDE0IEBACiAKIGNsYXNzIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yIHsKICBwdWJsaWM6Ci0gIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yKCkKLSAgICAgIDogbV9wRmFtaWx5KG51bGxwdHIpLAotICAgICAgICBtX2R3U3R5bGUoMCksCi0gICAgICAgIG1faUZhY2VJbmRleCgwKSwKLSAgICAgICAgbV9kd0NoYXJzZXRzKDApLAotICAgICAgICBtX2lHbHlwaE51bSgwKSB7fQotICB2aXJ0dWFsIH5DRlBGX1NraWFGb250RGVzY3JpcHRvcigpIHsgRlhfRnJlZShtX3BGYW1pbHkpOyB9CisgIENGUEZfU2tpYUZvbnREZXNjcmlwdG9yKCk7CisgIHZpcnR1YWwgfkNGUEZfU2tpYUZvbnREZXNjcmlwdG9yKCk7CiAKLSAgdmlydHVhbCBpbnQzMl90IEdldFR5cGUoKSBjb25zdCB7IHJldHVybiBGUEZfU0tJQUZPTlRUWVBFX1Vua25vd247IH0KKyAgdmlydHVhbCBpbnQzMl90IEdldFR5cGUoKSBjb25zdDsKIAotICB2b2lkIFNldEZhbWlseShjb25zdCBGWF9DSEFSKiBwRmFtaWx5KSB7Ci0gICAgRlhfRnJlZShtX3BGYW1pbHkpOwotICAgIGludDMyX3QgaVNpemUgPSBGWFNZU19zdHJsZW4ocEZhbWlseSk7Ci0gICAgbV9wRmFtaWx5ID0gRlhfQWxsb2MoRlhfQ0hBUiwgaVNpemUgKyAxKTsKLSAgICBGWFNZU19tZW1jcHkobV9wRmFtaWx5LCBwRmFtaWx5LCBpU2l6ZSAqIHNpemVvZihGWF9DSEFSKSk7Ci0gICAgbV9wRmFtaWx5W2lTaXplXSA9IDA7Ci0gIH0KLSAgRlhfQ0hBUiogbV9wRmFtaWx5OworICB2b2lkIFNldEZhbWlseShjb25zdCBjaGFyKiBwRmFtaWx5KTsKKworICBjaGFyKiBtX3BGYW1pbHk7CiAgIHVpbnQzMl90IG1fZHdTdHlsZTsKICAgaW50MzJfdCBtX2lGYWNlSW5kZXg7CiAgIHVpbnQzMl90IG1fZHdDaGFyc2V0czsKZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWZvbnRtZ3IuY3BwIGIvY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhZm9udG1nci5jcHAKaW5kZXggZTM1MTFiZS4uZDhiNzUxZCAxMDA2NDQKLS0tIGEvY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhZm9udG1nci5jcHAKKysrIGIvY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhZm9udG1nci5jcHAKQEAgLTEzLDcgKzEzLDggQEAKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb2RlcGFnZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9tZW1vcnkuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWZvbnQuaCIKQEAgLTM2LDcgKzM3LDggQEAKICAgaWYgKCFwRmlsZVJlYWQpCiAgICAgcmV0dXJuIDA7CiAKLSAgaWYgKCFwRmlsZVJlYWQtPlJlYWRCbG9jayhidWZmZXIsIChGWF9GSUxFU0laRSlvZmZzZXQsIChzaXplX3QpY291bnQpKQorICBpZiAoIXBGaWxlUmVhZC0+UmVhZEJsb2NrKGJ1ZmZlciwgKEZYX0ZJTEVTSVpFKW9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KGNvdW50KSkpCiAgICAgcmV0dXJuIDA7CiAKICAgcmV0dXJuIGNvdW50OwpAQCAtODcsMTIgKzg5LDEyIEBACiAgIHJldHVybiAwOwogfQogCi11aW50MzJfdCBGUEZfR2V0SGFzaENvZGVfU3RyaW5nQShjb25zdCBGWF9DSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpIHsKK3VpbnQzMl90IEZQRl9HZXRIYXNoQ29kZV9TdHJpbmdBKGNvbnN0IGNoYXIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCkgewogICBpZiAoIXBTdHIpCiAgICAgcmV0dXJuIDA7CiAgIGlmIChpTGVuZ3RoIDwgMCkKLSAgICBpTGVuZ3RoID0gRlhTWVNfc3RybGVuKHBTdHIpOwotICBjb25zdCBGWF9DSEFSKiBwU3RyRW5kID0gcFN0ciArIGlMZW5ndGg7CisgICAgaUxlbmd0aCA9IHN0cmxlbihwU3RyKTsKKyAgY29uc3QgY2hhciogcFN0ckVuZCA9IHBTdHIgKyBpTGVuZ3RoOwogICB1aW50MzJfdCB1SGFzaENvZGUgPSAwOwogICB3aGlsZSAocFN0ciA8IHBTdHJFbmQpCiAgICAgdUhhc2hDb2RlID0gMzEgKiB1SGFzaENvZGUgKyBGWFNZU190b2xvd2VyKCpwU3RyKyspOwpAQCAtMTIzLDQ2ICsxMjUsNDYgQEAKIAogdWludDMyX3QgRlBGX1NraWFHZXRDaGFyc2V0KHVpbnQ4X3QgdUNoYXJzZXQpIHsKICAgc3dpdGNoICh1Q2hhcnNldCkgewotICAgIGNhc2UgRlhGT05UX0FOU0lfQ0hBUlNFVDoKKyAgICBjYXNlIEZYX0NIQVJTRVRfQU5TSToKICAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfQW5zaTsKLSAgICBjYXNlIEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQ6CisgICAgY2FzZSBGWF9DSEFSU0VUX0RlZmF1bHQ6CiAgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX0RlZmF1bHQ7Ci0gICAgY2FzZSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQ6CisgICAgY2FzZSBGWF9DSEFSU0VUX1N5bWJvbDoKICAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfU3ltYm9sOwotICAgIGNhc2UgRlhGT05UX1NISUZUSklTX0NIQVJTRVQ6CisgICAgY2FzZSBGWF9DSEFSU0VUX1NoaWZ0SklTOgogICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9TaGlmdEpJUzsKLSAgICBjYXNlIEZYRk9OVF9IQU5HVUxfQ0hBUlNFVDoKKyAgICBjYXNlIEZYX0NIQVJTRVRfSGFuZ3VsOgogICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9Lb3JlYW47Ci0gICAgY2FzZSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQ6CisgICAgY2FzZSBGWF9DSEFSU0VUX0NoaW5lc2VTaW1wbGlmaWVkOgogICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9HQjIzMTI7Ci0gICAgY2FzZSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVDoKKyAgICBjYXNlIEZYX0NIQVJTRVRfQ2hpbmVzZVRyYWRpdGlvbmFsOgogICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9CSUc1OwotICAgIGNhc2UgRlhGT05UX0dSRUVLX0NIQVJTRVQ6CisgICAgY2FzZSBGWF9DSEFSU0VUX01TV2luX0dyZWVrOgogICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9HcmVlazsKLSAgICBjYXNlIEZYRk9OVF9UVVJLSVNIX0NIQVJTRVQ6CisgICAgY2FzZSBGWF9DSEFSU0VUX01TV2luX1R1cmtpc2g6CiAgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX1R1cmtpc2g7Ci0gICAgY2FzZSBGWEZPTlRfSEVCUkVXX0NIQVJTRVQ6CisgICAgY2FzZSBGWF9DSEFSU0VUX01TV2luX0hlYnJldzoKICAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfSGVicmV3OwotICAgIGNhc2UgRlhGT05UX0FSQUJJQ19DSEFSU0VUOgorICAgIGNhc2UgRlhfQ0hBUlNFVF9NU1dpbl9BcmFiaWM6CiAgICAgICByZXR1cm4gRlBGX1NLSUFDSEFSU0VUX0FyYWJpYzsKLSAgICBjYXNlIEZYRk9OVF9CQUxUSUNfQ0hBUlNFVDoKKyAgICBjYXNlIEZYX0NIQVJTRVRfTVNXaW5fQmFsdGljOgogICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9CYWx0aWM7Ci0gICAgY2FzZSBGWEZPTlRfUlVTU0lBTl9DSEFSU0VUOgorICAgIGNhc2UgRlhfQ0hBUlNFVF9NU1dpbl9DeXJpbGxpYzoKICAgICAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfQ3lyaWxsaWM7Ci0gICAgY2FzZSBGWEZPTlRfVEhBSV9DSEFSU0VUOgorICAgIGNhc2UgRlhfQ0hBUlNFVF9UaGFpOgogICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9UaGFpOwotICAgIGNhc2UgRlhGT05UX0VBU1RFVVJPUEVfQ0hBUlNFVDoKKyAgICBjYXNlIEZYX0NIQVJTRVRfTVNXaW5fRWFzdGVybkV1cm9wZWFuOgogICAgICAgcmV0dXJuIEZQRl9TS0lBQ0hBUlNFVF9FZWFzdGVybkV1cm9wZWFuOwogICB9CiAgIHJldHVybiBGUEZfU0tJQUNIQVJTRVRfRGVmYXVsdDsKIH0KIAotdWludDMyX3QgRlBGX1NLSUFOb3JtYWxpemVGb250TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzZmFtaWx5KSB7Cit1aW50MzJfdCBGUEZfU0tJQU5vcm1hbGl6ZUZvbnROYW1lKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBic2ZhbWlseSkgewogICB1aW50MzJfdCBkd0hhc2ggPSAwOwogICBpbnQzMl90IGlMZW5ndGggPSBic2ZhbWlseS5HZXRMZW5ndGgoKTsKLSAgY29uc3QgRlhfQ0hBUiogcEJ1ZmZlciA9IGJzZmFtaWx5LmNfc3RyKCk7CisgIGNvbnN0IGNoYXIqIHBCdWZmZXIgPSBic2ZhbWlseS51bnRlcm1pbmF0ZWRfY19zdHIoKTsKICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxlbmd0aDsgaSsrKSB7Ci0gICAgRlhfQ0hBUiBjaCA9IHBCdWZmZXJbaV07CisgICAgY2hhciBjaCA9IHBCdWZmZXJbaV07CiAgICAgaWYgKGNoID09ICcgJyB8fCBjaCA9PSAnLScgfHwgY2ggPT0gJywnKQogICAgICAgY29udGludWU7CiAgICAgZHdIYXNoID0gMzEgKiBkd0hhc2ggKyBGWFNZU190b2xvd2VyKGNoKTsKQEAgLTE3MCwzNyArMTcyLDM2IEBACiAgIHJldHVybiBkd0hhc2g7CiB9CiAKLXVpbnQzMl90IEZQRl9TS0lBR2V0RmFtaWx5SGFzaChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmFtaWx5LAordWludDMyX3QgRlBGX1NLSUFHZXRGYW1pbHlIYXNoKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBic0ZhbWlseSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdUNoYXJzZXQpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgYnNGb250KGJzRmFtaWx5KTsKLSAgaWYgKGR3U3R5bGUgJiBGWEZPTlRfQk9MRCkKKyAgQnl0ZVN0cmluZyBic0ZvbnQoYnNGYW1pbHkpOworICBpZiAoRm9udFN0eWxlSXNCb2xkKGR3U3R5bGUpKQogICAgIGJzRm9udCArPSAiQm9sZCI7Ci0gIGlmIChkd1N0eWxlICYgRlhGT05UX0lUQUxJQykKKyAgaWYgKEZvbnRTdHlsZUlzSXRhbGljKGR3U3R5bGUpKQogICAgIGJzRm9udCArPSAiSXRhbGljIjsKLSAgaWYgKGR3U3R5bGUgJiBGWEZPTlRfU0VSSUYpCisgIGlmIChGb250U3R5bGVJc1NlcmlmKGR3U3R5bGUpKQogICAgIGJzRm9udCArPSAiU2VyaWYiOwogICBic0ZvbnQgKz0gdUNoYXJzZXQ7CiAgIHJldHVybiBGUEZfR2V0SGFzaENvZGVfU3RyaW5nQShic0ZvbnQuY19zdHIoKSwgYnNGb250LkdldExlbmd0aCgpKTsKIH0KIAogYm9vbCBGUEZfU2tpYUlzQ0pLKHVpbnQ4X3QgdUNoYXJzZXQpIHsKLSAgcmV0dXJuICh1Q2hhcnNldCA9PSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQpIHx8Ci0gICAgICAgICAodUNoYXJzZXQgPT0gRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQpIHx8Ci0gICAgICAgICAodUNoYXJzZXQgPT0gRlhGT05UX0hBTkdVTF9DSEFSU0VUKSB8fAotICAgICAgICAgKHVDaGFyc2V0ID09IEZYRk9OVF9TSElGVEpJU19DSEFSU0VUKTsKKyAgcmV0dXJuICh1Q2hhcnNldCA9PSBGWF9DSEFSU0VUX0NoaW5lc2VTaW1wbGlmaWVkKSB8fAorICAgICAgICAgKHVDaGFyc2V0ID09IEZYX0NIQVJTRVRfQ2hpbmVzZVRyYWRpdGlvbmFsKSB8fAorICAgICAgICAgKHVDaGFyc2V0ID09IEZYX0NIQVJTRVRfSGFuZ3VsKSB8fCAodUNoYXJzZXQgPT0gRlhfQ0hBUlNFVF9TaGlmdEpJUyk7CiB9CiAKLWJvb2wgRlBGX1NraWFNYXliZVN5bWJvbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmFjZW5hbWUpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lKGJzRmFjZW5hbWUpOworYm9vbCBGUEZfU2tpYU1heWJlU3ltYm9sKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBic0ZhY2VuYW1lKSB7CisgIEJ5dGVTdHJpbmcgYnNOYW1lKGJzRmFjZW5hbWUpOwogICBic05hbWUuTWFrZUxvd2VyKCk7Ci0gIHJldHVybiBic05hbWUuRmluZCgic3ltYm9sIikgPiAtMTsKKyAgcmV0dXJuIGJzTmFtZS5Db250YWlucygic3ltYm9sIik7CiB9CiAKLWJvb2wgRlBGX1NraWFNYXliZUFyYWJpYyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmFjZW5hbWUpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lKGJzRmFjZW5hbWUpOworYm9vbCBGUEZfU2tpYU1heWJlQXJhYmljKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBic0ZhY2VuYW1lKSB7CisgIEJ5dGVTdHJpbmcgYnNOYW1lKGJzRmFjZW5hbWUpOwogICBic05hbWUuTWFrZUxvd2VyKCk7Ci0gIHJldHVybiBic05hbWUuRmluZCgiYXJhYmljIikgPiAtMTsKKyAgcmV0dXJuIGJzTmFtZS5Db250YWlucygiYXJhYmljIik7CiB9CiAKIGNvbnN0IHVpbnQzMl90IGdfRlBGU2tpYUZvbnRDaGFyc2V0c1tdID0gewpAQCAtMjgwLDcgKzI4MSw3IEBACiAgIG1fYkxvYWRlZCA9IHRydWU7CiB9CiAKLUNGUEZfU2tpYUZvbnQqIENGUEZfU2tpYUZvbnRNZ3I6OkNyZWF0ZUZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZhbWlseW5hbWUsCitDRlBGX1NraWFGb250KiBDRlBGX1NraWFGb250TWdyOjpDcmVhdGVGb250KGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBic0ZhbWlseW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdUNoYXJzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3TWF0Y2gpIHsKQEAgLTI5NSwxMSArMjk2LDEyIEBACiAgIHVpbnQzMl90IGR3U3Vic3RTYW5zID0gRlBGX1NraWFHZXRTdWJzdEZvbnQoZHdGYWNlTmFtZSwgZ19Ta2lhU2Fuc0ZvbnRNYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQXJyYXlTaXplKGdfU2tpYVNhbnNGb250TWFwKSk7CiAgIGJvb2wgYk1heWJlU3ltYm9sID0gRlBGX1NraWFNYXliZVN5bWJvbChic0ZhbWlseW5hbWUpOwotICBpZiAodUNoYXJzZXQgIT0gRlhGT05UX0FSQUJJQ19DSEFSU0VUICYmIEZQRl9Ta2lhTWF5YmVBcmFiaWMoYnNGYW1pbHluYW1lKSkgewotICAgIHVDaGFyc2V0ID0gRlhGT05UX0FSQUJJQ19DSEFSU0VUOwotICB9IGVsc2UgaWYgKHVDaGFyc2V0ID09IEZYRk9OVF9BTlNJX0NIQVJTRVQgJiYKKyAgaWYgKHVDaGFyc2V0ICE9IEZYX0NIQVJTRVRfTVNXaW5fQXJhYmljICYmCisgICAgICBGUEZfU2tpYU1heWJlQXJhYmljKGJzRmFtaWx5bmFtZSkpIHsKKyAgICB1Q2hhcnNldCA9IEZYX0NIQVJTRVRfTVNXaW5fQXJhYmljOworICB9IGVsc2UgaWYgKHVDaGFyc2V0ID09IEZYX0NIQVJTRVRfQU5TSSAmJgogICAgICAgICAgICAgIChkd01hdGNoICYgRlBGX01BVENIRk9OVF9SRVBMQUNFQU5TSSkpIHsKLSAgICB1Q2hhcnNldCA9IEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQ7CisgICAgdUNoYXJzZXQgPSBGWF9DSEFSU0VUX0RlZmF1bHQ7CiAgIH0KICAgaW50MzJfdCBuRXhwZWN0VmFsID0gRlBGX1NLSUFNQVRDSFdFSUdIVF9OQU1FMSArIEZQRl9TS0lBTUFUQ0hXRUlHSFRfMSAqIDMgKwogICAgICAgICAgICAgICAgICAgICAgICBGUEZfU0tJQU1BVENIV0VJR0hUXzIgKiAyOwpAQCAtMzE1LDIzICszMTcsMjMgQEAKICAgICBpZiAoZHdGYWNlTmFtZSA9PSBkd1N5c0ZvbnROYW1lKQogICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF9OQU1FMTsKICAgICBib29sIGJNYXRjaGVkTmFtZSA9IChuRmluZCA9PSBGUEZfU0tJQU1BVENIV0VJR0hUX05BTUUxKTsKLSAgICBpZiAoKGR3U3R5bGUgJiBGWEZPTlRfQk9MRCkgPT0gKHBGb250RGVzLT5tX2R3U3R5bGUgJiBGWEZPTlRfQk9MRCkpCisgICAgaWYgKEZvbnRTdHlsZUlzQm9sZChkd1N0eWxlKSA9PSBGb250U3R5bGVJc0JvbGQocEZvbnREZXMtPm1fZHdTdHlsZSkpCiAgICAgICBuRmluZCArPSBGUEZfU0tJQU1BVENIV0VJR0hUXzE7Ci0gICAgaWYgKChkd1N0eWxlICYgRlhGT05UX0lUQUxJQykgPT0gKHBGb250RGVzLT5tX2R3U3R5bGUgJiBGWEZPTlRfSVRBTElDKSkKKyAgICBpZiAoRm9udFN0eWxlSXNJdGFsaWMoZHdTdHlsZSkgPT0gRm9udFN0eWxlSXNJdGFsaWMocEZvbnREZXMtPm1fZHdTdHlsZSkpCiAgICAgICBuRmluZCArPSBGUEZfU0tJQU1BVENIV0VJR0hUXzE7Ci0gICAgaWYgKChkd1N0eWxlICYgRlhGT05UX0ZJWEVEX1BJVENIKSA9PQotICAgICAgICAocEZvbnREZXMtPm1fZHdTdHlsZSAmIEZYRk9OVF9GSVhFRF9QSVRDSCkpIHsKKyAgICBpZiAoRm9udFN0eWxlSXNGaXhlZFBpdGNoKGR3U3R5bGUpID09CisgICAgICAgIEZvbnRTdHlsZUlzRml4ZWRQaXRjaChwRm9udERlcy0+bV9kd1N0eWxlKSkgewogICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF8yOwogICAgIH0KLSAgICBpZiAoKGR3U3R5bGUgJiBGWEZPTlRfU0VSSUYpID09IChwRm9udERlcy0+bV9kd1N0eWxlICYgRlhGT05UX1NFUklGKSkKKyAgICBpZiAoRm9udFN0eWxlSXNTZXJpZihkd1N0eWxlKSA9PSBGb250U3R5bGVJc1NlcmlmKHBGb250RGVzLT5tX2R3U3R5bGUpKQogICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF8xOwotICAgIGlmICgoZHdTdHlsZSAmIEZYRk9OVF9TQ1JJUFQpID09IChwRm9udERlcy0+bV9kd1N0eWxlICYgRlhGT05UX1NDUklQVCkpCisgICAgaWYgKEZvbnRTdHlsZUlzU2NyaXB0KGR3U3R5bGUpID09IEZvbnRTdHlsZUlzU2NyaXB0KHBGb250RGVzLT5tX2R3U3R5bGUpKQogICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF8yOwogICAgIGlmIChkd1N1YnN0ID09IGR3U3lzRm9udE5hbWUgfHwgZHdTdWJzdFNhbnMgPT0gZHdTeXNGb250TmFtZSkgewogICAgICAgbkZpbmQgKz0gRlBGX1NLSUFNQVRDSFdFSUdIVF9OQU1FMjsKICAgICAgIGJNYXRjaGVkTmFtZSA9IHRydWU7CiAgICAgfQotICAgIGlmICh1Q2hhcnNldCA9PSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUIHx8IGJNYXliZVN5bWJvbCkgeworICAgIGlmICh1Q2hhcnNldCA9PSBGWF9DSEFSU0VUX0RlZmF1bHQgfHwgYk1heWJlU3ltYm9sKSB7CiAgICAgICBpZiAobkZpbmQgPiBuTWF4ICYmIGJNYXRjaGVkTmFtZSkgewogICAgICAgICBuTWF4ID0gbkZpbmQ7CiAgICAgICAgIHBCZXN0Rm9udERlcyA9ICppdDsKQEAgLTM2Miw3ICszNjQsNyBAQAogfQogCiBGWEZUX0ZhY2UgQ0ZQRl9Ta2lhRm9udE1ncjo6R2V0Rm9udEZhY2UoCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGVSZWFkLAorICAgIGNvbnN0IFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGVSZWFkLAogICAgIGludDMyX3QgaUZhY2VJbmRleCkgewogICBpZiAoIXBGaWxlUmVhZCkKICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTM3MSw3ICszNzMsNyBAQAogICBpZiAoaUZhY2VJbmRleCA8IDApCiAgICAgcmV0dXJuIG51bGxwdHI7CiAgIEZYRlRfU3RyZWFtUmVjIHN0cmVhbVJlYzsKLSAgRlhTWVNfbWVtc2V0KCZzdHJlYW1SZWMsIDAsIHNpemVvZihGWEZUX1N0cmVhbVJlYykpOworICBtZW1zZXQoJnN0cmVhbVJlYywgMCwgc2l6ZW9mKEZYRlRfU3RyZWFtUmVjKSk7CiAgIHN0cmVhbVJlYy5zaXplID0gcEZpbGVSZWFkLT5HZXRTaXplKCk7CiAgIHN0cmVhbVJlYy5kZXNjcmlwdG9yLnBvaW50ZXIgPSBzdGF0aWNfY2FzdDx2b2lkKj4ocEZpbGVSZWFkLkdldCgpKTsKICAgc3RyZWFtUmVjLnJlYWQgPSBGUEZfU2tpYVN0cmVhbV9SZWFkOwpAQCAtMzg2LDcgKzM4OCw3IEBACiAgIHJldHVybiBmYWNlOwogfQogCi1GWEZUX0ZhY2UgQ0ZQRl9Ta2lhRm9udE1ncjo6R2V0Rm9udEZhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0ZpbGUsCitGWEZUX0ZhY2UgQ0ZQRl9Ta2lhRm9udE1ncjo6R2V0Rm9udEZhY2UoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzRmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlGYWNlSW5kZXgpIHsKICAgaWYgKGJzRmlsZS5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC0zOTQsNyArMzk2LDcgQEAKICAgICByZXR1cm4gbnVsbHB0cjsKICAgRlhGVF9PcGVuX0FyZ3MgYXJnczsKICAgYXJncy5mbGFncyA9IEZUX09QRU5fUEFUSE5BTUU7Ci0gIGFyZ3MucGF0aG5hbWUgPSBjb25zdF9jYXN0PEZUX1N0cmluZyo+KGJzRmlsZS5jX3N0cigpKTsKKyAgYXJncy5wYXRobmFtZSA9IGNvbnN0X2Nhc3Q8RlRfU3RyaW5nKj4oYnNGaWxlLnVudGVybWluYXRlZF9jX3N0cigpKTsKICAgRlhGVF9GYWNlIGZhY2U7CiAgIGlmIChGWEZUX09wZW5fRmFjZShtX0ZUTGlicmFyeSwgJmFyZ3MsIGlGYWNlSW5kZXgsICZmYWNlKSkKICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTQyMCwyMyArNDIyLDIzIEBACiAgIHJldHVybiBmYWNlOwogfQogCi12b2lkIENGUEZfU2tpYUZvbnRNZ3I6OlNjYW5QYXRoKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBwYXRoKSB7Cit2b2lkIENGUEZfU2tpYUZvbnRNZ3I6OlNjYW5QYXRoKGNvbnN0IEJ5dGVTdHJpbmcmIHBhdGgpIHsKICAgRElSKiBoYW5kbGUgPSBGWF9PcGVuRm9sZGVyKHBhdGguY19zdHIoKSk7CiAgIGlmICghaGFuZGxlKQogICAgIHJldHVybjsKLSAgQ0ZYX0J5dGVTdHJpbmcgZmlsZW5hbWU7CisgIEJ5dGVTdHJpbmcgZmlsZW5hbWU7CiAgIGJvb2wgYkZvbGRlciA9IGZhbHNlOwogICB3aGlsZSAoRlhfR2V0TmV4dEZpbGUoaGFuZGxlLCAmZmlsZW5hbWUsICZiRm9sZGVyKSkgewogICAgIGlmIChiRm9sZGVyKSB7CiAgICAgICBpZiAoZmlsZW5hbWUgPT0gIi4iIHx8IGZpbGVuYW1lID09ICIuLiIpCiAgICAgICAgIGNvbnRpbnVlOwogICAgIH0gZWxzZSB7Ci0gICAgICBDRlhfQnl0ZVN0cmluZyBleHQgPSBmaWxlbmFtZS5SaWdodCg0KTsKKyAgICAgIEJ5dGVTdHJpbmcgZXh0ID0gZmlsZW5hbWUuUmlnaHQoNCk7CiAgICAgICBleHQuTWFrZUxvd2VyKCk7CiAgICAgICBpZiAoZXh0ICE9ICIudHRmIiAmJiBleHQgIT0gIi50dGMiICYmIGV4dCAhPSAiLm90ZiIpCiAgICAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICBDRlhfQnl0ZVN0cmluZyBmdWxscGF0aChwYXRoKTsKKyAgICBCeXRlU3RyaW5nIGZ1bGxwYXRoKHBhdGgpOwogICAgIGZ1bGxwYXRoICs9ICIvIjsKICAgICBmdWxscGF0aCArPSBmaWxlbmFtZTsKICAgICBpZiAoYkZvbGRlcikKQEAgLTQ0Nyw4ICs0NDksOCBAQAogICBGWF9DbG9zZUZvbGRlcihoYW5kbGUpOwogfQogCi12b2lkIENGUEZfU2tpYUZvbnRNZ3I6OlNjYW5GaWxlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmaWxlKSB7Ci0gIEZYRlRfRmFjZSBmYWNlID0gR2V0Rm9udEZhY2UoZmlsZS5Bc1N0cmluZ0MoKSk7Cit2b2lkIENGUEZfU2tpYUZvbnRNZ3I6OlNjYW5GaWxlKGNvbnN0IEJ5dGVTdHJpbmcmIGZpbGUpIHsKKyAgRlhGVF9GYWNlIGZhY2UgPSBHZXRGb250RmFjZShmaWxlLkFzU3RyaW5nVmlldygpKTsKICAgaWYgKCFmYWNlKQogICAgIHJldHVybjsKICAgQ0ZQRl9Ta2lhUGF0aEZvbnQqIHBGb250RGVzYyA9IG5ldyBDRlBGX1NraWFQYXRoRm9udDsKZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWZvbnRtZ3IuaCBiL2NvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWZvbnRtZ3IuaAppbmRleCA0ZDBlYTBlLi4xMWFkNDdhIDEwMDY0NAotLS0gYS9jb3JlL2Z4Z2UvYW5kcm9pZC9jZnBmX3NraWFmb250bWdyLmgKKysrIGIvY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhZm9udG1nci5oCkBAIC0yNSwyMiArMjUsMjIgQEAKICAgfkNGUEZfU2tpYUZvbnRNZ3IoKTsKIAogICB2b2lkIExvYWRTeXN0ZW1Gb250cygpOwotICBDRlBGX1NraWFGb250KiBDcmVhdGVGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNGYW1pbHluYW1lLAorICBDRlBGX1NraWFGb250KiBDcmVhdGVGb250KGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBic0ZhbWlseW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB1Q2hhcnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3TWF0Y2ggPSAwKTsKIAogICBib29sIEluaXRGVExpYnJhcnkoKTsKLSAgRlhGVF9GYWNlIEdldEZvbnRGYWNlKGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBGaWxlUmVhZCwKKyAgRlhGVF9GYWNlIEdldEZvbnRGYWNlKGNvbnN0IFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGVSZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmFjZUluZGV4ID0gMCk7Ci0gIEZYRlRfRmFjZSBHZXRGb250RmFjZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzRmlsZSwgaW50MzJfdCBpRmFjZUluZGV4ID0gMCk7CisgIEZYRlRfRmFjZSBHZXRGb250RmFjZShjb25zdCBCeXRlU3RyaW5nVmlldyYgYnNGaWxlLCBpbnQzMl90IGlGYWNlSW5kZXggPSAwKTsKICAgRlhGVF9GYWNlIEdldEZvbnRGYWNlKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3pCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlGYWNlSW5kZXggPSAwKTsKIAogIHByaXZhdGU6Ci0gIHZvaWQgU2NhblBhdGgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHBhdGgpOwotICB2b2lkIFNjYW5GaWxlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmaWxlKTsKKyAgdm9pZCBTY2FuUGF0aChjb25zdCBCeXRlU3RyaW5nJiBwYXRoKTsKKyAgdm9pZCBTY2FuRmlsZShjb25zdCBCeXRlU3RyaW5nJiBmaWxlKTsKICAgdm9pZCBSZXBvcnRGYWNlKEZYRlRfRmFjZSBmYWNlLCBDRlBGX1NraWFGb250RGVzY3JpcHRvciogcEZvbnREZXNjKTsKIAogICBib29sIG1fYkxvYWRlZDsKZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYXBhdGhmb250LmNwcCBiL2NvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYXBhdGhmb250LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2Y0ZmRlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhcGF0aGZvbnQuY3BwCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYXBhdGhmb250LmgiCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgorCitDRlBGX1NraWFQYXRoRm9udDo6Q0ZQRl9Ta2lhUGF0aEZvbnQoKSA6IG1fcFBhdGgobnVsbHB0cikge30KKworQ0ZQRl9Ta2lhUGF0aEZvbnQ6On5DRlBGX1NraWFQYXRoRm9udCgpIHsKKyAgRlhfRnJlZShtX3BQYXRoKTsKK30KKworaW50MzJfdCBDRlBGX1NraWFQYXRoRm9udDo6R2V0VHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEZQRl9TS0lBRk9OVFRZUEVfUGF0aDsKK30KKwordm9pZCBDRlBGX1NraWFQYXRoRm9udDo6U2V0UGF0aChjb25zdCBjaGFyKiBwUGF0aCkgeworICBGWF9GcmVlKG1fcFBhdGgpOworICBpbnQzMl90IGlTaXplID0gc3RybGVuKHBQYXRoKTsKKyAgbV9wUGF0aCA9IEZYX0FsbG9jKGNoYXIsIGlTaXplICsgMSk7CisgIG1lbWNweShtX3BQYXRoLCBwUGF0aCwgaVNpemUgKiBzaXplb2YoY2hhcikpOworICBtX3BQYXRoW2lTaXplXSA9IDA7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvYW5kcm9pZC9jZnBmX3NraWFwYXRoZm9udC5oIGIvY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhcGF0aGZvbnQuaAppbmRleCBmMWNmZjI1Li42Y2JhNDJhIDEwMDY0NAotLS0gYS9jb3JlL2Z4Z2UvYW5kcm9pZC9jZnBmX3NraWFwYXRoZm9udC5oCisrKyBiL2NvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYXBhdGhmb250LmgKQEAgLTE0LDIwICsxNCwxNSBAQAogCiBjbGFzcyBDRlBGX1NraWFQYXRoRm9udCA6IHB1YmxpYyBDRlBGX1NraWFGb250RGVzY3JpcHRvciB7CiAgcHVibGljOgotICBDRlBGX1NraWFQYXRoRm9udCgpIDogbV9wUGF0aChudWxscHRyKSB7fQotICB+Q0ZQRl9Ta2lhUGF0aEZvbnQoKSBvdmVycmlkZSB7IEZYX0ZyZWUobV9wUGF0aCk7IH0KKyAgQ0ZQRl9Ta2lhUGF0aEZvbnQoKTsKKyAgfkNGUEZfU2tpYVBhdGhGb250KCkgb3ZlcnJpZGU7CiAKICAgLy8gQ0ZQRl9Ta2lhRm9udERlc2NyaXB0b3IKLSAgaW50MzJfdCBHZXRUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gRlBGX1NLSUFGT05UVFlQRV9QYXRoOyB9CisgIGludDMyX3QgR2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZvaWQgU2V0UGF0aChjb25zdCBGWF9DSEFSKiBwUGF0aCkgewotICAgIEZYX0ZyZWUobV9wUGF0aCk7Ci0gICAgaW50MzJfdCBpU2l6ZSA9IEZYU1lTX3N0cmxlbihwUGF0aCk7Ci0gICAgbV9wUGF0aCA9IEZYX0FsbG9jKEZYX0NIQVIsIGlTaXplICsgMSk7Ci0gICAgRlhTWVNfbWVtY3B5KG1fcFBhdGgsIHBQYXRoLCBpU2l6ZSAqIHNpemVvZihGWF9DSEFSKSk7Ci0gICAgbV9wUGF0aFtpU2l6ZV0gPSAwOwotICB9Ci0gIEZYX0NIQVIqIG1fcFBhdGg7CisgIHZvaWQgU2V0UGF0aChjb25zdCBjaGFyKiBwUGF0aCk7CisKKyAgY2hhciogbV9wUGF0aDsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9GWEdFX0FORFJPSURfQ0ZQRl9TS0lBUEFUSEZPTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9hbmRyb2lkL2NmeF9hbmRyb2lkZm9udGluZm8uY3BwIGIvY29yZS9meGdlL2FuZHJvaWQvY2Z4X2FuZHJvaWRmb250aW5mby5jcHAKaW5kZXggMDNhN2ZmYi4uNjFkMjEzZSAxMDA2NDQKLS0tIGEvY29yZS9meGdlL2FuZHJvaWQvY2Z4X2FuZHJvaWRmb250aW5mby5jcHAKKysrIGIvY29yZS9meGdlL2FuZHJvaWQvY2Z4X2FuZHJvaWRmb250aW5mby5jcHAKQEAgLTMwLDggKzMwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXRhbGljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBpRXhhY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmFjZSkgewogICBpZiAoIW1fcEZvbnRNZ3IpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKQEAgLTQwLDE3ICszOSwxNyBAQAogICAgIGR3U3R5bGUgfD0gRlhGT05UX0JPTEQ7CiAgIGlmIChiSXRhbGljKQogICAgIGR3U3R5bGUgfD0gRlhGT05UX0lUQUxJQzsKLSAgaWYgKHBpdGNoX2ZhbWlseSAmIEZYRk9OVF9GRl9GSVhFRFBJVENIKQorICBpZiAoRm9udEZhbWlseUlzRml4ZWRQaXRjaChwaXRjaF9mYW1pbHkpKQogICAgIGR3U3R5bGUgfD0gRlhGT05UX0ZJWEVEX1BJVENIOwotICBpZiAocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX1NDUklQVCkKKyAgaWYgKEZvbnRGYW1pbHlJc1NjcmlwdChwaXRjaF9mYW1pbHkpKQogICAgIGR3U3R5bGUgfD0gRlhGT05UX1NDUklQVDsKLSAgaWYgKHBpdGNoX2ZhbWlseSAmIEZYRk9OVF9GRl9ST01BTikKKyAgaWYgKEZvbnRGYW1pbHlJc1JvbWFuKHBpdGNoX2ZhbWlseSkpCiAgICAgZHdTdHlsZSB8PSBGWEZPTlRfU0VSSUY7CiAgIHJldHVybiBtX3BGb250TWdyLT5DcmVhdGVGb250KGZhY2UsIGNoYXJzZXQsIGR3U3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQRl9NQVRDSEZPTlRfUkVQTEFDRUFOU0kpOwogfQogCi12b2lkKiBDRlhfQW5kcm9pZEZvbnRJbmZvOjpHZXRGb250KGNvbnN0IEZYX0NIQVIqIGZhY2UpIHsKK3ZvaWQqIENGWF9BbmRyb2lkRm9udEluZm86OkdldEZvbnQoY29uc3QgY2hhciogZmFjZSkgewogICByZXR1cm4gbnVsbHB0cjsKIH0KIApAQCAtNjMsMTkgKzYyLDE5IEBACiAgIHJldHVybiBzdGF0aWNfY2FzdDxDRlBGX1NraWFGb250Kj4oaEZvbnQpLT5HZXRGb250RGF0YSh0YWJsZSwgYnVmZmVyLCBzaXplKTsKIH0KIAotYm9vbCBDRlhfQW5kcm9pZEZvbnRJbmZvOjpHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpIHsKK2Jvb2wgQ0ZYX0FuZHJvaWRGb250SW5mbzo6R2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIEJ5dGVTdHJpbmcqIG5hbWUpIHsKICAgaWYgKCFoRm9udCkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgbmFtZSA9IHN0YXRpY19jYXN0PENGUEZfU2tpYUZvbnQqPihoRm9udCktPkdldEZhbWlseU5hbWUoKTsKKyAgKm5hbWUgPSBzdGF0aWNfY2FzdDxDRlBGX1NraWFGb250Kj4oaEZvbnQpLT5HZXRGYW1pbHlOYW1lKCk7CiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENGWF9BbmRyb2lkRm9udEluZm86OkdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpIHsKK2Jvb2wgQ0ZYX0FuZHJvaWRGb250SW5mbzo6R2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCogY2hhcnNldCkgewogICBpZiAoIWhGb250KQogICAgIHJldHVybiBmYWxzZTsKIAotICBjaGFyc2V0ID0gc3RhdGljX2Nhc3Q8Q0ZQRl9Ta2lhRm9udCo+KGhGb250KS0+R2V0Q2hhcnNldCgpOworICAqY2hhcnNldCA9IHN0YXRpY19jYXN0PENGUEZfU2tpYUZvbnQqPihoRm9udCktPkdldENoYXJzZXQoKTsKICAgcmV0dXJuIGZhbHNlOwogfQogCmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvYW5kcm9pZC9jZnhfYW5kcm9pZGZvbnRpbmZvLmggYi9jb3JlL2Z4Z2UvYW5kcm9pZC9jZnhfYW5kcm9pZGZvbnRpbmZvLmgKaW5kZXggOTRlMWRiOC4uZTQ5YjE2MSAxMDA2NDQKLS0tIGEvY29yZS9meGdlL2FuZHJvaWQvY2Z4X2FuZHJvaWRmb250aW5mby5oCisrKyBiL2NvcmUvZnhnZS9hbmRyb2lkL2NmeF9hbmRyb2lkZm9udGluZm8uaApAQCAtOCw4ICs4LDggQEAKICNkZWZpbmUgQ09SRV9GWEdFX0FORFJPSURfQ0ZYX0FORFJPSURGT05USU5GT19IXwogCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mb250bWFwcGVyLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZvbnQuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvaWZ4X3N5c3RlbWZvbnRpbmZvLmgiCiAKIGNsYXNzIENGUEZfU2tpYUZvbnRNZ3I7CkBAIC0yNywxOSArMjcsMTggQEAKICAgICAgICAgICAgICAgICBib29sIGJJdGFsaWMsCiAgICAgICAgICAgICAgICAgaW50IGNoYXJzZXQsCiAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSwKLSAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBmYWNlLAotICAgICAgICAgICAgICAgIGludCYgYkV4YWN0KSBvdmVycmlkZTsKLSAgdm9pZCogR2V0Rm9udChjb25zdCBGWF9DSEFSKiBmYWNlKSBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmYWNlKSBvdmVycmlkZTsKKyAgdm9pZCogR2V0Rm9udChjb25zdCBjaGFyKiBmYWNlKSBvdmVycmlkZTsKICAgdWludDMyX3QgR2V0Rm9udERhdGEodm9pZCogaEZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUpIG92ZXJyaWRlOwotICBib29sIEdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgR2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCYgY2hhcnNldCkgb3ZlcnJpZGU7CisgIGJvb2wgR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIEJ5dGVTdHJpbmcqIG5hbWUpIG92ZXJyaWRlOworICBib29sIEdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQqIGNoYXJzZXQpIG92ZXJyaWRlOwogICB2b2lkIERlbGV0ZUZvbnQodm9pZCogaEZvbnQpIG92ZXJyaWRlOwogCiAgcHJvdGVjdGVkOgotICBDRlBGX1NraWFGb250TWdyKiBtX3BGb250TWdyOworICBVbm93bmVkUHRyPENGUEZfU2tpYUZvbnRNZ3I+IG1fcEZvbnRNZ3I7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlhHRV9BTkRST0lEX0NGWF9BTkRST0lERk9OVElORk9fSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfaW1wLmNwcCBiL2NvcmUvZnhnZS9hbmRyb2lkL2Z4X2FuZHJvaWRfaW1wLmNwcAppbmRleCBiOGU3YzViLi5kYjJmM2VmIDEwMDY0NAotLS0gYS9jb3JlL2Z4Z2UvYW5kcm9pZC9meF9hbmRyb2lkX2ltcC5jcHAKKysrIGIvY29yZS9meGdlL2FuZHJvaWQvZnhfYW5kcm9pZF9pbXAuY3BwCkBAIC0xMSw2ICsxMSw4IEBACiAKICNpbmNsdWRlICJjb3JlL2Z4Z2UvYW5kcm9pZC9jZnBmX3NraWFkZXZpY2Vtb2R1bGUuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvYW5kcm9pZC9jZnhfYW5kcm9pZGZvbnRpbmZvLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mb250bWdyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogCiB2b2lkIENGWF9HRU1vZHVsZTo6SW5pdFBsYXRmb3JtKCkgewogICBDRlBGX1NraWFEZXZpY2VNb2R1bGUqIHBEZXZpY2VNb2R1bGUgPSBDRlBGX0dldFNraWFEZXZpY2VNb2R1bGUoKTsKQEAgLTE5LDcgKzIxLDcgQEAKIAogICBDRlBGX1NraWFGb250TWdyKiBwRm9udE1nciA9IHBEZXZpY2VNb2R1bGUtPkdldEZvbnRNZ3IoKTsKICAgaWYgKHBGb250TWdyKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENGWF9BbmRyb2lkRm9udEluZm8+IHBGb250SW5mbyhuZXcgQ0ZYX0FuZHJvaWRGb250SW5mbyk7CisgICAgYXV0byBwRm9udEluZm8gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0FuZHJvaWRGb250SW5mbz4oKTsKICAgICBwRm9udEluZm8tPkluaXQocEZvbnRNZ3IpOwogICAgIG1fcEZvbnRNZ3ItPlNldFN5c3RlbUZvbnRJbmZvKHN0ZDo6bW92ZShwRm9udEluZm8pKTsKICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2FwcGxlL2FwcGxlX2ludC5oIGIvY29yZS9meGdlL2FwcGxlL2FwcGxlX2ludC5oCmluZGV4IGZlZDZhYmMuLjgyNDE1ZWMgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhnZS9hcHBsZS9hcHBsZV9pbnQuaAorKysgYi9jb3JlL2Z4Z2UvYXBwbGUvYXBwbGVfaW50LmgKQEAgLTE5LDcgKzE5LDcgQEAKIAogY2xhc3MgQ1F1YXJ0ejJEIHsKICBwdWJsaWM6Ci0gIHZvaWQqIGNyZWF0ZUdyYXBoaWNzKENGWF9ESUJpdG1hcCogYml0bWFwKTsKKyAgdm9pZCogY3JlYXRlR3JhcGhpY3MoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIGJpdG1hcCk7CiAgIHZvaWQgZGVzdHJveUdyYXBoaWNzKHZvaWQqIGdyYXBoaWNzKTsKIAogICB2b2lkKiBDcmVhdGVGb250KGNvbnN0IHVpbnQ4X3QqIHBGb250RGF0YSwgdWludDMyX3QgZHdGb250U2l6ZSk7CkBAIC0yNyw3ICsyNyw3IEBACiAgIHZvaWQgc2V0R3JhcGhpY3NUZXh0TWF0cml4KHZvaWQqIGdyYXBoaWNzLCBDRlhfTWF0cml4KiBtYXRyaXgpOwogICBib29sIGRyYXdHcmFwaGljc1N0cmluZyh2b2lkKiBncmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZvbnRTaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogZ2x5cGhJbmRpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBDR1BvaW50KiBnbHlwaFBvc2l0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFycywKZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9hcHBsZS9meF9hcHBsZV9wbGF0Zm9ybS5jcHAgYi9jb3JlL2Z4Z2UvYXBwbGUvZnhfYXBwbGVfcGxhdGZvcm0uY3BwCmluZGV4IGY1NzZlYjAuLjNjMTQyYzYgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhnZS9hcHBsZS9meF9hcHBsZV9wbGF0Zm9ybS5jcHAKKysrIGIvY29yZS9meGdlL2FwcGxlL2Z4X2FwcGxlX3BsYXRmb3JtLmNwcApAQCAtNCw2ICs0LDkgQEAKIAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X2ZpeGVkYnVmZ3Jvdy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCiAKICNpZm5kZWYgX1NLSUFfU1VQUE9SVF8KQEAgLTExLDEzICsxNCwxMiBAQAogI2VuZGlmCiAKICNpbmNsdWRlICJjb3JlL2Z4Z2UvYXBwbGUvYXBwbGVfaW50LmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9jbGlwcmduLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mYWNlY2FjaGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnQuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dlbW9kdWxlLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2RpYl9pbnQuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZ2UvY2Z4X2NsaXByZ24uaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZ2UvZnhfdGV4dF9pbnQuaCIKIAogI2lmbmRlZiBfU0tJQV9TVVBQT1JUXwogCkBAIC0zMCw3ICszMiw3IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAogICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFyZ2IpIHsKICAgaWYgKG5DaGFycyA9PSAwKQogICAgIHJldHVybiB0cnVlOwpAQCAtMTAyLDcgKzEwNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFyZ2IpIHsKICAgaWYgKCFwRm9udCkKICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMjksNyArMTMxLDcgQEAKICAgICByZWN0X2NnID0KICAgICAgICAgQ0dSZWN0TWFrZShtX3BDbGlwUmduLT5HZXRCb3goKS5sZWZ0LCBtX3BDbGlwUmduLT5HZXRCb3goKS50b3AsCiAgICAgICAgICAgICAgICAgICAgbV9wQ2xpcFJnbi0+R2V0Qm94KCkuV2lkdGgoKSwgbV9wQ2xpcFJnbi0+R2V0Qm94KCkuSGVpZ2h0KCkpOwotICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcENsaXBNYXNrID0gbV9wQ2xpcFJnbi0+R2V0TWFzaygpLkdldE9iamVjdCgpOworICAgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBDbGlwTWFzayA9IG1fcENsaXBSZ24tPkdldE1hc2soKTsKICAgICBpZiAocENsaXBNYXNrKSB7CiAgICAgICBDR0RhdGFQcm92aWRlclJlZiBwQ2xpcE1hc2tEYXRhUHJvdmlkZXIgPSBDR0RhdGFQcm92aWRlckNyZWF0ZVdpdGhEYXRhKAogICAgICAgICAgIG51bGxwdHIsIHBDbGlwTWFzay0+R2V0QnVmZmVyKCksCkBAIC0xNjMsNyArMTY1LDcgQEAKIAogdm9pZCBDRlhfRmFjZUNhY2hlOjpEZXN0cm95UGxhdGZvcm0oKSB7fQogCi1DRlhfR2x5cGhCaXRtYXAqIENGWF9GYWNlQ2FjaGU6OlJlbmRlckdseXBoX05hdGl2ZXRleHQoCitzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0dseXBoQml0bWFwPiBDRlhfRmFjZUNhY2hlOjpSZW5kZXJHbHlwaF9OYXRpdmV0ZXh0KAogICAgIGNvbnN0IENGWF9Gb250KiBwRm9udCwKICAgICB1aW50MzJfdCBnbHlwaF9pbmRleCwKICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LApkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2FwcGxlL2Z4X21hY19pbXAuY3BwIGIvY29yZS9meGdlL2FwcGxlL2Z4X21hY19pbXAuY3BwCmluZGV4IGMwNWFlYTMuLmIyMTJmMTUgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhnZS9hcHBsZS9meF9tYWNfaW1wLmNwcAorKysgYi9jb3JlL2Z4Z2UvYXBwbGUvZnhfbWFjX2ltcC5jcHAKQEAgLTUsMTcgKzUsMjEgQEAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KIAorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29kZXBhZ2UuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvYXBwbGUvYXBwbGVfaW50LmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mb2xkZXJmb250aW5mby5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZm9udG1nci5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZ2Vtb2R1bGUuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZ2UvY2Z4X2ZvbGRlcmZvbnRpbmZvLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2lmeF9zeXN0ZW1mb250aW5mby5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAogbmFtZXNwYWNlIHsKIAogY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgRlhfQ0hBUiogbV9wTmFtZTsKLSAgY29uc3QgRlhfQ0hBUiogbV9wU3Vic3ROYW1lOworICBjb25zdCBjaGFyKiBtX3BOYW1lOworICBjb25zdCBjaGFyKiBtX3BTdWJzdE5hbWU7CiB9IGdfQmFzZTE0U3Vic3RzW10gPSB7CiAgICAgeyJDb3VyaWVyIiwgIkNvdXJpZXIgTmV3In0sCiAgICAgeyJDb3VyaWVyLUJvbGQiLCAiQ291cmllciBOZXcgQm9sZCJ9LApAQCAtNDEsMzMgKzQ1LDMwIEBACiAgICAgICAgICAgICAgICAgYm9vbCBiSXRhbGljLAogICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAogICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCi0gICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZmFtaWx5LAotICAgICAgICAgICAgICAgIGludCYgaUV4YWN0KSBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmYW1pbHkpIG92ZXJyaWRlOwogfTsKIAogY29uc3QgY2hhciBKQVBBTl9HT1RISUNbXSA9ICJIaXJhZ2lubyBLYWt1IEdvdGhpYyBQcm8gVzYiOwogY29uc3QgY2hhciBKQVBBTl9NSU5DSE9bXSA9ICJIaXJhZ2lubyBNaW5jaG8gUHJvIFc2IjsKIAotdm9pZCBHZXRKYXBhbmVzZVByZWZlcmVuY2UoQ0ZYX0J5dGVTdHJpbmcqIGZhY2UsIGludCB3ZWlnaHQsIGludCBwaXRjaF9mYW1pbHkpIHsKLSAgaWYgKGZhY2UtPkZpbmQoIkdvdGhpYyIpID49IDApIHsKK3ZvaWQgR2V0SmFwYW5lc2VQcmVmZXJlbmNlKEJ5dGVTdHJpbmcqIGZhY2UsIGludCB3ZWlnaHQsIGludCBwaXRjaF9mYW1pbHkpIHsKKyAgaWYgKGZhY2UtPkNvbnRhaW5zKCJHb3RoaWMiKSkgewogICAgICpmYWNlID0gSkFQQU5fR09USElDOwogICAgIHJldHVybjsKICAgfQotICAqZmFjZSA9ICgocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX1JPTUFOKSB8fCB3ZWlnaHQgPD0gNDAwKSA/IEpBUEFOX01JTkNITwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEpBUEFOX0dPVEhJQzsKKyAgKmZhY2UgPSAoRm9udEZhbWlseUlzUm9tYW4ocGl0Y2hfZmFtaWx5KSB8fCB3ZWlnaHQgPD0gNDAwKSA/IEpBUEFOX01JTkNITworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSkFQQU5fR09USElDOwogfQogCiB2b2lkKiBDRlhfTWFjRm9udEluZm86Ok1hcEZvbnQoaW50IHdlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJdGFsaWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYXJzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBjc3RyX2ZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBpRXhhY3QpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgZmFjZSA9IGNzdHJfZmFjZTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZ19CYXNlMTRTdWJzdHMpOyArK2kpIHsKLSAgICBpZiAoZmFjZSA9PSBDRlhfQnl0ZVN0cmluZ0MoZ19CYXNlMTRTdWJzdHNbaV0ubV9wTmFtZSkpIHsKLSAgICAgIGZhY2UgPSBnX0Jhc2UxNFN1YnN0c1tpXS5tX3BTdWJzdE5hbWU7Ci0gICAgICBpRXhhY3QgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNzdHJfZmFjZSkgeworICBCeXRlU3RyaW5nIGZhY2UgPSBjc3RyX2ZhY2U7CisgIGZvciAoY29uc3QgYXV0byYgc3ViIDogZ19CYXNlMTRTdWJzdHMpIHsKKyAgICBpZiAoZmFjZSA9PSBCeXRlU3RyaW5nVmlldyhzdWIubV9wTmFtZSkpIHsKKyAgICAgIGZhY2UgPSBzdWIubV9wU3Vic3ROYW1lOwogICAgICAgcmV0dXJuIEdldEZvbnQoZmFjZS5jX3N0cigpKTsKICAgICB9CiAgIH0KQEAgLTc5LDUzICs4MCw1MyBAQAogICAvLyBUaW1lcyBOZXcgUm9tYW4uIEEgbW9yZSBzb3BoaXN0aWNhdGVkIGFwcHJvYWNoIHdvdWxkIGJlIHRvIGZpbmQgYWxsIHRoZQogICAvLyBmb250cyBpbiB8bV9Gb250TGlzdHwgd2l0aCB8ZmFjZXwgaW4gdGhlIG5hbWUsIGFuZCBleGFtaW5lIHRoZSBmb250cyB0bwogICAvLyBzZWUgd2hpY2ggYmVzdCBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQgY2hhcmFjdGVyaXN0aWNzLgotICBpZiAoZmFjZS5GaW5kKCJCb2xkIikgPT0gLTEgJiYgZmFjZS5GaW5kKCJJdGFsaWMiKSA9PSAtMSkgewotICAgIENGWF9CeXRlU3RyaW5nIG5ld19mYWNlID0gZmFjZTsKKyAgaWYgKCFmYWNlLkNvbnRhaW5zKCJCb2xkIikgJiYgIWZhY2UuQ29udGFpbnMoIkl0YWxpYyIpKSB7CisgICAgQnl0ZVN0cmluZyBuZXdfZmFjZSA9IGZhY2U7CiAgICAgaWYgKHdlaWdodCA+IDQwMCkKICAgICAgIG5ld19mYWNlICs9ICIgQm9sZCI7CiAgICAgaWYgKGJJdGFsaWMpCiAgICAgICBuZXdfZmFjZSArPSAiIEl0YWxpYyI7CiAgICAgYXV0byBpdCA9IG1fRm9udExpc3QuZmluZChuZXdfZmFjZSk7CiAgICAgaWYgKGl0ICE9IG1fRm9udExpc3QuZW5kKCkpCi0gICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgIHJldHVybiBpdC0+c2Vjb25kLmdldCgpOwogICB9CiAKICAgYXV0byBpdCA9IG1fRm9udExpc3QuZmluZChmYWNlKTsKICAgaWYgKGl0ICE9IG1fRm9udExpc3QuZW5kKCkpCi0gICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgcmV0dXJuIGl0LT5zZWNvbmQuZ2V0KCk7CiAKLSAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0FOU0lfQ0hBUlNFVCAmJiAocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX0ZJWEVEUElUQ0gpKQorICBpZiAoY2hhcnNldCA9PSBGWF9DSEFSU0VUX0FOU0kgJiYgRm9udEZhbWlseUlzRml4ZWRQaXRjaChwaXRjaF9mYW1pbHkpKQogICAgIHJldHVybiBHZXRGb250KCJDb3VyaWVyIE5ldyIpOwogCi0gIGlmIChjaGFyc2V0ID09IEZYRk9OVF9BTlNJX0NIQVJTRVQgfHwgY2hhcnNldCA9PSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQpCisgIGlmIChjaGFyc2V0ID09IEZYX0NIQVJTRVRfQU5TSSB8fCBjaGFyc2V0ID09IEZYX0NIQVJTRVRfU3ltYm9sKQogICAgIHJldHVybiBudWxscHRyOwogCiAgIHN3aXRjaCAoY2hhcnNldCkgewotICAgIGNhc2UgRlhGT05UX1NISUZUSklTX0NIQVJTRVQ6CisgICAgY2FzZSBGWF9DSEFSU0VUX1NoaWZ0SklTOgogICAgICAgR2V0SmFwYW5lc2VQcmVmZXJlbmNlKCZmYWNlLCB3ZWlnaHQsIHBpdGNoX2ZhbWlseSk7CiAgICAgICBicmVhazsKLSAgICBjYXNlIEZYRk9OVF9HQjIzMTJfQ0hBUlNFVDoKKyAgICBjYXNlIEZYX0NIQVJTRVRfQ2hpbmVzZVNpbXBsaWZpZWQ6CiAgICAgICBmYWNlID0gIlNUU29uZyI7CiAgICAgICBicmVhazsKLSAgICBjYXNlIEZYRk9OVF9IQU5HVUxfQ0hBUlNFVDoKKyAgICBjYXNlIEZYX0NIQVJTRVRfSGFuZ3VsOgogICAgICAgZmFjZSA9ICJBcHBsZU15dW5nam8iOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVDoKKyAgICBjYXNlIEZYX0NIQVJTRVRfQ2hpbmVzZVRyYWRpdGlvbmFsOgogICAgICAgZmFjZSA9ICJMaVNvbmcgUHJvIExpZ2h0IjsKICAgfQogICBpdCA9IG1fRm9udExpc3QuZmluZChmYWNlKTsKLSAgcmV0dXJuIGl0ICE9IG1fRm9udExpc3QuZW5kKCkgPyBpdC0+c2Vjb25kIDogbnVsbHB0cjsKKyAgcmV0dXJuIGl0ICE9IG1fRm9udExpc3QuZW5kKCkgPyBpdC0+c2Vjb25kLmdldCgpIDogbnVsbHB0cjsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCiAKIHN0ZDo6dW5pcXVlX3B0cjxJRlhfU3lzdGVtRm9udEluZm8+IElGWF9TeXN0ZW1Gb250SW5mbzo6Q3JlYXRlRGVmYXVsdCgKICAgICBjb25zdCBjaGFyKiogcFVudXNlZCkgewotICBDRlhfTWFjRm9udEluZm8qIHBJbmZvKG5ldyBDRlhfTWFjRm9udEluZm8pOworICBhdXRvIHBJbmZvID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9NYWNGb250SW5mbz4oKTsKICAgcEluZm8tPkFkZFBhdGgoIn4vTGlicmFyeS9Gb250cyIpOwogICBwSW5mby0+QWRkUGF0aCgiL0xpYnJhcnkvRm9udHMiKTsKICAgcEluZm8tPkFkZFBhdGgoIi9TeXN0ZW0vTGlicmFyeS9Gb250cyIpOwotICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPENGWF9NYWNGb250SW5mbz4ocEluZm8pOworICByZXR1cm4gc3RkOjptb3ZlKHBJbmZvKTsKIH0KIAogdm9pZCBDRlhfR0VNb2R1bGU6OkluaXRQbGF0Zm9ybSgpIHsKZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9hcHBsZS9meF9xdWFydHpfZGV2aWNlLmNwcCBiL2NvcmUvZnhnZS9hcHBsZS9meF9xdWFydHpfZGV2aWNlLmNwcAppbmRleCAwY2Q1YjZiLi43MDlmMjAxIDEwMDY0NAotLS0gYS9jb3JlL2Z4Z2UvYXBwbGUvZnhfcXVhcnR6X2RldmljZS5jcHAKKysrIGIvY29yZS9meGdlL2FwcGxlL2Z4X3F1YXJ0el9kZXZpY2UuY3BwCkBAIC00LDIwICs0LDE4IEBACiAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCiAKICNpZiAhZGVmaW5lZCBfU0tJQV9TVVBQT1JUXyAmJiAhZGVmaW5lZCBfU0tJQV9TVVBQT1JUX1BBVEhTXwogI2luY2x1ZGUgImNvcmUvZnhnZS9hZ2cvZnhfYWdnX2RyaXZlci5oIgogI2VuZGlmCiAKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZ2Vtb2R1bGUuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGVkYXRhLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2RpYi9kaWJfaW50LmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfZGliaXRtYXAuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZ2UvZnhfdGV4dF9pbnQuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKICNpbmNsdWRlICJjb3JlL2Z4Z2UvYXBwbGUvYXBwbGVfaW50LmgiCkBAIC0yNSw3ICsyMyw3IEBACiAjZXJyb3IgRXhwZWN0ZWQgQ0dGTE9BVF9JU19ET1VCTEUgdG8gYmUgZGVmaW5lZCBieSBDb3JlR3JhcGhpY3MgaGVhZGVycwogI2VuZGlmCiAKLXZvaWQqIENRdWFydHoyRDo6Y3JlYXRlR3JhcGhpY3MoQ0ZYX0RJQml0bWFwKiBwQml0bWFwKSB7Cit2b2lkKiBDUXVhcnR6MkQ6OmNyZWF0ZUdyYXBoaWNzKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwQml0bWFwKSB7CiAgIGlmICghcEJpdG1hcCkKICAgICByZXR1cm4gbnVsbHB0cjsKICAgQ0dCaXRtYXBJbmZvIGJtcEluZm8gPSBrQ0dCaXRtYXBCeXRlT3JkZXIzMkxpdHRsZTsKQEAgLTUyLDcgKzUwLDcgQEAKIAogdm9pZCogQ1F1YXJ0ejJEOjpDcmVhdGVGb250KGNvbnN0IHVpbnQ4X3QqIHBGb250RGF0YSwgdWludDMyX3QgZHdGb250U2l6ZSkgewogICBDR0RhdGFQcm92aWRlclJlZiBwRGF0YVByb3ZpZGVyID0gQ0dEYXRhUHJvdmlkZXJDcmVhdGVXaXRoRGF0YSgKLSAgICAgIG51bGxwdHIsIHBGb250RGF0YSwgKHNpemVfdClkd0ZvbnRTaXplLCBudWxscHRyKTsKKyAgICAgIG51bGxwdHIsIHBGb250RGF0YSwgc3RhdGljX2Nhc3Q8c2l6ZV90Pihkd0ZvbnRTaXplKSwgbnVsbHB0cik7CiAgIGlmICghcERhdGFQcm92aWRlcikKICAgICByZXR1cm4gbnVsbHB0cjsKIApAQCAtNzcsNyArNzUsNyBAQAogCiBib29sIENRdWFydHoyRDo6ZHJhd0dyYXBoaWNzU3RyaW5nKHZvaWQqIGdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBmb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZm9udFNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBnbHlwaEluZGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHUG9pbnQqIGdseXBoUG9zaXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzQ291bnQsCkBAIC05NSw4ICs5MywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LT5lLCBtYXRyaXgtPmYpKTsKICAgICBDR0NvbnRleHRTZXRUZXh0TWF0cml4KGNvbnRleHQsIG0pOwogICB9Ci0gIGludDMyX3QgYSwgciwgZywgYjsKLSAgQXJnYkRlY29kZShhcmdiLCBhLCByLCBnLCBiKTsKKyAgaW50MzJfdCBhOworICBpbnQzMl90IHI7CisgIGludDMyX3QgZzsKKyAgaW50MzJfdCBiOworICBzdGQ6OnRpZShhLCByLCBnLCBiKSA9IEFyZ2JEZWNvZGUoYXJnYik7CiAgIENHQ29udGV4dFNldFJHQkZpbGxDb2xvcihjb250ZXh0LCByIC8gMjU1LmYsIGcgLyAyNTUuZiwgYiAvIDI1NS5mLCBhIC8gMjU1LmYpOwogICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOwogI2lmIENHRkxPQVRfSVNfRE9VQkxFCmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvY2Z4X2NsaXByZ24uY3BwIGIvY29yZS9meGdlL2NmeF9jbGlwcmduLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTY5ZWU5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGdlL2NmeF9jbGlwcmduLmNwcApAQCAtMCwwICsxLDEwNiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9jbGlwcmduLmgiCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfZGliaXRtYXAuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2xvZ2dpbmcuaCIKKworQ0ZYX0NsaXBSZ246OkNGWF9DbGlwUmduKGludCB3aWR0aCwgaW50IGhlaWdodCkKKyAgICA6IG1fVHlwZShSZWN0SSksIG1fQm94KDAsIDAsIHdpZHRoLCBoZWlnaHQpIHt9CisKK0NGWF9DbGlwUmduOjpDRlhfQ2xpcFJnbihjb25zdCBDRlhfQ2xpcFJnbiYgc3JjKSB7CisgIG1fVHlwZSA9IHNyYy5tX1R5cGU7CisgIG1fQm94ID0gc3JjLm1fQm94OworICBtX01hc2sgPSBzcmMubV9NYXNrOworfQorCitDRlhfQ2xpcFJnbjo6fkNGWF9DbGlwUmduKCkge30KKwordm9pZCBDRlhfQ2xpcFJnbjo6UmVzZXQoY29uc3QgRlhfUkVDVCYgcmVjdCkgeworICBtX1R5cGUgPSBSZWN0STsKKyAgbV9Cb3ggPSByZWN0OworICBtX01hc2sgPSBudWxscHRyOworfQorCit2b2lkIENGWF9DbGlwUmduOjpJbnRlcnNlY3RSZWN0KGNvbnN0IEZYX1JFQ1QmIHJlY3QpIHsKKyAgaWYgKG1fVHlwZSA9PSBSZWN0SSkgeworICAgIG1fQm94LkludGVyc2VjdChyZWN0KTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fVHlwZSA9PSBNYXNrRikgeworICAgIEludGVyc2VjdE1hc2tSZWN0KHJlY3QsIG1fQm94LCBtX01hc2spOworICAgIHJldHVybjsKKyAgfQorfQorCit2b2lkIENGWF9DbGlwUmduOjpJbnRlcnNlY3RNYXNrUmVjdChGWF9SRUNUIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9SRUNUIG1hc2tfcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwTWFzaykgeworICBtX1R5cGUgPSBNYXNrRjsKKyAgbV9Cb3ggPSByZWN0OworICBtX0JveC5JbnRlcnNlY3QobWFza19yZWN0KTsKKyAgaWYgKG1fQm94LklzRW1wdHkoKSkgeworICAgIG1fVHlwZSA9IFJlY3RJOworICAgIHJldHVybjsKKyAgfQorICBpZiAobV9Cb3ggPT0gbWFza19yZWN0KSB7CisgICAgbV9NYXNrID0gcE1hc2s7CisgICAgcmV0dXJuOworICB9CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBPbGRNYXNrKHBNYXNrKTsKKyAgbV9NYXNrID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKTsKKyAgbV9NYXNrLT5DcmVhdGUobV9Cb3guV2lkdGgoKSwgbV9Cb3guSGVpZ2h0KCksIEZYRElCXzhicHBNYXNrKTsKKyAgZm9yIChpbnQgcm93ID0gbV9Cb3gudG9wOyByb3cgPCBtX0JveC5ib3R0b207IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0KKyAgICAgICAgbV9NYXNrLT5HZXRCdWZmZXIoKSArIG1fTWFzay0+R2V0UGl0Y2goKSAqIChyb3cgLSBtX0JveC50b3ApOworICAgIHVpbnQ4X3QqIHNyY19zY2FuID0KKyAgICAgICAgcE9sZE1hc2stPkdldEJ1ZmZlcigpICsgcE9sZE1hc2stPkdldFBpdGNoKCkgKiAocm93IC0gbWFza19yZWN0LnRvcCk7CisgICAgZm9yIChpbnQgY29sID0gbV9Cb3gubGVmdDsgY29sIDwgbV9Cb3gucmlnaHQ7IGNvbCsrKQorICAgICAgZGVzdF9zY2FuW2NvbCAtIG1fQm94LmxlZnRdID0gc3JjX3NjYW5bY29sIC0gbWFza19yZWN0LmxlZnRdOworICB9Cit9CisKK3ZvaWQgQ0ZYX0NsaXBSZ246OkludGVyc2VjdE1hc2tGKGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwTWFzaykgeworICBBU1NFUlQocE1hc2stPkdldEZvcm1hdCgpID09IEZYRElCXzhicHBNYXNrKTsKKyAgRlhfUkVDVCBtYXNrX2JveChsZWZ0LCB0b3AsIGxlZnQgKyBwTWFzay0+R2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICB0b3AgKyBwTWFzay0+R2V0SGVpZ2h0KCkpOworICBpZiAobV9UeXBlID09IFJlY3RJKSB7CisgICAgSW50ZXJzZWN0TWFza1JlY3QobV9Cb3gsIG1hc2tfYm94LCBwTWFzayk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX1R5cGUgPT0gTWFza0YpIHsKKyAgICBGWF9SRUNUIG5ld19ib3ggPSBtX0JveDsKKyAgICBuZXdfYm94LkludGVyc2VjdChtYXNrX2JveCk7CisgICAgaWYgKG5ld19ib3guSXNFbXB0eSgpKSB7CisgICAgICBtX1R5cGUgPSBSZWN0STsKKyAgICAgIG1fTWFzayA9IG51bGxwdHI7CisgICAgICBtX0JveCA9IG5ld19ib3g7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGF1dG8gbmV3X2RpYiA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfRElCaXRtYXA+KCk7CisgICAgbmV3X2RpYi0+Q3JlYXRlKG5ld19ib3guV2lkdGgoKSwgbmV3X2JveC5IZWlnaHQoKSwgRlhESUJfOGJwcE1hc2spOworICAgIGZvciAoaW50IHJvdyA9IG5ld19ib3gudG9wOyByb3cgPCBuZXdfYm94LmJvdHRvbTsgcm93KyspIHsKKyAgICAgIHVpbnQ4X3QqIG9sZF9zY2FuID0KKyAgICAgICAgICBtX01hc2stPkdldEJ1ZmZlcigpICsgKHJvdyAtIG1fQm94LnRvcCkgKiBtX01hc2stPkdldFBpdGNoKCk7CisgICAgICB1aW50OF90KiBtYXNrX3NjYW4gPSBwTWFzay0+R2V0QnVmZmVyKCkgKyAocm93IC0gdG9wKSAqIHBNYXNrLT5HZXRQaXRjaCgpOworICAgICAgdWludDhfdCogbmV3X3NjYW4gPQorICAgICAgICAgIG5ld19kaWItPkdldEJ1ZmZlcigpICsgKHJvdyAtIG5ld19ib3gudG9wKSAqIG5ld19kaWItPkdldFBpdGNoKCk7CisgICAgICBmb3IgKGludCBjb2wgPSBuZXdfYm94LmxlZnQ7IGNvbCA8IG5ld19ib3gucmlnaHQ7IGNvbCsrKSB7CisgICAgICAgIG5ld19zY2FuW2NvbCAtIG5ld19ib3gubGVmdF0gPQorICAgICAgICAgICAgb2xkX3NjYW5bY29sIC0gbV9Cb3gubGVmdF0gKiBtYXNrX3NjYW5bY29sIC0gbGVmdF0gLyAyNTU7CisgICAgICB9CisgICAgfQorICAgIG1fQm94ID0gbmV3X2JveDsKKyAgICBtX01hc2sgPSBzdGQ6Om1vdmUobmV3X2RpYik7CisgICAgcmV0dXJuOworICB9CisgIE5PVFJFQUNIRUQoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9jZnhfY2xpcHJnbi5oIGIvY29yZS9meGdlL2NmeF9jbGlwcmduLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlYmI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9jZnhfY2xpcHJnbi5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYR0VfQ0ZYX0NMSVBSR05fSF8KKyNkZWZpbmUgQ09SRV9GWEdFX0NGWF9DTElQUkdOX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisKK2NsYXNzIENGWF9ESUJpdG1hcDsKKworY2xhc3MgQ0ZYX0NsaXBSZ24geworIHB1YmxpYzoKKyAgZW51bSBDbGlwVHlwZSB7IFJlY3RJLCBNYXNrRiB9OworCisgIENGWF9DbGlwUmduKGludCBkZXZpY2Vfd2lkdGgsIGludCBkZXZpY2VfaGVpZ2h0KTsKKyAgQ0ZYX0NsaXBSZ24oY29uc3QgQ0ZYX0NsaXBSZ24mIHNyYyk7CisgIH5DRlhfQ2xpcFJnbigpOworCisgIENsaXBUeXBlIEdldFR5cGUoKSBjb25zdCB7IHJldHVybiBtX1R5cGU7IH0KKyAgY29uc3QgRlhfUkVDVCYgR2V0Qm94KCkgY29uc3QgeyByZXR1cm4gbV9Cb3g7IH0KKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gR2V0TWFzaygpIGNvbnN0IHsgcmV0dXJuIG1fTWFzazsgfQorCisgIHZvaWQgUmVzZXQoY29uc3QgRlhfUkVDVCYgcmVjdCk7CisgIHZvaWQgSW50ZXJzZWN0UmVjdChjb25zdCBGWF9SRUNUJiByZWN0KTsKKyAgdm9pZCBJbnRlcnNlY3RNYXNrRihpbnQgbGVmdCwgaW50IHRvcCwgY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIE1hc2spOworCisgcHJpdmF0ZToKKyAgdm9pZCBJbnRlcnNlY3RNYXNrUmVjdChGWF9SRUNUIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfUkVDVCBtYXNrX2JveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgTWFzayk7CisKKyAgQ2xpcFR5cGUgbV9UeXBlOworICBGWF9SRUNUIG1fQm94OworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBtX01hc2s7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhHRV9DRlhfQ0xJUFJHTl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2NmeF9jb2xvci5jcHAgYi9jb3JlL2Z4Z2UvY2Z4X2NvbG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmFiMzlkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGdlL2NmeF9jb2xvci5jcHAKQEAgLTAsMCArMSwyMjAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfY29sb3IuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zaW1wbGVfcGFyc2VyLmgiCisKK25hbWVzcGFjZSB7CisKK2Jvb2wgSW5SYW5nZShmbG9hdCBjb21wKSB7CisgIHJldHVybiBjb21wID49IDAuMGYgJiYgY29tcCA8PSAxLjBmOworfQorCitDRlhfQ29sb3IgQ29udmVydENNWUsyR1JBWShmbG9hdCBkQywgZmxvYXQgZE0sIGZsb2F0IGRZLCBmbG9hdCBkSykgeworICBpZiAoIUluUmFuZ2UoZEMpIHx8ICFJblJhbmdlKGRNKSB8fCAhSW5SYW5nZShkWSkgfHwgIUluUmFuZ2UoZEspKQorICAgIHJldHVybiBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprR3JheSk7CisgIHJldHVybiBDRlhfQ29sb3IoCisgICAgICBDRlhfQ29sb3I6OmtHcmF5LAorICAgICAgMS4wZiAtIHN0ZDo6bWluKDEuMGYsIDAuM2YgKiBkQyArIDAuNTlmICogZE0gKyAwLjExZiAqIGRZICsgZEspKTsKK30KKworQ0ZYX0NvbG9yIENvbnZlcnRHUkFZMkNNWUsoZmxvYXQgZEdyYXkpIHsKKyAgaWYgKCFJblJhbmdlKGRHcmF5KSkKKyAgICByZXR1cm4gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0NNWUspOworICByZXR1cm4gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0NNWUssIDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYgLSBkR3JheSk7Cit9CisKK0NGWF9Db2xvciBDb252ZXJ0R1JBWTJSR0IoZmxvYXQgZEdyYXkpIHsKKyAgaWYgKCFJblJhbmdlKGRHcmF5KSkKKyAgICByZXR1cm4gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a1JHQik7CisgIHJldHVybiBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprUkdCLCBkR3JheSwgZEdyYXksIGRHcmF5KTsKK30KKworQ0ZYX0NvbG9yIENvbnZlcnRSR0IyR1JBWShmbG9hdCBkUiwgZmxvYXQgZEcsIGZsb2F0IGRCKSB7CisgIGlmICghSW5SYW5nZShkUikgfHwgIUluUmFuZ2UoZEcpIHx8ICFJblJhbmdlKGRCKSkKKyAgICByZXR1cm4gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXkpOworICByZXR1cm4gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIDAuM2YgKiBkUiArIDAuNTlmICogZEcgKyAwLjExZiAqIGRCKTsKK30KKworQ0ZYX0NvbG9yIENvbnZlcnRDTVlLMlJHQihmbG9hdCBkQywgZmxvYXQgZE0sIGZsb2F0IGRZLCBmbG9hdCBkSykgeworICBpZiAoIUluUmFuZ2UoZEMpIHx8ICFJblJhbmdlKGRNKSB8fCAhSW5SYW5nZShkWSkgfHwgIUluUmFuZ2UoZEspKQorICAgIHJldHVybiBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprUkdCKTsKKyAgcmV0dXJuIENGWF9Db2xvcihDRlhfQ29sb3I6OmtSR0IsIDEuMGYgLSBzdGQ6Om1pbigxLjBmLCBkQyArIGRLKSwKKyAgICAgICAgICAgICAgICAgICAxLjBmIC0gc3RkOjptaW4oMS4wZiwgZE0gKyBkSyksCisgICAgICAgICAgICAgICAgICAgMS4wZiAtIHN0ZDo6bWluKDEuMGYsIGRZICsgZEspKTsKK30KKworQ0ZYX0NvbG9yIENvbnZlcnRSR0IyQ01ZSyhmbG9hdCBkUiwgZmxvYXQgZEcsIGZsb2F0IGRCKSB7CisgIGlmICghSW5SYW5nZShkUikgfHwgIUluUmFuZ2UoZEcpIHx8ICFJblJhbmdlKGRCKSkKKyAgICByZXR1cm4gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0NNWUspOworCisgIGZsb2F0IGMgPSAxLjBmIC0gZFI7CisgIGZsb2F0IG0gPSAxLjBmIC0gZEc7CisgIGZsb2F0IHkgPSAxLjBmIC0gZEI7CisgIHJldHVybiBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprQ01ZSywgYywgbSwgeSwgc3RkOjptaW4oYywgc3RkOjptaW4obSwgeSkpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIFN0YXRpYy4KK0NGWF9Db2xvciBDRlhfQ29sb3I6OlBhcnNlQ29sb3IoY29uc3QgQ1BERl9BcnJheSYgYXJyYXkpIHsKKyAgQ0ZYX0NvbG9yIHJ0OworICBzd2l0Y2ggKGFycmF5LkdldENvdW50KCkpIHsKKyAgICBjYXNlIDE6CisgICAgICBydCA9IENGWF9Db2xvcihDRlhfQ29sb3I6OmtHcmF5LCBhcnJheS5HZXRGbG9hdEF0KDApKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIHJ0ID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a1JHQiwgYXJyYXkuR2V0RmxvYXRBdCgwKSwgYXJyYXkuR2V0RmxvYXRBdCgxKSwKKyAgICAgICAgICAgICAgICAgICAgIGFycmF5LkdldEZsb2F0QXQoMikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgcnQgPSBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprQ01ZSywgYXJyYXkuR2V0RmxvYXRBdCgwKSwgYXJyYXkuR2V0RmxvYXRBdCgxKSwKKyAgICAgICAgICAgICAgICAgICAgIGFycmF5LkdldEZsb2F0QXQoMiksIGFycmF5LkdldEZsb2F0QXQoMykpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJ0OworfQorCisvLyBTdGF0aWMuCitDRlhfQ29sb3IgQ0ZYX0NvbG9yOjpQYXJzZUNvbG9yKGNvbnN0IEJ5dGVTdHJpbmcmIHN0cikgeworICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgoc3RyLkFzU3RyaW5nVmlldygpKTsKKyAgaWYgKHN5bnRheC5GaW5kVGFnUGFyYW1Gcm9tU3RhcnQoImciLCAxKSkKKyAgICByZXR1cm4gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSkpOworCisgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtRnJvbVN0YXJ0KCJyZyIsIDMpKSB7CisgICAgZmxvYXQgZjEgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOworICAgIGZsb2F0IGYyID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKKyAgICBmbG9hdCBmMyA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7CisgICAgcmV0dXJuIENGWF9Db2xvcihDRlhfQ29sb3I6OmtSR0IsIGYxLCBmMiwgZjMpOworICB9CisgIGlmIChzeW50YXguRmluZFRhZ1BhcmFtRnJvbVN0YXJ0KCJrIiwgNCkpIHsKKyAgICBmbG9hdCBmMSA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7CisgICAgZmxvYXQgZjIgPSBGWF9hdG9mKHN5bnRheC5HZXRXb3JkKCkpOworICAgIGZsb2F0IGYzID0gRlhfYXRvZihzeW50YXguR2V0V29yZCgpKTsKKyAgICBmbG9hdCBmNCA9IEZYX2F0b2Yoc3ludGF4LkdldFdvcmQoKSk7CisgICAgcmV0dXJuIENGWF9Db2xvcihDRlhfQ29sb3I6OmtDTVlLLCBmMSwgZjIsIGYzLCBmNCk7CisgIH0KKyAgcmV0dXJuIENGWF9Db2xvcihDRlhfQ29sb3I6OmtUcmFuc3BhcmVudCk7Cit9CisKK0NGWF9Db2xvciBDRlhfQ29sb3I6OkNvbnZlcnRDb2xvclR5cGUoaW50MzJfdCBuQ29udmVydENvbG9yVHlwZSkgY29uc3QgeworICBpZiAobkNvbG9yVHlwZSA9PSBuQ29udmVydENvbG9yVHlwZSkKKyAgICByZXR1cm4gKnRoaXM7CisKKyAgQ0ZYX0NvbG9yIHJldDsKKyAgc3dpdGNoIChuQ29sb3JUeXBlKSB7CisgICAgY2FzZSBDRlhfQ29sb3I6OmtUcmFuc3BhcmVudDoKKyAgICAgIHJldCA9ICp0aGlzOworICAgICAgcmV0Lm5Db2xvclR5cGUgPSBDRlhfQ29sb3I6OmtUcmFuc3BhcmVudDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0ZYX0NvbG9yOjprR3JheToKKyAgICAgIHN3aXRjaCAobkNvbnZlcnRDb2xvclR5cGUpIHsKKyAgICAgICAgY2FzZSBDRlhfQ29sb3I6OmtSR0I6CisgICAgICAgICAgcmV0ID0gQ29udmVydEdSQVkyUkdCKGZDb2xvcjEpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENGWF9Db2xvcjo6a0NNWUs6CisgICAgICAgICAgcmV0ID0gQ29udmVydEdSQVkyQ01ZSyhmQ29sb3IxKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0ZYX0NvbG9yOjprUkdCOgorICAgICAgc3dpdGNoIChuQ29udmVydENvbG9yVHlwZSkgeworICAgICAgICBjYXNlIENGWF9Db2xvcjo6a0dyYXk6CisgICAgICAgICAgcmV0ID0gQ29udmVydFJHQjJHUkFZKGZDb2xvcjEsIGZDb2xvcjIsIGZDb2xvcjMpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENGWF9Db2xvcjo6a0NNWUs6CisgICAgICAgICAgcmV0ID0gQ29udmVydFJHQjJDTVlLKGZDb2xvcjEsIGZDb2xvcjIsIGZDb2xvcjMpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDRlhfQ29sb3I6OmtDTVlLOgorICAgICAgc3dpdGNoIChuQ29udmVydENvbG9yVHlwZSkgeworICAgICAgICBjYXNlIENGWF9Db2xvcjo6a0dyYXk6CisgICAgICAgICAgcmV0ID0gQ29udmVydENNWUsyR1JBWShmQ29sb3IxLCBmQ29sb3IyLCBmQ29sb3IzLCBmQ29sb3I0KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDRlhfQ29sb3I6OmtSR0I6CisgICAgICAgICAgcmV0ID0gQ29udmVydENNWUsyUkdCKGZDb2xvcjEsIGZDb2xvcjIsIGZDb2xvcjMsIGZDb2xvcjQpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworRlhfQ09MT1JSRUYgQ0ZYX0NvbG9yOjpUb0ZYQ29sb3IoaW50MzJfdCBuVHJhbnNwYXJlbmN5KSBjb25zdCB7CisgIENGWF9Db2xvciByZXQ7CisgIHN3aXRjaCAobkNvbG9yVHlwZSkgeworICAgIGNhc2UgQ0ZYX0NvbG9yOjprVHJhbnNwYXJlbnQ6IHsKKyAgICAgIHJldCA9IENGWF9Db2xvcihDRlhfQ29sb3I6OmtUcmFuc3BhcmVudCwgMCwgMCwgMCwgMCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBDRlhfQ29sb3I6OmtHcmF5OiB7CisgICAgICByZXQgPSBDb252ZXJ0R1JBWTJSR0IoZkNvbG9yMSk7CisgICAgICByZXQuZkNvbG9yNCA9IG5UcmFuc3BhcmVuY3k7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBDRlhfQ29sb3I6OmtSR0I6IHsKKyAgICAgIHJldCA9IENGWF9Db2xvcihDRlhfQ29sb3I6OmtSR0IsIGZDb2xvcjEsIGZDb2xvcjIsIGZDb2xvcjMpOworICAgICAgcmV0LmZDb2xvcjQgPSBuVHJhbnNwYXJlbmN5OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQ0ZYX0NvbG9yOjprQ01ZSzogeworICAgICAgcmV0ID0gQ29udmVydENNWUsyUkdCKGZDb2xvcjEsIGZDb2xvcjIsIGZDb2xvcjMsIGZDb2xvcjQpOworICAgICAgcmV0LmZDb2xvcjQgPSBuVHJhbnNwYXJlbmN5OworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBBcmdiRW5jb2RlKHJldC5mQ29sb3I0LCBzdGF0aWNfY2FzdDxpbnQzMl90PihyZXQuZkNvbG9yMSAqIDI1NSksCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHJldC5mQ29sb3IyICogMjU1KSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmV0LmZDb2xvcjMgKiAyNTUpKTsKK30KKworQ0ZYX0NvbG9yIENGWF9Db2xvcjo6b3BlcmF0b3ItKGZsb2F0IGZDb2xvclN1YikgY29uc3QgeworICBDRlhfQ29sb3Igc1JldChuQ29sb3JUeXBlKTsKKyAgc3dpdGNoIChuQ29sb3JUeXBlKSB7CisgICAgY2FzZSBDRlhfQ29sb3I6OmtUcmFuc3BhcmVudDoKKyAgICAgIHNSZXQubkNvbG9yVHlwZSA9IENGWF9Db2xvcjo6a1JHQjsKKyAgICAgIHNSZXQuZkNvbG9yMSA9IHN0ZDo6bWF4KDEuMGYgLSBmQ29sb3JTdWIsIDAuMGYpOworICAgICAgc1JldC5mQ29sb3IyID0gc3RkOjptYXgoMS4wZiAtIGZDb2xvclN1YiwgMC4wZik7CisgICAgICBzUmV0LmZDb2xvcjMgPSBzdGQ6Om1heCgxLjBmIC0gZkNvbG9yU3ViLCAwLjBmKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ0ZYX0NvbG9yOjprUkdCOgorICAgIGNhc2UgQ0ZYX0NvbG9yOjprR3JheToKKyAgICBjYXNlIENGWF9Db2xvcjo6a0NNWUs6CisgICAgICBzUmV0LmZDb2xvcjEgPSBzdGQ6Om1heChmQ29sb3IxIC0gZkNvbG9yU3ViLCAwLjBmKTsKKyAgICAgIHNSZXQuZkNvbG9yMiA9IHN0ZDo6bWF4KGZDb2xvcjIgLSBmQ29sb3JTdWIsIDAuMGYpOworICAgICAgc1JldC5mQ29sb3IzID0gc3RkOjptYXgoZkNvbG9yMyAtIGZDb2xvclN1YiwgMC4wZik7CisgICAgICBzUmV0LmZDb2xvcjQgPSBzdGQ6Om1heChmQ29sb3I0IC0gZkNvbG9yU3ViLCAwLjBmKTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBzUmV0OworfQorCitDRlhfQ29sb3IgQ0ZYX0NvbG9yOjpvcGVyYXRvci8oZmxvYXQgZkNvbG9yRGl2aWRlKSBjb25zdCB7CisgIENGWF9Db2xvciBzUmV0KG5Db2xvclR5cGUpOworICBzd2l0Y2ggKG5Db2xvclR5cGUpIHsKKyAgICBjYXNlIENGWF9Db2xvcjo6a1RyYW5zcGFyZW50OgorICAgICAgc1JldC5uQ29sb3JUeXBlID0gQ0ZYX0NvbG9yOjprUkdCOworICAgICAgc1JldC5mQ29sb3IxID0gMS4wZiAvIGZDb2xvckRpdmlkZTsKKyAgICAgIHNSZXQuZkNvbG9yMiA9IDEuMGYgLyBmQ29sb3JEaXZpZGU7CisgICAgICBzUmV0LmZDb2xvcjMgPSAxLjBmIC8gZkNvbG9yRGl2aWRlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDRlhfQ29sb3I6OmtSR0I6CisgICAgY2FzZSBDRlhfQ29sb3I6OmtHcmF5OgorICAgIGNhc2UgQ0ZYX0NvbG9yOjprQ01ZSzoKKyAgICAgIHNSZXQgPSAqdGhpczsKKyAgICAgIHNSZXQuZkNvbG9yMSAvPSBmQ29sb3JEaXZpZGU7CisgICAgICBzUmV0LmZDb2xvcjIgLz0gZkNvbG9yRGl2aWRlOworICAgICAgc1JldC5mQ29sb3IzIC89IGZDb2xvckRpdmlkZTsKKyAgICAgIHNSZXQuZkNvbG9yNCAvPSBmQ29sb3JEaXZpZGU7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gc1JldDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9jZnhfY29sb3IuaCBiL2NvcmUvZnhnZS9jZnhfY29sb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTllMTliCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGdlL2NmeF9jb2xvci5oCkBAIC0wLDAgKzEsNjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYR0VfQ0ZYX0NPTE9SX0hfCisjZGVmaW5lIENPUkVfRlhHRV9DRlhfQ09MT1JfSF8KKworI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2Zvcm1jb250cm9sLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorCitzdHJ1Y3QgQ0ZYX0NvbG9yIHsKKyAgc3RhdGljIENGWF9Db2xvciBQYXJzZUNvbG9yKGNvbnN0IENQREZfQXJyYXkmIGFycmF5KTsKKyAgc3RhdGljIENGWF9Db2xvciBQYXJzZUNvbG9yKGNvbnN0IEJ5dGVTdHJpbmcmIHN0cik7CisKKyAgZW51bSBUeXBlIHsga1RyYW5zcGFyZW50ID0gMCwga0dyYXksIGtSR0IsIGtDTVlLIH07CisKKyAgZXhwbGljaXQgQ0ZYX0NvbG9yKEZYX0NPTE9SUkVGIHJlZikKKyAgICAgIDogQ0ZYX0NvbG9yKEZYQVJHQl9SKHJlZiksIEZYQVJHQl9HKHJlZiksIEZYQVJHQl9CKHJlZikpIHt9CisKKyAgQ0ZYX0NvbG9yKGludDMyX3QgdHlwZSA9IENGWF9Db2xvcjo6a1RyYW5zcGFyZW50LAorICAgICAgICAgICAgZmxvYXQgY29sb3IxID0gMC4wZiwKKyAgICAgICAgICAgIGZsb2F0IGNvbG9yMiA9IDAuMGYsCisgICAgICAgICAgICBmbG9hdCBjb2xvcjMgPSAwLjBmLAorICAgICAgICAgICAgZmxvYXQgY29sb3I0ID0gMC4wZikKKyAgICAgIDogbkNvbG9yVHlwZSh0eXBlKSwKKyAgICAgICAgZkNvbG9yMShjb2xvcjEpLAorICAgICAgICBmQ29sb3IyKGNvbG9yMiksCisgICAgICAgIGZDb2xvcjMoY29sb3IzKSwKKyAgICAgICAgZkNvbG9yNChjb2xvcjQpIHt9CisKKyAgQ0ZYX0NvbG9yKGludDMyX3QgciwgaW50MzJfdCBnLCBpbnQzMl90IGIpCisgICAgICA6IG5Db2xvclR5cGUoQ0ZYX0NvbG9yOjprUkdCKSwKKyAgICAgICAgZkNvbG9yMShyIC8gMjU1LjBmKSwKKyAgICAgICAgZkNvbG9yMihnIC8gMjU1LjBmKSwKKyAgICAgICAgZkNvbG9yMyhiIC8gMjU1LjBmKSwKKyAgICAgICAgZkNvbG9yNCgwKSB7fQorCisgIENGWF9Db2xvcihjb25zdCBDRlhfQ29sb3ImKSA9IGRlZmF1bHQ7CisKKyAgQ0ZYX0NvbG9yIG9wZXJhdG9yLyhmbG9hdCBmQ29sb3JEaXZpZGUpIGNvbnN0OworICBDRlhfQ29sb3Igb3BlcmF0b3ItKGZsb2F0IGZDb2xvclN1YikgY29uc3Q7CisKKyAgQ0ZYX0NvbG9yIENvbnZlcnRDb2xvclR5cGUoaW50MzJfdCBvdGhlcl9uQ29sb3JUeXBlKSBjb25zdDsKKworICBGWF9DT0xPUlJFRiBUb0ZYQ29sb3IoaW50MzJfdCBuVHJhbnNwYXJlbmN5KSBjb25zdDsKKworICB2b2lkIFJlc2V0KCkgeworICAgIG5Db2xvclR5cGUgPSBDRlhfQ29sb3I6OmtUcmFuc3BhcmVudDsKKyAgICBmQ29sb3IxID0gMC4wZjsKKyAgICBmQ29sb3IyID0gMC4wZjsKKyAgICBmQ29sb3IzID0gMC4wZjsKKyAgICBmQ29sb3I0ID0gMC4wZjsKKyAgfQorCisgIGludDMyX3QgbkNvbG9yVHlwZTsKKyAgZmxvYXQgZkNvbG9yMTsKKyAgZmxvYXQgZkNvbG9yMjsKKyAgZmxvYXQgZkNvbG9yMzsKKyAgZmxvYXQgZkNvbG9yNDsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWEdFX0NGWF9DT0xPUl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2NmeF9kZWZhdWx0cmVuZGVyZGV2aWNlLmggYi9jb3JlL2Z4Z2UvY2Z4X2RlZmF1bHRyZW5kZXJkZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTQxNWRmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGdlL2NmeF9kZWZhdWx0cmVuZGVyZGV2aWNlLmgKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhHRV9DRlhfREVGQVVMVFJFTkRFUkRFVklDRV9IXworI2RlZmluZSBDT1JFX0ZYR0VfQ0ZYX0RFRkFVTFRSRU5ERVJERVZJQ0VfSF8KKworI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorCitjbGFzcyBTa1BpY3R1cmVSZWNvcmRlcjsKKworY2xhc3MgQ0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2UgOiBwdWJsaWMgQ0ZYX1JlbmRlckRldmljZSB7CisgcHVibGljOgorICBDRlhfRGVmYXVsdFJlbmRlckRldmljZSgpOworICB+Q0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2UoKSBvdmVycmlkZTsKKworICBib29sIEF0dGFjaChjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcCwKKyAgICAgICAgICAgICAgYm9vbCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcE9yaURldmljZSwKKyAgICAgICAgICAgICAgYm9vbCBiR3JvdXBLbm9ja291dCk7CisgIGJvb2wgQ3JlYXRlKGludCB3aWR0aCwKKyAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgRlhESUJfRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBPcmlEZXZpY2UpOworCisjaWZkZWYgX1NLSUFfU1VQUE9SVF8KKyAgYm9vbCBBdHRhY2hSZWNvcmRlcihTa1BpY3R1cmVSZWNvcmRlciogcmVjb3JkZXIpOworICB2b2lkIENsZWFyKHVpbnQzMl90IGNvbG9yKTsKKyAgU2tQaWN0dXJlUmVjb3JkZXIqIENyZWF0ZVJlY29yZGVyKGludCBzaXplX3gsIGludCBzaXplX3kpOworICB2b2lkIERlYnVnVmVyaWZ5Qml0bWFwSXNQcmVNdWx0aXBsaWVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgU2V0Qml0c1dpdGhNYXNrKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSBvdmVycmlkZTsKKyNlbmRpZgorfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYR0VfQ0ZYX0RFRkFVTFRSRU5ERVJERVZJQ0VfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9jZnhfZmFjZWNhY2hlLmNwcCBiL2NvcmUvZnhnZS9jZnhfZmFjZWNhY2hlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjM3M2ZmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGdlL2NmeF9mYWNlY2FjaGUuY3BwCkBAIC0wLDAgKzEsMzYyIEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZhY2VjYWNoZS5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29kZXBhZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnRtZ3IuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dlbW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfc3Vic3Rmb250LmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZyZWV0eXBlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX21hdGguaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKKyNpZiBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfIHx8IF9TS0lBX1NVUFBPUlRfUEFUSFNfCisjaW5jbHVkZSAidGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2NvcmUvU2tTdHJlYW0uaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZS9Ta1R5cGVmYWNlLmgiCisKKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXworI2luY2x1ZGUgInRoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9wb3J0cy9Ta0ZvbnRNZ3IuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvcG9ydHMvU2tGb250TWdyX2VtcHR5LmgiCisjZW5kaWYKKyNlbmRpZgorCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgdWludDMyX3Qga0ludmFsaWRHbHlwaEluZGV4ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KC0xKTsKKworY29uc3RleHByIGludCBrTWF4R2x5cGhEaW1lbnNpb24gPSAyMDQ4OworCitzdHJ1Y3QgVW5pcXVlS2V5R2VuIHsKKyAgdm9pZCBHZW5lcmF0ZShpbnQgY291bnQsIC4uLik7CisKKyAgY2hhciBrZXlfWzEyOF07CisgIGludCBrZXlfbGVuXzsKK307CisKK3ZvaWQgVW5pcXVlS2V5R2VuOjpHZW5lcmF0ZShpbnQgY291bnQsIC4uLikgeworICB2YV9saXN0IGFyZ0xpc3Q7CisgIHZhX3N0YXJ0KGFyZ0xpc3QsIGNvdW50KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgaW50IHAgPSB2YV9hcmcoYXJnTGlzdCwgaW50KTsKKyAgICByZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oa2V5XylbaV0gPSBwOworICB9CisgIHZhX2VuZChhcmdMaXN0KTsKKyAga2V5X2xlbl8gPSBjb3VudCAqIHNpemVvZih1aW50MzJfdCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitDRlhfRmFjZUNhY2hlOjpDRlhfRmFjZUNhY2hlKEZYRlRfRmFjZSBmYWNlKQorICAgIDogbV9GYWNlKGZhY2UpCisjaWYgZGVmaW5lZCBfU0tJQV9TVVBQT1JUXyB8fCBfU0tJQV9TVVBQT1JUX1BBVEhTXworICAgICAgLAorICAgICAgbV9wVHlwZWZhY2UobnVsbHB0cikKKyNlbmRpZgoreworfQorCitDRlhfRmFjZUNhY2hlOjp+Q0ZYX0ZhY2VDYWNoZSgpIHt9CisKK3N0ZDo6dW5pcXVlX3B0cjxDRlhfR2x5cGhCaXRtYXA+IENGWF9GYWNlQ2FjaGU6OlJlbmRlckdseXBoKAorICAgIGNvbnN0IENGWF9Gb250KiBwRm9udCwKKyAgICB1aW50MzJfdCBnbHlwaF9pbmRleCwKKyAgICBib29sIGJGb250U3R5bGUsCisgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICBpbnQgZGVzdF93aWR0aCwKKyAgICBpbnQgYW50aV9hbGlhcykgeworICBpZiAoIW1fRmFjZSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBGWEZUX01hdHJpeCBmdF9tYXRyaXg7CisgIGZ0X21hdHJpeC54eCA9IChzaWduZWQgbG9uZykocE1hdHJpeC0+YSAvIDY0ICogNjU1MzYpOworICBmdF9tYXRyaXgueHkgPSAoc2lnbmVkIGxvbmcpKHBNYXRyaXgtPmMgLyA2NCAqIDY1NTM2KTsKKyAgZnRfbWF0cml4Lnl4ID0gKHNpZ25lZCBsb25nKShwTWF0cml4LT5iIC8gNjQgKiA2NTUzNik7CisgIGZ0X21hdHJpeC55eSA9IChzaWduZWQgbG9uZykocE1hdHJpeC0+ZCAvIDY0ICogNjU1MzYpOworICBib29sIGJVc2VDSktTdWJGb250ID0gZmFsc2U7CisgIGNvbnN0IENGWF9TdWJzdEZvbnQqIHBTdWJzdEZvbnQgPSBwRm9udC0+R2V0U3Vic3RGb250KCk7CisgIGlmIChwU3Vic3RGb250KSB7CisgICAgYlVzZUNKS1N1YkZvbnQgPSBwU3Vic3RGb250LT5tX2JTdWJzdENKSyAmJiBiRm9udFN0eWxlOworICAgIGludCBza2V3ID0gMDsKKyAgICBpZiAoYlVzZUNKS1N1YkZvbnQpCisgICAgICBza2V3ID0gcFN1YnN0Rm9udC0+bV9iSXRhbGljQ0pLID8gLTE1IDogMDsKKyAgICBlbHNlCisgICAgICBza2V3ID0gcFN1YnN0Rm9udC0+bV9JdGFsaWNBbmdsZTsKKyAgICBpZiAoc2tldykgeworICAgICAgLy8gfHNrZXd8IGlzIG5vbnBvc2l0aXZlIHNvIHwtc2tld3wgaXMgdXNlZCBhcyB0aGUgaW5kZXguIFdlIG5lZWQgdG8gbWFrZQorICAgICAgLy8gc3VyZSB8c2tld3wgIT0gSU5UX01JTiBzaW5jZSAtSU5UX01JTiBpcyB1bmRlZmluZWQuCisgICAgICBpZiAoc2tldyA8PSAwICYmIHNrZXcgIT0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKSAmJgorICAgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4oLXNrZXcpIDwgQ0ZYX0ZvbnQ6OmtBbmdsZVNrZXdBcnJheVNpemUpIHsKKyAgICAgICAgc2tldyA9IC1DRlhfRm9udDo6c19BbmdsZVNrZXdbLXNrZXddOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2tldyA9IC01ODsKKyAgICAgIH0KKyAgICAgIGlmIChwRm9udC0+SXNWZXJ0aWNhbCgpKQorICAgICAgICBmdF9tYXRyaXgueXggKz0gZnRfbWF0cml4Lnl5ICogc2tldyAvIDEwMDsKKyAgICAgIGVsc2UKKyAgICAgICAgZnRfbWF0cml4Lnh5IC09IGZ0X21hdHJpeC54eCAqIHNrZXcgLyAxMDA7CisgICAgfQorICAgIGlmIChwU3Vic3RGb250LT5tX2JGbGFnTU0pIHsKKyAgICAgIHBGb250LT5BZGp1c3RNTVBhcmFtcyhnbHlwaF9pbmRleCwgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0KTsKKyAgICB9CisgIH0KKyAgU2NvcGVkRm9udFRyYW5zZm9ybSBzY29wZWRfdHJhbnNmb3JtKG1fRmFjZSwgJmZ0X21hdHJpeCk7CisgIGludCBsb2FkX2ZsYWdzID0gKG1fRmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TRk5UKQorICAgICAgICAgICAgICAgICAgICAgICA/IEZYRlRfTE9BRF9OT19CSVRNQVAKKyAgICAgICAgICAgICAgICAgICAgICAgOiAoRlhGVF9MT0FEX05PX0JJVE1BUCB8IEZUX0xPQURfTk9fSElOVElORyk7CisgIGludCBlcnJvciA9IEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGdseXBoX2luZGV4LCBsb2FkX2ZsYWdzKTsKKyAgaWYgKGVycm9yKSB7CisgICAgLy8gaWYgYW4gZXJyb3IgaXMgcmV0dXJuZWQsIHRyeSB0byByZWxvYWQgZ2x5cGhzIHdpdGhvdXQgaGludGluZy4KKyAgICBpZiAobG9hZF9mbGFncyAmIEZUX0xPQURfTk9fSElOVElORyB8fCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgbG9hZF9mbGFncyB8PSBGVF9MT0FEX05PX0hJTlRJTkc7CisgICAgZXJyb3IgPSBGWEZUX0xvYWRfR2x5cGgobV9GYWNlLCBnbHlwaF9pbmRleCwgbG9hZF9mbGFncyk7CisKKyAgICBpZiAoZXJyb3IpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpbnQgd2VpZ2h0ID0gMDsKKyAgaWYgKGJVc2VDSktTdWJGb250KQorICAgIHdlaWdodCA9IHBTdWJzdEZvbnQtPm1fV2VpZ2h0Q0pLOworICBlbHNlCisgICAgd2VpZ2h0ID0gcFN1YnN0Rm9udCA/IHBTdWJzdEZvbnQtPm1fV2VpZ2h0IDogMDsKKyAgaWYgKHBTdWJzdEZvbnQgJiYgIXBTdWJzdEZvbnQtPm1fYkZsYWdNTSAmJiB3ZWlnaHQgPiA0MDApIHsKKyAgICB1aW50MzJfdCBpbmRleCA9ICh3ZWlnaHQgLSA0MDApIC8gMTA7CisgICAgaWYgKGluZGV4ID49IENGWF9Gb250OjprV2VpZ2h0UG93QXJyYXlTaXplKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxzaWduZWQgbG9uZz4gbGV2ZWwgPSAwOworICAgIGlmIChwU3Vic3RGb250LT5tX0NoYXJzZXQgPT0gRlhfQ0hBUlNFVF9TaGlmdEpJUykKKyAgICAgIGxldmVsID0gQ0ZYX0ZvbnQ6OnNfV2VpZ2h0UG93X1NISUZUSklTW2luZGV4XSAqIDI7CisgICAgZWxzZQorICAgICAgbGV2ZWwgPSBDRlhfRm9udDo6c19XZWlnaHRQb3dfMTFbaW5kZXhdOworCisgICAgbGV2ZWwgPSBsZXZlbCAqCisgICAgICAgICAgICAoYWJzKHN0YXRpY19jYXN0PGludD4oZnRfbWF0cml4Lnh4KSkgKworICAgICAgICAgICAgIGFicyhzdGF0aWNfY2FzdDxpbnQ+KGZ0X21hdHJpeC54eSkpKSAvCisgICAgICAgICAgICAzNjY1NTsKKyAgICBGWEZUX091dGxpbmVfRW1ib2xkZW4oRlhGVF9HZXRfR2x5cGhfT3V0bGluZShtX0ZhY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbC5WYWx1ZU9yRGVmYXVsdCgwKSk7CisgIH0KKyAgRlhGVF9MaWJyYXJ5X1NldExjZEZpbHRlcihDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPkdldEZUTGlicmFyeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xDRF9GSUxURVJfREVGQVVMVCk7CisgIGVycm9yID0gRlhGVF9SZW5kZXJfR2x5cGgobV9GYWNlLCBhbnRpX2FsaWFzKTsKKyAgaWYgKGVycm9yKQorICAgIHJldHVybiBudWxscHRyOworICBpbnQgYm13aWR0aCA9IEZYRlRfR2V0X0JpdG1hcF9XaWR0aChGWEZUX0dldF9HbHlwaF9CaXRtYXAobV9GYWNlKSk7CisgIGludCBibWhlaWdodCA9IEZYRlRfR2V0X0JpdG1hcF9Sb3dzKEZYRlRfR2V0X0dseXBoX0JpdG1hcChtX0ZhY2UpKTsKKyAgaWYgKGJtd2lkdGggPiBrTWF4R2x5cGhEaW1lbnNpb24gfHwgYm1oZWlnaHQgPiBrTWF4R2x5cGhEaW1lbnNpb24pCisgICAgcmV0dXJuIG51bGxwdHI7CisgIGludCBkaWJfd2lkdGggPSBibXdpZHRoOworICBhdXRvIHBHbHlwaEJpdG1hcCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfR2x5cGhCaXRtYXA+KCk7CisgIHBHbHlwaEJpdG1hcC0+bV9wQml0bWFwLT5DcmVhdGUoCisgICAgICBkaWJfd2lkdGgsIGJtaGVpZ2h0LAorICAgICAgYW50aV9hbGlhcyA9PSBGWEZUX1JFTkRFUl9NT0RFX01PTk8gPyBGWERJQl8xYnBwTWFzayA6IEZYRElCXzhicHBNYXNrKTsKKyAgcEdseXBoQml0bWFwLT5tX0xlZnQgPSBGWEZUX0dldF9HbHlwaF9CaXRtYXBMZWZ0KG1fRmFjZSk7CisgIHBHbHlwaEJpdG1hcC0+bV9Ub3AgPSBGWEZUX0dldF9HbHlwaF9CaXRtYXBUb3AobV9GYWNlKTsKKyAgaW50IGRlc3RfcGl0Y2ggPSBwR2x5cGhCaXRtYXAtPm1fcEJpdG1hcC0+R2V0UGl0Y2goKTsKKyAgaW50IHNyY19waXRjaCA9IEZYRlRfR2V0X0JpdG1hcF9QaXRjaChGWEZUX0dldF9HbHlwaF9CaXRtYXAobV9GYWNlKSk7CisgIHVpbnQ4X3QqIHBEZXN0QnVmID0gcEdseXBoQml0bWFwLT5tX3BCaXRtYXAtPkdldEJ1ZmZlcigpOworICB1aW50OF90KiBwU3JjQnVmID0KKyAgICAgICh1aW50OF90KilGWEZUX0dldF9CaXRtYXBfQnVmZmVyKEZYRlRfR2V0X0dseXBoX0JpdG1hcChtX0ZhY2UpKTsKKyAgaWYgKGFudGlfYWxpYXMgIT0gRlhGVF9SRU5ERVJfTU9ERV9NT05PICYmCisgICAgICBGWEZUX0dldF9CaXRtYXBfUGl4ZWxNb2RlKEZYRlRfR2V0X0dseXBoX0JpdG1hcChtX0ZhY2UpKSA9PQorICAgICAgICAgIEZYRlRfUElYRUxfTU9ERV9NT05PKSB7CisgICAgaW50IGJ5dGVzID0gYW50aV9hbGlhcyA9PSBGWEZUX1JFTkRFUl9NT0RFX0xDRCA/IDMgOiAxOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYm1oZWlnaHQ7IGkrKykgeworICAgICAgZm9yIChpbnQgbiA9IDA7IG4gPCBibXdpZHRoOyBuKyspIHsKKyAgICAgICAgdWludDhfdCBkYXRhID0KKyAgICAgICAgICAgIChwU3JjQnVmW2kgKiBzcmNfcGl0Y2ggKyBuIC8gOF0gJiAoMHg4MCA+PiAobiAlIDgpKSkgPyAyNTUgOiAwOworICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8IGJ5dGVzOyBiKyspCisgICAgICAgICAgcERlc3RCdWZbaSAqIGRlc3RfcGl0Y2ggKyBuICogYnl0ZXMgKyBiXSA9IGRhdGE7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIG1lbXNldChwRGVzdEJ1ZiwgMCwgZGVzdF9waXRjaCAqIGJtaGVpZ2h0KTsKKyAgICBpbnQgcm93Ynl0ZXMgPSBzdGQ6Om1pbihhYnMoc3JjX3BpdGNoKSwgZGVzdF9waXRjaCk7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgYm1oZWlnaHQ7IHJvdysrKQorICAgICAgbWVtY3B5KHBEZXN0QnVmICsgcm93ICogZGVzdF9waXRjaCwgcFNyY0J1ZiArIHJvdyAqIHNyY19waXRjaCwgcm93Ynl0ZXMpOworICB9CisgIHJldHVybiBwR2x5cGhCaXRtYXA7Cit9CisKK2NvbnN0IENGWF9QYXRoRGF0YSogQ0ZYX0ZhY2VDYWNoZTo6TG9hZEdseXBoUGF0aChjb25zdCBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgpIHsKKyAgaWYgKCFtX0ZhY2UgfHwgZ2x5cGhfaW5kZXggPT0ga0ludmFsaWRHbHlwaEluZGV4KQorICAgIHJldHVybiBudWxscHRyOworCisgIGNvbnN0IGF1dG8qIHBTdWJzdEZvbnQgPSBwRm9udC0+R2V0U3Vic3RGb250KCk7CisgIGludCB3ZWlnaHQgPSBwU3Vic3RGb250ID8gcFN1YnN0Rm9udC0+bV9XZWlnaHQgOiAwOworICBpbnQgYW5nbGUgPSBwU3Vic3RGb250ID8gcFN1YnN0Rm9udC0+bV9JdGFsaWNBbmdsZSA6IDA7CisgIGJvb2wgdmVydGljYWwgPSBwU3Vic3RGb250ID8gcEZvbnQtPklzVmVydGljYWwoKSA6IGZhbHNlOworICBjb25zdCBQYXRoTWFwS2V5IGtleSA9CisgICAgICBzdGQ6Om1ha2VfdHVwbGUoZ2x5cGhfaW5kZXgsIGRlc3Rfd2lkdGgsIHdlaWdodCwgYW5nbGUsIHZlcnRpY2FsKTsKKyAgYXV0byBpdCA9IG1fUGF0aE1hcC5maW5kKGtleSk7CisgIGlmIChpdCAhPSBtX1BhdGhNYXAuZW5kKCkpCisgICAgcmV0dXJuIGl0LT5zZWNvbmQuZ2V0KCk7CisKKyAgQ0ZYX1BhdGhEYXRhKiBwR2x5cGhQYXRoID0gcEZvbnQtPkxvYWRHbHlwaFBhdGhJbXBsKGdseXBoX2luZGV4LCBkZXN0X3dpZHRoKTsKKyAgbV9QYXRoTWFwW2tleV0gPSBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1BhdGhEYXRhPihwR2x5cGhQYXRoKTsKKyAgcmV0dXJuIHBHbHlwaFBhdGg7Cit9CisKK2NvbnN0IENGWF9HbHlwaEJpdG1hcCogQ0ZYX0ZhY2VDYWNoZTo6TG9hZEdseXBoQml0bWFwKGNvbnN0IENGWF9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRm9udFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFudGlfYWxpYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHRleHRfZmxhZ3MpIHsKKyAgaWYgKGdseXBoX2luZGV4ID09IGtJbnZhbGlkR2x5cGhJbmRleCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBVbmlxdWVLZXlHZW4ga2V5Z2VuOworICBpbnQgbk1hdHJpeEEgPSBzdGF0aWNfY2FzdDxpbnQ+KHBNYXRyaXgtPmEgKiAxMDAwMCk7CisgIGludCBuTWF0cml4QiA9IHN0YXRpY19jYXN0PGludD4ocE1hdHJpeC0+YiAqIDEwMDAwKTsKKyAgaW50IG5NYXRyaXhDID0gc3RhdGljX2Nhc3Q8aW50PihwTWF0cml4LT5jICogMTAwMDApOworICBpbnQgbk1hdHJpeEQgPSBzdGF0aWNfY2FzdDxpbnQ+KHBNYXRyaXgtPmQgKiAxMDAwMCk7CisjaWYgX0ZYX1BMQVRGT1JNXyAhPSBfRlhfUExBVEZPUk1fQVBQTEVfCisgIGlmIChwRm9udC0+R2V0U3Vic3RGb250KCkpIHsKKyAgICBrZXlnZW4uR2VuZXJhdGUoOSwgbk1hdHJpeEEsIG5NYXRyaXhCLCBuTWF0cml4Qywgbk1hdHJpeEQsIGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGFudGlfYWxpYXMsIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9JdGFsaWNBbmdsZSwgcEZvbnQtPklzVmVydGljYWwoKSk7CisgIH0gZWxzZSB7CisgICAga2V5Z2VuLkdlbmVyYXRlKDYsIG5NYXRyaXhBLCBuTWF0cml4Qiwgbk1hdHJpeEMsIG5NYXRyaXhELCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICBhbnRpX2FsaWFzKTsKKyAgfQorI2Vsc2UKKyAgaWYgKHRleHRfZmxhZ3MgJiBGWFRFWFRfTk9fTkFUSVZFVEVYVCkgeworICAgIGlmIChwRm9udC0+R2V0U3Vic3RGb250KCkpIHsKKyAgICAgIGtleWdlbi5HZW5lcmF0ZSg5LCBuTWF0cml4QSwgbk1hdHJpeEIsIG5NYXRyaXhDLCBuTWF0cml4RCwgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICBhbnRpX2FsaWFzLCBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9JdGFsaWNBbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICBwRm9udC0+SXNWZXJ0aWNhbCgpKTsKKyAgICB9IGVsc2UgeworICAgICAga2V5Z2VuLkdlbmVyYXRlKDYsIG5NYXRyaXhBLCBuTWF0cml4Qiwgbk1hdHJpeEMsIG5NYXRyaXhELCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgIGFudGlfYWxpYXMpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAocEZvbnQtPkdldFN1YnN0Rm9udCgpKSB7CisgICAgICBrZXlnZW4uR2VuZXJhdGUoMTAsIG5NYXRyaXhBLCBuTWF0cml4Qiwgbk1hdHJpeEMsIG5NYXRyaXhELCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgIGFudGlfYWxpYXMsIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX0l0YWxpY0FuZ2xlLCBwRm9udC0+SXNWZXJ0aWNhbCgpLAorICAgICAgICAgICAgICAgICAgICAgIDMpOworICAgIH0gZWxzZSB7CisgICAgICBrZXlnZW4uR2VuZXJhdGUoNywgbk1hdHJpeEEsIG5NYXRyaXhCLCBuTWF0cml4Qywgbk1hdHJpeEQsIGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgYW50aV9hbGlhcywgMyk7CisgICAgfQorICB9CisjZW5kaWYKKyAgQnl0ZVN0cmluZyBGYWNlR2x5cGhzS2V5KGtleWdlbi5rZXlfLCBrZXlnZW4ua2V5X2xlbl8pOworI2lmIF9GWF9QTEFURk9STV8gIT0gX0ZYX1BMQVRGT1JNX0FQUExFXyB8fCBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfIHx8IFwKKyAgICBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfUEFUSFNfCisgIHJldHVybiBMb29rVXBHbHlwaEJpdG1hcChwRm9udCwgcE1hdHJpeCwgRmFjZUdseXBoc0tleSwgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiRm9udFN0eWxlLCBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzKTsKKyNlbHNlCisgIGlmICh0ZXh0X2ZsYWdzICYgRlhURVhUX05PX05BVElWRVRFWFQpIHsKKyAgICByZXR1cm4gTG9va1VwR2x5cGhCaXRtYXAocEZvbnQsIHBNYXRyaXgsIEZhY2VHbHlwaHNLZXksIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRm9udFN0eWxlLCBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzKTsKKyAgfQorICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0dseXBoQml0bWFwPiBwR2x5cGhCaXRtYXA7CisgIGF1dG8gaXQgPSBtX1NpemVNYXAuZmluZChGYWNlR2x5cGhzS2V5KTsKKyAgaWYgKGl0ICE9IG1fU2l6ZU1hcC5lbmQoKSkgeworICAgIFNpemVHbHlwaENhY2hlKiBwU2l6ZUNhY2hlID0gJihpdC0+c2Vjb25kKTsKKyAgICBhdXRvIGl0MiA9IHBTaXplQ2FjaGUtPmZpbmQoZ2x5cGhfaW5kZXgpOworICAgIGlmIChpdDIgIT0gcFNpemVDYWNoZS0+ZW5kKCkpCisgICAgICByZXR1cm4gaXQyLT5zZWNvbmQuZ2V0KCk7CisKKyAgICBwR2x5cGhCaXRtYXAgPSBSZW5kZXJHbHlwaF9OYXRpdmV0ZXh0KHBGb250LCBnbHlwaF9pbmRleCwgcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMpOworICAgIGlmIChwR2x5cGhCaXRtYXApIHsKKyAgICAgIENGWF9HbHlwaEJpdG1hcCogcFJlc3VsdCA9IHBHbHlwaEJpdG1hcC5nZXQoKTsKKyAgICAgICgqcFNpemVDYWNoZSlbZ2x5cGhfaW5kZXhdID0gc3RkOjptb3ZlKHBHbHlwaEJpdG1hcCk7CisgICAgICByZXR1cm4gcFJlc3VsdDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgcEdseXBoQml0bWFwID0gUmVuZGVyR2x5cGhfTmF0aXZldGV4dChwRm9udCwgZ2x5cGhfaW5kZXgsIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3dpZHRoLCBhbnRpX2FsaWFzKTsKKyAgICBpZiAocEdseXBoQml0bWFwKSB7CisgICAgICBDRlhfR2x5cGhCaXRtYXAqIHBSZXN1bHQgPSBwR2x5cGhCaXRtYXAuZ2V0KCk7CisKKyAgICAgIFNpemVHbHlwaENhY2hlIGNhY2hlOworICAgICAgY2FjaGVbZ2x5cGhfaW5kZXhdID0gc3RkOjptb3ZlKHBHbHlwaEJpdG1hcCk7CisKKyAgICAgIG1fU2l6ZU1hcFtGYWNlR2x5cGhzS2V5XSA9IHN0ZDo6bW92ZShjYWNoZSk7CisgICAgICByZXR1cm4gcFJlc3VsdDsKKyAgICB9CisgIH0KKyAgaWYgKHBGb250LT5HZXRTdWJzdEZvbnQoKSkgeworICAgIGtleWdlbi5HZW5lcmF0ZSg5LCBuTWF0cml4QSwgbk1hdHJpeEIsIG5NYXRyaXhDLCBuTWF0cml4RCwgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgYW50aV9hbGlhcywgcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1dlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX0l0YWxpY0FuZ2xlLCBwRm9udC0+SXNWZXJ0aWNhbCgpKTsKKyAgfSBlbHNlIHsKKyAgICBrZXlnZW4uR2VuZXJhdGUoNiwgbk1hdHJpeEEsIG5NYXRyaXhCLCBuTWF0cml4Qywgbk1hdHJpeEQsIGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGFudGlfYWxpYXMpOworICB9CisgIEJ5dGVTdHJpbmcgRmFjZUdseXBoc0tleTIoa2V5Z2VuLmtleV8sIGtleWdlbi5rZXlfbGVuXyk7CisgIHRleHRfZmxhZ3MgfD0gRlhURVhUX05PX05BVElWRVRFWFQ7CisgIHJldHVybiBMb29rVXBHbHlwaEJpdG1hcChwRm9udCwgcE1hdHJpeCwgRmFjZUdseXBoc0tleTIsIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZvbnRTdHlsZSwgZGVzdF93aWR0aCwgYW50aV9hbGlhcyk7CisjZW5kaWYKK30KKworI2lmIGRlZmluZWQgX1NLSUFfU1VQUE9SVF8gfHwgZGVmaW5lZCBfU0tJQV9TVVBQT1JUX1BBVEhTXworQ0ZYX1R5cGVGYWNlKiBDRlhfRmFjZUNhY2hlOjpHZXREZXZpY2VDYWNoZShjb25zdCBDRlhfRm9udCogcEZvbnQpIHsKKyAgaWYgKCFtX3BUeXBlZmFjZSkgeworICAgIG1fcFR5cGVmYWNlID0gU2tUeXBlZmFjZTo6TWFrZUZyb21TdHJlYW0oCisgICAgICAgIG5ldyBTa01lbW9yeVN0cmVhbShwRm9udC0+R2V0Rm9udERhdGEoKSwgcEZvbnQtPkdldFNpemUoKSkpOworICB9CisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KKyAgaWYgKCFtX3BUeXBlZmFjZSkgeworICAgIHNrX3NwPFNrRm9udE1ncj4gY3VzdG9tTWdyKFNrRm9udE1ncl9OZXdfQ3VzdG9tX0VtcHR5KCkpOworICAgIG1fcFR5cGVmYWNlID0gY3VzdG9tTWdyLT5tYWtlRnJvbVN0cmVhbShwZGZpdW06Ok1ha2VVbmlxdWU8U2tNZW1vcnlTdHJlYW0+KAorICAgICAgICBwRm9udC0+R2V0Rm9udERhdGEoKSwgcEZvbnQtPkdldFNpemUoKSkpOworICB9CisjZW5kaWYKKyAgcmV0dXJuIG1fcFR5cGVmYWNlLmdldCgpOworfQorI2VuZGlmCisKKyNpZiBfRlhfUExBVEZPUk1fICE9IF9GWF9QTEFURk9STV9BUFBMRV8KK3ZvaWQgQ0ZYX0ZhY2VDYWNoZTo6SW5pdFBsYXRmb3JtKCkge30KKyNlbmRpZgorCitDRlhfR2x5cGhCaXRtYXAqIENGWF9GYWNlQ2FjaGU6Okxvb2tVcEdseXBoQml0bWFwKAorICAgIGNvbnN0IENGWF9Gb250KiBwRm9udCwKKyAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgIGNvbnN0IEJ5dGVTdHJpbmcmIEZhY2VHbHlwaHNLZXksCisgICAgdWludDMyX3QgZ2x5cGhfaW5kZXgsCisgICAgYm9vbCBiRm9udFN0eWxlLAorICAgIGludCBkZXN0X3dpZHRoLAorICAgIGludCBhbnRpX2FsaWFzKSB7CisgIFNpemVHbHlwaENhY2hlKiBwU2l6ZUNhY2hlOworICBhdXRvIGl0ID0gbV9TaXplTWFwLmZpbmQoRmFjZUdseXBoc0tleSk7CisgIGlmIChpdCA9PSBtX1NpemVNYXAuZW5kKCkpIHsKKyAgICBtX1NpemVNYXBbRmFjZUdseXBoc0tleV0gPSBTaXplR2x5cGhDYWNoZSgpOworICAgIHBTaXplQ2FjaGUgPSAmKG1fU2l6ZU1hcFtGYWNlR2x5cGhzS2V5XSk7CisgIH0gZWxzZSB7CisgICAgcFNpemVDYWNoZSA9ICYoaXQtPnNlY29uZCk7CisgIH0KKworICBhdXRvIGl0MiA9IHBTaXplQ2FjaGUtPmZpbmQoZ2x5cGhfaW5kZXgpOworICBpZiAoaXQyICE9IHBTaXplQ2FjaGUtPmVuZCgpKQorICAgIHJldHVybiBpdDItPnNlY29uZC5nZXQoKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0dseXBoQml0bWFwPiBwR2x5cGhCaXRtYXAgPSBSZW5kZXJHbHlwaCgKKyAgICAgIHBGb250LCBnbHlwaF9pbmRleCwgYkZvbnRTdHlsZSwgcE1hdHJpeCwgZGVzdF93aWR0aCwgYW50aV9hbGlhcyk7CisgIENGWF9HbHlwaEJpdG1hcCogcFJlc3VsdCA9IHBHbHlwaEJpdG1hcC5nZXQoKTsKKyAgKCpwU2l6ZUNhY2hlKVtnbHlwaF9pbmRleF0gPSBzdGQ6Om1vdmUocEdseXBoQml0bWFwKTsKKyAgcmV0dXJuIHBSZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvY2Z4X2ZhY2VjYWNoZS5oIGIvY29yZS9meGdlL2NmeF9mYWNlY2FjaGUuaAppbmRleCA0NGVkMGIyLi5hMzlkYTg4IDEwMDY0NAotLS0gYS9jb3JlL2Z4Z2UvY2Z4X2ZhY2VjYWNoZS5oCisrKyBiL2NvcmUvZnhnZS9jZnhfZmFjZWNhY2hlLmgKQEAgLTksMTAgKzksMTkgQEAKIAogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dHVwbGU+CiAKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZvbnQuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKIAorI2lmIGRlZmluZWQgX1NLSUFfU1VQUE9SVF8gfHwgX1NLSUFfU1VQUE9SVF9QQVRIU18KKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZS9Ta1R5cGVmYWNlLmgiCisjZW5kaWYKKworY2xhc3MgQ0ZYX0ZvbnQ7CitjbGFzcyBDRlhfUGF0aERhdGE7CisKIGNsYXNzIENGWF9GYWNlQ2FjaGUgewogIHB1YmxpYzoKICAgZXhwbGljaXQgQ0ZYX0ZhY2VDYWNoZShGWEZUX0ZhY2UgZmFjZSk7CkBAIC0zMywyMCArNDIsMjUgQEAKICNlbmRpZgogCiAgcHJpdmF0ZToKLSAgQ0ZYX0dseXBoQml0bWFwKiBSZW5kZXJHbHlwaChjb25zdCBDRlhfRm9udCogcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRm9udFN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFudGlfYWxpYXMpOwotICBDRlhfR2x5cGhCaXRtYXAqIFJlbmRlckdseXBoX05hdGl2ZXRleHQoY29uc3QgQ0ZYX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW50aV9hbGlhcyk7CisgIHVzaW5nIFNpemVHbHlwaENhY2hlID0gc3RkOjptYXA8dWludDMyX3QsIHN0ZDo6dW5pcXVlX3B0cjxDRlhfR2x5cGhCaXRtYXA+PjsKKyAgLy8gPGdseXBoX2luZGV4LCB3aWR0aCwgd2VpZ2h0LCBhbmdsZSwgdmVydGljYWw+CisgIHVzaW5nIFBhdGhNYXBLZXkgPSBzdGQ6OnR1cGxlPHVpbnQzMl90LCBpbnQsIGludCwgaW50LCBib29sPjsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0dseXBoQml0bWFwPiBSZW5kZXJHbHlwaChjb25zdCBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGb250U3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW50aV9hbGlhcyk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfR2x5cGhCaXRtYXA+IFJlbmRlckdseXBoX05hdGl2ZXRleHQoCisgICAgICBjb25zdCBDRlhfRm9udCogcEZvbnQsCisgICAgICB1aW50MzJfdCBnbHlwaF9pbmRleCwKKyAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgIGludCBhbnRpX2FsaWFzKTsKICAgQ0ZYX0dseXBoQml0bWFwKiBMb29rVXBHbHlwaEJpdG1hcChjb25zdCBDRlhfRm9udCogcEZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgRmFjZUdseXBoc0tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBGYWNlR2x5cGhzS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdseXBoX2luZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZvbnRTdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKQEAgLTU1LDEwICs2OSwxMCBAQAogICB2b2lkIERlc3Ryb3lQbGF0Zm9ybSgpOwogCiAgIEZYRlRfRmFjZSBjb25zdCBtX0ZhY2U7Ci0gIHN0ZDo6bWFwPENGWF9CeXRlU3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1NpemVHbHlwaENhY2hlPj4gbV9TaXplTWFwOwotICBzdGQ6Om1hcDx1aW50MzJfdCwgc3RkOjp1bmlxdWVfcHRyPENGWF9QYXRoRGF0YT4+IG1fUGF0aE1hcDsKKyAgc3RkOjptYXA8Qnl0ZVN0cmluZywgU2l6ZUdseXBoQ2FjaGU+IG1fU2l6ZU1hcDsKKyAgc3RkOjptYXA8UGF0aE1hcEtleSwgc3RkOjp1bmlxdWVfcHRyPENGWF9QYXRoRGF0YT4+IG1fUGF0aE1hcDsKICNpZiBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfIHx8IF9TS0lBX1NVUFBPUlRfUEFUSFNfCi0gIENGWF9UeXBlRmFjZSogbV9wVHlwZWZhY2U7CisgIHNrX3NwPFNrVHlwZWZhY2U+IG1fcFR5cGVmYWNlOwogI2VuZGlmCiB9OwogCmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvY2Z4X2ZvbGRlcmZvbnRpbmZvLmNwcCBiL2NvcmUvZnhnZS9jZnhfZm9sZGVyZm9udGluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMjgyNGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Z2UvY2Z4X2ZvbGRlcmZvbnRpbmZvLmNwcApAQCAtMCwwICsxLDM5OCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mb2xkZXJmb250aW5mby5oIgorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2NvZGVwYWdlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJlYW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnRtYXBwZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZm9udC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisKKyNkZWZpbmUgQ0hBUlNFVF9GTEFHX0FOU0kgKDEgPDwgMCkKKyNkZWZpbmUgQ0hBUlNFVF9GTEFHX1NZTUJPTCAoMSA8PCAxKQorI2RlZmluZSBDSEFSU0VUX0ZMQUdfU0hJRlRKSVMgKDEgPDwgMikKKyNkZWZpbmUgQ0hBUlNFVF9GTEFHX0JJRzUgKDEgPDwgMykKKyNkZWZpbmUgQ0hBUlNFVF9GTEFHX0dCICgxIDw8IDQpCisjZGVmaW5lIENIQVJTRVRfRkxBR19LT1JFQU4gKDEgPDwgNSkKKworbmFtZXNwYWNlIHsKKworY29uc3Qgc3RydWN0IHsKKyAgY29uc3QgY2hhciogbV9wTmFtZTsKKyAgY29uc3QgY2hhciogbV9wU3Vic3ROYW1lOworfSBCYXNlMTRTdWJzdHNbXSA9IHsKKyAgICB7IkNvdXJpZXIiLCAiQ291cmllciBOZXcifSwKKyAgICB7IkNvdXJpZXItQm9sZCIsICJDb3VyaWVyIE5ldyBCb2xkIn0sCisgICAgeyJDb3VyaWVyLUJvbGRPYmxpcXVlIiwgIkNvdXJpZXIgTmV3IEJvbGQgSXRhbGljIn0sCisgICAgeyJDb3VyaWVyLU9ibGlxdWUiLCAiQ291cmllciBOZXcgSXRhbGljIn0sCisgICAgeyJIZWx2ZXRpY2EiLCAiQXJpYWwifSwKKyAgICB7IkhlbHZldGljYS1Cb2xkIiwgIkFyaWFsIEJvbGQifSwKKyAgICB7IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsICJBcmlhbCBCb2xkIEl0YWxpYyJ9LAorICAgIHsiSGVsdmV0aWNhLU9ibGlxdWUiLCAiQXJpYWwgSXRhbGljIn0sCisgICAgeyJUaW1lcy1Sb21hbiIsICJUaW1lcyBOZXcgUm9tYW4ifSwKKyAgICB7IlRpbWVzLUJvbGQiLCAiVGltZXMgTmV3IFJvbWFuIEJvbGQifSwKKyAgICB7IlRpbWVzLUJvbGRJdGFsaWMiLCAiVGltZXMgTmV3IFJvbWFuIEJvbGQgSXRhbGljIn0sCisgICAgeyJUaW1lcy1JdGFsaWMiLCAiVGltZXMgTmV3IFJvbWFuIEl0YWxpYyJ9LAorfTsKKworQnl0ZVN0cmluZyBGUERGX1JlYWRTdHJpbmdGcm9tRmlsZShGSUxFKiBwRmlsZSwgdWludDMyX3Qgc2l6ZSkgeworICBCeXRlU3RyaW5nIGJ1ZmZlcjsKKyAgaWYgKCFmcmVhZChidWZmZXIuR2V0QnVmZmVyKHNpemUpLCBzaXplLCAxLCBwRmlsZSkpCisgICAgcmV0dXJuIEJ5dGVTdHJpbmcoKTsKKyAgYnVmZmVyLlJlbGVhc2VCdWZmZXIoc2l6ZSk7CisgIHJldHVybiBidWZmZXI7Cit9CisKK0J5dGVTdHJpbmcgRlBERl9Mb2FkVGFibGVGcm9tVFQoRklMRSogcEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBUYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5UYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlsZVNpemUpIHsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5UYWJsZXM7IGkrKykgeworICAgIGNvbnN0IHVpbnQ4X3QqIHAgPSBwVGFibGVzICsgaSAqIDE2OworICAgIGlmIChHRVRfVFRfTE9ORyhwKSA9PSB0YWcpIHsKKyAgICAgIHVpbnQzMl90IG9mZnNldCA9IEdFVF9UVF9MT05HKHAgKyA4KTsKKyAgICAgIHVpbnQzMl90IHNpemUgPSBHRVRfVFRfTE9ORyhwICsgMTIpOworICAgICAgaWYgKG9mZnNldCA+IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSAtIHNpemUgfHwKKyAgICAgICAgICBvZmZzZXQgKyBzaXplID4gZmlsZVNpemUgfHwgZnNlZWsocEZpbGUsIG9mZnNldCwgU0VFS19TRVQpIDwgMCkgeworICAgICAgICByZXR1cm4gQnl0ZVN0cmluZygpOworICAgICAgfQorICAgICAgcmV0dXJuIEZQREZfUmVhZFN0cmluZ0Zyb21GaWxlKHBGaWxlLCBzaXplKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEJ5dGVTdHJpbmcoKTsKK30KKwordWludDMyX3QgR2V0Q2hhcnNldChpbnQgY2hhcnNldCkgeworICBzd2l0Y2ggKGNoYXJzZXQpIHsKKyAgICBjYXNlIEZYX0NIQVJTRVRfU2hpZnRKSVM6CisgICAgICByZXR1cm4gQ0hBUlNFVF9GTEFHX1NISUZUSklTOworICAgIGNhc2UgRlhfQ0hBUlNFVF9DaGluZXNlU2ltcGxpZmllZDoKKyAgICAgIHJldHVybiBDSEFSU0VUX0ZMQUdfR0I7CisgICAgY2FzZSBGWF9DSEFSU0VUX0NoaW5lc2VUcmFkaXRpb25hbDoKKyAgICAgIHJldHVybiBDSEFSU0VUX0ZMQUdfQklHNTsKKyAgICBjYXNlIEZYX0NIQVJTRVRfSGFuZ3VsOgorICAgICAgcmV0dXJuIENIQVJTRVRfRkxBR19LT1JFQU47CisgICAgY2FzZSBGWF9DSEFSU0VUX1N5bWJvbDoKKyAgICAgIHJldHVybiBDSEFSU0VUX0ZMQUdfU1lNQk9MOworICAgIGNhc2UgRlhfQ0hBUlNFVF9BTlNJOgorICAgICAgcmV0dXJuIENIQVJTRVRfRkxBR19BTlNJOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50MzJfdCBHZXRTaW1pbGFyVmFsdWUoaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHlsZSkgeworICBpbnQzMl90IGlTaW1pbGFyVmFsdWUgPSAwOworICBpZiAoRm9udFN0eWxlSXNCb2xkKHN0eWxlKSA9PSAod2VpZ2h0ID4gNDAwKSkKKyAgICBpU2ltaWxhclZhbHVlICs9IDE2OworICBpZiAoRm9udFN0eWxlSXNJdGFsaWMoc3R5bGUpID09IGJJdGFsaWMpCisgICAgaVNpbWlsYXJWYWx1ZSArPSAxNjsKKyAgaWYgKEZvbnRTdHlsZUlzU2VyaWYoc3R5bGUpID09IEZvbnRGYW1pbHlJc1JvbWFuKHBpdGNoX2ZhbWlseSkpCisgICAgaVNpbWlsYXJWYWx1ZSArPSAxNjsKKyAgaWYgKEZvbnRTdHlsZUlzU2NyaXB0KHN0eWxlKSA9PSBGb250RmFtaWx5SXNTY3JpcHQocGl0Y2hfZmFtaWx5KSkKKyAgICBpU2ltaWxhclZhbHVlICs9IDg7CisgIGlmIChGb250U3R5bGVJc0ZpeGVkUGl0Y2goc3R5bGUpID09IEZvbnRGYW1pbHlJc0ZpeGVkUGl0Y2gocGl0Y2hfZmFtaWx5KSkKKyAgICBpU2ltaWxhclZhbHVlICs9IDg7CisgIHJldHVybiBpU2ltaWxhclZhbHVlOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQ0ZYX0ZvbGRlckZvbnRJbmZvOjpDRlhfRm9sZGVyRm9udEluZm8oKSB7fQorCitDRlhfRm9sZGVyRm9udEluZm86On5DRlhfRm9sZGVyRm9udEluZm8oKSB7fQorCit2b2lkIENGWF9Gb2xkZXJGb250SW5mbzo6QWRkUGF0aChjb25zdCBCeXRlU3RyaW5nJiBwYXRoKSB7CisgIG1fUGF0aExpc3QucHVzaF9iYWNrKHBhdGgpOworfQorCitib29sIENGWF9Gb2xkZXJGb250SW5mbzo6RW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKSB7CisgIG1fcE1hcHBlciA9IHBNYXBwZXI7CisgIGZvciAoY29uc3QgYXV0byYgcGF0aCA6IG1fUGF0aExpc3QpCisgICAgU2NhblBhdGgocGF0aCk7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENGWF9Gb2xkZXJGb250SW5mbzo6U2NhblBhdGgoY29uc3QgQnl0ZVN0cmluZyYgcGF0aCkgeworICBGWF9GaWxlSGFuZGxlKiBoYW5kbGUgPSBGWF9PcGVuRm9sZGVyKHBhdGguY19zdHIoKSk7CisgIGlmICghaGFuZGxlKQorICAgIHJldHVybjsKKworICBCeXRlU3RyaW5nIGZpbGVuYW1lOworICBib29sIGJGb2xkZXI7CisgIHdoaWxlIChGWF9HZXROZXh0RmlsZShoYW5kbGUsICZmaWxlbmFtZSwgJmJGb2xkZXIpKSB7CisgICAgaWYgKGJGb2xkZXIpIHsKKyAgICAgIGlmIChmaWxlbmFtZSA9PSAiLiIgfHwgZmlsZW5hbWUgPT0gIi4uIikKKyAgICAgICAgY29udGludWU7CisgICAgfSBlbHNlIHsKKyAgICAgIEJ5dGVTdHJpbmcgZXh0ID0gZmlsZW5hbWUuUmlnaHQoNCk7CisgICAgICBleHQuTWFrZVVwcGVyKCk7CisgICAgICBpZiAoZXh0ICE9ICIuVFRGIiAmJiBleHQgIT0gIi5PVEYiICYmIGV4dCAhPSAiLlRUQyIpCisgICAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIEJ5dGVTdHJpbmcgZnVsbHBhdGggPSBwYXRoOworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisgICAgZnVsbHBhdGggKz0gIlxcIjsKKyNlbHNlCisgICAgZnVsbHBhdGggKz0gIi8iOworI2VuZGlmCisKKyAgICBmdWxscGF0aCArPSBmaWxlbmFtZTsKKyAgICBiRm9sZGVyID8gU2NhblBhdGgoZnVsbHBhdGgpIDogU2NhbkZpbGUoZnVsbHBhdGgpOworICB9CisgIEZYX0Nsb3NlRm9sZGVyKGhhbmRsZSk7Cit9CisKK3ZvaWQgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpTY2FuRmlsZShjb25zdCBCeXRlU3RyaW5nJiBwYXRoKSB7CisgIEZJTEUqIHBGaWxlID0gZm9wZW4ocGF0aC5jX3N0cigpLCAicmIiKTsKKyAgaWYgKCFwRmlsZSkKKyAgICByZXR1cm47CisKKyAgZnNlZWsocEZpbGUsIDAsIFNFRUtfRU5EKTsKKworICB1aW50MzJfdCBmaWxlc2l6ZSA9IGZ0ZWxsKHBGaWxlKTsKKyAgdWludDhfdCBidWZmZXJbMTZdOworICBmc2VlayhwRmlsZSwgMCwgU0VFS19TRVQpOworCisgIHNpemVfdCByZWFkQ250ID0gZnJlYWQoYnVmZmVyLCAxMiwgMSwgcEZpbGUpOworICBpZiAocmVhZENudCAhPSAxKSB7CisgICAgZmNsb3NlKHBGaWxlKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoR0VUX1RUX0xPTkcoYnVmZmVyKSA9PSBrVGFibGVUVENGKSB7CisgICAgdWludDMyX3QgbkZhY2VzID0gR0VUX1RUX0xPTkcoYnVmZmVyICsgOCk7CisgICAgaWYgKG5GYWNlcyA+IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSAvIDQpIHsKKyAgICAgIGZjbG9zZShwRmlsZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQzMl90IGZhY2VfYnl0ZXMgPSBuRmFjZXMgKiA0OworICAgIHVpbnQ4X3QqIG9mZnNldHMgPSBGWF9BbGxvYyh1aW50OF90LCBmYWNlX2J5dGVzKTsKKyAgICByZWFkQ250ID0gZnJlYWQob2Zmc2V0cywgMSwgZmFjZV9ieXRlcywgcEZpbGUpOworICAgIGlmIChyZWFkQ250ICE9IGZhY2VfYnl0ZXMpIHsKKyAgICAgIEZYX0ZyZWUob2Zmc2V0cyk7CisgICAgICBmY2xvc2UocEZpbGUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbkZhY2VzOyBpKyspIHsKKyAgICAgIHVpbnQ4X3QqIHAgPSBvZmZzZXRzICsgaSAqIDQ7CisgICAgICBSZXBvcnRGYWNlKHBhdGgsIHBGaWxlLCBmaWxlc2l6ZSwgR0VUX1RUX0xPTkcocCkpOworICAgIH0KKyAgICBGWF9GcmVlKG9mZnNldHMpOworICB9IGVsc2UgeworICAgIFJlcG9ydEZhY2UocGF0aCwgcEZpbGUsIGZpbGVzaXplLCAwKTsKKyAgfQorICBmY2xvc2UocEZpbGUpOworfQorCit2b2lkIENGWF9Gb2xkZXJGb250SW5mbzo6UmVwb3J0RmFjZShjb25zdCBCeXRlU3RyaW5nJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRSogcEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaWxlc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG9mZnNldCkgeworICBjaGFyIGJ1ZmZlclsxNl07CisgIGlmIChmc2VlayhwRmlsZSwgb2Zmc2V0LCBTRUVLX1NFVCkgPCAwIHx8ICFmcmVhZChidWZmZXIsIDEyLCAxLCBwRmlsZSkpCisgICAgcmV0dXJuOworCisgIHVpbnQzMl90IG5UYWJsZXMgPSBHRVRfVFRfU0hPUlQoYnVmZmVyICsgNCk7CisgIEJ5dGVTdHJpbmcgdGFibGVzID0gRlBERl9SZWFkU3RyaW5nRnJvbUZpbGUocEZpbGUsIG5UYWJsZXMgKiAxNik7CisgIGlmICh0YWJsZXMuSXNFbXB0eSgpKQorICAgIHJldHVybjsKKworICBCeXRlU3RyaW5nIG5hbWVzID0gRlBERl9Mb2FkVGFibGVGcm9tVFQocEZpbGUsIHRhYmxlcy5yYXdfc3RyKCksIG5UYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDZlNjE2ZDY1LCBmaWxlc2l6ZSk7CisgIGlmIChuYW1lcy5Jc0VtcHR5KCkpCisgICAgcmV0dXJuOworCisgIEJ5dGVTdHJpbmcgZmFjZW5hbWUgPSBHZXROYW1lRnJvbVRUKG5hbWVzLnJhd19zdHIoKSwgbmFtZXMuR2V0TGVuZ3RoKCksIDEpOworICBpZiAoZmFjZW5hbWUuSXNFbXB0eSgpKQorICAgIHJldHVybjsKKworICBCeXRlU3RyaW5nIHN0eWxlID0gR2V0TmFtZUZyb21UVChuYW1lcy5yYXdfc3RyKCksIG5hbWVzLkdldExlbmd0aCgpLCAyKTsKKyAgaWYgKHN0eWxlICE9ICJSZWd1bGFyIikKKyAgICBmYWNlbmFtZSArPSAiICIgKyBzdHlsZTsKKworICBpZiAocGRmaXVtOjpDb250YWluc0tleShtX0ZvbnRMaXN0LCBmYWNlbmFtZSkpCisgICAgcmV0dXJuOworCisgIGF1dG8gcEluZm8gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Rm9udEZhY2VJbmZvPihwYXRoLCBmYWNlbmFtZSwgdGFibGVzLCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlc2l6ZSk7CisgIEJ5dGVTdHJpbmcgb3MyID0gRlBERl9Mb2FkVGFibGVGcm9tVFQocEZpbGUsIHRhYmxlcy5yYXdfc3RyKCksIG5UYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ZjUzMmYzMiwgZmlsZXNpemUpOworICBpZiAob3MyLkdldExlbmd0aCgpID49IDg2KSB7CisgICAgY29uc3QgdWludDhfdCogcCA9IG9zMi5yYXdfc3RyKCkgKyA3ODsKKyAgICB1aW50MzJfdCBjb2RlcGFnZXMgPSBHRVRfVFRfTE9ORyhwKTsKKyAgICBpZiAoY29kZXBhZ2VzICYgKDEgPDwgMTcpKSB7CisgICAgICBtX3BNYXBwZXItPkFkZEluc3RhbGxlZEZvbnQoZmFjZW5hbWUsIEZYX0NIQVJTRVRfU2hpZnRKSVMpOworICAgICAgcEluZm8tPm1fQ2hhcnNldHMgfD0gQ0hBUlNFVF9GTEFHX1NISUZUSklTOworICAgIH0KKyAgICBpZiAoY29kZXBhZ2VzICYgKDEgPDwgMTgpKSB7CisgICAgICBtX3BNYXBwZXItPkFkZEluc3RhbGxlZEZvbnQoZmFjZW5hbWUsIEZYX0NIQVJTRVRfQ2hpbmVzZVNpbXBsaWZpZWQpOworICAgICAgcEluZm8tPm1fQ2hhcnNldHMgfD0gQ0hBUlNFVF9GTEFHX0dCOworICAgIH0KKyAgICBpZiAoY29kZXBhZ2VzICYgKDEgPDwgMjApKSB7CisgICAgICBtX3BNYXBwZXItPkFkZEluc3RhbGxlZEZvbnQoZmFjZW5hbWUsIEZYX0NIQVJTRVRfQ2hpbmVzZVRyYWRpdGlvbmFsKTsKKyAgICAgIHBJbmZvLT5tX0NoYXJzZXRzIHw9IENIQVJTRVRfRkxBR19CSUc1OworICAgIH0KKyAgICBpZiAoKGNvZGVwYWdlcyAmICgxIDw8IDE5KSkgfHwgKGNvZGVwYWdlcyAmICgxIDw8IDIxKSkpIHsKKyAgICAgIG1fcE1hcHBlci0+QWRkSW5zdGFsbGVkRm9udChmYWNlbmFtZSwgRlhfQ0hBUlNFVF9IYW5ndWwpOworICAgICAgcEluZm8tPm1fQ2hhcnNldHMgfD0gQ0hBUlNFVF9GTEFHX0tPUkVBTjsKKyAgICB9CisgICAgaWYgKGNvZGVwYWdlcyAmICgxIDw8IDMxKSkgeworICAgICAgbV9wTWFwcGVyLT5BZGRJbnN0YWxsZWRGb250KGZhY2VuYW1lLCBGWF9DSEFSU0VUX1N5bWJvbCk7CisgICAgICBwSW5mby0+bV9DaGFyc2V0cyB8PSBDSEFSU0VUX0ZMQUdfU1lNQk9MOworICAgIH0KKyAgfQorICBtX3BNYXBwZXItPkFkZEluc3RhbGxlZEZvbnQoZmFjZW5hbWUsIEZYX0NIQVJTRVRfQU5TSSk7CisgIHBJbmZvLT5tX0NoYXJzZXRzIHw9IENIQVJTRVRfRkxBR19BTlNJOworICBwSW5mby0+bV9TdHlsZXMgPSAwOworICBpZiAoc3R5bGUuQ29udGFpbnMoIkJvbGQiKSkKKyAgICBwSW5mby0+bV9TdHlsZXMgfD0gRlhGT05UX0JPTEQ7CisgIGlmIChzdHlsZS5Db250YWlucygiSXRhbGljIikgfHwgc3R5bGUuQ29udGFpbnMoIk9ibGlxdWUiKSkKKyAgICBwSW5mby0+bV9TdHlsZXMgfD0gRlhGT05UX0lUQUxJQzsKKyAgaWYgKGZhY2VuYW1lLkNvbnRhaW5zKCJTZXJpZiIpKQorICAgIHBJbmZvLT5tX1N0eWxlcyB8PSBGWEZPTlRfU0VSSUY7CisKKyAgbV9Gb250TGlzdFtmYWNlbmFtZV0gPSBzdGQ6Om1vdmUocEluZm8pOworfQorCit2b2lkKiBDRlhfRm9sZGVyRm9udEluZm86OkdldFN1YnN0Rm9udChjb25zdCBCeXRlU3RyaW5nJiBmYWNlKSB7CisgIGZvciAoc2l6ZV90IGlCYXNlRm9udCA9IDA7IGlCYXNlRm9udCA8IEZYX0FycmF5U2l6ZShCYXNlMTRTdWJzdHMpOworICAgICAgIGlCYXNlRm9udCsrKSB7CisgICAgaWYgKGZhY2UgPT0gQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9wTmFtZSkKKyAgICAgIHJldHVybiBHZXRGb250KEJhc2UxNFN1YnN0c1tpQmFzZUZvbnRdLm1fcFN1YnN0TmFtZSk7CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3ZvaWQqIENGWF9Gb2xkZXJGb250SW5mbzo6RmluZEZvbnQoaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJNYXRjaE5hbWUpIHsKKyAgRm9udEZhY2VJbmZvKiBwRmluZCA9IG51bGxwdHI7CisgIGlmIChjaGFyc2V0ID09IEZYX0NIQVJTRVRfQU5TSSAmJiBGb250RmFtaWx5SXNGaXhlZFBpdGNoKHBpdGNoX2ZhbWlseSkpCisgICAgcmV0dXJuIEdldEZvbnQoIkNvdXJpZXIgTmV3Iik7CisKKyAgdWludDMyX3QgY2hhcnNldF9mbGFnID0gR2V0Q2hhcnNldChjaGFyc2V0KTsKKyAgaW50MzJfdCBpQmVzdFNpbWlsYXIgPSAwOworICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbV9Gb250TGlzdCkgeworICAgIGNvbnN0IEJ5dGVTdHJpbmcmIGJzTmFtZSA9IGl0LmZpcnN0OworICAgIEZvbnRGYWNlSW5mbyogcEZvbnQgPSBpdC5zZWNvbmQuZ2V0KCk7CisgICAgaWYgKCEocEZvbnQtPm1fQ2hhcnNldHMgJiBjaGFyc2V0X2ZsYWcpICYmIGNoYXJzZXQgIT0gRlhfQ0hBUlNFVF9EZWZhdWx0KQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoYk1hdGNoTmFtZSAmJiAhYnNOYW1lLkNvbnRhaW5zKGZhbWlseSkpCisgICAgICBjb250aW51ZTsKKworICAgIGludDMyX3QgaVNpbWlsYXJWYWx1ZSA9CisgICAgICAgIEdldFNpbWlsYXJWYWx1ZSh3ZWlnaHQsIGJJdGFsaWMsIHBpdGNoX2ZhbWlseSwgcEZvbnQtPm1fU3R5bGVzKTsKKyAgICBpZiAoaVNpbWlsYXJWYWx1ZSA+IGlCZXN0U2ltaWxhcikgeworICAgICAgaUJlc3RTaW1pbGFyID0gaVNpbWlsYXJWYWx1ZTsKKyAgICAgIHBGaW5kID0gcEZvbnQ7CisgICAgfQorICB9CisgIHJldHVybiBwRmluZDsKK30KKwordm9pZCogQ0ZYX0ZvbGRlckZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmFtaWx5KSB7CisgIHJldHVybiBudWxscHRyOworfQorCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK3ZvaWQqIENGWF9Gb2xkZXJGb250SW5mbzo6TWFwRm9udEJ5VW5pY29kZSh1aW50MzJfdCBkd1VuaWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJdGFsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSkgeworICByZXR1cm4gbnVsbHB0cjsKK30KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKwordm9pZCogQ0ZYX0ZvbGRlckZvbnRJbmZvOjpHZXRGb250KGNvbnN0IGNoYXIqIGZhY2UpIHsKKyAgYXV0byBpdCA9IG1fRm9udExpc3QuZmluZChmYWNlKTsKKyAgcmV0dXJuIGl0ICE9IG1fRm9udExpc3QuZW5kKCkgPyBpdC0+c2Vjb25kLmdldCgpIDogbnVsbHB0cjsKK30KKwordWludDMyX3QgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpHZXRGb250RGF0YSh2b2lkKiBoRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSkgeworICBpZiAoIWhGb250KQorICAgIHJldHVybiAwOworCisgIGNvbnN0IEZvbnRGYWNlSW5mbyogcEZvbnQgPSBzdGF0aWNfY2FzdDxGb250RmFjZUluZm8qPihoRm9udCk7CisgIHVpbnQzMl90IGRhdGFzaXplID0gMDsKKyAgdWludDMyX3Qgb2Zmc2V0ID0gMDsKKyAgaWYgKHRhYmxlID09IDApIHsKKyAgICBkYXRhc2l6ZSA9IHBGb250LT5tX0ZvbnRPZmZzZXQgPyAwIDogcEZvbnQtPm1fRmlsZVNpemU7CisgIH0gZWxzZSBpZiAodGFibGUgPT0ga1RhYmxlVFRDRikgeworICAgIGRhdGFzaXplID0gcEZvbnQtPm1fRm9udE9mZnNldCA/IHBGb250LT5tX0ZpbGVTaXplIDogMDsKKyAgfSBlbHNlIHsKKyAgICB1aW50MzJfdCBuVGFibGVzID0gcEZvbnQtPm1fRm9udFRhYmxlcy5HZXRMZW5ndGgoKSAvIDE2OworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuVGFibGVzOyBpKyspIHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHAgPSBwRm9udC0+bV9Gb250VGFibGVzLnJhd19zdHIoKSArIGkgKiAxNjsKKyAgICAgIGlmIChHRVRfVFRfTE9ORyhwKSA9PSB0YWJsZSkgeworICAgICAgICBvZmZzZXQgPSBHRVRfVFRfTE9ORyhwICsgOCk7CisgICAgICAgIGRhdGFzaXplID0gR0VUX1RUX0xPTkcocCArIDEyKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoIWRhdGFzaXplIHx8IHNpemUgPCBkYXRhc2l6ZSkKKyAgICByZXR1cm4gZGF0YXNpemU7CisKKyAgRklMRSogcEZpbGUgPSBmb3BlbihwRm9udC0+bV9GaWxlUGF0aC5jX3N0cigpLCAicmIiKTsKKyAgaWYgKCFwRmlsZSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoZnNlZWsocEZpbGUsIG9mZnNldCwgU0VFS19TRVQpIDwgMCB8fAorICAgICAgZnJlYWQoYnVmZmVyLCBkYXRhc2l6ZSwgMSwgcEZpbGUpICE9IDEpIHsKKyAgICBkYXRhc2l6ZSA9IDA7CisgIH0KKyAgZmNsb3NlKHBGaWxlKTsKKyAgcmV0dXJuIGRhdGFzaXplOworfQorCit2b2lkIENGWF9Gb2xkZXJGb250SW5mbzo6RGVsZXRlRm9udCh2b2lkKiBoRm9udCkge30KKworYm9vbCBDRlhfRm9sZGVyRm9udEluZm86OkdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBCeXRlU3RyaW5nKiBuYW1lKSB7CisgIGlmICghaEZvbnQpCisgICAgcmV0dXJuIGZhbHNlOworICAqbmFtZSA9IHN0YXRpY19jYXN0PEZvbnRGYWNlSW5mbyo+KGhGb250KS0+bV9GYWNlTmFtZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50KiBjaGFyc2V0KSB7CisgIHJldHVybiBmYWxzZTsKK30KKworQ0ZYX0ZvbGRlckZvbnRJbmZvOjpGb250RmFjZUluZm86OkZvbnRGYWNlSW5mbyhCeXRlU3RyaW5nIGZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nIGZhY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nIGZvbnRUYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvbnRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpbGVTaXplKQorICAgIDogbV9GaWxlUGF0aChmaWxlUGF0aCksCisgICAgICBtX0ZhY2VOYW1lKGZhY2VOYW1lKSwKKyAgICAgIG1fRm9udFRhYmxlcyhmb250VGFibGVzKSwKKyAgICAgIG1fRm9udE9mZnNldChmb250T2Zmc2V0KSwKKyAgICAgIG1fRmlsZVNpemUoZmlsZVNpemUpLAorICAgICAgbV9TdHlsZXMoMCksCisgICAgICBtX0NoYXJzZXRzKDApIHt9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvY2Z4X2ZvbGRlcmZvbnRpbmZvLmggYi9jb3JlL2Z4Z2UvY2Z4X2ZvbGRlcmZvbnRpbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3YjM4NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9jZnhfZm9sZGVyZm9udGluZm8uaApAQCAtMCwwICsxLDg0IEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWEdFX0NGWF9GT0xERVJGT05USU5GT19IXworI2RlZmluZSBDT1JFX0ZYR0VfQ0ZYX0ZPTERFUkZPTlRJTkZPX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnRtYXBwZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvaWZ4X3N5c3RlbWZvbnRpbmZvLmgiCisKK2NsYXNzIENGWF9Gb2xkZXJGb250SW5mbyA6IHB1YmxpYyBJRlhfU3lzdGVtRm9udEluZm8geworIHB1YmxpYzoKKyAgQ0ZYX0ZvbGRlckZvbnRJbmZvKCk7CisgIH5DRlhfRm9sZGVyRm9udEluZm8oKSBvdmVycmlkZTsKKworICB2b2lkIEFkZFBhdGgoY29uc3QgQnl0ZVN0cmluZyYgcGF0aCk7CisKKyAgLy8gSUZYX1N5dGVtRm9udEluZm86CisgIGJvb2wgRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKSBvdmVycmlkZTsKKyAgdm9pZCogTWFwRm9udChpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgIGJvb2wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5LAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZhY2UpIG92ZXJyaWRlOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIHZvaWQqIE1hcEZvbnRCeVVuaWNvZGUodWludDMyX3QgZHdVbmljb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHkpIG92ZXJyaWRlOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICB2b2lkKiBHZXRGb250KGNvbnN0IGNoYXIqIGZhY2UpIG92ZXJyaWRlOworICB1aW50MzJfdCBHZXRGb250RGF0YSh2b2lkKiBoRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgIHZvaWQgRGVsZXRlRm9udCh2b2lkKiBoRm9udCkgb3ZlcnJpZGU7CisgIGJvb2wgR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIEJ5dGVTdHJpbmcqIG5hbWUpIG92ZXJyaWRlOworICBib29sIEdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQqIGNoYXJzZXQpIG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICBjbGFzcyBGb250RmFjZUluZm8geworICAgcHVibGljOgorICAgIEZvbnRGYWNlSW5mbyhCeXRlU3RyaW5nIGZpbGVQYXRoLAorICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nIGZhY2VOYW1lLAorICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nIGZvbnRUYWJsZXMsCisgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvbnRPZmZzZXQsCisgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpbGVTaXplKTsKKworICAgIGNvbnN0IEJ5dGVTdHJpbmcgbV9GaWxlUGF0aDsKKyAgICBjb25zdCBCeXRlU3RyaW5nIG1fRmFjZU5hbWU7CisgICAgY29uc3QgQnl0ZVN0cmluZyBtX0ZvbnRUYWJsZXM7CisgICAgY29uc3QgdWludDMyX3QgbV9Gb250T2Zmc2V0OworICAgIGNvbnN0IHVpbnQzMl90IG1fRmlsZVNpemU7CisgICAgdWludDMyX3QgbV9TdHlsZXM7CisgICAgdWludDMyX3QgbV9DaGFyc2V0czsKKyAgfTsKKworICB2b2lkIFNjYW5QYXRoKGNvbnN0IEJ5dGVTdHJpbmcmIHBhdGgpOworICB2b2lkIFNjYW5GaWxlKGNvbnN0IEJ5dGVTdHJpbmcmIHBhdGgpOworICB2b2lkIFJlcG9ydEZhY2UoY29uc3QgQnl0ZVN0cmluZyYgcGF0aCwKKyAgICAgICAgICAgICAgICAgIEZJTEUqIHBGaWxlLAorICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlsZXNpemUsCisgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQpOworICB2b2lkKiBHZXRTdWJzdEZvbnQoY29uc3QgQnl0ZVN0cmluZyYgZmFjZSk7CisgIHZvaWQqIEZpbmRGb250KGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgIGJvb2wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICAgaW50IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZhbWlseSwKKyAgICAgICAgICAgICAgICAgYm9vbCBiTWF0Y2hOYW1lKTsKKworICBzdGQ6Om1hcDxCeXRlU3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8Rm9udEZhY2VJbmZvPj4gbV9Gb250TGlzdDsKKyAgc3RkOjp2ZWN0b3I8Qnl0ZVN0cmluZz4gbV9QYXRoTGlzdDsKKyAgVW5vd25lZFB0cjxDRlhfRm9udE1hcHBlcj4gbV9wTWFwcGVyOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYR0VfQ0ZYX0ZPTERFUkZPTlRJTkZPX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvY2Z4X2ZvbnQuY3BwIGIvY29yZS9meGdlL2NmeF9mb250LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDk2OWEzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGdlL2NmeF9mb250LmNwcApAQCAtMCwwICsxLDYzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mb250LmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29kZXBhZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmVhbS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZmFjZWNhY2hlLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mb250Y2FjaGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnRtZ3IuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dlbW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfc3Vic3Rmb250LmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZyZWV0eXBlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCisjZGVmaW5lIEVNX0FESlVTVChlbSwgYSkgKGVtID09IDAgPyAoYSkgOiAoYSkqMTAwMCAvIGVtKQorCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgaW50IGtUaG91c2FuZHRoTWluSW50ID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptaW4oKSAvIDEwMDA7Citjb25zdGV4cHIgaW50IGtUaG91c2FuZHRoTWF4SW50ID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSAvIDEwMDA7CisKK3N0cnVjdCBPVVRMSU5FX1BBUkFNUyB7CisgIENGWF9QYXRoRGF0YSogbV9wUGF0aDsKKyAgaW50IG1fQ3VyWDsKKyAgaW50IG1fQ3VyWTsKKyAgZmxvYXQgbV9Db29yZFVuaXQ7Cit9OworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKwordW5zaWduZWQgbG9uZyBGVFN0cmVhbVJlYWQoRlhGVF9TdHJlYW0gc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50KSB7CisgIGlmIChjb3VudCA9PSAwKQorICAgIHJldHVybiAwOworCisgIElGWF9TZWVrYWJsZVJlYWRTdHJlYW0qIHBGaWxlID0KKyAgICAgIHN0YXRpY19jYXN0PElGWF9TZWVrYWJsZVJlYWRTdHJlYW0qPihzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlcik7CisgIHJldHVybiBwRmlsZSAmJiBwRmlsZS0+UmVhZEJsb2NrKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCkgPyBjb3VudCA6IDA7Cit9CisKK3ZvaWQgRlRTdHJlYW1DbG9zZShGWEZUX1N0cmVhbSBzdHJlYW0pIHt9CisKK2Jvb2wgTG9hZEZpbGVJbXAoRlhGVF9MaWJyYXJ5IGxpYnJhcnksCisgICAgICAgICAgICAgICAgIEZYRlRfRmFjZSogRmFjZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZSwKKyAgICAgICAgICAgICAgICAgaW50MzJfdCBmYWNlSW5kZXgsCisgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxGWEZUX1N0cmVhbVJlYz4qIHN0cmVhbSkgeworICBhdXRvIHN0cmVhbTEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8RlhGVF9TdHJlYW1SZWM+KCk7CisgIHN0cmVhbTEtPmJhc2UgPSBudWxscHRyOworICBzdHJlYW0xLT5zaXplID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4ocEZpbGUtPkdldFNpemUoKSk7CisgIHN0cmVhbTEtPnBvcyA9IDA7CisgIHN0cmVhbTEtPmRlc2NyaXB0b3IucG9pbnRlciA9IHN0YXRpY19jYXN0PHZvaWQqPihwRmlsZS5HZXQoKSk7CisgIHN0cmVhbTEtPmNsb3NlID0gRlRTdHJlYW1DbG9zZTsKKyAgc3RyZWFtMS0+cmVhZCA9IEZUU3RyZWFtUmVhZDsKKyAgRlhGVF9PcGVuX0FyZ3MgYXJnczsKKyAgYXJncy5mbGFncyA9IEZUX09QRU5fU1RSRUFNOworICBhcmdzLnN0cmVhbSA9IHN0cmVhbTEuZ2V0KCk7CisgIGlmIChGWEZUX09wZW5fRmFjZShsaWJyYXJ5LCAmYXJncywgZmFjZUluZGV4LCBGYWNlKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChzdHJlYW0pCisgICAgKnN0cmVhbSA9IHN0ZDo6bW92ZShzdHJlYW0xKTsKKyAgcmV0dXJuIHRydWU7Cit9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKK0ZYRlRfRmFjZSBGVF9Mb2FkRm9udChjb25zdCB1aW50OF90KiBwRGF0YSwgaW50IHNpemUpIHsKKyAgcmV0dXJuIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+R2V0Rml4ZWRGYWNlKHBEYXRhLCBzaXplLCAwKTsKK30KKwordm9pZCBPdXRsaW5lX0NoZWNrRW1wdHlDb250b3VyKE9VVExJTkVfUEFSQU1TKiBwYXJhbSkgeworICBzdGQ6OnZlY3RvcjxGWF9QQVRIUE9JTlQ+JiBwb2ludHMgPSBwYXJhbS0+bV9wUGF0aC0+R2V0UG9pbnRzKCk7CisgIHNpemVfdCBzaXplID0gcG9pbnRzLnNpemUoKTsKKworICBpZiAoc2l6ZSA+PSAyICYmIHBvaW50c1tzaXplIC0gMl0uSXNUeXBlQW5kT3BlbihGWFBUX1RZUEU6Ok1vdmVUbykgJiYKKyAgICAgIHBvaW50c1tzaXplIC0gMl0ubV9Qb2ludCA9PSBwb2ludHNbc2l6ZSAtIDFdLm1fUG9pbnQpIHsKKyAgICBzaXplIC09IDI7CisgIH0KKyAgaWYgKHNpemUgPj0gNCAmJiBwb2ludHNbc2l6ZSAtIDRdLklzVHlwZUFuZE9wZW4oRlhQVF9UWVBFOjpNb3ZlVG8pICYmCisgICAgICBwb2ludHNbc2l6ZSAtIDNdLklzVHlwZUFuZE9wZW4oRlhQVF9UWVBFOjpCZXppZXJUbykgJiYKKyAgICAgIHBvaW50c1tzaXplIC0gM10ubV9Qb2ludCA9PSBwb2ludHNbc2l6ZSAtIDRdLm1fUG9pbnQgJiYKKyAgICAgIHBvaW50c1tzaXplIC0gMl0ubV9Qb2ludCA9PSBwb2ludHNbc2l6ZSAtIDRdLm1fUG9pbnQgJiYKKyAgICAgIHBvaW50c1tzaXplIC0gMV0ubV9Qb2ludCA9PSBwb2ludHNbc2l6ZSAtIDRdLm1fUG9pbnQpIHsKKyAgICBzaXplIC09IDQ7CisgIH0KKyAgcG9pbnRzLnJlc2l6ZShzaXplKTsKK30KKworaW50IE91dGxpbmVfTW92ZVRvKGNvbnN0IEZYRlRfVmVjdG9yKiB0bywgdm9pZCogdXNlcikgeworICBPVVRMSU5FX1BBUkFNUyogcGFyYW0gPSBzdGF0aWNfY2FzdDxPVVRMSU5FX1BBUkFNUyo+KHVzZXIpOworCisgIE91dGxpbmVfQ2hlY2tFbXB0eUNvbnRvdXIocGFyYW0pOworCisgIHBhcmFtLT5tX3BQYXRoLT5DbG9zZVBhdGgoKTsKKyAgcGFyYW0tPm1fcFBhdGgtPkFwcGVuZFBvaW50KAorICAgICAgQ0ZYX1BvaW50Rih0by0+eCAvIHBhcmFtLT5tX0Nvb3JkVW5pdCwgdG8tPnkgLyBwYXJhbS0+bV9Db29yZFVuaXQpLAorICAgICAgRlhQVF9UWVBFOjpNb3ZlVG8sIGZhbHNlKTsKKworICBwYXJhbS0+bV9DdXJYID0gdG8tPng7CisgIHBhcmFtLT5tX0N1clkgPSB0by0+eTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBPdXRsaW5lX0xpbmVUbyhjb25zdCBGWEZUX1ZlY3RvciogdG8sIHZvaWQqIHVzZXIpIHsKKyAgT1VUTElORV9QQVJBTVMqIHBhcmFtID0gc3RhdGljX2Nhc3Q8T1VUTElORV9QQVJBTVMqPih1c2VyKTsKKworICBwYXJhbS0+bV9wUGF0aC0+QXBwZW5kUG9pbnQoCisgICAgICBDRlhfUG9pbnRGKHRvLT54IC8gcGFyYW0tPm1fQ29vcmRVbml0LCB0by0+eSAvIHBhcmFtLT5tX0Nvb3JkVW5pdCksCisgICAgICBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOworCisgIHBhcmFtLT5tX0N1clggPSB0by0+eDsKKyAgcGFyYW0tPm1fQ3VyWSA9IHRvLT55OworICByZXR1cm4gMDsKK30KKworaW50IE91dGxpbmVfQ29uaWNUbyhjb25zdCBGWEZUX1ZlY3RvciogY29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhGVF9WZWN0b3IqIHRvLAorICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyKSB7CisgIE9VVExJTkVfUEFSQU1TKiBwYXJhbSA9IHN0YXRpY19jYXN0PE9VVExJTkVfUEFSQU1TKj4odXNlcik7CisKKyAgcGFyYW0tPm1fcFBhdGgtPkFwcGVuZFBvaW50KAorICAgICAgQ0ZYX1BvaW50RigocGFyYW0tPm1fQ3VyWCArIChjb250cm9sLT54IC0gcGFyYW0tPm1fQ3VyWCkgKiAyIC8gMykgLworICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPm1fQ29vcmRVbml0LAorICAgICAgICAgICAgICAgICAocGFyYW0tPm1fQ3VyWSArIChjb250cm9sLT55IC0gcGFyYW0tPm1fQ3VyWSkgKiAyIC8gMykgLworICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPm1fQ29vcmRVbml0KSwKKyAgICAgIEZYUFRfVFlQRTo6QmV6aWVyVG8sIGZhbHNlKTsKKworICBwYXJhbS0+bV9wUGF0aC0+QXBwZW5kUG9pbnQoCisgICAgICBDRlhfUG9pbnRGKChjb250cm9sLT54ICsgKHRvLT54IC0gY29udHJvbC0+eCkgLyAzKSAvIHBhcmFtLT5tX0Nvb3JkVW5pdCwKKyAgICAgICAgICAgICAgICAgKGNvbnRyb2wtPnkgKyAodG8tPnkgLSBjb250cm9sLT55KSAvIDMpIC8gcGFyYW0tPm1fQ29vcmRVbml0KSwKKyAgICAgIEZYUFRfVFlQRTo6QmV6aWVyVG8sIGZhbHNlKTsKKworICBwYXJhbS0+bV9wUGF0aC0+QXBwZW5kUG9pbnQoCisgICAgICBDRlhfUG9pbnRGKHRvLT54IC8gcGFyYW0tPm1fQ29vcmRVbml0LCB0by0+eSAvIHBhcmFtLT5tX0Nvb3JkVW5pdCksCisgICAgICBGWFBUX1RZUEU6OkJlemllclRvLCBmYWxzZSk7CisKKyAgcGFyYW0tPm1fQ3VyWCA9IHRvLT54OworICBwYXJhbS0+bV9DdXJZID0gdG8tPnk7CisgIHJldHVybiAwOworfQorCitpbnQgT3V0bGluZV9DdWJpY1RvKGNvbnN0IEZYRlRfVmVjdG9yKiBjb250cm9sMSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhGVF9WZWN0b3IqIGNvbnRyb2wyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBGWEZUX1ZlY3RvciogdG8sCisgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIpIHsKKyAgT1VUTElORV9QQVJBTVMqIHBhcmFtID0gc3RhdGljX2Nhc3Q8T1VUTElORV9QQVJBTVMqPih1c2VyKTsKKworICBwYXJhbS0+bV9wUGF0aC0+QXBwZW5kUG9pbnQoQ0ZYX1BvaW50Rihjb250cm9sMS0+eCAvIHBhcmFtLT5tX0Nvb3JkVW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbDEtPnkgLyBwYXJhbS0+bV9Db29yZFVuaXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9UWVBFOjpCZXppZXJUbywgZmFsc2UpOworCisgIHBhcmFtLT5tX3BQYXRoLT5BcHBlbmRQb2ludChDRlhfUG9pbnRGKGNvbnRyb2wyLT54IC8gcGFyYW0tPm1fQ29vcmRVbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sMi0+eSAvIHBhcmFtLT5tX0Nvb3JkVW5pdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFBUX1RZUEU6OkJlemllclRvLCBmYWxzZSk7CisKKyAgcGFyYW0tPm1fcFBhdGgtPkFwcGVuZFBvaW50KAorICAgICAgQ0ZYX1BvaW50Rih0by0+eCAvIHBhcmFtLT5tX0Nvb3JkVW5pdCwgdG8tPnkgLyBwYXJhbS0+bV9Db29yZFVuaXQpLAorICAgICAgRlhQVF9UWVBFOjpCZXppZXJUbywgZmFsc2UpOworCisgIHBhcmFtLT5tX0N1clggPSB0by0+eDsKKyAgcGFyYW0tPm1fQ3VyWSA9IHRvLT55OworICByZXR1cm4gMDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2NvbnN0IGNoYXIgQ0ZYX0ZvbnQ6OnNfQW5nbGVTa2V3W10gPSB7CisgICAgMCwgIDIsICAzLCAgNSwgIDcsICA5LCAgMTEsIDEyLCAxNCwgMTYsIDE4LCAxOSwgMjEsIDIzLCAyNSwKKyAgICAyNywgMjksIDMxLCAzMiwgMzQsIDM2LCAzOCwgNDAsIDQyLCA0NSwgNDcsIDQ5LCA1MSwgNTMsIDU1LAorfTsKKworY29uc3QgdWludDhfdCBDRlhfRm9udDo6c19XZWlnaHRQb3dbXSA9IHsKKyAgICAwLCAgMywgIDYsICA3LCAgOCwgIDksICAxMSwgMTIsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsCisgICAgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIDM1LCAzNiwgMzYsIDM3LAorICAgIDM3LCAzNywgMzgsIDM4LCAzOCwgMzksIDM5LCAzOSwgNDAsIDQwLCA0MCwgNDEsIDQxLCA0MSwgNDIsIDQyLCA0MiwKKyAgICA0MiwgNDMsIDQzLCA0MywgNDQsIDQ0LCA0NCwgNDQsIDQ1LCA0NSwgNDUsIDQ1LCA0NiwgNDYsIDQ2LCA0NiwgNDcsCisgICAgNDcsIDQ3LCA0NywgNDgsIDQ4LCA0OCwgNDgsIDQ4LCA0OSwgNDksIDQ5LCA0OSwgNTAsIDUwLCA1MCwgNTAsIDUwLAorICAgIDUxLCA1MSwgNTEsIDUxLCA1MSwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MywgNTMsIDUzLCA1MywgNTMsCit9OworCitjb25zdCB1aW50OF90IENGWF9Gb250OjpzX1dlaWdodFBvd18xMVtdID0geworICAgIDAsICA0LCAgNywgIDgsICA5LCAgMTAsIDEyLCAxMywgMTUsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwKKyAgICAyNSwgMjYsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOSwgMzksIDQwLCA0MCwgNDEsCisgICAgNDEsIDQxLCA0MiwgNDIsIDQyLCA0MywgNDMsIDQzLCA0NCwgNDQsIDQ0LCA0NSwgNDUsIDQ1LCA0NiwgNDYsIDQ2LAorICAgIDQ2LCA0MywgNDcsIDQ3LCA0OCwgNDgsIDQ4LCA0OCwgNDUsIDUwLCA1MCwgNTAsIDQ2LCA1MSwgNTEsIDUxLCA1MiwKKyAgICA1MiwgNTIsIDUyLCA1MywgNTMsIDUzLCA1MywgNTMsIDU0LCA1NCwgNTQsIDU0LCA1NSwgNTUsIDU1LCA1NSwgNTUsCisgICAgNTYsIDU2LCA1NiwgNTYsIDU2LCA1NywgNTcsIDU3LCA1NywgNTcsIDU4LCA1OCwgNTgsIDU4LCA1OCwKK307CisKK2NvbnN0IHVpbnQ4X3QgQ0ZYX0ZvbnQ6OnNfV2VpZ2h0UG93X1NISUZUSklTW10gPSB7CisgICAgMCwgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDcsICA4LCAgMTAsIDExLCAxMywgMTQsIDE2LCAxNywgMTksIDIxLAorICAgIDIyLCAyNCwgMjYsIDI4LCAzMCwgMzIsIDMzLCAzNSwgMzcsIDM5LCA0MSwgNDMsIDQ1LCA0OCwgNDgsIDQ4LCA0OCwKKyAgICA0OSwgNDksIDQ5LCA1MCwgNTAsIDUwLCA1MCwgNTEsIDUxLCA1MSwgNTEsIDUyLCA1MiwgNTIsIDUyLCA1MiwgNTMsCisgICAgNTMsIDUzLCA1MywgNTMsIDU0LCA1NCwgNTQsIDU0LCA1NCwgNTUsIDU1LCA1NSwgNTUsIDU1LCA1NiwgNTYsIDU2LAorICAgIDU2LCA1NiwgNTYsIDU3LCA1NywgNTcsIDU3LCA1NywgNTcsIDU3LCA1OCwgNTgsIDU4LCA1OCwgNTgsIDU4LCA1OCwKKyAgICA1OSwgNTksIDU5LCA1OSwgNTksIDU5LCA1OSwgNjAsIDYwLCA2MCwgNjAsIDYwLCA2MCwgNjAsIDYwLAorfTsKKworQ0ZYX0ZvbnQ6OkNGWF9Gb250KCkKKyAgICA6CisgICAgICBtX0ZhY2UobnVsbHB0ciksCisgICAgICBtX0ZhY2VDYWNoZShudWxscHRyKSwKKyAgICAgIG1fcEZvbnREYXRhKG51bGxwdHIpLAorICAgICAgbV9wR3N1YkRhdGEobnVsbHB0ciksCisgICAgICBtX2R3U2l6ZSgwKSwKKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9BUFBMRV8KKyAgICAgIG1fcFBsYXRmb3JtRm9udChudWxscHRyKSwKKyNlbmRpZgorICAgICAgbV9iRW1iZWRkZWQoZmFsc2UpLAorICAgICAgbV9iVmVydGljYWwoZmFsc2UpIHsKK30KKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCit2b2lkIENGWF9Gb250OjpTZXRGYWNlKEZYRlRfRmFjZSBmYWNlKSB7CisgIENsZWFyRmFjZUNhY2hlKCk7CisgIG1fRmFjZSA9IGZhY2U7Cit9CisKK3ZvaWQgQ0ZYX0ZvbnQ6OlNldFN1YnN0Rm9udChzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1N1YnN0Rm9udD4gc3Vic3QpIHsKKyAgbV9wU3Vic3RGb250ID0gc3RkOjptb3ZlKHN1YnN0KTsKK30KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworQ0ZYX0ZvbnQ6On5DRlhfRm9udCgpIHsKKyAgaWYgKG1fRmFjZSkgeworI2lmbmRlZiBQREZfRU5BQkxFX1hGQQorICAgIGlmIChGWEZUX0dldF9GYWNlX0V4dGVybmFsX1N0cmVhbShtX0ZhY2UpKSB7CisgICAgICBGWEZUX0NsZWFyX0ZhY2VfRXh0ZXJuYWxfU3RyZWFtKG1fRmFjZSk7CisgICAgfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICAgIERlbGV0ZUZhY2UoKTsKKyAgfQorI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXworICBSZWxlYXNlUGxhdGZvcm1SZXNvdXJjZSgpOworI2VuZGlmCit9CisKK3ZvaWQgQ0ZYX0ZvbnQ6OkRlbGV0ZUZhY2UoKSB7CisgIENsZWFyRmFjZUNhY2hlKCk7CisgIGlmIChtX2JFbWJlZGRlZCkKKyAgICBGWEZUX0RvbmVfRmFjZShtX0ZhY2UpOworICBlbHNlCisgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5SZWxlYXNlRmFjZShtX0ZhY2UpOworICBtX0ZhY2UgPSBudWxscHRyOworfQorCit2b2lkIENGWF9Gb250OjpMb2FkU3Vic3QoY29uc3QgQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRydWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0YWxpY19hbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ2hhcnNldENQLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlZlcnRpY2FsKSB7CisgIG1fYkVtYmVkZGVkID0gZmFsc2U7CisgIG1fYlZlcnRpY2FsID0gYlZlcnRpY2FsOworICBtX3BTdWJzdEZvbnQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX1N1YnN0Rm9udD4oKTsKKyAgbV9GYWNlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5GaW5kU3Vic3RGb250KAorICAgICAgZmFjZV9uYW1lLCBiVHJ1ZVR5cGUsIGZsYWdzLCB3ZWlnaHQsIGl0YWxpY19hbmdsZSwgQ2hhcnNldENQLAorICAgICAgbV9wU3Vic3RGb250LmdldCgpKTsKKyAgaWYgKG1fRmFjZSkgeworICAgIG1fcEZvbnREYXRhID0gRlhGVF9HZXRfRmFjZV9TdHJlYW1fQmFzZShtX0ZhY2UpOworICAgIG1fZHdTaXplID0gRlhGVF9HZXRfRmFjZV9TdHJlYW1fU2l6ZShtX0ZhY2UpOworICB9Cit9CisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorYm9vbCBDRlhfRm9udDo6TG9hZEZpbGUoY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuRmFjZUluZGV4KSB7CisgIG1fYkVtYmVkZGVkID0gZmFsc2U7CisKKyAgQ0ZYX0ZvbnRNZ3IqIHBGb250TWdyID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpOworICBwRm9udE1nci0+SW5pdEZUTGlicmFyeSgpOworCisgIEZYRlRfTGlicmFyeSBsaWJyYXJ5ID0gcEZvbnRNZ3ItPkdldEZUTGlicmFyeSgpOworICBzdGQ6OnVuaXF1ZV9wdHI8RlhGVF9TdHJlYW1SZWM+IHN0cmVhbTsKKyAgaWYgKCFMb2FkRmlsZUltcChsaWJyYXJ5LCAmbV9GYWNlLCBwRmlsZSwgbkZhY2VJbmRleCwgJnN0cmVhbSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG1fcE93bmVkU3RyZWFtID0gc3RkOjptb3ZlKHN0cmVhbSk7CisgIEZYRlRfU2V0X1BpeGVsX1NpemVzKG1fRmFjZSwgMCwgNjQpOworICByZXR1cm4gdHJ1ZTsKK30KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworaW50IENGWF9Gb250OjpHZXRHbHlwaFdpZHRoKHVpbnQzMl90IGdseXBoX2luZGV4KSB7CisgIGlmICghbV9GYWNlKQorICAgIHJldHVybiAwOworICBpZiAobV9wU3Vic3RGb250ICYmIG1fcFN1YnN0Rm9udC0+bV9iRmxhZ01NKQorICAgIEFkanVzdE1NUGFyYW1zKGdseXBoX2luZGV4LCAwLCAwKTsKKyAgaW50IGVyciA9IEZYRlRfTG9hZF9HbHlwaCgKKyAgICAgIG1fRmFjZSwgZ2x5cGhfaW5kZXgsCisgICAgICBGWEZUX0xPQURfTk9fU0NBTEUgfCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKTsKKyAgaWYgKGVycikKKyAgICByZXR1cm4gMDsKKworICBpbnQgaG9yaUFkdmFuY2UgPSBGWEZUX0dldF9HbHlwaF9Ib3JpQWR2YW5jZShtX0ZhY2UpOworICBpZiAoaG9yaUFkdmFuY2UgPCBrVGhvdXNhbmR0aE1pbkludCB8fCBob3JpQWR2YW5jZSA+IGtUaG91c2FuZHRoTWF4SW50KQorICAgIHJldHVybiAwOworCisgIHJldHVybiBFTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIGhvcmlBZHZhbmNlKTsKK30KKworYm9vbCBDRlhfRm9udDo6TG9hZEVtYmVkZGVkKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHVpbnQzMl90IHNpemUpIHsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdGVtcChkYXRhLCBkYXRhICsgc2l6ZSk7CisgIG1fcEZvbnREYXRhQWxsb2NhdGlvbi5zd2FwKHRlbXApOworICBtX0ZhY2UgPSBGVF9Mb2FkRm9udChtX3BGb250RGF0YUFsbG9jYXRpb24uZGF0YSgpLCBzaXplKTsKKyAgbV9wRm9udERhdGEgPSBtX3BGb250RGF0YUFsbG9jYXRpb24uZGF0YSgpOworICBtX2JFbWJlZGRlZCA9IHRydWU7CisgIG1fZHdTaXplID0gc2l6ZTsKKyAgcmV0dXJuICEhbV9GYWNlOworfQorCitib29sIENGWF9Gb250OjpJc1RURm9udCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fRmFjZSAmJiBGWEZUX0lzX0ZhY2VfVFRfT1QobV9GYWNlKSA9PSBGWEZUX0ZBQ0VfRkxBR19TRk5UOworfQorCitpbnQgQ0ZYX0ZvbnQ6OkdldEFzY2VudCgpIGNvbnN0IHsKKyAgaWYgKCFtX0ZhY2UpCisgICAgcmV0dXJuIDA7CisKKyAgaW50IGFzY2VuZGVyID0gRlhGVF9HZXRfRmFjZV9Bc2NlbmRlcihtX0ZhY2UpOworICBpZiAoYXNjZW5kZXIgPCBrVGhvdXNhbmR0aE1pbkludCB8fCBhc2NlbmRlciA+IGtUaG91c2FuZHRoTWF4SW50KQorICAgIHJldHVybiAwOworCisgIHJldHVybiBFTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIGFzY2VuZGVyKTsKK30KKworaW50IENGWF9Gb250OjpHZXREZXNjZW50KCkgY29uc3QgeworICBpZiAoIW1fRmFjZSkKKyAgICByZXR1cm4gMDsKKworICBpbnQgZGVzY2VuZGVyID0gRlhGVF9HZXRfRmFjZV9EZXNjZW5kZXIobV9GYWNlKTsKKyAgaWYgKGRlc2NlbmRlciA8IGtUaG91c2FuZHRoTWluSW50IHx8IGRlc2NlbmRlciA+IGtUaG91c2FuZHRoTWF4SW50KQorICAgIHJldHVybiAwOworCisgIHJldHVybiBFTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksIGRlc2NlbmRlcik7Cit9CisKK2Jvb2wgQ0ZYX0ZvbnQ6OkdldEdseXBoQkJveCh1aW50MzJfdCBnbHlwaF9pbmRleCwgRlhfUkVDVCYgYmJveCkgeworICBpZiAoIW1fRmFjZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKEZYRlRfSXNfRmFjZV9Ucmlja3kobV9GYWNlKSkgeworICAgIGludCBlcnJvciA9IEZYRlRfU2V0X0NoYXJfU2l6ZShtX0ZhY2UsIDAsIDEwMDAgKiA2NCwgNzIsIDcyKTsKKyAgICBpZiAoZXJyb3IpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBlcnJvciA9IEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEgpOworICAgIGlmIChlcnJvcikKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEZYRlRfQkJveCBjYm94OworICAgIEZUX0dseXBoIGdseXBoOworICAgIGVycm9yID0gRlhGVF9HZXRfR2x5cGgobV9GYWNlLT5nbHlwaCwgJmdseXBoKTsKKyAgICBpZiAoZXJyb3IpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBGWEZUX0dseXBoX0dldF9DQm94KGdseXBoLCBGWEZUX0dMWVBIX0JCT1hfUElYRUxTLCAmY2JveCk7CisgICAgaW50IHBpeGVsX3NpemVfeCA9IG1fRmFjZS0+c2l6ZS0+bWV0cmljcy54X3BwZW0sCisgICAgICAgIHBpeGVsX3NpemVfeSA9IG1fRmFjZS0+c2l6ZS0+bWV0cmljcy55X3BwZW07CisgICAgaWYgKHBpeGVsX3NpemVfeCA9PSAwIHx8IHBpeGVsX3NpemVfeSA9PSAwKSB7CisgICAgICBiYm94LmxlZnQgPSBjYm94LnhNaW47CisgICAgICBiYm94LnJpZ2h0ID0gY2JveC54TWF4OworICAgICAgYmJveC50b3AgPSBjYm94LnlNYXg7CisgICAgICBiYm94LmJvdHRvbSA9IGNib3gueU1pbjsKKyAgICB9IGVsc2UgeworICAgICAgYmJveC5sZWZ0ID0gY2JveC54TWluICogMTAwMCAvIHBpeGVsX3NpemVfeDsKKyAgICAgIGJib3gucmlnaHQgPSBjYm94LnhNYXggKiAxMDAwIC8gcGl4ZWxfc2l6ZV94OworICAgICAgYmJveC50b3AgPSBjYm94LnlNYXggKiAxMDAwIC8gcGl4ZWxfc2l6ZV95OworICAgICAgYmJveC5ib3R0b20gPSBjYm94LnlNaW4gKiAxMDAwIC8gcGl4ZWxfc2l6ZV95OworICAgIH0KKyAgICBiYm94LnRvcCA9IHN0ZDo6bWluKGJib3gudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oRlhGVF9HZXRfRmFjZV9Bc2NlbmRlcihtX0ZhY2UpKSk7CisgICAgYmJveC5ib3R0b20gPSBzdGQ6Om1heCgKKyAgICAgICAgYmJveC5ib3R0b20sIHN0YXRpY19jYXN0PGludDMyX3Q+KEZYRlRfR2V0X0ZhY2VfRGVzY2VuZGVyKG1fRmFjZSkpKTsKKyAgICBGVF9Eb25lX0dseXBoKGdseXBoKTsKKyAgICByZXR1cm4gRlhGVF9TZXRfUGl4ZWxfU2l6ZXMobV9GYWNlLCAwLCA2NCkgPT0gMDsKKyAgfQorICBpZiAoRlhGVF9Mb2FkX0dseXBoKAorICAgICAgICAgIG1fRmFjZSwgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgRlhGVF9MT0FEX05PX1NDQUxFIHwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaW50IGVtID0gRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSk7CisgIGlmIChlbSA9PSAwKSB7CisgICAgYmJveC5sZWZ0ID0gRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKG1fRmFjZSk7CisgICAgYmJveC5ib3R0b20gPSBGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1kobV9GYWNlKTsKKyAgICBiYm94LnRvcCA9IGJib3guYm90dG9tIC0gRlhGVF9HZXRfR2x5cGhfSGVpZ2h0KG1fRmFjZSk7CisgICAgYmJveC5yaWdodCA9IGJib3gubGVmdCArIEZYRlRfR2V0X0dseXBoX1dpZHRoKG1fRmFjZSk7CisgIH0gZWxzZSB7CisgICAgYmJveC5sZWZ0ID0gRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKG1fRmFjZSkgKiAxMDAwIC8gZW07CisgICAgYmJveC50b3AgPQorICAgICAgICAoRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdZKG1fRmFjZSkgLSBGWEZUX0dldF9HbHlwaF9IZWlnaHQobV9GYWNlKSkgKgorICAgICAgICAxMDAwIC8gZW07CisgICAgYmJveC5yaWdodCA9CisgICAgICAgIChGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1gobV9GYWNlKSArIEZYRlRfR2V0X0dseXBoX1dpZHRoKG1fRmFjZSkpICoKKyAgICAgICAgMTAwMCAvIGVtOworICAgIGJib3guYm90dG9tID0gKEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWShtX0ZhY2UpKSAqIDEwMDAgLyBlbTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDRlhfRm9udDo6SXNJdGFsaWMoKSBjb25zdCB7CisgIGlmICghbV9GYWNlKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKEZYRlRfSXNfRmFjZV9JdGFsaWMobV9GYWNlKSA9PSBGWEZUX1NUWUxFX0ZMQUdfSVRBTElDKQorICAgIHJldHVybiB0cnVlOworCisgIEJ5dGVTdHJpbmcgc3RyKEZYRlRfR2V0X0ZhY2VfU3R5bGVfTmFtZShtX0ZhY2UpKTsKKyAgc3RyLk1ha2VMb3dlcigpOworICByZXR1cm4gc3RyLkNvbnRhaW5zKCJpdGFsaWMiKTsKK30KKworYm9vbCBDRlhfRm9udDo6SXNCb2xkKCkgY29uc3QgeworICByZXR1cm4gbV9GYWNlICYmIEZYRlRfSXNfRmFjZV9Cb2xkKG1fRmFjZSkgPT0gRlhGVF9TVFlMRV9GTEFHX0JPTEQ7Cit9CisKK2Jvb2wgQ0ZYX0ZvbnQ6OklzRml4ZWRXaWR0aCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fRmFjZSAmJiBGWEZUX0lzX0ZhY2VfZml4ZWR3aWR0aChtX0ZhY2UpICE9IDA7Cit9CisKK0J5dGVTdHJpbmcgQ0ZYX0ZvbnQ6OkdldFBzTmFtZSgpIGNvbnN0IHsKKyAgaWYgKCFtX0ZhY2UpCisgICAgcmV0dXJuIEJ5dGVTdHJpbmcoKTsKKworICBCeXRlU3RyaW5nIHBzTmFtZSA9IEZYRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZShtX0ZhY2UpOworICBpZiAocHNOYW1lLklzRW1wdHkoKSkKKyAgICBwc05hbWUgPSAiVW50aXRsZWQiOworICByZXR1cm4gcHNOYW1lOworfQorCitCeXRlU3RyaW5nIENGWF9Gb250OjpHZXRGYW1pbHlOYW1lKCkgY29uc3QgeworICBpZiAoIW1fRmFjZSAmJiAhbV9wU3Vic3RGb250KQorICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisgIGlmIChtX0ZhY2UpCisgICAgcmV0dXJuIEJ5dGVTdHJpbmcoRlhGVF9HZXRfRmFjZV9GYW1pbHlfTmFtZShtX0ZhY2UpKTsKKworICByZXR1cm4gbV9wU3Vic3RGb250LT5tX0ZhbWlseTsKK30KKworQnl0ZVN0cmluZyBDRlhfRm9udDo6R2V0RmFjZU5hbWUoKSBjb25zdCB7CisgIGlmICghbV9GYWNlICYmICFtX3BTdWJzdEZvbnQpCisgICAgcmV0dXJuIEJ5dGVTdHJpbmcoKTsKKyAgaWYgKG1fRmFjZSkgeworICAgIEJ5dGVTdHJpbmcgc3R5bGUgPSBCeXRlU3RyaW5nKEZYRlRfR2V0X0ZhY2VfU3R5bGVfTmFtZShtX0ZhY2UpKTsKKyAgICBCeXRlU3RyaW5nIGZhY2VuYW1lID0gR2V0RmFtaWx5TmFtZSgpOworICAgIGlmIChmYWNlbmFtZS5Jc0VtcHR5KCkpCisgICAgICBmYWNlbmFtZSA9ICJVbnRpdGxlZCI7CisgICAgaWYgKCFzdHlsZS5Jc0VtcHR5KCkgJiYgc3R5bGUgIT0gIlJlZ3VsYXIiKQorICAgICAgZmFjZW5hbWUgKz0gIiAiICsgc3R5bGU7CisgICAgcmV0dXJuIGZhY2VuYW1lOworICB9CisgIHJldHVybiBtX3BTdWJzdEZvbnQtPm1fRmFtaWx5OworfQorCitib29sIENGWF9Gb250OjpHZXRCQm94KEZYX1JFQ1QmIGJib3gpIHsKKyAgaWYgKCFtX0ZhY2UpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGludCBlbSA9IEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpOworICBpZiAoZW0gPT0gMCkgeworICAgIGJib3gubGVmdCA9IEZYRlRfR2V0X0ZhY2VfeE1pbihtX0ZhY2UpOworICAgIGJib3guYm90dG9tID0gRlhGVF9HZXRfRmFjZV95TWF4KG1fRmFjZSk7CisgICAgYmJveC50b3AgPSBGWEZUX0dldF9GYWNlX3lNaW4obV9GYWNlKTsKKyAgICBiYm94LnJpZ2h0ID0gRlhGVF9HZXRfRmFjZV94TWF4KG1fRmFjZSk7CisgIH0gZWxzZSB7CisgICAgYmJveC5sZWZ0ID0gRlhGVF9HZXRfRmFjZV94TWluKG1fRmFjZSkgKiAxMDAwIC8gZW07CisgICAgYmJveC50b3AgPSBGWEZUX0dldF9GYWNlX3lNaW4obV9GYWNlKSAqIDEwMDAgLyBlbTsKKyAgICBiYm94LnJpZ2h0ID0gRlhGVF9HZXRfRmFjZV94TWF4KG1fRmFjZSkgKiAxMDAwIC8gZW07CisgICAgYmJveC5ib3R0b20gPSBGWEZUX0dldF9GYWNlX3lNYXgobV9GYWNlKSAqIDEwMDAgLyBlbTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworQ0ZYX0ZhY2VDYWNoZSogQ0ZYX0ZvbnQ6OkdldEZhY2VDYWNoZSgpIGNvbnN0IHsKKyAgaWYgKCFtX0ZhY2VDYWNoZSkKKyAgICBtX0ZhY2VDYWNoZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLT5HZXRDYWNoZWRGYWNlKHRoaXMpOworICByZXR1cm4gbV9GYWNlQ2FjaGUuR2V0KCk7Cit9CisKK3ZvaWQgQ0ZYX0ZvbnQ6OkNsZWFyRmFjZUNhY2hlKCkgeworICBpZiAoIW1fRmFjZUNhY2hlKQorICAgIHJldHVybjsKKworICBtX0ZhY2VDYWNoZSA9IG51bGxwdHI7CisgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRDYWNoZSgpLT5SZWxlYXNlQ2FjaGVkRmFjZSh0aGlzKTsKK30KKwordm9pZCBDRlhfRm9udDo6QWRqdXN0TU1QYXJhbXMoaW50IGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0KSBjb25zdCB7CisgIEZYRlRfTU1fVmFyIHBNYXN0ZXJzID0gbnVsbHB0cjsKKyAgRlhGVF9HZXRfTU1fVmFyKG1fRmFjZSwgJnBNYXN0ZXJzKTsKKyAgaWYgKCFwTWFzdGVycykKKyAgICByZXR1cm47CisKKyAgbG9uZyBjb29yZHNbMl07CisgIGlmICh3ZWlnaHQgPT0gMCkKKyAgICBjb29yZHNbMF0gPSBGWEZUX0dldF9NTV9BeGlzX0RlZihGWEZUX0dldF9NTV9BeGlzKHBNYXN0ZXJzLCAwKSkgLyA2NTUzNjsKKyAgZWxzZQorICAgIGNvb3Jkc1swXSA9IHdlaWdodDsKKworICBpZiAoZGVzdF93aWR0aCA9PSAwKSB7CisgICAgY29vcmRzWzFdID0gRlhGVF9HZXRfTU1fQXhpc19EZWYoRlhGVF9HZXRfTU1fQXhpcyhwTWFzdGVycywgMSkpIC8gNjU1MzY7CisgIH0gZWxzZSB7CisgICAgaW50IG1pbl9wYXJhbSA9IEZYRlRfR2V0X01NX0F4aXNfTWluKEZYRlRfR2V0X01NX0F4aXMocE1hc3RlcnMsIDEpKSAvIDY1NTM2OworICAgIGludCBtYXhfcGFyYW0gPSBGWEZUX0dldF9NTV9BeGlzX01heChGWEZUX0dldF9NTV9BeGlzKHBNYXN0ZXJzLCAxKSkgLyA2NTUzNjsKKyAgICBjb29yZHNbMV0gPSBtaW5fcGFyYW07CisgICAgRlhGVF9TZXRfTU1fRGVzaWduX0Nvb3JkaW5hdGVzKG1fRmFjZSwgMiwgY29vcmRzKTsKKyAgICBGWEZUX0xvYWRfR2x5cGgobV9GYWNlLCBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgRlhGVF9MT0FEX05PX1NDQUxFIHwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCk7CisgICAgaW50IG1pbl93aWR0aCA9IEZYRlRfR2V0X0dseXBoX0hvcmlBZHZhbmNlKG1fRmFjZSkgKiAxMDAwIC8KKyAgICAgICAgICAgICAgICAgICAgRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSk7CisgICAgY29vcmRzWzFdID0gbWF4X3BhcmFtOworICAgIEZYRlRfU2V0X01NX0Rlc2lnbl9Db29yZGluYXRlcyhtX0ZhY2UsIDIsIGNvb3Jkcyk7CisgICAgRlhGVF9Mb2FkX0dseXBoKG1fRmFjZSwgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgIEZYRlRfTE9BRF9OT19TQ0FMRSB8IEZYRlRfTE9BRF9JR05PUkVfR0xPQkFMX0FEVkFOQ0VfV0lEVEgpOworICAgIGludCBtYXhfd2lkdGggPSBGWEZUX0dldF9HbHlwaF9Ib3JpQWR2YW5jZShtX0ZhY2UpICogMTAwMCAvCisgICAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpOworICAgIGlmIChtYXhfd2lkdGggPT0gbWluX3dpZHRoKSB7CisgICAgICBGWEZUX0ZyZWUobV9GYWNlLCBwTWFzdGVycyk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGludCBwYXJhbSA9IG1pbl9wYXJhbSArIChtYXhfcGFyYW0gLSBtaW5fcGFyYW0pICogKGRlc3Rfd2lkdGggLSBtaW5fd2lkdGgpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1heF93aWR0aCAtIG1pbl93aWR0aCk7CisgICAgY29vcmRzWzFdID0gcGFyYW07CisgIH0KKyAgRlhGVF9GcmVlKG1fRmFjZSwgcE1hc3RlcnMpOworICBGWEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMobV9GYWNlLCAyLCBjb29yZHMpOworfQorCitDRlhfUGF0aERhdGEqIENGWF9Gb250OjpMb2FkR2x5cGhQYXRoSW1wbCh1aW50MzJfdCBnbHlwaF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoKSBjb25zdCB7CisgIGlmICghbV9GYWNlKQorICAgIHJldHVybiBudWxscHRyOworICBGWEZUX1NldF9QaXhlbF9TaXplcyhtX0ZhY2UsIDAsIDY0KTsKKyAgRlhGVF9NYXRyaXggZnRfbWF0cml4ID0gezY1NTM2LCAwLCAwLCA2NTUzNn07CisgIGlmIChtX3BTdWJzdEZvbnQpIHsKKyAgICBpZiAobV9wU3Vic3RGb250LT5tX0l0YWxpY0FuZ2xlKSB7CisgICAgICBpbnQgc2tldyA9IG1fcFN1YnN0Rm9udC0+bV9JdGFsaWNBbmdsZTsKKyAgICAgIC8vIHxza2V3fCBpcyBub25wb3NpdGl2ZSBzbyB8LXNrZXd8IGlzIHVzZWQgYXMgdGhlIGluZGV4LiBXZSBuZWVkIHRvIG1ha2UKKyAgICAgIC8vIHN1cmUgfHNrZXd8ICE9IElOVF9NSU4gc2luY2UgLUlOVF9NSU4gaXMgdW5kZWZpbmVkLgorICAgICAgaWYgKHNrZXcgPD0gMCAmJiBza2V3ICE9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCkgJiYKKyAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KC1za2V3KSA8IGtBbmdsZVNrZXdBcnJheVNpemUpIHsKKyAgICAgICAgc2tldyA9IC1zX0FuZ2xlU2tld1stc2tld107CisgICAgICB9IGVsc2UgeworICAgICAgICBza2V3ID0gLTU4OworICAgICAgfQorICAgICAgaWYgKG1fYlZlcnRpY2FsKQorICAgICAgICBmdF9tYXRyaXgueXggKz0gZnRfbWF0cml4Lnl5ICogc2tldyAvIDEwMDsKKyAgICAgIGVsc2UKKyAgICAgICAgZnRfbWF0cml4Lnh5IC09IGZ0X21hdHJpeC54eCAqIHNrZXcgLyAxMDA7CisgICAgfQorICAgIGlmIChtX3BTdWJzdEZvbnQtPm1fYkZsYWdNTSkKKyAgICAgIEFkanVzdE1NUGFyYW1zKGdseXBoX2luZGV4LCBkZXN0X3dpZHRoLCBtX3BTdWJzdEZvbnQtPm1fV2VpZ2h0KTsKKyAgfQorICBTY29wZWRGb250VHJhbnNmb3JtIHNjb3BlZF90cmFuc2Zvcm0obV9GYWNlLCAmZnRfbWF0cml4KTsKKyAgaW50IGxvYWRfZmxhZ3MgPSBGWEZUX0xPQURfTk9fQklUTUFQOworICBpZiAoIShtX0ZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfU0ZOVCkgfHwgIUZUX0lTX1RSSUNLWShtX0ZhY2UpKQorICAgIGxvYWRfZmxhZ3MgfD0gRlRfTE9BRF9OT19ISU5USU5HOworICBpZiAoRlhGVF9Mb2FkX0dseXBoKG1fRmFjZSwgZ2x5cGhfaW5kZXgsIGxvYWRfZmxhZ3MpKQorICAgIHJldHVybiBudWxscHRyOworICBpZiAobV9wU3Vic3RGb250ICYmICFtX3BTdWJzdEZvbnQtPm1fYkZsYWdNTSAmJgorICAgICAgbV9wU3Vic3RGb250LT5tX1dlaWdodCA+IDQwMCkgeworICAgIHVpbnQzMl90IGluZGV4ID0gKG1fcFN1YnN0Rm9udC0+bV9XZWlnaHQgLSA0MDApIC8gMTA7CisgICAgaW5kZXggPSBzdGQ6Om1pbihpbmRleCwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGtXZWlnaHRQb3dBcnJheVNpemUgLSAxKSk7CisgICAgaW50IGxldmVsID0gMDsKKyAgICBpZiAobV9wU3Vic3RGb250LT5tX0NoYXJzZXQgPT0gRlhfQ0hBUlNFVF9TaGlmdEpJUykKKyAgICAgIGxldmVsID0gc19XZWlnaHRQb3dfU0hJRlRKSVNbaW5kZXhdICogMiAqIDY1NTM2IC8gMzY2NTU7CisgICAgZWxzZQorICAgICAgbGV2ZWwgPSBzX1dlaWdodFBvd1tpbmRleF0gKiAyOworICAgIEZYRlRfT3V0bGluZV9FbWJvbGRlbihGWEZUX0dldF9HbHlwaF9PdXRsaW5lKG1fRmFjZSksIGxldmVsKTsKKyAgfQorCisgIEZYRlRfT3V0bGluZV9GdW5jcyBmdW5jczsKKyAgZnVuY3MubW92ZV90byA9IE91dGxpbmVfTW92ZVRvOworICBmdW5jcy5saW5lX3RvID0gT3V0bGluZV9MaW5lVG87CisgIGZ1bmNzLmNvbmljX3RvID0gT3V0bGluZV9Db25pY1RvOworICBmdW5jcy5jdWJpY190byA9IE91dGxpbmVfQ3ViaWNUbzsKKyAgZnVuY3Muc2hpZnQgPSAwOworICBmdW5jcy5kZWx0YSA9IDA7CisKKyAgT1VUTElORV9QQVJBTVMgcGFyYW1zOworICBhdXRvIHBQYXRoID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9QYXRoRGF0YT4oKTsKKyAgcGFyYW1zLm1fcFBhdGggPSBwUGF0aC5nZXQoKTsKKyAgcGFyYW1zLm1fQ3VyWCA9IHBhcmFtcy5tX0N1clkgPSAwOworICBwYXJhbXMubV9Db29yZFVuaXQgPSA2NCAqIDY0LjA7CisKKyAgRlhGVF9PdXRsaW5lX0RlY29tcG9zZShGWEZUX0dldF9HbHlwaF9PdXRsaW5lKG1fRmFjZSksICZmdW5jcywgJnBhcmFtcyk7CisgIGlmIChwUGF0aC0+R2V0UG9pbnRzKCkuZW1wdHkoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBPdXRsaW5lX0NoZWNrRW1wdHlDb250b3VyKCZwYXJhbXMpOworICBwUGF0aC0+Q2xvc2VQYXRoKCk7CisKKyAgcmV0dXJuIHBQYXRoLnJlbGVhc2UoKTsKK30KKworY29uc3QgQ0ZYX0dseXBoQml0bWFwKiBDRlhfRm9udDo6TG9hZEdseXBoQml0bWFwKHVpbnQzMl90IGdseXBoX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZvbnRTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbnRpX2FsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgdGV4dF9mbGFncykgY29uc3QgeworICByZXR1cm4gR2V0RmFjZUNhY2hlKCktPkxvYWRHbHlwaEJpdG1hcCh0aGlzLCBnbHlwaF9pbmRleCwgYkZvbnRTdHlsZSwgcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF93aWR0aCwgYW50aV9hbGlhcywgdGV4dF9mbGFncyk7Cit9CisKK2NvbnN0IENGWF9QYXRoRGF0YSogQ0ZYX0ZvbnQ6OkxvYWRHbHlwaFBhdGgodWludDMyX3QgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoKSBjb25zdCB7CisgIHJldHVybiBHZXRGYWNlQ2FjaGUoKS0+TG9hZEdseXBoUGF0aCh0aGlzLCBnbHlwaF9pbmRleCwgZGVzdF93aWR0aCk7Cit9CisKKyNpZiBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfIHx8IF9TS0lBX1NVUFBPUlRfUEFUSFNfCitDRlhfVHlwZUZhY2UqIENGWF9Gb250OjpHZXREZXZpY2VDYWNoZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEdldEZhY2VDYWNoZSgpLT5HZXREZXZpY2VDYWNoZSh0aGlzKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2NmeF9mb250LmggYi9jb3JlL2Z4Z2UvY2Z4X2ZvbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGM0Y2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGdlL2NmeF9mb250LmgKQEAgLTAsMCArMSwxMjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYR0VfQ0ZYX0ZPTlRfSF8KKyNkZWZpbmUgQ09SRV9GWEdFX0NGWF9GT05UX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9ieXRlc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKKworI2lmIGRlZmluZWQgX1NLSUFfU1VQUE9SVF8gfHwgZGVmaW5lZCBfU0tJQV9TVVBQT1JUX1BBVEhTXworI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mb250LmgiCisjZW5kaWYKKworY2xhc3MgQ0ZYX0ZhY2VDYWNoZTsKK2NsYXNzIENGWF9HbHlwaEJpdG1hcDsKK2NsYXNzIENGWF9QYXRoRGF0YTsKK2NsYXNzIENGWF9TdWJzdEZvbnQ7CitjbGFzcyBJRlhfU2Vla2FibGVSZWFkU3RyZWFtOworCitjbGFzcyBDRlhfRm9udCB7CisgcHVibGljOgorICBDRlhfRm9udCgpOworICB+Q0ZYX0ZvbnQoKTsKKworICB2b2lkIExvYWRTdWJzdChjb25zdCBCeXRlU3RyaW5nJiBmYWNlX25hbWUsCisgICAgICAgICAgICAgICAgIGJvb2wgYlRydWVUeXBlLAorICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgaW50IGl0YWxpY19hbmdsZSwKKyAgICAgICAgICAgICAgICAgaW50IENoYXJzZXRDUCwKKyAgICAgICAgICAgICAgICAgYm9vbCBiVmVydGljYWwpOworCisgIGJvb2wgTG9hZEVtYmVkZGVkKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHVpbnQzMl90IHNpemUpOworICBGWEZUX0ZhY2UgR2V0RmFjZSgpIGNvbnN0IHsgcmV0dXJuIG1fRmFjZTsgfQorICBDRlhfU3Vic3RGb250KiBHZXRTdWJzdEZvbnQoKSBjb25zdCB7IHJldHVybiBtX3BTdWJzdEZvbnQuZ2V0KCk7IH0KKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIGJvb2wgTG9hZEZpbGUoY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZSwgaW50IG5GYWNlSW5kZXgpOworCisgIHZvaWQgU2V0RmFjZShGWEZUX0ZhY2UgZmFjZSk7CisgIHZvaWQgU2V0U3Vic3RGb250KHN0ZDo6dW5pcXVlX3B0cjxDRlhfU3Vic3RGb250PiBzdWJzdCk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKKyAgY29uc3QgQ0ZYX0dseXBoQml0bWFwKiBMb2FkR2x5cGhCaXRtYXAodWludDMyX3QgZ2x5cGhfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZvbnRTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbnRpX2FsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHRleHRfZmxhZ3MpIGNvbnN0OworICBjb25zdCBDRlhfUGF0aERhdGEqIExvYWRHbHlwaFBhdGgodWludDMyX3QgZ2x5cGhfaW5kZXgsIGludCBkZXN0X3dpZHRoKSBjb25zdDsKKworI2lmIGRlZmluZWQgX1NLSUFfU1VQUE9SVF8gfHwgZGVmaW5lZCBfU0tJQV9TVVBQT1JUX1BBVEhTXworICBDRlhfVHlwZUZhY2UqIEdldERldmljZUNhY2hlKCkgY29uc3Q7CisjZW5kaWYKKworICBpbnQgR2V0R2x5cGhXaWR0aCh1aW50MzJfdCBnbHlwaF9pbmRleCk7CisgIGludCBHZXRBc2NlbnQoKSBjb25zdDsKKyAgaW50IEdldERlc2NlbnQoKSBjb25zdDsKKyAgYm9vbCBHZXRHbHlwaEJCb3godWludDMyX3QgZ2x5cGhfaW5kZXgsIEZYX1JFQ1QmIGJib3gpOworICBib29sIElzSXRhbGljKCkgY29uc3Q7CisgIGJvb2wgSXNCb2xkKCkgY29uc3Q7CisgIGJvb2wgSXNGaXhlZFdpZHRoKCkgY29uc3Q7CisgIGJvb2wgSXNWZXJ0aWNhbCgpIGNvbnN0IHsgcmV0dXJuIG1fYlZlcnRpY2FsOyB9CisgIEJ5dGVTdHJpbmcgR2V0UHNOYW1lKCkgY29uc3Q7CisgIEJ5dGVTdHJpbmcgR2V0RmFtaWx5TmFtZSgpIGNvbnN0OworICBCeXRlU3RyaW5nIEdldEZhY2VOYW1lKCkgY29uc3Q7CisgIGJvb2wgSXNUVEZvbnQoKSBjb25zdDsKKyAgYm9vbCBHZXRCQm94KEZYX1JFQ1QmIGJib3gpOworICBib29sIElzRW1iZWRkZWQoKSBjb25zdCB7IHJldHVybiBtX2JFbWJlZGRlZDsgfQorICB1aW50OF90KiBHZXRTdWJEYXRhKCkgY29uc3QgeyByZXR1cm4gbV9wR3N1YkRhdGEuZ2V0KCk7IH0KKyAgdm9pZCBTZXRTdWJEYXRhKHVpbnQ4X3QqIGRhdGEpIHsgbV9wR3N1YkRhdGEucmVzZXQoZGF0YSk7IH0KKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9BUFBMRV8KKyAgdm9pZCogR2V0UGxhdGZvcm1Gb250KCkgY29uc3QgeyByZXR1cm4gbV9wUGxhdGZvcm1Gb250OyB9CisgIHZvaWQgU2V0UGxhdGZvcm1Gb250KHZvaWQqIGZvbnQpIHsgbV9wUGxhdGZvcm1Gb250ID0gZm9udDsgfQorI2VuZGlmCisgIHVpbnQ4X3QqIEdldEZvbnREYXRhKCkgY29uc3QgeyByZXR1cm4gbV9wRm9udERhdGE7IH0KKyAgdWludDMyX3QgR2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZHdTaXplOyB9CisgIHZvaWQgQWRqdXN0TU1QYXJhbXMoaW50IGdseXBoX2luZGV4LCBpbnQgd2lkdGgsIGludCB3ZWlnaHQpIGNvbnN0OworCisgIENGWF9QYXRoRGF0YSogTG9hZEdseXBoUGF0aEltcGwodWludDMyX3QgZ2x5cGhfaW5kZXgsIGludCBkZXN0X3dpZHRoKSBjb25zdDsKKworICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtBbmdsZVNrZXdBcnJheVNpemUgPSAzMDsKKyAgc3RhdGljIGNvbnN0IGNoYXIgc19BbmdsZVNrZXdba0FuZ2xlU2tld0FycmF5U2l6ZV07CisgIHN0YXRpYyBjb25zdCBzaXplX3Qga1dlaWdodFBvd0FycmF5U2l6ZSA9IDEwMDsKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc19XZWlnaHRQb3dba1dlaWdodFBvd0FycmF5U2l6ZV07CisgIHN0YXRpYyBjb25zdCB1aW50OF90IHNfV2VpZ2h0UG93XzExW2tXZWlnaHRQb3dBcnJheVNpemVdOworICBzdGF0aWMgY29uc3QgdWludDhfdCBzX1dlaWdodFBvd19TSElGVEpJU1trV2VpZ2h0UG93QXJyYXlTaXplXTsKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgcHJvdGVjdGVkOgorICBzdGQ6OnVuaXF1ZV9wdHI8RlhGVF9TdHJlYW1SZWM+IG1fcE93bmVkU3RyZWFtOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCisgcHJpdmF0ZToKKyAgQ0ZYX0ZhY2VDYWNoZSogR2V0RmFjZUNhY2hlKCkgY29uc3Q7CisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCisgIHZvaWQgUmVsZWFzZVBsYXRmb3JtUmVzb3VyY2UoKTsKKyNlbmRpZiAgLy8gX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCisgIHZvaWQgRGVsZXRlRmFjZSgpOworICB2b2lkIENsZWFyRmFjZUNhY2hlKCk7CisKKyAgRlhGVF9GYWNlIG1fRmFjZTsKKyAgbXV0YWJsZSBVbm93bmVkUHRyPENGWF9GYWNlQ2FjaGU+IG1fRmFjZUNhY2hlOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1N1YnN0Rm9udD4gbV9wU3Vic3RGb250OworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtX3BGb250RGF0YUFsbG9jYXRpb247CisgIHVpbnQ4X3QqIG1fcEZvbnREYXRhOworICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4gbV9wR3N1YkRhdGE7CisgIHVpbnQzMl90IG1fZHdTaXplOworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXworICB2b2lkKiBtX3BQbGF0Zm9ybUZvbnQ7CisjZW5kaWYKKyAgYm9vbCBtX2JFbWJlZGRlZDsKKyAgYm9vbCBtX2JWZXJ0aWNhbDsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWEdFX0NGWF9GT05UX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvY2Z4X2ZvbnRjYWNoZS5jcHAgYi9jb3JlL2Z4Z2UvY2Z4X2ZvbnRjYWNoZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNjYWM4YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9jZnhfZm9udGNhY2hlLmNwcApAQCAtMCwwICsxLDcwIEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnRjYWNoZS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZhY2VjYWNoZS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mb250LmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZyZWV0eXBlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCitDRlhfRm9udENhY2hlOjpDb3VudGVkRmFjZUNhY2hlOjpDb3VudGVkRmFjZUNhY2hlKCkge30KKworQ0ZYX0ZvbnRDYWNoZTo6Q291bnRlZEZhY2VDYWNoZTo6fkNvdW50ZWRGYWNlQ2FjaGUoKSB7fQorCitDRlhfRm9udENhY2hlOjpDRlhfRm9udENhY2hlKCkge30KKworQ0ZYX0ZvbnRDYWNoZTo6fkNGWF9Gb250Q2FjaGUoKSB7CisgIEFTU0VSVChtX0V4dEZhY2VNYXAuZW1wdHkoKSk7CisgIEFTU0VSVChtX0ZURmFjZU1hcC5lbXB0eSgpKTsKK30KKworQ0ZYX0ZhY2VDYWNoZSogQ0ZYX0ZvbnRDYWNoZTo6R2V0Q2FjaGVkRmFjZShjb25zdCBDRlhfRm9udCogcEZvbnQpIHsKKyAgRlhGVF9GYWNlIGZhY2UgPSBwRm9udC0+R2V0RmFjZSgpOworICBjb25zdCBib29sIGJFeHRlcm5hbCA9ICFmYWNlOworICBDRlhfRlRDYWNoZU1hcCYgbWFwID0gYkV4dGVybmFsID8gbV9FeHRGYWNlTWFwIDogbV9GVEZhY2VNYXA7CisgIGF1dG8gaXQgPSBtYXAuZmluZChmYWNlKTsKKyAgaWYgKGl0ICE9IG1hcC5lbmQoKSkgeworICAgIENvdW50ZWRGYWNlQ2FjaGUqIGNvdW50ZWRfZmFjZV9jYWNoZSA9IGl0LT5zZWNvbmQuZ2V0KCk7CisgICAgY291bnRlZF9mYWNlX2NhY2hlLT5tX25Db3VudCsrOworICAgIHJldHVybiBjb3VudGVkX2ZhY2VfY2FjaGUtPm1fT2JqLmdldCgpOworICB9CisKKyAgYXV0byBjb3VudGVkX2ZhY2VfY2FjaGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q291bnRlZEZhY2VDYWNoZT4oKTsKKyAgY291bnRlZF9mYWNlX2NhY2hlLT5tX25Db3VudCA9IDI7CisgIGF1dG8gbmV3X2NhY2hlID0KKyAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfRmFjZUNhY2hlPihiRXh0ZXJuYWwgPyBudWxscHRyIDogZmFjZSk7CisgIENGWF9GYWNlQ2FjaGUqIGZhY2VfY2FjaGUgPSBuZXdfY2FjaGUuZ2V0KCk7CisgIGNvdW50ZWRfZmFjZV9jYWNoZS0+bV9PYmogPSBzdGQ6Om1vdmUobmV3X2NhY2hlKTsKKyAgbWFwW2ZhY2VdID0gc3RkOjptb3ZlKGNvdW50ZWRfZmFjZV9jYWNoZSk7CisgIHJldHVybiBmYWNlX2NhY2hlOworfQorCisjaWZkZWYgX1NLSUFfU1VQUE9SVF8KK0NGWF9UeXBlRmFjZSogQ0ZYX0ZvbnRDYWNoZTo6R2V0RGV2aWNlQ2FjaGUoY29uc3QgQ0ZYX0ZvbnQqIHBGb250KSB7CisgIHJldHVybiBHZXRDYWNoZWRGYWNlKHBGb250KS0+R2V0RGV2aWNlQ2FjaGUocEZvbnQpOworfQorI2VuZGlmCisKK3ZvaWQgQ0ZYX0ZvbnRDYWNoZTo6UmVsZWFzZUNhY2hlZEZhY2UoY29uc3QgQ0ZYX0ZvbnQqIHBGb250KSB7CisgIEZYRlRfRmFjZSBmYWNlID0gcEZvbnQtPkdldEZhY2UoKTsKKyAgY29uc3QgYm9vbCBiRXh0ZXJuYWwgPSAhZmFjZTsKKyAgQ0ZYX0ZUQ2FjaGVNYXAmIG1hcCA9IGJFeHRlcm5hbCA/IG1fRXh0RmFjZU1hcCA6IG1fRlRGYWNlTWFwOworCisgIGF1dG8gaXQgPSBtYXAuZmluZChmYWNlKTsKKyAgaWYgKGl0ID09IG1hcC5lbmQoKSkKKyAgICByZXR1cm47CisKKyAgQ291bnRlZEZhY2VDYWNoZSogY291bnRlZF9mYWNlX2NhY2hlID0gaXQtPnNlY29uZC5nZXQoKTsKKyAgaWYgKGNvdW50ZWRfZmFjZV9jYWNoZS0+bV9uQ291bnQgPiAyKSB7CisgICAgY291bnRlZF9mYWNlX2NhY2hlLT5tX25Db3VudC0tOworICB9IGVsc2UgeworICAgIG1hcC5lcmFzZShpdCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9jZnhfZm9udGNhY2hlLmggYi9jb3JlL2Z4Z2UvY2Z4X2ZvbnRjYWNoZS5oCmluZGV4IDUyYWMzZmEuLmExNGVkMDkgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhnZS9jZnhfZm9udGNhY2hlLmgKKysrIGIvY29yZS9meGdlL2NmeF9mb250Y2FjaGUuaApAQCAtMTEsNiArMTEsNyBAQAogI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mb250LmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZvbnQuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKIApkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2NmeF9mb250bWFwcGVyLmNwcCBiL2NvcmUvZnhnZS9jZnhfZm9udG1hcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiYThmNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9jZnhfZm9udG1hcHBlci5jcHAKQEAgLTAsMCArMSw4MDIgQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZm9udG1hcHBlci5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb2RlcGFnZS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZm9udG1nci5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfc3Vic3Rmb250LmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZvbnQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvaWZ4X3N5c3RlbWZvbnRpbmZvLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBpbnQga051bVN0YW5kYXJkRm9udHMgPSAxNDsKKworY29uc3QgY2hhciogY29uc3QgZ19CYXNlMTRGb250TmFtZXNba051bVN0YW5kYXJkRm9udHNdID0geworICAgICJDb3VyaWVyIiwKKyAgICAiQ291cmllci1Cb2xkIiwKKyAgICAiQ291cmllci1Cb2xkT2JsaXF1ZSIsCisgICAgIkNvdXJpZXItT2JsaXF1ZSIsCisgICAgIkhlbHZldGljYSIsCisgICAgIkhlbHZldGljYS1Cb2xkIiwKKyAgICAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIiwKKyAgICAiSGVsdmV0aWNhLU9ibGlxdWUiLAorICAgICJUaW1lcy1Sb21hbiIsCisgICAgIlRpbWVzLUJvbGQiLAorICAgICJUaW1lcy1Cb2xkSXRhbGljIiwKKyAgICAiVGltZXMtSXRhbGljIiwKKyAgICAiU3ltYm9sIiwKKyAgICAiWmFwZkRpbmdiYXRzIiwKK307CisKK2NvbnN0IHN0cnVjdCBBbHRGb250TmFtZSB7CisgIGNvbnN0IGNoYXIqIG1fcE5hbWU7CisgIGludCBtX0luZGV4OworfSBnX0FsdEZvbnROYW1lc1tdID0geworICAgIHsiQXJpYWwiLCA0fSwKKyAgICB7IkFyaWFsLEJvbGQiLCA1fSwKKyAgICB7IkFyaWFsLEJvbGRJdGFsaWMiLCA2fSwKKyAgICB7IkFyaWFsLEl0YWxpYyIsIDd9LAorICAgIHsiQXJpYWwtQm9sZCIsIDV9LAorICAgIHsiQXJpYWwtQm9sZEl0YWxpYyIsIDZ9LAorICAgIHsiQXJpYWwtQm9sZEl0YWxpY01UIiwgNn0sCisgICAgeyJBcmlhbC1Cb2xkTVQiLCA1fSwKKyAgICB7IkFyaWFsLUl0YWxpYyIsIDd9LAorICAgIHsiQXJpYWwtSXRhbGljTVQiLCA3fSwKKyAgICB7IkFyaWFsQm9sZCIsIDV9LAorICAgIHsiQXJpYWxCb2xkSXRhbGljIiwgNn0sCisgICAgeyJBcmlhbEl0YWxpYyIsIDd9LAorICAgIHsiQXJpYWxNVCIsIDR9LAorICAgIHsiQXJpYWxNVCxCb2xkIiwgNX0sCisgICAgeyJBcmlhbE1ULEJvbGRJdGFsaWMiLCA2fSwKKyAgICB7IkFyaWFsTVQsSXRhbGljIiwgN30sCisgICAgeyJBcmlhbFJvdW5kZWRNVEJvbGQiLCA1fSwKKyAgICB7IkNvdXJpZXIiLCAwfSwKKyAgICB7IkNvdXJpZXIsQm9sZCIsIDF9LAorICAgIHsiQ291cmllcixCb2xkSXRhbGljIiwgMn0sCisgICAgeyJDb3VyaWVyLEl0YWxpYyIsIDN9LAorICAgIHsiQ291cmllci1Cb2xkIiwgMX0sCisgICAgeyJDb3VyaWVyLUJvbGRPYmxpcXVlIiwgMn0sCisgICAgeyJDb3VyaWVyLU9ibGlxdWUiLCAzfSwKKyAgICB7IkNvdXJpZXJCb2xkIiwgMX0sCisgICAgeyJDb3VyaWVyQm9sZEl0YWxpYyIsIDJ9LAorICAgIHsiQ291cmllckl0YWxpYyIsIDN9LAorICAgIHsiQ291cmllck5ldyIsIDB9LAorICAgIHsiQ291cmllck5ldyxCb2xkIiwgMX0sCisgICAgeyJDb3VyaWVyTmV3LEJvbGRJdGFsaWMiLCAyfSwKKyAgICB7IkNvdXJpZXJOZXcsSXRhbGljIiwgM30sCisgICAgeyJDb3VyaWVyTmV3LUJvbGQiLCAxfSwKKyAgICB7IkNvdXJpZXJOZXctQm9sZEl0YWxpYyIsIDJ9LAorICAgIHsiQ291cmllck5ldy1JdGFsaWMiLCAzfSwKKyAgICB7IkNvdXJpZXJOZXdCb2xkIiwgMX0sCisgICAgeyJDb3VyaWVyTmV3Qm9sZEl0YWxpYyIsIDJ9LAorICAgIHsiQ291cmllck5ld0l0YWxpYyIsIDN9LAorICAgIHsiQ291cmllck5ld1BTLUJvbGRJdGFsaWNNVCIsIDJ9LAorICAgIHsiQ291cmllck5ld1BTLUJvbGRNVCIsIDF9LAorICAgIHsiQ291cmllck5ld1BTLUl0YWxpY01UIiwgM30sCisgICAgeyJDb3VyaWVyTmV3UFNNVCIsIDB9LAorICAgIHsiQ291cmllclN0ZCIsIDB9LAorICAgIHsiQ291cmllclN0ZC1Cb2xkIiwgMX0sCisgICAgeyJDb3VyaWVyU3RkLUJvbGRPYmxpcXVlIiwgMn0sCisgICAgeyJDb3VyaWVyU3RkLU9ibGlxdWUiLCAzfSwKKyAgICB7IkhlbHZldGljYSIsIDR9LAorICAgIHsiSGVsdmV0aWNhLEJvbGQiLCA1fSwKKyAgICB7IkhlbHZldGljYSxCb2xkSXRhbGljIiwgNn0sCisgICAgeyJIZWx2ZXRpY2EsSXRhbGljIiwgN30sCisgICAgeyJIZWx2ZXRpY2EtQm9sZCIsIDV9LAorICAgIHsiSGVsdmV0aWNhLUJvbGRJdGFsaWMiLCA2fSwKKyAgICB7IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsIDZ9LAorICAgIHsiSGVsdmV0aWNhLUl0YWxpYyIsIDd9LAorICAgIHsiSGVsdmV0aWNhLU9ibGlxdWUiLCA3fSwKKyAgICB7IkhlbHZldGljYUJvbGQiLCA1fSwKKyAgICB7IkhlbHZldGljYUJvbGRJdGFsaWMiLCA2fSwKKyAgICB7IkhlbHZldGljYUl0YWxpYyIsIDd9LAorICAgIHsiU3ltYm9sIiwgMTJ9LAorICAgIHsiU3ltYm9sTVQiLCAxMn0sCisgICAgeyJUaW1lcy1Cb2xkIiwgOX0sCisgICAgeyJUaW1lcy1Cb2xkSXRhbGljIiwgMTB9LAorICAgIHsiVGltZXMtSXRhbGljIiwgMTF9LAorICAgIHsiVGltZXMtUm9tYW4iLCA4fSwKKyAgICB7IlRpbWVzQm9sZCIsIDl9LAorICAgIHsiVGltZXNCb2xkSXRhbGljIiwgMTB9LAorICAgIHsiVGltZXNJdGFsaWMiLCAxMX0sCisgICAgeyJUaW1lc05ld1JvbWFuIiwgOH0sCisgICAgeyJUaW1lc05ld1JvbWFuLEJvbGQiLCA5fSwKKyAgICB7IlRpbWVzTmV3Um9tYW4sQm9sZEl0YWxpYyIsIDEwfSwKKyAgICB7IlRpbWVzTmV3Um9tYW4sSXRhbGljIiwgMTF9LAorICAgIHsiVGltZXNOZXdSb21hbi1Cb2xkIiwgOX0sCisgICAgeyJUaW1lc05ld1JvbWFuLUJvbGRJdGFsaWMiLCAxMH0sCisgICAgeyJUaW1lc05ld1JvbWFuLUl0YWxpYyIsIDExfSwKKyAgICB7IlRpbWVzTmV3Um9tYW5Cb2xkIiwgOX0sCisgICAgeyJUaW1lc05ld1JvbWFuQm9sZEl0YWxpYyIsIDEwfSwKKyAgICB7IlRpbWVzTmV3Um9tYW5JdGFsaWMiLCAxMX0sCisgICAgeyJUaW1lc05ld1JvbWFuUFMiLCA4fSwKKyAgICB7IlRpbWVzTmV3Um9tYW5QUy1Cb2xkIiwgOX0sCisgICAgeyJUaW1lc05ld1JvbWFuUFMtQm9sZEl0YWxpYyIsIDEwfSwKKyAgICB7IlRpbWVzTmV3Um9tYW5QUy1Cb2xkSXRhbGljTVQiLCAxMH0sCisgICAgeyJUaW1lc05ld1JvbWFuUFMtQm9sZE1UIiwgOX0sCisgICAgeyJUaW1lc05ld1JvbWFuUFMtSXRhbGljIiwgMTF9LAorICAgIHsiVGltZXNOZXdSb21hblBTLUl0YWxpY01UIiwgMTF9LAorICAgIHsiVGltZXNOZXdSb21hblBTTVQiLCA4fSwKKyAgICB7IlRpbWVzTmV3Um9tYW5QU01ULEJvbGQiLCA5fSwKKyAgICB7IlRpbWVzTmV3Um9tYW5QU01ULEJvbGRJdGFsaWMiLCAxMH0sCisgICAgeyJUaW1lc05ld1JvbWFuUFNNVCxJdGFsaWMiLCAxMX0sCisgICAgeyJaYXBmRGluZ2JhdHMiLCAxM30sCit9OworCitjb25zdCBzdHJ1Y3QgQWx0Rm9udEZhbWlseSB7CisgIGNvbnN0IGNoYXIqIG1fcEZvbnROYW1lOworICBjb25zdCBjaGFyKiBtX3BGb250RmFtaWx5OworfSBnX0FsdEZvbnRGYW1pbGllc1tdID0geworICAgIHsiQUdhcmFtb25kUHJvIiwgIkFkb2JlIEdhcmFtb25kIFBybyJ9LAorICAgIHsiQmFua0dvdGhpY0JULU1lZGl1bSIsICJCYW5rR290aGljIE1kIEJUIn0sCisgICAgeyJGb3J0ZU1UIiwgIkZvcnRlIn0sCit9OworCitjb25zdCBzdHJ1Y3QgQ09ERVBBR0VfTUFQIHsKKyAgdWludDE2X3QgY29kZXBhZ2U7CisgIHVpbnQ4X3QgY2hhcnNldDsKK30gZ19Db2RlcGFnZTJDaGFyc2V0VGFibGVbXSA9IHsKKyAgICB7MCwgMX0sICAgICAgezQyLCAyfSwgICAgIHs0MzcsIDI1NH0sICB7ODUwLCAyNTV9LCAgezg3NCwgMjIyfSwKKyAgICB7OTMyLCAxMjh9LCAgezkzNiwgMTM0fSwgIHs5NDksIDEyOX0sICB7OTUwLCAxMzZ9LCAgezEyNTAsIDIzOH0sCisgICAgezEyNTEsIDIwNH0sIHsxMjUyLCAwfSwgICB7MTI1MywgMTYxfSwgezEyNTQsIDE2Mn0sIHsxMjU1LCAxNzd9LAorICAgIHsxMjU2LCAxNzh9LCB7MTI1NywgMTg2fSwgezEyNTgsIDE2M30sIHsxMzYxLCAxMzB9LCB7MTAwMDAsIDc3fSwKKyAgICB7MTAwMDEsIDc4fSwgezEwMDAyLCA4MX0sIHsxMDAwMywgNzl9LCB7MTAwMDQsIDg0fSwgezEwMDA1LCA4M30sCisgICAgezEwMDA2LCA4NX0sIHsxMDAwNywgODl9LCB7MTAwMDgsIDgwfSwgezEwMDIxLCA4N30sIHsxMDAyOSwgODh9LAorICAgIHsxMDA4MSwgODZ9LAorfTsKKworQnl0ZVN0cmluZyBUVF9Ob3JtYWxpemVOYW1lKGNvbnN0IGNoYXIqIGZhbWlseSkgeworICBCeXRlU3RyaW5nIG5vcm0oZmFtaWx5KTsKKyAgbm9ybS5SZW1vdmUoJyAnKTsKKyAgbm9ybS5SZW1vdmUoJy0nKTsKKyAgbm9ybS5SZW1vdmUoJywnKTsKKyAgYXV0byBwb3MgPSBub3JtLkZpbmQoJysnKTsKKyAgaWYgKHBvcy5oYXNfdmFsdWUoKSAmJiBwb3MudmFsdWUoKSAhPSAwKQorICAgIG5vcm0gPSBub3JtLkxlZnQocG9zLnZhbHVlKCkpOworICBub3JtLk1ha2VMb3dlcigpOworICByZXR1cm4gbm9ybTsKK30KKwordWludDhfdCBHZXRDaGFyc2V0RnJvbUNvZGVQYWdlKHVpbnQxNl90IGNvZGVwYWdlKSB7CisgIGNvbnN0IENPREVQQUdFX01BUCogcEVuZCA9CisgICAgICBnX0NvZGVwYWdlMkNoYXJzZXRUYWJsZSArIEZYX0FycmF5U2l6ZShnX0NvZGVwYWdlMkNoYXJzZXRUYWJsZSk7CisgIGNvbnN0IENPREVQQUdFX01BUCogcENoYXJtYXAgPQorICAgICAgc3RkOjpsb3dlcl9ib3VuZChnX0NvZGVwYWdlMkNoYXJzZXRUYWJsZSwgcEVuZCwgY29kZXBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IENPREVQQUdFX01BUCYgY2hhcnNldCwgdWludDE2X3QgcGFnZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjaGFyc2V0LmNvZGVwYWdlIDwgcGFnZTsKKyAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgIGlmIChwQ2hhcm1hcCA8IHBFbmQgJiYgY29kZXBhZ2UgPT0gcENoYXJtYXAtPmNvZGVwYWdlKQorICAgIHJldHVybiBwQ2hhcm1hcC0+Y2hhcnNldDsKKyAgcmV0dXJuIEZYX0NIQVJTRVRfRGVmYXVsdDsKK30KKwordm9pZCBHZXRGb250RmFtaWx5KHVpbnQzMl90IG5TdHlsZSwgQnl0ZVN0cmluZyogZm9udE5hbWUpIHsKKyAgaWYgKGZvbnROYW1lLT5Db250YWlucygiU2NyaXB0IikpIHsKKyAgICBpZiAoRm9udFN0eWxlSXNCb2xkKG5TdHlsZSkpCisgICAgICAqZm9udE5hbWUgPSAiU2NyaXB0TVRCb2xkIjsKKyAgICBlbHNlIGlmIChmb250TmFtZS0+Q29udGFpbnMoIlBhbGFjZSIpKQorICAgICAgKmZvbnROYW1lID0gIlBhbGFjZVNjcmlwdE1UIjsKKyAgICBlbHNlIGlmIChmb250TmFtZS0+Q29udGFpbnMoIkZyZW5jaCIpKQorICAgICAgKmZvbnROYW1lID0gIkZyZW5jaFNjcmlwdE1UIjsKKyAgICBlbHNlIGlmIChmb250TmFtZS0+Q29udGFpbnMoIkZyZWVTdHlsZSIpKQorICAgICAgKmZvbnROYW1lID0gIkZyZWVTdHlsZVNjcmlwdCI7CisgICAgcmV0dXJuOworICB9CisgIGZvciAoY29uc3QgYXV0byYgYWx0ZXJuYXRlIDogZ19BbHRGb250RmFtaWxpZXMpIHsKKyAgICBpZiAoZm9udE5hbWUtPkNvbnRhaW5zKGFsdGVybmF0ZS5tX3BGb250TmFtZSkpIHsKKyAgICAgICpmb250TmFtZSA9IGFsdGVybmF0ZS5tX3BGb250RmFtaWx5OworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorfQorCitCeXRlU3RyaW5nIFBhcnNlU3R5bGUoY29uc3QgY2hhciogcFN0eWxlLCBpbnQgaUxlbiwgaW50IGlJbmRleCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gYnVmOworICBpZiAoIWlMZW4gfHwgaUxlbiA8PSBpSW5kZXgpCisgICAgcmV0dXJuIEJ5dGVTdHJpbmcoYnVmKTsKKyAgd2hpbGUgKGlJbmRleCA8IGlMZW4pIHsKKyAgICBpZiAocFN0eWxlW2lJbmRleF0gPT0gJywnKQorICAgICAgYnJlYWs7CisgICAgYnVmIDw8IHBTdHlsZVtpSW5kZXhdOworICAgICsraUluZGV4OworICB9CisgIHJldHVybiBCeXRlU3RyaW5nKGJ1Zik7Cit9CisKK2NvbnN0IHN0cnVjdCBGWF9Gb250U3R5bGUgeworICBjb25zdCBjaGFyKiBuYW1lOworICBzaXplX3QgbGVuOworICB1aW50MzJfdCBzdHlsZTsKK30gZ19Gb250U3R5bGVzW10gPSB7CisgICAgeyJCb2xkIiwgNCwgRlhGT05UX0JPTER9LAorICAgIHsiSXRhbGljIiwgNiwgRlhGT05UX0lUQUxJQ30sCisgICAgeyJCb2xkSXRhbGljIiwgMTAsIEZYRk9OVF9CT0xEIHwgRlhGT05UX0lUQUxJQ30sCisgICAgeyJSZWciLCAzLCBGWEZPTlRfTk9STUFMfSwKKyAgICB7IlJlZ3VsYXIiLCA3LCBGWEZPTlRfTk9STUFMfSwKK307CisKKy8vIDxleGlzdHMsIGluZGV4LCBsZW5ndGg+CitzdGQ6OnR1cGxlPGJvb2wsIHVpbnQzMl90LCBzaXplX3Q+IEdldFN0eWxlVHlwZShjb25zdCBCeXRlU3RyaW5nJiBic1N0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmV2ZXJzZSkgeworICBpZiAoYnNTdHlsZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIHN0ZDo6bWFrZV90dXBsZShmYWxzZSwgRlhGT05UX05PUk1BTCwgMCk7CisKKyAgZm9yIChpbnQgaSA9IEZYX0FycmF5U2l6ZShnX0ZvbnRTdHlsZXMpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICBjb25zdCBGWF9Gb250U3R5bGUqIHBTdHlsZSA9IGdfRm9udFN0eWxlcyArIGk7CisgICAgaWYgKCFwU3R5bGUgfHwgcFN0eWxlLT5sZW4gPiBic1N0eWxlLkdldExlbmd0aCgpKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoYlJldmVyc2UpIHsKKyAgICAgIGlmIChic1N0eWxlLlJpZ2h0KHBTdHlsZS0+bGVuKS5Db21wYXJlKHBTdHlsZS0+bmFtZSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV90dXBsZSh0cnVlLCBwU3R5bGUtPnN0eWxlLCBwU3R5bGUtPmxlbik7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChic1N0eWxlLkxlZnQocFN0eWxlLT5sZW4pLkNvbXBhcmUocFN0eWxlLT5uYW1lKSA9PSAwKQorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3R1cGxlKHRydWUsIHBTdHlsZS0+c3R5bGUsIHBTdHlsZS0+bGVuKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0ZDo6bWFrZV90dXBsZShmYWxzZSwgRlhGT05UX05PUk1BTCwgMCk7Cit9CisKK2Jvb2wgQ2hlY2tTdXBwb3J0VGhpcmRQYXJ0Rm9udChjb25zdCBCeXRlU3RyaW5nJiBuYW1lLCBpbnQqIFBpdGNoRmFtaWx5KSB7CisgIGlmIChuYW1lICE9ICJNeXJpYWRQcm8iKQorICAgIHJldHVybiBmYWxzZTsKKyAgKlBpdGNoRmFtaWx5ICY9IH5GWEZPTlRfRkZfUk9NQU47CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIFVwZGF0ZVBpdGNoRmFtaWx5KHVpbnQzMl90IGZsYWdzLCBpbnQqIFBpdGNoRmFtaWx5KSB7CisgIGlmIChGb250U3R5bGVJc1NlcmlmKGZsYWdzKSkKKyAgICAqUGl0Y2hGYW1pbHkgfD0gRlhGT05UX0ZGX1JPTUFOOworICBpZiAoRm9udFN0eWxlSXNTY3JpcHQoZmxhZ3MpKQorICAgICpQaXRjaEZhbWlseSB8PSBGWEZPTlRfRkZfU0NSSVBUOworICBpZiAoRm9udFN0eWxlSXNGaXhlZFBpdGNoKGZsYWdzKSkKKyAgICAqUGl0Y2hGYW1pbHkgfD0gRlhGT05UX0ZGX0ZJWEVEUElUQ0g7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitDRlhfRm9udE1hcHBlcjo6Q0ZYX0ZvbnRNYXBwZXIoQ0ZYX0ZvbnRNZ3IqIG1ncikKKyAgICA6IG1fYkxpc3RMb2FkZWQoZmFsc2UpLCBtX3BGb250TWdyKG1ncikgeworICBtX01NRmFjZXNbMF0gPSBudWxscHRyOworICBtX01NRmFjZXNbMV0gPSBudWxscHRyOworICBtZW1zZXQobV9Gb3hpdEZhY2VzLCAwLCBzaXplb2YobV9Gb3hpdEZhY2VzKSk7Cit9CisKK0NGWF9Gb250TWFwcGVyOjp+Q0ZYX0ZvbnRNYXBwZXIoKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKG1fRm94aXRGYWNlcyk7ICsraSkgeworICAgIGlmIChtX0ZveGl0RmFjZXNbaV0pCisgICAgICBGWEZUX0RvbmVfRmFjZShtX0ZveGl0RmFjZXNbaV0pOworICB9CisgIGlmIChtX01NRmFjZXNbMF0pCisgICAgRlhGVF9Eb25lX0ZhY2UobV9NTUZhY2VzWzBdKTsKKyAgaWYgKG1fTU1GYWNlc1sxXSkKKyAgICBGWEZUX0RvbmVfRmFjZShtX01NRmFjZXNbMV0pOworfQorCit2b2lkIENGWF9Gb250TWFwcGVyOjpTZXRTeXN0ZW1Gb250SW5mbygKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SUZYX1N5c3RlbUZvbnRJbmZvPiBwRm9udEluZm8pIHsKKyAgaWYgKCFwRm9udEluZm8pCisgICAgcmV0dXJuOworCisgIG1fcEZvbnRJbmZvID0gc3RkOjptb3ZlKHBGb250SW5mbyk7Cit9CisKK0J5dGVTdHJpbmcgQ0ZYX0ZvbnRNYXBwZXI6OkdldFBTTmFtZUZyb21UVCh2b2lkKiBoRm9udCkgeworICBpZiAoIW1fcEZvbnRJbmZvKQorICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisKKyAgdWludDMyX3Qgc2l6ZSA9IG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwga1RhYmxlTkFNRSwgbnVsbHB0ciwgMCk7CisgIGlmICghc2l6ZSkKKyAgICByZXR1cm4gQnl0ZVN0cmluZygpOworCisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGJ1ZmZlcihzaXplKTsKKyAgdWludDhfdCogYnVmZmVyX3B0ciA9IGJ1ZmZlci5kYXRhKCk7CisgIHVpbnQzMl90IGJ5dGVzX3JlYWQgPQorICAgICAgbV9wRm9udEluZm8tPkdldEZvbnREYXRhKGhGb250LCBrVGFibGVOQU1FLCBidWZmZXJfcHRyLCBzaXplKTsKKyAgcmV0dXJuIGJ5dGVzX3JlYWQgPT0gc2l6ZSA/IEdldE5hbWVGcm9tVFQoYnVmZmVyX3B0ciwgYnl0ZXNfcmVhZCwgNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEJ5dGVTdHJpbmcoKTsKK30KKwordm9pZCBDRlhfRm9udE1hcHBlcjo6QWRkSW5zdGFsbGVkRm9udChjb25zdCBCeXRlU3RyaW5nJiBuYW1lLCBpbnQgY2hhcnNldCkgeworICBpZiAoIW1fcEZvbnRJbmZvKQorICAgIHJldHVybjsKKworICBtX0ZhY2VBcnJheS5wdXNoX2JhY2soe25hbWUsIHN0YXRpY19jYXN0PHVpbnQzMl90PihjaGFyc2V0KX0pOworICBpZiAobmFtZSA9PSBtX0xhc3RGYW1pbHkpCisgICAgcmV0dXJuOworCisgIGJvb2wgYkxvY2FsaXplZCA9IHN0ZDo6YW55X29mKG5hbWUuYmVnaW4oKSwgbmFtZS5lbmQoKSwgW10oY29uc3QgY2hhciYgYykgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50OF90PihjKSA+IDB4ODA7CisgIH0pOworCisgIGlmIChiTG9jYWxpemVkKSB7CisgICAgdm9pZCogaEZvbnQgPSBtX3BGb250SW5mby0+R2V0Rm9udChuYW1lLmNfc3RyKCkpOworICAgIGlmICghaEZvbnQpIHsKKyAgICAgIGhGb250ID0gbV9wRm9udEluZm8tPk1hcEZvbnQoMCwgMCwgRlhfQ0hBUlNFVF9EZWZhdWx0LCAwLCBuYW1lLmNfc3RyKCkpOworICAgICAgaWYgKCFoRm9udCkKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEJ5dGVTdHJpbmcgbmV3X25hbWUgPSBHZXRQU05hbWVGcm9tVFQoaEZvbnQpOworICAgIGlmICghbmV3X25hbWUuSXNFbXB0eSgpKQorICAgICAgbV9Mb2NhbGl6ZWRUVEZvbnRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihuZXdfbmFtZSwgbmFtZSkpOworICAgIG1fcEZvbnRJbmZvLT5EZWxldGVGb250KGhGb250KTsKKyAgfQorICBtX0luc3RhbGxlZFRURm9udHMucHVzaF9iYWNrKG5hbWUpOworICBtX0xhc3RGYW1pbHkgPSBuYW1lOworfQorCit2b2lkIENGWF9Gb250TWFwcGVyOjpMb2FkSW5zdGFsbGVkRm9udHMoKSB7CisgIGlmICghbV9wRm9udEluZm8gfHwgbV9iTGlzdExvYWRlZCkKKyAgICByZXR1cm47CisKKyAgbV9wRm9udEluZm8tPkVudW1Gb250TGlzdCh0aGlzKTsKKyAgbV9iTGlzdExvYWRlZCA9IHRydWU7Cit9CisKK0J5dGVTdHJpbmcgQ0ZYX0ZvbnRNYXBwZXI6Ok1hdGNoSW5zdGFsbGVkRm9udHMoY29uc3QgQnl0ZVN0cmluZyYgbm9ybV9uYW1lKSB7CisgIExvYWRJbnN0YWxsZWRGb250cygpOworICBpbnQgaTsKKyAgZm9yIChpID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQ+KG1fSW5zdGFsbGVkVFRGb250cykgLSAxOyBpID49IDA7IGktLSkgeworICAgIEJ5dGVTdHJpbmcgbm9ybTEgPSBUVF9Ob3JtYWxpemVOYW1lKG1fSW5zdGFsbGVkVFRGb250c1tpXS5jX3N0cigpKTsKKyAgICBpZiAobm9ybTEgPT0gbm9ybV9uYW1lKQorICAgICAgcmV0dXJuIG1fSW5zdGFsbGVkVFRGb250c1tpXTsKKyAgfQorICBmb3IgKGkgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludD4obV9Mb2NhbGl6ZWRUVEZvbnRzKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgQnl0ZVN0cmluZyBub3JtMSA9IFRUX05vcm1hbGl6ZU5hbWUobV9Mb2NhbGl6ZWRUVEZvbnRzW2ldLmZpcnN0LmNfc3RyKCkpOworICAgIGlmIChub3JtMSA9PSBub3JtX25hbWUpCisgICAgICByZXR1cm4gbV9Mb2NhbGl6ZWRUVEZvbnRzW2ldLnNlY29uZDsKKyAgfQorICByZXR1cm4gQnl0ZVN0cmluZygpOworfQorCitGWEZUX0ZhY2UgQ0ZYX0ZvbnRNYXBwZXI6OlVzZUludGVybmFsU3Vic3QoQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaUJhc2VGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGFsaWNfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5KSB7CisgIGlmIChpQmFzZUZvbnQgPCBrTnVtU3RhbmRhcmRGb250cykgeworICAgIGlmIChtX0ZveGl0RmFjZXNbaUJhc2VGb250XSkKKyAgICAgIHJldHVybiBtX0ZveGl0RmFjZXNbaUJhc2VGb250XTsKKyAgICBjb25zdCB1aW50OF90KiBwRm9udERhdGEgPSBudWxscHRyOworICAgIHVpbnQzMl90IHNpemUgPSAwOworICAgIGlmIChtX3BGb250TWdyLT5HZXRCdWlsdGluRm9udChpQmFzZUZvbnQsICZwRm9udERhdGEsICZzaXplKSkgeworICAgICAgbV9Gb3hpdEZhY2VzW2lCYXNlRm9udF0gPSBtX3BGb250TWdyLT5HZXRGaXhlZEZhY2UocEZvbnREYXRhLCBzaXplLCAwKTsKKyAgICAgIHJldHVybiBtX0ZveGl0RmFjZXNbaUJhc2VGb250XTsKKyAgICB9CisgIH0KKyAgcFN1YnN0Rm9udC0+bV9iRmxhZ01NID0gdHJ1ZTsKKyAgcFN1YnN0Rm9udC0+bV9JdGFsaWNBbmdsZSA9IGl0YWxpY19hbmdsZTsKKyAgaWYgKHdlaWdodCkKKyAgICBwU3Vic3RGb250LT5tX1dlaWdodCA9IHdlaWdodDsKKyAgaWYgKEZvbnRGYW1pbHlJc1JvbWFuKHBpdGNoX2ZhbWlseSkpIHsKKyAgICBwU3Vic3RGb250LT5tX1dlaWdodCA9IHBTdWJzdEZvbnQtPm1fV2VpZ2h0ICogNCAvIDU7CisgICAgcFN1YnN0Rm9udC0+bV9GYW1pbHkgPSAiQ2hyb21lIFNlcmlmIjsKKyAgICBpZiAobV9NTUZhY2VzWzFdKQorICAgICAgcmV0dXJuIG1fTU1GYWNlc1sxXTsKKyAgICBjb25zdCB1aW50OF90KiBwRm9udERhdGEgPSBudWxscHRyOworICAgIHVpbnQzMl90IHNpemUgPSAwOworICAgIG1fcEZvbnRNZ3ItPkdldEJ1aWx0aW5Gb250KDE0LCAmcEZvbnREYXRhLCAmc2l6ZSk7CisgICAgbV9NTUZhY2VzWzFdID0gbV9wRm9udE1nci0+R2V0Rml4ZWRGYWNlKHBGb250RGF0YSwgc2l6ZSwgMCk7CisgICAgcmV0dXJuIG1fTU1GYWNlc1sxXTsKKyAgfQorICBwU3Vic3RGb250LT5tX0ZhbWlseSA9ICJDaHJvbWUgU2FucyI7CisgIGlmIChtX01NRmFjZXNbMF0pCisgICAgcmV0dXJuIG1fTU1GYWNlc1swXTsKKyAgY29uc3QgdWludDhfdCogcEZvbnREYXRhID0gbnVsbHB0cjsKKyAgdWludDMyX3Qgc2l6ZSA9IDA7CisgIG1fcEZvbnRNZ3ItPkdldEJ1aWx0aW5Gb250KDE1LCAmcEZvbnREYXRhLCAmc2l6ZSk7CisgIG1fTU1GYWNlc1swXSA9IG1fcEZvbnRNZ3ItPkdldEZpeGVkRmFjZShwRm9udERhdGEsIHNpemUsIDApOworICByZXR1cm4gbV9NTUZhY2VzWzBdOworfQorCitGWEZUX0ZhY2UgQ0ZYX0ZvbnRNYXBwZXI6OkZpbmRTdWJzdEZvbnQoY29uc3QgQnl0ZVN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJUcnVlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGFsaWNfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFdpbmRvd0NQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9TdWJzdEZvbnQqIHBTdWJzdEZvbnQpIHsKKyAgaWYgKHdlaWdodCA9PSAwKQorICAgIHdlaWdodCA9IEZYRk9OVF9GV19OT1JNQUw7CisKKyAgaWYgKCEoZmxhZ3MgJiBGWEZPTlRfVVNFRVhURVJOQVRUUikpIHsKKyAgICB3ZWlnaHQgPSBGWEZPTlRfRldfTk9STUFMOworICAgIGl0YWxpY19hbmdsZSA9IDA7CisgIH0KKyAgQnl0ZVN0cmluZyBTdWJzdE5hbWUgPSBuYW1lOworICBTdWJzdE5hbWUuUmVtb3ZlKCcgJyk7CisgIGlmIChiVHJ1ZVR5cGUgJiYgbmFtZS5HZXRMZW5ndGgoKSA+IDAgJiYgbmFtZVswXSA9PSAnQCcpCisgICAgU3Vic3ROYW1lID0gbmFtZS5SaWdodChuYW1lLkdldExlbmd0aCgpIC0gMSk7CisgIFBERl9HZXRTdGFuZGFyZEZvbnROYW1lKCZTdWJzdE5hbWUpOworICBpZiAoU3Vic3ROYW1lID09ICJTeW1ib2wiICYmICFiVHJ1ZVR5cGUpIHsKKyAgICBwU3Vic3RGb250LT5tX0ZhbWlseSA9ICJDaHJvbWUgU3ltYm9sIjsKKyAgICBwU3Vic3RGb250LT5tX0NoYXJzZXQgPSBGWF9DSEFSU0VUX1N5bWJvbDsKKyAgICByZXR1cm4gVXNlSW50ZXJuYWxTdWJzdChwU3Vic3RGb250LCAxMiwgaXRhbGljX2FuZ2xlLCB3ZWlnaHQsIDApOworICB9CisgIGlmIChTdWJzdE5hbWUgPT0gIlphcGZEaW5nYmF0cyIpIHsKKyAgICBwU3Vic3RGb250LT5tX0ZhbWlseSA9ICJDaHJvbWUgRGluZ2JhdHMiOworICAgIHBTdWJzdEZvbnQtPm1fQ2hhcnNldCA9IEZYX0NIQVJTRVRfU3ltYm9sOworICAgIHJldHVybiBVc2VJbnRlcm5hbFN1YnN0KHBTdWJzdEZvbnQsIDEzLCBpdGFsaWNfYW5nbGUsIHdlaWdodCwgMCk7CisgIH0KKyAgaW50IGlCYXNlRm9udCA9IDA7CisgIEJ5dGVTdHJpbmcgZmFtaWx5OworICBCeXRlU3RyaW5nIHN0eWxlOworICBib29sIGJIYXNDb21tYSA9IGZhbHNlOworICBib29sIGJIYXNIeXBoZW4gPSBmYWxzZTsKKyAgYXV0byBwb3MgPSBTdWJzdE5hbWUuRmluZCgiLCIsIDApOworICBpZiAocG9zLmhhc192YWx1ZSgpKSB7CisgICAgZmFtaWx5ID0gU3Vic3ROYW1lLkxlZnQocG9zLnZhbHVlKCkpOworICAgIFBERl9HZXRTdGFuZGFyZEZvbnROYW1lKCZmYW1pbHkpOworICAgIHN0eWxlID0gU3Vic3ROYW1lLlJpZ2h0KFN1YnN0TmFtZS5HZXRMZW5ndGgoKSAtIChwb3MudmFsdWUoKSArIDEpKTsKKyAgICBiSGFzQ29tbWEgPSB0cnVlOworICB9IGVsc2UgeworICAgIGZhbWlseSA9IFN1YnN0TmFtZTsKKyAgfQorICBmb3IgKDsgaUJhc2VGb250IDwgMTI7IGlCYXNlRm9udCsrKSB7CisgICAgaWYgKGZhbWlseSA9PSBCeXRlU3RyaW5nVmlldyhnX0Jhc2UxNEZvbnROYW1lc1tpQmFzZUZvbnRdKSkKKyAgICAgIGJyZWFrOworICB9CisgIGludCBQaXRjaEZhbWlseSA9IDA7CisgIGJvb2wgYkl0YWxpYyA9IGZhbHNlOworICB1aW50MzJfdCBuU3R5bGUgPSBGWEZPTlRfTk9STUFMOworICBib29sIGJTdHlsZUF2YWlsID0gZmFsc2U7CisgIGlmIChpQmFzZUZvbnQgPCAxMikgeworICAgIGlmICgoaUJhc2VGb250ICUgNCkgPT0gMSB8fCAoaUJhc2VGb250ICUgNCkgPT0gMikKKyAgICAgIG5TdHlsZSB8PSBGWEZPTlRfQk9MRDsKKyAgICBpZiAoKGlCYXNlRm9udCAlIDQpIC8gMikKKyAgICAgIG5TdHlsZSB8PSBGWEZPTlRfSVRBTElDOworICAgIGlmIChpQmFzZUZvbnQgPCA0KQorICAgICAgUGl0Y2hGYW1pbHkgfD0gRlhGT05UX0ZGX0ZJWEVEUElUQ0g7CisgICAgaWYgKGlCYXNlRm9udCA+PSA4KQorICAgICAgUGl0Y2hGYW1pbHkgfD0gRlhGT05UX0ZGX1JPTUFOOworICB9IGVsc2UgeworICAgIGlCYXNlRm9udCA9IGtOdW1TdGFuZGFyZEZvbnRzOworICAgIGlmICghYkhhc0NvbW1hKSB7CisgICAgICBwb3MgPSBmYW1pbHkuUmV2ZXJzZUZpbmQoJy0nKTsKKyAgICAgIGlmIChwb3MuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgc3R5bGUgPSBmYW1pbHkuUmlnaHQoZmFtaWx5LkdldExlbmd0aCgpIC0gKHBvcy52YWx1ZSgpICsgMSkpOworICAgICAgICBmYW1pbHkgPSBmYW1pbHkuTGVmdChwb3MudmFsdWUoKSk7CisgICAgICAgIGJIYXNIeXBoZW4gPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIWJIYXNIeXBoZW4pIHsKKyAgICAgIGludCBuTGVuID0gZmFtaWx5LkdldExlbmd0aCgpOworICAgICAgYm9vbCBoYXNTdHlsZVR5cGU7CisgICAgICB1aW50MzJfdCBzdHlsZVR5cGU7CisgICAgICBzaXplX3QgbGVuOworICAgICAgc3RkOjp0aWUoaGFzU3R5bGVUeXBlLCBzdHlsZVR5cGUsIGxlbikgPSBHZXRTdHlsZVR5cGUoZmFtaWx5LCB0cnVlKTsKKyAgICAgIGlmIChoYXNTdHlsZVR5cGUpIHsKKyAgICAgICAgZmFtaWx5ID0gZmFtaWx5LkxlZnQobkxlbiAtIGxlbik7CisgICAgICAgIG5TdHlsZSB8PSBzdHlsZVR5cGU7CisgICAgICB9CisgICAgfQorICAgIFVwZGF0ZVBpdGNoRmFtaWx5KGZsYWdzLCAmUGl0Y2hGYW1pbHkpOworICB9CisKKyAgaW50IG9sZF93ZWlnaHQgPSB3ZWlnaHQ7CisgIGlmIChGb250U3R5bGVJc0JvbGQoblN0eWxlKSkKKyAgICB3ZWlnaHQgPSBGWEZPTlRfRldfQk9MRDsKKworICBpZiAoIXN0eWxlLklzRW1wdHkoKSkgeworICAgIGludCBuTGVuID0gc3R5bGUuR2V0TGVuZ3RoKCk7CisgICAgY29uc3QgY2hhciogcFN0eWxlID0gc3R5bGUuY19zdHIoKTsKKyAgICBpbnQgaSA9IDA7CisgICAgYm9vbCBiRmlyc3RJdGVtID0gdHJ1ZTsKKyAgICBCeXRlU3RyaW5nIGJ1ZjsKKyAgICB3aGlsZSAoaSA8IG5MZW4pIHsKKyAgICAgIGJ1ZiA9IFBhcnNlU3R5bGUocFN0eWxlLCBuTGVuLCBpKTsKKworICAgICAgYm9vbCBoYXNTdHlsZVR5cGU7CisgICAgICB1aW50MzJfdCBzdHlsZVR5cGU7CisgICAgICBzaXplX3QgbGVuOworICAgICAgc3RkOjp0aWUoaGFzU3R5bGVUeXBlLCBzdHlsZVR5cGUsIGxlbikgPSBHZXRTdHlsZVR5cGUoYnVmLCBmYWxzZSk7CisgICAgICBpZiAoKGkgJiYgIWJTdHlsZUF2YWlsKSB8fCAoIWkgJiYgIWhhc1N0eWxlVHlwZSkpIHsKKyAgICAgICAgZmFtaWx5ID0gU3Vic3ROYW1lOworICAgICAgICBpQmFzZUZvbnQgPSBrTnVtU3RhbmRhcmRGb250czsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoaGFzU3R5bGVUeXBlKQorICAgICAgICBiU3R5bGVBdmFpbCA9IHRydWU7CisKKyAgICAgIGlmIChGb250U3R5bGVJc0JvbGQoc3R5bGVUeXBlKSkgeworICAgICAgICAvLyBJZiB3ZSdyZSBhbHJlYWR5IGJvbGQsIHRoZW4gd2UncmUgZG91YmxlIGJvbGQsIHVzZSBzcGVjaWFsIHdlaWdodC4KKyAgICAgICAgaWYgKEZvbnRTdHlsZUlzQm9sZChuU3R5bGUpKSB7CisgICAgICAgICAgd2VpZ2h0ID0gRlhGT05UX0ZXX0JPTERfQk9MRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB3ZWlnaHQgPSBGWEZPTlRfRldfQk9MRDsKKyAgICAgICAgICBuU3R5bGUgfD0gRlhGT05UX0JPTEQ7CisgICAgICAgIH0KKworICAgICAgICBiRmlyc3RJdGVtID0gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoRm9udFN0eWxlSXNJdGFsaWMoc3R5bGVUeXBlKSAmJiBGb250U3R5bGVJc0JvbGQoc3R5bGVUeXBlKSkgeworICAgICAgICBuU3R5bGUgfD0gRlhGT05UX0lUQUxJQzsKKyAgICAgIH0gZWxzZSBpZiAoRm9udFN0eWxlSXNJdGFsaWMoc3R5bGVUeXBlKSkgeworICAgICAgICBpZiAoYkZpcnN0SXRlbSkgeworICAgICAgICAgIG5TdHlsZSB8PSBGWEZPTlRfSVRBTElDOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZhbWlseSA9IFN1YnN0TmFtZTsKKyAgICAgICAgICBpQmFzZUZvbnQgPSBrTnVtU3RhbmRhcmRGb250czsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGkgKz0gYnVmLkdldExlbmd0aCgpICsgMTsKKyAgICB9CisgIH0KKyAgaWYgKEZvbnRTdHlsZUlzSXRhbGljKG5TdHlsZSkpCisgICAgYkl0YWxpYyA9IHRydWU7CisKKyAgaW50IENoYXJzZXQgPSBGWF9DSEFSU0VUX0FOU0k7CisgIGlmIChXaW5kb3dDUCkKKyAgICBDaGFyc2V0ID0gR2V0Q2hhcnNldEZyb21Db2RlUGFnZShXaW5kb3dDUCk7CisgIGVsc2UgaWYgKGlCYXNlRm9udCA9PSBrTnVtU3RhbmRhcmRGb250cyAmJiBGb250U3R5bGVJc1N5bWJvbGljKGZsYWdzKSkKKyAgICBDaGFyc2V0ID0gRlhfQ0hBUlNFVF9TeW1ib2w7CisKKyAgYm9vbCBiQ0pLID0gKENoYXJzZXQgPT0gRlhfQ0hBUlNFVF9TaGlmdEpJUyB8fAorICAgICAgICAgICAgICAgQ2hhcnNldCA9PSBGWF9DSEFSU0VUX0NoaW5lc2VTaW1wbGlmaWVkIHx8CisgICAgICAgICAgICAgICBDaGFyc2V0ID09IEZYX0NIQVJTRVRfSGFuZ3VsIHx8CisgICAgICAgICAgICAgICBDaGFyc2V0ID09IEZYX0NIQVJTRVRfQ2hpbmVzZVRyYWRpdGlvbmFsKTsKKyAgaWYgKCFtX3BGb250SW5mbykgeworICAgIHJldHVybiBVc2VJbnRlcm5hbFN1YnN0KHBTdWJzdEZvbnQsIGlCYXNlRm9udCwgaXRhbGljX2FuZ2xlLCBvbGRfd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpdGNoRmFtaWx5KTsKKyAgfQorICBHZXRGb250RmFtaWx5KG5TdHlsZSwgJmZhbWlseSk7CisgIEJ5dGVTdHJpbmcgbWF0Y2ggPSBNYXRjaEluc3RhbGxlZEZvbnRzKFRUX05vcm1hbGl6ZU5hbWUoZmFtaWx5LmNfc3RyKCkpKTsKKyAgaWYgKG1hdGNoLklzRW1wdHkoKSAmJiBmYW1pbHkgIT0gU3Vic3ROYW1lICYmCisgICAgICAoIWJIYXNDb21tYSAmJiAoIWJIYXNIeXBoZW4gfHwgKGJIYXNIeXBoZW4gJiYgIWJTdHlsZUF2YWlsKSkpKSB7CisgICAgbWF0Y2ggPSBNYXRjaEluc3RhbGxlZEZvbnRzKFRUX05vcm1hbGl6ZU5hbWUoU3Vic3ROYW1lLmNfc3RyKCkpKTsKKyAgfQorICBpZiAobWF0Y2guSXNFbXB0eSgpICYmIGlCYXNlRm9udCA+PSBrTnVtU3RhbmRhcmRGb250cykgeworICAgIGlmICghYkNKSykgeworICAgICAgaWYgKCFDaGVja1N1cHBvcnRUaGlyZFBhcnRGb250KGZhbWlseSwgJlBpdGNoRmFtaWx5KSkgeworICAgICAgICBiSXRhbGljID0gaXRhbGljX2FuZ2xlICE9IDA7CisgICAgICAgIHdlaWdodCA9IG9sZF93ZWlnaHQ7CisgICAgICB9CisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fTElOVVhfCisgICAgICBjb25zdCBjaGFyKiBuYXJyb3dfZmFtaWx5ID0gIkxpYmVyYXRpb25TYW5zTmFycm93IjsKKyNlbGlmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FORFJPSURfCisgICAgICBjb25zdCBjaGFyKiBuYXJyb3dfZmFtaWx5ID0gIlJvYm90b0NvbmRlbnNlZCI7CisjZWxzZQorICAgICAgY29uc3QgY2hhciogbmFycm93X2ZhbWlseSA9ICJBcmlhbE5hcnJvdyI7CisjZW5kaWYgIC8vIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0xJTlVYXworICAgICAgYXV0byBwb3MgPSBTdWJzdE5hbWUuRmluZCgiTmFycm93Iik7CisgICAgICBpZiAocG9zLmhhc192YWx1ZSgpICYmIHBvcy52YWx1ZSgpICE9IDApCisgICAgICAgIGZhbWlseSA9IG5hcnJvd19mYW1pbHk7CisgICAgICBwb3MgPSBTdWJzdE5hbWUuRmluZCgiQ29uZGVuc2VkIik7CisgICAgICBpZiAocG9zLmhhc192YWx1ZSgpICYmIHBvcy52YWx1ZSgpICE9IDApCisgICAgICAgIGZhbWlseSA9IG5hcnJvd19mYW1pbHk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBTdWJzdEZvbnQtPm1fYlN1YnN0Q0pLID0gdHJ1ZTsKKyAgICAgIGlmIChuU3R5bGUpCisgICAgICAgIHBTdWJzdEZvbnQtPm1fV2VpZ2h0Q0pLID0gblN0eWxlID8gd2VpZ2h0IDogRlhGT05UX0ZXX05PUk1BTDsKKyAgICAgIGlmIChGb250U3R5bGVJc0l0YWxpYyhuU3R5bGUpKQorICAgICAgICBwU3Vic3RGb250LT5tX2JJdGFsaWNDSksgPSB0cnVlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpdGFsaWNfYW5nbGUgPSAwOworICB9CisKKyAgaWYgKCFtYXRjaC5Jc0VtcHR5KCkgfHwgaUJhc2VGb250IDwga051bVN0YW5kYXJkRm9udHMpIHsKKyAgICBpZiAoIW1hdGNoLklzRW1wdHkoKSkKKyAgICAgIGZhbWlseSA9IG1hdGNoOworICAgIGlmIChpQmFzZUZvbnQgPCBrTnVtU3RhbmRhcmRGb250cykgeworICAgICAgaWYgKG5TdHlsZSAmJiAhKGlCYXNlRm9udCAlIDQpKSB7CisgICAgICAgIGlmIChGb250U3R5bGVJc0JvbGQoblN0eWxlKSAmJiBGb250U3R5bGVJc0l0YWxpYyhuU3R5bGUpKQorICAgICAgICAgIGlCYXNlRm9udCArPSAyOworICAgICAgICBlbHNlIGlmIChGb250U3R5bGVJc0JvbGQoblN0eWxlKSkKKyAgICAgICAgICBpQmFzZUZvbnQgKz0gMTsKKyAgICAgICAgZWxzZSBpZiAoRm9udFN0eWxlSXNJdGFsaWMoblN0eWxlKSkKKyAgICAgICAgICBpQmFzZUZvbnQgKz0gMzsKKyAgICAgIH0KKyAgICAgIGZhbWlseSA9IGdfQmFzZTE0Rm9udE5hbWVzW2lCYXNlRm9udF07CisgICAgfQorICB9IGVsc2UgaWYgKEZvbnRTdHlsZUlzSXRhbGljKGZsYWdzKSkgeworICAgIGJJdGFsaWMgPSB0cnVlOworICB9CisgIHZvaWQqIGhGb250ID0gbV9wRm9udEluZm8tPk1hcEZvbnQod2VpZ2h0LCBiSXRhbGljLCBDaGFyc2V0LCBQaXRjaEZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHkuY19zdHIoKSk7CisgIGlmICghaEZvbnQpIHsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICAgIGlmIChmbGFncyAmIEZYRk9OVF9FWEFDVE1BVENIKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisgICAgaWYgKGJDSkspIHsKKyAgICAgIGJJdGFsaWMgPSBpdGFsaWNfYW5nbGUgIT0gMDsKKyAgICAgIHdlaWdodCA9IG9sZF93ZWlnaHQ7CisgICAgfQorICAgIGlmICghbWF0Y2guSXNFbXB0eSgpKSB7CisgICAgICBoRm9udCA9IG1fcEZvbnRJbmZvLT5HZXRGb250KG1hdGNoLmNfc3RyKCkpOworICAgICAgaWYgKCFoRm9udCkgeworICAgICAgICByZXR1cm4gVXNlSW50ZXJuYWxTdWJzdChwU3Vic3RGb250LCBpQmFzZUZvbnQsIGl0YWxpY19hbmdsZSwgb2xkX3dlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGl0Y2hGYW1pbHkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoQ2hhcnNldCA9PSBGWF9DSEFSU0VUX1N5bWJvbCkgeworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXyB8fCBcCisgICAgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQU5EUk9JRF8KKyAgICAgICAgaWYgKFN1YnN0TmFtZSA9PSAiU3ltYm9sIikgeworICAgICAgICAgIHBTdWJzdEZvbnQtPm1fRmFtaWx5ID0gIkNocm9tZSBTeW1ib2wiOworICAgICAgICAgIHBTdWJzdEZvbnQtPm1fQ2hhcnNldCA9IEZYX0NIQVJTRVRfU3ltYm9sOworICAgICAgICAgIHJldHVybiBVc2VJbnRlcm5hbFN1YnN0KHBTdWJzdEZvbnQsIDEyLCBpdGFsaWNfYW5nbGUsIG9sZF93ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGl0Y2hGYW1pbHkpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIEZpbmRTdWJzdEZvbnQoZmFtaWx5LCBiVHJ1ZVR5cGUsIGZsYWdzICYgfkZYRk9OVF9TWU1CT0xJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0LCBpdGFsaWNfYW5nbGUsIDAsIHBTdWJzdEZvbnQpOworICAgICAgfQorICAgICAgaWYgKENoYXJzZXQgPT0gRlhfQ0hBUlNFVF9BTlNJKSB7CisgICAgICAgIHJldHVybiBVc2VJbnRlcm5hbFN1YnN0KHBTdWJzdEZvbnQsIGlCYXNlRm9udCwgaXRhbGljX2FuZ2xlLCBvbGRfd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXRjaEZhbWlseSk7CisgICAgICB9CisKKyAgICAgIGF1dG8gaXQgPQorICAgICAgICAgIHN0ZDo6ZmluZF9pZihtX0ZhY2VBcnJheS5iZWdpbigpLCBtX0ZhY2VBcnJheS5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgW0NoYXJzZXRdKGNvbnN0IEZhY2VEYXRhJiBmYWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhY2UuY2hhcnNldCA9PSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oQ2hhcnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgaWYgKGl0ID09IG1fRmFjZUFycmF5LmVuZCgpKSB7CisgICAgICAgIHJldHVybiBVc2VJbnRlcm5hbFN1YnN0KHBTdWJzdEZvbnQsIGlCYXNlRm9udCwgaXRhbGljX2FuZ2xlLCBvbGRfd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXRjaEZhbWlseSk7CisgICAgICB9CisgICAgICBoRm9udCA9IG1fcEZvbnRJbmZvLT5HZXRGb250KGl0LT5uYW1lLmNfc3RyKCkpOworICAgIH0KKyAgfQorICBpZiAoIWhGb250KQorICAgIHJldHVybiBudWxscHRyOworCisgIG1fcEZvbnRJbmZvLT5HZXRGYWNlTmFtZShoRm9udCwgJlN1YnN0TmFtZSk7CisgIGlmIChDaGFyc2V0ID09IEZYX0NIQVJTRVRfRGVmYXVsdCkKKyAgICBtX3BGb250SW5mby0+R2V0Rm9udENoYXJzZXQoaEZvbnQsICZDaGFyc2V0KTsKKyAgdWludDMyX3QgdHRjX3NpemUgPSBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIGtUYWJsZVRUQ0YsIG51bGxwdHIsIDApOworICB1aW50MzJfdCBmb250X3NpemUgPSBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIDAsIG51bGxwdHIsIDApOworICBpZiAoZm9udF9zaXplID09IDAgJiYgdHRjX3NpemUgPT0gMCkgeworICAgIG1fcEZvbnRJbmZvLT5EZWxldGVGb250KGhGb250KTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBGWEZUX0ZhY2UgZmFjZSA9IG51bGxwdHI7CisgIGlmICh0dGNfc2l6ZSkKKyAgICBmYWNlID0gR2V0Q2FjaGVkVFRDRmFjZShoRm9udCwga1RhYmxlVFRDRiwgdHRjX3NpemUsIGZvbnRfc2l6ZSk7CisgIGVsc2UKKyAgICBmYWNlID0gR2V0Q2FjaGVkRmFjZShoRm9udCwgU3Vic3ROYW1lLCB3ZWlnaHQsIGJJdGFsaWMsIGZvbnRfc2l6ZSk7CisgIGlmICghZmFjZSkgeworICAgIG1fcEZvbnRJbmZvLT5EZWxldGVGb250KGhGb250KTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBwU3Vic3RGb250LT5tX0ZhbWlseSA9IFN1YnN0TmFtZTsKKyAgcFN1YnN0Rm9udC0+bV9DaGFyc2V0ID0gQ2hhcnNldDsKKyAgYm9vbCBiTmVlZFVwZGF0ZVdlaWdodCA9IGZhbHNlOworICBpZiAoRlhGVF9Jc19GYWNlX0JvbGQoZmFjZSkpCisgICAgYk5lZWRVcGRhdGVXZWlnaHQgPSB3ZWlnaHQgIT0gRlhGT05UX0ZXX0JPTEQ7CisgIGVsc2UKKyAgICBiTmVlZFVwZGF0ZVdlaWdodCA9IHdlaWdodCAhPSBGWEZPTlRfRldfTk9STUFMOworICBpZiAoYk5lZWRVcGRhdGVXZWlnaHQpCisgICAgcFN1YnN0Rm9udC0+bV9XZWlnaHQgPSB3ZWlnaHQ7CisgIGlmIChiSXRhbGljICYmICFGWEZUX0lzX0ZhY2VfSXRhbGljKGZhY2UpKSB7CisgICAgaWYgKGl0YWxpY19hbmdsZSA9PSAwKQorICAgICAgaXRhbGljX2FuZ2xlID0gLTEyOworICAgIGVsc2UgaWYgKGFicyhpdGFsaWNfYW5nbGUpIDwgNSkKKyAgICAgIGl0YWxpY19hbmdsZSA9IDA7CisgICAgcFN1YnN0Rm9udC0+bV9JdGFsaWNBbmdsZSA9IGl0YWxpY19hbmdsZTsKKyAgfQorICBtX3BGb250SW5mby0+RGVsZXRlRm9udChoRm9udCk7CisgIHJldHVybiBmYWNlOworfQorCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK0ZYRlRfRmFjZSBDRlhfRm9udE1hcHBlcjo6RmluZFN1YnN0Rm9udEJ5VW5pY29kZSh1aW50MzJfdCBkd1VuaWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRhbGljX2FuZ2xlKSB7CisgIGlmICghbV9wRm9udEluZm8pCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgYm9vbCBiSXRhbGljID0gKGZsYWdzICYgRlhGT05UX0lUQUxJQykgIT0gMDsKKyAgaW50IFBpdGNoRmFtaWx5ID0gMDsKKyAgVXBkYXRlUGl0Y2hGYW1pbHkoZmxhZ3MsICZQaXRjaEZhbWlseSk7CisgIHZvaWQqIGhGb250ID0KKyAgICAgIG1fcEZvbnRJbmZvLT5NYXBGb250QnlVbmljb2RlKGR3VW5pY29kZSwgd2VpZ2h0LCBiSXRhbGljLCBQaXRjaEZhbWlseSk7CisgIGlmICghaEZvbnQpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgdWludDMyX3QgdHRjX3NpemUgPSBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIDB4NzQ3NDYzNjYsIG51bGxwdHIsIDApOworICB1aW50MzJfdCBmb250X3NpemUgPSBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIDAsIG51bGxwdHIsIDApOworICBpZiAoZm9udF9zaXplID09IDAgJiYgdHRjX3NpemUgPT0gMCkgeworICAgIG1fcEZvbnRJbmZvLT5EZWxldGVGb250KGhGb250KTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBGWEZUX0ZhY2UgZmFjZSA9IG51bGxwdHI7CisgIGlmICh0dGNfc2l6ZSkgeworICAgIGZhY2UgPSBHZXRDYWNoZWRUVENGYWNlKGhGb250LCAweDc0NzQ2MzY2LCB0dGNfc2l6ZSwgZm9udF9zaXplKTsKKyAgfSBlbHNlIHsKKyAgICBCeXRlU3RyaW5nIFN1YnN0TmFtZTsKKyAgICBtX3BGb250SW5mby0+R2V0RmFjZU5hbWUoaEZvbnQsICZTdWJzdE5hbWUpOworICAgIGZhY2UgPSBHZXRDYWNoZWRGYWNlKGhGb250LCBTdWJzdE5hbWUsIHdlaWdodCwgYkl0YWxpYywgZm9udF9zaXplKTsKKyAgfQorICBtX3BGb250SW5mby0+RGVsZXRlRm9udChoRm9udCk7CisgIHJldHVybiBmYWNlOworfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCitpbnQgQ0ZYX0ZvbnRNYXBwZXI6OkdldEZhY2VTaXplKCkgY29uc3QgeworICByZXR1cm4gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQ+KG1fRmFjZUFycmF5KTsKK30KKworYm9vbCBDRlhfRm9udE1hcHBlcjo6SXNCdWlsdGluRmFjZShjb25zdCBGWEZUX0ZhY2UgZmFjZSkgY29uc3QgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1NX0ZBQ0VfQ09VTlQ7ICsraSkgeworICAgIGlmIChtX01NRmFjZXNbaV0gPT0gZmFjZSkKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRk9YSVRfRkFDRV9DT1VOVDsgKytpKSB7CisgICAgaWYgKG1fRm94aXRGYWNlc1tpXSA9PSBmYWNlKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitGWEZUX0ZhY2UgQ0ZYX0ZvbnRNYXBwZXI6OkdldENhY2hlZFRUQ0ZhY2Uodm9pZCogaEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgdGFibGVUVENGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHR0Y19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvbnRfc2l6ZSkgeworICB1aW50OF90IGJ1ZmZlclsxMDI0XTsKKyAgbV9wRm9udEluZm8tPkdldEZvbnREYXRhKGhGb250LCB0YWJsZVRUQ0YsIGJ1ZmZlciwgRlhfQXJyYXlTaXplKGJ1ZmZlcikpOworICB1aW50MzJfdCogcEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPihidWZmZXIpOworICB1aW50MzJfdCBjaGVja3N1bSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspCisgICAgY2hlY2tzdW0gKz0gcEJ1ZmZlcltpXTsKKyAgdWludDhfdCogcEZvbnREYXRhOworICBGWEZUX0ZhY2UgZmFjZSA9IG1fcEZvbnRNZ3ItPkdldENhY2hlZFRUQ0ZhY2UoCisgICAgICB0dGNfc2l6ZSwgY2hlY2tzdW0sIHR0Y19zaXplIC0gZm9udF9zaXplLCAmcEZvbnREYXRhKTsKKyAgaWYgKCFmYWNlKSB7CisgICAgcEZvbnREYXRhID0gRlhfQWxsb2ModWludDhfdCwgdHRjX3NpemUpOworICAgIG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgdGFibGVUVENGLCBwRm9udERhdGEsIHR0Y19zaXplKTsKKyAgICBmYWNlID0gbV9wRm9udE1nci0+QWRkQ2FjaGVkVFRDRmFjZSh0dGNfc2l6ZSwgY2hlY2tzdW0sIHBGb250RGF0YSwgdHRjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRjX3NpemUgLSBmb250X3NpemUpOworICB9CisgIHJldHVybiBmYWNlOworfQorCitGWEZUX0ZhY2UgQ0ZYX0ZvbnRNYXBwZXI6OkdldENhY2hlZEZhY2Uodm9pZCogaEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0cmluZyBTdWJzdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJdGFsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9udF9zaXplKSB7CisgIHVpbnQ4X3QqIHBGb250RGF0YTsKKyAgRlhGVF9GYWNlIGZhY2UgPQorICAgICAgbV9wRm9udE1nci0+R2V0Q2FjaGVkRmFjZShTdWJzdE5hbWUsIHdlaWdodCwgYkl0YWxpYywgJnBGb250RGF0YSk7CisgIGlmICghZmFjZSkgeworICAgIHBGb250RGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIGZvbnRfc2l6ZSk7CisgICAgbV9wRm9udEluZm8tPkdldEZvbnREYXRhKGhGb250LCAwLCBwRm9udERhdGEsIGZvbnRfc2l6ZSk7CisgICAgZmFjZSA9CisgICAgICAgIG1fcEZvbnRNZ3ItPkFkZENhY2hlZEZhY2UoU3Vic3ROYW1lLCB3ZWlnaHQsIGJJdGFsaWMsIHBGb250RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X3NpemUsIG1fcEZvbnRJbmZvLT5HZXRGYWNlSW5kZXgoaEZvbnQpKTsKKyAgfQorICByZXR1cm4gZmFjZTsKK30KKworaW50IFBERl9HZXRTdGFuZGFyZEZvbnROYW1lKEJ5dGVTdHJpbmcqIG5hbWUpIHsKKyAgY29uc3QgYXV0byogZW5kID0gc3RkOjplbmQoZ19BbHRGb250TmFtZXMpOworICBjb25zdCBhdXRvKiBmb3VuZCA9CisgICAgICBzdGQ6Omxvd2VyX2JvdW5kKHN0ZDo6YmVnaW4oZ19BbHRGb250TmFtZXMpLCBlbmQsIG5hbWUtPmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IEFsdEZvbnROYW1lJiBlbGVtZW50LCBjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZYU1lTX3N0cmljbXAoZWxlbWVudC5tX3BOYW1lLCBuYW1lKSA8IDA7CisgICAgICAgICAgICAgICAgICAgICAgIH0pOworICBpZiAoZm91bmQgPT0gZW5kIHx8IEZYU1lTX3N0cmljbXAoZm91bmQtPm1fcE5hbWUsIG5hbWUtPmNfc3RyKCkpKQorICAgIHJldHVybiAtMTsKKworICAqbmFtZSA9IGdfQmFzZTE0Rm9udE5hbWVzW2ZvdW5kLT5tX0luZGV4XTsKKyAgcmV0dXJuIGZvdW5kLT5tX0luZGV4OworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2NmeF9mb250bWFwcGVyLmggYi9jb3JlL2Z4Z2UvY2Z4X2ZvbnRtYXBwZXIuaAppbmRleCA5NjYzMGE3Li5lZDhhYjYxIDEwMDY0NAotLS0gYS9jb3JlL2Z4Z2UvY2Z4X2ZvbnRtYXBwZXIuaAorKysgYi9jb3JlL2Z4Z2UvY2Z4X2ZvbnRtYXBwZXIuaApAQCAtMTEsMTAgKzExLDExIEBACiAjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnRtZ3IuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZm9udC5oIgogCitjbGFzcyBDRlhfRm9udE1ncjsKIGNsYXNzIENGWF9TdWJzdEZvbnQ7CitjbGFzcyBJRlhfU3lzdGVtRm9udEluZm87CiAKIGNsYXNzIENGWF9Gb250TWFwcGVyIHsKICBwdWJsaWM6CkBAIC0yMywxMCArMjQsMTAgQEAKIAogICB2b2lkIFNldFN5c3RlbUZvbnRJbmZvKHN0ZDo6dW5pcXVlX3B0cjxJRlhfU3lzdGVtRm9udEluZm8+IHBGb250SW5mbyk7CiAgIElGWF9TeXN0ZW1Gb250SW5mbyogR2V0U3lzdGVtRm9udEluZm8oKSB7IHJldHVybiBtX3BGb250SW5mby5nZXQoKTsgfQotICB2b2lkIEFkZEluc3RhbGxlZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsIGludCBjaGFyc2V0KTsKKyAgdm9pZCBBZGRJbnN0YWxsZWRGb250KGNvbnN0IEJ5dGVTdHJpbmcmIG5hbWUsIGludCBjaGFyc2V0KTsKICAgdm9pZCBMb2FkSW5zdGFsbGVkRm9udHMoKTsKIAotICBGWEZUX0ZhY2UgRmluZFN1YnN0Rm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAorICBGWEZUX0ZhY2UgRmluZFN1YnN0Rm9udChjb25zdCBCeXRlU3RyaW5nJiBmYWNlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRydWVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKQEAgLTQxLDE5ICs0MiwxNyBAQAogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogICBib29sIElzQnVpbHRpbkZhY2UoY29uc3QgRlhGVF9GYWNlIGZhY2UpIGNvbnN0OwogICBpbnQgR2V0RmFjZVNpemUoKSBjb25zdDsKLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0RmFjZU5hbWUoaW50IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIG1fRmFjZUFycmF5W2luZGV4XS5uYW1lOwotICB9CisgIEJ5dGVTdHJpbmcgR2V0RmFjZU5hbWUoaW50IGluZGV4KSBjb25zdCB7IHJldHVybiBtX0ZhY2VBcnJheVtpbmRleF0ubmFtZTsgfQogCi0gIHN0ZDo6dmVjdG9yPENGWF9CeXRlU3RyaW5nPiBtX0luc3RhbGxlZFRURm9udHM7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDRlhfQnl0ZVN0cmluZywgQ0ZYX0J5dGVTdHJpbmc+PiBtX0xvY2FsaXplZFRURm9udHM7CisgIHN0ZDo6dmVjdG9yPEJ5dGVTdHJpbmc+IG1fSW5zdGFsbGVkVFRGb250czsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEJ5dGVTdHJpbmcsIEJ5dGVTdHJpbmc+PiBtX0xvY2FsaXplZFRURm9udHM7CiAKICBwcml2YXRlOgogICBzdGF0aWMgY29uc3Qgc2l6ZV90IE1NX0ZBQ0VfQ09VTlQgPSAyOwogICBzdGF0aWMgY29uc3Qgc2l6ZV90IEZPWElUX0ZBQ0VfQ09VTlQgPSAxNDsKIAotICBDRlhfQnl0ZVN0cmluZyBHZXRQU05hbWVGcm9tVFQodm9pZCogaEZvbnQpOwotICBDRlhfQnl0ZVN0cmluZyBNYXRjaEluc3RhbGxlZEZvbnRzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBub3JtX25hbWUpOworICBCeXRlU3RyaW5nIEdldFBTTmFtZUZyb21UVCh2b2lkKiBoRm9udCk7CisgIEJ5dGVTdHJpbmcgTWF0Y2hJbnN0YWxsZWRGb250cyhjb25zdCBCeXRlU3RyaW5nJiBub3JtX25hbWUpOwogICBGWEZUX0ZhY2UgVXNlSW50ZXJuYWxTdWJzdChDRlhfU3Vic3RGb250KiBwU3Vic3RGb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaUJhc2VGb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRhbGljX2FuZ2xlLApAQCAtNjQsMjMgKzYzLDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHR0Y19zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb250X3NpemUpOwogICBGWEZUX0ZhY2UgR2V0Q2FjaGVkRmFjZSh2b2lkKiBoRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgU3Vic3ROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nIFN1YnN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXRhbGljLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb250X3NpemUpOwogCiAgIHN0cnVjdCBGYWNlRGF0YSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZTsKKyAgICBCeXRlU3RyaW5nIG5hbWU7CiAgICAgdWludDMyX3QgY2hhcnNldDsKICAgfTsKIAogICBib29sIG1fYkxpc3RMb2FkZWQ7CiAgIEZYRlRfRmFjZSBtX01NRmFjZXNbTU1fRkFDRV9DT1VOVF07Ci0gIENGWF9CeXRlU3RyaW5nIG1fTGFzdEZhbWlseTsKKyAgQnl0ZVN0cmluZyBtX0xhc3RGYW1pbHk7CiAgIHN0ZDo6dmVjdG9yPEZhY2VEYXRhPiBtX0ZhY2VBcnJheTsKICAgc3RkOjp1bmlxdWVfcHRyPElGWF9TeXN0ZW1Gb250SW5mbz4gbV9wRm9udEluZm87CiAgIEZYRlRfRmFjZSBtX0ZveGl0RmFjZXNbRk9YSVRfRkFDRV9DT1VOVF07Ci0gIENGWF9Gb250TWdyKiBjb25zdCBtX3BGb250TWdyOworICBVbm93bmVkUHRyPENGWF9Gb250TWdyPiBjb25zdCBtX3BGb250TWdyOwogfTsKIAogI2VuZGlmICAvLyBDT1JFX0ZYR0VfQ0ZYX0ZPTlRNQVBQRVJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9jZnhfZm9udG1nci5jcHAgYi9jb3JlL2Z4Z2UvY2Z4X2ZvbnRtZ3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYmU5M2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Z2UvY2Z4X2ZvbnRtZ3IuY3BwCkBAIC0wLDAgKzEsMjUyIEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnRtZ3IuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mb250bWFwcGVyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9zdWJzdGZvbnQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY3R0Zm9udGRlc2MuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvY2hyb21lZm9udGRhdGEuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZm9udC5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9pZnhfc3lzdGVtZm9udGluZm8uaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBCdWlsdGluRm9udCB7CisgIGNvbnN0IHVpbnQ4X3QqIG1fcEZvbnREYXRhOworICB1aW50MzJfdCBtX2R3U2l6ZTsKK307CisKK2NvbnN0IEJ1aWx0aW5Gb250IGdfRm94aXRGb250c1sxNF0gPSB7CisgICAge2dfRm94aXRGaXhlZEZvbnREYXRhLCAxNzU5N30sCisgICAge2dfRm94aXRGaXhlZEJvbGRGb250RGF0YSwgMTgwNTV9LAorICAgIHtnX0ZveGl0Rml4ZWRCb2xkSXRhbGljRm9udERhdGEsIDE5MTUxfSwKKyAgICB7Z19Gb3hpdEZpeGVkSXRhbGljRm9udERhdGEsIDE4NzQ2fSwKKyAgICB7Z19Gb3hpdFNhbnNGb250RGF0YSwgMTUwMjV9LAorICAgIHtnX0ZveGl0U2Fuc0JvbGRGb250RGF0YSwgMTYzNDR9LAorICAgIHtnX0ZveGl0U2Fuc0JvbGRJdGFsaWNGb250RGF0YSwgMTY0MTh9LAorICAgIHtnX0ZveGl0U2Fuc0l0YWxpY0ZvbnREYXRhLCAxNjMzOX0sCisgICAge2dfRm94aXRTZXJpZkZvbnREYXRhLCAxOTQ2OX0sCisgICAge2dfRm94aXRTZXJpZkJvbGRGb250RGF0YSwgMTkzOTV9LAorICAgIHtnX0ZveGl0U2VyaWZCb2xkSXRhbGljRm9udERhdGEsIDIwNzMzfSwKKyAgICB7Z19Gb3hpdFNlcmlmSXRhbGljRm9udERhdGEsIDIxMjI3fSwKKyAgICB7Z19Gb3hpdFN5bWJvbEZvbnREYXRhLCAxNjcyOX0sCisgICAge2dfRm94aXREaW5nYmF0c0ZvbnREYXRhLCAyOTUxM30sCit9OworCitjb25zdCBCdWlsdGluRm9udCBnX01NRm9udHNbMl0gPSB7CisgICAge2dfRm94aXRTZXJpZk1NRm9udERhdGEsIDExMzQxN30sCisgICAge2dfRm94aXRTYW5zTU1Gb250RGF0YSwgNjY5MTl9LAorfTsKKworQnl0ZVN0cmluZyBLZXlOYW1lRnJvbUZhY2UoY29uc3QgQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkl0YWxpYykgeworICBCeXRlU3RyaW5nIGtleShmYWNlX25hbWUpOworICBrZXkgKz0gJywnOworICBrZXkgKz0gQnl0ZVN0cmluZzo6Rm9ybWF0SW50ZWdlcih3ZWlnaHQpOworICBrZXkgKz0gYkl0YWxpYyA/ICdJJyA6ICdOJzsKKyAgcmV0dXJuIGtleTsKK30KKworQnl0ZVN0cmluZyBLZXlOYW1lRnJvbVNpemUoaW50IHR0Y19zaXplLCB1aW50MzJfdCBjaGVja3N1bSkgeworICByZXR1cm4gQnl0ZVN0cmluZzo6Rm9ybWF0KCIlZDolZCIsIHR0Y19zaXplLCBjaGVja3N1bSk7Cit9CisKK2ludCBHZXRUVENJbmRleChjb25zdCB1aW50OF90KiBwRm9udERhdGEsCisgICAgICAgICAgICAgICAgdWludDMyX3QgdHRjX3NpemUsCisgICAgICAgICAgICAgICAgdWludDMyX3QgZm9udF9vZmZzZXQpIHsKKyAgY29uc3QgdWludDhfdCogcCA9IHBGb250RGF0YSArIDg7CisgIHVpbnQzMl90IG5mb250ID0gR0VUX1RUX0xPTkcocCk7CisgIHVpbnQzMl90IGluZGV4OworICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBuZm9udDsgaW5kZXgrKykgeworICAgIHAgPSBwRm9udERhdGEgKyAxMiArIGluZGV4ICogNDsKKyAgICBpZiAoR0VUX1RUX0xPTkcocCkgPT0gZm9udF9vZmZzZXQpCisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gaW5kZXggPCBuZm9udCA/IGluZGV4IDogMDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0NGWF9Gb250TWdyOjpDRlhfRm9udE1ncigpCisgICAgOiBtX0ZUTGlicmFyeShudWxscHRyKSwgbV9GVExpYnJhcnlTdXBwb3J0c0hpbnRpbmcoZmFsc2UpIHsKKyAgbV9wQnVpbHRpbk1hcHBlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfRm9udE1hcHBlcj4odGhpcyk7Cit9CisKK0NGWF9Gb250TWdyOjp+Q0ZYX0ZvbnRNZ3IoKSB7CisgIC8vIHxtX0ZhY2VNYXB8IGFuZCB8bV9wQnVpbHRpbk1hcHBlcnwgcmVmZXJlbmNlIHxtX0ZUTGlicmFyeXwsIHNvIHRoZXkgbXVzdAorICAvLyBiZSBkZXN0cm95ZWQgZmlyc3QuCisgIG1fRmFjZU1hcC5jbGVhcigpOworICBtX3BCdWlsdGluTWFwcGVyLnJlc2V0KCk7CisgIEZYRlRfRG9uZV9GcmVlVHlwZShtX0ZUTGlicmFyeSk7Cit9CisKK3ZvaWQgQ0ZYX0ZvbnRNZ3I6OkluaXRGVExpYnJhcnkoKSB7CisgIGlmIChtX0ZUTGlicmFyeSkKKyAgICByZXR1cm47CisKKyAgRlhGVF9Jbml0X0ZyZWVUeXBlKCZtX0ZUTGlicmFyeSk7CisgIG1fRlRMaWJyYXJ5U3VwcG9ydHNIaW50aW5nID0KKyAgICAgIFNldExjZEZpbHRlck1vZGUoKSB8fCBGcmVlVHlwZVZlcnNpb25TdXBwb3J0c0hpbnRpbmcoKTsKK30KKwordm9pZCBDRlhfRm9udE1ncjo6U2V0U3lzdGVtRm9udEluZm8oCisgICAgc3RkOjp1bmlxdWVfcHRyPElGWF9TeXN0ZW1Gb250SW5mbz4gcEZvbnRJbmZvKSB7CisgIG1fcEJ1aWx0aW5NYXBwZXItPlNldFN5c3RlbUZvbnRJbmZvKHN0ZDo6bW92ZShwRm9udEluZm8pKTsKK30KKworRlhGVF9GYWNlIENGWF9Gb250TWdyOjpGaW5kU3Vic3RGb250KGNvbnN0IEJ5dGVTdHJpbmcmIGZhY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJUcnVlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGFsaWNfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENoYXJzZXRDUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfU3Vic3RGb250KiBwU3Vic3RGb250KSB7CisgIEluaXRGVExpYnJhcnkoKTsKKyAgcmV0dXJuIG1fcEJ1aWx0aW5NYXBwZXItPkZpbmRTdWJzdEZvbnQoZmFjZV9uYW1lLCBiVHJ1ZVR5cGUsIGZsYWdzLCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0YWxpY19hbmdsZSwgQ2hhcnNldENQLCBwU3Vic3RGb250KTsKK30KKworRlhGVF9GYWNlIENGWF9Gb250TWdyOjpHZXRDYWNoZWRGYWNlKGNvbnN0IEJ5dGVTdHJpbmcmIGZhY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogcEZvbnREYXRhKSB7CisgIGF1dG8gaXQgPSBtX0ZhY2VNYXAuZmluZChLZXlOYW1lRnJvbUZhY2UoZmFjZV9uYW1lLCB3ZWlnaHQsIGJJdGFsaWMpKTsKKyAgaWYgKGl0ID09IG1fRmFjZU1hcC5lbmQoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBDVFRGb250RGVzYyogcEZvbnREZXNjID0gaXQtPnNlY29uZC5nZXQoKTsKKyAgKnBGb250RGF0YSA9IHBGb250RGVzYy0+Rm9udERhdGEoKTsKKyAgcEZvbnREZXNjLT5BZGRSZWYoKTsKKyAgcmV0dXJuIHBGb250RGVzYy0+U2luZ2xlRmFjZSgpOworfQorCitGWEZUX0ZhY2UgQ0ZYX0ZvbnRNZ3I6OkFkZENhY2hlZEZhY2UoY29uc3QgQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZhY2VfaW5kZXgpIHsKKyAgSW5pdEZUTGlicmFyeSgpOworCisgIEZYRlRfRmFjZSBmYWNlID0gbnVsbHB0cjsKKyAgaW50IHJldCA9IEZYRlRfTmV3X01lbW9yeV9GYWNlKG1fRlRMaWJyYXJ5LCBwRGF0YSwgc2l6ZSwgZmFjZV9pbmRleCwgJmZhY2UpOworICBpZiAocmV0KQorICAgIHJldHVybiBudWxscHRyOworCisgIHJldCA9IEZYRlRfU2V0X1BpeGVsX1NpemVzKGZhY2UsIDY0LCA2NCk7CisgIGlmIChyZXQpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgYXV0byBwRm9udERlc2MgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1RURm9udERlc2M+KHBEYXRhLCBmYWNlKTsKKyAgQ1RURm9udERlc2MqIHBSZXN1bHQgPSBwRm9udERlc2MuZ2V0KCk7CisgIG1fRmFjZU1hcFtLZXlOYW1lRnJvbUZhY2UoZmFjZV9uYW1lLCB3ZWlnaHQsIGJJdGFsaWMpXSA9IHN0ZDo6bW92ZShwRm9udERlc2MpOworICByZXR1cm4gcFJlc3VsdC0+U2luZ2xlRmFjZSgpOworfQorCitGWEZUX0ZhY2UgQ0ZYX0ZvbnRNZ3I6OkdldENhY2hlZFRUQ0ZhY2UoaW50IHR0Y19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoZWNrc3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb250X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogcEZvbnREYXRhKSB7CisgIGF1dG8gaXQgPSBtX0ZhY2VNYXAuZmluZChLZXlOYW1lRnJvbVNpemUodHRjX3NpemUsIGNoZWNrc3VtKSk7CisgIGlmIChpdCA9PSBtX0ZhY2VNYXAuZW5kKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQ1RURm9udERlc2MqIHBGb250RGVzYyA9IGl0LT5zZWNvbmQuZ2V0KCk7CisgICpwRm9udERhdGEgPSBwRm9udERlc2MtPkZvbnREYXRhKCk7CisgIGludCBmYWNlX2luZGV4ID0gR2V0VFRDSW5kZXgocEZvbnREZXNjLT5Gb250RGF0YSgpLCB0dGNfc2l6ZSwgZm9udF9vZmZzZXQpOworICBpZiAoIXBGb250RGVzYy0+VFRDRmFjZShmYWNlX2luZGV4KSkgeworICAgIHBGb250RGVzYy0+U2V0VFRDRmFjZSgKKyAgICAgICAgZmFjZV9pbmRleCwgR2V0Rml4ZWRGYWNlKHBGb250RGVzYy0+Rm9udERhdGEoKSwgdHRjX3NpemUsIGZhY2VfaW5kZXgpKTsKKyAgfQorICBwRm9udERlc2MtPkFkZFJlZigpOworICByZXR1cm4gcEZvbnREZXNjLT5UVENGYWNlKGZhY2VfaW5kZXgpOworfQorCitGWEZUX0ZhY2UgQ0ZYX0ZvbnRNZ3I6OkFkZENhY2hlZFRUQ0ZhY2UoaW50IHR0Y19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoZWNrc3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbnRfb2Zmc2V0KSB7CisgIGludCBmYWNlX2luZGV4ID0gR2V0VFRDSW5kZXgocERhdGEsIHR0Y19zaXplLCBmb250X29mZnNldCk7CisgIEZYRlRfRmFjZSBmYWNlID0gR2V0Rml4ZWRGYWNlKHBEYXRhLCB0dGNfc2l6ZSwgZmFjZV9pbmRleCk7CisgIGF1dG8gcEZvbnREZXNjID0gcGRmaXVtOjpNYWtlVW5pcXVlPENUVEZvbnREZXNjPihwRGF0YSwgZmFjZV9pbmRleCwgZmFjZSk7CisgIG1fRmFjZU1hcFtLZXlOYW1lRnJvbVNpemUodHRjX3NpemUsIGNoZWNrc3VtKV0gPSBzdGQ6Om1vdmUocEZvbnREZXNjKTsKKyAgcmV0dXJuIGZhY2U7Cit9CisKK0ZYRlRfRmFjZSBDRlhfRm9udE1ncjo6R2V0Rml4ZWRGYWNlKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmYWNlX2luZGV4KSB7CisgIEluaXRGVExpYnJhcnkoKTsKKyAgRlhGVF9GYWNlIGZhY2UgPSBudWxscHRyOworICBpZiAoRlhGVF9OZXdfTWVtb3J5X0ZhY2UobV9GVExpYnJhcnksIHBEYXRhLCBzaXplLCBmYWNlX2luZGV4LCAmZmFjZSkpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBGWEZUX1NldF9QaXhlbF9TaXplcyhmYWNlLCA2NCwgNjQpID8gbnVsbHB0ciA6IGZhY2U7Cit9CisKK0ZYRlRfRmFjZSBDRlhfRm9udE1ncjo6R2V0RmlsZUZhY2UoY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBmYWNlX2luZGV4KSB7CisgIEluaXRGVExpYnJhcnkoKTsKKyAgRlhGVF9GYWNlIGZhY2UgPSBudWxscHRyOworICBpZiAoRlhGVF9OZXdfRmFjZShtX0ZUTGlicmFyeSwgZmlsZW5hbWUsIGZhY2VfaW5kZXgsICZmYWNlKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIEZYRlRfU2V0X1BpeGVsX1NpemVzKGZhY2UsIDY0LCA2NCkgPyBudWxscHRyIDogZmFjZTsKK30KKwordm9pZCBDRlhfRm9udE1ncjo6UmVsZWFzZUZhY2UoRlhGVF9GYWNlIGZhY2UpIHsKKyAgaWYgKCFmYWNlKQorICAgIHJldHVybjsKKyAgYm9vbCBiTmVlZEZhY2VEb25lID0gdHJ1ZTsKKyAgZm9yIChhdXRvIGl0ID0gbV9GYWNlTWFwLmJlZ2luKCk7IGl0ICE9IG1fRmFjZU1hcC5lbmQoKTsgKytpdCkgeworICAgIENUVEZvbnREZXNjOjpSZWxlYXNlU3RhdHVzIG5SZXQgPSBpdC0+c2Vjb25kLT5SZWxlYXNlRmFjZShmYWNlKTsKKyAgICBpZiAoblJldCA9PSBDVFRGb250RGVzYzo6a05vdEFwcHJvcHJpYXRlKQorICAgICAgY29udGludWU7CisgICAgYk5lZWRGYWNlRG9uZSA9IGZhbHNlOworICAgIGlmIChuUmV0ID09IENUVEZvbnREZXNjOjprUmVsZWFzZWQpCisgICAgICBtX0ZhY2VNYXAuZXJhc2UoaXQpOworICAgIGJyZWFrOworICB9CisgIGlmIChiTmVlZEZhY2VEb25lICYmICFtX3BCdWlsdGluTWFwcGVyLT5Jc0J1aWx0aW5GYWNlKGZhY2UpKQorICAgIEZYRlRfRG9uZV9GYWNlKGZhY2UpOworfQorCitib29sIENGWF9Gb250TWdyOjpHZXRCdWlsdGluRm9udChzaXplX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiogcEZvbnREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHNpemUpIHsKKyAgaWYgKGluZGV4IDwgRlhfQXJyYXlTaXplKGdfRm94aXRGb250cykpIHsKKyAgICAqcEZvbnREYXRhID0gZ19Gb3hpdEZvbnRzW2luZGV4XS5tX3BGb250RGF0YTsKKyAgICAqc2l6ZSA9IGdfRm94aXRGb250c1tpbmRleF0ubV9kd1NpemU7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgc2l6ZV90IG1tX2luZGV4ID0gaW5kZXggLSBGWF9BcnJheVNpemUoZ19Gb3hpdEZvbnRzKTsKKyAgaWYgKG1tX2luZGV4IDwgRlhfQXJyYXlTaXplKGdfTU1Gb250cykpIHsKKyAgICAqcEZvbnREYXRhID0gZ19NTUZvbnRzW21tX2luZGV4XS5tX3BGb250RGF0YTsKKyAgICAqc2l6ZSA9IGdfTU1Gb250c1ttbV9pbmRleF0ubV9kd1NpemU7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENGWF9Gb250TWdyOjpGcmVlVHlwZVZlcnNpb25TdXBwb3J0c0hpbnRpbmcoKSBjb25zdCB7CisgIEZUX0ludCBtYWpvcjsKKyAgRlRfSW50IG1pbm9yOworICBGVF9JbnQgcGF0Y2g7CisgIEZYRlRfTGlicmFyeV9WZXJzaW9uKG1fRlRMaWJyYXJ5LCAmbWFqb3IsICZtaW5vciwgJnBhdGNoKTsKKyAgLy8gRnJlZXR5cGUgdmVyc2lvbnMgPj0gMi44LjEgc3VwcG9ydCBoaW50aW5nIGV2ZW4gaWYgc3VicGl4ZWwgcmVuZGVyaW5nIGlzCisgIC8vIGRpc2FibGVkLiBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9mcmVldHlwZS9maWxlcy9mcmVldHlwZTIvMi44LjEvCisgIHJldHVybiBtYWpvciA+IDIgfHwgKG1ham9yID09IDIgJiYgbWlub3IgPiA4KSB8fAorICAgICAgICAgKG1ham9yID09IDIgJiYgbWlub3IgPT0gOCAmJiBwYXRjaCA+PSAxKTsKK30KKworYm9vbCBDRlhfRm9udE1ncjo6U2V0TGNkRmlsdGVyTW9kZSgpIGNvbnN0IHsKKyAgcmV0dXJuIEZYRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXIobV9GVExpYnJhcnksIEZUX0xDRF9GSUxURVJfREVGQVVMVCkgIT0KKyAgICAgICAgIEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmU7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvY2Z4X2ZvbnRtZ3IuaCBiL2NvcmUvZnhnZS9jZnhfZm9udG1nci5oCmluZGV4IDQzMmYzNGIuLmU1M2E0Y2EgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhnZS9jZnhfZm9udG1nci5oCisrKyBiL2NvcmUvZnhnZS9jZnhfZm9udG1nci5oCkBAIC0xMiwxMCArMTIsMTAgQEAKIAogI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mb250LmgiCiAKLWNsYXNzIElGWF9TeXN0ZW1Gb250SW5mbzsKIGNsYXNzIENGWF9Gb250TWFwcGVyOwogY2xhc3MgQ0ZYX1N1YnN0Rm9udDsKIGNsYXNzIENUVEZvbnREZXNjOworY2xhc3MgSUZYX1N5c3RlbUZvbnRJbmZvOwogCiBjbGFzcyBDRlhfRm9udE1nciB7CiAgcHVibGljOgpAQCAtMjQsMTEgKzI0LDExIEBACiAKICAgdm9pZCBJbml0RlRMaWJyYXJ5KCk7CiAKLSAgRlhGVF9GYWNlIEdldENhY2hlZEZhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwKKyAgRlhGVF9GYWNlIEdldENhY2hlZEZhY2UoY29uc3QgQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJdGFsaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBwRm9udERhdGEpOwotICBGWEZUX0ZhY2UgQWRkQ2FjaGVkRmFjZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogcEZvbnREYXRhKTsKKyAgRlhGVF9GYWNlIEFkZENhY2hlZEZhY2UoY29uc3QgQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJdGFsaWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBEYXRhLApAQCAtMzcsMTcgKzM3LDE3IEBACiAgIEZYRlRfRmFjZSBHZXRDYWNoZWRUVENGYWNlKGludCB0dGNfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hlY2tzdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb250X29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIHBGb250RGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBwRm9udERhdGEpOwogICBGWEZUX0ZhY2UgQWRkQ2FjaGVkVFRDRmFjZShpbnQgdHRjX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoZWNrc3VtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbnRfb2Zmc2V0KTsKLSAgRlhGVF9GYWNlIEdldEZpbGVGYWNlKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLCBpbnQgZmFjZV9pbmRleCk7CisgIEZYRlRfRmFjZSBHZXRGaWxlRmFjZShjb25zdCBjaGFyKiBmaWxlbmFtZSwgaW50IGZhY2VfaW5kZXgpOwogICBGWEZUX0ZhY2UgR2V0Rml4ZWRGYWNlKGNvbnN0IHVpbnQ4X3QqIHBEYXRhLCB1aW50MzJfdCBzaXplLCBpbnQgZmFjZV9pbmRleCk7CiAgIHZvaWQgUmVsZWFzZUZhY2UoRlhGVF9GYWNlIGZhY2UpOwogICB2b2lkIFNldFN5c3RlbUZvbnRJbmZvKHN0ZDo6dW5pcXVlX3B0cjxJRlhfU3lzdGVtRm9udEluZm8+IHBGb250SW5mbyk7Ci0gIEZYRlRfRmFjZSBGaW5kU3Vic3RGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsCisgIEZYRlRfRmFjZSBGaW5kU3Vic3RGb250KGNvbnN0IEJ5dGVTdHJpbmcmIGZhY2VfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVHJ1ZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LApAQCAtNjAsOCArNjAsMTEgQEAKICAgYm9vbCBGVExpYnJhcnlTdXBwb3J0c0hpbnRpbmcoKSBjb25zdCB7IHJldHVybiBtX0ZUTGlicmFyeVN1cHBvcnRzSGludGluZzsgfQogCiAgcHJpdmF0ZToKKyAgYm9vbCBGcmVlVHlwZVZlcnNpb25TdXBwb3J0c0hpbnRpbmcoKSBjb25zdDsKKyAgYm9vbCBTZXRMY2RGaWx0ZXJNb2RlKCkgY29uc3Q7CisKICAgc3RkOjp1bmlxdWVfcHRyPENGWF9Gb250TWFwcGVyPiBtX3BCdWlsdGluTWFwcGVyOwotICBzdGQ6Om1hcDxDRlhfQnl0ZVN0cmluZywgQ1RURm9udERlc2MqPiBtX0ZhY2VNYXA7CisgIHN0ZDo6bWFwPEJ5dGVTdHJpbmcsIHN0ZDo6dW5pcXVlX3B0cjxDVFRGb250RGVzYz4+IG1fRmFjZU1hcDsKICAgRlhGVF9MaWJyYXJ5IG1fRlRMaWJyYXJ5OwogICBib29sIG1fRlRMaWJyYXJ5U3VwcG9ydHNIaW50aW5nOwogfTsKZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9jZnhfZnhnZWRldmljZS5oIGIvY29yZS9meGdlL2NmeF9meGdlZGV2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNThlNDMuLjAwMDAwMDAKLS0tIGEvY29yZS9meGdlL2NmeF9meGdlZGV2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgQ09SRV9GWEdFX0NGWF9GWEdFREVWSUNFX0hfCi0jZGVmaW5lIENPUkVfRlhHRV9DRlhfRlhHRURFVklDRV9IXwotCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCi0KLWNsYXNzIFNrUGljdHVyZVJlY29yZGVyOwotCi1jbGFzcyBDRlhfRnhnZURldmljZSA6IHB1YmxpYyBDRlhfUmVuZGVyRGV2aWNlIHsKLSBwdWJsaWM6Ci0gIENGWF9GeGdlRGV2aWNlKCk7Ci0gIH5DRlhfRnhnZURldmljZSgpIG92ZXJyaWRlOwotCi0gIGJvb2wgQXR0YWNoKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKLSAgICAgICAgICAgICAgYm9vbCBiUmdiQnl0ZU9yZGVyLAotICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsCi0gICAgICAgICAgICAgIGJvb2wgYkdyb3VwS25vY2tvdXQpOwotICBib29sIENyZWF0ZShpbnQgd2lkdGgsCi0gICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE9yaURldmljZSk7Ci0KLSNpZmRlZiBfU0tJQV9TVVBQT1JUXwotICBib29sIEF0dGFjaFJlY29yZGVyKFNrUGljdHVyZVJlY29yZGVyKiByZWNvcmRlcik7Ci0gIHZvaWQgQ2xlYXIodWludDMyX3QgY29sb3IpOwotICBTa1BpY3R1cmVSZWNvcmRlciogQ3JlYXRlUmVjb3JkZXIoaW50IHNpemVfeCwgaW50IHNpemVfeSk7Ci0gIHZvaWQgRGVidWdWZXJpZnlCaXRtYXBJc1ByZU11bHRpcGxpZWQoKSBjb25zdCBvdmVycmlkZTsKLSAgYm9vbCBTZXRCaXRzV2l0aE1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgb3ZlcnJpZGU7Ci0jZW5kaWYKLQotIHByaXZhdGU6Ci0gIGJvb2wgbV9iT3duZWRCaXRtYXA7Ci19OwotCi0jZW5kaWYgIC8vIENPUkVfRlhHRV9DRlhfRlhHRURFVklDRV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2NmeF9nZW1vZHVsZS5jcHAgYi9jb3JlL2Z4Z2UvY2Z4X2dlbW9kdWxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmM2NmMzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGdlL2NmeF9nZW1vZHVsZS5jcHAKQEAgLTAsMCArMSw1MyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9nZW1vZHVsZS5oIgorCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mb2xkZXJmb250aW5mby5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZm9udGNhY2hlLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mb250bWdyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitDRlhfR0VNb2R1bGUqIGdfcEdFTW9kdWxlID0gbnVsbHB0cjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NGWF9HRU1vZHVsZTo6Q0ZYX0dFTW9kdWxlKCkKKyAgICA6IG1fcEZvbnRNZ3IocGRmaXVtOjpNYWtlVW5pcXVlPENGWF9Gb250TWdyPigpKSwKKyAgICAgIG1fcFBsYXRmb3JtRGF0YShudWxscHRyKSwKKyAgICAgIG1fcFVzZXJGb250UGF0aHMobnVsbHB0cikge30KKworQ0ZYX0dFTW9kdWxlOjp+Q0ZYX0dFTW9kdWxlKCkgeworICBEZXN0cm95UGxhdGZvcm0oKTsKK30KKworLy8gc3RhdGljCitDRlhfR0VNb2R1bGUqIENGWF9HRU1vZHVsZTo6R2V0KCkgeworICBpZiAoIWdfcEdFTW9kdWxlKQorICAgIGdfcEdFTW9kdWxlID0gbmV3IENGWF9HRU1vZHVsZSgpOworICByZXR1cm4gZ19wR0VNb2R1bGU7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhfR0VNb2R1bGU6OkRlc3Ryb3koKSB7CisgIEFTU0VSVChnX3BHRU1vZHVsZSk7CisgIGRlbGV0ZSBnX3BHRU1vZHVsZTsKKyAgZ19wR0VNb2R1bGUgPSBudWxscHRyOworfQorCit2b2lkIENGWF9HRU1vZHVsZTo6SW5pdChjb25zdCBjaGFyKiogdXNlckZvbnRQYXRocykgeworICBBU1NFUlQoZ19wR0VNb2R1bGUpOworICBtX3BVc2VyRm9udFBhdGhzID0gdXNlckZvbnRQYXRoczsKKyAgSW5pdFBsYXRmb3JtKCk7Cit9CisKK0NGWF9Gb250Q2FjaGUqIENGWF9HRU1vZHVsZTo6R2V0Rm9udENhY2hlKCkgeworICBpZiAoIW1fcEZvbnRDYWNoZSkKKyAgICBtX3BGb250Q2FjaGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0ZvbnRDYWNoZT4oKTsKKyAgcmV0dXJuIG1fcEZvbnRDYWNoZS5nZXQoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9jZnhfZ2Vtb2R1bGUuaCBiL2NvcmUvZnhnZS9jZnhfZ2Vtb2R1bGUuaAppbmRleCBjNWJkODQxLi5mNDhkMDY1IDEwMDY0NAotLS0gYS9jb3JlL2Z4Z2UvY2Z4X2dlbW9kdWxlLmgKKysrIGIvY29yZS9meGdlL2NmeF9nZW1vZHVsZS5oCkBAIC05LDEwICs5LDYgQEAKIAogI2luY2x1ZGUgPG1lbW9yeT4KIAotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZm9udG1nci5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mb250LmgiCi0KLWNsYXNzIENDb2RlY19Nb2R1bGVNZ3I7CiBjbGFzcyBDRlhfRm9udENhY2hlOwogY2xhc3MgQ0ZYX0ZvbnRNZ3I7CiAKQEAgLTIxLDE3ICsxNywxMiBAQAogICBzdGF0aWMgQ0ZYX0dFTW9kdWxlKiBHZXQoKTsKICAgc3RhdGljIHZvaWQgRGVzdHJveSgpOwogCi0gIHZvaWQgSW5pdChjb25zdCBjaGFyKiogcFVzZXJGb250UGF0aHMsIENDb2RlY19Nb2R1bGVNZ3IqIHBDb2RlY01vZHVsZSk7CisgIHZvaWQgSW5pdChjb25zdCBjaGFyKiogcFVzZXJGb250UGF0aHMpOwogICBDRlhfRm9udENhY2hlKiBHZXRGb250Q2FjaGUoKTsKICAgQ0ZYX0ZvbnRNZ3IqIEdldEZvbnRNZ3IoKSB7IHJldHVybiBtX3BGb250TWdyLmdldCgpOyB9Ci0gIHZvaWQgU2V0VGV4dEdhbW1hKEZYX0ZMT0FUIGdhbW1hVmFsdWUpOwotICBjb25zdCB1aW50OF90KiBHZXRUZXh0R2FtbWFUYWJsZSgpIGNvbnN0OwogCi0gIENDb2RlY19Nb2R1bGVNZ3IqIEdldENvZGVjTW9kdWxlKCkgeyByZXR1cm4gbV9wQ29kZWNNb2R1bGU7IH0KICAgdm9pZCogR2V0UGxhdGZvcm1EYXRhKCkgeyByZXR1cm4gbV9wUGxhdGZvcm1EYXRhOyB9CiAKLSAgRlhGVF9MaWJyYXJ5IG1fRlRMaWJyYXJ5OwotCiAgcHJpdmF0ZToKICAgQ0ZYX0dFTW9kdWxlKCk7CiAgIH5DRlhfR0VNb2R1bGUoKTsKQEAgLTM5LDEwICszMCw4IEBACiAgIHZvaWQgSW5pdFBsYXRmb3JtKCk7CiAgIHZvaWQgRGVzdHJveVBsYXRmb3JtKCk7CiAKLSAgdWludDhfdCBtX0dhbW1hVmFsdWVbMjU2XTsKLSAgQ0ZYX0ZvbnRDYWNoZSogbV9wRm9udENhY2hlOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0ZvbnRDYWNoZT4gbV9wRm9udENhY2hlOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0ZvbnRNZ3I+IG1fcEZvbnRNZ3I7Ci0gIENDb2RlY19Nb2R1bGVNZ3IqIG1fcENvZGVjTW9kdWxlOwogICB2b2lkKiBtX3BQbGF0Zm9ybURhdGE7CiAgIGNvbnN0IGNoYXIqKiBtX3BVc2VyRm9udFBhdGhzOwogfTsKZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9jZnhfZ3JhcGhzdGF0ZS5jcHAgYi9jb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNmI1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGUuY3BwCkBAIC0wLDAgKzEsNjEgQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZ3JhcGhzdGF0ZS5oIgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCisKK0NGWF9HcmFwaFN0YXRlOjpDRlhfR3JhcGhTdGF0ZSgpIHt9CisKK0NGWF9HcmFwaFN0YXRlOjpDRlhfR3JhcGhTdGF0ZShjb25zdCBDRlhfR3JhcGhTdGF0ZSYgdGhhdCkKKyAgICA6IG1fUmVmKHRoYXQubV9SZWYpIHt9CisKK0NGWF9HcmFwaFN0YXRlOjp+Q0ZYX0dyYXBoU3RhdGUoKSB7fQorCit2b2lkIENGWF9HcmFwaFN0YXRlOjpFbXBsYWNlKCkgeworICBtX1JlZi5FbXBsYWNlKCk7Cit9CisKK3ZvaWQgQ0ZYX0dyYXBoU3RhdGU6OlNldExpbmVEYXNoKENQREZfQXJyYXkqIHBBcnJheSwgZmxvYXQgcGhhc2UsIGZsb2F0IHNjYWxlKSB7CisgIENGWF9HcmFwaFN0YXRlRGF0YSogcERhdGEgPSBtX1JlZi5HZXRQcml2YXRlQ29weSgpOworICBwRGF0YS0+bV9EYXNoUGhhc2UgPSBwaGFzZSAqIHNjYWxlOworICBwRGF0YS0+U2V0RGFzaENvdW50KHN0YXRpY19jYXN0PGludD4ocEFycmF5LT5HZXRDb3VudCgpKSk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpKyspCisgICAgcERhdGEtPm1fRGFzaEFycmF5W2ldID0gcEFycmF5LT5HZXROdW1iZXJBdChpKSAqIHNjYWxlOworfQorCitmbG9hdCBDRlhfR3JhcGhTdGF0ZTo6R2V0TGluZVdpZHRoKCkgY29uc3QgeworICByZXR1cm4gbV9SZWYuR2V0T2JqZWN0KCkgPyBtX1JlZi5HZXRPYmplY3QoKS0+bV9MaW5lV2lkdGggOiAxLmY7Cit9CisKK3ZvaWQgQ0ZYX0dyYXBoU3RhdGU6OlNldExpbmVXaWR0aChmbG9hdCB3aWR0aCkgeworICBtX1JlZi5HZXRQcml2YXRlQ29weSgpLT5tX0xpbmVXaWR0aCA9IHdpZHRoOworfQorCitDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXAgQ0ZYX0dyYXBoU3RhdGU6OkdldExpbmVDYXAoKSBjb25zdCB7CisgIHJldHVybiBtX1JlZi5HZXRPYmplY3QoKSA/IG1fUmVmLkdldE9iamVjdCgpLT5tX0xpbmVDYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwQnV0dDsKK30KK3ZvaWQgQ0ZYX0dyYXBoU3RhdGU6OlNldExpbmVDYXAoQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwIGNhcCkgeworICBtX1JlZi5HZXRQcml2YXRlQ29weSgpLT5tX0xpbmVDYXAgPSBjYXA7Cit9CisKK0NGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW4gQ0ZYX0dyYXBoU3RhdGU6OkdldExpbmVKb2luKCkgY29uc3QgeworICByZXR1cm4gbV9SZWYuR2V0T2JqZWN0KCkgPyBtX1JlZi5HZXRPYmplY3QoKS0+bV9MaW5lSm9pbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luTWl0ZXI7Cit9CisKK3ZvaWQgQ0ZYX0dyYXBoU3RhdGU6OlNldExpbmVKb2luKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW4gam9pbikgeworICBtX1JlZi5HZXRQcml2YXRlQ29weSgpLT5tX0xpbmVKb2luID0gam9pbjsKK30KKworZmxvYXQgQ0ZYX0dyYXBoU3RhdGU6OkdldE1pdGVyTGltaXQoKSBjb25zdCB7CisgIHJldHVybiBtX1JlZi5HZXRPYmplY3QoKSA/IG1fUmVmLkdldE9iamVjdCgpLT5tX01pdGVyTGltaXQgOiAxMC5mOworfQorCit2b2lkIENGWF9HcmFwaFN0YXRlOjpTZXRNaXRlckxpbWl0KGZsb2F0IGxpbWl0KSB7CisgIG1fUmVmLkdldFByaXZhdGVDb3B5KCktPm1fTWl0ZXJMaW1pdCA9IGxpbWl0OworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2NmeF9ncmFwaHN0YXRlLmggYi9jb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGUuaAppbmRleCBhODM4ZGZjLi5iZjRmY2NkIDEwMDY0NAotLS0gYS9jb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGUuaAorKysgYi9jb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGUuaApAQCAtNyw3ICs3LDcgQEAKICNpZm5kZWYgQ09SRV9GWEdFX0NGWF9HUkFQSFNUQVRFX0hfCiAjZGVmaW5lIENPUkVfRlhHRV9DRlhfR1JBUEhTVEFURV9IXwogCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfc2hhcmVkX2NvcHlfb25fd3JpdGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3NoYXJlZF9jb3B5X29uX3dyaXRlLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9ncmFwaHN0YXRlZGF0YS5oIgogCiBjbGFzcyBDUERGX0FycmF5OwpAQCAtMjAsMTAgKzIwLDEwIEBACiAKICAgdm9pZCBFbXBsYWNlKCk7CiAKLSAgdm9pZCBTZXRMaW5lRGFzaChDUERGX0FycmF5KiBwQXJyYXksIEZYX0ZMT0FUIHBoYXNlLCBGWF9GTE9BVCBzY2FsZSk7CisgIHZvaWQgU2V0TGluZURhc2goQ1BERl9BcnJheSogcEFycmF5LCBmbG9hdCBwaGFzZSwgZmxvYXQgc2NhbGUpOwogCi0gIEZYX0ZMT0FUIEdldExpbmVXaWR0aCgpIGNvbnN0OwotICB2b2lkIFNldExpbmVXaWR0aChGWF9GTE9BVCB3aWR0aCk7CisgIGZsb2F0IEdldExpbmVXaWR0aCgpIGNvbnN0OworICB2b2lkIFNldExpbmVXaWR0aChmbG9hdCB3aWR0aCk7CiAKICAgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwIEdldExpbmVDYXAoKSBjb25zdDsKICAgdm9pZCBTZXRMaW5lQ2FwKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcCBjYXApOwpAQCAtMzEsMTQgKzMxLDE0IEBACiAgIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW4gR2V0TGluZUpvaW4oKSBjb25zdDsKICAgdm9pZCBTZXRMaW5lSm9pbihDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luIGpvaW4pOwogCi0gIEZYX0ZMT0FUIEdldE1pdGVyTGltaXQoKSBjb25zdDsKLSAgdm9pZCBTZXRNaXRlckxpbWl0KEZYX0ZMT0FUIGxpbWl0KTsKKyAgZmxvYXQgR2V0TWl0ZXJMaW1pdCgpIGNvbnN0OworICB2b2lkIFNldE1pdGVyTGltaXQoZmxvYXQgbGltaXQpOwogCiAgIC8vIEZJWE1FKHRzZXBleik6IHJlbW92ZSB3aGVuIGFsbCBHcmFwaFN0YXRlRGF0YSB1c2FnZSBnb25lLgogICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIEdldE9iamVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fUmVmLkdldE9iamVjdCgpOyB9CiAKICBwcml2YXRlOgotICBDRlhfU2hhcmVkQ29weU9uV3JpdGU8Q0ZYX0dyYXBoU3RhdGVEYXRhPiBtX1JlZjsKKyAgU2hhcmVkQ29weU9uV3JpdGU8Q0ZYX0dyYXBoU3RhdGVEYXRhPiBtX1JlZjsKIH07CiAKICNlbmRpZiAgLy8gQ09SRV9GWEdFX0NGWF9HUkFQSFNUQVRFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGVkYXRhLmNwcCBiL2NvcmUvZnhnZS9jZnhfZ3JhcGhzdGF0ZWRhdGEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZmVkZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGVkYXRhLmNwcApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGVkYXRhLmgiCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisKK0NGWF9HcmFwaFN0YXRlRGF0YTo6Q0ZYX0dyYXBoU3RhdGVEYXRhKCkKKyAgICA6IG1fTGluZUNhcChMaW5lQ2FwQnV0dCksCisgICAgICBtX0Rhc2hDb3VudCgwKSwKKyAgICAgIG1fRGFzaEFycmF5KG51bGxwdHIpLAorICAgICAgbV9EYXNoUGhhc2UoMCksCisgICAgICBtX0xpbmVKb2luKExpbmVKb2luTWl0ZXIpLAorICAgICAgbV9NaXRlckxpbWl0KDEwICogMS4wZiksCisgICAgICBtX0xpbmVXaWR0aCgxLjBmKSB7fQorCitDRlhfR3JhcGhTdGF0ZURhdGE6OkNGWF9HcmFwaFN0YXRlRGF0YShjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEmIHNyYykgeworICBtX0Rhc2hBcnJheSA9IG51bGxwdHI7CisgIENvcHkoc3JjKTsKK30KKwordm9pZCBDRlhfR3JhcGhTdGF0ZURhdGE6OkNvcHkoY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhJiBzcmMpIHsKKyAgbV9MaW5lQ2FwID0gc3JjLm1fTGluZUNhcDsKKyAgbV9EYXNoQ291bnQgPSBzcmMubV9EYXNoQ291bnQ7CisgIEZYX0ZyZWUobV9EYXNoQXJyYXkpOworICBtX0Rhc2hBcnJheSA9IG51bGxwdHI7CisgIG1fRGFzaFBoYXNlID0gc3JjLm1fRGFzaFBoYXNlOworICBtX0xpbmVKb2luID0gc3JjLm1fTGluZUpvaW47CisgIG1fTWl0ZXJMaW1pdCA9IHNyYy5tX01pdGVyTGltaXQ7CisgIG1fTGluZVdpZHRoID0gc3JjLm1fTGluZVdpZHRoOworICBpZiAobV9EYXNoQ291bnQpIHsKKyAgICBtX0Rhc2hBcnJheSA9IEZYX0FsbG9jKGZsb2F0LCBtX0Rhc2hDb3VudCk7CisgICAgbWVtY3B5KG1fRGFzaEFycmF5LCBzcmMubV9EYXNoQXJyYXksIG1fRGFzaENvdW50ICogc2l6ZW9mKGZsb2F0KSk7CisgIH0KK30KKworQ0ZYX0dyYXBoU3RhdGVEYXRhOjp+Q0ZYX0dyYXBoU3RhdGVEYXRhKCkgeworICBGWF9GcmVlKG1fRGFzaEFycmF5KTsKK30KKwordm9pZCBDRlhfR3JhcGhTdGF0ZURhdGE6OlNldERhc2hDb3VudChpbnQgY291bnQpIHsKKyAgRlhfRnJlZShtX0Rhc2hBcnJheSk7CisgIG1fRGFzaEFycmF5ID0gbnVsbHB0cjsKKyAgbV9EYXNoQ291bnQgPSBjb3VudDsKKyAgaWYgKGNvdW50ID09IDApCisgICAgcmV0dXJuOworICBtX0Rhc2hBcnJheSA9IEZYX0FsbG9jKGZsb2F0LCBjb3VudCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGVkYXRhLmggYi9jb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGVkYXRhLmgKaW5kZXggMDNlNGE4Zi4uMWFmZmY4MyAxMDA2NDQKLS0tIGEvY29yZS9meGdlL2NmeF9ncmFwaHN0YXRlZGF0YS5oCisrKyBiL2NvcmUvZnhnZS9jZnhfZ3JhcGhzdGF0ZWRhdGEuaApAQCAtOCwyMiArOCwyMyBAQAogI2RlZmluZSBDT1JFX0ZYR0VfQ0ZYX0dSQVBIU1RBVEVEQVRBX0hfCiAKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgogCi1jbGFzcyBDRlhfR3JhcGhTdGF0ZURhdGEgeworY2xhc3MgQ0ZYX0dyYXBoU3RhdGVEYXRhIDogcHVibGljIFJldGFpbmFibGUgewogIHB1YmxpYzoKICAgZW51bSBMaW5lQ2FwIHsgTGluZUNhcEJ1dHQgPSAwLCBMaW5lQ2FwUm91bmQgPSAxLCBMaW5lQ2FwU3F1YXJlID0gMiB9OwogCiAgIENGWF9HcmFwaFN0YXRlRGF0YSgpOwogICBDRlhfR3JhcGhTdGF0ZURhdGEoY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhJiBzcmMpOwotICB+Q0ZYX0dyYXBoU3RhdGVEYXRhKCk7CisgIH5DRlhfR3JhcGhTdGF0ZURhdGEoKSBvdmVycmlkZTsKIAogICB2b2lkIENvcHkoY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhJiBzcmMpOwogICB2b2lkIFNldERhc2hDb3VudChpbnQgY291bnQpOwogCiAgIExpbmVDYXAgbV9MaW5lQ2FwOwogICBpbnQgbV9EYXNoQ291bnQ7Ci0gIEZYX0ZMT0FUKiBtX0Rhc2hBcnJheTsKLSAgRlhfRkxPQVQgbV9EYXNoUGhhc2U7CisgIGZsb2F0KiBtX0Rhc2hBcnJheTsKKyAgZmxvYXQgbV9EYXNoUGhhc2U7CiAKICAgZW51bSBMaW5lSm9pbiB7CiAgICAgTGluZUpvaW5NaXRlciA9IDAsCkBAIC0zMSw4ICszMiw4IEBACiAgICAgTGluZUpvaW5CZXZlbCA9IDIsCiAgIH07CiAgIExpbmVKb2luIG1fTGluZUpvaW47Ci0gIEZYX0ZMT0FUIG1fTWl0ZXJMaW1pdDsKLSAgRlhfRkxPQVQgbV9MaW5lV2lkdGg7CisgIGZsb2F0IG1fTWl0ZXJMaW1pdDsKKyAgZmxvYXQgbV9MaW5lV2lkdGg7CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlhHRV9DRlhfR1JBUEhTVEFURURBVEFfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9jZnhfcGF0aGRhdGEuY3BwIGIvY29yZS9meGdlL2NmeF9wYXRoZGF0YS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFjNWNmNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9jZnhfcGF0aGRhdGEuY3BwCkBAIC0wLDAgKzEsNDk0IEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3BhdGhkYXRhLmgiCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9tYXRoLmgiCisKK25hbWVzcGFjZSB7CisKK3ZvaWQgVXBkYXRlTGluZUVuZFBvaW50cyhDRlhfRmxvYXRSZWN0KiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHN0YXJ0X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBlbmRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGh3KSB7CisgIGlmIChzdGFydF9wb3MueCA9PSBlbmRfcG9zLngpIHsKKyAgICBpZiAoc3RhcnRfcG9zLnkgPT0gZW5kX3Bvcy55KSB7CisgICAgICByZWN0LT5VcGRhdGVSZWN0KGVuZF9wb3MgKyBDRlhfUG9pbnRGKGh3LCBodykpOworICAgICAgcmVjdC0+VXBkYXRlUmVjdChlbmRfcG9zIC0gQ0ZYX1BvaW50RihodywgaHcpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmbG9hdCBwb2ludF95OworICAgIGlmIChlbmRfcG9zLnkgPCBzdGFydF9wb3MueSkKKyAgICAgIHBvaW50X3kgPSBlbmRfcG9zLnkgLSBodzsKKyAgICBlbHNlCisgICAgICBwb2ludF95ID0gZW5kX3Bvcy55ICsgaHc7CisKKyAgICByZWN0LT5VcGRhdGVSZWN0KENGWF9Qb2ludEYoZW5kX3Bvcy54ICsgaHcsIHBvaW50X3kpKTsKKyAgICByZWN0LT5VcGRhdGVSZWN0KENGWF9Qb2ludEYoZW5kX3Bvcy54IC0gaHcsIHBvaW50X3kpKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoc3RhcnRfcG9zLnkgPT0gZW5kX3Bvcy55KSB7CisgICAgZmxvYXQgcG9pbnRfeDsKKyAgICBpZiAoZW5kX3Bvcy54IDwgc3RhcnRfcG9zLngpCisgICAgICBwb2ludF94ID0gZW5kX3Bvcy54IC0gaHc7CisgICAgZWxzZQorICAgICAgcG9pbnRfeCA9IGVuZF9wb3MueCArIGh3OworCisgICAgcmVjdC0+VXBkYXRlUmVjdChDRlhfUG9pbnRGKHBvaW50X3gsIGVuZF9wb3MueSArIGh3KSk7CisgICAgcmVjdC0+VXBkYXRlUmVjdChDRlhfUG9pbnRGKHBvaW50X3gsIGVuZF9wb3MueSAtIGh3KSk7CisgICAgcmV0dXJuOworICB9CisKKyAgQ0ZYX1BvaW50RiBkaWZmID0gZW5kX3BvcyAtIHN0YXJ0X3BvczsKKyAgZmxvYXQgbGwgPSBGWFNZU19zcXJ0MihkaWZmLngsIGRpZmYueSk7CisgIGZsb2F0IG14ID0gZW5kX3Bvcy54ICsgaHcgKiBkaWZmLnggLyBsbDsKKyAgZmxvYXQgbXkgPSBlbmRfcG9zLnkgKyBodyAqIGRpZmYueSAvIGxsOworICBmbG9hdCBkeDEgPSBodyAqIGRpZmYueSAvIGxsOworICBmbG9hdCBkeTEgPSBodyAqIGRpZmYueCAvIGxsOworICByZWN0LT5VcGRhdGVSZWN0KENGWF9Qb2ludEYobXggLSBkeDEsIG15ICsgZHkxKSk7CisgIHJlY3QtPlVwZGF0ZVJlY3QoQ0ZYX1BvaW50RihteCArIGR4MSwgbXkgLSBkeTEpKTsKK30KKwordm9pZCBVcGRhdGVMaW5lSm9pblBvaW50cyhDRlhfRmxvYXRSZWN0KiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBzdGFydF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIG1pZF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIGVuZF9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGhhbGZfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1pdGVyX2xpbWl0KSB7CisgIGZsb2F0IHN0YXJ0X2sgPSAwOworICBmbG9hdCBzdGFydF9jID0gMDsKKyAgZmxvYXQgZW5kX2sgPSAwOworICBmbG9hdCBlbmRfYyA9IDA7CisgIGZsb2F0IHN0YXJ0X2xlbiA9IDA7CisgIGZsb2F0IHN0YXJ0X2RjID0gMDsKKyAgZmxvYXQgZW5kX2xlbiA9IDA7CisgIGZsb2F0IGVuZF9kYyA9IDA7CisgIGZsb2F0IG9uZV90d2VudGlldGggPSAxLjBmIC8gMjA7CisKKyAgYm9vbCBiU3RhcnRWZXJ0ID0gZmFicyhzdGFydF9wb3MueCAtIG1pZF9wb3MueCkgPCBvbmVfdHdlbnRpZXRoOworICBib29sIGJFbmRWZXJ0ID0gZmFicyhtaWRfcG9zLnggLSBlbmRfcG9zLngpIDwgb25lX3R3ZW50aWV0aDsKKyAgaWYgKGJTdGFydFZlcnQgJiYgYkVuZFZlcnQpIHsKKyAgICBpbnQgc3RhcnRfZGlyID0gbWlkX3Bvcy55ID4gc3RhcnRfcG9zLnkgPyAxIDogLTE7CisgICAgZmxvYXQgcG9pbnRfeSA9IG1pZF9wb3MueSArIGhhbGZfd2lkdGggKiBzdGFydF9kaXI7CisgICAgcmVjdC0+VXBkYXRlUmVjdChDRlhfUG9pbnRGKG1pZF9wb3MueCArIGhhbGZfd2lkdGgsIHBvaW50X3kpKTsKKyAgICByZWN0LT5VcGRhdGVSZWN0KENGWF9Qb2ludEYobWlkX3Bvcy54IC0gaGFsZl93aWR0aCwgcG9pbnRfeSkpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmICghYlN0YXJ0VmVydCkgeworICAgIENGWF9Qb2ludEYgc3RhcnRfdG9fbWlkID0gc3RhcnRfcG9zIC0gbWlkX3BvczsKKyAgICBzdGFydF9rID0gKG1pZF9wb3MueSAtIHN0YXJ0X3Bvcy55KSAvIChtaWRfcG9zLnggLSBzdGFydF9wb3MueCk7CisgICAgc3RhcnRfYyA9IG1pZF9wb3MueSAtIChzdGFydF9rICogbWlkX3Bvcy54KTsKKyAgICBzdGFydF9sZW4gPSBGWFNZU19zcXJ0MihzdGFydF90b19taWQueCwgc3RhcnRfdG9fbWlkLnkpOworICAgIHN0YXJ0X2RjID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGZhYnMoaGFsZl93aWR0aCAqIHN0YXJ0X2xlbiAvIHN0YXJ0X3RvX21pZC54KSk7CisgIH0KKyAgaWYgKCFiRW5kVmVydCkgeworICAgIENGWF9Qb2ludEYgZW5kX3RvX21pZCA9IGVuZF9wb3MgLSBtaWRfcG9zOworICAgIGVuZF9rID0gZW5kX3RvX21pZC55IC8gZW5kX3RvX21pZC54OworICAgIGVuZF9jID0gbWlkX3Bvcy55IC0gKGVuZF9rICogbWlkX3Bvcy54KTsKKyAgICBlbmRfbGVuID0gRlhTWVNfc3FydDIoZW5kX3RvX21pZC54LCBlbmRfdG9fbWlkLnkpOworICAgIGVuZF9kYyA9IHN0YXRpY19jYXN0PGZsb2F0PihmYWJzKGhhbGZfd2lkdGggKiBlbmRfbGVuIC8gZW5kX3RvX21pZC54KSk7CisgIH0KKyAgaWYgKGJTdGFydFZlcnQpIHsKKyAgICBDRlhfUG9pbnRGIG91dHNpZGUoc3RhcnRfcG9zLngsIDApOworICAgIGlmIChlbmRfcG9zLnggPCBzdGFydF9wb3MueCkKKyAgICAgIG91dHNpZGUueCArPSBoYWxmX3dpZHRoOworICAgIGVsc2UKKyAgICAgIG91dHNpZGUueCAtPSBoYWxmX3dpZHRoOworCisgICAgaWYgKHN0YXJ0X3Bvcy55IDwgKGVuZF9rICogc3RhcnRfcG9zLngpICsgZW5kX2MpCisgICAgICBvdXRzaWRlLnkgPSAoZW5kX2sgKiBvdXRzaWRlLngpICsgZW5kX2MgKyBlbmRfZGM7CisgICAgZWxzZQorICAgICAgb3V0c2lkZS55ID0gKGVuZF9rICogb3V0c2lkZS54KSArIGVuZF9jIC0gZW5kX2RjOworCisgICAgcmVjdC0+VXBkYXRlUmVjdChvdXRzaWRlKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoYkVuZFZlcnQpIHsKKyAgICBDRlhfUG9pbnRGIG91dHNpZGUoZW5kX3Bvcy54LCAwKTsKKyAgICBpZiAoc3RhcnRfcG9zLnggPCBlbmRfcG9zLngpCisgICAgICBvdXRzaWRlLnggKz0gaGFsZl93aWR0aDsKKyAgICBlbHNlCisgICAgICBvdXRzaWRlLnggLT0gaGFsZl93aWR0aDsKKworICAgIGlmIChlbmRfcG9zLnkgPCAoc3RhcnRfayAqIGVuZF9wb3MueCkgKyBzdGFydF9jKQorICAgICAgb3V0c2lkZS55ID0gKHN0YXJ0X2sgKiBvdXRzaWRlLngpICsgc3RhcnRfYyArIHN0YXJ0X2RjOworICAgIGVsc2UKKyAgICAgIG91dHNpZGUueSA9IChzdGFydF9rICogb3V0c2lkZS54KSArIHN0YXJ0X2MgLSBzdGFydF9kYzsKKworICAgIHJlY3QtPlVwZGF0ZVJlY3Qob3V0c2lkZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGZhYnMoc3RhcnRfayAtIGVuZF9rKSA8IG9uZV90d2VudGlldGgpIHsKKyAgICBpbnQgc3RhcnRfZGlyID0gbWlkX3Bvcy54ID4gc3RhcnRfcG9zLnggPyAxIDogLTE7CisgICAgaW50IGVuZF9kaXIgPSBlbmRfcG9zLnggPiBtaWRfcG9zLnggPyAxIDogLTE7CisgICAgaWYgKHN0YXJ0X2RpciA9PSBlbmRfZGlyKQorICAgICAgVXBkYXRlTGluZUVuZFBvaW50cyhyZWN0LCBtaWRfcG9zLCBlbmRfcG9zLCBoYWxmX3dpZHRoKTsKKyAgICBlbHNlCisgICAgICBVcGRhdGVMaW5lRW5kUG9pbnRzKHJlY3QsIHN0YXJ0X3BvcywgbWlkX3BvcywgaGFsZl93aWR0aCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZmxvYXQgc3RhcnRfb3V0c2lkZV9jID0gc3RhcnRfYzsKKyAgaWYgKGVuZF9wb3MueSA8IChzdGFydF9rICogZW5kX3Bvcy54KSArIHN0YXJ0X2MpCisgICAgc3RhcnRfb3V0c2lkZV9jICs9IHN0YXJ0X2RjOworICBlbHNlCisgICAgc3RhcnRfb3V0c2lkZV9jIC09IHN0YXJ0X2RjOworCisgIGZsb2F0IGVuZF9vdXRzaWRlX2MgPSBlbmRfYzsKKyAgaWYgKHN0YXJ0X3Bvcy55IDwgKGVuZF9rICogc3RhcnRfcG9zLngpICsgZW5kX2MpCisgICAgZW5kX291dHNpZGVfYyArPSBlbmRfZGM7CisgIGVsc2UKKyAgICBlbmRfb3V0c2lkZV9jIC09IGVuZF9kYzsKKworICBmbG9hdCBqb2luX3ggPSAoZW5kX291dHNpZGVfYyAtIHN0YXJ0X291dHNpZGVfYykgLyAoc3RhcnRfayAtIGVuZF9rKTsKKyAgZmxvYXQgam9pbl95ID0gc3RhcnRfayAqIGpvaW5feCArIHN0YXJ0X291dHNpZGVfYzsKKyAgcmVjdC0+VXBkYXRlUmVjdChDRlhfUG9pbnRGKGpvaW5feCwgam9pbl95KSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitGWF9QQVRIUE9JTlQ6OkZYX1BBVEhQT0lOVCgpID0gZGVmYXVsdDsKKworRlhfUEFUSFBPSU5UOjpGWF9QQVRIUE9JTlQoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIEZYUFRfVFlQRSB0eXBlLCBib29sIGNsb3NlKQorICAgIDogbV9Qb2ludChwb2ludCksIG1fVHlwZSh0eXBlKSwgbV9DbG9zZUZpZ3VyZShjbG9zZSkge30KKworRlhfUEFUSFBPSU5UOjpGWF9QQVRIUE9JTlQoY29uc3QgRlhfUEFUSFBPSU5UJiBvdGhlcikgPSBkZWZhdWx0OworCitGWF9QQVRIUE9JTlQ6On5GWF9QQVRIUE9JTlQoKSA9IGRlZmF1bHQ7CisKK0NGWF9QYXRoRGF0YTo6Q0ZYX1BhdGhEYXRhKCkge30KKworQ0ZYX1BhdGhEYXRhOjp+Q0ZYX1BhdGhEYXRhKCkge30KKworQ0ZYX1BhdGhEYXRhOjpDRlhfUGF0aERhdGEoY29uc3QgQ0ZYX1BhdGhEYXRhJiBzcmMpIDogbV9Qb2ludHMoc3JjLm1fUG9pbnRzKSB7fQorCit2b2lkIENGWF9QYXRoRGF0YTo6Q2xlYXIoKSB7CisgIG1fUG9pbnRzLmNsZWFyKCk7Cit9CisKK3ZvaWQgQ0ZYX1BhdGhEYXRhOjpDbG9zZVBhdGgoKSB7CisgIGlmIChtX1BvaW50cy5lbXB0eSgpKQorICAgIHJldHVybjsKKyAgbV9Qb2ludHMuYmFjaygpLm1fQ2xvc2VGaWd1cmUgPSB0cnVlOworfQorCit2b2lkIENGWF9QYXRoRGF0YTo6QXBwZW5kKGNvbnN0IENGWF9QYXRoRGF0YSogcFNyYywgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgeworICBpZiAocFNyYy0+bV9Qb2ludHMuZW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgc2l6ZV90IGN1cl9zaXplID0gbV9Qb2ludHMuc2l6ZSgpOworICBtX1BvaW50cy5pbnNlcnQobV9Qb2ludHMuZW5kKCksIHBTcmMtPm1fUG9pbnRzLmJlZ2luKCksIHBTcmMtPm1fUG9pbnRzLmVuZCgpKTsKKworICBpZiAoIXBNYXRyaXgpCisgICAgcmV0dXJuOworCisgIGZvciAoc2l6ZV90IGkgPSBjdXJfc2l6ZTsgaSA8IG1fUG9pbnRzLnNpemUoKTsgaSsrKQorICAgIG1fUG9pbnRzW2ldLm1fUG9pbnQgPSBwTWF0cml4LT5UcmFuc2Zvcm0obV9Qb2ludHNbaV0ubV9Qb2ludCk7Cit9CisKK3ZvaWQgQ0ZYX1BhdGhEYXRhOjpBcHBlbmRQb2ludChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFBUX1RZUEUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNsb3NlRmlndXJlKSB7CisgIG1fUG9pbnRzLnB1c2hfYmFjayhGWF9QQVRIUE9JTlQocG9pbnQsIHR5cGUsIGNsb3NlRmlndXJlKSk7Cit9CisKK3ZvaWQgQ0ZYX1BhdGhEYXRhOjpBcHBlbmRMaW5lKGNvbnN0IENGWF9Qb2ludEYmIHB0MSwgY29uc3QgQ0ZYX1BvaW50RiYgcHQyKSB7CisgIGlmIChtX1BvaW50cy5lbXB0eSgpIHx8IGZhYnMobV9Qb2ludHMuYmFjaygpLm1fUG9pbnQueCAtIHB0MS54KSA+IDAuMDAxIHx8CisgICAgICBmYWJzKG1fUG9pbnRzLmJhY2soKS5tX1BvaW50LnkgLSBwdDEueSkgPiAwLjAwMSkgeworICAgIEFwcGVuZFBvaW50KHB0MSwgRlhQVF9UWVBFOjpNb3ZlVG8sIGZhbHNlKTsKKyAgfQorICBBcHBlbmRQb2ludChwdDIsIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7Cit9CisKK3ZvaWQgQ0ZYX1BhdGhEYXRhOjpBcHBlbmRSZWN0KGZsb2F0IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRvcCkgeworICBDRlhfUG9pbnRGIGxlZnRfYm90dG9tKGxlZnQsIGJvdHRvbSk7CisgIENGWF9Qb2ludEYgbGVmdF90b3AobGVmdCwgdG9wKTsKKyAgQ0ZYX1BvaW50RiByaWdodF90b3AocmlnaHQsIHRvcCk7CisgIENGWF9Qb2ludEYgcmlnaHRfYm90dG9tKHJpZ2h0LCBib3R0b20pOworCisgIEFwcGVuZExpbmUobGVmdF9ib3R0b20sIGxlZnRfdG9wKTsKKyAgQXBwZW5kTGluZShsZWZ0X3RvcCwgcmlnaHRfdG9wKTsKKyAgQXBwZW5kTGluZShyaWdodF90b3AsIHJpZ2h0X2JvdHRvbSk7CisgIEFwcGVuZExpbmUocmlnaHRfYm90dG9tLCBsZWZ0X2JvdHRvbSk7CisgIENsb3NlUGF0aCgpOworfQorCitDRlhfRmxvYXRSZWN0IENGWF9QYXRoRGF0YTo6R2V0Qm91bmRpbmdCb3goKSBjb25zdCB7CisgIGlmIChtX1BvaW50cy5lbXB0eSgpKQorICAgIHJldHVybiBDRlhfRmxvYXRSZWN0KCk7CisKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0OworICByZWN0LkluaXRSZWN0KG1fUG9pbnRzWzBdLm1fUG9pbnQpOworICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG1fUG9pbnRzLnNpemUoKTsgaSsrKQorICAgIHJlY3QuVXBkYXRlUmVjdChtX1BvaW50c1tpXS5tX1BvaW50KTsKKyAgcmV0dXJuIHJlY3Q7Cit9CisKK0NGWF9GbG9hdFJlY3QgQ0ZYX1BhdGhEYXRhOjpHZXRCb3VuZGluZ0JveChmbG9hdCBsaW5lX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1pdGVyX2xpbWl0KSBjb25zdCB7CisgIENGWF9GbG9hdFJlY3QgcmVjdCgxMDAwMDAuMGYsIDEwMDAwMC4wZiwgLTEwMDAwMC4wZiwgLTEwMDAwMC4wZik7CisgIHNpemVfdCBpUG9pbnQgPSAwOworICBmbG9hdCBoYWxmX3dpZHRoID0gbGluZV93aWR0aDsKKyAgaW50IGlTdGFydFBvaW50ID0gMDsKKyAgaW50IGlFbmRQb2ludCA9IDA7CisgIGludCBpTWlkZGxlUG9pbnQgPSAwOworICBib29sIGJKb2luOworICB3aGlsZSAoaVBvaW50IDwgbV9Qb2ludHMuc2l6ZSgpKSB7CisgICAgaWYgKG1fUG9pbnRzW2lQb2ludF0uSXNUeXBlQW5kT3BlbihGWFBUX1RZUEU6Ok1vdmVUbykpIHsKKyAgICAgIGlmIChpUG9pbnQgKyAxID09IG1fUG9pbnRzLnNpemUoKSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGlTdGFydFBvaW50ID0gaVBvaW50ICsgMTsKKyAgICAgIGlFbmRQb2ludCA9IGlQb2ludDsKKyAgICAgIGJKb2luID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX1BvaW50c1tpUG9pbnRdLklzVHlwZUFuZE9wZW4oRlhQVF9UWVBFOjpCZXppZXJUbykpIHsKKyAgICAgICAgcmVjdC5VcGRhdGVSZWN0KG1fUG9pbnRzW2lQb2ludF0ubV9Qb2ludCk7CisgICAgICAgIHJlY3QuVXBkYXRlUmVjdChtX1BvaW50c1tpUG9pbnQgKyAxXS5tX1BvaW50KTsKKyAgICAgICAgaVBvaW50ICs9IDI7CisgICAgICB9CisgICAgICBpZiAoaVBvaW50ID09IG1fUG9pbnRzLnNpemUoKSAtIDEgfHwKKyAgICAgICAgICBtX1BvaW50c1tpUG9pbnQgKyAxXS5Jc1R5cGVBbmRPcGVuKEZYUFRfVFlQRTo6TW92ZVRvKSkgeworICAgICAgICBpU3RhcnRQb2ludCA9IGlQb2ludCAtIDE7CisgICAgICAgIGlFbmRQb2ludCA9IGlQb2ludDsKKyAgICAgICAgYkpvaW4gPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlTdGFydFBvaW50ID0gaVBvaW50IC0gMTsKKyAgICAgICAgaU1pZGRsZVBvaW50ID0gaVBvaW50OworICAgICAgICBpRW5kUG9pbnQgPSBpUG9pbnQgKyAxOworICAgICAgICBiSm9pbiA9IHRydWU7CisgICAgICB9CisgICAgfQorCisgICAgQ0ZYX1BvaW50RiBzdGFydF9wb3MgPSBtX1BvaW50c1tpU3RhcnRQb2ludF0ubV9Qb2ludDsKKyAgICBDRlhfUG9pbnRGIGVuZF9wb3MgPSBtX1BvaW50c1tpRW5kUG9pbnRdLm1fUG9pbnQ7CisgICAgaWYgKGJKb2luKSB7CisgICAgICBDRlhfUG9pbnRGIG1pZF9wb3MgPSBtX1BvaW50c1tpTWlkZGxlUG9pbnRdLm1fUG9pbnQ7CisgICAgICBVcGRhdGVMaW5lSm9pblBvaW50cygmcmVjdCwgc3RhcnRfcG9zLCBtaWRfcG9zLCBlbmRfcG9zLCBoYWxmX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl0ZXJfbGltaXQpOworICAgIH0gZWxzZSB7CisgICAgICBVcGRhdGVMaW5lRW5kUG9pbnRzKCZyZWN0LCBzdGFydF9wb3MsIGVuZF9wb3MsIGhhbGZfd2lkdGgpOworICAgIH0KKyAgICBpUG9pbnQrKzsKKyAgfQorICByZXR1cm4gcmVjdDsKK30KKwordm9pZCBDRlhfUGF0aERhdGE6OlRyYW5zZm9ybShjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7CisgIGlmICghcE1hdHJpeCkKKyAgICByZXR1cm47CisgIGZvciAoYXV0byYgcG9pbnQgOiBtX1BvaW50cykKKyAgICBwb2ludC5tX1BvaW50ID0gcE1hdHJpeC0+VHJhbnNmb3JtKHBvaW50Lm1fUG9pbnQpOworfQorCitib29sIENGWF9QYXRoRGF0YTo6R2V0WmVyb0FyZWFQYXRoKGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFkanVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhKiBOZXdQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBiVGhpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogc2V0SWRlbnRpdHkpIGNvbnN0IHsKKyAgKnNldElkZW50aXR5ID0gZmFsc2U7CisgIGlmIChtX1BvaW50cy5zaXplKCkgPCAzKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAobV9Qb2ludHMuc2l6ZSgpID09IDMgJiYgbV9Qb2ludHNbMF0ubV9UeXBlID09IEZYUFRfVFlQRTo6TW92ZVRvICYmCisgICAgICBtX1BvaW50c1sxXS5tX1R5cGUgPT0gRlhQVF9UWVBFOjpMaW5lVG8gJiYKKyAgICAgIG1fUG9pbnRzWzJdLm1fVHlwZSA9PSBGWFBUX1RZUEU6OkxpbmVUbyAmJgorICAgICAgbV9Qb2ludHNbMF0ubV9Qb2ludCA9PSBtX1BvaW50c1syXS5tX1BvaW50KSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgIENGWF9Qb2ludEYgcG9pbnQgPSBtX1BvaW50c1tpXS5tX1BvaW50OworICAgICAgaWYgKGJBZGp1c3QpIHsKKyAgICAgICAgaWYgKHBNYXRyaXgpCisgICAgICAgICAgcG9pbnQgPSBwTWF0cml4LT5UcmFuc2Zvcm0ocG9pbnQpOworCisgICAgICAgIHBvaW50ID0gQ0ZYX1BvaW50RihzdGF0aWNfY2FzdDxpbnQ+KHBvaW50LngpICsgMC41ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4ocG9pbnQueSkgKyAwLjVmKTsKKyAgICAgIH0KKyAgICAgIE5ld1BhdGgtPkFwcGVuZFBvaW50KAorICAgICAgICAgIHBvaW50LCBpID09IDAgPyBGWFBUX1RZUEU6Ok1vdmVUbyA6IEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7CisgICAgfQorICAgIGlmIChiQWRqdXN0ICYmIHBNYXRyaXgpCisgICAgICAqc2V0SWRlbnRpdHkgPSB0cnVlOworCisgICAgLy8gTm90ZSwgdGhleSBib3RoIGhhdmUgdG8gYmUgbm90IGVxdWFsLgorICAgIGlmIChtX1BvaW50c1swXS5tX1BvaW50LnggIT0gbV9Qb2ludHNbMV0ubV9Qb2ludC54ICYmCisgICAgICAgIG1fUG9pbnRzWzBdLm1fUG9pbnQueSAhPSBtX1BvaW50c1sxXS5tX1BvaW50LnkpIHsKKyAgICAgICpiVGhpbiA9IHRydWU7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaWYgKCgobV9Qb2ludHMuc2l6ZSgpID4gMykgJiYgKG1fUG9pbnRzLnNpemUoKSAlIDIpKSkgeworICAgIGludCBtaWQgPSBtX1BvaW50cy5zaXplKCkgLyAyOworICAgIGJvb2wgYlplcm9BcmVhID0gZmFsc2U7CisgICAgQ0ZYX1BhdGhEYXRhIHRfcGF0aDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pZDsgaSsrKSB7CisgICAgICBpZiAoIShtX1BvaW50c1ttaWQgLSBpIC0gMV0ubV9Qb2ludCA9PSBtX1BvaW50c1ttaWQgKyBpICsgMV0ubV9Qb2ludCAmJgorICAgICAgICAgICAgbV9Qb2ludHNbbWlkIC0gaSAtIDFdLm1fVHlwZSAhPSBGWFBUX1RZUEU6OkJlemllclRvICYmCisgICAgICAgICAgICBtX1BvaW50c1ttaWQgKyBpICsgMV0ubV9UeXBlICE9IEZYUFRfVFlQRTo6QmV6aWVyVG8pKSB7CisgICAgICAgIGJaZXJvQXJlYSA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICB0X3BhdGguQXBwZW5kUG9pbnQobV9Qb2ludHNbbWlkIC0gaV0ubV9Qb2ludCwgRlhQVF9UWVBFOjpNb3ZlVG8sIGZhbHNlKTsKKyAgICAgIHRfcGF0aC5BcHBlbmRQb2ludChtX1BvaW50c1ttaWQgLSBpIC0gMV0ubV9Qb2ludCwgRlhQVF9UWVBFOjpMaW5lVG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIH0KKyAgICBpZiAoIWJaZXJvQXJlYSkgeworICAgICAgTmV3UGF0aC0+QXBwZW5kKCZ0X3BhdGgsIG51bGxwdHIpOworICAgICAgKmJUaGluID0gdHJ1ZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIGludCBzdGFydFBvaW50ID0gMDsKKyAgaW50IG5leHQgPSAwOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fUG9pbnRzLnNpemUoKTsgaSsrKSB7CisgICAgRlhQVF9UWVBFIHBvaW50X3R5cGUgPSBtX1BvaW50c1tpXS5tX1R5cGU7CisgICAgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9UWVBFOjpNb3ZlVG8pIHsKKyAgICAgIHN0YXJ0UG9pbnQgPSBpOworICAgIH0gZWxzZSBpZiAocG9pbnRfdHlwZSA9PSBGWFBUX1RZUEU6OkxpbmVUbykgeworICAgICAgbmV4dCA9IChpICsgMSAtIHN0YXJ0UG9pbnQpICUgKG1fUG9pbnRzLnNpemUoKSAtIHN0YXJ0UG9pbnQpICsgc3RhcnRQb2ludDsKKyAgICAgIGlmIChtX1BvaW50c1tuZXh0XS5tX1R5cGUgIT0gRlhQVF9UWVBFOjpCZXppZXJUbyAmJgorICAgICAgICAgIG1fUG9pbnRzW25leHRdLm1fVHlwZSAhPSBGWFBUX1RZUEU6Ok1vdmVUbykgeworICAgICAgICBpZiAoKG1fUG9pbnRzW2kgLSAxXS5tX1BvaW50LnggPT0gbV9Qb2ludHNbaV0ubV9Qb2ludC54ICYmCisgICAgICAgICAgICAgbV9Qb2ludHNbaV0ubV9Qb2ludC54ID09IG1fUG9pbnRzW25leHRdLm1fUG9pbnQueCkgJiYKKyAgICAgICAgICAgICgobV9Qb2ludHNbaV0ubV9Qb2ludC55IC0gbV9Qb2ludHNbaSAtIDFdLm1fUG9pbnQueSkgKgorICAgICAgICAgICAgICAgICAobV9Qb2ludHNbaV0ubV9Qb2ludC55IC0gbV9Qb2ludHNbbmV4dF0ubV9Qb2ludC55KSA+CisgICAgICAgICAgICAgMCkpIHsKKyAgICAgICAgICBpbnQgcHJlID0gaTsKKyAgICAgICAgICBpZiAoZmFicyhtX1BvaW50c1tpXS5tX1BvaW50LnkgLSBtX1BvaW50c1tpIC0gMV0ubV9Qb2ludC55KSA8CisgICAgICAgICAgICAgIGZhYnMobV9Qb2ludHNbaV0ubV9Qb2ludC55IC0gbV9Qb2ludHNbbmV4dF0ubV9Qb2ludC55KSkgeworICAgICAgICAgICAgcHJlLS07CisgICAgICAgICAgICBuZXh0LS07CisgICAgICAgICAgfQorCisgICAgICAgICAgTmV3UGF0aC0+QXBwZW5kUG9pbnQobV9Qb2ludHNbcHJlXS5tX1BvaW50LCBGWFBUX1RZUEU6Ok1vdmVUbywgZmFsc2UpOworICAgICAgICAgIE5ld1BhdGgtPkFwcGVuZFBvaW50KG1fUG9pbnRzW25leHRdLm1fUG9pbnQsIEZYUFRfVFlQRTo6TGluZVRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgfSBlbHNlIGlmICgobV9Qb2ludHNbaSAtIDFdLm1fUG9pbnQueSA9PSBtX1BvaW50c1tpXS5tX1BvaW50LnkgJiYKKyAgICAgICAgICAgICAgICAgICAgbV9Qb2ludHNbaV0ubV9Qb2ludC55ID09IG1fUG9pbnRzW25leHRdLm1fUG9pbnQueSkgJiYKKyAgICAgICAgICAgICAgICAgICAoKG1fUG9pbnRzW2ldLm1fUG9pbnQueCAtIG1fUG9pbnRzW2kgLSAxXS5tX1BvaW50LngpICoKKyAgICAgICAgICAgICAgICAgICAgICAgIChtX1BvaW50c1tpXS5tX1BvaW50LnggLSBtX1BvaW50c1tuZXh0XS5tX1BvaW50LngpID4KKyAgICAgICAgICAgICAgICAgICAgMCkpIHsKKyAgICAgICAgICBpbnQgcHJlID0gaTsKKyAgICAgICAgICBpZiAoZmFicyhtX1BvaW50c1tpXS5tX1BvaW50LnggLSBtX1BvaW50c1tpIC0gMV0ubV9Qb2ludC54KSA8CisgICAgICAgICAgICAgIGZhYnMobV9Qb2ludHNbaV0ubV9Qb2ludC54IC0gbV9Qb2ludHNbbmV4dF0ubV9Qb2ludC54KSkgeworICAgICAgICAgICAgcHJlLS07CisgICAgICAgICAgICBuZXh0LS07CisgICAgICAgICAgfQorCisgICAgICAgICAgTmV3UGF0aC0+QXBwZW5kUG9pbnQobV9Qb2ludHNbcHJlXS5tX1BvaW50LCBGWFBUX1RZUEU6Ok1vdmVUbywgZmFsc2UpOworICAgICAgICAgIE5ld1BhdGgtPkFwcGVuZFBvaW50KG1fUG9pbnRzW25leHRdLm1fUG9pbnQsIEZYUFRfVFlQRTo6TGluZVRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgfSBlbHNlIGlmIChtX1BvaW50c1tpIC0gMV0ubV9UeXBlID09IEZYUFRfVFlQRTo6TW92ZVRvICYmCisgICAgICAgICAgICAgICAgICAgbV9Qb2ludHNbbmV4dF0ubV9UeXBlID09IEZYUFRfVFlQRTo6TGluZVRvICYmCisgICAgICAgICAgICAgICAgICAgbV9Qb2ludHNbaSAtIDFdLm1fUG9pbnQgPT0gbV9Qb2ludHNbbmV4dF0ubV9Qb2ludCAmJgorICAgICAgICAgICAgICAgICAgIG1fUG9pbnRzW25leHRdLm1fQ2xvc2VGaWd1cmUpIHsKKyAgICAgICAgICBOZXdQYXRoLT5BcHBlbmRQb2ludChtX1BvaW50c1tpIC0gMV0ubV9Qb2ludCwgRlhQVF9UWVBFOjpNb3ZlVG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgIE5ld1BhdGgtPkFwcGVuZFBvaW50KG1fUG9pbnRzW2ldLm1fUG9pbnQsIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7CisgICAgICAgICAgKmJUaGluID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAocG9pbnRfdHlwZSA9PSBGWFBUX1RZUEU6OkJlemllclRvKSB7CisgICAgICBpICs9IDI7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgIH0KKworICBzaXplX3QgbmV3X3BhdGhfc2l6ZSA9IE5ld1BhdGgtPkdldFBvaW50cygpLnNpemUoKTsKKyAgaWYgKG1fUG9pbnRzLnNpemUoKSA+IDMgJiYgbmV3X3BhdGhfc2l6ZSA+IDApCisgICAgKmJUaGluID0gdHJ1ZTsKKyAgcmV0dXJuIG5ld19wYXRoX3NpemUgIT0gMDsKK30KKworYm9vbCBDRlhfUGF0aERhdGE6OklzUmVjdCgpIGNvbnN0IHsKKyAgaWYgKG1fUG9pbnRzLnNpemUoKSAhPSA1ICYmIG1fUG9pbnRzLnNpemUoKSAhPSA0KQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoKG1fUG9pbnRzLnNpemUoKSA9PSA1ICYmIG1fUG9pbnRzWzBdLm1fUG9pbnQgIT0gbV9Qb2ludHNbNF0ubV9Qb2ludCkgfHwKKyAgICAgIG1fUG9pbnRzWzBdLm1fUG9pbnQgPT0gbV9Qb2ludHNbMl0ubV9Qb2ludCB8fAorICAgICAgbV9Qb2ludHNbMV0ubV9Qb2ludCA9PSBtX1BvaW50c1szXS5tX1BvaW50KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vdGUsIGJvdGggeCx5IGhhdmUgdG8gbm90IGVxdWFsLgorICBpZiAobV9Qb2ludHNbMF0ubV9Qb2ludC54ICE9IG1fUG9pbnRzWzNdLm1fUG9pbnQueCAmJgorICAgICAgbV9Qb2ludHNbMF0ubV9Qb2ludC55ICE9IG1fUG9pbnRzWzNdLm1fUG9pbnQueSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAxOyBpIDwgNDsgaSsrKSB7CisgICAgaWYgKG1fUG9pbnRzW2ldLm1fVHlwZSAhPSBGWFBUX1RZUEU6OkxpbmVUbykKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBOb3RlLCBib3RoIHgseSBoYXZlIHRvIG5vdCBlcXVhbC4KKyAgICBpZiAobV9Qb2ludHNbaV0ubV9Qb2ludC54ICE9IG1fUG9pbnRzW2kgLSAxXS5tX1BvaW50LnggJiYKKyAgICAgICAgbV9Qb2ludHNbaV0ubV9Qb2ludC55ICE9IG1fUG9pbnRzW2kgLSAxXS5tX1BvaW50LnkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG1fUG9pbnRzLnNpemUoKSA9PSA1IHx8IG1fUG9pbnRzWzNdLm1fQ2xvc2VGaWd1cmU7Cit9CisKK2Jvb2wgQ0ZYX1BhdGhEYXRhOjpJc1JlY3QoY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCogcFJlY3QpIGNvbnN0IHsKKyAgaWYgKCFwTWF0cml4KSB7CisgICAgaWYgKCFJc1JlY3QoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChwUmVjdCkgeworICAgICAgcFJlY3QtPmxlZnQgPSBtX1BvaW50c1swXS5tX1BvaW50Lng7CisgICAgICBwUmVjdC0+cmlnaHQgPSBtX1BvaW50c1syXS5tX1BvaW50Lng7CisgICAgICBwUmVjdC0+Ym90dG9tID0gbV9Qb2ludHNbMF0ubV9Qb2ludC55OworICAgICAgcFJlY3QtPnRvcCA9IG1fUG9pbnRzWzJdLm1fUG9pbnQueTsKKyAgICAgIHBSZWN0LT5Ob3JtYWxpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpZiAobV9Qb2ludHMuc2l6ZSgpICE9IDUgJiYgbV9Qb2ludHMuc2l6ZSgpICE9IDQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICgobV9Qb2ludHMuc2l6ZSgpID09IDUgJiYgbV9Qb2ludHNbMF0ubV9Qb2ludCAhPSBtX1BvaW50c1s0XS5tX1BvaW50KSB8fAorICAgICAgbV9Qb2ludHNbMV0ubV9Qb2ludCA9PSBtX1BvaW50c1szXS5tX1BvaW50KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vdGUsIGJvdGggeCx5IG5vdCBlcXVhbC4KKyAgaWYgKG1fUG9pbnRzLnNpemUoKSA9PSA0ICYmIG1fUG9pbnRzWzBdLm1fUG9pbnQueCAhPSBtX1BvaW50c1szXS5tX1BvaW50LnggJiYKKyAgICAgIG1fUG9pbnRzWzBdLm1fUG9pbnQueSAhPSBtX1BvaW50c1szXS5tX1BvaW50LnkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBDRlhfUG9pbnRGIHBvaW50c1s1XTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX1BvaW50cy5zaXplKCk7IGkrKykgeworICAgIHBvaW50c1tpXSA9IHBNYXRyaXgtPlRyYW5zZm9ybShtX1BvaW50c1tpXS5tX1BvaW50KTsKKworICAgIGlmIChpID09IDApCisgICAgICBjb250aW51ZTsKKyAgICBpZiAobV9Qb2ludHNbaV0ubV9UeXBlICE9IEZYUFRfVFlQRTo6TGluZVRvKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChwb2ludHNbaV0ueCAhPSBwb2ludHNbaSAtIDFdLnggJiYgcG9pbnRzW2ldLnkgIT0gcG9pbnRzW2kgLSAxXS55KQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKHBSZWN0KSB7CisgICAgcFJlY3QtPmxlZnQgPSBwb2ludHNbMF0ueDsKKyAgICBwUmVjdC0+cmlnaHQgPSBwb2ludHNbMl0ueDsKKyAgICBwUmVjdC0+Ym90dG9tID0gcG9pbnRzWzBdLnk7CisgICAgcFJlY3QtPnRvcCA9IHBvaW50c1syXS55OworICAgIHBSZWN0LT5Ob3JtYWxpemUoKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9jZnhfcGF0aGRhdGEuaCBiL2NvcmUvZnhnZS9jZnhfcGF0aGRhdGEuaAppbmRleCBiMGUzMGUzLi5kMzQ2YmEwIDEwMDY0NAotLS0gYS9jb3JlL2Z4Z2UvY2Z4X3BhdGhkYXRhLmgKKysrIGIvY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oCkBAIC0yOSwxMSArMjksMTEgQEAKICAgYm9vbCBtX0Nsb3NlRmlndXJlOwogfTsKIAotY2xhc3MgQ0ZYX1BhdGhEYXRhIHsKK2NsYXNzIENGWF9QYXRoRGF0YSA6IHB1YmxpYyBSZXRhaW5hYmxlIHsKICBwdWJsaWM6CiAgIENGWF9QYXRoRGF0YSgpOwogICBDRlhfUGF0aERhdGEoY29uc3QgQ0ZYX1BhdGhEYXRhJiBzcmMpOwotICB+Q0ZYX1BhdGhEYXRhKCk7CisgIH5DRlhfUGF0aERhdGEoKSBvdmVycmlkZTsKIAogICB2b2lkIENsZWFyKCk7CiAKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgc3RkOjp2ZWN0b3I8RlhfUEFUSFBPSU5UPiYgR2V0UG9pbnRzKCkgeyByZXR1cm4gbV9Qb2ludHM7IH0KIAogICBDRlhfRmxvYXRSZWN0IEdldEJvdW5kaW5nQm94KCkgY29uc3Q7Ci0gIENGWF9GbG9hdFJlY3QgR2V0Qm91bmRpbmdCb3goRlhfRkxPQVQgbGluZV93aWR0aCwgRlhfRkxPQVQgbWl0ZXJfbGltaXQpIGNvbnN0OworICBDRlhfRmxvYXRSZWN0IEdldEJvdW5kaW5nQm94KGZsb2F0IGxpbmVfd2lkdGgsIGZsb2F0IG1pdGVyX2xpbWl0KSBjb25zdDsKIAogICB2b2lkIFRyYW5zZm9ybShjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKICAgYm9vbCBJc1JlY3QoKSBjb25zdDsKQEAgLTU5LDcgKzU5LDggQEAKICAgYm9vbCBJc1JlY3QoY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwgQ0ZYX0Zsb2F0UmVjdCogcmVjdCkgY29uc3Q7CiAKICAgdm9pZCBBcHBlbmQoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwU3JjLCBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKLSAgdm9pZCBBcHBlbmRSZWN0KEZYX0ZMT0FUIGxlZnQsIEZYX0ZMT0FUIGJvdHRvbSwgRlhfRkxPQVQgcmlnaHQsIEZYX0ZMT0FUIHRvcCk7CisgIHZvaWQgQXBwZW5kUmVjdChmbG9hdCBsZWZ0LCBmbG9hdCBib3R0b20sIGZsb2F0IHJpZ2h0LCBmbG9hdCB0b3ApOworICB2b2lkIEFwcGVuZExpbmUoY29uc3QgQ0ZYX1BvaW50RiYgcHQxLCBjb25zdCBDRlhfUG9pbnRGJiBwdDIpOwogICB2b2lkIEFwcGVuZFBvaW50KGNvbnN0IENGWF9Qb2ludEYmIHBvcywgRlhQVF9UWVBFIHR5cGUsIGJvb2wgY2xvc2VGaWd1cmUpOwogICB2b2lkIENsb3NlUGF0aCgpOwogCmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5jcHAgYi9jb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5YTdhOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmNwcApAQCAtMCwwICsxLDEzNjQgQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9kZWZhdWx0cmVuZGVyZGV2aWNlLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mYWNlY2FjaGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnRtZ3IuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dlbW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9ncmFwaHN0YXRlZGF0YS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcGF0aGRhdGEuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9pbWFnZXJlbmRlcmVyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2lmeF9yZW5kZXJkZXZpY2Vkcml2ZXIuaCIKKworI2lmIGRlZmluZWQgX1NLSUFfU1VQUE9SVF8gfHwgZGVmaW5lZCBfU0tJQV9TVVBQT1JUX1BBVEhTXworI2luY2x1ZGUgInRoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9jb3JlL1NrVHlwZXMuaCIKKyNlbmRpZgorCituYW1lc3BhY2UgeworCit2b2lkIEFkanVzdEdseXBoU3BhY2Uoc3RkOjp2ZWN0b3I8RlhURVhUX0dMWVBIUE9TPiogcEdseXBoQW5kUG9zKSB7CisgIEFTU0VSVChwR2x5cGhBbmRQb3MtPnNpemUoKSA+IDEpOworICBzdGQ6OnZlY3RvcjxGWFRFWFRfR0xZUEhQT1M+JiBnbHlwaHMgPSAqcEdseXBoQW5kUG9zOworICBib29sIGJWZXJ0aWNhbCA9IGdseXBocy5iYWNrKCkubV9PcmlnaW4ueCA9PSBnbHlwaHMuZnJvbnQoKS5tX09yaWdpbi54OworICBpZiAoIWJWZXJ0aWNhbCAmJiAoZ2x5cGhzLmJhY2soKS5tX09yaWdpbi55ICE9IGdseXBocy5mcm9udCgpLm1fT3JpZ2luLnkpKQorICAgIHJldHVybjsKKworICBmb3IgKHNpemVfdCBpID0gZ2x5cGhzLnNpemUoKSAtIDE7IGkgPiAxOyAtLWkpIHsKKyAgICBGWFRFWFRfR0xZUEhQT1MmIG5leHQgPSBnbHlwaHNbaV07CisgICAgaW50IG5leHRfb3JpZ2luID0gYlZlcnRpY2FsID8gbmV4dC5tX09yaWdpbi55IDogbmV4dC5tX09yaWdpbi54OworICAgIGZsb2F0IG5leHRfb3JpZ2luX2YgPSBiVmVydGljYWwgPyBuZXh0Lm1fZk9yaWdpbi55IDogbmV4dC5tX2ZPcmlnaW4ueDsKKworICAgIEZYVEVYVF9HTFlQSFBPUyYgY3VycmVudCA9IGdseXBoc1tpIC0gMV07CisgICAgaW50JiBjdXJyZW50X29yaWdpbiA9IGJWZXJ0aWNhbCA/IGN1cnJlbnQubV9PcmlnaW4ueSA6IGN1cnJlbnQubV9PcmlnaW4ueDsKKyAgICBmbG9hdCBjdXJyZW50X29yaWdpbl9mID0KKyAgICAgICAgYlZlcnRpY2FsID8gY3VycmVudC5tX2ZPcmlnaW4ueSA6IGN1cnJlbnQubV9mT3JpZ2luLng7CisKKyAgICBpbnQgc3BhY2UgPSBuZXh0X29yaWdpbiAtIGN1cnJlbnRfb3JpZ2luOworICAgIGZsb2F0IHNwYWNlX2YgPSBuZXh0X29yaWdpbl9mIC0gY3VycmVudF9vcmlnaW5fZjsKKyAgICBmbG9hdCBlcnJvciA9IGZhYnMoc3BhY2VfZikgLSBmYWJzKHN0YXRpY19jYXN0PGZsb2F0PihzcGFjZSkpOworICAgIGlmIChlcnJvciA+IDAuNWYpCisgICAgICBjdXJyZW50X29yaWdpbiArPSBzcGFjZSA+IDAgPyAtMSA6IDE7CisgIH0KK30KKworY29uc3QgdWludDhfdCBnX1RleHRHYW1tYUFkanVzdFsyNTZdID0geworICAgIDAsICAgMiwgICAzLCAgIDQsICAgNiwgICA3LCAgIDgsICAgMTAsICAxMSwgIDEyLCAgMTMsICAxNSwgIDE2LCAgMTcsICAxOCwKKyAgICAxOSwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjksICAzMCwgIDMxLCAgMzIsICAzMywgIDM0LCAgMzUsCisgICAgMzYsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywgIDQ4LCAgNDksICA1MSwgIDUyLAorICAgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsICA2NCwgIDY1LCAgNjYsICA2NywKKyAgICA2OCwgIDY5LCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LCAgODAsICA4MSwgIDgyLCAgODMsCisgICAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LCAgOTYsICA5NywgIDk4LAorICAgIDk5LCAgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLCAxMTMsCisgICAgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsIDEyOCwKKyAgICAxMjksIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLAorICAgIDE0MywgMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2LCAxNTYsCisgICAgMTU3LCAxNTgsIDE1OSwgMTYwLCAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwKKyAgICAxNzIsIDE3MywgMTc0LCAxNzQsIDE3NSwgMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4MSwgMTgyLCAxODMsIDE4NCwgMTg1LAorICAgIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkwLCAxOTAsIDE5MSwgMTkyLCAxOTMsIDE5NCwgMTk1LCAxOTYsIDE5NywgMTk4LCAxOTksCisgICAgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywKKyAgICAyMTQsIDIxNSwgMjE2LCAyMTcsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMywgMjI0LCAyMjUsIDIyNiwgMjI3LAorICAgIDIyOCwgMjI4LCAyMjksIDIzMCwgMjMxLCAyMzIsIDIzMywgMjM0LCAyMzUsIDIzNiwgMjM3LCAyMzgsIDIzOSwgMjM5LCAyNDAsCisgICAgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTAsIDI1MSwgMjUyLCAyNTMsIDI1NCwKKyAgICAyNTUsCit9OworCitpbnQgVGV4dEdhbW1hQWRqdXN0KGludCB2YWx1ZSkgeworICBBU1NFUlQodmFsdWUgPj0gMCk7CisgIEFTU0VSVCh2YWx1ZSA8PSAyNTUpOworICByZXR1cm4gZ19UZXh0R2FtbWFBZGp1c3RbdmFsdWVdOworfQorCitpbnQgQ2FsY0FscGhhKGludCBzcmMsIGludCBhbHBoYSkgeworICByZXR1cm4gc3JjICogYWxwaGEgLyAyNTU7Cit9CisKK3ZvaWQgTWVyZ2UodWludDhfdCBzcmMsIGludCBjaGFubmVsLCBpbnQgYWxwaGEsIHVpbnQ4X3QqIGRlc3QpIHsKKyAgKmRlc3QgPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdCwgY2hhbm5lbCwgQ2FsY0FscGhhKHNyYywgYWxwaGEpKTsKK30KKwordm9pZCBNZXJnZUdhbW1hQWRqdXN0KHVpbnQ4X3Qgc3JjLCBpbnQgY2hhbm5lbCwgaW50IGFscGhhLCB1aW50OF90KiBkZXN0KSB7CisgICpkZXN0ID0KKyAgICAgIEZYRElCX0FMUEhBX01FUkdFKCpkZXN0LCBjaGFubmVsLCBDYWxjQWxwaGEoVGV4dEdhbW1hQWRqdXN0KHNyYyksIGFscGhhKSk7Cit9CisKK3ZvaWQgTWVyZ2VHYW1tYUFkanVzdEJncihjb25zdCB1aW50OF90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdCkgeworICBNZXJnZUdhbW1hQWRqdXN0KHNyY1swXSwgYiwgYSwgJmRlc3RbMF0pOworICBNZXJnZUdhbW1hQWRqdXN0KHNyY1sxXSwgZywgYSwgJmRlc3RbMV0pOworICBNZXJnZUdhbW1hQWRqdXN0KHNyY1syXSwgciwgYSwgJmRlc3RbMl0pOworfQorCit2b2lkIE1lcmdlR2FtbWFBZGp1c3RSZ2IoY29uc3QgdWludDhfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCByLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3QpIHsKKyAgTWVyZ2VHYW1tYUFkanVzdChzcmNbMl0sIGIsIGEsICZkZXN0WzBdKTsKKyAgTWVyZ2VHYW1tYUFkanVzdChzcmNbMV0sIGcsIGEsICZkZXN0WzFdKTsKKyAgTWVyZ2VHYW1tYUFkanVzdChzcmNbMF0sIHIsIGEsICZkZXN0WzJdKTsKK30KKworaW50IEF2ZXJhZ2VSZ2IoY29uc3QgdWludDhfdCogc3JjKSB7CisgIHJldHVybiAoc3JjWzBdICsgc3JjWzFdICsgc3JjWzJdKSAvIDM7Cit9CisKK3VpbnQ4X3QgQ2FsY3VsYXRlRGVzdEFscGhhKHVpbnQ4X3QgYmFja19hbHBoYSwgaW50IHNyY19hbHBoYSkgeworICByZXR1cm4gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Cit9CisKK3ZvaWQgQXBwbHlBbHBoYSh1aW50OF90KiBkZXN0LCBpbnQgYiwgaW50IGcsIGludCByLCBpbnQgYWxwaGEpIHsKKyAgZGVzdFswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3RbMF0sIGIsIGFscGhhKTsKKyAgZGVzdFsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3RbMV0sIGcsIGFscGhhKTsKKyAgZGVzdFsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3RbMl0sIHIsIGFscGhhKTsKK30KKwordm9pZCBBcHBseURlc3RBbHBoYSh1aW50OF90IGJhY2tfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgIGludCByLAorICAgICAgICAgICAgICAgICAgICBpbnQgZywKKyAgICAgICAgICAgICAgICAgICAgaW50IGIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3QpIHsKKyAgdWludDhfdCBkZXN0X2FscGhhID0gQ2FsY3VsYXRlRGVzdEFscGhhKGJhY2tfYWxwaGEsIHNyY19hbHBoYSk7CisgIEFwcGx5QWxwaGEoZGVzdCwgYiwgZywgciwgc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYSk7CisgIGRlc3RbM10gPSBkZXN0X2FscGhhOworfQorCit2b2lkIE5vcm1hbGl6ZUFyZ2IoaW50IHNyY192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgciwKKyAgICAgICAgICAgICAgICAgICBpbnQgZywKKyAgICAgICAgICAgICAgICAgICBpbnQgYiwKKyAgICAgICAgICAgICAgICAgICBpbnQgYSwKKyAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0LAorICAgICAgICAgICAgICAgICAgIGludCBzcmNfYWxwaGEpIHsKKyAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdFszXTsKKyAgaWYgKGJhY2tfYWxwaGEgPT0gMCkKKyAgICBGWEFSR0JfU0VURElCKGRlc3QsIEZYQVJHQl9NQUtFKHNyY19hbHBoYSwgciwgZywgYikpOworICBlbHNlIGlmIChzcmNfYWxwaGEgIT0gMCkKKyAgICBBcHBseURlc3RBbHBoYShiYWNrX2FscGhhLCBzcmNfYWxwaGEsIHIsIGcsIGIsIGRlc3QpOworfQorCit2b2lkIE5vcm1hbGl6ZURlc3QoYm9vbCBoYXNfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgaW50IHNyY192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgciwKKyAgICAgICAgICAgICAgICAgICBpbnQgZywKKyAgICAgICAgICAgICAgICAgICBpbnQgYiwKKyAgICAgICAgICAgICAgICAgICBpbnQgYSwKKyAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0KSB7CisgIGlmIChoYXNfYWxwaGEpIHsKKyAgICBOb3JtYWxpemVBcmdiKHNyY192YWx1ZSwgciwgZywgYiwgYSwgZGVzdCwKKyAgICAgICAgICAgICAgICAgIENhbGNBbHBoYShUZXh0R2FtbWFBZGp1c3Qoc3JjX3ZhbHVlKSwgYSkpOworICAgIHJldHVybjsKKyAgfQorICBpbnQgc3JjX2FscGhhID0gQ2FsY0FscGhhKFRleHRHYW1tYUFkanVzdChzcmNfdmFsdWUpLCBhKTsKKyAgaWYgKHNyY19hbHBoYSA9PSAwKQorICAgIHJldHVybjsKKworICBBcHBseUFscGhhKGRlc3QsIGIsIGcsIHIsIHNyY19hbHBoYSk7Cit9CisKK3ZvaWQgTm9ybWFsaXplU3JjKGJvb2wgaGFzX2FscGhhLAorICAgICAgICAgICAgICAgICAgaW50IHNyY192YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGludCByLAorICAgICAgICAgICAgICAgICAgaW50IGcsCisgICAgICAgICAgICAgICAgICBpbnQgYiwKKyAgICAgICAgICAgICAgICAgIGludCBhLAorICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdCkgeworICBpZiAoIWhhc19hbHBoYSkgeworICAgIEFwcGx5QWxwaGEoZGVzdCwgYiwgZywgciwgQ2FsY0FscGhhKFRleHRHYW1tYUFkanVzdChzcmNfdmFsdWUpLCBhKSk7CisgICAgcmV0dXJuOworICB9CisgIGludCBzcmNfYWxwaGEgPSBDYWxjQWxwaGEoVGV4dEdhbW1hQWRqdXN0KHNyY192YWx1ZSksIGEpOworICBpZiAoc3JjX2FscGhhICE9IDApCisgICAgTm9ybWFsaXplQXJnYihzcmNfdmFsdWUsIHIsIGcsIGIsIGEsIGRlc3QsIHNyY19hbHBoYSk7Cit9CisKK3ZvaWQgTmV4dFBpeGVsKHVpbnQ4X3QqKiBzcmNfc2NhbiwgdWludDhfdCoqIGRzdF9zY2FuLCBpbnQgYnBwKSB7CisgICpzcmNfc2NhbiArPSAzOworICAqZHN0X3NjYW4gKz0gYnBwOworfQorCit2b2lkIFNldEFscGhhKGJvb2wgaGFzX2FscGhhLCB1aW50OF90KiBhbHBoYSkgeworICBpZiAoaGFzX2FscGhhKQorICAgIGFscGhhWzNdID0gMjU1OworfQorCit2b2lkIERyYXdOb3JtYWxUZXh0SGVscGVyKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwR2x5cGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBucm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmRfY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJOb3JtYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkJHUlN0cmlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfc3VicGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiKSB7CisgIGNvbnN0IGJvb2wgaGFzX2FscGhhID0gYml0bWFwLT5HZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiOworICB1aW50OF90KiBzcmNfYnVmID0gcEdseXBoLT5HZXRCdWZmZXIoKTsKKyAgaW50IHNyY19waXRjaCA9IHBHbHlwaC0+R2V0UGl0Y2goKTsKKyAgdWludDhfdCogZGVzdF9idWYgPSBiaXRtYXAtPkdldEJ1ZmZlcigpOworICBpbnQgZGVzdF9waXRjaCA9IGJpdG1hcC0+R2V0UGl0Y2goKTsKKyAgY29uc3QgaW50IEJwcCA9IGhhc19hbHBoYSA/IDQgOiBiaXRtYXAtPkdldEJQUCgpIC8gODsKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbnJvd3M7ICsrcm93KSB7CisgICAgaW50IGRlc3Rfcm93ID0gcm93ICsgdG9wOworICAgIGlmIChkZXN0X3JvdyA8IDAgfHwgZGVzdF9yb3cgPj0gYml0bWFwLT5HZXRIZWlnaHQoKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgdWludDhfdCogc3JjX3NjYW4gPSBzcmNfYnVmICsgcm93ICogc3JjX3BpdGNoICsgKHN0YXJ0X2NvbCAtIGxlZnQpICogMzsKKyAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIGRlc3Rfcm93ICogZGVzdF9waXRjaCArIHN0YXJ0X2NvbCAqIEJwcDsKKyAgICBpZiAoYkJHUlN0cmlwZSkgeworICAgICAgaWYgKHhfc3VicGl4ZWwgPT0gMCkgeworICAgICAgICBmb3IgKGludCBjb2wgPSBzdGFydF9jb2w7IGNvbCA8IGVuZF9jb2w7ICsrY29sKSB7CisgICAgICAgICAgaWYgKGhhc19hbHBoYSkgeworICAgICAgICAgICAgTWVyZ2Uoc3JjX3NjYW5bMl0sIHIsIGEsICZkZXN0X3NjYW5bMl0pOworICAgICAgICAgICAgTWVyZ2Uoc3JjX3NjYW5bMV0sIGcsIGEsICZkZXN0X3NjYW5bMV0pOworICAgICAgICAgICAgTWVyZ2Uoc3JjX3NjYW5bMF0sIGIsIGEsICZkZXN0X3NjYW5bMF0pOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNZXJnZUdhbW1hQWRqdXN0QmdyKCZzcmNfc2NhblswXSwgciwgZywgYiwgYSwgJmRlc3Rfc2NhblswXSk7CisgICAgICAgICAgfQorICAgICAgICAgIFNldEFscGhhKGhhc19hbHBoYSwgZGVzdF9zY2FuKTsKKyAgICAgICAgICBOZXh0UGl4ZWwoJnNyY19zY2FuLCAmZGVzdF9zY2FuLCBCcHApOworICAgICAgICB9CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHhfc3VicGl4ZWwgPT0gMSkgeworICAgICAgICBNZXJnZUdhbW1hQWRqdXN0KHNyY19zY2FuWzFdLCByLCBhLCAmZGVzdF9zY2FuWzJdKTsKKyAgICAgICAgTWVyZ2VHYW1tYUFkanVzdChzcmNfc2NhblswXSwgZywgYSwgJmRlc3Rfc2NhblsxXSk7CisgICAgICAgIGlmIChzdGFydF9jb2wgPiBsZWZ0KQorICAgICAgICAgIE1lcmdlR2FtbWFBZGp1c3Qoc3JjX3NjYW5bLTFdLCBiLCBhLCAmZGVzdF9zY2FuWzBdKTsKKyAgICAgICAgU2V0QWxwaGEoaGFzX2FscGhhLCBkZXN0X3NjYW4pOworICAgICAgICBOZXh0UGl4ZWwoJnNyY19zY2FuLCAmZGVzdF9zY2FuLCBCcHApOworICAgICAgICBmb3IgKGludCBjb2wgPSBzdGFydF9jb2wgKyAxOyBjb2wgPCBlbmRfY29sIC0gMTsgKytjb2wpIHsKKyAgICAgICAgICBNZXJnZUdhbW1hQWRqdXN0QmdyKCZzcmNfc2NhblstMV0sIHIsIGcsIGIsIGEsICZkZXN0X3NjYW5bMF0pOworICAgICAgICAgIFNldEFscGhhKGhhc19hbHBoYSwgZGVzdF9zY2FuKTsKKyAgICAgICAgICBOZXh0UGl4ZWwoJnNyY19zY2FuLCAmZGVzdF9zY2FuLCBCcHApOworICAgICAgICB9CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgTWVyZ2VHYW1tYUFkanVzdChzcmNfc2NhblswXSwgciwgYSwgJmRlc3Rfc2NhblsyXSk7CisgICAgICBpZiAoc3RhcnRfY29sID4gbGVmdCkgeworICAgICAgICBNZXJnZUdhbW1hQWRqdXN0KHNyY19zY2FuWy0xXSwgZywgYSwgJmRlc3Rfc2NhblsxXSk7CisgICAgICAgIE1lcmdlR2FtbWFBZGp1c3Qoc3JjX3NjYW5bLTJdLCBiLCBhLCAmZGVzdF9zY2FuWzBdKTsKKyAgICAgIH0KKyAgICAgIFNldEFscGhhKGhhc19hbHBoYSwgZGVzdF9zY2FuKTsKKyAgICAgIE5leHRQaXhlbCgmc3JjX3NjYW4sICZkZXN0X3NjYW4sIEJwcCk7CisgICAgICBmb3IgKGludCBjb2wgPSBzdGFydF9jb2wgKyAxOyBjb2wgPCBlbmRfY29sIC0gMTsgKytjb2wpIHsKKyAgICAgICAgTWVyZ2VHYW1tYUFkanVzdEJncigmc3JjX3NjYW5bLTJdLCByLCBnLCBiLCBhLCAmZGVzdF9zY2FuWzBdKTsKKyAgICAgICAgU2V0QWxwaGEoaGFzX2FscGhhLCBkZXN0X3NjYW4pOworICAgICAgICBOZXh0UGl4ZWwoJnNyY19zY2FuLCAmZGVzdF9zY2FuLCBCcHApOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICh4X3N1YnBpeGVsID09IDApIHsKKyAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbDsgY29sIDwgZW5kX2NvbDsgKytjb2wpIHsKKyAgICAgICAgaWYgKGJOb3JtYWwpIHsKKyAgICAgICAgICBpbnQgc3JjX3ZhbHVlID0gQXZlcmFnZVJnYigmc3JjX3NjYW5bMF0pOworICAgICAgICAgIE5vcm1hbGl6ZURlc3QoaGFzX2FscGhhLCBzcmNfdmFsdWUsIHIsIGcsIGIsIGEsIGRlc3Rfc2Nhbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgTWVyZ2VHYW1tYUFkanVzdFJnYigmc3JjX3NjYW5bMF0sIHIsIGcsIGIsIGEsICZkZXN0X3NjYW5bMF0pOworICAgICAgICAgIFNldEFscGhhKGhhc19hbHBoYSwgZGVzdF9zY2FuKTsKKyAgICAgICAgfQorICAgICAgICBOZXh0UGl4ZWwoJnNyY19zY2FuLCAmZGVzdF9zY2FuLCBCcHApOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICh4X3N1YnBpeGVsID09IDEpIHsKKyAgICAgIGlmIChiTm9ybWFsKSB7CisgICAgICAgIGludCBzcmNfdmFsdWUgPSBzdGFydF9jb2wgPiBsZWZ0ID8gQXZlcmFnZVJnYigmc3JjX3NjYW5bLTFdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChzcmNfc2NhblswXSArIHNyY19zY2FuWzFdKSAvIDM7CisgICAgICAgIE5vcm1hbGl6ZVNyYyhoYXNfYWxwaGEsIHNyY192YWx1ZSwgciwgZywgYiwgYSwgZGVzdF9zY2FuKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzdGFydF9jb2wgPiBsZWZ0KQorICAgICAgICAgIE1lcmdlR2FtbWFBZGp1c3Qoc3JjX3NjYW5bLTFdLCByLCBhLCAmZGVzdF9zY2FuWzJdKTsKKyAgICAgICAgTWVyZ2VHYW1tYUFkanVzdChzcmNfc2NhblswXSwgZywgYSwgJmRlc3Rfc2NhblsxXSk7CisgICAgICAgIE1lcmdlR2FtbWFBZGp1c3Qoc3JjX3NjYW5bMV0sIGIsIGEsICZkZXN0X3NjYW5bMF0pOworICAgICAgICBTZXRBbHBoYShoYXNfYWxwaGEsIGRlc3Rfc2Nhbik7CisgICAgICB9CisgICAgICBOZXh0UGl4ZWwoJnNyY19zY2FuLCAmZGVzdF9zY2FuLCBCcHApOworICAgICAgZm9yIChpbnQgY29sID0gc3RhcnRfY29sICsgMTsgY29sIDwgZW5kX2NvbDsgKytjb2wpIHsKKyAgICAgICAgaWYgKGJOb3JtYWwpIHsKKyAgICAgICAgICBpbnQgc3JjX3ZhbHVlID0gQXZlcmFnZVJnYigmc3JjX3NjYW5bLTFdKTsKKyAgICAgICAgICBOb3JtYWxpemVEZXN0KGhhc19hbHBoYSwgc3JjX3ZhbHVlLCByLCBnLCBiLCBhLCBkZXN0X3NjYW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIE1lcmdlR2FtbWFBZGp1c3RSZ2IoJnNyY19zY2FuWy0xXSwgciwgZywgYiwgYSwgJmRlc3Rfc2NhblswXSk7CisgICAgICAgICAgU2V0QWxwaGEoaGFzX2FscGhhLCBkZXN0X3NjYW4pOworICAgICAgICB9CisgICAgICAgIE5leHRQaXhlbCgmc3JjX3NjYW4sICZkZXN0X3NjYW4sIEJwcCk7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGJOb3JtYWwpIHsKKyAgICAgIGludCBzcmNfdmFsdWUgPQorICAgICAgICAgIHN0YXJ0X2NvbCA+IGxlZnQgPyBBdmVyYWdlUmdiKCZzcmNfc2NhblstMl0pIDogc3JjX3NjYW5bMF0gLyAzOworICAgICAgTm9ybWFsaXplU3JjKGhhc19hbHBoYSwgc3JjX3ZhbHVlLCByLCBnLCBiLCBhLCBkZXN0X3NjYW4pOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoc3RhcnRfY29sID4gbGVmdCkgeworICAgICAgICBNZXJnZUdhbW1hQWRqdXN0KHNyY19zY2FuWy0yXSwgciwgYSwgJmRlc3Rfc2NhblsyXSk7CisgICAgICAgIE1lcmdlR2FtbWFBZGp1c3Qoc3JjX3NjYW5bLTFdLCBnLCBhLCAmZGVzdF9zY2FuWzFdKTsKKyAgICAgIH0KKyAgICAgIE1lcmdlR2FtbWFBZGp1c3Qoc3JjX3NjYW5bMF0sIGIsIGEsICZkZXN0X3NjYW5bMF0pOworICAgICAgU2V0QWxwaGEoaGFzX2FscGhhLCBkZXN0X3NjYW4pOworICAgIH0KKyAgICBOZXh0UGl4ZWwoJnNyY19zY2FuLCAmZGVzdF9zY2FuLCBCcHApOworICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbCArIDE7IGNvbCA8IGVuZF9jb2w7ICsrY29sKSB7CisgICAgICBpZiAoYk5vcm1hbCkgeworICAgICAgICBpbnQgc3JjX3ZhbHVlID0gQXZlcmFnZVJnYigmc3JjX3NjYW5bLTJdKTsKKyAgICAgICAgTm9ybWFsaXplRGVzdChoYXNfYWxwaGEsIHNyY192YWx1ZSwgciwgZywgYiwgYSwgZGVzdF9zY2FuKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIE1lcmdlR2FtbWFBZGp1c3RSZ2IoJnNyY19zY2FuWy0yXSwgciwgZywgYiwgYSwgJmRlc3Rfc2NhblswXSk7CisgICAgICAgIFNldEFscGhhKGhhc19hbHBoYSwgZGVzdF9zY2FuKTsKKyAgICAgIH0KKyAgICAgIE5leHRQaXhlbCgmc3JjX3NjYW4sICZkZXN0X3NjYW4sIEJwcCk7CisgICAgfQorICB9Cit9CisKK2Jvb2wgU2hvdWxkRHJhd0RldmljZVRleHQoY29uc3QgQ0ZYX0ZvbnQqIHBGb250LCB1aW50MzJfdCB0ZXh0X2ZsYWdzKSB7CisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCisgIGlmICh0ZXh0X2ZsYWdzICYgRlhGT05UX0NJREZPTlQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGNvbnN0IEJ5dGVTdHJpbmcgYnNQc05hbWUgPSBwRm9udC0+R2V0UHNOYW1lKCk7CisgIGlmIChic1BzTmFtZS5Db250YWlucygiK1pKSEwiKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGJzUHNOYW1lID09ICJDTkFBSkkrY21leDEwIikKKyAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitGWFRFWFRfQ0hBUlBPUzo6RlhURVhUX0NIQVJQT1MoKQorICAgIDogbV9Vbmljb2RlKDApLAorICAgICAgbV9HbHlwaEluZGV4KDApLAorICAgICAgbV9Gb250Q2hhcldpZHRoKDApLAorI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXworICAgICAgbV9FeHRHSUQoMCksCisjZW5kaWYKKyAgICAgIG1fRmFsbGJhY2tGb250UG9zaXRpb24oMCksCisgICAgICBtX2JHbHlwaEFkanVzdChmYWxzZSksCisgICAgICBtX2JGb250U3R5bGUoZmFsc2UpIHsKK30KKworRlhURVhUX0NIQVJQT1M6OkZYVEVYVF9DSEFSUE9TKGNvbnN0IEZYVEVYVF9DSEFSUE9TJikgPSBkZWZhdWx0OworCitGWFRFWFRfQ0hBUlBPUzo6fkZYVEVYVF9DSEFSUE9TKCl7fTsKKworQ0ZYX1JlbmRlckRldmljZTo6Q0ZYX1JlbmRlckRldmljZSgpCisgICAgOiBtX3BCaXRtYXAobnVsbHB0ciksCisgICAgICBtX1dpZHRoKDApLAorICAgICAgbV9IZWlnaHQoMCksCisgICAgICBtX2JwcCgwKSwKKyAgICAgIG1fUmVuZGVyQ2FwcygwKSwKKyAgICAgIG1fRGV2aWNlQ2xhc3MoMCkge30KKworQ0ZYX1JlbmRlckRldmljZTo6fkNGWF9SZW5kZXJEZXZpY2UoKSB7CisgIFJlc3RvcmVTdGF0ZShmYWxzZSk7CisjaWYgZGVmaW5lZCBfU0tJQV9TVVBQT1JUXyB8fCBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfUEFUSFNfCisgIEZsdXNoKHRydWUpOworI2VuZGlmCit9CisKKyNpZiBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfIHx8IGRlZmluZWQgX1NLSUFfU1VQUE9SVF9QQVRIU18KK3ZvaWQgQ0ZYX1JlbmRlckRldmljZTo6Rmx1c2goYm9vbCByZWxlYXNlKSB7CisgIGlmIChyZWxlYXNlKQorICAgIG1fcERldmljZURyaXZlci5yZXNldCgpOworICBlbHNlCisgICAgbV9wRGV2aWNlRHJpdmVyLT5GbHVzaCgpOworfQorI2VuZGlmCisKK3ZvaWQgQ0ZYX1JlbmRlckRldmljZTo6U2V0RGV2aWNlRHJpdmVyKAorICAgIHN0ZDo6dW5pcXVlX3B0cjxJRlhfUmVuZGVyRGV2aWNlRHJpdmVyPiBwRHJpdmVyKSB7CisgIG1fcERldmljZURyaXZlciA9IHN0ZDo6bW92ZShwRHJpdmVyKTsKKyAgSW5pdERldmljZUluZm8oKTsKK30KKwordm9pZCBDRlhfUmVuZGVyRGV2aWNlOjpJbml0RGV2aWNlSW5mbygpIHsKKyAgbV9XaWR0aCA9IG1fcERldmljZURyaXZlci0+R2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKTsKKyAgbV9IZWlnaHQgPSBtX3BEZXZpY2VEcml2ZXItPkdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpOworICBtX2JwcCA9IG1fcERldmljZURyaXZlci0+R2V0RGV2aWNlQ2FwcyhGWERDX0JJVFNfUElYRUwpOworICBtX1JlbmRlckNhcHMgPSBtX3BEZXZpY2VEcml2ZXItPkdldERldmljZUNhcHMoRlhEQ19SRU5ERVJfQ0FQUyk7CisgIG1fRGV2aWNlQ2xhc3MgPSBtX3BEZXZpY2VEcml2ZXItPkdldERldmljZUNhcHMoRlhEQ19ERVZJQ0VfQ0xBU1MpOworICBpZiAoIW1fcERldmljZURyaXZlci0+R2V0Q2xpcEJveCgmbV9DbGlwQm94KSkgeworICAgIG1fQ2xpcEJveC5sZWZ0ID0gMDsKKyAgICBtX0NsaXBCb3gudG9wID0gMDsKKyAgICBtX0NsaXBCb3gucmlnaHQgPSBtX1dpZHRoOworICAgIG1fQ2xpcEJveC5ib3R0b20gPSBtX0hlaWdodDsKKyAgfQorfQorCit2b2lkIENGWF9SZW5kZXJEZXZpY2U6OlNhdmVTdGF0ZSgpIHsKKyAgbV9wRGV2aWNlRHJpdmVyLT5TYXZlU3RhdGUoKTsKK30KKwordm9pZCBDRlhfUmVuZGVyRGV2aWNlOjpSZXN0b3JlU3RhdGUoYm9vbCBiS2VlcFNhdmVkKSB7CisgIGlmIChtX3BEZXZpY2VEcml2ZXIpIHsKKyAgICBtX3BEZXZpY2VEcml2ZXItPlJlc3RvcmVTdGF0ZShiS2VlcFNhdmVkKTsKKyAgICBVcGRhdGVDbGlwQm94KCk7CisgIH0KK30KKworaW50IENGWF9SZW5kZXJEZXZpY2U6OkdldERldmljZUNhcHMoaW50IGNhcHNfaWQpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcERldmljZURyaXZlci0+R2V0RGV2aWNlQ2FwcyhjYXBzX2lkKTsKK30KKworQ0ZYX01hdHJpeCBDRlhfUmVuZGVyRGV2aWNlOjpHZXRDVE0oKSBjb25zdCB7CisgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPkdldENUTSgpOworfQorCitSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBDRlhfUmVuZGVyRGV2aWNlOjpHZXRCaXRtYXAoKSBjb25zdCB7CisgIHJldHVybiBtX3BCaXRtYXA7Cit9CisKK3ZvaWQgQ0ZYX1JlbmRlckRldmljZTo6U2V0Qml0bWFwKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwQml0bWFwKSB7CisgIG1fcEJpdG1hcCA9IHBCaXRtYXA7Cit9CisKK2Jvb2wgQ0ZYX1JlbmRlckRldmljZTo6Q3JlYXRlQ29tcGF0aWJsZUJpdG1hcCgKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcERJQiwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGhlaWdodCkgY29uc3QgeworICBpZiAobV9SZW5kZXJDYXBzICYgRlhSQ19DTVlLX09VVFBVVCkgeworICAgIHJldHVybiBwRElCLT5DcmVhdGUoCisgICAgICAgIHdpZHRoLCBoZWlnaHQsCisgICAgICAgIG1fUmVuZGVyQ2FwcyAmIEZYUkNfQUxQSEFfT1VUUFVUID8gRlhESUJfQ215a2EgOiBGWERJQl9DbXlrKTsKKyAgfQorICBpZiAobV9SZW5kZXJDYXBzICYgRlhSQ19CWVRFTUFTS19PVVRQVVQpCisgICAgcmV0dXJuIHBESUItPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl84YnBwTWFzayk7CisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfIHx8IGRlZmluZWQgX1NLSUFfU1VQUE9SVF9QQVRIU18KKyAgcmV0dXJuIHBESUItPkNyZWF0ZSgKKyAgICAgIHdpZHRoLCBoZWlnaHQsCisgICAgICBtX1JlbmRlckNhcHMgJiBGWFJDX0FMUEhBX09VVFBVVCA/IEZYRElCX0FyZ2IgOiBGWERJQl9SZ2IzMik7CisjZWxzZQorICByZXR1cm4gcERJQi0+Q3JlYXRlKAorICAgICAgd2lkdGgsIGhlaWdodCwgbV9SZW5kZXJDYXBzICYgRlhSQ19BTFBIQV9PVVRQVVQgPyBGWERJQl9BcmdiIDogRlhESUJfUmdiKTsKKyNlbmRpZgorfQorCitib29sIENGWF9SZW5kZXJEZXZpY2U6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSkgeworICBpZiAoIW1fcERldmljZURyaXZlci0+U2V0Q2xpcF9QYXRoRmlsbChwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX21vZGUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIFVwZGF0ZUNsaXBCb3goKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ0ZYX1JlbmRlckRldmljZTo6U2V0Q2xpcF9QYXRoU3Ryb2tlKAorICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUpIHsKKyAgaWYgKCFtX3BEZXZpY2VEcml2ZXItPlNldENsaXBfUGF0aFN0cm9rZShwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBHcmFwaFN0YXRlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBVcGRhdGVDbGlwQm94KCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENGWF9SZW5kZXJEZXZpY2U6OlNldENsaXBfUmVjdChjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCkgeworICByZXR1cm4gU2V0Q2xpcF9SZWN0KEZYX1JFQ1Qoc3RhdGljX2Nhc3Q8aW50MzJfdD4oZmxvb3IocnRDbGlwLmxlZnQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGZsb29yKHJ0Q2xpcC50b3ApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGNlaWwocnRDbGlwLnJpZ2h0KCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGNlaWwocnRDbGlwLmJvdHRvbSgpKSkpKTsKK30KKworYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRDbGlwX1JlY3QoY29uc3QgRlhfUkVDVCYgcmVjdCkgeworICBDRlhfUGF0aERhdGEgcGF0aDsKKyAgcGF0aC5BcHBlbmRSZWN0KHJlY3QubGVmdCwgcmVjdC5ib3R0b20sIHJlY3QucmlnaHQsIHJlY3QudG9wKTsKKyAgaWYgKCFTZXRDbGlwX1BhdGhGaWxsKCZwYXRoLCBudWxscHRyLCBGWEZJTExfV0lORElORykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIFVwZGF0ZUNsaXBCb3goKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ0ZYX1JlbmRlckRldmljZTo6VXBkYXRlQ2xpcEJveCgpIHsKKyAgaWYgKG1fcERldmljZURyaXZlci0+R2V0Q2xpcEJveCgmbV9DbGlwQm94KSkKKyAgICByZXR1cm47CisgIG1fQ2xpcEJveC5sZWZ0ID0gMDsKKyAgbV9DbGlwQm94LnRvcCA9IDA7CisgIG1fQ2xpcEJveC5yaWdodCA9IG1fV2lkdGg7CisgIG1fQ2xpcEJveC5ib3R0b20gPSBtX0hlaWdodDsKK30KKworYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpEcmF3UGF0aFdpdGhCbGVuZChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cm9rZV9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgdWludDhfdCBzdHJva2VfYWxwaGEgPSBwR3JhcGhTdGF0ZSA/IEZYQVJHQl9BKHN0cm9rZV9jb2xvcikgOiAwOworICB1aW50OF90IGZpbGxfYWxwaGEgPSAoZmlsbF9tb2RlICYgMykgPyBGWEFSR0JfQShmaWxsX2NvbG9yKSA6IDA7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPEZYX1BBVEhQT0lOVD4mIHBQb2ludHMgPSBwUGF0aERhdGEtPkdldFBvaW50cygpOworICBpZiAoc3Ryb2tlX2FscGhhID09IDAgJiYgcFBvaW50cy5zaXplKCkgPT0gMikgeworICAgIENGWF9Qb2ludEYgcG9zMSA9IHBQb2ludHNbMF0ubV9Qb2ludDsKKyAgICBDRlhfUG9pbnRGIHBvczIgPSBwUG9pbnRzWzFdLm1fUG9pbnQ7CisgICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7CisgICAgICBwb3MxID0gcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybShwb3MxKTsKKyAgICAgIHBvczIgPSBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHBvczIpOworICAgIH0KKyAgICBEcmF3Q29zbWV0aWNMaW5lKHBvczEsIHBvczIsIGZpbGxfY29sb3IsIGZpbGxfbW9kZSwgYmxlbmRfdHlwZSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpZiAoKHBQb2ludHMuc2l6ZSgpID09IDUgfHwgcFBvaW50cy5zaXplKCkgPT0gNCkgJiYgc3Ryb2tlX2FscGhhID09IDApIHsKKyAgICBDRlhfRmxvYXRSZWN0IHJlY3RfZjsKKyAgICBpZiAoIShmaWxsX21vZGUgJiBGWEZJTExfUkVDVF9BQSkgJiYKKyAgICAgICAgcFBhdGhEYXRhLT5Jc1JlY3QocE9iamVjdDJEZXZpY2UsICZyZWN0X2YpKSB7CisgICAgICBGWF9SRUNUIHJlY3RfaSA9IHJlY3RfZi5HZXRPdXRlclJlY3QoKTsKKworICAgICAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0b3AvYm90dG9tLCBsZWZ0L3JpZ2h0IHZhbHVlcyBvZiB0aGUgcmVjdCBpdCdzCisgICAgICAvLyBwb3NzaWJsZSB0byBvdmVyZmxvdyB0aGUgV2lkdGgoKSBhbmQgSGVpZ2h0KCkgY2FsY3VsYXRpb25zLiBDaGVjayB0aGF0CisgICAgICAvLyB0aGUgcmVjdCB3aWxsIGhhdmUgdmFsaWQgZGltZW5zaW9uIGJlZm9yZSBjb250aW51aW5nLgorICAgICAgaWYgKCFyZWN0X2kuVmFsaWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBpbnQgd2lkdGggPSBzdGF0aWNfY2FzdDxpbnQ+KGNlaWwocmVjdF9mLnJpZ2h0IC0gcmVjdF9mLmxlZnQpKTsKKyAgICAgIGlmICh3aWR0aCA8IDEpIHsKKyAgICAgICAgd2lkdGggPSAxOworICAgICAgICBpZiAocmVjdF9pLmxlZnQgPT0gcmVjdF9pLnJpZ2h0KQorICAgICAgICAgICsrcmVjdF9pLnJpZ2h0OworICAgICAgfQorICAgICAgaW50IGhlaWdodCA9IHN0YXRpY19jYXN0PGludD4oY2VpbChyZWN0X2YudG9wIC0gcmVjdF9mLmJvdHRvbSkpOworICAgICAgaWYgKGhlaWdodCA8IDEpIHsKKyAgICAgICAgaGVpZ2h0ID0gMTsKKyAgICAgICAgaWYgKHJlY3RfaS5ib3R0b20gPT0gcmVjdF9pLnRvcCkKKyAgICAgICAgICArK3JlY3RfaS5ib3R0b207CisgICAgICB9CisgICAgICBpZiAocmVjdF9pLldpZHRoKCkgPj0gd2lkdGggKyAxKSB7CisgICAgICAgIGlmIChyZWN0X2YubGVmdCAtIHN0YXRpY19jYXN0PGZsb2F0PihyZWN0X2kubGVmdCkgPgorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHJlY3RfaS5yaWdodCkgLSByZWN0X2YucmlnaHQpIHsKKyAgICAgICAgICArK3JlY3RfaS5sZWZ0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC0tcmVjdF9pLnJpZ2h0OworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAocmVjdF9pLkhlaWdodCgpID49IGhlaWdodCArIDEpIHsKKyAgICAgICAgaWYgKHJlY3RfZi50b3AgLSBzdGF0aWNfY2FzdDxmbG9hdD4ocmVjdF9pLnRvcCkgPgorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHJlY3RfaS5ib3R0b20pIC0gcmVjdF9mLmJvdHRvbSkgeworICAgICAgICAgICsrcmVjdF9pLnRvcDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAtLXJlY3RfaS5ib3R0b207CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChGaWxsUmVjdFdpdGhCbGVuZCgmcmVjdF9pLCBmaWxsX2NvbG9yLCBibGVuZF90eXBlKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIGlmICgoZmlsbF9tb2RlICYgMykgJiYgc3Ryb2tlX2FscGhhID09IDAgJiYgIShmaWxsX21vZGUgJiBGWF9GSUxMX1NUUk9LRSkgJiYKKyAgICAgICEoZmlsbF9tb2RlICYgRlhfRklMTF9URVhUX01PREUpKSB7CisgICAgQ0ZYX1BhdGhEYXRhIG5ld1BhdGg7CisgICAgYm9vbCBiVGhpbiA9IGZhbHNlOworICAgIGJvb2wgc2V0SWRlbnRpdHkgPSBmYWxzZTsKKyAgICBpZiAocFBhdGhEYXRhLT5HZXRaZXJvQXJlYVBhdGgocE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEhbV9wRGV2aWNlRHJpdmVyLT5HZXREcml2ZXJUeXBlKCksICZuZXdQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYlRoaW4sICZzZXRJZGVudGl0eSkpIHsKKyAgICAgIENGWF9HcmFwaFN0YXRlRGF0YSBncmFwaFN0YXRlOworICAgICAgZ3JhcGhTdGF0ZS5tX0xpbmVXaWR0aCA9IDAuMGY7CisKKyAgICAgIHVpbnQzMl90IHN0cm9rZWNvbG9yID0gZmlsbF9jb2xvcjsKKyAgICAgIGlmIChiVGhpbikKKyAgICAgICAgc3Ryb2tlY29sb3IgPSAoKChmaWxsX2FscGhhID4+IDIpIDw8IDI0KSB8IChzdHJva2Vjb2xvciAmIDB4MDBmZmZmZmYpKTsKKworICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IG51bGxwdHI7CisgICAgICBpZiAocE9iamVjdDJEZXZpY2UgJiYgIXBPYmplY3QyRGV2aWNlLT5Jc0lkZW50aXR5KCkgJiYgIXNldElkZW50aXR5KQorICAgICAgICBwTWF0cml4ID0gcE9iamVjdDJEZXZpY2U7CisKKyAgICAgIGludCBzbW9vdGhfcGF0aCA9IEZYX1pFUk9BUkVBX0ZJTEw7CisgICAgICBpZiAoZmlsbF9tb2RlICYgRlhGSUxMX05PUEFUSFNNT09USCkKKyAgICAgICAgc21vb3RoX3BhdGggfD0gRlhGSUxMX05PUEFUSFNNT09USDsKKworICAgICAgbV9wRGV2aWNlRHJpdmVyLT5EcmF3UGF0aCgmbmV3UGF0aCwgcE1hdHJpeCwgJmdyYXBoU3RhdGUsIDAsIHN0cm9rZWNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbW9vdGhfcGF0aCwgYmxlbmRfdHlwZSk7CisgICAgfQorICB9CisgIGlmICgoZmlsbF9tb2RlICYgMykgJiYgZmlsbF9hbHBoYSAmJiBzdHJva2VfYWxwaGEgPCAweGZmICYmCisgICAgICAoZmlsbF9tb2RlICYgRlhfRklMTF9TVFJPS0UpKSB7CisgICAgaWYgKG1fUmVuZGVyQ2FwcyAmIEZYUkNfRklMTFNUUk9LRV9QQVRIKSB7CisgICAgICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5EcmF3UGF0aChwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLCBwR3JhcGhTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfY29sb3IsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRfdHlwZSk7CisgICAgfQorICAgIHJldHVybiBEcmF3RmlsbFN0cm9rZVBhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwgcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2NvbG9yLCBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSwgYmxlbmRfdHlwZSk7CisgIH0KKyAgcmV0dXJuIG1fcERldmljZURyaXZlci0+RHJhd1BhdGgocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwgcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfY29sb3IsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZF90eXBlKTsKK30KKworLy8gVGhpcyBjYW4gYmUgcmVtb3ZlZCBvbmNlIFBERml1bSBlbnRpcmVseSByZWxpZXMgb24gU2tpYQorYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpEcmF3RmlsbFN0cm9rZVBhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3Ryb2tlX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7CisgIGlmICghKG1fUmVuZGVyQ2FwcyAmIEZYUkNfR0VUX0JJVFMpKQorICAgIHJldHVybiBmYWxzZTsKKyAgQ0ZYX0Zsb2F0UmVjdCBiYm94OworICBpZiAocEdyYXBoU3RhdGUpIHsKKyAgICBiYm94ID0gcFBhdGhEYXRhLT5HZXRCb3VuZGluZ0JveChwR3JhcGhTdGF0ZS0+bV9MaW5lV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCk7CisgIH0gZWxzZSB7CisgICAgYmJveCA9IHBQYXRoRGF0YS0+R2V0Qm91bmRpbmdCb3goKTsKKyAgfQorICBpZiAocE9iamVjdDJEZXZpY2UpCisgICAgYmJveCA9IHBPYmplY3QyRGV2aWNlLT5UcmFuc2Zvcm1SZWN0KGJib3gpOworCisgIENGWF9NYXRyaXggY3RtID0gR2V0Q1RNKCk7CisgIGZsb2F0IGZTY2FsZVggPSBmYWJzKGN0bS5hKTsKKyAgZmxvYXQgZlNjYWxlWSA9IGZhYnMoY3RtLmQpOworICBGWF9SRUNUIHJlY3QgPSBiYm94LkdldE91dGVyUmVjdCgpOworICBhdXRvIGJpdG1hcCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfRElCaXRtYXA+KCk7CisgIGF1dG8gQmFja2Ryb3AgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOworICBpZiAoIUNyZWF0ZUNvbXBhdGlibGVCaXRtYXAoYml0bWFwLCBGWFNZU19yb3VuZChyZWN0LldpZHRoKCkgKiBmU2NhbGVYKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHJlY3QuSGVpZ2h0KCkgKiBmU2NhbGVZKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGJpdG1hcC0+SGFzQWxwaGEoKSkgeworICAgIGJpdG1hcC0+Q2xlYXIoMCk7CisgICAgQmFja2Ryb3AtPkNvcHkoYml0bWFwKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIW1fcERldmljZURyaXZlci0+R2V0RElCaXRzKGJpdG1hcCwgcmVjdC5sZWZ0LCByZWN0LnRvcCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgQmFja2Ryb3AtPkNvcHkoYml0bWFwKTsKKyAgfQorICBDRlhfRGVmYXVsdFJlbmRlckRldmljZSBiaXRtYXBfZGV2aWNlOworICBiaXRtYXBfZGV2aWNlLkF0dGFjaChiaXRtYXAsIGZhbHNlLCBCYWNrZHJvcCwgdHJ1ZSk7CisKKyAgQ0ZYX01hdHJpeCBtYXRyaXg7CisgIGlmIChwT2JqZWN0MkRldmljZSkKKyAgICBtYXRyaXggPSAqcE9iamVjdDJEZXZpY2U7CisgIG1hdHJpeC5UcmFuc2xhdGUoLXJlY3QubGVmdCwgLXJlY3QudG9wKTsKKyAgbWF0cml4LkNvbmNhdChDRlhfTWF0cml4KGZTY2FsZVgsIDAsIDAsIGZTY2FsZVksIDAsIDApKTsKKyAgaWYgKCFiaXRtYXBfZGV2aWNlLkdldERldmljZURyaXZlcigpLT5EcmF3UGF0aCgKKyAgICAgICAgICBwUGF0aERhdGEsICZtYXRyaXgsIHBHcmFwaFN0YXRlLCBmaWxsX2NvbG9yLCBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSwKKyAgICAgICAgICBibGVuZF90eXBlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorI2lmIGRlZmluZWQgX1NLSUFfU1VQUE9SVF8gfHwgZGVmaW5lZCBfU0tJQV9TVVBQT1JUX1BBVEhTXworICBiaXRtYXBfZGV2aWNlLkdldERldmljZURyaXZlcigpLT5GbHVzaCgpOworI2VuZGlmCisgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgRlhTWVNfcm91bmQocmVjdC5XaWR0aCgpICogZlNjYWxlWCksCisgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQocmVjdC5IZWlnaHQoKSAqIGZTY2FsZVkpKTsKKyAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U2V0RElCaXRzKGJpdG1hcCwgMCwgJnNyY19yZWN0LCByZWN0LmxlZnQsIHJlY3QudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfQkxFTkRfTk9STUFMKTsKK30KKworYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpGaWxsUmVjdFdpdGhCbGVuZChjb25zdCBGWF9SRUNUKiBwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgaWYgKG1fcERldmljZURyaXZlci0+RmlsbFJlY3RXaXRoQmxlbmQocFJlY3QsIGZpbGxfY29sb3IsIGJsZW5kX3R5cGUpKQorICAgIHJldHVybiB0cnVlOworCisgIGlmICghKG1fUmVuZGVyQ2FwcyAmIEZYUkNfR0VUX0JJVFMpKQorICAgIHJldHVybiBmYWxzZTsKKworICBhdXRvIGJpdG1hcCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfRElCaXRtYXA+KCk7CisgIGlmICghQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcChiaXRtYXAsIHBSZWN0LT5XaWR0aCgpLCBwUmVjdC0+SGVpZ2h0KCkpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoIW1fcERldmljZURyaXZlci0+R2V0RElCaXRzKGJpdG1hcCwgcFJlY3QtPmxlZnQsIHBSZWN0LT50b3ApKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoIWJpdG1hcC0+Q29tcG9zaXRlUmVjdCgwLCAwLCBwUmVjdC0+V2lkdGgoKSwgcFJlY3QtPkhlaWdodCgpLCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIHBSZWN0LT5XaWR0aCgpLCBwUmVjdC0+SGVpZ2h0KCkpOworICBtX3BEZXZpY2VEcml2ZXItPlNldERJQml0cyhiaXRtYXAsIDAsICZzcmNfcmVjdCwgcFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0JMRU5EX05PUk1BTCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENGWF9SZW5kZXJEZXZpY2U6OkRyYXdDb3NtZXRpY0xpbmUoY29uc3QgQ0ZYX1BvaW50RiYgcHRNb3ZlVG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHRMaW5lVG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgeworICBpZiAoKGNvbG9yID49IDB4ZmYwMDAwMDApICYmIG1fcERldmljZURyaXZlci0+RHJhd0Nvc21ldGljTGluZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRNb3ZlVG8sIHB0TGluZVRvLCBjb2xvciwgYmxlbmRfdHlwZSkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3JhcGhfc3RhdGU7CisgIENGWF9QYXRoRGF0YSBwYXRoOworICBwYXRoLkFwcGVuZFBvaW50KHB0TW92ZVRvLCBGWFBUX1RZUEU6Ok1vdmVUbywgZmFsc2UpOworICBwYXRoLkFwcGVuZFBvaW50KHB0TGluZVRvLCBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOworICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5EcmF3UGF0aCgmcGF0aCwgbnVsbHB0ciwgJmdyYXBoX3N0YXRlLCAwLCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9tb2RlLCBibGVuZF90eXBlKTsKK30KKworYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpHZXRESUJpdHMoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3ApIHsKKyAgcmV0dXJuIChtX1JlbmRlckNhcHMgJiBGWFJDX0dFVF9CSVRTKSAmJgorICAgICAgICAgbV9wRGV2aWNlRHJpdmVyLT5HZXRESUJpdHMocEJpdG1hcCwgbGVmdCwgdG9wKTsKK30KKworUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gQ0ZYX1JlbmRlckRldmljZTo6R2V0QmFja0Ryb3AoKSB7CisgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPkdldEJhY2tEcm9wKCk7Cit9CisKK2Jvb2wgQ0ZYX1JlbmRlckRldmljZTo6U2V0RElCaXRzV2l0aEJsZW5kKAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcEJpdG1hcCwKKyAgICBpbnQgbGVmdCwKKyAgICBpbnQgdG9wLAorICAgIGludCBibGVuZF9tb2RlKSB7CisgIEFTU0VSVCghcEJpdG1hcC0+SXNBbHBoYU1hc2soKSk7CisgIENGWF9NYXRyaXggY3RtID0gR2V0Q1RNKCk7CisgIGZsb2F0IGZTY2FsZVggPSBmYWJzKGN0bS5hKTsKKyAgZmxvYXQgZlNjYWxlWSA9IGZhYnMoY3RtLmQpOworICBGWF9SRUNUIGRlc3RfcmVjdChsZWZ0LCB0b3AsCisgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKGxlZnQgKyBwQml0bWFwLT5HZXRXaWR0aCgpIC8gZlNjYWxlWCksCisgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHRvcCArIHBCaXRtYXAtPkdldEhlaWdodCgpIC8gZlNjYWxlWSkpOworICBkZXN0X3JlY3QuSW50ZXJzZWN0KG1fQ2xpcEJveCk7CisgIGlmIChkZXN0X3JlY3QuSXNFbXB0eSgpKQorICAgIHJldHVybiB0cnVlOworCisgIEZYX1JFQ1Qgc3JjX3JlY3QoZGVzdF9yZWN0LmxlZnQgLSBsZWZ0LCBkZXN0X3JlY3QudG9wIC0gdG9wLAorICAgICAgICAgICAgICAgICAgIGRlc3RfcmVjdC5sZWZ0IC0gbGVmdCArIGRlc3RfcmVjdC5XaWR0aCgpLAorICAgICAgICAgICAgICAgICAgIGRlc3RfcmVjdC50b3AgLSB0b3AgKyBkZXN0X3JlY3QuSGVpZ2h0KCkpOworICBzcmNfcmVjdC5sZWZ0ID0gRlhTWVNfcm91bmQoc3JjX3JlY3QubGVmdCAqIGZTY2FsZVgpOworICBzcmNfcmVjdC50b3AgPSBGWFNZU19yb3VuZChzcmNfcmVjdC50b3AgKiBmU2NhbGVZKTsKKyAgc3JjX3JlY3QucmlnaHQgPSBGWFNZU19yb3VuZChzcmNfcmVjdC5yaWdodCAqIGZTY2FsZVgpOworICBzcmNfcmVjdC5ib3R0b20gPSBGWFNZU19yb3VuZChzcmNfcmVjdC5ib3R0b20gKiBmU2NhbGVZKTsKKyAgaWYgKChibGVuZF9tb2RlID09IEZYRElCX0JMRU5EX05PUk1BTCB8fCAobV9SZW5kZXJDYXBzICYgRlhSQ19CTEVORF9NT0RFKSkgJiYKKyAgICAgICghcEJpdG1hcC0+SGFzQWxwaGEoKSB8fCAobV9SZW5kZXJDYXBzICYgRlhSQ19BTFBIQV9JTUFHRSkpKSB7CisgICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U2V0RElCaXRzKHBCaXRtYXAsIDAsICZzcmNfcmVjdCwgZGVzdF9yZWN0LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcmVjdC50b3AsIGJsZW5kX21vZGUpOworICB9CisgIGlmICghKG1fUmVuZGVyQ2FwcyAmIEZYUkNfR0VUX0JJVFMpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpbnQgYmdfcGl4ZWxfd2lkdGggPSBGWFNZU19yb3VuZChkZXN0X3JlY3QuV2lkdGgoKSAqIGZTY2FsZVgpOworICBpbnQgYmdfcGl4ZWxfaGVpZ2h0ID0gRlhTWVNfcm91bmQoZGVzdF9yZWN0LkhlaWdodCgpICogZlNjYWxlWSk7CisgIGF1dG8gYmFja2dyb3VuZCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfRElCaXRtYXA+KCk7CisgIGlmICghYmFja2dyb3VuZC0+Q3JlYXRlKAorICAgICAgICAgIGJnX3BpeGVsX3dpZHRoLCBiZ19waXhlbF9oZWlnaHQsCisgICAgICAgICAgKG1fUmVuZGVyQ2FwcyAmIEZYUkNfQ01ZS19PVVRQVVQpID8gRlhESUJfQ215ayA6IEZYRElCX1JnYjMyKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIW1fcERldmljZURyaXZlci0+R2V0RElCaXRzKGJhY2tncm91bmQsIGRlc3RfcmVjdC5sZWZ0LCBkZXN0X3JlY3QudG9wKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIWJhY2tncm91bmQtPkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCBiZ19waXhlbF93aWR0aCwgYmdfcGl4ZWxfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwLCBzcmNfcmVjdC5sZWZ0LCBzcmNfcmVjdC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kX21vZGUsIG51bGxwdHIsIGZhbHNlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGWF9SRUNUIHJlY3QoMCwgMCwgYmdfcGl4ZWxfd2lkdGgsIGJnX3BpeGVsX2hlaWdodCk7CisgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPlNldERJQml0cyhiYWNrZ3JvdW5kLCAwLCAmcmVjdCwgZGVzdF9yZWN0LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3JlY3QudG9wLCBGWERJQl9CTEVORF9OT1JNQUwpOworfQorCitib29sIENGWF9SZW5kZXJEZXZpY2U6OlN0cmV0Y2hESUJpdHNXaXRoRmxhZ3NBbmRCbGVuZCgKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXAsCisgICAgaW50IGxlZnQsCisgICAgaW50IHRvcCwKKyAgICBpbnQgZGVzdF93aWR0aCwKKyAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgdWludDMyX3QgZmxhZ3MsCisgICAgaW50IGJsZW5kX21vZGUpIHsKKyAgRlhfUkVDVCBkZXN0X3JlY3QobGVmdCwgdG9wLCBsZWZ0ICsgZGVzdF93aWR0aCwgdG9wICsgZGVzdF9oZWlnaHQpOworICBGWF9SRUNUIGNsaXBfYm94ID0gbV9DbGlwQm94OworICBjbGlwX2JveC5JbnRlcnNlY3QoZGVzdF9yZWN0KTsKKyAgcmV0dXJuIGNsaXBfYm94LklzRW1wdHkoKSB8fCBtX3BEZXZpY2VEcml2ZXItPlN0cmV0Y2hESUJpdHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAsIDAsIGxlZnQsIHRvcCwgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9oZWlnaHQsICZjbGlwX2JveCwgZmxhZ3MsIGJsZW5kX21vZGUpOworfQorCitib29sIENGWF9SZW5kZXJEZXZpY2U6OlNldEJpdE1hc2soY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXJnYikgeworICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpKTsKKyAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U2V0RElCaXRzKHBCaXRtYXAsIGFyZ2IsICZzcmNfcmVjdCwgbGVmdCwgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfQkxFTkRfTk9STUFMKTsKK30KKworYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTdHJldGNoQml0TWFzayhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvcikgeworICByZXR1cm4gU3RyZXRjaEJpdE1hc2tXaXRoRmxhZ3MocEJpdG1hcCwgbGVmdCwgdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLCAwKTsKK30KKworYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTdHJldGNoQml0TWFza1dpdGhGbGFncygKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXAsCisgICAgaW50IGxlZnQsCisgICAgaW50IHRvcCwKKyAgICBpbnQgZGVzdF93aWR0aCwKKyAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgdWludDMyX3QgYXJnYiwKKyAgICB1aW50MzJfdCBmbGFncykgeworICBGWF9SRUNUIGRlc3RfcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBkZXN0X3dpZHRoLCB0b3AgKyBkZXN0X2hlaWdodCk7CisgIEZYX1JFQ1QgY2xpcF9ib3ggPSBtX0NsaXBCb3g7CisgIGNsaXBfYm94LkludGVyc2VjdChkZXN0X3JlY3QpOworICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TdHJldGNoRElCaXRzKHBCaXRtYXAsIGFyZ2IsIGxlZnQsIHRvcCwgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2hlaWdodCwgJmNsaXBfYm94LCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9CTEVORF9OT1JNQUwpOworfQorCitib29sIENGWF9SZW5kZXJEZXZpY2U6OlN0YXJ0RElCaXRzV2l0aEJsZW5kKAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcEJpdG1hcCwKKyAgICBpbnQgYml0bWFwX2FscGhhLAorICAgIHVpbnQzMl90IGFyZ2IsCisgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICB1aW50MzJfdCBmbGFncywKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0ltYWdlUmVuZGVyZXI+KiBoYW5kbGUsCisgICAgaW50IGJsZW5kX21vZGUpIHsKKyAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U3RhcnRESUJpdHMocEJpdG1hcCwgYml0bWFwX2FscGhhLCBhcmdiLCBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgaGFuZGxlLCBibGVuZF9tb2RlKTsKK30KKworYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpDb250aW51ZURJQml0cyhDRlhfSW1hZ2VSZW5kZXJlciogaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSkgeworICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5Db250aW51ZURJQml0cyhoYW5kbGUsIHBQYXVzZSk7Cit9CisKKyNpZmRlZiBfU0tJQV9TVVBQT1JUXwordm9pZCBDRlhfUmVuZGVyRGV2aWNlOjpEZWJ1Z1ZlcmlmeUJpdG1hcElzUHJlTXVsdGlwbGllZCgpIGNvbnN0IHsKKyAgU2tBU1NFUlQoMCk7Cit9CisKK2Jvb2wgQ0ZYX1JlbmRlckRldmljZTo6U2V0Qml0c1dpdGhNYXNrKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U2V0Qml0c1dpdGhNYXNrKHBCaXRtYXAsIHBNYXNrLCBsZWZ0LCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXBfYWxwaGEsIGJsZW5kX3R5cGUpOworfQorI2VuZGlmCisKK2Jvb2wgQ0ZYX1JlbmRlckRldmljZTo6RHJhd05vcm1hbFRleHQoaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFRleHQyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0ZXh0X2ZsYWdzKSB7CisgIGludCBuYXRpdmV0ZXh0X2ZsYWdzID0gdGV4dF9mbGFnczsKKyAgaWYgKG1fRGV2aWNlQ2xhc3MgIT0gRlhEQ19ESVNQTEFZKSB7CisgICAgaWYgKCEodGV4dF9mbGFncyAmIEZYVEVYVF9QUklOVEdSQVBISUNURVhUKSkgeworICAgICAgaWYgKFNob3VsZERyYXdEZXZpY2VUZXh0KHBGb250LCB0ZXh0X2ZsYWdzKSAmJgorICAgICAgICAgIG1fcERldmljZURyaXZlci0+RHJhd0RldmljZVRleHQobkNoYXJzLCBwQ2hhclBvcywgcEZvbnQsIHBUZXh0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRfc2l6ZSwgZmlsbF9jb2xvcikpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIGlmIChGWEFSR0JfQShmaWxsX2NvbG9yKSA8IDI1NSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIGlmICghKHRleHRfZmxhZ3MgJiBGWFRFWFRfTk9fTkFUSVZFVEVYVCkpIHsKKyAgICBpZiAoU2hvdWxkRHJhd0RldmljZVRleHQocEZvbnQsIHRleHRfZmxhZ3MpICYmCisgICAgICAgIG1fcERldmljZURyaXZlci0+RHJhd0RldmljZVRleHQobkNoYXJzLCBwQ2hhclBvcywgcEZvbnQsIHBUZXh0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X3NpemUsIGZpbGxfY29sb3IpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgQ0ZYX01hdHJpeCBjaGFyMmRldmljZTsKKyAgQ0ZYX01hdHJpeCB0ZXh0MkRldmljZTsKKyAgaWYgKHBUZXh0MkRldmljZSkgeworICAgIGNoYXIyZGV2aWNlID0gKnBUZXh0MkRldmljZTsKKyAgICB0ZXh0MkRldmljZSA9ICpwVGV4dDJEZXZpY2U7CisgIH0KKworICBjaGFyMmRldmljZS5TY2FsZShmb250X3NpemUsIC1mb250X3NpemUpOworICBpZiAoZmFicyhjaGFyMmRldmljZS5hKSArIGZhYnMoY2hhcjJkZXZpY2UuYikgPiA1MCAqIDEuMGYgfHwKKyAgICAgICgobV9EZXZpY2VDbGFzcyA9PSBGWERDX1BSSU5URVIpICYmCisgICAgICAgISh0ZXh0X2ZsYWdzICYgRlhURVhUX1BSSU5USU1BR0VURVhUKSkpIHsKKyAgICBpZiAocEZvbnQtPkdldEZhY2UoKSkgeworICAgICAgaW50IG5QYXRoRmxhZ3MgPQorICAgICAgICAgICh0ZXh0X2ZsYWdzICYgRlhURVhUX05PU01PT1RIKSA9PSAwID8gMCA6IEZYRklMTF9OT1BBVEhTTU9PVEg7CisgICAgICByZXR1cm4gRHJhd1RleHRQYXRoKG5DaGFycywgcENoYXJQb3MsIHBGb250LCBmb250X3NpemUsIHBUZXh0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0ciwgZmlsbF9jb2xvciwgMCwgbnVsbHB0ciwgblBhdGhGbGFncyk7CisgICAgfQorICB9CisgIGludCBhbnRpX2FsaWFzID0gRlhGVF9SRU5ERVJfTU9ERV9NT05POworICBib29sIGJOb3JtYWwgPSBmYWxzZTsKKyAgaWYgKCh0ZXh0X2ZsYWdzICYgRlhURVhUX05PU01PT1RIKSA9PSAwKSB7CisgICAgaWYgKG1fRGV2aWNlQ2xhc3MgPT0gRlhEQ19ESVNQTEFZICYmIG1fYnBwID4gMSkgeworICAgICAgaWYgKCFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPkZUTGlicmFyeVN1cHBvcnRzSGludGluZygpKSB7CisgICAgICAgIC8vIFNvbWUgRnJlZXR5cGUgaW1wbGVtZW50YXRpb25zIChsaWtlIHRoZSBvbmUgcGFja2FnZWQgd2l0aCBGZWRvcmEpIGRvCisgICAgICAgIC8vIG5vdCBzdXBwb3J0IGhpbnRpbmcgZHVlIHRvIHBhdGVudHMgNjIxOTAyNSwgNjIzOTc4MywgNjMwNzU2NiwKKyAgICAgICAgLy8gNjIyNTk3MywgNjI0MzA3MCwgNjM5MzE0NSwgNjQyMTA1NCwgNjI4MjMyNywgYW5kIDY2MjQ4Mjg7IHRoZSBsYXRlc3QKKyAgICAgICAgLy8gb25lIGV4cGlyZXMgMTAvNy8xOS4gIFRoaXMgbWFrZXMgTENEIGFudGlhbGlhc2luZyB2ZXJ5IHVnbHksIHNvIHdlCisgICAgICAgIC8vIGluc3RlYWQgZmFsbCBiYWNrIG9uIE5PUk1BTCBhbnRpYWxpYXNpbmcuCisgICAgICAgIGFudGlfYWxpYXMgPSBGWEZUX1JFTkRFUl9NT0RFX05PUk1BTDsKKyAgICAgIH0gZWxzZSBpZiAoKG1fUmVuZGVyQ2FwcyAmIChGWFJDX0FMUEhBX09VVFBVVCB8IEZYUkNfQ01ZS19PVVRQVVQpKSkgeworICAgICAgICBhbnRpX2FsaWFzID0gRlhGVF9SRU5ERVJfTU9ERV9MQ0Q7CisgICAgICAgIGJOb3JtYWwgPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChtX2JwcCA8IDE2KSB7CisgICAgICAgIGFudGlfYWxpYXMgPSBGWEZUX1JFTkRFUl9NT0RFX05PUk1BTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFudGlfYWxpYXMgPSBGWEZUX1JFTkRFUl9NT0RFX0xDRDsKKworICAgICAgICBib29sIGJDbGVhclR5cGUgPSBmYWxzZTsKKyAgICAgICAgaWYgKHBGb250LT5HZXRGYWNlKCkpCisgICAgICAgICAgYkNsZWFyVHlwZSA9ICEhKHRleHRfZmxhZ3MgJiBGWFRFWFRfQ0xFQVJUWVBFKTsKKyAgICAgICAgYk5vcm1hbCA9ICFiQ2xlYXJUeXBlOworICAgICAgfQorICAgIH0KKyAgfQorICBzdGQ6OnZlY3RvcjxGWFRFWFRfR0xZUEhQT1M+IGdseXBocyhuQ2hhcnMpOworICBDRlhfTWF0cml4IG1hdHJpeENUTSA9IEdldENUTSgpOworICBmbG9hdCBzY2FsZV94ID0gZmFicyhtYXRyaXhDVE0uYSk7CisgIGZsb2F0IHNjYWxlX3kgPSBmYWJzKG1hdHJpeENUTS5kKTsKKyAgQ0ZYX01hdHJpeCBkZXZpY2VDdG0gPSBjaGFyMmRldmljZTsKKyAgQ0ZYX01hdHJpeCBtKHNjYWxlX3gsIDAsIDAsIHNjYWxlX3ksIDAsIDApOworICBkZXZpY2VDdG0uQ29uY2F0KG0pOworICB0ZXh0MkRldmljZS5Db25jYXQobSk7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBnbHlwaHMuc2l6ZSgpOyArK2kpIHsKKyAgICBGWFRFWFRfR0xZUEhQT1MmIGdseXBoID0gZ2x5cGhzW2ldOworICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TJiBjaGFycG9zID0gcENoYXJQb3NbaV07CisKKyAgICBnbHlwaC5tX2ZPcmlnaW4gPSB0ZXh0MkRldmljZS5UcmFuc2Zvcm0oY2hhcnBvcy5tX09yaWdpbik7CisgICAgaWYgKGFudGlfYWxpYXMgPCBGWEZUX1JFTkRFUl9NT0RFX0xDRCkKKyAgICAgIGdseXBoLm1fT3JpZ2luLnggPSBGWFNZU19yb3VuZChnbHlwaC5tX2ZPcmlnaW4ueCk7CisgICAgZWxzZQorICAgICAgZ2x5cGgubV9PcmlnaW4ueCA9IHN0YXRpY19jYXN0PGludD4oZmxvb3IoZ2x5cGgubV9mT3JpZ2luLngpKTsKKyAgICBnbHlwaC5tX09yaWdpbi55ID0gRlhTWVNfcm91bmQoZ2x5cGgubV9mT3JpZ2luLnkpOworCisgICAgaWYgKGNoYXJwb3MubV9iR2x5cGhBZGp1c3QpIHsKKyAgICAgIENGWF9NYXRyaXggbmV3X21hdHJpeCgKKyAgICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzBdLCBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzFdLAorICAgICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMl0sIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbM10sIDAsIDApOworICAgICAgbmV3X21hdHJpeC5Db25jYXQoZGV2aWNlQ3RtKTsKKyAgICAgIGdseXBoLm1fcEdseXBoID0gcEZvbnQtPkxvYWRHbHlwaEJpdG1hcCgKKyAgICAgICAgICBjaGFycG9zLm1fR2x5cGhJbmRleCwgY2hhcnBvcy5tX2JGb250U3R5bGUsICZuZXdfbWF0cml4LAorICAgICAgICAgIGNoYXJwb3MubV9Gb250Q2hhcldpZHRoLCBhbnRpX2FsaWFzLCBuYXRpdmV0ZXh0X2ZsYWdzKTsKKyAgICB9IGVsc2UgeworICAgICAgZ2x5cGgubV9wR2x5cGggPSBwRm9udC0+TG9hZEdseXBoQml0bWFwKAorICAgICAgICAgIGNoYXJwb3MubV9HbHlwaEluZGV4LCBjaGFycG9zLm1fYkZvbnRTdHlsZSwgJmRldmljZUN0bSwKKyAgICAgICAgICBjaGFycG9zLm1fRm9udENoYXJXaWR0aCwgYW50aV9hbGlhcywgbmF0aXZldGV4dF9mbGFncyk7CisgICAgfQorICB9CisgIGlmIChhbnRpX2FsaWFzIDwgRlhGVF9SRU5ERVJfTU9ERV9MQ0QgJiYgZ2x5cGhzLnNpemUoKSA+IDEpCisgICAgQWRqdXN0R2x5cGhTcGFjZSgmZ2x5cGhzKTsKKworICBGWF9SRUNUIGJtcF9yZWN0MSA9IEZYR0VfR2V0R2x5cGhzQkJveChnbHlwaHMsIGFudGlfYWxpYXMsIDEuMGYsIDEuMGYpOworICBpZiAoc2NhbGVfeCA+IDEgJiYgc2NhbGVfeSA+IDEpIHsKKyAgICAtLWJtcF9yZWN0MS5sZWZ0OworICAgIC0tYm1wX3JlY3QxLnRvcDsKKyAgICArK2JtcF9yZWN0MS5yaWdodDsKKyAgICArK2JtcF9yZWN0MS5ib3R0b207CisgIH0KKyAgRlhfUkVDVCBibXBfcmVjdChGWFNZU19yb3VuZCgoZmxvYXQpKGJtcF9yZWN0MS5sZWZ0KSAvIHNjYWxlX3gpLAorICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKChmbG9hdCkoYm1wX3JlY3QxLnRvcCkgLyBzY2FsZV95KSwKKyAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZCgoZmxvYXQpYm1wX3JlY3QxLnJpZ2h0IC8gc2NhbGVfeCksCisgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoKGZsb2F0KWJtcF9yZWN0MS5ib3R0b20gLyBzY2FsZV95KSk7CisgIGJtcF9yZWN0LkludGVyc2VjdChtX0NsaXBCb3gpOworICBpZiAoYm1wX3JlY3QuSXNFbXB0eSgpKQorICAgIHJldHVybiB0cnVlOworCisgIGludCBwaXhlbF93aWR0aCA9IEZYU1lTX3JvdW5kKGJtcF9yZWN0LldpZHRoKCkgKiBzY2FsZV94KTsKKyAgaW50IHBpeGVsX2hlaWdodCA9IEZYU1lTX3JvdW5kKGJtcF9yZWN0LkhlaWdodCgpICogc2NhbGVfeSk7CisgIGludCBwaXhlbF9sZWZ0ID0gRlhTWVNfcm91bmQoYm1wX3JlY3QubGVmdCAqIHNjYWxlX3gpOworICBpbnQgcGl4ZWxfdG9wID0gRlhTWVNfcm91bmQoYm1wX3JlY3QudG9wICogc2NhbGVfeSk7CisgIGlmIChhbnRpX2FsaWFzID09IEZYRlRfUkVOREVSX01PREVfTU9OTykgeworICAgIGF1dG8gYml0bWFwID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKTsKKyAgICBpZiAoIWJpdG1hcC0+Q3JlYXRlKHBpeGVsX3dpZHRoLCBwaXhlbF9oZWlnaHQsIEZYRElCXzFicHBNYXNrKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBiaXRtYXAtPkNsZWFyKDApOworICAgIGZvciAoY29uc3QgRlhURVhUX0dMWVBIUE9TJiBnbHlwaCA6IGdseXBocykgeworICAgICAgaWYgKCFnbHlwaC5tX3BHbHlwaCkKKyAgICAgICAgY29udGludWU7CisgICAgICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwR2x5cGggPSBnbHlwaC5tX3BHbHlwaC0+bV9wQml0bWFwOworICAgICAgYml0bWFwLT5UcmFuc2ZlckJpdG1hcCgKKyAgICAgICAgICBnbHlwaC5tX09yaWdpbi54ICsgZ2x5cGgubV9wR2x5cGgtPm1fTGVmdCAtIHBpeGVsX2xlZnQsCisgICAgICAgICAgZ2x5cGgubV9PcmlnaW4ueSAtIGdseXBoLm1fcEdseXBoLT5tX1RvcCAtIHBpeGVsX3RvcCwKKyAgICAgICAgICBwR2x5cGgtPkdldFdpZHRoKCksIHBHbHlwaC0+R2V0SGVpZ2h0KCksIHBHbHlwaCwgMCwgMCk7CisgICAgfQorICAgIHJldHVybiBTZXRCaXRNYXNrKGJpdG1hcCwgYm1wX3JlY3QubGVmdCwgYm1wX3JlY3QudG9wLCBmaWxsX2NvbG9yKTsKKyAgfQorICBhdXRvIGJpdG1hcCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfRElCaXRtYXA+KCk7CisgIGlmIChtX2JwcCA9PSA4KSB7CisgICAgaWYgKCFiaXRtYXAtPkNyZWF0ZShwaXhlbF93aWR0aCwgcGl4ZWxfaGVpZ2h0LCBGWERJQl84YnBwTWFzaykpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgaWYgKCFDcmVhdGVDb21wYXRpYmxlQml0bWFwKGJpdG1hcCwgcGl4ZWxfd2lkdGgsIHBpeGVsX2hlaWdodCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFiaXRtYXAtPkhhc0FscGhhKCkgJiYgIWJpdG1hcC0+SXNBbHBoYU1hc2soKSkgeworICAgIGJpdG1hcC0+Q2xlYXIoMHhGRkZGRkZGRik7CisgICAgaWYgKCFHZXRESUJpdHMoYml0bWFwLCBibXBfcmVjdC5sZWZ0LCBibXBfcmVjdC50b3ApKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIGJpdG1hcC0+Q2xlYXIoMCk7CisgICAgaWYgKGJpdG1hcC0+bV9wQWxwaGFNYXNrKQorICAgICAgYml0bWFwLT5tX3BBbHBoYU1hc2stPkNsZWFyKDApOworICB9CisgIGludCBkZXN0X3dpZHRoID0gcGl4ZWxfd2lkdGg7CisgIGludCBhID0gMDsKKyAgaW50IHIgPSAwOworICBpbnQgZyA9IDA7CisgIGludCBiID0gMDsKKyAgaWYgKGFudGlfYWxpYXMgPT0gRlhGVF9SRU5ERVJfTU9ERV9MQ0QpCisgICAgc3RkOjp0aWUoYSwgciwgZywgYikgPSBBcmdiRGVjb2RlKGZpbGxfY29sb3IpOworCisgIGZvciAoY29uc3QgRlhURVhUX0dMWVBIUE9TJiBnbHlwaCA6IGdseXBocykgeworICAgIGlmICghZ2x5cGgubV9wR2x5cGgpCisgICAgICBjb250aW51ZTsKKworICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8aW50PiBsZWZ0ID0gZ2x5cGgubV9PcmlnaW4ueDsKKyAgICBsZWZ0ICs9IGdseXBoLm1fcEdseXBoLT5tX0xlZnQ7CisgICAgbGVmdCAtPSBwaXhlbF9sZWZ0OworICAgIGlmICghbGVmdC5Jc1ZhbGlkKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPGludD4gdG9wID0gZ2x5cGgubV9PcmlnaW4ueTsKKyAgICB0b3AgLT0gZ2x5cGgubV9wR2x5cGgtPm1fVG9wOworICAgIHRvcCAtPSBwaXhlbF90b3A7CisgICAgaWYgKCF0b3AuSXNWYWxpZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcEdseXBoID0gZ2x5cGgubV9wR2x5cGgtPm1fcEJpdG1hcDsKKyAgICBpbnQgbmNvbHMgPSBwR2x5cGgtPkdldFdpZHRoKCk7CisgICAgaW50IG5yb3dzID0gcEdseXBoLT5HZXRIZWlnaHQoKTsKKyAgICBpZiAoYW50aV9hbGlhcyA9PSBGWEZUX1JFTkRFUl9NT0RFX05PUk1BTCkgeworICAgICAgaWYgKCFiaXRtYXAtPkNvbXBvc2l0ZU1hc2sobGVmdC5WYWx1ZU9yRGllKCksIHRvcC5WYWx1ZU9yRGllKCksIG5jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvd3MsIHBHbHlwaCwgZmlsbF9jb2xvciwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0JMRU5EX05PUk1BTCwgbnVsbHB0ciwgZmFsc2UsIDApKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBib29sIGJCR1JTdHJpcGUgPSAhISh0ZXh0X2ZsYWdzICYgRlhURVhUX0JHUl9TVFJJUEUpOworICAgIG5jb2xzIC89IDM7CisgICAgaW50IHhfc3VicGl4ZWwgPSBzdGF0aWNfY2FzdDxpbnQ+KGdseXBoLm1fZk9yaWdpbi54ICogMykgJSAzOworICAgIGludCBzdGFydF9jb2wgPQorICAgICAgICBwZGZpdW06OmJhc2U6OlZhbHVlT3JEaWVGb3JUeXBlPGludD4ocGRmaXVtOjpiYXNlOjpDaGVja01heChsZWZ0LCAwKSk7CisgICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQ+IGVuZF9jb2xfc2FmZSA9IGxlZnQ7CisgICAgZW5kX2NvbF9zYWZlICs9IG5jb2xzOworICAgIGlmICghZW5kX2NvbF9zYWZlLklzVmFsaWQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGludCBlbmRfY29sID0KKyAgICAgICAgc3RkOjptaW4oc3RhdGljX2Nhc3Q8aW50PihlbmRfY29sX3NhZmUuVmFsdWVPckRpZTxpbnQ+KCkpLCBkZXN0X3dpZHRoKTsKKyAgICBpZiAoc3RhcnRfY29sID49IGVuZF9jb2wpCisgICAgICBjb250aW51ZTsKKworICAgIERyYXdOb3JtYWxUZXh0SGVscGVyKGJpdG1hcCwgcEdseXBoLCBucm93cywgbGVmdC5WYWx1ZU9yRGllKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLlZhbHVlT3JEaWUoKSwgc3RhcnRfY29sLCBlbmRfY29sLCBiTm9ybWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJCR1JTdHJpcGUsIHhfc3VicGl4ZWwsIGEsIHIsIGcsIGIpOworICB9CisgIGlmIChiaXRtYXAtPklzQWxwaGFNYXNrKCkpCisgICAgU2V0Qml0TWFzayhiaXRtYXAsIGJtcF9yZWN0LmxlZnQsIGJtcF9yZWN0LnRvcCwgZmlsbF9jb2xvcik7CisgIGVsc2UKKyAgICBTZXRESUJpdHMoYml0bWFwLCBibXBfcmVjdC5sZWZ0LCBibXBfcmVjdC50b3ApOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpEcmF3VGV4dFBhdGgoaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBUZXh0MlVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0Igc3Ryb2tlX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhKiBwQ2xpcHBpbmdQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5GbGFnKSB7CisgIGZvciAoaW50IGlDaGFyID0gMDsgaUNoYXIgPCBuQ2hhcnM7ICsraUNoYXIpIHsKKyAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyYgY2hhcnBvcyA9IHBDaGFyUG9zW2lDaGFyXTsKKyAgICBDRlhfTWF0cml4IG1hdHJpeDsKKyAgICBpZiAoY2hhcnBvcy5tX2JHbHlwaEFkanVzdCkgeworICAgICAgbWF0cml4ID0gQ0ZYX01hdHJpeChjaGFycG9zLm1fQWRqdXN0TWF0cml4WzBdLCBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzJdLCBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwKTsKKyAgICB9CisgICAgbWF0cml4LkNvbmNhdChDRlhfTWF0cml4KGZvbnRfc2l6ZSwgMCwgMCwgZm9udF9zaXplLCBjaGFycG9zLm1fT3JpZ2luLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJwb3MubV9PcmlnaW4ueSkpOworICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGggPQorICAgICAgICBwRm9udC0+TG9hZEdseXBoUGF0aChjaGFycG9zLm1fR2x5cGhJbmRleCwgY2hhcnBvcy5tX0ZvbnRDaGFyV2lkdGgpOworICAgIGlmICghcFBhdGgpCisgICAgICBjb250aW51ZTsKKworICAgIG1hdHJpeC5Db25jYXQoKnBUZXh0MlVzZXIpOworCisgICAgQ0ZYX1BhdGhEYXRhIFRyYW5zZm9ybWVkUGF0aCgqcFBhdGgpOworICAgIFRyYW5zZm9ybWVkUGF0aC5UcmFuc2Zvcm0oJm1hdHJpeCk7CisgICAgaWYgKGZpbGxfY29sb3IgfHwgc3Ryb2tlX2NvbG9yKSB7CisgICAgICBpbnQgZmlsbF9tb2RlID0gbkZsYWc7CisgICAgICBpZiAoZmlsbF9jb2xvcikKKyAgICAgICAgZmlsbF9tb2RlIHw9IEZYRklMTF9XSU5ESU5HOworICAgICAgZmlsbF9tb2RlIHw9IEZYX0ZJTExfVEVYVF9NT0RFOworICAgICAgaWYgKCFEcmF3UGF0aFdpdGhCbGVuZCgmVHJhbnNmb3JtZWRQYXRoLCBwVXNlcjJEZXZpY2UsIHBHcmFwaFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2NvbG9yLCBzdHJva2VfY29sb3IsIGZpbGxfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfQkxFTkRfTk9STUFMKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIGlmIChwQ2xpcHBpbmdQYXRoKQorICAgICAgcENsaXBwaW5nUGF0aC0+QXBwZW5kKCZUcmFuc2Zvcm1lZFBhdGgsIHBVc2VyMkRldmljZSk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ0ZYX1JlbmRlckRldmljZTo6RHJhd0ZpbGxSZWN0KGNvbnN0IENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DT0xPUlJFRiYgY29sb3IpIHsKKyAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisgIENGWF9GbG9hdFJlY3QgcmNUZW1wKHJlY3QpOworICBwYXRoLkFwcGVuZFJlY3QocmNUZW1wLmxlZnQsIHJjVGVtcC5ib3R0b20sIHJjVGVtcC5yaWdodCwgcmNUZW1wLnRvcCk7CisgIERyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsIG51bGxwdHIsIGNvbG9yLCAwLCBGWEZJTExfV0lORElORyk7Cit9CisKK3ZvaWQgQ0ZYX1JlbmRlckRldmljZTo6RHJhd0ZpbGxBcmVhKGNvbnN0IENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYqIHBQdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NPTE9SUkVGJiBjb2xvcikgeworICBDRlhfUGF0aERhdGEgcGF0aDsKKyAgcGF0aC5BcHBlbmRQb2ludChwUHRzWzBdLCBGWFBUX1RZUEU6Ok1vdmVUbywgZmFsc2UpOworICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBuQ291bnQ7IGkrKykKKyAgICBwYXRoLkFwcGVuZFBvaW50KHBQdHNbaV0sIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7CisKKyAgRHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgbnVsbHB0ciwgY29sb3IsIDAsIEZYRklMTF9BTFRFUk5BVEUpOworfQorCit2b2lkIENGWF9SZW5kZXJEZXZpY2U6OkRyYXdTdHJva2VSZWN0KGNvbnN0IENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ09MT1JSRUYmIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmV2lkdGgpIHsKKyAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisgIENGWF9GbG9hdFJlY3QgcmNUZW1wKHJlY3QpOworICBwYXRoLkFwcGVuZFJlY3QocmNUZW1wLmxlZnQsIHJjVGVtcC5ib3R0b20sIHJjVGVtcC5yaWdodCwgcmNUZW1wLnRvcCk7CisKKyAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKKyAgZ3NkLm1fTGluZVdpZHRoID0gZldpZHRoOworCisgIERyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsICZnc2QsIDAsIGNvbG9yLCBGWEZJTExfQUxURVJOQVRFKTsKK30KKwordm9pZCBDRlhfUmVuZGVyRGV2aWNlOjpEcmF3U3Ryb2tlTGluZShjb25zdCBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0TW92ZVRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdExpbmVUbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ09MT1JSRUYmIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmV2lkdGgpIHsKKyAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisgIHBhdGguQXBwZW5kUG9pbnQocHRNb3ZlVG8sIEZYUFRfVFlQRTo6TW92ZVRvLCBmYWxzZSk7CisgIHBhdGguQXBwZW5kUG9pbnQocHRMaW5lVG8sIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7CisKKyAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKKyAgZ3NkLm1fTGluZVdpZHRoID0gZldpZHRoOworCisgIERyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsICZnc2QsIDAsIGNvbG9yLCBGWEZJTExfQUxURVJOQVRFKTsKK30KKwordm9pZCBDRlhfUmVuZGVyRGV2aWNlOjpEcmF3RmlsbFJlY3QoY29uc3QgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Db2xvciYgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5UcmFuc3BhcmVuY3kpIHsKKyAgRHJhd0ZpbGxSZWN0KHBVc2VyMkRldmljZSwgcmVjdCwgY29sb3IuVG9GWENvbG9yKG5UcmFuc3BhcmVuY3kpKTsKK30KKwordm9pZCBDRlhfUmVuZGVyRGV2aWNlOjpEcmF3U2hhZG93KGNvbnN0IENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJWZXJ0aWNhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJIb3Jpem9udGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9GbG9hdFJlY3QgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5UcmFuc3BhcmVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnRHcmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkVuZEdyYXkpIHsKKyAgZmxvYXQgZlN0ZXBHcmF5ID0gMS4wZjsKKworICBpZiAoYlZlcnRpY2FsKSB7CisgICAgZlN0ZXBHcmF5ID0gKG5FbmRHcmF5IC0gblN0YXJ0R3JheSkgLyByZWN0LkhlaWdodCgpOworCisgICAgZm9yIChmbG9hdCBmeSA9IHJlY3QuYm90dG9tICsgMC41ZjsgZnkgPD0gcmVjdC50b3AgLSAwLjVmOyBmeSArPSAxLjBmKSB7CisgICAgICBpbnQzMl90IG5HcmF5ID0gblN0YXJ0R3JheSArIChpbnQzMl90KShmU3RlcEdyYXkgKiAoZnkgLSByZWN0LmJvdHRvbSkpOworICAgICAgRHJhd1N0cm9rZUxpbmUocFVzZXIyRGV2aWNlLCBDRlhfUG9pbnRGKHJlY3QubGVmdCwgZnkpLAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RihyZWN0LnJpZ2h0LCBmeSksCisgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKG5UcmFuc3BhcmVuY3ksIG5HcmF5LCBuR3JheSwgbkdyYXkpLCAxLjVmKTsKKyAgICB9CisgIH0KKworICBpZiAoYkhvcml6b250YWwpIHsKKyAgICBmU3RlcEdyYXkgPSAobkVuZEdyYXkgLSBuU3RhcnRHcmF5KSAvIHJlY3QuV2lkdGgoKTsKKworICAgIGZvciAoZmxvYXQgZnggPSByZWN0LmxlZnQgKyAwLjVmOyBmeCA8PSByZWN0LnJpZ2h0IC0gMC41ZjsgZnggKz0gMS4wZikgeworICAgICAgaW50MzJfdCBuR3JheSA9IG5TdGFydEdyYXkgKyAoaW50MzJfdCkoZlN0ZXBHcmF5ICogKGZ4IC0gcmVjdC5sZWZ0KSk7CisgICAgICBEcmF3U3Ryb2tlTGluZShwVXNlcjJEZXZpY2UsIENGWF9Qb2ludEYoZngsIHJlY3QuYm90dG9tKSwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYoZngsIHJlY3QudG9wKSwKKyAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyZW5jeSwgbkdyYXksIG5HcmF5LCBuR3JheSksIDEuNWYpOworICAgIH0KKyAgfQorfQorCit2b2lkIENGWF9SZW5kZXJEZXZpY2U6OkRyYXdCb3JkZXIoY29uc3QgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Db2xvciYgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NvbG9yJiBjckxlZnRUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NvbG9yJiBjclJpZ2h0Qm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvcmRlclN0eWxlIG5TdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5UcmFuc3BhcmVuY3kpIHsKKyAgZmxvYXQgZkxlZnQgPSByZWN0LmxlZnQ7CisgIGZsb2F0IGZSaWdodCA9IHJlY3QucmlnaHQ7CisgIGZsb2F0IGZUb3AgPSByZWN0LnRvcDsKKyAgZmxvYXQgZkJvdHRvbSA9IHJlY3QuYm90dG9tOworCisgIGlmIChmV2lkdGggPiAwLjBmKSB7CisgICAgZmxvYXQgZkhhbGZXaWR0aCA9IGZXaWR0aCAvIDIuMGY7CisKKyAgICBzd2l0Y2ggKG5TdHlsZSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgIGNhc2UgQm9yZGVyU3R5bGU6OlNPTElEOiB7CisgICAgICAgIENGWF9QYXRoRGF0YSBwYXRoOworICAgICAgICBwYXRoLkFwcGVuZFJlY3QoZkxlZnQsIGZCb3R0b20sIGZSaWdodCwgZlRvcCk7CisgICAgICAgIHBhdGguQXBwZW5kUmVjdChmTGVmdCArIGZXaWR0aCwgZkJvdHRvbSArIGZXaWR0aCwgZlJpZ2h0IC0gZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgZlRvcCAtIGZXaWR0aCk7CisgICAgICAgIERyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsIG51bGxwdHIsIGNvbG9yLlRvRlhDb2xvcihuVHJhbnNwYXJlbmN5KSwKKyAgICAgICAgICAgICAgICAgMCwgRlhGSUxMX0FMVEVSTkFURSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBCb3JkZXJTdHlsZTo6REFTSDogeworICAgICAgICBDRlhfUGF0aERhdGEgcGF0aDsKKyAgICAgICAgcGF0aC5BcHBlbmRQb2ludCgKKyAgICAgICAgICAgIENGWF9Qb2ludEYoZkxlZnQgKyBmV2lkdGggLyAyLjBmLCBmQm90dG9tICsgZldpZHRoIC8gMi4wZiksCisgICAgICAgICAgICBGWFBUX1RZUEU6Ok1vdmVUbywgZmFsc2UpOworICAgICAgICBwYXRoLkFwcGVuZFBvaW50KAorICAgICAgICAgICAgQ0ZYX1BvaW50RihmTGVmdCArIGZXaWR0aCAvIDIuMGYsIGZUb3AgLSBmV2lkdGggLyAyLjBmKSwKKyAgICAgICAgICAgIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7CisgICAgICAgIHBhdGguQXBwZW5kUG9pbnQoCisgICAgICAgICAgICBDRlhfUG9pbnRGKGZSaWdodCAtIGZXaWR0aCAvIDIuMGYsIGZUb3AgLSBmV2lkdGggLyAyLjBmKSwKKyAgICAgICAgICAgIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7CisgICAgICAgIHBhdGguQXBwZW5kUG9pbnQoCisgICAgICAgICAgICBDRlhfUG9pbnRGKGZSaWdodCAtIGZXaWR0aCAvIDIuMGYsIGZCb3R0b20gKyBmV2lkdGggLyAyLjBmKSwKKyAgICAgICAgICAgIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7CisgICAgICAgIHBhdGguQXBwZW5kUG9pbnQoCisgICAgICAgICAgICBDRlhfUG9pbnRGKGZMZWZ0ICsgZldpZHRoIC8gMi4wZiwgZkJvdHRvbSArIGZXaWR0aCAvIDIuMGYpLAorICAgICAgICAgICAgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKKworICAgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOworICAgICAgICBnc2QuU2V0RGFzaENvdW50KDIpOworICAgICAgICBnc2QubV9EYXNoQXJyYXlbMF0gPSAzLjBmOworICAgICAgICBnc2QubV9EYXNoQXJyYXlbMV0gPSAzLjBmOworICAgICAgICBnc2QubV9EYXNoUGhhc2UgPSAwOworCisgICAgICAgIGdzZC5tX0xpbmVXaWR0aCA9IGZXaWR0aDsKKyAgICAgICAgRHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgJmdzZCwgMCwgY29sb3IuVG9GWENvbG9yKG5UcmFuc3BhcmVuY3kpLAorICAgICAgICAgICAgICAgICBGWEZJTExfV0lORElORyk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBCb3JkZXJTdHlsZTo6QkVWRUxFRDoKKyAgICAgIGNhc2UgQm9yZGVyU3R5bGU6OklOU0VUOiB7CisgICAgICAgIENGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7CisgICAgICAgIGdzZC5tX0xpbmVXaWR0aCA9IGZIYWxmV2lkdGg7CisKKyAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGhMVDsKKworICAgICAgICBwYXRoTFQuQXBwZW5kUG9pbnQoQ0ZYX1BvaW50RihmTGVmdCArIGZIYWxmV2lkdGgsIGZCb3R0b20gKyBmSGFsZldpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYUFRfVFlQRTo6TW92ZVRvLCBmYWxzZSk7CisgICAgICAgIHBhdGhMVC5BcHBlbmRQb2ludChDRlhfUG9pbnRGKGZMZWZ0ICsgZkhhbGZXaWR0aCwgZlRvcCAtIGZIYWxmV2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKKyAgICAgICAgcGF0aExULkFwcGVuZFBvaW50KENGWF9Qb2ludEYoZlJpZ2h0IC0gZkhhbGZXaWR0aCwgZlRvcCAtIGZIYWxmV2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKKyAgICAgICAgcGF0aExULkFwcGVuZFBvaW50KAorICAgICAgICAgICAgQ0ZYX1BvaW50RihmUmlnaHQgLSBmSGFsZldpZHRoICogMiwgZlRvcCAtIGZIYWxmV2lkdGggKiAyKSwKKyAgICAgICAgICAgIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7CisgICAgICAgIHBhdGhMVC5BcHBlbmRQb2ludCgKKyAgICAgICAgICAgIENGWF9Qb2ludEYoZkxlZnQgKyBmSGFsZldpZHRoICogMiwgZlRvcCAtIGZIYWxmV2lkdGggKiAyKSwKKyAgICAgICAgICAgIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7CisgICAgICAgIHBhdGhMVC5BcHBlbmRQb2ludCgKKyAgICAgICAgICAgIENGWF9Qb2ludEYoZkxlZnQgKyBmSGFsZldpZHRoICogMiwgZkJvdHRvbSArIGZIYWxmV2lkdGggKiAyKSwKKyAgICAgICAgICAgIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7CisgICAgICAgIHBhdGhMVC5BcHBlbmRQb2ludChDRlhfUG9pbnRGKGZMZWZ0ICsgZkhhbGZXaWR0aCwgZkJvdHRvbSArIGZIYWxmV2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKKworICAgICAgICBEcmF3UGF0aCgmcGF0aExULCBwVXNlcjJEZXZpY2UsICZnc2QsCisgICAgICAgICAgICAgICAgIGNyTGVmdFRvcC5Ub0ZYQ29sb3IoblRyYW5zcGFyZW5jeSksIDAsIEZYRklMTF9BTFRFUk5BVEUpOworCisgICAgICAgIENGWF9QYXRoRGF0YSBwYXRoUkI7CisgICAgICAgIHBhdGhSQi5BcHBlbmRQb2ludChDRlhfUG9pbnRGKGZSaWdodCAtIGZIYWxmV2lkdGgsIGZUb3AgLSBmSGFsZldpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYUFRfVFlQRTo6TW92ZVRvLCBmYWxzZSk7CisgICAgICAgIHBhdGhSQi5BcHBlbmRQb2ludCgKKyAgICAgICAgICAgIENGWF9Qb2ludEYoZlJpZ2h0IC0gZkhhbGZXaWR0aCwgZkJvdHRvbSArIGZIYWxmV2lkdGgpLAorICAgICAgICAgICAgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKKyAgICAgICAgcGF0aFJCLkFwcGVuZFBvaW50KENGWF9Qb2ludEYoZkxlZnQgKyBmSGFsZldpZHRoLCBmQm90dG9tICsgZkhhbGZXaWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOworICAgICAgICBwYXRoUkIuQXBwZW5kUG9pbnQoCisgICAgICAgICAgICBDRlhfUG9pbnRGKGZMZWZ0ICsgZkhhbGZXaWR0aCAqIDIsIGZCb3R0b20gKyBmSGFsZldpZHRoICogMiksCisgICAgICAgICAgICBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOworICAgICAgICBwYXRoUkIuQXBwZW5kUG9pbnQoCisgICAgICAgICAgICBDRlhfUG9pbnRGKGZSaWdodCAtIGZIYWxmV2lkdGggKiAyLCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIpLAorICAgICAgICAgICAgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKKyAgICAgICAgcGF0aFJCLkFwcGVuZFBvaW50KAorICAgICAgICAgICAgQ0ZYX1BvaW50RihmUmlnaHQgLSBmSGFsZldpZHRoICogMiwgZlRvcCAtIGZIYWxmV2lkdGggKiAyKSwKKyAgICAgICAgICAgIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7CisgICAgICAgIHBhdGhSQi5BcHBlbmRQb2ludChDRlhfUG9pbnRGKGZSaWdodCAtIGZIYWxmV2lkdGgsIGZUb3AgLSBmSGFsZldpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7CisKKyAgICAgICAgRHJhd1BhdGgoJnBhdGhSQiwgcFVzZXIyRGV2aWNlLCAmZ3NkLAorICAgICAgICAgICAgICAgICBjclJpZ2h0Qm90dG9tLlRvRlhDb2xvcihuVHJhbnNwYXJlbmN5KSwgMCwgRlhGSUxMX0FMVEVSTkFURSk7CisKKyAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisKKyAgICAgICAgcGF0aC5BcHBlbmRSZWN0KGZMZWZ0LCBmQm90dG9tLCBmUmlnaHQsIGZUb3ApOworICAgICAgICBwYXRoLkFwcGVuZFJlY3QoZkxlZnQgKyBmSGFsZldpZHRoLCBmQm90dG9tICsgZkhhbGZXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZSaWdodCAtIGZIYWxmV2lkdGgsIGZUb3AgLSBmSGFsZldpZHRoKTsKKworICAgICAgICBEcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3NkLCBjb2xvci5Ub0ZYQ29sb3IoblRyYW5zcGFyZW5jeSksIDAsCisgICAgICAgICAgICAgICAgIEZYRklMTF9BTFRFUk5BVEUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgQm9yZGVyU3R5bGU6OlVOREVSTElORTogeworICAgICAgICBDRlhfUGF0aERhdGEgcGF0aDsKKyAgICAgICAgcGF0aC5BcHBlbmRQb2ludChDRlhfUG9pbnRGKGZMZWZ0LCBmQm90dG9tICsgZldpZHRoIC8gMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9UWVBFOjpNb3ZlVG8sIGZhbHNlKTsKKyAgICAgICAgcGF0aC5BcHBlbmRQb2ludChDRlhfUG9pbnRGKGZSaWdodCwgZkJvdHRvbSArIGZXaWR0aCAvIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7CisKKyAgICAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKKyAgICAgICAgZ3NkLm1fTGluZVdpZHRoID0gZldpZHRoOworCisgICAgICAgIERyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsICZnc2QsIDAsIGNvbG9yLlRvRlhDb2xvcihuVHJhbnNwYXJlbmN5KSwKKyAgICAgICAgICAgICAgICAgRlhGSUxMX0FMVEVSTkFURSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitDRlhfUmVuZGVyRGV2aWNlOjpTdGF0ZVJlc3RvcmVyOjpTdGF0ZVJlc3RvcmVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UpCisgICAgOiBtX3BEZXZpY2UocERldmljZSkgeworICBtX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOworfQorCitDRlhfUmVuZGVyRGV2aWNlOjpTdGF0ZVJlc3RvcmVyOjp+U3RhdGVSZXN0b3JlcigpIHsKKyAgbV9wRGV2aWNlLT5SZXN0b3JlU3RhdGUoZmFsc2UpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaCBiL2NvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmgKaW5kZXggMmU5YWJmOS4uZDhjYjlhNiAxMDA2NDQKLS0tIGEvY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaAorKysgYi9jb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oCkBAIC05LDEyICs5LDE1IEBACiAKICNpbmNsdWRlIDxtZW1vcnk+CiAKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dlbW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfY29sb3IuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZvbnQuaCIKIAorY2xhc3MgQ0ZYX0RJQml0bWFwOwogY2xhc3MgQ0ZYX0ZvbnQ7CiBjbGFzcyBDRlhfR3JhcGhTdGF0ZURhdGE7CitjbGFzcyBDRlhfSW1hZ2VSZW5kZXJlcjsKK2NsYXNzIElGWF9QYXVzZUluZGljYXRvcjsKIGNsYXNzIElGWF9SZW5kZXJEZXZpY2VEcml2ZXI7CiAKICNkZWZpbmUgRlhEQ19ERVZJQ0VfQ0xBU1MgMQpAQCAtMjksNyArMzIsNiBAQAogCiAjZGVmaW5lIEZYUkNfR0VUX0JJVFMgMHgwMQogI2RlZmluZSBGWFJDX0JJVF9NQVNLIDB4MDIKLSNkZWZpbmUgRlhSQ19BTFBIQV9NQVNLIDB4MDQKICNkZWZpbmUgRlhSQ19BTFBIQV9QQVRIIDB4MTAKICNkZWZpbmUgRlhSQ19BTFBIQV9JTUFHRSAweDIwCiAjZGVmaW5lIEZYUkNfQUxQSEFfT1VUUFVUIDB4NDAKQEAgLTYwLDYgKzYyLDggQEAKICNkZWZpbmUgRlhURVhUX1BSSU5USU1BR0VURVhUIDB4MTAKICNkZWZpbmUgRlhURVhUX05PU01PT1RIIDB4MjAKIAorY2xhc3MgQ0ZYX1BhdGhEYXRhOworCiBlbnVtIGNsYXNzIEZYUFRfVFlQRSA6IHVpbnQ4X3QgeyBMaW5lVG8sIEJlemllclRvLCBNb3ZlVG8gfTsKIAogY2xhc3MgRlhURVhUX0NIQVJQT1MgewpAQCAtNjgsMTEgKzcyLDEyIEBACiAgIEZYVEVYVF9DSEFSUE9TKGNvbnN0IEZYVEVYVF9DSEFSUE9TJik7CiAgIH5GWFRFWFRfQ0hBUlBPUygpOwogCi0gIEZYX0ZMT0FUIG1fQWRqdXN0TWF0cml4WzRdOworICBmbG9hdCBtX0FkanVzdE1hdHJpeFs0XTsKICAgQ0ZYX1BvaW50RiBtX09yaWdpbjsKKyAgdWludDMyX3QgbV9Vbmljb2RlOwogICB1aW50MzJfdCBtX0dseXBoSW5kZXg7CiAgIGludDMyX3QgbV9Gb250Q2hhcldpZHRoOwotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCiAgIHVpbnQzMl90IG1fRXh0R0lEOwogI2VuZGlmCiAgIGludDMyX3QgbV9GYWxsYmFja0ZvbnRQb3NpdGlvbjsKQEAgLTgyLDYgKzg3LDE1IEBACiAKIGNsYXNzIENGWF9SZW5kZXJEZXZpY2UgewogIHB1YmxpYzoKKyAgY2xhc3MgU3RhdGVSZXN0b3JlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgU3RhdGVSZXN0b3JlcihDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlKTsKKyAgICB+U3RhdGVSZXN0b3JlcigpOworCisgICBwcml2YXRlOgorICAgIFVub3duZWRQdHI8Q0ZYX1JlbmRlckRldmljZT4gbV9wRGV2aWNlOworICB9OworCiAgIENGWF9SZW5kZXJEZXZpY2UoKTsKICAgdmlydHVhbCB+Q0ZYX1JlbmRlckRldmljZSgpOwogCkBAIC0xMDAsMTMgKzExNCwxNiBAQAogICBpbnQgR2V0UmVuZGVyQ2FwcygpIGNvbnN0IHsgcmV0dXJuIG1fUmVuZGVyQ2FwczsgfQogICBpbnQgR2V0RGV2aWNlQ2FwcyhpbnQgaWQpIGNvbnN0OwogICBDRlhfTWF0cml4IEdldENUTSgpIGNvbnN0OwotICBDRlhfRElCaXRtYXAqIEdldEJpdG1hcCgpIGNvbnN0IHsgcmV0dXJuIG1fcEJpdG1hcDsgfQotICB2b2lkIFNldEJpdG1hcChDRlhfRElCaXRtYXAqIHBCaXRtYXApIHsgbV9wQml0bWFwID0gcEJpdG1hcDsgfQotICBib29sIENyZWF0ZUNvbXBhdGlibGVCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwRElCLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIGNvbnN0OworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBHZXRCaXRtYXAoKSBjb25zdDsKKyAgdm9pZCBTZXRCaXRtYXAoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBCaXRtYXApOworICBib29sIENyZWF0ZUNvbXBhdGlibGVCaXRtYXAoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBESUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KSBjb25zdDsKICAgY29uc3QgRlhfUkVDVCYgR2V0Q2xpcEJveCgpIGNvbnN0IHsgcmV0dXJuIG1fQ2xpcEJveDsgfQogICBib29sIFNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUpOworICBib29sIFNldENsaXBfUmVjdChjb25zdCBDRlhfUmVjdEYmIHBSZWN0KTsKICAgYm9vbCBTZXRDbGlwX1JlY3QoY29uc3QgRlhfUkVDVCYgcFJlY3QpOwogICBib29sIFNldENsaXBfUGF0aFN0cm9rZShjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCkBAIC0xMjcsMjkgKzE0NCwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cm9rZV9jb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKTsKLSAgYm9vbCBTZXRQaXhlbChpbnQgeCwgaW50IHksIHVpbnQzMl90IGNvbG9yKTsKICAgYm9vbCBGaWxsUmVjdChjb25zdCBGWF9SRUNUKiBwUmVjdCwgdWludDMyX3QgY29sb3IpIHsKICAgICByZXR1cm4gRmlsbFJlY3RXaXRoQmxlbmQocFJlY3QsIGNvbG9yLCBGWERJQl9CTEVORF9OT1JNQUwpOwogICB9Ci0gIGJvb2wgRmlsbFJlY3RXaXRoQmxlbmQoY29uc3QgRlhfUkVDVCogcFJlY3QsIHVpbnQzMl90IGNvbG9yLCBpbnQgYmxlbmRfdHlwZSk7Ci0gIGJvb2wgRHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKTsKIAotICBib29sIEdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wKTsKLSAgQ0ZYX0RJQml0bWFwKiBHZXRCYWNrRHJvcCgpOwotICBib29sIFNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCkgeworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBHZXRCYWNrRHJvcCgpOworICBib29sIEdldERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3ApOworICBib29sIFNldERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wKSB7CiAgICAgcmV0dXJuIFNldERJQml0c1dpdGhCbGVuZChwQml0bWFwLCBsZWZ0LCB0b3AsIEZYRElCX0JMRU5EX05PUk1BTCk7CiAgIH0KLSAgYm9vbCBTZXRESUJpdHNXaXRoQmxlbmQoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgYm9vbCBTZXRESUJpdHNXaXRoQmxlbmQoY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwQml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpOwotICBib29sIFN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgYm9vbCBTdHJldGNoRElCaXRzKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcEJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAogICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLApAQCAtMTU3LDYwICsxNjUsNTkgQEAKICAgICByZXR1cm4gU3RyZXRjaERJQml0c1dpdGhGbGFnc0FuZEJsZW5kKHBCaXRtYXAsIGxlZnQsIHRvcCwgZGVzdF93aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfaGVpZ2h0LCAwLCBGWERJQl9CTEVORF9OT1JNQUwpOwogICB9Ci0gIGJvb2wgU3RyZXRjaERJQml0c1dpdGhGbGFnc0FuZEJsZW5kKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgIGJvb2wgU3RyZXRjaERJQml0c1dpdGhGbGFnc0FuZEJsZW5kKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcEJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSk7Ci0gIGJvb2wgU2V0Qml0TWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICBib29sIFNldEJpdE1hc2soY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwQml0bWFwLAogICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCiAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAogICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IpOwotICBib29sIFN0cmV0Y2hCaXRNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgIGJvb2wgU3RyZXRjaEJpdE1hc2soY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwQml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAogICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yKTsKLSAgYm9vbCBTdHJldGNoQml0TWFza1dpdGhGbGFncyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICBib29sIFN0cmV0Y2hCaXRNYXNrV2l0aEZsYWdzKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcEJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7Ci0gIGJvb2wgU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgYm9vbCBTdGFydERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAogICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAotICAgICAgICAgICAgICAgICAgIHZvaWQqJiBoYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0ltYWdlUmVuZGVyZXI+KiBoYW5kbGUpIHsKICAgICByZXR1cm4gU3RhcnRESUJpdHNXaXRoQmxlbmQocEJpdG1hcCwgYml0bWFwX2FscGhhLCBjb2xvciwgcE1hdHJpeCwgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwgRlhESUJfQkxFTkRfTk9STUFMKTsKICAgfQotICBib29sIFN0YXJ0RElCaXRzV2l0aEJsZW5kKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgIGJvb2wgU3RhcnRESUJpdHNXaXRoQmxlbmQoY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwQml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfSW1hZ2VSZW5kZXJlcj4qIGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSk7Ci0gIGJvb2wgQ29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gIHZvaWQgQ2FuY2VsRElCaXRzKHZvaWQqIGhhbmRsZSk7CisgIGJvb2wgQ29udGludWVESUJpdHMoQ0ZYX0ltYWdlUmVuZGVyZXIqIGhhbmRsZSwgSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpOwogCiAgIGJvb2wgRHJhd05vcm1hbFRleHQoaW50IG5DaGFycywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFRleHQyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpbGxfY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdGV4dF9mbGFncyk7CiAgIGJvb2wgRHJhd1RleHRQYXRoKGludCBuQ2hhcnMsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZvbnRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFRleHQyVXNlciwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLApAQCAtMjE5LDE3ICsyMjYsNTMgQEAKICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhKiBwQ2xpcHBpbmdQYXRoLAogICAgICAgICAgICAgICAgICAgICBpbnQgbkZsYWcpOwogCisgIHZvaWQgRHJhd0ZpbGxSZWN0KGNvbnN0IENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NvbG9yJiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuVHJhbnNwYXJlbmN5KTsKKyAgdm9pZCBEcmF3RmlsbFJlY3QoY29uc3QgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DT0xPUlJFRiYgY29sb3IpOworICB2b2lkIERyYXdTdHJva2VSZWN0KGNvbnN0IENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NPTE9SUkVGJiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmV2lkdGgpOworICB2b2lkIERyYXdTdHJva2VMaW5lKGNvbnN0IENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdE1vdmVUbywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdExpbmVUbywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DT0xPUlJFRiYgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZldpZHRoKTsKKyAgdm9pZCBEcmF3Qm9yZGVyKGNvbnN0IENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICBmbG9hdCBmV2lkdGgsCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ29sb3ImIGNvbG9yLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NvbG9yJiBjckxlZnRUb3AsCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ29sb3ImIGNyUmlnaHRCb3R0b20sCisgICAgICAgICAgICAgICAgICBCb3JkZXJTdHlsZSBuU3R5bGUsCisgICAgICAgICAgICAgICAgICBpbnQzMl90IG5UcmFuc3BhcmVuY3kpOworICB2b2lkIERyYXdGaWxsQXJlYShjb25zdCBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYqIHBQdHMsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DT0xPUlJFRiYgY29sb3IpOworICB2b2lkIERyYXdTaGFkb3coY29uc3QgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgYm9vbCBiVmVydGljYWwsCisgICAgICAgICAgICAgICAgICBib29sIGJIb3Jpem9udGFsLAorICAgICAgICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0LAorICAgICAgICAgICAgICAgICAgaW50MzJfdCBuVHJhbnNwYXJlbmN5LAorICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnRHcmF5LAorICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRW5kR3JheSk7CisKICNpZmRlZiBfU0tJQV9TVVBQT1JUXwogICB2aXJ0dWFsIHZvaWQgRGVidWdWZXJpZnlCaXRtYXBJc1ByZU11bHRpcGxpZWQoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIFNldEJpdHNXaXRoTWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBNYXNrLAorICB2aXJ0dWFsIGJvb2wgU2V0Qml0c1dpdGhNYXNrKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSk7CiAjZW5kaWYKICNpZiBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfIHx8IGRlZmluZWQgX1NLSUFfU1VQUE9SVF9QQVRIU18KLSAgdm9pZCBGbHVzaCgpOworICB2b2lkIEZsdXNoKGJvb2wgcmVsZWFzZSk7CiAjZW5kaWYKIAogIHByaXZhdGU6CkBAIC0yNDIsOCArMjg1LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cm9rZV9jb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpOworICBib29sIERyYXdDb3NtZXRpY0xpbmUoY29uc3QgQ0ZYX1BvaW50RiYgcHRNb3ZlVG8sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdExpbmVUbywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKTsKKyAgYm9vbCBGaWxsUmVjdFdpdGhCbGVuZChjb25zdCBGWF9SRUNUKiBwUmVjdCwgdWludDMyX3QgY29sb3IsIGludCBibGVuZF90eXBlKTsKIAotICBDRlhfRElCaXRtYXAqIG1fcEJpdG1hcDsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gbV9wQml0bWFwOwogICBpbnQgbV9XaWR0aDsKICAgaW50IG1fSGVpZ2h0OwogICBpbnQgbV9icHA7CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvY2Z4X3N1YnN0Zm9udC5jcHAgYi9jb3JlL2Z4Z2UvY2Z4X3N1YnN0Zm9udC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM1NDU5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9jZnhfc3Vic3Rmb250LmNwcApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3N1YnN0Zm9udC5oIgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb2RlcGFnZS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mb250LmgiCisKK0NGWF9TdWJzdEZvbnQ6OkNGWF9TdWJzdEZvbnQoKQorICAgIDogbV9DaGFyc2V0KEZYX0NIQVJTRVRfQU5TSSksCisgICAgICBtX1dlaWdodCgwKSwKKyAgICAgIG1fSXRhbGljQW5nbGUoMCksCisgICAgICBtX1dlaWdodENKSygwKSwKKyAgICAgIG1fYlN1YnN0Q0pLKGZhbHNlKSwKKyAgICAgIG1fYkl0YWxpY0NKSyhmYWxzZSksCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgICAgIG1fYkZsYWdJdGFsaWMoZmFsc2UpLAorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICAgICAgbV9iRmxhZ01NKGZhbHNlKSB7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvY2Z4X3N1YnN0Zm9udC5oIGIvY29yZS9meGdlL2NmeF9zdWJzdGZvbnQuaAppbmRleCAwMTE5NmQ0Li5lNmQ5M2E4IDEwMDY0NAotLS0gYS9jb3JlL2Z4Z2UvY2Z4X3N1YnN0Zm9udC5oCisrKyBiL2NvcmUvZnhnZS9jZnhfc3Vic3Rmb250LmgKQEAgLTksMjEgKzksMjIgQEAKIAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCiAKLSNkZWZpbmUgRlhGT05UX1NVQlNUX01NIDB4MDEKLSNkZWZpbmUgRlhGT05UX1NVQlNUX0VYQUNUIDB4NDAKLQogY2xhc3MgQ0ZYX1N1YnN0Rm9udCB7CiAgcHVibGljOgogICBDRlhfU3Vic3RGb250KCk7CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgbV9GYW1pbHk7CisgIEJ5dGVTdHJpbmcgbV9GYW1pbHk7CiAgIGludCBtX0NoYXJzZXQ7Ci0gIHVpbnQzMl90IG1fU3Vic3RGbGFnczsKICAgaW50IG1fV2VpZ2h0OwogICBpbnQgbV9JdGFsaWNBbmdsZTsKLSAgYm9vbCBtX2JTdWJzdENKSzsKICAgaW50IG1fV2VpZ2h0Q0pLOworICBib29sIG1fYlN1YnN0Q0pLOwogICBib29sIG1fYkl0YWxpY0NKSzsKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIGJvb2wgbV9iRmxhZ0l0YWxpYzsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgYm9vbCBtX2JGbGFnTU07CiB9OwogCiAjZW5kaWYgIC8vIENPUkVfRlhHRV9DRlhfU1VCU1RGT05UX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvY2Z4X3VuaWNvZGVlbmNvZGluZy5jcHAgYi9jb3JlL2Z4Z2UvY2Z4X3VuaWNvZGVlbmNvZGluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ2YjYyYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9jZnhfdW5pY29kZWVuY29kaW5nLmNwcApAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3VuaWNvZGVlbmNvZGluZy5oIgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb2RlcGFnZS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZm9udC5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mb250LmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZyZWV0eXBlLmgiCisKK0NGWF9Vbmljb2RlRW5jb2Rpbmc6OkNGWF9Vbmljb2RlRW5jb2RpbmcoQ0ZYX0ZvbnQqIHBGb250KSA6IG1fcEZvbnQocEZvbnQpIHt9CisKK0NGWF9Vbmljb2RlRW5jb2Rpbmc6On5DRlhfVW5pY29kZUVuY29kaW5nKCkge30KKwordWludDMyX3QgQ0ZYX1VuaWNvZGVFbmNvZGluZzo6R2x5cGhGcm9tQ2hhckNvZGUodWludDMyX3QgY2hhcmNvZGUpIHsKKyAgRlhGVF9GYWNlIGZhY2UgPSBtX3BGb250LT5HZXRGYWNlKCk7CisgIGlmICghZmFjZSkKKyAgICByZXR1cm4gY2hhcmNvZGU7CisKKyAgaWYgKEZYRlRfU2VsZWN0X0NoYXJtYXAoZmFjZSwgRlhGVF9FTkNPRElOR19VTklDT0RFKSA9PSAwKQorICAgIHJldHVybiBGWEZUX0dldF9DaGFyX0luZGV4KGZhY2UsIGNoYXJjb2RlKTsKKworICBpZiAobV9wRm9udC0+R2V0U3Vic3RGb250KCkgJiYKKyAgICAgIG1fcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX0NoYXJzZXQgPT0gRlhfQ0hBUlNFVF9TeW1ib2wpIHsKKyAgICB1aW50MzJfdCBpbmRleCA9IDA7CisgICAgaWYgKEZYRlRfU2VsZWN0X0NoYXJtYXAoZmFjZSwgRlhGVF9FTkNPRElOR19NU19TWU1CT0wpID09IDApCisgICAgICBpbmRleCA9IEZYRlRfR2V0X0NoYXJfSW5kZXgoZmFjZSwgY2hhcmNvZGUpOworICAgIGlmICghaW5kZXggJiYgIUZYRlRfU2VsZWN0X0NoYXJtYXAoZmFjZSwgRlhGVF9FTkNPRElOR19BUFBMRV9ST01BTikpCisgICAgICByZXR1cm4gRlhGVF9HZXRfQ2hhcl9JbmRleChmYWNlLCBjaGFyY29kZSk7CisgIH0KKyAgcmV0dXJuIGNoYXJjb2RlOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2NmeF91bmljb2RlZW5jb2RpbmcuaCBiL2NvcmUvZnhnZS9jZnhfdW5pY29kZWVuY29kaW5nLmgKaW5kZXggN2QwMjA4OS4uZjhiY2ZmMyAxMDA2NDQKLS0tIGEvY29yZS9meGdlL2NmeF91bmljb2RlZW5jb2RpbmcuaAorKysgYi9jb3JlL2Z4Z2UvY2Z4X3VuaWNvZGVlbmNvZGluZy5oCkBAIC03LDEwICs3LDcgQEAKICNpZm5kZWYgQ09SRV9GWEdFX0NGWF9VTklDT0RFRU5DT0RJTkdfSF8KICNkZWZpbmUgQ09SRV9GWEdFX0NGWF9VTklDT0RFRU5DT0RJTkdfSF8KIAotI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mb250LmgiCi0KLSNkZWZpbmUgRU5DT0RJTkdfSU5URVJOQUwgMAotI2RlZmluZSBFTkNPRElOR19VTklDT0RFIDEKKyNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2lmZGVmIFBERl9FTkFCTEVfWEZBCiAjZGVmaW5lIEZYRk1fRU5DX1RBRyhhLCBiLCBjLCBkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTMyLDYgKzI5LDggQEAKICNkZWZpbmUgRlhGTV9FTkNPRElOR19BUFBMRV9ST01BTiBGWEZNX0VOQ19UQUcoJ2EnLCAncicsICdtJywgJ24nKQogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCitjbGFzcyBDRlhfRm9udDsKKwogY2xhc3MgQ0ZYX1VuaWNvZGVFbmNvZGluZyB7CiAgcHVibGljOgogICBleHBsaWNpdCBDRlhfVW5pY29kZUVuY29kaW5nKENGWF9Gb250KiBwRm9udCk7CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvY2Z4X3VuaWNvZGVlbmNvZGluZ2V4LmNwcCBiL2NvcmUvZnhnZS9jZnhfdW5pY29kZWVuY29kaW5nZXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZGI3NDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Z2UvY2Z4X3VuaWNvZGVlbmNvZGluZ2V4LmNwcApAQCAtMCwwICsxLDEwMiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF91bmljb2RlZW5jb2RpbmdleC5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9mb250LmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZvbnQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IHVpbnQzMl90IGdfRW5jb2RpbmdJRFtdID0geworICAgIEZYRk1fRU5DT0RJTkdfTVNfU1lNQk9MLCAgICAgRlhGTV9FTkNPRElOR19VTklDT0RFLAorICAgIEZYRk1fRU5DT0RJTkdfTVNfU0pJUywgICAgICAgRlhGTV9FTkNPRElOR19NU19HQjIzMTIsCisgICAgRlhGTV9FTkNPRElOR19NU19CSUc1LCAgICAgICBGWEZNX0VOQ09ESU5HX01TX1dBTlNVTkcsCisgICAgRlhGTV9FTkNPRElOR19NU19KT0hBQiwgICAgICBGWEZNX0VOQ09ESU5HX0FET0JFX1NUQU5EQVJELAorICAgIEZYRk1fRU5DT0RJTkdfQURPQkVfRVhQRVJULCAgRlhGTV9FTkNPRElOR19BRE9CRV9DVVNUT00sCisgICAgRlhGTV9FTkNPRElOR19BRE9CRV9MQVRJTl8xLCBGWEZNX0VOQ09ESU5HX09MRF9MQVRJTl8yLAorICAgIEZYRk1fRU5DT0RJTkdfQVBQTEVfUk9NQU4sCit9OworCitzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1VuaWNvZGVFbmNvZGluZ0V4PiBGWEZNX0NyZWF0ZUZvbnRFbmNvZGluZygKKyAgICBDRlhfRm9udCogcEZvbnQsCisgICAgdWludDMyX3QgbkVuY29kaW5nSUQpIHsKKyAgaWYgKEZYRlRfU2VsZWN0X0NoYXJtYXAocEZvbnQtPkdldEZhY2UoKSwgbkVuY29kaW5nSUQpKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9Vbmljb2RlRW5jb2RpbmdFeD4ocEZvbnQsIG5FbmNvZGluZ0lEKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0NGWF9Vbmljb2RlRW5jb2RpbmdFeDo6Q0ZYX1VuaWNvZGVFbmNvZGluZ0V4KENGWF9Gb250KiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEVuY29kaW5nSUQpCisgICAgOiBDRlhfVW5pY29kZUVuY29kaW5nKHBGb250KSwgbV9uRW5jb2RpbmdJRChFbmNvZGluZ0lEKSB7fQorCitDRlhfVW5pY29kZUVuY29kaW5nRXg6On5DRlhfVW5pY29kZUVuY29kaW5nRXgoKSB7fQorCit1aW50MzJfdCBDRlhfVW5pY29kZUVuY29kaW5nRXg6OkdseXBoRnJvbUNoYXJDb2RlKHVpbnQzMl90IGNoYXJjb2RlKSB7CisgIEZYRlRfRmFjZSBmYWNlID0gbV9wRm9udC0+R2V0RmFjZSgpOworICBGVF9VSW50IG5JbmRleCA9IEZYRlRfR2V0X0NoYXJfSW5kZXgoZmFjZSwgY2hhcmNvZGUpOworICBpZiAobkluZGV4ID4gMCkKKyAgICByZXR1cm4gbkluZGV4OworICBpbnQgbm1hcHMgPSBGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChmYWNlKTsKKyAgaW50IG0gPSAwOworICB3aGlsZSAobSA8IG5tYXBzKSB7CisgICAgdWludDMyX3QgbkVuY29kaW5nSUQgPQorICAgICAgICBGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbbSsrXSk7CisgICAgaWYgKG1fbkVuY29kaW5nSUQgPT0gbkVuY29kaW5nSUQpCisgICAgICBjb250aW51ZTsKKyAgICBpbnQgZXJyb3IgPSBGWEZUX1NlbGVjdF9DaGFybWFwKGZhY2UsIG5FbmNvZGluZ0lEKTsKKyAgICBpZiAoZXJyb3IpCisgICAgICBjb250aW51ZTsKKyAgICBuSW5kZXggPSBGWEZUX0dldF9DaGFyX0luZGV4KGZhY2UsIGNoYXJjb2RlKTsKKyAgICBpZiAobkluZGV4ID4gMCkgeworICAgICAgbV9uRW5jb2RpbmdJRCA9IG5FbmNvZGluZ0lEOworICAgICAgcmV0dXJuIG5JbmRleDsKKyAgICB9CisgIH0KKyAgRlhGVF9TZWxlY3RfQ2hhcm1hcChmYWNlLCBtX25FbmNvZGluZ0lEKTsKKyAgcmV0dXJuIDA7Cit9CisKK3VpbnQzMl90IENGWF9Vbmljb2RlRW5jb2RpbmdFeDo6Q2hhckNvZGVGcm9tVW5pY29kZSh3Y2hhcl90IFVuaWNvZGUpIGNvbnN0IHsKKyAgaWYgKG1fbkVuY29kaW5nSUQgPT0gRlhGTV9FTkNPRElOR19VTklDT0RFIHx8CisgICAgICBtX25FbmNvZGluZ0lEID09IEZYRk1fRU5DT0RJTkdfTVNfU1lNQk9MKSB7CisgICAgcmV0dXJuIFVuaWNvZGU7CisgIH0KKyAgRlhGVF9GYWNlIGZhY2UgPSBtX3BGb250LT5HZXRGYWNlKCk7CisgIGludCBubWFwcyA9IEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcENvdW50KGZhY2UpOworICBmb3IgKGludCBpID0gMDsgaSA8IG5tYXBzOyBpKyspIHsKKyAgICBpbnQgbkVuY29kaW5nSUQgPQorICAgICAgICBGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbaV0pOworICAgIGlmIChuRW5jb2RpbmdJRCA9PSBGWEZNX0VOQ09ESU5HX1VOSUNPREUgfHwKKyAgICAgICAgbkVuY29kaW5nSUQgPT0gRlhGTV9FTkNPRElOR19NU19TWU1CT0wpIHsKKyAgICAgIHJldHVybiBVbmljb2RlOworICAgIH0KKyAgfQorICByZXR1cm4gQ1BERl9Gb250OjprSW52YWxpZENoYXJDb2RlOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1VuaWNvZGVFbmNvZGluZ0V4PiBGWF9DcmVhdGVGb250RW5jb2RpbmdFeCgKKyAgICBDRlhfRm9udCogcEZvbnQsCisgICAgdWludDMyX3QgbkVuY29kaW5nSUQpIHsKKyAgaWYgKCFwRm9udCB8fCAhcEZvbnQtPkdldEZhY2UoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBpZiAobkVuY29kaW5nSUQgIT0gRlhGTV9FTkNPRElOR19OT05FKQorICAgIHJldHVybiBGWEZNX0NyZWF0ZUZvbnRFbmNvZGluZyhwRm9udCwgbkVuY29kaW5nSUQpOworCisgIGZvciAodWludDMyX3QgaWQgOiBnX0VuY29kaW5nSUQpIHsKKyAgICBhdXRvIHBGb250RW5jb2RpbmcgPSBGWEZNX0NyZWF0ZUZvbnRFbmNvZGluZyhwRm9udCwgaWQpOworICAgIGlmIChwRm9udEVuY29kaW5nKQorICAgICAgcmV0dXJuIHBGb250RW5jb2Rpbmc7CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvY2Z4X3VuaWNvZGVlbmNvZGluZ2V4LmggYi9jb3JlL2Z4Z2UvY2Z4X3VuaWNvZGVlbmNvZGluZ2V4LmgKaW5kZXggZGYyZWRiZS4uNTYzMmQ5NiAxMDA2NDQKLS0tIGEvY29yZS9meGdlL2NmeF91bmljb2RlZW5jb2RpbmdleC5oCisrKyBiL2NvcmUvZnhnZS9jZnhfdW5pY29kZWVuY29kaW5nZXguaApAQCAtMTQsNyArMTQsNiBAQAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2NmeF91bmljb2RlZW5jb2RpbmcuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZyZWV0eXBlLmgiCiAKIGNsYXNzIENGWF9Vbmljb2RlRW5jb2RpbmdFeCA6IHB1YmxpYyBDRlhfVW5pY29kZUVuY29kaW5nIHsKICBwdWJsaWM6CkBAIC0yNCwxNCArMjMsMTQgQEAKICAgLy8gQ0ZYX1VuaWNvZGVFbmNvZGluZzoKICAgdWludDMyX3QgR2x5cGhGcm9tQ2hhckNvZGUodWludDMyX3QgY2hhcmNvZGUpIG92ZXJyaWRlOwogCi0gIHVpbnQzMl90IENoYXJDb2RlRnJvbVVuaWNvZGUoRlhfV0NIQVIgVW5pY29kZSkgY29uc3Q7CisgIHVpbnQzMl90IENoYXJDb2RlRnJvbVVuaWNvZGUod2NoYXJfdCBVbmljb2RlKSBjb25zdDsKIAogIHByaXZhdGU6CiAgIHVpbnQzMl90IG1fbkVuY29kaW5nSUQ7CiB9OwogCi1DRlhfVW5pY29kZUVuY29kaW5nRXgqIEZYX0NyZWF0ZUZvbnRFbmNvZGluZ0V4KAorc3RkOjp1bmlxdWVfcHRyPENGWF9Vbmljb2RlRW5jb2RpbmdFeD4gRlhfQ3JlYXRlRm9udEVuY29kaW5nRXgoCiAgICAgQ0ZYX0ZvbnQqIHBGb250LAotICAgIHVpbnQzMl90IG5FbmNvZGluZ0lEID0gRlhGTV9FTkNPRElOR19OT05FKTsKKyAgICB1aW50MzJfdCBuRW5jb2RpbmdJRCk7CiAKICNlbmRpZiAgLy8gQ09SRV9GWEdFX0NGWF9VTklDT0RFRU5DT0RJTkdFWF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2NmeF93aW5kb3dzZGV2aWNlLmggYi9jb3JlL2Z4Z2UvY2Z4X3dpbmRvd3NkZXZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI0MGQ4NC4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Z2UvY2Z4X3dpbmRvd3NkZXZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBDT1JFX0ZYR0VfQ0ZYX1dJTkRPV1NERVZJQ0VfSF8KLSNkZWZpbmUgQ09SRV9GWEdFX0NGWF9XSU5ET1dTREVWSUNFX0hfCi0KLSNpZmRlZiBfV0lOMzIKLSNpZm5kZWYgX1dJTkRPV1NfCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgotCi1jbGFzcyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyOwotCi0jaWYgZGVmaW5lZChQREZJVU1fUFJJTlRfVEVYVF9XSVRIX0dESSkKLXR5cGVkZWYgdm9pZCAoKlBERml1bUVuc3VyZVR5cGVmYWNlQ2hhcmFjdGVyc0FjY2Vzc2libGUpKGNvbnN0IExPR0ZPTlQqIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHRleHRfbGVuZ3RoKTsKLQotZXh0ZXJuIGJvb2wgZ19wZGZpdW1fcHJpbnRfdGV4dF93aXRoX2dkaTsKLWV4dGVybiBQREZpdW1FbnN1cmVUeXBlZmFjZUNoYXJhY3RlcnNBY2Nlc3NpYmxlCi0gICAgZ19wZGZpdW1fdHlwZWZhY2VfYWNjZXNzaWJsZV9mdW5jOwotI2VuZGlmCi1leHRlcm4gaW50IGdfcGRmaXVtX3ByaW50X3Bvc3RzY3JpcHRfbGV2ZWw7Ci0KLWNsYXNzIENGWF9XaW5kb3dzRGV2aWNlIDogcHVibGljIENGWF9SZW5kZXJEZXZpY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIENyZWF0ZURyaXZlcihIREMgaERDKTsKLQotICBleHBsaWNpdCBDRlhfV2luZG93c0RldmljZShIREMgaERDKTsKLSAgfkNGWF9XaW5kb3dzRGV2aWNlKCkgb3ZlcnJpZGU7Ci0KLSAgSERDIEdldERDKCkgY29uc3Q7Ci19OwotCi0jZW5kaWYgIC8vIF9XSU4zMgotCi0jZW5kaWYgIC8vIENPUkVfRlhHRV9DRlhfV0lORE9XU0RFVklDRV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2NmeF93aW5kb3dzcmVuZGVyZGV2aWNlLmggYi9jb3JlL2Z4Z2UvY2Z4X3dpbmRvd3NyZW5kZXJkZXZpY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWUwY2JkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGdlL2NmeF93aW5kb3dzcmVuZGVyZGV2aWNlLmgKQEAgLTAsMCArMSw0NyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhHRV9DRlhfV0lORE9XU1JFTkRFUkRFVklDRV9IXworI2RlZmluZSBDT1JFX0ZYR0VfQ0ZYX1dJTkRPV1NSRU5ERVJERVZJQ0VfSF8KKworI2lmZGVmIF9XSU4zMgorI2lmbmRlZiBfV0lORE9XU18KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmgiCisKK2VudW0gV2luZG93c1ByaW50TW9kZSB7CisgIGtNb2RlRW1mID0gMCwKKyAga01vZGVUZXh0T25seSA9IDEsCisgIGtNb2RlUG9zdFNjcmlwdDIgPSAyLAorICBrTW9kZVBvc3RTY3JpcHQzID0gMywKK307CisKK2NsYXNzIElGWF9SZW5kZXJEZXZpY2VEcml2ZXI7CisKKyNpZiBkZWZpbmVkKFBERklVTV9QUklOVF9URVhUX1dJVEhfR0RJKQordHlwZWRlZiB2b2lkICgqUERGaXVtRW5zdXJlVHlwZWZhY2VDaGFyYWN0ZXJzQWNjZXNzaWJsZSkoY29uc3QgTE9HRk9OVCogZm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgdGV4dF9sZW5ndGgpOworCitleHRlcm4gYm9vbCBnX3BkZml1bV9wcmludF90ZXh0X3dpdGhfZ2RpOworZXh0ZXJuIFBERml1bUVuc3VyZVR5cGVmYWNlQ2hhcmFjdGVyc0FjY2Vzc2libGUKKyAgICBnX3BkZml1bV90eXBlZmFjZV9hY2Nlc3NpYmxlX2Z1bmM7CisjZW5kaWYKK2V4dGVybiBpbnQgZ19wZGZpdW1fcHJpbnRfbW9kZTsKKworY2xhc3MgQ0ZYX1dpbmRvd3NSZW5kZXJEZXZpY2UgOiBwdWJsaWMgQ0ZYX1JlbmRlckRldmljZSB7CisgcHVibGljOgorICBzdGF0aWMgSUZYX1JlbmRlckRldmljZURyaXZlciogQ3JlYXRlRHJpdmVyKEhEQyBoREMpOworCisgIGV4cGxpY2l0IENGWF9XaW5kb3dzUmVuZGVyRGV2aWNlKEhEQyBoREMpOworICB+Q0ZYX1dpbmRvd3NSZW5kZXJEZXZpY2UoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gX1dJTjMyCisKKyNlbmRpZiAgLy8gQ09SRV9GWEdFX0NGWF9XSU5ET1dTUkVOREVSREVWSUNFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvY3R0Zm9udGRlc2MuY3BwIGIvY29yZS9meGdlL2N0dGZvbnRkZXNjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGYyNDUxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGdlL2N0dGZvbnRkZXNjLmNwcApAQCAtMCwwICsxLDY4IEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY3R0Zm9udGRlc2MuaCIKKworI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mcmVldHlwZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKKworQ1RURm9udERlc2M6OkNUVEZvbnREZXNjKHVpbnQ4X3QqIHBEYXRhLCBGWEZUX0ZhY2UgZmFjZSkKKyAgICA6IG1fYklzVFRDKGZhbHNlKSwgbV9TaW5nbGVGYWNlKGZhY2UpLCBtX3BGb250RGF0YShwRGF0YSkge30KKworQ1RURm9udERlc2M6OkNUVEZvbnREZXNjKHVpbnQ4X3QqIHBEYXRhLCBzaXplX3QgaW5kZXgsIEZYRlRfRmFjZSBmYWNlKQorICAgIDogbV9iSXNUVEModHJ1ZSksIG1fcEZvbnREYXRhKHBEYXRhKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKG1fVFRDRmFjZXMpOyBpKyspCisgICAgbV9UVENGYWNlc1tpXSA9IG51bGxwdHI7CisgIFNldFRUQ0ZhY2UoaW5kZXgsIGZhY2UpOworfQorCitDVFRGb250RGVzYzo6fkNUVEZvbnREZXNjKCkgeworICBBU1NFUlQobV9SZWZDb3VudCA9PSAwKTsKKyAgaWYgKG1fYklzVFRDKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUobV9UVENGYWNlcyk7IGkrKykgeworICAgICAgaWYgKG1fVFRDRmFjZXNbaV0pCisgICAgICAgIEZYRlRfRG9uZV9GYWNlKG1fVFRDRmFjZXNbaV0pOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAobV9TaW5nbGVGYWNlKQorICAgICAgRlhGVF9Eb25lX0ZhY2UobV9TaW5nbGVGYWNlKTsKKyAgfQorICBGWF9GcmVlKG1fcEZvbnREYXRhKTsKK30KKwordm9pZCBDVFRGb250RGVzYzo6U2V0VFRDRmFjZShzaXplX3QgaW5kZXgsIEZYRlRfRmFjZSBmYWNlKSB7CisgIEFTU0VSVChtX2JJc1RUQyk7CisgIEFTU0VSVChpbmRleCA8IEZYX0FycmF5U2l6ZShtX1RUQ0ZhY2VzKSk7CisgIG1fVFRDRmFjZXNbaW5kZXhdID0gZmFjZTsKK30KKwordm9pZCBDVFRGb250RGVzYzo6QWRkUmVmKCkgeworICBBU1NFUlQobV9SZWZDb3VudCA+IDApOworICArK21fUmVmQ291bnQ7Cit9CisKK0NUVEZvbnREZXNjOjpSZWxlYXNlU3RhdHVzIENUVEZvbnREZXNjOjpSZWxlYXNlRmFjZShGWEZUX0ZhY2UgZmFjZSkgeworICBpZiAobV9iSXNUVEMpIHsKKyAgICBpZiAoIXBkZml1bTo6Q29udGFpbnNWYWx1ZShtX1RUQ0ZhY2VzLCBmYWNlKSkKKyAgICAgIHJldHVybiBrTm90QXBwcm9wcmlhdGU7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fU2luZ2xlRmFjZSAhPSBmYWNlKQorICAgICAgcmV0dXJuIGtOb3RBcHByb3ByaWF0ZTsKKyAgfQorICBBU1NFUlQobV9SZWZDb3VudCA+IDApOworICByZXR1cm4gLS1tX1JlZkNvdW50ID09IDAgPyBrUmVsZWFzZWQgOiBrTm90UmVsZWFzZWQ7Cit9CisKK0ZYRlRfRmFjZSBDVFRGb250RGVzYzo6U2luZ2xlRmFjZSgpIGNvbnN0IHsKKyAgQVNTRVJUKCFtX2JJc1RUQyk7CisgIHJldHVybiBtX1NpbmdsZUZhY2U7Cit9CisKK0ZYRlRfRmFjZSBDVFRGb250RGVzYzo6VFRDRmFjZShzaXplX3QgaW5kZXgpIGNvbnN0IHsKKyAgQVNTRVJUKG1fYklzVFRDKTsKKyAgQVNTRVJUKGluZGV4IDwgRlhfQXJyYXlTaXplKG1fVFRDRmFjZXMpKTsKKyAgcmV0dXJuIG1fVFRDRmFjZXNbaW5kZXhdOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2N0dGZvbnRkZXNjLmggYi9jb3JlL2Z4Z2UvY3R0Zm9udGRlc2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDhlNzhjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGdlL2N0dGZvbnRkZXNjLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhHRV9DVFRGT05UREVTQ19IXworI2RlZmluZSBDT1JFX0ZYR0VfQ1RURk9OVERFU0NfSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZvbnQuaCIKKworY2xhc3MgQ1RURm9udERlc2MgeworIHB1YmxpYzoKKyAgZW51bSBSZWxlYXNlU3RhdHVzIHsKKyAgICBrTm90QXBwcm9wcmlhdGUsICAvLyBSZWxlYXNlRmFjZSgpIG5vdCBhcHByb3ByaWF0ZSBmb3IgZ2l2ZW4gb2JqZWN0LgorICAgIGtSZWxlYXNlZCwKKyAgICBrTm90UmVsZWFzZWQgIC8vIE9iamVjdCBzdGlsbCBhbGl2ZS4KKyAgfTsKKworICAvLyBTaW5nbGUgZmFjZSBjdG9yLgorICBDVFRGb250RGVzYyh1aW50OF90KiBwRGF0YSwgRlhGVF9GYWNlIGZhY2UpOworCisgIC8vIFRUQyBmYWNlIGN0b3IuCisgIENUVEZvbnREZXNjKHVpbnQ4X3QqIHBEYXRhLCBzaXplX3QgaW5kZXgsIEZYRlRfRmFjZSBmYWNlKTsKKworICB+Q1RURm9udERlc2MoKTsKKworICB2b2lkIFNldFRUQ0ZhY2Uoc2l6ZV90IGluZGV4LCBGWEZUX0ZhY2UgZmFjZSk7CisKKyAgdm9pZCBBZGRSZWYoKTsKKworICAvLyBNYXkgbm90IGRlY3JlbWVudCByZWZjb3VudCwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiB8ZmFjZXwuCisgIFJlbGVhc2VTdGF0dXMgUmVsZWFzZUZhY2UoRlhGVF9GYWNlIGZhY2UpOworCisgIHVpbnQ4X3QqIEZvbnREYXRhKCkgY29uc3QgeyByZXR1cm4gbV9wRm9udERhdGE7IH0KKworICBGWEZUX0ZhY2UgU2luZ2xlRmFjZSgpIGNvbnN0OworICBGWEZUX0ZhY2UgVFRDRmFjZShzaXplX3QgaW5kZXgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgY29uc3QgYm9vbCBtX2JJc1RUQzsKKworICB1bmlvbiB7CisgICAgY29uc3QgRlhGVF9GYWNlIG1fU2luZ2xlRmFjZTsKKyAgICBGWEZUX0ZhY2UgbV9UVENGYWNlc1sxNl07CisgIH07CisgIHVpbnQ4X3QqIGNvbnN0IG1fcEZvbnREYXRhOworICBpbnQgbV9SZWZDb3VudCA9IDE7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhHRV9DVFRGT05UREVTQ19IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2RpYi9SRUFETUUubWQgYi9jb3JlL2Z4Z2UvZGliL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWU4Zjc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGdlL2RpYi9SRUFETUUubWQKQEAgLTAsMCArMSBAQAorRElCIHN0YW5kcyBmb3IgRGV2aWNlLUluZGVwZW5kZW50IEJpdG1hcC4KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9kaWIvY2Z4X2JpdG1hcGNvbXBvc2VyLmNwcCBiL2NvcmUvZnhnZS9kaWIvY2Z4X2JpdG1hcGNvbXBvc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODU0OTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGdlL2RpYi9jZnhfYml0bWFwY29tcG9zZXIuY3BwCkBAIC0wLDAgKzEsMjAxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9iaXRtYXBjb21wb3Nlci5oIgorCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9jbGlwcmduLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfZGliaXRtYXAuaCIKKworQ0ZYX0JpdG1hcENvbXBvc2VyOjpDRlhfQml0bWFwQ29tcG9zZXIoKQorICAgIDogbV9iUmdiQnl0ZU9yZGVyKGZhbHNlKSwgbV9CbGVuZFR5cGUoRlhESUJfQkxFTkRfTk9STUFMKSB7fQorCitDRlhfQml0bWFwQ29tcG9zZXI6On5DRlhfQml0bWFwQ29tcG9zZXIoKSB7fQorCit2b2lkIENGWF9CaXRtYXBDb21wb3Nlcjo6Q29tcG9zZShjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcERlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWFza19jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QmIGRlc3RfcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlZlcnRpY2FsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmxpcFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGbGlwWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJnYkJ5dGVPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgbV9wQml0bWFwID0gcERlc3Q7CisgIG1fcENsaXBSZ24gPSBwQ2xpcFJnbjsKKyAgbV9EZXN0TGVmdCA9IGRlc3RfcmVjdC5sZWZ0OworICBtX0Rlc3RUb3AgPSBkZXN0X3JlY3QudG9wOworICBtX0Rlc3RXaWR0aCA9IGRlc3RfcmVjdC5XaWR0aCgpOworICBtX0Rlc3RIZWlnaHQgPSBkZXN0X3JlY3QuSGVpZ2h0KCk7CisgIG1fQml0bWFwQWxwaGEgPSBiaXRtYXBfYWxwaGE7CisgIG1fTWFza0NvbG9yID0gbWFza19jb2xvcjsKKyAgbV9wQ2xpcE1hc2sgPSBudWxscHRyOworICBpZiAocENsaXBSZ24gJiYgcENsaXBSZ24tPkdldFR5cGUoKSAhPSBDRlhfQ2xpcFJnbjo6UmVjdEkpCisgICAgbV9wQ2xpcE1hc2sgPSBwQ2xpcFJnbi0+R2V0TWFzaygpOworICBtX2JWZXJ0aWNhbCA9IGJWZXJ0aWNhbDsKKyAgbV9iRmxpcFggPSBiRmxpcFg7CisgIG1fYkZsaXBZID0gYkZsaXBZOworICBtX0FscGhhRmxhZyA9IGFscGhhX2ZsYWc7CisgIG1fYlJnYkJ5dGVPcmRlciA9IGJSZ2JCeXRlT3JkZXI7CisgIG1fQmxlbmRUeXBlID0gYmxlbmRfdHlwZTsKK30KKworYm9vbCBDRlhfQml0bWFwQ29tcG9zZXI6OlNldEluZm8oaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBTcmNQYWxldHRlKSB7CisgIG1fU3JjRm9ybWF0ID0gc3JjX2Zvcm1hdDsKKyAgaWYgKCFtX0NvbXBvc2l0b3IuSW5pdChtX3BCaXRtYXAtPkdldEZvcm1hdCgpLCBzcmNfZm9ybWF0LCB3aWR0aCwgcFNyY1BhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9NYXNrQ29sb3IsIEZYRElCX0JMRU5EX05PUk1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDbGlwTWFzayAhPSBudWxscHRyIHx8IChtX0JpdG1hcEFscGhhIDwgMjU1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX2JSZ2JCeXRlT3JkZXIsIG1fQWxwaGFGbGFnKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAobV9iVmVydGljYWwpIHsKKyAgICBtX3BTY2FubGluZVYucmVzaXplKG1fcEJpdG1hcC0+R2V0QlBQKCkgLyA4ICogd2lkdGggKyA0KTsKKyAgICBtX3BDbGlwU2NhblYucmVzaXplKG1fcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOworICAgIGlmIChtX3BCaXRtYXAtPm1fcEFscGhhTWFzaykKKyAgICAgIG1fcFNjYW5saW5lQWxwaGFWLnJlc2l6ZSh3aWR0aCArIDQpOworICB9CisgIGlmIChtX0JpdG1hcEFscGhhIDwgMjU1KSB7CisgICAgbV9wQWRkQ2xpcFNjYW4ucmVzaXplKG1fYlZlcnRpY2FsID8gbV9wQml0bWFwLT5HZXRIZWlnaHQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fcEJpdG1hcC0+R2V0V2lkdGgoKSk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ0ZYX0JpdG1hcENvbXBvc2VyOjpEb0NvbXBvc2UodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2V4dHJhX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3RfZXh0cmFfYWxwaGEpIHsKKyAgdWludDhfdCogcEFkZENsaXBTY2FuID0gbV9wQWRkQ2xpcFNjYW4uZGF0YSgpOworICBpZiAobV9CaXRtYXBBbHBoYSA8IDI1NSkgeworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzdF93aWR0aDsgKytpKQorICAgICAgICBwQWRkQ2xpcFNjYW5baV0gPSBjbGlwX3NjYW5baV0gKiBtX0JpdG1hcEFscGhhIC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBtZW1zZXQocEFkZENsaXBTY2FuLCBtX0JpdG1hcEFscGhhLCBkZXN0X3dpZHRoKTsKKyAgICB9CisgICAgY2xpcF9zY2FuID0gcEFkZENsaXBTY2FuOworICB9CisgIGlmIChtX1NyY0Zvcm1hdCA9PSBGWERJQl84YnBwTWFzaykgeworICAgIG1fQ29tcG9zaXRvci5Db21wb3NpdGVCeXRlTWFza0xpbmUoZGVzdF9zY2FuLCBzcmNfc2NhbiwgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2NhbiwgZHN0X2V4dHJhX2FscGhhKTsKKyAgfSBlbHNlIGlmICgobV9TcmNGb3JtYXQgJiAweGZmKSA9PSA4KSB7CisgICAgbV9Db21wb3NpdG9yLkNvbXBvc2l0ZVBhbEJpdG1hcExpbmUoZGVzdF9zY2FuLCBzcmNfc2NhbiwgMCwgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4sIHNyY19leHRyYV9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZXh0cmFfYWxwaGEpOworICB9IGVsc2UgeworICAgIG1fQ29tcG9zaXRvci5Db21wb3NpdGVSZ2JCaXRtYXBMaW5lKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBzcmNfZXh0cmFfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2V4dHJhX2FscGhhKTsKKyAgfQorfQorCit2b2lkIENGWF9CaXRtYXBDb21wb3Nlcjo6Q29tcG9zZVNjYW5saW5lKGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2Nhbl9leHRyYV9hbHBoYSkgeworICBpZiAobV9iVmVydGljYWwpIHsKKyAgICBDb21wb3NlU2NhbmxpbmVWKGxpbmUsIHNjYW5saW5lLCBzY2FuX2V4dHJhX2FscGhhKTsKKyAgICByZXR1cm47CisgIH0KKyAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuID0gbnVsbHB0cjsKKyAgaWYgKG1fcENsaXBNYXNrKSB7CisgICAgY2xpcF9zY2FuID0gbV9wQ2xpcE1hc2stPkdldEJ1ZmZlcigpICsKKyAgICAgICAgICAgICAgICAobV9EZXN0VG9wICsgbGluZSAtIG1fcENsaXBSZ24tPkdldEJveCgpLnRvcCkgKgorICAgICAgICAgICAgICAgICAgICBtX3BDbGlwTWFzay0+R2V0UGl0Y2goKSArCisgICAgICAgICAgICAgICAgKG1fRGVzdExlZnQgLSBtX3BDbGlwUmduLT5HZXRCb3goKS5sZWZ0KTsKKyAgfQorICB1aW50OF90KiBkZXN0X3NjYW4gPQorICAgICAgY29uc3RfY2FzdDx1aW50OF90Kj4obV9wQml0bWFwLT5HZXRTY2FubGluZShsaW5lICsgbV9EZXN0VG9wKSkgKworICAgICAgbV9EZXN0TGVmdCAqIG1fcEJpdG1hcC0+R2V0QlBQKCkgLyA4OworICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4gPQorICAgICAgbV9wQml0bWFwLT5tX3BBbHBoYU1hc2sKKyAgICAgICAgICA/IGNvbnN0X2Nhc3Q8dWludDhfdCo+KAorICAgICAgICAgICAgICAgIG1fcEJpdG1hcC0+bV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShsaW5lICsgbV9EZXN0VG9wKSkgKworICAgICAgICAgICAgICAgIG1fRGVzdExlZnQKKyAgICAgICAgICA6IG51bGxwdHI7CisgIERvQ29tcG9zZShkZXN0X3NjYW4sIHNjYW5saW5lLCBtX0Rlc3RXaWR0aCwgY2xpcF9zY2FuLCBzY2FuX2V4dHJhX2FscGhhLAorICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuKTsKK30KKwordm9pZCBDRlhfQml0bWFwQ29tcG9zZXI6OkNvbXBvc2VTY2FubGluZVYoaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5fZXh0cmFfYWxwaGEpIHsKKyAgaW50IEJwcCA9IG1fcEJpdG1hcC0+R2V0QlBQKCkgLyA4OworICBpbnQgZGVzdF9waXRjaCA9IG1fcEJpdG1hcC0+R2V0UGl0Y2goKTsKKyAgaW50IGRlc3RfYWxwaGFfcGl0Y2ggPQorICAgICAgbV9wQml0bWFwLT5tX3BBbHBoYU1hc2sgPyBtX3BCaXRtYXAtPm1fcEFscGhhTWFzay0+R2V0UGl0Y2goKSA6IDA7CisgIGludCBkZXN0X3ggPSBtX0Rlc3RMZWZ0ICsgKG1fYkZsaXBYID8gKG1fRGVzdFdpZHRoIC0gbGluZSAtIDEpIDogbGluZSk7CisgIHVpbnQ4X3QqIGRlc3RfYnVmID0KKyAgICAgIG1fcEJpdG1hcC0+R2V0QnVmZmVyKCkgKyBkZXN0X3ggKiBCcHAgKyBtX0Rlc3RUb3AgKiBkZXN0X3BpdGNoOworICB1aW50OF90KiBkZXN0X2FscGhhX2J1ZiA9IG1fcEJpdG1hcC0+bV9wQWxwaGFNYXNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbV9wQml0bWFwLT5tX3BBbHBoYU1hc2stPkdldEJ1ZmZlcigpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF94ICsgbV9EZXN0VG9wICogZGVzdF9hbHBoYV9waXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHI7CisgIGlmIChtX2JGbGlwWSkgeworICAgIGRlc3RfYnVmICs9IGRlc3RfcGl0Y2ggKiAobV9EZXN0SGVpZ2h0IC0gMSk7CisgICAgZGVzdF9hbHBoYV9idWYgKz0gZGVzdF9hbHBoYV9waXRjaCAqIChtX0Rlc3RIZWlnaHQgLSAxKTsKKyAgfQorICBpbnQgeV9zdGVwID0gZGVzdF9waXRjaDsKKyAgaW50IHlfYWxwaGFfc3RlcCA9IGRlc3RfYWxwaGFfcGl0Y2g7CisgIGlmIChtX2JGbGlwWSkgeworICAgIHlfc3RlcCA9IC15X3N0ZXA7CisgICAgeV9hbHBoYV9zdGVwID0gLXlfYWxwaGFfc3RlcDsKKyAgfQorICB1aW50OF90KiBzcmNfc2NhbiA9IG1fcFNjYW5saW5lVi5kYXRhKCk7CisgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmOworICBmb3IgKGludCBpID0gMDsgaSA8IG1fRGVzdEhlaWdodDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBCcHA7ICsraikKKyAgICAgICpzcmNfc2NhbisrID0gZGVzdF9zY2FuW2pdOworICAgIGRlc3Rfc2NhbiArPSB5X3N0ZXA7CisgIH0KKyAgdWludDhfdCogc3JjX2FscGhhX3NjYW4gPSBtX3BTY2FubGluZUFscGhhVi5kYXRhKCk7CisgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbiA9IGRlc3RfYWxwaGFfYnVmOworICBpZiAoZGVzdF9hbHBoYV9zY2FuKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX0Rlc3RIZWlnaHQ7ICsraSkgeworICAgICAgKnNyY19hbHBoYV9zY2FuKysgPSAqZGVzdF9hbHBoYV9zY2FuOworICAgICAgZGVzdF9hbHBoYV9zY2FuICs9IHlfYWxwaGFfc3RlcDsKKyAgICB9CisgIH0KKyAgdWludDhfdCogY2xpcF9zY2FuID0gbnVsbHB0cjsKKyAgaWYgKG1fcENsaXBNYXNrKSB7CisgICAgY2xpcF9zY2FuID0gbV9wQ2xpcFNjYW5WLmRhdGEoKTsKKyAgICBpbnQgY2xpcF9waXRjaCA9IG1fcENsaXBNYXNrLT5HZXRQaXRjaCgpOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19jbGlwID0KKyAgICAgICAgbV9wQ2xpcE1hc2stPkdldEJ1ZmZlcigpICsKKyAgICAgICAgKG1fRGVzdFRvcCAtIG1fcENsaXBSZ24tPkdldEJveCgpLnRvcCkgKiBjbGlwX3BpdGNoICsKKyAgICAgICAgKGRlc3RfeCAtIG1fcENsaXBSZ24tPkdldEJveCgpLmxlZnQpOworICAgIGlmIChtX2JGbGlwWSkgeworICAgICAgc3JjX2NsaXAgKz0gY2xpcF9waXRjaCAqIChtX0Rlc3RIZWlnaHQgLSAxKTsKKyAgICAgIGNsaXBfcGl0Y2ggPSAtY2xpcF9waXRjaDsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX0Rlc3RIZWlnaHQ7ICsraSkgeworICAgICAgY2xpcF9zY2FuW2ldID0gKnNyY19jbGlwOworICAgICAgc3JjX2NsaXAgKz0gY2xpcF9waXRjaDsKKyAgICB9CisgIH0KKyAgRG9Db21wb3NlKG1fcFNjYW5saW5lVi5kYXRhKCksIHNjYW5saW5lLCBtX0Rlc3RIZWlnaHQsIGNsaXBfc2NhbiwKKyAgICAgICAgICAgIHNjYW5fZXh0cmFfYWxwaGEsIG1fcFNjYW5saW5lQWxwaGFWLmRhdGEoKSk7CisgIHNyY19zY2FuID0gbV9wU2NhbmxpbmVWLmRhdGEoKTsKKyAgZGVzdF9zY2FuID0gZGVzdF9idWY7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9EZXN0SGVpZ2h0OyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IEJwcDsgKytqKQorICAgICAgZGVzdF9zY2FuW2pdID0gKnNyY19zY2FuKys7CisgICAgZGVzdF9zY2FuICs9IHlfc3RlcDsKKyAgfQorICBzcmNfYWxwaGFfc2NhbiA9IG1fcFNjYW5saW5lQWxwaGFWLmRhdGEoKTsKKyAgZGVzdF9hbHBoYV9zY2FuID0gZGVzdF9hbHBoYV9idWY7CisgIGlmICghZGVzdF9hbHBoYV9zY2FuKQorICAgIHJldHVybjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX0Rlc3RIZWlnaHQ7ICsraSkgeworICAgICpkZXN0X2FscGhhX3NjYW4gPSAqc3JjX2FscGhhX3NjYW4rKzsKKyAgICBkZXN0X2FscGhhX3NjYW4gKz0geV9hbHBoYV9zdGVwOworICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZGliL2NmeF9iaXRtYXBjb21wb3Nlci5oIGIvY29yZS9meGdlL2RpYi9jZnhfYml0bWFwY29tcG9zZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGMxZjc3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGdlL2RpYi9jZnhfYml0bWFwY29tcG9zZXIuaApAQCAtMCwwICsxLDgyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWEdFX0RJQl9DRlhfQklUTUFQQ09NUE9TRVJfSF8KKyNkZWZpbmUgQ09SRV9GWEdFX0RJQl9DRlhfQklUTUFQQ09NUE9TRVJfSF8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfc2NhbmxpbmVjb21wb3NpdG9yLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9pZnhfc2NhbmxpbmVjb21wb3Nlci5oIgorCitjbGFzcyBDRlhfQ2xpcFJnbjsKK2NsYXNzIENGWF9ESUJpdG1hcDsKKworY2xhc3MgQ0ZYX0JpdG1hcENvbXBvc2VyIDogcHVibGljIElGWF9TY2FubGluZUNvbXBvc2VyIHsKKyBwdWJsaWM6CisgIENGWF9CaXRtYXBDb21wb3NlcigpOworICB+Q0ZYX0JpdG1hcENvbXBvc2VyKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBDb21wb3NlKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwRGVzdCwKKyAgICAgICAgICAgICAgIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwKKyAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgICAgICAgICAgICB1aW50MzJfdCBtYXNrX2NvbG9yLAorICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCYgZGVzdF9yZWN0LAorICAgICAgICAgICAgICAgYm9vbCBiVmVydGljYWwsCisgICAgICAgICAgICAgICBib29sIGJGbGlwWCwKKyAgICAgICAgICAgICAgIGJvb2wgYkZsaXBZLAorICAgICAgICAgICAgICAgYm9vbCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSk7CisKKyAgLy8gSUZYX1NjYW5saW5lQ29tcG9zZXIKKyAgYm9vbCBTZXRJbmZvKGludCB3aWR0aCwKKyAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwKKyAgICAgICAgICAgICAgIHVpbnQzMl90KiBwU3JjUGFsZXR0ZSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBDb21wb3NlU2NhbmxpbmUoaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5saW5lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FuX2V4dHJhX2FscGhhKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIHZvaWQgRG9Db21wb3NlKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19leHRyYV9hbHBoYSwKKyAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0X2V4dHJhX2FscGhhKTsKKyAgdm9pZCBDb21wb3NlU2NhbmxpbmVWKGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2NhbmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FuX2V4dHJhX2FscGhhKTsKKworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBtX3BCaXRtYXA7CisgIFVub3duZWRQdHI8Y29uc3QgQ0ZYX0NsaXBSZ24+IG1fcENsaXBSZ247CisgIEZYRElCX0Zvcm1hdCBtX1NyY0Zvcm1hdDsKKyAgaW50IG1fRGVzdExlZnQ7CisgIGludCBtX0Rlc3RUb3A7CisgIGludCBtX0Rlc3RXaWR0aDsKKyAgaW50IG1fRGVzdEhlaWdodDsKKyAgaW50IG1fQml0bWFwQWxwaGE7CisgIHVpbnQzMl90IG1fTWFza0NvbG9yOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBtX3BDbGlwTWFzazsKKyAgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvciBtX0NvbXBvc2l0b3I7CisgIGJvb2wgbV9iVmVydGljYWw7CisgIGJvb2wgbV9iRmxpcFg7CisgIGJvb2wgbV9iRmxpcFk7CisgIGludCBtX0FscGhhRmxhZzsKKyAgYm9vbCBtX2JSZ2JCeXRlT3JkZXI7CisgIGludCBtX0JsZW5kVHlwZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbV9wU2NhbmxpbmVWOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtX3BDbGlwU2NhblY7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1fcEFkZENsaXBTY2FuOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtX3BTY2FubGluZUFscGhhVjsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWEdFX0RJQl9DRlhfQklUTUFQQ09NUE9TRVJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9kaWIvY2Z4X2JpdG1hcHN0b3Jlci5jcHAgYi9jb3JlL2Z4Z2UvZGliL2NmeF9iaXRtYXBzdG9yZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NDllMGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Z2UvZGliL2NmeF9iaXRtYXBzdG9yZXIuY3BwCkBAIC0wLDAgKzEsNTUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2JpdG1hcHN0b3Jlci5oIgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworQ0ZYX0JpdG1hcFN0b3Jlcjo6Q0ZYX0JpdG1hcFN0b3JlcigpIHt9CisKK0NGWF9CaXRtYXBTdG9yZXI6On5DRlhfQml0bWFwU3RvcmVyKCkge30KKworUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gQ0ZYX0JpdG1hcFN0b3Jlcjo6RGV0YWNoKCkgeworICByZXR1cm4gc3RkOjptb3ZlKG1fcEJpdG1hcCk7Cit9CisKK3ZvaWQgQ0ZYX0JpdG1hcFN0b3Jlcjo6UmVwbGFjZShSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYmIHBCaXRtYXApIHsKKyAgbV9wQml0bWFwID0gc3RkOjptb3ZlKHBCaXRtYXApOworfQorCit2b2lkIENGWF9CaXRtYXBTdG9yZXI6OkNvbXBvc2VTY2FubGluZShpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2Nhbl9leHRyYV9hbHBoYSkgeworICB1aW50OF90KiBkZXN0X2J1ZiA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KG1fcEJpdG1hcC0+R2V0U2NhbmxpbmUobGluZSkpOworICB1aW50OF90KiBkZXN0X2FscGhhX2J1ZiA9CisgICAgICBtX3BCaXRtYXAtPm1fcEFscGhhTWFzaworICAgICAgICAgID8gY29uc3RfY2FzdDx1aW50OF90Kj4obV9wQml0bWFwLT5tX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKGxpbmUpKQorICAgICAgICAgIDogbnVsbHB0cjsKKyAgaWYgKGRlc3RfYnVmKQorICAgIG1lbWNweShkZXN0X2J1Ziwgc2NhbmxpbmUsIG1fcEJpdG1hcC0+R2V0UGl0Y2goKSk7CisKKyAgaWYgKGRlc3RfYWxwaGFfYnVmKSB7CisgICAgbWVtY3B5KGRlc3RfYWxwaGFfYnVmLCBzY2FuX2V4dHJhX2FscGhhLAorICAgICAgICAgICBtX3BCaXRtYXAtPm1fcEFscGhhTWFzay0+R2V0UGl0Y2goKSk7CisgIH0KK30KKworYm9vbCBDRlhfQml0bWFwU3RvcmVyOjpTZXRJbmZvKGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwU3JjUGFsZXR0ZSkgeworICBhdXRvIHBCaXRtYXAgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOworICBpZiAoIXBCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBzcmNfZm9ybWF0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKHBTcmNQYWxldHRlKQorICAgIHBCaXRtYXAtPlNldFBhbGV0dGUocFNyY1BhbGV0dGUpOworCisgIG1fcEJpdG1hcCA9IHN0ZDo6bW92ZShwQml0bWFwKTsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZGliL2NmeF9iaXRtYXBzdG9yZXIuaCBiL2NvcmUvZnhnZS9kaWIvY2Z4X2JpdG1hcHN0b3Jlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMzQxNmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Z2UvZGliL2NmeF9iaXRtYXBzdG9yZXIuaApAQCAtMCwwICsxLDQxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWEdFX0RJQl9DRlhfQklUTUFQU1RPUkVSX0hfCisjZGVmaW5lIENPUkVfRlhHRV9ESUJfQ0ZYX0JJVE1BUFNUT1JFUl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9kaWJpdG1hcC5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvaWZ4X3NjYW5saW5lY29tcG9zZXIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisKK2NsYXNzIENGWF9CaXRtYXBTdG9yZXIgOiBwdWJsaWMgSUZYX1NjYW5saW5lQ29tcG9zZXIgeworIHB1YmxpYzoKKyAgQ0ZYX0JpdG1hcFN0b3JlcigpOworICB+Q0ZYX0JpdG1hcFN0b3JlcigpIG92ZXJyaWRlOworCisgIC8vIElGWF9TY2FubGluZUNvbXBvc2VyCisgIHZvaWQgQ29tcG9zZVNjYW5saW5lKGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2Nhbl9leHRyYV9hbHBoYSkgb3ZlcnJpZGU7CisgIGJvb2wgU2V0SW5mbyhpbnQgd2lkdGgsCisgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQsCisgICAgICAgICAgICAgICB1aW50MzJfdCogcFNyY1BhbGV0dGUpIG92ZXJyaWRlOworCisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IEdldEJpdG1hcCgpIHsgcmV0dXJuIG1fcEJpdG1hcDsgfQorICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBEZXRhY2goKTsKKyAgdm9pZCBSZXBsYWNlKFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiYgcEJpdG1hcCk7CisKKyBwcml2YXRlOgorICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBtX3BCaXRtYXA7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhHRV9ESUJfQ0ZYX0JJVE1BUFNUT1JFUl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2RpYi9jZnhfZGliZXh0cmFjdG9yLmNwcCBiL2NvcmUvZnhnZS9kaWIvY2Z4X2RpYmV4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNhZDQ2MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9kaWIvY2Z4X2RpYmV4dHJhY3Rvci5jcHAKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfZGliZXh0cmFjdG9yLmgiCisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9kaWJzb3VyY2UuaCIKKworQ0ZYX0RJQkV4dHJhY3Rvcjo6Q0ZYX0RJQkV4dHJhY3Rvcihjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTcmMpIHsKKyAgaWYgKCFwU3JjLT5HZXRCdWZmZXIoKSkgeworICAgIG1fcEJpdG1hcCA9IHBTcmMtPkNsb25lKG51bGxwdHIpOworICAgIHJldHVybjsKKyAgfQorICBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4gcE9sZFNyYyhwU3JjKTsKKyAgbV9wQml0bWFwID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKTsKKyAgaWYgKCFtX3BCaXRtYXAtPkNyZWF0ZShwT2xkU3JjLT5HZXRXaWR0aCgpLCBwT2xkU3JjLT5HZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwT2xkU3JjLT5HZXRGb3JtYXQoKSwgcE9sZFNyYy0+R2V0QnVmZmVyKCkpKSB7CisgICAgbV9wQml0bWFwLlJlc2V0KCk7CisgICAgcmV0dXJuOworICB9CisgIG1fcEJpdG1hcC0+U2V0UGFsZXR0ZShwT2xkU3JjLT5HZXRQYWxldHRlKCkpOworICBtX3BCaXRtYXAtPlNldEFscGhhTWFzayhwT2xkU3JjLT5tX3BBbHBoYU1hc2ssIG51bGxwdHIpOworfQorCitDRlhfRElCRXh0cmFjdG9yOjp+Q0ZYX0RJQkV4dHJhY3RvcigpIHt9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZGliL2NmeF9kaWJleHRyYWN0b3IuaCBiL2NvcmUvZnhnZS9kaWIvY2Z4X2RpYmV4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YzI3YTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Z2UvZGliL2NmeF9kaWJleHRyYWN0b3IuaApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWEdFX0RJQl9DRlhfRElCRVhUUkFDVE9SX0hfCisjZGVmaW5lIENPUkVfRlhHRV9ESUJfQ0ZYX0RJQkVYVFJBQ1RPUl9IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfZGliaXRtYXAuaCIKKworY2xhc3MgQ0ZYX0RJQlNvdXJjZTsKKworY2xhc3MgQ0ZYX0RJQkV4dHJhY3RvciB7CisgcHVibGljOgorICBleHBsaWNpdCBDRlhfRElCRXh0cmFjdG9yKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNyYyk7CisgIH5DRlhfRElCRXh0cmFjdG9yKCk7CisKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gR2V0Qml0bWFwKCkgeyByZXR1cm4gbV9wQml0bWFwOyB9CisKKyBwcml2YXRlOgorICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBtX3BCaXRtYXA7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhHRV9ESUJfQ0ZYX0RJQkVYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2RpYi9jZnhfZGliaXRtYXAuY3BwIGIvY29yZS9meGdlL2RpYi9jZnhfZGliaXRtYXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1N2NhOWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Z2UvZGliL2NmeF9kaWJpdG1hcC5jcHAKQEAgLTAsMCArMSwxMjQwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9kaWJpdG1hcC5oIgorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2Z4X2NvZGVjLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9jbGlwcmduLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfc2NhbmxpbmVjb21wb3NpdG9yLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCisjZGVmaW5lIE1BWF9PT01fTElNSVQgMTIwMDAwMDAKKworbmFtZXNwYWNlIHsKKworY29uc3QgaW50OF90IGdfQ2hhbm5lbE9mZnNldFtdID0gezAsIDIsIDEsIDAsIDAsIDEsIDIsIDMsIDN9OworCit9ICAvLyBuYW1lc3BhY2UKKworQ0ZYX0RJQml0bWFwOjpDRlhfRElCaXRtYXAoKSB7CisgIG1fcFBhbGV0dGUgPSBudWxscHRyOworI2lmZGVmIF9TS0lBX1NVUFBPUlRfUEFUSFNfCisgIG1fbkZvcm1hdCA9IEZvcm1hdDo6a0NsZWFyZWQ7CisjZW5kaWYKK30KKworYm9vbCBDRlhfRElCaXRtYXA6OkNyZWF0ZShpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBpdGNoKSB7CisgIG1fcEJ1ZmZlciA9IG51bGxwdHI7CisgIG1fYnBwID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oZm9ybWF0KTsKKyAgbV9BbHBoYUZsYWcgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihmb3JtYXQgPj4gOCk7CisgIG1fV2lkdGggPSAwOworICBtX0hlaWdodCA9IDA7CisgIG1fUGl0Y2ggPSAwOworCisgIHVpbnQzMl90IGNhbGN1bGF0ZWRTaXplOworICBpZiAoIUNGWF9ESUJpdG1hcDo6Q2FsY3VsYXRlUGl0Y2hBbmRTaXplKGhlaWdodCwgd2lkdGgsIGZvcm1hdCwgJnBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYWxjdWxhdGVkU2l6ZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChwQnVmZmVyKSB7CisgICAgbV9wQnVmZmVyLlJlc2V0KHBCdWZmZXIpOworICB9IGVsc2UgeworICAgIHNpemVfdCBidWZmZXJTaXplID0gY2FsY3VsYXRlZFNpemUgKyA0OworICAgIHNpemVfdCBvb21saW1pdCA9IE1BWF9PT01fTElNSVQ7CisgICAgaWYgKGJ1ZmZlclNpemUgPj0gb29tbGltaXQpIHsKKyAgICAgIG1fcEJ1ZmZlciA9IHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90LCBGeEZyZWVEZWxldGVyPigKKyAgICAgICAgICBGWF9UcnlBbGxvYyh1aW50OF90LCBidWZmZXJTaXplKSk7CisgICAgICBpZiAoIW1fcEJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBtX3BCdWZmZXIgPSBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4oCisgICAgICAgICAgRlhfQWxsb2ModWludDhfdCwgYnVmZmVyU2l6ZSkpOworICAgIH0KKyAgfQorICBtX1dpZHRoID0gd2lkdGg7CisgIG1fSGVpZ2h0ID0gaGVpZ2h0OworICBtX1BpdGNoID0gcGl0Y2g7CisgIGlmICghSGFzQWxwaGEoKSB8fCBmb3JtYXQgPT0gRlhESUJfQXJnYikKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoQnVpbGRBbHBoYU1hc2soKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAocEJ1ZmZlcikKKyAgICByZXR1cm4gdHJ1ZTsKKworICBtX3BCdWZmZXIgPSBudWxscHRyOworICBtX1dpZHRoID0gMDsKKyAgbV9IZWlnaHQgPSAwOworICBtX1BpdGNoID0gMDsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENGWF9ESUJpdG1hcDo6Q29weShjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTcmMpIHsKKyAgaWYgKG1fcEJ1ZmZlcikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFDcmVhdGUocFNyYy0+R2V0V2lkdGgoKSwgcFNyYy0+R2V0SGVpZ2h0KCksIHBTcmMtPkdldEZvcm1hdCgpKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgU2V0UGFsZXR0ZShwU3JjLT5HZXRQYWxldHRlKCkpOworICBTZXRBbHBoYU1hc2socFNyYy0+bV9wQWxwaGFNYXNrLCBudWxscHRyKTsKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcFNyYy0+R2V0SGVpZ2h0KCk7IHJvdysrKQorICAgIG1lbWNweShtX3BCdWZmZXIuR2V0KCkgKyByb3cgKiBtX1BpdGNoLCBwU3JjLT5HZXRTY2FubGluZShyb3cpLCBtX1BpdGNoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0NGWF9ESUJpdG1hcDo6fkNGWF9ESUJpdG1hcCgpIHt9CisKK3VpbnQ4X3QqIENGWF9ESUJpdG1hcDo6R2V0QnVmZmVyKCkgY29uc3QgeworICByZXR1cm4gbV9wQnVmZmVyLkdldCgpOworfQorCitjb25zdCB1aW50OF90KiBDRlhfRElCaXRtYXA6OkdldFNjYW5saW5lKGludCBsaW5lKSBjb25zdCB7CisgIHJldHVybiBtX3BCdWZmZXIuR2V0KCkgPyBtX3BCdWZmZXIuR2V0KCkgKyBsaW5lICogbV9QaXRjaCA6IG51bGxwdHI7Cit9CisKK3ZvaWQgQ0ZYX0RJQml0bWFwOjpUYWtlT3ZlcihSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYmIHBTcmNCaXRtYXApIHsKKyAgbV9wQnVmZmVyID0gc3RkOjptb3ZlKHBTcmNCaXRtYXAtPm1fcEJ1ZmZlcik7CisgIG1fcFBhbGV0dGUgPSBzdGQ6Om1vdmUocFNyY0JpdG1hcC0+bV9wUGFsZXR0ZSk7CisgIG1fcEFscGhhTWFzayA9IHBTcmNCaXRtYXAtPm1fcEFscGhhTWFzazsKKyAgcFNyY0JpdG1hcC0+bV9wQnVmZmVyID0gbnVsbHB0cjsKKyAgcFNyY0JpdG1hcC0+bV9wQWxwaGFNYXNrID0gbnVsbHB0cjsKKyAgbV9icHAgPSBwU3JjQml0bWFwLT5tX2JwcDsKKyAgbV9BbHBoYUZsYWcgPSBwU3JjQml0bWFwLT5tX0FscGhhRmxhZzsKKyAgbV9XaWR0aCA9IHBTcmNCaXRtYXAtPm1fV2lkdGg7CisgIG1fSGVpZ2h0ID0gcFNyY0JpdG1hcC0+bV9IZWlnaHQ7CisgIG1fUGl0Y2ggPSBwU3JjQml0bWFwLT5tX1BpdGNoOworfQorCit2b2lkIENGWF9ESUJpdG1hcDo6Q2xlYXIodWludDMyX3QgY29sb3IpIHsKKyAgaWYgKCFtX3BCdWZmZXIpCisgICAgcmV0dXJuOworCisgIHVpbnQ4X3QqIHBCdWZmZXIgPSBtX3BCdWZmZXIuR2V0KCk7CisgIHN3aXRjaCAoR2V0Rm9ybWF0KCkpIHsKKyAgICBjYXNlIEZYRElCXzFicHBNYXNrOgorICAgICAgbWVtc2V0KHBCdWZmZXIsIChjb2xvciAmIDB4ZmYwMDAwMDApID8gMHhmZiA6IDAsIG1fUGl0Y2ggKiBtX0hlaWdodCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCXzFicHBSZ2I6IHsKKyAgICAgIGludCBpbmRleCA9IEZpbmRQYWxldHRlKGNvbG9yKTsKKyAgICAgIG1lbXNldChwQnVmZmVyLCBpbmRleCA/IDB4ZmYgOiAwLCBtX1BpdGNoICogbV9IZWlnaHQpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6CisgICAgICBtZW1zZXQocEJ1ZmZlciwgY29sb3IgPj4gMjQsIG1fUGl0Y2ggKiBtX0hlaWdodCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsKKyAgICAgIGludCBpbmRleCA9IEZpbmRQYWxldHRlKGNvbG9yKTsKKyAgICAgIG1lbXNldChwQnVmZmVyLCBpbmRleCwgbV9QaXRjaCAqIG1fSGVpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZYRElCX1JnYjoKKyAgICBjYXNlIEZYRElCX1JnYmE6IHsKKyAgICAgIGludCBhOworICAgICAgaW50IHI7CisgICAgICBpbnQgZzsKKyAgICAgIGludCBiOworICAgICAgc3RkOjp0aWUoYSwgciwgZywgYikgPSBBcmdiRGVjb2RlKGNvbG9yKTsKKyAgICAgIGlmIChyID09IGcgJiYgZyA9PSBiKSB7CisgICAgICAgIG1lbXNldChwQnVmZmVyLCByLCBtX1BpdGNoICogbV9IZWlnaHQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGJ5dGVfcG9zID0gMDsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgICBwQnVmZmVyW2J5dGVfcG9zKytdID0gYjsKKyAgICAgICAgICBwQnVmZmVyW2J5dGVfcG9zKytdID0gZzsKKyAgICAgICAgICBwQnVmZmVyW2J5dGVfcG9zKytdID0gcjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCByb3cgPSAxOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKKyAgICAgICAgICBtZW1jcHkocEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2gsIHBCdWZmZXIsIG1fUGl0Y2gpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGWERJQl9SZ2IzMjoKKyAgICBjYXNlIEZYRElCX0FyZ2I6IHsKKyAgICAgIGNvbG9yID0gSXNDbXlrSW1hZ2UoKSA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOworI2lmZGVmIF9TS0lBX1NVUFBPUlRfCisgICAgICBpZiAoRlhESUJfUmdiMzIgPT0gR2V0Rm9ybWF0KCkgJiYgIUlzQ215a0ltYWdlKCkpCisgICAgICAgIGNvbG9yIHw9IDB4RkYwMDAwMDA7CisjZW5kaWYKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9XaWR0aDsgaSsrKQorICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4ocEJ1ZmZlcilbaV0gPSBjb2xvcjsKKyAgICAgIGZvciAoaW50IHJvdyA9IDE7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykKKyAgICAgICAgbWVtY3B5KHBCdWZmZXIgKyByb3cgKiBtX1BpdGNoLCBwQnVmZmVyLCBtX1BpdGNoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKworYm9vbCBDRlhfRElCaXRtYXA6OlRyYW5zZmVyQml0bWFwKGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3ApIHsKKyAgaWYgKCFtX3BCdWZmZXIpCisgICAgcmV0dXJuIGZhbHNlOworCisgIEdldE92ZXJsYXBSZWN0KGRlc3RfbGVmdCwgZGVzdF90b3AsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAtPkdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgIHBTcmNCaXRtYXAtPkdldEhlaWdodCgpLCBzcmNfbGVmdCwgc3JjX3RvcCwgbnVsbHB0cik7CisgIGlmICh3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKQorICAgIHJldHVybiB0cnVlOworCisgIEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCA9IEdldEZvcm1hdCgpOworICBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCA9IHBTcmNCaXRtYXAtPkdldEZvcm1hdCgpOworICBpZiAoZGVzdF9mb3JtYXQgPT0gc3JjX2Zvcm1hdCkgeworICAgIGlmIChHZXRCUFAoKSA9PSAxKSB7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IG1fcEJ1ZmZlci5HZXQoKSArIChkZXN0X3RvcCArIHJvdykgKiBtX1BpdGNoOworICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpOworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgICBpZiAoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYKKyAgICAgICAgICAgICAgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSB7CisgICAgICAgICAgICBkZXN0X3NjYW5bKGRlc3RfbGVmdCArIGNvbCkgLyA4XSB8PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAoNyAtIChkZXN0X2xlZnQgKyBjb2wpICUgOCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3Rfc2NhblsoZGVzdF9sZWZ0ICsgY29sKSAvIDhdICY9CisgICAgICAgICAgICAgICAgfigxIDw8ICg3IC0gKGRlc3RfbGVmdCArIGNvbCkgJSA4KSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGludCBCcHAgPSBHZXRCUFAoKSAvIDg7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9CisgICAgICAgICAgICBtX3BCdWZmZXIuR2V0KCkgKyAoZGVzdF90b3AgKyByb3cpICogbV9QaXRjaCArIGRlc3RfbGVmdCAqIEJwcDsKKyAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPQorICAgICAgICAgICAgcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIEJwcDsKKyAgICAgICAgbWVtY3B5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoICogQnBwKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKG1fcFBhbGV0dGUpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobV9icHAgPT0gOCkKKyAgICAgIGRlc3RfZm9ybWF0ID0gRlhESUJfOGJwcE1hc2s7CisKKyAgICB1aW50OF90KiBkZXN0X2J1ZiA9CisgICAgICAgIG1fcEJ1ZmZlci5HZXQoKSArIGRlc3RfdG9wICogbV9QaXRjaCArIGRlc3RfbGVmdCAqIEdldEJQUCgpIC8gODsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDMyX3QsIEZ4RnJlZURlbGV0ZXI+IGRfcGx0OworICAgIGlmICghQ29udmVydEJ1ZmZlcihkZXN0X2Zvcm1hdCwgZGVzdF9idWYsIG1fUGl0Y2gsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wLCAmZF9wbHQpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIENGWF9ESUJpdG1hcDo6TG9hZENoYW5uZWwoRlhESUJfQ2hhbm5lbCBkZXN0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfQ2hhbm5lbCBzcmNDaGFubmVsKSB7CisgIGlmICghbV9wQnVmZmVyKQorICAgIHJldHVybiBmYWxzZTsKKworICBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4gcFNyY0Nsb25lID0gcFNyY0JpdG1hcDsKKyAgaW50IHNyY09mZnNldDsKKyAgaWYgKHNyY0NoYW5uZWwgPT0gRlhESUJfQWxwaGEpIHsKKyAgICBpZiAoIXBTcmNCaXRtYXAtPkhhc0FscGhhKCkgJiYgIXBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAocFNyY0JpdG1hcC0+R2V0QlBQKCkgPT0gMSkgeworICAgICAgcFNyY0Nsb25lID0gcFNyY0JpdG1hcC0+Q2xvbmVDb252ZXJ0KEZYRElCXzhicHBNYXNrKTsKKyAgICAgIGlmICghcFNyY0Nsb25lKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHNyY09mZnNldCA9IHBTcmNCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IgPyAzIDogMDsKKyAgfSBlbHNlIHsKKyAgICBpZiAocFNyY0JpdG1hcC0+SXNBbHBoYU1hc2soKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChwU3JjQml0bWFwLT5HZXRCUFAoKSA8IDI0KSB7CisgICAgICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgeworICAgICAgICBwU3JjQ2xvbmUgPSBwU3JjQml0bWFwLT5DbG9uZUNvbnZlcnQoc3RhdGljX2Nhc3Q8RlhESUJfRm9ybWF0PigKKyAgICAgICAgICAgIChwU3JjQml0bWFwLT5HZXRGb3JtYXQoKSAmIDB4ZmYwMCkgfCAweDIwKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwU3JjQ2xvbmUgPSBwU3JjQml0bWFwLT5DbG9uZUNvbnZlcnQoc3RhdGljX2Nhc3Q8RlhESUJfRm9ybWF0PigKKyAgICAgICAgICAgIChwU3JjQml0bWFwLT5HZXRGb3JtYXQoKSAmIDB4ZmYwMCkgfCAweDE4KSk7CisgICAgICB9CisgICAgICBpZiAoIXBTcmNDbG9uZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzcmNPZmZzZXQgPSBnX0NoYW5uZWxPZmZzZXRbc3JjQ2hhbm5lbF07CisgIH0KKyAgaW50IGRlc3RPZmZzZXQgPSAwOworICBpZiAoZGVzdENoYW5uZWwgPT0gRlhESUJfQWxwaGEpIHsKKyAgICBpZiAoSXNBbHBoYU1hc2soKSkgeworICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KEZYRElCXzhicHBNYXNrKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoSXNDbXlrSW1hZ2UoKSA/IEZYRElCX0NteWthIDogRlhESUJfQXJnYikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgaWYgKEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpCisgICAgICAgIGRlc3RPZmZzZXQgPSAzOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoSXNBbHBoYU1hc2soKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChHZXRCUFAoKSA8IDI0KSB7CisgICAgICBpZiAoSGFzQWxwaGEoKSkgeworICAgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoSXNDbXlrSW1hZ2UoKSA/IEZYRElCX0NteWthIDogRlhESUJfQXJnYikpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXworICAgICAgfSBlbHNlIGlmICghQ29udmVydEZvcm1hdChJc0NteWtJbWFnZSgpID8gRlhESUJfQ215ayA6IEZYRElCX1JnYjMyKSkgeworI2Vsc2UKKyAgICAgIH0gZWxzZSBpZiAoIUNvbnZlcnRGb3JtYXQoSXNDbXlrSW1hZ2UoKSA/IEZYRElCX0NteWsgOiBGWERJQl9SZ2IpKSB7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBkZXN0T2Zmc2V0ID0gZ19DaGFubmVsT2Zmc2V0W2Rlc3RDaGFubmVsXTsKKyAgfQorICBpZiAoc3JjQ2hhbm5lbCA9PSBGWERJQl9BbHBoYSAmJiBwU3JjQ2xvbmUtPm1fcEFscGhhTWFzaykgeworICAgIFJldGFpblB0cjxDRlhfRElCU291cmNlPiBwQWxwaGFNYXNrID0gcFNyY0Nsb25lLT5tX3BBbHBoYU1hc2s7CisgICAgaWYgKHBTcmNDbG9uZS0+R2V0V2lkdGgoKSAhPSBtX1dpZHRoIHx8CisgICAgICAgIHBTcmNDbG9uZS0+R2V0SGVpZ2h0KCkgIT0gbV9IZWlnaHQpIHsKKyAgICAgIGlmIChwQWxwaGFNYXNrKSB7CisgICAgICAgIHBBbHBoYU1hc2sgPSBwQWxwaGFNYXNrLT5TdHJldGNoVG8obV9XaWR0aCwgbV9IZWlnaHQsIDAsIG51bGxwdHIpOworICAgICAgICBpZiAoIXBBbHBoYU1hc2spCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBwU3JjQ2xvbmUgPSBzdGQ6Om1vdmUocEFscGhhTWFzayk7CisgICAgc3JjT2Zmc2V0ID0gMDsKKyAgfSBlbHNlIGlmIChwU3JjQ2xvbmUtPkdldFdpZHRoKCkgIT0gbV9XaWR0aCB8fAorICAgICAgICAgICAgIHBTcmNDbG9uZS0+R2V0SGVpZ2h0KCkgIT0gbV9IZWlnaHQpIHsKKyAgICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwU3JjTWF0Y2hlZCA9CisgICAgICAgIHBTcmNDbG9uZS0+U3RyZXRjaFRvKG1fV2lkdGgsIG1fSGVpZ2h0LCAwLCBudWxscHRyKTsKKyAgICBpZiAoIXBTcmNNYXRjaGVkKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcFNyY0Nsb25lID0gc3RkOjptb3ZlKHBTcmNNYXRjaGVkKTsKKyAgfQorICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwRHN0KHRoaXMpOworICBpZiAoZGVzdENoYW5uZWwgPT0gRlhESUJfQWxwaGEgJiYgbV9wQWxwaGFNYXNrKSB7CisgICAgcERzdCA9IG1fcEFscGhhTWFzazsKKyAgICBkZXN0T2Zmc2V0ID0gMDsKKyAgfQorICBpbnQgc3JjQnl0ZXMgPSBwU3JjQ2xvbmUtPkdldEJQUCgpIC8gODsKKyAgaW50IGRlc3RCeXRlcyA9IHBEc3QtPkdldEJQUCgpIC8gODsKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9wb3MgPSAodWludDhfdCopcERzdC0+R2V0U2NhbmxpbmUocm93KSArIGRlc3RPZmZzZXQ7CisgICAgY29uc3QgdWludDhfdCogc3JjX3BvcyA9IHBTcmNDbG9uZS0+R2V0U2NhbmxpbmUocm93KSArIHNyY09mZnNldDsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgeworICAgICAgKmRlc3RfcG9zID0gKnNyY19wb3M7CisgICAgICBkZXN0X3BvcyArPSBkZXN0Qnl0ZXM7CisgICAgICBzcmNfcG9zICs9IHNyY0J5dGVzOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDRlhfRElCaXRtYXA6OkxvYWRDaGFubmVsKEZYRElCX0NoYW5uZWwgZGVzdENoYW5uZWwsIGludCB2YWx1ZSkgeworICBpZiAoIW1fcEJ1ZmZlcikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW50IGRlc3RPZmZzZXQ7CisgIGlmIChkZXN0Q2hhbm5lbCA9PSBGWERJQl9BbHBoYSkgeworICAgIGlmIChJc0FscGhhTWFzaygpKSB7CisgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoRlhESUJfOGJwcE1hc2spKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGRlc3RPZmZzZXQgPSAwOworICAgIH0gZWxzZSB7CisgICAgICBkZXN0T2Zmc2V0ID0gMDsKKyAgICAgIGlmICghQ29udmVydEZvcm1hdChJc0NteWtJbWFnZSgpID8gRlhESUJfQ215a2EgOiBGWERJQl9BcmdiKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgeworICAgICAgICBkZXN0T2Zmc2V0ID0gMzsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKElzQWxwaGFNYXNrKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKEdldEJQUCgpIDwgMjQpIHsKKyAgICAgIGlmIChIYXNBbHBoYSgpKSB7CisgICAgICAgIGlmICghQ29udmVydEZvcm1hdChJc0NteWtJbWFnZSgpID8gRlhESUJfQ215a2EgOiBGWERJQl9BcmdiKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXworICAgICAgfSBlbHNlIGlmICghQ29udmVydEZvcm1hdChJc0NteWtJbWFnZSgpID8gRlhESUJfQ215ayA6IEZYRElCX1JnYikpIHsKKyNlbHNlCisgICAgICB9IGVsc2UgaWYgKCFDb252ZXJ0Rm9ybWF0KElzQ215a0ltYWdlKCkgPyBGWERJQl9DbXlrIDogRlhESUJfUmdiMzIpKSB7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBkZXN0T2Zmc2V0ID0gZ19DaGFubmVsT2Zmc2V0W2Rlc3RDaGFubmVsXTsKKyAgfQorICBpbnQgQnBwID0gR2V0QlBQKCkgLyA4OworICBpZiAoQnBwID09IDEpIHsKKyAgICBtZW1zZXQobV9wQnVmZmVyLkdldCgpLCB2YWx1ZSwgbV9IZWlnaHQgKiBtX1BpdGNoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAoZGVzdENoYW5uZWwgPT0gRlhESUJfQWxwaGEgJiYgbV9wQWxwaGFNYXNrKSB7CisgICAgbWVtc2V0KG1fcEFscGhhTWFzay0+R2V0QnVmZmVyKCksIHZhbHVlLAorICAgICAgICAgICBtX3BBbHBoYU1hc2stPkdldEhlaWdodCgpICogbV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKKyAgICB1aW50OF90KiBzY2FuX2xpbmUgPSBtX3BCdWZmZXIuR2V0KCkgKyByb3cgKiBtX1BpdGNoICsgZGVzdE9mZnNldDsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgeworICAgICAgKnNjYW5fbGluZSA9IHZhbHVlOworICAgICAgc2Nhbl9saW5lICs9IEJwcDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ0ZYX0RJQml0bWFwOjpNdWx0aXBseUFscGhhKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNyY0JpdG1hcCkgeworICBpZiAoIW1fcEJ1ZmZlcikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQVNTRVJUKHBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpOworICBpZiAoIXBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghSXNBbHBoYU1hc2soKSAmJiAhSGFzQWxwaGEoKSkKKyAgICByZXR1cm4gTG9hZENoYW5uZWwoRlhESUJfQWxwaGEsIHBTcmNCaXRtYXAsIEZYRElCX0FscGhhKTsKKworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwU3JjQ2xvbmUgPSBwU3JjQml0bWFwLkFzPENGWF9ESUJpdG1hcD4oKTsKKyAgaWYgKHBTcmNCaXRtYXAtPkdldFdpZHRoKCkgIT0gbV9XaWR0aCB8fAorICAgICAgcFNyY0JpdG1hcC0+R2V0SGVpZ2h0KCkgIT0gbV9IZWlnaHQpIHsKKyAgICBwU3JjQ2xvbmUgPSBwU3JjQml0bWFwLT5TdHJldGNoVG8obV9XaWR0aCwgbV9IZWlnaHQsIDAsIG51bGxwdHIpOworICAgIGlmICghcFNyY0Nsb25lKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChJc0FscGhhTWFzaygpKSB7CisgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KEZYRElCXzhicHBNYXNrKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykgeworICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wQnVmZmVyLkdldCgpICsgbV9QaXRjaCAqIHJvdzsKKyAgICAgIHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0Nsb25lLT5tX3BCdWZmZXIuR2V0KCkgKyBwU3JjQ2xvbmUtPm1fUGl0Y2ggKiByb3c7CisgICAgICBpZiAocFNyY0Nsb25lLT5HZXRCUFAoKSA9PSAxKSB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgaWYgKCEoKDEgPDwgKDcgLSBjb2wgJSA4KSkgJiBzcmNfc2Nhbltjb2wgLyA4XSkpCisgICAgICAgICAgICBkZXN0X3NjYW5bY29sXSA9IDA7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9ICgqZGVzdF9zY2FuKSAqIHNyY19zY2FuW2NvbF0gLyAyNTU7CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpIHsKKyAgICAgIGlmIChwU3JjQ2xvbmUtPkdldEJQUCgpID09IDEpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7CisgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IG1fcEJ1ZmZlci5HZXQoKSArIG1fUGl0Y2ggKiByb3cgKyAzOworICAgICAgICB1aW50OF90KiBzcmNfc2NhbiA9CisgICAgICAgICAgICBwU3JjQ2xvbmUtPm1fcEJ1ZmZlci5HZXQoKSArIHBTcmNDbG9uZS0+bV9QaXRjaCAqIHJvdzsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gKCpkZXN0X3NjYW4pICogc3JjX3NjYW5bY29sXSAvIDI1NTsKKyAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBtX3BBbHBoYU1hc2stPk11bHRpcGx5QWxwaGEocFNyY0Nsb25lKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ0ZYX0RJQml0bWFwOjpNdWx0aXBseUFscGhhKGludCBhbHBoYSkgeworICBpZiAoIW1fcEJ1ZmZlcikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc3dpdGNoIChHZXRGb3JtYXQoKSkgeworICAgIGNhc2UgRlhESUJfMWJwcE1hc2s6CisgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoRlhESUJfOGJwcE1hc2spKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIE11bHRpcGx5QWxwaGEoYWxwaGEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWERJQl84YnBwTWFzazogeworICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7CisgICAgICAgIHVpbnQ4X3QqIHNjYW5fbGluZSA9IG1fcEJ1ZmZlci5HZXQoKSArIHJvdyAqIG1fUGl0Y2g7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgc2Nhbl9saW5lW2NvbF0gPSBzY2FuX2xpbmVbY29sXSAqIGFscGhhIC8gMjU1OworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGWERJQl9BcmdiOiB7CisgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCogc2Nhbl9saW5lID0gbV9wQnVmZmVyLkdldCgpICsgcm93ICogbV9QaXRjaCArIDM7CisgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgKnNjYW5fbGluZSA9ICgqc2Nhbl9saW5lKSAqIGFscGhhIC8gMjU1OworICAgICAgICAgIHNjYW5fbGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChIYXNBbHBoYSgpKSB7CisgICAgICAgIG1fcEFscGhhTWFzay0+TXVsdGlwbHlBbHBoYShhbHBoYSk7CisgICAgICB9IGVsc2UgaWYgKElzQ215a0ltYWdlKCkpIHsKKyAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KChGWERJQl9Gb3JtYXQpKEdldEZvcm1hdCgpIHwgMHgwMjAwKSkpIHsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbV9wQWxwaGFNYXNrLT5NdWx0aXBseUFscGhhKGFscGhhKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghQ29udmVydEZvcm1hdChGWERJQl9BcmdiKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBNdWx0aXBseUFscGhhKGFscGhhKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiB0cnVlOworfQorCit1aW50MzJfdCBDRlhfRElCaXRtYXA6OkdldFBpeGVsKGludCB4LCBpbnQgeSkgY29uc3QgeworICBpZiAoIW1fcEJ1ZmZlcikKKyAgICByZXR1cm4gMDsKKworICB1aW50OF90KiBwb3MgPSBtX3BCdWZmZXIuR2V0KCkgKyB5ICogbV9QaXRjaCArIHggKiBHZXRCUFAoKSAvIDg7CisgIHN3aXRjaCAoR2V0Rm9ybWF0KCkpIHsKKyAgICBjYXNlIEZYRElCXzFicHBNYXNrOiB7CisgICAgICBpZiAoKCpwb3MpICYgKDEgPDwgKDcgLSB4ICUgOCkpKSB7CisgICAgICAgIHJldHVybiAweGZmMDAwMDAwOworICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGNhc2UgRlhESUJfMWJwcFJnYjogeworICAgICAgaWYgKCgqcG9zKSAmICgxIDw8ICg3IC0geCAlIDgpKSkgeworICAgICAgICByZXR1cm4gbV9wUGFsZXR0ZSA/IG1fcFBhbGV0dGUuZ2V0KClbMV0gOiAweGZmZmZmZmZmOworICAgICAgfQorICAgICAgcmV0dXJuIG1fcFBhbGV0dGUgPyBtX3BQYWxldHRlLmdldCgpWzBdIDogMHhmZjAwMDAwMDsKKyAgICB9CisgICAgY2FzZSBGWERJQl84YnBwTWFzazoKKyAgICAgIHJldHVybiAoKnBvcykgPDwgMjQ7CisgICAgY2FzZSBGWERJQl84YnBwUmdiOgorICAgICAgcmV0dXJuIG1fcFBhbGV0dGUgPyBtX3BQYWxldHRlLmdldCgpWypwb3NdCisgICAgICAgICAgICAgICAgICAgICAgICA6ICgweGZmMDAwMDAwIHwgKCgqcG9zKSAqIDB4MTAxMDEpKTsKKyAgICBjYXNlIEZYRElCX1JnYjoKKyAgICBjYXNlIEZYRElCX1JnYmE6CisgICAgY2FzZSBGWERJQl9SZ2IzMjoKKyAgICAgIHJldHVybiBGWEFSR0JfR0VURElCKHBvcykgfCAweGZmMDAwMDAwOworICAgIGNhc2UgRlhESUJfQXJnYjoKKyAgICAgIHJldHVybiBGWEFSR0JfR0VURElCKHBvcyk7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAwOworfQorCit2b2lkIENGWF9ESUJpdG1hcDo6U2V0UGl4ZWwoaW50IHgsIGludCB5LCB1aW50MzJfdCBjb2xvcikgeworICBpZiAoIW1fcEJ1ZmZlcikKKyAgICByZXR1cm47CisKKyAgaWYgKHggPCAwIHx8IHggPj0gbV9XaWR0aCB8fCB5IDwgMCB8fCB5ID49IG1fSGVpZ2h0KQorICAgIHJldHVybjsKKworICB1aW50OF90KiBwb3MgPSBtX3BCdWZmZXIuR2V0KCkgKyB5ICogbV9QaXRjaCArIHggKiBHZXRCUFAoKSAvIDg7CisgIHN3aXRjaCAoR2V0Rm9ybWF0KCkpIHsKKyAgICBjYXNlIEZYRElCXzFicHBNYXNrOgorICAgICAgaWYgKGNvbG9yID4+IDI0KSB7CisgICAgICAgICpwb3MgfD0gMSA8PCAoNyAtIHggJSA4KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpwb3MgJj0gfigxIDw8ICg3IC0geCAlIDgpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfMWJwcFJnYjoKKyAgICAgIGlmIChtX3BQYWxldHRlKSB7CisgICAgICAgIGlmIChjb2xvciA9PSBtX3BQYWxldHRlLmdldCgpWzFdKSB7CisgICAgICAgICAgKnBvcyB8PSAxIDw8ICg3IC0geCAlIDgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpwb3MgJj0gfigxIDw8ICg3IC0geCAlIDgpKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGNvbG9yID09IDB4ZmZmZmZmZmYpIHsKKyAgICAgICAgICAqcG9zIHw9IDEgPDwgKDcgLSB4ICUgOCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKnBvcyAmPSB+KDEgPDwgKDcgLSB4ICUgOCkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCXzhicHBNYXNrOgorICAgICAgKnBvcyA9ICh1aW50OF90KShjb2xvciA+PiAyNCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsKKyAgICAgIGlmIChtX3BQYWxldHRlKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKyAgICAgICAgICBpZiAobV9wUGFsZXR0ZS5nZXQoKVtpXSA9PSBjb2xvcikgeworICAgICAgICAgICAgKnBvcyA9ICh1aW50OF90KWk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICpwb3MgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKnBvcyA9IEZYUkdCMkdSQVkoRlhBUkdCX1IoY29sb3IpLCBGWEFSR0JfRyhjb2xvciksIEZYQVJHQl9CKGNvbG9yKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGWERJQl9SZ2I6CisgICAgY2FzZSBGWERJQl9SZ2IzMjogeworICAgICAgaW50IGFscGhhID0gRlhBUkdCX0EoY29sb3IpOworICAgICAgcG9zWzBdID0gKEZYQVJHQl9CKGNvbG9yKSAqIGFscGhhICsgcG9zWzBdICogKDI1NSAtIGFscGhhKSkgLyAyNTU7CisgICAgICBwb3NbMV0gPSAoRlhBUkdCX0coY29sb3IpICogYWxwaGEgKyBwb3NbMV0gKiAoMjU1IC0gYWxwaGEpKSAvIDI1NTsKKyAgICAgIHBvc1syXSA9IChGWEFSR0JfUihjb2xvcikgKiBhbHBoYSArIHBvc1syXSAqICgyNTUgLSBhbHBoYSkpIC8gMjU1OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRlhESUJfUmdiYTogeworICAgICAgcG9zWzBdID0gRlhBUkdCX0IoY29sb3IpOworICAgICAgcG9zWzFdID0gRlhBUkdCX0coY29sb3IpOworICAgICAgcG9zWzJdID0gRlhBUkdCX1IoY29sb3IpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRlhESUJfQXJnYjoKKyAgICAgIEZYQVJHQl9TRVRESUIocG9zLCBjb2xvcik7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCBDRlhfRElCaXRtYXA6OkRvd25TYW1wbGVTY2FubGluZShpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9icHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGbGlwWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfd2lkdGgpIGNvbnN0IHsKKyAgaWYgKCFtX3BCdWZmZXIpCisgICAgcmV0dXJuOworCisgIGludCBzcmNfQnBwID0gbV9icHAgLyA4OworICB1aW50OF90KiBzY2FubGluZSA9IG1fcEJ1ZmZlci5HZXQoKSArIGxpbmUgKiBtX1BpdGNoOworICBpZiAoc3JjX0JwcCA9PSAwKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbGlwX3dpZHRoOyBpKyspIHsKKyAgICAgIHVpbnQzMl90IGRlc3RfeCA9IGNsaXBfbGVmdCArIGk7CisgICAgICB1aW50MzJfdCBzcmNfeCA9IGRlc3RfeCAqIG1fV2lkdGggLyBkZXN0X3dpZHRoOworICAgICAgaWYgKGJGbGlwWCkgeworICAgICAgICBzcmNfeCA9IG1fV2lkdGggLSBzcmNfeCAtIDE7CisgICAgICB9CisgICAgICBzcmNfeCAlPSBtX1dpZHRoOworICAgICAgZGVzdF9zY2FuW2ldID0gKHNjYW5saW5lW3NyY194IC8gOF0gJiAoMSA8PCAoNyAtIHNyY194ICUgOCkpKSA/IDI1NSA6IDA7CisgICAgfQorICB9IGVsc2UgaWYgKHNyY19CcHAgPT0gMSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xpcF93aWR0aDsgaSsrKSB7CisgICAgICB1aW50MzJfdCBkZXN0X3ggPSBjbGlwX2xlZnQgKyBpOworICAgICAgdWludDMyX3Qgc3JjX3ggPSBkZXN0X3ggKiBtX1dpZHRoIC8gZGVzdF93aWR0aDsKKyAgICAgIGlmIChiRmxpcFgpIHsKKyAgICAgICAgc3JjX3ggPSBtX1dpZHRoIC0gc3JjX3ggLSAxOworICAgICAgfQorICAgICAgc3JjX3ggJT0gbV9XaWR0aDsKKyAgICAgIGludCBkZXN0X3BvcyA9IGk7CisgICAgICBpZiAobV9wUGFsZXR0ZSkgeworICAgICAgICBpZiAoIUlzQ215a0ltYWdlKCkpIHsKKyAgICAgICAgICBkZXN0X3BvcyAqPSAzOworICAgICAgICAgIEZYX0FSR0IgYXJnYiA9IG1fcFBhbGV0dGUuZ2V0KClbc2NhbmxpbmVbc3JjX3hdXTsKKyAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3NdID0gRlhBUkdCX0IoYXJnYik7CisgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgMV0gPSBGWEFSR0JfRyhhcmdiKTsKKyAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3MgKyAyXSA9IEZYQVJHQl9SKGFyZ2IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRlc3RfcG9zICo9IDQ7CisgICAgICAgICAgRlhfQ01ZSyBjbXlrID0gbV9wUGFsZXR0ZS5nZXQoKVtzY2FubGluZVtzcmNfeF1dOworICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3Bvc10gPSBGWFNZU19HZXRDVmFsdWUoY215ayk7CisgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgMV0gPSBGWFNZU19HZXRNVmFsdWUoY215ayk7CisgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgMl0gPSBGWFNZU19HZXRZVmFsdWUoY215ayk7CisgICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgM10gPSBGWFNZU19HZXRLVmFsdWUoY215ayk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlc3Rfc2NhbltkZXN0X3Bvc10gPSBzY2FubGluZVtzcmNfeF07CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xpcF93aWR0aDsgaSsrKSB7CisgICAgICB1aW50MzJfdCBkZXN0X3ggPSBjbGlwX2xlZnQgKyBpOworICAgICAgdWludDMyX3Qgc3JjX3ggPQorICAgICAgICAgIGJGbGlwWCA/IChtX1dpZHRoIC0gZGVzdF94ICogbV9XaWR0aCAvIGRlc3Rfd2lkdGggLSAxKSAqIHNyY19CcHAKKyAgICAgICAgICAgICAgICAgOiAoZGVzdF94ICogbV9XaWR0aCAvIGRlc3Rfd2lkdGgpICogc3JjX0JwcDsKKyAgICAgIHNyY194ICU9IG1fV2lkdGggKiBzcmNfQnBwOworICAgICAgaW50IGRlc3RfcG9zID0gaSAqIHNyY19CcHA7CisgICAgICBmb3IgKGludCBiID0gMDsgYiA8IHNyY19CcHA7IGIrKykgeworICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3MgKyBiXSA9IHNjYW5saW5lW3NyY194ICsgYl07CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ0ZYX0RJQml0bWFwOjpDb252ZXJ0UkdCQ29sb3JTY2FsZSh1aW50MzJfdCBmb3JlY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYmFja2NvbG9yKSB7CisgIGludCBmciA9IEZYU1lTX0dldFJWYWx1ZShmb3JlY29sb3IpOworICBpbnQgZmcgPSBGWFNZU19HZXRHVmFsdWUoZm9yZWNvbG9yKTsKKyAgaW50IGZiID0gRlhTWVNfR2V0QlZhbHVlKGZvcmVjb2xvcik7CisgIGludCBiciA9IEZYU1lTX0dldFJWYWx1ZShiYWNrY29sb3IpOworICBpbnQgYmcgPSBGWFNZU19HZXRHVmFsdWUoYmFja2NvbG9yKTsKKyAgaW50IGJiID0gRlhTWVNfR2V0QlZhbHVlKGJhY2tjb2xvcik7CisgIGlmIChtX2JwcCA8PSA4KSB7CisgICAgaWYgKGZvcmVjb2xvciA9PSAwICYmIGJhY2tjb2xvciA9PSAweGZmZmZmZiAmJiAhbV9wUGFsZXR0ZSkKKyAgICAgIHJldHVybjsKKyAgICBpZiAoIW1fcFBhbGV0dGUpCisgICAgICBCdWlsZFBhbGV0dGUoKTsKKyAgICBpbnQgc2l6ZSA9IDEgPDwgbV9icHA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgIGludCBncmF5ID0gRlhSR0IyR1JBWShGWEFSR0JfUihtX3BQYWxldHRlLmdldCgpW2ldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfRyhtX3BQYWxldHRlLmdldCgpW2ldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfQihtX3BQYWxldHRlLmdldCgpW2ldKSk7CisgICAgICBtX3BQYWxldHRlLmdldCgpW2ldID0KKyAgICAgICAgICBGWEFSR0JfTUFLRSgweGZmLCBiciArIChmciAtIGJyKSAqIGdyYXkgLyAyNTUsCisgICAgICAgICAgICAgICAgICAgICAgYmcgKyAoZmcgLSBiZykgKiBncmF5IC8gMjU1LCBiYiArIChmYiAtIGJiKSAqIGdyYXkgLyAyNTUpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGZvcmVjb2xvciA9PSAwICYmIGJhY2tjb2xvciA9PSAweGZmZmZmZikgeworICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyArK3JvdykgeworICAgICAgdWludDhfdCogc2NhbmxpbmUgPSBtX3BCdWZmZXIuR2V0KCkgKyByb3cgKiBtX1BpdGNoOworICAgICAgaW50IGdhcCA9IG1fYnBwIC8gOCAtIDI7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyArK2NvbCkgeworICAgICAgICBpbnQgZ3JheSA9IEZYUkdCMkdSQVkoc2NhbmxpbmVbMl0sIHNjYW5saW5lWzFdLCBzY2FubGluZVswXSk7CisgICAgICAgICpzY2FubGluZSsrID0gZ3JheTsKKyAgICAgICAgKnNjYW5saW5lKysgPSBncmF5OworICAgICAgICAqc2NhbmxpbmUgPSBncmF5OworICAgICAgICBzY2FubGluZSArPSBnYXA7CisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgKytyb3cpIHsKKyAgICB1aW50OF90KiBzY2FubGluZSA9IG1fcEJ1ZmZlci5HZXQoKSArIHJvdyAqIG1fUGl0Y2g7CisgICAgaW50IGdhcCA9IG1fYnBwIC8gOCAtIDI7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgKytjb2wpIHsKKyAgICAgIGludCBncmF5ID0gRlhSR0IyR1JBWShzY2FubGluZVsyXSwgc2NhbmxpbmVbMV0sIHNjYW5saW5lWzBdKTsKKyAgICAgICpzY2FubGluZSsrID0gYmIgKyAoZmIgLSBiYikgKiBncmF5IC8gMjU1OworICAgICAgKnNjYW5saW5lKysgPSBiZyArIChmZyAtIGJnKSAqIGdyYXkgLyAyNTU7CisgICAgICAqc2NhbmxpbmUgPSBiciArIChmciAtIGJyKSAqIGdyYXkgLyAyNTU7CisgICAgICBzY2FubGluZSArPSBnYXA7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ0ZYX0RJQml0bWFwOjpDb252ZXJ0Q01ZS0NvbG9yU2NhbGUodWludDMyX3QgZm9yZWNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBiYWNrY29sb3IpIHsKKyAgaW50IGZjID0gRlhTWVNfR2V0Q1ZhbHVlKGZvcmVjb2xvcik7CisgIGludCBmbSA9IEZYU1lTX0dldE1WYWx1ZShmb3JlY29sb3IpOworICBpbnQgZnkgPSBGWFNZU19HZXRZVmFsdWUoZm9yZWNvbG9yKTsKKyAgaW50IGZrID0gRlhTWVNfR2V0S1ZhbHVlKGZvcmVjb2xvcik7CisgIGludCBiYyA9IEZYU1lTX0dldENWYWx1ZShiYWNrY29sb3IpOworICBpbnQgYm0gPSBGWFNZU19HZXRNVmFsdWUoYmFja2NvbG9yKTsKKyAgaW50IGJ5ID0gRlhTWVNfR2V0WVZhbHVlKGJhY2tjb2xvcik7CisgIGludCBiayA9IEZYU1lTX0dldEtWYWx1ZShiYWNrY29sb3IpOworICBpZiAobV9icHAgPD0gOCkgeworICAgIGlmIChmb3JlY29sb3IgPT0gMHhmZiAmJiBiYWNrY29sb3IgPT0gMCAmJiAhbV9wUGFsZXR0ZSkKKyAgICAgIHJldHVybjsKKyAgICBpZiAoIW1fcFBhbGV0dGUpCisgICAgICBCdWlsZFBhbGV0dGUoKTsKKyAgICBpbnQgc2l6ZSA9IDEgPDwgbV9icHA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgIHVpbnQ4X3QgcjsKKyAgICAgIHVpbnQ4X3QgZzsKKyAgICAgIHVpbnQ4X3QgYjsKKyAgICAgIHN0ZDo6dGllKHIsIGcsIGIpID0KKyAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKG1fcFBhbGV0dGUuZ2V0KClbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRNVmFsdWUobV9wUGFsZXR0ZS5nZXQoKVtpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldFlWYWx1ZShtX3BQYWxldHRlLmdldCgpW2ldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0S1ZhbHVlKG1fcFBhbGV0dGUuZ2V0KClbaV0pKTsKKyAgICAgIGludCBncmF5ID0gMjU1IC0gRlhSR0IyR1JBWShyLCBnLCBiKTsKKyAgICAgIG1fcFBhbGV0dGUuZ2V0KClbaV0gPQorICAgICAgICAgIENteWtFbmNvZGUoYmMgKyAoZmMgLSBiYykgKiBncmF5IC8gMjU1LCBibSArIChmbSAtIGJtKSAqIGdyYXkgLyAyNTUsCisgICAgICAgICAgICAgICAgICAgICBieSArIChmeSAtIGJ5KSAqIGdyYXkgLyAyNTUsIGJrICsgKGZrIC0gYmspICogZ3JheSAvIDI1NSk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBpZiAoZm9yZWNvbG9yID09IDB4ZmYgJiYgYmFja2NvbG9yID09IDB4MDApIHsKKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgKytyb3cpIHsKKyAgICAgIHVpbnQ4X3QqIHNjYW5saW5lID0gbV9wQnVmZmVyLkdldCgpICsgcm93ICogbV9QaXRjaDsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7ICsrY29sKSB7CisgICAgICAgIHVpbnQ4X3QgcjsKKyAgICAgICAgdWludDhfdCBnOworICAgICAgICB1aW50OF90IGI7CisgICAgICAgIHN0ZDo6dGllKHIsIGcsIGIpID0gQWRvYmVDTVlLX3RvX3NSR0IxKHNjYW5saW5lWzBdLCBzY2FubGluZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmxpbmVbMl0sIHNjYW5saW5lWzNdKTsKKyAgICAgICAgKnNjYW5saW5lKysgPSAwOworICAgICAgICAqc2NhbmxpbmUrKyA9IDA7CisgICAgICAgICpzY2FubGluZSsrID0gMDsKKyAgICAgICAgKnNjYW5saW5lKysgPSAyNTUgLSBGWFJHQjJHUkFZKHIsIGcsIGIpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7ICsrcm93KSB7CisgICAgdWludDhfdCogc2NhbmxpbmUgPSBtX3BCdWZmZXIuR2V0KCkgKyByb3cgKiBtX1BpdGNoOworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7ICsrY29sKSB7CisgICAgICB1aW50OF90IHI7CisgICAgICB1aW50OF90IGc7CisgICAgICB1aW50OF90IGI7CisgICAgICBzdGQ6OnRpZShyLCBnLCBiKSA9IEFkb2JlQ01ZS190b19zUkdCMShzY2FubGluZVswXSwgc2NhbmxpbmVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubGluZVsyXSwgc2NhbmxpbmVbM10pOworICAgICAgaW50IGdyYXkgPSAyNTUgLSBGWFJHQjJHUkFZKHIsIGcsIGIpOworICAgICAgKnNjYW5saW5lKysgPSBiYyArIChmYyAtIGJjKSAqIGdyYXkgLyAyNTU7CisgICAgICAqc2NhbmxpbmUrKyA9IGJtICsgKGZtIC0gYm0pICogZ3JheSAvIDI1NTsKKyAgICAgICpzY2FubGluZSsrID0gYnkgKyAoZnkgLSBieSkgKiBncmF5IC8gMjU1OworICAgICAgKnNjYW5saW5lKysgPSBiayArIChmayAtIGJrKSAqIGdyYXkgLyAyNTU7CisgICAgfQorICB9Cit9CisKK2Jvb2wgQ0ZYX0RJQml0bWFwOjpDb252ZXJ0Q29sb3JTY2FsZSh1aW50MzJfdCBmb3JlY29sb3IsIHVpbnQzMl90IGJhY2tjb2xvcikgeworICBBU1NFUlQoIUlzQWxwaGFNYXNrKCkpOworICBpZiAoIW1fcEJ1ZmZlciB8fCBJc0FscGhhTWFzaygpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoSXNDbXlrSW1hZ2UoKSkKKyAgICBDb252ZXJ0Q01ZS0NvbG9yU2NhbGUoZm9yZWNvbG9yLCBiYWNrY29sb3IpOworICBlbHNlCisgICAgQ29udmVydFJHQkNvbG9yU2NhbGUoZm9yZWNvbG9yLCBiYWNrY29sb3IpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDRlhfRElCaXRtYXA6OkNhbGN1bGF0ZVBpdGNoQW5kU2l6ZShpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHNpemUpIHsKKyAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICgoSU5UX01BWCAtIDMxKSAvIHdpZHRoIDwgKGZvcm1hdCAmIDB4RkYpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoISpwaXRjaCkKKyAgICAqcGl0Y2ggPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oKHdpZHRoICogKGZvcm1hdCAmIDB4ZmYpICsgMzEpIC8gMzIgKiA0KTsKKworICBpZiAoKDEgPDwgMzApIC8gKnBpdGNoIDwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGhlaWdodCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgICpzaXplID0gKnBpdGNoICogc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGhlaWdodCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENGWF9ESUJpdG1hcDo6Q29tcG9zaXRlQml0bWFwKGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJnYkJ5dGVPcmRlcikgeworICBpZiAoIW1fcEJ1ZmZlcikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQVNTRVJUKCFwU3JjQml0bWFwLT5Jc0FscGhhTWFzaygpKTsKKyAgQVNTRVJUKG1fYnBwID49IDgpOworICBpZiAocFNyY0JpdG1hcC0+SXNBbHBoYU1hc2soKSB8fCBtX2JwcCA8IDgpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgR2V0T3ZlcmxhcFJlY3QoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcC0+R2V0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgcFNyY0JpdG1hcC0+R2V0SGVpZ2h0KCksIHNyY19sZWZ0LCBzcmNfdG9wLCBwQ2xpcFJnbik7CisgIGlmICh3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcENsaXBNYXNrOworICBGWF9SRUNUIGNsaXBfYm94OworICBpZiAocENsaXBSZ24gJiYgcENsaXBSZ24tPkdldFR5cGUoKSAhPSBDRlhfQ2xpcFJnbjo6UmVjdEkpIHsKKyAgICBBU1NFUlQocENsaXBSZ24tPkdldFR5cGUoKSA9PSBDRlhfQ2xpcFJnbjo6TWFza0YpOworICAgIHBDbGlwTWFzayA9IHBDbGlwUmduLT5HZXRNYXNrKCk7CisgICAgY2xpcF9ib3ggPSBwQ2xpcFJnbi0+R2V0Qm94KCk7CisgIH0KKyAgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvciBjb21wb3NpdG9yOworICBpZiAoIWNvbXBvc2l0b3IuSW5pdChHZXRGb3JtYXQoKSwgcFNyY0JpdG1hcC0+R2V0Rm9ybWF0KCksIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCksIDAsIGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIHBDbGlwTWFzayAhPSBudWxscHRyLCBiUmdiQnl0ZU9yZGVyLCAwKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpbnQgZGVzdF9CcHAgPSBtX2JwcCAvIDg7CisgIGludCBzcmNfQnBwID0gcFNyY0JpdG1hcC0+R2V0QlBQKCkgLyA4OworICBib29sIGJSZ2IgPSBzcmNfQnBwID4gMSAmJiAhcFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKTsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcFNyY0FscGhhTWFzayA9IHBTcmNCaXRtYXAtPm1fcEFscGhhTWFzazsKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9CisgICAgICAgIG1fcEJ1ZmZlci5HZXQoKSArIChkZXN0X3RvcCArIHJvdykgKiBtX1BpdGNoICsgZGVzdF9sZWZ0ICogZGVzdF9CcHA7CisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPQorICAgICAgICBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogc3JjX0JwcDsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2Nhbl9leHRyYV9hbHBoYSA9CisgICAgICAgIHBTcmNBbHBoYU1hc2sgPyBwU3JjQWxwaGFNYXNrLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0CisgICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyOworICAgIHVpbnQ4X3QqIGRzdF9zY2FuX2V4dHJhX2FscGhhID0KKyAgICAgICAgbV9wQWxwaGFNYXNrCisgICAgICAgICAgICA/ICh1aW50OF90KiltX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKGRlc3RfdG9wICsgcm93KSArIGRlc3RfbGVmdAorICAgICAgICAgICAgOiBudWxscHRyOworICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiA9IG51bGxwdHI7CisgICAgaWYgKHBDbGlwTWFzaykgeworICAgICAgY2xpcF9zY2FuID0gcENsaXBNYXNrLT5tX3BCdWZmZXIuR2V0KCkgKworICAgICAgICAgICAgICAgICAgKGRlc3RfdG9wICsgcm93IC0gY2xpcF9ib3gudG9wKSAqIHBDbGlwTWFzay0+bV9QaXRjaCArCisgICAgICAgICAgICAgICAgICAoZGVzdF9sZWZ0IC0gY2xpcF9ib3gubGVmdCk7CisgICAgfQorICAgIGlmIChiUmdiKSB7CisgICAgICBjb21wb3NpdG9yLkNvbXBvc2l0ZVJnYkJpdG1hcExpbmUoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2Nhbl9leHRyYV9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfc2Nhbl9leHRyYV9hbHBoYSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbXBvc2l0b3IuQ29tcG9zaXRlUGFsQml0bWFwTGluZShkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfbGVmdCwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBzcmNfc2Nhbl9leHRyYV9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfc2Nhbl9leHRyYV9hbHBoYSk7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIENGWF9ESUJpdG1hcDo6Q29tcG9zaXRlTWFzayhpbnQgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZ2JCeXRlT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZykgeworICBpZiAoIW1fcEJ1ZmZlcikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQVNTRVJUKHBNYXNrLT5Jc0FscGhhTWFzaygpKTsKKyAgQVNTRVJUKG1fYnBwID49IDgpOworICBpZiAoIXBNYXNrLT5Jc0FscGhhTWFzaygpIHx8IG1fYnBwIDwgOCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgR2V0T3ZlcmxhcFJlY3QoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgd2lkdGgsIGhlaWdodCwgcE1hc2stPkdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgIHBNYXNrLT5HZXRIZWlnaHQoKSwgc3JjX2xlZnQsIHNyY190b3AsIHBDbGlwUmduKTsKKyAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApCisgICAgcmV0dXJuIHRydWU7CisKKyAgaW50IHNyY19hbHBoYSA9CisgICAgICAodWludDhfdCkoYWxwaGFfZmxhZyA+PiA4KSA/IChhbHBoYV9mbGFnICYgMHhmZikgOiBGWEFSR0JfQShjb2xvcik7CisgIGlmIChzcmNfYWxwaGEgPT0gMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwQ2xpcE1hc2s7CisgIEZYX1JFQ1QgY2xpcF9ib3g7CisgIGlmIChwQ2xpcFJnbiAmJiBwQ2xpcFJnbi0+R2V0VHlwZSgpICE9IENGWF9DbGlwUmduOjpSZWN0SSkgeworICAgIEFTU0VSVChwQ2xpcFJnbi0+R2V0VHlwZSgpID09IENGWF9DbGlwUmduOjpNYXNrRik7CisgICAgcENsaXBNYXNrID0gcENsaXBSZ24tPkdldE1hc2soKTsKKyAgICBjbGlwX2JveCA9IHBDbGlwUmduLT5HZXRCb3goKTsKKyAgfQorICBpbnQgc3JjX2JwcCA9IHBNYXNrLT5HZXRCUFAoKTsKKyAgaW50IEJwcCA9IEdldEJQUCgpIC8gODsKKyAgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvciBjb21wb3NpdG9yOworICBpZiAoIWNvbXBvc2l0b3IuSW5pdChHZXRGb3JtYXQoKSwgcE1hc2stPkdldEZvcm1hdCgpLCB3aWR0aCwgbnVsbHB0ciwgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kX3R5cGUsIHBDbGlwTWFzayAhPSBudWxscHRyLCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICBhbHBoYV9mbGFnKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0KKyAgICAgICAgbV9wQnVmZmVyLkdldCgpICsgKGRlc3RfdG9wICsgcm93KSAqIG1fUGl0Y2ggKyBkZXN0X2xlZnQgKiBCcHA7CisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwTWFzay0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdyk7CisgICAgdWludDhfdCogZHN0X3NjYW5fZXh0cmFfYWxwaGEgPQorICAgICAgICBtX3BBbHBoYU1hc2sKKyAgICAgICAgICAgID8gKHVpbnQ4X3QqKW1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUoZGVzdF90b3AgKyByb3cpICsgZGVzdF9sZWZ0CisgICAgICAgICAgICA6IG51bGxwdHI7CisgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuID0gbnVsbHB0cjsKKyAgICBpZiAocENsaXBNYXNrKSB7CisgICAgICBjbGlwX3NjYW4gPSBwQ2xpcE1hc2stPm1fcEJ1ZmZlci5HZXQoKSArCisgICAgICAgICAgICAgICAgICAoZGVzdF90b3AgKyByb3cgLSBjbGlwX2JveC50b3ApICogcENsaXBNYXNrLT5tX1BpdGNoICsKKyAgICAgICAgICAgICAgICAgIChkZXN0X2xlZnQgLSBjbGlwX2JveC5sZWZ0KTsKKyAgICB9CisgICAgaWYgKHNyY19icHAgPT0gMSkgeworICAgICAgY29tcG9zaXRvci5Db21wb3NpdGVCaXRNYXNrTGluZShkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfbGVmdCwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2NhbiwgZHN0X3NjYW5fZXh0cmFfYWxwaGEpOworICAgIH0gZWxzZSB7CisgICAgICBjb21wb3NpdG9yLkNvbXBvc2l0ZUJ5dGVNYXNrTGluZShkZXN0X3NjYW4sIHNyY19zY2FuICsgc3JjX2xlZnQsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBkc3Rfc2Nhbl9leHRyYV9hbHBoYSk7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIENGWF9ESUJpdG1hcDo6Q29tcG9zaXRlUmVjdChpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZykgeworICBpZiAoIW1fcEJ1ZmZlcikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW50IHNyY19hbHBoYSA9IChhbHBoYV9mbGFnID4+IDgpID8gKGFscGhhX2ZsYWcgJiAweGZmKSA6IEZYQVJHQl9BKGNvbG9yKTsKKyAgaWYgKHNyY19hbHBoYSA9PSAwKQorICAgIHJldHVybiB0cnVlOworCisgIEZYX1JFQ1QgcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyB3aWR0aCwgdG9wICsgaGVpZ2h0KTsKKyAgcmVjdC5JbnRlcnNlY3QoMCwgMCwgbV9XaWR0aCwgbV9IZWlnaHQpOworICBpZiAocmVjdC5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgd2lkdGggPSByZWN0LldpZHRoKCk7CisgIHVpbnQzMl90IGRzdF9jb2xvcjsKKyAgaWYgKGFscGhhX2ZsYWcgPj4gOCkKKyAgICBkc3RfY29sb3IgPSBGWENNWUtfVE9ESUIoY29sb3IpOworICBlbHNlCisgICAgZHN0X2NvbG9yID0gRlhBUkdCX1RPRElCKGNvbG9yKTsKKyAgdWludDhfdCogY29sb3JfcCA9ICh1aW50OF90KikmZHN0X2NvbG9yOworICBpZiAobV9icHAgPT0gOCkgeworICAgIHVpbnQ4X3QgZ3JheSA9IDI1NTsKKyAgICBpZiAoIUlzQWxwaGFNYXNrKCkpIHsKKyAgICAgIGlmIChhbHBoYV9mbGFnID4+IDgpIHsKKyAgICAgICAgdWludDhfdCByOworICAgICAgICB1aW50OF90IGc7CisgICAgICAgIHVpbnQ4X3QgYjsKKyAgICAgICAgc3RkOjp0aWUociwgZywgYikgPQorICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKGNvbG9yX3BbMF0sIGNvbG9yX3BbMV0sIGNvbG9yX3BbMl0sIGNvbG9yX3BbM10pOworICAgICAgICBncmF5ID0gRlhSR0IyR1JBWShyLCBnLCBiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGdyYXkgPSAodWludDhfdClGWFJHQjJHUkFZKChpbnQpY29sb3JfcFsyXSwgY29sb3JfcFsxXSwgY29sb3JfcFswXSk7CisgICAgICB9CisgICAgICBpZiAoSXNDbXlrSW1hZ2UoKSkgeworICAgICAgICBncmF5ID0gfmdyYXk7CisgICAgICB9CisgICAgfQorICAgIGZvciAoaW50IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93KyspIHsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IG1fcEJ1ZmZlci5HZXQoKSArIHJvdyAqIG1fUGl0Y2ggKyByZWN0LmxlZnQ7CisgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgICBtZW1zZXQoZGVzdF9zY2FuLCBncmF5LCB3aWR0aCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgc3JjX2FscGhhKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAobV9icHAgPT0gMSkgeworICAgIEFTU0VSVCghSXNDbXlrSW1hZ2UoKSAmJiBzdGF0aWNfY2FzdDx1aW50OF90PihhbHBoYV9mbGFnID4+IDgpID09IDApOworICAgIGludCBsZWZ0X3NoaWZ0ID0gcmVjdC5sZWZ0ICUgODsKKyAgICBpbnQgcmlnaHRfc2hpZnQgPSByZWN0LnJpZ2h0ICUgODsKKyAgICBpbnQgbmV3X3dpZHRoID0gcmVjdC5yaWdodCAvIDggLSByZWN0LmxlZnQgLyA4OworICAgIGludCBpbmRleCA9IDA7CisgICAgaWYgKG1fcFBhbGV0dGUpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIGlmIChtX3BQYWxldHRlLmdldCgpW2ldID09IGNvbG9yKQorICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaW5kZXggPSAoc3RhdGljX2Nhc3Q8dWludDhfdD4oY29sb3IpID09IDB4ZmYpID8gMSA6IDA7CisgICAgfQorICAgIGZvciAoaW50IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93KyspIHsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2Nhbl90b3AgPQorICAgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCo+KEdldFNjYW5saW5lKHJvdykpICsgcmVjdC5sZWZ0IC8gODsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2Nhbl90b3BfciA9CisgICAgICAgICAgY29uc3RfY2FzdDx1aW50OF90Kj4oR2V0U2NhbmxpbmUocm93KSkgKyByZWN0LnJpZ2h0IC8gODsKKyAgICAgIHVpbnQ4X3QgbGVmdF9mbGFnID0gKmRlc3Rfc2Nhbl90b3AgJiAoMjU1IDw8ICg4IC0gbGVmdF9zaGlmdCkpOworICAgICAgdWludDhfdCByaWdodF9mbGFnID0gKmRlc3Rfc2Nhbl90b3BfciAmICgyNTUgPj4gcmlnaHRfc2hpZnQpOworICAgICAgaWYgKG5ld193aWR0aCkgeworICAgICAgICBtZW1zZXQoZGVzdF9zY2FuX3RvcCArIDEsIGluZGV4ID8gMjU1IDogMCwgbmV3X3dpZHRoIC0gMSk7CisgICAgICAgIGlmICghaW5kZXgpIHsKKyAgICAgICAgICAqZGVzdF9zY2FuX3RvcCAmPSBsZWZ0X2ZsYWc7CisgICAgICAgICAgKmRlc3Rfc2Nhbl90b3BfciAmPSByaWdodF9mbGFnOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICpkZXN0X3NjYW5fdG9wIHw9IH5sZWZ0X2ZsYWc7CisgICAgICAgICAgKmRlc3Rfc2Nhbl90b3BfciB8PSB+cmlnaHRfZmxhZzsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFpbmRleCkgeworICAgICAgICAgICpkZXN0X3NjYW5fdG9wICY9IGxlZnRfZmxhZyB8IHJpZ2h0X2ZsYWc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKmRlc3Rfc2Nhbl90b3AgfD0gfihsZWZ0X2ZsYWcgfCByaWdodF9mbGFnKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBBU1NFUlQobV9icHAgPj0gMjQpOworICBpZiAobV9icHAgPCAyNCB8fCAoIShhbHBoYV9mbGFnID4+IDgpICYmIElzQ215a0ltYWdlKCkpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKGFscGhhX2ZsYWcgPj4gOCAmJiAhSXNDbXlrSW1hZ2UoKSkgeworICAgIHN0ZDo6dGllKGNvbG9yX3BbMl0sIGNvbG9yX3BbMV0sIGNvbG9yX3BbMF0pID0KKyAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjb2xvciksIEZYU1lTX0dldE1WYWx1ZShjb2xvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoY29sb3IpLCBGWFNZU19HZXRLVmFsdWUoY29sb3IpKTsKKyAgfQorICBpZiAoIUlzQ215a0ltYWdlKCkpCisgICAgY29sb3JfcFszXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyY19hbHBoYSk7CisgIGludCBCcHAgPSBtX2JwcCAvIDg7CisgIGJvb2wgYkFscGhhID0gSGFzQWxwaGEoKTsKKyAgYm9vbCBiQXJnYiA9IEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2I7CisgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgZm9yIChpbnQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyByb3crKykgeworICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wQnVmZmVyLkdldCgpICsgcm93ICogbV9QaXRjaCArIHJlY3QubGVmdCAqIEJwcDsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2Nhbl9hbHBoYSA9CisgICAgICAgICAgbV9wQWxwaGFNYXNrID8gKHVpbnQ4X3QqKW1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KSArIHJlY3QubGVmdAorICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHI7CisgICAgICBpZiAoZGVzdF9zY2FuX2FscGhhKSB7CisgICAgICAgIG1lbXNldChkZXN0X3NjYW5fYWxwaGEsIDB4ZmYsIHdpZHRoKTsKKyAgICAgIH0KKyAgICAgIGlmIChCcHAgPT0gNCkgeworICAgICAgICB1aW50MzJfdCogc2NhbiA9ICh1aW50MzJfdCopZGVzdF9zY2FuOworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgICAqc2NhbisrID0gZHN0X2NvbG9yOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBjb2xvcl9wWzBdOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IGNvbG9yX3BbMV07CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gY29sb3JfcFsyXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdysrKSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wQnVmZmVyLkdldCgpICsgcm93ICogbV9QaXRjaCArIHJlY3QubGVmdCAqIEJwcDsKKyAgICBpZiAoYkFscGhhKSB7CisgICAgICBpZiAoYkFyZ2IpIHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGEsIGNvbG9yX3BbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JfcFsxXSwgY29sb3JfcFswXSkpOworICAgICAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgY29sb3JfcFswXSwgYWxwaGFfcmF0aW8pOworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBjb2xvcl9wWzFdLCBhbHBoYV9yYXRpbyk7CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGNvbG9yX3BbMl0sIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBkZXN0X2FscGhhOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB1aW50OF90KiBkZXN0X3NjYW5fYWxwaGEgPQorICAgICAgICAgICAgKHVpbnQ4X3QqKW1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KSArIHJlY3QubGVmdDsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3Rfc2Nhbl9hbHBoYTsKKyAgICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICAgICAgICAqZGVzdF9zY2FuX2FscGhhKysgPSBzcmNfYWxwaGE7CisgICAgICAgICAgICBtZW1jcHkoZGVzdF9zY2FuLCBjb2xvcl9wLCBCcHApOworICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKyAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgICAgICAqZGVzdF9zY2FuX2FscGhhKysgPSBkZXN0X2FscGhhOworICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgICAgZm9yIChpbnQgY29tcHMgPSAwOyBjb21wcyA8IEJwcDsgY29tcHMrKykgeworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9CisgICAgICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgY29sb3JfcFtjb21wc10sIGFscGhhX3JhdGlvKTsKKyAgICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgICAgZm9yIChpbnQgY29tcHMgPSAwOyBjb21wcyA8IEJwcDsgY29tcHMrKykgeworICAgICAgICAgIGlmIChjb21wcyA9PSAzKSB7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAyNTU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGNvbG9yX3BbY29tcHNdLCBzcmNfYWxwaGEpOworICAgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIENGWF9ESUJpdG1hcDo6Q29udmVydEZvcm1hdChGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQpIHsKKyAgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQgPSBHZXRGb3JtYXQoKTsKKyAgaWYgKGRlc3RfZm9ybWF0ID09IHNyY19mb3JtYXQpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCXzhicHBNYXNrICYmIHNyY19mb3JtYXQgPT0gRlhESUJfOGJwcFJnYiAmJgorICAgICAgIW1fcFBhbGV0dGUpIHsKKyAgICBtX0FscGhhRmxhZyA9IDE7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCX0FyZ2IgJiYgc3JjX2Zvcm1hdCA9PSBGWERJQl9SZ2IzMikgeworICAgIG1fQWxwaGFGbGFnID0gMjsKKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKKyAgICAgIHVpbnQ4X3QqIHNjYW5saW5lID0gbV9wQnVmZmVyLkdldCgpICsgcm93ICogbV9QaXRjaCArIDM7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgeworICAgICAgICAqc2NhbmxpbmUgPSAweGZmOworICAgICAgICBzY2FubGluZSArPSA0OworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpbnQgZGVzdF9icHAgPSBkZXN0X2Zvcm1hdCAmIDB4ZmY7CisgIGludCBkZXN0X3BpdGNoID0gKGRlc3RfYnBwICogbV9XaWR0aCArIDMxKSAvIDMyICogNDsKKyAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IGRlc3RfYnVmKAorICAgICAgRlhfVHJ5QWxsb2ModWludDhfdCwgZGVzdF9waXRjaCAqIG1fSGVpZ2h0ICsgNCkpOworICBpZiAoIWRlc3RfYnVmKQorICAgIHJldHVybiBmYWxzZTsKKworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwQWxwaGFNYXNrOworICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYikgeworICAgIG1lbXNldChkZXN0X2J1Zi5nZXQoKSwgMHhmZiwgZGVzdF9waXRjaCAqIG1fSGVpZ2h0ICsgNCk7CisgICAgaWYgKG1fcEFscGhhTWFzaykgeworICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7CisgICAgICAgIHVpbnQ4X3QqIHBEc3RTY2FubGluZSA9IGRlc3RfYnVmLmdldCgpICsgcm93ICogZGVzdF9waXRjaCArIDM7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNTY2FubGluZSA9IG1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KTsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKKyAgICAgICAgICAqcERzdFNjYW5saW5lID0gKnBTcmNTY2FubGluZSsrOworICAgICAgICAgIHBEc3RTY2FubGluZSArPSA0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKGRlc3RfZm9ybWF0ICYgMHgwMjAwKSB7CisgICAgaWYgKHNyY19mb3JtYXQgPT0gRlhESUJfQXJnYikgeworICAgICAgcEFscGhhTWFzayA9IENsb25lQWxwaGFNYXNrKCk7CisgICAgICBpZiAoIXBBbHBoYU1hc2spCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFtX3BBbHBoYU1hc2spIHsKKyAgICAgICAgaWYgKCFCdWlsZEFscGhhTWFzaygpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcEFscGhhTWFzayA9IHN0ZDo6bW92ZShtX3BBbHBoYU1hc2spOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcEFscGhhTWFzayA9IG1fcEFscGhhTWFzazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgYm9vbCByZXQgPSBmYWxzZTsKKyAgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+IGhvbGRlcih0aGlzKTsKKyAgc3RkOjp1bmlxdWVfcHRyPHVpbnQzMl90LCBGeEZyZWVEZWxldGVyPiBwYWxfOGJwcDsKKyAgcmV0ID0gQ29udmVydEJ1ZmZlcihkZXN0X2Zvcm1hdCwgZGVzdF9idWYuZ2V0KCksIGRlc3RfcGl0Y2gsIG1fV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgbV9IZWlnaHQsIGhvbGRlciwgMCwgMCwgJnBhbF84YnBwKTsKKyAgaWYgKCFyZXQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG1fcEFscGhhTWFzayA9IHBBbHBoYU1hc2s7CisgIG1fcFBhbGV0dGUgPSBzdGQ6Om1vdmUocGFsXzhicHApOworICBtX3BCdWZmZXIgPSBzdGQ6Om1vdmUoZGVzdF9idWYpOworICBtX2JwcCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGRlc3RfZm9ybWF0KTsKKyAgbV9BbHBoYUZsYWcgPSBzdGF0aWNfY2FzdDx1aW50OF90PihkZXN0X2Zvcm1hdCA+PiA4KTsKKyAgbV9QaXRjaCA9IGRlc3RfcGl0Y2g7CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2RpYi9jZnhfZGliaXRtYXAuaCBiL2NvcmUvZnhnZS9kaWIvY2Z4X2RpYml0bWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI0MDgyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9kaWIvY2Z4X2RpYml0bWFwLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYR0VfRElCX0NGWF9ESUJJVE1BUF9IXworI2RlZmluZSBDT1JFX0ZYR0VfRElCX0NGWF9ESUJJVE1BUF9IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvbWF5YmVfb3duZWQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9kaWJzb3VyY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisKK2NsYXNzIENGWF9ESUJpdG1hcCA6IHB1YmxpYyBDRlhfRElCU291cmNlIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgorICBmcmllbmQgUmV0YWluUHRyPFQ+IHBkZml1bTo6TWFrZVJldGFpbihBcmdzJiYuLi4gYXJncyk7CisKKyAgfkNGWF9ESUJpdG1hcCgpIG92ZXJyaWRlOworCisgIGJvb2wgQ3JlYXRlKGludCB3aWR0aCwKKyAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgRlhESUJfRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgdWludDhfdCogcEJ1ZmZlciA9IG51bGxwdHIsCisgICAgICAgICAgICAgIHVpbnQzMl90IHBpdGNoID0gMCk7CisKKyAgYm9vbCBDb3B5KGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNyYyk7CisKKyAgLy8gQ0ZYX0RJQlNvdXJjZQorICB1aW50OF90KiBHZXRCdWZmZXIoKSBjb25zdCBvdmVycmlkZTsKKyAgY29uc3QgdWludDhfdCogR2V0U2NhbmxpbmUoaW50IGxpbmUpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIERvd25TYW1wbGVTY2FubGluZShpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9icHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGbGlwWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfd2lkdGgpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgVGFrZU92ZXIoUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mJiBwU3JjQml0bWFwKTsKKyAgYm9vbCBDb252ZXJ0Rm9ybWF0KEZYRElCX0Zvcm1hdCBmb3JtYXQpOworICB2b2lkIENsZWFyKHVpbnQzMl90IGNvbG9yKTsKKworICB1aW50MzJfdCBHZXRQaXhlbChpbnQgeCwgaW50IHkpIGNvbnN0OworICB2b2lkIFNldFBpeGVsKGludCB4LCBpbnQgeSwgdWludDMyX3QgY29sb3IpOworCisgIGJvb2wgTG9hZENoYW5uZWwoRlhESUJfQ2hhbm5lbCBkZXN0Q2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgRlhESUJfQ2hhbm5lbCBzcmNDaGFubmVsKTsKKyAgYm9vbCBMb2FkQ2hhbm5lbChGWERJQl9DaGFubmVsIGRlc3RDaGFubmVsLCBpbnQgdmFsdWUpOworCisgIGJvb2wgTXVsdGlwbHlBbHBoYShpbnQgYWxwaGEpOworICBib29sIE11bHRpcGx5QWxwaGEoY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwQWxwaGFNYXNrKTsKKworICBib29sIFRyYW5zZmVyQml0bWFwKGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3ApOworCisgIGJvb2wgQ29tcG9zaXRlQml0bWFwKGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZ2JCeXRlT3JkZXIgPSBmYWxzZSk7CisKKyAgYm9vbCBDb21wb3NpdGVNYXNrKGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwTWFzaywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICBib29sIGJSZ2JCeXRlT3JkZXIgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCk7CisKKyAgYm9vbCBDb21wb3NpdGVSZWN0KGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyk7CisKKyAgYm9vbCBDb252ZXJ0Q29sb3JTY2FsZSh1aW50MzJfdCBmb3JlY29sb3IsIHVpbnQzMl90IGJhY2tjb2xvcik7CisKKyAgc3RhdGljIGJvb2wgQ2FsY3VsYXRlUGl0Y2hBbmRTaXplKGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHNpemUpOworCisjaWYgZGVmaW5lZCBfU0tJQV9TVVBQT1JUXyB8fCBfU0tJQV9TVVBQT1JUX1BBVEhTXworICB2b2lkIFByZU11bHRpcGx5KCk7CisjZW5kaWYKKyNpZiBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfUEFUSFNfCisgIHZvaWQgVW5QcmVNdWx0aXBseSgpOworI2VuZGlmCisKKyBwcm90ZWN0ZWQ6CisgIENGWF9ESUJpdG1hcCgpOworICBDRlhfRElCaXRtYXAoY29uc3QgQ0ZYX0RJQml0bWFwJiBzcmMpOworCisjaWYgZGVmaW5lZCBfU0tJQV9TVVBQT1JUX1BBVEhTXworICBlbnVtIGNsYXNzIEZvcm1hdCB7IGtDbGVhcmVkLCBrUHJlTXVsdGlwbGllZCwga1VuUHJlTXVsdGlwbGllZCB9OworI2VuZGlmCisKKyAgTWF5YmVPd25lZDx1aW50OF90LCBGeEZyZWVEZWxldGVyPiBtX3BCdWZmZXI7CisjaWYgZGVmaW5lZCBfU0tJQV9TVVBQT1JUX1BBVEhTXworICBGb3JtYXQgbV9uRm9ybWF0OworI2VuZGlmCisKKyBwcml2YXRlOgorICB2b2lkIENvbnZlcnRSR0JDb2xvclNjYWxlKHVpbnQzMl90IGZvcmVjb2xvciwgdWludDMyX3QgYmFja2NvbG9yKTsKKyAgdm9pZCBDb252ZXJ0Q01ZS0NvbG9yU2NhbGUodWludDMyX3QgZm9yZWNvbG9yLCB1aW50MzJfdCBiYWNrY29sb3IpOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYR0VfRElCX0NGWF9ESUJJVE1BUF9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2RpYi9jZnhfZGlic291cmNlLmNwcCBiL2NvcmUvZnhnZS9kaWIvY2Z4X2RpYnNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhNmQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9kaWIvY2Z4X2RpYnNvdXJjZS5jcHAKQEAgLTAsMCArMSwxMjI5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9kaWJzb3VyY2UuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvZnhfY29kZWMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2NsaXByZ24uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9iaXRtYXBzdG9yZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9kaWJpdG1hcC5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2ltYWdlc3RyZXRjaGVyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfaW1hZ2V0cmFuc2Zvcm1lci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQ0ZYX1BhbGV0dGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0ZYX1BhbGV0dGUoY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwQml0bWFwKTsKKyAgfkNGWF9QYWxldHRlKCk7CisKKyAgY29uc3QgdWludDMyX3QqIEdldFBhbGV0dGUoKSB7IHJldHVybiBtX1BhbGV0dGUuZGF0YSgpOyB9CisgIGNvbnN0IHN0ZDo6cGFpcjx1aW50MzJfdCwgdWludDMyX3Q+KiBHZXRMdXRzKCkgY29uc3QgeyByZXR1cm4gbV9MdXRzLmRhdGEoKTsgfQorICBpbnQzMl90IEdldEx1dENvdW50KCkgY29uc3QgeyByZXR1cm4gbV9sdXQ7IH0KKyAgdm9pZCBTZXRBbW91bnRMdXQoaW50IHJvdywgdWludDMyX3QgdmFsdWUpIHsgbV9MdXRzW3Jvd10uZmlyc3QgPSB2YWx1ZTsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IG1fUGFsZXR0ZTsKKyAgLy8gKEFtb3VudCwgQ29sb3IpIHBhaXJzCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx1aW50MzJfdCwgdWludDMyX3Q+PiBtX0x1dHM7CisgIGludCBtX2x1dDsKK307CisKK3ZvaWQgQ29sb3JEZWNvZGUodWludDMyX3QgcGFsX3YsIHVpbnQ4X3QqIHIsIHVpbnQ4X3QqIGcsIHVpbnQ4X3QqIGIpIHsKKyAgKnIgPSBzdGF0aWNfY2FzdDx1aW50OF90PigocGFsX3YgJiAweGYwMCkgPj4gNCk7CisgICpnID0gc3RhdGljX2Nhc3Q8dWludDhfdD4ocGFsX3YgJiAweDBmMCk7CisgICpiID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oKHBhbF92ICYgMHgwMGYpIDw8IDQpOworfQorCit2b2lkIE9idGFpbl9QYWwoc3RkOjpwYWlyPHVpbnQzMl90LCB1aW50MzJfdD4qIGx1dHMsCisgICAgICAgICAgICAgICAgdWludDMyX3QqIGRlc3RfcGFsLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IGx1dCkgeworICB1aW50MzJfdCBsdXRfMSA9IGx1dCAtIDE7CisgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IDI1NjsgKytyb3cpIHsKKyAgICBpbnQgbHV0X29mZnNldCA9IGx1dF8xIC0gcm93OworICAgIGlmIChsdXRfb2Zmc2V0IDwgMCkKKyAgICAgIGx1dF9vZmZzZXQgKz0gMjU2OworICAgIHVpbnQzMl90IGNvbG9yID0gbHV0c1tsdXRfb2Zmc2V0XS5zZWNvbmQ7CisgICAgdWludDhfdCByOworICAgIHVpbnQ4X3QgZzsKKyAgICB1aW50OF90IGI7CisgICAgQ29sb3JEZWNvZGUoY29sb3IsICZyLCAmZywgJmIpOworICAgIGRlc3RfcGFsW3Jvd10gPSAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHIpIDw8IDE2KSB8CisgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzJfdD4oZykgPDwgOCkgfCBiIHwgMHhmZjAwMDAwMDsKKyAgICBsdXRzW2x1dF9vZmZzZXRdLmZpcnN0ID0gcm93OworICB9Cit9CisKK0NGWF9QYWxldHRlOjpDRlhfUGFsZXR0ZShjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXApCisgICAgOiBtX1BhbGV0dGUoMjU2KSwgbV9MdXRzKDQwOTYpLCBtX2x1dCgwKSB7CisgIGludCBicHAgPSBwQml0bWFwLT5HZXRCUFAoKSAvIDg7CisgIGludCB3aWR0aCA9IHBCaXRtYXAtPkdldFdpZHRoKCk7CisgIGludCBoZWlnaHQgPSBwQml0bWFwLT5HZXRIZWlnaHQoKTsKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyArK3JvdykgeworICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5fbGluZSA9IHBCaXRtYXAtPkdldFNjYW5saW5lKHJvdyk7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7ICsrY29sKSB7CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfcG9ydCA9IHNjYW5fbGluZSArIGNvbCAqIGJwcDsKKyAgICAgIHVpbnQzMl90IGIgPSBzcmNfcG9ydFswXSAmIDB4ZjA7CisgICAgICB1aW50MzJfdCBnID0gc3JjX3BvcnRbMV0gJiAweGYwOworICAgICAgdWludDMyX3QgciA9IHNyY19wb3J0WzJdICYgMHhmMDsKKyAgICAgIHVpbnQzMl90IGluZGV4ID0gKHIgPDwgNCkgKyBnICsgKGIgPj4gNCk7CisgICAgICArK21fTHV0c1tpbmRleF0uZmlyc3Q7CisgICAgfQorICB9CisgIC8vIE1vdmUgbm9uLXplcm9zIHRvIHRoZSBmcm9udCBhbmQgY291bnQgdGhlbQorICBmb3IgKGludCByb3cgPSAwOyByb3cgPCA0MDk2OyArK3JvdykgeworICAgIGlmIChtX0x1dHNbcm93XS5maXJzdCAhPSAwKSB7CisgICAgICBtX0x1dHNbbV9sdXRdLmZpcnN0ID0gbV9MdXRzW3Jvd10uZmlyc3Q7CisgICAgICBtX0x1dHNbbV9sdXRdLnNlY29uZCA9IHJvdzsKKyAgICAgICsrbV9sdXQ7CisgICAgfQorICB9CisgIHN0ZDo6c29ydChtX0x1dHMuYmVnaW4oKSwgbV9MdXRzLmJlZ2luKCkgKyBtX2x1dCwKKyAgICAgICAgICAgIFtdKGNvbnN0IHN0ZDo6cGFpcjx1aW50MzJfdCwgdWludDMyX3Q+JiBhcmcxLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpwYWlyPHVpbnQzMl90LCB1aW50MzJfdD4mIGFyZzIpIHsKKyAgICAgICAgICAgICAgcmV0dXJuIGFyZzEuZmlyc3QgPCBhcmcyLmZpcnN0OworICAgICAgICAgICAgfSk7CisgIE9idGFpbl9QYWwobV9MdXRzLmRhdGEoKSwgbV9QYWxldHRlLmRhdGEoKSwgbV9sdXQpOworfQorCitDRlhfUGFsZXR0ZTo6fkNGWF9QYWxldHRlKCkge30KKwordm9pZCBDb252ZXJ0QnVmZmVyXzFicHBNYXNrMkdyYXkodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCkgeworICB1aW50OF90IHNldF9ncmF5LCByZXNldF9ncmF5OworICBzZXRfZ3JheSA9IDB4ZmY7CisgIHJlc2V0X2dyYXkgPSAweDAwOworICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7ICsrcm93KSB7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgIG1lbXNldChkZXN0X3NjYW4sIHJlc2V0X2dyYXksIHdpZHRoKTsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpOworICAgIGZvciAoaW50IGNvbCA9IHNyY19sZWZ0OyBjb2wgPCBzcmNfbGVmdCArIHdpZHRoOyArK2NvbCkgeworICAgICAgaWYgKHNyY19zY2FuW2NvbCAvIDhdICYgKDEgPDwgKDcgLSBjb2wgJSA4KSkpCisgICAgICAgICpkZXN0X3NjYW4gPSBzZXRfZ3JheTsKKyAgICAgICsrZGVzdF9zY2FuOworICAgIH0KKyAgfQorfQorCit2b2lkIENvbnZlcnRCdWZmZXJfOGJwcE1hc2syR3JheSh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wKSB7CisgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgKytyb3cpIHsKKyAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0OworICAgIG1lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCk7CisgIH0KK30KKwordm9pZCBDb252ZXJ0QnVmZmVyXzFicHBQbHQyR3JheSh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wKSB7CisgIHVpbnQzMl90KiBzcmNfcGx0ID0gcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpOworICB1aW50OF90IGdyYXlbMl07CisgIHVpbnQ4X3QgcmVzZXRfcjsKKyAgdWludDhfdCByZXNldF9nOworICB1aW50OF90IHJlc2V0X2I7CisgIHVpbnQ4X3Qgc2V0X3I7CisgIHVpbnQ4X3Qgc2V0X2c7CisgIHVpbnQ4X3Qgc2V0X2I7CisgIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7CisgICAgc3RkOjp0aWUocmVzZXRfciwgcmVzZXRfZywgcmVzZXRfYikgPSBBZG9iZUNNWUtfdG9fc1JHQjEoCisgICAgICAgIEZYU1lTX0dldENWYWx1ZShzcmNfcGx0WzBdKSwgRlhTWVNfR2V0TVZhbHVlKHNyY19wbHRbMF0pLAorICAgICAgICBGWFNZU19HZXRZVmFsdWUoc3JjX3BsdFswXSksIEZYU1lTX0dldEtWYWx1ZShzcmNfcGx0WzBdKSk7CisgICAgc3RkOjp0aWUoc2V0X3IsIHNldF9nLCBzZXRfYikgPSBBZG9iZUNNWUtfdG9fc1JHQjEoCisgICAgICAgIEZYU1lTX0dldENWYWx1ZShzcmNfcGx0WzFdKSwgRlhTWVNfR2V0TVZhbHVlKHNyY19wbHRbMV0pLAorICAgICAgICBGWFNZU19HZXRZVmFsdWUoc3JjX3BsdFsxXSksIEZYU1lTX0dldEtWYWx1ZShzcmNfcGx0WzFdKSk7CisgIH0gZWxzZSB7CisgICAgcmVzZXRfciA9IEZYQVJHQl9SKHNyY19wbHRbMF0pOworICAgIHJlc2V0X2cgPSBGWEFSR0JfRyhzcmNfcGx0WzBdKTsKKyAgICByZXNldF9iID0gRlhBUkdCX0Ioc3JjX3BsdFswXSk7CisgICAgc2V0X3IgPSBGWEFSR0JfUihzcmNfcGx0WzFdKTsKKyAgICBzZXRfZyA9IEZYQVJHQl9HKHNyY19wbHRbMV0pOworICAgIHNldF9iID0gRlhBUkdCX0Ioc3JjX3BsdFsxXSk7CisgIH0KKyAgZ3JheVswXSA9IEZYUkdCMkdSQVkocmVzZXRfciwgcmVzZXRfZywgcmVzZXRfYik7CisgIGdyYXlbMV0gPSBGWFJHQjJHUkFZKHNldF9yLCBzZXRfZywgc2V0X2IpOworCisgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgKytyb3cpIHsKKyAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgbWVtc2V0KGRlc3Rfc2NhbiwgZ3JheVswXSwgd2lkdGgpOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdyk7CisgICAgZm9yIChpbnQgY29sID0gc3JjX2xlZnQ7IGNvbCA8IHNyY19sZWZ0ICsgd2lkdGg7ICsrY29sKSB7CisgICAgICBpZiAoc3JjX3NjYW5bY29sIC8gOF0gJiAoMSA8PCAoNyAtIGNvbCAlIDgpKSkKKyAgICAgICAgKmRlc3Rfc2NhbiA9IGdyYXlbMV07CisgICAgICArK2Rlc3Rfc2NhbjsKKyAgICB9CisgIH0KK30KKwordm9pZCBDb252ZXJ0QnVmZmVyXzhicHBQbHQyR3JheSh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wKSB7CisgIHVpbnQzMl90KiBzcmNfcGx0ID0gcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpOworICB1aW50OF90IGdyYXlbMjU2XTsKKyAgaWYgKHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKKyAgICB1aW50OF90IHI7CisgICAgdWludDhfdCBnOworICAgIHVpbnQ4X3QgYjsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShncmF5KTsgKytpKSB7CisgICAgICBzdGQ6OnRpZShyLCBnLCBiKSA9IEFkb2JlQ01ZS190b19zUkdCMSgKKyAgICAgICAgICBGWFNZU19HZXRDVmFsdWUoc3JjX3BsdFtpXSksIEZYU1lTX0dldE1WYWx1ZShzcmNfcGx0W2ldKSwKKyAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoc3JjX3BsdFtpXSksIEZYU1lTX0dldEtWYWx1ZShzcmNfcGx0W2ldKSk7CisgICAgICBncmF5W2ldID0gRlhSR0IyR1JBWShyLCBnLCBiKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZ3JheSk7ICsraSkgeworICAgICAgZ3JheVtpXSA9IEZYUkdCMkdSQVkoRlhBUkdCX1Ioc3JjX3BsdFtpXSksIEZYQVJHQl9HKHNyY19wbHRbaV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX0Ioc3JjX3BsdFtpXSkpOworICAgIH0KKyAgfQorCisgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgKytyb3cpIHsKKyAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0OworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyArK2NvbCkKKyAgICAgICpkZXN0X3NjYW4rKyA9IGdyYXlbKnNyY19zY2FuKytdOworICB9Cit9CisKK3ZvaWQgQ29udmVydEJ1ZmZlcl9SZ2JPckNteWsyR3JheSh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wKSB7CisgIGludCBCcHAgPSBwU3JjQml0bWFwLT5HZXRCUFAoKSAvIDg7CisgIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyArK3JvdykgeworICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPQorICAgICAgICAgIHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiA0OworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7ICsrY29sKSB7CisgICAgICAgIHVpbnQ4X3QgcjsKKyAgICAgICAgdWludDhfdCBnOworICAgICAgICB1aW50OF90IGI7CisgICAgICAgIHN0ZDo6dGllKHIsIGcsIGIpID0gQWRvYmVDTVlLX3RvX3NSR0IxKAorICAgICAgICAgICAgRlhTWVNfR2V0Q1ZhbHVlKHN0YXRpY19jYXN0PHVpbnQzMl90PihzcmNfc2NhblswXSkpLAorICAgICAgICAgICAgRlhTWVNfR2V0TVZhbHVlKHN0YXRpY19jYXN0PHVpbnQzMl90PihzcmNfc2NhblsxXSkpLAorICAgICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKHN0YXRpY19jYXN0PHVpbnQzMl90PihzcmNfc2NhblsyXSkpLAorICAgICAgICAgICAgRlhTWVNfR2V0S1ZhbHVlKHN0YXRpY19jYXN0PHVpbnQzMl90PihzcmNfc2NhblszXSkpKTsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhSR0IyR1JBWShyLCBnLCBiKTsKKyAgICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyArK3JvdykgeworICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPQorICAgICAgICAgIHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiBCcHA7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgKytjb2wpIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sIHNyY19zY2FuWzBdKTsKKyAgICAgICAgc3JjX3NjYW4gKz0gQnBwOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIENvbnZlcnRCdWZmZXJfSW5kZXhDb3B5KHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3ApIHsKKyAgaWYgKHBTcmNCaXRtYXAtPkdldEJQUCgpID09IDEpIHsKKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7ICsrcm93KSB7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgICAvLyBTZXQgYWxsIGRlc3RpbmF0aW9uIHBpeGVscyB0byBiZSB3aGl0ZSBpbml0aWFsbHkuCisgICAgICBtZW1zZXQoZGVzdF9zY2FuLCAyNTUsIHdpZHRoKTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdyk7CisgICAgICBmb3IgKGludCBjb2wgPSBzcmNfbGVmdDsgY29sIDwgc3JjX2xlZnQgKyB3aWR0aDsgKytjb2wpIHsKKyAgICAgICAgLy8gSWYgdGhlIHNvdXJjZSBiaXQgaXMgc2V0LCB0aGVuIHNldCB0aGUgZGVzdGluYXRpb24gcGl4ZWwgdG8gYmUgYmxhY2suCisgICAgICAgIGlmIChzcmNfc2Nhbltjb2wgLyA4XSAmICgxIDw8ICg3IC0gY29sICUgOCkpKQorICAgICAgICAgICpkZXN0X3NjYW4gPSAwOworCisgICAgICAgICsrZGVzdF9zY2FuOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7ICsrcm93KSB7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9CisgICAgICAgICAgcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdDsKKyAgICAgIG1lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ29udmVydEJ1ZmZlcl9QbHQyUGx0UmdiOCh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3RfcGx0KSB7CisgIENvbnZlcnRCdWZmZXJfSW5kZXhDb3B5KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfbGVmdCwgc3JjX3RvcCk7CisgIHVpbnQzMl90KiBzcmNfcGx0ID0gcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpOworICBpbnQgcGx0X3NpemUgPSBwU3JjQml0bWFwLT5HZXRQYWxldHRlU2l6ZSgpOworICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGx0X3NpemU7ICsraSkgeworICAgICAgdWludDhfdCByOworICAgICAgdWludDhfdCBnOworICAgICAgdWludDhfdCBiOworICAgICAgc3RkOjp0aWUociwgZywgYikgPSBBZG9iZUNNWUtfdG9fc1JHQjEoCisgICAgICAgICAgRlhTWVNfR2V0Q1ZhbHVlKHNyY19wbHRbaV0pLCBGWFNZU19HZXRNVmFsdWUoc3JjX3BsdFtpXSksCisgICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKHNyY19wbHRbaV0pLCBGWFNZU19HZXRLVmFsdWUoc3JjX3BsdFtpXSkpOworICAgICAgZHN0X3BsdFtpXSA9IEZYQVJHQl9NQUtFKDB4ZmYsIHIsIGcsIGIpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtZW1jcHkoZHN0X3BsdCwgc3JjX3BsdCwgcGx0X3NpemUgKiA0KTsKKyAgfQorfQorCit2b2lkIENvbnZlcnRCdWZmZXJfUmdiMlBsdFJnYjgodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0X3BsdCkgeworICBpbnQgYnBwID0gcFNyY0JpdG1hcC0+R2V0QlBQKCkgLyA4OworICBDRlhfUGFsZXR0ZSBwYWxldHRlKHBTcmNCaXRtYXApOworICBjb25zdCBzdGQ6OnBhaXI8dWludDMyX3QsIHVpbnQzMl90PiogTHV0cyA9IHBhbGV0dGUuR2V0THV0cygpOworICBpbnQgbHV0ID0gcGFsZXR0ZS5HZXRMdXRDb3VudCgpOworICBjb25zdCB1aW50MzJfdCogcGFsID0gcGFsZXR0ZS5HZXRQYWxldHRlKCk7CisgIGlmIChsdXQgPiAyNTYpIHsKKyAgICBpbnQgZXJyOworICAgIGludCBtaW5fZXJyOworICAgIGludCBsdXRfMjU2ID0gbHV0IC0gMjU2OworICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGx1dF8yNTY7ICsrcm93KSB7CisgICAgICBtaW5fZXJyID0gMTAwMDAwMDsKKyAgICAgIHVpbnQ4X3QgcjsKKyAgICAgIHVpbnQ4X3QgZzsKKyAgICAgIHVpbnQ4X3QgYjsKKyAgICAgIENvbG9yRGVjb2RlKEx1dHNbcm93XS5zZWNvbmQsICZyLCAmZywgJmIpOworICAgICAgdWludDMyX3QgY2xyaW5kZXggPSAwOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgMjU2OyArK2NvbCkgeworICAgICAgICB1aW50MzJfdCBwX2NvbG9yID0gcGFsW2NvbF07CisgICAgICAgIGludCBkX3IgPSByIC0gc3RhdGljX2Nhc3Q8dWludDhfdD4ocF9jb2xvciA+PiAxNik7CisgICAgICAgIGludCBkX2cgPSBnIC0gc3RhdGljX2Nhc3Q8dWludDhfdD4ocF9jb2xvciA+PiA4KTsKKyAgICAgICAgaW50IGRfYiA9IGIgLSBzdGF0aWNfY2FzdDx1aW50OF90PihwX2NvbG9yKTsKKyAgICAgICAgZXJyID0gZF9yICogZF9yICsgZF9nICogZF9nICsgZF9iICogZF9iOworICAgICAgICBpZiAoZXJyIDwgbWluX2VycikgeworICAgICAgICAgIG1pbl9lcnIgPSBlcnI7CisgICAgICAgICAgY2xyaW5kZXggPSBjb2w7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHBhbGV0dGUuU2V0QW1vdW50THV0KHJvdywgY2xyaW5kZXgpOworICAgIH0KKyAgfQorICBpbnQzMl90IGx1dF8xID0gbHV0IC0gMTsKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyArK3JvdykgeworICAgIHVpbnQ4X3QqIHNyY19zY2FuID0KKyAgICAgICAgY29uc3RfY2FzdDx1aW50OF90Kj4ocFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykpICsgc3JjX2xlZnQ7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyArK2NvbCkgeworICAgICAgdWludDhfdCogc3JjX3BvcnQgPSBzcmNfc2NhbiArIGNvbCAqIGJwcDsKKyAgICAgIGludCByID0gc3JjX3BvcnRbMl0gJiAweGYwOworICAgICAgaW50IGcgPSBzcmNfcG9ydFsxXSAmIDB4ZjA7CisgICAgICBpbnQgYiA9IHNyY19wb3J0WzBdICYgMHhmMDsKKyAgICAgIHVpbnQzMl90IGNscmluZGV4ID0gKHIgPDwgNCkgKyBnICsgKGIgPj4gNCk7CisgICAgICBmb3IgKGludCBpID0gbHV0XzE7IGkgPj0gMDsgLS1pKQorICAgICAgICBpZiAoY2xyaW5kZXggPT0gTHV0c1tpXS5zZWNvbmQpIHsKKyAgICAgICAgICAqKGRlc3Rfc2NhbiArIGNvbCkgPSBzdGF0aWNfY2FzdDx1aW50OF90PihMdXRzW2ldLmZpcnN0KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgfQorICBtZW1jcHkoZHN0X3BsdCwgcGFsLCBzaXplb2YodWludDMyX3QpICogMjU2KTsKK30KKwordm9pZCBDb252ZXJ0QnVmZmVyXzFicHBNYXNrMlJnYihGWERJQl9Gb3JtYXQgZHN0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCkgeworICBpbnQgY29tcHMgPSAoZHN0X2Zvcm1hdCAmIDB4ZmYpIC8gODsKKyAgdWludDhfdCBzZXRfZ3JheSwgcmVzZXRfZ3JheTsKKyAgc2V0X2dyYXkgPSAweGZmOworICByZXNldF9ncmF5ID0gMHgwMDsKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyArK3JvdykgeworICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpOworICAgIGZvciAoaW50IGNvbCA9IHNyY19sZWZ0OyBjb2wgPCBzcmNfbGVmdCArIHdpZHRoOyArK2NvbCkgeworICAgICAgaWYgKHNyY19zY2FuW2NvbCAvIDhdICYgKDEgPDwgKDcgLSBjb2wgJSA4KSkpIHsKKyAgICAgICAgZGVzdF9zY2FuWzBdID0gc2V0X2dyYXk7CisgICAgICAgIGRlc3Rfc2NhblsxXSA9IHNldF9ncmF5OworICAgICAgICBkZXN0X3NjYW5bMl0gPSBzZXRfZ3JheTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlc3Rfc2NhblswXSA9IHJlc2V0X2dyYXk7CisgICAgICAgIGRlc3Rfc2NhblsxXSA9IHJlc2V0X2dyYXk7CisgICAgICAgIGRlc3Rfc2NhblsyXSA9IHJlc2V0X2dyYXk7CisgICAgICB9CisgICAgICBkZXN0X3NjYW4gKz0gY29tcHM7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ29udmVydEJ1ZmZlcl84YnBwTWFzazJSZ2IoRlhESUJfRm9ybWF0IGRzdF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3ApIHsKKyAgaW50IGNvbXBzID0gKGRzdF9mb3JtYXQgJiAweGZmKSAvIDg7CisgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgKytyb3cpIHsKKyAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0OworICAgIHVpbnQ4X3Qgc3JjX3BpeGVsOworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyArK2NvbCkgeworICAgICAgc3JjX3BpeGVsID0gKnNyY19zY2FuKys7CisgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcGl4ZWw7CisgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcGl4ZWw7CisgICAgICAqZGVzdF9zY2FuID0gc3JjX3BpeGVsOworICAgICAgZGVzdF9zY2FuICs9IGNvbXBzIC0gMjsKKyAgICB9CisgIH0KK30KKwordm9pZCBDb252ZXJ0QnVmZmVyXzFicHBQbHQyUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3ApIHsKKyAgaW50IGNvbXBzID0gKGRzdF9mb3JtYXQgJiAweGZmKSAvIDg7CisgIHVpbnQzMl90KiBzcmNfcGx0ID0gcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpOworICB1aW50MzJfdCBwbHRbMl07CisgIHVpbnQ4X3QqIGJncl9wdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwbHQpOworICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgeworICAgIHBsdFswXSA9IEZYQ01ZS19UT0RJQihzcmNfcGx0WzBdKTsKKyAgICBwbHRbMV0gPSBGWENNWUtfVE9ESUIoc3JjX3BsdFsxXSk7CisgIH0gZWxzZSB7CisgICAgYmdyX3B0clswXSA9IEZYQVJHQl9CKHNyY19wbHRbMF0pOworICAgIGJncl9wdHJbMV0gPSBGWEFSR0JfRyhzcmNfcGx0WzBdKTsKKyAgICBiZ3JfcHRyWzJdID0gRlhBUkdCX1Ioc3JjX3BsdFswXSk7CisgICAgYmdyX3B0clszXSA9IEZYQVJHQl9CKHNyY19wbHRbMV0pOworICAgIGJncl9wdHJbNF0gPSBGWEFSR0JfRyhzcmNfcGx0WzFdKTsKKyAgICBiZ3JfcHRyWzVdID0gRlhBUkdCX1Ioc3JjX3BsdFsxXSk7CisgIH0KKworICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgeworICAgIHN0ZDo6dGllKGJncl9wdHJbMl0sIGJncl9wdHJbMV0sIGJncl9wdHJbMF0pID0gQWRvYmVDTVlLX3RvX3NSR0IxKAorICAgICAgICBGWFNZU19HZXRDVmFsdWUoc3JjX3BsdFswXSksIEZYU1lTX0dldE1WYWx1ZShzcmNfcGx0WzBdKSwKKyAgICAgICAgRlhTWVNfR2V0WVZhbHVlKHNyY19wbHRbMF0pLCBGWFNZU19HZXRLVmFsdWUoc3JjX3BsdFswXSkpOworICAgIHN0ZDo6dGllKGJncl9wdHJbNV0sIGJncl9wdHJbNF0sIGJncl9wdHJbM10pID0gQWRvYmVDTVlLX3RvX3NSR0IxKAorICAgICAgICBGWFNZU19HZXRDVmFsdWUoc3JjX3BsdFsxXSksIEZYU1lTX0dldE1WYWx1ZShzcmNfcGx0WzFdKSwKKyAgICAgICAgRlhTWVNfR2V0WVZhbHVlKHNyY19wbHRbMV0pLCBGWFNZU19HZXRLVmFsdWUoc3JjX3BsdFsxXSkpOworICB9CisKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyArK3JvdykgeworICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpOworICAgIGZvciAoaW50IGNvbCA9IHNyY19sZWZ0OyBjb2wgPCBzcmNfbGVmdCArIHdpZHRoOyArK2NvbCkgeworICAgICAgaWYgKHNyY19zY2FuW2NvbCAvIDhdICYgKDEgPDwgKDcgLSBjb2wgJSA4KSkpIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gYmdyX3B0clszXTsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gYmdyX3B0cls0XTsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IGJncl9wdHJbNV07CisgICAgICB9IGVsc2UgeworICAgICAgICAqZGVzdF9zY2FuKysgPSBiZ3JfcHRyWzBdOworICAgICAgICAqZGVzdF9zY2FuKysgPSBiZ3JfcHRyWzFdOworICAgICAgICAqZGVzdF9zY2FuID0gYmdyX3B0clsyXTsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbiArPSBjb21wcyAtIDI7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ29udmVydEJ1ZmZlcl84YnBwUGx0MlJnYihGWERJQl9Gb3JtYXQgZHN0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wKSB7CisgIGludCBjb21wcyA9IChkc3RfZm9ybWF0ICYgMHhmZikgLyA4OworICB1aW50MzJfdCogc3JjX3BsdCA9IHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKTsKKyAgdWludDMyX3QgcGx0WzI1Nl07CisgIHVpbnQ4X3QqIGJncl9wdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwbHQpOworICBpZiAoIXBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgKytpKSB7CisgICAgICAqYmdyX3B0cisrID0gRlhBUkdCX0Ioc3JjX3BsdFtpXSk7CisgICAgICAqYmdyX3B0cisrID0gRlhBUkdCX0coc3JjX3BsdFtpXSk7CisgICAgICAqYmdyX3B0cisrID0gRlhBUkdCX1Ioc3JjX3BsdFtpXSk7CisgICAgfQorICAgIGJncl9wdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwbHQpOworICB9CisKKyAgaWYgKHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgKytpKSB7CisgICAgICBzdGQ6OnRpZShiZ3JfcHRyWzJdLCBiZ3JfcHRyWzFdLCBiZ3JfcHRyWzBdKSA9IEFkb2JlQ01ZS190b19zUkdCMSgKKyAgICAgICAgICBGWFNZU19HZXRDVmFsdWUoc3JjX3BsdFtpXSksIEZYU1lTX0dldE1WYWx1ZShzcmNfcGx0W2ldKSwKKyAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoc3JjX3BsdFtpXSksIEZYU1lTX0dldEtWYWx1ZShzcmNfcGx0W2ldKSk7CisgICAgICBiZ3JfcHRyICs9IDM7CisgICAgfQorICAgIGJncl9wdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwbHQpOworICB9CisKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyArK3JvdykgeworICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQ7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7ICsrY29sKSB7CisgICAgICB1aW50OF90KiBzcmNfcGl4ZWwgPSBiZ3JfcHRyICsgMyAqICgqc3JjX3NjYW4rKyk7CisgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3BpeGVsKys7CisgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3BpeGVsKys7CisgICAgICAqZGVzdF9zY2FuID0gKnNyY19waXhlbCsrOworICAgICAgZGVzdF9zY2FuICs9IGNvbXBzIC0gMjsKKyAgICB9CisgIH0KK30KKwordm9pZCBDb252ZXJ0QnVmZmVyXzI0YnBwUmdiMlJnYjI0KHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3ApIHsKKyAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyArK3JvdykgeworICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9CisgICAgICAgIHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiAzOworICAgIG1lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCAqIDMpOworICB9Cit9CisKK3ZvaWQgQ29udmVydEJ1ZmZlcl8zMmJwcFJnYjJSZ2IyNCh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wKSB7CisgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgKytyb3cpIHsKKyAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPQorICAgICAgICBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogNDsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgKytjb2wpIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICsrc3JjX3NjYW47CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ29udmVydEJ1ZmZlcl9SZ2IyUmdiMzIodWludDhfdCogZGVzdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCkgeworICBpbnQgY29tcHMgPSBwU3JjQml0bWFwLT5HZXRCUFAoKSAvIDg7CisgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgKytyb3cpIHsKKyAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPQorICAgICAgICBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogY29tcHM7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7ICsrY29sKSB7CisgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICArK2Rlc3Rfc2NhbjsKKyAgICAgIHNyY19zY2FuICs9IGNvbXBzIC0gMzsKKyAgICB9CisgIH0KK30KKwordm9pZCBDb252ZXJ0QnVmZmVyXzMyYnBwQ215azJSZ2IzMih1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwU3JjQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wKSB7CisgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgKytyb3cpIHsKKyAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7CisgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPQorICAgICAgICBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogNDsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgKytjb2wpIHsKKyAgICAgIHN0ZDo6dGllKGRlc3Rfc2NhblsyXSwgZGVzdF9zY2FuWzFdLCBkZXN0X3NjYW5bMF0pID0gQWRvYmVDTVlLX3RvX3NSR0IxKAorICAgICAgICAgIHNyY19zY2FuWzBdLCBzcmNfc2NhblsxXSwgc3JjX3NjYW5bMl0sIHNyY19zY2FuWzNdKTsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICB9CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0NGWF9ESUJTb3VyY2U6OkNGWF9ESUJTb3VyY2UoKQorICAgIDogbV9XaWR0aCgwKSwgbV9IZWlnaHQoMCksIG1fYnBwKDApLCBtX0FscGhhRmxhZygwKSwgbV9QaXRjaCgwKSB7fQorCitDRlhfRElCU291cmNlOjp+Q0ZYX0RJQlNvdXJjZSgpIHt9CisKK3VpbnQ4X3QqIENGWF9ESUJTb3VyY2U6OkdldEJ1ZmZlcigpIGNvbnN0IHsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2Jvb2wgQ0ZYX0RJQlNvdXJjZTo6U2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKSBjb25zdCB7CisgIHJldHVybiBmYWxzZTsKK30KKworUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gQ0ZYX0RJQlNvdXJjZTo6Q2xvbmUoY29uc3QgRlhfUkVDVCogcENsaXApIGNvbnN0IHsKKyAgRlhfUkVDVCByZWN0KDAsIDAsIG1fV2lkdGgsIG1fSGVpZ2h0KTsKKyAgaWYgKHBDbGlwKSB7CisgICAgcmVjdC5JbnRlcnNlY3QoKnBDbGlwKTsKKyAgICBpZiAocmVjdC5Jc0VtcHR5KCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBhdXRvIHBOZXdCaXRtYXAgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOworICBpZiAoIXBOZXdCaXRtYXAtPkNyZWF0ZShyZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCksIEdldEZvcm1hdCgpKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBwTmV3Qml0bWFwLT5TZXRQYWxldHRlKG1fcFBhbGV0dGUuZ2V0KCkpOworICBwTmV3Qml0bWFwLT5TZXRBbHBoYU1hc2sobV9wQWxwaGFNYXNrLCBwQ2xpcCk7CisgIGlmIChHZXRCUFAoKSA9PSAxICYmIHJlY3QubGVmdCAlIDggIT0gMCkgeworICAgIGludCBsZWZ0X3NoaWZ0ID0gcmVjdC5sZWZ0ICUgMzI7CisgICAgaW50IHJpZ2h0X3NoaWZ0ID0gMzIgLSBsZWZ0X3NoaWZ0OworICAgIGludCBkd29yZF9jb3VudCA9IHBOZXdCaXRtYXAtPm1fUGl0Y2ggLyA0OworICAgIGZvciAoaW50IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgKytyb3cpIHsKKyAgICAgIHVpbnQzMl90KiBzcmNfc2NhbiA9ICh1aW50MzJfdCopR2V0U2NhbmxpbmUocm93KSArIHJlY3QubGVmdCAvIDMyOworICAgICAgdWludDMyX3QqIGRlc3Rfc2NhbiA9ICh1aW50MzJfdCopcE5ld0JpdG1hcC0+R2V0U2NhbmxpbmUocm93IC0gcmVjdC50b3ApOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkd29yZF9jb3VudDsgKytpKSB7CisgICAgICAgIGRlc3Rfc2NhbltpXSA9CisgICAgICAgICAgICAoc3JjX3NjYW5baV0gPDwgbGVmdF9zaGlmdCkgfCAoc3JjX3NjYW5baSArIDFdID4+IHJpZ2h0X3NoaWZ0KTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW50IGNvcHlfbGVuID0gKHBOZXdCaXRtYXAtPkdldFdpZHRoKCkgKiBwTmV3Qml0bWFwLT5HZXRCUFAoKSArIDcpIC8gODsKKyAgICBpZiAobV9QaXRjaCA8IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb3B5X2xlbikpCisgICAgICBjb3B5X2xlbiA9IG1fUGl0Y2g7CisKKyAgICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207ICsrcm93KSB7CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IEdldFNjYW5saW5lKHJvdykgKyByZWN0LmxlZnQgKiBtX2JwcCAvIDg7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSAodWludDhfdCopcE5ld0JpdG1hcC0+R2V0U2NhbmxpbmUocm93IC0gcmVjdC50b3ApOworICAgICAgbWVtY3B5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIGNvcHlfbGVuKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHBOZXdCaXRtYXA7Cit9CisKK3ZvaWQgQ0ZYX0RJQlNvdXJjZTo6QnVpbGRQYWxldHRlKCkgeworICBpZiAobV9wUGFsZXR0ZSkKKyAgICByZXR1cm47CisKKyAgaWYgKEdldEJQUCgpID09IDEpIHsKKyAgICBtX3BQYWxldHRlLnJlc2V0KEZYX0FsbG9jKHVpbnQzMl90LCAyKSk7CisgICAgaWYgKElzQ215a0ltYWdlKCkpIHsKKyAgICAgIG1fcFBhbGV0dGUuZ2V0KClbMF0gPSAweGZmOworICAgICAgbV9wUGFsZXR0ZS5nZXQoKVsxXSA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fcFBhbGV0dGUuZ2V0KClbMF0gPSAweGZmMDAwMDAwOworICAgICAgbV9wUGFsZXR0ZS5nZXQoKVsxXSA9IDB4ZmZmZmZmZmY7CisgICAgfQorICB9IGVsc2UgaWYgKEdldEJQUCgpID09IDgpIHsKKyAgICBtX3BQYWxldHRlLnJlc2V0KEZYX0FsbG9jKHVpbnQzMl90LCAyNTYpKTsKKyAgICBpZiAoSXNDbXlrSW1hZ2UoKSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7ICsraSkKKyAgICAgICAgbV9wUGFsZXR0ZS5nZXQoKVtpXSA9IDB4ZmYgLSBpOworICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgKytpKQorICAgICAgICBtX3BQYWxldHRlLmdldCgpW2ldID0gMHhmZjAwMDAwMCB8IChpICogMHgxMDEwMSk7CisgICAgfQorICB9Cit9CisKK2Jvb2wgQ0ZYX0RJQlNvdXJjZTo6QnVpbGRBbHBoYU1hc2soKSB7CisgIGlmIChtX3BBbHBoYU1hc2spCisgICAgcmV0dXJuIHRydWU7CisKKyAgbV9wQWxwaGFNYXNrID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKTsKKyAgaWYgKCFtX3BBbHBoYU1hc2stPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7CisgICAgbV9wQWxwaGFNYXNrID0gbnVsbHB0cjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbWVtc2V0KG1fcEFscGhhTWFzay0+R2V0QnVmZmVyKCksIDB4ZmYsCisgICAgICAgICBtX3BBbHBoYU1hc2stPkdldEhlaWdodCgpICogbV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3VpbnQzMl90IENGWF9ESUJTb3VyY2U6OkdldFBhbGV0dGVBcmdiKGludCBpbmRleCkgY29uc3QgeworICBBU1NFUlQoKEdldEJQUCgpID09IDEgfHwgR2V0QlBQKCkgPT0gOCkgJiYgIUlzQWxwaGFNYXNrKCkpOworICBpZiAobV9wUGFsZXR0ZSkKKyAgICByZXR1cm4gbV9wUGFsZXR0ZS5nZXQoKVtpbmRleF07CisKKyAgaWYgKElzQ215a0ltYWdlKCkpIHsKKyAgICBpZiAoR2V0QlBQKCkgPT0gMSkKKyAgICAgIHJldHVybiBpbmRleCA/IDAgOiAweGZmOworCisgICAgcmV0dXJuIDB4ZmYgLSBpbmRleDsKKyAgfQorICBpZiAoR2V0QlBQKCkgPT0gMSkKKyAgICByZXR1cm4gaW5kZXggPyAweGZmZmZmZmZmIDogMHhmZjAwMDAwMDsKKworICByZXR1cm4gaW5kZXggKiAweDEwMTAxIHwgMHhmZjAwMDAwMDsKK30KKwordm9pZCBDRlhfRElCU291cmNlOjpTZXRQYWxldHRlQXJnYihpbnQgaW5kZXgsIHVpbnQzMl90IGNvbG9yKSB7CisgIEFTU0VSVCgoR2V0QlBQKCkgPT0gMSB8fCBHZXRCUFAoKSA9PSA4KSAmJiAhSXNBbHBoYU1hc2soKSk7CisgIGlmICghbV9wUGFsZXR0ZSkgeworICAgIEJ1aWxkUGFsZXR0ZSgpOworICB9CisgIG1fcFBhbGV0dGUuZ2V0KClbaW5kZXhdID0gY29sb3I7Cit9CisKK2ludCBDRlhfRElCU291cmNlOjpGaW5kUGFsZXR0ZSh1aW50MzJfdCBjb2xvcikgY29uc3QgeworICBBU1NFUlQoKEdldEJQUCgpID09IDEgfHwgR2V0QlBQKCkgPT0gOCkgJiYgIUlzQWxwaGFNYXNrKCkpOworICBpZiAoIW1fcFBhbGV0dGUpIHsKKyAgICBpZiAoSXNDbXlrSW1hZ2UoKSkgeworICAgICAgaWYgKEdldEJQUCgpID09IDEpCisgICAgICAgIHJldHVybiAoc3RhdGljX2Nhc3Q8dWludDhfdD4oY29sb3IpID09IDB4ZmYpID8gMCA6IDE7CisKKyAgICAgIHJldHVybiAweGZmIC0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29sb3IpOworICAgIH0KKyAgICBpZiAoR2V0QlBQKCkgPT0gMSkKKyAgICAgIHJldHVybiAoc3RhdGljX2Nhc3Q8dWludDhfdD4oY29sb3IpID09IDB4ZmYpID8gMSA6IDA7CisKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29sb3IpOworICB9CisgIGludCBwYWxzaXplID0gKDEgPDwgR2V0QlBQKCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IHBhbHNpemU7ICsraSkgeworICAgIGlmIChtX3BQYWxldHRlLmdldCgpW2ldID09IGNvbG9yKQorICAgICAgcmV0dXJuIGk7CisgIH0KKyAgcmV0dXJuIC0xOworfQorCit2b2lkIENGWF9ESUJTb3VyY2U6OkdldE92ZXJsYXBSZWN0KGludCYgZGVzdF9sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgc3JjX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduKSB7CisgIGlmICh3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKQorICAgIHJldHVybjsKKworICBBU1NFUlQod2lkdGggPiAwICYmIGhlaWdodCA+IDApOworICBpZiAoZGVzdF9sZWZ0ID4gbV9XaWR0aCB8fCBkZXN0X3RvcCA+IG1fSGVpZ2h0KSB7CisgICAgd2lkdGggPSAwOworICAgIGhlaWdodCA9IDA7CisgICAgcmV0dXJuOworICB9CisgIGludCB4X29mZnNldCA9IGRlc3RfbGVmdCAtIHNyY19sZWZ0OworICBpbnQgeV9vZmZzZXQgPSBkZXN0X3RvcCAtIHNyY190b3A7CisgIEZYX1JFQ1Qgc3JjX3JlY3Qoc3JjX2xlZnQsIHNyY190b3AsIHNyY19sZWZ0ICsgd2lkdGgsIHNyY190b3AgKyBoZWlnaHQpOworICBGWF9SRUNUIHNyY19ib3VuZCgwLCAwLCBzcmNfd2lkdGgsIHNyY19oZWlnaHQpOworICBzcmNfcmVjdC5JbnRlcnNlY3Qoc3JjX2JvdW5kKTsKKyAgRlhfUkVDVCBkZXN0X3JlY3Qoc3JjX3JlY3QubGVmdCArIHhfb2Zmc2V0LCBzcmNfcmVjdC50b3AgKyB5X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgc3JjX3JlY3QucmlnaHQgKyB4X29mZnNldCwgc3JjX3JlY3QuYm90dG9tICsgeV9vZmZzZXQpOworICBGWF9SRUNUIGRlc3RfYm91bmQoMCwgMCwgbV9XaWR0aCwgbV9IZWlnaHQpOworICBkZXN0X3JlY3QuSW50ZXJzZWN0KGRlc3RfYm91bmQpOworICBpZiAocENsaXBSZ24pCisgICAgZGVzdF9yZWN0LkludGVyc2VjdChwQ2xpcFJnbi0+R2V0Qm94KCkpOworICBkZXN0X2xlZnQgPSBkZXN0X3JlY3QubGVmdDsKKyAgZGVzdF90b3AgPSBkZXN0X3JlY3QudG9wOworICBzcmNfbGVmdCA9IGRlc3RfbGVmdCAtIHhfb2Zmc2V0OworICBzcmNfdG9wID0gZGVzdF90b3AgLSB5X29mZnNldDsKKyAgd2lkdGggPSBkZXN0X3JlY3QucmlnaHQgLSBkZXN0X3JlY3QubGVmdDsKKyAgaGVpZ2h0ID0gZGVzdF9yZWN0LmJvdHRvbSAtIGRlc3RfcmVjdC50b3A7Cit9CisKK3ZvaWQgQ0ZYX0RJQlNvdXJjZTo6U2V0UGFsZXR0ZShjb25zdCB1aW50MzJfdCogcFNyYykgeworICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1BhbGV0dGVTaXplID0gMjU2OworICBpZiAoIXBTcmMgfHwgR2V0QlBQKCkgPiA4KSB7CisgICAgbV9wUGFsZXR0ZS5yZXNldCgpOworICAgIHJldHVybjsKKyAgfQorICB1aW50MzJfdCBwYWxfc2l6ZSA9IDEgPDwgR2V0QlBQKCk7CisgIGlmICghbV9wUGFsZXR0ZSkKKyAgICBtX3BQYWxldHRlLnJlc2V0KEZYX0FsbG9jKHVpbnQzMl90LCBwYWxfc2l6ZSkpOworICBwYWxfc2l6ZSA9IHN0ZDo6bWluKHBhbF9zaXplLCBrUGFsZXR0ZVNpemUpOworICBtZW1jcHkobV9wUGFsZXR0ZS5nZXQoKSwgcFNyYywgcGFsX3NpemUgKiBzaXplb2YodWludDMyX3QpKTsKK30KKwordm9pZCBDRlhfRElCU291cmNlOjpHZXRQYWxldHRlKHVpbnQzMl90KiBwYWwsIGludCBhbHBoYSkgY29uc3QgeworICBBU1NFUlQoR2V0QlBQKCkgPD0gOCAmJiAhSXNDbXlrSW1hZ2UoKSk7CisgIGlmIChHZXRCUFAoKSA9PSAxKSB7CisgICAgcGFsWzBdID0gKChtX3BQYWxldHRlID8gbV9wUGFsZXR0ZS5nZXQoKVswXSA6IDB4ZmYwMDAwMDApICYgMHhmZmZmZmYpIHwKKyAgICAgICAgICAgICAoYWxwaGEgPDwgMjQpOworICAgIHBhbFsxXSA9ICgobV9wUGFsZXR0ZSA/IG1fcFBhbGV0dGUuZ2V0KClbMV0gOiAweGZmZmZmZmZmKSAmIDB4ZmZmZmZmKSB8CisgICAgICAgICAgICAgKGFscGhhIDw8IDI0KTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKG1fcFBhbGV0dGUpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgKytpKQorICAgICAgcGFsW2ldID0gKG1fcFBhbGV0dGUuZ2V0KClbaV0gJiAweDAwZmZmZmZmKSB8IChhbHBoYSA8PCAyNCk7CisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7ICsraSkKKyAgICAgIHBhbFtpXSA9IChpICogMHgxMDEwMSkgfCAoYWxwaGEgPDwgMjQpOworICB9Cit9CisKK1JldGFpblB0cjxDRlhfRElCaXRtYXA+IENGWF9ESUJTb3VyY2U6OkNsb25lQWxwaGFNYXNrKCkgY29uc3QgeworICBBU1NFUlQoR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYik7CisgIEZYX1JFQ1QgcmVjdCgwLCAwLCBtX1dpZHRoLCBtX0hlaWdodCk7CisgIGF1dG8gcE1hc2sgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOworICBpZiAoIXBNYXNrLT5DcmVhdGUocmVjdC5XaWR0aCgpLCByZWN0LkhlaWdodCgpLCBGWERJQl84YnBwTWFzaykpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgZm9yIChpbnQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyArK3JvdykgeworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gR2V0U2NhbmxpbmUocm93KSArIHJlY3QubGVmdCAqIDQgKyAzOworICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9CisgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCo+KHBNYXNrLT5HZXRTY2FubGluZShyb3cgLSByZWN0LnRvcCkpOworICAgIGZvciAoaW50IGNvbCA9IHJlY3QubGVmdDsgY29sIDwgcmVjdC5yaWdodDsgKytjb2wpIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbjsKKyAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgfQorICB9CisgIHJldHVybiBwTWFzazsKK30KKworYm9vbCBDRlhfRElCU291cmNlOjpTZXRBbHBoYU1hc2soY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwQWxwaGFNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcENsaXApIHsKKyAgaWYgKCFIYXNBbHBoYSgpIHx8IEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghcEFscGhhTWFzaykgeworICAgIG1fcEFscGhhTWFzay0+Q2xlYXIoMHhmZjAwMDAwMCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgRlhfUkVDVCByZWN0KDAsIDAsIHBBbHBoYU1hc2stPm1fV2lkdGgsIHBBbHBoYU1hc2stPm1fSGVpZ2h0KTsKKyAgaWYgKHBDbGlwKSB7CisgICAgcmVjdC5JbnRlcnNlY3QoKnBDbGlwKTsKKyAgICBpZiAocmVjdC5Jc0VtcHR5KCkgfHwgcmVjdC5XaWR0aCgpICE9IG1fV2lkdGggfHwKKyAgICAgICAgcmVjdC5IZWlnaHQoKSAhPSBtX0hlaWdodCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAocEFscGhhTWFzay0+bV9XaWR0aCAhPSBtX1dpZHRoIHx8IHBBbHBoYU1hc2stPm1fSGVpZ2h0ICE9IG1fSGVpZ2h0KQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyArK3JvdykgeworICAgIG1lbWNweShjb25zdF9jYXN0PHVpbnQ4X3QqPihtX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKHJvdykpLAorICAgICAgICAgICBwQWxwaGFNYXNrLT5HZXRTY2FubGluZShyb3cgKyByZWN0LnRvcCkgKyByZWN0LmxlZnQsCisgICAgICAgICAgIG1fcEFscGhhTWFzay0+bV9QaXRjaCk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK1JldGFpblB0cjxDRlhfRElCaXRtYXA+IENGWF9ESUJTb3VyY2U6OkZsaXBJbWFnZShib29sIGJYRmxpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJZRmxpcCkgY29uc3QgeworICBhdXRvIHBGbGlwcGVkID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKTsKKyAgaWYgKCFwRmxpcHBlZC0+Q3JlYXRlKG1fV2lkdGgsIG1fSGVpZ2h0LCBHZXRGb3JtYXQoKSkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgcEZsaXBwZWQtPlNldFBhbGV0dGUobV9wUGFsZXR0ZS5nZXQoKSk7CisgIHVpbnQ4X3QqIHBEZXN0QnVmZmVyID0gcEZsaXBwZWQtPkdldEJ1ZmZlcigpOworICBpbnQgQnBwID0gbV9icHAgLyA4OworICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgKytyb3cpIHsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IEdldFNjYW5saW5lKHJvdyk7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0KKyAgICAgICAgcERlc3RCdWZmZXIgKyBtX1BpdGNoICogKGJZRmxpcCA/IChtX0hlaWdodCAtIHJvdyAtIDEpIDogcm93KTsKKyAgICBpZiAoIWJYRmxpcCkgeworICAgICAgbWVtY3B5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fUGl0Y2gpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChtX2JwcCA9PSAxKSB7CisgICAgICBtZW1zZXQoZGVzdF9zY2FuLCAwLCBtX1BpdGNoKTsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7ICsrY29sKQorICAgICAgICBpZiAoc3JjX3NjYW5bY29sIC8gOF0gJiAoMSA8PCAoNyAtIGNvbCAlIDgpKSkgeworICAgICAgICAgIGludCBkZXN0X2NvbCA9IG1fV2lkdGggLSBjb2wgLSAxOworICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X2NvbCAvIDhdIHw9ICgxIDw8ICg3IC0gZGVzdF9jb2wgJSA4KSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZGVzdF9zY2FuICs9IChtX1dpZHRoIC0gMSkgKiBCcHA7CisgICAgICBpZiAoQnBwID09IDEpIHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgKytjb2wpIHsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gKnNyY19zY2FuOworICAgICAgICAgIC0tZGVzdF9zY2FuOworICAgICAgICAgICsrc3JjX3NjYW47CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoQnBwID09IDMpIHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgKytjb2wpIHsKKyAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfc2NhblswXTsKKyAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfc2NhblsxXTsKKyAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBzcmNfc2NhblsyXTsKKyAgICAgICAgICBkZXN0X3NjYW4gLT0gMzsKKyAgICAgICAgICBzcmNfc2NhbiArPSAzOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlQoQnBwID09IDQpOworICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyArK2NvbCkgeworICAgICAgICAgICoodWludDMyX3QqKWRlc3Rfc2NhbiA9ICoodWludDMyX3QqKXNyY19zY2FuOworICAgICAgICAgIGRlc3Rfc2NhbiAtPSA0OworICAgICAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKG1fcEFscGhhTWFzaykgeworICAgIHBEZXN0QnVmZmVyID0gcEZsaXBwZWQtPm1fcEFscGhhTWFzay0+R2V0QnVmZmVyKCk7CisgICAgdWludDMyX3QgZGVzdF9waXRjaCA9IHBGbGlwcGVkLT5tX3BBbHBoYU1hc2stPkdldFBpdGNoKCk7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7ICsrcm93KSB7CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IG1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KTsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9CisgICAgICAgICAgcERlc3RCdWZmZXIgKyBkZXN0X3BpdGNoICogKGJZRmxpcCA/IChtX0hlaWdodCAtIHJvdyAtIDEpIDogcm93KTsKKyAgICAgIGlmICghYlhGbGlwKSB7CisgICAgICAgIG1lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCBkZXN0X3BpdGNoKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBkZXN0X3NjYW4gKz0gKG1fV2lkdGggLSAxKTsKKyAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7ICsrY29sKSB7CisgICAgICAgICpkZXN0X3NjYW4gPSAqc3JjX3NjYW47CisgICAgICAgIC0tZGVzdF9zY2FuOworICAgICAgICArK3NyY19zY2FuOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gcEZsaXBwZWQ7Cit9CisKK1JldGFpblB0cjxDRlhfRElCaXRtYXA+IENGWF9ESUJTb3VyY2U6OkNsb25lQ29udmVydChGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQpIHsKKyAgaWYgKGRlc3RfZm9ybWF0ID09IEdldEZvcm1hdCgpKQorICAgIHJldHVybiBDbG9uZShudWxscHRyKTsKKworICBhdXRvIHBDbG9uZSA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfRElCaXRtYXA+KCk7CisgIGlmICghcENsb25lLT5DcmVhdGUobV9XaWR0aCwgbV9IZWlnaHQsIGRlc3RfZm9ybWF0KSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwU3JjQWxwaGE7CisgIGlmIChIYXNBbHBoYSgpKSB7CisgICAgaWYgKEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpCisgICAgICBwU3JjQWxwaGEgPSBDbG9uZUFscGhhTWFzaygpOworICAgIGVsc2UKKyAgICAgIHBTcmNBbHBoYSA9IG1fcEFscGhhTWFzazsKKworICAgIGlmICghcFNyY0FscGhhKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgYm9vbCByZXQgPSB0cnVlOworICBpZiAoZGVzdF9mb3JtYXQgJiAweDAyMDApIHsKKyAgICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYikgeworICAgICAgcmV0ID0gcFNyY0FscGhhID8gcENsb25lLT5Mb2FkQ2hhbm5lbChGWERJQl9BbHBoYSwgcFNyY0FscGhhLCBGWERJQl9BbHBoYSkKKyAgICAgICAgICAgICAgICAgICAgICA6IHBDbG9uZS0+TG9hZENoYW5uZWwoRlhESUJfQWxwaGEsIDB4ZmYpOworICAgIH0gZWxzZSB7CisgICAgICByZXQgPSBwQ2xvbmUtPlNldEFscGhhTWFzayhwU3JjQWxwaGEsIG51bGxwdHIpOworICAgIH0KKyAgfQorICBpZiAoIXJldCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4gaG9sZGVyKHRoaXMpOworICBzdGQ6OnVuaXF1ZV9wdHI8dWludDMyX3QsIEZ4RnJlZURlbGV0ZXI+IHBhbF84YnBwOworICBpZiAoIUNvbnZlcnRCdWZmZXIoZGVzdF9mb3JtYXQsIHBDbG9uZS0+R2V0QnVmZmVyKCksIHBDbG9uZS0+R2V0UGl0Y2goKSwKKyAgICAgICAgICAgICAgICAgICAgIG1fV2lkdGgsIG1fSGVpZ2h0LCBob2xkZXIsIDAsIDAsICZwYWxfOGJwcCkpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAocGFsXzhicHApCisgICAgcENsb25lLT5TZXRQYWxldHRlKHBhbF84YnBwLmdldCgpKTsKKworICByZXR1cm4gcENsb25lOworfQorCitSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBDRlhfRElCU291cmNlOjpTd2FwWFkoYm9vbCBiWEZsaXAsIGJvb2wgYllGbGlwKSBjb25zdCB7CisgIEZYX1JFQ1QgZGVzdF9jbGlwKDAsIDAsIG1fSGVpZ2h0LCBtX1dpZHRoKTsKKyAgaWYgKGRlc3RfY2xpcC5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgYXV0byBwVHJhbnNCaXRtYXAgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOworICBpbnQgcmVzdWx0X2hlaWdodCA9IGRlc3RfY2xpcC5IZWlnaHQoKTsKKyAgaW50IHJlc3VsdF93aWR0aCA9IGRlc3RfY2xpcC5XaWR0aCgpOworICBpZiAoIXBUcmFuc0JpdG1hcC0+Q3JlYXRlKHJlc3VsdF93aWR0aCwgcmVzdWx0X2hlaWdodCwgR2V0Rm9ybWF0KCkpKQorICAgIHJldHVybiBudWxscHRyOworCisgIHBUcmFuc0JpdG1hcC0+U2V0UGFsZXR0ZShtX3BQYWxldHRlLmdldCgpKTsKKyAgaW50IGRlc3RfcGl0Y2ggPSBwVHJhbnNCaXRtYXAtPkdldFBpdGNoKCk7CisgIHVpbnQ4X3QqIGRlc3RfYnVmID0gcFRyYW5zQml0bWFwLT5HZXRCdWZmZXIoKTsKKyAgaW50IHJvd19zdGFydCA9IGJYRmxpcCA/IG1fSGVpZ2h0IC0gZGVzdF9jbGlwLnJpZ2h0IDogZGVzdF9jbGlwLmxlZnQ7CisgIGludCByb3dfZW5kID0gYlhGbGlwID8gbV9IZWlnaHQgLSBkZXN0X2NsaXAubGVmdCA6IGRlc3RfY2xpcC5yaWdodDsKKyAgaW50IGNvbF9zdGFydCA9IGJZRmxpcCA/IG1fV2lkdGggLSBkZXN0X2NsaXAuYm90dG9tIDogZGVzdF9jbGlwLnRvcDsKKyAgaW50IGNvbF9lbmQgPSBiWUZsaXAgPyBtX1dpZHRoIC0gZGVzdF9jbGlwLnRvcCA6IGRlc3RfY2xpcC5ib3R0b207CisgIGlmIChHZXRCUFAoKSA9PSAxKSB7CisgICAgbWVtc2V0KGRlc3RfYnVmLCAweGZmLCBkZXN0X3BpdGNoICogcmVzdWx0X2hlaWdodCk7CisgICAgZm9yIChpbnQgcm93ID0gcm93X3N0YXJ0OyByb3cgPCByb3dfZW5kOyArK3JvdykgeworICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBHZXRTY2FubGluZShyb3cpOworICAgICAgaW50IGRlc3RfY29sID0gKGJYRmxpcCA/IGRlc3RfY2xpcC5yaWdodCAtIChyb3cgLSByb3dfc3RhcnQpIC0gMSA6IHJvdykgLQorICAgICAgICAgICAgICAgICAgICAgZGVzdF9jbGlwLmxlZnQ7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZjsKKyAgICAgIGlmIChiWUZsaXApCisgICAgICAgIGRlc3Rfc2NhbiArPSAocmVzdWx0X2hlaWdodCAtIDEpICogZGVzdF9waXRjaDsKKyAgICAgIGludCBkZXN0X3N0ZXAgPSBiWUZsaXAgPyAtZGVzdF9waXRjaCA6IGRlc3RfcGl0Y2g7CisgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7ICsrY29sKSB7CisgICAgICAgIGlmICghKHNyY19zY2FuW2NvbCAvIDhdICYgKDEgPDwgKDcgLSBjb2wgJSA4KSkpKQorICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X2NvbCAvIDhdICY9IH4oMSA8PCAoNyAtIGRlc3RfY29sICUgOCkpOworICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9zdGVwOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbnQgbkJ5dGVzID0gR2V0QlBQKCkgLyA4OworICAgIGludCBkZXN0X3N0ZXAgPSBiWUZsaXAgPyAtZGVzdF9waXRjaCA6IGRlc3RfcGl0Y2g7CisgICAgaWYgKG5CeXRlcyA9PSAzKQorICAgICAgZGVzdF9zdGVwIC09IDI7CisgICAgZm9yIChpbnQgcm93ID0gcm93X3N0YXJ0OyByb3cgPCByb3dfZW5kOyArK3JvdykgeworICAgICAgaW50IGRlc3RfY29sID0gKGJYRmxpcCA/IGRlc3RfY2xpcC5yaWdodCAtIChyb3cgLSByb3dfc3RhcnQpIC0gMSA6IHJvdykgLQorICAgICAgICAgICAgICAgICAgICAgZGVzdF9jbGlwLmxlZnQ7CisgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIGRlc3RfY29sICogbkJ5dGVzOworICAgICAgaWYgKGJZRmxpcCkKKyAgICAgICAgZGVzdF9zY2FuICs9IChyZXN1bHRfaGVpZ2h0IC0gMSkgKiBkZXN0X3BpdGNoOworICAgICAgaWYgKG5CeXRlcyA9PSA0KSB7CisgICAgICAgIHVpbnQzMl90KiBzcmNfc2NhbiA9ICh1aW50MzJfdCopR2V0U2NhbmxpbmUocm93KSArIGNvbF9zdGFydDsKKyAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyArK2NvbCkgeworICAgICAgICAgICoodWludDMyX3QqKWRlc3Rfc2NhbiA9ICpzcmNfc2NhbisrOworICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X3N0ZXA7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gR2V0U2NhbmxpbmUocm93KSArIGNvbF9zdGFydCAqIG5CeXRlczsKKyAgICAgICAgaWYgKG5CeXRlcyA9PSAxKSB7CisgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyArK2NvbCkgeworICAgICAgICAgICAgKmRlc3Rfc2NhbiA9ICpzcmNfc2NhbisrOworICAgICAgICAgICAgZGVzdF9zY2FuICs9IGRlc3Rfc3RlcDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyArK2NvbCkgeworICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X3N0ZXA7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChtX3BBbHBoYU1hc2spIHsKKyAgICBkZXN0X3BpdGNoID0gcFRyYW5zQml0bWFwLT5tX3BBbHBoYU1hc2stPkdldFBpdGNoKCk7CisgICAgZGVzdF9idWYgPSBwVHJhbnNCaXRtYXAtPm1fcEFscGhhTWFzay0+R2V0QnVmZmVyKCk7CisgICAgaW50IGRlc3Rfc3RlcCA9IGJZRmxpcCA/IC1kZXN0X3BpdGNoIDogZGVzdF9waXRjaDsKKyAgICBmb3IgKGludCByb3cgPSByb3dfc3RhcnQ7IHJvdyA8IHJvd19lbmQ7ICsrcm93KSB7CisgICAgICBpbnQgZGVzdF9jb2wgPSAoYlhGbGlwID8gZGVzdF9jbGlwLnJpZ2h0IC0gKHJvdyAtIHJvd19zdGFydCkgLSAxIDogcm93KSAtCisgICAgICAgICAgICAgICAgICAgICBkZXN0X2NsaXAubGVmdDsKKyAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgZGVzdF9jb2w7CisgICAgICBpZiAoYllGbGlwKQorICAgICAgICBkZXN0X3NjYW4gKz0gKHJlc3VsdF9oZWlnaHQgLSAxKSAqIGRlc3RfcGl0Y2g7CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IG1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KSArIGNvbF9zdGFydDsKKyAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgKytjb2wpIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9ICpzcmNfc2NhbisrOworICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9zdGVwOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gcFRyYW5zQml0bWFwOworfQorCitSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBDRlhfRElCU291cmNlOjpUcmFuc2Zvcm1UbygKKyAgICBjb25zdCBDRlhfTWF0cml4KiBwRGVzdE1hdHJpeCwKKyAgICBpbnQqIHJlc3VsdF9sZWZ0LAorICAgIGludCogcmVzdWx0X3RvcCkgeworICBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4gaG9sZGVyKHRoaXMpOworICBDRlhfSW1hZ2VUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcihob2xkZXIsIHBEZXN0TWF0cml4LCAwLCBudWxscHRyKTsKKyAgdHJhbnNmb3JtZXIuQ29udGludWUobnVsbHB0cik7CisgICpyZXN1bHRfbGVmdCA9IHRyYW5zZm9ybWVyLnJlc3VsdCgpLmxlZnQ7CisgICpyZXN1bHRfdG9wID0gdHJhbnNmb3JtZXIucmVzdWx0KCkudG9wOworICByZXR1cm4gdHJhbnNmb3JtZXIuRGV0YWNoQml0bWFwKCk7Cit9CisKK1JldGFpblB0cjxDRlhfRElCaXRtYXA+IENGWF9ESUJTb3VyY2U6OlN0cmV0Y2hUbyhpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcENsaXApIHsKKyAgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+IGhvbGRlcih0aGlzKTsKKyAgRlhfUkVDVCBjbGlwX3JlY3QoMCwgMCwgYWJzKGRlc3Rfd2lkdGgpLCBhYnMoZGVzdF9oZWlnaHQpKTsKKyAgaWYgKHBDbGlwKQorICAgIGNsaXBfcmVjdC5JbnRlcnNlY3QoKnBDbGlwKTsKKworICBpZiAoY2xpcF9yZWN0LklzRW1wdHkoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBpZiAoZGVzdF93aWR0aCA9PSBtX1dpZHRoICYmIGRlc3RfaGVpZ2h0ID09IG1fSGVpZ2h0KQorICAgIHJldHVybiBDbG9uZSgmY2xpcF9yZWN0KTsKKworICBDRlhfQml0bWFwU3RvcmVyIHN0b3JlcjsKKyAgQ0ZYX0ltYWdlU3RyZXRjaGVyIHN0cmV0Y2hlcigmc3RvcmVyLCBob2xkZXIsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfcmVjdCwgZmxhZ3MpOworICBpZiAoc3RyZXRjaGVyLlN0YXJ0KCkpCisgICAgc3RyZXRjaGVyLkNvbnRpbnVlKG51bGxwdHIpOworCisgIHJldHVybiBzdG9yZXIuRGV0YWNoKCk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDRlhfRElCU291cmNlOjpDb252ZXJ0QnVmZmVyKAorICAgIEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwKKyAgICB1aW50OF90KiBkZXN0X2J1ZiwKKyAgICBpbnQgZGVzdF9waXRjaCwKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGhlaWdodCwKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTcmNCaXRtYXAsCisgICAgaW50IHNyY19sZWZ0LAorICAgIGludCBzcmNfdG9wLAorICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50MzJfdCwgRnhGcmVlRGVsZXRlcj4qIHBfcGFsKSB7CisgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0ID0gcFNyY0JpdG1hcC0+R2V0Rm9ybWF0KCk7CisgIHN3aXRjaCAoZGVzdF9mb3JtYXQpIHsKKyAgICBjYXNlIEZYRElCX0ludmFsaWQ6CisgICAgY2FzZSBGWERJQl8xYnBwQ215azoKKyAgICBjYXNlIEZYRElCXzFicHBNYXNrOgorICAgIGNhc2UgRlhESUJfMWJwcFJnYjoKKyAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIEZYRElCXzhicHBNYXNrOiB7CisgICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSAxKSB7CisgICAgICAgIGlmIChwU3JjQml0bWFwLT5HZXRQYWxldHRlKCkpIHsKKyAgICAgICAgICBDb252ZXJ0QnVmZmVyXzFicHBQbHQyR3JheShkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgQ29udmVydEJ1ZmZlcl8xYnBwTWFzazJHcmF5KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3ApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDgpIHsKKyAgICAgICAgaWYgKHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKSkgeworICAgICAgICAgIENvbnZlcnRCdWZmZXJfOGJwcFBsdDJHcmF5KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBDb252ZXJ0QnVmZmVyXzhicHBNYXNrMkdyYXkoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPj0gMjQpIHsKKyAgICAgICAgQ29udmVydEJ1ZmZlcl9SZ2JPckNteWsyR3JheShkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjYXNlIEZYRElCXzhicHBSZ2I6CisgICAgY2FzZSBGWERJQl84YnBwUmdiYTogeworICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gOCAmJiAhcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpKSB7CisgICAgICAgIHJldHVybiBDb252ZXJ0QnVmZmVyKEZYRElCXzhicHBNYXNrLCBkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIHBfcGFsKTsKKyAgICAgIH0KKyAgICAgIHBfcGFsLT5yZXNldChGWF9BbGxvYyh1aW50MzJfdCwgMjU2KSk7CisgICAgICBpZiAoKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gMSB8fCAoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDgpICYmCisgICAgICAgICAgcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpKSB7CisgICAgICAgIENvbnZlcnRCdWZmZXJfUGx0MlBsdFJnYjgoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIHBfcGFsLT5nZXQoKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPj0gMjQpIHsKKyAgICAgICAgQ29udmVydEJ1ZmZlcl9SZ2IyUGx0UmdiOChkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwgcF9wYWwtPmdldCgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNhc2UgRlhESUJfUmdiOgorICAgIGNhc2UgRlhESUJfUmdiYTogeworICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gMSkgeworICAgICAgICBpZiAocFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpKSB7CisgICAgICAgICAgQ29udmVydEJ1ZmZlcl8xYnBwUGx0MlJnYihkZXN0X2Zvcm1hdCwgZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgQ29udmVydEJ1ZmZlcl8xYnBwTWFzazJSZ2IoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gOCkgeworICAgICAgICBpZiAocFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpKSB7CisgICAgICAgICAgQ29udmVydEJ1ZmZlcl84YnBwUGx0MlJnYihkZXN0X2Zvcm1hdCwgZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgQ29udmVydEJ1ZmZlcl84YnBwTWFzazJSZ2IoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gMjQpIHsKKyAgICAgICAgQ29udmVydEJ1ZmZlcl8yNGJwcFJnYjJSZ2IyNChkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gMzIpIHsKKyAgICAgICAgQ29udmVydEJ1ZmZlcl8zMmJwcFJnYjJSZ2IyNChkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjYXNlIEZYRElCX0FyZ2I6CisgICAgY2FzZSBGWERJQl9SZ2IzMjogeworICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gMSkgeworICAgICAgICBpZiAocFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpKSB7CisgICAgICAgICAgQ29udmVydEJ1ZmZlcl8xYnBwUGx0MlJnYihkZXN0X2Zvcm1hdCwgZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgQ29udmVydEJ1ZmZlcl8xYnBwTWFzazJSZ2IoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gOCkgeworICAgICAgICBpZiAocFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpKSB7CisgICAgICAgICAgQ29udmVydEJ1ZmZlcl84YnBwUGx0MlJnYihkZXN0X2Zvcm1hdCwgZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgQ29udmVydEJ1ZmZlcl84YnBwTWFzazJSZ2IoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPj0gMjQpIHsKKyAgICAgICAgaWYgKHNyY19mb3JtYXQgJiAweDA0MDApIHsKKyAgICAgICAgICBDb252ZXJ0QnVmZmVyXzMyYnBwQ215azJSZ2IzMihkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgQ29udmVydEJ1ZmZlcl9SZ2IyUmdiMzIoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19sZWZ0LCBzcmNfdG9wKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9kaWIvY2Z4X2RpYnNvdXJjZS5oIGIvY29yZS9meGdlL2RpYi9jZnhfZGlic291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjYWU1ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9kaWIvY2Z4X2RpYnNvdXJjZS5oCkBAIC0wLDAgKzEsMTM2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWEdFX0RJQl9DRlhfRElCU09VUkNFX0hfCisjZGVmaW5lIENPUkVfRlhHRV9ESUJfQ0ZYX0RJQlNPVVJDRV9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorCitlbnVtIEZYRElCX0NoYW5uZWwgeworICBGWERJQl9SZWQgPSAxLAorICBGWERJQl9HcmVlbiwKKyAgRlhESUJfQmx1ZSwKKyAgRlhESUJfQ3lhbiwKKyAgRlhESUJfTWFnZW50YSwKKyAgRlhESUJfWWVsbG93LAorICBGWERJQl9CbGFjaywKKyAgRlhESUJfQWxwaGEKK307CisKK2NsYXNzIENGWF9DbGlwUmduOworY2xhc3MgQ0ZYX0RJQml0bWFwOworY2xhc3MgSUZYX1BhdXNlSW5kaWNhdG9yOworCitjbGFzcyBDRlhfRElCU291cmNlIDogcHVibGljIFJldGFpbmFibGUgeworIHB1YmxpYzoKKyAgfkNGWF9ESUJTb3VyY2UoKSBvdmVycmlkZTsKKworICB2aXJ0dWFsIHVpbnQ4X3QqIEdldEJ1ZmZlcigpIGNvbnN0OworICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIEdldFNjYW5saW5lKGludCBsaW5lKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBTa2lwVG9TY2FubGluZShpbnQgbGluZSwgSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgRG93blNhbXBsZVNjYW5saW5lKGludCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9icHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmxpcFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF93aWR0aCkgY29uc3QgPSAwOworCisgIGludCBHZXRXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fV2lkdGg7IH0KKyAgaW50IEdldEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fSGVpZ2h0OyB9CisKKyAgRlhESUJfRm9ybWF0IEdldEZvcm1hdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RlhESUJfRm9ybWF0PihtX0FscGhhRmxhZyAqIDB4MTAwICsgbV9icHApOworICB9CisgIHVpbnQzMl90IEdldFBpdGNoKCkgY29uc3QgeyByZXR1cm4gbV9QaXRjaDsgfQorICB1aW50MzJfdCogR2V0UGFsZXR0ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcFBhbGV0dGUuZ2V0KCk7IH0KKyAgaW50IEdldEJQUCgpIGNvbnN0IHsgcmV0dXJuIG1fYnBwOyB9CisKKyAgLy8gVE9ETyh0aGVzdGlnKTogSW52ZXN0aWdhdGUgdGhpcy4gR2l2ZW4gdGhlIHBvc3NpYmxlIHZhbHVlcyBvZiBGWERJQl9Gb3JtYXQsCisgIC8vIGl0IGZlZWxzIGFzIHRob3VnaCB0aGlzIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBhcyAhIShtX0FscGhhRmxhZyAmIDEpIGFuZAorICAvLyBJc09wYXF1ZUltYWdlKCkgYmVsb3cgc2hvdWxkIG5ldmVyIGJlIGFibGUgdG8gcmV0dXJuIHRydWUuCisgIGJvb2wgSXNBbHBoYU1hc2soKSBjb25zdCB7IHJldHVybiBtX0FscGhhRmxhZyA9PSAxOyB9CisgIGJvb2wgSGFzQWxwaGEoKSBjb25zdCB7IHJldHVybiAhIShtX0FscGhhRmxhZyAmIDIpOyB9CisgIGJvb2wgSXNPcGFxdWVJbWFnZSgpIGNvbnN0IHsgcmV0dXJuICEobV9BbHBoYUZsYWcgJiAzKTsgfQorICBib29sIElzQ215a0ltYWdlKCkgY29uc3QgeyByZXR1cm4gISEobV9BbHBoYUZsYWcgJiA0KTsgfQorCisgIGludCBHZXRQYWxldHRlU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gSXNBbHBoYU1hc2soKSA/IDAgOiAobV9icHAgPT0gMSA/IDIgOiAobV9icHAgPT0gOCA/IDI1NiA6IDApKTsKKyAgfQorCisgIHVpbnQzMl90IEdldFBhbGV0dGVBcmdiKGludCBpbmRleCkgY29uc3Q7CisgIHZvaWQgU2V0UGFsZXR0ZUFyZ2IoaW50IGluZGV4LCB1aW50MzJfdCBjb2xvcik7CisKKyAgLy8gQ29waWVzIGludG8gaW50ZXJuYWxseS1vd25lZCBwYWxldHRlLgorICB2b2lkIFNldFBhbGV0dGUoY29uc3QgdWludDMyX3QqIHBTcmNQYWwpOworCisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IENsb25lKGNvbnN0IEZYX1JFQ1QqIHBDbGlwKSBjb25zdDsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gQ2xvbmVDb252ZXJ0KEZYRElCX0Zvcm1hdCBmb3JtYXQpOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBTdHJldGNoVG8oaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwKTsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gVHJhbnNmb3JtVG8oY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHRvcCk7CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IFN3YXBYWShib29sIGJYRmxpcCwgYm9vbCBiWUZsaXApIGNvbnN0OworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBGbGlwSW1hZ2UoYm9vbCBiWEZsaXAsIGJvb2wgYllGbGlwKSBjb25zdDsKKworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBDbG9uZUFscGhhTWFzaygpIGNvbnN0OworCisgIC8vIENvcGllcyBpbnRvIGludGVybmFsbHktb3duZWQgbWFzay4KKyAgYm9vbCBTZXRBbHBoYU1hc2soY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwQWxwaGFNYXNrLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcCk7CisKKyAgdm9pZCBHZXRPdmVybGFwUmVjdChpbnQmIGRlc3RfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQmIGRlc3RfdG9wLAorICAgICAgICAgICAgICAgICAgICAgIGludCYgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgaW50JiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQmIHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgIGludCYgc3JjX3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24pOworCisjaWYgZGVmaW5lZCBfU0tJQV9TVVBQT1JUXyB8fCBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfUEFUSFNfCisgIHZvaWQgRGVidWdWZXJpZnlCaXRtYXBJc1ByZU11bHRpcGxpZWQodm9pZCogYnVmZmVyKSBjb25zdDsKKyNlbmRpZgorCisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IG1fcEFscGhhTWFzazsKKworIHByb3RlY3RlZDoKKyAgQ0ZYX0RJQlNvdXJjZSgpOworCisgIHN0YXRpYyBib29sIENvbnZlcnRCdWZmZXIoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQzMl90LCBGeEZyZWVEZWxldGVyPiogcGFsKTsKKworICB2b2lkIEJ1aWxkUGFsZXR0ZSgpOworICBib29sIEJ1aWxkQWxwaGFNYXNrKCk7CisgIGludCBGaW5kUGFsZXR0ZSh1aW50MzJfdCBjb2xvcikgY29uc3Q7CisgIHZvaWQgR2V0UGFsZXR0ZSh1aW50MzJfdCogcGFsLCBpbnQgYWxwaGEpIGNvbnN0OworCisgIGludCBtX1dpZHRoOworICBpbnQgbV9IZWlnaHQ7CisgIGludCBtX2JwcDsKKyAgdWludDMyX3QgbV9BbHBoYUZsYWc7CisgIHVpbnQzMl90IG1fUGl0Y2g7CisgIC8vIFRPRE8od2VpbGkpOiBVc2Ugc3RkOjp2ZWN0b3IgZm9yIHRoaXMuCisgIHN0ZDo6dW5pcXVlX3B0cjx1aW50MzJfdCwgRnhGcmVlRGVsZXRlcj4gbV9wUGFsZXR0ZTsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWEdFX0RJQl9DRlhfRElCU09VUkNFX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZGliL2NmeF9maWx0ZXJlZGRpYi5jcHAgYi9jb3JlL2Z4Z2UvZGliL2NmeF9maWx0ZXJlZGRpYi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmYzgwNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9kaWIvY2Z4X2ZpbHRlcmVkZGliLmNwcApAQCAtMCwwICsxLDQyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9maWx0ZXJlZGRpYi5oIgorCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorCitDRlhfRmlsdGVyZWRESUI6OkNGWF9GaWx0ZXJlZERJQigpIHt9CisKK0NGWF9GaWx0ZXJlZERJQjo6fkNGWF9GaWx0ZXJlZERJQigpIHt9CisKK3ZvaWQgQ0ZYX0ZpbHRlcmVkRElCOjpMb2FkU3JjKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNyYykgeworICBtX3BTcmMgPSBwU3JjOworICBtX1dpZHRoID0gcFNyYy0+R2V0V2lkdGgoKTsKKyAgbV9IZWlnaHQgPSBwU3JjLT5HZXRIZWlnaHQoKTsKKyAgRlhESUJfRm9ybWF0IGZvcm1hdCA9IEdldERlc3RGb3JtYXQoKTsKKyAgbV9icHAgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihmb3JtYXQpOworICBtX0FscGhhRmxhZyA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGZvcm1hdCA+PiA4KTsKKyAgbV9QaXRjaCA9IChtX1dpZHRoICogKGZvcm1hdCAmIDB4ZmYpICsgMzEpIC8gMzIgKiA0OworICBtX3BQYWxldHRlLnJlc2V0KEdldERlc3RQYWxldHRlKCkpOworICBtX1NjYW5saW5lLnJlc2l6ZShtX1BpdGNoKTsKK30KKworY29uc3QgdWludDhfdCogQ0ZYX0ZpbHRlcmVkRElCOjpHZXRTY2FubGluZShpbnQgbGluZSkgY29uc3QgeworICBUcmFuc2xhdGVTY2FubGluZShtX3BTcmMtPkdldFNjYW5saW5lKGxpbmUpLCAmbV9TY2FubGluZSk7CisgIHJldHVybiBtX1NjYW5saW5lLmRhdGEoKTsKK30KKwordm9pZCBDRlhfRmlsdGVyZWRESUI6OkRvd25TYW1wbGVTY2FubGluZShpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9icHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGbGlwWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfd2lkdGgpIGNvbnN0IHsKKyAgbV9wU3JjLT5Eb3duU2FtcGxlU2NhbmxpbmUobGluZSwgZGVzdF9zY2FuLCBkZXN0X2JwcCwgZGVzdF93aWR0aCwgYkZsaXBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX2xlZnQsIGNsaXBfd2lkdGgpOworICBUcmFuc2xhdGVEb3duU2FtcGxlcyhkZXN0X3NjYW4sIGRlc3Rfc2NhbiwgY2xpcF93aWR0aCwgZGVzdF9icHApOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2RpYi9jZnhfZmlsdGVyZWRkaWIuaCBiL2NvcmUvZnhnZS9kaWIvY2Z4X2ZpbHRlcmVkZGliLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk5OGM3MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9kaWIvY2Z4X2ZpbHRlcmVkZGliLmgKQEAgLTAsMCArMSw1MCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhHRV9ESUJfQ0ZYX0ZJTFRFUkVERElCX0hfCisjZGVmaW5lIENPUkVfRlhHRV9ESUJfQ0ZYX0ZJTFRFUkVERElCX0hfCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9kaWJzb3VyY2UuaCIKKworY2xhc3MgQ0ZYX0ZpbHRlcmVkRElCIDogcHVibGljIENGWF9ESUJTb3VyY2UgeworIHB1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3M+CisgIGZyaWVuZCBSZXRhaW5QdHI8VD4gcGRmaXVtOjpNYWtlUmV0YWluKEFyZ3MmJi4uLiBhcmdzKTsKKworICB+Q0ZYX0ZpbHRlcmVkRElCKCkgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCBGWERJQl9Gb3JtYXQgR2V0RGVzdEZvcm1hdCgpID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCogR2V0RGVzdFBhbGV0dGUoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBUcmFuc2xhdGVTY2FubGluZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGRlc3RfYnVmKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBUcmFuc2xhdGVEb3duU2FtcGxlcyh1aW50OF90KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCkgY29uc3QgPSAwOworCisgIHZvaWQgTG9hZFNyYyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTcmMpOworCisgcHJvdGVjdGVkOgorICBDRlhfRmlsdGVyZWRESUIoKTsKKworICAvLyBDRlhfRElCU291cmNlCisgIGNvbnN0IHVpbnQ4X3QqIEdldFNjYW5saW5lKGludCBsaW5lKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBEb3duU2FtcGxlU2NhbmxpbmUoaW50IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfYnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmxpcFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3dpZHRoKSBjb25zdCBvdmVycmlkZTsKKworICBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4gbV9wU3JjOworICBtdXRhYmxlIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1fU2NhbmxpbmU7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhHRV9ESUJfQ0ZYX0ZJTFRFUkVERElCX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZGliL2NmeF9pbWFnZXJlbmRlcmVyLmNwcCBiL2NvcmUvZnhnZS9kaWIvY2Z4X2ltYWdlcmVuZGVyZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OGQzNjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Z2UvZGliL2NmeF9pbWFnZXJlbmRlcmVyLmNwcApAQCAtMCwwICsxLDEyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfaW1hZ2VyZW5kZXJlci5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9jbGlwcmduLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfaW1hZ2VzdHJldGNoZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9pbWFnZXRyYW5zZm9ybWVyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCitDRlhfSW1hZ2VSZW5kZXJlcjo6Q0ZYX0ltYWdlUmVuZGVyZXIoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hc2tfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkaWJfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmdiQnl0ZU9yZGVyKQorICAgIDogbV9wRGV2aWNlKHBEZXZpY2UpLAorICAgICAgbV9wQ2xpcFJnbihwQ2xpcFJnbiksCisgICAgICBtX01hdHJpeCgqcE1hdHJpeCksCisgICAgICBtX0JpdG1hcEFscGhhKGJpdG1hcF9hbHBoYSksCisgICAgICBtX0JsZW5kVHlwZShGWERJQl9CTEVORF9OT1JNQUwpLAorICAgICAgbV9iUmdiQnl0ZU9yZGVyKGJSZ2JCeXRlT3JkZXIpLAorICAgICAgbV9NYXNrQ29sb3IobWFza19jb2xvciksCisgICAgICBtX1N0YXR1cygwKSwKKyAgICAgIG1fQWxwaGFGbGFnKDApIHsKKyAgRlhfUkVDVCBpbWFnZV9yZWN0ID0gbV9NYXRyaXguR2V0VW5pdFJlY3QoKS5HZXRPdXRlclJlY3QoKTsKKyAgbV9DbGlwQm94ID0gcENsaXBSZ24gPyBwQ2xpcFJnbi0+R2V0Qm94KCkgOiBGWF9SRUNUKDAsIDAsIHBEZXZpY2UtPkdldFdpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5HZXRIZWlnaHQoKSk7CisgIG1fQ2xpcEJveC5JbnRlcnNlY3QoaW1hZ2VfcmVjdCk7CisgIGlmIChtX0NsaXBCb3guSXNFbXB0eSgpKQorICAgIHJldHVybjsKKworICBpZiAoKGZhYnMobV9NYXRyaXguYikgPj0gMC41ZiB8fCBtX01hdHJpeC5hID09IDApIHx8CisgICAgICAoZmFicyhtX01hdHJpeC5jKSA+PSAwLjVmIHx8IG1fTWF0cml4LmQgPT0gMCkpIHsKKyAgICBpZiAoZmFicyhtX01hdHJpeC5hKSA8IGZhYnMobV9NYXRyaXguYikgLyAyMCAmJgorICAgICAgICBmYWJzKG1fTWF0cml4LmQpIDwgZmFicyhtX01hdHJpeC5jKSAvIDIwICYmIGZhYnMobV9NYXRyaXguYSkgPCAwLjVmICYmCisgICAgICAgIGZhYnMobV9NYXRyaXguZCkgPCAwLjVmKSB7CisgICAgICBpbnQgZGVzdF93aWR0aCA9IGltYWdlX3JlY3QuV2lkdGgoKTsKKyAgICAgIGludCBkZXN0X2hlaWdodCA9IGltYWdlX3JlY3QuSGVpZ2h0KCk7CisgICAgICBGWF9SRUNUIGJpdG1hcF9jbGlwID0gbV9DbGlwQm94OworICAgICAgYml0bWFwX2NsaXAuT2Zmc2V0KC1pbWFnZV9yZWN0LmxlZnQsIC1pbWFnZV9yZWN0LnRvcCk7CisgICAgICBiaXRtYXBfY2xpcCA9IEZYRElCX1N3YXBDbGlwQm94KGJpdG1hcF9jbGlwLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9NYXRyaXguYyA+IDAsIG1fTWF0cml4LmIgPCAwKTsKKyAgICAgIG1fQ29tcG9zZXIuQ29tcG9zZShwRGV2aWNlLCBwQ2xpcFJnbiwgYml0bWFwX2FscGhhLCBtYXNrX2NvbG9yLCBtX0NsaXBCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgbV9NYXRyaXguYyA+IDAsIG1fTWF0cml4LmIgPCAwLCBtX2JSZ2JCeXRlT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbV9CbGVuZFR5cGUpOworICAgICAgbV9TdHJldGNoZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0ltYWdlU3RyZXRjaGVyPigKKyAgICAgICAgICAmbV9Db21wb3NlciwgcFNvdXJjZSwgZGVzdF9oZWlnaHQsIGRlc3Rfd2lkdGgsIGJpdG1hcF9jbGlwLAorICAgICAgICAgIGRpYl9mbGFncyk7CisgICAgICBpZiAobV9TdHJldGNoZXItPlN0YXJ0KCkpCisgICAgICAgIG1fU3RhdHVzID0gMTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbV9TdGF0dXMgPSAyOworICAgIG1fcFRyYW5zZm9ybWVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9JbWFnZVRyYW5zZm9ybWVyPigKKyAgICAgICAgcFNvdXJjZSwgJm1fTWF0cml4LCBkaWJfZmxhZ3MsICZtX0NsaXBCb3gpOworICAgIHJldHVybjsKKyAgfQorCisgIGludCBkZXN0X3dpZHRoID0gaW1hZ2VfcmVjdC5XaWR0aCgpOworICBpZiAobV9NYXRyaXguYSA8IDApCisgICAgZGVzdF93aWR0aCA9IC1kZXN0X3dpZHRoOworCisgIGludCBkZXN0X2hlaWdodCA9IGltYWdlX3JlY3QuSGVpZ2h0KCk7CisgIGlmIChtX01hdHJpeC5kID4gMCkKKyAgICBkZXN0X2hlaWdodCA9IC1kZXN0X2hlaWdodDsKKworICBpZiAoZGVzdF93aWR0aCA9PSAwIHx8IGRlc3RfaGVpZ2h0ID09IDApCisgICAgcmV0dXJuOworCisgIEZYX1JFQ1QgYml0bWFwX2NsaXAgPSBtX0NsaXBCb3g7CisgIGJpdG1hcF9jbGlwLk9mZnNldCgtaW1hZ2VfcmVjdC5sZWZ0LCAtaW1hZ2VfcmVjdC50b3ApOworICBtX0NvbXBvc2VyLkNvbXBvc2UocERldmljZSwgcENsaXBSZ24sIGJpdG1hcF9hbHBoYSwgbWFza19jb2xvciwgbV9DbGlwQm94LAorICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSwgbV9iUmdiQnl0ZU9yZGVyLCAwLCBtX0JsZW5kVHlwZSk7CisgIG1fU3RhdHVzID0gMTsKKyAgbV9TdHJldGNoZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0ltYWdlU3RyZXRjaGVyPigKKyAgICAgICZtX0NvbXBvc2VyLCBwU291cmNlLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgYml0bWFwX2NsaXAsIGRpYl9mbGFncyk7CisgIG1fU3RyZXRjaGVyLT5TdGFydCgpOworfQorCitDRlhfSW1hZ2VSZW5kZXJlcjo6fkNGWF9JbWFnZVJlbmRlcmVyKCkge30KKworYm9vbCBDRlhfSW1hZ2VSZW5kZXJlcjo6Q29udGludWUoSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpIHsKKyAgaWYgKG1fU3RhdHVzID09IDEpCisgICAgcmV0dXJuIG1fU3RyZXRjaGVyLT5Db250aW51ZShwUGF1c2UpOworICBpZiAobV9TdGF0dXMgIT0gMikKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChtX3BUcmFuc2Zvcm1lci0+Q29udGludWUocFBhdXNlKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwQml0bWFwID0gbV9wVHJhbnNmb3JtZXItPkRldGFjaEJpdG1hcCgpOworICBpZiAoIXBCaXRtYXAgfHwgIXBCaXRtYXAtPkdldEJ1ZmZlcigpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAocEJpdG1hcC0+SXNBbHBoYU1hc2soKSkgeworICAgIGlmIChtX0JpdG1hcEFscGhhICE9IDI1NSkgeworICAgICAgaWYgKG1fQWxwaGFGbGFnID4+IDgpIHsKKyAgICAgICAgbV9BbHBoYUZsYWcgPSAoKCh1aW50OF90KSgobV9BbHBoYUZsYWcgJiAweGZmKSAqIG1fQml0bWFwQWxwaGEgLyAyNTUpKSB8CisgICAgICAgICAgICAgICAgICAgICAgICgobV9BbHBoYUZsYWcgPj4gOCkgPDwgOCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbV9NYXNrQ29sb3IgPSBGWEFSR0JfTVVMX0FMUEhBKG1fTWFza0NvbG9yLCBtX0JpdG1hcEFscGhhKTsKKyAgICAgIH0KKyAgICB9CisgICAgbV9wRGV2aWNlLT5Db21wb3NpdGVNYXNrKAorICAgICAgICBtX3BUcmFuc2Zvcm1lci0+cmVzdWx0KCkubGVmdCwgbV9wVHJhbnNmb3JtZXItPnJlc3VsdCgpLnRvcCwKKyAgICAgICAgcEJpdG1hcC0+R2V0V2lkdGgoKSwgcEJpdG1hcC0+R2V0SGVpZ2h0KCksIHBCaXRtYXAsIG1fTWFza0NvbG9yLCAwLCAwLAorICAgICAgICBtX0JsZW5kVHlwZSwgbV9wQ2xpcFJnbi5HZXQoKSwgbV9iUmdiQnl0ZU9yZGVyLCBtX0FscGhhRmxhZyk7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fQml0bWFwQWxwaGEgIT0gMjU1KQorICAgICAgcEJpdG1hcC0+TXVsdGlwbHlBbHBoYShtX0JpdG1hcEFscGhhKTsKKyAgICBtX3BEZXZpY2UtPkNvbXBvc2l0ZUJpdG1hcCgKKyAgICAgICAgbV9wVHJhbnNmb3JtZXItPnJlc3VsdCgpLmxlZnQsIG1fcFRyYW5zZm9ybWVyLT5yZXN1bHQoKS50b3AsCisgICAgICAgIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpLCBwQml0bWFwLCAwLCAwLCBtX0JsZW5kVHlwZSwKKyAgICAgICAgbV9wQ2xpcFJnbi5HZXQoKSwgbV9iUmdiQnl0ZU9yZGVyKTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZGliL2NmeF9pbWFnZXJlbmRlcmVyLmggYi9jb3JlL2Z4Z2UvZGliL2NmeF9pbWFnZXJlbmRlcmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThhNTZlMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9kaWIvY2Z4X2ltYWdlcmVuZGVyZXIuaApAQCAtMCwwICsxLDU0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWEdFX0RJQl9DRlhfSU1BR0VSRU5ERVJFUl9IXworI2RlZmluZSBDT1JFX0ZYR0VfRElCX0NGWF9JTUFHRVJFTkRFUkVSX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2JpdG1hcGNvbXBvc2VyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfZGliaXRtYXAuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9kaWJzb3VyY2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorCitjbGFzcyBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjsKK2NsYXNzIENGWF9JbWFnZVN0cmV0Y2hlcjsKKworY2xhc3MgQ0ZYX0ltYWdlUmVuZGVyZXIgeworIHB1YmxpYzoKKyAgQ0ZYX0ltYWdlUmVuZGVyZXIoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXNrX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkaWJfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJnYkJ5dGVPcmRlcik7CisgIH5DRlhfSW1hZ2VSZW5kZXJlcigpOworCisgIGJvb2wgQ29udGludWUoSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpOworCisgcHJpdmF0ZToKKyAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gbV9wRGV2aWNlOworICBjb25zdCBVbm93bmVkUHRyPGNvbnN0IENGWF9DbGlwUmduPiBtX3BDbGlwUmduOworICBjb25zdCBDRlhfTWF0cml4IG1fTWF0cml4OworICBjb25zdCBpbnQgbV9CaXRtYXBBbHBoYTsKKyAgY29uc3QgaW50IG1fQmxlbmRUeXBlOworICBjb25zdCBib29sIG1fYlJnYkJ5dGVPcmRlcjsKKyAgdWludDMyX3QgbV9NYXNrQ29sb3I7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfSW1hZ2VUcmFuc2Zvcm1lcj4gbV9wVHJhbnNmb3JtZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfSW1hZ2VTdHJldGNoZXI+IG1fU3RyZXRjaGVyOworICBDRlhfQml0bWFwQ29tcG9zZXIgbV9Db21wb3NlcjsKKyAgaW50IG1fU3RhdHVzOworICBGWF9SRUNUIG1fQ2xpcEJveDsKKyAgaW50IG1fQWxwaGFGbGFnOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYR0VfRElCX0NGWF9JTUFHRVJFTkRFUkVSX0hfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZGliL2NmeF9pbWFnZXN0cmV0Y2hlci5jcHAgYi9jb3JlL2Z4Z2UvZGliL2NmeF9pbWFnZXN0cmV0Y2hlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1MThjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9kaWIvY2Z4X2ltYWdlc3RyZXRjaGVyLmNwcApAQCAtMCwwICsxLDIwOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfaW1hZ2VzdHJldGNoZXIuaCIKKworI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8dHVwbGU+CisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9kaWJpdG1hcC5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2RpYnNvdXJjZS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY3N0cmV0Y2hlbmdpbmUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBpbnQga01heFByb2dyZXNzaXZlU3RyZXRjaFBpeGVscyA9IDEwMDAwMDA7CisKK2Jvb2wgU291cmNlU2l6ZVdpdGhpbkxpbWl0KGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICByZXR1cm4gIWhlaWdodCB8fCB3aWR0aCA8IGtNYXhQcm9ncmVzc2l2ZVN0cmV0Y2hQaXhlbHMgLyBoZWlnaHQ7Cit9CisKK0ZYRElCX0Zvcm1hdCBHZXRTdHJldGNoZWRGb3JtYXQoY29uc3QgQ0ZYX0RJQlNvdXJjZSYgc3JjKSB7CisgIEZYRElCX0Zvcm1hdCBmb3JtYXQgPSBzcmMuR2V0Rm9ybWF0KCk7CisgIGlmIChmb3JtYXQgPT0gRlhESUJfMWJwcE1hc2spCisgICAgcmV0dXJuIEZYRElCXzhicHBNYXNrOworICBpZiAoZm9ybWF0ID09IEZYRElCXzFicHBSZ2IpCisgICAgcmV0dXJuIEZYRElCXzhicHBSZ2I7CisgIGlmIChmb3JtYXQgPT0gRlhESUJfOGJwcFJnYiAmJiBzcmMuR2V0UGFsZXR0ZSgpKQorICAgIHJldHVybiBGWERJQl9SZ2I7CisgIHJldHVybiBmb3JtYXQ7Cit9CisKKy8vIFJldHVybnMgdHVwbGUgYywgbSwgeSwgaworc3RkOjp0dXBsZTxpbnQsIGludCwgaW50LCBpbnQ+IENteWtEZWNvZGUoY29uc3QgdWludDMyX3QgY215aykgeworICByZXR1cm4gc3RkOjptYWtlX3R1cGxlKEZYU1lTX0dldENWYWx1ZShjbXlrKSwgRlhTWVNfR2V0TVZhbHVlKGNteWspLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldFlWYWx1ZShjbXlrKSwgRlhTWVNfR2V0S1ZhbHVlKGNteWspKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0NGWF9JbWFnZVN0cmV0Y2hlcjo6Q0ZYX0ltYWdlU3RyZXRjaGVyKElGWF9TY2FubGluZUNvbXBvc2VyKiBwRGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCYgYml0bWFwX3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncykKKyAgICA6IG1fcERlc3QocERlc3QpLAorICAgICAgbV9wU291cmNlKHBTb3VyY2UpLAorICAgICAgbV9GbGFncyhmbGFncyksCisgICAgICBtX2JGbGlwWChmYWxzZSksCisgICAgICBtX2JGbGlwWShmYWxzZSksCisgICAgICBtX0Rlc3RXaWR0aChkZXN0X3dpZHRoKSwKKyAgICAgIG1fRGVzdEhlaWdodChkZXN0X2hlaWdodCksCisgICAgICBtX0NsaXBSZWN0KGJpdG1hcF9yZWN0KSwKKyAgICAgIG1fRGVzdEZvcm1hdChHZXRTdHJldGNoZWRGb3JtYXQoKnBTb3VyY2UpKSwKKyAgICAgIG1fRGVzdEJQUChtX0Rlc3RGb3JtYXQgJiAweGZmKSwKKyAgICAgIG1fTGluZUluZGV4KDApIHt9CisKK0NGWF9JbWFnZVN0cmV0Y2hlcjo6fkNGWF9JbWFnZVN0cmV0Y2hlcigpIHt9CisKK2Jvb2wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpTdGFydCgpIHsKKyAgaWYgKG1fRGVzdFdpZHRoID09IDAgfHwgbV9EZXN0SGVpZ2h0ID09IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChtX3BTb3VyY2UtPkdldEZvcm1hdCgpID09IEZYRElCXzFicHBSZ2IgJiYgbV9wU291cmNlLT5HZXRQYWxldHRlKCkpIHsKKyAgICBGWF9BUkdCIHBhbFsyNTZdOworICAgIGludCBhMDsKKyAgICBpbnQgcjA7CisgICAgaW50IGcwOworICAgIGludCBiMDsKKyAgICBzdGQ6OnRpZShhMCwgcjAsIGcwLCBiMCkgPSBBcmdiRGVjb2RlKG1fcFNvdXJjZS0+R2V0UGFsZXR0ZUFyZ2IoMCkpOworICAgIGludCBhMTsKKyAgICBpbnQgcjE7CisgICAgaW50IGcxOworICAgIGludCBiMTsKKyAgICBzdGQ6OnRpZShhMSwgcjEsIGcxLCBiMSkgPSBBcmdiRGVjb2RlKG1fcFNvdXJjZS0+R2V0UGFsZXR0ZUFyZ2IoMSkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgIGludCBhID0gYTAgKyAoYTEgLSBhMCkgKiBpIC8gMjU1OworICAgICAgaW50IHIgPSByMCArIChyMSAtIHIwKSAqIGkgLyAyNTU7CisgICAgICBpbnQgZyA9IGcwICsgKGcxIC0gZzApICogaSAvIDI1NTsKKyAgICAgIGludCBiID0gYjAgKyAoYjEgLSBiMCkgKiBpIC8gMjU1OworICAgICAgcGFsW2ldID0gQXJnYkVuY29kZShhLCByLCBnLCBiKTsKKyAgICB9CisgICAgaWYgKCFtX3BEZXN0LT5TZXRJbmZvKG1fQ2xpcFJlY3QuV2lkdGgoKSwgbV9DbGlwUmVjdC5IZWlnaHQoKSwgbV9EZXN0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYWwpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGVsc2UgaWYgKG1fcFNvdXJjZS0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfMWJwcENteWsgJiYKKyAgICAgICAgICAgICBtX3BTb3VyY2UtPkdldFBhbGV0dGUoKSkgeworICAgIEZYX0NNWUsgcGFsWzI1Nl07CisgICAgaW50IGMwOworICAgIGludCBtMDsKKyAgICBpbnQgeTA7CisgICAgaW50IGswOworICAgIHN0ZDo6dGllKGMwLCBtMCwgeTAsIGswKSA9IENteWtEZWNvZGUobV9wU291cmNlLT5HZXRQYWxldHRlQXJnYigwKSk7CisgICAgaW50IGMxOworICAgIGludCBtMTsKKyAgICBpbnQgeTE7CisgICAgaW50IGsxOworICAgIHN0ZDo6dGllKGMxLCBtMSwgeTEsIGsxKSA9IENteWtEZWNvZGUobV9wU291cmNlLT5HZXRQYWxldHRlQXJnYigxKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7ICsraSkgeworICAgICAgaW50IGMgPSBjMCArIChjMSAtIGMwKSAqIGkgLyAyNTU7CisgICAgICBpbnQgbSA9IG0wICsgKG0xIC0gbTApICogaSAvIDI1NTsKKyAgICAgIGludCB5ID0geTAgKyAoeTEgLSB5MCkgKiBpIC8gMjU1OworICAgICAgaW50IGsgPSBrMCArIChrMSAtIGswKSAqIGkgLyAyNTU7CisgICAgICBwYWxbaV0gPSBDbXlrRW5jb2RlKGMsIG0sIHksIGspOworICAgIH0KKyAgICBpZiAoIW1fcERlc3QtPlNldEluZm8obV9DbGlwUmVjdC5XaWR0aCgpLCBtX0NsaXBSZWN0LkhlaWdodCgpLCBtX0Rlc3RGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBhbCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSBpZiAoIW1fcERlc3QtPlNldEluZm8obV9DbGlwUmVjdC5XaWR0aCgpLCBtX0NsaXBSZWN0LkhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fRGVzdEZvcm1hdCwgbnVsbHB0cikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAobV9GbGFncyAmIEZYRElCX0RPV05TQU1QTEUpCisgICAgcmV0dXJuIFN0YXJ0UXVpY2tTdHJldGNoKCk7CisKKyAgcmV0dXJuIFN0YXJ0U3RyZXRjaCgpOworfQorCitib29sIENGWF9JbWFnZVN0cmV0Y2hlcjo6Q29udGludWUoSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpIHsKKyAgaWYgKG1fRmxhZ3MgJiBGWERJQl9ET1dOU0FNUExFKQorICAgIHJldHVybiBDb250aW51ZVF1aWNrU3RyZXRjaChwUGF1c2UpOworICByZXR1cm4gQ29udGludWVTdHJldGNoKHBQYXVzZSk7Cit9CisKK2Jvb2wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpTdGFydFN0cmV0Y2goKSB7CisgIG1fcFN0cmV0Y2hFbmdpbmUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1N0cmV0Y2hFbmdpbmU+KAorICAgICAgbV9wRGVzdC5HZXQoKSwgbV9EZXN0Rm9ybWF0LCBtX0Rlc3RXaWR0aCwgbV9EZXN0SGVpZ2h0LCBtX0NsaXBSZWN0LAorICAgICAgbV9wU291cmNlLCBtX0ZsYWdzKTsKKyAgbV9wU3RyZXRjaEVuZ2luZS0+U3RhcnRTdHJldGNoSG9yeigpOworICBpZiAoU291cmNlU2l6ZVdpdGhpbkxpbWl0KG1fcFNvdXJjZS0+R2V0V2lkdGgoKSwgbV9wU291cmNlLT5HZXRIZWlnaHQoKSkpIHsKKyAgICBtX3BTdHJldGNoRW5naW5lLT5Db250aW51ZShudWxscHRyKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpDb250aW51ZVN0cmV0Y2goSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpIHsKKyAgcmV0dXJuIG1fcFN0cmV0Y2hFbmdpbmUgJiYgbV9wU3RyZXRjaEVuZ2luZS0+Q29udGludWUocFBhdXNlKTsKK30KKworYm9vbCBDRlhfSW1hZ2VTdHJldGNoZXI6OlN0YXJ0UXVpY2tTdHJldGNoKCkgeworICBpZiAobV9EZXN0V2lkdGggPCAwKSB7CisgICAgbV9iRmxpcFggPSB0cnVlOworICAgIG1fRGVzdFdpZHRoID0gLW1fRGVzdFdpZHRoOworICB9CisgIGlmIChtX0Rlc3RIZWlnaHQgPCAwKSB7CisgICAgbV9iRmxpcFkgPSB0cnVlOworICAgIG1fRGVzdEhlaWdodCA9IC1tX0Rlc3RIZWlnaHQ7CisgIH0KKyAgdWludDMyX3Qgc2l6ZSA9IG1fQ2xpcFJlY3QuV2lkdGgoKTsKKyAgaWYgKHNpemUgJiYgbV9EZXN0QlBQID4gc3RhdGljX2Nhc3Q8aW50PihJTlRfTUFYIC8gc2l6ZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHNpemUgKj0gbV9EZXN0QlBQOworICBtX3BTY2FubGluZS5yZXNldChGWF9BbGxvYyh1aW50OF90LCAoc2l6ZSAvIDggKyAzKSAvIDQgKiA0KSk7CisgIGlmIChtX3BTb3VyY2UtPm1fcEFscGhhTWFzaykKKyAgICBtX3BNYXNrU2NhbmxpbmUucmVzZXQoRlhfQWxsb2ModWludDhfdCwgKG1fQ2xpcFJlY3QuV2lkdGgoKSArIDMpIC8gNCAqIDQpKTsKKworICBpZiAoU291cmNlU2l6ZVdpdGhpbkxpbWl0KG1fcFNvdXJjZS0+R2V0V2lkdGgoKSwgbV9wU291cmNlLT5HZXRIZWlnaHQoKSkpIHsKKyAgICBDb250aW51ZVF1aWNrU3RyZXRjaChudWxscHRyKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpDb250aW51ZVF1aWNrU3RyZXRjaChJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSkgeworICBpZiAoIW1fcFNjYW5saW5lKQorICAgIHJldHVybiBmYWxzZTsKKworICBpbnQgcmVzdWx0X3dpZHRoID0gbV9DbGlwUmVjdC5XaWR0aCgpOworICBpbnQgcmVzdWx0X2hlaWdodCA9IG1fQ2xpcFJlY3QuSGVpZ2h0KCk7CisgIGludCBzcmNfaGVpZ2h0ID0gbV9wU291cmNlLT5HZXRIZWlnaHQoKTsKKyAgZm9yICg7IG1fTGluZUluZGV4IDwgcmVzdWx0X2hlaWdodDsgKyttX0xpbmVJbmRleCkgeworICAgIGludCBkZXN0X3k7CisgICAgaW50IHNyY195OworICAgIGlmIChtX2JGbGlwWSkgeworICAgICAgZGVzdF95ID0gcmVzdWx0X2hlaWdodCAtIG1fTGluZUluZGV4IC0gMTsKKyAgICAgIHNyY195ID0gKG1fRGVzdEhlaWdodCAtIChkZXN0X3kgKyBtX0NsaXBSZWN0LnRvcCkgLSAxKSAqIHNyY19oZWlnaHQgLworICAgICAgICAgICAgICBtX0Rlc3RIZWlnaHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGRlc3RfeSA9IG1fTGluZUluZGV4OworICAgICAgc3JjX3kgPSAoZGVzdF95ICsgbV9DbGlwUmVjdC50b3ApICogc3JjX2hlaWdodCAvIG1fRGVzdEhlaWdodDsKKyAgICB9CisgICAgc3JjX3kgPSBwZGZpdW06OmNsYW1wKHNyY195LCAwLCBzcmNfaGVpZ2h0IC0gMSk7CisKKyAgICBpZiAobV9wU291cmNlLT5Ta2lwVG9TY2FubGluZShzcmNfeSwgcFBhdXNlKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgbV9wU291cmNlLT5Eb3duU2FtcGxlU2NhbmxpbmUoc3JjX3ksIG1fcFNjYW5saW5lLmdldCgpLCBtX0Rlc3RCUFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9EZXN0V2lkdGgsIG1fYkZsaXBYLCBtX0NsaXBSZWN0LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X3dpZHRoKTsKKyAgICBpZiAobV9wTWFza1NjYW5saW5lKSB7CisgICAgICBtX3BTb3VyY2UtPm1fcEFscGhhTWFzay0+RG93blNhbXBsZVNjYW5saW5lKAorICAgICAgICAgIHNyY195LCBtX3BNYXNrU2NhbmxpbmUuZ2V0KCksIDEsIG1fRGVzdFdpZHRoLCBtX2JGbGlwWCwKKyAgICAgICAgICBtX0NsaXBSZWN0LmxlZnQsIHJlc3VsdF93aWR0aCk7CisgICAgfQorICAgIG1fcERlc3QtPkNvbXBvc2VTY2FubGluZShkZXN0X3ksIG1fcFNjYW5saW5lLmdldCgpLCBtX3BNYXNrU2NhbmxpbmUuZ2V0KCkpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9kaWIvY2Z4X2ltYWdlc3RyZXRjaGVyLmggYi9jb3JlL2Z4Z2UvZGliL2NmeF9pbWFnZXN0cmV0Y2hlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlY2IyYTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Z2UvZGliL2NmeF9pbWFnZXN0cmV0Y2hlci5oCkBAIC0wLDAgKzEsNTkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBDT1JFX0ZYR0VfRElCX0NGWF9JTUFHRVNUUkVUQ0hFUl9IXworI2RlZmluZSBDT1JFX0ZYR0VfRElCX0NGWF9JTUFHRVNUUkVUQ0hFUl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvaWZ4X3NjYW5saW5lY29tcG9zZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCisKK2NsYXNzIENGWF9ESUJTb3VyY2U7CitjbGFzcyBJRlhfUGF1c2VJbmRpY2F0b3I7CisKK2NsYXNzIENGWF9JbWFnZVN0cmV0Y2hlciB7CisgcHVibGljOgorICBDRlhfSW1hZ2VTdHJldGNoZXIoSUZYX1NjYW5saW5lQ29tcG9zZXIqIHBEZXN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUJiBiaXRtYXBfcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKKyAgfkNGWF9JbWFnZVN0cmV0Y2hlcigpOworCisgIGJvb2wgU3RhcnQoKTsKKyAgYm9vbCBDb250aW51ZShJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CisKKyAgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+IHNvdXJjZSgpIHsgcmV0dXJuIG1fcFNvdXJjZTsgfQorCisgcHJpdmF0ZToKKyAgYm9vbCBTdGFydFF1aWNrU3RyZXRjaCgpOworICBib29sIFN0YXJ0U3RyZXRjaCgpOworICBib29sIENvbnRpbnVlUXVpY2tTdHJldGNoKElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKTsKKyAgYm9vbCBDb250aW51ZVN0cmV0Y2goSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpOworCisgIFVub3duZWRQdHI8SUZYX1NjYW5saW5lQ29tcG9zZXI+IGNvbnN0IG1fcERlc3Q7CisgIFJldGFpblB0cjxDRlhfRElCU291cmNlPiBtX3BTb3VyY2U7CisgIHN0ZDo6dW5pcXVlX3B0cjxDU3RyZXRjaEVuZ2luZT4gbV9wU3RyZXRjaEVuZ2luZTsKKyAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IG1fcFNjYW5saW5lOworICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4gbV9wTWFza1NjYW5saW5lOworICBjb25zdCB1aW50MzJfdCBtX0ZsYWdzOworICBib29sIG1fYkZsaXBYOworICBib29sIG1fYkZsaXBZOworICBpbnQgbV9EZXN0V2lkdGg7CisgIGludCBtX0Rlc3RIZWlnaHQ7CisgIEZYX1JFQ1QgbV9DbGlwUmVjdDsKKyAgY29uc3QgRlhESUJfRm9ybWF0IG1fRGVzdEZvcm1hdDsKKyAgY29uc3QgaW50IG1fRGVzdEJQUDsKKyAgaW50IG1fTGluZUluZGV4OworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYR0VfRElCX0NGWF9JTUFHRVNUUkVUQ0hFUl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2RpYi9jZnhfaW1hZ2V0cmFuc2Zvcm1lci5jcHAgYi9jb3JlL2Z4Z2UvZGliL2NmeF9pbWFnZXRyYW5zZm9ybWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTAxMTI3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGdlL2RpYi9jZnhfaW1hZ2V0cmFuc2Zvcm1lci5jcHAKQEAgLTAsMCArMSw1NTcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2ltYWdldHJhbnNmb3JtZXIuaCIKKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfaW1hZ2VzdHJldGNoZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX2NvbnZlcnNpb25zLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgaW50IGtCYXNlID0gMjU2OworY29uc3RleHByIGZsb2F0IGtGaXgxNiA9IDAuMDVmOworY29uc3RleHByIHVpbnQ4X3Qga09wYXF1ZUFscGhhID0gMHhmZjsKKwordWludDhfdCBiaWxpbmVhcl9pbnRlcnBvbChjb25zdCB1aW50OF90KiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dfb2Zmc2V0X2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dfb2Zmc2V0X3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfY29sX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfY29sX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXNfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc195LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY19vZmZzZXQpIHsKKyAgaW50IGlfcmVzeCA9IDI1NSAtIHJlc194OworICBpbnQgY29sX2JwcF9sID0gc3JjX2NvbF9sICogYnBwOworICBpbnQgY29sX2JwcF9yID0gc3JjX2NvbF9yICogYnBwOworICBjb25zdCB1aW50OF90KiBidWZfdSA9IGJ1ZiArIHJvd19vZmZzZXRfbCArIGNfb2Zmc2V0OworICBjb25zdCB1aW50OF90KiBidWZfZCA9IGJ1ZiArIHJvd19vZmZzZXRfciArIGNfb2Zmc2V0OworICBjb25zdCB1aW50OF90KiBzcmNfcG9zMCA9IGJ1Zl91ICsgY29sX2JwcF9sOworICBjb25zdCB1aW50OF90KiBzcmNfcG9zMSA9IGJ1Zl91ICsgY29sX2JwcF9yOworICBjb25zdCB1aW50OF90KiBzcmNfcG9zMiA9IGJ1Zl9kICsgY29sX2JwcF9sOworICBjb25zdCB1aW50OF90KiBzcmNfcG9zMyA9IGJ1Zl9kICsgY29sX2JwcF9yOworICB1aW50OF90IHJfcG9zXzAgPSAoKnNyY19wb3MwICogaV9yZXN4ICsgKnNyY19wb3MxICogcmVzX3gpID4+IDg7CisgIHVpbnQ4X3Qgcl9wb3NfMSA9ICgqc3JjX3BvczIgKiBpX3Jlc3ggKyAqc3JjX3BvczMgKiByZXNfeCkgPj4gODsKKyAgcmV0dXJuIChyX3Bvc18wICogKDI1NSAtIHJlc195KSArIHJfcG9zXzEgKiByZXNfeSkgPj4gODsKK30KKwordWludDhfdCBiaWN1YmljX2ludGVycG9sKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwaXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcG9zX3BpeGVsW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHVfd1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB2X3dbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc195LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBicHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNfb2Zmc2V0KSB7CisgIGludCBzX3Jlc3VsdCA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgaW50IGFfcmVzdWx0ID0gMDsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7IGorKykgeworICAgICAgdWludDhfdCB2YWwgPQorICAgICAgICAgICooYnVmICsgcG9zX3BpeGVsW2kgKyA0XSAqIHBpdGNoICsgcG9zX3BpeGVsW2pdICogYnBwICsgY19vZmZzZXQpOworICAgICAgYV9yZXN1bHQgKz0gdV93W2pdICogdmFsOworICAgIH0KKyAgICBzX3Jlc3VsdCArPSBhX3Jlc3VsdCAqIHZfd1tpXTsKKyAgfQorICBzX3Jlc3VsdCA+Pj0gMTY7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50OF90PihwZGZpdW06OmNsYW1wKHNfcmVzdWx0LCAwLCAyNTUpKTsKK30KKwordm9pZCBiaWN1YmljX2dldF9wb3Nfd2VpZ2h0KGludCBwb3NfcGl4ZWxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdV93W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZfd1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfY29sX2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19yb3dfbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc195LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJldGNoX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJldGNoX2hlaWdodCkgeworICBwb3NfcGl4ZWxbMF0gPSBzcmNfY29sX2wgLSAxOworICBwb3NfcGl4ZWxbMV0gPSBzcmNfY29sX2w7CisgIHBvc19waXhlbFsyXSA9IHNyY19jb2xfbCArIDE7CisgIHBvc19waXhlbFszXSA9IHNyY19jb2xfbCArIDI7CisgIHBvc19waXhlbFs0XSA9IHNyY19yb3dfbCAtIDE7CisgIHBvc19waXhlbFs1XSA9IHNyY19yb3dfbDsKKyAgcG9zX3BpeGVsWzZdID0gc3JjX3Jvd19sICsgMTsKKyAgcG9zX3BpeGVsWzddID0gc3JjX3Jvd19sICsgMjsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICBwb3NfcGl4ZWxbaV0gPSBwZGZpdW06OmNsYW1wKHBvc19waXhlbFtpXSwgMCwgc3RyZXRjaF93aWR0aCAtIDEpOworICAgIHBvc19waXhlbFtpICsgNF0gPSBwZGZpdW06OmNsYW1wKHBvc19waXhlbFtpICsgNF0sIDAsIHN0cmV0Y2hfaGVpZ2h0IC0gMSk7CisgIH0KKyAgdV93WzBdID0gU0RQX1RhYmxlWzI1NiArIHJlc194XTsKKyAgdV93WzFdID0gU0RQX1RhYmxlW3Jlc194XTsKKyAgdV93WzJdID0gU0RQX1RhYmxlWzI1NiAtIHJlc194XTsKKyAgdV93WzNdID0gU0RQX1RhYmxlWzUxMiAtIHJlc194XTsKKyAgdl93WzBdID0gU0RQX1RhYmxlWzI1NiArIHJlc195XTsKKyAgdl93WzFdID0gU0RQX1RhYmxlW3Jlc195XTsKKyAgdl93WzJdID0gU0RQX1RhYmxlWzI1NiAtIHJlc195XTsKKyAgdl93WzNdID0gU0RQX1RhYmxlWzUxMiAtIHJlc195XTsKK30KKworRlhESUJfRm9ybWF0IEdldFRyYW5zZm9ybWVkRm9ybWF0KGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcERyYykgeworICBpZiAocERyYy0+SXNBbHBoYU1hc2soKSkKKyAgICByZXR1cm4gRlhESUJfOGJwcE1hc2s7CisKKyAgRlhESUJfRm9ybWF0IGZvcm1hdCA9IHBEcmMtPkdldEZvcm1hdCgpOworICBpZiAoZm9ybWF0ID49IDEwMjUpCisgICAgcmV0dXJuIEZYRElCX0NteWthOworICBpZiAoZm9ybWF0IDw9IDMyIHx8IGZvcm1hdCA9PSBGWERJQl9BcmdiKQorICAgIHJldHVybiBGWERJQl9BcmdiOworICByZXR1cm4gRlhESUJfUmdiYTsKK30KKworYm9vbCBOZWVkQWxwaGEoYm9vbCBiSGFzQWxwaGEsIEZYRElCX0Zvcm1hdCBmb3JtYXQpIHsKKyAgcmV0dXJuIGJIYXNBbHBoYSB8fCBmb3JtYXQgPT0gRlhESUJfQ215a2E7Cit9CisKK3ZvaWQgV3JpdGVNb25vUmVzdWx0KHVpbnQzMl90IHJfYmdyYV9jbXlrLCBGWERJQl9Gb3JtYXQgZm9ybWF0LCB1aW50OF90KiBkZXN0KSB7CisgIGlmIChmb3JtYXQgPT0gRlhESUJfUmdiYSkgeworICAgIGRlc3RbMF0gPSBzdGF0aWNfY2FzdDx1aW50OF90PihyX2JncmFfY215ayA+PiAyNCk7CisgICAgZGVzdFsxXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJfYmdyYV9jbXlrID4+IDE2KTsKKyAgICBkZXN0WzJdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4ocl9iZ3JhX2NteWsgPj4gOCk7CisgIH0gZWxzZSB7CisgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPihkZXN0KSA9IHJfYmdyYV9jbXlrOworICB9Cit9CisKK3ZvaWQgV3JpdGVDb2xvclJlc3VsdChzdGQ6OmZ1bmN0aW9uPHVpbnQ4X3QoaW50IG9mZnNldCk+IGZ1bmMsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSGFzQWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgRlhESUJfRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0KSB7CisgIHVpbnQ4X3QgYmx1ZV9jID0gZnVuYygwKTsKKyAgdWludDhfdCBncmVlbl9tID0gZnVuYygxKTsKKyAgdWludDhfdCByZWRfeSA9IGZ1bmMoMik7CisgIHVpbnQ4X3QgYWxwaGFfayA9IE5lZWRBbHBoYShiSGFzQWxwaGEsIGZvcm1hdCkgPyBmdW5jKDMpIDoga09wYXF1ZUFscGhhOworCisgIHVpbnQzMl90KiBkZXN0MzIgPSByZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oZGVzdCk7CisgIGlmIChiSGFzQWxwaGEpIHsKKyAgICBpZiAoZm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKKyAgICAgICpkZXN0MzIgPSBGWEFSR0JfVE9ESUIoRlhBUkdCX01BS0UoYWxwaGFfaywgcmVkX3ksIGdyZWVuX20sIGJsdWVfYykpOworICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IEZYRElCX1JnYmEpIHsKKyAgICAgIGRlc3RbMF0gPSBibHVlX2M7CisgICAgICBkZXN0WzFdID0gZ3JlZW5fbTsKKyAgICAgIGRlc3RbMl0gPSByZWRfeTsKKyAgICB9IGVsc2UgeworICAgICAgKmRlc3QzMiA9IEZYQ01ZS19UT0RJQihDbXlrRW5jb2RlKGJsdWVfYywgZ3JlZW5fbSwgcmVkX3ksIGFscGhhX2spKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGZvcm1hdCA9PSBGWERJQl9DbXlrYSkgeworICAgICpkZXN0MzIgPSBGWENNWUtfVE9ESUIoQ215a0VuY29kZShibHVlX2MsIGdyZWVuX20sIHJlZF95LCBhbHBoYV9rKSk7CisgIH0gZWxzZSB7CisgICAgQVNTRVJUKGFscGhhX2sgPT0ga09wYXF1ZUFscGhhKTsKKyAgICAqZGVzdDMyID0gRlhBUkdCX1RPRElCKEZYQVJHQl9NQUtFKGtPcGFxdWVBbHBoYSwgcmVkX3ksIGdyZWVuX20sIGJsdWVfYykpOworICB9Cit9CisKK2NsYXNzIENQREZfRml4ZWRNYXRyaXggeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1BERl9GaXhlZE1hdHJpeChjb25zdCBDRlhfTWF0cml4JiBzcmMpCisgICAgICA6IGEoRlhTWVNfcm91bmQoc3JjLmEgKiBrQmFzZSkpLAorICAgICAgICBiKEZYU1lTX3JvdW5kKHNyYy5iICoga0Jhc2UpKSwKKyAgICAgICAgYyhGWFNZU19yb3VuZChzcmMuYyAqIGtCYXNlKSksCisgICAgICAgIGQoRlhTWVNfcm91bmQoc3JjLmQgKiBrQmFzZSkpLAorICAgICAgICBlKEZYU1lTX3JvdW5kKHNyYy5lICoga0Jhc2UpKSwKKyAgICAgICAgZihGWFNZU19yb3VuZChzcmMuZiAqIGtCYXNlKSkge30KKworICB2b2lkIFRyYW5zZm9ybShpbnQgeCwgaW50IHksIGludCogeDEsIGludCogeTEpIGNvbnN0IHsKKyAgICBzdGQ6OnBhaXI8ZmxvYXQsIGZsb2F0PiB2YWwgPSBUcmFuc2Zvcm1JbnRlcm5hbCh4LCB5KTsKKyAgICAqeDEgPSBwZGZpdW06OmJhc2U6OnNhdHVyYXRlZF9jYXN0PGludD4odmFsLmZpcnN0IC8ga0Jhc2UpOworICAgICp5MSA9IHBkZml1bTo6YmFzZTo6c2F0dXJhdGVkX2Nhc3Q8aW50Pih2YWwuc2Vjb25kIC8ga0Jhc2UpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0ZDo6cGFpcjxmbG9hdCwgZmxvYXQ+IFRyYW5zZm9ybUludGVybmFsKGZsb2F0IHgsIGZsb2F0IHkpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoYSAqIHggKyBjICogeSArIGUgKyBrQmFzZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGIgKiB4ICsgZCAqIHkgKyBmICsga0Jhc2UgLyAyKTsKKyAgfQorCisgIGNvbnN0IGludCBhOworICBjb25zdCBpbnQgYjsKKyAgY29uc3QgaW50IGM7CisgIGNvbnN0IGludCBkOworICBjb25zdCBpbnQgZTsKKyAgY29uc3QgaW50IGY7Cit9OworCitjbGFzcyBDRlhfQmlsaW5lYXJNYXRyaXggOiBwdWJsaWMgQ1BERl9GaXhlZE1hdHJpeCB7CisgcHVibGljOgorICBleHBsaWNpdCBDRlhfQmlsaW5lYXJNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgc3JjKSA6IENQREZfRml4ZWRNYXRyaXgoc3JjKSB7fQorCisgIHZvaWQgVHJhbnNmb3JtKGludCB4LCBpbnQgeSwgaW50KiB4MSwgaW50KiB5MSwgaW50KiByZXNfeCwgaW50KiByZXNfeSkgY29uc3QgeworICAgIHN0ZDo6cGFpcjxmbG9hdCwgZmxvYXQ+IHZhbCA9IFRyYW5zZm9ybUludGVybmFsKHgsIHkpOworICAgICp4MSA9IHBkZml1bTo6YmFzZTo6c2F0dXJhdGVkX2Nhc3Q8aW50Pih2YWwuZmlyc3QgLyBrQmFzZSk7CisgICAgKnkxID0gcGRmaXVtOjpiYXNlOjpzYXR1cmF0ZWRfY2FzdDxpbnQ+KHZhbC5zZWNvbmQgLyBrQmFzZSk7CisKKyAgICAqcmVzX3ggPSBzdGF0aWNfY2FzdDxpbnQ+KGZtb2RmKHZhbC5maXJzdCwga0Jhc2UpKTsKKyAgICAqcmVzX3kgPSBzdGF0aWNfY2FzdDxpbnQ+KGZtb2RmKHZhbC5zZWNvbmQsIGtCYXNlKSk7CisgICAgaWYgKCpyZXNfeCA8IDAgJiYgKnJlc194ID4gLWtCYXNlKQorICAgICAgKnJlc194ID0ga0Jhc2UgKyAqcmVzX3g7CisgICAgaWYgKCpyZXNfeSA8IDAgJiYgKnJlc194ID4gLWtCYXNlKQorICAgICAgKnJlc195ID0ga0Jhc2UgKyAqcmVzX3k7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCitDRlhfSW1hZ2VUcmFuc2Zvcm1lcjo6Q0ZYX0ltYWdlVHJhbnNmb3JtZXIoY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwKQorICAgIDogbV9wU3JjKHBTcmMpLAorICAgICAgbV9wTWF0cml4KHBNYXRyaXgpLAorICAgICAgbV9wQ2xpcChwQ2xpcCksCisgICAgICBtX0ZsYWdzKGZsYWdzKSwKKyAgICAgIG1fU3RhdHVzKDApIHsKKyAgRlhfUkVDVCByZXN1bHRfcmVjdCA9IG1fcE1hdHJpeC0+R2V0VW5pdFJlY3QoKS5HZXRDbG9zZXN0UmVjdCgpOworICBGWF9SRUNUIHJlc3VsdF9jbGlwID0gcmVzdWx0X3JlY3Q7CisgIGlmIChtX3BDbGlwKQorICAgIHJlc3VsdF9jbGlwLkludGVyc2VjdCgqbV9wQ2xpcCk7CisKKyAgaWYgKHJlc3VsdF9jbGlwLklzRW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgbV9yZXN1bHQgPSByZXN1bHRfY2xpcDsKKyAgaWYgKGZhYnMobV9wTWF0cml4LT5hKSA8IGZhYnMobV9wTWF0cml4LT5iKSAvIDIwICYmCisgICAgICBmYWJzKG1fcE1hdHJpeC0+ZCkgPCBmYWJzKG1fcE1hdHJpeC0+YykgLyAyMCAmJgorICAgICAgZmFicyhtX3BNYXRyaXgtPmEpIDwgMC41ZiAmJiBmYWJzKG1fcE1hdHJpeC0+ZCkgPCAwLjVmKSB7CisgICAgaW50IGRlc3Rfd2lkdGggPSByZXN1bHRfcmVjdC5XaWR0aCgpOworICAgIGludCBkZXN0X2hlaWdodCA9IHJlc3VsdF9yZWN0LkhlaWdodCgpOworICAgIHJlc3VsdF9jbGlwLk9mZnNldCgtcmVzdWx0X3JlY3QubGVmdCwgLXJlc3VsdF9yZWN0LnRvcCk7CisgICAgcmVzdWx0X2NsaXAgPSBGWERJQl9Td2FwQ2xpcEJveChyZXN1bHRfY2xpcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BNYXRyaXgtPmMgPiAwLCBtX3BNYXRyaXgtPmIgPCAwKTsKKyAgICBtX1N0cmV0Y2hlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfSW1hZ2VTdHJldGNoZXI+KAorICAgICAgICAmbV9TdG9yZXIsIG1fcFNyYywgZGVzdF9oZWlnaHQsIGRlc3Rfd2lkdGgsIHJlc3VsdF9jbGlwLCBtX0ZsYWdzKTsKKyAgICBtX1N0cmV0Y2hlci0+U3RhcnQoKTsKKyAgICBtX1N0YXR1cyA9IDE7CisgICAgcmV0dXJuOworICB9CisgIGlmIChmYWJzKG1fcE1hdHJpeC0+YikgPCBrRml4MTYgJiYgZmFicyhtX3BNYXRyaXgtPmMpIDwga0ZpeDE2KSB7CisgICAgaW50IGRlc3Rfd2lkdGggPSBzdGF0aWNfY2FzdDxpbnQ+KG1fcE1hdHJpeC0+YSA+IDAgPyBjZWlsKG1fcE1hdHJpeC0+YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZsb29yKG1fcE1hdHJpeC0+YSkpOworICAgIGludCBkZXN0X2hlaWdodCA9IHN0YXRpY19jYXN0PGludD4obV9wTWF0cml4LT5kID4gMCA/IC1jZWlsKG1fcE1hdHJpeC0+ZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAtZmxvb3IobV9wTWF0cml4LT5kKSk7CisgICAgcmVzdWx0X2NsaXAuT2Zmc2V0KC1yZXN1bHRfcmVjdC5sZWZ0LCAtcmVzdWx0X3JlY3QudG9wKTsKKyAgICBtX1N0cmV0Y2hlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfSW1hZ2VTdHJldGNoZXI+KAorICAgICAgICAmbV9TdG9yZXIsIG1fcFNyYywgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIHJlc3VsdF9jbGlwLCBtX0ZsYWdzKTsKKyAgICBtX1N0cmV0Y2hlci0+U3RhcnQoKTsKKyAgICBtX1N0YXR1cyA9IDI7CisgICAgcmV0dXJuOworICB9CisgIGludCBzdHJldGNoX3dpZHRoID0KKyAgICAgIHN0YXRpY19jYXN0PGludD4oY2VpbChGWFNZU19zcXJ0MihtX3BNYXRyaXgtPmEsIG1fcE1hdHJpeC0+YikpKTsKKyAgaW50IHN0cmV0Y2hfaGVpZ2h0ID0KKyAgICAgIHN0YXRpY19jYXN0PGludD4oY2VpbChGWFNZU19zcXJ0MihtX3BNYXRyaXgtPmMsIG1fcE1hdHJpeC0+ZCkpKTsKKyAgQ0ZYX01hdHJpeCBzdHJldGNoMmRlc3QoMS4wZiwgMC4wZiwgMC4wZiwgLTEuMGYsIDAuMGYsIHN0cmV0Y2hfaGVpZ2h0KTsKKyAgc3RyZXRjaDJkZXN0LkNvbmNhdCgKKyAgICAgIENGWF9NYXRyaXgobV9wTWF0cml4LT5hIC8gc3RyZXRjaF93aWR0aCwgbV9wTWF0cml4LT5iIC8gc3RyZXRjaF93aWR0aCwKKyAgICAgICAgICAgICAgICAgbV9wTWF0cml4LT5jIC8gc3RyZXRjaF9oZWlnaHQsIG1fcE1hdHJpeC0+ZCAvIHN0cmV0Y2hfaGVpZ2h0LAorICAgICAgICAgICAgICAgICBtX3BNYXRyaXgtPmUsIG1fcE1hdHJpeC0+ZikpOworICBtX2Rlc3Qyc3RyZXRjaCA9IHN0cmV0Y2gyZGVzdC5HZXRJbnZlcnNlKCk7CisKKyAgbV9TdHJldGNoQ2xpcCA9CisgICAgICBtX2Rlc3Qyc3RyZXRjaC5UcmFuc2Zvcm1SZWN0KENGWF9GbG9hdFJlY3QocmVzdWx0X2NsaXApKS5HZXRPdXRlclJlY3QoKTsKKyAgbV9TdHJldGNoQ2xpcC5JbnRlcnNlY3QoMCwgMCwgc3RyZXRjaF93aWR0aCwgc3RyZXRjaF9oZWlnaHQpOworICBtX1N0cmV0Y2hlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfSW1hZ2VTdHJldGNoZXI+KAorICAgICAgJm1fU3RvcmVyLCBtX3BTcmMsIHN0cmV0Y2hfd2lkdGgsIHN0cmV0Y2hfaGVpZ2h0LCBtX1N0cmV0Y2hDbGlwLCBtX0ZsYWdzKTsKKyAgbV9TdHJldGNoZXItPlN0YXJ0KCk7CisgIG1fU3RhdHVzID0gMzsKK30KKworQ0ZYX0ltYWdlVHJhbnNmb3JtZXI6On5DRlhfSW1hZ2VUcmFuc2Zvcm1lcigpIHt9CisKK2Jvb2wgQ0ZYX0ltYWdlVHJhbnNmb3JtZXI6OkNvbnRpbnVlKElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKSB7CisgIGlmIChtX1N0YXR1cyA9PSAxKSB7CisgICAgaWYgKG1fU3RyZXRjaGVyLT5Db250aW51ZShwUGF1c2UpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAobV9TdG9yZXIuR2V0Qml0bWFwKCkpIHsKKyAgICAgIG1fU3RvcmVyLlJlcGxhY2UoCisgICAgICAgICAgbV9TdG9yZXIuR2V0Qml0bWFwKCktPlN3YXBYWShtX3BNYXRyaXgtPmMgPiAwLCBtX3BNYXRyaXgtPmIgPCAwKSk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChtX1N0YXR1cyA9PSAyKQorICAgIHJldHVybiBtX1N0cmV0Y2hlci0+Q29udGludWUocFBhdXNlKTsKKyAgaWYgKG1fU3RhdHVzICE9IDMpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAobV9TdHJldGNoZXItPkNvbnRpbnVlKHBQYXVzZSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKCFtX1N0b3Jlci5HZXRCaXRtYXAoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYXV0byBwVHJhbnNmb3JtZWQgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOworICBGWERJQl9Gb3JtYXQgZm9ybWF0ID0gR2V0VHJhbnNmb3JtZWRGb3JtYXQobV9TdHJldGNoZXItPnNvdXJjZSgpKTsKKyAgaWYgKCFwVHJhbnNmb3JtZWQtPkNyZWF0ZShtX3Jlc3VsdC5XaWR0aCgpLCBtX3Jlc3VsdC5IZWlnaHQoKSwgZm9ybWF0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY29uc3QgYXV0byYgcFNyY01hc2sgPSBtX1N0b3Jlci5HZXRCaXRtYXAoKS0+bV9wQWxwaGFNYXNrOworICBjb25zdCB1aW50OF90KiBwU3JjTWFza0J1ZiA9IHBTcmNNYXNrID8gcFNyY01hc2stPkdldEJ1ZmZlcigpIDogbnVsbHB0cjsKKworICBwVHJhbnNmb3JtZWQtPkNsZWFyKDApOworICBhdXRvJiBwRGVzdE1hc2sgPSBwVHJhbnNmb3JtZWQtPm1fcEFscGhhTWFzazsKKyAgaWYgKHBEZXN0TWFzaykKKyAgICBwRGVzdE1hc2stPkNsZWFyKDApOworCisgIENGWF9NYXRyaXggcmVzdWx0MnN0cmV0Y2goMS4wZiwgMC4wZiwgMC4wZiwgMS4wZiwgbV9yZXN1bHQubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Jlc3VsdC50b3ApOworICByZXN1bHQyc3RyZXRjaC5Db25jYXQobV9kZXN0MnN0cmV0Y2gpOworICByZXN1bHQyc3RyZXRjaC5UcmFuc2xhdGUoLW1fU3RyZXRjaENsaXAubGVmdCwgLW1fU3RyZXRjaENsaXAudG9wKTsKKyAgaWYgKCFwU3JjTWFza0J1ZiAmJiBwRGVzdE1hc2spIHsKKyAgICBwRGVzdE1hc2stPkNsZWFyKDB4ZmYwMDAwMDApOworICB9IGVsc2UgaWYgKHBEZXN0TWFzaykgeworICAgIENhbGNEYXRhIGNkYXRhID0geworICAgICAgICBwRGVzdE1hc2suR2V0KCksIHJlc3VsdDJzdHJldGNoLCBwU3JjTWFza0J1ZiwKKyAgICAgICAgbV9TdG9yZXIuR2V0Qml0bWFwKCktPm1fcEFscGhhTWFzay0+R2V0UGl0Y2goKSwKKyAgICB9OworICAgIENhbGNNYXNrKGNkYXRhKTsKKyAgfQorCisgIENhbGNEYXRhIGNkYXRhID0ge3BUcmFuc2Zvcm1lZC5HZXQoKSwgcmVzdWx0MnN0cmV0Y2gsCisgICAgICAgICAgICAgICAgICAgIG1fU3RvcmVyLkdldEJpdG1hcCgpLT5HZXRCdWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgbV9TdG9yZXIuR2V0Qml0bWFwKCktPkdldFBpdGNoKCl9OworICBpZiAobV9TdG9yZXIuR2V0Qml0bWFwKCktPklzQWxwaGFNYXNrKCkpIHsKKyAgICBDYWxjQWxwaGEoY2RhdGEpOworICB9IGVsc2UgeworICAgIGludCBCcHAgPSBtX1N0b3Jlci5HZXRCaXRtYXAoKS0+R2V0QlBQKCkgLyA4OworICAgIGlmIChCcHAgPT0gMSkKKyAgICAgIENhbGNNb25vKGNkYXRhLCBmb3JtYXQpOworICAgIGVsc2UKKyAgICAgIENhbGNDb2xvcihjZGF0YSwgZm9ybWF0LCBCcHApOworICB9CisgIG1fU3RvcmVyLlJlcGxhY2Uoc3RkOjptb3ZlKHBUcmFuc2Zvcm1lZCkpOworICByZXR1cm4gZmFsc2U7Cit9CisKK1JldGFpblB0cjxDRlhfRElCaXRtYXA+IENGWF9JbWFnZVRyYW5zZm9ybWVyOjpEZXRhY2hCaXRtYXAoKSB7CisgIHJldHVybiBtX1N0b3Jlci5EZXRhY2goKTsKK30KKwordm9pZCBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjo6Q2FsY01hc2soY29uc3QgQ2FsY0RhdGEmIGNkYXRhKSB7CisgIGlmIChJc0JpbGluZWFyKCkpIHsKKyAgICBhdXRvIGZ1bmMgPSBbJmNkYXRhXShjb25zdCBCaWxpbmVhckRhdGEmIGRhdGEsIHVpbnQ4X3QqIGRlc3QpIHsKKyAgICAgICpkZXN0ID0gYmlsaW5lYXJfaW50ZXJwb2woY2RhdGEuYnVmLCBkYXRhLnJvd19vZmZzZXRfbCwgZGF0YS5yb3dfb2Zmc2V0X3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc3JjX2NvbF9sLCBkYXRhLnNyY19jb2xfciwgZGF0YS5yZXNfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5yZXNfeSwgMSwgMCk7CisgICAgfTsKKyAgICBEb0JpbGluZWFyTG9vcChjZGF0YSwgMSwgZnVuYyk7CisgIH0gZWxzZSBpZiAoSXNCaUN1YmljKCkpIHsKKyAgICBhdXRvIGZ1bmMgPSBbJmNkYXRhXShjb25zdCBCaWN1YmljRGF0YSYgZGF0YSwgdWludDhfdCogZGVzdCkgeworICAgICAgKmRlc3QgPSBiaWN1YmljX2ludGVycG9sKGNkYXRhLmJ1ZiwgY2RhdGEucGl0Y2gsIGRhdGEucG9zX3BpeGVsLCBkYXRhLnVfdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnZfdywgZGF0YS5yZXNfeCwgZGF0YS5yZXNfeSwgMSwgMCk7CisgICAgfTsKKyAgICBEb0JpY3ViaWNMb29wKGNkYXRhLCAxLCBmdW5jKTsKKyAgfSBlbHNlIHsKKyAgICBhdXRvIGZ1bmMgPSBbJmNkYXRhXShjb25zdCBEb3duU2FtcGxlRGF0YSYgZGF0YSwgdWludDhfdCogZGVzdCkgeworICAgICAgKmRlc3QgPSBjZGF0YS5idWZbZGF0YS5zcmNfcm93ICogY2RhdGEucGl0Y2ggKyBkYXRhLnNyY19jb2xdOworICAgIH07CisgICAgRG9Eb3duU2FtcGxlTG9vcChjZGF0YSwgMSwgZnVuYyk7CisgIH0KK30KKwordm9pZCBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjo6Q2FsY0FscGhhKGNvbnN0IENhbGNEYXRhJiBjZGF0YSkgeworICBpZiAoSXNCaWxpbmVhcigpKSB7CisgICAgYXV0byBmdW5jID0gWyZjZGF0YV0oY29uc3QgQmlsaW5lYXJEYXRhJiBkYXRhLCB1aW50OF90KiBkZXN0KSB7CisgICAgICAqZGVzdCA9IGJpbGluZWFyX2ludGVycG9sKGNkYXRhLmJ1ZiwgZGF0YS5yb3dfb2Zmc2V0X2wsIGRhdGEucm93X29mZnNldF9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnNyY19jb2xfbCwgZGF0YS5zcmNfY29sX3IsIGRhdGEucmVzX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVzX3ksIDEsIDApOworICAgIH07CisgICAgRG9CaWxpbmVhckxvb3AoY2RhdGEsIDEsIGZ1bmMpOworICB9IGVsc2UgaWYgKElzQmlDdWJpYygpKSB7CisgICAgYXV0byBmdW5jID0gWyZjZGF0YV0oY29uc3QgQmljdWJpY0RhdGEmIGRhdGEsIHVpbnQ4X3QqIGRlc3QpIHsKKyAgICAgICpkZXN0ID0gYmljdWJpY19pbnRlcnBvbChjZGF0YS5idWYsIGNkYXRhLnBpdGNoLCBkYXRhLnBvc19waXhlbCwgZGF0YS51X3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS52X3csIGRhdGEucmVzX3gsIGRhdGEucmVzX3ksIDEsIDApOworICAgIH07CisgICAgRG9CaWN1YmljTG9vcChjZGF0YSwgMSwgZnVuYyk7CisgIH0gZWxzZSB7CisgICAgYXV0byBmdW5jID0gWyZjZGF0YV0oY29uc3QgRG93blNhbXBsZURhdGEmIGRhdGEsIHVpbnQ4X3QqIGRlc3QpIHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19waXhlbCA9CisgICAgICAgICAgY2RhdGEuYnVmICsgY2RhdGEucGl0Y2ggKiBkYXRhLnNyY19yb3cgKyBkYXRhLnNyY19jb2w7CisgICAgICAqZGVzdCA9ICpzcmNfcGl4ZWw7CisgICAgfTsKKyAgICBEb0Rvd25TYW1wbGVMb29wKGNkYXRhLCAxLCBmdW5jKTsKKyAgfQorfQorCit2b2lkIENGWF9JbWFnZVRyYW5zZm9ybWVyOjpDYWxjTW9ubyhjb25zdCBDYWxjRGF0YSYgY2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgZm9ybWF0KSB7CisgIHVpbnQzMl90IGFyZ2JbMjU2XTsKKyAgRlhfQVJHQiogcFBhbCA9IG1fU3RvcmVyLkdldEJpdG1hcCgpLT5HZXRQYWxldHRlKCk7CisgIGlmIChwUGFsKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoYXJnYik7IGkrKykKKyAgICAgIGFyZ2JbaV0gPSBwUGFsW2ldOworICB9IGVsc2UgaWYgKG1fU3RvcmVyLkdldEJpdG1hcCgpLT5Jc0NteWtJbWFnZSgpKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoYXJnYik7IGkrKykKKyAgICAgIGFyZ2JbaV0gPSAyNTUgLSBpOworICB9IGVsc2UgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGFyZ2IpOyBpKyspCisgICAgICBhcmdiW2ldID0gMHhmZjAwMDAwMCB8IChpICogMHgwMTAxMDEpOworICB9CisgIGludCBkZXN0QnBwID0gY2RhdGEuYml0bWFwLT5HZXRCUFAoKSAvIDg7CisgIGlmIChJc0JpbGluZWFyKCkpIHsKKyAgICBhdXRvIGZ1bmMgPSBbJmNkYXRhLCBmb3JtYXQsICZhcmdiXShjb25zdCBCaWxpbmVhckRhdGEmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdCkgeworICAgICAgdWludDhfdCBpZHggPSBiaWxpbmVhcl9pbnRlcnBvbCgKKyAgICAgICAgICBjZGF0YS5idWYsIGRhdGEucm93X29mZnNldF9sLCBkYXRhLnJvd19vZmZzZXRfciwgZGF0YS5zcmNfY29sX2wsCisgICAgICAgICAgZGF0YS5zcmNfY29sX3IsIGRhdGEucmVzX3gsIGRhdGEucmVzX3ksIDEsIDApOworICAgICAgdWludDMyX3Qgcl9iZ3JhX2NteWsgPSBhcmdiW2lkeF07CisgICAgICBXcml0ZU1vbm9SZXN1bHQocl9iZ3JhX2NteWssIGZvcm1hdCwgZGVzdCk7CisgICAgfTsKKyAgICBEb0JpbGluZWFyTG9vcChjZGF0YSwgZGVzdEJwcCwgZnVuYyk7CisgIH0gZWxzZSBpZiAoSXNCaUN1YmljKCkpIHsKKyAgICBhdXRvIGZ1bmMgPSBbJmNkYXRhLCBmb3JtYXQsICZhcmdiXShjb25zdCBCaWN1YmljRGF0YSYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0KSB7CisgICAgICB1aW50MzJfdCByX2JncmFfY215ayA9IGFyZ2JbYmljdWJpY19pbnRlcnBvbCgKKyAgICAgICAgICBjZGF0YS5idWYsIGNkYXRhLnBpdGNoLCBkYXRhLnBvc19waXhlbCwgZGF0YS51X3csIGRhdGEudl93LAorICAgICAgICAgIGRhdGEucmVzX3gsIGRhdGEucmVzX3ksIDEsIDApXTsKKyAgICAgIFdyaXRlTW9ub1Jlc3VsdChyX2JncmFfY215aywgZm9ybWF0LCBkZXN0KTsKKyAgICB9OworICAgIERvQmljdWJpY0xvb3AoY2RhdGEsIGRlc3RCcHAsIGZ1bmMpOworICB9IGVsc2UgeworICAgIGF1dG8gZnVuYyA9IFsmY2RhdGEsIGZvcm1hdCwgJmFyZ2JdKGNvbnN0IERvd25TYW1wbGVEYXRhJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3QpIHsKKyAgICAgIHVpbnQzMl90IHJfYmdyYV9jbXlrID0KKyAgICAgICAgICBhcmdiW2NkYXRhLmJ1ZltkYXRhLnNyY19yb3cgKiBjZGF0YS5waXRjaCArIGRhdGEuc3JjX2NvbF1dOworICAgICAgV3JpdGVNb25vUmVzdWx0KHJfYmdyYV9jbXlrLCBmb3JtYXQsIGRlc3QpOworICAgIH07CisgICAgRG9Eb3duU2FtcGxlTG9vcChjZGF0YSwgZGVzdEJwcCwgZnVuYyk7CisgIH0KK30KKwordm9pZCBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjo6Q2FsY0NvbG9yKGNvbnN0IENhbGNEYXRhJiBjZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHApIHsKKyAgYm9vbCBiSGFzQWxwaGEgPSBtX1N0b3Jlci5HZXRCaXRtYXAoKS0+SGFzQWxwaGEoKTsKKyAgaW50IGRlc3RCcHAgPSBjZGF0YS5iaXRtYXAtPkdldEJQUCgpIC8gODsKKyAgaWYgKElzQmlsaW5lYXIoKSkgeworICAgIGF1dG8gZnVuYyA9IFsmY2RhdGEsIGZvcm1hdCwgQnBwLCBiSGFzQWxwaGFdKGNvbnN0IEJpbGluZWFyRGF0YSYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0KSB7CisgICAgICBhdXRvIGJpbGluZWFyX2ludGVycG9sX2Z1bmMgPSBbJmNkYXRhLCAmZGF0YSwgQnBwXShpbnQgb2Zmc2V0KSB7CisgICAgICAgIHJldHVybiBiaWxpbmVhcl9pbnRlcnBvbCgKKyAgICAgICAgICAgIGNkYXRhLmJ1ZiwgZGF0YS5yb3dfb2Zmc2V0X2wsIGRhdGEucm93X29mZnNldF9yLCBkYXRhLnNyY19jb2xfbCwKKyAgICAgICAgICAgIGRhdGEuc3JjX2NvbF9yLCBkYXRhLnJlc194LCBkYXRhLnJlc195LCBCcHAsIG9mZnNldCk7CisgICAgICB9OworICAgICAgV3JpdGVDb2xvclJlc3VsdChiaWxpbmVhcl9pbnRlcnBvbF9mdW5jLCBiSGFzQWxwaGEsIGZvcm1hdCwgZGVzdCk7CisgICAgfTsKKyAgICBEb0JpbGluZWFyTG9vcChjZGF0YSwgZGVzdEJwcCwgZnVuYyk7CisgIH0gZWxzZSBpZiAoSXNCaUN1YmljKCkpIHsKKyAgICBhdXRvIGZ1bmMgPSBbJmNkYXRhLCBmb3JtYXQsIEJwcCwgYkhhc0FscGhhXShjb25zdCBCaWN1YmljRGF0YSYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0KSB7CisgICAgICBhdXRvIGJpY3ViaWNfaW50ZXJwb2xfZnVuYyA9IFsmY2RhdGEsICZkYXRhLCBCcHBdKGludCBvZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIGJpY3ViaWNfaW50ZXJwb2woY2RhdGEuYnVmLCBjZGF0YS5waXRjaCwgZGF0YS5wb3NfcGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEudV93LCBkYXRhLnZfdywgZGF0YS5yZXNfeCwgZGF0YS5yZXNfeSwgQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworICAgICAgfTsKKyAgICAgIFdyaXRlQ29sb3JSZXN1bHQoYmljdWJpY19pbnRlcnBvbF9mdW5jLCBiSGFzQWxwaGEsIGZvcm1hdCwgZGVzdCk7CisgICAgfTsKKyAgICBEb0JpY3ViaWNMb29wKGNkYXRhLCBkZXN0QnBwLCBmdW5jKTsKKyAgfSBlbHNlIHsKKyAgICBhdXRvIGZ1bmMgPSBbJmNkYXRhLCBmb3JtYXQsIGJIYXNBbHBoYSwgQnBwXShjb25zdCBEb3duU2FtcGxlRGF0YSYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0KSB7CisgICAgICBjb25zdCB1aW50OF90KiBzcmNfcG9zID0KKyAgICAgICAgICBjZGF0YS5idWYgKyBkYXRhLnNyY19yb3cgKiBjZGF0YS5waXRjaCArIGRhdGEuc3JjX2NvbCAqIEJwcDsKKyAgICAgIGF1dG8gc2FtcGxlX2Z1bmMgPSBbc3JjX3Bvc10oaW50IG9mZnNldCkgeyByZXR1cm4gc3JjX3Bvc1tvZmZzZXRdOyB9OworICAgICAgV3JpdGVDb2xvclJlc3VsdChzYW1wbGVfZnVuYywgYkhhc0FscGhhLCBmb3JtYXQsIGRlc3QpOworICAgIH07CisgICAgRG9Eb3duU2FtcGxlTG9vcChjZGF0YSwgZGVzdEJwcCwgZnVuYyk7CisgIH0KK30KKwordm9pZCBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjo6QWRqdXN0Q29vcmRzKGludCogY29sLCBpbnQqIHJvdykgY29uc3QgeworICBpbnQmIHNyY19jb2wgPSAqY29sOworICBpbnQmIHNyY19yb3cgPSAqcm93OworICBpZiAoc3JjX2NvbCA9PSBzdHJldGNoX3dpZHRoKCkpCisgICAgc3JjX2NvbC0tOworICBpZiAoc3JjX3JvdyA9PSBzdHJldGNoX2hlaWdodCgpKQorICAgIHNyY19yb3ctLTsKK30KKwordm9pZCBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjo6RG9CaWxpbmVhckxvb3AoCisgICAgY29uc3QgQ2FsY0RhdGEmIGNkYXRhLAorICAgIGludCBpbmNyZW1lbnQsCisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEJpbGluZWFyRGF0YSYsIHVpbnQ4X3QqKT4gZnVuYykgeworICBDRlhfQmlsaW5lYXJNYXRyaXggbWF0cml4X2ZpeChjZGF0YS5tYXRyaXgpOworICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX3Jlc3VsdC5IZWlnaHQoKTsgcm93KyspIHsKKyAgICB1aW50OF90KiBkZXN0ID0gY29uc3RfY2FzdDx1aW50OF90Kj4oY2RhdGEuYml0bWFwLT5HZXRTY2FubGluZShyb3cpKTsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX3Jlc3VsdC5XaWR0aCgpOyBjb2wrKykgeworICAgICAgQmlsaW5lYXJEYXRhIGQ7CisgICAgICBkLnJlc194ID0gMDsKKyAgICAgIGQucmVzX3kgPSAwOworICAgICAgZC5zcmNfY29sX2wgPSAwOworICAgICAgZC5zcmNfcm93X2wgPSAwOworICAgICAgbWF0cml4X2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csICZkLnNyY19jb2xfbCwgJmQuc3JjX3Jvd19sLCAmZC5yZXNfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZkLnJlc195KTsKKyAgICAgIGlmIChJblN0cmV0Y2hCb3VuZHMoZC5zcmNfY29sX2wsIGQuc3JjX3Jvd19sKSkgeworICAgICAgICBBZGp1c3RDb29yZHMoJmQuc3JjX2NvbF9sLCAmZC5zcmNfcm93X2wpOworICAgICAgICBkLnNyY19jb2xfciA9IGQuc3JjX2NvbF9sICsgMTsKKyAgICAgICAgZC5zcmNfcm93X3IgPSBkLnNyY19yb3dfbCArIDE7CisgICAgICAgIEFkanVzdENvb3JkcygmZC5zcmNfY29sX3IsICZkLnNyY19yb3dfcik7CisgICAgICAgIGQucm93X29mZnNldF9sID0gZC5zcmNfcm93X2wgKiBjZGF0YS5waXRjaDsKKyAgICAgICAgZC5yb3dfb2Zmc2V0X3IgPSBkLnNyY19yb3dfciAqIGNkYXRhLnBpdGNoOworICAgICAgICBmdW5jKGQsIGRlc3QpOworICAgICAgfQorICAgICAgZGVzdCArPSBpbmNyZW1lbnQ7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ0ZYX0ltYWdlVHJhbnNmb3JtZXI6OkRvQmljdWJpY0xvb3AoCisgICAgY29uc3QgQ2FsY0RhdGEmIGNkYXRhLAorICAgIGludCBpbmNyZW1lbnQsCisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEJpY3ViaWNEYXRhJiwgdWludDhfdCopPiBmdW5jKSB7CisgIENGWF9CaWxpbmVhck1hdHJpeCBtYXRyaXhfZml4KGNkYXRhLm1hdHJpeCk7CisgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fcmVzdWx0LkhlaWdodCgpOyByb3crKykgeworICAgIHVpbnQ4X3QqIGRlc3QgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPihjZGF0YS5iaXRtYXAtPkdldFNjYW5saW5lKHJvdykpOworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fcmVzdWx0LldpZHRoKCk7IGNvbCsrKSB7CisgICAgICBCaWN1YmljRGF0YSBkOworICAgICAgZC5yZXNfeCA9IDA7CisgICAgICBkLnJlc195ID0gMDsKKyAgICAgIGQuc3JjX2NvbF9sID0gMDsKKyAgICAgIGQuc3JjX3Jvd19sID0gMDsKKyAgICAgIG1hdHJpeF9maXguVHJhbnNmb3JtKGNvbCwgcm93LCAmZC5zcmNfY29sX2wsICZkLnNyY19yb3dfbCwgJmQucmVzX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmZC5yZXNfeSk7CisgICAgICBpZiAoSW5TdHJldGNoQm91bmRzKGQuc3JjX2NvbF9sLCBkLnNyY19yb3dfbCkpIHsKKyAgICAgICAgQWRqdXN0Q29vcmRzKCZkLnNyY19jb2xfbCwgJmQuc3JjX3Jvd19sKTsKKyAgICAgICAgYmljdWJpY19nZXRfcG9zX3dlaWdodChkLnBvc19waXhlbCwgZC51X3csIGQudl93LCBkLnNyY19jb2xfbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnNyY19yb3dfbCwgZC5yZXNfeCwgZC5yZXNfeSwgc3RyZXRjaF93aWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmV0Y2hfaGVpZ2h0KCkpOworICAgICAgICBmdW5jKGQsIGRlc3QpOworICAgICAgfQorICAgICAgZGVzdCArPSBpbmNyZW1lbnQ7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ0ZYX0ltYWdlVHJhbnNmb3JtZXI6OkRvRG93blNhbXBsZUxvb3AoCisgICAgY29uc3QgQ2FsY0RhdGEmIGNkYXRhLAorICAgIGludCBpbmNyZW1lbnQsCisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IERvd25TYW1wbGVEYXRhJiwgdWludDhfdCopPiBmdW5jKSB7CisgIENQREZfRml4ZWRNYXRyaXggbWF0cml4X2ZpeChjZGF0YS5tYXRyaXgpOworICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX3Jlc3VsdC5IZWlnaHQoKTsgcm93KyspIHsKKyAgICB1aW50OF90KiBkZXN0ID0gY29uc3RfY2FzdDx1aW50OF90Kj4oY2RhdGEuYml0bWFwLT5HZXRTY2FubGluZShyb3cpKTsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX3Jlc3VsdC5XaWR0aCgpOyBjb2wrKykgeworICAgICAgRG93blNhbXBsZURhdGEgZDsKKyAgICAgIGQuc3JjX2NvbCA9IDA7CisgICAgICBkLnNyY19yb3cgPSAwOworICAgICAgbWF0cml4X2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csICZkLnNyY19jb2wsICZkLnNyY19yb3cpOworICAgICAgaWYgKEluU3RyZXRjaEJvdW5kcyhkLnNyY19jb2wsIGQuc3JjX3JvdykpIHsKKyAgICAgICAgQWRqdXN0Q29vcmRzKCZkLnNyY19jb2wsICZkLnNyY19yb3cpOworICAgICAgICBmdW5jKGQsIGRlc3QpOworICAgICAgfQorICAgICAgZGVzdCArPSBpbmNyZW1lbnQ7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZGliL2NmeF9pbWFnZXRyYW5zZm9ybWVyLmggYi9jb3JlL2Z4Z2UvZGliL2NmeF9pbWFnZXRyYW5zZm9ybWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEzY2UzZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9kaWIvY2Z4X2ltYWdldHJhbnNmb3JtZXIuaApAQCAtMCwwICsxLDExMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhHRV9ESUJfQ0ZYX0lNQUdFVFJBTlNGT1JNRVJfSF8KKyNkZWZpbmUgQ09SRV9GWEdFX0RJQl9DRlhfSU1BR0VUUkFOU0ZPUk1FUl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9iaXRtYXBzdG9yZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9kaWJpdG1hcC5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2RpYnNvdXJjZS5oIgorCitjbGFzcyBDRlhfSW1hZ2VTdHJldGNoZXI7CisKK2NsYXNzIENGWF9JbWFnZVRyYW5zZm9ybWVyIHsKKyBwdWJsaWM6CisgIENGWF9JbWFnZVRyYW5zZm9ybWVyKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcCk7CisgIH5DRlhfSW1hZ2VUcmFuc2Zvcm1lcigpOworCisgIGJvb2wgQ29udGludWUoSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpOworCisgIGNvbnN0IEZYX1JFQ1QmIHJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuIG1fcmVzdWx0OyB9CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IERldGFjaEJpdG1hcCgpOworCisgcHJpdmF0ZToKKyAgc3RydWN0IEJpbGluZWFyRGF0YSB7CisgICAgaW50IHJlc194OworICAgIGludCByZXNfeTsKKyAgICBpbnQgc3JjX2NvbF9sOworICAgIGludCBzcmNfcm93X2w7CisgICAgaW50IHNyY19jb2xfcjsKKyAgICBpbnQgc3JjX3Jvd19yOworICAgIGludCByb3dfb2Zmc2V0X2w7CisgICAgaW50IHJvd19vZmZzZXRfcjsKKyAgfTsKKworICBzdHJ1Y3QgQmljdWJpY0RhdGEgeworICAgIGludCByZXNfeDsKKyAgICBpbnQgcmVzX3k7CisgICAgaW50IHNyY19jb2xfbDsKKyAgICBpbnQgc3JjX3Jvd19sOworICAgIGludCBzcmNfY29sX3I7CisgICAgaW50IHNyY19yb3dfcjsKKyAgICBpbnQgcG9zX3BpeGVsWzhdOworICAgIGludCB1X3dbNF07CisgICAgaW50IHZfd1s0XTsKKyAgfTsKKworICBzdHJ1Y3QgRG93blNhbXBsZURhdGEgeworICAgIGludCBzcmNfY29sOworICAgIGludCBzcmNfcm93OworICB9OworCisgIHN0cnVjdCBDYWxjRGF0YSB7CisgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBiaXRtYXA7CisgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4OworICAgIGNvbnN0IHVpbnQ4X3QqIGJ1ZjsKKyAgICB1aW50MzJfdCBwaXRjaDsKKyAgfTsKKworICB2b2lkIENhbGNNYXNrKGNvbnN0IENhbGNEYXRhJiBjZGF0YSk7CisgIHZvaWQgQ2FsY0FscGhhKGNvbnN0IENhbGNEYXRhJiBjZGF0YSk7CisgIHZvaWQgQ2FsY01vbm8oY29uc3QgQ2FsY0RhdGEmIGNkYXRhLCBGWERJQl9Gb3JtYXQgZm9ybWF0KTsKKyAgdm9pZCBDYWxjQ29sb3IoY29uc3QgQ2FsY0RhdGEmIGNkYXRhLCBGWERJQl9Gb3JtYXQgZm9ybWF0LCBpbnQgQnBwKTsKKworICBib29sIElzQmlsaW5lYXIoKSBjb25zdCB7CisgICAgcmV0dXJuICEobV9GbGFncyAmIEZYRElCX0RPV05TQU1QTEUpICYmICFJc0JpQ3ViaWMoKTsKKyAgfQorICBib29sIElzQmlDdWJpYygpIGNvbnN0IHsgcmV0dXJuICEhKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKTsgfQorCisgIGludCBzdHJldGNoX3dpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9TdHJldGNoQ2xpcC5XaWR0aCgpOyB9CisgIGludCBzdHJldGNoX2hlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fU3RyZXRjaENsaXAuSGVpZ2h0KCk7IH0KKworICBib29sIEluU3RyZXRjaEJvdW5kcyhpbnQgY29sLCBpbnQgcm93KSBjb25zdCB7CisgICAgcmV0dXJuIGNvbCA+PSAwICYmIGNvbCA8PSBzdHJldGNoX3dpZHRoKCkgJiYgcm93ID49IDAgJiYKKyAgICAgICAgICAgcm93IDw9IHN0cmV0Y2hfaGVpZ2h0KCk7CisgIH0KKworICB2b2lkIEFkanVzdENvb3JkcyhpbnQqIGNvbCwgaW50KiByb3cpIGNvbnN0OworCisgIHZvaWQgRG9CaWxpbmVhckxvb3AoY29uc3QgQ2FsY0RhdGEmIGNkYXRhLAorICAgICAgICAgICAgICAgICAgICAgIGludCBpbmNyZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEJpbGluZWFyRGF0YSYsIHVpbnQ4X3QqKT4gZnVuYyk7CisgIHZvaWQgRG9CaWN1YmljTG9vcChjb25zdCBDYWxjRGF0YSYgY2RhdGEsCisgICAgICAgICAgICAgICAgICAgICBpbnQgaW5jcmVtZW50LAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IEJpY3ViaWNEYXRhJiwgdWludDhfdCopPiBmdW5jKTsKKyAgdm9pZCBEb0Rvd25TYW1wbGVMb29wKAorICAgICAgY29uc3QgQ2FsY0RhdGEmIGNkYXRhLAorICAgICAgaW50IGluY3JlbWVudCwKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBEb3duU2FtcGxlRGF0YSYsIHVpbnQ4X3QqKT4gZnVuYyk7CisKKyAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+IG1fcFNyYzsKKyAgVW5vd25lZFB0cjxjb25zdCBDRlhfTWF0cml4PiBjb25zdCBtX3BNYXRyaXg7CisgIGNvbnN0IEZYX1JFQ1QqIGNvbnN0IG1fcENsaXA7CisgIEZYX1JFQ1QgbV9TdHJldGNoQ2xpcDsKKyAgRlhfUkVDVCBtX3Jlc3VsdDsKKyAgQ0ZYX01hdHJpeCBtX2Rlc3Qyc3RyZXRjaDsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWF9JbWFnZVN0cmV0Y2hlcj4gbV9TdHJldGNoZXI7CisgIENGWF9CaXRtYXBTdG9yZXIgbV9TdG9yZXI7CisgIGNvbnN0IHVpbnQzMl90IG1fRmxhZ3M7CisgIGludCBtX1N0YXR1czsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWEdFX0RJQl9DRlhfSU1BR0VUUkFOU0ZPUk1FUl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2RpYi9jZnhfc2NhbmxpbmVjb21wb3NpdG9yLmNwcCBiL2NvcmUvZnhnZS9kaWIvY2Z4X3NjYW5saW5lY29tcG9zaXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEyNTRlMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9kaWIvY2Z4X3NjYW5saW5lY29tcG9zaXRvci5jcHAKQEAgLTAsMCArMSwzMzM2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9zY2FubGluZWNvbXBvc2l0b3IuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9meF9jb2RlYy5oIgorCisjZGVmaW5lIEZYX0NDT0xPUih2YWwpICgyNTUgLSAodmFsKSkKKyNkZWZpbmUgRlhESUJfQUxQSEFfVU5JT04oZGVzdCwgc3JjKSAoKGRlc3QpICsgKHNyYykgLSAoZGVzdCkgKiAoc3JjKSAvIDI1NSkKKyNkZWZpbmUgRlhBUkdCX0NPUFkoZGVzdCwgc3JjKSAgICAgICAgICAgICAgICAgICAgXAorICAqKGRlc3QpID0gKihzcmMpLCAqKChkZXN0KSArIDEpID0gKigoc3JjKSArIDEpLCBcCisgICooKGRlc3QpICsgMikgPSAqKChzcmMpICsgMiksICooKGRlc3QpICsgMykgPSAqKChzcmMpICsgMykKKyNkZWZpbmUgRlhBUkdCX1JHQk9SREVSQ09QWShkZXN0LCBzcmMpICAgICAgICAgICAgICAgICAgXAorICAqKChkZXN0KSArIDMpID0gKigoc3JjKSArIDMpLCAqKGRlc3QpID0gKigoc3JjKSArIDIpLCBcCisgICAgICAgICAgICAgKigoZGVzdCkgKyAxKSA9ICooKHNyYykgKyAxKSwgKigoZGVzdCkgKyAyKSA9ICooKHNyYykpCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IHVpbnQ4X3QgY29sb3Jfc3FydFsyNTZdID0geworICAgIDB4MDAsIDB4MDMsIDB4MDcsIDB4MEIsIDB4MEYsIDB4MTIsIDB4MTYsIDB4MTksIDB4MUQsIDB4MjAsIDB4MjMsIDB4MjYsCisgICAgMHgyOSwgMHgyQywgMHgyRiwgMHgzMiwgMHgzNSwgMHgzNywgMHgzQSwgMHgzQywgMHgzRiwgMHg0MSwgMHg0MywgMHg0NiwKKyAgICAweDQ4LCAweDRBLCAweDRDLCAweDRFLCAweDUwLCAweDUyLCAweDU0LCAweDU2LCAweDU3LCAweDU5LCAweDVCLCAweDVDLAorICAgIDB4NUUsIDB4NjAsIDB4NjEsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjcsIDB4NjgsIDB4NjksIDB4NkIsIDB4NkMsIDB4NkQsCisgICAgMHg2RSwgMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3QSwKKyAgICAweDdCLCAweDdDLCAweDdELCAweDdFLCAweDgwLCAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LAorICAgIDB4ODcsIDB4ODgsIDB4ODksIDB4OEEsIDB4OEIsIDB4OEMsIDB4OEQsIDB4OEUsIDB4OEYsIDB4OTAsIDB4OTEsIDB4OTEsCisgICAgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5NywgMHg5OCwgMHg5OSwgMHg5QSwgMHg5QiwgMHg5QywKKyAgICAweDlDLCAweDlELCAweDlFLCAweDlGLCAweEEwLCAweEEwLCAweEExLCAweEEyLCAweEEzLCAweEE0LCAweEE0LCAweEE1LAorICAgIDB4QTYsIDB4QTcsIDB4QTcsIDB4QTgsIDB4QTksIDB4QUEsIDB4QUEsIDB4QUIsIDB4QUMsIDB4QUQsIDB4QUQsIDB4QUUsCisgICAgMHhBRiwgMHhCMCwgMHhCMCwgMHhCMSwgMHhCMiwgMHhCMywgMHhCMywgMHhCNCwgMHhCNSwgMHhCNSwgMHhCNiwgMHhCNywKKyAgICAweEI3LCAweEI4LCAweEI5LCAweEJBLCAweEJBLCAweEJCLCAweEJDLCAweEJDLCAweEJELCAweEJFLCAweEJFLCAweEJGLAorICAgIDB4QzAsIDB4QzAsIDB4QzEsIDB4QzIsIDB4QzIsIDB4QzMsIDB4QzQsIDB4QzQsIDB4QzUsIDB4QzYsIDB4QzYsIDB4QzcsCisgICAgMHhDNywgMHhDOCwgMHhDOSwgMHhDOSwgMHhDQSwgMHhDQiwgMHhDQiwgMHhDQywgMHhDQywgMHhDRCwgMHhDRSwgMHhDRSwKKyAgICAweENGLCAweEQwLCAweEQwLCAweEQxLCAweEQxLCAweEQyLCAweEQzLCAweEQzLCAweEQ0LCAweEQ0LCAweEQ1LCAweEQ2LAorICAgIDB4RDYsIDB4RDcsIDB4RDcsIDB4RDgsIDB4RDksIDB4RDksIDB4REEsIDB4REEsIDB4REIsIDB4REMsIDB4REMsIDB4REQsCisgICAgMHhERCwgMHhERSwgMHhERSwgMHhERiwgMHhFMCwgMHhFMCwgMHhFMSwgMHhFMSwgMHhFMiwgMHhFMiwgMHhFMywgMHhFNCwKKyAgICAweEU0LCAweEU1LCAweEU1LCAweEU2LCAweEU2LCAweEU3LCAweEU3LCAweEU4LCAweEU5LCAweEU5LCAweEVBLCAweEVBLAorICAgIDB4RUIsIDB4RUIsIDB4RUMsIDB4RUMsIDB4RUQsIDB4RUQsIDB4RUUsIDB4RUUsIDB4RUYsIDB4RjAsIDB4RjAsIDB4RjEsCisgICAgMHhGMSwgMHhGMiwgMHhGMiwgMHhGMywgMHhGMywgMHhGNCwgMHhGNCwgMHhGNSwgMHhGNSwgMHhGNiwgMHhGNiwgMHhGNywKKyAgICAweEY3LCAweEY4LCAweEY4LCAweEY5LCAweEY5LCAweEZBLCAweEZBLCAweEZCLCAweEZCLCAweEZDLCAweEZDLCAweEZELAorICAgIDB4RkQsIDB4RkUsIDB4RkUsIDB4RkZ9OworCitpbnQgQmxlbmQoaW50IGJsZW5kX21vZGUsIGludCBiYWNrX2NvbG9yLCBpbnQgc3JjX2NvbG9yKSB7CisgIHN3aXRjaCAoYmxlbmRfbW9kZSkgeworICAgIGNhc2UgRlhESUJfQkxFTkRfTk9STUFMOgorICAgICAgcmV0dXJuIHNyY19jb2xvcjsKKyAgICBjYXNlIEZYRElCX0JMRU5EX01VTFRJUExZOgorICAgICAgcmV0dXJuIHNyY19jb2xvciAqIGJhY2tfY29sb3IgLyAyNTU7CisgICAgY2FzZSBGWERJQl9CTEVORF9TQ1JFRU46CisgICAgICByZXR1cm4gc3JjX2NvbG9yICsgYmFja19jb2xvciAtIHNyY19jb2xvciAqIGJhY2tfY29sb3IgLyAyNTU7CisgICAgY2FzZSBGWERJQl9CTEVORF9PVkVSTEFZOgorICAgICAgcmV0dXJuIEJsZW5kKEZYRElCX0JMRU5EX0hBUkRMSUdIVCwgc3JjX2NvbG9yLCBiYWNrX2NvbG9yKTsKKyAgICBjYXNlIEZYRElCX0JMRU5EX0RBUktFTjoKKyAgICAgIHJldHVybiBzcmNfY29sb3IgPCBiYWNrX2NvbG9yID8gc3JjX2NvbG9yIDogYmFja19jb2xvcjsKKyAgICBjYXNlIEZYRElCX0JMRU5EX0xJR0hURU46CisgICAgICByZXR1cm4gc3JjX2NvbG9yID4gYmFja19jb2xvciA/IHNyY19jb2xvciA6IGJhY2tfY29sb3I7CisgICAgY2FzZSBGWERJQl9CTEVORF9DT0xPUkRPREdFOiB7CisgICAgICBpZiAoc3JjX2NvbG9yID09IDI1NSkKKyAgICAgICAgcmV0dXJuIHNyY19jb2xvcjsKKworICAgICAgcmV0dXJuIHN0ZDo6bWluKGJhY2tfY29sb3IgKiAyNTUgLyAoMjU1IC0gc3JjX2NvbG9yKSwgMjU1KTsKKyAgICB9CisgICAgY2FzZSBGWERJQl9CTEVORF9DT0xPUkJVUk46IHsKKyAgICAgIGlmIChzcmNfY29sb3IgPT0gMCkKKyAgICAgICAgcmV0dXJuIHNyY19jb2xvcjsKKworICAgICAgcmV0dXJuIDI1NSAtIHN0ZDo6bWluKCgyNTUgLSBiYWNrX2NvbG9yKSAqIDI1NSAvIHNyY19jb2xvciwgMjU1KTsKKyAgICB9CisgICAgY2FzZSBGWERJQl9CTEVORF9IQVJETElHSFQ6CisgICAgICBpZiAoc3JjX2NvbG9yIDwgMTI4KQorICAgICAgICByZXR1cm4gKHNyY19jb2xvciAqIGJhY2tfY29sb3IgKiAyKSAvIDI1NTsKKworICAgICAgcmV0dXJuIEJsZW5kKEZYRElCX0JMRU5EX1NDUkVFTiwgYmFja19jb2xvciwgMiAqIHNyY19jb2xvciAtIDI1NSk7CisgICAgY2FzZSBGWERJQl9CTEVORF9TT0ZUTElHSFQ6IHsKKyAgICAgIGlmIChzcmNfY29sb3IgPCAxMjgpIHsKKyAgICAgICAgcmV0dXJuIGJhY2tfY29sb3IgLQorICAgICAgICAgICAgICAgKDI1NSAtIDIgKiBzcmNfY29sb3IpICogYmFja19jb2xvciAqICgyNTUgLSBiYWNrX2NvbG9yKSAvIDI1NSAvCisgICAgICAgICAgICAgICAgICAgMjU1OworICAgICAgfQorICAgICAgcmV0dXJuIGJhY2tfY29sb3IgKworICAgICAgICAgICAgICgyICogc3JjX2NvbG9yIC0gMjU1KSAqIChjb2xvcl9zcXJ0W2JhY2tfY29sb3JdIC0gYmFja19jb2xvcikgLworICAgICAgICAgICAgICAgICAyNTU7CisgICAgfQorICAgIGNhc2UgRlhESUJfQkxFTkRfRElGRkVSRU5DRToKKyAgICAgIHJldHVybiBiYWNrX2NvbG9yIDwgc3JjX2NvbG9yID8gc3JjX2NvbG9yIC0gYmFja19jb2xvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiYWNrX2NvbG9yIC0gc3JjX2NvbG9yOworICAgIGNhc2UgRlhESUJfQkxFTkRfRVhDTFVTSU9OOgorICAgICAgcmV0dXJuIGJhY2tfY29sb3IgKyBzcmNfY29sb3IgLSAyICogYmFja19jb2xvciAqIHNyY19jb2xvciAvIDI1NTsKKyAgfQorICByZXR1cm4gc3JjX2NvbG9yOworfQorCitzdHJ1Y3QgUkdCIHsKKyAgaW50IHJlZDsKKyAgaW50IGdyZWVuOworICBpbnQgYmx1ZTsKK307CisKK2ludCBMdW0oUkdCIGNvbG9yKSB7CisgIHJldHVybiAoY29sb3IucmVkICogMzAgKyBjb2xvci5ncmVlbiAqIDU5ICsgY29sb3IuYmx1ZSAqIDExKSAvIDEwMDsKK30KKworUkdCIENsaXBDb2xvcihSR0IgY29sb3IpIHsKKyAgaW50IGwgPSBMdW0oY29sb3IpOworICBpbnQgbiA9IHN0ZDo6bWluKGNvbG9yLnJlZCwgc3RkOjptaW4oY29sb3IuZ3JlZW4sIGNvbG9yLmJsdWUpKTsKKyAgaW50IHggPSBzdGQ6Om1heChjb2xvci5yZWQsIHN0ZDo6bWF4KGNvbG9yLmdyZWVuLCBjb2xvci5ibHVlKSk7CisgIGlmIChuIDwgMCkgeworICAgIGNvbG9yLnJlZCA9IGwgKyAoKGNvbG9yLnJlZCAtIGwpICogbCAvIChsIC0gbikpOworICAgIGNvbG9yLmdyZWVuID0gbCArICgoY29sb3IuZ3JlZW4gLSBsKSAqIGwgLyAobCAtIG4pKTsKKyAgICBjb2xvci5ibHVlID0gbCArICgoY29sb3IuYmx1ZSAtIGwpICogbCAvIChsIC0gbikpOworICB9CisgIGlmICh4ID4gMjU1KSB7CisgICAgY29sb3IucmVkID0gbCArICgoY29sb3IucmVkIC0gbCkgKiAoMjU1IC0gbCkgLyAoeCAtIGwpKTsKKyAgICBjb2xvci5ncmVlbiA9IGwgKyAoKGNvbG9yLmdyZWVuIC0gbCkgKiAoMjU1IC0gbCkgLyAoeCAtIGwpKTsKKyAgICBjb2xvci5ibHVlID0gbCArICgoY29sb3IuYmx1ZSAtIGwpICogKDI1NSAtIGwpIC8gKHggLSBsKSk7CisgIH0KKyAgcmV0dXJuIGNvbG9yOworfQorCitSR0IgU2V0THVtKFJHQiBjb2xvciwgaW50IGwpIHsKKyAgaW50IGQgPSBsIC0gTHVtKGNvbG9yKTsKKyAgY29sb3IucmVkICs9IGQ7CisgIGNvbG9yLmdyZWVuICs9IGQ7CisgIGNvbG9yLmJsdWUgKz0gZDsKKyAgcmV0dXJuIENsaXBDb2xvcihjb2xvcik7Cit9CisKK2ludCBTYXQoUkdCIGNvbG9yKSB7CisgIHJldHVybiBzdGQ6Om1heChjb2xvci5yZWQsIHN0ZDo6bWF4KGNvbG9yLmdyZWVuLCBjb2xvci5ibHVlKSkgLQorICAgICAgICAgc3RkOjptaW4oY29sb3IucmVkLCBzdGQ6Om1pbihjb2xvci5ncmVlbiwgY29sb3IuYmx1ZSkpOworfQorCitSR0IgU2V0U2F0KFJHQiBjb2xvciwgaW50IHMpIHsKKyAgaW50IG1pbiA9IHN0ZDo6bWluKGNvbG9yLnJlZCwgc3RkOjptaW4oY29sb3IuZ3JlZW4sIGNvbG9yLmJsdWUpKTsKKyAgaW50IG1heCA9IHN0ZDo6bWF4KGNvbG9yLnJlZCwgc3RkOjptYXgoY29sb3IuZ3JlZW4sIGNvbG9yLmJsdWUpKTsKKyAgaWYgKG1pbiA9PSBtYXgpCisgICAgcmV0dXJuIHswLCAwLCAwfTsKKworICBjb2xvci5yZWQgPSAoY29sb3IucmVkIC0gbWluKSAqIHMgLyAobWF4IC0gbWluKTsKKyAgY29sb3IuZ3JlZW4gPSAoY29sb3IuZ3JlZW4gLSBtaW4pICogcyAvIChtYXggLSBtaW4pOworICBjb2xvci5ibHVlID0gKGNvbG9yLmJsdWUgLSBtaW4pICogcyAvIChtYXggLSBtaW4pOworICByZXR1cm4gY29sb3I7Cit9CisKK3ZvaWQgUkdCX0JsZW5kKGludCBibGVuZF9tb2RlLAorICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICBpbnQgcmVzdWx0c1szXSkgeworICBSR0IgcmVzdWx0ID0gezAsIDAsIDB9OworICBSR0Igc3JjOworICBzcmMucmVkID0gc3JjX3NjYW5bMl07CisgIHNyYy5ncmVlbiA9IHNyY19zY2FuWzFdOworICBzcmMuYmx1ZSA9IHNyY19zY2FuWzBdOworICBSR0IgYmFjazsKKyAgYmFjay5yZWQgPSBkZXN0X3NjYW5bMl07CisgIGJhY2suZ3JlZW4gPSBkZXN0X3NjYW5bMV07CisgIGJhY2suYmx1ZSA9IGRlc3Rfc2NhblswXTsKKyAgc3dpdGNoIChibGVuZF9tb2RlKSB7CisgICAgY2FzZSBGWERJQl9CTEVORF9IVUU6CisgICAgICByZXN1bHQgPSBTZXRMdW0oU2V0U2F0KHNyYywgU2F0KGJhY2spKSwgTHVtKGJhY2spKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhESUJfQkxFTkRfU0FUVVJBVElPTjoKKyAgICAgIHJlc3VsdCA9IFNldEx1bShTZXRTYXQoYmFjaywgU2F0KHNyYykpLCBMdW0oYmFjaykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWERJQl9CTEVORF9DT0xPUjoKKyAgICAgIHJlc3VsdCA9IFNldEx1bShzcmMsIEx1bShiYWNrKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYRElCX0JMRU5EX0xVTUlOT1NJVFk6CisgICAgICByZXN1bHQgPSBTZXRMdW0oYmFjaywgTHVtKHNyYykpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmVzdWx0c1swXSA9IHJlc3VsdC5ibHVlOworICByZXN1bHRzWzFdID0gcmVzdWx0LmdyZWVuOworICByZXN1bHRzWzJdID0gcmVzdWx0LnJlZDsKK30KKworaW50IEdldEFscGhhKHVpbnQ4X3Qgc3JjX2FscGhhLCBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sIGludCBjb2wpIHsKKyAgcmV0dXJuIGNsaXBfc2NhbiA/IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1IDogc3JjX2FscGhhOworfQorCit2b2lkIENvbXBvc2l0ZVJvd19BbHBoYVRvTWFzayh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc3RyaWRlKSB7CisgIHNyY19zY2FuICs9IHN0cmlkZSAtIDE7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyArK2NvbCkgeworICAgIGludCBzcmNfYWxwaGEgPSBHZXRBbHBoYSgqc3JjX3NjYW4sIGNsaXBfc2NhbiwgY29sKTsKKyAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9zY2FuOworICAgIGlmICghYmFja19hbHBoYSkKKyAgICAgICpkZXN0X3NjYW4gPSBzcmNfYWxwaGE7CisgICAgZWxzZSBpZiAoc3JjX2FscGhhKQorICAgICAgKmRlc3Rfc2NhbiA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICsrZGVzdF9zY2FuOworICAgIHNyY19zY2FuICs9IHN0cmlkZTsKKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd19SZ2IyTWFzayh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBpZiAoIWNsaXBfc2NhbikgeworICAgIG1lbXNldChkZXN0X3NjYW4sIDB4ZmYsIHdpZHRoKTsKKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX1VOSU9OKCpkZXN0X3NjYW4sICpjbGlwX3NjYW4pOworICAgICsrZGVzdF9zY2FuOworICAgICsrY2xpcF9zY2FuOworICB9Cit9CisKK3VpbnQ4X3QgR2V0R3JheShjb25zdCB1aW50OF90KiBzcmNfc2NhbikgeworICByZXR1cm4gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7Cit9CisKK3VpbnQ4X3QgR2V0R3JheVdpdGhCbGVuZChjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgdWludDhfdCBncmF5ID0gR2V0R3JheShzcmNfc2Nhbik7CisgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkKKyAgICBncmF5ID0gYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47CisgIGVsc2UgaWYgKGJsZW5kX3R5cGUpCisgICAgZ3JheSA9IEJsZW5kKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOworICByZXR1cm4gZ3JheTsKK30KKwordm9pZCBDb21wb3NpdGVSb3dfQXJnYjJHcmF5YSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3RfYWxwaGFfc2NhbikgeworICB1aW50OF90IG9mZnNldCA9IHNyY19hbHBoYV9zY2FuID8gMyA6IDQ7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyArK2NvbCkgeworICAgIGNvbnN0IHVpbnQ4X3QqIGFscGhhX3NjYW4gPQorICAgICAgICBzcmNfYWxwaGFfc2NhbiA/IHNyY19hbHBoYV9zY2FuKysgOiAmc3JjX3NjYW5bM107CisgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRzdF9hbHBoYV9zY2FuOworICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgIGludCBzcmNfYWxwaGEgPSBHZXRBbHBoYSgqYWxwaGFfc2NhbiwgY2xpcF9zY2FuLCBjb2wpOworICAgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgICAqZGVzdF9zY2FuID0gR2V0R3JheShzcmNfc2Nhbik7CisgICAgICAgICpkc3RfYWxwaGFfc2NhbiA9IHNyY19hbHBoYTsKKyAgICAgIH0KKyAgICAgICsrZGVzdF9zY2FuOworICAgICAgKytkc3RfYWxwaGFfc2NhbjsKKyAgICAgIHNyY19zY2FuICs9IG9mZnNldDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB1aW50OF90IHNyY19hbHBoYSA9IEdldEFscGhhKCphbHBoYV9zY2FuLCBjbGlwX3NjYW4sIGNvbCk7CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICArK2Rlc3Rfc2NhbjsKKyAgICAgICsrZHN0X2FscGhhX3NjYW47CisgICAgICBzcmNfc2NhbiArPSBvZmZzZXQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgKmRzdF9hbHBoYV9zY2FuID0gRlhESUJfQUxQSEFfVU5JT04oYmFja19hbHBoYSwgc3JjX2FscGhhKTsKKyAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyAoKmRzdF9hbHBoYV9zY2FuKTsKKyAgICB1aW50OF90IGdyYXkgPSBHZXRHcmF5KHNyY19zY2FuKTsKKyAgICAvLyBUT0RPKG5wbSk6IERvZXMgdGhpcyBpZiByZWFsbHkgbmVlZCBzcmNfYWxwaGFfc2NhbiBvciB3YXMgdGhhdCBhIGJ1Zz8KKyAgICBpZiAoYmxlbmRfdHlwZSAmJiBzcmNfYWxwaGFfc2NhbikgeworICAgICAgaWYgKGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFKQorICAgICAgICBncmF5ID0gYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47CisgICAgICBlbHNlCisgICAgICAgIGdyYXkgPSBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKKyAgICB9CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGFscGhhX3JhdGlvKTsKKyAgICArK2Rlc3Rfc2NhbjsKKyAgICArK2RzdF9hbHBoYV9zY2FuOworICAgIHNyY19zY2FuICs9IG9mZnNldDsKKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd19BcmdiMkdyYXkodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4pIHsKKyAgdWludDhfdCBncmF5OworICB1aW50OF90IG9mZnNldCA9IHNyY19hbHBoYV9zY2FuID8gMyA6IDQ7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyArK2NvbCkgeworICAgIGNvbnN0IHVpbnQ4X3QqIGFscGhhX3NjYW4gPQorICAgICAgICBzcmNfYWxwaGFfc2NhbiA/IHNyY19hbHBoYV9zY2FuKysgOiAmc3JjX3NjYW5bM107CisgICAgaW50IHNyY19hbHBoYSA9IEdldEFscGhhKCphbHBoYV9zY2FuLCBjbGlwX3NjYW4sIGNvbCk7CisgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgZ3JheSA9IEdldEdyYXlXaXRoQmxlbmQoc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRfdHlwZSk7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgc3JjX2FscGhhKTsKKyAgICB9CisgICAgKytkZXN0X3NjYW47CisgICAgc3JjX3NjYW4gKz0gb2Zmc2V0OworICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlUm93X1JnYjJHcmF5KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICB1aW50OF90IGdyYXk7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyArK2NvbCkgeworICAgIGdyYXkgPSBHZXRHcmF5V2l0aEJsZW5kKHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kX3R5cGUpOworICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpCisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY2xpcF9zY2FuW2NvbF0pOworICAgIGVsc2UKKyAgICAgICpkZXN0X3NjYW4gPSBncmF5OworICAgICsrZGVzdF9zY2FuOworICAgIHNyY19zY2FuICs9IHNyY19CcHA7CisgIH0KK30KKwordm9pZCBDb21wb3NpdGVSb3dfUmdiMkdyYXlhKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgKytjb2wpIHsKKyAgICBpZiAoYmxlbmRfdHlwZSAmJiAqZGVzdF9hbHBoYV9zY2FuID09IDApIHsKKyAgICAgICpkZXN0X3NjYW4gPSBHZXRHcmF5KHNyY19zY2FuKTsKKyAgICAgICsrZGVzdF9zY2FuOworICAgICAgKytkZXN0X2FscGhhX3NjYW47CisgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW4gPyBjbGlwX3NjYW5bY29sXSA6IDI1NTsKKyAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgKmRlc3Rfc2NhbiA9IEdldEdyYXlXaXRoQmxlbmQoc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRfdHlwZSk7CisgICAgICArK2Rlc3Rfc2NhbjsKKyAgICAgICpkZXN0X2FscGhhX3NjYW4gPSAyNTU7CisgICAgICArK2Rlc3RfYWxwaGFfc2NhbjsKKyAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICArK2Rlc3Rfc2NhbjsKKyAgICAgICsrZGVzdF9hbHBoYV9zY2FuOworICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47CisgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgKmRlc3RfYWxwaGFfc2NhbiA9IGRlc3RfYWxwaGE7CisgICAgKytkZXN0X2FscGhhX3NjYW47CisgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICB1aW50OF90IGdyYXkgPSBHZXRHcmF5V2l0aEJsZW5kKHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kX3R5cGUpOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7CisgICAgKytkZXN0X3NjYW47CisgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd19BcmdiMkFyZ2IodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuKSB7CisgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgdWludDhfdCBkZXN0X29mZnNldCA9IGRlc3RfYWxwaGFfc2NhbiA/IDMgOiA0OworICB1aW50OF90IHNyY19vZmZzZXQgPSBzcmNfYWxwaGFfc2NhbiA/IDMgOiA0OworICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICBib29sIGhhc19zcmMgPSAhIXNyY19hbHBoYV9zY2FuOworICBib29sIGhhc19kZXN0ID0gISFkZXN0X2FscGhhX3NjYW47CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyArK2NvbCkgeworICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGhhc19kZXN0ID8gKmRlc3RfYWxwaGFfc2NhbiA6IGRlc3Rfc2NhblszXTsKKyAgICBjb25zdCB1aW50OF90KiBhbHBoYV9zb3VyY2UgPSBoYXNfc3JjID8gc3JjX2FscGhhX3NjYW4rKyA6ICZzcmNfc2NhblszXTsKKyAgICB1aW50OF90IHNyY19hbHBoYSA9IEdldEFscGhhKCphbHBoYV9zb3VyY2UsIGNsaXBfc2NhbiwgY29sKTsKKyAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICBpZiAoIWhhc19kZXN0ICYmICFoYXNfc3JjKSB7CisgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgKEZYQVJHQl9HRVRESUIoc3JjX3NjYW4pICYgMHhmZmZmZmYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcmNfYWxwaGEgPDwgMjQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBGWEFSR0JfQ09QWShkZXN0X3NjYW4sIHNyY19zY2FuKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChoYXNfZGVzdCkgeworICAgICAgICAqZGVzdF9hbHBoYV9zY2FuID0gc3JjX2FscGhhOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICAgICpkZXN0X3NjYW4gPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgICArK2Rlc3Rfc2NhbjsKKyAgICAgICAgfQorICAgICAgICArK2Rlc3RfYWxwaGFfc2NhbjsKKyAgICAgICAgaWYgKCFoYXNfc3JjKQorICAgICAgICAgICsrc3JjX3NjYW47CisgICAgICB9IGVsc2UgeworICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0UoKHNyY19hbHBoYSA8PCAyNCksIHNyY19zY2FuWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW5bMV0sICpzcmNfc2NhbikpOworICAgICAgfQorICAgICAgaWYgKCFoYXNfZGVzdCkgeworICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9vZmZzZXQ7CisgICAgICAgIHNyY19zY2FuICs9IHNyY19vZmZzZXQ7CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9vZmZzZXQ7CisgICAgICBzcmNfc2NhbiArPSBzcmNfb2Zmc2V0OworICAgICAgaWYgKGhhc19kZXN0KQorICAgICAgICArK2Rlc3RfYWxwaGFfc2NhbjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICBpZiAoaGFzX2Rlc3QpIHsKKyAgICAgICpkZXN0X2FscGhhX3NjYW4gPSBkZXN0X2FscGhhOworICAgICAgKytkZXN0X2FscGhhX3NjYW47CisgICAgfSBlbHNlIHsKKyAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgfQorICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkKKyAgICAgIFJHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7CisgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7ICsrY29sb3IpIHsKKyAgICAgIGlmIChibGVuZF90eXBlKSB7CisgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogQmxlbmQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgKnNyY19zY2FuKTsKKyAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKCpzcmNfc2NhbiwgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgICB9IGVsc2UgeworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19zY2FuLCBhbHBoYV9yYXRpbyk7CisgICAgICB9CisgICAgICArK2Rlc3Rfc2NhbjsKKyAgICAgICsrc3JjX3NjYW47CisgICAgfQorICAgIGlmICghaGFzX2Rlc3QpCisgICAgICArK2Rlc3Rfc2NhbjsKKyAgICBpZiAoIWhhc19zcmMpCisgICAgICArK3NyY19zY2FuOworICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX05vQ2xpcCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbikgeworICBpbnQgYmxlbmRlZF9jb2xvcnNbM107CisgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyArK2NvbCkgeworICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGEgPSBkZXN0X2FscGhhX3NjYW4gPyBkZXN0X2FscGhhX3NjYW4gOiAmZGVzdF9zY2FuWzNdOworICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhOworICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgIGlmIChkZXN0X2FscGhhX3NjYW4pIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgICAqZGVzdF9zY2FuID0gKnNyY19zY2FuKys7CisgICAgICAgICAgKytkZXN0X3NjYW47CisgICAgICAgIH0KKyAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9IDB4ZmY7CisgICAgICAgICsrZGVzdF9hbHBoYV9zY2FuOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNyY19CcHAgPT0gNCkgeworICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCAweGZmMDAwMDAwIHwgRlhBUkdCX0dFVERJQihzcmNfc2NhbikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRSgweGZmLCBzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuWzBdKSk7CisgICAgICAgIH0KKyAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICB9CisgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICAgICAgY29udGludWU7CisgICAgfQorICAgICpkZXN0X2FscGhhID0gMHhmZjsKKyAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKQorICAgICAgUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKKyAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgKytjb2xvcikgeworICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKKyAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCisgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQorICAgICAgICAgICAgICAgICAgICAgICAgOiBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfY29sb3IpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19jb2xvciwgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICArK2Rlc3Rfc2NhbjsKKyAgICAgICsrc3JjX3NjYW47CisgICAgfQorICAgIGlmIChkZXN0X2FscGhhX3NjYW4pCisgICAgICArK2Rlc3RfYWxwaGFfc2NhbjsKKyAgICBlbHNlCisgICAgICArK2Rlc3Rfc2NhbjsKKyAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOworICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX0NsaXAodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuKSB7CisgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKKyAgYm9vbCBoYXNfZGVzdCA9ICEhZGVzdF9hbHBoYV9zY2FuOworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgKytjb2wpIHsKKyAgICBpbnQgc3JjX2FscGhhID0gKmNsaXBfc2NhbisrOworICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGhhc19kZXN0ID8gKmRlc3RfYWxwaGFfc2NhbiA6IGRlc3Rfc2NhblszXTsKKyAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgeworICAgICAgICAqZGVzdF9zY2FuID0gKnNyY19zY2FuKys7CisgICAgICAgICsrZGVzdF9zY2FuOworICAgICAgfQorICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgICAgIGlmIChoYXNfZGVzdCkKKyAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICBlbHNlCisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuICs9IGhhc19kZXN0ID8gMyA6IDQ7CisgICAgICBpZiAoaGFzX2Rlc3QpCisgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICBpZiAoaGFzX2Rlc3QpCisgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgIGVsc2UKKyAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKQorICAgICAgUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKKyAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKKyAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCisgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQorICAgICAgICAgICAgICAgICAgICAgICAgOiBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfY29sb3IpOworICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19jb2xvciwgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBzcmNfc2NhbisrOworICAgIH0KKyAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOworICAgIGlmICghaGFzX2Rlc3QpCisgICAgICBkZXN0X3NjYW4rKzsKKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd19SZ2IyQXJnYl9Ob0JsZW5kX0NsaXAodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuKSB7CisgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7CisgIGlmIChkZXN0X2FscGhhX3NjYW4pIHsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IDI1NTsKKyAgICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgICAgZGVzdF9zY2FuICs9IDM7CisgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGludCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKKyAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCAqc3JjX3NjYW4sIGFscGhhX3JhdGlvKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIHNyY19zY2FuKys7CisgICAgICB9CisgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IDI1NTsKKyAgICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaW50IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19zY2FuLCBhbHBoYV9yYXRpbyk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBzcmNfc2NhbisrOworICAgICAgfQorICAgICAgZGVzdF9zY2FuKys7CisgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOworICAgIH0KKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd19SZ2IyQXJnYl9Ob0JsZW5kX05vQ2xpcCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuKSB7CisgIGlmIChkZXN0X2FscGhhX3NjYW4pIHsKKyAgICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gMHhmZjsKKyAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgaWYgKHNyY19CcHAgPT0gNCkgeworICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgMHhmZjAwMDAwMCB8IEZYQVJHQl9HRVRESUIoc3JjX3NjYW4pKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9NQUtFKDB4ZmYsIHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgc3JjX3NjYW5bMF0pKTsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICB9CisgIH0KK30KKwordm9pZCBDb21wb3NpdGVSb3dfQXJnYjJSZ2JfQmxlbmQodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuKSB7CisgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgaW50IGRlc3RfZ2FwID0gZGVzdF9CcHAgLSAzOworICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOworICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICBzcmNfYWxwaGEgPSAoKnNyY19hbHBoYV9zY2FuKyspICogKCpjbGlwX3NjYW4rKykgLyAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgeworICAgICAgICBSR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOworICAgICAgfQorICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgICAgaW50IGJhY2tfY29sb3IgPSAqZGVzdF9zY2FuOworICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQorICAgICAgICAgICAgICAgICAgICAgICAgICA6IEJsZW5kKGJsZW5kX3R5cGUsIGJhY2tfY29sb3IsICpzcmNfc2Nhbik7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRShiYWNrX2NvbG9yLCBibGVuZGVkLCBzcmNfYWxwaGEpOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgc3JjX3NjYW4rKzsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X2dhcDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgICB1aW50OF90IHNyY19hbHBoYTsKKyAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM10gKiAoKmNsaXBfc2NhbisrKSAvIDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKKyAgICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICAgIFJHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7CisgICAgICB9CisgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgICBpbnQgYmFja19jb2xvciA9ICpkZXN0X3NjYW47CisgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogQmxlbmQoYmxlbmRfdHlwZSwgYmFja19jb2xvciwgKnNyY19zY2FuKTsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBzcmNfc2NhbisrOworICAgICAgfQorICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOworICAgICAgc3JjX3NjYW4rKzsKKyAgICB9CisgIH0KK30KKwordm9pZCBDb21wb3NpdGVSb3dfQXJnYjJSZ2JfTm9CbGVuZCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYWxwaGFfc2NhbikgeworICBpbnQgZGVzdF9nYXAgPSBkZXN0X0JwcCAtIDM7CisgIGlmIChzcmNfYWxwaGFfc2NhbikgeworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgdWludDhfdCBzcmNfYWxwaGE7CisgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgIHNyY19hbHBoYSA9ICgqc3JjX2FscGhhX3NjYW4rKykgKiAoKmNsaXBfc2NhbisrKSAvIDI1NTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgICAgIHNyY19zY2FuICs9IDM7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2Nhbiwgc3JjX2FscGhhKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIHNyY19zY2FuKys7CisgICAgICB9CisgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgdWludDhfdCBzcmNfYWxwaGE7CisgICAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzNdICogKCpjbGlwX3NjYW4rKykgLyAyNTU7CisgICAgICB9IGVsc2UgeworICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKKyAgICAgIH0KKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOworICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7CisgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X2dhcDsKKyAgICAgICAgc3JjX3NjYW4rKzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOworICAgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCAqc3JjX3NjYW4sIHNyY19hbHBoYSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBzcmNfc2NhbisrOworICAgICAgfQorICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOworICAgICAgc3JjX3NjYW4rKzsKKyAgICB9CisgIH0KK30KKwordm9pZCBDb21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9Ob0NsaXAodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwKSB7CisgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgaW50IGRlc3RfZ2FwID0gZGVzdF9CcHAgLSAzOworICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICBSR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOworICAgIH0KKyAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgaW50IGJhY2tfY29sb3IgPSAqZGVzdF9zY2FuOworICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKKyAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCisgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQorICAgICAgICAgICAgICAgICAgICAgICAgOiBCbGVuZChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCBzcmNfY29sb3IpOworICAgICAgKmRlc3Rfc2NhbiA9IGJsZW5kZWQ7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIHNyY19zY2FuKys7CisgICAgfQorICAgIGRlc3Rfc2NhbiArPSBkZXN0X2dhcDsKKyAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOworICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfQ2xpcCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICBpbnQgZGVzdF9nYXAgPSBkZXN0X0JwcCAtIDM7CisgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgIHVpbnQ4X3Qgc3JjX2FscGhhID0gKmNsaXBfc2NhbisrOworICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOworICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICBSR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOworICAgIH0KKyAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKKyAgICAgIGludCBiYWNrX2NvbG9yID0gKmRlc3Rfc2NhbjsKKyAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCisgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQorICAgICAgICAgICAgICAgICAgICAgICAgOiBCbGVuZChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCBzcmNfY29sb3IpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIHNyY19zY2FuKys7CisgICAgfQorICAgIGRlc3Rfc2NhbiArPSBkZXN0X2dhcDsKKyAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOworICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9Ob0NsaXAodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwKSB7CisgIGlmIChkZXN0X0JwcCA9PSBzcmNfQnBwKSB7CisgICAgbWVtY3B5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoICogZGVzdF9CcHApOworICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICBkZXN0X3NjYW5bMF0gPSBzcmNfc2NhblswXTsKKyAgICBkZXN0X3NjYW5bMV0gPSBzcmNfc2NhblsxXTsKKyAgICBkZXN0X3NjYW5bMl0gPSBzcmNfc2NhblsyXTsKKyAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfQ2xpcCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKKyAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgZGVzdF9zY2FuWzBdID0gc3JjX3NjYW5bMF07CisgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfc2NhblsxXTsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19zY2FuWzJdOworICAgIH0gZWxzZSBpZiAoc3JjX2FscGhhKSB7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19zY2FuLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBzcmNfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2Nhbiwgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgc3JjX3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCAqc3JjX3NjYW4sIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHAgLSAyOworICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcCAtIDI7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOworICAgIHNyY19zY2FuICs9IHNyY19CcHA7CisgIH0KK30KKwordm9pZCBDb21wb3NpdGVSb3dfOGJwcFBhbDJHcmF5KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuKSB7CisgIGlmIChzcmNfYWxwaGFfc2NhbikgeworICAgIGlmIChibGVuZF90eXBlKSB7CisgICAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICAgIHVpbnQ4X3QgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07CisgICAgICAgIGludCBzcmNfYWxwaGEgPSBHZXRBbHBoYSgqc3JjX2FscGhhX3NjYW4rKywgY2xpcF9zY2FuLCBjb2wpOworICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKQorICAgICAgICAgIGdyYXkgPSBibGVuZF90eXBlID09IEZYRElCX0JMRU5EX0xVTUlOT1NJVFkgPyBncmF5IDogKmRlc3Rfc2NhbjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGdyYXkgPSBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKKyAgICAgICAgaWYgKHNyY19hbHBoYSkKKyAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgc3JjX2FscGhhKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICpkZXN0X3NjYW4gPSBncmF5OworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgc3JjX3NjYW4rKzsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICB1aW50OF90IGdyYXkgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOworICAgICAgaW50IHNyY19hbHBoYSA9IEdldEFscGhhKCpzcmNfYWxwaGFfc2NhbisrLCBjbGlwX3NjYW4sIGNvbCk7CisgICAgICBpZiAoc3JjX2FscGhhKQorICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgc3JjX2FscGhhKTsKKyAgICAgIGVsc2UKKyAgICAgICAgKmRlc3Rfc2NhbiA9IGdyYXk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIHNyY19zY2FuKys7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChibGVuZF90eXBlKSB7CisgICAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICAgIHVpbnQ4X3QgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07CisgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpCisgICAgICAgICAgZ3JheSA9IGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOworICAgICAgICBlbHNlCisgICAgICAgICAgZ3JheSA9IEJsZW5kKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOworICAgICAgICBpZiAoY2xpcF9zY2FuICYmIGNsaXBfc2Nhbltjb2xdIDwgMjU1KQorICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBjbGlwX3NjYW5bY29sXSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAqZGVzdF9zY2FuID0gZ3JheTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIHNyY19zY2FuKys7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgdWludDhfdCBncmF5ID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKKyAgICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpCisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBjbGlwX3NjYW5bY29sXSk7CisgICAgICBlbHNlCisgICAgICAgICpkZXN0X3NjYW4gPSBncmF5OworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBzcmNfc2NhbisrOworICAgIH0KKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd184YnBwUGFsMkdyYXlhKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBQYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4pIHsKKyAgaWYgKHNyY19hbHBoYV9zY2FuKSB7CisgICAgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgICAgdWludDhfdCBncmF5ID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKKyAgICAgICAgc3JjX3NjYW4rKzsKKyAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKKyAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBHZXRBbHBoYSgqc3JjX2FscGhhX3NjYW4rKywgY2xpcF9zY2FuLCBjb2wpOworICAgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICAgICAgICpkZXN0X3NjYW4gPSBncmF5OworICAgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9IHNyY19hbHBoYTsKKyAgICAgICAgICB9CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCBzcmNfYWxwaGEgPSBHZXRBbHBoYSgqc3JjX2FscGhhX3NjYW4rKywgY2xpcF9zY2FuLCBjb2wpOworICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAqZGVzdF9hbHBoYV9zY2FuID0KKyAgICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyAoKmRlc3RfYWxwaGFfc2Nhbik7CisgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpCisgICAgICAgICAgZ3JheSA9IGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOworICAgICAgICBlbHNlCisgICAgICAgICAgZ3JheSA9IEJsZW5kKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOworICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgICAgdWludDhfdCBncmF5ID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKKyAgICAgIHNyY19zY2FuKys7CisgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOworICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgICBpbnQgc3JjX2FscGhhID0gR2V0QWxwaGEoKnNyY19hbHBoYV9zY2FuKyssIGNsaXBfc2NhbiwgY29sKTsKKyAgICAgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgICAgICpkZXN0X3NjYW4gPSBncmF5OworICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gPSBzcmNfYWxwaGE7CisgICAgICAgIH0KKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhID0gR2V0QWxwaGEoKnNyY19hbHBoYV9zY2FuKyssIGNsaXBfc2NhbiwgY29sKTsKKyAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gKCpkZXN0X2FscGhhX3NjYW4pOworICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChibGVuZF90eXBlKSB7CisgICAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICAgIHVpbnQ4X3QgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07CisgICAgICAgIHNyY19zY2FuKys7CisgICAgICAgIGlmICghY2xpcF9zY2FuIHx8IGNsaXBfc2Nhbltjb2xdID09IDI1NSkgeworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IGdyYXk7CisgICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gMjU1OworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKKyAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaW50IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOworICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7CisgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpCisgICAgICAgICAgZ3JheSA9IGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOworICAgICAgICBlbHNlCisgICAgICAgICAgZ3JheSA9IEJsZW5kKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICB1aW50OF90IGdyYXkgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOworICAgICAgc3JjX3NjYW4rKzsKKyAgICAgIGlmICghY2xpcF9zY2FuIHx8IGNsaXBfc2Nhbltjb2xdID09IDI1NSkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSBncmF5OworICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAyNTU7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOworICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnQgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47CisgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQorICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlUm93XzFicHBQYWwyR3JheSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBQYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgaW50IHJlc2V0X2dyYXkgPSBwUGFsZXR0ZVswXTsKKyAgaW50IHNldF9ncmF5ID0gcFBhbGV0dGVbMV07CisgIGlmIChibGVuZF90eXBlKSB7CisgICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgIHVpbnQ4X3QgZ3JheSA9CisgICAgICAgICAgKHNyY19zY2FuWyhjb2wgKyBzcmNfbGVmdCkgLyA4XSAmICgxIDw8ICg3IC0gKGNvbCArIHNyY19sZWZ0KSAlIDgpKSkKKyAgICAgICAgICAgICAgPyBzZXRfZ3JheQorICAgICAgICAgICAgICA6IHJlc2V0X2dyYXk7CisgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKQorICAgICAgICBncmF5ID0gYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47CisgICAgICBlbHNlCisgICAgICAgIGdyYXkgPSBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKKyAgICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNsaXBfc2Nhbltjb2xdKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICpkZXN0X3NjYW4gPSBncmF5OworICAgICAgfQorICAgICAgZGVzdF9zY2FuKys7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICB1aW50OF90IGdyYXkgPQorICAgICAgICAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKQorICAgICAgICAgICAgPyBzZXRfZ3JheQorICAgICAgICAgICAgOiByZXNldF9ncmF5OworICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBjbGlwX3NjYW5bY29sXSk7CisgICAgfSBlbHNlIHsKKyAgICAgICpkZXN0X3NjYW4gPSBncmF5OworICAgIH0KKyAgICBkZXN0X3NjYW4rKzsKKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd18xYnBwUGFsMkdyYXlhKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFBhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuKSB7CisgIGludCByZXNldF9ncmF5ID0gcFBhbGV0dGVbMF07CisgIGludCBzZXRfZ3JheSA9IHBQYWxldHRlWzFdOworICBpZiAoYmxlbmRfdHlwZSkgeworICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICB1aW50OF90IGdyYXkgPQorICAgICAgICAgIChzcmNfc2NhblsoY29sICsgc3JjX2xlZnQpIC8gOF0gJiAoMSA8PCAoNyAtIChjb2wgKyBzcmNfbGVmdCkgJSA4KSkpCisgICAgICAgICAgICAgID8gc2V0X2dyYXkKKyAgICAgICAgICAgICAgOiByZXNldF9ncmF5OworICAgICAgaWYgKCFjbGlwX3NjYW4gfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IGdyYXk7CisgICAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IDI1NTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07CisgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGludCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKKyAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9CisgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpCisgICAgICAgIGdyYXkgPSBibGVuZF90eXBlID09IEZYRElCX0JMRU5EX0xVTUlOT1NJVFkgPyBncmF5IDogKmRlc3Rfc2NhbjsKKyAgICAgIGVsc2UKKyAgICAgICAgZ3JheSA9IEJsZW5kKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgdWludDhfdCBncmF5ID0KKyAgICAgICAgKHNyY19zY2FuWyhjb2wgKyBzcmNfbGVmdCkgLyA4XSAmICgxIDw8ICg3IC0gKGNvbCArIHNyY19sZWZ0KSAlIDgpKSkKKyAgICAgICAgICAgID8gc2V0X2dyYXkKKyAgICAgICAgICAgIDogcmVzZXRfZ3JheTsKKyAgICBpZiAoIWNsaXBfc2NhbiB8fCBjbGlwX3NjYW5bY29sXSA9PSAyNTUpIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9IGdyYXk7CisgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAyNTU7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOworICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47CisgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuKys7CisgIH0KK30KKwordm9pZCBDb21wb3NpdGVSb3dfOGJwcFJnYjJSZ2JfTm9CbGVuZCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcFBhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IERlc3RCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4pIHsKKyAgaWYgKHNyY19hbHBoYV9zY2FuKSB7CisgICAgaW50IGRlc3RfZ2FwID0gRGVzdEJwcCAtIDM7CisgICAgRlhfQVJHQiBhcmdiID0gMDsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgIGFyZ2IgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOworICAgICAgaW50IHNyY19yID0gRlhBUkdCX1IoYXJnYik7CisgICAgICBpbnQgc3JjX2cgPSBGWEFSR0JfRyhhcmdiKTsKKyAgICAgIGludCBzcmNfYiA9IEZYQVJHQl9CKGFyZ2IpOworICAgICAgc3JjX3NjYW4rKzsKKyAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhID0gMDsKKyAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgc3JjX2FscGhhID0gKCpzcmNfYWxwaGFfc2NhbisrKSAqICgqY2xpcF9zY2FuKyspIC8gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfYjsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2c7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19yOworICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbiArPSBEZXN0QnBwOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X2dhcDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgRlhfQVJHQiBhcmdiID0gMDsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgIGFyZ2IgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOworICAgICAgaW50IHNyY19yID0gRlhBUkdCX1IoYXJnYik7CisgICAgICBpbnQgc3JjX2cgPSBGWEFSR0JfRyhhcmdiKTsKKyAgICAgIGludCBzcmNfYiA9IEZYQVJHQl9CKGFyZ2IpOworICAgICAgaWYgKGNsaXBfc2NhbiAmJiBjbGlwX3NjYW5bY29sXSA8IDI1NSkgeworICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGNsaXBfc2Nhbltjb2xdKTsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgY2xpcF9zY2FuW2NvbF0pOworICAgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBjbGlwX3NjYW5bY29sXSk7CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2I7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19nOworICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcjsKKyAgICAgIH0KKyAgICAgIGlmIChEZXN0QnBwID09IDQpIHsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICB9CisgICAgICBzcmNfc2NhbisrOworICAgIH0KKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd18xYnBwUmdiMlJnYl9Ob0JsZW5kKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBQYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBEZXN0QnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgaW50IHJlc2V0X3IsIHJlc2V0X2csIHJlc2V0X2I7CisgIGludCBzZXRfciwgc2V0X2csIHNldF9iOworICByZXNldF9yID0gRlhBUkdCX1IocFBhbGV0dGVbMF0pOworICByZXNldF9nID0gRlhBUkdCX0cocFBhbGV0dGVbMF0pOworICByZXNldF9iID0gRlhBUkdCX0IocFBhbGV0dGVbMF0pOworICBzZXRfciA9IEZYQVJHQl9SKHBQYWxldHRlWzFdKTsKKyAgc2V0X2cgPSBGWEFSR0JfRyhwUGFsZXR0ZVsxXSk7CisgIHNldF9iID0gRlhBUkdCX0IocFBhbGV0dGVbMV0pOworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpbnQgc3JjX3IsIHNyY19nLCBzcmNfYjsKKyAgICBpZiAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKSB7CisgICAgICBzcmNfciA9IHNldF9yOworICAgICAgc3JjX2cgPSBzZXRfZzsKKyAgICAgIHNyY19iID0gc2V0X2I7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY19yID0gcmVzZXRfcjsKKyAgICAgIHNyY19nID0gcmVzZXRfZzsKKyAgICAgIHNyY19iID0gcmVzZXRfYjsKKyAgICB9CisgICAgaWYgKGNsaXBfc2NhbiAmJiBjbGlwX3NjYW5bY29sXSA8IDI1NSkgeworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBjbGlwX3NjYW5bY29sXSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgY2xpcF9zY2FuW2NvbF0pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIGNsaXBfc2Nhbltjb2xdKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgIH0gZWxzZSB7CisgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfYjsKKyAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19nOworICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3I7CisgICAgfQorICAgIGlmIChEZXN0QnBwID09IDQpIHsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgIH0KKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd184YnBwUmdiMkFyZ2JfTm9CbGVuZCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuKSB7CisgIGlmIChzcmNfYWxwaGFfc2NhbikgeworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgRlhfQVJHQiBhcmdiID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKKyAgICAgIHNyY19zY2FuKys7CisgICAgICBpbnQgc3JjX3IgPSBGWEFSR0JfUihhcmdiKTsKKyAgICAgIGludCBzcmNfZyA9IEZYQVJHQl9HKGFyZ2IpOworICAgICAgaW50IHNyY19iID0gRlhBUkdCX0IoYXJnYik7CisgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiAoKnNyY19hbHBoYV9zY2FuKSAvIDI1NTsKKyAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0Uoc3JjX2FscGhhLCBzcmNfciwgc3JjX2csIHNyY19iKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfTUFLRSgqc3JjX2FscGhhX3NjYW4sIHNyY19yLCBzcmNfZywgc3JjX2IpKTsKKyAgICAgICAgfQorICAgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgICAgc3JjX2FscGhhX3NjYW4rKzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB1aW50OF90IHNyY19hbHBoYTsKKyAgICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiAoKnNyY19hbHBoYV9zY2FuKyspIC8gMjU1OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7CisgICAgICB9CisgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgZGVzdF9zY2FuKys7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgICAgRlhfQVJHQiBhcmdiID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKKyAgICAgIGludCBzcmNfciA9IEZYQVJHQl9SKGFyZ2IpOworICAgICAgaW50IHNyY19nID0gRlhBUkdCX0coYXJnYik7CisgICAgICBpbnQgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKKyAgICAgIGlmICghY2xpcF9zY2FuIHx8IGNsaXBfc2Nhbltjb2xdID09IDI1NSkgeworICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfYjsKKyAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2c7CisgICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19yOworICAgICAgICAqZGVzdF9zY2FuKysgPSAyNTU7CisgICAgICAgIHNyY19zY2FuKys7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOworICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgICBzcmNfc2NhbisrOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGludCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KKyAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBzcmNfc2NhbisrOworICAgIH0KKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd18xYnBwUmdiMkFyZ2JfTm9CbGVuZCh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBpbnQgcmVzZXRfciwgcmVzZXRfZywgcmVzZXRfYjsKKyAgaW50IHNldF9yLCBzZXRfZywgc2V0X2I7CisgIHJlc2V0X3IgPSBGWEFSR0JfUihwUGFsZXR0ZVswXSk7CisgIHJlc2V0X2cgPSBGWEFSR0JfRyhwUGFsZXR0ZVswXSk7CisgIHJlc2V0X2IgPSBGWEFSR0JfQihwUGFsZXR0ZVswXSk7CisgIHNldF9yID0gRlhBUkdCX1IocFBhbGV0dGVbMV0pOworICBzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzFdKTsKKyAgc2V0X2IgPSBGWEFSR0JfQihwUGFsZXR0ZVsxXSk7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgIGludCBzcmNfciwgc3JjX2csIHNyY19iOworICAgIGlmIChzcmNfc2NhblsoY29sICsgc3JjX2xlZnQpIC8gOF0gJiAoMSA8PCAoNyAtIChjb2wgKyBzcmNfbGVmdCkgJSA4KSkpIHsKKyAgICAgIHNyY19yID0gc2V0X3I7CisgICAgICBzcmNfZyA9IHNldF9nOworICAgICAgc3JjX2IgPSBzZXRfYjsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX3IgPSByZXNldF9yOworICAgICAgc3JjX2cgPSByZXNldF9nOworICAgICAgc3JjX2IgPSByZXNldF9iOworICAgIH0KKyAgICBpZiAoIWNsaXBfc2NhbiB8fCBjbGlwX3NjYW5bY29sXSA9PSAyNTUpIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19iOworICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2c7CisgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcjsKKyAgICAgICpkZXN0X3NjYW4rKyA9IDI1NTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOworICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuKys7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuKys7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuKys7CisgICAgZGVzdF9zY2FuKys7CisgIH0KK30KKwordm9pZCBDb21wb3NpdGVSb3dfMWJwcFJnYjJSZ2JhX05vQmxlbmQodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcFBhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4pIHsKKyAgaW50IHJlc2V0X3IsIHJlc2V0X2csIHJlc2V0X2I7CisgIGludCBzZXRfciwgc2V0X2csIHNldF9iOworICByZXNldF9yID0gRlhBUkdCX1IocFBhbGV0dGVbMF0pOworICByZXNldF9nID0gRlhBUkdCX0cocFBhbGV0dGVbMF0pOworICByZXNldF9iID0gRlhBUkdCX0IocFBhbGV0dGVbMF0pOworICBzZXRfciA9IEZYQVJHQl9SKHBQYWxldHRlWzFdKTsKKyAgc2V0X2cgPSBGWEFSR0JfRyhwUGFsZXR0ZVsxXSk7CisgIHNldF9iID0gRlhBUkdCX0IocFBhbGV0dGVbMV0pOworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICBpbnQgc3JjX3IsIHNyY19nLCBzcmNfYjsKKyAgICBpZiAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKSB7CisgICAgICBzcmNfciA9IHNldF9yOworICAgICAgc3JjX2cgPSBzZXRfZzsKKyAgICAgIHNyY19iID0gc2V0X2I7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY19yID0gcmVzZXRfcjsKKyAgICAgIHNyY19nID0gcmVzZXRfZzsKKyAgICAgIHNyY19iID0gcmVzZXRfYjsKKyAgICB9CisgICAgaWYgKCFjbGlwX3NjYW4gfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7CisgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfYjsKKyAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19nOworICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3I7CisgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAyNTU7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOworICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuICs9IDM7CisgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47CisgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbisrOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbisrOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbisrOworICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlUm93X0J5dGVNYXNrMkFyZ2IodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuW2NvbF0gLyAyNTUgLyAyNTU7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBzcmNfc2Nhbltjb2xdIC8gMjU1OworICAgIH0KKyAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKHNyY19hbHBoYSwgc3JjX3IsIHNyY19nLCBzcmNfYikpOworICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOworICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgaWYgKGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFKSB7CisgICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107CisgICAgICB1aW50OF90IHNjYW5bM10gPSB7c3RhdGljX2Nhc3Q8dWludDhfdD4oc3JjX2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyY19nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihzcmNfcil9OworICAgICAgUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOworICAgICAgKmRlc3Rfc2NhbiA9CisgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMF0sIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9CisgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMV0sIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9CisgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMl0sIGFscGhhX3JhdGlvKTsKKyAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICAgIGludCBibGVuZGVkID0gQmxlbmQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2IpOworICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19iLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfZyk7CisgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2csIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgYmxlbmRlZCA9IEJsZW5kKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19yKTsKKyAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfciwgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgIH0gZWxzZSB7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgYWxwaGFfcmF0aW8pOworICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gMjsKKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd19CeXRlTWFzazJSZ2JhKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuW2NvbF0gLyAyNTUgLyAyNTU7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBzcmNfc2Nhbltjb2xdIC8gMjU1OworICAgIH0KKyAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOworICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19iOworICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2c7CisgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcjsKKyAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IHNyY19hbHBoYTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbiArPSAzOworICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgeworICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICAgICAgdWludDhfdCBzY2FuWzNdID0ge3N0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyY19iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihzcmNfZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oc3JjX3IpfTsKKyAgICAgIFJHQl9CbGVuZChibGVuZF90eXBlLCBzY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKKyAgICAgICpkZXN0X3NjYW4gPQorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzBdLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPQorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzFdLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPQorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzJdLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICAgIGludCBibGVuZGVkID0gQmxlbmQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2IpOworICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19iLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfZyk7CisgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2csIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgYmxlbmRlZCA9IEJsZW5kKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19yKTsKKyAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfciwgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgfSBlbHNlIHsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICB9CisgIH0KK30KKwordm9pZCBDb21wb3NpdGVSb3dfQnl0ZU1hc2syUmdiKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYTsKKyAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogc3JjX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgeworICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICAgICAgdWludDhfdCBzY2FuWzNdID0ge3N0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyY19iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihzcmNfZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oc3JjX3IpfTsKKyAgICAgIFJHQl9CbGVuZChibGVuZF90eXBlLCBzY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1swXSwgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzFdLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMl0sIHNyY19hbHBoYSk7CisgICAgfSBlbHNlIGlmIChibGVuZF90eXBlKSB7CisgICAgICBpbnQgYmxlbmRlZCA9IEJsZW5kKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19iKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBibGVuZGVkID0gQmxlbmQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2cpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfcik7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgc3JjX2FscGhhKTsKKyAgICB9IGVsc2UgeworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgc3JjX2FscGhhKTsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IEJwcCAtIDI7CisgIH0KK30KKwordm9pZCBDb21wb3NpdGVSb3dfQnl0ZU1hc2syTWFzayh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYTsKKyAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogc3JjX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9CisgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3Rfc2NhbjsKKyAgICBpZiAoIWJhY2tfYWxwaGEpIHsKKyAgICAgICpkZXN0X3NjYW4gPSBzcmNfYWxwaGE7CisgICAgfSBlbHNlIGlmIChzcmNfYWxwaGEpIHsKKyAgICAgICpkZXN0X3NjYW4gPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICB9CisgICAgZGVzdF9zY2FuKys7CisgIH0KK30KKwordm9pZCBDb21wb3NpdGVSb3dfQnl0ZU1hc2syR3JheSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19ncmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuW2NvbF0gLyAyNTUgLyAyNTU7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBzcmNfc2Nhbltjb2xdIC8gMjU1OworICAgIH0KKyAgICBpZiAoc3JjX2FscGhhKSB7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2dyYXksIHNyY19hbHBoYSk7CisgICAgfQorICAgIGRlc3Rfc2NhbisrOworICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlUm93X0J5dGVNYXNrMkdyYXlhKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2dyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4pIHsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYTsKKyAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogc3JjX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9CisgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKKyAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7CisgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfZ3JheTsKKyAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IHNyY19hbHBoYTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgZGVzdF9hbHBoYV9zY2FuKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKKyAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZ3JheSwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbisrOworICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlUm93X0JpdE1hc2syQXJnYih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgaWYgKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMICYmICFjbGlwX3NjYW4gJiYgbWFza19hbHBoYSA9PSAyNTUpIHsKKyAgICBGWF9BUkdCIGFyZ2IgPSBGWEFSR0JfTUFLRSgweGZmLCBzcmNfciwgc3JjX2csIHNyY19iKTsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgIGlmIChzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpIHsKKyAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIGFyZ2IpOworICAgICAgfQorICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpZiAoIShzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpKSB7CisgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgc3JjX2FscGhhOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYTsKKyAgICB9CisgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGEsIHNyY19yLCBzcmNfZywgc3JjX2IpKTsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgY29udGludWU7CisgICAgfQorICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICBpZiAoYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUpIHsKKyAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgICAgIHVpbnQ4X3Qgc2NhblszXSA9IHtzdGF0aWNfY2FzdDx1aW50OF90PihzcmNfYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oc3JjX2cpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyY19yKX07CisgICAgICBSR0JfQmxlbmQoYmxlbmRfdHlwZSwgc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7CisgICAgICAqZGVzdF9zY2FuID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1swXSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1sxXSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1syXSwgYWxwaGFfcmF0aW8pOworICAgIH0gZWxzZSBpZiAoYmxlbmRfdHlwZSkgeworICAgICAgaW50IGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfYik7CisgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgYmxlbmRlZCA9IEJsZW5kKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19nKTsKKyAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfZywgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBibGVuZGVkID0gQmxlbmQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX3IpOworICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7CisgICAgfSBlbHNlIHsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBhbHBoYV9yYXRpbyk7CisgICAgfQorICAgIGRlc3Rfc2NhbiArPSAyOworICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlUm93X0JpdE1hc2syUmdiKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgaWYgKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMICYmICFjbGlwX3NjYW4gJiYgbWFza19hbHBoYSA9PSAyNTUpIHsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgIGlmIChzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpIHsKKyAgICAgICAgZGVzdF9zY2FuWzJdID0gc3JjX3I7CisgICAgICAgIGRlc3Rfc2NhblsxXSA9IHNyY19nOworICAgICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfYjsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbiArPSBCcHA7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpZiAoIShzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpKSB7CisgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBzcmNfYWxwaGE7CisgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhOworICAgIH0KKyAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbiArPSBCcHA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFKSB7CisgICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107CisgICAgICB1aW50OF90IHNjYW5bM10gPSB7c3RhdGljX2Nhc3Q8dWludDhfdD4oc3JjX2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyY19nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihzcmNfcil9OworICAgICAgUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzBdLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuKys7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMV0sIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1syXSwgc3JjX2FscGhhKTsKKyAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKKyAgICAgIGludCBibGVuZGVkID0gQmxlbmQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2IpOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfZyk7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgYmxlbmRlZCA9IEJsZW5kKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19yKTsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBzcmNfYWxwaGEpOworICAgIH0gZWxzZSB7CisgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBzcmNfYWxwaGEpOworICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gQnBwIC0gMjsKKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd19CaXRNYXNrMk1hc2sodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgIGlmICghKHNyY19zY2FuWyhzcmNfbGVmdCArIGNvbCkgLyA4XSAmICgxIDw8ICg3IC0gKHNyY19sZWZ0ICsgY29sKSAlIDgpKSkpIHsKKyAgICAgIGRlc3Rfc2NhbisrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBzcmNfYWxwaGE7CisgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhOworICAgIH0KKyAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9zY2FuOworICAgIGlmICghYmFja19hbHBoYSkgeworICAgICAgKmRlc3Rfc2NhbiA9IHNyY19hbHBoYTsKKyAgICB9IGVsc2UgaWYgKHNyY19hbHBoYSkgeworICAgICAgKmRlc3Rfc2NhbiA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgIH0KKyAgICBkZXN0X3NjYW4rKzsKKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd19CaXRNYXNrMkdyYXkodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfZ3JheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpZiAoIShzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpKSB7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgc3JjX2FscGhhOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYTsKKyAgICB9CisgICAgaWYgKHNyY19hbHBoYSkgeworICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19ncmF5LCBzcmNfYWxwaGEpOworICAgIH0KKyAgICBkZXN0X3NjYW4rKzsKKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd19CaXRNYXNrMkdyYXlhKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2dyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpZiAoIShzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpKSB7CisgICAgICBkZXN0X3NjYW4rKzsKKyAgICAgIGRlc3RfYWxwaGFfc2NhbisrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBzcmNfYWxwaGE7CisgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhOworICAgIH0KKyAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOworICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19ncmF5OworICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gc3JjX2FscGhhOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuKys7CisgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOworICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19ncmF5LCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuKys7CisgIH0KK30KKwordm9pZCBDb21wb3NpdGVSb3dfQXJnYjJBcmdiX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2NhblszXSAvIDI1NTsKKyAgICAgICAgZGVzdF9zY2FuWzNdID0gc3JjX2FscGhhOworICAgICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfc2NhblsyXTsKKyAgICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX3NjYW5bMV07CisgICAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19zY2FuWzBdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRlhBUkdCX1JHQk9SREVSQ09QWShkZXN0X3NjYW4sIHNyY19zY2FuKTsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB1aW50OF90IHNyY19hbHBoYTsKKyAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuWzNdIC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKKyAgICB9CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIHNyY19zY2FuICs9IDQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKKyAgICAgIHVpbnQ4X3QgZGVzdF9zY2FuX29bM107CisgICAgICBkZXN0X3NjYW5fb1swXSA9IGRlc3Rfc2NhblsyXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzFdID0gZGVzdF9zY2FuWzFdOworICAgICAgZGVzdF9zY2FuX29bMl0gPSBkZXN0X3NjYW5bMF07CisgICAgICBSR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2Nhbl9vLCBibGVuZGVkX2NvbG9ycyk7CisgICAgfQorICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7CisgICAgICBpbnQgaW5kZXggPSAyIC0gY29sb3I7CisgICAgICBpZiAoYmxlbmRfdHlwZSkgeworICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQorICAgICAgICAgICAgICAgICAgICAgICAgICA6IEJsZW5kKGJsZW5kX3R5cGUsIGRlc3Rfc2NhbltpbmRleF0sICpzcmNfc2Nhbik7CisgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRSgqc3JjX3NjYW4sIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgICBkZXN0X3NjYW5baW5kZXhdID0KKyAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhbltpbmRleF0sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRlc3Rfc2NhbltpbmRleF0gPQorICAgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuW2luZGV4XSwgKnNyY19zY2FuLCBhbHBoYV9yYXRpbyk7CisgICAgICB9CisgICAgICBzcmNfc2NhbisrOworICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICBzcmNfc2NhbisrOworICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX05vQ2xpcF9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHApIHsKKyAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgeworICAgICAgaWYgKHNyY19CcHAgPT0gNCkgeworICAgICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoZGVzdF9zY2FuLCAweGZmMDAwMDAwIHwgRlhBUkdCX0dFVERJQihzcmNfc2NhbikpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRlhBUkdCX1NFVFJHQk9SREVSRElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0UoMHhmZiwgc3JjX3NjYW5bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuWzFdLCBzcmNfc2NhblswXSkpOworICAgICAgfQorICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGRlc3Rfc2NhblszXSA9IDB4ZmY7CisgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgeworICAgICAgdWludDhfdCBkZXN0X3NjYW5fb1szXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzBdID0gZGVzdF9zY2FuWzJdOworICAgICAgZGVzdF9zY2FuX29bMV0gPSBkZXN0X3NjYW5bMV07CisgICAgICBkZXN0X3NjYW5fb1syXSA9IGRlc3Rfc2NhblswXTsKKyAgICAgIFJHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKKyAgICB9CisgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgIGludCBpbmRleCA9IDIgLSBjb2xvcjsKKyAgICAgIGludCBzcmNfY29sb3IgPSAqc3JjX3NjYW47CisgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KKyAgICAgICAgICAgICAgICAgICAgICAgIDogQmxlbmQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuW2luZGV4XSwgc3JjX2NvbG9yKTsKKyAgICAgIGRlc3Rfc2NhbltpbmRleF0gPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfY29sb3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgc3JjX3NjYW4rKzsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd19BcmdiMlJnYl9CbGVuZF9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7CisgICAgdWludDhfdCBzcmNfYWxwaGE7CisgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM10gKiAoKmNsaXBfc2NhbisrKSAvIDI1NTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107CisgICAgfQorICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOworICAgICAgc3JjX3NjYW4gKz0gNDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICB1aW50OF90IGRlc3Rfc2Nhbl9vWzNdOworICAgICAgZGVzdF9zY2FuX29bMF0gPSBkZXN0X3NjYW5bMl07CisgICAgICBkZXN0X3NjYW5fb1sxXSA9IGRlc3Rfc2NhblsxXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzJdID0gZGVzdF9zY2FuWzBdOworICAgICAgUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOworICAgIH0KKyAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgaW50IGluZGV4ID0gMiAtIGNvbG9yOworICAgICAgaW50IGJhY2tfY29sb3IgPSBkZXN0X3NjYW5baW5kZXhdOworICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCisgICAgICAgICAgICAgICAgICAgICAgICA6IEJsZW5kKGJsZW5kX3R5cGUsIGJhY2tfY29sb3IsICpzcmNfc2Nhbik7CisgICAgICBkZXN0X3NjYW5baW5kZXhdID0gRlhESUJfQUxQSEFfTUVSR0UoYmFja19jb2xvciwgYmxlbmRlZCwgc3JjX2FscGhhKTsKKyAgICAgIHNyY19zY2FuKys7CisgICAgfQorICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKKyAgICBzcmNfc2NhbisrOworICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfTm9DbGlwX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwKSB7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgIGlmIChzcmNfQnBwID09IDQpIHsKKyAgICAgIEZYQVJHQl9TRVRSR0JPUkRFUkRJQihkZXN0X3NjYW4sIDB4ZmYwMDAwMDAgfCBGWEFSR0JfR0VURElCKHNyY19zY2FuKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEZYQVJHQl9TRVRSR0JPUkRFUkRJQigKKyAgICAgICAgICBkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKDB4ZmYsIHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgc3JjX3NjYW5bMF0pKTsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX05vQ2xpcF9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHApIHsKKyAgaW50IGJsZW5kZWRfY29sb3JzWzNdOworICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOworICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICB1aW50OF90IGRlc3Rfc2Nhbl9vWzNdOworICAgICAgZGVzdF9zY2FuX29bMF0gPSBkZXN0X3NjYW5bMl07CisgICAgICBkZXN0X3NjYW5fb1sxXSA9IGRlc3Rfc2NhblsxXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzJdID0gZGVzdF9zY2FuWzBdOworICAgICAgUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOworICAgIH0KKyAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgaW50IGluZGV4ID0gMiAtIGNvbG9yOworICAgICAgaW50IGJhY2tfY29sb3IgPSBkZXN0X3NjYW5baW5kZXhdOworICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKKyAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCisgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQorICAgICAgICAgICAgICAgICAgICAgICAgOiBCbGVuZChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCBzcmNfY29sb3IpOworICAgICAgZGVzdF9zY2FuW2luZGV4XSA9IGJsZW5kZWQ7CisgICAgICBzcmNfc2NhbisrOworICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd19BcmdiMlJnYl9Ob0JsZW5kX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICB1aW50OF90IHNyY19hbHBoYTsKKyAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXSAqICgqY2xpcF9zY2FuKyspIC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKKyAgICB9CisgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgIGRlc3Rfc2NhblsyXSA9ICpzcmNfc2NhbisrOworICAgICAgZGVzdF9zY2FuWzFdID0gKnNyY19zY2FuKys7CisgICAgICBkZXN0X3NjYW5bMF0gPSAqc3JjX3NjYW4rKzsKKyAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKKyAgICAgIHNyY19zY2FuKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgICBzcmNfc2NhbiArPSA0OworICAgICAgY29udGludWU7CisgICAgfQorICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7CisgICAgICBpbnQgaW5kZXggPSAyIC0gY29sb3I7CisgICAgICBkZXN0X3NjYW5baW5kZXhdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5baW5kZXhdLCAqc3JjX3NjYW4sIHNyY19hbHBoYSk7CisgICAgICBzcmNfc2NhbisrOworICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgc3JjX3NjYW4rKzsKKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfTm9DbGlwX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwKSB7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgIGRlc3Rfc2NhblsyXSA9IHNyY19zY2FuWzBdOworICAgIGRlc3Rfc2NhblsxXSA9IHNyY19zY2FuWzFdOworICAgIGRlc3Rfc2NhblswXSA9IHNyY19zY2FuWzJdOworICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKKyAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX0NsaXBfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBpbnQgYmxlbmRlZF9jb2xvcnNbM107CisgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgIGludCBzcmNfYWxwaGEgPSAqY2xpcF9zY2FuKys7CisgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhblsyXSA9ICpzcmNfc2NhbisrOworICAgICAgZGVzdF9zY2FuWzFdID0gKnNyY19zY2FuKys7CisgICAgICBkZXN0X3NjYW5bMF0gPSAqc3JjX3NjYW4rKzsKKyAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7CisgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOworICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgeworICAgICAgdWludDhfdCBkZXN0X3NjYW5fb1szXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzBdID0gZGVzdF9zY2FuWzJdOworICAgICAgZGVzdF9zY2FuX29bMV0gPSBkZXN0X3NjYW5bMV07CisgICAgICBkZXN0X3NjYW5fb1syXSA9IGRlc3Rfc2NhblswXTsKKyAgICAgIFJHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKKyAgICB9CisgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgIGludCBpbmRleCA9IDIgLSBjb2xvcjsKKyAgICAgIGludCBzcmNfY29sb3IgPSAqc3JjX3NjYW47CisgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KKyAgICAgICAgICAgICAgICAgICAgICAgIDogQmxlbmQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuW2luZGV4XSwgc3JjX2NvbG9yKTsKKyAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfY29sb3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOworICAgICAgZGVzdF9zY2FuW2luZGV4XSA9CisgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuW2luZGV4XSwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgICAgc3JjX3NjYW4rKzsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX0NsaXBfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBpbnQgYmxlbmRlZF9jb2xvcnNbM107CisgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7CisgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgIHVpbnQ4X3Qgc3JjX2FscGhhID0gKmNsaXBfc2NhbisrOworICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgeworICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOworICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7CisgICAgICB1aW50OF90IGRlc3Rfc2Nhbl9vWzNdOworICAgICAgZGVzdF9zY2FuX29bMF0gPSBkZXN0X3NjYW5bMl07CisgICAgICBkZXN0X3NjYW5fb1sxXSA9IGRlc3Rfc2NhblsxXTsKKyAgICAgIGRlc3Rfc2Nhbl9vWzJdID0gZGVzdF9zY2FuWzBdOworICAgICAgUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOworICAgIH0KKyAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgeworICAgICAgaW50IGluZGV4ID0gMiAtIGNvbG9yOworICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKKyAgICAgIGludCBiYWNrX2NvbG9yID0gZGVzdF9zY2FuW2luZGV4XTsKKyAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCisgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQorICAgICAgICAgICAgICAgICAgICAgICAgOiBCbGVuZChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCBzcmNfY29sb3IpOworICAgICAgZGVzdF9zY2FuW2luZGV4XSA9IEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSk7CisgICAgICBzcmNfc2NhbisrOworICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7CisgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd19SZ2IyQXJnYl9Ob0JsZW5kX0NsaXBfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07CisgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKKyAgICAgIGRlc3Rfc2NhblsyXSA9ICpzcmNfc2NhbisrOworICAgICAgZGVzdF9zY2FuWzFdID0gKnNyY19zY2FuKys7CisgICAgICBkZXN0X3NjYW5bMF0gPSAqc3JjX3NjYW4rKzsKKyAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOworICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKKyAgICAgIGludCBpbmRleCA9IDIgLSBjb2xvcjsKKyAgICAgIGRlc3Rfc2NhbltpbmRleF0gPQorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhbltpbmRleF0sICpzcmNfc2NhbiwgYWxwaGFfcmF0aW8pOworICAgICAgc3JjX3NjYW4rKzsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfQ2xpcF9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKKyAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgeworICAgICAgZGVzdF9zY2FuWzJdID0gc3JjX3NjYW5bMF07CisgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfc2NhblsxXTsKKyAgICAgIGRlc3Rfc2NhblswXSA9IHNyY19zY2FuWzJdOworICAgIH0gZWxzZSBpZiAoc3JjX2FscGhhKSB7CisgICAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sICpzcmNfc2Nhbiwgc3JjX2FscGhhKTsKKyAgICAgIHNyY19zY2FuKys7CisgICAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sICpzcmNfc2Nhbiwgc3JjX2FscGhhKTsKKyAgICAgIHNyY19zY2FuKys7CisgICAgICBkZXN0X3NjYW5bMF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sICpzcmNfc2Nhbiwgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKKyAgICAgIHNyY19zY2FuICs9IHNyY19CcHAgLSAyOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKKyAgICBzcmNfc2NhbiArPSBzcmNfQnBwOworICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlUm93XzhicHBSZ2IyUmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiogcFBhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRGVzdEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBGWF9BUkdCIGFyZ2IgPSBwUGFsZXR0ZSA/IHBQYWxldHRlWypzcmNfc2Nhbl0gOiAoKnNyY19zY2FuKSAqIDB4MDEwMTAxOworICAgIGludCBzcmNfciA9IEZYQVJHQl9SKGFyZ2IpOworICAgIGludCBzcmNfZyA9IEZYQVJHQl9HKGFyZ2IpOworICAgIGludCBzcmNfYiA9IEZYQVJHQl9CKGFyZ2IpOworICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgc3JjX2IsIGNsaXBfc2Nhbltjb2xdKTsKKyAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgc3JjX2csIGNsaXBfc2Nhbltjb2xdKTsKKyAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgc3JjX3IsIGNsaXBfc2Nhbltjb2xdKTsKKyAgICB9IGVsc2UgeworICAgICAgZGVzdF9zY2FuWzJdID0gc3JjX2I7CisgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfZzsKKyAgICAgIGRlc3Rfc2NhblswXSA9IHNyY19yOworICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gRGVzdEJwcDsKKyAgICBzcmNfc2NhbisrOworICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlUm93XzFicHBSZ2IyUmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiogcFBhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRGVzdEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBpbnQgcmVzZXRfciwgcmVzZXRfZywgcmVzZXRfYjsKKyAgaW50IHNldF9yLCBzZXRfZywgc2V0X2I7CisgIGlmIChwUGFsZXR0ZSkgeworICAgIHJlc2V0X3IgPSBGWEFSR0JfUihwUGFsZXR0ZVswXSk7CisgICAgcmVzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzBdKTsKKyAgICByZXNldF9iID0gRlhBUkdCX0IocFBhbGV0dGVbMF0pOworICAgIHNldF9yID0gRlhBUkdCX1IocFBhbGV0dGVbMV0pOworICAgIHNldF9nID0gRlhBUkdCX0cocFBhbGV0dGVbMV0pOworICAgIHNldF9iID0gRlhBUkdCX0IocFBhbGV0dGVbMV0pOworICB9IGVsc2UgeworICAgIHJlc2V0X3IgPSByZXNldF9nID0gcmVzZXRfYiA9IDA7CisgICAgc2V0X3IgPSBzZXRfZyA9IHNldF9iID0gMjU1OworICB9CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgeworICAgIGludCBzcmNfciwgc3JjX2csIHNyY19iOworICAgIGlmIChzcmNfc2NhblsoY29sICsgc3JjX2xlZnQpIC8gOF0gJiAoMSA8PCAoNyAtIChjb2wgKyBzcmNfbGVmdCkgJSA4KSkpIHsKKyAgICAgIHNyY19yID0gc2V0X3I7CisgICAgICBzcmNfZyA9IHNldF9nOworICAgICAgc3JjX2IgPSBzZXRfYjsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX3IgPSByZXNldF9yOworICAgICAgc3JjX2cgPSByZXNldF9nOworICAgICAgc3JjX2IgPSByZXNldF9iOworICAgIH0KKyAgICBpZiAoY2xpcF9zY2FuICYmIGNsaXBfc2Nhbltjb2xdIDwgMjU1KSB7CisgICAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIHNyY19iLCBjbGlwX3NjYW5bY29sXSk7CisgICAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIHNyY19nLCBjbGlwX3NjYW5bY29sXSk7CisgICAgICBkZXN0X3NjYW5bMF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIHNyY19yLCBjbGlwX3NjYW5bY29sXSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19iOworICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX2c7CisgICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfcjsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IERlc3RCcHA7CisgIH0KK30KKwordm9pZCBDb21wb3NpdGVSb3dfOGJwcFJnYjJBcmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiogcFBhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgIGludCBzcmNfciwgc3JjX2csIHNyY19iOworICAgIGlmIChwUGFsZXR0ZSkgeworICAgICAgRlhfQVJHQiBhcmdiID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKKyAgICAgIHNyY19yID0gRlhBUkdCX1IoYXJnYik7CisgICAgICBzcmNfZyA9IEZYQVJHQl9HKGFyZ2IpOworICAgICAgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX3IgPSBzcmNfZyA9IHNyY19iID0gKnNyY19zY2FuOworICAgIH0KKyAgICBpZiAoIWNsaXBfc2NhbiB8fCBjbGlwX3NjYW5bY29sXSA9PSAyNTUpIHsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19iOworICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX2c7CisgICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfcjsKKyAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKKyAgICAgIHNyY19zY2FuKys7CisgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07CisgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7CisgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIHNyY19zY2FuKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaW50IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107CisgICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7CisgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKKyAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOworICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgc3JjX2IsIGFscGhhX3JhdGlvKTsKKyAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIHNyY19nLCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBzcmNfciwgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhbiArPSA0OworICAgIHNyY19zY2FuKys7CisgIH0KK30KKwordm9pZCBDb21wb3NpdGVSb3dfMWJwcFJnYjJBcmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IqIHBQYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBpbnQgcmVzZXRfciwgcmVzZXRfZywgcmVzZXRfYjsKKyAgaW50IHNldF9yLCBzZXRfZywgc2V0X2I7CisgIGlmIChwUGFsZXR0ZSkgeworICAgIHJlc2V0X3IgPSBGWEFSR0JfUihwUGFsZXR0ZVswXSk7CisgICAgcmVzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzBdKTsKKyAgICByZXNldF9iID0gRlhBUkdCX0IocFBhbGV0dGVbMF0pOworICAgIHNldF9yID0gRlhBUkdCX1IocFBhbGV0dGVbMV0pOworICAgIHNldF9nID0gRlhBUkdCX0cocFBhbGV0dGVbMV0pOworICAgIHNldF9iID0gRlhBUkdCX0IocFBhbGV0dGVbMV0pOworICB9IGVsc2UgeworICAgIHJlc2V0X3IgPSByZXNldF9nID0gcmVzZXRfYiA9IDA7CisgICAgc2V0X3IgPSBzZXRfZyA9IHNldF9iID0gMjU1OworICB9CisgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgeworICAgIGludCBzcmNfciwgc3JjX2csIHNyY19iOworICAgIGlmIChzcmNfc2NhblsoY29sICsgc3JjX2xlZnQpIC8gOF0gJiAoMSA8PCAoNyAtIChjb2wgKyBzcmNfbGVmdCkgJSA4KSkpIHsKKyAgICAgIHNyY19yID0gc2V0X3I7CisgICAgICBzcmNfZyA9IHNldF9nOworICAgICAgc3JjX2IgPSBzZXRfYjsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX3IgPSByZXNldF9yOworICAgICAgc3JjX2cgPSByZXNldF9nOworICAgICAgc3JjX2IgPSByZXNldF9iOworICAgIH0KKyAgICBpZiAoIWNsaXBfc2NhbiB8fCBjbGlwX3NjYW5bY29sXSA9PSAyNTUpIHsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19iOworICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX2c7CisgICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfcjsKKyAgICAgIGRlc3Rfc2NhblszXSA9IDI1NTsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKKyAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIHNyY19iLCBhbHBoYV9yYXRpbyk7CisgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBzcmNfZywgYWxwaGFfcmF0aW8pOworICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgc3JjX3IsIGFscGhhX3JhdGlvKTsKKyAgICBkZXN0X3NjYW4gKz0gNDsKKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd19CeXRlTWFzazJBcmdiX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgaW50IHNyY19hbHBoYTsKKyAgICBpZiAoY2xpcF9zY2FuKSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogc3JjX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9CisgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgIEZYQVJHQl9TRVRSR0JPUkRFUkRJQihkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX01BS0Uoc3JjX2FscGhhLCBzcmNfciwgc3JjX2csIHNyY19iKSk7CisgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbiArPSA0OworICAgICAgY29udGludWU7CisgICAgfQorICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OworICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7CisgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKKyAgICBpZiAoYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUpIHsKKyAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKKyAgICAgIHVpbnQ4X3Qgc2NhblszXSA9IHtzdGF0aWNfY2FzdDx1aW50OF90PihzcmNfYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oc3JjX2cpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyY19yKX07CisgICAgICB1aW50OF90IGRlc3Rfc2Nhbl9vWzNdID0ge2Rlc3Rfc2NhblsyXSwgZGVzdF9zY2FuWzFdLCBkZXN0X3NjYW5bMF19OworICAgICAgUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNjYW4sIGRlc3Rfc2Nhbl9vLCBibGVuZGVkX2NvbG9ycyk7CisgICAgICBkZXN0X3NjYW5bMl0gPQorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgYmxlbmRlZF9jb2xvcnNbMF0sIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhblsxXSA9CisgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBibGVuZGVkX2NvbG9yc1sxXSwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuWzBdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIGJsZW5kZWRfY29sb3JzWzJdLCBhbHBoYV9yYXRpbyk7CisgICAgfSBlbHNlIGlmIChibGVuZF90eXBlKSB7CisgICAgICBpbnQgYmxlbmRlZCA9IEJsZW5kKGJsZW5kX3R5cGUsIGRlc3Rfc2NhblsyXSwgc3JjX2IpOworICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19iLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgICAgYmxlbmRlZCA9IEJsZW5kKGJsZW5kX3R5cGUsIGRlc3Rfc2NhblsxXSwgc3JjX2cpOworICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19nLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgICAgYmxlbmRlZCA9IEJsZW5kKGJsZW5kX3R5cGUsIGRlc3Rfc2NhblswXSwgc3JjX3IpOworICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOworICAgIH0gZWxzZSB7CisgICAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIHNyY19iLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIHNyY19nLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW5bMF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIHNyY19yLCBhbHBoYV9yYXRpbyk7CisgICAgfQorICAgIGRlc3Rfc2NhbiArPSA0OworICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlUm93X0J5dGVNYXNrMlJnYl9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgeworICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpbnQgc3JjX2FscGhhOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuW2NvbF0gLyAyNTUgLyAyNTU7CisgICAgfSBlbHNlIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBzcmNfc2Nhbltjb2xdIC8gMjU1OworICAgIH0KKyAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbiArPSBCcHA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFKSB7CisgICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107CisgICAgICB1aW50OF90IHNjYW5bM10gPSB7c3RhdGljX2Nhc3Q8dWludDhfdD4oc3JjX2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyY19nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihzcmNfcil9OworICAgICAgdWludDhfdCBkZXN0X3NjYW5fb1szXSA9IHtkZXN0X3NjYW5bMl0sIGRlc3Rfc2NhblsxXSwgZGVzdF9zY2FuWzBdfTsKKyAgICAgIFJHQl9CbGVuZChibGVuZF90eXBlLCBzY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOworICAgICAgZGVzdF9zY2FuWzJdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIGJsZW5kZWRfY29sb3JzWzBdLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuWzFdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIGJsZW5kZWRfY29sb3JzWzFdLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuWzBdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIGJsZW5kZWRfY29sb3JzWzJdLCBzcmNfYWxwaGEpOworICAgIH0gZWxzZSBpZiAoYmxlbmRfdHlwZSkgeworICAgICAgaW50IGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCBkZXN0X3NjYW5bMl0sIHNyY19iKTsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgYmxlbmRlZCwgc3JjX2FscGhhKTsKKyAgICAgIGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCBkZXN0X3NjYW5bMV0sIHNyY19nKTsKKyAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgYmxlbmRlZCwgc3JjX2FscGhhKTsKKyAgICAgIGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCBkZXN0X3NjYW5bMF0sIHNyY19yKTsKKyAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgYmxlbmRlZCwgc3JjX2FscGhhKTsKKyAgICB9IGVsc2UgeworICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBzcmNfYiwgc3JjX2FscGhhKTsKKyAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgc3JjX2csIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW5bMF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIHNyY19yLCBzcmNfYWxwaGEpOworICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gQnBwOworICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlUm93X0JpdE1hc2syQXJnYl9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7CisgIGlmIChibGVuZF90eXBlID09IEZYRElCX0JMRU5EX05PUk1BTCAmJiAhY2xpcF9zY2FuICYmIG1hc2tfYWxwaGEgPT0gMjU1KSB7CisgICAgRlhfQVJHQiBhcmdiID0gRlhBUkdCX01BS0UoMHhmZiwgc3JjX3IsIHNyY19nLCBzcmNfYik7CisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7CisgICAgICBpZiAoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSB7CisgICAgICAgIEZYQVJHQl9TRVRSR0JPUkRFUkRJQihkZXN0X3NjYW4sIGFyZ2IpOworICAgICAgfQorICAgICAgZGVzdF9zY2FuICs9IDQ7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpZiAoIShzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpKSB7CisgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpbnQgc3JjX2FscGhhOworICAgIGlmIChjbGlwX3NjYW4pIHsKKyAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKKyAgICB9IGVsc2UgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYTsKKyAgICB9CisgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOworICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKKyAgICAgIEZYQVJHQl9TRVRSR0JPUkRFUkRJQihkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX01BS0Uoc3JjX2FscGhhLCBzcmNfciwgc3JjX2csIHNyY19iKSk7CisgICAgICBkZXN0X3NjYW4gKz0gNDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKKyAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOworICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7CisgICAgaWYgKGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFKSB7CisgICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107CisgICAgICB1aW50OF90IHNjYW5bM10gPSB7c3RhdGljX2Nhc3Q8dWludDhfdD4oc3JjX2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyY19nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihzcmNfcil9OworICAgICAgdWludDhfdCBkZXN0X3NjYW5fb1szXSA9IHtkZXN0X3NjYW5bMl0sIGRlc3Rfc2NhblsxXSwgZGVzdF9zY2FuWzBdfTsKKyAgICAgIFJHQl9CbGVuZChibGVuZF90eXBlLCBzY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOworICAgICAgZGVzdF9zY2FuWzJdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIGJsZW5kZWRfY29sb3JzWzBdLCBhbHBoYV9yYXRpbyk7CisgICAgICBkZXN0X3NjYW5bMV0gPQorICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgYmxlbmRlZF9jb2xvcnNbMV0sIGFscGhhX3JhdGlvKTsKKyAgICAgIGRlc3Rfc2NhblswXSA9CisgICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBibGVuZGVkX2NvbG9yc1syXSwgYWxwaGFfcmF0aW8pOworICAgIH0gZWxzZSBpZiAoYmxlbmRfdHlwZSkgeworICAgICAgaW50IGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCBkZXN0X3NjYW5bMl0sIHNyY19iKTsKKyAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfYiwgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCBkZXN0X3NjYW5bMV0sIHNyY19nKTsKKyAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfZywgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICAgIGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCBkZXN0X3NjYW5bMF0sIHNyY19yKTsKKyAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfciwgYmxlbmRlZCwgYmFja19hbHBoYSk7CisgICAgICBkZXN0X3NjYW5bMF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKKyAgICB9IGVsc2UgeworICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBzcmNfYiwgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBzcmNfZywgYWxwaGFfcmF0aW8pOworICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBzcmNfciwgYWxwaGFfcmF0aW8pOworICAgIH0KKyAgICBkZXN0X3NjYW4gKz0gNDsKKyAgfQorfQorCit2b2lkIENvbXBvc2l0ZVJvd19CaXRNYXNrMlJnYl9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKKyAgaWYgKGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTk9STUFMICYmICFjbGlwX3NjYW4gJiYgbWFza19hbHBoYSA9PSAyNTUpIHsKKyAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICAgIGlmIChzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpIHsKKyAgICAgICAgZGVzdF9zY2FuWzJdID0gc3JjX2I7CisgICAgICAgIGRlc3Rfc2NhblsxXSA9IHNyY19nOworICAgICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfcjsKKyAgICAgIH0KKyAgICAgIGRlc3Rfc2NhbiArPSBCcHA7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKKyAgICBpZiAoIShzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpKSB7CisgICAgICBkZXN0X3NjYW4gKz0gQnBwOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGludCBzcmNfYWxwaGE7CisgICAgaWYgKGNsaXBfc2NhbikgeworICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OworICAgIH0gZWxzZSB7CisgICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhOworICAgIH0KKyAgICBpZiAoc3JjX2FscGhhID09IDApIHsKKyAgICAgIGRlc3Rfc2NhbiArPSBCcHA7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFKSB7CisgICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107CisgICAgICB1aW50OF90IHNjYW5bM10gPSB7c3RhdGljX2Nhc3Q8dWludDhfdD4oc3JjX2IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyY19nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihzcmNfcil9OworICAgICAgdWludDhfdCBkZXN0X3NjYW5fb1szXSA9IHtkZXN0X3NjYW5bMl0sIGRlc3Rfc2NhblsxXSwgZGVzdF9zY2FuWzBdfTsKKyAgICAgIFJHQl9CbGVuZChibGVuZF90eXBlLCBzY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOworICAgICAgZGVzdF9zY2FuWzJdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIGJsZW5kZWRfY29sb3JzWzBdLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuWzFdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIGJsZW5kZWRfY29sb3JzWzFdLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuWzBdID0KKyAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIGJsZW5kZWRfY29sb3JzWzJdLCBzcmNfYWxwaGEpOworICAgIH0gZWxzZSBpZiAoYmxlbmRfdHlwZSkgeworICAgICAgaW50IGJhY2tfY29sb3IgPSBkZXN0X3NjYW5bMl07CisgICAgICBpbnQgYmxlbmRlZCA9IEJsZW5kKGJsZW5kX3R5cGUsIGJhY2tfY29sb3IsIHNyY19iKTsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSk7CisgICAgICBiYWNrX2NvbG9yID0gZGVzdF9zY2FuWzFdOworICAgICAgYmxlbmRlZCA9IEJsZW5kKGJsZW5kX3R5cGUsIGJhY2tfY29sb3IsIHNyY19nKTsKKyAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSk7CisgICAgICBiYWNrX2NvbG9yID0gZGVzdF9zY2FuWzBdOworICAgICAgYmxlbmRlZCA9IEJsZW5kKGJsZW5kX3R5cGUsIGJhY2tfY29sb3IsIHNyY19yKTsKKyAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgc3JjX2IsIHNyY19hbHBoYSk7CisgICAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIHNyY19nLCBzcmNfYWxwaGEpOworICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBzcmNfciwgc3JjX2FscGhhKTsKKyAgICB9CisgICAgZGVzdF9zY2FuICs9IEJwcDsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKKworQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcjo6Q0ZYX1NjYW5saW5lQ29tcG9zaXRvcigpCisgICAgOiBtX0JsZW5kVHlwZShGWERJQl9CTEVORF9OT1JNQUwpLCBtX2JSZ2JCeXRlT3JkZXIoZmFsc2UpIHt9CisKK0NGWF9TY2FubGluZUNvbXBvc2l0b3I6On5DRlhfU2NhbmxpbmVDb21wb3NpdG9yKCkge30KKworYm9vbCBDRlhfU2NhbmxpbmVDb21wb3NpdG9yOjpJbml0KEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwU3JjUGFsZXR0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXNrX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNsaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnKSB7CisgIG1fU3JjRm9ybWF0ID0gc3JjX2Zvcm1hdDsKKyAgbV9EZXN0Rm9ybWF0ID0gZGVzdF9mb3JtYXQ7CisgIG1fQmxlbmRUeXBlID0gYmxlbmRfdHlwZTsKKyAgbV9iUmdiQnl0ZU9yZGVyID0gYlJnYkJ5dGVPcmRlcjsKKyAgaWYgKChkZXN0X2Zvcm1hdCAmIDB4ZmYpID09IDEpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAobV9TcmNGb3JtYXQgPT0gRlhESUJfMWJwcE1hc2sgfHwgbV9TcmNGb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKKyAgICBJbml0U291cmNlTWFzayhhbHBoYV9mbGFnLCBtYXNrX2NvbG9yKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAoKH5zcmNfZm9ybWF0ICYgMHgwNDAwKSAmJiAoZGVzdF9mb3JtYXQgJiAweDA0MDApKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKChtX1NyY0Zvcm1hdCAmIDB4ZmYpIDw9IDgpIHsKKyAgICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIEluaXRTb3VyY2VQYWxldHRlKHNyY19mb3JtYXQsIGRlc3RfZm9ybWF0LCBwU3JjUGFsZXR0ZSk7CisgICAgbV9pVHJhbnNwYXJlbmN5ID0KKyAgICAgICAgKGRlc3RfZm9ybWF0ID09IEZYRElCX0FyZ2IgPyAxIDogMCkgKyAoZGVzdF9mb3JtYXQgJiAweDAyMDAgPyAyIDogMCkgKworICAgICAgICAoZGVzdF9mb3JtYXQgJiAweDA0MDAgPyA0IDogMCkgKyAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSAxID8gOCA6IDApOworICAgIHJldHVybiB0cnVlOworICB9CisgIG1faVRyYW5zcGFyZW5jeSA9CisgICAgICAoc3JjX2Zvcm1hdCAmIDB4MDIwMCA/IDAgOiAxKSArIChkZXN0X2Zvcm1hdCAmIDB4MDIwMCA/IDAgOiAyKSArCisgICAgICAoYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9OT1JNQUwgPyA0IDogMCkgKyAoYkNsaXAgPyA4IDogMCkgKworICAgICAgKHNyY19mb3JtYXQgJiAweDA0MDAgPyAxNiA6IDApICsgKGRlc3RfZm9ybWF0ICYgMHgwNDAwID8gMzIgOiAwKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcjo6SW5pdFNvdXJjZU1hc2soaW50IGFscGhhX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hc2tfY29sb3IpIHsKKyAgaW50IG1hc2tfYmxhY2sgPSAwOworICBpZiAoYWxwaGFfZmxhZyA+PiA4KSB7CisgICAgbV9NYXNrQWxwaGEgPSBhbHBoYV9mbGFnICYgMHhmZjsKKyAgICBtX01hc2tSZWQgPSBGWFNZU19HZXRDVmFsdWUobWFza19jb2xvcik7CisgICAgbV9NYXNrR3JlZW4gPSBGWFNZU19HZXRNVmFsdWUobWFza19jb2xvcik7CisgICAgbV9NYXNrQmx1ZSA9IEZYU1lTX0dldFlWYWx1ZShtYXNrX2NvbG9yKTsKKyAgICBtYXNrX2JsYWNrID0gRlhTWVNfR2V0S1ZhbHVlKG1hc2tfY29sb3IpOworICB9IGVsc2UgeworICAgIG1fTWFza0FscGhhID0gRlhBUkdCX0EobWFza19jb2xvcik7CisgICAgbV9NYXNrUmVkID0gRlhBUkdCX1IobWFza19jb2xvcik7CisgICAgbV9NYXNrR3JlZW4gPSBGWEFSR0JfRyhtYXNrX2NvbG9yKTsKKyAgICBtX01hc2tCbHVlID0gRlhBUkdCX0IobWFza19jb2xvcik7CisgIH0KKyAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl84YnBwTWFzaykKKyAgICByZXR1cm47CisKKyAgaWYgKChtX0Rlc3RGb3JtYXQgJiAweGZmKSA9PSA4KSB7CisgICAgaWYgKGFscGhhX2ZsYWcgPj4gOCkgeworICAgICAgdWludDhfdCByOworICAgICAgdWludDhfdCBnOworICAgICAgdWludDhfdCBiOworICAgICAgc3RkOjp0aWUociwgZywgYikgPQorICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShtX01hc2tSZWQsIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLCBtYXNrX2JsYWNrKTsKKyAgICAgIG1fTWFza1JlZCA9IEZYUkdCMkdSQVkociwgZywgYik7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fTWFza1JlZCA9IEZYUkdCMkdSQVkobV9NYXNrUmVkLCBtX01hc2tHcmVlbiwgbV9NYXNrQmx1ZSk7CisgICAgfQorICAgIGlmIChtX0Rlc3RGb3JtYXQgJiAweDA0MDApCisgICAgICBtX01hc2tSZWQgPSBGWF9DQ09MT1IobV9NYXNrUmVkKTsKKyAgICByZXR1cm47CisgIH0KKyAgdWludDhfdCogbWFza19jb2xvcl9wID0gKHVpbnQ4X3QqKSZtYXNrX2NvbG9yOworICBtYXNrX2NvbG9yID0KKyAgICAgIChhbHBoYV9mbGFnID4+IDgpID8gRlhDTVlLX1RPRElCKG1hc2tfY29sb3IpIDogRlhBUkdCX1RPRElCKG1hc2tfY29sb3IpOworICBpZiAoYWxwaGFfZmxhZyA+PiA4KSB7CisgICAgc3RkOjp0aWUobWFza19jb2xvcl9wWzJdLCBtYXNrX2NvbG9yX3BbMV0sIG1hc2tfY29sb3JfcFswXSkgPQorICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEobWFza19jb2xvcl9wWzBdLCBtYXNrX2NvbG9yX3BbMV0sIG1hc2tfY29sb3JfcFsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfY29sb3JfcFszXSk7CisgICAgbV9NYXNrUmVkID0gbWFza19jb2xvcl9wWzJdOworICAgIG1fTWFza0dyZWVuID0gbWFza19jb2xvcl9wWzFdOworICAgIG1fTWFza0JsdWUgPSBtYXNrX2NvbG9yX3BbMF07CisgIH0KK30KKwordm9pZCBDRlhfU2NhbmxpbmVDb21wb3NpdG9yOjpJbml0U291cmNlUGFsZXR0ZShGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogcFNyY1BhbGV0dGUpIHsKKyAgYm9vbCBpc1NyY0NteWsgPSAhIShzcmNfZm9ybWF0ICYgMHgwNDAwKTsKKyAgYm9vbCBpc0RzdENteWsgPSAhIShkZXN0X2Zvcm1hdCAmIDB4MDQwMCk7CisgIG1fcFNyY1BhbGV0dGUgPSBudWxscHRyOworICBpZiAocFNyY1BhbGV0dGUpIHsKKyAgICBpZiAoKGRlc3RfZm9ybWF0ICYgMHhmZikgPT0gOCkgeworICAgICAgaW50IHBhbF9jb3VudCA9IDEgPDwgKHNyY19mb3JtYXQgJiAweGZmKTsKKyAgICAgIHVpbnQ4X3QqIGdyYXlfcGFsID0gRlhfQWxsb2ModWludDhfdCwgcGFsX2NvdW50KTsKKyAgICAgIG1fcFNyY1BhbGV0dGUucmVzZXQocmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KGdyYXlfcGFsKSk7CisgICAgICBpZiAoaXNTcmNDbXlrKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsX2NvdW50OyArK2kpIHsKKyAgICAgICAgICBGWF9DTVlLIGNteWsgPSBwU3JjUGFsZXR0ZVtpXTsKKyAgICAgICAgICB1aW50OF90IHI7CisgICAgICAgICAgdWludDhfdCBnOworICAgICAgICAgIHVpbnQ4X3QgYjsKKyAgICAgICAgICBzdGQ6OnRpZShyLCBnLCBiKSA9CisgICAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoY215ayksIEZYU1lTX0dldE1WYWx1ZShjbXlrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldFlWYWx1ZShjbXlrKSwgRlhTWVNfR2V0S1ZhbHVlKGNteWspKTsKKyAgICAgICAgICAqZ3JheV9wYWwrKyA9IEZYUkdCMkdSQVkociwgZywgYik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsX2NvdW50OyArK2kpIHsKKyAgICAgICAgICBGWF9BUkdCIGFyZ2IgPSBwU3JjUGFsZXR0ZVtpXTsKKyAgICAgICAgICAqZ3JheV9wYWwrKyA9CisgICAgICAgICAgICAgIEZYUkdCMkdSQVkoRlhBUkdCX1IoYXJnYiksIEZYQVJHQl9HKGFyZ2IpLCBGWEFSR0JfQihhcmdiKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50IHBhbHNpemUgPSAxIDw8IChzcmNfZm9ybWF0ICYgMHhmZik7CisgICAgbV9wU3JjUGFsZXR0ZS5yZXNldChGWF9BbGxvYyh1aW50MzJfdCwgcGFsc2l6ZSkpOworICAgIHVpbnQzMl90KiBwUGFsZXR0ZSA9IG1fcFNyY1BhbGV0dGUuZ2V0KCk7CisgICAgaWYgKGlzRHN0Q215ayA9PSBpc1NyY0NteWspIHsKKyAgICAgIG1lbWNweShwUGFsZXR0ZSwgcFNyY1BhbGV0dGUsIHBhbHNpemUgKiBzaXplb2YodWludDMyX3QpKTsKKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxzaXplOyArK2kpIHsKKyAgICAgICAgRlhfQ01ZSyBjbXlrID0gcFNyY1BhbGV0dGVbaV07CisgICAgICAgIHVpbnQ4X3QgcjsKKyAgICAgICAgdWludDhfdCBnOworICAgICAgICB1aW50OF90IGI7CisgICAgICAgIHN0ZDo6dGllKHIsIGcsIGIpID0KKyAgICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoY215ayksIEZYU1lTX0dldE1WYWx1ZShjbXlrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoY215ayksIEZYU1lTX0dldEtWYWx1ZShjbXlrKSk7CisgICAgICAgIHBQYWxldHRlW2ldID0gRlhBUkdCX01BS0UoMHhmZiwgciwgZywgYik7CisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBpZiAoKGRlc3RfZm9ybWF0ICYgMHhmZikgPT0gOCkgeworICAgIGludCBwYWxfY291bnQgPSAxIDw8IChzcmNfZm9ybWF0ICYgMHhmZik7CisgICAgdWludDhfdCogZ3JheV9wYWwgPSBGWF9BbGxvYyh1aW50OF90LCBwYWxfY291bnQpOworICAgIGlmIChwYWxfY291bnQgPT0gMikgeworICAgICAgZ3JheV9wYWxbMF0gPSAwOworICAgICAgZ3JheV9wYWxbMV0gPSAyNTU7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsX2NvdW50OyArK2kpCisgICAgICAgIGdyYXlfcGFsW2ldID0gaTsKKyAgICB9CisgICAgbV9wU3JjUGFsZXR0ZS5yZXNldChyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oZ3JheV9wYWwpKTsKKyAgICByZXR1cm47CisgIH0KKyAgaW50IHBhbHNpemUgPSAxIDw8IChzcmNfZm9ybWF0ICYgMHhmZik7CisgIG1fcFNyY1BhbGV0dGUucmVzZXQoRlhfQWxsb2ModWludDMyX3QsIHBhbHNpemUpKTsKKyAgdWludDMyX3QqIHBQYWxldHRlID0gbV9wU3JjUGFsZXR0ZS5nZXQoKTsKKyAgaWYgKHBhbHNpemUgPT0gMikgeworICAgIHBQYWxldHRlWzBdID0gaXNTcmNDbXlrID8gMjU1IDogMHhmZjAwMDAwMDsKKyAgICBwUGFsZXR0ZVsxXSA9IGlzU3JjQ215ayA/IDAgOiAweGZmZmZmZmZmOworICB9IGVsc2UgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsc2l6ZTsgKytpKQorICAgICAgcFBhbGV0dGVbaV0gPSBpc1NyY0NteWsgPyBGWF9DQ09MT1IoaSkgOiAoaSAqIDB4MTAxMDEpOworICB9CisgIGlmIChpc1NyY0NteWsgIT0gaXNEc3RDbXlrKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxzaXplOyArK2kpIHsKKyAgICAgIEZYX0NNWUsgY215ayA9IHBQYWxldHRlW2ldOworICAgICAgdWludDhfdCByOworICAgICAgdWludDhfdCBnOworICAgICAgdWludDhfdCBiOworICAgICAgc3RkOjp0aWUociwgZywgYikgPQorICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoY215ayksIEZYU1lTX0dldE1WYWx1ZShjbXlrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKGNteWspLCBGWFNZU19HZXRLVmFsdWUoY215aykpOworICAgICAgcFBhbGV0dGVbaV0gPSBGWEFSR0JfTUFLRSgweGZmLCByLCBnLCBiKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBDRlhfU2NhbmxpbmVDb21wb3NpdG9yOjpDb21wb3NpdGVSZ2JCaXRtYXBMaW5lKAorICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICBpbnQgd2lkdGgsCisgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19leHRyYV9hbHBoYSwKKyAgICB1aW50OF90KiBkc3RfZXh0cmFfYWxwaGEpIHsKKyAgaW50IHNyY19CcHAgPSAobV9TcmNGb3JtYXQgJiAweGZmKSA+PiAzOworICBpbnQgZGVzdF9CcHAgPSAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMzsKKyAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgeworICAgIHN3aXRjaCAobV9pVHJhbnNwYXJlbmN5KSB7CisgICAgICBjYXNlIDA6CisgICAgICBjYXNlIDQ6CisgICAgICBjYXNlIDg6CisgICAgICBjYXNlIDEyOgorICAgICAgICBDb21wb3NpdGVSb3dfQXJnYjJBcmdiX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbGVuZFR5cGUsIGNsaXBfc2Nhbik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxOgorICAgICAgICBDb21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfTm9DbGlwX1JnYkJ5dGVPcmRlcigKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgc3JjX0JwcCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgY2FzZSAxMDoKKyAgICAgICAgQ29tcG9zaXRlUm93X0FyZ2IyUmdiX0JsZW5kX1JnYkJ5dGVPcmRlcigKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgZGVzdF9CcHAsIGNsaXBfc2Nhbik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAzOgorICAgICAgICBDb21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBkZXN0X0JwcCwgc3JjX0JwcCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1OgorICAgICAgICBDb21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIHNyY19CcHApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNjoKKyAgICAgIGNhc2UgMTQ6CisgICAgICAgIENvbXBvc2l0ZVJvd19BcmdiMlJnYl9Ob0JsZW5kX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfQnBwLCBjbGlwX3NjYW4pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNzoKKyAgICAgICAgQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLCBzcmNfQnBwKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDk6CisgICAgICAgIENvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcigKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgc3JjX0JwcCwgY2xpcF9zY2FuKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDExOgorICAgICAgICBDb21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbGVuZFR5cGUsIGRlc3RfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfQnBwLCBjbGlwX3NjYW4pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTM6CisgICAgICAgIENvbXBvc2l0ZVJvd19SZ2IyQXJnYl9Ob0JsZW5kX0NsaXBfUmdiQnl0ZU9yZGVyKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIHNyY19CcHAsIGNsaXBfc2Nhbik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxNToKKyAgICAgICAgQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcigKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBkZXN0X0JwcCwgc3JjX0JwcCwgY2xpcF9zY2FuKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCXzhicHBNYXNrKSB7CisgICAgaWYgKG1fU3JjRm9ybWF0ICYgMHgwMjAwKSB7CisgICAgICBpZiAobV9TcmNGb3JtYXQgPT0gRlhESUJfQXJnYikgeworICAgICAgICBDb21wb3NpdGVSb3dfQWxwaGFUb01hc2soZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGNsaXBfc2NhbiwgNCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBDb21wb3NpdGVSb3dfQWxwaGFUb01hc2soZGVzdF9zY2FuLCBzcmNfZXh0cmFfYWxwaGEsIHdpZHRoLCBjbGlwX3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgQ29tcG9zaXRlUm93X1JnYjJNYXNrKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBjbGlwX3NjYW4pOworICAgIH0KKyAgfSBlbHNlIGlmICgobV9EZXN0Rm9ybWF0ICYgMHhmZikgPT0gOCkgeworICAgIGlmIChtX0Rlc3RGb3JtYXQgJiAweDA0MDApIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgeworICAgICAgICAqZGVzdF9zY2FuID0gfipkZXN0X3NjYW47CisgICAgICAgIGRlc3Rfc2NhbisrOworICAgICAgfQorICAgIH0KKyAgICBpZiAobV9TcmNGb3JtYXQgJiAweDAyMDApIHsKKyAgICAgIGlmIChtX0Rlc3RGb3JtYXQgJiAweDAyMDApIHsKKyAgICAgICAgQ29tcG9zaXRlUm93X0FyZ2IyR3JheWEoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4sIHNyY19leHRyYV9hbHBoYSwgZHN0X2V4dHJhX2FscGhhKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENvbXBvc2l0ZVJvd19BcmdiMkdyYXkoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2Nhbiwgc3JjX2V4dHJhX2FscGhhKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKG1fRGVzdEZvcm1hdCAmIDB4MDIwMCkgeworICAgICAgICBDb21wb3NpdGVSb3dfUmdiMkdyYXlhKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19CcHAsIHdpZHRoLCBtX0JsZW5kVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4sIGRzdF9leHRyYV9hbHBoYSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBDb21wb3NpdGVSb3dfUmdiMkdyYXkoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX0JwcCwgd2lkdGgsIG1fQmxlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG1fRGVzdEZvcm1hdCAmIDB4MDQwMCkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7CisgICAgICAgICpkZXN0X3NjYW4gPSB+KmRlc3Rfc2NhbjsKKyAgICAgICAgZGVzdF9zY2FuKys7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIHN3aXRjaCAobV9pVHJhbnNwYXJlbmN5KSB7CisgICAgICBjYXNlIDA6CisgICAgICBjYXNlIDQ6CisgICAgICBjYXNlIDg6CisgICAgICBjYXNlIDQgKyA4OiB7CisgICAgICAgIENvbXBvc2l0ZVJvd19BcmdiMkFyZ2IoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2NhbiwgZHN0X2V4dHJhX2FscGhhLCBzcmNfZXh0cmFfYWxwaGEpOworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX05vQ2xpcCgKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgc3JjX0JwcCwgZHN0X2V4dHJhX2FscGhhKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEgKyA4OgorICAgICAgICBDb21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfQ2xpcChkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbGVuZFR5cGUsIHNyY19CcHAsIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2V4dHJhX2FscGhhKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEgKyA0OgorICAgICAgICBDb21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9Ob0NsaXAoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfQnBwLCBkc3RfZXh0cmFfYWxwaGEpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMSArIDQgKyA4OgorICAgICAgICBDb21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9DbGlwKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBzcmNfQnBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2NhbiwgZHN0X2V4dHJhX2FscGhhKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICBjYXNlIDIgKyA4OgorICAgICAgICBDb21wb3NpdGVSb3dfQXJnYjJSZ2JfQmxlbmQoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9CcHAsIGNsaXBfc2Nhbiwgc3JjX2V4dHJhX2FscGhhKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDIgKyA0OgorICAgICAgY2FzZSAyICsgNCArIDg6CisgICAgICAgIENvbXBvc2l0ZVJvd19BcmdiMlJnYl9Ob0JsZW5kKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBkZXN0X0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBzcmNfZXh0cmFfYWxwaGEpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMSArIDI6CisgICAgICAgIENvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX05vQ2xpcChkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxlbmRUeXBlLCBkZXN0X0JwcCwgc3JjX0JwcCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAxICsgMiArIDg6CisgICAgICAgIENvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX0NsaXAoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfQnBwLCBzcmNfQnBwLCBjbGlwX3NjYW4pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMSArIDIgKyA0OgorICAgICAgICBDb21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX05vQ2xpcChkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9CcHAsIHNyY19CcHApOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMSArIDIgKyA0ICsgODoKKyAgICAgICAgQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9DbGlwKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBkZXN0X0JwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19CcHAsIGNsaXBfc2Nhbik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCit2b2lkIENGWF9TY2FubGluZUNvbXBvc2l0b3I6OkNvbXBvc2l0ZVBhbEJpdG1hcExpbmUoCisgICAgdWludDhfdCogZGVzdF9zY2FuLAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgIGludCBzcmNfbGVmdCwKKyAgICBpbnQgd2lkdGgsCisgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19leHRyYV9hbHBoYSwKKyAgICB1aW50OF90KiBkc3RfZXh0cmFfYWxwaGEpIHsKKyAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgeworICAgIGlmIChtX1NyY0Zvcm1hdCA9PSBGWERJQl8xYnBwUmdiKSB7CisgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCXzhicHBSZ2IpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9BcmdiKSB7CisgICAgICAgIENvbXBvc2l0ZVJvd18xYnBwUmdiMkFyZ2JfTm9CbGVuZF9SZ2JCeXRlT3JkZXIoCisgICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfbGVmdCwgd2lkdGgsIG1fcFNyY1BhbGV0dGUuZ2V0KCksCisgICAgICAgICAgICBjbGlwX3NjYW4pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ29tcG9zaXRlUm93XzFicHBSZ2IyUmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsIG1fcFNyY1BhbGV0dGUuZ2V0KCksIHdpZHRoLAorICAgICAgICAgICAgKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID4+IDMsIGNsaXBfc2Nhbik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfOGJwcFJnYikgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKKyAgICAgICAgQ29tcG9zaXRlUm93XzhicHBSZ2IyQXJnYl9Ob0JsZW5kX1JnYkJ5dGVPcmRlcigKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX3BTcmNQYWxldHRlLmdldCgpLCBjbGlwX3NjYW4pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ29tcG9zaXRlUm93XzhicHBSZ2IyUmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9wU3JjUGFsZXR0ZS5nZXQoKSwgd2lkdGgsCisgICAgICAgICAgICAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMywgY2xpcF9zY2FuKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKKyAgICBDb21wb3NpdGVSb3dfUmdiMk1hc2soZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGNsaXBfc2Nhbik7CisgICAgcmV0dXJuOworICB9CisgIGlmICgobV9EZXN0Rm9ybWF0ICYgMHhmZikgPT0gOCkgeworICAgIGlmIChtX2lUcmFuc3BhcmVuY3kgJiA4KSB7CisgICAgICBpZiAobV9EZXN0Rm9ybWF0ICYgMHgwMjAwKSB7CisgICAgICAgIENvbXBvc2l0ZVJvd18xYnBwUGFsMkdyYXlhKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihtX3BTcmNQYWxldHRlLmdldCgpKSwgd2lkdGgsCisgICAgICAgICAgICBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuLCBkc3RfZXh0cmFfYWxwaGEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ29tcG9zaXRlUm93XzFicHBQYWwyR3JheSgKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19sZWZ0LAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4obV9wU3JjUGFsZXR0ZS5nZXQoKSksIHdpZHRoLAorICAgICAgICAgICAgbV9CbGVuZFR5cGUsIGNsaXBfc2Nhbik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX0Rlc3RGb3JtYXQgJiAweDAyMDApCisgICAgICAgIENvbXBvc2l0ZVJvd184YnBwUGFsMkdyYXlhKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2NhbiwKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KG1fcFNyY1BhbGV0dGUuZ2V0KCkpLCB3aWR0aCwKKyAgICAgICAgICAgIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4sIGRzdF9leHRyYV9hbHBoYSwgc3JjX2V4dHJhX2FscGhhKTsKKyAgICAgIGVsc2UKKyAgICAgICAgQ29tcG9zaXRlUm93XzhicHBQYWwyR3JheSgKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihtX3BTcmNQYWxldHRlLmdldCgpKSwgd2lkdGgsCisgICAgICAgICAgICBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuLCBzcmNfZXh0cmFfYWxwaGEpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKG1faVRyYW5zcGFyZW5jeSkgeworICAgICAgY2FzZSAxICsgMjoKKyAgICAgICAgQ29tcG9zaXRlUm93XzhicHBSZ2IyQXJnYl9Ob0JsZW5kKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3JjUGFsZXR0ZS5nZXQoKSwgY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2V4dHJhX2FscGhhKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDEgKyAyICsgODoKKyAgICAgICAgQ29tcG9zaXRlUm93XzFicHBSZ2IyQXJnYl9Ob0JsZW5kKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19sZWZ0LCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFNyY1BhbGV0dGUuZ2V0KCksIGNsaXBfc2Nhbik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAwOgorICAgICAgICBDb21wb3NpdGVSb3dfOGJwcFJnYjJSZ2JfTm9CbGVuZCgKKyAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fcFNyY1BhbGV0dGUuZ2V0KCksIHdpZHRoLAorICAgICAgICAgICAgKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID4+IDMsIGNsaXBfc2Nhbiwgc3JjX2V4dHJhX2FscGhhKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDAgKyA4OgorICAgICAgICBDb21wb3NpdGVSb3dfMWJwcFJnYjJSZ2JfTm9CbGVuZChkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3JjUGFsZXR0ZS5nZXQoKSwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX0Rlc3RGb3JtYXQgJiAweGZmKSA+PiAzLCBjbGlwX3NjYW4pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMCArIDI6CisgICAgICAgIENvbXBvc2l0ZVJvd184YnBwUmdiMlJnYl9Ob0JsZW5kKAorICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9wU3JjUGFsZXR0ZS5nZXQoKSwgd2lkdGgsCisgICAgICAgICAgICAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMywgY2xpcF9zY2FuLCBzcmNfZXh0cmFfYWxwaGEpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMCArIDIgKyA4OgorICAgICAgICBDb21wb3NpdGVSb3dfMWJwcFJnYjJSZ2JhX05vQmxlbmQoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3JjUGFsZXR0ZS5nZXQoKSwgY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2V4dHJhX2FscGhhKTsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCit2b2lkIENGWF9TY2FubGluZUNvbXBvc2l0b3I6OkNvbXBvc2l0ZUJ5dGVNYXNrTGluZSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdF9leHRyYV9hbHBoYSkgeworICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCXzhicHBNYXNrKSB7CisgICAgQ29tcG9zaXRlUm93X0J5dGVNYXNrMk1hc2soZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2Nhbik7CisgIH0gZWxzZSBpZiAoKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID09IDgpIHsKKyAgICBpZiAobV9EZXN0Rm9ybWF0ICYgMHgwMjAwKSB7CisgICAgICBDb21wb3NpdGVSb3dfQnl0ZU1hc2syR3JheWEoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgY2xpcF9zY2FuLCBkc3RfZXh0cmFfYWxwaGEpOworICAgIH0gZWxzZSB7CisgICAgICBDb21wb3NpdGVSb3dfQnl0ZU1hc2syR3JheShkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGNsaXBfc2Nhbik7CisgICAgfQorICB9IGVsc2UgaWYgKG1fYlJnYkJ5dGVPcmRlcikgeworICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfQXJnYikgeworICAgICAgQ29tcG9zaXRlUm93X0J5dGVNYXNrMkFyZ2JfUmdiQnl0ZU9yZGVyKAorICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLAorICAgICAgICAgIHdpZHRoLCBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuKTsKKyAgICB9IGVsc2UgeworICAgICAgQ29tcG9zaXRlUm93X0J5dGVNYXNrMlJnYl9SZ2JCeXRlT3JkZXIoCisgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwgbV9NYXNrR3JlZW4sIG1fTWFza0JsdWUsCisgICAgICAgICAgd2lkdGgsIG1fQmxlbmRUeXBlLCAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMywgY2xpcF9zY2FuKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9IGVsc2UgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9BcmdiKSB7CisgICAgQ29tcG9zaXRlUm93X0J5dGVNYXNrMkFyZ2IoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX01hc2tHcmVlbiwgbV9NYXNrQmx1ZSwgd2lkdGgsIG1fQmxlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2Nhbik7CisgIH0gZWxzZSBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX1JnYiB8fCBtX0Rlc3RGb3JtYXQgPT0gRlhESUJfUmdiMzIpIHsKKyAgICBDb21wb3NpdGVSb3dfQnl0ZU1hc2syUmdiKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX01hc2tHcmVlbiwgbV9NYXNrQmx1ZSwgd2lkdGgsIG1fQmxlbmRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID4+IDMsIGNsaXBfc2Nhbik7CisgIH0gZWxzZSBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX1JnYmEpIHsKKyAgICBDb21wb3NpdGVSb3dfQnl0ZU1hc2syUmdiYShkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLCB3aWR0aCwgbV9CbGVuZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBkc3RfZXh0cmFfYWxwaGEpOworICB9Cit9CisKK3ZvaWQgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcjo6Q29tcG9zaXRlQml0TWFza0xpbmUodWludDhfdCogZGVzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0X2V4dHJhX2FscGhhKSB7CisgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKKyAgICBDb21wb3NpdGVSb3dfQml0TWFzazJNYXNrKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBzcmNfbGVmdCwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4pOworICB9IGVsc2UgaWYgKChtX0Rlc3RGb3JtYXQgJiAweGZmKSA9PSA4KSB7CisgICAgaWYgKG1fRGVzdEZvcm1hdCAmIDB4MDIwMCkgeworICAgICAgQ29tcG9zaXRlUm93X0JpdE1hc2syR3JheWEoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19sZWZ0LCB3aWR0aCwgY2xpcF9zY2FuLCBkc3RfZXh0cmFfYWxwaGEpOworICAgIH0gZWxzZSB7CisgICAgICBDb21wb3NpdGVSb3dfQml0TWFzazJHcmF5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19sZWZ0LCB3aWR0aCwgY2xpcF9zY2FuKTsKKyAgICB9CisgIH0gZWxzZSBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7CisgICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9BcmdiKSB7CisgICAgICBDb21wb3NpdGVSb3dfQml0TWFzazJBcmdiX1JnYkJ5dGVPcmRlcigKKyAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLCBtX01hc2tHcmVlbiwgbV9NYXNrQmx1ZSwKKyAgICAgICAgICBzcmNfbGVmdCwgd2lkdGgsIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4pOworICAgIH0gZWxzZSB7CisgICAgICBDb21wb3NpdGVSb3dfQml0TWFzazJSZ2JfUmdiQnl0ZU9yZGVyKAorICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLAorICAgICAgICAgIHNyY19sZWZ0LCB3aWR0aCwgbV9CbGVuZFR5cGUsIChtX0Rlc3RGb3JtYXQgJiAweGZmKSA+PiAzLCBjbGlwX3NjYW4pOworICAgIH0KKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKKyAgICBDb21wb3NpdGVSb3dfQml0TWFzazJBcmdiKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX01hc2tHcmVlbiwgbV9NYXNrQmx1ZSwgc3JjX2xlZnQsIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbGVuZFR5cGUsIGNsaXBfc2Nhbik7CisgIH0gZWxzZSBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX1JnYiB8fCBtX0Rlc3RGb3JtYXQgPT0gRlhESUJfUmdiMzIpIHsKKyAgICBDb21wb3NpdGVSb3dfQml0TWFzazJSZ2IoCisgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLAorICAgICAgICBzcmNfbGVmdCwgd2lkdGgsIG1fQmxlbmRUeXBlLCAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMywgY2xpcF9zY2FuKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2RpYi9jZnhfc2NhbmxpbmVjb21wb3NpdG9yLmggYi9jb3JlL2Z4Z2UvZGliL2NmeF9zY2FubGluZWNvbXBvc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWFiNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGdlL2RpYi9jZnhfc2NhbmxpbmVjb21wb3NpdG9yLmgKQEAgLTAsMCArMSw3NyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhHRV9ESUJfQ0ZYX1NDQU5MSU5FQ09NUE9TSVRPUl9IXworI2RlZmluZSBDT1JFX0ZYR0VfRElCX0NGWF9TQ0FOTElORUNPTVBPU0lUT1JfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2RpYnNvdXJjZS5oIgorCitjbGFzcyBDRlhfU2NhbmxpbmVDb21wb3NpdG9yIHsKKyBwdWJsaWM6CisgIENGWF9TY2FubGluZUNvbXBvc2l0b3IoKTsKKworICB+Q0ZYX1NjYW5saW5lQ29tcG9zaXRvcigpOworCisgIGJvb2wgSW5pdChGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsCisgICAgICAgICAgICBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICB1aW50MzJfdCogcFNyY1BhbGV0dGUsCisgICAgICAgICAgICB1aW50MzJfdCBtYXNrX2NvbG9yLAorICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCisgICAgICAgICAgICBib29sIGJDbGlwLAorICAgICAgICAgICAgYm9vbCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcpOworCisgIHZvaWQgQ29tcG9zaXRlUmdiQml0bWFwTGluZSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19leHRyYV9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdF9leHRyYV9hbHBoYSk7CisKKyAgdm9pZCBDb21wb3NpdGVQYWxCaXRtYXBMaW5lKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2V4dHJhX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0X2V4dHJhX2FscGhhKTsKKworICB2b2lkIENvbXBvc2l0ZUJ5dGVNYXNrTGluZSh1aW50OF90KiBkZXN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0X2V4dHJhX2FscGhhKTsKKworICB2b2lkIENvbXBvc2l0ZUJpdE1hc2tMaW5lKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3RfZXh0cmFfYWxwaGEpOworCisgcHJpdmF0ZToKKyAgdm9pZCBJbml0U291cmNlUGFsZXR0ZShGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHBTcmNQYWxldHRlKTsKKworICB2b2lkIEluaXRTb3VyY2VNYXNrKGludCBhbHBoYV9mbGFnLCB1aW50MzJfdCBtYXNrX2NvbG9yKTsKKworICBpbnQgbV9pVHJhbnNwYXJlbmN5OworICBGWERJQl9Gb3JtYXQgbV9TcmNGb3JtYXQ7CisgIEZYRElCX0Zvcm1hdCBtX0Rlc3RGb3JtYXQ7CisgIHN0ZDo6dW5pcXVlX3B0cjx1aW50MzJfdCwgRnhGcmVlRGVsZXRlcj4gbV9wU3JjUGFsZXR0ZTsKKyAgaW50IG1fTWFza0FscGhhOworICBpbnQgbV9NYXNrUmVkOworICBpbnQgbV9NYXNrR3JlZW47CisgIGludCBtX01hc2tCbHVlOworICBpbnQgbV9CbGVuZFR5cGU7CisgIGJvb2wgbV9iUmdiQnl0ZU9yZGVyOworfTsKKworI2VuZGlmICAvLyBDT1JFX0ZYR0VfRElCX0NGWF9TQ0FOTElORUNPTVBPU0lUT1JfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9kaWIvY3N0cmV0Y2hlbmdpbmUuY3BwIGIvY29yZS9meGdlL2RpYi9jc3RyZXRjaGVuZ2luZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgwMzk1OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9kaWIvY3N0cmV0Y2hlbmdpbmUuY3BwCkBAIC0wLDAgKzEsNzUwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NzdHJldGNoZW5naW5lLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvaWZ4X3BhdXNlaW5kaWNhdG9yLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfZGliaXRtYXAuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9kaWJzb3VyY2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2lmeF9zY2FubGluZWNvbXBvc2VyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBpbnQga01heERlc3RWYWx1ZSA9IDE2NzExNjgwOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1N0cmV0Y2hFbmdpbmU6OkNXZWlnaHRUYWJsZTo6Q1dlaWdodFRhYmxlKCkKKyAgICA6IG1fRGVzdE1pbigwKSwKKyAgICAgIG1fSXRlbVNpemUoMCksCisgICAgICBtX2R3V2VpZ2h0VGFibGVzU2l6ZSgwKSB7fQorCitDU3RyZXRjaEVuZ2luZTo6Q1dlaWdodFRhYmxlOjp+Q1dlaWdodFRhYmxlKCkge30KKworc2l6ZV90IENTdHJldGNoRW5naW5lOjpDV2VpZ2h0VGFibGU6OkdldFBpeGVsV2VpZ2h0U2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fSXRlbVNpemUgLyBzaXplb2YoaW50KSAtIDI7Cit9CisKK2Jvb2wgQ1N0cmV0Y2hFbmdpbmU6OkNXZWlnaHRUYWJsZTo6Q2FsYyhpbnQgZGVzdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X21heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX21heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpIHsKKyAgbV9XZWlnaHRUYWJsZXMuY2xlYXIoKTsKKyAgbV9kd1dlaWdodFRhYmxlc1NpemUgPSAwOworICBjb25zdCBkb3VibGUgc2NhbGUgPSBzdGF0aWNfY2FzdDxmbG9hdD4oc3JjX2xlbikgLyBkZXN0X2xlbjsKKyAgY29uc3QgZG91YmxlIGJhc2UgPSBkZXN0X2xlbiA8IDAgPyBzcmNfbGVuIDogMDsKKyAgY29uc3QgaW50IGV4dF9zaXplID0gZmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MID8gMyA6IDE7CisgIG1fSXRlbVNpemUgPQorICAgICAgc2l6ZW9mKGludCkgKiAyICsKKyAgICAgIHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKGludCkgKgorICAgICAgICAgICAgICAgICAgICAgICAoY2VpbChmYWJzKHN0YXRpY19jYXN0PGZsb2F0PihzY2FsZSkpKSArIGV4dF9zaXplKSk7CisKKyAgbV9EZXN0TWluID0gZGVzdF9taW47CisgIGlmIChkZXN0X21heCAtIGRlc3RfbWluID4gc3RhdGljX2Nhc3Q8aW50PigoMVUgPDwgMzApIC0gNCkgLyBtX0l0ZW1TaXplKQorICAgIHJldHVybiBmYWxzZTsKKworICBtX2R3V2VpZ2h0VGFibGVzU2l6ZSA9IChkZXN0X21heCAtIGRlc3RfbWluKSAqIG1fSXRlbVNpemUgKyA0OworICBtX1dlaWdodFRhYmxlcy5yZXNpemUobV9kd1dlaWdodFRhYmxlc1NpemUpOworICBpZiAoKGZsYWdzICYgRlhESUJfTk9TTU9PVEgpICE9IDAgfHwgZmFicyhzdGF0aWNfY2FzdDxmbG9hdD4oc2NhbGUpKSA8IDEuMGYpIHsKKyAgICBmb3IgKGludCBkZXN0X3BpeGVsID0gZGVzdF9taW47IGRlc3RfcGl4ZWwgPCBkZXN0X21heDsgKytkZXN0X3BpeGVsKSB7CisgICAgICBQaXhlbFdlaWdodCYgcGl4ZWxfd2VpZ2h0cyA9ICpHZXRQaXhlbFdlaWdodChkZXN0X3BpeGVsKTsKKyAgICAgIGRvdWJsZSBzcmNfcG9zID0gZGVzdF9waXhlbCAqIHNjYWxlICsgc2NhbGUgLyAyICsgYmFzZTsKKyAgICAgIGlmIChmbGFncyAmIEZYRElCX0lOVEVSUE9MKSB7CisgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGZsb29yKHN0YXRpY19jYXN0PGZsb2F0PihzcmNfcG9zKSAtIDEuMGYgLyAyKSk7CisgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihmbG9vcihzdGF0aWNfY2FzdDxmbG9hdD4oc3JjX3BvcykgKyAxLjBmIC8gMikpOworICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBzdGQ6Om1heChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQsIHNyY19taW4pOworICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gc3RkOjptaW4ocGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCwgc3JjX21heCAtIDEpOworICAgICAgICBpZiAocGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID09IHBpeGVsX3dlaWdodHMubV9TcmNFbmQpIHsKKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IDY1NTM2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzFdID0KKyAgICAgICAgICAgICAgRlhTWVNfcm91bmQoc3RhdGljX2Nhc3Q8ZmxvYXQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3BvcyAtIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCAtIDEuMGYgLyAyKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgIDY1NTM2KTsKKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IDY1NTM2IC0gcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV07CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7CisgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGZsb29yKHN0YXRpY19jYXN0PGZsb2F0PihzcmNfcG9zKSAtIDEuMGYgLyAyKSk7CisgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihmbG9vcihzdGF0aWNfY2FzdDxmbG9hdD4oc3JjX3BvcykgKyAxLjBmIC8gMikpOworICAgICAgICBpbnQgc3RhcnQgPSBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgLSAxOworICAgICAgICBpbnQgZW5kID0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCArIDE7CisgICAgICAgIHN0YXJ0ID0gc3RkOjptYXgoc3RhcnQsIHNyY19taW4pOworICAgICAgICBlbmQgPSBzdGQ6Om1pbihlbmQsIHNyY19tYXggLSAxKTsKKyAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA8IHNyY19taW4pIHsKKyAgICAgICAgICBzcmNfcG9zICs9IHNyY19taW4gLSBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQ7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3JjX21pbjsKKyAgICAgICAgfQorICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gc3RkOjptaW4ocGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCwgc3JjX21heCAtIDEpOworICAgICAgICBpbnQgd2VpZ2h0ID0gRlhTWVNfcm91bmQoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oc3JjX3BvcyAtIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCAtIDEuMGYgLyAyKSAqCisgICAgICAgICAgICAyNTYpOworICAgICAgICBpZiAoc3RhcnQgPT0gZW5kKSB7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMF0gPQorICAgICAgICAgICAgICAoU0RQX1RhYmxlWzI1NiArIHdlaWdodF0gKyBTRFBfVGFibGVbd2VpZ2h0XSArCisgICAgICAgICAgICAgICBTRFBfVGFibGVbMjU2IC0gd2VpZ2h0XSArIFNEUF9UYWJsZVs1MTIgLSB3ZWlnaHRdKQorICAgICAgICAgICAgICA8PCA4OworICAgICAgICB9IGVsc2UgaWYgKChzdGFydCA9PSBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgJiYKKyAgICAgICAgICAgICAgICAgICAgKHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9PSBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kIHx8CisgICAgICAgICAgICAgICAgICAgICBlbmQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCkgJiYKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPCBlbmQpIHx8CisgICAgICAgICAgICAgICAgICAgKHN0YXJ0IDwgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ICYmCisgICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9PSBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kICYmCisgICAgICAgICAgICAgICAgICAgIGVuZCA9PSBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kKSkgeworICAgICAgICAgIGlmIChzdGFydCA8IHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCkgeworICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMF0gPSBTRFBfVGFibGVbMjU2ICsgd2VpZ2h0XSA8PCA4OworICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV0gPQorICAgICAgICAgICAgICAgIChTRFBfVGFibGVbd2VpZ2h0XSArIFNEUF9UYWJsZVsyNTYgLSB3ZWlnaHRdICsKKyAgICAgICAgICAgICAgICAgU0RQX1RhYmxlWzUxMiAtIHdlaWdodF0pCisgICAgICAgICAgICAgICAgPDwgODsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9PSBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kKSB7CisgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0KKyAgICAgICAgICAgICAgICAgIChTRFBfVGFibGVbMjU2ICsgd2VpZ2h0XSArIFNEUF9UYWJsZVt3ZWlnaHRdICsKKyAgICAgICAgICAgICAgICAgICBTRFBfVGFibGVbMjU2IC0gd2VpZ2h0XSkKKyAgICAgICAgICAgICAgICAgIDw8IDg7CisgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzFdID0gU0RQX1RhYmxlWzUxMiAtIHdlaWdodF0gPDwgODsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0KKyAgICAgICAgICAgICAgICAgIChTRFBfVGFibGVbMjU2ICsgd2VpZ2h0XSArIFNEUF9UYWJsZVt3ZWlnaHRdKSA8PCA4OworICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1sxXSA9CisgICAgICAgICAgICAgICAgICAoU0RQX1RhYmxlWzI1NiAtIHdlaWdodF0gKyBTRFBfVGFibGVbNTEyIC0gd2VpZ2h0XSkgPDwgODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9PSBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kKSB7CisgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gZW5kOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoc3RhcnQgPCBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQpIHsKKyAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IHN0YXJ0OworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzdGFydCA9PSBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgJiYKKyAgICAgICAgICAgICAgICAgICBzdGFydCA8IHBpeGVsX3dlaWdodHMubV9TcmNFbmQgJiYKKyAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kIDwgZW5kKSB7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMF0gPQorICAgICAgICAgICAgICAoU0RQX1RhYmxlWzI1NiArIHdlaWdodF0gKyBTRFBfVGFibGVbd2VpZ2h0XSkgPDwgODsKKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1sxXSA9IFNEUF9UYWJsZVsyNTYgLSB3ZWlnaHRdIDw8IDg7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMl0gPSBTRFBfVGFibGVbNTEyIC0gd2VpZ2h0XSA8PCA4OworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBlbmQ7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhcnQgPCBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgJiYKKyAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPCBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kICYmCisgICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9PSBlbmQpIHsKKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IFNEUF9UYWJsZVsyNTYgKyB3ZWlnaHRdIDw8IDg7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV0gPSBTRFBfVGFibGVbd2VpZ2h0XSA8PCA4OworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzJdID0KKyAgICAgICAgICAgICAgKFNEUF9UYWJsZVsyNTYgLSB3ZWlnaHRdICsgU0RQX1RhYmxlWzUxMiAtIHdlaWdodF0pIDw8IDg7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3RhcnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMF0gPSBTRFBfVGFibGVbMjU2ICsgd2VpZ2h0XSA8PCA4OworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzFdID0gU0RQX1RhYmxlW3dlaWdodF0gPDwgODsKKyAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1syXSA9IFNEUF9UYWJsZVsyNTYgLSB3ZWlnaHRdIDw8IDg7CisgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbM10gPSBTRFBfVGFibGVbNTEyIC0gd2VpZ2h0XSA8PCA4OworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IHN0YXJ0OworICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBlbmQ7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBwaXhlbF9wb3MgPSBzdGF0aWNfY2FzdDxpbnQ+KGZsb29yKHN0YXRpY19jYXN0PGZsb2F0PihzcmNfcG9zKSkpOworICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBzdGQ6Om1heChwaXhlbF9wb3MsIHNyY19taW4pOworICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gc3RkOjptaW4ocGl4ZWxfcG9zLCBzcmNfbWF4IC0gMSk7CisgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gNjU1MzY7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgZm9yIChpbnQgZGVzdF9waXhlbCA9IGRlc3RfbWluOyBkZXN0X3BpeGVsIDwgZGVzdF9tYXg7ICsrZGVzdF9waXhlbCkgeworICAgIFBpeGVsV2VpZ2h0JiBwaXhlbF93ZWlnaHRzID0gKkdldFBpeGVsV2VpZ2h0KGRlc3RfcGl4ZWwpOworICAgIGRvdWJsZSBzcmNfc3RhcnQgPSBkZXN0X3BpeGVsICogc2NhbGUgKyBiYXNlOworICAgIGRvdWJsZSBzcmNfZW5kID0gc3JjX3N0YXJ0ICsgc2NhbGU7CisgICAgaW50IHN0YXJ0X2kgPSBmbG9vcihzdGQ6Om1pbihzcmNfc3RhcnQsIHNyY19lbmQpKTsKKyAgICBpbnQgZW5kX2kgPSBmbG9vcihzdGQ6Om1heChzcmNfc3RhcnQsIHNyY19lbmQpKTsKKyAgICBzdGFydF9pID0gc3RkOjptYXgoc3RhcnRfaSwgc3JjX21pbik7CisgICAgZW5kX2kgPSBzdGQ6Om1pbihlbmRfaSwgc3JjX21heCAtIDEpOworICAgIGlmIChzdGFydF9pID4gZW5kX2kpIHsKKyAgICAgIHN0YXJ0X2kgPSBzdGQ6Om1pbihzdGFydF9pLCBzcmNfbWF4IC0gMSk7CisgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBzdGFydF9pOworICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IHN0YXJ0X2k7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3RhcnRfaTsKKyAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gZW5kX2k7CisgICAgZm9yIChpbnQgaiA9IHN0YXJ0X2k7IGogPD0gZW5kX2k7ICsraikgeworICAgICAgZG91YmxlIGRlc3Rfc3RhcnQgPSAoaiAtIGJhc2UpIC8gc2NhbGU7CisgICAgICBkb3VibGUgZGVzdF9lbmQgPSAoaiArIDEgLSBiYXNlKSAvIHNjYWxlOworICAgICAgaWYgKGRlc3Rfc3RhcnQgPiBkZXN0X2VuZCkKKyAgICAgICAgc3RkOjpzd2FwKGRlc3Rfc3RhcnQsIGRlc3RfZW5kKTsKKyAgICAgIGRvdWJsZSBhcmVhX3N0YXJ0ID0gc3RkOjptYXgoZGVzdF9zdGFydCwgc3RhdGljX2Nhc3Q8ZG91YmxlPihkZXN0X3BpeGVsKSk7CisgICAgICBkb3VibGUgYXJlYV9lbmQgPSBzdGQ6Om1pbihkZXN0X2VuZCwgc3RhdGljX2Nhc3Q8ZG91YmxlPihkZXN0X3BpeGVsICsgMSkpOworICAgICAgZG91YmxlIHdlaWdodCA9IHN0ZDo6bWF4KDAuMCwgYXJlYV9lbmQgLSBhcmVhX3N0YXJ0KTsKKyAgICAgIGlmICh3ZWlnaHQgPT0gMCAmJiBqID09IGVuZF9pKSB7CisgICAgICAgIC0tcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBzaXplX3QgaWR4ID0gaiAtIHN0YXJ0X2k7CisgICAgICBpZiAoaWR4ID49IEdldFBpeGVsV2VpZ2h0U2l6ZSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzW2lkeF0gPSBGWFNZU19yb3VuZCh3ZWlnaHQgKiA2NTUzNik7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitQaXhlbFdlaWdodCogQ1N0cmV0Y2hFbmdpbmU6OkNXZWlnaHRUYWJsZTo6R2V0UGl4ZWxXZWlnaHQoaW50IHBpeGVsKSBjb25zdCB7CisgIEFTU0VSVChwaXhlbCA+PSBtX0Rlc3RNaW4pOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQaXhlbFdlaWdodCo+KGNvbnN0X2Nhc3Q8dWludDhfdCo+KAorICAgICAgbV9XZWlnaHRUYWJsZXMuZGF0YSgpICsgKHBpeGVsIC0gbV9EZXN0TWluKSAqIG1fSXRlbVNpemUpKTsKK30KKworaW50KiBDU3RyZXRjaEVuZ2luZTo6Q1dlaWdodFRhYmxlOjpHZXRWYWx1ZUZyb21QaXhlbFdlaWdodChQaXhlbFdlaWdodCogcFdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdCB7CisgIGlmIChpbmRleCA8IHBXZWlnaHQtPm1fU3JjU3RhcnQpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgc2l6ZV90IGlkeCA9IGluZGV4IC0gcFdlaWdodC0+bV9TcmNTdGFydDsKKyAgcmV0dXJuIGlkeCA8IEdldFBpeGVsV2VpZ2h0U2l6ZSgpID8gJnBXZWlnaHQtPm1fV2VpZ2h0c1tpZHhdIDogbnVsbHB0cjsKK30KKworQ1N0cmV0Y2hFbmdpbmU6OkNTdHJldGNoRW5naW5lKElGWF9TY2FubGluZUNvbXBvc2VyKiBwRGVzdEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QmIGNsaXBfcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKSB7CisgIG1fU3RhdGUgPSAwOworICBtX0Rlc3RGb3JtYXQgPSBkZXN0X2Zvcm1hdDsKKyAgbV9EZXN0QnBwID0gZGVzdF9mb3JtYXQgJiAweGZmOworICBtX1NyY0JwcCA9IHBTcmNCaXRtYXAtPkdldEZvcm1hdCgpICYgMHhmZjsKKyAgbV9iSGFzQWxwaGEgPSBwU3JjQml0bWFwLT5HZXRGb3JtYXQoKSAmIDB4MjAwOworICBtX3BTcmNQYWxldHRlID0gcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpOworICBtX3BEZXN0Qml0bWFwID0gcERlc3RCaXRtYXA7CisgIG1fRGVzdFdpZHRoID0gZGVzdF93aWR0aDsKKyAgbV9EZXN0SGVpZ2h0ID0gZGVzdF9oZWlnaHQ7CisgIG1fRGVzdENsaXAgPSBjbGlwX3JlY3Q7CisgIHVpbnQzMl90IHNpemUgPSBjbGlwX3JlY3QuV2lkdGgoKTsKKyAgaWYgKHNpemUgJiYgbV9EZXN0QnBwID4gc3RhdGljX2Nhc3Q8aW50PihJTlRfTUFYIC8gc2l6ZSkpCisgICAgcmV0dXJuOworCisgIHNpemUgKj0gbV9EZXN0QnBwOworICBpZiAoc2l6ZSA+IElOVF9NQVggLSAzMSkKKyAgICByZXR1cm47CisKKyAgc2l6ZSArPSAzMTsKKyAgc2l6ZSA9IHNpemUgLyAzMiAqIDQ7CisgIG1fRGVzdFNjYW5saW5lLnJlc2l6ZShzaXplKTsKKyAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCX1JnYjMyKQorICAgIHN0ZDo6ZmlsbChtX0Rlc3RTY2FubGluZS5iZWdpbigpLCBtX0Rlc3RTY2FubGluZS5lbmQoKSwgMjU1KTsKKyAgbV9JbnRlclBpdGNoID0gKG1fRGVzdENsaXAuV2lkdGgoKSAqIG1fRGVzdEJwcCArIDMxKSAvIDMyICogNDsKKyAgbV9FeHRyYU1hc2tQaXRjaCA9IChtX0Rlc3RDbGlwLldpZHRoKCkgKiA4ICsgMzEpIC8gMzIgKiA0OworICBtX3BTb3VyY2UgPSBwU3JjQml0bWFwOworICBtX1NyY1dpZHRoID0gcFNyY0JpdG1hcC0+R2V0V2lkdGgoKTsKKyAgbV9TcmNIZWlnaHQgPSBwU3JjQml0bWFwLT5HZXRIZWlnaHQoKTsKKyAgbV9TcmNQaXRjaCA9IChtX1NyY1dpZHRoICogbV9TcmNCcHAgKyAzMSkgLyAzMiAqIDQ7CisgIGlmICgoZmxhZ3MgJiBGWERJQl9OT1NNT09USCkgPT0gMCkgeworICAgIGJvb2wgYkludGVycG9sID0gZmxhZ3MgJiBGWERJQl9JTlRFUlBPTCB8fCBmbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0w7CisgICAgaWYgKCFiSW50ZXJwb2wgJiYgYWJzKGRlc3Rfd2lkdGgpICE9IDAgJiYKKyAgICAgICAgYWJzKGRlc3RfaGVpZ2h0KSAvIDggPCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG1fU3JjV2lkdGgpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9TcmNIZWlnaHQgLyBhYnMoZGVzdF93aWR0aCkpIHsKKyAgICAgIGZsYWdzID0gRlhESUJfSU5URVJQT0w7CisgICAgfQorICAgIG1fRmxhZ3MgPSBmbGFnczsKKyAgfSBlbHNlIHsKKyAgICBtX0ZsYWdzID0gRlhESUJfTk9TTU9PVEg7CisgICAgaWYgKGZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkKKyAgICAgIG1fRmxhZ3MgfD0gRlhESUJfRE9XTlNBTVBMRTsKKyAgfQorICBkb3VibGUgc2NhbGVfeCA9IHN0YXRpY19jYXN0PGZsb2F0PihtX1NyY1dpZHRoKSAvIG1fRGVzdFdpZHRoOworICBkb3VibGUgc2NhbGVfeSA9IHN0YXRpY19jYXN0PGZsb2F0PihtX1NyY0hlaWdodCkgLyBtX0Rlc3RIZWlnaHQ7CisgIGRvdWJsZSBiYXNlX3ggPSBtX0Rlc3RXaWR0aCA+IDAgPyAwLjBmIDogbV9EZXN0V2lkdGg7CisgIGRvdWJsZSBiYXNlX3kgPSBtX0Rlc3RIZWlnaHQgPiAwID8gMC4wZiA6IG1fRGVzdEhlaWdodDsKKyAgZG91YmxlIHNyY19sZWZ0ID0gc2NhbGVfeCAqIChjbGlwX3JlY3QubGVmdCArIGJhc2VfeCk7CisgIGRvdWJsZSBzcmNfcmlnaHQgPSBzY2FsZV94ICogKGNsaXBfcmVjdC5yaWdodCArIGJhc2VfeCk7CisgIGRvdWJsZSBzcmNfdG9wID0gc2NhbGVfeSAqIChjbGlwX3JlY3QudG9wICsgYmFzZV95KTsKKyAgZG91YmxlIHNyY19ib3R0b20gPSBzY2FsZV95ICogKGNsaXBfcmVjdC5ib3R0b20gKyBiYXNlX3kpOworICBpZiAoc3JjX2xlZnQgPiBzcmNfcmlnaHQpCisgICAgc3RkOjpzd2FwKHNyY19sZWZ0LCBzcmNfcmlnaHQpOworICBpZiAoc3JjX3RvcCA+IHNyY19ib3R0b20pCisgICAgc3RkOjpzd2FwKHNyY190b3AsIHNyY19ib3R0b20pOworICBtX1NyY0NsaXAubGVmdCA9IHN0YXRpY19jYXN0PGludD4oZmxvb3Ioc3JjX2xlZnQpKTsKKyAgbV9TcmNDbGlwLnJpZ2h0ID0gc3RhdGljX2Nhc3Q8aW50PihjZWlsKHNyY19yaWdodCkpOworICBtX1NyY0NsaXAudG9wID0gc3RhdGljX2Nhc3Q8aW50PihmbG9vcihzcmNfdG9wKSk7CisgIG1fU3JjQ2xpcC5ib3R0b20gPSBzdGF0aWNfY2FzdDxpbnQ+KGNlaWwoc3JjX2JvdHRvbSkpOworICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIG1fU3JjV2lkdGgsIG1fU3JjSGVpZ2h0KTsKKyAgbV9TcmNDbGlwLkludGVyc2VjdChzcmNfcmVjdCk7CisgIGlmIChtX1NyY0JwcCA9PSAxKSB7CisgICAgaWYgKG1fRGVzdEJwcCA9PSA4KQorICAgICAgbV9UcmFuc01ldGhvZCA9IDE7CisgICAgZWxzZQorICAgICAgbV9UcmFuc01ldGhvZCA9IDI7CisgIH0gZWxzZSBpZiAobV9TcmNCcHAgPT0gOCkgeworICAgIGlmIChtX0Rlc3RCcHAgPT0gOCkgeworICAgICAgaWYgKCFtX2JIYXNBbHBoYSkKKyAgICAgICAgbV9UcmFuc01ldGhvZCA9IDM7CisgICAgICBlbHNlCisgICAgICAgIG1fVHJhbnNNZXRob2QgPSA0OworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIW1fYkhhc0FscGhhKQorICAgICAgICBtX1RyYW5zTWV0aG9kID0gNTsKKyAgICAgIGVsc2UKKyAgICAgICAgbV9UcmFuc01ldGhvZCA9IDY7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICghbV9iSGFzQWxwaGEpCisgICAgICBtX1RyYW5zTWV0aG9kID0gNzsKKyAgICBlbHNlCisgICAgICBtX1RyYW5zTWV0aG9kID0gODsKKyAgfQorfQorCitDU3RyZXRjaEVuZ2luZTo6fkNTdHJldGNoRW5naW5lKCkge30KKworYm9vbCBDU3RyZXRjaEVuZ2luZTo6Q29udGludWUoSUZYX1BhdXNlSW5kaWNhdG9yKiBwUGF1c2UpIHsKKyAgd2hpbGUgKG1fU3RhdGUgPT0gMSkgeworICAgIGlmIChDb250aW51ZVN0cmV0Y2hIb3J6KHBQYXVzZSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIG1fU3RhdGUgPSAyOworICAgIFN0cmV0Y2hWZXJ0KCk7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENTdHJldGNoRW5naW5lOjpTdGFydFN0cmV0Y2hIb3J6KCkgeworICBpZiAobV9EZXN0V2lkdGggPT0gMCB8fCBtX0ludGVyUGl0Y2ggPT0gMCB8fCBtX0Rlc3RTY2FubGluZS5lbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAobV9TcmNDbGlwLkhlaWdodCgpID09IDAgfHwKKyAgICAgIG1fU3JjQ2xpcC5IZWlnaHQoKSA+ICgxIDw8IDI5KSAvIG1fSW50ZXJQaXRjaCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIG1fSW50ZXJCdWYucmVzaXplKG1fU3JjQ2xpcC5IZWlnaHQoKSAqIG1fSW50ZXJQaXRjaCk7CisgIGlmIChtX3BTb3VyY2UgJiYgbV9iSGFzQWxwaGEgJiYgbV9wU291cmNlLT5tX3BBbHBoYU1hc2spIHsKKyAgICBtX0V4dHJhQWxwaGFCdWYucmVzaXplKG1fU3JjQ2xpcC5IZWlnaHQoKSwgbV9FeHRyYU1hc2tQaXRjaCk7CisgICAgdWludDMyX3Qgc2l6ZSA9IChtX0Rlc3RDbGlwLldpZHRoKCkgKiA4ICsgMzEpIC8gMzIgKiA0OworICAgIG1fRGVzdE1hc2tTY2FubGluZS5yZXNpemUoc2l6ZSk7CisgIH0KKyAgYm9vbCByZXQgPQorICAgICAgbV9XZWlnaHRUYWJsZS5DYWxjKG1fRGVzdFdpZHRoLCBtX0Rlc3RDbGlwLmxlZnQsIG1fRGVzdENsaXAucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9TcmNXaWR0aCwgbV9TcmNDbGlwLmxlZnQsIG1fU3JjQ2xpcC5yaWdodCwgbV9GbGFncyk7CisgIGlmICghcmV0KQorICAgIHJldHVybiBmYWxzZTsKKworICBtX0N1clJvdyA9IG1fU3JjQ2xpcC50b3A7CisgIG1fU3RhdGUgPSAxOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDU3RyZXRjaEVuZ2luZTo6Q29udGludWVTdHJldGNoSG9yeihJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSkgeworICBpZiAoIW1fRGVzdFdpZHRoKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKG1fcFNvdXJjZS0+U2tpcFRvU2NhbmxpbmUobV9DdXJSb3csIHBQYXVzZSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaW50IEJwcCA9IG1fRGVzdEJwcCAvIDg7CisgIHN0YXRpYyBjb25zdCBpbnQga1N0cmVjaFBhdXNlUm93cyA9IDEwOworICBpbnQgcm93c190b19nbyA9IGtTdHJlY2hQYXVzZVJvd3M7CisgIGZvciAoOyBtX0N1clJvdyA8IG1fU3JjQ2xpcC5ib3R0b207ICsrbV9DdXJSb3cpIHsKKyAgICBpZiAocm93c190b19nbyA9PSAwKSB7CisgICAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIHJvd3NfdG9fZ28gPSBrU3RyZWNoUGF1c2VSb3dzOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gbV9wU291cmNlLT5HZXRTY2FubGluZShtX0N1clJvdyk7CisgICAgdWludDhfdCogZGVzdF9zY2FuID0KKyAgICAgICAgbV9JbnRlckJ1Zi5kYXRhKCkgKyAobV9DdXJSb3cgLSBtX1NyY0NsaXAudG9wKSAqIG1fSW50ZXJQaXRjaDsKKyAgICBjb25zdCB1aW50OF90KiBzcmNfc2Nhbl9tYXNrID0gbnVsbHB0cjsKKyAgICB1aW50OF90KiBkZXN0X3NjYW5fbWFzayA9IG51bGxwdHI7CisgICAgaWYgKCFtX0V4dHJhQWxwaGFCdWYuZW1wdHkoKSkgeworICAgICAgc3JjX3NjYW5fbWFzayA9IG1fcFNvdXJjZS0+bV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShtX0N1clJvdyk7CisgICAgICBkZXN0X3NjYW5fbWFzayA9IG1fRXh0cmFBbHBoYUJ1Zi5kYXRhKCkgKworICAgICAgICAgICAgICAgICAgICAgICAobV9DdXJSb3cgLSBtX1NyY0NsaXAudG9wKSAqIG1fRXh0cmFNYXNrUGl0Y2g7CisgICAgfQorICAgIC8vIFRPRE8obnBtKTogcmVkdWNlIGR1cGxpY2F0ZWQgY29kZSBoZXJlCisgICAgc3dpdGNoIChtX1RyYW5zTWV0aG9kKSB7CisgICAgICBjYXNlIDE6CisgICAgICBjYXNlIDI6IHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyArK2NvbCkgeworICAgICAgICAgIFBpeGVsV2VpZ2h0KiBwV2VpZ2h0cyA9IG1fV2VpZ2h0VGFibGUuR2V0UGl4ZWxXZWlnaHQoY29sKTsKKyAgICAgICAgICBpbnQgZGVzdF9hID0gMDsKKyAgICAgICAgICBmb3IgKGludCBqID0gcFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFdlaWdodHMtPm1fU3JjRW5kOyArK2opIHsKKyAgICAgICAgICAgIGludCogcFdlaWdodCA9IG1fV2VpZ2h0VGFibGUuR2V0VmFsdWVGcm9tUGl4ZWxXZWlnaHQocFdlaWdodHMsIGopOworICAgICAgICAgICAgaWYgKCFwV2VpZ2h0KQorICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSAqcFdlaWdodDsKKyAgICAgICAgICAgIGlmIChzcmNfc2NhbltqIC8gOF0gJiAoMSA8PCAoNyAtIGogJSA4KSkpCisgICAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQgKiAyNTU7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkKKyAgICAgICAgICAgIGRlc3RfYSA9IHBkZml1bTo6Y2xhbXAoZGVzdF9hLCAwLCBrTWF4RGVzdFZhbHVlKTsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzdGF0aWNfY2FzdDx1aW50OF90PihkZXN0X2EgPj4gMTYpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAzOiB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgKytjb2wpIHsKKyAgICAgICAgICBQaXhlbFdlaWdodCogcFdlaWdodHMgPSBtX1dlaWdodFRhYmxlLkdldFBpeGVsV2VpZ2h0KGNvbCk7CisgICAgICAgICAgaW50IGRlc3RfYSA9IDA7CisgICAgICAgICAgZm9yIChpbnQgaiA9IHBXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBXZWlnaHRzLT5tX1NyY0VuZDsgKytqKSB7CisgICAgICAgICAgICBpbnQqIHBXZWlnaHQgPSBtX1dlaWdodFRhYmxlLkdldFZhbHVlRnJvbVBpeGVsV2VpZ2h0KHBXZWlnaHRzLCBqKTsKKyAgICAgICAgICAgIGlmICghcFdlaWdodCkKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gKnBXZWlnaHQ7CisgICAgICAgICAgICBkZXN0X2EgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX3NjYW5bal07CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkKKyAgICAgICAgICAgIGRlc3RfYSA9IHBkZml1bTo6Y2xhbXAoZGVzdF9hLCAwLCBrTWF4RGVzdFZhbHVlKTsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzdGF0aWNfY2FzdDx1aW50OF90PihkZXN0X2EgPj4gMTYpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSA0OiB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgKytjb2wpIHsKKyAgICAgICAgICBQaXhlbFdlaWdodCogcFdlaWdodHMgPSBtX1dlaWdodFRhYmxlLkdldFBpeGVsV2VpZ2h0KGNvbCk7CisgICAgICAgICAgaW50IGRlc3RfYSA9IDA7CisgICAgICAgICAgaW50IGRlc3RfciA9IDA7CisgICAgICAgICAgZm9yIChpbnQgaiA9IHBXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBXZWlnaHRzLT5tX1NyY0VuZDsgKytqKSB7CisgICAgICAgICAgICBpbnQqIHBXZWlnaHQgPSBtX1dlaWdodFRhYmxlLkdldFZhbHVlRnJvbVBpeGVsV2VpZ2h0KHBXZWlnaHRzLCBqKTsKKyAgICAgICAgICAgIGlmICghcFdlaWdodCkKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gKnBXZWlnaHQ7CisgICAgICAgICAgICBwaXhlbF93ZWlnaHQgPSBwaXhlbF93ZWlnaHQgKiBzcmNfc2Nhbl9tYXNrW2pdIC8gMjU1OworICAgICAgICAgICAgZGVzdF9yICs9IHBpeGVsX3dlaWdodCAqIHNyY19zY2FuW2pdOworICAgICAgICAgICAgZGVzdF9hICs9IHBpeGVsX3dlaWdodDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7CisgICAgICAgICAgICBkZXN0X3IgPSBwZGZpdW06OmNsYW1wKGRlc3RfciwgMCwga01heERlc3RWYWx1ZSk7CisgICAgICAgICAgICBkZXN0X2EgPSBwZGZpdW06OmNsYW1wKGRlc3RfYSwgMCwgNjU1MzYpOworICAgICAgICAgIH0KKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzdGF0aWNfY2FzdDx1aW50OF90PihkZXN0X3IgPj4gMTYpOworICAgICAgICAgICpkZXN0X3NjYW5fbWFzaysrID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oKGRlc3RfYSAqIDI1NSkgPj4gMTYpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSA1OiB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgKytjb2wpIHsKKyAgICAgICAgICBQaXhlbFdlaWdodCogcFdlaWdodHMgPSBtX1dlaWdodFRhYmxlLkdldFBpeGVsV2VpZ2h0KGNvbCk7CisgICAgICAgICAgaW50IGRlc3Rfcl95ID0gMDsKKyAgICAgICAgICBpbnQgZGVzdF9nX20gPSAwOworICAgICAgICAgIGludCBkZXN0X2JfYyA9IDA7CisgICAgICAgICAgZm9yIChpbnQgaiA9IHBXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBXZWlnaHRzLT5tX1NyY0VuZDsgKytqKSB7CisgICAgICAgICAgICBpbnQqIHBXZWlnaHQgPSBtX1dlaWdodFRhYmxlLkdldFZhbHVlRnJvbVBpeGVsV2VpZ2h0KHBXZWlnaHRzLCBqKTsKKyAgICAgICAgICAgIGlmICghcFdlaWdodCkKKyAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gKnBXZWlnaHQ7CisgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZ2JfY215ayA9IG1fcFNyY1BhbGV0dGVbc3JjX3NjYW5bal1dOworICAgICAgICAgICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9SZ2IpIHsKKyAgICAgICAgICAgICAgZGVzdF9yX3kgKz0gcGl4ZWxfd2VpZ2h0ICogc3RhdGljX2Nhc3Q8dWludDhfdD4oYXJnYl9jbXlrID4+IDE2KTsKKyAgICAgICAgICAgICAgZGVzdF9nX20gKz0gcGl4ZWxfd2VpZ2h0ICogc3RhdGljX2Nhc3Q8dWludDhfdD4oYXJnYl9jbXlrID4+IDgpOworICAgICAgICAgICAgICBkZXN0X2JfYyArPSBwaXhlbF93ZWlnaHQgKiBzdGF0aWNfY2FzdDx1aW50OF90PihhcmdiX2NteWspOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZGVzdF9iX2MgKz0gcGl4ZWxfd2VpZ2h0ICogc3RhdGljX2Nhc3Q8dWludDhfdD4oYXJnYl9jbXlrID4+IDI0KTsKKyAgICAgICAgICAgICAgZGVzdF9nX20gKz0gcGl4ZWxfd2VpZ2h0ICogc3RhdGljX2Nhc3Q8dWludDhfdD4oYXJnYl9jbXlrID4+IDE2KTsKKyAgICAgICAgICAgICAgZGVzdF9yX3kgKz0gcGl4ZWxfd2VpZ2h0ICogc3RhdGljX2Nhc3Q8dWludDhfdD4oYXJnYl9jbXlrID4+IDgpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKKyAgICAgICAgICAgIGRlc3Rfcl95ID0gcGRmaXVtOjpjbGFtcChkZXN0X3JfeSwgMCwga01heERlc3RWYWx1ZSk7CisgICAgICAgICAgICBkZXN0X2dfbSA9IHBkZml1bTo6Y2xhbXAoZGVzdF9nX20sIDAsIGtNYXhEZXN0VmFsdWUpOworICAgICAgICAgICAgZGVzdF9iX2MgPSBwZGZpdW06OmNsYW1wKGRlc3RfYl9jLCAwLCBrTWF4RGVzdFZhbHVlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oZGVzdF9iX2MgPj4gMTYpOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGRlc3RfZ19tID4+IDE2KTsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzdGF0aWNfY2FzdDx1aW50OF90PihkZXN0X3JfeSA+PiAxNik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDY6IHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyArK2NvbCkgeworICAgICAgICAgIFBpeGVsV2VpZ2h0KiBwV2VpZ2h0cyA9IG1fV2VpZ2h0VGFibGUuR2V0UGl4ZWxXZWlnaHQoY29sKTsKKyAgICAgICAgICBpbnQgZGVzdF9hID0gMDsKKyAgICAgICAgICBpbnQgZGVzdF9yX3kgPSAwOworICAgICAgICAgIGludCBkZXN0X2dfbSA9IDA7CisgICAgICAgICAgaW50IGRlc3RfYl9jID0gMDsKKyAgICAgICAgICBmb3IgKGludCBqID0gcFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFdlaWdodHMtPm1fU3JjRW5kOyArK2opIHsKKyAgICAgICAgICAgIGludCogcFdlaWdodCA9IG1fV2VpZ2h0VGFibGUuR2V0VmFsdWVGcm9tUGl4ZWxXZWlnaHQocFdlaWdodHMsIGopOworICAgICAgICAgICAgaWYgKCFwV2VpZ2h0KQorICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSAqcFdlaWdodDsKKyAgICAgICAgICAgIHBpeGVsX3dlaWdodCA9IHBpeGVsX3dlaWdodCAqIHNyY19zY2FuX21hc2tbal0gLyAyNTU7CisgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZ2JfY215ayA9IG1fcFNyY1BhbGV0dGVbc3JjX3NjYW5bal1dOworICAgICAgICAgICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9SZ2JhKSB7CisgICAgICAgICAgICAgIGRlc3Rfcl95ICs9IHBpeGVsX3dlaWdodCAqIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGFyZ2JfY215ayA+PiAxNik7CisgICAgICAgICAgICAgIGRlc3RfZ19tICs9IHBpeGVsX3dlaWdodCAqIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGFyZ2JfY215ayA+PiA4KTsKKyAgICAgICAgICAgICAgZGVzdF9iX2MgKz0gcGl4ZWxfd2VpZ2h0ICogc3RhdGljX2Nhc3Q8dWludDhfdD4oYXJnYl9jbXlrKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGRlc3RfYl9jICs9IHBpeGVsX3dlaWdodCAqIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGFyZ2JfY215ayA+PiAyNCk7CisgICAgICAgICAgICAgIGRlc3RfZ19tICs9IHBpeGVsX3dlaWdodCAqIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGFyZ2JfY215ayA+PiAxNik7CisgICAgICAgICAgICAgIGRlc3Rfcl95ICs9IHBpeGVsX3dlaWdodCAqIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGFyZ2JfY215ayA+PiA4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQ7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgeworICAgICAgICAgICAgZGVzdF9iX2MgPSBwZGZpdW06OmNsYW1wKGRlc3RfYl9jLCAwLCBrTWF4RGVzdFZhbHVlKTsKKyAgICAgICAgICAgIGRlc3RfZ19tID0gcGRmaXVtOjpjbGFtcChkZXN0X2dfbSwgMCwga01heERlc3RWYWx1ZSk7CisgICAgICAgICAgICBkZXN0X3JfeSA9IHBkZml1bTo6Y2xhbXAoZGVzdF9yX3ksIDAsIGtNYXhEZXN0VmFsdWUpOworICAgICAgICAgICAgZGVzdF9hID0gcGRmaXVtOjpjbGFtcChkZXN0X2EsIDAsIDY1NTM2KTsKKyAgICAgICAgICB9CisgICAgICAgICAgKmRlc3Rfc2NhbisrID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oZGVzdF9iX2MgPj4gMTYpOworICAgICAgICAgICpkZXN0X3NjYW4rKyA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGRlc3RfZ19tID4+IDE2KTsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzdGF0aWNfY2FzdDx1aW50OF90PihkZXN0X3JfeSA+PiAxNik7CisgICAgICAgICAgKmRlc3Rfc2Nhbl9tYXNrKysgPSBzdGF0aWNfY2FzdDx1aW50OF90PigoZGVzdF9hICogMjU1KSA+PiAxNik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDc6IHsKKyAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyArK2NvbCkgeworICAgICAgICAgIFBpeGVsV2VpZ2h0KiBwV2VpZ2h0cyA9IG1fV2VpZ2h0VGFibGUuR2V0UGl4ZWxXZWlnaHQoY29sKTsKKyAgICAgICAgICBpbnQgZGVzdF9yX3kgPSAwOworICAgICAgICAgIGludCBkZXN0X2dfbSA9IDA7CisgICAgICAgICAgaW50IGRlc3RfYl9jID0gMDsKKyAgICAgICAgICBmb3IgKGludCBqID0gcFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFdlaWdodHMtPm1fU3JjRW5kOyArK2opIHsKKyAgICAgICAgICAgIGludCogcFdlaWdodCA9IG1fV2VpZ2h0VGFibGUuR2V0VmFsdWVGcm9tUGl4ZWxXZWlnaHQocFdlaWdodHMsIGopOworICAgICAgICAgICAgaWYgKCFwV2VpZ2h0KQorICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSAqcFdlaWdodDsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19waXhlbCA9IHNyY19zY2FuICsgaiAqIEJwcDsKKyAgICAgICAgICAgIGRlc3RfYl9jICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOworICAgICAgICAgICAgZGVzdF9nX20gKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7CisgICAgICAgICAgICBkZXN0X3JfeSArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgeworICAgICAgICAgICAgZGVzdF9iX2MgPSBwZGZpdW06OmNsYW1wKGRlc3RfYl9jLCAwLCBrTWF4RGVzdFZhbHVlKTsKKyAgICAgICAgICAgIGRlc3RfZ19tID0gcGRmaXVtOjpjbGFtcChkZXN0X2dfbSwgMCwga01heERlc3RWYWx1ZSk7CisgICAgICAgICAgICBkZXN0X3JfeSA9IHBkZml1bTo6Y2xhbXAoZGVzdF9yX3ksIDAsIGtNYXhEZXN0VmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzdGF0aWNfY2FzdDx1aW50OF90PigoZGVzdF9iX2MpID4+IDE2KTsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzdGF0aWNfY2FzdDx1aW50OF90PigoZGVzdF9nX20pID4+IDE2KTsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzdGF0aWNfY2FzdDx1aW50OF90PigoZGVzdF9yX3kpID4+IDE2KTsKKyAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwIC0gMzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgODogeworICAgICAgICBmb3IgKGludCBjb2wgPSBtX0Rlc3RDbGlwLmxlZnQ7IGNvbCA8IG1fRGVzdENsaXAucmlnaHQ7ICsrY29sKSB7CisgICAgICAgICAgUGl4ZWxXZWlnaHQqIHBXZWlnaHRzID0gbV9XZWlnaHRUYWJsZS5HZXRQaXhlbFdlaWdodChjb2wpOworICAgICAgICAgIGludCBkZXN0X2EgPSAwOworICAgICAgICAgIGludCBkZXN0X3JfeSA9IDA7CisgICAgICAgICAgaW50IGRlc3RfZ19tID0gMDsKKyAgICAgICAgICBpbnQgZGVzdF9iX2MgPSAwOworICAgICAgICAgIGZvciAoaW50IGogPSBwV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwV2VpZ2h0cy0+bV9TcmNFbmQ7ICsraikgeworICAgICAgICAgICAgaW50KiBwV2VpZ2h0ID0gbV9XZWlnaHRUYWJsZS5HZXRWYWx1ZUZyb21QaXhlbFdlaWdodChwV2VpZ2h0cywgaik7CisgICAgICAgICAgICBpZiAoIXBXZWlnaHQpCisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9ICpwV2VpZ2h0OworICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3BpeGVsID0gc3JjX3NjYW4gKyBqICogQnBwOworICAgICAgICAgICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9BcmdiKSB7CisgICAgICAgICAgICAgIHBpeGVsX3dlaWdodCA9IHBpeGVsX3dlaWdodCAqIHNyY19waXhlbFszXSAvIDI1NTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHBpeGVsX3dlaWdodCA9IHBpeGVsX3dlaWdodCAqIHNyY19zY2FuX21hc2tbal0gLyAyNTU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXN0X2JfYyArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCsrKTsKKyAgICAgICAgICAgIGRlc3RfZ19tICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOworICAgICAgICAgICAgZGVzdF9yX3kgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwpOworICAgICAgICAgICAgZGVzdF9hICs9IHBpeGVsX3dlaWdodDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7CisgICAgICAgICAgICBkZXN0X3JfeSA9IHBkZml1bTo6Y2xhbXAoZGVzdF9yX3ksIDAsIGtNYXhEZXN0VmFsdWUpOworICAgICAgICAgICAgZGVzdF9nX20gPSBwZGZpdW06OmNsYW1wKGRlc3RfZ19tLCAwLCBrTWF4RGVzdFZhbHVlKTsKKyAgICAgICAgICAgIGRlc3RfYl9jID0gcGRmaXVtOjpjbGFtcChkZXN0X2JfYywgMCwga01heERlc3RWYWx1ZSk7CisgICAgICAgICAgICBkZXN0X2EgPSBwZGZpdW06OmNsYW1wKGRlc3RfYSwgMCwgNjU1MzYpOworICAgICAgICAgIH0KKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzdGF0aWNfY2FzdDx1aW50OF90PigoZGVzdF9iX2MpID4+IDE2KTsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzdGF0aWNfY2FzdDx1aW50OF90PigoZGVzdF9nX20pID4+IDE2KTsKKyAgICAgICAgICAqZGVzdF9zY2FuKysgPSBzdGF0aWNfY2FzdDx1aW50OF90PigoZGVzdF9yX3kpID4+IDE2KTsKKyAgICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpCisgICAgICAgICAgICAqZGVzdF9zY2FuID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oKGRlc3RfYSAqIDI1NSkgPj4gMTYpOworICAgICAgICAgIGlmIChkZXN0X3NjYW5fbWFzaykKKyAgICAgICAgICAgICpkZXN0X3NjYW5fbWFzaysrID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oKGRlc3RfYSAqIDI1NSkgPj4gMTYpOworICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHAgLSAzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICByb3dzX3RvX2dvLS07CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIENTdHJldGNoRW5naW5lOjpTdHJldGNoVmVydCgpIHsKKyAgaWYgKG1fRGVzdEhlaWdodCA9PSAwKQorICAgIHJldHVybjsKKworICBDV2VpZ2h0VGFibGUgdGFibGU7CisgIGJvb2wgcmV0ID0gdGFibGUuQ2FsYyhtX0Rlc3RIZWlnaHQsIG1fRGVzdENsaXAudG9wLCBtX0Rlc3RDbGlwLmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fU3JjSGVpZ2h0LCBtX1NyY0NsaXAudG9wLCBtX1NyY0NsaXAuYm90dG9tLCBtX0ZsYWdzKTsKKyAgaWYgKCFyZXQpCisgICAgcmV0dXJuOworCisgIGNvbnN0IGludCBEZXN0QnBwID0gbV9EZXN0QnBwIC8gODsKKyAgZm9yIChpbnQgcm93ID0gbV9EZXN0Q2xpcC50b3A7IHJvdyA8IG1fRGVzdENsaXAuYm90dG9tOyArK3JvdykgeworICAgIHVuc2lnbmVkIGNoYXIqIGRlc3Rfc2NhbiA9IG1fRGVzdFNjYW5saW5lLmRhdGEoKTsKKyAgICB1bnNpZ25lZCBjaGFyKiBkZXN0X3NjYW5fbWFzayA9IG1fRGVzdE1hc2tTY2FubGluZS5kYXRhKCk7CisgICAgUGl4ZWxXZWlnaHQqIHBXZWlnaHRzID0gdGFibGUuR2V0UGl4ZWxXZWlnaHQocm93KTsKKyAgICBzd2l0Y2ggKG1fVHJhbnNNZXRob2QpIHsKKyAgICAgIGNhc2UgMToKKyAgICAgIGNhc2UgMjoKKyAgICAgIGNhc2UgMzogeworICAgICAgICBmb3IgKGludCBjb2wgPSBtX0Rlc3RDbGlwLmxlZnQ7IGNvbCA8IG1fRGVzdENsaXAucmlnaHQ7ICsrY29sKSB7CisgICAgICAgICAgdW5zaWduZWQgY2hhciogc3JjX3NjYW4gPQorICAgICAgICAgICAgICBtX0ludGVyQnVmLmRhdGEoKSArIChjb2wgLSBtX0Rlc3RDbGlwLmxlZnQpICogRGVzdEJwcDsKKyAgICAgICAgICBpbnQgZGVzdF9hID0gMDsKKyAgICAgICAgICBmb3IgKGludCBqID0gcFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFdlaWdodHMtPm1fU3JjRW5kOyArK2opIHsKKyAgICAgICAgICAgIGludCogcFdlaWdodCA9IHRhYmxlLkdldFZhbHVlRnJvbVBpeGVsV2VpZ2h0KHBXZWlnaHRzLCBqKTsKKyAgICAgICAgICAgIGlmICghcFdlaWdodCkKKyAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gKnBXZWlnaHQ7CisgICAgICAgICAgICBkZXN0X2EgKz0KKyAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHQgKiBzcmNfc2NhblsoaiAtIG1fU3JjQ2xpcC50b3ApICogbV9JbnRlclBpdGNoXTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKQorICAgICAgICAgICAgZGVzdF9hID0gcGRmaXVtOjpjbGFtcChkZXN0X2EsIDAsIGtNYXhEZXN0VmFsdWUpOworICAgICAgICAgICpkZXN0X3NjYW4gPSBzdGF0aWNfY2FzdDx1aW50OF90PihkZXN0X2EgPj4gMTYpOworICAgICAgICAgIGRlc3Rfc2NhbiArPSBEZXN0QnBwOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSA0OiB7CisgICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgKytjb2wpIHsKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBzcmNfc2NhbiA9CisgICAgICAgICAgICAgIG1fSW50ZXJCdWYuZGF0YSgpICsgKGNvbCAtIG1fRGVzdENsaXAubGVmdCkgKiBEZXN0QnBwOworICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHNyY19zY2FuX21hc2sgPQorICAgICAgICAgICAgICBtX0V4dHJhQWxwaGFCdWYuZGF0YSgpICsgKGNvbCAtIG1fRGVzdENsaXAubGVmdCk7CisgICAgICAgICAgaW50IGRlc3RfYSA9IDA7CisgICAgICAgICAgaW50IGRlc3RfayA9IDA7CisgICAgICAgICAgZm9yIChpbnQgaiA9IHBXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBXZWlnaHRzLT5tX1NyY0VuZDsgKytqKSB7CisgICAgICAgICAgICBpbnQqIHBXZWlnaHQgPSB0YWJsZS5HZXRWYWx1ZUZyb21QaXhlbFdlaWdodChwV2VpZ2h0cywgaik7CisgICAgICAgICAgICBpZiAoIXBXZWlnaHQpCisgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9ICpwV2VpZ2h0OworICAgICAgICAgICAgZGVzdF9rICs9CisgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0ICogc3JjX3NjYW5bKGogLSBtX1NyY0NsaXAudG9wKSAqIG1fSW50ZXJQaXRjaF07CisgICAgICAgICAgICBkZXN0X2EgKz0gcGl4ZWxfd2VpZ2h0ICoKKyAgICAgICAgICAgICAgICAgICAgICBzcmNfc2Nhbl9tYXNrWyhqIC0gbV9TcmNDbGlwLnRvcCkgKiBtX0V4dHJhTWFza1BpdGNoXTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7CisgICAgICAgICAgICBkZXN0X2sgPSBwZGZpdW06OmNsYW1wKGRlc3RfaywgMCwga01heERlc3RWYWx1ZSk7CisgICAgICAgICAgICBkZXN0X2EgPSBwZGZpdW06OmNsYW1wKGRlc3RfYSwgMCwga01heERlc3RWYWx1ZSk7CisgICAgICAgICAgfQorICAgICAgICAgICpkZXN0X3NjYW4gPSBzdGF0aWNfY2FzdDx1aW50OF90PihkZXN0X2sgPj4gMTYpOworICAgICAgICAgIGRlc3Rfc2NhbiArPSBEZXN0QnBwOworICAgICAgICAgICpkZXN0X3NjYW5fbWFzaysrID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oZGVzdF9hID4+IDE2KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgNToKKyAgICAgIGNhc2UgNzogeworICAgICAgICBmb3IgKGludCBjb2wgPSBtX0Rlc3RDbGlwLmxlZnQ7IGNvbCA8IG1fRGVzdENsaXAucmlnaHQ7ICsrY29sKSB7CisgICAgICAgICAgdW5zaWduZWQgY2hhciogc3JjX3NjYW4gPQorICAgICAgICAgICAgICBtX0ludGVyQnVmLmRhdGEoKSArIChjb2wgLSBtX0Rlc3RDbGlwLmxlZnQpICogRGVzdEJwcDsKKyAgICAgICAgICBpbnQgZGVzdF9yX3kgPSAwOworICAgICAgICAgIGludCBkZXN0X2dfbSA9IDA7CisgICAgICAgICAgaW50IGRlc3RfYl9jID0gMDsKKyAgICAgICAgICBmb3IgKGludCBqID0gcFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFdlaWdodHMtPm1fU3JjRW5kOyArK2opIHsKKyAgICAgICAgICAgIGludCogcFdlaWdodCA9IHRhYmxlLkdldFZhbHVlRnJvbVBpeGVsV2VpZ2h0KHBXZWlnaHRzLCBqKTsKKyAgICAgICAgICAgIGlmICghcFdlaWdodCkKKyAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpbnQgcGl4ZWxfd2VpZ2h0ID0gKnBXZWlnaHQ7CisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfcGl4ZWwgPQorICAgICAgICAgICAgICAgIHNyY19zY2FuICsgKGogLSBtX1NyY0NsaXAudG9wKSAqIG1fSW50ZXJQaXRjaDsKKyAgICAgICAgICAgIGRlc3RfYl9jICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOworICAgICAgICAgICAgZGVzdF9nX20gKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7CisgICAgICAgICAgICBkZXN0X3JfeSArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgeworICAgICAgICAgICAgZGVzdF9yX3kgPSBwZGZpdW06OmNsYW1wKGRlc3Rfcl95LCAwLCBrTWF4RGVzdFZhbHVlKTsKKyAgICAgICAgICAgIGRlc3RfZ19tID0gcGRmaXVtOjpjbGFtcChkZXN0X2dfbSwgMCwga01heERlc3RWYWx1ZSk7CisgICAgICAgICAgICBkZXN0X2JfYyA9IHBkZml1bTo6Y2xhbXAoZGVzdF9iX2MsIDAsIGtNYXhEZXN0VmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBzdGF0aWNfY2FzdDx1aW50OF90PigoZGVzdF9iX2MpID4+IDE2KTsKKyAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBzdGF0aWNfY2FzdDx1aW50OF90PigoZGVzdF9nX20pID4+IDE2KTsKKyAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBzdGF0aWNfY2FzdDx1aW50OF90PigoZGVzdF9yX3kpID4+IDE2KTsKKyAgICAgICAgICBkZXN0X3NjYW4gKz0gRGVzdEJwcDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgNjoKKyAgICAgIGNhc2UgODogeworICAgICAgICBmb3IgKGludCBjb2wgPSBtX0Rlc3RDbGlwLmxlZnQ7IGNvbCA8IG1fRGVzdENsaXAucmlnaHQ7ICsrY29sKSB7CisgICAgICAgICAgdW5zaWduZWQgY2hhciogc3JjX3NjYW4gPQorICAgICAgICAgICAgICBtX0ludGVyQnVmLmRhdGEoKSArIChjb2wgLSBtX0Rlc3RDbGlwLmxlZnQpICogRGVzdEJwcDsKKyAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBzcmNfc2Nhbl9tYXNrID0gbnVsbHB0cjsKKyAgICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ICE9IEZYRElCX0FyZ2IpCisgICAgICAgICAgICBzcmNfc2Nhbl9tYXNrID0gbV9FeHRyYUFscGhhQnVmLmRhdGEoKSArIChjb2wgLSBtX0Rlc3RDbGlwLmxlZnQpOworICAgICAgICAgIGludCBkZXN0X2EgPSAwOworICAgICAgICAgIGludCBkZXN0X3JfeSA9IDA7CisgICAgICAgICAgaW50IGRlc3RfZ19tID0gMDsKKyAgICAgICAgICBpbnQgZGVzdF9iX2MgPSAwOworICAgICAgICAgIGZvciAoaW50IGogPSBwV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwV2VpZ2h0cy0+bV9TcmNFbmQ7ICsraikgeworICAgICAgICAgICAgaW50KiBwV2VpZ2h0ID0gdGFibGUuR2V0VmFsdWVGcm9tUGl4ZWxXZWlnaHQocFdlaWdodHMsIGopOworICAgICAgICAgICAgaWYgKCFwV2VpZ2h0KQorICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSAqcFdlaWdodDsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19waXhlbCA9CisgICAgICAgICAgICAgICAgc3JjX3NjYW4gKyAoaiAtIG1fU3JjQ2xpcC50b3ApICogbV9JbnRlclBpdGNoOworICAgICAgICAgICAgaW50IG1hc2tfdiA9IDI1NTsKKyAgICAgICAgICAgIGlmIChzcmNfc2Nhbl9tYXNrKQorICAgICAgICAgICAgICBtYXNrX3YgPSBzcmNfc2Nhbl9tYXNrWyhqIC0gbV9TcmNDbGlwLnRvcCkgKiBtX0V4dHJhTWFza1BpdGNoXTsKKyAgICAgICAgICAgIGRlc3RfYl9jICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOworICAgICAgICAgICAgZGVzdF9nX20gKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7CisgICAgICAgICAgICBkZXN0X3JfeSArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCk7CisgICAgICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpCisgICAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQgKiAoKihzcmNfcGl4ZWwgKyAxKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQgKiBtYXNrX3Y7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgeworICAgICAgICAgICAgZGVzdF9yX3kgPSBwZGZpdW06OmNsYW1wKGRlc3Rfcl95LCAwLCBrTWF4RGVzdFZhbHVlKTsKKyAgICAgICAgICAgIGRlc3RfZ19tID0gcGRmaXVtOjpjbGFtcChkZXN0X2dfbSwgMCwga01heERlc3RWYWx1ZSk7CisgICAgICAgICAgICBkZXN0X2JfYyA9IHBkZml1bTo6Y2xhbXAoZGVzdF9iX2MsIDAsIGtNYXhEZXN0VmFsdWUpOworICAgICAgICAgICAgZGVzdF9hID0gcGRmaXVtOjpjbGFtcChkZXN0X2EsIDAsIGtNYXhEZXN0VmFsdWUpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZGVzdF9hKSB7CisgICAgICAgICAgICBpbnQgciA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkZXN0X3JfeSkgKiAyNTUgLyBkZXN0X2E7CisgICAgICAgICAgICBpbnQgZyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkZXN0X2dfbSkgKiAyNTUgLyBkZXN0X2E7CisgICAgICAgICAgICBpbnQgYiA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkZXN0X2JfYykgKiAyNTUgLyBkZXN0X2E7CisgICAgICAgICAgICBkZXN0X3NjYW5bMF0gPSBwZGZpdW06OmNsYW1wKGIsIDAsIDI1NSk7CisgICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBwZGZpdW06OmNsYW1wKGcsIDAsIDI1NSk7CisgICAgICAgICAgICBkZXN0X3NjYW5bMl0gPSBwZGZpdW06OmNsYW1wKHIsIDAsIDI1NSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfQXJnYikKKyAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChkZXN0X2EpID4+IDE2KTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAqZGVzdF9zY2FuX21hc2sgPSBzdGF0aWNfY2FzdDx1aW50OF90PigoZGVzdF9hKSA+PiAxNik7CisgICAgICAgICAgZGVzdF9zY2FuICs9IERlc3RCcHA7CisgICAgICAgICAgaWYgKGRlc3Rfc2Nhbl9tYXNrKQorICAgICAgICAgICAgZGVzdF9zY2FuX21hc2srKzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgbV9wRGVzdEJpdG1hcC0+Q29tcG9zZVNjYW5saW5lKHJvdyAtIG1fRGVzdENsaXAudG9wLCBtX0Rlc3RTY2FubGluZS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fRGVzdE1hc2tTY2FubGluZS5kYXRhKCkpOworICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZGliL2NzdHJldGNoZW5naW5lLmggYi9jb3JlL2Z4Z2UvZGliL2NzdHJldGNoZW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlODM1MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9kaWIvY3N0cmV0Y2hlbmdpbmUuaApAQCAtMCwwICsxLDg3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgQ09SRV9GWEdFX0RJQl9DU1RSRVRDSEVOR0lORV9IXworI2RlZmluZSBDT1JFX0ZYR0VfRElCX0NTVFJFVENIRU5HSU5FX0hfCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9meF9kaWIuaCIKKworY2xhc3MgSUZYX1BhdXNlSW5kaWNhdG9yOworY2xhc3MgSUZYX1NjYW5saW5lQ29tcG9zZXI7CisKK2NsYXNzIENTdHJldGNoRW5naW5lIHsKKyBwdWJsaWM6CisgIENTdHJldGNoRW5naW5lKElGWF9TY2FubGluZUNvbXBvc2VyKiBwRGVzdEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LAorICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUJiBjbGlwX3JlY3QsCisgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNyY0JpdG1hcCwKKyAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKKyAgfkNTdHJldGNoRW5naW5lKCk7CisKKyAgYm9vbCBDb250aW51ZShJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CisKKyAgYm9vbCBTdGFydFN0cmV0Y2hIb3J6KCk7CisgIGJvb2wgQ29udGludWVTdHJldGNoSG9yeihJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CisgIHZvaWQgU3RyZXRjaFZlcnQoKTsKKworICBjbGFzcyBDV2VpZ2h0VGFibGUgeworICAgcHVibGljOgorICAgIENXZWlnaHRUYWJsZSgpOworICAgIH5DV2VpZ2h0VGFibGUoKTsKKworICAgIGJvb2wgQ2FsYyhpbnQgZGVzdF9sZW4sCisgICAgICAgICAgICAgIGludCBkZXN0X21pbiwKKyAgICAgICAgICAgICAgaW50IGRlc3RfbWF4LAorICAgICAgICAgICAgICBpbnQgc3JjX2xlbiwKKyAgICAgICAgICAgICAgaW50IHNyY19taW4sCisgICAgICAgICAgICAgIGludCBzcmNfbWF4LAorICAgICAgICAgICAgICBpbnQgZmxhZ3MpOworICAgIFBpeGVsV2VpZ2h0KiBHZXRQaXhlbFdlaWdodChpbnQgcGl4ZWwpIGNvbnN0OworICAgIGludCogR2V0VmFsdWVGcm9tUGl4ZWxXZWlnaHQoUGl4ZWxXZWlnaHQqIHBXZWlnaHQsIGludCBpbmRleCkgY29uc3Q7CisgICAgc2l6ZV90IEdldFBpeGVsV2VpZ2h0U2l6ZSgpIGNvbnN0OworCisgICBwcml2YXRlOgorICAgIGludCBtX0Rlc3RNaW47CisgICAgaW50IG1fSXRlbVNpemU7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbV9XZWlnaHRUYWJsZXM7CisgICAgc2l6ZV90IG1fZHdXZWlnaHRUYWJsZXNTaXplOworICB9OworCisgIEZYRElCX0Zvcm1hdCBtX0Rlc3RGb3JtYXQ7CisgIGludCBtX0Rlc3RCcHA7CisgIGludCBtX1NyY0JwcDsKKyAgaW50IG1fYkhhc0FscGhhOworICBVbm93bmVkUHRyPElGWF9TY2FubGluZUNvbXBvc2VyPiBtX3BEZXN0Qml0bWFwOworICBpbnQgbV9EZXN0V2lkdGg7CisgIGludCBtX0Rlc3RIZWlnaHQ7CisgIEZYX1JFQ1QgbV9EZXN0Q2xpcDsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbV9EZXN0U2NhbmxpbmU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1fRGVzdE1hc2tTY2FubGluZTsKKyAgRlhfUkVDVCBtX1NyY0NsaXA7CisgIFJldGFpblB0cjxDRlhfRElCU291cmNlPiBtX3BTb3VyY2U7CisgIHVpbnQzMl90KiBtX3BTcmNQYWxldHRlOworICBpbnQgbV9TcmNXaWR0aDsKKyAgaW50IG1fU3JjSGVpZ2h0OworICBpbnQgbV9TcmNQaXRjaDsKKyAgaW50IG1fSW50ZXJQaXRjaDsKKyAgaW50IG1fRXh0cmFNYXNrUGl0Y2g7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1fSW50ZXJCdWY7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1fRXh0cmFBbHBoYUJ1ZjsKKyAgaW50IG1fVHJhbnNNZXRob2Q7CisgIGludCBtX0ZsYWdzOworICBDV2VpZ2h0VGFibGUgbV9XZWlnaHRUYWJsZTsKKyAgaW50IG1fQ3VyUm93OworICBpbnQgbV9TdGF0ZTsKK307CisKKyNlbmRpZiAgLy8gQ09SRV9GWEdFX0RJQl9DU1RSRVRDSEVOR0lORV9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2RpYi9jc3RyZXRjaGVuZ2luZV91bml0dGVzdC5jcHAgYi9jb3JlL2Z4Z2UvZGliL2NzdHJldGNoZW5naW5lX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzdlMDM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGdlL2RpYi9jc3RyZXRjaGVuZ2luZV91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jc3RyZXRjaGVuZ2luZS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9udW1iZXIuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX2RpYnNvdXJjZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworVEVTVChDU3RyZXRjaEVuZ2luZSwgT3ZlcmZsb3dJbkN0b3IpIHsKKyAgRlhfUkVDVCBjbGlwX3JlY3Q7CisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0RpY3Rpb25hcnk+IGRpY3Rfb2JqID0KKyAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCk7CisgIGRpY3Rfb2JqLT5TZXROZXdGb3I8Q1BERl9OdW1iZXI+KCJXaWR0aCIsIDcxMDAwKTsKKyAgZGljdF9vYmotPlNldE5ld0ZvcjxDUERGX051bWJlcj4oIkhlaWdodCIsIDEyNTAwKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfU3RyZWFtPiBzdHJlYW0gPQorICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU3RyZWFtPihudWxscHRyLCAwLCBzdGQ6Om1vdmUoZGljdF9vYmopKTsKKyAgYXV0byBkaWJfc291cmNlID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfRElCU291cmNlPigpOworICBkaWJfc291cmNlLT5Mb2FkKG51bGxwdHIsIHN0cmVhbS5nZXQoKSk7CisgIENTdHJldGNoRW5naW5lIGVuZ2luZShudWxscHRyLCBGWERJQl84YnBwUmdiLCA1MDAsIDUwMCwgY2xpcF9yZWN0LCBkaWJfc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgIEVYUEVDVF9FUShGWERJQl9JTlRFUlBPTCwgZW5naW5lLm1fRmxhZ3MpOworfQpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2RpYi9kaWJfaW50LmggYi9jb3JlL2Z4Z2UvZGliL2RpYl9pbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAzYS4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Z2UvZGliL2RpYl9pbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgQ09SRV9GWEdFX0RJQl9ESUJfSU5UX0hfCi0jZGVmaW5lIENPUkVfRlhHRV9ESUJfRElCX0lOVF9IXwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgotCi1jbGFzcyBJRlhfU2NhbmxpbmVDb21wb3NlcjsKLQotZXh0ZXJuIGNvbnN0IGludDE2X3QgU0RQX1RhYmxlWzUxM107Ci0KLWNsYXNzIENQREZfRml4ZWRNYXRyaXggewotIHB1YmxpYzoKLSAgQ1BERl9GaXhlZE1hdHJpeChjb25zdCBDRlhfTWF0cml4JiBzcmMsIGludCBiaXRzKSB7Ci0gICAgYmFzZSA9IDEgPDwgYml0czsKLSAgICBhID0gRlhTWVNfcm91bmQoc3JjLmEgKiBiYXNlKTsKLSAgICBiID0gRlhTWVNfcm91bmQoc3JjLmIgKiBiYXNlKTsKLSAgICBjID0gRlhTWVNfcm91bmQoc3JjLmMgKiBiYXNlKTsKLSAgICBkID0gRlhTWVNfcm91bmQoc3JjLmQgKiBiYXNlKTsKLSAgICBlID0gRlhTWVNfcm91bmQoc3JjLmUgKiBiYXNlKTsKLSAgICBmID0gRlhTWVNfcm91bmQoc3JjLmYgKiBiYXNlKTsKLSAgfQotICBpbmxpbmUgdm9pZCBUcmFuc2Zvcm0oaW50IHgsIGludCB5LCBpbnQmIHgxLCBpbnQmIHkxKSB7Ci0gICAgeDEgPSAoYSAqIHggKyBjICogeSArIGUgKyBiYXNlIC8gMikgLyBiYXNlOwotICAgIHkxID0gKGIgKiB4ICsgZCAqIHkgKyBmICsgYmFzZSAvIDIpIC8gYmFzZTsKLSAgfQotICBpbnQgYSwgYiwgYywgZCwgZSwgZjsKLSAgaW50IGJhc2U7Ci19OwotI2RlZmluZSBGUERGX0hVR0VfSU1BR0VfU0laRSA2MDAwMDAwMAotc3RydWN0IFBpeGVsV2VpZ2h0IHsKLSAgaW50IG1fU3JjU3RhcnQ7Ci0gIGludCBtX1NyY0VuZDsKLSAgaW50IG1fV2VpZ2h0c1sxXTsKLX07Ci0KLWNsYXNzIENXZWlnaHRUYWJsZSB7Ci0gcHVibGljOgotICBDV2VpZ2h0VGFibGUoKTsKLSAgfkNXZWlnaHRUYWJsZSgpOwotCi0gIGJvb2wgQ2FsYyhpbnQgZGVzdF9sZW4sCi0gICAgICAgICAgICBpbnQgZGVzdF9taW4sCi0gICAgICAgICAgICBpbnQgZGVzdF9tYXgsCi0gICAgICAgICAgICBpbnQgc3JjX2xlbiwKLSAgICAgICAgICAgIGludCBzcmNfbWluLAotICAgICAgICAgICAgaW50IHNyY19tYXgsCi0gICAgICAgICAgICBpbnQgZmxhZ3MpOwotICBQaXhlbFdlaWdodCogR2V0UGl4ZWxXZWlnaHQoaW50IHBpeGVsKSBjb25zdDsKLSAgaW50KiBHZXRWYWx1ZUZyb21QaXhlbFdlaWdodChQaXhlbFdlaWdodCogcFdlaWdodCwgaW50IGluZGV4KSBjb25zdDsKLSAgc2l6ZV90IEdldFBpeGVsV2VpZ2h0U2l6ZSgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgaW50IG1fRGVzdE1pbjsKLSAgaW50IG1fSXRlbVNpemU7Ci0gIHVpbnQ4X3QqIG1fcFdlaWdodFRhYmxlczsKLSAgc2l6ZV90IG1fZHdXZWlnaHRUYWJsZXNTaXplOwotfTsKLQotY2xhc3MgQ1N0cmV0Y2hFbmdpbmUgewotIHB1YmxpYzoKLSAgQ1N0cmV0Y2hFbmdpbmUoSUZYX1NjYW5saW5lQ29tcG9zZXIqIHBEZXN0Qml0bWFwLAotICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsCi0gICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAotICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QmIGNsaXBfcmVjdCwKLSAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKLSAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKLSAgfkNTdHJldGNoRW5naW5lKCk7Ci0KLSAgYm9vbCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7Ci0KLSAgYm9vbCBTdGFydFN0cmV0Y2hIb3J6KCk7Ci0gIGJvb2wgQ29udGludWVTdHJldGNoSG9yeihJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gIHZvaWQgU3RyZXRjaFZlcnQoKTsKLQotICBGWERJQl9Gb3JtYXQgbV9EZXN0Rm9ybWF0OwotICBpbnQgbV9EZXN0QnBwOwotICBpbnQgbV9TcmNCcHA7Ci0gIGludCBtX2JIYXNBbHBoYTsKLSAgSUZYX1NjYW5saW5lQ29tcG9zZXIqIG1fcERlc3RCaXRtYXA7Ci0gIGludCBtX0Rlc3RXaWR0aCwgbV9EZXN0SGVpZ2h0OwotICBGWF9SRUNUIG1fRGVzdENsaXA7Ci0gIHVpbnQ4X3QqIG1fcERlc3RTY2FubGluZTsKLSAgdWludDhfdCogbV9wRGVzdE1hc2tTY2FubGluZTsKLSAgRlhfUkVDVCBtX1NyY0NsaXA7Ci0gIGNvbnN0IENGWF9ESUJTb3VyY2UqIG1fcFNvdXJjZTsKLSAgdWludDMyX3QqIG1fcFNyY1BhbGV0dGU7Ci0gIGludCBtX1NyY1dpZHRoOwotICBpbnQgbV9TcmNIZWlnaHQ7Ci0gIGludCBtX1NyY1BpdGNoOwotICBpbnQgbV9JbnRlclBpdGNoOwotICBpbnQgbV9FeHRyYU1hc2tQaXRjaDsKLSAgdWludDhfdCogbV9wSW50ZXJCdWY7Ci0gIHVpbnQ4X3QqIG1fcEV4dHJhQWxwaGFCdWY7Ci0gIGludCBtX1RyYW5zTWV0aG9kOwotICBpbnQgbV9GbGFnczsKLSAgQ1dlaWdodFRhYmxlIG1fV2VpZ2h0VGFibGU7Ci0gIGludCBtX0N1clJvdzsKLSAgaW50IG1fU3RhdGU7Ci19OwotCi1GWF9SRUNUIEZYRElCX1N3YXBDbGlwQm94KEZYX1JFQ1QmIGNsaXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmxpcFgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZsaXBZKTsKLQotI2VuZGlmICAvLyBDT1JFX0ZYR0VfRElCX0RJQl9JTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9kaWIvZnhfZGliX2NvbXBvc2l0ZS5jcHAgYi9jb3JlL2Z4Z2UvZGliL2Z4X2RpYl9jb21wb3NpdGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzJlYmJkLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnhnZS9kaWIvZnhfZGliX2NvbXBvc2l0ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MDQwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9meF9jb2RlYy5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZ2Vtb2R1bGUuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2RpYl9pbnQuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZ2UvY2Z4X2NsaXByZ24uaCIKLQotbmFtZXNwYWNlIHsKLQotY29uc3QgdWludDhfdCBjb2xvcl9zcXJ0WzI1Nl0gPSB7Ci0gICAgMHgwMCwgMHgwMywgMHgwNywgMHgwQiwgMHgwRiwgMHgxMiwgMHgxNiwgMHgxOSwgMHgxRCwgMHgyMCwgMHgyMywgMHgyNiwKLSAgICAweDI5LCAweDJDLCAweDJGLCAweDMyLCAweDM1LCAweDM3LCAweDNBLCAweDNDLCAweDNGLCAweDQxLCAweDQzLCAweDQ2LAotICAgIDB4NDgsIDB4NEEsIDB4NEMsIDB4NEUsIDB4NTAsIDB4NTIsIDB4NTQsIDB4NTYsIDB4NTcsIDB4NTksIDB4NUIsIDB4NUMsCi0gICAgMHg1RSwgMHg2MCwgMHg2MSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NywgMHg2OCwgMHg2OSwgMHg2QiwgMHg2QywgMHg2RCwKLSAgICAweDZFLCAweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LCAweDdBLAotICAgIDB4N0IsIDB4N0MsIDB4N0QsIDB4N0UsIDB4ODAsIDB4ODEsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsCi0gICAgMHg4NywgMHg4OCwgMHg4OSwgMHg4QSwgMHg4QiwgMHg4QywgMHg4RCwgMHg4RSwgMHg4RiwgMHg5MCwgMHg5MSwgMHg5MSwKLSAgICAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk3LCAweDk4LCAweDk5LCAweDlBLCAweDlCLCAweDlDLAotICAgIDB4OUMsIDB4OUQsIDB4OUUsIDB4OUYsIDB4QTAsIDB4QTAsIDB4QTEsIDB4QTIsIDB4QTMsIDB4QTQsIDB4QTQsIDB4QTUsCi0gICAgMHhBNiwgMHhBNywgMHhBNywgMHhBOCwgMHhBOSwgMHhBQSwgMHhBQSwgMHhBQiwgMHhBQywgMHhBRCwgMHhBRCwgMHhBRSwKLSAgICAweEFGLCAweEIwLCAweEIwLCAweEIxLCAweEIyLCAweEIzLCAweEIzLCAweEI0LCAweEI1LCAweEI1LCAweEI2LCAweEI3LAotICAgIDB4QjcsIDB4QjgsIDB4QjksIDB4QkEsIDB4QkEsIDB4QkIsIDB4QkMsIDB4QkMsIDB4QkQsIDB4QkUsIDB4QkUsIDB4QkYsCi0gICAgMHhDMCwgMHhDMCwgMHhDMSwgMHhDMiwgMHhDMiwgMHhDMywgMHhDNCwgMHhDNCwgMHhDNSwgMHhDNiwgMHhDNiwgMHhDNywKLSAgICAweEM3LCAweEM4LCAweEM5LCAweEM5LCAweENBLCAweENCLCAweENCLCAweENDLCAweENDLCAweENELCAweENFLCAweENFLAotICAgIDB4Q0YsIDB4RDAsIDB4RDAsIDB4RDEsIDB4RDEsIDB4RDIsIDB4RDMsIDB4RDMsIDB4RDQsIDB4RDQsIDB4RDUsIDB4RDYsCi0gICAgMHhENiwgMHhENywgMHhENywgMHhEOCwgMHhEOSwgMHhEOSwgMHhEQSwgMHhEQSwgMHhEQiwgMHhEQywgMHhEQywgMHhERCwKLSAgICAweERELCAweERFLCAweERFLCAweERGLCAweEUwLCAweEUwLCAweEUxLCAweEUxLCAweEUyLCAweEUyLCAweEUzLCAweEU0LAotICAgIDB4RTQsIDB4RTUsIDB4RTUsIDB4RTYsIDB4RTYsIDB4RTcsIDB4RTcsIDB4RTgsIDB4RTksIDB4RTksIDB4RUEsIDB4RUEsCi0gICAgMHhFQiwgMHhFQiwgMHhFQywgMHhFQywgMHhFRCwgMHhFRCwgMHhFRSwgMHhFRSwgMHhFRiwgMHhGMCwgMHhGMCwgMHhGMSwKLSAgICAweEYxLCAweEYyLCAweEYyLCAweEYzLCAweEYzLCAweEY0LCAweEY0LCAweEY1LCAweEY1LCAweEY2LCAweEY2LCAweEY3LAotICAgIDB4RjcsIDB4RjgsIDB4RjgsIDB4RjksIDB4RjksIDB4RkEsIDB4RkEsIDB4RkIsIDB4RkIsIDB4RkMsIDB4RkMsIDB4RkQsCi0gICAgMHhGRCwgMHhGRSwgMHhGRSwgMHhGRn07Ci0KLWludCBCbGVuZChpbnQgYmxlbmRfbW9kZSwgaW50IGJhY2tfY29sb3IsIGludCBzcmNfY29sb3IpIHsKLSAgc3dpdGNoIChibGVuZF9tb2RlKSB7Ci0gICAgY2FzZSBGWERJQl9CTEVORF9OT1JNQUw6Ci0gICAgICByZXR1cm4gc3JjX2NvbG9yOwotICAgIGNhc2UgRlhESUJfQkxFTkRfTVVMVElQTFk6Ci0gICAgICByZXR1cm4gc3JjX2NvbG9yICogYmFja19jb2xvciAvIDI1NTsKLSAgICBjYXNlIEZYRElCX0JMRU5EX1NDUkVFTjoKLSAgICAgIHJldHVybiBzcmNfY29sb3IgKyBiYWNrX2NvbG9yIC0gc3JjX2NvbG9yICogYmFja19jb2xvciAvIDI1NTsKLSAgICBjYXNlIEZYRElCX0JMRU5EX09WRVJMQVk6Ci0gICAgICByZXR1cm4gQmxlbmQoRlhESUJfQkxFTkRfSEFSRExJR0hULCBzcmNfY29sb3IsIGJhY2tfY29sb3IpOwotICAgIGNhc2UgRlhESUJfQkxFTkRfREFSS0VOOgotICAgICAgcmV0dXJuIHNyY19jb2xvciA8IGJhY2tfY29sb3IgPyBzcmNfY29sb3IgOiBiYWNrX2NvbG9yOwotICAgIGNhc2UgRlhESUJfQkxFTkRfTElHSFRFTjoKLSAgICAgIHJldHVybiBzcmNfY29sb3IgPiBiYWNrX2NvbG9yID8gc3JjX2NvbG9yIDogYmFja19jb2xvcjsKLSAgICBjYXNlIEZYRElCX0JMRU5EX0NPTE9SRE9ER0U6IHsKLSAgICAgIGlmIChzcmNfY29sb3IgPT0gMjU1KSB7Ci0gICAgICAgIHJldHVybiBzcmNfY29sb3I7Ci0gICAgICB9Ci0gICAgICBpbnQgcmVzdWx0ID0gYmFja19jb2xvciAqIDI1NSAvICgyNTUgLSBzcmNfY29sb3IpOwotICAgICAgaWYgKHJlc3VsdCA+IDI1NSkgewotICAgICAgICByZXR1cm4gMjU1OwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgY2FzZSBGWERJQl9CTEVORF9DT0xPUkJVUk46IHsKLSAgICAgIGlmIChzcmNfY29sb3IgPT0gMCkgewotICAgICAgICByZXR1cm4gc3JjX2NvbG9yOwotICAgICAgfQotICAgICAgaW50IHJlc3VsdCA9ICgyNTUgLSBiYWNrX2NvbG9yKSAqIDI1NSAvIHNyY19jb2xvcjsKLSAgICAgIGlmIChyZXN1bHQgPiAyNTUpIHsKLSAgICAgICAgcmVzdWx0ID0gMjU1OwotICAgICAgfQotICAgICAgcmV0dXJuIDI1NSAtIHJlc3VsdDsKLSAgICB9Ci0gICAgY2FzZSBGWERJQl9CTEVORF9IQVJETElHSFQ6Ci0gICAgICBpZiAoc3JjX2NvbG9yIDwgMTI4KSB7Ci0gICAgICAgIHJldHVybiAoc3JjX2NvbG9yICogYmFja19jb2xvciAqIDIpIC8gMjU1OwotICAgICAgfQotICAgICAgcmV0dXJuIEJsZW5kKEZYRElCX0JMRU5EX1NDUkVFTiwgYmFja19jb2xvciwgMiAqIHNyY19jb2xvciAtIDI1NSk7Ci0gICAgY2FzZSBGWERJQl9CTEVORF9TT0ZUTElHSFQ6IHsKLSAgICAgIGlmIChzcmNfY29sb3IgPCAxMjgpIHsKLSAgICAgICAgcmV0dXJuIGJhY2tfY29sb3IgLQotICAgICAgICAgICAgICAgKDI1NSAtIDIgKiBzcmNfY29sb3IpICogYmFja19jb2xvciAqICgyNTUgLSBiYWNrX2NvbG9yKSAvIDI1NSAvCi0gICAgICAgICAgICAgICAgICAgMjU1OwotICAgICAgfQotICAgICAgcmV0dXJuIGJhY2tfY29sb3IgKwotICAgICAgICAgICAgICgyICogc3JjX2NvbG9yIC0gMjU1KSAqIChjb2xvcl9zcXJ0W2JhY2tfY29sb3JdIC0gYmFja19jb2xvcikgLwotICAgICAgICAgICAgICAgICAyNTU7Ci0gICAgfQotICAgIGNhc2UgRlhESUJfQkxFTkRfRElGRkVSRU5DRToKLSAgICAgIHJldHVybiBiYWNrX2NvbG9yIDwgc3JjX2NvbG9yID8gc3JjX2NvbG9yIC0gYmFja19jb2xvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBiYWNrX2NvbG9yIC0gc3JjX2NvbG9yOwotICAgIGNhc2UgRlhESUJfQkxFTkRfRVhDTFVTSU9OOgotICAgICAgcmV0dXJuIGJhY2tfY29sb3IgKyBzcmNfY29sb3IgLSAyICogYmFja19jb2xvciAqIHNyY19jb2xvciAvIDI1NTsKLSAgfQotICByZXR1cm4gc3JjX2NvbG9yOwotfQotCi1zdHJ1Y3QgUkdCIHsKLSAgaW50IHJlZDsKLSAgaW50IGdyZWVuOwotICBpbnQgYmx1ZTsKLX07Ci0KLWludCBMdW0oUkdCIGNvbG9yKSB7Ci0gIHJldHVybiAoY29sb3IucmVkICogMzAgKyBjb2xvci5ncmVlbiAqIDU5ICsgY29sb3IuYmx1ZSAqIDExKSAvIDEwMDsKLX0KLQotUkdCIENsaXBDb2xvcihSR0IgY29sb3IpIHsKLSAgaW50IGwgPSBMdW0oY29sb3IpOwotICBpbnQgbiA9IGNvbG9yLnJlZDsKLSAgaWYgKGNvbG9yLmdyZWVuIDwgbikgewotICAgIG4gPSBjb2xvci5ncmVlbjsKLSAgfQotICBpZiAoY29sb3IuYmx1ZSA8IG4pIHsKLSAgICBuID0gY29sb3IuYmx1ZTsKLSAgfQotICBpbnQgeCA9IGNvbG9yLnJlZDsKLSAgaWYgKGNvbG9yLmdyZWVuID4geCkgewotICAgIHggPSBjb2xvci5ncmVlbjsKLSAgfQotICBpZiAoY29sb3IuYmx1ZSA+IHgpIHsKLSAgICB4ID0gY29sb3IuYmx1ZTsKLSAgfQotICBpZiAobiA8IDApIHsKLSAgICBjb2xvci5yZWQgPSBsICsgKChjb2xvci5yZWQgLSBsKSAqIGwgLyAobCAtIG4pKTsKLSAgICBjb2xvci5ncmVlbiA9IGwgKyAoKGNvbG9yLmdyZWVuIC0gbCkgKiBsIC8gKGwgLSBuKSk7Ci0gICAgY29sb3IuYmx1ZSA9IGwgKyAoKGNvbG9yLmJsdWUgLSBsKSAqIGwgLyAobCAtIG4pKTsKLSAgfQotICBpZiAoeCA+IDI1NSkgewotICAgIGNvbG9yLnJlZCA9IGwgKyAoKGNvbG9yLnJlZCAtIGwpICogKDI1NSAtIGwpIC8gKHggLSBsKSk7Ci0gICAgY29sb3IuZ3JlZW4gPSBsICsgKChjb2xvci5ncmVlbiAtIGwpICogKDI1NSAtIGwpIC8gKHggLSBsKSk7Ci0gICAgY29sb3IuYmx1ZSA9IGwgKyAoKGNvbG9yLmJsdWUgLSBsKSAqICgyNTUgLSBsKSAvICh4IC0gbCkpOwotICB9Ci0gIHJldHVybiBjb2xvcjsKLX0KLQotUkdCIFNldEx1bShSR0IgY29sb3IsIGludCBsKSB7Ci0gIGludCBkID0gbCAtIEx1bShjb2xvcik7Ci0gIGNvbG9yLnJlZCArPSBkOwotICBjb2xvci5ncmVlbiArPSBkOwotICBjb2xvci5ibHVlICs9IGQ7Ci0gIHJldHVybiBDbGlwQ29sb3IoY29sb3IpOwotfQotCi1pbnQgU2F0KFJHQiBjb2xvcikgewotICBpbnQgbiA9IGNvbG9yLnJlZDsKLSAgaWYgKGNvbG9yLmdyZWVuIDwgbikgewotICAgIG4gPSBjb2xvci5ncmVlbjsKLSAgfQotICBpZiAoY29sb3IuYmx1ZSA8IG4pIHsKLSAgICBuID0gY29sb3IuYmx1ZTsKLSAgfQotICBpbnQgeCA9IGNvbG9yLnJlZDsKLSAgaWYgKGNvbG9yLmdyZWVuID4geCkgewotICAgIHggPSBjb2xvci5ncmVlbjsKLSAgfQotICBpZiAoY29sb3IuYmx1ZSA+IHgpIHsKLSAgICB4ID0gY29sb3IuYmx1ZTsKLSAgfQotICByZXR1cm4geCAtIG47Ci19Ci0KLVJHQiBTZXRTYXQoUkdCIGNvbG9yLCBpbnQgcykgewotICBpbnQqIG1heCA9ICZjb2xvci5yZWQ7Ci0gIGludCogbWlkID0gJmNvbG9yLnJlZDsKLSAgaW50KiBtaW4gPSAmY29sb3IucmVkOwotICBpZiAoY29sb3IuZ3JlZW4gPiAqbWF4KSB7Ci0gICAgbWF4ID0gJmNvbG9yLmdyZWVuOwotICB9Ci0gIGlmIChjb2xvci5ibHVlID4gKm1heCkgewotICAgIG1heCA9ICZjb2xvci5ibHVlOwotICB9Ci0gIGlmIChjb2xvci5ncmVlbiA8ICptaW4pIHsKLSAgICBtaW4gPSAmY29sb3IuZ3JlZW47Ci0gIH0KLSAgaWYgKGNvbG9yLmJsdWUgPCAqbWluKSB7Ci0gICAgbWluID0gJmNvbG9yLmJsdWU7Ci0gIH0KLSAgaWYgKCptYXggPT0gKm1pbikgewotICAgIGNvbG9yLnJlZCA9IDA7Ci0gICAgY29sb3IuZ3JlZW4gPSAwOwotICAgIGNvbG9yLmJsdWUgPSAwOwotICAgIHJldHVybiBjb2xvcjsKLSAgfQotICBpZiAobWF4ID09ICZjb2xvci5yZWQpIHsKLSAgICBpZiAobWluID09ICZjb2xvci5ncmVlbikgewotICAgICAgbWlkID0gJmNvbG9yLmJsdWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1pZCA9ICZjb2xvci5ncmVlbjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAobWF4ID09ICZjb2xvci5ncmVlbikgewotICAgIGlmIChtaW4gPT0gJmNvbG9yLnJlZCkgewotICAgICAgbWlkID0gJmNvbG9yLmJsdWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1pZCA9ICZjb2xvci5yZWQ7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChtaW4gPT0gJmNvbG9yLmdyZWVuKSB7Ci0gICAgICBtaWQgPSAmY29sb3IucmVkOwotICAgIH0gZWxzZSB7Ci0gICAgICBtaWQgPSAmY29sb3IuZ3JlZW47Ci0gICAgfQotICB9Ci0gIGlmICgqbWF4ID4gKm1pbikgewotICAgICptaWQgPSAoKm1pZCAtICptaW4pICogcyAvICgqbWF4IC0gKm1pbik7Ci0gICAgKm1heCA9IHM7Ci0gICAgKm1pbiA9IDA7Ci0gIH0KLSAgcmV0dXJuIGNvbG9yOwotfQotCi12b2lkIFJHQl9CbGVuZChpbnQgYmxlbmRfbW9kZSwKLSAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgaW50IHJlc3VsdHNbM10pIHsKLSAgUkdCIHNyYzsKLSAgUkdCIGJhY2s7Ci0gIFJHQiByZXN1bHQgPSB7MCwgMCwgMH07Ci0gIHNyYy5yZWQgPSBzcmNfc2NhblsyXTsKLSAgc3JjLmdyZWVuID0gc3JjX3NjYW5bMV07Ci0gIHNyYy5ibHVlID0gc3JjX3NjYW5bMF07Ci0gIGJhY2sucmVkID0gZGVzdF9zY2FuWzJdOwotICBiYWNrLmdyZWVuID0gZGVzdF9zY2FuWzFdOwotICBiYWNrLmJsdWUgPSBkZXN0X3NjYW5bMF07Ci0gIHN3aXRjaCAoYmxlbmRfbW9kZSkgewotICAgIGNhc2UgRlhESUJfQkxFTkRfSFVFOgotICAgICAgcmVzdWx0ID0gU2V0THVtKFNldFNhdChzcmMsIFNhdChiYWNrKSksIEx1bShiYWNrKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYRElCX0JMRU5EX1NBVFVSQVRJT046Ci0gICAgICByZXN1bHQgPSBTZXRMdW0oU2V0U2F0KGJhY2ssIFNhdChzcmMpKSwgTHVtKGJhY2spKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlhESUJfQkxFTkRfQ09MT1I6Ci0gICAgICByZXN1bHQgPSBTZXRMdW0oc3JjLCBMdW0oYmFjaykpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWERJQl9CTEVORF9MVU1JTk9TSVRZOgotICAgICAgcmVzdWx0ID0gU2V0THVtKGJhY2ssIEx1bShzcmMpKTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJlc3VsdHNbMF0gPSByZXN1bHQuYmx1ZTsKLSAgcmVzdWx0c1sxXSA9IHJlc3VsdC5ncmVlbjsKLSAgcmVzdWx0c1syXSA9IHJlc3VsdC5yZWQ7Ci19Ci0KLXZvaWQgQ29tcG9zaXRlUm93X0FyZ2IyTWFzayh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgewotICBzcmNfc2NhbiArPSAzOwotICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKLSAgICBpbnQgc3JjX2FscGhhID0gKnNyY19zY2FuOwotICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwotICAgIH0KLSAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9zY2FuOwotICAgIGlmICghYmFja19hbHBoYSkgewotICAgICAgKmRlc3Rfc2NhbiA9IHNyY19hbHBoYTsKLSAgICB9IGVsc2UgaWYgKHNyY19hbHBoYSkgewotICAgICAgKmRlc3Rfc2NhbiA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgIH0KLSAgICBkZXN0X3NjYW4rKzsKLSAgICBzcmNfc2NhbiArPSA0OwotICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRlUm93X1JnYmEyTWFzayh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgewotICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKLSAgICBpbnQgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgfQotICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkZXN0X3NjYW47Ci0gICAgaWYgKCFiYWNrX2FscGhhKSB7Ci0gICAgICAqZGVzdF9zY2FuID0gc3JjX2FscGhhOwotICAgIH0gZWxzZSBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAqZGVzdF9zY2FuID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgfQotICAgIGRlc3Rfc2NhbisrOwotICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRlUm93X1JnYjJNYXNrKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7Ci0gIGlmIChjbGlwX3NjYW4pIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKLSAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9VTklPTigqZGVzdF9zY2FuLCAqY2xpcF9zY2FuKTsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgY2xpcF9zY2FuKys7Ci0gICAgfQotICB9IGVsc2UgewotICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIDB4ZmYsIHdpZHRoKTsKLSAgfQotfQotCi12b2lkIENvbXBvc2l0ZVJvd19BcmdiMkdyYXlhKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdF9hbHBoYV9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7Ci0gIENDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBudWxscHRyOwotICBpZiAocEljY1RyYW5zZm9ybSkKLSAgICBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0KLSAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgIGlmIChzcmNfYWxwaGFfc2NhbikgewotICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkc3RfYWxwaGFfc2NhbjsKLSAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICAgIGludCBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKLSAgICAgICAgICBpZiAoY2xpcF9zY2FuKQotICAgICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7Ci0KLSAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICpkc3RfYWxwaGFfc2NhbiA9IHNyY19hbHBoYTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgZHN0X2FscGhhX3NjYW4rKzsKLSAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pCi0gICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7Ci0KLSAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgZHN0X2FscGhhX3NjYW4rKzsKLSAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgICpkc3RfYWxwaGFfc2NhbiA9IEZYRElCX0FMUEhBX1VOSU9OKGJhY2tfYWxwaGEsIHNyY19hbHBoYSk7Ci0gICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvICgqZHN0X2FscGhhX3NjYW4pOwotICAgICAgICB1aW50OF90IGdyYXk7Ci0gICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIHNyY19zY2FuLCAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBncmF5ID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkKLSAgICAgICAgICBncmF5ID0gYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBncmF5ID0gQmxlbmQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgZ3JheSk7Ci0gICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICBkc3RfYWxwaGFfc2NhbisrOwotICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKLSAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRzdF9hbHBoYV9zY2FuOwotICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOwotICAgICAgICAgIGlmIChjbGlwX3NjYW4pCi0gICAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKLQotICAgICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKmRzdF9hbHBoYV9zY2FuID0gc3JjX2FscGhhOwotICAgICAgICAgIH0KLSAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICBkc3RfYWxwaGFfc2NhbisrOwotICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikKLSAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKLQotICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICBkc3RfYWxwaGFfc2NhbisrOwotICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgKmRzdF9hbHBoYV9zY2FuID0gRlhESUJfQUxQSEFfVU5JT04oYmFja19hbHBoYSwgc3JjX2FscGhhKTsKLSAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gKCpkc3RfYWxwaGFfc2Nhbik7Ci0gICAgICAgIHVpbnQ4X3QgZ3JheTsKLSAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pCi0gICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIHNyY19zY2FuLCAxKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKLQotICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOwotICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgZHN0X2FscGhhX3NjYW4rKzsKLSAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChzcmNfYWxwaGFfc2NhbikgewotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgewotICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRzdF9hbHBoYV9zY2FuOwotICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICBpbnQgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pCi0gICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7Ci0KLSAgICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgKmRzdF9hbHBoYV9zY2FuID0gc3JjX2FscGhhOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICBkc3RfYWxwaGFfc2NhbisrOwotICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICBpZiAoY2xpcF9zY2FuKQotICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKLQotICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICBkc3RfYWxwaGFfc2NhbisrOwotICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgICpkc3RfYWxwaGFfc2NhbiA9IEZYRElCX0FMUEhBX1VOSU9OKGJhY2tfYWxwaGEsIHNyY19hbHBoYSk7Ci0gICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyAoKmRzdF9hbHBoYV9zY2FuKTsKLSAgICAgIHVpbnQ4X3QgZ3JheTsKLSAgICAgIGlmIChwSWNjVHJhbnNmb3JtKQotICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgc3JjX3NjYW4sIDEpOwotICAgICAgZWxzZQotICAgICAgICBncmF5ID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7Ci0KLSAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgIGRzdF9hbHBoYV9zY2FuKys7Ci0gICAgICBzcmNfc2NhbiArPSAzOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKLSAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkc3RfYWxwaGFfc2NhbjsKLSAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgaW50IHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOwotICAgICAgICBpZiAoY2xpcF9zY2FuKQotICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwotCi0gICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZGVzdF9zY2FuLCBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7Ci0gICAgICAgICAgfQotICAgICAgICAgICpkc3RfYWxwaGFfc2NhbiA9IHNyY19hbHBoYTsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgZHN0X2FscGhhX3NjYW4rKzsKLSAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICB1aW50OF90IHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOwotICAgICAgaWYgKGNsaXBfc2NhbikKLSAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7Ci0KLSAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgZHN0X2FscGhhX3NjYW4rKzsKLSAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICAqZHN0X2FscGhhX3NjYW4gPSBGWERJQl9BTFBIQV9VTklPTihiYWNrX2FscGhhLCBzcmNfYWxwaGEpOwotICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gKCpkc3RfYWxwaGFfc2Nhbik7Ci0gICAgICB1aW50OF90IGdyYXk7Ci0gICAgICBpZiAocEljY1RyYW5zZm9ybSkKLSAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIHNyY19zY2FuLCAxKTsKLSAgICAgIGVsc2UKLSAgICAgICAgZ3JheSA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOwotCi0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOwotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICBkc3RfYWxwaGFfc2NhbisrOwotICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfQXJnYjJHcmF5KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKLSAgQ0NvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IG51bGxwdHI7Ci0gIHVpbnQ4X3QgZ3JheTsKLSAgaWYgKHBJY2NUcmFuc2Zvcm0pCi0gICAgcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotCi0gIGlmIChibGVuZF90eXBlKSB7Ci0gICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKLSAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgewotICAgICAgICBpbnQgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pCi0gICAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7Ci0KLSAgICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKQotICAgICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIHNyY19zY2FuLCAxKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBncmF5ID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7Ci0KLSAgICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKQotICAgICAgICAgICAgZ3JheSA9IGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGdyYXkgPSBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKLSAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgc3JjX2FscGhhKTsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikKLSAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKLQotICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pCi0gICAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgc3JjX3NjYW4sIDEpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKLQotICAgICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpCi0gICAgICAgICAgICBncmF5ID0gYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZ3JheSA9IEJsZW5kKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOwotICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBzcmNfYWxwaGEpOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHNyY19hbHBoYV9zY2FuKSB7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgICBpbnQgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICBpZiAoY2xpcF9zY2FuKQotICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKLQotICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICBpZiAocEljY1RyYW5zZm9ybSkKLSAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgc3JjX3NjYW4sIDEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgZ3JheSA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOwotCi0gICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBzcmNfYWxwaGEpOwotICAgICAgfQotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICBzcmNfc2NhbiArPSAzOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKLSAgICAgIGludCBzcmNfYWxwaGEgPSBzcmNfc2NhblszXTsKLSAgICAgIGlmIChjbGlwX3NjYW4pCi0gICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwotCi0gICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgIGlmIChwSWNjVHJhbnNmb3JtKQotICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBzcmNfc2NhbiwgMSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBncmF5ID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7Ci0KLSAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIHNyY19hbHBoYSk7Ci0gICAgICB9Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRlUm93X1JnYjJHcmF5KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKLSAgQ0NvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IG51bGxwdHI7Ci0gIHVpbnQ4X3QgZ3JheTsKLSAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICBwSWNjTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gIH0KLSAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgewotICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIHNyY19zY2FuLCAxKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKLSAgICAgIH0KLSAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpCi0gICAgICAgIGdyYXkgPSBibGVuZF90eXBlID09IEZYRElCX0JMRU5EX0xVTUlOT1NJVFkgPyBncmF5IDogKmRlc3Rfc2NhbjsKLSAgICAgIGVsc2UKLSAgICAgICAgZ3JheSA9IEJsZW5kKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOwotICAgICAgaWYgKGNsaXBfc2NhbiAmJiBjbGlwX3NjYW5bY29sXSA8IDI1NSkgewotICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY2xpcF9zY2FuW2NvbF0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IGdyYXk7Ci0gICAgICB9Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKLSAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgJmdyYXksIHNyY19zY2FuLCAxKTsKLSAgICB9IGVsc2UgewotICAgICAgZ3JheSA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOwotICAgIH0KLSAgICBpZiAoY2xpcF9zY2FuICYmIGNsaXBfc2Nhbltjb2xdIDwgMjU1KSB7Ci0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY2xpcF9zY2FuW2NvbF0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAqZGVzdF9zY2FuID0gZ3JheTsKLSAgICB9Ci0gICAgZGVzdF9zY2FuKys7Ci0gICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKLSAgfQotfQotCi12b2lkIENvbXBvc2l0ZVJvd19SZ2IyR3JheWEodWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKLSAgQ0NvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IG51bGxwdHI7Ci0gIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgcEljY01vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICB9Ci0gIGlmIChibGVuZF90eXBlKSB7Ci0gICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKLSAgICAgIGludCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKLSAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkZXN0X3NjYW4sIHNyY19zY2FuLCAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAqZGVzdF9zY2FuID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sICpzcmNfc2Nhbik7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOwotICAgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGludCBzcmNfYWxwaGEgPSAyNTU7Ci0gICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgICAgfQotICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKLSAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQotICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKLSAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICB1aW50OF90IGdyYXk7Ci0gICAgICBpZiAocEljY1RyYW5zZm9ybSkgewotICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAmZ3JheSwgc3JjX3NjYW4sIDEpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZ3JheSA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOwotICAgICAgfQotICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkKLSAgICAgICAgZ3JheSA9IGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOwotICAgICAgZWxzZQotICAgICAgICBncmF5ID0gQmxlbmQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgZ3JheSk7Ci0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOwotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgaW50IHNyY19hbHBoYSA9IDI1NTsKLSAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKLSAgICB9Ci0gICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIDEpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IEZYUkdCMkdSQVkoc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pOwotICAgICAgfQotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAyNTU7Ci0gICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICBkZXN0X2FscGhhX3NjYW4rKzsKLSAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaW50IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0gICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICB1aW50OF90IGdyYXk7Ci0gICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBzcmNfc2NhbiwgMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHNyY19zY2FuWzJdLCBzcmNfc2NhblsxXSwgKnNyY19zY2FuKTsKLSAgICB9Ci0gICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGFscGhhX3JhdGlvKTsKLSAgICBkZXN0X3NjYW4rKzsKLSAgICBzcmNfc2NhbiArPSBzcmNfQnBwOwotICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRlUm93X0FyZ2IyQXJnYih1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4pIHsKLSAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICBpZiAoIWRlc3RfYWxwaGFfc2NhbikgewotICAgIGlmICghc3JjX2FscGhhX3NjYW4pIHsKLSAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IDA7Ci0gICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKLSAgICAgICAgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuWzNdIC8gMjU1OwotICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIChGWEFSR0JfR0VURElCKHNyY19zY2FuKSAmIDB4ZmZmZmZmKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcmNfYWxwaGEgPDwgMjQpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlhBUkdCX0NPUFkoZGVzdF9zY2FuLCBzcmNfc2Nhbik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCBzcmNfYWxwaGE7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19zY2FuWzNdIC8gMjU1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KLSAgICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgICAgUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgewotICAgICAgICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICAgICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQmxlbmQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgKnNyY19zY2FuKTsKLSAgICAgICAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRSgqc3JjX3NjYW4sIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2NhbiwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgIH0KLSAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICBzcmNfc2NhbisrOwotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICBzcmNfc2NhbisrOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKLSAgICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogKCpzcmNfYWxwaGFfc2NhbikgLyAyNTU7Ci0gICAgICAgICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0UoKHNyY19hbHBoYSA8PCAyNCksIHNyY19zY2FuWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuWzFdLCAqc3JjX3NjYW4pKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9NQUtFKCgqc3JjX2FscGhhX3NjYW4gPDwgMjQpLCBzcmNfc2NhblsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW5bMV0sICpzcmNfc2NhbikpOwotICAgICAgICAgIH0KLSAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICAgIHNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCBzcmNfYWxwaGE7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqICgqc3JjX2FscGhhX3NjYW4rKykgLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQotICAgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICBSR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7Ci0gICAgICAgICAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKCpzcmNfc2NhbiwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19zY2FuLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgIHNyY19zY2FuKys7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChzcmNfYWxwaGFfc2NhbikgewotICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47Ci0gICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiAoKnNyY19hbHBoYV9zY2FuKSAvIDI1NTsKLSAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gPSBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gPSAqc3JjX2FscGhhX3NjYW47Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOwotICAgICAgICAgIHNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDhfdCBzcmNfYWxwaGE7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqICgqc3JjX2FscGhhX3NjYW4rKykgLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgZGVzdF9zY2FuICs9IDM7Ci0gICAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQotICAgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICBSR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7Ci0gICAgICAgICAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKCpzcmNfc2NhbiwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19zY2FuLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgIHNyY19zY2FuKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47Ci0gICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2NhblszXSAvIDI1NTsKLSAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gPSBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gPSBzcmNfc2NhblszXTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgc3JjX3NjYW4rKzsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bM10gLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgZGVzdF9zY2FuICs9IDM7Ci0gICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQotICAgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICBSR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7Ci0gICAgICAgICAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCAqc3JjX3NjYW4pOwotICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKCpzcmNfc2NhbiwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19zY2FuLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgIHNyY19zY2FuKys7Ci0gICAgICAgIH0KLSAgICAgICAgc3JjX3NjYW4rKzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfTm9DbGlwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuKSB7Ci0gIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKLSAgaWYgKGRlc3RfYWxwaGFfc2NhbikgewotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKLSAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gMHhmZjsKLSAgICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAweGZmOwotICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICBSR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgfQotICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKLSAgICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKLSAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfY29sb3IpOwotICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2NvbG9yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgIHNyY19zY2FuKys7Ci0gICAgICB9Ci0gICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgaWYgKHNyY19CcHAgPT0gNCkgewotICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCAweGZmMDAwMDAwIHwgRlhBUkdCX0dFVERJQihzcmNfc2NhbikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRSgweGZmLCBzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zY2FuWzBdKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgZGVzdF9zY2FuWzNdID0gMHhmZjsKLSAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgIH0KLSAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7Ci0gICAgICAgIGludCBzcmNfY29sb3IgPSAqc3JjX3NjYW47Ci0gICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDogQmxlbmQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2NvbG9yKTsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19jb2xvciwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICBzcmNfc2NhbisrOwotICAgICAgfQotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOwotICAgIH0KLSAgfQotfQotCi12b2lkIENvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9DbGlwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbikgewotICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7Ci0gIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7Ci0gIGlmIChkZXN0X2FscGhhX3NjYW4pIHsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICAgIGludCBzcmNfYWxwaGEgPSAqY2xpcF9zY2FuKys7Ci0gICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOwotICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgZGVzdF9zY2FuICs9IDM7Ci0gICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOwotICAgICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9Ci0gICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOwotICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgIH0KLSAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7Ci0gICAgICAgIGludCBzcmNfY29sb3IgPSAqc3JjX3NjYW47Ci0gICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDogQmxlbmQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2NvbG9yKTsKLSAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19jb2xvciwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICBzcmNfc2NhbisrOwotICAgICAgfQotICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgICBpbnQgc3JjX2FscGhhID0gKmNsaXBfc2NhbisrOwotICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOwotICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KLSAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgICBSR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgfQotICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKLSAgICAgICAgaW50IHNyY19jb2xvciA9ICpzcmNfc2NhbjsKLSAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfY29sb3IpOwotICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2NvbG9yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgIHNyY19zY2FuKys7Ci0gICAgICB9Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfQ2xpcCh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4pIHsKLSAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKLSAgaWYgKGRlc3RfYWxwaGFfc2NhbikgewotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gMjU1OwotICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICBkZXN0X3NjYW4gKz0gMzsKLSAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7Ci0gICAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaW50IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KLSAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0gICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2NhbiwgYWxwaGFfcmF0aW8pOwotICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgc3JjX3NjYW4rKzsKLSAgICAgIH0KLSAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgKmRlc3Rfc2NhbisrID0gMjU1OwotICAgICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpbnQgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9Ci0gICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7Ci0gICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCAqc3JjX3NjYW4sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgIHNyY19zY2FuKys7Ci0gICAgICB9Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfTm9DbGlwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4pIHsKLSAgaWYgKGRlc3RfYWxwaGFfc2NhbikgewotICAgIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAweGZmOwotICAgICAgc3JjX3NjYW4gKz0gc3JjX2dhcDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgICBpZiAoc3JjX0JwcCA9PSA0KSB7Ci0gICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCAweGZmMDAwMDAwIHwgRlhBUkdCX0dFVERJQihzcmNfc2NhbikpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX01BS0UoMHhmZiwgc3JjX3NjYW5bMl0sIHNyY19zY2FuWzFdLCBzcmNfc2NhblswXSkpOwotICAgICAgfQotICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOwotICAgIH0KLSAgfQotfQotCi12b2lkIENvbXBvc2l0ZVJvd19BcmdiMlJnYl9CbGVuZCh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2FscGhhX3NjYW4pIHsKLSAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICBpbnQgZGVzdF9nYXAgPSBkZXN0X0JwcCAtIDM7Ci0gIGlmIChzcmNfYWxwaGFfc2NhbikgewotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgICAgdWludDhfdCBzcmNfYWxwaGE7Ci0gICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgIHNyY19hbHBoYSA9ICgqc3JjX2FscGhhX3NjYW4rKykgKiAoKmNsaXBfc2NhbisrKSAvIDI1NTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOwotICAgICAgfQotICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgIFJHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgewotICAgICAgICBpbnQgYmFja19jb2xvciA9ICpkZXN0X3NjYW47Ci0gICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDogQmxlbmQoYmxlbmRfdHlwZSwgYmFja19jb2xvciwgKnNyY19zY2FuKTsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICBzcmNfc2NhbisrOwotICAgICAgfQotICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOwotICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXSAqICgqY2xpcF9zY2FuKyspIC8gMjU1OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107Ci0gICAgICB9Ci0gICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOwotICAgICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgIH0KLSAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7Ci0gICAgICAgIGludCBiYWNrX2NvbG9yID0gKmRlc3Rfc2NhbjsKLSAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCbGVuZChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCAqc3JjX3NjYW4pOwotICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoYmFja19jb2xvciwgYmxlbmRlZCwgc3JjX2FscGhhKTsKLSAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgIHNyY19zY2FuKys7Ci0gICAgICB9Ci0gICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7Ci0gICAgICBzcmNfc2NhbisrOwotICAgIH0KLSAgfQotfQotCi12b2lkIENvbXBvc2l0ZVJvd19BcmdiMlJnYl9Ob0JsZW5kKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuKSB7Ci0gIGludCBkZXN0X2dhcCA9IGRlc3RfQnBwIC0gMzsKLSAgaWYgKHNyY19hbHBoYV9zY2FuKSB7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgICB1aW50OF90IHNyY19hbHBoYTsKLSAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgc3JjX2FscGhhID0gKCpzcmNfYWxwaGFfc2NhbisrKSAqICgqY2xpcF9zY2FuKyspIC8gMjU1OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICB9Ci0gICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgICAgc3JjX3NjYW4gKz0gMzsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgewotICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19zY2FuLCBzcmNfYWxwaGEpOwotICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgc3JjX3NjYW4rKzsKLSAgICAgIH0KLSAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X2dhcDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgICB1aW50OF90IHNyY19hbHBoYTsKLSAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM10gKiAoKmNsaXBfc2NhbisrKSAvIDI1NTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOwotICAgICAgfQotICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOwotICAgICAgICBzcmNfc2NhbisrOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7Ci0gICAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2Nhbiwgc3JjX2FscGhhKTsKLSAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgIHNyY19zY2FuKys7Ci0gICAgICB9Ci0gICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7Ci0gICAgICBzcmNfc2NhbisrOwotICAgIH0KLSAgfQotfQotCi12b2lkIENvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX05vQ2xpcCh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHApIHsKLSAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICBpbnQgZGVzdF9nYXAgPSBkZXN0X0JwcCAtIDM7Ci0gIGludCBzcmNfZ2FwID0gc3JjX0JwcCAtIDM7Ci0gIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgIFJHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7Ci0gICAgfQotICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7Ci0gICAgICBpbnQgYmFja19jb2xvciA9ICpkZXN0X3NjYW47Ci0gICAgICBpbnQgc3JjX2NvbG9yID0gKnNyY19zY2FuOwotICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCi0gICAgICAgICAgICAgICAgICAgICAgICA6IEJsZW5kKGJsZW5kX3R5cGUsIGJhY2tfY29sb3IsIHNyY19jb2xvcik7Ci0gICAgICAqZGVzdF9zY2FuID0gYmxlbmRlZDsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgc3JjX3NjYW4rKzsKLSAgICB9Ci0gICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOwotICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gIH0KLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9DbGlwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgewotICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7Ci0gIGludCBkZXN0X2dhcCA9IGRlc3RfQnBwIC0gMzsKLSAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgdWludDhfdCBzcmNfYWxwaGEgPSAqY2xpcF9zY2FuKys7Ci0gICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7Ci0gICAgICBzcmNfc2NhbiArPSBzcmNfQnBwOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgIFJHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7Ci0gICAgfQotICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7Ci0gICAgICBpbnQgc3JjX2NvbG9yID0gKnNyY19zY2FuOwotICAgICAgaW50IGJhY2tfY29sb3IgPSAqZGVzdF9zY2FuOwotICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCi0gICAgICAgICAgICAgICAgICAgICAgICA6IEJsZW5kKGJsZW5kX3R5cGUsIGJhY2tfY29sb3IsIHNyY19jb2xvcik7Ci0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoYmFja19jb2xvciwgYmxlbmRlZCwgc3JjX2FscGhhKTsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgc3JjX3NjYW4rKzsKLSAgICB9Ci0gICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOwotICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gIH0KLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX05vQ2xpcCh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X0JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHApIHsKLSAgaWYgKGRlc3RfQnBwID09IHNyY19CcHApIHsKLSAgICBGWFNZU19tZW1jcHkoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGggKiBkZXN0X0JwcCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgIGRlc3Rfc2NhblswXSA9IHNyY19zY2FuWzBdOwotICAgIGRlc3Rfc2NhblsxXSA9IHNyY19zY2FuWzFdOwotICAgIGRlc3Rfc2NhblsyXSA9IHNyY19zY2FuWzJdOwotICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICBzcmNfc2NhbiArPSBzcmNfQnBwOwotICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9DbGlwKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfc2NhblswXTsKLSAgICAgIGRlc3Rfc2NhblsxXSA9IHNyY19zY2FuWzFdOwotICAgICAgZGVzdF9zY2FuWzJdID0gc3JjX3NjYW5bMl07Ci0gICAgfSBlbHNlIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCAqc3JjX3NjYW4sIHNyY19hbHBoYSk7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgIHNyY19zY2FuKys7Ci0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgKnNyY19zY2FuLCBzcmNfYWxwaGEpOwotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICBzcmNfc2NhbisrOwotICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfc2Nhbiwgc3JjX2FscGhhKTsKLSAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcCAtIDI7Ci0gICAgICBzcmNfc2NhbiArPSBzcmNfQnBwIC0gMjsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7Ci0gICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKLSAgfQotfQotCi12b2lkIENvbXBvc2l0ZVJvd19BcmdiMkFyZ2JfVHJhbnNmb3JtKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYWxwaGFfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc3JjX2NhY2hlX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKLSAgdWludDhfdCogZHAgPSBzcmNfY2FjaGVfc2NhbjsKLSAgQ0NvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9Ci0gICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgaWYgKHNyY19hbHBoYV9zY2FuKSB7Ci0gICAgaWYgKGRlc3RfYWxwaGFfc2NhbikgewotICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCBwaXhlbF9jb3VudCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgewotICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkcCwgc3JjX3NjYW4sIDEpOwotICAgICAgICBkcFszXSA9ICpzcmNfYWxwaGFfc2NhbisrOwotICAgICAgICBzcmNfc2NhbiArPSAzOwotICAgICAgICBkcCArPSA0OwotICAgICAgfQotICAgICAgc3JjX2FscGhhX3NjYW4gPSBudWxscHRyOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoZGVzdF9hbHBoYV9zY2FuKSB7Ci0gICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7Ci0gICAgICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47Ci0gICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2NhblszXSAvIDI1NTsKLSAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gPSBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX2NhY2hlX3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfY2FjaGVfc2NhbisrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19jYWNoZV9zY2FuKys7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gPSBzcmNfc2NhblszXTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfY2FjaGVfc2NhbisrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19jYWNoZV9zY2FuKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX2NhY2hlX3NjYW4rKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7Ci0gICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bM10gLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107Ci0gICAgICAgIH0KLSAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgZGVzdF9zY2FuICs9IDM7Ci0gICAgICAgICAgc3JjX2NhY2hlX3NjYW4gKz0gMzsKLSAgICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQotICAgICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgICAgICBSR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX2NhY2hlX3NjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7Ci0gICAgICAgICAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCAqc3JjX2NhY2hlX3NjYW4pOwotICAgICAgICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKCpzcmNfY2FjaGVfc2NhbiwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0KLSAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCAqc3JjX2NhY2hlX3NjYW4sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgc3JjX2NhY2hlX3NjYW4rKzsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKLSAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRwLCBzcmNfc2NhbiwgMSk7Ci0gICAgICBkcFszXSA9IHNyY19zY2FuWzNdOwotICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgIGRwICs9IDQ7Ci0gICAgfQotICB9Ci0gIENvbXBvc2l0ZVJvd19BcmdiMkFyZ2IoZGVzdF9zY2FuLCBzcmNfY2FjaGVfc2NhbiwgcGl4ZWxfY291bnQsIGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBkZXN0X2FscGhhX3NjYW4sIHNyY19hbHBoYV9zY2FuKTsKLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfTm9DbGlwX1RyYW5zZm9ybSh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX0JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfY2FjaGVfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgewotICBDQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KLSAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICBpZiAoc3JjX0JwcCA9PSAzKSB7Ci0gICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKLSAgfSBlbHNlIHsKLSAgICB1aW50OF90KiBkcCA9IHNyY19jYWNoZV9zY2FuOwotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCAxKTsKLSAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICBkcCArPSAzOwotICAgIH0KLSAgfQotICBDb21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfTm9DbGlwKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kX3R5cGUsIDMsIGRlc3RfYWxwaGFfc2Nhbik7Ci19Ci0KLXZvaWQgQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX0NsaXBfVHJhbnNmb3JtKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX0JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19jYWNoZV9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgewotICBDQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KLSAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICBpZiAoc3JjX0JwcCA9PSAzKSB7Ci0gICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKLSAgfSBlbHNlIHsKLSAgICB1aW50OF90KiBkcCA9IHNyY19jYWNoZV9zY2FuOwotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCAxKTsKLSAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICBkcCArPSAzOwotICAgIH0KLSAgfQotICBDb21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfQ2xpcChkZXN0X3NjYW4sIHNyY19jYWNoZV9zY2FuLCB3aWR0aCwgYmxlbmRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgY2xpcF9zY2FuLCBkZXN0X2FscGhhX3NjYW4pOwotfQotCi12b2lkIENvbXBvc2l0ZVJvd19SZ2IyQXJnYl9Ob0JsZW5kX0NsaXBfVHJhbnNmb3JtKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfY2FjaGVfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgewotICBDQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KLSAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICBpZiAoc3JjX0JwcCA9PSAzKSB7Ci0gICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKLSAgfSBlbHNlIHsKLSAgICB1aW50OF90KiBkcCA9IHNyY19jYWNoZV9zY2FuOwotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCAxKTsKLSAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICBkcCArPSAzOwotICAgIH0KLSAgfQotICBDb21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9DbGlwKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLCAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2NhbiwgZGVzdF9hbHBoYV9zY2FuKTsKLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9Ob0NsaXBfVHJhbnNmb3JtKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHNyY19jYWNoZV9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKLSAgQ0NvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9Ci0gICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgaWYgKHNyY19CcHAgPT0gMykgewotICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7Ci0gIH0gZWxzZSB7Ci0gICAgdWludDhfdCogZHAgPSBzcmNfY2FjaGVfc2NhbjsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGRwLCBzcmNfc2NhbiwgMSk7Ci0gICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgZHAgKz0gMzsKLSAgICB9Ci0gIH0KLSAgQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfTm9DbGlwKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLCAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9hbHBoYV9zY2FuKTsKLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfQXJnYjJSZ2JfQmxlbmRfVHJhbnNmb3JtKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYWxwaGFfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfY2FjaGVfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7Ci0gIENDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQotICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gIGlmIChzcmNfYWxwaGFfc2NhbikgewotICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7Ci0gIH0gZWxzZSB7Ci0gICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7Ci0gICAgaW50IGRlc3RfZ2FwID0gZGVzdF9CcHAgLSAzOwotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLCAxKTsKLSAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOwotICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXSAqICgqY2xpcF9zY2FuKyspIC8gMjU1OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107Ci0gICAgICB9Ci0gICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgICAgc3JjX2NhY2hlX3NjYW4gKz0gMzsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICAgIFJHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfY2FjaGVfc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgewotICAgICAgICBpbnQgYmFja19jb2xvciA9ICpkZXN0X3NjYW47Ci0gICAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDogQmxlbmQoYmxlbmRfdHlwZSwgYmFja19jb2xvciwgKnNyY19jYWNoZV9zY2FuKTsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICBzcmNfY2FjaGVfc2NhbisrOwotICAgICAgfQotICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLSAgQ29tcG9zaXRlUm93X0FyZ2IyUmdiX0JsZW5kKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLCBibGVuZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9CcHAsIGNsaXBfc2Nhbiwgc3JjX2FscGhhX3NjYW4pOwotfQotCi12b2lkIENvbXBvc2l0ZVJvd19BcmdiMlJnYl9Ob0JsZW5kX1RyYW5zZm9ybSh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X0JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc3JjX2NhY2hlX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7Ci0gIENDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQotICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gIGlmIChzcmNfYWxwaGFfc2NhbikgewotICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIHNyY19jYWNoZV9zY2FuLCBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCk7Ci0gIH0gZWxzZSB7Ci0gICAgaW50IGRlc3RfZ2FwID0gZGVzdF9CcHAgLSAzOwotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLCAxKTsKLSAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhOwotICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICBzcmNfYWxwaGEgPSBzcmNfc2NhblszXSAqICgqY2xpcF9zY2FuKyspIC8gMjU1OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107Ci0gICAgICB9Ci0gICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19jYWNoZV9zY2FuKys7Ci0gICAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfY2FjaGVfc2NhbisrOwotICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX2NhY2hlX3NjYW4rKzsKLSAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7Ci0gICAgICAgIHNyY19jYWNoZV9zY2FuICs9IDM7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sICpzcmNfY2FjaGVfc2Nhbiwgc3JjX2FscGhhKTsKLSAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgIHNyY19jYWNoZV9zY2FuKys7Ci0gICAgICB9Ci0gICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotICBDb21wb3NpdGVSb3dfQXJnYjJSZ2JfTm9CbGVuZChkZXN0X3NjYW4sIHNyY19jYWNoZV9zY2FuLCB3aWR0aCwgZGVzdF9CcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2Nhbiwgc3JjX2FscGhhX3NjYW4pOwotfQotCi12b2lkIENvbXBvc2l0ZVJvd19SZ2IyUmdiX0JsZW5kX05vQ2xpcF9UcmFuc2Zvcm0odWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9CcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc3JjX2NhY2hlX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgewotICBDQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KLSAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICBpZiAoc3JjX0JwcCA9PSAzKSB7Ci0gICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKLSAgfSBlbHNlIHsKLSAgICB1aW50OF90KiBkcCA9IHNyY19jYWNoZV9zY2FuOwotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCAxKTsKLSAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICBkcCArPSAzOwotICAgIH0KLSAgfQotICBDb21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9Ob0NsaXAoZGVzdF9zY2FuLCBzcmNfY2FjaGVfc2Nhbiwgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZF90eXBlLCBkZXN0X0JwcCwgMyk7Ci19Ci0KLXZvaWQgQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfQ2xpcF9UcmFuc2Zvcm0odWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX0JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfY2FjaGVfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgewotICBDQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KLSAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICBpZiAoc3JjX0JwcCA9PSAzKSB7Ci0gICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKLSAgfSBlbHNlIHsKLSAgICB1aW50OF90KiBkcCA9IHNyY19jYWNoZV9zY2FuOwotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCAxKTsKLSAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICBkcCArPSAzOwotICAgIH0KLSAgfQotICBDb21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9DbGlwKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLCBibGVuZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfQnBwLCAzLCBjbGlwX3NjYW4pOwotfQotCi12b2lkIENvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfTm9DbGlwX1RyYW5zZm9ybSh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X0JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc3JjX2NhY2hlX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtKSB7Ci0gIENDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQotICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gIGlmIChzcmNfQnBwID09IDMpIHsKLSAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBzcmNfY2FjaGVfc2Nhbiwgc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgpOwotICB9IGVsc2UgewotICAgIHVpbnQ4X3QqIGRwID0gc3JjX2NhY2hlX3NjYW47Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBkcCwgc3JjX3NjYW4sIDEpOwotICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgIGRwICs9IDM7Ci0gICAgfQotICB9Ci0gIENvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfTm9DbGlwKGRlc3Rfc2Nhbiwgc3JjX2NhY2hlX3NjYW4sIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X0JwcCwgMyk7Ci19Ci0KLXZvaWQgQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9DbGlwX1RyYW5zZm9ybSh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X0JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX0JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogc3JjX2NhY2hlX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgewotICBDQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KLSAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpOwotICBpZiAoc3JjX0JwcCA9PSAzKSB7Ci0gICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgc3JjX2NhY2hlX3NjYW4sIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoKTsKLSAgfSBlbHNlIHsKLSAgICB1aW50OF90KiBkcCA9IHNyY19jYWNoZV9zY2FuOwotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgZHAsIHNyY19zY2FuLCAxKTsKLSAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICBkcCArPSAzOwotICAgIH0KLSAgfQotICBDb21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX0NsaXAoZGVzdF9zY2FuLCBzcmNfY2FjaGVfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgY2xpcF9zY2FuKTsKLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfOGJwcFBhbDJHcmF5KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwUGFsZXR0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuKSB7Ci0gIGlmIChzcmNfYWxwaGFfc2NhbikgewotICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07Ci0gICAgICAgIGludCBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICB9Ci0gICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpCi0gICAgICAgICAgZ3JheSA9IGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOwotICAgICAgICBlbHNlCi0gICAgICAgICAgZ3JheSA9IEJsZW5kKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOwotICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIHNyY19hbHBoYSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgKmRlc3Rfc2NhbiA9IGdyYXk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgIHNyY19zY2FuKys7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgewotICAgICAgdWludDhfdCBncmF5ID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKLSAgICAgIGludCBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKLSAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICB9Ci0gICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBzcmNfYWxwaGEpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IGdyYXk7Ci0gICAgICB9Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgIHNyY19zY2FuKys7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgZ3JheSA9IHBQYWxldHRlWypzcmNfc2Nhbl07Ci0gICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpCi0gICAgICAgICAgZ3JheSA9IGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOwotICAgICAgICBlbHNlCi0gICAgICAgICAgZ3JheSA9IEJsZW5kKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOwotICAgICAgICBpZiAoY2xpcF9zY2FuICYmIGNsaXBfc2Nhbltjb2xdIDwgMjU1KSB7Ci0gICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNsaXBfc2Nhbltjb2xdKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAqZGVzdF9zY2FuID0gZ3JheTsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgc3JjX3NjYW4rKzsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgICB1aW50OF90IGdyYXkgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOwotICAgICAgaWYgKGNsaXBfc2NhbiAmJiBjbGlwX3NjYW5bY29sXSA8IDI1NSkgewotICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY2xpcF9zY2FuW2NvbF0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IGdyYXk7Ci0gICAgICB9Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgIHNyY19zY2FuKys7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRlUm93XzhicHBQYWwyR3JheWEodWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFBhbGV0dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYWxwaGFfc2NhbikgewotICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKLSAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgewotICAgICAgICB1aW50OF90IGdyYXkgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOwotICAgICAgICBzcmNfc2NhbisrOwotICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAgICAgaW50IHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOwotICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gZ3JheTsKLSAgICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4gPSBzcmNfYWxwaGE7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQ4X3Qgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAqZGVzdF9hbHBoYV9zY2FuID0KLSAgICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyAoKmRlc3RfYWxwaGFfc2Nhbik7Ci0gICAgICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpCi0gICAgICAgICAgZ3JheSA9IGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOwotICAgICAgICBlbHNlCi0gICAgICAgICAgZ3JheSA9IEJsZW5kKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIGdyYXkpOwotICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOwotICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKLSAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgewotICAgICAgdWludDhfdCBncmF5ID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKLSAgICAgIHNyY19zY2FuKys7Ci0gICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICBpbnQgc3JjX2FscGhhID0gKnNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgKmRlc3Rfc2NhbiA9IGdyYXk7Ci0gICAgICAgICAgKmRlc3RfYWxwaGFfc2NhbiA9IHNyY19hbHBoYTsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgdWludDhfdCBzcmNfYWxwaGEgPSAqc3JjX2FscGhhX3NjYW4rKzsKLSAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICB9Ci0gICAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgICpkZXN0X2FscGhhX3NjYW4gPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvICgqZGVzdF9hbHBoYV9zY2FuKTsKLSAgICAgIGRlc3RfYWxwaGFfc2NhbisrOwotICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGFscGhhX3JhdGlvKTsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgewotICAgICAgICB1aW50OF90IGdyYXkgPSBwUGFsZXR0ZVsqc3JjX3NjYW5dOwotICAgICAgICBzcmNfc2NhbisrOwotICAgICAgICBpZiAoIWNsaXBfc2NhbiB8fCBjbGlwX3NjYW5bY29sXSA9PSAyNTUpIHsKLSAgICAgICAgICAqZGVzdF9zY2FuKysgPSBncmF5OwotICAgICAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IDI1NTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07Ci0gICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgIGRlc3RfYWxwaGFfc2NhbisrOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKLSAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KLSAgICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBkZXN0X2FscGhhOwotICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKQotICAgICAgICAgIGdyYXkgPSBibGVuZF90eXBlID09IEZYRElCX0JMRU5EX0xVTUlOT1NJVFkgPyBncmF5IDogKmRlc3Rfc2NhbjsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGdyYXkgPSBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGFscGhhX3JhdGlvKTsKLSAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgewotICAgICAgdWludDhfdCBncmF5ID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKLSAgICAgIHNyY19zY2FuKys7Ci0gICAgICBpZiAoIWNsaXBfc2NhbiB8fCBjbGlwX3NjYW5bY29sXSA9PSAyNTUpIHsKLSAgICAgICAgKmRlc3Rfc2NhbisrID0gZ3JheTsKLSAgICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gMjU1OwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKLSAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgZGVzdF9hbHBoYV9zY2FuKys7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaW50IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KLSAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0gICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGFscGhhX3JhdGlvKTsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgIH0KLSAgfQotfQotCi12b2lkIENvbXBvc2l0ZVJvd18xYnBwUGFsMkdyYXkodWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwUGFsZXR0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7Ci0gIGludCByZXNldF9ncmF5ID0gcFBhbGV0dGVbMF07Ci0gIGludCBzZXRfZ3JheSA9IHBQYWxldHRlWzFdOwotICBpZiAoYmxlbmRfdHlwZSkgewotICAgIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgICB1aW50OF90IGdyYXkgPQotICAgICAgICAgIChzcmNfc2NhblsoY29sICsgc3JjX2xlZnQpIC8gOF0gJiAoMSA8PCAoNyAtIChjb2wgKyBzcmNfbGVmdCkgJSA4KSkpCi0gICAgICAgICAgICAgID8gc2V0X2dyYXkKLSAgICAgICAgICAgICAgOiByZXNldF9ncmF5OwotICAgICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkKLSAgICAgICAgZ3JheSA9IGJsZW5kX3R5cGUgPT0gRlhESUJfQkxFTkRfTFVNSU5PU0lUWSA/IGdyYXkgOiAqZGVzdF9zY2FuOwotICAgICAgZWxzZQotICAgICAgICBncmF5ID0gQmxlbmQoYmxlbmRfdHlwZSwgKmRlc3Rfc2NhbiwgZ3JheSk7Ci0gICAgICBpZiAoY2xpcF9zY2FuICYmIGNsaXBfc2Nhbltjb2xdIDwgMjU1KSB7Ci0gICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBjbGlwX3NjYW5bY29sXSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAqZGVzdF9zY2FuID0gZ3JheTsKLSAgICAgIH0KLSAgICAgIGRlc3Rfc2NhbisrOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgdWludDhfdCBncmF5ID0KLSAgICAgICAgKHNyY19zY2FuWyhjb2wgKyBzcmNfbGVmdCkgLyA4XSAmICgxIDw8ICg3IC0gKGNvbCArIHNyY19sZWZ0KSAlIDgpKSkKLSAgICAgICAgICAgID8gc2V0X2dyYXkKLSAgICAgICAgICAgIDogcmVzZXRfZ3JheTsKLSAgICBpZiAoY2xpcF9zY2FuICYmIGNsaXBfc2Nhbltjb2xdIDwgMjU1KSB7Ci0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgY2xpcF9zY2FuW2NvbF0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAqZGVzdF9zY2FuID0gZ3JheTsKLSAgICB9Ci0gICAgZGVzdF9zY2FuKys7Ci0gIH0KLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfMWJwcFBhbDJHcmF5YSh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBQYWxldHRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYWxwaGFfc2NhbikgewotICBpbnQgcmVzZXRfZ3JheSA9IHBQYWxldHRlWzBdOwotICBpbnQgc2V0X2dyYXkgPSBwUGFsZXR0ZVsxXTsKLSAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgewotICAgICAgdWludDhfdCBncmF5ID0KLSAgICAgICAgICAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKQotICAgICAgICAgICAgICA/IHNldF9ncmF5Ci0gICAgICAgICAgICAgIDogcmVzZXRfZ3JheTsKLSAgICAgIGlmICghY2xpcF9zY2FuIHx8IGNsaXBfc2Nhbltjb2xdID09IDI1NSkgewotICAgICAgICAqZGVzdF9zY2FuKysgPSBncmF5OwotICAgICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSAyNTU7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICBkZXN0X2FscGhhX3NjYW4rKzsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpbnQgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47Ci0gICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQotICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKLSAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKQotICAgICAgICBncmF5ID0gYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9MVU1JTk9TSVRZID8gZ3JheSA6ICpkZXN0X3NjYW47Ci0gICAgICBlbHNlCi0gICAgICAgIGdyYXkgPSBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBncmF5KTsKLSAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBhbHBoYV9yYXRpbyk7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0gIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgewotICAgIHVpbnQ4X3QgZ3JheSA9Ci0gICAgICAgIChzcmNfc2NhblsoY29sICsgc3JjX2xlZnQpIC8gOF0gJiAoMSA8PCAoNyAtIChjb2wgKyBzcmNfbGVmdCkgJSA4KSkpCi0gICAgICAgICAgICA/IHNldF9ncmF5Ci0gICAgICAgICAgICA6IHJlc2V0X2dyYXk7Ci0gICAgaWYgKCFjbGlwX3NjYW4gfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7Ci0gICAgICAqZGVzdF9zY2FuKysgPSBncmF5OwotICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gMjU1OwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKLSAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgZGVzdF9hbHBoYV9zY2FuKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaW50IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0gICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZ3JheSwgYWxwaGFfcmF0aW8pOwotICAgIGRlc3Rfc2NhbisrOwotICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRlUm93XzhicHBSZ2IyUmdiX05vQmxlbmQodWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBQYWxldHRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBEZXN0QnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hbHBoYV9zY2FuKSB7Ci0gIGlmIChzcmNfYWxwaGFfc2NhbikgewotICAgIGludCBkZXN0X2dhcCA9IERlc3RCcHAgLSAzOwotICAgIEZYX0FSR0IgYXJnYiA9IDA7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgICBhcmdiID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKLSAgICAgIGludCBzcmNfciA9IEZYQVJHQl9SKGFyZ2IpOwotICAgICAgaW50IHNyY19nID0gRlhBUkdCX0coYXJnYik7Ci0gICAgICBpbnQgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKLSAgICAgIHNyY19zY2FuKys7Ci0gICAgICB1aW50OF90IHNyY19hbHBoYSA9IDA7Ci0gICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgIHNyY19hbHBoYSA9ICgqc3JjX2FscGhhX3NjYW4rKykgKiAoKmNsaXBfc2NhbisrKSAvIDI1NTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOwotICAgICAgfQotICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2I7Ci0gICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19nOwotICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcjsKLSAgICAgICAgZGVzdF9zY2FuICs9IGRlc3RfZ2FwOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICBkZXN0X3NjYW4gKz0gRGVzdEJwcDsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIHNyY19hbHBoYSk7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgc3JjX2FscGhhKTsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBzcmNfYWxwaGEpOwotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICBkZXN0X3NjYW4gKz0gZGVzdF9nYXA7Ci0gICAgfQotICB9IGVsc2UgewotICAgIEZYX0FSR0IgYXJnYiA9IDA7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgICBhcmdiID0gcFBhbGV0dGVbKnNyY19zY2FuXTsKLSAgICAgIGludCBzcmNfciA9IEZYQVJHQl9SKGFyZ2IpOwotICAgICAgaW50IHNyY19nID0gRlhBUkdCX0coYXJnYik7Ci0gICAgICBpbnQgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKLSAgICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBjbGlwX3NjYW5bY29sXSk7Ci0gICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGNsaXBfc2Nhbltjb2xdKTsKLSAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgY2xpcF9zY2FuW2NvbF0pOwotICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19iOwotICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfZzsKLSAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3I7Ci0gICAgICB9Ci0gICAgICBpZiAoRGVzdEJwcCA9PSA0KSB7Ci0gICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgfQotICAgICAgc3JjX3NjYW4rKzsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfMWJwcFJnYjJSZ2JfTm9CbGVuZCh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwUGFsZXR0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRGVzdEJwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7Ci0gIGludCByZXNldF9yLCByZXNldF9nLCByZXNldF9iOwotICBpbnQgc2V0X3IsIHNldF9nLCBzZXRfYjsKLSAgcmVzZXRfciA9IEZYQVJHQl9SKHBQYWxldHRlWzBdKTsKLSAgcmVzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzBdKTsKLSAgcmVzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzBdKTsKLSAgc2V0X3IgPSBGWEFSR0JfUihwUGFsZXR0ZVsxXSk7Ci0gIHNldF9nID0gRlhBUkdCX0cocFBhbGV0dGVbMV0pOwotICBzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzFdKTsKLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgaW50IHNyY19yLCBzcmNfZywgc3JjX2I7Ci0gICAgaWYgKHNyY19zY2FuWyhjb2wgKyBzcmNfbGVmdCkgLyA4XSAmICgxIDw8ICg3IC0gKGNvbCArIHNyY19sZWZ0KSAlIDgpKSkgewotICAgICAgc3JjX3IgPSBzZXRfcjsKLSAgICAgIHNyY19nID0gc2V0X2c7Ci0gICAgICBzcmNfYiA9IHNldF9iOwotICAgIH0gZWxzZSB7Ci0gICAgICBzcmNfciA9IHJlc2V0X3I7Ci0gICAgICBzcmNfZyA9IHJlc2V0X2c7Ci0gICAgICBzcmNfYiA9IHJlc2V0X2I7Ci0gICAgfQotICAgIGlmIChjbGlwX3NjYW4gJiYgY2xpcF9zY2FuW2NvbF0gPCAyNTUpIHsKLSAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgY2xpcF9zY2FuW2NvbF0pOwotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGNsaXBfc2Nhbltjb2xdKTsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBjbGlwX3NjYW5bY29sXSk7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICB9IGVsc2UgewotICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2I7Ci0gICAgICAqZGVzdF9zY2FuKysgPSBzcmNfZzsKLSAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19yOwotICAgIH0KLSAgICBpZiAoRGVzdEJwcCA9PSA0KSB7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfOGJwcFJnYjJBcmdiX05vQmxlbmQodWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcFBhbGV0dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfYWxwaGFfc2NhbikgewotICBpZiAoc3JjX2FscGhhX3NjYW4pIHsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICAgIEZYX0FSR0IgYXJnYiA9IHBQYWxldHRlWypzcmNfc2Nhbl07Ci0gICAgICBzcmNfc2NhbisrOwotICAgICAgaW50IHNyY19yID0gRlhBUkdCX1IoYXJnYik7Ci0gICAgICBpbnQgc3JjX2cgPSBGWEFSR0JfRyhhcmdiKTsKLSAgICAgIGludCBzcmNfYiA9IEZYQVJHQl9CKGFyZ2IpOwotICAgICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogKCpzcmNfYWxwaGFfc2NhbikgLyAyNTU7Ci0gICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKHNyY19hbHBoYSwgc3JjX3IsIHNyY19nLCBzcmNfYikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX01BS0UoKnNyY19hbHBoYV9zY2FuLCBzcmNfciwgc3JjX2csIHNyY19iKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgIHNyY19hbHBoYV9zY2FuKys7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgdWludDhfdCBzcmNfYWxwaGE7Ci0gICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgIHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogKCpzcmNfYWxwaGFfc2NhbisrKSAvIDI1NTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNyY19hbHBoYSA9ICpzcmNfYWxwaGFfc2NhbisrOwotICAgICAgfQotICAgICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9Ci0gICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOwotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGFscGhhX3JhdGlvKTsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBhbHBoYV9yYXRpbyk7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICAgIEZYX0FSR0IgYXJnYiA9IHBQYWxldHRlWypzcmNfc2Nhbl07Ci0gICAgICBpbnQgc3JjX3IgPSBGWEFSR0JfUihhcmdiKTsKLSAgICAgIGludCBzcmNfZyA9IEZYQVJHQl9HKGFyZ2IpOwotICAgICAgaW50IHNyY19iID0gRlhBUkdCX0IoYXJnYik7Ci0gICAgICBpZiAoIWNsaXBfc2NhbiB8fCBjbGlwX3NjYW5bY29sXSA9PSAyNTUpIHsKLSAgICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2I7Ci0gICAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19nOwotICAgICAgICAqZGVzdF9zY2FuKysgPSBzcmNfcjsKLSAgICAgICAgKmRlc3Rfc2NhbisrID0gMjU1OwotICAgICAgICBzcmNfc2NhbisrOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKLSAgICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgc3JjX3NjYW4rKzsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpbnQgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9Ci0gICAgICAgICAgYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOwotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGFscGhhX3JhdGlvKTsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19yLCBhbHBoYV9yYXRpbyk7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgc3JjX3NjYW4rKzsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfMWJwcFJnYjJBcmdiX05vQmxlbmQodWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcFBhbGV0dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKLSAgaW50IHJlc2V0X3IsIHJlc2V0X2csIHJlc2V0X2I7Ci0gIGludCBzZXRfciwgc2V0X2csIHNldF9iOwotICByZXNldF9yID0gRlhBUkdCX1IocFBhbGV0dGVbMF0pOwotICByZXNldF9nID0gRlhBUkdCX0cocFBhbGV0dGVbMF0pOwotICByZXNldF9iID0gRlhBUkdCX0IocFBhbGV0dGVbMF0pOwotICBzZXRfciA9IEZYQVJHQl9SKHBQYWxldHRlWzFdKTsKLSAgc2V0X2cgPSBGWEFSR0JfRyhwUGFsZXR0ZVsxXSk7Ci0gIHNldF9iID0gRlhBUkdCX0IocFBhbGV0dGVbMV0pOwotICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICBpbnQgc3JjX3IsIHNyY19nLCBzcmNfYjsKLSAgICBpZiAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKSB7Ci0gICAgICBzcmNfciA9IHNldF9yOwotICAgICAgc3JjX2cgPSBzZXRfZzsKLSAgICAgIHNyY19iID0gc2V0X2I7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNyY19yID0gcmVzZXRfcjsKLSAgICAgIHNyY19nID0gcmVzZXRfZzsKLSAgICAgIHNyY19iID0gcmVzZXRfYjsKLSAgICB9Ci0gICAgaWYgKCFjbGlwX3NjYW4gfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7Ci0gICAgICAqZGVzdF9zY2FuKysgPSBzcmNfYjsKLSAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19nOwotICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3I7Ci0gICAgICAqZGVzdF9zY2FuKysgPSAyNTU7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaW50IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107Ci0gICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgYWxwaGFfcmF0aW8pOwotICAgIGRlc3Rfc2NhbisrOwotICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOwotICAgIGRlc3Rfc2NhbisrOwotICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgYWxwaGFfcmF0aW8pOwotICAgIGRlc3Rfc2NhbisrOwotICAgIGRlc3Rfc2NhbisrOwotICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRlUm93XzFicHBSZ2IyUmdiYV9Ob0JsZW5kKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBQYWxldHRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuKSB7Ci0gIGludCByZXNldF9yLCByZXNldF9nLCByZXNldF9iOwotICBpbnQgc2V0X3IsIHNldF9nLCBzZXRfYjsKLSAgcmVzZXRfciA9IEZYQVJHQl9SKHBQYWxldHRlWzBdKTsKLSAgcmVzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzBdKTsKLSAgcmVzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzBdKTsKLSAgc2V0X3IgPSBGWEFSR0JfUihwUGFsZXR0ZVsxXSk7Ci0gIHNldF9nID0gRlhBUkdCX0cocFBhbGV0dGVbMV0pOwotICBzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzFdKTsKLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgaW50IHNyY19yLCBzcmNfZywgc3JjX2I7Ci0gICAgaWYgKHNyY19zY2FuWyhjb2wgKyBzcmNfbGVmdCkgLyA4XSAmICgxIDw8ICg3IC0gKGNvbCArIHNyY19sZWZ0KSAlIDgpKSkgewotICAgICAgc3JjX3IgPSBzZXRfcjsKLSAgICAgIHNyY19nID0gc2V0X2c7Ci0gICAgICBzcmNfYiA9IHNldF9iOwotICAgIH0gZWxzZSB7Ci0gICAgICBzcmNfciA9IHJlc2V0X3I7Ci0gICAgICBzcmNfZyA9IHJlc2V0X2c7Ci0gICAgICBzcmNfYiA9IHJlc2V0X2I7Ci0gICAgfQotICAgIGlmICghY2xpcF9zY2FuIHx8IGNsaXBfc2Nhbltjb2xdID09IDI1NSkgewotICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2I7Ci0gICAgICAqZGVzdF9zY2FuKysgPSBzcmNfZzsKLSAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19yOwotICAgICAgKmRlc3RfYWxwaGFfc2NhbisrID0gMjU1OwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGludCBzcmNfYWxwaGEgPSBjbGlwX3NjYW5bY29sXTsKLSAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgIGRlc3Rfc2NhbiArPSAzOwotICAgICAgZGVzdF9hbHBoYV9zY2FuKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaW50IGJhY2tfYWxwaGEgPSAqZGVzdF9hbHBoYV9zY2FuOwotICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0gICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGFscGhhX3JhdGlvKTsKLSAgICBkZXN0X3NjYW4rKzsKLSAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIGFscGhhX3JhdGlvKTsKLSAgICBkZXN0X3NjYW4rKzsKLSAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIGFscGhhX3JhdGlvKTsKLSAgICBkZXN0X3NjYW4rKzsKLSAgfQotfQotCi12b2lkIENvbXBvc2l0ZVJvd19CeXRlTWFzazJBcmdiKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgaW50IHNyY19hbHBoYTsKLSAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgIH0gZWxzZSB7Ci0gICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogc3JjX3NjYW5bY29sXSAvIDI1NTsKLSAgICB9Ci0gICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBGWEFSR0JfTUFLRShzcmNfYWxwaGEsIHNyY19yLCBzcmNfZywgc3JjX2IpKTsKLSAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgewotICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgICAgdWludDhfdCBzY2FuWzNdID0ge3N0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyY19iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihzcmNfZyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oc3JjX3IpfTsKLSAgICAgIFJHQl9CbGVuZChibGVuZF90eXBlLCBzY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgICpkZXN0X3NjYW4gPQotICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzBdLCBhbHBoYV9yYXRpbyk7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICpkZXN0X3NjYW4gPQotICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzFdLCBhbHBoYV9yYXRpbyk7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICpkZXN0X3NjYW4gPQotICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzJdLCBhbHBoYV9yYXRpbyk7Ci0gICAgfSBlbHNlIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICBpbnQgYmxlbmRlZCA9IEJsZW5kKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19iKTsKLSAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfYiwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICBibGVuZGVkID0gQmxlbmQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2cpOwotICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19nLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgIGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfcik7Ci0gICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICB9IGVsc2UgewotICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBhbHBoYV9yYXRpbyk7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZywgYWxwaGFfcmF0aW8pOwotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIGFscGhhX3JhdGlvKTsKLSAgICB9Ci0gICAgZGVzdF9zY2FuICs9IDI7Ci0gIH0KLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfQnl0ZU1hc2syUmdiYSh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19hbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4pIHsKLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgaW50IHNyY19hbHBoYTsKLSAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgIH0gZWxzZSB7Ci0gICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogc3JjX3NjYW5bY29sXSAvIDI1NTsKLSAgICB9Ci0gICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKLSAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAqZGVzdF9zY2FuKysgPSBzcmNfYjsKLSAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19nOwotICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX3I7Ci0gICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBzcmNfYWxwaGE7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICBkZXN0X3NjYW4gKz0gMzsKLSAgICAgIGRlc3RfYWxwaGFfc2NhbisrOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0gICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICBpZiAoYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUpIHsKLSAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICAgIHVpbnQ4X3Qgc2NhblszXSA9IHtzdGF0aWNfY2FzdDx1aW50OF90PihzcmNfYiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oc3JjX2cpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyY19yKX07Ci0gICAgICBSR0JfQmxlbmQoYmxlbmRfdHlwZSwgc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7Ci0gICAgICAqZGVzdF9zY2FuID0KLSAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1swXSwgYWxwaGFfcmF0aW8pOwotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAqZGVzdF9zY2FuID0KLSAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1sxXSwgYWxwaGFfcmF0aW8pOwotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAqZGVzdF9zY2FuID0KLSAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1syXSwgYWxwaGFfcmF0aW8pOwotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgfSBlbHNlIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICBpbnQgYmxlbmRlZCA9IEJsZW5kKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19iKTsKLSAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfYiwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICBibGVuZGVkID0gQmxlbmQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2cpOwotICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19nLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgIGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfcik7Ci0gICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgIH0gZWxzZSB7Ci0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGFscGhhX3JhdGlvKTsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBhbHBoYV9yYXRpbyk7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgYWxwaGFfcmF0aW8pOwotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRlUm93X0J5dGVNYXNrMlJnYih1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7Ci0gIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgewotICAgIGludCBzcmNfYWxwaGE7Ci0gICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICB9IGVsc2UgewotICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIHNyY19zY2FuW2NvbF0gLyAyNTU7Ci0gICAgfQotICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgZGVzdF9zY2FuICs9IEJwcDsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAoYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEUpIHsKLSAgICAgIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgICAgIHVpbnQ4X3Qgc2NhblszXSA9IHtzdGF0aWNfY2FzdDx1aW50OF90PihzcmNfYiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oc3JjX2cpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyY19yKX07Ci0gICAgICBSR0JfQmxlbmQoYmxlbmRfdHlwZSwgc2NhbiwgZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9ycyk7Ci0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMF0sIHNyY19hbHBoYSk7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1sxXSwgc3JjX2FscGhhKTsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzJdLCBzcmNfYWxwaGEpOwotICAgIH0gZWxzZSBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgaW50IGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfYik7Ci0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgc3JjX2FscGhhKTsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgYmxlbmRlZCA9IEJsZW5kKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19nKTsKLSAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBzcmNfYWxwaGEpOwotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICBibGVuZGVkID0gQmxlbmQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX3IpOwotICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIHNyY19hbHBoYSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfYiwgc3JjX2FscGhhKTsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBzcmNfYWxwaGEpOwotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX3IsIHNyY19hbHBoYSk7Ci0gICAgfQotICAgIGRlc3Rfc2NhbiArPSBCcHAgLSAyOwotICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRlUm93X0J5dGVNYXNrMk1hc2sodWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7Ci0gIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgewotICAgIGludCBzcmNfYWxwaGE7Ci0gICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICB9IGVsc2UgewotICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIHNyY19zY2FuW2NvbF0gLyAyNTU7Ci0gICAgfQotICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkZXN0X3NjYW47Ci0gICAgaWYgKCFiYWNrX2FscGhhKSB7Ci0gICAgICAqZGVzdF9zY2FuID0gc3JjX2FscGhhOwotICAgIH0gZWxzZSBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAqZGVzdF9zY2FuID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgfQotICAgIGRlc3Rfc2NhbisrOwotICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRlUm93X0J5dGVNYXNrMkdyYXkodWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hc2tfYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfZ3JheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgaW50IHNyY19hbHBoYTsKLSAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgIH0gZWxzZSB7Ci0gICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogc3JjX3NjYW5bY29sXSAvIDI1NTsKLSAgICB9Ci0gICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19ncmF5LCBzcmNfYWxwaGEpOwotICAgIH0KLSAgICBkZXN0X3NjYW4rKzsKLSAgfQotfQotCi12b2lkIENvbXBvc2l0ZVJvd19CeXRlTWFzazJHcmF5YSh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19ncmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuKSB7Ci0gIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgewotICAgIGludCBzcmNfYWxwaGE7Ci0gICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICB9IGVsc2UgewotICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIHNyY19zY2FuW2NvbF0gLyAyNTU7Ci0gICAgfQotICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9ICpkZXN0X2FscGhhX3NjYW47Ci0gICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgKmRlc3Rfc2NhbisrID0gc3JjX2dyYXk7Ci0gICAgICAqZGVzdF9hbHBoYV9zY2FuKysgPSBzcmNfYWxwaGE7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgIGRlc3RfYWxwaGFfc2NhbisrOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0gICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2dyYXksIGFscGhhX3JhdGlvKTsKLSAgICBkZXN0X3NjYW4rKzsKLSAgfQotfQotCi12b2lkIENvbXBvc2l0ZVJvd19CaXRNYXNrMkFyZ2IodWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7Ci0gIGlmIChibGVuZF90eXBlID09IEZYRElCX0JMRU5EX05PUk1BTCAmJiAhY2xpcF9zY2FuICYmIG1hc2tfYWxwaGEgPT0gMjU1KSB7Ci0gICAgRlhfQVJHQiBhcmdiID0gRlhBUkdCX01BS0UoMHhmZiwgc3JjX3IsIHNyY19nLCBzcmNfYik7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgICBpZiAoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSB7Ci0gICAgICAgIEZYQVJHQl9TRVRESUIoZGVzdF9zY2FuLCBhcmdiKTsKLSAgICAgIH0KLSAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgaWYgKCEoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSkgewotICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaW50IHNyY19hbHBoYTsKLSAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGE7Ci0gICAgfQotICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICBGWEFSR0JfU0VURElCKGRlc3Rfc2NhbiwgRlhBUkdCX01BS0Uoc3JjX2FscGhhLCBzcmNfciwgc3JjX2csIHNyY19iKSk7Ci0gICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgaWYgKGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFKSB7Ci0gICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgICB1aW50OF90IHNjYW5bM10gPSB7c3RhdGljX2Nhc3Q8dWludDhfdD4oc3JjX2IpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyY19nKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihzcmNfcil9OwotICAgICAgUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNjYW4sIGRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgKmRlc3Rfc2NhbiA9Ci0gICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMF0sIGFscGhhX3JhdGlvKTsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgKmRlc3Rfc2NhbiA9Ci0gICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMV0sIGFscGhhX3JhdGlvKTsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgKmRlc3Rfc2NhbiA9Ci0gICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMl0sIGFscGhhX3JhdGlvKTsKLSAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgIGludCBibGVuZGVkID0gQmxlbmQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2IpOwotICAgICAgYmxlbmRlZCA9IEZYRElCX0FMUEhBX01FUkdFKHNyY19iLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgIGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfZyk7Ci0gICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2csIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgYmxlbmRlZCA9IEJsZW5kKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19yKTsKLSAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfciwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgYWxwaGFfcmF0aW8pOwotICAgIH0gZWxzZSB7Ci0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2IsIGFscGhhX3JhdGlvKTsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19nLCBhbHBoYV9yYXRpbyk7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgYWxwaGFfcmF0aW8pOwotICAgIH0KLSAgICBkZXN0X3NjYW4gKz0gMjsKLSAgfQotfQotCi12b2lkIENvbXBvc2l0ZVJvd19CaXRNYXNrMlJnYih1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7Ci0gIGlmIChibGVuZF90eXBlID09IEZYRElCX0JMRU5EX05PUk1BTCAmJiAhY2xpcF9zY2FuICYmIG1hc2tfYWxwaGEgPT0gMjU1KSB7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgICBpZiAoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSB7Ci0gICAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19yOwotICAgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfZzsKLSAgICAgICAgZGVzdF9zY2FuWzBdID0gc3JjX2I7Ci0gICAgICB9Ci0gICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgaWYgKCEoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSkgewotICAgICAgZGVzdF9zY2FuICs9IEJwcDsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpbnQgc3JjX2FscGhhOwotICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICB9IGVsc2UgewotICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYTsKLSAgICB9Ci0gICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgewotICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgICAgdWludDhfdCBzY2FuWzNdID0ge3N0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyY19iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihzcmNfZyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oc3JjX3IpfTsKLSAgICAgIFJHQl9CbGVuZChibGVuZF90eXBlLCBzY2FuLCBkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkX2NvbG9yc1swXSwgc3JjX2FscGhhKTsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWRfY29sb3JzWzFdLCBzcmNfYWxwaGEpOwotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZF9jb2xvcnNbMl0sIHNyY19hbHBoYSk7Ci0gICAgfSBlbHNlIGlmIChibGVuZF90eXBlKSB7Ci0gICAgICBpbnQgYmxlbmRlZCA9IEJsZW5kKGJsZW5kX3R5cGUsICpkZXN0X3NjYW4sIHNyY19iKTsKLSAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBibGVuZGVkLCBzcmNfYWxwaGEpOwotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICBibGVuZGVkID0gQmxlbmQoYmxlbmRfdHlwZSwgKmRlc3Rfc2Nhbiwgc3JjX2cpOwotICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGJsZW5kZWQsIHNyY19hbHBoYSk7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgIGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCAqZGVzdF9zY2FuLCBzcmNfcik7Ci0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgYmxlbmRlZCwgc3JjX2FscGhhKTsKLSAgICB9IGVsc2UgewotICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHNyY19iLCBzcmNfYWxwaGEpOwotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2Nhbiwgc3JjX2csIHNyY19hbHBoYSk7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfciwgc3JjX2FscGhhKTsKLSAgICB9Ci0gICAgZGVzdF9zY2FuICs9IEJwcCAtIDI7Ci0gIH0KLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfQml0TWFzazJNYXNrKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19hbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgewotICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKLSAgICBpZiAoIShzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJiAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpKSB7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpbnQgc3JjX2FscGhhOwotICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICB9IGVsc2UgewotICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYTsKLSAgICB9Ci0gICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3Rfc2NhbjsKLSAgICBpZiAoIWJhY2tfYWxwaGEpIHsKLSAgICAgICpkZXN0X3NjYW4gPSBzcmNfYWxwaGE7Ci0gICAgfSBlbHNlIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICpkZXN0X3NjYW4gPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICB9Ci0gICAgZGVzdF9zY2FuKys7Ci0gIH0KLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfQml0TWFzazJHcmF5KHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19hbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2dyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgaWYgKCEoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSkgewotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaW50IHNyY19hbHBoYTsKLSAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGE7Ci0gICAgfQotICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZ3JheSwgc3JjX2FscGhhKTsKLSAgICB9Ci0gICAgZGVzdF9zY2FuKys7Ci0gIH0KLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfQml0TWFzazJHcmF5YSh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19hbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19ncmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2FscGhhX3NjYW4pIHsKLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgaWYgKCEoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSkgewotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICBkZXN0X2FscGhhX3NjYW4rKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpbnQgc3JjX2FscGhhOwotICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICB9IGVsc2UgewotICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYTsKLSAgICB9Ci0gICAgdWludDhfdCBiYWNrX2FscGhhID0gKmRlc3RfYWxwaGFfc2NhbjsKLSAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICAqZGVzdF9zY2FuKysgPSBzcmNfZ3JheTsKLSAgICAgICpkZXN0X2FscGhhX3NjYW4rKyA9IHNyY19hbHBoYTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgZGVzdF9hbHBoYV9zY2FuKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgKmRlc3RfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKLSAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBzcmNfZ3JheSwgYWxwaGFfcmF0aW8pOwotICAgIGRlc3Rfc2NhbisrOwotICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRlUm93X0FyZ2IyQXJnYl9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7Ci0gIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bM10gLyAyNTU7Ci0gICAgICAgIGRlc3Rfc2NhblszXSA9IHNyY19hbHBoYTsKLSAgICAgICAgZGVzdF9zY2FuWzBdID0gc3JjX3NjYW5bMl07Ci0gICAgICAgIGRlc3Rfc2NhblsxXSA9IHNyY19zY2FuWzFdOwotICAgICAgICBkZXN0X3NjYW5bMl0gPSBzcmNfc2NhblswXTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYQVJHQl9SR0JPUkRFUkNPUFkoZGVzdF9zY2FuLCBzcmNfc2Nhbik7Ci0gICAgICB9Ci0gICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgdWludDhfdCBzcmNfYWxwaGE7Ci0gICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2NhblszXSAvIDI1NTsKLSAgICB9IGVsc2UgewotICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107Ci0gICAgfQotICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICBzcmNfc2NhbiArPSA0OwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICBpZiAoYk5vbnNlcGFyYWJsZUJsZW5kKSB7Ci0gICAgICB1aW50OF90IGRlc3Rfc2Nhbl9vWzNdOwotICAgICAgZGVzdF9zY2FuX29bMF0gPSBkZXN0X3NjYW5bMl07Ci0gICAgICBkZXN0X3NjYW5fb1sxXSA9IGRlc3Rfc2NhblsxXTsKLSAgICAgIGRlc3Rfc2Nhbl9vWzJdID0gZGVzdF9zY2FuWzBdOwotICAgICAgUkdCX0JsZW5kKGJsZW5kX3R5cGUsIHNyY19zY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOwotICAgIH0KLSAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgewotICAgICAgaW50IGluZGV4ID0gMiAtIGNvbG9yOwotICAgICAgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCbGVuZChibGVuZF90eXBlLCBkZXN0X3NjYW5baW5kZXhdLCAqc3JjX3NjYW4pOwotICAgICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0UoKnNyY19zY2FuLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgICAgZGVzdF9zY2FuW2luZGV4XSA9Ci0gICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5baW5kZXhdLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBkZXN0X3NjYW5baW5kZXhdID0KLSAgICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhbltpbmRleF0sICpzcmNfc2NhbiwgYWxwaGFfcmF0aW8pOwotICAgICAgfQotICAgICAgc3JjX3NjYW4rKzsKLSAgICB9Ci0gICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgc3JjX3NjYW4rKzsKLSAgfQotfQotCi12b2lkIENvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwKSB7Ci0gIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgdWludDhfdCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgIGlmIChzcmNfQnBwID09IDQpIHsKLSAgICAgICAgRlhBUkdCX1NFVFJHQk9SREVSRElCKGRlc3Rfc2NhbiwgMHhmZjAwMDAwMCB8IEZYQVJHQl9HRVRESUIoc3JjX3NjYW4pKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYQVJHQl9TRVRSR0JPUkRFUkRJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKDB4ZmYsIHNyY19zY2FuWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2NhblsxXSwgc3JjX3NjYW5bMF0pKTsKLSAgICAgIH0KLSAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBkZXN0X3NjYW5bM10gPSAweGZmOwotICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgIHVpbnQ4X3QgZGVzdF9zY2FuX29bM107Ci0gICAgICBkZXN0X3NjYW5fb1swXSA9IGRlc3Rfc2NhblsyXTsKLSAgICAgIGRlc3Rfc2Nhbl9vWzFdID0gZGVzdF9zY2FuWzFdOwotICAgICAgZGVzdF9zY2FuX29bMl0gPSBkZXN0X3NjYW5bMF07Ci0gICAgICBSR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2Nhbl9vLCBibGVuZGVkX2NvbG9ycyk7Ci0gICAgfQotICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7Ci0gICAgICBpbnQgaW5kZXggPSAyIC0gY29sb3I7Ci0gICAgICBpbnQgc3JjX2NvbG9yID0gKnNyY19zY2FuOwotICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCi0gICAgICAgICAgICAgICAgICAgICAgICA6IEJsZW5kKGJsZW5kX3R5cGUsIGRlc3Rfc2NhbltpbmRleF0sIHNyY19jb2xvcik7Ci0gICAgICBkZXN0X3NjYW5baW5kZXhdID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2NvbG9yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgIHNyY19zY2FuKys7Ci0gICAgfQotICAgIGRlc3Rfc2NhbiArPSA0OwotICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gIH0KLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfQXJnYjJSZ2JfQmxlbmRfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgewotICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gIGJvb2wgYk5vbnNlcGFyYWJsZUJsZW5kID0gYmxlbmRfdHlwZSA+PSBGWERJQl9CTEVORF9OT05TRVBBUkFCTEU7Ci0gIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgIHVpbnQ4X3Qgc3JjX2FscGhhOwotICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzNdICogKCpjbGlwX3NjYW4rKykgLyAyNTU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNyY19hbHBoYSA9IHNyY19zY2FuWzNdOwotICAgIH0KLSAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgIHNyY19zY2FuICs9IDQ7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgdWludDhfdCBkZXN0X3NjYW5fb1szXTsKLSAgICAgIGRlc3Rfc2Nhbl9vWzBdID0gZGVzdF9zY2FuWzJdOwotICAgICAgZGVzdF9zY2FuX29bMV0gPSBkZXN0X3NjYW5bMV07Ci0gICAgICBkZXN0X3NjYW5fb1syXSA9IGRlc3Rfc2NhblswXTsKLSAgICAgIFJHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKLSAgICAgIGludCBpbmRleCA9IDIgLSBjb2xvcjsKLSAgICAgIGludCBiYWNrX2NvbG9yID0gZGVzdF9zY2FuW2luZGV4XTsKLSAgICAgIGludCBibGVuZGVkID0gYk5vbnNlcGFyYWJsZUJsZW5kCi0gICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kZWRfY29sb3JzW2NvbG9yXQotICAgICAgICAgICAgICAgICAgICAgICAgOiBCbGVuZChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCAqc3JjX3NjYW4pOwotICAgICAgZGVzdF9zY2FuW2luZGV4XSA9IEZYRElCX0FMUEhBX01FUkdFKGJhY2tfY29sb3IsIGJsZW5kZWQsIHNyY19hbHBoYSk7Ci0gICAgICBzcmNfc2NhbisrOwotICAgIH0KLSAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7Ci0gICAgc3JjX3NjYW4rKzsKLSAgfQotfQotCi12b2lkIENvbXBvc2l0ZVJvd19SZ2IyQXJnYl9Ob0JsZW5kX05vQ2xpcF9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX0JwcCkgewotICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICBpZiAoc3JjX0JwcCA9PSA0KSB7Ci0gICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoZGVzdF9zY2FuLCAweGZmMDAwMDAwIHwgRlhBUkdCX0dFVERJQihzcmNfc2NhbikpOwotICAgIH0gZWxzZSB7Ci0gICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoCi0gICAgICAgICAgZGVzdF9zY2FuLCBGWEFSR0JfTUFLRSgweGZmLCBzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sIHNyY19zY2FuWzBdKSk7Ci0gICAgfQotICAgIGRlc3Rfc2NhbiArPSA0OwotICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gIH0KLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwKSB7Ci0gIGludCBibGVuZGVkX2NvbG9yc1szXTsKLSAgYm9vbCBiTm9uc2VwYXJhYmxlQmxlbmQgPSBibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRTsKLSAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgdWludDhfdCBkZXN0X3NjYW5fb1szXTsKLSAgICAgIGRlc3Rfc2Nhbl9vWzBdID0gZGVzdF9zY2FuWzJdOwotICAgICAgZGVzdF9zY2FuX29bMV0gPSBkZXN0X3NjYW5bMV07Ci0gICAgICBkZXN0X3NjYW5fb1syXSA9IGRlc3Rfc2NhblswXTsKLSAgICAgIFJHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKLSAgICAgIGludCBpbmRleCA9IDIgLSBjb2xvcjsKLSAgICAgIGludCBiYWNrX2NvbG9yID0gZGVzdF9zY2FuW2luZGV4XTsKLSAgICAgIGludCBzcmNfY29sb3IgPSAqc3JjX3NjYW47Ci0gICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZAotICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KLSAgICAgICAgICAgICAgICAgICAgICAgIDogQmxlbmQoYmxlbmRfdHlwZSwgYmFja19jb2xvciwgc3JjX2NvbG9yKTsKLSAgICAgIGRlc3Rfc2NhbltpbmRleF0gPSBibGVuZGVkOwotICAgICAgc3JjX3NjYW4rKzsKLSAgICB9Ci0gICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOwotICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gIH0KLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfQXJnYjJSZ2JfTm9CbGVuZF9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9CcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgdWludDhfdCBzcmNfYWxwaGE7Ci0gICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM10gKiAoKmNsaXBfc2NhbisrKSAvIDI1NTsKLSAgICB9IGVsc2UgewotICAgICAgc3JjX2FscGhhID0gc3JjX3NjYW5bM107Ci0gICAgfQotICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICBkZXN0X3NjYW5bMl0gPSAqc3JjX3NjYW4rKzsKLSAgICAgIGRlc3Rfc2NhblsxXSA9ICpzcmNfc2NhbisrOwotICAgICAgZGVzdF9zY2FuWzBdID0gKnNyY19zY2FuKys7Ci0gICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7Ci0gICAgICBzcmNfc2NhbisrOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOwotICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBmb3IgKGludCBjb2xvciA9IDA7IGNvbG9yIDwgMzsgY29sb3IrKykgewotICAgICAgaW50IGluZGV4ID0gMiAtIGNvbG9yOwotICAgICAgZGVzdF9zY2FuW2luZGV4XSA9Ci0gICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuW2luZGV4XSwgKnNyY19zY2FuLCBzcmNfYWxwaGEpOwotICAgICAgc3JjX3NjYW4rKzsKLSAgICB9Ci0gICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOwotICAgIHNyY19zY2FuKys7Ci0gIH0KLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX05vQ2xpcF9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9CcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX0JwcCkgewotICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICBkZXN0X3NjYW5bMl0gPSBzcmNfc2NhblswXTsKLSAgICBkZXN0X3NjYW5bMV0gPSBzcmNfc2NhblsxXTsKLSAgICBkZXN0X3NjYW5bMF0gPSBzcmNfc2NhblsyXTsKLSAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7Ci0gICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKLSAgfQotfQotCi12b2lkIENvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19CcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKLSAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOwotICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICBpbnQgc3JjX2FscGhhID0gKmNsaXBfc2NhbisrOwotICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICBkZXN0X3NjYW5bMl0gPSAqc3JjX3NjYW4rKzsKLSAgICAgIGRlc3Rfc2NhblsxXSA9ICpzcmNfc2NhbisrOwotICAgICAgZGVzdF9zY2FuWzBdID0gKnNyY19zY2FuKys7Ci0gICAgICBzcmNfc2NhbiArPSBzcmNfZ2FwOwotICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgIGlmIChiTm9uc2VwYXJhYmxlQmxlbmQpIHsKLSAgICAgIHVpbnQ4X3QgZGVzdF9zY2FuX29bM107Ci0gICAgICBkZXN0X3NjYW5fb1swXSA9IGRlc3Rfc2NhblsyXTsKLSAgICAgIGRlc3Rfc2Nhbl9vWzFdID0gZGVzdF9zY2FuWzFdOwotICAgICAgZGVzdF9zY2FuX29bMl0gPSBkZXN0X3NjYW5bMF07Ci0gICAgICBSR0JfQmxlbmQoYmxlbmRfdHlwZSwgc3JjX3NjYW4sIGRlc3Rfc2Nhbl9vLCBibGVuZGVkX2NvbG9ycyk7Ci0gICAgfQotICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7Ci0gICAgICBpbnQgaW5kZXggPSAyIC0gY29sb3I7Ci0gICAgICBpbnQgc3JjX2NvbG9yID0gKnNyY19zY2FuOwotICAgICAgaW50IGJsZW5kZWQgPSBiTm9uc2VwYXJhYmxlQmxlbmQKLSAgICAgICAgICAgICAgICAgICAgICAgID8gYmxlbmRlZF9jb2xvcnNbY29sb3JdCi0gICAgICAgICAgICAgICAgICAgICAgICA6IEJsZW5kKGJsZW5kX3R5cGUsIGRlc3Rfc2NhbltpbmRleF0sIHNyY19jb2xvcik7Ci0gICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2NvbG9yLCBibGVuZGVkLCBiYWNrX2FscGhhKTsKLSAgICAgIGRlc3Rfc2NhbltpbmRleF0gPQotICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhbltpbmRleF0sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgIHNyY19zY2FuKys7Ci0gICAgfQotICAgIGRlc3Rfc2NhbiArPSA0OwotICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gIH0KLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9CcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKLSAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICBib29sIGJOb25zZXBhcmFibGVCbGVuZCA9IGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFOwotICBpbnQgc3JjX2dhcCA9IHNyY19CcHAgLSAzOwotICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICB1aW50OF90IHNyY19hbHBoYSA9ICpjbGlwX3NjYW4rKzsKLSAgICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X0JwcDsKLSAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKGJOb25zZXBhcmFibGVCbGVuZCkgewotICAgICAgdWludDhfdCBkZXN0X3NjYW5fb1szXTsKLSAgICAgIGRlc3Rfc2Nhbl9vWzBdID0gZGVzdF9zY2FuWzJdOwotICAgICAgZGVzdF9zY2FuX29bMV0gPSBkZXN0X3NjYW5bMV07Ci0gICAgICBkZXN0X3NjYW5fb1syXSA9IGRlc3Rfc2NhblswXTsKLSAgICAgIFJHQl9CbGVuZChibGVuZF90eXBlLCBzcmNfc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgY29sb3IgPSAwOyBjb2xvciA8IDM7IGNvbG9yKyspIHsKLSAgICAgIGludCBpbmRleCA9IDIgLSBjb2xvcjsKLSAgICAgIGludCBzcmNfY29sb3IgPSAqc3JjX3NjYW47Ci0gICAgICBpbnQgYmFja19jb2xvciA9IGRlc3Rfc2NhbltpbmRleF07Ci0gICAgICBpbnQgYmxlbmRlZCA9IGJOb25zZXBhcmFibGVCbGVuZAotICAgICAgICAgICAgICAgICAgICAgICAgPyBibGVuZGVkX2NvbG9yc1tjb2xvcl0KLSAgICAgICAgICAgICAgICAgICAgICAgIDogQmxlbmQoYmxlbmRfdHlwZSwgYmFja19jb2xvciwgc3JjX2NvbG9yKTsKLSAgICAgIGRlc3Rfc2NhbltpbmRleF0gPSBGWERJQl9BTFBIQV9NRVJHRShiYWNrX2NvbG9yLCBibGVuZGVkLCBzcmNfYWxwaGEpOwotICAgICAgc3JjX3NjYW4rKzsKLSAgICB9Ci0gICAgZGVzdF9zY2FuICs9IGRlc3RfQnBwOwotICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gIH0KLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKLSAgaW50IHNyY19nYXAgPSBzcmNfQnBwIC0gMzsKLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICBkZXN0X3NjYW5bMl0gPSAqc3JjX3NjYW4rKzsKLSAgICAgIGRlc3Rfc2NhblsxXSA9ICpzcmNfc2NhbisrOwotICAgICAgZGVzdF9zY2FuWzBdID0gKnNyY19zY2FuKys7Ci0gICAgICBkZXN0X3NjYW5bM10gPSAyNTU7Ci0gICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgIHNyY19zY2FuICs9IHNyY19CcHA7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaW50IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107Ci0gICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgIGZvciAoaW50IGNvbG9yID0gMDsgY29sb3IgPCAzOyBjb2xvcisrKSB7Ci0gICAgICBpbnQgaW5kZXggPSAyIC0gY29sb3I7Ci0gICAgICBkZXN0X3NjYW5baW5kZXhdID0KLSAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5baW5kZXhdLCAqc3JjX3NjYW4sIGFscGhhX3JhdGlvKTsKLSAgICAgIHNyY19zY2FuKys7Ci0gICAgfQotICAgIGRlc3Rfc2NhbiArPSA0OwotICAgIHNyY19zY2FuICs9IHNyY19nYXA7Ci0gIH0KLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX0NsaXBfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgewotICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07Ci0gICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19zY2FuWzBdOwotICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX3NjYW5bMV07Ci0gICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfc2NhblsyXTsKLSAgICB9IGVsc2UgaWYgKHNyY19hbHBoYSkgewotICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCAqc3JjX3NjYW4sIHNyY19hbHBoYSk7Ci0gICAgICBzcmNfc2NhbisrOwotICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCAqc3JjX3NjYW4sIHNyY19hbHBoYSk7Ci0gICAgICBzcmNfc2NhbisrOwotICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCAqc3JjX3NjYW4sIHNyY19hbHBoYSk7Ci0gICAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7Ci0gICAgICBzcmNfc2NhbiArPSBzcmNfQnBwIC0gMjsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBkZXN0X3NjYW4gKz0gZGVzdF9CcHA7Ci0gICAgc3JjX3NjYW4gKz0gc3JjX0JwcDsKLSAgfQotfQotCi12b2lkIENvbXBvc2l0ZVJvd184YnBwUmdiMlJnYl9Ob0JsZW5kX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IqIHBQYWxldHRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IERlc3RCcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgRlhfQVJHQiBhcmdiID0gcFBhbGV0dGUgPyBwUGFsZXR0ZVsqc3JjX3NjYW5dIDogKCpzcmNfc2NhbikgKiAweDAxMDEwMTsKLSAgICBpbnQgc3JjX3IgPSBGWEFSR0JfUihhcmdiKTsKLSAgICBpbnQgc3JjX2cgPSBGWEFSR0JfRyhhcmdiKTsKLSAgICBpbnQgc3JjX2IgPSBGWEFSR0JfQihhcmdiKTsKLSAgICBpZiAoY2xpcF9zY2FuICYmIGNsaXBfc2Nhbltjb2xdIDwgMjU1KSB7Ci0gICAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIHNyY19iLCBjbGlwX3NjYW5bY29sXSk7Ci0gICAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIHNyY19nLCBjbGlwX3NjYW5bY29sXSk7Ci0gICAgICBkZXN0X3NjYW5bMF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIHNyY19yLCBjbGlwX3NjYW5bY29sXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19iOwotICAgICAgZGVzdF9zY2FuWzFdID0gc3JjX2c7Ci0gICAgICBkZXN0X3NjYW5bMF0gPSBzcmNfcjsKLSAgICB9Ci0gICAgZGVzdF9zY2FuICs9IERlc3RCcHA7Ci0gICAgc3JjX3NjYW4rKzsKLSAgfQotfQotCi12b2lkIENvbXBvc2l0ZVJvd18xYnBwUmdiMlJnYl9Ob0JsZW5kX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IqIHBQYWxldHRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IERlc3RCcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKLSAgaW50IHJlc2V0X3IsIHJlc2V0X2csIHJlc2V0X2I7Ci0gIGludCBzZXRfciwgc2V0X2csIHNldF9iOwotICBpZiAocFBhbGV0dGUpIHsKLSAgICByZXNldF9yID0gRlhBUkdCX1IocFBhbGV0dGVbMF0pOwotICAgIHJlc2V0X2cgPSBGWEFSR0JfRyhwUGFsZXR0ZVswXSk7Ci0gICAgcmVzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzBdKTsKLSAgICBzZXRfciA9IEZYQVJHQl9SKHBQYWxldHRlWzFdKTsKLSAgICBzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzFdKTsKLSAgICBzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzFdKTsKLSAgfSBlbHNlIHsKLSAgICByZXNldF9yID0gcmVzZXRfZyA9IHJlc2V0X2IgPSAwOwotICAgIHNldF9yID0gc2V0X2cgPSBzZXRfYiA9IDI1NTsKLSAgfQotICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBwaXhlbF9jb3VudDsgY29sKyspIHsKLSAgICBpbnQgc3JjX3IsIHNyY19nLCBzcmNfYjsKLSAgICBpZiAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKSB7Ci0gICAgICBzcmNfciA9IHNldF9yOwotICAgICAgc3JjX2cgPSBzZXRfZzsKLSAgICAgIHNyY19iID0gc2V0X2I7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNyY19yID0gcmVzZXRfcjsKLSAgICAgIHNyY19nID0gcmVzZXRfZzsKLSAgICAgIHNyY19iID0gcmVzZXRfYjsKLSAgICB9Ci0gICAgaWYgKGNsaXBfc2NhbiAmJiBjbGlwX3NjYW5bY29sXSA8IDI1NSkgewotICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBzcmNfYiwgY2xpcF9zY2FuW2NvbF0pOwotICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBzcmNfZywgY2xpcF9zY2FuW2NvbF0pOwotICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBzcmNfciwgY2xpcF9zY2FuW2NvbF0pOwotICAgIH0gZWxzZSB7Ci0gICAgICBkZXN0X3NjYW5bMl0gPSBzcmNfYjsKLSAgICAgIGRlc3Rfc2NhblsxXSA9IHNyY19nOwotICAgICAgZGVzdF9zY2FuWzBdID0gc3JjX3I7Ci0gICAgfQotICAgIGRlc3Rfc2NhbiArPSBEZXN0QnBwOwotICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRlUm93XzhicHBSZ2IyQXJnYl9Ob0JsZW5kX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IqIHBQYWxldHRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgewotICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICBpbnQgc3JjX3IsIHNyY19nLCBzcmNfYjsKLSAgICBpZiAocFBhbGV0dGUpIHsKLSAgICAgIEZYX0FSR0IgYXJnYiA9IHBQYWxldHRlWypzcmNfc2Nhbl07Ci0gICAgICBzcmNfciA9IEZYQVJHQl9SKGFyZ2IpOwotICAgICAgc3JjX2cgPSBGWEFSR0JfRyhhcmdiKTsKLSAgICAgIHNyY19iID0gRlhBUkdCX0IoYXJnYik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNyY19yID0gc3JjX2cgPSBzcmNfYiA9ICpzcmNfc2NhbjsKLSAgICB9Ci0gICAgaWYgKCFjbGlwX3NjYW4gfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7Ci0gICAgICBkZXN0X3NjYW5bMl0gPSBzcmNfYjsKLSAgICAgIGRlc3Rfc2NhblsxXSA9IHNyY19nOwotICAgICAgZGVzdF9zY2FuWzBdID0gc3JjX3I7Ci0gICAgICBkZXN0X3NjYW5bM10gPSAyNTU7Ci0gICAgICBzcmNfc2NhbisrOwotICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaW50IHNyY19hbHBoYSA9IGNsaXBfc2Nhbltjb2xdOwotICAgIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICBzcmNfc2NhbisrOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGludCBiYWNrX2FscGhhID0gZGVzdF9zY2FuWzNdOwotICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIHNyY19iLCBhbHBoYV9yYXRpbyk7Ci0gICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBzcmNfZywgYWxwaGFfcmF0aW8pOwotICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgc3JjX3IsIGFscGhhX3JhdGlvKTsKLSAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICBzcmNfc2NhbisrOwotICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRlUm93XzFicHBSZ2IyQXJnYl9Ob0JsZW5kX1JnYkJ5dGVPcmRlcih1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCKiBwUGFsZXR0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKLSAgaW50IHJlc2V0X3IsIHJlc2V0X2csIHJlc2V0X2I7Ci0gIGludCBzZXRfciwgc2V0X2csIHNldF9iOwotICBpZiAocFBhbGV0dGUpIHsKLSAgICByZXNldF9yID0gRlhBUkdCX1IocFBhbGV0dGVbMF0pOwotICAgIHJlc2V0X2cgPSBGWEFSR0JfRyhwUGFsZXR0ZVswXSk7Ci0gICAgcmVzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzBdKTsKLSAgICBzZXRfciA9IEZYQVJHQl9SKHBQYWxldHRlWzFdKTsKLSAgICBzZXRfZyA9IEZYQVJHQl9HKHBQYWxldHRlWzFdKTsKLSAgICBzZXRfYiA9IEZYQVJHQl9CKHBQYWxldHRlWzFdKTsKLSAgfSBlbHNlIHsKLSAgICByZXNldF9yID0gcmVzZXRfZyA9IHJlc2V0X2IgPSAwOwotICAgIHNldF9yID0gc2V0X2cgPSBzZXRfYiA9IDI1NTsKLSAgfQotICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICBpbnQgc3JjX3IsIHNyY19nLCBzcmNfYjsKLSAgICBpZiAoc3JjX3NjYW5bKGNvbCArIHNyY19sZWZ0KSAvIDhdICYgKDEgPDwgKDcgLSAoY29sICsgc3JjX2xlZnQpICUgOCkpKSB7Ci0gICAgICBzcmNfciA9IHNldF9yOwotICAgICAgc3JjX2cgPSBzZXRfZzsKLSAgICAgIHNyY19iID0gc2V0X2I7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNyY19yID0gcmVzZXRfcjsKLSAgICAgIHNyY19nID0gcmVzZXRfZzsKLSAgICAgIHNyY19iID0gcmVzZXRfYjsKLSAgICB9Ci0gICAgaWYgKCFjbGlwX3NjYW4gfHwgY2xpcF9zY2FuW2NvbF0gPT0gMjU1KSB7Ci0gICAgICBkZXN0X3NjYW5bMl0gPSBzcmNfYjsKLSAgICAgIGRlc3Rfc2NhblsxXSA9IHNyY19nOwotICAgICAgZGVzdF9zY2FuWzBdID0gc3JjX3I7Ci0gICAgICBkZXN0X3NjYW5bM10gPSAyNTU7Ci0gICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpbnQgc3JjX2FscGhhID0gY2xpcF9zY2FuW2NvbF07Ci0gICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpbnQgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBzcmNfYiwgYWxwaGFfcmF0aW8pOwotICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgc3JjX2csIGFscGhhX3JhdGlvKTsKLSAgICBkZXN0X3NjYW5bMF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIHNyY19yLCBhbHBoYV9yYXRpbyk7Ci0gICAgZGVzdF9zY2FuICs9IDQ7Ci0gIH0KLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfQnl0ZU1hc2syQXJnYl9SZ2JCeXRlT3JkZXIodWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19hbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7Ci0gIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgewotICAgIGludCBzcmNfYWxwaGE7Ci0gICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIGNsaXBfc2Nhbltjb2xdICogc3JjX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICB9IGVsc2UgewotICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYSAqIHNyY19zY2FuW2NvbF0gLyAyNTU7Ci0gICAgfQotICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9NQUtFKHNyY19hbHBoYSwgc3JjX3IsIHNyY19nLCBzcmNfYikpOwotICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICB1aW50OF90IGRlc3RfYWxwaGEgPSBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICBkZXN0X3NjYW5bM10gPSBkZXN0X2FscGhhOwotICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgaWYgKGJsZW5kX3R5cGUgPj0gRlhESUJfQkxFTkRfTk9OU0VQQVJBQkxFKSB7Ci0gICAgICBpbnQgYmxlbmRlZF9jb2xvcnNbM107Ci0gICAgICB1aW50OF90IHNjYW5bM10gPSB7c3RhdGljX2Nhc3Q8dWludDhfdD4oc3JjX2IpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyY19nKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihzcmNfcil9OwotICAgICAgdWludDhfdCBkZXN0X3NjYW5fb1szXSA9IHtkZXN0X3NjYW5bMl0sIGRlc3Rfc2NhblsxXSwgZGVzdF9zY2FuWzBdfTsKLSAgICAgIFJHQl9CbGVuZChibGVuZF90eXBlLCBzY2FuLCBkZXN0X3NjYW5fbywgYmxlbmRlZF9jb2xvcnMpOwotICAgICAgZGVzdF9zY2FuWzJdID0KLSAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIGJsZW5kZWRfY29sb3JzWzBdLCBhbHBoYV9yYXRpbyk7Ci0gICAgICBkZXN0X3NjYW5bMV0gPQotICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgYmxlbmRlZF9jb2xvcnNbMV0sIGFscGhhX3JhdGlvKTsKLSAgICAgIGRlc3Rfc2NhblswXSA9Ci0gICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBibGVuZGVkX2NvbG9yc1syXSwgYWxwaGFfcmF0aW8pOwotICAgIH0gZWxzZSBpZiAoYmxlbmRfdHlwZSkgewotICAgICAgaW50IGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCBkZXN0X3NjYW5bMl0sIHNyY19iKTsKLSAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfYiwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgIGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCBkZXN0X3NjYW5bMV0sIHNyY19nKTsKLSAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfZywgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgIGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCBkZXN0X3NjYW5bMF0sIHNyY19yKTsKLSAgICAgIGJsZW5kZWQgPSBGWERJQl9BTFBIQV9NRVJHRShzcmNfciwgYmxlbmRlZCwgYmFja19hbHBoYSk7Ci0gICAgICBkZXN0X3NjYW5bMF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIGJsZW5kZWQsIGFscGhhX3JhdGlvKTsKLSAgICB9IGVsc2UgewotICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBzcmNfYiwgYWxwaGFfcmF0aW8pOwotICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBzcmNfZywgYWxwaGFfcmF0aW8pOwotICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBzcmNfciwgYWxwaGFfcmF0aW8pOwotICAgIH0KLSAgICBkZXN0X3NjYW4gKz0gNDsKLSAgfQotfQotCi12b2lkIENvbXBvc2l0ZVJvd19CeXRlTWFzazJSZ2JfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4pIHsKLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgaW50IHNyY19hbHBoYTsKLSAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gKiBzcmNfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgIH0gZWxzZSB7Ci0gICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogc3JjX3NjYW5bY29sXSAvIDI1NTsKLSAgICB9Ci0gICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgewotICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgICAgdWludDhfdCBzY2FuWzNdID0ge3N0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyY19iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihzcmNfZyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oc3JjX3IpfTsKLSAgICAgIHVpbnQ4X3QgZGVzdF9zY2FuX29bM10gPSB7ZGVzdF9zY2FuWzJdLCBkZXN0X3NjYW5bMV0sIGRlc3Rfc2NhblswXX07Ci0gICAgICBSR0JfQmxlbmQoYmxlbmRfdHlwZSwgc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgIGRlc3Rfc2NhblsyXSA9Ci0gICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBibGVuZGVkX2NvbG9yc1swXSwgc3JjX2FscGhhKTsKLSAgICAgIGRlc3Rfc2NhblsxXSA9Ci0gICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBibGVuZGVkX2NvbG9yc1sxXSwgc3JjX2FscGhhKTsKLSAgICAgIGRlc3Rfc2NhblswXSA9Ci0gICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBibGVuZGVkX2NvbG9yc1syXSwgc3JjX2FscGhhKTsKLSAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgIGludCBibGVuZGVkID0gQmxlbmQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuWzJdLCBzcmNfYik7Ci0gICAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIGJsZW5kZWQsIHNyY19hbHBoYSk7Ci0gICAgICBibGVuZGVkID0gQmxlbmQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuWzFdLCBzcmNfZyk7Ci0gICAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIGJsZW5kZWQsIHNyY19hbHBoYSk7Ci0gICAgICBibGVuZGVkID0gQmxlbmQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuWzBdLCBzcmNfcik7Ci0gICAgICBkZXN0X3NjYW5bMF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMF0sIGJsZW5kZWQsIHNyY19hbHBoYSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgc3JjX2IsIHNyY19hbHBoYSk7Ci0gICAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIHNyY19nLCBzcmNfYWxwaGEpOwotICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBzcmNfciwgc3JjX2FscGhhKTsKLSAgICB9Ci0gICAgZGVzdF9zY2FuICs9IEJwcDsKLSAgfQotfQotCi12b2lkIENvbXBvc2l0ZVJvd19CaXRNYXNrMkFyZ2JfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbikgewotICBpZiAoYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9OT1JNQUwgJiYgIWNsaXBfc2NhbiAmJiBtYXNrX2FscGhhID09IDI1NSkgewotICAgIEZYX0FSR0IgYXJnYiA9IEZYQVJHQl9NQUtFKDB4ZmYsIHNyY19yLCBzcmNfZywgc3JjX2IpOwotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHBpeGVsX2NvdW50OyBjb2wrKykgewotICAgICAgaWYgKHNyY19zY2FuWyhzcmNfbGVmdCArIGNvbCkgLyA4XSAmICgxIDw8ICg3IC0gKHNyY19sZWZ0ICsgY29sKSAlIDgpKSkgewotICAgICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoZGVzdF9zY2FuLCBhcmdiKTsKLSAgICAgIH0KLSAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgaWYgKCEoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSkgewotICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaW50IHNyY19hbHBoYTsKLSAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICBzcmNfYWxwaGEgPSBtYXNrX2FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGE7Ci0gICAgfQotICAgIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3Rfc2NhblszXTsKLSAgICBpZiAoYmFja19hbHBoYSA9PSAwKSB7Ci0gICAgICBGWEFSR0JfU0VUUkdCT1JERVJESUIoZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9NQUtFKHNyY19hbHBoYSwgc3JjX3IsIHNyY19nLCBzcmNfYikpOwotICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgdWludDhfdCBkZXN0X2FscGhhID0gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgewotICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgICAgdWludDhfdCBzY2FuWzNdID0ge3N0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyY19iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihzcmNfZyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oc3JjX3IpfTsKLSAgICAgIHVpbnQ4X3QgZGVzdF9zY2FuX29bM10gPSB7ZGVzdF9zY2FuWzJdLCBkZXN0X3NjYW5bMV0sIGRlc3Rfc2NhblswXX07Ci0gICAgICBSR0JfQmxlbmQoYmxlbmRfdHlwZSwgc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgIGRlc3Rfc2NhblsyXSA9Ci0gICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBibGVuZGVkX2NvbG9yc1swXSwgYWxwaGFfcmF0aW8pOwotICAgICAgZGVzdF9zY2FuWzFdID0KLSAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMV0sIGJsZW5kZWRfY29sb3JzWzFdLCBhbHBoYV9yYXRpbyk7Ci0gICAgICBkZXN0X3NjYW5bMF0gPQotICAgICAgICAgIEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgYmxlbmRlZF9jb2xvcnNbMl0sIGFscGhhX3JhdGlvKTsKLSAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgIGludCBibGVuZGVkID0gQmxlbmQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuWzJdLCBzcmNfYik7Ci0gICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgZGVzdF9zY2FuWzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICBibGVuZGVkID0gQmxlbmQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuWzFdLCBzcmNfZyk7Ci0gICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX2csIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICBibGVuZGVkID0gQmxlbmQoYmxlbmRfdHlwZSwgZGVzdF9zY2FuWzBdLCBzcmNfcik7Ci0gICAgICBibGVuZGVkID0gRlhESUJfQUxQSEFfTUVSR0Uoc3JjX3IsIGJsZW5kZWQsIGJhY2tfYWxwaGEpOwotICAgICAgZGVzdF9zY2FuWzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBibGVuZGVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGRlc3Rfc2NhblsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsyXSwgc3JjX2IsIGFscGhhX3JhdGlvKTsKLSAgICAgIGRlc3Rfc2NhblsxXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblsxXSwgc3JjX2csIGFscGhhX3JhdGlvKTsKLSAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgc3JjX3IsIGFscGhhX3JhdGlvKTsKLSAgICB9Ci0gICAgZGVzdF9zY2FuICs9IDQ7Ci0gIH0KLX0KLQotdm9pZCBDb21wb3NpdGVSb3dfQml0TWFzazJSZ2JfUmdiQnl0ZU9yZGVyKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFza19hbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuKSB7Ci0gIGlmIChibGVuZF90eXBlID09IEZYRElCX0JMRU5EX05PUk1BTCAmJiAhY2xpcF9zY2FuICYmIG1hc2tfYWxwaGEgPT0gMjU1KSB7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgICBpZiAoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSB7Ci0gICAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19iOwotICAgICAgICBkZXN0X3NjYW5bMV0gPSBzcmNfZzsKLSAgICAgICAgZGVzdF9zY2FuWzBdID0gc3JjX3I7Ci0gICAgICB9Ci0gICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLSAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgcGl4ZWxfY291bnQ7IGNvbCsrKSB7Ci0gICAgaWYgKCEoc3JjX3NjYW5bKHNyY19sZWZ0ICsgY29sKSAvIDhdICYgKDEgPDwgKDcgLSAoc3JjX2xlZnQgKyBjb2wpICUgOCkpKSkgewotICAgICAgZGVzdF9zY2FuICs9IEJwcDsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpbnQgc3JjX2FscGhhOwotICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgIHNyY19hbHBoYSA9IG1hc2tfYWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICB9IGVsc2UgewotICAgICAgc3JjX2FscGhhID0gbWFza19hbHBoYTsKLSAgICB9Ci0gICAgaWYgKHNyY19hbHBoYSA9PSAwKSB7Ci0gICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChibGVuZF90eXBlID49IEZYRElCX0JMRU5EX05PTlNFUEFSQUJMRSkgewotICAgICAgaW50IGJsZW5kZWRfY29sb3JzWzNdOwotICAgICAgdWludDhfdCBzY2FuWzNdID0ge3N0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyY19iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90PihzcmNfZyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdD4oc3JjX3IpfTsKLSAgICAgIHVpbnQ4X3QgZGVzdF9zY2FuX29bM10gPSB7ZGVzdF9zY2FuWzJdLCBkZXN0X3NjYW5bMV0sIGRlc3Rfc2NhblswXX07Ci0gICAgICBSR0JfQmxlbmQoYmxlbmRfdHlwZSwgc2NhbiwgZGVzdF9zY2FuX28sIGJsZW5kZWRfY29sb3JzKTsKLSAgICAgIGRlc3Rfc2NhblsyXSA9Ci0gICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzJdLCBibGVuZGVkX2NvbG9yc1swXSwgc3JjX2FscGhhKTsKLSAgICAgIGRlc3Rfc2NhblsxXSA9Ci0gICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBibGVuZGVkX2NvbG9yc1sxXSwgc3JjX2FscGhhKTsKLSAgICAgIGRlc3Rfc2NhblswXSA9Ci0gICAgICAgICAgRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzBdLCBibGVuZGVkX2NvbG9yc1syXSwgc3JjX2FscGhhKTsKLSAgICB9IGVsc2UgaWYgKGJsZW5kX3R5cGUpIHsKLSAgICAgIGludCBiYWNrX2NvbG9yID0gZGVzdF9zY2FuWzJdOwotICAgICAgaW50IGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCBzcmNfYik7Ci0gICAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShiYWNrX2NvbG9yLCBibGVuZGVkLCBzcmNfYWxwaGEpOwotICAgICAgYmFja19jb2xvciA9IGRlc3Rfc2NhblsxXTsKLSAgICAgIGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCBzcmNfZyk7Ci0gICAgICBkZXN0X3NjYW5bMV0gPSBGWERJQl9BTFBIQV9NRVJHRShiYWNrX2NvbG9yLCBibGVuZGVkLCBzcmNfYWxwaGEpOwotICAgICAgYmFja19jb2xvciA9IGRlc3Rfc2NhblswXTsKLSAgICAgIGJsZW5kZWQgPSBCbGVuZChibGVuZF90eXBlLCBiYWNrX2NvbG9yLCBzcmNfcik7Ci0gICAgICBkZXN0X3NjYW5bMF0gPSBGWERJQl9BTFBIQV9NRVJHRShiYWNrX2NvbG9yLCBibGVuZGVkLCBzcmNfYWxwaGEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBkZXN0X3NjYW5bMl0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0X3NjYW5bMl0sIHNyY19iLCBzcmNfYWxwaGEpOwotICAgICAgZGVzdF9zY2FuWzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzFdLCBzcmNfZywgc3JjX2FscGhhKTsKLSAgICAgIGRlc3Rfc2NhblswXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3Rfc2NhblswXSwgc3JjX3IsIHNyY19hbHBoYSk7Ci0gICAgfQotICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gIH0KLX0KLQotYm9vbCBTY2FubGluZUNvbXBvc2l0b3JfSW5pdFNvdXJjZU1hc2soRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXNrX2NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBtYXNrX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBtYXNrX3JlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbWFza19ncmVlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgbWFza19ibHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBtYXNrX2JsYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKLSAgaWYgKGFscGhhX2ZsYWcgPj4gOCkgewotICAgIG1hc2tfYWxwaGEgPSBhbHBoYV9mbGFnICYgMHhmZjsKLSAgICBtYXNrX3JlZCA9IEZYU1lTX0dldENWYWx1ZShtYXNrX2NvbG9yKTsKLSAgICBtYXNrX2dyZWVuID0gRlhTWVNfR2V0TVZhbHVlKG1hc2tfY29sb3IpOwotICAgIG1hc2tfYmx1ZSA9IEZYU1lTX0dldFlWYWx1ZShtYXNrX2NvbG9yKTsKLSAgICBtYXNrX2JsYWNrID0gRlhTWVNfR2V0S1ZhbHVlKG1hc2tfY29sb3IpOwotICB9IGVsc2UgewotICAgIG1hc2tfYWxwaGEgPSBGWEFSR0JfQShtYXNrX2NvbG9yKTsKLSAgICBtYXNrX3JlZCA9IEZYQVJHQl9SKG1hc2tfY29sb3IpOwotICAgIG1hc2tfZ3JlZW4gPSBGWEFSR0JfRyhtYXNrX2NvbG9yKTsKLSAgICBtYXNrX2JsdWUgPSBGWEFSR0JfQihtYXNrX2NvbG9yKTsKLSAgfQotICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoKGRlc3RfZm9ybWF0ICYgMHhmZikgPT0gOCkgewotICAgIGlmIChwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICBtYXNrX2NvbG9yID0gKGFscGhhX2ZsYWcgPj4gOCkgPyBGWENNWUtfVE9ESUIobWFza19jb2xvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZYQVJHQl9UT0RJQihtYXNrX2NvbG9yKTsKLSAgICAgIHVpbnQ4X3QqIGdyYXlfcCA9ICh1aW50OF90KikmbWFza19jb2xvcjsKLSAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGdyYXlfcCwgZ3JheV9wLCAxKTsKLSAgICAgIG1hc2tfcmVkID0gZGVzdF9mb3JtYXQgJiAweDA0MDAgPyBGWF9DQ09MT1IoZ3JheV9wWzBdKSA6IGdyYXlfcFswXTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKGFscGhhX2ZsYWcgPj4gOCkgewotICAgICAgICB1aW50OF90IHIsIGcsIGI7Ci0gICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShtYXNrX3JlZCwgbWFza19ncmVlbiwgbWFza19ibHVlLCBtYXNrX2JsYWNrLCByLCBnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYik7Ci0gICAgICAgIG1hc2tfcmVkID0gRlhSR0IyR1JBWShyLCBnLCBiKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG1hc2tfcmVkID0gRlhSR0IyR1JBWShtYXNrX3JlZCwgbWFza19ncmVlbiwgbWFza19ibHVlKTsKLSAgICAgIH0KLSAgICAgIGlmIChkZXN0X2Zvcm1hdCAmIDB4MDQwMCkgewotICAgICAgICBtYXNrX3JlZCA9IEZYX0NDT0xPUihtYXNrX3JlZCk7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIHVpbnQ4X3QqIG1hc2tfY29sb3JfcCA9ICh1aW50OF90KikmbWFza19jb2xvcjsKLSAgICBtYXNrX2NvbG9yID0KLSAgICAgICAgKGFscGhhX2ZsYWcgPj4gOCkgPyBGWENNWUtfVE9ESUIobWFza19jb2xvcikgOiBGWEFSR0JfVE9ESUIobWFza19jb2xvcik7Ci0gICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIG1hc2tfY29sb3JfcCwgbWFza19jb2xvcl9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7Ci0gICAgICBtYXNrX3JlZCA9IG1hc2tfY29sb3JfcFsyXTsKLSAgICAgIG1hc2tfZ3JlZW4gPSBtYXNrX2NvbG9yX3BbMV07Ci0gICAgICBtYXNrX2JsdWUgPSBtYXNrX2NvbG9yX3BbMF07Ci0gICAgfSBlbHNlIGlmIChhbHBoYV9mbGFnID4+IDgpIHsKLSAgICAgIEFkb2JlQ01ZS190b19zUkdCMShtYXNrX2NvbG9yX3BbMF0sIG1hc2tfY29sb3JfcFsxXSwgbWFza19jb2xvcl9wWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfY29sb3JfcFszXSwgbWFza19jb2xvcl9wWzJdLCBtYXNrX2NvbG9yX3BbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWFza19jb2xvcl9wWzBdKTsKLSAgICAgIG1hc2tfcmVkID0gbWFza19jb2xvcl9wWzJdOwotICAgICAgbWFza19ncmVlbiA9IG1hc2tfY29sb3JfcFsxXTsKLSAgICAgIG1hc2tfYmx1ZSA9IG1hc2tfY29sb3JfcFswXTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU2NhbmxpbmVDb21wb3NpdG9yX0luaXRTb3VyY2VQYWxldHRlKEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqJiBwRGVzdFBhbGV0dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcFNyY1BhbGV0dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgewotICBib29sIGlzU3JjQ215ayA9ICEhKHNyY19mb3JtYXQgJiAweDA0MDApOwotICBib29sIGlzRHN0Q215ayA9ICEhKGRlc3RfZm9ybWF0ICYgMHgwNDAwKTsKLSAgcERlc3RQYWxldHRlID0gbnVsbHB0cjsKLSAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICBpZiAocFNyY1BhbGV0dGUpIHsKLSAgICAgIGlmICgoZGVzdF9mb3JtYXQgJiAweGZmKSA9PSA4KSB7Ci0gICAgICAgIGludCBwYWxfY291bnQgPSAxIDw8IChzcmNfZm9ybWF0ICYgMHhmZik7Ci0gICAgICAgIHVpbnQ4X3QqIGdyYXlfcGFsID0gRlhfQWxsb2ModWludDhfdCwgcGFsX2NvdW50KTsKLSAgICAgICAgcERlc3RQYWxldHRlID0gKHVpbnQzMl90KilncmF5X3BhbDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxfY291bnQ7IGkrKykgewotICAgICAgICAgIHVpbnQzMl90IGNvbG9yID0gaXNTcmNDbXlrID8gRlhDTVlLX1RPRElCKHBTcmNQYWxldHRlW2ldKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhBUkdCX1RPRElCKHBTcmNQYWxldHRlW2ldKTsKLSAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBncmF5X3BhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopJmNvbG9yLCAxKTsKLSAgICAgICAgICBncmF5X3BhbCsrOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbnQgcGFsc2l6ZSA9IDEgPDwgKHNyY19mb3JtYXQgJiAweGZmKTsKLSAgICAgICAgcERlc3RQYWxldHRlID0gRlhfQWxsb2ModWludDMyX3QsIHBhbHNpemUpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhbHNpemU7IGkrKykgewotICAgICAgICAgIHVpbnQzMl90IGNvbG9yID0gaXNTcmNDbXlrID8gRlhDTVlLX1RPRElCKHBTcmNQYWxldHRlW2ldKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhBUkdCX1RPRElCKHBTcmNQYWxldHRlW2ldKTsKLSAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAodWludDhfdCopJmNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KikmY29sb3IsIDEpOwotICAgICAgICAgIHBEZXN0UGFsZXR0ZVtpXSA9Ci0gICAgICAgICAgICAgIGlzRHN0Q215ayA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGludCBwYWxfY291bnQgPSAxIDw8IChzcmNfZm9ybWF0ICYgMHhmZik7Ci0gICAgICB1aW50OF90KiBncmF5X3BhbCA9IEZYX0FsbG9jKHVpbnQ4X3QsIHBhbF9jb3VudCk7Ci0gICAgICBpZiAocGFsX2NvdW50ID09IDIpIHsKLSAgICAgICAgZ3JheV9wYWxbMF0gPSAwOwotICAgICAgICBncmF5X3BhbFsxXSA9IDI1NTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsX2NvdW50OyBpKyspIHsKLSAgICAgICAgICBncmF5X3BhbFtpXSA9IGk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICgoZGVzdF9mb3JtYXQgJiAweGZmKSA9PSA4KSB7Ci0gICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sIGdyYXlfcGFsLCBncmF5X3BhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFsX2NvdW50KTsKLSAgICAgICAgcERlc3RQYWxldHRlID0gKHVpbnQzMl90KilncmF5X3BhbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBEZXN0UGFsZXR0ZSA9IEZYX0FsbG9jKHVpbnQzMl90LCBwYWxfY291bnQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhbF9jb3VudDsgaSsrKSB7Ci0gICAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUoCi0gICAgICAgICAgICAgIHBJY2NUcmFuc2Zvcm0sICh1aW50OF90KikmcERlc3RQYWxldHRlW2ldLCAmZ3JheV9wYWxbaV0sIDEpOwotICAgICAgICAgIHBEZXN0UGFsZXR0ZVtpXSA9IGlzRHN0Q215ayA/IEZYQ01ZS19UT0RJQihwRGVzdFBhbGV0dGVbaV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhBUkdCX1RPRElCKHBEZXN0UGFsZXR0ZVtpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRnJlZShncmF5X3BhbCk7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChwU3JjUGFsZXR0ZSkgewotICAgICAgaWYgKChkZXN0X2Zvcm1hdCAmIDB4ZmYpID09IDgpIHsKLSAgICAgICAgaW50IHBhbF9jb3VudCA9IDEgPDwgKHNyY19mb3JtYXQgJiAweGZmKTsKLSAgICAgICAgdWludDhfdCogZ3JheV9wYWwgPSBGWF9BbGxvYyh1aW50OF90LCBwYWxfY291bnQpOwotICAgICAgICBwRGVzdFBhbGV0dGUgPSAodWludDMyX3QqKWdyYXlfcGFsOwotICAgICAgICBpZiAoaXNTcmNDbXlrKSB7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxfY291bnQ7IGkrKykgewotICAgICAgICAgICAgRlhfQ01ZSyBjbXlrID0gcFNyY1BhbGV0dGVbaV07Ci0gICAgICAgICAgICB1aW50OF90IHIsIGcsIGI7Ci0gICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNteWspLCBGWFNZU19HZXRNVmFsdWUoY215ayksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKGNteWspLCBGWFNZU19HZXRLVmFsdWUoY215ayksIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZywgYik7Ci0gICAgICAgICAgICAqZ3JheV9wYWwrKyA9IEZYUkdCMkdSQVkociwgZywgYik7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsX2NvdW50OyBpKyspIHsKLSAgICAgICAgICAgIEZYX0FSR0IgYXJnYiA9IHBTcmNQYWxldHRlW2ldOwotICAgICAgICAgICAgKmdyYXlfcGFsKysgPQotICAgICAgICAgICAgICAgIEZYUkdCMkdSQVkoRlhBUkdCX1IoYXJnYiksIEZYQVJHQl9HKGFyZ2IpLCBGWEFSR0JfQihhcmdiKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbnQgcGFsc2l6ZSA9IDEgPDwgKHNyY19mb3JtYXQgJiAweGZmKTsKLSAgICAgICAgcERlc3RQYWxldHRlID0gRlhfQWxsb2ModWludDMyX3QsIHBhbHNpemUpOwotICAgICAgICBpZiAoaXNEc3RDbXlrID09IGlzU3JjQ215aykgewotICAgICAgICAgIEZYU1lTX21lbWNweShwRGVzdFBhbGV0dGUsIHBTcmNQYWxldHRlLCBwYWxzaXplICogc2l6ZW9mKHVpbnQzMl90KSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWxzaXplOyBpKyspIHsKLSAgICAgICAgICAgIEZYX0NNWUsgY215ayA9IHBTcmNQYWxldHRlW2ldOwotICAgICAgICAgICAgdWludDhfdCByLCBnLCBiOwotICAgICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjbXlrKSwgRlhTWVNfR2V0TVZhbHVlKGNteWspLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldFlWYWx1ZShjbXlrKSwgRlhTWVNfR2V0S1ZhbHVlKGNteWspLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcsIGIpOwotICAgICAgICAgICAgcERlc3RQYWxldHRlW2ldID0gRlhBUkdCX01BS0UoMHhmZiwgciwgZywgYik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICgoZGVzdF9mb3JtYXQgJiAweGZmKSA9PSA4KSB7Ci0gICAgICAgIGludCBwYWxfY291bnQgPSAxIDw8IChzcmNfZm9ybWF0ICYgMHhmZik7Ci0gICAgICAgIHVpbnQ4X3QqIGdyYXlfcGFsID0gRlhfQWxsb2ModWludDhfdCwgcGFsX2NvdW50KTsKLSAgICAgICAgaWYgKHBhbF9jb3VudCA9PSAyKSB7Ci0gICAgICAgICAgZ3JheV9wYWxbMF0gPSAwOwotICAgICAgICAgIGdyYXlfcGFsWzFdID0gMjU1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsX2NvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGdyYXlfcGFsW2ldID0gaTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcERlc3RQYWxldHRlID0gKHVpbnQzMl90KilncmF5X3BhbDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBwYWxzaXplID0gMSA8PCAoc3JjX2Zvcm1hdCAmIDB4ZmYpOwotICAgICAgICBwRGVzdFBhbGV0dGUgPSBGWF9BbGxvYyh1aW50MzJfdCwgcGFsc2l6ZSk7Ci0gICAgICAgIGlmIChwYWxzaXplID09IDIpIHsKLSAgICAgICAgICBwRGVzdFBhbGV0dGVbMF0gPSBpc1NyY0NteWsgPyAyNTUgOiAweGZmMDAwMDAwOwotICAgICAgICAgIHBEZXN0UGFsZXR0ZVsxXSA9IGlzU3JjQ215ayA/IDAgOiAweGZmZmZmZmZmOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBwRGVzdFBhbGV0dGVbaV0gPSBpc1NyY0NteWsgPyBGWF9DQ09MT1IoaSkgOiAoaSAqIDB4MTAxMDEpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaXNTcmNDbXlrICE9IGlzRHN0Q215aykgewotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFsc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBGWF9DTVlLIGNteWsgPSBwRGVzdFBhbGV0dGVbaV07Ci0gICAgICAgICAgICB1aW50OF90IHIsIGcsIGI7Ci0gICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNteWspLCBGWFNZU19HZXRNVmFsdWUoY215ayksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKGNteWspLCBGWFNZU19HZXRLVmFsdWUoY215ayksIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZywgYik7Ci0gICAgICAgICAgICBwRGVzdFBhbGV0dGVbaV0gPSBGWEFSR0JfTUFLRSgweGZmLCByLCBnLCBiKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLUNGWF9TY2FubGluZUNvbXBvc2l0b3I6OkNGWF9TY2FubGluZUNvbXBvc2l0b3IoKSB7Ci0gIG1fcFNyY1BhbGV0dGUgPSBudWxscHRyOwotICBtX3BDYWNoZVNjYW5saW5lID0gbnVsbHB0cjsKLSAgbV9DYWNoZVNpemUgPSAwOwotICBtX2JSZ2JCeXRlT3JkZXIgPSBmYWxzZTsKLSAgbV9CbGVuZFR5cGUgPSBGWERJQl9CTEVORF9OT1JNQUw7Ci0gIG1fcEljY1RyYW5zZm9ybSA9IG51bGxwdHI7Ci19Ci0KLUNGWF9TY2FubGluZUNvbXBvc2l0b3I6On5DRlhfU2NhbmxpbmVDb21wb3NpdG9yKCkgewotICBGWF9GcmVlKG1fcFNyY1BhbGV0dGUpOwotICBGWF9GcmVlKG1fcENhY2hlU2NhbmxpbmUpOwotfQotCi1ib29sIENGWF9TY2FubGluZUNvbXBvc2l0b3I6OkluaXQoRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBTcmNQYWxldHRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hc2tfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ2xpcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZ2JCeXRlT3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgewotICBtX1NyY0Zvcm1hdCA9IHNyY19mb3JtYXQ7Ci0gIG1fRGVzdEZvcm1hdCA9IGRlc3RfZm9ybWF0OwotICBtX0JsZW5kVHlwZSA9IGJsZW5kX3R5cGU7Ci0gIG1fYlJnYkJ5dGVPcmRlciA9IGJSZ2JCeXRlT3JkZXI7Ci0gIENDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPSBudWxscHRyOwotICBpZiAoQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKSkgewotICAgIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgfQotICBpZiAoIXBJY2NNb2R1bGUpIHsKLSAgICBwSWNjVHJhbnNmb3JtID0gbnVsbHB0cjsKLSAgfQotICBtX3BJY2NUcmFuc2Zvcm0gPSBwSWNjVHJhbnNmb3JtOwotICBpZiAoKGRlc3RfZm9ybWF0ICYgMHhmZikgPT0gMSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAobV9TcmNGb3JtYXQgPT0gRlhESUJfMWJwcE1hc2sgfHwgbV9TcmNGb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKLSAgICByZXR1cm4gU2NhbmxpbmVDb21wb3NpdG9yX0luaXRTb3VyY2VNYXNrKAotICAgICAgICBkZXN0X2Zvcm1hdCwgYWxwaGFfZmxhZywgbWFza19jb2xvciwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwKLSAgICAgICAgbV9NYXNrR3JlZW4sIG1fTWFza0JsdWUsIG1fTWFza0JsYWNrLCBwSWNjTW9kdWxlLCBwSWNjVHJhbnNmb3JtKTsKLSAgfQotICBpZiAoIXBJY2NUcmFuc2Zvcm0gJiYgKH5zcmNfZm9ybWF0ICYgMHgwNDAwKSAmJiAoZGVzdF9mb3JtYXQgJiAweDA0MDApKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICgobV9TcmNGb3JtYXQgJiAweGZmKSA8PSA4KSB7Ci0gICAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCXzhicHBNYXNrKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgU2NhbmxpbmVDb21wb3NpdG9yX0luaXRTb3VyY2VQYWxldHRlKHNyY19mb3JtYXQsIGRlc3RfZm9ybWF0LCBtX3BTcmNQYWxldHRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUGFsZXR0ZSwgcEljY01vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSk7Ci0gICAgbV9UcmFuc3BhcmVuY3kgPQotICAgICAgICAoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYiA/IDEgOiAwKSArIChkZXN0X2Zvcm1hdCAmIDB4MDIwMCA/IDIgOiAwKSArCi0gICAgICAgIChkZXN0X2Zvcm1hdCAmIDB4MDQwMCA/IDQgOiAwKSArICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDEgPyA4IDogMCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgbV9UcmFuc3BhcmVuY3kgPSAoc3JjX2Zvcm1hdCAmIDB4MDIwMCA/IDAgOiAxKSArCi0gICAgICAgICAgICAgICAgICAgKGRlc3RfZm9ybWF0ICYgMHgwMjAwID8gMCA6IDIpICsKLSAgICAgICAgICAgICAgICAgICAoYmxlbmRfdHlwZSA9PSBGWERJQl9CTEVORF9OT1JNQUwgPyA0IDogMCkgKwotICAgICAgICAgICAgICAgICAgIChiQ2xpcCA/IDggOiAwKSArIChzcmNfZm9ybWF0ICYgMHgwNDAwID8gMTYgOiAwKSArCi0gICAgICAgICAgICAgICAgICAgKGRlc3RfZm9ybWF0ICYgMHgwNDAwID8gMzIgOiAwKSArIChwSWNjVHJhbnNmb3JtID8gNjQgOiAwKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcjo6Q29tcG9zaXRlUmdiQml0bWFwTGluZSgKLSAgICB1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgaW50IHdpZHRoLAotICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICBjb25zdCB1aW50OF90KiBzcmNfZXh0cmFfYWxwaGEsCi0gICAgdWludDhfdCogZHN0X2V4dHJhX2FscGhhKSB7Ci0gIGludCBzcmNfQnBwID0gKG1fU3JjRm9ybWF0ICYgMHhmZikgPj4gMzsKLSAgaW50IGRlc3RfQnBwID0gKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID4+IDM7Ci0gIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKLSAgICBzd2l0Y2ggKG1fVHJhbnNwYXJlbmN5KSB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICBjYXNlIDQ6Ci0gICAgICBjYXNlIDg6Ci0gICAgICBjYXNlIDEyOgotICAgICAgICBDb21wb3NpdGVSb3dfQXJnYjJBcmdiX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbGVuZFR5cGUsIGNsaXBfc2Nhbik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxOgotICAgICAgICBDb21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfTm9DbGlwX1JnYkJ5dGVPcmRlcigKLSAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgc3JjX0JwcCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgY2FzZSAxMDoKLSAgICAgICAgQ29tcG9zaXRlUm93X0FyZ2IyUmdiX0JsZW5kX1JnYkJ5dGVPcmRlcigKLSAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgZGVzdF9CcHAsIGNsaXBfc2Nhbik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAzOgotICAgICAgICBDb21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKAotICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLCBkZXN0X0JwcCwgc3JjX0JwcCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA1OgotICAgICAgICBDb21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIHNyY19CcHApOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNjoKLSAgICAgIGNhc2UgMTQ6Ci0gICAgICAgIENvbXBvc2l0ZVJvd19BcmdiMlJnYl9Ob0JsZW5kX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfQnBwLCBjbGlwX3NjYW4pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNzoKLSAgICAgICAgQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9Ob0NsaXBfUmdiQnl0ZU9yZGVyKAotICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLCBzcmNfQnBwKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDk6Ci0gICAgICAgIENvbXBvc2l0ZVJvd19SZ2IyQXJnYl9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcigKLSAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgc3JjX0JwcCwgY2xpcF9zY2FuKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDExOgotICAgICAgICBDb21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcihkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbGVuZFR5cGUsIGRlc3RfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfQnBwLCBjbGlwX3NjYW4pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTM6Ci0gICAgICAgIENvbXBvc2l0ZVJvd19SZ2IyQXJnYl9Ob0JsZW5kX0NsaXBfUmdiQnl0ZU9yZGVyKAotICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIHNyY19CcHAsIGNsaXBfc2Nhbik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxNToKLSAgICAgICAgQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9DbGlwX1JnYkJ5dGVPcmRlcigKLSAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBkZXN0X0JwcCwgc3JjX0JwcCwgY2xpcF9zY2FuKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCXzhicHBNYXNrKSB7Ci0gICAgaWYgKG1fU3JjRm9ybWF0ICYgMHgwMjAwKSB7Ci0gICAgICBpZiAobV9TcmNGb3JtYXQgPT0gRlhESUJfQXJnYikgewotICAgICAgICBDb21wb3NpdGVSb3dfQXJnYjJNYXNrKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBjbGlwX3NjYW4pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQ29tcG9zaXRlUm93X1JnYmEyTWFzayhkZXN0X3NjYW4sIHNyY19leHRyYV9hbHBoYSwgd2lkdGgsIGNsaXBfc2Nhbik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIENvbXBvc2l0ZVJvd19SZ2IyTWFzayhkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgY2xpcF9zY2FuKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID09IDgpIHsKLSAgICBpZiAobV9EZXN0Rm9ybWF0ICYgMHgwNDAwKSB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IH4qZGVzdF9zY2FuOwotICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fU3JjRm9ybWF0ICYgMHgwMjAwKSB7Ci0gICAgICBpZiAobV9EZXN0Rm9ybWF0ICYgMHgwMjAwKSB7Ci0gICAgICAgIENvbXBvc2l0ZVJvd19BcmdiMkdyYXlhKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBzcmNfZXh0cmFfYWxwaGEsIGRzdF9leHRyYV9hbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wSWNjVHJhbnNmb3JtKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIENvbXBvc2l0ZVJvd19BcmdiMkdyYXkoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIG1fQmxlbmRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2Nhbiwgc3JjX2V4dHJhX2FscGhhLCBtX3BJY2NUcmFuc2Zvcm0pOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAobV9EZXN0Rm9ybWF0ICYgMHgwMjAwKSB7Ci0gICAgICAgIENvbXBvc2l0ZVJvd19SZ2IyR3JheWEoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX0JwcCwgd2lkdGgsIG1fQmxlbmRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2NhbiwgZHN0X2V4dHJhX2FscGhhLCBtX3BJY2NUcmFuc2Zvcm0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQ29tcG9zaXRlUm93X1JnYjJHcmF5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19CcHAsIHdpZHRoLCBtX0JsZW5kVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2NhbiwgbV9wSWNjVHJhbnNmb3JtKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fRGVzdEZvcm1hdCAmIDB4MDQwMCkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7Ci0gICAgICAgICpkZXN0X3NjYW4gPSB+KmRlc3Rfc2NhbjsKLSAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIGludCBkZXN0X1NpemUgPSB3aWR0aCAqIGRlc3RfQnBwICsgNDsKLSAgICBpZiAoZGVzdF9TaXplID4gbV9DYWNoZVNpemUpIHsKLSAgICAgIG1fcENhY2hlU2NhbmxpbmUgPSBGWF9SZWFsbG9jKHVpbnQ4X3QsIG1fcENhY2hlU2NhbmxpbmUsIGRlc3RfU2l6ZSk7Ci0gICAgICBpZiAoIW1fcENhY2hlU2NhbmxpbmUpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgbV9DYWNoZVNpemUgPSBkZXN0X1NpemU7Ci0gICAgfQotICAgIHN3aXRjaCAobV9UcmFuc3BhcmVuY3kpIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgIGNhc2UgNDoKLSAgICAgIGNhc2UgODoKLSAgICAgIGNhc2UgNCArIDg6IHsKLSAgICAgICAgQ29tcG9zaXRlUm93X0FyZ2IyQXJnYihkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBkc3RfZXh0cmFfYWxwaGEsIHNyY19leHRyYV9hbHBoYSk7Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSA2NDoKLSAgICAgIGNhc2UgNCArIDY0OgotICAgICAgY2FzZSA4ICsgNjQ6Ci0gICAgICBjYXNlIDQgKyA4ICsgNjQ6IHsKLSAgICAgICAgQ29tcG9zaXRlUm93X0FyZ2IyQXJnYl9UcmFuc2Zvcm0oCi0gICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIGNsaXBfc2NhbiwgZHN0X2V4dHJhX2FscGhhLAotICAgICAgICAgICAgc3JjX2V4dHJhX2FscGhhLCBtX3BDYWNoZVNjYW5saW5lLCBtX3BJY2NUcmFuc2Zvcm0pOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX05vQ2xpcCgKLSAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgc3JjX0JwcCwgZHN0X2V4dHJhX2FscGhhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEgKyA2NDoKLSAgICAgICAgQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX05vQ2xpcF9UcmFuc2Zvcm0oCi0gICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIHNyY19CcHAsIGRzdF9leHRyYV9hbHBoYSwKLSAgICAgICAgICAgIG1fcENhY2hlU2NhbmxpbmUsIG1fcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxICsgODoKLSAgICAgICAgQ29tcG9zaXRlUm93X1JnYjJBcmdiX0JsZW5kX0NsaXAoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxlbmRUeXBlLCBzcmNfQnBwLCBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9leHRyYV9hbHBoYSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxICsgOCArIDY0OgotICAgICAgICBDb21wb3NpdGVSb3dfUmdiMkFyZ2JfQmxlbmRfQ2xpcF9UcmFuc2Zvcm0oCi0gICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIHNyY19CcHAsIGNsaXBfc2NhbiwKLSAgICAgICAgICAgIGRzdF9leHRyYV9hbHBoYSwgbV9wQ2FjaGVTY2FubGluZSwgbV9wSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEgKyA0OgotICAgICAgICBDb21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9Ob0NsaXAoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfQnBwLCBkc3RfZXh0cmFfYWxwaGEpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMSArIDQgKyA2NDoKLSAgICAgICAgQ29tcG9zaXRlUm93X1JnYjJBcmdiX05vQmxlbmRfTm9DbGlwX1RyYW5zZm9ybSgKLSAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBzcmNfQnBwLCBkc3RfZXh0cmFfYWxwaGEsCi0gICAgICAgICAgICBtX3BDYWNoZVNjYW5saW5lLCBtX3BJY2NUcmFuc2Zvcm0pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMSArIDQgKyA4OgotICAgICAgICBDb21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9DbGlwKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBzcmNfQnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2NhbiwgZHN0X2V4dHJhX2FscGhhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEgKyA0ICsgOCArIDY0OgotICAgICAgICBDb21wb3NpdGVSb3dfUmdiMkFyZ2JfTm9CbGVuZF9DbGlwX1RyYW5zZm9ybSgKLSAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBzcmNfQnBwLCBjbGlwX3NjYW4sIGRzdF9leHRyYV9hbHBoYSwKLSAgICAgICAgICAgIG1fcENhY2hlU2NhbmxpbmUsIG1fcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgY2FzZSAyICsgODoKLSAgICAgICAgQ29tcG9zaXRlUm93X0FyZ2IyUmdiX0JsZW5kKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfQnBwLCBjbGlwX3NjYW4sIHNyY19leHRyYV9hbHBoYSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyICsgNjQ6Ci0gICAgICBjYXNlIDIgKyA4ICsgNjQ6Ci0gICAgICAgIENvbXBvc2l0ZVJvd19BcmdiMlJnYl9CbGVuZF9UcmFuc2Zvcm0oCi0gICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgbV9CbGVuZFR5cGUsIGRlc3RfQnBwLCBjbGlwX3NjYW4sCi0gICAgICAgICAgICBzcmNfZXh0cmFfYWxwaGEsIG1fcENhY2hlU2NhbmxpbmUsIG1fcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyICsgNDoKLSAgICAgIGNhc2UgMiArIDQgKyA4OgotICAgICAgICBDb21wb3NpdGVSb3dfQXJnYjJSZ2JfTm9CbGVuZChkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgZGVzdF9CcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2Nhbiwgc3JjX2V4dHJhX2FscGhhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDIgKyA0ICsgNjQ6Ci0gICAgICBjYXNlIDIgKyA0ICsgOCArIDY0OgotICAgICAgICBDb21wb3NpdGVSb3dfQXJnYjJSZ2JfTm9CbGVuZF9UcmFuc2Zvcm0oCi0gICAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgZGVzdF9CcHAsIGNsaXBfc2Nhbiwgc3JjX2V4dHJhX2FscGhhLAotICAgICAgICAgICAgbV9wQ2FjaGVTY2FubGluZSwgbV9wSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEgKyAyOgotICAgICAgICBDb21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9Ob0NsaXAoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0JsZW5kVHlwZSwgZGVzdF9CcHAsIHNyY19CcHApOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMSArIDIgKyA2NDoKLSAgICAgICAgQ29tcG9zaXRlUm93X1JnYjJSZ2JfQmxlbmRfTm9DbGlwX1RyYW5zZm9ybSgKLSAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgZGVzdF9CcHAsIHNyY19CcHAsCi0gICAgICAgICAgICBtX3BDYWNoZVNjYW5saW5lLCBtX3BJY2NUcmFuc2Zvcm0pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMSArIDIgKyA4OgotICAgICAgICBDb21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9DbGlwKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X0JwcCwgc3JjX0JwcCwgY2xpcF9zY2FuKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEgKyAyICsgOCArIDY0OgotICAgICAgICBDb21wb3NpdGVSb3dfUmdiMlJnYl9CbGVuZF9DbGlwX1RyYW5zZm9ybSgKLSAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX0JsZW5kVHlwZSwgZGVzdF9CcHAsIHNyY19CcHAsCi0gICAgICAgICAgICBjbGlwX3NjYW4sIG1fcENhY2hlU2NhbmxpbmUsIG1fcEljY1RyYW5zZm9ybSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxICsgMiArIDQ6Ci0gICAgICAgIENvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfTm9DbGlwKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X0JwcCwgc3JjX0JwcCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxICsgMiArIDQgKyA2NDoKLSAgICAgICAgQ29tcG9zaXRlUm93X1JnYjJSZ2JfTm9CbGVuZF9Ob0NsaXBfVHJhbnNmb3JtKAotICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLCBzcmNfQnBwLCBtX3BDYWNoZVNjYW5saW5lLAotICAgICAgICAgICAgbV9wSWNjVHJhbnNmb3JtKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEgKyAyICsgNCArIDg6Ci0gICAgICAgIENvbXBvc2l0ZVJvd19SZ2IyUmdiX05vQmxlbmRfQ2xpcChkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCwgZGVzdF9CcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfQnBwLCBjbGlwX3NjYW4pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMSArIDIgKyA0ICsgOCArIDY0OgotICAgICAgICBDb21wb3NpdGVSb3dfUmdiMlJnYl9Ob0JsZW5kX0NsaXBfVHJhbnNmb3JtKAotICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGRlc3RfQnBwLCBzcmNfQnBwLCBjbGlwX3NjYW4sCi0gICAgICAgICAgICBtX3BDYWNoZVNjYW5saW5lLCBtX3BJY2NUcmFuc2Zvcm0pOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDRlhfU2NhbmxpbmVDb21wb3NpdG9yOjpDb21wb3NpdGVQYWxCaXRtYXBMaW5lKAotICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICBpbnQgc3JjX2xlZnQsCi0gICAgaW50IHdpZHRoLAotICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICBjb25zdCB1aW50OF90KiBzcmNfZXh0cmFfYWxwaGEsCi0gICAgdWludDhfdCogZHN0X2V4dHJhX2FscGhhKSB7Ci0gIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKLSAgICBpZiAobV9TcmNGb3JtYXQgPT0gRlhESUJfMWJwcFJnYikgewotICAgICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl84YnBwUmdiKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfQXJnYikgewotICAgICAgICBDb21wb3NpdGVSb3dfMWJwcFJnYjJBcmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKAotICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsIHdpZHRoLCBtX3BTcmNQYWxldHRlLCBjbGlwX3NjYW4pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQ29tcG9zaXRlUm93XzFicHBSZ2IyUmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKAotICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsIG1fcFNyY1BhbGV0dGUsIHdpZHRoLAotICAgICAgICAgICAgKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID4+IDMsIGNsaXBfc2Nhbik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfOGJwcFJnYikgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgQ29tcG9zaXRlUm93XzhicHBSZ2IyQXJnYl9Ob0JsZW5kX1JnYkJ5dGVPcmRlcigKLSAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBtX3BTcmNQYWxldHRlLCBjbGlwX3NjYW4pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQ29tcG9zaXRlUm93XzhicHBSZ2IyUmdiX05vQmxlbmRfUmdiQnl0ZU9yZGVyKAotICAgICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9wU3JjUGFsZXR0ZSwgd2lkdGgsCi0gICAgICAgICAgICAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMywgY2xpcF9zY2FuKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKLSAgICBDb21wb3NpdGVSb3dfUmdiMk1hc2soZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsIGNsaXBfc2Nhbik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmICgobV9EZXN0Rm9ybWF0ICYgMHhmZikgPT0gOCkgewotICAgIGlmIChtX1RyYW5zcGFyZW5jeSAmIDgpIHsKLSAgICAgIGlmIChtX0Rlc3RGb3JtYXQgJiAweDAyMDApIHsKLSAgICAgICAgQ29tcG9zaXRlUm93XzFicHBQYWwyR3JheWEoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KiltX3BTcmNQYWxldHRlLCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbGVuZFR5cGUsIGNsaXBfc2NhbiwgZHN0X2V4dHJhX2FscGhhKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIENvbXBvc2l0ZVJvd18xYnBwUGFsMkdyYXkoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKW1fcFNyY1BhbGV0dGUsIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4pOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAobV9EZXN0Rm9ybWF0ICYgMHgwMjAwKQotICAgICAgICBDb21wb3NpdGVSb3dfOGJwcFBhbDJHcmF5YSgKLSAgICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIChjb25zdCB1aW50OF90KiltX3BTcmNQYWxldHRlLCB3aWR0aCwKLSAgICAgICAgICAgIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4sIGRzdF9leHRyYV9hbHBoYSwgc3JjX2V4dHJhX2FscGhhKTsKLSAgICAgIGVsc2UKLSAgICAgICAgQ29tcG9zaXRlUm93XzhicHBQYWwyR3JheShkZXN0X3NjYW4sIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KiltX3BTcmNQYWxldHRlLCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuLCBzcmNfZXh0cmFfYWxwaGEpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBzd2l0Y2ggKG1fVHJhbnNwYXJlbmN5KSB7Ci0gICAgICBjYXNlIDEgKyAyOgotICAgICAgICBDb21wb3NpdGVSb3dfOGJwcFJnYjJBcmdiX05vQmxlbmQoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTcmNQYWxldHRlLCBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZXh0cmFfYWxwaGEpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMSArIDIgKyA4OgotICAgICAgICBDb21wb3NpdGVSb3dfMWJwcFJnYjJBcmdiX05vQmxlbmQoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wU3JjUGFsZXR0ZSwgY2xpcF9zY2FuKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgIENvbXBvc2l0ZVJvd184YnBwUmdiMlJnYl9Ob0JsZW5kKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fcFNyY1BhbGV0dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBzcmNfZXh0cmFfYWxwaGEpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMCArIDg6Ci0gICAgICAgIENvbXBvc2l0ZVJvd18xYnBwUmdiMlJnYl9Ob0JsZW5kKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTcmNQYWxldHRlLCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID4+IDMsIGNsaXBfc2Nhbik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAwICsgMjoKLSAgICAgICAgQ29tcG9zaXRlUm93XzhicHBSZ2IyUmdiX05vQmxlbmQoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9wU3JjUGFsZXR0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIChtX0Rlc3RGb3JtYXQgJiAweGZmKSA+PiAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4sIHNyY19leHRyYV9hbHBoYSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAwICsgMiArIDg6Ci0gICAgICAgIENvbXBvc2l0ZVJvd18xYnBwUmdiMlJnYmFfTm9CbGVuZChkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfbGVmdCwgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BTcmNQYWxldHRlLCBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZXh0cmFfYWxwaGEpOwotICAgICAgICBicmVhazsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcjo6Q29tcG9zaXRlQnl0ZU1hc2tMaW5lKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0X2V4dHJhX2FscGhhKSB7Ci0gIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKLSAgICBDb21wb3NpdGVSb3dfQnl0ZU1hc2syTWFzayhkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuKTsKLSAgfSBlbHNlIGlmICgobV9EZXN0Rm9ybWF0ICYgMHhmZikgPT0gOCkgewotICAgIGlmIChtX0Rlc3RGb3JtYXQgJiAweDAyMDApIHsKLSAgICAgIENvbXBvc2l0ZVJvd19CeXRlTWFzazJHcmF5YShkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBjbGlwX3NjYW4sIGRzdF9leHRyYV9hbHBoYSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIENvbXBvc2l0ZVJvd19CeXRlTWFzazJHcmF5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgY2xpcF9zY2FuKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7Ci0gICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9BcmdiKSB7Ci0gICAgICBDb21wb3NpdGVSb3dfQnl0ZU1hc2syQXJnYl9SZ2JCeXRlT3JkZXIoCi0gICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwgbV9NYXNrR3JlZW4sIG1fTWFza0JsdWUsCi0gICAgICAgICAgd2lkdGgsIG1fQmxlbmRUeXBlLCBjbGlwX3NjYW4pOwotICAgIH0gZWxzZSB7Ci0gICAgICBDb21wb3NpdGVSb3dfQnl0ZU1hc2syUmdiX1JnYkJ5dGVPcmRlcigKLSAgICAgICAgICBkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLCBtX01hc2tHcmVlbiwgbV9NYXNrQmx1ZSwKLSAgICAgICAgICB3aWR0aCwgbV9CbGVuZFR5cGUsIChtX0Rlc3RGb3JtYXQgJiAweGZmKSA+PiAzLCBjbGlwX3NjYW4pOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0gZWxzZSBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKLSAgICBDb21wb3NpdGVSb3dfQnl0ZU1hc2syQXJnYihkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLCB3aWR0aCwgbV9CbGVuZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuKTsKLSAgfSBlbHNlIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfUmdiIHx8IG1fRGVzdEZvcm1hdCA9PSBGWERJQl9SZ2IzMikgewotICAgIENvbXBvc2l0ZVJvd19CeXRlTWFzazJSZ2IoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLCB3aWR0aCwgbV9CbGVuZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9EZXN0Rm9ybWF0ICYgMHhmZikgPj4gMywgY2xpcF9zY2FuKTsKLSAgfSBlbHNlIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfUmdiYSkgewotICAgIENvbXBvc2l0ZVJvd19CeXRlTWFzazJSZ2JhKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9NYXNrR3JlZW4sIG1fTWFza0JsdWUsIHdpZHRoLCBtX0JsZW5kVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4sIGRzdF9leHRyYV9hbHBoYSk7Ci0gIH0KLX0KLQotdm9pZCBDRlhfU2NhbmxpbmVDb21wb3NpdG9yOjpDb21wb3NpdGVCaXRNYXNrTGluZSh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3RfZXh0cmFfYWxwaGEpIHsKLSAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl84YnBwTWFzaykgewotICAgIENvbXBvc2l0ZVJvd19CaXRNYXNrMk1hc2soZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIHNyY19sZWZ0LCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2Nhbik7Ci0gIH0gZWxzZSBpZiAoKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID09IDgpIHsKLSAgICBpZiAobV9EZXN0Rm9ybWF0ICYgMHgwMjAwKSB7Ci0gICAgICBDb21wb3NpdGVSb3dfQml0TWFzazJHcmF5YShkZXN0X3NjYW4sIHNyY19zY2FuLCBtX01hc2tBbHBoYSwgbV9NYXNrUmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2xlZnQsIHdpZHRoLCBjbGlwX3NjYW4sIGRzdF9leHRyYV9hbHBoYSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIENvbXBvc2l0ZVJvd19CaXRNYXNrMkdyYXkoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2xlZnQsIHdpZHRoLCBjbGlwX3NjYW4pOwotICAgIH0KLSAgfSBlbHNlIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKLSAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKLSAgICAgIENvbXBvc2l0ZVJvd19CaXRNYXNrMkFyZ2JfUmdiQnl0ZU9yZGVyKAotICAgICAgICAgIGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIG1fTWFza0FscGhhLCBtX01hc2tSZWQsIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLAotICAgICAgICAgIHNyY19sZWZ0LCB3aWR0aCwgbV9CbGVuZFR5cGUsIGNsaXBfc2Nhbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIENvbXBvc2l0ZVJvd19CaXRNYXNrMlJnYl9SZ2JCeXRlT3JkZXIoCi0gICAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwgbV9NYXNrR3JlZW4sIG1fTWFza0JsdWUsCi0gICAgICAgICAgc3JjX2xlZnQsIHdpZHRoLCBtX0JsZW5kVHlwZSwgKG1fRGVzdEZvcm1hdCAmIDB4ZmYpID4+IDMsIGNsaXBfc2Nhbik7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfSBlbHNlIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfQXJnYikgewotICAgIENvbXBvc2l0ZVJvd19CaXRNYXNrMkFyZ2IoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLCBzcmNfbGVmdCwgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0JsZW5kVHlwZSwgY2xpcF9zY2FuKTsKLSAgfSBlbHNlIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfUmdiIHx8IG1fRGVzdEZvcm1hdCA9PSBGWERJQl9SZ2IzMikgewotICAgIENvbXBvc2l0ZVJvd19CaXRNYXNrMlJnYigKLSAgICAgICAgZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9NYXNrQWxwaGEsIG1fTWFza1JlZCwgbV9NYXNrR3JlZW4sIG1fTWFza0JsdWUsCi0gICAgICAgIHNyY19sZWZ0LCB3aWR0aCwgbV9CbGVuZFR5cGUsIChtX0Rlc3RGb3JtYXQgJiAweGZmKSA+PiAzLCBjbGlwX3NjYW4pOwotICB9Ci19Ci0KLWJvb2wgQ0ZYX0RJQml0bWFwOjpDb21wb3NpdGVCaXRtYXAoaW50IGRlc3RfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJnYkJ5dGVPcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgewotICBpZiAoIW1fcEJ1ZmZlcikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBBU1NFUlQoIXBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpOwotICBBU1NFUlQobV9icHAgPj0gOCk7Ci0gIGlmIChwU3JjQml0bWFwLT5Jc0FscGhhTWFzaygpIHx8IG1fYnBwIDwgOCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBHZXRPdmVybGFwUmVjdChkZXN0X2xlZnQsIGRlc3RfdG9wLCB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLT5HZXRXaWR0aCgpLAotICAgICAgICAgICAgICAgICBwU3JjQml0bWFwLT5HZXRIZWlnaHQoKSwgc3JjX2xlZnQsIHNyY190b3AsIHBDbGlwUmduKTsKLSAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBjb25zdCBDRlhfRElCaXRtYXAqIHBDbGlwTWFzayA9IG51bGxwdHI7Ci0gIEZYX1JFQ1QgY2xpcF9ib3g7Ci0gIGlmIChwQ2xpcFJnbiAmJiBwQ2xpcFJnbi0+R2V0VHlwZSgpICE9IENGWF9DbGlwUmduOjpSZWN0SSkgewotICAgIEFTU0VSVChwQ2xpcFJnbi0+R2V0VHlwZSgpID09IENGWF9DbGlwUmduOjpNYXNrRik7Ci0gICAgcENsaXBNYXNrID0gcENsaXBSZ24tPkdldE1hc2soKS5HZXRPYmplY3QoKTsKLSAgICBjbGlwX2JveCA9IHBDbGlwUmduLT5HZXRCb3goKTsKLSAgfQotICBDRlhfU2NhbmxpbmVDb21wb3NpdG9yIGNvbXBvc2l0b3I7Ci0gIGlmICghY29tcG9zaXRvci5Jbml0KEdldEZvcm1hdCgpLCBwU3JjQml0bWFwLT5HZXRGb3JtYXQoKSwgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgIHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKSwgMCwgYmxlbmRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgcENsaXBNYXNrICE9IG51bGxwdHIsIGJSZ2JCeXRlT3JkZXIsIDAsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGludCBkZXN0X0JwcCA9IG1fYnBwIC8gODsKLSAgaW50IHNyY19CcHAgPSBwU3JjQml0bWFwLT5HZXRCUFAoKSAvIDg7Ci0gIGJvb2wgYlJnYiA9IHNyY19CcHAgPiAxICYmICFwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpOwotICBDRlhfRElCaXRtYXAqIHBTcmNBbHBoYU1hc2sgPSBwU3JjQml0bWFwLT5tX3BBbHBoYU1hc2s7Ci0gIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKLSAgICB1aW50OF90KiBkZXN0X3NjYW4gPQotICAgICAgICBtX3BCdWZmZXIgKyAoZGVzdF90b3AgKyByb3cpICogbV9QaXRjaCArIGRlc3RfbGVmdCAqIGRlc3RfQnBwOwotICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0KLSAgICAgICAgcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIHNyY19CcHA7Ci0gICAgY29uc3QgdWludDhfdCogc3JjX3NjYW5fZXh0cmFfYWxwaGEgPQotICAgICAgICBwU3JjQWxwaGFNYXNrID8gcFNyY0FscGhhTWFzay0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdAotICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cjsKLSAgICB1aW50OF90KiBkc3Rfc2Nhbl9leHRyYV9hbHBoYSA9Ci0gICAgICAgIG1fcEFscGhhTWFzawotICAgICAgICAgICAgPyAodWludDhfdCopbV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShkZXN0X3RvcCArIHJvdykgKyBkZXN0X2xlZnQKLSAgICAgICAgICAgIDogbnVsbHB0cjsKLSAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4gPSBudWxscHRyOwotICAgIGlmIChwQ2xpcE1hc2spIHsKLSAgICAgIGNsaXBfc2NhbiA9IHBDbGlwTWFzay0+bV9wQnVmZmVyICsKLSAgICAgICAgICAgICAgICAgIChkZXN0X3RvcCArIHJvdyAtIGNsaXBfYm94LnRvcCkgKiBwQ2xpcE1hc2stPm1fUGl0Y2ggKwotICAgICAgICAgICAgICAgICAgKGRlc3RfbGVmdCAtIGNsaXBfYm94LmxlZnQpOwotICAgIH0KLSAgICBpZiAoYlJnYikgewotICAgICAgY29tcG9zaXRvci5Db21wb3NpdGVSZ2JCaXRtYXBMaW5lKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoLCBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW5fZXh0cmFfYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3NjYW5fZXh0cmFfYWxwaGEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb21wb3NpdG9yLkNvbXBvc2l0ZVBhbEJpdG1hcExpbmUoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgc3JjX2xlZnQsIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2Nhbiwgc3JjX3NjYW5fZXh0cmFfYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3NjYW5fZXh0cmFfYWxwaGEpOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDRlhfRElCaXRtYXA6OkNvbXBvc2l0ZU1hc2soaW50IGRlc3RfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJnYkJ5dGVPcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgewotICBpZiAoIW1fcEJ1ZmZlcikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBBU1NFUlQocE1hc2stPklzQWxwaGFNYXNrKCkpOwotICBBU1NFUlQobV9icHAgPj0gOCk7Ci0gIGlmICghcE1hc2stPklzQWxwaGFNYXNrKCkgfHwgbV9icHAgPCA4KSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEdldE92ZXJsYXBSZWN0KGRlc3RfbGVmdCwgZGVzdF90b3AsIHdpZHRoLCBoZWlnaHQsIHBNYXNrLT5HZXRXaWR0aCgpLAotICAgICAgICAgICAgICAgICBwTWFzay0+R2V0SGVpZ2h0KCksIHNyY19sZWZ0LCBzcmNfdG9wLCBwQ2xpcFJnbik7Ci0gIGlmICh3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaW50IHNyY19hbHBoYSA9Ci0gICAgICAodWludDhfdCkoYWxwaGFfZmxhZyA+PiA4KSA/IChhbHBoYV9mbGFnICYgMHhmZikgOiBGWEFSR0JfQShjb2xvcik7Ci0gIGlmIChzcmNfYWxwaGEgPT0gMCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGNvbnN0IENGWF9ESUJpdG1hcCogcENsaXBNYXNrID0gbnVsbHB0cjsKLSAgRlhfUkVDVCBjbGlwX2JveDsKLSAgaWYgKHBDbGlwUmduICYmIHBDbGlwUmduLT5HZXRUeXBlKCkgIT0gQ0ZYX0NsaXBSZ246OlJlY3RJKSB7Ci0gICAgQVNTRVJUKHBDbGlwUmduLT5HZXRUeXBlKCkgPT0gQ0ZYX0NsaXBSZ246Ok1hc2tGKTsKLSAgICBwQ2xpcE1hc2sgPSBwQ2xpcFJnbi0+R2V0TWFzaygpLkdldE9iamVjdCgpOwotICAgIGNsaXBfYm94ID0gcENsaXBSZ24tPkdldEJveCgpOwotICB9Ci0gIGludCBzcmNfYnBwID0gcE1hc2stPkdldEJQUCgpOwotICBpbnQgQnBwID0gR2V0QlBQKCkgLyA4OwotICBDRlhfU2NhbmxpbmVDb21wb3NpdG9yIGNvbXBvc2l0b3I7Ci0gIGlmICghY29tcG9zaXRvci5Jbml0KEdldEZvcm1hdCgpLCBwTWFzay0+R2V0Rm9ybWF0KCksIHdpZHRoLCBudWxscHRyLCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRfdHlwZSwgcENsaXBNYXNrICE9IG51bGxwdHIsIGJSZ2JCeXRlT3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKLSAgICB1aW50OF90KiBkZXN0X3NjYW4gPQotICAgICAgICBtX3BCdWZmZXIgKyAoZGVzdF90b3AgKyByb3cpICogbV9QaXRjaCArIGRlc3RfbGVmdCAqIEJwcDsKLSAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBNYXNrLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KTsKLSAgICB1aW50OF90KiBkc3Rfc2Nhbl9leHRyYV9hbHBoYSA9Ci0gICAgICAgIG1fcEFscGhhTWFzawotICAgICAgICAgICAgPyAodWludDhfdCopbV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShkZXN0X3RvcCArIHJvdykgKyBkZXN0X2xlZnQKLSAgICAgICAgICAgIDogbnVsbHB0cjsKLSAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4gPSBudWxscHRyOwotICAgIGlmIChwQ2xpcE1hc2spIHsKLSAgICAgIGNsaXBfc2NhbiA9IHBDbGlwTWFzay0+bV9wQnVmZmVyICsKLSAgICAgICAgICAgICAgICAgIChkZXN0X3RvcCArIHJvdyAtIGNsaXBfYm94LnRvcCkgKiBwQ2xpcE1hc2stPm1fUGl0Y2ggKwotICAgICAgICAgICAgICAgICAgKGRlc3RfbGVmdCAtIGNsaXBfYm94LmxlZnQpOwotICAgIH0KLSAgICBpZiAoc3JjX2JwcCA9PSAxKSB7Ci0gICAgICBjb21wb3NpdG9yLkNvbXBvc2l0ZUJpdE1hc2tMaW5lKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHNyY19sZWZ0LCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBkc3Rfc2Nhbl9leHRyYV9hbHBoYSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvbXBvc2l0b3IuQ29tcG9zaXRlQnl0ZU1hc2tMaW5lKGRlc3Rfc2Nhbiwgc3JjX3NjYW4gKyBzcmNfbGVmdCwgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4sIGRzdF9zY2FuX2V4dHJhX2FscGhhKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0ZYX0RJQml0bWFwOjpDb21wb3NpdGVSZWN0KGludCBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSkgewotICBpZiAoIW1fcEJ1ZmZlcikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpbnQgc3JjX2FscGhhID0gKGFscGhhX2ZsYWcgPj4gOCkgPyAoYWxwaGFfZmxhZyAmIDB4ZmYpIDogRlhBUkdCX0EoY29sb3IpOwotICBpZiAoc3JjX2FscGhhID09IDApIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBGWF9SRUNUIHJlY3QobGVmdCwgdG9wLCBsZWZ0ICsgd2lkdGgsIHRvcCArIGhlaWdodCk7Ci0gIHJlY3QuSW50ZXJzZWN0KDAsIDAsIG1fV2lkdGgsIG1fSGVpZ2h0KTsKLSAgaWYgKHJlY3QuSXNFbXB0eSgpKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgd2lkdGggPSByZWN0LldpZHRoKCk7Ci0gIHVpbnQzMl90IGRzdF9jb2xvcjsKLSAgaWYgKGFscGhhX2ZsYWcgPj4gOCkgewotICAgIGRzdF9jb2xvciA9IEZYQ01ZS19UT0RJQihjb2xvcik7Ci0gIH0gZWxzZSB7Ci0gICAgZHN0X2NvbG9yID0gRlhBUkdCX1RPRElCKGNvbG9yKTsKLSAgfQotICB1aW50OF90KiBjb2xvcl9wID0gKHVpbnQ4X3QqKSZkc3RfY29sb3I7Ci0gIGlmIChtX2JwcCA9PSA4KSB7Ci0gICAgdWludDhfdCBncmF5ID0gMjU1OwotICAgIGlmICghSXNBbHBoYU1hc2soKSkgewotICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0gJiYgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKSAmJgotICAgICAgICAgIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCktPkdldEljY01vZHVsZSgpKSB7Ci0gICAgICAgIENDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQotICAgICAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LCBjb2xvcl9wLCAxKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChhbHBoYV9mbGFnID4+IDgpIHsKLSAgICAgICAgICB1aW50OF90IHIsIGcsIGI7Ci0gICAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKGNvbG9yX3BbMF0sIGNvbG9yX3BbMV0sIGNvbG9yX3BbMl0sIGNvbG9yX3BbM10sIHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcsIGIpOwotICAgICAgICAgIGdyYXkgPSBGWFJHQjJHUkFZKHIsIGcsIGIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdyYXkgPSAodWludDhfdClGWFJHQjJHUkFZKChpbnQpY29sb3JfcFsyXSwgY29sb3JfcFsxXSwgY29sb3JfcFswXSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChJc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgIGdyYXkgPSB+Z3JheTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChpbnQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyByb3crKykgewotICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaCArIHJlY3QubGVmdDsKLSAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIGdyYXksIHdpZHRoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBncmF5LCBzcmNfYWxwaGEpOwotICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChtX2JwcCA9PSAxKSB7Ci0gICAgQVNTRVJUKCFJc0NteWtJbWFnZSgpICYmICh1aW50OF90KShhbHBoYV9mbGFnID4+IDgpID09IDApOwotICAgIGludCBsZWZ0X3NoaWZ0ID0gcmVjdC5sZWZ0ICUgODsKLSAgICBpbnQgcmlnaHRfc2hpZnQgPSByZWN0LnJpZ2h0ICUgODsKLSAgICBpbnQgbmV3X3dpZHRoID0gcmVjdC5yaWdodCAvIDggLSByZWN0LmxlZnQgLyA4OwotICAgIGludCBpbmRleCA9IDA7Ci0gICAgaWYgKG1fcFBhbGV0dGUpIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgICAgIGlmIChtX3BQYWxldHRlLmdldCgpW2ldID09IGNvbG9yKSB7Ci0gICAgICAgICAgaW5kZXggPSBpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGV4ID0gKCh1aW50OF90KWNvbG9yID09IDB4ZmYpID8gMSA6IDA7Ci0gICAgfQotICAgIGZvciAoaW50IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93KyspIHsKLSAgICAgIHVpbnQ4X3QqIGRlc3Rfc2Nhbl90b3AgPSAodWludDhfdCopR2V0U2NhbmxpbmUocm93KSArIHJlY3QubGVmdCAvIDg7Ci0gICAgICB1aW50OF90KiBkZXN0X3NjYW5fdG9wX3IgPSAodWludDhfdCopR2V0U2NhbmxpbmUocm93KSArIHJlY3QucmlnaHQgLyA4OwotICAgICAgdWludDhfdCBsZWZ0X2ZsYWcgPSAqZGVzdF9zY2FuX3RvcCAmICgyNTUgPDwgKDggLSBsZWZ0X3NoaWZ0KSk7Ci0gICAgICB1aW50OF90IHJpZ2h0X2ZsYWcgPSAqZGVzdF9zY2FuX3RvcF9yICYgKDI1NSA+PiByaWdodF9zaGlmdCk7Ci0gICAgICBpZiAobmV3X3dpZHRoKSB7Ci0gICAgICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW5fdG9wICsgMSwgaW5kZXggPyAyNTUgOiAwLCBuZXdfd2lkdGggLSAxKTsKLSAgICAgICAgaWYgKCFpbmRleCkgewotICAgICAgICAgICpkZXN0X3NjYW5fdG9wICY9IGxlZnRfZmxhZzsKLSAgICAgICAgICAqZGVzdF9zY2FuX3RvcF9yICY9IHJpZ2h0X2ZsYWc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgKmRlc3Rfc2Nhbl90b3AgfD0gfmxlZnRfZmxhZzsKLSAgICAgICAgICAqZGVzdF9zY2FuX3RvcF9yIHw9IH5yaWdodF9mbGFnOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoIWluZGV4KSB7Ci0gICAgICAgICAgKmRlc3Rfc2Nhbl90b3AgJj0gbGVmdF9mbGFnIHwgcmlnaHRfZmxhZzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAqZGVzdF9zY2FuX3RvcCB8PSB+KGxlZnRfZmxhZyB8IHJpZ2h0X2ZsYWcpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIEFTU0VSVChtX2JwcCA+PSAyNCk7Ci0gIGlmIChtX2JwcCA8IDI0KSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChwSWNjVHJhbnNmb3JtICYmIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCkpIHsKLSAgICBDQ29kZWNfSWNjTW9kdWxlKiBwSWNjTW9kdWxlID0KLSAgICAgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKS0+R2V0SWNjTW9kdWxlKCk7Ci0gICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgY29sb3JfcCwgY29sb3JfcCwgMSk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGFscGhhX2ZsYWcgPj4gOCAmJiAhSXNDbXlrSW1hZ2UoKSkgewotICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShjb2xvciksIEZYU1lTX0dldE1WYWx1ZShjb2xvciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0S1ZhbHVlKGNvbG9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9wWzJdLCBjb2xvcl9wWzFdLCBjb2xvcl9wWzBdKTsKLSAgICB9IGVsc2UgaWYgKCEoYWxwaGFfZmxhZyA+PiA4KSAmJiBJc0NteWtJbWFnZSgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIGlmICghSXNDbXlrSW1hZ2UoKSkgewotICAgIGNvbG9yX3BbM10gPSAodWludDhfdClzcmNfYWxwaGE7Ci0gIH0KLSAgaW50IEJwcCA9IG1fYnBwIC8gODsKLSAgYm9vbCBiQWxwaGEgPSBIYXNBbHBoYSgpOwotICBib29sIGJBcmdiID0gR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYjsKLSAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICBmb3IgKGludCByb3cgPSByZWN0LnRvcDsgcm93IDwgcmVjdC5ib3R0b207IHJvdysrKSB7Ci0gICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoICsgcmVjdC5sZWZ0ICogQnBwOwotICAgICAgdWludDhfdCogZGVzdF9zY2FuX2FscGhhID0KLSAgICAgICAgICBtX3BBbHBoYU1hc2sgPyAodWludDhfdCopbV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShyb3cpICsgcmVjdC5sZWZ0Ci0gICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cjsKLSAgICAgIGlmIChkZXN0X3NjYW5fYWxwaGEpIHsKLSAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2Nhbl9hbHBoYSwgMHhmZiwgd2lkdGgpOwotICAgICAgfQotICAgICAgaWYgKEJwcCA9PSA0KSB7Ci0gICAgICAgIHVpbnQzMl90KiBzY2FuID0gKHVpbnQzMl90KilkZXN0X3NjYW47Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgICAgICAgICpzY2FuKysgPSBkc3RfY29sb3I7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgICAgICAgICpkZXN0X3NjYW4rKyA9IGNvbG9yX3BbMF07Ci0gICAgICAgICAgKmRlc3Rfc2NhbisrID0gY29sb3JfcFsxXTsKLSAgICAgICAgICAqZGVzdF9zY2FuKysgPSBjb2xvcl9wWzJdOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGZvciAoaW50IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93KyspIHsKLSAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoICsgcmVjdC5sZWZ0ICogQnBwOwotICAgIGlmIChiQWxwaGEpIHsKLSAgICAgIGlmIChiQXJnYikgewotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSBkZXN0X3NjYW5bM107Ci0gICAgICAgICAgaWYgKGJhY2tfYWxwaGEgPT0gMCkgewotICAgICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3NjYW4sIEZYQVJHQl9NQUtFKHNyY19hbHBoYSwgY29sb3JfcFsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9wWzFdLCBjb2xvcl9wWzBdKSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQotICAgICAgICAgICAgICBiYWNrX2FscGhhICsgc3JjX2FscGhhIC0gYmFja19hbHBoYSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBjb2xvcl9wWzBdLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGNvbG9yX3BbMV0sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgY29sb3JfcFsyXSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgICpkZXN0X3NjYW4rKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2Nhbl9hbHBoYSA9Ci0gICAgICAgICAgICAodWludDhfdCopbV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShyb3cpICsgcmVjdC5sZWZ0OwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICAgICAgICB1aW50OF90IGJhY2tfYWxwaGEgPSAqZGVzdF9zY2FuX2FscGhhOwotICAgICAgICAgIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW5fYWxwaGErKyA9IHNyY19hbHBoYTsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShkZXN0X3NjYW4sIGNvbG9yX3AsIEJwcCk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gQnBwOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9Ci0gICAgICAgICAgICAgIGJhY2tfYWxwaGEgKyBzcmNfYWxwaGEgLSBiYWNrX2FscGhhICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICpkZXN0X3NjYW5fYWxwaGErKyA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgICBmb3IgKGludCBjb21wcyA9IDA7IGNvbXBzIDwgQnBwOyBjb21wcysrKSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0KLSAgICAgICAgICAgICAgICBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBjb2xvcl9wW2NvbXBzXSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgICAgICBmb3IgKGludCBjb21wcyA9IDA7IGNvbXBzIDwgQnBwOyBjb21wcysrKSB7Ci0gICAgICAgICAgaWYgKGNvbXBzID09IDMpIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IDI1NTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgY29sb3JfcFtjb21wc10sIHNyY19hbHBoYSk7Ci0gICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUNGWF9CaXRtYXBDb21wb3Nlcjo6Q0ZYX0JpdG1hcENvbXBvc2VyKCkgewotICBtX3BTY2FubGluZVYgPSBudWxscHRyOwotICBtX3BTY2FubGluZUFscGhhViA9IG51bGxwdHI7Ci0gIG1fcENsaXBTY2FuViA9IG51bGxwdHI7Ci0gIG1fcEFkZENsaXBTY2FuID0gbnVsbHB0cjsKLSAgbV9iUmdiQnl0ZU9yZGVyID0gZmFsc2U7Ci0gIG1fQmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMOwotfQotCi1DRlhfQml0bWFwQ29tcG9zZXI6On5DRlhfQml0bWFwQ29tcG9zZXIoKSB7Ci0gIEZYX0ZyZWUobV9wU2NhbmxpbmVWKTsKLSAgRlhfRnJlZShtX3BTY2FubGluZUFscGhhVik7Ci0gIEZYX0ZyZWUobV9wQ2xpcFNjYW5WKTsKLSAgRlhfRnJlZShtX3BBZGRDbGlwU2Nhbik7Ci19Ci0KLXZvaWQgQ0ZYX0JpdG1hcENvbXBvc2VyOjpDb21wb3NlKENGWF9ESUJpdG1hcCogcERlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWFza19jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QmIGRlc3RfcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlZlcnRpY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmxpcFgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGbGlwWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJnYkJ5dGVPcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEljY1RyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7Ci0gIG1fcEJpdG1hcCA9IHBEZXN0OwotICBtX3BDbGlwUmduID0gcENsaXBSZ247Ci0gIG1fRGVzdExlZnQgPSBkZXN0X3JlY3QubGVmdDsKLSAgbV9EZXN0VG9wID0gZGVzdF9yZWN0LnRvcDsKLSAgbV9EZXN0V2lkdGggPSBkZXN0X3JlY3QuV2lkdGgoKTsKLSAgbV9EZXN0SGVpZ2h0ID0gZGVzdF9yZWN0LkhlaWdodCgpOwotICBtX0JpdG1hcEFscGhhID0gYml0bWFwX2FscGhhOwotICBtX01hc2tDb2xvciA9IG1hc2tfY29sb3I7Ci0gIG1fcENsaXBNYXNrID0gbnVsbHB0cjsKLSAgaWYgKHBDbGlwUmduICYmIHBDbGlwUmduLT5HZXRUeXBlKCkgIT0gQ0ZYX0NsaXBSZ246OlJlY3RJKSB7Ci0gICAgbV9wQ2xpcE1hc2sgPSBwQ2xpcFJnbi0+R2V0TWFzaygpLkdldE9iamVjdCgpOwotICB9Ci0gIG1fYlZlcnRpY2FsID0gYlZlcnRpY2FsOwotICBtX2JGbGlwWCA9IGJGbGlwWDsKLSAgbV9iRmxpcFkgPSBiRmxpcFk7Ci0gIG1fQWxwaGFGbGFnID0gYWxwaGFfZmxhZzsKLSAgbV9wSWNjVHJhbnNmb3JtID0gcEljY1RyYW5zZm9ybTsKLSAgbV9iUmdiQnl0ZU9yZGVyID0gYlJnYkJ5dGVPcmRlcjsKLSAgbV9CbGVuZFR5cGUgPSBibGVuZF90eXBlOwotfQotYm9vbCBDRlhfQml0bWFwQ29tcG9zZXI6OlNldEluZm8oaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBTcmNQYWxldHRlKSB7Ci0gIG1fU3JjRm9ybWF0ID0gc3JjX2Zvcm1hdDsKLSAgaWYgKCFtX0NvbXBvc2l0b3IuSW5pdChtX3BCaXRtYXAtPkdldEZvcm1hdCgpLCBzcmNfZm9ybWF0LCB3aWR0aCwgcFNyY1BhbGV0dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbV9NYXNrQ29sb3IsIEZYRElCX0JMRU5EX05PUk1BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDbGlwTWFzayAhPSBudWxscHRyIHx8IChtX0JpdG1hcEFscGhhIDwgMjU1KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtX2JSZ2JCeXRlT3JkZXIsIG1fQWxwaGFGbGFnLCBtX3BJY2NUcmFuc2Zvcm0pKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChtX2JWZXJ0aWNhbCkgewotICAgIG1fcFNjYW5saW5lViA9IEZYX0FsbG9jKHVpbnQ4X3QsIG1fcEJpdG1hcC0+R2V0QlBQKCkgLyA4ICogd2lkdGggKyA0KTsKLSAgICBtX3BDbGlwU2NhblYgPSBGWF9BbGxvYyh1aW50OF90LCBtX3BCaXRtYXAtPkdldEhlaWdodCgpKTsKLSAgICBpZiAobV9wQml0bWFwLT5tX3BBbHBoYU1hc2spIHsKLSAgICAgIG1fcFNjYW5saW5lQWxwaGFWID0gRlhfQWxsb2ModWludDhfdCwgd2lkdGggKyA0KTsKLSAgICB9Ci0gIH0KLSAgaWYgKG1fQml0bWFwQWxwaGEgPCAyNTUpIHsKLSAgICBtX3BBZGRDbGlwU2NhbiA9IEZYX0FsbG9jKAotICAgICAgICB1aW50OF90LCBtX2JWZXJ0aWNhbCA/IG1fcEJpdG1hcC0+R2V0SGVpZ2h0KCkgOiBtX3BCaXRtYXAtPkdldFdpZHRoKCkpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIENGWF9CaXRtYXBDb21wb3Nlcjo6RG9Db21wb3NlKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19leHRyYV9hbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0X2V4dHJhX2FscGhhKSB7Ci0gIGlmIChtX0JpdG1hcEFscGhhIDwgMjU1KSB7Ci0gICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXN0X3dpZHRoOyBpKyspIHsKLSAgICAgICAgbV9wQWRkQ2xpcFNjYW5baV0gPSBjbGlwX3NjYW5baV0gKiBtX0JpdG1hcEFscGhhIC8gMjU1OwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBGWFNZU19tZW1zZXQobV9wQWRkQ2xpcFNjYW4sIG1fQml0bWFwQWxwaGEsIGRlc3Rfd2lkdGgpOwotICAgIH0KLSAgICBjbGlwX3NjYW4gPSBtX3BBZGRDbGlwU2NhbjsKLSAgfQotICBpZiAobV9TcmNGb3JtYXQgPT0gRlhESUJfOGJwcE1hc2spIHsKLSAgICBtX0NvbXBvc2l0b3IuQ29tcG9zaXRlQnl0ZU1hc2tMaW5lKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIGRlc3Rfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3NjYW4sIGRzdF9leHRyYV9hbHBoYSk7Ci0gIH0gZWxzZSBpZiAoKG1fU3JjRm9ybWF0ICYgMHhmZikgPT0gOCkgewotICAgIG1fQ29tcG9zaXRvci5Db21wb3NpdGVQYWxCaXRtYXBMaW5lKGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIDAsIGRlc3Rfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9zY2FuLCBzcmNfZXh0cmFfYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2V4dHJhX2FscGhhKTsKLSAgfSBlbHNlIHsKLSAgICBtX0NvbXBvc2l0b3IuQ29tcG9zaXRlUmdiQml0bWFwTGluZShkZXN0X3NjYW4sIHNyY19zY2FuLCBkZXN0X3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBfc2Nhbiwgc3JjX2V4dHJhX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9leHRyYV9hbHBoYSk7Ci0gIH0KLX0KLQotdm9pZCBDRlhfQml0bWFwQ29tcG9zZXI6OkNvbXBvc2VTY2FubGluZShpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2NhbmxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5fZXh0cmFfYWxwaGEpIHsKLSAgaWYgKG1fYlZlcnRpY2FsKSB7Ci0gICAgQ29tcG9zZVNjYW5saW5lVihsaW5lLCBzY2FubGluZSwgc2Nhbl9leHRyYV9hbHBoYSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiA9IG51bGxwdHI7Ci0gIGlmIChtX3BDbGlwTWFzaykKLSAgICBjbGlwX3NjYW4gPSBtX3BDbGlwTWFzay0+R2V0QnVmZmVyKCkgKwotICAgICAgICAgICAgICAgIChtX0Rlc3RUb3AgKyBsaW5lIC0gbV9wQ2xpcFJnbi0+R2V0Qm94KCkudG9wKSAqCi0gICAgICAgICAgICAgICAgICAgIG1fcENsaXBNYXNrLT5HZXRQaXRjaCgpICsKLSAgICAgICAgICAgICAgICAobV9EZXN0TGVmdCAtIG1fcENsaXBSZ24tPkdldEJveCgpLmxlZnQpOwotICB1aW50OF90KiBkZXN0X3NjYW4gPSAodWludDhfdCopbV9wQml0bWFwLT5HZXRTY2FubGluZShsaW5lICsgbV9EZXN0VG9wKSArCi0gICAgICAgICAgICAgICAgICAgICAgIG1fRGVzdExlZnQgKiBtX3BCaXRtYXAtPkdldEJQUCgpIC8gODsKLSAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuID0KLSAgICAgIG1fcEJpdG1hcC0+bV9wQWxwaGFNYXNrCi0gICAgICAgICAgPyAodWludDhfdCopbV9wQml0bWFwLT5tX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKGxpbmUgKyBtX0Rlc3RUb3ApICsKLSAgICAgICAgICAgICAgICBtX0Rlc3RMZWZ0Ci0gICAgICAgICAgOiBudWxscHRyOwotICBEb0NvbXBvc2UoZGVzdF9zY2FuLCBzY2FubGluZSwgbV9EZXN0V2lkdGgsIGNsaXBfc2Nhbiwgc2Nhbl9leHRyYV9hbHBoYSwKLSAgICAgICAgICAgIGRlc3RfYWxwaGFfc2Nhbik7Ci19Ci0KLXZvaWQgQ0ZYX0JpdG1hcENvbXBvc2VyOjpDb21wb3NlU2NhbmxpbmVWKGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2NhbmxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FuX2V4dHJhX2FscGhhKSB7Ci0gIGludCBpOwotICBpbnQgQnBwID0gbV9wQml0bWFwLT5HZXRCUFAoKSAvIDg7Ci0gIGludCBkZXN0X3BpdGNoID0gbV9wQml0bWFwLT5HZXRQaXRjaCgpOwotICBpbnQgZGVzdF9hbHBoYV9waXRjaCA9Ci0gICAgICBtX3BCaXRtYXAtPm1fcEFscGhhTWFzayA/IG1fcEJpdG1hcC0+bV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpIDogMDsKLSAgaW50IGRlc3RfeCA9IG1fRGVzdExlZnQgKyAobV9iRmxpcFggPyAobV9EZXN0V2lkdGggLSBsaW5lIC0gMSkgOiBsaW5lKTsKLSAgdWludDhfdCogZGVzdF9idWYgPQotICAgICAgbV9wQml0bWFwLT5HZXRCdWZmZXIoKSArIGRlc3RfeCAqIEJwcCArIG1fRGVzdFRvcCAqIGRlc3RfcGl0Y2g7Ci0gIHVpbnQ4X3QqIGRlc3RfYWxwaGFfYnVmID0gbV9wQml0bWFwLT5tX3BBbHBoYU1hc2sKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtX3BCaXRtYXAtPm1fcEFscGhhTWFzay0+R2V0QnVmZmVyKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3ggKyBtX0Rlc3RUb3AgKiBkZXN0X2FscGhhX3BpdGNoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cjsKLSAgaWYgKG1fYkZsaXBZKSB7Ci0gICAgZGVzdF9idWYgKz0gZGVzdF9waXRjaCAqIChtX0Rlc3RIZWlnaHQgLSAxKTsKLSAgICBkZXN0X2FscGhhX2J1ZiArPSBkZXN0X2FscGhhX3BpdGNoICogKG1fRGVzdEhlaWdodCAtIDEpOwotICB9Ci0gIGludCB5X3N0ZXAgPSBkZXN0X3BpdGNoOwotICBpbnQgeV9hbHBoYV9zdGVwID0gZGVzdF9hbHBoYV9waXRjaDsKLSAgaWYgKG1fYkZsaXBZKSB7Ci0gICAgeV9zdGVwID0gLXlfc3RlcDsKLSAgICB5X2FscGhhX3N0ZXAgPSAteV9hbHBoYV9zdGVwOwotICB9Ci0gIHVpbnQ4X3QqIHNyY19zY2FuID0gbV9wU2NhbmxpbmVWOwotICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZjsKLSAgZm9yIChpID0gMDsgaSA8IG1fRGVzdEhlaWdodDsgaSsrKSB7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBCcHA7IGorKykgewotICAgICAgKnNyY19zY2FuKysgPSBkZXN0X3NjYW5bal07Ci0gICAgfQotICAgIGRlc3Rfc2NhbiArPSB5X3N0ZXA7Ci0gIH0KLSAgdWludDhfdCogc3JjX2FscGhhX3NjYW4gPSBtX3BTY2FubGluZUFscGhhVjsKLSAgdWludDhfdCogZGVzdF9hbHBoYV9zY2FuID0gZGVzdF9hbHBoYV9idWY7Ci0gIGlmIChkZXN0X2FscGhhX3NjYW4pIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9EZXN0SGVpZ2h0OyBpKyspIHsKLSAgICAgICpzcmNfYWxwaGFfc2NhbisrID0gKmRlc3RfYWxwaGFfc2NhbjsKLSAgICAgIGRlc3RfYWxwaGFfc2NhbiArPSB5X2FscGhhX3N0ZXA7Ci0gICAgfQotICB9Ci0gIHVpbnQ4X3QqIGNsaXBfc2NhbiA9IG51bGxwdHI7Ci0gIGlmIChtX3BDbGlwTWFzaykgewotICAgIGNsaXBfc2NhbiA9IG1fcENsaXBTY2FuVjsKLSAgICBpbnQgY2xpcF9waXRjaCA9IG1fcENsaXBNYXNrLT5HZXRQaXRjaCgpOwotICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19jbGlwID0KLSAgICAgICAgbV9wQ2xpcE1hc2stPkdldEJ1ZmZlcigpICsKLSAgICAgICAgKG1fRGVzdFRvcCAtIG1fcENsaXBSZ24tPkdldEJveCgpLnRvcCkgKiBjbGlwX3BpdGNoICsKLSAgICAgICAgKGRlc3RfeCAtIG1fcENsaXBSZ24tPkdldEJveCgpLmxlZnQpOwotICAgIGlmIChtX2JGbGlwWSkgewotICAgICAgc3JjX2NsaXAgKz0gY2xpcF9waXRjaCAqIChtX0Rlc3RIZWlnaHQgLSAxKTsKLSAgICAgIGNsaXBfcGl0Y2ggPSAtY2xpcF9waXRjaDsKLSAgICB9Ci0gICAgZm9yIChpID0gMDsgaSA8IG1fRGVzdEhlaWdodDsgaSsrKSB7Ci0gICAgICBjbGlwX3NjYW5baV0gPSAqc3JjX2NsaXA7Ci0gICAgICBzcmNfY2xpcCArPSBjbGlwX3BpdGNoOwotICAgIH0KLSAgfQotICBEb0NvbXBvc2UobV9wU2NhbmxpbmVWLCBzY2FubGluZSwgbV9EZXN0SGVpZ2h0LCBjbGlwX3NjYW4sIHNjYW5fZXh0cmFfYWxwaGEsCi0gICAgICAgICAgICBtX3BTY2FubGluZUFscGhhVik7Ci0gIHNyY19zY2FuID0gbV9wU2NhbmxpbmVWOwotICBkZXN0X3NjYW4gPSBkZXN0X2J1ZjsKLSAgZm9yIChpID0gMDsgaSA8IG1fRGVzdEhlaWdodDsgaSsrKSB7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBCcHA7IGorKykgewotICAgICAgZGVzdF9zY2FuW2pdID0gKnNyY19zY2FuKys7Ci0gICAgfQotICAgIGRlc3Rfc2NhbiArPSB5X3N0ZXA7Ci0gIH0KLSAgc3JjX2FscGhhX3NjYW4gPSBtX3BTY2FubGluZUFscGhhVjsKLSAgZGVzdF9hbHBoYV9zY2FuID0gZGVzdF9hbHBoYV9idWY7Ci0gIGlmIChkZXN0X2FscGhhX3NjYW4pIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbV9EZXN0SGVpZ2h0OyBpKyspIHsKLSAgICAgICpkZXN0X2FscGhhX3NjYW4gPSAqc3JjX2FscGhhX3NjYW4rKzsKLSAgICAgIGRlc3RfYWxwaGFfc2NhbiArPSB5X2FscGhhX3N0ZXA7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZGliL2Z4X2RpYl9jb252ZXJ0LmNwcCBiL2NvcmUvZnhnZS9kaWIvZnhfZGliX2NvbnZlcnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWQzZjM0Li4wMDAwMDAwCi0tLSBhL2NvcmUvZnhnZS9kaWIvZnhfZGliX2NvbnZlcnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTExICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2Z4X2NvZGVjLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfbWF5YmVfb3duZWQuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotCi1jbGFzcyBDRlhfUGFsZXR0ZSB7Ci0gcHVibGljOgotICBDRlhfUGFsZXR0ZSgpOwotICB+Q0ZYX1BhbGV0dGUoKTsKLQotICBib29sIEJ1aWxkUGFsZXR0ZShjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwKTsKLSAgdWludDMyX3QqIEdldFBhbGV0dGUoKSBjb25zdCB7IHJldHVybiBtX3BQYWxldHRlOyB9Ci0gIHVpbnQzMl90KiBHZXRDb2xvckx1dCgpIGNvbnN0IHsgcmV0dXJuIG1fY0x1dDsgfQotICB1aW50MzJfdCogR2V0QW1vdW50THV0KCkgY29uc3QgeyByZXR1cm4gbV9hTHV0OyB9Ci0gIGludDMyX3QgR2V0bHV0KCkgY29uc3QgeyByZXR1cm4gbV9sdXQ7IH0KLQotIHByb3RlY3RlZDoKLSAgdWludDMyX3QqIG1fcFBhbGV0dGU7Ci0gIHVpbnQzMl90KiBtX2NMdXQ7Ci0gIHVpbnQzMl90KiBtX2FMdXQ7Ci0gIGludCBtX2x1dDsKLX07Ci1pbnQgX1BhcnRpdGlvbih1aW50MzJfdCogYWx1dCwgdWludDMyX3QqIGNsdXQsIGludCBsLCBpbnQgcikgewotICB1aW50MzJfdCBwX2EgPSBhbHV0W2xdOwotICB1aW50MzJfdCBwX2MgPSBjbHV0W2xdOwotICB3aGlsZSAobCA8IHIpIHsKLSAgICB3aGlsZSAobCA8IHIgJiYgYWx1dFtyXSA+PSBwX2EpIHsKLSAgICAgIHItLTsKLSAgICB9Ci0gICAgaWYgKGwgPCByKSB7Ci0gICAgICBhbHV0W2xdID0gYWx1dFtyXTsKLSAgICAgIGNsdXRbbCsrXSA9IGNsdXRbcl07Ci0gICAgfQotICAgIHdoaWxlIChsIDwgciAmJiBhbHV0W2xdIDw9IHBfYSkgewotICAgICAgbCsrOwotICAgIH0KLSAgICBpZiAobCA8IHIpIHsKLSAgICAgIGFsdXRbcl0gPSBhbHV0W2xdOwotICAgICAgY2x1dFtyLS1dID0gY2x1dFtsXTsKLSAgICB9Ci0gIH0KLSAgYWx1dFtsXSA9IHBfYTsKLSAgY2x1dFtsXSA9IHBfYzsKLSAgcmV0dXJuIGw7Ci19Ci0KLXZvaWQgX1Fzb3J0KHVpbnQzMl90KiBhbHV0LCB1aW50MzJfdCogY2x1dCwgaW50IGwsIGludCByKSB7Ci0gIGlmIChsIDwgcikgewotICAgIGludCBwSSA9IF9QYXJ0aXRpb24oYWx1dCwgY2x1dCwgbCwgcik7Ci0gICAgX1Fzb3J0KGFsdXQsIGNsdXQsIGwsIHBJIC0gMSk7Ci0gICAgX1Fzb3J0KGFsdXQsIGNsdXQsIHBJICsgMSwgcik7Ci0gIH0KLX0KLQotdm9pZCBfQ29sb3JEZWNvZGUodWludDMyX3QgcGFsX3YsIHVpbnQ4X3QmIHIsIHVpbnQ4X3QmIGcsIHVpbnQ4X3QmIGIpIHsKLSAgciA9ICh1aW50OF90KSgocGFsX3YgJiAweGYwMCkgPj4gNCk7Ci0gIGcgPSAodWludDhfdCkocGFsX3YgJiAweDBmMCk7Ci0gIGIgPSAodWludDhfdCkoKHBhbF92ICYgMHgwMGYpIDw8IDQpOwotfQotCi12b2lkIF9PYnRhaW5fUGFsKHVpbnQzMl90KiBhTHV0LAotICAgICAgICAgICAgICAgICB1aW50MzJfdCogY0x1dCwKLSAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRlc3RfcGFsLAotICAgICAgICAgICAgICAgICB1aW50MzJfdCBsdXQpIHsKLSAgdWludDMyX3QgbHV0XzEgPSBsdXQgLSAxOwotICBmb3IgKGludCByb3cgPSAwOyByb3cgPCAyNTY7IHJvdysrKSB7Ci0gICAgaW50IGx1dF9vZmZzZXQgPSBsdXRfMSAtIHJvdzsKLSAgICBpZiAobHV0X29mZnNldCA8IDApIHsKLSAgICAgIGx1dF9vZmZzZXQgKz0gMjU2OwotICAgIH0KLSAgICB1aW50MzJfdCBjb2xvciA9IGNMdXRbbHV0X29mZnNldF07Ci0gICAgdWludDhfdCByOwotICAgIHVpbnQ4X3QgZzsKLSAgICB1aW50OF90IGI7Ci0gICAgX0NvbG9yRGVjb2RlKGNvbG9yLCByLCBnLCBiKTsKLSAgICBkZXN0X3BhbFtyb3ddID0gKCh1aW50MzJfdClyIDw8IDE2KSB8ICgodWludDMyX3QpZyA8PCA4KSB8IGIgfCAweGZmMDAwMDAwOwotICAgIGFMdXRbbHV0X29mZnNldF0gPSByb3c7Ci0gIH0KLX0KLQotQ0ZYX1BhbGV0dGU6OkNGWF9QYWxldHRlKCkgewotICBtX3BQYWxldHRlID0gbnVsbHB0cjsKLSAgbV9jTHV0ID0gbnVsbHB0cjsKLSAgbV9hTHV0ID0gbnVsbHB0cjsKLSAgbV9sdXQgPSAwOwotfQotCi1DRlhfUGFsZXR0ZTo6fkNGWF9QYWxldHRlKCkgewotICBGWF9GcmVlKG1fcFBhbGV0dGUpOwotICBGWF9GcmVlKG1fY0x1dCk7Ci0gIEZYX0ZyZWUobV9hTHV0KTsKLSAgbV9sdXQgPSAwOwotfQotCi1ib29sIENGWF9QYWxldHRlOjpCdWlsZFBhbGV0dGUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCkgewotICBpZiAoIXBCaXRtYXApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRlhfRnJlZShtX3BQYWxldHRlKTsKLSAgbV9wUGFsZXR0ZSA9IEZYX0FsbG9jKHVpbnQzMl90LCAyNTYpOwotICBpbnQgYnBwID0gcEJpdG1hcC0+R2V0QlBQKCkgLyA4OwotICBpbnQgd2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOwotICBpbnQgaGVpZ2h0ID0gcEJpdG1hcC0+R2V0SGVpZ2h0KCk7Ci0gIEZYX0ZyZWUobV9jTHV0KTsKLSAgbV9jTHV0ID0gbnVsbHB0cjsKLSAgRlhfRnJlZShtX2FMdXQpOwotICBtX2FMdXQgPSBudWxscHRyOwotICBtX2NMdXQgPSBGWF9BbGxvYyh1aW50MzJfdCwgNDA5Nik7Ci0gIG1fYUx1dCA9IEZYX0FsbG9jKHVpbnQzMl90LCA0MDk2KTsKLSAgaW50IHJvdywgY29sOwotICBtX2x1dCA9IDA7Ci0gIGZvciAocm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgewotICAgIHVpbnQ4X3QqIHNjYW5fbGluZSA9ICh1aW50OF90KilwQml0bWFwLT5HZXRTY2FubGluZShyb3cpOwotICAgIGZvciAoY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgICB1aW50OF90KiBzcmNfcG9ydCA9IHNjYW5fbGluZSArIGNvbCAqIGJwcDsKLSAgICAgIHVpbnQzMl90IGIgPSBzcmNfcG9ydFswXSAmIDB4ZjA7Ci0gICAgICB1aW50MzJfdCBnID0gc3JjX3BvcnRbMV0gJiAweGYwOwotICAgICAgdWludDMyX3QgciA9IHNyY19wb3J0WzJdICYgMHhmMDsKLSAgICAgIHVpbnQzMl90IGluZGV4ID0gKHIgPDwgNCkgKyBnICsgKGIgPj4gNCk7Ci0gICAgICBtX2FMdXRbaW5kZXhdKys7Ci0gICAgfQotICB9Ci0gIGZvciAocm93ID0gMDsgcm93IDwgNDA5Njsgcm93KyspIHsKLSAgICBpZiAobV9hTHV0W3Jvd10gIT0gMCkgewotICAgICAgbV9hTHV0W21fbHV0XSA9IG1fYUx1dFtyb3ddOwotICAgICAgbV9jTHV0W21fbHV0XSA9IHJvdzsKLSAgICAgIG1fbHV0Kys7Ci0gICAgfQotICB9Ci0gIF9Rc29ydChtX2FMdXQsIG1fY0x1dCwgMCwgbV9sdXQgLSAxKTsKLSAgX09idGFpbl9QYWwobV9hTHV0LCBtX2NMdXQsIG1fcFBhbGV0dGUsIG1fbHV0KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ29udmVydEJ1ZmZlcl8xYnBwTWFzazJHcmF5KHVpbnQ4X3QqIGRlc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wKSB7Ci0gIHVpbnQ4X3Qgc2V0X2dyYXksIHJlc2V0X2dyYXk7Ci0gIHNldF9ncmF5ID0gMHhmZjsKLSAgcmVzZXRfZ3JheSA9IDB4MDA7Ci0gIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKLSAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7Ci0gICAgRlhTWVNfbWVtc2V0KGRlc3Rfc2NhbiwgcmVzZXRfZ3JheSwgd2lkdGgpOwotICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdyk7Ci0gICAgZm9yIChpbnQgY29sID0gc3JjX2xlZnQ7IGNvbCA8IHNyY19sZWZ0ICsgd2lkdGg7IGNvbCsrKSB7Ci0gICAgICBpZiAoc3JjX3NjYW5bY29sIC8gOF0gJiAoMSA8PCAoNyAtIGNvbCAlIDgpKSkgewotICAgICAgICAqZGVzdF9zY2FuID0gc2V0X2dyYXk7Ci0gICAgICB9Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ29udmVydEJ1ZmZlcl84YnBwTWFzazJHcmF5KHVpbnQ4X3QqIGRlc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wKSB7Ci0gIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKLSAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7Ci0gICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0OwotICAgIEZYU1lTX21lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCB3aWR0aCk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ29udmVydEJ1ZmZlcl8xYnBwUGx0MkdyYXkodWludDhfdCogZGVzdF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3ApIHsKLSAgdWludDMyX3QqIHNyY19wbHQgPSBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCk7Ci0gIHVpbnQ4X3QgZ3JheVsyXTsKLSAgdWludDhfdCByZXNldF9yOwotICB1aW50OF90IHJlc2V0X2c7Ci0gIHVpbnQ4X3QgcmVzZXRfYjsKLSAgdWludDhfdCBzZXRfcjsKLSAgdWludDhfdCBzZXRfZzsKLSAgdWludDhfdCBzZXRfYjsKLSAgaWYgKHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKLSAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKHNyY19wbHRbMF0pLCBGWFNZU19HZXRNVmFsdWUoc3JjX3BsdFswXSksCi0gICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldFlWYWx1ZShzcmNfcGx0WzBdKSwgRlhTWVNfR2V0S1ZhbHVlKHNyY19wbHRbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICByZXNldF9yLCByZXNldF9nLCByZXNldF9iKTsKLSAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKHNyY19wbHRbMV0pLCBGWFNZU19HZXRNVmFsdWUoc3JjX3BsdFsxXSksCi0gICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldFlWYWx1ZShzcmNfcGx0WzFdKSwgRlhTWVNfR2V0S1ZhbHVlKHNyY19wbHRbMV0pLAotICAgICAgICAgICAgICAgICAgICAgICBzZXRfciwgc2V0X2csIHNldF9iKTsKLSAgfSBlbHNlIHsKLSAgICByZXNldF9yID0gRlhBUkdCX1Ioc3JjX3BsdFswXSk7Ci0gICAgcmVzZXRfZyA9IEZYQVJHQl9HKHNyY19wbHRbMF0pOwotICAgIHJlc2V0X2IgPSBGWEFSR0JfQihzcmNfcGx0WzBdKTsKLSAgICBzZXRfciA9IEZYQVJHQl9SKHNyY19wbHRbMV0pOwotICAgIHNldF9nID0gRlhBUkdCX0coc3JjX3BsdFsxXSk7Ci0gICAgc2V0X2IgPSBGWEFSR0JfQihzcmNfcGx0WzFdKTsKLSAgfQotICBncmF5WzBdID0gRlhSR0IyR1JBWShyZXNldF9yLCByZXNldF9nLCByZXNldF9iKTsKLSAgZ3JheVsxXSA9IEZYUkdCMkdSQVkoc2V0X3IsIHNldF9nLCBzZXRfYik7Ci0KLSAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgewotICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICBGWFNZU19tZW1zZXQoZGVzdF9zY2FuLCBncmF5WzBdLCB3aWR0aCk7Ci0gICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KTsKLSAgICBmb3IgKGludCBjb2wgPSBzcmNfbGVmdDsgY29sIDwgc3JjX2xlZnQgKyB3aWR0aDsgY29sKyspIHsKLSAgICAgIGlmIChzcmNfc2Nhbltjb2wgLyA4XSAmICgxIDw8ICg3IC0gY29sICUgOCkpKSB7Ci0gICAgICAgICpkZXN0X3NjYW4gPSBncmF5WzFdOwotICAgICAgfQotICAgICAgZGVzdF9zY2FuKys7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENvbnZlcnRCdWZmZXJfOGJwcFBsdDJHcmF5KHVpbnQ4X3QqIGRlc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wKSB7Ci0gIHVpbnQzMl90KiBzcmNfcGx0ID0gcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpOwotICB1aW50OF90IGdyYXlbMjU2XTsKLSAgaWYgKHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKLSAgICB1aW50OF90IHI7Ci0gICAgdWludDhfdCBnOwotICAgIHVpbnQ4X3QgYjsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShncmF5KTsgaSsrKSB7Ci0gICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoCi0gICAgICAgICAgRlhTWVNfR2V0Q1ZhbHVlKHNyY19wbHRbaV0pLCBGWFNZU19HZXRNVmFsdWUoc3JjX3BsdFtpXSksCi0gICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKHNyY19wbHRbaV0pLCBGWFNZU19HZXRLVmFsdWUoc3JjX3BsdFtpXSksIHIsIGcsIGIpOwotICAgICAgZ3JheVtpXSA9IEZYUkdCMkdSQVkociwgZywgYik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGdyYXkpOyBpKyspIHsKLSAgICAgIGdyYXlbaV0gPSBGWFJHQjJHUkFZKEZYQVJHQl9SKHNyY19wbHRbaV0pLCBGWEFSR0JfRyhzcmNfcGx0W2ldKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9CKHNyY19wbHRbaV0pKTsKLSAgICB9Ci0gIH0KLQotICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7Ci0gICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdDsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICAgICpkZXN0X3NjYW4rKyA9IGdyYXlbKnNyY19zY2FuKytdOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDb252ZXJ0QnVmZmVyX1JnYk9yQ215azJHcmF5KHVpbnQ4X3QqIGRlc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wKSB7Ci0gIGludCBCcHAgPSBwU3JjQml0bWFwLT5HZXRCUFAoKSAvIDg7Ci0gIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7Ci0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgewotICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPQotICAgICAgICAgIHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiA0OwotICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgciwgZywgYjsKLSAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZSgodWludDMyX3Qpc3JjX3NjYW5bMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfR2V0TVZhbHVlKCh1aW50MzJfdClzcmNfc2NhblsxXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoKHVpbnQzMl90KXNyY19zY2FuWzJdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldEtWYWx1ZSgodWludDMyX3Qpc3JjX3NjYW5bM10pLCByLCBnLCBiKTsKLSAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhSR0IyR1JBWShyLCBnLCBiKTsKLSAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgewotICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPQotICAgICAgICAgIHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiBCcHA7Ci0gICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhSR0IyR1JBWShzcmNfc2NhblsyXSwgc3JjX3NjYW5bMV0sIHNyY19zY2FuWzBdKTsKLSAgICAgICAgc3JjX3NjYW4gKz0gQnBwOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDb252ZXJ0QnVmZmVyX0luZGV4Q29weSh1aW50OF90KiBkZXN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCkgewotICBpZiAocFNyY0JpdG1hcC0+R2V0QlBQKCkgPT0gMSkgewotICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKLSAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIDAsIHdpZHRoKTsKLSAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdyk7Ci0gICAgICBmb3IgKGludCBjb2wgPSBzcmNfbGVmdDsgY29sIDwgc3JjX2xlZnQgKyB3aWR0aDsgY29sKyspIHsKLSAgICAgICAgaWYgKHNyY19zY2FuW2NvbCAvIDhdICYgKDEgPDwgKDcgLSBjb2wgJSA4KSkpIHsKLSAgICAgICAgICAqZGVzdF9zY2FuID0gMTsKLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgewotICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPQotICAgICAgICAgIHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQ7Ci0gICAgICBGWFNZU19tZW1jcHkoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGgpOwotICAgIH0KLSAgfQotfQotCi1ib29sIENvbnZlcnRCdWZmZXJfUGx0MlBsdFJnYjgodWludDhfdCogZGVzdF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdF9wbHQpIHsKLSAgQ29udmVydEJ1ZmZlcl9JbmRleENvcHkoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19sZWZ0LCBzcmNfdG9wKTsKLSAgdWludDMyX3QqIHNyY19wbHQgPSBwU3JjQml0bWFwLT5HZXRQYWxldHRlKCk7Ci0gIGludCBwbHRfc2l6ZSA9IHBTcmNCaXRtYXAtPkdldFBhbGV0dGVTaXplKCk7Ci0gIGlmIChwU3JjQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbHRfc2l6ZTsgaSsrKSB7Ci0gICAgICB1aW50OF90IHI7Ci0gICAgICB1aW50OF90IGc7Ci0gICAgICB1aW50OF90IGI7Ci0gICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoCi0gICAgICAgICAgRlhTWVNfR2V0Q1ZhbHVlKHNyY19wbHRbaV0pLCBGWFNZU19HZXRNVmFsdWUoc3JjX3BsdFtpXSksCi0gICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKHNyY19wbHRbaV0pLCBGWFNZU19HZXRLVmFsdWUoc3JjX3BsdFtpXSksIHIsIGcsIGIpOwotICAgICAgZHN0X3BsdFtpXSA9IEZYQVJHQl9NQUtFKDB4ZmYsIHIsIGcsIGIpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBGWFNZU19tZW1jcHkoZHN0X3BsdCwgc3JjX3BsdCwgcGx0X3NpemUgKiA0KTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDb252ZXJ0QnVmZmVyX1JnYjJQbHRSZ2I4KHVpbnQ4X3QqIGRlc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3RfcGx0KSB7Ci0gIGludCBicHAgPSBwU3JjQml0bWFwLT5HZXRCUFAoKSAvIDg7Ci0gIENGWF9QYWxldHRlIHBhbGV0dGU7Ci0gIHBhbGV0dGUuQnVpbGRQYWxldHRlKHBTcmNCaXRtYXApOwotICB1aW50MzJfdCogY0x1dCA9IHBhbGV0dGUuR2V0Q29sb3JMdXQoKTsKLSAgdWludDMyX3QqIGFMdXQgPSBwYWxldHRlLkdldEFtb3VudEx1dCgpOwotICBpZiAoIWNMdXQgfHwgIWFMdXQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaW50IGx1dCA9IHBhbGV0dGUuR2V0bHV0KCk7Ci0gIHVpbnQzMl90KiBwUGFsZXR0ZSA9IHBhbGV0dGUuR2V0UGFsZXR0ZSgpOwotICBpZiAobHV0ID4gMjU2KSB7Ci0gICAgaW50IGVyciwgbWluX2VycjsKLSAgICBpbnQgbHV0XzI1NiA9IGx1dCAtIDI1NjsKLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBsdXRfMjU2OyByb3crKykgewotICAgICAgbWluX2VyciA9IDEwMDAwMDA7Ci0gICAgICB1aW50OF90IHIsIGcsIGI7Ci0gICAgICBfQ29sb3JEZWNvZGUoY0x1dFtyb3ddLCByLCBnLCBiKTsKLSAgICAgIGludCBjbHJpbmRleCA9IDA7Ci0gICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCAyNTY7IGNvbCsrKSB7Ci0gICAgICAgIHVpbnQzMl90IHBfY29sb3IgPSAqKHBQYWxldHRlICsgY29sKTsKLSAgICAgICAgaW50IGRfciA9IHIgLSAodWludDhfdCkocF9jb2xvciA+PiAxNik7Ci0gICAgICAgIGludCBkX2cgPSBnIC0gKHVpbnQ4X3QpKHBfY29sb3IgPj4gOCk7Ci0gICAgICAgIGludCBkX2IgPSBiIC0gKHVpbnQ4X3QpKHBfY29sb3IpOwotICAgICAgICBlcnIgPSBkX3IgKiBkX3IgKyBkX2cgKiBkX2cgKyBkX2IgKiBkX2I7Ci0gICAgICAgIGlmIChlcnIgPCBtaW5fZXJyKSB7Ci0gICAgICAgICAgbWluX2VyciA9IGVycjsKLSAgICAgICAgICBjbHJpbmRleCA9IGNvbDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYUx1dFtyb3ddID0gY2xyaW5kZXg7Ci0gICAgfQotICB9Ci0gIGludDMyX3QgbHV0XzEgPSBsdXQgLSAxOwotICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7Ci0gICAgdWludDhfdCogc3JjX3NjYW4gPQotICAgICAgICAodWludDhfdCopcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdDsKLSAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgICB1aW50OF90KiBzcmNfcG9ydCA9IHNyY19zY2FuICsgY29sICogYnBwOwotICAgICAgaW50IHIgPSBzcmNfcG9ydFsyXSAmIDB4ZjA7Ci0gICAgICBpbnQgZyA9IHNyY19wb3J0WzFdICYgMHhmMDsKLSAgICAgIGludCBiID0gc3JjX3BvcnRbMF0gJiAweGYwOwotICAgICAgdWludDMyX3QgY2xyaW5kZXggPSAociA8PCA0KSArIGcgKyAoYiA+PiA0KTsKLSAgICAgIGZvciAoaW50IGkgPSBsdXRfMTsgaSA+PSAwOyBpLS0pCi0gICAgICAgIGlmIChjbHJpbmRleCA9PSBjTHV0W2ldKSB7Ci0gICAgICAgICAgKihkZXN0X3NjYW4gKyBjb2wpID0gKHVpbnQ4X3QpKGFMdXRbaV0pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICB9Ci0gIEZYU1lTX21lbWNweShkc3RfcGx0LCBwUGFsZXR0ZSwgc2l6ZW9mKHVpbnQzMl90KSAqIDI1Nik7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENvbnZlcnRCdWZmZXJfMWJwcE1hc2syUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCkgewotICBpbnQgY29tcHMgPSAoZHN0X2Zvcm1hdCAmIDB4ZmYpIC8gODsKLSAgdWludDhfdCBzZXRfZ3JheSwgcmVzZXRfZ3JheTsKLSAgc2V0X2dyYXkgPSAweGZmOwotICByZXNldF9ncmF5ID0gMHgwMDsKLSAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgewotICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpOwotICAgIGZvciAoaW50IGNvbCA9IHNyY19sZWZ0OyBjb2wgPCBzcmNfbGVmdCArIHdpZHRoOyBjb2wrKykgewotICAgICAgaWYgKHNyY19zY2FuW2NvbCAvIDhdICYgKDEgPDwgKDcgLSBjb2wgJSA4KSkpIHsKLSAgICAgICAgZGVzdF9zY2FuWzBdID0gc2V0X2dyYXk7Ci0gICAgICAgIGRlc3Rfc2NhblsxXSA9IHNldF9ncmF5OwotICAgICAgICBkZXN0X3NjYW5bMl0gPSBzZXRfZ3JheTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGRlc3Rfc2NhblswXSA9IHJlc2V0X2dyYXk7Ci0gICAgICAgIGRlc3Rfc2NhblsxXSA9IHJlc2V0X2dyYXk7Ci0gICAgICAgIGRlc3Rfc2NhblsyXSA9IHJlc2V0X2dyYXk7Ci0gICAgICB9Ci0gICAgICBkZXN0X3NjYW4gKz0gY29tcHM7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENvbnZlcnRCdWZmZXJfOGJwcE1hc2syUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCkgewotICBpbnQgY29tcHMgPSAoZHN0X2Zvcm1hdCAmIDB4ZmYpIC8gODsKLSAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgewotICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQ7Ci0gICAgdWludDhfdCBzcmNfcGl4ZWw7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgICBzcmNfcGl4ZWwgPSAqc3JjX3NjYW4rKzsKLSAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19waXhlbDsKLSAgICAgICpkZXN0X3NjYW4rKyA9IHNyY19waXhlbDsKLSAgICAgICpkZXN0X3NjYW4gPSBzcmNfcGl4ZWw7Ci0gICAgICBkZXN0X3NjYW4gKz0gY29tcHMgLSAyOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDb252ZXJ0QnVmZmVyXzFicHBQbHQyUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wKSB7Ci0gIGludCBjb21wcyA9IChkc3RfZm9ybWF0ICYgMHhmZikgLyA4OwotICB1aW50MzJfdCogc3JjX3BsdCA9IHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKTsKLSAgdWludDMyX3QgcGx0WzJdOwotICB1aW50OF90KiBiZ3JfcHRyID0gKHVpbnQ4X3QqKXBsdDsKLSAgaWYgKHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKLSAgICBwbHRbMF0gPSBGWENNWUtfVE9ESUIoc3JjX3BsdFswXSk7Ci0gICAgcGx0WzFdID0gRlhDTVlLX1RPRElCKHNyY19wbHRbMV0pOwotICB9IGVsc2UgewotICAgIGJncl9wdHJbMF0gPSBGWEFSR0JfQihzcmNfcGx0WzBdKTsKLSAgICBiZ3JfcHRyWzFdID0gRlhBUkdCX0coc3JjX3BsdFswXSk7Ci0gICAgYmdyX3B0clsyXSA9IEZYQVJHQl9SKHNyY19wbHRbMF0pOwotICAgIGJncl9wdHJbM10gPSBGWEFSR0JfQihzcmNfcGx0WzFdKTsKLSAgICBiZ3JfcHRyWzRdID0gRlhBUkdCX0coc3JjX3BsdFsxXSk7Ci0gICAgYmdyX3B0cls1XSA9IEZYQVJHQl9SKHNyY19wbHRbMV0pOwotICB9Ci0KLSAgaWYgKHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKLSAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKHNyY19wbHRbMF0pLCBGWFNZU19HZXRNVmFsdWUoc3JjX3BsdFswXSksCi0gICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldFlWYWx1ZShzcmNfcGx0WzBdKSwgRlhTWVNfR2V0S1ZhbHVlKHNyY19wbHRbMF0pLAotICAgICAgICAgICAgICAgICAgICAgICBiZ3JfcHRyWzJdLCBiZ3JfcHRyWzFdLCBiZ3JfcHRyWzBdKTsKLSAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKHNyY19wbHRbMV0pLCBGWFNZU19HZXRNVmFsdWUoc3JjX3BsdFsxXSksCi0gICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldFlWYWx1ZShzcmNfcGx0WzFdKSwgRlhTWVNfR2V0S1ZhbHVlKHNyY19wbHRbMV0pLAotICAgICAgICAgICAgICAgICAgICAgICBiZ3JfcHRyWzVdLCBiZ3JfcHRyWzRdLCBiZ3JfcHRyWzNdKTsKLSAgfQotCi0gIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKLSAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7Ci0gICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KTsKLSAgICBmb3IgKGludCBjb2wgPSBzcmNfbGVmdDsgY29sIDwgc3JjX2xlZnQgKyB3aWR0aDsgY29sKyspIHsKLSAgICAgIGlmIChzcmNfc2Nhbltjb2wgLyA4XSAmICgxIDw8ICg3IC0gY29sICUgOCkpKSB7Ci0gICAgICAgICpkZXN0X3NjYW4rKyA9IGJncl9wdHJbM107Ci0gICAgICAgICpkZXN0X3NjYW4rKyA9IGJncl9wdHJbNF07Ci0gICAgICAgICpkZXN0X3NjYW4gPSBiZ3JfcHRyWzVdOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKmRlc3Rfc2NhbisrID0gYmdyX3B0clswXTsKLSAgICAgICAgKmRlc3Rfc2NhbisrID0gYmdyX3B0clsxXTsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IGJncl9wdHJbMl07Ci0gICAgICB9Ci0gICAgICBkZXN0X3NjYW4gKz0gY29tcHMgLSAyOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDb252ZXJ0QnVmZmVyXzhicHBQbHQyUmdiKEZYRElCX0Zvcm1hdCBkc3RfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wKSB7Ci0gIGludCBjb21wcyA9IChkc3RfZm9ybWF0ICYgMHhmZikgLyA4OwotICB1aW50MzJfdCogc3JjX3BsdCA9IHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKTsKLSAgdWludDMyX3QgcGx0WzI1Nl07Ci0gIHVpbnQ4X3QqIGJncl9wdHIgPSAodWludDhfdCopcGx0OwotICBpZiAoIXBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0gICAgICAqYmdyX3B0cisrID0gRlhBUkdCX0Ioc3JjX3BsdFtpXSk7Ci0gICAgICAqYmdyX3B0cisrID0gRlhBUkdCX0coc3JjX3BsdFtpXSk7Ci0gICAgICAqYmdyX3B0cisrID0gRlhBUkdCX1Ioc3JjX3BsdFtpXSk7Ci0gICAgfQotICAgIGJncl9wdHIgPSAodWludDhfdCopcGx0OwotICB9Ci0KLSAgaWYgKHBTcmNCaXRtYXAtPklzQ215a0ltYWdlKCkpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0gICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoCi0gICAgICAgICAgRlhTWVNfR2V0Q1ZhbHVlKHNyY19wbHRbaV0pLCBGWFNZU19HZXRNVmFsdWUoc3JjX3BsdFtpXSksCi0gICAgICAgICAgRlhTWVNfR2V0WVZhbHVlKHNyY19wbHRbaV0pLCBGWFNZU19HZXRLVmFsdWUoc3JjX3BsdFtpXSksIGJncl9wdHJbMl0sCi0gICAgICAgICAgYmdyX3B0clsxXSwgYmdyX3B0clswXSk7Ci0gICAgICBiZ3JfcHRyICs9IDM7Ci0gICAgfQotICAgIGJncl9wdHIgPSAodWludDhfdCopcGx0OwotICB9Ci0KLSAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgewotICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQ7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgICB1aW50OF90KiBzcmNfcGl4ZWwgPSBiZ3JfcHRyICsgMyAqICgqc3JjX3NjYW4rKyk7Ci0gICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3BpeGVsKys7Ci0gICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3BpeGVsKys7Ci0gICAgICAqZGVzdF9zY2FuID0gKnNyY19waXhlbCsrOwotICAgICAgZGVzdF9zY2FuICs9IGNvbXBzIC0gMjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ29udmVydEJ1ZmZlcl8yNGJwcFJnYjJSZ2IyNCh1aW50OF90KiBkZXN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCkgewotICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7Ci0gICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0KLSAgICAgICAgcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIDM7Ci0gICAgRlhTWVNfbWVtY3B5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIHdpZHRoICogMyk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ29udmVydEJ1ZmZlcl8zMmJwcFJnYjJSZ2IyNCh1aW50OF90KiBkZXN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCkgewotICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7Ci0gICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyByb3cgKiBkZXN0X3BpdGNoOwotICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0KLSAgICAgICAgcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdykgKyBzcmNfbGVmdCAqIDQ7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICBzcmNfc2NhbisrOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDb252ZXJ0QnVmZmVyX1JnYjJSZ2IzMih1aW50OF90KiBkZXN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCkgewotICBpbnQgY29tcHMgPSBwU3JjQml0bWFwLT5HZXRCUFAoKSAvIDg7Ci0gIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKLSAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBkZXN0X2J1ZiArIHJvdyAqIGRlc3RfcGl0Y2g7Ci0gICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPQotICAgICAgICBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogY29tcHM7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICpkZXN0X3NjYW4rKyA9ICpzcmNfc2NhbisrOwotICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICBkZXN0X3NjYW4rKzsKLSAgICAgIHNyY19zY2FuICs9IGNvbXBzIC0gMzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ29udmVydEJ1ZmZlcl8zMmJwcENteWsyUmdiMzIodWludDhfdCogZGVzdF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3BpdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3ApIHsKLSAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgewotICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaDsKLSAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9Ci0gICAgICAgIHBTcmNCaXRtYXAtPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpICsgc3JjX2xlZnQgKiA0OwotICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKHNyY19zY2FuWzBdLCBzcmNfc2NhblsxXSwgc3JjX3NjYW5bMl0sIHNyY19zY2FuWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfc2NhblsyXSwgZGVzdF9zY2FuWzFdLCBkZXN0X3NjYW5bMF0pOwotICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICBzcmNfc2NhbiArPSA0OwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDb252ZXJ0QnVmZmVyKEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9waXRjaCwKLSAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAotICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVmdCwKLSAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCwKLSAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDMyX3QsIEZ4RnJlZURlbGV0ZXI+KiBwX3BhbCkgewotICBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCA9IHBTcmNCaXRtYXAtPkdldEZvcm1hdCgpOwotICBzd2l0Y2ggKGRlc3RfZm9ybWF0KSB7Ci0gICAgY2FzZSBGWERJQl9JbnZhbGlkOgotICAgIGNhc2UgRlhESUJfMWJwcENteWs6Ci0gICAgY2FzZSBGWERJQl8xYnBwTWFzazoKLSAgICBjYXNlIEZYRElCXzFicHBSZ2I6Ci0gICAgICBBU1NFUlQoZmFsc2UpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6IHsKLSAgICAgIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDEpIHsKLSAgICAgICAgaWYgKHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKSkgewotICAgICAgICAgIHJldHVybiBDb252ZXJ0QnVmZmVyXzFicHBQbHQyR3JheShkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3ApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb252ZXJ0QnVmZmVyXzFicHBNYXNrMkdyYXkoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3ApOwotICAgICAgfQotICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gOCkgewotICAgICAgICBpZiAocFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpKSB7Ci0gICAgICAgICAgcmV0dXJuIENvbnZlcnRCdWZmZXJfOGJwcFBsdDJHcmF5KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENvbnZlcnRCdWZmZXJfOGJwcE1hc2syR3JheShkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCk7Ci0gICAgICB9Ci0gICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA+PSAyNCkgewotICAgICAgICByZXR1cm4gQ29udmVydEJ1ZmZlcl9SZ2JPckNteWsyR3JheShkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3ApOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjYXNlIEZYRElCXzhicHBSZ2I6Ci0gICAgY2FzZSBGWERJQl84YnBwUmdiYTogewotICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gOCAmJiAhcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0QnVmZmVyKEZYRElCXzhicHBNYXNrLCBkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsIHBfcGFsKTsKLSAgICAgIH0KLSAgICAgIHBfcGFsLT5yZXNldChGWF9BbGxvYyh1aW50MzJfdCwgMjU2KSk7Ci0gICAgICBpZiAoKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gMSB8fCAoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDgpICYmCi0gICAgICAgICAgcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpKSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0QnVmZmVyX1BsdDJQbHRSZ2I4KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wYWwtPmdldCgpKTsKLSAgICAgIH0KLSAgICAgIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID49IDI0KSB7Ci0gICAgICAgIHJldHVybiBDb252ZXJ0QnVmZmVyX1JnYjJQbHRSZ2I4KGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjQml0bWFwLCBzcmNfbGVmdCwgc3JjX3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wYWwtPmdldCgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgY2FzZSBGWERJQl9SZ2I6Ci0gICAgY2FzZSBGWERJQl9SZ2JhOiB7Ci0gICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSAxKSB7Ci0gICAgICAgIGlmIChwU3JjQml0bWFwLT5HZXRQYWxldHRlKCkpIHsKLSAgICAgICAgICByZXR1cm4gQ29udmVydEJ1ZmZlcl8xYnBwUGx0MlJnYihkZXN0X2Zvcm1hdCwgZGVzdF9idWYsIGRlc3RfcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3RvcCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENvbnZlcnRCdWZmZXJfMWJwcE1hc2syUmdiKGRlc3RfZm9ybWF0LCBkZXN0X2J1ZiwgZGVzdF9waXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3RvcCk7Ci0gICAgICB9Ci0gICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSA4KSB7Ci0gICAgICAgIGlmIChwU3JjQml0bWFwLT5HZXRQYWxldHRlKCkpIHsKLSAgICAgICAgICByZXR1cm4gQ29udmVydEJ1ZmZlcl84YnBwUGx0MlJnYihkZXN0X2Zvcm1hdCwgZGVzdF9idWYsIGRlc3RfcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3RvcCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENvbnZlcnRCdWZmZXJfOGJwcE1hc2syUmdiKGRlc3RfZm9ybWF0LCBkZXN0X2J1ZiwgZGVzdF9waXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHBTcmNCaXRtYXAsIHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3RvcCk7Ci0gICAgICB9Ci0gICAgICBpZiAoKHNyY19mb3JtYXQgJiAweGZmKSA9PSAyNCkgewotICAgICAgICByZXR1cm4gQ29udmVydEJ1ZmZlcl8yNGJwcFJnYjJSZ2IyNChkZXN0X2J1ZiwgZGVzdF9waXRjaCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3ApOwotICAgICAgfQotICAgICAgaWYgKChzcmNfZm9ybWF0ICYgMHhmZikgPT0gMzIpIHsKLSAgICAgICAgcmV0dXJuIENvbnZlcnRCdWZmZXJfMzJicHBSZ2IyUmdiMjQoZGVzdF9idWYsIGRlc3RfcGl0Y2gsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNCaXRtYXAsIHNyY19sZWZ0LCBzcmNfdG9wKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgY2FzZSBGWERJQl9BcmdiOgotICAgIGNhc2UgRlhESUJfUmdiMzI6IHsKLSAgICAgIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDEpIHsKLSAgICAgICAgaWYgKHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKSkgewotICAgICAgICAgIHJldHVybiBDb252ZXJ0QnVmZmVyXzFicHBQbHQyUmdiKGRlc3RfZm9ybWF0LCBkZXN0X2J1ZiwgZGVzdF9waXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfdG9wKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ29udmVydEJ1ZmZlcl8xYnBwTWFzazJSZ2IoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBkZXN0X3BpdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfdG9wKTsKLSAgICAgIH0KLSAgICAgIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID09IDgpIHsKLSAgICAgICAgaWYgKHBTcmNCaXRtYXAtPkdldFBhbGV0dGUoKSkgewotICAgICAgICAgIHJldHVybiBDb252ZXJ0QnVmZmVyXzhicHBQbHQyUmdiKGRlc3RfZm9ybWF0LCBkZXN0X2J1ZiwgZGVzdF9waXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfdG9wKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ29udmVydEJ1ZmZlcl84YnBwTWFzazJSZ2IoZGVzdF9mb3JtYXQsIGRlc3RfYnVmLCBkZXN0X3BpdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcCwgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfdG9wKTsKLSAgICAgIH0KLSAgICAgIGlmICgoc3JjX2Zvcm1hdCAmIDB4ZmYpID49IDI0KSB7Ci0gICAgICAgIGlmIChzcmNfZm9ybWF0ICYgMHgwNDAwKSB7Ci0gICAgICAgICAgcmV0dXJuIENvbnZlcnRCdWZmZXJfMzJicHBDbXlrMlJnYjMyKGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBwU3JjQml0bWFwLCBzcmNfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3RvcCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENvbnZlcnRCdWZmZXJfUmdiMlJnYjMyKGRlc3RfYnVmLCBkZXN0X3BpdGNoLCB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3ApOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IENGWF9ESUJTb3VyY2U6OkNsb25lQ29udmVydCgKLSAgICBGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQpIGNvbnN0IHsKLSAgaWYgKGRlc3RfZm9ybWF0ID09IEdldEZvcm1hdCgpKQotICAgIHJldHVybiBDbG9uZShudWxscHRyKTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBwQ2xvbmUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0RJQml0bWFwPigpOwotICBpZiAoIXBDbG9uZS0+Q3JlYXRlKG1fV2lkdGgsIG1fSGVpZ2h0LCBkZXN0X2Zvcm1hdCkpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgQ0ZYX01heWJlT3duZWQ8Q0ZYX0RJQml0bWFwPiBwU3JjQWxwaGE7Ci0gIGlmIChIYXNBbHBoYSgpKSB7Ci0gICAgaWYgKEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpCi0gICAgICBwU3JjQWxwaGEgPSBDbG9uZUFscGhhTWFzaygpOwotICAgIGVsc2UKLSAgICAgIHBTcmNBbHBoYSA9IG1fcEFscGhhTWFzazsKLQotICAgIGlmICghcFNyY0FscGhhKQotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgYm9vbCByZXQgPSB0cnVlOwotICBpZiAoZGVzdF9mb3JtYXQgJiAweDAyMDApIHsKLSAgICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYikgewotICAgICAgcmV0ID0gcFNyY0FscGhhCi0gICAgICAgICAgICAgICAgPyBwQ2xvbmUtPkxvYWRDaGFubmVsKEZYRElCX0FscGhhLCBwU3JjQWxwaGEuR2V0KCksIEZYRElCX0FscGhhKQotICAgICAgICAgICAgICAgIDogcENsb25lLT5Mb2FkQ2hhbm5lbChGWERJQl9BbHBoYSwgMHhmZik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldCA9IHBDbG9uZS0+U2V0QWxwaGFNYXNrKHBTcmNBbHBoYS5HZXQoKSk7Ci0gICAgfQotICB9Ci0gIGlmICghcmV0KQotICAgIHJldHVybiBudWxscHRyOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjx1aW50MzJfdCwgRnhGcmVlRGVsZXRlcj4gcGFsXzhicHA7Ci0gIGlmICghQ29udmVydEJ1ZmZlcihkZXN0X2Zvcm1hdCwgcENsb25lLT5HZXRCdWZmZXIoKSwgcENsb25lLT5HZXRQaXRjaCgpLAotICAgICAgICAgICAgICAgICAgICAgbV9XaWR0aCwgbV9IZWlnaHQsIHRoaXMsIDAsIDAsICZwYWxfOGJwcCkpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBpZiAocGFsXzhicHApCi0gICAgcENsb25lLT5TZXRQYWxldHRlKHBhbF84YnBwLmdldCgpKTsKLQotICByZXR1cm4gcENsb25lOwotfQotCi1ib29sIENGWF9ESUJpdG1hcDo6Q29udmVydEZvcm1hdChGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQpIHsKLSAgRlhESUJfRm9ybWF0IHNyY19mb3JtYXQgPSBHZXRGb3JtYXQoKTsKLSAgaWYgKGRlc3RfZm9ybWF0ID09IHNyY19mb3JtYXQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCXzhicHBNYXNrICYmIHNyY19mb3JtYXQgPT0gRlhESUJfOGJwcFJnYiAmJgotICAgICAgIW1fcFBhbGV0dGUpIHsKLSAgICBtX0FscGhhRmxhZyA9IDE7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKGRlc3RfZm9ybWF0ID09IEZYRElCX0FyZ2IgJiYgc3JjX2Zvcm1hdCA9PSBGWERJQl9SZ2IzMikgewotICAgIG1fQWxwaGFGbGFnID0gMjsKLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKLSAgICAgIHVpbnQ4X3QqIHNjYW5saW5lID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaCArIDM7Ci0gICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgewotICAgICAgICAqc2NhbmxpbmUgPSAweGZmOwotICAgICAgICBzY2FubGluZSArPSA0OwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpbnQgZGVzdF9icHAgPSBkZXN0X2Zvcm1hdCAmIDB4ZmY7Ci0gIGludCBkZXN0X3BpdGNoID0gKGRlc3RfYnBwICogbV9XaWR0aCArIDMxKSAvIDMyICogNDsKLSAgdWludDhfdCogZGVzdF9idWYgPSBGWF9UcnlBbGxvYyh1aW50OF90LCBkZXN0X3BpdGNoICogbV9IZWlnaHQgKyA0KTsKLSAgaWYgKCFkZXN0X2J1ZikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBDRlhfRElCaXRtYXAqIHBBbHBoYU1hc2sgPSBudWxscHRyOwotICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfQXJnYikgewotICAgIEZYU1lTX21lbXNldChkZXN0X2J1ZiwgMHhmZiwgZGVzdF9waXRjaCAqIG1fSGVpZ2h0ICsgNCk7Ci0gICAgaWYgKG1fcEFscGhhTWFzaykgewotICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7Ci0gICAgICAgIHVpbnQ4X3QqIHBEc3RTY2FubGluZSA9IGRlc3RfYnVmICsgcm93ICogZGVzdF9waXRjaCArIDM7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBTcmNTY2FubGluZSA9IG1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKLSAgICAgICAgICAqcERzdFNjYW5saW5lID0gKnBTcmNTY2FubGluZSsrOwotICAgICAgICAgIHBEc3RTY2FubGluZSArPSA0OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgaWYgKGRlc3RfZm9ybWF0ICYgMHgwMjAwKSB7Ci0gICAgaWYgKHNyY19mb3JtYXQgPT0gRlhESUJfQXJnYikgewotICAgICAgcEFscGhhTWFzayA9IENsb25lQWxwaGFNYXNrKCkucmVsZWFzZSgpOwotICAgICAgaWYgKCFwQWxwaGFNYXNrKSB7Ci0gICAgICAgIEZYX0ZyZWUoZGVzdF9idWYpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghbV9wQWxwaGFNYXNrKSB7Ci0gICAgICAgIGlmICghQnVpbGRBbHBoYU1hc2soKSkgewotICAgICAgICAgIEZYX0ZyZWUoZGVzdF9idWYpOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBwQWxwaGFNYXNrID0gbV9wQWxwaGFNYXNrOwotICAgICAgICBtX3BBbHBoYU1hc2sgPSBudWxscHRyOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcEFscGhhTWFzayA9IG1fcEFscGhhTWFzazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgYm9vbCByZXQgPSBmYWxzZTsKLSAgc3RkOjp1bmlxdWVfcHRyPHVpbnQzMl90LCBGeEZyZWVEZWxldGVyPiBwYWxfOGJwcDsKLSAgcmV0ID0gQ29udmVydEJ1ZmZlcihkZXN0X2Zvcm1hdCwgZGVzdF9idWYsIGRlc3RfcGl0Y2gsIG1fV2lkdGgsIG1fSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIDAsIDAsICZwYWxfOGJwcCk7Ci0gIGlmICghcmV0KSB7Ci0gICAgaWYgKHBBbHBoYU1hc2sgIT0gbV9wQWxwaGFNYXNrKQotICAgICAgZGVsZXRlIHBBbHBoYU1hc2s7Ci0gICAgRlhfRnJlZShkZXN0X2J1Zik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChtX3BBbHBoYU1hc2sgJiYgcEFscGhhTWFzayAhPSBtX3BBbHBoYU1hc2spCi0gICAgZGVsZXRlIG1fcEFscGhhTWFzazsKLSAgbV9wQWxwaGFNYXNrID0gcEFscGhhTWFzazsKLSAgbV9wUGFsZXR0ZSA9IHN0ZDo6bW92ZShwYWxfOGJwcCk7Ci0gIGlmICghbV9iRXh0QnVmKQotICAgIEZYX0ZyZWUobV9wQnVmZmVyKTsKLSAgbV9iRXh0QnVmID0gZmFsc2U7Ci0gIG1fcEJ1ZmZlciA9IGRlc3RfYnVmOwotICBtX2JwcCA9ICh1aW50OF90KWRlc3RfZm9ybWF0OwotICBtX0FscGhhRmxhZyA9ICh1aW50OF90KShkZXN0X2Zvcm1hdCA+PiA4KTsKLSAgbV9QaXRjaCA9IGRlc3RfcGl0Y2g7Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2RpYi9meF9kaWJfZW5naW5lLmNwcCBiL2NvcmUvZnhnZS9kaWIvZnhfZGliX2VuZ2luZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMDRhYWMuLjAwMDAwMDAKLS0tIGEvY29yZS9meGdlL2RpYi9meF9kaWJfZW5naW5lLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2RpYl9pbnQuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotCi1uYW1lc3BhY2UgewotCi1ib29sIFNvdXJjZVNpemVXaXRoaW5MaW1pdChpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgY29uc3QgaW50IGtNYXhQcm9ncmVzc2l2ZVN0cmV0Y2hQaXhlbHMgPSAxMDAwMDAwOwotICByZXR1cm4gIWhlaWdodCB8fCB3aWR0aCA8IGtNYXhQcm9ncmVzc2l2ZVN0cmV0Y2hQaXhlbHMgLyBoZWlnaHQ7Ci19Ci0KLUZYRElCX0Zvcm1hdCBHZXRTdHJldGNoZWRGb3JtYXQoY29uc3QgQ0ZYX0RJQlNvdXJjZSYgc3JjKSB7Ci0gIEZYRElCX0Zvcm1hdCBmb3JtYXQgPSBzcmMuR2V0Rm9ybWF0KCk7Ci0gIGlmIChmb3JtYXQgPT0gRlhESUJfMWJwcE1hc2spCi0gICAgcmV0dXJuIEZYRElCXzhicHBNYXNrOwotICBpZiAoZm9ybWF0ID09IEZYRElCXzFicHBSZ2IpCi0gICAgcmV0dXJuIEZYRElCXzhicHBSZ2I7Ci0gIGlmIChmb3JtYXQgPT0gRlhESUJfOGJwcFJnYiAmJiBzcmMuR2V0UGFsZXR0ZSgpKQotICAgIHJldHVybiBGWERJQl9SZ2I7Ci0gIHJldHVybiBmb3JtYXQ7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1DV2VpZ2h0VGFibGU6OkNXZWlnaHRUYWJsZSgpCi0gICAgOiBtX0Rlc3RNaW4oMCksCi0gICAgICBtX0l0ZW1TaXplKDApLAotICAgICAgbV9wV2VpZ2h0VGFibGVzKG51bGxwdHIpLAotICAgICAgbV9kd1dlaWdodFRhYmxlc1NpemUoMCkge30KLQotQ1dlaWdodFRhYmxlOjp+Q1dlaWdodFRhYmxlKCkgewotICBGWF9GcmVlKG1fcFdlaWdodFRhYmxlcyk7Ci19Ci0KLXNpemVfdCBDV2VpZ2h0VGFibGU6OkdldFBpeGVsV2VpZ2h0U2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fSXRlbVNpemUgLyBzaXplb2YoaW50KSAtIDI7Ci19Ci0KLWJvb2wgQ1dlaWdodFRhYmxlOjpDYWxjKGludCBkZXN0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X21pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X21heCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19taW4sCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX21heCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykgewotICBGWF9GcmVlKG1fcFdlaWdodFRhYmxlcyk7Ci0gIG1fcFdlaWdodFRhYmxlcyA9IG51bGxwdHI7Ci0gIG1fZHdXZWlnaHRUYWJsZXNTaXplID0gMDsKLSAgY29uc3QgZG91YmxlIHNjYWxlID0gKEZYX0ZMT0FUKXNyY19sZW4gLyAoRlhfRkxPQVQpZGVzdF9sZW47Ci0gIGNvbnN0IGRvdWJsZSBiYXNlID0gZGVzdF9sZW4gPCAwID8gKEZYX0ZMT0FUKShzcmNfbGVuKSA6IDA7Ci0gIGNvbnN0IGludCBleHRfc2l6ZSA9IGZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCA/IDMgOiAxOwotICBtX0l0ZW1TaXplID0KLSAgICAgIHNpemVvZihpbnQpICogMiArCi0gICAgICAoaW50KShzaXplb2YoaW50KSAqIChGWFNZU19jZWlsKEZYU1lTX2ZhYnMoKEZYX0ZMT0FUKXNjYWxlKSkgKyBleHRfc2l6ZSkpOwotICBtX0Rlc3RNaW4gPSBkZXN0X21pbjsKLSAgaWYgKChkZXN0X21heCAtIGRlc3RfbWluKSA+IChpbnQpKCgxVSA8PCAzMCkgLSA0KSAvIG1fSXRlbVNpemUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG1fZHdXZWlnaHRUYWJsZXNTaXplID0gKGRlc3RfbWF4IC0gZGVzdF9taW4pICogbV9JdGVtU2l6ZSArIDQ7Ci0gIG1fcFdlaWdodFRhYmxlcyA9IEZYX1RyeUFsbG9jKHVpbnQ4X3QsIG1fZHdXZWlnaHRUYWJsZXNTaXplKTsKLSAgaWYgKCFtX3BXZWlnaHRUYWJsZXMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICgoZmxhZ3MgJiBGWERJQl9OT1NNT09USCkgIT0gMCB8fCBGWFNZU19mYWJzKChGWF9GTE9BVClzY2FsZSkgPCAxLjBmKSB7Ci0gICAgZm9yIChpbnQgZGVzdF9waXhlbCA9IGRlc3RfbWluOyBkZXN0X3BpeGVsIDwgZGVzdF9tYXg7IGRlc3RfcGl4ZWwrKykgewotICAgICAgUGl4ZWxXZWlnaHQmIHBpeGVsX3dlaWdodHMgPSAqR2V0UGl4ZWxXZWlnaHQoZGVzdF9waXhlbCk7Ci0gICAgICBkb3VibGUgc3JjX3BvcyA9IGRlc3RfcGl4ZWwgKiBzY2FsZSArIHNjYWxlIC8gMiArIGJhc2U7Ci0gICAgICBpZiAoZmxhZ3MgJiBGWERJQl9JTlRFUlBPTCkgewotICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPQotICAgICAgICAgICAgKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX3BvcyAtIDEuMGYgLyAyKTsKLSAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19wb3MgKyAxLjBmIC8gMik7Ci0gICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPCBzcmNfbWluKSB7Ci0gICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3JjX21pbjsKLSAgICAgICAgfQotICAgICAgICBpZiAocGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA+PSBzcmNfbWF4KSB7Ci0gICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IHNyY19tYXggLSAxOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCkgewotICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gNjU1MzY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV0gPSBGWFNZU19yb3VuZCgKLSAgICAgICAgICAgICAgKEZYX0ZMT0FUKShzcmNfcG9zIC0gcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0IC0gMS4wZiAvIDIpICoKLSAgICAgICAgICAgICAgNjU1MzYpOwotICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gNjU1MzYgLSBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1sxXTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChmbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKLSAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0KLSAgICAgICAgICAgIChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19wb3MgLSAxLjBmIC8gMik7Ci0gICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSAoaW50KUZYU1lTX2Zsb29yKChGWF9GTE9BVClzcmNfcG9zICsgMS4wZiAvIDIpOwotICAgICAgICBpbnQgc3RhcnQgPSBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgLSAxOwotICAgICAgICBpbnQgZW5kID0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCArIDE7Ci0gICAgICAgIGlmIChzdGFydCA8IHNyY19taW4pIHsKLSAgICAgICAgICBzdGFydCA9IHNyY19taW47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGVuZCA+PSBzcmNfbWF4KSB7Ci0gICAgICAgICAgZW5kID0gc3JjX21heCAtIDE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA8IHNyY19taW4pIHsKLSAgICAgICAgICBzcmNfcG9zICs9IHNyY19taW4gLSBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQ7Ci0gICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3JjX21pbjsKLSAgICAgICAgfQotICAgICAgICBpZiAocGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA+PSBzcmNfbWF4KSB7Ci0gICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IHNyY19tYXggLSAxOwotICAgICAgICB9Ci0gICAgICAgIGludCB3ZWlnaHQ7Ci0gICAgICAgIHdlaWdodCA9IEZYU1lTX3JvdW5kKAotICAgICAgICAgICAgKEZYX0ZMT0FUKShzcmNfcG9zIC0gcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0IC0gMS4wZiAvIDIpICogMjU2KTsKLSAgICAgICAgaWYgKHN0YXJ0ID09IGVuZCkgewotICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0KLSAgICAgICAgICAgICAgKFNEUF9UYWJsZVsyNTYgKyB3ZWlnaHRdICsgU0RQX1RhYmxlW3dlaWdodF0gKwotICAgICAgICAgICAgICAgU0RQX1RhYmxlWzI1NiAtIHdlaWdodF0gKyBTRFBfVGFibGVbNTEyIC0gd2VpZ2h0XSkKLSAgICAgICAgICAgICAgPDwgODsKLSAgICAgICAgfSBlbHNlIGlmICgoc3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ICYmCi0gICAgICAgICAgICAgICAgICAgIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCB8fAotICAgICAgICAgICAgICAgICAgICAgZW5kID09IHBpeGVsX3dlaWdodHMubV9TcmNFbmQpICYmCi0gICAgICAgICAgICAgICAgICAgIHN0YXJ0IDwgZW5kKSB8fAotICAgICAgICAgICAgICAgICAgIChzdGFydCA8IHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCAmJgotICAgICAgICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCAmJgotICAgICAgICAgICAgICAgICAgICBlbmQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCkpIHsKLSAgICAgICAgICBpZiAoc3RhcnQgPCBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQpIHsKLSAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gU0RQX1RhYmxlWzI1NiArIHdlaWdodF0gPDwgODsKLSAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzFdID0KLSAgICAgICAgICAgICAgICAoU0RQX1RhYmxlW3dlaWdodF0gKyBTRFBfVGFibGVbMjU2IC0gd2VpZ2h0XSArCi0gICAgICAgICAgICAgICAgIFNEUF9UYWJsZVs1MTIgLSB3ZWlnaHRdKQotICAgICAgICAgICAgICAgIDw8IDg7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCkgewotICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9Ci0gICAgICAgICAgICAgICAgICAoU0RQX1RhYmxlWzI1NiArIHdlaWdodF0gKyBTRFBfVGFibGVbd2VpZ2h0XSArCi0gICAgICAgICAgICAgICAgICAgU0RQX1RhYmxlWzI1NiAtIHdlaWdodF0pCi0gICAgICAgICAgICAgICAgICA8PCA4OwotICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1sxXSA9IFNEUF9UYWJsZVs1MTIgLSB3ZWlnaHRdIDw8IDg7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9Ci0gICAgICAgICAgICAgICAgICAoU0RQX1RhYmxlWzI1NiArIHdlaWdodF0gKyBTRFBfVGFibGVbd2VpZ2h0XSkgPDwgODsKLSAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV0gPQotICAgICAgICAgICAgICAgICAgKFNEUF9UYWJsZVsyNTYgLSB3ZWlnaHRdICsgU0RQX1RhYmxlWzUxMiAtIHdlaWdodF0pIDw8IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCkgewotICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IGVuZDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKHN0YXJ0IDwgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0KSB7Ci0gICAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBzdGFydDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RhcnQgPT0gcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ICYmCi0gICAgICAgICAgICAgICAgICAgc3RhcnQgPCBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kICYmCi0gICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA8IGVuZCkgewotICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0KLSAgICAgICAgICAgICAgKFNEUF9UYWJsZVsyNTYgKyB3ZWlnaHRdICsgU0RQX1RhYmxlW3dlaWdodF0pIDw8IDg7Ci0gICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMV0gPSBTRFBfVGFibGVbMjU2IC0gd2VpZ2h0XSA8PCA4OwotICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzJdID0gU0RQX1RhYmxlWzUxMiAtIHdlaWdodF0gPDwgODsKLSAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gZW5kOwotICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0IDwgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ICYmCi0gICAgICAgICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0IDwgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCAmJgotICAgICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPT0gZW5kKSB7Ci0gICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMF0gPSBTRFBfVGFibGVbMjU2ICsgd2VpZ2h0XSA8PCA4OwotICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzFdID0gU0RQX1RhYmxlW3dlaWdodF0gPDwgODsKLSAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1syXSA9Ci0gICAgICAgICAgICAgIChTRFBfVGFibGVbMjU2IC0gd2VpZ2h0XSArIFNEUF9UYWJsZVs1MTIgLSB3ZWlnaHRdKSA8PCA4OwotICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IHN0YXJ0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzBdID0gU0RQX1RhYmxlWzI1NiArIHdlaWdodF0gPDwgODsKLSAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1sxXSA9IFNEUF9UYWJsZVt3ZWlnaHRdIDw8IDg7Ci0gICAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1dlaWdodHNbMl0gPSBTRFBfVGFibGVbMjU2IC0gd2VpZ2h0XSA8PCA4OwotICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzWzNdID0gU0RQX1RhYmxlWzUxMiAtIHdlaWdodF0gPDwgODsKLSAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBzdGFydDsKLSAgICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gZW5kOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0KLSAgICAgICAgICAgIChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19wb3MpOwotICAgICAgICBpZiAocGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0IDwgc3JjX21pbikgewotICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNTdGFydCA9IHNyY19taW47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPj0gc3JjX21heCkgewotICAgICAgICAgIHBpeGVsX3dlaWdodHMubV9TcmNFbmQgPSBzcmNfbWF4IC0gMTsKLSAgICAgICAgfQotICAgICAgICBwaXhlbF93ZWlnaHRzLm1fV2VpZ2h0c1swXSA9IDY1NTM2OwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGZvciAoaW50IGRlc3RfcGl4ZWwgPSBkZXN0X21pbjsgZGVzdF9waXhlbCA8IGRlc3RfbWF4OyBkZXN0X3BpeGVsKyspIHsKLSAgICBQaXhlbFdlaWdodCYgcGl4ZWxfd2VpZ2h0cyA9ICpHZXRQaXhlbFdlaWdodChkZXN0X3BpeGVsKTsKLSAgICBkb3VibGUgc3JjX3N0YXJ0ID0gZGVzdF9waXhlbCAqIHNjYWxlICsgYmFzZTsKLSAgICBkb3VibGUgc3JjX2VuZCA9IHNyY19zdGFydCArIHNjYWxlOwotICAgIGludCBzdGFydF9pLCBlbmRfaTsKLSAgICBpZiAoc3JjX3N0YXJ0IDwgc3JjX2VuZCkgewotICAgICAgc3RhcnRfaSA9IChpbnQpRlhTWVNfZmxvb3IoKEZYX0ZMT0FUKXNyY19zdGFydCk7Ci0gICAgICBlbmRfaSA9IChpbnQpRlhTWVNfY2VpbCgoRlhfRkxPQVQpc3JjX2VuZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0YXJ0X2kgPSAoaW50KUZYU1lTX2Zsb29yKChGWF9GTE9BVClzcmNfZW5kKTsKLSAgICAgIGVuZF9pID0gKGludClGWFNZU19jZWlsKChGWF9GTE9BVClzcmNfc3RhcnQpOwotICAgIH0KLSAgICBpZiAoc3RhcnRfaSA8IHNyY19taW4pIHsKLSAgICAgIHN0YXJ0X2kgPSBzcmNfbWluOwotICAgIH0KLSAgICBpZiAoZW5kX2kgPj0gc3JjX21heCkgewotICAgICAgZW5kX2kgPSBzcmNfbWF4IC0gMTsKLSAgICB9Ci0gICAgaWYgKHN0YXJ0X2kgPiBlbmRfaSkgewotICAgICAgaWYgKHN0YXJ0X2kgPj0gc3JjX21heCkgewotICAgICAgICBzdGFydF9pID0gc3JjX21heCAtIDE7Ci0gICAgICB9Ci0gICAgICBwaXhlbF93ZWlnaHRzLm1fU3JjU3RhcnQgPSBzdGFydF9pOwotICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZCA9IHN0YXJ0X2k7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY1N0YXJ0ID0gc3RhcnRfaTsKLSAgICBwaXhlbF93ZWlnaHRzLm1fU3JjRW5kID0gZW5kX2k7Ci0gICAgZm9yIChpbnQgaiA9IHN0YXJ0X2k7IGogPD0gZW5kX2k7IGorKykgewotICAgICAgZG91YmxlIGRlc3Rfc3RhcnQgPSAoKEZYX0ZMT0FUKWogLSBiYXNlKSAvIHNjYWxlOwotICAgICAgZG91YmxlIGRlc3RfZW5kID0gKChGWF9GTE9BVCkoaiArIDEpIC0gYmFzZSkgLyBzY2FsZTsKLSAgICAgIGlmIChkZXN0X3N0YXJ0ID4gZGVzdF9lbmQpIHsKLSAgICAgICAgZG91YmxlIHRlbXAgPSBkZXN0X3N0YXJ0OwotICAgICAgICBkZXN0X3N0YXJ0ID0gZGVzdF9lbmQ7Ci0gICAgICAgIGRlc3RfZW5kID0gdGVtcDsKLSAgICAgIH0KLSAgICAgIGRvdWJsZSBhcmVhX3N0YXJ0ID0gZGVzdF9zdGFydCA+IChGWF9GTE9BVCkoZGVzdF9waXhlbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZGVzdF9zdGFydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoRlhfRkxPQVQpKGRlc3RfcGl4ZWwpOwotICAgICAgZG91YmxlIGFyZWFfZW5kID0gZGVzdF9lbmQgPiAoRlhfRkxPQVQpKGRlc3RfcGl4ZWwgKyAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKEZYX0ZMT0FUKShkZXN0X3BpeGVsICsgMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRlc3RfZW5kOwotICAgICAgZG91YmxlIHdlaWdodCA9IGFyZWFfc3RhcnQgPj0gYXJlYV9lbmQgPyAwLjBmIDogYXJlYV9lbmQgLSBhcmVhX3N0YXJ0OwotICAgICAgaWYgKHdlaWdodCA9PSAwICYmIGogPT0gZW5kX2kpIHsKLSAgICAgICAgcGl4ZWxfd2VpZ2h0cy5tX1NyY0VuZC0tOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHNpemVfdCBpZHggPSBqIC0gc3RhcnRfaTsKLSAgICAgIGlmIChpZHggPj0gR2V0UGl4ZWxXZWlnaHRTaXplKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIHBpeGVsX3dlaWdodHMubV9XZWlnaHRzW2lkeF0gPSBGWFNZU19yb3VuZCgoRlhfRkxPQVQpKHdlaWdodCAqIDY1NTM2KSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1QaXhlbFdlaWdodCogQ1dlaWdodFRhYmxlOjpHZXRQaXhlbFdlaWdodChpbnQgcGl4ZWwpIGNvbnN0IHsKLSAgQVNTRVJUKHBpeGVsID49IG1fRGVzdE1pbik7Ci0gIHJldHVybiByZWludGVycHJldF9jYXN0PFBpeGVsV2VpZ2h0Kj4obV9wV2VpZ2h0VGFibGVzICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGl4ZWwgLSBtX0Rlc3RNaW4pICogbV9JdGVtU2l6ZSk7Ci19Ci0KLWludCogQ1dlaWdodFRhYmxlOjpHZXRWYWx1ZUZyb21QaXhlbFdlaWdodChQaXhlbFdlaWdodCogcFdlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0IHsKLSAgaWYgKGluZGV4IDwgcFdlaWdodC0+bV9TcmNTdGFydCkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBzaXplX3QgaWR4ID0gaW5kZXggLSBwV2VpZ2h0LT5tX1NyY1N0YXJ0OwotICByZXR1cm4gaWR4IDwgR2V0UGl4ZWxXZWlnaHRTaXplKCkgPyAmcFdlaWdodC0+bV9XZWlnaHRzW2lkeF0gOiBudWxscHRyOwotfQotCi1DU3RyZXRjaEVuZ2luZTo6Q1N0cmV0Y2hFbmdpbmUoSUZYX1NjYW5saW5lQ29tcG9zZXIqIHBEZXN0Qml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCYgY2xpcF9yZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKSB7Ci0gIG1fU3RhdGUgPSAwOwotICBtX0Rlc3RGb3JtYXQgPSBkZXN0X2Zvcm1hdDsKLSAgbV9EZXN0QnBwID0gZGVzdF9mb3JtYXQgJiAweGZmOwotICBtX1NyY0JwcCA9IHBTcmNCaXRtYXAtPkdldEZvcm1hdCgpICYgMHhmZjsKLSAgbV9iSGFzQWxwaGEgPSBwU3JjQml0bWFwLT5HZXRGb3JtYXQoKSAmIDB4MjAwOwotICBtX3BTcmNQYWxldHRlID0gcFNyY0JpdG1hcC0+R2V0UGFsZXR0ZSgpOwotICBtX3BEZXN0Qml0bWFwID0gcERlc3RCaXRtYXA7Ci0gIG1fRGVzdFdpZHRoID0gZGVzdF93aWR0aDsKLSAgbV9EZXN0SGVpZ2h0ID0gZGVzdF9oZWlnaHQ7Ci0gIG1fcEludGVyQnVmID0gbnVsbHB0cjsKLSAgbV9wRXh0cmFBbHBoYUJ1ZiA9IG51bGxwdHI7Ci0gIG1fcERlc3RNYXNrU2NhbmxpbmUgPSBudWxscHRyOwotICBtX0Rlc3RDbGlwID0gY2xpcF9yZWN0OwotICB1aW50MzJfdCBzaXplID0gY2xpcF9yZWN0LldpZHRoKCk7Ci0gIGlmIChzaXplICYmIG1fRGVzdEJwcCA+IChpbnQpKElOVF9NQVggLyBzaXplKSkgewotICAgIHJldHVybjsKLSAgfQotICBzaXplICo9IG1fRGVzdEJwcDsKLSAgaWYgKHNpemUgPiBJTlRfTUFYIC0gMzEpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgc2l6ZSArPSAzMTsKLSAgc2l6ZSA9IHNpemUgLyAzMiAqIDQ7Ci0gIG1fcERlc3RTY2FubGluZSA9IEZYX1RyeUFsbG9jKHVpbnQ4X3QsIHNpemUpOwotICBpZiAoIW1fcERlc3RTY2FubGluZSkgewotICAgIHJldHVybjsKLSAgfQotICBpZiAoZGVzdF9mb3JtYXQgPT0gRlhESUJfUmdiMzIpIHsKLSAgICBGWFNZU19tZW1zZXQobV9wRGVzdFNjYW5saW5lLCAyNTUsIHNpemUpOwotICB9Ci0gIG1fSW50ZXJQaXRjaCA9IChtX0Rlc3RDbGlwLldpZHRoKCkgKiBtX0Rlc3RCcHAgKyAzMSkgLyAzMiAqIDQ7Ci0gIG1fRXh0cmFNYXNrUGl0Y2ggPSAobV9EZXN0Q2xpcC5XaWR0aCgpICogOCArIDMxKSAvIDMyICogNDsKLSAgbV9wSW50ZXJCdWYgPSBudWxscHRyOwotICBtX3BTb3VyY2UgPSBwU3JjQml0bWFwOwotICBtX1NyY1dpZHRoID0gcFNyY0JpdG1hcC0+R2V0V2lkdGgoKTsKLSAgbV9TcmNIZWlnaHQgPSBwU3JjQml0bWFwLT5HZXRIZWlnaHQoKTsKLSAgbV9TcmNQaXRjaCA9IChtX1NyY1dpZHRoICogbV9TcmNCcHAgKyAzMSkgLyAzMiAqIDQ7Ci0gIGlmICgoZmxhZ3MgJiBGWERJQl9OT1NNT09USCkgPT0gMCkgewotICAgIGJvb2wgYkludGVycG9sID0gZmxhZ3MgJiBGWERJQl9JTlRFUlBPTCB8fCBmbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0w7Ci0gICAgaWYgKCFiSW50ZXJwb2wgJiYgRlhTWVNfYWJzKGRlc3Rfd2lkdGgpICE9IDAgJiYKLSAgICAgICAgRlhTWVNfYWJzKGRlc3RfaGVpZ2h0KSAvIDggPCBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KG1fU3JjV2lkdGgpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9TcmNIZWlnaHQgLyBGWFNZU19hYnMoZGVzdF93aWR0aCkpIHsKLSAgICAgIGZsYWdzID0gRlhESUJfSU5URVJQT0w7Ci0gICAgfQotICAgIG1fRmxhZ3MgPSBmbGFnczsKLSAgfSBlbHNlIHsKLSAgICBtX0ZsYWdzID0gRlhESUJfTk9TTU9PVEg7Ci0gICAgaWYgKGZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkgewotICAgICAgbV9GbGFncyB8PSBGWERJQl9ET1dOU0FNUExFOwotICAgIH0KLSAgfQotICBkb3VibGUgc2NhbGVfeCA9IChGWF9GTE9BVCltX1NyY1dpZHRoIC8gKEZYX0ZMT0FUKW1fRGVzdFdpZHRoOwotICBkb3VibGUgc2NhbGVfeSA9IChGWF9GTE9BVCltX1NyY0hlaWdodCAvIChGWF9GTE9BVCltX0Rlc3RIZWlnaHQ7Ci0gIGRvdWJsZSBiYXNlX3ggPSBtX0Rlc3RXaWR0aCA+IDAgPyAwLjBmIDogKEZYX0ZMT0FUKShtX0Rlc3RXaWR0aCk7Ci0gIGRvdWJsZSBiYXNlX3kgPSBtX0Rlc3RIZWlnaHQgPiAwID8gMC4wZiA6IChGWF9GTE9BVCkobV9EZXN0SGVpZ2h0KTsKLSAgZG91YmxlIHNyY19sZWZ0ID0gc2NhbGVfeCAqICgoRlhfRkxPQVQpKGNsaXBfcmVjdC5sZWZ0KSArIGJhc2VfeCk7Ci0gIGRvdWJsZSBzcmNfcmlnaHQgPSBzY2FsZV94ICogKChGWF9GTE9BVCkoY2xpcF9yZWN0LnJpZ2h0KSArIGJhc2VfeCk7Ci0gIGRvdWJsZSBzcmNfdG9wID0gc2NhbGVfeSAqICgoRlhfRkxPQVQpKGNsaXBfcmVjdC50b3ApICsgYmFzZV95KTsKLSAgZG91YmxlIHNyY19ib3R0b20gPSBzY2FsZV95ICogKChGWF9GTE9BVCkoY2xpcF9yZWN0LmJvdHRvbSkgKyBiYXNlX3kpOwotICBpZiAoc3JjX2xlZnQgPiBzcmNfcmlnaHQpIHsKLSAgICBkb3VibGUgdGVtcCA9IHNyY19sZWZ0OwotICAgIHNyY19sZWZ0ID0gc3JjX3JpZ2h0OwotICAgIHNyY19yaWdodCA9IHRlbXA7Ci0gIH0KLSAgaWYgKHNyY190b3AgPiBzcmNfYm90dG9tKSB7Ci0gICAgZG91YmxlIHRlbXAgPSBzcmNfdG9wOwotICAgIHNyY190b3AgPSBzcmNfYm90dG9tOwotICAgIHNyY19ib3R0b20gPSB0ZW1wOwotICB9Ci0gIG1fU3JjQ2xpcC5sZWZ0ID0gKGludClGWFNZU19mbG9vcigoRlhfRkxPQVQpc3JjX2xlZnQpOwotICBtX1NyY0NsaXAucmlnaHQgPSAoaW50KUZYU1lTX2NlaWwoKEZYX0ZMT0FUKXNyY19yaWdodCk7Ci0gIG1fU3JjQ2xpcC50b3AgPSAoaW50KUZYU1lTX2Zsb29yKChGWF9GTE9BVClzcmNfdG9wKTsKLSAgbV9TcmNDbGlwLmJvdHRvbSA9IChpbnQpRlhTWVNfY2VpbCgoRlhfRkxPQVQpc3JjX2JvdHRvbSk7Ci0gIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgbV9TcmNXaWR0aCwgbV9TcmNIZWlnaHQpOwotICBtX1NyY0NsaXAuSW50ZXJzZWN0KHNyY19yZWN0KTsKLSAgaWYgKG1fU3JjQnBwID09IDEpIHsKLSAgICBpZiAobV9EZXN0QnBwID09IDgpIHsKLSAgICAgIG1fVHJhbnNNZXRob2QgPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICBtX1RyYW5zTWV0aG9kID0gMjsKLSAgICB9Ci0gIH0gZWxzZSBpZiAobV9TcmNCcHAgPT0gOCkgewotICAgIGlmIChtX0Rlc3RCcHAgPT0gOCkgewotICAgICAgaWYgKCFtX2JIYXNBbHBoYSkgewotICAgICAgICBtX1RyYW5zTWV0aG9kID0gMzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fVHJhbnNNZXRob2QgPSA0OwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoIW1fYkhhc0FscGhhKSB7Ci0gICAgICAgIG1fVHJhbnNNZXRob2QgPSA1OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbV9UcmFuc01ldGhvZCA9IDY7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmICghbV9iSGFzQWxwaGEpIHsKLSAgICAgIG1fVHJhbnNNZXRob2QgPSA3OwotICAgIH0gZWxzZSB7Ci0gICAgICBtX1RyYW5zTWV0aG9kID0gODsKLSAgICB9Ci0gIH0KLX0KLQotQ1N0cmV0Y2hFbmdpbmU6On5DU3RyZXRjaEVuZ2luZSgpIHsKLSAgRlhfRnJlZShtX3BEZXN0U2NhbmxpbmUpOwotICBGWF9GcmVlKG1fcEludGVyQnVmKTsKLSAgRlhfRnJlZShtX3BFeHRyYUFscGhhQnVmKTsKLSAgRlhfRnJlZShtX3BEZXN0TWFza1NjYW5saW5lKTsKLX0KLQotYm9vbCBDU3RyZXRjaEVuZ2luZTo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpIHsKLSAgd2hpbGUgKG1fU3RhdGUgPT0gMSkgewotICAgIGlmIChDb250aW51ZVN0cmV0Y2hIb3J6KHBQYXVzZSkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBtX1N0YXRlID0gMjsKLSAgICBTdHJldGNoVmVydCgpOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDU3RyZXRjaEVuZ2luZTo6U3RhcnRTdHJldGNoSG9yeigpIHsKLSAgaWYgKG1fRGVzdFdpZHRoID09IDAgfHwgbV9JbnRlclBpdGNoID09IDAgfHwgIW1fcERlc3RTY2FubGluZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKG1fU3JjQ2xpcC5IZWlnaHQoKSA9PSAwIHx8Ci0gICAgICBtX1NyY0NsaXAuSGVpZ2h0KCkgPiAoMSA8PCAyOSkgLyBtX0ludGVyUGl0Y2gpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBtX3BJbnRlckJ1ZiA9IEZYX1RyeUFsbG9jKHVuc2lnbmVkIGNoYXIsIG1fU3JjQ2xpcC5IZWlnaHQoKSAqIG1fSW50ZXJQaXRjaCk7Ci0gIGlmICghbV9wSW50ZXJCdWYpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChtX3BTb3VyY2UgJiYgbV9iSGFzQWxwaGEgJiYgbV9wU291cmNlLT5tX3BBbHBoYU1hc2spIHsKLSAgICBtX3BFeHRyYUFscGhhQnVmID0KLSAgICAgICAgRlhfQWxsb2MyRCh1bnNpZ25lZCBjaGFyLCBtX1NyY0NsaXAuSGVpZ2h0KCksIG1fRXh0cmFNYXNrUGl0Y2gpOwotICAgIHVpbnQzMl90IHNpemUgPSAobV9EZXN0Q2xpcC5XaWR0aCgpICogOCArIDMxKSAvIDMyICogNDsKLSAgICBtX3BEZXN0TWFza1NjYW5saW5lID0gRlhfVHJ5QWxsb2ModW5zaWduZWQgY2hhciwgc2l6ZSk7Ci0gICAgaWYgKCFtX3BEZXN0TWFza1NjYW5saW5lKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGJvb2wgcmV0ID0KLSAgICAgIG1fV2VpZ2h0VGFibGUuQ2FsYyhtX0Rlc3RXaWR0aCwgbV9EZXN0Q2xpcC5sZWZ0LCBtX0Rlc3RDbGlwLnJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgIG1fU3JjV2lkdGgsIG1fU3JjQ2xpcC5sZWZ0LCBtX1NyY0NsaXAucmlnaHQsIG1fRmxhZ3MpOwotICBpZiAoIXJldCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbV9DdXJSb3cgPSBtX1NyY0NsaXAudG9wOwotICBtX1N0YXRlID0gMTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1N0cmV0Y2hFbmdpbmU6OkNvbnRpbnVlU3RyZXRjaEhvcnooSUZYX1BhdXNlKiBwUGF1c2UpIHsKLSAgaWYgKCFtX0Rlc3RXaWR0aCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKG1fcFNvdXJjZS0+U2tpcFRvU2NhbmxpbmUobV9DdXJSb3csIHBQYXVzZSkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW50IEJwcCA9IG1fRGVzdEJwcCAvIDg7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1N0cmVjaFBhdXNlUm93cyA9IDEwOwotICBpbnQgcm93c190b19nbyA9IGtTdHJlY2hQYXVzZVJvd3M7Ci0gIGZvciAoOyBtX0N1clJvdyA8IG1fU3JjQ2xpcC5ib3R0b207IG1fQ3VyUm93KyspIHsKLSAgICBpZiAocm93c190b19nbyA9PSAwKSB7Ci0gICAgICBpZiAocFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgIHJvd3NfdG9fZ28gPSBrU3RyZWNoUGF1c2VSb3dzOwotICAgIH0KLQotICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gbV9wU291cmNlLT5HZXRTY2FubGluZShtX0N1clJvdyk7Ci0gICAgdWludDhfdCogZGVzdF9zY2FuID0KLSAgICAgICAgbV9wSW50ZXJCdWYgKyAobV9DdXJSb3cgLSBtX1NyY0NsaXAudG9wKSAqIG1fSW50ZXJQaXRjaDsKLSAgICBjb25zdCB1aW50OF90KiBzcmNfc2Nhbl9tYXNrID0gbnVsbHB0cjsKLSAgICB1aW50OF90KiBkZXN0X3NjYW5fbWFzayA9IG51bGxwdHI7Ci0gICAgaWYgKG1fcEV4dHJhQWxwaGFCdWYpIHsKLSAgICAgIHNyY19zY2FuX21hc2sgPSBtX3BTb3VyY2UtPm1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUobV9DdXJSb3cpOwotICAgICAgZGVzdF9zY2FuX21hc2sgPQotICAgICAgICAgIG1fcEV4dHJhQWxwaGFCdWYgKyAobV9DdXJSb3cgLSBtX1NyY0NsaXAudG9wKSAqIG1fRXh0cmFNYXNrUGl0Y2g7Ci0gICAgfQotICAgIHN3aXRjaCAobV9UcmFuc01ldGhvZCkgewotICAgICAgY2FzZSAxOgotICAgICAgY2FzZSAyOiB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sKyspIHsKLSAgICAgICAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IG1fV2VpZ2h0VGFibGUuR2V0UGl4ZWxXZWlnaHQoY29sKTsKLSAgICAgICAgICBpbnQgZGVzdF9hID0gMDsKLSAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsKLSAgICAgICAgICAgICAgIGorKykgewotICAgICAgICAgICAgaW50KiBwV2VpZ2h0ID0KLSAgICAgICAgICAgICAgICBtX1dlaWdodFRhYmxlLkdldFZhbHVlRnJvbVBpeGVsV2VpZ2h0KHBQaXhlbFdlaWdodHMsIGopOwotICAgICAgICAgICAgaWYgKCFwV2VpZ2h0KQotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSAqcFdlaWdodDsKLSAgICAgICAgICAgIGlmIChzcmNfc2NhbltqIC8gOF0gJiAoMSA8PCAoNyAtIGogJSA4KSkpIHsKLSAgICAgICAgICAgICAgZGVzdF9hICs9IHBpeGVsX3dlaWdodCAqIDI1NTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7Ci0gICAgICAgICAgICBkZXN0X2EgPSBkZXN0X2EgPCAwID8gMCA6IGRlc3RfYSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2E7Ci0gICAgICAgICAgfQotICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KShkZXN0X2EgPj4gMTYpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSAzOiB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sKyspIHsKLSAgICAgICAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IG1fV2VpZ2h0VGFibGUuR2V0UGl4ZWxXZWlnaHQoY29sKTsKLSAgICAgICAgICBpbnQgZGVzdF9hID0gMDsKLSAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsKLSAgICAgICAgICAgICAgIGorKykgewotICAgICAgICAgICAgaW50KiBwV2VpZ2h0ID0KLSAgICAgICAgICAgICAgICBtX1dlaWdodFRhYmxlLkdldFZhbHVlRnJvbVBpeGVsV2VpZ2h0KHBQaXhlbFdlaWdodHMsIGopOwotICAgICAgICAgICAgaWYgKCFwV2VpZ2h0KQotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSAqcFdlaWdodDsKLSAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQgKiBzcmNfc2NhbltqXTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7Ci0gICAgICAgICAgICBkZXN0X2EgPSBkZXN0X2EgPCAwID8gMCA6IGRlc3RfYSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2E7Ci0gICAgICAgICAgfQotICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KShkZXN0X2EgPj4gMTYpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSA0OiB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sKyspIHsKLSAgICAgICAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IG1fV2VpZ2h0VGFibGUuR2V0UGl4ZWxXZWlnaHQoY29sKTsKLSAgICAgICAgICBpbnQgZGVzdF9hID0gMCwgZGVzdF9yID0gMDsKLSAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsKLSAgICAgICAgICAgICAgIGorKykgewotICAgICAgICAgICAgaW50KiBwV2VpZ2h0ID0KLSAgICAgICAgICAgICAgICBtX1dlaWdodFRhYmxlLkdldFZhbHVlRnJvbVBpeGVsV2VpZ2h0KHBQaXhlbFdlaWdodHMsIGopOwotICAgICAgICAgICAgaWYgKCFwV2VpZ2h0KQotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSAqcFdlaWdodDsKLSAgICAgICAgICAgIHBpeGVsX3dlaWdodCA9IHBpeGVsX3dlaWdodCAqIHNyY19zY2FuX21hc2tbal0gLyAyNTU7Ci0gICAgICAgICAgICBkZXN0X3IgKz0gcGl4ZWxfd2VpZ2h0ICogc3JjX3NjYW5bal07Ci0gICAgICAgICAgICBkZXN0X2EgKz0gcGl4ZWxfd2VpZ2h0OwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKLSAgICAgICAgICAgIGRlc3RfciA9IGRlc3RfciA8IDAgPyAwIDogZGVzdF9yID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfcjsKLSAgICAgICAgICAgIGRlc3RfYSA9IGRlc3RfYSA8IDAgPyAwIDogZGVzdF9hID4gNjU1MzYgPyA2NTUzNiA6IGRlc3RfYTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpKGRlc3RfciA+PiAxNik7Ci0gICAgICAgICAgKmRlc3Rfc2Nhbl9tYXNrKysgPSAodWludDhfdCkoKGRlc3RfYSAqIDI1NSkgPj4gMTYpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSA1OiB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sKyspIHsKLSAgICAgICAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IG1fV2VpZ2h0VGFibGUuR2V0UGl4ZWxXZWlnaHQoY29sKTsKLSAgICAgICAgICBpbnQgZGVzdF9yX3kgPSAwLCBkZXN0X2dfbSA9IDAsIGRlc3RfYl9jID0gMDsKLSAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsKLSAgICAgICAgICAgICAgIGorKykgewotICAgICAgICAgICAgaW50KiBwV2VpZ2h0ID0KLSAgICAgICAgICAgICAgICBtX1dlaWdodFRhYmxlLkdldFZhbHVlRnJvbVBpeGVsV2VpZ2h0KHBQaXhlbFdlaWdodHMsIGopOwotICAgICAgICAgICAgaWYgKCFwV2VpZ2h0KQotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSAqcFdlaWdodDsKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnYl9jbXlrID0gbV9wU3JjUGFsZXR0ZVtzcmNfc2NhbltqXV07Ci0gICAgICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX1JnYikgewotICAgICAgICAgICAgICBkZXN0X3JfeSArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYl9jbXlrID4+IDE2KTsKLSAgICAgICAgICAgICAgZGVzdF9nX20gKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2JfY215ayA+PiA4KTsKLSAgICAgICAgICAgICAgZGVzdF9iX2MgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpYXJnYl9jbXlrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgZGVzdF9iX2MgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2JfY215ayA+PiAyNCk7Ci0gICAgICAgICAgICAgIGRlc3RfZ19tICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KShhcmdiX2NteWsgPj4gMTYpOwotICAgICAgICAgICAgICBkZXN0X3JfeSArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYl9jbXlrID4+IDgpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKLSAgICAgICAgICAgIGRlc3Rfcl95ID0KLSAgICAgICAgICAgICAgICBkZXN0X3JfeSA8IDAgPyAwIDogZGVzdF9yX3kgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9yX3k7Ci0gICAgICAgICAgICBkZXN0X2dfbSA9Ci0gICAgICAgICAgICAgICAgZGVzdF9nX20gPCAwID8gMCA6IGRlc3RfZ19tID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfZ19tOwotICAgICAgICAgICAgZGVzdF9iX2MgPQotICAgICAgICAgICAgICAgIGRlc3RfYl9jIDwgMCA/IDAgOiBkZXN0X2JfYyA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2JfYzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpKGRlc3RfYl9jID4+IDE2KTsKLSAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCkoZGVzdF9nX20gPj4gMTYpOwotICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KShkZXN0X3JfeSA+PiAxNik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIDY6IHsKLSAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyBjb2wrKykgewotICAgICAgICAgIFBpeGVsV2VpZ2h0KiBwUGl4ZWxXZWlnaHRzID0gbV9XZWlnaHRUYWJsZS5HZXRQaXhlbFdlaWdodChjb2wpOwotICAgICAgICAgIGludCBkZXN0X2EgPSAwLCBkZXN0X3JfeSA9IDAsIGRlc3RfZ19tID0gMCwgZGVzdF9iX2MgPSAwOwotICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOwotICAgICAgICAgICAgICAgaisrKSB7Ci0gICAgICAgICAgICBpbnQqIHBXZWlnaHQgPQotICAgICAgICAgICAgICAgIG1fV2VpZ2h0VGFibGUuR2V0VmFsdWVGcm9tUGl4ZWxXZWlnaHQocFBpeGVsV2VpZ2h0cywgaik7Ci0gICAgICAgICAgICBpZiAoIXBXZWlnaHQpCi0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9ICpwV2VpZ2h0OwotICAgICAgICAgICAgcGl4ZWxfd2VpZ2h0ID0gcGl4ZWxfd2VpZ2h0ICogc3JjX3NjYW5fbWFza1tqXSAvIDI1NTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnYl9jbXlrID0gbV9wU3JjUGFsZXR0ZVtzcmNfc2NhbltqXV07Ci0gICAgICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX1JnYmEpIHsKLSAgICAgICAgICAgICAgZGVzdF9yX3kgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2JfY215ayA+PiAxNik7Ci0gICAgICAgICAgICAgIGRlc3RfZ19tICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KShhcmdiX2NteWsgPj4gOCk7Ci0gICAgICAgICAgICAgIGRlc3RfYl9jICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KWFyZ2JfY215azsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGRlc3RfYl9jICs9IHBpeGVsX3dlaWdodCAqICh1aW50OF90KShhcmdiX2NteWsgPj4gMjQpOwotICAgICAgICAgICAgICBkZXN0X2dfbSArPSBwaXhlbF93ZWlnaHQgKiAodWludDhfdCkoYXJnYl9jbXlrID4+IDE2KTsKLSAgICAgICAgICAgICAgZGVzdF9yX3kgKz0gcGl4ZWxfd2VpZ2h0ICogKHVpbnQ4X3QpKGFyZ2JfY215ayA+PiA4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgewotICAgICAgICAgICAgZGVzdF9iX2MgPQotICAgICAgICAgICAgICAgIGRlc3RfYl9jIDwgMCA/IDAgOiBkZXN0X2JfYyA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2JfYzsKLSAgICAgICAgICAgIGRlc3RfZ19tID0KLSAgICAgICAgICAgICAgICBkZXN0X2dfbSA8IDAgPyAwIDogZGVzdF9nX20gPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9nX207Ci0gICAgICAgICAgICBkZXN0X3JfeSA9Ci0gICAgICAgICAgICAgICAgZGVzdF9yX3kgPCAwID8gMCA6IGRlc3Rfcl95ID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3Rfcl95OwotICAgICAgICAgICAgZGVzdF9hID0gZGVzdF9hIDwgMCA/IDAgOiBkZXN0X2EgPiA2NTUzNiA/IDY1NTM2IDogZGVzdF9hOwotICAgICAgICAgIH0KLSAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCkoZGVzdF9iX2MgPj4gMTYpOwotICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KShkZXN0X2dfbSA+PiAxNik7Ci0gICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpKGRlc3Rfcl95ID4+IDE2KTsKLSAgICAgICAgICAqZGVzdF9zY2FuX21hc2srKyA9ICh1aW50OF90KSgoZGVzdF9hICogMjU1KSA+PiAxNik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIDc6IHsKLSAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyBjb2wrKykgewotICAgICAgICAgIFBpeGVsV2VpZ2h0KiBwUGl4ZWxXZWlnaHRzID0gbV9XZWlnaHRUYWJsZS5HZXRQaXhlbFdlaWdodChjb2wpOwotICAgICAgICAgIGludCBkZXN0X3JfeSA9IDAsIGRlc3RfZ19tID0gMCwgZGVzdF9iX2MgPSAwOwotICAgICAgICAgIGZvciAoaW50IGogPSBwUGl4ZWxXZWlnaHRzLT5tX1NyY1N0YXJ0OyBqIDw9IHBQaXhlbFdlaWdodHMtPm1fU3JjRW5kOwotICAgICAgICAgICAgICAgaisrKSB7Ci0gICAgICAgICAgICBpbnQqIHBXZWlnaHQgPQotICAgICAgICAgICAgICAgIG1fV2VpZ2h0VGFibGUuR2V0VmFsdWVGcm9tUGl4ZWxXZWlnaHQocFBpeGVsV2VpZ2h0cywgaik7Ci0gICAgICAgICAgICBpZiAoIXBXZWlnaHQpCi0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9ICpwV2VpZ2h0OwotICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3BpeGVsID0gc3JjX3NjYW4gKyBqICogQnBwOwotICAgICAgICAgICAgZGVzdF9iX2MgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7Ci0gICAgICAgICAgICBkZXN0X2dfbSArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCsrKTsKLSAgICAgICAgICAgIGRlc3Rfcl95ICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7Ci0gICAgICAgICAgICBkZXN0X2JfYyA9Ci0gICAgICAgICAgICAgICAgZGVzdF9iX2MgPCAwID8gMCA6IGRlc3RfYl9jID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfYl9jOwotICAgICAgICAgICAgZGVzdF9nX20gPQotICAgICAgICAgICAgICAgIGRlc3RfZ19tIDwgMCA/IDAgOiBkZXN0X2dfbSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2dfbTsKLSAgICAgICAgICAgIGRlc3Rfcl95ID0KLSAgICAgICAgICAgICAgICBkZXN0X3JfeSA8IDAgPyAwIDogZGVzdF9yX3kgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9yX3k7Ci0gICAgICAgICAgfQotICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KSgoZGVzdF9iX2MpID4+IDE2KTsKLSAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCkoKGRlc3RfZ19tKSA+PiAxNik7Ci0gICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpKChkZXN0X3JfeSkgPj4gMTYpOwotICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHAgLSAzOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSA4OiB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sKyspIHsKLSAgICAgICAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IG1fV2VpZ2h0VGFibGUuR2V0UGl4ZWxXZWlnaHQoY29sKTsKLSAgICAgICAgICBpbnQgZGVzdF9hID0gMCwgZGVzdF9yX3kgPSAwLCBkZXN0X2dfbSA9IDAsIGRlc3RfYl9jID0gMDsKLSAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsKLSAgICAgICAgICAgICAgIGorKykgewotICAgICAgICAgICAgaW50KiBwV2VpZ2h0ID0KLSAgICAgICAgICAgICAgICBtX1dlaWdodFRhYmxlLkdldFZhbHVlRnJvbVBpeGVsV2VpZ2h0KHBQaXhlbFdlaWdodHMsIGopOwotICAgICAgICAgICAgaWYgKCFwV2VpZ2h0KQotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSAqcFdlaWdodDsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19waXhlbCA9IHNyY19zY2FuICsgaiAqIEJwcDsKLSAgICAgICAgICAgIGlmIChtX0Rlc3RGb3JtYXQgPT0gRlhESUJfQXJnYikgewotICAgICAgICAgICAgICBwaXhlbF93ZWlnaHQgPSBwaXhlbF93ZWlnaHQgKiBzcmNfcGl4ZWxbM10gLyAyNTU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBwaXhlbF93ZWlnaHQgPSBwaXhlbF93ZWlnaHQgKiBzcmNfc2Nhbl9tYXNrW2pdIC8gMjU1OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9iX2MgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwrKyk7Ci0gICAgICAgICAgICBkZXN0X2dfbSArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCsrKTsKLSAgICAgICAgICAgIGRlc3Rfcl95ICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKTsKLSAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgewotICAgICAgICAgICAgZGVzdF9yX3kgPQotICAgICAgICAgICAgICAgIGRlc3Rfcl95IDwgMCA/IDAgOiBkZXN0X3JfeSA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X3JfeTsKLSAgICAgICAgICAgIGRlc3RfZ19tID0KLSAgICAgICAgICAgICAgICBkZXN0X2dfbSA8IDAgPyAwIDogZGVzdF9nX20gPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9nX207Ci0gICAgICAgICAgICBkZXN0X2JfYyA9Ci0gICAgICAgICAgICAgICAgZGVzdF9iX2MgPCAwID8gMCA6IGRlc3RfYl9jID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfYl9jOwotICAgICAgICAgICAgZGVzdF9hID0gZGVzdF9hIDwgMCA/IDAgOiBkZXN0X2EgPiA2NTUzNiA/IDY1NTM2IDogZGVzdF9hOwotICAgICAgICAgIH0KLSAgICAgICAgICAqZGVzdF9zY2FuKysgPSAodWludDhfdCkoKGRlc3RfYl9jKSA+PiAxNik7Ci0gICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpKChkZXN0X2dfbSkgPj4gMTYpOwotICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KSgoZGVzdF9yX3kpID4+IDE2KTsKLSAgICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSAodWludDhfdCkoKGRlc3RfYSAqIDI1NSkgPj4gMTYpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZGVzdF9zY2FuX21hc2spIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW5fbWFzaysrID0gKHVpbnQ4X3QpKChkZXN0X2EgKiAyNTUpID4+IDE2KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZGVzdF9zY2FuICs9IEJwcCAtIDM7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJvd3NfdG9fZ28tLTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQ1N0cmV0Y2hFbmdpbmU6OlN0cmV0Y2hWZXJ0KCkgewotICBpZiAobV9EZXN0SGVpZ2h0ID09IDApCi0gICAgcmV0dXJuOwotCi0gIENXZWlnaHRUYWJsZSB0YWJsZTsKLSAgYm9vbCByZXQgPSB0YWJsZS5DYWxjKG1fRGVzdEhlaWdodCwgbV9EZXN0Q2xpcC50b3AsIG1fRGVzdENsaXAuYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgbV9TcmNIZWlnaHQsIG1fU3JjQ2xpcC50b3AsIG1fU3JjQ2xpcC5ib3R0b20sIG1fRmxhZ3MpOwotICBpZiAoIXJldCkKLSAgICByZXR1cm47Ci0KLSAgY29uc3QgaW50IERlc3RCcHAgPSBtX0Rlc3RCcHAgLyA4OwotICBmb3IgKGludCByb3cgPSBtX0Rlc3RDbGlwLnRvcDsgcm93IDwgbV9EZXN0Q2xpcC5ib3R0b207IHJvdysrKSB7Ci0gICAgdW5zaWduZWQgY2hhciogZGVzdF9zY2FuID0gbV9wRGVzdFNjYW5saW5lOwotICAgIHVuc2lnbmVkIGNoYXIqIGRlc3Rfc2Nhbl9tYXNrID0gbV9wRGVzdE1hc2tTY2FubGluZTsKLSAgICBQaXhlbFdlaWdodCogcFBpeGVsV2VpZ2h0cyA9IHRhYmxlLkdldFBpeGVsV2VpZ2h0KHJvdyk7Ci0gICAgc3dpdGNoIChtX1RyYW5zTWV0aG9kKSB7Ci0gICAgICBjYXNlIDE6Ci0gICAgICBjYXNlIDI6Ci0gICAgICBjYXNlIDM6IHsKLSAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyBjb2wrKykgewotICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHNyY19zY2FuID0KLSAgICAgICAgICAgICAgbV9wSW50ZXJCdWYgKyAoY29sIC0gbV9EZXN0Q2xpcC5sZWZ0KSAqIERlc3RCcHA7Ci0gICAgICAgICAgaW50IGRlc3RfYSA9IDA7Ci0gICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7Ci0gICAgICAgICAgICAgICBqKyspIHsKLSAgICAgICAgICAgIGludCogcFdlaWdodCA9IHRhYmxlLkdldFZhbHVlRnJvbVBpeGVsV2VpZ2h0KHBQaXhlbFdlaWdodHMsIGopOwotICAgICAgICAgICAgaWYgKCFwV2VpZ2h0KQotICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSAqcFdlaWdodDsKLSAgICAgICAgICAgIGRlc3RfYSArPQotICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodCAqIHNyY19zY2FuWyhqIC0gbV9TcmNDbGlwLnRvcCkgKiBtX0ludGVyUGl0Y2hdOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKLSAgICAgICAgICAgIGRlc3RfYSA9IGRlc3RfYSA8IDAgPyAwIDogZGVzdF9hID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfYTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgKmRlc3Rfc2NhbiA9ICh1aW50OF90KShkZXN0X2EgPj4gMTYpOwotICAgICAgICAgIGRlc3Rfc2NhbiArPSBEZXN0QnBwOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSA0OiB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IG1fRGVzdENsaXAubGVmdDsgY29sIDwgbV9EZXN0Q2xpcC5yaWdodDsgY29sKyspIHsKLSAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBzcmNfc2NhbiA9Ci0gICAgICAgICAgICAgIG1fcEludGVyQnVmICsgKGNvbCAtIG1fRGVzdENsaXAubGVmdCkgKiBEZXN0QnBwOwotICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHNyY19zY2FuX21hc2sgPQotICAgICAgICAgICAgICBtX3BFeHRyYUFscGhhQnVmICsgKGNvbCAtIG1fRGVzdENsaXAubGVmdCk7Ci0gICAgICAgICAgaW50IGRlc3RfYSA9IDAsIGRlc3RfayA9IDA7Ci0gICAgICAgICAgZm9yIChpbnQgaiA9IHBQaXhlbFdlaWdodHMtPm1fU3JjU3RhcnQ7IGogPD0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNFbmQ7Ci0gICAgICAgICAgICAgICBqKyspIHsKLSAgICAgICAgICAgIGludCogcFdlaWdodCA9IHRhYmxlLkdldFZhbHVlRnJvbVBpeGVsV2VpZ2h0KHBQaXhlbFdlaWdodHMsIGopOwotICAgICAgICAgICAgaWYgKCFwV2VpZ2h0KQotICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGludCBwaXhlbF93ZWlnaHQgPSAqcFdlaWdodDsKLSAgICAgICAgICAgIGRlc3RfayArPQotICAgICAgICAgICAgICAgIHBpeGVsX3dlaWdodCAqIHNyY19zY2FuWyhqIC0gbV9TcmNDbGlwLnRvcCkgKiBtX0ludGVyUGl0Y2hdOwotICAgICAgICAgICAgZGVzdF9hICs9IHBpeGVsX3dlaWdodCAqCi0gICAgICAgICAgICAgICAgICAgICAgc3JjX3NjYW5fbWFza1soaiAtIG1fU3JjQ2xpcC50b3ApICogbV9FeHRyYU1hc2tQaXRjaF07Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkgewotICAgICAgICAgICAgZGVzdF9rID0gZGVzdF9rIDwgMCA/IDAgOiBkZXN0X2sgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9rOwotICAgICAgICAgICAgZGVzdF9hID0gZGVzdF9hIDwgMCA/IDAgOiBkZXN0X2EgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9hOwotICAgICAgICAgIH0KLSAgICAgICAgICAqZGVzdF9zY2FuID0gKHVpbnQ4X3QpKGRlc3RfayA+PiAxNik7Ci0gICAgICAgICAgZGVzdF9zY2FuICs9IERlc3RCcHA7Ci0gICAgICAgICAgKmRlc3Rfc2Nhbl9tYXNrKysgPSAodWludDhfdCkoZGVzdF9hID4+IDE2KTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgNToKLSAgICAgIGNhc2UgNzogewotICAgICAgICBmb3IgKGludCBjb2wgPSBtX0Rlc3RDbGlwLmxlZnQ7IGNvbCA8IG1fRGVzdENsaXAucmlnaHQ7IGNvbCsrKSB7Ci0gICAgICAgICAgdW5zaWduZWQgY2hhciogc3JjX3NjYW4gPQotICAgICAgICAgICAgICBtX3BJbnRlckJ1ZiArIChjb2wgLSBtX0Rlc3RDbGlwLmxlZnQpICogRGVzdEJwcDsKLSAgICAgICAgICBpbnQgZGVzdF9yX3kgPSAwLCBkZXN0X2dfbSA9IDAsIGRlc3RfYl9jID0gMDsKLSAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsKLSAgICAgICAgICAgICAgIGorKykgewotICAgICAgICAgICAgaW50KiBwV2VpZ2h0ID0gdGFibGUuR2V0VmFsdWVGcm9tUGl4ZWxXZWlnaHQocFBpeGVsV2VpZ2h0cywgaik7Ci0gICAgICAgICAgICBpZiAoIXBXZWlnaHQpCi0gICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9ICpwV2VpZ2h0OwotICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3BpeGVsID0KLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArIChqIC0gbV9TcmNDbGlwLnRvcCkgKiBtX0ludGVyUGl0Y2g7Ci0gICAgICAgICAgICBkZXN0X2JfYyArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCsrKTsKLSAgICAgICAgICAgIGRlc3RfZ19tICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOwotICAgICAgICAgICAgZGVzdF9yX3kgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKLSAgICAgICAgICAgIGRlc3Rfcl95ID0KLSAgICAgICAgICAgICAgICBkZXN0X3JfeSA8IDAgPyAwIDogZGVzdF9yX3kgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9yX3k7Ci0gICAgICAgICAgICBkZXN0X2dfbSA9Ci0gICAgICAgICAgICAgICAgZGVzdF9nX20gPCAwID8gMCA6IGRlc3RfZ19tID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfZ19tOwotICAgICAgICAgICAgZGVzdF9iX2MgPQotICAgICAgICAgICAgICAgIGRlc3RfYl9jIDwgMCA/IDAgOiBkZXN0X2JfYyA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2JfYzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZGVzdF9zY2FuWzBdID0gKHVpbnQ4X3QpKChkZXN0X2JfYykgPj4gMTYpOwotICAgICAgICAgIGRlc3Rfc2NhblsxXSA9ICh1aW50OF90KSgoZGVzdF9nX20pID4+IDE2KTsKLSAgICAgICAgICBkZXN0X3NjYW5bMl0gPSAodWludDhfdCkoKGRlc3Rfcl95KSA+PiAxNik7Ci0gICAgICAgICAgZGVzdF9zY2FuICs9IERlc3RCcHA7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIDY6Ci0gICAgICBjYXNlIDg6IHsKLSAgICAgICAgZm9yIChpbnQgY29sID0gbV9EZXN0Q2xpcC5sZWZ0OyBjb2wgPCBtX0Rlc3RDbGlwLnJpZ2h0OyBjb2wrKykgewotICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHNyY19zY2FuID0KLSAgICAgICAgICAgICAgbV9wSW50ZXJCdWYgKyAoY29sIC0gbV9EZXN0Q2xpcC5sZWZ0KSAqIERlc3RCcHA7Ci0gICAgICAgICAgdW5zaWduZWQgY2hhciogc3JjX3NjYW5fbWFzayA9IG51bGxwdHI7Ci0gICAgICAgICAgaWYgKG1fRGVzdEZvcm1hdCAhPSBGWERJQl9BcmdiKSB7Ci0gICAgICAgICAgICBzcmNfc2Nhbl9tYXNrID0gbV9wRXh0cmFBbHBoYUJ1ZiArIChjb2wgLSBtX0Rlc3RDbGlwLmxlZnQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpbnQgZGVzdF9hID0gMCwgZGVzdF9yX3kgPSAwLCBkZXN0X2dfbSA9IDAsIGRlc3RfYl9jID0gMDsKLSAgICAgICAgICBmb3IgKGludCBqID0gcFBpeGVsV2VpZ2h0cy0+bV9TcmNTdGFydDsgaiA8PSBwUGl4ZWxXZWlnaHRzLT5tX1NyY0VuZDsKLSAgICAgICAgICAgICAgIGorKykgewotICAgICAgICAgICAgaW50KiBwV2VpZ2h0ID0gdGFibGUuR2V0VmFsdWVGcm9tUGl4ZWxXZWlnaHQocFBpeGVsV2VpZ2h0cywgaik7Ci0gICAgICAgICAgICBpZiAoIXBXZWlnaHQpCi0gICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaW50IHBpeGVsX3dlaWdodCA9ICpwV2VpZ2h0OwotICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3BpeGVsID0KLSAgICAgICAgICAgICAgICBzcmNfc2NhbiArIChqIC0gbV9TcmNDbGlwLnRvcCkgKiBtX0ludGVyUGl0Y2g7Ci0gICAgICAgICAgICBpbnQgbWFza192ID0gMjU1OwotICAgICAgICAgICAgaWYgKHNyY19zY2FuX21hc2spIHsKLSAgICAgICAgICAgICAgbWFza192ID0gc3JjX3NjYW5fbWFza1soaiAtIG1fU3JjQ2xpcC50b3ApICogbV9FeHRyYU1hc2tQaXRjaF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X2JfYyArPSBwaXhlbF93ZWlnaHQgKiAoKnNyY19waXhlbCsrKTsKLSAgICAgICAgICAgIGRlc3RfZ19tICs9IHBpeGVsX3dlaWdodCAqICgqc3JjX3BpeGVsKyspOwotICAgICAgICAgICAgZGVzdF9yX3kgKz0gcGl4ZWxfd2VpZ2h0ICogKCpzcmNfcGl4ZWwpOwotICAgICAgICAgICAgaWYgKG1fRGVzdEZvcm1hdCA9PSBGWERJQl9BcmdiKSB7Ci0gICAgICAgICAgICAgIGRlc3RfYSArPSBwaXhlbF93ZWlnaHQgKiAoKihzcmNfcGl4ZWwgKyAxKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBkZXN0X2EgKz0gcGl4ZWxfd2VpZ2h0ICogbWFza192OwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKLSAgICAgICAgICAgIGRlc3Rfcl95ID0KLSAgICAgICAgICAgICAgICBkZXN0X3JfeSA8IDAgPyAwIDogZGVzdF9yX3kgPiAxNjcxMTY4MCA/IDE2NzExNjgwIDogZGVzdF9yX3k7Ci0gICAgICAgICAgICBkZXN0X2dfbSA9Ci0gICAgICAgICAgICAgICAgZGVzdF9nX20gPCAwID8gMCA6IGRlc3RfZ19tID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfZ19tOwotICAgICAgICAgICAgZGVzdF9iX2MgPQotICAgICAgICAgICAgICAgIGRlc3RfYl9jIDwgMCA/IDAgOiBkZXN0X2JfYyA+IDE2NzExNjgwID8gMTY3MTE2ODAgOiBkZXN0X2JfYzsKLSAgICAgICAgICAgIGRlc3RfYSA9IGRlc3RfYSA8IDAgPyAwIDogZGVzdF9hID4gMTY3MTE2ODAgPyAxNjcxMTY4MCA6IGRlc3RfYTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGRlc3RfYSkgewotICAgICAgICAgICAgaW50IHIgPSAoKHVpbnQzMl90KWRlc3Rfcl95KSAqIDI1NSAvIGRlc3RfYTsKLSAgICAgICAgICAgIGludCBnID0gKCh1aW50MzJfdClkZXN0X2dfbSkgKiAyNTUgLyBkZXN0X2E7Ci0gICAgICAgICAgICBpbnQgYiA9ICgodWludDMyX3QpZGVzdF9iX2MpICogMjU1IC8gZGVzdF9hOwotICAgICAgICAgICAgZGVzdF9zY2FuWzBdID0gYiA+IDI1NSA/IDI1NSA6IGIgPCAwID8gMCA6IGI7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bMV0gPSBnID4gMjU1ID8gMjU1IDogZyA8IDAgPyAwIDogZzsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IHIgPiAyNTUgPyAyNTUgOiByIDwgMCA/IDAgOiByOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobV9EZXN0Rm9ybWF0ID09IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9ICh1aW50OF90KSgoZGVzdF9hKSA+PiAxNik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW5fbWFzayA9ICh1aW50OF90KSgoZGVzdF9hKSA+PiAxNik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRlc3Rfc2NhbiArPSBEZXN0QnBwOwotICAgICAgICAgIGlmIChkZXN0X3NjYW5fbWFzaykgewotICAgICAgICAgICAgZGVzdF9zY2FuX21hc2srKzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIG1fcERlc3RCaXRtYXAtPkNvbXBvc2VTY2FubGluZShyb3cgLSBtX0Rlc3RDbGlwLnRvcCwgbV9wRGVzdFNjYW5saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEZXN0TWFza1NjYW5saW5lKTsKLSAgfQotfQotCi1DRlhfSW1hZ2VTdHJldGNoZXI6OkNGWF9JbWFnZVN0cmV0Y2hlcihJRlhfU2NhbmxpbmVDb21wb3NlciogcERlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUJiBiaXRtYXBfcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKQotICAgIDogbV9wRGVzdChwRGVzdCksCi0gICAgICBtX3BTb3VyY2UocFNvdXJjZSksCi0gICAgICBtX0ZsYWdzKGZsYWdzKSwKLSAgICAgIG1fYkZsaXBYKGZhbHNlKSwKLSAgICAgIG1fYkZsaXBZKGZhbHNlKSwKLSAgICAgIG1fRGVzdFdpZHRoKGRlc3Rfd2lkdGgpLAotICAgICAgbV9EZXN0SGVpZ2h0KGRlc3RfaGVpZ2h0KSwKLSAgICAgIG1fQ2xpcFJlY3QoYml0bWFwX3JlY3QpLAotICAgICAgbV9EZXN0Rm9ybWF0KEdldFN0cmV0Y2hlZEZvcm1hdCgqcFNvdXJjZSkpLAotICAgICAgbV9EZXN0QlBQKG1fRGVzdEZvcm1hdCAmIDB4ZmYpLAotICAgICAgbV9MaW5lSW5kZXgoMCkge30KLQotQ0ZYX0ltYWdlU3RyZXRjaGVyOjp+Q0ZYX0ltYWdlU3RyZXRjaGVyKCkgewotfQotCi1ib29sIENGWF9JbWFnZVN0cmV0Y2hlcjo6U3RhcnQoKSB7Ci0gIGlmIChtX0Rlc3RXaWR0aCA9PSAwIHx8IG1fRGVzdEhlaWdodCA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAobV9wU291cmNlLT5HZXRGb3JtYXQoKSA9PSBGWERJQl8xYnBwUmdiICYmIG1fcFNvdXJjZS0+R2V0UGFsZXR0ZSgpKSB7Ci0gICAgRlhfQVJHQiBwYWxbMjU2XTsKLSAgICBpbnQgYTAsIHIwLCBnMCwgYjAsIGExLCByMSwgZzEsIGIxOwotICAgIEFyZ2JEZWNvZGUobV9wU291cmNlLT5HZXRQYWxldHRlRW50cnkoMCksIGEwLCByMCwgZzAsIGIwKTsKLSAgICBBcmdiRGVjb2RlKG1fcFNvdXJjZS0+R2V0UGFsZXR0ZUVudHJ5KDEpLCBhMSwgcjEsIGcxLCBiMSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewotICAgICAgaW50IGEgPSBhMCArIChhMSAtIGEwKSAqIGkgLyAyNTU7Ci0gICAgICBpbnQgciA9IHIwICsgKHIxIC0gcjApICogaSAvIDI1NTsKLSAgICAgIGludCBnID0gZzAgKyAoZzEgLSBnMCkgKiBpIC8gMjU1OwotICAgICAgaW50IGIgPSBiMCArIChiMSAtIGIwKSAqIGkgLyAyNTU7Ci0gICAgICBwYWxbaV0gPSBBcmdiRW5jb2RlKGEsIHIsIGcsIGIpOwotICAgIH0KLSAgICBpZiAoIW1fcERlc3QtPlNldEluZm8obV9DbGlwUmVjdC5XaWR0aCgpLCBtX0NsaXBSZWN0LkhlaWdodCgpLCBtX0Rlc3RGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBhbCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAobV9wU291cmNlLT5HZXRGb3JtYXQoKSA9PSBGWERJQl8xYnBwQ215ayAmJgotICAgICAgICAgICAgIG1fcFNvdXJjZS0+R2V0UGFsZXR0ZSgpKSB7Ci0gICAgRlhfQ01ZSyBwYWxbMjU2XTsKLSAgICBpbnQgYzAsIG0wLCB5MCwgazAsIGMxLCBtMSwgeTEsIGsxOwotICAgIENteWtEZWNvZGUobV9wU291cmNlLT5HZXRQYWxldHRlRW50cnkoMCksIGMwLCBtMCwgeTAsIGswKTsKLSAgICBDbXlrRGVjb2RlKG1fcFNvdXJjZS0+R2V0UGFsZXR0ZUVudHJ5KDEpLCBjMSwgbTEsIHkxLCBrMSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewotICAgICAgaW50IGMgPSBjMCArIChjMSAtIGMwKSAqIGkgLyAyNTU7Ci0gICAgICBpbnQgbSA9IG0wICsgKG0xIC0gbTApICogaSAvIDI1NTsKLSAgICAgIGludCB5ID0geTAgKyAoeTEgLSB5MCkgKiBpIC8gMjU1OwotICAgICAgaW50IGsgPSBrMCArIChrMSAtIGswKSAqIGkgLyAyNTU7Ci0gICAgICBwYWxbaV0gPSBDbXlrRW5jb2RlKGMsIG0sIHksIGspOwotICAgIH0KLSAgICBpZiAoIW1fcERlc3QtPlNldEluZm8obV9DbGlwUmVjdC5XaWR0aCgpLCBtX0NsaXBSZWN0LkhlaWdodCgpLCBtX0Rlc3RGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBhbCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoIW1fcERlc3QtPlNldEluZm8obV9DbGlwUmVjdC5XaWR0aCgpLCBtX0NsaXBSZWN0LkhlaWdodCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fRGVzdEZvcm1hdCwgbnVsbHB0cikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAobV9GbGFncyAmIEZYRElCX0RPV05TQU1QTEUpCi0gICAgcmV0dXJuIFN0YXJ0UXVpY2tTdHJldGNoKCk7Ci0gIHJldHVybiBTdGFydFN0cmV0Y2goKTsKLX0KLQotYm9vbCBDRlhfSW1hZ2VTdHJldGNoZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKSB7Ci0gIGlmIChtX0ZsYWdzICYgRlhESUJfRE9XTlNBTVBMRSkKLSAgICByZXR1cm4gQ29udGludWVRdWlja1N0cmV0Y2gocFBhdXNlKTsKLSAgcmV0dXJuIENvbnRpbnVlU3RyZXRjaChwUGF1c2UpOwotfQotCi1ib29sIENGWF9JbWFnZVN0cmV0Y2hlcjo6U3RhcnRTdHJldGNoKCkgewotICBtX3BTdHJldGNoRW5naW5lID0gcGRmaXVtOjpNYWtlVW5pcXVlPENTdHJldGNoRW5naW5lPigKLSAgICAgIG1fcERlc3QsIG1fRGVzdEZvcm1hdCwgbV9EZXN0V2lkdGgsIG1fRGVzdEhlaWdodCwgbV9DbGlwUmVjdCwgbV9wU291cmNlLAotICAgICAgbV9GbGFncyk7Ci0gIG1fcFN0cmV0Y2hFbmdpbmUtPlN0YXJ0U3RyZXRjaEhvcnooKTsKLSAgaWYgKFNvdXJjZVNpemVXaXRoaW5MaW1pdChtX3BTb3VyY2UtPkdldFdpZHRoKCksIG1fcFNvdXJjZS0+R2V0SGVpZ2h0KCkpKSB7Ci0gICAgbV9wU3RyZXRjaEVuZ2luZS0+Q29udGludWUobnVsbHB0cik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENGWF9JbWFnZVN0cmV0Y2hlcjo6Q29udGludWVTdHJldGNoKElGWF9QYXVzZSogcFBhdXNlKSB7Ci0gIHJldHVybiBtX3BTdHJldGNoRW5naW5lICYmIG1fcFN0cmV0Y2hFbmdpbmUtPkNvbnRpbnVlKHBQYXVzZSk7Ci19Ci0KLWJvb2wgQ0ZYX0ltYWdlU3RyZXRjaGVyOjpTdGFydFF1aWNrU3RyZXRjaCgpIHsKLSAgaWYgKG1fRGVzdFdpZHRoIDwgMCkgewotICAgIG1fYkZsaXBYID0gdHJ1ZTsKLSAgICBtX0Rlc3RXaWR0aCA9IC1tX0Rlc3RXaWR0aDsKLSAgfQotICBpZiAobV9EZXN0SGVpZ2h0IDwgMCkgewotICAgIG1fYkZsaXBZID0gdHJ1ZTsKLSAgICBtX0Rlc3RIZWlnaHQgPSAtbV9EZXN0SGVpZ2h0OwotICB9Ci0gIHVpbnQzMl90IHNpemUgPSBtX0NsaXBSZWN0LldpZHRoKCk7Ci0gIGlmIChzaXplICYmIG1fRGVzdEJQUCA+IChpbnQpKElOVF9NQVggLyBzaXplKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBzaXplICo9IG1fRGVzdEJQUDsKLSAgbV9wU2NhbmxpbmUucmVzZXQoRlhfQWxsb2ModWludDhfdCwgKHNpemUgLyA4ICsgMykgLyA0ICogNCkpOwotICBpZiAobV9wU291cmNlLT5tX3BBbHBoYU1hc2spCi0gICAgbV9wTWFza1NjYW5saW5lLnJlc2V0KEZYX0FsbG9jKHVpbnQ4X3QsIChtX0NsaXBSZWN0LldpZHRoKCkgKyAzKSAvIDQgKiA0KSk7Ci0KLSAgaWYgKFNvdXJjZVNpemVXaXRoaW5MaW1pdChtX3BTb3VyY2UtPkdldFdpZHRoKCksIG1fcFNvdXJjZS0+R2V0SGVpZ2h0KCkpKSB7Ci0gICAgQ29udGludWVRdWlja1N0cmV0Y2gobnVsbHB0cik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENGWF9JbWFnZVN0cmV0Y2hlcjo6Q29udGludWVRdWlja1N0cmV0Y2goSUZYX1BhdXNlKiBwUGF1c2UpIHsKLSAgaWYgKCFtX3BTY2FubGluZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW50IHJlc3VsdF93aWR0aCA9IG1fQ2xpcFJlY3QuV2lkdGgoKTsKLSAgaW50IHJlc3VsdF9oZWlnaHQgPSBtX0NsaXBSZWN0LkhlaWdodCgpOwotICBpbnQgc3JjX2hlaWdodCA9IG1fcFNvdXJjZS0+R2V0SGVpZ2h0KCk7Ci0gIGZvciAoOyBtX0xpbmVJbmRleCA8IHJlc3VsdF9oZWlnaHQ7IG1fTGluZUluZGV4KyspIHsKLSAgICBpbnQgZGVzdF95OwotICAgIGludCBzcmNfeTsKLSAgICBpZiAobV9iRmxpcFkpIHsKLSAgICAgIGRlc3RfeSA9IHJlc3VsdF9oZWlnaHQgLSBtX0xpbmVJbmRleCAtIDE7Ci0gICAgICBzcmNfeSA9IChtX0Rlc3RIZWlnaHQgLSAoZGVzdF95ICsgbV9DbGlwUmVjdC50b3ApIC0gMSkgKiBzcmNfaGVpZ2h0IC8KLSAgICAgICAgICAgICAgbV9EZXN0SGVpZ2h0OwotICAgIH0gZWxzZSB7Ci0gICAgICBkZXN0X3kgPSBtX0xpbmVJbmRleDsKLSAgICAgIHNyY195ID0gKGRlc3RfeSArIG1fQ2xpcFJlY3QudG9wKSAqIHNyY19oZWlnaHQgLyBtX0Rlc3RIZWlnaHQ7Ci0gICAgfQotICAgIHNyY195ID0gc3RkOjptYXgoc3RkOjptaW4oc3JjX3ksIHNyY19oZWlnaHQgLSAxKSwgMCk7Ci0KLSAgICBpZiAobV9wU291cmNlLT5Ta2lwVG9TY2FubGluZShzcmNfeSwgcFBhdXNlKSkKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgbV9wU291cmNlLT5Eb3duU2FtcGxlU2NhbmxpbmUoc3JjX3ksIG1fcFNjYW5saW5lLmdldCgpLCBtX0Rlc3RCUFAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9EZXN0V2lkdGgsIG1fYkZsaXBYLCBtX0NsaXBSZWN0LmxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X3dpZHRoKTsKLSAgICBpZiAobV9wTWFza1NjYW5saW5lKSB7Ci0gICAgICBtX3BTb3VyY2UtPm1fcEFscGhhTWFzay0+RG93blNhbXBsZVNjYW5saW5lKAotICAgICAgICAgIHNyY195LCBtX3BNYXNrU2NhbmxpbmUuZ2V0KCksIDEsIG1fRGVzdFdpZHRoLCBtX2JGbGlwWCwKLSAgICAgICAgICBtX0NsaXBSZWN0LmxlZnQsIHJlc3VsdF93aWR0aCk7Ci0gICAgfQotICAgIG1fcERlc3QtPkNvbXBvc2VTY2FubGluZShkZXN0X3ksIG1fcFNjYW5saW5lLmdldCgpLCBtX3BNYXNrU2NhbmxpbmUuZ2V0KCkpOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9kaWIvZnhfZGliX2VuZ2luZV91bml0dGVzdC5jcHAgYi9jb3JlL2Z4Z2UvZGliL2Z4X2RpYl9lbmdpbmVfdW5pdHRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDVkNzYxLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnhnZS9kaWIvZnhfZGliX2VuZ2luZV91bml0dGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bWJlci5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfZGlic291cmNlLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9tZW1vcnkuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2RpYl9pbnQuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotCi1URVNUKENTdHJldGNoRW5naW5lLCBPdmVyZmxvd0luQ3RvcikgewotICBGWF9SRUNUIGNsaXBfcmVjdDsKLSAgc3RkOjp1bmlxdWVfcHRyPENQREZfRGljdGlvbmFyeT4gZGljdF9vYmogPQotICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4oKTsKLSAgZGljdF9vYmotPlNldE5ld0ZvcjxDUERGX051bWJlcj4oIldpZHRoIiwgNzEwMDApOwotICBkaWN0X29iai0+U2V0TmV3Rm9yPENQREZfTnVtYmVyPigiSGVpZ2h0IiwgMTI1MDApOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9TdHJlYW0+IHN0cmVhbSA9Ci0gICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJlYW0+KG51bGxwdHIsIDAsIHN0ZDo6bW92ZShkaWN0X29iaikpOwotICBDUERGX0RJQlNvdXJjZSBkaWJfc291cmNlOwotICBkaWJfc291cmNlLkxvYWQobnVsbHB0ciwgc3RyZWFtLmdldCgpKTsKLSAgQ1N0cmV0Y2hFbmdpbmUgZW5naW5lKG51bGxwdHIsIEZYRElCXzhicHBSZ2IsIDUwMCwgNTAwLCBjbGlwX3JlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAmZGliX3NvdXJjZSwgMCk7Ci0gIEVYUEVDVF9FUShGWERJQl9JTlRFUlBPTCwgZW5naW5lLm1fRmxhZ3MpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2RpYi9meF9kaWJfbWFpbi5jcHAgYi9jb3JlL2Z4Z2UvZGliL2Z4X2RpYl9tYWluLmNwcAppbmRleCA5NmNhZTlkLi42OGUwNmE2IDEwMDY0NAotLS0gYS9jb3JlL2Z4Z2UvZGliL2Z4X2RpYl9tYWluLmNwcAorKysgYi9jb3JlL2Z4Z2UvZGliL2Z4X2RpYl9tYWluLmNwcApAQCAtNiwzNiArNiw4MiBAQAogCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgogCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHR1cGxlPgogI2luY2x1ZGUgPHV0aWxpdHk+CiAKLSNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvZnhfY29kZWMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9tYXliZV9vd25lZC5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZ2Vtb2R1bGUuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2RpYl9pbnQuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZ2UvY2Z4X2NsaXByZ24uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAotdm9pZCBDbXlrRGVjb2RlKHVpbnQzMl90IGNteWssIGludCYgYywgaW50JiBtLCBpbnQmIHksIGludCYgaykgewotICBjID0gRlhTWVNfR2V0Q1ZhbHVlKGNteWspOwotICBtID0gRlhTWVNfR2V0TVZhbHVlKGNteWspOwotICB5ID0gRlhTWVNfR2V0WVZhbHVlKGNteWspOwotICBrID0gRlhTWVNfR2V0S1ZhbHVlKGNteWspOworY29uc3QgaW50MTZfdCBTRFBfVGFibGVbNTEzXSA9IHsKKyAgICAyNTYsIDI1NiwgMjU2LCAyNTYsIDI1NiwgMjU2LCAyNTYsIDI1NiwgMjU2LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjUzLCAyNTMsIDI1MywgMjUyLCAyNTIsIDI1MiwgMjUxLCAyNTEsIDI1MSwgMjUwLCAyNTAsCisgICAgMjQ5LCAyNDksIDI0OSwgMjQ4LCAyNDgsIDI0NywgMjQ3LCAyNDYsIDI0NiwgMjQ1LCAyNDQsIDI0NCwgMjQzLCAyNDMsIDI0MiwKKyAgICAyNDIsIDI0MSwgMjQwLCAyNDAsIDIzOSwgMjM4LCAyMzgsIDIzNywgMjM2LCAyMzYsIDIzNSwgMjM0LCAyMzMsIDIzMywgMjMyLAorICAgIDIzMSwgMjMwLCAyMzAsIDIyOSwgMjI4LCAyMjcsIDIyNiwgMjI2LCAyMjUsIDIyNCwgMjIzLCAyMjIsIDIyMSwgMjIwLCAyMTksCisgICAgMjE4LCAyMTgsIDIxNywgMjE2LCAyMTUsIDIxNCwgMjEzLCAyMTIsIDIxMSwgMjEwLCAyMDksIDIwOCwgMjA3LCAyMDYsIDIwNSwKKyAgICAyMDQsIDIwMywgMjAyLCAyMDEsIDIwMCwgMTk5LCAxOTgsIDE5NiwgMTk1LCAxOTQsIDE5MywgMTkyLCAxOTEsIDE5MCwgMTg5LAorICAgIDE4OCwgMTg2LCAxODUsIDE4NCwgMTgzLCAxODIsIDE4MSwgMTc5LCAxNzgsIDE3NywgMTc2LCAxNzUsIDE3MywgMTcyLCAxNzEsCisgICAgMTcwLCAxNjksIDE2NywgMTY2LCAxNjUsIDE2NCwgMTYyLCAxNjEsIDE2MCwgMTU5LCAxNTcsIDE1NiwgMTU1LCAxNTQsIDE1MiwKKyAgICAxNTEsIDE1MCwgMTQ5LCAxNDcsIDE0NiwgMTQ1LCAxNDMsIDE0MiwgMTQxLCAxNDAsIDEzOCwgMTM3LCAxMzYsIDEzNCwgMTMzLAorICAgIDEzMiwgMTMwLCAxMjksIDEyOCwgMTI2LCAxMjUsIDEyNCwgMTIyLCAxMjEsIDEyMCwgMTE5LCAxMTcsIDExNiwgMTE1LCAxMTMsCisgICAgMTEyLCAxMTEsIDEwOSwgMTA4LCAxMDcsIDEwNSwgMTA0LCAxMDMsIDEwMSwgMTAwLCA5OSwgIDk3LCAgOTYsICA5NSwgIDkzLAorICAgIDkyLCAgOTEsICA4OSwgIDg4LCAgODcsICA4NSwgIDg0LCAgODMsICA4MSwgIDgwLCAgNzksICA3NywgIDc2LCAgNzUsICA3MywKKyAgICA3MiwgIDcxLCAgNjksICA2OCwgIDY3LCAgNjYsICA2NCwgIDYzLCAgNjIsICA2MCwgIDU5LCAgNTgsICA1NywgIDU1LCAgNTQsCisgICAgNTMsICA1MiwgIDUwLCAgNDksICA0OCwgIDQ3LCAgNDUsICA0NCwgIDQzLCAgNDIsICA0MCwgIDM5LCAgMzgsICAzNywgIDM2LAorICAgIDM0LCAgMzMsICAzMiwgIDMxLCAgMzAsICAyOCwgIDI3LCAgMjYsICAyNSwgIDI0LCAgMjMsICAyMSwgIDIwLCAgMTksICAxOCwKKyAgICAxNywgIDE2LCAgMTUsICAxNCwgIDEzLCAgMTEsICAxMCwgIDksICAgOCwgICA3LCAgIDYsICAgNSwgICA0LCAgIDMsICAgMiwKKyAgICAxLCAgIDAsICAgMCwgICAtMSwgIC0yLCAgLTMsICAtNCwgIC01LCAgLTYsICAtNywgIC03LCAgLTgsICAtOSwgIC0xMCwgLTExLAorICAgIC0xMiwgLTEyLCAtMTMsIC0xNCwgLTE1LCAtMTUsIC0xNiwgLTE3LCAtMTcsIC0xOCwgLTE5LCAtMTksIC0yMCwgLTIxLCAtMjEsCisgICAgLTIyLCAtMjIsIC0yMywgLTI0LCAtMjQsIC0yNSwgLTI1LCAtMjYsIC0yNiwgLTI3LCAtMjcsIC0yNywgLTI4LCAtMjgsIC0yOSwKKyAgICAtMjksIC0zMCwgLTMwLCAtMzAsIC0zMSwgLTMxLCAtMzEsIC0zMiwgLTMyLCAtMzIsIC0zMywgLTMzLCAtMzMsIC0zMywgLTM0LAorICAgIC0zNCwgLTM0LCAtMzQsIC0zNSwgLTM1LCAtMzUsIC0zNSwgLTM1LCAtMzYsIC0zNiwgLTM2LCAtMzYsIC0zNiwgLTM2LCAtMzYsCisgICAgLTM2LCAtMzYsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywKKyAgICAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM2LCAtMzYsIC0zNiwgLTM2LCAtMzYsIC0zNiwgLTM2LAorICAgIC0zNiwgLTM2LCAtMzUsIC0zNSwgLTM1LCAtMzUsIC0zNSwgLTM1LCAtMzQsIC0zNCwgLTM0LCAtMzQsIC0zNCwgLTMzLCAtMzMsCisgICAgLTMzLCAtMzMsIC0zMywgLTMyLCAtMzIsIC0zMiwgLTMyLCAtMzEsIC0zMSwgLTMxLCAtMzEsIC0zMCwgLTMwLCAtMzAsIC0zMCwKKyAgICAtMjksIC0yOSwgLTI5LCAtMjksIC0yOCwgLTI4LCAtMjgsIC0yNywgLTI3LCAtMjcsIC0yNywgLTI2LCAtMjYsIC0yNiwgLTI1LAorICAgIC0yNSwgLTI1LCAtMjQsIC0yNCwgLTI0LCAtMjMsIC0yMywgLTIzLCAtMjIsIC0yMiwgLTIyLCAtMjIsIC0yMSwgLTIxLCAtMjEsCisgICAgLTIwLCAtMjAsIC0yMCwgLTE5LCAtMTksIC0xOSwgLTE4LCAtMTgsIC0xOCwgLTE3LCAtMTcsIC0xNywgLTE2LCAtMTYsIC0xNiwKKyAgICAtMTUsIC0xNSwgLTE1LCAtMTQsIC0xNCwgLTE0LCAtMTMsIC0xMywgLTEzLCAtMTIsIC0xMiwgLTEyLCAtMTEsIC0xMSwgLTExLAorICAgIC0xMCwgLTEwLCAtMTAsIC05LCAgLTksICAtOSwgIC05LCAgLTgsICAtOCwgIC04LCAgLTcsICAtNywgIC03LCAgLTcsICAtNiwKKyAgICAtNiwgIC02LCAgLTYsICAtNSwgIC01LCAgLTUsICAtNSwgIC00LCAgLTQsICAtNCwgIC00LCAgLTMsICAtMywgIC0zLCAgLTMsCisgICAgLTMsICAtMiwgIC0yLCAgLTIsICAtMiwgIC0yLCAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgMCwgICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgMCwgICAwLCAgIDAsCit9OworCitGWF9SRUNUIEZYRElCX1N3YXBDbGlwQm94KEZYX1JFQ1QmIGNsaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmxpcFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZsaXBZKSB7CisgIEZYX1JFQ1QgcmVjdDsKKyAgaWYgKGJGbGlwWSkgeworICAgIHJlY3QubGVmdCA9IGhlaWdodCAtIGNsaXAudG9wOworICAgIHJlY3QucmlnaHQgPSBoZWlnaHQgLSBjbGlwLmJvdHRvbTsKKyAgfSBlbHNlIHsKKyAgICByZWN0LmxlZnQgPSBjbGlwLnRvcDsKKyAgICByZWN0LnJpZ2h0ID0gY2xpcC5ib3R0b207CisgIH0KKyAgaWYgKGJGbGlwWCkgeworICAgIHJlY3QudG9wID0gd2lkdGggLSBjbGlwLmxlZnQ7CisgICAgcmVjdC5ib3R0b20gPSB3aWR0aCAtIGNsaXAucmlnaHQ7CisgIH0gZWxzZSB7CisgICAgcmVjdC50b3AgPSBjbGlwLmxlZnQ7CisgICAgcmVjdC5ib3R0b20gPSBjbGlwLnJpZ2h0OworICB9CisgIHJlY3QuTm9ybWFsaXplKCk7CisgIHJldHVybiByZWN0OwogfQogCi12b2lkIEFyZ2JEZWNvZGUodWludDMyX3QgYXJnYiwgaW50JiBhLCBpbnQmIHIsIGludCYgZywgaW50JiBiKSB7Ci0gIGEgPSBGWEFSR0JfQShhcmdiKTsKLSAgciA9IEZYQVJHQl9SKGFyZ2IpOwotICBnID0gRlhBUkdCX0coYXJnYik7Ci0gIGIgPSBGWEFSR0JfQihhcmdiKTsKK3N0ZDo6dHVwbGU8aW50LCBpbnQsIGludCwgaW50PiBBcmdiRGVjb2RlKEZYX0FSR0IgYXJnYikgeworICByZXR1cm4gc3RkOjptYWtlX3R1cGxlKEZYQVJHQl9BKGFyZ2IpLCBGWEFSR0JfUihhcmdiKSwgRlhBUkdCX0coYXJnYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX0IoYXJnYikpOwogfQogCi12b2lkIEFyZ2JEZWNvZGUodWludDMyX3QgYXJnYiwgaW50JiBhLCBGWF9DT0xPUlJFRiYgcmdiKSB7Ci0gIGEgPSBGWEFSR0JfQShhcmdiKTsKLSAgcmdiID0gRlhTWVNfUkdCKEZYQVJHQl9SKGFyZ2IpLCBGWEFSR0JfRyhhcmdiKSwgRlhBUkdCX0IoYXJnYikpOworc3RkOjpwYWlyPGludCwgRlhfQ09MT1JSRUY+IEFyZ2JUb0NvbG9yUmVmKEZYX0FSR0IgYXJnYikgeworICByZXR1cm4ge0ZYQVJHQl9BKGFyZ2IpLAorICAgICAgICAgIEZYU1lTX1JHQihGWEFSR0JfUihhcmdiKSwgRlhBUkdCX0coYXJnYiksIEZYQVJHQl9CKGFyZ2IpKX07CiB9CiAKIHVpbnQzMl90IEFyZ2JFbmNvZGUoaW50IGEsIEZYX0NPTE9SUkVGIHJnYikgewpAQCAtNDMsMTYwNSArODksNTIgQEAKICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldEJWYWx1ZShyZ2IpKTsKIH0KIAotQ0ZYX0RJQlNvdXJjZTo6Q0ZYX0RJQlNvdXJjZSgpCi0gICAgOiBtX3BBbHBoYU1hc2sobnVsbHB0ciksCi0gICAgICBtX1dpZHRoKDApLAotICAgICAgbV9IZWlnaHQoMCksCi0gICAgICBtX2JwcCgwKSwKLSAgICAgIG1fQWxwaGFGbGFnKDApLAotICAgICAgbV9QaXRjaCgwKSB7fQorRlhfQVJHQiBTdHJpbmdUb0ZYQVJHQihjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NWYWx1ZSkgeworICB1aW50OF90IHIgPSAwLCBnID0gMCwgYiA9IDA7CisgIGlmICh3c1ZhbHVlLkdldExlbmd0aCgpID09IDApCisgICAgcmV0dXJuIDB4ZmYwMDAwMDA7CiAKLUNGWF9ESUJTb3VyY2U6On5DRlhfRElCU291cmNlKCkgewotICBkZWxldGUgbV9wQWxwaGFNYXNrOwotfQorICBpbnQgY2MgPSAwOworICBjb25zdCB3Y2hhcl90KiBzdHIgPSB3c1ZhbHVlLnVudGVybWluYXRlZF9jX3N0cigpOworICBpbnQgbGVuID0gd3NWYWx1ZS5HZXRMZW5ndGgoKTsKKyAgd2hpbGUgKEZYU1lTX2lzd3NwYWNlKHN0cltjY10pICYmIGNjIDwgbGVuKQorICAgIGNjKys7CiAKLXVpbnQ4X3QqIENGWF9ESUJTb3VyY2U6OkdldEJ1ZmZlcigpIGNvbnN0IHsKLSAgcmV0dXJuIG51bGxwdHI7Ci19CisgIGlmIChjYyA+PSBsZW4pCisgICAgcmV0dXJuIDB4ZmYwMDAwMDA7CiAKLWJvb2wgQ0ZYX0RJQlNvdXJjZTo6U2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKSBjb25zdCB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotQ0ZYX0RJQml0bWFwOjpDRlhfRElCaXRtYXAoKSB7Ci0gIG1fYkV4dEJ1ZiA9IGZhbHNlOwotICBtX3BCdWZmZXIgPSBudWxscHRyOwotICBtX3BQYWxldHRlID0gbnVsbHB0cjsKLSNpZmRlZiBfU0tJQV9TVVBQT1JUX1BBVEhTXwotICBtX25Gb3JtYXQgPSBGb3JtYXQ6OmtDbGVhcmVkOwotI2VuZGlmCi19Ci0KLSNkZWZpbmUgX01BWF9PT01fTElNSVRfIDEyMDAwMDAwCi1ib29sIENGWF9ESUJpdG1hcDo6Q3JlYXRlKGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoKSB7Ci0gIG1fcEJ1ZmZlciA9IG51bGxwdHI7Ci0gIG1fYnBwID0gKHVpbnQ4X3QpZm9ybWF0OwotICBtX0FscGhhRmxhZyA9ICh1aW50OF90KShmb3JtYXQgPj4gOCk7Ci0gIG1fV2lkdGggPSBtX0hlaWdodCA9IG1fUGl0Y2ggPSAwOwotICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCB8fCBwaXRjaCA8IDApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKChJTlRfTUFYIC0gMzEpIC8gd2lkdGggPCAoZm9ybWF0ICYgMHhmZikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFwaXRjaCkgewotICAgIHBpdGNoID0gKHdpZHRoICogKGZvcm1hdCAmIDB4ZmYpICsgMzEpIC8gMzIgKiA0OwotICB9Ci0gIGlmICgoMSA8PCAzMCkgLyBwaXRjaCA8IGhlaWdodCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAocEJ1ZmZlcikgewotICAgIG1fcEJ1ZmZlciA9IHBCdWZmZXI7Ci0gICAgbV9iRXh0QnVmID0gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBpbnQgc2l6ZSA9IHBpdGNoICogaGVpZ2h0ICsgNDsKLSAgICBpbnQgb29tbGltaXQgPSBfTUFYX09PTV9MSU1JVF87Ci0gICAgaWYgKG9vbWxpbWl0ID49IDAgJiYgc2l6ZSA+PSBvb21saW1pdCkgewotICAgICAgbV9wQnVmZmVyID0gRlhfVHJ5QWxsb2ModWludDhfdCwgc2l6ZSk7Ci0gICAgICBpZiAoIW1fcEJ1ZmZlcikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1fcEJ1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOwotICAgIH0KLSAgfQotICBtX1dpZHRoID0gd2lkdGg7Ci0gIG1fSGVpZ2h0ID0gaGVpZ2h0OwotICBtX1BpdGNoID0gcGl0Y2g7Ci0gIGlmIChIYXNBbHBoYSgpICYmIGZvcm1hdCAhPSBGWERJQl9BcmdiKSB7Ci0gICAgYm9vbCByZXQgPSB0cnVlOwotICAgIHJldCA9IEJ1aWxkQWxwaGFNYXNrKCk7Ci0gICAgaWYgKCFyZXQpIHsKLSAgICAgIGlmICghbV9iRXh0QnVmKSB7Ci0gICAgICAgIEZYX0ZyZWUobV9wQnVmZmVyKTsKLSAgICAgICAgbV9wQnVmZmVyID0gbnVsbHB0cjsKLSAgICAgICAgbV9XaWR0aCA9IG1fSGVpZ2h0ID0gbV9QaXRjaCA9IDA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0ZYX0RJQml0bWFwOjpDb3B5KGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmMpIHsKLSAgaWYgKG1fcEJ1ZmZlcikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFDcmVhdGUocFNyYy0+R2V0V2lkdGgoKSwgcFNyYy0+R2V0SGVpZ2h0KCksIHBTcmMtPkdldEZvcm1hdCgpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgU2V0UGFsZXR0ZShwU3JjLT5HZXRQYWxldHRlKCkpOwotICBTZXRBbHBoYU1hc2socFNyYy0+bV9wQWxwaGFNYXNrKTsKLSAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgcFNyYy0+R2V0SGVpZ2h0KCk7IHJvdysrKQotICAgIEZYU1lTX21lbWNweShtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoLCBwU3JjLT5HZXRTY2FubGluZShyb3cpLCBtX1BpdGNoKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotQ0ZYX0RJQml0bWFwOjp+Q0ZYX0RJQml0bWFwKCkgewotICBpZiAoIW1fYkV4dEJ1ZikKLSAgICBGWF9GcmVlKG1fcEJ1ZmZlcik7Ci0KLSAgbV9wQnVmZmVyID0gbnVsbHB0cjsKLX0KLQotdWludDhfdCogQ0ZYX0RJQml0bWFwOjpHZXRCdWZmZXIoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BCdWZmZXI7Ci19Ci0KLWNvbnN0IHVpbnQ4X3QqIENGWF9ESUJpdG1hcDo6R2V0U2NhbmxpbmUoaW50IGxpbmUpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcEJ1ZmZlciA/IG1fcEJ1ZmZlciArIGxpbmUgKiBtX1BpdGNoIDogbnVsbHB0cjsKLX0KLQotdm9pZCBDRlhfRElCaXRtYXA6OlRha2VPdmVyKENGWF9ESUJpdG1hcCogcFNyY0JpdG1hcCkgewotICBpZiAoIW1fYkV4dEJ1ZikKLSAgICBGWF9GcmVlKG1fcEJ1ZmZlcik7Ci0KLSAgZGVsZXRlIG1fcEFscGhhTWFzazsKLSAgbV9wQnVmZmVyID0gcFNyY0JpdG1hcC0+bV9wQnVmZmVyOwotICBtX3BQYWxldHRlID0gc3RkOjptb3ZlKHBTcmNCaXRtYXAtPm1fcFBhbGV0dGUpOwotICBtX3BBbHBoYU1hc2sgPSBwU3JjQml0bWFwLT5tX3BBbHBoYU1hc2s7Ci0gIHBTcmNCaXRtYXAtPm1fcEJ1ZmZlciA9IG51bGxwdHI7Ci0gIHBTcmNCaXRtYXAtPm1fcEFscGhhTWFzayA9IG51bGxwdHI7Ci0gIG1fYnBwID0gcFNyY0JpdG1hcC0+bV9icHA7Ci0gIG1fYkV4dEJ1ZiA9IHBTcmNCaXRtYXAtPm1fYkV4dEJ1ZjsKLSAgbV9BbHBoYUZsYWcgPSBwU3JjQml0bWFwLT5tX0FscGhhRmxhZzsKLSAgbV9XaWR0aCA9IHBTcmNCaXRtYXAtPm1fV2lkdGg7Ci0gIG1fSGVpZ2h0ID0gcFNyY0JpdG1hcC0+bV9IZWlnaHQ7Ci0gIG1fUGl0Y2ggPSBwU3JjQml0bWFwLT5tX1BpdGNoOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBDRlhfRElCU291cmNlOjpDbG9uZShjb25zdCBGWF9SRUNUKiBwQ2xpcCkgY29uc3QgewotICBGWF9SRUNUIHJlY3QoMCwgMCwgbV9XaWR0aCwgbV9IZWlnaHQpOwotICBpZiAocENsaXApIHsKLSAgICByZWN0LkludGVyc2VjdCgqcENsaXApOwotICAgIGlmIChyZWN0LklzRW1wdHkoKSkKLSAgICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIGF1dG8gcE5ld0JpdG1hcCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfRElCaXRtYXA+KCk7Ci0gIGlmICghcE5ld0JpdG1hcC0+Q3JlYXRlKHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgR2V0Rm9ybWF0KCkpKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIHBOZXdCaXRtYXAtPlNldFBhbGV0dGUobV9wUGFsZXR0ZS5nZXQoKSk7Ci0gIHBOZXdCaXRtYXAtPlNldEFscGhhTWFzayhtX3BBbHBoYU1hc2ssIHBDbGlwKTsKLSAgaWYgKEdldEJQUCgpID09IDEgJiYgcmVjdC5sZWZ0ICUgOCAhPSAwKSB7Ci0gICAgaW50IGxlZnRfc2hpZnQgPSByZWN0LmxlZnQgJSAzMjsKLSAgICBpbnQgcmlnaHRfc2hpZnQgPSAzMiAtIGxlZnRfc2hpZnQ7Ci0gICAgaW50IGR3b3JkX2NvdW50ID0gcE5ld0JpdG1hcC0+bV9QaXRjaCAvIDQ7Ci0gICAgZm9yIChpbnQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyByb3crKykgewotICAgICAgdWludDMyX3QqIHNyY19zY2FuID0gKHVpbnQzMl90KilHZXRTY2FubGluZShyb3cpICsgcmVjdC5sZWZ0IC8gMzI7Ci0gICAgICB1aW50MzJfdCogZGVzdF9zY2FuID0gKHVpbnQzMl90KilwTmV3Qml0bWFwLT5HZXRTY2FubGluZShyb3cgLSByZWN0LnRvcCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGR3b3JkX2NvdW50OyBpKyspIHsKLSAgICAgICAgZGVzdF9zY2FuW2ldID0KLSAgICAgICAgICAgIChzcmNfc2NhbltpXSA8PCBsZWZ0X3NoaWZ0KSB8IChzcmNfc2NhbltpICsgMV0gPj4gcmlnaHRfc2hpZnQpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpbnQgY29weV9sZW4gPSAocE5ld0JpdG1hcC0+R2V0V2lkdGgoKSAqIHBOZXdCaXRtYXAtPkdldEJQUCgpICsgNykgLyA4OwotICAgIGlmIChtX1BpdGNoIDwgKHVpbnQzMl90KWNvcHlfbGVuKQotICAgICAgY29weV9sZW4gPSBtX1BpdGNoOwotCi0gICAgZm9yIChpbnQgcm93ID0gcmVjdC50b3A7IHJvdyA8IHJlY3QuYm90dG9tOyByb3crKykgewotICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBHZXRTY2FubGluZShyb3cpICsgcmVjdC5sZWZ0ICogbV9icHAgLyA4OwotICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gKHVpbnQ4X3QqKXBOZXdCaXRtYXAtPkdldFNjYW5saW5lKHJvdyAtIHJlY3QudG9wKTsKLSAgICAgIEZYU1lTX21lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCBjb3B5X2xlbik7Ci0gICAgfQotICB9Ci0gIHJldHVybiBwTmV3Qml0bWFwOwotfQotCi12b2lkIENGWF9ESUJTb3VyY2U6OkJ1aWxkUGFsZXR0ZSgpIHsKLSAgaWYgKG1fcFBhbGV0dGUpCi0gICAgcmV0dXJuOwotCi0gIGlmIChHZXRCUFAoKSA9PSAxKSB7Ci0gICAgbV9wUGFsZXR0ZS5yZXNldChGWF9BbGxvYyh1aW50MzJfdCwgMikpOwotICAgIGlmIChJc0NteWtJbWFnZSgpKSB7Ci0gICAgICBtX3BQYWxldHRlLmdldCgpWzBdID0gMHhmZjsKLSAgICAgIG1fcFBhbGV0dGUuZ2V0KClbMV0gPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICBtX3BQYWxldHRlLmdldCgpWzBdID0gMHhmZjAwMDAwMDsKLSAgICAgIG1fcFBhbGV0dGUuZ2V0KClbMV0gPSAweGZmZmZmZmZmOwotICAgIH0KLSAgfSBlbHNlIGlmIChHZXRCUFAoKSA9PSA4KSB7Ci0gICAgbV9wUGFsZXR0ZS5yZXNldChGWF9BbGxvYyh1aW50MzJfdCwgMjU2KSk7Ci0gICAgaWYgKElzQ215a0ltYWdlKCkpIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspCi0gICAgICAgIG1fcFBhbGV0dGUuZ2V0KClbaV0gPSAweGZmIC0gaTsKLSAgICB9IGVsc2UgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICAgICAgbV9wUGFsZXR0ZS5nZXQoKVtpXSA9IDB4ZmYwMDAwMDAgfCAoaSAqIDB4MTAxMDEpOwotICAgIH0KLSAgfQotfQotCi1ib29sIENGWF9ESUJTb3VyY2U6OkJ1aWxkQWxwaGFNYXNrKCkgewotICBpZiAobV9wQWxwaGFNYXNrKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgbV9wQWxwaGFNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgaWYgKCFtX3BBbHBoYU1hc2stPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7Ci0gICAgZGVsZXRlIG1fcEFscGhhTWFzazsKLSAgICBtX3BBbHBoYU1hc2sgPSBudWxscHRyOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBGWFNZU19tZW1zZXQobV9wQWxwaGFNYXNrLT5HZXRCdWZmZXIoKSwgMHhmZiwKLSAgICAgICAgICAgICAgIG1fcEFscGhhTWFzay0+R2V0SGVpZ2h0KCkgKiBtX3BBbHBoYU1hc2stPkdldFBpdGNoKCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdWludDMyX3QgQ0ZYX0RJQlNvdXJjZTo6R2V0UGFsZXR0ZUVudHJ5KGludCBpbmRleCkgY29uc3QgewotICBBU1NFUlQoKEdldEJQUCgpID09IDEgfHwgR2V0QlBQKCkgPT0gOCkgJiYgIUlzQWxwaGFNYXNrKCkpOwotICBpZiAobV9wUGFsZXR0ZSkgewotICAgIHJldHVybiBtX3BQYWxldHRlLmdldCgpW2luZGV4XTsKLSAgfQotICBpZiAoSXNDbXlrSW1hZ2UoKSkgewotICAgIGlmIChHZXRCUFAoKSA9PSAxKSB7Ci0gICAgICByZXR1cm4gaW5kZXggPyAwIDogMHhmZjsKLSAgICB9Ci0gICAgcmV0dXJuIDB4ZmYgLSBpbmRleDsKLSAgfQotICBpZiAoR2V0QlBQKCkgPT0gMSkgewotICAgIHJldHVybiBpbmRleCA/IDB4ZmZmZmZmZmYgOiAweGZmMDAwMDAwOwotICB9Ci0gIHJldHVybiBpbmRleCAqIDB4MTAxMDEgfCAweGZmMDAwMDAwOwotfQotCi12b2lkIENGWF9ESUJTb3VyY2U6OlNldFBhbGV0dGVFbnRyeShpbnQgaW5kZXgsIHVpbnQzMl90IGNvbG9yKSB7Ci0gIEFTU0VSVCgoR2V0QlBQKCkgPT0gMSB8fCBHZXRCUFAoKSA9PSA4KSAmJiAhSXNBbHBoYU1hc2soKSk7Ci0gIGlmICghbV9wUGFsZXR0ZSkgewotICAgIEJ1aWxkUGFsZXR0ZSgpOwotICB9Ci0gIG1fcFBhbGV0dGUuZ2V0KClbaW5kZXhdID0gY29sb3I7Ci19Ci0KLWludCBDRlhfRElCU291cmNlOjpGaW5kUGFsZXR0ZSh1aW50MzJfdCBjb2xvcikgY29uc3QgewotICBBU1NFUlQoKEdldEJQUCgpID09IDEgfHwgR2V0QlBQKCkgPT0gOCkgJiYgIUlzQWxwaGFNYXNrKCkpOwotICBpZiAoIW1fcFBhbGV0dGUpIHsKLSAgICBpZiAoSXNDbXlrSW1hZ2UoKSkgewotICAgICAgaWYgKEdldEJQUCgpID09IDEpIHsKLSAgICAgICAgcmV0dXJuICgodWludDhfdCljb2xvciA9PSAweGZmKSA/IDAgOiAxOwotICAgICAgfQotICAgICAgcmV0dXJuIDB4ZmYgLSAodWludDhfdCljb2xvcjsKLSAgICB9Ci0gICAgaWYgKEdldEJQUCgpID09IDEpIHsKLSAgICAgIHJldHVybiAoKHVpbnQ4X3QpY29sb3IgPT0gMHhmZikgPyAxIDogMDsKLSAgICB9Ci0gICAgcmV0dXJuICh1aW50OF90KWNvbG9yOwotICB9Ci0gIGludCBwYWxzaXplID0gKDEgPDwgR2V0QlBQKCkpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHBhbHNpemU7IGkrKykKLSAgICBpZiAobV9wUGFsZXR0ZS5nZXQoKVtpXSA9PSBjb2xvcikgewotICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICByZXR1cm4gLTE7Ci19Ci0KLXZvaWQgQ0ZYX0RJQml0bWFwOjpDbGVhcih1aW50MzJfdCBjb2xvcikgewotICBpZiAoIW1fcEJ1ZmZlcikgewotICAgIHJldHVybjsKLSAgfQotICBzd2l0Y2ggKEdldEZvcm1hdCgpKSB7Ci0gICAgY2FzZSBGWERJQl8xYnBwTWFzazoKLSAgICAgIEZYU1lTX21lbXNldChtX3BCdWZmZXIsIChjb2xvciAmIDB4ZmYwMDAwMDApID8gMHhmZiA6IDAsCi0gICAgICAgICAgICAgICAgICAgbV9QaXRjaCAqIG1fSGVpZ2h0KTsKKyAgd2hpbGUgKGNjIDwgbGVuKSB7CisgICAgaWYgKHN0cltjY10gPT0gJywnIHx8ICFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkKICAgICAgIGJyZWFrOwotICAgIGNhc2UgRlhESUJfMWJwcFJnYjogewotICAgICAgaW50IGluZGV4ID0gRmluZFBhbGV0dGUoY29sb3IpOwotICAgICAgRlhTWVNfbWVtc2V0KG1fcEJ1ZmZlciwgaW5kZXggPyAweGZmIDogMCwgbV9QaXRjaCAqIG1fSGVpZ2h0KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZYRElCXzhicHBNYXNrOgotICAgICAgRlhTWVNfbWVtc2V0KG1fcEJ1ZmZlciwgY29sb3IgPj4gMjQsIG1fUGl0Y2ggKiBtX0hlaWdodCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsKLSAgICAgIGludCBpbmRleCA9IEZpbmRQYWxldHRlKGNvbG9yKTsKLSAgICAgIEZYU1lTX21lbXNldChtX3BCdWZmZXIsIGluZGV4LCBtX1BpdGNoICogbV9IZWlnaHQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRlhESUJfUmdiOgotICAgIGNhc2UgRlhESUJfUmdiYTogewotICAgICAgaW50IGEsIHIsIGcsIGI7Ci0gICAgICBBcmdiRGVjb2RlKGNvbG9yLCBhLCByLCBnLCBiKTsKLSAgICAgIGlmIChyID09IGcgJiYgZyA9PSBiKSB7Ci0gICAgICAgIEZYU1lTX21lbXNldChtX3BCdWZmZXIsIHIsIG1fUGl0Y2ggKiBtX0hlaWdodCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbnQgYnl0ZV9wb3MgPSAwOwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgewotICAgICAgICAgIG1fcEJ1ZmZlcltieXRlX3BvcysrXSA9IGI7Ci0gICAgICAgICAgbV9wQnVmZmVyW2J5dGVfcG9zKytdID0gZzsKLSAgICAgICAgICBtX3BCdWZmZXJbYnl0ZV9wb3MrK10gPSByOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IDE7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykgewotICAgICAgICAgIEZYU1lTX21lbWNweShtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoLCBtX3BCdWZmZXIsIG1fUGl0Y2gpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGWERJQl9SZ2IzMjoKLSAgICBjYXNlIEZYRElCX0FyZ2I6IHsKLSAgICAgIGNvbG9yID0gSXNDbXlrSW1hZ2UoKSA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOwotI2lmZGVmIF9TS0lBX1NVUFBPUlRfCi0gICAgICBpZiAoRlhESUJfUmdiMzIgPT0gR2V0Rm9ybWF0KCkgJiYgIUlzQ215a0ltYWdlKCkpIHsKLSAgICAgICAgY29sb3IgfD0gMHhGRjAwMDAwMDsKLSAgICAgIH0KLSNlbmRpZgotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX1dpZHRoOyBpKyspIHsKLSAgICAgICAgKCh1aW50MzJfdCopbV9wQnVmZmVyKVtpXSA9IGNvbG9yOwotICAgICAgfQotICAgICAgZm9yIChpbnQgcm93ID0gMTsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweShtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoLCBtX3BCdWZmZXIsIG1fUGl0Y2gpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotfQogCi12b2lkIENGWF9ESUJTb3VyY2U6OkdldE92ZXJsYXBSZWN0KGludCYgZGVzdF9sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgc3JjX3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduKSB7Ci0gIGlmICh3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKSB7Ci0gICAgcmV0dXJuOworICAgIHIgPSByICogMTAgKyBzdHJbY2NdIC0gJzAnOworICAgIGNjKys7CiAgIH0KLSAgQVNTRVJUKHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwKTsKLSAgaWYgKGRlc3RfbGVmdCA+IG1fV2lkdGggfHwgZGVzdF90b3AgPiBtX0hlaWdodCkgewotICAgIHdpZHRoID0gMDsKLSAgICBoZWlnaHQgPSAwOwotICAgIHJldHVybjsKLSAgfQotICBpbnQgeF9vZmZzZXQgPSBkZXN0X2xlZnQgLSBzcmNfbGVmdDsKLSAgaW50IHlfb2Zmc2V0ID0gZGVzdF90b3AgLSBzcmNfdG9wOwotICBGWF9SRUNUIHNyY19yZWN0KHNyY19sZWZ0LCBzcmNfdG9wLCBzcmNfbGVmdCArIHdpZHRoLCBzcmNfdG9wICsgaGVpZ2h0KTsKLSAgRlhfUkVDVCBzcmNfYm91bmQoMCwgMCwgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0KTsKLSAgc3JjX3JlY3QuSW50ZXJzZWN0KHNyY19ib3VuZCk7Ci0gIEZYX1JFQ1QgZGVzdF9yZWN0KHNyY19yZWN0LmxlZnQgKyB4X29mZnNldCwgc3JjX3JlY3QudG9wICsgeV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIHNyY19yZWN0LnJpZ2h0ICsgeF9vZmZzZXQsIHNyY19yZWN0LmJvdHRvbSArIHlfb2Zmc2V0KTsKLSAgRlhfUkVDVCBkZXN0X2JvdW5kKDAsIDAsIG1fV2lkdGgsIG1fSGVpZ2h0KTsKLSAgZGVzdF9yZWN0LkludGVyc2VjdChkZXN0X2JvdW5kKTsKLSAgaWYgKHBDbGlwUmduKSB7Ci0gICAgZGVzdF9yZWN0LkludGVyc2VjdChwQ2xpcFJnbi0+R2V0Qm94KCkpOwotICB9Ci0gIGRlc3RfbGVmdCA9IGRlc3RfcmVjdC5sZWZ0OwotICBkZXN0X3RvcCA9IGRlc3RfcmVjdC50b3A7Ci0gIHNyY19sZWZ0ID0gZGVzdF9sZWZ0IC0geF9vZmZzZXQ7Ci0gIHNyY190b3AgPSBkZXN0X3RvcCAtIHlfb2Zmc2V0OwotICB3aWR0aCA9IGRlc3RfcmVjdC5yaWdodCAtIGRlc3RfcmVjdC5sZWZ0OwotICBoZWlnaHQgPSBkZXN0X3JlY3QuYm90dG9tIC0gZGVzdF9yZWN0LnRvcDsKLX0KKyAgaWYgKGNjIDwgbGVuICYmIHN0cltjY10gPT0gJywnKSB7CisgICAgY2MrKzsKKyAgICB3aGlsZSAoRlhTWVNfaXN3c3BhY2Uoc3RyW2NjXSkgJiYgY2MgPCBsZW4pCisgICAgICBjYysrOwogCi1ib29sIENGWF9ESUJpdG1hcDo6VHJhbnNmZXJCaXRtYXAoaW50IGRlc3RfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3ApIHsKLSAgaWYgKCFtX3BCdWZmZXIpCi0gICAgcmV0dXJuIGZhbHNlOworICAgIHdoaWxlIChjYyA8IGxlbikgeworICAgICAgaWYgKHN0cltjY10gPT0gJywnIHx8ICFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkKKyAgICAgICAgYnJlYWs7CiAKLSAgR2V0T3ZlcmxhcFJlY3QoZGVzdF9sZWZ0LCBkZXN0X3RvcCwgd2lkdGgsIGhlaWdodCwgcFNyY0JpdG1hcC0+R2V0V2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgcFNyY0JpdG1hcC0+R2V0SGVpZ2h0KCksIHNyY19sZWZ0LCBzcmNfdG9wLCBudWxscHRyKTsKLSAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDApCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgRlhESUJfRm9ybWF0IGRlc3RfZm9ybWF0ID0gR2V0Rm9ybWF0KCk7Ci0gIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0ID0gcFNyY0JpdG1hcC0+R2V0Rm9ybWF0KCk7Ci0gIGlmIChkZXN0X2Zvcm1hdCA9PSBzcmNfZm9ybWF0KSB7Ci0gICAgaWYgKEdldEJQUCgpID09IDEpIHsKLSAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKLSAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wQnVmZmVyICsgKGRlc3RfdG9wICsgcm93KSAqIG1fUGl0Y2g7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0JpdG1hcC0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdyk7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgICAgICAgIGlmIChzcmNfc2Nhblsoc3JjX2xlZnQgKyBjb2wpIC8gOF0gJgotICAgICAgICAgICAgICAoMSA8PCAoNyAtIChzcmNfbGVmdCArIGNvbCkgJSA4KSkpIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhblsoZGVzdF9sZWZ0ICsgY29sKSAvIDhdIHw9IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICg3IC0gKGRlc3RfbGVmdCArIGNvbCkgJSA4KTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVzdF9zY2FuWyhkZXN0X2xlZnQgKyBjb2wpIC8gOF0gJj0KLSAgICAgICAgICAgICAgICB+KDEgPDwgKDcgLSAoZGVzdF9sZWZ0ICsgY29sKSAlIDgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaW50IEJwcCA9IEdldEJQUCgpIC8gODsKLSAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKLSAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0KLSAgICAgICAgICAgIG1fcEJ1ZmZlciArIChkZXN0X3RvcCArIHJvdykgKiBtX1BpdGNoICsgZGVzdF9sZWZ0ICogQnBwOwotICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9Ci0gICAgICAgICAgICBwU3JjQml0bWFwLT5HZXRTY2FubGluZShzcmNfdG9wICsgcm93KSArIHNyY19sZWZ0ICogQnBwOwotICAgICAgICBGWFNZU19tZW1jcHkoZGVzdF9zY2FuLCBzcmNfc2Nhbiwgd2lkdGggKiBCcHApOwotICAgICAgfQorICAgICAgZyA9IGcgKiAxMCArIHN0cltjY10gLSAnMCc7CisgICAgICBjYysrOwogICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAobV9wUGFsZXR0ZSkKLSAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoY2MgPCBsZW4gJiYgc3RyW2NjXSA9PSAnLCcpIHsKKyAgICAgIGNjKys7CisgICAgICB3aGlsZSAoRlhTWVNfaXN3c3BhY2Uoc3RyW2NjXSkgJiYgY2MgPCBsZW4pCisgICAgICAgIGNjKys7CiAKLSAgICBpZiAobV9icHAgPT0gOCkKLSAgICAgIGRlc3RfZm9ybWF0ID0gRlhESUJfOGJwcE1hc2s7CisgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsKKyAgICAgICAgaWYgKHN0cltjY10gPT0gJywnIHx8ICFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkKKyAgICAgICAgICBicmVhazsKIAotICAgIHVpbnQ4X3QqIGRlc3RfYnVmID0KLSAgICAgICAgbV9wQnVmZmVyICsgZGVzdF90b3AgKiBtX1BpdGNoICsgZGVzdF9sZWZ0ICogR2V0QlBQKCkgLyA4OwotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50MzJfdCwgRnhGcmVlRGVsZXRlcj4gZF9wbHQ7Ci0gICAgaWYgKCFDb252ZXJ0QnVmZmVyKGRlc3RfZm9ybWF0LCBkZXN0X2J1ZiwgbV9QaXRjaCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgcFNyY0JpdG1hcCwgc3JjX2xlZnQsIHNyY190b3AsICZkX3BsdCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0ZYX0RJQml0bWFwOjpUcmFuc2Zlck1hc2soaW50IGRlc3RfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0pIHsKLSAgaWYgKCFtX3BCdWZmZXIpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQVNTRVJUKEhhc0FscGhhKCkgJiYgKG1fYnBwID49IDI0KSk7Ci0gIEFTU0VSVChwTWFzay0+SXNBbHBoYU1hc2soKSk7Ci0gIGlmICghSGFzQWxwaGEoKSB8fCAhcE1hc2stPklzQWxwaGFNYXNrKCkgfHwgbV9icHAgPCAyNCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBHZXRPdmVybGFwUmVjdChkZXN0X2xlZnQsIGRlc3RfdG9wLCB3aWR0aCwgaGVpZ2h0LCBwTWFzay0+R2V0V2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgcE1hc2stPkdldEhlaWdodCgpLCBzcmNfbGVmdCwgc3JjX3RvcCwgbnVsbHB0cik7Ci0gIGlmICh3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaW50IHNyY19icHAgPSBwTWFzay0+R2V0QlBQKCk7Ci0gIGludCBhbHBoYTsKLSAgdWludDMyX3QgZHN0X2NvbG9yOwotICBpZiAoYWxwaGFfZmxhZyA+PiA4KSB7Ci0gICAgYWxwaGEgPSBhbHBoYV9mbGFnICYgMHhmZjsKLSAgICBkc3RfY29sb3IgPSBGWENNWUtfVE9ESUIoY29sb3IpOwotICB9IGVsc2UgewotICAgIGFscGhhID0gRlhBUkdCX0EoY29sb3IpOwotICAgIGRzdF9jb2xvciA9IEZYQVJHQl9UT0RJQihjb2xvcik7Ci0gIH0KLSAgdWludDhfdCogY29sb3JfcCA9ICh1aW50OF90KikmZHN0X2NvbG9yOwotICBpZiAocEljY1RyYW5zZm9ybSAmJiBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpICYmCi0gICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKSkgewotICAgIENDb2RlY19JY2NNb2R1bGUqIHBJY2NNb2R1bGUgPQotICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCBjb2xvcl9wLCBjb2xvcl9wLCAxKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoYWxwaGFfZmxhZyA+PiA4ICYmICFJc0NteWtJbWFnZSgpKSB7Ci0gICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0TVZhbHVlKGNvbG9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoY29sb3IpLCBGWFNZU19HZXRLVmFsdWUoY29sb3IpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX3BbMl0sIGNvbG9yX3BbMV0sIGNvbG9yX3BbMF0pOwotICAgIH0gZWxzZSBpZiAoIShhbHBoYV9mbGFnID4+IDgpICYmIElzQ215a0ltYWdlKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgaWYgKCFJc0NteWtJbWFnZSgpKSB7Ci0gICAgY29sb3JfcFszXSA9ICh1aW50OF90KWFscGhhOwotICB9Ci0gIGlmIChHZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKSB7Ci0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgewotICAgICAgdWludDMyX3QqIGRlc3RfcG9zID0KLSAgICAgICAgICAodWludDMyX3QqKShtX3BCdWZmZXIgKyAoZGVzdF90b3AgKyByb3cpICogbV9QaXRjaCArIGRlc3RfbGVmdCAqIDQpOwotICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwTWFzay0+R2V0U2NhbmxpbmUoc3JjX3RvcCArIHJvdyk7Ci0gICAgICBpZiAoc3JjX2JwcCA9PSAxKSB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykgewotICAgICAgICAgIGludCBzcmNfYml0cG9zID0gc3JjX2xlZnQgKyBjb2w7Ci0gICAgICAgICAgaWYgKHNyY19zY2FuW3NyY19iaXRwb3MgLyA4XSAmICgxIDw8ICg3IC0gc3JjX2JpdHBvcyAlIDgpKSkgewotICAgICAgICAgICAgKmRlc3RfcG9zID0gZHN0X2NvbG9yOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqZGVzdF9wb3MgPSAwOwotICAgICAgICAgIH0KLSAgICAgICAgICBkZXN0X3BvcysrOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzcmNfc2NhbiArPSBzcmNfbGVmdDsKLSAgICAgICAgZHN0X2NvbG9yID0gRlhBUkdCX1RPRElCKGRzdF9jb2xvcik7Ci0gICAgICAgIGRzdF9jb2xvciAmPSAweGZmZmZmZjsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgICAgICAgRlhBUkdCX1NFVERJQihkZXN0X3BvcysrLAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2NvbG9yIHwgKChhbHBoYSAqICgqc3JjX3NjYW4rKykgLyAyNTUpIDw8IDI0KSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaW50IGNvbXBzID0gbV9icHAgLyA4OwotICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKLSAgICAgIHVpbnQ4X3QqIGRlc3RfY29sb3JfcG9zID0KLSAgICAgICAgICBtX3BCdWZmZXIgKyAoZGVzdF90b3AgKyByb3cpICogbV9QaXRjaCArIGRlc3RfbGVmdCAqIGNvbXBzOwotICAgICAgdWludDhfdCogZGVzdF9hbHBoYV9wb3MgPQotICAgICAgICAgICh1aW50OF90KiltX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKGRlc3RfdG9wICsgcm93KSArIGRlc3RfbGVmdDsKLSAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gcE1hc2stPkdldFNjYW5saW5lKHNyY190b3AgKyByb3cpOwotICAgICAgaWYgKHNyY19icHAgPT0gMSkgewotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHsKLSAgICAgICAgICBpbnQgc3JjX2JpdHBvcyA9IHNyY19sZWZ0ICsgY29sOwotICAgICAgICAgIGlmIChzcmNfc2NhbltzcmNfYml0cG9zIC8gOF0gJiAoMSA8PCAoNyAtIHNyY19iaXRwb3MgJSA4KSkpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShkZXN0X2NvbG9yX3BvcywgY29sb3JfcCwgY29tcHMpOwotICAgICAgICAgICAgKmRlc3RfYWxwaGFfcG9zID0gMHhmZjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRlhTWVNfbWVtc2V0KGRlc3RfY29sb3JfcG9zLCAwLCBjb21wcyk7Ci0gICAgICAgICAgICAqZGVzdF9hbHBoYV9wb3MgPSAwOwotICAgICAgICAgIH0KLSAgICAgICAgICBkZXN0X2NvbG9yX3BvcyArPSBjb21wczsKLSAgICAgICAgICBkZXN0X2FscGhhX3BvcysrOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzcmNfc2NhbiArPSBzcmNfbGVmdDsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7Ci0gICAgICAgICAgRlhTWVNfbWVtY3B5KGRlc3RfY29sb3JfcG9zLCBjb2xvcl9wLCBjb21wcyk7Ci0gICAgICAgICAgZGVzdF9jb2xvcl9wb3MgKz0gY29tcHM7Ci0gICAgICAgICAgKmRlc3RfYWxwaGFfcG9zKysgPSAoYWxwaGEgKiAoKnNyY19zY2FuKyspIC8gMjU1KTsKLSAgICAgICAgfQorICAgICAgICBiID0gYiAqIDEwICsgc3RyW2NjXSAtICcwJzsKKyAgICAgICAgY2MrKzsKICAgICAgIH0KICAgICB9CiAgIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ0ZYX0RJQlNvdXJjZTo6U2V0UGFsZXR0ZShjb25zdCB1aW50MzJfdCogcFNyYykgewotICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1BhbGV0dGVTaXplID0gMjU2OwotICBpZiAoIXBTcmMgfHwgR2V0QlBQKCkgPiA4KSB7Ci0gICAgbV9wUGFsZXR0ZS5yZXNldCgpOwotICAgIHJldHVybjsKLSAgfQotICB1aW50MzJfdCBwYWxfc2l6ZSA9IDEgPDwgR2V0QlBQKCk7Ci0gIGlmICghbV9wUGFsZXR0ZSkKLSAgICBtX3BQYWxldHRlLnJlc2V0KEZYX0FsbG9jKHVpbnQzMl90LCBwYWxfc2l6ZSkpOwotICBwYWxfc2l6ZSA9IHN0ZDo6bWluKHBhbF9zaXplLCBrUGFsZXR0ZVNpemUpOwotICBGWFNZU19tZW1jcHkobV9wUGFsZXR0ZS5nZXQoKSwgcFNyYywgcGFsX3NpemUgKiBzaXplb2YodWludDMyX3QpKTsKLX0KLQotdm9pZCBDRlhfRElCU291cmNlOjpHZXRQYWxldHRlKHVpbnQzMl90KiBwYWwsIGludCBhbHBoYSkgY29uc3QgewotICBBU1NFUlQoR2V0QlBQKCkgPD0gOCAmJiAhSXNDbXlrSW1hZ2UoKSk7Ci0gIGlmIChHZXRCUFAoKSA9PSAxKSB7Ci0gICAgcGFsWzBdID0gKChtX3BQYWxldHRlID8gbV9wUGFsZXR0ZS5nZXQoKVswXSA6IDB4ZmYwMDAwMDApICYgMHhmZmZmZmYpIHwKLSAgICAgICAgICAgICAoYWxwaGEgPDwgMjQpOwotICAgIHBhbFsxXSA9ICgobV9wUGFsZXR0ZSA/IG1fcFBhbGV0dGUuZ2V0KClbMV0gOiAweGZmZmZmZmZmKSAmIDB4ZmZmZmZmKSB8Ci0gICAgICAgICAgICAgKGFscGhhIDw8IDI0KTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKG1fcFBhbGV0dGUpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0gICAgICBwYWxbaV0gPSAobV9wUGFsZXR0ZS5nZXQoKVtpXSAmIDB4MDBmZmZmZmYpIHwgKGFscGhhIDw8IDI0KTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewotICAgICAgcGFsW2ldID0gKGkgKiAweDEwMTAxKSB8IChhbHBoYSA8PCAyNCk7Ci0gICAgfQotICB9Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IENGWF9ESUJTb3VyY2U6OkNsb25lQWxwaGFNYXNrKAotICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwKSBjb25zdCB7Ci0gIEFTU0VSVChHZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKTsKLSAgRlhfUkVDVCByZWN0KDAsIDAsIG1fV2lkdGgsIG1fSGVpZ2h0KTsKLSAgaWYgKHBDbGlwKSB7Ci0gICAgcmVjdC5JbnRlcnNlY3QoKnBDbGlwKTsKLSAgICBpZiAocmVjdC5Jc0VtcHR5KCkpCi0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBhdXRvIHBNYXNrID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9ESUJpdG1hcD4oKTsKLSAgaWYgKCFwTWFzay0+Q3JlYXRlKHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgRlhESUJfOGJwcE1hc2spKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIGZvciAoaW50IHJvdyA9IHJlY3QudG9wOyByb3cgPCByZWN0LmJvdHRvbTsgcm93KyspIHsKLSAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiA9IEdldFNjYW5saW5lKHJvdykgKyByZWN0LmxlZnQgKiA0ICsgMzsKLSAgICB1aW50OF90KiBkZXN0X3NjYW4gPQotICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QqPihwTWFzay0+R2V0U2NhbmxpbmUocm93IC0gcmVjdC50b3ApKTsKLSAgICBmb3IgKGludCBjb2wgPSByZWN0LmxlZnQ7IGNvbCA8IHJlY3QucmlnaHQ7IGNvbCsrKSB7Ci0gICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW47Ci0gICAgICBzcmNfc2NhbiArPSA0OwotICAgIH0KLSAgfQotICByZXR1cm4gcE1hc2s7Ci19Ci0KLWJvb2wgQ0ZYX0RJQlNvdXJjZTo6U2V0QWxwaGFNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBBbHBoYU1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcCkgewotICBpZiAoIUhhc0FscGhhKCkgfHwgR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFwQWxwaGFNYXNrKSB7Ci0gICAgbV9wQWxwaGFNYXNrLT5DbGVhcigweGZmMDAwMDAwKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBGWF9SRUNUIHJlY3QoMCwgMCwgcEFscGhhTWFzay0+bV9XaWR0aCwgcEFscGhhTWFzay0+bV9IZWlnaHQpOwotICBpZiAocENsaXApIHsKLSAgICByZWN0LkludGVyc2VjdCgqcENsaXApOwotICAgIGlmIChyZWN0LklzRW1wdHkoKSB8fCByZWN0LldpZHRoKCkgIT0gbV9XaWR0aCB8fAotICAgICAgICByZWN0LkhlaWdodCgpICE9IG1fSGVpZ2h0KSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChwQWxwaGFNYXNrLT5tX1dpZHRoICE9IG1fV2lkdGggfHwgcEFscGhhTWFzay0+bV9IZWlnaHQgIT0gbV9IZWlnaHQpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7Ci0gICAgRlhTWVNfbWVtY3B5KGNvbnN0X2Nhc3Q8dWludDhfdCo+KG1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KSksCi0gICAgICAgICAgICAgICAgIHBBbHBoYU1hc2stPkdldFNjYW5saW5lKHJvdyArIHJlY3QudG9wKSArIHJlY3QubGVmdCwKLSAgICAgICAgICAgICAgICAgbV9wQWxwaGFNYXNrLT5tX1BpdGNoKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgaW50IGdfQ2hhbm5lbE9mZnNldFtdID0gezAsIDIsIDEsIDAsIDAsIDEsIDIsIDMsIDN9OwotYm9vbCBDRlhfRElCaXRtYXA6OkxvYWRDaGFubmVsKEZYRElCX0NoYW5uZWwgZGVzdENoYW5uZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9DaGFubmVsIHNyY0NoYW5uZWwpIHsKLSAgaWYgKCFtX3BCdWZmZXIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENGWF9NYXliZU93bmVkPENGWF9ESUJTb3VyY2U+IHBTcmNDbG9uZShwU3JjQml0bWFwKTsKLSAgaW50IHNyY09mZnNldDsKLSAgaWYgKHNyY0NoYW5uZWwgPT0gRlhESUJfQWxwaGEpIHsKLSAgICBpZiAoIXBTcmNCaXRtYXAtPkhhc0FscGhhKCkgJiYgIXBTcmNCaXRtYXAtPklzQWxwaGFNYXNrKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAocFNyY0JpdG1hcC0+R2V0QlBQKCkgPT0gMSkgewotICAgICAgcFNyY0Nsb25lID0gcFNyY0JpdG1hcC0+Q2xvbmVDb252ZXJ0KEZYRElCXzhicHBNYXNrKTsKLSAgICAgIGlmICghcFNyY0Nsb25lKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHNyY09mZnNldCA9IHBTcmNCaXRtYXAtPkdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IgPyAzIDogMDsKLSAgfSBlbHNlIHsKLSAgICBpZiAocFNyY0JpdG1hcC0+SXNBbHBoYU1hc2soKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChwU3JjQml0bWFwLT5HZXRCUFAoKSA8IDI0KSB7Ci0gICAgICBpZiAocFNyY0JpdG1hcC0+SXNDbXlrSW1hZ2UoKSkgewotICAgICAgICBwU3JjQ2xvbmUgPSBwU3JjQml0bWFwLT5DbG9uZUNvbnZlcnQoc3RhdGljX2Nhc3Q8RlhESUJfRm9ybWF0PigKLSAgICAgICAgICAgIChwU3JjQml0bWFwLT5HZXRGb3JtYXQoKSAmIDB4ZmYwMCkgfCAweDIwKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwU3JjQ2xvbmUgPSBwU3JjQml0bWFwLT5DbG9uZUNvbnZlcnQoc3RhdGljX2Nhc3Q8RlhESUJfRm9ybWF0PigKLSAgICAgICAgICAgIChwU3JjQml0bWFwLT5HZXRGb3JtYXQoKSAmIDB4ZmYwMCkgfCAweDE4KSk7Ci0gICAgICB9Ci0gICAgICBpZiAoIXBTcmNDbG9uZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBzcmNPZmZzZXQgPSBnX0NoYW5uZWxPZmZzZXRbc3JjQ2hhbm5lbF07Ci0gIH0KLSAgaW50IGRlc3RPZmZzZXQgPSAwOwotICBpZiAoZGVzdENoYW5uZWwgPT0gRlhESUJfQWxwaGEpIHsKLSAgICBpZiAoSXNBbHBoYU1hc2soKSkgewotICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KEZYRElCXzhicHBNYXNrKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoSXNDbXlrSW1hZ2UoKSA/IEZYRElCX0NteWthIDogRlhESUJfQXJnYikpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKEdldEZvcm1hdCgpID09IEZYRElCX0FyZ2IpCi0gICAgICAgIGRlc3RPZmZzZXQgPSAzOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoSXNBbHBoYU1hc2soKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChHZXRCUFAoKSA8IDI0KSB7Ci0gICAgICBpZiAoSGFzQWxwaGEoKSkgewotICAgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoSXNDbXlrSW1hZ2UoKSA/IEZYRElCX0NteWthIDogRlhESUJfQXJnYikpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgICB9IGVsc2UgaWYgKCFDb252ZXJ0Rm9ybWF0KElzQ215a0ltYWdlKCkgPyBGWERJQl9DbXlrIDogRlhESUJfUmdiMzIpKSB7Ci0jZWxzZQotICAgICAgfSBlbHNlIGlmICghQ29udmVydEZvcm1hdChJc0NteWtJbWFnZSgpID8gRlhESUJfQ215ayA6IEZYRElCX1JnYikpIHsKLSNlbmRpZgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIGRlc3RPZmZzZXQgPSBnX0NoYW5uZWxPZmZzZXRbZGVzdENoYW5uZWxdOwotICB9Ci0gIGlmIChzcmNDaGFubmVsID09IEZYRElCX0FscGhhICYmIHBTcmNDbG9uZS0+bV9wQWxwaGFNYXNrKSB7Ci0gICAgQ0ZYX01heWJlT3duZWQ8Q0ZYX0RJQlNvdXJjZT4gcEFscGhhTWFzayhwU3JjQ2xvbmUtPm1fcEFscGhhTWFzayk7Ci0gICAgaWYgKHBTcmNDbG9uZS0+R2V0V2lkdGgoKSAhPSBtX1dpZHRoIHx8Ci0gICAgICAgIHBTcmNDbG9uZS0+R2V0SGVpZ2h0KCkgIT0gbV9IZWlnaHQpIHsKLSAgICAgIGlmIChwQWxwaGFNYXNrKSB7Ci0gICAgICAgIHBBbHBoYU1hc2sgPSBwQWxwaGFNYXNrLT5TdHJldGNoVG8obV9XaWR0aCwgbV9IZWlnaHQpOwotICAgICAgICBpZiAoIXBBbHBoYU1hc2spCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBwU3JjQ2xvbmUgPSBzdGQ6Om1vdmUocEFscGhhTWFzayk7Ci0gICAgc3JjT2Zmc2V0ID0gMDsKLSAgfSBlbHNlIGlmIChwU3JjQ2xvbmUtPkdldFdpZHRoKCkgIT0gbV9XaWR0aCB8fAotICAgICAgICAgICAgIHBTcmNDbG9uZS0+R2V0SGVpZ2h0KCkgIT0gbV9IZWlnaHQpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBwU3JjTWF0Y2hlZCA9Ci0gICAgICAgIHBTcmNDbG9uZS0+U3RyZXRjaFRvKG1fV2lkdGgsIG1fSGVpZ2h0KTsKLSAgICBpZiAoIXBTcmNNYXRjaGVkKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcFNyY0Nsb25lID0gc3RkOjptb3ZlKHBTcmNNYXRjaGVkKTsKLSAgfQotICBDRlhfRElCaXRtYXAqIHBEc3QgPSB0aGlzOwotICBpZiAoZGVzdENoYW5uZWwgPT0gRlhESUJfQWxwaGEgJiYgbV9wQWxwaGFNYXNrKSB7Ci0gICAgcERzdCA9IG1fcEFscGhhTWFzazsKLSAgICBkZXN0T2Zmc2V0ID0gMDsKLSAgfQotICBpbnQgc3JjQnl0ZXMgPSBwU3JjQ2xvbmUtPkdldEJQUCgpIC8gODsKLSAgaW50IGRlc3RCeXRlcyA9IHBEc3QtPkdldEJQUCgpIC8gODsKLSAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7Ci0gICAgdWludDhfdCogZGVzdF9wb3MgPSAodWludDhfdCopcERzdC0+R2V0U2NhbmxpbmUocm93KSArIGRlc3RPZmZzZXQ7Ci0gICAgY29uc3QgdWludDhfdCogc3JjX3BvcyA9IHBTcmNDbG9uZS0+R2V0U2NhbmxpbmUocm93KSArIHNyY09mZnNldDsKLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgewotICAgICAgKmRlc3RfcG9zID0gKnNyY19wb3M7Ci0gICAgICBkZXN0X3BvcyArPSBkZXN0Qnl0ZXM7Ci0gICAgICBzcmNfcG9zICs9IHNyY0J5dGVzOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDRlhfRElCaXRtYXA6OkxvYWRDaGFubmVsKEZYRElCX0NoYW5uZWwgZGVzdENoYW5uZWwsIGludCB2YWx1ZSkgewotICBpZiAoIW1fcEJ1ZmZlcikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpbnQgZGVzdE9mZnNldDsKLSAgaWYgKGRlc3RDaGFubmVsID09IEZYRElCX0FscGhhKSB7Ci0gICAgaWYgKElzQWxwaGFNYXNrKCkpIHsKLSAgICAgIGlmICghQ29udmVydEZvcm1hdChGWERJQl84YnBwTWFzaykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgZGVzdE9mZnNldCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGRlc3RPZmZzZXQgPSAwOwotICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KElzQ215a0ltYWdlKCkgPyBGWERJQl9DbXlrYSA6IEZYRElCX0FyZ2IpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChHZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKSB7Ci0gICAgICAgIGRlc3RPZmZzZXQgPSAzOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoSXNBbHBoYU1hc2soKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoR2V0QlBQKCkgPCAyNCkgewotICAgICAgaWYgKEhhc0FscGhhKCkpIHsKLSAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KElzQ215a0ltYWdlKCkgPyBGWERJQl9DbXlrYSA6IEZYRElCX0FyZ2IpKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgICAgIH0gZWxzZSBpZiAoIUNvbnZlcnRGb3JtYXQoSXNDbXlrSW1hZ2UoKSA/IEZYRElCX0NteWsgOiBGWERJQl9SZ2IpKSB7Ci0jZWxzZQotICAgICAgfSBlbHNlIGlmICghQ29udmVydEZvcm1hdChJc0NteWtJbWFnZSgpID8gRlhESUJfQ215ayA6IEZYRElCX1JnYjMyKSkgewotI2VuZGlmCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZGVzdE9mZnNldCA9IGdfQ2hhbm5lbE9mZnNldFtkZXN0Q2hhbm5lbF07Ci0gIH0KLSAgaW50IEJwcCA9IEdldEJQUCgpIC8gODsKLSAgaWYgKEJwcCA9PSAxKSB7Ci0gICAgRlhTWVNfbWVtc2V0KG1fcEJ1ZmZlciwgdmFsdWUsIG1fSGVpZ2h0ICogbV9QaXRjaCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKGRlc3RDaGFubmVsID09IEZYRElCX0FscGhhICYmIG1fcEFscGhhTWFzaykgewotICAgIEZYU1lTX21lbXNldChtX3BBbHBoYU1hc2stPkdldEJ1ZmZlcigpLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgbV9wQWxwaGFNYXNrLT5HZXRIZWlnaHQoKSAqIG1fcEFscGhhTWFzay0+R2V0UGl0Y2goKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7Ci0gICAgdWludDhfdCogc2Nhbl9saW5lID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaCArIGRlc3RPZmZzZXQ7Ci0gICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKLSAgICAgICpzY2FuX2xpbmUgPSB2YWx1ZTsKLSAgICAgIHNjYW5fbGluZSArPSBCcHA7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENGWF9ESUJpdG1hcDo6TXVsdGlwbHlBbHBoYShDRlhfRElCU291cmNlKiBwU3JjQml0bWFwKSB7Ci0gIGlmICghbV9wQnVmZmVyKQotICAgIHJldHVybiBmYWxzZTsKLQotICBBU1NFUlQocFNyY0JpdG1hcC0+SXNBbHBoYU1hc2soKSk7Ci0gIGlmICghcFNyY0JpdG1hcC0+SXNBbHBoYU1hc2soKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFJc0FscGhhTWFzaygpICYmICFIYXNBbHBoYSgpKQotICAgIHJldHVybiBMb2FkQ2hhbm5lbChGWERJQl9BbHBoYSwgcFNyY0JpdG1hcCwgRlhESUJfQWxwaGEpOwotCi0gIENGWF9NYXliZU93bmVkPENGWF9ESUJpdG1hcD4gcFNyY0Nsb25lKAotICAgICAgc3RhdGljX2Nhc3Q8Q0ZYX0RJQml0bWFwKj4ocFNyY0JpdG1hcCkpOwotICBpZiAocFNyY0JpdG1hcC0+R2V0V2lkdGgoKSAhPSBtX1dpZHRoIHx8Ci0gICAgICBwU3JjQml0bWFwLT5HZXRIZWlnaHQoKSAhPSBtX0hlaWdodCkgewotICAgIHBTcmNDbG9uZSA9IHBTcmNCaXRtYXAtPlN0cmV0Y2hUbyhtX1dpZHRoLCBtX0hlaWdodCk7Ci0gICAgaWYgKCFwU3JjQ2xvbmUpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKElzQWxwaGFNYXNrKCkpIHsKLSAgICBpZiAoIUNvbnZlcnRGb3JtYXQoRlhESUJfOGJwcE1hc2spKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7Ci0gICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BCdWZmZXIgKyBtX1BpdGNoICogcm93OwotICAgICAgdWludDhfdCogc3JjX3NjYW4gPSBwU3JjQ2xvbmUtPm1fcEJ1ZmZlciArIHBTcmNDbG9uZS0+bV9QaXRjaCAqIHJvdzsKLSAgICAgIGlmIChwU3JjQ2xvbmUtPkdldEJQUCgpID09IDEpIHsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKLSAgICAgICAgICBpZiAoISgoMSA8PCAoNyAtIGNvbCAlIDgpKSAmIHNyY19zY2FuW2NvbCAvIDhdKSkKLSAgICAgICAgICAgIGRlc3Rfc2Nhbltjb2xdID0gMDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKLSAgICAgICAgICAqZGVzdF9zY2FuID0gKCpkZXN0X3NjYW4pICogc3JjX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoR2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYikgewotICAgICAgaWYgKHBTcmNDbG9uZS0+R2V0QlBQKCkgPT0gMSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKLSAgICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gbV9wQnVmZmVyICsgbV9QaXRjaCAqIHJvdyArIDM7Ci0gICAgICAgIHVpbnQ4X3QqIHNyY19zY2FuID0gcFNyY0Nsb25lLT5tX3BCdWZmZXIgKyBwU3JjQ2xvbmUtPm1fUGl0Y2ggKiByb3c7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7Ci0gICAgICAgICAgKmRlc3Rfc2NhbiA9ICgqZGVzdF9zY2FuKSAqIHNyY19zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgbV9wQWxwaGFNYXNrLT5NdWx0aXBseUFscGhhKHBTcmNDbG9uZS5HZXQoKSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENGWF9ESUJpdG1hcDo6R2V0R3JheURhdGEodm9pZCogcEljY1RyYW5zZm9ybSkgewotICBpZiAoIW1fcEJ1ZmZlcikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBzd2l0Y2ggKEdldEZvcm1hdCgpKSB7Ci0gICAgY2FzZSBGWERJQl8xYnBwUmdiOiB7Ci0gICAgICBpZiAoIW1fcFBhbGV0dGUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgdWludDhfdCBncmF5WzJdOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgaW50IHIgPSBzdGF0aWNfY2FzdDx1aW50OF90PihtX3BQYWxldHRlLmdldCgpW2ldID4+IDE2KTsKLSAgICAgICAgaW50IGcgPSBzdGF0aWNfY2FzdDx1aW50OF90PihtX3BQYWxldHRlLmdldCgpW2ldID4+IDgpOwotICAgICAgICBpbnQgYiA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KG1fcFBhbGV0dGUuZ2V0KClbaV0pOwotICAgICAgICBncmF5W2ldID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oRlhSR0IyR1JBWShyLCBnLCBiKSk7Ci0gICAgICB9Ci0gICAgICBDRlhfRElCaXRtYXAqIHBNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICAgIGlmICghcE1hc2stPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7Ci0gICAgICAgIGRlbGV0ZSBwTWFzazsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgRlhTWVNfbWVtc2V0KHBNYXNrLT5HZXRCdWZmZXIoKSwgZ3JheVswXSwgcE1hc2stPkdldFBpdGNoKCkgKiBtX0hlaWdodCk7Ci0gICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKLSAgICAgICAgdWludDhfdCogc3JjX3BvcyA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7Ci0gICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gKHVpbnQ4X3QqKXBNYXNrLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgewotICAgICAgICAgIGlmIChzcmNfcG9zW2NvbCAvIDhdICYgKDEgPDwgKDcgLSBjb2wgJSA4KSkpIHsKLSAgICAgICAgICAgICpkZXN0X3BvcyA9IGdyYXlbMV07Ci0gICAgICAgICAgfQotICAgICAgICAgIGRlc3RfcG9zKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIFRha2VPdmVyKHBNYXNrKTsKLSAgICAgIGRlbGV0ZSBwTWFzazsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZYRElCXzhicHBSZ2I6IHsKLSAgICAgIGlmICghbV9wUGFsZXR0ZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICB1aW50OF90IGdyYXlbMjU2XTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLSAgICAgICAgaW50IHIgPSBzdGF0aWNfY2FzdDx1aW50OF90PihtX3BQYWxldHRlLmdldCgpW2ldID4+IDE2KTsKLSAgICAgICAgaW50IGcgPSBzdGF0aWNfY2FzdDx1aW50OF90PihtX3BQYWxldHRlLmdldCgpW2ldID4+IDgpOwotICAgICAgICBpbnQgYiA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KG1fcFBhbGV0dGUuZ2V0KClbaV0pOwotICAgICAgICBncmF5W2ldID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oRlhSR0IyR1JBWShyLCBnLCBiKSk7Ci0gICAgICB9Ci0gICAgICBDRlhfRElCaXRtYXAqIHBNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICAgIGlmICghcE1hc2stPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7Ci0gICAgICAgIGRlbGV0ZSBwTWFzazsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7Ci0gICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gcE1hc2stPkdldEJ1ZmZlcigpICsgcm93ICogcE1hc2stPkdldFBpdGNoKCk7Ci0gICAgICAgIHVpbnQ4X3QqIHNyY19wb3MgPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoOwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgewotICAgICAgICAgICpkZXN0X3BvcysrID0gZ3JheVsqc3JjX3BvcysrXTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgVGFrZU92ZXIocE1hc2spOwotICAgICAgZGVsZXRlIHBNYXNrOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRlhESUJfUmdiOiB7Ci0gICAgICBDRlhfRElCaXRtYXAqIHBNYXNrID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgICAgIGlmICghcE1hc2stPkNyZWF0ZShtX1dpZHRoLCBtX0hlaWdodCwgRlhESUJfOGJwcE1hc2spKSB7Ci0gICAgICAgIGRlbGV0ZSBwTWFzazsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7Ci0gICAgICAgIHVpbnQ4X3QqIHNyY19wb3MgPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoOwotICAgICAgICB1aW50OF90KiBkZXN0X3BvcyA9IHBNYXNrLT5HZXRCdWZmZXIoKSArIHJvdyAqIHBNYXNrLT5HZXRQaXRjaCgpOwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgewotICAgICAgICAgICpkZXN0X3BvcysrID0gRlhSR0IyR1JBWShzcmNfcG9zWzJdLCBzcmNfcG9zWzFdLCAqc3JjX3Bvcyk7Ci0gICAgICAgICAgc3JjX3BvcyArPSAzOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBUYWtlT3ZlcihwTWFzayk7Ci0gICAgICBkZWxldGUgcE1hc2s7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGWERJQl9SZ2IzMjogewotICAgICAgQ0ZYX0RJQml0bWFwKiBwTWFzayA9IG5ldyBDRlhfRElCaXRtYXA7Ci0gICAgICBpZiAoIXBNYXNrLT5DcmVhdGUobV9XaWR0aCwgbV9IZWlnaHQsIEZYRElCXzhicHBNYXNrKSkgewotICAgICAgICBkZWxldGUgcE1hc2s7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykgewotICAgICAgICB1aW50OF90KiBzcmNfcG9zID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaDsKLSAgICAgICAgdWludDhfdCogZGVzdF9wb3MgPSBwTWFzay0+R2V0QnVmZmVyKCkgKyByb3cgKiBwTWFzay0+R2V0UGl0Y2goKTsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKLSAgICAgICAgICAqZGVzdF9wb3MrKyA9IEZYUkdCMkdSQVkoc3JjX3Bvc1syXSwgc3JjX3Bvc1sxXSwgKnNyY19wb3MpOwotICAgICAgICAgIHNyY19wb3MgKz0gNDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgVGFrZU92ZXIocE1hc2spOwotICAgICAgZGVsZXRlIHBNYXNrOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0ZYX0RJQml0bWFwOjpNdWx0aXBseUFscGhhKGludCBhbHBoYSkgewotICBpZiAoIW1fcEJ1ZmZlcikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBzd2l0Y2ggKEdldEZvcm1hdCgpKSB7Ci0gICAgY2FzZSBGWERJQl8xYnBwTWFzazoKLSAgICAgIGlmICghQ29udmVydEZvcm1hdChGWERJQl84YnBwTWFzaykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgTXVsdGlwbHlBbHBoYShhbHBoYSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYRElCXzhicHBNYXNrOiB7Ci0gICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKLSAgICAgICAgdWludDhfdCogc2Nhbl9saW5lID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaDsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKLSAgICAgICAgICBzY2FuX2xpbmVbY29sXSA9IHNjYW5fbGluZVtjb2xdICogYWxwaGEgLyAyNTU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZYRElCX0FyZ2I6IHsKLSAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykgewotICAgICAgICB1aW50OF90KiBzY2FuX2xpbmUgPSBtX3BCdWZmZXIgKyByb3cgKiBtX1BpdGNoICsgMzsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKLSAgICAgICAgICAqc2Nhbl9saW5lID0gKCpzY2FuX2xpbmUpICogYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgc2Nhbl9saW5lICs9IDQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKEhhc0FscGhhKCkpIHsKLSAgICAgICAgbV9wQWxwaGFNYXNrLT5NdWx0aXBseUFscGhhKGFscGhhKTsKLSAgICAgIH0gZWxzZSBpZiAoSXNDbXlrSW1hZ2UoKSkgewotICAgICAgICBpZiAoIUNvbnZlcnRGb3JtYXQoKEZYRElCX0Zvcm1hdCkoR2V0Rm9ybWF0KCkgfCAweDAyMDApKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtX3BBbHBoYU1hc2stPk11bHRpcGx5QWxwaGEoYWxwaGEpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFDb252ZXJ0Rm9ybWF0KEZYRElCX0FyZ2IpKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIE11bHRpcGx5QWxwaGEoYWxwaGEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXVpbnQzMl90IENGWF9ESUJpdG1hcDo6R2V0UGl4ZWwoaW50IHgsIGludCB5KSBjb25zdCB7Ci0gIGlmICghbV9wQnVmZmVyKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgdWludDhfdCogcG9zID0gbV9wQnVmZmVyICsgeSAqIG1fUGl0Y2ggKyB4ICogR2V0QlBQKCkgLyA4OwotICBzd2l0Y2ggKEdldEZvcm1hdCgpKSB7Ci0gICAgY2FzZSBGWERJQl8xYnBwTWFzazogewotICAgICAgaWYgKCgqcG9zKSAmICgxIDw8ICg3IC0geCAlIDgpKSkgewotICAgICAgICByZXR1cm4gMHhmZjAwMDAwMDsKLSAgICAgIH0KLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBjYXNlIEZYRElCXzFicHBSZ2I6IHsKLSAgICAgIGlmICgoKnBvcykgJiAoMSA8PCAoNyAtIHggJSA4KSkpIHsKLSAgICAgICAgcmV0dXJuIG1fcFBhbGV0dGUgPyBtX3BQYWxldHRlLmdldCgpWzFdIDogMHhmZmZmZmZmZjsKLSAgICAgIH0KLSAgICAgIHJldHVybiBtX3BQYWxldHRlID8gbV9wUGFsZXR0ZS5nZXQoKVswXSA6IDB4ZmYwMDAwMDA7Ci0gICAgfQotICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6Ci0gICAgICByZXR1cm4gKCpwb3MpIDw8IDI0OwotICAgIGNhc2UgRlhESUJfOGJwcFJnYjoKLSAgICAgIHJldHVybiBtX3BQYWxldHRlID8gbV9wUGFsZXR0ZS5nZXQoKVsqcG9zXQotICAgICAgICAgICAgICAgICAgICAgICAgOiAoMHhmZjAwMDAwMCB8ICgoKnBvcykgKiAweDEwMTAxKSk7Ci0gICAgY2FzZSBGWERJQl9SZ2I6Ci0gICAgY2FzZSBGWERJQl9SZ2JhOgotICAgIGNhc2UgRlhESUJfUmdiMzI6Ci0gICAgICByZXR1cm4gRlhBUkdCX0dFVERJQihwb3MpIHwgMHhmZjAwMDAwMDsKLSAgICBjYXNlIEZYRElCX0FyZ2I6Ci0gICAgICByZXR1cm4gRlhBUkdCX0dFVERJQihwb3MpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotdm9pZCBDRlhfRElCaXRtYXA6OlNldFBpeGVsKGludCB4LCBpbnQgeSwgdWludDMyX3QgY29sb3IpIHsKLSAgaWYgKCFtX3BCdWZmZXIpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHggPCAwIHx8IHggPj0gbV9XaWR0aCB8fCB5IDwgMCB8fCB5ID49IG1fSGVpZ2h0KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHVpbnQ4X3QqIHBvcyA9IG1fcEJ1ZmZlciArIHkgKiBtX1BpdGNoICsgeCAqIEdldEJQUCgpIC8gODsKLSAgc3dpdGNoIChHZXRGb3JtYXQoKSkgewotICAgIGNhc2UgRlhESUJfMWJwcE1hc2s6Ci0gICAgICBpZiAoY29sb3IgPj4gMjQpIHsKLSAgICAgICAgKnBvcyB8PSAxIDw8ICg3IC0geCAlIDgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgKnBvcyAmPSB+KDEgPDwgKDcgLSB4ICUgOCkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWERJQl8xYnBwUmdiOgotICAgICAgaWYgKG1fcFBhbGV0dGUpIHsKLSAgICAgICAgaWYgKGNvbG9yID09IG1fcFBhbGV0dGUuZ2V0KClbMV0pIHsKLSAgICAgICAgICAqcG9zIHw9IDEgPDwgKDcgLSB4ICUgOCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgKnBvcyAmPSB+KDEgPDwgKDcgLSB4ICUgOCkpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoY29sb3IgPT0gMHhmZmZmZmZmZikgewotICAgICAgICAgICpwb3MgfD0gMSA8PCAoNyAtIHggJSA4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAqcG9zICY9IH4oMSA8PCAoNyAtIHggJSA4KSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlhESUJfOGJwcE1hc2s6Ci0gICAgICAqcG9zID0gKHVpbnQ4X3QpKGNvbG9yID4+IDI0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlhESUJfOGJwcFJnYjogewotICAgICAgaWYgKG1fcFBhbGV0dGUpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewotICAgICAgICAgIGlmIChtX3BQYWxldHRlLmdldCgpW2ldID09IGNvbG9yKSB7Ci0gICAgICAgICAgICAqcG9zID0gKHVpbnQ4X3QpaTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgKnBvcyA9IDA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAqcG9zID0gRlhSR0IyR1JBWShGWEFSR0JfUihjb2xvciksIEZYQVJHQl9HKGNvbG9yKSwgRlhBUkdCX0IoY29sb3IpKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZYRElCX1JnYjoKLSAgICBjYXNlIEZYRElCX1JnYjMyOiB7Ci0gICAgICBpbnQgYWxwaGEgPSBGWEFSR0JfQShjb2xvcik7Ci0gICAgICBwb3NbMF0gPSAoRlhBUkdCX0IoY29sb3IpICogYWxwaGEgKyBwb3NbMF0gKiAoMjU1IC0gYWxwaGEpKSAvIDI1NTsKLSAgICAgIHBvc1sxXSA9IChGWEFSR0JfRyhjb2xvcikgKiBhbHBoYSArIHBvc1sxXSAqICgyNTUgLSBhbHBoYSkpIC8gMjU1OwotICAgICAgcG9zWzJdID0gKEZYQVJHQl9SKGNvbG9yKSAqIGFscGhhICsgcG9zWzJdICogKDI1NSAtIGFscGhhKSkgLyAyNTU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGWERJQl9SZ2JhOiB7Ci0gICAgICBwb3NbMF0gPSBGWEFSR0JfQihjb2xvcik7Ci0gICAgICBwb3NbMV0gPSBGWEFSR0JfRyhjb2xvcik7Ci0gICAgICBwb3NbMl0gPSBGWEFSR0JfUihjb2xvcik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGWERJQl9BcmdiOgotICAgICAgRlhBUkdCX1NFVERJQihwb3MsIGNvbG9yKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIENGWF9ESUJpdG1hcDo6RG93blNhbXBsZVNjYW5saW5lKGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2JwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZsaXBYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF93aWR0aCkgY29uc3QgewotICBpZiAoIW1fcEJ1ZmZlcikgewotICAgIHJldHVybjsKLSAgfQotICBpbnQgc3JjX0JwcCA9IG1fYnBwIC8gODsKLSAgdWludDhfdCogc2NhbmxpbmUgPSBtX3BCdWZmZXIgKyBsaW5lICogbV9QaXRjaDsKLSAgaWYgKHNyY19CcHAgPT0gMCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2xpcF93aWR0aDsgaSsrKSB7Ci0gICAgICB1aW50MzJfdCBkZXN0X3ggPSBjbGlwX2xlZnQgKyBpOwotICAgICAgdWludDMyX3Qgc3JjX3ggPSBkZXN0X3ggKiBtX1dpZHRoIC8gZGVzdF93aWR0aDsKLSAgICAgIGlmIChiRmxpcFgpIHsKLSAgICAgICAgc3JjX3ggPSBtX1dpZHRoIC0gc3JjX3ggLSAxOwotICAgICAgfQotICAgICAgc3JjX3ggJT0gbV9XaWR0aDsKLSAgICAgIGRlc3Rfc2NhbltpXSA9IChzY2FubGluZVtzcmNfeCAvIDhdICYgKDEgPDwgKDcgLSBzcmNfeCAlIDgpKSkgPyAyNTUgOiAwOwotICAgIH0KLSAgfSBlbHNlIGlmIChzcmNfQnBwID09IDEpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsaXBfd2lkdGg7IGkrKykgewotICAgICAgdWludDMyX3QgZGVzdF94ID0gY2xpcF9sZWZ0ICsgaTsKLSAgICAgIHVpbnQzMl90IHNyY194ID0gZGVzdF94ICogbV9XaWR0aCAvIGRlc3Rfd2lkdGg7Ci0gICAgICBpZiAoYkZsaXBYKSB7Ci0gICAgICAgIHNyY194ID0gbV9XaWR0aCAtIHNyY194IC0gMTsKLSAgICAgIH0KLSAgICAgIHNyY194ICU9IG1fV2lkdGg7Ci0gICAgICBpbnQgZGVzdF9wb3MgPSBpOwotICAgICAgaWYgKG1fcFBhbGV0dGUpIHsKLSAgICAgICAgaWYgKCFJc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgZGVzdF9wb3MgKj0gMzsKLSAgICAgICAgICBGWF9BUkdCIGFyZ2IgPSBtX3BQYWxldHRlLmdldCgpW3NjYW5saW5lW3NyY194XV07Ci0gICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zXSA9IEZYQVJHQl9CKGFyZ2IpOwotICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3BvcyArIDFdID0gRlhBUkdCX0coYXJnYik7Ci0gICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgMl0gPSBGWEFSR0JfUihhcmdiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBkZXN0X3BvcyAqPSA0OwotICAgICAgICAgIEZYX0NNWUsgY215ayA9IG1fcFBhbGV0dGUuZ2V0KClbc2NhbmxpbmVbc3JjX3hdXTsKLSAgICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3NdID0gRlhTWVNfR2V0Q1ZhbHVlKGNteWspOwotICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3BvcyArIDFdID0gRlhTWVNfR2V0TVZhbHVlKGNteWspOwotICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3BvcyArIDJdID0gRlhTWVNfR2V0WVZhbHVlKGNteWspOwotICAgICAgICAgIGRlc3Rfc2NhbltkZXN0X3BvcyArIDNdID0gRlhTWVNfR2V0S1ZhbHVlKGNteWspOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBkZXN0X3NjYW5bZGVzdF9wb3NdID0gc2NhbmxpbmVbc3JjX3hdOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsaXBfd2lkdGg7IGkrKykgewotICAgICAgdWludDMyX3QgZGVzdF94ID0gY2xpcF9sZWZ0ICsgaTsKLSAgICAgIHVpbnQzMl90IHNyY194ID0KLSAgICAgICAgICBiRmxpcFggPyAobV9XaWR0aCAtIGRlc3RfeCAqIG1fV2lkdGggLyBkZXN0X3dpZHRoIC0gMSkgKiBzcmNfQnBwCi0gICAgICAgICAgICAgICAgIDogKGRlc3RfeCAqIG1fV2lkdGggLyBkZXN0X3dpZHRoKSAqIHNyY19CcHA7Ci0gICAgICBzcmNfeCAlPSBtX1dpZHRoICogc3JjX0JwcDsKLSAgICAgIGludCBkZXN0X3BvcyA9IGkgKiBzcmNfQnBwOwotICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBzcmNfQnBwOyBiKyspIHsKLSAgICAgICAgZGVzdF9zY2FuW2Rlc3RfcG9zICsgYl0gPSBzY2FubGluZVtzcmNfeCArIGJdOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vLyBUT0RPKHdlaWxpKTogU3BsaXQgdGhpcyBmdW5jdGlvbiBpbnRvIHR3byBmb3IgaGFuZGxpbmcgQ01ZSyBhbmQgUkdCCi0vLyBjb2xvcnMgc2VwYXJhdGVseS4KLWJvb2wgQ0ZYX0RJQml0bWFwOjpDb252ZXJ0Q29sb3JTY2FsZSh1aW50MzJfdCBmb3JlY29sb3IsIHVpbnQzMl90IGJhY2tjb2xvcikgewotICBBU1NFUlQoIUlzQWxwaGFNYXNrKCkpOwotICBpZiAoIW1fcEJ1ZmZlciB8fCBJc0FscGhhTWFzaygpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIFZhbHVlcyB1c2VkIGZvciBDTVlLIGNvbG9ycy4KLSAgaW50IGZjID0gMDsKLSAgaW50IGZtID0gMDsKLSAgaW50IGZ5ID0gMDsKLSAgaW50IGZrID0gMDsKLSAgaW50IGJjID0gMDsKLSAgaW50IGJtID0gMDsKLSAgaW50IGJ5ID0gMDsKLSAgaW50IGJrID0gMDsKLSAgLy8gVmFsdWVzIHVzZWQgZm9yIFJHQiBjb2xvcnMuCi0gIGludCBmciA9IDA7Ci0gIGludCBmZyA9IDA7Ci0gIGludCBmYiA9IDA7Ci0gIGludCBiciA9IDA7Ci0gIGludCBiZyA9IDA7Ci0gIGludCBiYiA9IDA7Ci0gIGJvb2wgaXNDbXlrSW1hZ2UgPSBJc0NteWtJbWFnZSgpOwotICBpZiAoaXNDbXlrSW1hZ2UpIHsKLSAgICBmYyA9IEZYU1lTX0dldENWYWx1ZShmb3JlY29sb3IpOwotICAgIGZtID0gRlhTWVNfR2V0TVZhbHVlKGZvcmVjb2xvcik7Ci0gICAgZnkgPSBGWFNZU19HZXRZVmFsdWUoZm9yZWNvbG9yKTsKLSAgICBmayA9IEZYU1lTX0dldEtWYWx1ZShmb3JlY29sb3IpOwotICAgIGJjID0gRlhTWVNfR2V0Q1ZhbHVlKGJhY2tjb2xvcik7Ci0gICAgYm0gPSBGWFNZU19HZXRNVmFsdWUoYmFja2NvbG9yKTsKLSAgICBieSA9IEZYU1lTX0dldFlWYWx1ZShiYWNrY29sb3IpOwotICAgIGJrID0gRlhTWVNfR2V0S1ZhbHVlKGJhY2tjb2xvcik7Ci0gIH0gZWxzZSB7Ci0gICAgZnIgPSBGWFNZU19HZXRSVmFsdWUoZm9yZWNvbG9yKTsKLSAgICBmZyA9IEZYU1lTX0dldEdWYWx1ZShmb3JlY29sb3IpOwotICAgIGZiID0gRlhTWVNfR2V0QlZhbHVlKGZvcmVjb2xvcik7Ci0gICAgYnIgPSBGWFNZU19HZXRSVmFsdWUoYmFja2NvbG9yKTsKLSAgICBiZyA9IEZYU1lTX0dldEdWYWx1ZShiYWNrY29sb3IpOwotICAgIGJiID0gRlhTWVNfR2V0QlZhbHVlKGJhY2tjb2xvcik7Ci0gIH0KLSAgaWYgKG1fYnBwIDw9IDgpIHsKLSAgICBpZiAoaXNDbXlrSW1hZ2UpIHsKLSAgICAgIGlmIChmb3JlY29sb3IgPT0gMHhmZiAmJiBiYWNrY29sb3IgPT0gMCAmJiAhbV9wUGFsZXR0ZSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGZvcmVjb2xvciA9PSAwICYmIGJhY2tjb2xvciA9PSAweGZmZmZmZiAmJiAhbV9wUGFsZXR0ZSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmICghbV9wUGFsZXR0ZSkgewotICAgICAgQnVpbGRQYWxldHRlKCk7Ci0gICAgfQotICAgIGludCBzaXplID0gMSA8PCBtX2JwcDsKLSAgICBpZiAoaXNDbXlrSW1hZ2UpIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIHVpbnQ4X3QgYiwgZywgcjsKLSAgICAgICAgQWRvYmVDTVlLX3RvX3NSR0IxKEZYU1lTX0dldENWYWx1ZShtX3BQYWxldHRlLmdldCgpW2ldKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldE1WYWx1ZShtX3BQYWxldHRlLmdldCgpW2ldKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldFlWYWx1ZShtX3BQYWxldHRlLmdldCgpW2ldKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX0dldEtWYWx1ZShtX3BQYWxldHRlLmdldCgpW2ldKSwgciwgZywgYik7Ci0gICAgICAgIGludCBncmF5ID0gMjU1IC0gRlhSR0IyR1JBWShyLCBnLCBiKTsKLSAgICAgICAgbV9wUGFsZXR0ZS5nZXQoKVtpXSA9IENteWtFbmNvZGUoCi0gICAgICAgICAgICBiYyArIChmYyAtIGJjKSAqIGdyYXkgLyAyNTUsIGJtICsgKGZtIC0gYm0pICogZ3JheSAvIDI1NSwKLSAgICAgICAgICAgIGJ5ICsgKGZ5IC0gYnkpICogZ3JheSAvIDI1NSwgYmsgKyAoZmsgLSBiaykgKiBncmF5IC8gMjU1KTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgaW50IGdyYXkgPSBGWFJHQjJHUkFZKEZYQVJHQl9SKG1fcFBhbGV0dGUuZ2V0KClbaV0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX0cobV9wUGFsZXR0ZS5nZXQoKVtpXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfQihtX3BQYWxldHRlLmdldCgpW2ldKSk7Ci0gICAgICAgIG1fcFBhbGV0dGUuZ2V0KClbaV0gPSBGWEFSR0JfTUFLRSgweGZmLCBiciArIChmciAtIGJyKSAqIGdyYXkgLyAyNTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZyArIChmZyAtIGJnKSAqIGdyYXkgLyAyNTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYiArIChmYiAtIGJiKSAqIGdyYXkgLyAyNTUpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoaXNDbXlrSW1hZ2UpIHsKLSAgICBpZiAoZm9yZWNvbG9yID09IDB4ZmYgJiYgYmFja2NvbG9yID09IDB4MDApIHsKLSAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykgewotICAgICAgICB1aW50OF90KiBzY2FubGluZSA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7Ci0gICAgICAgICAgdWludDhfdCBiLCBnLCByOwotICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShzY2FubGluZVswXSwgc2NhbmxpbmVbMV0sIHNjYW5saW5lWzJdLCBzY2FubGluZVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciwgZywgYik7Ci0gICAgICAgICAgKnNjYW5saW5lKysgPSAwOwotICAgICAgICAgICpzY2FubGluZSsrID0gMDsKLSAgICAgICAgICAqc2NhbmxpbmUrKyA9IDA7Ci0gICAgICAgICAgKnNjYW5saW5lKysgPSAyNTUgLSBGWFJHQjJHUkFZKHIsIGcsIGIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoZm9yZWNvbG9yID09IDAgJiYgYmFja2NvbG9yID09IDB4ZmZmZmZmKSB7Ci0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7Ci0gICAgICB1aW50OF90KiBzY2FubGluZSA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7Ci0gICAgICBpbnQgZ2FwID0gbV9icHAgLyA4IC0gMjsKLSAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7Ci0gICAgICAgIGludCBncmF5ID0gRlhSR0IyR1JBWShzY2FubGluZVsyXSwgc2NhbmxpbmVbMV0sIHNjYW5saW5lWzBdKTsKLSAgICAgICAgKnNjYW5saW5lKysgPSBncmF5OwotICAgICAgICAqc2NhbmxpbmUrKyA9IGdyYXk7Ci0gICAgICAgICpzY2FubGluZSA9IGdyYXk7Ci0gICAgICAgIHNjYW5saW5lICs9IGdhcDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKGlzQ215a0ltYWdlKSB7Ci0gICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9IZWlnaHQ7IHJvdysrKSB7Ci0gICAgICB1aW50OF90KiBzY2FubGluZSA9IG1fcEJ1ZmZlciArIHJvdyAqIG1fUGl0Y2g7Ci0gICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgewotICAgICAgICB1aW50OF90IGIsIGcsIHI7Ci0gICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShzY2FubGluZVswXSwgc2NhbmxpbmVbMV0sIHNjYW5saW5lWzJdLCBzY2FubGluZVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIpOwotICAgICAgICBpbnQgZ3JheSA9IDI1NSAtIEZYUkdCMkdSQVkociwgZywgYik7Ci0gICAgICAgICpzY2FubGluZSsrID0gYmMgKyAoZmMgLSBiYykgKiBncmF5IC8gMjU1OwotICAgICAgICAqc2NhbmxpbmUrKyA9IGJtICsgKGZtIC0gYm0pICogZ3JheSAvIDI1NTsKLSAgICAgICAgKnNjYW5saW5lKysgPSBieSArIChmeSAtIGJ5KSAqIGdyYXkgLyAyNTU7Ci0gICAgICAgICpzY2FubGluZSsrID0gYmsgKyAoZmsgLSBiaykgKiBncmF5IC8gMjU1OwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKLSAgICAgIHVpbnQ4X3QqIHNjYW5saW5lID0gbV9wQnVmZmVyICsgcm93ICogbV9QaXRjaDsKLSAgICAgIGludCBnYXAgPSBtX2JwcCAvIDggLSAyOwotICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKLSAgICAgICAgaW50IGdyYXkgPSBGWFJHQjJHUkFZKHNjYW5saW5lWzJdLCBzY2FubGluZVsxXSwgc2NhbmxpbmVbMF0pOwotICAgICAgICAqc2NhbmxpbmUrKyA9IGJiICsgKGZiIC0gYmIpICogZ3JheSAvIDI1NTsKLSAgICAgICAgKnNjYW5saW5lKysgPSBiZyArIChmZyAtIGJnKSAqIGdyYXkgLyAyNTU7Ci0gICAgICAgICpzY2FubGluZSA9IGJyICsgKGZyIC0gYnIpICogZ3JheSAvIDI1NTsKLSAgICAgICAgc2NhbmxpbmUgKz0gZ2FwOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gQ0ZYX0RJQlNvdXJjZTo6RmxpcEltYWdlKGJvb2wgYlhGbGlwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYllGbGlwKSBjb25zdCB7Ci0gIGF1dG8gcEZsaXBwZWQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0RJQml0bWFwPigpOwotICBpZiAoIXBGbGlwcGVkLT5DcmVhdGUobV9XaWR0aCwgbV9IZWlnaHQsIEdldEZvcm1hdCgpKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBwRmxpcHBlZC0+U2V0UGFsZXR0ZShtX3BQYWxldHRlLmdldCgpKTsKLSAgdWludDhfdCogcERlc3RCdWZmZXIgPSBwRmxpcHBlZC0+R2V0QnVmZmVyKCk7Ci0gIGludCBCcHAgPSBtX2JwcCAvIDg7Ci0gIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fSGVpZ2h0OyByb3crKykgewotICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gR2V0U2NhbmxpbmUocm93KTsKLSAgICB1aW50OF90KiBkZXN0X3NjYW4gPQotICAgICAgICBwRGVzdEJ1ZmZlciArIG1fUGl0Y2ggKiAoYllGbGlwID8gKG1fSGVpZ2h0IC0gcm93IC0gMSkgOiByb3cpOwotICAgIGlmICghYlhGbGlwKSB7Ci0gICAgICBGWFNZU19tZW1jcHkoZGVzdF9zY2FuLCBzcmNfc2NhbiwgbV9QaXRjaCk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKG1fYnBwID09IDEpIHsKLSAgICAgIEZYU1lTX21lbXNldChkZXN0X3NjYW4sIDAsIG1fUGl0Y2gpOwotICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspCi0gICAgICAgIGlmIChzcmNfc2Nhbltjb2wgLyA4XSAmICgxIDw8ICg3IC0gY29sICUgOCkpKSB7Ci0gICAgICAgICAgaW50IGRlc3RfY29sID0gbV9XaWR0aCAtIGNvbCAtIDE7Ci0gICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfY29sIC8gOF0gfD0gKDEgPDwgKDcgLSBkZXN0X2NvbCAlIDgpKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBkZXN0X3NjYW4gKz0gKG1fV2lkdGggLSAxKSAqIEJwcDsKLSAgICAgIGlmIChCcHAgPT0gMSkgewotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgewotICAgICAgICAgICpkZXN0X3NjYW4gPSAqc3JjX3NjYW47Ci0gICAgICAgICAgZGVzdF9zY2FuLS07Ci0gICAgICAgICAgc3JjX3NjYW4rKzsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChCcHAgPT0gMykgewotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX1dpZHRoOyBjb2wrKykgewotICAgICAgICAgIGRlc3Rfc2NhblswXSA9IHNyY19zY2FuWzBdOwotICAgICAgICAgIGRlc3Rfc2NhblsxXSA9IHNyY19zY2FuWzFdOwotICAgICAgICAgIGRlc3Rfc2NhblsyXSA9IHNyY19zY2FuWzJdOwotICAgICAgICAgIGRlc3Rfc2NhbiAtPSAzOwotICAgICAgICAgIHNyY19zY2FuICs9IDM7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEFTU0VSVChCcHAgPT0gNCk7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fV2lkdGg7IGNvbCsrKSB7Ci0gICAgICAgICAgKih1aW50MzJfdCopZGVzdF9zY2FuID0gKih1aW50MzJfdCopc3JjX3NjYW47Ci0gICAgICAgICAgZGVzdF9zY2FuIC09IDQ7Ci0gICAgICAgICAgc3JjX3NjYW4gKz0gNDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICBpZiAobV9wQWxwaGFNYXNrKSB7Ci0gICAgcERlc3RCdWZmZXIgPSBwRmxpcHBlZC0+bV9wQWxwaGFNYXNrLT5HZXRCdWZmZXIoKTsKLSAgICB1aW50MzJfdCBkZXN0X3BpdGNoID0gcEZsaXBwZWQtPm1fcEFscGhhTWFzay0+R2V0UGl0Y2goKTsKLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX0hlaWdodDsgcm93KyspIHsKLSAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gbV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgdWludDhfdCogZGVzdF9zY2FuID0KLSAgICAgICAgICBwRGVzdEJ1ZmZlciArIGRlc3RfcGl0Y2ggKiAoYllGbGlwID8gKG1fSGVpZ2h0IC0gcm93IC0gMSkgOiByb3cpOwotICAgICAgaWYgKCFiWEZsaXApIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5KGRlc3Rfc2Nhbiwgc3JjX3NjYW4sIGRlc3RfcGl0Y2gpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGRlc3Rfc2NhbiArPSAobV9XaWR0aCAtIDEpOwotICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9XaWR0aDsgY29sKyspIHsKLSAgICAgICAgKmRlc3Rfc2NhbiA9ICpzcmNfc2NhbjsKLSAgICAgICAgZGVzdF9zY2FuLS07Ci0gICAgICAgIHNyY19zY2FuKys7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBwRmxpcHBlZDsKLX0KLQotQ0ZYX0RJQkV4dHJhY3Rvcjo6Q0ZYX0RJQkV4dHJhY3Rvcihjb25zdCBDRlhfRElCU291cmNlKiBwU3JjKSB7Ci0gIGlmIChwU3JjLT5HZXRCdWZmZXIoKSkgewotICAgIG1fcEJpdG1hcCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfRElCaXRtYXA+KCk7Ci0gICAgaWYgKCFtX3BCaXRtYXAtPkNyZWF0ZShwU3JjLT5HZXRXaWR0aCgpLCBwU3JjLT5HZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmMtPkdldEZvcm1hdCgpLCBwU3JjLT5HZXRCdWZmZXIoKSkpIHsKLSAgICAgIG1fcEJpdG1hcC5yZXNldCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX3BCaXRtYXAtPlNldFBhbGV0dGUocFNyYy0+R2V0UGFsZXR0ZSgpKTsKLSAgICBtX3BCaXRtYXAtPlNldEFscGhhTWFzayhwU3JjLT5tX3BBbHBoYU1hc2spOwotICB9IGVsc2UgewotICAgIG1fcEJpdG1hcCA9IHBTcmMtPkNsb25lKCk7Ci0gIH0KLX0KLQotQ0ZYX0RJQkV4dHJhY3Rvcjo6fkNGWF9ESUJFeHRyYWN0b3IoKSB7fQotCi1DRlhfRmlsdGVyZWRESUI6OkNGWF9GaWx0ZXJlZERJQigpIDogbV9wU3JjKG51bGxwdHIpIHt9Ci0KLUNGWF9GaWx0ZXJlZERJQjo6fkNGWF9GaWx0ZXJlZERJQigpIHsKLSAgaWYgKG1fYkF1dG9Ecm9wU3JjKSB7Ci0gICAgZGVsZXRlIG1fcFNyYzsKLSAgfQotfQotCi12b2lkIENGWF9GaWx0ZXJlZERJQjo6TG9hZFNyYyhjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLCBib29sIGJBdXRvRHJvcFNyYykgewotICBtX3BTcmMgPSBwU3JjOwotICBtX2JBdXRvRHJvcFNyYyA9IGJBdXRvRHJvcFNyYzsKLSAgbV9XaWR0aCA9IHBTcmMtPkdldFdpZHRoKCk7Ci0gIG1fSGVpZ2h0ID0gcFNyYy0+R2V0SGVpZ2h0KCk7Ci0gIEZYRElCX0Zvcm1hdCBmb3JtYXQgPSBHZXREZXN0Rm9ybWF0KCk7Ci0gIG1fYnBwID0gKHVpbnQ4X3QpZm9ybWF0OwotICBtX0FscGhhRmxhZyA9ICh1aW50OF90KShmb3JtYXQgPj4gOCk7Ci0gIG1fUGl0Y2ggPSAobV9XaWR0aCAqIChmb3JtYXQgJiAweGZmKSArIDMxKSAvIDMyICogNDsKLSAgbV9wUGFsZXR0ZS5yZXNldChHZXREZXN0UGFsZXR0ZSgpKTsKLSAgbV9TY2FubGluZS5yZXNpemUobV9QaXRjaCk7Ci19Ci0KLWNvbnN0IHVpbnQ4X3QqIENGWF9GaWx0ZXJlZERJQjo6R2V0U2NhbmxpbmUoaW50IGxpbmUpIGNvbnN0IHsKLSAgVHJhbnNsYXRlU2NhbmxpbmUobV9wU3JjLT5HZXRTY2FubGluZShsaW5lKSwgJm1fU2NhbmxpbmUpOwotICByZXR1cm4gbV9TY2FubGluZS5kYXRhKCk7Ci19Ci0KLXZvaWQgQ0ZYX0ZpbHRlcmVkRElCOjpEb3duU2FtcGxlU2NhbmxpbmUoaW50IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfYnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmxpcFgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3dpZHRoKSBjb25zdCB7Ci0gIG1fcFNyYy0+RG93blNhbXBsZVNjYW5saW5lKGxpbmUsIGRlc3Rfc2NhbiwgZGVzdF9icHAsIGRlc3Rfd2lkdGgsIGJGbGlwWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF9sZWZ0LCBjbGlwX3dpZHRoKTsKLSAgVHJhbnNsYXRlRG93blNhbXBsZXMoZGVzdF9zY2FuLCBkZXN0X3NjYW4sIGNsaXBfd2lkdGgsIGRlc3RfYnBwKTsKLX0KLQotQ0ZYX0ltYWdlUmVuZGVyZXI6OkNGWF9JbWFnZVJlbmRlcmVyKCkgewotICBtX1N0YXR1cyA9IDA7Ci0gIG1fcEljY1RyYW5zZm9ybSA9IG51bGxwdHI7Ci0gIG1fYlJnYkJ5dGVPcmRlciA9IGZhbHNlOwotICBtX0JsZW5kVHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTDsKLX0KLQotQ0ZYX0ltYWdlUmVuZGVyZXI6On5DRlhfSW1hZ2VSZW5kZXJlcigpIHt9Ci0KLWJvb2wgQ0ZYX0ltYWdlUmVuZGVyZXI6OlN0YXJ0KENGWF9ESUJpdG1hcCogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWFza19jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkaWJfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZ2JCeXRlT3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgewotICBtX01hdHJpeCA9ICpwTWF0cml4OwotICBDRlhfRmxvYXRSZWN0IGltYWdlX3JlY3RfZiA9IG1fTWF0cml4LkdldFVuaXRSZWN0KCk7Ci0gIEZYX1JFQ1QgaW1hZ2VfcmVjdCA9IGltYWdlX3JlY3RfZi5HZXRPdXRlclJlY3QoKTsKLSAgbV9DbGlwQm94ID0gcENsaXBSZ24gPyBwQ2xpcFJnbi0+R2V0Qm94KCkgOiBGWF9SRUNUKDAsIDAsIHBEZXZpY2UtPkdldFdpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGV2aWNlLT5HZXRIZWlnaHQoKSk7Ci0gIG1fQ2xpcEJveC5JbnRlcnNlY3QoaW1hZ2VfcmVjdCk7Ci0gIGlmIChtX0NsaXBCb3guSXNFbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBtX3BEZXZpY2UgPSBwRGV2aWNlOwotICBtX3BDbGlwUmduID0gcENsaXBSZ247Ci0gIG1fTWFza0NvbG9yID0gbWFza19jb2xvcjsKLSAgbV9CaXRtYXBBbHBoYSA9IGJpdG1hcF9hbHBoYTsKLSAgbV9NYXRyaXggPSAqcE1hdHJpeDsKLSAgbV9GbGFncyA9IGRpYl9mbGFnczsKLSAgbV9BbHBoYUZsYWcgPSBhbHBoYV9mbGFnOwotICBtX3BJY2NUcmFuc2Zvcm0gPSBwSWNjVHJhbnNmb3JtOwotICBtX2JSZ2JCeXRlT3JkZXIgPSBiUmdiQnl0ZU9yZGVyOwotICBtX0JsZW5kVHlwZSA9IGJsZW5kX3R5cGU7Ci0KLSAgaWYgKChGWFNZU19mYWJzKG1fTWF0cml4LmIpID49IDAuNWYgfHwgbV9NYXRyaXguYSA9PSAwKSB8fAotICAgICAgKEZYU1lTX2ZhYnMobV9NYXRyaXguYykgPj0gMC41ZiB8fCBtX01hdHJpeC5kID09IDApKSB7Ci0gICAgaWYgKEZYU1lTX2ZhYnMobV9NYXRyaXguYSkgPCBGWFNZU19mYWJzKG1fTWF0cml4LmIpIC8gMjAgJiYKLSAgICAgICAgRlhTWVNfZmFicyhtX01hdHJpeC5kKSA8IEZYU1lTX2ZhYnMobV9NYXRyaXguYykgLyAyMCAmJgotICAgICAgICBGWFNZU19mYWJzKG1fTWF0cml4LmEpIDwgMC41ZiAmJiBGWFNZU19mYWJzKG1fTWF0cml4LmQpIDwgMC41ZikgewotICAgICAgaW50IGRlc3Rfd2lkdGggPSBpbWFnZV9yZWN0LldpZHRoKCk7Ci0gICAgICBpbnQgZGVzdF9oZWlnaHQgPSBpbWFnZV9yZWN0LkhlaWdodCgpOwotICAgICAgRlhfUkVDVCBiaXRtYXBfY2xpcCA9IG1fQ2xpcEJveDsKLSAgICAgIGJpdG1hcF9jbGlwLk9mZnNldCgtaW1hZ2VfcmVjdC5sZWZ0LCAtaW1hZ2VfcmVjdC50b3ApOwotICAgICAgYml0bWFwX2NsaXAgPSBGWERJQl9Td2FwQ2xpcEJveChiaXRtYXBfY2xpcCwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fTWF0cml4LmMgPiAwLCBtX01hdHJpeC5iIDwgMCk7Ci0gICAgICBtX0NvbXBvc2VyLkNvbXBvc2UocERldmljZSwgcENsaXBSZ24sIGJpdG1hcF9hbHBoYSwgbWFza19jb2xvciwgbV9DbGlwQm94LAotICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIG1fTWF0cml4LmMgPiAwLCBtX01hdHJpeC5iIDwgMCwgbV9iUmdiQnl0ZU9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhX2ZsYWcsIHBJY2NUcmFuc2Zvcm0sIG1fQmxlbmRUeXBlKTsKLSAgICAgIG1fU3RyZXRjaGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9JbWFnZVN0cmV0Y2hlcj4oCi0gICAgICAgICAgJm1fQ29tcG9zZXIsIHBTb3VyY2UsIGRlc3RfaGVpZ2h0LCBkZXN0X3dpZHRoLCBiaXRtYXBfY2xpcCwKLSAgICAgICAgICBkaWJfZmxhZ3MpOwotICAgICAgaWYgKCFtX1N0cmV0Y2hlci0+U3RhcnQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICBtX1N0YXR1cyA9IDE7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgbV9TdGF0dXMgPSAyOwotICAgIG1fcFRyYW5zZm9ybWVyLnJlc2V0KAotICAgICAgICBuZXcgQ0ZYX0ltYWdlVHJhbnNmb3JtZXIocFNvdXJjZSwgJm1fTWF0cml4LCBkaWJfZmxhZ3MsICZtX0NsaXBCb3gpKTsKLSAgICBtX3BUcmFuc2Zvcm1lci0+U3RhcnQoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGludCBkZXN0X3dpZHRoID0gaW1hZ2VfcmVjdC5XaWR0aCgpOwotICBpZiAobV9NYXRyaXguYSA8IDApCi0gICAgZGVzdF93aWR0aCA9IC1kZXN0X3dpZHRoOwotCi0gIGludCBkZXN0X2hlaWdodCA9IGltYWdlX3JlY3QuSGVpZ2h0KCk7Ci0gIGlmIChtX01hdHJpeC5kID4gMCkKLSAgICBkZXN0X2hlaWdodCA9IC1kZXN0X2hlaWdodDsKLQotICBpZiAoZGVzdF93aWR0aCA9PSAwIHx8IGRlc3RfaGVpZ2h0ID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIEZYX1JFQ1QgYml0bWFwX2NsaXAgPSBtX0NsaXBCb3g7Ci0gIGJpdG1hcF9jbGlwLk9mZnNldCgtaW1hZ2VfcmVjdC5sZWZ0LCAtaW1hZ2VfcmVjdC50b3ApOwotICBtX0NvbXBvc2VyLkNvbXBvc2UocERldmljZSwgcENsaXBSZ24sIGJpdG1hcF9hbHBoYSwgbWFza19jb2xvciwgbV9DbGlwQm94LAotICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSwgbV9iUmdiQnl0ZU9yZGVyLCBhbHBoYV9mbGFnLAotICAgICAgICAgICAgICAgICAgICAgcEljY1RyYW5zZm9ybSwgbV9CbGVuZFR5cGUpOwotICBtX1N0YXR1cyA9IDE7Ci0gIG1fU3RyZXRjaGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9JbWFnZVN0cmV0Y2hlcj4oCi0gICAgICAmbV9Db21wb3NlciwgcFNvdXJjZSwgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIGJpdG1hcF9jbGlwLCBkaWJfZmxhZ3MpOwotICByZXR1cm4gbV9TdHJldGNoZXItPlN0YXJ0KCk7Ci19Ci0KLWJvb2wgQ0ZYX0ltYWdlUmVuZGVyZXI6OkNvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKSB7Ci0gIGlmIChtX1N0YXR1cyA9PSAxKQotICAgIHJldHVybiBtX1N0cmV0Y2hlci0+Q29udGludWUocFBhdXNlKTsKLQotICBpZiAobV9TdGF0dXMgPT0gMikgewotICAgIGlmIChtX3BUcmFuc2Zvcm1lci0+Q29udGludWUocFBhdXNlKSkKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gcEJpdG1hcChtX3BUcmFuc2Zvcm1lci0+RGV0YWNoQml0bWFwKCkpOwotICAgIGlmICghcEJpdG1hcCB8fCAhcEJpdG1hcC0+R2V0QnVmZmVyKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAocEJpdG1hcC0+SXNBbHBoYU1hc2soKSkgewotICAgICAgaWYgKG1fQml0bWFwQWxwaGEgIT0gMjU1KSB7Ci0gICAgICAgIGlmIChtX0FscGhhRmxhZyA+PiA4KSB7Ci0gICAgICAgICAgbV9BbHBoYUZsYWcgPQotICAgICAgICAgICAgICAoKCh1aW50OF90KSgobV9BbHBoYUZsYWcgJiAweGZmKSAqIG1fQml0bWFwQWxwaGEgLyAyNTUpKSB8Ci0gICAgICAgICAgICAgICAoKG1fQWxwaGFGbGFnID4+IDgpIDw8IDgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBtX01hc2tDb2xvciA9IEZYQVJHQl9NVUxfQUxQSEEobV9NYXNrQ29sb3IsIG1fQml0bWFwQWxwaGEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBtX3BEZXZpY2UtPkNvbXBvc2l0ZU1hc2soCi0gICAgICAgICAgbV9wVHJhbnNmb3JtZXItPnJlc3VsdCgpLmxlZnQsIG1fcFRyYW5zZm9ybWVyLT5yZXN1bHQoKS50b3AsCi0gICAgICAgICAgcEJpdG1hcC0+R2V0V2lkdGgoKSwgcEJpdG1hcC0+R2V0SGVpZ2h0KCksIHBCaXRtYXAuZ2V0KCksIG1fTWFza0NvbG9yLAotICAgICAgICAgIDAsIDAsIG1fQmxlbmRUeXBlLCBtX3BDbGlwUmduLCBtX2JSZ2JCeXRlT3JkZXIsIG1fQWxwaGFGbGFnLAotICAgICAgICAgIG1fcEljY1RyYW5zZm9ybSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChtX0JpdG1hcEFscGhhICE9IDI1NSkKLSAgICAgICAgcEJpdG1hcC0+TXVsdGlwbHlBbHBoYShtX0JpdG1hcEFscGhhKTsKLSAgICAgIG1fcERldmljZS0+Q29tcG9zaXRlQml0bWFwKAotICAgICAgICAgIG1fcFRyYW5zZm9ybWVyLT5yZXN1bHQoKS5sZWZ0LCBtX3BUcmFuc2Zvcm1lci0+cmVzdWx0KCkudG9wLAotICAgICAgICAgIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpLCBwQml0bWFwLmdldCgpLCAwLCAwLAotICAgICAgICAgIG1fQmxlbmRUeXBlLCBtX3BDbGlwUmduLCBtX2JSZ2JCeXRlT3JkZXIsIG1fcEljY1RyYW5zZm9ybSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLUNGWF9CaXRtYXBTdG9yZXI6OkNGWF9CaXRtYXBTdG9yZXIoKSB7Ci19Ci0KLUNGWF9CaXRtYXBTdG9yZXI6On5DRlhfQml0bWFwU3RvcmVyKCkgewotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBDRlhfQml0bWFwU3RvcmVyOjpEZXRhY2goKSB7Ci0gIHJldHVybiBzdGQ6Om1vdmUobV9wQml0bWFwKTsKLX0KLQotdm9pZCBDRlhfQml0bWFwU3RvcmVyOjpSZXBsYWNlKHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IHBCaXRtYXApIHsKLSAgbV9wQml0bWFwID0gc3RkOjptb3ZlKHBCaXRtYXApOwotfQotCi12b2lkIENGWF9CaXRtYXBTdG9yZXI6OkNvbXBvc2VTY2FubGluZShpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2Nhbl9leHRyYV9hbHBoYSkgewotICB1aW50OF90KiBkZXN0X2J1ZiA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KG1fcEJpdG1hcC0+R2V0U2NhbmxpbmUobGluZSkpOwotICB1aW50OF90KiBkZXN0X2FscGhhX2J1ZiA9Ci0gICAgICBtX3BCaXRtYXAtPm1fcEFscGhhTWFzawotICAgICAgICAgID8gY29uc3RfY2FzdDx1aW50OF90Kj4obV9wQml0bWFwLT5tX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKGxpbmUpKQotICAgICAgICAgIDogbnVsbHB0cjsKLSAgaWYgKGRlc3RfYnVmKQotICAgIEZYU1lTX21lbWNweShkZXN0X2J1Ziwgc2NhbmxpbmUsIG1fcEJpdG1hcC0+R2V0UGl0Y2goKSk7Ci0KLSAgaWYgKGRlc3RfYWxwaGFfYnVmKSB7Ci0gICAgRlhTWVNfbWVtY3B5KGRlc3RfYWxwaGFfYnVmLCBzY2FuX2V4dHJhX2FscGhhLAotICAgICAgICAgICAgICAgICBtX3BCaXRtYXAtPm1fcEFscGhhTWFzay0+R2V0UGl0Y2goKSk7Ci0gIH0KLX0KLQotYm9vbCBDRlhfQml0bWFwU3RvcmVyOjpTZXRJbmZvKGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBwU3JjUGFsZXR0ZSkgewotICBtX3BCaXRtYXAgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0RJQml0bWFwPigpOwotICBpZiAoIW1fcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIHNyY19mb3JtYXQpKSB7Ci0gICAgbV9wQml0bWFwLnJlc2V0KCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChwU3JjUGFsZXR0ZSkKLSAgICBtX3BCaXRtYXAtPlNldFBhbGV0dGUocFNyY1BhbGV0dGUpOwotICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuICgweGZmIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYjsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9kaWIvZnhfZGliX3RyYW5zZm9ybS5jcHAgYi9jb3JlL2Z4Z2UvZGliL2Z4X2RpYl90cmFuc2Zvcm0uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDg4MjcyLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnhnZS9kaWIvZnhfZGliX3RyYW5zZm9ybS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiY29yZS9meGdlL2RpYi9kaWJfaW50LmgiCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImNvcmUvZnhnZS9meF9kaWIuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLXVpbnQ4X3QgYmlsaW5lYXJfaW50ZXJwb2woY29uc3QgdWludDhfdCogYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X29mZnNldF9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X29mZnNldF9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NvbF9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NvbF9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXNfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNfb2Zmc2V0KSB7Ci0gIGludCBpX3Jlc3ggPSAyNTUgLSByZXNfeDsKLSAgaW50IGNvbF9icHBfbCA9IHNyY19jb2xfbCAqIGJwcDsKLSAgaW50IGNvbF9icHBfciA9IHNyY19jb2xfciAqIGJwcDsKLSAgY29uc3QgdWludDhfdCogYnVmX3UgPSBidWYgKyByb3dfb2Zmc2V0X2wgKyBjX29mZnNldDsKLSAgY29uc3QgdWludDhfdCogYnVmX2QgPSBidWYgKyByb3dfb2Zmc2V0X3IgKyBjX29mZnNldDsKLSAgY29uc3QgdWludDhfdCogc3JjX3BvczAgPSBidWZfdSArIGNvbF9icHBfbDsKLSAgY29uc3QgdWludDhfdCogc3JjX3BvczEgPSBidWZfdSArIGNvbF9icHBfcjsKLSAgY29uc3QgdWludDhfdCogc3JjX3BvczIgPSBidWZfZCArIGNvbF9icHBfbDsKLSAgY29uc3QgdWludDhfdCogc3JjX3BvczMgPSBidWZfZCArIGNvbF9icHBfcjsKLSAgdWludDhfdCByX3Bvc18wID0gKCpzcmNfcG9zMCAqIGlfcmVzeCArICpzcmNfcG9zMSAqIHJlc194KSA+PiA4OwotICB1aW50OF90IHJfcG9zXzEgPSAoKnNyY19wb3MyICogaV9yZXN4ICsgKnNyY19wb3MzICogcmVzX3gpID4+IDg7Ci0gIHJldHVybiAocl9wb3NfMCAqICgyNTUgLSByZXNfeSkgKyByX3Bvc18xICogcmVzX3kpID4+IDg7Ci19Ci0KLXVpbnQ4X3QgYmljdWJpY19pbnRlcnBvbChjb25zdCB1aW50OF90KiBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwb3NfcGl4ZWxbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdV93W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZfd1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXNfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY19vZmZzZXQpIHsKLSAgaW50IHNfcmVzdWx0ID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICBpbnQgYV9yZXN1bHQgPSAwOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgNDsgaisrKSB7Ci0gICAgICBhX3Jlc3VsdCArPSB1X3dbal0gKiAoKih1aW50OF90KikoYnVmICsgcG9zX3BpeGVsW2kgKyA0XSAqIHBpdGNoICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NfcGl4ZWxbal0gKiBicHAgKyBjX29mZnNldCkpOwotICAgIH0KLSAgICBzX3Jlc3VsdCArPSBhX3Jlc3VsdCAqIHZfd1tpXTsKLSAgfQotICBzX3Jlc3VsdCA+Pj0gMTY7Ci0gIHJldHVybiAodWludDhfdCkoc19yZXN1bHQgPCAwID8gMCA6IHNfcmVzdWx0ID4gMjU1ID8gMjU1IDogc19yZXN1bHQpOwotfQotCi12b2lkIGJpY3ViaWNfZ2V0X3Bvc193ZWlnaHQoaW50IHBvc19waXhlbFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1X3dbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdl93W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19jb2xfbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3Jvd19sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXNfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmV0Y2hfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gIHBvc19waXhlbFswXSA9IHNyY19jb2xfbCAtIDE7Ci0gIHBvc19waXhlbFsxXSA9IHNyY19jb2xfbDsKLSAgcG9zX3BpeGVsWzJdID0gc3JjX2NvbF9sICsgMTsKLSAgcG9zX3BpeGVsWzNdID0gc3JjX2NvbF9sICsgMjsKLSAgcG9zX3BpeGVsWzRdID0gc3JjX3Jvd19sIC0gMTsKLSAgcG9zX3BpeGVsWzVdID0gc3JjX3Jvd19sOwotICBwb3NfcGl4ZWxbNl0gPSBzcmNfcm93X2wgKyAxOwotICBwb3NfcGl4ZWxbN10gPSBzcmNfcm93X2wgKyAyOwotICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgIGlmIChwb3NfcGl4ZWxbaV0gPCAwKSB7Ci0gICAgICBwb3NfcGl4ZWxbaV0gPSAwOwotICAgIH0KLSAgICBpZiAocG9zX3BpeGVsW2ldID49IHN0cmV0Y2hfd2lkdGgpIHsKLSAgICAgIHBvc19waXhlbFtpXSA9IHN0cmV0Y2hfd2lkdGggLSAxOwotICAgIH0KLSAgICBpZiAocG9zX3BpeGVsW2kgKyA0XSA8IDApIHsKLSAgICAgIHBvc19waXhlbFtpICsgNF0gPSAwOwotICAgIH0KLSAgICBpZiAocG9zX3BpeGVsW2kgKyA0XSA+PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgcG9zX3BpeGVsW2kgKyA0XSA9IHN0cmV0Y2hfaGVpZ2h0IC0gMTsKLSAgICB9Ci0gIH0KLSAgdV93WzBdID0gU0RQX1RhYmxlWzI1NiArIHJlc194XTsKLSAgdV93WzFdID0gU0RQX1RhYmxlW3Jlc194XTsKLSAgdV93WzJdID0gU0RQX1RhYmxlWzI1NiAtIHJlc194XTsKLSAgdV93WzNdID0gU0RQX1RhYmxlWzUxMiAtIHJlc194XTsKLSAgdl93WzBdID0gU0RQX1RhYmxlWzI1NiArIHJlc195XTsKLSAgdl93WzFdID0gU0RQX1RhYmxlW3Jlc195XTsKLSAgdl93WzJdID0gU0RQX1RhYmxlWzI1NiAtIHJlc195XTsKLSAgdl93WzNdID0gU0RQX1RhYmxlWzUxMiAtIHJlc195XTsKLX0KLQotRlhESUJfRm9ybWF0IEdldFRyYW5zZm9ybWVkRm9ybWF0KGNvbnN0IENGWF9ESUJTb3VyY2UqIHBEcmMpIHsKLSAgRlhESUJfRm9ybWF0IGZvcm1hdCA9IHBEcmMtPkdldEZvcm1hdCgpOwotICBpZiAocERyYy0+SXNBbHBoYU1hc2soKSkgewotICAgIGZvcm1hdCA9IEZYRElCXzhicHBNYXNrOwotICB9IGVsc2UgaWYgKGZvcm1hdCA+PSAxMDI1KSB7Ci0gICAgZm9ybWF0ID0gRlhESUJfQ215a2E7Ci0gIH0gZWxzZSBpZiAoZm9ybWF0IDw9IDMyIHx8IGZvcm1hdCA9PSBGWERJQl9BcmdiKSB7Ci0gICAgZm9ybWF0ID0gRlhESUJfQXJnYjsKLSAgfSBlbHNlIHsKLSAgICBmb3JtYXQgPSBGWERJQl9SZ2JhOwotICB9Ci0gIHJldHVybiBmb3JtYXQ7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1jb25zdCBpbnQxNl90IFNEUF9UYWJsZVs1MTNdID0gewotICAgIDI1NiwgMjU2LCAyNTYsIDI1NiwgMjU2LCAyNTYsIDI1NiwgMjU2LCAyNTYsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCi0gICAgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTMsIDI1MywgMjUzLCAyNTIsIDI1MiwgMjUyLCAyNTEsIDI1MSwgMjUxLCAyNTAsIDI1MCwKLSAgICAyNDksIDI0OSwgMjQ5LCAyNDgsIDI0OCwgMjQ3LCAyNDcsIDI0NiwgMjQ2LCAyNDUsIDI0NCwgMjQ0LCAyNDMsIDI0MywgMjQyLAotICAgIDI0MiwgMjQxLCAyNDAsIDI0MCwgMjM5LCAyMzgsIDIzOCwgMjM3LCAyMzYsIDIzNiwgMjM1LCAyMzQsIDIzMywgMjMzLCAyMzIsCi0gICAgMjMxLCAyMzAsIDIzMCwgMjI5LCAyMjgsIDIyNywgMjI2LCAyMjYsIDIyNSwgMjI0LCAyMjMsIDIyMiwgMjIxLCAyMjAsIDIxOSwKLSAgICAyMTgsIDIxOCwgMjE3LCAyMTYsIDIxNSwgMjE0LCAyMTMsIDIxMiwgMjExLCAyMTAsIDIwOSwgMjA4LCAyMDcsIDIwNiwgMjA1LAotICAgIDIwNCwgMjAzLCAyMDIsIDIwMSwgMjAwLCAxOTksIDE5OCwgMTk2LCAxOTUsIDE5NCwgMTkzLCAxOTIsIDE5MSwgMTkwLCAxODksCi0gICAgMTg4LCAxODYsIDE4NSwgMTg0LCAxODMsIDE4MiwgMTgxLCAxNzksIDE3OCwgMTc3LCAxNzYsIDE3NSwgMTczLCAxNzIsIDE3MSwKLSAgICAxNzAsIDE2OSwgMTY3LCAxNjYsIDE2NSwgMTY0LCAxNjIsIDE2MSwgMTYwLCAxNTksIDE1NywgMTU2LCAxNTUsIDE1NCwgMTUyLAotICAgIDE1MSwgMTUwLCAxNDksIDE0NywgMTQ2LCAxNDUsIDE0MywgMTQyLCAxNDEsIDE0MCwgMTM4LCAxMzcsIDEzNiwgMTM0LCAxMzMsCi0gICAgMTMyLCAxMzAsIDEyOSwgMTI4LCAxMjYsIDEyNSwgMTI0LCAxMjIsIDEyMSwgMTIwLCAxMTksIDExNywgMTE2LCAxMTUsIDExMywKLSAgICAxMTIsIDExMSwgMTA5LCAxMDgsIDEwNywgMTA1LCAxMDQsIDEwMywgMTAxLCAxMDAsIDk5LCAgOTcsICA5NiwgIDk1LCAgOTMsCi0gICAgOTIsICA5MSwgIDg5LCAgODgsICA4NywgIDg1LCAgODQsICA4MywgIDgxLCAgODAsICA3OSwgIDc3LCAgNzYsICA3NSwgIDczLAotICAgIDcyLCAgNzEsICA2OSwgIDY4LCAgNjcsICA2NiwgIDY0LCAgNjMsICA2MiwgIDYwLCAgNTksICA1OCwgIDU3LCAgNTUsICA1NCwKLSAgICA1MywgIDUyLCAgNTAsICA0OSwgIDQ4LCAgNDcsICA0NSwgIDQ0LCAgNDMsICA0MiwgIDQwLCAgMzksICAzOCwgIDM3LCAgMzYsCi0gICAgMzQsICAzMywgIDMyLCAgMzEsICAzMCwgIDI4LCAgMjcsICAyNiwgIDI1LCAgMjQsICAyMywgIDIxLCAgMjAsICAxOSwgIDE4LAotICAgIDE3LCAgMTYsICAxNSwgIDE0LCAgMTMsICAxMSwgIDEwLCAgOSwgICA4LCAgIDcsICAgNiwgICA1LCAgIDQsICAgMywgICAyLAotICAgIDEsICAgMCwgICAwLCAgIC0xLCAgLTIsICAtMywgIC00LCAgLTUsICAtNiwgIC03LCAgLTcsICAtOCwgIC05LCAgLTEwLCAtMTEsCi0gICAgLTEyLCAtMTIsIC0xMywgLTE0LCAtMTUsIC0xNSwgLTE2LCAtMTcsIC0xNywgLTE4LCAtMTksIC0xOSwgLTIwLCAtMjEsIC0yMSwKLSAgICAtMjIsIC0yMiwgLTIzLCAtMjQsIC0yNCwgLTI1LCAtMjUsIC0yNiwgLTI2LCAtMjcsIC0yNywgLTI3LCAtMjgsIC0yOCwgLTI5LAotICAgIC0yOSwgLTMwLCAtMzAsIC0zMCwgLTMxLCAtMzEsIC0zMSwgLTMyLCAtMzIsIC0zMiwgLTMzLCAtMzMsIC0zMywgLTMzLCAtMzQsCi0gICAgLTM0LCAtMzQsIC0zNCwgLTM1LCAtMzUsIC0zNSwgLTM1LCAtMzUsIC0zNiwgLTM2LCAtMzYsIC0zNiwgLTM2LCAtMzYsIC0zNiwKLSAgICAtMzYsIC0zNiwgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LAotICAgIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzcsIC0zNywgLTM3LCAtMzYsIC0zNiwgLTM2LCAtMzYsIC0zNiwgLTM2LCAtMzYsCi0gICAgLTM2LCAtMzYsIC0zNSwgLTM1LCAtMzUsIC0zNSwgLTM1LCAtMzUsIC0zNCwgLTM0LCAtMzQsIC0zNCwgLTM0LCAtMzMsIC0zMywKLSAgICAtMzMsIC0zMywgLTMzLCAtMzIsIC0zMiwgLTMyLCAtMzIsIC0zMSwgLTMxLCAtMzEsIC0zMSwgLTMwLCAtMzAsIC0zMCwgLTMwLAotICAgIC0yOSwgLTI5LCAtMjksIC0yOSwgLTI4LCAtMjgsIC0yOCwgLTI3LCAtMjcsIC0yNywgLTI3LCAtMjYsIC0yNiwgLTI2LCAtMjUsCi0gICAgLTI1LCAtMjUsIC0yNCwgLTI0LCAtMjQsIC0yMywgLTIzLCAtMjMsIC0yMiwgLTIyLCAtMjIsIC0yMiwgLTIxLCAtMjEsIC0yMSwKLSAgICAtMjAsIC0yMCwgLTIwLCAtMTksIC0xOSwgLTE5LCAtMTgsIC0xOCwgLTE4LCAtMTcsIC0xNywgLTE3LCAtMTYsIC0xNiwgLTE2LAotICAgIC0xNSwgLTE1LCAtMTUsIC0xNCwgLTE0LCAtMTQsIC0xMywgLTEzLCAtMTMsIC0xMiwgLTEyLCAtMTIsIC0xMSwgLTExLCAtMTEsCi0gICAgLTEwLCAtMTAsIC0xMCwgLTksICAtOSwgIC05LCAgLTksICAtOCwgIC04LCAgLTgsICAtNywgIC03LCAgLTcsICAtNywgIC02LAotICAgIC02LCAgLTYsICAtNiwgIC01LCAgLTUsICAtNSwgIC01LCAgLTQsICAtNCwgIC00LCAgLTQsICAtMywgIC0zLCAgLTMsICAtMywKLSAgICAtMywgIC0yLCAgLTIsICAtMiwgIC0yLCAgLTIsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAwLCAgIDAsICAgMCwKLSAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAwLCAgIDAsICAgMCwKLX07Ci0KLWNsYXNzIENGWF9CaWxpbmVhck1hdHJpeCA6IHB1YmxpYyBDUERGX0ZpeGVkTWF0cml4IHsKLSBwdWJsaWM6Ci0gIENGWF9CaWxpbmVhck1hdHJpeChjb25zdCBDRlhfTWF0cml4JiBzcmMsIGludCBiaXRzKQotICAgICAgOiBDUERGX0ZpeGVkTWF0cml4KHNyYywgYml0cykge30KLSAgaW5saW5lIHZvaWQgVHJhbnNmb3JtKGludCB4LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50JiB5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCYgcmVzX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHJlc195KSB7Ci0gICAgeDEgPSBhICogeCArIGMgKiB5ICsgZSArIGJhc2UgLyAyOwotICAgIHkxID0gYiAqIHggKyBkICogeSArIGYgKyBiYXNlIC8gMjsKLSAgICByZXNfeCA9IHgxICUgYmFzZTsKLSAgICByZXNfeSA9IHkxICUgYmFzZTsKLSAgICBpZiAocmVzX3ggPCAwICYmIHJlc194ID4gLWJhc2UpIHsKLSAgICAgIHJlc194ID0gYmFzZSArIHJlc194OwotICAgIH0KLSAgICBpZiAocmVzX3kgPCAwICYmIHJlc194ID4gLWJhc2UpIHsKLSAgICAgIHJlc195ID0gYmFzZSArIHJlc195OwotICAgIH0KLSAgICB4MSAvPSBiYXNlOwotICAgIHkxIC89IGJhc2U7Ci0gIH0KLX07Ci0KLXN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IENGWF9ESUJTb3VyY2U6OlN3YXBYWSgKLSAgICBib29sIGJYRmxpcCwKLSAgICBib29sIGJZRmxpcCwKLSAgICBjb25zdCBGWF9SRUNUKiBwRGVzdENsaXApIGNvbnN0IHsKLSAgRlhfUkVDVCBkZXN0X2NsaXAoMCwgMCwgbV9IZWlnaHQsIG1fV2lkdGgpOwotICBpZiAocERlc3RDbGlwKQotICAgIGRlc3RfY2xpcC5JbnRlcnNlY3QoKnBEZXN0Q2xpcCk7Ci0gIGlmIChkZXN0X2NsaXAuSXNFbXB0eSgpKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIGF1dG8gcFRyYW5zQml0bWFwID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9ESUJpdG1hcD4oKTsKLSAgaW50IHJlc3VsdF9oZWlnaHQgPSBkZXN0X2NsaXAuSGVpZ2h0KCk7Ci0gIGludCByZXN1bHRfd2lkdGggPSBkZXN0X2NsaXAuV2lkdGgoKTsKLSAgaWYgKCFwVHJhbnNCaXRtYXAtPkNyZWF0ZShyZXN1bHRfd2lkdGgsIHJlc3VsdF9oZWlnaHQsIEdldEZvcm1hdCgpKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBwVHJhbnNCaXRtYXAtPlNldFBhbGV0dGUobV9wUGFsZXR0ZS5nZXQoKSk7Ci0gIGludCBkZXN0X3BpdGNoID0gcFRyYW5zQml0bWFwLT5HZXRQaXRjaCgpOwotICB1aW50OF90KiBkZXN0X2J1ZiA9IHBUcmFuc0JpdG1hcC0+R2V0QnVmZmVyKCk7Ci0gIGludCByb3dfc3RhcnQgPSBiWEZsaXAgPyBtX0hlaWdodCAtIGRlc3RfY2xpcC5yaWdodCA6IGRlc3RfY2xpcC5sZWZ0OwotICBpbnQgcm93X2VuZCA9IGJYRmxpcCA/IG1fSGVpZ2h0IC0gZGVzdF9jbGlwLmxlZnQgOiBkZXN0X2NsaXAucmlnaHQ7Ci0gIGludCBjb2xfc3RhcnQgPSBiWUZsaXAgPyBtX1dpZHRoIC0gZGVzdF9jbGlwLmJvdHRvbSA6IGRlc3RfY2xpcC50b3A7Ci0gIGludCBjb2xfZW5kID0gYllGbGlwID8gbV9XaWR0aCAtIGRlc3RfY2xpcC50b3AgOiBkZXN0X2NsaXAuYm90dG9tOwotICBpZiAoR2V0QlBQKCkgPT0gMSkgewotICAgIEZYU1lTX21lbXNldChkZXN0X2J1ZiwgMHhmZiwgZGVzdF9waXRjaCAqIHJlc3VsdF9oZWlnaHQpOwotICAgIGZvciAoaW50IHJvdyA9IHJvd19zdGFydDsgcm93IDwgcm93X2VuZDsgcm93KyspIHsKLSAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gR2V0U2NhbmxpbmUocm93KTsKLSAgICAgIGludCBkZXN0X2NvbCA9IChiWEZsaXAgPyBkZXN0X2NsaXAucmlnaHQgLSAocm93IC0gcm93X3N0YXJ0KSAtIDEgOiByb3cpIC0KLSAgICAgICAgICAgICAgICAgICAgIGRlc3RfY2xpcC5sZWZ0OwotICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWY7Ci0gICAgICBpZiAoYllGbGlwKSB7Ci0gICAgICAgIGRlc3Rfc2NhbiArPSAocmVzdWx0X2hlaWdodCAtIDEpICogZGVzdF9waXRjaDsKLSAgICAgIH0KLSAgICAgIGludCBkZXN0X3N0ZXAgPSBiWUZsaXAgPyAtZGVzdF9waXRjaCA6IGRlc3RfcGl0Y2g7Ci0gICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7Ci0gICAgICAgIGlmICghKHNyY19zY2FuW2NvbCAvIDhdICYgKDEgPDwgKDcgLSBjb2wgJSA4KSkpKSB7Ci0gICAgICAgICAgZGVzdF9zY2FuW2Rlc3RfY29sIC8gOF0gJj0gfigxIDw8ICg3IC0gZGVzdF9jb2wgJSA4KSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IGRlc3Rfc3RlcDsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaW50IG5CeXRlcyA9IEdldEJQUCgpIC8gODsKLSAgICBpbnQgZGVzdF9zdGVwID0gYllGbGlwID8gLWRlc3RfcGl0Y2ggOiBkZXN0X3BpdGNoOwotICAgIGlmIChuQnl0ZXMgPT0gMykgewotICAgICAgZGVzdF9zdGVwIC09IDI7Ci0gICAgfQotICAgIGZvciAoaW50IHJvdyA9IHJvd19zdGFydDsgcm93IDwgcm93X2VuZDsgcm93KyspIHsKLSAgICAgIGludCBkZXN0X2NvbCA9IChiWEZsaXAgPyBkZXN0X2NsaXAucmlnaHQgLSAocm93IC0gcm93X3N0YXJ0KSAtIDEgOiByb3cpIC0KLSAgICAgICAgICAgICAgICAgICAgIGRlc3RfY2xpcC5sZWZ0OwotICAgICAgdWludDhfdCogZGVzdF9zY2FuID0gZGVzdF9idWYgKyBkZXN0X2NvbCAqIG5CeXRlczsKLSAgICAgIGlmIChiWUZsaXApIHsKLSAgICAgICAgZGVzdF9zY2FuICs9IChyZXN1bHRfaGVpZ2h0IC0gMSkgKiBkZXN0X3BpdGNoOwotICAgICAgfQotICAgICAgaWYgKG5CeXRlcyA9PSA0KSB7Ci0gICAgICAgIHVpbnQzMl90KiBzcmNfc2NhbiA9ICh1aW50MzJfdCopR2V0U2NhbmxpbmUocm93KSArIGNvbF9zdGFydDsKLSAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgewotICAgICAgICAgICoodWludDMyX3QqKWRlc3Rfc2NhbiA9ICpzcmNfc2NhbisrOwotICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X3N0ZXA7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gR2V0U2NhbmxpbmUocm93KSArIGNvbF9zdGFydCAqIG5CeXRlczsKLSAgICAgICAgaWYgKG5CeXRlcyA9PSAxKSB7Ci0gICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9ICpzcmNfc2NhbisrOwotICAgICAgICAgICAgZGVzdF9zY2FuICs9IGRlc3Rfc3RlcDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgewotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKnNyY19zY2FuKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSAqc3JjX3NjYW4rKzsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X3N0ZXA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGlmIChtX3BBbHBoYU1hc2spIHsKLSAgICBkZXN0X3BpdGNoID0gcFRyYW5zQml0bWFwLT5tX3BBbHBoYU1hc2stPkdldFBpdGNoKCk7Ci0gICAgZGVzdF9idWYgPSBwVHJhbnNCaXRtYXAtPm1fcEFscGhhTWFzay0+R2V0QnVmZmVyKCk7Ci0gICAgaW50IGRlc3Rfc3RlcCA9IGJZRmxpcCA/IC1kZXN0X3BpdGNoIDogZGVzdF9waXRjaDsKLSAgICBmb3IgKGludCByb3cgPSByb3dfc3RhcnQ7IHJvdyA8IHJvd19lbmQ7IHJvdysrKSB7Ci0gICAgICBpbnQgZGVzdF9jb2wgPSAoYlhGbGlwID8gZGVzdF9jbGlwLnJpZ2h0IC0gKHJvdyAtIHJvd19zdGFydCkgLSAxIDogcm93KSAtCi0gICAgICAgICAgICAgICAgICAgICBkZXN0X2NsaXAubGVmdDsKLSAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgZGVzdF9jb2w7Ci0gICAgICBpZiAoYllGbGlwKSB7Ci0gICAgICAgIGRlc3Rfc2NhbiArPSAocmVzdWx0X2hlaWdodCAtIDEpICogZGVzdF9waXRjaDsKLSAgICAgIH0KLSAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuID0gbV9wQWxwaGFNYXNrLT5HZXRTY2FubGluZShyb3cpICsgY29sX3N0YXJ0OwotICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgewotICAgICAgICAqZGVzdF9zY2FuID0gKnNyY19zY2FuKys7Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBkZXN0X3N0ZXA7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBwVHJhbnNCaXRtYXA7Ci19Ci0KLSNkZWZpbmUgRklYMTZfMDA1IDAuMDVmCi1GWF9SRUNUIEZYRElCX1N3YXBDbGlwQm94KEZYX1JFQ1QmIGNsaXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmxpcFgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZsaXBZKSB7Ci0gIEZYX1JFQ1QgcmVjdDsKLSAgaWYgKGJGbGlwWSkgewotICAgIHJlY3QubGVmdCA9IGhlaWdodCAtIGNsaXAudG9wOwotICAgIHJlY3QucmlnaHQgPSBoZWlnaHQgLSBjbGlwLmJvdHRvbTsKLSAgfSBlbHNlIHsKLSAgICByZWN0LmxlZnQgPSBjbGlwLnRvcDsKLSAgICByZWN0LnJpZ2h0ID0gY2xpcC5ib3R0b207Ci0gIH0KLSAgaWYgKGJGbGlwWCkgewotICAgIHJlY3QudG9wID0gd2lkdGggLSBjbGlwLmxlZnQ7Ci0gICAgcmVjdC5ib3R0b20gPSB3aWR0aCAtIGNsaXAucmlnaHQ7Ci0gIH0gZWxzZSB7Ci0gICAgcmVjdC50b3AgPSBjbGlwLmxlZnQ7Ci0gICAgcmVjdC5ib3R0b20gPSBjbGlwLnJpZ2h0OwotICB9Ci0gIHJlY3QuTm9ybWFsaXplKCk7Ci0gIHJldHVybiByZWN0OwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBDRlhfRElCU291cmNlOjpUcmFuc2Zvcm1UbygKLSAgICBjb25zdCBDRlhfTWF0cml4KiBwRGVzdE1hdHJpeCwKLSAgICBpbnQmIHJlc3VsdF9sZWZ0LAotICAgIGludCYgcmVzdWx0X3RvcCwKLSAgICB1aW50MzJfdCBmbGFncywKLSAgICBjb25zdCBGWF9SRUNUKiBwRGVzdENsaXApIGNvbnN0IHsKLSAgQ0ZYX0ltYWdlVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIodGhpcywgcERlc3RNYXRyaXgsIGZsYWdzLCBwRGVzdENsaXApOwotICB0cmFuc2Zvcm1lci5TdGFydCgpOwotICB0cmFuc2Zvcm1lci5Db250aW51ZShudWxscHRyKTsKLSAgcmVzdWx0X2xlZnQgPSB0cmFuc2Zvcm1lci5yZXN1bHQoKS5sZWZ0OwotICByZXN1bHRfdG9wID0gdHJhbnNmb3JtZXIucmVzdWx0KCkudG9wOwotICByZXR1cm4gdHJhbnNmb3JtZXIuRGV0YWNoQml0bWFwKCk7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IENGWF9ESUJTb3VyY2U6OlN0cmV0Y2hUbygKLSAgICBpbnQgZGVzdF93aWR0aCwKLSAgICBpbnQgZGVzdF9oZWlnaHQsCi0gICAgdWludDMyX3QgZmxhZ3MsCi0gICAgY29uc3QgRlhfUkVDVCogcENsaXApIGNvbnN0IHsKLSAgRlhfUkVDVCBjbGlwX3JlY3QoMCwgMCwgRlhTWVNfYWJzKGRlc3Rfd2lkdGgpLCBGWFNZU19hYnMoZGVzdF9oZWlnaHQpKTsKLSAgaWYgKHBDbGlwKQotICAgIGNsaXBfcmVjdC5JbnRlcnNlY3QoKnBDbGlwKTsKLQotICBpZiAoY2xpcF9yZWN0LklzRW1wdHkoKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBpZiAoZGVzdF93aWR0aCA9PSBtX1dpZHRoICYmIGRlc3RfaGVpZ2h0ID09IG1fSGVpZ2h0KQotICAgIHJldHVybiBDbG9uZSgmY2xpcF9yZWN0KTsKLQotICBDRlhfQml0bWFwU3RvcmVyIHN0b3JlcjsKLSAgQ0ZYX0ltYWdlU3RyZXRjaGVyIHN0cmV0Y2hlcigmc3RvcmVyLCB0aGlzLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3JlY3QsIGZsYWdzKTsKLSAgaWYgKHN0cmV0Y2hlci5TdGFydCgpKQotICAgIHN0cmV0Y2hlci5Db250aW51ZShudWxscHRyKTsKLQotICByZXR1cm4gc3RvcmVyLkRldGFjaCgpOwotfQotCi1DRlhfSW1hZ2VUcmFuc2Zvcm1lcjo6Q0ZYX0ltYWdlVHJhbnNmb3JtZXIoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcCkKLSAgICA6IG1fcFNyYyhwU3JjKSwKLSAgICAgIG1fcE1hdHJpeChwTWF0cml4KSwKLSAgICAgIG1fcENsaXAocENsaXApLAotICAgICAgbV9GbGFncyhmbGFncyksCi0gICAgICBtX1N0YXR1cygwKSB7fQotCi1DRlhfSW1hZ2VUcmFuc2Zvcm1lcjo6fkNGWF9JbWFnZVRyYW5zZm9ybWVyKCkge30KLQotYm9vbCBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjo6U3RhcnQoKSB7Ci0gIENGWF9GbG9hdFJlY3QgdW5pdF9yZWN0ID0gbV9wTWF0cml4LT5HZXRVbml0UmVjdCgpOwotICBGWF9SRUNUIHJlc3VsdF9yZWN0ID0gdW5pdF9yZWN0LkdldENsb3Nlc3RSZWN0KCk7Ci0gIEZYX1JFQ1QgcmVzdWx0X2NsaXAgPSByZXN1bHRfcmVjdDsKLSAgaWYgKG1fcENsaXApCi0gICAgcmVzdWx0X2NsaXAuSW50ZXJzZWN0KCptX3BDbGlwKTsKLQotICBpZiAocmVzdWx0X2NsaXAuSXNFbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBtX3Jlc3VsdCA9IHJlc3VsdF9jbGlwOwotICBpZiAoRlhTWVNfZmFicyhtX3BNYXRyaXgtPmEpIDwgRlhTWVNfZmFicyhtX3BNYXRyaXgtPmIpIC8gMjAgJiYKLSAgICAgIEZYU1lTX2ZhYnMobV9wTWF0cml4LT5kKSA8IEZYU1lTX2ZhYnMobV9wTWF0cml4LT5jKSAvIDIwICYmCi0gICAgICBGWFNZU19mYWJzKG1fcE1hdHJpeC0+YSkgPCAwLjVmICYmIEZYU1lTX2ZhYnMobV9wTWF0cml4LT5kKSA8IDAuNWYpIHsKLSAgICBpbnQgZGVzdF93aWR0aCA9IHJlc3VsdF9yZWN0LldpZHRoKCk7Ci0gICAgaW50IGRlc3RfaGVpZ2h0ID0gcmVzdWx0X3JlY3QuSGVpZ2h0KCk7Ci0gICAgcmVzdWx0X2NsaXAuT2Zmc2V0KC1yZXN1bHRfcmVjdC5sZWZ0LCAtcmVzdWx0X3JlY3QudG9wKTsKLSAgICByZXN1bHRfY2xpcCA9IEZYRElCX1N3YXBDbGlwQm94KHJlc3VsdF9jbGlwLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE1hdHJpeC0+YyA+IDAsIG1fcE1hdHJpeC0+YiA8IDApOwotICAgIG1fU3RyZXRjaGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9JbWFnZVN0cmV0Y2hlcj4oCi0gICAgICAgICZtX1N0b3JlciwgbV9wU3JjLCBkZXN0X2hlaWdodCwgZGVzdF93aWR0aCwgcmVzdWx0X2NsaXAsIG1fRmxhZ3MpOwotICAgIG1fU3RyZXRjaGVyLT5TdGFydCgpOwotICAgIG1fU3RhdHVzID0gMTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoRlhTWVNfZmFicyhtX3BNYXRyaXgtPmIpIDwgRklYMTZfMDA1ICYmCi0gICAgICBGWFNZU19mYWJzKG1fcE1hdHJpeC0+YykgPCBGSVgxNl8wMDUpIHsKLSAgICBpbnQgZGVzdF93aWR0aCA9IG1fcE1hdHJpeC0+YSA+IDAgPyAoaW50KUZYU1lTX2NlaWwobV9wTWF0cml4LT5hKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChpbnQpRlhTWVNfZmxvb3IobV9wTWF0cml4LT5hKTsKLSAgICBpbnQgZGVzdF9oZWlnaHQgPSBtX3BNYXRyaXgtPmQgPiAwID8gKGludCktRlhTWVNfY2VpbChtX3BNYXRyaXgtPmQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChpbnQpLUZYU1lTX2Zsb29yKG1fcE1hdHJpeC0+ZCk7Ci0gICAgcmVzdWx0X2NsaXAuT2Zmc2V0KC1yZXN1bHRfcmVjdC5sZWZ0LCAtcmVzdWx0X3JlY3QudG9wKTsKLSAgICBtX1N0cmV0Y2hlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfSW1hZ2VTdHJldGNoZXI+KAotICAgICAgICAmbV9TdG9yZXIsIG1fcFNyYywgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIHJlc3VsdF9jbGlwLCBtX0ZsYWdzKTsKLSAgICBtX1N0cmV0Y2hlci0+U3RhcnQoKTsKLSAgICBtX1N0YXR1cyA9IDI7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaW50IHN0cmV0Y2hfd2lkdGggPSAoaW50KUZYU1lTX2NlaWwoRlhTWVNfc3FydDIobV9wTWF0cml4LT5hLCBtX3BNYXRyaXgtPmIpKTsKLSAgaW50IHN0cmV0Y2hfaGVpZ2h0ID0gKGludClGWFNZU19jZWlsKEZYU1lTX3NxcnQyKG1fcE1hdHJpeC0+YywgbV9wTWF0cml4LT5kKSk7Ci0gIENGWF9NYXRyaXggc3RyZXRjaDJkZXN0KDEuMGYsIDAuMGYsIDAuMGYsIC0xLjBmLCAwLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKHN0cmV0Y2hfaGVpZ2h0KSk7Ci0gIHN0cmV0Y2gyZGVzdC5Db25jYXQoCi0gICAgICBDRlhfTWF0cml4KG1fcE1hdHJpeC0+YSAvIHN0cmV0Y2hfd2lkdGgsIG1fcE1hdHJpeC0+YiAvIHN0cmV0Y2hfd2lkdGgsCi0gICAgICAgICAgICAgICAgIG1fcE1hdHJpeC0+YyAvIHN0cmV0Y2hfaGVpZ2h0LCBtX3BNYXRyaXgtPmQgLyBzdHJldGNoX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgbV9wTWF0cml4LT5lLCBtX3BNYXRyaXgtPmYpKTsKLSAgbV9kZXN0MnN0cmV0Y2guU2V0UmV2ZXJzZShzdHJldGNoMmRlc3QpOwotCi0gIENGWF9GbG9hdFJlY3QgY2xpcF9yZWN0X2YocmVzdWx0X2NsaXApOwotICBtX2Rlc3Qyc3RyZXRjaC5UcmFuc2Zvcm1SZWN0KGNsaXBfcmVjdF9mKTsKLSAgbV9TdHJldGNoQ2xpcCA9IGNsaXBfcmVjdF9mLkdldE91dGVyUmVjdCgpOwotICBtX1N0cmV0Y2hDbGlwLkludGVyc2VjdCgwLCAwLCBzdHJldGNoX3dpZHRoLCBzdHJldGNoX2hlaWdodCk7Ci0gIG1fU3RyZXRjaGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9JbWFnZVN0cmV0Y2hlcj4oCi0gICAgICAmbV9TdG9yZXIsIG1fcFNyYywgc3RyZXRjaF93aWR0aCwgc3RyZXRjaF9oZWlnaHQsIG1fU3RyZXRjaENsaXAsIG1fRmxhZ3MpOwotICBtX1N0cmV0Y2hlci0+U3RhcnQoKTsKLSAgbV9TdGF0dXMgPSAzOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpIHsKLSAgaWYgKG1fU3RhdHVzID09IDEpIHsKLSAgICBpZiAobV9TdHJldGNoZXItPkNvbnRpbnVlKHBQYXVzZSkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGlmIChtX1N0b3Jlci5HZXRCaXRtYXAoKSkgewotICAgICAgbV9TdG9yZXIuUmVwbGFjZSgKLSAgICAgICAgICBtX1N0b3Jlci5HZXRCaXRtYXAoKS0+U3dhcFhZKG1fcE1hdHJpeC0+YyA+IDAsIG1fcE1hdHJpeC0+YiA8IDApKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKG1fU3RhdHVzID09IDIpCi0gICAgcmV0dXJuIG1fU3RyZXRjaGVyLT5Db250aW51ZShwUGF1c2UpOwotCi0gIGlmIChtX1N0YXR1cyAhPSAzKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAobV9TdHJldGNoZXItPkNvbnRpbnVlKHBQYXVzZSkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaW50IHN0cmV0Y2hfd2lkdGggPSBtX1N0cmV0Y2hDbGlwLldpZHRoKCk7Ci0gIGludCBzdHJldGNoX2hlaWdodCA9IG1fU3RyZXRjaENsaXAuSGVpZ2h0KCk7Ci0gIGlmICghbV9TdG9yZXIuR2V0Qml0bWFwKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNvbnN0IHVpbnQ4X3QqIHN0cmV0Y2hfYnVmID0gbV9TdG9yZXIuR2V0Qml0bWFwKCktPkdldEJ1ZmZlcigpOwotICBjb25zdCB1aW50OF90KiBzdHJldGNoX2J1Zl9tYXNrID0gbnVsbHB0cjsKLSAgaWYgKG1fU3RvcmVyLkdldEJpdG1hcCgpLT5tX3BBbHBoYU1hc2spCi0gICAgc3RyZXRjaF9idWZfbWFzayA9IG1fU3RvcmVyLkdldEJpdG1hcCgpLT5tX3BBbHBoYU1hc2stPkdldEJ1ZmZlcigpOwotCi0gIGludCBzdHJldGNoX3BpdGNoID0gbV9TdG9yZXIuR2V0Qml0bWFwKCktPkdldFBpdGNoKCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IHBUcmFuc2Zvcm1lZChuZXcgQ0ZYX0RJQml0bWFwKTsKLSAgRlhESUJfRm9ybWF0IHRyYW5zZm9ybUYgPSBHZXRUcmFuc2Zvcm1lZEZvcm1hdChtX1N0cmV0Y2hlci0+c291cmNlKCkpOwotICBpZiAoIXBUcmFuc2Zvcm1lZC0+Q3JlYXRlKG1fcmVzdWx0LldpZHRoKCksIG1fcmVzdWx0LkhlaWdodCgpLCB0cmFuc2Zvcm1GKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcFRyYW5zZm9ybWVkLT5DbGVhcigwKTsKLSAgaWYgKHBUcmFuc2Zvcm1lZC0+bV9wQWxwaGFNYXNrKQotICAgIHBUcmFuc2Zvcm1lZC0+bV9wQWxwaGFNYXNrLT5DbGVhcigwKTsKLQotICBDRlhfTWF0cml4IHJlc3VsdDJzdHJldGNoKDEuMGYsIDAuMGYsIDAuMGYsIDEuMGYsIChGWF9GTE9BVCkobV9yZXN1bHQubGVmdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShtX3Jlc3VsdC50b3ApKTsKLSAgcmVzdWx0MnN0cmV0Y2guQ29uY2F0KG1fZGVzdDJzdHJldGNoKTsKLSAgcmVzdWx0MnN0cmV0Y2guVHJhbnNsYXRlKC1tX1N0cmV0Y2hDbGlwLmxlZnQsIC1tX1N0cmV0Y2hDbGlwLnRvcCk7Ci0gIGlmICghc3RyZXRjaF9idWZfbWFzayAmJiBwVHJhbnNmb3JtZWQtPm1fcEFscGhhTWFzaykgewotICAgIHBUcmFuc2Zvcm1lZC0+bV9wQWxwaGFNYXNrLT5DbGVhcigweGZmMDAwMDAwKTsKLSAgfSBlbHNlIGlmIChwVHJhbnNmb3JtZWQtPm1fcEFscGhhTWFzaykgewotICAgIGludCBzdHJldGNoX3BpdGNoX21hc2sgPSBtX1N0b3Jlci5HZXRCaXRtYXAoKS0+bV9wQWxwaGFNYXNrLT5HZXRQaXRjaCgpOwotICAgIGlmICghKG1fRmxhZ3MgJiBGWERJQl9ET1dOU0FNUExFKSAmJiAhKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSkgewotICAgICAgQ0ZYX0JpbGluZWFyTWF0cml4IHJlc3VsdDJzdHJldGNoX2ZpeChyZXN1bHQyc3RyZXRjaCwgOCk7Ci0gICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX3Jlc3VsdC5IZWlnaHQoKTsgcm93KyspIHsKLSAgICAgICAgdWludDhfdCogZGVzdF9wb3NfbWFzayA9Ci0gICAgICAgICAgICAodWludDhfdCopcFRyYW5zZm9ybWVkLT5tX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fcmVzdWx0LldpZHRoKCk7IGNvbCsrKSB7Ci0gICAgICAgICAgaW50IHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3k7Ci0gICAgICAgICAgcmVzdWx0MnN0cmV0Y2hfZml4LlRyYW5zZm9ybShjb2wsIHJvdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzX3kpOwotICAgICAgICAgIGlmIChzcmNfY29sX2wgPj0gMCAmJiBzcmNfY29sX2wgPD0gc3RyZXRjaF93aWR0aCAmJiBzcmNfcm93X2wgPj0gMCAmJgotICAgICAgICAgICAgICBzcmNfcm93X2wgPD0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPT0gc3RyZXRjaF93aWR0aCkgewotICAgICAgICAgICAgICBzcmNfY29sX2wtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfcm93X2wgPT0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgc3JjX3Jvd19sLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc3JjX2NvbF9yID0gc3JjX2NvbF9sICsgMTsKLSAgICAgICAgICAgIGludCBzcmNfcm93X3IgPSBzcmNfcm93X2wgKyAxOwotICAgICAgICAgICAgaWYgKHNyY19jb2xfciA9PSBzdHJldGNoX3dpZHRoKSB7Ci0gICAgICAgICAgICAgIHNyY19jb2xfci0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNyY19yb3dfciA9PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICBzcmNfcm93X3ItLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCByb3dfb2Zmc2V0X2wgPSBzcmNfcm93X2wgKiBzdHJldGNoX3BpdGNoX21hc2s7Ci0gICAgICAgICAgICBpbnQgcm93X29mZnNldF9yID0gc3JjX3Jvd19yICogc3RyZXRjaF9waXRjaF9tYXNrOwotICAgICAgICAgICAgKmRlc3RfcG9zX21hc2sgPQotICAgICAgICAgICAgICAgIGJpbGluZWFyX2ludGVycG9sKHN0cmV0Y2hfYnVmX21hc2ssIHJvd19vZmZzZXRfbCwgcm93X29mZnNldF9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2xfbCwgc3JjX2NvbF9yLCByZXNfeCwgcmVzX3ksIDEsIDApOwotICAgICAgICAgIH0KLSAgICAgICAgICBkZXN0X3Bvc19tYXNrKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7Ci0gICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKLSAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fcmVzdWx0LkhlaWdodCgpOyByb3crKykgewotICAgICAgICB1aW50OF90KiBkZXN0X3Bvc19tYXNrID0KLSAgICAgICAgICAgICh1aW50OF90KilwVHJhbnNmb3JtZWQtPm1fcEFscGhhTWFzay0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9yZXN1bHQuV2lkdGgoKTsgY29sKyspIHsKLSAgICAgICAgICBpbnQgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LCByZXNfeTsKLSAgICAgICAgICByZXN1bHQyc3RyZXRjaF9maXguVHJhbnNmb3JtKGNvbCwgcm93LCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNfeSk7Ci0gICAgICAgICAgaWYgKHNyY19jb2xfbCA+PSAwICYmIHNyY19jb2xfbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3dfbCA+PSAwICYmCi0gICAgICAgICAgICAgIHNyY19yb3dfbCA8PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgaW50IHBvc19waXhlbFs4XTsKLSAgICAgICAgICAgIGludCB1X3dbNF0sIHZfd1s0XTsKLSAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPT0gc3RyZXRjaF93aWR0aCkgewotICAgICAgICAgICAgICBzcmNfY29sX2wtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfcm93X2wgPT0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgc3JjX3Jvd19sLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiaWN1YmljX2dldF9wb3Nfd2VpZ2h0KHBvc19waXhlbCwgdV93LCB2X3csIHNyY19jb2xfbCwgc3JjX3Jvd19sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNfeCwgcmVzX3ksIHN0cmV0Y2hfd2lkdGgsIHN0cmV0Y2hfaGVpZ2h0KTsKLSAgICAgICAgICAgICpkZXN0X3Bvc19tYXNrID0KLSAgICAgICAgICAgICAgICBiaWN1YmljX2ludGVycG9sKHN0cmV0Y2hfYnVmX21hc2ssIHN0cmV0Y2hfcGl0Y2hfbWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc19waXhlbCwgdV93LCB2X3csIHJlc194LCByZXNfeSwgMSwgMCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRlc3RfcG9zX21hc2srKzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBDUERGX0ZpeGVkTWF0cml4IHJlc3VsdDJzdHJldGNoX2ZpeChyZXN1bHQyc3RyZXRjaCwgOCk7Ci0gICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX3Jlc3VsdC5IZWlnaHQoKTsgcm93KyspIHsKLSAgICAgICAgdWludDhfdCogZGVzdF9wb3NfbWFzayA9Ci0gICAgICAgICAgICAodWludDhfdCopcFRyYW5zZm9ybWVkLT5tX3BBbHBoYU1hc2stPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fcmVzdWx0LldpZHRoKCk7IGNvbCsrKSB7Ci0gICAgICAgICAgaW50IHNyY19jb2wsIHNyY19yb3c7Ci0gICAgICAgICAgcmVzdWx0MnN0cmV0Y2hfZml4LlRyYW5zZm9ybShjb2wsIHJvdywgc3JjX2NvbCwgc3JjX3Jvdyk7Ci0gICAgICAgICAgaWYgKHNyY19jb2wgPj0gMCAmJiBzcmNfY29sIDw9IHN0cmV0Y2hfd2lkdGggJiYgc3JjX3JvdyA+PSAwICYmCi0gICAgICAgICAgICAgIHNyY19yb3cgPD0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgIGlmIChzcmNfY29sID09IHN0cmV0Y2hfd2lkdGgpIHsKLSAgICAgICAgICAgICAgc3JjX2NvbC0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNyY19yb3cgPT0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgc3JjX3Jvdy0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKmRlc3RfcG9zX21hc2sgPQotICAgICAgICAgICAgICAgIHN0cmV0Y2hfYnVmX21hc2tbc3JjX3JvdyAqIHN0cmV0Y2hfcGl0Y2hfbWFzayArIHNyY19jb2xdOwotICAgICAgICAgIH0KLSAgICAgICAgICBkZXN0X3Bvc19tYXNrKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaWYgKG1fU3RvcmVyLkdldEJpdG1hcCgpLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgaWYgKCEobV9GbGFncyAmIEZYRElCX0RPV05TQU1QTEUpICYmICEobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpKSB7Ci0gICAgICBDRlhfQmlsaW5lYXJNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKLSAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fcmVzdWx0LkhlaWdodCgpOyByb3crKykgewotICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSAodWludDhfdCopcFRyYW5zZm9ybWVkLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX3Jlc3VsdC5XaWR0aCgpOyBjb2wrKykgewotICAgICAgICAgIGludCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsIHJlc195OwotICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc195KTsKLSAgICAgICAgICBpZiAoc3JjX2NvbF9sID49IDAgJiYgc3JjX2NvbF9sIDw9IHN0cmV0Y2hfd2lkdGggJiYgc3JjX3Jvd19sID49IDAgJiYKLSAgICAgICAgICAgICAgc3JjX3Jvd19sIDw9IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICBpZiAoc3JjX2NvbF9sID09IHN0cmV0Y2hfd2lkdGgpIHsKLSAgICAgICAgICAgICAgc3JjX2NvbF9sLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3JjX3Jvd19sID09IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgIHNyY19yb3dfbC0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHNyY19jb2xfciA9IHNyY19jb2xfbCArIDE7Ci0gICAgICAgICAgICBpbnQgc3JjX3Jvd19yID0gc3JjX3Jvd19sICsgMTsKLSAgICAgICAgICAgIGlmIChzcmNfY29sX3IgPT0gc3RyZXRjaF93aWR0aCkgewotICAgICAgICAgICAgICBzcmNfY29sX3ItLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfcm93X3IgPT0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgc3JjX3Jvd19yLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgcm93X29mZnNldF9sID0gc3JjX3Jvd19sICogc3RyZXRjaF9waXRjaDsKLSAgICAgICAgICAgIGludCByb3dfb2Zmc2V0X3IgPSBzcmNfcm93X3IgKiBzdHJldGNoX3BpdGNoOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9Ci0gICAgICAgICAgICAgICAgYmlsaW5lYXJfaW50ZXJwb2woc3RyZXRjaF9idWYsIHJvd19vZmZzZXRfbCwgcm93X29mZnNldF9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2xfbCwgc3JjX2NvbF9yLCByZXNfeCwgcmVzX3ksIDEsIDApOwotICAgICAgICAgIH0KLSAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSBpZiAobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpIHsKLSAgICAgIENGWF9CaWxpbmVhck1hdHJpeCByZXN1bHQyc3RyZXRjaF9maXgocmVzdWx0MnN0cmV0Y2gsIDgpOwotICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9yZXN1bHQuSGVpZ2h0KCk7IHJvdysrKSB7Ci0gICAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9ICh1aW50OF90KilwVHJhbnNmb3JtZWQtPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fcmVzdWx0LldpZHRoKCk7IGNvbCsrKSB7Ci0gICAgICAgICAgaW50IHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3k7Ci0gICAgICAgICAgcmVzdWx0MnN0cmV0Y2hfZml4LlRyYW5zZm9ybShjb2wsIHJvdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzX3kpOwotICAgICAgICAgIGlmIChzcmNfY29sX2wgPj0gMCAmJiBzcmNfY29sX2wgPD0gc3RyZXRjaF93aWR0aCAmJiBzcmNfcm93X2wgPj0gMCAmJgotICAgICAgICAgICAgICBzcmNfcm93X2wgPD0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgIGludCBwb3NfcGl4ZWxbOF07Ci0gICAgICAgICAgICBpbnQgdV93WzRdLCB2X3dbNF07Ci0gICAgICAgICAgICBpZiAoc3JjX2NvbF9sID09IHN0cmV0Y2hfd2lkdGgpIHsKLSAgICAgICAgICAgICAgc3JjX2NvbF9sLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3JjX3Jvd19sID09IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgIHNyY19yb3dfbC0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmljdWJpY19nZXRfcG9zX3dlaWdodChwb3NfcGl4ZWwsIHVfdywgdl93LCBzcmNfY29sX2wsIHNyY19yb3dfbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzX3gsIHJlc195LCBzdHJldGNoX3dpZHRoLCBzdHJldGNoX2hlaWdodCk7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gYmljdWJpY19pbnRlcnBvbChzdHJldGNoX2J1Ziwgc3RyZXRjaF9waXRjaCwgcG9zX3BpeGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV93LCB2X3csIHJlc194LCByZXNfeSwgMSwgMCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIENQREZfRml4ZWRNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKLSAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fcmVzdWx0LkhlaWdodCgpOyByb3crKykgewotICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4gPSAodWludDhfdCopcFRyYW5zZm9ybWVkLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX3Jlc3VsdC5XaWR0aCgpOyBjb2wrKykgewotICAgICAgICAgIGludCBzcmNfY29sLCBzcmNfcm93OwotICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2wsIHNyY19yb3cpOwotICAgICAgICAgIGlmIChzcmNfY29sID49IDAgJiYgc3JjX2NvbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3cgPj0gMCAmJgotICAgICAgICAgICAgICBzcmNfcm93IDw9IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICBpZiAoc3JjX2NvbCA9PSBzdHJldGNoX3dpZHRoKSB7Ci0gICAgICAgICAgICAgIHNyY19jb2wtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzcmNfcm93ID09IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgIHNyY19yb3ctLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19waXhlbCA9Ci0gICAgICAgICAgICAgICAgc3RyZXRjaF9idWYgKyBzdHJldGNoX3BpdGNoICogc3JjX3JvdyArIHNyY19jb2w7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gKnNyY19waXhlbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaW50IEJwcCA9IG1fU3RvcmVyLkdldEJpdG1hcCgpLT5HZXRCUFAoKSAvIDg7Ci0gICAgaWYgKEJwcCA9PSAxKSB7Ci0gICAgICB1aW50MzJfdCBhcmdiWzI1Nl07Ci0gICAgICBGWF9BUkdCKiBwUGFsID0gbV9TdG9yZXIuR2V0Qml0bWFwKCktPkdldFBhbGV0dGUoKTsKLSAgICAgIGlmIChwUGFsKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLSAgICAgICAgICBhcmdiW2ldID0gcFBhbFtpXTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1fU3RvcmVyLkdldEJpdG1hcCgpLT5Jc0NteWtJbWFnZSgpKSB7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewotICAgICAgICAgICAgYXJnYltpXSA9IDI1NSAtIGk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLSAgICAgICAgICAgIGFyZ2JbaV0gPSAweGZmMDAwMDAwIHwgKGkgKiAweDAxMDEwMSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbnQgZGVzdEJwcCA9IHBUcmFuc2Zvcm1lZC0+R2V0QlBQKCkgLyA4OwotICAgICAgaWYgKCEobV9GbGFncyAmIEZYRElCX0RPV05TQU1QTEUpICYmCi0gICAgICAgICAgIShtX0ZsYWdzICYgRlhESUJfQklDVUJJQ19JTlRFUlBPTCkpIHsKLSAgICAgICAgQ0ZYX0JpbGluZWFyTWF0cml4IHJlc3VsdDJzdHJldGNoX2ZpeChyZXN1bHQyc3RyZXRjaCwgOCk7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fcmVzdWx0LkhlaWdodCgpOyByb3crKykgewotICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gKHVpbnQ4X3QqKXBUcmFuc2Zvcm1lZC0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX3Jlc3VsdC5XaWR0aCgpOyBjb2wrKykgewotICAgICAgICAgICAgaW50IHNyY19jb2xfbCwgc3JjX3Jvd19sLCByZXNfeCwgcmVzX3k7Ci0gICAgICAgICAgICByZXN1bHQyc3RyZXRjaF9maXguVHJhbnNmb3JtKGNvbCwgcm93LCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc195KTsKLSAgICAgICAgICAgIGlmIChzcmNfY29sX2wgPj0gMCAmJiBzcmNfY29sX2wgPD0gc3RyZXRjaF93aWR0aCAmJgotICAgICAgICAgICAgICAgIHNyY19yb3dfbCA+PSAwICYmIHNyY19yb3dfbCA8PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICBpZiAoc3JjX2NvbF9sID09IHN0cmV0Y2hfd2lkdGgpIHsKLSAgICAgICAgICAgICAgICBzcmNfY29sX2wtLTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoc3JjX3Jvd19sID09IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgc3JjX3Jvd19sLS07Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaW50IHNyY19jb2xfciA9IHNyY19jb2xfbCArIDE7Ci0gICAgICAgICAgICAgIGludCBzcmNfcm93X3IgPSBzcmNfcm93X2wgKyAxOwotICAgICAgICAgICAgICBpZiAoc3JjX2NvbF9yID09IHN0cmV0Y2hfd2lkdGgpIHsKLSAgICAgICAgICAgICAgICBzcmNfY29sX3ItLTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoc3JjX3Jvd19yID09IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgc3JjX3Jvd19yLS07Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaW50IHJvd19vZmZzZXRfbCA9IHNyY19yb3dfbCAqIHN0cmV0Y2hfcGl0Y2g7Ci0gICAgICAgICAgICAgIGludCByb3dfb2Zmc2V0X3IgPSBzcmNfcm93X3IgKiBzdHJldGNoX3BpdGNoOwotICAgICAgICAgICAgICB1aW50MzJfdCByX2JncmFfY215ayA9IGFyZ2JbYmlsaW5lYXJfaW50ZXJwb2woCi0gICAgICAgICAgICAgICAgICBzdHJldGNoX2J1Ziwgcm93X29mZnNldF9sLCByb3dfb2Zmc2V0X3IsIHNyY19jb2xfbCwgc3JjX2NvbF9yLAotICAgICAgICAgICAgICAgICAgcmVzX3gsIHJlc195LCAxLCAwKV07Ci0gICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GID09IEZYRElCX1JnYmEpIHsKLSAgICAgICAgICAgICAgICBkZXN0X3Bvc1swXSA9ICh1aW50OF90KShyX2JncmFfY215ayA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgZGVzdF9wb3NbMV0gPSAodWludDhfdCkocl9iZ3JhX2NteWsgPj4gMTYpOwotICAgICAgICAgICAgICAgIGRlc3RfcG9zWzJdID0gKHVpbnQ4X3QpKHJfYmdyYV9jbXlrID4+IDgpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICoodWludDMyX3QqKWRlc3RfcG9zID0gcl9iZ3JhX2NteWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3RfcG9zICs9IGRlc3RCcHA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7Ci0gICAgICAgIENGWF9CaWxpbmVhck1hdHJpeCByZXN1bHQyc3RyZXRjaF9maXgocmVzdWx0MnN0cmV0Y2gsIDgpOwotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX3Jlc3VsdC5IZWlnaHQoKTsgcm93KyspIHsKLSAgICAgICAgICB1aW50OF90KiBkZXN0X3BvcyA9ICh1aW50OF90KilwVHJhbnNmb3JtZWQtPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9yZXN1bHQuV2lkdGgoKTsgY29sKyspIHsKLSAgICAgICAgICAgIGludCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsIHJlc195OwotICAgICAgICAgICAgcmVzdWx0MnN0cmV0Y2hfZml4LlRyYW5zZm9ybShjb2wsIHJvdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNfeSk7Ci0gICAgICAgICAgICBpZiAoc3JjX2NvbF9sID49IDAgJiYgc3JjX2NvbF9sIDw9IHN0cmV0Y2hfd2lkdGggJiYKLSAgICAgICAgICAgICAgICBzcmNfcm93X2wgPj0gMCAmJiBzcmNfcm93X2wgPD0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgaW50IHBvc19waXhlbFs4XTsKLSAgICAgICAgICAgICAgaW50IHVfd1s0XSwgdl93WzRdOwotICAgICAgICAgICAgICBpZiAoc3JjX2NvbF9sID09IHN0cmV0Y2hfd2lkdGgpIHsKLSAgICAgICAgICAgICAgICBzcmNfY29sX2wtLTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoc3JjX3Jvd19sID09IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgc3JjX3Jvd19sLS07Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYmljdWJpY19nZXRfcG9zX3dlaWdodChwb3NfcGl4ZWwsIHVfdywgdl93LCBzcmNfY29sX2wsIHNyY19yb3dfbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNfeCwgcmVzX3ksIHN0cmV0Y2hfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXRjaF9oZWlnaHQpOwotICAgICAgICAgICAgICB1aW50MzJfdCByX2JncmFfY215ayA9Ci0gICAgICAgICAgICAgICAgICBhcmdiW2JpY3ViaWNfaW50ZXJwb2woc3RyZXRjaF9idWYsIHN0cmV0Y2hfcGl0Y2gsIHBvc19waXhlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1X3csIHZfdywgcmVzX3gsIHJlc195LCAxLCAwKV07Ci0gICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GID09IEZYRElCX1JnYmEpIHsKLSAgICAgICAgICAgICAgICBkZXN0X3Bvc1swXSA9ICh1aW50OF90KShyX2JncmFfY215ayA+PiAyNCk7Ci0gICAgICAgICAgICAgICAgZGVzdF9wb3NbMV0gPSAodWludDhfdCkocl9iZ3JhX2NteWsgPj4gMTYpOwotICAgICAgICAgICAgICAgIGRlc3RfcG9zWzJdID0gKHVpbnQ4X3QpKHJfYmdyYV9jbXlrID4+IDgpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICoodWludDMyX3QqKWRlc3RfcG9zID0gcl9iZ3JhX2NteWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3RfcG9zICs9IGRlc3RCcHA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBDUERGX0ZpeGVkTWF0cml4IHJlc3VsdDJzdHJldGNoX2ZpeChyZXN1bHQyc3RyZXRjaCwgOCk7Ci0gICAgICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG1fcmVzdWx0LkhlaWdodCgpOyByb3crKykgewotICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gKHVpbnQ4X3QqKXBUcmFuc2Zvcm1lZC0+R2V0U2NhbmxpbmUocm93KTsKLSAgICAgICAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPCBtX3Jlc3VsdC5XaWR0aCgpOyBjb2wrKykgewotICAgICAgICAgICAgaW50IHNyY19jb2wsIHNyY19yb3c7Ci0gICAgICAgICAgICByZXN1bHQyc3RyZXRjaF9maXguVHJhbnNmb3JtKGNvbCwgcm93LCBzcmNfY29sLCBzcmNfcm93KTsKLSAgICAgICAgICAgIGlmIChzcmNfY29sID49IDAgJiYgc3JjX2NvbCA8PSBzdHJldGNoX3dpZHRoICYmIHNyY19yb3cgPj0gMCAmJgotICAgICAgICAgICAgICAgIHNyY19yb3cgPD0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgaWYgKHNyY19jb2wgPT0gc3RyZXRjaF93aWR0aCkgewotICAgICAgICAgICAgICAgIHNyY19jb2wtLTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoc3JjX3JvdyA9PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgIHNyY19yb3ctLTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB1aW50MzJfdCByX2JncmFfY215ayA9Ci0gICAgICAgICAgICAgICAgICBhcmdiW3N0cmV0Y2hfYnVmW3NyY19yb3cgKiBzdHJldGNoX3BpdGNoICsgc3JjX2NvbF1dOwotICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtRiA9PSBGWERJQl9SZ2JhKSB7Ci0gICAgICAgICAgICAgICAgZGVzdF9wb3NbMF0gPSAodWludDhfdCkocl9iZ3JhX2NteWsgPj4gMjQpOwotICAgICAgICAgICAgICAgIGRlc3RfcG9zWzFdID0gKHVpbnQ4X3QpKHJfYmdyYV9jbXlrID4+IDE2KTsKLSAgICAgICAgICAgICAgICBkZXN0X3Bvc1syXSA9ICh1aW50OF90KShyX2JncmFfY215ayA+PiA4KTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAqKHVpbnQzMl90KilkZXN0X3BvcyA9IHJfYmdyYV9jbXlrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXN0X3BvcyArPSBkZXN0QnBwOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBib29sIGJIYXNBbHBoYSA9IG1fU3RvcmVyLkdldEJpdG1hcCgpLT5IYXNBbHBoYSgpOwotICAgICAgaW50IGRlc3RCcHAgPSBwVHJhbnNmb3JtZWQtPkdldEJQUCgpIC8gODsKLSAgICAgIGlmICghKG1fRmxhZ3MgJiBGWERJQl9ET1dOU0FNUExFKSAmJgotICAgICAgICAgICEobV9GbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpKSB7Ci0gICAgICAgIENGWF9CaWxpbmVhck1hdHJpeCByZXN1bHQyc3RyZXRjaF9maXgocmVzdWx0MnN0cmV0Y2gsIDgpOwotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX3Jlc3VsdC5IZWlnaHQoKTsgcm93KyspIHsKLSAgICAgICAgICB1aW50OF90KiBkZXN0X3BvcyA9ICh1aW50OF90KilwVHJhbnNmb3JtZWQtPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9yZXN1bHQuV2lkdGgoKTsgY29sKyspIHsKLSAgICAgICAgICAgIGludCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsIHJlc195LCByX3Bvc19rX3IgPSAwOwotICAgICAgICAgICAgcmVzdWx0MnN0cmV0Y2hfZml4LlRyYW5zZm9ybShjb2wsIHJvdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNfeSk7Ci0gICAgICAgICAgICBpZiAoc3JjX2NvbF9sID49IDAgJiYgc3JjX2NvbF9sIDw9IHN0cmV0Y2hfd2lkdGggJiYKLSAgICAgICAgICAgICAgICBzcmNfcm93X2wgPj0gMCAmJiBzcmNfcm93X2wgPD0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgaWYgKHNyY19jb2xfbCA9PSBzdHJldGNoX3dpZHRoKSB7Ci0gICAgICAgICAgICAgICAgc3JjX2NvbF9sLS07Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKHNyY19yb3dfbCA9PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgIHNyY19yb3dfbC0tOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGludCBzcmNfY29sX3IgPSBzcmNfY29sX2wgKyAxOwotICAgICAgICAgICAgICBpbnQgc3JjX3Jvd19yID0gc3JjX3Jvd19sICsgMTsKLSAgICAgICAgICAgICAgaWYgKHNyY19jb2xfciA9PSBzdHJldGNoX3dpZHRoKSB7Ci0gICAgICAgICAgICAgICAgc3JjX2NvbF9yLS07Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKHNyY19yb3dfciA9PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICAgIHNyY19yb3dfci0tOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGludCByb3dfb2Zmc2V0X2wgPSBzcmNfcm93X2wgKiBzdHJldGNoX3BpdGNoOwotICAgICAgICAgICAgICBpbnQgcm93X29mZnNldF9yID0gc3JjX3Jvd19yICogc3RyZXRjaF9waXRjaDsKLSAgICAgICAgICAgICAgdWludDhfdCByX3Bvc19yZWRfeV9yID0KLSAgICAgICAgICAgICAgICAgIGJpbGluZWFyX2ludGVycG9sKHN0cmV0Y2hfYnVmLCByb3dfb2Zmc2V0X2wsIHJvd19vZmZzZXRfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2xfbCwgc3JjX2NvbF9yLCByZXNfeCwgcmVzX3ksIEJwcCwgMik7Ci0gICAgICAgICAgICAgIHVpbnQ4X3Qgcl9wb3NfZ3JlZW5fbV9yID0KLSAgICAgICAgICAgICAgICAgIGJpbGluZWFyX2ludGVycG9sKHN0cmV0Y2hfYnVmLCByb3dfb2Zmc2V0X2wsIHJvd19vZmZzZXRfciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2xfbCwgc3JjX2NvbF9yLCByZXNfeCwgcmVzX3ksIEJwcCwgMSk7Ci0gICAgICAgICAgICAgIHVpbnQ4X3Qgcl9wb3NfYmx1ZV9jX3IgPQotICAgICAgICAgICAgICAgICAgYmlsaW5lYXJfaW50ZXJwb2woc3RyZXRjaF9idWYsIHJvd19vZmZzZXRfbCwgcm93X29mZnNldF9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2NvbF9sLCBzcmNfY29sX3IsIHJlc194LCByZXNfeSwgQnBwLCAwKTsKLSAgICAgICAgICAgICAgaWYgKGJIYXNBbHBoYSkgewotICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GICE9IEZYRElCX0FyZ2IpIHsKLSAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GID09IEZYRElCX1JnYmEpIHsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3NbMF0gPSByX3Bvc19ibHVlX2NfcjsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3NbMV0gPSByX3Bvc19ncmVlbl9tX3I7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzJdID0gcl9wb3NfcmVkX3lfcjsKLSAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJfcG9zX2tfciA9IGJpbGluZWFyX2ludGVycG9sKAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXRjaF9idWYsIHJvd19vZmZzZXRfbCwgcm93X29mZnNldF9yLCBzcmNfY29sX2wsCi0gICAgICAgICAgICAgICAgICAgICAgICBzcmNfY29sX3IsIHJlc194LCByZXNfeSwgQnBwLCAzKTsKLSAgICAgICAgICAgICAgICAgICAgKih1aW50MzJfdCopZGVzdF9wb3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgRlhDTVlLX1RPRElCKENteWtFbmNvZGUocl9wb3NfYmx1ZV9jX3IsIHJfcG9zX2dyZWVuX21fciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfcG9zX3JlZF95X3IsIHJfcG9zX2tfcikpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICB1aW50OF90IHJfcG9zX2FfciA9IGJpbGluZWFyX2ludGVycG9sKAotICAgICAgICAgICAgICAgICAgICAgIHN0cmV0Y2hfYnVmLCByb3dfb2Zmc2V0X2wsIHJvd19vZmZzZXRfciwgc3JjX2NvbF9sLAotICAgICAgICAgICAgICAgICAgICAgIHNyY19jb2xfciwgcmVzX3gsIHJlc195LCBCcHAsIDMpOwotICAgICAgICAgICAgICAgICAgKih1aW50MzJfdCopZGVzdF9wb3MgPSBGWEFSR0JfVE9ESUIoCi0gICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX01BS0Uocl9wb3NfYV9yLCByX3Bvc19yZWRfeV9yLCByX3Bvc19ncmVlbl9tX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9wb3NfYmx1ZV9jX3IpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcl9wb3Nfa19yID0gMHhmZjsKLSAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtRiA9PSBGWERJQl9DbXlrYSkgewotICAgICAgICAgICAgICAgICAgcl9wb3Nfa19yID0gYmlsaW5lYXJfaW50ZXJwb2woCi0gICAgICAgICAgICAgICAgICAgICAgc3RyZXRjaF9idWYsIHJvd19vZmZzZXRfbCwgcm93X29mZnNldF9yLCBzcmNfY29sX2wsCi0gICAgICAgICAgICAgICAgICAgICAgc3JjX2NvbF9yLCByZXNfeCwgcmVzX3ksIEJwcCwgMyk7Ci0gICAgICAgICAgICAgICAgICAqKHVpbnQzMl90KilkZXN0X3BvcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgRlhDTVlLX1RPRElCKENteWtFbmNvZGUocl9wb3NfYmx1ZV9jX3IsIHJfcG9zX2dyZWVuX21fciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX3Bvc19yZWRfeV9yLCByX3Bvc19rX3IpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgKih1aW50MzJfdCopZGVzdF9wb3MgPSBGWEFSR0JfVE9ESUIoCi0gICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX01BS0Uocl9wb3Nfa19yLCByX3Bvc19yZWRfeV9yLCByX3Bvc19ncmVlbl9tX3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9wb3NfYmx1ZV9jX3IpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc3RfcG9zICs9IGRlc3RCcHA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKG1fRmxhZ3MgJiBGWERJQl9CSUNVQklDX0lOVEVSUE9MKSB7Ci0gICAgICAgIENGWF9CaWxpbmVhck1hdHJpeCByZXN1bHQyc3RyZXRjaF9maXgocmVzdWx0MnN0cmV0Y2gsIDgpOwotICAgICAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBtX3Jlc3VsdC5IZWlnaHQoKTsgcm93KyspIHsKLSAgICAgICAgICB1aW50OF90KiBkZXN0X3BvcyA9ICh1aW50OF90KilwVHJhbnNmb3JtZWQtPkdldFNjYW5saW5lKHJvdyk7Ci0gICAgICAgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDwgbV9yZXN1bHQuV2lkdGgoKTsgY29sKyspIHsKLSAgICAgICAgICAgIGludCBzcmNfY29sX2wsIHNyY19yb3dfbCwgcmVzX3gsIHJlc195LCByX3Bvc19rX3IgPSAwOwotICAgICAgICAgICAgcmVzdWx0MnN0cmV0Y2hfZml4LlRyYW5zZm9ybShjb2wsIHJvdywgc3JjX2NvbF9sLCBzcmNfcm93X2wsIHJlc194LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNfeSk7Ci0gICAgICAgICAgICBpZiAoc3JjX2NvbF9sID49IDAgJiYgc3JjX2NvbF9sIDw9IHN0cmV0Y2hfd2lkdGggJiYKLSAgICAgICAgICAgICAgICBzcmNfcm93X2wgPj0gMCAmJiBzcmNfcm93X2wgPD0gc3RyZXRjaF9oZWlnaHQpIHsKLSAgICAgICAgICAgICAgaW50IHBvc19waXhlbFs4XTsKLSAgICAgICAgICAgICAgaW50IHVfd1s0XSwgdl93WzRdOwotICAgICAgICAgICAgICBpZiAoc3JjX2NvbF9sID09IHN0cmV0Y2hfd2lkdGgpIHsKLSAgICAgICAgICAgICAgICBzcmNfY29sX2wtLTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBpZiAoc3JjX3Jvd19sID09IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgc3JjX3Jvd19sLS07Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYmljdWJpY19nZXRfcG9zX3dlaWdodChwb3NfcGl4ZWwsIHVfdywgdl93LCBzcmNfY29sX2wsIHNyY19yb3dfbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNfeCwgcmVzX3ksIHN0cmV0Y2hfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXRjaF9oZWlnaHQpOwotICAgICAgICAgICAgICB1aW50OF90IHJfcG9zX3JlZF95X3IgPQotICAgICAgICAgICAgICAgICAgYmljdWJpY19pbnRlcnBvbChzdHJldGNoX2J1Ziwgc3RyZXRjaF9waXRjaCwgcG9zX3BpeGVsLCB1X3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfdywgcmVzX3gsIHJlc195LCBCcHAsIDIpOwotICAgICAgICAgICAgICB1aW50OF90IHJfcG9zX2dyZWVuX21fciA9Ci0gICAgICAgICAgICAgICAgICBiaWN1YmljX2ludGVycG9sKHN0cmV0Y2hfYnVmLCBzdHJldGNoX3BpdGNoLCBwb3NfcGl4ZWwsIHVfdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl93LCByZXNfeCwgcmVzX3ksIEJwcCwgMSk7Ci0gICAgICAgICAgICAgIHVpbnQ4X3Qgcl9wb3NfYmx1ZV9jX3IgPQotICAgICAgICAgICAgICAgICAgYmljdWJpY19pbnRlcnBvbChzdHJldGNoX2J1Ziwgc3RyZXRjaF9waXRjaCwgcG9zX3BpeGVsLCB1X3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZfdywgcmVzX3gsIHJlc195LCBCcHAsIDApOwotICAgICAgICAgICAgICBpZiAoYkhhc0FscGhhKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUYgIT0gRlhESUJfQXJnYikgewotICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUYgPT0gRlhESUJfUmdiYSkgewotICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc1swXSA9IHJfcG9zX2JsdWVfY19yOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc1sxXSA9IHJfcG9zX2dyZWVuX21fcjsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3NbMl0gPSByX3Bvc19yZWRfeV9yOwotICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcl9wb3Nfa19yID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJpY3ViaWNfaW50ZXJwb2woc3RyZXRjaF9idWYsIHN0cmV0Y2hfcGl0Y2gsIHBvc19waXhlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV93LCB2X3csIHJlc194LCByZXNfeSwgQnBwLCAzKTsKLSAgICAgICAgICAgICAgICAgICAgKih1aW50MzJfdCopZGVzdF9wb3MgPQotICAgICAgICAgICAgICAgICAgICAgICAgRlhDTVlLX1RPRElCKENteWtFbmNvZGUocl9wb3NfYmx1ZV9jX3IsIHJfcG9zX2dyZWVuX21fciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfcG9zX3JlZF95X3IsIHJfcG9zX2tfcikpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICB1aW50OF90IHJfcG9zX2FfciA9Ci0gICAgICAgICAgICAgICAgICAgICAgYmljdWJpY19pbnRlcnBvbChzdHJldGNoX2J1Ziwgc3RyZXRjaF9waXRjaCwgcG9zX3BpeGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV93LCB2X3csIHJlc194LCByZXNfeSwgQnBwLCAzKTsKLSAgICAgICAgICAgICAgICAgICoodWludDMyX3QqKWRlc3RfcG9zID0gRlhBUkdCX1RPRElCKAotICAgICAgICAgICAgICAgICAgICAgIEZYQVJHQl9NQUtFKHJfcG9zX2Ffciwgcl9wb3NfcmVkX3lfciwgcl9wb3NfZ3JlZW5fbV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfcG9zX2JsdWVfY19yKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJfcG9zX2tfciA9IDB4ZmY7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUYgPT0gRlhESUJfQ215a2EpIHsKLSAgICAgICAgICAgICAgICAgIHJfcG9zX2tfciA9Ci0gICAgICAgICAgICAgICAgICAgICAgYmljdWJpY19pbnRlcnBvbChzdHJldGNoX2J1Ziwgc3RyZXRjaF9waXRjaCwgcG9zX3BpeGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdV93LCB2X3csIHJlc194LCByZXNfeSwgQnBwLCAzKTsKLSAgICAgICAgICAgICAgICAgICoodWludDMyX3QqKWRlc3RfcG9zID0KLSAgICAgICAgICAgICAgICAgICAgICBGWENNWUtfVE9ESUIoQ215a0VuY29kZShyX3Bvc19ibHVlX2Nfciwgcl9wb3NfZ3JlZW5fbV9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfcG9zX3JlZF95X3IsIHJfcG9zX2tfcikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAqKHVpbnQzMl90KilkZXN0X3BvcyA9IEZYQVJHQl9UT0RJQigKLSAgICAgICAgICAgICAgICAgICAgICBGWEFSR0JfTUFLRShyX3Bvc19rX3IsIHJfcG9zX3JlZF95X3IsIHJfcG9zX2dyZWVuX21fciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX3Bvc19ibHVlX2NfcikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9wb3MgKz0gZGVzdEJwcDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIENQREZfRml4ZWRNYXRyaXggcmVzdWx0MnN0cmV0Y2hfZml4KHJlc3VsdDJzdHJldGNoLCA4KTsKLSAgICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgbV9yZXN1bHQuSGVpZ2h0KCk7IHJvdysrKSB7Ci0gICAgICAgICAgdWludDhfdCogZGVzdF9wb3MgPSAodWludDhfdCopcFRyYW5zZm9ybWVkLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgICAgIGZvciAoaW50IGNvbCA9IDA7IGNvbCA8IG1fcmVzdWx0LldpZHRoKCk7IGNvbCsrKSB7Ci0gICAgICAgICAgICBpbnQgc3JjX2NvbCwgc3JjX3JvdzsKLSAgICAgICAgICAgIHJlc3VsdDJzdHJldGNoX2ZpeC5UcmFuc2Zvcm0oY29sLCByb3csIHNyY19jb2wsIHNyY19yb3cpOwotICAgICAgICAgICAgaWYgKHNyY19jb2wgPj0gMCAmJiBzcmNfY29sIDw9IHN0cmV0Y2hfd2lkdGggJiYgc3JjX3JvdyA+PSAwICYmCi0gICAgICAgICAgICAgICAgc3JjX3JvdyA8PSBzdHJldGNoX2hlaWdodCkgewotICAgICAgICAgICAgICBpZiAoc3JjX2NvbCA9PSBzdHJldGNoX3dpZHRoKSB7Ci0gICAgICAgICAgICAgICAgc3JjX2NvbC0tOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChzcmNfcm93ID09IHN0cmV0Y2hfaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgc3JjX3Jvdy0tOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19wb3MgPQotICAgICAgICAgICAgICAgICAgc3RyZXRjaF9idWYgKyBzcmNfcm93ICogc3RyZXRjaF9waXRjaCArIHNyY19jb2wgKiBCcHA7Ci0gICAgICAgICAgICAgIGlmIChiSGFzQWxwaGEpIHsKLSAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtRiAhPSBGWERJQl9BcmdiKSB7Ci0gICAgICAgICAgICAgICAgICBpZiAodHJhbnNmb3JtRiA9PSBGWERJQl9SZ2JhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RfcG9zWzBdID0gc3JjX3Bvc1swXTsKLSAgICAgICAgICAgICAgICAgICAgZGVzdF9wb3NbMV0gPSBzcmNfcG9zWzFdOwotICAgICAgICAgICAgICAgICAgICBkZXN0X3Bvc1syXSA9IHNyY19wb3NbMl07Ci0gICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAqKHVpbnQzMl90KilkZXN0X3BvcyA9IEZYQ01ZS19UT0RJQihDbXlrRW5jb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3Bvc1swXSwgc3JjX3Bvc1sxXSwgc3JjX3Bvc1syXSwgc3JjX3Bvc1szXSkpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAqKHVpbnQzMl90KilkZXN0X3BvcyA9IEZYQVJHQl9UT0RJQihGWEFSR0JfTUFLRSgKLSAgICAgICAgICAgICAgICAgICAgICBzcmNfcG9zWzNdLCBzcmNfcG9zWzJdLCBzcmNfcG9zWzFdLCBzcmNfcG9zWzBdKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1GID09IEZYRElCX0NteWthKSB7Ci0gICAgICAgICAgICAgICAgICAqKHVpbnQzMl90KilkZXN0X3BvcyA9IEZYQ01ZS19UT0RJQihDbXlrRW5jb2RlKAotICAgICAgICAgICAgICAgICAgICAgIHNyY19wb3NbMF0sIHNyY19wb3NbMV0sIHNyY19wb3NbMl0sIHNyY19wb3NbM10pKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgKih1aW50MzJfdCopZGVzdF9wb3MgPSBGWEFSR0JfVE9ESUIoCi0gICAgICAgICAgICAgICAgICAgICAgRlhBUkdCX01BS0UoMHhmZiwgc3JjX3Bvc1syXSwgc3JjX3Bvc1sxXSwgc3JjX3Bvc1swXSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzdF9wb3MgKz0gZGVzdEJwcDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgbV9TdG9yZXIuUmVwbGFjZShzdGQ6Om1vdmUocFRyYW5zZm9ybWVkKSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gQ0ZYX0ltYWdlVHJhbnNmb3JtZXI6OkRldGFjaEJpdG1hcCgpIHsKLSAgcmV0dXJuIG1fU3RvcmVyLkRldGFjaCgpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2RpYi9pZnhfc2NhbmxpbmVjb21wb3Nlci5oIGIvY29yZS9meGdlL2RpYi9pZnhfc2NhbmxpbmVjb21wb3Nlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMDcwYzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL2Z4Z2UvZGliL2lmeF9zY2FubGluZWNvbXBvc2VyLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIENPUkVfRlhHRV9ESUJfSUZYX1NDQU5MSU5FQ09NUE9TRVJfSF8KKyNkZWZpbmUgQ09SRV9GWEdFX0RJQl9JRlhfU0NBTkxJTkVDT01QT1NFUl9IXworCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorCitjbGFzcyBJRlhfU2NhbmxpbmVDb21wb3NlciB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JRlhfU2NhbmxpbmVDb21wb3NlcigpIHt9CisKKyAgdmlydHVhbCB2b2lkIENvbXBvc2VTY2FubGluZShpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FubGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FuX2V4dHJhX2FscGhhKSA9IDA7CisKKyAgdmlydHVhbCBib29sIFNldEluZm8oaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9Gb3JtYXQgc3JjX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIHBTcmNQYWxldHRlKSA9IDA7Cit9OworCisjZW5kaWYgIC8vIENPUkVfRlhHRV9ESUJfSUZYX1NDQU5MSU5FQ09NUE9TRVJfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9mcmVldHlwZS9ERVBTIGIvY29yZS9meGdlL2ZyZWV0eXBlL0RFUFMKaW5kZXggMjY1NDZmNy4uYTk0MmMyNyAxMDA2NDQKLS0tIGEvY29yZS9meGdlL2ZyZWV0eXBlL0RFUFMKKysrIGIvY29yZS9meGdlL2ZyZWV0eXBlL0RFUFMKQEAgLTEsMyArMSw0IEBACiBpbmNsdWRlX3J1bGVzID0gWwotICAnK3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYycKKyAgJyt0aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlJywKKyAgJyt0aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc3JjJywKIF0KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9mcmVldHlwZS9meF9mcmVldHlwZS5jcHAgYi9jb3JlL2Z4Z2UvZnJlZXR5cGUvZnhfZnJlZXR5cGUuY3BwCmluZGV4IDZhYTU5ZmUuLmIwZjU2YWIgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhnZS9mcmVldHlwZS9meF9mcmVldHlwZS5jcHAKKysrIGIvY29yZS9meGdlL2ZyZWV0eXBlL2Z4X2ZyZWV0eXBlLmNwcApAQCAtNiw3ICs2LDcgQEAKIAogI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mcmVldHlwZS5oIgogCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzbmFtZXMvcHN0YWJsZXMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL3BzdGFibGVzLmgiCiAKIHN0YXRpYyBpbnQgeHlxX3NlYXJjaF9ub2RlKGNoYXIqIGdseXBoX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmFtZV9vZmZzZXQsCmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZnhfZGliLmggYi9jb3JlL2Z4Z2UvZnhfZGliLmgKaW5kZXggMTRiZTA1Zi4uZjc2MjZhZiAxMDA2NDQKLS0tIGEvY29yZS9meGdlL2Z4X2RpYi5oCisrKyBiL2NvcmUvZnhnZS9meF9kaWIuaApAQCAtNyw1MyArNyw1NiBAQAogI2lmbmRlZiBDT1JFX0ZYR0VfRlhfRElCX0hfCiAjZGVmaW5lIENPUkVfRlhHRV9GWF9ESUJfSF8KIAotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dXRpbGl0eT4KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3NoYXJlZF9jb3B5X29uX3dyaXRlLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3dpZGVzdHJpbmcuaCIKIAogZW51bSBGWERJQl9Gb3JtYXQgewogICBGWERJQl9JbnZhbGlkID0gMCwKLSAgRlhESUJfMWJwcE1hc2sgPSAweDEwMSwKICAgRlhESUJfMWJwcFJnYiA9IDB4MDAxLAotICBGWERJQl8xYnBwQ215ayA9IDB4NDAxLAotICBGWERJQl84YnBwTWFzayA9IDB4MTA4LAogICBGWERJQl84YnBwUmdiID0gMHgwMDgsCi0gIEZYRElCXzhicHBSZ2JhID0gMHgyMDgsCi0gIEZYRElCXzhicHBDbXlrID0gMHg0MDgsCi0gIEZYRElCXzhicHBDbXlrYSA9IDB4NjA4LAogICBGWERJQl9SZ2IgPSAweDAxOCwKLSAgRlhESUJfUmdiYSA9IDB4MjE4LAogICBGWERJQl9SZ2IzMiA9IDB4MDIwLAorICBGWERJQl8xYnBwTWFzayA9IDB4MTAxLAorICBGWERJQl84YnBwTWFzayA9IDB4MTA4LAorICBGWERJQl84YnBwUmdiYSA9IDB4MjA4LAorICBGWERJQl9SZ2JhID0gMHgyMTgsCiAgIEZYRElCX0FyZ2IgPSAweDIyMCwKKyAgRlhESUJfMWJwcENteWsgPSAweDQwMSwKKyAgRlhESUJfOGJwcENteWsgPSAweDQwOCwKICAgRlhESUJfQ215ayA9IDB4NDIwLAorICBGWERJQl84YnBwQ215a2EgPSAweDYwOCwKICAgRlhESUJfQ215a2EgPSAweDYyMCwKIH07CiAKLWVudW0gRlhESUJfQ2hhbm5lbCB7Ci0gIEZYRElCX1JlZCA9IDEsCi0gIEZYRElCX0dyZWVuLAotICBGWERJQl9CbHVlLAotICBGWERJQl9DeWFuLAotICBGWERJQl9NYWdlbnRhLAotICBGWERJQl9ZZWxsb3csCi0gIEZYRElCX0JsYWNrLAotICBGWERJQl9BbHBoYQorc3RydWN0IFBpeGVsV2VpZ2h0IHsKKyAgaW50IG1fU3JjU3RhcnQ7CisgIGludCBtX1NyY0VuZDsKKyAgaW50IG1fV2VpZ2h0c1sxXTsKIH07CiAKK3R5cGVkZWYgdWludDMyX3QgRlhfQVJHQjsKK3R5cGVkZWYgdWludDMyX3QgRlhfQ09MT1JSRUY7Cit0eXBlZGVmIHVpbnQzMl90IEZYX0NNWUs7CitjbGFzcyBDRlhfQ2xpcFJnbjsKK2NsYXNzIENGWF9ESUJTb3VyY2U7CitjbGFzcyBDU3RyZXRjaEVuZ2luZTsKKworZXh0ZXJuIGNvbnN0IGludDE2X3QgU0RQX1RhYmxlWzUxM107CisKICNkZWZpbmUgRlhESUJfRE9XTlNBTVBMRSAweDA0CiAjZGVmaW5lIEZYRElCX0lOVEVSUE9MIDB4MjAKICNkZWZpbmUgRlhESUJfQklDVUJJQ19JTlRFUlBPTCAweDgwCiAjZGVmaW5lIEZYRElCX05PU01PT1RIIDB4MTAwCisKICNkZWZpbmUgRlhESUJfQkxFTkRfTk9STUFMIDAKICNkZWZpbmUgRlhESUJfQkxFTkRfTVVMVElQTFkgMQogI2RlZmluZSBGWERJQl9CTEVORF9TQ1JFRU4gMgogI2RlZmluZSBGWERJQl9CTEVORF9PVkVSTEFZIDMKICNkZWZpbmUgRlhESUJfQkxFTkRfREFSS0VOIDQKICNkZWZpbmUgRlhESUJfQkxFTkRfTElHSFRFTiA1Ci0KICNkZWZpbmUgRlhESUJfQkxFTkRfQ09MT1JET0RHRSA2CiAjZGVmaW5lIEZYRElCX0JMRU5EX0NPTE9SQlVSTiA3CiAjZGVmaW5lIEZYRElCX0JMRU5EX0hBUkRMSUdIVCA4CkBAIC02NiwzNCArNjksMzQgQEAKICNkZWZpbmUgRlhESUJfQkxFTkRfQ09MT1IgMjMKICNkZWZpbmUgRlhESUJfQkxFTkRfTFVNSU5PU0lUWSAyNAogI2RlZmluZSBGWERJQl9CTEVORF9VTlNVUFBPUlRFRCAtMQotdHlwZWRlZiB1aW50MzJfdCBGWF9BUkdCOwotdHlwZWRlZiB1aW50MzJfdCBGWF9DT0xPUlJFRjsKLXR5cGVkZWYgdWludDMyX3QgRlhfQ01ZSzsKLWNsYXNzIENGWF9DbGlwUmduOwotY2xhc3MgQ0ZYX0RJQlNvdXJjZTsKLWNsYXNzIENGWF9ESUJpdG1hcDsKLWNsYXNzIENTdHJldGNoRW5naW5lOwogCiAjZGVmaW5lIEZYU1lTX1JHQihyLCBnLCBiKSAoKHIpIHwgKChnKSA8PCA4KSB8ICgoYikgPDwgMTYpKQogI2RlZmluZSBGWFNZU19HZXRSVmFsdWUocmdiKSAoKHJnYikmMHhmZikKICNkZWZpbmUgRlhTWVNfR2V0R1ZhbHVlKHJnYikgKCgocmdiKSA+PiA4KSAmIDB4ZmYpCiAjZGVmaW5lIEZYU1lTX0dldEJWYWx1ZShyZ2IpICgoKHJnYikgPj4gMTYpICYgMHhmZikKLSNkZWZpbmUgRlhfQ0NPTE9SKHZhbCkgKDI1NSAtICh2YWwpKQotI2RlZmluZSBGWFNZU19DTVlLKGMsIG0sIHksIGspICgoKGMpIDw8IDI0KSB8ICgobSkgPDwgMTYpIHwgKCh5KSA8PCA4KSB8IChrKSkKKwogI2RlZmluZSBGWFNZU19HZXRDVmFsdWUoY215aykgKCh1aW50OF90KSgoY215aykgPj4gMjQpICYgMHhmZikKICNkZWZpbmUgRlhTWVNfR2V0TVZhbHVlKGNteWspICgodWludDhfdCkoKGNteWspID4+IDE2KSAmIDB4ZmYpCiAjZGVmaW5lIEZYU1lTX0dldFlWYWx1ZShjbXlrKSAoKHVpbnQ4X3QpKChjbXlrKSA+PiA4KSAmIDB4ZmYpCiAjZGVmaW5lIEZYU1lTX0dldEtWYWx1ZShjbXlrKSAoKHVpbnQ4X3QpKGNteWspJjB4ZmYpCi12b2lkIENteWtEZWNvZGUoRlhfQ01ZSyBjbXlrLCBpbnQmIGMsIGludCYgbSwgaW50JiB5LCBpbnQmIGspOworCiBpbmxpbmUgRlhfQ01ZSyBDbXlrRW5jb2RlKGludCBjLCBpbnQgbSwgaW50IHksIGludCBrKSB7CiAgIHJldHVybiAoYyA8PCAyNCkgfCAobSA8PCAxNikgfCAoeSA8PCA4KSB8IGs7CiB9Ci12b2lkIEFyZ2JEZWNvZGUoRlhfQVJHQiBhcmdiLCBpbnQmIGEsIGludCYgciwgaW50JiBnLCBpbnQmIGIpOwotdm9pZCBBcmdiRGVjb2RlKEZYX0FSR0IgYXJnYiwgaW50JiBhLCBGWF9DT0xPUlJFRiYgcmdiKTsKKworLy8gUmV0dXJucyB0dXBsZSBhLCByLCBnLCBiCitzdGQ6OnR1cGxlPGludCwgaW50LCBpbnQsIGludD4gQXJnYkRlY29kZShGWF9BUkdCIGFyZ2IpOworCisvLyBSZXR1cm5zIHBhaXIgYSwgcmdiCitzdGQ6OnBhaXI8aW50LCBGWF9DT0xPUlJFRj4gQXJnYlRvQ29sb3JSZWYoRlhfQVJHQiBhcmdiKTsKKwogaW5saW5lIEZYX0FSR0IgQXJnYkVuY29kZShpbnQgYSwgaW50IHIsIGludCBnLCBpbnQgYikgewogICByZXR1cm4gKGEgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiOwogfQogRlhfQVJHQiBBcmdiRW5jb2RlKGludCBhLCBGWF9DT0xPUlJFRiByZ2IpOworCitGWF9BUkdCIFN0cmluZ1RvRlhBUkdCKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB2aWV3KTsKKwogI2RlZmluZSBGWEFSR0JfQShhcmdiKSAoKHVpbnQ4X3QpKChhcmdiKSA+PiAyNCkpCiAjZGVmaW5lIEZYQVJHQl9SKGFyZ2IpICgodWludDhfdCkoKGFyZ2IpID4+IDE2KSkKICNkZWZpbmUgRlhBUkdCX0coYXJnYikgKCh1aW50OF90KSgoYXJnYikgPj4gOCkpCkBAIC0xMDIsMjEgKzEwNSwxMCBAQAogICAoKCh1aW50MzJfdCkoYSkgPDwgMjQpIHwgKChyKSA8PCAxNikgfCAoKGcpIDw8IDgpIHwgKGIpKQogI2RlZmluZSBGWEFSR0JfTVVMX0FMUEhBKGFyZ2IsIGFscGhhKSBcCiAgICgoKCgoYXJnYikgPj4gMjQpICogKGFscGhhKSAvIDI1NSkgPDwgMjQpIHwgKChhcmdiKSYweGZmZmZmZikpCisKICNkZWZpbmUgRlhSR0IyR1JBWShyLCBnLCBiKSAoKChiKSoxMSArIChnKSo1OSArIChyKSozMCkgLyAxMDApCi0jZGVmaW5lIEZYQ01ZSzJHUkFZKGMsIG0sIHksIGspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAoKCgyNTUgLSAoYykpICogKDI1NSAtIChrKSkgKiAzMCArICgyNTUgLSAobSkpICogKDI1NSAtIChrKSkgKiA1OSArIFwKLSAgICAoMjU1IC0gKHkpKSAqICgyNTUgLSAoaykpICogMTEpIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAyNTUwMCkKICNkZWZpbmUgRlhESUJfQUxQSEFfTUVSR0UoYmFja2Ryb3AsIHNvdXJjZSwgc291cmNlX2FscGhhKSBcCiAgICgoKGJhY2tkcm9wKSAqICgyNTUgLSAoc291cmNlX2FscGhhKSkgKyAoc291cmNlKSAqIChzb3VyY2VfYWxwaGEpKSAvIDI1NSkKLSNkZWZpbmUgRlhESUJfQUxQSEFfVU5JT04oZGVzdCwgc3JjKSAoKGRlc3QpICsgKHNyYykgLSAoZGVzdCkgKiAoc3JjKSAvIDI1NSkKLSNkZWZpbmUgRlhDTVlLX0dFVERJQihwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgKCgoKHVpbnQ4X3QqKShwKSlbMF0gPDwgMjQgfCAoKCh1aW50OF90KikocCkpWzFdIDw8IDE2KSB8IFwKLSAgICAoKCh1aW50OF90KikocCkpWzJdIDw8IDgpIHwgKCh1aW50OF90KikocCkpWzNdKSkKLSNkZWZpbmUgRlhDTVlLX1NFVERJQihwLCBjbXlrKSAgKCh1aW50OF90KikocCkpWzBdID0gKHVpbnQ4X3QpKChjbXlrKSA+PiAyNCksIFwKLSAgICAgICAgKCh1aW50OF90KikocCkpWzFdID0gKHVpbnQ4X3QpKChjbXlrKSA+PiAxNiksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodWludDhfdCopKHApKVsyXSA9ICh1aW50OF90KSgoY215aykgPj4gOCksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50OF90KikocCkpWzNdID0gKHVpbnQ4X3QpKGNteWspKQogI2RlZmluZSBGWEFSR0JfR0VURElCKHApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAoKCgodWludDhfdCopKHApKVswXSkgfCAoKCh1aW50OF90KikocCkpWzFdIDw8IDgpIHwgXAogICAgKCgodWludDhfdCopKHApKVsyXSA8PCAxNikgfCAoKCh1aW50OF90KikocCkpWzNdIDw8IDI0KSkKQEAgLTEyNSwyOSArMTE3LDExIEBACiAgICgodWludDhfdCopKHApKVsxXSA9ICh1aW50OF90KSgoYXJnYikgPj4gOCksICBcCiAgICgodWludDhfdCopKHApKVsyXSA9ICh1aW50OF90KSgoYXJnYikgPj4gMTYpLCBcCiAgICgodWludDhfdCopKHApKVszXSA9ICh1aW50OF90KSgoYXJnYikgPj4gMjQpCi0jZGVmaW5lIEZYQVJHQl9DT1BZKGRlc3QsIHNyYykgICAgICAgICAgICAgICAgICAgICAgXAotICAqKHVpbnQ4X3QqKShkZXN0KSA9ICoodWludDhfdCopKHNyYyksICAgICAgICAgICAgIFwKLSAgKigodWludDhfdCopKGRlc3QpICsgMSkgPSAqKCh1aW50OF90Kikoc3JjKSArIDEpLCBcCi0gICooKHVpbnQ4X3QqKShkZXN0KSArIDIpID0gKigodWludDhfdCopKHNyYykgKyAyKSwgXAotICAqKCh1aW50OF90KikoZGVzdCkgKyAzKSA9ICooKHVpbnQ4X3QqKShzcmMpICsgMykKLSNkZWZpbmUgRlhDTVlLX0NPUFkoZGVzdCwgc3JjKSAgICAgICAgICAgICAgICAgICAgICBcCi0gICoodWludDhfdCopKGRlc3QpID0gKih1aW50OF90Kikoc3JjKSwgICAgICAgICAgICAgXAotICAqKCh1aW50OF90KikoZGVzdCkgKyAxKSA9ICooKHVpbnQ4X3QqKShzcmMpICsgMSksIFwKLSAgKigodWludDhfdCopKGRlc3QpICsgMikgPSAqKCh1aW50OF90Kikoc3JjKSArIDIpLCBcCi0gICooKHVpbnQ4X3QqKShkZXN0KSArIDMpID0gKigodWludDhfdCopKHNyYykgKyAzKQogI2RlZmluZSBGWEFSR0JfU0VUUkdCT1JERVJESUIocCwgYXJnYikgICAgICAgICAgXAogICAoKHVpbnQ4X3QqKShwKSlbM10gPSAodWludDhfdCkoYXJnYiA+PiAyNCksICAgXAogICAoKHVpbnQ4X3QqKShwKSlbMF0gPSAodWludDhfdCkoKGFyZ2IpID4+IDE2KSwgXAogICAoKHVpbnQ4X3QqKShwKSlbMV0gPSAodWludDhfdCkoKGFyZ2IpID4+IDgpLCAgXAogICAoKHVpbnQ4X3QqKShwKSlbMl0gPSAodWludDhfdCkoYXJnYikKLSNkZWZpbmUgRlhBUkdCX0dFVFJHQk9SREVSRElCKHApICAgICAgICAgICAgICAgICAgICAgXAotICAoKCh1aW50OF90KikocCkpWzJdKSB8ICgoKHVpbnQ4X3QqKShwKSlbMV0gPDwgOCkgfCBcCi0gICAgICAoKCh1aW50OF90KikocCkpWzBdIDw8IDE2KSB8ICgoKHVpbnQ4X3QqKShwKSlbM10gPDwgMjQpCi0jZGVmaW5lIEZYQVJHQl9SR0JPUkRFUkNPUFkoZGVzdCwgc3JjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAqKCh1aW50OF90KikoZGVzdCkgKyAzKSA9ICooKHVpbnQ4X3QqKShzcmMpICsgMyksICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgKih1aW50OF90KikoZGVzdCkgPSAqKCh1aW50OF90Kikoc3JjKSArIDIpLCAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICooKHVpbnQ4X3QqKShkZXN0KSArIDEpID0gKigodWludDhfdCopKHNyYykgKyAxKSwgXAotICAgICAgICAgICAgICAgICAgICAgICAqKCh1aW50OF90KikoZGVzdCkgKyAyKSA9ICooKHVpbnQ4X3QqKShzcmMpKQogI2RlZmluZSBGWEFSR0JfVE9ESUIoYXJnYikgKGFyZ2IpCiAjZGVmaW5lIEZYQ01ZS19UT0RJQihjbXlrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgKCh1aW50OF90KSgoY215aykgPj4gMjQpIHwgKCh1aW50OF90KSgoY215aykgPj4gMTYpKSA8PCA4IHwgXApAQCAtMTU1LDU0MyArMTI5LDExIEBACiAjZGVmaW5lIEZYQVJHQl9UT0JHUk9SREVSRElCKGFyZ2IpICAgICAgICAgICAgICAgICAgICAgICBcCiAgICgodWludDhfdCkoYXJnYiA+PiAxNikgfCAoKHVpbnQ4X3QpKGFyZ2IgPj4gOCkpIDw8IDggfCBcCiAgICAoKHVpbnQ4X3QpKGFyZ2IpKSA8PCAxNiB8ICgodWludDhfdCkoYXJnYiA+PiAyNCkgPDwgMjQpKQotI2RlZmluZSBGWEdFVEZMQUdfQ09MT1JUWVBFKGZsYWcpICh1aW50OF90KSgoZmxhZykgPj4gOCkKLSNkZWZpbmUgRlhHRVRGTEFHX0FMUEhBX0ZJTEwoZmxhZykgKHVpbnQ4X3QpKGZsYWcpCiAKLWJvb2wgQ29udmVydEJ1ZmZlcihGWERJQl9Gb3JtYXQgZGVzdF9mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9idWYsCi0gICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKLSAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCi0gICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQzMl90LCBGeEZyZWVEZWxldGVyPiogcGFsKTsKLQotY2xhc3MgQ0ZYX0RJQlNvdXJjZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5DRlhfRElCU291cmNlKCk7Ci0KLSAgdmlydHVhbCB1aW50OF90KiBHZXRCdWZmZXIoKSBjb25zdDsKLSAgdmlydHVhbCBjb25zdCB1aW50OF90KiBHZXRTY2FubGluZShpbnQgbGluZSkgY29uc3QgPSAwOwotICB2aXJ0dWFsIGJvb2wgU2tpcFRvU2NhbmxpbmUoaW50IGxpbmUsIElGWF9QYXVzZSogcFBhdXNlKSBjb25zdDsKLSAgdmlydHVhbCB2b2lkIERvd25TYW1wbGVTY2FubGluZShpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfYnBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZsaXBYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfd2lkdGgpIGNvbnN0ID0gMDsKLQotICBpbnQgR2V0V2lkdGgoKSBjb25zdCB7IHJldHVybiBtX1dpZHRoOyB9Ci0gIGludCBHZXRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtX0hlaWdodDsgfQotCi0gIEZYRElCX0Zvcm1hdCBHZXRGb3JtYXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChGWERJQl9Gb3JtYXQpKG1fQWxwaGFGbGFnICogMHgxMDAgKyBtX2JwcCk7Ci0gIH0KLSAgdWludDMyX3QgR2V0UGl0Y2goKSBjb25zdCB7IHJldHVybiBtX1BpdGNoOyB9Ci0gIHVpbnQzMl90KiBHZXRQYWxldHRlKCkgY29uc3QgeyByZXR1cm4gbV9wUGFsZXR0ZS5nZXQoKTsgfQotICBpbnQgR2V0QlBQKCkgY29uc3QgeyByZXR1cm4gbV9icHA7IH0KLQotICAvLyBUT0RPKHRoZXN0aWcpOiBJbnZlc3RpZ2F0ZSB0aGlzLiBHaXZlbiB0aGUgcG9zc2libGUgdmFsdWVzIG9mIEZYRElCX0Zvcm1hdCwKLSAgLy8gaXQgZmVlbHMgYXMgdGhvdWdoIHRoaXMgc2hvdWxkIGJlIGltcGxlbWVudGVkIGFzICEhKG1fQWxwaGFGbGFnICYgMSkgYW5kCi0gIC8vIElzT3BhcXVlSW1hZ2UoKSBiZWxvdyBzaG91bGQgbmV2ZXIgYmUgYWJsZSB0byByZXR1cm4gdHJ1ZS4KLSAgYm9vbCBJc0FscGhhTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1fQWxwaGFGbGFnID09IDE7IH0KLSAgYm9vbCBIYXNBbHBoYSgpIGNvbnN0IHsgcmV0dXJuICEhKG1fQWxwaGFGbGFnICYgMik7IH0KLSAgYm9vbCBJc09wYXF1ZUltYWdlKCkgY29uc3QgeyByZXR1cm4gIShtX0FscGhhRmxhZyAmIDMpOyB9Ci0gIGJvb2wgSXNDbXlrSW1hZ2UoKSBjb25zdCB7IHJldHVybiAhIShtX0FscGhhRmxhZyAmIDQpOyB9Ci0KLSAgaW50IEdldFBhbGV0dGVTaXplKCkgY29uc3QgewotICAgIHJldHVybiBJc0FscGhhTWFzaygpID8gMCA6IChtX2JwcCA9PSAxID8gMiA6IChtX2JwcCA9PSA4ID8gMjU2IDogMCkpOwotICB9Ci0KLSAgdWludDMyX3QgR2V0UGFsZXR0ZUVudHJ5KGludCBpbmRleCkgY29uc3Q7Ci0KLSAgdm9pZCBTZXRQYWxldHRlRW50cnkoaW50IGluZGV4LCB1aW50MzJfdCBjb2xvcik7Ci0gIHVpbnQzMl90IEdldFBhbGV0dGVBcmdiKGludCBpbmRleCkgY29uc3QgeyByZXR1cm4gR2V0UGFsZXR0ZUVudHJ5KGluZGV4KTsgfQotICB2b2lkIFNldFBhbGV0dGVBcmdiKGludCBpbmRleCwgdWludDMyX3QgY29sb3IpIHsKLSAgICBTZXRQYWxldHRlRW50cnkoaW5kZXgsIGNvbG9yKTsKLSAgfQotCi0gIC8vIENvcGllcyBpbnRvIGludGVybmFsbHktb3duZWQgcGFsZXR0ZS4KLSAgdm9pZCBTZXRQYWxldHRlKGNvbnN0IHVpbnQzMl90KiBwU3JjUGFsKTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBDbG9uZShjb25zdCBGWF9SRUNUKiBwQ2xpcCA9IG51bGxwdHIpIGNvbnN0OwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBDbG9uZUNvbnZlcnQoRlhESUJfRm9ybWF0IGZvcm1hdCkgY29uc3Q7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IFN0cmV0Y2hUbyhpbnQgZGVzdF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IFRyYW5zZm9ybVRvKAotICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgIGludCYgbGVmdCwKLSAgICAgIGludCYgdG9wLAotICAgICAgdWludDMyX3QgZmxhZ3MgPSAwLAotICAgICAgY29uc3QgRlhfUkVDVCogcENsaXAgPSBudWxscHRyKSBjb25zdDsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gU3dhcFhZKGJvb2wgYlhGbGlwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiWUZsaXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcCA9IG51bGxwdHIpIGNvbnN0OwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBGbGlwSW1hZ2UoYm9vbCBiWEZsaXAsIGJvb2wgYllGbGlwKSBjb25zdDsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBDbG9uZUFscGhhTWFzaygKLSAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwID0gbnVsbHB0cikgY29uc3Q7Ci0KLSAgLy8gQ29waWVzIGludG8gaW50ZXJuYWxseS1vd25lZCBtYXNrLgotICBib29sIFNldEFscGhhTWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQWxwaGFNYXNrLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcCA9IG51bGxwdHIpOwotCi0KLSAgdm9pZCBHZXRPdmVybGFwUmVjdChpbnQmIGRlc3RfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQmIGRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgIGludCYgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgaW50JiBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQmIHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgIGludCYgc3JjX3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24pOwotCi0jaWYgZGVmaW5lZCBfU0tJQV9TVVBQT1JUXyB8fCBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfUEFUSFNfCi0gIHZvaWQgRGVidWdWZXJpZnlCaXRtYXBJc1ByZU11bHRpcGxpZWQodm9pZCogYnVmZmVyID0gbnVsbHB0cikgY29uc3Q7Ci0jZW5kaWYKLQotICBDRlhfRElCaXRtYXAqIG1fcEFscGhhTWFzazsKLQotIHByb3RlY3RlZDoKLSAgQ0ZYX0RJQlNvdXJjZSgpOwotCi0gIHZvaWQgQnVpbGRQYWxldHRlKCk7Ci0gIGJvb2wgQnVpbGRBbHBoYU1hc2soKTsKLSAgaW50IEZpbmRQYWxldHRlKHVpbnQzMl90IGNvbG9yKSBjb25zdDsKLSAgdm9pZCBHZXRQYWxldHRlKHVpbnQzMl90KiBwYWwsIGludCBhbHBoYSkgY29uc3Q7Ci0KLSAgaW50IG1fV2lkdGg7Ci0gIGludCBtX0hlaWdodDsKLSAgaW50IG1fYnBwOwotICB1aW50MzJfdCBtX0FscGhhRmxhZzsKLSAgdWludDMyX3QgbV9QaXRjaDsKLSAgLy8gVE9ETyh3ZWlsaSk6IFVzZSBzdGQ6OnZlY3RvciBmb3IgdGhpcy4KLSAgc3RkOjp1bmlxdWVfcHRyPHVpbnQzMl90LCBGeEZyZWVEZWxldGVyPiBtX3BQYWxldHRlOwotfTsKLQotY2xhc3MgQ0ZYX0RJQml0bWFwIDogcHVibGljIENGWF9ESUJTb3VyY2UgewotIHB1YmxpYzoKLSAgQ0ZYX0RJQml0bWFwKCk7Ci0gIGV4cGxpY2l0IENGWF9ESUJpdG1hcChjb25zdCBDRlhfRElCaXRtYXAmIHNyYyk7Ci0gIH5DRlhfRElCaXRtYXAoKSBvdmVycmlkZTsKLQotICBib29sIENyZWF0ZShpbnQgd2lkdGgsCi0gICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgIHVpbnQ4X3QqIHBCdWZmZXIgPSBudWxscHRyLAotICAgICAgICAgICAgICBpbnQgcGl0Y2ggPSAwKTsKLQotICBib29sIENvcHkoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYyk7Ci0KLSAgLy8gQ0ZYX0RJQlNvdXJjZQotICB1aW50OF90KiBHZXRCdWZmZXIoKSBjb25zdCBvdmVycmlkZTsKLSAgY29uc3QgdWludDhfdCogR2V0U2NhbmxpbmUoaW50IGxpbmUpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIERvd25TYW1wbGVTY2FubGluZShpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9icHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAorRlhfUkVDVCBGWERJQl9Td2FwQ2xpcEJveChGWF9SRUNUJiBjbGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZsaXBYLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF9sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2xpcF93aWR0aCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBUYWtlT3ZlcihDRlhfRElCaXRtYXAqIHBTcmNCaXRtYXApOwotCi0gIGJvb2wgQ29udmVydEZvcm1hdChGWERJQl9Gb3JtYXQgZm9ybWF0KTsKLQotICB2b2lkIENsZWFyKHVpbnQzMl90IGNvbG9yKTsKLQotICB1aW50MzJfdCBHZXRQaXhlbChpbnQgeCwgaW50IHkpIGNvbnN0OwotCi0gIHZvaWQgU2V0UGl4ZWwoaW50IHgsIGludCB5LCB1aW50MzJfdCBjb2xvcik7Ci0KLSAgYm9vbCBMb2FkQ2hhbm5lbChGWERJQl9DaGFubmVsIGRlc3RDaGFubmVsLAotICAgICAgICAgICAgICAgICAgIENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgRlhESUJfQ2hhbm5lbCBzcmNDaGFubmVsKTsKLQotICBib29sIExvYWRDaGFubmVsKEZYRElCX0NoYW5uZWwgZGVzdENoYW5uZWwsIGludCB2YWx1ZSk7Ci0KLSAgYm9vbCBNdWx0aXBseUFscGhhKGludCBhbHBoYSk7Ci0KLSAgYm9vbCBNdWx0aXBseUFscGhhKENGWF9ESUJTb3VyY2UqIHBBbHBoYU1hc2spOwotCi0gIGJvb2wgVHJhbnNmZXJCaXRtYXAoaW50IGRlc3RfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyY0JpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3ApOwotCi0gIGJvb2wgQ29tcG9zaXRlQml0bWFwKGludCBkZXN0X2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU3JjQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NsaXBSZ24qIHBDbGlwUmduID0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmdiQnl0ZU9yZGVyID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBudWxscHRyKTsKLQotICBib29sIFRyYW5zZmVyTWFzayhpbnQgZGVzdF9sZWZ0LAotICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCi0gICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcE1hc2ssCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yLAotICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgIGludCBzcmNfdG9wLAotICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBudWxscHRyKTsKLQotICBib29sIENvbXBvc2l0ZU1hc2soaW50IGRlc3RfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwTWFzaywKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgaW50IHNyY190b3AsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSA9IEZYRElCX0JMRU5EX05PUk1BTCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiA9IG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICBib29sIGJSZ2JCeXRlT3JkZXIgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKLSAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBudWxscHRyKTsKLQotICBib29sIENvbXBvc2l0ZVJlY3QoaW50IGRlc3RfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKLSAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBudWxscHRyKTsKLQotICBib29sIENvbnZlcnRDb2xvclNjYWxlKHVpbnQzMl90IGZvcmVjb2xvciwgdWludDMyX3QgYmFja2NvbG9yKTsKLQotI2lmIGRlZmluZWQgX1NLSUFfU1VQUE9SVF8gfHwgX1NLSUFfU1VQUE9SVF9QQVRIU18KLSAgdm9pZCBQcmVNdWx0aXBseSgpOwotI2VuZGlmCi0jaWYgZGVmaW5lZCBfU0tJQV9TVVBQT1JUX1BBVEhTXwotICB2b2lkIFVuUHJlTXVsdGlwbHkoKTsKLSNlbmRpZgotCi0gcHJvdGVjdGVkOgotICBib29sIEdldEdyYXlEYXRhKHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBudWxscHRyKTsKLQotI2lmIGRlZmluZWQgX1NLSUFfU1VQUE9SVF9QQVRIU18KLSAgZW51bSBjbGFzcyBGb3JtYXQgeyBrQ2xlYXJlZCwga1ByZU11bHRpcGxpZWQsIGtVblByZU11bHRpcGxpZWQgfTsKLSNlbmRpZgotCi0gIHVpbnQ4X3QqIG1fcEJ1ZmZlcjsKLSNpZiBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfUEFUSFNfCi0gIEZvcm1hdCBtX25Gb3JtYXQ7Ci0jZW5kaWYKLSAgYm9vbCBtX2JFeHRCdWY7Ci19OwotCi1jbGFzcyBDRlhfRElCRXh0cmFjdG9yIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENGWF9ESUJFeHRyYWN0b3IoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNyYyk7Ci0gIH5DRlhfRElCRXh0cmFjdG9yKCk7Ci0KLSAgQ0ZYX0RJQml0bWFwKiBHZXRCaXRtYXAoKSB7IHJldHVybiBtX3BCaXRtYXAuZ2V0KCk7IH0KLQotIHByaXZhdGU6Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IG1fcEJpdG1hcDsKLX07Ci0KLXR5cGVkZWYgQ0ZYX1NoYXJlZENvcHlPbldyaXRlPENGWF9ESUJpdG1hcD4gQ0ZYX0RJQml0bWFwUmVmOwotCi1jbGFzcyBDRlhfRmlsdGVyZWRESUIgOiBwdWJsaWMgQ0ZYX0RJQlNvdXJjZSB7Ci0gcHVibGljOgotICBDRlhfRmlsdGVyZWRESUIoKTsKLSAgfkNGWF9GaWx0ZXJlZERJQigpIG92ZXJyaWRlOwotCi0gIHZvaWQgTG9hZFNyYyhjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLCBib29sIGJBdXRvRHJvcFNyYyA9IGZhbHNlKTsKLQotICB2aXJ0dWFsIEZYRElCX0Zvcm1hdCBHZXREZXN0Rm9ybWF0KCkgPSAwOwotCi0gIHZpcnR1YWwgdWludDMyX3QqIEdldERlc3RQYWxldHRlKCkgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBUcmFuc2xhdGVTY2FubGluZShjb25zdCB1aW50OF90KiBzcmNfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGRlc3RfYnVmKSBjb25zdCA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIFRyYW5zbGF0ZURvd25TYW1wbGVzKHVpbnQ4X3QqIGRlc3RfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQnBwKSBjb25zdCA9IDA7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8vIENGWF9ESUJTb3VyY2UKLSAgY29uc3QgdWludDhfdCogR2V0U2NhbmxpbmUoaW50IGxpbmUpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIERvd25TYW1wbGVTY2FubGluZShpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9icHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGbGlwWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfd2lkdGgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIGNvbnN0IENGWF9ESUJTb3VyY2UqIG1fcFNyYzsKLSAgYm9vbCBtX2JBdXRvRHJvcFNyYzsKLSAgbXV0YWJsZSBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtX1NjYW5saW5lOwotfTsKLQotY2xhc3MgSUZYX1NjYW5saW5lQ29tcG9zZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+SUZYX1NjYW5saW5lQ29tcG9zZXIoKSB7fQotCi0gIHZpcnR1YWwgdm9pZCBDb21wb3NlU2NhbmxpbmUoaW50IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2NhbmxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2Nhbl9leHRyYV9hbHBoYSA9IG51bGxwdHIpID0gMDsKLQotICB2aXJ0dWFsIGJvb2wgU2V0SW5mbyhpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcFNyY1BhbGV0dGUpID0gMDsKLX07Ci0KLWNsYXNzIENGWF9TY2FubGluZUNvbXBvc2l0b3IgewotIHB1YmxpYzoKLSAgQ0ZYX1NjYW5saW5lQ29tcG9zaXRvcigpOwotCi0gIH5DRlhfU2NhbmxpbmVDb21wb3NpdG9yKCk7Ci0KLSAgYm9vbCBJbml0KEZYRElCX0Zvcm1hdCBkZXN0X2Zvcm1hdCwKLSAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LAotICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwKLSAgICAgICAgICAgIHVpbnQzMl90KiBwU3JjUGFsZXR0ZSwKLSAgICAgICAgICAgIHVpbnQzMl90IG1hc2tfY29sb3IsCi0gICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSwKLSAgICAgICAgICAgIGJvb2wgYkNsaXAsCi0gICAgICAgICAgICBib29sIGJSZ2JCeXRlT3JkZXIgPSBmYWxzZSwKLSAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKLSAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBudWxscHRyKTsKLQotICB2b2lkIENvbXBvc2l0ZVJnYkJpdG1hcExpbmUodWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjbGlwX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfZXh0cmFfYWxwaGEgPSBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0X2V4dHJhX2FscGhhID0gbnVsbHB0cik7Ci0KLSAgdm9pZCBDb21wb3NpdGVQYWxCaXRtYXBMaW5lKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX2V4dHJhX2FscGhhID0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdF9leHRyYV9hbHBoYSA9IG51bGxwdHIpOwotCi0gIHZvaWQgQ29tcG9zaXRlQnl0ZU1hc2tMaW5lKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3RfZXh0cmFfYWxwaGEgPSBudWxscHRyKTsKLQotICB2b2lkIENvbXBvc2l0ZUJpdE1hc2tMaW5lKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNsaXBfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3RfZXh0cmFfYWxwaGEgPSBudWxscHRyKTsKLQotIHByb3RlY3RlZDoKLSAgaW50IG1fVHJhbnNwYXJlbmN5OwotICBGWERJQl9Gb3JtYXQgbV9TcmNGb3JtYXQsIG1fRGVzdEZvcm1hdDsKLSAgdWludDMyX3QqIG1fcFNyY1BhbGV0dGU7Ci0KLSAgaW50IG1fTWFza0FscGhhLCBtX01hc2tSZWQsIG1fTWFza0dyZWVuLCBtX01hc2tCbHVlLCBtX01hc2tCbGFjazsKLSAgaW50IG1fQmxlbmRUeXBlOwotICB2b2lkKiBtX3BJY2NUcmFuc2Zvcm07Ci0gIHVpbnQ4X3QqIG1fcENhY2hlU2NhbmxpbmU7Ci0gIGludCBtX0NhY2hlU2l6ZTsKLSAgYm9vbCBtX2JSZ2JCeXRlT3JkZXI7Ci19OwotCi1jbGFzcyBDRlhfQml0bWFwQ29tcG9zZXIgOiBwdWJsaWMgSUZYX1NjYW5saW5lQ29tcG9zZXIgewotIHB1YmxpYzoKLSAgQ0ZYX0JpdG1hcENvbXBvc2VyKCk7Ci0gIH5DRlhfQml0bWFwQ29tcG9zZXIoKSBvdmVycmlkZTsKLQotICB2b2lkIENvbXBvc2UoQ0ZYX0RJQml0bWFwKiBwRGVzdCwKLSAgICAgICAgICAgICAgIGNvbnN0IENGWF9DbGlwUmduKiBwQ2xpcFJnbiwKLSAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCi0gICAgICAgICAgICAgICB1aW50MzJfdCBtYXNrX2NvbG9yLAotICAgICAgICAgICAgICAgRlhfUkVDVCYgZGVzdF9yZWN0LAotICAgICAgICAgICAgICAgYm9vbCBiVmVydGljYWwsCi0gICAgICAgICAgICAgICBib29sIGJGbGlwWCwKLSAgICAgICAgICAgICAgIGJvb2wgYkZsaXBZLAotICAgICAgICAgICAgICAgYm9vbCBiUmdiQnl0ZU9yZGVyID0gZmFsc2UsCi0gICAgICAgICAgICAgICBpbnQgYWxwaGFfZmxhZyA9IDAsCi0gICAgICAgICAgICAgICB2b2lkKiBwSWNjVHJhbnNmb3JtID0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKLQotICAvLyBJRlhfU2NhbmxpbmVDb21wb3NlcgotICBib29sIFNldEluZm8oaW50IHdpZHRoLAotICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LAotICAgICAgICAgICAgICAgdWludDMyX3QqIHBTcmNQYWxldHRlKSBvdmVycmlkZTsKLQotICB2b2lkIENvbXBvc2VTY2FubGluZShpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2NhbmxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5fZXh0cmFfYWxwaGEpIG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICB2b2lkIERvQ29tcG9zZSh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19zY2FuLAotICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKLSAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmNfZXh0cmFfYWxwaGEgPSBudWxscHRyLAotICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3RfZXh0cmFfYWxwaGEgPSBudWxscHRyKTsKLSAgQ0ZYX0RJQml0bWFwKiBtX3BCaXRtYXA7Ci0gIGNvbnN0IENGWF9DbGlwUmduKiBtX3BDbGlwUmduOwotICBGWERJQl9Gb3JtYXQgbV9TcmNGb3JtYXQ7Ci0gIGludCBtX0Rlc3RMZWZ0LCBtX0Rlc3RUb3AsIG1fRGVzdFdpZHRoLCBtX0Rlc3RIZWlnaHQsIG1fQml0bWFwQWxwaGE7Ci0gIHVpbnQzMl90IG1fTWFza0NvbG9yOwotICBjb25zdCBDRlhfRElCaXRtYXAqIG1fcENsaXBNYXNrOwotICBDRlhfU2NhbmxpbmVDb21wb3NpdG9yIG1fQ29tcG9zaXRvcjsKLSAgYm9vbCBtX2JWZXJ0aWNhbCwgbV9iRmxpcFgsIG1fYkZsaXBZOwotICBpbnQgbV9BbHBoYUZsYWc7Ci0gIHZvaWQqIG1fcEljY1RyYW5zZm9ybTsKLSAgYm9vbCBtX2JSZ2JCeXRlT3JkZXI7Ci0gIGludCBtX0JsZW5kVHlwZTsKLSAgdm9pZCBDb21wb3NlU2NhbmxpbmVWKGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2NhbmxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzY2FuX2V4dHJhX2FscGhhID0gbnVsbHB0cik7Ci0gIHVpbnQ4X3QqIG1fcFNjYW5saW5lVjsKLSAgdWludDhfdCogbV9wQ2xpcFNjYW5WOwotICB1aW50OF90KiBtX3BBZGRDbGlwU2NhbjsKLSAgdWludDhfdCogbV9wU2NhbmxpbmVBbHBoYVY7Ci19OwotCi1jbGFzcyBDRlhfQml0bWFwU3RvcmVyIDogcHVibGljIElGWF9TY2FubGluZUNvbXBvc2VyIHsKLSBwdWJsaWM6Ci0gIENGWF9CaXRtYXBTdG9yZXIoKTsKLSAgfkNGWF9CaXRtYXBTdG9yZXIoKSBvdmVycmlkZTsKLQotICAvLyBJRlhfU2NhbmxpbmVDb21wb3NlcgotICB2b2lkIENvbXBvc2VTY2FubGluZShpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2NhbmxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNjYW5fZXh0cmFfYWxwaGEpIG92ZXJyaWRlOwotICBib29sIFNldEluZm8oaW50IHdpZHRoLAotICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBzcmNfZm9ybWF0LAotICAgICAgICAgICAgICAgdWludDMyX3QqIHBTcmNQYWxldHRlKSBvdmVycmlkZTsKLQotICBDRlhfRElCaXRtYXAqIEdldEJpdG1hcCgpIHsgcmV0dXJuIG1fcEJpdG1hcC5nZXQoKTsgfQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBEZXRhY2goKTsKLSAgdm9pZCBSZXBsYWNlKHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IHBCaXRtYXApOwotCi0gcHJpdmF0ZToKLSAgc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gbV9wQml0bWFwOwotfTsKLQotY2xhc3MgQ0ZYX0ltYWdlU3RyZXRjaGVyIHsKLSBwdWJsaWM6Ci0gIENGWF9JbWFnZVN0cmV0Y2hlcihJRlhfU2NhbmxpbmVDb21wb3NlciogcERlc3QsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUJiBiaXRtYXBfcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKLSAgfkNGWF9JbWFnZVN0cmV0Y2hlcigpOwotCi0gIGJvb2wgU3RhcnQoKTsKLSAgYm9vbCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7Ci0KLSAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogc291cmNlKCkgeyByZXR1cm4gbV9wU291cmNlOyB9Ci0KLSBwcml2YXRlOgotICBib29sIFN0YXJ0UXVpY2tTdHJldGNoKCk7Ci0gIGJvb2wgU3RhcnRTdHJldGNoKCk7Ci0gIGJvb2wgQ29udGludWVRdWlja1N0cmV0Y2goSUZYX1BhdXNlKiBwUGF1c2UpOwotICBib29sIENvbnRpbnVlU3RyZXRjaChJRlhfUGF1c2UqIHBQYXVzZSk7Ci0KLSAgSUZYX1NjYW5saW5lQ29tcG9zZXIqIGNvbnN0IG1fcERlc3Q7Ci0gIGNvbnN0IENGWF9ESUJTb3VyY2UqIGNvbnN0IG1fcFNvdXJjZTsKLSAgc3RkOjp1bmlxdWVfcHRyPENTdHJldGNoRW5naW5lPiBtX3BTdHJldGNoRW5naW5lOwotICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4gbV9wU2NhbmxpbmU7Ci0gIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90LCBGeEZyZWVEZWxldGVyPiBtX3BNYXNrU2NhbmxpbmU7Ci0gIGNvbnN0IHVpbnQzMl90IG1fRmxhZ3M7Ci0gIGJvb2wgbV9iRmxpcFg7Ci0gIGJvb2wgbV9iRmxpcFk7Ci0gIGludCBtX0Rlc3RXaWR0aDsKLSAgaW50IG1fRGVzdEhlaWdodDsKLSAgRlhfUkVDVCBtX0NsaXBSZWN0OwotICBjb25zdCBGWERJQl9Gb3JtYXQgbV9EZXN0Rm9ybWF0OwotICBjb25zdCBpbnQgbV9EZXN0QlBQOwotICBpbnQgbV9MaW5lSW5kZXg7Ci19OwotCi1jbGFzcyBDRlhfSW1hZ2VUcmFuc2Zvcm1lciB7Ci0gcHVibGljOgotICBDRlhfSW1hZ2VUcmFuc2Zvcm1lcihjb25zdCBDRlhfRElCU291cmNlKiBwU3JjLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwKTsKLSAgfkNGWF9JbWFnZVRyYW5zZm9ybWVyKCk7Ci0KLSAgYm9vbCBTdGFydCgpOwotICBib29sIENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKLQotICBjb25zdCBGWF9SRUNUJiByZXN1bHQoKSBjb25zdCB7IHJldHVybiBtX3Jlc3VsdDsgfQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBEZXRhY2hCaXRtYXAoKTsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IENGWF9ESUJTb3VyY2UqIGNvbnN0IG1fcFNyYzsKLSAgY29uc3QgQ0ZYX01hdHJpeCogY29uc3QgbV9wTWF0cml4OwotICBjb25zdCBGWF9SRUNUKiBjb25zdCBtX3BDbGlwOwotICBGWF9SRUNUIG1fU3RyZXRjaENsaXA7Ci0gIEZYX1JFQ1QgbV9yZXN1bHQ7Ci0gIENGWF9NYXRyaXggbV9kZXN0MnN0cmV0Y2g7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfSW1hZ2VTdHJldGNoZXI+IG1fU3RyZXRjaGVyOwotICBDRlhfQml0bWFwU3RvcmVyIG1fU3RvcmVyOwotICBjb25zdCB1aW50MzJfdCBtX0ZsYWdzOwotICBpbnQgbV9TdGF0dXM7Ci19OwotCi1jbGFzcyBDRlhfSW1hZ2VSZW5kZXJlciB7Ci0gcHVibGljOgotICBDRlhfSW1hZ2VSZW5kZXJlcigpOwotICB+Q0ZYX0ltYWdlUmVuZGVyZXIoKTsKLQotICBib29sIFN0YXJ0KENGWF9ESUJpdG1hcCogcERldmljZSwKLSAgICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCi0gICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwKLSAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAotICAgICAgICAgICAgIHVpbnQzMl90IG1hc2tfY29sb3IsCi0gICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICB1aW50MzJfdCBkaWJfZmxhZ3MsCi0gICAgICAgICAgICAgYm9vbCBiUmdiQnl0ZU9yZGVyID0gZmFsc2UsCi0gICAgICAgICAgICAgaW50IGFscGhhX2ZsYWcgPSAwLAotICAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBudWxscHRyLAotICAgICAgICAgICAgIGludCBibGVuZF90eXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKLQotICBib29sIENvbnRpbnVlKElGWF9QYXVzZSogcFBhdXNlKTsKLQotIHByb3RlY3RlZDoKLSAgQ0ZYX0RJQml0bWFwKiBtX3BEZXZpY2U7Ci0gIGNvbnN0IENGWF9DbGlwUmduKiBtX3BDbGlwUmduOwotICBpbnQgbV9CaXRtYXBBbHBoYTsKLSAgdWludDMyX3QgbV9NYXNrQ29sb3I7Ci0gIENGWF9NYXRyaXggbV9NYXRyaXg7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfSW1hZ2VUcmFuc2Zvcm1lcj4gbV9wVHJhbnNmb3JtZXI7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfSW1hZ2VTdHJldGNoZXI+IG1fU3RyZXRjaGVyOwotICBDRlhfQml0bWFwQ29tcG9zZXIgbV9Db21wb3NlcjsKLSAgaW50IG1fU3RhdHVzOwotICBGWF9SRUNUIG1fQ2xpcEJveDsKLSAgdWludDMyX3QgbV9GbGFnczsKLSAgaW50IG1fQWxwaGFGbGFnOwotICB2b2lkKiBtX3BJY2NUcmFuc2Zvcm07Ci0gIGJvb2wgbV9iUmdiQnl0ZU9yZGVyOwotICBpbnQgbV9CbGVuZFR5cGU7Ci19OworICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGbGlwWSk7CiAKICNlbmRpZiAgLy8gQ09SRV9GWEdFX0ZYX0RJQl9IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2Z4X2ZvbnQuaCBiL2NvcmUvZnhnZS9meF9mb250LmgKaW5kZXggMDczOTJmYS4uYzYxNzM3NiAxMDA2NDQKLS0tIGEvY29yZS9meGdlL2Z4X2ZvbnQuaAorKysgYi9jb3JlL2Z4Z2UvZnhfZm9udC5oCkBAIC0xMiw1MyArMTIsMzAgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3N1YnN0Zm9udC5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2RpYml0bWFwLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mcmVldHlwZS5oIgogCi10eXBlZGVmIHN0cnVjdCBGVF9GYWNlUmVjXyogRlhGVF9GYWNlOwotdHlwZWRlZiB2b2lkKiBGWEZUX0xpYnJhcnk7Ci0KLWNsYXNzIENGWF9GYWNlQ2FjaGU7Ci1jbGFzcyBDRlhfR2x5cGhCaXRtYXA7Ci1jbGFzcyBDRlhfUGF0aERhdGE7Ci1jbGFzcyBDRlhfU2l6ZUdseXBoQ2FjaGU7Ci0KICNpZiBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfIHx8IGRlZmluZWQgX1NLSUFfU1VQUE9SVF9QQVRIU18KIGNsYXNzIFNrVHlwZWZhY2U7CiAKIHVzaW5nIENGWF9UeXBlRmFjZSA9IFNrVHlwZWZhY2U7CiAjZW5kaWYKIAotLyogQ2hhcmFjdGVyIHNldHMgZm9yIHRoZSBmb250ICovCi0jZGVmaW5lIEZYRk9OVF9BTlNJX0NIQVJTRVQgMAotI2RlZmluZSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUIDEKLSNkZWZpbmUgRlhGT05UX1NZTUJPTF9DSEFSU0VUIDIKLSNkZWZpbmUgRlhGT05UX1NISUZUSklTX0NIQVJTRVQgMTI4Ci0jZGVmaW5lIEZYRk9OVF9IQU5HVUxfQ0hBUlNFVCAxMjkKLSNkZWZpbmUgRlhGT05UX0dCMjMxMl9DSEFSU0VUIDEzNAotI2RlZmluZSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVCAxMzYKLSNkZWZpbmUgRlhGT05UX1RIQUlfQ0hBUlNFVCAyMjIKLSNkZWZpbmUgRlhGT05UX0VBU1RFVVJPUEVfQ0hBUlNFVCAyMzgKLSNkZWZpbmUgRlhGT05UX1JVU1NJQU5fQ0hBUlNFVCAyMDQKLSNkZWZpbmUgRlhGT05UX0dSRUVLX0NIQVJTRVQgMTYxCi0jZGVmaW5lIEZYRk9OVF9UVVJLSVNIX0NIQVJTRVQgMTYyCi0jZGVmaW5lIEZYRk9OVF9IRUJSRVdfQ0hBUlNFVCAxNzcKLSNkZWZpbmUgRlhGT05UX0FSQUJJQ19DSEFSU0VUIDE3OAotI2RlZmluZSBGWEZPTlRfQkFMVElDX0NIQVJTRVQgMTg2Ci0jZGVmaW5lIEZYRk9OVF9KT0hBQl9DSEFSU0VUIDEzMAotI2RlZmluZSBGWEZPTlRfVklFVE5BTUVTRV9DSEFSU0VUIDE2MwotCiAvKiBGb250IHBpdGNoIGFuZCBmYW1pbHkgZmxhZ3MgKi8KLSNkZWZpbmUgRlhGT05UX0ZGX0ZJWEVEUElUQ0ggMQorI2RlZmluZSBGWEZPTlRfRkZfRklYRURQSVRDSCAoMSA8PCAwKQogI2RlZmluZSBGWEZPTlRfRkZfUk9NQU4gKDEgPDwgNCkKICNkZWZpbmUgRlhGT05UX0ZGX1NDUklQVCAoNCA8PCA0KQogCiAvKiBUeXBpY2FsIHdlaWdodCB2YWx1ZXMgKi8KICNkZWZpbmUgRlhGT05UX0ZXX05PUk1BTCA0MDAKICNkZWZpbmUgRlhGT05UX0ZXX0JPTEQgNzAwCisjZGVmaW5lIEZYRk9OVF9GV19CT0xEX0JPTEQgOTAwCiAKIC8qIEZvbnQgc3R5bGVzIGFzIGRlZmluZWQgaW4gUERGIDEuNyBUYWJsZSA1LjIwICovCisjZGVmaW5lIEZYRk9OVF9OT1JNQUwgKDApCiAjZGVmaW5lIEZYRk9OVF9GSVhFRF9QSVRDSCAoMSA8PCAwKQogI2RlZmluZSBGWEZPTlRfU0VSSUYgKDEgPDwgMSkKICNkZWZpbmUgRlhGT05UX1NZTUJPTElDICgxIDw8IDIpCkBAIC03NiwxMyArNTMsNiBAQAogI2RlZmluZSBGWEZPTlRfRVhBQ1RNQVRDSCAweDgwMDAwMDAwCiAjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKLSNkZWZpbmUgQ0hBUlNFVF9GTEFHX0FOU0kgMQotI2RlZmluZSBDSEFSU0VUX0ZMQUdfU1lNQk9MIDIKLSNkZWZpbmUgQ0hBUlNFVF9GTEFHX1NISUZUSklTIDQKLSNkZWZpbmUgQ0hBUlNFVF9GTEFHX0JJRzUgOAotI2RlZmluZSBDSEFSU0VUX0ZMQUdfR0IgMTYKLSNkZWZpbmUgQ0hBUlNFVF9GTEFHX0tPUkVBTiAzMgotCiAjZGVmaW5lIEdFVF9UVF9TSE9SVCh3KSAodWludDE2X3QpKCgodylbMF0gPDwgOCkgfCAodylbMV0pCiAjZGVmaW5lIEdFVF9UVF9MT05HKHcpIFwKICAgKHVpbnQzMl90KSgoKHcpWzBdIDw8IDI0KSB8ICgodylbMV0gPDwgMTYpIHwgKCh3KVsyXSA8PCA4KSB8ICh3KVszXSkKQEAgLTk4LDEzNSArNjgsMjEgQEAKICAgRlRfRmFjZSBtX0ZhY2U7CiB9OwogCi1jbGFzcyBDRlhfRm9udCB7Ci0gcHVibGljOgotICBDRlhfRm9udCgpOwotICB+Q0ZYX0ZvbnQoKTsKLQotICB2b2lkIExvYWRTdWJzdChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAotICAgICAgICAgICAgICAgICBib29sIGJUcnVlVHlwZSwKLSAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCi0gICAgICAgICAgICAgICAgIGludCBpdGFsaWNfYW5nbGUsCi0gICAgICAgICAgICAgICAgIGludCBDaGFyc2V0Q1AsCi0gICAgICAgICAgICAgICAgIGJvb2wgYlZlcnRpY2FsKTsKLQotICBib29sIExvYWRFbWJlZGRlZChjb25zdCB1aW50OF90KiBkYXRhLCB1aW50MzJfdCBzaXplKTsKLSAgRlhGVF9GYWNlIEdldEZhY2UoKSBjb25zdCB7IHJldHVybiBtX0ZhY2U7IH0KLSAgQ0ZYX1N1YnN0Rm9udCogR2V0U3Vic3RGb250KCkgY29uc3QgeyByZXR1cm4gbV9wU3Vic3RGb250LmdldCgpOyB9Ci0KLSNpZmRlZiBQREZfRU5BQkxFX1hGQQotICBib29sIExvYWRGaWxlKGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBGaWxlLAotICAgICAgICAgICAgICAgIGludCBuRmFjZUluZGV4ID0gMCwKLSAgICAgICAgICAgICAgICBpbnQqIHBGYWNlQ291bnQgPSBudWxscHRyKTsKLQotICBib29sIExvYWRDbG9uZShjb25zdCBDRlhfRm9udCogcEZvbnQpOwotICB2b2lkIFNldEZhY2UoRlhGVF9GYWNlIGZhY2UpOwotICB2b2lkIFNldFN1YnN0Rm9udChzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1N1YnN0Rm9udD4gc3Vic3QpIHsKLSAgICBtX3BTdWJzdEZvbnQgPSBzdGQ6Om1vdmUoc3Vic3QpOwotICB9Ci0jZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCi0KLSAgY29uc3QgQ0ZYX0dseXBoQml0bWFwKiBMb2FkR2x5cGhCaXRtYXAodWludDMyX3QgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZvbnRTdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbnRpX2FsaWFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHRleHRfZmxhZ3MpIGNvbnN0OwotICBjb25zdCBDRlhfUGF0aERhdGEqIExvYWRHbHlwaFBhdGgodWludDMyX3QgZ2x5cGhfaW5kZXgsIGludCBkZXN0X3dpZHRoKSBjb25zdDsKLQotI2lmIGRlZmluZWQgX1NLSUFfU1VQUE9SVF8gfHwgZGVmaW5lZCBfU0tJQV9TVVBQT1JUX1BBVEhTXwotICBDRlhfVHlwZUZhY2UqIEdldERldmljZUNhY2hlKCkgY29uc3Q7Ci0jZW5kaWYKLQotICBpbnQgR2V0R2x5cGhXaWR0aCh1aW50MzJfdCBnbHlwaF9pbmRleCk7Ci0gIGludCBHZXRBc2NlbnQoKSBjb25zdDsKLSAgaW50IEdldERlc2NlbnQoKSBjb25zdDsKLSAgYm9vbCBHZXRHbHlwaEJCb3godWludDMyX3QgZ2x5cGhfaW5kZXgsIEZYX1JFQ1QmIGJib3gpOwotICBib29sIElzSXRhbGljKCkgY29uc3Q7Ci0gIGJvb2wgSXNCb2xkKCkgY29uc3Q7Ci0gIGJvb2wgSXNGaXhlZFdpZHRoKCkgY29uc3Q7Ci0gIGJvb2wgSXNWZXJ0aWNhbCgpIGNvbnN0IHsgcmV0dXJuIG1fYlZlcnRpY2FsOyB9Ci0gIENGWF9CeXRlU3RyaW5nIEdldFBzTmFtZSgpIGNvbnN0OwotICBDRlhfQnl0ZVN0cmluZyBHZXRGYW1pbHlOYW1lKCkgY29uc3Q7Ci0gIENGWF9CeXRlU3RyaW5nIEdldEZhY2VOYW1lKCkgY29uc3Q7Ci0gIGJvb2wgSXNUVEZvbnQoKSBjb25zdDsKLSAgYm9vbCBHZXRCQm94KEZYX1JFQ1QmIGJib3gpOwotICBpbnQgR2V0SGVpZ2h0KCkgY29uc3Q7Ci0gIGludCBHZXRVTFBvcygpIGNvbnN0OwotICBpbnQgR2V0VUx0aGlja25lc3MoKSBjb25zdDsKLSAgaW50IEdldE1heEFkdmFuY2VXaWR0aCgpIGNvbnN0OwotICBib29sIElzRW1iZWRkZWQoKSBjb25zdCB7IHJldHVybiBtX2JFbWJlZGRlZDsgfQotICB1aW50OF90KiBHZXRTdWJEYXRhKCkgY29uc3QgeyByZXR1cm4gbV9wR3N1YkRhdGE7IH0KLSAgdm9pZCBTZXRTdWJEYXRhKHVpbnQ4X3QqIGRhdGEpIHsgbV9wR3N1YkRhdGEgPSBkYXRhOyB9Ci0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgdm9pZCogR2V0UGxhdGZvcm1Gb250KCkgY29uc3QgeyByZXR1cm4gbV9wUGxhdGZvcm1Gb250OyB9Ci0gIHZvaWQgU2V0UGxhdGZvcm1Gb250KHZvaWQqIGZvbnQpIHsgbV9wUGxhdGZvcm1Gb250ID0gZm9udDsgfQotI2VuZGlmCi0gIHVpbnQ4X3QqIEdldEZvbnREYXRhKCkgY29uc3QgeyByZXR1cm4gbV9wRm9udERhdGE7IH0KLSAgdWludDMyX3QgR2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZHdTaXplOyB9Ci0gIHZvaWQgQWRqdXN0TU1QYXJhbXMoaW50IGdseXBoX2luZGV4LCBpbnQgd2lkdGgsIGludCB3ZWlnaHQpIGNvbnN0OwotCi0gIHN0YXRpYyBjb25zdCBzaXplX3Qga0FuZ2xlU2tld0FycmF5U2l6ZSA9IDMwOwotICBzdGF0aWMgY29uc3QgY2hhciBzX0FuZ2xlU2tld1trQW5nbGVTa2V3QXJyYXlTaXplXTsKLSAgc3RhdGljIGNvbnN0IHNpemVfdCBrV2VpZ2h0UG93QXJyYXlTaXplID0gMTAwOwotICBzdGF0aWMgY29uc3QgdWludDhfdCBzX1dlaWdodFBvd1trV2VpZ2h0UG93QXJyYXlTaXplXTsKLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc19XZWlnaHRQb3dfMTFba1dlaWdodFBvd0FycmF5U2l6ZV07Ci0gIHN0YXRpYyBjb25zdCB1aW50OF90IHNfV2VpZ2h0UG93X1NISUZUSklTW2tXZWlnaHRQb3dBcnJheVNpemVdOwotCi0jaWZkZWYgUERGX0VOQUJMRV9YRkEKLSBwcm90ZWN0ZWQ6Ci0gIGJvb2wgbV9iU2hhbGxvd0NvcHk7Ci0gIEZYRlRfU3RyZWFtUmVjKiBtX3BPd25lZFN0cmVhbTsKLSNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBDRlhfRmFjZUNhY2hlOwotICBDRlhfUGF0aERhdGEqIExvYWRHbHlwaFBhdGhJbXBsKHVpbnQzMl90IGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoID0gMCkgY29uc3Q7Ci0gIENGWF9GYWNlQ2FjaGUqIEdldEZhY2VDYWNoZSgpIGNvbnN0OwotICB2b2lkIFJlbGVhc2VQbGF0Zm9ybVJlc291cmNlKCk7Ci0gIHZvaWQgRGVsZXRlRmFjZSgpOwotICB2b2lkIENsZWFyRmFjZUNhY2hlKCk7Ci0KLSAgRlhGVF9GYWNlIG1fRmFjZTsKLSAgbXV0YWJsZSBDRlhfRmFjZUNhY2hlKiBtX0ZhY2VDYWNoZTsgIC8vIG5vdCBvd25lZC4KLSAgc3RkOjp1bmlxdWVfcHRyPENGWF9TdWJzdEZvbnQ+IG1fcFN1YnN0Rm9udDsKLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbV9wRm9udERhdGFBbGxvY2F0aW9uOwotICB1aW50OF90KiBtX3BGb250RGF0YTsKLSAgdWludDhfdCogbV9wR3N1YkRhdGE7Ci0gIHVpbnQzMl90IG1fZHdTaXplOwotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gIHZvaWQqIG1fcFBsYXRmb3JtRm9udDsKLSNlbmRpZgotICBib29sIG1fYkVtYmVkZGVkOwotICBib29sIG1fYlZlcnRpY2FsOwotfTsKLQotY2xhc3MgQ0ZYX0ZvbnRGYWNlSW5mbyB7Ci0gcHVibGljOgotICBDRlhfRm9udEZhY2VJbmZvKENGWF9CeXRlU3RyaW5nIGZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGZhY2VOYW1lLAotICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGZvbnRUYWJsZXMsCi0gICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9udE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaWxlU2l6ZSk7Ci0KLSAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgbV9GaWxlUGF0aDsKLSAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgbV9GYWNlTmFtZTsKLSAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgbV9Gb250VGFibGVzOwotICBjb25zdCB1aW50MzJfdCBtX0ZvbnRPZmZzZXQ7Ci0gIGNvbnN0IHVpbnQzMl90IG1fRmlsZVNpemU7Ci0gIHVpbnQzMl90IG1fU3R5bGVzOwotICB1aW50MzJfdCBtX0NoYXJzZXRzOwotfTsKLQogY2xhc3MgQ0ZYX0dseXBoQml0bWFwIHsKICBwdWJsaWM6CisgIENGWF9HbHlwaEJpdG1hcCgpOworICB+Q0ZYX0dseXBoQml0bWFwKCk7CisKICAgaW50IG1fVG9wOwogICBpbnQgbV9MZWZ0OwotICBDRlhfRElCaXRtYXAgbV9CaXRtYXA7CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IG1fcEJpdG1hcDsKIH07CiAKK2lubGluZSBDRlhfR2x5cGhCaXRtYXA6OkNGWF9HbHlwaEJpdG1hcCgpCisgICAgOiBtX3BCaXRtYXAocGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKSkge30KKworaW5saW5lIENGWF9HbHlwaEJpdG1hcDo6fkNGWF9HbHlwaEJpdG1hcCgpID0gZGVmYXVsdDsKKwogY2xhc3MgRlhURVhUX0dMWVBIUE9TIHsKICBwdWJsaWM6CiAgIEZYVEVYVF9HTFlQSFBPUygpOwpAQCAtMjQwLDEzICs5Niw0OCBAQAogCiBGWF9SRUNUIEZYR0VfR2V0R2x5cGhzQkJveChjb25zdCBzdGQ6OnZlY3RvcjxGWFRFWFRfR0xZUEhQT1M+JiBnbHlwaHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW50aV9hbGlhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHJldGluYVNjYWxlWCA9IDEuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCByZXRpbmFTY2FsZVkgPSAxLjBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJldGluYVNjYWxlWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJldGluYVNjYWxlWSk7CiAKLUNGWF9CeXRlU3RyaW5nIEdldE5hbWVGcm9tVFQoY29uc3QgdWludDhfdCogbmFtZV90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbmFtZV90YWJsZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuYW1lKTsKK0J5dGVTdHJpbmcgR2V0TmFtZUZyb21UVChjb25zdCB1aW50OF90KiBuYW1lX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5hbWVfdGFibGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuYW1lKTsKIAotaW50IFBERl9HZXRTdGFuZGFyZEZvbnROYW1lKENGWF9CeXRlU3RyaW5nKiBuYW1lKTsKK2ludCBQREZfR2V0U3RhbmRhcmRGb250TmFtZShCeXRlU3RyaW5nKiBuYW1lKTsKKworaW5saW5lIGJvb2wgRm9udFN0eWxlSXNCb2xkKHVpbnQzMl90IHN0eWxlKSB7CisgIHJldHVybiAhIShzdHlsZSAmIEZYRk9OVF9CT0xEKTsKK30KK2lubGluZSBib29sIEZvbnRTdHlsZUlzSXRhbGljKHVpbnQzMl90IHN0eWxlKSB7CisgIHJldHVybiAhIShzdHlsZSAmIEZYRk9OVF9JVEFMSUMpOworfQoraW5saW5lIGJvb2wgRm9udFN0eWxlSXNGaXhlZFBpdGNoKHVpbnQzMl90IHN0eWxlKSB7CisgIHJldHVybiAhIShzdHlsZSAmIEZYRk9OVF9GSVhFRF9QSVRDSCk7Cit9CitpbmxpbmUgYm9vbCBGb250U3R5bGVJc1N5bWJvbGljKHVpbnQzMl90IHN0eWxlKSB7CisgIHJldHVybiAhIShzdHlsZSAmIEZYRk9OVF9TWU1CT0xJQyk7Cit9CitpbmxpbmUgYm9vbCBGb250U3R5bGVJc05vblN5bWJvbGljKHVpbnQzMl90IHN0eWxlKSB7CisgIHJldHVybiAhIShzdHlsZSAmIEZYRk9OVF9OT05TWU1CT0xJQyk7Cit9CitpbmxpbmUgYm9vbCBGb250U3R5bGVJc0FsbENhcHModWludDMyX3Qgc3R5bGUpIHsKKyAgcmV0dXJuICEhKHN0eWxlICYgRlhGT05UX0FMTENBUCk7Cit9CitpbmxpbmUgYm9vbCBGb250U3R5bGVJc1NlcmlmKHVpbnQzMl90IHN0eWxlKSB7CisgIHJldHVybiAhIShzdHlsZSAmIEZYRk9OVF9TRVJJRik7Cit9CitpbmxpbmUgYm9vbCBGb250U3R5bGVJc1NjcmlwdCh1aW50MzJfdCBzdHlsZSkgeworICByZXR1cm4gISEoc3R5bGUgJiBGWEZPTlRfU0NSSVBUKTsKK30KKworaW5saW5lIGJvb2wgRm9udEZhbWlseUlzRml4ZWRQaXRjaCh1aW50MzJfdCBmYW1pbHkpIHsKKyAgcmV0dXJuICEhKGZhbWlseSAmIEZYRk9OVF9GRl9GSVhFRFBJVENIKTsKK30KK2lubGluZSBib29sIEZvbnRGYW1pbHlJc1JvbWFuKHVpbnQzMl90IGZhbWlseSkgeworICByZXR1cm4gISEoZmFtaWx5ICYgRlhGT05UX0ZGX1JPTUFOKTsKK30KK2lubGluZSBib29sIEZvbnRGYW1pbHlJc1NjcmlwdChpbnQzMl90IGZhbWlseSkgeworICByZXR1cm4gISEoZmFtaWx5ICYgRlhGT05UX0ZGX1NDUklQVCk7Cit9CiAKICNlbmRpZiAgLy8gQ09SRV9GWEdFX0ZYX0ZPTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9meF9mcmVldHlwZS5oIGIvY29yZS9meGdlL2Z4X2ZyZWV0eXBlLmgKaW5kZXggOGVhZDZiNy4uOGE1ZmQ1ZCAxMDA2NDQKLS0tIGEvY29yZS9meGdlL2Z4X2ZyZWV0eXBlLmgKKysrIGIvY29yZS9meGdlL2Z4X2ZyZWV0eXBlLmgKQEAgLTE1LDkgKzE1LDIwIEBACiAjaW5jbHVkZSBGVF9PVVRMSU5FX0gKICNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBQkxFU19ICiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKK3VzaW5nIEZYRlRfRmFjZSA9IHN0cnVjdCBGVF9GYWNlUmVjXyo7Cit1c2luZyBGWEZUX0xpYnJhcnkgPSB2b2lkKjsKKwordXNpbmcgRlhGVF9NTV9WYXIgPSBGVF9NTV9WYXIqOwordXNpbmcgRlhGVF9PcGVuX0FyZ3MgPSBGVF9PcGVuX0FyZ3M7Cit1c2luZyBGWEZUX1N0cmVhbVJlYyA9IEZUX1N0cmVhbVJlYzsKK3VzaW5nIEZYRlRfU3RyZWFtID0gRlRfU3RyZWFtUmVjKjsKK3VzaW5nIEZYRlRfQkJveCA9IEZUX0JCb3g7Cit1c2luZyBGWEZUX0dseXBoID0gRlRfR2x5cGg7Cit1c2luZyBGWEZUX0NoYXJNYXAgPSBGVF9DaGFyTWFwOworCit1c2luZyBGWEZUX01hdHJpeCA9IEZUX01hdHJpeDsKK3VzaW5nIEZYRlRfVmVjdG9yID0gRlRfVmVjdG9yOwordXNpbmcgRlhGVF9PdXRsaW5lX0Z1bmNzID0gRlRfT3V0bGluZV9GdW5jczsKIAogI2RlZmluZSBGWEZUX0VOQ09ESU5HX1VOSUNPREUgRlRfRU5DT0RJTkdfVU5JQ09ERQogI2RlZmluZSBGWEZUX0VOQ09ESU5HX0FET0JFX1NUQU5EQVJEIEZUX0VOQ09ESU5HX0FET0JFX1NUQU5EQVJECkBAIC0zMCwxMzUgKzQxLDE0MiBAQAogI2RlZmluZSBGWEZUX0VOQ09ESU5HX0JJRzUgRlRfRU5DT0RJTkdfQklHNQogI2RlZmluZSBGWEZUX0VOQ09ESU5HX1NKSVMgRlRfRU5DT0RJTkdfU0pJUwogI2RlZmluZSBGWEZUX0VOQ09ESU5HX0pPSEFCIEZUX0VOQ09ESU5HX0pPSEFCCi0jZGVmaW5lIEZYRlRfRU5DT0RJTkdfV0FOU1VORyBGVF9FTkNPRElOR19XQU5TVU5HCisKICNkZWZpbmUgRlhGVF9MT0FEX05PX1NDQUxFIEZUX0xPQURfTk9fU0NBTEUKICNkZWZpbmUgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCBcCiAgIEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRICisjZGVmaW5lIEZYRlRfTE9BRF9OT19CSVRNQVAgRlRfTE9BRF9OT19CSVRNQVAKKwogI2RlZmluZSBGWEZUX1JFTkRFUl9NT0RFX0xDRCBGVF9SRU5ERVJfTU9ERV9MQ0QKICNkZWZpbmUgRlhGVF9SRU5ERVJfTU9ERV9NT05PIEZUX1JFTkRFUl9NT0RFX01PTk8KICNkZWZpbmUgRlhGVF9SRU5ERVJfTU9ERV9OT1JNQUwgRlRfUkVOREVSX01PREVfTk9STUFMCi0jZGVmaW5lIEZYRlRfTE9BRF9JR05PUkVfVFJBTlNGT1JNIEZUX0xPQURfSUdOT1JFX1RSQU5TRk9STQotI2RlZmluZSBGWEZUX0xPQURfTk9fQklUTUFQIEZUX0xPQURfTk9fQklUTUFQCi0jZGVmaW5lIEZYRlRfTE9BRF9OT19ISU5USU5HIEZUX0xPQURfTk9fSElOVElORworCiAjZGVmaW5lIEZYRlRfUElYRUxfTU9ERV9NT05PIEZUX1BJWEVMX01PREVfTU9OTworCiAjZGVmaW5lIEZYRlRfU1RZTEVfRkxBR19JVEFMSUMgRlRfU1RZTEVfRkxBR19JVEFMSUMKICNkZWZpbmUgRlhGVF9TVFlMRV9GTEFHX0JPTEQgRlRfU1RZTEVfRkxBR19CT0xECisKICNkZWZpbmUgRlhGVF9GQUNFX0ZMQUdfU0ZOVCBGVF9GQUNFX0ZMQUdfU0ZOVAogI2RlZmluZSBGWEZUX0ZBQ0VfRkxBR19UUklDS1kgKDFMIDw8IDEzKQotdHlwZWRlZiBGVF9NTV9WYXIqIEZYRlRfTU1fVmFyOwotdHlwZWRlZiBGVF9CaXRtYXAqIEZYRlRfQml0bWFwOwotI2RlZmluZSBGWEZUX01hdHJpeCBGVF9NYXRyaXgKLSNkZWZpbmUgRlhGVF9WZWN0b3IgRlRfVmVjdG9yCi0jZGVmaW5lIEZYRlRfT3V0bGluZV9GdW5jcyBGVF9PdXRsaW5lX0Z1bmNzCi10eXBlZGVmIEZUX09wZW5fQXJncyBGWEZUX09wZW5fQXJnczsKLXR5cGVkZWYgRlRfU3RyZWFtUmVjIEZYRlRfU3RyZWFtUmVjOwotdHlwZWRlZiBGVF9TdHJlYW1SZWMqIEZYRlRfU3RyZWFtOwotdHlwZWRlZiBGVF9CQm94IEZYRlRfQkJveDsKLXR5cGVkZWYgRlRfR2x5cGggRlhGVF9HbHlwaDsKLXR5cGVkZWYgRlRfQ2hhck1hcCBGWEZUX0NoYXJNYXA7CisKICNkZWZpbmUgRlhGVF9HTFlQSF9CQk9YX1BJWEVMUyBGVF9HTFlQSF9CQk9YX1BJWEVMUwotI2RlZmluZSBGWEZUX09wZW5fRmFjZShsaWJyYXJ5LCBhcmdzLCBpbmRleCwgZmFjZSkgXAotICBGVF9PcGVuX0ZhY2UoKEZUX0xpYnJhcnkpKGxpYnJhcnkpLCBhcmdzLCBpbmRleCwgKEZUX0ZhY2UqKShmYWNlKSkKLSNkZWZpbmUgRlhGVF9Eb25lX0ZhY2UoZmFjZSkgRlRfRG9uZV9GYWNlKChGVF9GYWNlKShmYWNlKSkKLSNkZWZpbmUgRlhGVF9Eb25lX0ZyZWVUeXBlKGxpYnJhcnkpIEZUX0RvbmVfRnJlZVR5cGUoKEZUX0xpYnJhcnkpKGxpYnJhcnkpKQotI2RlZmluZSBGWEZUX0luaXRfRnJlZVR5cGUobGlicmFyeSkgRlRfSW5pdF9GcmVlVHlwZSgoRlRfTGlicmFyeSopKGxpYnJhcnkpKQotI2RlZmluZSBGWEZUX05ld19NZW1vcnlfRmFjZShsaWJyYXJ5LCBiYXNlLCBzaXplLCBpbmRleCwgZmFjZSkgXAotICBGVF9OZXdfTWVtb3J5X0ZhY2UoKEZUX0xpYnJhcnkpKGxpYnJhcnkpLCBiYXNlLCBzaXplLCBpbmRleCwgKEZUX0ZhY2UqKShmYWNlKSkKLSNkZWZpbmUgRlhGVF9OZXdfRmFjZShsaWJyYXJ5LCBmaWxlbmFtZSwgaW5kZXgsIGZhY2UpIFwKLSAgRlRfTmV3X0ZhY2UoKEZUX0xpYnJhcnkpKGxpYnJhcnkpLCBmaWxlbmFtZSwgaW5kZXgsIChGVF9GYWNlKikoZmFjZSkpCi0jZGVmaW5lIEZYRlRfR2V0X0ZhY2VfRnJlZVR5cGUoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5kcml2ZXItPnJvb3QubGlicmFyeQotI2RlZmluZSBGWEZUX1NlbGVjdF9DaGFybWFwKGZhY2UsIGVuY29kaW5nKSBcCi0gIEZUX1NlbGVjdF9DaGFybWFwKChGVF9GYWNlKWZhY2UsIChGVF9FbmNvZGluZyllbmNvZGluZykKKworI2RlZmluZSBGWEZUX09wZW5fRmFjZShsaWJyYXJ5LCBhcmdzLCBpbmRleCwgZmFjZSkgICAgICAgICAgICBcCisgIEZUX09wZW5fRmFjZShzdGF0aWNfY2FzdDxGVF9MaWJyYXJ5PihsaWJyYXJ5KSwgYXJncywgaW5kZXgsIFwKKyAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZUX0ZhY2UqPihmYWNlKSkKKyNkZWZpbmUgRlhGVF9Eb25lX0ZhY2UoZmFjZSkgRlRfRG9uZV9GYWNlKHN0YXRpY19jYXN0PEZUX0ZhY2U+KGZhY2UpKQorI2RlZmluZSBGWEZUX0RvbmVfRnJlZVR5cGUobGlicmFyeSkgXAorICBGVF9Eb25lX0ZyZWVUeXBlKHN0YXRpY19jYXN0PEZUX0xpYnJhcnk+KGxpYnJhcnkpKQorI2RlZmluZSBGWEZUX0luaXRfRnJlZVR5cGUobGlicmFyeSkgXAorICBGVF9Jbml0X0ZyZWVUeXBlKHJlaW50ZXJwcmV0X2Nhc3Q8RlRfTGlicmFyeSo+KGxpYnJhcnkpKQorI2RlZmluZSBGWEZUX0xpYnJhcnlfVmVyc2lvbihsaWJyYXJ5LCBhbWFqb3IsIGFtaW5vciwgYXBhdGNoKSAgICAgICAgICAgICAgIFwKKyAgRlRfTGlicmFyeV9WZXJzaW9uKHJlaW50ZXJwcmV0X2Nhc3Q8RlRfTGlicmFyeT4obGlicmFyeSksIGFtYWpvciwgYW1pbm9yLCBcCisgICAgICAgICAgICAgICAgICAgICBhcGF0Y2gpCisjZGVmaW5lIEZYRlRfTmV3X01lbW9yeV9GYWNlKGxpYnJhcnksIGJhc2UsIHNpemUsIGluZGV4LCBmYWNlKSAgICAgICAgICAgIFwKKyAgRlRfTmV3X01lbW9yeV9GYWNlKHN0YXRpY19jYXN0PEZUX0xpYnJhcnk+KGxpYnJhcnkpLCBiYXNlLCBzaXplLCBpbmRleCwgXAorICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RlRfRmFjZSo+KGZhY2UpKQorI2RlZmluZSBGWEZUX05ld19GYWNlKGxpYnJhcnksIGZpbGVuYW1lLCBpbmRleCwgZmFjZSkgICAgICAgICAgICBcCisgIEZUX05ld19GYWNlKHN0YXRpY19jYXN0PEZUX0xpYnJhcnk+KGxpYnJhcnkpLCBmaWxlbmFtZSwgaW5kZXgsIFwKKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RlRfRmFjZSo+KGZhY2UpKQorI2RlZmluZSBGWEZUX1NlbGVjdF9DaGFybWFwKGZhY2UsIGVuY29kaW5nKSAgICAgXAorICBGVF9TZWxlY3RfQ2hhcm1hcChzdGF0aWNfY2FzdDxGVF9GYWNlPihmYWNlKSwgXAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGVF9FbmNvZGluZz4oZW5jb2RpbmcpKQogI2RlZmluZSBGWEZUX1NldF9DaGFybWFwKGZhY2UsIGNoYXJtYXApIFwKLSAgRlRfU2V0X0NoYXJtYXAoKEZUX0ZhY2UpZmFjZSwgKEZUX0NoYXJNYXApY2hhcm1hcCkKKyAgRlRfU2V0X0NoYXJtYXAoc3RhdGljX2Nhc3Q8RlRfRmFjZT4oZmFjZSksIHN0YXRpY19jYXN0PEZUX0NoYXJNYXA+KGNoYXJtYXApKQogI2RlZmluZSBGWEZUX0xvYWRfR2x5cGgoZmFjZSwgZ2x5cGhfaW5kZXgsIGZsYWdzKSBcCi0gIEZUX0xvYWRfR2x5cGgoKEZUX0ZhY2UpZmFjZSwgZ2x5cGhfaW5kZXgsIGZsYWdzKQotI2RlZmluZSBGWEZUX0dldF9DaGFyX0luZGV4KGZhY2UsIGNvZGUpIEZUX0dldF9DaGFyX0luZGV4KChGVF9GYWNlKWZhY2UsIGNvZGUpCisgIEZUX0xvYWRfR2x5cGgoc3RhdGljX2Nhc3Q8RlRfRmFjZT4oZmFjZSksIGdseXBoX2luZGV4LCBmbGFncykKKyNkZWZpbmUgRlhGVF9HZXRfQ2hhcl9JbmRleChmYWNlLCBjb2RlKSBcCisgIEZUX0dldF9DaGFyX0luZGV4KHN0YXRpY19jYXN0PEZUX0ZhY2U+KGZhY2UpLCBjb2RlKQogI2RlZmluZSBGWEZUX0dldF9HbHlwaF9OYW1lKGZhY2UsIGluZGV4LCBidWZmZXIsIHNpemUpIFwKLSAgRlRfR2V0X0dseXBoX05hbWUoKEZUX0ZhY2UpZmFjZSwgaW5kZXgsIGJ1ZmZlciwgc2l6ZSkKLSNkZWZpbmUgRlhGVF9HZXRfTmFtZV9JbmRleChmYWNlLCBuYW1lKSBGVF9HZXRfTmFtZV9JbmRleCgoRlRfRmFjZSlmYWNlLCBuYW1lKQorICBGVF9HZXRfR2x5cGhfTmFtZShzdGF0aWNfY2FzdDxGVF9GYWNlPihmYWNlKSwgaW5kZXgsIGJ1ZmZlciwgc2l6ZSkKKyNkZWZpbmUgRlhGVF9HZXRfTmFtZV9JbmRleChmYWNlLCBuYW1lKSBcCisgIEZUX0dldF9OYW1lX0luZGV4KHN0YXRpY19jYXN0PEZUX0ZhY2U+KGZhY2UpLCBuYW1lKQogI2RlZmluZSBGWEZUX0hhc19HbHlwaF9OYW1lcyhmYWNlKSBcCi0gICgoKEZUX0ZhY2UpZmFjZSktPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfR0xZUEhfTkFNRVMpCi0jZGVmaW5lIEZYRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZShmYWNlKSBGVF9HZXRfUG9zdHNjcmlwdF9OYW1lKChGVF9GYWNlKWZhY2UpCisgIChzdGF0aWNfY2FzdDxGVF9GYWNlPihmYWNlKS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19HTFlQSF9OQU1FUykKKyNkZWZpbmUgRlhGVF9HZXRfUG9zdHNjcmlwdF9OYW1lKGZhY2UpIFwKKyAgRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZShzdGF0aWNfY2FzdDxGVF9GYWNlPihmYWNlKSkKICNkZWZpbmUgRlhGVF9Mb2FkX1NmbnRfVGFibGUoZmFjZSwgdGFnLCBvZmZzZXQsIGJ1ZmZlciwgbGVuZ3RoKSBcCi0gIEZUX0xvYWRfU2ZudF9UYWJsZSgoRlRfRmFjZSlmYWNlLCB0YWcsIG9mZnNldCwgYnVmZmVyLCBsZW5ndGgpCisgIEZUX0xvYWRfU2ZudF9UYWJsZShzdGF0aWNfY2FzdDxGVF9GYWNlPihmYWNlKSwgdGFnLCBvZmZzZXQsIGJ1ZmZlciwgbGVuZ3RoKQogI2RlZmluZSBGWEZUX0dldF9GaXJzdF9DaGFyKGZhY2UsIGdseXBoX2luZGV4KSBcCi0gIEZUX0dldF9GaXJzdF9DaGFyKChGVF9GYWNlKWZhY2UsIGdseXBoX2luZGV4KQorICBGVF9HZXRfRmlyc3RfQ2hhcihzdGF0aWNfY2FzdDxGVF9GYWNlPihmYWNlKSwgZ2x5cGhfaW5kZXgpCiAjZGVmaW5lIEZYRlRfR2V0X05leHRfQ2hhcihmYWNlLCBjb2RlLCBnbHlwaF9pbmRleCkgXAotICBGVF9HZXRfTmV4dF9DaGFyKChGVF9GYWNlKWZhY2UsIGNvZGUsIGdseXBoX2luZGV4KQorICBGVF9HZXRfTmV4dF9DaGFyKHN0YXRpY19jYXN0PEZUX0ZhY2U+KGZhY2UpLCBjb2RlLCBnbHlwaF9pbmRleCkKICNkZWZpbmUgRlhGVF9DbGVhcl9GYWNlX0V4dGVybmFsX1N0cmVhbShmYWNlKSBcCi0gICgoKEZUX0ZhY2UpZmFjZSktPmZhY2VfZmxhZ3MgJj0gfkZUX0ZBQ0VfRkxBR19FWFRFUk5BTF9TVFJFQU0pCisgIChzdGF0aWNfY2FzdDxGVF9GYWNlPihmYWNlKS0+ZmFjZV9mbGFncyAmPSB+RlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTSkKICNkZWZpbmUgRlhGVF9HZXRfRmFjZV9FeHRlcm5hbF9TdHJlYW0oZmFjZSkgXAotICAoKChGVF9GYWNlKWZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTSkKKyAgKHN0YXRpY19jYXN0PEZUX0ZhY2U+KGZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTSkKICNkZWZpbmUgRlhGVF9Jc19GYWNlX1RUX09UKGZhY2UpIFwKLSAgKCgoRlRfRmFjZSlmYWNlKS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TRk5UKQorICAoc3RhdGljX2Nhc3Q8RlRfRmFjZT4oZmFjZSktPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfU0ZOVCkKICNkZWZpbmUgRlhGVF9Jc19GYWNlX1RyaWNreShmYWNlKSBcCi0gICgoKEZUX0ZhY2UpZmFjZSktPmZhY2VfZmxhZ3MgJiBGWEZUX0ZBQ0VfRkxBR19UUklDS1kpCisgIChzdGF0aWNfY2FzdDxGVF9GYWNlPihmYWNlKS0+ZmFjZV9mbGFncyAmIEZYRlRfRkFDRV9GTEFHX1RSSUNLWSkKICNkZWZpbmUgRlhGVF9Jc19GYWNlX2ZpeGVkd2lkdGgoZmFjZSkgXAotICAoKChGVF9GYWNlKWZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0ZJWEVEX1dJRFRIKQotI2RlZmluZSBGWEZUX0dldF9GYWNlX1N0cmVhbV9CYXNlKGZhY2UpICgoRlRfRmFjZSlmYWNlKS0+c3RyZWFtLT5iYXNlCi0jZGVmaW5lIEZYRlRfR2V0X0ZhY2VfU3RyZWFtX1NpemUoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5zdHJlYW0tPnNpemUKLSNkZWZpbmUgRlhGVF9HZXRfRmFjZV9GYW1pbHlfTmFtZShmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPmZhbWlseV9uYW1lCi0jZGVmaW5lIEZYRlRfR2V0X0ZhY2VfU3R5bGVfTmFtZShmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPnN0eWxlX25hbWUKLSNkZWZpbmUgRlhGVF9HZXRfRmFjZV9OdW1mYWNlcyhmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPm51bV9mYWNlcwotI2RlZmluZSBGWEZUX0dldF9GYWNlX0ZhY2VpbmRleChmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPmZhY2VfaW5kZXgKKyAgKHN0YXRpY19jYXN0PEZUX0ZhY2U+KGZhY2UpLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0ZJWEVEX1dJRFRIKQorI2RlZmluZSBGWEZUX0dldF9GYWNlX1N0cmVhbV9CYXNlKGZhY2UpIHN0YXRpY19jYXN0PEZUX0ZhY2U+KGZhY2UpLT5zdHJlYW0tPmJhc2UKKyNkZWZpbmUgRlhGVF9HZXRfRmFjZV9TdHJlYW1fU2l6ZShmYWNlKSBzdGF0aWNfY2FzdDxGVF9GYWNlPihmYWNlKS0+c3RyZWFtLT5zaXplCisjZGVmaW5lIEZYRlRfR2V0X0ZhY2VfRmFtaWx5X05hbWUoZmFjZSkgc3RhdGljX2Nhc3Q8RlRfRmFjZT4oZmFjZSktPmZhbWlseV9uYW1lCisjZGVmaW5lIEZYRlRfR2V0X0ZhY2VfU3R5bGVfTmFtZShmYWNlKSBzdGF0aWNfY2FzdDxGVF9GYWNlPihmYWNlKS0+c3R5bGVfbmFtZQogI2RlZmluZSBGWEZUX0lzX0ZhY2VfSXRhbGljKGZhY2UpIFwKLSAgKCgoRlRfRmFjZSlmYWNlKS0+c3R5bGVfZmxhZ3MgJiBGVF9TVFlMRV9GTEFHX0lUQUxJQykKKyAgKHN0YXRpY19jYXN0PEZUX0ZhY2U+KGZhY2UpLT5zdHlsZV9mbGFncyAmIEZUX1NUWUxFX0ZMQUdfSVRBTElDKQogI2RlZmluZSBGWEZUX0lzX0ZhY2VfQm9sZChmYWNlKSBcCi0gICgoKEZUX0ZhY2UpZmFjZSktPnN0eWxlX2ZsYWdzICYgRlRfU1RZTEVfRkxBR19CT0xEKQotI2RlZmluZSBGWEZUX0dldF9GYWNlX0NoYXJtYXBzKGZhY2UpICgoRlRfRmFjZSlmYWNlKS0+Y2hhcm1hcHMKKyAgKHN0YXRpY19jYXN0PEZUX0ZhY2U+KGZhY2UpLT5zdHlsZV9mbGFncyAmIEZUX1NUWUxFX0ZMQUdfQk9MRCkKKyNkZWZpbmUgRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKSBzdGF0aWNfY2FzdDxGVF9GYWNlPihmYWNlKS0+Y2hhcm1hcHMKICNkZWZpbmUgRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKGZhY2UpIFwKLSAgKChGVF9GYWNlKWZhY2UpLT5nbHlwaC0+bWV0cmljcy5ob3JpQmVhcmluZ1gKKyAgc3RhdGljX2Nhc3Q8RlRfRmFjZT4oZmFjZSktPmdseXBoLT5tZXRyaWNzLmhvcmlCZWFyaW5nWAogI2RlZmluZSBGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1koZmFjZSkgXAotICAoKEZUX0ZhY2UpZmFjZSktPmdseXBoLT5tZXRyaWNzLmhvcmlCZWFyaW5nWQotI2RlZmluZSBGWEZUX0dldF9HbHlwaF9XaWR0aChmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPmdseXBoLT5tZXRyaWNzLndpZHRoCi0jZGVmaW5lIEZYRlRfR2V0X0dseXBoX0hlaWdodChmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPmdseXBoLT5tZXRyaWNzLmhlaWdodAotI2RlZmluZSBGWEZUX0dldF9GYWNlX0NoYXJtYXBDb3VudChmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPm51bV9jaGFybWFwcwotI2RlZmluZSBGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nKGNoYXJtYXApICgoRlRfQ2hhck1hcCljaGFybWFwKS0+ZW5jb2RpbmcKLSNkZWZpbmUgRlhGVF9HZXRfRmFjZV9DaGFybWFwKGZhY2UpICgoRlRfRmFjZSlmYWNlKS0+Y2hhcm1hcAotI2RlZmluZSBGWEZUX0dldF9DaGFybWFwX1BsYXRmb3JtSUQoY2hhcm1hcCkgKChGVF9DaGFyTWFwKWNoYXJtYXApLT5wbGF0Zm9ybV9pZAotI2RlZmluZSBGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nSUQoY2hhcm1hcCkgKChGVF9DaGFyTWFwKWNoYXJtYXApLT5lbmNvZGluZ19pZAotI2RlZmluZSBGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0oZmFjZSkgKChGVF9GYWNlKWZhY2UpLT51bml0c19wZXJfRU0KLSNkZWZpbmUgRlhGVF9HZXRfRmFjZV94TWluKGZhY2UpICgoRlRfRmFjZSlmYWNlKS0+YmJveC54TWluCi0jZGVmaW5lIEZYRlRfR2V0X0ZhY2VfeE1heChmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPmJib3gueE1heAotI2RlZmluZSBGWEZUX0dldF9GYWNlX3lNaW4oZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5iYm94LnlNaW4KLSNkZWZpbmUgRlhGVF9HZXRfRmFjZV95TWF4KGZhY2UpICgoRlRfRmFjZSlmYWNlKS0+YmJveC55TWF4Ci0jZGVmaW5lIEZYRlRfR2V0X0ZhY2VfSGVpZ2h0KGZhY2UpICgoRlRfRmFjZSlmYWNlKS0+aGVpZ2h0Ci0jZGVmaW5lIEZYRlRfR2V0X0ZhY2VfVW5kZXJMaW5lVGhpY2tuZXNzKGZhY2UpIFwKLSAgKChGVF9GYWNlKWZhY2UpLT51bmRlcmxpbmVfdGhpY2tuZXNzCi0jZGVmaW5lIEZYRlRfR2V0X0ZhY2VfVW5kZXJMaW5lUG9zaXRpb24oZmFjZSkgXAotICAoKEZUX0ZhY2UpZmFjZSktPnVuZGVybGluZV9wb3NpdGlvbgotI2RlZmluZSBGWEZUX0dldF9GYWNlX01heEFkdmFuY2VXaWR0aChmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPm1heF9hZHZhbmNlX3dpZHRoCi0jZGVmaW5lIEZYRlRfR2V0X0ZhY2VfQXNjZW5kZXIoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5hc2NlbmRlcgotI2RlZmluZSBGWEZUX0dldF9GYWNlX0Rlc2NlbmRlcihmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPmRlc2NlbmRlcgorICBzdGF0aWNfY2FzdDxGVF9GYWNlPihmYWNlKS0+Z2x5cGgtPm1ldHJpY3MuaG9yaUJlYXJpbmdZCisjZGVmaW5lIEZYRlRfR2V0X0dseXBoX1dpZHRoKGZhY2UpIFwKKyAgc3RhdGljX2Nhc3Q8RlRfRmFjZT4oZmFjZSktPmdseXBoLT5tZXRyaWNzLndpZHRoCisjZGVmaW5lIEZYRlRfR2V0X0dseXBoX0hlaWdodChmYWNlKSBcCisgIHN0YXRpY19jYXN0PEZUX0ZhY2U+KGZhY2UpLT5nbHlwaC0+bWV0cmljcy5oZWlnaHQKKyNkZWZpbmUgRlhGVF9HZXRfRmFjZV9DaGFybWFwQ291bnQoZmFjZSkgXAorICBzdGF0aWNfY2FzdDxGVF9GYWNlPihmYWNlKS0+bnVtX2NoYXJtYXBzCisjZGVmaW5lIEZYRlRfR2V0X0NoYXJtYXBfRW5jb2RpbmcoY2hhcm1hcCkgXAorICBzdGF0aWNfY2FzdDxGVF9DaGFyTWFwPihjaGFybWFwKS0+ZW5jb2RpbmcKKyNkZWZpbmUgRlhGVF9HZXRfRmFjZV9DaGFybWFwKGZhY2UpIHN0YXRpY19jYXN0PEZUX0ZhY2U+KGZhY2UpLT5jaGFybWFwCisjZGVmaW5lIEZYRlRfR2V0X0NoYXJtYXBfUGxhdGZvcm1JRChjaGFybWFwKSBcCisgIHN0YXRpY19jYXN0PEZUX0NoYXJNYXA+KGNoYXJtYXApLT5wbGF0Zm9ybV9pZAorI2RlZmluZSBGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nSUQoY2hhcm1hcCkgXAorICBzdGF0aWNfY2FzdDxGVF9DaGFyTWFwPihjaGFybWFwKS0+ZW5jb2RpbmdfaWQKKyNkZWZpbmUgRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKGZhY2UpIHN0YXRpY19jYXN0PEZUX0ZhY2U+KGZhY2UpLT51bml0c19wZXJfRU0KKyNkZWZpbmUgRlhGVF9HZXRfRmFjZV94TWluKGZhY2UpIHN0YXRpY19jYXN0PEZUX0ZhY2U+KGZhY2UpLT5iYm94LnhNaW4KKyNkZWZpbmUgRlhGVF9HZXRfRmFjZV94TWF4KGZhY2UpIHN0YXRpY19jYXN0PEZUX0ZhY2U+KGZhY2UpLT5iYm94LnhNYXgKKyNkZWZpbmUgRlhGVF9HZXRfRmFjZV95TWluKGZhY2UpIHN0YXRpY19jYXN0PEZUX0ZhY2U+KGZhY2UpLT5iYm94LnlNaW4KKyNkZWZpbmUgRlhGVF9HZXRfRmFjZV95TWF4KGZhY2UpIHN0YXRpY19jYXN0PEZUX0ZhY2U+KGZhY2UpLT5iYm94LnlNYXgKKyNkZWZpbmUgRlhGVF9HZXRfRmFjZV9IZWlnaHQoZmFjZSkgc3RhdGljX2Nhc3Q8RlRfRmFjZT4oZmFjZSktPmhlaWdodAorI2RlZmluZSBGWEZUX0dldF9GYWNlX0FzY2VuZGVyKGZhY2UpIHN0YXRpY19jYXN0PEZUX0ZhY2U+KGZhY2UpLT5hc2NlbmRlcgorI2RlZmluZSBGWEZUX0dldF9GYWNlX0Rlc2NlbmRlcihmYWNlKSBzdGF0aWNfY2FzdDxGVF9GYWNlPihmYWNlKS0+ZGVzY2VuZGVyCiAjZGVmaW5lIEZYRlRfR2V0X0dseXBoX0hvcmlBZHZhbmNlKGZhY2UpIFwKLSAgKChGVF9GYWNlKWZhY2UpLT5nbHlwaC0+bWV0cmljcy5ob3JpQWR2YW5jZQorICBzdGF0aWNfY2FzdDxGVF9GYWNlPihmYWNlKS0+Z2x5cGgtPm1ldHJpY3MuaG9yaUFkdmFuY2UKICNkZWZpbmUgRlhGVF9HZXRfTU1fQXhpcyh2YXIsIGluZGV4KSAmc3RhdGljX2Nhc3Q8RlRfTU1fVmFyKj4odmFyKS0+YXhpc1tpbmRleF0KLSNkZWZpbmUgRlhGVF9HZXRfTU1fQXhpc19NaW4oYXhpcykgKChGVF9WYXJfQXhpcyopYXhpcyktPm1pbmltdW0KLSNkZWZpbmUgRlhGVF9HZXRfTU1fQXhpc19NYXgoYXhpcykgKChGVF9WYXJfQXhpcyopYXhpcyktPm1heGltdW0KLSNkZWZpbmUgRlhGVF9HZXRfTU1fQXhpc19EZWYoYXhpcykgKChGVF9WYXJfQXhpcyopYXhpcyktPmRlZgotI2RlZmluZSBGWEZUX0FsbG9jKGxpYnJhcnksIHNpemUpIFwKLSAgKChGVF9MaWJyYXJ5KWxpYnJhcnkpLT5tZW1vcnktPmFsbG9jKCgoRlRfTGlicmFyeSlsaWJyYXJ5KS0+bWVtb3J5LCBzaXplKQotI2RlZmluZSBGWEZUX0ZyZWUoZmFjZSwgcCkgXAotICAoKEZUX0ZhY2UpZmFjZSktPm1lbW9yeS0+ZnJlZSgoKEZUX0ZhY2UpZmFjZSktPm1lbW9yeSwgcCkKKyNkZWZpbmUgRlhGVF9HZXRfTU1fQXhpc19NaW4oYXhpcykgc3RhdGljX2Nhc3Q8RlRfVmFyX0F4aXMqPihheGlzKS0+bWluaW11bQorI2RlZmluZSBGWEZUX0dldF9NTV9BeGlzX01heChheGlzKSBzdGF0aWNfY2FzdDxGVF9WYXJfQXhpcyo+KGF4aXMpLT5tYXhpbXVtCisjZGVmaW5lIEZYRlRfR2V0X01NX0F4aXNfRGVmKGF4aXMpIHN0YXRpY19jYXN0PEZUX1Zhcl9BeGlzKj4oYXhpcyktPmRlZgorI2RlZmluZSBGWEZUX0ZyZWUoZmFjZSwgcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljX2Nhc3Q8RlRfRmFjZT4oZmFjZSktPm1lbW9yeS0+ZnJlZShzdGF0aWNfY2FzdDxGVF9GYWNlPihmYWNlKS0+bWVtb3J5LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCkKICNkZWZpbmUgRlhGVF9HZXRfR2x5cGhfT3V0bGluZShmYWNlKSAmc3RhdGljX2Nhc3Q8RlRfRmFjZT4oZmFjZSktPmdseXBoLT5vdXRsaW5lCi0jZGVmaW5lIEZYRlRfR2V0X091dGxpbmVfQmJveChvdXRsaW5lLCBjYm94KSBGVF9PdXRsaW5lX0dldF9DQm94KG91dGxpbmUsIGNib3gpCi0jZGVmaW5lIEZYRlRfUmVuZGVyX0dseXBoKGZhY2UsIG1vZGUpIFwKLSAgRlRfUmVuZGVyX0dseXBoKCgoRlRfRmFjZSlmYWNlKS0+Z2x5cGgsIChlbnVtIEZUX1JlbmRlcl9Nb2RlXyltb2RlKQotI2RlZmluZSBGWEZUX0dldF9NTV9WYXIoZmFjZSwgcCkgRlRfR2V0X01NX1ZhcigoRlRfRmFjZSlmYWNlLCBwKQorI2RlZmluZSBGWEZUX1JlbmRlcl9HbHlwaChmYWNlLCBtb2RlKSAgICAgICAgICAgICAgICBcCisgIEZUX1JlbmRlcl9HbHlwaChzdGF0aWNfY2FzdDxGVF9GYWNlPihmYWNlKS0+Z2x5cGgsIFwKKyAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGVudW0gRlRfUmVuZGVyX01vZGVfPihtb2RlKSkKKyNkZWZpbmUgRlhGVF9HZXRfTU1fVmFyKGZhY2UsIHApIEZUX0dldF9NTV9WYXIoc3RhdGljX2Nhc3Q8RlRfRmFjZT4oZmFjZSksIHApCiAjZGVmaW5lIEZYRlRfU2V0X01NX0Rlc2lnbl9Db29yZGluYXRlcyhmYWNlLCBuLCBwKSBcCi0gIEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMoKEZUX0ZhY2UpZmFjZSwgbiwgcCkKLSNkZWZpbmUgRlhGVF9TZXRfUGl4ZWxfU2l6ZXMoZmFjZSwgdywgaCkgRlRfU2V0X1BpeGVsX1NpemVzKChGVF9GYWNlKWZhY2UsIHcsIGgpCi0jZGVmaW5lIEZYRlRfU2V0X1RyYW5zZm9ybShmYWNlLCBtLCBkKSBGVF9TZXRfVHJhbnNmb3JtKChGVF9GYWNlKWZhY2UsIG0sIGQpCisgIEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMoc3RhdGljX2Nhc3Q8RlRfRmFjZT4oZmFjZSksIG4sIHApCisjZGVmaW5lIEZYRlRfU2V0X1BpeGVsX1NpemVzKGZhY2UsIHcsIGgpIFwKKyAgRlRfU2V0X1BpeGVsX1NpemVzKHN0YXRpY19jYXN0PEZUX0ZhY2U+KGZhY2UpLCB3LCBoKQorI2RlZmluZSBGWEZUX1NldF9UcmFuc2Zvcm0oZmFjZSwgbSwgZCkgXAorICBGVF9TZXRfVHJhbnNmb3JtKHN0YXRpY19jYXN0PEZUX0ZhY2U+KGZhY2UpLCBtLCBkKQogI2RlZmluZSBGWEZUX091dGxpbmVfRW1ib2xkZW4ob3V0bGluZSwgcykgRlRfT3V0bGluZV9FbWJvbGRlbihvdXRsaW5lLCBzKQogI2RlZmluZSBGWEZUX0dldF9HbHlwaF9CaXRtYXAoZmFjZSkgJnN0YXRpY19jYXN0PEZUX0ZhY2U+KGZhY2UpLT5nbHlwaC0+Yml0bWFwCi0jZGVmaW5lIEZYRlRfR2V0X0JpdG1hcF9XaWR0aChiaXRtYXApICgoRlRfQml0bWFwKiliaXRtYXApLT53aWR0aAotI2RlZmluZSBGWEZUX0dldF9CaXRtYXBfUm93cyhiaXRtYXApICgoRlRfQml0bWFwKiliaXRtYXApLT5yb3dzCi0jZGVmaW5lIEZYRlRfR2V0X0JpdG1hcF9QaXhlbE1vZGUoYml0bWFwKSAoKEZUX0JpdG1hcCopYml0bWFwKS0+cGl4ZWxfbW9kZQotI2RlZmluZSBGWEZUX0dldF9CaXRtYXBfUGl0Y2goYml0bWFwKSAoKEZUX0JpdG1hcCopYml0bWFwKS0+cGl0Y2gKLSNkZWZpbmUgRlhGVF9HZXRfQml0bWFwX0J1ZmZlcihiaXRtYXApICgoRlRfQml0bWFwKiliaXRtYXApLT5idWZmZXIKLSNkZWZpbmUgRlhGVF9HZXRfR2x5cGhfQml0bWFwTGVmdChmYWNlKSAoKEZUX0ZhY2UpZmFjZSktPmdseXBoLT5iaXRtYXBfbGVmdAotI2RlZmluZSBGWEZUX0dldF9HbHlwaF9CaXRtYXBUb3AoZmFjZSkgKChGVF9GYWNlKWZhY2UpLT5nbHlwaC0+Yml0bWFwX3RvcAorI2RlZmluZSBGWEZUX0dldF9CaXRtYXBfV2lkdGgoYml0bWFwKSBzdGF0aWNfY2FzdDxGVF9CaXRtYXAqPihiaXRtYXApLT53aWR0aAorI2RlZmluZSBGWEZUX0dldF9CaXRtYXBfUm93cyhiaXRtYXApIHN0YXRpY19jYXN0PEZUX0JpdG1hcCo+KGJpdG1hcCktPnJvd3MKKyNkZWZpbmUgRlhGVF9HZXRfQml0bWFwX1BpeGVsTW9kZShiaXRtYXApIFwKKyAgc3RhdGljX2Nhc3Q8RlRfQml0bWFwKj4oYml0bWFwKS0+cGl4ZWxfbW9kZQorI2RlZmluZSBGWEZUX0dldF9CaXRtYXBfUGl0Y2goYml0bWFwKSBzdGF0aWNfY2FzdDxGVF9CaXRtYXAqPihiaXRtYXApLT5waXRjaAorI2RlZmluZSBGWEZUX0dldF9CaXRtYXBfQnVmZmVyKGJpdG1hcCkgc3RhdGljX2Nhc3Q8RlRfQml0bWFwKj4oYml0bWFwKS0+YnVmZmVyCisjZGVmaW5lIEZYRlRfR2V0X0dseXBoX0JpdG1hcExlZnQoZmFjZSkgXAorICBzdGF0aWNfY2FzdDxGVF9GYWNlPihmYWNlKS0+Z2x5cGgtPmJpdG1hcF9sZWZ0CisjZGVmaW5lIEZYRlRfR2V0X0dseXBoX0JpdG1hcFRvcChmYWNlKSBcCisgIHN0YXRpY19jYXN0PEZUX0ZhY2U+KGZhY2UpLT5nbHlwaC0+Yml0bWFwX3RvcAogI2RlZmluZSBGWEZUX091dGxpbmVfRGVjb21wb3NlKG91dGxpbmUsIGZ1bmNzLCBwYXJhbXMpIFwKICAgRlRfT3V0bGluZV9EZWNvbXBvc2Uob3V0bGluZSwgZnVuY3MsIHBhcmFtcykKICNkZWZpbmUgRlhGVF9TZXRfQ2hhcl9TaXplKGZhY2UsIGNoYXJfd2lkdGgsIGNoYXJfaGVpZ2h0LCBob3J6X3Jlc29sdXRpb24sIFwKQEAgLTE3MCwxMSArMTg4LDkgQEAKICAgRlRfR2x5cGhfR2V0X0NCb3goZ2x5cGgsIGJib3hfbW9kZSwgYWNib3gpCiAjZGVmaW5lIEZYRlRfRG9uZV9HbHlwaChnbHlwaCkgRlRfRG9uZV9HbHlwaChnbHlwaCkKICNkZWZpbmUgRlhGVF9MaWJyYXJ5X1NldExjZEZpbHRlcihsaWJyYXJ5LCBmaWx0ZXIpIFwKLSAgRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXIoKEZUX0xpYnJhcnkpKGxpYnJhcnkpLCBmaWx0ZXIpCisgIEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyKHN0YXRpY19jYXN0PEZUX0xpYnJhcnk+KGxpYnJhcnkpLCBmaWx0ZXIpCisKIGludCBGWEZUX3VuaWNvZGVfZnJvbV9hZG9iZV9uYW1lKGNvbnN0IGNoYXIqIGdseXBoX25hbWUpOwogdm9pZCBGWEZUX2Fkb2JlX25hbWVfZnJvbV91bmljb2RlKGNoYXIqIG5hbWUsIHdjaGFyX3QgdW5pY29kZSk7Ci0jaWZkZWYgX19jcGx1c3BsdXMKLX07Ci0jZW5kaWYKIAogI2VuZGlmICAvLyBDT1JFX0ZYR0VfRlhfRlJFRVRZUEVfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9meF9nZV9mb250bWFwLmNwcCBiL2NvcmUvZnhnZS9meF9nZV9mb250bWFwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTNkOGFiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGdlL2Z4X2dlX2ZvbnRtYXAuY3BwCkBAIC0wLDAgKzEsODAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZm9udG1hcHBlci5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9pZnhfc3lzdGVtZm9udGluZm8uaCIKKworc3RhdGljIEJ5dGVTdHJpbmcgR2V0U3RyaW5nRnJvbVRhYmxlKGNvbnN0IHVpbnQ4X3QqIHN0cmluZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyaW5nX3B0cl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGxlbmd0aCkgeworICBpZiAoc3RyaW5nX3B0cl9sZW5ndGggPCBzdGF0aWNfY2FzdDx1aW50MzJfdD4ob2Zmc2V0ICsgbGVuZ3RoKSkgeworICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisgIH0KKyAgcmV0dXJuIEJ5dGVTdHJpbmcoc3RyaW5nX3B0ciArIG9mZnNldCwgbGVuZ3RoKTsKK30KKworQnl0ZVN0cmluZyBHZXROYW1lRnJvbVRUKGNvbnN0IHVpbnQ4X3QqIG5hbWVfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbmFtZV90YWJsZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5hbWVfaWQpIHsKKyAgaWYgKCFuYW1lX3RhYmxlIHx8IG5hbWVfdGFibGVfc2l6ZSA8IDYpIHsKKyAgICByZXR1cm4gQnl0ZVN0cmluZygpOworICB9CisgIHVpbnQzMl90IG5hbWVfY291bnQgPSBHRVRfVFRfU0hPUlQobmFtZV90YWJsZSArIDIpOworICB1aW50MzJfdCBzdHJpbmdfb2Zmc2V0ID0gR0VUX1RUX1NIT1JUKG5hbWVfdGFibGUgKyA0KTsKKyAgLy8gV2Ugd2lsbCBpZ25vcmUgdGhlIHBvc3NpYmlsaXR5IG9mIG92ZXJsYXAgb2Ygc3RydWN0dXJlcyBhbmQKKyAgLy8gc3RyaW5nIHRhYmxlIGFzIGlmIGl0J3MgYWxsIGNvcnJ1cHQgdGhlcmUncyBub3QgYSBsb3Qgd2UgY2FuIGRvLgorICBpZiAobmFtZV90YWJsZV9zaXplIDwgc3RyaW5nX29mZnNldCkgeworICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisgIH0KKworICBjb25zdCB1aW50OF90KiBzdHJpbmdfcHRyID0gbmFtZV90YWJsZSArIHN0cmluZ19vZmZzZXQ7CisgIHVpbnQzMl90IHN0cmluZ19wdHJfc2l6ZSA9IG5hbWVfdGFibGVfc2l6ZSAtIHN0cmluZ19vZmZzZXQ7CisgIG5hbWVfdGFibGUgKz0gNjsKKyAgbmFtZV90YWJsZV9zaXplIC09IDY7CisgIGlmIChuYW1lX3RhYmxlX3NpemUgPCBuYW1lX2NvdW50ICogMTIpIHsKKyAgICByZXR1cm4gQnl0ZVN0cmluZygpOworICB9CisKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5hbWVfY291bnQ7IGkrKywgbmFtZV90YWJsZSArPSAxMikgeworICAgIGlmIChHRVRfVFRfU0hPUlQobmFtZV90YWJsZSArIDYpID09IG5hbWVfaWQgJiYKKyAgICAgICAgR0VUX1RUX1NIT1JUKG5hbWVfdGFibGUpID09IDEgJiYgR0VUX1RUX1NIT1JUKG5hbWVfdGFibGUgKyAyKSA9PSAwKSB7CisgICAgICByZXR1cm4gR2V0U3RyaW5nRnJvbVRhYmxlKHN0cmluZ19wdHIsIHN0cmluZ19wdHJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VUX1RUX1NIT1JUKG5hbWVfdGFibGUgKyAxMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9UVF9TSE9SVChuYW1lX3RhYmxlICsgOCkpOworICAgIH0KKyAgfQorICByZXR1cm4gQnl0ZVN0cmluZygpOworfQorI2lmZGVmIFBERl9FTkFCTEVfWEZBCit2b2lkKiBJRlhfU3lzdGVtRm9udEluZm86Ok1hcEZvbnRCeVVuaWNvZGUodWludDMyX3QgZHdVbmljb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHkpIHsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKK2ludCBJRlhfU3lzdGVtRm9udEluZm86OkdldEZhY2VJbmRleCh2b2lkKiBoRm9udCkgeworICByZXR1cm4gMDsKK30KKworZXh0ZXJuICJDIiB7Cit1bnNpZ25lZCBsb25nIF9GVFN0cmVhbVJlYWQoRlhGVF9TdHJlYW0gc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNvdW50KTsKK3ZvaWQgX0ZUU3RyZWFtQ2xvc2UoRlhGVF9TdHJlYW0gc3RyZWFtKTsKK307CisKKyNpZiBfRlhfT1NfID09IF9GWF9PU19BTkRST0lEXworc3RkOjp1bmlxdWVfcHRyPElGWF9TeXN0ZW1Gb250SW5mbz4gSUZYX1N5c3RlbUZvbnRJbmZvOjpDcmVhdGVEZWZhdWx0KAorICAgIGNvbnN0IGNoYXIqKiBwVW51c2VkKSB7CisgIHJldHVybiBudWxscHRyOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZnhfZ2VfbGludXguY3BwIGIvY29yZS9meGdlL2Z4X2dlX2xpbnV4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTA2OWYzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS9meGdlL2Z4X2dlX2xpbnV4LmNwcApAQCAtMCwwICsxLDE2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2NvZGVwYWdlLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mb2xkZXJmb250aW5mby5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZm9udG1nci5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZ2Vtb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvaWZ4X3N5c3RlbWZvbnRpbmZvLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fTElOVVhfCituYW1lc3BhY2UgeworCitjb25zdCBzaXplX3Qga0xpbnV4R3BOYW1lU2l6ZSA9IDY7CisKK2NvbnN0IGNoYXIqIGNvbnN0IGdfTGludXhHcEZvbnRMaXN0W11ba0xpbnV4R3BOYW1lU2l6ZV0gPSB7CisgICAgeyJUYWthb1BHb3RoaWMiLCAiVkwgUEdvdGhpYyIsICJJUEFQR290aGljIiwgIlZMIEdvdGhpYyIsICJLb2NoaSBHb3RoaWMiLAorICAgICAiVkwgR290aGljIHJlZ3VsYXIifSwKKyAgICB7IlRha2FvR290aGljIiwgIlZMIEdvdGhpYyIsICJJUEFHb3RoaWMiLCAiS29jaGkgR290aGljIiwgbnVsbHB0ciwKKyAgICAgIlZMIEdvdGhpYyByZWd1bGFyIn0sCisgICAgeyJUYWthb1BNaW5jaG8iLCAiSVBBUE1pbmNobyIsICJWTCBHb3RoaWMiLCAiS29jaGkgTWluY2hvIiwgbnVsbHB0ciwKKyAgICAgIlZMIEdvdGhpYyByZWd1bGFyIn0sCisgICAgeyJUYWthb01pbmNobyIsICJJUEFNaW5jaG8iLCAiVkwgR290aGljIiwgIktvY2hpIE1pbmNobyIsIG51bGxwdHIsCisgICAgICJWTCBHb3RoaWMgcmVndWxhciJ9LAorfTsKKworY29uc3QgY2hhciogY29uc3QgZ19MaW51eEdiRm9udExpc3RbXSA9IHsKKyAgICAiQVIgUEwgVU1pbmcgQ04gTGlnaHQiLCAiV2VuUXVhbllpIE1pY3JvIEhlaSIsICJBUiBQTCBVS2FpIENOIiwKK307CisKK2NvbnN0IGNoYXIqIGNvbnN0IGdfTGludXhCNUZvbnRMaXN0W10gPSB7CisgICAgIkFSIFBMIFVNaW5nIFRXIExpZ2h0IiwgIldlblF1YW5ZaSBNaWNybyBIZWkiLCAiQVIgUEwgVUthaSBUVyIsCit9OworCitjb25zdCBjaGFyKiBjb25zdCBnX0xpbnV4SEdGb250TGlzdFtdID0geworICAgICJVbkRvdHVtIiwKK307CisKK3NpemVfdCBHZXRKYXBhbmVzZVByZWZlcmVuY2UoY29uc3QgY2hhciogZmFjZWFyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSkgeworICBCeXRlU3RyaW5nIGZhY2UgPSBmYWNlYXJyOworICBpZiAoZmFjZS5Db250YWlucygiR290aGljIikgfHwKKyAgICAgIGZhY2UuQ29udGFpbnMoIlx4ODNceDUzXHg4M1x4NTZceDgzXHg2Mlx4ODNceDRlIikpIHsKKyAgICBpZiAoZmFjZS5Db250YWlucygiUEdvdGhpYyIpIHx8CisgICAgICAgIGZhY2UuQ29udGFpbnMoIlx4ODJceDZmXHg4M1x4NTNceDgzXHg1Nlx4ODNceDYyXHg4M1x4NGUiKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiAxOworICB9CisgIGlmIChmYWNlLkNvbnRhaW5zKCJNaW5jaG8iKSB8fCBmYWNlLkNvbnRhaW5zKCJceDk2XHhiZVx4OTJceGE5IikpIHsKKyAgICBpZiAoZmFjZS5Db250YWlucygiUE1pbmNobyIpIHx8IGZhY2UuQ29udGFpbnMoIlx4ODJceDZmXHg5Nlx4YmVceDkyXHhhOSIpKSB7CisgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDM7CisgIH0KKyAgaWYgKCFGb250RmFtaWx5SXNSb21hbihwaXRjaF9mYW1pbHkpICYmIHdlaWdodCA+IDQwMCkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gMjsKK30KKworY2xhc3MgQ0ZYX0xpbnV4Rm9udEluZm8gOiBwdWJsaWMgQ0ZYX0ZvbGRlckZvbnRJbmZvIHsKKyBwdWJsaWM6CisgIENGWF9MaW51eEZvbnRJbmZvKCkge30KKyAgfkNGWF9MaW51eEZvbnRJbmZvKCkgb3ZlcnJpZGUge30KKworICB2b2lkKiBNYXBGb250KGludCB3ZWlnaHQsCisgICAgICAgICAgICAgICAgYm9vbCBiSXRhbGljLAorICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAorICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmFtaWx5KSBvdmVycmlkZTsKKyAgYm9vbCBQYXJzZUZvbnRDZmcoY29uc3QgY2hhcioqIHBVc2VyUGF0aHMpOworfTsKKwordm9pZCogQ0ZYX0xpbnV4Rm9udEluZm86Ok1hcEZvbnQoaW50IHdlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNzdHJfZmFjZSkgeworICB2b2lkKiBmb250ID0gR2V0U3Vic3RGb250KGNzdHJfZmFjZSk7CisgIGlmIChmb250KQorICAgIHJldHVybiBmb250OworCisgIGJvb2wgYkNKSyA9IHRydWU7CisgIHN3aXRjaCAoY2hhcnNldCkgeworICAgIGNhc2UgRlhfQ0hBUlNFVF9TaGlmdEpJUzogeworICAgICAgc2l6ZV90IGluZGV4ID0gR2V0SmFwYW5lc2VQcmVmZXJlbmNlKGNzdHJfZmFjZSwgd2VpZ2h0LCBwaXRjaF9mYW1pbHkpOworICAgICAgQVNTRVJUKGluZGV4IDwgRlhfQXJyYXlTaXplKGdfTGludXhHcEZvbnRMaXN0KSk7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtMaW51eEdwTmFtZVNpemU7IGkrKykgeworICAgICAgICBhdXRvIGl0ID0gbV9Gb250TGlzdC5maW5kKGdfTGludXhHcEZvbnRMaXN0W2luZGV4XVtpXSk7CisgICAgICAgIGlmIChpdCAhPSBtX0ZvbnRMaXN0LmVuZCgpKQorICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kLmdldCgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRlhfQ0hBUlNFVF9DaGluZXNlU2ltcGxpZmllZDogeworICAgICAgZm9yIChjb25zdCBjaGFyKiBuYW1lIDogZ19MaW51eEdiRm9udExpc3QpIHsKKyAgICAgICAgYXV0byBpdCA9IG1fRm9udExpc3QuZmluZChuYW1lKTsKKyAgICAgICAgaWYgKGl0ICE9IG1fRm9udExpc3QuZW5kKCkpCisgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQuZ2V0KCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGWF9DSEFSU0VUX0NoaW5lc2VUcmFkaXRpb25hbDogeworICAgICAgZm9yIChjb25zdCBjaGFyKiBuYW1lIDogZ19MaW51eEI1Rm9udExpc3QpIHsKKyAgICAgICAgYXV0byBpdCA9IG1fRm9udExpc3QuZmluZChuYW1lKTsKKyAgICAgICAgaWYgKGl0ICE9IG1fRm9udExpc3QuZW5kKCkpCisgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQuZ2V0KCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGWF9DSEFSU0VUX0hhbmd1bDogeworICAgICAgZm9yIChjb25zdCBjaGFyKiBuYW1lIDogZ19MaW51eEhHRm9udExpc3QpIHsKKyAgICAgICAgYXV0byBpdCA9IG1fRm9udExpc3QuZmluZChuYW1lKTsKKyAgICAgICAgaWYgKGl0ICE9IG1fRm9udExpc3QuZW5kKCkpCisgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQuZ2V0KCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJDSksgPSBmYWxzZTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBGaW5kRm9udCh3ZWlnaHQsIGJJdGFsaWMsIGNoYXJzZXQsIHBpdGNoX2ZhbWlseSwgY3N0cl9mYWNlLCAhYkNKSyk7Cit9CisKK2Jvb2wgQ0ZYX0xpbnV4Rm9udEluZm86OlBhcnNlRm9udENmZyhjb25zdCBjaGFyKiogcFVzZXJQYXRocykgeworICBpZiAoIXBVc2VyUGF0aHMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZvciAoY29uc3QgY2hhcioqIHBQYXRoID0gcFVzZXJQYXRoczsgKnBQYXRoOyArK3BQYXRoKQorICAgIEFkZFBhdGgoKnBQYXRoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitzdGQ6OnVuaXF1ZV9wdHI8SUZYX1N5c3RlbUZvbnRJbmZvPiBJRlhfU3lzdGVtRm9udEluZm86OkNyZWF0ZURlZmF1bHQoCisgICAgY29uc3QgY2hhcioqIHBVc2VyUGF0aHMpIHsKKyAgYXV0byBwSW5mbyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfTGludXhGb250SW5mbz4oKTsKKyAgaWYgKCFwSW5mby0+UGFyc2VGb250Q2ZnKHBVc2VyUGF0aHMpKSB7CisgICAgcEluZm8tPkFkZFBhdGgoIi91c3Ivc2hhcmUvZm9udHMiKTsKKyAgICBwSW5mby0+QWRkUGF0aCgiL3Vzci9zaGFyZS9YMTEvZm9udHMvVHlwZTEiKTsKKyAgICBwSW5mby0+QWRkUGF0aCgiL3Vzci9zaGFyZS9YMTEvZm9udHMvVFRGIik7CisgICAgcEluZm8tPkFkZFBhdGgoIi91c3IvbG9jYWwvc2hhcmUvZm9udHMiKTsKKyAgfQorICByZXR1cm4gc3RkOjptb3ZlKHBJbmZvKTsKK30KKwordm9pZCBDRlhfR0VNb2R1bGU6OkluaXRQbGF0Zm9ybSgpIHsKKyAgbV9wRm9udE1nci0+U2V0U3lzdGVtRm9udEluZm8oCisgICAgICBJRlhfU3lzdGVtRm9udEluZm86OkNyZWF0ZURlZmF1bHQobV9wVXNlckZvbnRQYXRocykpOworfQorCit2b2lkIENGWF9HRU1vZHVsZTo6RGVzdHJveVBsYXRmb3JtKCkge30KKyNlbmRpZiAgLy8gX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fTElOVVhfCmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZnhfZ2VfdGV4dC5jcHAgYi9jb3JlL2Z4Z2UvZnhfZ2VfdGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ3ZTcxMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvZnhnZS9meF9nZV90ZXh0LmNwcApAQCAtMCwwICsxLDEwNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3BhdGhkYXRhLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZvbnQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvaWZ4X3JlbmRlcmRldmljZWRyaXZlci5oIgorCituYW1lc3BhY2UgeworCit2b2lkIFJlc2V0VHJhbnNmb3JtKEZUX0ZhY2UgZmFjZSkgeworICBGWEZUX01hdHJpeCBtYXRyaXg7CisgIG1hdHJpeC54eCA9IDB4MTAwMDBMOworICBtYXRyaXgueHkgPSAwOworICBtYXRyaXgueXggPSAwOworICBtYXRyaXgueXkgPSAweDEwMDAwTDsKKyAgRlhGVF9TZXRfVHJhbnNmb3JtKGZhY2UsICZtYXRyaXgsIDApOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworRlhURVhUX0dMWVBIUE9TOjpGWFRFWFRfR0xZUEhQT1MoKSA6IG1fcEdseXBoKG51bGxwdHIpIHt9CisKK0ZYVEVYVF9HTFlQSFBPUzo6RlhURVhUX0dMWVBIUE9TKGNvbnN0IEZYVEVYVF9HTFlQSFBPUyYpID0gZGVmYXVsdDsKKworRlhURVhUX0dMWVBIUE9TOjp+RlhURVhUX0dMWVBIUE9TKCl7fTsKKworU2NvcGVkRm9udFRyYW5zZm9ybTo6U2NvcGVkRm9udFRyYW5zZm9ybShGVF9GYWNlIGZhY2UsIEZYRlRfTWF0cml4KiBtYXRyaXgpCisgICAgOiBtX0ZhY2UoZmFjZSkgeworICBGWEZUX1NldF9UcmFuc2Zvcm0obV9GYWNlLCBtYXRyaXgsIDApOworfQorCitTY29wZWRGb250VHJhbnNmb3JtOjp+U2NvcGVkRm9udFRyYW5zZm9ybSgpIHsKKyAgUmVzZXRUcmFuc2Zvcm0obV9GYWNlKTsKK30KKworRlhfUkVDVCBGWEdFX0dldEdseXBoc0JCb3goY29uc3Qgc3RkOjp2ZWN0b3I8RlhURVhUX0dMWVBIUE9TPiYgZ2x5cGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFudGlfYWxpYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByZXRpbmFTY2FsZVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByZXRpbmFTY2FsZVkpIHsKKyAgRlhfUkVDVCByZWN0KDAsIDAsIDAsIDApOworICBib29sIGJTdGFydGVkID0gZmFsc2U7CisgIGZvciAoY29uc3QgRlhURVhUX0dMWVBIUE9TJiBnbHlwaCA6IGdseXBocykgeworICAgIGNvbnN0IENGWF9HbHlwaEJpdG1hcCogcEdseXBoID0gZ2x5cGgubV9wR2x5cGg7CisgICAgaWYgKCFwR2x5cGgpCisgICAgICBjb250aW51ZTsKKworICAgIEZYX1NBRkVfSU5UMzIgY2hhcl9sZWZ0ID0gZ2x5cGgubV9PcmlnaW4ueDsKKyAgICBjaGFyX2xlZnQgKz0gcEdseXBoLT5tX0xlZnQ7CisgICAgaWYgKCFjaGFyX2xlZnQuSXNWYWxpZCgpKQorICAgICAgY29udGludWU7CisKKyAgICBGWF9TQUZFX0lOVDMyIGNoYXJfd2lkdGggPSBwR2x5cGgtPm1fcEJpdG1hcC0+R2V0V2lkdGgoKTsKKyAgICBjaGFyX3dpZHRoIC89IHJldGluYVNjYWxlWDsKKyAgICBpZiAoYW50aV9hbGlhcyA9PSBGWEZUX1JFTkRFUl9NT0RFX0xDRCkKKyAgICAgIGNoYXJfd2lkdGggLz0gMzsKKyAgICBpZiAoIWNoYXJfd2lkdGguSXNWYWxpZCgpKQorICAgICAgY29udGludWU7CisKKyAgICBGWF9TQUZFX0lOVDMyIGNoYXJfcmlnaHQgPSBjaGFyX2xlZnQgKyBjaGFyX3dpZHRoOworICAgIGlmICghY2hhcl9yaWdodC5Jc1ZhbGlkKCkpCisgICAgICBjb250aW51ZTsKKworICAgIEZYX1NBRkVfSU5UMzIgY2hhcl90b3AgPSBnbHlwaC5tX09yaWdpbi55OworICAgIGNoYXJfdG9wIC09IHBHbHlwaC0+bV9Ub3A7CisgICAgaWYgKCFjaGFyX3RvcC5Jc1ZhbGlkKCkpCisgICAgICBjb250aW51ZTsKKworICAgIEZYX1NBRkVfSU5UMzIgY2hhcl9oZWlnaHQgPSBwR2x5cGgtPm1fcEJpdG1hcC0+R2V0SGVpZ2h0KCk7CisgICAgY2hhcl9oZWlnaHQgLz0gcmV0aW5hU2NhbGVZOworICAgIGlmICghY2hhcl9oZWlnaHQuSXNWYWxpZCgpKQorICAgICAgY29udGludWU7CisKKyAgICBGWF9TQUZFX0lOVDMyIGNoYXJfYm90dG9tID0gY2hhcl90b3AgKyBjaGFyX2hlaWdodDsKKyAgICBpZiAoIWNoYXJfYm90dG9tLklzVmFsaWQoKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKGJTdGFydGVkKSB7CisgICAgICByZWN0LmxlZnQgPSBwZGZpdW06OmJhc2U6OlZhbHVlT3JEaWVGb3JUeXBlPGludDMyX3Q+KAorICAgICAgICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tNaW4ocmVjdC5sZWZ0LCBjaGFyX2xlZnQpKTsKKyAgICAgIHJlY3QucmlnaHQgPSBwZGZpdW06OmJhc2U6OlZhbHVlT3JEaWVGb3JUeXBlPGludDMyX3Q+KAorICAgICAgICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tNYXgocmVjdC5yaWdodCwgY2hhcl9yaWdodCkpOworICAgICAgcmVjdC50b3AgPSBwZGZpdW06OmJhc2U6OlZhbHVlT3JEaWVGb3JUeXBlPGludDMyX3Q+KAorICAgICAgICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tNaW4ocmVjdC50b3AsIGNoYXJfdG9wKSk7CisgICAgICByZWN0LmJvdHRvbSA9IHBkZml1bTo6YmFzZTo6VmFsdWVPckRpZUZvclR5cGU8aW50MzJfdD4oCisgICAgICAgICAgcGRmaXVtOjpiYXNlOjpDaGVja01heChyZWN0LmJvdHRvbSwgY2hhcl9ib3R0b20pKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHJlY3QubGVmdCA9IGNoYXJfbGVmdC5WYWx1ZU9yRGllKCk7CisgICAgcmVjdC5yaWdodCA9IGNoYXJfcmlnaHQuVmFsdWVPckRpZSgpOworICAgIHJlY3QudG9wID0gY2hhcl90b3AuVmFsdWVPckRpZSgpOworICAgIHJlY3QuYm90dG9tID0gY2hhcl9ib3R0b20uVmFsdWVPckRpZSgpOworICAgIGJTdGFydGVkID0gdHJ1ZTsKKyAgfQorICByZXR1cm4gcmVjdDsKK30KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9nZS9meF9nZV90ZXh0X2VtYmVkZGVydGVzdC5jcHAgYi9jb3JlL2Z4Z2UvZnhfZ2VfdGV4dF9lbWJlZGRlcnRlc3QuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjb3JlL2Z4Z2UvZ2UvZnhfZ2VfdGV4dF9lbWJlZGRlcnRlc3QuY3BwCnJlbmFtZSB0byBjb3JlL2Z4Z2UvZnhfZ2VfdGV4dF9lbWJlZGRlcnRlc3QuY3BwCmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZ2UvY2Z4X2NsaXByZ24uY3BwIGIvY29yZS9meGdlL2dlL2NmeF9jbGlwcmduLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEzZWI1MS4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Z2UvZ2UvY2Z4X2NsaXByZ24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImNvcmUvZnhnZS9nZS9jZnhfY2xpcHJnbi5oIgotCi1DRlhfQ2xpcFJnbjo6Q0ZYX0NsaXBSZ24oaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQotICAgIDogbV9UeXBlKFJlY3RJKSwgbV9Cb3goMCwgMCwgd2lkdGgsIGhlaWdodCkge30KLQotQ0ZYX0NsaXBSZ246OkNGWF9DbGlwUmduKGNvbnN0IENGWF9DbGlwUmduJiBzcmMpIHsKLSAgbV9UeXBlID0gc3JjLm1fVHlwZTsKLSAgbV9Cb3ggPSBzcmMubV9Cb3g7Ci0gIG1fTWFzayA9IHNyYy5tX01hc2s7Ci19Ci0KLUNGWF9DbGlwUmduOjp+Q0ZYX0NsaXBSZ24oKSB7fQotCi12b2lkIENGWF9DbGlwUmduOjpSZXNldChjb25zdCBGWF9SRUNUJiByZWN0KSB7Ci0gIG1fVHlwZSA9IFJlY3RJOwotICBtX0JveCA9IHJlY3Q7Ci0gIG1fTWFzay5TZXROdWxsKCk7Ci19Ci0KLXZvaWQgQ0ZYX0NsaXBSZ246OkludGVyc2VjdFJlY3QoY29uc3QgRlhfUkVDVCYgcmVjdCkgewotICBpZiAobV9UeXBlID09IFJlY3RJKSB7Ci0gICAgbV9Cb3guSW50ZXJzZWN0KHJlY3QpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAobV9UeXBlID09IE1hc2tGKSB7Ci0gICAgSW50ZXJzZWN0TWFza1JlY3QocmVjdCwgbV9Cb3gsIG1fTWFzayk7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLXZvaWQgQ0ZYX0NsaXBSZ246OkludGVyc2VjdE1hc2tSZWN0KEZYX1JFQ1QgcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QgbWFza19yZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwUmVmIE1hc2spIHsKLSAgY29uc3QgQ0ZYX0RJQml0bWFwKiBtYXNrX2RpYiA9IE1hc2suR2V0T2JqZWN0KCk7Ci0gIG1fVHlwZSA9IE1hc2tGOwotICBtX0JveCA9IHJlY3Q7Ci0gIG1fQm94LkludGVyc2VjdChtYXNrX3JlY3QpOwotICBpZiAobV9Cb3guSXNFbXB0eSgpKSB7Ci0gICAgbV9UeXBlID0gUmVjdEk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChtX0JveCA9PSBtYXNrX3JlY3QpIHsKLSAgICBtX01hc2sgPSBNYXNrOwotICAgIHJldHVybjsKLSAgfQotICBDRlhfRElCaXRtYXAqIG5ld19kaWIgPSBtX01hc2suRW1wbGFjZSgpOwotICBuZXdfZGliLT5DcmVhdGUobV9Cb3guV2lkdGgoKSwgbV9Cb3guSGVpZ2h0KCksIEZYRElCXzhicHBNYXNrKTsKLSAgZm9yIChpbnQgcm93ID0gbV9Cb3gudG9wOyByb3cgPCBtX0JveC5ib3R0b207IHJvdysrKSB7Ci0gICAgdWludDhfdCogZGVzdF9zY2FuID0KLSAgICAgICAgbmV3X2RpYi0+R2V0QnVmZmVyKCkgKyBuZXdfZGliLT5HZXRQaXRjaCgpICogKHJvdyAtIG1fQm94LnRvcCk7Ci0gICAgdWludDhfdCogc3JjX3NjYW4gPQotICAgICAgICBtYXNrX2RpYi0+R2V0QnVmZmVyKCkgKyBtYXNrX2RpYi0+R2V0UGl0Y2goKSAqIChyb3cgLSBtYXNrX3JlY3QudG9wKTsKLSAgICBmb3IgKGludCBjb2wgPSBtX0JveC5sZWZ0OyBjb2wgPCBtX0JveC5yaWdodDsgY29sKyspCi0gICAgICBkZXN0X3NjYW5bY29sIC0gbV9Cb3gubGVmdF0gPSBzcmNfc2Nhbltjb2wgLSBtYXNrX3JlY3QubGVmdF07Ci0gIH0KLX0KLQotdm9pZCBDRlhfQ2xpcFJnbjo6SW50ZXJzZWN0TWFza0YoaW50IGxlZnQsIGludCB0b3AsIENGWF9ESUJpdG1hcFJlZiBNYXNrKSB7Ci0gIGNvbnN0IENGWF9ESUJpdG1hcCogbWFza19kaWIgPSBNYXNrLkdldE9iamVjdCgpOwotICBBU1NFUlQobWFza19kaWItPkdldEZvcm1hdCgpID09IEZYRElCXzhicHBNYXNrKTsKLSAgRlhfUkVDVCBtYXNrX2JveChsZWZ0LCB0b3AsIGxlZnQgKyBtYXNrX2RpYi0+R2V0V2lkdGgoKSwKLSAgICAgICAgICAgICAgICAgICB0b3AgKyBtYXNrX2RpYi0+R2V0SGVpZ2h0KCkpOwotICBpZiAobV9UeXBlID09IFJlY3RJKSB7Ci0gICAgSW50ZXJzZWN0TWFza1JlY3QobV9Cb3gsIG1hc2tfYm94LCBNYXNrKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKG1fVHlwZSA9PSBNYXNrRikgewotICAgIEZYX1JFQ1QgbmV3X2JveCA9IG1fQm94OwotICAgIG5ld19ib3guSW50ZXJzZWN0KG1hc2tfYm94KTsKLSAgICBpZiAobmV3X2JveC5Jc0VtcHR5KCkpIHsKLSAgICAgIG1fVHlwZSA9IFJlY3RJOwotICAgICAgbV9NYXNrLlNldE51bGwoKTsKLSAgICAgIG1fQm94ID0gbmV3X2JveDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQ0ZYX0RJQml0bWFwUmVmIG5ld19tYXNrOwotICAgIENGWF9ESUJpdG1hcCogbmV3X2RpYiA9IG5ld19tYXNrLkVtcGxhY2UoKTsKLSAgICBuZXdfZGliLT5DcmVhdGUobmV3X2JveC5XaWR0aCgpLCBuZXdfYm94LkhlaWdodCgpLCBGWERJQl84YnBwTWFzayk7Ci0gICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBvbGRfZGliID0gbV9NYXNrLkdldE9iamVjdCgpOwotICAgIGZvciAoaW50IHJvdyA9IG5ld19ib3gudG9wOyByb3cgPCBuZXdfYm94LmJvdHRvbTsgcm93KyspIHsKLSAgICAgIHVpbnQ4X3QqIG9sZF9zY2FuID0KLSAgICAgICAgICBvbGRfZGliLT5HZXRCdWZmZXIoKSArIChyb3cgLSBtX0JveC50b3ApICogb2xkX2RpYi0+R2V0UGl0Y2goKTsKLSAgICAgIHVpbnQ4X3QqIG1hc2tfc2NhbiA9Ci0gICAgICAgICAgbWFza19kaWItPkdldEJ1ZmZlcigpICsgKHJvdyAtIHRvcCkgKiBtYXNrX2RpYi0+R2V0UGl0Y2goKTsKLSAgICAgIHVpbnQ4X3QqIG5ld19zY2FuID0KLSAgICAgICAgICBuZXdfZGliLT5HZXRCdWZmZXIoKSArIChyb3cgLSBuZXdfYm94LnRvcCkgKiBuZXdfZGliLT5HZXRQaXRjaCgpOwotICAgICAgZm9yIChpbnQgY29sID0gbmV3X2JveC5sZWZ0OyBjb2wgPCBuZXdfYm94LnJpZ2h0OyBjb2wrKykgewotICAgICAgICBuZXdfc2Nhbltjb2wgLSBuZXdfYm94LmxlZnRdID0KLSAgICAgICAgICAgIG9sZF9zY2FuW2NvbCAtIG1fQm94LmxlZnRdICogbWFza19zY2FuW2NvbCAtIGxlZnRdIC8gMjU1OwotICAgICAgfQotICAgIH0KLSAgICBtX0JveCA9IG5ld19ib3g7Ci0gICAgbV9NYXNrID0gbmV3X21hc2s7Ci0gICAgcmV0dXJuOwotICB9Ci0gIEFTU0VSVChmYWxzZSk7Ci19CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZ2UvY2Z4X2NsaXByZ24uaCBiL2NvcmUvZnhnZS9nZS9jZnhfY2xpcHJnbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2ZkNTg1Li4wMDAwMDAwCi0tLSBhL2NvcmUvZnhnZS9nZS9jZnhfY2xpcHJnbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlhHRV9HRV9DRlhfQ0xJUFJHTl9IXwotI2RlZmluZSBDT1JFX0ZYR0VfR0VfQ0ZYX0NMSVBSR05fSF8KLQotI2luY2x1ZGUgImNvcmUvZnhnZS9meF9kaWIuaCIKLQotY2xhc3MgQ0ZYX0NsaXBSZ24gewotIHB1YmxpYzoKLSAgZW51bSBDbGlwVHlwZSB7IFJlY3RJLCBNYXNrRiB9OwotCi0gIENGWF9DbGlwUmduKGludCBkZXZpY2Vfd2lkdGgsIGludCBkZXZpY2VfaGVpZ2h0KTsKLSAgQ0ZYX0NsaXBSZ24oY29uc3QgQ0ZYX0NsaXBSZ24mIHNyYyk7Ci0gIH5DRlhfQ2xpcFJnbigpOwotCi0gIENsaXBUeXBlIEdldFR5cGUoKSBjb25zdCB7IHJldHVybiBtX1R5cGU7IH0KLSAgY29uc3QgRlhfUkVDVCYgR2V0Qm94KCkgY29uc3QgeyByZXR1cm4gbV9Cb3g7IH0KLSAgQ0ZYX0RJQml0bWFwUmVmIEdldE1hc2soKSBjb25zdCB7IHJldHVybiBtX01hc2s7IH0KLQotICB2b2lkIFJlc2V0KGNvbnN0IEZYX1JFQ1QmIHJlY3QpOwotICB2b2lkIEludGVyc2VjdFJlY3QoY29uc3QgRlhfUkVDVCYgcmVjdCk7Ci0gIHZvaWQgSW50ZXJzZWN0TWFza0YoaW50IGxlZnQsIGludCB0b3AsIENGWF9ESUJpdG1hcFJlZiBNYXNrKTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgSW50ZXJzZWN0TWFza1JlY3QoRlhfUkVDVCByZWN0LCBGWF9SRUNUIG1hc2tfYm94LCBDRlhfRElCaXRtYXBSZWYgTWFzayk7Ci0KLSAgQ2xpcFR5cGUgbV9UeXBlOwotICBGWF9SRUNUIG1fQm94OwotICBDRlhfRElCaXRtYXBSZWYgbV9NYXNrOwotfTsKLQotI2VuZGlmICAvLyBDT1JFX0ZYR0VfR0VfQ0ZYX0NMSVBSR05fSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9nZS9jZnhfZmFjZWNhY2hlLmNwcCBiL2NvcmUvZnhnZS9nZS9jZnhfZmFjZWNhY2hlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0Yzk1Yi4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Z2UvZ2UvY2Z4X2ZhY2VjYWNoZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mYWNlY2FjaGUuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxsaW1pdHM+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mb250bWdyLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9nZW1vZHVsZS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcGF0aGRhdGEuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3N1YnN0Zm9udC5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mcmVldHlwZS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9nZS9meF90ZXh0X2ludC5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9tYXRoLmgiCi0KLSNpZiBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfIHx8IF9TS0lBX1NVUFBPUlRfUEFUSFNfCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2NvcmUvU2tTdHJlYW0uaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZS9Ta1R5cGVmYWNlLmgiCi0jZW5kaWYKLQotbmFtZXNwYWNlIHsKLQotY29uc3RleHByIHVpbnQzMl90IGtJbnZhbGlkR2x5cGhJbmRleCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigtMSk7Ci0KLXZvaWQgR2FtbWFBZGp1c3QodWludDhfdCogcERhdGEsCi0gICAgICAgICAgICAgICAgIGludCBuSGVpZ2h0LAotICAgICAgICAgICAgICAgICBpbnQgc3JjX3BpdGNoLAotICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBnYW1tYVRhYmxlKSB7Ci0gIGludCBjb3VudCA9IG5IZWlnaHQgKiBzcmNfcGl0Y2g7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICBwRGF0YVtpXSA9IGdhbW1hVGFibGVbcERhdGFbaV1dOwotfQotCi12b2lkIENvbnRyYXN0QWRqdXN0KHVpbnQ4X3QqIHBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICBpbnQgbldpZHRoLAotICAgICAgICAgICAgICAgICAgICBpbnQgbkhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgaW50IG5TcmNSb3dCeXRlcywKLSAgICAgICAgICAgICAgICAgICAgaW50IG5Ec3RSb3dCeXRlcykgewotICBpbnQgY29sLCByb3csIHRlbXA7Ci0gIGludCBtYXggPSAwLCBtaW4gPSAyNTU7Ci0gIEZYX0ZMT0FUIHJhdGU7Ci0gIGZvciAocm93ID0gMDsgcm93IDwgbkhlaWdodDsgcm93KyspIHsKLSAgICB1aW50OF90KiBwUm93ID0gcERhdGFJbiArIHJvdyAqIG5TcmNSb3dCeXRlczsKLSAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG5XaWR0aDsgY29sKyspIHsKLSAgICAgIHRlbXAgPSAqcFJvdysrOwotICAgICAgbWF4ID0gc3RkOjptYXgodGVtcCwgbWF4KTsKLSAgICAgIG1pbiA9IHN0ZDo6bWluKHRlbXAsIG1pbik7Ci0gICAgfQotICB9Ci0gIHRlbXAgPSBtYXggLSBtaW47Ci0gIGlmICh0ZW1wID09IDAgfHwgdGVtcCA9PSAyNTUpIHsKLSAgICBpbnQgcm93Ynl0ZXMgPSBzdGQ6Om1pbihGWFNZU19hYnMoblNyY1Jvd0J5dGVzKSwgbkRzdFJvd0J5dGVzKTsKLSAgICBmb3IgKHJvdyA9IDA7IHJvdyA8IG5IZWlnaHQ7IHJvdysrKSB7Ci0gICAgICBGWFNZU19tZW1jcHkocERhdGFPdXQgKyByb3cgKiBuRHN0Um93Qnl0ZXMsIHBEYXRhSW4gKyByb3cgKiBuU3JjUm93Qnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgcm93Ynl0ZXMpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLSAgcmF0ZSA9IDI1NS5mIC8gdGVtcDsKLSAgZm9yIChyb3cgPSAwOyByb3cgPCBuSGVpZ2h0OyByb3crKykgewotICAgIHVpbnQ4X3QqIHBTcmNSb3cgPSBwRGF0YUluICsgcm93ICogblNyY1Jvd0J5dGVzOwotICAgIHVpbnQ4X3QqIHBEc3RSb3cgPSBwRGF0YU91dCArIHJvdyAqIG5Ec3RSb3dCeXRlczsKLSAgICBmb3IgKGNvbCA9IDA7IGNvbCA8IG5XaWR0aDsgY29sKyspIHsKLSAgICAgIHRlbXAgPSBzdGF0aWNfY2FzdDxpbnQ+KCgqKHBTcmNSb3crKykgLSBtaW4pICogcmF0ZSArIDAuNSk7Ci0gICAgICB0ZW1wID0gc3RkOjptaW4odGVtcCwgMjU1KTsKLSAgICAgIHRlbXAgPSBzdGQ6Om1heCh0ZW1wLCAwKTsKLSAgICAgICpwRHN0Um93KysgPSAodWludDhfdCl0ZW1wOwotICAgIH0KLSAgfQotfQotfSAgLy8gbmFtZXNwYWNlCi0KLUNGWF9GYWNlQ2FjaGU6OkNGWF9GYWNlQ2FjaGUoRlhGVF9GYWNlIGZhY2UpCi0gICAgOiBtX0ZhY2UoZmFjZSkKLSNpZiBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfIHx8IF9TS0lBX1NVUFBPUlRfUEFUSFNfCi0gICAgICAsCi0gICAgICBtX3BUeXBlZmFjZShudWxscHRyKQotI2VuZGlmCi17Ci19Ci0KLUNGWF9GYWNlQ2FjaGU6On5DRlhfRmFjZUNhY2hlKCkgewotI2lmIGRlZmluZWQgX1NLSUFfU1VQUE9SVF8gfHwgX1NLSUFfU1VQUE9SVF9QQVRIU18KLSAgU2tTYWZlVW5yZWYobV9wVHlwZWZhY2UpOwotI2VuZGlmCi19Ci0KLUNGWF9HbHlwaEJpdG1hcCogQ0ZYX0ZhY2VDYWNoZTo6UmVuZGVyR2x5cGgoY29uc3QgQ0ZYX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRm9udFN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFudGlfYWxpYXMpIHsKLSAgaWYgKCFtX0ZhY2UpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgRlhGVF9NYXRyaXggZnRfbWF0cml4OwotICBmdF9tYXRyaXgueHggPSAoc2lnbmVkIGxvbmcpKHBNYXRyaXgtPmEgLyA2NCAqIDY1NTM2KTsKLSAgZnRfbWF0cml4Lnh5ID0gKHNpZ25lZCBsb25nKShwTWF0cml4LT5jIC8gNjQgKiA2NTUzNik7Ci0gIGZ0X21hdHJpeC55eCA9IChzaWduZWQgbG9uZykocE1hdHJpeC0+YiAvIDY0ICogNjU1MzYpOwotICBmdF9tYXRyaXgueXkgPSAoc2lnbmVkIGxvbmcpKHBNYXRyaXgtPmQgLyA2NCAqIDY1NTM2KTsKLSAgYm9vbCBiVXNlQ0pLU3ViRm9udCA9IGZhbHNlOwotICBjb25zdCBDRlhfU3Vic3RGb250KiBwU3Vic3RGb250ID0gcEZvbnQtPkdldFN1YnN0Rm9udCgpOwotICBpZiAocFN1YnN0Rm9udCkgewotICAgIGJVc2VDSktTdWJGb250ID0gcFN1YnN0Rm9udC0+bV9iU3Vic3RDSksgJiYgYkZvbnRTdHlsZTsKLSAgICBpbnQgc2tldyA9IDA7Ci0gICAgaWYgKGJVc2VDSktTdWJGb250KQotICAgICAgc2tldyA9IHBTdWJzdEZvbnQtPm1fYkl0YWxpY0NKSyA/IC0xNSA6IDA7Ci0gICAgZWxzZQotICAgICAgc2tldyA9IHBTdWJzdEZvbnQtPm1fSXRhbGljQW5nbGU7Ci0gICAgaWYgKHNrZXcpIHsKLSAgICAgIC8vIHxza2V3fCBpcyBub25wb3NpdGl2ZSBzbyB8LXNrZXd8IGlzIHVzZWQgYXMgdGhlIGluZGV4LiBXZSBuZWVkIHRvIG1ha2UKLSAgICAgIC8vIHN1cmUgfHNrZXd8ICE9IElOVF9NSU4gc2luY2UgLUlOVF9NSU4gaXMgdW5kZWZpbmVkLgotICAgICAgaWYgKHNrZXcgPD0gMCAmJiBza2V3ICE9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKCkgJiYKLSAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KC1za2V3KSA8IENGWF9Gb250OjprQW5nbGVTa2V3QXJyYXlTaXplKSB7Ci0gICAgICAgIHNrZXcgPSAtQ0ZYX0ZvbnQ6OnNfQW5nbGVTa2V3Wy1za2V3XTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNrZXcgPSAtNTg7Ci0gICAgICB9Ci0gICAgICBpZiAocEZvbnQtPklzVmVydGljYWwoKSkKLSAgICAgICAgZnRfbWF0cml4Lnl4ICs9IGZ0X21hdHJpeC55eSAqIHNrZXcgLyAxMDA7Ci0gICAgICBlbHNlCi0gICAgICAgIGZ0X21hdHJpeC54eSAtPSBmdF9tYXRyaXgueHggKiBza2V3IC8gMTAwOwotICAgIH0KLSAgICBpZiAocFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX01NKSB7Ci0gICAgICBwRm9udC0+QWRqdXN0TU1QYXJhbXMoZ2x5cGhfaW5kZXgsIGRlc3Rfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX1dlaWdodCk7Ci0gICAgfQotICB9Ci0gIFNjb3BlZEZvbnRUcmFuc2Zvcm0gc2NvcGVkX3RyYW5zZm9ybShtX0ZhY2UsICZmdF9tYXRyaXgpOwotICBpbnQgbG9hZF9mbGFncyA9IChtX0ZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfU0ZOVCkKLSAgICAgICAgICAgICAgICAgICAgICAgPyBGWEZUX0xPQURfTk9fQklUTUFQCi0gICAgICAgICAgICAgICAgICAgICAgIDogKEZYRlRfTE9BRF9OT19CSVRNQVAgfCBGVF9MT0FEX05PX0hJTlRJTkcpOwotICBpbnQgZXJyb3IgPSBGWEZUX0xvYWRfR2x5cGgobV9GYWNlLCBnbHlwaF9pbmRleCwgbG9hZF9mbGFncyk7Ci0gIGlmIChlcnJvcikgewotICAgIC8vIGlmIGFuIGVycm9yIGlzIHJldHVybmVkLCB0cnkgdG8gcmVsb2FkIGdseXBocyB3aXRob3V0IGhpbnRpbmcuCi0gICAgaWYgKGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX0hJTlRJTkcgfHwgbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUpCi0gICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgIGxvYWRfZmxhZ3MgfD0gRlRfTE9BRF9OT19ISU5USU5HOwotICAgIGVycm9yID0gRlhGVF9Mb2FkX0dseXBoKG1fRmFjZSwgZ2x5cGhfaW5kZXgsIGxvYWRfZmxhZ3MpOwotCi0gICAgaWYgKGVycm9yKQotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgaW50IHdlaWdodCA9IDA7Ci0gIGlmIChiVXNlQ0pLU3ViRm9udCkKLSAgICB3ZWlnaHQgPSBwU3Vic3RGb250LT5tX1dlaWdodENKSzsKLSAgZWxzZQotICAgIHdlaWdodCA9IHBTdWJzdEZvbnQgPyBwU3Vic3RGb250LT5tX1dlaWdodCA6IDA7Ci0gIGlmIChwU3Vic3RGb250ICYmICEocFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX01NKSAmJgotICAgICAgd2VpZ2h0ID4gNDAwKSB7Ci0gICAgdWludDMyX3QgaW5kZXggPSAod2VpZ2h0IC0gNDAwKSAvIDEwOwotICAgIGlmIChpbmRleCA+PSBDRlhfRm9udDo6a1dlaWdodFBvd0FycmF5U2l6ZSkKLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8c2lnbmVkIGxvbmc+IGxldmVsID0gMDsKLSAgICBpZiAocFN1YnN0Rm9udC0+bV9DaGFyc2V0ID09IEZYRk9OVF9TSElGVEpJU19DSEFSU0VUKQotICAgICAgbGV2ZWwgPSBDRlhfRm9udDo6c19XZWlnaHRQb3dfU0hJRlRKSVNbaW5kZXhdICogMjsKLSAgICBlbHNlCi0gICAgICBsZXZlbCA9IENGWF9Gb250OjpzX1dlaWdodFBvd18xMVtpbmRleF07Ci0KLSAgICBsZXZlbCA9IGxldmVsICogKEZYU1lTX2FicyhzdGF0aWNfY2FzdDxpbnQ+KGZ0X21hdHJpeC54eCkpICsKLSAgICAgICAgICAgICAgICAgICAgIEZYU1lTX2FicyhzdGF0aWNfY2FzdDxpbnQ+KGZ0X21hdHJpeC54eSkpKSAvCi0gICAgICAgICAgICAzNjY1NTsKLSAgICBGWEZUX091dGxpbmVfRW1ib2xkZW4oRlhGVF9HZXRfR2x5cGhfT3V0bGluZShtX0ZhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbC5WYWx1ZU9yRGVmYXVsdCgwKSk7Ci0gIH0KLSAgRlhGVF9MaWJyYXJ5X1NldExjZEZpbHRlcihDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPkdldEZUTGlicmFyeSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xDRF9GSUxURVJfREVGQVVMVCk7Ci0gIGVycm9yID0gRlhGVF9SZW5kZXJfR2x5cGgobV9GYWNlLCBhbnRpX2FsaWFzKTsKLSAgaWYgKGVycm9yKQotICAgIHJldHVybiBudWxscHRyOwotICBpbnQgYm13aWR0aCA9IEZYRlRfR2V0X0JpdG1hcF9XaWR0aChGWEZUX0dldF9HbHlwaF9CaXRtYXAobV9GYWNlKSk7Ci0gIGludCBibWhlaWdodCA9IEZYRlRfR2V0X0JpdG1hcF9Sb3dzKEZYRlRfR2V0X0dseXBoX0JpdG1hcChtX0ZhY2UpKTsKLSAgaWYgKGJtd2lkdGggPiAyMDQ4IHx8IGJtaGVpZ2h0ID4gMjA0OCkKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgaW50IGRpYl93aWR0aCA9IGJtd2lkdGg7Ci0gIENGWF9HbHlwaEJpdG1hcCogcEdseXBoQml0bWFwID0gbmV3IENGWF9HbHlwaEJpdG1hcDsKLSAgcEdseXBoQml0bWFwLT5tX0JpdG1hcC5DcmVhdGUoCi0gICAgICBkaWJfd2lkdGgsIGJtaGVpZ2h0LAotICAgICAgYW50aV9hbGlhcyA9PSBGWEZUX1JFTkRFUl9NT0RFX01PTk8gPyBGWERJQl8xYnBwTWFzayA6IEZYRElCXzhicHBNYXNrKTsKLSAgcEdseXBoQml0bWFwLT5tX0xlZnQgPSBGWEZUX0dldF9HbHlwaF9CaXRtYXBMZWZ0KG1fRmFjZSk7Ci0gIHBHbHlwaEJpdG1hcC0+bV9Ub3AgPSBGWEZUX0dldF9HbHlwaF9CaXRtYXBUb3AobV9GYWNlKTsKLSAgaW50IGRlc3RfcGl0Y2ggPSBwR2x5cGhCaXRtYXAtPm1fQml0bWFwLkdldFBpdGNoKCk7Ci0gIGludCBzcmNfcGl0Y2ggPSBGWEZUX0dldF9CaXRtYXBfUGl0Y2goRlhGVF9HZXRfR2x5cGhfQml0bWFwKG1fRmFjZSkpOwotICB1aW50OF90KiBwRGVzdEJ1ZiA9IHBHbHlwaEJpdG1hcC0+bV9CaXRtYXAuR2V0QnVmZmVyKCk7Ci0gIHVpbnQ4X3QqIHBTcmNCdWYgPQotICAgICAgKHVpbnQ4X3QqKUZYRlRfR2V0X0JpdG1hcF9CdWZmZXIoRlhGVF9HZXRfR2x5cGhfQml0bWFwKG1fRmFjZSkpOwotICBpZiAoYW50aV9hbGlhcyAhPSBGWEZUX1JFTkRFUl9NT0RFX01PTk8gJiYKLSAgICAgIEZYRlRfR2V0X0JpdG1hcF9QaXhlbE1vZGUoRlhGVF9HZXRfR2x5cGhfQml0bWFwKG1fRmFjZSkpID09Ci0gICAgICAgICAgRlhGVF9QSVhFTF9NT0RFX01PTk8pIHsKLSAgICBpbnQgYnl0ZXMgPSBhbnRpX2FsaWFzID09IEZYRlRfUkVOREVSX01PREVfTENEID8gMyA6IDE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBibWhlaWdodDsgaSsrKSB7Ci0gICAgICBmb3IgKGludCBuID0gMDsgbiA8IGJtd2lkdGg7IG4rKykgewotICAgICAgICB1aW50OF90IGRhdGEgPQotICAgICAgICAgICAgKHBTcmNCdWZbaSAqIHNyY19waXRjaCArIG4gLyA4XSAmICgweDgwID4+IChuICUgOCkpKSA/IDI1NSA6IDA7Ci0gICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgYnl0ZXM7IGIrKykKLSAgICAgICAgICBwRGVzdEJ1ZltpICogZGVzdF9waXRjaCArIG4gKiBieXRlcyArIGJdID0gZGF0YTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgRlhTWVNfbWVtc2V0KHBEZXN0QnVmLCAwLCBkZXN0X3BpdGNoICogYm1oZWlnaHQpOwotICAgIGlmIChhbnRpX2FsaWFzID09IEZYRlRfUkVOREVSX01PREVfTU9OTyAmJgotICAgICAgICBGWEZUX0dldF9CaXRtYXBfUGl4ZWxNb2RlKEZYRlRfR2V0X0dseXBoX0JpdG1hcChtX0ZhY2UpKSA9PQotICAgICAgICAgICAgRlhGVF9QSVhFTF9NT0RFX01PTk8pIHsKLSAgICAgIGludCByb3dieXRlcyA9Ci0gICAgICAgICAgRlhTWVNfYWJzKHNyY19waXRjaCkgPiBkZXN0X3BpdGNoID8gZGVzdF9waXRjaCA6IEZYU1lTX2FicyhzcmNfcGl0Y2gpOwotICAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgYm1oZWlnaHQ7IHJvdysrKSB7Ci0gICAgICAgIEZYU1lTX21lbWNweShwRGVzdEJ1ZiArIHJvdyAqIGRlc3RfcGl0Y2gsIHBTcmNCdWYgKyByb3cgKiBzcmNfcGl0Y2gsCi0gICAgICAgICAgICAgICAgICAgICByb3dieXRlcyk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIENvbnRyYXN0QWRqdXN0KHBTcmNCdWYsIHBEZXN0QnVmLCBibXdpZHRoLCBibWhlaWdodCwgc3JjX3BpdGNoLAotICAgICAgICAgICAgICAgICAgICAgZGVzdF9waXRjaCk7Ci0gICAgICBHYW1tYUFkanVzdChwRGVzdEJ1ZiwgYm1oZWlnaHQsIGRlc3RfcGl0Y2gsCi0gICAgICAgICAgICAgICAgICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRUZXh0R2FtbWFUYWJsZSgpKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHBHbHlwaEJpdG1hcDsKLX0KLQotY29uc3QgQ0ZYX1BhdGhEYXRhKiBDRlhfRmFjZUNhY2hlOjpMb2FkR2x5cGhQYXRoKGNvbnN0IENGWF9Gb250KiBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCkgewotICBpZiAoIW1fRmFjZSB8fCBnbHlwaF9pbmRleCA9PSBrSW52YWxpZEdseXBoSW5kZXggfHwgZGVzdF93aWR0aCA8IDApCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgdWludDMyX3Qga2V5ID0gZ2x5cGhfaW5kZXg7Ci0gIGF1dG8qIHBTdWJzdEZvbnQgPSBwRm9udC0+R2V0U3Vic3RGb250KCk7Ci0gIGlmIChwU3Vic3RGb250KSB7Ci0gICAgaWYgKHBTdWJzdEZvbnQtPm1fV2VpZ2h0IDwgMCB8fCBwU3Vic3RGb250LT5tX0l0YWxpY0FuZ2xlIDwgMCkKLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIHVpbnQzMl90IHdlaWdodCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihwU3Vic3RGb250LT5tX1dlaWdodCk7Ci0gICAgdWludDMyX3QgYW5nbGUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocFN1YnN0Rm9udC0+bV9JdGFsaWNBbmdsZSk7Ci0gICAgdWludDMyX3Qga2V5X21vZGlmaWVyID0gKHdlaWdodCAvIDE2KSA8PCAxNTsKLSAgICBrZXlfbW9kaWZpZXIgKz0gKGFuZ2xlIC8gMikgPDwgMjE7Ci0gICAga2V5X21vZGlmaWVyICs9IChzdGF0aWNfY2FzdDx1aW50MzJfdD4oZGVzdF93aWR0aCkgLyAxNikgPDwgMjU7Ci0gICAgaWYgKHBGb250LT5Jc1ZlcnRpY2FsKCkpCi0gICAgICBrZXlfbW9kaWZpZXIgKz0gMVUgPDwgMzE7Ci0gICAga2V5ICs9IGtleV9tb2RpZmllcjsKLSAgfQotICBhdXRvIGl0ID0gbV9QYXRoTWFwLmZpbmQoa2V5KTsKLSAgaWYgKGl0ICE9IG1fUGF0aE1hcC5lbmQoKSkKLSAgICByZXR1cm4gaXQtPnNlY29uZC5nZXQoKTsKLQotICBDRlhfUGF0aERhdGEqIHBHbHlwaFBhdGggPSBwRm9udC0+TG9hZEdseXBoUGF0aEltcGwoZ2x5cGhfaW5kZXgsIGRlc3Rfd2lkdGgpOwotICBtX1BhdGhNYXBba2V5XSA9IHN0ZDo6dW5pcXVlX3B0cjxDRlhfUGF0aERhdGE+KHBHbHlwaFBhdGgpOwotICByZXR1cm4gcEdseXBoUGF0aDsKLX0KLQotY29uc3QgQ0ZYX0dseXBoQml0bWFwKiBDRlhfRmFjZUNhY2hlOjpMb2FkR2x5cGhCaXRtYXAoY29uc3QgQ0ZYX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGb250U3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW50aV9hbGlhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgdGV4dF9mbGFncykgewotICBpZiAoZ2x5cGhfaW5kZXggPT0ga0ludmFsaWRHbHlwaEluZGV4KQotICAgIHJldHVybiBudWxscHRyOwotCi0gIF9DRlhfVW5pcXVlS2V5R2VuIGtleWdlbjsKLSAgaW50IG5NYXRyaXhBID0gc3RhdGljX2Nhc3Q8aW50PihwTWF0cml4LT5hICogMTAwMDApOwotICBpbnQgbk1hdHJpeEIgPSBzdGF0aWNfY2FzdDxpbnQ+KHBNYXRyaXgtPmIgKiAxMDAwMCk7Ci0gIGludCBuTWF0cml4QyA9IHN0YXRpY19jYXN0PGludD4ocE1hdHJpeC0+YyAqIDEwMDAwKTsKLSAgaW50IG5NYXRyaXhEID0gc3RhdGljX2Nhc3Q8aW50PihwTWF0cml4LT5kICogMTAwMDApOwotI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gIGlmIChwRm9udC0+R2V0U3Vic3RGb250KCkpIHsKLSAgICBrZXlnZW4uR2VuZXJhdGUoOSwgbk1hdHJpeEEsIG5NYXRyaXhCLCBuTWF0cml4Qywgbk1hdHJpeEQsIGRlc3Rfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIGFudGlfYWxpYXMsIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9JdGFsaWNBbmdsZSwgcEZvbnQtPklzVmVydGljYWwoKSk7Ci0gIH0gZWxzZSB7Ci0gICAga2V5Z2VuLkdlbmVyYXRlKDYsIG5NYXRyaXhBLCBuTWF0cml4Qiwgbk1hdHJpeEMsIG5NYXRyaXhELCBkZXN0X3dpZHRoLAotICAgICAgICAgICAgICAgICAgICBhbnRpX2FsaWFzKTsKLSAgfQotI2Vsc2UKLSAgaWYgKHRleHRfZmxhZ3MgJiBGWFRFWFRfTk9fTkFUSVZFVEVYVCkgewotICAgIGlmIChwRm9udC0+R2V0U3Vic3RGb250KCkpIHsKLSAgICAgIGtleWdlbi5HZW5lcmF0ZSg5LCBuTWF0cml4QSwgbk1hdHJpeEIsIG5NYXRyaXhDLCBuTWF0cml4RCwgZGVzdF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICBhbnRpX2FsaWFzLCBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9JdGFsaWNBbmdsZSwKLSAgICAgICAgICAgICAgICAgICAgICBwRm9udC0+SXNWZXJ0aWNhbCgpKTsKLSAgICB9IGVsc2UgewotICAgICAga2V5Z2VuLkdlbmVyYXRlKDYsIG5NYXRyaXhBLCBuTWF0cml4Qiwgbk1hdHJpeEMsIG5NYXRyaXhELCBkZXN0X3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgIGFudGlfYWxpYXMpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAocEZvbnQtPkdldFN1YnN0Rm9udCgpKSB7Ci0gICAgICBrZXlnZW4uR2VuZXJhdGUoMTAsIG5NYXRyaXhBLCBuTWF0cml4Qiwgbk1hdHJpeEMsIG5NYXRyaXhELCBkZXN0X3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgIGFudGlfYWxpYXMsIHBGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9XZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX0l0YWxpY0FuZ2xlLCBwRm9udC0+SXNWZXJ0aWNhbCgpLAotICAgICAgICAgICAgICAgICAgICAgIDMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBrZXlnZW4uR2VuZXJhdGUoNywgbk1hdHJpeEEsIG5NYXRyaXhCLCBuTWF0cml4Qywgbk1hdHJpeEQsIGRlc3Rfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgYW50aV9hbGlhcywgMyk7Ci0gICAgfQotICB9Ci0jZW5kaWYKLSAgQ0ZYX0J5dGVTdHJpbmcgRmFjZUdseXBoc0tleShrZXlnZW4ubV9LZXksIGtleWdlbi5tX0tleUxlbik7Ci0jaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9BUFBMRV8gfHwgZGVmaW5lZCBfU0tJQV9TVVBQT1JUXyB8fCBcCi0gICAgZGVmaW5lZCBfU0tJQV9TVVBQT1JUX1BBVEhTXwotICByZXR1cm4gTG9va1VwR2x5cGhCaXRtYXAocEZvbnQsIHBNYXRyaXgsIEZhY2VHbHlwaHNLZXksIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZvbnRTdHlsZSwgZGVzdF93aWR0aCwgYW50aV9hbGlhcyk7Ci0jZWxzZQotICBpZiAodGV4dF9mbGFncyAmIEZYVEVYVF9OT19OQVRJVkVURVhUKSB7Ci0gICAgcmV0dXJuIExvb2tVcEdseXBoQml0bWFwKHBGb250LCBwTWF0cml4LCBGYWNlR2x5cGhzS2V5LCBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkZvbnRTdHlsZSwgZGVzdF93aWR0aCwgYW50aV9hbGlhcyk7Ci0gIH0KLSAgQ0ZYX0dseXBoQml0bWFwKiBwR2x5cGhCaXRtYXA7Ci0gIGF1dG8gaXQgPSBtX1NpemVNYXAuZmluZChGYWNlR2x5cGhzS2V5KTsKLSAgaWYgKGl0ICE9IG1fU2l6ZU1hcC5lbmQoKSkgewotICAgIENGWF9TaXplR2x5cGhDYWNoZSogcFNpemVDYWNoZSA9IGl0LT5zZWNvbmQuZ2V0KCk7Ci0gICAgYXV0byBpdDIgPSBwU2l6ZUNhY2hlLT5tX0dseXBoTWFwLmZpbmQoZ2x5cGhfaW5kZXgpOwotICAgIGlmIChpdDIgIT0gcFNpemVDYWNoZS0+bV9HbHlwaE1hcC5lbmQoKSkKLSAgICAgIHJldHVybiBpdDItPnNlY29uZDsKLQotICAgIHBHbHlwaEJpdG1hcCA9IFJlbmRlckdseXBoX05hdGl2ZXRleHQocEZvbnQsIGdseXBoX2luZGV4LCBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF93aWR0aCwgYW50aV9hbGlhcyk7Ci0gICAgaWYgKHBHbHlwaEJpdG1hcCkgewotICAgICAgcFNpemVDYWNoZS0+bV9HbHlwaE1hcFtnbHlwaF9pbmRleF0gPSBwR2x5cGhCaXRtYXA7Ci0gICAgICByZXR1cm4gcEdseXBoQml0bWFwOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBwR2x5cGhCaXRtYXAgPSBSZW5kZXJHbHlwaF9OYXRpdmV0ZXh0KHBGb250LCBnbHlwaF9pbmRleCwgcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMpOwotICAgIGlmIChwR2x5cGhCaXRtYXApIHsKLSAgICAgIENGWF9TaXplR2x5cGhDYWNoZSogcFNpemVDYWNoZSA9IG5ldyBDRlhfU2l6ZUdseXBoQ2FjaGU7Ci0gICAgICBtX1NpemVNYXBbRmFjZUdseXBoc0tleV0gPQotICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfU2l6ZUdseXBoQ2FjaGU+KHBTaXplQ2FjaGUpOwotICAgICAgcFNpemVDYWNoZS0+bV9HbHlwaE1hcFtnbHlwaF9pbmRleF0gPSBwR2x5cGhCaXRtYXA7Ci0gICAgICByZXR1cm4gcEdseXBoQml0bWFwOwotICAgIH0KLSAgfQotICBpZiAocEZvbnQtPkdldFN1YnN0Rm9udCgpKSB7Ci0gICAga2V5Z2VuLkdlbmVyYXRlKDksIG5NYXRyaXhBLCBuTWF0cml4Qiwgbk1hdHJpeEMsIG5NYXRyaXhELCBkZXN0X3dpZHRoLAotICAgICAgICAgICAgICAgICAgICBhbnRpX2FsaWFzLCBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fV2VpZ2h0LAotICAgICAgICAgICAgICAgICAgICBwRm9udC0+R2V0U3Vic3RGb250KCktPm1fSXRhbGljQW5nbGUsIHBGb250LT5Jc1ZlcnRpY2FsKCkpOwotICB9IGVsc2UgewotICAgIGtleWdlbi5HZW5lcmF0ZSg2LCBuTWF0cml4QSwgbk1hdHJpeEIsIG5NYXRyaXhDLCBuTWF0cml4RCwgZGVzdF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgYW50aV9hbGlhcyk7Ci0gIH0KLSAgQ0ZYX0J5dGVTdHJpbmcgRmFjZUdseXBoc0tleTIoa2V5Z2VuLm1fS2V5LCBrZXlnZW4ubV9LZXlMZW4pOwotICB0ZXh0X2ZsYWdzIHw9IEZYVEVYVF9OT19OQVRJVkVURVhUOwotICByZXR1cm4gTG9va1VwR2x5cGhCaXRtYXAocEZvbnQsIHBNYXRyaXgsIEZhY2VHbHlwaHNLZXkyLCBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJGb250U3R5bGUsIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMpOwotI2VuZGlmCi19Ci0KLSNpZiBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfIHx8IGRlZmluZWQgX1NLSUFfU1VQUE9SVF9QQVRIU18KLUNGWF9UeXBlRmFjZSogQ0ZYX0ZhY2VDYWNoZTo6R2V0RGV2aWNlQ2FjaGUoY29uc3QgQ0ZYX0ZvbnQqIHBGb250KSB7Ci0gIGlmICghbV9wVHlwZWZhY2UpIHsKLSAgICBtX3BUeXBlZmFjZSA9Ci0gICAgICAgIFNrVHlwZWZhY2U6Ok1ha2VGcm9tU3RyZWFtKAotICAgICAgICAgICAgbmV3IFNrTWVtb3J5U3RyZWFtKHBGb250LT5HZXRGb250RGF0YSgpLCBwRm9udC0+R2V0U2l6ZSgpKSkKLSAgICAgICAgICAgIC5yZWxlYXNlKCk7Ci0gIH0KLSAgcmV0dXJuIG1fcFR5cGVmYWNlOwotfQotI2VuZGlmCi0KLSNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX0FQUExFXwotdm9pZCBDRlhfRmFjZUNhY2hlOjpJbml0UGxhdGZvcm0oKSB7fQotI2VuZGlmCi0KLUNGWF9HbHlwaEJpdG1hcCogQ0ZYX0ZhY2VDYWNoZTo6TG9va1VwR2x5cGhCaXRtYXAoCi0gICAgY29uc3QgQ0ZYX0ZvbnQqIHBGb250LAotICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIEZhY2VHbHlwaHNLZXksCi0gICAgdWludDMyX3QgZ2x5cGhfaW5kZXgsCi0gICAgYm9vbCBiRm9udFN0eWxlLAotICAgIGludCBkZXN0X3dpZHRoLAotICAgIGludCBhbnRpX2FsaWFzKSB7Ci0gIENGWF9TaXplR2x5cGhDYWNoZSogcFNpemVDYWNoZTsKLSAgYXV0byBpdCA9IG1fU2l6ZU1hcC5maW5kKEZhY2VHbHlwaHNLZXkpOwotICBpZiAoaXQgPT0gbV9TaXplTWFwLmVuZCgpKSB7Ci0gICAgcFNpemVDYWNoZSA9IG5ldyBDRlhfU2l6ZUdseXBoQ2FjaGU7Ci0gICAgbV9TaXplTWFwW0ZhY2VHbHlwaHNLZXldID0gc3RkOjp1bmlxdWVfcHRyPENGWF9TaXplR2x5cGhDYWNoZT4ocFNpemVDYWNoZSk7Ci0gIH0gZWxzZSB7Ci0gICAgcFNpemVDYWNoZSA9IGl0LT5zZWNvbmQuZ2V0KCk7Ci0gIH0KLSAgYXV0byBpdDIgPSBwU2l6ZUNhY2hlLT5tX0dseXBoTWFwLmZpbmQoZ2x5cGhfaW5kZXgpOwotICBpZiAoaXQyICE9IHBTaXplQ2FjaGUtPm1fR2x5cGhNYXAuZW5kKCkpCi0gICAgcmV0dXJuIGl0Mi0+c2Vjb25kOwotCi0gIENGWF9HbHlwaEJpdG1hcCogcEdseXBoQml0bWFwID0gUmVuZGVyR2x5cGgocEZvbnQsIGdseXBoX2luZGV4LCBiRm9udFN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYXRyaXgsIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMpOwotICBwU2l6ZUNhY2hlLT5tX0dseXBoTWFwW2dseXBoX2luZGV4XSA9IHBHbHlwaEJpdG1hcDsKLSAgcmV0dXJuIHBHbHlwaEJpdG1hcDsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9nZS9jZnhfZm9sZGVyZm9udGluZm8uY3BwIGIvY29yZS9meGdlL2dlL2NmeF9mb2xkZXJmb250aW5mby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3NmEzNzMuLjAwMDAwMDAKLS0tIGEvY29yZS9meGdlL2dlL2NmeF9mb2xkZXJmb250aW5mby5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiY29yZS9meGdlL2dlL2NmeF9mb2xkZXJmb250aW5mby5oIgotCi0jaW5jbHVkZSA8bGltaXRzPgotCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mb250bWFwcGVyLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZvbnQuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKLQotbmFtZXNwYWNlIHsKLQotY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgRlhfQ0hBUiogbV9wTmFtZTsKLSAgY29uc3QgRlhfQ0hBUiogbV9wU3Vic3ROYW1lOwotfSBCYXNlMTRTdWJzdHNbXSA9IHsKLSAgICB7IkNvdXJpZXIiLCAiQ291cmllciBOZXcifSwKLSAgICB7IkNvdXJpZXItQm9sZCIsICJDb3VyaWVyIE5ldyBCb2xkIn0sCi0gICAgeyJDb3VyaWVyLUJvbGRPYmxpcXVlIiwgIkNvdXJpZXIgTmV3IEJvbGQgSXRhbGljIn0sCi0gICAgeyJDb3VyaWVyLU9ibGlxdWUiLCAiQ291cmllciBOZXcgSXRhbGljIn0sCi0gICAgeyJIZWx2ZXRpY2EiLCAiQXJpYWwifSwKLSAgICB7IkhlbHZldGljYS1Cb2xkIiwgIkFyaWFsIEJvbGQifSwKLSAgICB7IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsICJBcmlhbCBCb2xkIEl0YWxpYyJ9LAotICAgIHsiSGVsdmV0aWNhLU9ibGlxdWUiLCAiQXJpYWwgSXRhbGljIn0sCi0gICAgeyJUaW1lcy1Sb21hbiIsICJUaW1lcyBOZXcgUm9tYW4ifSwKLSAgICB7IlRpbWVzLUJvbGQiLCAiVGltZXMgTmV3IFJvbWFuIEJvbGQifSwKLSAgICB7IlRpbWVzLUJvbGRJdGFsaWMiLCAiVGltZXMgTmV3IFJvbWFuIEJvbGQgSXRhbGljIn0sCi0gICAgeyJUaW1lcy1JdGFsaWMiLCAiVGltZXMgTmV3IFJvbWFuIEl0YWxpYyJ9LAotfTsKLQotQ0ZYX0J5dGVTdHJpbmcgRlBERl9SZWFkU3RyaW5nRnJvbUZpbGUoRlhTWVNfRklMRSogcEZpbGUsIHVpbnQzMl90IHNpemUpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgYnVmZmVyOwotICBpZiAoIUZYU1lTX2ZyZWFkKGJ1ZmZlci5HZXRCdWZmZXIoc2l6ZSksIHNpemUsIDEsIHBGaWxlKSkKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKLSAgYnVmZmVyLlJlbGVhc2VCdWZmZXIoc2l6ZSk7Ci0gIHJldHVybiBidWZmZXI7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIEZQREZfTG9hZFRhYmxlRnJvbVRUKEZYU1lTX0ZJTEUqIHBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcFRhYmxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5UYWJsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0YWcpIHsKLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5UYWJsZXM7IGkrKykgewotICAgIGNvbnN0IHVpbnQ4X3QqIHAgPSBwVGFibGVzICsgaSAqIDE2OwotICAgIGlmIChHRVRfVFRfTE9ORyhwKSA9PSB0YWcpIHsKLSAgICAgIHVpbnQzMl90IG9mZnNldCA9IEdFVF9UVF9MT05HKHAgKyA4KTsKLSAgICAgIHVpbnQzMl90IHNpemUgPSBHRVRfVFRfTE9ORyhwICsgMTIpOwotICAgICAgRlhTWVNfZnNlZWsocEZpbGUsIG9mZnNldCwgRlhTWVNfU0VFS19TRVQpOwotICAgICAgcmV0dXJuIEZQREZfUmVhZFN0cmluZ0Zyb21GaWxlKHBGaWxlLCBzaXplKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci19Ci0KLXVpbnQzMl90IEdldENoYXJzZXQoaW50IGNoYXJzZXQpIHsKLSAgc3dpdGNoIChjaGFyc2V0KSB7Ci0gICAgY2FzZSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVDoKLSAgICAgIHJldHVybiBDSEFSU0VUX0ZMQUdfU0hJRlRKSVM7Ci0gICAgY2FzZSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQ6Ci0gICAgICByZXR1cm4gQ0hBUlNFVF9GTEFHX0dCOwotICAgIGNhc2UgRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQ6Ci0gICAgICByZXR1cm4gQ0hBUlNFVF9GTEFHX0JJRzU7Ci0gICAgY2FzZSBGWEZPTlRfSEFOR1VMX0NIQVJTRVQ6Ci0gICAgICByZXR1cm4gQ0hBUlNFVF9GTEFHX0tPUkVBTjsKLSAgICBjYXNlIEZYRk9OVF9TWU1CT0xfQ0hBUlNFVDoKLSAgICAgIHJldHVybiBDSEFSU0VUX0ZMQUdfU1lNQk9MOwotICAgIGNhc2UgRlhGT05UX0FOU0lfQ0hBUlNFVDoKLSAgICAgIHJldHVybiBDSEFSU0VUX0ZMQUdfQU5TSTsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludDMyX3QgR2V0U2ltaWxhclZhbHVlKGludCB3ZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJdGFsaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3R5bGUpIHsKLSAgaW50MzJfdCBpU2ltaWxhclZhbHVlID0gMDsKLSAgaWYgKCEhKHN0eWxlICYgRlhGT05UX0JPTEQpID09ICh3ZWlnaHQgPiA0MDApKQotICAgIGlTaW1pbGFyVmFsdWUgKz0gMTY7Ci0gIGlmICghIShzdHlsZSAmIEZYRk9OVF9JVEFMSUMpID09IGJJdGFsaWMpCi0gICAgaVNpbWlsYXJWYWx1ZSArPSAxNjsKLSAgaWYgKCEhKHN0eWxlICYgRlhGT05UX1NFUklGKSA9PSAhIShwaXRjaF9mYW1pbHkgJiBGWEZPTlRfRkZfUk9NQU4pKQotICAgIGlTaW1pbGFyVmFsdWUgKz0gMTY7Ci0gIGlmICghIShzdHlsZSAmIEZYRk9OVF9TQ1JJUFQpID09ICEhKHBpdGNoX2ZhbWlseSAmIEZYRk9OVF9GRl9TQ1JJUFQpKQotICAgIGlTaW1pbGFyVmFsdWUgKz0gODsKLSAgaWYgKCEhKHN0eWxlICYgRlhGT05UX0ZJWEVEX1BJVENIKSA9PQotICAgICAgISEocGl0Y2hfZmFtaWx5ICYgRlhGT05UX0ZGX0ZJWEVEUElUQ0gpKSB7Ci0gICAgaVNpbWlsYXJWYWx1ZSArPSA4OwotICB9Ci0gIHJldHVybiBpU2ltaWxhclZhbHVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotQ0ZYX0ZvbGRlckZvbnRJbmZvOjpDRlhfRm9sZGVyRm9udEluZm8oKSB7fQotCi1DRlhfRm9sZGVyRm9udEluZm86On5DRlhfRm9sZGVyRm9udEluZm8oKSB7Ci0gIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1fRm9udExpc3QpCi0gICAgZGVsZXRlIHBhaXIuc2Vjb25kOwotfQotCi12b2lkIENGWF9Gb2xkZXJGb250SW5mbzo6QWRkUGF0aChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHBhdGgpIHsKLSAgbV9QYXRoTGlzdC5wdXNoX2JhY2soQ0ZYX0J5dGVTdHJpbmcocGF0aCkpOwotfQotCi1ib29sIENGWF9Gb2xkZXJGb250SW5mbzo6RW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKSB7Ci0gIG1fcE1hcHBlciA9IHBNYXBwZXI7Ci0gIGZvciAoY29uc3QgYXV0byYgcGF0aCA6IG1fUGF0aExpc3QpCi0gICAgU2NhblBhdGgocGF0aCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIENGWF9Gb2xkZXJGb250SW5mbzo6U2NhblBhdGgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHBhdGgpIHsKLSAgRlhfRmlsZUhhbmRsZSogaGFuZGxlID0gRlhfT3BlbkZvbGRlcihwYXRoLmNfc3RyKCkpOwotICBpZiAoIWhhbmRsZSkKLSAgICByZXR1cm47Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgZmlsZW5hbWU7Ci0gIGJvb2wgYkZvbGRlcjsKLSAgd2hpbGUgKEZYX0dldE5leHRGaWxlKGhhbmRsZSwgJmZpbGVuYW1lLCAmYkZvbGRlcikpIHsKLSAgICBpZiAoYkZvbGRlcikgewotICAgICAgaWYgKGZpbGVuYW1lID09ICIuIiB8fCBmaWxlbmFtZSA9PSAiLi4iKQotICAgICAgICBjb250aW51ZTsKLSAgICB9IGVsc2UgewotICAgICAgQ0ZYX0J5dGVTdHJpbmcgZXh0ID0gZmlsZW5hbWUuUmlnaHQoNCk7Ci0gICAgICBleHQuTWFrZVVwcGVyKCk7Ci0gICAgICBpZiAoZXh0ICE9ICIuVFRGIiAmJiBleHQgIT0gIi5PVEYiICYmIGV4dCAhPSAiLlRUQyIpCi0gICAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIENGWF9CeXRlU3RyaW5nIGZ1bGxwYXRoID0gcGF0aDsKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0gICAgZnVsbHBhdGggKz0gIlxcIjsKLSNlbHNlCi0gICAgZnVsbHBhdGggKz0gIi8iOwotI2VuZGlmCi0KLSAgICBmdWxscGF0aCArPSBmaWxlbmFtZTsKLSAgICBiRm9sZGVyID8gU2NhblBhdGgoZnVsbHBhdGgpIDogU2NhbkZpbGUoZnVsbHBhdGgpOwotICB9Ci0gIEZYX0Nsb3NlRm9sZGVyKGhhbmRsZSk7Ci19Ci0KLXZvaWQgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpTY2FuRmlsZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgcGF0aCkgewotICBGWFNZU19GSUxFKiBwRmlsZSA9IEZYU1lTX2ZvcGVuKHBhdGguY19zdHIoKSwgInJiIik7Ci0gIGlmICghcEZpbGUpCi0gICAgcmV0dXJuOwotCi0gIEZYU1lTX2ZzZWVrKHBGaWxlLCAwLCBGWFNZU19TRUVLX0VORCk7Ci0KLSAgdWludDMyX3QgZmlsZXNpemUgPSBGWFNZU19mdGVsbChwRmlsZSk7Ci0gIHVpbnQ4X3QgYnVmZmVyWzE2XTsKLSAgRlhTWVNfZnNlZWsocEZpbGUsIDAsIEZYU1lTX1NFRUtfU0VUKTsKLQotICBzaXplX3QgcmVhZENudCA9IEZYU1lTX2ZyZWFkKGJ1ZmZlciwgMTIsIDEsIHBGaWxlKTsKLSAgaWYgKHJlYWRDbnQgIT0gMSkgewotICAgIEZYU1lTX2ZjbG9zZShwRmlsZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKEdFVF9UVF9MT05HKGJ1ZmZlcikgPT0ga1RhYmxlVFRDRikgewotICAgIHVpbnQzMl90IG5GYWNlcyA9IEdFVF9UVF9MT05HKGJ1ZmZlciArIDgpOwotICAgIGlmIChuRmFjZXMgPiBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkgLyA0KSB7Ci0gICAgICBGWFNZU19mY2xvc2UocEZpbGUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB1aW50MzJfdCBmYWNlX2J5dGVzID0gbkZhY2VzICogNDsKLSAgICB1aW50OF90KiBvZmZzZXRzID0gRlhfQWxsb2ModWludDhfdCwgZmFjZV9ieXRlcyk7Ci0gICAgcmVhZENudCA9IEZYU1lTX2ZyZWFkKG9mZnNldHMsIDEsIGZhY2VfYnl0ZXMsIHBGaWxlKTsKLSAgICBpZiAocmVhZENudCAhPSBmYWNlX2J5dGVzKSB7Ci0gICAgICBGWF9GcmVlKG9mZnNldHMpOwotICAgICAgRlhTWVNfZmNsb3NlKHBGaWxlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5GYWNlczsgaSsrKSB7Ci0gICAgICB1aW50OF90KiBwID0gb2Zmc2V0cyArIGkgKiA0OwotICAgICAgUmVwb3J0RmFjZShwYXRoLCBwRmlsZSwgZmlsZXNpemUsIEdFVF9UVF9MT05HKHApKTsKLSAgICB9Ci0gICAgRlhfRnJlZShvZmZzZXRzKTsKLSAgfSBlbHNlIHsKLSAgICBSZXBvcnRGYWNlKHBhdGgsIHBGaWxlLCBmaWxlc2l6ZSwgMCk7Ci0gIH0KLSAgRlhTWVNfZmNsb3NlKHBGaWxlKTsKLX0KLQotdm9pZCBDRlhfRm9sZGVyRm9udEluZm86OlJlcG9ydEZhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19GSUxFKiBwRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpbGVzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0KSB7Ci0gIEZYU1lTX2ZzZWVrKHBGaWxlLCBvZmZzZXQsIEZYU1lTX1NFRUtfU0VUKTsKLSAgY2hhciBidWZmZXJbMTZdOwotICBpZiAoIUZYU1lTX2ZyZWFkKGJ1ZmZlciwgMTIsIDEsIHBGaWxlKSkKLSAgICByZXR1cm47Ci0KLSAgdWludDMyX3QgblRhYmxlcyA9IEdFVF9UVF9TSE9SVChidWZmZXIgKyA0KTsKLSAgQ0ZYX0J5dGVTdHJpbmcgdGFibGVzID0gRlBERl9SZWFkU3RyaW5nRnJvbUZpbGUocEZpbGUsIG5UYWJsZXMgKiAxNik7Ci0gIGlmICh0YWJsZXMuSXNFbXB0eSgpKQotICAgIHJldHVybjsKLQotICBDRlhfQnl0ZVN0cmluZyBuYW1lcyA9Ci0gICAgICBGUERGX0xvYWRUYWJsZUZyb21UVChwRmlsZSwgdGFibGVzLnJhd19zdHIoKSwgblRhYmxlcywgMHg2ZTYxNmQ2NSk7Ci0gIGlmIChuYW1lcy5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuOwotCi0gIENGWF9CeXRlU3RyaW5nIGZhY2VuYW1lID0KLSAgICAgIEdldE5hbWVGcm9tVFQobmFtZXMucmF3X3N0cigpLCBuYW1lcy5HZXRMZW5ndGgoKSwgMSk7Ci0gIGlmIChmYWNlbmFtZS5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuOwotCi0gIENGWF9CeXRlU3RyaW5nIHN0eWxlID0gR2V0TmFtZUZyb21UVChuYW1lcy5yYXdfc3RyKCksIG5hbWVzLkdldExlbmd0aCgpLCAyKTsKLSAgaWYgKHN0eWxlICE9ICJSZWd1bGFyIikKLSAgICBmYWNlbmFtZSArPSAiICIgKyBzdHlsZTsKLQotICBpZiAocGRmaXVtOjpDb250YWluc0tleShtX0ZvbnRMaXN0LCBmYWNlbmFtZSkpCi0gICAgcmV0dXJuOwotCi0gIENGWF9Gb250RmFjZUluZm8qIHBJbmZvID0KLSAgICAgIG5ldyBDRlhfRm9udEZhY2VJbmZvKHBhdGgsIGZhY2VuYW1lLCB0YWJsZXMsIG9mZnNldCwgZmlsZXNpemUpOwotICBDRlhfQnl0ZVN0cmluZyBvczIgPQotICAgICAgRlBERl9Mb2FkVGFibGVGcm9tVFQocEZpbGUsIHRhYmxlcy5yYXdfc3RyKCksIG5UYWJsZXMsIDB4NGY1MzJmMzIpOwotICBpZiAob3MyLkdldExlbmd0aCgpID49IDg2KSB7Ci0gICAgY29uc3QgdWludDhfdCogcCA9IG9zMi5yYXdfc3RyKCkgKyA3ODsKLSAgICB1aW50MzJfdCBjb2RlcGFnZXMgPSBHRVRfVFRfTE9ORyhwKTsKLSAgICBpZiAoY29kZXBhZ2VzICYgKDEgPDwgMTcpKSB7Ci0gICAgICBtX3BNYXBwZXItPkFkZEluc3RhbGxlZEZvbnQoZmFjZW5hbWUsIEZYRk9OVF9TSElGVEpJU19DSEFSU0VUKTsKLSAgICAgIHBJbmZvLT5tX0NoYXJzZXRzIHw9IENIQVJTRVRfRkxBR19TSElGVEpJUzsKLSAgICB9Ci0gICAgaWYgKGNvZGVwYWdlcyAmICgxIDw8IDE4KSkgewotICAgICAgbV9wTWFwcGVyLT5BZGRJbnN0YWxsZWRGb250KGZhY2VuYW1lLCBGWEZPTlRfR0IyMzEyX0NIQVJTRVQpOwotICAgICAgcEluZm8tPm1fQ2hhcnNldHMgfD0gQ0hBUlNFVF9GTEFHX0dCOwotICAgIH0KLSAgICBpZiAoY29kZXBhZ2VzICYgKDEgPDwgMjApKSB7Ci0gICAgICBtX3BNYXBwZXItPkFkZEluc3RhbGxlZEZvbnQoZmFjZW5hbWUsIEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUKTsKLSAgICAgIHBJbmZvLT5tX0NoYXJzZXRzIHw9IENIQVJTRVRfRkxBR19CSUc1OwotICAgIH0KLSAgICBpZiAoKGNvZGVwYWdlcyAmICgxIDw8IDE5KSkgfHwgKGNvZGVwYWdlcyAmICgxIDw8IDIxKSkpIHsKLSAgICAgIG1fcE1hcHBlci0+QWRkSW5zdGFsbGVkRm9udChmYWNlbmFtZSwgRlhGT05UX0hBTkdVTF9DSEFSU0VUKTsKLSAgICAgIHBJbmZvLT5tX0NoYXJzZXRzIHw9IENIQVJTRVRfRkxBR19LT1JFQU47Ci0gICAgfQotICAgIGlmIChjb2RlcGFnZXMgJiAoMSA8PCAzMSkpIHsKLSAgICAgIG1fcE1hcHBlci0+QWRkSW5zdGFsbGVkRm9udChmYWNlbmFtZSwgRlhGT05UX1NZTUJPTF9DSEFSU0VUKTsKLSAgICAgIHBJbmZvLT5tX0NoYXJzZXRzIHw9IENIQVJTRVRfRkxBR19TWU1CT0w7Ci0gICAgfQotICB9Ci0gIG1fcE1hcHBlci0+QWRkSW5zdGFsbGVkRm9udChmYWNlbmFtZSwgRlhGT05UX0FOU0lfQ0hBUlNFVCk7Ci0gIHBJbmZvLT5tX0NoYXJzZXRzIHw9IENIQVJTRVRfRkxBR19BTlNJOwotICBwSW5mby0+bV9TdHlsZXMgPSAwOwotICBpZiAoc3R5bGUuRmluZCgiQm9sZCIpID4gLTEpCi0gICAgcEluZm8tPm1fU3R5bGVzIHw9IEZYRk9OVF9CT0xEOwotICBpZiAoc3R5bGUuRmluZCgiSXRhbGljIikgPiAtMSB8fCBzdHlsZS5GaW5kKCJPYmxpcXVlIikgPiAtMSkKLSAgICBwSW5mby0+bV9TdHlsZXMgfD0gRlhGT05UX0lUQUxJQzsKLSAgaWYgKGZhY2VuYW1lLkZpbmQoIlNlcmlmIikgPiAtMSkKLSAgICBwSW5mby0+bV9TdHlsZXMgfD0gRlhGT05UX1NFUklGOwotCi0gIG1fRm9udExpc3RbZmFjZW5hbWVdID0gcEluZm87Ci19Ci0KLXZvaWQqIENGWF9Gb2xkZXJGb250SW5mbzo6R2V0U3Vic3RGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlKSB7Ci0gIGZvciAoc2l6ZV90IGlCYXNlRm9udCA9IDA7IGlCYXNlRm9udCA8IEZYX0FycmF5U2l6ZShCYXNlMTRTdWJzdHMpOwotICAgICAgIGlCYXNlRm9udCsrKSB7Ci0gICAgaWYgKGZhY2UgPT0gQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9wTmFtZSkKLSAgICAgIHJldHVybiBHZXRGb250KEJhc2UxNFN1YnN0c1tpQmFzZUZvbnRdLm1fcFN1YnN0TmFtZSk7Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLXZvaWQqIENGWF9Gb2xkZXJGb250SW5mbzo6RmluZEZvbnQoaW50IHdlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXRhbGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJNYXRjaE5hbWUpIHsKLSAgQ0ZYX0ZvbnRGYWNlSW5mbyogcEZpbmQgPSBudWxscHRyOwotICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfQU5TSV9DSEFSU0VUICYmIChwaXRjaF9mYW1pbHkgJiBGWEZPTlRfRkZfRklYRURQSVRDSCkpCi0gICAgcmV0dXJuIEdldEZvbnQoIkNvdXJpZXIgTmV3Iik7Ci0gIHVpbnQzMl90IGNoYXJzZXRfZmxhZyA9IEdldENoYXJzZXQoY2hhcnNldCk7Ci0gIGludDMyX3QgaUJlc3RTaW1pbGFyID0gMDsKLSAgZm9yIChjb25zdCBhdXRvJiBpdCA6IG1fRm9udExpc3QpIHsKLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgYnNOYW1lID0gaXQuZmlyc3Q7Ci0gICAgQ0ZYX0ZvbnRGYWNlSW5mbyogcEZvbnQgPSBpdC5zZWNvbmQ7Ci0gICAgaWYgKCEocEZvbnQtPm1fQ2hhcnNldHMgJiBjaGFyc2V0X2ZsYWcpICYmCi0gICAgICAgIGNoYXJzZXQgIT0gRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGludDMyX3QgaW5kZXggPSBic05hbWUuRmluZChmYW1pbHkpOwotICAgIGlmIChiTWF0Y2hOYW1lICYmIGluZGV4IDwgMCkKLSAgICAgIGNvbnRpbnVlOwotICAgIGludDMyX3QgaVNpbWlsYXJWYWx1ZSA9Ci0gICAgICAgIEdldFNpbWlsYXJWYWx1ZSh3ZWlnaHQsIGJJdGFsaWMsIHBpdGNoX2ZhbWlseSwgcEZvbnQtPm1fU3R5bGVzKTsKLSAgICBpZiAoaVNpbWlsYXJWYWx1ZSA+IGlCZXN0U2ltaWxhcikgewotICAgICAgaUJlc3RTaW1pbGFyID0gaVNpbWlsYXJWYWx1ZTsKLSAgICAgIHBGaW5kID0gcEZvbnQ7Ci0gICAgfQotICB9Ci0gIHJldHVybiBwRmluZDsKLX0KLQotdm9pZCogQ0ZYX0ZvbGRlckZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXRhbGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgaUV4YWN0KSB7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi0jaWZkZWYgUERGX0VOQUJMRV9YRkEKLXZvaWQqIENGWF9Gb2xkZXJGb250SW5mbzo6TWFwRm9udEJ5VW5pY29kZSh1aW50MzJfdCBkd1VuaWNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJdGFsaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSkgewotICByZXR1cm4gbnVsbHB0cjsKLX0KLSNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKLQotdm9pZCogQ0ZYX0ZvbGRlckZvbnRJbmZvOjpHZXRGb250KGNvbnN0IEZYX0NIQVIqIGZhY2UpIHsKLSAgYXV0byBpdCA9IG1fRm9udExpc3QuZmluZChmYWNlKTsKLSAgcmV0dXJuIGl0ICE9IG1fRm9udExpc3QuZW5kKCkgPyBpdC0+c2Vjb25kIDogbnVsbHB0cjsKLX0KLQotdWludDMyX3QgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpHZXRGb250RGF0YSh2b2lkKiBoRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSkgewotICBpZiAoIWhGb250KQotICAgIHJldHVybiAwOwotCi0gIGNvbnN0IENGWF9Gb250RmFjZUluZm8qIHBGb250ID0gc3RhdGljX2Nhc3Q8Q0ZYX0ZvbnRGYWNlSW5mbyo+KGhGb250KTsKLSAgdWludDMyX3QgZGF0YXNpemUgPSAwOwotICB1aW50MzJfdCBvZmZzZXQgPSAwOwotICBpZiAodGFibGUgPT0gMCkgewotICAgIGRhdGFzaXplID0gcEZvbnQtPm1fRm9udE9mZnNldCA/IDAgOiBwRm9udC0+bV9GaWxlU2l6ZTsKLSAgfSBlbHNlIGlmICh0YWJsZSA9PSBrVGFibGVUVENGKSB7Ci0gICAgZGF0YXNpemUgPSBwRm9udC0+bV9Gb250T2Zmc2V0ID8gcEZvbnQtPm1fRmlsZVNpemUgOiAwOwotICB9IGVsc2UgewotICAgIHVpbnQzMl90IG5UYWJsZXMgPSBwRm9udC0+bV9Gb250VGFibGVzLkdldExlbmd0aCgpIC8gMTY7Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5UYWJsZXM7IGkrKykgewotICAgICAgY29uc3QgdWludDhfdCogcCA9IHBGb250LT5tX0ZvbnRUYWJsZXMucmF3X3N0cigpICsgaSAqIDE2OwotICAgICAgaWYgKEdFVF9UVF9MT05HKHApID09IHRhYmxlKSB7Ci0gICAgICAgIG9mZnNldCA9IEdFVF9UVF9MT05HKHAgKyA4KTsKLSAgICAgICAgZGF0YXNpemUgPSBHRVRfVFRfTE9ORyhwICsgMTIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmICghZGF0YXNpemUgfHwgc2l6ZSA8IGRhdGFzaXplKQotICAgIHJldHVybiBkYXRhc2l6ZTsKLQotICBGWFNZU19GSUxFKiBwRmlsZSA9IEZYU1lTX2ZvcGVuKHBGb250LT5tX0ZpbGVQYXRoLmNfc3RyKCksICJyYiIpOwotICBpZiAoIXBGaWxlKQotICAgIHJldHVybiAwOwotCi0gIGlmIChGWFNZU19mc2VlayhwRmlsZSwgb2Zmc2V0LCBGWFNZU19TRUVLX1NFVCkgPCAwIHx8Ci0gICAgICBGWFNZU19mcmVhZChidWZmZXIsIGRhdGFzaXplLCAxLCBwRmlsZSkgIT0gMSkgewotICAgIGRhdGFzaXplID0gMDsKLSAgfQotICBGWFNZU19mY2xvc2UocEZpbGUpOwotICByZXR1cm4gZGF0YXNpemU7Ci19Ci0KLXZvaWQgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpEZWxldGVGb250KHZvaWQqIGhGb250KSB7fQotYm9vbCBDRlhfRm9sZGVyRm9udEluZm86OkdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkgewotICBpZiAoIWhGb250KQotICAgIHJldHVybiBmYWxzZTsKLSAgQ0ZYX0ZvbnRGYWNlSW5mbyogcEZvbnQgPSAoQ0ZYX0ZvbnRGYWNlSW5mbyopaEZvbnQ7Ci0gIG5hbWUgPSBwRm9udC0+bV9GYWNlTmFtZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0ZYX0ZvbGRlckZvbnRJbmZvOjpHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9nZS9jZnhfZm9sZGVyZm9udGluZm8uaCBiL2NvcmUvZnhnZS9nZS9jZnhfZm9sZGVyZm9udGluZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzMWVlZi4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Z2UvZ2UvY2Z4X2ZvbGRlcmZvbnRpbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgQ09SRV9GWEdFX0dFX0NGWF9GT0xERVJGT05USU5GT19IXwotI2RlZmluZSBDT1JFX0ZYR0VfR0VfQ0ZYX0ZPTERFUkZPTlRJTkZPX0hfCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mb250bWFwcGVyLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZvbnQuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvaWZ4X3N5c3RlbWZvbnRpbmZvLmgiCi0KLWNsYXNzIENGWF9Gb2xkZXJGb250SW5mbyA6IHB1YmxpYyBJRlhfU3lzdGVtRm9udEluZm8gewotIHB1YmxpYzoKLSAgQ0ZYX0ZvbGRlckZvbnRJbmZvKCk7Ci0gIH5DRlhfRm9sZGVyRm9udEluZm8oKSBvdmVycmlkZTsKLQotICB2b2lkIEFkZFBhdGgoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBwYXRoKTsKLQotICAvLyBJRlhfU3l0ZW1Gb250SW5mbzoKLSAgYm9vbCBFbnVtRm9udExpc3QoQ0ZYX0ZvbnRNYXBwZXIqIHBNYXBwZXIpIG92ZXJyaWRlOwotICB2b2lkKiBNYXBGb250KGludCB3ZWlnaHQsCi0gICAgICAgICAgICAgICAgYm9vbCBiSXRhbGljLAotICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAotICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCi0gICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZmFjZSwKLSAgICAgICAgICAgICAgICBpbnQmIGJFeGFjdCkgb3ZlcnJpZGU7Ci0jaWZkZWYgUERGX0VOQUJMRV9YRkEKLSAgdm9pZCogTWFwRm9udEJ5VW5pY29kZSh1aW50MzJfdCBkd1VuaWNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJdGFsaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSkgb3ZlcnJpZGU7Ci0jZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCi0gIHZvaWQqIEdldEZvbnQoY29uc3QgRlhfQ0hBUiogZmFjZSkgb3ZlcnJpZGU7Ci0gIHVpbnQzMl90IEdldEZvbnREYXRhKHZvaWQqIGhGb250LAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplKSBvdmVycmlkZTsKLSAgdm9pZCBEZWxldGVGb250KHZvaWQqIGhGb250KSBvdmVycmlkZTsKLSAgYm9vbCBHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpIG92ZXJyaWRlOwotICBib29sIEdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpIG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICB2b2lkIFNjYW5QYXRoKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBwYXRoKTsKLSAgdm9pZCBTY2FuRmlsZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgcGF0aCk7Ci0gIHZvaWQgUmVwb3J0RmFjZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgcGF0aCwKLSAgICAgICAgICAgICAgICAgIEZYU1lTX0ZJTEUqIHBGaWxlLAotICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlsZXNpemUsCi0gICAgICAgICAgICAgICAgICB1aW50MzJfdCBvZmZzZXQpOwotICB2b2lkKiBHZXRTdWJzdEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2UpOwotICB2b2lkKiBGaW5kRm9udChpbnQgd2VpZ2h0LAotICAgICAgICAgICAgICAgICBib29sIGJJdGFsaWMsCi0gICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAotICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5LAotICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBmYW1pbHksCi0gICAgICAgICAgICAgICAgIGJvb2wgYk1hdGNoTmFtZSk7Ci0KLSAgc3RkOjptYXA8Q0ZYX0J5dGVTdHJpbmcsIENGWF9Gb250RmFjZUluZm8qPiBtX0ZvbnRMaXN0OwotICBzdGQ6OnZlY3RvcjxDRlhfQnl0ZVN0cmluZz4gbV9QYXRoTGlzdDsKLSAgQ0ZYX0ZvbnRNYXBwZXIqIG1fcE1hcHBlcjsKLX07Ci0KLSNlbmRpZiAgLy8gQ09SRV9GWEdFX0dFX0NGWF9GT0xERVJGT05USU5GT19IXwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2dlL2NmeF9mb250LmNwcCBiL2NvcmUvZnhnZS9nZS9jZnhfZm9udC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MTU3YjAuLjAwMDAwMDAKLS0tIGEvY29yZS9meGdlL2dlL2NmeF9mb250LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY5NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZm9udC5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGxpbWl0cz4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2ZvbnQuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZhY2VjYWNoZS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZm9udGNhY2hlLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mb250bWdyLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9nZW1vZHVsZS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcGF0aGRhdGEuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3N1YnN0Zm9udC5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mcmVldHlwZS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9nZS9meF90ZXh0X2ludC5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLQotI2RlZmluZSBFTV9BREpVU1QoZW0sIGEpIChlbSA9PSAwID8gKGEpIDogKGEpKjEwMDAgLyBlbSkKLQotbmFtZXNwYWNlIHsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBDRlhfUGF0aERhdGEqIG1fcFBhdGg7Ci0gIGludCBtX0N1clg7Ci0gIGludCBtX0N1clk7Ci0gIEZYX0ZMT0FUIG1fQ29vcmRVbml0OwotfSBPVVRMSU5FX1BBUkFNUzsKLQotI2lmZGVmIFBERl9FTkFCTEVfWEZBCi0KLXVuc2lnbmVkIGxvbmcgRlRTdHJlYW1SZWFkKEZYRlRfU3RyZWFtIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb3VudCkgewotICBpZiAoY291bnQgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBJRlhfU2Vla2FibGVSZWFkU3RyZWFtKiBwRmlsZSA9Ci0gICAgICBzdGF0aWNfY2FzdDxJRlhfU2Vla2FibGVSZWFkU3RyZWFtKj4oc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIpOwotICBpZiAoIXBGaWxlKQotICAgIHJldHVybiAwOwotCi0gIGlmICghcEZpbGUtPlJlYWRCbG9jayhidWZmZXIsIG9mZnNldCwgY291bnQpKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiBjb3VudDsKLX0KLQotdm9pZCBGVFN0cmVhbUNsb3NlKEZYRlRfU3RyZWFtIHN0cmVhbSkge30KLQotYm9vbCBMb2FkRmlsZUltcChGWEZUX0xpYnJhcnkgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgRlhGVF9GYWNlKiBGYWNlLAotICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZSwKLSAgICAgICAgICAgICAgICAgaW50MzJfdCBmYWNlSW5kZXgsCi0gICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxGWEZUX1N0cmVhbVJlYz4qIHN0cmVhbSkgewotICBhdXRvIHN0cmVhbTEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8RlhGVF9TdHJlYW1SZWM+KCk7Ci0gIHN0cmVhbTEtPmJhc2UgPSBudWxscHRyOwotICBzdHJlYW0xLT5zaXplID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4ocEZpbGUtPkdldFNpemUoKSk7Ci0gIHN0cmVhbTEtPnBvcyA9IDA7Ci0gIHN0cmVhbTEtPmRlc2NyaXB0b3IucG9pbnRlciA9IHN0YXRpY19jYXN0PHZvaWQqPihwRmlsZS5HZXQoKSk7Ci0gIHN0cmVhbTEtPmNsb3NlID0gRlRTdHJlYW1DbG9zZTsKLSAgc3RyZWFtMS0+cmVhZCA9IEZUU3RyZWFtUmVhZDsKLSAgRlhGVF9PcGVuX0FyZ3MgYXJnczsKLSAgYXJncy5mbGFncyA9IEZUX09QRU5fU1RSRUFNOwotICBhcmdzLnN0cmVhbSA9IHN0cmVhbTEuZ2V0KCk7Ci0gIGlmIChGWEZUX09wZW5fRmFjZShsaWJyYXJ5LCAmYXJncywgZmFjZUluZGV4LCBGYWNlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChzdHJlYW0pCi0gICAgKnN0cmVhbSA9IHN0ZDo6bW92ZShzdHJlYW0xKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCi0KLUZYRlRfRmFjZSBGVF9Mb2FkRm9udChjb25zdCB1aW50OF90KiBwRGF0YSwgaW50IHNpemUpIHsKLSAgcmV0dXJuIENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+R2V0Rml4ZWRGYWNlKHBEYXRhLCBzaXplLCAwKTsKLX0KLQotdm9pZCBPdXRsaW5lX0NoZWNrRW1wdHlDb250b3VyKE9VVExJTkVfUEFSQU1TKiBwYXJhbSkgewotICBzdGQ6OnZlY3RvcjxGWF9QQVRIUE9JTlQ+JiBwb2ludHMgPSBwYXJhbS0+bV9wUGF0aC0+R2V0UG9pbnRzKCk7Ci0gIHNpemVfdCBzaXplID0gcG9pbnRzLnNpemUoKTsKLQotICBpZiAoc2l6ZSA+PSAyICYmIHBvaW50c1tzaXplIC0gMl0uSXNUeXBlQW5kT3BlbihGWFBUX1RZUEU6Ok1vdmVUbykgJiYKLSAgICAgIHBvaW50c1tzaXplIC0gMl0ubV9Qb2ludCA9PSBwb2ludHNbc2l6ZSAtIDFdLm1fUG9pbnQpIHsKLSAgICBzaXplIC09IDI7Ci0gIH0KLSAgaWYgKHNpemUgPj0gNCAmJiBwb2ludHNbc2l6ZSAtIDRdLklzVHlwZUFuZE9wZW4oRlhQVF9UWVBFOjpNb3ZlVG8pICYmCi0gICAgICBwb2ludHNbc2l6ZSAtIDNdLklzVHlwZUFuZE9wZW4oRlhQVF9UWVBFOjpCZXppZXJUbykgJiYKLSAgICAgIHBvaW50c1tzaXplIC0gM10ubV9Qb2ludCA9PSBwb2ludHNbc2l6ZSAtIDRdLm1fUG9pbnQgJiYKLSAgICAgIHBvaW50c1tzaXplIC0gMl0ubV9Qb2ludCA9PSBwb2ludHNbc2l6ZSAtIDRdLm1fUG9pbnQgJiYKLSAgICAgIHBvaW50c1tzaXplIC0gMV0ubV9Qb2ludCA9PSBwb2ludHNbc2l6ZSAtIDRdLm1fUG9pbnQpIHsKLSAgICBzaXplIC09IDQ7Ci0gIH0KLSAgcG9pbnRzLnJlc2l6ZShzaXplKTsKLX0KLQotaW50IE91dGxpbmVfTW92ZVRvKGNvbnN0IEZYRlRfVmVjdG9yKiB0bywgdm9pZCogdXNlcikgewotICBPVVRMSU5FX1BBUkFNUyogcGFyYW0gPSAoT1VUTElORV9QQVJBTVMqKXVzZXI7Ci0KLSAgT3V0bGluZV9DaGVja0VtcHR5Q29udG91cihwYXJhbSk7Ci0KLSAgcGFyYW0tPm1fcFBhdGgtPkNsb3NlUGF0aCgpOwotICBwYXJhbS0+bV9wUGF0aC0+QXBwZW5kUG9pbnQoCi0gICAgICBDRlhfUG9pbnRGKHRvLT54IC8gcGFyYW0tPm1fQ29vcmRVbml0LCB0by0+eSAvIHBhcmFtLT5tX0Nvb3JkVW5pdCksCi0gICAgICBGWFBUX1RZUEU6Ok1vdmVUbywgZmFsc2UpOwotCi0gIHBhcmFtLT5tX0N1clggPSB0by0+eDsKLSAgcGFyYW0tPm1fQ3VyWSA9IHRvLT55OwotICByZXR1cm4gMDsKLX0KLQotaW50IE91dGxpbmVfTGluZVRvKGNvbnN0IEZYRlRfVmVjdG9yKiB0bywgdm9pZCogdXNlcikgewotICBPVVRMSU5FX1BBUkFNUyogcGFyYW0gPSAoT1VUTElORV9QQVJBTVMqKXVzZXI7Ci0KLSAgcGFyYW0tPm1fcFBhdGgtPkFwcGVuZFBvaW50KAotICAgICAgQ0ZYX1BvaW50Rih0by0+eCAvIHBhcmFtLT5tX0Nvb3JkVW5pdCwgdG8tPnkgLyBwYXJhbS0+bV9Db29yZFVuaXQpLAotICAgICAgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKLQotICBwYXJhbS0+bV9DdXJYID0gdG8tPng7Ci0gIHBhcmFtLT5tX0N1clkgPSB0by0+eTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBPdXRsaW5lX0NvbmljVG8oY29uc3QgRlhGVF9WZWN0b3IqIGNvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYRlRfVmVjdG9yKiB0bywKLSAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcikgewotICBPVVRMSU5FX1BBUkFNUyogcGFyYW0gPSAoT1VUTElORV9QQVJBTVMqKXVzZXI7Ci0KLSAgcGFyYW0tPm1fcFBhdGgtPkFwcGVuZFBvaW50KAotICAgICAgQ0ZYX1BvaW50RigocGFyYW0tPm1fQ3VyWCArIChjb250cm9sLT54IC0gcGFyYW0tPm1fQ3VyWCkgKiAyIC8gMykgLwotICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPm1fQ29vcmRVbml0LAotICAgICAgICAgICAgICAgICAocGFyYW0tPm1fQ3VyWSArIChjb250cm9sLT55IC0gcGFyYW0tPm1fQ3VyWSkgKiAyIC8gMykgLwotICAgICAgICAgICAgICAgICAgICAgcGFyYW0tPm1fQ29vcmRVbml0KSwKLSAgICAgIEZYUFRfVFlQRTo6QmV6aWVyVG8sIGZhbHNlKTsKLQotICBwYXJhbS0+bV9wUGF0aC0+QXBwZW5kUG9pbnQoCi0gICAgICBDRlhfUG9pbnRGKChjb250cm9sLT54ICsgKHRvLT54IC0gY29udHJvbC0+eCkgLyAzKSAvIHBhcmFtLT5tX0Nvb3JkVW5pdCwKLSAgICAgICAgICAgICAgICAgKGNvbnRyb2wtPnkgKyAodG8tPnkgLSBjb250cm9sLT55KSAvIDMpIC8gcGFyYW0tPm1fQ29vcmRVbml0KSwKLSAgICAgIEZYUFRfVFlQRTo6QmV6aWVyVG8sIGZhbHNlKTsKLQotICBwYXJhbS0+bV9wUGF0aC0+QXBwZW5kUG9pbnQoCi0gICAgICBDRlhfUG9pbnRGKHRvLT54IC8gcGFyYW0tPm1fQ29vcmRVbml0LCB0by0+eSAvIHBhcmFtLT5tX0Nvb3JkVW5pdCksCi0gICAgICBGWFBUX1RZUEU6OkJlemllclRvLCBmYWxzZSk7Ci0KLSAgcGFyYW0tPm1fQ3VyWCA9IHRvLT54OwotICBwYXJhbS0+bV9DdXJZID0gdG8tPnk7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgT3V0bGluZV9DdWJpY1RvKGNvbnN0IEZYRlRfVmVjdG9yKiBjb250cm9sMSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhGVF9WZWN0b3IqIGNvbnRyb2wyLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBGWEZUX1ZlY3RvciogdG8sCi0gICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIpIHsKLSAgT1VUTElORV9QQVJBTVMqIHBhcmFtID0gKE9VVExJTkVfUEFSQU1TKil1c2VyOwotCi0gIHBhcmFtLT5tX3BQYXRoLT5BcHBlbmRQb2ludChDRlhfUG9pbnRGKGNvbnRyb2wxLT54IC8gcGFyYW0tPm1fQ29vcmRVbml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sMS0+eSAvIHBhcmFtLT5tX0Nvb3JkVW5pdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFBUX1RZUEU6OkJlemllclRvLCBmYWxzZSk7Ci0KLSAgcGFyYW0tPm1fcFBhdGgtPkFwcGVuZFBvaW50KENGWF9Qb2ludEYoY29udHJvbDItPnggLyBwYXJhbS0+bV9Db29yZFVuaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wyLT55IC8gcGFyYW0tPm1fQ29vcmRVbml0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYUFRfVFlQRTo6QmV6aWVyVG8sIGZhbHNlKTsKLQotICBwYXJhbS0+bV9wUGF0aC0+QXBwZW5kUG9pbnQoCi0gICAgICBDRlhfUG9pbnRGKHRvLT54IC8gcGFyYW0tPm1fQ29vcmRVbml0LCB0by0+eSAvIHBhcmFtLT5tX0Nvb3JkVW5pdCksCi0gICAgICBGWFBUX1RZUEU6OkJlemllclRvLCBmYWxzZSk7Ci0KLSAgcGFyYW0tPm1fQ3VyWCA9IHRvLT54OwotICBwYXJhbS0+bV9DdXJZID0gdG8tPnk7Ci0gIHJldHVybiAwOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotY29uc3QgY2hhciBDRlhfRm9udDo6c19BbmdsZVNrZXdbXSA9IHsKLSAgICAwLCAgMiwgIDMsICA1LCAgNywgIDksICAxMSwgMTIsIDE0LCAxNiwgMTgsIDE5LCAyMSwgMjMsIDI1LAotICAgIDI3LCAyOSwgMzEsIDMyLCAzNCwgMzYsIDM4LCA0MCwgNDIsIDQ1LCA0NywgNDksIDUxLCA1MywgNTUsCi19OwotCi1jb25zdCB1aW50OF90IENGWF9Gb250OjpzX1dlaWdodFBvd1tdID0gewotICAgIDAsICAzLCAgNiwgIDcsICA4LCAgOSwgIDExLCAxMiwgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwKLSAgICAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzUsIDM2LCAzNiwgMzcsCi0gICAgMzcsIDM3LCAzOCwgMzgsIDM4LCAzOSwgMzksIDM5LCA0MCwgNDAsIDQwLCA0MSwgNDEsIDQxLCA0MiwgNDIsIDQyLAotICAgIDQyLCA0MywgNDMsIDQzLCA0NCwgNDQsIDQ0LCA0NCwgNDUsIDQ1LCA0NSwgNDUsIDQ2LCA0NiwgNDYsIDQ2LCA0NywKLSAgICA0NywgNDcsIDQ3LCA0OCwgNDgsIDQ4LCA0OCwgNDgsIDQ5LCA0OSwgNDksIDQ5LCA1MCwgNTAsIDUwLCA1MCwgNTAsCi0gICAgNTEsIDUxLCA1MSwgNTEsIDUxLCA1MiwgNTIsIDUyLCA1MiwgNTIsIDUzLCA1MywgNTMsIDUzLCA1MywKLX07Ci0KLWNvbnN0IHVpbnQ4X3QgQ0ZYX0ZvbnQ6OnNfV2VpZ2h0UG93XzExW10gPSB7Ci0gICAgMCwgIDQsICA3LCAgOCwgIDksICAxMCwgMTIsIDEzLCAxNSwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LAotICAgIDI1LCAyNiwgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM5LCAzOSwgNDAsIDQwLCA0MSwKLSAgICA0MSwgNDEsIDQyLCA0MiwgNDIsIDQzLCA0MywgNDMsIDQ0LCA0NCwgNDQsIDQ1LCA0NSwgNDUsIDQ2LCA0NiwgNDYsCi0gICAgNDYsIDQzLCA0NywgNDcsIDQ4LCA0OCwgNDgsIDQ4LCA0NSwgNTAsIDUwLCA1MCwgNDYsIDUxLCA1MSwgNTEsIDUyLAotICAgIDUyLCA1MiwgNTIsIDUzLCA1MywgNTMsIDUzLCA1MywgNTQsIDU0LCA1NCwgNTQsIDU1LCA1NSwgNTUsIDU1LCA1NSwKLSAgICA1NiwgNTYsIDU2LCA1NiwgNTYsIDU3LCA1NywgNTcsIDU3LCA1NywgNTgsIDU4LCA1OCwgNTgsIDU4LAotfTsKLQotY29uc3QgdWludDhfdCBDRlhfRm9udDo6c19XZWlnaHRQb3dfU0hJRlRKSVNbXSA9IHsKLSAgICAwLCAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNywgIDgsICAxMCwgMTEsIDEzLCAxNCwgMTYsIDE3LCAxOSwgMjEsCi0gICAgMjIsIDI0LCAyNiwgMjgsIDMwLCAzMiwgMzMsIDM1LCAzNywgMzksIDQxLCA0MywgNDUsIDQ4LCA0OCwgNDgsIDQ4LAotICAgIDQ5LCA0OSwgNDksIDUwLCA1MCwgNTAsIDUwLCA1MSwgNTEsIDUxLCA1MSwgNTIsIDUyLCA1MiwgNTIsIDUyLCA1MywKLSAgICA1MywgNTMsIDUzLCA1MywgNTQsIDU0LCA1NCwgNTQsIDU0LCA1NSwgNTUsIDU1LCA1NSwgNTUsIDU2LCA1NiwgNTYsCi0gICAgNTYsIDU2LCA1NiwgNTcsIDU3LCA1NywgNTcsIDU3LCA1NywgNTcsIDU4LCA1OCwgNTgsIDU4LCA1OCwgNTgsIDU4LAotICAgIDU5LCA1OSwgNTksIDU5LCA1OSwgNTksIDU5LCA2MCwgNjAsIDYwLCA2MCwgNjAsIDYwLCA2MCwgNjAsCi19OwotCi1DRlhfRm9udDo6Q0ZYX0ZvbnQoKQotICAgIDoKLSNpZmRlZiBQREZfRU5BQkxFX1hGQQotICAgICAgbV9iU2hhbGxvd0NvcHkoZmFsc2UpLAotICAgICAgbV9wT3duZWRTdHJlYW0obnVsbHB0ciksCi0jZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCi0gICAgICBtX0ZhY2UobnVsbHB0ciksCi0gICAgICBtX0ZhY2VDYWNoZShudWxscHRyKSwKLSAgICAgIG1fcEZvbnREYXRhKG51bGxwdHIpLAotICAgICAgbV9wR3N1YkRhdGEobnVsbHB0ciksCi0gICAgICBtX2R3U2l6ZSgwKSwKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgICAgbV9wUGxhdGZvcm1Gb250KG51bGxwdHIpLAotI2VuZGlmCi0gICAgICBtX2JFbWJlZGRlZChmYWxzZSksCi0gICAgICBtX2JWZXJ0aWNhbChmYWxzZSkgewotfQotCi0jaWZkZWYgUERGX0VOQUJMRV9YRkEKLWJvb2wgQ0ZYX0ZvbnQ6OkxvYWRDbG9uZShjb25zdCBDRlhfRm9udCogcEZvbnQpIHsKLSAgaWYgKCFwRm9udCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbV9iU2hhbGxvd0NvcHkgPSB0cnVlOwotICBpZiAocEZvbnQtPm1fcFN1YnN0Rm9udCkgewotICAgIG1fcFN1YnN0Rm9udCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfU3Vic3RGb250PigpOwotICAgIG1fcFN1YnN0Rm9udC0+bV9DaGFyc2V0ID0gcEZvbnQtPm1fcFN1YnN0Rm9udC0+bV9DaGFyc2V0OwotICAgIG1fcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzID0gcEZvbnQtPm1fcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzOwotICAgIG1fcFN1YnN0Rm9udC0+bV9XZWlnaHQgPSBwRm9udC0+bV9wU3Vic3RGb250LT5tX1dlaWdodDsKLSAgICBtX3BTdWJzdEZvbnQtPm1fRmFtaWx5ID0gcEZvbnQtPm1fcFN1YnN0Rm9udC0+bV9GYW1pbHk7Ci0gICAgbV9wU3Vic3RGb250LT5tX0l0YWxpY0FuZ2xlID0gcEZvbnQtPm1fcFN1YnN0Rm9udC0+bV9JdGFsaWNBbmdsZTsKLSAgfQotICBtX0ZhY2UgPSBwRm9udC0+bV9GYWNlOwotICBtX2JFbWJlZGRlZCA9IHBGb250LT5tX2JFbWJlZGRlZDsKLSAgbV9iVmVydGljYWwgPSBwRm9udC0+bV9iVmVydGljYWw7Ci0gIG1fZHdTaXplID0gcEZvbnQtPm1fZHdTaXplOwotICBtX3BGb250RGF0YSA9IHBGb250LT5tX3BGb250RGF0YTsKLSAgbV9wR3N1YkRhdGEgPSBwRm9udC0+bV9wR3N1YkRhdGE7Ci0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BUFBMRV8KLSAgbV9wUGxhdGZvcm1Gb250ID0gcEZvbnQtPm1fcFBsYXRmb3JtRm9udDsKLSNlbmRpZgotICBtX3BPd25lZFN0cmVhbSA9IHBGb250LT5tX3BPd25lZFN0cmVhbTsKLSAgbV9GYWNlQ2FjaGUgPSBwRm9udC0+R2V0RmFjZUNhY2hlKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIENGWF9Gb250OjpTZXRGYWNlKEZYRlRfRmFjZSBmYWNlKSB7Ci0gIENsZWFyRmFjZUNhY2hlKCk7Ci0gIG1fRmFjZSA9IGZhY2U7Ci19Ci0KLSNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKLQotQ0ZYX0ZvbnQ6On5DRlhfRm9udCgpIHsKLSNpZmRlZiBQREZfRU5BQkxFX1hGQQotICBpZiAobV9iU2hhbGxvd0NvcHkpCi0gICAgcmV0dXJuOwotI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQotICBpZiAobV9GYWNlKSB7Ci0jaWZuZGVmIFBERl9FTkFCTEVfWEZBCi0gICAgaWYgKEZYRlRfR2V0X0ZhY2VfRXh0ZXJuYWxfU3RyZWFtKG1fRmFjZSkpIHsKLSAgICAgIEZYRlRfQ2xlYXJfRmFjZV9FeHRlcm5hbF9TdHJlYW0obV9GYWNlKTsKLSAgICB9Ci0jZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCi0gICAgRGVsZXRlRmFjZSgpOwotICB9Ci0jaWZkZWYgUERGX0VOQUJMRV9YRkEKLSAgZGVsZXRlIG1fcE93bmVkU3RyZWFtOwotI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQotICBGWF9GcmVlKG1fcEdzdWJEYXRhKTsKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXyAmJiAhZGVmaW5lZCBfU0tJQV9TVVBQT1JUXwotICBSZWxlYXNlUGxhdGZvcm1SZXNvdXJjZSgpOwotI2VuZGlmCi19Ci0KLXZvaWQgQ0ZYX0ZvbnQ6OkRlbGV0ZUZhY2UoKSB7Ci0gIENsZWFyRmFjZUNhY2hlKCk7Ci0gIGlmIChtX2JFbWJlZGRlZCkgewotICAgIEZYRlRfRG9uZV9GYWNlKG1fRmFjZSk7Ci0gIH0gZWxzZSB7Ci0gICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5SZWxlYXNlRmFjZShtX0ZhY2UpOwotICB9Ci0gIG1fRmFjZSA9IG51bGxwdHI7Ci19Ci0KLXZvaWQgQ0ZYX0ZvbnQ6OkxvYWRTdWJzdChjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRydWVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl0YWxpY19hbmdsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ2hhcnNldENQLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlZlcnRpY2FsKSB7Ci0gIG1fYkVtYmVkZGVkID0gZmFsc2U7Ci0gIG1fYlZlcnRpY2FsID0gYlZlcnRpY2FsOwotICBtX3BTdWJzdEZvbnQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX1N1YnN0Rm9udD4oKTsKLSAgbV9GYWNlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5GaW5kU3Vic3RGb250KAotICAgICAgZmFjZV9uYW1lLCBiVHJ1ZVR5cGUsIGZsYWdzLCB3ZWlnaHQsIGl0YWxpY19hbmdsZSwgQ2hhcnNldENQLAotICAgICAgbV9wU3Vic3RGb250LmdldCgpKTsKLSAgaWYgKG1fRmFjZSkgewotICAgIG1fcEZvbnREYXRhID0gRlhGVF9HZXRfRmFjZV9TdHJlYW1fQmFzZShtX0ZhY2UpOwotICAgIG1fZHdTaXplID0gRlhGVF9HZXRfRmFjZV9TdHJlYW1fU2l6ZShtX0ZhY2UpOwotICB9Ci19Ci0KLSNpZmRlZiBQREZfRU5BQkxFX1hGQQotYm9vbCBDRlhfRm9udDo6TG9hZEZpbGUoY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZhY2VJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCogcEZhY2VDb3VudCkgewotICBtX2JFbWJlZGRlZCA9IGZhbHNlOwotCi0gIENGWF9Gb250TWdyKiBwRm9udE1nciA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKTsKLSAgcEZvbnRNZ3ItPkluaXRGVExpYnJhcnkoKTsKLQotICBGWEZUX0xpYnJhcnkgbGlicmFyeSA9IHBGb250TWdyLT5HZXRGVExpYnJhcnkoKTsKLSAgc3RkOjp1bmlxdWVfcHRyPEZYRlRfU3RyZWFtUmVjPiBzdHJlYW07Ci0gIGlmICghTG9hZEZpbGVJbXAobGlicmFyeSwgJm1fRmFjZSwgcEZpbGUsIG5GYWNlSW5kZXgsICZzdHJlYW0pKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAocEZhY2VDb3VudCkKLSAgICAqcEZhY2VDb3VudCA9IChpbnQpbV9GYWNlLT5udW1fZmFjZXM7Ci0gIG1fcE93bmVkU3RyZWFtID0gc3RyZWFtLnJlbGVhc2UoKTsKLSAgRlhGVF9TZXRfUGl4ZWxfU2l6ZXMobV9GYWNlLCAwLCA2NCk7Ci0gIHJldHVybiB0cnVlOwotfQotI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQotCi1pbnQgQ0ZYX0ZvbnQ6OkdldEdseXBoV2lkdGgodWludDMyX3QgZ2x5cGhfaW5kZXgpIHsKLSAgaWYgKCFtX0ZhY2UpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChtX3BTdWJzdEZvbnQgJiYgKG1fcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX01NKSkKLSAgICBBZGp1c3RNTVBhcmFtcyhnbHlwaF9pbmRleCwgMCwgMCk7Ci0gIGludCBlcnIgPSBGWEZUX0xvYWRfR2x5cGgoCi0gICAgICBtX0ZhY2UsIGdseXBoX2luZGV4LAotICAgICAgRlhGVF9MT0FEX05PX1NDQUxFIHwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCk7Ci0gIGlmIChlcnIpCi0gICAgcmV0dXJuIDA7Ci0gIGludCB3aWR0aCA9IEVNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0dseXBoX0hvcmlBZHZhbmNlKG1fRmFjZSkpOwotICByZXR1cm4gd2lkdGg7Ci19Ci0KLWJvb2wgQ0ZYX0ZvbnQ6OkxvYWRFbWJlZGRlZChjb25zdCB1aW50OF90KiBkYXRhLCB1aW50MzJfdCBzaXplKSB7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHRlbXAoZGF0YSwgZGF0YSArIHNpemUpOwotICBtX3BGb250RGF0YUFsbG9jYXRpb24uc3dhcCh0ZW1wKTsKLSAgbV9GYWNlID0gRlRfTG9hZEZvbnQobV9wRm9udERhdGFBbGxvY2F0aW9uLmRhdGEoKSwgc2l6ZSk7Ci0gIG1fcEZvbnREYXRhID0gbV9wRm9udERhdGFBbGxvY2F0aW9uLmRhdGEoKTsKLSAgbV9iRW1iZWRkZWQgPSB0cnVlOwotICBtX2R3U2l6ZSA9IHNpemU7Ci0gIHJldHVybiAhIW1fRmFjZTsKLX0KLQotYm9vbCBDRlhfRm9udDo6SXNUVEZvbnQoKSBjb25zdCB7Ci0gIGlmICghbV9GYWNlKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIEZYRlRfSXNfRmFjZV9UVF9PVChtX0ZhY2UpID09IEZYRlRfRkFDRV9GTEFHX1NGTlQ7Ci19Ci0KLWludCBDRlhfRm9udDo6R2V0QXNjZW50KCkgY29uc3QgewotICBpZiAoIW1fRmFjZSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIEVNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwKLSAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9GYWNlX0FzY2VuZGVyKG1fRmFjZSkpOwotfQotCi1pbnQgQ0ZYX0ZvbnQ6OkdldERlc2NlbnQoKSBjb25zdCB7Ci0gIGlmICghbV9GYWNlKQotICAgIHJldHVybiAwOwotICByZXR1cm4gRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLAotICAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0ZhY2VfRGVzY2VuZGVyKG1fRmFjZSkpOwotfQotCi1ib29sIENGWF9Gb250OjpHZXRHbHlwaEJCb3godWludDMyX3QgZ2x5cGhfaW5kZXgsIEZYX1JFQ1QmIGJib3gpIHsKLSAgaWYgKCFtX0ZhY2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChGWEZUX0lzX0ZhY2VfVHJpY2t5KG1fRmFjZSkpIHsKLSAgICBpbnQgZXJyb3IgPSBGWEZUX1NldF9DaGFyX1NpemUobV9GYWNlLCAwLCAxMDAwICogNjQsIDcyLCA3Mik7Ci0gICAgaWYgKGVycm9yKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGVycm9yID0gRlhGVF9Mb2FkX0dseXBoKG1fRmFjZSwgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCk7Ci0gICAgaWYgKGVycm9yKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIEZYRlRfQkJveCBjYm94OwotICAgIEZUX0dseXBoIGdseXBoOwotICAgIGVycm9yID0gRlhGVF9HZXRfR2x5cGgoKChGWEZUX0ZhY2UpbV9GYWNlKS0+Z2x5cGgsICZnbHlwaCk7Ci0gICAgaWYgKGVycm9yKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIEZYRlRfR2x5cGhfR2V0X0NCb3goZ2x5cGgsIEZYRlRfR0xZUEhfQkJPWF9QSVhFTFMsICZjYm94KTsKLSAgICBpbnQgcGl4ZWxfc2l6ZV94ID0gKChGWEZUX0ZhY2UpbV9GYWNlKS0+c2l6ZS0+bWV0cmljcy54X3BwZW0sCi0gICAgICAgIHBpeGVsX3NpemVfeSA9ICgoRlhGVF9GYWNlKW1fRmFjZSktPnNpemUtPm1ldHJpY3MueV9wcGVtOwotICAgIGlmIChwaXhlbF9zaXplX3ggPT0gMCB8fCBwaXhlbF9zaXplX3kgPT0gMCkgewotICAgICAgYmJveC5sZWZ0ID0gY2JveC54TWluOwotICAgICAgYmJveC5yaWdodCA9IGNib3gueE1heDsKLSAgICAgIGJib3gudG9wID0gY2JveC55TWF4OwotICAgICAgYmJveC5ib3R0b20gPSBjYm94LnlNaW47Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJib3gubGVmdCA9IGNib3gueE1pbiAqIDEwMDAgLyBwaXhlbF9zaXplX3g7Ci0gICAgICBiYm94LnJpZ2h0ID0gY2JveC54TWF4ICogMTAwMCAvIHBpeGVsX3NpemVfeDsKLSAgICAgIGJib3gudG9wID0gY2JveC55TWF4ICogMTAwMCAvIHBpeGVsX3NpemVfeTsKLSAgICAgIGJib3guYm90dG9tID0gY2JveC55TWluICogMTAwMCAvIHBpeGVsX3NpemVfeTsKLSAgICB9Ci0gICAgaWYgKGJib3gudG9wID4gRlhGVF9HZXRfRmFjZV9Bc2NlbmRlcihtX0ZhY2UpKQotICAgICAgYmJveC50b3AgPSBGWEZUX0dldF9GYWNlX0FzY2VuZGVyKG1fRmFjZSk7Ci0gICAgaWYgKGJib3guYm90dG9tIDwgRlhGVF9HZXRfRmFjZV9EZXNjZW5kZXIobV9GYWNlKSkKLSAgICAgIGJib3guYm90dG9tID0gRlhGVF9HZXRfRmFjZV9EZXNjZW5kZXIobV9GYWNlKTsKLSAgICBGVF9Eb25lX0dseXBoKGdseXBoKTsKLSAgICByZXR1cm4gRlhGVF9TZXRfUGl4ZWxfU2l6ZXMobV9GYWNlLCAwLCA2NCkgPT0gMDsKLSAgfQotICBpZiAoRlhGVF9Mb2FkX0dseXBoKAotICAgICAgICAgIG1fRmFjZSwgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgRlhGVF9MT0FEX05PX1NDQUxFIHwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaW50IGVtID0gRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSk7Ci0gIGlmIChlbSA9PSAwKSB7Ci0gICAgYmJveC5sZWZ0ID0gRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKG1fRmFjZSk7Ci0gICAgYmJveC5ib3R0b20gPSBGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1kobV9GYWNlKTsKLSAgICBiYm94LnRvcCA9IGJib3guYm90dG9tIC0gRlhGVF9HZXRfR2x5cGhfSGVpZ2h0KG1fRmFjZSk7Ci0gICAgYmJveC5yaWdodCA9IGJib3gubGVmdCArIEZYRlRfR2V0X0dseXBoX1dpZHRoKG1fRmFjZSk7Ci0gIH0gZWxzZSB7Ci0gICAgYmJveC5sZWZ0ID0gRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdYKG1fRmFjZSkgKiAxMDAwIC8gZW07Ci0gICAgYmJveC50b3AgPQotICAgICAgICAoRlhGVF9HZXRfR2x5cGhfSG9yaUJlYXJpbmdZKG1fRmFjZSkgLSBGWEZUX0dldF9HbHlwaF9IZWlnaHQobV9GYWNlKSkgKgotICAgICAgICAxMDAwIC8gZW07Ci0gICAgYmJveC5yaWdodCA9Ci0gICAgICAgIChGWEZUX0dldF9HbHlwaF9Ib3JpQmVhcmluZ1gobV9GYWNlKSArIEZYRlRfR2V0X0dseXBoX1dpZHRoKG1fRmFjZSkpICoKLSAgICAgICAgMTAwMCAvIGVtOwotICAgIGJib3guYm90dG9tID0gKEZYRlRfR2V0X0dseXBoX0hvcmlCZWFyaW5nWShtX0ZhY2UpKSAqIDEwMDAgLyBlbTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDRlhfRm9udDo6SXNJdGFsaWMoKSBjb25zdCB7Ci0gIGlmICghbV9GYWNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoRlhGVF9Jc19GYWNlX0l0YWxpYyhtX0ZhY2UpID09IEZYRlRfU1RZTEVfRkxBR19JVEFMSUMpCi0gICAgcmV0dXJuIHRydWU7Ci0gIENGWF9CeXRlU3RyaW5nIHN0cihGWEZUX0dldF9GYWNlX1N0eWxlX05hbWUobV9GYWNlKSk7Ci0gIHN0ci5NYWtlTG93ZXIoKTsKLSAgcmV0dXJuIHN0ci5GaW5kKCJpdGFsaWMiKSAhPSAtMTsKLX0KLQotYm9vbCBDRlhfRm9udDo6SXNCb2xkKCkgY29uc3QgewotICBpZiAoIW1fRmFjZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiBGWEZUX0lzX0ZhY2VfQm9sZChtX0ZhY2UpID09IEZYRlRfU1RZTEVfRkxBR19CT0xEOwotfQotCi1ib29sIENGWF9Gb250OjpJc0ZpeGVkV2lkdGgoKSBjb25zdCB7Ci0gIGlmICghbV9GYWNlKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIEZYRlRfSXNfRmFjZV9maXhlZHdpZHRoKG1fRmFjZSkgIT0gMDsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0ZvbnQ6OkdldFBzTmFtZSgpIGNvbnN0IHsKLSAgaWYgKCFtX0ZhY2UpCi0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgcHNOYW1lID0gRlhGVF9HZXRfUG9zdHNjcmlwdF9OYW1lKG1fRmFjZSk7Ci0gIGlmIChwc05hbWUuSXNFbXB0eSgpKQotICAgIHBzTmFtZSA9ICJVbnRpdGxlZCI7Ci0gIHJldHVybiBwc05hbWU7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENGWF9Gb250OjpHZXRGYW1pbHlOYW1lKCkgY29uc3QgewotICBpZiAoIW1fRmFjZSAmJiAhbV9wU3Vic3RGb250KQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotICBpZiAobV9GYWNlKQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZyhGWEZUX0dldF9GYWNlX0ZhbWlseV9OYW1lKG1fRmFjZSkpOwotICByZXR1cm4gbV9wU3Vic3RGb250LT5tX0ZhbWlseTsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0ZvbnQ6OkdldEZhY2VOYW1lKCkgY29uc3QgewotICBpZiAoIW1fRmFjZSAmJiAhbV9wU3Vic3RGb250KQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotICBpZiAobV9GYWNlKSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgZmFjZW5hbWU7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc3R5bGUgPSBDRlhfQnl0ZVN0cmluZyhGWEZUX0dldF9GYWNlX1N0eWxlX05hbWUobV9GYWNlKSk7Ci0gICAgZmFjZW5hbWUgPSBHZXRGYW1pbHlOYW1lKCk7Ci0gICAgaWYgKGZhY2VuYW1lLklzRW1wdHkoKSkKLSAgICAgIGZhY2VuYW1lID0gIlVudGl0bGVkIjsKLSAgICBpZiAoIXN0eWxlLklzRW1wdHkoKSAmJiBzdHlsZSAhPSAiUmVndWxhciIpCi0gICAgICBmYWNlbmFtZSArPSAiICIgKyBzdHlsZTsKLSAgICByZXR1cm4gZmFjZW5hbWU7Ci0gIH0KLSAgcmV0dXJuIG1fcFN1YnN0Rm9udC0+bV9GYW1pbHk7Ci19Ci0KLWJvb2wgQ0ZYX0ZvbnQ6OkdldEJCb3goRlhfUkVDVCYgYmJveCkgewotICBpZiAoIW1fRmFjZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGludCBlbSA9IEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpOwotICBpZiAoZW0gPT0gMCkgewotICAgIGJib3gubGVmdCA9IEZYRlRfR2V0X0ZhY2VfeE1pbihtX0ZhY2UpOwotICAgIGJib3guYm90dG9tID0gRlhGVF9HZXRfRmFjZV95TWF4KG1fRmFjZSk7Ci0gICAgYmJveC50b3AgPSBGWEZUX0dldF9GYWNlX3lNaW4obV9GYWNlKTsKLSAgICBiYm94LnJpZ2h0ID0gRlhGVF9HZXRfRmFjZV94TWF4KG1fRmFjZSk7Ci0gIH0gZWxzZSB7Ci0gICAgYmJveC5sZWZ0ID0gRlhGVF9HZXRfRmFjZV94TWluKG1fRmFjZSkgKiAxMDAwIC8gZW07Ci0gICAgYmJveC50b3AgPSBGWEZUX0dldF9GYWNlX3lNaW4obV9GYWNlKSAqIDEwMDAgLyBlbTsKLSAgICBiYm94LnJpZ2h0ID0gRlhGVF9HZXRfRmFjZV94TWF4KG1fRmFjZSkgKiAxMDAwIC8gZW07Ci0gICAgYmJveC5ib3R0b20gPSBGWEZUX0dldF9GYWNlX3lNYXgobV9GYWNlKSAqIDEwMDAgLyBlbTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotaW50IENGWF9Gb250OjpHZXRIZWlnaHQoKSBjb25zdCB7Ci0gIGlmICghbV9GYWNlKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiBFTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksCi0gICAgICAgICAgICAgICAgICAgRlhGVF9HZXRfRmFjZV9IZWlnaHQobV9GYWNlKSk7Ci19Ci0KLWludCBDRlhfRm9udDo6R2V0TWF4QWR2YW5jZVdpZHRoKCkgY29uc3QgewotICBpZiAoIW1fRmFjZSkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gRU1fQURKVVNUKEZYRlRfR2V0X0ZhY2VfVW5pdHNQZXJFTShtX0ZhY2UpLAotICAgICAgICAgICAgICAgICAgIEZYRlRfR2V0X0ZhY2VfTWF4QWR2YW5jZVdpZHRoKG1fRmFjZSkpOwotfQotCi1DRlhfRmFjZUNhY2hlKiBDRlhfRm9udDo6R2V0RmFjZUNhY2hlKCkgY29uc3QgewotICBpZiAoIW1fRmFjZUNhY2hlKSB7Ci0gICAgbV9GYWNlQ2FjaGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250Q2FjaGUoKS0+R2V0Q2FjaGVkRmFjZSh0aGlzKTsKLSAgfQotICByZXR1cm4gbV9GYWNlQ2FjaGU7Ci19Ci0KLXZvaWQgQ0ZYX0ZvbnQ6OkNsZWFyRmFjZUNhY2hlKCkgewotICBpZiAoIW1fRmFjZUNhY2hlKQotICAgIHJldHVybjsKLSAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udENhY2hlKCktPlJlbGVhc2VDYWNoZWRGYWNlKHRoaXMpOwotICBtX0ZhY2VDYWNoZSA9IG51bGxwdHI7Ci19Ci0KLWludCBDRlhfRm9udDo6R2V0VUxQb3MoKSBjb25zdCB7Ci0gIGlmICghbV9GYWNlKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiBFTV9BREpVU1QoRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSksCi0gICAgICAgICAgICAgICAgICAgRlhGVF9HZXRfRmFjZV9VbmRlckxpbmVQb3NpdGlvbihtX0ZhY2UpKTsKLX0KLQotaW50IENGWF9Gb250OjpHZXRVTHRoaWNrbmVzcygpIGNvbnN0IHsKLSAgaWYgKCFtX0ZhY2UpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIEVNX0FESlVTVChGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKSwKLSAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9GYWNlX1VuZGVyTGluZVRoaWNrbmVzcyhtX0ZhY2UpKTsKLX0KLQotdm9pZCBDRlhfRm9udDo6QWRqdXN0TU1QYXJhbXMoaW50IGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0KSBjb25zdCB7Ci0gIEZYRlRfTU1fVmFyIHBNYXN0ZXJzID0gbnVsbHB0cjsKLSAgRlhGVF9HZXRfTU1fVmFyKG1fRmFjZSwgJnBNYXN0ZXJzKTsKLSAgaWYgKCFwTWFzdGVycykKLSAgICByZXR1cm47Ci0gIGxvbmcgY29vcmRzWzJdOwotICBpZiAod2VpZ2h0ID09IDApCi0gICAgY29vcmRzWzBdID0gRlhGVF9HZXRfTU1fQXhpc19EZWYoRlhGVF9HZXRfTU1fQXhpcyhwTWFzdGVycywgMCkpIC8gNjU1MzY7Ci0gIGVsc2UKLSAgICBjb29yZHNbMF0gPSB3ZWlnaHQ7Ci0gIGlmIChkZXN0X3dpZHRoID09IDApIHsKLSAgICBjb29yZHNbMV0gPSBGWEZUX0dldF9NTV9BeGlzX0RlZihGWEZUX0dldF9NTV9BeGlzKHBNYXN0ZXJzLCAxKSkgLyA2NTUzNjsKLSAgfSBlbHNlIHsKLSAgICBpbnQgbWluX3BhcmFtID0gRlhGVF9HZXRfTU1fQXhpc19NaW4oRlhGVF9HZXRfTU1fQXhpcyhwTWFzdGVycywgMSkpIC8gNjU1MzY7Ci0gICAgaW50IG1heF9wYXJhbSA9IEZYRlRfR2V0X01NX0F4aXNfTWF4KEZYRlRfR2V0X01NX0F4aXMocE1hc3RlcnMsIDEpKSAvIDY1NTM2OwotICAgIGNvb3Jkc1sxXSA9IG1pbl9wYXJhbTsKLSAgICBGWEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMobV9GYWNlLCAyLCBjb29yZHMpOwotICAgIEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICBGWEZUX0xPQURfTk9fU0NBTEUgfCBGWEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIKTsKLSAgICBpbnQgbWluX3dpZHRoID0gRlhGVF9HZXRfR2x5cGhfSG9yaUFkdmFuY2UobV9GYWNlKSAqIDEwMDAgLwotICAgICAgICAgICAgICAgICAgICBGWEZUX0dldF9GYWNlX1VuaXRzUGVyRU0obV9GYWNlKTsKLSAgICBjb29yZHNbMV0gPSBtYXhfcGFyYW07Ci0gICAgRlhGVF9TZXRfTU1fRGVzaWduX0Nvb3JkaW5hdGVzKG1fRmFjZSwgMiwgY29vcmRzKTsKLSAgICBGWEZUX0xvYWRfR2x5cGgobV9GYWNlLCBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgRlhGVF9MT0FEX05PX1NDQUxFIHwgRlhGVF9MT0FEX0lHTk9SRV9HTE9CQUxfQURWQU5DRV9XSURUSCk7Ci0gICAgaW50IG1heF93aWR0aCA9IEZYRlRfR2V0X0dseXBoX0hvcmlBZHZhbmNlKG1fRmFjZSkgKiAxMDAwIC8KLSAgICAgICAgICAgICAgICAgICAgRlhGVF9HZXRfRmFjZV9Vbml0c1BlckVNKG1fRmFjZSk7Ci0gICAgaWYgKG1heF93aWR0aCA9PSBtaW5fd2lkdGgpIHsKLSAgICAgIEZYRlRfRnJlZShtX0ZhY2UsIHBNYXN0ZXJzKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IHBhcmFtID0gbWluX3BhcmFtICsKLSAgICAgICAgICAgICAgICAobWF4X3BhcmFtIC0gbWluX3BhcmFtKSAqIChkZXN0X3dpZHRoIC0gbWluX3dpZHRoKSAvCi0gICAgICAgICAgICAgICAgICAgIChtYXhfd2lkdGggLSBtaW5fd2lkdGgpOwotICAgIGNvb3Jkc1sxXSA9IHBhcmFtOwotICB9Ci0gIEZYRlRfRnJlZShtX0ZhY2UsIHBNYXN0ZXJzKTsKLSAgRlhGVF9TZXRfTU1fRGVzaWduX0Nvb3JkaW5hdGVzKG1fRmFjZSwgMiwgY29vcmRzKTsKLX0KLQotQ0ZYX1BhdGhEYXRhKiBDRlhfRm9udDo6TG9hZEdseXBoUGF0aEltcGwodWludDMyX3QgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCkgY29uc3QgewotICBpZiAoIW1fRmFjZSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgRlhGVF9TZXRfUGl4ZWxfU2l6ZXMobV9GYWNlLCAwLCA2NCk7Ci0gIEZYRlRfTWF0cml4IGZ0X21hdHJpeCA9IHs2NTUzNiwgMCwgMCwgNjU1MzZ9OwotICBpZiAobV9wU3Vic3RGb250KSB7Ci0gICAgaWYgKG1fcFN1YnN0Rm9udC0+bV9JdGFsaWNBbmdsZSkgewotICAgICAgaW50IHNrZXcgPSBtX3BTdWJzdEZvbnQtPm1fSXRhbGljQW5nbGU7Ci0gICAgICAvLyB8c2tld3wgaXMgbm9ucG9zaXRpdmUgc28gfC1za2V3fCBpcyB1c2VkIGFzIHRoZSBpbmRleC4gV2UgbmVlZCB0byBtYWtlCi0gICAgICAvLyBzdXJlIHxza2V3fCAhPSBJTlRfTUlOIHNpbmNlIC1JTlRfTUlOIGlzIHVuZGVmaW5lZC4KLSAgICAgIGlmIChza2V3IDw9IDAgJiYgc2tldyAhPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1pbigpICYmCi0gICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90Pigtc2tldykgPCBrQW5nbGVTa2V3QXJyYXlTaXplKSB7Ci0gICAgICAgIHNrZXcgPSAtc19BbmdsZVNrZXdbLXNrZXddOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc2tldyA9IC01ODsKLSAgICAgIH0KLSAgICAgIGlmIChtX2JWZXJ0aWNhbCkKLSAgICAgICAgZnRfbWF0cml4Lnl4ICs9IGZ0X21hdHJpeC55eSAqIHNrZXcgLyAxMDA7Ci0gICAgICBlbHNlCi0gICAgICAgIGZ0X21hdHJpeC54eSAtPSBmdF9tYXRyaXgueHggKiBza2V3IC8gMTAwOwotICAgIH0KLSAgICBpZiAobV9wU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgJiBGWEZPTlRfU1VCU1RfTU0pIHsKLSAgICAgIEFkanVzdE1NUGFyYW1zKGdseXBoX2luZGV4LCBkZXN0X3dpZHRoLCBtX3BTdWJzdEZvbnQtPm1fV2VpZ2h0KTsKLSAgICB9Ci0gIH0KLSAgU2NvcGVkRm9udFRyYW5zZm9ybSBzY29wZWRfdHJhbnNmb3JtKG1fRmFjZSwgJmZ0X21hdHJpeCk7Ci0gIGludCBsb2FkX2ZsYWdzID0gRlhGVF9MT0FEX05PX0JJVE1BUDsKLSAgaWYgKCEobV9GYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1NGTlQpIHx8ICFGVF9JU19UUklDS1kobV9GYWNlKSkKLSAgICBsb2FkX2ZsYWdzIHw9IEZUX0xPQURfTk9fSElOVElORzsKLSAgaWYgKEZYRlRfTG9hZF9HbHlwaChtX0ZhY2UsIGdseXBoX2luZGV4LCBsb2FkX2ZsYWdzKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgaWYgKG1fcFN1YnN0Rm9udCAmJiAhKG1fcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzICYgRlhGT05UX1NVQlNUX01NKSAmJgotICAgICAgbV9wU3Vic3RGb250LT5tX1dlaWdodCA+IDQwMCkgewotICAgIHVpbnQzMl90IGluZGV4ID0gKG1fcFN1YnN0Rm9udC0+bV9XZWlnaHQgLSA0MDApIC8gMTA7Ci0gICAgaW5kZXggPSBzdGQ6Om1pbihpbmRleCwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGtXZWlnaHRQb3dBcnJheVNpemUgLSAxKSk7Ci0gICAgaW50IGxldmVsID0gMDsKLSAgICBpZiAobV9wU3Vic3RGb250LT5tX0NoYXJzZXQgPT0gRlhGT05UX1NISUZUSklTX0NIQVJTRVQpCi0gICAgICBsZXZlbCA9IHNfV2VpZ2h0UG93X1NISUZUSklTW2luZGV4XSAqIDIgKiA2NTUzNiAvIDM2NjU1OwotICAgIGVsc2UKLSAgICAgIGxldmVsID0gc19XZWlnaHRQb3dbaW5kZXhdICogMjsKLSAgICBGWEZUX091dGxpbmVfRW1ib2xkZW4oRlhGVF9HZXRfR2x5cGhfT3V0bGluZShtX0ZhY2UpLCBsZXZlbCk7Ci0gIH0KLQotICBGWEZUX091dGxpbmVfRnVuY3MgZnVuY3M7Ci0gIGZ1bmNzLm1vdmVfdG8gPSBPdXRsaW5lX01vdmVUbzsKLSAgZnVuY3MubGluZV90byA9IE91dGxpbmVfTGluZVRvOwotICBmdW5jcy5jb25pY190byA9IE91dGxpbmVfQ29uaWNUbzsKLSAgZnVuY3MuY3ViaWNfdG8gPSBPdXRsaW5lX0N1YmljVG87Ci0gIGZ1bmNzLnNoaWZ0ID0gMDsKLSAgZnVuY3MuZGVsdGEgPSAwOwotCi0gIE9VVExJTkVfUEFSQU1TIHBhcmFtczsKLSAgYXV0byBwUGF0aCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfUGF0aERhdGE+KCk7Ci0gIHBhcmFtcy5tX3BQYXRoID0gcFBhdGguZ2V0KCk7Ci0gIHBhcmFtcy5tX0N1clggPSBwYXJhbXMubV9DdXJZID0gMDsKLSAgcGFyYW1zLm1fQ29vcmRVbml0ID0gNjQgKiA2NC4wOwotCi0gIEZYRlRfT3V0bGluZV9EZWNvbXBvc2UoRlhGVF9HZXRfR2x5cGhfT3V0bGluZShtX0ZhY2UpLCAmZnVuY3MsICZwYXJhbXMpOwotICBpZiAocFBhdGgtPkdldFBvaW50cygpLmVtcHR5KCkpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgT3V0bGluZV9DaGVja0VtcHR5Q29udG91cigmcGFyYW1zKTsKLSAgcFBhdGgtPkNsb3NlUGF0aCgpOwotCi0gIHJldHVybiBwUGF0aC5yZWxlYXNlKCk7Ci19Ci0KLWNvbnN0IENGWF9HbHlwaEJpdG1hcCogQ0ZYX0ZvbnQ6OkxvYWRHbHlwaEJpdG1hcCh1aW50MzJfdCBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGb250U3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW50aV9hbGlhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHRleHRfZmxhZ3MpIGNvbnN0IHsKLSAgcmV0dXJuIEdldEZhY2VDYWNoZSgpLT5Mb2FkR2x5cGhCaXRtYXAodGhpcywgZ2x5cGhfaW5kZXgsIGJGb250U3R5bGUsIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgsIGFudGlfYWxpYXMsIHRleHRfZmxhZ3MpOwotfQotCi1jb25zdCBDRlhfUGF0aERhdGEqIENGWF9Gb250OjpMb2FkR2x5cGhQYXRoKHVpbnQzMl90IGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCkgY29uc3QgewotICByZXR1cm4gR2V0RmFjZUNhY2hlKCktPkxvYWRHbHlwaFBhdGgodGhpcywgZ2x5cGhfaW5kZXgsIGRlc3Rfd2lkdGgpOwotfQotCi0jaWYgZGVmaW5lZCBfU0tJQV9TVVBQT1JUXyB8fCBfU0tJQV9TVVBQT1JUX1BBVEhTXwotQ0ZYX1R5cGVGYWNlKiBDRlhfRm9udDo6R2V0RGV2aWNlQ2FjaGUoKSBjb25zdCB7Ci0gIHJldHVybiBHZXRGYWNlQ2FjaGUoKS0+R2V0RGV2aWNlQ2FjaGUodGhpcyk7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9nZS9jZnhfZm9udGNhY2hlLmNwcCBiL2NvcmUvZnhnZS9nZS9jZnhfZm9udGNhY2hlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThjZWUwNi4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Z2UvZ2UvY2Z4X2ZvbnRjYWNoZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnRjYWNoZS5oIgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZhY2VjYWNoZS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mb250LmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZyZWV0eXBlLmgiCi0KLUNGWF9Gb250Q2FjaGU6OkNvdW50ZWRGYWNlQ2FjaGU6OkNvdW50ZWRGYWNlQ2FjaGUoKSB7fQotCi1DRlhfRm9udENhY2hlOjpDb3VudGVkRmFjZUNhY2hlOjp+Q291bnRlZEZhY2VDYWNoZSgpIHt9Ci0KLUNGWF9Gb250Q2FjaGU6OkNGWF9Gb250Q2FjaGUoKSB7fQotCi1DRlhfRm9udENhY2hlOjp+Q0ZYX0ZvbnRDYWNoZSgpIHsKLSAgQVNTRVJUKG1fRXh0RmFjZU1hcC5lbXB0eSgpKTsKLSAgQVNTRVJUKG1fRlRGYWNlTWFwLmVtcHR5KCkpOwotfQotCi1DRlhfRmFjZUNhY2hlKiBDRlhfRm9udENhY2hlOjpHZXRDYWNoZWRGYWNlKGNvbnN0IENGWF9Gb250KiBwRm9udCkgewotICBGWEZUX0ZhY2UgZmFjZSA9IHBGb250LT5HZXRGYWNlKCk7Ci0gIGNvbnN0IGJvb2wgYkV4dGVybmFsID0gIWZhY2U7Ci0gIENGWF9GVENhY2hlTWFwJiBtYXAgPSBiRXh0ZXJuYWwgPyBtX0V4dEZhY2VNYXAgOiBtX0ZURmFjZU1hcDsKLSAgYXV0byBpdCA9IG1hcC5maW5kKGZhY2UpOwotICBpZiAoaXQgIT0gbWFwLmVuZCgpKSB7Ci0gICAgQ291bnRlZEZhY2VDYWNoZSogY291bnRlZF9mYWNlX2NhY2hlID0gaXQtPnNlY29uZC5nZXQoKTsKLSAgICBjb3VudGVkX2ZhY2VfY2FjaGUtPm1fbkNvdW50Kys7Ci0gICAgcmV0dXJuIGNvdW50ZWRfZmFjZV9jYWNoZS0+bV9PYmouZ2V0KCk7Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q291bnRlZEZhY2VDYWNoZT4gY291bnRlZF9mYWNlX2NhY2hlKG5ldyBDb3VudGVkRmFjZUNhY2hlKTsKLSAgY291bnRlZF9mYWNlX2NhY2hlLT5tX25Db3VudCA9IDI7Ci0gIENGWF9GYWNlQ2FjaGUqIGZhY2VfY2FjaGUgPSBuZXcgQ0ZYX0ZhY2VDYWNoZShiRXh0ZXJuYWwgPyBudWxscHRyIDogZmFjZSk7Ci0gIGNvdW50ZWRfZmFjZV9jYWNoZS0+bV9PYmoucmVzZXQoZmFjZV9jYWNoZSk7Ci0gIG1hcFtmYWNlXSA9IHN0ZDo6bW92ZShjb3VudGVkX2ZhY2VfY2FjaGUpOwotICByZXR1cm4gZmFjZV9jYWNoZTsKLX0KLQotI2lmZGVmIF9TS0lBX1NVUFBPUlRfCi1DRlhfVHlwZUZhY2UqIENGWF9Gb250Q2FjaGU6OkdldERldmljZUNhY2hlKGNvbnN0IENGWF9Gb250KiBwRm9udCkgewotICByZXR1cm4gR2V0Q2FjaGVkRmFjZShwRm9udCktPkdldERldmljZUNhY2hlKHBGb250KTsKLX0KLSNlbmRpZgotCi12b2lkIENGWF9Gb250Q2FjaGU6OlJlbGVhc2VDYWNoZWRGYWNlKGNvbnN0IENGWF9Gb250KiBwRm9udCkgewotICBGWEZUX0ZhY2UgZmFjZSA9IHBGb250LT5HZXRGYWNlKCk7Ci0gIGNvbnN0IGJvb2wgYkV4dGVybmFsID0gIWZhY2U7Ci0gIENGWF9GVENhY2hlTWFwJiBtYXAgPSBiRXh0ZXJuYWwgPyBtX0V4dEZhY2VNYXAgOiBtX0ZURmFjZU1hcDsKLQotICBhdXRvIGl0ID0gbWFwLmZpbmQoZmFjZSk7Ci0gIGlmIChpdCA9PSBtYXAuZW5kKCkpCi0gICAgcmV0dXJuOwotCi0gIENvdW50ZWRGYWNlQ2FjaGUqIGNvdW50ZWRfZmFjZV9jYWNoZSA9IGl0LT5zZWNvbmQuZ2V0KCk7Ci0gIGlmIChjb3VudGVkX2ZhY2VfY2FjaGUtPm1fbkNvdW50ID4gMikgewotICAgIGNvdW50ZWRfZmFjZV9jYWNoZS0+bV9uQ291bnQtLTsKLSAgfSBlbHNlIHsKLSAgICBtYXAuZXJhc2UoaXQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZ2UvY2Z4X2ZvbnRtYXBwZXIuY3BwIGIvY29yZS9meGdlL2dlL2NmeF9mb250bWFwcGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY0ZmM5Ni4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Z2UvZ2UvY2Z4X2ZvbnRtYXBwZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODIwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZm9udG1hcHBlci5oIgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9zdWJzdGZvbnQuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZm9udC5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9pZnhfc3lzdGVtZm9udGluZm8uaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKLQotI2RlZmluZSBGWF9GT05UX1NUWUxFX05vbmUgMHgwMAotI2RlZmluZSBGWF9GT05UX1NUWUxFX0JvbGQgMHgwMQotI2RlZmluZSBGWF9GT05UX1NUWUxFX0l0YWxpYyAweDAyCi0jZGVmaW5lIEZYX0ZPTlRfU1RZTEVfQm9sZEJvbGQgMHgwNAotCi1uYW1lc3BhY2UgewotCi1jb25zdCBpbnQga051bVN0YW5kYXJkRm9udHMgPSAxNDsKLQotY29uc3QgRlhfQ0hBUiogY29uc3QgZ19CYXNlMTRGb250TmFtZXNba051bVN0YW5kYXJkRm9udHNdID0gewotICAgICJDb3VyaWVyIiwKLSAgICAiQ291cmllci1Cb2xkIiwKLSAgICAiQ291cmllci1Cb2xkT2JsaXF1ZSIsCi0gICAgIkNvdXJpZXItT2JsaXF1ZSIsCi0gICAgIkhlbHZldGljYSIsCi0gICAgIkhlbHZldGljYS1Cb2xkIiwKLSAgICAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIiwKLSAgICAiSGVsdmV0aWNhLU9ibGlxdWUiLAotICAgICJUaW1lcy1Sb21hbiIsCi0gICAgIlRpbWVzLUJvbGQiLAotICAgICJUaW1lcy1Cb2xkSXRhbGljIiwKLSAgICAiVGltZXMtSXRhbGljIiwKLSAgICAiU3ltYm9sIiwKLSAgICAiWmFwZkRpbmdiYXRzIiwKLX07Ci0KLWNvbnN0IHN0cnVjdCBBbHRGb250TmFtZSB7Ci0gIGNvbnN0IEZYX0NIQVIqIG1fcE5hbWU7Ci0gIGludCBtX0luZGV4OwotfSBnX0FsdEZvbnROYW1lc1tdID0gewotICAgIHsiQXJpYWwiLCA0fSwKLSAgICB7IkFyaWFsLEJvbGQiLCA1fSwKLSAgICB7IkFyaWFsLEJvbGRJdGFsaWMiLCA2fSwKLSAgICB7IkFyaWFsLEl0YWxpYyIsIDd9LAotICAgIHsiQXJpYWwtQm9sZCIsIDV9LAotICAgIHsiQXJpYWwtQm9sZEl0YWxpYyIsIDZ9LAotICAgIHsiQXJpYWwtQm9sZEl0YWxpY01UIiwgNn0sCi0gICAgeyJBcmlhbC1Cb2xkTVQiLCA1fSwKLSAgICB7IkFyaWFsLUl0YWxpYyIsIDd9LAotICAgIHsiQXJpYWwtSXRhbGljTVQiLCA3fSwKLSAgICB7IkFyaWFsQm9sZCIsIDV9LAotICAgIHsiQXJpYWxCb2xkSXRhbGljIiwgNn0sCi0gICAgeyJBcmlhbEl0YWxpYyIsIDd9LAotICAgIHsiQXJpYWxNVCIsIDR9LAotICAgIHsiQXJpYWxNVCxCb2xkIiwgNX0sCi0gICAgeyJBcmlhbE1ULEJvbGRJdGFsaWMiLCA2fSwKLSAgICB7IkFyaWFsTVQsSXRhbGljIiwgN30sCi0gICAgeyJBcmlhbFJvdW5kZWRNVEJvbGQiLCA1fSwKLSAgICB7IkNvdXJpZXIiLCAwfSwKLSAgICB7IkNvdXJpZXIsQm9sZCIsIDF9LAotICAgIHsiQ291cmllcixCb2xkSXRhbGljIiwgMn0sCi0gICAgeyJDb3VyaWVyLEl0YWxpYyIsIDN9LAotICAgIHsiQ291cmllci1Cb2xkIiwgMX0sCi0gICAgeyJDb3VyaWVyLUJvbGRPYmxpcXVlIiwgMn0sCi0gICAgeyJDb3VyaWVyLU9ibGlxdWUiLCAzfSwKLSAgICB7IkNvdXJpZXJCb2xkIiwgMX0sCi0gICAgeyJDb3VyaWVyQm9sZEl0YWxpYyIsIDJ9LAotICAgIHsiQ291cmllckl0YWxpYyIsIDN9LAotICAgIHsiQ291cmllck5ldyIsIDB9LAotICAgIHsiQ291cmllck5ldyxCb2xkIiwgMX0sCi0gICAgeyJDb3VyaWVyTmV3LEJvbGRJdGFsaWMiLCAyfSwKLSAgICB7IkNvdXJpZXJOZXcsSXRhbGljIiwgM30sCi0gICAgeyJDb3VyaWVyTmV3LUJvbGQiLCAxfSwKLSAgICB7IkNvdXJpZXJOZXctQm9sZEl0YWxpYyIsIDJ9LAotICAgIHsiQ291cmllck5ldy1JdGFsaWMiLCAzfSwKLSAgICB7IkNvdXJpZXJOZXdCb2xkIiwgMX0sCi0gICAgeyJDb3VyaWVyTmV3Qm9sZEl0YWxpYyIsIDJ9LAotICAgIHsiQ291cmllck5ld0l0YWxpYyIsIDN9LAotICAgIHsiQ291cmllck5ld1BTLUJvbGRJdGFsaWNNVCIsIDJ9LAotICAgIHsiQ291cmllck5ld1BTLUJvbGRNVCIsIDF9LAotICAgIHsiQ291cmllck5ld1BTLUl0YWxpY01UIiwgM30sCi0gICAgeyJDb3VyaWVyTmV3UFNNVCIsIDB9LAotICAgIHsiQ291cmllclN0ZCIsIDB9LAotICAgIHsiQ291cmllclN0ZC1Cb2xkIiwgMX0sCi0gICAgeyJDb3VyaWVyU3RkLUJvbGRPYmxpcXVlIiwgMn0sCi0gICAgeyJDb3VyaWVyU3RkLU9ibGlxdWUiLCAzfSwKLSAgICB7IkhlbHZldGljYSIsIDR9LAotICAgIHsiSGVsdmV0aWNhLEJvbGQiLCA1fSwKLSAgICB7IkhlbHZldGljYSxCb2xkSXRhbGljIiwgNn0sCi0gICAgeyJIZWx2ZXRpY2EsSXRhbGljIiwgN30sCi0gICAgeyJIZWx2ZXRpY2EtQm9sZCIsIDV9LAotICAgIHsiSGVsdmV0aWNhLUJvbGRJdGFsaWMiLCA2fSwKLSAgICB7IkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsIDZ9LAotICAgIHsiSGVsdmV0aWNhLUl0YWxpYyIsIDd9LAotICAgIHsiSGVsdmV0aWNhLU9ibGlxdWUiLCA3fSwKLSAgICB7IkhlbHZldGljYUJvbGQiLCA1fSwKLSAgICB7IkhlbHZldGljYUJvbGRJdGFsaWMiLCA2fSwKLSAgICB7IkhlbHZldGljYUl0YWxpYyIsIDd9LAotICAgIHsiU3ltYm9sIiwgMTJ9LAotICAgIHsiU3ltYm9sTVQiLCAxMn0sCi0gICAgeyJUaW1lcy1Cb2xkIiwgOX0sCi0gICAgeyJUaW1lcy1Cb2xkSXRhbGljIiwgMTB9LAotICAgIHsiVGltZXMtSXRhbGljIiwgMTF9LAotICAgIHsiVGltZXMtUm9tYW4iLCA4fSwKLSAgICB7IlRpbWVzQm9sZCIsIDl9LAotICAgIHsiVGltZXNCb2xkSXRhbGljIiwgMTB9LAotICAgIHsiVGltZXNJdGFsaWMiLCAxMX0sCi0gICAgeyJUaW1lc05ld1JvbWFuIiwgOH0sCi0gICAgeyJUaW1lc05ld1JvbWFuLEJvbGQiLCA5fSwKLSAgICB7IlRpbWVzTmV3Um9tYW4sQm9sZEl0YWxpYyIsIDEwfSwKLSAgICB7IlRpbWVzTmV3Um9tYW4sSXRhbGljIiwgMTF9LAotICAgIHsiVGltZXNOZXdSb21hbi1Cb2xkIiwgOX0sCi0gICAgeyJUaW1lc05ld1JvbWFuLUJvbGRJdGFsaWMiLCAxMH0sCi0gICAgeyJUaW1lc05ld1JvbWFuLUl0YWxpYyIsIDExfSwKLSAgICB7IlRpbWVzTmV3Um9tYW5Cb2xkIiwgOX0sCi0gICAgeyJUaW1lc05ld1JvbWFuQm9sZEl0YWxpYyIsIDEwfSwKLSAgICB7IlRpbWVzTmV3Um9tYW5JdGFsaWMiLCAxMX0sCi0gICAgeyJUaW1lc05ld1JvbWFuUFMiLCA4fSwKLSAgICB7IlRpbWVzTmV3Um9tYW5QUy1Cb2xkIiwgOX0sCi0gICAgeyJUaW1lc05ld1JvbWFuUFMtQm9sZEl0YWxpYyIsIDEwfSwKLSAgICB7IlRpbWVzTmV3Um9tYW5QUy1Cb2xkSXRhbGljTVQiLCAxMH0sCi0gICAgeyJUaW1lc05ld1JvbWFuUFMtQm9sZE1UIiwgOX0sCi0gICAgeyJUaW1lc05ld1JvbWFuUFMtSXRhbGljIiwgMTF9LAotICAgIHsiVGltZXNOZXdSb21hblBTLUl0YWxpY01UIiwgMTF9LAotICAgIHsiVGltZXNOZXdSb21hblBTTVQiLCA4fSwKLSAgICB7IlRpbWVzTmV3Um9tYW5QU01ULEJvbGQiLCA5fSwKLSAgICB7IlRpbWVzTmV3Um9tYW5QU01ULEJvbGRJdGFsaWMiLCAxMH0sCi0gICAgeyJUaW1lc05ld1JvbWFuUFNNVCxJdGFsaWMiLCAxMX0sCi0gICAgeyJaYXBmRGluZ2JhdHMiLCAxM30sCi19OwotCi1jb25zdCBzdHJ1Y3QgQWx0Rm9udEZhbWlseSB7Ci0gIGNvbnN0IEZYX0NIQVIqIG1fcEZvbnROYW1lOwotICBjb25zdCBGWF9DSEFSKiBtX3BGb250RmFtaWx5OwotfSBnX0FsdEZvbnRGYW1pbGllc1tdID0gewotICAgIHsiQUdhcmFtb25kUHJvIiwgIkFkb2JlIEdhcmFtb25kIFBybyJ9LAotICAgIHsiQmFua0dvdGhpY0JULU1lZGl1bSIsICJCYW5rR290aGljIE1kIEJUIn0sCi0gICAgeyJGb3J0ZU1UIiwgIkZvcnRlIn0sCi19OwotCi1jb25zdCBzdHJ1Y3QgRlhfRm9udFN0eWxlIHsKLSAgY29uc3QgRlhfQ0hBUiogc3R5bGU7Ci0gIGludDMyX3QgbGVuOwotfSBnX0ZvbnRTdHlsZXNbXSA9IHsKLSAgICB7IkJvbGQiLCA0fSwgeyJJdGFsaWMiLCA2fSwgeyJCb2xkSXRhbGljIiwgMTB9LCB7IlJlZyIsIDN9LCB7IlJlZ3VsYXIiLCA3fSwKLX07Ci0KLWNvbnN0IHN0cnVjdCBDT0RFUEFHRV9NQVAgewotICB1aW50MTZfdCBjb2RlcGFnZTsKLSAgdWludDhfdCBjaGFyc2V0OwotfSBnX0NvZGVwYWdlMkNoYXJzZXRUYWJsZVtdID0gewotICAgIHswLCAxfSwgICAgICB7NDIsIDJ9LCAgICAgezQzNywgMjU0fSwgIHs4NTAsIDI1NX0sICB7ODc0LCAyMjJ9LAotICAgIHs5MzIsIDEyOH0sICB7OTM2LCAxMzR9LCAgezk0OSwgMTI5fSwgIHs5NTAsIDEzNn0sICB7MTI1MCwgMjM4fSwKLSAgICB7MTI1MSwgMjA0fSwgezEyNTIsIDB9LCAgIHsxMjUzLCAxNjF9LCB7MTI1NCwgMTYyfSwgezEyNTUsIDE3N30sCi0gICAgezEyNTYsIDE3OH0sIHsxMjU3LCAxODZ9LCB7MTI1OCwgMTYzfSwgezEzNjEsIDEzMH0sIHsxMDAwMCwgNzd9LAotICAgIHsxMDAwMSwgNzh9LCB7MTAwMDIsIDgxfSwgezEwMDAzLCA3OX0sIHsxMDAwNCwgODR9LCB7MTAwMDUsIDgzfSwKLSAgICB7MTAwMDYsIDg1fSwgezEwMDA3LCA4OX0sIHsxMDAwOCwgODB9LCB7MTAwMjEsIDg3fSwgezEwMDI5LCA4OH0sCi0gICAgezEwMDgxLCA4Nn0sCi19OwotCi1pbnQgQ29tcGFyZUZvbnRGYW1pbHlTdHJpbmcoY29uc3Qgdm9pZCoga2V5LCBjb25zdCB2b2lkKiBlbGVtZW50KSB7Ci0gIENGWF9CeXRlU3RyaW5nIHN0cl9rZXkoKGNvbnN0IEZYX0NIQVIqKWtleSk7Ci0gIGNvbnN0IEFsdEZvbnRGYW1pbHkqIGZhbWlseSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQWx0Rm9udEZhbWlseSo+KGVsZW1lbnQpOwotICBpZiAoc3RyX2tleS5GaW5kKGZhbWlseS0+bV9wRm9udE5hbWUpICE9IC0xKQotICAgIHJldHVybiAwOwotICByZXR1cm4gRlhTWVNfc3RyaWNtcChyZWludGVycHJldF9jYXN0PGNvbnN0IEZYX0NIQVIqPihrZXkpLAotICAgICAgICAgICAgICAgICAgICAgICBmYW1pbHktPm1fcEZvbnROYW1lKTsKLX0KLQotaW50IENvbXBhcmVTdHJpbmcoY29uc3Qgdm9pZCoga2V5LCBjb25zdCB2b2lkKiBlbGVtZW50KSB7Ci0gIHJldHVybiBGWFNZU19zdHJpY21wKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRlhfQ0hBUio+KGtleSksCi0gICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQWx0Rm9udE5hbWUqPihlbGVtZW50KS0+bV9wTmFtZSk7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIFRUX05vcm1hbGl6ZU5hbWUoY29uc3QgRlhfQ0hBUiogZmFtaWx5KSB7Ci0gIENGWF9CeXRlU3RyaW5nIG5vcm0oZmFtaWx5KTsKLSAgbm9ybS5SZW1vdmUoJyAnKTsKLSAgbm9ybS5SZW1vdmUoJy0nKTsKLSAgbm9ybS5SZW1vdmUoJywnKTsKLSAgaW50IHBvcyA9IG5vcm0uRmluZCgnKycpOwotICBpZiAocG9zID4gMCkKLSAgICBub3JtID0gbm9ybS5MZWZ0KHBvcyk7Ci0gIG5vcm0uTWFrZUxvd2VyKCk7Ci0gIHJldHVybiBub3JtOwotfQotCi11aW50OF90IEdldENoYXJzZXRGcm9tQ29kZVBhZ2UodWludDE2X3QgY29kZXBhZ2UpIHsKLSAgY29uc3QgQ09ERVBBR0VfTUFQKiBwRW5kID0KLSAgICAgIGdfQ29kZXBhZ2UyQ2hhcnNldFRhYmxlICsgRlhfQXJyYXlTaXplKGdfQ29kZXBhZ2UyQ2hhcnNldFRhYmxlKTsKLSAgY29uc3QgQ09ERVBBR0VfTUFQKiBwQ2hhcm1hcCA9Ci0gICAgICBzdGQ6Omxvd2VyX2JvdW5kKGdfQ29kZXBhZ2UyQ2hhcnNldFRhYmxlLCBwRW5kLCBjb2RlcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgQ09ERVBBR0VfTUFQJiBjaGFyc2V0LCB1aW50MTZfdCBwYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoYXJzZXQuY29kZXBhZ2UgPCBwYWdlOwotICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgaWYgKHBDaGFybWFwIDwgcEVuZCAmJiBjb2RlcGFnZSA9PSBwQ2hhcm1hcC0+Y29kZXBhZ2UpCi0gICAgcmV0dXJuIHBDaGFybWFwLT5jaGFyc2V0OwotICByZXR1cm4gRlhGT05UX0RFRkFVTFRfQ0hBUlNFVDsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgR2V0Rm9udEZhbWlseShDRlhfQnl0ZVN0cmluZyBmb250TmFtZSwgaW50IG5TdHlsZSkgewotICBpZiAoZm9udE5hbWUuRmluZCgiU2NyaXB0IikgPj0gMCkgewotICAgIGlmICgoblN0eWxlICYgRlhfRk9OVF9TVFlMRV9Cb2xkKSA9PSBGWF9GT05UX1NUWUxFX0JvbGQpCi0gICAgICBmb250TmFtZSA9ICJTY3JpcHRNVEJvbGQiOwotICAgIGVsc2UgaWYgKGZvbnROYW1lLkZpbmQoIlBhbGFjZSIpID49IDApCi0gICAgICBmb250TmFtZSA9ICJQYWxhY2VTY3JpcHRNVCI7Ci0gICAgZWxzZSBpZiAoZm9udE5hbWUuRmluZCgiRnJlbmNoIikgPj0gMCkKLSAgICAgIGZvbnROYW1lID0gIkZyZW5jaFNjcmlwdE1UIjsKLSAgICBlbHNlIGlmIChmb250TmFtZS5GaW5kKCJGcmVlU3R5bGUiKSA+PSAwKQotICAgICAgZm9udE5hbWUgPSAiRnJlZVN0eWxlU2NyaXB0IjsKLSAgICByZXR1cm4gZm9udE5hbWU7Ci0gIH0KLSAgQWx0Rm9udEZhbWlseSogZm91bmQgPSByZWludGVycHJldF9jYXN0PEFsdEZvbnRGYW1pbHkqPihGWFNZU19ic2VhcmNoKAotICAgICAgZm9udE5hbWUuY19zdHIoKSwgZ19BbHRGb250RmFtaWxpZXMsIEZYX0FycmF5U2l6ZShnX0FsdEZvbnRGYW1pbGllcyksCi0gICAgICBzaXplb2YoQWx0Rm9udEZhbWlseSksIENvbXBhcmVGb250RmFtaWx5U3RyaW5nKSk7Ci0gIHJldHVybiBmb3VuZCA/IENGWF9CeXRlU3RyaW5nKGZvdW5kLT5tX3BGb250RmFtaWx5KSA6IGZvbnROYW1lOwotfQotCi1DRlhfQnl0ZVN0cmluZyBQYXJzZVN0eWxlKGNvbnN0IEZYX0NIQVIqIHBTdHlsZSwgaW50IGlMZW4sIGludCBpSW5kZXgpIHsKLSAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKLSAgaWYgKCFpTGVuIHx8IGlMZW4gPD0gaUluZGV4KQotICAgIHJldHVybiBidWYuTWFrZVN0cmluZygpOwotICB3aGlsZSAoaUluZGV4IDwgaUxlbikgewotICAgIGlmIChwU3R5bGVbaUluZGV4XSA9PSAnLCcpCi0gICAgICBicmVhazsKLSAgICBidWYuQXBwZW5kQ2hhcihwU3R5bGVbaUluZGV4XSk7Ci0gICAgKytpSW5kZXg7Ci0gIH0KLSAgcmV0dXJuIGJ1Zi5NYWtlU3RyaW5nKCk7Ci19Ci0KLWludDMyX3QgR2V0U3R5bGVUeXBlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic1N0eWxlLCBib29sIGJSZXZlcnNlKSB7Ci0gIGludDMyX3QgaUxlbiA9IGJzU3R5bGUuR2V0TGVuZ3RoKCk7Ci0gIGlmICghaUxlbikKLSAgICByZXR1cm4gLTE7Ci0gIGludCBpU2l6ZSA9IEZYX0FycmF5U2l6ZShnX0ZvbnRTdHlsZXMpOwotICBjb25zdCBGWF9Gb250U3R5bGUqIHBTdHlsZSA9IG51bGxwdHI7Ci0gIGZvciAoaW50IGkgPSBpU2l6ZSAtIDE7IGkgPj0gMDsgLS1pKSB7Ci0gICAgcFN0eWxlID0gZ19Gb250U3R5bGVzICsgaTsKLSAgICBpZiAoIXBTdHlsZSB8fCBwU3R5bGUtPmxlbiA+IGlMZW4pCi0gICAgICBjb250aW51ZTsKLQotICAgIGlmIChiUmV2ZXJzZSkgewotICAgICAgaWYgKGJzU3R5bGUuUmlnaHQocFN0eWxlLT5sZW4pLkNvbXBhcmUocFN0eWxlLT5zdHlsZSkgPT0gMCkKLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChic1N0eWxlLkxlZnQocFN0eWxlLT5sZW4pLkNvbXBhcmUocFN0eWxlLT5zdHlsZSkgPT0gMCkKLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICB9Ci0gIHJldHVybiAtMTsKLX0KLQotYm9vbCBDaGVja1N1cHBvcnRUaGlyZFBhcnRGb250KENGWF9CeXRlU3RyaW5nIG5hbWUsIGludCYgUGl0Y2hGYW1pbHkpIHsKLSAgaWYgKG5hbWUgPT0gIk15cmlhZFBybyIpIHsKLSAgICBQaXRjaEZhbWlseSAmPSB+RlhGT05UX0ZGX1JPTUFOOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBVcGRhdGVQaXRjaEZhbWlseSh1aW50MzJfdCBmbGFncywgaW50JiBQaXRjaEZhbWlseSkgewotICBpZiAoZmxhZ3MgJiBGWEZPTlRfU0VSSUYpCi0gICAgUGl0Y2hGYW1pbHkgfD0gRlhGT05UX0ZGX1JPTUFOOwotICBpZiAoZmxhZ3MgJiBGWEZPTlRfU0NSSVBUKQotICAgIFBpdGNoRmFtaWx5IHw9IEZYRk9OVF9GRl9TQ1JJUFQ7Ci0gIGlmIChmbGFncyAmIEZYRk9OVF9GSVhFRF9QSVRDSCkKLSAgICBQaXRjaEZhbWlseSB8PSBGWEZPTlRfRkZfRklYRURQSVRDSDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLUNGWF9Gb250TWFwcGVyOjpDRlhfRm9udE1hcHBlcihDRlhfRm9udE1nciogbWdyKQotICAgIDogbV9iTGlzdExvYWRlZChmYWxzZSksIG1fcEZvbnRNZ3IobWdyKSB7Ci0gIG1fTU1GYWNlc1swXSA9IG51bGxwdHI7Ci0gIG1fTU1GYWNlc1sxXSA9IG51bGxwdHI7Ci0gIEZYU1lTX21lbXNldChtX0ZveGl0RmFjZXMsIDAsIHNpemVvZihtX0ZveGl0RmFjZXMpKTsKLX0KLQotQ0ZYX0ZvbnRNYXBwZXI6On5DRlhfRm9udE1hcHBlcigpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUobV9Gb3hpdEZhY2VzKTsgKytpKSB7Ci0gICAgaWYgKG1fRm94aXRGYWNlc1tpXSkKLSAgICAgIEZYRlRfRG9uZV9GYWNlKG1fRm94aXRGYWNlc1tpXSk7Ci0gIH0KLSAgaWYgKG1fTU1GYWNlc1swXSkKLSAgICBGWEZUX0RvbmVfRmFjZShtX01NRmFjZXNbMF0pOwotICBpZiAobV9NTUZhY2VzWzFdKQotICAgIEZYRlRfRG9uZV9GYWNlKG1fTU1GYWNlc1sxXSk7Ci19Ci0KLXZvaWQgQ0ZYX0ZvbnRNYXBwZXI6OlNldFN5c3RlbUZvbnRJbmZvKAotICAgIHN0ZDo6dW5pcXVlX3B0cjxJRlhfU3lzdGVtRm9udEluZm8+IHBGb250SW5mbykgewotICBpZiAoIXBGb250SW5mbykKLSAgICByZXR1cm47Ci0KLSAgbV9wRm9udEluZm8gPSBzdGQ6Om1vdmUocEZvbnRJbmZvKTsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0ZvbnRNYXBwZXI6OkdldFBTTmFtZUZyb21UVCh2b2lkKiBoRm9udCkgewotICBpZiAoIW1fcEZvbnRJbmZvKQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotCi0gIHVpbnQzMl90IHNpemUgPSBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIGtUYWJsZU5BTUUsIG51bGxwdHIsIDApOwotICBpZiAoIXNpemUpCi0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0KLSAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnVmZmVyKHNpemUpOwotICB1aW50OF90KiBidWZmZXJfcHRyID0gYnVmZmVyLmRhdGEoKTsKLSAgdWludDMyX3QgYnl0ZXNfcmVhZCA9Ci0gICAgICBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIGtUYWJsZU5BTUUsIGJ1ZmZlcl9wdHIsIHNpemUpOwotICByZXR1cm4gYnl0ZXNfcmVhZCA9PSBzaXplID8gR2V0TmFtZUZyb21UVChidWZmZXJfcHRyLCBieXRlc19yZWFkLCA2KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ0ZYX0J5dGVTdHJpbmcoKTsKLX0KLQotdm9pZCBDRlhfRm9udE1hcHBlcjo6QWRkSW5zdGFsbGVkRm9udChjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwgaW50IGNoYXJzZXQpIHsKLSAgaWYgKCFtX3BGb250SW5mbykKLSAgICByZXR1cm47Ci0KLSAgbV9GYWNlQXJyYXkucHVzaF9iYWNrKHtuYW1lLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY2hhcnNldCl9KTsKLSAgaWYgKG5hbWUgPT0gbV9MYXN0RmFtaWx5KQotICAgIHJldHVybjsKLQotICBjb25zdCB1aW50OF90KiBwdHIgPSBuYW1lLnJhd19zdHIoKTsKLSAgYm9vbCBiTG9jYWxpemVkID0gZmFsc2U7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5HZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgaWYgKHB0cltpXSA+IDB4ODApIHsKLSAgICAgIGJMb2NhbGl6ZWQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGJMb2NhbGl6ZWQpIHsKLSAgICB2b2lkKiBoRm9udCA9IG1fcEZvbnRJbmZvLT5HZXRGb250KG5hbWUuY19zdHIoKSk7Ci0gICAgaWYgKCFoRm9udCkgewotICAgICAgaW50IGlFeGFjdDsKLSAgICAgIGhGb250ID0gbV9wRm9udEluZm8tPk1hcEZvbnQoMCwgMCwgRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpLCBpRXhhY3QpOwotICAgICAgaWYgKCFoRm9udCkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIENGWF9CeXRlU3RyaW5nIG5ld19uYW1lID0gR2V0UFNOYW1lRnJvbVRUKGhGb250KTsKLSAgICBpZiAoIW5ld19uYW1lLklzRW1wdHkoKSkKLSAgICAgIG1fTG9jYWxpemVkVFRGb250cy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIobmV3X25hbWUsIG5hbWUpKTsKLSAgICBtX3BGb250SW5mby0+RGVsZXRlRm9udChoRm9udCk7Ci0gIH0KLSAgbV9JbnN0YWxsZWRUVEZvbnRzLnB1c2hfYmFjayhuYW1lKTsKLSAgbV9MYXN0RmFtaWx5ID0gbmFtZTsKLX0KLQotdm9pZCBDRlhfRm9udE1hcHBlcjo6TG9hZEluc3RhbGxlZEZvbnRzKCkgewotICBpZiAoIW1fcEZvbnRJbmZvIHx8IG1fYkxpc3RMb2FkZWQpCi0gICAgcmV0dXJuOwotCi0gIG1fcEZvbnRJbmZvLT5FbnVtRm9udExpc3QodGhpcyk7Ci0gIG1fYkxpc3RMb2FkZWQgPSB0cnVlOwotfQotCi1DRlhfQnl0ZVN0cmluZyBDRlhfRm9udE1hcHBlcjo6TWF0Y2hJbnN0YWxsZWRGb250cygKLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgbm9ybV9uYW1lKSB7Ci0gIExvYWRJbnN0YWxsZWRGb250cygpOwotICBpbnQgaTsKLSAgZm9yIChpID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQ+KG1fSW5zdGFsbGVkVFRGb250cykgLSAxOyBpID49IDA7IGktLSkgewotICAgIENGWF9CeXRlU3RyaW5nIG5vcm0xID0gVFRfTm9ybWFsaXplTmFtZShtX0luc3RhbGxlZFRURm9udHNbaV0uY19zdHIoKSk7Ci0gICAgaWYgKG5vcm0xID09IG5vcm1fbmFtZSkKLSAgICAgIHJldHVybiBtX0luc3RhbGxlZFRURm9udHNbaV07Ci0gIH0KLSAgZm9yIChpID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQ+KG1fTG9jYWxpemVkVFRGb250cykgLSAxOyBpID49IDA7IGktLSkgewotICAgIENGWF9CeXRlU3RyaW5nIG5vcm0xID0KLSAgICAgICAgVFRfTm9ybWFsaXplTmFtZShtX0xvY2FsaXplZFRURm9udHNbaV0uZmlyc3QuY19zdHIoKSk7Ci0gICAgaWYgKG5vcm0xID09IG5vcm1fbmFtZSkKLSAgICAgIHJldHVybiBtX0xvY2FsaXplZFRURm9udHNbaV0uc2Vjb25kOwotICB9Ci0gIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotfQotCi1GWEZUX0ZhY2UgQ0ZYX0ZvbnRNYXBwZXI6OlVzZUludGVybmFsU3Vic3QoQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaUJhc2VGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGFsaWNfYW5nbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGljdGhmYW1pbHkpIHsKLSAgaWYgKGlCYXNlRm9udCA8IGtOdW1TdGFuZGFyZEZvbnRzKSB7Ci0gICAgaWYgKG1fRm94aXRGYWNlc1tpQmFzZUZvbnRdKQotICAgICAgcmV0dXJuIG1fRm94aXRGYWNlc1tpQmFzZUZvbnRdOwotICAgIGNvbnN0IHVpbnQ4X3QqIHBGb250RGF0YSA9IG51bGxwdHI7Ci0gICAgdWludDMyX3Qgc2l6ZSA9IDA7Ci0gICAgaWYgKG1fcEZvbnRNZ3ItPkdldEJ1aWx0aW5Gb250KGlCYXNlRm9udCwgJnBGb250RGF0YSwgJnNpemUpKSB7Ci0gICAgICBtX0ZveGl0RmFjZXNbaUJhc2VGb250XSA9IG1fcEZvbnRNZ3ItPkdldEZpeGVkRmFjZShwRm9udERhdGEsIHNpemUsIDApOwotICAgICAgcmV0dXJuIG1fRm94aXRGYWNlc1tpQmFzZUZvbnRdOwotICAgIH0KLSAgfQotICBwU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgfD0gRlhGT05UX1NVQlNUX01NOwotICBwU3Vic3RGb250LT5tX0l0YWxpY0FuZ2xlID0gaXRhbGljX2FuZ2xlOwotICBpZiAod2VpZ2h0KQotICAgIHBTdWJzdEZvbnQtPm1fV2VpZ2h0ID0gd2VpZ2h0OwotICBpZiAocGljdGhmYW1pbHkgJiBGWEZPTlRfRkZfUk9NQU4pIHsKLSAgICBwU3Vic3RGb250LT5tX1dlaWdodCA9IHBTdWJzdEZvbnQtPm1fV2VpZ2h0ICogNCAvIDU7Ci0gICAgcFN1YnN0Rm9udC0+bV9GYW1pbHkgPSAiQ2hyb21lIFNlcmlmIjsKLSAgICBpZiAobV9NTUZhY2VzWzFdKQotICAgICAgcmV0dXJuIG1fTU1GYWNlc1sxXTsKLSAgICBjb25zdCB1aW50OF90KiBwRm9udERhdGEgPSBudWxscHRyOwotICAgIHVpbnQzMl90IHNpemUgPSAwOwotICAgIG1fcEZvbnRNZ3ItPkdldEJ1aWx0aW5Gb250KDE0LCAmcEZvbnREYXRhLCAmc2l6ZSk7Ci0gICAgbV9NTUZhY2VzWzFdID0gbV9wRm9udE1nci0+R2V0Rml4ZWRGYWNlKHBGb250RGF0YSwgc2l6ZSwgMCk7Ci0gICAgcmV0dXJuIG1fTU1GYWNlc1sxXTsKLSAgfQotICBwU3Vic3RGb250LT5tX0ZhbWlseSA9ICJDaHJvbWUgU2FucyI7Ci0gIGlmIChtX01NRmFjZXNbMF0pCi0gICAgcmV0dXJuIG1fTU1GYWNlc1swXTsKLSAgY29uc3QgdWludDhfdCogcEZvbnREYXRhID0gbnVsbHB0cjsKLSAgdWludDMyX3Qgc2l6ZSA9IDA7Ci0gIG1fcEZvbnRNZ3ItPkdldEJ1aWx0aW5Gb250KDE1LCAmcEZvbnREYXRhLCAmc2l6ZSk7Ci0gIG1fTU1GYWNlc1swXSA9IG1fcEZvbnRNZ3ItPkdldEZpeGVkRmFjZShwRm9udERhdGEsIHNpemUsIDApOwotICByZXR1cm4gbV9NTUZhY2VzWzBdOwotfQotCi1GWEZUX0ZhY2UgQ0ZYX0ZvbnRNYXBwZXI6OkZpbmRTdWJzdEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVHJ1ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRhbGljX2FuZ2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBXaW5kb3dDUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfU3Vic3RGb250KiBwU3Vic3RGb250KSB7Ci0gIGlmICghKGZsYWdzICYgRlhGT05UX1VTRUVYVEVSTkFUVFIpKSB7Ci0gICAgd2VpZ2h0ID0gRlhGT05UX0ZXX05PUk1BTDsKLSAgICBpdGFsaWNfYW5nbGUgPSAwOwotICB9Ci0gIENGWF9CeXRlU3RyaW5nIFN1YnN0TmFtZSA9IG5hbWU7Ci0gIFN1YnN0TmFtZS5SZW1vdmUoJyAnKTsKLSAgaWYgKGJUcnVlVHlwZSAmJiBuYW1lWzBdID09ICdAJykKLSAgICBTdWJzdE5hbWUgPSBuYW1lLk1pZCgxKTsKLSAgUERGX0dldFN0YW5kYXJkRm9udE5hbWUoJlN1YnN0TmFtZSk7Ci0gIGlmIChTdWJzdE5hbWUgPT0gIlN5bWJvbCIgJiYgIWJUcnVlVHlwZSkgewotICAgIHBTdWJzdEZvbnQtPm1fRmFtaWx5ID0gIkNocm9tZSBTeW1ib2wiOwotICAgIHBTdWJzdEZvbnQtPm1fQ2hhcnNldCA9IEZYRk9OVF9TWU1CT0xfQ0hBUlNFVDsKLSAgICByZXR1cm4gVXNlSW50ZXJuYWxTdWJzdChwU3Vic3RGb250LCAxMiwgaXRhbGljX2FuZ2xlLCB3ZWlnaHQsIDApOwotICB9Ci0gIGlmIChTdWJzdE5hbWUgPT0gIlphcGZEaW5nYmF0cyIpIHsKLSAgICBwU3Vic3RGb250LT5tX0ZhbWlseSA9ICJDaHJvbWUgRGluZ2JhdHMiOwotICAgIHBTdWJzdEZvbnQtPm1fQ2hhcnNldCA9IEZYRk9OVF9TWU1CT0xfQ0hBUlNFVDsKLSAgICByZXR1cm4gVXNlSW50ZXJuYWxTdWJzdChwU3Vic3RGb250LCAxMywgaXRhbGljX2FuZ2xlLCB3ZWlnaHQsIDApOwotICB9Ci0gIGludCBpQmFzZUZvbnQgPSAwOwotICBDRlhfQnl0ZVN0cmluZyBmYW1pbHk7Ci0gIENGWF9CeXRlU3RyaW5nIHN0eWxlOwotICBib29sIGJIYXNDb21tYSA9IGZhbHNlOwotICBib29sIGJIYXNIeXBoZW4gPSBmYWxzZTsKLSAgaW50IGZpbmQgPSBTdWJzdE5hbWUuRmluZCgiLCIsIDApOwotICBpZiAoZmluZCA+PSAwKSB7Ci0gICAgZmFtaWx5ID0gU3Vic3ROYW1lLkxlZnQoZmluZCk7Ci0gICAgUERGX0dldFN0YW5kYXJkRm9udE5hbWUoJmZhbWlseSk7Ci0gICAgc3R5bGUgPSBTdWJzdE5hbWUuTWlkKGZpbmQgKyAxKTsKLSAgICBiSGFzQ29tbWEgPSB0cnVlOwotICB9IGVsc2UgewotICAgIGZhbWlseSA9IFN1YnN0TmFtZTsKLSAgfQotICBmb3IgKDsgaUJhc2VGb250IDwgMTI7IGlCYXNlRm9udCsrKSB7Ci0gICAgaWYgKGZhbWlseSA9PSBDRlhfQnl0ZVN0cmluZ0MoZ19CYXNlMTRGb250TmFtZXNbaUJhc2VGb250XSkpCi0gICAgICBicmVhazsKLSAgfQotICBpbnQgUGl0Y2hGYW1pbHkgPSAwOwotICBib29sIGJJdGFsaWMgPSBmYWxzZTsKLSAgdWludDMyX3QgblN0eWxlID0gMDsKLSAgYm9vbCBiU3R5bGVBdmFpbCA9IGZhbHNlOwotICBpZiAoaUJhc2VGb250IDwgMTIpIHsKLSAgICBpZiAoKGlCYXNlRm9udCAlIDQpID09IDEgfHwgKGlCYXNlRm9udCAlIDQpID09IDIpCi0gICAgICBuU3R5bGUgfD0gRlhfRk9OVF9TVFlMRV9Cb2xkOwotICAgIGlmICgoaUJhc2VGb250ICUgNCkgLyAyKQotICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfSXRhbGljOwotICAgIGlmIChpQmFzZUZvbnQgPCA0KQotICAgICAgUGl0Y2hGYW1pbHkgfD0gRlhGT05UX0ZGX0ZJWEVEUElUQ0g7Ci0gICAgaWYgKGlCYXNlRm9udCA+PSA4KQotICAgICAgUGl0Y2hGYW1pbHkgfD0gRlhGT05UX0ZGX1JPTUFOOwotICB9IGVsc2UgewotICAgIGlCYXNlRm9udCA9IGtOdW1TdGFuZGFyZEZvbnRzOwotICAgIGlmICghYkhhc0NvbW1hKSB7Ci0gICAgICBmaW5kID0gZmFtaWx5LlJldmVyc2VGaW5kKCctJyk7Ci0gICAgICBpZiAoZmluZCA+PSAwKSB7Ci0gICAgICAgIHN0eWxlID0gZmFtaWx5Lk1pZChmaW5kICsgMSk7Ci0gICAgICAgIGZhbWlseSA9IGZhbWlseS5MZWZ0KGZpbmQpOwotICAgICAgICBiSGFzSHlwaGVuID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFiSGFzSHlwaGVuKSB7Ci0gICAgICBpbnQgbkxlbiA9IGZhbWlseS5HZXRMZW5ndGgoKTsKLSAgICAgIGludDMyX3QgblJldCA9IEdldFN0eWxlVHlwZShmYW1pbHksIHRydWUpOwotICAgICAgaWYgKG5SZXQgPiAtMSkgewotICAgICAgICBmYW1pbHkgPSBmYW1pbHkuTGVmdChuTGVuIC0gZ19Gb250U3R5bGVzW25SZXRdLmxlbik7Ci0gICAgICAgIGlmIChuUmV0ID09IDApCi0gICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfQm9sZDsKLSAgICAgICAgZWxzZSBpZiAoblJldCA9PSAxKQotICAgICAgICAgIG5TdHlsZSB8PSBGWF9GT05UX1NUWUxFX0l0YWxpYzsKLSAgICAgICAgZWxzZSBpZiAoblJldCA9PSAyKQotICAgICAgICAgIG5TdHlsZSB8PSAoRlhfRk9OVF9TVFlMRV9Cb2xkIHwgRlhfRk9OVF9TVFlMRV9JdGFsaWMpOwotICAgICAgfQotICAgIH0KLSAgICBVcGRhdGVQaXRjaEZhbWlseShmbGFncywgUGl0Y2hGYW1pbHkpOwotICB9Ci0gIGlmICghc3R5bGUuSXNFbXB0eSgpKSB7Ci0gICAgaW50IG5MZW4gPSBzdHlsZS5HZXRMZW5ndGgoKTsKLSAgICBjb25zdCBGWF9DSEFSKiBwU3R5bGUgPSBzdHlsZS5jX3N0cigpOwotICAgIGludCBpID0gMDsKLSAgICBib29sIGJGaXJzdEl0ZW0gPSB0cnVlOwotICAgIENGWF9CeXRlU3RyaW5nIGJ1ZjsKLSAgICB3aGlsZSAoaSA8IG5MZW4pIHsKLSAgICAgIGJ1ZiA9IFBhcnNlU3R5bGUocFN0eWxlLCBuTGVuLCBpKTsKLSAgICAgIGludDMyX3QgblJldCA9IEdldFN0eWxlVHlwZShidWYsIGZhbHNlKTsKLSAgICAgIGlmICgoaSAmJiAhYlN0eWxlQXZhaWwpIHx8ICghaSAmJiBuUmV0IDwgMCkpIHsKLSAgICAgICAgZmFtaWx5ID0gU3Vic3ROYW1lOwotICAgICAgICBpQmFzZUZvbnQgPSBrTnVtU3RhbmRhcmRGb250czsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBpZiAoblJldCA+PSAwKSB7Ci0gICAgICAgIGJTdHlsZUF2YWlsID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChuUmV0ID09IDEpIHsKLSAgICAgICAgaWYgKGJGaXJzdEl0ZW0pIHsKLSAgICAgICAgICBuU3R5bGUgfD0gRlhfRk9OVF9TVFlMRV9JdGFsaWM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZmFtaWx5ID0gU3Vic3ROYW1lOwotICAgICAgICAgIGlCYXNlRm9udCA9IGtOdW1TdGFuZGFyZEZvbnRzOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKG5SZXQgPT0gMCkgewotICAgICAgICBpZiAoblN0eWxlICYgRlhfRk9OVF9TVFlMRV9Cb2xkKQotICAgICAgICAgIG5TdHlsZSB8PSBGWF9GT05UX1NUWUxFX0JvbGRCb2xkOwotICAgICAgICBlbHNlCi0gICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfQm9sZDsKLSAgICAgICAgYkZpcnN0SXRlbSA9IGZhbHNlOwotICAgICAgfSBlbHNlIGlmIChuUmV0ID09IDIpIHsKLSAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfSXRhbGljOwotICAgICAgICBpZiAoblN0eWxlICYgRlhfRk9OVF9TVFlMRV9Cb2xkKQotICAgICAgICAgIG5TdHlsZSB8PSBGWF9GT05UX1NUWUxFX0JvbGRCb2xkOwotICAgICAgICBlbHNlCi0gICAgICAgICAgblN0eWxlIHw9IEZYX0ZPTlRfU1RZTEVfQm9sZDsKLSAgICAgICAgYkZpcnN0SXRlbSA9IGZhbHNlOwotICAgICAgfQotICAgICAgaSArPSBidWYuR2V0TGVuZ3RoKCkgKyAxOwotICAgIH0KLSAgfQotICB3ZWlnaHQgPSB3ZWlnaHQgPyB3ZWlnaHQgOiBGWEZPTlRfRldfTk9STUFMOwotICBpbnQgb2xkX3dlaWdodCA9IHdlaWdodDsKLSAgaWYgKG5TdHlsZSkgewotICAgIHdlaWdodCA9Ci0gICAgICAgIG5TdHlsZSAmIEZYX0ZPTlRfU1RZTEVfQm9sZEJvbGQKLSAgICAgICAgICAgID8gOTAwCi0gICAgICAgICAgICA6IChuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0JvbGQgPyBGWEZPTlRfRldfQk9MRCA6IEZYRk9OVF9GV19OT1JNQUwpOwotICB9Ci0gIGlmIChuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0l0YWxpYykKLSAgICBiSXRhbGljID0gdHJ1ZTsKLSAgaW50IGlFeGFjdCA9IDA7Ci0gIGludCBDaGFyc2V0ID0gRlhGT05UX0FOU0lfQ0hBUlNFVDsKLSAgaWYgKFdpbmRvd0NQKQotICAgIENoYXJzZXQgPSBHZXRDaGFyc2V0RnJvbUNvZGVQYWdlKFdpbmRvd0NQKTsKLSAgZWxzZSBpZiAoaUJhc2VGb250ID09IGtOdW1TdGFuZGFyZEZvbnRzICYmIChmbGFncyAmIEZYRk9OVF9TWU1CT0xJQykpCi0gICAgQ2hhcnNldCA9IEZYRk9OVF9TWU1CT0xfQ0hBUlNFVDsKLSAgYm9vbCBiQ0pLID0KLSAgICAgIChDaGFyc2V0ID09IEZYRk9OVF9TSElGVEpJU19DSEFSU0VUIHx8IENoYXJzZXQgPT0gRlhGT05UX0dCMjMxMl9DSEFSU0VUIHx8Ci0gICAgICAgQ2hhcnNldCA9PSBGWEZPTlRfSEFOR1VMX0NIQVJTRVQgfHwKLSAgICAgICBDaGFyc2V0ID09IEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUKTsKLSAgaWYgKCFtX3BGb250SW5mbykgewotICAgIHJldHVybiBVc2VJbnRlcm5hbFN1YnN0KHBTdWJzdEZvbnQsIGlCYXNlRm9udCwgaXRhbGljX2FuZ2xlLCBvbGRfd2VpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpdGNoRmFtaWx5KTsKLSAgfQotICBmYW1pbHkgPSBHZXRGb250RmFtaWx5KGZhbWlseSwgblN0eWxlKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgbWF0Y2ggPSBNYXRjaEluc3RhbGxlZEZvbnRzKFRUX05vcm1hbGl6ZU5hbWUoZmFtaWx5LmNfc3RyKCkpKTsKLSAgaWYgKG1hdGNoLklzRW1wdHkoKSAmJiBmYW1pbHkgIT0gU3Vic3ROYW1lICYmCi0gICAgICAoIWJIYXNDb21tYSAmJiAoIWJIYXNIeXBoZW4gfHwgKGJIYXNIeXBoZW4gJiYgIWJTdHlsZUF2YWlsKSkpKSB7Ci0gICAgbWF0Y2ggPSBNYXRjaEluc3RhbGxlZEZvbnRzKFRUX05vcm1hbGl6ZU5hbWUoU3Vic3ROYW1lLmNfc3RyKCkpKTsKLSAgfQotICBpZiAobWF0Y2guSXNFbXB0eSgpICYmIGlCYXNlRm9udCA+PSBrTnVtU3RhbmRhcmRGb250cykgewotICAgIGlmICghYkNKSykgewotICAgICAgaWYgKCFDaGVja1N1cHBvcnRUaGlyZFBhcnRGb250KGZhbWlseSwgUGl0Y2hGYW1pbHkpKSB7Ci0gICAgICAgIGJJdGFsaWMgPSBpdGFsaWNfYW5nbGUgIT0gMDsKLSAgICAgICAgd2VpZ2h0ID0gb2xkX3dlaWdodDsKLSAgICAgIH0KLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0xJTlVYXwotICAgICAgaWYgKFN1YnN0TmFtZS5GaW5kKCJOYXJyb3ciKSA+IDAgfHwgU3Vic3ROYW1lLkZpbmQoIkNvbmRlbnNlZCIpID4gMCkKLSAgICAgICAgZmFtaWx5ID0gIkxpYmVyYXRpb25TYW5zTmFycm93IjsKLSNlbGlmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQU5EUk9JRF8KLSAgICAgIGlmIChmYW1pbHkuRmluZCgiTmFycm93IikgPiAwIHx8IGZhbWlseS5GaW5kKCJDb25kZW5zZWQiKSA+IDApCi0gICAgICAgIGZhbWlseSA9ICJSb2JvdG9Db25kZW5zZWQiOwotI2Vsc2UKLSAgICAgIGlmIChmYW1pbHkuRmluZCgiTmFycm93IikgPiAwIHx8IGZhbWlseS5GaW5kKCJDb25kZW5zZWQiKSA+IDApCi0gICAgICAgIGZhbWlseSA9ICJBcmlhbE5hcnJvdyI7Ci0jZW5kaWYgIC8vIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfCi0gICAgfSBlbHNlIHsKLSAgICAgIHBTdWJzdEZvbnQtPm1fYlN1YnN0Q0pLID0gdHJ1ZTsKLSAgICAgIGlmIChuU3R5bGUpCi0gICAgICAgIHBTdWJzdEZvbnQtPm1fV2VpZ2h0Q0pLID0gblN0eWxlID8gd2VpZ2h0IDogRlhGT05UX0ZXX05PUk1BTDsKLSAgICAgIGlmIChuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0l0YWxpYykKLSAgICAgICAgcFN1YnN0Rm9udC0+bV9iSXRhbGljQ0pLID0gdHJ1ZTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaXRhbGljX2FuZ2xlID0gMDsKLSAgICB3ZWlnaHQgPQotICAgICAgICBuU3R5bGUgJiBGWF9GT05UX1NUWUxFX0JvbGRCb2xkCi0gICAgICAgICAgICA/IDkwMAotICAgICAgICAgICAgOiAoblN0eWxlICYgRlhfRk9OVF9TVFlMRV9Cb2xkID8gRlhGT05UX0ZXX0JPTEQgOiBGWEZPTlRfRldfTk9STUFMKTsKLSAgfQotICBpZiAoIW1hdGNoLklzRW1wdHkoKSB8fCBpQmFzZUZvbnQgPCBrTnVtU3RhbmRhcmRGb250cykgewotICAgIGlmICghbWF0Y2guSXNFbXB0eSgpKQotICAgICAgZmFtaWx5ID0gbWF0Y2g7Ci0gICAgaWYgKGlCYXNlRm9udCA8IGtOdW1TdGFuZGFyZEZvbnRzKSB7Ci0gICAgICBpZiAoblN0eWxlICYmICEoaUJhc2VGb250ICUgNCkpIHsKLSAgICAgICAgaWYgKChuU3R5bGUgJiAweDMpID09IDEpCi0gICAgICAgICAgaUJhc2VGb250ICs9IDE7Ci0gICAgICAgIGlmICgoblN0eWxlICYgMHgzKSA9PSAyKQotICAgICAgICAgIGlCYXNlRm9udCArPSAzOwotICAgICAgICBpZiAoKG5TdHlsZSAmIDB4MykgPT0gMykKLSAgICAgICAgICBpQmFzZUZvbnQgKz0gMjsKLSAgICAgIH0KLSAgICAgIGZhbWlseSA9IGdfQmFzZTE0Rm9udE5hbWVzW2lCYXNlRm9udF07Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChmbGFncyAmIEZYRk9OVF9JVEFMSUMpCi0gICAgICBiSXRhbGljID0gdHJ1ZTsKLSAgfQotICBpRXhhY3QgPSAhbWF0Y2guSXNFbXB0eSgpOwotICB2b2lkKiBoRm9udCA9IG1fcEZvbnRJbmZvLT5NYXBGb250KHdlaWdodCwgYkl0YWxpYywgQ2hhcnNldCwgUGl0Y2hGYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFtaWx5LmNfc3RyKCksIGlFeGFjdCk7Ci0gIGlmIChpRXhhY3QpCi0gICAgcFN1YnN0Rm9udC0+bV9TdWJzdEZsYWdzIHw9IEZYRk9OVF9TVUJTVF9FWEFDVDsKLSAgaWYgKCFoRm9udCkgewotI2lmZGVmIFBERl9FTkFCTEVfWEZBCi0gICAgaWYgKGZsYWdzICYgRlhGT05UX0VYQUNUTUFUQ0gpCi0gICAgICByZXR1cm4gbnVsbHB0cjsKLSNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKLSAgICBpZiAoYkNKSykgewotICAgICAgYkl0YWxpYyA9IGl0YWxpY19hbmdsZSAhPSAwOwotICAgICAgd2VpZ2h0ID0gb2xkX3dlaWdodDsKLSAgICB9Ci0gICAgaWYgKCFtYXRjaC5Jc0VtcHR5KCkpIHsKLSAgICAgIGhGb250ID0gbV9wRm9udEluZm8tPkdldEZvbnQobWF0Y2guY19zdHIoKSk7Ci0gICAgICBpZiAoIWhGb250KSB7Ci0gICAgICAgIHJldHVybiBVc2VJbnRlcm5hbFN1YnN0KHBTdWJzdEZvbnQsIGlCYXNlRm9udCwgaXRhbGljX2FuZ2xlLCBvbGRfd2VpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXRjaEZhbWlseSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChDaGFyc2V0ID09IEZYRk9OVF9TWU1CT0xfQ0hBUlNFVCkgewotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfIHx8IFwKLSAgICBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FORFJPSURfCi0gICAgICAgIGlmIChTdWJzdE5hbWUgPT0gIlN5bWJvbCIpIHsKLSAgICAgICAgICBwU3Vic3RGb250LT5tX0ZhbWlseSA9ICJDaHJvbWUgU3ltYm9sIjsKLSAgICAgICAgICBwU3Vic3RGb250LT5tX0NoYXJzZXQgPSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQ7Ci0gICAgICAgICAgcmV0dXJuIFVzZUludGVybmFsU3Vic3QocFN1YnN0Rm9udCwgMTIsIGl0YWxpY19hbmdsZSwgb2xkX3dlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXRjaEZhbWlseSk7Ci0gICAgICAgIH0KLSNlbmRpZgotICAgICAgICByZXR1cm4gRmluZFN1YnN0Rm9udChmYW1pbHksIGJUcnVlVHlwZSwgZmxhZ3MgJiB+RlhGT05UX1NZTUJPTElDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQsIGl0YWxpY19hbmdsZSwgMCwgcFN1YnN0Rm9udCk7Ci0gICAgICB9Ci0gICAgICBpZiAoQ2hhcnNldCA9PSBGWEZPTlRfQU5TSV9DSEFSU0VUKSB7Ci0gICAgICAgIHJldHVybiBVc2VJbnRlcm5hbFN1YnN0KHBTdWJzdEZvbnQsIGlCYXNlRm9udCwgaXRhbGljX2FuZ2xlLCBvbGRfd2VpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXRjaEZhbWlseSk7Ci0gICAgICB9Ci0KLSAgICAgIGF1dG8gaXQgPQotICAgICAgICAgIHN0ZDo6ZmluZF9pZihtX0ZhY2VBcnJheS5iZWdpbigpLCBtX0ZhY2VBcnJheS5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgW0NoYXJzZXRdKGNvbnN0IEZhY2VEYXRhJiBmYWNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhY2UuY2hhcnNldCA9PSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oQ2hhcnNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgaWYgKGl0ID09IG1fRmFjZUFycmF5LmVuZCgpKSB7Ci0gICAgICAgIHJldHVybiBVc2VJbnRlcm5hbFN1YnN0KHBTdWJzdEZvbnQsIGlCYXNlRm9udCwgaXRhbGljX2FuZ2xlLCBvbGRfd2VpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXRjaEZhbWlseSk7Ci0gICAgICB9Ci0gICAgICBoRm9udCA9IG1fcEZvbnRJbmZvLT5HZXRGb250KGl0LT5uYW1lLmNfc3RyKCkpOwotICAgIH0KLSAgfQotICBpZiAoIWhGb250KQotICAgIHJldHVybiBudWxscHRyOwotCi0gIG1fcEZvbnRJbmZvLT5HZXRGYWNlTmFtZShoRm9udCwgU3Vic3ROYW1lKTsKLSAgaWYgKENoYXJzZXQgPT0gRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCkKLSAgICBtX3BGb250SW5mby0+R2V0Rm9udENoYXJzZXQoaEZvbnQsIENoYXJzZXQpOwotICB1aW50MzJfdCB0dGNfc2l6ZSA9IG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwga1RhYmxlVFRDRiwgbnVsbHB0ciwgMCk7Ci0gIHVpbnQzMl90IGZvbnRfc2l6ZSA9IG1fcEZvbnRJbmZvLT5HZXRGb250RGF0YShoRm9udCwgMCwgbnVsbHB0ciwgMCk7Ci0gIGlmIChmb250X3NpemUgPT0gMCAmJiB0dGNfc2l6ZSA9PSAwKSB7Ci0gICAgbV9wRm9udEluZm8tPkRlbGV0ZUZvbnQoaEZvbnQpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIEZYRlRfRmFjZSBmYWNlID0gbnVsbHB0cjsKLSAgaWYgKHR0Y19zaXplKQotICAgIGZhY2UgPSBHZXRDYWNoZWRUVENGYWNlKGhGb250LCBrVGFibGVUVENGLCB0dGNfc2l6ZSwgZm9udF9zaXplKTsKLSAgZWxzZQotICAgIGZhY2UgPSBHZXRDYWNoZWRGYWNlKGhGb250LCBTdWJzdE5hbWUsIHdlaWdodCwgYkl0YWxpYywgZm9udF9zaXplKTsKLSAgaWYgKCFmYWNlKSB7Ci0gICAgbV9wRm9udEluZm8tPkRlbGV0ZUZvbnQoaEZvbnQpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHBTdWJzdEZvbnQtPm1fRmFtaWx5ID0gU3Vic3ROYW1lOwotICBwU3Vic3RGb250LT5tX0NoYXJzZXQgPSBDaGFyc2V0OwotICBib29sIGJOZWVkVXBkYXRlV2VpZ2h0ID0gZmFsc2U7Ci0gIGlmIChGWEZUX0lzX0ZhY2VfQm9sZChmYWNlKSkKLSAgICBiTmVlZFVwZGF0ZVdlaWdodCA9IHdlaWdodCAhPSBGWEZPTlRfRldfQk9MRDsKLSAgZWxzZQotICAgIGJOZWVkVXBkYXRlV2VpZ2h0ID0gd2VpZ2h0ICE9IEZYRk9OVF9GV19OT1JNQUw7Ci0gIGlmIChiTmVlZFVwZGF0ZVdlaWdodCkKLSAgICBwU3Vic3RGb250LT5tX1dlaWdodCA9IHdlaWdodDsKLSAgaWYgKGJJdGFsaWMgJiYgIUZYRlRfSXNfRmFjZV9JdGFsaWMoZmFjZSkpIHsKLSAgICBpZiAoaXRhbGljX2FuZ2xlID09IDApCi0gICAgICBpdGFsaWNfYW5nbGUgPSAtMTI7Ci0gICAgZWxzZSBpZiAoRlhTWVNfYWJzKGl0YWxpY19hbmdsZSkgPCA1KQotICAgICAgaXRhbGljX2FuZ2xlID0gMDsKLSAgICBwU3Vic3RGb250LT5tX0l0YWxpY0FuZ2xlID0gaXRhbGljX2FuZ2xlOwotICB9Ci0gIG1fcEZvbnRJbmZvLT5EZWxldGVGb250KGhGb250KTsKLSAgcmV0dXJuIGZhY2U7Ci19Ci0KLSNpZmRlZiBQREZfRU5BQkxFX1hGQQotRlhGVF9GYWNlIENGWF9Gb250TWFwcGVyOjpGaW5kU3Vic3RGb250QnlVbmljb2RlKHVpbnQzMl90IGR3VW5pY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGFsaWNfYW5nbGUpIHsKLSAgaWYgKCFtX3BGb250SW5mbykKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBib29sIGJJdGFsaWMgPSAoZmxhZ3MgJiBGWEZPTlRfSVRBTElDKSAhPSAwOwotICBpbnQgUGl0Y2hGYW1pbHkgPSAwOwotICBVcGRhdGVQaXRjaEZhbWlseShmbGFncywgUGl0Y2hGYW1pbHkpOwotICB2b2lkKiBoRm9udCA9Ci0gICAgICBtX3BGb250SW5mby0+TWFwRm9udEJ5VW5pY29kZShkd1VuaWNvZGUsIHdlaWdodCwgYkl0YWxpYywgUGl0Y2hGYW1pbHkpOwotICBpZiAoIWhGb250KQotICAgIHJldHVybiBudWxscHRyOwotCi0gIHVpbnQzMl90IHR0Y19zaXplID0gbV9wRm9udEluZm8tPkdldEZvbnREYXRhKGhGb250LCAweDc0NzQ2MzY2LCBudWxscHRyLCAwKTsKLSAgdWludDMyX3QgZm9udF9zaXplID0gbV9wRm9udEluZm8tPkdldEZvbnREYXRhKGhGb250LCAwLCBudWxscHRyLCAwKTsKLSAgaWYgKGZvbnRfc2l6ZSA9PSAwICYmIHR0Y19zaXplID09IDApIHsKLSAgICBtX3BGb250SW5mby0+RGVsZXRlRm9udChoRm9udCk7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgRlhGVF9GYWNlIGZhY2UgPSBudWxscHRyOwotICBpZiAodHRjX3NpemUpIHsKLSAgICBmYWNlID0gR2V0Q2FjaGVkVFRDRmFjZShoRm9udCwgMHg3NDc0NjM2NiwgdHRjX3NpemUsIGZvbnRfc2l6ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgU3Vic3ROYW1lOwotICAgIG1fcEZvbnRJbmZvLT5HZXRGYWNlTmFtZShoRm9udCwgU3Vic3ROYW1lKTsKLSAgICBmYWNlID0gR2V0Q2FjaGVkRmFjZShoRm9udCwgU3Vic3ROYW1lLCB3ZWlnaHQsIGJJdGFsaWMsIGZvbnRfc2l6ZSk7Ci0gIH0KLSAgbV9wRm9udEluZm8tPkRlbGV0ZUZvbnQoaEZvbnQpOwotICByZXR1cm4gZmFjZTsKLX0KLSNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKLQotaW50IENGWF9Gb250TWFwcGVyOjpHZXRGYWNlU2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50PihtX0ZhY2VBcnJheSk7Ci19Ci0KLWJvb2wgQ0ZYX0ZvbnRNYXBwZXI6OklzQnVpbHRpbkZhY2UoY29uc3QgRlhGVF9GYWNlIGZhY2UpIGNvbnN0IHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNTV9GQUNFX0NPVU5UOyArK2kpIHsKLSAgICBpZiAobV9NTUZhY2VzW2ldID09IGZhY2UpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZPWElUX0ZBQ0VfQ09VTlQ7ICsraSkgewotICAgIGlmIChtX0ZveGl0RmFjZXNbaV0gPT0gZmFjZSkKLSAgICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotRlhGVF9GYWNlIENGWF9Gb250TWFwcGVyOjpHZXRDYWNoZWRUVENGYWNlKHZvaWQqIGhGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHRhYmxlVFRDRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0dGNfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb250X3NpemUpIHsKLSAgRlhGVF9GYWNlIGZhY2U7Ci0gIHVpbnQ4X3QgYnVmZmVyWzEwMjRdOwotICBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIHRhYmxlVFRDRiwgYnVmZmVyLCBGWF9BcnJheVNpemUoYnVmZmVyKSk7Ci0gIHVpbnQzMl90KiBwQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KGJ1ZmZlcik7Ci0gIHVpbnQzMl90IGNoZWNrc3VtID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykKLSAgICBjaGVja3N1bSArPSBwQnVmZmVyW2ldOwotICB1aW50OF90KiBwRm9udERhdGE7Ci0gIGZhY2UgPSBtX3BGb250TWdyLT5HZXRDYWNoZWRUVENGYWNlKHR0Y19zaXplLCBjaGVja3N1bSwgdHRjX3NpemUgLSBmb250X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb250RGF0YSk7Ci0gIGlmICghZmFjZSkgewotICAgIHBGb250RGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIHR0Y19zaXplKTsKLSAgICBtX3BGb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIHRhYmxlVFRDRiwgcEZvbnREYXRhLCB0dGNfc2l6ZSk7Ci0gICAgZmFjZSA9IG1fcEZvbnRNZ3ItPkFkZENhY2hlZFRUQ0ZhY2UodHRjX3NpemUsIGNoZWNrc3VtLCBwRm9udERhdGEsIHR0Y19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0Y19zaXplIC0gZm9udF9zaXplKTsKLSAgfQotICByZXR1cm4gZmFjZTsKLX0KLQotRlhGVF9GYWNlIENGWF9Gb250TWFwcGVyOjpHZXRDYWNoZWRGYWNlKHZvaWQqIGhGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIFN1YnN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkl0YWxpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb250X3NpemUpIHsKLSAgRlhGVF9GYWNlIGZhY2U7Ci0gIHVpbnQ4X3QqIHBGb250RGF0YTsKLSAgZmFjZSA9IG1fcEZvbnRNZ3ItPkdldENhY2hlZEZhY2UoU3Vic3ROYW1lLCB3ZWlnaHQsIGJJdGFsaWMsIHBGb250RGF0YSk7Ci0gIGlmICghZmFjZSkgewotICAgIHBGb250RGF0YSA9IEZYX0FsbG9jKHVpbnQ4X3QsIGZvbnRfc2l6ZSk7Ci0gICAgbV9wRm9udEluZm8tPkdldEZvbnREYXRhKGhGb250LCAwLCBwRm9udERhdGEsIGZvbnRfc2l6ZSk7Ci0gICAgZmFjZSA9Ci0gICAgICAgIG1fcEZvbnRNZ3ItPkFkZENhY2hlZEZhY2UoU3Vic3ROYW1lLCB3ZWlnaHQsIGJJdGFsaWMsIHBGb250RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X3NpemUsIG1fcEZvbnRJbmZvLT5HZXRGYWNlSW5kZXgoaEZvbnQpKTsKLSAgfQotICByZXR1cm4gZmFjZTsKLX0KLQotaW50IFBERl9HZXRTdGFuZGFyZEZvbnROYW1lKENGWF9CeXRlU3RyaW5nKiBuYW1lKSB7Ci0gIEFsdEZvbnROYW1lKiBmb3VuZCA9IHN0YXRpY19jYXN0PEFsdEZvbnROYW1lKj4oCi0gICAgICBGWFNZU19ic2VhcmNoKG5hbWUtPmNfc3RyKCksIGdfQWx0Rm9udE5hbWVzLCBGWF9BcnJheVNpemUoZ19BbHRGb250TmFtZXMpLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoQWx0Rm9udE5hbWUpLCBDb21wYXJlU3RyaW5nKSk7Ci0gIGlmICghZm91bmQpCi0gICAgcmV0dXJuIC0xOwotCi0gICpuYW1lID0gZ19CYXNlMTRGb250TmFtZXNbZm91bmQtPm1fSW5kZXhdOwotICByZXR1cm4gZm91bmQtPm1fSW5kZXg7Ci19CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZ2UvY2Z4X2ZvbnRtZ3IuY3BwIGIvY29yZS9meGdlL2dlL2NmeF9mb250bWdyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRmNjQ3ZS4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Z2UvZ2UvY2Z4X2ZvbnRtZ3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZm9udG1nci5oIgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnRtYXBwZXIuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3N1YnN0Zm9udC5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9jaHJvbWVmb250ZGF0YS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mb250LmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2dlL2N0dGZvbnRkZXNjLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2lmeF9zeXN0ZW1mb250aW5mby5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLQotbmFtZXNwYWNlIHsKLQotc3RydWN0IEJ1aWx0aW5Gb250IHsKLSAgY29uc3QgdWludDhfdCogbV9wRm9udERhdGE7Ci0gIHVpbnQzMl90IG1fZHdTaXplOwotfTsKLQotY29uc3QgQnVpbHRpbkZvbnQgZ19Gb3hpdEZvbnRzWzE0XSA9IHsKLSAgICB7Z19Gb3hpdEZpeGVkRm9udERhdGEsIDE3NTk3fSwKLSAgICB7Z19Gb3hpdEZpeGVkQm9sZEZvbnREYXRhLCAxODA1NX0sCi0gICAge2dfRm94aXRGaXhlZEJvbGRJdGFsaWNGb250RGF0YSwgMTkxNTF9LAotICAgIHtnX0ZveGl0Rml4ZWRJdGFsaWNGb250RGF0YSwgMTg3NDZ9LAotICAgIHtnX0ZveGl0U2Fuc0ZvbnREYXRhLCAxNTAyNX0sCi0gICAge2dfRm94aXRTYW5zQm9sZEZvbnREYXRhLCAxNjM0NH0sCi0gICAge2dfRm94aXRTYW5zQm9sZEl0YWxpY0ZvbnREYXRhLCAxNjQxOH0sCi0gICAge2dfRm94aXRTYW5zSXRhbGljRm9udERhdGEsIDE2MzM5fSwKLSAgICB7Z19Gb3hpdFNlcmlmRm9udERhdGEsIDE5NDY5fSwKLSAgICB7Z19Gb3hpdFNlcmlmQm9sZEZvbnREYXRhLCAxOTM5NX0sCi0gICAge2dfRm94aXRTZXJpZkJvbGRJdGFsaWNGb250RGF0YSwgMjA3MzN9LAotICAgIHtnX0ZveGl0U2VyaWZJdGFsaWNGb250RGF0YSwgMjEyMjd9LAotICAgIHtnX0ZveGl0U3ltYm9sRm9udERhdGEsIDE2NzI5fSwKLSAgICB7Z19Gb3hpdERpbmdiYXRzRm9udERhdGEsIDI5NTEzfSwKLX07Ci0KLWNvbnN0IEJ1aWx0aW5Gb250IGdfTU1Gb250c1syXSA9IHsKLSAgICB7Z19Gb3hpdFNlcmlmTU1Gb250RGF0YSwgMTEzNDE3fSwKLSAgICB7Z19Gb3hpdFNhbnNNTUZvbnREYXRhLCA2NjkxOX0sCi19OwotCi1DRlhfQnl0ZVN0cmluZyBLZXlOYW1lRnJvbUZhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkl0YWxpYykgewotICBDRlhfQnl0ZVN0cmluZyBrZXkoZmFjZV9uYW1lKTsKLSAga2V5ICs9ICcsJzsKLSAga2V5ICs9IENGWF9CeXRlU3RyaW5nOjpGb3JtYXRJbnRlZ2VyKHdlaWdodCk7Ci0gIGtleSArPSBiSXRhbGljID8gJ0knIDogJ04nOwotICByZXR1cm4ga2V5OwotfQotCi1DRlhfQnl0ZVN0cmluZyBLZXlOYW1lRnJvbVNpemUoaW50IHR0Y19zaXplLCB1aW50MzJfdCBjaGVja3N1bSkgewotICBDRlhfQnl0ZVN0cmluZyBrZXk7Ci0gIGtleS5Gb3JtYXQoIiVkOiVkIiwgdHRjX3NpemUsIGNoZWNrc3VtKTsKLSAgcmV0dXJuIGtleTsKLX0KLQotaW50IEdldFRUQ0luZGV4KGNvbnN0IHVpbnQ4X3QqIHBGb250RGF0YSwKLSAgICAgICAgICAgICAgICB1aW50MzJfdCB0dGNfc2l6ZSwKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBmb250X29mZnNldCkgewotICBpbnQgZmFjZV9pbmRleCA9IDA7Ci0gIGNvbnN0IHVpbnQ4X3QqIHAgPSBwRm9udERhdGEgKyA4OwotICB1aW50MzJfdCBuZm9udCA9IEdFVF9UVF9MT05HKHApOwotICB1aW50MzJfdCBpbmRleDsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgbmZvbnQ7IGluZGV4KyspIHsKLSAgICBwID0gcEZvbnREYXRhICsgMTIgKyBpbmRleCAqIDQ7Ci0gICAgaWYgKEdFVF9UVF9MT05HKHApID09IGZvbnRfb2Zmc2V0KQotICAgICAgYnJlYWs7Ci0gIH0KLSAgaWYgKGluZGV4ID49IG5mb250KQotICAgIGZhY2VfaW5kZXggPSAwOwotICBlbHNlCi0gICAgZmFjZV9pbmRleCA9IGluZGV4OwotICByZXR1cm4gZmFjZV9pbmRleDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLUNGWF9Gb250TWdyOjpDRlhfRm9udE1ncigpCi0gICAgOiBtX0ZUTGlicmFyeShudWxscHRyKSwgbV9GVExpYnJhcnlTdXBwb3J0c0hpbnRpbmcoZmFsc2UpIHsKLSAgbV9wQnVpbHRpbk1hcHBlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfRm9udE1hcHBlcj4odGhpcyk7Ci19Ci0KLUNGWF9Gb250TWdyOjp+Q0ZYX0ZvbnRNZ3IoKSB7Ci0gIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1fRmFjZU1hcCkKLSAgICBkZWxldGUgcGFpci5zZWNvbmQ7Ci0KLSAgLy8gfG1fcEJ1aWx0aW5NYXBwZXJ8IHJlZmVyZW5jZXMgfG1fRlRMaWJyYXJ5fCwgc28gaXQgaGFzIHRvIGJlIGRlc3Ryb3llZAotICAvLyBmaXJzdC4KLSAgbV9wQnVpbHRpbk1hcHBlci5yZXNldCgpOwotICBGWEZUX0RvbmVfRnJlZVR5cGUobV9GVExpYnJhcnkpOwotfQotCi12b2lkIENGWF9Gb250TWdyOjpJbml0RlRMaWJyYXJ5KCkgewotICBpZiAobV9GVExpYnJhcnkpCi0gICAgcmV0dXJuOwotICBGWEZUX0luaXRfRnJlZVR5cGUoJm1fRlRMaWJyYXJ5KTsKLSAgbV9GVExpYnJhcnlTdXBwb3J0c0hpbnRpbmcgPQotICAgICAgRlhGVF9MaWJyYXJ5X1NldExjZEZpbHRlcihtX0ZUTGlicmFyeSwgRlRfTENEX0ZJTFRFUl9ERUZBVUxUKSAhPQotICAgICAgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZTsKLX0KLQotdm9pZCBDRlhfRm9udE1ncjo6U2V0U3lzdGVtRm9udEluZm8oCi0gICAgc3RkOjp1bmlxdWVfcHRyPElGWF9TeXN0ZW1Gb250SW5mbz4gcEZvbnRJbmZvKSB7Ci0gIG1fcEJ1aWx0aW5NYXBwZXItPlNldFN5c3RlbUZvbnRJbmZvKHN0ZDo6bW92ZShwRm9udEluZm8pKTsKLX0KLQotRlhGVF9GYWNlIENGWF9Gb250TWdyOjpGaW5kU3Vic3RGb250KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBmYWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVHJ1ZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXRhbGljX2FuZ2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDaGFyc2V0Q1AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCkgewotICBJbml0RlRMaWJyYXJ5KCk7Ci0gIHJldHVybiBtX3BCdWlsdGluTWFwcGVyLT5GaW5kU3Vic3RGb250KGZhY2VfbmFtZSwgYlRydWVUeXBlLCBmbGFncywgd2VpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGFsaWNfYW5nbGUsIENoYXJzZXRDUCwgcFN1YnN0Rm9udCk7Ci19Ci0KLUZYRlRfRmFjZSBDRlhfRm9udE1ncjo6R2V0Q2FjaGVkRmFjZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgZmFjZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXRhbGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBwRm9udERhdGEpIHsKLSAgYXV0byBpdCA9IG1fRmFjZU1hcC5maW5kKEtleU5hbWVGcm9tRmFjZShmYWNlX25hbWUsIHdlaWdodCwgYkl0YWxpYykpOwotICBpZiAoaXQgPT0gbV9GYWNlTWFwLmVuZCgpKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIENUVEZvbnREZXNjKiBwRm9udERlc2MgPSBpdC0+c2Vjb25kOwotICBwRm9udERhdGEgPSBwRm9udERlc2MtPm1fcEZvbnREYXRhOwotICBwRm9udERlc2MtPm1fUmVmQ291bnQrKzsKLSAgcmV0dXJuIHBGb250RGVzYy0+bV9TaW5nbGVGYWNlOwotfQotCi1GWEZUX0ZhY2UgQ0ZYX0ZvbnRNZ3I6OkFkZENhY2hlZEZhY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGZhY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkl0YWxpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBwRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmYWNlX2luZGV4KSB7Ci0gIENUVEZvbnREZXNjKiBwRm9udERlc2MgPSBuZXcgQ1RURm9udERlc2M7Ci0gIHBGb250RGVzYy0+bV9UeXBlID0gMTsKLSAgcEZvbnREZXNjLT5tX1NpbmdsZUZhY2UgPSBudWxscHRyOwotICBwRm9udERlc2MtPm1fcEZvbnREYXRhID0gcERhdGE7Ci0gIHBGb250RGVzYy0+bV9SZWZDb3VudCA9IDE7Ci0KLSAgSW5pdEZUTGlicmFyeSgpOwotICBGWEZUX0xpYnJhcnkgbGlicmFyeSA9IG1fRlRMaWJyYXJ5OwotICBpbnQgcmV0ID0gRlhGVF9OZXdfTWVtb3J5X0ZhY2UobGlicmFyeSwgcERhdGEsIHNpemUsIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEZvbnREZXNjLT5tX1NpbmdsZUZhY2UpOwotICBpZiAocmV0KSB7Ci0gICAgZGVsZXRlIHBGb250RGVzYzsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICByZXQgPSBGWEZUX1NldF9QaXhlbF9TaXplcyhwRm9udERlc2MtPm1fU2luZ2xlRmFjZSwgNjQsIDY0KTsKLSAgaWYgKHJldCkgewotICAgIGRlbGV0ZSBwRm9udERlc2M7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgbV9GYWNlTWFwW0tleU5hbWVGcm9tRmFjZShmYWNlX25hbWUsIHdlaWdodCwgYkl0YWxpYyldID0gcEZvbnREZXNjOwotICByZXR1cm4gcEZvbnREZXNjLT5tX1NpbmdsZUZhY2U7Ci19Ci0KLUZYRlRfRmFjZSBDRlhfRm9udE1ncjo6R2V0Q2FjaGVkVFRDRmFjZShpbnQgdHRjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hlY2tzdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbnRfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBwRm9udERhdGEpIHsKLSAgYXV0byBpdCA9IG1fRmFjZU1hcC5maW5kKEtleU5hbWVGcm9tU2l6ZSh0dGNfc2l6ZSwgY2hlY2tzdW0pKTsKLSAgaWYgKGl0ID09IG1fRmFjZU1hcC5lbmQoKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBDVFRGb250RGVzYyogcEZvbnREZXNjID0gaXQtPnNlY29uZDsKLSAgcEZvbnREYXRhID0gcEZvbnREZXNjLT5tX3BGb250RGF0YTsKLSAgcEZvbnREZXNjLT5tX1JlZkNvdW50Kys7Ci0gIGludCBmYWNlX2luZGV4ID0gR2V0VFRDSW5kZXgocEZvbnREZXNjLT5tX3BGb250RGF0YSwgdHRjX3NpemUsIGZvbnRfb2Zmc2V0KTsKLSAgaWYgKCFwRm9udERlc2MtPm1fVFRDRmFjZXNbZmFjZV9pbmRleF0pIHsKLSAgICBwRm9udERlc2MtPm1fVFRDRmFjZXNbZmFjZV9pbmRleF0gPQotICAgICAgICBHZXRGaXhlZEZhY2UocEZvbnREZXNjLT5tX3BGb250RGF0YSwgdHRjX3NpemUsIGZhY2VfaW5kZXgpOwotICB9Ci0gIHJldHVybiBwRm9udERlc2MtPm1fVFRDRmFjZXNbZmFjZV9pbmRleF07Ci19Ci0KLUZYRlRfRmFjZSBDRlhfRm9udE1ncjo6QWRkQ2FjaGVkVFRDRmFjZShpbnQgdHRjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2hlY2tzdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9udF9vZmZzZXQpIHsKLSAgQ1RURm9udERlc2MqIHBGb250RGVzYyA9IG5ldyBDVFRGb250RGVzYzsKLSAgcEZvbnREZXNjLT5tX1R5cGUgPSAyOwotICBwRm9udERlc2MtPm1fcEZvbnREYXRhID0gcERhdGE7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICBwRm9udERlc2MtPm1fVFRDRmFjZXNbaV0gPSBudWxscHRyOwotICBwRm9udERlc2MtPm1fUmVmQ291bnQrKzsKLSAgbV9GYWNlTWFwW0tleU5hbWVGcm9tU2l6ZSh0dGNfc2l6ZSwgY2hlY2tzdW0pXSA9IHBGb250RGVzYzsKLSAgaW50IGZhY2VfaW5kZXggPSBHZXRUVENJbmRleChwRm9udERlc2MtPm1fcEZvbnREYXRhLCB0dGNfc2l6ZSwgZm9udF9vZmZzZXQpOwotICBwRm9udERlc2MtPm1fVFRDRmFjZXNbZmFjZV9pbmRleF0gPQotICAgICAgR2V0Rml4ZWRGYWNlKHBGb250RGVzYy0+bV9wRm9udERhdGEsIHR0Y19zaXplLCBmYWNlX2luZGV4KTsKLSAgcmV0dXJuIHBGb250RGVzYy0+bV9UVENGYWNlc1tmYWNlX2luZGV4XTsKLX0KLQotRlhGVF9GYWNlIENGWF9Gb250TWdyOjpHZXRGaXhlZEZhY2UoY29uc3QgdWludDhfdCogcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZhY2VfaW5kZXgpIHsKLSAgSW5pdEZUTGlicmFyeSgpOwotICBGWEZUX0xpYnJhcnkgbGlicmFyeSA9IG1fRlRMaWJyYXJ5OwotICBGWEZUX0ZhY2UgZmFjZSA9IG51bGxwdHI7Ci0gIGlmIChGWEZUX05ld19NZW1vcnlfRmFjZShsaWJyYXJ5LCBwRGF0YSwgc2l6ZSwgZmFjZV9pbmRleCwgJmZhY2UpKQotICAgIHJldHVybiBudWxscHRyOwotICByZXR1cm4gRlhGVF9TZXRfUGl4ZWxfU2l6ZXMoZmFjZSwgNjQsIDY0KSA/IG51bGxwdHIgOiBmYWNlOwotfQotCi1GWEZUX0ZhY2UgQ0ZYX0ZvbnRNZ3I6OkdldEZpbGVGYWNlKGNvbnN0IEZYX0NIQVIqIGZpbGVuYW1lLCBpbnQgZmFjZV9pbmRleCkgewotICBJbml0RlRMaWJyYXJ5KCk7Ci0gIEZYRlRfTGlicmFyeSBsaWJyYXJ5ID0gbV9GVExpYnJhcnk7Ci0gIEZYRlRfRmFjZSBmYWNlID0gbnVsbHB0cjsKLSAgaWYgKEZYRlRfTmV3X0ZhY2UobGlicmFyeSwgZmlsZW5hbWUsIGZhY2VfaW5kZXgsICZmYWNlKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIEZYRlRfU2V0X1BpeGVsX1NpemVzKGZhY2UsIDY0LCA2NCkgPyBudWxscHRyIDogZmFjZTsKLX0KLQotdm9pZCBDRlhfRm9udE1ncjo6UmVsZWFzZUZhY2UoRlhGVF9GYWNlIGZhY2UpIHsKLSAgaWYgKCFmYWNlKQotICAgIHJldHVybjsKLSAgYm9vbCBiTmVlZEZhY2VEb25lID0gdHJ1ZTsKLSAgYXV0byBpdCA9IG1fRmFjZU1hcC5iZWdpbigpOwotICB3aGlsZSAoaXQgIT0gbV9GYWNlTWFwLmVuZCgpKSB7Ci0gICAgYXV0byB0ZW1wID0gaXQrKzsKLSAgICBpbnQgblJldCA9IHRlbXAtPnNlY29uZC0+UmVsZWFzZUZhY2UoZmFjZSk7Ci0gICAgaWYgKG5SZXQgPT0gLTEpCi0gICAgICBjb250aW51ZTsKLSAgICBiTmVlZEZhY2VEb25lID0gZmFsc2U7Ci0gICAgaWYgKG5SZXQgPT0gMCkKLSAgICAgIG1fRmFjZU1hcC5lcmFzZSh0ZW1wKTsKLSAgICBicmVhazsKLSAgfQotICBpZiAoYk5lZWRGYWNlRG9uZSAmJiAhbV9wQnVpbHRpbk1hcHBlci0+SXNCdWlsdGluRmFjZShmYWNlKSkKLSAgICBGWEZUX0RvbmVfRmFjZShmYWNlKTsKLX0KLQotYm9vbCBDRlhfRm9udE1ncjo6R2V0QnVpbHRpbkZvbnQoc2l6ZV90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCoqIHBGb250RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBzaXplKSB7Ci0gIGlmIChpbmRleCA8IEZYX0FycmF5U2l6ZShnX0ZveGl0Rm9udHMpKSB7Ci0gICAgKnBGb250RGF0YSA9IGdfRm94aXRGb250c1tpbmRleF0ubV9wRm9udERhdGE7Ci0gICAgKnNpemUgPSBnX0ZveGl0Rm9udHNbaW5kZXhdLm1fZHdTaXplOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGluZGV4IC09IEZYX0FycmF5U2l6ZShnX0ZveGl0Rm9udHMpOwotICBpZiAoaW5kZXggPCBGWF9BcnJheVNpemUoZ19NTUZvbnRzKSkgewotICAgICpwRm9udERhdGEgPSBnX01NRm9udHNbaW5kZXhdLm1fcEZvbnREYXRhOwotICAgICpzaXplID0gZ19NTUZvbnRzW2luZGV4XS5tX2R3U2l6ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZ2UvY2Z4X2dlbW9kdWxlLmNwcCBiL2NvcmUvZnhnZS9nZS9jZnhfZ2Vtb2R1bGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDZkNmNiLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnhnZS9nZS9jZnhfZ2Vtb2R1bGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9nZW1vZHVsZS5oIgotCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mb250Y2FjaGUuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnRtZ3IuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZ2UvY2Z4X2ZvbGRlcmZvbnRpbmZvLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2dlL2Z4X3RleHRfaW50LmgiCi0KLW5hbWVzcGFjZSB7Ci0KLUNGWF9HRU1vZHVsZSogZ19wR0VNb2R1bGUgPSBudWxscHRyOwotCi19ICAvLyBuYW1lc3BhY2UKLQotQ0ZYX0dFTW9kdWxlOjpDRlhfR0VNb2R1bGUoKQotICAgIDogbV9GVExpYnJhcnkobnVsbHB0ciksCi0gICAgICBtX3BGb250Q2FjaGUobnVsbHB0ciksCi0gICAgICBtX3BGb250TWdyKG5ldyBDRlhfRm9udE1nciksCi0gICAgICBtX3BDb2RlY01vZHVsZShudWxscHRyKSwKLSAgICAgIG1fcFBsYXRmb3JtRGF0YShudWxscHRyKSwKLSAgICAgIG1fcFVzZXJGb250UGF0aHMobnVsbHB0cikge30KLQotQ0ZYX0dFTW9kdWxlOjp+Q0ZYX0dFTW9kdWxlKCkgewotICBkZWxldGUgbV9wRm9udENhY2hlOwotICBEZXN0cm95UGxhdGZvcm0oKTsKLX0KLQotLy8gc3RhdGljCi1DRlhfR0VNb2R1bGUqIENGWF9HRU1vZHVsZTo6R2V0KCkgewotICBpZiAoIWdfcEdFTW9kdWxlKQotICAgIGdfcEdFTW9kdWxlID0gbmV3IENGWF9HRU1vZHVsZSgpOwotICByZXR1cm4gZ19wR0VNb2R1bGU7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDRlhfR0VNb2R1bGU6OkRlc3Ryb3koKSB7Ci0gIEFTU0VSVChnX3BHRU1vZHVsZSk7Ci0gIGRlbGV0ZSBnX3BHRU1vZHVsZTsKLSAgZ19wR0VNb2R1bGUgPSBudWxscHRyOwotfQotCi12b2lkIENGWF9HRU1vZHVsZTo6SW5pdChjb25zdCBjaGFyKiogdXNlckZvbnRQYXRocywKLSAgICAgICAgICAgICAgICAgICAgICAgIENDb2RlY19Nb2R1bGVNZ3IqIHBDb2RlY01vZHVsZSkgewotICBBU1NFUlQoZ19wR0VNb2R1bGUpOwotICBtX3BDb2RlY01vZHVsZSA9IHBDb2RlY01vZHVsZTsKLSAgbV9wVXNlckZvbnRQYXRocyA9IHVzZXJGb250UGF0aHM7Ci0gIEluaXRQbGF0Zm9ybSgpOwotICBTZXRUZXh0R2FtbWEoMi4yZik7Ci19Ci0KLUNGWF9Gb250Q2FjaGUqIENGWF9HRU1vZHVsZTo6R2V0Rm9udENhY2hlKCkgewotICBpZiAoIW1fcEZvbnRDYWNoZSkKLSAgICBtX3BGb250Q2FjaGUgPSBuZXcgQ0ZYX0ZvbnRDYWNoZSgpOwotICByZXR1cm4gbV9wRm9udENhY2hlOwotfQotCi12b2lkIENGWF9HRU1vZHVsZTo6U2V0VGV4dEdhbW1hKEZYX0ZMT0FUIGdhbW1hVmFsdWUpIHsKLSAgZ2FtbWFWYWx1ZSAvPSAyLjJmOwotICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgKytpKSB7Ci0gICAgbV9HYW1tYVZhbHVlW2ldID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oCi0gICAgICAgIEZYU1lTX3BvdyhzdGF0aWNfY2FzdDxGWF9GTE9BVD4oaSkgLyAyNTUsIGdhbW1hVmFsdWUpICogMjU1LjBmICsgMC41Zik7Ci0gIH0KLX0KLQotY29uc3QgdWludDhfdCogQ0ZYX0dFTW9kdWxlOjpHZXRUZXh0R2FtbWFUYWJsZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fR2FtbWFWYWx1ZTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9nZS9jZnhfZ3JhcGhzdGF0ZS5jcHAgYi9jb3JlL2Z4Z2UvZ2UvY2Z4X2dyYXBoc3RhdGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzU3YWE1Li4wMDAwMDAwCi0tLSBhL2NvcmUvZnhnZS9nZS9jZnhfZ3JhcGhzdGF0ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGUuaCIKLQotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgotCi1DRlhfR3JhcGhTdGF0ZTo6Q0ZYX0dyYXBoU3RhdGUoKSB7fQotCi1DRlhfR3JhcGhTdGF0ZTo6Q0ZYX0dyYXBoU3RhdGUoY29uc3QgQ0ZYX0dyYXBoU3RhdGUmIHRoYXQpCi0gICAgOiBtX1JlZih0aGF0Lm1fUmVmKSB7fQotCi1DRlhfR3JhcGhTdGF0ZTo6fkNGWF9HcmFwaFN0YXRlKCkge30KLQotdm9pZCBDRlhfR3JhcGhTdGF0ZTo6RW1wbGFjZSgpIHsKLSAgbV9SZWYuRW1wbGFjZSgpOwotfQotCi12b2lkIENGWF9HcmFwaFN0YXRlOjpTZXRMaW5lRGFzaChDUERGX0FycmF5KiBwQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBwaGFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHNjYWxlKSB7Ci0gIENGWF9HcmFwaFN0YXRlRGF0YSogcERhdGEgPSBtX1JlZi5HZXRQcml2YXRlQ29weSgpOwotICBwRGF0YS0+bV9EYXNoUGhhc2UgPSBwaGFzZSAqIHNjYWxlOwotICBwRGF0YS0+U2V0RGFzaENvdW50KHN0YXRpY19jYXN0PGludD4ocEFycmF5LT5HZXRDb3VudCgpKSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcEFycmF5LT5HZXRDb3VudCgpOyBpKyspCi0gICAgcERhdGEtPm1fRGFzaEFycmF5W2ldID0gcEFycmF5LT5HZXROdW1iZXJBdChpKSAqIHNjYWxlOwotfQotCi1GWF9GTE9BVCBDRlhfR3JhcGhTdGF0ZTo6R2V0TGluZVdpZHRoKCkgY29uc3QgewotICByZXR1cm4gbV9SZWYuR2V0T2JqZWN0KCkgPyBtX1JlZi5HZXRPYmplY3QoKS0+bV9MaW5lV2lkdGggOiAxLmY7Ci19Ci0KLXZvaWQgQ0ZYX0dyYXBoU3RhdGU6OlNldExpbmVXaWR0aChGWF9GTE9BVCB3aWR0aCkgewotICBtX1JlZi5HZXRQcml2YXRlQ29weSgpLT5tX0xpbmVXaWR0aCA9IHdpZHRoOwotfQotCi1DRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXAgQ0ZYX0dyYXBoU3RhdGU6OkdldExpbmVDYXAoKSBjb25zdCB7Ci0gIHJldHVybiBtX1JlZi5HZXRPYmplY3QoKS0+bV9MaW5lQ2FwOwotfQotdm9pZCBDRlhfR3JhcGhTdGF0ZTo6U2V0TGluZUNhcChDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXAgY2FwKSB7Ci0gIG1fUmVmLkdldFByaXZhdGVDb3B5KCktPm1fTGluZUNhcCA9IGNhcDsKLX0KLQotQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbiBDRlhfR3JhcGhTdGF0ZTo6R2V0TGluZUpvaW4oKSBjb25zdCB7Ci0gIHJldHVybiBtX1JlZi5HZXRPYmplY3QoKS0+bV9MaW5lSm9pbjsKLX0KLQotdm9pZCBDRlhfR3JhcGhTdGF0ZTo6U2V0TGluZUpvaW4oQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbiBqb2luKSB7Ci0gIG1fUmVmLkdldFByaXZhdGVDb3B5KCktPm1fTGluZUpvaW4gPSBqb2luOwotfQotCi1GWF9GTE9BVCBDRlhfR3JhcGhTdGF0ZTo6R2V0TWl0ZXJMaW1pdCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fUmVmLkdldE9iamVjdCgpID8gbV9SZWYuR2V0T2JqZWN0KCktPm1fTWl0ZXJMaW1pdCA6IDEwLmY7Ci19Ci0KLXZvaWQgQ0ZYX0dyYXBoU3RhdGU6OlNldE1pdGVyTGltaXQoRlhfRkxPQVQgbGltaXQpIHsKLSAgbV9SZWYuR2V0UHJpdmF0ZUNvcHkoKS0+bV9NaXRlckxpbWl0ID0gbGltaXQ7Ci19CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZ2UvY2Z4X2dyYXBoc3RhdGVkYXRhLmNwcCBiL2NvcmUvZnhnZS9nZS9jZnhfZ3JhcGhzdGF0ZWRhdGEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzc5OGE2Li4wMDAwMDAwCi0tLSBhL2NvcmUvZnhnZS9nZS9jZnhfZ3JhcGhzdGF0ZWRhdGEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9ncmFwaHN0YXRlZGF0YS5oIgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9tZW1vcnkuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotCi1DRlhfR3JhcGhTdGF0ZURhdGE6OkNGWF9HcmFwaFN0YXRlRGF0YSgpCi0gICAgOiBtX0xpbmVDYXAoTGluZUNhcEJ1dHQpLAotICAgICAgbV9EYXNoQ291bnQoMCksCi0gICAgICBtX0Rhc2hBcnJheShudWxscHRyKSwKLSAgICAgIG1fRGFzaFBoYXNlKDApLAotICAgICAgbV9MaW5lSm9pbihMaW5lSm9pbk1pdGVyKSwKLSAgICAgIG1fTWl0ZXJMaW1pdCgxMCAqIDEuMGYpLAotICAgICAgbV9MaW5lV2lkdGgoMS4wZikge30KLQotQ0ZYX0dyYXBoU3RhdGVEYXRhOjpDRlhfR3JhcGhTdGF0ZURhdGEoY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhJiBzcmMpIHsKLSAgbV9EYXNoQXJyYXkgPSBudWxscHRyOwotICBDb3B5KHNyYyk7Ci19Ci0KLXZvaWQgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpDb3B5KGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSYgc3JjKSB7Ci0gIG1fTGluZUNhcCA9IHNyYy5tX0xpbmVDYXA7Ci0gIG1fRGFzaENvdW50ID0gc3JjLm1fRGFzaENvdW50OwotICBGWF9GcmVlKG1fRGFzaEFycmF5KTsKLSAgbV9EYXNoQXJyYXkgPSBudWxscHRyOwotICBtX0Rhc2hQaGFzZSA9IHNyYy5tX0Rhc2hQaGFzZTsKLSAgbV9MaW5lSm9pbiA9IHNyYy5tX0xpbmVKb2luOwotICBtX01pdGVyTGltaXQgPSBzcmMubV9NaXRlckxpbWl0OwotICBtX0xpbmVXaWR0aCA9IHNyYy5tX0xpbmVXaWR0aDsKLSAgaWYgKG1fRGFzaENvdW50KSB7Ci0gICAgbV9EYXNoQXJyYXkgPSBGWF9BbGxvYyhGWF9GTE9BVCwgbV9EYXNoQ291bnQpOwotICAgIEZYU1lTX21lbWNweShtX0Rhc2hBcnJheSwgc3JjLm1fRGFzaEFycmF5LCBtX0Rhc2hDb3VudCAqIHNpemVvZihGWF9GTE9BVCkpOwotICB9Ci19Ci0KLUNGWF9HcmFwaFN0YXRlRGF0YTo6fkNGWF9HcmFwaFN0YXRlRGF0YSgpIHsKLSAgRlhfRnJlZShtX0Rhc2hBcnJheSk7Ci19Ci0KLXZvaWQgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpTZXREYXNoQ291bnQoaW50IGNvdW50KSB7Ci0gIEZYX0ZyZWUobV9EYXNoQXJyYXkpOwotICBtX0Rhc2hBcnJheSA9IG51bGxwdHI7Ci0gIG1fRGFzaENvdW50ID0gY291bnQ7Ci0gIGlmIChjb3VudCA9PSAwKQotICAgIHJldHVybjsKLSAgbV9EYXNoQXJyYXkgPSBGWF9BbGxvYyhGWF9GTE9BVCwgY291bnQpOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2dlL2NmeF9wYXRoZGF0YS5jcHAgYi9jb3JlL2Z4Z2UvZ2UvY2Z4X3BhdGhkYXRhLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZhMmNkMi4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Z2UvZ2UvY2Z4X3BhdGhkYXRhLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ4NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3BhdGhkYXRhLmgiCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9tYXRoLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLXZvaWQgVXBkYXRlTGluZUVuZFBvaW50cyhDRlhfRmxvYXRSZWN0KiByZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHN0YXJ0X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBlbmRfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGh3KSB7Ci0gIGlmIChzdGFydF9wb3MueCA9PSBlbmRfcG9zLngpIHsKLSAgICBpZiAoc3RhcnRfcG9zLnkgPT0gZW5kX3Bvcy55KSB7Ci0gICAgICByZWN0LT5VcGRhdGVSZWN0KGVuZF9wb3MueCArIGh3LCBlbmRfcG9zLnkgKyBodyk7Ci0gICAgICByZWN0LT5VcGRhdGVSZWN0KGVuZF9wb3MueCAtIGh3LCBlbmRfcG9zLnkgLSBodyk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgRlhfRkxPQVQgcG9pbnRfeTsKLSAgICBpZiAoZW5kX3Bvcy55IDwgc3RhcnRfcG9zLnkpCi0gICAgICBwb2ludF95ID0gZW5kX3Bvcy55IC0gaHc7Ci0gICAgZWxzZQotICAgICAgcG9pbnRfeSA9IGVuZF9wb3MueSArIGh3OwotCi0gICAgcmVjdC0+VXBkYXRlUmVjdChlbmRfcG9zLnggKyBodywgcG9pbnRfeSk7Ci0gICAgcmVjdC0+VXBkYXRlUmVjdChlbmRfcG9zLnggLSBodywgcG9pbnRfeSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHN0YXJ0X3Bvcy55ID09IGVuZF9wb3MueSkgewotICAgIEZYX0ZMT0FUIHBvaW50X3g7Ci0gICAgaWYgKGVuZF9wb3MueCA8IHN0YXJ0X3Bvcy54KQotICAgICAgcG9pbnRfeCA9IGVuZF9wb3MueCAtIGh3OwotICAgIGVsc2UKLSAgICAgIHBvaW50X3ggPSBlbmRfcG9zLnggKyBodzsKLQotICAgIHJlY3QtPlVwZGF0ZVJlY3QocG9pbnRfeCwgZW5kX3Bvcy55ICsgaHcpOwotICAgIHJlY3QtPlVwZGF0ZVJlY3QocG9pbnRfeCwgZW5kX3Bvcy55IC0gaHcpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENGWF9Qb2ludEYgZGlmZiA9IGVuZF9wb3MgLSBzdGFydF9wb3M7Ci0gIEZYX0ZMT0FUIGxsID0gRlhTWVNfc3FydDIoZGlmZi54LCBkaWZmLnkpOwotICBGWF9GTE9BVCBteCA9IGVuZF9wb3MueCArIGh3ICogZGlmZi54IC8gbGw7Ci0gIEZYX0ZMT0FUIG15ID0gZW5kX3Bvcy55ICsgaHcgKiBkaWZmLnkgLyBsbDsKLSAgRlhfRkxPQVQgZHgxID0gaHcgKiBkaWZmLnkgLyBsbDsKLSAgRlhfRkxPQVQgZHkxID0gaHcgKiBkaWZmLnggLyBsbDsKLSAgcmVjdC0+VXBkYXRlUmVjdChteCAtIGR4MSwgbXkgKyBkeTEpOwotICByZWN0LT5VcGRhdGVSZWN0KG14ICsgZHgxLCBteSAtIGR5MSk7Ci19Ci0KLXZvaWQgVXBkYXRlTGluZUpvaW5Qb2ludHMoQ0ZYX0Zsb2F0UmVjdCogcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgc3RhcnRfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBtaWRfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBlbmRfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBoYWxmX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBtaXRlcl9saW1pdCkgewotICBGWF9GTE9BVCBzdGFydF9rID0gMDsKLSAgRlhfRkxPQVQgc3RhcnRfYyA9IDA7Ci0gIEZYX0ZMT0FUIGVuZF9rID0gMDsKLSAgRlhfRkxPQVQgZW5kX2MgPSAwOwotICBGWF9GTE9BVCBzdGFydF9sZW4gPSAwOwotICBGWF9GTE9BVCBzdGFydF9kYyA9IDA7Ci0gIEZYX0ZMT0FUIGVuZF9sZW4gPSAwOwotICBGWF9GTE9BVCBlbmRfZGMgPSAwOwotICBGWF9GTE9BVCBvbmVfdHdlbnRpZXRoID0gMS4wZiAvIDIwOwotCi0gIGJvb2wgYlN0YXJ0VmVydCA9IEZYU1lTX2ZhYnMoc3RhcnRfcG9zLnggLSBtaWRfcG9zLngpIDwgb25lX3R3ZW50aWV0aDsKLSAgYm9vbCBiRW5kVmVydCA9IEZYU1lTX2ZhYnMobWlkX3Bvcy54IC0gZW5kX3Bvcy54KSA8IG9uZV90d2VudGlldGg7Ci0gIGlmIChiU3RhcnRWZXJ0ICYmIGJFbmRWZXJ0KSB7Ci0gICAgaW50IHN0YXJ0X2RpciA9IG1pZF9wb3MueSA+IHN0YXJ0X3Bvcy55ID8gMSA6IC0xOwotICAgIEZYX0ZMT0FUIHBvaW50X3kgPSBtaWRfcG9zLnkgKyBoYWxmX3dpZHRoICogc3RhcnRfZGlyOwotICAgIHJlY3QtPlVwZGF0ZVJlY3QobWlkX3Bvcy54ICsgaGFsZl93aWR0aCwgcG9pbnRfeSk7Ci0gICAgcmVjdC0+VXBkYXRlUmVjdChtaWRfcG9zLnggLSBoYWxmX3dpZHRoLCBwb2ludF95KTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoIWJTdGFydFZlcnQpIHsKLSAgICBDRlhfUG9pbnRGIHN0YXJ0X3RvX21pZCA9IHN0YXJ0X3BvcyAtIG1pZF9wb3M7Ci0gICAgc3RhcnRfayA9IChtaWRfcG9zLnkgLSBzdGFydF9wb3MueSkgLyAobWlkX3Bvcy54IC0gc3RhcnRfcG9zLngpOwotICAgIHN0YXJ0X2MgPSBtaWRfcG9zLnkgLSAoc3RhcnRfayAqIG1pZF9wb3MueCk7Ci0gICAgc3RhcnRfbGVuID0gRlhTWVNfc3FydDIoc3RhcnRfdG9fbWlkLngsIHN0YXJ0X3RvX21pZC55KTsKLSAgICBzdGFydF9kYyA9IHN0YXRpY19jYXN0PEZYX0ZMT0FUPigKLSAgICAgICAgRlhTWVNfZmFicyhoYWxmX3dpZHRoICogc3RhcnRfbGVuIC8gc3RhcnRfdG9fbWlkLngpKTsKLSAgfQotICBpZiAoIWJFbmRWZXJ0KSB7Ci0gICAgQ0ZYX1BvaW50RiBlbmRfdG9fbWlkID0gZW5kX3BvcyAtIG1pZF9wb3M7Ci0gICAgZW5kX2sgPSBlbmRfdG9fbWlkLnkgLyBlbmRfdG9fbWlkLng7Ci0gICAgZW5kX2MgPSBtaWRfcG9zLnkgLSAoZW5kX2sgKiBtaWRfcG9zLngpOwotICAgIGVuZF9sZW4gPSBGWFNZU19zcXJ0MihlbmRfdG9fbWlkLngsIGVuZF90b19taWQueSk7Ci0gICAgZW5kX2RjID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KEZYU1lTX2ZhYnMoaGFsZl93aWR0aCAqIGVuZF9sZW4gLyBlbmRfdG9fbWlkLngpKTsKLSAgfQotICBpZiAoYlN0YXJ0VmVydCkgewotICAgIENGWF9Qb2ludEYgb3V0c2lkZShzdGFydF9wb3MueCwgMCk7Ci0gICAgaWYgKGVuZF9wb3MueCA8IHN0YXJ0X3Bvcy54KQotICAgICAgb3V0c2lkZS54ICs9IGhhbGZfd2lkdGg7Ci0gICAgZWxzZQotICAgICAgb3V0c2lkZS54IC09IGhhbGZfd2lkdGg7Ci0KLSAgICBpZiAoc3RhcnRfcG9zLnkgPCAoZW5kX2sgKiBzdGFydF9wb3MueCkgKyBlbmRfYykKLSAgICAgIG91dHNpZGUueSA9IChlbmRfayAqIG91dHNpZGUueCkgKyBlbmRfYyArIGVuZF9kYzsKLSAgICBlbHNlCi0gICAgICBvdXRzaWRlLnkgPSAoZW5kX2sgKiBvdXRzaWRlLngpICsgZW5kX2MgLSBlbmRfZGM7Ci0KLSAgICByZWN0LT5VcGRhdGVSZWN0KG91dHNpZGUueCwgb3V0c2lkZS55KTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoYkVuZFZlcnQpIHsKLSAgICBDRlhfUG9pbnRGIG91dHNpZGUoZW5kX3Bvcy54LCAwKTsKLSAgICBpZiAoc3RhcnRfcG9zLnggPCBlbmRfcG9zLngpCi0gICAgICBvdXRzaWRlLnggKz0gaGFsZl93aWR0aDsKLSAgICBlbHNlCi0gICAgICBvdXRzaWRlLnggLT0gaGFsZl93aWR0aDsKLQotICAgIGlmIChlbmRfcG9zLnkgPCAoc3RhcnRfayAqIGVuZF9wb3MueCkgKyBzdGFydF9jKQotICAgICAgb3V0c2lkZS55ID0gKHN0YXJ0X2sgKiBvdXRzaWRlLngpICsgc3RhcnRfYyArIHN0YXJ0X2RjOwotICAgIGVsc2UKLSAgICAgIG91dHNpZGUueSA9IChzdGFydF9rICogb3V0c2lkZS54KSArIHN0YXJ0X2MgLSBzdGFydF9kYzsKLQotICAgIHJlY3QtPlVwZGF0ZVJlY3Qob3V0c2lkZS54LCBvdXRzaWRlLnkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChGWFNZU19mYWJzKHN0YXJ0X2sgLSBlbmRfaykgPCBvbmVfdHdlbnRpZXRoKSB7Ci0gICAgaW50IHN0YXJ0X2RpciA9IG1pZF9wb3MueCA+IHN0YXJ0X3Bvcy54ID8gMSA6IC0xOwotICAgIGludCBlbmRfZGlyID0gZW5kX3Bvcy54ID4gbWlkX3Bvcy54ID8gMSA6IC0xOwotICAgIGlmIChzdGFydF9kaXIgPT0gZW5kX2RpcikKLSAgICAgIFVwZGF0ZUxpbmVFbmRQb2ludHMocmVjdCwgbWlkX3BvcywgZW5kX3BvcywgaGFsZl93aWR0aCk7Ci0gICAgZWxzZQotICAgICAgVXBkYXRlTGluZUVuZFBvaW50cyhyZWN0LCBzdGFydF9wb3MsIG1pZF9wb3MsIGhhbGZfd2lkdGgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEZYX0ZMT0FUIHN0YXJ0X291dHNpZGVfYyA9IHN0YXJ0X2M7Ci0gIGlmIChlbmRfcG9zLnkgPCAoc3RhcnRfayAqIGVuZF9wb3MueCkgKyBzdGFydF9jKQotICAgIHN0YXJ0X291dHNpZGVfYyArPSBzdGFydF9kYzsKLSAgZWxzZQotICAgIHN0YXJ0X291dHNpZGVfYyAtPSBzdGFydF9kYzsKLQotICBGWF9GTE9BVCBlbmRfb3V0c2lkZV9jID0gZW5kX2M7Ci0gIGlmIChzdGFydF9wb3MueSA8IChlbmRfayAqIHN0YXJ0X3Bvcy54KSArIGVuZF9jKQotICAgIGVuZF9vdXRzaWRlX2MgKz0gZW5kX2RjOwotICBlbHNlCi0gICAgZW5kX291dHNpZGVfYyAtPSBlbmRfZGM7Ci0KLSAgRlhfRkxPQVQgam9pbl94ID0gKGVuZF9vdXRzaWRlX2MgLSBzdGFydF9vdXRzaWRlX2MpIC8gKHN0YXJ0X2sgLSBlbmRfayk7Ci0gIEZYX0ZMT0FUIGpvaW5feSA9IHN0YXJ0X2sgKiBqb2luX3ggKyBzdGFydF9vdXRzaWRlX2M7Ci0gIHJlY3QtPlVwZGF0ZVJlY3Qoam9pbl94LCBqb2luX3kpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotRlhfUEFUSFBPSU5UOjpGWF9QQVRIUE9JTlQoKSA9IGRlZmF1bHQ7Ci0KLUZYX1BBVEhQT0lOVDo6RlhfUEFUSFBPSU5UKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCBGWFBUX1RZUEUgdHlwZSwgYm9vbCBjbG9zZSkKLSAgICA6IG1fUG9pbnQocG9pbnQpLCBtX1R5cGUodHlwZSksIG1fQ2xvc2VGaWd1cmUoY2xvc2UpIHt9Ci0KLUZYX1BBVEhQT0lOVDo6RlhfUEFUSFBPSU5UKGNvbnN0IEZYX1BBVEhQT0lOVCYgb3RoZXIpID0gZGVmYXVsdDsKLQotRlhfUEFUSFBPSU5UOjp+RlhfUEFUSFBPSU5UKCkgPSBkZWZhdWx0OwotCi1DRlhfUGF0aERhdGE6OkNGWF9QYXRoRGF0YSgpIHt9Ci0KLUNGWF9QYXRoRGF0YTo6fkNGWF9QYXRoRGF0YSgpIHt9Ci0KLUNGWF9QYXRoRGF0YTo6Q0ZYX1BhdGhEYXRhKGNvbnN0IENGWF9QYXRoRGF0YSYgc3JjKSA6IG1fUG9pbnRzKHNyYy5tX1BvaW50cykge30KLQotdm9pZCBDRlhfUGF0aERhdGE6OkNsZWFyKCkgewotICBtX1BvaW50cy5jbGVhcigpOwotfQotCi12b2lkIENGWF9QYXRoRGF0YTo6Q2xvc2VQYXRoKCkgewotICBpZiAobV9Qb2ludHMuZW1wdHkoKSkKLSAgICByZXR1cm47Ci0gIG1fUG9pbnRzLmJhY2soKS5tX0Nsb3NlRmlndXJlID0gdHJ1ZTsKLX0KLQotdm9pZCBDRlhfUGF0aERhdGE6OkFwcGVuZChjb25zdCBDRlhfUGF0aERhdGEqIHBTcmMsIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgaWYgKHBTcmMtPm1fUG9pbnRzLmVtcHR5KCkpCi0gICAgcmV0dXJuOwotCi0gIHNpemVfdCBjdXJfc2l6ZSA9IG1fUG9pbnRzLnNpemUoKTsKLSAgbV9Qb2ludHMuaW5zZXJ0KG1fUG9pbnRzLmVuZCgpLCBwU3JjLT5tX1BvaW50cy5iZWdpbigpLCBwU3JjLT5tX1BvaW50cy5lbmQoKSk7Ci0KLSAgaWYgKCFwTWF0cml4KQotICAgIHJldHVybjsKLQotICBmb3IgKHNpemVfdCBpID0gY3VyX3NpemU7IGkgPCBtX1BvaW50cy5zaXplKCk7IGkrKykKLSAgICBtX1BvaW50c1tpXS5tX1BvaW50ID0gcE1hdHJpeC0+VHJhbnNmb3JtKG1fUG9pbnRzW2ldLm1fUG9pbnQpOwotfQotCi12b2lkIENGWF9QYXRoRGF0YTo6QXBwZW5kUG9pbnQoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9UWVBFIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjbG9zZUZpZ3VyZSkgewotICBtX1BvaW50cy5wdXNoX2JhY2soRlhfUEFUSFBPSU5UKHBvaW50LCB0eXBlLCBjbG9zZUZpZ3VyZSkpOwotfQotCi12b2lkIENGWF9QYXRoRGF0YTo6QXBwZW5kUmVjdChGWF9GTE9BVCBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b3ApIHsKLSAgbV9Qb2ludHMucHVzaF9iYWNrKAotICAgICAgRlhfUEFUSFBPSU5UKENGWF9Qb2ludEYobGVmdCwgYm90dG9tKSwgRlhQVF9UWVBFOjpNb3ZlVG8sIGZhbHNlKSk7Ci0gIG1fUG9pbnRzLnB1c2hfYmFjaygKLSAgICAgIEZYX1BBVEhQT0lOVChDRlhfUG9pbnRGKGxlZnQsIHRvcCksIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSkpOwotICBtX1BvaW50cy5wdXNoX2JhY2soCi0gICAgICBGWF9QQVRIUE9JTlQoQ0ZYX1BvaW50RihyaWdodCwgdG9wKSwgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKSk7Ci0gIG1fUG9pbnRzLnB1c2hfYmFjaygKLSAgICAgIEZYX1BBVEhQT0lOVChDRlhfUG9pbnRGKHJpZ2h0LCBib3R0b20pLCBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpKTsKLSAgbV9Qb2ludHMucHVzaF9iYWNrKAotICAgICAgRlhfUEFUSFBPSU5UKENGWF9Qb2ludEYobGVmdCwgYm90dG9tKSwgRlhQVF9UWVBFOjpMaW5lVG8sIHRydWUpKTsKLX0KLQotQ0ZYX0Zsb2F0UmVjdCBDRlhfUGF0aERhdGE6OkdldEJvdW5kaW5nQm94KCkgY29uc3QgewotICBpZiAobV9Qb2ludHMuZW1wdHkoKSkKLSAgICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdCgpOwotCi0gIENGWF9GbG9hdFJlY3QgcmVjdDsKLSAgcmVjdC5Jbml0UmVjdChtX1BvaW50c1swXS5tX1BvaW50LngsIG1fUG9pbnRzWzBdLm1fUG9pbnQueSk7Ci0gIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgbV9Qb2ludHMuc2l6ZSgpOyBpKyspCi0gICAgcmVjdC5VcGRhdGVSZWN0KG1fUG9pbnRzW2ldLm1fUG9pbnQueCwgbV9Qb2ludHNbaV0ubV9Qb2ludC55KTsKLSAgcmV0dXJuIHJlY3Q7Ci19Ci0KLUNGWF9GbG9hdFJlY3QgQ0ZYX1BhdGhEYXRhOjpHZXRCb3VuZGluZ0JveChGWF9GTE9BVCBsaW5lX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG1pdGVyX2xpbWl0KSBjb25zdCB7Ci0gIENGWF9GbG9hdFJlY3QgcmVjdCgxMDAwMDAuMGYsIDEwMDAwMC4wZiwgLTEwMDAwMC4wZiwgLTEwMDAwMC4wZik7Ci0gIHNpemVfdCBpUG9pbnQgPSAwOwotICBGWF9GTE9BVCBoYWxmX3dpZHRoID0gbGluZV93aWR0aDsKLSAgaW50IGlTdGFydFBvaW50ID0gMDsKLSAgaW50IGlFbmRQb2ludCA9IDA7Ci0gIGludCBpTWlkZGxlUG9pbnQgPSAwOwotICBib29sIGJKb2luOwotICB3aGlsZSAoaVBvaW50IDwgbV9Qb2ludHMuc2l6ZSgpKSB7Ci0gICAgaWYgKG1fUG9pbnRzW2lQb2ludF0uSXNUeXBlQW5kT3BlbihGWFBUX1RZUEU6Ok1vdmVUbykpIHsKLSAgICAgIGlTdGFydFBvaW50ID0gaVBvaW50ICsgMTsKLSAgICAgIGlFbmRQb2ludCA9IGlQb2ludDsKLSAgICAgIGJKb2luID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChtX1BvaW50c1tpUG9pbnRdLklzVHlwZUFuZE9wZW4oRlhQVF9UWVBFOjpCZXppZXJUbykpIHsKLSAgICAgICAgcmVjdC5VcGRhdGVSZWN0KG1fUG9pbnRzW2lQb2ludF0ubV9Qb2ludC54LCBtX1BvaW50c1tpUG9pbnRdLm1fUG9pbnQueSk7Ci0gICAgICAgIHJlY3QuVXBkYXRlUmVjdChtX1BvaW50c1tpUG9pbnQgKyAxXS5tX1BvaW50LngsCi0gICAgICAgICAgICAgICAgICAgICAgICBtX1BvaW50c1tpUG9pbnQgKyAxXS5tX1BvaW50LnkpOwotICAgICAgICBpUG9pbnQgKz0gMjsKLSAgICAgIH0KLSAgICAgIGlmIChpUG9pbnQgPT0gbV9Qb2ludHMuc2l6ZSgpIC0gMSB8fAotICAgICAgICAgIG1fUG9pbnRzW2lQb2ludCArIDFdLklzVHlwZUFuZE9wZW4oRlhQVF9UWVBFOjpNb3ZlVG8pKSB7Ci0gICAgICAgIGlTdGFydFBvaW50ID0gaVBvaW50IC0gMTsKLSAgICAgICAgaUVuZFBvaW50ID0gaVBvaW50OwotICAgICAgICBiSm9pbiA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaVN0YXJ0UG9pbnQgPSBpUG9pbnQgLSAxOwotICAgICAgICBpTWlkZGxlUG9pbnQgPSBpUG9pbnQ7Ci0gICAgICAgIGlFbmRQb2ludCA9IGlQb2ludCArIDE7Ci0gICAgICAgIGJKb2luID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBDRlhfUG9pbnRGIHN0YXJ0X3BvcyA9IG1fUG9pbnRzW2lTdGFydFBvaW50XS5tX1BvaW50OwotICAgIENGWF9Qb2ludEYgZW5kX3BvcyA9IG1fUG9pbnRzW2lFbmRQb2ludF0ubV9Qb2ludDsKLSAgICBpZiAoYkpvaW4pIHsKLSAgICAgIENGWF9Qb2ludEYgbWlkX3BvcyA9IG1fUG9pbnRzW2lNaWRkbGVQb2ludF0ubV9Qb2ludDsKLSAgICAgIFVwZGF0ZUxpbmVKb2luUG9pbnRzKCZyZWN0LCBzdGFydF9wb3MsIG1pZF9wb3MsIGVuZF9wb3MsIGhhbGZfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtaXRlcl9saW1pdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFVwZGF0ZUxpbmVFbmRQb2ludHMoJnJlY3QsIHN0YXJ0X3BvcywgZW5kX3BvcywgaGFsZl93aWR0aCk7Ci0gICAgfQotICAgIGlQb2ludCsrOwotICB9Ci0gIHJldHVybiByZWN0OwotfQotCi12b2lkIENGWF9QYXRoRGF0YTo6VHJhbnNmb3JtKGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgaWYgKCFwTWF0cml4KQotICAgIHJldHVybjsKLSAgZm9yIChhdXRvJiBwb2ludCA6IG1fUG9pbnRzKQotICAgIHBvaW50Lm1fUG9pbnQgPSBwTWF0cml4LT5UcmFuc2Zvcm0ocG9pbnQubV9Qb2ludCk7Ci19Ci0KLWJvb2wgQ0ZYX1BhdGhEYXRhOjpHZXRaZXJvQXJlYVBhdGgoY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWRqdXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEqIE5ld1BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGJUaGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBzZXRJZGVudGl0eSkgY29uc3QgewotICAqc2V0SWRlbnRpdHkgPSBmYWxzZTsKLSAgaWYgKG1fUG9pbnRzLnNpemUoKSA8IDMpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChtX1BvaW50cy5zaXplKCkgPT0gMyAmJiBtX1BvaW50c1swXS5tX1R5cGUgPT0gRlhQVF9UWVBFOjpNb3ZlVG8gJiYKLSAgICAgIG1fUG9pbnRzWzFdLm1fVHlwZSA9PSBGWFBUX1RZUEU6OkxpbmVUbyAmJgotICAgICAgbV9Qb2ludHNbMl0ubV9UeXBlID09IEZYUFRfVFlQRTo6TGluZVRvICYmCi0gICAgICBtX1BvaW50c1swXS5tX1BvaW50ID09IG1fUG9pbnRzWzJdLm1fUG9pbnQpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgQ0ZYX1BvaW50RiBwb2ludCA9IG1fUG9pbnRzW2ldLm1fUG9pbnQ7Ci0gICAgICBpZiAoYkFkanVzdCkgewotICAgICAgICBpZiAocE1hdHJpeCkKLSAgICAgICAgICBwb2ludCA9IHBNYXRyaXgtPlRyYW5zZm9ybShwb2ludCk7Ci0KLSAgICAgICAgcG9pbnQgPSBDRlhfUG9pbnRGKHN0YXRpY19jYXN0PGludD4ocG9pbnQueCkgKyAwLjVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pihwb2ludC55KSArIDAuNWYpOwotICAgICAgfQotICAgICAgTmV3UGF0aC0+QXBwZW5kUG9pbnQoCi0gICAgICAgICAgcG9pbnQsIGkgPT0gMCA/IEZYUFRfVFlQRTo6TW92ZVRvIDogRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKLSAgICB9Ci0gICAgaWYgKGJBZGp1c3QgJiYgcE1hdHJpeCkKLSAgICAgICpzZXRJZGVudGl0eSA9IHRydWU7Ci0KLSAgICAvLyBOb3RlLCB0aGV5IGJvdGggaGF2ZSB0byBiZSBub3QgZXF1YWwuCi0gICAgaWYgKG1fUG9pbnRzWzBdLm1fUG9pbnQueCAhPSBtX1BvaW50c1sxXS5tX1BvaW50LnggJiYKLSAgICAgICAgbV9Qb2ludHNbMF0ubV9Qb2ludC55ICE9IG1fUG9pbnRzWzFdLm1fUG9pbnQueSkgewotICAgICAgKmJUaGluID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBpZiAoKChtX1BvaW50cy5zaXplKCkgPiAzKSAmJiAobV9Qb2ludHMuc2l6ZSgpICUgMikpKSB7Ci0gICAgaW50IG1pZCA9IG1fUG9pbnRzLnNpemUoKSAvIDI7Ci0gICAgYm9vbCBiWmVyb0FyZWEgPSBmYWxzZTsKLSAgICBDRlhfUGF0aERhdGEgdF9wYXRoOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWlkOyBpKyspIHsKLSAgICAgIGlmICghKG1fUG9pbnRzW21pZCAtIGkgLSAxXS5tX1BvaW50ID09IG1fUG9pbnRzW21pZCArIGkgKyAxXS5tX1BvaW50ICYmCi0gICAgICAgICAgICBtX1BvaW50c1ttaWQgLSBpIC0gMV0ubV9UeXBlICE9IEZYUFRfVFlQRTo6QmV6aWVyVG8gJiYKLSAgICAgICAgICAgIG1fUG9pbnRzW21pZCArIGkgKyAxXS5tX1R5cGUgIT0gRlhQVF9UWVBFOjpCZXppZXJUbykpIHsKLSAgICAgICAgYlplcm9BcmVhID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHRfcGF0aC5BcHBlbmRQb2ludChtX1BvaW50c1ttaWQgLSBpXS5tX1BvaW50LCBGWFBUX1RZUEU6Ok1vdmVUbywgZmFsc2UpOwotICAgICAgdF9wYXRoLkFwcGVuZFBvaW50KG1fUG9pbnRzW21pZCAtIGkgLSAxXS5tX1BvaW50LCBGWFBUX1RZUEU6OkxpbmVUbywKLSAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgfQotICAgIGlmICghYlplcm9BcmVhKSB7Ci0gICAgICBOZXdQYXRoLT5BcHBlbmQoJnRfcGF0aCwgbnVsbHB0cik7Ci0gICAgICAqYlRoaW4gPSB0cnVlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0KLSAgaW50IHN0cmF0UG9pbnQgPSAwOwotICBpbnQgbmV4dCA9IDA7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9Qb2ludHMuc2l6ZSgpOyBpKyspIHsKLSAgICBGWFBUX1RZUEUgcG9pbnRfdHlwZSA9IG1fUG9pbnRzW2ldLm1fVHlwZTsKLSAgICBpZiAocG9pbnRfdHlwZSA9PSBGWFBUX1RZUEU6Ok1vdmVUbykgewotICAgICAgc3RyYXRQb2ludCA9IGk7Ci0gICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfVFlQRTo6TGluZVRvKSB7Ci0gICAgICBuZXh0ID0gKGkgKyAxIC0gc3RyYXRQb2ludCkgJSAobV9Qb2ludHMuc2l6ZSgpIC0gc3RyYXRQb2ludCkgKyBzdHJhdFBvaW50OwotICAgICAgaWYgKG1fUG9pbnRzW25leHRdLm1fVHlwZSAhPSBGWFBUX1RZUEU6OkJlemllclRvICYmCi0gICAgICAgICAgbV9Qb2ludHNbbmV4dF0ubV9UeXBlICE9IEZYUFRfVFlQRTo6TW92ZVRvKSB7Ci0gICAgICAgIGlmICgobV9Qb2ludHNbaSAtIDFdLm1fUG9pbnQueCA9PSBtX1BvaW50c1tpXS5tX1BvaW50LnggJiYKLSAgICAgICAgICAgICBtX1BvaW50c1tpXS5tX1BvaW50LnggPT0gbV9Qb2ludHNbbmV4dF0ubV9Qb2ludC54KSAmJgotICAgICAgICAgICAgKChtX1BvaW50c1tpXS5tX1BvaW50LnkgLSBtX1BvaW50c1tpIC0gMV0ubV9Qb2ludC55KSAqCi0gICAgICAgICAgICAgICAgIChtX1BvaW50c1tpXS5tX1BvaW50LnkgLSBtX1BvaW50c1tuZXh0XS5tX1BvaW50LnkpID4KLSAgICAgICAgICAgICAwKSkgewotICAgICAgICAgIGludCBwcmUgPSBpOwotICAgICAgICAgIGlmIChGWFNZU19mYWJzKG1fUG9pbnRzW2ldLm1fUG9pbnQueSAtIG1fUG9pbnRzW2kgLSAxXS5tX1BvaW50LnkpIDwKLSAgICAgICAgICAgICAgRlhTWVNfZmFicyhtX1BvaW50c1tpXS5tX1BvaW50LnkgLSBtX1BvaW50c1tuZXh0XS5tX1BvaW50LnkpKSB7Ci0gICAgICAgICAgICBwcmUtLTsKLSAgICAgICAgICAgIG5leHQtLTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBOZXdQYXRoLT5BcHBlbmRQb2ludChtX1BvaW50c1twcmVdLm1fUG9pbnQsIEZYUFRfVFlQRTo6TW92ZVRvLCBmYWxzZSk7Ci0gICAgICAgICAgTmV3UGF0aC0+QXBwZW5kUG9pbnQobV9Qb2ludHNbbmV4dF0ubV9Qb2ludCwgRlhQVF9UWVBFOjpMaW5lVG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICB9IGVsc2UgaWYgKChtX1BvaW50c1tpIC0gMV0ubV9Qb2ludC55ID09IG1fUG9pbnRzW2ldLm1fUG9pbnQueSAmJgotICAgICAgICAgICAgICAgICAgICBtX1BvaW50c1tpXS5tX1BvaW50LnkgPT0gbV9Qb2ludHNbbmV4dF0ubV9Qb2ludC55KSAmJgotICAgICAgICAgICAgICAgICAgICgobV9Qb2ludHNbaV0ubV9Qb2ludC54IC0gbV9Qb2ludHNbaSAtIDFdLm1fUG9pbnQueCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgKG1fUG9pbnRzW2ldLm1fUG9pbnQueCAtIG1fUG9pbnRzW25leHRdLm1fUG9pbnQueCkgPgotICAgICAgICAgICAgICAgICAgICAwKSkgewotICAgICAgICAgIGludCBwcmUgPSBpOwotICAgICAgICAgIGlmIChGWFNZU19mYWJzKG1fUG9pbnRzW2ldLm1fUG9pbnQueCAtIG1fUG9pbnRzW2kgLSAxXS5tX1BvaW50LngpIDwKLSAgICAgICAgICAgICAgRlhTWVNfZmFicyhtX1BvaW50c1tpXS5tX1BvaW50LnggLSBtX1BvaW50c1tuZXh0XS5tX1BvaW50LngpKSB7Ci0gICAgICAgICAgICBwcmUtLTsKLSAgICAgICAgICAgIG5leHQtLTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBOZXdQYXRoLT5BcHBlbmRQb2ludChtX1BvaW50c1twcmVdLm1fUG9pbnQsIEZYUFRfVFlQRTo6TW92ZVRvLCBmYWxzZSk7Ci0gICAgICAgICAgTmV3UGF0aC0+QXBwZW5kUG9pbnQobV9Qb2ludHNbbmV4dF0ubV9Qb2ludCwgRlhQVF9UWVBFOjpMaW5lVG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgICB9IGVsc2UgaWYgKG1fUG9pbnRzW2kgLSAxXS5tX1R5cGUgPT0gRlhQVF9UWVBFOjpNb3ZlVG8gJiYKLSAgICAgICAgICAgICAgICAgICBtX1BvaW50c1tuZXh0XS5tX1R5cGUgPT0gRlhQVF9UWVBFOjpMaW5lVG8gJiYKLSAgICAgICAgICAgICAgICAgICBtX1BvaW50c1tpIC0gMV0ubV9Qb2ludCA9PSBtX1BvaW50c1tuZXh0XS5tX1BvaW50ICYmCi0gICAgICAgICAgICAgICAgICAgbV9Qb2ludHNbbmV4dF0ubV9DbG9zZUZpZ3VyZSkgewotICAgICAgICAgIE5ld1BhdGgtPkFwcGVuZFBvaW50KG1fUG9pbnRzW2kgLSAxXS5tX1BvaW50LCBGWFBUX1RZUEU6Ok1vdmVUbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgTmV3UGF0aC0+QXBwZW5kUG9pbnQobV9Qb2ludHNbaV0ubV9Qb2ludCwgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKLSAgICAgICAgICAqYlRoaW4gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChwb2ludF90eXBlID09IEZYUFRfVFlQRTo6QmV6aWVyVG8pIHsKLSAgICAgIGkgKz0gMjsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgfQotCi0gIHNpemVfdCBuZXdfcGF0aF9zaXplID0gTmV3UGF0aC0+R2V0UG9pbnRzKCkuc2l6ZSgpOwotICBpZiAobV9Qb2ludHMuc2l6ZSgpID4gMyAmJiBuZXdfcGF0aF9zaXplID4gMCkKLSAgICAqYlRoaW4gPSB0cnVlOwotICByZXR1cm4gbmV3X3BhdGhfc2l6ZSAhPSAwOwotfQotCi1ib29sIENGWF9QYXRoRGF0YTo6SXNSZWN0KCkgY29uc3QgewotICBpZiAobV9Qb2ludHMuc2l6ZSgpICE9IDUgJiYgbV9Qb2ludHMuc2l6ZSgpICE9IDQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICgobV9Qb2ludHMuc2l6ZSgpID09IDUgJiYgbV9Qb2ludHNbMF0ubV9Qb2ludCAhPSBtX1BvaW50c1s0XS5tX1BvaW50KSB8fAotICAgICAgbV9Qb2ludHNbMF0ubV9Qb2ludCA9PSBtX1BvaW50c1syXS5tX1BvaW50IHx8Ci0gICAgICBtX1BvaW50c1sxXS5tX1BvaW50ID09IG1fUG9pbnRzWzNdLm1fUG9pbnQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm90ZSwgYm90aCB4LHkgaGF2ZSB0byBub3QgZXF1YWwuCi0gIGlmIChtX1BvaW50c1swXS5tX1BvaW50LnggIT0gbV9Qb2ludHNbM10ubV9Qb2ludC54ICYmCi0gICAgICBtX1BvaW50c1swXS5tX1BvaW50LnkgIT0gbV9Qb2ludHNbM10ubV9Qb2ludC55KSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDE7IGkgPCA0OyBpKyspIHsKLSAgICBpZiAobV9Qb2ludHNbaV0ubV9UeXBlICE9IEZYUFRfVFlQRTo6TGluZVRvKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIC8vIE5vdGUsIGJvdGggeCx5IGhhdmUgdG8gbm90IGVxdWFsLgotICAgIGlmIChtX1BvaW50c1tpXS5tX1BvaW50LnggIT0gbV9Qb2ludHNbaSAtIDFdLm1fUG9pbnQueCAmJgotICAgICAgICBtX1BvaW50c1tpXS5tX1BvaW50LnkgIT0gbV9Qb2ludHNbaSAtIDFdLm1fUG9pbnQueSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gbV9Qb2ludHMuc2l6ZSgpID09IDUgfHwgbV9Qb2ludHNbM10ubV9DbG9zZUZpZ3VyZTsKLX0KLQotYm9vbCBDRlhfUGF0aERhdGE6OklzUmVjdChjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRmxvYXRSZWN0KiBwUmVjdCkgY29uc3QgewotICBpZiAoIXBNYXRyaXgpIHsKLSAgICBpZiAoIUlzUmVjdCgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKHBSZWN0KSB7Ci0gICAgICBwUmVjdC0+bGVmdCA9IG1fUG9pbnRzWzBdLm1fUG9pbnQueDsKLSAgICAgIHBSZWN0LT5yaWdodCA9IG1fUG9pbnRzWzJdLm1fUG9pbnQueDsKLSAgICAgIHBSZWN0LT5ib3R0b20gPSBtX1BvaW50c1swXS5tX1BvaW50Lnk7Ci0gICAgICBwUmVjdC0+dG9wID0gbV9Qb2ludHNbMl0ubV9Qb2ludC55OwotICAgICAgcFJlY3QtPk5vcm1hbGl6ZSgpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGlmIChtX1BvaW50cy5zaXplKCkgIT0gNSAmJiBtX1BvaW50cy5zaXplKCkgIT0gNCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKChtX1BvaW50cy5zaXplKCkgPT0gNSAmJiBtX1BvaW50c1swXS5tX1BvaW50ICE9IG1fUG9pbnRzWzRdLm1fUG9pbnQpIHx8Ci0gICAgICBtX1BvaW50c1sxXS5tX1BvaW50ID09IG1fUG9pbnRzWzNdLm1fUG9pbnQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm90ZSwgYm90aCB4LHkgbm90IGVxdWFsLgotICBpZiAobV9Qb2ludHMuc2l6ZSgpID09IDQgJiYgbV9Qb2ludHNbMF0ubV9Qb2ludC54ICE9IG1fUG9pbnRzWzNdLm1fUG9pbnQueCAmJgotICAgICAgbV9Qb2ludHNbMF0ubV9Qb2ludC55ICE9IG1fUG9pbnRzWzNdLm1fUG9pbnQueSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIENGWF9Qb2ludEYgcG9pbnRzWzVdOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1fUG9pbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgcG9pbnRzW2ldID0gcE1hdHJpeC0+VHJhbnNmb3JtKG1fUG9pbnRzW2ldLm1fUG9pbnQpOwotCi0gICAgaWYgKGkgPT0gMCkKLSAgICAgIGNvbnRpbnVlOwotICAgIGlmIChtX1BvaW50c1tpXS5tX1R5cGUgIT0gRlhQVF9UWVBFOjpMaW5lVG8pCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHBvaW50c1tpXS54ICE9IHBvaW50c1tpIC0gMV0ueCAmJiBwb2ludHNbaV0ueSAhPSBwb2ludHNbaSAtIDFdLnkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAocFJlY3QpIHsKLSAgICBwUmVjdC0+bGVmdCA9IHBvaW50c1swXS54OwotICAgIHBSZWN0LT5yaWdodCA9IHBvaW50c1syXS54OwotICAgIHBSZWN0LT5ib3R0b20gPSBwb2ludHNbMF0ueTsKLSAgICBwUmVjdC0+dG9wID0gcG9pbnRzWzJdLnk7Ci0gICAgcFJlY3QtPk5vcm1hbGl6ZSgpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2dlL2NmeF9yZW5kZXJkZXZpY2UuY3BwIGIvY29yZS9meGdlL2dlL2NmeF9yZW5kZXJkZXZpY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWE2N2NjLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnhnZS9nZS9jZnhfcmVuZGVyZGV2aWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExMTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZhY2VjYWNoZS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZnhnZWRldmljZS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZ3JhcGhzdGF0ZWRhdGEuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3BhdGhkYXRhLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2lmeF9yZW5kZXJkZXZpY2Vkcml2ZXIuaCIKLQotI2lmIGRlZmluZWQgX1NLSUFfU1VQUE9SVF8gfHwgZGVmaW5lZCBfU0tJQV9TVVBQT1JUX1BBVEhTXwotI2luY2x1ZGUgInRoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9jb3JlL1NrVHlwZXMuaCIKLSNlbmRpZgotCi1uYW1lc3BhY2UgewotCi12b2lkIEFkanVzdEdseXBoU3BhY2Uoc3RkOjp2ZWN0b3I8RlhURVhUX0dMWVBIUE9TPiogcEdseXBoQW5kUG9zKSB7Ci0gIEFTU0VSVChwR2x5cGhBbmRQb3MtPnNpemUoKSA+IDEpOwotICBzdGQ6OnZlY3RvcjxGWFRFWFRfR0xZUEhQT1M+JiBnbHlwaHMgPSAqcEdseXBoQW5kUG9zOwotICBib29sIGJWZXJ0aWNhbCA9IGdseXBocy5iYWNrKCkubV9PcmlnaW4ueCA9PSBnbHlwaHMuZnJvbnQoKS5tX09yaWdpbi54OwotICBpZiAoIWJWZXJ0aWNhbCAmJiAoZ2x5cGhzLmJhY2soKS5tX09yaWdpbi55ICE9IGdseXBocy5mcm9udCgpLm1fT3JpZ2luLnkpKQotICAgIHJldHVybjsKLQotICBmb3IgKHNpemVfdCBpID0gZ2x5cGhzLnNpemUoKSAtIDE7IGkgPiAxOyAtLWkpIHsKLSAgICBGWFRFWFRfR0xZUEhQT1MmIG5leHQgPSBnbHlwaHNbaV07Ci0gICAgaW50IG5leHRfb3JpZ2luID0gYlZlcnRpY2FsID8gbmV4dC5tX09yaWdpbi55IDogbmV4dC5tX09yaWdpbi54OwotICAgIEZYX0ZMT0FUIG5leHRfb3JpZ2luX2YgPSBiVmVydGljYWwgPyBuZXh0Lm1fZk9yaWdpbi55IDogbmV4dC5tX2ZPcmlnaW4ueDsKLQotICAgIEZYVEVYVF9HTFlQSFBPUyYgY3VycmVudCA9IGdseXBoc1tpIC0gMV07Ci0gICAgaW50JiBjdXJyZW50X29yaWdpbiA9IGJWZXJ0aWNhbCA/IGN1cnJlbnQubV9PcmlnaW4ueSA6IGN1cnJlbnQubV9PcmlnaW4ueDsKLSAgICBGWF9GTE9BVCBjdXJyZW50X29yaWdpbl9mID0KLSAgICAgICAgYlZlcnRpY2FsID8gY3VycmVudC5tX2ZPcmlnaW4ueSA6IGN1cnJlbnQubV9mT3JpZ2luLng7Ci0KLSAgICBpbnQgc3BhY2UgPSBuZXh0X29yaWdpbiAtIGN1cnJlbnRfb3JpZ2luOwotICAgIEZYX0ZMT0FUIHNwYWNlX2YgPSBuZXh0X29yaWdpbl9mIC0gY3VycmVudF9vcmlnaW5fZjsKLSAgICBGWF9GTE9BVCBlcnJvciA9Ci0gICAgICAgIEZYU1lTX2ZhYnMoc3BhY2VfZikgLSBGWFNZU19mYWJzKHN0YXRpY19jYXN0PEZYX0ZMT0FUPihzcGFjZSkpOwotICAgIGlmIChlcnJvciA+IDAuNWYpCi0gICAgICBjdXJyZW50X29yaWdpbiArPSBzcGFjZSA+IDAgPyAtMSA6IDE7Ci0gIH0KLX0KLQotY29uc3QgdWludDhfdCBnX1RleHRHYW1tYUFkanVzdFsyNTZdID0gewotICAgIDAsICAgMiwgICAzLCAgIDQsICAgNiwgICA3LCAgIDgsICAgMTAsICAxMSwgIDEyLCAgMTMsICAxNSwgIDE2LCAgMTcsICAxOCwKLSAgICAxOSwgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjksICAzMCwgIDMxLCAgMzIsICAzMywgIDM0LCAgMzUsCi0gICAgMzYsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywgIDQ4LCAgNDksICA1MSwgIDUyLAotICAgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsICA2NCwgIDY1LCAgNjYsICA2NywKLSAgICA2OCwgIDY5LCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LCAgODAsICA4MSwgIDgyLCAgODMsCi0gICAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LCAgOTAsICA5MSwgIDkyLCAgOTMsICA5NCwgIDk1LCAgOTYsICA5NywgIDk4LAotICAgIDk5LCAgMTAwLCAxMDEsIDEwMiwgMTAzLCAxMDQsIDEwNSwgMTA2LCAxMDcsIDEwOCwgMTA5LCAxMTAsIDExMSwgMTEyLCAxMTMsCi0gICAgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsIDEyOCwKLSAgICAxMjksIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLAotICAgIDE0MywgMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2LCAxNTYsCi0gICAgMTU3LCAxNTgsIDE1OSwgMTYwLCAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwKLSAgICAxNzIsIDE3MywgMTc0LCAxNzQsIDE3NSwgMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4MSwgMTgyLCAxODMsIDE4NCwgMTg1LAotICAgIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkwLCAxOTAsIDE5MSwgMTkyLCAxOTMsIDE5NCwgMTk1LCAxOTYsIDE5NywgMTk4LCAxOTksCi0gICAgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywKLSAgICAyMTQsIDIxNSwgMjE2LCAyMTcsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMywgMjI0LCAyMjUsIDIyNiwgMjI3LAotICAgIDIyOCwgMjI4LCAyMjksIDIzMCwgMjMxLCAyMzIsIDIzMywgMjM0LCAyMzUsIDIzNiwgMjM3LCAyMzgsIDIzOSwgMjM5LCAyNDAsCi0gICAgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwgMjQ3LCAyNDgsIDI0OSwgMjUwLCAyNTAsIDI1MSwgMjUyLCAyNTMsIDI1NCwKLSAgICAyNTUsCi19OwotCi1pbnQgVGV4dEdhbW1hQWRqdXN0KGludCB2YWx1ZSkgewotICBBU1NFUlQodmFsdWUgPj0gMCk7Ci0gIEFTU0VSVCh2YWx1ZSA8PSAyNTUpOwotICByZXR1cm4gZ19UZXh0R2FtbWFBZGp1c3RbdmFsdWVdOwotfQotCi1pbnQgQ2FsY0FscGhhKGludCBzcmMsIGludCBhbHBoYSkgewotICByZXR1cm4gc3JjICogYWxwaGEgLyAyNTU7Ci19Ci0KLXZvaWQgTWVyZ2UodWludDhfdCBzcmMsIGludCBjaGFubmVsLCBpbnQgYWxwaGEsIHVpbnQ4X3QqIGRlc3QpIHsKLSAgKmRlc3QgPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdCwgY2hhbm5lbCwgQ2FsY0FscGhhKHNyYywgYWxwaGEpKTsKLX0KLQotdm9pZCBNZXJnZUdhbW1hQWRqdXN0KHVpbnQ4X3Qgc3JjLCBpbnQgY2hhbm5lbCwgaW50IGFscGhhLCB1aW50OF90KiBkZXN0KSB7Ci0gICpkZXN0ID0KLSAgICAgIEZYRElCX0FMUEhBX01FUkdFKCpkZXN0LCBjaGFubmVsLCBDYWxjQWxwaGEoVGV4dEdhbW1hQWRqdXN0KHNyYyksIGFscGhhKSk7Ci19Ci0KLXZvaWQgTWVyZ2VHYW1tYUFkanVzdEJncihjb25zdCB1aW50OF90KiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdCkgewotICBNZXJnZUdhbW1hQWRqdXN0KHNyY1swXSwgYiwgYSwgJmRlc3RbMF0pOwotICBNZXJnZUdhbW1hQWRqdXN0KHNyY1sxXSwgZywgYSwgJmRlc3RbMV0pOwotICBNZXJnZUdhbW1hQWRqdXN0KHNyY1syXSwgciwgYSwgJmRlc3RbMl0pOwotfQotCi12b2lkIE1lcmdlR2FtbWFBZGp1c3RSZ2IoY29uc3QgdWludDhfdCogc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCByLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBnLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3QpIHsKLSAgTWVyZ2VHYW1tYUFkanVzdChzcmNbMl0sIGIsIGEsICZkZXN0WzBdKTsKLSAgTWVyZ2VHYW1tYUFkanVzdChzcmNbMV0sIGcsIGEsICZkZXN0WzFdKTsKLSAgTWVyZ2VHYW1tYUFkanVzdChzcmNbMF0sIHIsIGEsICZkZXN0WzJdKTsKLX0KLQotaW50IEF2ZXJhZ2VSZ2IoY29uc3QgdWludDhfdCogc3JjKSB7Ci0gIHJldHVybiAoc3JjWzBdICsgc3JjWzFdICsgc3JjWzJdKSAvIDM7Ci19Ci0KLXVpbnQ4X3QgQ2FsY3VsYXRlRGVzdEFscGhhKHVpbnQ4X3QgYmFja19hbHBoYSwgaW50IHNyY19hbHBoYSkgewotICByZXR1cm4gYmFja19hbHBoYSArIHNyY19hbHBoYSAtIGJhY2tfYWxwaGEgKiBzcmNfYWxwaGEgLyAyNTU7Ci19Ci0KLXZvaWQgQXBwbHlEZXN0QWxwaGEodWludDhfdCBiYWNrX2FscGhhLAotICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2FscGhhLAotICAgICAgICAgICAgICAgICAgICBpbnQgciwKLSAgICAgICAgICAgICAgICAgICAgaW50IGcsCi0gICAgICAgICAgICAgICAgICAgIGludCBiLAotICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0KSB7Ci0gIHVpbnQ4X3QgZGVzdF9hbHBoYSA9IENhbGN1bGF0ZURlc3RBbHBoYShiYWNrX2FscGhhLCBzcmNfYWxwaGEpOwotICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICBkZXN0WzBdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdFswXSwgYiwgYWxwaGFfcmF0aW8pOwotICBkZXN0WzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdFsxXSwgZywgYWxwaGFfcmF0aW8pOwotICBkZXN0WzJdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdFsyXSwgciwgYWxwaGFfcmF0aW8pOwotICBkZXN0WzNdID0gZGVzdF9hbHBoYTsKLX0KLQotdm9pZCBOb3JtYWxpemVSZ2JEc3QoaW50IHNyY192YWx1ZSwgaW50IHIsIGludCBnLCBpbnQgYiwgaW50IGEsIHVpbnQ4X3QqIGRlc3QpIHsKLSAgaW50IHNyY19hbHBoYSA9IENhbGNBbHBoYShUZXh0R2FtbWFBZGp1c3Qoc3JjX3ZhbHVlKSwgYSk7Ci0gIGRlc3RbMF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0WzBdLCBiLCBzcmNfYWxwaGEpOwotICBkZXN0WzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdFsxXSwgZywgc3JjX2FscGhhKTsKLSAgZGVzdFsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3RbMl0sIHIsIHNyY19hbHBoYSk7Ci19Ci0KLXZvaWQgTm9ybWFsaXplUmdiU3JjKGludCBzcmNfdmFsdWUsIGludCByLCBpbnQgZywgaW50IGIsIGludCBhLCB1aW50OF90KiBkZXN0KSB7Ci0gIGludCBzcmNfYWxwaGEgPSBDYWxjQWxwaGEoVGV4dEdhbW1hQWRqdXN0KHNyY192YWx1ZSksIGEpOwotICBpZiAoc3JjX2FscGhhID09IDApCi0gICAgcmV0dXJuOwotCi0gIGRlc3RbMF0gPSBGWERJQl9BTFBIQV9NRVJHRShkZXN0WzBdLCBiLCBzcmNfYWxwaGEpOwotICBkZXN0WzFdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdFsxXSwgZywgc3JjX2FscGhhKTsKLSAgZGVzdFsyXSA9IEZYRElCX0FMUEhBX01FUkdFKGRlc3RbMl0sIHIsIHNyY19hbHBoYSk7Ci19Ci0KLXZvaWQgTm9ybWFsaXplQXJnYkRlc3QoaW50IHNyY192YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHIsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBnLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgYiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IGEsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3QpIHsKLSAgaW50IHNyY19hbHBoYSA9IENhbGNBbHBoYShUZXh0R2FtbWFBZGp1c3Qoc3JjX3ZhbHVlKSwgYSk7Ci0gIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3RbM107Ci0gIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICBGWEFSR0JfU0VURElCKGRlc3QsIEZYQVJHQl9NQUtFKHNyY19hbHBoYSwgciwgZywgYikpOwotICB9IGVsc2UgaWYgKHNyY19hbHBoYSAhPSAwKSB7Ci0gICAgQXBwbHlEZXN0QWxwaGEoYmFja19hbHBoYSwgc3JjX2FscGhhLCByLCBnLCBiLCBkZXN0KTsKLSAgfQotfQotCi12b2lkIE5vcm1hbGl6ZUFyZ2JTcmMoaW50IHNyY192YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgciwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgZywKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgYiwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgYSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0KSB7Ci0gIGludCBzcmNfYWxwaGEgPSBDYWxjQWxwaGEoVGV4dEdhbW1hQWRqdXN0KHNyY192YWx1ZSksIGEpOwotICBpZiAoc3JjX2FscGhhID09IDApCi0gICAgcmV0dXJuOwotCi0gIHVpbnQ4X3QgYmFja19hbHBoYSA9IGRlc3RbM107Ci0gIGlmIChiYWNrX2FscGhhID09IDApIHsKLSAgICBGWEFSR0JfU0VURElCKGRlc3QsIEZYQVJHQl9NQUtFKHNyY19hbHBoYSwgciwgZywgYikpOwotICB9IGVsc2UgewotICAgIEFwcGx5RGVzdEFscGhhKGJhY2tfYWxwaGEsIHNyY19hbHBoYSwgciwgZywgYiwgZGVzdCk7Ci0gIH0KLX0KLQotdm9pZCBOZXh0UGl4ZWwodWludDhfdCoqIHNyY19zY2FuLCB1aW50OF90KiogZHN0X3NjYW4sIGludCBicHApIHsKLSAgKnNyY19zY2FuICs9IDM7Ci0gICpkc3Rfc2NhbiArPSBicHA7Ci19Ci0KLXZvaWQgU2V0QWxwaGEodWludDhfdCogYWxwaGEpIHsKLSAgYWxwaGFbM10gPSAyNTU7Ci19Ci0KLXZvaWQgU2V0QWxwaGFEb05vdGhpbmcodWludDhfdCogYWxwaGEpIHt9Ci0KLXZvaWQgRHJhd05vcm1hbFRleHRIZWxwZXIoQ0ZYX0RJQml0bWFwKiBiaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcEdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnJvd3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5kX2NvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm9ybWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJCR1JTdHJpcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4X3N1YnBpeGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYikgewotICBjb25zdCBib29sIGhhc19hbHBoYSA9IGJpdG1hcC0+R2V0Rm9ybWF0KCkgPT0gRlhESUJfQXJnYjsKLSAgdWludDhfdCogc3JjX2J1ZiA9IHBHbHlwaC0+R2V0QnVmZmVyKCk7Ci0gIGludCBzcmNfcGl0Y2ggPSBwR2x5cGgtPkdldFBpdGNoKCk7Ci0gIHVpbnQ4X3QqIGRlc3RfYnVmID0gYml0bWFwLT5HZXRCdWZmZXIoKTsKLSAgaW50IGRlc3RfcGl0Y2ggPSBiaXRtYXAtPkdldFBpdGNoKCk7Ci0gIGNvbnN0IGludCBCcHAgPSBoYXNfYWxwaGEgPyA0IDogYml0bWFwLT5HZXRCUFAoKSAvIDg7Ci0gIGF1dG8qIHBOb3JtYWxpemVTcmNGdW5jID0gaGFzX2FscGhhID8gJk5vcm1hbGl6ZUFyZ2JTcmMgOiAmTm9ybWFsaXplUmdiRHN0OwotICBhdXRvKiBwTm9ybWFsaXplRHN0RnVuYyA9IGhhc19hbHBoYSA/ICZOb3JtYWxpemVBcmdiRGVzdCA6ICZOb3JtYWxpemVSZ2JTcmM7Ci0gIGF1dG8qIHBTZXRBbHBoYSA9IGhhc19hbHBoYSA/ICZTZXRBbHBoYSA6ICZTZXRBbHBoYURvTm90aGluZzsKLQotICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBucm93czsgcm93KyspIHsKLSAgICBpbnQgZGVzdF9yb3cgPSByb3cgKyB0b3A7Ci0gICAgaWYgKGRlc3Rfcm93IDwgMCB8fCBkZXN0X3JvdyA+PSBiaXRtYXAtPkdldEhlaWdodCgpKQotICAgICAgY29udGludWU7Ci0KLSAgICB1aW50OF90KiBzcmNfc2NhbiA9IHNyY19idWYgKyByb3cgKiBzcmNfcGl0Y2ggKyAoc3RhcnRfY29sIC0gbGVmdCkgKiAzOwotICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbiA9IGRlc3RfYnVmICsgZGVzdF9yb3cgKiBkZXN0X3BpdGNoICsgc3RhcnRfY29sICogQnBwOwotICAgIGlmIChiQkdSU3RyaXBlKSB7Ci0gICAgICBpZiAoeF9zdWJwaXhlbCA9PSAwKSB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbDsgY29sIDwgZW5kX2NvbDsgY29sKyspIHsKLSAgICAgICAgICBpZiAoaGFzX2FscGhhKSB7Ci0gICAgICAgICAgICBNZXJnZShzcmNfc2NhblsyXSwgciwgYSwgJmRlc3Rfc2NhblsyXSk7Ci0gICAgICAgICAgICBNZXJnZShzcmNfc2NhblsxXSwgZywgYSwgJmRlc3Rfc2NhblsxXSk7Ci0gICAgICAgICAgICBNZXJnZShzcmNfc2NhblswXSwgYiwgYSwgJmRlc3Rfc2NhblswXSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE1lcmdlR2FtbWFBZGp1c3RCZ3IoJnNyY19zY2FuWzBdLCByLCBnLCBiLCBhLCAmZGVzdF9zY2FuWzBdKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcFNldEFscGhhKGRlc3Rfc2Nhbik7Ci0gICAgICAgICAgTmV4dFBpeGVsKCZzcmNfc2NhbiwgJmRlc3Rfc2NhbiwgQnBwKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmICh4X3N1YnBpeGVsID09IDEpIHsKLSAgICAgICAgTWVyZ2VHYW1tYUFkanVzdChzcmNfc2NhblsxXSwgciwgYSwgJmRlc3Rfc2NhblsyXSk7Ci0gICAgICAgIE1lcmdlR2FtbWFBZGp1c3Qoc3JjX3NjYW5bMF0sIGcsIGEsICZkZXN0X3NjYW5bMV0pOwotICAgICAgICBpZiAoc3RhcnRfY29sID4gbGVmdCkKLSAgICAgICAgICBNZXJnZUdhbW1hQWRqdXN0KHNyY19zY2FuWy0xXSwgYiwgYSwgJmRlc3Rfc2NhblswXSk7Ci0gICAgICAgIHBTZXRBbHBoYShkZXN0X3NjYW4pOwotICAgICAgICBOZXh0UGl4ZWwoJnNyY19zY2FuLCAmZGVzdF9zY2FuLCBCcHApOwotICAgICAgICBmb3IgKGludCBjb2wgPSBzdGFydF9jb2wgKyAxOyBjb2wgPCBlbmRfY29sIC0gMTsgY29sKyspIHsKLSAgICAgICAgICBNZXJnZUdhbW1hQWRqdXN0QmdyKCZzcmNfc2NhblstMV0sIHIsIGcsIGIsIGEsICZkZXN0X3NjYW5bMF0pOwotICAgICAgICAgIHBTZXRBbHBoYShkZXN0X3NjYW4pOwotICAgICAgICAgIE5leHRQaXhlbCgmc3JjX3NjYW4sICZkZXN0X3NjYW4sIEJwcCk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIE1lcmdlR2FtbWFBZGp1c3Qoc3JjX3NjYW5bMF0sIHIsIGEsICZkZXN0X3NjYW5bMl0pOwotICAgICAgICBpZiAoc3RhcnRfY29sID4gbGVmdCkgewotICAgICAgICAgIE1lcmdlR2FtbWFBZGp1c3Qoc3JjX3NjYW5bLTFdLCBnLCBhLCAmZGVzdF9zY2FuWzFdKTsKLSAgICAgICAgICBNZXJnZUdhbW1hQWRqdXN0KHNyY19zY2FuWy0yXSwgYiwgYSwgJmRlc3Rfc2NhblswXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcFNldEFscGhhKGRlc3Rfc2Nhbik7Ci0gICAgICAgIE5leHRQaXhlbCgmc3JjX3NjYW4sICZkZXN0X3NjYW4sIEJwcCk7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbCArIDE7IGNvbCA8IGVuZF9jb2wgLSAxOyBjb2wrKykgewotICAgICAgICAgIE1lcmdlR2FtbWFBZGp1c3RCZ3IoJnNyY19zY2FuWy0yXSwgciwgZywgYiwgYSwgJmRlc3Rfc2NhblswXSk7Ci0gICAgICAgICAgcFNldEFscGhhKGRlc3Rfc2Nhbik7Ci0gICAgICAgICAgTmV4dFBpeGVsKCZzcmNfc2NhbiwgJmRlc3Rfc2NhbiwgQnBwKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoeF9zdWJwaXhlbCA9PSAwKSB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IHN0YXJ0X2NvbDsgY29sIDwgZW5kX2NvbDsgY29sKyspIHsKLSAgICAgICAgICBpZiAoYk5vcm1hbCkgewotICAgICAgICAgICAgaW50IHNyY192YWx1ZSA9IEF2ZXJhZ2VSZ2IoJnNyY19zY2FuWzBdKTsKLSAgICAgICAgICAgIHBOb3JtYWxpemVEc3RGdW5jKHNyY192YWx1ZSwgciwgZywgYiwgYSwgZGVzdF9zY2FuKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTWVyZ2VHYW1tYUFkanVzdFJnYigmc3JjX3NjYW5bMF0sIHIsIGcsIGIsIGEsICZkZXN0X3NjYW5bMF0pOwotICAgICAgICAgICAgcFNldEFscGhhKGRlc3Rfc2Nhbik7Ci0gICAgICAgICAgfQotICAgICAgICAgIE5leHRQaXhlbCgmc3JjX3NjYW4sICZkZXN0X3NjYW4sIEJwcCk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoeF9zdWJwaXhlbCA9PSAxKSB7Ci0gICAgICAgIGlmIChiTm9ybWFsKSB7Ci0gICAgICAgICAgaW50IHNyY192YWx1ZSA9IHN0YXJ0X2NvbCA+IGxlZnQgPyBBdmVyYWdlUmdiKCZzcmNfc2NhblstMV0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoc3JjX3NjYW5bMF0gKyBzcmNfc2NhblsxXSkgLyAzOwotICAgICAgICAgIHBOb3JtYWxpemVTcmNGdW5jKHNyY192YWx1ZSwgciwgZywgYiwgYSwgZGVzdF9zY2FuKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoc3RhcnRfY29sID4gbGVmdCkKLSAgICAgICAgICAgIE1lcmdlR2FtbWFBZGp1c3Qoc3JjX3NjYW5bLTFdLCByLCBhLCAmZGVzdF9zY2FuWzJdKTsKLSAgICAgICAgICBNZXJnZUdhbW1hQWRqdXN0KHNyY19zY2FuWzBdLCBnLCBhLCAmZGVzdF9zY2FuWzFdKTsKLSAgICAgICAgICBNZXJnZUdhbW1hQWRqdXN0KHNyY19zY2FuWzFdLCBiLCBhLCAmZGVzdF9zY2FuWzBdKTsKLSAgICAgICAgICBwU2V0QWxwaGEoZGVzdF9zY2FuKTsKLSAgICAgICAgfQotICAgICAgICBOZXh0UGl4ZWwoJnNyY19zY2FuLCAmZGVzdF9zY2FuLCBCcHApOwotICAgICAgICBmb3IgKGludCBjb2wgPSBzdGFydF9jb2wgKyAxOyBjb2wgPCBlbmRfY29sOyBjb2wrKykgewotICAgICAgICAgIGlmIChiTm9ybWFsKSB7Ci0gICAgICAgICAgICBpbnQgc3JjX3ZhbHVlID0gQXZlcmFnZVJnYigmc3JjX3NjYW5bLTFdKTsKLSAgICAgICAgICAgIHBOb3JtYWxpemVEc3RGdW5jKHNyY192YWx1ZSwgciwgZywgYiwgYSwgZGVzdF9zY2FuKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTWVyZ2VHYW1tYUFkanVzdFJnYigmc3JjX3NjYW5bLTFdLCByLCBnLCBiLCBhLCAmZGVzdF9zY2FuWzBdKTsKLSAgICAgICAgICAgIHBTZXRBbHBoYShkZXN0X3NjYW4pOwotICAgICAgICAgIH0KLSAgICAgICAgICBOZXh0UGl4ZWwoJnNyY19zY2FuLCAmZGVzdF9zY2FuLCBCcHApOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoYk5vcm1hbCkgewotICAgICAgICAgIGludCBzcmNfdmFsdWUgPQotICAgICAgICAgICAgICBzdGFydF9jb2wgPiBsZWZ0ID8gQXZlcmFnZVJnYigmc3JjX3NjYW5bLTJdKSA6IHNyY19zY2FuWzBdIC8gMzsKLSAgICAgICAgICBwTm9ybWFsaXplU3JjRnVuYyhzcmNfdmFsdWUsIHIsIGcsIGIsIGEsIGRlc3Rfc2Nhbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKHN0YXJ0X2NvbCA+IGxlZnQpIHsKLSAgICAgICAgICAgIE1lcmdlR2FtbWFBZGp1c3Qoc3JjX3NjYW5bLTJdLCByLCBhLCAmZGVzdF9zY2FuWzJdKTsKLSAgICAgICAgICAgIE1lcmdlR2FtbWFBZGp1c3Qoc3JjX3NjYW5bLTFdLCBnLCBhLCAmZGVzdF9zY2FuWzFdKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgTWVyZ2VHYW1tYUFkanVzdChzcmNfc2NhblswXSwgYiwgYSwgJmRlc3Rfc2NhblswXSk7Ci0gICAgICAgICAgcFNldEFscGhhKGRlc3Rfc2Nhbik7Ci0gICAgICAgIH0KLSAgICAgICAgTmV4dFBpeGVsKCZzcmNfc2NhbiwgJmRlc3Rfc2NhbiwgQnBwKTsKLSAgICAgICAgZm9yIChpbnQgY29sID0gc3RhcnRfY29sICsgMTsgY29sIDwgZW5kX2NvbDsgY29sKyspIHsKLSAgICAgICAgICBpZiAoYk5vcm1hbCkgewotICAgICAgICAgICAgaW50IHNyY192YWx1ZSA9IEF2ZXJhZ2VSZ2IoJnNyY19zY2FuWy0yXSk7Ci0gICAgICAgICAgICBwTm9ybWFsaXplRHN0RnVuYyhzcmNfdmFsdWUsIHIsIGcsIGIsIGEsIGRlc3Rfc2Nhbik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE1lcmdlR2FtbWFBZGp1c3RSZ2IoJnNyY19zY2FuWy0yXSwgciwgZywgYiwgYSwgJmRlc3Rfc2NhblswXSk7Ci0gICAgICAgICAgICBwU2V0QWxwaGEoZGVzdF9zY2FuKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgTmV4dFBpeGVsKCZzcmNfc2NhbiwgJmRlc3Rfc2NhbiwgQnBwKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1ib29sIFNob3VsZERyYXdEZXZpY2VUZXh0KGNvbnN0IENGWF9Gb250KiBwRm9udCwgdWludDMyX3QgdGV4dF9mbGFncykgewotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gIGlmICh0ZXh0X2ZsYWdzICYgRlhGT05UX0NJREZPTlQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNvbnN0IENGWF9CeXRlU3RyaW5nIGJzUHNOYW1lID0gcEZvbnQtPkdldFBzTmFtZSgpOwotICBpZiAoYnNQc05hbWUuRmluZCgiK1pKSEwiKSAhPSAtMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJzUHNOYW1lID09ICJDTkFBSkkrY21leDEwIikKLSAgICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1GWFRFWFRfQ0hBUlBPUzo6RlhURVhUX0NIQVJQT1MoKQotICAgIDogbV9HbHlwaEluZGV4KDApLAotICAgICAgbV9Gb250Q2hhcldpZHRoKDApLAotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgICBtX0V4dEdJRCgwKSwKLSNlbmRpZgotICAgICAgbV9GYWxsYmFja0ZvbnRQb3NpdGlvbigwKSwKLSAgICAgIG1fYkdseXBoQWRqdXN0KGZhbHNlKSwKLSAgICAgIG1fYkZvbnRTdHlsZShmYWxzZSkgewotfQotCi1GWFRFWFRfQ0hBUlBPUzo6RlhURVhUX0NIQVJQT1MoY29uc3QgRlhURVhUX0NIQVJQT1MmKSA9IGRlZmF1bHQ7Ci0KLUZYVEVYVF9DSEFSUE9TOjp+RlhURVhUX0NIQVJQT1MoKXt9OwotCi1DRlhfUmVuZGVyRGV2aWNlOjpDRlhfUmVuZGVyRGV2aWNlKCkKLSAgICA6IG1fcEJpdG1hcChudWxscHRyKSwKLSAgICAgIG1fV2lkdGgoMCksCi0gICAgICBtX0hlaWdodCgwKSwKLSAgICAgIG1fYnBwKDApLAotICAgICAgbV9SZW5kZXJDYXBzKDApLAotICAgICAgbV9EZXZpY2VDbGFzcygwKSB7fQotCi1DRlhfUmVuZGVyRGV2aWNlOjp+Q0ZYX1JlbmRlckRldmljZSgpIHsKLSNpZiBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfIHx8IGRlZmluZWQgX1NLSUFfU1VQUE9SVF9QQVRIU18KLSAgRmx1c2goKTsKLSNlbmRpZgotfQotCi0jaWYgZGVmaW5lZCBfU0tJQV9TVVBQT1JUXyB8fCBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfUEFUSFNfCi12b2lkIENGWF9SZW5kZXJEZXZpY2U6OkZsdXNoKCkgewotICBtX3BEZXZpY2VEcml2ZXIucmVzZXQoKTsKLX0KLSNlbmRpZgotCi12b2lkIENGWF9SZW5kZXJEZXZpY2U6OlNldERldmljZURyaXZlcigKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8SUZYX1JlbmRlckRldmljZURyaXZlcj4gcERyaXZlcikgewotICBtX3BEZXZpY2VEcml2ZXIgPSBzdGQ6Om1vdmUocERyaXZlcik7Ci0gIEluaXREZXZpY2VJbmZvKCk7Ci19Ci0KLXZvaWQgQ0ZYX1JlbmRlckRldmljZTo6SW5pdERldmljZUluZm8oKSB7Ci0gIG1fV2lkdGggPSBtX3BEZXZpY2VEcml2ZXItPkdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCk7Ci0gIG1fSGVpZ2h0ID0gbV9wRGV2aWNlRHJpdmVyLT5HZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKTsKLSAgbV9icHAgPSBtX3BEZXZpY2VEcml2ZXItPkdldERldmljZUNhcHMoRlhEQ19CSVRTX1BJWEVMKTsKLSAgbV9SZW5kZXJDYXBzID0gbV9wRGV2aWNlRHJpdmVyLT5HZXREZXZpY2VDYXBzKEZYRENfUkVOREVSX0NBUFMpOwotICBtX0RldmljZUNsYXNzID0gbV9wRGV2aWNlRHJpdmVyLT5HZXREZXZpY2VDYXBzKEZYRENfREVWSUNFX0NMQVNTKTsKLSAgaWYgKCFtX3BEZXZpY2VEcml2ZXItPkdldENsaXBCb3goJm1fQ2xpcEJveCkpIHsKLSAgICBtX0NsaXBCb3gubGVmdCA9IDA7Ci0gICAgbV9DbGlwQm94LnRvcCA9IDA7Ci0gICAgbV9DbGlwQm94LnJpZ2h0ID0gbV9XaWR0aDsKLSAgICBtX0NsaXBCb3guYm90dG9tID0gbV9IZWlnaHQ7Ci0gIH0KLX0KLQotdm9pZCBDRlhfUmVuZGVyRGV2aWNlOjpTYXZlU3RhdGUoKSB7Ci0gIG1fcERldmljZURyaXZlci0+U2F2ZVN0YXRlKCk7Ci19Ci0KLXZvaWQgQ0ZYX1JlbmRlckRldmljZTo6UmVzdG9yZVN0YXRlKGJvb2wgYktlZXBTYXZlZCkgewotICBtX3BEZXZpY2VEcml2ZXItPlJlc3RvcmVTdGF0ZShiS2VlcFNhdmVkKTsKLSAgVXBkYXRlQ2xpcEJveCgpOwotfQotCi1pbnQgQ0ZYX1JlbmRlckRldmljZTo6R2V0RGV2aWNlQ2FwcyhpbnQgY2Fwc19pZCkgY29uc3QgewotICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5HZXREZXZpY2VDYXBzKGNhcHNfaWQpOwotfQotQ0ZYX01hdHJpeCBDRlhfUmVuZGVyRGV2aWNlOjpHZXRDVE0oKSBjb25zdCB7Ci0gIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPkdldENUTSgpOwotfQotCi1ib29sIENGWF9SZW5kZXJEZXZpY2U6OkNyZWF0ZUNvbXBhdGlibGVCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwRElCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KSBjb25zdCB7Ci0gIGlmIChtX1JlbmRlckNhcHMgJiBGWFJDX0NNWUtfT1VUUFVUKSB7Ci0gICAgcmV0dXJuIHBESUItPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBtX1JlbmRlckNhcHMgJiBGWFJDX0FMUEhBX09VVFBVVAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gRlhESUJfQ215a2EKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZYRElCX0NteWspOwotICB9Ci0gIGlmIChtX1JlbmRlckNhcHMgJiBGWFJDX0JZVEVNQVNLX09VVFBVVCkKLSAgICByZXR1cm4gcERJQi0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCXzhicHBNYXNrKTsKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXyB8fCBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfUEFUSFNfCi0gIHJldHVybiBwRElCLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgbV9SZW5kZXJDYXBzICYgRlhSQ19BTFBIQV9PVVRQVVQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBGWERJQl9BcmdiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhESUJfUmdiMzIpOwotI2Vsc2UKLSAgcmV0dXJuIHBESUItPkNyZWF0ZSgKLSAgICAgIHdpZHRoLCBoZWlnaHQsIG1fUmVuZGVyQ2FwcyAmIEZYUkNfQUxQSEFfT1VUUFVUID8gRlhESUJfQXJnYiA6IEZYRElCX1JnYik7Ci0jZW5kaWYKLX0KLQotYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUpIHsKLSAgaWYgKCFtX3BEZXZpY2VEcml2ZXItPlNldENsaXBfUGF0aEZpbGwocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9tb2RlKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBVcGRhdGVDbGlwQm94KCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENGWF9SZW5kZXJEZXZpY2U6OlNldENsaXBfUGF0aFN0cm9rZSgKLSAgICBjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICBjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlKSB7Ci0gIGlmICghbV9wRGV2aWNlRHJpdmVyLT5TZXRDbGlwX1BhdGhTdHJva2UocFBhdGhEYXRhLCBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwR3JhcGhTdGF0ZSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgVXBkYXRlQ2xpcEJveCgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRDbGlwX1JlY3QoY29uc3QgRlhfUkVDVCYgcmVjdCkgewotICBDRlhfUGF0aERhdGEgcGF0aDsKLSAgcGF0aC5BcHBlbmRSZWN0KHJlY3QubGVmdCwgcmVjdC5ib3R0b20sIHJlY3QucmlnaHQsIHJlY3QudG9wKTsKLSAgaWYgKCFTZXRDbGlwX1BhdGhGaWxsKCZwYXRoLCBudWxscHRyLCBGWEZJTExfV0lORElORykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIFVwZGF0ZUNsaXBCb3goKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ0ZYX1JlbmRlckRldmljZTo6VXBkYXRlQ2xpcEJveCgpIHsKLSAgaWYgKG1fcERldmljZURyaXZlci0+R2V0Q2xpcEJveCgmbV9DbGlwQm94KSkKLSAgICByZXR1cm47Ci0gIG1fQ2xpcEJveC5sZWZ0ID0gMDsKLSAgbV9DbGlwQm94LnRvcCA9IDA7Ci0gIG1fQ2xpcEJveC5yaWdodCA9IG1fV2lkdGg7Ci0gIG1fQ2xpcEJveC5ib3R0b20gPSBtX0hlaWdodDsKLX0KLQotYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpEcmF3UGF0aFdpdGhCbGVuZChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpbGxfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cm9rZV9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKLSAgdWludDhfdCBzdHJva2VfYWxwaGEgPSBwR3JhcGhTdGF0ZSA/IEZYQVJHQl9BKHN0cm9rZV9jb2xvcikgOiAwOwotICB1aW50OF90IGZpbGxfYWxwaGEgPSAoZmlsbF9tb2RlICYgMykgPyBGWEFSR0JfQShmaWxsX2NvbG9yKSA6IDA7Ci0gIGNvbnN0IHN0ZDo6dmVjdG9yPEZYX1BBVEhQT0lOVD4mIHBQb2ludHMgPSBwUGF0aERhdGEtPkdldFBvaW50cygpOwotICBpZiAoc3Ryb2tlX2FscGhhID09IDAgJiYgcFBvaW50cy5zaXplKCkgPT0gMikgewotICAgIENGWF9Qb2ludEYgcG9zMSA9IHBQb2ludHNbMF0ubV9Qb2ludDsKLSAgICBDRlhfUG9pbnRGIHBvczIgPSBwUG9pbnRzWzFdLm1fUG9pbnQ7Ci0gICAgaWYgKHBPYmplY3QyRGV2aWNlKSB7Ci0gICAgICBwb3MxID0gcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybShwb3MxKTsKLSAgICAgIHBvczIgPSBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtKHBvczIpOwotICAgIH0KLSAgICBEcmF3Q29zbWV0aWNMaW5lKHBvczEueCwgcG9zMS55LCBwb3MyLngsIHBvczIueSwgZmlsbF9jb2xvciwgZmlsbF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgYmxlbmRfdHlwZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBpZiAoKHBQb2ludHMuc2l6ZSgpID09IDUgfHwgcFBvaW50cy5zaXplKCkgPT0gNCkgJiYgc3Ryb2tlX2FscGhhID09IDApIHsKLSAgICBDRlhfRmxvYXRSZWN0IHJlY3RfZjsKLSAgICBpZiAoIShmaWxsX21vZGUgJiBGWEZJTExfUkVDVF9BQSkgJiYKLSAgICAgICAgcFBhdGhEYXRhLT5Jc1JlY3QocE9iamVjdDJEZXZpY2UsICZyZWN0X2YpKSB7Ci0gICAgICBGWF9SRUNUIHJlY3RfaSA9IHJlY3RfZi5HZXRPdXRlclJlY3QoKTsKLQotICAgICAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0b3AvYm90dG9tLCBsZWZ0L3JpZ2h0IHZhbHVlcyBvZiB0aGUgcmVjdCBpdCdzCi0gICAgICAvLyBwb3NzaWJsZSB0byBvdmVyZmxvdyB0aGUgV2lkdGgoKSBhbmQgSGVpZ2h0KCkgY2FsY3VsYXRpb25zLiBDaGVjayB0aGF0Ci0gICAgICAvLyB0aGUgcmVjdCB3aWxsIGhhdmUgdmFsaWQgZGltZW5zaW9uIGJlZm9yZSBjb250aW51aW5nLgotICAgICAgaWYgKCFyZWN0X2kuVmFsaWQoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICBpbnQgd2lkdGggPSAoaW50KUZYU1lTX2NlaWwocmVjdF9mLnJpZ2h0IC0gcmVjdF9mLmxlZnQpOwotICAgICAgaWYgKHdpZHRoIDwgMSkgewotICAgICAgICB3aWR0aCA9IDE7Ci0gICAgICAgIGlmIChyZWN0X2kubGVmdCA9PSByZWN0X2kucmlnaHQpCi0gICAgICAgICAgcmVjdF9pLnJpZ2h0Kys7Ci0gICAgICB9Ci0gICAgICBpbnQgaGVpZ2h0ID0gKGludClGWFNZU19jZWlsKHJlY3RfZi50b3AgLSByZWN0X2YuYm90dG9tKTsKLSAgICAgIGlmIChoZWlnaHQgPCAxKSB7Ci0gICAgICAgIGhlaWdodCA9IDE7Ci0gICAgICAgIGlmIChyZWN0X2kuYm90dG9tID09IHJlY3RfaS50b3ApCi0gICAgICAgICAgcmVjdF9pLmJvdHRvbSsrOwotICAgICAgfQotICAgICAgaWYgKHJlY3RfaS5XaWR0aCgpID49IHdpZHRoICsgMSkgewotICAgICAgICBpZiAocmVjdF9mLmxlZnQgLSAoRlhfRkxPQVQpKHJlY3RfaS5sZWZ0KSA+Ci0gICAgICAgICAgICAoRlhfRkxPQVQpKHJlY3RfaS5yaWdodCkgLSByZWN0X2YucmlnaHQpIHsKLSAgICAgICAgICByZWN0X2kubGVmdCsrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJlY3RfaS5yaWdodC0tOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAocmVjdF9pLkhlaWdodCgpID49IGhlaWdodCArIDEpIHsKLSAgICAgICAgaWYgKHJlY3RfZi50b3AgLSAoRlhfRkxPQVQpKHJlY3RfaS50b3ApID4KLSAgICAgICAgICAgIChGWF9GTE9BVCkocmVjdF9pLmJvdHRvbSkgLSByZWN0X2YuYm90dG9tKSB7Ci0gICAgICAgICAgcmVjdF9pLnRvcCsrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJlY3RfaS5ib3R0b20tLTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKEZpbGxSZWN0V2l0aEJsZW5kKCZyZWN0X2ksIGZpbGxfY29sb3IsIGJsZW5kX3R5cGUpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgaWYgKChmaWxsX21vZGUgJiAzKSAmJiBzdHJva2VfYWxwaGEgPT0gMCAmJiAhKGZpbGxfbW9kZSAmIEZYX0ZJTExfU1RST0tFKSAmJgotICAgICAgIShmaWxsX21vZGUgJiBGWF9GSUxMX1RFWFRfTU9ERSkpIHsKLSAgICBDRlhfUGF0aERhdGEgbmV3UGF0aDsKLSAgICBib29sIGJUaGluID0gZmFsc2U7Ci0gICAgYm9vbCBzZXRJZGVudGl0eSA9IGZhbHNlOwotICAgIGlmIChwUGF0aERhdGEtPkdldFplcm9BcmVhUGF0aChwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgISFtX3BEZXZpY2VEcml2ZXItPkdldERyaXZlclR5cGUoKSwgJm5ld1BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiVGhpbiwgJnNldElkZW50aXR5KSkgewotICAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdyYXBoU3RhdGU7Ci0gICAgICBncmFwaFN0YXRlLm1fTGluZVdpZHRoID0gMC4wZjsKLQotICAgICAgdWludDMyX3Qgc3Ryb2tlY29sb3IgPSBmaWxsX2NvbG9yOwotICAgICAgaWYgKGJUaGluKQotICAgICAgICBzdHJva2Vjb2xvciA9ICgoKGZpbGxfYWxwaGEgPj4gMikgPDwgMjQpIHwgKHN0cm9rZWNvbG9yICYgMHgwMGZmZmZmZikpOwotCi0gICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gbnVsbHB0cjsKLSAgICAgIGlmIChwT2JqZWN0MkRldmljZSAmJiAhcE9iamVjdDJEZXZpY2UtPklzSWRlbnRpdHkoKSAmJiAhc2V0SWRlbnRpdHkpCi0gICAgICAgIHBNYXRyaXggPSBwT2JqZWN0MkRldmljZTsKLQotICAgICAgaW50IHNtb290aF9wYXRoID0gRlhfWkVST0FSRUFfRklMTDsKLSAgICAgIGlmIChmaWxsX21vZGUgJiBGWEZJTExfTk9QQVRIU01PT1RIKQotICAgICAgICBzbW9vdGhfcGF0aCB8PSBGWEZJTExfTk9QQVRIU01PT1RIOwotCi0gICAgICBtX3BEZXZpY2VEcml2ZXItPkRyYXdQYXRoKCZuZXdQYXRoLCBwTWF0cml4LCAmZ3JhcGhTdGF0ZSwgMCwgc3Ryb2tlY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtb290aF9wYXRoLCBibGVuZF90eXBlKTsKLSAgICB9Ci0gIH0KLSAgaWYgKChmaWxsX21vZGUgJiAzKSAmJiBmaWxsX2FscGhhICYmIHN0cm9rZV9hbHBoYSA8IDB4ZmYgJiYKLSAgICAgIChmaWxsX21vZGUgJiBGWF9GSUxMX1NUUk9LRSkpIHsKLSAgICBpZiAobV9SZW5kZXJDYXBzICYgRlhSQ19GSUxMU1RST0tFX1BBVEgpIHsKLSAgICAgIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPkRyYXdQYXRoKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UsIHBHcmFwaFN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9jb2xvciwgc3Ryb2tlX2NvbG9yLCBmaWxsX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZF90eXBlKTsKLSAgICB9Ci0gICAgcmV0dXJuIERyYXdGaWxsU3Ryb2tlUGF0aChwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLCBwR3JhcGhTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfY29sb3IsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlLCBibGVuZF90eXBlKTsKLSAgfQotICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5EcmF3UGF0aChwUGF0aERhdGEsIHBPYmplY3QyRGV2aWNlLCBwR3JhcGhTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9jb2xvciwgc3Ryb2tlX2NvbG9yLCBmaWxsX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kX3R5cGUpOwotfQotCi0vLyBUaGlzIGNhbiBiZSByZW1vdmVkIG9uY2UgUERGaXVtIGVudGlyZWx5IHJlbGllcyBvbiBTa2lhCi1ib29sIENGWF9SZW5kZXJEZXZpY2U6OkRyYXdGaWxsU3Ryb2tlUGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpbGxfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJva2VfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKLSAgaWYgKCEobV9SZW5kZXJDYXBzICYgRlhSQ19HRVRfQklUUykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBDRlhfRmxvYXRSZWN0IGJib3g7Ci0gIGlmIChwR3JhcGhTdGF0ZSkgewotICAgIGJib3ggPSBwUGF0aERhdGEtPkdldEJvdW5kaW5nQm94KHBHcmFwaFN0YXRlLT5tX0xpbmVXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwR3JhcGhTdGF0ZS0+bV9NaXRlckxpbWl0KTsKLSAgfSBlbHNlIHsKLSAgICBiYm94ID0gcFBhdGhEYXRhLT5HZXRCb3VuZGluZ0JveCgpOwotICB9Ci0gIGlmIChwT2JqZWN0MkRldmljZSkKLSAgICBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtUmVjdChiYm94KTsKLQotICBDRlhfTWF0cml4IGN0bSA9IEdldENUTSgpOwotICBGWF9GTE9BVCBmU2NhbGVYID0gRlhTWVNfZmFicyhjdG0uYSk7Ci0gIEZYX0ZMT0FUIGZTY2FsZVkgPSBGWFNZU19mYWJzKGN0bS5kKTsKLSAgRlhfUkVDVCByZWN0ID0gYmJveC5HZXRPdXRlclJlY3QoKTsKLSAgQ0ZYX0RJQml0bWFwIGJpdG1hcCwgQmFja2Ryb3A7Ci0gIGlmICghQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcCgmYml0bWFwLCBGWFNZU19yb3VuZChyZWN0LldpZHRoKCkgKiBmU2NhbGVYKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHJlY3QuSGVpZ2h0KCkgKiBmU2NhbGVZKSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKGJpdG1hcC5IYXNBbHBoYSgpKSB7Ci0gICAgYml0bWFwLkNsZWFyKDApOwotICAgIEJhY2tkcm9wLkNvcHkoJmJpdG1hcCk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKCFtX3BEZXZpY2VEcml2ZXItPkdldERJQml0cygmYml0bWFwLCByZWN0LmxlZnQsIHJlY3QudG9wKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBCYWNrZHJvcC5Db3B5KCZiaXRtYXApOwotICB9Ci0gIENGWF9GeGdlRGV2aWNlIGJpdG1hcF9kZXZpY2U7Ci0gIGJpdG1hcF9kZXZpY2UuQXR0YWNoKCZiaXRtYXAsIGZhbHNlLCAmQmFja2Ryb3AsIHRydWUpOwotICBDRlhfTWF0cml4IG1hdHJpeDsKLSAgaWYgKHBPYmplY3QyRGV2aWNlKQotICAgIG1hdHJpeCA9ICpwT2JqZWN0MkRldmljZTsKLSAgbWF0cml4LlRyYW5zbGF0ZSgtcmVjdC5sZWZ0LCAtcmVjdC50b3ApOwotICBtYXRyaXguQ29uY2F0KENGWF9NYXRyaXgoZlNjYWxlWCwgMCwgMCwgZlNjYWxlWSwgMCwgMCkpOwotICBpZiAoIWJpdG1hcF9kZXZpY2UuR2V0RGV2aWNlRHJpdmVyKCktPkRyYXdQYXRoKAotICAgICAgICAgIHBQYXRoRGF0YSwgJm1hdHJpeCwgcEdyYXBoU3RhdGUsIGZpbGxfY29sb3IsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlLAotICAgICAgICAgIGJsZW5kX3R5cGUpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0jaWYgZGVmaW5lZCBfU0tJQV9TVVBQT1JUXyB8fCBkZWZpbmVkIF9TS0lBX1NVUFBPUlRfUEFUSFNfCi0gIGJpdG1hcF9kZXZpY2UuR2V0RGV2aWNlRHJpdmVyKCktPkZsdXNoKCk7Ci0jZW5kaWYKLSAgRlhfUkVDVCBzcmNfcmVjdCgwLCAwLCBGWFNZU19yb3VuZChyZWN0LldpZHRoKCkgKiBmU2NhbGVYKSwKLSAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyZWN0LkhlaWdodCgpICogZlNjYWxlWSkpOwotICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TZXRESUJpdHMoJmJpdG1hcCwgMCwgJnNyY19yZWN0LCByZWN0LmxlZnQsIHJlY3QudG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfQkxFTkRfTk9STUFMKTsKLX0KLQotYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRQaXhlbChpbnQgeCwgaW50IHksIHVpbnQzMl90IGNvbG9yKSB7Ci0gIGlmIChtX3BEZXZpY2VEcml2ZXItPlNldFBpeGVsKHgsIHksIGNvbG9yKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBGWF9SRUNUIHJlY3QoeCwgeSwgeCArIDEsIHkgKyAxKTsKLSAgcmV0dXJuIEZpbGxSZWN0V2l0aEJsZW5kKCZyZWN0LCBjb2xvciwgRlhESUJfQkxFTkRfTk9STUFMKTsKLX0KLQotYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpGaWxsUmVjdFdpdGhCbGVuZChjb25zdCBGWF9SRUNUKiBwUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlsbF9jb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKLSAgaWYgKG1fcERldmljZURyaXZlci0+RmlsbFJlY3RXaXRoQmxlbmQocFJlY3QsIGZpbGxfY29sb3IsIGJsZW5kX3R5cGUpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICghKG1fUmVuZGVyQ2FwcyAmIEZYUkNfR0VUX0JJVFMpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDRlhfRElCaXRtYXAgYml0bWFwOwotICBpZiAoIUNyZWF0ZUNvbXBhdGlibGVCaXRtYXAoJmJpdG1hcCwgcFJlY3QtPldpZHRoKCksIHBSZWN0LT5IZWlnaHQoKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghbV9wRGV2aWNlRHJpdmVyLT5HZXRESUJpdHMoJmJpdG1hcCwgcFJlY3QtPmxlZnQsIHBSZWN0LT50b3ApKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoIWJpdG1hcC5Db21wb3NpdGVSZWN0KDAsIDAsIHBSZWN0LT5XaWR0aCgpLCBwUmVjdC0+SGVpZ2h0KCksIGZpbGxfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbnVsbHB0cikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRlhfUkVDVCBzcmNfcmVjdCgwLCAwLCBwUmVjdC0+V2lkdGgoKSwgcFJlY3QtPkhlaWdodCgpKTsKLSAgbV9wRGV2aWNlRHJpdmVyLT5TZXRESUJpdHMoJmJpdG1hcCwgMCwgJnNyY19yZWN0LCBwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfQkxFTkRfTk9STUFMKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0ZYX1JlbmRlckRldmljZTo6RHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7Ci0gIGlmICgoY29sb3IgPj0gMHhmZjAwMDAwMCkgJiYKLSAgICAgIG1fcERldmljZURyaXZlci0+RHJhd0Nvc21ldGljTGluZSh4MSwgeTEsIHgyLCB5MiwgY29sb3IsIGJsZW5kX3R5cGUpKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdyYXBoX3N0YXRlOwotICBDRlhfUGF0aERhdGEgcGF0aDsKLSAgcGF0aC5BcHBlbmRQb2ludChDRlhfUG9pbnRGKHgxLCB5MSksIEZYUFRfVFlQRTo6TW92ZVRvLCBmYWxzZSk7Ci0gIHBhdGguQXBwZW5kUG9pbnQoQ0ZYX1BvaW50Rih4MiwgeTIpLCBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOwotICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5EcmF3UGF0aCgmcGF0aCwgbnVsbHB0ciwgJmdyYXBoX3N0YXRlLCAwLCBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9tb2RlLCBibGVuZF90eXBlKTsKLX0KLQotYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCkgewotICBpZiAoIShtX1JlbmRlckNhcHMgJiBGWFJDX0dFVF9CSVRTKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPkdldERJQml0cyhwQml0bWFwLCBsZWZ0LCB0b3ApOwotfQotCi1DRlhfRElCaXRtYXAqIENGWF9SZW5kZXJEZXZpY2U6OkdldEJhY2tEcm9wKCkgewotICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5HZXRCYWNrRHJvcCgpOwotfQotCi1ib29sIENGWF9SZW5kZXJEZXZpY2U6OlNldERJQml0c1dpdGhCbGVuZChjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX21vZGUpIHsKLSAgQVNTRVJUKCFwQml0bWFwLT5Jc0FscGhhTWFzaygpKTsKLSAgQ0ZYX01hdHJpeCBjdG0gPSBHZXRDVE0oKTsKLSAgRlhfRkxPQVQgZlNjYWxlWCA9IEZYU1lTX2ZhYnMoY3RtLmEpOwotICBGWF9GTE9BVCBmU2NhbGVZID0gRlhTWVNfZmFicyhjdG0uZCk7Ci0gIEZYX1JFQ1QgZGVzdF9yZWN0KGxlZnQsIHRvcCwKLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQobGVmdCArIHBCaXRtYXAtPkdldFdpZHRoKCkgLyBmU2NhbGVYKSwKLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQodG9wICsgcEJpdG1hcC0+R2V0SGVpZ2h0KCkgLyBmU2NhbGVZKSk7Ci0gIGRlc3RfcmVjdC5JbnRlcnNlY3QobV9DbGlwQm94KTsKLSAgaWYgKGRlc3RfcmVjdC5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIEZYX1JFQ1Qgc3JjX3JlY3QoZGVzdF9yZWN0LmxlZnQgLSBsZWZ0LCBkZXN0X3JlY3QudG9wIC0gdG9wLAotICAgICAgICAgICAgICAgICAgIGRlc3RfcmVjdC5sZWZ0IC0gbGVmdCArIGRlc3RfcmVjdC5XaWR0aCgpLAotICAgICAgICAgICAgICAgICAgIGRlc3RfcmVjdC50b3AgLSB0b3AgKyBkZXN0X3JlY3QuSGVpZ2h0KCkpOwotICBzcmNfcmVjdC5sZWZ0ID0gRlhTWVNfcm91bmQoc3JjX3JlY3QubGVmdCAqIGZTY2FsZVgpOwotICBzcmNfcmVjdC50b3AgPSBGWFNZU19yb3VuZChzcmNfcmVjdC50b3AgKiBmU2NhbGVZKTsKLSAgc3JjX3JlY3QucmlnaHQgPSBGWFNZU19yb3VuZChzcmNfcmVjdC5yaWdodCAqIGZTY2FsZVgpOwotICBzcmNfcmVjdC5ib3R0b20gPSBGWFNZU19yb3VuZChzcmNfcmVjdC5ib3R0b20gKiBmU2NhbGVZKTsKLSAgaWYgKChibGVuZF9tb2RlICE9IEZYRElCX0JMRU5EX05PUk1BTCAmJiAhKG1fUmVuZGVyQ2FwcyAmIEZYUkNfQkxFTkRfTU9ERSkpIHx8Ci0gICAgICAocEJpdG1hcC0+SGFzQWxwaGEoKSAmJiAhKG1fUmVuZGVyQ2FwcyAmIEZYUkNfQUxQSEFfSU1BR0UpKSkgewotICAgIGlmICghKG1fUmVuZGVyQ2FwcyAmIEZYUkNfR0VUX0JJVFMpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGludCBiZ19waXhlbF93aWR0aCA9IEZYU1lTX3JvdW5kKGRlc3RfcmVjdC5XaWR0aCgpICogZlNjYWxlWCk7Ci0gICAgaW50IGJnX3BpeGVsX2hlaWdodCA9IEZYU1lTX3JvdW5kKGRlc3RfcmVjdC5IZWlnaHQoKSAqIGZTY2FsZVkpOwotICAgIENGWF9ESUJpdG1hcCBiYWNrZ3JvdW5kOwotICAgIGlmICghYmFja2dyb3VuZC5DcmVhdGUoCi0gICAgICAgICAgICBiZ19waXhlbF93aWR0aCwgYmdfcGl4ZWxfaGVpZ2h0LAotICAgICAgICAgICAgKG1fUmVuZGVyQ2FwcyAmIEZYUkNfQ01ZS19PVVRQVVQpID8gRlhESUJfQ215ayA6IEZYRElCX1JnYjMyKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIW1fcERldmljZURyaXZlci0+R2V0RElCaXRzKCZiYWNrZ3JvdW5kLCBkZXN0X3JlY3QubGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcmVjdC50b3ApKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICghYmFja2dyb3VuZC5Db21wb3NpdGVCaXRtYXAoMCwgMCwgYmdfcGl4ZWxfd2lkdGgsIGJnX3BpeGVsX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAsIHNyY19yZWN0LmxlZnQsIHNyY19yZWN0LnRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kX21vZGUsIG51bGxwdHIsIGZhbHNlLCBudWxscHRyKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBGWF9SRUNUIHJlY3QoMCwgMCwgYmdfcGl4ZWxfd2lkdGgsIGJnX3BpeGVsX2hlaWdodCk7Ci0gICAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U2V0RElCaXRzKCZiYWNrZ3JvdW5kLCAwLCAmcmVjdCwgZGVzdF9yZWN0LmxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcmVjdC50b3AsIEZYRElCX0JMRU5EX05PUk1BTCk7Ci0gIH0KLSAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U2V0RElCaXRzKHBCaXRtYXAsIDAsICZzcmNfcmVjdCwgZGVzdF9yZWN0LmxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3JlY3QudG9wLCBibGVuZF9tb2RlKTsKLX0KLQotYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTdHJldGNoRElCaXRzV2l0aEZsYWdzQW5kQmxlbmQoCi0gICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKLSAgICBpbnQgbGVmdCwKLSAgICBpbnQgdG9wLAotICAgIGludCBkZXN0X3dpZHRoLAotICAgIGludCBkZXN0X2hlaWdodCwKLSAgICB1aW50MzJfdCBmbGFncywKLSAgICBpbnQgYmxlbmRfbW9kZSkgewotICBGWF9SRUNUIGRlc3RfcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBkZXN0X3dpZHRoLCB0b3AgKyBkZXN0X2hlaWdodCk7Ci0gIEZYX1JFQ1QgY2xpcF9ib3ggPSBtX0NsaXBCb3g7Ci0gIGNsaXBfYm94LkludGVyc2VjdChkZXN0X3JlY3QpOwotICBpZiAoY2xpcF9ib3guSXNFbXB0eSgpKQotICAgIHJldHVybiB0cnVlOwotICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TdHJldGNoRElCaXRzKHBCaXRtYXAsIDAsIGxlZnQsIHRvcCwgZGVzdF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2hlaWdodCwgJmNsaXBfYm94LCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZF9tb2RlKTsKLX0KLQotYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTZXRCaXRNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmdiKSB7Ci0gIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgcEJpdG1hcC0+R2V0V2lkdGgoKSwgcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOwotICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TZXRESUJpdHMocEJpdG1hcCwgYXJnYiwgJnNyY19yZWN0LCBsZWZ0LCB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9CTEVORF9OT1JNQUwpOwotfQotCi1ib29sIENGWF9SZW5kZXJEZXZpY2U6OlN0cmV0Y2hCaXRNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvcikgewotICByZXR1cm4gU3RyZXRjaEJpdE1hc2tXaXRoRmxhZ3MocEJpdG1hcCwgbGVmdCwgdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLCAwKTsKLX0KLQotYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTdHJldGNoQml0TWFza1dpdGhGbGFncyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKLSAgRlhfUkVDVCBkZXN0X3JlY3QobGVmdCwgdG9wLCBsZWZ0ICsgZGVzdF93aWR0aCwgdG9wICsgZGVzdF9oZWlnaHQpOwotICBGWF9SRUNUIGNsaXBfYm94ID0gbV9DbGlwQm94OwotICBjbGlwX2JveC5JbnRlcnNlY3QoZGVzdF9yZWN0KTsKLSAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U3RyZXRjaERJQml0cyhwQml0bWFwLCBhcmdiLCBsZWZ0LCB0b3AsIGRlc3Rfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9oZWlnaHQsICZjbGlwX2JveCwgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfQkxFTkRfTk9STUFMKTsKLX0KLQotYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpTdGFydERJQml0c1dpdGhCbGVuZChjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX21vZGUpIHsKLSAgcmV0dXJuIG1fcERldmljZURyaXZlci0+U3RhcnRESUJpdHMocEJpdG1hcCwgYml0bWFwX2FscGhhLCBhcmdiLCBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgaGFuZGxlLCBibGVuZF9tb2RlKTsKLX0KLQotYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpDb250aW51ZURJQml0cyh2b2lkKiBoYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKSB7Ci0gIHJldHVybiBtX3BEZXZpY2VEcml2ZXItPkNvbnRpbnVlRElCaXRzKGhhbmRsZSwgcFBhdXNlKTsKLX0KLQotdm9pZCBDRlhfUmVuZGVyRGV2aWNlOjpDYW5jZWxESUJpdHModm9pZCogaGFuZGxlKSB7Ci0gIG1fcERldmljZURyaXZlci0+Q2FuY2VsRElCaXRzKGhhbmRsZSk7Ci19Ci0KLSNpZmRlZiBfU0tJQV9TVVBQT1JUXwotdm9pZCBDRlhfUmVuZGVyRGV2aWNlOjpEZWJ1Z1ZlcmlmeUJpdG1hcElzUHJlTXVsdGlwbGllZCgpIGNvbnN0IHsKLSAgU2tBU1NFUlQoMCk7Ci19Ci0KLWJvb2wgQ0ZYX1JlbmRlckRldmljZTo6U2V0Qml0c1dpdGhNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgewotICByZXR1cm4gbV9wRGV2aWNlRHJpdmVyLT5TZXRCaXRzV2l0aE1hc2socEJpdG1hcCwgcE1hc2ssIGxlZnQsIHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcF9hbHBoYSwgYmxlbmRfdHlwZSk7Ci19Ci0jZW5kaWYKLQotYm9vbCBDRlhfUmVuZGVyRGV2aWNlOjpEcmF3Tm9ybWFsVGV4dChpbnQgbkNoYXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwVGV4dDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpbGxfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRleHRfZmxhZ3MpIHsKLSAgaW50IG5hdGl2ZXRleHRfZmxhZ3MgPSB0ZXh0X2ZsYWdzOwotICBpZiAobV9EZXZpY2VDbGFzcyAhPSBGWERDX0RJU1BMQVkpIHsKLSAgICBpZiAoISh0ZXh0X2ZsYWdzICYgRlhURVhUX1BSSU5UR1JBUEhJQ1RFWFQpKSB7Ci0gICAgICBpZiAoU2hvdWxkRHJhd0RldmljZVRleHQocEZvbnQsIHRleHRfZmxhZ3MpICYmCi0gICAgICAgICAgbV9wRGV2aWNlRHJpdmVyLT5EcmF3RGV2aWNlVGV4dChuQ2hhcnMsIHBDaGFyUG9zLCBwRm9udCwgcFRleHQyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udF9zaXplLCBmaWxsX2NvbG9yKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKEZYQVJHQl9BKGZpbGxfY29sb3IpIDwgMjU1KQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgaWYgKCEodGV4dF9mbGFncyAmIEZYVEVYVF9OT19OQVRJVkVURVhUKSkgewotICAgIGlmIChTaG91bGREcmF3RGV2aWNlVGV4dChwRm9udCwgdGV4dF9mbGFncykgJiYKLSAgICAgICAgbV9wRGV2aWNlRHJpdmVyLT5EcmF3RGV2aWNlVGV4dChuQ2hhcnMsIHBDaGFyUG9zLCBwRm9udCwgcFRleHQyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRfc2l6ZSwgZmlsbF9jb2xvcikpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICBDRlhfTWF0cml4IGNoYXIyZGV2aWNlOwotICBDRlhfTWF0cml4IHRleHQyRGV2aWNlOwotICBpZiAocFRleHQyRGV2aWNlKSB7Ci0gICAgY2hhcjJkZXZpY2UgPSAqcFRleHQyRGV2aWNlOwotICAgIHRleHQyRGV2aWNlID0gKnBUZXh0MkRldmljZTsKLSAgfQotCi0gIGNoYXIyZGV2aWNlLlNjYWxlKGZvbnRfc2l6ZSwgLWZvbnRfc2l6ZSk7Ci0gIGlmIChGWFNZU19mYWJzKGNoYXIyZGV2aWNlLmEpICsgRlhTWVNfZmFicyhjaGFyMmRldmljZS5iKSA+IDUwICogMS4wZiB8fAotICAgICAgKChtX0RldmljZUNsYXNzID09IEZYRENfUFJJTlRFUikgJiYKLSAgICAgICAhKHRleHRfZmxhZ3MgJiBGWFRFWFRfUFJJTlRJTUFHRVRFWFQpKSkgewotICAgIGlmIChwRm9udC0+R2V0RmFjZSgpKSB7Ci0gICAgICBpbnQgblBhdGhGbGFncyA9Ci0gICAgICAgICAgKHRleHRfZmxhZ3MgJiBGWFRFWFRfTk9TTU9PVEgpID09IDAgPyAwIDogRlhGSUxMX05PUEFUSFNNT09USDsKLSAgICAgIHJldHVybiBEcmF3VGV4dFBhdGgobkNoYXJzLCBwQ2hhclBvcywgcEZvbnQsIGZvbnRfc2l6ZSwgcFRleHQyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBudWxscHRyLCBmaWxsX2NvbG9yLCAwLCBudWxscHRyLCBuUGF0aEZsYWdzKTsKLSAgICB9Ci0gIH0KLSAgaW50IGFudGlfYWxpYXMgPSBGWEZUX1JFTkRFUl9NT0RFX01PTk87Ci0gIGJvb2wgYk5vcm1hbCA9IGZhbHNlOwotICBpZiAoKHRleHRfZmxhZ3MgJiBGWFRFWFRfTk9TTU9PVEgpID09IDApIHsKLSAgICBpZiAobV9EZXZpY2VDbGFzcyA9PSBGWERDX0RJU1BMQVkgJiYgbV9icHAgPiAxKSB7Ci0gICAgICBpZiAoIUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKS0+RlRMaWJyYXJ5U3VwcG9ydHNIaW50aW5nKCkpIHsKLSAgICAgICAgLy8gU29tZSBGcmVldHlwZSBpbXBsZW1lbnRhdGlvbnMgKGxpa2UgdGhlIG9uZSBwYWNrYWdlZCB3aXRoIEZlZG9yYSkgZG8KLSAgICAgICAgLy8gbm90IHN1cHBvcnQgaGludGluZyBkdWUgdG8gcGF0ZW50cyA2MjE5MDI1LCA2MjM5NzgzLCA2MzA3NTY2LAotICAgICAgICAvLyA2MjI1OTczLCA2MjQzMDcwLCA2MzkzMTQ1LCA2NDIxMDU0LCA2MjgyMzI3LCBhbmQgNjYyNDgyODsgdGhlIGxhdGVzdAotICAgICAgICAvLyBvbmUgZXhwaXJlcyAxMC83LzE5LiAgVGhpcyBtYWtlcyBMQ0QgYW50aWFsaWFzaW5nIHZlcnkgdWdseSwgc28gd2UKLSAgICAgICAgLy8gaW5zdGVhZCBmYWxsIGJhY2sgb24gTk9STUFMIGFudGlhbGlhc2luZy4KLSAgICAgICAgYW50aV9hbGlhcyA9IEZYRlRfUkVOREVSX01PREVfTk9STUFMOwotICAgICAgfSBlbHNlIGlmICgobV9SZW5kZXJDYXBzICYgKEZYUkNfQUxQSEFfT1VUUFVUIHwgRlhSQ19DTVlLX09VVFBVVCkpKSB7Ci0gICAgICAgIGFudGlfYWxpYXMgPSBGWEZUX1JFTkRFUl9NT0RFX0xDRDsKLSAgICAgICAgYk5vcm1hbCA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKG1fYnBwIDwgMTYpIHsKLSAgICAgICAgYW50aV9hbGlhcyA9IEZYRlRfUkVOREVSX01PREVfTk9STUFMOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYW50aV9hbGlhcyA9IEZYRlRfUkVOREVSX01PREVfTENEOwotCi0gICAgICAgIGJvb2wgYkNsZWFyVHlwZSA9IGZhbHNlOwotICAgICAgICBpZiAocEZvbnQtPkdldEZhY2UoKSkKLSAgICAgICAgICBiQ2xlYXJUeXBlID0gISEodGV4dF9mbGFncyAmIEZYVEVYVF9DTEVBUlRZUEUpOwotICAgICAgICBiTm9ybWFsID0gIWJDbGVhclR5cGU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHN0ZDo6dmVjdG9yPEZYVEVYVF9HTFlQSFBPUz4gZ2x5cGhzKG5DaGFycyk7Ci0gIENGWF9NYXRyaXggbWF0cml4Q1RNID0gR2V0Q1RNKCk7Ci0gIEZYX0ZMT0FUIHNjYWxlX3ggPSBGWFNZU19mYWJzKG1hdHJpeENUTS5hKTsKLSAgRlhfRkxPQVQgc2NhbGVfeSA9IEZYU1lTX2ZhYnMobWF0cml4Q1RNLmQpOwotICBDRlhfTWF0cml4IGRldmljZUN0bSA9IGNoYXIyZGV2aWNlOwotICBDRlhfTWF0cml4IG0oc2NhbGVfeCwgMCwgMCwgc2NhbGVfeSwgMCwgMCk7Ci0gIGRldmljZUN0bS5Db25jYXQobSk7Ci0gIHRleHQyRGV2aWNlLkNvbmNhdChtKTsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGdseXBocy5zaXplKCk7ICsraSkgewotICAgIEZYVEVYVF9HTFlQSFBPUyYgZ2x5cGggPSBnbHlwaHNbaV07Ci0gICAgY29uc3QgRlhURVhUX0NIQVJQT1MmIGNoYXJwb3MgPSBwQ2hhclBvc1tpXTsKLQotICAgIGdseXBoLm1fZk9yaWdpbiA9IHRleHQyRGV2aWNlLlRyYW5zZm9ybShjaGFycG9zLm1fT3JpZ2luKTsKLSAgICBpZiAoYW50aV9hbGlhcyA8IEZYRlRfUkVOREVSX01PREVfTENEKQotICAgICAgZ2x5cGgubV9PcmlnaW4ueCA9IEZYU1lTX3JvdW5kKGdseXBoLm1fZk9yaWdpbi54KTsKLSAgICBlbHNlCi0gICAgICBnbHlwaC5tX09yaWdpbi54ID0gc3RhdGljX2Nhc3Q8aW50PihGWFNZU19mbG9vcihnbHlwaC5tX2ZPcmlnaW4ueCkpOwotICAgIGdseXBoLm1fT3JpZ2luLnkgPSBGWFNZU19yb3VuZChnbHlwaC5tX2ZPcmlnaW4ueSk7Ci0KLSAgICBpZiAoY2hhcnBvcy5tX2JHbHlwaEFkanVzdCkgewotICAgICAgQ0ZYX01hdHJpeCBuZXdfbWF0cml4KAotICAgICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMF0sIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMV0sCi0gICAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsyXSwgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFszXSwgMCwgMCk7Ci0gICAgICBuZXdfbWF0cml4LkNvbmNhdChkZXZpY2VDdG0pOwotICAgICAgZ2x5cGgubV9wR2x5cGggPSBwRm9udC0+TG9hZEdseXBoQml0bWFwKAotICAgICAgICAgIGNoYXJwb3MubV9HbHlwaEluZGV4LCBjaGFycG9zLm1fYkZvbnRTdHlsZSwgJm5ld19tYXRyaXgsCi0gICAgICAgICAgY2hhcnBvcy5tX0ZvbnRDaGFyV2lkdGgsIGFudGlfYWxpYXMsIG5hdGl2ZXRleHRfZmxhZ3MpOwotICAgIH0gZWxzZSB7Ci0gICAgICBnbHlwaC5tX3BHbHlwaCA9IHBGb250LT5Mb2FkR2x5cGhCaXRtYXAoCi0gICAgICAgICAgY2hhcnBvcy5tX0dseXBoSW5kZXgsIGNoYXJwb3MubV9iRm9udFN0eWxlLCAmZGV2aWNlQ3RtLAotICAgICAgICAgIGNoYXJwb3MubV9Gb250Q2hhcldpZHRoLCBhbnRpX2FsaWFzLCBuYXRpdmV0ZXh0X2ZsYWdzKTsKLSAgICB9Ci0gIH0KLSAgaWYgKGFudGlfYWxpYXMgPCBGWEZUX1JFTkRFUl9NT0RFX0xDRCAmJiBnbHlwaHMuc2l6ZSgpID4gMSkKLSAgICBBZGp1c3RHbHlwaFNwYWNlKCZnbHlwaHMpOwotCi0gIEZYX1JFQ1QgYm1wX3JlY3QxID0gRlhHRV9HZXRHbHlwaHNCQm94KGdseXBocywgYW50aV9hbGlhcyk7Ci0gIGlmIChzY2FsZV94ID4gMSAmJiBzY2FsZV95ID4gMSkgewotICAgIGJtcF9yZWN0MS5sZWZ0LS07Ci0gICAgYm1wX3JlY3QxLnRvcC0tOwotICAgIGJtcF9yZWN0MS5yaWdodCsrOwotICAgIGJtcF9yZWN0MS5ib3R0b20rKzsKLSAgfQotICBGWF9SRUNUIGJtcF9yZWN0KEZYU1lTX3JvdW5kKChGWF9GTE9BVCkoYm1wX3JlY3QxLmxlZnQpIC8gc2NhbGVfeCksCi0gICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoKEZYX0ZMT0FUKShibXBfcmVjdDEudG9wKSAvIHNjYWxlX3kpLAotICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKChGWF9GTE9BVClibXBfcmVjdDEucmlnaHQgLyBzY2FsZV94KSwKLSAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZCgoRlhfRkxPQVQpYm1wX3JlY3QxLmJvdHRvbSAvIHNjYWxlX3kpKTsKLSAgYm1wX3JlY3QuSW50ZXJzZWN0KG1fQ2xpcEJveCk7Ci0gIGlmIChibXBfcmVjdC5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIHRydWU7Ci0gIGludCBwaXhlbF93aWR0aCA9IEZYU1lTX3JvdW5kKGJtcF9yZWN0LldpZHRoKCkgKiBzY2FsZV94KTsKLSAgaW50IHBpeGVsX2hlaWdodCA9IEZYU1lTX3JvdW5kKGJtcF9yZWN0LkhlaWdodCgpICogc2NhbGVfeSk7Ci0gIGludCBwaXhlbF9sZWZ0ID0gRlhTWVNfcm91bmQoYm1wX3JlY3QubGVmdCAqIHNjYWxlX3gpOwotICBpbnQgcGl4ZWxfdG9wID0gRlhTWVNfcm91bmQoYm1wX3JlY3QudG9wICogc2NhbGVfeSk7Ci0gIGlmIChhbnRpX2FsaWFzID09IEZYRlRfUkVOREVSX01PREVfTU9OTykgewotICAgIENGWF9ESUJpdG1hcCBiaXRtYXA7Ci0gICAgaWYgKCFiaXRtYXAuQ3JlYXRlKHBpeGVsX3dpZHRoLCBwaXhlbF9oZWlnaHQsIEZYRElCXzFicHBNYXNrKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBiaXRtYXAuQ2xlYXIoMCk7Ci0gICAgZm9yIChjb25zdCBGWFRFWFRfR0xZUEhQT1MmIGdseXBoIDogZ2x5cGhzKSB7Ci0gICAgICBpZiAoIWdseXBoLm1fcEdseXBoKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcEdseXBoID0gJmdseXBoLm1fcEdseXBoLT5tX0JpdG1hcDsKLSAgICAgIGJpdG1hcC5UcmFuc2ZlckJpdG1hcCgKLSAgICAgICAgICBnbHlwaC5tX09yaWdpbi54ICsgZ2x5cGgubV9wR2x5cGgtPm1fTGVmdCAtIHBpeGVsX2xlZnQsCi0gICAgICAgICAgZ2x5cGgubV9PcmlnaW4ueSAtIGdseXBoLm1fcEdseXBoLT5tX1RvcCAtIHBpeGVsX3RvcCwKLSAgICAgICAgICBwR2x5cGgtPkdldFdpZHRoKCksIHBHbHlwaC0+R2V0SGVpZ2h0KCksIHBHbHlwaCwgMCwgMCk7Ci0gICAgfQotICAgIHJldHVybiBTZXRCaXRNYXNrKCZiaXRtYXAsIGJtcF9yZWN0LmxlZnQsIGJtcF9yZWN0LnRvcCwgZmlsbF9jb2xvcik7Ci0gIH0KLSAgQ0ZYX0RJQml0bWFwIGJpdG1hcDsKLSAgaWYgKG1fYnBwID09IDgpIHsKLSAgICBpZiAoIWJpdG1hcC5DcmVhdGUocGl4ZWxfd2lkdGgsIHBpeGVsX2hlaWdodCwgRlhESUJfOGJwcE1hc2spKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIGlmICghQ3JlYXRlQ29tcGF0aWJsZUJpdG1hcCgmYml0bWFwLCBwaXhlbF93aWR0aCwgcGl4ZWxfaGVpZ2h0KSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIWJpdG1hcC5IYXNBbHBoYSgpICYmICFiaXRtYXAuSXNBbHBoYU1hc2soKSkgewotICAgIGJpdG1hcC5DbGVhcigweEZGRkZGRkZGKTsKLSAgICBpZiAoIUdldERJQml0cygmYml0bWFwLCBibXBfcmVjdC5sZWZ0LCBibXBfcmVjdC50b3ApKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIGJpdG1hcC5DbGVhcigwKTsKLSAgICBpZiAoYml0bWFwLm1fcEFscGhhTWFzaykKLSAgICAgIGJpdG1hcC5tX3BBbHBoYU1hc2stPkNsZWFyKDApOwotICB9Ci0gIGludCBkZXN0X3dpZHRoID0gcGl4ZWxfd2lkdGg7Ci0gIGludCBhID0gMDsKLSAgaW50IHIgPSAwOwotICBpbnQgZyA9IDA7Ci0gIGludCBiID0gMDsKLSAgaWYgKGFudGlfYWxpYXMgPT0gRlhGVF9SRU5ERVJfTU9ERV9MQ0QpCi0gICAgQXJnYkRlY29kZShmaWxsX2NvbG9yLCBhLCByLCBnLCBiKTsKLQotICBmb3IgKGNvbnN0IEZYVEVYVF9HTFlQSFBPUyYgZ2x5cGggOiBnbHlwaHMpIHsKLSAgICBpZiAoIWdseXBoLm1fcEdseXBoKQotICAgICAgY29udGludWU7Ci0KLSAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPGludD4gbGVmdCA9IGdseXBoLm1fT3JpZ2luLng7Ci0gICAgbGVmdCArPSBnbHlwaC5tX3BHbHlwaC0+bV9MZWZ0OwotICAgIGxlZnQgLT0gcGl4ZWxfbGVmdDsKLSAgICBpZiAoIWxlZnQuSXNWYWxpZCgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQ+IHRvcCA9IGdseXBoLm1fT3JpZ2luLnk7Ci0gICAgdG9wIC09IGdseXBoLm1fcEdseXBoLT5tX1RvcDsKLSAgICB0b3AgLT0gcGl4ZWxfdG9wOwotICAgIGlmICghdG9wLklzVmFsaWQoKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcEdseXBoID0gJmdseXBoLm1fcEdseXBoLT5tX0JpdG1hcDsKLSAgICBpbnQgbmNvbHMgPSBwR2x5cGgtPkdldFdpZHRoKCk7Ci0gICAgaW50IG5yb3dzID0gcEdseXBoLT5HZXRIZWlnaHQoKTsKLSAgICBpZiAoYW50aV9hbGlhcyA9PSBGWEZUX1JFTkRFUl9NT0RFX05PUk1BTCkgewotICAgICAgaWYgKCFiaXRtYXAuQ29tcG9zaXRlTWFzayhsZWZ0LlZhbHVlT3JEaWUoKSwgdG9wLlZhbHVlT3JEaWUoKSwgbmNvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5yb3dzLCBwR2x5cGgsIGZpbGxfY29sb3IsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0JMRU5EX05PUk1BTCwgbnVsbHB0ciwgZmFsc2UsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBib29sIGJCR1JTdHJpcGUgPSAhISh0ZXh0X2ZsYWdzICYgRlhURVhUX0JHUl9TVFJJUEUpOwotICAgIG5jb2xzIC89IDM7Ci0gICAgaW50IHhfc3VicGl4ZWwgPSBzdGF0aWNfY2FzdDxpbnQ+KGdseXBoLm1fZk9yaWdpbi54ICogMykgJSAzOwotICAgIGludCBzdGFydF9jb2wgPQotICAgICAgICBwZGZpdW06OmJhc2U6OlZhbHVlT3JEaWVGb3JUeXBlPGludD4ocGRmaXVtOjpiYXNlOjpDaGVja01heChsZWZ0LCAwKSk7Ci0gICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQ+IGVuZF9jb2xfc2FmZSA9IGxlZnQ7Ci0gICAgZW5kX2NvbF9zYWZlICs9IG5jb2xzOwotICAgIGlmICghZW5kX2NvbF9zYWZlLklzVmFsaWQoKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGludCBlbmRfY29sID0KLSAgICAgICAgc3RkOjptaW4oc3RhdGljX2Nhc3Q8aW50PihlbmRfY29sX3NhZmUuVmFsdWVPckRpZTxpbnQ+KCkpLCBkZXN0X3dpZHRoKTsKLSAgICBpZiAoc3RhcnRfY29sID49IGVuZF9jb2wpCi0gICAgICBjb250aW51ZTsKLQotICAgIERyYXdOb3JtYWxUZXh0SGVscGVyKCZiaXRtYXAsIHBHbHlwaCwgbnJvd3MsIGxlZnQuVmFsdWVPckRpZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHRvcC5WYWx1ZU9yRGllKCksIHN0YXJ0X2NvbCwgZW5kX2NvbCwgYk5vcm1hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiQkdSU3RyaXBlLCB4X3N1YnBpeGVsLCBhLCByLCBnLCBiKTsKLSAgfQotICBpZiAoYml0bWFwLklzQWxwaGFNYXNrKCkpCi0gICAgU2V0Qml0TWFzaygmYml0bWFwLCBibXBfcmVjdC5sZWZ0LCBibXBfcmVjdC50b3AsIGZpbGxfY29sb3IpOwotICBlbHNlCi0gICAgU2V0RElCaXRzKCZiaXRtYXAsIGJtcF9yZWN0LmxlZnQsIGJtcF9yZWN0LnRvcCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENGWF9SZW5kZXJEZXZpY2U6OkRyYXdUZXh0UGF0aChpbnQgbkNoYXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcFRleHQyVXNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaWxsX2NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBzdHJva2VfY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aERhdGEqIHBDbGlwcGluZ1BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZsYWcpIHsKLSAgZm9yIChpbnQgaUNoYXIgPSAwOyBpQ2hhciA8IG5DaGFyczsgaUNoYXIrKykgewotICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TJiBjaGFycG9zID0gcENoYXJQb3NbaUNoYXJdOwotICAgIENGWF9NYXRyaXggbWF0cml4OwotICAgIGlmIChjaGFycG9zLm1fYkdseXBoQWRqdXN0KSB7Ci0gICAgICBtYXRyaXggPSBDRlhfTWF0cml4KGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMF0sIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMl0sIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDApOwotICAgIH0KLSAgICBtYXRyaXguQ29uY2F0KENGWF9NYXRyaXgoZm9udF9zaXplLCAwLCAwLCBmb250X3NpemUsIGNoYXJwb3MubV9PcmlnaW4ueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnBvcy5tX09yaWdpbi55KSk7Ci0gICAgY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aCA9Ci0gICAgICAgIHBGb250LT5Mb2FkR2x5cGhQYXRoKGNoYXJwb3MubV9HbHlwaEluZGV4LCBjaGFycG9zLm1fRm9udENoYXJXaWR0aCk7Ci0gICAgaWYgKCFwUGF0aCkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgbWF0cml4LkNvbmNhdCgqcFRleHQyVXNlcik7Ci0KLSAgICBDRlhfUGF0aERhdGEgVHJhbnNmb3JtZWRQYXRoKCpwUGF0aCk7Ci0gICAgVHJhbnNmb3JtZWRQYXRoLlRyYW5zZm9ybSgmbWF0cml4KTsKLSAgICBpZiAoZmlsbF9jb2xvciB8fCBzdHJva2VfY29sb3IpIHsKLSAgICAgIGludCBmaWxsX21vZGUgPSBuRmxhZzsKLSAgICAgIGlmIChmaWxsX2NvbG9yKQotICAgICAgICBmaWxsX21vZGUgfD0gRlhGSUxMX1dJTkRJTkc7Ci0gICAgICBmaWxsX21vZGUgfD0gRlhfRklMTF9URVhUX01PREU7Ci0gICAgICBpZiAoIURyYXdQYXRoV2l0aEJsZW5kKCZUcmFuc2Zvcm1lZFBhdGgsIHBVc2VyMkRldmljZSwgcEdyYXBoU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxfY29sb3IsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9CTEVORF9OT1JNQUwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBDbGlwcGluZ1BhdGgpCi0gICAgICBwQ2xpcHBpbmdQYXRoLT5BcHBlbmQoJlRyYW5zZm9ybWVkUGF0aCwgcFVzZXIyRGV2aWNlKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9nZS9jZnhfc3Vic3Rmb250LmNwcCBiL2NvcmUvZnhnZS9nZS9jZnhfc3Vic3Rmb250LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc1MzcyZS4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Z2UvZ2UvY2Z4X3N1YnN0Zm9udC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3N1YnN0Zm9udC5oIgotCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZvbnQuaCIKLQotQ0ZYX1N1YnN0Rm9udDo6Q0ZYX1N1YnN0Rm9udCgpCi0gICAgOiBtX0NoYXJzZXQoRlhGT05UX0FOU0lfQ0hBUlNFVCksCi0gICAgICBtX1N1YnN0RmxhZ3MoMCksCi0gICAgICBtX1dlaWdodCgwKSwKLSAgICAgIG1fSXRhbGljQW5nbGUoMCksCi0gICAgICBtX2JTdWJzdENKSyhmYWxzZSksCi0gICAgICBtX1dlaWdodENKSygwKSwKLSAgICAgIG1fYkl0YWxpY0NKSyhmYWxzZSkge30KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9nZS9jZnhfdW5pY29kZWVuY29kaW5nLmNwcCBiL2NvcmUvZnhnZS9nZS9jZnhfdW5pY29kZWVuY29kaW5nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhNjdiYS4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Z2UvZ2UvY2Z4X3VuaWNvZGVlbmNvZGluZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3VuaWNvZGVlbmNvZGluZy5oIgotCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZvbnQuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKLQotQ0ZYX1VuaWNvZGVFbmNvZGluZzo6Q0ZYX1VuaWNvZGVFbmNvZGluZyhDRlhfRm9udCogcEZvbnQpIDogbV9wRm9udChwRm9udCkge30KLQotQ0ZYX1VuaWNvZGVFbmNvZGluZzo6fkNGWF9Vbmljb2RlRW5jb2RpbmcoKSB7fQotCi11aW50MzJfdCBDRlhfVW5pY29kZUVuY29kaW5nOjpHbHlwaEZyb21DaGFyQ29kZSh1aW50MzJfdCBjaGFyY29kZSkgewotICBGWEZUX0ZhY2UgZmFjZSA9IG1fcEZvbnQtPkdldEZhY2UoKTsKLSAgaWYgKCFmYWNlKQotICAgIHJldHVybiBjaGFyY29kZTsKLQotICBpZiAoRlhGVF9TZWxlY3RfQ2hhcm1hcChmYWNlLCBGWEZUX0VOQ09ESU5HX1VOSUNPREUpID09IDApCi0gICAgcmV0dXJuIEZYRlRfR2V0X0NoYXJfSW5kZXgoZmFjZSwgY2hhcmNvZGUpOwotCi0gIGlmIChtX3BGb250LT5HZXRTdWJzdEZvbnQoKSAmJgotICAgICAgbV9wRm9udC0+R2V0U3Vic3RGb250KCktPm1fQ2hhcnNldCA9PSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQpIHsKLSAgICB1aW50MzJfdCBpbmRleCA9IDA7Ci0gICAgaWYgKEZYRlRfU2VsZWN0X0NoYXJtYXAoZmFjZSwgRlhGVF9FTkNPRElOR19NU19TWU1CT0wpID09IDApCi0gICAgICBpbmRleCA9IEZYRlRfR2V0X0NoYXJfSW5kZXgoZmFjZSwgY2hhcmNvZGUpOwotICAgIGlmICghaW5kZXggJiYgIUZYRlRfU2VsZWN0X0NoYXJtYXAoZmFjZSwgRlhGVF9FTkNPRElOR19BUFBMRV9ST01BTikpCi0gICAgICByZXR1cm4gRlhGVF9HZXRfQ2hhcl9JbmRleChmYWNlLCBjaGFyY29kZSk7Ci0gIH0KLSAgcmV0dXJuIGNoYXJjb2RlOwotfQpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2dlL2NmeF91bmljb2RlZW5jb2RpbmdleC5jcHAgYi9jb3JlL2Z4Z2UvZ2UvY2Z4X3VuaWNvZGVlbmNvZGluZ2V4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdlMzMwMy4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Z2UvZ2UvY2Z4X3VuaWNvZGVlbmNvZGluZ2V4LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfdW5pY29kZWVuY29kaW5nZXguaCIKLQotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udC5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mb250LmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZyZWV0eXBlLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IHVpbnQzMl90IGdfRW5jb2RpbmdJRFtdID0gewotICAgIEZYRk1fRU5DT0RJTkdfTVNfU1lNQk9MLCAgICAgRlhGTV9FTkNPRElOR19VTklDT0RFLAotICAgIEZYRk1fRU5DT0RJTkdfTVNfU0pJUywgICAgICAgRlhGTV9FTkNPRElOR19NU19HQjIzMTIsCi0gICAgRlhGTV9FTkNPRElOR19NU19CSUc1LCAgICAgICBGWEZNX0VOQ09ESU5HX01TX1dBTlNVTkcsCi0gICAgRlhGTV9FTkNPRElOR19NU19KT0hBQiwgICAgICBGWEZNX0VOQ09ESU5HX0FET0JFX1NUQU5EQVJELAotICAgIEZYRk1fRU5DT0RJTkdfQURPQkVfRVhQRVJULCAgRlhGTV9FTkNPRElOR19BRE9CRV9DVVNUT00sCi0gICAgRlhGTV9FTkNPRElOR19BRE9CRV9MQVRJTl8xLCBGWEZNX0VOQ09ESU5HX09MRF9MQVRJTl8yLAotICAgIEZYRk1fRU5DT0RJTkdfQVBQTEVfUk9NQU4sCi19OwotCi1DRlhfVW5pY29kZUVuY29kaW5nRXgqIEZYRk1fQ3JlYXRlRm9udEVuY29kaW5nKENGWF9Gb250KiBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkVuY29kaW5nSUQpIHsKLSAgaWYgKEZYRlRfU2VsZWN0X0NoYXJtYXAocEZvbnQtPkdldEZhY2UoKSwgbkVuY29kaW5nSUQpKQotICAgIHJldHVybiBudWxscHRyOwotICByZXR1cm4gbmV3IENGWF9Vbmljb2RlRW5jb2RpbmdFeChwRm9udCwgbkVuY29kaW5nSUQpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotQ0ZYX1VuaWNvZGVFbmNvZGluZ0V4OjpDRlhfVW5pY29kZUVuY29kaW5nRXgoQ0ZYX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRW5jb2RpbmdJRCkKLSAgICA6IENGWF9Vbmljb2RlRW5jb2RpbmcocEZvbnQpLCBtX25FbmNvZGluZ0lEKEVuY29kaW5nSUQpIHt9Ci0KLUNGWF9Vbmljb2RlRW5jb2RpbmdFeDo6fkNGWF9Vbmljb2RlRW5jb2RpbmdFeCgpIHt9Ci0KLXVpbnQzMl90IENGWF9Vbmljb2RlRW5jb2RpbmdFeDo6R2x5cGhGcm9tQ2hhckNvZGUodWludDMyX3QgY2hhcmNvZGUpIHsKLSAgRlhGVF9GYWNlIGZhY2UgPSBtX3BGb250LT5HZXRGYWNlKCk7Ci0gIEZUX1VJbnQgbkluZGV4ID0gRlhGVF9HZXRfQ2hhcl9JbmRleChmYWNlLCBjaGFyY29kZSk7Ci0gIGlmIChuSW5kZXggPiAwKQotICAgIHJldHVybiBuSW5kZXg7Ci0gIGludCBubWFwcyA9IEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcENvdW50KGZhY2UpOwotICBpbnQgbSA9IDA7Ci0gIHdoaWxlIChtIDwgbm1hcHMpIHsKLSAgICB1aW50MzJfdCBuRW5jb2RpbmdJRCA9Ci0gICAgICAgIEZYRlRfR2V0X0NoYXJtYXBfRW5jb2RpbmcoRlhGVF9HZXRfRmFjZV9DaGFybWFwcyhmYWNlKVttKytdKTsKLSAgICBpZiAobV9uRW5jb2RpbmdJRCA9PSBuRW5jb2RpbmdJRCkKLSAgICAgIGNvbnRpbnVlOwotICAgIGludCBlcnJvciA9IEZYRlRfU2VsZWN0X0NoYXJtYXAoZmFjZSwgbkVuY29kaW5nSUQpOwotICAgIGlmIChlcnJvcikKLSAgICAgIGNvbnRpbnVlOwotICAgIG5JbmRleCA9IEZYRlRfR2V0X0NoYXJfSW5kZXgoZmFjZSwgY2hhcmNvZGUpOwotICAgIGlmIChuSW5kZXggPiAwKSB7Ci0gICAgICBtX25FbmNvZGluZ0lEID0gbkVuY29kaW5nSUQ7Ci0gICAgICByZXR1cm4gbkluZGV4OwotICAgIH0KLSAgfQotICBGWEZUX1NlbGVjdF9DaGFybWFwKGZhY2UsIG1fbkVuY29kaW5nSUQpOwotICByZXR1cm4gMDsKLX0KLQotdWludDMyX3QgQ0ZYX1VuaWNvZGVFbmNvZGluZ0V4OjpDaGFyQ29kZUZyb21Vbmljb2RlKEZYX1dDSEFSIFVuaWNvZGUpIGNvbnN0IHsKLSAgaWYgKG1fbkVuY29kaW5nSUQgPT0gRlhGTV9FTkNPRElOR19VTklDT0RFIHx8Ci0gICAgICBtX25FbmNvZGluZ0lEID09IEZYRk1fRU5DT0RJTkdfTVNfU1lNQk9MKSB7Ci0gICAgcmV0dXJuIFVuaWNvZGU7Ci0gIH0KLSAgRlhGVF9GYWNlIGZhY2UgPSBtX3BGb250LT5HZXRGYWNlKCk7Ci0gIGludCBubWFwcyA9IEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcENvdW50KGZhY2UpOwotICBmb3IgKGludCBpID0gMDsgaSA8IG5tYXBzOyBpKyspIHsKLSAgICBpbnQgbkVuY29kaW5nSUQgPQotICAgICAgICBGWEZUX0dldF9DaGFybWFwX0VuY29kaW5nKEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcHMoZmFjZSlbaV0pOwotICAgIGlmIChuRW5jb2RpbmdJRCA9PSBGWEZNX0VOQ09ESU5HX1VOSUNPREUgfHwKLSAgICAgICAgbkVuY29kaW5nSUQgPT0gRlhGTV9FTkNPRElOR19NU19TWU1CT0wpIHsKLSAgICAgIHJldHVybiBVbmljb2RlOwotICAgIH0KLSAgfQotICByZXR1cm4gQ1BERl9Gb250OjprSW52YWxpZENoYXJDb2RlOwotfQotCi1DRlhfVW5pY29kZUVuY29kaW5nRXgqIEZYX0NyZWF0ZUZvbnRFbmNvZGluZ0V4KENGWF9Gb250KiBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkVuY29kaW5nSUQpIHsKLSAgaWYgKCFwRm9udCB8fCAhcEZvbnQtPkdldEZhY2UoKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBpZiAobkVuY29kaW5nSUQgIT0gRlhGTV9FTkNPRElOR19OT05FKQotICAgIHJldHVybiBGWEZNX0NyZWF0ZUZvbnRFbmNvZGluZyhwRm9udCwgbkVuY29kaW5nSUQpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGdfRW5jb2RpbmdJRCk7ICsraSkgewotICAgIENGWF9Vbmljb2RlRW5jb2RpbmdFeCogcEZvbnRFbmNvZGluZyA9Ci0gICAgICAgIEZYRk1fQ3JlYXRlRm9udEVuY29kaW5nKHBGb250LCBnX0VuY29kaW5nSURbaV0pOwotICAgIGlmIChwRm9udEVuY29kaW5nKQotICAgICAgcmV0dXJuIHBGb250RW5jb2Rpbmc7Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZ2UvY3R0Zm9udGRlc2MuY3BwIGIvY29yZS9meGdlL2dlL2N0dGZvbnRkZXNjLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY5YWJmZS4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Z2UvZ2UvY3R0Zm9udGRlc2MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiY29yZS9meGdlL2dlL2N0dGZvbnRkZXNjLmgiCi0KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKLQotQ1RURm9udERlc2M6On5DVFRGb250RGVzYygpIHsKLSAgaWYgKG1fVHlwZSA9PSAxKSB7Ci0gICAgaWYgKG1fU2luZ2xlRmFjZSkKLSAgICAgIEZYRlRfRG9uZV9GYWNlKG1fU2luZ2xlRmFjZSk7Ci0gIH0gZWxzZSBpZiAobV9UeXBlID09IDIpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKLSAgICAgIGlmIChtX1RUQ0ZhY2VzW2ldKQotICAgICAgICBGWEZUX0RvbmVfRmFjZShtX1RUQ0ZhY2VzW2ldKTsKLSAgICB9Ci0gIH0KLSAgRlhfRnJlZShtX3BGb250RGF0YSk7Ci19Ci0KLWludCBDVFRGb250RGVzYzo6UmVsZWFzZUZhY2UoRlhGVF9GYWNlIGZhY2UpIHsKLSAgaWYgKG1fVHlwZSA9PSAxKSB7Ci0gICAgaWYgKG1fU2luZ2xlRmFjZSAhPSBmYWNlKQotICAgICAgcmV0dXJuIC0xOwotICB9IGVsc2UgaWYgKG1fVHlwZSA9PSAyKSB7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLSAgICAgIGlmIChtX1RUQ0ZhY2VzW2ldID09IGZhY2UpCi0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoaSA9PSAxNikKLSAgICAgIHJldHVybiAtMTsKLSAgfQotICBtX1JlZkNvdW50LS07Ci0gIGlmIChtX1JlZkNvdW50KQotICAgIHJldHVybiBtX1JlZkNvdW50OwotICBkZWxldGUgdGhpczsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZ2UvY3R0Zm9udGRlc2MuaCBiL2NvcmUvZnhnZS9nZS9jdHRmb250ZGVzYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzU2Y2I5Li4wMDAwMDAwCi0tLSBhL2NvcmUvZnhnZS9nZS9jdHRmb250ZGVzYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIENPUkVfRlhHRV9HRV9DVFRGT05UREVTQ19IXwotI2RlZmluZSBDT1JFX0ZYR0VfR0VfQ1RURk9OVERFU0NfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZvbnQuaCIKLQotI2RlZmluZSBGWF9GT05UX0ZMQUdfU0VSSUYgMHgwMQotI2RlZmluZSBGWF9GT05UX0ZMQUdfRklYRURQSVRDSCAweDAyCi0jZGVmaW5lIEZYX0ZPTlRfRkxBR19JVEFMSUMgMHgwNAotI2RlZmluZSBGWF9GT05UX0ZMQUdfQk9MRCAweDA4Ci0jZGVmaW5lIEZYX0ZPTlRfRkxBR19TWU1CT0xJQ19TWU1CT0wgMHgxMAotI2RlZmluZSBGWF9GT05UX0ZMQUdfU1lNQk9MSUNfRElOR0JBVFMgMHgyMAotI2RlZmluZSBGWF9GT05UX0ZMQUdfTVVMVElQTEVNQVNURVIgMHg0MAotCi1jbGFzcyBDVFRGb250RGVzYyB7Ci0gcHVibGljOgotICBDVFRGb250RGVzYygpIDogbV9UeXBlKDApLCBtX3BGb250RGF0YShudWxscHRyKSwgbV9SZWZDb3VudCgwKSB7fQotICB+Q1RURm9udERlc2MoKTsKLSAgLy8gcmV0IDwgMCwgcmVsZWFzZWZhY2Ugbm90IGFwcHJvcHJpYXRlIGZvciB0aGlzIG9iamVjdC4KLSAgLy8gcmV0ID09IDAsIG9iamVjdCByZWxlYXNlZAotICAvLyByZXQgPiAwLCBvYmplY3Qgc3RpbGwgYWxpdmUsIG90aGVyIHJlZmVycmVycy4KLSAgaW50IFJlbGVhc2VGYWNlKEZYRlRfRmFjZSBmYWNlKTsKLQotICBpbnQgbV9UeXBlOwotCi0gIHVuaW9uIHsKLSAgICBGWEZUX0ZhY2UgbV9TaW5nbGVGYWNlOwotICAgIEZYRlRfRmFjZSBtX1RUQ0ZhY2VzWzE2XTsKLSAgfTsKLSAgdWludDhfdCogbV9wRm9udERhdGE7Ci0gIGludCBtX1JlZkNvdW50OwotfTsKLQotI2VuZGlmICAvLyBDT1JFX0ZYR0VfR0VfQ1RURk9OVERFU0NfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9nZS9meF9nZV9mb250bWFwLmNwcCBiL2NvcmUvZnhnZS9nZS9meF9nZV9mb250bWFwLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FjNGZhZC4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Z2UvZ2UvZnhfZ2VfZm9udG1hcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnRtYXBwZXIuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvaWZ4X3N5c3RlbWZvbnRpbmZvLmgiCi0KLXN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRTdHJpbmdGcm9tVGFibGUoY29uc3QgdWludDhfdCogc3RyaW5nX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyaW5nX3B0cl9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbGVuZ3RoKSB7Ci0gIGlmIChzdHJpbmdfcHRyX2xlbmd0aCA8IHN0YXRpY19jYXN0PHVpbnQzMl90PihvZmZzZXQgKyBsZW5ndGgpKSB7Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0gIH0KLSAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKHN0cmluZ19wdHIgKyBvZmZzZXQsIGxlbmd0aCk7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIEdldE5hbWVGcm9tVFQoY29uc3QgdWludDhfdCogbmFtZV90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbmFtZV90YWJsZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuYW1lX2lkKSB7Ci0gIGlmICghbmFtZV90YWJsZSB8fCBuYW1lX3RhYmxlX3NpemUgPCA2KSB7Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0gIH0KLSAgdWludDMyX3QgbmFtZV9jb3VudCA9IEdFVF9UVF9TSE9SVChuYW1lX3RhYmxlICsgMik7Ci0gIHVpbnQzMl90IHN0cmluZ19vZmZzZXQgPSBHRVRfVFRfU0hPUlQobmFtZV90YWJsZSArIDQpOwotICAvLyBXZSB3aWxsIGlnbm9yZSB0aGUgcG9zc2liaWxpdHkgb2Ygb3ZlcmxhcCBvZiBzdHJ1Y3R1cmVzIGFuZAotICAvLyBzdHJpbmcgdGFibGUgYXMgaWYgaXQncyBhbGwgY29ycnVwdCB0aGVyZSdzIG5vdCBhIGxvdCB3ZSBjYW4gZG8uCi0gIGlmIChuYW1lX3RhYmxlX3NpemUgPCBzdHJpbmdfb2Zmc2V0KSB7Ci0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0gIH0KLQotICBjb25zdCB1aW50OF90KiBzdHJpbmdfcHRyID0gbmFtZV90YWJsZSArIHN0cmluZ19vZmZzZXQ7Ci0gIHVpbnQzMl90IHN0cmluZ19wdHJfc2l6ZSA9IG5hbWVfdGFibGVfc2l6ZSAtIHN0cmluZ19vZmZzZXQ7Ci0gIG5hbWVfdGFibGUgKz0gNjsKLSAgbmFtZV90YWJsZV9zaXplIC09IDY7Ci0gIGlmIChuYW1lX3RhYmxlX3NpemUgPCBuYW1lX2NvdW50ICogMTIpIHsKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKLSAgfQotCi0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuYW1lX2NvdW50OyBpKyssIG5hbWVfdGFibGUgKz0gMTIpIHsKLSAgICBpZiAoR0VUX1RUX1NIT1JUKG5hbWVfdGFibGUgKyA2KSA9PSBuYW1lX2lkICYmCi0gICAgICAgIEdFVF9UVF9TSE9SVChuYW1lX3RhYmxlKSA9PSAxICYmIEdFVF9UVF9TSE9SVChuYW1lX3RhYmxlICsgMikgPT0gMCkgewotICAgICAgcmV0dXJuIEdldFN0cmluZ0Zyb21UYWJsZShzdHJpbmdfcHRyLCBzdHJpbmdfcHRyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFVF9UVF9TSE9SVChuYW1lX3RhYmxlICsgMTApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfVFRfU0hPUlQobmFtZV90YWJsZSArIDgpKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci19Ci0jaWZkZWYgUERGX0VOQUJMRV9YRkEKLXZvaWQqIElGWF9TeXN0ZW1Gb250SW5mbzo6TWFwRm9udEJ5VW5pY29kZSh1aW50MzJfdCBkd1VuaWNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJdGFsaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSkgewotICByZXR1cm4gbnVsbHB0cjsKLX0KLSNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKLQotaW50IElGWF9TeXN0ZW1Gb250SW5mbzo6R2V0RmFjZUluZGV4KHZvaWQqIGhGb250KSB7Ci0gIHJldHVybiAwOwotfQotCi1leHRlcm4gIkMiIHsKLXVuc2lnbmVkIGxvbmcgX0ZUU3RyZWFtUmVhZChGWEZUX1N0cmVhbSBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQpOwotdm9pZCBfRlRTdHJlYW1DbG9zZShGWEZUX1N0cmVhbSBzdHJlYW0pOwotfTsKLQotI2lmIF9GWF9PU18gPT0gX0ZYX0FORFJPSURfCi1zdGQ6OnVuaXF1ZV9wdHI8SUZYX1N5c3RlbUZvbnRJbmZvPiBJRlhfU3lzdGVtRm9udEluZm86OkNyZWF0ZURlZmF1bHQoCi0gICAgY29uc3QgY2hhcioqIHBVbnVzZWQpIHsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0jZW5kaWYKLQotQ0ZYX0ZvbnRGYWNlSW5mbzo6Q0ZYX0ZvbnRGYWNlSW5mbyhDRlhfQnl0ZVN0cmluZyBmaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZmFjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGZvbnRUYWJsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZvbnRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpbGVTaXplKQotICAgIDogbV9GaWxlUGF0aChmaWxlUGF0aCksCi0gICAgICBtX0ZhY2VOYW1lKGZhY2VOYW1lKSwKLSAgICAgIG1fRm9udFRhYmxlcyhmb250VGFibGVzKSwKLSAgICAgIG1fRm9udE9mZnNldChmb250T2Zmc2V0KSwKLSAgICAgIG1fRmlsZVNpemUoZmlsZVNpemUpLAotICAgICAgbV9TdHlsZXMoMCksCi0gICAgICBtX0NoYXJzZXRzKDApIHt9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvZ2UvZnhfZ2VfbGludXguY3BwIGIvY29yZS9meGdlL2dlL2Z4X2dlX2xpbnV4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTcwODZiYi4uMDAwMDAwMAotLS0gYS9jb3JlL2Z4Z2UvZ2UvZnhfZ2VfbGludXguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZ2Vtb2R1bGUuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZ2UvY2Z4X2ZvbGRlcmZvbnRpbmZvLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2lmeF9zeXN0ZW1mb250aW5mby5oIgotCi0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9MSU5VWF8KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IHNpemVfdCBrTGludXhHcE5hbWVTaXplID0gNjsKLQotY29uc3QgRlhfQ0hBUiogY29uc3QgZ19MaW51eEdwRm9udExpc3RbXVtrTGludXhHcE5hbWVTaXplXSA9IHsKLSAgICB7IlRha2FvUEdvdGhpYyIsICJWTCBQR290aGljIiwgIklQQVBHb3RoaWMiLCAiVkwgR290aGljIiwgIktvY2hpIEdvdGhpYyIsCi0gICAgICJWTCBHb3RoaWMgcmVndWxhciJ9LAotICAgIHsiVGFrYW9Hb3RoaWMiLCAiVkwgR290aGljIiwgIklQQUdvdGhpYyIsICJLb2NoaSBHb3RoaWMiLCBudWxscHRyLAotICAgICAiVkwgR290aGljIHJlZ3VsYXIifSwKLSAgICB7IlRha2FvUE1pbmNobyIsICJJUEFQTWluY2hvIiwgIlZMIEdvdGhpYyIsICJLb2NoaSBNaW5jaG8iLCBudWxscHRyLAotICAgICAiVkwgR290aGljIHJlZ3VsYXIifSwKLSAgICB7IlRha2FvTWluY2hvIiwgIklQQU1pbmNobyIsICJWTCBHb3RoaWMiLCAiS29jaGkgTWluY2hvIiwgbnVsbHB0ciwKLSAgICAgIlZMIEdvdGhpYyByZWd1bGFyIn0sCi19OwotCi1jb25zdCBGWF9DSEFSKiBjb25zdCBnX0xpbnV4R2JGb250TGlzdFtdID0gewotICAgICJBUiBQTCBVTWluZyBDTiBMaWdodCIsICJXZW5RdWFuWWkgTWljcm8gSGVpIiwgIkFSIFBMIFVLYWkgQ04iLAotfTsKLQotY29uc3QgRlhfQ0hBUiogY29uc3QgZ19MaW51eEI1Rm9udExpc3RbXSA9IHsKLSAgICAiQVIgUEwgVU1pbmcgVFcgTGlnaHQiLCAiV2VuUXVhbllpIE1pY3JvIEhlaSIsICJBUiBQTCBVS2FpIFRXIiwKLX07Ci0KLWNvbnN0IEZYX0NIQVIqIGNvbnN0IGdfTGludXhIR0ZvbnRMaXN0W10gPSB7Ci0gICAgIlVuRG90dW0iLAotfTsKLQotc2l6ZV90IEdldEphcGFuZXNlUHJlZmVyZW5jZShjb25zdCBGWF9DSEFSKiBmYWNlYXJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5KSB7Ci0gIENGWF9CeXRlU3RyaW5nIGZhY2UgPSBmYWNlYXJyOwotICBpZiAoZmFjZS5GaW5kKCJHb3RoaWMiKSA+PSAwIHx8Ci0gICAgICBmYWNlLkZpbmQoIlx4ODNceDUzXHg4M1x4NTZceDgzXHg2Mlx4ODNceDRlIikgPj0gMCkgewotICAgIGlmIChmYWNlLkZpbmQoIlBHb3RoaWMiKSA+PSAwIHx8Ci0gICAgICAgIGZhY2UuRmluZCgiXHg4Mlx4NmZceDgzXHg1M1x4ODNceDU2XHg4M1x4NjJceDgzXHg0ZSIpID49IDApIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gMTsKLSAgfQotICBpZiAoZmFjZS5GaW5kKCJNaW5jaG8iKSA+PSAwIHx8IGZhY2UuRmluZCgiXHg5Nlx4YmVceDkyXHhhOSIpID49IDApIHsKLSAgICBpZiAoZmFjZS5GaW5kKCJQTWluY2hvIikgPj0gMCB8fAotICAgICAgICBmYWNlLkZpbmQoIlx4ODJceDZmXHg5Nlx4YmVceDkyXHhhOSIpID49IDApIHsKLSAgICAgIHJldHVybiAyOwotICAgIH0KLSAgICByZXR1cm4gMzsKLSAgfQotICBpZiAoIShwaXRjaF9mYW1pbHkgJiBGWEZPTlRfRkZfUk9NQU4pICYmIHdlaWdodCA+IDQwMCkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gMjsKLX0KLQotY2xhc3MgQ0ZYX0xpbnV4Rm9udEluZm8gOiBwdWJsaWMgQ0ZYX0ZvbGRlckZvbnRJbmZvIHsKLSBwdWJsaWM6Ci0gIENGWF9MaW51eEZvbnRJbmZvKCkge30KLSAgfkNGWF9MaW51eEZvbnRJbmZvKCkgb3ZlcnJpZGUge30KLQotICB2b2lkKiBNYXBGb250KGludCB3ZWlnaHQsCi0gICAgICAgICAgICAgICAgYm9vbCBiSXRhbGljLAotICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAotICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCi0gICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZmFtaWx5LAotICAgICAgICAgICAgICAgIGludCYgaUV4YWN0KSBvdmVycmlkZTsKLSAgYm9vbCBQYXJzZUZvbnRDZmcoY29uc3QgY2hhcioqIHBVc2VyUGF0aHMpOwotfTsKLQotdm9pZCogQ0ZYX0xpbnV4Rm9udEluZm86Ok1hcEZvbnQoaW50IHdlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkl0YWxpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpdGNoX2ZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGNzdHJfZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgaUV4YWN0KSB7Ci0gIHZvaWQqIGZvbnQgPSBHZXRTdWJzdEZvbnQoY3N0cl9mYWNlKTsKLSAgaWYgKGZvbnQpIHsKLSAgICBpRXhhY3QgPSAxOwotICAgIHJldHVybiBmb250OwotICB9Ci0gIGJvb2wgYkNKSyA9IHRydWU7Ci0gIHN3aXRjaCAoY2hhcnNldCkgewotICAgIGNhc2UgRlhGT05UX1NISUZUSklTX0NIQVJTRVQ6IHsKLSAgICAgIHNpemVfdCBpbmRleCA9IEdldEphcGFuZXNlUHJlZmVyZW5jZShjc3RyX2ZhY2UsIHdlaWdodCwgcGl0Y2hfZmFtaWx5KTsKLSAgICAgIEFTU0VSVChpbmRleCA8IEZYX0FycmF5U2l6ZShnX0xpbnV4R3BGb250TGlzdCkpOwotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTGludXhHcE5hbWVTaXplOyBpKyspIHsKLSAgICAgICAgYXV0byBpdCA9IG1fRm9udExpc3QuZmluZChnX0xpbnV4R3BGb250TGlzdFtpbmRleF1baV0pOwotICAgICAgICBpZiAoaXQgIT0gbV9Gb250TGlzdC5lbmQoKSkKLSAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZYRk9OVF9HQjIzMTJfQ0hBUlNFVDogewotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZ19MaW51eEdiRm9udExpc3QpOyArK2kpIHsKLSAgICAgICAgYXV0byBpdCA9IG1fRm9udExpc3QuZmluZChnX0xpbnV4R2JGb250TGlzdFtpXSk7Ci0gICAgICAgIGlmIChpdCAhPSBtX0ZvbnRMaXN0LmVuZCgpKQotICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQ6IHsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGdfTGludXhCNUZvbnRMaXN0KTsgKytpKSB7Ci0gICAgICAgIGF1dG8gaXQgPSBtX0ZvbnRMaXN0LmZpbmQoZ19MaW51eEI1Rm9udExpc3RbaV0pOwotICAgICAgICBpZiAoaXQgIT0gbV9Gb250TGlzdC5lbmQoKSkKLSAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZYRk9OVF9IQU5HVUxfQ0hBUlNFVDogewotICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZ19MaW51eEhHRm9udExpc3QpOyArK2kpIHsKLSAgICAgICAgYXV0byBpdCA9IG1fRm9udExpc3QuZmluZChnX0xpbnV4SEdGb250TGlzdFtpXSk7Ci0gICAgICAgIGlmIChpdCAhPSBtX0ZvbnRMaXN0LmVuZCgpKQotICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBiQ0pLID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gRmluZEZvbnQod2VpZ2h0LCBiSXRhbGljLCBjaGFyc2V0LCBwaXRjaF9mYW1pbHksIGNzdHJfZmFjZSwgIWJDSkspOwotfQotCi1ib29sIENGWF9MaW51eEZvbnRJbmZvOjpQYXJzZUZvbnRDZmcoY29uc3QgY2hhcioqIHBVc2VyUGF0aHMpIHsKLSAgaWYgKCFwVXNlclBhdGhzKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKGNvbnN0IGNoYXIqKiBwUGF0aCA9IHBVc2VyUGF0aHM7ICpwUGF0aDsgKytwUGF0aCkKLSAgICBBZGRQYXRoKCpwUGF0aCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotc3RkOjp1bmlxdWVfcHRyPElGWF9TeXN0ZW1Gb250SW5mbz4gSUZYX1N5c3RlbUZvbnRJbmZvOjpDcmVhdGVEZWZhdWx0KAotICAgIGNvbnN0IGNoYXIqKiBwVXNlclBhdGhzKSB7Ci0gIENGWF9MaW51eEZvbnRJbmZvKiBwSW5mbyA9IG5ldyBDRlhfTGludXhGb250SW5mbzsKLSAgaWYgKCFwSW5mby0+UGFyc2VGb250Q2ZnKHBVc2VyUGF0aHMpKSB7Ci0gICAgcEluZm8tPkFkZFBhdGgoIi91c3Ivc2hhcmUvZm9udHMiKTsKLSAgICBwSW5mby0+QWRkUGF0aCgiL3Vzci9zaGFyZS9YMTEvZm9udHMvVHlwZTEiKTsKLSAgICBwSW5mby0+QWRkUGF0aCgiL3Vzci9zaGFyZS9YMTEvZm9udHMvVFRGIik7Ci0gICAgcEluZm8tPkFkZFBhdGgoIi91c3IvbG9jYWwvc2hhcmUvZm9udHMiKTsKLSAgfQotICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPElGWF9TeXN0ZW1Gb250SW5mbz4ocEluZm8pOwotfQotCi12b2lkIENGWF9HRU1vZHVsZTo6SW5pdFBsYXRmb3JtKCkgewotICBtX3BGb250TWdyLT5TZXRTeXN0ZW1Gb250SW5mbygKLSAgICAgIElGWF9TeXN0ZW1Gb250SW5mbzo6Q3JlYXRlRGVmYXVsdChtX3BVc2VyRm9udFBhdGhzKSk7Ci19Ci0KLXZvaWQgQ0ZYX0dFTW9kdWxlOjpEZXN0cm95UGxhdGZvcm0oKSB7fQotI2VuZGlmICAvLyBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0xJTlVYXwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2dlL2Z4X2dlX3RleHQuY3BwIGIvY29yZS9meGdlL2dlL2Z4X2dlX3RleHQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njk5NjlkLi4wMDAwMDAwCi0tLSBhL2NvcmUvZnhnZS9nZS9meF9nZV90ZXh0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9meF9jb2RlYy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc2FmZV90eXBlcy5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcGF0aGRhdGEuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZ2UvZnhfdGV4dF9pbnQuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvaWZ4X3JlbmRlcmRldmljZWRyaXZlci5oIgotCi1uYW1lc3BhY2UgewotCi12b2lkIFJlc2V0VHJhbnNmb3JtKEZUX0ZhY2UgZmFjZSkgewotICBGWEZUX01hdHJpeCBtYXRyaXg7Ci0gIG1hdHJpeC54eCA9IDB4MTAwMDBMOwotICBtYXRyaXgueHkgPSAwOwotICBtYXRyaXgueXggPSAwOwotICBtYXRyaXgueXkgPSAweDEwMDAwTDsKLSAgRlhGVF9TZXRfVHJhbnNmb3JtKGZhY2UsICZtYXRyaXgsIDApOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotRlhURVhUX0dMWVBIUE9TOjpGWFRFWFRfR0xZUEhQT1MoKSA6IG1fcEdseXBoKG51bGxwdHIpIHt9Ci0KLUZYVEVYVF9HTFlQSFBPUzo6RlhURVhUX0dMWVBIUE9TKGNvbnN0IEZYVEVYVF9HTFlQSFBPUyYpID0gZGVmYXVsdDsKLQotRlhURVhUX0dMWVBIUE9TOjp+RlhURVhUX0dMWVBIUE9TKCl7fTsKLQotU2NvcGVkRm9udFRyYW5zZm9ybTo6U2NvcGVkRm9udFRyYW5zZm9ybShGVF9GYWNlIGZhY2UsIEZYRlRfTWF0cml4KiBtYXRyaXgpCi0gICAgOiBtX0ZhY2UoZmFjZSkgewotICBGWEZUX1NldF9UcmFuc2Zvcm0obV9GYWNlLCBtYXRyaXgsIDApOwotfQotCi1TY29wZWRGb250VHJhbnNmb3JtOjp+U2NvcGVkRm9udFRyYW5zZm9ybSgpIHsKLSAgUmVzZXRUcmFuc2Zvcm0obV9GYWNlKTsKLX0KLQotRlhfUkVDVCBGWEdFX0dldEdseXBoc0JCb3goY29uc3Qgc3RkOjp2ZWN0b3I8RlhURVhUX0dMWVBIUE9TPiYgZ2x5cGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFudGlfYWxpYXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCByZXRpbmFTY2FsZVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCByZXRpbmFTY2FsZVkpIHsKLSAgRlhfUkVDVCByZWN0KDAsIDAsIDAsIDApOwotICBib29sIGJTdGFydGVkID0gZmFsc2U7Ci0gIGZvciAoY29uc3QgRlhURVhUX0dMWVBIUE9TJiBnbHlwaCA6IGdseXBocykgewotICAgIGNvbnN0IENGWF9HbHlwaEJpdG1hcCogcEdseXBoID0gZ2x5cGgubV9wR2x5cGg7Ci0gICAgaWYgKCFwR2x5cGgpCi0gICAgICBjb250aW51ZTsKLQotICAgIEZYX1NBRkVfSU5UMzIgY2hhcl9sZWZ0ID0gZ2x5cGgubV9PcmlnaW4ueDsKLSAgICBjaGFyX2xlZnQgKz0gcEdseXBoLT5tX0xlZnQ7Ci0gICAgaWYgKCFjaGFyX2xlZnQuSXNWYWxpZCgpKQotICAgICAgY29udGludWU7Ci0KLSAgICBGWF9TQUZFX0lOVDMyIGNoYXJfd2lkdGggPSBwR2x5cGgtPm1fQml0bWFwLkdldFdpZHRoKCk7Ci0gICAgY2hhcl93aWR0aCAvPSByZXRpbmFTY2FsZVg7Ci0gICAgaWYgKGFudGlfYWxpYXMgPT0gRlhGVF9SRU5ERVJfTU9ERV9MQ0QpCi0gICAgICBjaGFyX3dpZHRoIC89IDM7Ci0gICAgaWYgKCFjaGFyX3dpZHRoLklzVmFsaWQoKSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgRlhfU0FGRV9JTlQzMiBjaGFyX3JpZ2h0ID0gY2hhcl9sZWZ0ICsgY2hhcl93aWR0aDsKLSAgICBpZiAoIWNoYXJfcmlnaHQuSXNWYWxpZCgpKQotICAgICAgY29udGludWU7Ci0KLSAgICBGWF9TQUZFX0lOVDMyIGNoYXJfdG9wID0gZ2x5cGgubV9PcmlnaW4ueTsKLSAgICBjaGFyX3RvcCAtPSBwR2x5cGgtPm1fVG9wOwotICAgIGlmICghY2hhcl90b3AuSXNWYWxpZCgpKQotICAgICAgY29udGludWU7Ci0KLSAgICBGWF9TQUZFX0lOVDMyIGNoYXJfaGVpZ2h0ID0gcEdseXBoLT5tX0JpdG1hcC5HZXRIZWlnaHQoKTsKLSAgICBjaGFyX2hlaWdodCAvPSByZXRpbmFTY2FsZVk7Ci0gICAgaWYgKCFjaGFyX2hlaWdodC5Jc1ZhbGlkKCkpCi0gICAgICBjb250aW51ZTsKLQotICAgIEZYX1NBRkVfSU5UMzIgY2hhcl9ib3R0b20gPSBjaGFyX3RvcCArIGNoYXJfaGVpZ2h0OwotICAgIGlmICghY2hhcl9ib3R0b20uSXNWYWxpZCgpKQotICAgICAgY29udGludWU7Ci0KLSAgICBpZiAoYlN0YXJ0ZWQpIHsKLSAgICAgIHJlY3QubGVmdCA9IHBkZml1bTo6YmFzZTo6VmFsdWVPckRpZUZvclR5cGU8aW50MzJfdD4oCi0gICAgICAgICAgcGRmaXVtOjpiYXNlOjpDaGVja01pbihyZWN0LmxlZnQsIGNoYXJfbGVmdCkpOwotICAgICAgcmVjdC5yaWdodCA9IHBkZml1bTo6YmFzZTo6VmFsdWVPckRpZUZvclR5cGU8aW50MzJfdD4oCi0gICAgICAgICAgcGRmaXVtOjpiYXNlOjpDaGVja01heChyZWN0LnJpZ2h0LCBjaGFyX3JpZ2h0KSk7Ci0gICAgICByZWN0LnRvcCA9IHBkZml1bTo6YmFzZTo6VmFsdWVPckRpZUZvclR5cGU8aW50MzJfdD4oCi0gICAgICAgICAgcGRmaXVtOjpiYXNlOjpDaGVja01pbihyZWN0LnRvcCwgY2hhcl90b3ApKTsKLSAgICAgIHJlY3QuYm90dG9tID0gcGRmaXVtOjpiYXNlOjpWYWx1ZU9yRGllRm9yVHlwZTxpbnQzMl90PigKLSAgICAgICAgICBwZGZpdW06OmJhc2U6OkNoZWNrTWF4KHJlY3QuYm90dG9tLCBjaGFyX2JvdHRvbSkpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgcmVjdC5sZWZ0ID0gY2hhcl9sZWZ0LlZhbHVlT3JEaWUoKTsKLSAgICByZWN0LnJpZ2h0ID0gY2hhcl9yaWdodC5WYWx1ZU9yRGllKCk7Ci0gICAgcmVjdC50b3AgPSBjaGFyX3RvcC5WYWx1ZU9yRGllKCk7Ci0gICAgcmVjdC5ib3R0b20gPSBjaGFyX2JvdHRvbS5WYWx1ZU9yRGllKCk7Ci0gICAgYlN0YXJ0ZWQgPSB0cnVlOwotICB9Ci0gIHJldHVybiByZWN0OwotfQotCi1DRlhfU2l6ZUdseXBoQ2FjaGU6OkNGWF9TaXplR2x5cGhDYWNoZSgpIHt9Ci0KLUNGWF9TaXplR2x5cGhDYWNoZTo6fkNGWF9TaXplR2x5cGhDYWNoZSgpIHsKLSAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbV9HbHlwaE1hcCkgewotICAgIGRlbGV0ZSBwYWlyLnNlY29uZDsKLSAgfQotICBtX0dseXBoTWFwLmNsZWFyKCk7Ci19Ci0KLXZvaWQgX0NGWF9VbmlxdWVLZXlHZW46OkdlbmVyYXRlKGludCBjb3VudCwgLi4uKSB7Ci0gIHZhX2xpc3QgYXJnTGlzdDsKLSAgdmFfc3RhcnQoYXJnTGlzdCwgY291bnQpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICBpbnQgcCA9IHZhX2FyZyhhcmdMaXN0LCBpbnQpOwotICAgICgodWludDMyX3QqKW1fS2V5KVtpXSA9IHA7Ci0gIH0KLSAgdmFfZW5kKGFyZ0xpc3QpOwotICBtX0tleUxlbiA9IGNvdW50ICogc2l6ZW9mKHVpbnQzMl90KTsKLX0KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9nZS9meF90ZXh0X2ludC5oIGIvY29yZS9meGdlL2dlL2Z4X3RleHRfaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZTY1ODcuLjAwMDAwMDAKLS0tIGEvY29yZS9meGdlL2dlL2Z4X3RleHRfaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgQ09SRV9GWEdFX0dFX0ZYX1RFWFRfSU5UX0hfCi0jZGVmaW5lIENPUkVfRlhHRV9HRV9GWF9URVhUX0lOVF9IXwotCi0jaW5jbHVkZSA8bWFwPgotCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZvbnQuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZnJlZXR5cGUuaCIKLQotc3RydWN0IF9DRlhfVW5pcXVlS2V5R2VuIHsKLSAgdm9pZCBHZW5lcmF0ZShpbnQgY291bnQsIC4uLik7Ci0gIEZYX0NIQVIgbV9LZXlbMTI4XTsKLSAgaW50IG1fS2V5TGVuOwotfTsKLQotY2xhc3MgQ0ZYX1NpemVHbHlwaENhY2hlIHsKLSBwdWJsaWM6Ci0gIENGWF9TaXplR2x5cGhDYWNoZSgpOwotICB+Q0ZYX1NpemVHbHlwaENhY2hlKCk7Ci0gIHN0ZDo6bWFwPHVpbnQzMl90LCBDRlhfR2x5cGhCaXRtYXAqPiBtX0dseXBoTWFwOwotfTsKLQotI2VuZGlmICAvLyBDT1JFX0ZYR0VfR0VfRlhfVEVYVF9JTlRfSF8KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9pZnhfcmVuZGVyZGV2aWNlZHJpdmVyLmNwcCBiL2NvcmUvZnhnZS9pZnhfcmVuZGVyZGV2aWNlZHJpdmVyLmNwcAppbmRleCA3N2FmMDBmLi5lYWU3NzNkIDEwMDY0NAotLS0gYS9jb3JlL2Z4Z2UvaWZ4X3JlbmRlcmRldmljZWRyaXZlci5jcHAKKysrIGIvY29yZS9meGdlL2lmeF9yZW5kZXJkZXZpY2Vkcml2ZXIuY3BwCkBAIC04LDcgKzgsNyBAQAogCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcGF0aGRhdGEuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2RpYml0bWFwLmgiCiAKIElGWF9SZW5kZXJEZXZpY2VEcml2ZXI6On5JRlhfUmVuZGVyRGV2aWNlRHJpdmVyKCkge30KIApAQCAtMzksNDQgKzM5LDM3IEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyOjpEcmF3Q29zbWV0aWNMaW5lKEZYX0ZMT0FUIHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkyLAorYm9vbCBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyOjpEcmF3Q29zbWV0aWNMaW5lKGNvbnN0IENGWF9Qb2ludEYmIHB0TW92ZVRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0TGluZVRvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7CiAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyOjpHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorYm9vbCBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyOjpHZXRESUJpdHMoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3ApIHsKICAgcmV0dXJuIGZhbHNlOwogfQogCi1DRlhfRElCaXRtYXAqIElGWF9SZW5kZXJEZXZpY2VEcml2ZXI6OkdldEJhY2tEcm9wKCkgewotICByZXR1cm4gbnVsbHB0cjsKK1JldGFpblB0cjxDRlhfRElCaXRtYXA+IElGWF9SZW5kZXJEZXZpY2VEcml2ZXI6OkdldEJhY2tEcm9wKCkgeworICByZXR1cm4gUmV0YWluUHRyPENGWF9ESUJpdG1hcD4oKTsKIH0KIAotYm9vbCBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyOjpDb250aW51ZURJQml0cyh2b2lkKiBoYW5kbGUsIElGWF9QYXVzZSogcFBhdXNlKSB7Citib29sIElGWF9SZW5kZXJEZXZpY2VEcml2ZXI6OkNvbnRpbnVlRElCaXRzKENGWF9JbWFnZVJlbmRlcmVyKiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZUluZGljYXRvciogcFBhdXNlKSB7CiAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyOjpDYW5jZWxESUJpdHModm9pZCogaGFuZGxlKSB7fQotCiBib29sIElGWF9SZW5kZXJEZXZpY2VEcml2ZXI6OkRyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yKSB7CiAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCogSUZYX1JlbmRlckRldmljZURyaXZlcjo6R2V0UGxhdGZvcm1TdXJmYWNlKCkgY29uc3QgewotICByZXR1cm4gbnVsbHB0cjsKLX0KLQogaW50IElGWF9SZW5kZXJEZXZpY2VEcml2ZXI6OkdldERyaXZlclR5cGUoKSBjb25zdCB7CiAgIHJldHVybiAwOwogfQpAQCAtOTEsMTIgKzg0LDEzIEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyOjpTZXRCaXRzV2l0aE1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7Citib29sIElGWF9SZW5kZXJEZXZpY2VEcml2ZXI6OlNldEJpdHNXaXRoTWFzaygKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXAsCisgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwTWFzaywKKyAgICBpbnQgbGVmdCwKKyAgICBpbnQgdG9wLAorICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgaW50IGJsZW5kX3R5cGUpIHsKICAgcmV0dXJuIGZhbHNlOwogfQogCmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2UvaWZ4X3JlbmRlcmRldmljZWRyaXZlci5oIGIvY29yZS9meGdlL2lmeF9yZW5kZXJkZXZpY2Vkcml2ZXIuaAppbmRleCBmZDM1MTQ5Li5lOTQ5OGJkIDEwMDY0NAotLS0gYS9jb3JlL2Z4Z2UvaWZ4X3JlbmRlcmRldmljZWRyaXZlci5oCisrKyBiL2NvcmUvZnhnZS9pZnhfcmVuZGVyZGV2aWNlZHJpdmVyLmgKQEAgLTcsMTcgKzcsMjIgQEAKICNpZm5kZWYgQ09SRV9GWEdFX0lGWF9SRU5ERVJERVZJQ0VEUklWRVJfSF8KICNkZWZpbmUgQ09SRV9GWEdFX0lGWF9SRU5ERVJERVZJQ0VEUklWRVJfSF8KIAorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgogCiBjbGFzcyBDRlhfRElCaXRtYXA7CiBjbGFzcyBDRlhfRElCU291cmNlOwogY2xhc3MgQ0ZYX0ZvbnQ7CiBjbGFzcyBDRlhfR3JhcGhTdGF0ZURhdGE7CitjbGFzcyBDRlhfSW1hZ2VSZW5kZXJlcjsKIGNsYXNzIENGWF9NYXRyaXg7CiBjbGFzcyBDRlhfUGF0aERhdGE7CiBjbGFzcyBDUERGX1NoYWRpbmdQYXR0ZXJuOwogY2xhc3MgRlhURVhUX0NIQVJQT1M7Ci1jbGFzcyBJRlhfUGF1c2U7CitjbGFzcyBJRlhfUGF1c2VJbmRpY2F0b3I7CiBzdHJ1Y3QgRlhfUkVDVDsKIAogY2xhc3MgSUZYX1JlbmRlckRldmljZURyaXZlciB7CkBAIC00OSwyMyArNTQsMjMgQEAKICAgdmlydHVhbCBib29sIEZpbGxSZWN0V2l0aEJsZW5kKGNvbnN0IEZYX1JFQ1QqIHBSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlsbF9jb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKTsKLSAgdmlydHVhbCBib29sIERyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTIsCisgIHZpcnR1YWwgYm9vbCBEcmF3Q29zbWV0aWNMaW5lKGNvbnN0IENGWF9Qb2ludEYmIHB0TW92ZVRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdExpbmVUbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKTsKIAogICB2aXJ0dWFsIGJvb2wgR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCkgPSAwOwotICB2aXJ0dWFsIGJvb2wgR2V0RElCaXRzKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgaW50IGxlZnQsIGludCB0b3ApOwotICB2aXJ0dWFsIENGWF9ESUJpdG1hcCogR2V0QmFja0Ryb3AoKTsKLSAgdmlydHVhbCBib29sIFNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICB2aXJ0dWFsIGJvb2wgR2V0RElCaXRzKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3ApOworICB2aXJ0dWFsIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IEdldEJhY2tEcm9wKCk7CisgIHZpcnR1YWwgYm9vbCBTZXRESUJpdHMoY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwQml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgIHZpcnR1YWwgYm9vbCBTdHJldGNoRElCaXRzKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcEJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKQEAgLTc0LDIyICs3OSwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgPSAwOwotICB2aXJ0dWFsIGJvb2wgU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgdmlydHVhbCBib29sIFN0YXJ0RElCaXRzKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcEJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0ltYWdlUmVuZGVyZXI+KiBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgPSAwOwotICB2aXJ0dWFsIGJvb2wgQ29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSk7Ci0gIHZpcnR1YWwgdm9pZCBDYW5jZWxESUJpdHModm9pZCogaGFuZGxlKTsKKyAgdmlydHVhbCBib29sIENvbnRpbnVlRElCaXRzKENGWF9JbWFnZVJlbmRlcmVyKiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSk7CiAgIHZpcnR1YWwgYm9vbCBEcmF3RGV2aWNlVGV4dChpbnQgbkNoYXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvcik7Ci0gIHZpcnR1YWwgdm9pZCogR2V0UGxhdGZvcm1TdXJmYWNlKCkgY29uc3Q7CiAgIHZpcnR1YWwgaW50IEdldERyaXZlclR5cGUoKSBjb25zdDsKICAgdmlydHVhbCB2b2lkIENsZWFyRHJpdmVyKCk7CiAgIHZpcnR1YWwgYm9vbCBEcmF3U2hhZGluZyhjb25zdCBDUERGX1NoYWRpbmdQYXR0ZXJuKiBwUGF0dGVybiwKQEAgLTk3LDggKzEwMSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUJiBjbGlwX3JlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWxwaGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJBbHBoYU1vZGUpOwotICB2aXJ0dWFsIGJvb2wgU2V0Qml0c1dpdGhNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcE1hc2ssCisgIHZpcnR1YWwgYm9vbCBTZXRCaXRzV2l0aE1hc2soY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLApkaWZmIC0tZ2l0IGEvY29yZS9meGdlL2lmeF9zeXN0ZW1mb250aW5mby5oIGIvY29yZS9meGdlL2lmeF9zeXN0ZW1mb250aW5mby5oCmluZGV4IDFhYjBhYjYuLjFhZTA5N2IgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhnZS9pZnhfc3lzdGVtZm9udGluZm8uaAorKysgYi9jb3JlL2Z4Z2UvaWZ4X3N5c3RlbWZvbnRpbmZvLmgKQEAgLTEwLDcgKzEwLDYgQEAKICNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnRtYXBwZXIuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZm9udC5oIgogCiBjb25zdCB1aW50MzJfdCBrVGFibGVOQU1FID0gRlhEV09SRF9HRVRfTVNCRklSU1QoIm5hbWUiKTsKIGNvbnN0IHVpbnQzMl90IGtUYWJsZVRUQ0YgPSBGWERXT1JEX0dFVF9NU0JGSVJTVCgidHRjZiIpOwpAQCAtMjAsMTUgKzE5LDE0IEBACiAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8SUZYX1N5c3RlbUZvbnRJbmZvPiBDcmVhdGVEZWZhdWx0KAogICAgICAgY29uc3QgY2hhcioqIHBVc2VyUGF0aHMpOwogCi0gIHZpcnR1YWwgfklGWF9TeXN0ZW1Gb250SW5mbygpIHt9CisgIHZpcnR1YWwgfklGWF9TeXN0ZW1Gb250SW5mbygpID0gZGVmYXVsdDsKIAogICB2aXJ0dWFsIGJvb2wgRW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCogTWFwRm9udChpbnQgd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXRhbGljLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYXJzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCYgaUV4YWN0KSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmYWNlKSA9IDA7CiAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQogICB2aXJ0dWFsIHZvaWQqIE1hcEZvbnRCeVVuaWNvZGUodWludDMyX3QgZHdVbmljb2RlLApAQCAtMzcsMTMgKzM1LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5KTsKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotICB2aXJ0dWFsIHZvaWQqIEdldEZvbnQoY29uc3QgRlhfQ0hBUiogZmFjZSkgPSAwOworICB2aXJ0dWFsIHZvaWQqIEdldEZvbnQoY29uc3QgY2hhciogZmFjZSkgPSAwOwogICB2aXJ0dWFsIHVpbnQzMl90IEdldEZvbnREYXRhKHZvaWQqIGhGb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpID0gMDsKLSAgdmlydHVhbCBib29sIEdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpID0gMDsKKyAgdmlydHVhbCBib29sIEdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBCeXRlU3RyaW5nKiBuYW1lKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50KiBjaGFyc2V0KSA9IDA7CiAgIHZpcnR1YWwgaW50IEdldEZhY2VJbmRleCh2b2lkKiBoRm9udCk7CiAgIHZpcnR1YWwgdm9pZCBEZWxldGVGb250KHZvaWQqIGhGb250KSA9IDA7CiB9OwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL3NraWEvZnhfc2tpYV9kZXZpY2UuY3BwIGIvY29yZS9meGdlL3NraWEvZnhfc2tpYV9kZXZpY2UuY3BwCmluZGV4IGU1MzZiNjcuLmFiOGVmZmYgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhnZS9za2lhL2Z4X3NraWFfZGV2aWNlLmNwcAorKysgYi9jb3JlL2Z4Z2Uvc2tpYS9meF9za2lhX2RldmljZS5jcHAKQEAgLTYsMzEgKzYsMzQgQEAKICNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZXhwaW50ZnVuYy5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZnVuY3Rpb24uaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX21lc2hzdHJlYW0uaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3NhbXBsZWRmdW5jLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zaGFkaW5ncGF0dGVybi5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL3BhZ2VpbnQuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3N0aXRjaGZ1bmMuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW1fYWNjLmgiCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2Z4X2NvZGVjLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9leHRlbnNpb24uaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZnhnZWRldmljZS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZ2Vtb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2RlZmF1bHRyZW5kZXJkZXZpY2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnQuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGVkYXRhLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfYml0bWFwY29tcG9zZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9pbWFnZXJlbmRlcmVyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfaW1hZ2VzdHJldGNoZXIuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2Uvc2tpYS9meF9za2lhX2RldmljZS5oIgotCi0jaWZkZWYgX1NLSUFfU1VQUE9SVF9QQVRIU18KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZ2UvY2Z4X2NsaXByZ24uaCIKLSNlbmRpZiAgLy8gX1NLSUFfU1VQUE9SVF9QQVRIU18KLQorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLQogI2luY2x1ZGUgInRoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9jb3JlL1NrQ2FudmFzLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2NvcmUvU2tDbGlwT3AuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZS9Ta0ltYWdlLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2NvcmUvU2tQYWludC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9jb3JlL1NrUGF0aC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9jb3JlL1NrUlNYZm9ybS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9jb3JlL1NrU2hhZGVyLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2NvcmUvU2tTdHJlYW0uaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZS9Ta1R5cGVmYWNlLmgiCkBAIC0zOCw2ICs0MSwxMCBAQAogI2luY2x1ZGUgInRoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9lZmZlY3RzL1NrR3JhZGllbnRTaGFkZXIuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvcGF0aG9wcy9Ta1BhdGhPcHMuaCIKIAorI2lmZGVmIF9TS0lBX1NVUFBPUlRfUEFUSFNfCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9jbGlwcmduLmgiCisjZW5kaWYgIC8vIF9TS0lBX1NVUFBPUlRfUEFUSFNfCisKICNpZmRlZiBfU0tJQV9TVVBQT1JUXwogI2luY2x1ZGUgInRoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9jb3JlL1NrQ29sb3JGaWx0ZXIuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZS9Ta0NvbG9yUHJpdi5oIgpAQCAtNDgsMTIgKzU1LDEyIEBACiBuYW1lc3BhY2UgewogCiAjaWZkZWYgX1NLSUFfU1VQUE9SVF9QQVRIU18KLXZvaWQgUmdiQnl0ZU9yZGVyVHJhbnNmZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAordm9pZCBSZ2JCeXRlT3JkZXJUcmFuc2ZlckJpdG1hcChjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTcmNCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNyY0JpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19sZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3RvcCkgewogICBpZiAoIXBCaXRtYXApCkBAIC0xMDksNyArMTE2LDcgQEAKICAgICAgICAgfQogICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICBBU1NFUlQoZmFsc2UpOworICAgICAgTk9UUkVBQ0hFRCgpOwogICAgIH0KICAgICByZXR1cm47CiAgIH0KQEAgLTE0NCwxMyArMTUxLDE3IEBACiAgICAgcmV0dXJuOwogICB9CiAKLSAgQVNTRVJUKGZhbHNlKTsKKyAgTk9UUkVBQ0hFRCgpOwogfQogCiAjZW5kaWYgIC8vIF9TS0lBX1NVUFBPUlRfUEFUSFNfCiAKICNkZWZpbmUgU0hPV19TS0lBX1BBVEggMCAgLy8gc2V0IHRvIDEgdG8gcHJpbnQgdGhlIHBhdGggY29udGVudHMKKyNpZiBTSE9XX1NLSUFfUEFUSAorI2RlZmluZSBTSE9XX1NLSUFfUEFUSF9TSE9SVEhBTkQgMCAgLy8gc2V0IHRvIDEgZm9yIGFiYnJldmlhdGVkIHBhdGggY29udGVudHMKKyNlbmRpZgogI2RlZmluZSBEUkFXX1NLSUFfQ0xJUCAwICAvLyBzZXQgdG8gMSB0byBkcmF3IGEgZ3JlZW4gcmVjdGFuZ2xlIGFyb3VuZCB0aGUgY2xpcAorI2RlZmluZSBTSE9XX1RFWFRfR0xZUEhTIDAgIC8vIHNldCB0byAxIHRvIHByaW50IHVuaWNoYXIgZXF1aXZhbGVudCBvZiBnbHlwaAogCiAjaWYgU0hPV19TS0lBX1BBVEgKIHZvaWQgRGVidWdTaG93U2tpYVBhaW50KGNvbnN0IFNrUGFpbnQmIHBhaW50KSB7CkBAIC0xNjEsNjkgKzE3Miw2MyBAQAogICAgICAgICAgICBwYWludC5nZXRTdHJva2VXaWR0aCgpKTsKICAgfQogfQotCi12b2lkIERlYnVnU2hvd0NhbnZhc01hdHJpeChjb25zdCBTa0NhbnZhcyogY2FudmFzKSB7Ci0gIFNrTWF0cml4IG1hdHJpeCA9IGNhbnZhcy0+Z2V0VG90YWxNYXRyaXgoKTsKLSAgU2tTY2FsYXIgbVs5XTsKLSAgbWF0cml4LmdldDkobSk7Ci0gIHByaW50ZigibWF0cml4ICglZywlZywlZykgKCVnLCVnLCVnKSAoJWcsJWcsJWcpXG4iLCBtWzBdLCBtWzFdLCBtWzJdLCBtWzNdLAotICAgICAgICAgbVs0XSwgbVs1XSwgbVs2XSwgbVs3XSwgbVs4XSk7Ci19CiAjZW5kaWYgIC8vIFNIT1dfU0tJQV9QQVRICiAKIHZvaWQgRGVidWdTaG93U2tpYVBhdGgoY29uc3QgU2tQYXRoJiBwYXRoKSB7CiAjaWYgU0hPV19TS0lBX1BBVEgKLSAgY2hhciBidWZmZXJbNDA5Nl07Ci0gIHNrX2J6ZXJvKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwotICBTa01lbW9yeVdTdHJlYW0gc3RyZWFtKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworI2lmIFNIT1dfU0tJQV9QQVRIX1NIT1JUSEFORAorICBwcmludGYoIiAqKlxuIik7CisjZWxzZQorICBTa0R5bmFtaWNNZW1vcnlXU3RyZWFtIHN0cmVhbTsKICAgcGF0aC5kdW1wKCZzdHJlYW0sIGZhbHNlLCBmYWxzZSk7Ci0gIHByaW50ZigiJXMiLCBidWZmZXIpOworICBzdGQ6OnVuaXF1ZV9wdHI8Y2hhciwgRnhGcmVlRGVsZXRlcj4gc3RvcmFnZTsKKyAgc3RvcmFnZS5yZXNldChGWF9BbGxvYyhjaGFyLCBzdHJlYW0uYnl0ZXNXcml0dGVuKCkpKTsKKyAgc3RyZWFtLmNvcHlUbyhzdG9yYWdlLmdldCgpKTsKKyAgcHJpbnRmKCIlLipzIiwgKGludClzdHJlYW0uYnl0ZXNXcml0dGVuKCksIHN0b3JhZ2UuZ2V0KCkpOworI2VuZGlmICAvLyBTSE9XX1NLSUFfUEFUSF9TSE9SVEhBTkQKICNlbmRpZiAgLy8gU0hPV19TS0lBX1BBVEgKIH0KIAotdm9pZCBEZWJ1Z1Nob3dDYW52YXNDbGlwKGNvbnN0IFNrQ2FudmFzKiBjYW52YXMpIHsKK3ZvaWQgRGVidWdTaG93Q2FudmFzQ2xpcChDRlhfU2tpYURldmljZURyaXZlciogZHJpdmVyLCBjb25zdCBTa0NhbnZhcyogY2FudmFzKSB7CiAjaWYgU0hPV19TS0lBX1BBVEgKLSAgU2tSZWN0IGxvY2FsOwotICBTa0lSZWN0IGRldmljZTsKLSAgY2FudmFzLT5nZXRDbGlwQm91bmRzKCZsb2NhbCk7CisgIFNrTWF0cml4IG1hdHJpeCA9IGNhbnZhcy0+Z2V0VG90YWxNYXRyaXgoKTsKKyAgU2tTY2FsYXIgbVs5XTsKKyAgbWF0cml4LmdldDkobSk7CisgIHByaW50ZigibWF0cml4ICglZywlZywlZykgKCVnLCVnLCVnKSAoJWcsJWcsJWcpXG4iLCBtWzBdLCBtWzFdLCBtWzJdLCBtWzNdLAorICAgICAgICAgbVs0XSwgbVs1XSwgbVs2XSwgbVs3XSwgbVs4XSk7CisgIFNrUmVjdCBsb2NhbCA9IGNhbnZhcy0+Z2V0TG9jYWxDbGlwQm91bmRzKCk7CisgIFNrSVJlY3QgZGV2aWNlID0gY2FudmFzLT5nZXREZXZpY2VDbGlwQm91bmRzKCk7CisKICAgcHJpbnRmKCJsb2NhbCBib3VuZHMgJWcgJWcgJWcgJWdcbiIsIGxvY2FsLmZMZWZ0LCBsb2NhbC5mVG9wLCBsb2NhbC5mUmlnaHQsCiAgICAgICAgICBsb2NhbC5mQm90dG9tKTsKLSAgY2FudmFzLT5nZXRDbGlwRGV2aWNlQm91bmRzKCZkZXZpY2UpOwogICBwcmludGYoImRldmljZSBib3VuZHMgJWQgJWQgJWQgJWRcbiIsIGRldmljZS5mTGVmdCwgZGV2aWNlLmZUb3AsCiAgICAgICAgICBkZXZpY2UuZlJpZ2h0LCBkZXZpY2UuZkJvdHRvbSk7CisgIEZYX1JFQ1QgY2xpcEJveDsKKyAgZHJpdmVyLT5HZXRDbGlwQm94KCZjbGlwQm94KTsKKyAgcHJpbnRmKCJyZXBvcnRlZCBib3VuZHMgJWQgJWQgJWQgJWRcbiIsIGNsaXBCb3gubGVmdCwgY2xpcEJveC50b3AsCisgICAgICAgICBjbGlwQm94LnJpZ2h0LCBjbGlwQm94LmJvdHRvbSk7CiAjZW5kaWYgIC8vIFNIT1dfU0tJQV9QQVRICiB9CiAKLSNpZiBTSE9XX1NLSUFfUEFUSAotdm9pZCBEZWJ1Z1Nob3dTa2lhUGFpbnQoY29uc3QgU2tQYWludCYgcGFpbnQpIHsKLSAgaWYgKFNrUGFpbnQ6OmtGaWxsX1N0eWxlID09IHBhaW50LmdldFN0eWxlKCkpIHsKLSAgICBwcmludGYoImZpbGwgMHglMDh4XG4iLCBwYWludC5nZXRDb2xvcigpKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGYoInN0cm9rZSAweCUwOHggd2lkdGggJWdcbiIsIHBhaW50LmdldENvbG9yKCksCi0gICAgICAgICAgIHBhaW50LmdldFN0cm9rZVdpZHRoKCkpOwotICB9Ci19Ci0jZW5kaWYgIC8vIFNIT1dfU0tJQV9QQVRICi0KLXZvaWQgRGVidWdTaG93U2tpYURyYXdQYXRoKGNvbnN0IFNrQ2FudmFzKiBjYW52YXMsCit2b2lkIERlYnVnU2hvd1NraWFEcmF3UGF0aChDRlhfU2tpYURldmljZURyaXZlciogZHJpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tDYW52YXMqIGNhbnZhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNrUGFpbnQmIHBhaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tQYXRoJiBwYXRoKSB7CiAjaWYgU0hPV19TS0lBX1BBVEgKICAgRGVidWdTaG93U2tpYVBhaW50KHBhaW50KTsKLSAgRGVidWdTaG93Q2FudmFzTWF0cml4KGNhbnZhcyk7Ci0gIERlYnVnU2hvd0NhbnZhc0NsaXAoY2FudmFzKTsKKyAgRGVidWdTaG93Q2FudmFzQ2xpcChkcml2ZXIsIGNhbnZhcyk7CiAgIERlYnVnU2hvd1NraWFQYXRoKHBhdGgpOwogICBwcmludGYoIlxuIik7CiAjZW5kaWYgIC8vIFNIT1dfU0tJQV9QQVRICiB9CiAKLXZvaWQgRGVidWdTaG93U2tpYURyYXdSZWN0KGNvbnN0IFNrQ2FudmFzKiBjYW52YXMsCit2b2lkIERlYnVnU2hvd1NraWFEcmF3UmVjdChDRlhfU2tpYURldmljZURyaXZlciogZHJpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tDYW52YXMqIGNhbnZhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNrUGFpbnQmIHBhaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tSZWN0JiByZWN0KSB7CiAjaWYgU0hPV19TS0lBX1BBVEgKICAgRGVidWdTaG93U2tpYVBhaW50KHBhaW50KTsKLSAgRGVidWdTaG93Q2FudmFzTWF0cml4KGNhbnZhcyk7Ci0gIERlYnVnU2hvd0NhbnZhc0NsaXAoY2FudmFzKTsKKyAgRGVidWdTaG93Q2FudmFzQ2xpcChkcml2ZXIsIGNhbnZhcyk7CiAgIHByaW50ZigicmVjdCAlZyAlZyAlZyAlZ1xuIiwgcmVjdC5mTGVmdCwgcmVjdC5mVG9wLCByZWN0LmZSaWdodCwKICAgICAgICAgIHJlY3QuZkJvdHRvbSk7CiAjZW5kaWYgIC8vIFNIT1dfU0tJQV9QQVRICkBAIC0yNTgsMTggKzI2MywxOCBAQAogI2VuZGlmICAvLyBEUkFXX1NLSUFfQ0xJUAogCiAjaWZkZWYgX1NLSUFfU1VQUE9SVF8KLXN0YXRpYyB2b2lkIERlYnVnVmFsaWRhdGUoY29uc3QgQ0ZYX0RJQml0bWFwKiBiaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCogZGV2aWNlKSB7CitzdGF0aWMgdm9pZCBEZWJ1Z1ZhbGlkYXRlKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBkZXZpY2UpIHsKICAgaWYgKGJpdG1hcCkgewogICAgIFNrQVNTRVJUKGJpdG1hcC0+R2V0QlBQKCkgPT0gOCB8fCBiaXRtYXAtPkdldEJQUCgpID09IDMyKTsKICAgICBpZiAoYml0bWFwLT5HZXRCUFAoKSA9PSAzMikgewotICAgICAgYml0bWFwLT5EZWJ1Z1ZlcmlmeUJpdG1hcElzUHJlTXVsdGlwbGllZCgpOworICAgICAgYml0bWFwLT5EZWJ1Z1ZlcmlmeUJpdG1hcElzUHJlTXVsdGlwbGllZChudWxscHRyKTsKICAgICB9CiAgIH0KICAgaWYgKGRldmljZSkgewogICAgIFNrQVNTRVJUKGRldmljZS0+R2V0QlBQKCkgPT0gOCB8fCBkZXZpY2UtPkdldEJQUCgpID09IDMyKTsKICAgICBpZiAoZGV2aWNlLT5HZXRCUFAoKSA9PSAzMikgewotICAgICAgZGV2aWNlLT5EZWJ1Z1ZlcmlmeUJpdG1hcElzUHJlTXVsdGlwbGllZCgpOworICAgICAgZGV2aWNlLT5EZWJ1Z1ZlcmlmeUJpdG1hcElzUHJlTXVsdGlwbGllZChudWxscHRyKTsKICAgICB9CiAgIH0KIH0KQEAgLTM2OCw3ICszNzMsNyBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotdWludDhfdCBGbG9hdFRvQnl0ZShGWF9GTE9BVCBmKSB7Cit1aW50OF90IEZsb2F0VG9CeXRlKGZsb2F0IGYpIHsKICAgQVNTRVJUKDAgPD0gZiAmJiBmIDw9IDEpOwogICByZXR1cm4gKHVpbnQ4X3QpKGYgKiAyNTUuOTlmKTsKIH0KQEAgLTM5NSwyNSArNDAwLDI1IEBACiAgIGlmIChwRnVuYy0+R2V0U2FtcGxlU3RyZWFtKCktPkdldFNpemUoKSA8IHNhbXBsZUNvdW50ICogMyAqIHNhbXBsZVNpemUgLyA4KQogICAgIHJldHVybiBmYWxzZTsKIAotICBGWF9GTE9BVCBjb2xvcnNNaW5bM107Ci0gIEZYX0ZMT0FUIGNvbG9yc01heFszXTsKKyAgZmxvYXQgY29sb3JzTWluWzNdOworICBmbG9hdCBjb2xvcnNNYXhbM107CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7CiAgICAgY29sb3JzTWluW2ldID0gcEZ1bmMtPkdldFJhbmdlKGkgKiAyKTsKICAgICBjb2xvcnNNYXhbaV0gPSBwRnVuYy0+R2V0UmFuZ2UoaSAqIDIgKyAxKTsKICAgfQogICBjb25zdCB1aW50OF90KiBwU2FtcGxlRGF0YSA9IHBGdW5jLT5HZXRTYW1wbGVTdHJlYW0oKS0+R2V0RGF0YSgpOwogICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgc2FtcGxlQ291bnQ7ICsraSkgewotICAgIEZYX0ZMT0FUIGZsb2F0Q29sb3JzWzNdOworICAgIGZsb2F0IGZsb2F0Q29sb3JzWzNdOwogICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCAzOyArK2opIHsKICAgICAgIGludCBzYW1wbGUgPSBHZXRCaXRzMzIocFNhbXBsZURhdGEsIChpICogMyArIGopICogc2FtcGxlU2l6ZSwgc2FtcGxlU2l6ZSk7Ci0gICAgICBGWF9GTE9BVCBpbnRlcnAgPSAoRlhfRkxPQVQpc2FtcGxlIC8gKHNhbXBsZUNvdW50IC0gMSk7CisgICAgICBmbG9hdCBpbnRlcnAgPSAoZmxvYXQpc2FtcGxlIC8gKHNhbXBsZUNvdW50IC0gMSk7CiAgICAgICBmbG9hdENvbG9yc1tqXSA9IGNvbG9yc01pbltqXSArIChjb2xvcnNNYXhbal0gLSBjb2xvcnNNaW5bal0pICogaW50ZXJwOwogICAgIH0KICAgICBTa0NvbG9yIGNvbG9yID0KICAgICAgICAgU2tQYWNrQVJHQjMyKDB4RkYsIEZsb2F0VG9CeXRlKGZsb2F0Q29sb3JzWzBdKSwKICAgICAgICAgICAgICAgICAgICAgIEZsb2F0VG9CeXRlKGZsb2F0Q29sb3JzWzFdKSwgRmxvYXRUb0J5dGUoZmxvYXRDb2xvcnNbMl0pKTsKICAgICBza0NvbG9ycy0+cHVzaChjb2xvcik7Ci0gICAgc2tQb3MtPnB1c2goKEZYX0ZMT0FUKWkgLyAoc2FtcGxlQ291bnQgLSAxKSk7CisgICAgc2tQb3MtPnB1c2goKGZsb2F0KWkgLyAoc2FtcGxlQ291bnQgLSAxKSk7CiAgIH0KICAgcmV0dXJuIHRydWU7CiB9CkBAIC00MjEsNyArNDI2LDcgQEAKIGJvb2wgQWRkU3RpdGNoaW5nKGNvbnN0IENQREZfU3RpdGNoRnVuYyogcEZ1bmMsCiAgICAgICAgICAgICAgICAgICBTa1REQXJyYXk8U2tDb2xvcj4qIHNrQ29sb3JzLAogICAgICAgICAgICAgICAgICAgU2tUREFycmF5PFNrU2NhbGFyPiogc2tQb3MpIHsKLSAgRlhfRkxPQVQgYm91bmRzU3RhcnQgPSBwRnVuYy0+R2V0RG9tYWluKDApOworICBmbG9hdCBib3VuZHNTdGFydCA9IHBGdW5jLT5HZXREb21haW4oMCk7CiAKICAgY29uc3QgYXV0byYgc3ViRnVuY3Rpb25zID0gcEZ1bmMtPkdldFN1YkZ1bmN0aW9ucygpOwogICBpbnQgc3ViRnVuY3Rpb25Db3VudCA9IHN1YkZ1bmN0aW9ucy5zaXplKCk7CkBAIC00MzEsNyArNDM2LDcgQEAKICAgICAgIHJldHVybiBmYWxzZTsKICAgICBpZiAoIUFkZENvbG9ycyhwU3ViRnVuYywgc2tDb2xvcnMpKQogICAgICAgcmV0dXJuIGZhbHNlOwotICAgIEZYX0ZMT0FUIGJvdW5kc0VuZCA9CisgICAgZmxvYXQgYm91bmRzRW5kID0KICAgICAgICAgaSA8IHN1YkZ1bmN0aW9uQ291bnQgLSAxID8gcEZ1bmMtPkdldEJvdW5kKGkgKyAxKSA6IHBGdW5jLT5HZXREb21haW4oMSk7CiAgICAgc2tQb3MtPnB1c2goYm91bmRzU3RhcnQpOwogICAgIHNrUG9zLT5wdXNoKGJvdW5kc0VuZCk7CkBAIC01MjIsOCArNTI3LDEwIEBACiAgICAgICBtYXhCb3VuZHMgPSBpOwogICAgIH0KICAgfQotICBBU1NFUlQobWluQm91bmRzID49IDApOwotICBBU1NFUlQobWF4Qm91bmRzICE9IG1pbkJvdW5kcyAmJiBtYXhCb3VuZHMgPj0gMCk7CisgIGlmIChtaW5Cb3VuZHMgPCAwIHx8IG1heEJvdW5kcyA8IDApCisgICAgcmV0dXJuOworICBpZiAobWluQm91bmRzID09IG1heEJvdW5kcykKKyAgICByZXR1cm47CiAgIC8vIGNvbnN0cnVjdCBhIGNsaXAgcGFyYWxsZWwgdG8gdGhlIGdyYWRpZW50IHRoYXQgZ29lcyB0aHJvdWdoCiAgIC8vIHJlY3RQdHNbbWluQm91bmRzXSBhbmQgcmVjdFB0c1ttYXhCb3VuZHNdIGFuZCBwZXJwZW5kaWN1bGFyIHRvIHRoZQogICAvLyBncmFkaWVudCB0aGF0IGdvZXMgdGhyb3VnaCBzdGFydEVkZ2VQdCwgZW5kRWRnZVB0LgpAQCAtNTU4LDEwICs1NjUsOSBAQAogICBwYWludC0+c2V0QWxwaGEoYml0bWFwX2FscGhhKTsKIH0KIAotYm9vbCBVcHNhbXBsZShjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorYm9vbCBVcHNhbXBsZShjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTb3VyY2UsCiAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90LCBGeEZyZWVEZWxldGVyPiYgZHN0OFN0b3JhZ2UsCiAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50MzJfdCwgRnhGcmVlRGVsZXRlcj4mIGRzdDMyU3RvcmFnZSwKLSAgICAgICAgICAgICAgU2tDb2xvclRhYmxlKiogY3RQdHIsCiAgICAgICAgICAgICAgIFNrQml0bWFwKiBza0JpdG1hcCwKICAgICAgICAgICAgICAgaW50KiB3aWR0aFB0ciwKICAgICAgICAgICAgICAgaW50KiBoZWlnaHRQdHIsCkBAIC02NDUsOCArNjUxLDcgQEAKICAgfQogICBTa0ltYWdlSW5mbyBpbWFnZUluZm8gPQogICAgICAgU2tJbWFnZUluZm86Ok1ha2Uod2lkdGgsIGhlaWdodCwgY29sb3JUeXBlLCBhbHBoYVR5cGUpOwotICBza0JpdG1hcC0+aW5zdGFsbFBpeGVscyhpbWFnZUluZm8sIGJ1ZmZlciwgcm93Qnl0ZXMsICpjdFB0ciwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgIHNrQml0bWFwLT5pbnN0YWxsUGl4ZWxzKGltYWdlSW5mbywgYnVmZmVyLCByb3dCeXRlcyk7CiAgICp3aWR0aFB0ciA9IHdpZHRoOwogICAqaGVpZ2h0UHRyID0gaGVpZ2h0OwogICByZXR1cm4gdHJ1ZTsKQEAgLTY3NCw4ICs2NzksOSBAQAogICAvLyBtYXJrIGFsbCBjYWNoZWQgc3RhdGUgYXMgdW5pbml0aWFsaXplZAogICBleHBsaWNpdCBTa2lhU3RhdGUoQ0ZYX1NraWFEZXZpY2VEcml2ZXIqIHBEcml2ZXIpCiAgICAgICA6IG1fcERyaXZlcihwRHJpdmVyKSwKLSAgICAgICAgbV9wRm9udChudWxscHRyKSwKKyAgICAgICAgbV9wVHlwZUZhY2UobnVsbHB0ciksCiAgICAgICAgIG1fZm9udFNpemUoMCksCisgICAgICAgIG1fc2NhbGVYKDApLAogICAgICAgICBtX2ZpbGxDb2xvcigwKSwKICAgICAgICAgbV9zdHJva2VDb2xvcigwKSwKICAgICAgICAgbV9ibGVuZFR5cGUoMCksCkBAIC03MDgsNyArNzE0LDcgQEAKICAgICBpZiAoQWNjdW11bGF0b3I6OmtUZXh0ID09IG1fdHlwZSB8fCBkcmF3SW5kZXggIT0gbV9jb21tYW5kSW5kZXggfHwKICAgICAgICAgKEFjY3VtdWxhdG9yOjprUGF0aCA9PSBtX3R5cGUgJiYKICAgICAgICAgIERyYXdDaGFuZ2VkKHBNYXRyaXgsIHBEcmF3U3RhdGUsIGZpbGxfY29sb3IsIHN0cm9rZV9jb2xvciwgZmlsbF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgYmxlbmRfdHlwZSwgbV9wRHJpdmVyLT5tX2JHcm91cEtub2Nrb3V0KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgIGJsZW5kX3R5cGUsIG1fcERyaXZlci0+R2V0R3JvdXBLbm9ja291dCgpKSkpIHsKICAgICAgIEZsdXNoKCk7CiAgICAgfQogICAgIGlmIChBY2N1bXVsYXRvcjo6a1BhdGggIT0gbV90eXBlKSB7CkBAIC03MjMsNyArNzI5LDcgQEAKICAgICAgIG1fZmlsbENvbG9yID0gZmlsbF9jb2xvcjsKICAgICAgIG1fc3Ryb2tlQ29sb3IgPSBzdHJva2VfY29sb3I7CiAgICAgICBtX2JsZW5kVHlwZSA9IGJsZW5kX3R5cGU7Ci0gICAgICBtX2dyb3VwS25vY2tvdXQgPSBtX3BEcml2ZXItPm1fYkdyb3VwS25vY2tvdXQ7CisgICAgICBtX2dyb3VwS25vY2tvdXQgPSBtX3BEcml2ZXItPkdldEdyb3VwS25vY2tvdXQoKTsKICAgICAgIGlmIChwTWF0cml4KQogICAgICAgICBtX2RyYXdNYXRyaXggPSAqcE1hdHJpeDsKICAgICAgIG1fZHJhd0luZGV4ID0gbV9jb21tYW5kSW5kZXg7CkBAIC03NjcsNyArNzczLDcgQEAKICNpZmRlZiBfU0tJQV9TVVBQT1JUX1BBVEhTXwogICAgICAgbV9wRHJpdmVyLT5QcmVNdWx0aXBseSgpOwogI2VuZGlmICAvLyBfU0tJQV9TVVBQT1JUX1BBVEhTXwotICAgICAgRGVidWdTaG93U2tpYURyYXdQYXRoKHNrQ2FudmFzLCBza1BhaW50LCAqZmlsbFBhdGgpOworICAgICAgRGVidWdTaG93U2tpYURyYXdQYXRoKG1fcERyaXZlci5HZXQoKSwgc2tDYW52YXMsIHNrUGFpbnQsICpmaWxsUGF0aCk7CiAgICAgICBza0NhbnZhcy0+ZHJhd1BhdGgoKmZpbGxQYXRoLCBza1BhaW50KTsKICAgICB9CiAgICAgaWYgKHN0cm9rZV9hbHBoYSkgewpAQCAtNzc2LDcgKzc4Miw3IEBACiAjaWZkZWYgX1NLSUFfU1VQUE9SVF9QQVRIU18KICAgICAgIG1fcERyaXZlci0+UHJlTXVsdGlwbHkoKTsKICNlbmRpZiAgLy8gX1NLSUFfU1VQUE9SVF9QQVRIU18KLSAgICAgIERlYnVnU2hvd1NraWFEcmF3UGF0aChza0NhbnZhcywgc2tQYWludCwgbV9za1BhdGgpOworICAgICAgRGVidWdTaG93U2tpYURyYXdQYXRoKG1fcERyaXZlci5HZXQoKSwgc2tDYW52YXMsIHNrUGFpbnQsIG1fc2tQYXRoKTsKICAgICAgIHNrQ2FudmFzLT5kcmF3UGF0aChtX3NrUGF0aCwgc2tQYWludCk7CiAgICAgfQogICAgIHNrQ2FudmFzLT5yZXN0b3JlKCk7CkBAIC03ODQsMjYgKzc5MCw2NyBAQAogICAgIG1fdHlwZSA9IEFjY3VtdWxhdG9yOjprTm9uZTsKICAgfQogCisgIGJvb2wgSGFzUlNYKGludCBuQ2hhcnMsCisgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKKyAgICAgICAgICAgICAgZmxvYXQqIHNjYWxlWFB0ciwKKyAgICAgICAgICAgICAgYm9vbCogb25lQXRBVGltZVB0cikgeworICAgIGJvb2wgdXNlUlNYZm9ybSA9IGZhbHNlOworICAgIGJvb2wgb25lQXRBVGltZSA9IGZhbHNlOworICAgIGZsb2F0IHNjYWxlWCA9IDE7CisgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG5DaGFyczsgKytpbmRleCkgeworICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MmIGNwID0gcENoYXJQb3NbaW5kZXhdOworICAgICAgaWYgKCFjcC5tX2JHbHlwaEFkanVzdCkKKyAgICAgICAgY29udGludWU7CisgICAgICBib29sIHVwcmlnaHQgPSAwID09IGNwLm1fQWRqdXN0TWF0cml4WzFdICYmIDAgPT0gY3AubV9BZGp1c3RNYXRyaXhbMl07CisgICAgICBpZiAoY3AubV9BZGp1c3RNYXRyaXhbMF0gIT0gY3AubV9BZGp1c3RNYXRyaXhbM10pIHsKKyAgICAgICAgaWYgKHVwcmlnaHQgJiYgMSA9PSBjcC5tX0FkanVzdE1hdHJpeFszXSkgeworICAgICAgICAgIGlmICgxID09IHNjYWxlWCkKKyAgICAgICAgICAgIHNjYWxlWCA9IGNwLm1fQWRqdXN0TWF0cml4WzBdOworICAgICAgICAgIGVsc2UgaWYgKHNjYWxlWCAhPSBjcC5tX0FkanVzdE1hdHJpeFswXSkKKyAgICAgICAgICAgIG9uZUF0QVRpbWUgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG9uZUF0QVRpbWUgPSB0cnVlOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKGNwLm1fQWRqdXN0TWF0cml4WzFdICE9IC1jcC5tX0FkanVzdE1hdHJpeFsyXSkgeworICAgICAgICBvbmVBdEFUaW1lID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHVzZVJTWGZvcm0gPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgICAqb25lQXRBVGltZVB0ciA9IG9uZUF0QVRpbWU7CisgICAgKnNjYWxlWFB0ciA9IG9uZUF0QVRpbWUgPyAxIDogc2NhbGVYOworICAgIHJldHVybiBvbmVBdEFUaW1lID8gZmFsc2UgOiB1c2VSU1hmb3JtOworICB9CisKICAgYm9vbCBEcmF3VGV4dChpbnQgbkNoYXJzLAogICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCiAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgZmxvYXQgZm9udF9zaXplLAogICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yKSB7CiAgICAgaWYgKG1fZGVidWdEaXNhYmxlKQogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIER1bXAoX19mdW5jX18pOworICAgIGZsb2F0IHNjYWxlWCA9IDE7CisgICAgYm9vbCBvbmVBdEFUaW1lID0gZmFsc2U7CisgICAgYm9vbCBoYXNSU1ggPSBIYXNSU1gobkNoYXJzLCBwQ2hhclBvcywgJnNjYWxlWCwgJm9uZUF0QVRpbWUpOworICAgIGlmIChvbmVBdEFUaW1lKSB7CisgICAgICBGbHVzaCgpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICBpbnQgZHJhd0luZGV4ID0gU2tUTWluKG1fZHJhd0luZGV4LCBtX2NvbW1hbmRzLmNvdW50KCkpOwogICAgIGlmIChBY2N1bXVsYXRvcjo6a1BhdGggPT0gbV90eXBlIHx8IGRyYXdJbmRleCAhPSBtX2NvbW1hbmRJbmRleCB8fAogICAgICAgICAoQWNjdW11bGF0b3I6OmtUZXh0ID09IG1fdHlwZSAmJgotICAgICAgICAgRm9udENoYW5nZWQocEZvbnQsIHBNYXRyaXgsIGZvbnRfc2l6ZSwgY29sb3IpKSkgeworICAgICAgICAgKEZvbnRDaGFuZ2VkKHBGb250LCBwTWF0cml4LCBmb250X3NpemUsIHNjYWxlWCwgY29sb3IpIHx8CisgICAgICAgICAgaGFzUlNYID09ICFtX3JzeGZvcm0uY291bnQoKSkpKSB7CiAgICAgICBGbHVzaCgpOwogICAgIH0KICAgICBpZiAoQWNjdW11bGF0b3I6OmtUZXh0ICE9IG1fdHlwZSkgewogICAgICAgbV9wb3NpdGlvbnMuc2V0Q291bnQoMCk7CiAgICAgICBtX2dseXBocy5zZXRDb3VudCgwKTsKLSAgICAgIG1fcEZvbnQgPSBwRm9udDsKKyAgICAgIG1fcFR5cGVGYWNlID0gcEZvbnQtPkdldEZhY2UoKSA/IHBGb250LT5HZXREZXZpY2VDYWNoZSgpIDogbnVsbHB0cjsKICAgICAgIG1fZm9udFNpemUgPSBmb250X3NpemU7CisgICAgICBtX3NjYWxlWCA9IHNjYWxlWDsKICAgICAgIG1fZmlsbENvbG9yID0gY29sb3I7CiAgICAgICBtX2RyYXdNYXRyaXggPSAqcE1hdHJpeDsKICAgICAgIG1fZHJhd0luZGV4ID0gbV9jb21tYW5kSW5kZXg7CkBAIC04MTIsNiArODU5LDkgQEAKICAgICBpbnQgY291bnQgPSBtX3Bvc2l0aW9ucy5jb3VudCgpOwogICAgIG1fcG9zaXRpb25zLnNldENvdW50KG5DaGFycyArIGNvdW50KTsKICAgICBtX2dseXBocy5zZXRDb3VudChuQ2hhcnMgKyBjb3VudCk7CisgICAgaWYgKGhhc1JTWCkgeworICAgICAgbV9yc3hmb3JtLnNldENvdW50KG5DaGFycyArIGNvdW50KTsKKyAgICB9CiAgICAgU2tTY2FsYXIgZmxpcCA9IG1fZm9udFNpemUgPCAwID8gLTEgOiAxOwogICAgIFNrU2NhbGFyIHZGbGlwID0gZmxpcDsKICAgICBpZiAocEZvbnQtPklzVmVydGljYWwoKSkKQEAgLTgyMSwxMiArODcxLDMzIEBACiAgICAgICBtX3Bvc2l0aW9uc1tpbmRleCArIGNvdW50XSA9IHtjcC5tX09yaWdpbi54ICogZmxpcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLm1fT3JpZ2luLnkgKiB2RmxpcH07CiAgICAgICBtX2dseXBoc1tpbmRleCArIGNvdW50XSA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihjcC5tX0dseXBoSW5kZXgpOworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXworICAgICAgaWYgKGNwLm1fRXh0R0lEKQorICAgICAgICBtX2dseXBoc1tpbmRleCArIGNvdW50XSA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihjcC5tX0V4dEdJRCk7CisjZW5kaWYKICAgICB9CiAgICAgU2tQb2ludCBkZWx0YTsKICAgICBpZiAoTWF0cml4T2Zmc2V0KHBNYXRyaXgsICZkZWx0YSkpIHsKICAgICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBuQ2hhcnM7ICsraW5kZXgpCiAgICAgICAgIG1fcG9zaXRpb25zW2luZGV4ICsgY291bnRdLm9mZnNldChkZWx0YS5mWCAqIGZsaXAsIC1kZWx0YS5mWSAqIGZsaXApOwogICAgIH0KKyAgICBpZiAoaGFzUlNYKSB7CisgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbkNoYXJzOyArK2luZGV4KSB7CisgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TJiBjcCA9IHBDaGFyUG9zW2luZGV4XTsKKyAgICAgICAgU2tSU1hmb3JtKiByc3hmb3JtID0gJm1fcnN4Zm9ybVtpbmRleCArIGNvdW50XTsKKyAgICAgICAgaWYgKGNwLm1fYkdseXBoQWRqdXN0KSB7CisgICAgICAgICAgcnN4Zm9ybS0+ZlNDb3MgPSBjcC5tX0FkanVzdE1hdHJpeFswXTsKKyAgICAgICAgICByc3hmb3JtLT5mU1NpbiA9IGNwLm1fQWRqdXN0TWF0cml4WzFdOworICAgICAgICAgIHJzeGZvcm0tPmZUeCA9IGNwLm1fQWRqdXN0TWF0cml4WzBdICogbV9wb3NpdGlvbnNbaW5kZXhdLmZYOworICAgICAgICAgIHJzeGZvcm0tPmZUeSA9IGNwLm1fQWRqdXN0TWF0cml4WzFdICogbV9wb3NpdGlvbnNbaW5kZXhdLmZZOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJzeGZvcm0tPmZTQ29zID0gMTsKKyAgICAgICAgICByc3hmb3JtLT5mU1NpbiA9IDA7CisgICAgICAgICAgcnN4Zm9ybS0+ZlR4ID0gbV9wb3NpdGlvbnNbaW5kZXhdLmZYOworICAgICAgICAgIHJzeGZvcm0tPmZUeSA9IG1fcG9zaXRpb25zW2luZGV4XS5mWTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCkBAIC04MzUsMTIgKzkwNiwxMyBAQAogICAgIFNrUGFpbnQgc2tQYWludDsKICAgICBza1BhaW50LnNldEFudGlBbGlhcyh0cnVlKTsKICAgICBza1BhaW50LnNldENvbG9yKG1fZmlsbENvbG9yKTsKLSAgICBpZiAobV9wRm9udC0+R2V0RmFjZSgpKSB7ICAvLyBleGNsdWRlIHBsYWNlaG9sZGVyIHRlc3QgZm9udHMKLSAgICAgIHNrX3NwPFNrVHlwZWZhY2U+IHR5cGVmYWNlKFNrU2FmZVJlZihtX3BGb250LT5HZXREZXZpY2VDYWNoZSgpKSk7CisgICAgaWYgKG1fcFR5cGVGYWNlKSB7ICAvLyBleGNsdWRlIHBsYWNlaG9sZGVyIHRlc3QgZm9udHMKKyAgICAgIHNrX3NwPFNrVHlwZWZhY2U+IHR5cGVmYWNlKFNrU2FmZVJlZihtX3BUeXBlRmFjZS5HZXQoKSkpOwogICAgICAgc2tQYWludC5zZXRUeXBlZmFjZSh0eXBlZmFjZSk7CiAgICAgfQogICAgIHNrUGFpbnQuc2V0VGV4dEVuY29kaW5nKFNrUGFpbnQ6OmtHbHlwaElEX1RleHRFbmNvZGluZyk7CiAgICAgc2tQYWludC5zZXRIaW50aW5nKFNrUGFpbnQ6OmtOb19IaW50aW5nKTsKKyAgICBza1BhaW50LnNldFRleHRTY2FsZVgobV9zY2FsZVgpOwogICAgIHNrUGFpbnQuc2V0VGV4dFNpemUoU2tUQWJzKG1fZm9udFNpemUpKTsKICAgICBza1BhaW50LnNldFN1YnBpeGVsVGV4dCh0cnVlKTsKICAgICBTa0NhbnZhcyogc2tDYW52YXMgPSBtX3BEcml2ZXItPlNraWFDYW52YXMoKTsKQEAgLTg1MSwyNSArOTIzLDU3IEBACiAjaWZkZWYgX1NLSUFfU1VQUE9SVF9QQVRIU18KICAgICBtX3BEcml2ZXItPlByZU11bHRpcGx5KCk7CiAjZW5kaWYgIC8vIF9TS0lBX1NVUFBPUlRfUEFUSFNfCi0gICAgc2tDYW52YXMtPmRyYXdQb3NUZXh0KG1fZ2x5cGhzLmJlZ2luKCksIG1fZ2x5cGhzLmNvdW50KCkgKiAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Bvc2l0aW9ucy5iZWdpbigpLCBza1BhaW50KTsKKyNpZiBTSE9XX1RFWFRfR0xZUEhTCisgICAgU2tUREFycmF5PFNrVW5pY2hhcj4gdGV4dDsKKyAgICB0ZXh0LnNldENvdW50KG1fZ2x5cGhzLmNvdW50KCkpOworICAgIHNrUGFpbnQuZ2x5cGhzVG9VbmljaGFycyhtX2dseXBocy5iZWdpbigpLCBtX2dseXBocy5jb3VudCgpLCB0ZXh0LmJlZ2luKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9nbHlwaHMuY291bnQoKTsgKytpKQorICAgICAgcHJpbnRmKCIlbGMiLCBtX2dseXBoc1tpXSk7CisgICAgcHJpbnRmKCJcbiIpOworI2VuZGlmCisgICAgaWYgKG1fcnN4Zm9ybS5jb3VudCgpKSB7CisgICAgICBza0NhbnZhcy0+ZHJhd1RleHRSU1hmb3JtKG1fZ2x5cGhzLmJlZ2luKCksIG1fZ2x5cGhzLmNvdW50KCkgKiAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3JzeGZvcm0uYmVnaW4oKSwgbnVsbHB0ciwgc2tQYWludCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNrQ2FudmFzLT5kcmF3UG9zVGV4dChtX2dseXBocy5iZWdpbigpLCBtX2dseXBocy5jb3VudCgpICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Bvc2l0aW9ucy5iZWdpbigpLCBza1BhaW50KTsKKyAgICB9CiAgICAgc2tDYW52YXMtPnJlc3RvcmUoKTsKICAgICBtX2RyYXdJbmRleCA9IElOVF9NQVg7CiAgICAgbV90eXBlID0gQWNjdW11bGF0b3I6OmtOb25lOwogICB9CiAKKyAgYm9vbCBJc0VtcHR5KCkgeyByZXR1cm4gIW1fY29tbWFuZHMuY291bnQoKTsgfQorCiAgIGJvb2wgU2V0Q2xpcEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlKSB7CiAgICAgaWYgKG1fZGVidWdEaXNhYmxlKQogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIER1bXAoX19mdW5jX18pOwotICAgIFNrUGF0aCBza0NsaXBQYXRoID0gQnVpbGRQYXRoKHBQYXRoRGF0YSk7Ci0gICAgc2tDbGlwUGF0aC5zZXRGaWxsVHlwZSgoZmlsbF9tb2RlICYgMykgPT0gRlhGSUxMX0FMVEVSTkFURQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU2tQYXRoOjprRXZlbk9kZF9GaWxsVHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU2tQYXRoOjprV2luZGluZ19GaWxsVHlwZSk7Ci0gICAgU2tNYXRyaXggc2tNYXRyaXggPSBUb1NrTWF0cml4KCpwTWF0cml4KTsKLSAgICBza0NsaXBQYXRoLnRyYW5zZm9ybShza01hdHJpeCk7CisgICAgU2tQYXRoIHNrQ2xpcFBhdGg7CisgICAgaWYgKHBQYXRoRGF0YS0+R2V0UG9pbnRzKCkuc2l6ZSgpID09IDUgfHwKKyAgICAgICAgcFBhdGhEYXRhLT5HZXRQb2ludHMoKS5zaXplKCkgPT0gNCkgeworICAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0ZjsKKyAgICAgIGlmIChwUGF0aERhdGEtPklzUmVjdChwTWF0cml4LCAmcmVjdGYpKSB7CisgICAgICAgIHJlY3RmLkludGVyc2VjdChDRlhfRmxvYXRSZWN0KAorICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihtX3BEcml2ZXItPkdldERldmljZUNhcHMoRlhEQ19QSVhFTF9XSURUSCkpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1fcERyaXZlci0+R2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpKSk7CisgICAgICAgIEZYX1JFQ1Qgb3V0ZXIgPSByZWN0Zi5HZXRPdXRlclJlY3QoKTsKKyAgICAgICAgLy8gbm90ZSB0aGF0IFBERidzIHktYXhpcyBnb2VzIHVwOyBTa2lhJ3MgeS1heGlzIGdvZXMgZG93bgorICAgICAgICBza0NsaXBQYXRoLmFkZFJlY3QoeyhmbG9hdClvdXRlci5sZWZ0LCAoZmxvYXQpb3V0ZXIuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdClvdXRlci5yaWdodCwgKGZsb2F0KW91dGVyLnRvcH0pOworICAgICAgfQorICAgIH0KKyAgICBpZiAoc2tDbGlwUGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgIHNrQ2xpcFBhdGggPSBCdWlsZFBhdGgocFBhdGhEYXRhKTsKKyAgICAgIHNrQ2xpcFBhdGguc2V0RmlsbFR5cGUoKGZpbGxfbW9kZSAmIDMpID09IEZYRklMTF9BTFRFUk5BVEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU2tQYXRoOjprRXZlbk9kZF9GaWxsVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTa1BhdGg6OmtXaW5kaW5nX0ZpbGxUeXBlKTsKKyAgICAgIFNrTWF0cml4IHNrTWF0cml4ID0gVG9Ta01hdHJpeCgqcE1hdHJpeCk7CisgICAgICBza0NsaXBQYXRoLnRyYW5zZm9ybShza01hdHJpeCk7CisgICAgfQogICAgIHJldHVybiBTZXRDbGlwKHNrQ2xpcFBhdGgpOwogICB9CiAKQEAgLTk0NSwyMSArMTA0OSwyMSBAQAogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIER1bXAoX19mdW5jX18pOwogICAgIGludCBjb3VudCA9IG1fY29tbWFuZHMuY291bnQoKTsKLSAgICBpZiAobV9jb21tYW5kSW5kZXggPCBjb3VudCAtIDEpIHsKLSAgICAgIGlmIChDbGlwOjprU2F2ZSA9PSBtX2NvbW1hbmRzW21fY29tbWFuZEluZGV4ICsgMV0pIHsKKyAgICBpZiAobV9jb21tYW5kSW5kZXggPCBjb3VudCkgeworICAgICAgaWYgKENsaXA6OmtTYXZlID09IG1fY29tbWFuZHNbbV9jb21tYW5kSW5kZXhdKSB7CiAgICAgICAgICsrbV9jb21tYW5kSW5kZXg7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgfQogICAgICAgRmx1c2goKTsKICAgICAgIEFkanVzdENsaXAobV9jb21tYW5kSW5kZXgpOwotICAgICAgbV9jb21tYW5kc1srK21fY29tbWFuZEluZGV4XSA9IENsaXA6OmtTYXZlOworICAgICAgbV9jb21tYW5kc1ttX2NvbW1hbmRJbmRleF0gPSBDbGlwOjprU2F2ZTsKICAgICAgIG1fY2xpcHNbbV9jb21tYW5kSW5kZXhdID0gbV9za0VtcHR5UGF0aDsKICAgICB9IGVsc2UgewogICAgICAgQWRqdXN0Q2xpcChtX2NvbW1hbmRJbmRleCk7CiAgICAgICBtX2NvbW1hbmRzLnB1c2goQ2xpcDo6a1NhdmUpOwogICAgICAgbV9jbGlwcy5wdXNoX2JhY2sobV9za0VtcHR5UGF0aCk7Ci0gICAgICArK21fY29tbWFuZEluZGV4OwogICAgIH0KKyAgICArK21fY29tbWFuZEluZGV4OwogICAgIHJldHVybiB0cnVlOwogICB9CiAKQEAgLTk5MCwxMCArMTA5NCwxNCBAQAogCiAgIGJvb2wgRm9udENoYW5nZWQoQ0ZYX0ZvbnQqIHBGb250LAogICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZm9udF9zaXplLAorICAgICAgICAgICAgICAgICAgIGZsb2F0IGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBmbG9hdCBzY2FsZVgsCiAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IpIGNvbnN0IHsKLSAgICByZXR1cm4gcEZvbnQgIT0gbV9wRm9udCB8fCBNYXRyaXhDaGFuZ2VkKHBNYXRyaXgsIG1fZHJhd01hdHJpeCkgfHwKLSAgICAgICAgICAgZm9udF9zaXplICE9IG1fZm9udFNpemUgfHwgY29sb3IgIT0gbV9maWxsQ29sb3I7CisgICAgQ0ZYX1R5cGVGYWNlKiB0eXBlZmFjZSA9CisgICAgICAgIHBGb250LT5HZXRGYWNlKCkgPyBwRm9udC0+R2V0RGV2aWNlQ2FjaGUoKSA6IG51bGxwdHI7CisgICAgcmV0dXJuIHR5cGVmYWNlICE9IG1fcFR5cGVGYWNlIHx8IE1hdHJpeENoYW5nZWQocE1hdHJpeCwgbV9kcmF3TWF0cml4KSB8fAorICAgICAgICAgICBmb250X3NpemUgIT0gbV9mb250U2l6ZSB8fCBzY2FsZVggIT0gbV9zY2FsZVggfHwKKyAgICAgICAgICAgY29sb3IgIT0gbV9maWxsQ29sb3I7CiAgIH0KIAogICBib29sIE1hdHJpeENoYW5nZWQoY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKQEAgLTEwOTQsMzggKzEyMDIsMTk3IEBACiAKICAgdm9pZCBEdW1wKGNvbnN0IGNoYXIqIHdoZXJlKSBjb25zdCB7CiAjaWYgU0hPV19TS0lBX1BBVEgKLSAgICBwcmludGYoIlxuJXNcblNraWEgU2F2ZSBDb3VudCAlZDpcbiIsIHdoZXJlLAotICAgICAgICAgICBtX3BEcml2ZXItPm1fcENhbnZhcy0+Z2V0U2F2ZUNvdW50KCkpOworICAgIGlmIChtX2RlYnVnRGlzYWJsZSkKKyAgICAgIHJldHVybjsKKyAgICBwcmludGYoCisgICAgICAgICJcbiVzXG5Ta2lhIFNhdmUgQ291bnQgJWQgIEFnZyBTYXZlIFN0YWNrL0NvdW50ICVkLyVkIgorICAgICAgICAiICBDYWNoZSBTYXZlIEluZGV4L0NvdW50ICVkLyVkXG4iLAorICAgICAgICB3aGVyZSwgbV9wRHJpdmVyLT5tX3BDYW52YXMtPmdldFNhdmVDb3VudCgpLAorICAgICAgICAoaW50KW1fcERyaXZlci0+bV9TdGF0ZVN0YWNrLnNpemUoKSwgQWdnU2F2ZUNvdW50KG1fcERyaXZlciksCisgICAgICAgIG1fY29tbWFuZEluZGV4LCBDYWNoZVNhdmVDb3VudChtX2NvbW1hbmRzLCBtX2NvbW1hbmRJbmRleCkpOwogICAgIHByaW50ZigiQ2FjaGU6XG4iKTsKKyNpZiBTSE9XX1NLSUFfUEFUSF9TSE9SVEhBTkQKKyAgICBib29sIGR1bXBlZFBhdGggPSBmYWxzZTsKKyNlbmRpZgogICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBtX2NvbW1hbmRzLmNvdW50KCk7ICsraW5kZXgpIHsKKyNpZiBTSE9XX1NLSUFfUEFUSF9TSE9SVEhBTkQKKyAgICAgIGlmIChDbGlwOjprU2F2ZSA9PSBtX2NvbW1hbmRzW2luZGV4XSAmJiBkdW1wZWRQYXRoKSB7CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICAgICAgZHVtcGVkUGF0aCA9IGZhbHNlOworICAgICAgfQorI2VuZGlmCiAgICAgICBEdW1wUHJlZml4KGluZGV4KTsKICAgICAgIHN3aXRjaCAobV9jb21tYW5kc1tpbmRleF0pIHsKICAgICAgICAgY2FzZSBDbGlwOjprU2F2ZToKICAgICAgICAgICBwcmludGYoIlNhdmUgJWRcbiIsICsrbV9kZWJ1Z1NhdmVDb3VudGVyKTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBDbGlwOjprUGF0aDoKKyNpZiBTSE9XX1NLSUFfUEFUSF9TSE9SVEhBTkQKKyAgICAgICAgICBwcmludGYoIioiKTsKKyAgICAgICAgICBkdW1wZWRQYXRoID0gdHJ1ZTsKKyNlbHNlCisgICAgICAgICAgbV9jbGlwc1tpbmRleF0uZHVtcCgpOworI2VuZGlmCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcHJpbnRmKCJ1bmtub3duXG4iKTsKKyAgICAgIH0KKyAgICB9CisjaWYgU0hPV19TS0lBX1BBVEhfU0hPUlRIQU5ECisgICAgaWYgKGR1bXBlZFBhdGgpCisgICAgICBwcmludGYoIlxuIik7CisjZW5kaWYKKyAgICBEdW1wRW5kUHJlZml4KCk7CisgICAgaW50IHNrQ2FudmFzU2F2ZUNvdW50ID0gbV9wRHJpdmVyLT5tX3BDYW52YXMtPmdldFNhdmVDb3VudCgpOworICAgIGludCBjYWNoZVNhdmVDb3VudCA9IDE7CisgICAgU2tBU1NFUlQobV9jbGlwSW5kZXggPD0gbV9jb21tYW5kcy5jb3VudCgpKTsKKyAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbV9jbGlwSW5kZXg7ICsraW5kZXgpCisgICAgICBjYWNoZVNhdmVDb3VudCArPSBDbGlwOjprU2F2ZSA9PSBtX2NvbW1hbmRzW2luZGV4XTsKKyAgICBTa0FTU0VSVChza0NhbnZhc1NhdmVDb3VudCA9PSBjYWNoZVNhdmVDb3VudCk7CisjZW5kaWYgIC8vIFNIT1dfU0tJQV9QQVRICisgIH0KKworI2lmIFNIT1dfU0tJQV9QQVRICisgIHN0YXRpYyBpbnQgQWdnU2F2ZUNvdW50KGNvbnN0IFVub3duZWRQdHI8Q0ZYX1NraWFEZXZpY2VEcml2ZXI+IGRyaXZlcikgeworICAgIEZYX1JFQ1QgbGFzdDsKKyAgICBpbnQgYWdnU2F2ZUNvdW50ID0gMDsKKyAgICBib29sIGZvdW5kTGFzdCA9IGZhbHNlOworICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCAoaW50KWRyaXZlci0+bV9TdGF0ZVN0YWNrLnNpemUoKTsgKytpbmRleCkgeworICAgICAgaWYgKCFkcml2ZXItPm1fU3RhdGVTdGFja1tpbmRleF0pIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoZHJpdmVyLT5tX1N0YXRlU3RhY2tbaW5kZXhdLT5HZXRUeXBlKCkgIT0gQ0ZYX0NsaXBSZ246OlJlY3RJKSB7CisgICAgICAgIGFnZ1NhdmVDb3VudCArPSAxOworICAgICAgICBmb3VuZExhc3QgPSBmYWxzZTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoIWZvdW5kTGFzdCB8fCBtZW1jbXAoJmxhc3QsICZkcml2ZXItPm1fU3RhdGVTdGFja1tpbmRleF0tPkdldEJveCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGWF9SRUNUKSkpIHsKKyAgICAgICAgYWdnU2F2ZUNvdW50ICs9IDE7CisgICAgICAgIGZvdW5kTGFzdCA9IHRydWU7CisgICAgICAgIGxhc3QgPSBkcml2ZXItPm1fU3RhdGVTdGFja1tpbmRleF0tPkdldEJveCgpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoZHJpdmVyLT5tX3BDbGlwUmduKSB7CisgICAgICBDRlhfQ2xpcFJnbjo6Q2xpcFR5cGUgY2xpcFR5cGUgPSBkcml2ZXItPm1fcENsaXBSZ24tPkdldFR5cGUoKTsKKyAgICAgIGlmIChjbGlwVHlwZSAhPSBDRlhfQ2xpcFJnbjo6UmVjdEkgfHwgIWZvdW5kTGFzdCB8fAorICAgICAgICAgIG1lbWNtcCgmbGFzdCwgJmRyaXZlci0+bV9wQ2xpcFJnbi0+R2V0Qm94KCksIHNpemVvZihGWF9SRUNUKSkpIHsKKyAgICAgICAgYWdnU2F2ZUNvdW50ICs9IDE7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBhZ2dTYXZlQ291bnQ7CisgIH0KKworICBzdGF0aWMgaW50IENhY2hlU2F2ZUNvdW50KGNvbnN0IFNrVERBcnJheTxTa2lhU3RhdGU6OkNsaXA+JiBjb21tYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29tbWFuZEluZGV4KSB7CisgICAgaW50IGNhY2hlU2F2ZUNvdW50ID0gMDsKKyAgICBib29sIG5ld1BhdGggPSBmYWxzZTsKKyAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY29tbWFuZEluZGV4OyArK2luZGV4KSB7CisgICAgICBpZiAoQ2xpcDo6a1NhdmUgPT0gY29tbWFuZHNbaW5kZXhdKSB7CisgICAgICAgIG5ld1BhdGggPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChuZXdQYXRoKSB7CisgICAgICAgICsrY2FjaGVTYXZlQ291bnQ7CisgICAgICAgIG5ld1BhdGggPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNhY2hlU2F2ZUNvdW50OworICB9CisjZW5kaWYKKworICB2b2lkIERlYnVnQ2hlY2tDbGlwKCkgeworI2lmIFNIT1dfU0tJQV9QQVRICisgICAgaWYgKG1fZGVidWdEaXNhYmxlKQorICAgICAgcmV0dXJuOworICAgIGludCBhZ2dTYXZlQ291bnQgPSBBZ2dTYXZlQ291bnQobV9wRHJpdmVyKTsKKyAgICBpbnQgY2FjaGVTYXZlQ291bnQgPSBDYWNoZVNhdmVDb3VudChtX2NvbW1hbmRzLCBtX2NvbW1hbmRJbmRleCk7CisgICAgU2tBU1NFUlQobV9jbGlwSW5kZXggPD0gbV9jb21tYW5kcy5jb3VudCgpKTsKKyAgICBpZiAoYWdnU2F2ZUNvdW50ICE9IGNhY2hlU2F2ZUNvdW50KSB7CisgICAgICAvLyBtYXkgbm90IHNpZ25pZnkgYSBidWcgaWYgY291bnRzIGRvbid0IG1hdGNoCisgICAgICBwcmludGYoImFnZ1NhdmVDb3VudCAlZCAhPSBjYWNoZVNhdmVDb3VudCAlZFxuIiwgYWdnU2F2ZUNvdW50LAorICAgICAgICAgICAgIGNhY2hlU2F2ZUNvdW50KTsKKyAgICAgIER1bXBDbGlwU3RhY2tzKCk7CisgICAgfQorICAgIGZvciAoaW50IGFnZ0luZGV4ID0gMDsgYWdnSW5kZXggPCAoaW50KW1fcERyaXZlci0+bV9TdGF0ZVN0YWNrLnNpemUoKTsKKyAgICAgICAgICsrYWdnSW5kZXgpIHsKKyAgICAgIGlmICghbV9wRHJpdmVyLT5tX1N0YXRlU3RhY2tbYWdnSW5kZXhdKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmIChtX3BEcml2ZXItPm1fU3RhdGVTdGFja1thZ2dJbmRleF0tPkdldFR5cGUoKSAhPSBDRlhfQ2xpcFJnbjo6UmVjdEkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgY29uc3QgRlhfUkVDVCYgYWdnUmVjdCA9IG1fcERyaXZlci0+bV9TdGF0ZVN0YWNrW2FnZ0luZGV4XS0+R2V0Qm94KCk7CisgICAgICBTa1JlY3Qgc2tSZWN0ID0gU2tSZWN0OjpNYWtlTFRSQihhZ2dSZWN0LmxlZnQsIGFnZ1JlY3QudG9wLCBhZ2dSZWN0LnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdnUmVjdC5ib3R0b20pOworICAgICAgYm9vbCBmb3VuZE1hdGNoID0gZmFsc2U7CisgICAgICBmb3IgKGludCBza0luZGV4ID0gMDsgc2tJbmRleCA8IG1fY29tbWFuZEluZGV4OyArK3NrSW5kZXgpIHsKKyAgICAgICAgaWYgKENsaXA6OmtQYXRoICE9IG1fY29tbWFuZHNbc2tJbmRleF0pCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGNvbnN0IFNrUGF0aCYgY2xpcCA9IG1fY2xpcHNbc2tJbmRleF07CisgICAgICAgIFNrUmVjdCBib3VuZHM7CisgICAgICAgIGlmICghY2xpcC5pc1JlY3QoJmJvdW5kcykpCisgICAgICAgICAgY29udGludWU7CisgICAgICAgIGJvdW5kcy5yb3VuZE91dCgmYm91bmRzKTsKKyAgICAgICAgaWYgKHNrUmVjdCA9PSBib3VuZHMpIHsKKyAgICAgICAgICBmb3VuZE1hdGNoID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKCFmb3VuZE1hdGNoKSB7CisgICAgICAgIER1bXBDbGlwU3RhY2tzKCk7CisgICAgICAgIFNrQVNTRVJUKDApOworICAgICAgfQorICAgIH0KKyNlbmRpZiAgLy8gU0hPV19TS0lBX1BBVEgKKyAgfQorCisjaWYgU0hPV19TS0lBX1BBVEgKKyAgdm9pZCBEdW1wQ2xpcFN0YWNrcygpIGNvbnN0IHsKKyAgICBpZiAobV9kZWJ1Z0Rpc2FibGUpCisgICAgICByZXR1cm47CisgICAgcHJpbnRmKCJcbmNhY2hlXG4iKTsKKyAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbV9jb21tYW5kSW5kZXg7ICsraW5kZXgpIHsKKyAgICAgIER1bXBQcmVmaXgoaW5kZXgpOworICAgICAgc3dpdGNoIChtX2NvbW1hbmRzW2luZGV4XSkgeworICAgICAgICBjYXNlIENsaXA6OmtTYXZlOgorICAgICAgICAgIHByaW50ZigiU2F2ZVxuIik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ2xpcDo6a1BhdGg6CiAgICAgICAgICAgbV9jbGlwc1tpbmRleF0uZHVtcCgpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgIHByaW50ZigidW5rbm93blxuIik7CiAgICAgICB9CiAgICAgfQotICAgIER1bXBFbmRQcmVmaXgoKTsKLSNlbmRpZiAgLy8gU0hPV19TS0lBX1BBVEgKLSNpZmRlZiBTS19ERUJVRwotICAgIGludCBza0NhbnZhc1NhdmVDb3VudCA9IG1fcERyaXZlci0+bV9wQ2FudmFzLT5nZXRTYXZlQ291bnQoKTsKLSAgICBpbnQgY2FjaGVTYXZlQ291bnQgPSAxOwotICAgIFNrQVNTRVJUKG1fY2xpcEluZGV4IDw9IG1fY29tbWFuZHMuY291bnQoKSk7Ci0gICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1fY2xpcEluZGV4OyArK2luZGV4KQotICAgICAgY2FjaGVTYXZlQ291bnQgKz0gQ2xpcDo6a1NhdmUgPT0gbV9jb21tYW5kc1tpbmRleF07Ci0gICAgU2tBU1NFUlQoc2tDYW52YXNTYXZlQ291bnQgPT0gY2FjaGVTYXZlQ291bnQpOwotI2VuZGlmCisgICAgcHJpbnRmKCJcbmFnZ1xuIik7CisgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IChpbnQpbV9wRHJpdmVyLT5tX1N0YXRlU3RhY2suc2l6ZSgpOyArK2luZGV4KSB7CisgICAgICBpZiAoIW1fcERyaXZlci0+bV9TdGF0ZVN0YWNrW2luZGV4XSkgeworICAgICAgICBwcmludGYoIm51bGxcbiIpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIENGWF9DbGlwUmduOjpDbGlwVHlwZSBjbGlwVHlwZSA9CisgICAgICAgICAgbV9wRHJpdmVyLT5tX1N0YXRlU3RhY2tbaW5kZXhdLT5HZXRUeXBlKCk7CisgICAgICBjb25zdCBGWF9SRUNUJiBib3ggPSBtX3BEcml2ZXItPm1fU3RhdGVTdGFja1tpbmRleF0tPkdldEJveCgpOworICAgICAgcHJpbnRmKCJzdGFjayByZWN0OiAlZCwlZCwlZCwlZCBtYXNrPSVzXG4iLCBib3gubGVmdCwgYm94LnRvcCwgYm94LnJpZ2h0LAorICAgICAgICAgICAgIGJveC5ib3R0b20sCisgICAgICAgICAgICAgQ0ZYX0NsaXBSZ246Ok1hc2tGID09IGNsaXBUeXBlCisgICAgICAgICAgICAgICAgID8gIjEiCisgICAgICAgICAgICAgICAgIDogQ0ZYX0NsaXBSZ246OlJlY3RJID09IGNsaXBUeXBlID8gIjAiIDogIj8iKTsKKyAgICB9CisgICAgaWYgKG1fcERyaXZlci0+bV9wQ2xpcFJnbikgeworICAgICAgY29uc3QgRlhfUkVDVCYgYm94ID0gbV9wRHJpdmVyLT5tX3BDbGlwUmduLT5HZXRCb3goKTsKKyAgICAgIENGWF9DbGlwUmduOjpDbGlwVHlwZSBjbGlwVHlwZSA9IG1fcERyaXZlci0+bV9wQ2xpcFJnbi0+R2V0VHlwZSgpOworICAgICAgcHJpbnRmKCJjbGlwIHJlY3Q6ICVkLCVkLCVkLCVkIG1hc2s9JXNcbiIsIGJveC5sZWZ0LCBib3gudG9wLCBib3gucmlnaHQsCisgICAgICAgICAgICAgYm94LmJvdHRvbSwKKyAgICAgICAgICAgICBDRlhfQ2xpcFJnbjo6TWFza0YgPT0gY2xpcFR5cGUKKyAgICAgICAgICAgICAgICAgPyAiMSIKKyAgICAgICAgICAgICAgICAgOiBDRlhfQ2xpcFJnbjo6UmVjdEkgPT0gY2xpcFR5cGUgPyAiMCIgOiAiPyIpOworICAgIH0KICAgfQorI2VuZGlmICAvLyBTSE9XX1NLSUFfUEFUSAogCiAgcHJpdmF0ZToKICAgU2tUQXJyYXk8U2tQYXRoPiBtX2NsaXBzOyAgICAgICAgLy8gc3RhY2sgb2YgY2xpcHMgdGhhdCBtYXkgYmUgcmV1c2VkCiAgIFNrVERBcnJheTxDbGlwPiBtX2NvbW1hbmRzOyAgICAgIC8vIHN0YWNrIG9mIGNsaXAtcmVsYXRlZCBjb21tYW5kcwogICBTa1REQXJyYXk8U2tQb2ludD4gbV9wb3NpdGlvbnM7ICAvLyBhY2N1bXVsYXRvciBmb3IgdGV4dCBwb3NpdGlvbnMKKyAgU2tUREFycmF5PFNrUlNYZm9ybT4gbV9yc3hmb3JtOyAgLy8gYWNjdW11bGF0b3IgZm9yIHR4dCByb3RhdGUvc2NhbGUvdHJhbnNsYXRlCiAgIFNrVERBcnJheTx1aW50MTZfdD4gbV9nbHlwaHM7ICAgIC8vIGFjY3VtdWxhdG9yIGZvciB0ZXh0IGdseXBocwogICBTa1BhdGggbV9za1BhdGg7ICAgICAgICAgICAgICAgICAvLyBhY2N1bXVsYXRvciBmb3IgcGF0aCBjb250b3VycwogICBTa1BhdGggbV9za0VtcHR5UGF0aDsgICAgICAgICAgICAvLyB1c2VkIGFzIHBsYWNlaG9sZCBpbiB0aGUgY2xpcHMgYXJyYXkKQEAgLTExMzMsOSArMTQwMCwxMCBAQAogICBDRlhfR3JhcGhTdGF0ZURhdGEgbV9jbGlwU3RhdGU7CiAgIENGWF9HcmFwaFN0YXRlRGF0YSBtX2RyYXdTdGF0ZTsKICAgQ0ZYX01hdHJpeCBtX2NsaXBNYXRyaXg7Ci0gIENGWF9Ta2lhRGV2aWNlRHJpdmVyKiBtX3BEcml2ZXI7Ci0gIENGWF9Gb250KiBtX3BGb250OwotICBGWF9GTE9BVCBtX2ZvbnRTaXplOworICBVbm93bmVkUHRyPENGWF9Ta2lhRGV2aWNlRHJpdmVyPiBtX3BEcml2ZXI7CisgIFVub3duZWRQdHI8Q0ZYX1R5cGVGYWNlPiBtX3BUeXBlRmFjZTsKKyAgZmxvYXQgbV9mb250U2l6ZTsKKyAgZmxvYXQgbV9zY2FsZVg7CiAgIHVpbnQzMl90IG1fZmlsbENvbG9yOwogICB1aW50MzJfdCBtX3N0cm9rZUNvbG9yOwogICBpbnQgbV9ibGVuZFR5cGU7CkBAIC0xMTQ4LDEwICsxNDE2LDE2IEBACiAgIGJvb2wgbV9ncm91cEtub2Nrb3V0OwogICBib29sIG1fZGVidWdEaXNhYmxlOyAgLy8gdHVybiBvZmYgY2FjaGUgZm9yIGRlYnVnZ2luZwogI2lmIFNIT1dfU0tJQV9QQVRICisgcHVibGljOgogICBtdXRhYmxlIGludCBtX2RlYnVnU2F2ZUNvdW50ZXI7CisgIHN0YXRpYyBpbnQgbV9kZWJ1Z0luaXRDb3VudGVyOwogI2VuZGlmCiB9OwogCisjaWYgU0hPV19TS0lBX1BBVEgKK2ludCBTa2lhU3RhdGU6Om1fZGVidWdJbml0Q291bnRlcjsKKyNlbmRpZgorCiAvLyBjb252ZXJ0IGEgc3Ryb2tpbmcgcGF0aCB0byBzY2FubGluZXMKIHZvaWQgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlBhaW50U3Ryb2tlKFNrUGFpbnQqIHNwYWludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUsCkBAIC0xMTg3LDI3ICsxNDYxLDI4IEBACiAgIGludmVyc2Uuc2V0KFNrTWF0cml4OjprTVRyYW5zWSwgMCk7CiAgIFNrVmVjdG9yIGRldmljZVVuaXRzWzJdID0ge3swLCAxfSwgezEsIDB9fTsKICAgaW52ZXJzZS5tYXBQb2ludHMoZGV2aWNlVW5pdHMsIFNLX0FSUkFZX0NPVU5UKGRldmljZVVuaXRzKSk7Ci0gIEZYX0ZMT0FUIHdpZHRoID0KKyAgZmxvYXQgd2lkdGggPQogICAgICAgU2tUTWF4KHBHcmFwaFN0YXRlLT5tX0xpbmVXaWR0aCwKICAgICAgICAgICAgICBTa1RNaW4oZGV2aWNlVW5pdHNbMF0ubGVuZ3RoKCksIGRldmljZVVuaXRzWzFdLmxlbmd0aCgpKSk7CiAgIGlmIChwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXkpIHsKICAgICBpbnQgY291bnQgPSAocEdyYXBoU3RhdGUtPm1fRGFzaENvdW50ICsgMSkgLyAyOwotICAgIFNrU2NhbGFyKiBpbnRlcnZhbHMgPSBGWF9BbGxvYzJEKFNrU2NhbGFyLCBjb3VudCwgc2l6ZW9mKFNrU2NhbGFyKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPFNrU2NhbGFyLCBGeEZyZWVEZWxldGVyPiBpbnRlcnZhbHMoCisgICAgICAgIEZYX0FsbG9jMkQoU2tTY2FsYXIsIGNvdW50LCBzaXplb2YoU2tTY2FsYXIpKSk7CiAgICAgLy8gU2V0IGRhc2ggcGF0dGVybgogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgRlhfRkxPQVQgb24gPSBwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXlbaSAqIDJdOworICAgICAgZmxvYXQgb24gPSBwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXlbaSAqIDJdOwogICAgICAgaWYgKG9uIDw9IDAuMDAwMDAxZikKICAgICAgICAgb24gPSAxLmYgLyAxMDsKLSAgICAgIEZYX0ZMT0FUIG9mZiA9IGkgKiAyICsgMSA9PSBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQKLSAgICAgICAgICAgICAgICAgICAgICAgICA/IG9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgOiBwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXlbaSAqIDIgKyAxXTsKKyAgICAgIGZsb2F0IG9mZiA9IGkgKiAyICsgMSA9PSBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQKKyAgICAgICAgICAgICAgICAgICAgICA/IG9uCisgICAgICAgICAgICAgICAgICAgICAgOiBwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXlbaSAqIDIgKyAxXTsKICAgICAgIGlmIChvZmYgPCAwKQogICAgICAgICBvZmYgPSAwOwotICAgICAgaW50ZXJ2YWxzW2kgKiAyXSA9IG9uOwotICAgICAgaW50ZXJ2YWxzW2kgKiAyICsgMV0gPSBvZmY7CisgICAgICBpbnRlcnZhbHMuZ2V0KClbaSAqIDJdID0gb247CisgICAgICBpbnRlcnZhbHMuZ2V0KClbaSAqIDIgKyAxXSA9IG9mZjsKICAgICB9Ci0gICAgc3BhaW50LT5zZXRQYXRoRWZmZWN0KAotICAgICAgICBTa0Rhc2hQYXRoRWZmZWN0OjpNYWtlKGludGVydmFscywgY291bnQgKiAyLCBwR3JhcGhTdGF0ZS0+bV9EYXNoUGhhc2UpKTsKKyAgICBzcGFpbnQtPnNldFBhdGhFZmZlY3QoU2tEYXNoUGF0aEVmZmVjdDo6TWFrZShpbnRlcnZhbHMuZ2V0KCksIGNvdW50ICogMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwR3JhcGhTdGF0ZS0+bV9EYXNoUGhhc2UpKTsKICAgfQogICBzcGFpbnQtPnNldFN0eWxlKFNrUGFpbnQ6OmtTdHJva2VfU3R5bGUpOwogICBzcGFpbnQtPnNldEFudGlBbGlhcyh0cnVlKTsKQEAgLTEyMTcsMTAgKzE0OTIsMTEgQEAKICAgc3BhaW50LT5zZXRTdHJva2VKb2luKGpvaW4pOwogfQogCi1DRlhfU2tpYURldmljZURyaXZlcjo6Q0ZYX1NraWFEZXZpY2VEcml2ZXIoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJnYkJ5dGVPcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiR3JvdXBLbm9ja291dCkKK0NGWF9Ta2lhRGV2aWNlRHJpdmVyOjpDRlhfU2tpYURldmljZURyaXZlcigKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcCwKKyAgICBib29sIGJSZ2JCeXRlT3JkZXIsCisgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBPcmlEZXZpY2UsCisgICAgYm9vbCBiR3JvdXBLbm9ja291dCkKICAgICA6IG1fcEJpdG1hcChwQml0bWFwKSwKICAgICAgIG1fcE9yaURldmljZShwT3JpRGV2aWNlKSwKICAgICAgIG1fcFJlY29yZGVyKG51bGxwdHIpLApAQCAtMTIzNyw5ICsxNTEzLDcgQEAKICAgICAgIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpLAogICAgICAgcEJpdG1hcC0+R2V0QlBQKCkgPT0gOCA/IGtBbHBoYV84X1NrQ29sb3JUeXBlIDoga04zMl9Ta0NvbG9yVHlwZSwKICAgICAgIGtPcGFxdWVfU2tBbHBoYVR5cGUpOwotICBza0JpdG1hcC5pbnN0YWxsUGl4ZWxzKGltYWdlSW5mbywgcEJpdG1hcC0+R2V0QnVmZmVyKCksIHBCaXRtYXAtPkdldFBpdGNoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgIC8vIEZJWE1FKGNhcnljbGFyaykgc2V0IGNvbG9yIHRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0cik7CisgIHNrQml0bWFwLmluc3RhbGxQaXhlbHMoaW1hZ2VJbmZvLCBwQml0bWFwLT5HZXRCdWZmZXIoKSwgcEJpdG1hcC0+R2V0UGl0Y2goKSk7CiAgIG1fcENhbnZhcyA9IG5ldyBTa0NhbnZhcyhza0JpdG1hcCk7CiB9CiAKQEAgLTEyNzQsMTEgKzE1NDgsMTUgQEAKICAgbV9wQ2FjaGUtPkZsdXNoKCk7CiB9CiAKK3ZvaWQgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlByZU11bHRpcGx5KCkgeworICBtX3BCaXRtYXAtPlByZU11bHRpcGx5KCk7Cit9CisKIGJvb2wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkRyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZvbnRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yKSB7CiAgIGlmIChtX3BDYWNoZS0+RHJhd1RleHQobkNoYXJzLCBwQ2hhclBvcywgcEZvbnQsIHBPYmplY3QyRGV2aWNlLCBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IpKSB7CkBAIC0xMzA0LDE1ICsxNTgyLDg5IEBACiAgIHBvc2l0aW9ucy5zZXRDb3VudChuQ2hhcnMpOwogICBTa1REQXJyYXk8dWludDE2X3Q+IGdseXBoczsKICAgZ2x5cGhzLnNldENvdW50KG5DaGFycyk7CisgIGJvb2wgdXNlUlNYZm9ybSA9IGZhbHNlOworICBib29sIG9uZUF0QVRpbWUgPSBmYWxzZTsKICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG5DaGFyczsgKytpbmRleCkgewogICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TJiBjcCA9IHBDaGFyUG9zW2luZGV4XTsKICAgICBwb3NpdGlvbnNbaW5kZXhdID0ge2NwLm1fT3JpZ2luLnggKiBmbGlwLCBjcC5tX09yaWdpbi55ICogdkZsaXB9OworICAgIGlmIChjcC5tX2JHbHlwaEFkanVzdCkgeworICAgICAgdXNlUlNYZm9ybSA9IHRydWU7CisgICAgICBpZiAoY3AubV9BZGp1c3RNYXRyaXhbMF0gIT0gY3AubV9BZGp1c3RNYXRyaXhbM10gfHwKKyAgICAgICAgICBjcC5tX0FkanVzdE1hdHJpeFsxXSAhPSAtY3AubV9BZGp1c3RNYXRyaXhbMl0pIHsKKyAgICAgICAgb25lQXRBVGltZSA9IHRydWU7CisgICAgICB9CisgICAgfQogICAgIGdseXBoc1tpbmRleF0gPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oY3AubV9HbHlwaEluZGV4KTsKKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9BUFBMRV8KKyAgICBpZiAoY3AubV9FeHRHSUQpCisgICAgICBnbHlwaHNbaW5kZXhdID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGNwLm1fRXh0R0lEKTsKKyNlbmRpZgogICB9CisgIGlmIChvbmVBdEFUaW1lKQorICAgIHVzZVJTWGZvcm0gPSBmYWxzZTsKKyNpZiBTSE9XX1RFWFRfR0xZUEhTCisgIFNrVERBcnJheTxTa1VuaWNoYXI+IHRleHQ7CisgIHRleHQuc2V0Q291bnQoZ2x5cGhzLmNvdW50KCkpOworICBwYWludC5nbHlwaHNUb1VuaWNoYXJzKGdseXBocy5iZWdpbigpLCBnbHlwaHMuY291bnQoKSwgdGV4dC5iZWdpbigpKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBnbHlwaHMuY291bnQoKTsgKytpKQorICAgIHByaW50ZigiJWxjIiwgdGV4dFtpXSk7CisgIHByaW50ZigiXG4iKTsKKyNlbmRpZgogI2lmZGVmIF9TS0lBX1NVUFBPUlRfUEFUSFNfCiAgIG1fcEJpdG1hcC0+UHJlTXVsdGlwbHkoKTsKICNlbmRpZiAgLy8gX1NLSUFfU1VQUE9SVF9QQVRIU18KLSAgbV9wQ2FudmFzLT5kcmF3UG9zVGV4dChnbHlwaHMuYmVnaW4oKSwgbkNoYXJzICogMiwgcG9zaXRpb25zLmJlZ2luKCksIHBhaW50KTsKKyAgaWYgKHVzZVJTWGZvcm0pIHsKKyAgICBTa1REQXJyYXk8U2tSU1hmb3JtPiB4Zm9ybXM7CisgICAgeGZvcm1zLnNldENvdW50KG5DaGFycyk7CisgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG5DaGFyczsgKytpbmRleCkgeworICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MmIGNwID0gcENoYXJQb3NbaW5kZXhdOworICAgICAgU2tSU1hmb3JtKiByc3hmb3JtID0gJnhmb3Jtc1tpbmRleF07CisgICAgICBpZiAoY3AubV9iR2x5cGhBZGp1c3QpIHsKKyAgICAgICAgcnN4Zm9ybS0+ZlNDb3MgPSBjcC5tX0FkanVzdE1hdHJpeFswXTsKKyAgICAgICAgcnN4Zm9ybS0+ZlNTaW4gPSBjcC5tX0FkanVzdE1hdHJpeFsxXTsKKyAgICAgICAgcnN4Zm9ybS0+ZlR4ID0gY3AubV9BZGp1c3RNYXRyaXhbMF0gKiBwb3NpdGlvbnNbaW5kZXhdLmZYOworICAgICAgICByc3hmb3JtLT5mVHkgPSBjcC5tX0FkanVzdE1hdHJpeFsxXSAqIHBvc2l0aW9uc1tpbmRleF0uZlk7CisgICAgICB9IGVsc2UgeworICAgICAgICByc3hmb3JtLT5mU0NvcyA9IDE7CisgICAgICAgIHJzeGZvcm0tPmZTU2luID0gMDsKKyAgICAgICAgcnN4Zm9ybS0+ZlR4ID0gcG9zaXRpb25zW2luZGV4XS5mWDsKKyAgICAgICAgcnN4Zm9ybS0+ZlR5ID0gcG9zaXRpb25zW2luZGV4XS5mWTsKKyAgICAgIH0KKyAgICB9CisgICAgbV9wQ2FudmFzLT5kcmF3VGV4dFJTWGZvcm0oZ2x5cGhzLmJlZ2luKCksIG5DaGFycyAqIDIsIHhmb3Jtcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIHBhaW50KTsKKyAgfSBlbHNlIGlmIChvbmVBdEFUaW1lKSB7CisgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG5DaGFyczsgKytpbmRleCkgeworICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MmIGNwID0gcENoYXJQb3NbaW5kZXhdOworICAgICAgaWYgKGNwLm1fYkdseXBoQWRqdXN0KSB7CisgICAgICAgIGlmICgwID09IGNwLm1fQWRqdXN0TWF0cml4WzFdICYmIDAgPT0gY3AubV9BZGp1c3RNYXRyaXhbMl0gJiYKKyAgICAgICAgICAgIDEgPT0gY3AubV9BZGp1c3RNYXRyaXhbM10pIHsKKyAgICAgICAgICBwYWludC5zZXRUZXh0U2NhbGVYKGNwLm1fQWRqdXN0TWF0cml4WzBdKTsKKyAgICAgICAgICBtX3BDYW52YXMtPmRyYXdUZXh0KCZnbHlwaHNbaW5kZXhdLCAxLCBwb3NpdGlvbnNbaW5kZXhdLmZYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25zW2luZGV4XS5mWSwgcGFpbnQpOworICAgICAgICAgIHBhaW50LnNldFRleHRTY2FsZVgoMSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbV9wQ2FudmFzLT5zYXZlKCk7CisgICAgICAgICAgU2tNYXRyaXggYWRqdXN0OworICAgICAgICAgIGFkanVzdC5yZXNldCgpOworICAgICAgICAgIGFkanVzdC5zZXRTY2FsZVgoY3AubV9BZGp1c3RNYXRyaXhbMF0pOworICAgICAgICAgIGFkanVzdC5zZXRTa2V3WChjcC5tX0FkanVzdE1hdHJpeFsxXSk7CisgICAgICAgICAgYWRqdXN0LnNldFNrZXdZKGNwLm1fQWRqdXN0TWF0cml4WzJdKTsKKyAgICAgICAgICBhZGp1c3Quc2V0U2NhbGVZKGNwLm1fQWRqdXN0TWF0cml4WzNdKTsKKyAgICAgICAgICBhZGp1c3QucHJlVHJhbnNsYXRlKHBvc2l0aW9uc1tpbmRleF0uZlgsIHBvc2l0aW9uc1tpbmRleF0uZlkpOworICAgICAgICAgIG1fcENhbnZhcy0+Y29uY2F0KGFkanVzdCk7CisgICAgICAgICAgbV9wQ2FudmFzLT5kcmF3VGV4dCgmZ2x5cGhzW2luZGV4XSwgMSwgMCwgMCwgcGFpbnQpOworICAgICAgICAgIG1fcENhbnZhcy0+cmVzdG9yZSgpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBtX3BDYW52YXMtPmRyYXdUZXh0KCZnbHlwaHNbaW5kZXhdLCAxLCBwb3NpdGlvbnNbaW5kZXhdLmZYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uc1tpbmRleF0uZlksIHBhaW50KTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgbV9wQ2FudmFzLT5kcmF3UG9zVGV4dChnbHlwaHMuYmVnaW4oKSwgbkNoYXJzICogMiwgcG9zaXRpb25zLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWludCk7CisgIH0KICAgbV9wQ2FudmFzLT5yZXN0b3JlKCk7CiAKICAgcmV0dXJuIHRydWU7CkBAIC0xMzcxLDEwICsxNzIzLDE0IEBACiB9CiAKIHZvaWQgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNhdmVTdGF0ZSgpIHsKKyAgbV9wQ2FjaGUtPkRlYnVnQ2hlY2tDbGlwKCk7CiAgIGlmICghbV9wQ2FjaGUtPkNsaXBTYXZlKCkpCiAgICAgbV9wQ2FudmFzLT5zYXZlKCk7CiAKICNpZmRlZiBfU0tJQV9TVVBQT1JUX1BBVEhTXworI2lmIFNIT1dfU0tJQV9QQVRICisgIHByaW50ZigiU2F2ZVN0YXRlICV6ZFxuIiwgbV9TdGF0ZVN0YWNrLnNpemUoKSk7CisjZW5kaWYKICAgc3RkOjp1bmlxdWVfcHRyPENGWF9DbGlwUmduPiBwQ2xpcDsKICAgaWYgKG1fcENsaXBSZ24pCiAgICAgcENsaXAgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0NsaXBSZ24+KCptX3BDbGlwUmduKTsKQEAgLTEzODMsMTYgKzE3MzksMjQgQEAKIH0KIAogdm9pZCBDRlhfU2tpYURldmljZURyaXZlcjo6UmVzdG9yZVN0YXRlKGJvb2wgYktlZXBTYXZlZCkgewotICBpZiAoIW1fcENhY2hlLT5DbGlwUmVzdG9yZSgpKQotICAgIG1fcENhbnZhcy0+cmVzdG9yZSgpOwotICBpZiAoYktlZXBTYXZlZCAmJiAhbV9wQ2FjaGUtPkNsaXBTYXZlKCkpCi0gICAgbV9wQ2FudmFzLT5zYXZlKCk7CiAjaWZkZWYgX1NLSUFfU1VQUE9SVF9QQVRIU18KICAgbV9wQ2xpcFJnbi5yZXNldCgpOwogCiAgIGlmIChtX1N0YXRlU3RhY2suZW1wdHkoKSkKICAgICByZXR1cm47Ci0KKyNlbHNlCisgIGlmIChtX3BDYWNoZS0+SXNFbXB0eSgpKQorICAgIHJldHVybjsKKyNlbmRpZgorICBpZiAoIW1fcENhY2hlLT5DbGlwUmVzdG9yZSgpKQorICAgIG1fcENhbnZhcy0+cmVzdG9yZSgpOworICBpZiAoYktlZXBTYXZlZCAmJiAhbV9wQ2FjaGUtPkNsaXBTYXZlKCkpCisgICAgbV9wQ2FudmFzLT5zYXZlKCk7CisjaWZkZWYgX1NLSUFfU1VQUE9SVF9QQVRIU18KKyNpZiBTSE9XX1NLSUFfUEFUSAorICBwcmludGYoIlJlc3RvcmVTdGF0ZSAlemQgJXNcbiIsIG1fU3RhdGVTdGFjay5zaXplKCksCisgICAgICAgICBiS2VlcFNhdmVkID8gImJLZWVwU2F2ZWQiIDogIiIpOworI2VuZGlmCiAgIGlmIChiS2VlcFNhdmVkKSB7CiAgICAgaWYgKG1fU3RhdGVTdGFjay5iYWNrKCkpCiAgICAgICBtX3BDbGlwUmduID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9DbGlwUmduPigqbV9TdGF0ZVN0YWNrLmJhY2soKSk7CkBAIC0xNDAwLDYgKzE3NjQsNyBAQAogICAgIG1fcENsaXBSZ24gPSBzdGQ6Om1vdmUobV9TdGF0ZVN0YWNrLmJhY2soKSk7CiAgICAgbV9TdGF0ZVN0YWNrLnBvcF9iYWNrKCk7CiAgIH0KKyAgbV9wQ2FjaGUtPkRlYnVnQ2hlY2tDbGlwKCk7CiAjZW5kaWYgIC8vIF9TS0lBX1NVUFBPUlRfUEFUSFNfCiB9CiAKQEAgLTE0MDksOCArMTc3NCw3IEBACiAgIEZYX1JFQ1QgcGF0aF9yZWN0KGNsaXBCb3gubGVmdCwgY2xpcEJveC50b3AsIGNsaXBCb3gucmlnaHQgKyAxLAogICAgICAgICAgICAgICAgICAgICBjbGlwQm94LmJvdHRvbSArIDEpOwogICBwYXRoX3JlY3QuSW50ZXJzZWN0KG1fcENsaXBSZ24tPkdldEJveCgpKTsKLSAgQ0ZYX0RJQml0bWFwUmVmIG1hc2s7Ci0gIENGWF9ESUJpdG1hcCogcFRoaXNMYXllciA9IG1hc2suRW1wbGFjZSgpOworICBhdXRvIHBUaGlzTGF5ZXIgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOwogICBwVGhpc0xheWVyLT5DcmVhdGUocGF0aF9yZWN0LldpZHRoKCksIHBhdGhfcmVjdC5IZWlnaHQoKSwgRlhESUJfOGJwcE1hc2spOwogICBwVGhpc0xheWVyLT5DbGVhcigwKTsKIApAQCAtMTQxOSwxNiArMTc4MywxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgU2tDb2xvclR5cGU6OmtBbHBoYV84X1NrQ29sb3JUeXBlLCBrT3BhcXVlX1NrQWxwaGFUeXBlKTsKICAgU2tCaXRtYXAgYml0bWFwOwogICBiaXRtYXAuaW5zdGFsbFBpeGVscyhpbWFnZUluZm8sIHBUaGlzTGF5ZXItPkdldEJ1ZmZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICBwVGhpc0xheWVyLT5HZXRQaXRjaCgpLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKTsKLSAgU2tDYW52YXMqIGNhbnZhcyA9IG5ldyBTa0NhbnZhcyhiaXRtYXApOworICAgICAgICAgICAgICAgICAgICAgICBwVGhpc0xheWVyLT5HZXRQaXRjaCgpKTsKKyAgYXV0byBjYW52YXMgPSBwZGZpdW06Ok1ha2VVbmlxdWU8U2tDYW52YXM+KGJpdG1hcCk7CiAgIGNhbnZhcy0+dHJhbnNsYXRlKAogICAgICAgLXBhdGhfcmVjdC5sZWZ0LAogICAgICAgLXBhdGhfcmVjdC50b3ApOyAgLy8gRklYTUUoY2FyeWNsYXJrKSB3cm9uZyBzaWduKHMpPyB1cHNpZGUgZG93bj8KICAgU2tQYWludCBwYWludDsKICAgcGFpbnQuc2V0QW50aUFsaWFzKChtX0ZpbGxGbGFncyAmIEZYRklMTF9OT1BBVEhTTU9PVEgpID09IDApOwogICBjYW52YXMtPmRyYXdQYXRoKHBhdGgsIHBhaW50KTsKLSAgbV9wQ2xpcFJnbi0+SW50ZXJzZWN0TWFza0YocGF0aF9yZWN0LmxlZnQsIHBhdGhfcmVjdC50b3AsIG1hc2spOwotICBkZWxldGUgY2FudmFzOworICBtX3BDbGlwUmduLT5JbnRlcnNlY3RNYXNrRihwYXRoX3JlY3QubGVmdCwgcGF0aF9yZWN0LnRvcCwgcFRoaXNMYXllcik7CiB9CiAjZW5kaWYgIC8vIF9TS0lBX1NVUFBPUlRfUEFUSFNfCiAKQEAgLTE0NTIsOSArMTgxNSw5IEBACiAgICAgICBwUGF0aERhdGEtPkdldFBvaW50cygpLnNpemUoKSA9PSA0KSB7CiAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0ZjsKICAgICBpZiAocFBhdGhEYXRhLT5Jc1JlY3QoZGV2aWNlTWF0cml4LCAmcmVjdGYpKSB7Ci0gICAgICByZWN0Zi5JbnRlcnNlY3QoCi0gICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCgwLCAwLCAoRlhfRkxPQVQpR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfSEVJR0hUKSkpOworICAgICAgcmVjdGYuSW50ZXJzZWN0KENGWF9GbG9hdFJlY3QoMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdClHZXREZXZpY2VDYXBzKEZYRENfUElYRUxfV0lEVEgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KUdldERldmljZUNhcHMoRlhEQ19QSVhFTF9IRUlHSFQpKSk7CiAgICAgICAvLyBub3RlIHRoYXQgUERGJ3MgeS1heGlzIGdvZXMgdXA7IFNraWEncyB5LWF4aXMgZ29lcyBkb3duCiAgICAgICBpZiAoIWNhY2hlZCkgewogICAgICAgICBTa1JlY3Qgc2tDbGlwUmVjdCA9CkBAIC0xNDY3LDcgKzE4MzAsNyBAQAogICAgICAgRlhfUkVDVCByZWN0ID0gcmVjdGYuR2V0T3V0ZXJSZWN0KCk7CiAgICAgICBtX3BDbGlwUmduLT5JbnRlcnNlY3RSZWN0KHJlY3QpOwogI2VuZGlmICAvLyBfU0tJQV9TVVBQT1JUX1BBVEhTXwotICAgICAgRGVidWdTaG93Q2FudmFzQ2xpcChtX3BDYW52YXMpOworICAgICAgRGVidWdTaG93Q2FudmFzQ2xpcCh0aGlzLCBtX3BDYW52YXMpOwogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICB9CkBAIC0xNDg3LDcgKzE4NTAsNyBAQAogICAgICAgICAgICAgICAgICAgR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpOwogICBTZXRDbGlwTWFzayhjbGlwQm94LCBza0NsaXBQYXRoKTsKICNlbmRpZiAgLy8gX1NLSUFfU1VQUE9SVF9QQVRIU18KLSAgRGVidWdTaG93Q2FudmFzQ2xpcChtX3BDYW52YXMpOworICBEZWJ1Z1Nob3dDYW52YXNDbGlwKHRoaXMsIG1fcENhbnZhcyk7CiAgIHJldHVybiB0cnVlOwogfQogCkBAIC0xNTIxLDcgKzE4ODQsNyBAQAogICAgICAgICAgICAgICAgICAgR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCkpOwogICBTZXRDbGlwTWFzayhjbGlwQm94LCBkc3RfcGF0aCk7CiAjZW5kaWYgIC8vIF9TS0lBX1NVUFBPUlRfUEFUSFNfCi0gIERlYnVnU2hvd0NhbnZhc0NsaXAobV9wQ2FudmFzKTsKKyAgRGVidWdTaG93Q2FudmFzQ2xpcCh0aGlzLCBtX3BDYW52YXMpOwogICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMTU3NCw3ICsxOTM3LDcgQEAKICNpZmRlZiBfU0tJQV9TVVBQT1JUX1BBVEhTXwogICAgIG1fcEJpdG1hcC0+UHJlTXVsdGlwbHkoKTsKICNlbmRpZiAgLy8gX1NLSUFfU1VQUE9SVF9QQVRIU18KLSAgICBEZWJ1Z1Nob3dTa2lhRHJhd1BhdGgobV9wQ2FudmFzLCBza1BhaW50LCAqZmlsbFBhdGgpOworICAgIERlYnVnU2hvd1NraWFEcmF3UGF0aCh0aGlzLCBtX3BDYW52YXMsIHNrUGFpbnQsICpmaWxsUGF0aCk7CiAgICAgbV9wQ2FudmFzLT5kcmF3UGF0aCgqZmlsbFBhdGgsIHNrUGFpbnQpOwogICB9CiAgIGlmIChwR3JhcGhTdGF0ZSAmJiBzdHJva2VfYWxwaGEpIHsKQEAgLTE1ODMsMTcgKzE5NDYsMTUgQEAKICNpZmRlZiBfU0tJQV9TVVBQT1JUX1BBVEhTXwogICAgIG1fcEJpdG1hcC0+UHJlTXVsdGlwbHkoKTsKICNlbmRpZiAgLy8gX1NLSUFfU1VQUE9SVF9QQVRIU18KLSAgICBEZWJ1Z1Nob3dTa2lhRHJhd1BhdGgobV9wQ2FudmFzLCBza1BhaW50LCBza1BhdGgpOworICAgIERlYnVnU2hvd1NraWFEcmF3UGF0aCh0aGlzLCBtX3BDYW52YXMsIHNrUGFpbnQsIHNrUGF0aCk7CiAgICAgbV9wQ2FudmFzLT5kcmF3UGF0aChza1BhdGgsIHNrUGFpbnQpOwogICB9CiAgIG1fcENhbnZhcy0+cmVzdG9yZSgpOwogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDRlhfU2tpYURldmljZURyaXZlcjo6RHJhd0Nvc21ldGljTGluZShGWF9GTE9BVCB4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MiwKK2Jvb2wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkRyYXdDb3NtZXRpY0xpbmUoY29uc3QgQ0ZYX1BvaW50RiYgcHRNb3ZlVG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0TGluZVRvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKICAgcmV0dXJuIGZhbHNlOwpAQCAtMTYxMCw3ICsxOTcxLDcgQEAKICAgU2tSZWN0IHJlY3QgPQogICAgICAgU2tSZWN0OjpNYWtlTFRSQihwUmVjdC0+bGVmdCwgU2tUTWluKHBSZWN0LT50b3AsIHBSZWN0LT5ib3R0b20pLAogICAgICAgICAgICAgICAgICAgICAgICBwUmVjdC0+cmlnaHQsIFNrVE1heChwUmVjdC0+Ym90dG9tLCBwUmVjdC0+dG9wKSk7Ci0gIERlYnVnU2hvd1NraWFEcmF3UmVjdChtX3BDYW52YXMsIHNwYWludCwgcmVjdCk7CisgIERlYnVnU2hvd1NraWFEcmF3UmVjdCh0aGlzLCBtX3BDYW52YXMsIHNwYWludCwgcmVjdCk7CiAgIG1fcENhbnZhcy0+ZHJhd1JlY3QocmVjdCwgc3BhaW50KTsKICAgcmV0dXJuIHRydWU7CiB9CkBAIC0xNjc4LDEwICsyMDM5LDEwIEBACiAgIFNrUGF0aCBza0NsaXA7CiAgIFNrUGF0aCBza1BhdGg7CiAgIGlmIChrQXhpYWxTaGFkaW5nID09IHNoYWRpbmdUeXBlKSB7Ci0gICAgRlhfRkxPQVQgc3RhcnRfeCA9IHBDb29yZHMtPkdldE51bWJlckF0KDApOwotICAgIEZYX0ZMT0FUIHN0YXJ0X3kgPSBwQ29vcmRzLT5HZXROdW1iZXJBdCgxKTsKLSAgICBGWF9GTE9BVCBlbmRfeCA9IHBDb29yZHMtPkdldE51bWJlckF0KDIpOwotICAgIEZYX0ZMT0FUIGVuZF95ID0gcENvb3Jkcy0+R2V0TnVtYmVyQXQoMyk7CisgICAgZmxvYXQgc3RhcnRfeCA9IHBDb29yZHMtPkdldE51bWJlckF0KDApOworICAgIGZsb2F0IHN0YXJ0X3kgPSBwQ29vcmRzLT5HZXROdW1iZXJBdCgxKTsKKyAgICBmbG9hdCBlbmRfeCA9IHBDb29yZHMtPkdldE51bWJlckF0KDIpOworICAgIGZsb2F0IGVuZF95ID0gcENvb3Jkcy0+R2V0TnVtYmVyQXQoMyk7CiAgICAgU2tQb2ludCBwdHNbXSA9IHt7c3RhcnRfeCwgc3RhcnRfeX0sIHtlbmRfeCwgZW5kX3l9fTsKICAgICBza01hdHJpeC5tYXBQb2ludHMocHRzLCBTS19BUlJBWV9DT1VOVChwdHMpKTsKICAgICBwYWludC5zZXRTaGFkZXIoU2tHcmFkaWVudFNoYWRlcjo6TWFrZUxpbmVhcigKQEAgLTE3MTgsMTIgKzIwNzksMTIgQEAKICAgICBza1BhdGguYWRkUmVjdChza1JlY3QpOwogICAgIHNrTWF0cml4LnNldElkZW50aXR5KCk7CiAgIH0gZWxzZSBpZiAoa1JhZGlhbFNoYWRpbmcgPT0gc2hhZGluZ1R5cGUpIHsKLSAgICBGWF9GTE9BVCBzdGFydF94ID0gcENvb3Jkcy0+R2V0TnVtYmVyQXQoMCk7Ci0gICAgRlhfRkxPQVQgc3RhcnRfeSA9IHBDb29yZHMtPkdldE51bWJlckF0KDEpOwotICAgIEZYX0ZMT0FUIHN0YXJ0X3IgPSBwQ29vcmRzLT5HZXROdW1iZXJBdCgyKTsKLSAgICBGWF9GTE9BVCBlbmRfeCA9IHBDb29yZHMtPkdldE51bWJlckF0KDMpOwotICAgIEZYX0ZMT0FUIGVuZF95ID0gcENvb3Jkcy0+R2V0TnVtYmVyQXQoNCk7Ci0gICAgRlhfRkxPQVQgZW5kX3IgPSBwQ29vcmRzLT5HZXROdW1iZXJBdCg1KTsKKyAgICBmbG9hdCBzdGFydF94ID0gcENvb3Jkcy0+R2V0TnVtYmVyQXQoMCk7CisgICAgZmxvYXQgc3RhcnRfeSA9IHBDb29yZHMtPkdldE51bWJlckF0KDEpOworICAgIGZsb2F0IHN0YXJ0X3IgPSBwQ29vcmRzLT5HZXROdW1iZXJBdCgyKTsKKyAgICBmbG9hdCBlbmRfeCA9IHBDb29yZHMtPkdldE51bWJlckF0KDMpOworICAgIGZsb2F0IGVuZF95ID0gcENvb3Jkcy0+R2V0TnVtYmVyQXQoNCk7CisgICAgZmxvYXQgZW5kX3IgPSBwQ29vcmRzLT5HZXROdW1iZXJBdCg1KTsKICAgICBTa1BvaW50IHB0c1tdID0ge3tzdGFydF94LCBzdGFydF95fSwge2VuZF94LCBlbmRfeX19OwogCiAgICAgcGFpbnQuc2V0U2hhZGVyKFNrR3JhZGllbnRTaGFkZXI6Ok1ha2VUd29Qb2ludENvbmljYWwoCkBAIC0xNzY2LDExICsyMTI3LDExIEBACiAgICAgICAgIFNrUG9pbnQgdGVtcEN1Ymljc1s0XTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KVNLX0FSUkFZX0NPVU5UKHRlbXBDdWJpY3MpOyBpKyspCiAgICAgICAgICAgdGVtcEN1Ymljc1tpXSA9IGN1Ymljc1soZmxhZyAqIDMgKyBpKSAlIDEyXTsKLSAgICAgICAgRlhTWVNfbWVtY3B5KGN1YmljcywgdGVtcEN1Ymljcywgc2l6ZW9mKHRlbXBDdWJpY3MpKTsKKyAgICAgICAgbWVtY3B5KGN1YmljcywgdGVtcEN1Ymljcywgc2l6ZW9mKHRlbXBDdWJpY3MpKTsKICAgICAgICAgU2tDb2xvciB0ZW1wQ29sb3JzWzJdOwogICAgICAgICB0ZW1wQ29sb3JzWzBdID0gY29sb3JzW2ZsYWddOwogICAgICAgICB0ZW1wQ29sb3JzWzFdID0gY29sb3JzWyhmbGFnICsgMSkgJSA0XTsKLSAgICAgICAgRlhTWVNfbWVtY3B5KGNvbG9ycywgdGVtcENvbG9ycywgc2l6ZW9mKHRlbXBDb2xvcnMpKTsKKyAgICAgICAgbWVtY3B5KGNvbG9ycywgdGVtcENvbG9ycywgc2l6ZW9mKHRlbXBDb2xvcnMpKTsKICAgICAgIH0KICAgICAgIGZvciAoaW50IGkgPSBpU3RhcnRQb2ludDsgaSA8IChpbnQpU0tfQVJSQVlfQ09VTlQoY3ViaWNzKTsgaSsrKSB7CiAgICAgICAgIENGWF9Qb2ludEYgcG9pbnQgPSBzdHJlYW0uUmVhZENvb3JkcygpOwpAQCAtMTc3OCw5ICsyMTM5LDkgQEAKICAgICAgICAgY3ViaWNzW2ldLmZZID0gcG9pbnQueTsKICAgICAgIH0KICAgICAgIGZvciAoaW50IGkgPSBpU3RhcnRDb2xvcjsgaSA8IChpbnQpU0tfQVJSQVlfQ09VTlQoY29sb3JzKTsgaSsrKSB7Ci0gICAgICAgIEZYX0ZMT0FUIHI7Ci0gICAgICAgIEZYX0ZMT0FUIGc7Ci0gICAgICAgIEZYX0ZMT0FUIGI7CisgICAgICAgIGZsb2F0IHI7CisgICAgICAgIGZsb2F0IGc7CisgICAgICAgIGZsb2F0IGI7CiAgICAgICAgIHN0ZDo6dGllKHIsIGcsIGIpID0gc3RyZWFtLlJlYWRDb2xvcigpOwogICAgICAgICBjb2xvcnNbaV0gPSBTa0NvbG9yU2V0QVJHQklubGluZSgweEZGLCAoVThDUFUpKHIgKiAyNTUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVThDUFUpKGcgKiAyNTUpLCAoVThDUFUpKGIgKiAyNTUpKTsKQEAgLTE4MDQsMTYgKzIxNjUsMjggQEAKIH0KIAogYm9vbCBDRlhfU2tpYURldmljZURyaXZlcjo6R2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCkgeworI2lmZGVmIF9TS0lBX1NVUFBPUlRfUEFUSFNfCisgIGlmICghbV9wQ2xpcFJnbikgeworICAgIHBSZWN0LT5sZWZ0ID0gcFJlY3QtPnRvcCA9IDA7CisgICAgcFJlY3QtPnJpZ2h0ID0gR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX1dJRFRIKTsKKyAgICBwUmVjdC0+Ym90dG9tID0gR2V0RGV2aWNlQ2FwcyhGWERDX1BJWEVMX0hFSUdIVCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgKnBSZWN0ID0gbV9wQ2xpcFJnbi0+R2V0Qm94KCk7CisjZWxzZQogICAvLyBUT0RPKGNhcnljbGFyaykgY2FsbCBtX2NhbnZhcy0+Z2V0Q2xpcERldmljZUJvdW5kcygpIGluc3RlYWQKICAgcFJlY3QtPmxlZnQgPSAwOwogICBwUmVjdC0+dG9wID0gMDsKICAgY29uc3QgU2tJbWFnZUluZm8mIGNhbnZhc1NpemUgPSBtX3BDYW52YXMtPmltYWdlSW5mbygpOwogICBwUmVjdC0+cmlnaHQgPSBjYW52YXNTaXplLndpZHRoKCk7CiAgIHBSZWN0LT5ib3R0b20gPSBjYW52YXNTaXplLmhlaWdodCgpOworI2VuZGlmCiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCkgeworYm9vbCBDRlhfU2tpYURldmljZURyaXZlcjo6R2V0RElCaXRzKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3ApIHsKICAgaWYgKCFtX3BCaXRtYXApCiAgICAgcmV0dXJuIHRydWU7CiAgIHVpbnQ4X3QqIHNyY0J1ZmZlciA9IG1fcEJpdG1hcC0+R2V0QnVmZmVyKCk7CkBAIC0xODI3LDggKzIyMDAsNyBAQAogICBTa0ltYWdlSW5mbyBzcmNJbWFnZUluZm8gPSBTa0ltYWdlSW5mbzo6TWFrZSgKICAgICAgIHNyY1dpZHRoLCBzcmNIZWlnaHQsIFNrQ29sb3JUeXBlOjprTjMyX1NrQ29sb3JUeXBlLCBrUHJlbXVsX1NrQWxwaGFUeXBlKTsKICAgU2tCaXRtYXAgc2tTcmNCaXRtYXA7Ci0gIHNrU3JjQml0bWFwLmluc3RhbGxQaXhlbHMoc3JjSW1hZ2VJbmZvLCBzcmNCdWZmZXIsIHNyY1Jvd0J5dGVzLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIpOworICBza1NyY0JpdG1hcC5pbnN0YWxsUGl4ZWxzKHNyY0ltYWdlSW5mbywgc3JjQnVmZmVyLCBzcmNSb3dCeXRlcyk7CiAgIFNrQVNTRVJUKHBCaXRtYXApOwogICB1aW50OF90KiBkc3RCdWZmZXIgPSBwQml0bWFwLT5HZXRCdWZmZXIoKTsKICAgU2tBU1NFUlQoZHN0QnVmZmVyKTsKQEAgLTE4MzgsOCArMjIxMCw3IEBACiAgIFNrSW1hZ2VJbmZvIGRzdEltYWdlSW5mbyA9IFNrSW1hZ2VJbmZvOjpNYWtlKAogICAgICAgZHN0V2lkdGgsIGRzdEhlaWdodCwgU2tDb2xvclR5cGU6OmtOMzJfU2tDb2xvclR5cGUsIGtQcmVtdWxfU2tBbHBoYVR5cGUpOwogICBTa0JpdG1hcCBza0RzdEJpdG1hcDsKLSAgc2tEc3RCaXRtYXAuaW5zdGFsbFBpeGVscyhkc3RJbWFnZUluZm8sIGRzdEJ1ZmZlciwgZHN0Um93Qnl0ZXMsIG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0cik7CisgIHNrRHN0Qml0bWFwLmluc3RhbGxQaXhlbHMoZHN0SW1hZ2VJbmZvLCBkc3RCdWZmZXIsIGRzdFJvd0J5dGVzKTsKICAgU2tDYW52YXMgY2FudmFzKHNrRHN0Qml0bWFwKTsKICAgY2FudmFzLmRyYXdCaXRtYXAoc2tTcmNCaXRtYXAsIGxlZnQsIHRvcCwgbnVsbHB0cik7CiAgIHJldHVybiB0cnVlOwpAQCAtMTg1MCw3ICsyMjIxLDcgQEAKICAgbV9wQml0bWFwLT5VblByZU11bHRpcGx5KCk7CiAgIEZYX1JFQ1QgcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBwQml0bWFwLT5HZXRXaWR0aCgpLAogICAgICAgICAgICAgICAgdG9wICsgcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBwQmFjazsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcEJhY2s7CiAgIGlmIChtX3BPcmlEZXZpY2UpIHsKICAgICBwQmFjayA9IG1fcE9yaURldmljZS0+Q2xvbmUoJnJlY3QpOwogICAgIGlmICghcEJhY2spCkBAIC0xODY5LDIwICsyMjQwLDIwIEBACiAgIHRvcCA9IHN0ZDo6bWluKHRvcCwgMCk7CiAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKICAgICBSZ2JCeXRlT3JkZXJUcmFuc2ZlckJpdG1hcChwQml0bWFwLCAwLCAwLCByZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJhY2suZ2V0KCksIGxlZnQsIHRvcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJhY2ssIGxlZnQsIHRvcCk7CiAgIH0gZWxzZSB7Ci0gICAgYlJldCA9IHBCaXRtYXAtPlRyYW5zZmVyQml0bWFwKDAsIDAsIHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJhY2suZ2V0KCksIGxlZnQsIHRvcCk7CisgICAgYlJldCA9IHBCaXRtYXAtPlRyYW5zZmVyQml0bWFwKDAsIDAsIHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSwgcEJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsIHRvcCk7CiAgIH0KICAgcmV0dXJuIGJSZXQ7CiAjZW5kaWYgIC8vIF9TS0lBX1NVUFBPUlRfUEFUSFNfCiB9CiAKLUNGWF9ESUJpdG1hcCogQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkdldEJhY2tEcm9wKCkgeworUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkdldEJhY2tEcm9wKCkgewogICByZXR1cm4gbV9wT3JpRGV2aWNlOwogfQogCi1ib29sIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKK2Jvb2wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNldERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXJnYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKQEAgLTE4OTQsMzMgKzIyNjUsMzQgQEAKICNpZmRlZiBfU0tJQV9TVVBQT1JUXwogICBDRlhfTWF0cml4IG0ocEJpdG1hcC0+R2V0V2lkdGgoKSwgMCwgMCwgLXBCaXRtYXAtPkdldEhlaWdodCgpLCBsZWZ0LAogICAgICAgICAgICAgICAgdG9wICsgcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOwotICB2b2lkKiBkdW1teTsKLSAgcmV0dXJuIFN0YXJ0RElCaXRzKHBCaXRtYXAsIDB4RkYsIGFyZ2IsICZtLCAwLCBkdW1teSwgYmxlbmRfdHlwZSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfSW1hZ2VSZW5kZXJlcj4gZHVtbXk7CisgIHJldHVybiBTdGFydERJQml0cyhwQml0bWFwLCAweEZGLCBhcmdiLCAmbSwgMCwgJmR1bW15LCBibGVuZF90eXBlKTsKICNlbmRpZiAgLy8gX1NLSUFfU1VQUE9SVF8KIAogI2lmZGVmIF9TS0lBX1NVUFBPUlRfUEFUSFNfCiAgIEZsdXNoKCk7CiAgIGlmIChwQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgcmV0dXJuIG1fcEJpdG1hcC0+Q29tcG9zaXRlTWFzaygKLSAgICAgICAgbGVmdCwgdG9wLCBwU3JjUmVjdC0+V2lkdGgoKSwgcFNyY1JlY3QtPkhlaWdodCgpLCBwQml0bWFwLCBhcmdiLAotICAgICAgICBwU3JjUmVjdC0+bGVmdCwgcFNyY1JlY3QtPnRvcCwgYmxlbmRfdHlwZSwgbV9wQ2xpcFJnbi5nZXQoKSwKLSAgICAgICAgbV9iUmdiQnl0ZU9yZGVyLCAwLCBudWxscHRyKTsKKyAgICByZXR1cm4gbV9wQml0bWFwLT5Db21wb3NpdGVNYXNrKGxlZnQsIHRvcCwgcFNyY1JlY3QtPldpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUmVjdC0+SGVpZ2h0KCksIHBCaXRtYXAsIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUmVjdC0+bGVmdCwgcFNyY1JlY3QtPnRvcCwgYmxlbmRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcENsaXBSZ24uZ2V0KCksIG1fYlJnYkJ5dGVPcmRlciwgMCk7CiAgIH0KICAgcmV0dXJuIG1fcEJpdG1hcC0+Q29tcG9zaXRlQml0bWFwKAogICAgICAgbGVmdCwgdG9wLCBwU3JjUmVjdC0+V2lkdGgoKSwgcFNyY1JlY3QtPkhlaWdodCgpLCBwQml0bWFwLCBwU3JjUmVjdC0+bGVmdCwKLSAgICAgIHBTcmNSZWN0LT50b3AsIGJsZW5kX3R5cGUsIG1fcENsaXBSZ24uZ2V0KCksIG1fYlJnYkJ5dGVPcmRlciwgbnVsbHB0cik7CisgICAgICBwU3JjUmVjdC0+dG9wLCBibGVuZF90eXBlLCBtX3BDbGlwUmduLmdldCgpLCBtX2JSZ2JCeXRlT3JkZXIpOwogI2VuZGlmICAvLyBfU0tJQV9TVVBQT1JUX1BBVEhTXwogfQogCi1ib29sIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKK2Jvb2wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlN0cmV0Y2hESUJpdHMoCisgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwU291cmNlLAorICAgIHVpbnQzMl90IGFyZ2IsCisgICAgaW50IGRlc3RfbGVmdCwKKyAgICBpbnQgZGVzdF90b3AsCisgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICB1aW50MzJfdCBmbGFncywKKyAgICBpbnQgYmxlbmRfdHlwZSkgewogI2lmZGVmIF9TS0lBX1NVUFBPUlRfCiAgIG1fcENhY2hlLT5GbHVzaEZvckRyYXcoKTsKICAgaWYgKCFtX3BCaXRtYXAtPkdldEJ1ZmZlcigpKQpAQCAtMTkzMiw4ICsyMzA0LDggQEAKICAgU2tSZWN0IHNrQ2xpcFJlY3QgPSBTa1JlY3Q6Ok1ha2VMVFJCKHBDbGlwUmVjdC0+bGVmdCwgcENsaXBSZWN0LT5ib3R0b20sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2xpcFJlY3QtPnJpZ2h0LCBwQ2xpcFJlY3QtPnRvcCk7CiAgIG1fcENhbnZhcy0+Y2xpcFJlY3Qoc2tDbGlwUmVjdCwgU2tDbGlwT3A6OmtJbnRlcnNlY3QsIHRydWUpOwotICB2b2lkKiBkdW1teTsKLSAgYm9vbCByZXN1bHQgPSBTdGFydERJQml0cyhwU291cmNlLCAweEZGLCBhcmdiLCAmbSwgMCwgZHVtbXksIGJsZW5kX3R5cGUpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0ltYWdlUmVuZGVyZXI+IGR1bW15OworICBib29sIHJlc3VsdCA9IFN0YXJ0RElCaXRzKHBTb3VyY2UsIDB4RkYsIGFyZ2IsICZtLCAwLCAmZHVtbXksIGJsZW5kX3R5cGUpOwogICBtX3BDYW52YXMtPnJlc3RvcmUoKTsKIAogICByZXR1cm4gcmVzdWx0OwpAQCAtMTk1Myw3ICsyMzI1LDcgQEAKICAgZGVzdF9jbGlwLkludGVyc2VjdCgqcENsaXBSZWN0KTsKICAgQ0ZYX0JpdG1hcENvbXBvc2VyIGNvbXBvc2VyOwogICBjb21wb3Nlci5Db21wb3NlKG1fcEJpdG1hcCwgbV9wQ2xpcFJnbi5nZXQoKSwgMjU1LCBhcmdiLCBkZXN0X2NsaXAsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSwgbV9iUmdiQnl0ZU9yZGVyLCAwLCBudWxscHRyLCBibGVuZF90eXBlKTsKKyAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UsIG1fYlJnYkJ5dGVPcmRlciwgMCwgYmxlbmRfdHlwZSk7CiAgIGRlc3RfY2xpcC5PZmZzZXQoLWRlc3RfcmVjdC5sZWZ0LCAtZGVzdF9yZWN0LnRvcCk7CiAgIENGWF9JbWFnZVN0cmV0Y2hlciBzdHJldGNoZXIoJmNvbXBvc2VyLCBwU291cmNlLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2NsaXAsIGZsYWdzKTsKQEAgLTE5NjMsMjMgKzIzMzUsMjMgQEAKICNlbmRpZiAgLy8gX1NLSUFfU1VQUE9SVF9QQVRIU18KIH0KIAotYm9vbCBDRlhfU2tpYURldmljZURyaXZlcjo6U3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlbmRlcl9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgeworYm9vbCBDRlhfU2tpYURldmljZURyaXZlcjo6U3RhcnRESUJpdHMoCisgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwU291cmNlLAorICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgdWludDMyX3QgYXJnYiwKKyAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgIHVpbnQzMl90IHJlbmRlcl9mbGFncywKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0ltYWdlUmVuZGVyZXI+KiBoYW5kbGUsCisgICAgaW50IGJsZW5kX3R5cGUpIHsKICNpZmRlZiBfU0tJQV9TVVBQT1JUXwogICBtX3BDYWNoZS0+Rmx1c2hGb3JEcmF3KCk7CiAgIERlYnVnVmFsaWRhdGUobV9wQml0bWFwLCBtX3BPcmlEZXZpY2UpOwotICBTa0NvbG9yVGFibGUqIGN0ID0gbnVsbHB0cjsKICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IGRzdDhTdG9yYWdlOwogICBzdGQ6OnVuaXF1ZV9wdHI8dWludDMyX3QsIEZ4RnJlZURlbGV0ZXI+IGRzdDMyU3RvcmFnZTsKICAgU2tCaXRtYXAgc2tCaXRtYXA7CiAgIGludCB3aWR0aCwgaGVpZ2h0OwotICBpZiAoIVVwc2FtcGxlKHBTb3VyY2UsIGRzdDhTdG9yYWdlLCBkc3QzMlN0b3JhZ2UsICZjdCwgJnNrQml0bWFwLCAmd2lkdGgsCi0gICAgICAgICAgICAgICAgJmhlaWdodCwgZmFsc2UpKSB7CisgIGlmICghVXBzYW1wbGUocFNvdXJjZSwgZHN0OFN0b3JhZ2UsIGRzdDMyU3RvcmFnZSwgJnNrQml0bWFwLCAmd2lkdGgsICZoZWlnaHQsCisgICAgICAgICAgICAgICAgZmFsc2UpKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIG1fcENhbnZhcy0+c2F2ZSgpOwpAQCAtMjAwNyw4ICsyMzc5LDYgQEAKICAgICBtX3BDYW52YXMtPmRyYXdCaXRtYXAoc2tCaXRtYXAsIDAsIDAsICZwYWludCk7CiAgIH0KICAgbV9wQ2FudmFzLT5yZXN0b3JlKCk7Ci0gIGlmIChjdCkKLSAgICBjdC0+dW5yZWYoKTsKICAgRGVidWdWYWxpZGF0ZShtX3BCaXRtYXAsIG1fcE9yaURldmljZSk7CiAjZW5kaWYgIC8vIF9TS0lBX1NVUFBPUlRfCiAKQEAgLTIwMTcsMTUgKzIzODcsMTUgQEAKICAgaWYgKCFtX3BCaXRtYXAtPkdldEJ1ZmZlcigpKQogICAgIHJldHVybiB0cnVlOwogICBtX3BCaXRtYXAtPlVuUHJlTXVsdGlwbHkoKTsKLSAgQ0ZYX0ltYWdlUmVuZGVyZXIqIHBSZW5kZXJlciA9IG5ldyBDRlhfSW1hZ2VSZW5kZXJlcjsKLSAgcFJlbmRlcmVyLT5TdGFydChtX3BCaXRtYXAsIG1fcENsaXBSZ24uZ2V0KCksIHBTb3VyY2UsIGJpdG1hcF9hbHBoYSwgYXJnYiwKLSAgICAgICAgICAgICAgICAgICBwTWF0cml4LCByZW5kZXJfZmxhZ3MsIG1fYlJnYkJ5dGVPcmRlciwgMCwgbnVsbHB0cik7Ci0gIGhhbmRsZSA9IHBSZW5kZXJlcjsKKyAgKmhhbmRsZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfSW1hZ2VSZW5kZXJlcj4oCisgICAgICBtX3BCaXRtYXAsIG1fcENsaXBSZ24uZ2V0KCksIHBTb3VyY2UsIGJpdG1hcF9hbHBoYSwgYXJnYiwgcE1hdHJpeCwKKyAgICAgIHJlbmRlcl9mbGFncywgbV9iUmdiQnl0ZU9yZGVyKTsKICNlbmRpZiAgLy8gX1NLSUFfU1VQUE9SVF9QQVRIU18KICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkNvbnRpbnVlRElCaXRzKHZvaWQqIGhhbmRsZSwgSUZYX1BhdXNlKiBwUGF1c2UpIHsKK2Jvb2wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkNvbnRpbnVlRElCaXRzKENGWF9JbWFnZVJlbmRlcmVyKiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSkgewogI2lmZGVmIF9TS0lBX1NVUFBPUlRfCiAgIG1fcENhY2hlLT5GbHVzaEZvckRyYXcoKTsKICAgcmV0dXJuIGZhbHNlOwpAQCAtMjAzNiwxMiArMjQwNiwxMyBAQAogICBpZiAoIW1fcEJpdG1hcC0+R2V0QnVmZmVyKCkpIHsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQotICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZYX0ltYWdlUmVuZGVyZXIqPihoYW5kbGUpLT5Db250aW51ZShwUGF1c2UpOworICByZXR1cm4gaGFuZGxlLT5Db250aW51ZShwUGF1c2UpOwogI2VuZGlmICAvLyBfU0tJQV9TVVBQT1JUX1BBVEhTXwogfQogCiAjaWYgZGVmaW5lZCBfU0tJQV9TVVBQT1JUXwotdm9pZCBDRlhfU2tpYURldmljZURyaXZlcjo6UHJlTXVsdGlwbHkoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXApIHsKK3ZvaWQgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlByZU11bHRpcGx5KAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwRElCaXRtYXApIHsKICAgcERJQml0bWFwLT5QcmVNdWx0aXBseSgpOwogfQogI2VuZGlmICAvLyBfU0tJQV9TVVBQT1JUXwpAQCAtMjA2OCw3ICsyNDM5LDcgQEAKICAgICAgIFNrSW1hZ2VJbmZvOjpNYWtlKHdpZHRoLCBoZWlnaHQsIGtOMzJfU2tDb2xvclR5cGUsIGtQcmVtdWxfU2tBbHBoYVR5cGUpOwogICBTa1BpeG1hcCBwcmVtdWx0aXBsaWVkKHByZW11bHRpcGxpZWRJbmZvLCBidWZmZXIsIHJvd0J5dGVzKTsKICAgdW5wcmVtdWx0aXBsaWVkLnJlYWRQaXhlbHMocHJlbXVsdGlwbGllZCk7Ci0gIHRoaXMtPkRlYnVnVmVyaWZ5Qml0bWFwSXNQcmVNdWx0aXBsaWVkKCk7CisgIHRoaXMtPkRlYnVnVmVyaWZ5Qml0bWFwSXNQcmVNdWx0aXBsaWVkKG51bGxwdHIpOwogfQogCiAjaWZkZWYgX1NLSUFfU1VQUE9SVF9QQVRIU18KQEAgLTIwODIsNyArMjQ1Myw3IEBACiAgIG1fbkZvcm1hdCA9IEZvcm1hdDo6a1VuUHJlTXVsdGlwbGllZDsKICAgaWYgKHByaW9yRm9ybWF0ICE9IEZvcm1hdDo6a1ByZU11bHRpcGxpZWQpCiAgICAgcmV0dXJuOwotICB0aGlzLT5EZWJ1Z1ZlcmlmeUJpdG1hcElzUHJlTXVsdGlwbGllZCgpOworICB0aGlzLT5EZWJ1Z1ZlcmlmeUJpdG1hcElzUHJlTXVsdGlwbGllZChudWxscHRyKTsKICAgaW50IGhlaWdodCA9IHRoaXMtPkdldEhlaWdodCgpOwogICBpbnQgd2lkdGggPSB0aGlzLT5HZXRXaWR0aCgpOwogICBpbnQgcm93Qnl0ZXMgPSB0aGlzLT5HZXRQaXRjaCgpOwpAQCAtMjA5NywyNCArMjQ2OCwyMyBAQAogI2VuZGlmICAvLyBfU0tJQV9TVVBQT1JUX1BBVEhTXwogCiAjaWZkZWYgX1NLSUFfU1VQUE9SVF8KLWJvb2wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkRyYXdCaXRzV2l0aE1hc2soY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7Citib29sIENGWF9Ta2lhRGV2aWNlRHJpdmVyOjpEcmF3Qml0c1dpdGhNYXNrKAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNvdXJjZSwKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBNYXNrLAorICAgIGludCBiaXRtYXBfYWxwaGEsCisgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKKyAgICBpbnQgYmxlbmRfdHlwZSkgewogICBEZWJ1Z1ZhbGlkYXRlKG1fcEJpdG1hcCwgbV9wT3JpRGV2aWNlKTsKLSAgU2tDb2xvclRhYmxlKiBzcmNDdCA9IG51bGxwdHI7Ci0gIFNrQ29sb3JUYWJsZSogbWFza0N0ID0gbnVsbHB0cjsKICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IHNyYzhTdG9yYWdlLCBtYXNrOFN0b3JhZ2U7CiAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50MzJfdCwgRnhGcmVlRGVsZXRlcj4gc3JjMzJTdG9yYWdlLCBtYXNrMzJTdG9yYWdlOwogICBTa0JpdG1hcCBza0JpdG1hcCwgc2tNYXNrOwogICBpbnQgc3JjV2lkdGgsIHNyY0hlaWdodCwgbWFza1dpZHRoLCBtYXNrSGVpZ2h0OwotICBpZiAoIVVwc2FtcGxlKHBTb3VyY2UsIHNyYzhTdG9yYWdlLCBzcmMzMlN0b3JhZ2UsICZzcmNDdCwgJnNrQml0bWFwLAotICAgICAgICAgICAgICAgICZzcmNXaWR0aCwgJnNyY0hlaWdodCwgZmFsc2UpKSB7CisgIGlmICghVXBzYW1wbGUocFNvdXJjZSwgc3JjOFN0b3JhZ2UsIHNyYzMyU3RvcmFnZSwgJnNrQml0bWFwLCAmc3JjV2lkdGgsCisgICAgICAgICAgICAgICAgJnNyY0hlaWdodCwgZmFsc2UpKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIGlmICghVXBzYW1wbGUocE1hc2ssIG1hc2s4U3RvcmFnZSwgbWFzazMyU3RvcmFnZSwgJm1hc2tDdCwgJnNrTWFzaywKLSAgICAgICAgICAgICAgICAmbWFza1dpZHRoLCAmbWFza0hlaWdodCwgdHJ1ZSkpIHsKKyAgaWYgKCFVcHNhbXBsZShwTWFzaywgbWFzazhTdG9yYWdlLCBtYXNrMzJTdG9yYWdlLCAmc2tNYXNrLCAmbWFza1dpZHRoLAorICAgICAgICAgICAgICAgICZtYXNrSGVpZ2h0LCB0cnVlKSkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQogICBtX3BDYW52YXMtPnNhdmUoKTsKQEAgLTIxMzUsMTggKzI1MDUsMTcgQEAKICAgU2tSZWN0IHIgPSB7MCwgMCwgU2tJbnRUb1NjYWxhcihzcmNXaWR0aCksIFNrSW50VG9TY2FsYXIoc3JjSGVpZ2h0KX07CiAgIG1fcENhbnZhcy0+ZHJhd1JlY3QociwgcGFpbnQpOwogICBtX3BDYW52YXMtPnJlc3RvcmUoKTsKLSAgaWYgKHNyY0N0KQotICAgIHNyY0N0LT51bnJlZigpOwogICBEZWJ1Z1ZhbGlkYXRlKG1fcEJpdG1hcCwgbV9wT3JpRGV2aWNlKTsKICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNldEJpdHNXaXRoTWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJTb3VyY2UqIHBNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKK2Jvb2wgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OlNldEJpdHNXaXRoTWFzaygKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXAsCisgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwTWFzaywKKyAgICBpbnQgZGVzdF9sZWZ0LAorICAgIGludCBkZXN0X3RvcCwKKyAgICBpbnQgYml0bWFwX2FscGhhLAorICAgIGludCBibGVuZF90eXBlKSB7CiAgIGlmICghbV9wQml0bWFwIHx8ICFtX3BCaXRtYXAtPkdldEJ1ZmZlcigpKQogICAgIHJldHVybiB0cnVlOwogICBDRlhfTWF0cml4IG0ocEJpdG1hcC0+R2V0V2lkdGgoKSwgMCwgMCwgLXBCaXRtYXAtPkdldEhlaWdodCgpLCBkZXN0X2xlZnQsCkBAIC0yMTY5LDM0ICsyNTM4LDMxIEBACiAjaWZkZWYgX1NLSUFfU1VQUE9SVF8KIHZvaWQgQ0ZYX1NraWFEZXZpY2VEcml2ZXI6OkRlYnVnVmVyaWZ5Qml0bWFwSXNQcmVNdWx0aXBsaWVkKCkgY29uc3QgewogICBpZiAobV9wT3JpRGV2aWNlKQotICAgIG1fcE9yaURldmljZS0+RGVidWdWZXJpZnlCaXRtYXBJc1ByZU11bHRpcGxpZWQoKTsKKyAgICBtX3BPcmlEZXZpY2UtPkRlYnVnVmVyaWZ5Qml0bWFwSXNQcmVNdWx0aXBsaWVkKG51bGxwdHIpOwogfQogI2VuZGlmICAvLyBfU0tJQV9TVVBQT1JUXwogCi1DRlhfRnhnZURldmljZTo6Q0ZYX0Z4Z2VEZXZpY2UoKSB7Ci0jaWZkZWYgX1NLSUFfU1VQUE9SVF8KLSAgbV9iT3duZWRCaXRtYXAgPSBmYWxzZTsKLSNlbmRpZiAgLy8gX1NLSUFfU1VQUE9SVF8KLX0KK0NGWF9EZWZhdWx0UmVuZGVyRGV2aWNlOjpDRlhfRGVmYXVsdFJlbmRlckRldmljZSgpIHt9CiAKICNpZmRlZiBfU0tJQV9TVVBQT1JUXwotdm9pZCBDRlhfRnhnZURldmljZTo6Q2xlYXIodWludDMyX3QgY29sb3IpIHsKK3ZvaWQgQ0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2U6OkNsZWFyKHVpbnQzMl90IGNvbG9yKSB7CiAgIENGWF9Ta2lhRGV2aWNlRHJpdmVyKiBza0RyaXZlciA9CiAgICAgICBzdGF0aWNfY2FzdDxDRlhfU2tpYURldmljZURyaXZlcio+KEdldERldmljZURyaXZlcigpKTsKICAgc2tEcml2ZXItPkNsZWFyKGNvbG9yKTsKIH0KIAotU2tQaWN0dXJlUmVjb3JkZXIqIENGWF9GeGdlRGV2aWNlOjpDcmVhdGVSZWNvcmRlcihpbnQgc2l6ZV94LCBpbnQgc2l6ZV95KSB7CitTa1BpY3R1cmVSZWNvcmRlciogQ0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2U6OkNyZWF0ZVJlY29yZGVyKGludCBzaXplX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3kpIHsKICAgQ0ZYX1NraWFEZXZpY2VEcml2ZXIqIHNrRHJpdmVyID0gbmV3IENGWF9Ta2lhRGV2aWNlRHJpdmVyKHNpemVfeCwgc2l6ZV95KTsKICAgU2V0RGV2aWNlRHJpdmVyKHBkZml1bTo6V3JhcFVuaXF1ZShza0RyaXZlcikpOwogICByZXR1cm4gc2tEcml2ZXItPkdldFJlY29yZGVyKCk7CiB9CiAjZW5kaWYgIC8vIF9TS0lBX1NVUFBPUlRfCiAKLWJvb2wgQ0ZYX0Z4Z2VEZXZpY2U6OkF0dGFjaChDRlhfRElCaXRtYXAqIHBCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmdiQnl0ZU9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE9yaURldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJHcm91cEtub2Nrb3V0KSB7Citib29sIENGWF9EZWZhdWx0UmVuZGVyRGV2aWNlOjpBdHRhY2goY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmdiQnl0ZU9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwT3JpRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkdyb3VwS25vY2tvdXQpIHsKICAgaWYgKCFwQml0bWFwKQogICAgIHJldHVybiBmYWxzZTsKICAgU2V0Qml0bWFwKHBCaXRtYXApOwpAQCAtMjIwNiw3ICsyNTcyLDcgQEAKIH0KIAogI2lmZGVmIF9TS0lBX1NVUFBPUlRfCi1ib29sIENGWF9GeGdlRGV2aWNlOjpBdHRhY2hSZWNvcmRlcihTa1BpY3R1cmVSZWNvcmRlciogcmVjb3JkZXIpIHsKK2Jvb2wgQ0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2U6OkF0dGFjaFJlY29yZGVyKFNrUGljdHVyZVJlY29yZGVyKiByZWNvcmRlcikgewogICBpZiAoIXJlY29yZGVyKQogICAgIHJldHVybiBmYWxzZTsKICAgU2V0RGV2aWNlRHJpdmVyKHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfU2tpYURldmljZURyaXZlcj4ocmVjb3JkZXIpKTsKQEAgLTIyMTQsMTQgKzI1ODAsMTMgQEAKIH0KICNlbmRpZiAgLy8gX1NLSUFfU1VQUE9SVF8KIAotYm9vbCBDRlhfRnhnZURldmljZTo6Q3JlYXRlKGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0Zvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlKSB7Ci0gIG1fYk93bmVkQml0bWFwID0gdHJ1ZTsKLSAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKK2Jvb2wgQ0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2U6OkNyZWF0ZSgKKyAgICBpbnQgd2lkdGgsCisgICAgaW50IGhlaWdodCwKKyAgICBGWERJQl9Gb3JtYXQgZm9ybWF0LAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwT3JpRGV2aWNlKSB7CisgIGF1dG8gcEJpdG1hcCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfRElCaXRtYXA+KCk7CiAgIGlmICghcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCkpIHsKLSAgICBkZWxldGUgcEJpdG1hcDsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KICAgU2V0Qml0bWFwKHBCaXRtYXApOwpAQCAtMjIzMCwxNyArMjU5NSwxMiBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotQ0ZYX0Z4Z2VEZXZpY2U6On5DRlhfRnhnZURldmljZSgpIHsKLSNpZmRlZiBfU0tJQV9TVVBQT1JUXwotICBGbHVzaCgpOwotICAvLyBjYWxsIGRlc3RydWN0b3Igb2YgQ0ZYX1JlbmRlckRldmljZSAvIENGWF9Ta2lhRGV2aWNlRHJpdmVyIGltbWVkaWF0ZWx5Ci0gIGlmIChtX2JPd25lZEJpdG1hcCAmJiBHZXRCaXRtYXAoKSkKLSAgICBkZWxldGUgR2V0Qml0bWFwKCk7Ci0jZW5kaWYgIC8vIF9TS0lBX1NVUFBPUlRfCitDRlhfRGVmYXVsdFJlbmRlckRldmljZTo6fkNGWF9EZWZhdWx0UmVuZGVyRGV2aWNlKCkgeworICBGbHVzaCh0cnVlKTsKIH0KIAogI2lmZGVmIF9TS0lBX1NVUFBPUlRfCi12b2lkIENGWF9GeGdlRGV2aWNlOjpEZWJ1Z1ZlcmlmeUJpdG1hcElzUHJlTXVsdGlwbGllZCgpIGNvbnN0IHsKK3ZvaWQgQ0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2U6OkRlYnVnVmVyaWZ5Qml0bWFwSXNQcmVNdWx0aXBsaWVkKCkgY29uc3QgewogI2lmZGVmIFNLX0RFQlVHCiAgIENGWF9Ta2lhRGV2aWNlRHJpdmVyKiBza0RyaXZlciA9CiAgICAgICBzdGF0aWNfY2FzdDxDRlhfU2tpYURldmljZURyaXZlcio+KEdldERldmljZURyaXZlcigpKTsKQEAgLTIyNDksMTIgKzI2MDksMTMgQEAKICNlbmRpZiAgLy8gU0tfREVCVUcKIH0KIAotYm9vbCBDRlhfRnhnZURldmljZTo6U2V0Qml0c1dpdGhNYXNrKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7Citib29sIENGWF9EZWZhdWx0UmVuZGVyRGV2aWNlOjpTZXRCaXRzV2l0aE1hc2soCisgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwQml0bWFwLAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcE1hc2ssCisgICAgaW50IGxlZnQsCisgICAgaW50IHRvcCwKKyAgICBpbnQgYml0bWFwX2FscGhhLAorICAgIGludCBibGVuZF90eXBlKSB7CiAgIENGWF9Ta2lhRGV2aWNlRHJpdmVyKiBza0RyaXZlciA9CiAgICAgICBzdGF0aWNfY2FzdDxDRlhfU2tpYURldmljZURyaXZlcio+KEdldERldmljZURyaXZlcigpKTsKICAgaWYgKHNrRHJpdmVyKQpAQCAtMjI4Niw4MzQgKzI2NDcsMyBAQAogICB9CiAjZW5kaWYgIC8vIFNLX0RFQlVHCiB9Ci0KLSNpZmRlZiBfU0tJQV9TVVBQT1JUX1BBVEhTXwotY2xhc3MgQ0ZYX1JlbmRlcmVyIHsKLSBwcml2YXRlOgotICBpbnQgbV9BbHBoYSwgbV9SZWQsIG1fR3JlZW4sIG1fQmx1ZSwgbV9HcmF5OwotICB1aW50MzJfdCBtX0NvbG9yOwotICBib29sIG1fYkZ1bGxDb3ZlcjsKLSAgYm9vbCBtX2JSZ2JCeXRlT3JkZXI7Ci0gIENGWF9ESUJpdG1hcCogbV9wT3JpRGV2aWNlOwotICBGWF9SRUNUIG1fQ2xpcEJveDsKLSAgY29uc3QgQ0ZYX0RJQml0bWFwKiBtX3BDbGlwTWFzazsKLSAgQ0ZYX0RJQml0bWFwKiBtX3BEZXZpY2U7Ci0gIGNvbnN0IENGWF9DbGlwUmduKiBtX3BDbGlwUmduOwotICB2b2lkIChDRlhfUmVuZGVyZXI6Oipjb21wb3NpdGVfc3BhbikodWludDhfdCosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCopOwotCi0gcHVibGljOgotICB2b2lkIHByZXBhcmUodW5zaWduZWQpIHt9Ci0KLSAgdm9pZCBDb21wb3NpdGVTcGFuKHVpbnQ4X3QqIGRlc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG9yaV9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkRlc3RBbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuKSB7Ci0gICAgQVNTRVJUKCFtX3BEZXZpY2UtPklzQ215a0ltYWdlKCkpOwotICAgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOwotICAgIGludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQKLSAgICAgICAgICAgICAgICAgICAgICA/IHNwYW5fbGVuCi0gICAgICAgICAgICAgICAgICAgICAgOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7Ci0gICAgaWYgKEJwcCkgewotICAgICAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAqIEJwcDsKLSAgICAgIG9yaV9zY2FuICs9IGNvbF9zdGFydCAqIEJwcDsKLSAgICB9IGVsc2UgewotICAgICAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAvIDg7Ci0gICAgICBvcmlfc2NhbiArPSBjb2xfc3RhcnQgLyA4OwotICAgIH0KLSAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7Ci0gICAgICBpZiAoQnBwID09IDQgJiYgYkRlc3RBbHBoYSkgewotICAgICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7Ci0gICAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7Ci0gICAgICAgICAgfQotICAgICAgICAgIHVpbnQ4X3QgZGVzdF9hbHBoYSA9Ci0gICAgICAgICAgICAgIG9yaV9zY2FuWzNdICsgc3JjX2FscGhhIC0gb3JpX3NjYW5bM10gKiBzcmNfYWxwaGEgLyAyNTU7Ci0gICAgICAgICAgZGVzdF9zY2FuWzNdID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX1JlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgICAgb3JpX3NjYW4rKzsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50IHIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9SZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGludCBnID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGludCBiID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgb3JpX3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCByLCBjb3Zlcl9zY2FuW2NvbF0pOwotICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgZywgY292ZXJfc2Nhbltjb2xdKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGIsIGNvdmVyX3NjYW5bY29sXSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKEJwcCA9PSAzIHx8IEJwcCA9PSA0KSB7Ci0gICAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKLSAgICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaW50IHIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9SZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgaW50IGcgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9HcmVlbiwgc3JjX2FscGhhKTsKLSAgICAgICAgICBpbnQgYiA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbiwgbV9CbHVlLCBzcmNfYWxwaGEpOwotICAgICAgICAgIG9yaV9zY2FuICs9IEJwcCAtIDI7Ci0gICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIHIsIGNvdmVyX3NjYW5bY29sXSk7Ci0gICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGcsIGNvdmVyX3NjYW5bY29sXSk7Ci0gICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGIsIGNvdmVyX3NjYW5bY29sXSk7Ci0gICAgICAgICAgZGVzdF9zY2FuICs9IEJwcCAtIDI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKEJwcCA9PSA0ICYmIGJEZXN0QWxwaGEpIHsKLSAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOwotICAgICAgICB9Ci0gICAgICAgIGludCBzcmNfYWxwaGFfY292ZXJlZCA9IHNyY19hbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgaWYgKHNyY19hbHBoYV9jb3ZlcmVkID09IDApIHsKLSAgICAgICAgICBkZXN0X3NjYW4gKz0gNDsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY292ZXJfc2Nhbltjb2xdID09IDI1NSkgewotICAgICAgICAgIGRlc3Rfc2NhblszXSA9IHNyY19hbHBoYV9jb3ZlcmVkOwotICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fQmx1ZTsKLSAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOwotICAgICAgICAgICpkZXN0X3NjYW4gPSBtX1JlZDsKLSAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoZGVzdF9zY2FuWzNdID09IDApIHsKLSAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IHNyY19hbHBoYV9jb3ZlcmVkOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9CbHVlOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gbV9HcmVlbjsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBtX1JlZDsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIHVpbnQ4X3QgY292ZXIgPSBjb3Zlcl9zY2FuW2NvbF07Ci0gICAgICAgICAgZGVzdF9zY2FuWzNdID0gRlhESUJfQUxQSEFfTUVSR0UoZGVzdF9zY2FuWzNdLCBzcmNfYWxwaGEsIGNvdmVyKTsKLSAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBjb3Zlcik7Ci0gICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGNvdmVyKTsKLSAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGNvdmVyKTsKLSAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoQnBwID09IDMgfHwgQnBwID09IDQpIHsKLSAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKLSAgICAgICAgICAqZGVzdF9zY2FuKysgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBzcmNfYWxwaGEpOwotICAgICAgICAgICpkZXN0X3NjYW4rKyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyZWVuLCBzcmNfYWxwaGEpOwotICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4sIG1fUmVkLCBzcmNfYWxwaGEpOwotICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHAgLSAyOwotICAgICAgICAgIG9yaV9zY2FuICs9IEJwcCAtIDI7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGIgPSBGWERJQl9BTFBIQV9NRVJHRSgqb3JpX3NjYW4rKywgbV9CbHVlLCBzcmNfYWxwaGEpOwotICAgICAgICBpbnQgZyA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyZWVuLCBzcmNfYWxwaGEpOwotICAgICAgICBpbnQgciA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgIG9yaV9zY2FuICs9IEJwcCAtIDI7Ci0gICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBiLCBjb3Zlcl9zY2FuW2NvbF0pOwotICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGcsIGNvdmVyX3NjYW5bY29sXSk7Ci0gICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgciwgY292ZXJfc2Nhbltjb2xdKTsKLSAgICAgICAgZGVzdF9zY2FuICs9IEJwcCAtIDI7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoQnBwID09IDEpIHsKLSAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKLSAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKm9yaV9zY2FuKyssIG1fR3JheSwgc3JjX2FscGhhKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpbnQgZ3JheSA9IEZYRElCX0FMUEhBX01FUkdFKCpvcmlfc2NhbisrLCBtX0dyYXksIHNyY19hbHBoYSk7Ci0gICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIGdyYXksIGNvdmVyX3NjYW5bY29sXSk7Ci0gICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaW50IGluZGV4ID0gMDsKLSAgICAgIGlmIChtX3BEZXZpY2UtPkdldFBhbGV0dGUoKSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykgewotICAgICAgICAgIGlmIChGWEFSR0JfVE9ESUIobV9wRGV2aWNlLT5HZXRQYWxldHRlKClbaV0pID09IG1fQ29sb3IpIHsKLSAgICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGluZGV4ID0gKCh1aW50OF90KW1fQ29sb3IgPT0gMHhmZikgPyAxIDogMDsKLSAgICAgIH0KLSAgICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbjEgPSBkZXN0X3NjYW47Ci0gICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7Ci0gICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgaWYgKCFpbmRleCkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbjEgJj0gfigxIDw8ICg3IC0gKGNvbCArIHNwYW5fbGVmdCkgJSA4KSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICpkZXN0X3NjYW4xIHw9IDEgPDwgKDcgLSAoY29sICsgc3Bhbl9sZWZ0KSAlIDgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZXN0X3NjYW4xID0gZGVzdF9zY2FuICsgKHNwYW5fbGVmdCAlIDggKyBjb2wgLSBjb2xfc3RhcnQgKyAxKSAvIDg7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBDb21wb3NpdGVTcGFuMWJwcCh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgewotICAgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKLSAgICBBU1NFUlQoIW1fcERldmljZS0+SXNDbXlrSW1hZ2UoKSk7Ci0gICAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7Ci0gICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodAotICAgICAgICAgICAgICAgICAgICAgID8gc3Bhbl9sZW4KLSAgICAgICAgICAgICAgICAgICAgICA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKLSAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0IC8gODsKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIGlmIChtX3BEZXZpY2UtPkdldFBhbGV0dGUoKSkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgaWYgKEZYQVJHQl9UT0RJQihtX3BEZXZpY2UtPkdldFBhbGV0dGUoKVtpXSkgPT0gbV9Db2xvcikgewotICAgICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpbmRleCA9ICgodWludDhfdCltX0NvbG9yID09IDB4ZmYpID8gMSA6IDA7Ci0gICAgfQotICAgIHVpbnQ4X3QqIGRlc3Rfc2NhbjEgPSBkZXN0X3NjYW47Ci0gICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgewotICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgIH0KLSAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgaWYgKCFpbmRleCkgewotICAgICAgICAgICpkZXN0X3NjYW4xICY9IH4oMSA8PCAoNyAtIChjb2wgKyBzcGFuX2xlZnQpICUgOCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICpkZXN0X3NjYW4xIHw9IDEgPDwgKDcgLSAoY29sICsgc3Bhbl9sZWZ0KSAlIDgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBkZXN0X3NjYW4xID0gZGVzdF9zY2FuICsgKHNwYW5fbGVmdCAlIDggKyBjb2wgLSBjb2xfc3RhcnQgKyAxKSAvIDg7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBDb21wb3NpdGVTcGFuR3JheSh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgewotICAgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKLSAgICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLSAgICBpbnQgY29sX2VuZCA9IChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgPyBzcGFuX2xlbgotICAgICAgICAgICAgICAgICAgICAgIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotICAgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQ7Ci0gICAgaWYgKGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgewotICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgewotICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICBpZiAobV9iRnVsbENvdmVyKSB7Ci0gICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IG1fR3JheTsKLSAgICAgICAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4gPSBtX0FscGhhOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBzcmNfYWxwaGEgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmF5LCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZXN0X2V4dHJhX2FscGhhX3NjYW4rKzsKLSAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IG1fR3JheTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JheSwgc3JjX2FscGhhKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBDb21wb3NpdGVTcGFuQVJHQih1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgewotICAgIGludCBjb2xfc3RhcnQgPSBzcGFuX2xlZnQgPCBjbGlwX2xlZnQgPyBjbGlwX2xlZnQgLSBzcGFuX2xlZnQgOiAwOwotICAgIGludCBjb2xfZW5kID0gKHNwYW5fbGVmdCArIHNwYW5fbGVuKSA8IGNsaXBfcmlnaHQKLSAgICAgICAgICAgICAgICAgICAgICA/IHNwYW5fbGVuCi0gICAgICAgICAgICAgICAgICAgICAgOiAoY2xpcF9yaWdodCAtIHNwYW5fbGVmdCk7Ci0gICAgZGVzdF9zY2FuICs9IGNvbF9zdGFydCAqIEJwcDsKLSAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7Ci0gICAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7Ci0gICAgICAgIGludCBzcmNfYWxwaGE7Ci0gICAgICAgIGlmIChtX2JGdWxsQ292ZXIpIHsKLSAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY2xpcF9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICAgIGlmIChzcmNfYWxwaGEgPT0gMjU1KSB7Ci0gICAgICAgICAgICAqKHVpbnQzMl90KilkZXN0X3NjYW4gPSBtX0NvbG9yOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPQotICAgICAgICAgICAgICAgIGRlc3Rfc2NhblszXSArIHNyY19hbHBoYSAtIGRlc3Rfc2NhblszXSAqIHNyY19hbHBoYSAvIDI1NTsKLSAgICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICBpbnQgYWxwaGFfcmF0aW8gPSBzcmNfYWxwaGEgKiAyNTUgLyBkZXN0X2FscGhhOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fUmVkLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0JsdWUsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSAyOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSA0OwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKGludCBjb2wgPSBjb2xfc3RhcnQ7IGNvbCA8IGNvbF9lbmQ7IGNvbCsrKSB7Ci0gICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgewotICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGE7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHNyY19hbHBoYSkgewotICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICoodWludDMyX3QqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKGRlc3Rfc2NhblszXSA9PSAwKSB7Ci0gICAgICAgICAgICBkZXN0X3NjYW5bM10gPSBzcmNfYWxwaGE7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IG1fUmVkOwotICAgICAgICAgICAgZGVzdF9zY2FuICs9IDI7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdWludDhfdCBkZXN0X2FscGhhID0KLSAgICAgICAgICAgICAgZGVzdF9zY2FuWzNdICsgc3JjX2FscGhhIC0gZGVzdF9zY2FuWzNdICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgIGRlc3Rfc2NhblszXSA9IGRlc3RfYWxwaGE7Ci0gICAgICAgICAgaW50IGFscGhhX3JhdGlvID0gc3JjX2FscGhhICogMjU1IC8gZGVzdF9hbHBoYTsKLSAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICBkZXN0X3NjYW4gKz0gMjsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZGVzdF9zY2FuICs9IEJwcDsKLSAgICB9Ci0gIH0KLQotICB2b2lkIENvbXBvc2l0ZVNwYW5SR0IodWludDhfdCogZGVzdF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX3JpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGVzdF9leHRyYV9hbHBoYV9zY2FuKSB7Ci0gICAgaW50IGNvbF9zdGFydCA9IHNwYW5fbGVmdCA8IGNsaXBfbGVmdCA/IGNsaXBfbGVmdCAtIHNwYW5fbGVmdCA6IDA7Ci0gICAgaW50IGNvbF9lbmQgPSAoc3Bhbl9sZWZ0ICsgc3Bhbl9sZW4pIDwgY2xpcF9yaWdodAotICAgICAgICAgICAgICAgICAgICAgID8gc3Bhbl9sZW4KLSAgICAgICAgICAgICAgICAgICAgICA6IChjbGlwX3JpZ2h0IC0gc3Bhbl9sZWZ0KTsKLSAgICBkZXN0X3NjYW4gKz0gY29sX3N0YXJ0ICogQnBwOwotICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKLSAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgaWYgKEJwcCA9PSA0KSB7Ci0gICAgICAgICAgICAgICoodWludDMyX3QqKWRlc3Rfc2NhbiA9IG1fQ29sb3I7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEJwcCA9PSAzKSB7Ci0gICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fUmVkOwotICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0dyZWVuOwotICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuICs9IEJwcCAtIDI7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IEJwcDsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKEJwcCA9PSAzICYmIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgewotICAgICAgZm9yIChpbnQgY29sID0gY29sX3N0YXJ0OyBjb2wgPCBjb2xfZW5kOyBjb2wrKykgewotICAgICAgICBpbnQgc3JjX2FscGhhOwotICAgICAgICBpZiAobV9iRnVsbENvdmVyKSB7Ci0gICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoY2xpcF9zY2FuKSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdICogY2xpcF9zY2FuW2NvbF0gLyAyNTUgLyAyNTU7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gLyAyNTU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9CbHVlOwotICAgICAgICAgICAgKmRlc3Rfc2NhbisrID0gKHVpbnQ4X3QpbV9HcmVlbjsKLSAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9ICh1aW50OF90KW1fUmVkOwotICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gKHVpbnQ4X3QpbV9BbHBoYTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBzcmNfYWxwaGEgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9leHRyYV9hbHBoYV9zY2FuKys7Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgewotICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgIGlmIChCcHAgPT0gNCkgewotICAgICAgICAgICAgICAqKHVpbnQzMl90KilkZXN0X3NjYW4gPSBtX0NvbG9yOwotICAgICAgICAgICAgfSBlbHNlIGlmIChCcHAgPT0gMykgewotICAgICAgICAgICAgICAqZGVzdF9zY2FuKysgPSBtX0JsdWU7Ci0gICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fR3JlZW47Ci0gICAgICAgICAgICAgICpkZXN0X3NjYW4rKyA9IG1fUmVkOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX1JlZCwgc3JjX2FscGhhKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbiArPSBCcHAgLSAyOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRlc3Rfc2NhbiArPSBCcHA7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBDb21wb3NpdGVTcGFuQ01ZSyh1aW50OF90KiBkZXN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IEJwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3Bhbl9sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcGFuX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb3Zlcl9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbGlwX2xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXBfcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY2xpcF9zY2FuLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfc2NhbikgewotICAgIEFTU0VSVCghbV9iUmdiQnl0ZU9yZGVyKTsKLSAgICBpbnQgY29sX3N0YXJ0ID0gc3Bhbl9sZWZ0IDwgY2xpcF9sZWZ0ID8gY2xpcF9sZWZ0IC0gc3Bhbl9sZWZ0IDogMDsKLSAgICBpbnQgY29sX2VuZCA9IChzcGFuX2xlZnQgKyBzcGFuX2xlbikgPCBjbGlwX3JpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgPyBzcGFuX2xlbgotICAgICAgICAgICAgICAgICAgICAgIDogKGNsaXBfcmlnaHQgLSBzcGFuX2xlZnQpOwotICAgIGRlc3Rfc2NhbiArPSBjb2xfc3RhcnQgKiA0OwotICAgIGlmIChkZXN0X2V4dHJhX2FscGhhX3NjYW4pIHsKLSAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKG1fYkZ1bGxDb3ZlcikgewotICAgICAgICAgIGlmIChjbGlwX3NjYW4pIHsKLSAgICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjbGlwX3NjYW5bY29sXSAvIDI1NTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgICAgc3JjX2FscGhhID0gbV9BbHBoYSAqIGNvdmVyX3NjYW5bY29sXSAqIGNsaXBfc2Nhbltjb2xdIC8gMjU1IC8gMjU1OwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc3JjX2FscGhhKSB7Ci0gICAgICAgICAgaWYgKHNyY19hbHBoYSA9PSAyNTUpIHsKLSAgICAgICAgICAgICooRlhfQ01ZSyopZGVzdF9zY2FuID0gbV9Db2xvcjsKLSAgICAgICAgICAgICpkZXN0X2V4dHJhX2FscGhhX3NjYW4gPSAodWludDhfdCltX0FscGhhOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1aW50OF90IGRlc3RfYWxwaGEgPSAoKmRlc3RfZXh0cmFfYWxwaGFfc2NhbikgKyBzcmNfYWxwaGEgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkZXN0X2V4dHJhX2FscGhhX3NjYW4pICogc3JjX2FscGhhIC8gMjU1OwotICAgICAgICAgICAgKmRlc3RfZXh0cmFfYWxwaGFfc2NhbisrID0gZGVzdF9hbHBoYTsKLSAgICAgICAgICAgIGludCBhbHBoYV9yYXRpbyA9IHNyY19hbHBoYSAqIDI1NSAvIGRlc3RfYWxwaGE7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fR3JlZW4sIGFscGhhX3JhdGlvKTsKLSAgICAgICAgICAgIGRlc3Rfc2NhbisrOwotICAgICAgICAgICAgKmRlc3Rfc2NhbiA9IEZYRElCX0FMUEhBX01FUkdFKCpkZXN0X3NjYW4sIG1fQmx1ZSwgYWxwaGFfcmF0aW8pOwotICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmF5LCBhbHBoYV9yYXRpbyk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZXN0X2V4dHJhX2FscGhhX3NjYW4rKzsKLSAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAoaW50IGNvbCA9IGNvbF9zdGFydDsgY29sIDwgY29sX2VuZDsgY29sKyspIHsKLSAgICAgICAgaW50IHNyY19hbHBoYTsKLSAgICAgICAgaWYgKGNsaXBfc2NhbikgewotICAgICAgICAgIHNyY19hbHBoYSA9IG1fQWxwaGEgKiBjb3Zlcl9zY2FuW2NvbF0gKiBjbGlwX3NjYW5bY29sXSAvIDI1NSAvIDI1NTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzcmNfYWxwaGEgPSBtX0FscGhhICogY292ZXJfc2Nhbltjb2xdIC8gMjU1OwotICAgICAgICB9Ci0gICAgICAgIGlmIChzcmNfYWxwaGEpIHsKLSAgICAgICAgICBpZiAoc3JjX2FscGhhID09IDI1NSkgewotICAgICAgICAgICAgKihGWF9DTVlLKilkZXN0X3NjYW4gPSBtX0NvbG9yOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9SZWQsIHNyY19hbHBoYSk7Ci0gICAgICAgICAgICBkZXN0X3NjYW4rKzsKLSAgICAgICAgICAgICpkZXN0X3NjYW4gPSBGWERJQl9BTFBIQV9NRVJHRSgqZGVzdF9zY2FuLCBtX0dyZWVuLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9CbHVlLCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICAqZGVzdF9zY2FuID0gRlhESUJfQUxQSEFfTUVSR0UoKmRlc3Rfc2NhbiwgbV9HcmF5LCBzcmNfYWxwaGEpOwotICAgICAgICAgICAgZGVzdF9zY2FuKys7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVzdF9zY2FuICs9IDQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIFNjYW5saW5lPgotICB2b2lkIHJlbmRlcihjb25zdCBTY2FubGluZSYgc2wpIHsKLSAgICBpZiAoIW1fcE9yaURldmljZSAmJiAhY29tcG9zaXRlX3NwYW4pIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50IHkgPSBzbC55KCk7Ci0gICAgaWYgKHkgPCBtX0NsaXBCb3gudG9wIHx8IHkgPj0gbV9DbGlwQm94LmJvdHRvbSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB1aW50OF90KiBkZXN0X3NjYW4gPSBtX3BEZXZpY2UtPkdldEJ1ZmZlcigpICsgbV9wRGV2aWNlLT5HZXRQaXRjaCgpICogeTsKLSAgICB1aW50OF90KiBkZXN0X3NjYW5fZXh0cmFfYWxwaGEgPSBudWxscHRyOwotICAgIENGWF9ESUJpdG1hcCogcEFscGhhTWFzayA9IG1fcERldmljZS0+bV9wQWxwaGFNYXNrOwotICAgIGlmIChwQWxwaGFNYXNrKSB7Ci0gICAgICBkZXN0X3NjYW5fZXh0cmFfYWxwaGEgPQotICAgICAgICAgIHBBbHBoYU1hc2stPkdldEJ1ZmZlcigpICsgcEFscGhhTWFzay0+R2V0UGl0Y2goKSAqIHk7Ci0gICAgfQotICAgIHVpbnQ4X3QqIG9yaV9zY2FuID0gbnVsbHB0cjsKLSAgICBpZiAobV9wT3JpRGV2aWNlKSB7Ci0gICAgICBvcmlfc2NhbiA9IG1fcE9yaURldmljZS0+R2V0QnVmZmVyKCkgKyBtX3BPcmlEZXZpY2UtPkdldFBpdGNoKCkgKiB5OwotICAgIH0KLSAgICBpbnQgQnBwID0gbV9wRGV2aWNlLT5HZXRCUFAoKSAvIDg7Ci0gICAgYm9vbCBiRGVzdEFscGhhID0gbV9wRGV2aWNlLT5IYXNBbHBoYSgpIHx8IG1fcERldmljZS0+SXNBbHBoYU1hc2soKTsKLSAgICB1bnNpZ25lZCBudW1fc3BhbnMgPSBzbC5udW1fc3BhbnMoKTsKLSAgICB0eXBlbmFtZSBTY2FubGluZTo6Y29uc3RfaXRlcmF0b3Igc3BhbiA9IHNsLmJlZ2luKCk7Ci0gICAgd2hpbGUgKDEpIHsKLSAgICAgIGludCB4ID0gc3Bhbi0+eDsKLSAgICAgIEFTU0VSVChzcGFuLT5sZW4gPiAwKTsKLSAgICAgIHVpbnQ4X3QqIGRlc3RfcG9zID0gbnVsbHB0cjsKLSAgICAgIHVpbnQ4X3QqIGRlc3RfZXh0cmFfYWxwaGFfcG9zID0gbnVsbHB0cjsKLSAgICAgIHVpbnQ4X3QqIG9yaV9wb3MgPSBudWxscHRyOwotICAgICAgaWYgKEJwcCkgewotICAgICAgICBvcmlfcG9zID0gb3JpX3NjYW4gPyBvcmlfc2NhbiArIHggKiBCcHAgOiBudWxscHRyOwotICAgICAgICBkZXN0X3BvcyA9IGRlc3Rfc2NhbiArIHggKiBCcHA7Ci0gICAgICAgIGRlc3RfZXh0cmFfYWxwaGFfcG9zID0KLSAgICAgICAgICAgIGRlc3Rfc2Nhbl9leHRyYV9hbHBoYSA/IGRlc3Rfc2Nhbl9leHRyYV9hbHBoYSArIHggOiBudWxscHRyOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZGVzdF9wb3MgPSBkZXN0X3NjYW4gKyB4IC8gODsKLSAgICAgICAgb3JpX3BvcyA9IG9yaV9zY2FuID8gb3JpX3NjYW4gKyB4IC8gOCA6IG51bGxwdHI7Ci0gICAgICB9Ci0gICAgICB1aW50OF90KiBjbGlwX3BvcyA9IG51bGxwdHI7Ci0gICAgICBpZiAobV9wQ2xpcE1hc2spIHsKLSAgICAgICAgY2xpcF9wb3MgPSBtX3BDbGlwTWFzay0+R2V0QnVmZmVyKCkgKwotICAgICAgICAgICAgICAgICAgICh5IC0gbV9DbGlwQm94LnRvcCkgKiBtX3BDbGlwTWFzay0+R2V0UGl0Y2goKSArIHggLQotICAgICAgICAgICAgICAgICAgIG1fQ2xpcEJveC5sZWZ0OwotICAgICAgfQotICAgICAgaWYgKG9yaV9wb3MpIHsKLSAgICAgICAgQ29tcG9zaXRlU3BhbihkZXN0X3Bvcywgb3JpX3BvcywgQnBwLCBiRGVzdEFscGhhLCB4LCBzcGFuLT5sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgc3Bhbi0+Y292ZXJzLCBtX0NsaXBCb3gubGVmdCwgbV9DbGlwQm94LnJpZ2h0LCBjbGlwX3Bvcyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAodGhpcy0+KmNvbXBvc2l0ZV9zcGFuKShkZXN0X3BvcywgQnBwLCB4LCBzcGFuLT5sZW4sIHNwYW4tPmNvdmVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9DbGlwQm94LmxlZnQsIG1fQ2xpcEJveC5yaWdodCwgY2xpcF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfZXh0cmFfYWxwaGFfcG9zKTsKLSAgICAgIH0KLSAgICAgIGlmICgtLW51bV9zcGFucyA9PSAwKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgKytzcGFuOwotICAgIH0KLSAgfQotCi0gIGJvb2wgSW5pdChDRlhfRElCaXRtYXAqIHBEZXZpY2UsCi0gICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPcmlEZXZpY2UsCi0gICAgICAgICAgICBjb25zdCBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCi0gICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKLSAgICAgICAgICAgIGJvb2wgYkZ1bGxDb3ZlciwKLSAgICAgICAgICAgIGJvb2wgYlJnYkJ5dGVPcmRlciwKLSAgICAgICAgICAgIGludCBhbHBoYV9mbGFnID0gMCwKLSAgICAgICAgICAgIHZvaWQqIHBJY2NUcmFuc2Zvcm0gPSBudWxscHRyKSB7Ci0gICAgbV9wRGV2aWNlID0gcERldmljZTsKLSAgICBtX3BDbGlwUmduID0gcENsaXBSZ247Ci0gICAgY29tcG9zaXRlX3NwYW4gPSBudWxscHRyOwotICAgIG1fYlJnYkJ5dGVPcmRlciA9IGJSZ2JCeXRlT3JkZXI7Ci0gICAgbV9wT3JpRGV2aWNlID0gcE9yaURldmljZTsKLSAgICBpZiAobV9wQ2xpcFJnbikgewotICAgICAgbV9DbGlwQm94ID0gbV9wQ2xpcFJnbi0+R2V0Qm94KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1fQ2xpcEJveC5sZWZ0ID0gbV9DbGlwQm94LnRvcCA9IDA7Ci0gICAgICBtX0NsaXBCb3gucmlnaHQgPSBtX3BEZXZpY2UtPkdldFdpZHRoKCk7Ci0gICAgICBtX0NsaXBCb3guYm90dG9tID0gbV9wRGV2aWNlLT5HZXRIZWlnaHQoKTsKLSAgICB9Ci0gICAgbV9wQ2xpcE1hc2sgPSBudWxscHRyOwotICAgIGlmIChtX3BDbGlwUmduICYmIG1fcENsaXBSZ24tPkdldFR5cGUoKSA9PSBDRlhfQ2xpcFJnbjo6TWFza0YpIHsKLSAgICAgIG1fcENsaXBNYXNrID0gbV9wQ2xpcFJnbi0+R2V0TWFzaygpLkdldE9iamVjdCgpOwotICAgIH0KLSAgICBtX2JGdWxsQ292ZXIgPSBiRnVsbENvdmVyOwotICAgIGJvb2wgYk9iamVjdENNWUsgPSAhIUZYR0VURkxBR19DT0xPUlRZUEUoYWxwaGFfZmxhZyk7Ci0gICAgYm9vbCBiRGV2aWNlQ01ZSyA9IHBEZXZpY2UtPklzQ215a0ltYWdlKCk7Ci0gICAgbV9BbHBoYSA9IGJPYmplY3RDTVlLID8gRlhHRVRGTEFHX0FMUEhBX0ZJTEwoYWxwaGFfZmxhZykgOiBGWEFSR0JfQShjb2xvcik7Ci0gICAgQ0NvZGVjX0ljY01vZHVsZSogcEljY01vZHVsZSA9IG51bGxwdHI7Ci0gICAgaWYgKCFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpIHx8Ci0gICAgICAgICFDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKSkgewotICAgICAgcEljY1RyYW5zZm9ybSA9IG51bGxwdHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBJY2NNb2R1bGUgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpLT5HZXRJY2NNb2R1bGUoKTsKLSAgICB9Ci0gICAgaWYgKG1fcERldmljZS0+R2V0QlBQKCkgPT0gOCkgewotICAgICAgQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOwotICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuR3JheTsKLSAgICAgIGlmIChtX3BEZXZpY2UtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgbV9HcmF5ID0gMjU1OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICB1aW50OF90IGdyYXk7Ci0gICAgICAgICAgY29sb3IgPSBiT2JqZWN0Q01ZSyA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOwotICAgICAgICAgIHBJY2NNb2R1bGUtPlRyYW5zbGF0ZVNjYW5saW5lKHBJY2NUcmFuc2Zvcm0sICZncmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KikmY29sb3IsIDEpOwotICAgICAgICAgIG1fR3JheSA9IGdyYXk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKGJPYmplY3RDTVlLKSB7Ci0gICAgICAgICAgICB1aW50OF90IHIsIGcsIGI7Ci0gICAgICAgICAgICBBZG9iZUNNWUtfdG9fc1JHQjEoRlhTWVNfR2V0Q1ZhbHVlKGNvbG9yKSwgRlhTWVNfR2V0TVZhbHVlKGNvbG9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoY29sb3IpLCBGWFNZU19HZXRLVmFsdWUoY29sb3IpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIsIGcsIGIpOwotICAgICAgICAgICAgbV9HcmF5ID0gRlhSR0IyR1JBWShyLCBnLCBiKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9HcmF5ID0KLSAgICAgICAgICAgICAgICBGWFJHQjJHUkFZKEZYQVJHQl9SKGNvbG9yKSwgRlhBUkdCX0coY29sb3IpLCBGWEFSR0JfQihjb2xvcikpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmIChiRGV2aWNlQ01ZSykgewotICAgICAgQVNTRVJUKCFtX2JSZ2JCeXRlT3JkZXIpOwotICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuQ01ZSzsKLSAgICAgIGlmIChiT2JqZWN0Q01ZSykgewotICAgICAgICBtX0NvbG9yID0gRlhDTVlLX1RPRElCKGNvbG9yKTsKLSAgICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAodWludDhfdCopJm1fQ29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKSZtX0NvbG9yLCAxKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFwSWNjVHJhbnNmb3JtKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGNvbG9yID0gRlhBUkdCX1RPRElCKGNvbG9yKTsKLSAgICAgICAgcEljY01vZHVsZS0+VHJhbnNsYXRlU2NhbmxpbmUocEljY1RyYW5zZm9ybSwgKHVpbnQ4X3QqKSZtX0NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopJmNvbG9yLCAxKTsKLSAgICAgIH0KLSAgICAgIG1fUmVkID0gKCh1aW50OF90KikmbV9Db2xvcilbMF07Ci0gICAgICBtX0dyZWVuID0gKCh1aW50OF90KikmbV9Db2xvcilbMV07Ci0gICAgICBtX0JsdWUgPSAoKHVpbnQ4X3QqKSZtX0NvbG9yKVsyXTsKLSAgICAgIG1fR3JheSA9ICgodWludDhfdCopJm1fQ29sb3IpWzNdOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb21wb3NpdGVfc3BhbiA9IChwRGV2aWNlLT5HZXRGb3JtYXQoKSA9PSBGWERJQl9BcmdiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuQVJHQgotICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuUkdCOwotICAgICAgaWYgKHBJY2NUcmFuc2Zvcm0pIHsKLSAgICAgICAgY29sb3IgPSBiT2JqZWN0Q01ZSyA/IEZYQ01ZS19UT0RJQihjb2xvcikgOiBGWEFSR0JfVE9ESUIoY29sb3IpOwotICAgICAgICBwSWNjTW9kdWxlLT5UcmFuc2xhdGVTY2FubGluZShwSWNjVHJhbnNmb3JtLCAodWludDhfdCopJm1fQ29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KikmY29sb3IsIDEpOwotICAgICAgICAoKHVpbnQ4X3QqKSZtX0NvbG9yKVszXSA9IG1fQWxwaGE7Ci0gICAgICAgIG1fUmVkID0gKCh1aW50OF90KikmbV9Db2xvcilbMl07Ci0gICAgICAgIG1fR3JlZW4gPSAoKHVpbnQ4X3QqKSZtX0NvbG9yKVsxXTsKLSAgICAgICAgbV9CbHVlID0gKCh1aW50OF90KikmbV9Db2xvcilbMF07Ci0gICAgICAgIGlmIChtX2JSZ2JCeXRlT3JkZXIpIHsKLSAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPRElCKG1fQ29sb3IpOwotICAgICAgICAgIG1fQ29sb3IgPSBGWEFSR0JfVE9CR1JPUkRFUkRJQihtX0NvbG9yKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGJPYmplY3RDTVlLKSB7Ci0gICAgICAgICAgdWludDhfdCByLCBnLCBiOwotICAgICAgICAgIEFkb2JlQ01ZS190b19zUkdCMShGWFNZU19HZXRDVmFsdWUoY29sb3IpLCBGWFNZU19HZXRNVmFsdWUoY29sb3IpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19HZXRZVmFsdWUoY29sb3IpLCBGWFNZU19HZXRLVmFsdWUoY29sb3IpLCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLCBiKTsKLSAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX01BS0UobV9BbHBoYSwgciwgZywgYik7Ci0gICAgICAgICAgaWYgKG1fYlJnYkJ5dGVPcmRlcikgewotICAgICAgICAgICAgbV9Db2xvciA9IEZYQVJHQl9UT0JHUk9SREVSRElCKG1fQ29sb3IpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPRElCKG1fQ29sb3IpOwotICAgICAgICAgIH0KLSAgICAgICAgICBtX1JlZCA9IHI7Ci0gICAgICAgICAgbV9HcmVlbiA9IGc7Ci0gICAgICAgICAgbV9CbHVlID0gYjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAobV9iUmdiQnl0ZU9yZGVyKSB7Ci0gICAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPQkdST1JERVJESUIoY29sb3IpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX0NvbG9yID0gRlhBUkdCX1RPRElCKGNvbG9yKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgQXJnYkRlY29kZShjb2xvciwgbV9BbHBoYSwgbV9SZWQsIG1fR3JlZW4sIG1fQmx1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fcERldmljZS0+R2V0QlBQKCkgPT0gMSkgewotICAgICAgY29tcG9zaXRlX3NwYW4gPSAmQ0ZYX1JlbmRlcmVyOjpDb21wb3NpdGVTcGFuMWJwcDsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX07Ci0KLSNlbmRpZiAgLy8gX1NLSUFfU1VQUE9SVF9QQVRIU18KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9za2lhL2Z4X3NraWFfZGV2aWNlLmggYi9jb3JlL2Z4Z2Uvc2tpYS9meF9za2lhX2RldmljZS5oCmluZGV4IGVjYjExMDQuLjdkZmRlZjQgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhnZS9za2lhL2Z4X3NraWFfZGV2aWNlLmgKKysrIGIvY29yZS9meGdlL3NraWEvZnhfc2tpYV9kZXZpY2UuaApAQCAtMjQsOSArMjQsOSBAQAogCiBjbGFzcyBDRlhfU2tpYURldmljZURyaXZlciA6IHB1YmxpYyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyIHsKICBwdWJsaWM6Ci0gIENGWF9Ta2lhRGV2aWNlRHJpdmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgQ0ZYX1NraWFEZXZpY2VEcml2ZXIoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJnYkJ5dGVPcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwT3JpRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcE9yaURldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiR3JvdXBLbm9ja291dCk7CiAjaWZkZWYgX1NLSUFfU1VQUE9SVF8KICAgZXhwbGljaXQgQ0ZYX1NraWFEZXZpY2VEcml2ZXIoU2tQaWN0dXJlUmVjb3JkZXIqIHJlY29yZGVyKTsKQEAgLTY5LDI5ICs2OSwyOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSBvdmVycmlkZTsKIAogICAvKiogRHJhdyBhIHNpbmdsZSBwaXhlbCAoZGV2aWNlIGRlcGVuZGFudCkgbGluZSAqLwotICBib29sIERyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTIsCisgIGJvb2wgRHJhd0Nvc21ldGljTGluZShjb25zdCBDRlhfUG9pbnRGJiBwdE1vdmVUbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0TGluZVRvLAogICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgb3ZlcnJpZGU7CiAKICAgYm9vbCBHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KSBvdmVycmlkZTsKIAogICAvKiogTG9hZCBkZXZpY2UgYnVmZmVyIGludG8gYSBESUIgKi8KLSAgYm9vbCBHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCkgb3ZlcnJpZGU7CisgIGJvb2wgR2V0RElCaXRzKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwQml0bWFwLAorICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgaW50IHRvcCkgb3ZlcnJpZGU7CiAKLSAgQ0ZYX0RJQml0bWFwKiBHZXRCYWNrRHJvcCgpIG92ZXJyaWRlOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBHZXRCYWNrRHJvcCgpIG92ZXJyaWRlOwogCi0gIGJvb2wgU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgIGJvb2wgU2V0RElCaXRzKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcEJpdG1hcCwKICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IsCiAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LAogICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAogICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSBvdmVycmlkZTsKICNpZmRlZiBfU0tJQV9TVVBQT1JUXwotICBib29sIFNldEJpdHNXaXRoTWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCU291cmNlKiBwTWFzaywKKyAgYm9vbCBTZXRCaXRzV2l0aE1hc2soY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCkBAIC0xMDIsNyArMTAyLDcgQEAKICAgdm9pZCBTZXRDbGlwTWFzayhjb25zdCBGWF9SRUNUJiBjbGlwQm94LCBjb25zdCBTa1BhdGgmIHNrQ2xpcFBhdGgpOwogI2VuZGlmCiAKLSAgYm9vbCBTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgIGJvb2wgU3RyZXRjaERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCiAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCkBAIC0xMTIsMjAgKzExMiwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgb3ZlcnJpZGU7CiAKLSAgYm9vbCBTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICBib29sIFN0YXJ0RElCaXRzKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcEJpdG1hcCwKICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAogICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgdm9pZComIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0ltYWdlUmVuZGVyZXI+KiBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIG92ZXJyaWRlOwogCi0gIGJvb2wgQ29udGludWVESUJpdHModm9pZCogaGFuZGxlLCBJRlhfUGF1c2UqIHBQYXVzZSkgb3ZlcnJpZGU7CisgIGJvb2wgQ29udGludWVESUJpdHMoQ0ZYX0ltYWdlUmVuZGVyZXIqIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICBJRlhfUGF1c2VJbmRpY2F0b3IqIHBQYXVzZSkgb3ZlcnJpZGU7CiAKLSAgdm9pZCBDYW5jZWxESUJpdHModm9pZCogaGFuZGxlKSBvdmVycmlkZSB7fQotCi0gIGJvb2wgRHJhd0JpdHNXaXRoTWFzayhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQlNvdXJjZSogcE1hc2ssCisgIGJvb2wgRHJhd0JpdHNXaXRoTWFzayhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSk7CkBAIC0xMzQsNyArMTMzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IpIG92ZXJyaWRlOwogCiAgIGJvb2wgRHJhd1NoYWRpbmcoY29uc3QgQ1BERl9TaGFkaW5nUGF0dGVybiogcFBhdHRlcm4sCkBAIC0xNTEsMTcgKzE1MCwxNyBAQAogICB2b2lkIENsZWFyKHVpbnQzMl90IGNvbG9yKTsKICAgdm9pZCBGbHVzaCgpIG92ZXJyaWRlOwogICBTa1BpY3R1cmVSZWNvcmRlciogR2V0UmVjb3JkZXIoKSBjb25zdCB7IHJldHVybiBtX3BSZWNvcmRlcjsgfQotICB2b2lkIFByZU11bHRpcGx5KCkgeyBtX3BCaXRtYXAtPlByZU11bHRpcGx5KCk7IH0KLSAgc3RhdGljIHZvaWQgUHJlTXVsdGlwbHkoQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXApOworICB2b2lkIFByZU11bHRpcGx5KCk7CisgIHN0YXRpYyB2b2lkIFByZU11bHRpcGx5KGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwRElCaXRtYXApOwogICBTa0NhbnZhcyogU2tpYUNhbnZhcygpIHsgcmV0dXJuIG1fcENhbnZhczsgfQogICB2b2lkIERlYnVnVmVyaWZ5Qml0bWFwSXNQcmVNdWx0aXBsaWVkKCkgY29uc3Q7CiAgIHZvaWQgRHVtcCgpIGNvbnN0OwogCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIFNraWFTdGF0ZTsKKyAgYm9vbCBHZXRHcm91cEtub2Nrb3V0KCkgY29uc3QgeyByZXR1cm4gbV9iR3JvdXBLbm9ja291dDsgfQogCi0gIENGWF9ESUJpdG1hcCogbV9wQml0bWFwOwotICBDRlhfRElCaXRtYXAqIG1fcE9yaURldmljZTsKKyBwcml2YXRlOgorICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBtX3BCaXRtYXA7CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IG1fcE9yaURldmljZTsKICAgU2tDYW52YXMqIG1fcENhbnZhczsKICAgU2tQaWN0dXJlUmVjb3JkZXIqIGNvbnN0IG1fcFJlY29yZGVyOwogICBzdGQ6OnVuaXF1ZV9wdHI8U2tpYVN0YXRlPiBtX3BDYWNoZTsKZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS9za2lhL2Z4X3NraWFfZGV2aWNlX3VuaXR0ZXN0LmNwcCBiL2NvcmUvZnhnZS9za2lhL2Z4X3NraWFfZGV2aWNlX3VuaXR0ZXN0LmNwcAppbmRleCBhZmQ0Nzc4Li43Y2IyOGNmIDEwMDY0NAotLS0gYS9jb3JlL2Z4Z2Uvc2tpYS9meF9za2lhX2RldmljZV91bml0dGVzdC5jcHAKKysrIGIvY29yZS9meGdlL3NraWEvZnhfc2tpYV9kZXZpY2VfdW5pdHRlc3QuY3BwCkBAIC0yLDE0ICsyLDE0IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9meGdlZGV2aWNlLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL3NraWEvZnhfc2tpYV9kZXZpY2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2RlZmF1bHRyZW5kZXJkZXZpY2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnQuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGVkYXRhLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL3NraWEvZnhfc2tpYV9kZXZpY2UuaCIKICNpbmNsdWRlICJmcGRmc2RrL2ZzZGtfZGVmaW5lLmgiCiAjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCi0jaW5jbHVkZSAidGVzdGluZy9meF9zdHJpbmdfdGVzdGhlbHBlcnMuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZS9Ta1BpY3R1cmVSZWNvcmRlci5oIgogCkBAIC00MSw3ICs0MSw3IEBACiAgIGNoYXJQb3NbMF0ubV9Gb250Q2hhcldpZHRoID0gNDsKIAogICBDRlhfRm9udCBmb250OwotICBGWF9GTE9BVCBmb250U2l6ZSA9IDE7CisgIGZsb2F0IGZvbnRTaXplID0gMTsKICAgQ0ZYX1BhdGhEYXRhIGNsaXBQYXRoLCBjbGlwUGF0aDI7CiAgIGNsaXBQYXRoLkFwcGVuZFJlY3QoMCwgMCwgMywgMSk7CiAgIGNsaXBQYXRoMi5BcHBlbmRSZWN0KDAsIDAsIDIsIDEpOwpAQCAtMTI0LDggKzEyNCw4IEBACiAgIGlmICghYml0bWFwKQogICAgIHJldHVybjsKICAgRlBERkJpdG1hcF9GaWxsUmVjdChiaXRtYXAsIDAsIDAsIHcsIGgsIDB4MDAwMDAwMDApOwotICBDRlhfRnhnZURldmljZSBnZURldmljZTsKLSAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gQ0ZYQml0bWFwRnJvbUZQREZCaXRtYXAoYml0bWFwKTsKKyAgQ0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2UgZ2VEZXZpY2U7CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBCaXRtYXAoQ0ZYQml0bWFwRnJvbUZQREZCaXRtYXAoYml0bWFwKSk7CiAgIGdlRGV2aWNlLkF0dGFjaChwQml0bWFwLCBmYWxzZSwgbnVsbHB0ciwgZmFsc2UpOwogICBDRlhfU2tpYURldmljZURyaXZlciogZHJpdmVyID0KICAgICAgIHN0YXRpY19jYXN0PENGWF9Ta2lhRGV2aWNlRHJpdmVyKj4oZ2VEZXZpY2UuR2V0RGV2aWNlRHJpdmVyKCkpOwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL3dpbjMyL2NmeF9wc3JlbmRlcmVyLmNwcCBiL2NvcmUvZnhnZS93aW4zMi9jZnhfcHNyZW5kZXJlci5jcHAKaW5kZXggNzRmYWUwOC4uMTUxM2MwNyAxMDA2NDQKLS0tIGEvY29yZS9meGdlL3dpbjMyL2NmeF9wc3JlbmRlcmVyLmNwcAorKysgYi9jb3JlL2Z4Z2Uvd2luMzIvY2Z4X3BzcmVuZGVyZXIuY3BwCkBAIC03LDIyICs3LDgzIEBACiAjaW5jbHVkZSAiY29yZS9meGdlL3dpbjMyL2NmeF9wc3JlbmRlcmVyLmgiCiAKICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3N0cmVhbT4KIAorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9jcGRmX21vZHVsZW1nci5oIgorI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfYmFzaWNtb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2ZheG1vZHVsZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfZmxhdGVtb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2pwZWdtb2R1bGUuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvZnhfY29kZWMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9tYXliZV9vd25lZC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvbWF5YmVfb3duZWQuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZhY2VjYWNoZS5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZm9udGNhY2hlLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9nZW1vZHVsZS5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcGF0aGRhdGEuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9nZS9meF90ZXh0X2ludC5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2RpYmV4dHJhY3Rvci5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS93aW4zMi9jcHNvdXRwdXQuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKK25hbWVzcGFjZSB7CisKK3ZvaWQgRmF4Q29tcHJlc3NEYXRhKHVpbnQ4X3QqIHNyY19idWYsCisgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+KiBkZXN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkZXN0X3NpemUpIHsKKyAgaWYgKHdpZHRoICogaGVpZ2h0ID4gMTI4KSB7CisgICAgQ0NvZGVjX0ZheE1vZHVsZTo6RmF4RW5jb2RlKHNyY19idWYsIHdpZHRoLCBoZWlnaHQsICh3aWR0aCArIDcpIC8gOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9idWYsIGRlc3Rfc2l6ZSk7CisgICAgRlhfRnJlZShzcmNfYnVmKTsKKyAgfSBlbHNlIHsKKyAgICBkZXN0X2J1Zi0+cmVzZXQoc3JjX2J1Zik7CisgICAgKmRlc3Rfc2l6ZSA9ICh3aWR0aCArIDcpIC8gOCAqIGhlaWdodDsKKyAgfQorfQorCit2b2lkIFBTQ29tcHJlc3NEYXRhKGludCBQU0xldmVsLAorICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIG91dHB1dF9idWYsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBvdXRwdXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqIGZpbHRlcikgeworICAqb3V0cHV0X2J1ZiA9IHNyY19idWY7CisgICpvdXRwdXRfc2l6ZSA9IHNyY19zaXplOworICAqZmlsdGVyID0gIiI7CisgIGlmIChzcmNfc2l6ZSA8IDEwMjQpCisgICAgcmV0dXJuOworCisgIENDb2RlY19Nb2R1bGVNZ3IqIHBFbmNvZGVycyA9IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+R2V0Q29kZWNNb2R1bGUoKTsKKyAgdWludDhfdCogZGVzdF9idWYgPSBudWxscHRyOworICB1aW50MzJfdCBkZXN0X3NpemUgPSBzcmNfc2l6ZTsKKyAgaWYgKFBTTGV2ZWwgPj0gMykgeworICAgIGlmIChwRW5jb2RlcnMtPkdldEZsYXRlTW9kdWxlKCktPkVuY29kZShzcmNfYnVmLCBzcmNfc2l6ZSwgJmRlc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzdF9zaXplKSkgeworICAgICAgKmZpbHRlciA9ICIvRmxhdGVEZWNvZGUgZmlsdGVyICI7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChwRW5jb2RlcnMtPkdldEJhc2ljTW9kdWxlKCktPlJ1bkxlbmd0aEVuY29kZShzcmNfYnVmLCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc3RfYnVmLCAmZGVzdF9zaXplKSkgeworICAgICAgKmZpbHRlciA9ICIvUnVuTGVuZ3RoRGVjb2RlIGZpbHRlciAiOworICAgIH0KKyAgfQorICBpZiAoZGVzdF9zaXplIDwgc3JjX3NpemUpIHsKKyAgICAqb3V0cHV0X2J1ZiA9IGRlc3RfYnVmOworICAgICpvdXRwdXRfc2l6ZSA9IGRlc3Rfc2l6ZTsKKyAgfSBlbHNlIHsKKyAgICAqZmlsdGVyID0gbnVsbHB0cjsKKyAgICBGWF9GcmVlKGRlc3RfYnVmKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKKwogc3RydWN0IFBTR2x5cGggewotICBDRlhfRm9udCogbV9wRm9udDsKKyAgVW5vd25lZFB0cjxDRlhfRm9udD4gbV9wRm9udDsKICAgdWludDMyX3QgbV9HbHlwaEluZGV4OwogICBib29sIG1fYkdseXBoQWRqdXN0OwotICBGWF9GTE9BVCBtX0FkanVzdE1hdHJpeFs0XTsKKyAgZmxvYXQgbV9BZGp1c3RNYXRyaXhbNF07CiB9OwogCiBjbGFzcyBDUFNGb250IHsKQEAgLTMxLDMzICs5MiwzMiBAQAogICBpbnQgbV9uR2x5cGhzOwogfTsKIAotQ0ZYX1BTUmVuZGVyZXI6OkNGWF9QU1JlbmRlcmVyKCkgewotICBtX3BPdXRwdXQgPSBudWxscHRyOwotICBtX2JDb2xvclNldCA9IG1fYkdyYXBoU3RhdGVTZXQgPSBmYWxzZTsKLSAgbV9iSW5pdGVkID0gZmFsc2U7Ci19CitDRlhfUFNSZW5kZXJlcjo6Q0ZYX1BTUmVuZGVyZXIoKQorICAgIDogbV9wU3RyZWFtKG51bGxwdHIpLAorICAgICAgbV9iR3JhcGhTdGF0ZVNldChmYWxzZSksCisgICAgICBtX2JDb2xvclNldChmYWxzZSksCisgICAgICBtX2JJbml0ZWQoZmFsc2UpIHt9CiAKIENGWF9QU1JlbmRlcmVyOjp+Q0ZYX1BTUmVuZGVyZXIoKSB7fQogCi0jZGVmaW5lIE9VVFBVVF9QUyhzdHIpIG1fcE91dHB1dC0+T3V0cHV0UFMoc3RyLCBzaXplb2Yoc3RyKSAtIDEpCi0KLXZvaWQgQ0ZYX1BTUmVuZGVyZXI6OkluaXQoQ1BTT3V0cHV0KiBwT3V0cHV0LAordm9pZCBDRlhfUFNSZW5kZXJlcjo6SW5pdChjb25zdCBSZXRhaW5QdHI8SUZYX1dyaXRlU3RyZWFtPiYgcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBzbGV2ZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ215a091dHB1dCkgewogICBtX1BTTGV2ZWwgPSBwc2xldmVsOwotICBtX3BPdXRwdXQgPSBwT3V0cHV0OwotICBtX0NsaXBCb3gubGVmdCA9IG1fQ2xpcEJveC50b3AgPSAwOworICBtX3BTdHJlYW0gPSBwU3RyZWFtOworICBtX0NsaXBCb3gubGVmdCA9IDA7CisgIG1fQ2xpcEJveC50b3AgPSAwOwogICBtX0NsaXBCb3gucmlnaHQgPSB3aWR0aDsKICAgbV9DbGlwQm94LmJvdHRvbSA9IGhlaWdodDsKICAgbV9iQ215a091dHB1dCA9IGJDbXlrT3V0cHV0OwogfQogCiBib29sIENGWF9QU1JlbmRlcmVyOjpTdGFydFJlbmRlcmluZygpIHsKLSAgaWYgKG1fYkluaXRlZCkgeworICBpZiAobV9iSW5pdGVkKQogICAgIHJldHVybiB0cnVlOwotICB9CisKICAgc3RhdGljIGNvbnN0IGNoYXIgaW5pdF9zdHJbXSA9CiAgICAgICAiXG5zYXZlXG4vaW0vaW5pdG1hdHJpeCBsb2FkIGRlZlxuIgogICAgICAgIi9uL25ld3BhdGggbG9hZCBkZWYvbS9tb3ZldG8gbG9hZCBkZWYvbC9saW5ldG8gbG9hZCBkZWYvYy9jdXJ2ZXRvIGxvYWQgIgpAQCAtNzIsMzAgKzEzMiwzMCBAQAogICAgICAgImxvYWQgZGVmXG4iCiAgICAgICAiL2NtL2NvbmNhdCBsb2FkIGRlZi9DbS9jdXJyZW50bWF0cml4IGxvYWQgZGVmL214L21hdHJpeCBsb2FkICIKICAgICAgICJkZWYvc20vc2V0bWF0cml4IGxvYWQgZGVmXG4iOwotICBPVVRQVVRfUFMoaW5pdF9zdHIpOworICBtX3BTdHJlYW0tPldyaXRlU3RyaW5nKGluaXRfc3RyKTsKICAgbV9iSW5pdGVkID0gdHJ1ZTsKICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgQ0ZYX1BTUmVuZGVyZXI6OkVuZFJlbmRlcmluZygpIHsKLSAgaWYgKG1fYkluaXRlZCkgewotICAgIE9VVFBVVF9QUygiXG5yZXN0b3JlXG4iKTsKLSAgICBtX2JJbml0ZWQgPSBmYWxzZTsKLSAgfQorICBpZiAoIW1fYkluaXRlZCkKKyAgICByZXR1cm47CisKKyAgbV9wU3RyZWFtLT5Xcml0ZVN0cmluZygiXG5yZXN0b3JlXG4iKTsKKyAgbV9iSW5pdGVkID0gZmFsc2U7CiB9CiAKIHZvaWQgQ0ZYX1BTUmVuZGVyZXI6OlNhdmVTdGF0ZSgpIHsKICAgU3RhcnRSZW5kZXJpbmcoKTsKLSAgT1VUUFVUX1BTKCJxXG4iKTsKKyAgbV9wU3RyZWFtLT5Xcml0ZVN0cmluZygicVxuIik7CiAgIG1fQ2xpcEJveFN0YWNrLnB1c2hfYmFjayhtX0NsaXBCb3gpOwogfQogCiB2b2lkIENGWF9QU1JlbmRlcmVyOjpSZXN0b3JlU3RhdGUoYm9vbCBiS2VlcFNhdmVkKSB7CiAgIFN0YXJ0UmVuZGVyaW5nKCk7CisgIG1fcFN0cmVhbS0+V3JpdGVTdHJpbmcoIlFcbiIpOwogICBpZiAoYktlZXBTYXZlZCkKLSAgICBPVVRQVVRfUFMoIlFcbnFcbiIpOwotICBlbHNlCi0gICAgT1VUUFVUX1BTKCJRXG4iKTsKKyAgICBtX3BTdHJlYW0tPldyaXRlU3RyaW5nKCJxXG4iKTsKIAogICBtX2JDb2xvclNldCA9IGZhbHNlOwogICBtX2JHcmFwaFN0YXRlU2V0ID0gZmFsc2U7CkBAIC0xMDksOSArMTY5LDggQEAKIAogdm9pZCBDRlhfUFNSZW5kZXJlcjo6T3V0cHV0UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UpIHsKLSAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGJ1ZjsKICAgc2l6ZV90IHNpemUgPSBwUGF0aERhdGEtPkdldFBvaW50cygpLnNpemUoKTsKLSAgYnVmLkVzdGltYXRlU2l6ZShzaXplICogMTApOwogCiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgRlhQVF9UWVBFIHR5cGUgPSBwUGF0aERhdGEtPkdldFR5cGUoaSk7CkBAIC0xNDcsNyArMjA2LDcgQEAKICAgICAgIH0KICAgICB9CiAgIH0KLSAgbV9wT3V0cHV0LT5PdXRwdXRQUygoY29uc3QgRlhfQ0hBUiopYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0U2l6ZSgpKTsKKyAgbV9wU3RyZWFtLT5Xcml0ZUJsb2NrKGJ1Zi5zdHIoKS5jX3N0cigpLCBidWYudGVsbHAoKSk7CiB9CiAKIHZvaWQgQ0ZYX1BTUmVuZGVyZXI6OlNldENsaXBfUGF0aEZpbGwoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCkBAIC0xNTcsMTcgKzIxNiwxNyBAQAogICBPdXRwdXRQYXRoKHBQYXRoRGF0YSwgcE9iamVjdDJEZXZpY2UpOwogICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBwUGF0aERhdGEtPkdldEJvdW5kaW5nQm94KCk7CiAgIGlmIChwT2JqZWN0MkRldmljZSkKLSAgICBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtUmVjdChyZWN0KTsKKyAgICByZWN0ID0gcE9iamVjdDJEZXZpY2UtPlRyYW5zZm9ybVJlY3QocmVjdCk7CiAKICAgbV9DbGlwQm94LmxlZnQgPSBzdGF0aWNfY2FzdDxpbnQ+KHJlY3QubGVmdCk7CiAgIG1fQ2xpcEJveC5yaWdodCA9IHN0YXRpY19jYXN0PGludD4ocmVjdC5sZWZ0ICsgcmVjdC5yaWdodCk7CiAgIG1fQ2xpcEJveC50b3AgPSBzdGF0aWNfY2FzdDxpbnQ+KHJlY3QudG9wICsgcmVjdC5ib3R0b20pOwogICBtX0NsaXBCb3guYm90dG9tID0gc3RhdGljX2Nhc3Q8aW50PihyZWN0LmJvdHRvbSk7Ci0gIGlmICgoZmlsbF9tb2RlICYgMykgPT0gRlhGSUxMX1dJTkRJTkcpIHsKLSAgICBPVVRQVVRfUFMoIlcgblxuIik7Ci0gIH0gZWxzZSB7Ci0gICAgT1VUUFVUX1BTKCJXKiBuXG4iKTsKLSAgfQorCisgIG1fcFN0cmVhbS0+V3JpdGVTdHJpbmcoIlciKTsKKyAgaWYgKChmaWxsX21vZGUgJiAzKSAhPSBGWEZJTExfV0lORElORykKKyAgICBtX3BTdHJlYW0tPldyaXRlU3RyaW5nKCIqIik7CisgIG1fcFN0cmVhbS0+V3JpdGVTdHJpbmcoIiBuXG4iKTsKIH0KIAogdm9pZCBDRlhfUFNSZW5kZXJlcjo6U2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLApAQCAtMTc2LDIyICsyMzUsMjIgQEAKICAgU3RhcnRSZW5kZXJpbmcoKTsKICAgU2V0R3JhcGhTdGF0ZShwR3JhcGhTdGF0ZSk7CiAgIGlmIChwT2JqZWN0MkRldmljZSkgewotICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIGJ1ZjsKICAgICBidWYgPDwgIm14IENtIFsiIDw8IHBPYmplY3QyRGV2aWNlLT5hIDw8ICIgIiA8PCBwT2JqZWN0MkRldmljZS0+YiA8PCAiICIKICAgICAgICAgPDwgcE9iamVjdDJEZXZpY2UtPmMgPDwgIiAiIDw8IHBPYmplY3QyRGV2aWNlLT5kIDw8ICIgIgogICAgICAgICA8PCBwT2JqZWN0MkRldmljZS0+ZSA8PCAiICIgPDwgcE9iamVjdDJEZXZpY2UtPmYgPDwgIl1jbSAiOwotICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKGNvbnN0IEZYX0NIQVIqKWJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7CisgICAgbV9wU3RyZWFtLT5Xcml0ZUJsb2NrKGJ1Zi5zdHIoKS5jX3N0cigpLCBidWYudGVsbHAoKSk7CiAgIH0KKwogICBPdXRwdXRQYXRoKHBQYXRoRGF0YSwgbnVsbHB0cik7CiAgIENGWF9GbG9hdFJlY3QgcmVjdCA9IHBQYXRoRGF0YS0+R2V0Qm91bmRpbmdCb3gocEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBHcmFwaFN0YXRlLT5tX01pdGVyTGltaXQpOwotICBwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtUmVjdChyZWN0KTsKLSAgbV9DbGlwQm94LkludGVyc2VjdChyZWN0LkdldE91dGVyUmVjdCgpKTsKLSAgaWYgKHBPYmplY3QyRGV2aWNlKSB7Ci0gICAgT1VUUFVUX1BTKCJzdHJva2VwYXRoIFcgbiBzbVxuIik7Ci0gIH0gZWxzZSB7Ci0gICAgT1VUUFVUX1BTKCJzdHJva2VwYXRoIFcgblxuIik7Ci0gIH0KKyAgbV9DbGlwQm94LkludGVyc2VjdChwT2JqZWN0MkRldmljZS0+VHJhbnNmb3JtUmVjdChyZWN0KS5HZXRPdXRlclJlY3QoKSk7CisKKyAgbV9wU3RyZWFtLT5Xcml0ZVN0cmluZygic3Ryb2tlcGF0aCBXIG4iKTsKKyAgaWYgKHBPYmplY3QyRGV2aWNlKQorICAgIG1fcFN0cmVhbS0+V3JpdGVTdHJpbmcoIiBzbSIpOworICBtX3BTdHJlYW0tPldyaXRlU3RyaW5nKCJcbiIpOwogfQogCiBib29sIENGWF9QU1JlbmRlcmVyOjpEcmF3UGF0aChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKQEAgLTIwMyw2OCArMjYyLDY1IEBACiAgIFN0YXJ0UmVuZGVyaW5nKCk7CiAgIGludCBmaWxsX2FscGhhID0gRlhBUkdCX0EoZmlsbF9jb2xvcik7CiAgIGludCBzdHJva2VfYWxwaGEgPSBGWEFSR0JfQShzdHJva2VfY29sb3IpOwotICBpZiAoZmlsbF9hbHBoYSAmJiBmaWxsX2FscGhhIDwgMjU1KSB7CisgIGlmIChmaWxsX2FscGhhICYmIGZpbGxfYWxwaGEgPCAyNTUpCiAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChzdHJva2VfYWxwaGEgJiYgc3Ryb2tlX2FscGhhIDwgMjU1KSB7CisgIGlmIChzdHJva2VfYWxwaGEgJiYgc3Ryb2tlX2FscGhhIDwgMjU1KQogICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoZmlsbF9hbHBoYSA9PSAwICYmIHN0cm9rZV9hbHBoYSA9PSAwKSB7CisgIGlmIChmaWxsX2FscGhhID09IDAgJiYgc3Ryb2tlX2FscGhhID09IDApCiAgICAgcmV0dXJuIGZhbHNlOwotICB9CisKICAgaWYgKHN0cm9rZV9hbHBoYSkgewogICAgIFNldEdyYXBoU3RhdGUocEdyYXBoU3RhdGUpOwogICAgIGlmIChwT2JqZWN0MkRldmljZSkgewotICAgICAgQ0ZYX0J5dGVUZXh0QnVmIGJ1ZjsKKyAgICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBidWY7CiAgICAgICBidWYgPDwgIm14IENtIFsiIDw8IHBPYmplY3QyRGV2aWNlLT5hIDw8ICIgIiA8PCBwT2JqZWN0MkRldmljZS0+YiA8PCAiICIKICAgICAgICAgICA8PCBwT2JqZWN0MkRldmljZS0+YyA8PCAiICIgPDwgcE9iamVjdDJEZXZpY2UtPmQgPDwgIiAiCiAgICAgICAgICAgPDwgcE9iamVjdDJEZXZpY2UtPmUgPDwgIiAiIDw8IHBPYmplY3QyRGV2aWNlLT5mIDw8ICJdY20gIjsKLSAgICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKGNvbnN0IEZYX0NIQVIqKWJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7CisgICAgICBtX3BTdHJlYW0tPldyaXRlQmxvY2soYnVmLnN0cigpLmNfc3RyKCksIGJ1Zi50ZWxscCgpKTsKICAgICB9CiAgIH0KKwogICBPdXRwdXRQYXRoKHBQYXRoRGF0YSwgc3Ryb2tlX2FscGhhID8gbnVsbHB0ciA6IHBPYmplY3QyRGV2aWNlKTsKICAgaWYgKGZpbGxfbW9kZSAmJiBmaWxsX2FscGhhKSB7CiAgICAgU2V0Q29sb3IoZmlsbF9jb2xvcik7CiAgICAgaWYgKChmaWxsX21vZGUgJiAzKSA9PSBGWEZJTExfV0lORElORykgewotICAgICAgaWYgKHN0cm9rZV9hbHBoYSkgewotICAgICAgICBPVVRQVVRfUFMoInEgZiBRICIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgT1VUUFVUX1BTKCJmIik7Ci0gICAgICB9CisgICAgICBpZiAoc3Ryb2tlX2FscGhhKQorICAgICAgICBtX3BTdHJlYW0tPldyaXRlU3RyaW5nKCJxIGYgUSAiKTsKKyAgICAgIGVsc2UKKyAgICAgICAgbV9wU3RyZWFtLT5Xcml0ZVN0cmluZygiZiIpOwogICAgIH0gZWxzZSBpZiAoKGZpbGxfbW9kZSAmIDMpID09IEZYRklMTF9BTFRFUk5BVEUpIHsKLSAgICAgIGlmIChzdHJva2VfYWxwaGEpIHsKLSAgICAgICAgT1VUUFVUX1BTKCJxIEYgUSAiKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIE9VVFBVVF9QUygiRiIpOwotICAgICAgfQorICAgICAgaWYgKHN0cm9rZV9hbHBoYSkKKyAgICAgICAgbV9wU3RyZWFtLT5Xcml0ZVN0cmluZygicSBGIFEgIik7CisgICAgICBlbHNlCisgICAgICAgIG1fcFN0cmVhbS0+V3JpdGVTdHJpbmcoIkYiKTsKICAgICB9CiAgIH0KKwogICBpZiAoc3Ryb2tlX2FscGhhKSB7CiAgICAgU2V0Q29sb3Ioc3Ryb2tlX2NvbG9yKTsKLSAgICBpZiAocE9iamVjdDJEZXZpY2UpIHsKLSAgICAgIE9VVFBVVF9QUygicyBzbSIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBPVVRQVVRfUFMoInMiKTsKLSAgICB9CisgICAgbV9wU3RyZWFtLT5Xcml0ZVN0cmluZygicyIpOworICAgIGlmIChwT2JqZWN0MkRldmljZSkKKyAgICAgIG1fcFN0cmVhbS0+V3JpdGVTdHJpbmcoIiBzbSIpOwogICB9Ci0gIE9VVFBVVF9QUygiXG4iKTsKKworICBtX3BTdHJlYW0tPldyaXRlU3RyaW5nKCJcbiIpOwogICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBDRlhfUFNSZW5kZXJlcjo6U2V0R3JhcGhTdGF0ZShjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlKSB7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBidWY7CiAgIGlmICghbV9iR3JhcGhTdGF0ZVNldCB8fAogICAgICAgbV9DdXJHcmFwaFN0YXRlLm1fTGluZUNhcCAhPSBwR3JhcGhTdGF0ZS0+bV9MaW5lQ2FwKSB7CiAgICAgYnVmIDw8IHBHcmFwaFN0YXRlLT5tX0xpbmVDYXAgPDwgIiBKXG4iOwogICB9CiAgIGlmICghbV9iR3JhcGhTdGF0ZVNldCB8fAogICAgICAgbV9DdXJHcmFwaFN0YXRlLm1fRGFzaENvdW50ICE9IHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCB8fAotICAgICAgRlhTWVNfbWVtY21wKG1fQ3VyR3JhcGhTdGF0ZS5tX0Rhc2hBcnJheSwgcEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5LAotICAgICAgICAgICAgICAgICAgIHNpemVvZihGWF9GTE9BVCkgKiBtX0N1ckdyYXBoU3RhdGUubV9EYXNoQ291bnQpKSB7CisgICAgICBtZW1jbXAobV9DdXJHcmFwaFN0YXRlLm1fRGFzaEFycmF5LCBwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXksCisgICAgICAgICAgICAgc2l6ZW9mKGZsb2F0KSAqIG1fQ3VyR3JhcGhTdGF0ZS5tX0Rhc2hDb3VudCkpIHsKICAgICBidWYgPDwgIlsiOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50OyArK2kpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudDsgKytpKQogICAgICAgYnVmIDw8IHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheVtpXSA8PCAiICI7Ci0gICAgfQorCiAgICAgYnVmIDw8ICJdIiA8PCBwR3JhcGhTdGF0ZS0+bV9EYXNoUGhhc2UgPDwgIiBkXG4iOwogICB9CiAgIGlmICghbV9iR3JhcGhTdGF0ZVNldCB8fApAQCAtMjgxLDc1ICszMzcsMjIgQEAKICAgfQogICBtX0N1ckdyYXBoU3RhdGUuQ29weSgqcEdyYXBoU3RhdGUpOwogICBtX2JHcmFwaFN0YXRlU2V0ID0gdHJ1ZTsKLSAgaWYgKGJ1Zi5HZXRTaXplKCkpIHsKLSAgICBtX3BPdXRwdXQtPk91dHB1dFBTKChjb25zdCBGWF9DSEFSKilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOwotICB9CisgIGlmIChidWYudGVsbHAoKSkKKyAgICBtX3BTdHJlYW0tPldyaXRlQmxvY2soYnVmLnN0cigpLmNfc3RyKCksIGJ1Zi50ZWxscCgpKTsKIH0KIAotc3RhdGljIHZvaWQgRmF4Q29tcHJlc3NEYXRhKHVpbnQ4X3QqIHNyY19idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+KiBkZXN0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZGVzdF9zaXplKSB7Ci0gIGlmICh3aWR0aCAqIGhlaWdodCA+IDEyOCkgewotICAgIENDb2RlY19GYXhNb2R1bGU6OkZheEVuY29kZShzcmNfYnVmLCB3aWR0aCwgaGVpZ2h0LCAod2lkdGggKyA3KSAvIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfYnVmLCBkZXN0X3NpemUpOwotICAgIEZYX0ZyZWUoc3JjX2J1Zik7Ci0gIH0gZWxzZSB7Ci0gICAgZGVzdF9idWYtPnJlc2V0KHNyY19idWYpOwotICAgICpkZXN0X3NpemUgPSAod2lkdGggKyA3KSAvIDggKiBoZWlnaHQ7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgUFNDb21wcmVzc0RhdGEoaW50IFBTTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBzcmNfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3JjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90Kiogb3V0cHV0X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBvdXRwdXRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqKiBmaWx0ZXIpIHsKLSAgKm91dHB1dF9idWYgPSBzcmNfYnVmOwotICAqb3V0cHV0X3NpemUgPSBzcmNfc2l6ZTsKLSAgKmZpbHRlciA9ICIiOwotICBpZiAoc3JjX3NpemUgPCAxMDI0KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENDb2RlY19Nb2R1bGVNZ3IqIHBFbmNvZGVycyA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCk7Ci0gIHVpbnQ4X3QqIGRlc3RfYnVmID0gbnVsbHB0cjsKLSAgdWludDMyX3QgZGVzdF9zaXplID0gc3JjX3NpemU7Ci0gIGlmIChQU0xldmVsID49IDMpIHsKLSAgICBpZiAocEVuY29kZXJzICYmCi0gICAgICAgIHBFbmNvZGVycy0+R2V0RmxhdGVNb2R1bGUoKS0+RW5jb2RlKHNyY19idWYsIHNyY19zaXplLCAmZGVzdF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXN0X3NpemUpKSB7Ci0gICAgICAqZmlsdGVyID0gIi9GbGF0ZURlY29kZSBmaWx0ZXIgIjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKHBFbmNvZGVycyAmJgotICAgICAgICBwRW5jb2RlcnMtPkdldEJhc2ljTW9kdWxlKCktPlJ1bkxlbmd0aEVuY29kZShzcmNfYnVmLCBzcmNfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc3RfYnVmLCAmZGVzdF9zaXplKSkgewotICAgICAgKmZpbHRlciA9ICIvUnVuTGVuZ3RoRGVjb2RlIGZpbHRlciAiOwotICAgIH0KLSAgfQotICBpZiAoZGVzdF9zaXplIDwgc3JjX3NpemUpIHsKLSAgICAqb3V0cHV0X2J1ZiA9IGRlc3RfYnVmOwotICAgICpvdXRwdXRfc2l6ZSA9IGRlc3Rfc2l6ZTsKLSAgfSBlbHNlIHsKLSAgICAqZmlsdGVyID0gbnVsbHB0cjsKLSAgICBGWF9GcmVlKGRlc3RfYnVmKTsKLSAgfQotfQotCi1ib29sIENGWF9QU1JlbmRlcmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwKK2Jvb2wgQ0ZYX1BTUmVuZGVyZXI6OlNldERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCkgewogICBTdGFydFJlbmRlcmluZygpOwotICBDRlhfTWF0cml4IG1hdHJpeCgoRlhfRkxPQVQpKHBTb3VyY2UtPkdldFdpZHRoKCkpLCAwLjBmLCAwLjBmLAotICAgICAgICAgICAgICAgICAgICAtKEZYX0ZMT0FUKShwU291cmNlLT5HZXRIZWlnaHQoKSksIChGWF9GTE9BVCkobGVmdCksCi0gICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCkodG9wICsgcFNvdXJjZS0+R2V0SGVpZ2h0KCkpKTsKKyAgQ0ZYX01hdHJpeCBtYXRyaXgoKGZsb2F0KShwU291cmNlLT5HZXRXaWR0aCgpKSwgMC4wZiwgMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgLShmbG9hdCkocFNvdXJjZS0+R2V0SGVpZ2h0KCkpLCAoZmxvYXQpKGxlZnQpLAorICAgICAgICAgICAgICAgICAgICAoZmxvYXQpKHRvcCArIHBTb3VyY2UtPkdldEhlaWdodCgpKSk7CiAgIHJldHVybiBEcmF3RElCaXRzKHBTb3VyY2UsIGNvbG9yLCAmbWF0cml4LCAwKTsKIH0KIAotYm9vbCBDRlhfUFNSZW5kZXJlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorYm9vbCBDRlhfUFNSZW5kZXJlcjo6U3RyZXRjaERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCkBAIC0zNTcsMTMgKzM2MCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CiAgIFN0YXJ0UmVuZGVyaW5nKCk7Ci0gIENGWF9NYXRyaXggbWF0cml4KChGWF9GTE9BVCkoZGVzdF93aWR0aCksIDAuMGYsIDAuMGYsCi0gICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCkoLWRlc3RfaGVpZ2h0KSwgKEZYX0ZMT0FUKShkZXN0X2xlZnQpLAotICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKGRlc3RfdG9wICsgZGVzdF9oZWlnaHQpKTsKKyAgQ0ZYX01hdHJpeCBtYXRyaXgoKGZsb2F0KShkZXN0X3dpZHRoKSwgMC4wZiwgMC4wZiwgKGZsb2F0KSgtZGVzdF9oZWlnaHQpLAorICAgICAgICAgICAgICAgICAgICAoZmxvYXQpKGRlc3RfbGVmdCksIChmbG9hdCkoZGVzdF90b3AgKyBkZXN0X2hlaWdodCkpOwogICByZXR1cm4gRHJhd0RJQml0cyhwU291cmNlLCBjb2xvciwgJm1hdHJpeCwgZmxhZ3MpOwogfQogCi1ib29sIENGWF9QU1JlbmRlcmVyOjpEcmF3RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCitib29sIENGWF9QU1JlbmRlcmVyOjpEcmF3RElCaXRzKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CkBAIC0zNzIsMjggKzM3NCwzMiBAQAogICAgICAgKHBNYXRyaXgtPmMgPT0gMCAmJiBwTWF0cml4LT5kID09IDApKSB7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KLSAgaWYgKHBTb3VyY2UtPkhhc0FscGhhKCkpIHsKKyAgaWYgKHBTb3VyY2UtPkhhc0FscGhhKCkpCiAgICAgcmV0dXJuIGZhbHNlOwotICB9CisKICAgaW50IGFscGhhID0gRlhBUkdCX0EoY29sb3IpOwogICBpZiAocFNvdXJjZS0+SXNBbHBoYU1hc2soKSAmJiAoYWxwaGEgPCAyNTUgfHwgcFNvdXJjZS0+R2V0QlBQKCkgIT0gMSkpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIE9VVFBVVF9QUygicVxuIik7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgIG1fcFN0cmVhbS0+V3JpdGVTdHJpbmcoInFcbiIpOworCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBidWY7CiAgIGJ1ZiA8PCAiWyIgPDwgcE1hdHJpeC0+YSA8PCAiICIgPDwgcE1hdHJpeC0+YiA8PCAiICIgPDwgcE1hdHJpeC0+YyA8PCAiICIKICAgICAgIDw8IHBNYXRyaXgtPmQgPDwgIiAiIDw8IHBNYXRyaXgtPmUgPDwgIiAiIDw8IHBNYXRyaXgtPmYgPDwgIl1jbSAiOworCiAgIGludCB3aWR0aCA9IHBTb3VyY2UtPkdldFdpZHRoKCk7CiAgIGludCBoZWlnaHQgPSBwU291cmNlLT5HZXRIZWlnaHQoKTsKICAgYnVmIDw8IHdpZHRoIDw8ICIgIiA8PCBoZWlnaHQ7CisKICAgaWYgKHBTb3VyY2UtPkdldEJQUCgpID09IDEgJiYgIXBTb3VyY2UtPkdldFBhbGV0dGUoKSkgewogICAgIGludCBwaXRjaCA9ICh3aWR0aCArIDcpIC8gODsKICAgICB1aW50MzJfdCBzcmNfc2l6ZSA9IGhlaWdodCAqIHBpdGNoOwogICAgIHVpbnQ4X3QqIHNyY19idWYgPSBGWF9BbGxvYyh1aW50OF90LCBzcmNfc2l6ZSk7CiAgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgewogICAgICAgY29uc3QgdWludDhfdCogc3JjX3NjYW4gPSBwU291cmNlLT5HZXRTY2FubGluZShyb3cpOwotICAgICAgRlhTWVNfbWVtY3B5KHNyY19idWYgKyByb3cgKiBwaXRjaCwgc3JjX3NjYW4sIHBpdGNoKTsKKyAgICAgIG1lbWNweShzcmNfYnVmICsgcm93ICogcGl0Y2gsIHNyY19zY2FuLCBwaXRjaCk7CiAgICAgfQorCiAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IG91dHB1dF9idWY7CiAgICAgdWludDMyX3Qgb3V0cHV0X3NpemU7CiAgICAgRmF4Q29tcHJlc3NEYXRhKHNyY19idWYsIHdpZHRoLCBoZWlnaHQsICZvdXRwdXRfYnVmLCAmb3V0cHV0X3NpemUpOwpAQCAtNDA2LDU1ICs0MTIsNTYgQEAKICAgICB9CiAgICAgYnVmIDw8IHdpZHRoIDw8ICIgMCAwIC0iIDw8IGhlaWdodCA8PCAiIDAgIiA8PCBoZWlnaHQKICAgICAgICAgPDwgIl1jdXJyZW50ZmlsZS9BU0NJSTg1RGVjb2RlIGZpbHRlciAiOworCiAgICAgaWYgKG91dHB1dF9idWYuZ2V0KCkgIT0gc3JjX2J1ZikgewogICAgICAgYnVmIDw8ICI8PC9LIC0xL0VuZE9mQmxvY2sgZmFsc2UvQ29sdW1ucyAiIDw8IHdpZHRoIDw8ICIvUm93cyAiIDw8IGhlaWdodAogICAgICAgICAgIDw8ICI+Pi9DQ0lUVEZheERlY29kZSBmaWx0ZXIgIjsKICAgICB9Ci0gICAgaWYgKHBTb3VyY2UtPklzQWxwaGFNYXNrKCkpIHsKKyAgICBpZiAocFNvdXJjZS0+SXNBbHBoYU1hc2soKSkKICAgICAgIGJ1ZiA8PCAiaU1cbiI7Ci0gICAgfSBlbHNlIHsKKyAgICBlbHNlCiAgICAgICBidWYgPDwgImZhbHNlIDEgY29sb3JpbWFnZVxuIjsKLSAgICB9Ci0gICAgbV9wT3V0cHV0LT5PdXRwdXRQUygoY29uc3QgRlhfQ0hBUiopYnVmLkdldEJ1ZmZlcigpLCBidWYuR2V0U2l6ZSgpKTsKKworICAgIG1fcFN0cmVhbS0+V3JpdGVCbG9jayhidWYuc3RyKCkuY19zdHIoKSwgYnVmLnRlbGxwKCkpOwogICAgIFdyaXRlUFNCaW5hcnkob3V0cHV0X2J1Zi5nZXQoKSwgb3V0cHV0X3NpemUpOwogICAgIG91dHB1dF9idWYucmVsZWFzZSgpOwogICB9IGVsc2UgewogICAgIENGWF9ESUJFeHRyYWN0b3Igc291cmNlX2V4dHJhY3RvcihwU291cmNlKTsKLSAgICBDRlhfTWF5YmVPd25lZDxDRlhfRElCU291cmNlPiBwQ29udmVydGVkKHNvdXJjZV9leHRyYWN0b3IuR2V0Qml0bWFwKCkpOwotICAgIGlmICghcENvbnZlcnRlZC5HZXQoKSkKKyAgICBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4gcENvbnZlcnRlZCA9IHNvdXJjZV9leHRyYWN0b3IuR2V0Qml0bWFwKCk7CisgICAgaWYgKCFwQ29udmVydGVkKQogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIHN3aXRjaCAocFNvdXJjZS0+R2V0Rm9ybWF0KCkpIHsKICAgICAgIGNhc2UgRlhESUJfMWJwcFJnYjoKICAgICAgIGNhc2UgRlhESUJfUmdiMzI6Ci0gICAgICAgIHBDb252ZXJ0ZWQgPSBwQ29udmVydGVkLT5DbG9uZUNvbnZlcnQoRlhESUJfUmdiKS5yZWxlYXNlKCk7CisgICAgICAgIHBDb252ZXJ0ZWQgPSBwQ29udmVydGVkLT5DbG9uZUNvbnZlcnQoRlhESUJfUmdiKTsKICAgICAgICAgYnJlYWs7CiAgICAgICBjYXNlIEZYRElCXzhicHBSZ2I6CiAgICAgICAgIGlmIChwU291cmNlLT5HZXRQYWxldHRlKCkpIHsKLSAgICAgICAgICBwQ29udmVydGVkID0gcENvbnZlcnRlZC0+Q2xvbmVDb252ZXJ0KEZYRElCX1JnYikucmVsZWFzZSgpOworICAgICAgICAgIHBDb252ZXJ0ZWQgPSBwQ29udmVydGVkLT5DbG9uZUNvbnZlcnQoRlhESUJfUmdiKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgRlhESUJfMWJwcENteWs6Ci0gICAgICAgIHBDb252ZXJ0ZWQgPSBwQ29udmVydGVkLT5DbG9uZUNvbnZlcnQoRlhESUJfQ215aykucmVsZWFzZSgpOworICAgICAgICBwQ29udmVydGVkID0gcENvbnZlcnRlZC0+Q2xvbmVDb252ZXJ0KEZYRElCX0NteWspOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgRlhESUJfOGJwcENteWs6CiAgICAgICAgIGlmIChwU291cmNlLT5HZXRQYWxldHRlKCkpIHsKLSAgICAgICAgICBwQ29udmVydGVkID0gcENvbnZlcnRlZC0+Q2xvbmVDb252ZXJ0KEZYRElCX0NteWspLnJlbGVhc2UoKTsKKyAgICAgICAgICBwQ29udmVydGVkID0gcENvbnZlcnRlZC0+Q2xvbmVDb252ZXJ0KEZYRElCX0NteWspOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgICAgZGVmYXVsdDoKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIGlmICghcENvbnZlcnRlZCkgewotICAgICAgT1VUUFVUX1BTKCJcblFcbiIpOworICAgICAgbV9wU3RyZWFtLT5Xcml0ZVN0cmluZygiXG5RXG4iKTsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CisKICAgICBpbnQgYnBwID0gcENvbnZlcnRlZC0+R2V0QlBQKCkgLyA4OwogICAgIHVpbnQ4X3QqIG91dHB1dF9idWYgPSBudWxscHRyOwotICAgIEZYX1NUUlNJWkUgb3V0cHV0X3NpemUgPSAwOwotICAgIGNvbnN0IEZYX0NIQVIqIGZpbHRlciA9IG51bGxwdHI7CisgICAgc2l6ZV90IG91dHB1dF9zaXplID0gMDsKKyAgICBjb25zdCBjaGFyKiBmaWx0ZXIgPSBudWxscHRyOwogICAgIGlmICgobV9QU0xldmVsID09IDIgfHwgZmxhZ3MgJiBGWFJFTkRFUl9JTUFHRV9MT1NTWSkgJiYKLSAgICAgICAgQ0NvZGVjX0pwZWdNb2R1bGU6OkpwZWdFbmNvZGUocENvbnZlcnRlZC5HZXQoKSwgJm91dHB1dF9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRfc2l6ZSkpIHsKKyAgICAgICAgQ0NvZGVjX0pwZWdNb2R1bGU6OkpwZWdFbmNvZGUocENvbnZlcnRlZCwgJm91dHB1dF9idWYsICZvdXRwdXRfc2l6ZSkpIHsKICAgICAgIGZpbHRlciA9ICIvRENURGVjb2RlIGZpbHRlciAiOwogICAgIH0KICAgICBpZiAoIWZpbHRlcikgewpAQCAtNDcyLDM5ICs0NzksNDAgQEAKICAgICAgICAgICAgIHNyY19zY2FuICs9IDM7CiAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEZYU1lTX21lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfcGl0Y2gpOworICAgICAgICAgIG1lbWNweShkZXN0X3NjYW4sIHNyY19zY2FuLCBzcmNfcGl0Y2gpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICB1aW50OF90KiBjb21wcmVzc2VkX2J1ZjsKICAgICAgIHVpbnQzMl90IGNvbXByZXNzZWRfc2l6ZTsKICAgICAgIFBTQ29tcHJlc3NEYXRhKG1fUFNMZXZlbCwgb3V0cHV0X2J1Ziwgb3V0cHV0X3NpemUsICZjb21wcmVzc2VkX2J1ZiwKICAgICAgICAgICAgICAgICAgICAgICZjb21wcmVzc2VkX3NpemUsICZmaWx0ZXIpOwotICAgICAgaWYgKG91dHB1dF9idWYgIT0gY29tcHJlc3NlZF9idWYpIHsKKyAgICAgIGlmIChvdXRwdXRfYnVmICE9IGNvbXByZXNzZWRfYnVmKQogICAgICAgICBGWF9GcmVlKG91dHB1dF9idWYpOwotICAgICAgfQorCiAgICAgICBvdXRwdXRfYnVmID0gY29tcHJlc3NlZF9idWY7CiAgICAgICBvdXRwdXRfc2l6ZSA9IGNvbXByZXNzZWRfc2l6ZTsKICAgICB9CiAgICAgYnVmIDw8ICIgOFsiOwogICAgIGJ1ZiA8PCB3aWR0aCA8PCAiIDAgMCAtIiA8PCBoZWlnaHQgPDwgIiAwICIgPDwgaGVpZ2h0IDw8ICJdIjsKICAgICBidWYgPDwgImN1cnJlbnRmaWxlL0FTQ0lJODVEZWNvZGUgZmlsdGVyICI7Ci0gICAgaWYgKGZpbHRlcikgeworICAgIGlmIChmaWx0ZXIpCiAgICAgICBidWYgPDwgZmlsdGVyOwotICAgIH0KKwogICAgIGJ1ZiA8PCAiZmFsc2UgIiA8PCBicHA7CiAgICAgYnVmIDw8ICIgY29sb3JpbWFnZVxuIjsKLSAgICBtX3BPdXRwdXQtPk91dHB1dFBTKChjb25zdCBGWF9DSEFSKilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOworICAgIG1fcFN0cmVhbS0+V3JpdGVCbG9jayhidWYuc3RyKCkuY19zdHIoKSwgYnVmLnRlbGxwKCkpOworCiAgICAgV3JpdGVQU0JpbmFyeShvdXRwdXRfYnVmLCBvdXRwdXRfc2l6ZSk7CiAgICAgRlhfRnJlZShvdXRwdXRfYnVmKTsKICAgfQotICBPVVRQVVRfUFMoIlxuUVxuIik7CisgIG1fcFN0cmVhbS0+V3JpdGVTdHJpbmcoIlxuUVxuIik7CiAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIENGWF9QU1JlbmRlcmVyOjpTZXRDb2xvcih1aW50MzJfdCBjb2xvcikgewogICBib29sIGJDTVlLID0gZmFsc2U7CiAgIGlmIChiQ01ZSyAhPSBtX2JDbXlrT3V0cHV0IHx8ICFtX2JDb2xvclNldCB8fCBtX0xhc3RDb2xvciAhPSBjb2xvcikgewotICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIGJ1ZjsKICAgICBpZiAoYkNNWUspIHsKICAgICAgIGJ1ZiA8PCBGWFNZU19HZXRDVmFsdWUoY29sb3IpIC8gMjU1LjAgPDwgIiAiCiAgICAgICAgICAgPDwgRlhTWVNfR2V0TVZhbHVlKGNvbG9yKSAvIDI1NS4wIDw8ICIgIgpAQCAtNTE4LDcgKzUyNiw3IEBACiAgICAgICBtX2JDb2xvclNldCA9IHRydWU7CiAgICAgICBtX0xhc3RDb2xvciA9IGNvbG9yOwogICAgIH0KLSAgICBtX3BPdXRwdXQtPk91dHB1dFBTKChjb25zdCBGWF9DSEFSKilidWYuR2V0QnVmZmVyKCksIGJ1Zi5HZXRTaXplKCkpOworICAgIG1fcFN0cmVhbS0+V3JpdGVCbG9jayhidWYuc3RyKCkuY19zdHIoKSwgYnVmLnRlbGxwKCkpOwogICB9CiB9CiAKQEAgLTUzNCwxNCArNTQyLDE0IEBACiAgICAgICAgICAgcFBTRm9udC0+bV9HbHlwaHNbal0ubV9HbHlwaEluZGV4ID09IGNoYXJwb3MubV9HbHlwaEluZGV4ICYmCiAgICAgICAgICAgKCghcFBTRm9udC0+bV9HbHlwaHNbal0ubV9iR2x5cGhBZGp1c3QgJiYgIWNoYXJwb3MubV9iR2x5cGhBZGp1c3QpIHx8CiAgICAgICAgICAgIChwUFNGb250LT5tX0dseXBoc1tqXS5tX2JHbHlwaEFkanVzdCAmJiBjaGFycG9zLm1fYkdseXBoQWRqdXN0ICYmCi0gICAgICAgICAgICAoRlhTWVNfZmFicyhwUFNGb250LT5tX0dseXBoc1tqXS5tX0FkanVzdE1hdHJpeFswXSAtCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzBdKSA8IDAuMDEgJiYKLSAgICAgICAgICAgICBGWFNZU19mYWJzKHBQU0ZvbnQtPm1fR2x5cGhzW2pdLm1fQWRqdXN0TWF0cml4WzFdIC0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMV0pIDwgMC4wMSAmJgotICAgICAgICAgICAgIEZYU1lTX2ZhYnMocFBTRm9udC0+bV9HbHlwaHNbal0ubV9BZGp1c3RNYXRyaXhbMl0gLQotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsyXSkgPCAwLjAxICYmCi0gICAgICAgICAgICAgRlhTWVNfZmFicyhwUFNGb250LT5tX0dseXBoc1tqXS5tX0FkanVzdE1hdHJpeFszXSAtCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzNdKSA8IDAuMDEpKSkpIHsKKyAgICAgICAgICAgIChmYWJzKHBQU0ZvbnQtPm1fR2x5cGhzW2pdLm1fQWRqdXN0TWF0cml4WzBdIC0KKyAgICAgICAgICAgICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMF0pIDwgMC4wMSAmJgorICAgICAgICAgICAgIGZhYnMocFBTRm9udC0+bV9HbHlwaHNbal0ubV9BZGp1c3RNYXRyaXhbMV0gLQorICAgICAgICAgICAgICAgICAgY2hhcnBvcy5tX0FkanVzdE1hdHJpeFsxXSkgPCAwLjAxICYmCisgICAgICAgICAgICAgZmFicyhwUFNGb250LT5tX0dseXBoc1tqXS5tX0FkanVzdE1hdHJpeFsyXSAtCisgICAgICAgICAgICAgICAgICBjaGFycG9zLm1fQWRqdXN0TWF0cml4WzJdKSA8IDAuMDEgJiYKKyAgICAgICAgICAgICBmYWJzKHBQU0ZvbnQtPm1fR2x5cGhzW2pdLm1fQWRqdXN0TWF0cml4WzNdIC0KKyAgICAgICAgICAgICAgICAgIGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbM10pIDwgMC4wMSkpKSkgewogICAgICAgICAqcHNfZm9udG51bSA9IGk7CiAgICAgICAgICpwc19nbHlwaGluZGV4ID0gajsKICAgICAgICAgcmV0dXJuOwpAQCAtNTQ5LDEwICs1NTcsMTEgQEAKICAgICB9CiAgICAgKytpOwogICB9CisKICAgaWYgKG1fUFNGb250TGlzdC5lbXB0eSgpIHx8IG1fUFNGb250TGlzdC5iYWNrKCktPm1fbkdseXBocyA9PSAyNTYpIHsKICAgICBtX1BTRm9udExpc3QucHVzaF9iYWNrKHBkZml1bTo6TWFrZVVuaXF1ZTxDUFNGb250PigpKTsKICAgICBtX1BTRm9udExpc3QuYmFjaygpLT5tX25HbHlwaHMgPSAwOwotICAgIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIGJ1ZjsKICAgICBidWYgPDwgIjggZGljdCBiZWdpbi9Gb250VHlwZSAzIGRlZi9Gb250TWF0cml4WzEgMCAwIDEgMCAwXWRlZlxuIgogICAgICAgICAgICAiL0ZvbnRCQm94WzAgMCAwIDBdZGVmL0VuY29kaW5nIDI1NiBhcnJheSBkZWYgMCAxIDI1NXtFbmNvZGluZyAiCiAgICAgICAgICAgICJleGNoLy5ub3RkZWYgcHV0fWZvclxuIgpAQCAtNTY0LDkgKzU3MywxMCBAQAogICAgICAgICAgICAiY3VycmVudGRpY3QgZW5kXG4iOwogICAgIGJ1ZiA8PCAiL1giIDw8IHN0YXRpY19jYXN0PHVpbnQzMl90PihtX1BTRm9udExpc3Quc2l6ZSgpIC0gMSkKICAgICAgICAgPDwgIiBleGNoIGRlZmluZWZvbnQgcG9wXG4iOwotICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKGNvbnN0IEZYX0NIQVIqKWJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7Ci0gICAgYnVmLkNsZWFyKCk7CisgICAgbV9wU3RyZWFtLT5Xcml0ZUJsb2NrKGJ1Zi5zdHIoKS5jX3N0cigpLCBidWYudGVsbHAoKSk7CisgICAgYnVmLnN0cigiIik7CiAgIH0KKwogICAqcHNfZm9udG51bSA9IG1fUFNGb250TGlzdC5zaXplKCkgLSAxOwogICBDUFNGb250KiBwUFNGb250ID0gbV9QU0ZvbnRMaXN0Wypwc19mb250bnVtXS5nZXQoKTsKICAgaW50IGdseXBoaW5kZXggPSBwUFNGb250LT5tX25HbHlwaHM7CkBAIC01OTgsNyArNjA4LDcgQEAKICAgaWYgKGNoYXJwb3MubV9iR2x5cGhBZGp1c3QpCiAgICAgVHJhbnNmb3JtZWRQYXRoLlRyYW5zZm9ybSgmbWF0cml4KTsKIAotICBDRlhfQnl0ZVRleHRCdWYgYnVmOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gYnVmOwogICBidWYgPDwgIi9YIiA8PCAqcHNfZm9udG51bSA8PCAiIEZmL0NoYXJQcm9jcyBnZXQgYmVnaW4vIiA8PCBnbHlwaGluZGV4CiAgICAgICA8PCAie24gIjsKICAgZm9yIChzaXplX3QgcCA9IDA7IHAgPCBUcmFuc2Zvcm1lZFBhdGguR2V0UG9pbnRzKCkuc2l6ZSgpOyBwKyspIHsKQEAgLTYyNSwyNiArNjM1LDMxIEBACiAgIGJ1ZiA8PCAiZn1iaW5kIGRlZiBlbmRcbiI7CiAgIGJ1ZiA8PCAiL1giIDw8ICpwc19mb250bnVtIDw8ICIgRmYvRW5jb2RpbmcgZ2V0ICIgPDwgZ2x5cGhpbmRleCA8PCAiLyIKICAgICAgIDw8IGdseXBoaW5kZXggPDwgIiBwdXRcbiI7Ci0gIG1fcE91dHB1dC0+T3V0cHV0UFMoKGNvbnN0IEZYX0NIQVIqKWJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7CisgIG1fcFN0cmVhbS0+V3JpdGVCbG9jayhidWYuc3RyKCkuY19zdHIoKSwgYnVmLnRlbGxwKCkpOwogfQogCiBib29sIENGWF9QU1JlbmRlcmVyOjpEcmF3VGV4dChpbnQgbkNoYXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvcikgewotICBTdGFydFJlbmRlcmluZygpOwotICBpbnQgYWxwaGEgPSBGWEFSR0JfQShjb2xvcik7Ci0gIGlmIChhbHBoYSA8IDI1NSkKLSAgICByZXR1cm4gZmFsc2U7CisgIC8vIERvIG5vdCBzZW5kIHplcm8gb3IgbmVnYXRpdmUgZm9udCBzaXplcyB0byBwcmludGVycy4gU2VlIGNyYnVnLmNvbS83NjczNDMuCisgIGlmIChmb250X3NpemUgPD0gMC4wKQorICAgIHJldHVybiB0cnVlOwogCiAgIGlmICgocE9iamVjdDJEZXZpY2UtPmEgPT0gMCAmJiBwT2JqZWN0MkRldmljZS0+YiA9PSAwKSB8fAogICAgICAgKHBPYmplY3QyRGV2aWNlLT5jID09IDAgJiYgcE9iamVjdDJEZXZpY2UtPmQgPT0gMCkpIHsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQorCisgIFN0YXJ0UmVuZGVyaW5nKCk7CisgIGludCBhbHBoYSA9IEZYQVJHQl9BKGNvbG9yKTsKKyAgaWYgKGFscGhhIDwgMjU1KQorICAgIHJldHVybiBmYWxzZTsKKwogICBTZXRDb2xvcihjb2xvcik7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBidWY7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBidWY7CiAgIGJ1ZiA8PCAicVsiIDw8IHBPYmplY3QyRGV2aWNlLT5hIDw8ICIgIiA8PCBwT2JqZWN0MkRldmljZS0+YiA8PCAiICIKICAgICAgIDw8IHBPYmplY3QyRGV2aWNlLT5jIDw8ICIgIiA8PCBwT2JqZWN0MkRldmljZS0+ZCA8PCAiICIKICAgICAgIDw8IHBPYmplY3QyRGV2aWNlLT5lIDw8ICIgIiA8PCBwT2JqZWN0MkRldmljZS0+ZiA8PCAiXWNtXG4iOwpAQCAtNjYxLDEyICs2NzYsMTEgQEAKICAgICAgIGxhc3RfZm9udG51bSA9IHBzX2ZvbnRudW07CiAgICAgfQogICAgIGJ1ZiA8PCBwQ2hhclBvc1tpXS5tX09yaWdpbi54IDw8ICIgIiA8PCBwQ2hhclBvc1tpXS5tX09yaWdpbi55IDw8ICIgbSI7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgaGV4OwotICAgIGhleC5Gb3JtYXQoIjwlMDJYPiIsIHBzX2dseXBoaW5kZXgpOwotICAgIGJ1ZiA8PCBoZXguQXNTdHJpbmdDKCkgPDwgIlRqXG4iOworICAgIEJ5dGVTdHJpbmcgaGV4ID0gQnl0ZVN0cmluZzo6Rm9ybWF0KCI8JTAyWD4iLCBwc19nbHlwaGluZGV4KTsKKyAgICBidWYgPDwgaGV4LkFzU3RyaW5nVmlldygpIDw8ICJUalxuIjsKICAgfQogICBidWYgPDwgIlFcbiI7Ci0gIG1fcE91dHB1dC0+T3V0cHV0UFMoKGNvbnN0IEZYX0NIQVIqKWJ1Zi5HZXRCdWZmZXIoKSwgYnVmLkdldFNpemUoKSk7CisgIG1fcFN0cmVhbS0+V3JpdGVCbG9jayhidWYuc3RyKCkuY19zdHIoKSwgYnVmLnRlbGxwKCkpOwogICBwQ2FjaGUtPlJlbGVhc2VDYWNoZWRGYWNlKHBGb250KTsKICAgcmV0dXJuIHRydWU7CiB9CkBAIC02NzQsMTMgKzY4OCwxMiBAQAogdm9pZCBDRlhfUFNSZW5kZXJlcjo6V3JpdGVQU0JpbmFyeShjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgbGVuKSB7CiAgIHVpbnQ4X3QqIGRlc3RfYnVmOwogICB1aW50MzJfdCBkZXN0X3NpemU7Ci0gIENDb2RlY19Nb2R1bGVNZ3IqIHBFbmNvZGVycyA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldENvZGVjTW9kdWxlKCk7Ci0gIGlmIChwRW5jb2RlcnMgJiYKLSAgICAgIHBFbmNvZGVycy0+R2V0QmFzaWNNb2R1bGUoKS0+QTg1RW5jb2RlKGRhdGEsIGxlbiwgJmRlc3RfYnVmLAorICBDQ29kZWNfTW9kdWxlTWdyKiBwRW5jb2RlcnMgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldENvZGVjTW9kdWxlKCk7CisgIGlmIChwRW5jb2RlcnMtPkdldEJhc2ljTW9kdWxlKCktPkE4NUVuY29kZShkYXRhLCBsZW4sICZkZXN0X2J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXN0X3NpemUpKSB7Ci0gICAgbV9wT3V0cHV0LT5PdXRwdXRQUygoY29uc3QgRlhfQ0hBUiopZGVzdF9idWYsIGRlc3Rfc2l6ZSk7CisgICAgbV9wU3RyZWFtLT5Xcml0ZUJsb2NrKGRlc3RfYnVmLCBkZXN0X3NpemUpOwogICAgIEZYX0ZyZWUoZGVzdF9idWYpOwogICB9IGVsc2UgewotICAgIG1fcE91dHB1dC0+T3V0cHV0UFMoKGNvbnN0IEZYX0NIQVIqKWRhdGEsIGxlbik7CisgICAgbV9wU3RyZWFtLT5Xcml0ZUJsb2NrKGRhdGEsIGxlbik7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS93aW4zMi9jZnhfcHNyZW5kZXJlci5oIGIvY29yZS9meGdlL3dpbjMyL2NmeF9wc3JlbmRlcmVyLmgKaW5kZXggMTYzYzYxOC4uMzM4MjllYSAxMDA2NDQKLS0tIGEvY29yZS9meGdlL3dpbjMyL2NmeF9wc3JlbmRlcmVyLmgKKysrIGIvY29yZS9meGdlL3dpbjMyL2NmeF9wc3JlbmRlcmVyLmgKQEAgLTExLDkgKzExLDEwIEBACiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyZWFtLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGVkYXRhLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL3dpbjMyL2Nwc291dHB1dC5oIgogCiBjbGFzcyBDRlhfRElCU291cmNlOwogY2xhc3MgQ0ZYX0ZhY2VDYWNoZTsKQEAgLTI5LDcgKzMwLDcgQEAKICAgQ0ZYX1BTUmVuZGVyZXIoKTsKICAgfkNGWF9QU1JlbmRlcmVyKCk7CiAKLSAgdm9pZCBJbml0KENQU091dHB1dCogcE91dHB1dCwKKyAgdm9pZCBJbml0KGNvbnN0IFJldGFpblB0cjxJRlhfV3JpdGVTdHJlYW0+JiBzdHJlYW0sCiAgICAgICAgICAgICBpbnQgcHNsZXZlbCwKICAgICAgICAgICAgIGludCB3aWR0aCwKICAgICAgICAgICAgIGludCBoZWlnaHQsCkBAIC01MSwxOCArNTIsMTggQEAKICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaWxsX2NvbG9yLAogICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cm9rZV9jb2xvciwKICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlKTsKLSAgYm9vbCBTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgYm9vbCBTZXRESUJpdHMoY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwQml0bWFwLAogICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wKTsKLSAgYm9vbCBTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgIGJvb2wgU3RyZXRjaERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCiAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzKTsKLSAgYm9vbCBEcmF3RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgIGJvb2wgRHJhd0RJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCiAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7CkBAIC03MCw3ICs3MSw3IEBACiAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAogICAgICAgICAgICAgICAgIENGWF9Gb250KiBwRm9udCwKICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgZmxvYXQgZm9udF9zaXplLAogICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yKTsKIAogIHByaXZhdGU6CkBAIC04NSw3ICs4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGludCogcHNfZ2x5cGhpbmRleCk7CiAgIHZvaWQgV3JpdGVQU0JpbmFyeShjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgbGVuKTsKIAotICBDUFNPdXRwdXQqIG1fcE91dHB1dDsKKyAgUmV0YWluUHRyPElGWF9Xcml0ZVN0cmVhbT4gbV9wU3RyZWFtOwogICBpbnQgbV9QU0xldmVsOwogICBDRlhfR3JhcGhTdGF0ZURhdGEgbV9DdXJHcmFwaFN0YXRlOwogICBib29sIG1fYkdyYXBoU3RhdGVTZXQ7CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2Uvd2luMzIvY2Z4X3dpbmRvd3NkaWIuaCBiL2NvcmUvZnhnZS93aW4zMi9jZnhfd2luZG93c2RpYi5oCmluZGV4IDI1NjRiN2YuLjdjMjQ0N2QgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhnZS93aW4zMi9jZnhfd2luZG93c2RpYi5oCisrKyBiL2NvcmUvZnhnZS93aW4zMi9jZnhfd2luZG93c2RpYi5oCkBAIC0xMCw2ICsxMCwxMCBAQAogI2lmbmRlZiBfV0lORE9XU18KICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAjZW5kaWYKKworI2luY2x1ZGUgImNvcmUvZnhjcnQvYnl0ZXN0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2RpYml0bWFwLmgiCisKICNkZWZpbmUgV0lORElCX09QRU5fTUVNT1JZIDB4MQogI2RlZmluZSBXSU5ESUJfT1BFTl9QQVRITkFNRSAweDIKIApAQCAtMjAsMjggKzI0LDMyIEBACiAKICAgc2l6ZV90IG1lbW9yeV9zaXplOwogCi0gIGNvbnN0IEZYX1dDSEFSKiBwYXRoX25hbWU7CisgIGNvbnN0IHdjaGFyX3QqIHBhdGhfbmFtZTsKIH0gV0lORElCX09wZW5fQXJnc187CiAKIGNsYXNzIENGWF9XaW5kb3dzRElCIDogcHVibGljIENGWF9ESUJpdG1hcCB7CiAgcHVibGljOgotICBDRlhfV2luZG93c0RJQihIREMgaERDLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KKyAgZnJpZW5kIFJldGFpblB0cjxUPiBwZGZpdW06Ok1ha2VSZXRhaW4oQXJncyYmLi4uIGFyZ3MpOworCiAgIH5DRlhfV2luZG93c0RJQigpIG92ZXJyaWRlOwogCi0gIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRCaXRtYXBJbmZvKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCk7Ci0gIHN0YXRpYyBDRlhfRElCaXRtYXAqIExvYWRGcm9tQnVmKEJJVE1BUElORk8qIHBibWksIHZvaWQqIHBEYXRhKTsKLSAgc3RhdGljIEhCSVRNQVAgR2V0RERCaXRtYXAoY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBIREMgaERDKTsKLSAgc3RhdGljIENGWF9ESUJpdG1hcCogTG9hZEZyb21GaWxlKGNvbnN0IEZYX1dDSEFSKiBmaWxlbmFtZSk7Ci0gIHN0YXRpYyBDRlhfRElCaXRtYXAqIExvYWRGcm9tRmlsZShjb25zdCBGWF9DSEFSKiBmaWxlbmFtZSk7Ci0gIHN0YXRpYyBDRlhfRElCaXRtYXAqIExvYWRESUJpdG1hcChXSU5ESUJfT3Blbl9BcmdzXyBhcmdzKTsKKyAgc3RhdGljIEJ5dGVTdHJpbmcgR2V0Qml0bWFwSW5mbyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcCk7CisgIHN0YXRpYyBIQklUTUFQIEdldEREQml0bWFwKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwQml0bWFwLCBIREMgaERDKTsKIAotICBIREMgR2V0REMoKSBjb25zdCB7IHJldHVybiBtX2hNZW1EQzsgfQorICBzdGF0aWMgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gTG9hZEZyb21CdWYoQklUTUFQSU5GTyogcGJtaSwgdm9pZCogcERhdGEpOworICBzdGF0aWMgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gTG9hZEZyb21GaWxlKGNvbnN0IHdjaGFyX3QqIGZpbGVuYW1lKTsKKyAgc3RhdGljIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IExvYWRGcm9tRmlsZShjb25zdCBjaGFyKiBmaWxlbmFtZSk7CisgIHN0YXRpYyBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBMb2FkRElCaXRtYXAoV0lORElCX09wZW5fQXJnc18gYXJncyk7CisKICAgSEJJVE1BUCBHZXRXaW5kb3dzQml0bWFwKCkgY29uc3QgeyByZXR1cm4gbV9oQml0bWFwOyB9CiAKICAgdm9pZCBMb2FkRnJvbURldmljZShIREMgaERDLCBpbnQgbGVmdCwgaW50IHRvcCk7CiAgIHZvaWQgU2V0VG9EZXZpY2UoSERDIGhEQywgaW50IGxlZnQsIGludCB0b3ApOwogCiAgcHJvdGVjdGVkOgorICBDRlhfV2luZG93c0RJQihIREMgaERDLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCiAgIEhEQyBtX2hNZW1EQzsKICAgSEJJVE1BUCBtX2hCaXRtYXA7CiAgIEhCSVRNQVAgbV9oT2xkQml0bWFwOwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL3dpbjMyL2Nwc291dHB1dC5jcHAgYi9jb3JlL2Z4Z2Uvd2luMzIvY3Bzb3V0cHV0LmNwcAppbmRleCA3NmIzN2Q3Li44M2YyZmMwIDEwMDY0NAotLS0gYS9jb3JlL2Z4Z2Uvd2luMzIvY3Bzb3V0cHV0LmNwcAorKysgYi9jb3JlL2Z4Z2Uvd2luMzIvY3Bzb3V0cHV0LmNwcApAQCAtMTAsMjYgKzEwLDE3IEBACiAKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgogCi1DUFNPdXRwdXQ6OkNQU091dHB1dChIREMgaERDKSB7Ci0gIG1faERDID0gaERDOwotfQorQ1BTT3V0cHV0OjpDUFNPdXRwdXQoSERDIGhEQykgOiBtX2hEQyhoREMpIHt9CiAKIENQU091dHB1dDo6fkNQU091dHB1dCgpIHt9CiAKLXZvaWQgQ1BTT3V0cHV0OjpSZWxlYXNlKCkgewotICBkZWxldGUgdGhpczsKLX0KLQotdm9pZCBDUFNPdXRwdXQ6Ok91dHB1dFBTKGNvbnN0IEZYX0NIQVIqIHN0ciwgaW50IGxlbikgewotICBpZiAobGVuIDwgMCkKLSAgICBsZW4gPSBzdGF0aWNfY2FzdDxpbnQ+KEZYU1lTX3N0cmxlbihzdHIpKTsKLQorYm9vbCBDUFNPdXRwdXQ6OldyaXRlQmxvY2soY29uc3Qgdm9pZCogc3RyLCBzaXplX3QgbGVuKSB7CiAgIGludCBzZW50X2xlbiA9IDA7CiAgIHdoaWxlIChsZW4gPiAwKSB7Ci0gICAgRlhfQ0hBUiBidWZmZXJbMTAyNl07Ci0gICAgaW50IHNlbmRfbGVuID0gc3RkOjptaW4obGVuLCAxMDI0KTsKKyAgICBjaGFyIGJ1ZmZlclsxMDI2XTsKKyAgICBzaXplX3Qgc2VuZF9sZW4gPSBzdGQ6Om1pbihsZW4sIHN0YXRpY19jYXN0PHNpemVfdD4oMTAyNCkpOwogICAgICoocmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCo+KGJ1ZmZlcikpID0gc2VuZF9sZW47Ci0gICAgRlhTWVNfbWVtY3B5KGJ1ZmZlciArIDIsIHN0ciArIHNlbnRfbGVuLCBzZW5kX2xlbik7CisgICAgbWVtY3B5KGJ1ZmZlciArIDIsIHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihzdHIpICsgc2VudF9sZW4sIHNlbmRfbGVuKTsKIAogICAgIC8vIFRPRE8odGhlc3RpZy9yYnBvdHRlcik6IERvIFBBU1NUSFJPVUdIIGZvciBub24tQ2hyb21pdW0gdXNhZ2UuCiAgICAgLy8gRXh0RXNjYXBlKG1faERDLCBQQVNTVEhST1VHSCwgc2VuZF9sZW4gKyAyLCBidWZmZXIsIDAsIG51bGxwdHIpOwpAQCAtMzcsNCArMjgsOSBAQAogICAgIHNlbnRfbGVuICs9IHNlbmRfbGVuOwogICAgIGxlbiAtPSBzZW5kX2xlbjsKICAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDUFNPdXRwdXQ6OldyaXRlU3RyaW5nKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIpIHsKKyAgcmV0dXJuIFdyaXRlQmxvY2soc3RyLnVudGVybWluYXRlZF9jX3N0cigpLCBzdHIuR2V0TGVuZ3RoKCkpOwogfQpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL3dpbjMyL2Nwc291dHB1dC5oIGIvY29yZS9meGdlL3dpbjMyL2Nwc291dHB1dC5oCmluZGV4IGJjOTIyNWIuLmQxNDBkZTkgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhnZS93aW4zMi9jcHNvdXRwdXQuaAorKysgYi9jb3JlL2Z4Z2Uvd2luMzIvY3Bzb3V0cHV0LmgKQEAgLTksMTcgKzksMTkgQEAKIAogI2luY2x1ZGUgPHdpbmRvd3MuaD4KIAorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyZWFtLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKIAotY2xhc3MgQ1BTT3V0cHV0IHsKK2NsYXNzIENQU091dHB1dCA6IHB1YmxpYyBJRlhfV3JpdGVTdHJlYW0gewogIHB1YmxpYzoKICAgZXhwbGljaXQgQ1BTT3V0cHV0KEhEQyBoREMpOwotICB+Q1BTT3V0cHV0KCk7CisgIH5DUFNPdXRwdXQoKSBvdmVycmlkZTsKIAotICAvLyBJRlhfUFNPdXRwdXQKLSAgdm9pZCBSZWxlYXNlKCk7Ci0gIHZvaWQgT3V0cHV0UFMoY29uc3QgRlhfQ0hBUiogc3RyLCBpbnQgbGVuKTsKKyAgLy8gSUZYX1dyaXRlc3RyZWFtCisgIGJvb2wgV3JpdGVCbG9jayhjb25zdCB2b2lkKiBzdHIsIHNpemVfdCBsZW4pIG92ZXJyaWRlOworICBib29sIFdyaXRlU3RyaW5nKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIpIG92ZXJyaWRlOwogCisgcHJpdmF0ZToKICAgSERDIG1faERDOwogfTsKIApkaWZmIC0tZ2l0IGEvY29yZS9meGdlL3dpbjMyL2R3cml0ZV9pbnQuaCBiL2NvcmUvZnhnZS93aW4zMi9kd3JpdGVfaW50LmgKaW5kZXggODZlYWQ4OS4uN2ZiYjkyOSAxMDA2NDQKLS0tIGEvY29yZS9meGdlL3dpbjMyL2R3cml0ZV9pbnQuaAorKysgYi9jb3JlL2Z4Z2Uvd2luMzIvZHdyaXRlX2ludC5oCkBAIC03LDE1ICs3LDE5IEBACiAjaWZuZGVmIENPUkVfRlhHRV9XSU4zMl9EV1JJVEVfSU5UX0hfCiAjZGVmaW5lIENPUkVfRlhHRV9XSU4zMl9EV1JJVEVfSU5UX0hfCiAKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfZGliaXRtYXAuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCisKICNpZm5kZWYgREVDTFNQRUNfVVVJRAotI2lmIChfTVNDX1ZFUiA+PSAxMTAwKSAmJiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpCiAjZGVmaW5lIERFQ0xTUEVDX1VVSUQoeCkgX19kZWNsc3BlYyh1dWlkKHgpKQogI2Vsc2UKICNkZWZpbmUgREVDTFNQRUNfVVVJRCh4KQogI2VuZGlmCiAjZW5kaWYKICNpZm5kZWYgREVDTFNQRUNfTk9WVEFCTEUKLSNpZiAoX01TQ19WRVIgPj0gMTEwMCkgJiYgZGVmaW5lZChfX2NwbHVzcGx1cykKKyNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQogI2RlZmluZSBERUNMU1BFQ19OT1ZUQUJMRSBfX2RlY2xzcGVjKG5vdnRhYmxlKQogI2Vsc2UKICNkZWZpbmUgREVDTFNQRUNfTk9WVEFCTEUKQEAgLTM5LDIxICs0MywyMiBAQAogICB2b2lkKiBEd0NyZWF0ZUZvbnRGYWNlRnJvbVN0cmVhbSh1aW50OF90KiBwRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpbXVsYXRpb25fc3R5bGUpOwotICBib29sIER3Q3JlYXRlUmVuZGVyaW5nVGFyZ2V0KENGWF9ESUJpdG1hcCogcFNyYywgdm9pZCoqIHJlbmRlclRhcmdldCk7CisgIGJvb2wgRHdDcmVhdGVSZW5kZXJpbmdUYXJnZXQoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIHJlbmRlclRhcmdldCk7CiAgIHZvaWQgRHdEZWxldGVSZW5kZXJpbmdUYXJnZXQodm9pZCogcmVuZGVyVGFyZ2V0KTsKICAgYm9vbCBEd1JlbmRpbmdTdHJpbmcodm9pZCogcmVuZGVyVGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICBDRlhfQ2xpcFJnbiogcENsaXBSZ24sCiAgICAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QmIHN0cmluZ1JlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZm9udF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIHRleHRfY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBnbHlwaF9jb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQqIGdseXBoX2luZGljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGJhc2VsaW5lT3JpZ2luWCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYmFzZWxpbmVPcmlnaW5ZLAorICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBiYXNlbGluZU9yaWdpblgsCisgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJhc2VsaW5lT3JpZ2luWSwKICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZ2x5cGhfb2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIGdseXBoX2FkdmFuY2VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGdseXBoX2FkdmFuY2VzKTsKICAgdm9pZCBEd0RlbGV0ZUZvbnQodm9pZCogcEZvbnQpOwogCiAgcHJvdGVjdGVkOgpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL3dpbjMyL2Z4X3dpbjMyX2RldmljZS5jcHAgYi9jb3JlL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZGV2aWNlLmNwcAppbmRleCA5MmU5YjQxLi40OTJiMGI1IDEwMDY0NAotLS0gYS9jb3JlL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZGV2aWNlLmNwcAorKysgYi9jb3JlL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZGV2aWNlLmNwcApAQCAtMTAsMTYgKzEwLDE5IEBACiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAotI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9meF9jb2RlYy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X21heWJlX293bmVkLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb2RlcGFnZS5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3dpbmRvd3NkZXZpY2UuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2RpYl9pbnQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L21heWJlX293bmVkLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mb2xkZXJmb250aW5mby5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZm9udG1nci5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZ2Vtb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3dpbmRvd3NyZW5kZXJkZXZpY2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9kaWJleHRyYWN0b3IuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9pbWFnZXJlbmRlcmVyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jc3RyZXRjaGVuZ2luZS5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mb250LmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZyZWV0eXBlLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2dlL2NmeF9mb2xkZXJmb250aW5mby5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9nZS9meF90ZXh0X2ludC5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9pZnhfc3lzdGVtZm9udGluZm8uaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2Uvd2luMzIvY2Z4X3dpbmRvd3NkaWIuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2Uvd2luMzIvZHdyaXRlX2ludC5oIgpAQCAtMzQsMTUgKzM3LDE1IEBACiBuYW1lc3BhY2UgewogCiBjb25zdCBzdHJ1Y3QgewotICBjb25zdCBGWF9DSEFSKiBtX3BGYWNlTmFtZTsKLSAgY29uc3QgRlhfQ0hBUiogbV9wVmFyaWFudE5hbWU7CisgIGNvbnN0IGNoYXIqIG1fcEZhY2VOYW1lOworICBjb25zdCBjaGFyKiBtX3BWYXJpYW50TmFtZTsKIH0gZ19WYXJpYW50TmFtZXNbXSA9IHsKICAgICB7IkRGS2FpLVNCIiwgIlx4MTlceDZBXHg3N1x4NjlceEQ0XHg5QSJ9LAogfTsKIAogY29uc3Qgc3RydWN0IHsKLSAgY29uc3QgRlhfQ0hBUiogbV9wTmFtZTsKLSAgY29uc3QgRlhfQ0hBUiogbV9wV2luTmFtZTsKKyAgY29uc3QgY2hhciogbV9wTmFtZTsKKyAgY29uc3QgY2hhciogbV9wV2luTmFtZTsKICAgYm9vbCBtX2JCb2xkOwogICBib29sIG1fYkl0YWxpYzsKIH0gZ19CYXNlMTRTdWJzdHNbXSA9IHsKQEAgLTYxLDE1ICs2NCwxNSBAQAogfTsKIAogc3RydWN0IEZvbnROYW1lTWFwIHsKLSAgY29uc3QgRlhfQ0hBUiogbV9wU3ViRm9udE5hbWU7Ci0gIGNvbnN0IEZYX0NIQVIqIG1fcFNyY0ZvbnROYW1lOworICBjb25zdCBjaGFyKiBtX3BTdWJGb250TmFtZTsKKyAgY29uc3QgY2hhciogbV9wU3JjRm9udE5hbWU7CiB9OwogY29uc3QgRm9udE5hbWVNYXAgZ19KcEZvbnROYW1lTWFwW10gPSB7CiAgICAgeyJNUyBNaW5jaG8iLCAiSGVpc2VpbWluLVczIn0sCiAgICAgeyJNUyBHb3RoaWMiLCAiSnVuMTAxLUxpZ2h0In0sCiB9OwogCi1ib29sIEdldFN1YkZvbnROYW1lKENGWF9CeXRlU3RyaW5nKiBuYW1lKSB7Citib29sIEdldFN1YkZvbnROYW1lKEJ5dGVTdHJpbmcqIG5hbWUpIHsKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZ19KcEZvbnROYW1lTWFwKTsgKytpKSB7CiAgICAgaWYgKCFGWFNZU19zdHJpY21wKG5hbWUtPmNfc3RyKCksIGdfSnBGb250TmFtZU1hcFtpXS5tX3BTcmNGb250TmFtZSkpIHsKICAgICAgICpuYW1lID0gZ19KcEZvbnROYW1lTWFwW2ldLm1fcFN1YkZvbnROYW1lOwpAQCAtOTEsMTIgKzk0LDExIEBACiBIUEVOIENyZWF0ZVBlbihjb25zdCBDRlhfR3JhcGhTdGF0ZURhdGEqIHBHcmFwaFN0YXRlLAogICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKICAgICAgICAgICAgICAgIHVpbnQzMl90IGFyZ2IpIHsKLSAgRlhfRkxPQVQgd2lkdGg7Ci0gIEZYX0ZMT0FUIHNjYWxlID0gMS5mOworICBmbG9hdCB3aWR0aDsKKyAgZmxvYXQgc2NhbGUgPSAxLmY7CiAgIGlmIChwTWF0cml4KQotICAgIHNjYWxlID0gRlhTWVNfZmFicyhwTWF0cml4LT5hKSA+IEZYU1lTX2ZhYnMocE1hdHJpeC0+YikKLSAgICAgICAgICAgICAgICA/IEZYU1lTX2ZhYnMocE1hdHJpeC0+YSkKLSAgICAgICAgICAgICAgICA6IEZYU1lTX2ZhYnMocE1hdHJpeC0+Yik7CisgICAgc2NhbGUgPSBmYWJzKHBNYXRyaXgtPmEpID4gZmFicyhwTWF0cml4LT5iKSA/IGZhYnMocE1hdHJpeC0+YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmFicyhwTWF0cml4LT5iKTsKICAgaWYgKHBHcmFwaFN0YXRlKSB7CiAgICAgd2lkdGggPSBzY2FsZSAqIHBHcmFwaFN0YXRlLT5tX0xpbmVXaWR0aDsKICAgfSBlbHNlIHsKQEAgLTEzNSw3ICsxMzcsNyBAQAogICB9CiAgIGludCBhOwogICBGWF9DT0xPUlJFRiByZ2I7Ci0gIEFyZ2JEZWNvZGUoYXJnYiwgYSwgcmdiKTsKKyAgc3RkOjp0aWUoYSwgcmdiKSA9IEFyZ2JUb0NvbG9yUmVmKGFyZ2IpOwogICBMT0dCUlVTSCBsYjsKICAgbGIubGJDb2xvciA9IHJnYjsKICAgbGIubGJTdHlsZSA9IEJTX1NPTElEOwpAQCAtMTUwLDcgKzE1Miw3IEBACiAgICAgICBkYXNoZXNbaV0gPSBzdGQ6Om1heChkYXNoZXNbaV0sIDFVKTsKICAgICB9CiAgIH0KLSAgcmV0dXJuIEV4dENyZWF0ZVBlbihQZW5TdHlsZSwgKERXT1JEKUZYU1lTX2NlaWwod2lkdGgpLCAmbGIsCisgIHJldHVybiBFeHRDcmVhdGVQZW4oUGVuU3R5bGUsIChEV09SRCljZWlsKHdpZHRoKSwgJmxiLAogICAgICAgICAgICAgICAgICAgICAgIHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IERXT1JEKj4oZGFzaGVzLmRhdGEoKSkpOwogfQpAQCAtMTU4LDcgKzE2MCw3IEBACiBIQlJVU0ggQ3JlYXRlQnJ1c2godWludDMyX3QgYXJnYikgewogICBpbnQgYTsKICAgRlhfQ09MT1JSRUYgcmdiOwotICBBcmdiRGVjb2RlKGFyZ2IsIGEsIHJnYik7CisgIHN0ZDo6dGllKGEsIHJnYikgPSBBcmdiVG9Db2xvclJlZihhcmdiKTsKICAgcmV0dXJuIENyZWF0ZVNvbGlkQnJ1c2gocmdiKTsKIH0KIApAQCAtMjE1LDI2ICsyMTcsMjYgQEAKIC8vIGFsdG9nZXRoZXIgYW5kIHJlcGxhY2UgYnkgU2tpYSBjb2RlLgogCiBzdHJ1Y3QgcmVjdF9iYXNlIHsKLSAgRlhfRkxPQVQgeDE7Ci0gIEZYX0ZMT0FUIHkxOwotICBGWF9GTE9BVCB4MjsKLSAgRlhfRkxPQVQgeTI7CisgIGZsb2F0IHgxOworICBmbG9hdCB5MTsKKyAgZmxvYXQgeDI7CisgIGZsb2F0IHkyOwogfTsKIAotdW5zaWduZWQgY2xpcF9saWFuZ19iYXJza3koRlhfRkxPQVQgeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTIsCit1bnNpZ25lZCBjbGlwX2xpYW5nX2JhcnNreShmbG9hdCB4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY3RfYmFzZSYgY2xpcF9ib3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiB5KSB7Ci0gIGNvbnN0IEZYX0ZMT0FUIG5lYXJ6ZXJvID0gMWUtMzBmOwotICBGWF9GTE9BVCBkZWx0YXggPSB4MiAtIHgxOwotICBGWF9GTE9BVCBkZWx0YXkgPSB5MiAtIHkxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogeSkgeworICBjb25zdCBmbG9hdCBuZWFyemVybyA9IDFlLTMwZjsKKyAgZmxvYXQgZGVsdGF4ID0geDIgLSB4MTsKKyAgZmxvYXQgZGVsdGF5ID0geTIgLSB5MTsKICAgdW5zaWduZWQgbnAgPSAwOwogICBpZiAoZGVsdGF4ID09IDApCiAgICAgZGVsdGF4ID0gKHgxID4gY2xpcF9ib3gueDEpID8gLW5lYXJ6ZXJvIDogbmVhcnplcm87Ci0gIEZYX0ZMT0FUIHhpbiwgeG91dDsKKyAgZmxvYXQgeGluLCB4b3V0OwogICBpZiAoZGVsdGF4ID4gMCkgewogICAgIHhpbiA9IGNsaXBfYm94LngxOwogICAgIHhvdXQgPSBjbGlwX2JveC54MjsKQEAgLTI0MiwxMCArMjQ0LDEwIEBACiAgICAgeGluID0gY2xpcF9ib3gueDI7CiAgICAgeG91dCA9IGNsaXBfYm94LngxOwogICB9Ci0gIEZYX0ZMT0FUIHRpbnggPSAoeGluIC0geDEpIC8gZGVsdGF4OworICBmbG9hdCB0aW54ID0gKHhpbiAtIHgxKSAvIGRlbHRheDsKICAgaWYgKGRlbHRheSA9PSAwKQogICAgIGRlbHRheSA9ICh5MSA+IGNsaXBfYm94LnkxKSA/IC1uZWFyemVybyA6IG5lYXJ6ZXJvOwotICBGWF9GTE9BVCB5aW4sIHlvdXQ7CisgIGZsb2F0IHlpbiwgeW91dDsKICAgaWYgKGRlbHRheSA+IDApIHsKICAgICB5aW4gPSBjbGlwX2JveC55MTsKICAgICB5b3V0ID0gY2xpcF9ib3gueTI7CkBAIC0yNTMsOCArMjU1LDggQEAKICAgICB5aW4gPSBjbGlwX2JveC55MjsKICAgICB5b3V0ID0gY2xpcF9ib3gueTE7CiAgIH0KLSAgRlhfRkxPQVQgdGlueSA9ICh5aW4gLSB5MSkgLyBkZWx0YXk7Ci0gIEZYX0ZMT0FUIHRpbjEsIHRpbjI7CisgIGZsb2F0IHRpbnkgPSAoeWluIC0geTEpIC8gZGVsdGF5OworICBmbG9hdCB0aW4xLCB0aW4yOwogICBpZiAodGlueCA8IHRpbnkpIHsKICAgICB0aW4xID0gdGlueDsKICAgICB0aW4yID0gdGlueTsKQEAgLTI2OSw5ICsyNzEsOSBAQAogICAgICAgKytucDsKICAgICB9CiAgICAgaWYgKHRpbjIgPD0gMS4wZikgewotICAgICAgRlhfRkxPQVQgdG91dHggPSAoeG91dCAtIHgxKSAvIGRlbHRheDsKLSAgICAgIEZYX0ZMT0FUIHRvdXR5ID0gKHlvdXQgLSB5MSkgLyBkZWx0YXk7Ci0gICAgICBGWF9GTE9BVCB0b3V0MSA9ICh0b3V0eCA8IHRvdXR5KSA/IHRvdXR4IDogdG91dHk7CisgICAgICBmbG9hdCB0b3V0eCA9ICh4b3V0IC0geDEpIC8gZGVsdGF4OworICAgICAgZmxvYXQgdG91dHkgPSAoeW91dCAtIHkxKSAvIGRlbHRheTsKKyAgICAgIGZsb2F0IHRvdXQxID0gKHRvdXR4IDwgdG91dHkpID8gdG91dHggOiB0b3V0eTsKICAgICAgIGlmICh0aW4yID4gMCB8fCB0b3V0MSA+IDApIHsKICAgICAgICAgaWYgKHRpbjIgPD0gdG91dDEpIHsKICAgICAgICAgICBpZiAodGluMiA+IDApIHsKQEAgLTMyNCw4ICszMjYsNyBAQAogICAgICAgICAgICAgICAgIGJvb2wgYkl0YWxpYywKICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5LAotICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZhbWlseSwKLSAgICAgICAgICAgICAgICBpbnQmIGlFeGFjdCkgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmFtaWx5KSBvdmVycmlkZTsKIH07CiAKIGNsYXNzIENGWF9XaW4zMkZvbnRJbmZvIGZpbmFsIDogcHVibGljIElGWF9TeXN0ZW1Gb250SW5mbyB7CkBAIC0zMzksMzAgKzM0MCwyNyBAQAogICAgICAgICAgICAgICAgIGJvb2wgYkl0YWxpYywKICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCwKICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5LAotICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGZhY2UsCi0gICAgICAgICAgICAgICAgaW50JiBpRXhhY3QpIG92ZXJyaWRlOwotICB2b2lkKiBHZXRGb250KGNvbnN0IEZYX0NIQVIqIGZhY2UpIG92ZXJyaWRlIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmYWNlKSBvdmVycmlkZTsKKyAgdm9pZCogR2V0Rm9udChjb25zdCBjaGFyKiBmYWNlKSBvdmVycmlkZSB7IHJldHVybiBudWxscHRyOyB9CiAgIHVpbnQzMl90IEdldEZvbnREYXRhKHZvaWQqIGhGb250LAogICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplKSBvdmVycmlkZTsKLSAgYm9vbCBHZXRGYWNlTmFtZSh2b2lkKiBoRm9udCwgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpIG92ZXJyaWRlOwotICBib29sIEdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpIG92ZXJyaWRlOworICBib29sIEdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBCeXRlU3RyaW5nKiBuYW1lKSBvdmVycmlkZTsKKyAgYm9vbCBHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50KiBjaGFyc2V0KSBvdmVycmlkZTsKICAgdm9pZCBEZWxldGVGb250KHZvaWQqIGhGb250KSBvdmVycmlkZTsKIAogICBib29sIElzT3BlblR5cGVGcm9tRGl2KGNvbnN0IExPR0ZPTlRBKiBwbGYpOwogICBib29sIElzU3VwcG9ydEZvbnRGb3JtRGl2KGNvbnN0IExPR0ZPTlRBKiBwbGYpOwogICB2b2lkIEFkZEluc3RhbGxlZEZvbnQoY29uc3QgTE9HRk9OVEEqIHBsZiwgdWludDMyX3QgRm9udFR5cGUpOwotICB2b2lkIEdldEdCUHJlZmVyZW5jZShDRlhfQnl0ZVN0cmluZyYgZmFjZSwgaW50IHdlaWdodCwgaW50IHBpY3RoX2ZhbWlseSk7Ci0gIHZvaWQgR2V0SmFwYW5lc2VQcmVmZXJlbmNlKENGWF9CeXRlU3RyaW5nJiBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGljdGhfZmFtaWx5KTsKLSAgQ0ZYX0J5dGVTdHJpbmcgRmluZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpOworICB2b2lkIEdldEdCUHJlZmVyZW5jZShCeXRlU3RyaW5nJiBmYWNlLCBpbnQgd2VpZ2h0LCBpbnQgcGljdGhfZmFtaWx5KTsKKyAgdm9pZCBHZXRKYXBhbmVzZVByZWZlcmVuY2UoQnl0ZVN0cmluZyYgZmFjZSwgaW50IHdlaWdodCwgaW50IHBpY3RoX2ZhbWlseSk7CisgIEJ5dGVTdHJpbmcgRmluZEZvbnQoY29uc3QgQnl0ZVN0cmluZyYgbmFtZSk7CiAKICAgSERDIG1faERDOwotICBDRlhfRm9udE1hcHBlciogbV9wTWFwcGVyOwotICBDRlhfQnl0ZVN0cmluZyBtX0xhc3RGYW1pbHk7Ci0gIENGWF9CeXRlU3RyaW5nIG1fS2FpVGksIG1fRmFuZ1Nvbmc7CisgIFVub3duZWRQdHI8Q0ZYX0ZvbnRNYXBwZXI+IG1fcE1hcHBlcjsKKyAgQnl0ZVN0cmluZyBtX0xhc3RGYW1pbHk7CisgIEJ5dGVTdHJpbmcgbV9LYWlUaSwgbV9GYW5nU29uZzsKIH07CiAKIGludCBDQUxMQkFDSyBGb250RW51bVByb2MoY29uc3QgTE9HRk9OVEEqIHBsZiwKQEAgLTQyNiw4ICs0MjQsOCBAQAogCiB2b2lkIENGWF9XaW4zMkZvbnRJbmZvOjpBZGRJbnN0YWxsZWRGb250KGNvbnN0IExPR0ZPTlRBKiBwbGYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEZvbnRUeXBlKSB7Ci0gIENGWF9CeXRlU3RyaW5nIG5hbWUocGxmLT5sZkZhY2VOYW1lKTsKLSAgaWYgKG5hbWVbMF0gPT0gJ0AnKQorICBCeXRlU3RyaW5nIG5hbWUocGxmLT5sZkZhY2VOYW1lKTsKKyAgaWYgKG5hbWUuR2V0TGVuZ3RoKCkgPiAwICYmIG5hbWVbMF0gPT0gJ0AnKQogICAgIHJldHVybjsKIAogICBpZiAobmFtZSA9PSBtX0xhc3RGYW1pbHkpIHsKQEAgLTQ0Niw4ICs0NDQsOCBAQAogYm9vbCBDRlhfV2luMzJGb250SW5mbzo6RW51bUZvbnRMaXN0KENGWF9Gb250TWFwcGVyKiBwTWFwcGVyKSB7CiAgIG1fcE1hcHBlciA9IHBNYXBwZXI7CiAgIExPR0ZPTlRBIGxmOwotICBGWFNZU19tZW1zZXQoJmxmLCAwLCBzaXplb2YoTE9HRk9OVEEpKTsKLSAgbGYubGZDaGFyU2V0ID0gRlhGT05UX0RFRkFVTFRfQ0hBUlNFVDsKKyAgbWVtc2V0KCZsZiwgMCwgc2l6ZW9mKExPR0ZPTlRBKSk7CisgIGxmLmxmQ2hhclNldCA9IEZYX0NIQVJTRVRfRGVmYXVsdDsKICAgbGYubGZGYWNlTmFtZVswXSA9IDA7CiAgIGxmLmxmUGl0Y2hBbmRGYW1pbHkgPSAwOwogICBFbnVtRm9udEZhbWlsaWVzRXhBKG1faERDLCAmbGYsIChGT05URU5VTVBST0NBKUZvbnRFbnVtUHJvYywgKHVpbnRwdHJfdCkgdGhpcywKQEAgLTQ1NSw0MCArNDUzLDM4IEBACiAgIHJldHVybiB0cnVlOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDRlhfV2luMzJGb250SW5mbzo6RmluZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIG5hbWUpIHsKK0J5dGVTdHJpbmcgQ0ZYX1dpbjMyRm9udEluZm86OkZpbmRGb250KGNvbnN0IEJ5dGVTdHJpbmcmIG5hbWUpIHsKICAgaWYgKCFtX3BNYXBwZXIpCiAgICAgcmV0dXJuIG5hbWU7CiAKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3BNYXBwZXItPm1fSW5zdGFsbGVkVFRGb250cy5zaXplKCk7ICsraSkgewotICAgIENGWF9CeXRlU3RyaW5nIHRoaXNuYW1lID0gbV9wTWFwcGVyLT5tX0luc3RhbGxlZFRURm9udHNbaV07CisgICAgQnl0ZVN0cmluZyB0aGlzbmFtZSA9IG1fcE1hcHBlci0+bV9JbnN0YWxsZWRUVEZvbnRzW2ldOwogICAgIGlmICh0aGlzbmFtZS5MZWZ0KG5hbWUuR2V0TGVuZ3RoKCkpID09IG5hbWUpCiAgICAgICByZXR1cm4gbV9wTWFwcGVyLT5tX0luc3RhbGxlZFRURm9udHNbaV07CiAgIH0KICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3BNYXBwZXItPm1fTG9jYWxpemVkVFRGb250cy5zaXplKCk7ICsraSkgewotICAgIENGWF9CeXRlU3RyaW5nIHRoaXNuYW1lID0gbV9wTWFwcGVyLT5tX0xvY2FsaXplZFRURm9udHNbaV0uZmlyc3Q7CisgICAgQnl0ZVN0cmluZyB0aGlzbmFtZSA9IG1fcE1hcHBlci0+bV9Mb2NhbGl6ZWRUVEZvbnRzW2ldLmZpcnN0OwogICAgIGlmICh0aGlzbmFtZS5MZWZ0KG5hbWUuR2V0TGVuZ3RoKCkpID09IG5hbWUpCiAgICAgICByZXR1cm4gbV9wTWFwcGVyLT5tX0xvY2FsaXplZFRURm9udHNbaV0uc2Vjb25kOwogICB9Ci0gIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOworICByZXR1cm4gQnl0ZVN0cmluZygpOwogfQogCiB2b2lkKiBDRlhfV2luMzJGYWxsYmFja0ZvbnRJbmZvOjpNYXBGb250KGludCB3ZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkl0YWxpYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYXJzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIGNzdHJfZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBpRXhhY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY3N0cl9mYWNlKSB7CiAgIHZvaWQqIGZvbnQgPSBHZXRTdWJzdEZvbnQoY3N0cl9mYWNlKTsKLSAgaWYgKGZvbnQpIHsKLSAgICBpRXhhY3QgPSAxOworICBpZiAoZm9udCkKICAgICByZXR1cm4gZm9udDsKLSAgfQorCiAgIGJvb2wgYkNKSyA9IHRydWU7CiAgIHN3aXRjaCAoY2hhcnNldCkgewotICAgIGNhc2UgRlhGT05UX1NISUZUSklTX0NIQVJTRVQ6Ci0gICAgY2FzZSBGWEZPTlRfR0IyMzEyX0NIQVJTRVQ6Ci0gICAgY2FzZSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVDoKLSAgICBjYXNlIEZYRk9OVF9IQU5HVUxfQ0hBUlNFVDoKKyAgICBjYXNlIEZYX0NIQVJTRVRfU2hpZnRKSVM6CisgICAgY2FzZSBGWF9DSEFSU0VUX0NoaW5lc2VTaW1wbGlmaWVkOgorICAgIGNhc2UgRlhfQ0hBUlNFVF9DaGluZXNlVHJhZGl0aW9uYWw6CisgICAgY2FzZSBGWF9DSEFSU0VUX0hhbmd1bDoKICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICBiQ0pLID0gZmFsc2U7CkBAIC00OTcsMTAgKzQ5MywxMCBAQAogICByZXR1cm4gRmluZEZvbnQod2VpZ2h0LCBiSXRhbGljLCBjaGFyc2V0LCBwaXRjaF9mYW1pbHksIGNzdHJfZmFjZSwgIWJDSkspOwogfQogCi12b2lkIENGWF9XaW4zMkZvbnRJbmZvOjpHZXRHQlByZWZlcmVuY2UoQ0ZYX0J5dGVTdHJpbmcmIGZhY2UsCit2b2lkIENGWF9XaW4zMkZvbnRJbmZvOjpHZXRHQlByZWZlcmVuY2UoQnl0ZVN0cmluZyYgZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaWN0aF9mYW1pbHkpIHsKLSAgaWYgKGZhY2UuRmluZCgiS2FpVGkiKSA+PSAwIHx8IGZhY2UuRmluZCgiXHhiZlx4YWMiKSA+PSAwKSB7CisgIGlmIChmYWNlLkNvbnRhaW5zKCJLYWlUaSIpIHx8IGZhY2UuQ29udGFpbnMoIlx4YmZceGFjIikpIHsKICAgICBpZiAobV9LYWlUaS5Jc0VtcHR5KCkpIHsKICAgICAgIG1fS2FpVGkgPSBGaW5kRm9udCgiS2FpVGkiKTsKICAgICAgIGlmIChtX0thaVRpLklzRW1wdHkoKSkgewpAQCAtNTA4LDcgKzUwNCw3IEBACiAgICAgICB9CiAgICAgfQogICAgIGZhY2UgPSBtX0thaVRpOwotICB9IGVsc2UgaWYgKGZhY2UuRmluZCgiRmFuZ1NvbmciKSA+PSAwIHx8IGZhY2UuRmluZCgiXHhiN1x4YzJceGNiXHhjZSIpID49IDApIHsKKyAgfSBlbHNlIGlmIChmYWNlLkNvbnRhaW5zKCJGYW5nU29uZyIpIHx8IGZhY2UuQ29udGFpbnMoIlx4YjdceGMyXHhjYlx4Y2UiKSkgewogICAgIGlmIChtX0ZhbmdTb25nLklzRW1wdHkoKSkgewogICAgICAgbV9GYW5nU29uZyA9IEZpbmRGb250KCJGYW5nU29uZyIpOwogICAgICAgaWYgKG1fRmFuZ1NvbmcuSXNFbXB0eSgpKSB7CkBAIC01MTYsOSArNTEyLDkgQEAKICAgICAgIH0KICAgICB9CiAgICAgZmFjZSA9IG1fRmFuZ1Nvbmc7Ci0gIH0gZWxzZSBpZiAoZmFjZS5GaW5kKCJTaW1TdW4iKSA+PSAwIHx8IGZhY2UuRmluZCgiXHhjYlx4Y2UiKSA+PSAwKSB7CisgIH0gZWxzZSBpZiAoZmFjZS5Db250YWlucygiU2ltU3VuIikgfHwgZmFjZS5Db250YWlucygiXHhjYlx4Y2UiKSkgewogICAgIGZhY2UgPSAiU2ltU3VuIjsKLSAgfSBlbHNlIGlmIChmYWNlLkZpbmQoIlNpbUhlaSIpID49IDAgfHwgZmFjZS5GaW5kKCJceGJhXHhkYSIpID49IDApIHsKKyAgfSBlbHNlIGlmIChmYWNlLkNvbnRhaW5zKCJTaW1IZWkiKSB8fCBmYWNlLkNvbnRhaW5zKCJceGJhXHhkYSIpKSB7CiAgICAgZmFjZSA9ICJTaW1IZWkiOwogICB9IGVsc2UgaWYgKCEocGljdGhfZmFtaWx5ICYgRkZfUk9NQU4pICYmIHdlaWdodCA+IDU1MCkgewogICAgIGZhY2UgPSAiU2ltSGVpIjsKQEAgLTUyNywxOCArNTIzLDE4IEBACiAgIH0KIH0KIAotdm9pZCBDRlhfV2luMzJGb250SW5mbzo6R2V0SmFwYW5lc2VQcmVmZXJlbmNlKENGWF9CeXRlU3RyaW5nJiBmYWNlLAordm9pZCBDRlhfV2luMzJGb250SW5mbzo6R2V0SmFwYW5lc2VQcmVmZXJlbmNlKEJ5dGVTdHJpbmcmIGZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGljdGhfZmFtaWx5KSB7Ci0gIGlmIChmYWNlLkZpbmQoIkdvdGhpYyIpID49IDAgfHwKLSAgICAgIGZhY2UuRmluZCgiXHg4M1x4NTNceDgzXHg1Nlx4ODNceDYyXHg4M1x4NGUiKSA+PSAwKSB7Ci0gICAgaWYgKGZhY2UuRmluZCgiUEdvdGhpYyIpID49IDAgfHwKLSAgICAgICAgZmFjZS5GaW5kKCJceDgyXHg2Zlx4ODNceDUzXHg4M1x4NTZceDgzXHg2Mlx4ODNceDRlIikgPj0gMCkgeworICBpZiAoZmFjZS5Db250YWlucygiR290aGljIikgfHwKKyAgICAgIGZhY2UuQ29udGFpbnMoIlx4ODNceDUzXHg4M1x4NTZceDgzXHg2Mlx4ODNceDRlIikpIHsKKyAgICBpZiAoZmFjZS5Db250YWlucygiUEdvdGhpYyIpIHx8CisgICAgICAgIGZhY2UuQ29udGFpbnMoIlx4ODJceDZmXHg4M1x4NTNceDgzXHg1Nlx4ODNceDYyXHg4M1x4NGUiKSkgewogICAgICAgZmFjZSA9ICJNUyBQR290aGljIjsKLSAgICB9IGVsc2UgaWYgKGZhY2UuRmluZCgiVUkgR290aGljIikgPj0gMCkgeworICAgIH0gZWxzZSBpZiAoZmFjZS5Db250YWlucygiVUkgR290aGljIikpIHsKICAgICAgIGZhY2UgPSAiTVMgVUkgR290aGljIjsKICAgICB9IGVsc2UgewotICAgICAgaWYgKGZhY2UuRmluZCgiSEdTR290aGljTSIpID49IDAgfHwgZmFjZS5GaW5kKCJIR01hcnVHb3RoaWNNUFJPIikgPj0gMCkgeworICAgICAgaWYgKGZhY2UuQ29udGFpbnMoIkhHU0dvdGhpY00iKSB8fCBmYWNlLkNvbnRhaW5zKCJIR01hcnVHb3RoaWNNUFJPIikpIHsKICAgICAgICAgZmFjZSA9ICJNUyBQR290aGljIjsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGZhY2UgPSAiTVMgR290aGljIjsKQEAgLTU0Niw5ICs1NDIsOCBAQAogICAgIH0KICAgICByZXR1cm47CiAgIH0KLSAgaWYgKGZhY2UuRmluZCgiTWluY2hvIikgPj0gMCB8fCBmYWNlLkZpbmQoIlx4OTZceGJlXHg5Mlx4YTkiKSA+PSAwKSB7Ci0gICAgaWYgKGZhY2UuRmluZCgiUE1pbmNobyIpID49IDAgfHwKLSAgICAgICAgZmFjZS5GaW5kKCJceDgyXHg2Zlx4OTZceGJlXHg5Mlx4YTkiKSA+PSAwKSB7CisgIGlmIChmYWNlLkNvbnRhaW5zKCJNaW5jaG8iKSB8fCBmYWNlLkNvbnRhaW5zKCJceDk2XHhiZVx4OTJceGE5IikpIHsKKyAgICBpZiAoZmFjZS5Db250YWlucygiUE1pbmNobyIpIHx8IGZhY2UuQ29udGFpbnMoIlx4ODJceDZmXHg5Nlx4YmVceDkyXHhhOSIpKSB7CiAgICAgICBmYWNlID0gIk1TIFBNaW5jaG8iOwogICAgIH0gZWxzZSB7CiAgICAgICBmYWNlID0gIk1TIE1pbmNobyI7CkBAIC01NjksMjkgKzU2NCwyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXRhbGljLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYXJzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl0Y2hfZmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogY3N0cl9mYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBpRXhhY3QpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgZmFjZSA9IGNzdHJfZmFjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNzdHJfZmFjZSkgeworICBCeXRlU3RyaW5nIGZhY2UgPSBjc3RyX2ZhY2U7CiAgIGludCBpQmFzZUZvbnQ7Ci0gIGZvciAoaUJhc2VGb250ID0gMDsgaUJhc2VGb250IDwgMTI7IGlCYXNlRm9udCsrKQotICAgIGlmIChmYWNlID09IENGWF9CeXRlU3RyaW5nQyhnX0Jhc2UxNFN1YnN0c1tpQmFzZUZvbnRdLm1fcE5hbWUpKSB7CisgIGZvciAoaUJhc2VGb250ID0gMDsgaUJhc2VGb250IDwgMTI7IGlCYXNlRm9udCsrKSB7CisgICAgaWYgKGZhY2UgPT0gQnl0ZVN0cmluZ1ZpZXcoZ19CYXNlMTRTdWJzdHNbaUJhc2VGb250XS5tX3BOYW1lKSkgewogICAgICAgZmFjZSA9IGdfQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9wV2luTmFtZTsKICAgICAgIHdlaWdodCA9IGdfQmFzZTE0U3Vic3RzW2lCYXNlRm9udF0ubV9iQm9sZCA/IEZXX0JPTEQgOiBGV19OT1JNQUw7CiAgICAgICBiSXRhbGljID0gZ19CYXNlMTRTdWJzdHNbaUJhc2VGb250XS5tX2JJdGFsaWM7Ci0gICAgICBpRXhhY3QgPSB0cnVlOwogICAgICAgYnJlYWs7CiAgICAgfQotICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfQU5TSV9DSEFSU0VUIHx8IGNoYXJzZXQgPT0gRlhGT05UX1NZTUJPTF9DSEFSU0VUKSB7Ci0gICAgY2hhcnNldCA9IEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQ7CiAgIH0KKyAgaWYgKGNoYXJzZXQgPT0gRlhfQ0hBUlNFVF9BTlNJIHx8IGNoYXJzZXQgPT0gRlhfQ0hBUlNFVF9TeW1ib2wpCisgICAgY2hhcnNldCA9IEZYX0NIQVJTRVRfRGVmYXVsdDsKKwogICBpbnQgc3Vic3RfcGl0Y2hfZmFtaWx5ID0gcGl0Y2hfZmFtaWx5OwogICBzd2l0Y2ggKGNoYXJzZXQpIHsKLSAgICBjYXNlIEZYRk9OVF9TSElGVEpJU19DSEFSU0VUOgorICAgIGNhc2UgRlhfQ0hBUlNFVF9TaGlmdEpJUzoKICAgICAgIHN1YnN0X3BpdGNoX2ZhbWlseSA9IEZGX1JPTUFOOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVDoKLSAgICBjYXNlIEZYRk9OVF9IQU5HVUxfQ0hBUlNFVDoKLSAgICBjYXNlIEZYRk9OVF9HQjIzMTJfQ0hBUlNFVDoKKyAgICBjYXNlIEZYX0NIQVJTRVRfQ2hpbmVzZVRyYWRpdGlvbmFsOgorICAgIGNhc2UgRlhfQ0hBUlNFVF9IYW5ndWw6CisgICAgY2FzZSBGWF9DSEFSU0VUX0NoaW5lc2VTaW1wbGlmaWVkOgogICAgICAgc3Vic3RfcGl0Y2hfZmFtaWx5ID0gMDsKICAgICAgIGJyZWFrOwogICB9CkBAIC02MDUsMzQgKzU5OSwzNCBAQAogICBpZiAoZmFjZS5FcXVhbE5vQ2FzZShmYWNlYnVmKSkKICAgICByZXR1cm4gaEZvbnQ7CiAKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NGYWNlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChmYWNlYnVmKTsKKyAgV2lkZVN0cmluZyB3c0ZhY2UgPSBXaWRlU3RyaW5nOjpGcm9tTG9jYWwoZmFjZWJ1Zik7CiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGdfVmFyaWFudE5hbWVzKTsgKytpKSB7CiAgICAgaWYgKGZhY2UgIT0gZ19WYXJpYW50TmFtZXNbaV0ubV9wRmFjZU5hbWUpCiAgICAgICBjb250aW51ZTsKIAogICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0KiBwTmFtZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgc2hvcnQqPigKICAgICAgICAgZ19WYXJpYW50TmFtZXNbaV0ubV9wVmFyaWFudE5hbWUpOwotICAgIEZYX1NUUlNJWkUgbGVuID0gQ0ZYX1dpZGVTdHJpbmc6OldTdHJpbmdMZW5ndGgocE5hbWUpOwotICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGMTZMRShwTmFtZSwgbGVuKTsKKyAgICBzaXplX3QgbGVuID0gV2lkZVN0cmluZzo6V1N0cmluZ0xlbmd0aChwTmFtZSk7CisgICAgV2lkZVN0cmluZyB3c05hbWUgPSBXaWRlU3RyaW5nOjpGcm9tVVRGMTZMRShwTmFtZSwgbGVuKTsKICAgICBpZiAod3NGYWNlID09IHdzTmFtZSkKICAgICAgIHJldHVybiBoRm9udDsKICAgfQogICA6OkRlbGV0ZU9iamVjdChoRm9udCk7Ci0gIGlmIChjaGFyc2V0ID09IEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQpCisgIGlmIChjaGFyc2V0ID09IEZYX0NIQVJTRVRfRGVmYXVsdCkKICAgICByZXR1cm4gbnVsbHB0cjsKIAogICBzd2l0Y2ggKGNoYXJzZXQpIHsKLSAgICBjYXNlIEZYRk9OVF9TSElGVEpJU19DSEFSU0VUOgorICAgIGNhc2UgRlhfQ0hBUlNFVF9TaGlmdEpJUzoKICAgICAgIEdldEphcGFuZXNlUHJlZmVyZW5jZShmYWNlLCB3ZWlnaHQsIHBpdGNoX2ZhbWlseSk7CiAgICAgICBicmVhazsKLSAgICBjYXNlIEZYRk9OVF9HQjIzMTJfQ0hBUlNFVDoKKyAgICBjYXNlIEZYX0NIQVJTRVRfQ2hpbmVzZVNpbXBsaWZpZWQ6CiAgICAgICBHZXRHQlByZWZlcmVuY2UoZmFjZSwgd2VpZ2h0LCBwaXRjaF9mYW1pbHkpOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWEZPTlRfSEFOR1VMX0NIQVJTRVQ6CisgICAgY2FzZSBGWF9DSEFSU0VUX0hhbmd1bDoKICAgICAgIGZhY2UgPSAiR3VsaW0iOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVDoKLSAgICAgIGlmIChmYWNlLkZpbmQoIk1TdW5nIikgPj0gMCkgeworICAgIGNhc2UgRlhfQ0hBUlNFVF9DaGluZXNlVHJhZGl0aW9uYWw6CisgICAgICBpZiAoZmFjZS5Db250YWlucygiTVN1bmciKSkgewogICAgICAgICBmYWNlID0gIk1pbmdMaVUiOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgZmFjZSA9ICJQTWluZ0xpVSI7CkBAIC02NjMsNyArNjU3LDcgQEAKICAgcmV0dXJuIHNpemU7CiB9CiAKLWJvb2wgQ0ZYX1dpbjMyRm9udEluZm86OkdldEZhY2VOYW1lKHZvaWQqIGhGb250LCBDRlhfQnl0ZVN0cmluZyYgbmFtZSkgeworYm9vbCBDRlhfV2luMzJGb250SW5mbzo6R2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIEJ5dGVTdHJpbmcqIG5hbWUpIHsKICAgY2hhciBmYWNlYnVmWzEwMF07CiAgIEhGT05UIGhPbGRGb250ID0gKEhGT05UKTo6U2VsZWN0T2JqZWN0KG1faERDLCAoSEZPTlQpaEZvbnQpOwogICBpbnQgcmV0ID0gOjpHZXRUZXh0RmFjZUEobV9oREMsIDEwMCwgZmFjZWJ1Zik7CkBAIC02NzEsMjIgKzY2NSwyMiBAQAogICBpZiAocmV0ID09IDApIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLSAgbmFtZSA9IGZhY2VidWY7CisgICpuYW1lID0gZmFjZWJ1ZjsKICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQ0ZYX1dpbjMyRm9udEluZm86OkdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQmIGNoYXJzZXQpIHsKK2Jvb2wgQ0ZYX1dpbjMyRm9udEluZm86OkdldEZvbnRDaGFyc2V0KHZvaWQqIGhGb250LCBpbnQqIGNoYXJzZXQpIHsKICAgVEVYVE1FVFJJQyB0bTsKICAgSEZPTlQgaE9sZEZvbnQgPSAoSEZPTlQpOjpTZWxlY3RPYmplY3QobV9oREMsIChIRk9OVCloRm9udCk7CiAgIDo6R2V0VGV4dE1ldHJpY3MobV9oREMsICZ0bSk7CiAgIDo6U2VsZWN0T2JqZWN0KG1faERDLCBoT2xkRm9udCk7Ci0gIGNoYXJzZXQgPSB0bS50bUNoYXJTZXQ7CisgICpjaGFyc2V0ID0gdG0udG1DaGFyU2V0OwogICByZXR1cm4gdHJ1ZTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCiAKLWludCBnX3BkZml1bV9wcmludF9wb3N0c2NyaXB0X2xldmVsID0gMDsKK2ludCBnX3BkZml1bV9wcmludF9tb2RlID0gV2luZG93c1ByaW50TW9kZTo6a01vZGVFbWY7CiAKIHN0ZDo6dW5pcXVlX3B0cjxJRlhfU3lzdGVtRm9udEluZm8+IElGWF9TeXN0ZW1Gb250SW5mbzo6Q3JlYXRlRGVmYXVsdCgKICAgICBjb25zdCBjaGFyKiogcFVudXNlZCkgewpAQCAtNzAwLDkgKzY5NCw5IEBACiAgIENIQVIgd2luZG93c19wYXRoW01BWF9QQVRIXSA9IHt9OwogICBEV09SRCBwYXRoX2xlbiA9IDo6R2V0V2luZG93c0RpcmVjdG9yeUEod2luZG93c19wYXRoLCBNQVhfUEFUSCk7CiAgIGlmIChwYXRoX2xlbiA+IDAgJiYgcGF0aF9sZW4gPCBNQVhfUEFUSCkgewotICAgIENGWF9CeXRlU3RyaW5nIGZvbnRzX3BhdGgod2luZG93c19wYXRoKTsKKyAgICBCeXRlU3RyaW5nIGZvbnRzX3BhdGgod2luZG93c19wYXRoKTsKICAgICBmb250c19wYXRoICs9ICJcXEZvbnRzIjsKLSAgICBwSW5mb0ZhbGxiYWNrLT5BZGRQYXRoKGZvbnRzX3BhdGguQXNTdHJpbmdDKCkpOworICAgIHBJbmZvRmFsbGJhY2stPkFkZFBhdGgoZm9udHNfcGF0aCk7CiAgIH0KICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxJRlhfU3lzdGVtRm9udEluZm8+KHBJbmZvRmFsbGJhY2spOwogfQpAQCAtNzgyLDEyICs3NzYsMTIgQEAKICAgICBTYXZlREMobV9oREMpOwogfQogCi1ib29sIENHZGlEZXZpY2VEcml2ZXI6OkdESV9TZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwMSwKK2Jvb2wgQ0dkaURldmljZURyaXZlcjo6R0RJX1NldERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCkgewogICBpZiAobV9EZXZpY2VDbGFzcyA9PSBGWERDX1BSSU5URVIpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBwQml0bWFwID0gcEJpdG1hcDEtPkZsaXBJbWFnZShmYWxzZSwgdHJ1ZSk7CisgICAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcEJpdG1hcCA9IHBCaXRtYXAxLT5GbGlwSW1hZ2UoZmFsc2UsIHRydWUpOwogICAgIGlmICghcEJpdG1hcCkKICAgICAgIHJldHVybiBmYWxzZTsKIApAQCAtNzk2LDcgKzc5MCw3IEBACiAKICAgICBpbnQgd2lkdGggPSBwU3JjUmVjdC0+V2lkdGgoKSwgaGVpZ2h0ID0gcFNyY1JlY3QtPkhlaWdodCgpOwogICAgIExQQllURSBwQnVmZmVyID0gcEJpdG1hcC0+R2V0QnVmZmVyKCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgaW5mbyA9IENGWF9XaW5kb3dzRElCOjpHZXRCaXRtYXBJbmZvKHBCaXRtYXAuZ2V0KCkpOworICAgIEJ5dGVTdHJpbmcgaW5mbyA9IENGWF9XaW5kb3dzRElCOjpHZXRCaXRtYXBJbmZvKHBCaXRtYXApOwogICAgICgoQklUTUFQSU5GT0hFQURFUiopaW5mby5jX3N0cigpKS0+YmlIZWlnaHQgKj0gLTE7CiAgICAgRlhfUkVDVCBkc3RfcmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKICAgICBkc3RfcmVjdC5JbnRlcnNlY3QoMCwgMCwgcEJpdG1hcC0+R2V0V2lkdGgoKSwgcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOwpAQCAtODA2LDE1ICs4MDAsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgZHN0X2hlaWdodCwgcEJ1ZmZlciwgKEJJVE1BUElORk8qKWluZm8uY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgRElCX1JHQl9DT0xPUlMsIFNSQ0NPUFkpOwogICB9IGVsc2UgewotICAgIENGWF9NYXliZU93bmVkPENGWF9ESUJpdG1hcD4gcEJpdG1hcChwQml0bWFwMSk7CisgICAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcEJpdG1hcCA9IHBCaXRtYXAxOwogICAgIGlmIChwQml0bWFwLT5Jc0NteWtJbWFnZSgpKSB7Ci0gICAgICBwQml0bWFwID0gcEJpdG1hcC0+Q2xvbmVDb252ZXJ0KEZYRElCX1JnYikucmVsZWFzZSgpOworICAgICAgcEJpdG1hcCA9IHBCaXRtYXAtPkNsb25lQ29udmVydChGWERJQl9SZ2IpOwogICAgICAgaWYgKCFwQml0bWFwKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGludCB3aWR0aCA9IHBTcmNSZWN0LT5XaWR0aCgpLCBoZWlnaHQgPSBwU3JjUmVjdC0+SGVpZ2h0KCk7CiAgICAgTFBCWVRFIHBCdWZmZXIgPSBwQml0bWFwLT5HZXRCdWZmZXIoKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBpbmZvID0gQ0ZYX1dpbmRvd3NESUI6OkdldEJpdG1hcEluZm8ocEJpdG1hcC5HZXQoKSk7CisgICAgQnl0ZVN0cmluZyBpbmZvID0gQ0ZYX1dpbmRvd3NESUI6OkdldEJpdG1hcEluZm8ocEJpdG1hcCk7CiAgICAgOjpTZXRESUJpdHNUb0RldmljZShtX2hEQywgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0LCBwU3JjUmVjdC0+bGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldEhlaWdodCgpIC0gcFNyY1JlY3QtPmJvdHRvbSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldEhlaWdodCgpLCBwQnVmZmVyLApAQCAtODIzLDIwICs4MTcsMjEgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQ0dkaURldmljZURyaXZlcjo6R0RJX1N0cmV0Y2hESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncykgewotICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBwQml0bWFwMTsKK2Jvb2wgQ0dkaURldmljZURyaXZlcjo6R0RJX1N0cmV0Y2hESUJpdHMoCisgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBCaXRtYXAxLAorICAgIGludCBkZXN0X2xlZnQsCisgICAgaW50IGRlc3RfdG9wLAorICAgIGludCBkZXN0X3dpZHRoLAorICAgIGludCBkZXN0X2hlaWdodCwKKyAgICB1aW50MzJfdCBmbGFncykgeworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwQml0bWFwID0gcEJpdG1hcDE7CiAgIGlmICghcEJpdG1hcCB8fCBkZXN0X3dpZHRoID09IDAgfHwgZGVzdF9oZWlnaHQgPT0gMCkKICAgICByZXR1cm4gZmFsc2U7CiAKICAgaWYgKHBCaXRtYXAtPklzQ215a0ltYWdlKCkgJiYgIXBCaXRtYXAtPkNvbnZlcnRGb3JtYXQoRlhESUJfUmdiKSkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgaW5mbyA9IENGWF9XaW5kb3dzRElCOjpHZXRCaXRtYXBJbmZvKHBCaXRtYXApOworICBCeXRlU3RyaW5nIGluZm8gPSBDRlhfV2luZG93c0RJQjo6R2V0Qml0bWFwSW5mbyhwQml0bWFwKTsKICAgaWYgKChpbnQ2NF90KWFicyhkZXN0X3dpZHRoKSAqIGFicyhkZXN0X2hlaWdodCkgPAogICAgICAgICAgIChpbnQ2NF90KXBCaXRtYXAxLT5HZXRXaWR0aCgpICogcEJpdG1hcDEtPkdldEhlaWdodCgpICogNCB8fAogICAgICAgKGZsYWdzICYgRlhESUJfSU5URVJQT0wpIHx8IChmbGFncyAmIEZYRElCX0JJQ1VCSUNfSU5URVJQT0wpKSB7CkBAIC04NDQsMTQgKzgzOSwxNCBAQAogICB9IGVsc2UgewogICAgIFNldFN0cmV0Y2hCbHRNb2RlKG1faERDLCBDT0xPUk9OQ09MT1IpOwogICB9Ci0gIENGWF9NYXliZU93bmVkPENGWF9ESUJpdG1hcD4gcFRvU3RyZWNoQml0bWFwKHBCaXRtYXApOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwVG9TdHJlY2hCaXRtYXAgPSBwQml0bWFwOwogICBpZiAobV9EZXZpY2VDbGFzcyA9PSBGWERDX1BSSU5URVIgJiYKICAgICAgICgoaW50NjRfdClwQml0bWFwLT5HZXRXaWR0aCgpICogcEJpdG1hcC0+R2V0SGVpZ2h0KCkgPgogICAgICAgIChpbnQ2NF90KWFicyhkZXN0X3dpZHRoKSAqIGFicyhkZXN0X2hlaWdodCkpKSB7Ci0gICAgcFRvU3RyZWNoQml0bWFwID0gcEJpdG1hcC0+U3RyZXRjaFRvKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0KTsKKyAgICBwVG9TdHJlY2hCaXRtYXAgPSBwQml0bWFwLT5TdHJldGNoVG8oZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIDAsIG51bGxwdHIpOwogICB9Ci0gIENGWF9CeXRlU3RyaW5nIHRvU3RyZWNoQml0bWFwSW5mbyA9Ci0gICAgICBDRlhfV2luZG93c0RJQjo6R2V0Qml0bWFwSW5mbyhwVG9TdHJlY2hCaXRtYXAuR2V0KCkpOworICBCeXRlU3RyaW5nIHRvU3RyZWNoQml0bWFwSW5mbyA9CisgICAgICBDRlhfV2luZG93c0RJQjo6R2V0Qml0bWFwSW5mbyhwVG9TdHJlY2hCaXRtYXApOwogICA6OlN0cmV0Y2hESUJpdHMobV9oREMsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCAwLCAwLAogICAgICAgICAgICAgICAgICAgcFRvU3RyZWNoQml0bWFwLT5HZXRXaWR0aCgpLCBwVG9TdHJlY2hCaXRtYXAtPkdldEhlaWdodCgpLAogICAgICAgICAgICAgICAgICAgcFRvU3RyZWNoQml0bWFwLT5HZXRCdWZmZXIoKSwKQEAgLTg2MCwxNCArODU1LDE1IEBACiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENHZGlEZXZpY2VEcml2ZXI6OkdESV9TdHJldGNoQml0TWFzayhDRlhfRElCaXRtYXAqIHBCaXRtYXAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYml0bWFwX2NvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKLSAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gcEJpdG1hcDE7Citib29sIENHZGlEZXZpY2VEcml2ZXI6OkdESV9TdHJldGNoQml0TWFzaygKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcDEsCisgICAgaW50IGRlc3RfbGVmdCwKKyAgICBpbnQgZGVzdF90b3AsCisgICAgaW50IGRlc3Rfd2lkdGgsCisgICAgaW50IGRlc3RfaGVpZ2h0LAorICAgIHVpbnQzMl90IGJpdG1hcF9jb2xvciwKKyAgICB1aW50MzJfdCBmbGFncykgeworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwQml0bWFwID0gcEJpdG1hcDE7CiAgIGlmICghcEJpdG1hcCB8fCBkZXN0X3dpZHRoID09IDAgfHwgZGVzdF9oZWlnaHQgPT0gMCkKICAgICByZXR1cm4gZmFsc2U7CiAKQEAgLTg3Niw3ICs4NzIsNyBAQAogICAgIEJJVE1BUElORk9IRUFERVIgYm1pSGVhZGVyOwogICAgIHVpbnQzMl90IGJtaUNvbG9yc1syXTsKICAgfSBibWk7Ci0gIEZYU1lTX21lbXNldCgmYm1pLmJtaUhlYWRlciwgMCwgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKTsKKyAgbWVtc2V0KCZibWkuYm1pSGVhZGVyLCAwLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpOwogICBibWkuYm1pSGVhZGVyLmJpU2l6ZSA9IHNpemVvZihCSVRNQVBJTkZPSEVBREVSKTsKICAgYm1pLmJtaUhlYWRlci5iaUJpdENvdW50ID0gMTsKICAgYm1pLmJtaUhlYWRlci5iaUNvbXByZXNzaW9uID0gQklfUkdCOwpAQCAtOTI0LDE0ICs5MjAsNyBAQAogICByZXR1cm4gISEoOjpHZXRDbGlwQm94KG1faERDLCAoUkVDVCopcFJlY3QpKTsKIH0KIAotdm9pZCogQ0dkaURldmljZURyaXZlcjo6R2V0UGxhdGZvcm1TdXJmYWNlKCkgY29uc3QgewotICByZXR1cm4gKHZvaWQqKW1faERDOwotfQotCi12b2lkIENHZGlEZXZpY2VEcml2ZXI6OkRyYXdMaW5lKEZYX0ZMT0FUIHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkyKSB7Cit2b2lkIENHZGlEZXZpY2VEcml2ZXI6OkRyYXdMaW5lKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyKSB7CiAgIGlmICghbV9iTWV0YWZpbGVEQ1R5cGUpIHsgIC8vIEVNRiBkcmF3aW5nIGlzIG5vdCBib3VuZCB0byB0aGUgREMuCiAgICAgaW50IHN0YXJ0T3V0T2ZCb3VuZHNGbGFnID0gKHgxIDwgMCkgfCAoKHgxID4gbV9XaWR0aCkgPDwgMSkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeTEgPCAwKSA8PCAyKSB8ICgoeTEgPiBtX0hlaWdodCkgPDwgMyk7CkBAIC05NDEsMTggKzkzMCwxOCBAQAogICAgICAgcmV0dXJuOwogCiAgICAgaWYgKHN0YXJ0T3V0T2ZCb3VuZHNGbGFnIHx8IGVuZE91dE9mQm91bmRzRmxhZykgewotICAgICAgRlhfRkxPQVQgeFsyXTsKLSAgICAgIEZYX0ZMT0FUIHlbMl07CisgICAgICBmbG9hdCB4WzJdOworICAgICAgZmxvYXQgeVsyXTsKICAgICAgIGludCBucDsKICNpZmRlZiBfU0tJQV9TVVBQT1JUXwogICAgICAgLy8gVE9ETyhjYXJ5Y2xhcmspIHRlbXBvcmFyeSByZXBsYWNlbWVudCBvZiBhbnRpZ3JhaW4gaW4gbGluZSBmdW5jdGlvbgogICAgICAgLy8gdG8gcGVybWl0IHJlbW92aW5nIGFudGlncmFpbiBhbHRvZ2V0aGVyCi0gICAgICByZWN0X2Jhc2UgcmVjdCA9IHswLjBmLCAwLjBmLCAoRlhfRkxPQVQpKG1fV2lkdGgpLCAoRlhfRkxPQVQpKG1fSGVpZ2h0KX07CisgICAgICByZWN0X2Jhc2UgcmVjdCA9IHswLjBmLCAwLjBmLCAoZmxvYXQpKG1fV2lkdGgpLCAoZmxvYXQpKG1fSGVpZ2h0KX07CiAgICAgICBucCA9IGNsaXBfbGlhbmdfYmFyc2t5KHgxLCB5MSwgeDIsIHkyLCByZWN0LCB4LCB5KTsKICNlbHNlCi0gICAgICBhZ2c6OnJlY3RfYmFzZTxGWF9GTE9BVD4gcmVjdCgwLjBmLCAwLjBmLCAoRlhfRkxPQVQpKG1fV2lkdGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShtX0hlaWdodCkpOwotICAgICAgbnAgPSBhZ2c6OmNsaXBfbGlhbmdfYmFyc2t5PEZYX0ZMT0FUPih4MSwgeTEsIHgyLCB5MiwgcmVjdCwgeCwgeSk7CisgICAgICBhZ2c6OnJlY3RfYmFzZTxmbG9hdD4gcmVjdCgwLjBmLCAwLjBmLCAoZmxvYXQpKG1fV2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KShtX0hlaWdodCkpOworICAgICAgbnAgPSBhZ2c6OmNsaXBfbGlhbmdfYmFyc2t5PGZsb2F0Pih4MSwgeTEsIHgyLCB5MiwgcmVjdCwgeCwgeSk7CiAjZW5kaWYKICAgICAgIGlmIChucCA9PSAwKQogICAgICAgICByZXR1cm47CkBAIC05OTAsMTggKzk3OSwxOCBAQAogICAgICAgIXBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LklzQXZhaWxhYmxlKCkpIHsKICAgICBDRlhfRmxvYXRSZWN0IGJib3hfZiA9IHBQYXRoRGF0YS0+R2V0Qm91bmRpbmdCb3goKTsKICAgICBpZiAocE1hdHJpeCkKLSAgICAgIHBNYXRyaXgtPlRyYW5zZm9ybVJlY3QoYmJveF9mKTsKKyAgICAgIGJib3hfZiA9IHBNYXRyaXgtPlRyYW5zZm9ybVJlY3QoYmJveF9mKTsKIAogICAgIEZYX1JFQ1QgYmJveCA9IGJib3hfZi5HZXRJbm5lclJlY3QoKTsKICAgICBpZiAoYmJveC5XaWR0aCgpIDw9IDApIHsKLSAgICAgIHJldHVybiBEcmF3Q29zbWV0aWNMaW5lKAotICAgICAgICAgIChGWF9GTE9BVCkoYmJveC5sZWZ0KSwgKEZYX0ZMT0FUKShiYm94LnRvcCksIChGWF9GTE9BVCkoYmJveC5sZWZ0KSwKLSAgICAgICAgICAoRlhfRkxPQVQpKGJib3guYm90dG9tICsgMSksIGZpbGxfY29sb3IsIEZYRElCX0JMRU5EX05PUk1BTCk7CisgICAgICByZXR1cm4gRHJhd0Nvc21ldGljTGluZShDRlhfUG9pbnRGKGJib3gubGVmdCwgYmJveC50b3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RihiYm94LmxlZnQsIGJib3guYm90dG9tICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsX2NvbG9yLCBGWERJQl9CTEVORF9OT1JNQUwpOwogICAgIH0KICAgICBpZiAoYmJveC5IZWlnaHQoKSA8PSAwKSB7Ci0gICAgICByZXR1cm4gRHJhd0Nvc21ldGljTGluZSgoRlhfRkxPQVQpKGJib3gubGVmdCksIChGWF9GTE9BVCkoYmJveC50b3ApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShiYm94LnJpZ2h0ICsgMSksIChGWF9GTE9BVCkoYmJveC50b3ApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbF9jb2xvciwgRlhESUJfQkxFTkRfTk9STUFMKTsKKyAgICAgIHJldHVybiBEcmF3Q29zbWV0aWNMaW5lKENGWF9Qb2ludEYoYmJveC5sZWZ0LCBiYm94LnRvcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGKGJib3gucmlnaHQgKyAxLCBiYm94LnRvcCksIGZpbGxfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9CTEVORF9OT1JNQUwpOwogICAgIH0KICAgfQogICBpbnQgZmlsbF9hbHBoYSA9IEZYQVJHQl9BKGZpbGxfY29sb3IpOwpAQCAtMTA4OCw3ICsxMDc3LDcgQEAKIAogICBpbnQgYWxwaGE7CiAgIEZYX0NPTE9SUkVGIHJnYjsKLSAgQXJnYkRlY29kZShmaWxsX2NvbG9yLCBhbHBoYSwgcmdiKTsKKyAgc3RkOjp0aWUoYWxwaGEsIHJnYikgPSBBcmdiVG9Db2xvclJlZihmaWxsX2NvbG9yKTsKICAgaWYgKGFscGhhID09IDApCiAgICAgcmV0dXJuIHRydWU7CiAKQEAgLTExMzMsMTAgKzExMjIsOCBAQAogICByZXR1cm4gcmV0OwogfQogCi1ib29sIENHZGlEZXZpY2VEcml2ZXI6OkRyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTIsCitib29sIENHZGlEZXZpY2VEcml2ZXI6OkRyYXdDb3NtZXRpY0xpbmUoY29uc3QgQ0ZYX1BvaW50RiYgcHRNb3ZlVG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHRMaW5lVG8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIHsKICAgaWYgKGJsZW5kX3R5cGUgIT0gRlhESUJfQkxFTkRfTk9STUFMKQpAQCAtMTE0NCwxNCArMTEzMSwxNCBAQAogCiAgIGludCBhOwogICBGWF9DT0xPUlJFRiByZ2I7Ci0gIEFyZ2JEZWNvZGUoY29sb3IsIGEsIHJnYik7CisgIHN0ZDo6dGllKGEsIHJnYikgPSBBcmdiVG9Db2xvclJlZihjb2xvcik7CiAgIGlmIChhID09IDApCiAgICAgcmV0dXJuIHRydWU7CiAKICAgSFBFTiBoUGVuID0gQ3JlYXRlUGVuKFBTX1NPTElELCAxLCByZ2IpOwogICBoUGVuID0gKEhQRU4pU2VsZWN0T2JqZWN0KG1faERDLCBoUGVuKTsKLSAgTW92ZVRvRXgobV9oREMsIEZYU1lTX3JvdW5kKHgxKSwgRlhTWVNfcm91bmQoeTEpLCBudWxscHRyKTsKLSAgTGluZVRvKG1faERDLCBGWFNZU19yb3VuZCh4MiksIEZYU1lTX3JvdW5kKHkyKSk7CisgIE1vdmVUb0V4KG1faERDLCBGWFNZU19yb3VuZChwdE1vdmVUby54KSwgRlhTWVNfcm91bmQocHRNb3ZlVG8ueSksIG51bGxwdHIpOworICBMaW5lVG8obV9oREMsIEZYU1lTX3JvdW5kKHB0TGluZVRvLngpLCBGWFNZU19yb3VuZChwdExpbmVUby55KSk7CiAgIGhQZW4gPSAoSFBFTilTZWxlY3RPYmplY3QobV9oREMsIGhQZW4pOwogICBEZWxldGVPYmplY3QoaFBlbik7CiAgIHJldHVybiB0cnVlOwpAQCAtMTE2OCw3ICsxMTU1LDkgQEAKIAogQ0dkaURpc3BsYXlEcml2ZXI6On5DR2RpRGlzcGxheURyaXZlcigpIHt9CiAKLWJvb2wgQ0dkaURpc3BsYXlEcml2ZXI6OkdldERJQml0cyhDRlhfRElCaXRtYXAqIHBCaXRtYXAsIGludCBsZWZ0LCBpbnQgdG9wKSB7Citib29sIENHZGlEaXNwbGF5RHJpdmVyOjpHZXRESUJpdHMoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCkgewogICBib29sIHJldCA9IGZhbHNlOwogICBpbnQgd2lkdGggPSBwQml0bWFwLT5HZXRXaWR0aCgpOwogICBpbnQgaGVpZ2h0ID0gcEJpdG1hcC0+R2V0SGVpZ2h0KCk7CkBAIC0xMTc4LDcgKzExNjcsNyBAQAogICBCaXRCbHQoaERDTWVtb3J5LCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCBtX2hEQywgbGVmdCwgdG9wLCBTUkNDT1BZKTsKICAgU2VsZWN0T2JqZWN0KGhEQ01lbW9yeSwgaG9sZGJtcCk7CiAgIEJJVE1BUElORk8gYm1pOwotICBGWFNZU19tZW1zZXQoJmJtaSwgMCwgc2l6ZW9mIGJtaSk7CisgIG1lbXNldCgmYm1pLCAwLCBzaXplb2YgYm1pKTsKICAgYm1pLmJtaUhlYWRlci5iaVNpemUgPSBzaXplb2YgYm1pLmJtaUhlYWRlcjsKICAgYm1pLmJtaUhlYWRlci5iaUJpdENvdW50ID0gcEJpdG1hcC0+R2V0QlBQKCk7CiAgIGJtaS5ibWlIZWFkZXIuYmlIZWlnaHQgPSAtaGVpZ2h0OwpAQCAtMTE4OCwxMiArMTE3NywxMiBAQAogICAgIHJldCA9IDo6R2V0RElCaXRzKGhEQ01lbW9yeSwgaGJtcCwgMCwgaGVpZ2h0LCBwQml0bWFwLT5HZXRCdWZmZXIoKSwgJmJtaSwKICAgICAgICAgICAgICAgICAgICAgICBESUJfUkdCX0NPTE9SUykgPT0gaGVpZ2h0OwogICB9IGVsc2UgewotICAgIENGWF9ESUJpdG1hcCBiaXRtYXA7Ci0gICAgaWYgKGJpdG1hcC5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfUmdiKSkgeworICAgIGF1dG8gYml0bWFwID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKTsKKyAgICBpZiAoYml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfUmdiKSkgewogICAgICAgYm1pLmJtaUhlYWRlci5iaUJpdENvdW50ID0gMjQ7Ci0gICAgICA6OkdldERJQml0cyhoRENNZW1vcnksIGhibXAsIDAsIGhlaWdodCwgYml0bWFwLkdldEJ1ZmZlcigpLCAmYm1pLAorICAgICAgOjpHZXRESUJpdHMoaERDTWVtb3J5LCBoYm1wLCAwLCBoZWlnaHQsIGJpdG1hcC0+R2V0QnVmZmVyKCksICZibWksCiAgICAgICAgICAgICAgICAgICBESUJfUkdCX0NPTE9SUyk7Ci0gICAgICByZXQgPSBwQml0bWFwLT5UcmFuc2ZlckJpdG1hcCgwLCAwLCB3aWR0aCwgaGVpZ2h0LCAmYml0bWFwLCAwLCAwKTsKKyAgICAgIHJldCA9IHBCaXRtYXAtPlRyYW5zZmVyQml0bWFwKDAsIDAsIHdpZHRoLCBoZWlnaHQsIGJpdG1hcCwgMCwgMCk7CiAgICAgfSBlbHNlIHsKICAgICAgIHJldCA9IGZhbHNlOwogICAgIH0KQEAgLTEyMDYsNyArMTE5NSw3IEBACiAgIHJldHVybiByZXQ7CiB9CiAKLWJvb2wgQ0dkaURpc3BsYXlEcml2ZXI6OlNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorYm9vbCBDR2RpRGlzcGxheURyaXZlcjo6U2V0RElCaXRzKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKQEAgLTEyMTcsMTcgKzEyMDYsMTUgQEAKICAgICBpbnQgd2lkdGggPSBwU291cmNlLT5HZXRXaWR0aCgpLCBoZWlnaHQgPSBwU291cmNlLT5HZXRIZWlnaHQoKTsKICAgICBpbnQgYWxwaGEgPSBGWEFSR0JfQShjb2xvcik7CiAgICAgaWYgKHBTb3VyY2UtPkdldEJQUCgpICE9IDEgfHwgYWxwaGEgIT0gMjU1KSB7Ci0gICAgICBDRlhfRElCaXRtYXAgYmFja2dyb3VuZDsKLSAgICAgIGlmICghYmFja2dyb3VuZC5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfUmdiMzIpIHx8Ci0gICAgICAgICAgIUdldERJQml0cygmYmFja2dyb3VuZCwgbGVmdCwgdG9wKSB8fAotICAgICAgICAgICFiYWNrZ3JvdW5kLkNvbXBvc2l0ZU1hc2soMCwgMCwgd2lkdGgsIGhlaWdodCwgcFNvdXJjZSwgY29sb3IsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9CTEVORF9OT1JNQUwsIG51bGxwdHIsIGZhbHNlLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cikpIHsKKyAgICAgIGF1dG8gYmFja2dyb3VuZCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfRElCaXRtYXA+KCk7CisgICAgICBpZiAoIWJhY2tncm91bmQtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9SZ2IzMikgfHwKKyAgICAgICAgICAhR2V0RElCaXRzKGJhY2tncm91bmQsIGxlZnQsIHRvcCkgfHwKKyAgICAgICAgICAhYmFja2dyb3VuZC0+Q29tcG9zaXRlTWFzaygwLCAwLCB3aWR0aCwgaGVpZ2h0LCBwU291cmNlLCBjb2xvciwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9CTEVORF9OT1JNQUwsIG51bGxwdHIsIGZhbHNlLCAwKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICB9CiAgICAgICBGWF9SRUNUIHNyY19yZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgcmV0dXJuIFNldERJQml0cygmYmFja2dyb3VuZCwgMCwgJnNyY19yZWN0LCBsZWZ0LCB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0JMRU5EX05PUk1BTCk7CisgICAgICByZXR1cm4gU2V0RElCaXRzKGJhY2tncm91bmQsIDAsICZzcmNfcmVjdCwgbGVmdCwgdG9wLCBGWERJQl9CTEVORF9OT1JNQUwpOwogICAgIH0KICAgICBGWF9SRUNUIGNsaXBfcmVjdChsZWZ0LCB0b3AsIGxlZnQgKyBwU3JjUmVjdC0+V2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICAgICB0b3AgKyBwU3JjUmVjdC0+SGVpZ2h0KCkpOwpAQCAtMTIzNywzMiArMTIyNCwzMyBAQAogICB9CiAgIGludCB3aWR0aCA9IHBTcmNSZWN0LT5XaWR0aCgpLCBoZWlnaHQgPSBwU3JjUmVjdC0+SGVpZ2h0KCk7CiAgIGlmIChwU291cmNlLT5IYXNBbHBoYSgpKSB7Ci0gICAgQ0ZYX0RJQml0bWFwIGJpdG1hcDsKLSAgICBpZiAoIWJpdG1hcC5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfUmdiKSB8fAotICAgICAgICAhR2V0RElCaXRzKCZiaXRtYXAsIGxlZnQsIHRvcCkgfHwKLSAgICAgICAgIWJpdG1hcC5Db21wb3NpdGVCaXRtYXAoMCwgMCwgd2lkdGgsIGhlaWdodCwgcFNvdXJjZSwgcFNyY1JlY3QtPmxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTcmNSZWN0LT50b3AsIEZYRElCX0JMRU5EX05PUk1BTCwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIG51bGxwdHIpKSB7CisgICAgYXV0byBiaXRtYXAgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOworICAgIGlmICghYml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfUmdiKSB8fAorICAgICAgICAhR2V0RElCaXRzKGJpdG1hcCwgbGVmdCwgdG9wKSB8fAorICAgICAgICAhYml0bWFwLT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgd2lkdGgsIGhlaWdodCwgcFNvdXJjZSwgcFNyY1JlY3QtPmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3JjUmVjdC0+dG9wLCBGWERJQl9CTEVORF9OT1JNQUwsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgRlhfUkVDVCBzcmNfcmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICByZXR1cm4gU2V0RElCaXRzKCZiaXRtYXAsIDAsICZzcmNfcmVjdCwgbGVmdCwgdG9wLCBGWERJQl9CTEVORF9OT1JNQUwpOworICAgIHJldHVybiBTZXRESUJpdHMoYml0bWFwLCAwLCAmc3JjX3JlY3QsIGxlZnQsIHRvcCwgRlhESUJfQkxFTkRfTk9STUFMKTsKICAgfQogICBDRlhfRElCRXh0cmFjdG9yIHRlbXAocFNvdXJjZSk7Ci0gIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHRlbXAuR2V0Qml0bWFwKCk7CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBCaXRtYXAgPSB0ZW1wLkdldEJpdG1hcCgpOwogICBpZiAoIXBCaXRtYXApCiAgICAgcmV0dXJuIGZhbHNlOwogICByZXR1cm4gR0RJX1NldERJQml0cyhwQml0bWFwLCBwU3JjUmVjdCwgbGVmdCwgdG9wKTsKIH0KIAotYm9vbCBDR2RpRGlzcGxheURyaXZlcjo6VXNlRm94aXRTdHJldGNoRW5naW5lKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVuZGVyX2ZsYWdzKSB7Citib29sIENHZGlEaXNwbGF5RHJpdmVyOjpVc2VGb3hpdFN0cmV0Y2hFbmdpbmUoCisgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwU291cmNlLAorICAgIHVpbnQzMl90IGNvbG9yLAorICAgIGludCBkZXN0X2xlZnQsCisgICAgaW50IGRlc3RfdG9wLAorICAgIGludCBkZXN0X3dpZHRoLAorICAgIGludCBkZXN0X2hlaWdodCwKKyAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsCisgICAgaW50IHJlbmRlcl9mbGFncykgewogICBGWF9SRUNUIGJpdG1hcF9jbGlwID0gKnBDbGlwUmVjdDsKICAgaWYgKGRlc3Rfd2lkdGggPCAwKQogICAgIGRlc3RfbGVmdCArPSBkZXN0X3dpZHRoOwpAQCAtMTI3MSwxNyArMTI1OSwxNyBAQAogICAgIGRlc3RfdG9wICs9IGRlc3RfaGVpZ2h0OwogCiAgIGJpdG1hcF9jbGlwLk9mZnNldCgtZGVzdF9sZWZ0LCAtZGVzdF90b3ApOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBwU3RyZXRjaGVkKAotICAgICAgcFNvdXJjZS0+U3RyZXRjaFRvKGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCByZW5kZXJfZmxhZ3MsICZiaXRtYXBfY2xpcCkpOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwU3RyZXRjaGVkID0KKyAgICAgIHBTb3VyY2UtPlN0cmV0Y2hUbyhkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgcmVuZGVyX2ZsYWdzLCAmYml0bWFwX2NsaXApOwogICBpZiAoIXBTdHJldGNoZWQpCiAgICAgcmV0dXJuIHRydWU7CiAKICAgRlhfUkVDVCBzcmNfcmVjdCgwLCAwLCBwU3RyZXRjaGVkLT5HZXRXaWR0aCgpLCBwU3RyZXRjaGVkLT5HZXRIZWlnaHQoKSk7Ci0gIHJldHVybiBTZXRESUJpdHMocFN0cmV0Y2hlZC5nZXQoKSwgY29sb3IsICZzcmNfcmVjdCwgcENsaXBSZWN0LT5sZWZ0LAorICByZXR1cm4gU2V0RElCaXRzKHBTdHJldGNoZWQsIGNvbG9yLCAmc3JjX3JlY3QsIHBDbGlwUmVjdC0+bGVmdCwKICAgICAgICAgICAgICAgICAgICBwQ2xpcFJlY3QtPnRvcCwgRlhESUJfQkxFTkRfTk9STUFMKTsKIH0KIAotYm9vbCBDR2RpRGlzcGxheURyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorYm9vbCBDR2RpRGlzcGxheURyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCkBAIC0xMzA2LDI0ICsxMjk0LDIzIEBACiAgICAgY2xpcF9yZWN0LkludGVyc2VjdCgqcENsaXBSZWN0KTsKICAgICBjbGlwX3JlY3QuT2Zmc2V0KC1pbWFnZV9yZWN0LmxlZnQsIC1pbWFnZV9yZWN0LnRvcCk7CiAgICAgaW50IGNsaXBfd2lkdGggPSBjbGlwX3JlY3QuV2lkdGgoKSwgY2xpcF9oZWlnaHQgPSBjbGlwX3JlY3QuSGVpZ2h0KCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gcFN0cmV0Y2hlZCgKKyAgICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwU3RyZXRjaGVkKAogICAgICAgICBwU291cmNlLT5TdHJldGNoVG8oZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIGZsYWdzLCAmY2xpcF9yZWN0KSk7CiAgICAgaWYgKCFwU3RyZXRjaGVkKQogICAgICAgcmV0dXJuIHRydWU7CiAKLSAgICBDRlhfRElCaXRtYXAgYmFja2dyb3VuZDsKLSAgICBpZiAoIWJhY2tncm91bmQuQ3JlYXRlKGNsaXBfd2lkdGgsIGNsaXBfaGVpZ2h0LCBGWERJQl9SZ2IzMikgfHwKLSAgICAgICAgIUdldERJQml0cygmYmFja2dyb3VuZCwgaW1hZ2VfcmVjdC5sZWZ0ICsgY2xpcF9yZWN0LmxlZnQsCisgICAgYXV0byBiYWNrZ3JvdW5kID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKTsKKyAgICBpZiAoIWJhY2tncm91bmQtPkNyZWF0ZShjbGlwX3dpZHRoLCBjbGlwX2hlaWdodCwgRlhESUJfUmdiMzIpIHx8CisgICAgICAgICFHZXRESUJpdHMoYmFja2dyb3VuZCwgaW1hZ2VfcmVjdC5sZWZ0ICsgY2xpcF9yZWN0LmxlZnQsCiAgICAgICAgICAgICAgICAgICAgaW1hZ2VfcmVjdC50b3AgKyBjbGlwX3JlY3QudG9wKSB8fAotICAgICAgICAhYmFja2dyb3VuZC5Db21wb3NpdGVNYXNrKAotICAgICAgICAgICAgMCwgMCwgY2xpcF93aWR0aCwgY2xpcF9oZWlnaHQsIHBTdHJldGNoZWQuZ2V0KCksIGNvbG9yLCAwLCAwLAotICAgICAgICAgICAgRlhESUJfQkxFTkRfTk9STUFMLCBudWxscHRyLCBmYWxzZSwgMCwgbnVsbHB0cikpIHsKKyAgICAgICAgIWJhY2tncm91bmQtPkNvbXBvc2l0ZU1hc2soMCwgMCwgY2xpcF93aWR0aCwgY2xpcF9oZWlnaHQsIHBTdHJldGNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLCAwLCAwLCBGWERJQl9CTEVORF9OT1JNQUwsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAwKSkgewogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIEZYX1JFQ1Qgc3JjX3JlY3QoMCwgMCwgY2xpcF93aWR0aCwgY2xpcF9oZWlnaHQpOwotICAgIHJldHVybiBTZXRESUJpdHMoJmJhY2tncm91bmQsIDAsICZzcmNfcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgIGltYWdlX3JlY3QubGVmdCArIGNsaXBfcmVjdC5sZWZ0LAorICAgIHJldHVybiBTZXRESUJpdHMoYmFja2dyb3VuZCwgMCwgJnNyY19yZWN0LCBpbWFnZV9yZWN0LmxlZnQgKyBjbGlwX3JlY3QubGVmdCwKICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3JlY3QudG9wICsgY2xpcF9yZWN0LnRvcCwgRlhESUJfQkxFTkRfTk9STUFMKTsKICAgfQogICBpZiAocFNvdXJjZS0+SGFzQWxwaGEoKSkgewpAQCAtMTMzMSw3ICsxMzE4LDcgQEAKICAgICAgICAgKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKTsKICAgICBpZiAocFBsYXRmb3JtLT5tX0dkaXBsdXNFeHQuSXNBdmFpbGFibGUoKSAmJiAhcFNvdXJjZS0+SXNDbXlrSW1hZ2UoKSkgewogICAgICAgQ0ZYX0RJQkV4dHJhY3RvciB0ZW1wKHBTb3VyY2UpOwotICAgICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gdGVtcC5HZXRCaXRtYXAoKTsKKyAgICAgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBCaXRtYXAgPSB0ZW1wLkdldEJpdG1hcCgpOwogICAgICAgaWYgKCFwQml0bWFwKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICByZXR1cm4gcFBsYXRmb3JtLT5tX0dkaXBsdXNFeHQuU3RyZXRjaERJQml0cygKQEAgLTEzNDIsNDcgKzEzMjksNDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBwQ2xpcFJlY3QsIGZsYWdzKTsKICAgfQogICBDRlhfRElCRXh0cmFjdG9yIHRlbXAocFNvdXJjZSk7Ci0gIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IHRlbXAuR2V0Qml0bWFwKCk7CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBCaXRtYXAgPSB0ZW1wLkdldEJpdG1hcCgpOwogICBpZiAoIXBCaXRtYXApCiAgICAgcmV0dXJuIGZhbHNlOwogICByZXR1cm4gR0RJX1N0cmV0Y2hESUJpdHMocEJpdG1hcCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfaGVpZ2h0LCBmbGFncyk7CiB9CiAKLWJvb2wgQ0dkaURpc3BsYXlEcml2ZXI6OlN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCitib29sIENHZGlEaXNwbGF5RHJpdmVyOjpTdGFydERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVuZGVyX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfSW1hZ2VSZW5kZXJlcj4qIGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSB7CiAgIHJldHVybiBmYWxzZTsKIH0KIAotQ0ZYX1dpbmRvd3NEZXZpY2U6OkNGWF9XaW5kb3dzRGV2aWNlKEhEQyBoREMpIHsKK0NGWF9XaW5kb3dzUmVuZGVyRGV2aWNlOjpDRlhfV2luZG93c1JlbmRlckRldmljZShIREMgaERDKSB7CiAgIFNldERldmljZURyaXZlcihwZGZpdW06OldyYXBVbmlxdWUoQ3JlYXRlRHJpdmVyKGhEQykpKTsKIH0KIAotQ0ZYX1dpbmRvd3NEZXZpY2U6On5DRlhfV2luZG93c0RldmljZSgpIHt9Ci0KLUhEQyBDRlhfV2luZG93c0RldmljZTo6R2V0REMoKSBjb25zdCB7Ci0gIElGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIHBSREQgPSBHZXREZXZpY2VEcml2ZXIoKTsKLSAgcmV0dXJuIHBSREQgPyByZWludGVycHJldF9jYXN0PEhEQz4ocFJERC0+R2V0UGxhdGZvcm1TdXJmYWNlKCkpIDogbnVsbHB0cjsKLX0KK0NGWF9XaW5kb3dzUmVuZGVyRGV2aWNlOjp+Q0ZYX1dpbmRvd3NSZW5kZXJEZXZpY2UoKSB7fQogCiAvLyBzdGF0aWMKLUlGWF9SZW5kZXJEZXZpY2VEcml2ZXIqIENGWF9XaW5kb3dzRGV2aWNlOjpDcmVhdGVEcml2ZXIoSERDIGhEQykgeworSUZYX1JlbmRlckRldmljZURyaXZlciogQ0ZYX1dpbmRvd3NSZW5kZXJEZXZpY2U6OkNyZWF0ZURyaXZlcihIREMgaERDKSB7CiAgIGludCBkZXZpY2VfdHlwZSA9IDo6R2V0RGV2aWNlQ2FwcyhoREMsIFRFQ0hOT0xPR1kpOwogICBpbnQgb2JqX3R5cGUgPSA6OkdldE9iamVjdFR5cGUoaERDKTsKICAgYm9vbCB1c2VfcHJpbnRlciA9IGRldmljZV90eXBlID09IERUX1JBU1BSSU5URVIgfHwKLSAgICAgICAgICAgICAgICAgICAgIGRldmljZV90eXBlID09IERUX1BMT1RURVIgfHwgb2JqX3R5cGUgPT0gT0JKX0VOSE1FVEFEQzsKKyAgICAgICAgICAgICAgICAgICAgIGRldmljZV90eXBlID09IERUX1BMT1RURVIgfHwKKyAgICAgICAgICAgICAgICAgICAgIGRldmljZV90eXBlID09IERUX0NIQVJTVFJFQU0gfHwgb2JqX3R5cGUgPT0gT0JKX0VOSE1FVEFEQzsKIAogICBpZiAoIXVzZV9wcmludGVyKQogICAgIHJldHVybiBuZXcgQ0dkaURpc3BsYXlEcml2ZXIoaERDKTsKIAotICBpZiAoZ19wZGZpdW1fcHJpbnRfcG9zdHNjcmlwdF9sZXZlbCA9PSAyIHx8Ci0gICAgICBnX3BkZml1bV9wcmludF9wb3N0c2NyaXB0X2xldmVsID09IDMpIHsKLSAgICByZXR1cm4gbmV3IENQU1ByaW50ZXJEcml2ZXIoaERDLCBnX3BkZml1bV9wcmludF9wb3N0c2NyaXB0X2xldmVsLCBmYWxzZSk7Ci0gIH0KLSAgcmV0dXJuIG5ldyBDR2RpUHJpbnRlckRyaXZlcihoREMpOworICBpZiAoZ19wZGZpdW1fcHJpbnRfbW9kZSA9PSBXaW5kb3dzUHJpbnRNb2RlOjprTW9kZUVtZikKKyAgICByZXR1cm4gbmV3IENHZGlQcmludGVyRHJpdmVyKGhEQyk7CisKKyAgaWYgKGdfcGRmaXVtX3ByaW50X21vZGUgPT0gV2luZG93c1ByaW50TW9kZTo6a01vZGVUZXh0T25seSkKKyAgICByZXR1cm4gbmV3IENUZXh0T25seVByaW50ZXJEcml2ZXIoaERDKTsKKworICAvLyBTaG91bGQgYmUgUG9zdFNjcmlwdAorICBBU1NFUlQoZ19wZGZpdW1fcHJpbnRfbW9kZSA9PSBXaW5kb3dzUHJpbnRNb2RlOjprTW9kZVBvc3RTY3JpcHQyIHx8CisgICAgICAgICBnX3BkZml1bV9wcmludF9tb2RlID09IFdpbmRvd3NQcmludE1vZGU6OmtNb2RlUG9zdFNjcmlwdDMpOworICByZXR1cm4gbmV3IENQU1ByaW50ZXJEcml2ZXIoaERDLCBnX3BkZml1bV9wcmludF9tb2RlLCBmYWxzZSk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZGliLmNwcCBiL2NvcmUvZnhnZS93aW4zMi9meF93aW4zMl9kaWIuY3BwCmluZGV4IDQwYzljYTYuLjY0MTZiNWEgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhnZS93aW4zMi9meF93aW4zMl9kaWIuY3BwCisrKyBiL2NvcmUvZnhnZS93aW4zMi9meF93aW4zMl9kaWIuY3BwCkBAIC0xMSwxNCArMTEsMTUgQEAKICNpbmNsdWRlICJjb3JlL2Z4Z2Uvd2luMzIvY2Z4X3dpbmRvd3NkaWIuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2Uvd2luMzIvd2luMzJfaW50LmgiCiAKLUNGWF9CeXRlU3RyaW5nIENGWF9XaW5kb3dzRElCOjpHZXRCaXRtYXBJbmZvKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCkgewotICBDRlhfQnl0ZVN0cmluZyByZXN1bHQ7CitCeXRlU3RyaW5nIENGWF9XaW5kb3dzRElCOjpHZXRCaXRtYXBJbmZvKAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwQml0bWFwKSB7CisgIEJ5dGVTdHJpbmcgcmVzdWx0OwogICBpbnQgbGVuID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwogICBpZiAocEJpdG1hcC0+R2V0QlBQKCkgPT0gMSB8fCBwQml0bWFwLT5HZXRCUFAoKSA9PSA4KSB7CiAgICAgbGVuICs9IHNpemVvZihEV09SRCkgKiAoaW50KSgxIDw8IHBCaXRtYXAtPkdldEJQUCgpKTsKICAgfQogICBCSVRNQVBJTkZPSEVBREVSKiBwYm1paCA9IChCSVRNQVBJTkZPSEVBREVSKilyZXN1bHQuR2V0QnVmZmVyKGxlbik7Ci0gIEZYU1lTX21lbXNldChwYm1paCwgMCwgc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpKTsKKyAgbWVtc2V0KHBibWloLCAwLCBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpOwogICBwYm1paC0+YmlTaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwogICBwYm1paC0+YmlCaXRDb3VudCA9IHBCaXRtYXAtPkdldEJQUCgpOwogICBwYm1paC0+YmlDb21wcmVzc2lvbiA9IEJJX1JHQjsKQEAgLTUxLDkgKzUyLDkgQEAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotQ0ZYX0RJQml0bWFwKiBfRlhfV2luZG93c0RJQl9Mb2FkRnJvbUJ1ZihCSVRNQVBJTkZPKiBwYm1pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFscGhhKSB7CitSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBfRlhfV2luZG93c0RJQl9Mb2FkRnJvbUJ1ZihCSVRNQVBJTkZPKiBwYm1pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWxwaGEpIHsKICAgaW50IHdpZHRoID0gcGJtaS0+Ym1pSGVhZGVyLmJpV2lkdGg7CiAgIGludCBoZWlnaHQgPSBwYm1pLT5ibWlIZWFkZXIuYmlIZWlnaHQ7CiAgIEJPT0wgYkJvdHRvbVVwID0gdHJ1ZTsKQEAgLTYyLDI0ICs2MywyMiBAQAogICAgIGJCb3R0b21VcCA9IGZhbHNlOwogICB9CiAgIGludCBwaXRjaCA9ICh3aWR0aCAqIHBibWktPmJtaUhlYWRlci5iaUJpdENvdW50ICsgMzEpIC8gMzIgKiA0OwotICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwOworICBhdXRvIHBCaXRtYXAgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOwogICBGWERJQl9Gb3JtYXQgZm9ybWF0ID0gYkFscGhhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoRlhESUJfRm9ybWF0KShwYm1pLT5ibWlIZWFkZXIuYmlCaXRDb3VudCArIDB4MjAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKEZYRElCX0Zvcm1hdClwYm1pLT5ibWlIZWFkZXIuYmlCaXRDb3VudDsKLSAgYm9vbCByZXQgPSBwQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKLSAgaWYgKCFyZXQpIHsKLSAgICBkZWxldGUgcEJpdG1hcDsKKyAgaWYgKCFwQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgZm9ybWF0KSkKICAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBGWFNZU19tZW1jcHkocEJpdG1hcC0+R2V0QnVmZmVyKCksIHBEYXRhLCBwaXRjaCAqIGhlaWdodCk7CisKKyAgbWVtY3B5KHBCaXRtYXAtPkdldEJ1ZmZlcigpLCBwRGF0YSwgcGl0Y2ggKiBoZWlnaHQpOwogICBpZiAoYkJvdHRvbVVwKSB7CiAgICAgdWludDhfdCogdGVtcF9idWYgPSBGWF9BbGxvYyh1aW50OF90LCBwaXRjaCk7CiAgICAgaW50IHRvcCA9IDAsIGJvdHRvbSA9IGhlaWdodCAtIDE7CiAgICAgd2hpbGUgKHRvcCA8IGJvdHRvbSkgewotICAgICAgRlhTWVNfbWVtY3B5KHRlbXBfYnVmLCBwQml0bWFwLT5HZXRCdWZmZXIoKSArIHRvcCAqIHBpdGNoLCBwaXRjaCk7Ci0gICAgICBGWFNZU19tZW1jcHkocEJpdG1hcC0+R2V0QnVmZmVyKCkgKyB0b3AgKiBwaXRjaCwKLSAgICAgICAgICAgICAgICAgICBwQml0bWFwLT5HZXRCdWZmZXIoKSArIGJvdHRvbSAqIHBpdGNoLCBwaXRjaCk7Ci0gICAgICBGWFNZU19tZW1jcHkocEJpdG1hcC0+R2V0QnVmZmVyKCkgKyBib3R0b20gKiBwaXRjaCwgdGVtcF9idWYsIHBpdGNoKTsKKyAgICAgIG1lbWNweSh0ZW1wX2J1ZiwgcEJpdG1hcC0+R2V0QnVmZmVyKCkgKyB0b3AgKiBwaXRjaCwgcGl0Y2gpOworICAgICAgbWVtY3B5KHBCaXRtYXAtPkdldEJ1ZmZlcigpICsgdG9wICogcGl0Y2gsCisgICAgICAgICAgICAgcEJpdG1hcC0+R2V0QnVmZmVyKCkgKyBib3R0b20gKiBwaXRjaCwgcGl0Y2gpOworICAgICAgbWVtY3B5KHBCaXRtYXAtPkdldEJ1ZmZlcigpICsgYm90dG9tICogcGl0Y2gsIHRlbXBfYnVmLCBwaXRjaCk7CiAgICAgICB0b3ArKzsKICAgICAgIGJvdHRvbS0tOwogICAgIH0KQEAgLTg3LDIzICs4NiwyMyBAQAogICAgIHRlbXBfYnVmID0gbnVsbHB0cjsKICAgfQogICBpZiAocGJtaS0+Ym1pSGVhZGVyLmJpQml0Q291bnQgPT0gMSkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgICBwQml0bWFwLT5TZXRQYWxldHRlRW50cnkoaSwgKCh1aW50MzJfdCopcGJtaS0+Ym1pQ29sb3JzKVtpXSB8IDB4ZmYwMDAwMDApOwotICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgIHBCaXRtYXAtPlNldFBhbGV0dGVBcmdiKGksICgodWludDMyX3QqKXBibWktPmJtaUNvbG9ycylbaV0gfCAweGZmMDAwMDAwKTsKICAgfSBlbHNlIGlmIChwYm1pLT5ibWlIZWFkZXIuYmlCaXRDb3VudCA9PSA4KSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykgewotICAgICAgcEJpdG1hcC0+U2V0UGFsZXR0ZUVudHJ5KGksICgodWludDMyX3QqKXBibWktPmJtaUNvbG9ycylbaV0gfCAweGZmMDAwMDAwKTsKLSAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICAgIHBCaXRtYXAtPlNldFBhbGV0dGVBcmdiKGksICgodWludDMyX3QqKXBibWktPmJtaUNvbG9ycylbaV0gfCAweGZmMDAwMDAwKTsKICAgfQogICByZXR1cm4gcEJpdG1hcDsKIH0KIAotQ0ZYX0RJQml0bWFwKiBDRlhfV2luZG93c0RJQjo6TG9hZEZyb21CdWYoQklUTUFQSU5GTyogcGJtaSwgTFBWT0lEIHBEYXRhKSB7CitSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBDRlhfV2luZG93c0RJQjo6TG9hZEZyb21CdWYoQklUTUFQSU5GTyogcGJtaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFZPSUQgcERhdGEpIHsKICAgcmV0dXJuIF9GWF9XaW5kb3dzRElCX0xvYWRGcm9tQnVmKHBibWksIHBEYXRhLCBmYWxzZSk7CiB9CiAKLUhCSVRNQVAgQ0ZYX1dpbmRvd3NESUI6OkdldEREQml0bWFwKGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwgSERDIGhEQykgewotICBDRlhfQnl0ZVN0cmluZyBpbmZvID0gR2V0Qml0bWFwSW5mbyhwQml0bWFwKTsKK0hCSVRNQVAgQ0ZYX1dpbmRvd3NESUI6OkdldEREQml0bWFwKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSERDIGhEQykgeworICBCeXRlU3RyaW5nIGluZm8gPSBHZXRCaXRtYXBJbmZvKHBCaXRtYXApOwogICByZXR1cm4gQ3JlYXRlRElCaXRtYXAoaERDLCAoQklUTUFQSU5GT0hFQURFUiopaW5mby5jX3N0cigpLCBDQk1fSU5JVCwKICAgICAgICAgICAgICAgICAgICAgICAgIHBCaXRtYXAtPkdldEJ1ZmZlcigpLCAoQklUTUFQSU5GTyopaW5mby5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgRElCX1JHQl9DT0xPUlMpOwpAQCAtMTE2LDcgKzExNSw3IEBACiAgIGggPSBibXAuYm1IZWlnaHQ7CiB9CiAKLUNGWF9ESUJpdG1hcCogQ0ZYX1dpbmRvd3NESUI6OkxvYWRGcm9tRmlsZShjb25zdCBGWF9XQ0hBUiogZmlsZW5hbWUpIHsKK1JldGFpblB0cjxDRlhfRElCaXRtYXA+IENGWF9XaW5kb3dzRElCOjpMb2FkRnJvbUZpbGUoY29uc3Qgd2NoYXJfdCogZmlsZW5hbWUpIHsKICAgQ1dpbjMyUGxhdGZvcm0qIHBQbGF0Zm9ybSA9CiAgICAgICAoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpOwogICBpZiAocFBsYXRmb3JtLT5tX0dkaXBsdXNFeHQuSXNBdmFpbGFibGUoKSkgewpAQCAtMTMxLDMwICsxMzAsMjggQEAKICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQogICBIREMgaERDID0gQ3JlYXRlQ29tcGF0aWJsZURDKG51bGxwdHIpOwotICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgaW50IHdpZHRoOworICBpbnQgaGVpZ2h0OwogICBHZXRCaXRtYXBTaXplKGhCaXRtYXAsIHdpZHRoLCBoZWlnaHQpOwotICBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7CisgIGF1dG8gcERJQml0bWFwID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKTsKICAgaWYgKCFwRElCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9SZ2IpKSB7Ci0gICAgZGVsZXRlIHBESUJpdG1hcDsKICAgICBEZWxldGVEQyhoREMpOwogICAgIHJldHVybiBudWxscHRyOwogICB9Ci0gIENGWF9CeXRlU3RyaW5nIGluZm8gPSBHZXRCaXRtYXBJbmZvKHBESUJpdG1hcCk7CisgIEJ5dGVTdHJpbmcgaW5mbyA9IEdldEJpdG1hcEluZm8ocERJQml0bWFwKTsKICAgaW50IHJldCA9IEdldERJQml0cyhoREMsIGhCaXRtYXAsIDAsIGhlaWdodCwgcERJQml0bWFwLT5HZXRCdWZmZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAoQklUTUFQSU5GTyopaW5mby5jX3N0cigpLCBESUJfUkdCX0NPTE9SUyk7Ci0gIGlmICghcmV0KSB7Ci0gICAgZGVsZXRlIHBESUJpdG1hcDsKLSAgICBwRElCaXRtYXAgPSBudWxscHRyOwotICB9CiAgIERlbGV0ZURDKGhEQyk7CisgIGlmICghcmV0KQorICAgIHJldHVybiBudWxscHRyOwogICByZXR1cm4gcERJQml0bWFwOwogfQogCi1DRlhfRElCaXRtYXAqIENGWF9XaW5kb3dzRElCOjpMb2FkRnJvbUZpbGUoY29uc3QgRlhfQ0hBUiogZmlsZW5hbWUpIHsKLSAgcmV0dXJuIExvYWRGcm9tRmlsZShDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKGZpbGVuYW1lKS5jX3N0cigpKTsKK1JldGFpblB0cjxDRlhfRElCaXRtYXA+IENGWF9XaW5kb3dzRElCOjpMb2FkRnJvbUZpbGUoY29uc3QgY2hhciogZmlsZW5hbWUpIHsKKyAgcmV0dXJuIExvYWRGcm9tRmlsZShXaWRlU3RyaW5nOjpGcm9tTG9jYWwoZmlsZW5hbWUpLmNfc3RyKCkpOwogfQogCi1DRlhfRElCaXRtYXAqIENGWF9XaW5kb3dzRElCOjpMb2FkRElCaXRtYXAoV0lORElCX09wZW5fQXJnc18gYXJncykgeworUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gQ0ZYX1dpbmRvd3NESUI6OkxvYWRESUJpdG1hcChXSU5ESUJfT3Blbl9BcmdzXyBhcmdzKSB7CiAgIENXaW4zMlBsYXRmb3JtKiBwUGxhdGZvcm0gPQogICAgICAgKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKTsKICAgaWYgKHBQbGF0Zm9ybS0+bV9HZGlwbHVzRXh0LklzQXZhaWxhYmxlKCkpIHsKQEAgLTE3MSwzNCArMTY4LDMzIEBACiAgIEhEQyBoREMgPSBDcmVhdGVDb21wYXRpYmxlREMobnVsbHB0cik7CiAgIGludCB3aWR0aCwgaGVpZ2h0OwogICBHZXRCaXRtYXBTaXplKGhCaXRtYXAsIHdpZHRoLCBoZWlnaHQpOwotICBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7CisgIGF1dG8gcERJQml0bWFwID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKTsKICAgaWYgKCFwRElCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9SZ2IpKSB7Ci0gICAgZGVsZXRlIHBESUJpdG1hcDsKICAgICBEZWxldGVEQyhoREMpOwogICAgIHJldHVybiBudWxscHRyOwogICB9Ci0gIENGWF9CeXRlU3RyaW5nIGluZm8gPSBHZXRCaXRtYXBJbmZvKHBESUJpdG1hcCk7CisgIEJ5dGVTdHJpbmcgaW5mbyA9IEdldEJpdG1hcEluZm8ocERJQml0bWFwKTsKICAgaW50IHJldCA9IEdldERJQml0cyhoREMsIGhCaXRtYXAsIDAsIGhlaWdodCwgcERJQml0bWFwLT5HZXRCdWZmZXIoKSwKICAgICAgICAgICAgICAgICAgICAgICAoQklUTUFQSU5GTyopaW5mby5jX3N0cigpLCBESUJfUkdCX0NPTE9SUyk7Ci0gIGlmICghcmV0KSB7Ci0gICAgZGVsZXRlIHBESUJpdG1hcDsKLSAgICBwRElCaXRtYXAgPSBudWxscHRyOwotICB9CiAgIERlbGV0ZURDKGhEQyk7CisgIGlmICghcmV0KQorICAgIHJldHVybiBudWxscHRyOwogICByZXR1cm4gcERJQml0bWFwOwogfQogCiBDRlhfV2luZG93c0RJQjo6Q0ZYX1dpbmRvd3NESUIoSERDIGhEQywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CiAgIENyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9SZ2IsICh1aW50OF90KikxKTsKICAgQklUTUFQSU5GT0hFQURFUiBibWloOwotICBGWFNZU19tZW1zZXQoJmJtaWgsIDAsIHNpemVvZiBibWloKTsKKyAgbWVtc2V0KCZibWloLCAwLCBzaXplb2YgYm1paCk7CiAgIGJtaWguYmlTaXplID0gc2l6ZW9mIGJtaWg7CiAgIGJtaWguYmlCaXRDb3VudCA9IDI0OwogICBibWloLmJpSGVpZ2h0ID0gLWhlaWdodDsKICAgYm1paC5iaVBsYW5lcyA9IDE7CiAgIGJtaWguYmlXaWR0aCA9IHdpZHRoOwotICBtX2hCaXRtYXAgPSBDcmVhdGVESUJTZWN0aW9uKGhEQywgKEJJVE1BUElORk8qKSZibWloLCBESUJfUkdCX0NPTE9SUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBWT0lEKikmbV9wQnVmZmVyLCBudWxscHRyLCAwKTsKKyAgTFBWT0lEIHBEYXRhID0gbnVsbHB0cjsKKyAgbV9oQml0bWFwID0gQ3JlYXRlRElCU2VjdGlvbihoREMsIChCSVRNQVBJTkZPKikmYm1paCwgRElCX1JHQl9DT0xPUlMsICZwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCAwKTsKKyAgbV9wQnVmZmVyLlJlc2V0KHN0YXRpY19jYXN0PHVpbnQ4X3QqPihwRGF0YSkpOwogICBtX2hNZW1EQyA9IENyZWF0ZUNvbXBhdGlibGVEQyhoREMpOwogICBtX2hPbGRCaXRtYXAgPSAoSEJJVE1BUClTZWxlY3RPYmplY3QobV9oTWVtREMsIG1faEJpdG1hcCk7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZHdyaXRlLmNwcCBiL2NvcmUvZnhnZS93aW4zMi9meF93aW4zMl9kd3JpdGUuY3BwCmluZGV4IGRjMGY1ZWQuLjRkNGY0NWYgMTAwNjQ0Ci0tLSBhL2NvcmUvZnhnZS93aW4zMi9meF93aW4zMl9kd3JpdGUuY3BwCisrKyBiL2NvcmUvZnhnZS93aW4zMi9meF93aW4zMl9kd3JpdGUuY3BwCkBAIC03LDcgKzcsNyBAQAogI2luY2x1ZGUgPGR3cml0ZS5oPgogCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZ2UvY2Z4X2NsaXByZ24uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2NsaXByZ24uaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2Uvd2luMzIvZHdyaXRlX2ludC5oIgogCiB0eXBlZGVmIEhSRVNVTFQoX19zdGRjYWxsKiBGdW5jVHlwZV9EV3JpdGVDcmVhdGVGYWN0b3J5KSgKQEAgLTEwMyw3ICsxMDMsNyBAQAogCiBjbGFzcyBDRHdHZGlUZXh0UmVuZGVyZXIgewogIHB1YmxpYzoKLSAgQ0R3R2RpVGV4dFJlbmRlcmVyKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgQ0R3R2RpVGV4dFJlbmRlcmVyKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwQml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCogYml0bWFwUmVuZGVyVGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgSURXcml0ZVJlbmRlcmluZ1BhcmFtcyogcmVuZGVyaW5nUGFyYW1zKTsKICAgfkNEd0dkaVRleHRSZW5kZXJlcigpOwpAQCAtMTE4LDcgKzExOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPTE9SUkVGJiB0ZXh0Q29sb3IpOwogCiAgcHJpdmF0ZToKLSAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwXzsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcEJpdG1hcF87CiAgIElEV3JpdGVCaXRtYXBSZW5kZXJUYXJnZXQqIHBSZW5kZXJUYXJnZXRfOwogICBJRFdyaXRlUmVuZGVyaW5nUGFyYW1zKiBwUmVuZGVyaW5nUGFyYW1zXzsKIH07CkBAIC0xODAsNyArMTgwLDcgQEAKICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLWJvb2wgQ0RXcml0ZUV4dDo6RHdDcmVhdGVSZW5kZXJpbmdUYXJnZXQoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorYm9vbCBDRFdyaXRlRXh0OjpEd0NyZWF0ZVJlbmRlcmluZ1RhcmdldChjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIHJlbmRlclRhcmdldCkgewogICBpZiAocEJpdG1hcC0+R2V0Rm9ybWF0KCkgPiBGWERJQl9BcmdiKSB7CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjI3LDE0ICsyMjcsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1JFQ1QmIHN0cmluZ1JlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZvbnRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgdGV4dF9jb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBnbHlwaF9jb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0KiBnbHlwaF9pbmRpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYmFzZWxpbmVPcmlnaW5YLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYmFzZWxpbmVPcmlnaW5ZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYmFzZWxpbmVPcmlnaW5YLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYmFzZWxpbmVPcmlnaW5ZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZ2x5cGhfb2Zmc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUKiBnbHlwaF9hZHZhbmNlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGdseXBoX2FkdmFuY2VzKSB7CiAgIGlmICghcmVuZGVyVGFyZ2V0KSB7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KQEAgLTM5NSw3ICszOTUsNyBAQAogfQogCiBDRHdHZGlUZXh0UmVuZGVyZXI6OkNEd0dkaVRleHRSZW5kZXJlcigKLSAgICBDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBCaXRtYXAsCiAgICAgSURXcml0ZUJpdG1hcFJlbmRlclRhcmdldCogYml0bWFwUmVuZGVyVGFyZ2V0LAogICAgIElEV3JpdGVSZW5kZXJpbmdQYXJhbXMqIHJlbmRlcmluZ1BhcmFtcykKICAgICA6IHBCaXRtYXBfKHBCaXRtYXApLApAQCAtNDI2LDEzICs0MjYsMTMgQEAKICAgSEJJVE1BUCBoQml0bWFwID0gKEhCSVRNQVApOjpHZXRDdXJyZW50T2JqZWN0KGhEQywgT0JKX0JJVE1BUCk7CiAgIEJJVE1BUCBiaXRtYXA7CiAgIEdldE9iamVjdChoQml0bWFwLCBzaXplb2YgYml0bWFwLCAmYml0bWFwKTsKLSAgQ0ZYX0RJQml0bWFwIGRpYjsKLSAgZGliLkNyZWF0ZShiaXRtYXAuYm1XaWR0aCwgYml0bWFwLmJtSGVpZ2h0LAotICAgICAgICAgICAgIGJpdG1hcC5ibUJpdHNQaXhlbCA9PSAyNCA/IEZYRElCX1JnYiA6IEZYRElCX1JnYjMyLAotICAgICAgICAgICAgICh1aW50OF90KiliaXRtYXAuYm1CaXRzKTsKLSAgZGliLkNvbXBvc2l0ZUJpdG1hcCh0ZXh0X2Jib3gubGVmdCwgdGV4dF9iYm94LnRvcCwgdGV4dF9iYm94LldpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgdGV4dF9iYm94LkhlaWdodCgpLCBwQml0bWFwXywgdGV4dF9iYm94LmxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgdGV4dF9iYm94LnRvcCwgRlhESUJfQkxFTkRfTk9STUFMLCBudWxscHRyKTsKKyAgYXV0byBkaWIgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOworICBkaWItPkNyZWF0ZShiaXRtYXAuYm1XaWR0aCwgYml0bWFwLmJtSGVpZ2h0LAorICAgICAgICAgICAgICBiaXRtYXAuYm1CaXRzUGl4ZWwgPT0gMjQgPyBGWERJQl9SZ2IgOiBGWERJQl9SZ2IzMiwKKyAgICAgICAgICAgICAgKHVpbnQ4X3QqKWJpdG1hcC5ibUJpdHMpOworICBkaWItPkNvbXBvc2l0ZUJpdG1hcCh0ZXh0X2Jib3gubGVmdCwgdGV4dF9iYm94LnRvcCwgdGV4dF9iYm94LldpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgIHRleHRfYmJveC5IZWlnaHQoKSwgcEJpdG1hcF8sIHRleHRfYmJveC5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2Jib3gudG9wLCBGWERJQl9CTEVORF9OT1JNQUwsIG51bGxwdHIpOwogICBociA9IHBSZW5kZXJUYXJnZXRfLT5EcmF3R2x5cGhSdW4oYmFzZWxpbmVPcmlnaW5YLCBiYXNlbGluZU9yaWdpblksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFzdXJpbmdNb2RlLCBnbHlwaFJ1biwgcFJlbmRlcmluZ1BhcmFtc18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Q29sb3IpOwpAQCAtNDQwLDcgKzQ0MCw3IEBACiAgICAgcmV0dXJuIGhyOwogICB9CiAgIHBCaXRtYXBfLT5Db21wb3NpdGVCaXRtYXAodGV4dF9iYm94LmxlZnQsIHRleHRfYmJveC50b3AsIHRleHRfYmJveC5XaWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfYmJveC5IZWlnaHQoKSwgJmRpYiwgdGV4dF9iYm94LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9iYm94LkhlaWdodCgpLCBkaWIsIHRleHRfYmJveC5sZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfYmJveC50b3AsIEZYRElCX0JMRU5EX05PUk1BTCwgcENsaXBSZ24pOwogICByZXR1cm4gaHI7CiB9CmRpZmYgLS1naXQgYS9jb3JlL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZ2RpcGV4dC5jcHAgYi9jb3JlL2Z4Z2Uvd2luMzIvZnhfd2luMzJfZ2RpcGV4dC5jcHAKaW5kZXggMWJlMmE1NC4uYTYxNzAzNiAxMDA2NDQKLS0tIGEvY29yZS9meGdlL3dpbjMyL2Z4X3dpbjMyX2dkaXBleHQuY3BwCisrKyBiL2NvcmUvZnhnZS93aW4zMi9meF93aW4zMl9nZGlwZXh0LmNwcApAQCAtOCw2ICs4LDcgQEAKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3N0cmVhbT4KIAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9nZW1vZHVsZS5oIgpAQCAtMjUsOCArMjYsNjUgQEAKIAogI2luY2x1ZGUgPGdkaXBsdXMuaD4gIC8vIE5PTElOVAogCi11c2luZyBuYW1lc3BhY2UgR2RpcGx1czsgICAgICAgICAgICAgIC8vIE5PTElOVAotdXNpbmcgbmFtZXNwYWNlIEdkaXBsdXM6OkRsbEV4cG9ydHM7ICAvLyBOT0xJTlQKKy8vIFRPRE8odGhlc3RpZyk6IFJlbW92ZSB0aGUgaW5mcmVxdWVudGx5IHVzZWQgb25lcy4KK3VzaW5nIEdkaXBsdXM6OkNvbWJpbmVNb2RlOwordXNpbmcgR2RpcGx1czo6RGFzaENhcDsKK3VzaW5nIEdkaXBsdXM6OkRhc2hDYXBGbGF0OwordXNpbmcgR2RpcGx1czo6RGFzaENhcFJvdW5kOwordXNpbmcgR2RpcGx1czo6RmlsbE1vZGVBbHRlcm5hdGU7Cit1c2luZyBHZGlwbHVzOjpGaWxsTW9kZVdpbmRpbmc7Cit1c2luZyBHZGlwbHVzOjpHZGlwbHVzU3RhcnR1cElucHV0OwordXNpbmcgR2RpcGx1czo6R2RpcGx1c1N0YXJ0dXBPdXRwdXQ7Cit1c2luZyBHZGlwbHVzOjpHcEJpdG1hcDsKK3VzaW5nIEdkaXBsdXM6OkdwQnJ1c2g7Cit1c2luZyBHZGlwbHVzOjpHcERhc2hDYXA7Cit1c2luZyBHZGlwbHVzOjpHcERhc2hTdHlsZTsKK3VzaW5nIEdkaXBsdXM6OkdwRmlsbE1vZGU7Cit1c2luZyBHZGlwbHVzOjpHcEZvbnQ7Cit1c2luZyBHZGlwbHVzOjpHcEZvbnRDb2xsZWN0aW9uOwordXNpbmcgR2RpcGx1czo6R3BGb250RmFtaWx5OwordXNpbmcgR2RpcGx1czo6R3BHcmFwaGljczsKK3VzaW5nIEdkaXBsdXM6OkdwSW1hZ2U7Cit1c2luZyBHZGlwbHVzOjpHcExpbmVDYXA7Cit1c2luZyBHZGlwbHVzOjpHcExpbmVKb2luOwordXNpbmcgR2RpcGx1czo6R3BNYXRyaXg7Cit1c2luZyBHZGlwbHVzOjpHcFBhdGg7Cit1c2luZyBHZGlwbHVzOjpHcFBlbjsKK3VzaW5nIEdkaXBsdXM6OkdwUG9pbnQ7Cit1c2luZyBHZGlwbHVzOjpHcFBvaW50RjsKK3VzaW5nIEdkaXBsdXM6OkdwUmVjdDsKK3VzaW5nIEdkaXBsdXM6OkdwUmVnaW9uOwordXNpbmcgR2RpcGx1czo6R3BTb2xpZEZpbGw7Cit1c2luZyBHZGlwbHVzOjpHcFN0YXR1czsKK3VzaW5nIEdkaXBsdXM6OkdwU3RyaW5nRm9ybWF0OwordXNpbmcgR2RpcGx1czo6R3BVbml0OwordXNpbmcgR2RpcGx1czo6SW1hZ2VMb2NrTW9kZVJlYWQ7Cit1c2luZyBHZGlwbHVzOjpJbnRlcnBvbGF0aW9uTW9kZTsKK3VzaW5nIEdkaXBsdXM6OkludGVycG9sYXRpb25Nb2RlQmlsaW5lYXI7Cit1c2luZyBHZGlwbHVzOjpJbnRlcnBvbGF0aW9uTW9kZUhpZ2hRdWFsaXR5OwordXNpbmcgR2RpcGx1czo6SW50ZXJwb2xhdGlvbk1vZGVOZWFyZXN0TmVpZ2hib3I7Cit1c2luZyBHZGlwbHVzOjpMaW5lQ2FwOwordXNpbmcgR2RpcGx1czo6TGluZUNhcEZsYXQ7Cit1c2luZyBHZGlwbHVzOjpMaW5lQ2FwUm91bmQ7Cit1c2luZyBHZGlwbHVzOjpMaW5lQ2FwU3F1YXJlOwordXNpbmcgR2RpcGx1czo6TGluZUpvaW47Cit1c2luZyBHZGlwbHVzOjpMaW5lSm9pbkJldmVsOwordXNpbmcgR2RpcGx1czo6TGluZUpvaW5NaXRlckNsaXBwZWQ7Cit1c2luZyBHZGlwbHVzOjpMaW5lSm9pblJvdW5kOwordXNpbmcgR2RpcGx1czo6UGFsZXR0ZUZsYWdzSGFzQWxwaGE7Cit1c2luZyBHZGlwbHVzOjpQYXRoUG9pbnRUeXBlQmV6aWVyOwordXNpbmcgR2RpcGx1czo6UGF0aFBvaW50VHlwZUNsb3NlU3VicGF0aDsKK3VzaW5nIEdkaXBsdXM6OlBhdGhQb2ludFR5cGVMaW5lOwordXNpbmcgR2RpcGx1czo6UGF0aFBvaW50VHlwZVN0YXJ0OwordXNpbmcgR2RpcGx1czo6UGl4ZWxPZmZzZXRNb2RlOwordXNpbmcgR2RpcGx1czo6UGl4ZWxPZmZzZXRNb2RlSGFsZjsKK3VzaW5nIEdkaXBsdXM6OlJFQUw7Cit1c2luZyBHZGlwbHVzOjpTbW9vdGhpbmdNb2RlOwordXNpbmcgR2RpcGx1czo6U21vb3RoaW5nTW9kZUFudGlBbGlhczsKK3VzaW5nIEdkaXBsdXM6OlNtb290aGluZ01vZGVOb25lOwordXNpbmcgR2RpcGx1czo6VGV4dFJlbmRlcmluZ0hpbnQ7Cit1c2luZyBHZGlwbHVzOjpVbml0UGl4ZWw7Cit1c2luZyBHZGlwbHVzOjpVbml0V29ybGQ7CiAKICNkZWZpbmUgR2RpRmlsbFR5cGUyR2RpcChmaWxsX3R5cGUpIFwKICAgKGZpbGxfdHlwZSA9PSBBTFRFUk5BVEUgPyBGaWxsTW9kZUFsdGVybmF0ZSA6IEZpbGxNb2RlV2luZGluZykKQEAgLTExMSw2ICsxNjksNyBAQAogICBGdW5jSWRfR2RpcERyYXdTdHJpbmcsCiAgIEZ1bmNJZF9HZGlwU2V0UGVuVHJhbnNmb3JtLAogfTsKKwogc3RhdGljIExQQ1NUUiBnX0dkaXBGdW5jTmFtZXNbXSA9IHsKICAgICAiR2RpcENyZWF0ZVBhdGgyIiwKICAgICAiR2RpcFNldFBlbkRhc2hTdHlsZSIsCkBAIC0xOTEsNiArMjUwLDEwIEBACiAgICAgIkdkaXBEcmF3U3RyaW5nIiwKICAgICAiR2RpcFNldFBlblRyYW5zZm9ybSIsCiB9Oworc3RhdGljX2Fzc2VydChGWF9BcnJheVNpemUoZ19HZGlwRnVuY05hbWVzKSA9PQorICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihGdW5jSWRfR2RpcFNldFBlblRyYW5zZm9ybSkgKyAxLAorICAgICAgICAgICAgICAiZ19HZGlwRnVuY05hbWVzIGhhcyB3cm9uZyBzaXplIik7CisKIHR5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcENyZWF0ZVBhdGgyKShHRElQQ09OU1QgR3BQb2ludEYqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdESVBDT05TVCBCWVRFKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQsCkBAIC0yMTUsMTMgKzI3OCwxMyBAQAogdHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwU2V0U21vb3RoaW5nTW9kZSkoCiAgICAgR3BHcmFwaGljcyogZ3JhcGhpY3MsCiAgICAgU21vb3RoaW5nTW9kZSBzbW9vdGhpbmdNb2RlKTsKLXR5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcENyZWF0ZVNvbGlkRmlsbCkoQVJHQiBjb2xvciwKK3R5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcENyZWF0ZVNvbGlkRmlsbCkoR2RpcGx1czo6QVJHQiBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BTb2xpZEZpbGwqKiBicnVzaCk7CiB0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBGaWxsUGF0aCkoR3BHcmFwaGljcyogZ3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BCcnVzaCogYnJ1c2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3BQYXRoKiBwYXRoKTsKIHR5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcERlbGV0ZUJydXNoKShHcEJydXNoKiBicnVzaCk7Ci10eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBDcmVhdGVQZW4xKShBUkdCIGNvbG9yLAordHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwQ3JlYXRlUGVuMSkoR2RpcGx1czo6QVJHQiBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUwgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcFVuaXQgdW5pdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdwUGVuKiogcGVuKTsKQEAgLTI0NSwyMiArMzA4LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVCogaGVpZ2h0KTsKIHR5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcEdldEltYWdlUGl4ZWxGb3JtYXQpKAogICAgIEdwSW1hZ2UqIGltYWdlLAotICAgIFBpeGVsRm9ybWF0KiBmb3JtYXQpOworICAgIEdkaXBsdXM6OlBpeGVsRm9ybWF0KiBmb3JtYXQpOwogdHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwQml0bWFwTG9ja0JpdHMpKAogICAgIEdwQml0bWFwKiBiaXRtYXAsCiAgICAgR0RJUENPTlNUIEdwUmVjdCogcmVjdCwKICAgICBVSU5UIGZsYWdzLAotICAgIFBpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICBCaXRtYXBEYXRhKiBsb2NrZWRCaXRtYXBEYXRhKTsKKyAgICBHZGlwbHVzOjpQaXhlbEZvcm1hdCBmb3JtYXQsCisgICAgR2RpcGx1czo6Qml0bWFwRGF0YSogbG9ja2VkQml0bWFwRGF0YSk7CiB0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBHZXRJbWFnZVBhbGV0dGUpKAogICAgIEdwSW1hZ2UqIGltYWdlLAotICAgIENvbG9yUGFsZXR0ZSogcGFsZXR0ZSwKKyAgICBHZGlwbHVzOjpDb2xvclBhbGV0dGUqIHBhbGV0dGUsCiAgICAgSU5UIHNpemUpOwogdHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwR2V0SW1hZ2VQYWxldHRlU2l6ZSkoR3BJbWFnZSogaW1hZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQqIHNpemUpOwogdHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwQml0bWFwVW5sb2NrQml0cykoCiAgICAgR3BCaXRtYXAqIGJpdG1hcCwKLSAgICBCaXRtYXBEYXRhKiBsb2NrZWRCaXRtYXBEYXRhKTsKKyAgICBHZGlwbHVzOjpCaXRtYXBEYXRhKiBsb2NrZWRCaXRtYXBEYXRhKTsKIHR5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcERpc3Bvc2VJbWFnZSkoR3BJbWFnZSogaW1hZ2UpOwogdHlwZWRlZiBHcFN0YXR1cyhXSU5HRElQQVBJKiBGdW5jVHlwZV9HZGlwRmlsbFJlY3RhbmdsZSkoR3BHcmFwaGljcyogZ3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcEJydXNoKiBicnVzaCwKQEAgLTI3MiwxMiArMzM1LDEyIEBACiAgICAgSU5UIHdpZHRoLAogICAgIElOVCBoZWlnaHQsCiAgICAgSU5UIHN0cmlkZSwKLSAgICBQaXhlbEZvcm1hdCBmb3JtYXQsCisgICAgR2RpcGx1czo6UGl4ZWxGb3JtYXQgZm9ybWF0LAogICAgIEJZVEUqIHNjYW4wLAogICAgIEdwQml0bWFwKiogYml0bWFwKTsKIHR5cGVkZWYgR3BTdGF0dXMoV0lOR0RJUEFQSSogRnVuY1R5cGVfR2RpcFNldEltYWdlUGFsZXR0ZSkoCiAgICAgR3BJbWFnZSogaW1hZ2UsCi0gICAgR0RJUENPTlNUIENvbG9yUGFsZXR0ZSogcGFsZXR0ZSk7CisgICAgR0RJUENPTlNUIEdkaXBsdXM6OkNvbG9yUGFsZXR0ZSogcGFsZXR0ZSk7CiB0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBTZXRJbnRlcnBvbGF0aW9uTW9kZSkoCiAgICAgR3BHcmFwaGljcyogZ3JhcGhpY3MsCiAgICAgSW50ZXJwb2xhdGlvbk1vZGUgaW50ZXJwb2xhdGlvbk1vZGUpOwpAQCAtMjkwLDcgKzM1Myw3IEBACiAgICAgR0RJUENPTlNUIEJJVE1BUElORk8qIGdkaUJpdG1hcEluZm8sCiAgICAgVk9JRCogZ2RpQml0bWFwRGF0YSwKICAgICBHcEJpdG1hcCoqIGJpdG1hcCk7Ci10eXBlZGVmIFN0YXR1cyhXSU5BUEkqIEZ1bmNUeXBlX0dkaXBsdXNTdGFydHVwKSgKK3R5cGVkZWYgR2RpcGx1czo6U3RhdHVzKFdJTkFQSSogRnVuY1R5cGVfR2RpcGx1c1N0YXJ0dXApKAogICAgIE9VVCB1aW50cHRyX3QqIHRva2VuLAogICAgIGNvbnN0IEdkaXBsdXNTdGFydHVwSW5wdXQqIGlucHV0LAogICAgIE9VVCBHZGlwbHVzU3RhcnR1cE91dHB1dCogb3V0cHV0KTsKQEAgLTM1NCw3ICs0MTcsNyBAQAogICAgIEdESVBDT05TVCBHcEZvbnRGYW1pbHkqIGZvbnRGYW1pbHksCiAgICAgUkVBTCBlbVNpemUsCiAgICAgSU5UIHN0eWxlLAotICAgIFVuaXQgdW5pdCwKKyAgICBHZGlwbHVzOjpVbml0IHVuaXQsCiAgICAgR3BGb250KiogZm9udCk7CiB0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBHZXRGb250U2l6ZSkoR3BGb250KiBmb250LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUwqIHNpemUpOwpAQCAtMzcxLDcgKzQzNCw3IEBACiAgICAgSU5UIGxlbmd0aCwKICAgICBHRElQQ09OU1QgR3BGb250KiBmb250LAogICAgIEdESVBDT05TVCBHcEJydXNoKiBicnVzaCwKLSAgICBHRElQQ09OU1QgUG9pbnRGKiBwb3NpdGlvbnMsCisgICAgR0RJUENPTlNUIEdkaXBsdXM6OlBvaW50RiogcG9zaXRpb25zLAogICAgIElOVCBmbGFncywKICAgICBHRElQQ09OU1QgR3BNYXRyaXgqIG1hdHJpeCk7CiB0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBDcmVhdGVNYXRyaXgyKShSRUFMIG0xMSwKQEAgLTQyOSw3ICs0OTIsNyBAQAogICAgIEdESVBDT05TVCBXQ0hBUiogc3RyLAogICAgIElOVCBsZW5ndGgsCiAgICAgR0RJUENPTlNUIEdwRm9udCogZm9udCwKLSAgICBHRElQQ09OU1QgUmVjdEYqIGxheW91dFJlY3QsCisgICAgR0RJUENPTlNUIEdkaXBsdXM6OlJlY3RGKiBsYXlvdXRSZWN0LAogICAgIEdESVBDT05TVCBHcFN0cmluZ0Zvcm1hdCogc3RyaW5nRm9ybWF0LAogICAgIEdESVBDT05TVCBHcEJydXNoKiBicnVzaCk7CiB0eXBlZGVmIEdwU3RhdHVzKFdJTkdESVBBUEkqIEZ1bmNUeXBlX0dkaXBTZXRQZW5UcmFuc2Zvcm0pKEdwUGVuKiBwZW4sCkBAIC00NTcsMTQgKzUyMCwxNCBAQAogICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9CiAgICAgICAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKICAgR3BTb2xpZEZpbGwqIHNvbGlkQnJ1c2ggPSBudWxscHRyOwotICBDYWxsRnVuYyhHZGlwQ3JlYXRlU29saWRGaWxsKSgoQVJHQilhcmdiLCAmc29saWRCcnVzaCk7CisgIENhbGxGdW5jKEdkaXBDcmVhdGVTb2xpZEZpbGwpKChHZGlwbHVzOjpBUkdCKWFyZ2IsICZzb2xpZEJydXNoKTsKICAgcmV0dXJuIHNvbGlkQnJ1c2g7CiB9CiAKLXN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBTdHJldGNoTW9ub1RvR3JheSgKK3N0YXRpYyBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBTdHJldGNoTW9ub1RvR3JheSgKICAgICBpbnQgZGVzdF93aWR0aCwKICAgICBpbnQgZGVzdF9oZWlnaHQsCi0gICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwU291cmNlLAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwU291cmNlLAogICAgIEZYX1JFQ1QqIHBDbGlwUmVjdCkgewogICBib29sIGJGbGlwWCA9IGRlc3Rfd2lkdGggPCAwOwogICBpZiAoYkZsaXBYKQpAQCAtNDc3LDcgKzU0MCw3IEBACiAgIGludCByZXN1bHRfd2lkdGggPSBwQ2xpcFJlY3QtPldpZHRoKCk7CiAgIGludCByZXN1bHRfaGVpZ2h0ID0gcENsaXBSZWN0LT5IZWlnaHQoKTsKICAgaW50IHJlc3VsdF9waXRjaCA9IChyZXN1bHRfd2lkdGggKyAzKSAvIDQgKiA0OwotICBhdXRvIHBTdHJldGNoZWQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0RJQml0bWFwPigpOworICBhdXRvIHBTdHJldGNoZWQgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOwogICBpZiAoIXBTdHJldGNoZWQtPkNyZWF0ZShyZXN1bHRfd2lkdGgsIHJlc3VsdF9oZWlnaHQsIEZYRElCXzhicHBSZ2IpKQogICAgIHJldHVybiBudWxscHRyOwogCkBAIC01MTgsNyArNTgxLDcgQEAKIAogc3RhdGljIHZvaWQgT3V0cHV0SW1hZ2VNYXNrKEdwR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MIGJNb25vRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKQEAgLTUzMiwxMSArNTk1LDExIEBACiAgIGludCBzcmNfcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOwogICB1aW50OF90KiBzY2FuMCA9IHBCaXRtYXAtPkdldEJ1ZmZlcigpOwogICBpZiAoc3JjX3dpZHRoID09IDEgJiYgc3JjX2hlaWdodCA9PSAxKSB7Ci0gICAgaWYgKChzY2FuMFswXSAmIDB4ODApID09IDApIHsKKyAgICBpZiAoKHNjYW4wWzBdICYgMHg4MCkgPT0gMCkKICAgICAgIHJldHVybjsKLSAgICB9CisKICAgICBHcFNvbGlkRmlsbCogc29saWRCcnVzaDsKLSAgICBDYWxsRnVuYyhHZGlwQ3JlYXRlU29saWRGaWxsKSgoQVJHQilhcmdiLCAmc29saWRCcnVzaCk7CisgICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZVNvbGlkRmlsbCkoKEdkaXBsdXM6OkFSR0IpYXJnYiwgJnNvbGlkQnJ1c2gpOwogICAgIGlmIChkZXN0X3dpZHRoIDwgMCkgewogICAgICAgZGVzdF93aWR0aCA9IC1kZXN0X3dpZHRoOwogICAgICAgZGVzdF9sZWZ0IC09IGRlc3Rfd2lkdGg7CkBAIC01NTgsMTEgKzYyMSwxMSBAQAogICAgIGltYWdlX3JlY3QuTm9ybWFsaXplKCk7CiAgICAgRlhfUkVDVCBpbWFnZV9jbGlwID0gaW1hZ2VfcmVjdDsKICAgICBpbWFnZV9jbGlwLkludGVyc2VjdCgqcENsaXBSZWN0KTsKLSAgICBpZiAoaW1hZ2VfY2xpcC5Jc0VtcHR5KCkpIHsKKyAgICBpZiAoaW1hZ2VfY2xpcC5Jc0VtcHR5KCkpCiAgICAgICByZXR1cm47Ci0gICAgfQorCiAgICAgaW1hZ2VfY2xpcC5PZmZzZXQoLWltYWdlX3JlY3QubGVmdCwgLWltYWdlX3JlY3QudG9wKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBwU3RyZXRjaGVkOworICAgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBTdHJldGNoZWQ7CiAgICAgaWYgKHNyY193aWR0aCAqIHNyY19oZWlnaHQgPiAxMDAwMCkgewogICAgICAgcFN0cmV0Y2hlZCA9CiAgICAgICAgICAgU3RyZXRjaE1vbm9Ub0dyYXkoZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIHBCaXRtYXAsICZpbWFnZV9jbGlwKTsKQEAgLTU3NSwxNSArNjM4LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGltYWdlX2NsaXAuV2lkdGgoKSArIDMpIC8gNCAqIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQ4YnBwSW5kZXhlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyZXRjaGVkLT5HZXRCdWZmZXIoKSwgJmJpdG1hcCk7Ci0gICAgaW50IGEsIHIsIGcsIGI7Ci0gICAgQXJnYkRlY29kZShhcmdiLCBhLCByLCBnLCBiKTsKKyAgICBpbnQgYTsKKyAgICBpbnQgcjsKKyAgICBpbnQgZzsKKyAgICBpbnQgYjsKKyAgICBzdGQ6OnRpZShhLCByLCBnLCBiKSA9IEFyZ2JEZWNvZGUoYXJnYik7CiAgICAgVUlOVCBwYWxbMjU4XTsKICAgICBwYWxbMF0gPSAwOwogICAgIHBhbFsxXSA9IDI1NjsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CiAgICAgICBwYWxbaSArIDJdID0gQXJnYkVuY29kZShpICogYSAvIDI1NSwgciwgZywgYik7CiAgICAgfQotICAgIENhbGxGdW5jKEdkaXBTZXRJbWFnZVBhbGV0dGUpKGJpdG1hcCwgKENvbG9yUGFsZXR0ZSopcGFsKTsKKyAgICBDYWxsRnVuYyhHZGlwU2V0SW1hZ2VQYWxldHRlKShiaXRtYXAsIChHZGlwbHVzOjpDb2xvclBhbGV0dGUqKXBhbCk7CiAgICAgQ2FsbEZ1bmMoR2RpcERyYXdJbWFnZUkpKHBHcmFwaGljcywgYml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9yZWN0LmxlZnQgKyBpbWFnZV9jbGlwLmxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlX3JlY3QudG9wICsgaW1hZ2VfY2xpcC50b3ApOwpAQCAtNTk0LDE1ICs2NjAsMTYgQEAKICAgQ2FsbEZ1bmMoR2RpcENyZWF0ZUJpdG1hcEZyb21TY2FuMCkoc3JjX3dpZHRoLCBzcmNfaGVpZ2h0LCBzcmNfcGl0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpeGVsRm9ybWF0MWJwcEluZGV4ZWQsIHNjYW4wLCAmYml0bWFwKTsKICAgVUlOVCBwYWxldHRlWzRdID0ge1BhbGV0dGVGbGFnc0hhc0FscGhhLCAyLCAwLCBhcmdifTsKLSAgQ2FsbEZ1bmMoR2RpcFNldEltYWdlUGFsZXR0ZSkoYml0bWFwLCAoQ29sb3JQYWxldHRlKilwYWxldHRlKTsKLSAgUG9pbnQgZGVzdGluYXRpb25Qb2ludHNbXSA9IHtQb2ludChkZXN0X2xlZnQsIGRlc3RfdG9wKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludChkZXN0X2xlZnQgKyBkZXN0X3dpZHRoLCBkZXN0X3RvcCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnQoZGVzdF9sZWZ0LCBkZXN0X3RvcCArIGRlc3RfaGVpZ2h0KX07CisgIENhbGxGdW5jKEdkaXBTZXRJbWFnZVBhbGV0dGUpKGJpdG1hcCwgKEdkaXBsdXM6OkNvbG9yUGFsZXR0ZSopcGFsZXR0ZSk7CisgIEdkaXBsdXM6OlBvaW50IGRlc3RpbmF0aW9uUG9pbnRzW10gPSB7CisgICAgICBHZGlwbHVzOjpQb2ludChkZXN0X2xlZnQsIGRlc3RfdG9wKSwKKyAgICAgIEdkaXBsdXM6OlBvaW50KGRlc3RfbGVmdCArIGRlc3Rfd2lkdGgsIGRlc3RfdG9wKSwKKyAgICAgIEdkaXBsdXM6OlBvaW50KGRlc3RfbGVmdCwgZGVzdF90b3AgKyBkZXN0X2hlaWdodCl9OwogICBDYWxsRnVuYyhHZGlwRHJhd0ltYWdlUG9pbnRzSSkocEdyYXBoaWNzLCBiaXRtYXAsIGRlc3RpbmF0aW9uUG9pbnRzLCAzKTsKICAgQ2FsbEZ1bmMoR2RpcERpc3Bvc2VJbWFnZSkoYml0bWFwKTsKIH0KIHN0YXRpYyB2b2lkIE91dHB1dEltYWdlKEdwR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwQml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLApAQCAtNjEzLDExICs2ODAsMTEgQEAKICAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwogICBpZiAocEJpdG1hcC0+R2V0QlBQKCkgPT0gMSAmJiAocFNyY1JlY3QtPmxlZnQgJSA4KSkgewogICAgIEZYX1JFQ1QgbmV3X3JlY3QoMCwgMCwgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0KTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBwQ2xvbmVkID0gcEJpdG1hcC0+Q2xvbmUocFNyY1JlY3QpOworICAgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBDbG9uZWQgPSBwQml0bWFwLT5DbG9uZShwU3JjUmVjdCk7CiAgICAgaWYgKCFwQ2xvbmVkKQogICAgICAgcmV0dXJuOwotICAgIE91dHB1dEltYWdlKHBHcmFwaGljcywgcENsb25lZC5nZXQoKSwgJm5ld19yZWN0LCBkZXN0X2xlZnQsIGRlc3RfdG9wLAotICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0KTsKKyAgICBPdXRwdXRJbWFnZShwR3JhcGhpY3MsIHBDbG9uZWQsICZuZXdfcmVjdCwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICBkZXN0X2hlaWdodCk7CiAgICAgcmV0dXJuOwogICB9CiAgIGludCBzcmNfcGl0Y2ggPSBwQml0bWFwLT5HZXRQaXRjaCgpOwpAQCAtNjQ0LDEwICs3MTEsOSBAQAogICAgICAgVUlOVCBwYWxbMjU4XTsKICAgICAgIHBhbFswXSA9IDA7CiAgICAgICBwYWxbMV0gPSAyNTY7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7Ci0gICAgICAgIHBhbFtpICsgMl0gPSBwQml0bWFwLT5HZXRQYWxldHRlRW50cnkoaSk7Ci0gICAgICB9Ci0gICAgICBDYWxsRnVuYyhHZGlwU2V0SW1hZ2VQYWxldHRlKShiaXRtYXAsIChDb2xvclBhbGV0dGUqKXBhbCk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKQorICAgICAgICBwYWxbaSArIDJdID0gcEJpdG1hcC0+R2V0UGFsZXR0ZUFyZ2IoaSk7CisgICAgICBDYWxsRnVuYyhHZGlwU2V0SW1hZ2VQYWxldHRlKShiaXRtYXAsIChHZGlwbHVzOjpDb2xvclBhbGV0dGUqKXBhbCk7CiAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBGWERJQl8xYnBwUmdiOiB7CkBAIC02NjMsNDcgKzcyOSw0NyBAQAogICBpZiAoZGVzdF93aWR0aCA8IDApIHsKICAgICBkZXN0X3dpZHRoLS07CiAgIH0KLSAgUG9pbnQgZGVzdGluYXRpb25Qb2ludHNbXSA9IHtQb2ludChkZXN0X2xlZnQsIGRlc3RfdG9wKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2ludChkZXN0X2xlZnQgKyBkZXN0X3dpZHRoLCBkZXN0X3RvcCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9pbnQoZGVzdF9sZWZ0LCBkZXN0X3RvcCArIGRlc3RfaGVpZ2h0KX07CisgIEdkaXBsdXM6OlBvaW50IGRlc3RpbmF0aW9uUG9pbnRzW10gPSB7CisgICAgICBHZGlwbHVzOjpQb2ludChkZXN0X2xlZnQsIGRlc3RfdG9wKSwKKyAgICAgIEdkaXBsdXM6OlBvaW50KGRlc3RfbGVmdCArIGRlc3Rfd2lkdGgsIGRlc3RfdG9wKSwKKyAgICAgIEdkaXBsdXM6OlBvaW50KGRlc3RfbGVmdCwgZGVzdF90b3AgKyBkZXN0X2hlaWdodCl9OwogICBDYWxsRnVuYyhHZGlwRHJhd0ltYWdlUG9pbnRzSSkocEdyYXBoaWNzLCBiaXRtYXAsIGRlc3RpbmF0aW9uUG9pbnRzLCAzKTsKICAgQ2FsbEZ1bmMoR2RpcERpc3Bvc2VJbWFnZSkoYml0bWFwKTsKIH0KLUNHZGlwbHVzRXh0OjpDR2RpcGx1c0V4dCgpIHsKLSAgbV9oTW9kdWxlID0gbnVsbHB0cjsKLSAgbV9HZGlNb2R1bGUgPSBudWxscHRyOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZiBnX0dkaXBGdW5jTmFtZXMgLyBzaXplb2YoTFBDU1RSKTsgaSsrKSB7Ci0gICAgbV9GdW5jdGlvbnNbaV0gPSBudWxscHRyOwotICB9Ci0gIG1fcEdkaUFkZEZvbnRNZW1SZXNvdXJjZUV4ID0gbnVsbHB0cjsKLSAgbV9wR2RpUmVtb3ZlRm9udE1lbVJlc291cnNlRXggPSBudWxscHRyOworCitDR2RpcGx1c0V4dDo6Q0dkaXBsdXNFeHQoKSB7fQorCitDR2RpcGx1c0V4dDo6fkNHZGlwbHVzRXh0KCkgeworICBGcmVlTGlicmFyeShtX0dkaU1vZHVsZSk7CisgIEZyZWVMaWJyYXJ5KG1faE1vZHVsZSk7CiB9CisKIHZvaWQgQ0dkaXBsdXNFeHQ6OkxvYWQoKSB7Ci0gIENGWF9CeXRlU3RyaW5nIHN0clBsdXNQYXRoID0gIiI7Ci0gIEZYX0NIQVIgYnVmW01BWF9QQVRIXTsKKyAgY2hhciBidWZbTUFYX1BBVEhdOwogICBHZXRTeXN0ZW1EaXJlY3RvcnlBKGJ1ZiwgTUFYX1BBVEgpOwotICBzdHJQbHVzUGF0aCArPSBidWY7Ci0gIHN0clBsdXNQYXRoICs9ICJcXCI7Ci0gIHN0clBsdXNQYXRoICs9ICJHRElQTFVTLkRMTCI7Ci0gIG1faE1vZHVsZSA9IExvYWRMaWJyYXJ5QShzdHJQbHVzUGF0aC5jX3N0cigpKTsKLSAgaWYgKCFtX2hNb2R1bGUpIHsKKyAgQnl0ZVN0cmluZyBkbGxwYXRoID0gYnVmOworICBkbGxwYXRoICs9ICJcXEdESVBMVVMuRExMIjsKKyAgbV9oTW9kdWxlID0gTG9hZExpYnJhcnlBKGRsbHBhdGguY19zdHIoKSk7CisgIGlmICghbV9oTW9kdWxlKQogICAgIHJldHVybjsKLSAgfQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZiBnX0dkaXBGdW5jTmFtZXMgLyBzaXplb2YoTFBDU1RSKTsgaSsrKSB7CisKKyAgbV9GdW5jdGlvbnMucmVzaXplKEZYX0FycmF5U2l6ZShnX0dkaXBGdW5jTmFtZXMpKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZ19HZGlwRnVuY05hbWVzKTsgKytpKSB7CiAgICAgbV9GdW5jdGlvbnNbaV0gPSBHZXRQcm9jQWRkcmVzcyhtX2hNb2R1bGUsIGdfR2RpcEZ1bmNOYW1lc1tpXSk7CiAgICAgaWYgKCFtX0Z1bmN0aW9uc1tpXSkgewogICAgICAgbV9oTW9kdWxlID0gbnVsbHB0cjsKICAgICAgIHJldHVybjsKICAgICB9CiAgIH0KKwogICB1aW50cHRyX3QgZ2RpcGx1c1Rva2VuOwogICBHZGlwbHVzU3RhcnR1cElucHV0IGdkaXBsdXNTdGFydHVwSW5wdXQ7CiAgICgoRnVuY1R5cGVfR2RpcGx1c1N0YXJ0dXApbV9GdW5jdGlvbnNbRnVuY0lkX0dkaXBsdXNTdGFydHVwXSkoCiAgICAgICAmZ2RpcGx1c1Rva2VuLCAmZ2RpcGx1c1N0YXJ0dXBJbnB1dCwgbnVsbHB0cik7CiAgIG1fR2RpTW9kdWxlID0gTG9hZExpYnJhcnlBKCJHREkzMi5ETEwiKTsKLSAgaWYgKCFtX0dkaU1vZHVsZSkgeworICBpZiAoIW1fR2RpTW9kdWxlKQogICAgIHJldHVybjsKLSAgfQorCiAgIG1fcEdkaUFkZEZvbnRNZW1SZXNvdXJjZUV4ID0KICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8RnVuY1R5cGVfR2RpQWRkRm9udE1lbVJlc291cmNlRXg+KAogICAgICAgICAgIEdldFByb2NBZGRyZXNzKG1fR2RpTW9kdWxlLCAiQWRkRm9udE1lbVJlc291cmNlRXgiKSk7CkBAIC03MTEsNyArNzc3LDcgQEAKICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8RnVuY1R5cGVfR2RpUmVtb3ZlRm9udE1lbVJlc291cmNlRXg+KAogICAgICAgICAgIEdldFByb2NBZGRyZXNzKG1fR2RpTW9kdWxlLCAiUmVtb3ZlRm9udE1lbVJlc291cmNlRXgiKSk7CiB9Ci1DR2RpcGx1c0V4dDo6fkNHZGlwbHVzRXh0KCkge30KKwogTFBWT0lEIENHZGlwbHVzRXh0OjpMb2FkTWVtRm9udChMUEJZVEUgcERhdGEsIHVpbnQzMl90IHNpemUpIHsKICAgR3BGb250Q29sbGVjdGlvbiogcENvbGxlY3Rpb24gPSBudWxscHRyOwogICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9CkBAIC03MTksOSArNzg1LDkgQEAKICAgQ2FsbEZ1bmMoR2RpcE5ld1ByaXZhdGVGb250Q29sbGVjdGlvbikoJnBDb2xsZWN0aW9uKTsKICAgR3BTdGF0dXMgc3RhdHVzID0KICAgICAgIENhbGxGdW5jKEdkaXBQcml2YXRlQWRkTWVtb3J5Rm9udCkocENvbGxlY3Rpb24sIHBEYXRhLCBzaXplKTsKLSAgaWYgKHN0YXR1cyA9PSBPaykgeworICBpZiAoc3RhdHVzID09IEdkaXBsdXM6Ok9rKQogICAgIHJldHVybiBwQ29sbGVjdGlvbjsKLSAgfQorCiAgIENhbGxGdW5jKEdkaXBEZWxldGVQcml2YXRlRm9udENvbGxlY3Rpb24pKCZwQ29sbGVjdGlvbik7CiAgIHJldHVybiBudWxscHRyOwogfQpAQCAtNzMwLDEwICs3OTYsMTEgQEAKICAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwogICBDYWxsRnVuYyhHZGlwRGVsZXRlUHJpdmF0ZUZvbnRDb2xsZWN0aW9uKSgoR3BGb250Q29sbGVjdGlvbioqKSZwQ29sbGVjdGlvbik7CiB9Ci1ib29sIENHZGlwbHVzRXh0OjpHZGlwQ3JlYXRlQml0bWFwKENGWF9ESUJpdG1hcCogcEJpdG1hcCwgdm9pZCoqIGJpdG1hcCkgeworYm9vbCBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZUJpdG1hcChjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIGJpdG1hcCkgewogICBDR2RpcGx1c0V4dCYgR2RpcGx1c0V4dCA9CiAgICAgICAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKLSAgUGl4ZWxGb3JtYXQgZm9ybWF0OworICBHZGlwbHVzOjpQaXhlbEZvcm1hdCBmb3JtYXQ7CiAgIHN3aXRjaCAocEJpdG1hcC0+R2V0Rm9ybWF0KCkpIHsKICAgICBjYXNlIEZYRElCX1JnYjoKICAgICAgIGZvcm1hdCA9IFBpeGVsRm9ybWF0MjRicHBSR0I7CkBAIC03NTAsMjIgKzgxNywxNiBAQAogICBHcFN0YXR1cyBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwQ3JlYXRlQml0bWFwRnJvbVNjYW4wKSgKICAgICAgIHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpLCBwQml0bWFwLT5HZXRQaXRjaCgpLCBmb3JtYXQsCiAgICAgICBwQml0bWFwLT5HZXRCdWZmZXIoKSwgKEdwQml0bWFwKiopYml0bWFwKTsKLSAgaWYgKHN0YXR1cyA9PSBPaykgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHN0YXR1cyA9PSBHZGlwbHVzOjpPazsKIH0KIGJvb2wgQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVGcm9tSW1hZ2Uodm9pZCogYml0bWFwLCB2b2lkKiogZ3JhcGhpY3MpIHsKICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQogICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7CiAgIEdwU3RhdHVzIHN0YXR1cyA9IENhbGxGdW5jKEdkaXBHZXRJbWFnZUdyYXBoaWNzQ29udGV4dCkoCiAgICAgICAoR3BCaXRtYXAqKWJpdG1hcCwgKEdwR3JhcGhpY3MqKilncmFwaGljcyk7Ci0gIGlmIChzdGF0dXMgPT0gT2spIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBzdGF0dXMgPT0gR2RpcGx1czo6T2s7CiB9Ci1ib29sIENHZGlwbHVzRXh0OjpHZGlwQ3JlYXRlRm9udEZhbWlseUZyb21OYW1lKGNvbnN0IEZYX1dDSEFSKiBuYW1lLAorYm9vbCBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZUZvbnRGYW1pbHlGcm9tTmFtZShjb25zdCB3Y2hhcl90KiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwRm9udENvbGxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBwRmFtaWx5KSB7CiAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KQEAgLTc3MywxMyArODM0LDEwIEBACiAgIEdwU3RhdHVzIHN0YXR1cyA9IENhbGxGdW5jKEdkaXBDcmVhdGVGb250RmFtaWx5RnJvbU5hbWUpKAogICAgICAgKEdESVBDT05TVCBXQ0hBUiopbmFtZSwgKEdwRm9udENvbGxlY3Rpb24qKXBGb250Q29sbGVjdGlvbiwKICAgICAgIChHcEZvbnRGYW1pbHkqKilwRmFtaWx5KTsKLSAgaWYgKHN0YXR1cyA9PSBPaykgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHN0YXR1cyA9PSBHZGlwbHVzOjpPazsKIH0KIGJvb2wgQ0dkaXBsdXNFeHQ6OkdkaXBDcmVhdGVGb250RnJvbUZhbWlseSh2b2lkKiBwRmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbnRzdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogcEZvbnQpIHsKQEAgLTc4NywyMiArODQ1LDE1IEBACiAgICAgICAoKENXaW4zMlBsYXRmb3JtKilDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRQbGF0Zm9ybURhdGEoKSktPm1fR2RpcGx1c0V4dDsKICAgR3BTdGF0dXMgc3RhdHVzID0KICAgICAgIENhbGxGdW5jKEdkaXBDcmVhdGVGb250KSgoR3BGb250RmFtaWx5KilwRmFtaWx5LCBmb250X3NpemUsIGZvbnRzdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbml0KGZsYWcpLCAoR3BGb250KiopcEZvbnQpOwotICBpZiAoc3RhdHVzID09IE9rKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdkaXBsdXM6OlVuaXQoZmxhZyksIChHcEZvbnQqKilwRm9udCk7CisgIHJldHVybiBzdGF0dXMgPT0gR2RpcGx1czo6T2s7CiB9Ci12b2lkIENHZGlwbHVzRXh0OjpHZGlwR2V0Rm9udFNpemUodm9pZCogcEZvbnQsIEZYX0ZMT0FUKiBzaXplKSB7Cit2b2lkIENHZGlwbHVzRXh0OjpHZGlwR2V0Rm9udFNpemUodm9pZCogcEZvbnQsIGZsb2F0KiBzaXplKSB7CiAgIFJFQUwgZ2V0X3NpemU7CiAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KICAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICBHcFN0YXR1cyBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwR2V0Rm9udFNpemUpKChHcEZvbnQqKXBGb250LCAoUkVBTCopJmdldF9zaXplKTsKLSAgaWYgKHN0YXR1cyA9PSBPaykgewotICAgICpzaXplID0gKEZYX0ZMT0FUKWdldF9zaXplOwotICB9IGVsc2UgewotICAgICpzaXplID0gMDsKLSAgfQorICBHcFN0YXR1cyBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwR2V0Rm9udFNpemUpKChHcEZvbnQqKXBGb250LCAmZ2V0X3NpemUpOworICAqc2l6ZSA9IChzdGF0dXMgPT0gR2RpcGx1czo6T2spID8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGdldF9zaXplKSA6IDA7CiB9CiB2b2lkIENHZGlwbHVzRXh0OjpHZGlwU2V0VGV4dFJlbmRlcmluZ0hpbnQodm9pZCogZ3JhcGhpY3MsIGludCBtb2RlKSB7CiAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KQEAgLTgyOCwxNiArODc5LDE1IEBACiAgIEdwU3RhdHVzIHN0YXR1cyA9IENhbGxGdW5jKEdkaXBEcmF3RHJpdmVyU3RyaW5nKSgKICAgICAgIChHcEdyYXBoaWNzKilncmFwaGljcywgKEdESVBDT05TVCBVSU5UMTYqKXRleHQsIChJTlQpbGVuZ3RoLAogICAgICAgKEdESVBDT05TVCBHcEZvbnQqKWZvbnQsIChHRElQQ09OU1QgR3BCcnVzaCopYnJ1c2gsCi0gICAgICAoR0RJUENPTlNUIFBvaW50RiopcG9zaXRpb25zLCAoSU5UKWZsYWdzLCAoR0RJUENPTlNUIEdwTWF0cml4KiltYXRyaXgpOwotICBpZiAoc3RhdHVzID09IE9rKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOworICAgICAgKEdESVBDT05TVCBHZGlwbHVzOjpQb2ludEYqKXBvc2l0aW9ucywgKElOVClmbGFncywKKyAgICAgIChHRElQQ09OU1QgR3BNYXRyaXgqKW1hdHJpeCk7CisgIHJldHVybiBzdGF0dXMgPT0gR2RpcGx1czo6T2s7CiB9CiB2b2lkIENHZGlwbHVzRXh0OjpHZGlwQ3JlYXRlQnJ1c2godWludDMyX3QgZmlsbF9hcmdiLCB2b2lkKiogcEJydXNoKSB7CiAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KICAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICBDYWxsRnVuYyhHZGlwQ3JlYXRlU29saWRGaWxsKSgoQVJHQilmaWxsX2FyZ2IsIChHcFNvbGlkRmlsbCoqKXBCcnVzaCk7CisgIENhbGxGdW5jKEdkaXBDcmVhdGVTb2xpZEZpbGwpKChHZGlwbHVzOjpBUkdCKWZpbGxfYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdwU29saWRGaWxsKiopcEJydXNoKTsKIH0KIHZvaWQgQ0dkaXBsdXNFeHQ6OkdkaXBEZWxldGVCcnVzaCh2b2lkKiBwQnJ1c2gpIHsKICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQpAQCAtODQ1LDM2ICs4OTUsMzYgQEAKICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZUJydXNoKSgoR3BTb2xpZEZpbGwqKXBCcnVzaCk7CiB9CiB2b2lkKiBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZUZvbnRGcm9tQ29sbGVjdGlvbih2b2lkKiBwRm9udENvbGxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9udHN0eWxlKSB7CiAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KICAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwogICBpbnQgbnVtRmFtaWxpZXMgPSAwOwogICBHcFN0YXR1cyBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwR2V0Rm9udENvbGxlY3Rpb25GYW1pbHlDb3VudCkoCiAgICAgICAoR3BGb250Q29sbGVjdGlvbiopcEZvbnRDb2xsZWN0aW9uLCAmbnVtRmFtaWxpZXMpOwotICBpZiAoc3RhdHVzICE9IE9rKSB7CisgIGlmIChzdGF0dXMgIT0gR2RpcGx1czo6T2spCiAgICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KKwogICBHcEZvbnRGYW1pbHkqIGZhbWlseV9saXN0WzFdOwogICBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwR2V0Rm9udENvbGxlY3Rpb25GYW1pbHlMaXN0KSgKICAgICAgIChHcEZvbnRDb2xsZWN0aW9uKilwRm9udENvbGxlY3Rpb24sIDEsIGZhbWlseV9saXN0LCAmbnVtRmFtaWxpZXMpOwotICBpZiAoc3RhdHVzICE9IE9rKSB7CisgIGlmIChzdGF0dXMgIT0gR2RpcGx1czo6T2spCiAgICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KKwogICBHcEZvbnQqIHBGb250ID0gbnVsbHB0cjsKICAgc3RhdHVzID0gQ2FsbEZ1bmMoR2RpcENyZWF0ZUZvbnQpKGZhbWlseV9saXN0WzBdLCBmb250X3NpemUsIGZvbnRzdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaXRQaXhlbCwgJnBGb250KTsKLSAgaWYgKHN0YXR1cyAhPSBPaykgeworICBpZiAoc3RhdHVzICE9IEdkaXBsdXM6Ok9rKQogICAgIHJldHVybiBudWxscHRyOwotICB9CisKICAgcmV0dXJuIHBGb250OwogfQotdm9pZCBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZU1hdHJpeChGWF9GTE9BVCBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmLAordm9pZCBDR2RpcGx1c0V4dDo6R2RpcENyZWF0ZU1hdHJpeChmbG9hdCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogbWF0cml4KSB7CiAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KICAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwpAQCAtOTEyLDcgKzk2Miw3IEBACiB9CiBib29sIENHZGlwbHVzRXh0OjpTdHJldGNoQml0TWFzayhIREMgaERDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBiTW9ub0RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwQml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLApAQCAtOTM4LDcgKzk4OCw3IEBACiAgIHJldHVybiB0cnVlOwogfQogYm9vbCBDR2RpcGx1c0V4dDo6U3RyZXRjaERJQml0cyhIREMgaERDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwQml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLApAQCAtOTcyLDE3ICsxMDIyLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRleHRNb2RlID0gZmFsc2UpIHsKICAgQ0dkaXBsdXNFeHQmIEdkaXBsdXNFeHQgPQogICAgICAgKChDV2luMzJQbGF0Zm9ybSopQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0UGxhdGZvcm1EYXRhKCkpLT5tX0dkaXBsdXNFeHQ7Ci0gIEZYX0ZMT0FUIHdpZHRoID0gcEdyYXBoU3RhdGUgPyBwR3JhcGhTdGF0ZS0+bV9MaW5lV2lkdGggOiAxLjBmOworICBmbG9hdCB3aWR0aCA9IHBHcmFwaFN0YXRlID8gcEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoIDogMS4wZjsKICAgaWYgKCFiVGV4dE1vZGUpIHsKLSAgICBGWF9GTE9BVCB1bml0ID0KLSAgICAgICAgcE1hdHJpeCA/IDEuMGYgLyAoKHBNYXRyaXgtPkdldFhVbml0KCkgKyBwTWF0cml4LT5HZXRZVW5pdCgpKSAvIDIpCi0gICAgICAgICAgICAgICAgOiAxLjBmOwotICAgIGlmICh3aWR0aCA8IHVuaXQpIHsKKyAgICBmbG9hdCB1bml0ID0gcE1hdHJpeAorICAgICAgICAgICAgICAgICAgICAgPyAxLjBmIC8gKChwTWF0cml4LT5HZXRYVW5pdCgpICsgcE1hdHJpeC0+R2V0WVVuaXQoKSkgLyAyKQorICAgICAgICAgICAgICAgICAgICAgOiAxLjBmOworICAgIGlmICh3aWR0aCA8IHVuaXQpCiAgICAgICB3aWR0aCA9IHVuaXQ7Ci0gICAgfQogICB9CiAgIEdwUGVuKiBwUGVuID0gbnVsbHB0cjsKLSAgQ2FsbEZ1bmMoR2RpcENyZWF0ZVBlbjEpKChBUkdCKWFyZ2IsIHdpZHRoLCBVbml0V29ybGQsICZwUGVuKTsKKyAgQ2FsbEZ1bmMoR2RpcENyZWF0ZVBlbjEpKChHZGlwbHVzOjpBUkdCKWFyZ2IsIHdpZHRoLCBVbml0V29ybGQsICZwUGVuKTsKICAgTGluZUNhcCBsaW5lQ2FwID0gTGluZUNhcEZsYXQ7CiAgIERhc2hDYXAgZGFzaENhcCA9IERhc2hDYXBGbGF0OwogICBib29sIGJEYXNoRXh0ZW5kID0gZmFsc2U7CkBAIC0xMDE1LDE4ICsxMDY0LDE3IEBACiAgIH0KICAgQ2FsbEZ1bmMoR2RpcFNldFBlbkxpbmVKb2luKShwUGVuLCBsaW5lSm9pbik7CiAgIGlmIChwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQpIHsKLSAgICBGWF9GTE9BVCogcERhc2hBcnJheSA9IEZYX0FsbG9jKAotICAgICAgICBGWF9GTE9BVCwgcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50ICsgcEdyYXBoU3RhdGUtPm1fRGFzaENvdW50ICUgMik7CisgICAgZmxvYXQqIHBEYXNoQXJyYXkgPSBGWF9BbGxvYygKKyAgICAgICAgZmxvYXQsIHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCArIHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCAlIDIpOwogICAgIGludCBuQ291bnQgPSAwOwotICAgIEZYX0ZMT0FUIG9uX2xlZnRvdmVyID0gMCwgb2ZmX2xlZnRvdmVyID0gMDsKKyAgICBmbG9hdCBvbl9sZWZ0b3ZlciA9IDAsIG9mZl9sZWZ0b3ZlciA9IDA7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQ7IGkgKz0gMikgewotICAgICAgRlhfRkxPQVQgb25fcGhhc2UgPSBwR3JhcGhTdGF0ZS0+bV9EYXNoQXJyYXlbaV07Ci0gICAgICBGWF9GTE9BVCBvZmZfcGhhc2U7Ci0gICAgICBpZiAoaSA9PSBwR3JhcGhTdGF0ZS0+bV9EYXNoQ291bnQgLSAxKSB7CisgICAgICBmbG9hdCBvbl9waGFzZSA9IHBHcmFwaFN0YXRlLT5tX0Rhc2hBcnJheVtpXTsKKyAgICAgIGZsb2F0IG9mZl9waGFzZTsKKyAgICAgIGlmIChpID09IHBHcmFwaFN0YXRlLT5tX0Rhc2hDb3VudCAtIDEpCiAgICAgICAgIG9mZl9waGFzZSA9IG9uX3BoYXNlOwotICAgICAgfSBlbHNlIHsKKyAgICAgIGVsc2UKICAgICAgICAgb2ZmX3BoYXNlID0gcEdyYXBoU3RhdGUtPm1fRGFzaEFycmF5W2kgKyAxXTsKLSAgICAgIH0KICAgICAgIG9uX3BoYXNlIC89IHdpZHRoOwogICAgICAgb2ZmX3BoYXNlIC89IHdpZHRoOwogICAgICAgaWYgKG9uX3BoYXNlICsgb2ZmX3BoYXNlIDw9IDAuMDAwMDJmKSB7CkBAIC0xMDM0LDExICsxMDgyLDEwIEBACiAgICAgICAgIG9mZl9waGFzZSA9IDEuMGYgLyAxMDsKICAgICAgIH0KICAgICAgIGlmIChiRGFzaEV4dGVuZCkgewotICAgICAgICBpZiAob2ZmX3BoYXNlIDwgMSkgeworICAgICAgICBpZiAob2ZmX3BoYXNlIDwgMSkKICAgICAgICAgICBvZmZfcGhhc2UgPSAwOwotICAgICAgICB9IGVsc2UgeworICAgICAgICBlbHNlCiAgICAgICAgICAgb2ZmX3BoYXNlIC09IDE7Ci0gICAgICAgIH0KICAgICAgICAgb25fcGhhc2UgKz0gMTsKICAgICAgIH0KICAgICAgIGlmIChvbl9waGFzZSA9PSAwIHx8IG9mZl9waGFzZSA9PSAwKSB7CkBAIC0xMDU3LDEzICsxMTA0LDEyIEBACiAgICAgICB9CiAgICAgfQogICAgIENhbGxGdW5jKEdkaXBTZXRQZW5EYXNoQXJyYXkpKHBQZW4sIHBEYXNoQXJyYXksIG5Db3VudCk7Ci0gICAgRlhfRkxPQVQgcGhhc2UgPSBwR3JhcGhTdGF0ZS0+bV9EYXNoUGhhc2U7CisgICAgZmxvYXQgcGhhc2UgPSBwR3JhcGhTdGF0ZS0+bV9EYXNoUGhhc2U7CiAgICAgaWYgKGJEYXNoRXh0ZW5kKSB7Ci0gICAgICBpZiAocGhhc2UgPCAwLjVmKSB7CisgICAgICBpZiAocGhhc2UgPCAwLjVmKQogICAgICAgICBwaGFzZSA9IDA7Ci0gICAgICB9IGVsc2UgeworICAgICAgZWxzZQogICAgICAgICBwaGFzZSAtPSAwLjVmOwotICAgICAgfQogICAgIH0KICAgICBDYWxsRnVuYyhHZGlwU2V0UGVuRGFzaE9mZnNldCkocFBlbiwgcGhhc2UpOwogICAgIEZYX0ZyZWUocERhc2hBcnJheSk7CkBAIC0xMDcyLDcgKzExMTgsNyBAQAogICBDYWxsRnVuYyhHZGlwU2V0UGVuTWl0ZXJMaW1pdCkocFBlbiwgcEdyYXBoU3RhdGUtPm1fTWl0ZXJMaW1pdCk7CiAgIHJldHVybiBwUGVuOwogfQotc3RhdGljIGJvb2wgSXNTbWFsbFRyaWFuZ2xlKFBvaW50RiogcG9pbnRzLAorc3RhdGljIGJvb2wgSXNTbWFsbFRyaWFuZ2xlKEdkaXBsdXM6OlBvaW50RiogcG9pbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiB2MSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIHYyKSB7CkBAIC0xMDg5LDcgKzExMzUsNyBAQAogICAgIH0KIAogICAgIENGWF9Qb2ludEYgZGlmZiA9IHAxIC0gcDI7Ci0gICAgRlhfRkxPQVQgZGlzdGFuY2Vfc3F1YXJlID0gKGRpZmYueCAqIGRpZmYueCkgKyAoZGlmZi55ICogZGlmZi55KTsKKyAgICBmbG9hdCBkaXN0YW5jZV9zcXVhcmUgPSAoZGlmZi54ICogZGlmZi54KSArIChkaWZmLnkgKiBkaWZmLnkpOwogICAgIGlmIChkaXN0YW5jZV9zcXVhcmUgPCAoMS4wZiAqIDIgKyAxLjBmIC8gNCkpIHsKICAgICAgIHYxID0gaTsKICAgICAgIHYyID0gcGFpcjE7CkBAIC0xMTIyLDcgKzExNjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2JqZWN0MkRldmljZS0+ZSwgcE9iamVjdDJEZXZpY2UtPmYsICZwTWF0cml4KTsKICAgICBDYWxsRnVuYyhHZGlwU2V0V29ybGRUcmFuc2Zvcm0pKHBHcmFwaGljcywgcE1hdHJpeCk7CiAgIH0KLSAgUG9pbnRGKiBwb2ludHMgPSBGWF9BbGxvYyhQb2ludEYsIHBQb2ludHMuc2l6ZSgpKTsKKyAgR2RpcGx1czo6UG9pbnRGKiBwb2ludHMgPSBGWF9BbGxvYyhHZGlwbHVzOjpQb2ludEYsIHBQb2ludHMuc2l6ZSgpKTsKICAgQllURSogdHlwZXMgPSBGWF9BbGxvYyhCWVRFLCBwUG9pbnRzLnNpemUoKSk7CiAgIGludCBuU3ViUGF0aGVzID0gMDsKICAgYm9vbCBiU3ViQ2xvc2UgPSBmYWxzZTsKQEAgLTExNjIsMzcgKzEyMDgsMzMgQEAKICAgICAgICAgY29udGludWU7CiAgICAgICB9CiAgICAgICBpZiAoIWJTbW9vdGggJiYgcG9pbnRzW2ldLlggIT0gcG9pbnRzW2kgLSAxXS5YICYmCi0gICAgICAgICAgcG9pbnRzW2ldLlkgIT0gcG9pbnRzW2kgLSAxXS5ZKSB7CisgICAgICAgICAgcG9pbnRzW2ldLlkgIT0gcG9pbnRzW2kgLSAxXS5ZKQogICAgICAgICBiU21vb3RoID0gdHJ1ZTsKLSAgICAgIH0KICAgICB9IGVsc2UgaWYgKHBvaW50X3R5cGUgPT0gRlhQVF9UWVBFOjpCZXppZXJUbykgewogICAgICAgdHlwZXNbaV0gPSBQYXRoUG9pbnRUeXBlQmV6aWVyOwogICAgICAgYlNtb290aCA9IHRydWU7CiAgICAgfQogICAgIGlmIChwUG9pbnRzW2ldLm1fQ2xvc2VGaWd1cmUpIHsKLSAgICAgIGlmIChiU3ViQ2xvc2UpIHsKKyAgICAgIGlmIChiU3ViQ2xvc2UpCiAgICAgICAgIHR5cGVzW3Bvc19zdWJjbG9zZV0gJj0gflBhdGhQb2ludFR5cGVDbG9zZVN1YnBhdGg7Ci0gICAgICB9IGVsc2UgeworICAgICAgZWxzZQogICAgICAgICBiU3ViQ2xvc2UgPSB0cnVlOwotICAgICAgfQogICAgICAgcG9zX3N1YmNsb3NlID0gaTsKICAgICAgIHR5cGVzW2ldIHw9IFBhdGhQb2ludFR5cGVDbG9zZVN1YnBhdGg7CiAgICAgICBpZiAoIWJTbW9vdGggJiYgcG9pbnRzW2ldLlggIT0gcG9pbnRzW3N0YXJ0cG9pbnRdLlggJiYKLSAgICAgICAgICBwb2ludHNbaV0uWSAhPSBwb2ludHNbc3RhcnRwb2ludF0uWSkgeworICAgICAgICAgIHBvaW50c1tpXS5ZICE9IHBvaW50c1tzdGFydHBvaW50XS5ZKQogICAgICAgICBiU21vb3RoID0gdHJ1ZTsKLSAgICAgIH0KICAgICB9CiAgIH0KICAgaWYgKGZpbGxfbW9kZSAmIEZYRklMTF9OT1BBVEhTTU9PVEgpIHsKICAgICBiU21vb3RoID0gZmFsc2U7CiAgICAgQ2FsbEZ1bmMoR2RpcFNldFNtb290aGluZ01vZGUpKHBHcmFwaGljcywgU21vb3RoaW5nTW9kZU5vbmUpOwogICB9IGVsc2UgaWYgKCEoZmlsbF9tb2RlICYgRlhGSUxMX0ZVTExDT1ZFUikpIHsKLSAgICBpZiAoIWJTbW9vdGggJiYgKGZpbGxfbW9kZSAmIDMpKSB7CisgICAgaWYgKCFiU21vb3RoICYmIChmaWxsX21vZGUgJiAzKSkKICAgICAgIGJTbW9vdGggPSB0cnVlOwotICAgIH0KLSAgICBpZiAoYlNtb290aCB8fCAocEdyYXBoU3RhdGUgJiYgcEdyYXBoU3RhdGUtPm1fTGluZVdpZHRoID4gMikpIHsKKworICAgIGlmIChiU21vb3RoIHx8IChwR3JhcGhTdGF0ZSAmJiBwR3JhcGhTdGF0ZS0+bV9MaW5lV2lkdGggPiAyKSkKICAgICAgIENhbGxGdW5jKEdkaXBTZXRTbW9vdGhpbmdNb2RlKShwR3JhcGhpY3MsIFNtb290aGluZ01vZGVBbnRpQWxpYXMpOwotICAgIH0KICAgfQogICBpbnQgbmV3X2ZpbGxfbW9kZSA9IGZpbGxfbW9kZSAmIDM7CiAgIGlmIChwUG9pbnRzLnNpemUoKSA9PSA0ICYmICFwR3JhcGhTdGF0ZSkgewpAQCAtMTI0Niw5ICsxMjg4LDggQEAKICAgICB9CiAgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZVBlbikocFBlbik7CiAgIH0KLSAgaWYgKHBNYXRyaXgpIHsKKyAgaWYgKHBNYXRyaXgpCiAgICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZU1hdHJpeCkocE1hdHJpeCk7Ci0gIH0KICAgRlhfRnJlZShwb2ludHMpOwogICBGWF9GcmVlKHR5cGVzKTsKICAgQ2FsbEZ1bmMoR2RpcERlbGV0ZVBhdGgpKHBHcFBhdGgpOwpAQCAtMTI4MywzOSArMTMyNCwzNiBAQAogICB9CiAKICAgLy8gSVNlcXVlbnRpYWxTdHJlYW0KLSAgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBSZWFkKHZvaWQqIE91dHB1dCwKKyAgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBSZWFkKHZvaWQqIG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVMT05HIGNiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxPTkcqIHBjYlJlYWQpIG92ZXJyaWRlIHsKLSAgICBzaXplX3QgYnl0ZXNfbGVmdDsKLSAgICBzaXplX3QgYnl0ZXNfb3V0OwotICAgIGlmIChwY2JSZWFkKSB7CisgICAgaWYgKHBjYlJlYWQpCiAgICAgICAqcGNiUmVhZCA9IDA7Ci0gICAgfQotICAgIGlmIChtX1JlYWRQb3MgPT0gbV9JbnRlclN0cmVhbS5HZXRMZW5ndGgoKSkgeworCisgICAgaWYgKG1fUmVhZFBvcyA+PSBtX0ludGVyU3RyZWFtLnRlbGxwKCkpCiAgICAgICByZXR1cm4gSFJFU1VMVF9GUk9NX1dJTjMyKEVSUk9SX0VORF9PRl9NRURJQSk7Ci0gICAgfQotICAgIGJ5dGVzX2xlZnQgPSBtX0ludGVyU3RyZWFtLkdldExlbmd0aCgpIC0gbV9SZWFkUG9zOwotICAgIGJ5dGVzX291dCA9IHN0ZDo6bWluKHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PHNpemVfdD4oY2IpLCBieXRlc19sZWZ0KTsKLSAgICBGWFNZU19tZW1jcHkoT3V0cHV0LCBtX0ludGVyU3RyZWFtLkdldEJ1ZmZlcigpICsgbV9SZWFkUG9zLCBieXRlc19vdXQpOwotICAgIG1fUmVhZFBvcyArPSAoaW50MzJfdClieXRlc19vdXQ7Ci0gICAgaWYgKHBjYlJlYWQpIHsKKworICAgIHNpemVfdCBieXRlc19sZWZ0ID0gbV9JbnRlclN0cmVhbS50ZWxscCgpIC0gbV9SZWFkUG9zOworICAgIHNpemVfdCBieXRlc19vdXQgPQorICAgICAgICBzdGQ6Om1pbihwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxzaXplX3Q+KGNiKSwgYnl0ZXNfbGVmdCk7CisgICAgbWVtY3B5KG91dHB1dCwgbV9JbnRlclN0cmVhbS5zdHIoKS5jX3N0cigpICsgbV9SZWFkUG9zLCBieXRlc19vdXQpOworICAgIG1fUmVhZFBvcyArPSBieXRlc19vdXQ7CisgICAgaWYgKHBjYlJlYWQpCiAgICAgICAqcGNiUmVhZCA9IChVTE9ORylieXRlc19vdXQ7Ci0gICAgfQorCiAgICAgcmV0dXJuIFNfT0s7CiAgIH0KLSAgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBXcml0ZSh2b2lkIGNvbnN0KiBJbnB1dCwKKyAgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBXcml0ZShjb25zdCB2b2lkKiBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyBjYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVTE9ORyogcGNiV3JpdHRlbikgb3ZlcnJpZGUgewogICAgIGlmIChjYiA8PSAwKSB7Ci0gICAgICBpZiAocGNiV3JpdHRlbikgeworICAgICAgaWYgKHBjYldyaXR0ZW4pCiAgICAgICAgICpwY2JXcml0dGVuID0gMDsKLSAgICAgIH0KICAgICAgIHJldHVybiBTX09LOwogICAgIH0KLSAgICBtX0ludGVyU3RyZWFtLkluc2VydEJsb2NrKG1fSW50ZXJTdHJlYW0uR2V0TGVuZ3RoKCksIElucHV0LCBjYik7Ci0gICAgaWYgKHBjYldyaXR0ZW4pIHsKKyAgICBtX0ludGVyU3RyZWFtLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGlucHV0KSwgY2IpOworICAgIGlmIChwY2JXcml0dGVuKQogICAgICAgKnBjYldyaXR0ZW4gPSBjYjsKLSAgICB9CiAgICAgcmV0dXJuIFNfT0s7CiAgIH0KIApAQCAtMTM0Nyw4ICsxMzg1LDggQEAKICAgSFJFU1VMVCBTVERNRVRIT0RDQUxMVFlQRSBTZWVrKExBUkdFX0lOVEVHRVIgbGlEaXN0YW5jZVRvTW92ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3T3JpZ2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUxBUkdFX0lOVEVHRVIqIGxwTmV3RmlsZVBvaW50ZXIpIG92ZXJyaWRlIHsKLSAgICBsb25nIHN0YXJ0ID0gMDsKLSAgICBsb25nIG5ld19yZWFkX3Bvc2l0aW9uOworICAgIHN0ZDo6c3RyZWFtb2ZmIHN0YXJ0OworICAgIHN0ZDo6c3RyZWFtb2ZmIG5ld19yZWFkX3Bvc2l0aW9uOwogICAgIHN3aXRjaCAoZHdPcmlnaW4pIHsKICAgICAgIGNhc2UgU1RSRUFNX1NFRUtfU0VUOgogICAgICAgICBzdGFydCA9IDA7CkBAIC0xMzU3LDM3ICsxMzk1LDM1IEBACiAgICAgICAgIHN0YXJ0ID0gbV9SZWFkUG9zOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgU1RSRUFNX1NFRUtfRU5EOgotICAgICAgICBzdGFydCA9IG1fSW50ZXJTdHJlYW0uR2V0TGVuZ3RoKCk7CisgICAgICAgIHN0YXJ0ID0gbV9JbnRlclN0cmVhbS50ZWxscCgpOwogICAgICAgICBicmVhazsKICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBTVEdfRV9JTlZBTElERlVOQ1RJT047Ci0gICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBuZXdfcmVhZF9wb3NpdGlvbiA9IHN0YXJ0ICsgKGxvbmcpbGlEaXN0YW5jZVRvTW92ZS5RdWFkUGFydDsKLSAgICBpZiAobmV3X3JlYWRfcG9zaXRpb24gPCAwIHx8Ci0gICAgICAgIG5ld19yZWFkX3Bvc2l0aW9uID4gbV9JbnRlclN0cmVhbS5HZXRMZW5ndGgoKSkgeworICAgIG5ld19yZWFkX3Bvc2l0aW9uID0gc3RhcnQgKyBsaURpc3RhbmNlVG9Nb3ZlLlF1YWRQYXJ0OworICAgIGlmIChuZXdfcmVhZF9wb3NpdGlvbiA+IG1fSW50ZXJTdHJlYW0udGVsbHAoKSkKICAgICAgIHJldHVybiBTVEdfRV9TRUVLRVJST1I7Ci0gICAgfQorCiAgICAgbV9SZWFkUG9zID0gbmV3X3JlYWRfcG9zaXRpb247Ci0gICAgaWYgKGxwTmV3RmlsZVBvaW50ZXIpIHsKKyAgICBpZiAobHBOZXdGaWxlUG9pbnRlcikKICAgICAgIGxwTmV3RmlsZVBvaW50ZXItPlF1YWRQYXJ0ID0gbV9SZWFkUG9zOwotICAgIH0KKwogICAgIHJldHVybiBTX09LOwogICB9CiAgIEhSRVNVTFQgU1RETUVUSE9EQ0FMTFRZUEUgU3RhdChTVEFUU1RHKiBwU3RhdHN0ZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGdyZlN0YXRGbGFnKSBvdmVycmlkZSB7Ci0gICAgaWYgKCFwU3RhdHN0ZykgeworICAgIGlmICghcFN0YXRzdGcpCiAgICAgICByZXR1cm4gU1RHX0VfSU5WQUxJREZVTkNUSU9OOwotICAgIH0KKwogICAgIFplcm9NZW1vcnkocFN0YXRzdGcsIHNpemVvZihTVEFUU1RHKSk7Ci0gICAgcFN0YXRzdGctPmNiU2l6ZS5RdWFkUGFydCA9IG1fSW50ZXJTdHJlYW0uR2V0TGVuZ3RoKCk7CisgICAgcFN0YXRzdGctPmNiU2l6ZS5RdWFkUGFydCA9IG1fSW50ZXJTdHJlYW0udGVsbHAoKTsKICAgICByZXR1cm4gU19PSzsKICAgfQogCiAgcHJpdmF0ZToKICAgTE9ORyBtX1JlZkNvdW50OwotICBpbnQgbV9SZWFkUG9zOwotICBDRlhfQnl0ZVRleHRCdWYgbV9JbnRlclN0cmVhbTsKKyAgc3RkOjpzdHJlYW1vZmYgbV9SZWFkUG9zOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gbV9JbnRlclN0cmVhbTsKIH07CiAKIHR5cGVkZWYgc3RydWN0IHsKQEAgLTEzOTUsNyArMTQzMSw3IEBACiAgIGludCBTdHJpZGU7CiAgIExQQllURSBwU2NhbjA7CiAgIEdwQml0bWFwKiBwQml0bWFwOwotICBCaXRtYXBEYXRhKiBwQml0bWFwRGF0YTsKKyAgR2RpcGx1czo6Qml0bWFwRGF0YSogcEJpdG1hcERhdGE7CiAgIEdwU3RyZWFtKiBwU3RyZWFtOwogfSBQUkVWSUVXM19ESUJJVE1BUDsKIApAQCAtMTQwNCwyOCArMTQ0MCwyOCBAQAogICBHcFN0cmVhbSogcFN0cmVhbSA9IG51bGxwdHI7CiAgIENHZGlwbHVzRXh0JiBHZGlwbHVzRXh0ID0KICAgICAgICgoQ1dpbjMyUGxhdGZvcm0qKUNGWF9HRU1vZHVsZTo6R2V0KCktPkdldFBsYXRmb3JtRGF0YSgpKS0+bV9HZGlwbHVzRXh0OwotICBTdGF0dXMgc3RhdHVzID0gT2s7CisgIEdkaXBsdXM6OlN0YXR1cyBzdGF0dXMgPSBHZGlwbHVzOjpPazsKICAgaWYgKGFyZ3MuZmxhZ3MgPT0gV0lORElCX09QRU5fUEFUSE5BTUUpIHsKICAgICBzdGF0dXMgPSBDYWxsRnVuYyhHZGlwQ3JlYXRlQml0bWFwRnJvbUZpbGVJQ00pKCh3Y2hhcl90KilhcmdzLnBhdGhfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQml0bWFwKTsKICAgfSBlbHNlIHsKLSAgICBpZiAoYXJncy5tZW1vcnlfc2l6ZSA9PSAwIHx8ICFhcmdzLm1lbW9yeV9iYXNlKSB7CisgICAgaWYgKGFyZ3MubWVtb3J5X3NpemUgPT0gMCB8fCAhYXJncy5tZW1vcnlfYmFzZSkKICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KKwogICAgIHBTdHJlYW0gPSBuZXcgR3BTdHJlYW07CiAgICAgcFN0cmVhbS0+V3JpdGUoYXJncy5tZW1vcnlfYmFzZSwgKFVMT05HKWFyZ3MubWVtb3J5X3NpemUsIG51bGxwdHIpOwogICAgIHN0YXR1cyA9IENhbGxGdW5jKEdkaXBDcmVhdGVCaXRtYXBGcm9tU3RyZWFtSUNNKShwU3RyZWFtLCAmcEJpdG1hcCk7CiAgIH0KLSAgaWYgKHN0YXR1cyAhPSBPaykgewotICAgIGlmIChwU3RyZWFtKSB7CisgIGlmIChzdGF0dXMgIT0gR2RpcGx1czo6T2spIHsKKyAgICBpZiAocFN0cmVhbSkKICAgICAgIHBTdHJlYW0tPlJlbGVhc2UoKTsKLSAgICB9CisKICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQogICBVSU5UIGhlaWdodCwgd2lkdGg7CiAgIENhbGxGdW5jKEdkaXBHZXRJbWFnZUhlaWdodCkocEJpdG1hcCwgJmhlaWdodCk7CiAgIENhbGxGdW5jKEdkaXBHZXRJbWFnZVdpZHRoKShwQml0bWFwLCAmd2lkdGgpOwotICBQaXhlbEZvcm1hdCBwaXhlbF9mb3JtYXQ7CisgIEdkaXBsdXM6OlBpeGVsRm9ybWF0IHBpeGVsX2Zvcm1hdDsKICAgQ2FsbEZ1bmMoR2RpcEdldEltYWdlUGl4ZWxGb3JtYXQpKHBCaXRtYXAsICZwaXhlbF9mb3JtYXQpOwogICBpbnQgaW5mb19zaXplID0gc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpOwogICBpbnQgYnBwID0gMjQ7CkBAIC0xNDQ5LDggKzE0ODUsOCBAQAogICBwYm1paC0+YmlIZWlnaHQgPSAtKGludCloZWlnaHQ7CiAgIHBibWloLT5iaVBsYW5lcyA9IDE7CiAgIHBibWloLT5iaVdpZHRoID0gd2lkdGg7Ci0gIFJlY3QgcmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKLSAgQml0bWFwRGF0YSogcEJpdG1hcERhdGEgPSBGWF9BbGxvYyhCaXRtYXBEYXRhLCAxKTsKKyAgR2RpcGx1czo6UmVjdCByZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOworICBHZGlwbHVzOjpCaXRtYXBEYXRhKiBwQml0bWFwRGF0YSA9IEZYX0FsbG9jKEdkaXBsdXM6OkJpdG1hcERhdGEsIDEpOwogICBDYWxsRnVuYyhHZGlwQml0bWFwTG9ja0JpdHMpKHBCaXRtYXAsICZyZWN0LCBJbWFnZUxvY2tNb2RlUmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3BpeGVsX2Zvcm1hdCwgcEJpdG1hcERhdGEpOwogICBpZiAocGl4ZWxfZm9ybWF0ID09IFBpeGVsRm9ybWF0MWJwcEluZGV4ZWQgfHwKQEAgLTE0NjMsNyArMTQ5OSw3IEBACiAgICAgfSBwYWw7CiAgICAgaW50IHNpemUgPSAwOwogICAgIENhbGxGdW5jKEdkaXBHZXRJbWFnZVBhbGV0dGVTaXplKShwQml0bWFwLCAmc2l6ZSk7Ci0gICAgQ2FsbEZ1bmMoR2RpcEdldEltYWdlUGFsZXR0ZSkocEJpdG1hcCwgKENvbG9yUGFsZXR0ZSopJnBhbCwgc2l6ZSk7CisgICAgQ2FsbEZ1bmMoR2RpcEdldEltYWdlUGFsZXR0ZSkocEJpdG1hcCwgKEdkaXBsdXM6OkNvbG9yUGFsZXR0ZSopJnBhbCwgc2l6ZSk7CiAgICAgaW50IGVudHJpZXMgPSBwaXhlbF9mb3JtYXQgPT0gUGl4ZWxGb3JtYXQxYnBwSW5kZXhlZCA/IDIgOiAyNTY7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzOyBpKyspIHsKICAgICAgIHBwYWxbaV0gPSBwYWwuRW50cmllc1tpXSAmIDB4MDBmZmZmZmY7CkBAIC0xNDg2LDMzICsxNTIyLDM0IEBACiAgIENhbGxGdW5jKEdkaXBEaXNwb3NlSW1hZ2UpKHBJbmZvLT5wQml0bWFwKTsKICAgRlhfRnJlZShwSW5mby0+cEJpdG1hcERhdGEpOwogICBGWF9GcmVlKChMUEJZVEUpcEluZm8tPnBibWkpOwotICBpZiAocEluZm8tPnBTdHJlYW0pIHsKKyAgaWYgKHBJbmZvLT5wU3RyZWFtKQogICAgIHBJbmZvLT5wU3RyZWFtLT5SZWxlYXNlKCk7Ci0gIH0KICAgRlhfRnJlZShwSW5mbyk7CiB9CiAKLUNGWF9ESUJpdG1hcCogX0ZYX1dpbmRvd3NESUJfTG9hZEZyb21CdWYoQklUTUFQSU5GTyogcGJtaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIHBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJBbHBoYSk7Ci1DRlhfRElCaXRtYXAqIENHZGlwbHVzRXh0OjpMb2FkRElCaXRtYXAoV0lORElCX09wZW5fQXJnc18gYXJncykgeworLy8gVE9ETyh0c2VwZXopOiBSZWFsbHk/IFJlYWxseT8gTW92ZSB0byBoZWFkZXIuCitSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBfRlhfV2luZG93c0RJQl9Mb2FkRnJvbUJ1ZihCSVRNQVBJTkZPKiBwYm1pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBWT0lEIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWxwaGEpOworCitSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBDR2RpcGx1c0V4dDo6TG9hZERJQml0bWFwKFdJTkRJQl9PcGVuX0FyZ3NfIGFyZ3MpIHsKICAgUFJFVklFVzNfRElCSVRNQVAqIHBJbmZvID0gOjpMb2FkRElCaXRtYXAoYXJncyk7Ci0gIGlmICghcEluZm8pIHsKKyAgaWYgKCFwSW5mbykKICAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQorCiAgIGludCBoZWlnaHQgPSBhYnMocEluZm8tPnBibWktPmJtaUhlYWRlci5iaUhlaWdodCk7CiAgIGludCB3aWR0aCA9IHBJbmZvLT5wYm1pLT5ibWlIZWFkZXIuYmlXaWR0aDsKICAgaW50IGRlc3RfcGl0Y2ggPSAod2lkdGggKiBwSW5mby0+cGJtaS0+Ym1pSGVhZGVyLmJpQml0Q291bnQgKyAzMSkgLyAzMiAqIDQ7CiAgIExQQllURSBwRGF0YSA9IEZYX0FsbG9jMkQoQllURSwgZGVzdF9waXRjaCwgaGVpZ2h0KTsKICAgaWYgKGRlc3RfcGl0Y2ggPT0gcEluZm8tPlN0cmlkZSkgewotICAgIEZYU1lTX21lbWNweShwRGF0YSwgcEluZm8tPnBTY2FuMCwgZGVzdF9waXRjaCAqIGhlaWdodCk7CisgICAgbWVtY3B5KHBEYXRhLCBwSW5mby0+cFNjYW4wLCBkZXN0X3BpdGNoICogaGVpZ2h0KTsKICAgfSBlbHNlIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7Ci0gICAgICBGWFNZU19tZW1jcHkocERhdGEgKyBkZXN0X3BpdGNoICogaSwgcEluZm8tPnBTY2FuMCArIHBJbmZvLT5TdHJpZGUgKiBpLAotICAgICAgICAgICAgICAgICAgIGRlc3RfcGl0Y2gpOworICAgICAgbWVtY3B5KHBEYXRhICsgZGVzdF9waXRjaCAqIGksIHBJbmZvLT5wU2NhbjAgKyBwSW5mby0+U3RyaWRlICogaSwKKyAgICAgICAgICAgICBkZXN0X3BpdGNoKTsKICAgICB9CiAgIH0KLSAgQ0ZYX0RJQml0bWFwKiBwRElCaXRtYXAgPSBfRlhfV2luZG93c0RJQl9Mb2FkRnJvbUJ1ZigKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcERJQml0bWFwID0gX0ZYX1dpbmRvd3NESUJfTG9hZEZyb21CdWYoCiAgICAgICBwSW5mby0+cGJtaSwgcERhdGEsIHBJbmZvLT5wYm1pLT5ibWlIZWFkZXIuYmlCaXRDb3VudCA9PSAzMik7CiAgIEZYX0ZyZWUocERhdGEpOwogICBGcmVlRElCaXRtYXAocEluZm8pOwpkaWZmIC0tZ2l0IGEvY29yZS9meGdlL3dpbjMyL2Z4X3dpbjMyX3ByaW50LmNwcCBiL2NvcmUvZnhnZS93aW4zMi9meF93aW4zMl9wcmludC5jcHAKaW5kZXggY2RhODNlYi4uZGY5ZTgzOCAxMDA2NDQKLS0tIGEvY29yZS9meGdlL3dpbjMyL2Z4X3dpbjMyX3ByaW50LmNwcAorKysgYi9jb3JlL2Z4Z2Uvd2luMzIvZnhfd2luMzJfcHJpbnQuY3BwCkBAIC0xMSwxMCArMTEsMTIgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfd2luZG93c2RldmljZS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvZGliX2ludC5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZm9udC5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfd2luZG93c3JlbmRlcmRldmljZS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2RpYmV4dHJhY3Rvci5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2ltYWdlcmVuZGVyZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NzdHJldGNoZW5naW5lLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZyZWV0eXBlLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2dlL2Z4X3RleHRfaW50LmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL3dpbjMyL2Nwc291dHB1dC5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS93aW4zMi93aW4zMl9pbnQuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCkBAIC02Nyw3ICs2OSw3IEBACiAgIHJldHVybiBDR2RpRGV2aWNlRHJpdmVyOjpHZXREZXZpY2VDYXBzKGNhcHNfaWQpOwogfQogCi1ib29sIENHZGlQcmludGVyRHJpdmVyOjpTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwKK2Jvb2wgQ0dkaVByaW50ZXJEcml2ZXI6OlNldERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCkBAIC04NywxNCArODksMTQgQEAKICAgICByZXR1cm4gZmFsc2U7CiAKICAgQ0ZYX0RJQkV4dHJhY3RvciB0ZW1wKHBTb3VyY2UpOwotICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSB0ZW1wLkdldEJpdG1hcCgpOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwQml0bWFwID0gdGVtcC5HZXRCaXRtYXAoKTsKICAgaWYgKCFwQml0bWFwKQogICAgIHJldHVybiBmYWxzZTsKIAogICByZXR1cm4gR0RJX1NldERJQml0cyhwQml0bWFwLCBwU3JjUmVjdCwgbGVmdCwgdG9wKTsKIH0KIAotYm9vbCBDR2RpUHJpbnRlckRyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorYm9vbCBDR2RpUHJpbnRlckRyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCkBAIC0xMDksNyArMTExLDcgQEAKICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgIGlmIChkZXN0X3dpZHRoIDwgMCB8fCBkZXN0X2hlaWdodCA8IDApIHsKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IHBGbGlwcGVkID0KKyAgICAgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBGbGlwcGVkID0KICAgICAgICAgICBwU291cmNlLT5GbGlwSW1hZ2UoZGVzdF93aWR0aCA8IDAsIGRlc3RfaGVpZ2h0IDwgMCk7CiAgICAgICBpZiAoIXBGbGlwcGVkKQogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMTksMTMgKzEyMSwxMiBAQAogICAgICAgaWYgKGRlc3RfaGVpZ2h0IDwgMCkKICAgICAgICAgZGVzdF90b3AgKz0gZGVzdF9oZWlnaHQ7CiAKLSAgICAgIHJldHVybiBHRElfU3RyZXRjaEJpdE1hc2socEZsaXBwZWQuZ2V0KCksIGRlc3RfbGVmdCwgZGVzdF90b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicyhkZXN0X3dpZHRoKSwgYWJzKGRlc3RfaGVpZ2h0KSwgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKKyAgICAgIHJldHVybiBHRElfU3RyZXRjaEJpdE1hc2socEZsaXBwZWQsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGFicyhkZXN0X3dpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzKGRlc3RfaGVpZ2h0KSwgY29sb3IsIGZsYWdzKTsKICAgICB9CiAKICAgICBDRlhfRElCRXh0cmFjdG9yIHRlbXAocFNvdXJjZSk7Ci0gICAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gdGVtcC5HZXRCaXRtYXAoKTsKKyAgICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwQml0bWFwID0gdGVtcC5HZXRCaXRtYXAoKTsKICAgICBpZiAoIXBCaXRtYXApCiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgcmV0dXJuIEdESV9TdHJldGNoQml0TWFzayhwQml0bWFwLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLApAQCAtMTM2LDcgKzEzNyw3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIGlmIChkZXN0X3dpZHRoIDwgMCB8fCBkZXN0X2hlaWdodCA8IDApIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBwRmxpcHBlZCA9CisgICAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcEZsaXBwZWQgPQogICAgICAgICBwU291cmNlLT5GbGlwSW1hZ2UoZGVzdF93aWR0aCA8IDAsIGRlc3RfaGVpZ2h0IDwgMCk7CiAgICAgaWYgKCFwRmxpcHBlZCkKICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE0NiwyNCArMTQ3LDI0IEBACiAgICAgaWYgKGRlc3RfaGVpZ2h0IDwgMCkKICAgICAgIGRlc3RfdG9wICs9IGRlc3RfaGVpZ2h0OwogCi0gICAgcmV0dXJuIEdESV9TdHJldGNoRElCaXRzKHBGbGlwcGVkLmdldCgpLCBkZXN0X2xlZnQsIGRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnMoZGVzdF93aWR0aCksIGFicyhkZXN0X2hlaWdodCksIGZsYWdzKTsKKyAgICByZXR1cm4gR0RJX1N0cmV0Y2hESUJpdHMocEZsaXBwZWQsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGFicyhkZXN0X3dpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzKGRlc3RfaGVpZ2h0KSwgZmxhZ3MpOwogICB9CiAKICAgQ0ZYX0RJQkV4dHJhY3RvciB0ZW1wKHBTb3VyY2UpOwotICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSB0ZW1wLkdldEJpdG1hcCgpOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwQml0bWFwID0gdGVtcC5HZXRCaXRtYXAoKTsKICAgaWYgKCFwQml0bWFwKQogICAgIHJldHVybiBmYWxzZTsKICAgcmV0dXJuIEdESV9TdHJldGNoRElCaXRzKHBCaXRtYXAsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2hlaWdodCwgZmxhZ3MpOwogfQogCi1ib29sIENHZGlQcmludGVyRHJpdmVyOjpTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwU291cmNlLAorYm9vbCBDR2RpUHJpbnRlckRyaXZlcjo6U3RhcnRESUJpdHMoY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlbmRlcl9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0ltYWdlUmVuZGVyZXI+KiBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgewogICBpZiAoYml0bWFwX2FscGhhIDwgMjU1IHx8IHBTb3VyY2UtPkhhc0FscGhhKCkgfHwKICAgICAgIChwU291cmNlLT5Jc0FscGhhTWFzaygpICYmIChwU291cmNlLT5HZXRCUFAoKSAhPSAxKSkpIHsKQEAgLTE3MSw4ICsxNzIsOCBAQAogICB9CiAgIENGWF9GbG9hdFJlY3QgdW5pdF9yZWN0ID0gcE1hdHJpeC0+R2V0VW5pdFJlY3QoKTsKICAgRlhfUkVDVCBmdWxsX3JlY3QgPSB1bml0X3JlY3QuR2V0T3V0ZXJSZWN0KCk7Ci0gIGlmIChGWFNZU19mYWJzKHBNYXRyaXgtPmIpIDwgMC41ZiAmJiBwTWF0cml4LT5hICE9IDAgJiYKLSAgICAgIEZYU1lTX2ZhYnMocE1hdHJpeC0+YykgPCAwLjVmICYmIHBNYXRyaXgtPmQgIT0gMCkgeworICBpZiAoZmFicyhwTWF0cml4LT5iKSA8IDAuNWYgJiYgcE1hdHJpeC0+YSAhPSAwICYmIGZhYnMocE1hdHJpeC0+YykgPCAwLjVmICYmCisgICAgICBwTWF0cml4LT5kICE9IDApIHsKICAgICBib29sIGJGbGlwWCA9IHBNYXRyaXgtPmEgPCAwOwogICAgIGJvb2wgYkZsaXBZID0gcE1hdHJpeC0+ZCA+IDA7CiAgICAgcmV0dXJuIFN0cmV0Y2hESUJpdHMocFNvdXJjZSwgY29sb3IsCkBAIC0xODIsMTUgKzE4MywxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGJGbGlwWSA/IC1mdWxsX3JlY3QuSGVpZ2h0KCkgOiBmdWxsX3JlY3QuSGVpZ2h0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgMCwgYmxlbmRfdHlwZSk7CiAgIH0KLSAgaWYgKEZYU1lTX2ZhYnMocE1hdHJpeC0+YSkgPj0gMC41ZiB8fCBGWFNZU19mYWJzKHBNYXRyaXgtPmQpID49IDAuNWYpCisgIGlmIChmYWJzKHBNYXRyaXgtPmEpID49IDAuNWYgfHwgZmFicyhwTWF0cml4LT5kKSA+PSAwLjVmKQogICAgIHJldHVybiBmYWxzZTsKIAotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBwVHJhbnNmb3JtZWQgPQorICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwVHJhbnNmb3JtZWQgPQogICAgICAgcFNvdXJjZS0+U3dhcFhZKHBNYXRyaXgtPmMgPiAwLCBwTWF0cml4LT5iIDwgMCk7CiAgIGlmICghcFRyYW5zZm9ybWVkKQogICAgIHJldHVybiBmYWxzZTsKIAotICByZXR1cm4gU3RyZXRjaERJQml0cyhwVHJhbnNmb3JtZWQuZ2V0KCksIGNvbG9yLCBmdWxsX3JlY3QubGVmdCwgZnVsbF9yZWN0LnRvcCwKKyAgcmV0dXJuIFN0cmV0Y2hESUJpdHMocFRyYW5zZm9ybWVkLCBjb2xvciwgZnVsbF9yZWN0LmxlZnQsIGZ1bGxfcmVjdC50b3AsCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxfcmVjdC5XaWR0aCgpLCBmdWxsX3JlY3QuSGVpZ2h0KCksIG51bGxwdHIsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kX3R5cGUpOwogfQpAQCAtMTk5LDcgKzIwMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZvbnRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yKSB7CiAjaWYgZGVmaW5lZChQREZJVU1fUFJJTlRfVEVYVF9XSVRIX0dESSkKICAgaWYgKCFnX3BkZml1bV9wcmludF90ZXh0X3dpdGhfZ2RpKQpAQCAtMjA5LDcgKzIxMCw3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIC8vIFNjYWxlIGZhY3RvciB1c2VkIHRvIG1pbmltaXplIHRoZSBrZXJuaW5nIHByb2JsZW1zIGNhdXNlZCBieSByb3VuZGluZwotICAvLyBlcnJvcnMgYmVsb3cuIFZhbHVlIGNob29zZW4gYmFzZWQgb24gdGhlIHRpdGxlIG9mIGh0dHBzOi8vY3JidWcuY29tLzE4MzgzCisgIC8vIGVycm9ycyBiZWxvdy4gVmFsdWUgY2hvc2VuIGJhc2VkIG9uIHRoZSB0aXRsZSBvZiBodHRwczovL2NyYnVnLmNvbS8xODM4MwogICBjb25zdCBkb3VibGUga1NjYWxlRmFjdG9yID0gMTA7CiAKICAgLy8gRm9udApAQCAtMjMwLDggKzIzMSw5IEBACiAgIGxmLmxmSXRhbGljID0gcEZvbnQtPklzSXRhbGljKCk7CiAgIGxmLmxmQ2hhclNldCA9IERFRkFVTFRfQ0hBUlNFVDsKIAotICBjb25zdCBDRlhfV2lkZVN0cmluZyB3c05hbWUgPSBwRm9udC0+R2V0RmFjZU5hbWUoKS5VVEY4RGVjb2RlKCk7Ci0gIGludCBpTmFtZUxlbiA9IHN0ZDo6bWluKHdzTmFtZS5HZXRMZW5ndGgoKSwgTEZfRkFDRVNJWkUgLSAxKTsKKyAgY29uc3QgV2lkZVN0cmluZyB3c05hbWUgPSBwRm9udC0+R2V0RmFjZU5hbWUoKS5VVEY4RGVjb2RlKCk7CisgIHNpemVfdCBpTmFtZUxlbiA9CisgICAgICBzdGQ6Om1pbih3c05hbWUuR2V0TGVuZ3RoKCksIHN0YXRpY19jYXN0PHNpemVfdD4oTEZfRkFDRVNJWkUgLSAxKSk7CiAgIG1lbWNweShsZi5sZkZhY2VOYW1lLCB3c05hbWUuY19zdHIoKSwgc2l6ZW9mKGxmLmxmRmFjZU5hbWVbMF0pICogaU5hbWVMZW4pOwogICBsZi5sZkZhY2VOYW1lW2lOYW1lTGVuXSA9IDA7CiAKQEAgLTI4MCwxNCArMjgyLDE0IEBACiAgIC8vIENvbG9yCiAgIGludCBpVW51c2VkQWxwaGE7CiAgIEZYX0NPTE9SUkVGIHJnYjsKLSAgQXJnYkRlY29kZShjb2xvciwgaVVudXNlZEFscGhhLCByZ2IpOworICBzdGQ6OnRpZShpVW51c2VkQWxwaGEsIHJnYikgPSBBcmdiVG9Db2xvclJlZihjb2xvcik7CiAgIFNldFRleHRDb2xvcihtX2hEQywgcmdiKTsKICAgU2V0QmtNb2RlKG1faERDLCBUUkFOU1BBUkVOVCk7CiAKICAgLy8gVGV4dAotICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7CisgIFdpZGVTdHJpbmcgd3NUZXh0OwogICBzdGQ6OnZlY3RvcjxJTlQ+IHNwYWNpbmcobkNoYXJzKTsKLSAgRlhfRkxPQVQgZlByZXZpb3VzT3JpZ2luWCA9IDA7CisgIGZsb2F0IGZQcmV2aW91c09yaWdpblggPSAwOwogICBmb3IgKGludCBpID0gMDsgaSA8IG5DaGFyczsgKytpKSB7CiAgICAgLy8gT25seSB3b3JrcyB3aXRoIFBERnMgZnJvbSBTa2lhJ3MgUERGIGdlbmVyYXRvci4gQ2Fubm90IGhhbmRsZSBhcmJpdHJhcnkKICAgICAvLyB2YWx1ZXMgZnJvbSBQREZzLgpAQCAtMzAwLDggKzMwMiw4IEBACiAKICAgICAvLyBSb3VuZCB0aGUgc3BhY2luZyB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyLCBidXQga2VlcCB0cmFjayBvZiB0aGUgcm91bmRpbmcKICAgICAvLyBlcnJvciBmb3IgY2FsY3VsYXRpbmcgdGhlIG5leHQgc3BhY2luZyB2YWx1ZS4KLSAgICBGWF9GTE9BVCBmT3JpZ2luWCA9IGNoYXJwb3MubV9PcmlnaW4ueCAqIGtTY2FsZUZhY3RvcjsKLSAgICBGWF9GTE9BVCBmUGl4ZWxTcGFjaW5nID0gZk9yaWdpblggLSBmUHJldmlvdXNPcmlnaW5YOworICAgIGZsb2F0IGZPcmlnaW5YID0gY2hhcnBvcy5tX09yaWdpbi54ICoga1NjYWxlRmFjdG9yOworICAgIGZsb2F0IGZQaXhlbFNwYWNpbmcgPSBmT3JpZ2luWCAtIGZQcmV2aW91c09yaWdpblg7CiAgICAgc3BhY2luZ1tpXSA9IEZYU1lTX3JvdW5kKGZQaXhlbFNwYWNpbmcpOwogICAgIGZQcmV2aW91c09yaWdpblggPSBmT3JpZ2luWCAtIChmUGl4ZWxTcGFjaW5nIC0gc3BhY2luZ1tpXSk7CiAKQEAgLTMzNSw4ICszMzcsOSBAQAogICBtX1dpZHRoID0gOjpHZXREZXZpY2VDYXBzKG1faERDLCBIT1JaUkVTKTsKICAgbV9IZWlnaHQgPSA6OkdldERldmljZUNhcHMobV9oREMsIFZFUlRSRVMpOwogICBtX25CaXRzUGVyUGl4ZWwgPSA6OkdldERldmljZUNhcHMobV9oREMsIEJJVFNQSVhFTCk7Ci0gIG1fcFBTT3V0cHV0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQU091dHB1dD4obV9oREMpOwotICBtX1BTUmVuZGVyZXIuSW5pdChtX3BQU091dHB1dC5nZXQoKSwgcHNsZXZlbCwgbV9XaWR0aCwgbV9IZWlnaHQsIGJDbXlrT3V0cHV0KTsKKworICBtX1BTUmVuZGVyZXIuSW5pdChwZGZpdW06Ok1ha2VSZXRhaW48Q1BTT3V0cHV0PihtX2hEQyksIHBzbGV2ZWwsIG1fV2lkdGgsCisgICAgICAgICAgICAgICAgICAgIG1fSGVpZ2h0LCBiQ215a091dHB1dCk7CiAgIEhSR04gaFJnbiA9IDo6Q3JlYXRlUmVjdFJnbigwLCAwLCAxLCAxKTsKICAgaW50IHJldCA9IDo6R2V0Q2xpcFJnbihoREMsIGhSZ24pOwogICBpZiAocmV0ID09IDEpIHsKQEAgLTM0OSwxMCArMzUyLDEwIEBACiAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwRGF0YS0+cmRoLm5Db3VudDsgaSsrKSB7CiAgICAgICAgICAgUkVDVCogcFJlY3QgPQogICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFJFQ1QqPihwRGF0YS0+QnVmZmVyICsgcERhdGEtPnJkaC5uUmduU2l6ZSAqIGkpOwotICAgICAgICAgIHBhdGguQXBwZW5kUmVjdChzdGF0aWNfY2FzdDxGWF9GTE9BVD4ocFJlY3QtPmxlZnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGWF9GTE9BVD4ocFJlY3QtPmJvdHRvbSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihwUmVjdC0+cmlnaHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGWF9GTE9BVD4ocFJlY3QtPnRvcCkpOworICAgICAgICAgIHBhdGguQXBwZW5kUmVjdChzdGF0aWNfY2FzdDxmbG9hdD4ocFJlY3QtPmxlZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4ocFJlY3QtPmJvdHRvbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihwUmVjdC0+cmlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4ocFJlY3QtPnRvcCkpOwogICAgICAgICB9CiAgICAgICAgIG1fUFNSZW5kZXJlci5TZXRDbGlwX1BhdGhGaWxsKCZwYXRoLCBudWxscHRyLCBGWEZJTExfV0lORElORyk7CiAgICAgICB9CkBAIC00MzYsNyArNDM5LDcgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQ1BTUHJpbnRlckRyaXZlcjo6U2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCitib29sIENQU1ByaW50ZXJEcml2ZXI6OlNldERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCkBAIC00NDcsNyArNDUwLDcgQEAKICAgcmV0dXJuIG1fUFNSZW5kZXJlci5TZXRESUJpdHMocEJpdG1hcCwgY29sb3IsIGxlZnQsIHRvcCk7CiB9CiAKLWJvb2wgQ1BTUHJpbnRlckRyaXZlcjo6U3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorYm9vbCBDUFNQcmludGVyRHJpdmVyOjpTdHJldGNoRElCaXRzKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcEJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKQEAgLTQ2MiwxMiArNDY1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgZmxhZ3MpOwogfQogCi1ib29sIENQU1ByaW50ZXJEcml2ZXI6OlN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCitib29sIENQU1ByaW50ZXJEcml2ZXI6OlN0YXJ0RElCaXRzKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcEJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlbmRlcl9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENGWF9JbWFnZVJlbmRlcmVyPiogaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgewogICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpCiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNDc1LDcgKzQ3OCw3IEBACiAgIGlmIChiaXRtYXBfYWxwaGEgPCAyNTUpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIGhhbmRsZSA9IG51bGxwdHI7CisgICpoYW5kbGUgPSBudWxscHRyOwogICByZXR1cm4gbV9QU1JlbmRlcmVyLkRyYXdESUJpdHMocEJpdG1hcCwgY29sb3IsIHBNYXRyaXgsIHJlbmRlcl9mbGFncyk7CiB9CiAKQEAgLTQ4MywxMiArNDg2LDE2NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBwRm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZm9udF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvcikgewogICByZXR1cm4gbV9QU1JlbmRlcmVyLkRyYXdUZXh0KG5DaGFycywgcENoYXJQb3MsIHBGb250LCBwT2JqZWN0MkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X3NpemUsIGNvbG9yKTsKIH0KIAotdm9pZCogQ1BTUHJpbnRlckRyaXZlcjo6R2V0UGxhdGZvcm1TdXJmYWNlKCkgY29uc3QgewotICByZXR1cm4gbV9oREM7CitDVGV4dE9ubHlQcmludGVyRHJpdmVyOjpDVGV4dE9ubHlQcmludGVyRHJpdmVyKEhEQyBoREMpCisgICAgOiBtX2hEQyhoREMpLAorICAgICAgbV9XaWR0aChJTlRfTUFYKSwKKyAgICAgIG1fSGVpZ2h0KElOVF9NQVgpLAorICAgICAgbV9Ib3J6U2l6ZShJTlRfTUFYKSwKKyAgICAgIG1fVmVydFNpemUoSU5UX01BWCksCisgICAgICBtX09yaWdpblkoMC4wZiksCisgICAgICBtX1NldE9yaWdpbihmYWxzZSkgeworICBtX25CaXRzUGVyUGl4ZWwgPSA6OkdldERldmljZUNhcHMobV9oREMsIEJJVFNQSVhFTCk7Cit9CisKK0NUZXh0T25seVByaW50ZXJEcml2ZXI6On5DVGV4dE9ubHlQcmludGVyRHJpdmVyKCkgeworICBFbmRSZW5kZXJpbmcoKTsKK30KKworaW50IENUZXh0T25seVByaW50ZXJEcml2ZXI6OkdldERldmljZUNhcHMoaW50IGNhcHNfaWQpIGNvbnN0IHsKKyAgc3dpdGNoIChjYXBzX2lkKSB7CisgICAgY2FzZSBGWERDX0RFVklDRV9DTEFTUzoKKyAgICAgIHJldHVybiBGWERDX1BSSU5URVI7CisgICAgY2FzZSBGWERDX1BJWEVMX1dJRFRIOgorICAgICAgcmV0dXJuIG1fV2lkdGg7CisgICAgY2FzZSBGWERDX1BJWEVMX0hFSUdIVDoKKyAgICAgIHJldHVybiBtX0hlaWdodDsKKyAgICBjYXNlIEZYRENfQklUU19QSVhFTDoKKyAgICAgIHJldHVybiBtX25CaXRzUGVyUGl4ZWw7CisgICAgY2FzZSBGWERDX1JFTkRFUl9DQVBTOgorICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBGWERDX0hPUlpfU0laRToKKyAgICAgIHJldHVybiBtX0hvcnpTaXplOworICAgIGNhc2UgRlhEQ19WRVJUX1NJWkU6CisgICAgICByZXR1cm4gbV9WZXJ0U2l6ZTsKKyAgfQorICByZXR1cm4gMDsKK30KKworYm9vbCBDVGV4dE9ubHlQcmludGVyRHJpdmVyOjpTZXRDbGlwX1BhdGhGaWxsKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsX21vZGUpIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1RleHRPbmx5UHJpbnRlckRyaXZlcjo6U2V0Q2xpcF9QYXRoU3Ryb2tlKAorICAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgIGNvbnN0IENGWF9HcmFwaFN0YXRlRGF0YSogcEdyYXBoU3RhdGUpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENUZXh0T25seVByaW50ZXJEcml2ZXI6OkRyYXdQYXRoKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlsbF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3Ryb2tlX2NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1RleHRPbmx5UHJpbnRlckRyaXZlcjo6U2V0RElCaXRzKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1RleHRPbmx5UHJpbnRlckRyaXZlcjo6R2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCkgeworICBwUmVjdC0+bGVmdCA9IDA7CisgIHBSZWN0LT5yaWdodCA9IG1fV2lkdGg7CisgIHBSZWN0LT50b3AgPSAwOworICBwUmVjdC0+Ym90dG9tID0gbV9IZWlnaHQ7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENUZXh0T25seVByaW50ZXJEcml2ZXI6OlN0cmV0Y2hESUJpdHMoCisgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwQml0bWFwLAorICAgIHVpbnQzMl90IGNvbG9yLAorICAgIGludCBkZXN0X2xlZnQsCisgICAgaW50IGRlc3RfdG9wLAorICAgIGludCBkZXN0X3dpZHRoLAorICAgIGludCBkZXN0X2hlaWdodCwKKyAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsCisgICAgdWludDMyX3QgZmxhZ3MsCisgICAgaW50IGJsZW5kX3R5cGUpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENUZXh0T25seVByaW50ZXJEcml2ZXI6OlN0YXJ0RElCaXRzKAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcEJpdG1hcCwKKyAgICBpbnQgYml0bWFwX2FscGhhLAorICAgIHVpbnQzMl90IGNvbG9yLAorICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgdWludDMyX3QgcmVuZGVyX2ZsYWdzLAorICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfSW1hZ2VSZW5kZXJlcj4qIGhhbmRsZSwKKyAgICBpbnQgYmxlbmRfdHlwZSkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1RleHRPbmx5UHJpbnRlckRyaXZlcjo6RHJhd0RldmljZVRleHQoaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yKSB7CisgIGlmIChnX3BkZml1bV9wcmludF9tb2RlICE9IDEpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAobkNoYXJzIDwgMSB8fCAhcEZvbnQgfHwgIXBGb250LT5Jc0VtYmVkZGVkKCkgfHwgIXBGb250LT5Jc1RURm9udCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBTY2FsZSBmYWN0b3IgdXNlZCB0byBtaW5pbWl6ZSB0aGUga2VybmluZyBwcm9ibGVtcyBjYXVzZWQgYnkgcm91bmRpbmcKKyAgLy8gZXJyb3JzIGJlbG93LiBWYWx1ZSBjaG9zZW4gYmFzZWQgb24gdGhlIHRpdGxlIG9mIGh0dHBzOi8vY3JidWcuY29tLzE4MzgzCisgIGNvbnN0IGRvdWJsZSBrU2NhbGVGYWN0b3IgPSAxMDsKKworICBXaWRlU3RyaW5nIHdzVGV4dDsKKyAgaW50IHRvdGFsTGVuZ3RoID0gbkNoYXJzOworCisgIC8vIERldGVjdCBuZXcgbGluZXMgYW5kIGFkZCBjbHJmIGNoYXJhY3RlcnMgKHNpbmNlIHRoaXMgaXMgV2luZG93cyBvbmx5KS4KKyAgLy8gVGhlc2UgY2hhcmFjdGVycyBhcmUgcmVtb3ZlZCBieSBTa1BERiwgYnV0IHRoZSBuZXcgbGluZSBpbmZvcm1hdGlvbiBpcworICAvLyBwcmVzZXJ2ZWQgaW4gdGhlIHRleHQgbG9jYXRpb24uIGNscmYgY2hhcmFjdGVycyBzZWVtIHRvIGJlIGlnbm9yZWQgYnkKKyAgLy8gbGFiZWwgcHJpbnRlcnMgdGhhdCB1c2UgdGhpcyBkcml2ZXIuCisgIGlmIChtX1NldE9yaWdpbiAmJgorICAgICAgRlhTWVNfcm91bmQobV9PcmlnaW5ZKSAhPSBGWFNZU19yb3VuZChwT2JqZWN0MkRldmljZS0+ZiAqIGtTY2FsZUZhY3RvcikpIHsKKyAgICB3c1RleHQgKz0gTCJcclxuIjsKKyAgICB0b3RhbExlbmd0aCArPSAyOworICB9CisgIG1fT3JpZ2luWSA9IHBPYmplY3QyRGV2aWNlLT5mICoga1NjYWxlRmFjdG9yOworICBtX1NldE9yaWdpbiA9IHRydWU7CisKKyAgLy8gVGV4dAorICBmb3IgKGludCBpID0gMDsgaSA8IG5DaGFyczsgKytpKSB7CisgICAgLy8gT25seSB3b3JrcyB3aXRoIFBERnMgZnJvbSBTa2lhJ3MgUERGIGdlbmVyYXRvci4gQ2Fubm90IGhhbmRsZSBhcmJpdHJhcnkKKyAgICAvLyB2YWx1ZXMgZnJvbSBQREZzLgorICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TJiBjaGFycG9zID0gcENoYXJQb3NbaV07CisgICAgQVNTRVJUKGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMF0gPT0gMCk7CisgICAgQVNTRVJUKGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMV0gPT0gMCk7CisgICAgQVNTRVJUKGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbMl0gPT0gMCk7CisgICAgQVNTRVJUKGNoYXJwb3MubV9BZGp1c3RNYXRyaXhbM10gPT0gMCk7CisgICAgQVNTRVJUKGNoYXJwb3MubV9PcmlnaW4ueSA9PSAwKTsKKworICAgIHdzVGV4dCArPSBjaGFycG9zLm1fVW5pY29kZTsKKyAgfQorICBzaXplX3QgbGVuID0gdG90YWxMZW5ndGg7CisgIEJ5dGVTdHJpbmcgdGV4dCA9IEJ5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHdzVGV4dCk7CisgIHdoaWxlIChsZW4gPiAwKSB7CisgICAgY2hhciBidWZmZXJbMTAyNl07CisgICAgc2l6ZV90IHNlbmRfbGVuID0gc3RkOjptaW4obGVuLCBzdGF0aWNfY2FzdDxzaXplX3Q+KDEwMjQpKTsKKyAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QqPihidWZmZXIpKSA9IHNlbmRfbGVuOworICAgIG1lbWNweShidWZmZXIgKyAyLCB0ZXh0LmNfc3RyKCksIHNlbmRfbGVuKTsKKyAgICA6OkdkaUNvbW1lbnQobV9oREMsIHNlbmRfbGVuICsgMiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBCWVRFKj4oYnVmZmVyKSk7CisgICAgbGVuIC09IHNlbmRfbGVuOworICAgIHRleHQuUmlnaHQobGVuKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL2NvcmUvZnhnZS93aW4zMi93aW4zMl9pbnQuaCBiL2NvcmUvZnhnZS93aW4zMi93aW4zMl9pbnQuaAppbmRleCBmOGVhZTg3Li5kNGYyNTk3IDEwMDY0NAotLS0gYS9jb3JlL2Z4Z2Uvd2luMzIvd2luMzJfaW50LmgKKysrIGIvY29yZS9meGdlL3dpbjMyL3dpbjMyX2ludC5oCkBAIC0xMCwxMyArMTAsMTYgQEAKICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAKICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9pZnhfcmVuZGVyZGV2aWNlZHJpdmVyLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL3dpbjMyL2NmeF9wc3JlbmRlcmVyLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL3dpbjMyL2Nwc291dHB1dC5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS93aW4zMi9kd3JpdGVfaW50LmgiCiAKK2NsYXNzIENGWF9JbWFnZVJlbmRlcmVyOwogY2xhc3MgRlhURVhUX0NIQVJQT1M7CiBzdHJ1Y3QgV0lORElCX09wZW5fQXJnc187CiAKQEAgLTMwLDExICszMywxMiBAQAogIHB1YmxpYzoKICAgQ0dkaXBsdXNFeHQoKTsKICAgfkNHZGlwbHVzRXh0KCk7CisKICAgdm9pZCBMb2FkKCk7CiAgIGJvb2wgSXNBdmFpbGFibGUoKSB7IHJldHVybiAhIW1faE1vZHVsZTsgfQogICBib29sIFN0cmV0Y2hCaXRNYXNrKEhEQyBoREMsCiAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBiTW9ub0RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRElCaXRtYXAqIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCkBAIC00Myw3ICs0Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LAogICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7CiAgIGJvb2wgU3RyZXRjaERJQml0cyhIREMgaERDLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAogICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCkBAIC03NSw0NCArNzksNDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBtYXRyaXgpOwogICB2b2lkIEdkaXBDcmVhdGVCcnVzaCh1aW50MzJfdCBmaWxsX2FyZ2IsIHZvaWQqKiBwQnJ1c2gpOwogICB2b2lkIEdkaXBEZWxldGVCcnVzaCh2b2lkKiBwQnJ1c2gpOwotICB2b2lkIEdkaXBDcmVhdGVNYXRyaXgoRlhfRkxPQVQgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmLAorICB2b2lkIEdkaXBDcmVhdGVNYXRyaXgoZmxvYXQgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmLAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIG1hdHJpeCk7CiAgIHZvaWQgR2RpcERlbGV0ZU1hdHJpeCh2b2lkKiBtYXRyaXgpOwotICBib29sIEdkaXBDcmVhdGVGb250RmFtaWx5RnJvbU5hbWUoY29uc3QgRlhfV0NIQVIqIG5hbWUsCisgIGJvb2wgR2RpcENyZWF0ZUZvbnRGYW1pbHlGcm9tTmFtZShjb25zdCB3Y2hhcl90KiBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEZvbnRDb2xsZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIHBGYW1pbHkpOwogICB2b2lkIEdkaXBEZWxldGVGb250RmFtaWx5KHZvaWQqIHBGYW1pbHkpOwogICBib29sIEdkaXBDcmVhdGVGb250RnJvbUZhbWlseSh2b2lkKiBwRmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZvbnRfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbnRzdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBwRm9udCk7CiAgIHZvaWQqIEdkaXBDcmVhdGVGb250RnJvbUNvbGxlY3Rpb24odm9pZCogcEZvbnRDb2xsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbnRzdHlsZSk7CiAgIHZvaWQgR2RpcERlbGV0ZUZvbnQodm9pZCogcEZvbnQpOwotICBib29sIEdkaXBDcmVhdGVCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCB2b2lkKiogYml0bWFwKTsKKyAgYm9vbCBHZGlwQ3JlYXRlQml0bWFwKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwQml0bWFwLCB2b2lkKiogYml0bWFwKTsKICAgdm9pZCBHZGlwRGlzcG9zZUltYWdlKHZvaWQqIGJpdG1hcCk7Ci0gIHZvaWQgR2RpcEdldEZvbnRTaXplKHZvaWQqIHBGb250LCBGWF9GTE9BVCogc2l6ZSk7CisgIHZvaWQgR2RpcEdldEZvbnRTaXplKHZvaWQqIHBGb250LCBmbG9hdCogc2l6ZSk7CiAgIHZvaWQqIEdkaUFkZEZvbnRNZW1SZXNvdXJjZUV4KHZvaWQqIHBGb250ZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGR2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogbnVtX2ZhY2UpOwogICBib29sIEdkaVJlbW92ZUZvbnRNZW1SZXNvdXJjZUV4KHZvaWQqIGhhbmRsZSk7Ci0gIENGWF9ESUJpdG1hcCogTG9hZERJQml0bWFwKFdJTkRJQl9PcGVuX0FyZ3NfIGFyZ3MpOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBMb2FkRElCaXRtYXAoV0lORElCX09wZW5fQXJnc18gYXJncyk7CiAKLSAgRkFSUFJPQyBtX0Z1bmN0aW9uc1sxMDBdOwotICBGdW5jVHlwZV9HZGlBZGRGb250TWVtUmVzb3VyY2VFeCBtX3BHZGlBZGRGb250TWVtUmVzb3VyY2VFeDsKLSAgRnVuY1R5cGVfR2RpUmVtb3ZlRm9udE1lbVJlc291cmNlRXggbV9wR2RpUmVtb3ZlRm9udE1lbVJlc291cnNlRXg7CisgIHN0ZDo6dmVjdG9yPEZBUlBST0M+IG1fRnVuY3Rpb25zOworICBGdW5jVHlwZV9HZGlBZGRGb250TWVtUmVzb3VyY2VFeCBtX3BHZGlBZGRGb250TWVtUmVzb3VyY2VFeCA9IG51bGxwdHI7CisgIEZ1bmNUeXBlX0dkaVJlbW92ZUZvbnRNZW1SZXNvdXJjZUV4IG1fcEdkaVJlbW92ZUZvbnRNZW1SZXNvdXJzZUV4ID0gbnVsbHB0cjsKIAogIHByb3RlY3RlZDoKLSAgSE1PRFVMRSBtX2hNb2R1bGU7Ci0gIEhNT0RVTEUgbV9HZGlNb2R1bGU7CisgIEhNT0RVTEUgbV9oTW9kdWxlID0gbnVsbHB0cjsKKyAgSE1PRFVMRSBtX0dkaU1vZHVsZSA9IG51bGxwdHI7CiB9OwogCiBjbGFzcyBDV2luMzJQbGF0Zm9ybSB7CkBAIC0xNDcsMjggKzE1MSwyNSBAQAogICBib29sIEZpbGxSZWN0V2l0aEJsZW5kKGNvbnN0IEZYX1JFQ1QqIHBSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpbGxfY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIG92ZXJyaWRlOwotICBib29sIERyYXdDb3NtZXRpY0xpbmUoRlhfRkxPQVQgeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeTIsCisgIGJvb2wgRHJhd0Nvc21ldGljTGluZShjb25zdCBDRlhfUG9pbnRGJiBwdE1vdmVUbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0TGluZVRvLAogICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgb3ZlcnJpZGU7CiAgIGJvb2wgR2V0Q2xpcEJveChGWF9SRUNUKiBwUmVjdCkgb3ZlcnJpZGU7Ci0gIHZvaWQqIEdldFBsYXRmb3JtU3VyZmFjZSgpIGNvbnN0IG92ZXJyaWRlOwogCi0gIHZvaWQgRHJhd0xpbmUoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLCBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIpOworICB2b2lkIERyYXdMaW5lKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyKTsKIAotICBib29sIEdESV9TZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICBib29sIEdESV9TZXRESUJpdHMoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAogICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCk7Ci0gIGJvb2wgR0RJX1N0cmV0Y2hESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLAorICBib29sIEdESV9TdHJldGNoRElCaXRzKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwQml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyk7Ci0gIGJvb2wgR0RJX1N0cmV0Y2hCaXRNYXNrKENGWF9ESUJpdG1hcCogcEJpdG1hcCwKKyAgYm9vbCBHRElfU3RyZXRjaEJpdE1hc2soY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3Rfd2lkdGgsCkBAIC0xOTEsMTQgKzE5MiwxNiBAQAogICB+Q0dkaURpc3BsYXlEcml2ZXIoKSBvdmVycmlkZTsKIAogIHByb3RlY3RlZDoKLSAgYm9vbCBHZXRESUJpdHMoQ0ZYX0RJQml0bWFwKiBwQml0bWFwLCBpbnQgbGVmdCwgaW50IHRvcCkgb3ZlcnJpZGU7Ci0gIGJvb2wgU2V0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgIGJvb2wgR2V0RElCaXRzKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwQml0bWFwLAorICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKKyAgICAgICAgICAgICAgICAgaW50IHRvcCkgb3ZlcnJpZGU7CisgIGJvb2wgU2V0RElCaXRzKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcEJpdG1hcCwKICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IsCiAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBTcmNSZWN0LAogICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKICAgICAgICAgICAgICAgICAgaW50IHRvcCwKICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIG92ZXJyaWRlOwotICBib29sIFN0cmV0Y2hESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgYm9vbCBTdHJldGNoRElCaXRzKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcEJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3RvcCwKQEAgLTIwNywxNCArMjEwLDE0IEBACiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwQ2xpcFJlY3QsCiAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSBvdmVycmlkZTsKLSAgYm9vbCBTdGFydERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICBib29sIFN0YXJ0RElCaXRzKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcEJpdG1hcCwKICAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAogICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVuZGVyX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgIHZvaWQqJiBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENGWF9JbWFnZVJlbmRlcmVyPiogaGFuZGxlLAogICAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSBvdmVycmlkZTsKLSAgYm9vbCBVc2VGb3hpdFN0cmV0Y2hFbmdpbmUoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcFNvdXJjZSwKKyAgYm9vbCBVc2VGb3hpdFN0cmV0Y2hFbmdpbmUoY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfbGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLApAQCAtMjMxLDEzICsyMzQsMTMgQEAKIAogIHByb3RlY3RlZDoKICAgaW50IEdldERldmljZUNhcHMoaW50IGNhcHNfaWQpIGNvbnN0IG92ZXJyaWRlOwotICBib29sIFNldERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICBib29sIFNldERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yLAogICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUKiBwU3JjUmVjdCwKICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCiAgICAgICAgICAgICAgICAgIGludCB0b3AsCiAgICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSBvdmVycmlkZTsKLSAgYm9vbCBTdHJldGNoRElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgIGJvb2wgU3RyZXRjaERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCiAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCkBAIC0yNDYsMTggKzI0OSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcENsaXBSZWN0LAogICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgU3RhcnRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgYm9vbCBTdGFydERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4LAogICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJlbmRlcl9mbGFncywKLSAgICAgICAgICAgICAgICAgICB2b2lkKiYgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfSW1hZ2VSZW5kZXJlcj4qIGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgb3ZlcnJpZGU7CiAgIGJvb2wgRHJhd0RldmljZVRleHQoaW50IG5DaGFycywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCiAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmb250X3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IpIG92ZXJyaWRlOwogCiAgIGNvbnN0IGludCBtX0hvcnpTaXplOwpAQCAtMjkwLDEzICsyOTMsMTMgQEAKICAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlLAogICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSBvdmVycmlkZTsKICAgYm9vbCBHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KSBvdmVycmlkZTsKLSAgYm9vbCBTZXRESUJpdHMoY29uc3QgQ0ZYX0RJQlNvdXJjZSogcEJpdG1hcCwKKyAgYm9vbCBTZXRESUJpdHMoY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwQml0bWFwLAogICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKICAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCiAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAogICAgICAgICAgICAgICAgICBpbnQgdG9wLAogICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgU3RyZXRjaERJQml0cyhjb25zdCBDRlhfRElCU291cmNlKiBwQml0bWFwLAorICBib29sIFN0cmV0Y2hESUJpdHMoY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwQml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9sZWZ0LAogICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfdG9wLApAQCAtMzA1LDIwICszMDgsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIG92ZXJyaWRlOwotICBib29sIFN0YXJ0RElCaXRzKGNvbnN0IENGWF9ESUJTb3VyY2UqIHBCaXRtYXAsCisgIGJvb2wgU3RhcnRESUJpdHMoY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwQml0bWFwLAogICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCiAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY29sb3IsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCwKICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZW5kZXJfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgdm9pZComIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0ltYWdlUmVuZGVyZXI+KiBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIG92ZXJyaWRlOwogICBib29sIERyYXdEZXZpY2VUZXh0KGludCBuQ2hhcnMsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAogICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBwRm9udCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmb250X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZm9udF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yKSBvdmVycmlkZTsKLSAgdm9pZCogR2V0UGxhdGZvcm1TdXJmYWNlKCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgSERDIG1faERDOwogICBib29sIG1fYkNteWtPdXRwdXQ7CkBAIC0zMjcsOCArMzI5LDY5IEBACiAgIGludCBtX25CaXRzUGVyUGl4ZWw7CiAgIGludCBtX0hvcnpTaXplOwogICBpbnQgbV9WZXJ0U2l6ZTsKLSAgc3RkOjp1bmlxdWVfcHRyPENQU091dHB1dD4gbV9wUFNPdXRwdXQ7CiAgIENGWF9QU1JlbmRlcmVyIG1fUFNSZW5kZXJlcjsKIH07CiAKK2NsYXNzIENUZXh0T25seVByaW50ZXJEcml2ZXIgOiBwdWJsaWMgSUZYX1JlbmRlckRldmljZURyaXZlciB7CisgcHVibGljOgorICBleHBsaWNpdCBDVGV4dE9ubHlQcmludGVyRHJpdmVyKEhEQyBoREMpOworICB+Q1RleHRPbmx5UHJpbnRlckRyaXZlcigpIG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICAvLyBJRlhfUmVuZGVyRGV2aWNlRHJpdmVyCisgIGludCBHZXREZXZpY2VDYXBzKGludCBjYXBzX2lkKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTYXZlU3RhdGUoKSBvdmVycmlkZXt9OworICB2b2lkIFJlc3RvcmVTdGF0ZShib29sIGJLZWVwU2F2ZWQpIG92ZXJyaWRle307CisgIGJvb2wgU2V0Q2xpcF9QYXRoRmlsbChjb25zdCBDRlhfUGF0aERhdGEqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxfbW9kZSkgb3ZlcnJpZGU7CisgIGJvb2wgU2V0Q2xpcF9QYXRoU3Ryb2tlKGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwT2JqZWN0MkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSkgb3ZlcnJpZGU7CisgIGJvb2wgRHJhd1BhdGgoY29uc3QgQ0ZYX1BhdGhEYXRhKiBwUGF0aERhdGEsCisgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE9iamVjdDJEZXZpY2UsCisgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0dyYXBoU3RhdGVEYXRhKiBwR3JhcGhTdGF0ZSwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBmaWxsX2NvbG9yLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cm9rZV9jb2xvciwKKyAgICAgICAgICAgICAgICBpbnQgZmlsbF9tb2RlLAorICAgICAgICAgICAgICAgIGludCBibGVuZF90eXBlKSBvdmVycmlkZTsKKyAgYm9vbCBHZXRDbGlwQm94KEZYX1JFQ1QqIHBSZWN0KSBvdmVycmlkZTsKKyAgYm9vbCBTZXRESUJpdHMoY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwQml0bWFwLAorICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKKyAgICAgICAgICAgICAgICAgY29uc3QgRlhfUkVDVCogcFNyY1JlY3QsCisgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgb3ZlcnJpZGU7CisgIGJvb2wgU3RyZXRjaERJQml0cyhjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlZnQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF90b3AsCisgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QqIHBDbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX3R5cGUpIG92ZXJyaWRlOworICBib29sIFN0YXJ0RElCaXRzKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcEJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICBpbnQgYml0bWFwX2FscGhhLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvbG9yLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmVuZGVyX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfSW1hZ2VSZW5kZXJlcj4qIGhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfdHlwZSkgb3ZlcnJpZGU7CisgIGJvb2wgRHJhd0RldmljZVRleHQoaW50IG5DaGFycywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBPYmplY3QyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZvbnRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvcikgb3ZlcnJpZGU7CisKKyAgSERDIG1faERDOworICBpbnQgbV9XaWR0aDsKKyAgaW50IG1fSGVpZ2h0OworICBpbnQgbV9uQml0c1BlclBpeGVsOworICBpbnQgbV9Ib3J6U2l6ZTsKKyAgaW50IG1fVmVydFNpemU7CisgIGZsb2F0IG1fT3JpZ2luWTsKKyAgYm9vbCBtX1NldE9yaWdpbjsKK307CiAjZW5kaWYgIC8vIENPUkVfRlhHRV9XSU4zMl9XSU4zMl9JTlRfSF8KZGlmZiAtLWdpdCBhL2RvY3MvY29kZS1jb3ZlcmFnZS5tZCBiL2RvY3MvY29kZS1jb3ZlcmFnZS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDBhNjc0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9jb2RlLWNvdmVyYWdlLm1kCkBAIC0wLDAgKzEsMTUzIEBACisjIENvZGUgQ292ZXJhZ2UgU3VwcG9ydCBmb3IgUERGaXVtCisKK1tUT0NdCisKK1RoaXMgZ3VpZGUgZXhwbGFpbnMgaG93IHRvIGdlbmVyYXRlIGNvZGUgY292ZXJhZ2UgaW5mb3JtYXRpb24gZm9yIHRoZSBQREZpdW0KK2xpYnJhcnkgb24gYSBsb2NhbCBjb21wdXRlci4KKworIyMgUHJlcmVxdWlzaXRlcworCitZb3Ugd2lsbCBuZWVkIHRoZSBQREZpdW0gc291cmNlIGNvZGUgb24geW91ciBjb21wdXRlci4gWW91IGNhbiBzZWUKK3RoZSBbUkVBRE1FXSgvUkVBRE1FLm1kKSBmb3IgaW5zdHJ1Y3Rpb25zIG9uIGNoZWNraW5nIG91dCBQREZpdW0ncyBzb3VyY2UuCisKK1RoZSB0b29scyB1c2VkIGZvciBjb2RlIGNvdmVyYWdlIGFyZSBrbm93biB0byB3b3JrIG9uIFVidW50dSAxNC4wNC4gVGhleSBzaG91bGQKK3dvcmsgY29ycmVjdGx5IG9uIG5ld2VyIHZlcnNpb25zIG9mIFVidW50dSBhbmQgcmVsYXRlZCBMaW51eCBkaXN0cm9zLiBUaGV5IGhhdmUKK25vdCBiZWVuIHRlc3RlZCBvbiBXaW5kb3dzIGFuZCBNYWMuCisKKyMjIyBsY292CisKK1RoZSBjb2RlIGNvdmVyYWdlIHNjcmlwdHMgZGVwZW5kIG9uIGhhdmluZyBhIHZlcnNpb24gb2YgYGxjb3ZgIG9mIDEuMTEgb3IKK2dyZWF0ZXIgYXZhaWxhYmxlLCB3aGljaCBpcyBlbmZvcmNlZCBieSB0aGUgc2NyaXB0LiBVbmZvcnR1bmF0ZWx5IHRoZSBkZWZhdWx0Cit2ZXJzaW9uIG9mIGBsY292YCBmb3IgVWJ1bnR1IDE0LjA0IGlzIDEuMTAsIHRodXMgeW91IHdpbGwgbmVlZCB0byBpbnN0YWxsIGEKK25ld2VyIHZlcnNpb24uCisKK1lvdSBjYW4gYnVpbGQgYSBuZXdlciB2ZXJzaW9uIG9mIGBsY292YCBmcm9tIHNvdXJjZSwgd2hpY2ggaXMKK2F2YWlsYWJsZSBbaGVyZV0oaHR0cDovL2x0cC5zb3VyY2Vmb3JnZS5uZXQvY292ZXJhZ2UvbGNvdi5waHApLgorCitJZiB5b3UgZG9uJ3Qgd2FudCB0byBidWlsZCBmcm9tIHNvdXJjZSBhbmQgdXNlIGFuIFJQTSBiYXNlZCBMaW51eCwgbm90CitVYnVudHUvRGViaWFuLCB0aGVuIHRoZXJlIGFyZSBwcmUtYnVpbHQgUlBNcworYXZhaWxhYmxlIFtoZXJlXShodHRwOi8vZG93bmxvYWRzLnNvdXJjZWZvcmdlLm5ldC9sdHAvbGNvdi0xLjEzLTEubm9hcmNoLnJwbSkuCisKK0ZvciBVYnVudHUvRGViaWFuIHVzZXJzIHRoZXNlIFJQTXMgY2FuIGJlIGNvbnZlcnRlZCB0byAuZGViIHVzaW5nIGBhbGllbmAuIE1vcmUKK2luZm9ybWF0aW9uIGFib3V0IGhvdyB0byBkbyB0aGlzIGNhbiBiZSBmb3VuZCBpbiBgbWFuIGFsaWVuYC4KKworIyMjIGxsdm0tY292CisKK1RoZSBvdGhlciBleHRlcm5hbCBkZXBlbmRlbmN5IGZvciBnZW5lcmF0aW5nIGNvZGUgY292ZXJhZ2UgaW5mb3JtYXRpb24gaXMgaGF2aW5nCithIHZlcnNpb24gb2YgYGxsdm0tY292YCB0aGF0IHN1cHBvcnRzIHRoZSBgZ2NvdmAgY29tbWFuZC4gVGhpcyBzaG91bGQgYmUgYWxsCit2ZXJzaW9ucyBvZiAzLjUuMCBvciBncmVhdGVyLgorCitBZ2FpbiwgdW5mb3J0dW5hdGVseSwgdGhlIGRlZmF1bHQgbGx2bS1jb3YgdGhhdCBjb21lcyB3aXRoIFVidW50dSAxNC4wNCwgMy40LCBpcworbG93ZXIgdGhlbiB3aGF0IGlzIG5lZWRlZC4gVGhlIDE0LjA0IHJlcG9zaXRvcmllcyBkbyBzdXBwb3J0IGhhdmluZyBtdWx0aXBsZQordmVyc2lvbnMgb2YgdGhlIGBsbHZtYCBwYWNrYWdlLCBhbmQgdGh1cyBgbGx2bS1jb3ZgLiBUaHJvdWdoIHlvdXIgZmF2b3VyaXRlCitwYWNrYWdlIG1hbmFnZXIgeW91IHNob3VsZCBiZSBhYmxlIHRvIGluc3RhbGwgYW55IHZlcnNpb24gb2YgYGxsdm1gIG9mIDMuNSBvcgorZ3JlYXRlciBhbmQgdGhlIGNvdmVyYWdlIHNjcmlwdHMgc2hvdWxkIGZpbmQgaXQuCisKKyMjIEdlbmVyYXRpbmcgQ29kZSBDb3ZlcmFnZQorCisjIyMgU2V0dXAKKworVGhpcyBzdGVwIGFzc3VtZXMgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgb3V0IHRoZSBQREZpdW0gc291cmNlIGNvZGUgYW5kCitpbnN0YWxsZWQgdGhlIHByb3BlciB2ZXJzaW9ucyBvZiB0aGUgZXh0ZXJuYWwgdG9vbHMuIElmIHlvdSBoYXZlIG5vdCwgcGxlYXNlCitjb25zdWx0IHRoZSBhYm92ZSBQcmVyZXF1aXNpdGVzIHNlY3Rpb24uCisKK0JlZm9yZSBnZW5lcmF0aW5nIGNvZGUgY292ZXJhZ2UgaW5mb3JtYXRpb24sIHlvdSB3aWxsIG5lZWQgdG8gaGF2ZSBhIGJ1aWxkCitkaXJlY3Rvcnkgd2l0aCBjb3ZlcmFnZSBlbmFibGVkLiBUaGlzIGNhbiBiZSBkb25lIGJ5IHJ1bm5pbmcgdGhlIGBnbiBhcmdzYAorY29tbWFuZCBhbmQgYWRkaW5nIGB1c2VfY292ZXJhZ2UgPSB0cnVlYCBpbiB0aGUgZWRpdG9yIHRoYXQgaXMgb3BlbmVkLiBJZiBub3QKK3VzaW5nIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSwgYG91dC9Db3ZlcmFnZWAsIHRoZW4gcmVwbGFjZSBpdCB3aXRoIHRoZSBjb3JyZWN0Citsb2NhdGlvbiBpbiB0aGUgZm9sbG93aW5nIGNvbW1hbmQuCisKK2BgYHNoZWxsCitnbiBhcmdzIG91dC9Db3ZlcmFnZQorYGBgCisKK0lmIHlvdSBhbHJlYWR5IGhhdmUgYSBidWlsZCBkaXJlY3RvcnksIHlvdSBjYW4gYXBwZW5kIHRoZSBjb3ZlcmFnZSBmbGFnIHRvIHRoZQorZXhpc3RpbmcgYGFyZ3MuZ25gIGFzIGZvbGxvd3MuIElmIG5vdCB1c2luZyB0aGUgZGVmYXVsdCBkaXJlY3RvcnksCitgb3V0L0NvdmVyYWdlYCwgdGhlbiByZXBsYWNlIGl0IHdpdGggdGhlIGNvcnJlY3QgbG9jYXRpb24gaW4gdGhlIGZvbGxvd2luZworY29tbWFuZC4KKworYGBgc2hlbGwKK2VjaG8gInVzZV9jb3ZlcmFnZSA9IHRydWUiID4+IG91dC9Db3ZlcmFnZS9hcmdzLmduCitgYGAKKworCisjIyMgVXNhZ2UKKworR2VuZXJhdGluZyBjb2RlIGNvdmVyYWdlIGluZm9ybWF0aW9uIGlzIGRvbmUgdmlhIHRoZQorYHRlc3RpbmcvdG9vbHMvY292ZXJhZ2UvY292ZXJhZ2VfcmVwb3J0LnB5YCBzY3JpcHQuIFRoaXMgc2NyaXB0IHdpbGwgYnVpbGQgYW55IGJpbmFyaWVzCit0aGF0IGl0IG5lZWRzLCBwZXJmb3JtIHRlc3QgcnVucywgY29sbGVjdCBjb3ZlcmFnZSBkYXRhLCBhbmQgZmluYWxseSBnZW5lcmF0ZSBhCituaWNlIEhUTUwgY292ZXJhZ2UgcmVwb3J0LgorCitSdW5uaW5nIHRoZSBzY3JpcHQgd2l0aCBubyBhcmd1bWVudHMsIGFzIGJlbG93LCB3aWxsIGFzc3VtZSB0aGF0IHlvdSBhcmUKK2N1cnJlbnRseSBhdCB0aGUgcm9vdCBvZiB5b3VyIFBERml1bSBjaGVja291dCwgdGhlIGJ1aWxkIGRpcmVjdG9yeSB0byB1c2UgaXMKK2AuL291dC9Db3ZlcmFnZS9gIGFuZCB0aGF0IEhUTUwgc2hvdWxkIGJlIG91dHB1dHRlZCB0byBgLi9jb3ZlcmFnZV9yZXBvcnQvYC4gQnkKK2RlZmF1bHQsIGl0IHdpbGwgYWxzbyBvbmx5IHJ1biBgcGRmaXVtX3VuaXR0ZXN0c2AgYW5kIGBwZGZpdW1fZW1iZWRkZXJ0ZXN0c2AgZm9yCitjb3ZlcmFnZSBkYXRhLiBUaGlzIGlzIGJlY2F1c2UgdGhlIG90aGVyIHRlc3RzIGFyZSBrbm93biB0byB0YWtlIGEgbG9uZyB0aW1lIHRvCitydW4sIHNvIHRoZXkgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgZGVmYXVsdHMuCisKK2BgYHNoZWxsCit0ZXN0aW5nL3Rvb2xzL2NvdmVyYWdlL2NvdmVyYWdlX3JlcG9ydC5weQorYGBgCisKK0lmIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlzIG5vdCB0aGUgcm9vdCBvZiB5b3VyIFBERml1bSBjaGVja291dCwgdGhlbgoreW91IHdpbGwgbmVlZCB0byBwYXNzIGluIGAtLXNvdXJjZS1kaXJlY3RvcnlgIHdpdGggdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yeS4gSWYKK3lvdSBhcmUgdXNpbmcgYSBkaWZmZXJlbnQgYnVpbGQgZGlyZWN0b3J5LCB0aGVuIGAtLWJ1aWxkLWRpcmVjdG9yeWAgd2lsbCBuZWVkIHRvCitiZSBwYXNzZWQgaW4uIEZpbmFsbHksIGlmIHlvdSB3YW50IHRoZSBIVE1MIHJlcG9ydCBpbiBhIGRpZmZlcmVudCBsb2NhdGlvbiB0aGVuCit5b3Ugd2lsbCBuZWVkIHRvIHBhc3MgaW4gYC0tb3V0cHV0LWRpcmVjdG9yeWAuCisKK0FuIGV4YW1wbGUgb2YgYWxsIHRoZXNlIGZsYWdzIGJlaW5nIHVzZWQ6CisKK2BgYHNoZWxsCit0ZXN0aW5nL3Rvb2xzL2NvdmVyYWdlL2NvdmVyYWdlX3JlcG9ydC5weSBcCisgICAgLS1zb3VyY2UtZGlyZWN0b3J5IH4vcGRmaXVtL3BkZml1bSBcCisgICAgLS1idWlsZC1kaXJlY3Rvcnkgfi9wZGZpdW0vcGRmaXVtL291dC9EZWJ1Z193aXRoX0NvdmVyYWdlIFwKKyAgICAtLW91dHB1dC1kaXJlY3Rvcnkgfi9Eb2N1bWVudHMvUERGaXVtX2NvdmVyYWdlCitgYGAKKworVG8gcnVuIGRpZmZlcmVudCB0ZXN0cyB0aGVuIHRoZSBkZWZhdWx0IHNldCwgdGhlcmUgYXJlIHR3byB3YXlzIHRvIGFjaGlldmUKK3RoaXMuIElmIHlvdSB3YW50IHRvIHJ1biBldmVyeXRoaW5nLCBpbmNsdWRpbmcgdGVzdHMgdGhhdCBhcmUga25vd24gdG8gdGFrZSBhCitsb25nIHRpbWUsIHRoZW4geW91IGp1c3QgbmVlZCB0byBhZGQgdGhlIGAtLXNsb3dgIGZsYWcuCisKK2BgYHNoZWxsCit0ZXN0aW5nL3Rvb2xzL2NvdmVyYWdlL2NvdmVyYWdlX3JlcG9ydC5weSAtLXNsb3cKK2BgYAorCitJZiB5b3Ugd2FudCBtb3JlIGZpbmUgZ3JhaW5lZCBjb250cm9sLCBpbmNsdWRpbmcgcnVubmluZyBqdXN0IGEgc2luZ2xlIHRlc3QsIHlvdQorY2FuIHNwZWNpZnkgdGhlIHRlc3QgbmFtZXMgb24gdGhlIGNvbW1hbmQgbGluZS4gVGhlIGAtLXNsb3dgIGZsYWcgaXMgbm90IG5lZWRlZAoraWYgeW91IGFyZSBleHBsaWNpdGx5IGludm9raW5nIHRlc3RzLiBUaGUgbGlzdCBvZiBzdXBwb3J0ZWQgdGVzdHMgY2FuIGJlIGZvdW5kCitieSBydW5uaW5nIHRoZSBzY3JpcHQgd2l0aCBgLS1oZWxwYC4KKworQW4gZXhhbXBsZSBydW5uaW5nIHRoZSBkZWZhdWx0IHRlc3RzIGV4cGxpY2l0bHk6CisKK2BgYHNoZWxsCit0ZXN0aW5nL3Rvb2xzL2NvdmVyYWdlL2NvdmVyYWdlX3JlcG9ydC5weSBwZGZpdW1fdW5pdHRlc3RzIHBkZml1bV9lbWJlZGRlcnRlc3RzCitgYGAKKworTk9URToKK0F0IHRoZSBwcmVzZW50IHRpbWUsIHRoZXJlIGlzIG5vIG1lY2hhbmlzbSBmb3IgY29tYmluaW5nIGRhdGEgZnJvbSBkaWZmZXJlbnQKK2ludm9jYXRpb25zIG9mIGBjb3ZlcmFnZV9yZXBvcnQucHlgLiBJbnN0ZWFkIHlvdSBtdXN0IHNwZWNpZnkgYWxsIG9mIHRoZSB0ZXN0cwordG8gYmUgaW5jbHVkZWQgaW4gdGhlIHJlcG9ydCBpbiBhIHNpbmdsZSBpbnZvY2F0aW9uLgorCitUaGVyZSBhcmUgYWRkaXRpb25hbCBkZXZlbG9wZXIgZGVidWdnaW5nIGZsYWdzIGF2YWlsYWJsZSwgYC0tZHJ5LXJ1bmAgYW5kCitgLS12ZXJib3NlYC4gYC0tZHJ5LXJ1bmAgd2lsbCBvdXRwdXQgYSB0cmFjZSBvZiBjb21tYW5kcyB0aGF0IHdvdWxkIGhhdmUgYmVlbgorcnVuLCBidXQgZG9lc24ndCBhY3R1YWxseSBleGVjdXRlIHRoZW0uIGAtLXZlcmJvc2VgIHR1cm5zIG9uIG91dHB1dHRpbmcKK2FkZGl0aW9uYWwgbG9nZ2luZyBpbmZvcm1hdGlvbi4KKworIyMjIFZpZXdpbmcKKworT25jZSB0aGUgc2NyaXB0IGhhcyBydW4sIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHNob3VsZCBjb250YWluIGEgc2V0IG9mIEhUTUwgZmlsZXMKK2NvbnRhaW5pbmcgdGhlIGNvdmVyYWdlIHJlcG9ydC4KKworVGhlc2UgZmlsZXMgYXJlIHN0YXRpYyBIVE1MLCBzbyB5b3UgY2FuIHBvaW50IHlvdXIgYnJvd3NlciBhdCB0aGVtIGRpcmVjdGx5IG9uCit5b3VyIGxvY2FsIGZpbGUgc3lzdGVtIGFuZCB0aGV5IHNob3VsZCByZW5kZXIgZmluZS4gWW91IGNhbiBhbHNvIHNlcnZlIHRoZW0gdmlhIGEKK3dlYiBzZXJ2ZXIgaWYgeW91IHdhbnQsIGJ1dCBob3cgdG8gYWNoaWV2ZSB0aGF0IGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcworZG9jdW1lbnRhdGlvbi4KKworIyMgSXNzdWVzCisKK0ZvciBoZWxwIHdpdGggdXNpbmcgdGhlIGNvZGUgY292ZXJhZ2UgdG9vbHMgcGxlYXNlIGNvbnRhY3QgdGhlIFBERml1bQorbWFpbnRhaW5lcnMgdmlhIHRoZSBQREZpdW0KK21haWxpbmcgW2xpc3RdKGh0dHBzOi8vZ3JvdXBzLmdvb2dsZS5jb20vZm9ydW0vIyFmb3J1bS9wZGZpdW0pLgorCitQbGVhc2UgZmlsZSBidWdzIGFnYWluc3QgdGhlIGNvZGUgY292ZXJhZ2UKK3N1cHBvcnQgW2hlcmVdKGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9wZGZpdW0vaXNzdWVzL2xpc3QpLgpkaWZmIC0tZ2l0IGEvZG9jcy9nZXR0aW5nLXN0YXJ0ZWQubWQgYi9kb2NzL2dldHRpbmctc3RhcnRlZC5tZAppbmRleCBiODBlNTY2Li4wY2YyZmYzIDEwMDY0NAotLS0gYS9kb2NzL2dldHRpbmctc3RhcnRlZC5tZAorKysgYi9kb2NzL2dldHRpbmctc3RhcnRlZC5tZApAQCAtMTIsOCArMTIsOCBAQAogCiAqKiogbm90ZQogWW91IG11c3QgY29tcGlsZSBQREZpdW0gd2l0aG91dCBib3RoIFY4IGFuZCBYRkEgc3VwcG9ydCBmb3IgdGhlIGV4YW1wbGVzCi1oZXJlIHRvIHdvcmsuIFY4IGNhbiBiZSBjb21waWxlZCBvdXQgYnkgcHJvdmlkaW5nCi1gR1lQX0RFRklORVM9InBkZl9lbmFibGVfdjg9MCBwZGZfZW5hYmxlX3hmYT0wIiBidWlsZC9neXBfcGRmaXVtYC4KK2hlcmUgdG8gd29yay4gVjggY2FuIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgYHBkZl9lbmFibGVfdjggPSBmYWxzZWAgaW4gdGhlCitHTiBhcmdzLgogCiBTZWUgdGhlIFtWOCBHZXR0aW5nIFN0YXJ0ZWRdW3BkZml1bS12OF0gZ3VpZGUgZm9yIGhvdyB0bwogaW5pdGlhbGl6ZSBQREZpdW0gd2hlbiBWOCBpcyBjb21waWxlZCBpbnRvIHRoZSBiaW5hcnkuCkBAIC03Myw4ICs3Myw3IEBACiBgYGAKIFBERl9MSUJTPSItbHBkZml1bSAtbGZwZGZhcGkgLWxmeGdlIC1sZnBkZmRvYyAtbGZ4Y3J0IC1sZnhfYWdnIFwKIC1sZnhjb2RlYyAtbGZ4X2xwbmcgLWxmeF9saWJvcGVuanBlZyAtbGZ4X2xjbXMyIC1sZnhfZnJlZXR5cGUgLWxqcGVnIFwKLS1sZnhfemxpYiAtbGZkcm0gLWxwZGZ3aW5kb3cgLWxiaWdpbnQgLWxmb3JtZmlsbGVyIC1samF2YXNjcmlwdCBcCi0tbGZ4ZWRpdCIKKy1sZmRybSAtbHB3bCAtbGJpZ2ludCAtbGZvcm1maWxsZXIgLWxqYXZhc2NyaXB0IC1sZnhlZGl0IgogUERGX0RJUj08cGF0aC90by9wZGZpdW0+CiAKIGNsYW5nIC1JICRQREZfRElSL3B1YmxpYyAtbyBpbml0IGluaXQuYyAtTCAkUERGX0RJUi9vdXQvRGVidWcgLWxzdGRjKysgLWZyYW1ld29yayBBcHBLaXQgJFBERl9MSUJTCmRpZmYgLS1naXQgYS9kb2NzL3NhZmV0eW5ldC5tZCBiL2RvY3Mvc2FmZXR5bmV0Lm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MGY3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NhZmV0eW5ldC5tZApAQCAtMCwwICsxLDE1OSBAQAorIyBTYWZldHlOZXQgLSBQZXJmb3JtYW5jZSByZWdyZXNzaW9uIGRldGVjdGlvbiBmb3IgUERGaXVtCisKK1tUT0NdCisKK1RoaXMgZG9jdW1lbnQgZXhwbGFpbnMgaG93IHRvIHVzZSBTYWZldHlOZXQgdG8gZGV0ZWN0IHBlcmZvcm1hbmNlIHJlZ3Jlc3Npb25zCitpbiBQREZpdW0uCisKKyMjIENvbXBhcmluZyBwZXJmb3JtYW5jZSBvZiB0d28gdmVyc2lvbnMgb2YgUERGaXVtCisKK3NhZmV0eW5ldF9jb21wYXJlLnB5IGlzIGEgc2NyaXB0IHRoYXQgY29tcGFyZXMgdGhlIHBlcmZvcm1hbmNlIGJldHdlZW4gdHdvCit2ZXJzaW9ucyBvZiBwZGZpdW0uIFRoaXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IGlmIGEgZ2l2ZW4gY2hhbmdlIGhhcyBjYXVzZWQKK29yIHdpbGwgY2F1c2UgYW55IHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGNoYW5nZXMgaW4gcGVyZm9ybWFuY2UgZm9yIGEgc2V0IG9mIHRlc3QKK2Nhc2VzLgorCitUaGUgc3VwcG9ydGVkIHByb2ZpbGVycyBhcmUgZXhjbHVzaXZlIHRvIExpbnV4LCBzbyBmb3Igbm93IHRoaXMgY2FuIG9ubHkgYmUgcnVuCitvbiBMaW51eC4KKworQW4gaWxsdXN0cmF0aXZlIGV4YW1wbGUgaXMgYmVsb3csIGNvbXBhcmluZyB0aGUgbG9jYWwgY29kZSB2ZXJzaW9uIHRvIGFuIG9sZGVyCit2ZXJzaW9uLiBQb3NpdGl2ZSAlIGNoYW5nZXMgbWVhbiBhbiBpbmNyZWFzZSBpbiB0aW1lL2luc3RydWN0aW9ucyB0byBydW4gdGhlCit0ZXN0IC0gYSByZWdyZXNzaW9uLCB3aGlsZSBuZWdhdGl2ZSAlIGNoYW5nZXMgbWVhbiBhIGRlY3JlYXNlIGluCit0aW1lL2luc3RydWN0aW9ucywgdGhlcmVmb3JlIGFuIGltcHJvdmVtZW50LgorCitgYGAKKyQgdGVzdGluZy90b29scy9zYWZldHluZXRfY29tcGFyZS5weSB+L3Rlc3RfcGRmcyAtLWJyYW5jaC1iZWZvcmUgYmVlZjVlNAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICUgQ2hhbmdlICAgICAgVGltZSBhZnRlciAgVGVzdCBjYXNlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgLTAuMTk4MCUgIDQ1LDcwMyw4MjAsMzI2ICB+L3Rlc3RfcGRmcy9QREYgUmVmZXJlbmNlIDEtNy5wZGYKKyAgIC0wLjU2NzglICAgICAgNDIsMDM4LDgxNCAgfi90ZXN0X3BkZnMvUGFnZSAyNCAtIFBERiBSZWZlcmVuY2UgMS03LnBkZgorICAgKzAuMjY2NiUgIDEwLDk4MywxNTgsODA5ICB+L3Rlc3RfcGRmcy9SaXZhbC5wZGYKKyAgICswLjA0NDclICAxMCw0MTMsODkwLDc0OCAgfi90ZXN0X3BkZnMvZHluYW1pYy5wZGYKKyAgIC03LjcyMjglICAgICAgMjYsMTYxLDE3MSAgfi90ZXN0X3BkZnMvZW5jcnlwdGVkMTIzNC5wZGYKKyAgIC0wLjI3NjMlICAgICAxMDIsMDg0LDM5OCAgfi90ZXN0X3BkZnMvZ2hvc3QucGRmCisgICAtMy43MDA1JSAgMTAsODAwLDY0MiwyNjIgIH4vdGVzdF9wZGZzL211c2ljaWFuLnBkZgorICAgLTAuMjI2NiUgIDQ1LDY5MSw2MTgsNzg5ICB+L3Rlc3RfcGRmcy9ub19tZXRhZGF0YS5wZGYKKyAgICsxLjQ0NDAlICAzOCw0NDIsNjA2LDE2MiAgfi90ZXN0X3BkZnMvdGVzdDcucGRmCisgICArMC4wMzM1JSAgICAgICA5LDI4NiwwODMgIH4vdGVzdF9wZGZzL3Rlc3RidWxsZXRwb2ludC5wZGYKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitUZXN0IGNhc2VzIHJ1bjogMTAKK0ZhaWxlZCB0byBtZWFzdXJlOiAwCitSZWdyZXNzaW9uczogMAorSW1wcm92ZW1lbnRzOiAyCitgYGAKKworIyMjIFVzYWdlCisKK1J1biB0aGUgc2FmZXR5bmV0X2NvbXBhcmUucHkgc2NyaXB0IGluIHRlc3RpbmcvdG9vbHMgdG8gcGVyZm9ybSBhIGNvbXBhcmlzb24uCitQYXNzIG9uZSBvciBtb3JlIHBhdGhzIHdpdGggdGVzdCBjYXNlcyAtIGVhY2ggcGF0aCBjYW4gYmUgZWl0aGVyIGEgLnBkZiBmaWxlIG9yCithIGRpcmVjdG9yeSBjb250YWluaW5nIC5wZGYgZmlsZXMuIE90aGVyIGZpbGVzIGluIHRob3NlIGRpcmVjdG9yaWVzIGFyZQoraWdub3JlZC4KKworVGhlIGZvbGxvd2luZyBjb21wYXJpc29uIG1vZGVzIGFyZSBzdXBwb3J0ZWQ6CisKKzEuIENvbXBhcmUgdW5jb21taXR0ZWQgY2hhbmdlcyBhZ2FpbnN0IGNsZWFuIGJyYW5jaDoKK2BgYHNoZWxsCiskIHRlc3RpbmcvdG9vbHMvc2FmZXR5bmV0X2NvbXBhcmUucHkgcGF0aC90by9wZGZzCitgYGAKKworMi4gQ29tcGFyZSBjdXJyZW50IGJyYW5jaCB3aXRoIGFub3RoZXIgYnJhbmNoIG9yIGNvbW1pdDoKK2BgYHNoZWxsCiskIHRlc3RpbmcvdG9vbHMvc2FmZXR5bmV0X2NvbXBhcmUucHkgcGF0aC90by9wZGZzIC0tYnJhbmNoLWJlZm9yZSBhbm90aGVyX2JyYW5jaAorJCB0ZXN0aW5nL3Rvb2xzL3NhZmV0eW5ldF9jb21wYXJlLnB5IHBhdGgvdG8vcGRmcyAtLWJyYW5jaC1iZWZvcmUgMWEzYzVlNworYGBgCisKKzMuIENvbXBhcmUgdHdvIG90aGVyIGJyYW5jaGVzIG9yIGNvbW1pdHM6CitgYGBzaGVsbAorJCB0ZXN0aW5nL3Rvb2xzL3NhZmV0eW5ldF9jb21wYXJlLnB5IHBhdGgvdG8vcGRmcyAtLWJyYW5jaC1hZnRlciBhbm90aGVyX2JyYW5jaCAtLWJyYW5jaC1iZWZvcmUgeWV0X2Fub3RoZXJfYnJhbmNoCiskIHRlc3RpbmcvdG9vbHMvc2FmZXR5bmV0X2NvbXBhcmUucHkgcGF0aC90by9wZGZzIC0tYnJhbmNoLWFmdGVyIDFhM2M1ZTcgLS1icmFuY2gtYmVmb3JlIDBiMmQ0ZjYKKyQgdGVzdGluZy90b29scy9zYWZldHluZXRfY29tcGFyZS5weSBwYXRoL3RvL3BkZnMgLS1icmFuY2gtYWZ0ZXIgYW5vdGhlcl9icmFuY2ggLS1icmFuY2gtYmVmb3JlIDBiMmQ0ZjYKK2BgYAorCis0LiBDb21wYXJlIHR3byBidWlsZCBmbGFnIGNvbmZpZ3VyYXRpb25zOgorYGBgc2hlbGwKKyQgZ24gYXJncyBvdXQvQnVpbGRDb25maWcxCiskIGduIGFyZ3Mgb3V0L0J1aWxkQ29uZmlnMgorJCB0ZXN0aW5nL3Rvb2xzL3NhZmV0eW5ldF9jb21wYXJlLnB5IHBhdGgvdG8vcGRmcyAtLWJ1aWxkLWRpciBvdXQvQnVpbGRDb25maWcyIC0tYnVpbGQtZGlyLWJlZm9yZSBvdXQvQnVpbGRDb25maWcxCitgYGAKKworc2FmZXR5bmV0X2NvbXBhcmUucHkgdGFrZXMgY2FyZSBvZiBjaGVja2luZyBvdXQgdGhlIGFwcHJvcHJpYXRlIGJyYW5jaCwgYnVpbGRpbmcKK2l0LCBydW5uaW5nIHRoZSB0ZXN0IGNhc2VzIGFuZCBjb21wYXJpbmcgcmVzdWx0cy4KKworIyMjIFByb2ZpbGVycworCitzYWZldHluZXRfY29tcGFyZS5weSB1c2VzIGNhbGxncmluZCBhcyBhIHByb2ZpbGVyIGJ5IGRlZmF1bHQuIFVzZSAtLXByb2ZpbGVyCit0byBzcGVjaWZ5IGFub3RoZXIgb25lLiBUaGUgc3VwcG9ydGVkIG9uZXMgYXJlOgorCisjIyMjIHBlcmZzdGF0CisKK09ubHkgd29ya3Mgb24gTGludXguCitNYWtlIHN1cmUgeW91IGhhdmUgcGVyZiBieSB0eXBpbmcgaW4gdGhlIHRlcm1pbmFsOgorYGBgc2hlbGwKKyQgcGVyZgorYGBgCisKK1RoaXMgaXMgYSBmYXN0IHByb2ZpbGVyLCBidXQgdXNlcyBzYW1wbGluZyBzbyBpdCdzIHNsaWdodGx5IGluYWNjdXJhdGUuCitFeHBlY3QgdmFyaWF0aW9ucyBvZiB1cCB0byAxJSwgd2hpY2ggaXMgYmVsb3cgdGhlIGN1dG9mZiB0byBjb25zaWRlciBhCitjaGFuZ2Ugc2lnbmlmaWNhbnQuCisKK1VzZSB0aGlzIHdoZW4gcnVubmluZyBvdmVyIGxhcmdlIHRlc3Qgc2V0cyB0byBnZXQgZ29vZCBlbm91Z2ggcmVzdWx0cy4KKworIyMjIyBjYWxsZ3JpbmQKKworT25seSB3b3JrcyBvbiBMaW51eC4KK01ha2Ugc3VyZSB2YWxncmluZCBpcyBpbnN0YWxsZWQ6CitgYGBzaGVsbAorJCB2YWxncmluZAorYGBgCisKK1RoaXMgaXMgYSBzbG93IGFuZCBhY2N1cmF0ZSBwcm9maWxlci4gRXhwZWN0IHZhcmlhdGlvbnMgb2YgYXJvdW5kIDEwMAoraW5zdHJ1Y3Rpb25zLiBIb3dldmVyLCB0aGlzIHRha2VzIGFib3V0IDUwIHRpbWVzIGxvbmdlciB0byBydW4gdGhhbiBwZXJmIHN0YXQuCisKK1VzZSB0aGlzIHdoZW4gbG9va2luZyBmb3Igc21hbGwgdmFyaWF0aW9ucyAoPCAxJSkuCisKK09uZSBhZHZhbnRhZ2UgaXMgdGhhdCBjYWxsZ3JpbmQgY2FuIGdlbmVyYXRlIGBjYWxsZ3JpbmQub3V0YCBmaWxlcyAoYnkgcGFzc2luZworLS1vdXRwdXQtZGlyIHRvIHNhZmV0eW5ldF9jb21wYXJlLnB5KSwgd2hpY2ggY29udGFpbiBwcm9maWxpbmcgaW5mb3JtYXRpb24gdGhhdAorY2FuIGJlIGFuYWx5emVkIHRvIGZpbmQgdGhlIGNhdXNlIG9mIGEgcmVncmVzc2lvbi4gS0NhY2hlZ3JpbmQgaXMgYSBnb29kCit2aXN1YWxpemVyIGZvciB0aGVzZSBmaWxlcy4KKworIyMjIENvbW1vbiBPcHRpb25zCisKK0FyZ3VtZW50cyBjb21tb25seSBwYXNzZWQgdG8gc2FmZXR5bmV0X2NvbXBhcmUucHkuCisKKyogLS1wcm9maWxlcjogZGVzY3JpYmVkIGFib3ZlLgorKiAtLWJ1aWxkLWRpcjogdGhpcyBzcGVjaWZpZWQgdGhlIGJ1aWxkIGNvbmZpZyB3aXRoIGEgcmVsYXRpdmUgcGF0aCBmcm9tIHRoZQorcGRmaXVtIHNyYyBkaXJlY3RvcnkgdG8gdGhlIGJ1aWxkIGRpcmVjdG9yeS4gRGVmYXVsdHMgdG8gb3V0L1JlbGVhc2UuCisqIC0tb3V0cHV0LWRpcjogd2hlcmUgdG8gcGxhY2UgdGhlIHByb2ZpbGluZyBvdXRwdXQgZmlsZXMuIFRoZXNlIGFyZQorY2FsbGdyaW5kLm91dC5bdGVzdF9jYXNlXSBmaWxlcyBmb3IgY2FsbGdyaW5kLCBwZXJmc3RhdCBkb2VzIG5vdCBwcm9kdWNlIHRoZW0uCitCeSBkZWZhdWx0IHRoZXkgYXJlIG5vdCB3cml0dGVuLgorKiAtLWNhc2Utb3JkZXI6IHNvcnQgdGVzdCBjYXNlIHJlc3VsdHMgYWNjb3JkaW5nIHRvIHRoaXMgbWV0cmljLiBDYW4gYmUgImFmdGVyIiwKKyJiZWZvcmUiLCAicmF0aW8iIGFuZCAicmF0aW5nIi4gSWYgbm90IHNwZWNpZmllZCwgc29ydCBieSBwYXRoLgorKiAtLXRoaXMtcmVwbzogdXNlIHRoZSByZXBvc2l0b3J5IHdoZXJlIHRoZSBzY3JpcHQgaXMgaW5zdGVhZCBvZiBjaGVja2luZyBvdXQgYQordGVtcG9yYXJ5IG9uZS4gVGhpcyBpcyBmYXN0ZXIgYW5kIGRvZXMgbm90IHJlcXVpcmUgZG93bmxvYWRzLiBBbHRob3VnaCBpdAorcmVzdG9yZXMgdGhlIHN0YXRlIG9mIHRoZSBsb2NhbCByZXBvLCBpZiB0aGUgc2NyaXB0IGlzIGtpbGxlZCBvciBjcmFzaGVzIHRoZQordW5jb21taXR0ZWQgY2hhbmdlcyBjYW4gcmVtYWluIHN0YXNoZWQgYW5kIHlvdSBtYXkgYmUgb24gYW5vdGhlciBicmFuY2guCisKKyMjIyBPdGhlciBPcHRpb25zCisKK01vc3Qgb2YgdGhlIHRpbWUgdGhlc2UgZG9uJ3QgbmVlZCB0byBiZSB1c2VkLgorCisqIC0tYnVpbGQtZGlyLWJlZm9yZTogaWYgY29tcGFyaW5nIGRpZmZlcmVudCBidWlsZCBkaXJzIChzYXksIHRvIHRlc3Qgd2hhdCBhCitmbGFnIGZsaXAgZG9lcyksIHNwZWNpZnkgdGhlIGJ1aWxkIGRpciBmb3IgdGhlIOKAnGJlZm9yZeKAnSBicmFuY2ggaGVyZSBhbmQgdGhlCitidWlsZCBkaXIgZm9yIHRoZSDigJxhZnRlcuKAnSBicmFuY2ggd2l0aCAtLWJ1aWxkLWRpci4KKyogLS1pbnRlcmVzdGluZy1zZWN0aW9uOiBvbmx5IHRoZSBpbnRlcmVzdGluZyBzZWN0aW9uIHNob3VsZCBiZSBtZWFzdXJlZCBpbnN0ZWFkCitvZiBhbGwgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGVzdCBoYXJuZXNzLiBUaGlzIG9ubHkgd29ya3MgaW4gZGVidWcsIHNpbmNlIGluCityZWxlYXNlIHRoZSBkZWxpbWl0ZXJzIGFyZSBzdHJpcHBlZCBvdXQuIFRoaXMgZG9lcyBub3Qgd29yayB0byBjb21wYXJlIGJyYW5jaGVzCit0aGF0IGRvbuKAmXQgaGF2ZSB0aGUgY2FsbGdyaW5kIGRlbGltaXRlcnMsIGFzIGl0IHdvdWxkIG90aGVyd2lzZSBiZSB1bmZhaXIgdG8KK2NvbXBhcmUgYSB3aG9sZSBydW4gdnMgdGhlIGludGVyZXN0aW5nIHNlY3Rpb24gb2YgYW5vdGhlciBydW4uCisqIC0tbWFjaGluZS1yZWFkYWJsZTogb3V0cHV0IGEganNvbiB3aXRoIHRoZSByZXN1bHRzIHRoYXQgaXMgZWFzaWVyIHRvIHJlYWQgYnkKK2NvZGUuCisqIC0tbnVtLXdvcmtlcnM6IGhvdyBtYW55IHdvcmtlcnMgdG8gdXNlIHRvIHBhcmFsbGVsaXplIHRlc3QgY2FzZSBydW5zLiBEZWZhdWx0cwordG8gIyBvZiBDUFVzIGluIHRoZSBtYWNoaW5lLgorKiAtLXRocmVzaG9sZC1zaWduaWZpY2FudDogaGlnaGxpZ2h0IGRpZmZlcmVuY2VzIHRoYXQgZXhjZWVkIHRoaXMgdmFsdWUuCitEZWZhdWx0cyB0byAwLjAyLgorKiAtLXRtcC1kaXI6IGRpcmVjdG9yeSBpbiB3aGljaCB0ZW1wb3JhcnkgcmVwb3Mgd2lsbCBiZSBjbG9uZWQgYW5kIGRvd25sb2Fkcword2lsbCBiZSBjYWNoZWQsIGlmIC0tdGhpcy1yZXBvIGlzIG5vdCBlbmFibGVkLiBEZWZhdWx0cyB0byAvdG1wLgorCisjIyBTZXR1cCBhIG5pZ2h0bHkgam9iCisKK1RPRE86IENvbXBsZXRlIHdpdGggc2FmZXR5bmV0X2pvYi5weSBzZXR1cCBhbmQgdXNhZ2UuCmRpZmYgLS1naXQgYS9mcGRmc2RrL0RFUFMgYi9mcGRmc2RrL0RFUFMKaW5kZXggZTA3NzIyNS4uOTVkZGZlMSAxMDA2NDQKLS0tIGEvZnBkZnNkay9ERVBTCisrKyBiL2ZwZGZzZGsvREVQUwpAQCAtMSw5ICsxLDEwIEBACiBpbmNsdWRlX3J1bGVzID0gWwogICAnK2NvcmUnLAorICAnK2Z4anMnLAogICAnK3B1YmxpYycsCiAgICcrdjgnLAogICAnK3hmYS9md2wnLAotICAnK3hmYS9meGJhcmNvZGUnLAorICAnK2Z4YmFyY29kZScsCiAgICcreGZhL2Z4ZmEnLAogICAnK3hmYS9meGdyYXBoaWNzJywKICAgXQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9jYmFfYW5ub3RpdGVyYXRvci5jcHAgYi9mcGRmc2RrL2NiYV9hbm5vdGl0ZXJhdG9yLmNwcAppbmRleCBjYzg0MmJhLi5kMWM5NTk5IDEwMDY0NAotLS0gYS9mcGRmc2RrL2NiYV9hbm5vdGl0ZXJhdG9yLmNwcAorKysgYi9mcGRmc2RrL2NiYV9hbm5vdGl0ZXJhdG9yLmNwcApAQCAtMzQsNyArMzQsNyBAQAogICAgICAgbV9wUGFnZVZpZXcocFBhZ2VWaWV3KSwKICAgICAgIG1fbkFubm90U3VidHlwZShuQW5ub3RTdWJ0eXBlKSB7CiAgIENQREZfUGFnZSogcFBERlBhZ2UgPSBtX3BQYWdlVmlldy0+R2V0UERGUGFnZSgpOwotICBDRlhfQnl0ZVN0cmluZyBzVGFicyA9IHBQREZQYWdlLT5tX3BGb3JtRGljdC0+R2V0U3RyaW5nRm9yKCJUYWJzIik7CisgIEJ5dGVTdHJpbmcgc1RhYnMgPSBwUERGUGFnZS0+bV9wRm9ybURpY3QtPkdldFN0cmluZ0ZvcigiVGFicyIpOwogICBpZiAoc1RhYnMgPT0gIlIiKQogICAgIG1fZVRhYk9yZGVyID0gUk9XOwogICBlbHNlIGlmIChzVGFicyA9PSAiQyIpCkBAIC03Myw3ICs3Myw3IEBACiB9CiAKIHZvaWQgQ0JBX0Fubm90SXRlcmF0b3I6OkNvbGxlY3RBbm5vdHMoc3RkOjp2ZWN0b3I8Q1BERlNES19Bbm5vdCo+KiBwQXJyYXkpIHsKLSAgZm9yIChhdXRvIHBBbm5vdCA6IG1fcFBhZ2VWaWV3LT5HZXRBbm5vdExpc3QoKSkgeworICBmb3IgKGF1dG8qIHBBbm5vdCA6IG1fcFBhZ2VWaWV3LT5HZXRBbm5vdExpc3QoKSkgewogICAgIGlmIChwQW5ub3QtPkdldEFubm90U3VidHlwZSgpID09IG1fbkFubm90U3VidHlwZSAmJgogICAgICAgICAhcEFubm90LT5Jc1NpZ25hdHVyZVdpZGdldCgpKSB7CiAgICAgICBwQXJyYXktPnB1c2hfYmFjayhwQW5ub3QpOwpAQCAtMTEzLDcgKzExMyw3IEBACiAKICAgICAgIHdoaWxlICghc2EuZW1wdHkoKSkgewogICAgICAgICBpbnQgbkxlZnRUb3BJbmRleCA9IC0xOwotICAgICAgICBGWF9GTE9BVCBmVG9wID0gMC4wZjsKKyAgICAgICAgZmxvYXQgZlRvcCA9IDAuMGY7CiAgICAgICAgIGZvciAoaW50IGkgPSBzYS5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgIENGWF9GbG9hdFJlY3QgcmNBbm5vdCA9IEdldEFubm90UmVjdChzYVtpXSk7CiAgICAgICAgICAgaWYgKHJjQW5ub3QudG9wID4gZlRvcCkgewpAQCAtMTI5LDcgKzEyOSw3IEBACiAgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gYVNlbGVjdDsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzYS5zaXplKCk7ICsraSkgewogICAgICAgICAgIENGWF9GbG9hdFJlY3QgcmNBbm5vdCA9IEdldEFubm90UmVjdChzYVtpXSk7Ci0gICAgICAgICAgRlhfRkxPQVQgZkNlbnRlclkgPSAocmNBbm5vdC50b3AgKyByY0Fubm90LmJvdHRvbSkgLyAyLjBmOworICAgICAgICAgIGZsb2F0IGZDZW50ZXJZID0gKHJjQW5ub3QudG9wICsgcmNBbm5vdC5ib3R0b20pIC8gMi4wZjsKICAgICAgICAgICBpZiAoZkNlbnRlclkgPiByY0xlZnRUb3AuYm90dG9tICYmIGZDZW50ZXJZIDwgcmNMZWZ0VG9wLnRvcCkKICAgICAgICAgICAgIGFTZWxlY3QucHVzaF9iYWNrKGkpOwogICAgICAgICB9CkBAIC0xNDUsNyArMTQ1LDcgQEAKIAogICAgICAgd2hpbGUgKCFzYS5lbXB0eSgpKSB7CiAgICAgICAgIGludCBuTGVmdFRvcEluZGV4ID0gLTE7Ci0gICAgICAgIEZYX0ZMT0FUIGZMZWZ0ID0gLTEuMGY7CisgICAgICAgIGZsb2F0IGZMZWZ0ID0gLTEuMGY7CiAgICAgICAgIGZvciAoaW50IGkgPSBzYS5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewogICAgICAgICAgIENGWF9GbG9hdFJlY3QgcmNBbm5vdCA9IEdldEFubm90UmVjdChzYVtpXSk7CiAgICAgICAgICAgaWYgKGZMZWZ0IDwgMCkgewpAQCAtMTY0LDcgKzE2NCw3IEBACiAgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gYVNlbGVjdDsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzYS5zaXplKCk7ICsraSkgewogICAgICAgICAgIENGWF9GbG9hdFJlY3QgcmNBbm5vdCA9IEdldEFubm90UmVjdChzYVtpXSk7Ci0gICAgICAgICAgRlhfRkxPQVQgZkNlbnRlclggPSAocmNBbm5vdC5sZWZ0ICsgcmNBbm5vdC5yaWdodCkgLyAyLjBmOworICAgICAgICAgIGZsb2F0IGZDZW50ZXJYID0gKHJjQW5ub3QubGVmdCArIHJjQW5ub3QucmlnaHQpIC8gMi4wZjsKICAgICAgICAgICBpZiAoZkNlbnRlclggPiByY0xlZnRUb3AubGVmdCAmJiBmQ2VudGVyWCA8IHJjTGVmdFRvcC5yaWdodCkKICAgICAgICAgICAgIGFTZWxlY3QucHVzaF9iYWNrKGkpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2NiYV9hbm5vdGl0ZXJhdG9yLmggYi9mcGRmc2RrL2NiYV9hbm5vdGl0ZXJhdG9yLmgKaW5kZXggNWNiZThlMy4uOGY5NzY4ZCAxMDA2NDQKLS0tIGEvZnBkZnNkay9jYmFfYW5ub3RpdGVyYXRvci5oCisrKyBiL2ZwZGZzZGsvY2JhX2Fubm90aXRlcmF0b3IuaApAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2Fubm90LmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogCiBjbGFzcyBDUERGU0RLX0Fubm90OwogY2xhc3MgQ1BERlNES19QYWdlVmlldzsKQEAgLTM3LDcgKzM4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4qIGFTZWxlY3QpOwogCiAgIFRhYk9yZGVyIG1fZVRhYk9yZGVyOwotICBDUERGU0RLX1BhZ2VWaWV3KiBtX3BQYWdlVmlldzsKKyAgVW5vd25lZFB0cjxDUERGU0RLX1BhZ2VWaWV3PiBtX3BQYWdlVmlldzsKICAgQ1BERl9Bbm5vdDo6U3VidHlwZSBtX25Bbm5vdFN1YnR5cGU7CiAgIHN0ZDo6dmVjdG9yPENQREZTREtfQW5ub3QqPiBtX0Fubm90czsKIH07CmRpZmYgLS1naXQgYS9mcGRmc2RrL2NmeF9zeXN0ZW1oYW5kbGVyLmNwcCBiL2ZwZGZzZGsvY2Z4X3N5c3RlbWhhbmRsZXIuY3BwCmluZGV4IGI2ZGMxOWQuLmJiYjAyOTMgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvY2Z4X3N5c3RlbWhhbmRsZXIuY3BwCisrKyBiL2ZwZGZzZGsvY2Z4X3N5c3RlbWhhbmRsZXIuY3BwCkBAIC05LDYgKzksOCBAQAogI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29kZXBhZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnQuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnRtYXBwZXIuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnRtZ3IuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dlbW9kdWxlLmgiCkBAIC0yMSwyMCArMjMsMjYgQEAKIG5hbWVzcGFjZSB7CiAKIGludCBDaGFyU2V0MkNQKGludCBjaGFyc2V0KSB7Ci0gIGlmIChjaGFyc2V0ID09IEZYRk9OVF9TSElGVEpJU19DSEFSU0VUKQotICAgIHJldHVybiA5MzI7Ci0gIGlmIChjaGFyc2V0ID09IEZYRk9OVF9HQjIzMTJfQ0hBUlNFVCkKLSAgICByZXR1cm4gOTM2OwotICBpZiAoY2hhcnNldCA9PSBGWEZPTlRfSEFOR1VMX0NIQVJTRVQpCi0gICAgcmV0dXJuIDk0OTsKLSAgaWYgKGNoYXJzZXQgPT0gRlhGT05UX0NISU5FU0VCSUc1X0NIQVJTRVQpCi0gICAgcmV0dXJuIDk1MDsKLSAgcmV0dXJuIDA7CisgIGlmIChjaGFyc2V0ID09IEZYX0NIQVJTRVRfU2hpZnRKSVMpCisgICAgcmV0dXJuIEZYX0NPREVQQUdFX1NoaWZ0SklTOworICBpZiAoY2hhcnNldCA9PSBGWF9DSEFSU0VUX0NoaW5lc2VTaW1wbGlmaWVkKQorICAgIHJldHVybiBGWF9DT0RFUEFHRV9DaGluZXNlU2ltcGxpZmllZDsKKyAgaWYgKGNoYXJzZXQgPT0gRlhfQ0hBUlNFVF9IYW5ndWwpCisgICAgcmV0dXJuIEZYX0NPREVQQUdFX0hhbmd1bDsKKyAgaWYgKGNoYXJzZXQgPT0gRlhfQ0hBUlNFVF9DaGluZXNlVHJhZGl0aW9uYWwpCisgICAgcmV0dXJuIEZYX0NPREVQQUdFX0NoaW5lc2VUcmFkaXRpb25hbDsKKyAgcmV0dXJuIEZYX0NPREVQQUdFX0RlZkFOU0k7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZQogCi12b2lkIENGWF9TeXN0ZW1IYW5kbGVyOjpJbnZhbGlkYXRlUmVjdChDUERGU0RLX1dpZGdldCogd2lkZ2V0LCBGWF9SRUNUIHJlY3QpIHsKK0NGWF9TeXN0ZW1IYW5kbGVyOjpDRlhfU3lzdGVtSGFuZGxlcihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikKKyAgICA6IG1fcEZvcm1GaWxsRW52KHBGb3JtRmlsbEVudikge30KKworQ0ZYX1N5c3RlbUhhbmRsZXI6On5DRlhfU3lzdGVtSGFuZGxlcigpIHt9CisKK3ZvaWQgQ0ZYX1N5c3RlbUhhbmRsZXI6OkludmFsaWRhdGVSZWN0KENQREZTREtfV2lkZ2V0KiB3aWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KSB7CiAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHdpZGdldC0+R2V0UGFnZVZpZXcoKTsKICAgVW5kZXJseWluZ1BhZ2VUeXBlKiBwUGFnZSA9IHdpZGdldC0+R2V0VW5kZXJseWluZ1BhZ2UoKTsKICAgaWYgKCFwUGFnZSB8fCAhcFBhZ2VWaWV3KQpAQCAtNDMsMTcgKzUxLDE1IEBACiAgIENGWF9NYXRyaXggcGFnZTJkZXZpY2U7CiAgIHBQYWdlVmlldy0+R2V0Q3VycmVudE1hdHJpeChwYWdlMmRldmljZSk7CiAKLSAgQ0ZYX01hdHJpeCBkZXZpY2UycGFnZTsKLSAgZGV2aWNlMnBhZ2UuU2V0UmV2ZXJzZShwYWdlMmRldmljZSk7CisgIENGWF9NYXRyaXggZGV2aWNlMnBhZ2UgPSBwYWdlMmRldmljZS5HZXRJbnZlcnNlKCk7CiAKLSAgQ0ZYX1BvaW50RiBsZWZ0X3RvcCA9IGRldmljZTJwYWdlLlRyYW5zZm9ybShDRlhfUG9pbnRGKAotICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHJlY3QubGVmdCksIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihyZWN0LnRvcCkpKTsKLSAgQ0ZYX1BvaW50RiByaWdodF9ib3R0b20gPSBkZXZpY2UycGFnZS5UcmFuc2Zvcm0oQ0ZYX1BvaW50RigKLSAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihyZWN0LnJpZ2h0KSwgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHJlY3QuYm90dG9tKSkpOworICBDRlhfUG9pbnRGIGxlZnRfdG9wID0gZGV2aWNlMnBhZ2UuVHJhbnNmb3JtKENGWF9Qb2ludEYocmVjdC5sZWZ0LCByZWN0LnRvcCkpOworICBDRlhfUG9pbnRGIHJpZ2h0X2JvdHRvbSA9CisgICAgICBkZXZpY2UycGFnZS5UcmFuc2Zvcm0oQ0ZYX1BvaW50RihyZWN0LnJpZ2h0LCByZWN0LmJvdHRvbSkpOwogCiAgIENGWF9GbG9hdFJlY3QgcmNQREYobGVmdF90b3AueCwgcmlnaHRfYm90dG9tLnksIHJpZ2h0X2JvdHRvbS54LCBsZWZ0X3RvcC55KTsKICAgcmNQREYuTm9ybWFsaXplKCk7Ci0gIG1fcEZvcm1GaWxsRW52LT5JbnZhbGlkYXRlKHBQYWdlLCByY1BERi5Ub0Z4UmVjdCgpKTsKKyAgbV9wRm9ybUZpbGxFbnYtPkludmFsaWRhdGUocFBhZ2UsIHJjUERGLkdldE91dGVyUmVjdCgpKTsKIH0KIAogdm9pZCBDRlhfU3lzdGVtSGFuZGxlcjo6T3V0cHV0U2VsZWN0ZWRSZWN0KENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIsCkBAIC04NCw3ICs5MCw3IEBACiAgIG1fcEZvcm1GaWxsRW52LT5TZXRDdXJzb3IobkN1cnNvclR5cGUpOwogfQogCi1ib29sIENGWF9TeXN0ZW1IYW5kbGVyOjpGaW5kTmF0aXZlVHJ1ZVR5cGVGb250KENGWF9CeXRlU3RyaW5nIHNGb250RmFjZU5hbWUpIHsKK2Jvb2wgQ0ZYX1N5c3RlbUhhbmRsZXI6OkZpbmROYXRpdmVUcnVlVHlwZUZvbnQoQnl0ZVN0cmluZyBzRm9udEZhY2VOYW1lKSB7CiAgIENGWF9Gb250TWdyKiBwRm9udE1nciA9IENGWF9HRU1vZHVsZTo6R2V0KCktPkdldEZvbnRNZ3IoKTsKICAgaWYgKCFwRm9udE1ncikKICAgICByZXR1cm4gZmFsc2U7CkBAIC05NywxMSArMTAzLDExIEBACiAgICAgcEZvbnRNYXBwZXItPkxvYWRJbnN0YWxsZWRGb250cygpOwogCiAgIGZvciAoY29uc3QgYXV0byYgZm9udCA6IHBGb250TWFwcGVyLT5tX0luc3RhbGxlZFRURm9udHMpIHsKLSAgICBpZiAoZm9udC5Db21wYXJlKHNGb250RmFjZU5hbWUuQXNTdHJpbmdDKCkpKQorICAgIGlmIChmb250LkNvbXBhcmUoc0ZvbnRGYWNlTmFtZS5Bc1N0cmluZ1ZpZXcoKSkpCiAgICAgICByZXR1cm4gdHJ1ZTsKICAgfQogICBmb3IgKGNvbnN0IGF1dG8mIGZvbnRQYWlyIDogcEZvbnRNYXBwZXItPm1fTG9jYWxpemVkVFRGb250cykgewotICAgIGlmIChmb250UGFpci5maXJzdC5Db21wYXJlKHNGb250RmFjZU5hbWUuQXNTdHJpbmdDKCkpKQorICAgIGlmIChmb250UGFpci5maXJzdC5Db21wYXJlKHNGb250RmFjZU5hbWUuQXNTdHJpbmdWaWV3KCkpKQogICAgICAgcmV0dXJuIHRydWU7CiAgIH0KICAgcmV0dXJuIGZhbHNlOwpAQCAtMTA5LDEyICsxMTUsMTIgQEAKIAogQ1BERl9Gb250KiBDRlhfU3lzdGVtSGFuZGxlcjo6QWRkTmF0aXZlVHJ1ZVR5cGVGb250VG9QREYoCiAgICAgQ1BERl9Eb2N1bWVudCogcERvYywKLSAgICBDRlhfQnl0ZVN0cmluZyBzRm9udEZhY2VOYW1lLAorICAgIEJ5dGVTdHJpbmcgc0ZvbnRGYWNlTmFtZSwKICAgICB1aW50OF90IG5DaGFyc2V0KSB7CiAgIGlmICghcERvYykKICAgICByZXR1cm4gbnVsbHB0cjsKIAotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0ZvbnQ+IHBGWEZvbnQobmV3IENGWF9Gb250KTsKKyAgYXV0byBwRlhGb250ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9Gb250PigpOwogICBwRlhGb250LT5Mb2FkU3Vic3Qoc0ZvbnRGYWNlTmFtZSwgdHJ1ZSwgMCwgMCwgMCwgQ2hhclNldDJDUChuQ2hhcnNldCksIGZhbHNlKTsKICAgcmV0dXJuIHBEb2MtPkFkZEZvbnQocEZYRm9udC5nZXQoKSwgbkNoYXJzZXQsIGZhbHNlKTsKIH0KQEAgLTEyNywxNSArMTMzLDMgQEAKIHZvaWQgQ0ZYX1N5c3RlbUhhbmRsZXI6OktpbGxUaW1lcihpbnQzMl90IG5JRCkgewogICBtX3BGb3JtRmlsbEVudi0+S2lsbFRpbWVyKG5JRCk7CiB9Ci0KLWJvb2wgQ0ZYX1N5c3RlbUhhbmRsZXI6OklzU0hJRlRLZXlEb3duKHVpbnQzMl90IG5GbGFnKSBjb25zdCB7Ci0gIHJldHVybiAhIW1fcEZvcm1GaWxsRW52LT5Jc1NISUZUS2V5RG93bihuRmxhZyk7Ci19Ci0KLWJvb2wgQ0ZYX1N5c3RlbUhhbmRsZXI6OklzQ1RSTEtleURvd24odWludDMyX3QgbkZsYWcpIGNvbnN0IHsKLSAgcmV0dXJuICEhbV9wRm9ybUZpbGxFbnYtPklzQ1RSTEtleURvd24obkZsYWcpOwotfQotCi1ib29sIENGWF9TeXN0ZW1IYW5kbGVyOjpJc0FMVEtleURvd24odWludDMyX3QgbkZsYWcpIGNvbnN0IHsKLSAgcmV0dXJuICEhbV9wRm9ybUZpbGxFbnYtPklzQUxUS2V5RG93bihuRmxhZyk7Ci19CmRpZmYgLS1naXQgYS9mcGRmc2RrL2NmeF9zeXN0ZW1oYW5kbGVyLmggYi9mcGRmc2RrL2NmeF9zeXN0ZW1oYW5kbGVyLmgKaW5kZXggODJjZmM1My4uZjkxMzhjYyAxMDA2NDQKLS0tIGEvZnBkZnNkay9jZnhfc3lzdGVtaGFuZGxlci5oCisrKyBiL2ZwZGZzZGsvY2Z4X3N5c3RlbWhhbmRsZXIuaApAQCAtOCw3ICs4LDkgQEAKICNkZWZpbmUgRlBERlNES19DRlhfU1lTVEVNSEFORExFUl9IXwogCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAKIHVzaW5nIFRpbWVyQ2FsbGJhY2sgPSB2b2lkICgqKShpbnQzMl90IGlkRXZlbnQpOwogCkBAIC00OSwzMCArNTEsMjMgQEAKIAogY2xhc3MgQ0ZYX1N5c3RlbUhhbmRsZXIgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0ZYX1N5c3RlbUhhbmRsZXIoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpCi0gICAgICA6IG1fcEZvcm1GaWxsRW52KHBGb3JtRmlsbEVudikge30KLSAgfkNGWF9TeXN0ZW1IYW5kbGVyKCkge30KKyAgZXhwbGljaXQgQ0ZYX1N5c3RlbUhhbmRsZXIoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpOworICB+Q0ZYX1N5c3RlbUhhbmRsZXIoKTsKIAotICB2b2lkIEludmFsaWRhdGVSZWN0KENQREZTREtfV2lkZ2V0KiB3aWRnZXQsIEZYX1JFQ1QgcmVjdCk7CisgIHZvaWQgSW52YWxpZGF0ZVJlY3QoQ1BERlNES19XaWRnZXQqIHdpZGdldCwgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCk7CiAgIHZvaWQgT3V0cHV0U2VsZWN0ZWRSZWN0KENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIsIENGWF9GbG9hdFJlY3QmIHJlY3QpOwogICBib29sIElzU2VsZWN0aW9uSW1wbGVtZW50ZWQoKSBjb25zdDsKLQogICB2b2lkIFNldEN1cnNvcihpbnQzMl90IG5DdXJzb3JUeXBlKTsKLQotICBib29sIEZpbmROYXRpdmVUcnVlVHlwZUZvbnQoQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRGYWNlTmFtZSk7CisgIGJvb2wgRmluZE5hdGl2ZVRydWVUeXBlRm9udChCeXRlU3RyaW5nIHNGb250RmFjZU5hbWUpOwogICBDUERGX0ZvbnQqIEFkZE5hdGl2ZVRydWVUeXBlRm9udFRvUERGKENQREZfRG9jdW1lbnQqIHBEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRGYWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nIHNGb250RmFjZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBuQ2hhcnNldCk7CiAKICAgaW50MzJfdCBTZXRUaW1lcihpbnQzMl90IHVFbGFwc2UsIFRpbWVyQ2FsbGJhY2sgbHBUaW1lckZ1bmMpOwogICB2b2lkIEtpbGxUaW1lcihpbnQzMl90IG5JRCk7CiAKLSAgYm9vbCBJc1NISUZUS2V5RG93bih1aW50MzJfdCBuRmxhZykgY29uc3Q7Ci0gIGJvb2wgSXNDVFJMS2V5RG93bih1aW50MzJfdCBuRmxhZykgY29uc3Q7Ci0gIGJvb2wgSXNBTFRLZXlEb3duKHVpbnQzMl90IG5GbGFnKSBjb25zdDsKLQogIHByaXZhdGU6Ci0gIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogY29uc3QgbV9wRm9ybUZpbGxFbnY7CisgIFVub3duZWRQdHI8Q1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50PiBjb25zdCBtX3BGb3JtRmlsbEVudjsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19DRlhfU1lTVEVNSEFORExFUl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9jcGRmc2RrX2Fubm90LmNwcCBiL2ZwZGZzZGsvY3BkZnNka19hbm5vdC5jcHAKaW5kZXggNGRjY2U0OC4uZTEwNWVkOSAxMDA2NDQKLS0tIGEvZnBkZnNkay9jcGRmc2RrX2Fubm90LmNwcAorKysgYi9mcGRmc2RrL2NwZGZzZGtfYW5ub3QuY3BwCkBAIC0yMyw3ICsyMyw3IEBACiB9ICAvLyBuYW1lc3BhY2UKIAogQ1BERlNES19Bbm5vdDo6Q1BERlNES19Bbm5vdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpCi0gICAgOiBtX3BQYWdlVmlldyhwUGFnZVZpZXcpLCBtX2JTZWxlY3RlZChmYWxzZSkge30KKyAgICA6IG1fcFBhZ2VWaWV3KHBQYWdlVmlldykge30KIAogQ1BERlNES19Bbm5vdDo6fkNQREZTREtfQW5ub3QoKSB7fQogCkBAIC00MywxMSArNDMsMTEgQEAKIAogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCi1GWF9GTE9BVCBDUERGU0RLX0Fubm90OjpHZXRNaW5XaWR0aCgpIGNvbnN0IHsKK2Zsb2F0IENQREZTREtfQW5ub3Q6OkdldE1pbldpZHRoKCkgY29uc3QgewogICByZXR1cm4ga01pbldpZHRoOwogfQogCi1GWF9GTE9BVCBDUERGU0RLX0Fubm90OjpHZXRNaW5IZWlnaHQoKSBjb25zdCB7CitmbG9hdCBDUERGU0RLX0Fubm90OjpHZXRNaW5IZWlnaHQoKSBjb25zdCB7CiAgIHJldHVybiBrTWluSGVpZ2h0OwogfQogCkBAIC03MywxOCArNzMsNiBAQAogICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdCgpOwogfQogCi12b2lkIENQREZTREtfQW5ub3Q6OkFubm90X09uRHJhdyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykge30KLQotYm9vbCBDUERGU0RLX0Fubm90OjpJc1NlbGVjdGVkKCkgewotICByZXR1cm4gbV9iU2VsZWN0ZWQ7Ci19Ci0KLXZvaWQgQ1BERlNES19Bbm5vdDo6U2V0U2VsZWN0ZWQoYm9vbCBiU2VsZWN0ZWQpIHsKLSAgbV9iU2VsZWN0ZWQgPSBiU2VsZWN0ZWQ7Ci19Ci0KIFVuZGVybHlpbmdQYWdlVHlwZSogQ1BERlNES19Bbm5vdDo6R2V0VW5kZXJseWluZ1BhZ2UoKSB7CiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKICAgcmV0dXJuIEdldFBERlhGQVBhZ2UoKTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvY3BkZnNka19hbm5vdC5oIGIvZnBkZnNkay9jcGRmc2RrX2Fubm90LmgKaW5kZXggMzZlN2I1Ni4uYTZjNDA2NiAxMDA2NDQKLS0tIGEvZnBkZnNkay9jcGRmc2RrX2Fubm90LmgKKysrIGIvZnBkZnNkay9jcGRmc2RrX2Fubm90LmgKQEAgLTEwLDggKzEwLDggQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9hYWN0aW9uLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfYW5ub3QuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9kZWZhdWx0YXBwZWFyYW5jZS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X29ic2VydmFibGUuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9vYnNlcnZhYmxlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogI2luY2x1ZGUgImZwZGZzZGsvY2Z4X3N5c3RlbWhhbmRsZXIuaCIKICNpbmNsdWRlICJmcGRmc2RrL2ZzZGtfY29tbW9uLmgiCiAjaW5jbHVkZSAiZnBkZnNkay9mc2RrX2RlZmluZS5oIgpAQCAtMjIsNyArMjIsNyBAQAogY2xhc3MgQ1BERl9SZW5kZXJPcHRpb25zOwogY2xhc3MgQ1BERlNES19QYWdlVmlldzsKIAotY2xhc3MgQ1BERlNES19Bbm5vdCA6IHB1YmxpYyBDRlhfT2JzZXJ2YWJsZTxDUERGU0RLX0Fubm90PiB7CitjbGFzcyBDUERGU0RLX0Fubm90IDogcHVibGljIE9ic2VydmFibGU8Q1BERlNES19Bbm5vdD4gewogIHB1YmxpYzoKICAgZXhwbGljaXQgQ1BERlNES19Bbm5vdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogICB2aXJ0dWFsIH5DUERGU0RLX0Fubm90KCk7CkBAIC0zMiwxOCArMzIsMTQgQEAKICAgdmlydHVhbCBDWEZBX0ZGV2lkZ2V0KiBHZXRYRkFXaWRnZXQoKSBjb25zdDsKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotICB2aXJ0dWFsIEZYX0ZMT0FUIEdldE1pbldpZHRoKCkgY29uc3Q7Ci0gIHZpcnR1YWwgRlhfRkxPQVQgR2V0TWluSGVpZ2h0KCkgY29uc3Q7CisgIHZpcnR1YWwgZmxvYXQgR2V0TWluV2lkdGgoKSBjb25zdDsKKyAgdmlydHVhbCBmbG9hdCBHZXRNaW5IZWlnaHQoKSBjb25zdDsKICAgdmlydHVhbCBpbnQgR2V0TGF5b3V0T3JkZXIoKSBjb25zdDsKICAgdmlydHVhbCBDUERGX0Fubm90KiBHZXRQREZBbm5vdCgpIGNvbnN0OwogICB2aXJ0dWFsIENQREZfQW5ub3Q6OlN1YnR5cGUgR2V0QW5ub3RTdWJ0eXBlKCkgY29uc3Q7CiAgIHZpcnR1YWwgYm9vbCBJc1NpZ25hdHVyZVdpZGdldCgpIGNvbnN0OwogICB2aXJ0dWFsIENGWF9GbG9hdFJlY3QgR2V0UmVjdCgpIGNvbnN0OwotCiAgIHZpcnR1YWwgdm9pZCBTZXRSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpOwotICB2aXJ0dWFsIHZvaWQgQW5ub3RfT25EcmF3KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpOwogCiAgIFVuZGVybHlpbmdQYWdlVHlwZSogR2V0VW5kZXJseWluZ1BhZ2UoKTsKICAgQ1BERl9QYWdlKiBHZXRQREZQYWdlKCk7CkBAIC01MSwxNSArNDcsMTAgQEAKICAgQ1BERlhGQV9QYWdlKiBHZXRQREZYRkFQYWdlKCk7CiAjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKLSAgdm9pZCBTZXRQYWdlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7Ci0gIENQREZTREtfUGFnZVZpZXcqIEdldFBhZ2VWaWV3KCkgY29uc3QgeyByZXR1cm4gbV9wUGFnZVZpZXc7IH0KLQotICBib29sIElzU2VsZWN0ZWQoKTsKLSAgdm9pZCBTZXRTZWxlY3RlZChib29sIGJTZWxlY3RlZCk7CisgIENQREZTREtfUGFnZVZpZXcqIEdldFBhZ2VWaWV3KCkgY29uc3QgeyByZXR1cm4gbV9wUGFnZVZpZXcuR2V0KCk7IH0KIAogIHByb3RlY3RlZDoKLSAgQ1BERlNES19QYWdlVmlldyogbV9wUGFnZVZpZXc7Ci0gIGJvb2wgbV9iU2VsZWN0ZWQ7CisgIFVub3duZWRQdHI8Q1BERlNES19QYWdlVmlldz4gY29uc3QgbV9wUGFnZVZpZXc7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfQ1BERlNES19BTk5PVF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9jcGRmc2RrX2Fubm90aGFuZGxlcm1nci5jcHAgYi9mcGRmc2RrL2NwZGZzZGtfYW5ub3RoYW5kbGVybWdyLmNwcAppbmRleCBjNDk5MDY3Li4yOTY2YjRkIDEwMDY0NAotLS0gYS9mcGRmc2RrL2NwZGZzZGtfYW5ub3RoYW5kbGVybWdyLmNwcAorKysgYi9mcGRmc2RrL2NwZGZzZGtfYW5ub3RoYW5kbGVybWdyLmNwcApAQCAtMTcsMjMgKzE3LDI1IEBACiAjaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX2Zvcm1maWxsZW52aXJvbm1lbnQuaCIKICNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfcGFnZXZpZXcuaCIKICNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfd2lkZ2V0aGFuZGxlci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAogI2lmZGVmIFBERl9FTkFCTEVfWEZBCiAjaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX3hmYXdpZGdldGhhbmRsZXIuaCIKICNpbmNsdWRlICJmcGRmc2RrL2ZwZGZ4ZmEvY3BkZnhmYV9wYWdlLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmcGFnZXZpZXcuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZ3aWRnZXQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0LmgiCiAjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpDUERGU0RLX0Fubm90SGFuZGxlck1ncigKICAgICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikKLSAgICA6IG1fcEJBQW5ub3RIYW5kbGVyKG5ldyBDUERGU0RLX0JBQW5ub3RIYW5kbGVyKCkpLAotICAgICAgbV9wV2lkZ2V0SGFuZGxlcihuZXcgQ1BERlNES19XaWRnZXRIYW5kbGVyKHBGb3JtRmlsbEVudikpLAorICAgIDogbV9wQkFBbm5vdEhhbmRsZXIocGRmaXVtOjpNYWtlVW5pcXVlPENQREZTREtfQkFBbm5vdEhhbmRsZXI+KCkpLAorICAgICAgbV9wV2lkZ2V0SGFuZGxlcihwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERlNES19XaWRnZXRIYW5kbGVyPihwRm9ybUZpbGxFbnYpKQogI2lmZGVmIFBERl9FTkFCTEVfWEZBCi0gICAgICBtX3BYRkFXaWRnZXRIYW5kbGVyKG5ldyBDUERGU0RLX1hGQVdpZGdldEhhbmRsZXIocEZvcm1GaWxsRW52KSksCisgICAgICAsCisgICAgICBtX3BYRkFXaWRnZXRIYW5kbGVyKAorICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGU0RLX1hGQVdpZGdldEhhbmRsZXI+KHBGb3JtRmlsbEVudikpCiAjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCi0gICAgICBtX3BGb3JtRmlsbEVudihwRm9ybUZpbGxFbnYpIHsKLSAgbV9wV2lkZ2V0SGFuZGxlci0+U2V0Rm9ybUZpbGxlcihtX3BGb3JtRmlsbEVudi0+R2V0SW50ZXJhY3RpdmVGb3JtRmlsbGVyKCkpOworewogfQogCiBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6fkNQREZTREtfQW5ub3RIYW5kbGVyTWdyKCkge30KQEAgLTc0LDYgKzc2LDE2IEBACiAgIEdldEFubm90SGFuZGxlcihwQW5ub3QpLT5PbkxvYWQocEFubm90KTsKIH0KIAorV2lkZVN0cmluZyBDUERGU0RLX0Fubm90SGFuZGxlck1ncjo6QW5ub3RfR2V0U2VsZWN0ZWRUZXh0KAorICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCkgeworICByZXR1cm4gR2V0QW5ub3RIYW5kbGVyKHBBbm5vdCktPkdldFNlbGVjdGVkVGV4dChwQW5ub3QpOworfQorCit2b2lkIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9SZXBsYWNlU2VsZWN0aW9uKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgdGV4dCkgeworICBHZXRBbm5vdEhhbmRsZXIocEFubm90KS0+UmVwbGFjZVNlbGVjdGlvbihwQW5ub3QsIHRleHQpOworfQorCiBJUERGU0RLX0Fubm90SGFuZGxlciogQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3I6OkdldEFubm90SGFuZGxlcigKICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QpIGNvbnN0IHsKICAgcmV0dXJuIEdldEFubm90SGFuZGxlcihwQW5ub3QtPkdldEFubm90U3VidHlwZSgpKTsKQEAgLTE5OCwxNiArMjEwLDE2IEBACiBib29sIENQREZTREtfQW5ub3RIYW5kbGVyTWdyOjpBbm5vdF9PbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuS2V5Q29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkZsYWcpIHsKLSAgaWYgKG1fcEZvcm1GaWxsRW52LT5Jc0NUUkxLZXlEb3duKG5GbGFnKSB8fAotICAgICAgbV9wRm9ybUZpbGxFbnYtPklzQUxUS2V5RG93bihuRmxhZykpIHsKKyAgaWYgKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6SXNDVFJMS2V5RG93bihuRmxhZykgfHwKKyAgICAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6SXNBTFRLZXlEb3duKG5GbGFnKSkgewogICAgIHJldHVybiBHZXRBbm5vdEhhbmRsZXIocEFubm90KS0+T25LZXlEb3duKHBBbm5vdCwgbktleUNvZGUsIG5GbGFnKTsKICAgfQogCiAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlID0gcEFubm90LT5HZXRQYWdlVmlldygpOwogICBDUERGU0RLX0Fubm90KiBwRm9jdXNBbm5vdCA9IHBQYWdlLT5HZXRGb2N1c0Fubm90KCk7CiAgIGlmIChwRm9jdXNBbm5vdCAmJiAobktleUNvZGUgPT0gRldMX1ZLRVlfVGFiKSkgewotICAgIENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyIHBOZXh0KAotICAgICAgICBHZXROZXh0QW5ub3QocEZvY3VzQW5ub3QsICFtX3BGb3JtRmlsbEVudi0+SXNTSElGVEtleURvd24obkZsYWcpKSk7CisgICAgQ1BERlNES19Bbm5vdDo6T2JzZXJ2ZWRQdHIgcE5leHQoR2V0TmV4dEFubm90KAorICAgICAgICBwRm9jdXNBbm5vdCwgIUNQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6SXNTSElGVEtleURvd24obkZsYWcpKSk7CiAgICAgaWYgKHBOZXh0ICYmIHBOZXh0LkdldCgpICE9IHBGb2N1c0Fubm90KSB7CiAgICAgICBwUGFnZS0+R2V0Rm9ybUZpbGxFbnYoKS0+U2V0Rm9jdXNBbm5vdCgmcE5leHQpOwogICAgICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2NwZGZzZGtfYW5ub3RoYW5kbGVybWdyLmggYi9mcGRmc2RrL2NwZGZzZGtfYW5ub3RoYW5kbGVybWdyLmgKaW5kZXggY2JkYTAyYy4uZGY0ZTFhMiAxMDA2NDQKLS0tIGEvZnBkZnNkay9jcGRmc2RrX2Fubm90aGFuZGxlcm1nci5oCisrKyBiL2ZwZGZzZGsvY3BkZnNka19hbm5vdGhhbmRsZXJtZ3IuaApAQCAtMTEsOCArMTEsOCBAQAogI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2Fubm90LmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAjaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX2Fubm90LmgiCiAKIGNsYXNzIENGWF9NYXRyaXg7CkBAIC00Miw2ICs0Miw5IEBACiAgIHZvaWQgQW5ub3RfT25DcmVhdGUoQ1BERlNES19Bbm5vdCogcEFubm90KTsKICAgdm9pZCBBbm5vdF9PbkxvYWQoQ1BERlNES19Bbm5vdCogcEFubm90KTsKIAorICBXaWRlU3RyaW5nIEFubm90X0dldFNlbGVjdGVkVGV4dChDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICB2b2lkIEFubm90X1JlcGxhY2VTZWxlY3Rpb24oQ1BERlNES19Bbm5vdCogcEFubm90LCBjb25zdCBXaWRlU3RyaW5nJiB0ZXh0KTsKKwogICBJUERGU0RLX0Fubm90SGFuZGxlciogR2V0QW5ub3RIYW5kbGVyKENQREZTREtfQW5ub3QqIHBBbm5vdCkgY29uc3Q7CiAgIHZvaWQgQW5ub3RfT25EcmF3KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LApAQCAtMTExLDggKzExNCw2IEBACiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKICAgc3RkOjp1bmlxdWVfcHRyPENQREZTREtfWEZBV2lkZ2V0SGFuZGxlcj4gbV9wWEZBV2lkZ2V0SGFuZGxlcjsKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKLQotICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIG1fcEZvcm1GaWxsRW52OwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0NQREZTREtfQU5OT1RIQU5ETEVSTUdSX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2NwZGZzZGtfYW5ub3RpdGVyYXRpb24uY3BwIGIvZnBkZnNkay9jcGRmc2RrX2Fubm90aXRlcmF0aW9uLmNwcAppbmRleCBkZDk5YWRlLi5kMjU2OTUwIDEwMDY0NAotLS0gYS9mcGRmc2RrL2NwZGZzZGtfYW5ub3RpdGVyYXRpb24uY3BwCisrKyBiL2ZwZGZzZGsvY3BkZnNka19hbm5vdGl0ZXJhdGlvbi5jcHAKQEAgLTMzLDcgKzMzLDcgQEAKICAgICBzdGQ6OnJldmVyc2UoY29waWVkTGlzdC5iZWdpbigpLCBjb3BpZWRMaXN0LmVuZCgpKTsKIAogICBtX0xpc3QucmVzZXJ2ZShjb3BpZWRMaXN0LnNpemUoKSk7Ci0gIGZvciAoY29uc3QgYXV0byYgcEFubm90IDogY29waWVkTGlzdCkKKyAgZm9yIChhdXRvKiBwQW5ub3QgOiBjb3BpZWRMaXN0KQogICAgIG1fTGlzdC5lbXBsYWNlX2JhY2socEFubm90KTsKIH0KIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9jcGRmc2RrX2JhYW5ub3QuY3BwIGIvZnBkZnNkay9jcGRmc2RrX2JhYW5ub3QuY3BwCmluZGV4IDNlZWRmMTUuLmExNTc4ODAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvY3BkZnNka19iYWFubm90LmNwcAorKysgYi9mcGRmc2RrL2NwZGZzZGtfYmFhbm5vdC5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKIENQREZTREtfQkFBbm5vdDo6fkNQREZTREtfQkFBbm5vdCgpIHt9CiAKIENQREZfQW5ub3QqIENQREZTREtfQkFBbm5vdDo6R2V0UERGQW5ub3QoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BBbm5vdDsKKyAgcmV0dXJuIG1fcEFubm90LkdldCgpOwogfQogCiBDUERGX0Fubm90KiBDUERGU0RLX0JBQW5ub3Q6OkdldFBERlBvcHVwQW5ub3QoKSBjb25zdCB7CkBAIC0zOCw2ICszOCwxMyBAQAogICByZXR1cm4gbV9wQW5ub3QtPkdldEFubm90RGljdCgpOwogfQogCitDUERGX0RpY3Rpb25hcnkqIENQREZTREtfQkFBbm5vdDo6R2V0QVBEaWN0KCkgY29uc3QgeworICBDUERGX0RpY3Rpb25hcnkqIHBBUERpY3QgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3RGb3IoIkFQIik7CisgIGlmICghcEFQRGljdCkKKyAgICBwQVBEaWN0ID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXROZXdGb3I8Q1BERl9EaWN0aW9uYXJ5PigiQVAiKTsKKyAgcmV0dXJuIHBBUERpY3Q7Cit9CisKIHZvaWQgQ1BERlNES19CQUFubm90OjpTZXRSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIHsKICAgQVNTRVJUKHJlY3QucmlnaHQgLSByZWN0LmxlZnQgPj0gR2V0TWluV2lkdGgoKSk7CiAgIEFTU0VSVChyZWN0LnRvcCAtIHJlY3QuYm90dG9tID49IEdldE1pbkhlaWdodCgpKTsKQEAgLTU0LDEwICs2MSwxMCBAQAogfQogCiB2b2lkIENQREZTREtfQkFBbm5vdDo6RHJhd0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbXRVc2VyMkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpIHsKLSAgbV9wQW5ub3QtPkRyYXdBcHBlYXJhbmNlKG1fcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCksIHBEZXZpY2UsIHBVc2VyMkRldmljZSwKKyAgbV9wQW5ub3QtPkRyYXdBcHBlYXJhbmNlKG1fcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCksIHBEZXZpY2UsIG10VXNlcjJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlLCBwT3B0aW9ucyk7CiB9CiAKQEAgLTcxLDcgKzc4LDcgQEAKICAgICByZXR1cm4gZmFsc2U7CiAKICAgLy8gQ2hvb3NlIHRoZSByaWdodCBzdWItYXAKLSAgY29uc3QgRlhfQ0hBUiogYXBfZW50cnkgPSAiTiI7CisgIGNvbnN0IGNoYXIqIGFwX2VudHJ5ID0gIk4iOwogICBpZiAobW9kZSA9PSBDUERGX0Fubm90OjpEb3duKQogICAgIGFwX2VudHJ5ID0gIkQiOwogICBlbHNlIGlmIChtb2RlID09IENQREZfQW5ub3Q6OlJvbGxvdmVyKQpAQCAtOTQsNyArMTAxLDcgQEAKICAgbV9wQW5ub3QtPkNsZWFyQ2FjaGVkQVAoKTsKIH0KIAotdm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldENvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzQ29udGVudHMpIHsKK3ZvaWQgQ1BERlNES19CQUFubm90OjpTZXRDb250ZW50cyhjb25zdCBXaWRlU3RyaW5nJiBzQ29udGVudHMpIHsKICAgaWYgKHNDb250ZW50cy5Jc0VtcHR5KCkpIHsKICAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlJlbW92ZUZvcigiQ29udGVudHMiKTsKICAgfSBlbHNlIHsKQEAgLTEwMywxMSArMTEwLDExIEBACiAgIH0KIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19CQUFubm90OjpHZXRDb250ZW50cygpIGNvbnN0IHsKK1dpZGVTdHJpbmcgQ1BERlNES19CQUFubm90OjpHZXRDb250ZW50cygpIGNvbnN0IHsKICAgcmV0dXJuIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+R2V0VW5pY29kZVRleHRGb3IoIkNvbnRlbnRzIik7CiB9CiAKLXZvaWQgQ1BERlNES19CQUFubm90OjpTZXRBbm5vdE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNOYW1lKSB7Cit2b2lkIENQREZTREtfQkFBbm5vdDo6U2V0QW5ub3ROYW1lKGNvbnN0IFdpZGVTdHJpbmcmIHNOYW1lKSB7CiAgIGlmIChzTmFtZS5Jc0VtcHR5KCkpIHsKICAgICBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlJlbW92ZUZvcigiTk0iKTsKICAgfSBlbHNlIHsKQEAgLTExNiwxMyArMTIzLDEzIEBACiAgIH0KIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19CQUFubm90OjpHZXRBbm5vdE5hbWUoKSBjb25zdCB7CitXaWRlU3RyaW5nIENQREZTREtfQkFBbm5vdDo6R2V0QW5ub3ROYW1lKCkgY29uc3QgewogICByZXR1cm4gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXRVbmljb2RlVGV4dEZvcigiTk0iKTsKIH0KIAogdm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldE1vZGlmaWVkRGF0ZShjb25zdCBGWF9TWVNURU1USU1FJiBzdCkgewogICBDUERGU0RLX0RhdGVUaW1lIGR0KHN0KTsKLSAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gZHQuVG9QREZEYXRlVGltZVN0cmluZygpOworICBCeXRlU3RyaW5nIHN0ciA9IGR0LlRvUERGRGF0ZVRpbWVTdHJpbmcoKTsKICAgaWYgKHN0ci5Jc0VtcHR5KCkpCiAgICAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5SZW1vdmVGb3IoIk0iKTsKICAgZWxzZQpAQCAtMTMxLDcgKzEzOCw3IEBACiAKIEZYX1NZU1RFTVRJTUUgQ1BERlNES19CQUFubm90OjpHZXRNb2RpZmllZERhdGUoKSBjb25zdCB7CiAgIEZYX1NZU1RFTVRJTUUgc3lzdGltZTsKLSAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXRTdHJpbmdGb3IoIk0iKTsKKyAgQnl0ZVN0cmluZyBzdHIgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldFN0cmluZ0ZvcigiTSIpOwogICBDUERGU0RLX0RhdGVUaW1lIGR0KHN0cik7CiAgIGR0LlRvU3lzdGVtVGltZShzeXN0aW1lKTsKICAgcmV0dXJuIHN5c3RpbWU7CkBAIC0xNDYsMTQgKzE1MywxNCBAQAogICByZXR1cm4gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXRJbnRlZ2VyRm9yKCJGIik7CiB9CiAKLXZvaWQgQ1BERlNES19CQUFubm90OjpTZXRBcHBTdGF0ZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKSB7Cit2b2lkIENQREZTREtfQkFBbm5vdDo6U2V0QXBwU3RhdGUoY29uc3QgQnl0ZVN0cmluZyYgc3RyKSB7CiAgIGlmIChzdHIuSXNFbXB0eSgpKQogICAgIG1fcEFubm90LT5HZXRBbm5vdERpY3QoKS0+UmVtb3ZlRm9yKCJBUyIpOwogICBlbHNlCiAgICAgbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXROZXdGb3I8Q1BERl9TdHJpbmc+KCJBUyIsIHN0ciwgZmFsc2UpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUERGU0RLX0JBQW5ub3Q6OkdldEFwcFN0YXRlKCkgY29uc3QgeworQnl0ZVN0cmluZyBDUERGU0RLX0JBQW5ub3Q6OkdldEFwcFN0YXRlKCkgY29uc3QgewogICByZXR1cm4gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXRTdHJpbmdGb3IoIkFTIik7CiB9CiAKQEAgLTIxOCw3ICsyMjUsNyBAQAogQm9yZGVyU3R5bGUgQ1BERlNES19CQUFubm90OjpHZXRCb3JkZXJTdHlsZSgpIGNvbnN0IHsKICAgQ1BERl9EaWN0aW9uYXJ5KiBwQlNEaWN0ID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXREaWN0Rm9yKCJCUyIpOwogICBpZiAocEJTRGljdCkgewotICAgIENGWF9CeXRlU3RyaW5nIHNCb3JkZXJTdHlsZSA9IHBCU0RpY3QtPkdldFN0cmluZ0ZvcigiUyIsICJTIik7CisgICAgQnl0ZVN0cmluZyBzQm9yZGVyU3R5bGUgPSBwQlNEaWN0LT5HZXRTdHJpbmdGb3IoIlMiLCAiUyIpOwogICAgIGlmIChzQm9yZGVyU3R5bGUgPT0gIlMiKQogICAgICAgcmV0dXJuIEJvcmRlclN0eWxlOjpTT0xJRDsKICAgICBpZiAoc0JvcmRlclN0eWxlID09ICJEIikKQEAgLTI0NSwxMSArMjUyLDExIEBACiAKIHZvaWQgQ1BERlNES19CQUFubm90OjpTZXRDb2xvcihGWF9DT0xPUlJFRiBjb2xvcikgewogICBDUERGX0FycmF5KiBwQXJyYXkgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPlNldE5ld0ZvcjxDUERGX0FycmF5PigiQyIpOwotICBwQXJyYXktPkFkZE5ldzxDUERGX051bWJlcj4oc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KEZYU1lTX0dldFJWYWx1ZShjb2xvcikpIC8KKyAgcEFycmF5LT5BZGROZXc8Q1BERl9OdW1iZXI+KHN0YXRpY19jYXN0PGZsb2F0PihGWFNZU19HZXRSVmFsdWUoY29sb3IpKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUuMGYpOwotICBwQXJyYXktPkFkZE5ldzxDUERGX051bWJlcj4oc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KEZYU1lTX0dldEdWYWx1ZShjb2xvcikpIC8KKyAgcEFycmF5LT5BZGROZXc8Q1BERl9OdW1iZXI+KHN0YXRpY19jYXN0PGZsb2F0PihGWFNZU19HZXRHVmFsdWUoY29sb3IpKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUuMGYpOwotICBwQXJyYXktPkFkZE5ldzxDUERGX051bWJlcj4oc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KEZYU1lTX0dldEJWYWx1ZShjb2xvcikpIC8KKyAgcEFycmF5LT5BZGROZXc8Q1BERl9OdW1iZXI+KHN0YXRpY19jYXN0PGZsb2F0PihGWFNZU19HZXRCVmFsdWUoY29sb3IpKSAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTUuMGYpOwogfQogCkBAIC0yNjEsMjggKzI2OCwyOCBAQAogICBpZiAoQ1BERl9BcnJheSogcEVudHJ5ID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXRBcnJheUZvcigiQyIpKSB7CiAgICAgc2l6ZV90IG5Db3VudCA9IHBFbnRyeS0+R2V0Q291bnQoKTsKICAgICBpZiAobkNvdW50ID09IDEpIHsKLSAgICAgIEZYX0ZMT0FUIGcgPSBwRW50cnktPkdldE51bWJlckF0KDApICogMjU1OworICAgICAgZmxvYXQgZyA9IHBFbnRyeS0+R2V0TnVtYmVyQXQoMCkgKiAyNTU7CiAKICAgICAgIGNvbG9yID0gRlhTWVNfUkdCKChpbnQpZywgKGludClnLCAoaW50KWcpOwogCiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9IGVsc2UgaWYgKG5Db3VudCA9PSAzKSB7Ci0gICAgICBGWF9GTE9BVCByID0gcEVudHJ5LT5HZXROdW1iZXJBdCgwKSAqIDI1NTsKLSAgICAgIEZYX0ZMT0FUIGcgPSBwRW50cnktPkdldE51bWJlckF0KDEpICogMjU1OwotICAgICAgRlhfRkxPQVQgYiA9IHBFbnRyeS0+R2V0TnVtYmVyQXQoMikgKiAyNTU7CisgICAgICBmbG9hdCByID0gcEVudHJ5LT5HZXROdW1iZXJBdCgwKSAqIDI1NTsKKyAgICAgIGZsb2F0IGcgPSBwRW50cnktPkdldE51bWJlckF0KDEpICogMjU1OworICAgICAgZmxvYXQgYiA9IHBFbnRyeS0+R2V0TnVtYmVyQXQoMikgKiAyNTU7CiAKICAgICAgIGNvbG9yID0gRlhTWVNfUkdCKChpbnQpciwgKGludClnLCAoaW50KWIpOwogCiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9IGVsc2UgaWYgKG5Db3VudCA9PSA0KSB7Ci0gICAgICBGWF9GTE9BVCBjID0gcEVudHJ5LT5HZXROdW1iZXJBdCgwKTsKLSAgICAgIEZYX0ZMT0FUIG0gPSBwRW50cnktPkdldE51bWJlckF0KDEpOwotICAgICAgRlhfRkxPQVQgeSA9IHBFbnRyeS0+R2V0TnVtYmVyQXQoMik7Ci0gICAgICBGWF9GTE9BVCBrID0gcEVudHJ5LT5HZXROdW1iZXJBdCgzKTsKKyAgICAgIGZsb2F0IGMgPSBwRW50cnktPkdldE51bWJlckF0KDApOworICAgICAgZmxvYXQgbSA9IHBFbnRyeS0+R2V0TnVtYmVyQXQoMSk7CisgICAgICBmbG9hdCB5ID0gcEVudHJ5LT5HZXROdW1iZXJBdCgyKTsKKyAgICAgIGZsb2F0IGsgPSBwRW50cnktPkdldE51bWJlckF0KDMpOwogCi0gICAgICBGWF9GTE9BVCByID0gMS4wZiAtIHN0ZDo6bWluKDEuMGYsIGMgKyBrKTsKLSAgICAgIEZYX0ZMT0FUIGcgPSAxLjBmIC0gc3RkOjptaW4oMS4wZiwgbSArIGspOwotICAgICAgRlhfRkxPQVQgYiA9IDEuMGYgLSBzdGQ6Om1pbigxLjBmLCB5ICsgayk7CisgICAgICBmbG9hdCByID0gMS4wZiAtIHN0ZDo6bWluKDEuMGYsIGMgKyBrKTsKKyAgICAgIGZsb2F0IGcgPSAxLjBmIC0gc3RkOjptaW4oMS4wZiwgbSArIGspOworICAgICAgZmxvYXQgYiA9IDEuMGYgLSBzdGQ6Om1pbigxLjBmLCB5ICsgayk7CiAKICAgICAgIGNvbG9yID0gRlhTWVNfUkdCKChpbnQpKHIgKiAyNTUpLCAoaW50KShnICogMjU1KSwgKGludCkoYiAqIDI1NSkpOwogCkBAIC0yOTMsNTAgKzMwMCw2IEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBDUERGU0RLX0JBQW5ub3Q6OldyaXRlQXBwZWFyYW5jZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0FQVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNCQm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQ29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBTdGF0ZSkgewotICBDUERGX0RpY3Rpb25hcnkqIHBBUERpY3QgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3RGb3IoIkFQIik7Ci0gIGlmICghcEFQRGljdCkKLSAgICBwQVBEaWN0ID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXROZXdGb3I8Q1BERl9EaWN0aW9uYXJ5PigiQVAiKTsKLQotICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IG51bGxwdHI7Ci0gIENQREZfRGljdGlvbmFyeSogcFBhcmVudERpY3QgPSBudWxscHRyOwotICBpZiAoc0FQU3RhdGUuSXNFbXB0eSgpKSB7Ci0gICAgcFBhcmVudERpY3QgPSBwQVBEaWN0OwotICAgIHBTdHJlYW0gPSBwQVBEaWN0LT5HZXRTdHJlYW1Gb3Ioc0FQVHlwZSk7Ci0gIH0gZWxzZSB7Ci0gICAgQ1BERl9EaWN0aW9uYXJ5KiBwQVBUeXBlRGljdCA9IHBBUERpY3QtPkdldERpY3RGb3Ioc0FQVHlwZSk7Ci0gICAgaWYgKCFwQVBUeXBlRGljdCkKLSAgICAgIHBBUFR5cGVEaWN0ID0gcEFQRGljdC0+U2V0TmV3Rm9yPENQREZfRGljdGlvbmFyeT4oc0FQVHlwZSk7Ci0KLSAgICBwUGFyZW50RGljdCA9IHBBUFR5cGVEaWN0OwotICAgIHBTdHJlYW0gPSBwQVBUeXBlRGljdC0+R2V0U3RyZWFtRm9yKHNBUFN0YXRlKTsKLSAgfQotCi0gIGlmICghcFN0cmVhbSkgewotICAgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBtX3BQYWdlVmlldy0+R2V0UERGRG9jdW1lbnQoKTsKLSAgICBwU3RyZWFtID0gcERvYy0+TmV3SW5kaXJlY3Q8Q1BERl9TdHJlYW0+KCk7Ci0gICAgcFBhcmVudERpY3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oc0FQVHlwZSwgcERvYywgcFN0cmVhbS0+R2V0T2JqTnVtKCkpOwotICB9Ci0KLSAgQ1BERl9EaWN0aW9uYXJ5KiBwU3RyZWFtRGljdCA9IHBTdHJlYW0tPkdldERpY3QoKTsKLSAgaWYgKCFwU3RyZWFtRGljdCkgewotICAgIGF1dG8gcE5ld0RpY3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigKLSAgICAgICAgbV9wQW5ub3QtPkdldERvY3VtZW50KCktPkdldEJ5dGVTdHJpbmdQb29sKCkpOwotICAgIHBTdHJlYW1EaWN0ID0gcE5ld0RpY3QuZ2V0KCk7Ci0gICAgcFN0cmVhbURpY3QtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJUeXBlIiwgIlhPYmplY3QiKTsKLSAgICBwU3RyZWFtRGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIlN1YnR5cGUiLCAiRm9ybSIpOwotICAgIHBTdHJlYW1EaWN0LT5TZXROZXdGb3I8Q1BERl9OdW1iZXI+KCJGb3JtVHlwZSIsIDEpOwotICAgIHBTdHJlYW0tPkluaXRTdHJlYW0obnVsbHB0ciwgMCwgc3RkOjptb3ZlKHBOZXdEaWN0KSk7Ci0gIH0KLSAgcFN0cmVhbURpY3QtPlNldE1hdHJpeEZvcigiTWF0cml4IiwgbWF0cml4KTsKLSAgcFN0cmVhbURpY3QtPlNldFJlY3RGb3IoIkJCb3giLCByY0JCb3gpOwotICBwU3RyZWFtLT5TZXREYXRhKCh1aW50OF90KilzQ29udGVudHMuY19zdHIoKSwgc0NvbnRlbnRzLkdldExlbmd0aCgpKTsKLX0KLQogYm9vbCBDUERGU0RLX0JBQW5ub3Q6OklzVmlzaWJsZSgpIGNvbnN0IHsKICAgdWludDMyX3QgbkZsYWdzID0gR2V0RmxhZ3MoKTsKICAgcmV0dXJuICEoKG5GbGFncyAmIEFOTk9URkxBR19JTlZJU0lCTEUpIHx8IChuRmxhZ3MgJiBBTk5PVEZMQUdfSElEREVOKSB8fApAQCAtMzgzLDE4ICszNDYsMTcgQEAKICAgaWYgKGVBQVQgPT0gQ1BERl9BQWN0aW9uOjpCdXR0b25VcCkKICAgICByZXR1cm4gR2V0QWN0aW9uKCk7CiAKLSAgcmV0dXJuIENQREZfQWN0aW9uKCk7Ci19Ci0KLXZvaWQgQ1BERlNES19CQUFubm90OjpBbm5vdF9PbkRyYXcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1JlbmRlck9wdGlvbnMqIHBPcHRpb25zKSB7Ci0gIG1fcEFubm90LT5HZXRBUEZvcm0obV9wUGFnZVZpZXctPkdldFBERlBhZ2UoKSwgQ1BERl9Bbm5vdDo6Tm9ybWFsKTsKLSAgbV9wQW5ub3QtPkRyYXdBcHBlYXJhbmNlKG1fcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCksIHBEZXZpY2UsIHBVc2VyMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQW5ub3Q6Ok5vcm1hbCwgbnVsbHB0cik7CisgIHJldHVybiBDUERGX0FjdGlvbihudWxscHRyKTsKIH0KIAogdm9pZCBDUERGU0RLX0JBQW5ub3Q6OlNldE9wZW5TdGF0ZShib29sIGJPcGVuU3RhdGUpIHsKICAgaWYgKENQREZfQW5ub3QqIHBBbm5vdCA9IG1fcEFubm90LT5HZXRQb3B1cEFubm90KCkpCiAgICAgcEFubm90LT5TZXRPcGVuU3RhdGUoYk9wZW5TdGF0ZSk7CiB9CisKK2ludCBDUERGU0RLX0JBQW5ub3Q6OkdldExheW91dE9yZGVyKCkgY29uc3QgeworICBpZiAobV9wQW5ub3QtPkdldFN1YnR5cGUoKSA9PSBDUERGX0Fubm90OjpTdWJ0eXBlOjpQT1BVUCkKKyAgICByZXR1cm4gMTsKKworICByZXR1cm4gQ1BERlNES19Bbm5vdDo6R2V0TGF5b3V0T3JkZXIoKTsKK30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvY3BkZnNka19iYWFubm90LmggYi9mcGRmc2RrL2NwZGZzZGtfYmFhbm5vdC5oCmluZGV4IDJkYTU3MjMuLmFjM2MwY2IgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvY3BkZnNka19iYWFubm90LmgKKysrIGIvZnBkZnNkay9jcGRmc2RrX2JhYW5ub3QuaApAQCAtMzIsMTggKzMyLDE3IEBACiAgIHZvaWQgU2V0UmVjdChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KSBvdmVycmlkZTsKICAgQ0ZYX0Zsb2F0UmVjdCBHZXRSZWN0KCkgY29uc3Qgb3ZlcnJpZGU7CiAgIENQREZfQW5ub3QqIEdldFBERkFubm90KCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgQW5ub3RfT25EcmF3KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucykgb3ZlcnJpZGU7CiAKICAgQ1BERl9EaWN0aW9uYXJ5KiBHZXRBbm5vdERpY3QoKSBjb25zdDsKICAgQ1BERl9Bbm5vdCogR2V0UERGUG9wdXBBbm5vdCgpIGNvbnN0OwogCi0gIHZvaWQgU2V0Q29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNDb250ZW50cyk7Ci0gIENGWF9XaWRlU3RyaW5nIEdldENvbnRlbnRzKCkgY29uc3Q7CisgIENQREZfRGljdGlvbmFyeSogR2V0QVBEaWN0KCkgY29uc3Q7CiAKLSAgdm9pZCBTZXRBbm5vdE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNOYW1lKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0QW5ub3ROYW1lKCkgY29uc3Q7CisgIHZvaWQgU2V0Q29udGVudHMoY29uc3QgV2lkZVN0cmluZyYgc0NvbnRlbnRzKTsKKyAgV2lkZVN0cmluZyBHZXRDb250ZW50cygpIGNvbnN0OworCisgIHZvaWQgU2V0QW5ub3ROYW1lKGNvbnN0IFdpZGVTdHJpbmcmIHNOYW1lKTsKKyAgV2lkZVN0cmluZyBHZXRBbm5vdE5hbWUoKSBjb25zdDsKIAogICB2b2lkIFNldE1vZGlmaWVkRGF0ZShjb25zdCBGWF9TWVNURU1USU1FJiBzdCk7CiAgIEZYX1NZU1RFTVRJTUUgR2V0TW9kaWZpZWREYXRlKCkgY29uc3Q7CkBAIC01MSw4ICs1MCw4IEBACiAgIHZvaWQgU2V0RmxhZ3ModWludDMyX3QgbkZsYWdzKTsKICAgdWludDMyX3QgR2V0RmxhZ3MoKSBjb25zdDsKIAotICB2b2lkIFNldEFwcFN0YXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHIpOwotICBDRlhfQnl0ZVN0cmluZyBHZXRBcHBTdGF0ZSgpIGNvbnN0OworICB2b2lkIFNldEFwcFN0YXRlKGNvbnN0IEJ5dGVTdHJpbmcmIHN0cik7CisgIEJ5dGVTdHJpbmcgR2V0QXBwU3RhdGUoKSBjb25zdDsKIAogICB2b2lkIFNldFN0cnVjdFBhcmVudChpbnQga2V5KTsKICAgaW50IEdldFN0cnVjdFBhcmVudCgpIGNvbnN0OwpAQCAtODEsNyArODAsNyBAQAogICB2aXJ0dWFsIGJvb2wgSXNBcHBlYXJhbmNlVmFsaWQoKTsKICAgdmlydHVhbCBib29sIElzQXBwZWFyYW5jZVZhbGlkKENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUpOwogICB2aXJ0dWFsIHZvaWQgRHJhd0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG10VXNlcjJEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BERl9SZW5kZXJPcHRpb25zKiBwT3B0aW9ucyk7CiAKQEAgLTkxLDE2ICs5MCwxMiBAQAogCiAgIHZvaWQgQ2xlYXJDYWNoZWRBUCgpOwogCi0gIHZvaWQgV3JpdGVBcHBlYXJhbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRmxvYXRSZWN0JiByY0JCb3gsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNDb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBUFN0YXRlID0gIiIpOwotCiAgIHZvaWQgU2V0T3BlblN0YXRlKGJvb2wgYlN0YXRlKTsKIAorICBpbnQgR2V0TGF5b3V0T3JkZXIoKSBjb25zdCBvdmVycmlkZTsKKwogIHByb3RlY3RlZDoKLSAgQ1BERl9Bbm5vdCogY29uc3QgbV9wQW5ub3Q7CisgIFVub3duZWRQdHI8Q1BERl9Bbm5vdD4gY29uc3QgbV9wQW5ub3Q7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfQ1BERlNES19CQUFOTk9UX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2NwZGZzZGtfYmFhbm5vdGhhbmRsZXIuY3BwIGIvZnBkZnNkay9jcGRmc2RrX2JhYW5ub3RoYW5kbGVyLmNwcAppbmRleCBmYTgzOTMyLi4wMjc1MjdlIDEwMDY0NAotLS0gYS9mcGRmc2RrL2NwZGZzZGtfYmFhbm5vdGhhbmRsZXIuY3BwCisrKyBiL2ZwZGZzZGsvY3BkZnNka19iYWFubm90aGFuZGxlci5jcHAKQEAgLTczLDcgKzczLDcgQEAKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKICAgaWYgKGJEcmF3QW5ub3RzICYmIHBBbm5vdC0+R2V0QW5ub3RTdWJ0eXBlKCkgPT0gQ1BERl9Bbm5vdDo6U3VidHlwZTo6UE9QVVApIHsKICAgICBzdGF0aWNfY2FzdDxDUERGU0RLX0JBQW5ub3QqPihwQW5ub3QpLT5EcmF3QXBwZWFyYW5jZSgKLSAgICAgICAgcERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIG51bGxwdHIpOworICAgICAgICBwRGV2aWNlLCAqcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIG51bGxwdHIpOwogICB9CiB9CiAKQEAgLTE5Myw2ICsxOTMsMTMgQEAKICAgcmV0dXJuIHBBbm5vdC0+R2V0UmVjdCgpOwogfQogCitXaWRlU3RyaW5nIENQREZTREtfQkFBbm5vdEhhbmRsZXI6OkdldFNlbGVjdGVkVGV4dChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKKyAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKK30KKwordm9pZCBDUERGU0RLX0JBQW5ub3RIYW5kbGVyOjpSZXBsYWNlU2VsZWN0aW9uKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB0ZXh0KSB7fQorCiBib29sIENQREZTREtfQkFBbm5vdEhhbmRsZXI6OkhpdFRlc3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewpkaWZmIC0tZ2l0IGEvZnBkZnNkay9jcGRmc2RrX2JhYW5ub3RoYW5kbGVyLmggYi9mcGRmc2RrL2NwZGZzZGtfYmFhbm5vdGhhbmRsZXIuaAppbmRleCBkNWYxNzBmLi43YmY4MDM0IDEwMDY0NAotLS0gYS9mcGRmc2RrL2NwZGZzZGtfYmFhbm5vdGhhbmRsZXIuaAorKysgYi9mcGRmc2RrL2NwZGZzZGtfYmFhbm5vdGhhbmRsZXIuaApAQCAtNyw3ICs3LDYgQEAKICNpZm5kZWYgRlBERlNES19DUERGU0RLX0JBQU5OT1RIQU5ETEVSX0hfCiAjZGVmaW5lIEZQREZTREtfQ1BERlNES19CQUFOTk9USEFORExFUl9IXwogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKICNpbmNsdWRlICJmcGRmc2RrL2lwZGZzZGtfYW5ub3RoYW5kbGVyLmgiCiAKQEAgLTM3LDYgKzM2LDggQEAKICAgdm9pZCBSZWxlYXNlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KSBvdmVycmlkZTsKICAgQ0ZYX0Zsb2F0UmVjdCBHZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90KSBvdmVycmlkZTsKKyAgV2lkZVN0cmluZyBHZXRTZWxlY3RlZFRleHQoQ1BERlNES19Bbm5vdCogcEFubm90KSBvdmVycmlkZTsKKyAgdm9pZCBSZXBsYWNlU2VsZWN0aW9uKENQREZTREtfQW5ub3QqIHBBbm5vdCwgY29uc3QgV2lkZVN0cmluZyYgdGV4dCkgb3ZlcnJpZGU7CiAgIGJvb2wgSGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCiAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCiAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2NwZGZzZGtfZGF0ZXRpbWUuY3BwIGIvZnBkZnNkay9jcGRmc2RrX2RhdGV0aW1lLmNwcAppbmRleCA3MmY1MGE2Li4zMzJhZThlIDEwMDY0NAotLS0gYS9mcGRmc2RrL2NwZGZzZGtfZGF0ZXRpbWUuY3BwCisrKyBiL2ZwZGZzZGsvY3BkZnNka19kYXRldGltZS5jcHAKQEAgLTYsNyArNiw3IEBACiAKICNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfZGF0ZXRpbWUuaCIKIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9leHRlbnNpb24uaCIKIAogbmFtZXNwYWNlIHsKIApAQCAtNjMsNyArNjMsNyBAQAogICBSZXNldERhdGVUaW1lKCk7CiB9CiAKLUNQREZTREtfRGF0ZVRpbWU6OkNQREZTREtfRGF0ZVRpbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGR0U3RyKSB7CitDUERGU0RLX0RhdGVUaW1lOjpDUERGU0RLX0RhdGVUaW1lKGNvbnN0IEJ5dGVTdHJpbmcmIGR0U3RyKSB7CiAgIFJlc2V0RGF0ZVRpbWUoKTsKICAgRnJvbVBERkRhdGVUaW1lU3RyaW5nKGR0U3RyKTsKIH0KQEAgLTEyOSw3ICsxMjksNyBAQAogfQogCiBDUERGU0RLX0RhdGVUaW1lJiBDUERGU0RLX0RhdGVUaW1lOjpGcm9tUERGRGF0ZVRpbWVTdHJpbmcoCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGR0U3RyKSB7CisgICAgY29uc3QgQnl0ZVN0cmluZyYgZHRTdHIpIHsKICAgaW50IHN0ckxlbmd0aCA9IGR0U3RyLkdldExlbmd0aCgpOwogICBpZiAoc3RyTGVuZ3RoIDw9IDApCiAgICAgcmV0dXJuICp0aGlzOwpAQCAtMTQzLDEwICsxNDMsMTAgQEAKIAogICBpbnQgaiA9IDA7CiAgIGludCBrID0gMDsKLSAgRlhfQ0hBUiBjaDsKKyAgY2hhciBjaDsKICAgd2hpbGUgKGkgPCBzdHJMZW5ndGggJiYgaiA8IDQpIHsKICAgICBjaCA9IGR0U3RyW2ldOwotICAgIGsgPSBrICogMTAgKyBGWFNZU190b0RlY2ltYWxEaWdpdChjaCk7CisgICAgayA9IGsgKiAxMCArIEZYU1lTX0RlY2ltYWxDaGFyVG9JbnQoY2gpOwogICAgIGorKzsKICAgICBpZiAoIXN0ZDo6aXNkaWdpdChjaCkpCiAgICAgICBicmVhazsKQEAgLTE2MCw3ICsxNjAsNyBAQAogICBrID0gMDsKICAgd2hpbGUgKGkgPCBzdHJMZW5ndGggJiYgaiA8IDIpIHsKICAgICBjaCA9IGR0U3RyW2ldOwotICAgIGsgPSBrICogMTAgKyBGWFNZU190b0RlY2ltYWxEaWdpdChjaCk7CisgICAgayA9IGsgKiAxMCArIEZYU1lTX0RlY2ltYWxDaGFyVG9JbnQoY2gpOwogICAgIGorKzsKICAgICBpZiAoIXN0ZDo6aXNkaWdpdChjaCkpCiAgICAgICBicmVhazsKQEAgLTE3NCw3ICsxNzQsNyBAQAogICBrID0gMDsKICAgd2hpbGUgKGkgPCBzdHJMZW5ndGggJiYgaiA8IDIpIHsKICAgICBjaCA9IGR0U3RyW2ldOwotICAgIGsgPSBrICogMTAgKyBGWFNZU190b0RlY2ltYWxEaWdpdChjaCk7CisgICAgayA9IGsgKiAxMCArIEZYU1lTX0RlY2ltYWxDaGFyVG9JbnQoY2gpOwogICAgIGorKzsKICAgICBpZiAoIXN0ZDo6aXNkaWdpdChjaCkpCiAgICAgICBicmVhazsKQEAgLTE4OCw3ICsxODgsNyBAQAogICBrID0gMDsKICAgd2hpbGUgKGkgPCBzdHJMZW5ndGggJiYgaiA8IDIpIHsKICAgICBjaCA9IGR0U3RyW2ldOwotICAgIGsgPSBrICogMTAgKyBGWFNZU190b0RlY2ltYWxEaWdpdChjaCk7CisgICAgayA9IGsgKiAxMCArIEZYU1lTX0RlY2ltYWxDaGFyVG9JbnQoY2gpOwogICAgIGorKzsKICAgICBpZiAoIXN0ZDo6aXNkaWdpdChjaCkpCiAgICAgICBicmVhazsKQEAgLTIwMiw3ICsyMDIsNyBAQAogICBrID0gMDsKICAgd2hpbGUgKGkgPCBzdHJMZW5ndGggJiYgaiA8IDIpIHsKICAgICBjaCA9IGR0U3RyW2ldOwotICAgIGsgPSBrICogMTAgKyBGWFNZU190b0RlY2ltYWxEaWdpdChjaCk7CisgICAgayA9IGsgKiAxMCArIEZYU1lTX0RlY2ltYWxDaGFyVG9JbnQoY2gpOwogICAgIGorKzsKICAgICBpZiAoIXN0ZDo6aXNkaWdpdChjaCkpCiAgICAgICBicmVhazsKQEAgLTIxNiw3ICsyMTYsNyBAQAogICBrID0gMDsKICAgd2hpbGUgKGkgPCBzdHJMZW5ndGggJiYgaiA8IDIpIHsKICAgICBjaCA9IGR0U3RyW2ldOwotICAgIGsgPSBrICogMTAgKyBGWFNZU190b0RlY2ltYWxEaWdpdChjaCk7CisgICAgayA9IGsgKiAxMCArIEZYU1lTX0RlY2ltYWxDaGFyVG9JbnQoY2gpOwogICAgIGorKzsKICAgICBpZiAoIXN0ZDo6aXNkaWdpdChjaCkpCiAgICAgICBicmVhazsKQEAgLTIzNyw3ICsyMzcsNyBAQAogICBrID0gMDsKICAgd2hpbGUgKGkgPCBzdHJMZW5ndGggJiYgaiA8IDIpIHsKICAgICBjaCA9IGR0U3RyW2ldOwotICAgIGsgPSBrICogMTAgKyBGWFNZU190b0RlY2ltYWxEaWdpdChjaCk7CisgICAgayA9IGsgKiAxMCArIEZYU1lTX0RlY2ltYWxDaGFyVG9JbnQoY2gpOwogICAgIGorKzsKICAgICBpZiAoIXN0ZDo6aXNkaWdpdChjaCkpCiAgICAgICBicmVhazsKQEAgLTI1Myw3ICsyNTMsNyBAQAogICBrID0gMDsKICAgd2hpbGUgKGkgPCBzdHJMZW5ndGggJiYgaiA8IDIpIHsKICAgICBjaCA9IGR0U3RyW2ldOwotICAgIGsgPSBrICogMTAgKyBGWFNZU190b0RlY2ltYWxEaWdpdChjaCk7CisgICAgayA9IGsgKiAxMCArIEZYU1lTX0RlY2ltYWxDaGFyVG9JbnQoY2gpOwogICAgIGorKzsKICAgICBpZiAoIXN0ZDo6aXNkaWdpdChjaCkpCiAgICAgICBicmVhazsKQEAgLTI2MywzNCArMjYzLDI5IEBACiAgIHJldHVybiAqdGhpczsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERlNES19EYXRlVGltZTo6VG9Db21tb25EYXRlVGltZVN0cmluZygpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgc3RyMTsKLSAgc3RyMS5Gb3JtYXQoIiUwNGQtJTAydS0lMDJ1ICUwMnU6JTAydTolMDJ1ICIsIG1feWVhciwgbV9tb250aCwgbV9kYXksIG1faG91ciwKLSAgICAgICAgICAgICAgbV9taW51dGUsIG1fc2Vjb25kKTsKLSAgaWYgKG1fdHpIb3VyIDwgMCkKLSAgICBzdHIxICs9ICItIjsKLSAgZWxzZQotICAgIHN0cjEgKz0gIisiOwotICBDRlhfQnl0ZVN0cmluZyBzdHIyOwotICBzdHIyLkZvcm1hdCgiJTAyZDolMDJ1Iiwgc3RkOjphYnMoc3RhdGljX2Nhc3Q8aW50PihtX3R6SG91cikpLCBtX3R6TWludXRlKTsKLSAgcmV0dXJuIHN0cjEgKyBzdHIyOworQnl0ZVN0cmluZyBDUERGU0RLX0RhdGVUaW1lOjpUb0NvbW1vbkRhdGVUaW1lU3RyaW5nKCkgeworICByZXR1cm4gQnl0ZVN0cmluZzo6Rm9ybWF0KCIlMDRkLSUwMnUtJTAydSAlMDJ1OiUwMnU6JTAydSAiLCBtX3llYXIsIG1fbW9udGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kYXksIG1faG91ciwgbV9taW51dGUsIG1fc2Vjb25kKSArCisgICAgICAgICAobV90ekhvdXIgPCAwID8gIi0iIDogIisiKSArCisgICAgICAgICBCeXRlU3RyaW5nOjpGb3JtYXQoIiUwMmQ6JTAydSIsIHN0ZDo6YWJzKHN0YXRpY19jYXN0PGludD4obV90ekhvdXIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3R6TWludXRlKTsKIH0KIAotQ0ZYX0J5dGVTdHJpbmcgQ1BERlNES19EYXRlVGltZTo6VG9QREZEYXRlVGltZVN0cmluZygpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgZHRTdHI7CitCeXRlU3RyaW5nIENQREZTREtfRGF0ZVRpbWU6OlRvUERGRGF0ZVRpbWVTdHJpbmcoKSB7CisgIEJ5dGVTdHJpbmcgZHRTdHI7CiAgIGNoYXIgdGVtcFN0clszMl07CiAgIG1lbXNldCh0ZW1wU3RyLCAwLCBzaXplb2YodGVtcFN0cikpOwogICBGWFNZU19zbnByaW50Zih0ZW1wU3RyLCBzaXplb2YodGVtcFN0cikgLSAxLCAiRDolMDRkJTAydSUwMnUlMDJ1JTAydSUwMnUiLAogICAgICAgICAgICAgICAgICBtX3llYXIsIG1fbW9udGgsIG1fZGF5LCBtX2hvdXIsIG1fbWludXRlLCBtX3NlY29uZCk7Ci0gIGR0U3RyID0gQ0ZYX0J5dGVTdHJpbmcodGVtcFN0cik7CisgIGR0U3RyID0gQnl0ZVN0cmluZyh0ZW1wU3RyKTsKICAgaWYgKG1fdHpIb3VyIDwgMCkKLSAgICBkdFN0ciArPSBDRlhfQnl0ZVN0cmluZygiLSIpOworICAgIGR0U3RyICs9IEJ5dGVTdHJpbmcoIi0iKTsKICAgZWxzZQotICAgIGR0U3RyICs9IENGWF9CeXRlU3RyaW5nKCIrIik7CisgICAgZHRTdHIgKz0gQnl0ZVN0cmluZygiKyIpOwogICBtZW1zZXQodGVtcFN0ciwgMCwgc2l6ZW9mKHRlbXBTdHIpKTsKICAgRlhTWVNfc25wcmludGYodGVtcFN0ciwgc2l6ZW9mKHRlbXBTdHIpIC0gMSwgIiUwMmQnJTAydSciLAogICAgICAgICAgICAgICAgICBzdGQ6OmFicyhzdGF0aWNfY2FzdDxpbnQ+KG1fdHpIb3VyKSksIG1fdHpNaW51dGUpOwotICBkdFN0ciArPSBDRlhfQnl0ZVN0cmluZyh0ZW1wU3RyKTsKKyAgZHRTdHIgKz0gQnl0ZVN0cmluZyh0ZW1wU3RyKTsKICAgcmV0dXJuIGR0U3RyOwogfQogCmRpZmYgLS1naXQgYS9mcGRmc2RrL2NwZGZzZGtfZGF0ZXRpbWUuaCBiL2ZwZGZzZGsvY3BkZnNka19kYXRldGltZS5oCmluZGV4IDZiNjEyYjIuLmNiZDNjMzYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvY3BkZnNka19kYXRldGltZS5oCisrKyBiL2ZwZGZzZGsvY3BkZnNka19kYXRldGltZS5oCkBAIC03LDcgKzcsNyBAQAogI2lmbmRlZiBGUERGU0RLX0NQREZTREtfREFURVRJTUVfSF8KICNkZWZpbmUgRlBERlNES19DUERGU0RLX0RBVEVUSU1FX0hfCiAKLSNpZiBfRlhfT1NfID09IF9GWF9BTkRST0lEXworI2lmIF9GWF9PU18gPT0gX0ZYX09TX0FORFJPSURfCiAjaW5jbHVkZSA8dGltZS5oPgogI2Vsc2UKICNpbmNsdWRlIDxjdGltZT4KQEAgLTE4LDE2ICsxOCwxNiBAQAogY2xhc3MgQ1BERlNES19EYXRlVGltZSB7CiAgcHVibGljOgogICBDUERGU0RLX0RhdGVUaW1lKCk7Ci0gIGV4cGxpY2l0IENQREZTREtfRGF0ZVRpbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGR0U3RyKTsKKyAgZXhwbGljaXQgQ1BERlNES19EYXRlVGltZShjb25zdCBCeXRlU3RyaW5nJiBkdFN0cik7CiAgIGV4cGxpY2l0IENQREZTREtfRGF0ZVRpbWUoY29uc3QgRlhfU1lTVEVNVElNRSYgc3QpOwogICBDUERGU0RLX0RhdGVUaW1lKGNvbnN0IENQREZTREtfRGF0ZVRpbWUmIGRhdGV0aW1lKTsKIAogICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpIGNvbnN0OwogICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ1BERlNES19EYXRlVGltZSYgZGF0ZXRpbWUpIGNvbnN0OwogCi0gIENQREZTREtfRGF0ZVRpbWUmIEZyb21QREZEYXRlVGltZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgZHRTdHIpOwotICBDRlhfQnl0ZVN0cmluZyBUb0NvbW1vbkRhdGVUaW1lU3RyaW5nKCk7Ci0gIENGWF9CeXRlU3RyaW5nIFRvUERGRGF0ZVRpbWVTdHJpbmcoKTsKKyAgQ1BERlNES19EYXRlVGltZSYgRnJvbVBERkRhdGVUaW1lU3RyaW5nKGNvbnN0IEJ5dGVTdHJpbmcmIGR0U3RyKTsKKyAgQnl0ZVN0cmluZyBUb0NvbW1vbkRhdGVUaW1lU3RyaW5nKCk7CisgIEJ5dGVTdHJpbmcgVG9QREZEYXRlVGltZVN0cmluZygpOwogICB2b2lkIFRvU3lzdGVtVGltZShGWF9TWVNURU1USU1FJiBzdCk7CiAgIHRpbWVfdCBUb1RpbWVfdCgpIGNvbnN0OwogICBDUERGU0RLX0RhdGVUaW1lIFRvR01UKCkgY29uc3Q7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2NwZGZzZGtfZm9ybWZpbGxlbnZpcm9ubWVudC5jcHAgYi9mcGRmc2RrL2NwZGZzZGtfZm9ybWZpbGxlbnZpcm9ubWVudC5jcHAKaW5kZXggNGVmNzY2ZC4uOTU1YzE4NCAxMDA2NDQKLS0tIGEvZnBkZnNkay9jcGRmc2RrX2Zvcm1maWxsZW52aXJvbm1lbnQuY3BwCisrKyBiL2ZwZGZzZGsvY3BkZnNka19mb3JtZmlsbGVudmlyb25tZW50LmNwcApAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfZm9ybWZpbGxlbnZpcm9ubWVudC5oIgogCiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9kb2Nqc2FjdGlvbnMuaCIKQEAgLTE2LDE0ICsxNywxNCBAQAogI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka193aWRnZXQuaCIKICNpbmNsdWRlICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9pbnRlcmFjdGl2ZWZvcm1maWxsZXIuaCIKICNpbmNsdWRlICJmcGRmc2RrL2ZzZGtfYWN0aW9uaGFuZGxlci5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9panNfcnVudGltZS5oIgorI2luY2x1ZGUgImZ4anMvaWpzX3J1bnRpbWUuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKIG5hbWVzcGFjZSB7CiAKIC8vIE5PVEU6IHxic1VURjE2TEV8IG11c3Qgb3V0bGl2ZSB0aGUgdXNlIG9mIHRoZSByZXN1bHQuIENhcmUgbXVzdCBiZSB0YWtlbgogLy8gc2luY2UgbW9kaWZ5aW5nIHRoZSByZXN1bHQgd291bGQgaW1wYWN0IHxic1VURjE2TEV8LgotRlBERl9XSURFU1RSSU5HIEFzRlBERldpZGVTdHJpbmcoQ0ZYX0J5dGVTdHJpbmcqIGJzVVRGMTZMRSkgeworRlBERl9XSURFU1RSSU5HIEFzRlBERldpZGVTdHJpbmcoQnl0ZVN0cmluZyogYnNVVEYxNkxFKSB7CiAgIHJldHVybiByZWludGVycHJldF9jYXN0PEZQREZfV0lERVNUUklORz4oCiAgICAgICBic1VURjE2TEUtPkdldEJ1ZmZlcihic1VURjE2TEUtPkdldExlbmd0aCgpKSk7CiB9CkBAIC0zNSw3ICszNiw3IEBACiAgICAgRlBERl9GT1JNRklMTElORk8qIHBGRmluZm8pCiAgICAgOiBtX3BJbmZvKHBGRmluZm8pLAogICAgICAgbV9wVW5kZXJseWluZ0RvYyhwRG9jKSwKLSAgICAgIG1fcFN5c0hhbmRsZXIobmV3IENGWF9TeXN0ZW1IYW5kbGVyKHRoaXMpKSwKKyAgICAgIG1fcFN5c0hhbmRsZXIocGRmaXVtOjpNYWtlVW5pcXVlPENGWF9TeXN0ZW1IYW5kbGVyPih0aGlzKSksCiAgICAgICBtX2JDaGFuZ2VNYXNrKGZhbHNlKSwKICAgICAgIG1fYkJlaW5nRGVzdHJveWVkKGZhbHNlKSB7fQogCkBAIC02MCwyNSArNjEsMjUgQEAKICAgICBtX3BJbmZvLT5SZWxlYXNlKG1fcEluZm8pOwogfQogCi1pbnQgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpKU19hcHBBbGVydChjb25zdCBGWF9XQ0hBUiogTXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIFRpdGxlLAoraW50IENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6SlNfYXBwQWxlcnQoY29uc3Qgd2NoYXJfdCogTXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogVGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSWNvbikgewogICBpZiAoIW1fcEluZm8gfHwgIW1fcEluZm8tPm1fcEpzUGxhdGZvcm0gfHwKICAgICAgICFtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5hcHBfYWxlcnQpIHsKICAgICByZXR1cm4gLTE7CiAgIH0KLSAgQ0ZYX0J5dGVTdHJpbmcgYnNNc2cgPSBDRlhfV2lkZVN0cmluZyhNc2cpLlVURjE2TEVfRW5jb2RlKCk7Ci0gIENGWF9CeXRlU3RyaW5nIGJzVGl0bGUgPSBDRlhfV2lkZVN0cmluZyhUaXRsZSkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgQnl0ZVN0cmluZyBic01zZyA9IFdpZGVTdHJpbmcoTXNnKS5VVEYxNkxFX0VuY29kZSgpOworICBCeXRlU3RyaW5nIGJzVGl0bGUgPSBXaWRlU3RyaW5nKFRpdGxlKS5VVEYxNkxFX0VuY29kZSgpOwogICByZXR1cm4gbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+YXBwX2FsZXJ0KAogICAgICAgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybSwgQXNGUERGV2lkZVN0cmluZygmYnNNc2cpLAogICAgICAgQXNGUERGV2lkZVN0cmluZygmYnNUaXRsZSksIFR5cGUsIEljb24pOwogfQogCi1pbnQgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpKU19hcHBSZXNwb25zZShjb25zdCBGWF9XQ0hBUiogUXVlc3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogRGVmYXVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBjTGFiZWwsCitpbnQgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpKU19hcHBSZXNwb25zZShjb25zdCB3Y2hhcl90KiBRdWVzdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIFRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGNMYWJlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiUGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiByZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpIHsKQEAgLTg2LDEwICs4NywxMCBAQAogICAgICAgIW1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPmFwcF9yZXNwb25zZSkgewogICAgIHJldHVybiAtMTsKICAgfQotICBDRlhfQnl0ZVN0cmluZyBic1F1ZXN0aW9uID0gQ0ZYX1dpZGVTdHJpbmcoUXVlc3Rpb24pLlVURjE2TEVfRW5jb2RlKCk7Ci0gIENGWF9CeXRlU3RyaW5nIGJzVGl0bGUgPSBDRlhfV2lkZVN0cmluZyhUaXRsZSkuVVRGMTZMRV9FbmNvZGUoKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgYnNEZWZhdWx0ID0gQ0ZYX1dpZGVTdHJpbmcoRGVmYXVsdCkuVVRGMTZMRV9FbmNvZGUoKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgYnNMYWJlbCA9IENGWF9XaWRlU3RyaW5nKGNMYWJlbCkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgQnl0ZVN0cmluZyBic1F1ZXN0aW9uID0gV2lkZVN0cmluZyhRdWVzdGlvbikuVVRGMTZMRV9FbmNvZGUoKTsKKyAgQnl0ZVN0cmluZyBic1RpdGxlID0gV2lkZVN0cmluZyhUaXRsZSkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgQnl0ZVN0cmluZyBic0RlZmF1bHQgPSBXaWRlU3RyaW5nKERlZmF1bHQpLlVURjE2TEVfRW5jb2RlKCk7CisgIEJ5dGVTdHJpbmcgYnNMYWJlbCA9IFdpZGVTdHJpbmcoY0xhYmVsKS5VVEYxNkxFX0VuY29kZSgpOwogICByZXR1cm4gbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+YXBwX3Jlc3BvbnNlKAogICAgICAgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybSwgQXNGUERGV2lkZVN0cmluZygmYnNRdWVzdGlvbiksCiAgICAgICBBc0ZQREZXaWRlU3RyaW5nKCZic1RpdGxlKSwgQXNGUERGV2lkZVN0cmluZygmYnNEZWZhdWx0KSwKQEAgLTEwNCw1NCArMTA1LDU0IEBACiAgIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPmFwcF9iZWVwKG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIG5UeXBlKTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpKU19maWVsZEJyb3dzZSgpIHsKK1dpZGVTdHJpbmcgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpKU19maWVsZEJyb3dzZSgpIHsKICAgaWYgKCFtX3BJbmZvIHx8ICFtX3BJbmZvLT5tX3BKc1BsYXRmb3JtIHx8CiAgICAgICAhbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RmllbGRfYnJvd3NlKSB7Ci0gICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7CisgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKICAgfQogICBjb25zdCBpbnQgblJlcXVpcmVkTGVuID0KICAgICAgIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPkZpZWxkX2Jyb3dzZShtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBudWxscHRyLCAwKTsKICAgaWYgKG5SZXF1aXJlZExlbiA8PSAwKQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CiAKLSAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gcEJ1ZmYobmV3IGNoYXJbblJlcXVpcmVkTGVuXSk7Ci0gIG1lbXNldChwQnVmZi5nZXQoKSwgMCwgblJlcXVpcmVkTGVuKTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcEJ1ZmYoblJlcXVpcmVkTGVuKTsKICAgY29uc3QgaW50IG5BY3R1YWxMZW4gPSBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5GaWVsZF9icm93c2UoCi0gICAgICBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBwQnVmZi5nZXQoKSwgblJlcXVpcmVkTGVuKTsKKyAgICAgIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIHBCdWZmLmRhdGEoKSwgblJlcXVpcmVkTGVuKTsKICAgaWYgKG5BY3R1YWxMZW4gPD0gMCB8fCBuQWN0dWFsTGVuID4gblJlcXVpcmVkTGVuKQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CiAKLSAgcmV0dXJuIENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoQ0ZYX0J5dGVTdHJpbmdDKHBCdWZmLmdldCgpLCBuQWN0dWFsTGVuKSk7CisgIHBCdWZmLnJlc2l6ZShuQWN0dWFsTGVuKTsKKyAgcmV0dXJuIFdpZGVTdHJpbmc6OkZyb21Mb2NhbChCeXRlU3RyaW5nVmlldyhwQnVmZikpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OkpTX2RvY0dldEZpbGVQYXRoKCkgeworV2lkZVN0cmluZyBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OkpTX2RvY0dldEZpbGVQYXRoKCkgewogICBpZiAoIW1fcEluZm8gfHwgIW1fcEluZm8tPm1fcEpzUGxhdGZvcm0gfHwKICAgICAgICFtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5Eb2NfZ2V0RmlsZVBhdGgpIHsKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKKyAgICByZXR1cm4gV2lkZVN0cmluZygpOwogICB9CiAgIGNvbnN0IGludCBuUmVxdWlyZWRMZW4gPSBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5Eb2NfZ2V0RmlsZVBhdGgoCiAgICAgICBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBudWxscHRyLCAwKTsKICAgaWYgKG5SZXF1aXJlZExlbiA8PSAwKQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CiAKLSAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gcEJ1ZmYobmV3IGNoYXJbblJlcXVpcmVkTGVuXSk7Ci0gIG1lbXNldChwQnVmZi5nZXQoKSwgMCwgblJlcXVpcmVkTGVuKTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcEJ1ZmYoblJlcXVpcmVkTGVuKTsKICAgY29uc3QgaW50IG5BY3R1YWxMZW4gPSBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLT5Eb2NfZ2V0RmlsZVBhdGgoCi0gICAgICBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBwQnVmZi5nZXQoKSwgblJlcXVpcmVkTGVuKTsKKyAgICAgIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIHBCdWZmLmRhdGEoKSwgblJlcXVpcmVkTGVuKTsKICAgaWYgKG5BY3R1YWxMZW4gPD0gMCB8fCBuQWN0dWFsTGVuID4gblJlcXVpcmVkTGVuKQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOworICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CiAKLSAgcmV0dXJuIENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoQ0ZYX0J5dGVTdHJpbmdDKHBCdWZmLmdldCgpLCBuQWN0dWFsTGVuKSk7CisgIHBCdWZmLnJlc2l6ZShuQWN0dWFsTGVuKTsKKyAgcmV0dXJuIFdpZGVTdHJpbmc6OkZyb21Mb2NhbChCeXRlU3RyaW5nVmlldyhwQnVmZikpOwogfQogCiB2b2lkIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6SlNfZG9jU3VibWl0Rm9ybSh2b2lkKiBmb3JtRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogVVJMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBVUkwpIHsKICAgaWYgKCFtX3BJbmZvIHx8ICFtX3BJbmZvLT5tX3BKc1BsYXRmb3JtIHx8CiAgICAgICAhbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RG9jX3N1Ym1pdEZvcm0pIHsKICAgICByZXR1cm47CiAgIH0KLSAgQ0ZYX0J5dGVTdHJpbmcgYnNEZXN0aW5hdGlvbiA9IENGWF9XaWRlU3RyaW5nKFVSTCkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgQnl0ZVN0cmluZyBic0Rlc3RpbmF0aW9uID0gV2lkZVN0cmluZyhVUkwpLlVURjE2TEVfRW5jb2RlKCk7CiAgIG1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPkRvY19zdWJtaXRGb3JtKG1fcEluZm8tPm1fcEpzUGxhdGZvcm0sIGZvcm1EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzRlBERldpZGVTdHJpbmcoJmJzRGVzdGluYXRpb24pKTsKQEAgLTE2MCwyMCArMTYxLDIwIEBACiB2b2lkIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6SlNfZG9jbWFpbEZvcm0odm9pZCogbWFpbERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgYlVJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBUbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogU3ViamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogQ0MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIEJDQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogTXNnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogVG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogU3ViamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBDQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBCQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogTXNnKSB7CiAgIGlmICghbV9wSW5mbyB8fCAhbV9wSW5mby0+bV9wSnNQbGF0Zm9ybSB8fAogICAgICAgIW1fcEluZm8tPm1fcEpzUGxhdGZvcm0tPkRvY19tYWlsKSB7CiAgICAgcmV0dXJuOwogICB9Ci0gIENGWF9CeXRlU3RyaW5nIGJzVG8gPSBDRlhfV2lkZVN0cmluZyhUbykuVVRGMTZMRV9FbmNvZGUoKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgYnNTdWJqZWN0ID0gQ0ZYX1dpZGVTdHJpbmcoU3ViamVjdCkuVVRGMTZMRV9FbmNvZGUoKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgYnNDQyA9IENGWF9XaWRlU3RyaW5nKENDKS5VVEYxNkxFX0VuY29kZSgpOwotICBDRlhfQnl0ZVN0cmluZyBic0JjYyA9IENGWF9XaWRlU3RyaW5nKEJDQykuVVRGMTZMRV9FbmNvZGUoKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgYnNNc2cgPSBDRlhfV2lkZVN0cmluZyhNc2cpLlVURjE2TEVfRW5jb2RlKCk7CisgIEJ5dGVTdHJpbmcgYnNUbyA9IFdpZGVTdHJpbmcoVG8pLlVURjE2TEVfRW5jb2RlKCk7CisgIEJ5dGVTdHJpbmcgYnNTdWJqZWN0ID0gV2lkZVN0cmluZyhTdWJqZWN0KS5VVEYxNkxFX0VuY29kZSgpOworICBCeXRlU3RyaW5nIGJzQ0MgPSBXaWRlU3RyaW5nKENDKS5VVEYxNkxFX0VuY29kZSgpOworICBCeXRlU3RyaW5nIGJzQmNjID0gV2lkZVN0cmluZyhCQ0MpLlVURjE2TEVfRW5jb2RlKCk7CisgIEJ5dGVTdHJpbmcgYnNNc2cgPSBXaWRlU3RyaW5nKE1zZykuVVRGMTZMRV9FbmNvZGUoKTsKICAgbV9wSW5mby0+bV9wSnNQbGF0Zm9ybS0+RG9jX21haWwoCiAgICAgICBtX3BJbmZvLT5tX3BKc1BsYXRmb3JtLCBtYWlsRGF0YSwgbGVuZ3RoLCBiVUksIEFzRlBERldpZGVTdHJpbmcoJmJzVG8pLAogICAgICAgQXNGUERGV2lkZVN0cmluZygmYnNTdWJqZWN0KSwgQXNGUERGV2lkZVN0cmluZygmYnNDQyksCkBAIC0yMTksNyArMjIwLDcgQEAKICAgcmV0dXJuIG1fcEFubm90SGFuZGxlck1nci5nZXQoKTsKIH0KIAotQ1BERlNES19BY3Rpb25IYW5kbGVyKiBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OkdldEFjdGlvbkhhbmRlcigpIHsKK0NQREZTREtfQWN0aW9uSGFuZGxlciogQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpHZXRBY3Rpb25IYW5kbGVyKCkgewogICBpZiAoIW1fcEFjdGlvbkhhbmRsZXIpCiAgICAgbV9wQWN0aW9uSGFuZGxlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGU0RLX0FjdGlvbkhhbmRsZXI+KCk7CiAgIHJldHVybiBtX3BBY3Rpb25IYW5kbGVyLmdldCgpOwpAQCAtMjMyLDcgKzIzMyw3IEBACiAgIHJldHVybiBtX3BGb3JtRmlsbGVyLmdldCgpOwogfQogCi12b2lkIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6SW52YWxpZGF0ZShGUERGX1BBR0UgcGFnZSwKK3ZvaWQgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpJbnZhbGlkYXRlKFVuZGVybHlpbmdQYWdlVHlwZSogcGFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1JFQ1QmIHJlY3QpIHsKICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0ludmFsaWRhdGUpIHsKICAgICBtX3BJbmZvLT5GRklfSW52YWxpZGF0ZShtX3BJbmZvLCBwYWdlLCByZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LnJpZ2h0LApAQCAtMjQxLDcgKzI0Miw3IEBACiB9CiAKIHZvaWQgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpPdXRwdXRTZWxlY3RlZFJlY3QoCi0gICAgRlBERl9QQUdFIHBhZ2UsCisgICAgVW5kZXJseWluZ1BhZ2VUeXBlKiBwYWdlLAogICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIHsKICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX091dHB1dFNlbGVjdGVkUmVjdCkgewogICAgIG1fcEluZm8tPkZGSV9PdXRwdXRTZWxlY3RlZFJlY3QobV9wSW5mbywgcGFnZSwgcmVjdC5sZWZ0LCByZWN0LnRvcCwKQEAgLTI4OCwzMyArMjg5LDE0IEBACiAgICAgbV9wSW5mby0+RkZJX09uQ2hhbmdlKG1fcEluZm8pOwogfQogCi1ib29sIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6SXNTSElGVEtleURvd24odWludDMyX3QgbkZsYWcpIGNvbnN0IHsKLSAgcmV0dXJuIChuRmxhZyAmIEZXTF9FVkVOVEZMQUdfU2hpZnRLZXkpICE9IDA7Ci19Ci0KLWJvb2wgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpJc0NUUkxLZXlEb3duKHVpbnQzMl90IG5GbGFnKSBjb25zdCB7Ci0gIHJldHVybiAobkZsYWcgJiBGV0xfRVZFTlRGTEFHX0NvbnRyb2xLZXkpICE9IDA7Ci19Ci0KLWJvb2wgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpJc0FMVEtleURvd24odWludDMyX3QgbkZsYWcpIGNvbnN0IHsKLSAgcmV0dXJuIChuRmxhZyAmIEZXTF9FVkVOVEZMQUdfQWx0S2V5KSAhPSAwOwotfQotCi1GUERGX1BBR0UgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpHZXRQYWdlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuUGFnZUluZGV4KSB7Ci0gIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9HZXRQYWdlKQotICAgIHJldHVybiBtX3BJbmZvLT5GRklfR2V0UGFnZShtX3BJbmZvLCBkb2N1bWVudCwgblBhZ2VJbmRleCk7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1GUERGX1BBR0UgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpHZXRDdXJyZW50UGFnZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CitGUERGX1BBR0UgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpHZXRDdXJyZW50UGFnZSgKKyAgICBVbmRlcmx5aW5nRG9jdW1lbnRUeXBlKiBkb2N1bWVudCkgewogICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfR2V0Q3VycmVudFBhZ2UpCiAgICAgcmV0dXJuIG1fcEluZm8tPkZGSV9HZXRDdXJyZW50UGFnZShtX3BJbmZvLCBkb2N1bWVudCk7CiAgIHJldHVybiBudWxscHRyOwogfQogCi12b2lkIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6RXhlY3V0ZU5hbWVkQWN0aW9uKAotICAgIGNvbnN0IEZYX0NIQVIqIG5hbWVkQWN0aW9uKSB7Cit2b2lkIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6RXhlY3V0ZU5hbWVkQWN0aW9uKGNvbnN0IGNoYXIqIG5hbWVkQWN0aW9uKSB7CiAgIGlmIChtX3BJbmZvICYmIG1fcEluZm8tPkZGSV9FeGVjdXRlTmFtZWRBY3Rpb24pCiAgICAgbV9wSW5mby0+RkZJX0V4ZWN1dGVOYW1lZEFjdGlvbihtX3BJbmZvLCBuYW1lZEFjdGlvbik7CiB9CkBAIC0zMjcsNyArMzA5LDcgQEAKICAgICBtX3BJbmZvLT5GRklfU2V0VGV4dEZpZWxkRm9jdXMobV9wSW5mbywgZm9jdXNUZXh0LCBuVGV4dExlbiwgYkZvY3VzKTsKIH0KIAotdm9pZCBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OkRvVVJJQWN0aW9uKGNvbnN0IEZYX0NIQVIqIGJzVVJJKSB7Cit2b2lkIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6RG9VUklBY3Rpb24oY29uc3QgY2hhciogYnNVUkkpIHsKICAgaWYgKG1fcEluZm8gJiYgbV9wSW5mby0+RkZJX0RvVVJJQWN0aW9uKQogICAgIG1fcEluZm8tPkZGSV9Eb1VSSUFjdGlvbihtX3BJbmZvLCBic1VSSSk7CiB9CkBAIC0zNDMsNyArMzI1LDcgQEAKIH0KIAogI2lmZGVmIFBERl9FTkFCTEVfWEZBCi12b2lkIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6RGlzcGxheUNhcmV0KEZQREZfUEFHRSBwYWdlLAordm9pZCBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OkRpc3BsYXlDYXJldChDUERGWEZBX1BhZ2UqIHBhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiVmlzaWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0b3AsCkBAIC0zNTUsNTMgKzMzNyw0OSBAQAogICB9CiB9CiAKLWludCBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OkdldEN1cnJlbnRQYWdlSW5kZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkgeworaW50IENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6R2V0Q3VycmVudFBhZ2VJbmRleCgKKyAgICBDUERGWEZBX0NvbnRleHQqIGRvY3VtZW50KSB7CiAgIGlmICghbV9wSW5mbyB8fCAhbV9wSW5mby0+RkZJX0dldEN1cnJlbnRQYWdlSW5kZXgpCiAgICAgcmV0dXJuIC0xOwogICByZXR1cm4gbV9wSW5mby0+RkZJX0dldEN1cnJlbnRQYWdlSW5kZXgobV9wSW5mbywgZG9jdW1lbnQpOwogfQogCi12b2lkIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6U2V0Q3VycmVudFBhZ2UoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKK3ZvaWQgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpTZXRDdXJyZW50UGFnZShDUERGWEZBX0NvbnRleHQqIGRvY3VtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpQ3VyUGFnZSkgewogICBpZiAobV9wSW5mbyAmJiBtX3BJbmZvLT5GRklfU2V0Q3VycmVudFBhZ2UpCiAgICAgbV9wSW5mby0+RkZJX1NldEN1cnJlbnRQYWdlKG1fcEluZm8sIGRvY3VtZW50LCBpQ3VyUGFnZSk7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6R2V0UGxhdGZvcm0oKSB7CitXaWRlU3RyaW5nIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6R2V0UGxhdGZvcm0oKSB7CiAgIGlmICghbV9wSW5mbyB8fCAhbV9wSW5mby0+RkZJX0dldFBsYXRmb3JtKQotICAgIHJldHVybiBMIiI7CisgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKIAogICBpbnQgblJlcXVpcmVkTGVuID0gbV9wSW5mby0+RkZJX0dldFBsYXRmb3JtKG1fcEluZm8sIG51bGxwdHIsIDApOwogICBpZiAoblJlcXVpcmVkTGVuIDw9IDApCi0gICAgcmV0dXJuIEwiIjsKKyAgICByZXR1cm4gV2lkZVN0cmluZygpOwogCi0gIGNoYXIqIHBidWZmID0gbmV3IGNoYXJbblJlcXVpcmVkTGVuXTsKLSAgbWVtc2V0KHBidWZmLCAwLCBuUmVxdWlyZWRMZW4pOwotICBpbnQgbkFjdHVhbExlbiA9IG1fcEluZm8tPkZGSV9HZXRQbGF0Zm9ybShtX3BJbmZvLCBwYnVmZiwgblJlcXVpcmVkTGVuKTsKLSAgaWYgKG5BY3R1YWxMZW4gPD0gMCB8fCBuQWN0dWFsTGVuID4gblJlcXVpcmVkTGVuKSB7Ci0gICAgZGVsZXRlW10gcGJ1ZmY7Ci0gICAgcmV0dXJuIEwiIjsKLSAgfQotICBDRlhfQnl0ZVN0cmluZyBic1JldCA9IENGWF9CeXRlU3RyaW5nKHBidWZmLCBuQWN0dWFsTGVuKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoCi0gICAgICAodW5zaWduZWQgc2hvcnQqKWJzUmV0LkdldEJ1ZmZlcihic1JldC5HZXRMZW5ndGgoKSksCi0gICAgICBic1JldC5HZXRMZW5ndGgoKSAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOwotICBkZWxldGVbXSBwYnVmZjsKLSAgcmV0dXJuIHdzUmV0OworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwQnVmZihuUmVxdWlyZWRMZW4pOworICBpbnQgbkFjdHVhbExlbiA9CisgICAgICBtX3BJbmZvLT5GRklfR2V0UGxhdGZvcm0obV9wSW5mbywgcEJ1ZmYuZGF0YSgpLCBuUmVxdWlyZWRMZW4pOworICBpZiAobkFjdHVhbExlbiA8PSAwIHx8IG5BY3R1YWxMZW4gPiBuUmVxdWlyZWRMZW4pCisgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKKworICByZXR1cm4gV2lkZVN0cmluZzo6RnJvbVVURjE2TEUocmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCo+KHBCdWZmLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQWN0dWFsTGVuIC8gc2l6ZW9mKHVpbnQxNl90KSk7CiB9CiAKLXZvaWQgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpHb3RvVVJMKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVVJMKSB7Cit2b2lkIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6R290b1VSTChDUERGWEZBX0NvbnRleHQqIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzVVJMKSB7CiAgIGlmICghbV9wSW5mbyB8fCAhbV9wSW5mby0+RkZJX0dvdG9VUkwpCiAgICAgcmV0dXJuOwogCi0gIENGWF9CeXRlU3RyaW5nIGJzVG8gPSBDRlhfV2lkZVN0cmluZyh3c1VSTCkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgQnl0ZVN0cmluZyBic1RvID0gV2lkZVN0cmluZyh3c1VSTCkuVVRGMTZMRV9FbmNvZGUoKTsKICAgRlBERl9XSURFU1RSSU5HIHBUbyA9IChGUERGX1dJREVTVFJJTkcpYnNUby5HZXRCdWZmZXIod3NVUkwuR2V0TGVuZ3RoKCkpOwogICBtX3BJbmZvLT5GRklfR290b1VSTChtX3BJbmZvLCBkb2N1bWVudCwgcFRvKTsKLSAgYnNUby5SZWxlYXNlQnVmZmVyKCk7CisgIGJzVG8uUmVsZWFzZUJ1ZmZlcihic1RvLkdldFN0cmluZ0xlbmd0aCgpKTsKIH0KIAotdm9pZCBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OkdldFBhZ2VWaWV3UmVjdChGUERGX1BBR0UgcGFnZSwKK3ZvaWQgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpHZXRQYWdlVmlld1JlY3QoQ1BERlhGQV9QYWdlKiBwYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19SRUNURiYgZHN0UmVjdCkgewogICBpZiAoIW1fcEluZm8gfHwgIW1fcEluZm8tPkZGSV9HZXRQYWdlVmlld1JlY3QpCiAgICAgcmV0dXJuOwpAQCAtNDExLDE0ICszODksMTYgQEAKICAgZG91YmxlIHJpZ2h0OwogICBkb3VibGUgYm90dG9tOwogICBtX3BJbmZvLT5GRklfR2V0UGFnZVZpZXdSZWN0KG1fcEluZm8sIHBhZ2UsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pOworICBpZiAodG9wIDwgYm90dG9tKQorICAgIHN0ZDo6c3dhcCh0b3AsIGJvdHRvbSk7CiAKICAgZHN0UmVjdC5sZWZ0ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGxlZnQpOwotICBkc3RSZWN0LnRvcCA9IHN0YXRpY19jYXN0PGZsb2F0Pih0b3AgPCBib3R0b20gPyBib3R0b20gOiB0b3ApOwotICBkc3RSZWN0LmJvdHRvbSA9IHN0YXRpY19jYXN0PGZsb2F0Pih0b3AgPCBib3R0b20gPyB0b3AgOiBib3R0b20pOworICBkc3RSZWN0LnRvcCA9IHN0YXRpY19jYXN0PGZsb2F0Pih0b3ApOworICBkc3RSZWN0LmJvdHRvbSA9IHN0YXRpY19jYXN0PGZsb2F0Pihib3R0b20pOwogICBkc3RSZWN0LnJpZ2h0ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHJpZ2h0KTsKIH0KIAotYm9vbCBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OlBvcHVwTWVudShGUERGX1BBR0UgcGFnZSwKK2Jvb2wgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpQb3B1cE1lbnUoQ1BERlhGQV9QYWdlKiBwYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREdFVCBoV2lkZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVudUZsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYgcHQpIHsKQEAgLTQ2MSwxMiArNDQxLDEyIEBACiAgIHJldHVybiBudWxscHRyOwogfQogCi1DRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+Ci1DUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OkRvd25sb2FkRnJvbVVSTChjb25zdCBGWF9XQ0hBUiogdXJsKSB7CitSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpEb3dubG9hZEZyb21VUkwoCisgICAgY29uc3Qgd2NoYXJfdCogdXJsKSB7CiAgIGlmICghbV9wSW5mbyB8fCAhbV9wSW5mby0+RkZJX0Rvd25sb2FkRnJvbVVSTCkKICAgICByZXR1cm4gbnVsbHB0cjsKIAotICBDRlhfQnl0ZVN0cmluZyBic3RyVVJMID0gQ0ZYX1dpZGVTdHJpbmcodXJsKS5VVEYxNkxFX0VuY29kZSgpOworICBCeXRlU3RyaW5nIGJzdHJVUkwgPSBXaWRlU3RyaW5nKHVybCkuVVRGMTZMRV9FbmNvZGUoKTsKICAgRlBERl9XSURFU1RSSU5HIHdzVVJMID0KICAgICAgIChGUERGX1dJREVTVFJJTkcpYnN0clVSTC5HZXRCdWZmZXIoYnN0clVSTC5HZXRMZW5ndGgoKSk7CiAKQEAgLTQ3NCwzMCArNDU0LDMwIEBACiAgIHJldHVybiBNYWtlU2Vla2FibGVTdHJlYW0oZmlsZUhhbmRsZXIpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OlBvc3RSZXF1ZXN0VVJMKAotICAgIGNvbnN0IEZYX1dDSEFSKiB3c1VSTCwKLSAgICBjb25zdCBGWF9XQ0hBUiogd3NEYXRhLAotICAgIGNvbnN0IEZYX1dDSEFSKiB3c0NvbnRlbnRUeXBlLAotICAgIGNvbnN0IEZYX1dDSEFSKiB3c0VuY29kZSwKLSAgICBjb25zdCBGWF9XQ0hBUiogd3NIZWFkZXIpIHsKK1dpZGVTdHJpbmcgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpQb3N0UmVxdWVzdFVSTCgKKyAgICBjb25zdCB3Y2hhcl90KiB3c1VSTCwKKyAgICBjb25zdCB3Y2hhcl90KiB3c0RhdGEsCisgICAgY29uc3Qgd2NoYXJfdCogd3NDb250ZW50VHlwZSwKKyAgICBjb25zdCB3Y2hhcl90KiB3c0VuY29kZSwKKyAgICBjb25zdCB3Y2hhcl90KiB3c0hlYWRlcikgewogICBpZiAoIW1fcEluZm8gfHwgIW1fcEluZm8tPkZGSV9Qb3N0UmVxdWVzdFVSTCkKICAgICByZXR1cm4gTCIiOwogCi0gIENGWF9CeXRlU3RyaW5nIGJzVVJMID0gQ0ZYX1dpZGVTdHJpbmcod3NVUkwpLlVURjE2TEVfRW5jb2RlKCk7CisgIEJ5dGVTdHJpbmcgYnNVUkwgPSBXaWRlU3RyaW5nKHdzVVJMKS5VVEYxNkxFX0VuY29kZSgpOwogICBGUERGX1dJREVTVFJJTkcgVVJMID0gKEZQREZfV0lERVNUUklORylic1VSTC5HZXRCdWZmZXIoYnNVUkwuR2V0TGVuZ3RoKCkpOwogCi0gIENGWF9CeXRlU3RyaW5nIGJzRGF0YSA9IENGWF9XaWRlU3RyaW5nKHdzRGF0YSkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgQnl0ZVN0cmluZyBic0RhdGEgPSBXaWRlU3RyaW5nKHdzRGF0YSkuVVRGMTZMRV9FbmNvZGUoKTsKICAgRlBERl9XSURFU1RSSU5HIGRhdGEgPSAoRlBERl9XSURFU1RSSU5HKWJzRGF0YS5HZXRCdWZmZXIoYnNEYXRhLkdldExlbmd0aCgpKTsKIAotICBDRlhfQnl0ZVN0cmluZyBic0NvbnRlbnRUeXBlID0gQ0ZYX1dpZGVTdHJpbmcod3NDb250ZW50VHlwZSkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgQnl0ZVN0cmluZyBic0NvbnRlbnRUeXBlID0gV2lkZVN0cmluZyh3c0NvbnRlbnRUeXBlKS5VVEYxNkxFX0VuY29kZSgpOwogICBGUERGX1dJREVTVFJJTkcgY29udGVudFR5cGUgPQogICAgICAgKEZQREZfV0lERVNUUklORylic0NvbnRlbnRUeXBlLkdldEJ1ZmZlcihic0NvbnRlbnRUeXBlLkdldExlbmd0aCgpKTsKIAotICBDRlhfQnl0ZVN0cmluZyBic0VuY29kZSA9IENGWF9XaWRlU3RyaW5nKHdzRW5jb2RlKS5VVEYxNkxFX0VuY29kZSgpOworICBCeXRlU3RyaW5nIGJzRW5jb2RlID0gV2lkZVN0cmluZyh3c0VuY29kZSkuVVRGMTZMRV9FbmNvZGUoKTsKICAgRlBERl9XSURFU1RSSU5HIGVuY29kZSA9CiAgICAgICAoRlBERl9XSURFU1RSSU5HKWJzRW5jb2RlLkdldEJ1ZmZlcihic0VuY29kZS5HZXRMZW5ndGgoKSk7CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgYnNIZWFkZXIgPSBDRlhfV2lkZVN0cmluZyh3c0hlYWRlcikuVVRGMTZMRV9FbmNvZGUoKTsKKyAgQnl0ZVN0cmluZyBic0hlYWRlciA9IFdpZGVTdHJpbmcod3NIZWFkZXIpLlVURjE2TEVfRW5jb2RlKCk7CiAgIEZQREZfV0lERVNUUklORyBoZWFkZXIgPQogICAgICAgKEZQREZfV0lERVNUUklORylic0hlYWRlci5HZXRCdWZmZXIoYnNIZWFkZXIuR2V0TGVuZ3RoKCkpOwogCkBAIC01MDYsNTMgKzQ4Niw0OCBAQAogICBtX3BJbmZvLT5GRklfUG9zdFJlcXVlc3RVUkwobV9wSW5mbywgVVJMLCBkYXRhLCBjb250ZW50VHlwZSwgZW5jb2RlLCBoZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzcG9uc2UpOwogCi0gIENGWF9XaWRlU3RyaW5nIHdzUmV0ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKAorICBXaWRlU3RyaW5nIHdzUmV0ID0gV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoCiAgICAgICAoRlBERl9XSURFU1RSSU5HKXJlc3BvbnNlLnN0ciwgcmVzcG9uc2UubGVuIC8gc2l6ZW9mKEZQREZfV0lERVNUUklORykpOwogICBGUERGX0JTdHJfQ2xlYXIoJnJlc3BvbnNlKTsKIAogICByZXR1cm4gd3NSZXQ7CiB9CiAKLUZQREZfQk9PTCBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OlB1dFJlcXVlc3RVUkwoY29uc3QgRlhfV0NIQVIqIHdzVVJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogd3NEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogd3NFbmNvZGUpIHsKK0ZQREZfQk9PTCBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OlB1dFJlcXVlc3RVUkwoY29uc3Qgd2NoYXJfdCogd3NVUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHdzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogd3NFbmNvZGUpIHsKICAgaWYgKCFtX3BJbmZvIHx8ICFtX3BJbmZvLT5GRklfUHV0UmVxdWVzdFVSTCkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgYnNVUkwgPSBDRlhfV2lkZVN0cmluZyh3c1VSTCkuVVRGMTZMRV9FbmNvZGUoKTsKKyAgQnl0ZVN0cmluZyBic1VSTCA9IFdpZGVTdHJpbmcod3NVUkwpLlVURjE2TEVfRW5jb2RlKCk7CiAgIEZQREZfV0lERVNUUklORyBVUkwgPSAoRlBERl9XSURFU1RSSU5HKWJzVVJMLkdldEJ1ZmZlcihic1VSTC5HZXRMZW5ndGgoKSk7CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgYnNEYXRhID0gQ0ZYX1dpZGVTdHJpbmcod3NEYXRhKS5VVEYxNkxFX0VuY29kZSgpOworICBCeXRlU3RyaW5nIGJzRGF0YSA9IFdpZGVTdHJpbmcod3NEYXRhKS5VVEYxNkxFX0VuY29kZSgpOwogICBGUERGX1dJREVTVFJJTkcgZGF0YSA9IChGUERGX1dJREVTVFJJTkcpYnNEYXRhLkdldEJ1ZmZlcihic0RhdGEuR2V0TGVuZ3RoKCkpOwogCi0gIENGWF9CeXRlU3RyaW5nIGJzRW5jb2RlID0gQ0ZYX1dpZGVTdHJpbmcod3NFbmNvZGUpLlVURjE2TEVfRW5jb2RlKCk7CisgIEJ5dGVTdHJpbmcgYnNFbmNvZGUgPSBXaWRlU3RyaW5nKHdzRW5jb2RlKS5VVEYxNkxFX0VuY29kZSgpOwogICBGUERGX1dJREVTVFJJTkcgZW5jb2RlID0KICAgICAgIChGUERGX1dJREVTVFJJTkcpYnNFbmNvZGUuR2V0QnVmZmVyKGJzRW5jb2RlLkdldExlbmd0aCgpKTsKIAogICByZXR1cm4gbV9wSW5mby0+RkZJX1B1dFJlcXVlc3RVUkwobV9wSW5mbywgVVJMLCBkYXRhLCBlbmNvZGUpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OkdldExhbmd1YWdlKCkgeworV2lkZVN0cmluZyBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OkdldExhbmd1YWdlKCkgewogICBpZiAoIW1fcEluZm8gfHwgIW1fcEluZm8tPkZGSV9HZXRMYW5ndWFnZSkKLSAgICByZXR1cm4gTCIiOworICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CiAKICAgaW50IG5SZXF1aXJlZExlbiA9IG1fcEluZm8tPkZGSV9HZXRMYW5ndWFnZShtX3BJbmZvLCBudWxscHRyLCAwKTsKICAgaWYgKG5SZXF1aXJlZExlbiA8PSAwKQotICAgIHJldHVybiBMIiI7CisgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKIAotICBjaGFyKiBwYnVmZiA9IG5ldyBjaGFyW25SZXF1aXJlZExlbl07Ci0gIG1lbXNldChwYnVmZiwgMCwgblJlcXVpcmVkTGVuKTsKLSAgaW50IG5BY3R1YWxMZW4gPSBtX3BJbmZvLT5GRklfR2V0TGFuZ3VhZ2UobV9wSW5mbywgcGJ1ZmYsIG5SZXF1aXJlZExlbik7Ci0gIGlmIChuQWN0dWFsTGVuIDw9IDAgfHwgbkFjdHVhbExlbiA+IG5SZXF1aXJlZExlbikgewotICAgIGRlbGV0ZVtdIHBidWZmOwotICAgIHJldHVybiBMIiI7Ci0gIH0KLSAgQ0ZYX0J5dGVTdHJpbmcgYnNSZXQgPSBDRlhfQnl0ZVN0cmluZyhwYnVmZiwgbkFjdHVhbExlbik7Ci0gIENGWF9XaWRlU3RyaW5nIHdzUmV0ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKAotICAgICAgKEZQREZfV0lERVNUUklORylic1JldC5HZXRCdWZmZXIoYnNSZXQuR2V0TGVuZ3RoKCkpLAotICAgICAgYnNSZXQuR2V0TGVuZ3RoKCkgLyBzaXplb2YoRlBERl9XSURFU1RSSU5HKSk7Ci0gIGRlbGV0ZVtdIHBidWZmOwotICByZXR1cm4gd3NSZXQ7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBCdWZmKG5SZXF1aXJlZExlbik7CisgIGludCBuQWN0dWFsTGVuID0KKyAgICAgIG1fcEluZm8tPkZGSV9HZXRMYW5ndWFnZShtX3BJbmZvLCBwQnVmZi5kYXRhKCksIG5SZXF1aXJlZExlbik7CisgIGlmIChuQWN0dWFsTGVuIDw9IDAgfHwgbkFjdHVhbExlbiA+IG5SZXF1aXJlZExlbikKKyAgICByZXR1cm4gV2lkZVN0cmluZygpOworCisgIHJldHVybiBXaWRlU3RyaW5nOjpGcm9tVVRGMTZMRShyZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4ocEJ1ZmYuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5BY3R1YWxMZW4gLyBzaXplb2YodWludDE2X3QpKTsKIH0KIAogdm9pZCBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OlBhZ2VFdmVudChpbnQgaVBhZ2VDb3VudCwKQEAgLTU3OSw4ICs1NTQsMTAgQEAKICAgaWYgKCFyZW5ldykKICAgICByZXR1cm4gbnVsbHB0cjsKIAotICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBuZXcgQ1BERlNES19QYWdlVmlldyh0aGlzLCBwVW5kZXJseWluZ1BhZ2UpOwotICBtX1BhZ2VNYXBbcFVuZGVybHlpbmdQYWdlXS5yZXNldChwUGFnZVZpZXcpOworICBhdXRvIHBOZXcgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERlNES19QYWdlVmlldz4odGhpcywgcFVuZGVybHlpbmdQYWdlKTsKKyAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcE5ldy5nZXQoKTsKKyAgbV9QYWdlTWFwW3BVbmRlcmx5aW5nUGFnZV0gPSBzdGQ6Om1vdmUocE5ldyk7CisKICAgLy8gRGVsYXkgdG8gbG9hZCBhbGwgdGhlIGFubm90YXRpb25zLCB0byBhdm9pZCBlbmRsZXNzIGxvb3AuCiAgIHBQYWdlVmlldy0+TG9hZEZYQW5ub3RzKCk7CiAgIHJldHVybiBwUGFnZVZpZXc7CkBAIC01ODgsMTMgKzU2NSwxMiBAQAogCiBDUERGU0RLX1BhZ2VWaWV3KiBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OkdldEN1cnJlbnRWaWV3KCkgewogICBVbmRlcmx5aW5nUGFnZVR5cGUqIHBQYWdlID0KLSAgICAgIFVuZGVybHlpbmdGcm9tRlBERlBhZ2UoR2V0Q3VycmVudFBhZ2UobV9wVW5kZXJseWluZ0RvYykpOworICAgICAgVW5kZXJseWluZ0Zyb21GUERGUGFnZShHZXRDdXJyZW50UGFnZShtX3BVbmRlcmx5aW5nRG9jLkdldCgpKSk7CiAgIHJldHVybiBwUGFnZSA/IEdldFBhZ2VWaWV3KHBQYWdlLCB0cnVlKSA6IG51bGxwdHI7CiB9CiAKIENQREZTREtfUGFnZVZpZXcqIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6R2V0UGFnZVZpZXcoaW50IG5JbmRleCkgewotICBVbmRlcmx5aW5nUGFnZVR5cGUqIHBUZW1wUGFnZSA9Ci0gICAgICBVbmRlcmx5aW5nRnJvbUZQREZQYWdlKEdldFBhZ2UobV9wVW5kZXJseWluZ0RvYywgbkluZGV4KSk7CisgIFVuZGVybHlpbmdQYWdlVHlwZSogcFRlbXBQYWdlID0gR2V0UGFnZShuSW5kZXgpOwogICBpZiAoIXBUZW1wUGFnZSkKICAgICByZXR1cm4gbnVsbHB0cjsKIApAQCAtNjA2LDE1ICs1ODIsMTAgQEAKICAgQ1BERl9Eb2N1bWVudCogcFBERkRvYyA9IEdldFBERkRvY3VtZW50KCk7CiAgIENQREZfRG9jSlNBY3Rpb25zIGRvY0pTKHBQREZEb2MpOwogICBpbnQgaUNvdW50ID0gZG9jSlMuQ291bnRKU0FjdGlvbnMoKTsKLSAgaWYgKGlDb3VudCA8IDEpCi0gICAgcmV0dXJuOwogICBmb3IgKGludCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NKU05hbWU7Ci0gICAgQ1BERl9BY3Rpb24ganNBY3Rpb24gPSBkb2NKUy5HZXRKU0FjdGlvbihpLCBjc0pTTmFtZSk7Ci0gICAgaWYgKEdldEFjdGlvbkhhbmRlcigpKSB7Ci0gICAgICBHZXRBY3Rpb25IYW5kZXIoKS0+RG9BY3Rpb25fSmF2YVNjcmlwdCgKLSAgICAgICAgICBqc0FjdGlvbiwgQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChjc0pTTmFtZS5Bc1N0cmluZ0MoKSksIHRoaXMpOwotICAgIH0KKyAgICBXaWRlU3RyaW5nIGNzSlNOYW1lOworICAgIENQREZfQWN0aW9uIGpzQWN0aW9uID0gZG9jSlMuR2V0SlNBY3Rpb25BbmROYW1lKGksICZjc0pTTmFtZSk7CisgICAgR2V0QWN0aW9uSGFuZGxlcigpLT5Eb0FjdGlvbl9KYXZhU2NyaXB0KGpzQWN0aW9uLCBjc0pTTmFtZSwgdGhpcyk7CiAgIH0KIH0KIApAQCAtNjIyLDI3ICs1OTMsMjYgQEAKICAgaWYgKCFtX3BVbmRlcmx5aW5nRG9jKQogICAgIHJldHVybiBmYWxzZTsKIAotICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gR2V0UERGRG9jdW1lbnQoKS0+R2V0Um9vdCgpOworICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gR2V0UERGRG9jdW1lbnQoKS0+R2V0Um9vdCgpOwogICBpZiAoIXBSb290KQogICAgIHJldHVybiBmYWxzZTsKIAogICBDUERGX09iamVjdCogcE9wZW5BY3Rpb24gPSBwUm9vdC0+R2V0RGljdEZvcigiT3BlbkFjdGlvbiIpOwogICBpZiAoIXBPcGVuQWN0aW9uKQogICAgIHBPcGVuQWN0aW9uID0gcFJvb3QtPkdldEFycmF5Rm9yKCJPcGVuQWN0aW9uIik7Ci0KICAgaWYgKCFwT3BlbkFjdGlvbikKICAgICByZXR1cm4gZmFsc2U7CiAKICAgaWYgKHBPcGVuQWN0aW9uLT5Jc0FycmF5KCkpCiAgICAgcmV0dXJuIHRydWU7CiAKLSAgaWYgKENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwT3BlbkFjdGlvbi0+QXNEaWN0aW9uYXJ5KCkpIHsKLSAgICBDUERGX0FjdGlvbiBhY3Rpb24ocERpY3QpOwotICAgIGlmIChHZXRBY3Rpb25IYW5kZXIoKSkKLSAgICAgIEdldEFjdGlvbkhhbmRlcigpLT5Eb0FjdGlvbl9Eb2NPcGVuKGFjdGlvbiwgdGhpcyk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcE9wZW5BY3Rpb24tPkFzRGljdGlvbmFyeSgpOworICBpZiAoIXBEaWN0KQorICAgIHJldHVybiBmYWxzZTsKKworICBDUERGX0FjdGlvbiBhY3Rpb24ocERpY3QpOworICBHZXRBY3Rpb25IYW5kbGVyKCktPkRvQWN0aW9uX0RvY09wZW4oYWN0aW9uLCB0aGlzKTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpSZW1vdmVQYWdlVmlldygKQEAgLTY3Myw3ICs2NDMsMTAgQEAKIH0KIAogVW5kZXJseWluZ1BhZ2VUeXBlKiBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OkdldFBhZ2UoaW50IG5JbmRleCkgewotICByZXR1cm4gVW5kZXJseWluZ0Zyb21GUERGUGFnZShHZXRQYWdlKG1fcFVuZGVybHlpbmdEb2MsIG5JbmRleCkpOworICBpZiAoIW1fcEluZm8gfHwgIW1fcEluZm8tPkZGSV9HZXRQYWdlKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gVW5kZXJseWluZ0Zyb21GUERGUGFnZSgKKyAgICAgIG1fcEluZm8tPkZGSV9HZXRQYWdlKG1fcEluZm8sIG1fcFVuZGVybHlpbmdEb2MuR2V0KCksIG5JbmRleCkpOwogfQogCiBDUERGU0RLX0ludGVyRm9ybSogQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpHZXRJbnRlckZvcm0oKSB7CkBAIC03MDIsNTkgKzY3NSw1OCBAQAogICBpZiAoISpwQW5ub3QpCiAgICAgcmV0dXJuIGZhbHNlOwogCisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9ICgqcEFubm90KS0+R2V0UGFnZVZpZXcoKTsKKyAgaWYgKCFwUGFnZVZpZXcgfHwgIXBQYWdlVmlldy0+SXNWYWxpZCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlciA9IEdldEFubm90SGFuZGxlck1ncigpOworICBpZiAobV9wRm9jdXNBbm5vdCkKKyAgICByZXR1cm4gZmFsc2U7CisKICNpZmRlZiBQREZfRU5BQkxFX1hGQQogICBDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciBwTGFzdEZvY3VzQW5ub3QobV9wRm9jdXNBbm5vdC5HZXQoKSk7CisgIGlmICghcEFubm90SGFuZGxlci0+QW5ub3RfT25DaGFuZ2VGb2N1cyhwQW5ub3QsICZwTGFzdEZvY3VzQW5ub3QpKQorICAgIHJldHVybiBmYWxzZTsKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKLSAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gKCpwQW5ub3QpLT5HZXRQYWdlVmlldygpOwotICBpZiAocFBhZ2VWaWV3ICYmIHBQYWdlVmlldy0+SXNWYWxpZCgpKSB7Ci0gICAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdEhhbmRsZXIgPSBHZXRBbm5vdEhhbmRsZXJNZ3IoKTsKLSAgICBpZiAoIW1fcEZvY3VzQW5ub3QpIHsKLSNpZmRlZiBQREZfRU5BQkxFX1hGQQotICAgICAgaWYgKCFwQW5ub3RIYW5kbGVyLT5Bbm5vdF9PbkNoYW5nZUZvY3VzKHBBbm5vdCwgJnBMYXN0Rm9jdXNBbm5vdCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKLSAgICAgIGlmICghcEFubm90SGFuZGxlci0+QW5ub3RfT25TZXRGb2N1cyhwQW5ub3QsIDApKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIW1fcEZvY3VzQW5ub3QpIHsKLSAgICAgICAgbV9wRm9jdXNBbm5vdC5SZXNldChwQW5ub3QtPkdldCgpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKKyAgaWYgKCFwQW5ub3RIYW5kbGVyLT5Bbm5vdF9PblNldEZvY3VzKHBBbm5vdCwgMCkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAobV9wRm9jdXNBbm5vdCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbV9wRm9jdXNBbm5vdC5SZXNldChwQW5ub3QtPkdldCgpKTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpLaWxsRm9jdXNBbm5vdCh1aW50MzJfdCBuRmxhZykgewotICBpZiAobV9wRm9jdXNBbm5vdCkgewotICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyTWdyKCk7Ci0gICAgQ1BERlNES19Bbm5vdDo6T2JzZXJ2ZWRQdHIgcEZvY3VzQW5ub3QobV9wRm9jdXNBbm5vdC5HZXQoKSk7Ci0gICAgbV9wRm9jdXNBbm5vdC5SZXNldCgpOworICBpZiAoIW1fcEZvY3VzQW5ub3QpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyID0gR2V0QW5ub3RIYW5kbGVyTWdyKCk7CisgIENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyIHBGb2N1c0Fubm90KG1fcEZvY3VzQW5ub3QuR2V0KCkpOworICBtX3BGb2N1c0Fubm90LlJlc2V0KCk7CiAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQotICAgIENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyIHBOdWxsOwotICAgIGlmICghcEFubm90SGFuZGxlci0+QW5ub3RfT25DaGFuZ2VGb2N1cygmcE51bGwsICZwRm9jdXNBbm5vdCkpCi0gICAgICByZXR1cm4gZmFsc2U7CisgIENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyIHBOdWxsOworICBpZiAoIXBBbm5vdEhhbmRsZXItPkFubm90X09uQ2hhbmdlRm9jdXMoJnBOdWxsLCAmcEZvY3VzQW5ub3QpKQorICAgIHJldHVybiBmYWxzZTsKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotICAgIGlmIChwQW5ub3RIYW5kbGVyLT5Bbm5vdF9PbktpbGxGb2N1cygmcEZvY3VzQW5ub3QsIG5GbGFnKSkgewotICAgICAgaWYgKHBGb2N1c0Fubm90LT5HZXRBbm5vdFN1YnR5cGUoKSA9PSBDUERGX0Fubm90OjpTdWJ0eXBlOjpXSURHRVQpIHsKLSAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1BERlNES19XaWRnZXQqPihwRm9jdXNBbm5vdC5HZXQoKSk7Ci0gICAgICAgIGludCBuRmllbGRUeXBlID0gcFdpZGdldC0+R2V0RmllbGRUeXBlKCk7Ci0gICAgICAgIGlmIChGSUVMRFRZUEVfVEVYVEZJRUxEID09IG5GaWVsZFR5cGUgfHwKLSAgICAgICAgICAgIEZJRUxEVFlQRV9DT01CT0JPWCA9PSBuRmllbGRUeXBlKSB7Ci0gICAgICAgICAgT25TZXRGaWVsZElucHV0Rm9jdXMobnVsbHB0ciwgMCwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoIW1fcEZvY3VzQW5ub3QpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICBtX3BGb2N1c0Fubm90LlJlc2V0KHBGb2N1c0Fubm90LkdldCgpKTsKKyAgaWYgKCFwQW5ub3RIYW5kbGVyLT5Bbm5vdF9PbktpbGxGb2N1cygmcEZvY3VzQW5ub3QsIG5GbGFnKSkgeworICAgIG1fcEZvY3VzQW5ub3QuUmVzZXQocEZvY3VzQW5ub3QuR2V0KCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChwRm9jdXNBbm5vdC0+R2V0QW5ub3RTdWJ0eXBlKCkgPT0gQ1BERl9Bbm5vdDo6U3VidHlwZTo6V0lER0VUKSB7CisgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBzdGF0aWNfY2FzdDxDUERGU0RLX1dpZGdldCo+KHBGb2N1c0Fubm90LkdldCgpKTsKKyAgICBGb3JtRmllbGRUeXBlIGZpZWxkVHlwZSA9IHBXaWRnZXQtPkdldEZpZWxkVHlwZSgpOworICAgIGlmIChmaWVsZFR5cGUgPT0gRm9ybUZpZWxkVHlwZTo6a1RleHRGaWVsZCB8fAorICAgICAgICBmaWVsZFR5cGUgPT0gRm9ybUZpZWxkVHlwZTo6a0NvbWJvQm94KSB7CisgICAgICBPblNldEZpZWxkSW5wdXRGb2N1cyhudWxscHRyLCAwLCBmYWxzZSk7CiAgICAgfQogICB9Ci0gIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuICFtX3BGb2N1c0Fubm90OwogfQogCi1ib29sIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6R2V0UGVybWlzc2lvbnMoaW50IG5GbGFnKSB7Citib29sIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6R2V0UGVybWlzc2lvbnMoaW50IG5GbGFnKSBjb25zdCB7CiAgIHJldHVybiAhIShHZXRQREZEb2N1bWVudCgpLT5HZXRVc2VyUGVybWlzc2lvbnMoKSAmIG5GbGFnKTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvY3BkZnNka19mb3JtZmlsbGVudmlyb25tZW50LmggYi9mcGRmc2RrL2NwZGZzZGtfZm9ybWZpbGxlbnZpcm9ubWVudC5oCmluZGV4IGVlYWQ4NzMuLjMxYTFjNTEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvY3BkZnNka19mb3JtZmlsbGVudmlyb25tZW50LmgKKysrIGIvZnBkZnNkay9jcGRmc2RrX2Zvcm1maWxsZW52aXJvbm1lbnQuaApAQCAtMTQsNyArMTQsNyBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX29jY29udGV4dC5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X29ic2VydmFibGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L29ic2VydmFibGUuaCIKICNpbmNsdWRlICJmcGRmc2RrL2NmeF9zeXN0ZW1oYW5kbGVyLmgiCiAjaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX2Fubm90LmgiCiAjaW5jbHVkZSAiZnBkZnNkay9mc2RrX2RlZmluZS5oIgpAQCAtMjksMTMgKzI5LDM0IEBACiBjbGFzcyBDUERGU0RLX1BhZ2VWaWV3OwogY2xhc3MgSUpTX1J1bnRpbWU7CiAKKy8vIFRoZSBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQgaXMgIm93bmVkIiBieSB0aGUgZW1iZWRkZXIgYWNyb3NzIHRoZQorLy8gQyBBUEkgYXMgYSBGUERGX0Zvcm1IYW5kbGUsIGFuZCBtYXkgcG9wIG91dCBvZiBleGlzdGVuY2UgYXQgYW55IHRpbWUsCisvLyBzbyBsb25nIGFzIHRoZSBhc3NvY2lhdGVkIGVtYmVkZGVyLW93bmVkIEZQREZfRG9jdW1lbnQgb3V0bGl2ZXMgaXQuCisvLyBQb2ludGVycyBmcm9tIG9iamVjdHMgaW4gdGhlIEZQREZfRG9jdW1lbnQgb3duZXJzaGlwIGhpZXJhcmNoeSBzaG91bGQKKy8vIGJlIE9ic2VydmVkUHRyPD4gc28gYXMgdG8gY2xlYXIgdGhlbXNlbHZlcyB3aGVuIHRoZSBlbWJlZGRlciAiZXhpdHMiCisvLyB0aGUgZm9ybSBmaWxsIGVudmlyb25tZW50LiAgUG9pbnRlcnMgZnJvbSBvYmplY3RzIGluIHRoaXMgb3duZXJzaGlwCisvLyBoZWlyYXJjeSB0byBvYmplY3RzIGluIHRoZSBGUERGX0RvY3VtZW50IG93bmVyc2hpcCBoaWVyYXJjeSBzaG91bGQgYmUKKy8vIFVub3duZWRQdHI8PiwgYXMgc2hvdWxkIHBvaW50ZXJzIGZyb20gb2JqZWN0cyBpbiB0aGlzIG93bmVyc2hpcAorLy8gaGllcmFyY3kgYmFjayB0byB0aGUgZm9ybSBmaWxsIGVudmlyb25tZW50IGl0c2VsZiwgc28gYXMgdG8gZmxhZyBhbnkKKy8vIGxpbmdlcmluZyBsaWZldGltZSBpc3N1ZXMgdmlhIHRoZSBtZW1vcnkgdG9vbHMuCisKIGNsYXNzIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudAotICAgIDogcHVibGljIENGWF9PYnNlcnZhYmxlPENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudD4geworICAgIDogcHVibGljIE9ic2VydmFibGU8Q1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50PiB7CiAgcHVibGljOgogICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQoVW5kZXJseWluZ0RvY3VtZW50VHlwZSogcERvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRk9STUZJTExJTkZPKiBwRkZpbmZvKTsKICAgfkNQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCgpOwogCisgIHN0YXRpYyBib29sIElzU0hJRlRLZXlEb3duKHVpbnQzMl90IG5GbGFnKSB7CisgICAgcmV0dXJuICEhKG5GbGFnICYgRldMX0VWRU5URkxBR19TaGlmdEtleSk7CisgIH0KKyAgc3RhdGljIGJvb2wgSXNDVFJMS2V5RG93bih1aW50MzJfdCBuRmxhZykgeworICAgIHJldHVybiAhIShuRmxhZyAmIEZXTF9FVkVOVEZMQUdfQ29udHJvbEtleSk7CisgIH0KKyAgc3RhdGljIGJvb2wgSXNBTFRLZXlEb3duKHVpbnQzMl90IG5GbGFnKSB7CisgICAgcmV0dXJuICEhKG5GbGFnICYgRldMX0VWRU5URkxBR19BbHRLZXkpOworICB9CisKICAgQ1BERlNES19QYWdlVmlldyogR2V0UGFnZVZpZXcoVW5kZXJseWluZ1BhZ2VUeXBlKiBwUGFnZSwgYm9vbCByZW5ldyk7CiAgIENQREZTREtfUGFnZVZpZXcqIEdldFBhZ2VWaWV3KGludCBuSW5kZXgpOwogICBDUERGU0RLX1BhZ2VWaWV3KiBHZXRDdXJyZW50VmlldygpOwpAQCAtNTYsMjAgKzc3LDE4IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfRG9jdW1lbnQqIHBTcmNEb2MsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQxNl90PiYgYXJyU3JjUGFnZXMpOwogCi0gIGludCBHZXRQYWdlQ291bnQoKSB7IHJldHVybiBtX3BVbmRlcmx5aW5nRG9jLT5HZXRQYWdlQ291bnQoKTsgfQotICBib29sIEdldFBlcm1pc3Npb25zKGludCBuRmxhZyk7CisgIGludCBHZXRQYWdlQ291bnQoKSBjb25zdCB7IHJldHVybiBtX3BVbmRlcmx5aW5nRG9jLT5HZXRQYWdlQ291bnQoKTsgfQorICBib29sIEdldFBlcm1pc3Npb25zKGludCBuRmxhZykgY29uc3Q7CiAKICAgYm9vbCBHZXRDaGFuZ2VNYXJrKCkgY29uc3QgeyByZXR1cm4gbV9iQ2hhbmdlTWFzazsgfQogICB2b2lkIFNldENoYW5nZU1hcmsoKSB7IG1fYkNoYW5nZU1hc2sgPSB0cnVlOyB9CiAgIHZvaWQgQ2xlYXJDaGFuZ2VNYXJrKCkgeyBtX2JDaGFuZ2VNYXNrID0gZmFsc2U7IH0KIAotICBVbmRlcmx5aW5nUGFnZVR5cGUqIEdldFBhZ2UoaW50IG5JbmRleCk7Ci0KICAgdm9pZCBQcm9jSmF2YXNjcmlwdEZ1bigpOwogICBib29sIFByb2NPcGVuQWN0aW9uKCk7CiAKLSAgdm9pZCBJbnZhbGlkYXRlKEZQREZfUEFHRSBwYWdlLCBjb25zdCBGWF9SRUNUJiByZWN0KTsKLSAgdm9pZCBPdXRwdXRTZWxlY3RlZFJlY3QoRlBERl9QQUdFIHBhZ2UsIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpOworICB2b2lkIEludmFsaWRhdGUoVW5kZXJseWluZ1BhZ2VUeXBlKiBwYWdlLCBjb25zdCBGWF9SRUNUJiByZWN0KTsKKyAgdm9pZCBPdXRwdXRTZWxlY3RlZFJlY3QoVW5kZXJseWluZ1BhZ2VUeXBlKiBwYWdlLCBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KTsKIAogICB2b2lkIFNldEN1cnNvcihpbnQgbkN1cnNvclR5cGUpOwogICBpbnQgU2V0VGltZXIoaW50IHVFbGFwc2UsIFRpbWVyQ2FsbGJhY2sgbHBUaW1lckZ1bmMpOwpAQCAtNzcsMjUgKzk2LDIxIEBACiAgIEZYX1NZU1RFTVRJTUUgR2V0TG9jYWxUaW1lKCkgY29uc3Q7CiAKICAgdm9pZCBPbkNoYW5nZSgpOwotICBib29sIElzU0hJRlRLZXlEb3duKHVpbnQzMl90IG5GbGFnKSBjb25zdDsKLSAgYm9vbCBJc0NUUkxLZXlEb3duKHVpbnQzMl90IG5GbGFnKSBjb25zdDsKLSAgYm9vbCBJc0FMVEtleURvd24odWludDMyX3QgbkZsYWcpIGNvbnN0OwogCi0gIEZQREZfUEFHRSBHZXRQYWdlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBuUGFnZUluZGV4KTsKLSAgRlBERl9QQUdFIEdldEN1cnJlbnRQYWdlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOworICBGUERGX1BBR0UgR2V0Q3VycmVudFBhZ2UoVW5kZXJseWluZ0RvY3VtZW50VHlwZSogZG9jdW1lbnQpOwogCi0gIHZvaWQgRXhlY3V0ZU5hbWVkQWN0aW9uKGNvbnN0IEZYX0NIQVIqIG5hbWVkQWN0aW9uKTsKKyAgdm9pZCBFeGVjdXRlTmFtZWRBY3Rpb24oY29uc3QgY2hhciogbmFtZWRBY3Rpb24pOwogICB2b2lkIE9uU2V0RmllbGRJbnB1dEZvY3VzKEZQREZfV0lERVNUUklORyBmb2N1c1RleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBuVGV4dExlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGb2N1cyk7Ci0gIHZvaWQgRG9VUklBY3Rpb24oY29uc3QgRlhfQ0hBUiogYnNVUkkpOworICB2b2lkIERvVVJJQWN0aW9uKGNvbnN0IGNoYXIqIGJzVVJJKTsKICAgdm9pZCBEb0dvVG9BY3Rpb24oaW50IG5QYWdlSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgIGludCB6b29tTW9kZSwKICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZQb3NBcnJheSwKICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVPZkFycmF5KTsKIAogICBVbmRlcmx5aW5nRG9jdW1lbnRUeXBlKiBHZXRVbmRlcmx5aW5nRG9jdW1lbnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1fcFVuZGVybHlpbmdEb2M7CisgICAgcmV0dXJuIG1fcFVuZGVybHlpbmdEb2MuR2V0KCk7CiAgIH0KIAogI2lmZGVmIFBERl9FTkFCTEVfWEZBCkBAIC0xMDMsMjcgKzExOCwyNyBAQAogICAgIHJldHVybiBtX3BVbmRlcmx5aW5nRG9jID8gbV9wVW5kZXJseWluZ0RvYy0+R2V0UERGRG9jKCkgOiBudWxscHRyOwogICB9CiAKLSAgQ1BERlhGQV9Db250ZXh0KiBHZXRYRkFDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9wVW5kZXJseWluZ0RvYzsgfQorICBDUERGWEZBX0NvbnRleHQqIEdldFhGQUNvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX3BVbmRlcmx5aW5nRG9jLkdldCgpOyB9CiAgIHZvaWQgUmVzZXRYRkFEb2N1bWVudCgpIHsgbV9wVW5kZXJseWluZ0RvYyA9IG51bGxwdHI7IH0KIAogICBpbnQgR2V0UGFnZVZpZXdDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1fUGFnZU1hcC5zaXplKCk7IH0KIAotICB2b2lkIERpc3BsYXlDYXJldChGUERGX1BBR0UgcGFnZSwKKyAgdm9pZCBEaXNwbGF5Q2FyZXQoQ1BERlhGQV9QYWdlKiBwYWdlLAogICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgYlZpc2libGUsCiAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsZWZ0LAogICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG9wLAogICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmlnaHQsCiAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBib3R0b20pOwotICBpbnQgR2V0Q3VycmVudFBhZ2VJbmRleChGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKLSAgdm9pZCBTZXRDdXJyZW50UGFnZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBpbnQgaUN1clBhZ2UpOworICBpbnQgR2V0Q3VycmVudFBhZ2VJbmRleChDUERGWEZBX0NvbnRleHQqIGRvY3VtZW50KTsKKyAgdm9pZCBTZXRDdXJyZW50UGFnZShDUERGWEZBX0NvbnRleHQqIGRvY3VtZW50LCBpbnQgaUN1clBhZ2UpOwogCiAgIC8vIFRPRE8oZHNpbmNsYWlyKTogVGhpcyBzaG91bGQgcHJvYmFibHkgY2hhbmdlIHRvIFBERml1bT8KLSAgQ0ZYX1dpZGVTdHJpbmcgRkZJX0dldEFwcE5hbWUoKSBjb25zdCB7IHJldHVybiBDRlhfV2lkZVN0cmluZyhMIkFjcm9iYXQiKTsgfQorICBXaWRlU3RyaW5nIEZGSV9HZXRBcHBOYW1lKCkgY29uc3QgeyByZXR1cm4gV2lkZVN0cmluZyhMIkFjcm9iYXQiKTsgfQogCi0gIENGWF9XaWRlU3RyaW5nIEdldFBsYXRmb3JtKCk7Ci0gIHZvaWQgR290b1VSTChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVVJMKTsKLSAgdm9pZCBHZXRQYWdlVmlld1JlY3QoRlBERl9QQUdFIHBhZ2UsIEZTX1JFQ1RGJiBkc3RSZWN0KTsKLSAgYm9vbCBQb3B1cE1lbnUoRlBERl9QQUdFIHBhZ2UsCisgIFdpZGVTdHJpbmcgR2V0UGxhdGZvcm0oKTsKKyAgdm9pZCBHb3RvVVJMKENQREZYRkFfQ29udGV4dCogZG9jdW1lbnQsIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c1VSTCk7CisgIHZvaWQgR2V0UGFnZVZpZXdSZWN0KENQREZYRkFfUGFnZSogcGFnZSwgRlNfUkVDVEYmIGRzdFJlY3QpOworICBib29sIFBvcHVwTWVudShDUERGWEZBX1BhZ2UqIHBhZ2UsCiAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCiAgICAgICAgICAgICAgICAgIGludCBtZW51RmxhZywKICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RiBwdCk7CkBAIC0xNDEsNDUgKzE1Niw0NSBAQAogICBGUERGX0ZJTEVIQU5ETEVSKiBPcGVuRmlsZShpbnQgZmlsZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyB3c1VSTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbW9kZSk7Ci0gIENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gRG93bmxvYWRGcm9tVVJMKGNvbnN0IEZYX1dDSEFSKiB1cmwpOwotICBDRlhfV2lkZVN0cmluZyBQb3N0UmVxdWVzdFVSTChjb25zdCBGWF9XQ0hBUiogd3NVUkwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiB3c0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiB3c0NvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogd3NFbmNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiB3c0hlYWRlcik7Ci0gIEZQREZfQk9PTCBQdXRSZXF1ZXN0VVJMKGNvbnN0IEZYX1dDSEFSKiB3c1VSTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHdzRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHdzRW5jb2RlKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0TGFuZ3VhZ2UoKTsKKyAgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IERvd25sb2FkRnJvbVVSTChjb25zdCB3Y2hhcl90KiB1cmwpOworICBXaWRlU3RyaW5nIFBvc3RSZXF1ZXN0VVJMKGNvbnN0IHdjaGFyX3QqIHdzVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHdzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiB3c0NvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHdzRW5jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHdzSGVhZGVyKTsKKyAgRlBERl9CT09MIFB1dFJlcXVlc3RVUkwoY29uc3Qgd2NoYXJfdCogd3NVUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHdzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogd3NFbmNvZGUpOworICBXaWRlU3RyaW5nIEdldExhbmd1YWdlKCk7CiAKICAgdm9pZCBQYWdlRXZlbnQoaW50IGlQYWdlQ291bnQsIHVpbnQzMl90IGR3RXZlbnRUeXBlKSBjb25zdDsKICNlbHNlICAgLy8gUERGX0VOQUJMRV9YRkEKLSAgQ1BERl9Eb2N1bWVudCogR2V0UERGRG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BVbmRlcmx5aW5nRG9jOyB9CisgIENQREZfRG9jdW1lbnQqIEdldFBERkRvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9wVW5kZXJseWluZ0RvYy5HZXQoKTsgfQogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCi0gIGludCBKU19hcHBBbGVydChjb25zdCBGWF9XQ0hBUiogTXNnLAotICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIFRpdGxlLAorICBpbnQgSlNfYXBwQWxlcnQoY29uc3Qgd2NoYXJfdCogTXNnLAorICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogVGl0bGUsCiAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBUeXBlLAogICAgICAgICAgICAgICAgICAgdWludDMyX3QgSWNvbik7Ci0gIGludCBKU19hcHBSZXNwb25zZShjb25zdCBGWF9XQ0hBUiogUXVlc3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogRGVmYXVsdCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBjTGFiZWwsCisgIGludCBKU19hcHBSZXNwb25zZShjb25zdCB3Y2hhcl90KiBRdWVzdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIFRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIGNMYWJlbCwKICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiUGFzc3dvcmQsCiAgICAgICAgICAgICAgICAgICAgICB2b2lkKiByZXNwb25zZSwKICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpOwogICB2b2lkIEpTX2FwcEJlZXAoaW50IG5UeXBlKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgSlNfZmllbGRCcm93c2UoKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgSlNfZG9jR2V0RmlsZVBhdGgoKTsKLSAgdm9pZCBKU19kb2NTdWJtaXRGb3JtKHZvaWQqIGZvcm1EYXRhLCBpbnQgbGVuZ3RoLCBjb25zdCBGWF9XQ0hBUiogVVJMKTsKKyAgV2lkZVN0cmluZyBKU19maWVsZEJyb3dzZSgpOworICBXaWRlU3RyaW5nIEpTX2RvY0dldEZpbGVQYXRoKCk7CisgIHZvaWQgSlNfZG9jU3VibWl0Rm9ybSh2b2lkKiBmb3JtRGF0YSwgaW50IGxlbmd0aCwgY29uc3Qgd2NoYXJfdCogVVJMKTsKICAgdm9pZCBKU19kb2NtYWlsRm9ybSh2b2lkKiBtYWlsRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBiVUksCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIFRvLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBTdWJqZWN0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBDQywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogQkNDLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBNc2cpOworICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIFRvLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIFN1YmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogQ0MsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogQkNDLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIE1zZyk7CiAgIHZvaWQgSlNfZG9jcHJpbnQoRlBERl9CT09MIGJVSSwKICAgICAgICAgICAgICAgICAgICBpbnQgblN0YXJ0LAogICAgICAgICAgICAgICAgICAgIGludCBuRW5kLApAQCAtMTkxLDcgKzIwNiw3IEBACiAgIHZvaWQgSlNfZG9jZ290b1BhZ2UoaW50IG5QYWdlTnVtKTsKIAogICBib29sIElzSlNJbml0aWF0ZWQoKSBjb25zdCB7IHJldHVybiBtX3BJbmZvICYmIG1fcEluZm8tPm1fcEpzUGxhdGZvcm07IH0KLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0QXBwTmFtZSgpIGNvbnN0IHsgcmV0dXJuICIiOyB9CisgIEJ5dGVTdHJpbmcgR2V0QXBwTmFtZSgpIGNvbnN0IHsgcmV0dXJuICIiOyB9CiAgIENGWF9TeXN0ZW1IYW5kbGVyKiBHZXRTeXNIYW5kbGVyKCkgY29uc3QgeyByZXR1cm4gbV9wU3lzSGFuZGxlci5nZXQoKTsgfQogICBGUERGX0ZPUk1GSUxMSU5GTyogR2V0Rm9ybUZpbGxJbmZvKCkgY29uc3QgeyByZXR1cm4gbV9wSW5mbzsgfQogCkBAIC0xOTksMTggKzIxNCwyMCBAQAogICBDRkZMX0ludGVyYWN0aXZlRm9ybUZpbGxlciogR2V0SW50ZXJhY3RpdmVGb3JtRmlsbGVyKCk7CiAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBHZXRBbm5vdEhhbmRsZXJNZ3IoKTsgIC8vIENyZWF0ZXMgaWYgbm90IHByZXNlbnQuCiAgIElKU19SdW50aW1lKiBHZXRKU1J1bnRpbWUoKTsgICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZXMgaWYgbm90IHByZXNlbnQuCi0gIENQREZTREtfQWN0aW9uSGFuZGxlciogR2V0QWN0aW9uSGFuZGVyKCk7ICAgICAgIC8vIENyZWF0ZXMgaWYgbm90IHByZXNlbnQuCisgIENQREZTREtfQWN0aW9uSGFuZGxlciogR2V0QWN0aW9uSGFuZGxlcigpOyAgICAgIC8vIENyZWF0ZXMgaWYgbm90IHByZXNlbnQuCiAgIENQREZTREtfSW50ZXJGb3JtKiBHZXRJbnRlckZvcm0oKTsgICAgICAgICAgICAgIC8vIENyZWF0ZXMgaWYgbm90IHByZXNlbnQuCiAKICBwcml2YXRlOgorICBVbmRlcmx5aW5nUGFnZVR5cGUqIEdldFBhZ2UoaW50IG5JbmRleCk7CisKKyAgRlBERl9GT1JNRklMTElORk8qIGNvbnN0IG1fcEluZm87CiAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGU0RLX0Fubm90SGFuZGxlck1ncj4gbV9wQW5ub3RIYW5kbGVyTWdyOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERlNES19BY3Rpb25IYW5kbGVyPiBtX3BBY3Rpb25IYW5kbGVyOwogICBzdGQ6OnVuaXF1ZV9wdHI8SUpTX1J1bnRpbWU+IG1fcEpTUnVudGltZTsKLSAgRlBERl9GT1JNRklMTElORk8qIGNvbnN0IG1fcEluZm87CiAgIHN0ZDo6bWFwPFVuZGVybHlpbmdQYWdlVHlwZSosIHN0ZDo6dW5pcXVlX3B0cjxDUERGU0RLX1BhZ2VWaWV3Pj4gbV9QYWdlTWFwOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERlNES19JbnRlckZvcm0+IG1fcEludGVyRm9ybTsKICAgQ1BERlNES19Bbm5vdDo6T2JzZXJ2ZWRQdHIgbV9wRm9jdXNBbm5vdDsKLSAgVW5kZXJseWluZ0RvY3VtZW50VHlwZSogbV9wVW5kZXJseWluZ0RvYzsKKyAgVW5vd25lZFB0cjxVbmRlcmx5aW5nRG9jdW1lbnRUeXBlPiBtX3BVbmRlcmx5aW5nRG9jOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZGTF9JbnRlcmFjdGl2ZUZvcm1GaWxsZXI+IG1fcEZvcm1GaWxsZXI7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfU3lzdGVtSGFuZGxlcj4gbV9wU3lzSGFuZGxlcjsKICAgYm9vbCBtX2JDaGFuZ2VNYXNrOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9jcGRmc2RrX2ludGVyZm9ybS5jcHAgYi9mcGRmc2RrL2NwZGZzZGtfaW50ZXJmb3JtLmNwcAppbmRleCA0ZWJjZjhhLi5lMTlkNDdiIDEwMDY0NAotLS0gYS9mcGRmc2RrL2NwZGZzZGtfaW50ZXJmb3JtLmNwcAorKysgYi9mcGRmc2RrL2NwZGZzZGtfaW50ZXJmb3JtLmNwcApAQCAtOCw2ICs4LDggQEAKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlLmgiCkBAIC0xOSw3ICsyMSw2IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfaW50ZXJmb3JtLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9ncmFwaHN0YXRlZGF0YS5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcGF0aGRhdGEuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgogI2luY2x1ZGUgImZwZGZzZGsvY2JhX2Fubm90aXRlcmF0b3IuaCIKICNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfYW5ub3QuaCIKICNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfZm9ybWZpbGxlbnZpcm9ubWVudC5oIgpAQCAtMjgsMTEgKzI5LDkgQEAKICNpbmNsdWRlICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9mb3JtZmlsbGVyLmgiCiAjaW5jbHVkZSAiZnBkZnNkay9mc2RrX2FjdGlvbmhhbmRsZXIuaCIKICNpbmNsdWRlICJmcGRmc2RrL2ZzZGtfZGVmaW5lLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9meGVkaXQvZnhldF9lZGl0LmgiCiAjaW5jbHVkZSAiZnBkZnNkay9pcGRmc2RrX2Fubm90aGFuZGxlci5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9panNfZXZlbnRfY29udGV4dC5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9panNfcnVudGltZS5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9VdGlscy5oIgorI2luY2x1ZGUgImZ4anMvaWpzX2V2ZW50X2NvbnRleHQuaCIKKyNpbmNsdWRlICJmeGpzL2lqc19ydW50aW1lLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgogCiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKQEAgLTQwLDI0ICszOSw1NiBAQAogI2luY2x1ZGUgImZwZGZzZGsvZnBkZnhmYS9jcGRmeGZhX2NvbnRleHQuaCIKICNpbmNsdWRlICJmcGRmc2RrL2ZwZGZ4ZmEvY3hmYV9md2xhZGFwdGVydGltZXJtZ3IuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZkb2N2aWV3LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0aGFuZGxlci5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZkb2N2aWV3LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZndpZGdldC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZ3aWRnZXRoYW5kbGVyLmgiCiAjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKK25hbWVzcGFjZSB7CisKK2Jvb2wgSXNGb3JtRmllbGRUeXBlQ29tYm9PclRleHQoRm9ybUZpZWxkVHlwZSBmaWVsZFR5cGUpIHsKKyAgc3dpdGNoIChmaWVsZFR5cGUpIHsKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtDb21ib0JveDoKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtUZXh0RmllbGQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorYm9vbCBJc0Zvcm1GaWVsZFR5cGVYRkEoRm9ybUZpZWxkVHlwZSBmaWVsZFR5cGUpIHsKKyAgc3dpdGNoIChmaWVsZFR5cGUpIHsKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtYRkE6CisgICAgY2FzZSBGb3JtRmllbGRUeXBlOjprWEZBX0NoZWNrQm94OgorICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a1hGQV9Db21ib0JveDoKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtYRkFfSW1hZ2VGaWVsZDoKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtYRkFfTGlzdEJveDoKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtYRkFfUHVzaEJ1dHRvbjoKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtYRkFfU2lnbmF0dXJlOgorICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a1hGQV9UZXh0RmllbGQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKK30gIC8vIG5hbWVzcGFjZQorCiBDUERGU0RLX0ludGVyRm9ybTo6Q1BERlNES19JbnRlckZvcm0oQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpCiAgICAgOiBtX3BGb3JtRmlsbEVudihwRm9ybUZpbGxFbnYpLAotICAgICAgbV9wSW50ZXJGb3JtKG5ldyBDUERGX0ludGVyRm9ybShtX3BGb3JtRmlsbEVudi0+R2V0UERGRG9jdW1lbnQoKSkpLAorICAgICAgbV9wSW50ZXJGb3JtKAorICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0ludGVyRm9ybT4obV9wRm9ybUZpbGxFbnYtPkdldFBERkRvY3VtZW50KCkpKSwKICNpZmRlZiBQREZfRU5BQkxFX1hGQQogICAgICAgbV9iWGZhQ2FsY3VsYXRlKHRydWUpLAogICAgICAgbV9iWGZhVmFsaWRhdGlvbnNFbmFibGVkKHRydWUpLAogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogICAgICAgbV9iQ2FsY3VsYXRlKHRydWUpLAogICAgICAgbV9iQnVzeShmYWxzZSksCi0gICAgICBtX2lIaWdobGlnaHRBbHBoYSgwKSB7CisgICAgICBtX0hpZ2hsaWdodEFscGhhKDApIHsKICAgbV9wSW50ZXJGb3JtLT5TZXRGb3JtTm90aWZ5KHRoaXMpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1GaWVsZFR5cGVzOyArK2kpCi0gICAgbV9iTmVlZEhpZ2h0bGlnaHRbaV0gPSBmYWxzZTsKKyAgUmVtb3ZlQWxsSGlnaExpZ2h0cygpOwogfQogCiBDUERGU0RLX0ludGVyRm9ybTo6fkNQREZTREtfSW50ZXJGb3JtKCkgewpAQCAtNzMsOCArMTA0LDggQEAKIAogQ1BERlNES19XaWRnZXQqIENQREZTREtfSW50ZXJGb3JtOjpHZXRTaWJsaW5nKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk5leHQpIGNvbnN0IHsKLSAgc3RkOjp1bmlxdWVfcHRyPENCQV9Bbm5vdEl0ZXJhdG9yPiBwSXRlcmF0b3IobmV3IENCQV9Bbm5vdEl0ZXJhdG9yKAotICAgICAgcFdpZGdldC0+R2V0UGFnZVZpZXcoKSwgQ1BERl9Bbm5vdDo6U3VidHlwZTo6V0lER0VUKSk7CisgIGF1dG8gcEl0ZXJhdG9yID0gcGRmaXVtOjpNYWtlVW5pcXVlPENCQV9Bbm5vdEl0ZXJhdG9yPigKKyAgICAgIHBXaWRnZXQtPkdldFBhZ2VWaWV3KCksIENQREZfQW5ub3Q6OlN1YnR5cGU6OldJREdFVCk7CiAKICAgaWYgKGJOZXh0KQogICAgIHJldHVybiBzdGF0aWNfY2FzdDxDUERGU0RLX1dpZGdldCo+KHBJdGVyYXRvci0+R2V0TmV4dEFubm90KHBXaWRnZXQpKTsKQEAgLTExNiw3ICsxNDcsNyBAQAogfQogCiB2b2lkIENQREZTREtfSW50ZXJGb3JtOjpHZXRXaWRnZXRzKAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRmllbGROYW1lLAorICAgIGNvbnN0IFdpZGVTdHJpbmcmIHNGaWVsZE5hbWUsCiAgICAgc3RkOjp2ZWN0b3I8Q1BERlNES19Bbm5vdDo6T2JzZXJ2ZWRQdHI+KiB3aWRnZXRzKSBjb25zdCB7CiAgIGZvciAoaW50IGkgPSAwLCBzeiA9IG1fcEludGVyRm9ybS0+Q291bnRGaWVsZHMoc0ZpZWxkTmFtZSk7IGkgPCBzejsgKytpKSB7CiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBtX3BJbnRlckZvcm0tPkdldEZpZWxkKGksIHNGaWVsZE5hbWUpOwpAQCAtMjM3LDggKzI2OCw4IEBACiAgICAgaWYgKCFwRmllbGQpCiAgICAgICBjb250aW51ZTsKIAotICAgIGludCBuVHlwZSA9IHBGaWVsZC0+R2V0RmllbGRUeXBlKCk7Ci0gICAgaWYgKG5UeXBlICE9IEZJRUxEVFlQRV9DT01CT0JPWCAmJiBuVHlwZSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEKQorICAgIEZvcm1GaWVsZFR5cGUgZmllbGRUeXBlID0gcEZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKKyAgICBpZiAoIUlzRm9ybUZpZWxkVHlwZUNvbWJvT3JUZXh0KGZpZWxkVHlwZSkpCiAgICAgICBjb250aW51ZTsKIAogICAgIENQREZfQUFjdGlvbiBhQWN0aW9uID0gcEZpZWxkLT5HZXRBZGRpdGlvbmFsQWN0aW9uKCk7CkBAIC0yNDksMTcgKzI4MCwxNyBAQAogICAgIGlmICghYWN0aW9uLkdldERpY3QoKSkKICAgICAgIGNvbnRpbnVlOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcgY3NKUyA9IGFjdGlvbi5HZXRKYXZhU2NyaXB0KCk7CisgICAgV2lkZVN0cmluZyBjc0pTID0gYWN0aW9uLkdldEphdmFTY3JpcHQoKTsKICAgICBpZiAoY3NKUy5Jc0VtcHR5KCkpCiAgICAgICBjb250aW51ZTsKIAogICAgIElKU19FdmVudENvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0V2ZW50Q29udGV4dCgpOwotICAgIENGWF9XaWRlU3RyaW5nIHNPbGRWYWx1ZSA9IHBGaWVsZC0+R2V0VmFsdWUoKTsKLSAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBzT2xkVmFsdWU7CisgICAgV2lkZVN0cmluZyBzT2xkVmFsdWUgPSBwRmllbGQtPkdldFZhbHVlKCk7CisgICAgV2lkZVN0cmluZyBzVmFsdWUgPSBzT2xkVmFsdWU7CiAgICAgYm9vbCBiUkMgPSB0cnVlOwogICAgIHBDb250ZXh0LT5PbkZpZWxkX0NhbGN1bGF0ZShwRm9ybUZpZWxkLCBwRmllbGQsIHNWYWx1ZSwgYlJDKTsKIAotICAgIENGWF9XaWRlU3RyaW5nIHNJbmZvOworICAgIFdpZGVTdHJpbmcgc0luZm87CiAgICAgYm9vbCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChjc0pTLCAmc0luZm8pOwogICAgIHBSdW50aW1lLT5SZWxlYXNlRXZlbnRDb250ZXh0KHBDb250ZXh0KTsKICAgICBpZiAoYlJldCAmJiBiUkMgJiYgc1ZhbHVlLkNvbXBhcmUoc09sZFZhbHVlKSAhPSAwKQpAQCAtMjY4LDE2ICsyOTksMTYgQEAKICAgbV9iQnVzeSA9IGZhbHNlOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUERGU0RLX0ludGVyRm9ybTo6T25Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYkZvcm1hdHRlZCkgewotICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpOworV2lkZVN0cmluZyBDUERGU0RLX0ludGVyRm9ybTo6T25Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiRm9ybWF0dGVkKSB7CisgIFdpZGVTdHJpbmcgc1ZhbHVlID0gcEZvcm1GaWVsZC0+R2V0VmFsdWUoKTsKICAgaWYgKCFtX3BGb3JtRmlsbEVudi0+SXNKU0luaXRpYXRlZCgpKSB7CiAgICAgYkZvcm1hdHRlZCA9IGZhbHNlOwogICAgIHJldHVybiBzVmFsdWU7CiAgIH0KIAogICBJSlNfUnVudGltZSogcFJ1bnRpbWUgPSBtX3BGb3JtRmlsbEVudi0+R2V0SlNSdW50aW1lKCk7Ci0gIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggJiYKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZvcm1GaWVsZFR5cGU6OmtDb21ib0JveCAmJgogICAgICAgcEZvcm1GaWVsZC0+Q291bnRTZWxlY3RlZEl0ZW1zKCkgPiAwKSB7CiAgICAgaW50IGluZGV4ID0gcEZvcm1GaWVsZC0+R2V0U2VsZWN0ZWRJbmRleCgwKTsKICAgICBpZiAoaW5kZXggPj0gMCkKQEAgLTI5MCwxMyArMzIxLDEzIEBACiAgIGlmIChhQWN0aW9uLkdldERpY3QoKSAmJiBhQWN0aW9uLkFjdGlvbkV4aXN0KENQREZfQUFjdGlvbjo6Rm9ybWF0KSkgewogICAgIENQREZfQWN0aW9uIGFjdGlvbiA9IGFBY3Rpb24uR2V0QWN0aW9uKENQREZfQUFjdGlvbjo6Rm9ybWF0KTsKICAgICBpZiAoYWN0aW9uLkdldERpY3QoKSkgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgc2NyaXB0ID0gYWN0aW9uLkdldEphdmFTY3JpcHQoKTsKKyAgICAgIFdpZGVTdHJpbmcgc2NyaXB0ID0gYWN0aW9uLkdldEphdmFTY3JpcHQoKTsKICAgICAgIGlmICghc2NyaXB0LklzRW1wdHkoKSkgewotICAgICAgICBDRlhfV2lkZVN0cmluZyBWYWx1ZSA9IHNWYWx1ZTsKKyAgICAgICAgV2lkZVN0cmluZyBWYWx1ZSA9IHNWYWx1ZTsKIAogICAgICAgICBJSlNfRXZlbnRDb250ZXh0KiBwQ29udGV4dCA9IHBSdW50aW1lLT5OZXdFdmVudENvbnRleHQoKTsKICAgICAgICAgcENvbnRleHQtPk9uRmllbGRfRm9ybWF0KHBGb3JtRmllbGQsIFZhbHVlLCB0cnVlKTsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc0luZm87CisgICAgICAgIFdpZGVTdHJpbmcgc0luZm87CiAgICAgICAgIGJvb2wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc2NyaXB0LCAmc0luZm8pOwogICAgICAgICBwUnVudGltZS0+UmVsZWFzZUV2ZW50Q29udGV4dChwQ29udGV4dCk7CiAgICAgICAgIGlmIChiUmV0KSB7CkBAIC0zMTAsNyArMzQxLDcgQEAKIH0KIAogdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6UmVzZXRGaWVsZEFwcGVhcmFuY2UoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyogc1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyogc1ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVmFsdWVDaGFuZ2VkKSB7CiAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaSA8IHN6OyBpKyspIHsKICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpOwpAQCAtMzIxLDIyICszNTIsMjQgQEAKIH0KIAogdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6VXBkYXRlRmllbGQoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQpIHsKLSAgYXV0byBmb3JtZmlsbGVyID0gbV9wRm9ybUZpbGxFbnYtPkdldEludGVyYWN0aXZlRm9ybUZpbGxlcigpOworICBhdXRvKiBmb3JtZmlsbGVyID0gbV9wRm9ybUZpbGxFbnYtPkdldEludGVyYWN0aXZlRm9ybUZpbGxlcigpOwogICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGkgPCBzejsgaSsrKSB7CiAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKTsKICAgICBBU1NFUlQocEZvcm1DdHJsKTsKIAotICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IEdldFdpZGdldChwRm9ybUN0cmwpKSB7Ci0gICAgICBVbmRlcmx5aW5nUGFnZVR5cGUqIHBQYWdlID0gcFdpZGdldC0+R2V0VW5kZXJseWluZ1BhZ2UoKTsKLSAgICAgIG1fcEZvcm1GaWxsRW52LT5JbnZhbGlkYXRlKAotICAgICAgICAgIHBQYWdlLCBmb3JtZmlsbGVyLT5HZXRWaWV3QkJveCgKLSAgICAgICAgICAgICAgICAgICAgIG1fcEZvcm1GaWxsRW52LT5HZXRQYWdlVmlldyhwUGFnZSwgZmFsc2UpLCBwV2lkZ2V0KSk7Ci0gICAgfQorICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gR2V0V2lkZ2V0KHBGb3JtQ3RybCk7CisgICAgaWYgKCFwV2lkZ2V0KQorICAgICAgY29udGludWU7CisKKyAgICBVbmRlcmx5aW5nUGFnZVR5cGUqIHBQYWdlID0gcFdpZGdldC0+R2V0VW5kZXJseWluZ1BhZ2UoKTsKKyAgICBGWF9SRUNUIHJlY3QgPSBmb3JtZmlsbGVyLT5HZXRWaWV3QkJveCgKKyAgICAgICAgbV9wRm9ybUZpbGxFbnYtPkdldFBhZ2VWaWV3KHBQYWdlLCBmYWxzZSksIHBXaWRnZXQpOworICAgIG1fcEZvcm1GaWxsRW52LT5JbnZhbGlkYXRlKHBQYWdlLCByZWN0KTsKICAgfQogfQogCiBib29sIENQREZTREtfSW50ZXJGb3JtOjpPbktleVN0cm9rZUNvbW1pdChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBjc1ZhbHVlKSB7CiAgIENQREZfQUFjdGlvbiBhQWN0aW9uID0gcEZvcm1GaWVsZC0+R2V0QWRkaXRpb25hbEFjdGlvbigpOwogICBpZiAoIWFBY3Rpb24uR2V0RGljdCgpIHx8ICFhQWN0aW9uLkFjdGlvbkV4aXN0KENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlKSkKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTM0NSwxOCArMzc4LDE4IEBACiAgIGlmICghYWN0aW9uLkdldERpY3QoKSkKICAgICByZXR1cm4gdHJ1ZTsKIAotICBDUERGU0RLX0FjdGlvbkhhbmRsZXIqIHBBY3Rpb25IYW5kbGVyID0gbV9wRm9ybUZpbGxFbnYtPkdldEFjdGlvbkhhbmRlcigpOworICBDUERGU0RLX0FjdGlvbkhhbmRsZXIqIHBBY3Rpb25IYW5kbGVyID0gbV9wRm9ybUZpbGxFbnYtPkdldEFjdGlvbkhhbmRsZXIoKTsKICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOwotICBmYS5iTW9kaWZpZXIgPSBtX3BGb3JtRmlsbEVudi0+SXNDVFJMS2V5RG93bigwKTsKLSAgZmEuYlNoaWZ0ID0gbV9wRm9ybUZpbGxFbnYtPklzU0hJRlRLZXlEb3duKDApOworICBmYS5iTW9kaWZpZXIgPSBmYWxzZTsKKyAgZmEuYlNoaWZ0ID0gZmFsc2U7CiAgIGZhLnNWYWx1ZSA9IGNzVmFsdWU7Ci0gIHBBY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9GaWVsZEphdmFTY3JpcHQoYWN0aW9uLCBDUERGX0FBY3Rpb246OktleVN0cm9rZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb3JtRmlsbEVudiwgcEZvcm1GaWVsZCwgZmEpOworICBwQWN0aW9uSGFuZGxlci0+RG9BY3Rpb25fRmllbGRKYXZhU2NyaXB0KAorICAgICAgYWN0aW9uLCBDUERGX0FBY3Rpb246OktleVN0cm9rZSwgbV9wRm9ybUZpbGxFbnYuR2V0KCksIHBGb3JtRmllbGQsIGZhKTsKICAgcmV0dXJuIGZhLmJSQzsKIH0KIAogYm9vbCBDUERGU0RLX0ludGVyRm9ybTo6T25WYWxpZGF0ZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgY3NWYWx1ZSkgewogICBDUERGX0FBY3Rpb24gYUFjdGlvbiA9IHBGb3JtRmllbGQtPkdldEFkZGl0aW9uYWxBY3Rpb24oKTsKICAgaWYgKCFhQWN0aW9uLkdldERpY3QoKSB8fCAhYUFjdGlvbi5BY3Rpb25FeGlzdChDUERGX0FBY3Rpb246OlZhbGlkYXRlKSkKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTM2NSwxMyArMzk4LDEzIEBACiAgIGlmICghYWN0aW9uLkdldERpY3QoKSkKICAgICByZXR1cm4gdHJ1ZTsKIAotICBDUERGU0RLX0FjdGlvbkhhbmRsZXIqIHBBY3Rpb25IYW5kbGVyID0gbV9wRm9ybUZpbGxFbnYtPkdldEFjdGlvbkhhbmRlcigpOworICBDUERGU0RLX0FjdGlvbkhhbmRsZXIqIHBBY3Rpb25IYW5kbGVyID0gbV9wRm9ybUZpbGxFbnYtPkdldEFjdGlvbkhhbmRsZXIoKTsKICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOwotICBmYS5iTW9kaWZpZXIgPSBtX3BGb3JtRmlsbEVudi0+SXNDVFJMS2V5RG93bigwKTsKLSAgZmEuYlNoaWZ0ID0gbV9wRm9ybUZpbGxFbnYtPklzU0hJRlRLZXlEb3duKDApOworICBmYS5iTW9kaWZpZXIgPSBmYWxzZTsKKyAgZmEuYlNoaWZ0ID0gZmFsc2U7CiAgIGZhLnNWYWx1ZSA9IGNzVmFsdWU7Ci0gIHBBY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9GaWVsZEphdmFTY3JpcHQoYWN0aW9uLCBDUERGX0FBY3Rpb246OlZhbGlkYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZvcm1GaWxsRW52LCBwRm9ybUZpZWxkLCBmYSk7CisgIHBBY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9GaWVsZEphdmFTY3JpcHQoCisgICAgICBhY3Rpb24sIENQREZfQUFjdGlvbjo6VmFsaWRhdGUsIG1fcEZvcm1GaWxsRW52LkdldCgpLCBwRm9ybUZpZWxkLCBmYSk7CiAgIHJldHVybiBmYS5iUkM7CiB9CiAKQEAgLTQwOSw3ICs0NDIsNyBAQAogfQogCiBib29sIENQREZTREtfSW50ZXJGb3JtOjpEb0FjdGlvbl9TdWJtaXRGb3JtKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgc0Rlc3RpbmF0aW9uID0gYWN0aW9uLkdldEZpbGVQYXRoKCk7CisgIFdpZGVTdHJpbmcgc0Rlc3RpbmF0aW9uID0gYWN0aW9uLkdldEZpbGVQYXRoKCk7CiAgIGlmIChzRGVzdGluYXRpb24uSXNFbXB0eSgpKQogICAgIHJldHVybiBmYWxzZTsKIApAQCAtNDMzLDMwICs0NjYsMzYgQEAKICAgcmV0dXJuIFN1Ym1pdEZvcm0oc0Rlc3RpbmF0aW9uLCBmYWxzZSk7CiB9CiAKLWJvb2wgQ1BERlNES19JbnRlckZvcm06OlN1Ym1pdEZpZWxkcyhjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NEZXN0aW5hdGlvbiwKK2Jvb2wgQ1BERlNES19JbnRlckZvcm06OlN1Ym1pdEZpZWxkcyhjb25zdCBXaWRlU3RyaW5nJiBjc0Rlc3RpbmF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4mIGZpZWxkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJbmNsdWRlT3JFeGNsdWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlVybEVuY29kZWQpIHsKLSAgQ0ZYX0J5dGVUZXh0QnVmIHRleHRCdWY7Ci0gIEV4cG9ydEZpZWxkc1RvRkRGVGV4dEJ1ZihmaWVsZHMsIGJJbmNsdWRlT3JFeGNsdWRlLCB0ZXh0QnVmKTsKKyAgQnl0ZVN0cmluZyB0ZXh0QnVmID0gRXhwb3J0RmllbGRzVG9GREZUZXh0QnVmKGZpZWxkcywgYkluY2x1ZGVPckV4Y2x1ZGUpOwogCi0gIHVpbnQ4X3QqIHBCdWZmZXIgPSB0ZXh0QnVmLkdldEJ1ZmZlcigpOwotICBGWF9TVFJTSVpFIG5CdWZTaXplID0gdGV4dEJ1Zi5HZXRMZW5ndGgoKTsKLQotICBpZiAoYlVybEVuY29kZWQgJiYgIUZERlRvVVJMRW5jb2RlZERhdGEocEJ1ZmZlciwgbkJ1ZlNpemUpKQorICBzaXplX3QgbkJ1ZlNpemUgPSB0ZXh0QnVmLkdldExlbmd0aCgpOworICBpZiAobkJ1ZlNpemUgPT0gMCkKICAgICByZXR1cm4gZmFsc2U7CiAKKyAgdWludDhfdCogcExvY2FsQnVmZmVyID0gRlhfQWxsb2ModWludDhfdCwgbkJ1ZlNpemUpOworICBtZW1jcHkocExvY2FsQnVmZmVyLCB0ZXh0QnVmLmNfc3RyKCksIG5CdWZTaXplKTsKKyAgdWludDhfdCogcEJ1ZmZlciA9IHBMb2NhbEJ1ZmZlcjsKKworICBpZiAoYlVybEVuY29kZWQgJiYgIUZERlRvVVJMRW5jb2RlZERhdGEocEJ1ZmZlciwgbkJ1ZlNpemUpKSB7CisgICAgRlhfRnJlZShwTG9jYWxCdWZmZXIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCiAgIG1fcEZvcm1GaWxsRW52LT5KU19kb2NTdWJtaXRGb3JtKHBCdWZmZXIsIG5CdWZTaXplLCBjc0Rlc3RpbmF0aW9uLmNfc3RyKCkpOworCisgIGlmIChwQnVmZmVyICE9IHBMb2NhbEJ1ZmZlcikKKyAgICBGWF9GcmVlKHBCdWZmZXIpOworCisgIEZYX0ZyZWUocExvY2FsQnVmZmVyKTsKKwogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDUERGU0RLX0ludGVyRm9ybTo6RkRGVG9VUkxFbmNvZGVkRGF0YShDRlhfV2lkZVN0cmluZyBjc0ZERkZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGNzVHh0RmlsZSkgewotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDUERGU0RLX0ludGVyRm9ybTo6RkRGVG9VUkxFbmNvZGVkRGF0YSh1aW50OF90KiYgcEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfU1RSU0laRSYgbkJ1ZlNpemUpIHsKK2Jvb2wgQ1BERlNES19JbnRlckZvcm06OkZERlRvVVJMRW5jb2RlZERhdGEodWludDhfdComIHBCdWYsIHNpemVfdCYgbkJ1ZlNpemUpIHsKICAgc3RkOjp1bmlxdWVfcHRyPENGREZfRG9jdW1lbnQ+IHBGREYgPQogICAgICAgQ0ZERl9Eb2N1bWVudDo6UGFyc2VNZW1vcnkocEJ1ZiwgbkJ1ZlNpemUpOwogICBpZiAoIXBGREYpCkBAIC00NzAsNDkgKzUwOSw0NiBAQAogICBpZiAoIXBGaWVsZHMpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIENGWF9CeXRlVGV4dEJ1ZiBmZGZFbmNvZGVkRGF0YTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGZkZkVuY29kZWREYXRhOwogICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgcEZpZWxkcy0+R2V0Q291bnQoKTsgaSsrKSB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRmllbGQgPSBwRmllbGRzLT5HZXREaWN0QXQoaSk7CiAgICAgaWYgKCFwRmllbGQpCiAgICAgICBjb250aW51ZTsKLSAgICBDRlhfV2lkZVN0cmluZyBuYW1lOworICAgIFdpZGVTdHJpbmcgbmFtZTsKICAgICBuYW1lID0gcEZpZWxkLT5HZXRVbmljb2RlVGV4dEZvcigiVCIpOwotICAgIENGWF9CeXRlU3RyaW5nIG5hbWVfYiA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShuYW1lKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc0JWYWx1ZSA9IHBGaWVsZC0+R2V0U3RyaW5nRm9yKCJWIik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgY3NXVmFsdWUgPSBQREZfRGVjb2RlVGV4dChjc0JWYWx1ZSk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NWYWx1ZV9iID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKGNzV1ZhbHVlKTsKKyAgICBCeXRlU3RyaW5nIG5hbWVfYiA9IEJ5dGVTdHJpbmc6OkZyb21Vbmljb2RlKG5hbWUpOworICAgIEJ5dGVTdHJpbmcgY3NCVmFsdWUgPSBwRmllbGQtPkdldFN0cmluZ0ZvcigiViIpOworICAgIFdpZGVTdHJpbmcgY3NXVmFsdWUgPSBQREZfRGVjb2RlVGV4dChjc0JWYWx1ZSk7CisgICAgQnl0ZVN0cmluZyBjc1ZhbHVlX2IgPSBCeXRlU3RyaW5nOjpGcm9tVW5pY29kZShjc1dWYWx1ZSk7CiAKICAgICBmZGZFbmNvZGVkRGF0YSA8PCBuYW1lX2IuR2V0QnVmZmVyKG5hbWVfYi5HZXRMZW5ndGgoKSk7Ci0gICAgbmFtZV9iLlJlbGVhc2VCdWZmZXIoKTsKKyAgICBuYW1lX2IuUmVsZWFzZUJ1ZmZlcihuYW1lX2IuR2V0U3RyaW5nTGVuZ3RoKCkpOwogICAgIGZkZkVuY29kZWREYXRhIDw8ICI9IjsKICAgICBmZGZFbmNvZGVkRGF0YSA8PCBjc1ZhbHVlX2IuR2V0QnVmZmVyKGNzVmFsdWVfYi5HZXRMZW5ndGgoKSk7Ci0gICAgY3NWYWx1ZV9iLlJlbGVhc2VCdWZmZXIoKTsKKyAgICBjc1ZhbHVlX2IuUmVsZWFzZUJ1ZmZlcihjc1ZhbHVlX2IuR2V0U3RyaW5nTGVuZ3RoKCkpOwogICAgIGlmIChpICE9IHBGaWVsZHMtPkdldENvdW50KCkgLSAxKQogICAgICAgZmRmRW5jb2RlZERhdGEgPDwgIiYiOwogICB9CiAKLSAgbkJ1ZlNpemUgPSBmZGZFbmNvZGVkRGF0YS5HZXRMZW5ndGgoKTsKKyAgbkJ1ZlNpemUgPSBmZGZFbmNvZGVkRGF0YS50ZWxscCgpOworICBpZiAobkJ1ZlNpemUgPT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKICAgcEJ1ZiA9IEZYX0FsbG9jKHVpbnQ4X3QsIG5CdWZTaXplKTsKLSAgRlhTWVNfbWVtY3B5KHBCdWYsIGZkZkVuY29kZWREYXRhLkdldEJ1ZmZlcigpLCBuQnVmU2l6ZSk7CisgIG1lbWNweShwQnVmLCBmZGZFbmNvZGVkRGF0YS5zdHIoKS5jX3N0cigpLCBuQnVmU2l6ZSk7CiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENQREZTREtfSW50ZXJGb3JtOjpFeHBvcnRGaWVsZHNUb0ZERlRleHRCdWYoCitCeXRlU3RyaW5nIENQREZTREtfSW50ZXJGb3JtOjpFeHBvcnRGaWVsZHNUb0ZERlRleHRCdWYoCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiYgZmllbGRzLAotICAgIGJvb2wgYkluY2x1ZGVPckV4Y2x1ZGUsCi0gICAgQ0ZYX0J5dGVUZXh0QnVmJiB0ZXh0QnVmKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRkRGX0RvY3VtZW50PiBwRkRGID0KLSAgICAgIG1fcEludGVyRm9ybS0+RXhwb3J0VG9GREYobV9wRm9ybUZpbGxFbnYtPkpTX2RvY0dldEZpbGVQYXRoKCkuQXNTdHJpbmdDKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcywgYkluY2x1ZGVPckV4Y2x1ZGUsIGZhbHNlKTsKLSAgcmV0dXJuIHBGREYgPyBwRkRGLT5Xcml0ZUJ1Zih0ZXh0QnVmKSA6IGZhbHNlOworICAgIGJvb2wgYkluY2x1ZGVPckV4Y2x1ZGUpIHsKKyAgc3RkOjp1bmlxdWVfcHRyPENGREZfRG9jdW1lbnQ+IHBGREYgPSBtX3BJbnRlckZvcm0tPkV4cG9ydFRvRkRGKAorICAgICAgbV9wRm9ybUZpbGxFbnYtPkpTX2RvY0dldEZpbGVQYXRoKCksIGZpZWxkcywgYkluY2x1ZGVPckV4Y2x1ZGUsIGZhbHNlKTsKKworICByZXR1cm4gcEZERiA/IHBGREYtPldyaXRlVG9TdHJpbmcoKSA6IEJ5dGVTdHJpbmcoKTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19JbnRlckZvcm06OkdldFRlbXBvcmFyeUZpbGVOYW1lKAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRmlsZUV4dCkgewotICByZXR1cm4gTCIiOwotfQotCi1ib29sIENQREZTREtfSW50ZXJGb3JtOjpTdWJtaXRGb3JtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRGVzdGluYXRpb24sCitib29sIENQREZTREtfSW50ZXJGb3JtOjpTdWJtaXRGb3JtKGNvbnN0IFdpZGVTdHJpbmcmIHNEZXN0aW5hdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVXJsRW5jb2RlZCkgewogICBpZiAoc0Rlc3RpbmF0aW9uLklzRW1wdHkoKSkKICAgICByZXR1cm4gZmFsc2U7CkBAIC01MjAsMzEgKzU1Niw0MSBAQAogICBpZiAoIW1fcEZvcm1GaWxsRW52IHx8ICFtX3BJbnRlckZvcm0pCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRkRGX0RvY3VtZW50PiBwRkRGRG9jID0gbV9wSW50ZXJGb3JtLT5FeHBvcnRUb0ZERigKLSAgICAgIG1fcEZvcm1GaWxsRW52LT5KU19kb2NHZXRGaWxlUGF0aCgpLkFzU3RyaW5nQygpLCBmYWxzZSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRkRGX0RvY3VtZW50PiBwRkRGRG9jID0KKyAgICAgIG1fcEludGVyRm9ybS0+RXhwb3J0VG9GREYobV9wRm9ybUZpbGxFbnYtPkpTX2RvY0dldEZpbGVQYXRoKCksIGZhbHNlKTsKICAgaWYgKCFwRkRGRG9jKQogICAgIHJldHVybiBmYWxzZTsKIAotICBDRlhfQnl0ZVRleHRCdWYgRmRmQnVmZmVyOwotICBpZiAoIXBGREZEb2MtPldyaXRlQnVmKEZkZkJ1ZmZlcikpCisgIEJ5dGVTdHJpbmcgZmRmQnVmZmVyID0gcEZERkRvYy0+V3JpdGVUb1N0cmluZygpOworCisgIGlmIChmZGZCdWZmZXIuSXNFbXB0eSgpKQogICAgIHJldHVybiBmYWxzZTsKIAotICB1aW50OF90KiBwQnVmZmVyID0gRmRmQnVmZmVyLkdldEJ1ZmZlcigpOwotICBGWF9TVFJTSVpFIG5CdWZTaXplID0gRmRmQnVmZmVyLkdldExlbmd0aCgpOwotICBpZiAoYlVybEVuY29kZWQgJiYgIUZERlRvVVJMRW5jb2RlZERhdGEocEJ1ZmZlciwgbkJ1ZlNpemUpKQorICB1aW50OF90KiBwTG9jYWxCdWZmZXIgPSBGWF9BbGxvYyh1aW50OF90LCBmZGZCdWZmZXIuR2V0TGVuZ3RoKCkpOworICBtZW1jcHkocExvY2FsQnVmZmVyLCBmZGZCdWZmZXIuY19zdHIoKSwgZmRmQnVmZmVyLkdldExlbmd0aCgpKTsKKyAgdWludDhfdCogcEJ1ZmZlciA9IHBMb2NhbEJ1ZmZlcjsKKworICBzaXplX3QgbkJ1ZlNpemUgPSBmZGZCdWZmZXIuR2V0TGVuZ3RoKCk7CisgIGlmIChiVXJsRW5jb2RlZCAmJiAhRkRGVG9VUkxFbmNvZGVkRGF0YShwQnVmZmVyLCBuQnVmU2l6ZSkpIHsKKyAgICBGWF9GcmVlKHBMb2NhbEJ1ZmZlcik7CiAgICAgcmV0dXJuIGZhbHNlOworICB9CiAKICAgbV9wRm9ybUZpbGxFbnYtPkpTX2RvY1N1Ym1pdEZvcm0ocEJ1ZmZlciwgbkJ1ZlNpemUsIHNEZXN0aW5hdGlvbi5jX3N0cigpKTsKLSAgaWYgKGJVcmxFbmNvZGVkKQorCisgIGlmIChwQnVmZmVyICE9IHBMb2NhbEJ1ZmZlcikKICAgICBGWF9GcmVlKHBCdWZmZXIpOwogCisgIEZYX0ZyZWUocExvY2FsQnVmZmVyKTsKKwogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDUERGU0RLX0ludGVyRm9ybTo6RXhwb3J0Rm9ybVRvRkRGVGV4dEJ1ZihDRlhfQnl0ZVRleHRCdWYmIHRleHRCdWYpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPENGREZfRG9jdW1lbnQ+IHBGREYgPSBtX3BJbnRlckZvcm0tPkV4cG9ydFRvRkRGKAotICAgICAgbV9wRm9ybUZpbGxFbnYtPkpTX2RvY0dldEZpbGVQYXRoKCkuQXNTdHJpbmdDKCksIGZhbHNlKTsKLSAgcmV0dXJuIHBGREYgJiYgcEZERi0+V3JpdGVCdWYodGV4dEJ1Zik7CitCeXRlU3RyaW5nIENQREZTREtfSW50ZXJGb3JtOjpFeHBvcnRGb3JtVG9GREZUZXh0QnVmKCkgeworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZERl9Eb2N1bWVudD4gcEZERiA9CisgICAgICBtX3BJbnRlckZvcm0tPkV4cG9ydFRvRkRGKG1fcEZvcm1GaWxsRW52LT5KU19kb2NHZXRGaWxlUGF0aCgpLCBmYWxzZSk7CisKKyAgcmV0dXJuIHBGREYgPyBwRkRGLT5Xcml0ZVRvU3RyaW5nKCkgOiBCeXRlU3RyaW5nKCk7CiB9CiAKIGJvb2wgQ1BERlNES19JbnRlckZvcm06OkRvQWN0aW9uX1Jlc2V0Rm9ybShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKSB7CkBAIC01NzEsNyArNjE3LDcgQEAKICAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBmaWVsZHM7CiAgIGZvciAoQ1BERl9PYmplY3QqIHBPYmplY3QgOiBvYmplY3RzKSB7CiAgICAgaWYgKHBPYmplY3QgJiYgcE9iamVjdC0+SXNTdHJpbmcoKSkgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NOYW1lID0gcE9iamVjdC0+R2V0VW5pY29kZVRleHQoKTsKKyAgICAgIFdpZGVTdHJpbmcgY3NOYW1lID0gcE9iamVjdC0+R2V0VW5pY29kZVRleHQoKTsKICAgICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBtX3BJbnRlckZvcm0tPkdldEZpZWxkKDAsIGNzTmFtZSk7CiAgICAgICBpZiAocEZpZWxkKQogICAgICAgICBmaWVsZHMucHVzaF9iYWNrKHBGaWVsZCk7CkBAIC01ODEsOSArNjI3LDkgQEAKIH0KIAogaW50IENQREZTREtfSW50ZXJGb3JtOjpCZWZvcmVWYWx1ZUNoYW5nZShDUERGX0Zvcm1GaWVsZCogcEZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSkgewotICBpbnQgblR5cGUgPSBwRmllbGQtPkdldEZpZWxkVHlwZSgpOwotICBpZiAoblR5cGUgIT0gRklFTERUWVBFX0NPTUJPQk9YICYmIG5UeXBlICE9IEZJRUxEVFlQRV9URVhURklFTEQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIGNzVmFsdWUpIHsKKyAgRm9ybUZpZWxkVHlwZSBmaWVsZFR5cGUgPSBwRmllbGQtPkdldEZpZWxkVHlwZSgpOworICBpZiAoIUlzRm9ybUZpZWxkVHlwZUNvbWJvT3JUZXh0KGZpZWxkVHlwZSkpCiAgICAgcmV0dXJuIDA7CiAKICAgaWYgKCFPbktleVN0cm9rZUNvbW1pdChwRmllbGQsIGNzVmFsdWUpKQpAQCAtNTk5LDE5ICs2NDUsMTkgQEAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQogICBTeW5jaHJvbml6ZUZpZWxkKHBGaWVsZCwgZmFsc2UpOwogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQotICBpbnQgblR5cGUgPSBwRmllbGQtPkdldEZpZWxkVHlwZSgpOwotICBpZiAoblR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YIHx8IG5UeXBlID09IEZJRUxEVFlQRV9URVhURklFTEQpIHsKKyAgRm9ybUZpZWxkVHlwZSBmaWVsZFR5cGUgPSBwRmllbGQtPkdldEZpZWxkVHlwZSgpOworICBpZiAoSXNGb3JtRmllbGRUeXBlQ29tYm9PclRleHQoZmllbGRUeXBlKSkgewogICAgIE9uQ2FsY3VsYXRlKHBGaWVsZCk7CiAgICAgYm9vbCBiRm9ybWF0dGVkID0gZmFsc2U7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gT25Gb3JtYXQocEZpZWxkLCBiRm9ybWF0dGVkKTsKKyAgICBXaWRlU3RyaW5nIHNWYWx1ZSA9IE9uRm9ybWF0KHBGaWVsZCwgYkZvcm1hdHRlZCk7CiAgICAgUmVzZXRGaWVsZEFwcGVhcmFuY2UocEZpZWxkLCBiRm9ybWF0dGVkID8gJnNWYWx1ZSA6IG51bGxwdHIsIHRydWUpOwogICAgIFVwZGF0ZUZpZWxkKHBGaWVsZCk7CiAgIH0KIH0KIAogaW50IENQREZTREtfSW50ZXJGb3JtOjpCZWZvcmVTZWxlY3Rpb25DaGFuZ2UoQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlKSB7Ci0gIGlmIChwRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9MSVNUQk9YKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgY3NWYWx1ZSkgeworICBpZiAocEZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGb3JtRmllbGRUeXBlOjprTGlzdEJveCkKICAgICByZXR1cm4gMDsKIAogICBpZiAoIU9uS2V5U3Ryb2tlQ29tbWl0KHBGaWVsZCwgY3NWYWx1ZSkpCkBAIC02MjQsNyArNjcwLDcgQEAKIH0KIAogdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6QWZ0ZXJTZWxlY3Rpb25DaGFuZ2UoQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCkgewotICBpZiAocEZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfTElTVEJPWCkKKyAgaWYgKHBGaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRm9ybUZpZWxkVHlwZTo6a0xpc3RCb3gpCiAgICAgcmV0dXJuOwogCiAgIE9uQ2FsY3VsYXRlKHBGaWVsZCk7CkBAIC02MzMsOCArNjc5LDkgQEAKIH0KIAogdm9pZCBDUERGU0RLX0ludGVyRm9ybTo6QWZ0ZXJDaGVja2VkU3RhdHVzQ2hhbmdlKENQREZfRm9ybUZpZWxkKiBwRmllbGQpIHsKLSAgaW50IG5UeXBlID0gcEZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKLSAgaWYgKG5UeXBlICE9IEZJRUxEVFlQRV9DSEVDS0JPWCAmJiBuVHlwZSAhPSBGSUVMRFRZUEVfUkFESU9CVVRUT04pCisgIEZvcm1GaWVsZFR5cGUgZmllbGRUeXBlID0gcEZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKKyAgaWYgKGZpZWxkVHlwZSAhPSBGb3JtRmllbGRUeXBlOjprQ2hlY2tCb3ggJiYKKyAgICAgIGZpZWxkVHlwZSAhPSBGb3JtRmllbGRUeXBlOjprUmFkaW9CdXR0b24pCiAgICAgcmV0dXJuOwogCiAgIE9uQ2FsY3VsYXRlKHBGaWVsZCk7CkBAIC02NTcsNDAgKzcwNCw1NiBAQAogICBPbkNhbGN1bGF0ZShudWxscHRyKTsKIH0KIAotYm9vbCBDUERGU0RLX0ludGVyRm9ybTo6SXNOZWVkSGlnaExpZ2h0KGludCBuRmllbGRUeXBlKSB7Ci0gIGlmIChuRmllbGRUeXBlIDwgMSB8fCBuRmllbGRUeXBlID4ga051bUZpZWxkVHlwZXMpCitib29sIENQREZTREtfSW50ZXJGb3JtOjpJc05lZWRIaWdoTGlnaHQoRm9ybUZpZWxkVHlwZSBmaWVsZFR5cGUpIHsKKyAgaWYgKGZpZWxkVHlwZSA9PSBGb3JtRmllbGRUeXBlOjprVW5rbm93bikKICAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiBtX2JOZWVkSGlnaHRsaWdodFtuRmllbGRUeXBlIC0gMV07CisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICAvLyBGb3IgdGhlIFhGQSBmaWVsZHMsIHdlIG5lZWQgdG8gcmV0dXJuIGlmIHRoZSBzcGVjaWZpYyBmaWVsZCB0eXBlIGhhcworICAvLyBoaWdobGlnaHQgZW5hYmxlZCBvciBpZiB0aGUgZ2VuZXJhbCBYRkEgZmllbGQgdHlwZSBoYXMgaXQgZW5hYmxlZC4KKyAgaWYgKElzRm9ybUZpZWxkVHlwZVhGQShmaWVsZFR5cGUpKSB7CisgICAgaWYgKCFtX05lZWRzSGlnaGxpZ2h0W3N0YXRpY19jYXN0PHNpemVfdD4oZmllbGRUeXBlKV0pCisgICAgICByZXR1cm4gbV9OZWVkc0hpZ2hsaWdodFtzdGF0aWNfY2FzdDxzaXplX3Q+KEZvcm1GaWVsZFR5cGU6OmtYRkEpXTsKKyAgfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICByZXR1cm4gbV9OZWVkc0hpZ2hsaWdodFtzdGF0aWNfY2FzdDxzaXplX3Q+KGZpZWxkVHlwZSldOwogfQogCi12b2lkIENQREZTREtfSW50ZXJGb3JtOjpSZW1vdmVBbGxIaWdoTGlnaHQoKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwga051bUZpZWxkVHlwZXM7ICsraSkKLSAgICBtX2JOZWVkSGlnaHRsaWdodFtpXSA9IGZhbHNlOwordm9pZCBDUERGU0RLX0ludGVyRm9ybTo6UmVtb3ZlQWxsSGlnaExpZ2h0cygpIHsKKyAgc3RkOjpmaWxsKG1fSGlnaGxpZ2h0Q29sb3IsIG1fSGlnaGxpZ2h0Q29sb3IgKyBrRm9ybUZpZWxkVHlwZUNvdW50LAorICAgICAgICAgICAgRlhTWVNfUkdCKDI1NSwgMjU1LCAyNTUpKTsKKyAgc3RkOjpmaWxsKG1fTmVlZHNIaWdobGlnaHQsIG1fTmVlZHNIaWdobGlnaHQgKyBrRm9ybUZpZWxkVHlwZUNvdW50LCBmYWxzZSk7CiB9CiAKLXZvaWQgQ1BERlNES19JbnRlckZvcm06OlNldEhpZ2hsaWdodENvbG9yKEZYX0NPTE9SUkVGIGNsciwgaW50IG5GaWVsZFR5cGUpIHsKLSAgaWYgKG5GaWVsZFR5cGUgPCAwIHx8IG5GaWVsZFR5cGUgPiBrTnVtRmllbGRUeXBlcykKK3ZvaWQgQ1BERlNES19JbnRlckZvcm06OlNldEhpZ2hsaWdodENvbG9yKEZYX0NPTE9SUkVGIGNsciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1GaWVsZFR5cGUgZmllbGRUeXBlKSB7CisgIGlmIChmaWVsZFR5cGUgPT0gRm9ybUZpZWxkVHlwZTo6a1Vua25vd24pCiAgICAgcmV0dXJuOwotICBzd2l0Y2ggKG5GaWVsZFR5cGUpIHsKLSAgICBjYXNlIDA6IHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUZpZWxkVHlwZXM7ICsraSkgewotICAgICAgICBtX2FIaWdobGlnaHRDb2xvcltpXSA9IGNscjsKLSAgICAgICAgbV9iTmVlZEhpZ2h0bGlnaHRbaV0gPSB0cnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6IHsKLSAgICAgIG1fYUhpZ2hsaWdodENvbG9yW25GaWVsZFR5cGUgLSAxXSA9IGNscjsKLSAgICAgIG1fYk5lZWRIaWdodGxpZ2h0W25GaWVsZFR5cGUgLSAxXSA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICB9CisKKyAgbV9IaWdobGlnaHRDb2xvcltzdGF0aWNfY2FzdDxzaXplX3Q+KGZpZWxkVHlwZSldID0gY2xyOworICBtX05lZWRzSGlnaGxpZ2h0W3N0YXRpY19jYXN0PHNpemVfdD4oZmllbGRUeXBlKV0gPSB0cnVlOworfQorCit2b2lkIENQREZTREtfSW50ZXJGb3JtOjpTZXRBbGxIaWdobGlnaHRDb2xvcnMoRlhfQ09MT1JSRUYgY2xyKSB7CisgIGZvciAoYXV0byB0eXBlIDoga0Zvcm1GaWVsZFR5cGVzKSB7CisgICAgbV9IaWdobGlnaHRDb2xvcltzdGF0aWNfY2FzdDxzaXplX3Q+KHR5cGUpXSA9IGNscjsKKyAgICBtX05lZWRzSGlnaGxpZ2h0W3N0YXRpY19jYXN0PHNpemVfdD4odHlwZSldID0gdHJ1ZTsKICAgfQogfQogCi1GWF9DT0xPUlJFRiBDUERGU0RLX0ludGVyRm9ybTo6R2V0SGlnaGxpZ2h0Q29sb3IoaW50IG5GaWVsZFR5cGUpIHsKLSAgaWYgKG5GaWVsZFR5cGUgPCAwIHx8IG5GaWVsZFR5cGUgPiBrTnVtRmllbGRUeXBlcykKK0ZYX0NPTE9SUkVGIENQREZTREtfSW50ZXJGb3JtOjpHZXRIaWdobGlnaHRDb2xvcihGb3JtRmllbGRUeXBlIGZpZWxkVHlwZSkgeworICBpZiAoZmllbGRUeXBlID09IEZvcm1GaWVsZFR5cGU6OmtVbmtub3duKQogICAgIHJldHVybiBGWFNZU19SR0IoMjU1LCAyNTUsIDI1NSk7Ci0gIGlmIChuRmllbGRUeXBlID09IDApCi0gICAgcmV0dXJuIG1fYUhpZ2hsaWdodENvbG9yWzBdOwotICByZXR1cm4gbV9hSGlnaGxpZ2h0Q29sb3JbbkZpZWxkVHlwZSAtIDFdOworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgLy8gRm9yIHRoZSBYRkEgZmllbGRzLCB3ZSBuZWVkIHRvIHJldHVybiB0aGUgc3BlY2lmaWMgZmllbGQgdHlwZSBoaWdobGlnaHQKKyAgLy8gY29sb3VyIG9yIHRoZSBnZW5lcmFsIFhGQSBmaWVsZCB0eXBlIGNvbG91ciBpZiBwcmVzZW50LgorICBpZiAoSXNGb3JtRmllbGRUeXBlWEZBKGZpZWxkVHlwZSkpIHsKKyAgICBpZiAoIW1fTmVlZHNIaWdobGlnaHRbc3RhdGljX2Nhc3Q8c2l6ZV90PihmaWVsZFR5cGUpXSAmJgorICAgICAgICBtX05lZWRzSGlnaGxpZ2h0W3N0YXRpY19jYXN0PHNpemVfdD4oRm9ybUZpZWxkVHlwZTo6a1hGQSldKSB7CisgICAgICByZXR1cm4gbV9IaWdobGlnaHRDb2xvcltzdGF0aWNfY2FzdDxzaXplX3Q+KEZvcm1GaWVsZFR5cGU6OmtYRkEpXTsKKyAgICB9CisgIH0KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgcmV0dXJuIG1fSGlnaGxpZ2h0Q29sb3Jbc3RhdGljX2Nhc3Q8c2l6ZV90PihmaWVsZFR5cGUpXTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvY3BkZnNka19pbnRlcmZvcm0uaCBiL2ZwZGZzZGsvY3BkZnNka19pbnRlcmZvcm0uaAppbmRleCAwMzIzOTljLi5lZTk2MGZmIDEwMDY0NAotLS0gYS9mcGRmc2RrL2NwZGZzZGtfaW50ZXJmb3JtLmgKKysrIGIvZnBkZnNkay9jcGRmc2RrX2ludGVyZm9ybS5oCkBAIC0xMyw3ICsxMyw3IEBACiAKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9hY3Rpb24uaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvaXBkZl9mb3Jtbm90aWZ5LmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCiAjaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX3dpZGdldC5oIgogCkBAIC0zNSwxMyArMzUsMTUgQEAKICAgfkNQREZTREtfSW50ZXJGb3JtKCkgb3ZlcnJpZGU7CiAKICAgQ1BERl9JbnRlckZvcm0qIEdldEludGVyRm9ybSgpIGNvbnN0IHsgcmV0dXJuIG1fcEludGVyRm9ybS5nZXQoKTsgfQotICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIEdldEZvcm1GaWxsRW52KCkgY29uc3QgeyByZXR1cm4gbV9wRm9ybUZpbGxFbnY7IH0KKyAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBHZXRGb3JtRmlsbEVudigpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9wRm9ybUZpbGxFbnYuR2V0KCk7CisgIH0KIAogICBib29sIEhpZ2hsaWdodFdpZGdldHMoKTsKIAogICBDUERGU0RLX1dpZGdldCogR2V0U2libGluZyhDUERGU0RLX1dpZGdldCogcFdpZGdldCwgYm9vbCBiTmV4dCkgY29uc3Q7CiAgIENQREZTREtfV2lkZ2V0KiBHZXRXaWRnZXQoQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wpIGNvbnN0OwotICB2b2lkIEdldFdpZGdldHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNGaWVsZE5hbWUsCisgIHZvaWQgR2V0V2lkZ2V0cyhjb25zdCBXaWRlU3RyaW5nJiBzRmllbGROYW1lLAogICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q1BERlNES19Bbm5vdDo6T2JzZXJ2ZWRQdHI+KiB3aWRnZXRzKSBjb25zdDsKICAgdm9pZCBHZXRXaWRnZXRzKENQREZfRm9ybUZpZWxkKiBwRmllbGQsCiAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0cj4qIHdpZGdldHMpIGNvbnN0OwpAQCAtNjMsMTQgKzY1LDEzIEBACiAgIHZvaWQgU3luY2hyb25pemVGaWVsZChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgYm9vbCBiU3luY2hyb25pemVFbHNlKTsKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotICBib29sIE9uS2V5U3Ryb2tlQ29tbWl0KENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc1ZhbHVlKTsKLSAgYm9vbCBPblZhbGlkYXRlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSk7CisgIGJvb2wgT25LZXlTdHJva2VDb21taXQoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIGNvbnN0IFdpZGVTdHJpbmcmIGNzVmFsdWUpOworICBib29sIE9uVmFsaWRhdGUoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIGNvbnN0IFdpZGVTdHJpbmcmIGNzVmFsdWUpOwogICB2b2lkIE9uQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gbnVsbHB0cik7Ci0gIENGWF9XaWRlU3RyaW5nIE9uRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBib29sJiBiRm9ybWF0dGVkKTsKKyAgV2lkZVN0cmluZyBPbkZvcm1hdChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgYm9vbCYgYkZvcm1hdHRlZCk7CiAKICAgdm9pZCBSZXNldEZpZWxkQXBwZWFyYW5jZShDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyogc1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcqIHNWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJWYWx1ZUNoYW5nZWQpOwogICB2b2lkIFVwZGF0ZUZpZWxkKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkKTsKIApAQCAtODIsMzEgKzgzLDMxIEBACiAgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gR2V0RmllbGRGcm9tT2JqZWN0cygKICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENQREZfT2JqZWN0Kj4mIG9iamVjdHMpIGNvbnN0OwogICBib29sIElzVmFsaWRGaWVsZChDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpOwotICBib29sIFN1Ym1pdEZpZWxkcyhjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NEZXN0aW5hdGlvbiwKKyAgYm9vbCBTdWJtaXRGaWVsZHMoY29uc3QgV2lkZVN0cmluZyYgY3NEZXN0aW5hdGlvbiwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiYgZmllbGRzLAogICAgICAgICAgICAgICAgICAgICBib29sIGJJbmNsdWRlT3JFeGNsdWRlLAogICAgICAgICAgICAgICAgICAgICBib29sIGJVcmxFbmNvZGVkKTsKLSAgYm9vbCBTdWJtaXRGb3JtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRGVzdGluYXRpb24sIGJvb2wgYlVybEVuY29kZWQpOwotICBib29sIEV4cG9ydEZvcm1Ub0ZERlRleHRCdWYoQ0ZYX0J5dGVUZXh0QnVmJiB0ZXh0QnVmKTsKLSAgYm9vbCBFeHBvcnRGaWVsZHNUb0ZERlRleHRCdWYoY29uc3Qgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiYgZmllbGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJbmNsdWRlT3JFeGNsdWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYmIHRleHRCdWYpOwotICBDRlhfV2lkZVN0cmluZyBHZXRUZW1wb3JhcnlGaWxlTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc0ZpbGVFeHQpOworICBib29sIFN1Ym1pdEZvcm0oY29uc3QgV2lkZVN0cmluZyYgc0Rlc3RpbmF0aW9uLCBib29sIGJVcmxFbmNvZGVkKTsKKyAgQnl0ZVN0cmluZyBFeHBvcnRGb3JtVG9GREZUZXh0QnVmKCk7CisgIEJ5dGVTdHJpbmcgRXhwb3J0RmllbGRzVG9GREZUZXh0QnVmKAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiYgZmllbGRzLAorICAgICAgYm9vbCBiSW5jbHVkZU9yRXhjbHVkZSk7CiAKLSAgYm9vbCBJc05lZWRIaWdoTGlnaHQoaW50IG5GaWVsZFR5cGUpOwotICB2b2lkIFJlbW92ZUFsbEhpZ2hMaWdodCgpOwotICB2b2lkIFNldEhpZ2hsaWdodEFscGhhKHVpbnQ4X3QgYWxwaGEpIHsgbV9pSGlnaGxpZ2h0QWxwaGEgPSBhbHBoYTsgfQotICB1aW50OF90IEdldEhpZ2hsaWdodEFscGhhKCkgeyByZXR1cm4gbV9pSGlnaGxpZ2h0QWxwaGE7IH0KLSAgdm9pZCBTZXRIaWdobGlnaHRDb2xvcihGWF9DT0xPUlJFRiBjbHIsIGludCBuRmllbGRUeXBlKTsKLSAgRlhfQ09MT1JSRUYgR2V0SGlnaGxpZ2h0Q29sb3IoaW50IG5GaWVsZFR5cGUpOworICBib29sIElzTmVlZEhpZ2hMaWdodChGb3JtRmllbGRUeXBlIGZpZWxkVHlwZSk7CisgIHZvaWQgUmVtb3ZlQWxsSGlnaExpZ2h0cygpOworICB2b2lkIFNldEhpZ2hsaWdodEFscGhhKHVpbnQ4X3QgYWxwaGEpIHsgbV9IaWdobGlnaHRBbHBoYSA9IGFscGhhOyB9CisgIHVpbnQ4X3QgR2V0SGlnaGxpZ2h0QWxwaGEoKSB7IHJldHVybiBtX0hpZ2hsaWdodEFscGhhOyB9CisgIHZvaWQgU2V0SGlnaGxpZ2h0Q29sb3IoRlhfQ09MT1JSRUYgY2xyLCBGb3JtRmllbGRUeXBlIGZpZWxkVHlwZSk7CisgIHZvaWQgU2V0QWxsSGlnaGxpZ2h0Q29sb3JzKEZYX0NPTE9SUkVGIGNscik7CisgIEZYX0NPTE9SUkVGIEdldEhpZ2hsaWdodENvbG9yKEZvcm1GaWVsZFR5cGUgZmllbGRUeXBlKTsKIAogIHByaXZhdGU6CiAgIC8vIElQREZfRm9ybU5vdGlmeToKICAgaW50IEJlZm9yZVZhbHVlQ2hhbmdlKENQREZfRm9ybUZpZWxkKiBwRmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NWYWx1ZSkgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBjc1ZhbHVlKSBvdmVycmlkZTsKICAgdm9pZCBBZnRlclZhbHVlQ2hhbmdlKENQREZfRm9ybUZpZWxkKiBwRmllbGQpIG92ZXJyaWRlOwogICBpbnQgQmVmb3JlU2VsZWN0aW9uQ2hhbmdlKENQREZfRm9ybUZpZWxkKiBwRmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzVmFsdWUpIG92ZXJyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIGNzVmFsdWUpIG92ZXJyaWRlOwogICB2b2lkIEFmdGVyU2VsZWN0aW9uQ2hhbmdlKENQREZfRm9ybUZpZWxkKiBwRmllbGQpIG92ZXJyaWRlOwogICB2b2lkIEFmdGVyQ2hlY2tlZFN0YXR1c0NoYW5nZShDUERGX0Zvcm1GaWVsZCogcEZpZWxkKSBvdmVycmlkZTsKICAgaW50IEJlZm9yZUZvcm1SZXNldChDUERGX0ludGVyRm9ybSogcEZvcm0pIG92ZXJyaWRlOwpAQCAtMTE0LDMwICsxMTUsMjYgQEAKICAgaW50IEJlZm9yZUZvcm1JbXBvcnREYXRhKENQREZfSW50ZXJGb3JtKiBwRm9ybSkgb3ZlcnJpZGU7CiAgIHZvaWQgQWZ0ZXJGb3JtSW1wb3J0RGF0YShDUERGX0ludGVyRm9ybSogcEZvcm0pIG92ZXJyaWRlOwogCi0gIGJvb2wgRkRGVG9VUkxFbmNvZGVkRGF0YShDRlhfV2lkZVN0cmluZyBjc0ZERkZpbGUsIENGWF9XaWRlU3RyaW5nIGNzVHh0RmlsZSk7Ci0gIGJvb2wgRkRGVG9VUkxFbmNvZGVkRGF0YSh1aW50OF90KiYgcEJ1ZiwgRlhfU1RSU0laRSYgbkJ1ZlNpemUpOworICBib29sIEZERlRvVVJMRW5jb2RlZERhdGEodWludDhfdComIHBCdWYsIHNpemVfdCYgbkJ1ZlNpemUpOwogICBpbnQgR2V0UGFnZUluZGV4QnlBbm5vdERpY3QoQ1BERl9Eb2N1bWVudCogcERvY3VtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0KSBjb25zdDsKIAogICB1c2luZyBDUERGU0RLX1dpZGdldE1hcCA9IHN0ZDo6bWFwPENQREZfRm9ybUNvbnRyb2wqLCBDUERGU0RLX1dpZGdldCo+OwogCi0gIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogbV9wRm9ybUZpbGxFbnY7ICAvLyBOb3Qgb3duZWQuCisgIFVub3duZWRQdHI8Q1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50PiBtX3BGb3JtRmlsbEVudjsKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfSW50ZXJGb3JtPiBtX3BJbnRlckZvcm07CiAgIENQREZTREtfV2lkZ2V0TWFwIG1fTWFwOwogI2lmZGVmIFBERl9FTkFCTEVfWEZBCiAgIHN0ZDo6bWFwPENYRkFfRkZXaWRnZXQqLCBDUERGU0RLX1hGQVdpZGdldCo+IG1fWEZBTWFwOwogICBib29sIG1fYlhmYUNhbGN1bGF0ZTsKICAgYm9vbCBtX2JYZmFWYWxpZGF0aW9uc0VuYWJsZWQ7Ci0gIHN0YXRpYyBjb25zdCBpbnQga051bUZpZWxkVHlwZXMgPSA3OwotI2Vsc2UgICAvLyBQREZfRU5BQkxFX1hGQQotICBzdGF0aWMgY29uc3QgaW50IGtOdW1GaWVsZFR5cGVzID0gNjsKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKICAgYm9vbCBtX2JDYWxjdWxhdGU7CiAgIGJvb2wgbV9iQnVzeTsKIAotICBGWF9DT0xPUlJFRiBtX2FIaWdobGlnaHRDb2xvcltrTnVtRmllbGRUeXBlc107Ci0gIHVpbnQ4X3QgbV9pSGlnaGxpZ2h0QWxwaGE7Ci0gIGJvb2wgbV9iTmVlZEhpZ2h0bGlnaHRba051bUZpZWxkVHlwZXNdOworICB1aW50OF90IG1fSGlnaGxpZ2h0QWxwaGE7CisgIEZYX0NPTE9SUkVGIG1fSGlnaGxpZ2h0Q29sb3Jba0Zvcm1GaWVsZFR5cGVDb3VudF07CisgIGJvb2wgbV9OZWVkc0hpZ2hsaWdodFtrRm9ybUZpZWxkVHlwZUNvdW50XTsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19DUERGU0RLX0lOVEVSRk9STV9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9jcGRmc2RrX3BhZ2V2aWV3LmNwcCBiL2ZwZGZzZGsvY3BkZnNka19wYWdldmlldy5jcHAKaW5kZXggYzY3OTQ4ZC4uYzFiNTIyMSAxMDA2NDQKLS0tIGEvZnBkZnNkay9jcGRmc2RrX3BhZ2V2aWV3LmNwcAorKysgYi9mcGRmc2RrL2NwZGZzZGtfcGFnZXZpZXcuY3BwCkBAIC0xMyw4ICsxMyw4IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3JlbmRlcm9wdGlvbnMuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9hbm5vdGxpc3QuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9pbnRlcmZvcm0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2F1dG9yZXN0b3Jlci5oIgogI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19hbm5vdC5oIgotI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19hbm5vdGhhbmRsZXJtZ3IuaCIKICNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfYW5ub3RpdGVyYXRpb24uaCIKICNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfZm9ybWZpbGxlbnZpcm9ubWVudC5oIgogI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19pbnRlcmZvcm0uaCIKQEAgLTIyLDExICsyMiwxMSBAQAogCiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKICNpbmNsdWRlICJmcGRmc2RrL2ZwZGZ4ZmEvY3BkZnhmYV9wYWdlLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jdmlldy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZnBhZ2V2aWV3LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0aGFuZGxlci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9yZW5kZXJjb250ZXh0LmgiCi0jaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY2Z4X2dyYXBoaWNzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRvY3ZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0aGFuZGxlci5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfcmVuZGVyY29udGV4dC5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ3JhcGhpY3MuaCIKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAogQ1BERlNES19QYWdlVmlldzo6Q1BERlNES19QYWdlVmlldyhDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKQEAgLTM2LDIzICszNiwxNyBAQAogI2lmbmRlZiBQREZfRU5BQkxFX1hGQQogICAgICAgbV9iT3duc1BhZ2UoZmFsc2UpLAogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQotICAgICAgbV9iRW50ZXJXaWRnZXQoZmFsc2UpLAotICAgICAgbV9iRXhpdFdpZGdldChmYWxzZSksCiAgICAgICBtX2JPbldpZGdldChmYWxzZSksCiAgICAgICBtX2JWYWxpZChmYWxzZSksCiAgICAgICBtX2JMb2NrZWQoZmFsc2UpLAogICAgICAgbV9iQmVpbmdEZXN0cm95ZWQoZmFsc2UpIHsKICAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBwRm9ybUZpbGxFbnYtPkdldEludGVyRm9ybSgpOwotICBpZiAocEludGVyRm9ybSkgewotICAgIENQREZfSW50ZXJGb3JtKiBwUERGSW50ZXJGb3JtID0gcEludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7CisgIENQREZfSW50ZXJGb3JtKiBwUERGSW50ZXJGb3JtID0gcEludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7CiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKLSAgICBpZiAocGFnZS0+R2V0UERGUGFnZSgpKQotICAgICAgcFBERkludGVyRm9ybS0+Rml4UGFnZUZpZWxkcyhwYWdlLT5HZXRQREZQYWdlKCkpOworICBpZiAocGFnZS0+R2V0UERGUGFnZSgpKQorICAgIHBQREZJbnRlckZvcm0tPkZpeFBhZ2VGaWVsZHMocGFnZS0+R2V0UERGUGFnZSgpKTsKICNlbHNlICAgLy8gUERGX0VOQUJMRV9YRkEKLSAgICBwUERGSW50ZXJGb3JtLT5GaXhQYWdlRmllbGRzKHBhZ2UpOwotI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQotICB9Ci0jaWZuZGVmIFBERl9FTkFCTEVfWEZBCisgIHBQREZJbnRlckZvcm0tPkZpeFBhZ2VGaWVsZHMocGFnZSk7CiAgIG1fcGFnZS0+U2V0Vmlldyh0aGlzKTsKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIH0KQEAgLTk0LDIwICs4OCwxOCBAQAogICBpZiAoIXBQYWdlKQogICAgIHJldHVybjsKIAotICBpZiAocFBhZ2UtPkdldENvbnRleHQoKS0+R2V0RG9jVHlwZSgpID09IERPQ1RZUEVfRFlOQU1JQ19YRkEpIHsKLSAgICBDRlhfR3JhcGhpY3MgZ3MocERldmljZSk7Ci0gICAgQ0ZYX1JlY3RGIHJlY3RDbGlwKHN0YXRpY19jYXN0PEZYX0ZMT0FUPihwQ2xpcC5sZWZ0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHBDbGlwLnRvcCksCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihwQ2xpcC5XaWR0aCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHBDbGlwLkhlaWdodCgpKSk7CisgIGlmIChwUGFnZS0+R2V0Q29udGV4dCgpLT5HZXRGb3JtVHlwZSgpID09IEZvcm1UeXBlOjprWEZBRnVsbCkgeworICAgIENGWF9SZWN0RiByZWN0Q2xpcCgKKyAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBDbGlwLmxlZnQpLCBzdGF0aWNfY2FzdDxmbG9hdD4ocENsaXAudG9wKSwKKyAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBDbGlwLldpZHRoKCkpLCBzdGF0aWNfY2FzdDxmbG9hdD4ocENsaXAuSGVpZ2h0KCkpKTsKKworICAgIENYRkFfR3JhcGhpY3MgZ3MocERldmljZSk7CiAgICAgZ3MuU2V0Q2xpcFJlY3QocmVjdENsaXApOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX1JlbmRlckNvbnRleHQ+IHBSZW5kZXJDb250ZXh0KG5ldyBDWEZBX1JlbmRlckNvbnRleHQpOwotICAgIENYRkFfUmVuZGVyT3B0aW9ucyByZW5kZXJPcHRpb25zOwotICAgIHJlbmRlck9wdGlvbnMubV9iSGlnaGxpZ2h0ID0gdHJ1ZTsKKwogICAgIENYRkFfRkZQYWdlVmlldyogeGZhVmlldyA9IHBQYWdlLT5HZXRYRkFQYWdlVmlldygpOwotICAgIHBSZW5kZXJDb250ZXh0LT5TdGFydFJlbmRlcih4ZmFWaWV3LCAmZ3MsICpwVXNlcjJEZXZpY2UsIHJlbmRlck9wdGlvbnMpOwotICAgIHBSZW5kZXJDb250ZXh0LT5Eb1JlbmRlcigpOwotICAgIHBSZW5kZXJDb250ZXh0LT5TdG9wUmVuZGVyKCk7CisgICAgQ1hGQV9SZW5kZXJDb250ZXh0IHJlbmRlckNvbnRleHQoeGZhVmlldywgcmVjdENsaXAsICpwVXNlcjJEZXZpY2UpOworICAgIHJlbmRlckNvbnRleHQuRG9SZW5kZXIoJmdzKTsKKwogICAgIENYRkFfRkZEb2NWaWV3KiBkb2NWaWV3ID0geGZhVmlldy0+R2V0RG9jVmlldygpOwogICAgIGlmICghZG9jVmlldykKICAgICAgIHJldHVybjsKQEAgLTExNiw3ICsxMDgsNyBAQAogICAgICAgcmV0dXJuOwogICAgIC8vIFJlbmRlciB0aGUgZm9jdXMgd2lkZ2V0CiAgICAgZG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpLT5SZW5kZXJXaWRnZXQoYW5ub3QtPkdldFhGQVdpZGdldCgpLCAmZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVzZXIyRGV2aWNlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBVc2VyMkRldmljZSwgZmFsc2UpOwogICAgIHJldHVybjsKICAgfQogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQpAQCAtMTI1LDcgKzExNyw4IEBACiAgIENQREZTREtfQW5ub3RJdGVyYXRpb24gYW5ub3RJdGVyYXRpb24odGhpcywgdHJ1ZSk7CiAgIGZvciAoY29uc3QgYXV0byYgcFNES0Fubm90IDogYW5ub3RJdGVyYXRpb24pIHsKICAgICBtX3BGb3JtRmlsbEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCktPkFubm90X09uRHJhdygKLSAgICAgICAgdGhpcywgcFNES0Fubm90LkdldCgpLCBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHBPcHRpb25zLT5tX2JEcmF3QW5ub3RzKTsKKyAgICAgICAgdGhpcywgcFNES0Fubm90LkdldCgpLCBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsCisgICAgICAgIHBPcHRpb25zLT5HZXREcmF3QW5ub3RzKCkpOwogICB9CiB9CiAKQEAgLTE4MSwxNiArMTc0LDIxIEBACiBib29sIENQREZTREtfUGFnZVZpZXc6OkRlbGV0ZUFubm90KENQREZTREtfQW5ub3QqIHBBbm5vdCkgewogICBpZiAoIXBBbm5vdCkKICAgICByZXR1cm4gZmFsc2U7CisKICAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IHBBbm5vdC0+R2V0UERGWEZBUGFnZSgpOwotICBpZiAoIXBQYWdlIHx8IChwUGFnZS0+R2V0Q29udGV4dCgpLT5HZXREb2NUeXBlKCkgIT0gRE9DVFlQRV9TVEFUSUNfWEZBICYmCi0gICAgICAgICAgICAgICAgIHBQYWdlLT5HZXRDb250ZXh0KCktPkdldERvY1R5cGUoKSAhPSBET0NUWVBFX0RZTkFNSUNfWEZBKSkKKyAgaWYgKCFwUGFnZSB8fCAhcFBhZ2UtPkdldENvbnRleHQoKS0+Q29udGFpbnNYRkFGb3JtKCkpCiAgICAgcmV0dXJuIGZhbHNlOwogCisgIENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyIHBPYnNlcnZlZChwQW5ub3QpOwogICBpZiAoR2V0Rm9jdXNBbm5vdCgpID09IHBBbm5vdCkKLSAgICBtX3BGb3JtRmlsbEVudi0+S2lsbEZvY3VzQW5ub3QoMCk7Ci0gIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyID0gbV9wRm9ybUZpbGxFbnYtPkdldEFubm90SGFuZGxlck1ncigpOwotICBpZiAocEFubm90SGFuZGxlcikKLSAgICBwQW5ub3RIYW5kbGVyLT5SZWxlYXNlQW5ub3QocEFubm90KTsKKyAgICBtX3BGb3JtRmlsbEVudi0+S2lsbEZvY3VzQW5ub3QoMCk7ICAvLyBNYXkgaW52b2tlIEpTLCBpbnZhbGlkYXRpbmcgcEFubm90LgorCisgIGlmIChwT2JzZXJ2ZWQpIHsKKyAgICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlciA9CisgICAgICAgIG1fcEZvcm1GaWxsRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKKyAgICBpZiAocEFubm90SGFuZGxlcikKKyAgICAgIHBBbm5vdEhhbmRsZXItPlJlbGVhc2VBbm5vdChwT2JzZXJ2ZWQuR2V0KCkpOworICB9CiAKICAgYXV0byBpdCA9IHN0ZDo6ZmluZChtX1NES0Fubm90QXJyYXkuYmVnaW4oKSwgbV9TREtBbm5vdEFycmF5LmVuZCgpLCBwQW5ub3QpOwogICBpZiAoaXQgIT0gbV9TREtBbm5vdEFycmF5LmVuZCgpKQpAQCAtMjA3LDcgKzIwNSw3IEBACiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKICAgICByZXR1cm4gbV9wYWdlLT5HZXRDb250ZXh0KCktPkdldFBERkRvYygpOwogI2Vsc2UgICAvLyBQREZfRU5BQkxFX1hGQQotICAgIHJldHVybiBtX3BhZ2UtPm1fcERvY3VtZW50OworICAgIHJldHVybiBtX3BhZ2UtPm1fcERvY3VtZW50LkdldCgpOwogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogICB9CiAgIHJldHVybiBudWxscHRyOwpAQCAtMjQyLDYgKzI0MCwzNSBAQAogfQogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCitXaWRlU3RyaW5nIENQREZTREtfUGFnZVZpZXc6OkdldFNlbGVjdGVkVGV4dCgpIHsKKyAgaWYgKENQREZTREtfQW5ub3QqIHBBbm5vdCA9IEdldEZvY3VzQW5ub3QoKSkgeworICAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyTWdyID0KKyAgICAgICAgbV9wRm9ybUZpbGxFbnYtPkdldEFubm90SGFuZGxlck1ncigpOworICAgIHJldHVybiBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9HZXRTZWxlY3RlZFRleHQocEFubm90KTsKKyAgfQorCisgIHJldHVybiBXaWRlU3RyaW5nKCk7Cit9CisKK3ZvaWQgQ1BERlNES19QYWdlVmlldzo6UmVwbGFjZVNlbGVjdGlvbihjb25zdCBXaWRlU3RyaW5nJiB0ZXh0KSB7CisgIGlmIChDUERGU0RLX0Fubm90KiBwQW5ub3QgPSBHZXRGb2N1c0Fubm90KCkpIHsKKyAgICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9CisgICAgICAgIG1fcEZvcm1GaWxsRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKKyAgICBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9SZXBsYWNlU2VsZWN0aW9uKHBBbm5vdCwgdGV4dCk7CisgIH0KK30KKworYm9vbCBDUERGU0RLX1BhZ2VWaWV3OjpPbkZvY3VzKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgeworICBDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciBwQW5ub3QoR2V0RlhXaWRnZXRBdFBvaW50KHBvaW50KSk7CisgIGlmICghcEFubm90KSB7CisgICAgbV9wRm9ybUZpbGxFbnYtPktpbGxGb2N1c0Fubm90KG5GbGFnKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBtX3BGb3JtRmlsbEVudi0+U2V0Rm9jdXNBbm5vdCgmcEFubm90KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKIGJvb2wgQ1BERlNES19QYWdlVmlldzo6T25MQnV0dG9uRG93bihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIHsKICAgQ1BERlNES19Bbm5vdDo6T2JzZXJ2ZWRQdHIgcEFubm90KEdldEZYV2lkZ2V0QXRQb2ludChwb2ludCkpOwogICBpZiAoIXBBbm5vdCkgewpAQCAtMzExLDM0ICszMzgsNDggQEAKICAgQ1BERlNES19Bbm5vdEhhbmRsZXJNZ3IqIHBBbm5vdEhhbmRsZXJNZ3IgPQogICAgICAgbV9wRm9ybUZpbGxFbnYtPkdldEFubm90SGFuZGxlck1ncigpOwogICBDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciBwRlhBbm5vdChHZXRGWEFubm90QXRQb2ludChwb2ludCkpOworCisgIGlmIChtX2JPbldpZGdldCAmJiBtX3BDYXB0dXJlV2lkZ2V0ICE9IHBGWEFubm90KQorICAgIEV4aXRXaWRnZXQocEFubm90SGFuZGxlck1nciwgdHJ1ZSwgbkZsYWcpOworCiAgIGlmIChwRlhBbm5vdCkgewotICAgIGlmIChtX3BDYXB0dXJlV2lkZ2V0ICYmIG1fcENhcHR1cmVXaWRnZXQgIT0gcEZYQW5ub3QpIHsKLSAgICAgIG1fYkV4aXRXaWRnZXQgPSB0cnVlOwotICAgICAgbV9iRW50ZXJXaWRnZXQgPSBmYWxzZTsKLSAgICAgIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTW91c2VFeGl0KHRoaXMsICZtX3BDYXB0dXJlV2lkZ2V0LCBuRmxhZyk7CisgICAgaWYgKCFtX2JPbldpZGdldCkgeworICAgICAgRW50ZXJXaWRnZXQocEFubm90SGFuZGxlck1nciwgJnBGWEFubm90LCBuRmxhZyk7CisKKyAgICAgIC8vIEFubm90X09uTW91c2VFbnRlciBtYXkgaGF2ZSBpbnZhbGlkYXRlZCBwRlhBbm5vdC4KKyAgICAgIGlmICghcEZYQW5ub3QpIHsKKyAgICAgICAgRXhpdFdpZGdldChwQW5ub3RIYW5kbGVyTWdyLCBmYWxzZSwgbkZsYWcpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KICAgICB9Ci0gICAgbV9wQ2FwdHVyZVdpZGdldC5SZXNldChwRlhBbm5vdC5HZXQoKSk7Ci0gICAgbV9iT25XaWRnZXQgPSB0cnVlOwotICAgIGlmICghbV9iRW50ZXJXaWRnZXQpIHsKLSAgICAgIG1fYkVudGVyV2lkZ2V0ID0gdHJ1ZTsKLSAgICAgIG1fYkV4aXRXaWRnZXQgPSBmYWxzZTsKLSAgICAgIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTW91c2VFbnRlcih0aGlzLCAmcEZYQW5ub3QsIG5GbGFnKTsKLSAgICB9CisKICAgICBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9Pbk1vdXNlTW92ZSh0aGlzLCAmcEZYQW5ub3QsIG5GbGFnLCBwb2ludCk7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KLSAgaWYgKG1fYk9uV2lkZ2V0KSB7Ci0gICAgbV9iT25XaWRnZXQgPSBmYWxzZTsKLSAgICBtX2JFeGl0V2lkZ2V0ID0gdHJ1ZTsKLSAgICBtX2JFbnRlcldpZGdldCA9IGZhbHNlOwotICAgIGlmIChtX3BDYXB0dXJlV2lkZ2V0KSB7Ci0gICAgICBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9Pbk1vdXNlRXhpdCh0aGlzLCAmbV9wQ2FwdHVyZVdpZGdldCwgbkZsYWcpOwotICAgICAgbV9wQ2FwdHVyZVdpZGdldC5SZXNldCgpOwotICAgIH0KLSAgfQorCiAgIHJldHVybiBmYWxzZTsKIH0KIAordm9pZCBDUERGU0RLX1BhZ2VWaWV3OjpFbnRlcldpZGdldChDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdDo6T2JzZXJ2ZWRQdHIqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWcpIHsKKyAgbV9iT25XaWRnZXQgPSB0cnVlOworICBtX3BDYXB0dXJlV2lkZ2V0LlJlc2V0KHBBbm5vdC0+R2V0KCkpOworICBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9Pbk1vdXNlRW50ZXIodGhpcywgcEFubm90LCBuRmxhZyk7Cit9CisKK3ZvaWQgQ1BERlNES19QYWdlVmlldzo6RXhpdFdpZGdldChDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNhbGxFeGl0Q2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWcpIHsKKyAgbV9iT25XaWRnZXQgPSBmYWxzZTsKKyAgaWYgKG1fcENhcHR1cmVXaWRnZXQpIHsKKyAgICBpZiAoY2FsbEV4aXRDYWxsYmFjaykKKyAgICAgIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTW91c2VFeGl0KHRoaXMsICZtX3BDYXB0dXJlV2lkZ2V0LCBuRmxhZyk7CisKKyAgICBtX3BDYXB0dXJlV2lkZ2V0LlJlc2V0KCk7CisgIH0KK30KKwogYm9vbCBDUERGU0RLX1BhZ2VWaWV3OjpPbk1vdXNlV2hlZWwoZG91YmxlIGRlbHRhWCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkZWx0YVksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwKQEAgLTM0OSw4ICszOTAsOCBAQAogCiAgIENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyTWdyID0KICAgICAgIG1fcEZvcm1GaWxsRW52LT5HZXRBbm5vdEhhbmRsZXJNZ3IoKTsKLSAgcmV0dXJuIHBBbm5vdEhhbmRsZXJNZ3ItPkFubm90X09uTW91c2VXaGVlbCh0aGlzLCAmcEFubm90LCBuRmxhZywgKGludClkZWx0YVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQpOworICByZXR1cm4gcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25Nb3VzZVdoZWVsKHRoaXMsICZwQW5ub3QsIG5GbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oZGVsdGFZKSwgcG9pbnQpOwogfQogCiBib29sIENQREZTREtfUGFnZVZpZXc6Ok9uQ2hhcihpbnQgbkNoYXIsIHVpbnQzMl90IG5GbGFnKSB7CkBAIC0zODAsMjIgKzQyMSwyMiBAQAogICBDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciA9CiAgICAgICBtX3BGb3JtRmlsbEVudi0+R2V0QW5ub3RIYW5kbGVyTWdyKCk7CiAKLSAgU2V0TG9jayh0cnVlKTsKKyAgQXV0b1Jlc3RvcmVyPGJvb2w+IGxvY2soJm1fYkxvY2tlZCk7CisgIG1fYkxvY2tlZCA9IHRydWU7CiAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQotICBDRlhfUmV0YWluUHRyPENQREZYRkFfUGFnZT4gcHJvdGVjdG9yKG1fcGFnZSk7Ci0gIGlmIChtX3BGb3JtRmlsbEVudi0+R2V0WEZBQ29udGV4dCgpLT5HZXREb2NUeXBlKCkgPT0gRE9DVFlQRV9EWU5BTUlDX1hGQSkgeworICBSZXRhaW5QdHI8Q1BERlhGQV9QYWdlPiBwcm90ZWN0b3IobV9wYWdlKTsKKyAgaWYgKG1fcEZvcm1GaWxsRW52LT5HZXRYRkFDb250ZXh0KCktPkdldEZvcm1UeXBlKCkgPT0gRm9ybVR5cGU6OmtYRkFGdWxsKSB7CiAgICAgQ1hGQV9GRlBhZ2VWaWV3KiBwYWdlVmlldyA9IG1fcGFnZS0+R2V0WEZBUGFnZVZpZXcoKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8SVhGQV9XaWRnZXRJdGVyYXRvcj4gcFdpZGdldEhhbmRlcigKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SVhGQV9XaWRnZXRJdGVyYXRvcj4gcFdpZGdldEhhbmRsZXIoCiAgICAgICAgIHBhZ2VWaWV3LT5DcmVhdGVXaWRnZXRJdGVyYXRvcigKICAgICAgICAgICAgIFhGQV9UUkFWRVJTRVdBWV9Gb3JtLAogICAgICAgICAgICAgWEZBX1dpZGdldFN0YXR1c19WaXNpYmxlIHwgWEZBX1dpZGdldFN0YXR1c19WaWV3YWJsZSkpOwotICAgIGlmICghcFdpZGdldEhhbmRlcikgewotICAgICAgU2V0TG9jayhmYWxzZSk7CisgICAgaWYgKCFwV2lkZ2V0SGFuZGxlcikgewogICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIHdoaWxlIChDWEZBX0ZGV2lkZ2V0KiBwWEZBQW5ub3QgPSBwV2lkZ2V0SGFuZGVyLT5Nb3ZlVG9OZXh0KCkpIHsKKyAgICB3aGlsZSAoQ1hGQV9GRldpZGdldCogcFhGQUFubm90ID0gcFdpZGdldEhhbmRsZXItPk1vdmVUb05leHQoKSkgewogICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90ID0gcEFubm90SGFuZGxlck1nci0+TmV3QW5ub3QocFhGQUFubm90LCB0aGlzKTsKICAgICAgIGlmICghcEFubm90KQogICAgICAgICBjb250aW51ZTsKQEAgLTQwMyw3ICs0NDQsNiBAQAogICAgICAgcEFubm90SGFuZGxlck1nci0+QW5ub3RfT25Mb2FkKHBBbm5vdCk7CiAgICAgfQogCi0gICAgU2V0TG9jayhmYWxzZSk7CiAgICAgcmV0dXJuOwogICB9CiAjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCkBAIC00MjYsMTggKzQ2NiwxNiBAQAogICAgIG1fU0RLQW5ub3RBcnJheS5wdXNoX2JhY2socEFubm90KTsKICAgICBwQW5ub3RIYW5kbGVyTWdyLT5Bbm5vdF9PbkxvYWQocEFubm90KTsKICAgfQotCi0gIFNldExvY2soZmFsc2UpOwogfQogCiB2b2lkIENQREZTREtfUGFnZVZpZXc6OlVwZGF0ZVJlY3RzKGNvbnN0IHN0ZDo6dmVjdG9yPENGWF9GbG9hdFJlY3Q+JiByZWN0cykgewogICBmb3IgKGNvbnN0IGF1dG8mIHJjIDogcmVjdHMpCi0gICAgbV9wRm9ybUZpbGxFbnYtPkludmFsaWRhdGUobV9wYWdlLCByYy5Ub0Z4UmVjdCgpKTsKKyAgICBtX3BGb3JtRmlsbEVudi0+SW52YWxpZGF0ZShtX3BhZ2UsIHJjLkdldE91dGVyUmVjdCgpKTsKIH0KIAogdm9pZCBDUERGU0RLX1BhZ2VWaWV3OjpVcGRhdGVWaWV3KENQREZTREtfQW5ub3QqIHBBbm5vdCkgewogICBDRlhfRmxvYXRSZWN0IHJjV2luZG93ID0gcEFubm90LT5HZXRSZWN0KCk7Ci0gIG1fcEZvcm1GaWxsRW52LT5JbnZhbGlkYXRlKG1fcGFnZSwgcmNXaW5kb3cuVG9GeFJlY3QoKSk7CisgIG1fcEZvcm1GaWxsRW52LT5JbnZhbGlkYXRlKG1fcGFnZSwgcmNXaW5kb3cuR2V0T3V0ZXJSZWN0KCkpOwogfQogCiBpbnQgQ1BERlNES19QYWdlVmlldzo6R2V0UGFnZUluZGV4KCkgY29uc3QgewpAQCAtNDQ1LDIxICs0ODMsMTggQEAKICAgICByZXR1cm4gLTE7CiAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQotICBpbnQgbkRvY1R5cGUgPSBtX3BhZ2UtPkdldENvbnRleHQoKS0+R2V0RG9jVHlwZSgpOwotICBzd2l0Y2ggKG5Eb2NUeXBlKSB7Ci0gICAgY2FzZSBET0NUWVBFX0RZTkFNSUNfWEZBOiB7CisgIHN3aXRjaCAobV9wYWdlLT5HZXRDb250ZXh0KCktPkdldEZvcm1UeXBlKCkpIHsKKyAgICBjYXNlIEZvcm1UeXBlOjprWEZBRnVsbDogewogICAgICAgQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcgPSBtX3BhZ2UtPkdldFhGQVBhZ2VWaWV3KCk7CiAgICAgICByZXR1cm4gcFBhZ2VWaWV3ID8gcFBhZ2VWaWV3LT5HZXRQYWdlSW5kZXgoKSA6IC0xOwogICAgIH0KLSAgICBjYXNlIERPQ1RZUEVfU1RBVElDX1hGQToKLSAgICBjYXNlIERPQ1RZUEVfUERGOgotICAgICAgcmV0dXJuIEdldFBhZ2VJbmRleEZvclN0YXRpY1BERigpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gLTE7CisgICAgY2FzZSBGb3JtVHlwZTo6a05vbmU6CisgICAgY2FzZSBGb3JtVHlwZTo6a0Fjcm9Gb3JtOgorICAgIGNhc2UgRm9ybVR5cGU6OmtYRkFGb3JlZ3JvdW5kOgorICAgICAgYnJlYWs7CiAgIH0KLSNlbHNlICAgLy8gUERGX0VOQUJMRV9YRkEKLSAgcmV0dXJuIEdldFBhZ2VJbmRleEZvclN0YXRpY1BERigpOwogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICByZXR1cm4gR2V0UGFnZUluZGV4Rm9yU3RhdGljUERGKCk7CiB9CiAKIGJvb2wgQ1BERlNES19QYWdlVmlldzo6SXNWYWxpZEFubm90KGNvbnN0IENQREZfQW5ub3QqIHApIGNvbnN0IHsKQEAgLTQ4Niw3ICs1MjEsNyBAQAogfQogCiBpbnQgQ1BERlNES19QYWdlVmlldzo6R2V0UGFnZUluZGV4Rm9yU3RhdGljUERGKCkgY29uc3QgewotICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gR2V0UERGUGFnZSgpLT5tX3BGb3JtRGljdDsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IEdldFBERlBhZ2UoKS0+bV9wRm9ybURpY3QuR2V0KCk7CiAgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBtX3BGb3JtRmlsbEVudi0+R2V0UERGRG9jdW1lbnQoKTsKICAgcmV0dXJuIChwRG9jICYmIHBEaWN0KSA/IHBEb2MtPkdldFBhZ2VJbmRleChwRGljdC0+R2V0T2JqTnVtKCkpIDogLTE7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2NwZGZzZGtfcGFnZXZpZXcuaCBiL2ZwZGZzZGsvY3BkZnNka19wYWdldmlldy5oCmluZGV4IGJjZDUxNzcuLjAzZjNhYjYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvY3BkZnNka19wYWdldmlldy5oCisrKyBiL2ZwZGZzZGsvY3BkZnNka19wYWdldmlldy5oCkBAIC0xMiw3ICsxMiw5IEBACiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2UuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKICNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfYW5ub3QuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfYW5ub3RoYW5kbGVybWdyLmgiCiAKIGNsYXNzIENGWF9SZW5kZXJEZXZpY2U7CiBjbGFzcyBDUERGX0Fubm90TGlzdDsKQEAgLTU1LDcgKzU3LDE0IEBACiAKICAgQ1BERl9QYWdlKiBHZXRQREZQYWdlKCkgY29uc3Q7CiAgIENQREZfRG9jdW1lbnQqIEdldFBERkRvY3VtZW50KCk7Ci0gIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogR2V0Rm9ybUZpbGxFbnYoKSBjb25zdCB7IHJldHVybiBtX3BGb3JtRmlsbEVudjsgfQorICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIEdldEZvcm1GaWxsRW52KCkgY29uc3QgeworICAgIHJldHVybiBtX3BGb3JtRmlsbEVudi5HZXQoKTsKKyAgfQorCisgIFdpZGVTdHJpbmcgR2V0U2VsZWN0ZWRUZXh0KCk7CisgIHZvaWQgUmVwbGFjZVNlbGVjdGlvbihjb25zdCBXaWRlU3RyaW5nJiB0ZXh0KTsKKworICBib29sIE9uRm9jdXMoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKTsKICAgYm9vbCBPbkxCdXR0b25Eb3duKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZyk7CiAgIGJvb2wgT25MQnV0dG9uVXAoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKTsKICNpZmRlZiBQREZfRU5BQkxFX1hGQQpAQCAtODEsNyArOTAsNiBAQAogICB2b2lkIFNldFZhbGlkKGJvb2wgYlZhbGlkKSB7IG1fYlZhbGlkID0gYlZhbGlkOyB9CiAgIGJvb2wgSXNWYWxpZCgpIHsgcmV0dXJuIG1fYlZhbGlkOyB9CiAKLSAgdm9pZCBTZXRMb2NrKGJvb2wgYkxvY2tlZCkgeyBtX2JMb2NrZWQgPSBiTG9ja2VkOyB9CiAgIGJvb2wgSXNMb2NrZWQoKSB7IHJldHVybiBtX2JMb2NrZWQ7IH0KIAogICB2b2lkIFNldEJlaW5nRGVzdHJveWVkKCkgeyBtX2JCZWluZ0Rlc3Ryb3llZCA9IHRydWU7IH0KQEAgLTk4LDE3ICsxMDYsMjIgQEAKIAogICBpbnQgR2V0UGFnZUluZGV4Rm9yU3RhdGljUERGKCkgY29uc3Q7CiAKKyAgdm9pZCBFbnRlcldpZGdldChDUERGU0RLX0Fubm90SGFuZGxlck1nciogcEFubm90SGFuZGxlck1nciwKKyAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciogcEFubm90LAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFnKTsKKyAgdm9pZCBFeGl0V2lkZ2V0KENQREZTREtfQW5ub3RIYW5kbGVyTWdyKiBwQW5ub3RIYW5kbGVyTWdyLAorICAgICAgICAgICAgICAgICAgYm9vbCBjYWxsRXhpdENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWcpOworCiAgIENGWF9NYXRyaXggbV9jdXJNYXRyaXg7CiAgIFVuZGVybHlpbmdQYWdlVHlwZSogY29uc3QgbV9wYWdlOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Bbm5vdExpc3Q+IG1fcEFubm90TGlzdDsKICAgc3RkOjp2ZWN0b3I8Q1BERlNES19Bbm5vdCo+IG1fU0RLQW5ub3RBcnJheTsKLSAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBjb25zdCBtX3BGb3JtRmlsbEVudjsgIC8vIE5vdCBvd25lZC4KKyAgVW5vd25lZFB0cjxDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ+IGNvbnN0IG1fcEZvcm1GaWxsRW52OwogICBDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciBtX3BDYXB0dXJlV2lkZ2V0OwogI2lmbmRlZiBQREZfRU5BQkxFX1hGQQogICBib29sIG1fYk93bnNQYWdlOwogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQotICBib29sIG1fYkVudGVyV2lkZ2V0OwotICBib29sIG1fYkV4aXRXaWRnZXQ7CiAgIGJvb2wgbV9iT25XaWRnZXQ7CiAgIGJvb2wgbV9iVmFsaWQ7CiAgIGJvb2wgbV9iTG9ja2VkOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9jcGRmc2RrX3dpZGdldC5jcHAgYi9mcGRmc2RrL2NwZGZzZGtfd2lkZ2V0LmNwcAppbmRleCBjZDg2ZjdhLi4yYWRjNDZmIDEwMDY0NAotLS0gYS9mcGRmc2RrL2NwZGZzZGtfd2lkZ2V0LmNwcAorKysgYi9mcGRmc2RrL2NwZGZzZGtfd2lkZ2V0LmNwcApAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfd2lkZ2V0LmgiCiAKICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3N0cmVhbT4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgiCkBAIC0yOCwxNyArMjksMTcgQEAKICNpbmNsdWRlICJmcGRmc2RrL2Zvcm1maWxsZXIvY2JhX2ZvbnRtYXAuaCIKICNpbmNsdWRlICJmcGRmc2RrL2ZzZGtfYWN0aW9uaGFuZGxlci5oIgogI2luY2x1ZGUgImZwZGZzZGsvZnNka19kZWZpbmUuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2Z4ZWRpdC9meGV0X2VkaXQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfRWRpdC5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9VdGlscy5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfYXBwc3RyZWFtLmgiCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF9lZGl0LmgiCiAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQogI2luY2x1ZGUgImZwZGZzZGsvZnBkZnhmYS9jcGRmeGZhX2NvbnRleHQuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9meGZhX3dpZGdldC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmRvY3ZpZXcuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZ3aWRnZXQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZ3aWRnZXRoYW5kbGVyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRvY3ZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZndpZGdldGhhbmRsZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX3dpZGdldGFjYy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAogbmFtZXNwYWNlIHsKQEAgLTU3LDcgKzU4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSkKICAgICA6IENQREZTREtfQkFBbm5vdChwQW5ub3QsIHBQYWdlVmlldyksCiAgICAgICBtX3BJbnRlckZvcm0ocEludGVyRm9ybSksCi0gICAgICBtX25BcHBBZ2UoMCksCisgICAgICBtX25BcHBlYXJhbmNlQWdlKDApLAogICAgICAgbV9uVmFsdWVBZ2UoMCkKICNpZmRlZiBQREZfRU5BQkxFX1hGQQogICAgICAgLApAQCAtNzIsMTEgKzczLDExIEBACiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKIENYRkFfRkZXaWRnZXQqIENQREZTREtfV2lkZ2V0OjpHZXRNaXhYRkFXaWRnZXQoKSBjb25zdCB7CiAgIENQREZYRkFfQ29udGV4dCogcENvbnRleHQgPSBtX3BQYWdlVmlldy0+R2V0Rm9ybUZpbGxFbnYoKS0+R2V0WEZBQ29udGV4dCgpOwotICBpZiAocENvbnRleHQtPkdldERvY1R5cGUoKSA9PSBET0NUWVBFX1NUQVRJQ19YRkEpIHsKKyAgaWYgKHBDb250ZXh0LT5HZXRGb3JtVHlwZSgpID09IEZvcm1UeXBlOjprWEZBRm9yZWdyb3VuZCkgewogICAgIGlmICghbV9oTWl4WEZBV2lkZ2V0KSB7CiAgICAgICBpZiAoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gcENvbnRleHQtPkdldFhGQURvY1ZpZXcoKSkgewotICAgICAgICBDRlhfV2lkZVN0cmluZyBzTmFtZTsKLSAgICAgICAgaWYgKEdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTikgeworICAgICAgICBXaWRlU3RyaW5nIHNOYW1lOworICAgICAgICBpZiAoR2V0RmllbGRUeXBlKCkgPT0gRm9ybUZpZWxkVHlwZTo6a1JhZGlvQnV0dG9uKSB7CiAgICAgICAgICAgc05hbWUgPSBHZXRBbm5vdE5hbWUoKTsKICAgICAgICAgICBpZiAoc05hbWUuSXNFbXB0eSgpKQogICAgICAgICAgICAgc05hbWUgPSBHZXROYW1lKCk7CkBAIC04OCwzNiArODksMzUgQEAKICAgICAgICAgICBtX2hNaXhYRkFXaWRnZXQgPSBwRG9jVmlldy0+R2V0V2lkZ2V0QnlOYW1lKHNOYW1lLCBudWxscHRyKTsKICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIG1faE1peFhGQVdpZGdldDsKKyAgICByZXR1cm4gbV9oTWl4WEZBV2lkZ2V0LkdldCgpOwogICB9Ci0KICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKIENYRkFfRkZXaWRnZXQqIENQREZTREtfV2lkZ2V0OjpHZXRHcm91cE1peFhGQVdpZGdldCgpIHsKICAgQ1BERlhGQV9Db250ZXh0KiBwQ29udGV4dCA9IG1fcFBhZ2VWaWV3LT5HZXRGb3JtRmlsbEVudigpLT5HZXRYRkFDb250ZXh0KCk7Ci0gIGlmIChwQ29udGV4dC0+R2V0RG9jVHlwZSgpID09IERPQ1RZUEVfU1RBVElDX1hGQSkgewotICAgIGlmIChDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBwQ29udGV4dC0+R2V0WEZBRG9jVmlldygpKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyBzTmFtZSA9IEdldE5hbWUoKTsKLSAgICAgIGlmICghc05hbWUuSXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gcERvY1ZpZXctPkdldFdpZGdldEJ5TmFtZShzTmFtZSwgbnVsbHB0cik7Ci0gICAgfQotICB9CisgIGlmIChwQ29udGV4dC0+R2V0Rm9ybVR5cGUoKSAhPSBGb3JtVHlwZTo6a1hGQUZvcmVncm91bmQpCisgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgcmV0dXJuIG51bGxwdHI7CisgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IHBDb250ZXh0LT5HZXRYRkFEb2NWaWV3KCk7CisgIGlmICghcERvY1ZpZXcpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgV2lkZVN0cmluZyBzTmFtZSA9IEdldE5hbWUoKTsKKyAgcmV0dXJuICFzTmFtZS5Jc0VtcHR5KCkgPyBwRG9jVmlldy0+R2V0V2lkZ2V0QnlOYW1lKHNOYW1lLCBudWxscHRyKSA6IG51bGxwdHI7CiB9CiAKIENYRkFfRkZXaWRnZXRIYW5kbGVyKiBDUERGU0RLX1dpZGdldDo6R2V0WEZBV2lkZ2V0SGFuZGxlcigpIGNvbnN0IHsKICAgQ1BERlhGQV9Db250ZXh0KiBwQ29udGV4dCA9IG1fcFBhZ2VWaWV3LT5HZXRGb3JtRmlsbEVudigpLT5HZXRYRkFDb250ZXh0KCk7Ci0gIGlmIChwQ29udGV4dC0+R2V0RG9jVHlwZSgpID09IERPQ1RZUEVfU1RBVElDX1hGQSkgewotICAgIGlmICghbV9wV2lkZ2V0SGFuZGxlcikgewotICAgICAgaWYgKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IHBDb250ZXh0LT5HZXRYRkFEb2NWaWV3KCkpCi0gICAgICAgIG1fcFdpZGdldEhhbmRsZXIgPSBwRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpOwotICAgIH0KLSAgICByZXR1cm4gbV9wV2lkZ2V0SGFuZGxlcjsKLSAgfQorICBpZiAocENvbnRleHQtPkdldEZvcm1UeXBlKCkgIT0gRm9ybVR5cGU6OmtYRkFGb3JlZ3JvdW5kKQorICAgIHJldHVybiBudWxscHRyOwogCi0gIHJldHVybiBudWxscHRyOworICBpZiAoIW1fcFdpZGdldEhhbmRsZXIpIHsKKyAgICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBwQ29udGV4dC0+R2V0WEZBRG9jVmlldygpOworICAgIGlmIChwRG9jVmlldykKKyAgICAgIG1fcFdpZGdldEhhbmRsZXIgPSBwRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpOworICB9CisgIHJldHVybiBtX3BXaWRnZXRIYW5kbGVyLkdldCgpOwogfQogCiBzdGF0aWMgWEZBX0VWRU5UVFlQRSBHZXRYRkFFdmVudFR5cGUoUERGU0RLX1hGQUFBY3Rpb25UeXBlIGVYRkFBQVQpIHsKQEAgLTE2NSwxMSArMTY1LDggQEAKICAgICAgIGVFdmVudFR5cGUgPSBYRkFfRVZFTlRfRXhpdDsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpQYWdlT3BlbjoKLSAgICAgIGJyZWFrOwogICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpQYWdlQ2xvc2U6Ci0gICAgICBicmVhazsKICAgICBjYXNlIENQREZfQUFjdGlvbjo6UGFnZVZpc2libGU6Ci0gICAgICBicmVhazsKICAgICBjYXNlIENQREZfQUFjdGlvbjo6UGFnZUludmlzaWJsZToKICAgICAgIGJyZWFrOwogICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2U6CkBAIC0xODksNiArMTg2LDkgQEAKICAgICBjYXNlIENQREZfQUFjdGlvbjo6UHJpbnREb2N1bWVudDoKICAgICBjYXNlIENQREZfQUFjdGlvbjo6RG9jdW1lbnRQcmludGVkOgogICAgICAgYnJlYWs7CisgICAgY2FzZSBDUERGX0FBY3Rpb246Ok51bWJlck9mQWN0aW9uczoKKyAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgIGJyZWFrOwogICB9CiAKICAgcmV0dXJuIGVFdmVudFR5cGU7CkBAIC0yMDUsMTggKzIwNSwxOCBAQAogCiAgIFhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSA9IEdldFhGQUV2ZW50VHlwZShlWEZBQUFUKTsKIAotICBDWEZBX1dpZGdldEFjYyogcEFjYzsKICAgaWYgKChlRXZlbnRUeXBlID09IFhGQV9FVkVOVF9DbGljayB8fCBlRXZlbnRUeXBlID09IFhGQV9FVkVOVF9DaGFuZ2UpICYmCi0gICAgICBHZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUkFESU9CVVRUT04pIHsKKyAgICAgIEdldEZpZWxkVHlwZSgpID09IEZvcm1GaWVsZFR5cGU6OmtSYWRpb0J1dHRvbikgewogICAgIGlmIChDWEZBX0ZGV2lkZ2V0KiBoR3JvdXBXaWRnZXQgPSBHZXRHcm91cE1peFhGQVdpZGdldCgpKSB7Ci0gICAgICBwQWNjID0gaEdyb3VwV2lkZ2V0LT5HZXREYXRhQWNjKCk7Ci0gICAgICBpZiAocFhGQVdpZGdldEhhbmRsZXItPkhhc0V2ZW50KHBBY2MsIGVFdmVudFR5cGUpKQorICAgICAgaWYgKHBYRkFXaWRnZXRIYW5kbGVyLT5IYXNFdmVudChoR3JvdXBXaWRnZXQtPkdldE5vZGUoKS0+R2V0V2lkZ2V0QWNjKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVFdmVudFR5cGUpKSB7CiAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQogICAgIH0KICAgfQogCi0gIHBBY2MgPSBoV2lkZ2V0LT5HZXREYXRhQWNjKCk7Ci0gIHJldHVybiBwWEZBV2lkZ2V0SGFuZGxlci0+SGFzRXZlbnQocEFjYywgZUV2ZW50VHlwZSk7CisgIHJldHVybiBwWEZBV2lkZ2V0SGFuZGxlci0+SGFzRXZlbnQoaFdpZGdldC0+R2V0Tm9kZSgpLT5HZXRXaWRnZXRBY2MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlRXZlbnRUeXBlKTsKIH0KIAogYm9vbCBDUERGU0RLX1dpZGdldDo6T25YRkFBQWN0aW9uKFBERlNES19YRkFBQWN0aW9uVHlwZSBlWEZBQUFULApAQCAtMjUwLDE0ICsyNTAsMTQgQEAKICAgaWYgKGRhdGEublNlbEVuZCA+IGRhdGEublNlbFN0YXJ0KQogICAgIHBhcmFtLm1fd3NOZXdUZXh0LkRlbGV0ZShkYXRhLm5TZWxTdGFydCwgZGF0YS5uU2VsRW5kIC0gZGF0YS5uU2VsU3RhcnQpOwogCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5zQ2hhbmdlLkdldExlbmd0aCgpOyBpKyspCi0gICAgcGFyYW0ubV93c05ld1RleHQuSW5zZXJ0KGRhdGEublNlbFN0YXJ0LCBkYXRhLnNDaGFuZ2VbaV0pOwotICBwYXJhbS5tX3dzUHJldlRleHQgPSBkYXRhLnNWYWx1ZTsKKyAgZm9yIChjb25zdCBhdXRvJiBjIDogZGF0YS5zQ2hhbmdlKQorICAgIHBhcmFtLm1fd3NOZXdUZXh0Lkluc2VydChkYXRhLm5TZWxTdGFydCwgYyk7CiAKKyAgcGFyYW0ubV93c1ByZXZUZXh0ID0gZGF0YS5zVmFsdWU7CiAgIGlmICgoZUV2ZW50VHlwZSA9PSBYRkFfRVZFTlRfQ2xpY2sgfHwgZUV2ZW50VHlwZSA9PSBYRkFfRVZFTlRfQ2hhbmdlKSAmJgotICAgICAgR2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKSB7CisgICAgICBHZXRGaWVsZFR5cGUoKSA9PSBGb3JtRmllbGRUeXBlOjprUmFkaW9CdXR0b24pIHsKICAgICBpZiAoQ1hGQV9GRldpZGdldCogaEdyb3VwV2lkZ2V0ID0gR2V0R3JvdXBNaXhYRkFXaWRnZXQoKSkgewotICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBoR3JvdXBXaWRnZXQtPkdldERhdGFBY2MoKTsKKyAgICAgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gaEdyb3VwV2lkZ2V0LT5HZXROb2RlKCktPkdldFdpZGdldEFjYygpOwogICAgICAgcGFyYW0ubV9wVGFyZ2V0ID0gcEFjYzsKICAgICAgIGlmIChwWEZBV2lkZ2V0SGFuZGxlci0+UHJvY2Vzc0V2ZW50KHBBY2MsICZwYXJhbSkgIT0KICAgICAgICAgICBYRkFfRVZFTlRFUlJPUl9TdWNjZXNzKSB7CkBAIC0yNjUsNyArMjY1LDcgQEAKICAgICAgIH0KICAgICB9CiAgIH0KLSAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBoV2lkZ2V0LT5HZXREYXRhQWNjKCk7CisgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gaFdpZGdldC0+R2V0Tm9kZSgpLT5HZXRXaWRnZXRBY2MoKTsKICAgcGFyYW0ubV9wVGFyZ2V0ID0gcEFjYzsKICAgaW50MzJfdCBuUmV0ID0gcFhGQVdpZGdldEhhbmRsZXItPlByb2Nlc3NFdmVudChwQWNjLCAmcGFyYW0pOwogCkBAIC0yODAsNDggKzI4MCw1MiBAQAogICBpZiAoIWhXaWRnZXQpCiAgICAgcmV0dXJuOwogCi0gIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gaFdpZGdldC0+R2V0RGF0YUFjYygpOworICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IGhXaWRnZXQtPkdldE5vZGUoKS0+R2V0V2lkZ2V0QWNjKCk7CiAgIGlmICghcFdpZGdldEFjYykKICAgICByZXR1cm47CiAKICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKICAgc3dpdGNoIChHZXRGaWVsZFR5cGUoKSkgewotICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgotICAgIGNhc2UgRklFTERUWVBFX1JBRElPQlVUVE9OOiB7CisgICAgY2FzZSBGb3JtRmllbGRUeXBlOjprQ2hlY2tCb3g6CisgICAgY2FzZSBGb3JtRmllbGRUeXBlOjprUmFkaW9CdXR0b246IHsKICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7CiAgICAgICBYRkFfQ0hFQ0tTVEFURSBlQ2hlY2tTdGF0ZSA9CiAgICAgICAgICAgcEZvcm1DdHJsLT5Jc0NoZWNrZWQoKSA/IFhGQV9DSEVDS1NUQVRFX09uIDogWEZBX0NIRUNLU1RBVEVfT2ZmOwogICAgICAgcFdpZGdldEFjYy0+U2V0Q2hlY2tTdGF0ZShlQ2hlY2tTdGF0ZSwgdHJ1ZSk7CiAgICAgICBicmVhazsKICAgICB9Ci0gICAgY2FzZSBGSUVMRFRZUEVfVEVYVEZJRUxEOgotICAgICAgcFdpZGdldEFjYy0+U2V0VmFsdWUocEZvcm1GaWVsZC0+R2V0VmFsdWUoKSwgWEZBX1ZBTFVFUElDVFVSRV9FZGl0KTsKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtUZXh0RmllbGQ6CisgICAgICBwV2lkZ2V0QWNjLT5TZXRWYWx1ZShYRkFfVkFMVUVQSUNUVVJFX0VkaXQsIHBGb3JtRmllbGQtPkdldFZhbHVlKCkpOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGSUVMRFRZUEVfTElTVEJPWDogeworICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a0xpc3RCb3g6IHsKICAgICAgIHBXaWRnZXRBY2MtPkNsZWFyQWxsU2VsZWN0aW9ucygpOwogCiAgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKTsgaSA8IHN6OyBpKyspIHsKICAgICAgICAgaW50IG5JbmRleCA9IHBGb3JtRmllbGQtPkdldFNlbGVjdGVkSW5kZXgoaSk7Ci0gICAgICAgIGlmIChuSW5kZXggPiAtMSAmJiBuSW5kZXggPCBwV2lkZ2V0QWNjLT5Db3VudENob2ljZUxpc3RJdGVtcygpKQorICAgICAgICBpZiAobkluZGV4ID4gLTEgJiYgbkluZGV4IDwgcFdpZGdldEFjYy0+Q291bnRDaG9pY2VMaXN0SXRlbXMoZmFsc2UpKQogICAgICAgICAgIHBXaWRnZXRBY2MtPlNldEl0ZW1TdGF0ZShuSW5kZXgsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICB9CiAgICAgICBicmVhazsKICAgICB9Ci0gICAgY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6IHsKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtDb21ib0JveDogewogICAgICAgcFdpZGdldEFjYy0+Q2xlYXJBbGxTZWxlY3Rpb25zKCk7CiAKICAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpOyBpIDwgc3o7IGkrKykgewogICAgICAgICBpbnQgbkluZGV4ID0gcEZvcm1GaWVsZC0+R2V0U2VsZWN0ZWRJbmRleChpKTsKLSAgICAgICAgaWYgKG5JbmRleCA+IC0xICYmIG5JbmRleCA8IHBXaWRnZXRBY2MtPkNvdW50Q2hvaWNlTGlzdEl0ZW1zKCkpCisgICAgICAgIGlmIChuSW5kZXggPiAtMSAmJiBuSW5kZXggPCBwV2lkZ2V0QWNjLT5Db3VudENob2ljZUxpc3RJdGVtcyhmYWxzZSkpCiAgICAgICAgICAgcFdpZGdldEFjYy0+U2V0SXRlbVN0YXRlKG5JbmRleCwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKICAgICAgIH0KLSAgICAgIHBXaWRnZXRBY2MtPlNldFZhbHVlKHBGb3JtRmllbGQtPkdldFZhbHVlKCksIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCk7CisgICAgICBwV2lkZ2V0QWNjLT5TZXRWYWx1ZShYRkFfVkFMVUVQSUNUVVJFX0VkaXQsIHBGb3JtRmllbGQtPkdldFZhbHVlKCkpOwogICAgICAgYnJlYWs7CiAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKICAgfQogCi0gIGlmIChiU3luY2hyb25pemVFbHNlKQotICAgIHBXaWRnZXRBY2MtPlByb2Nlc3NWYWx1ZUNoYW5nZWQoKTsKKyAgaWYgKGJTeW5jaHJvbml6ZUVsc2UpIHsKKyAgICBDUERGWEZBX0NvbnRleHQqIGNvbnRleHQgPSBtX3BQYWdlVmlldy0+R2V0Rm9ybUZpbGxFbnYoKS0+R2V0WEZBQ29udGV4dCgpOworICAgIGNvbnRleHQtPkdldFhGQURvY1ZpZXcoKS0+UHJvY2Vzc1ZhbHVlQ2hhbmdlZChwV2lkZ2V0QWNjKTsKKyAgfQogfQogCiB2b2lkIENQREZTREtfV2lkZ2V0OjpTeW5jaHJvbml6ZVhGQVZhbHVlKCkgewpAQCAtMzU4LDM2ICszNjIsMzUgQEAKICAgQVNTRVJUKHBGb3JtQ29udHJvbCk7CiAKICAgc3dpdGNoIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSkgewotICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOiB7Ci0gICAgICBpZiAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBoV2lkZ2V0LT5HZXREYXRhQWNjKCkpIHsKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtDaGVja0JveDogeworICAgICAgaWYgKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gaFdpZGdldC0+R2V0Tm9kZSgpLT5HZXRXaWRnZXRBY2MoKSkgewogICAgICAgICBwRm9ybUZpZWxkLT5DaGVja0NvbnRyb2woCiAgICAgICAgICAgICBwRm9ybUZpZWxkLT5HZXRDb250cm9sSW5kZXgocEZvcm1Db250cm9sKSwKICAgICAgICAgICAgIHBXaWRnZXRBY2MtPkdldENoZWNrU3RhdGUoKSA9PSBYRkFfQ0hFQ0tTVEFURV9PbiwgdHJ1ZSk7CiAgICAgICB9CiAgICAgICBicmVhazsKICAgICB9Ci0gICAgY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046IHsKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtSYWRpb0J1dHRvbjogewogICAgICAgLy8gVE9ETyh3ZWlsaSk6IENoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBoYW5kbGUgY2hlY2tib3ggYW5kIHJhZGlvCiAgICAgICAvLyBidXR0b24gZGlmZmVyZW50bHksIG90aGVyd2lzZSwgbWVyZ2UgdGhlc2UgdHdvIGNhc2VzLgotICAgICAgaWYgKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gaFdpZGdldC0+R2V0RGF0YUFjYygpKSB7CisgICAgICBpZiAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBoV2lkZ2V0LT5HZXROb2RlKCktPkdldFdpZGdldEFjYygpKSB7CiAgICAgICAgIHBGb3JtRmllbGQtPkNoZWNrQ29udHJvbCgKICAgICAgICAgICAgIHBGb3JtRmllbGQtPkdldENvbnRyb2xJbmRleChwRm9ybUNvbnRyb2wpLAogICAgICAgICAgICAgcFdpZGdldEFjYy0+R2V0Q2hlY2tTdGF0ZSgpID09IFhGQV9DSEVDS1NUQVRFX09uLCB0cnVlKTsKICAgICAgIH0KICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBjYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6IHsKLSAgICAgIGlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IGhXaWRnZXQtPkdldERhdGFBY2MoKSkgewotICAgICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWU7Ci0gICAgICAgIHBXaWRnZXRBY2MtPkdldFZhbHVlKHNWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsKLSAgICAgICAgcEZvcm1GaWVsZC0+U2V0VmFsdWUoc1ZhbHVlLCB0cnVlKTsKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtUZXh0RmllbGQ6IHsKKyAgICAgIGlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IGhXaWRnZXQtPkdldE5vZGUoKS0+R2V0V2lkZ2V0QWNjKCkpIHsKKyAgICAgICAgcEZvcm1GaWVsZC0+U2V0VmFsdWUocFdpZGdldEFjYy0+R2V0VmFsdWUoWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CiAgICAgICB9CiAgICAgICBicmVhazsKICAgICB9Ci0gICAgY2FzZSBGSUVMRFRZUEVfTElTVEJPWDogeworICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a0xpc3RCb3g6IHsKICAgICAgIHBGb3JtRmllbGQtPkNsZWFyU2VsZWN0aW9uKGZhbHNlKTsKIAotICAgICAgaWYgKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gaFdpZGdldC0+R2V0RGF0YUFjYygpKSB7CisgICAgICBpZiAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBoV2lkZ2V0LT5HZXROb2RlKCktPkdldFdpZGdldEFjYygpKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBXaWRnZXRBY2MtPkNvdW50U2VsZWN0ZWRJdGVtcygpOyBpIDwgc3o7IGkrKykgewogICAgICAgICAgIGludCBuSW5kZXggPSBwV2lkZ2V0QWNjLT5HZXRTZWxlY3RlZEl0ZW0oaSk7CiAKQEAgLTM5OCwxMCArNDAxLDEwIEBACiAgICAgICB9CiAgICAgICBicmVhazsKICAgICB9Ci0gICAgY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6IHsKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtDb21ib0JveDogewogICAgICAgcEZvcm1GaWVsZC0+Q2xlYXJTZWxlY3Rpb24oZmFsc2UpOwogCi0gICAgICBpZiAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBoV2lkZ2V0LT5HZXREYXRhQWNjKCkpIHsKKyAgICAgIGlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IGhXaWRnZXQtPkdldE5vZGUoKS0+R2V0V2lkZ2V0QWNjKCkpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcFdpZGdldEFjYy0+Q291bnRTZWxlY3RlZEl0ZW1zKCk7IGkgPCBzejsgaSsrKSB7CiAgICAgICAgICAgaW50IG5JbmRleCA9IHBXaWRnZXRBY2MtPkdldFNlbGVjdGVkSXRlbShpKTsKIApAQCAtNDA5LDEzICs0MTIsMTMgQEAKICAgICAgICAgICAgIHBGb3JtRmllbGQtPlNldEl0ZW1TZWxlY3Rpb24obkluZGV4LCB0cnVlLCB0cnVlKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KLQotICAgICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWU7Ci0gICAgICAgIHBXaWRnZXRBY2MtPkdldFZhbHVlKHNWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsKLSAgICAgICAgcEZvcm1GaWVsZC0+U2V0VmFsdWUoc1ZhbHVlLCB0cnVlKTsKKyAgICAgICAgcEZvcm1GaWVsZC0+U2V0VmFsdWUocFdpZGdldEFjYy0+R2V0VmFsdWUoWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CiAgICAgICB9CiAgICAgICBicmVhazsKICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOwogICB9CiB9CiAKQEAgLTQyNiwzNiArNDI5LDM2IEBACiAgIEFTU0VSVChoV2lkZ2V0KTsKIAogICBzd2l0Y2ggKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpKSB7Ci0gICAgY2FzZSBGSUVMRFRZUEVfTElTVEJPWDogeworICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a0xpc3RCb3g6IHsKICAgICAgIHBGb3JtRmllbGQtPkNsZWFyU2VsZWN0aW9uKGZhbHNlKTsKICAgICAgIHBGb3JtRmllbGQtPkNsZWFyT3B0aW9ucyh0cnVlKTsKIAotICAgICAgaWYgKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gaFdpZGdldC0+R2V0RGF0YUFjYygpKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBXaWRnZXRBY2MtPkNvdW50Q2hvaWNlTGlzdEl0ZW1zKCk7IGkgPCBzejsgaSsrKSB7Ci0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dUZXh0OwotICAgICAgICAgIHBXaWRnZXRBY2MtPkdldENob2ljZUxpc3RJdGVtKHN3VGV4dCwgaSk7Ci0KLSAgICAgICAgICBwRm9ybUZpZWxkLT5JbnNlcnRPcHRpb24oc3dUZXh0LCBpLCB0cnVlKTsKKyAgICAgIGlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IGhXaWRnZXQtPkdldE5vZGUoKS0+R2V0V2lkZ2V0QWNjKCkpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcFdpZGdldEFjYy0+Q291bnRDaG9pY2VMaXN0SXRlbXMoZmFsc2UpOyBpIDwgc3o7CisgICAgICAgICAgICAgaSsrKSB7CisgICAgICAgICAgcEZvcm1GaWVsZC0+SW5zZXJ0T3B0aW9uKAorICAgICAgICAgICAgICBwV2lkZ2V0QWNjLT5HZXRDaG9pY2VMaXN0SXRlbShpLCBmYWxzZSkudmFsdWVfb3IoTCIiKSwgaSwgdHJ1ZSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBjYXNlIEZJRUxEVFlQRV9DT01CT0JPWDogeworICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a0NvbWJvQm94OiB7CiAgICAgICBwRm9ybUZpZWxkLT5DbGVhclNlbGVjdGlvbihmYWxzZSk7CiAgICAgICBwRm9ybUZpZWxkLT5DbGVhck9wdGlvbnMoZmFsc2UpOwogCi0gICAgICBpZiAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBoV2lkZ2V0LT5HZXREYXRhQWNjKCkpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcFdpZGdldEFjYy0+Q291bnRDaG9pY2VMaXN0SXRlbXMoKTsgaSA8IHN6OyBpKyspIHsKLSAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzd1RleHQ7Ci0gICAgICAgICAgcFdpZGdldEFjYy0+R2V0Q2hvaWNlTGlzdEl0ZW0oc3dUZXh0LCBpKTsKLQotICAgICAgICAgIHBGb3JtRmllbGQtPkluc2VydE9wdGlvbihzd1RleHQsIGksIGZhbHNlKTsKKyAgICAgIGlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IGhXaWRnZXQtPkdldE5vZGUoKS0+R2V0V2lkZ2V0QWNjKCkpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcFdpZGdldEFjYy0+Q291bnRDaG9pY2VMaXN0SXRlbXMoZmFsc2UpOyBpIDwgc3o7CisgICAgICAgICAgICAgaSsrKSB7CisgICAgICAgICAgcEZvcm1GaWVsZC0+SW5zZXJ0T3B0aW9uKAorICAgICAgICAgICAgICBwV2lkZ2V0QWNjLT5HZXRDaG9pY2VMaXN0SXRlbShpLCBmYWxzZSkudmFsdWVfb3IoTCIiKSwgaSwgZmFsc2UpOwogICAgICAgICB9CiAgICAgICB9CiAKICAgICAgIHBGb3JtRmllbGQtPlNldFZhbHVlKEwiIiwgdHJ1ZSk7CiAgICAgICBicmVhazsKICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOwogICB9CiB9CiAjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCkBAIC00NjYsNyArNDY5LDcgQEAKICAgICByZXR1cm4gZmFsc2U7CiAKICAgLy8gQ2hvb3NlIHRoZSByaWdodCBzdWItYXAKLSAgY29uc3QgRlhfQ0hBUiogYXBfZW50cnkgPSAiTiI7CisgIGNvbnN0IGNoYXIqIGFwX2VudHJ5ID0gIk4iOwogICBpZiAobW9kZSA9PSBDUERGX0Fubm90OjpEb3duKQogICAgIGFwX2VudHJ5ID0gIkQiOwogICBlbHNlIGlmIChtb2RlID09IENQREZfQW5ub3Q6OlJvbGxvdmVyKQpAQCAtNDc5LDM0ICs0ODIsMzUgQEAKICAgaWYgKCFwc3ViKQogICAgIHJldHVybiBmYWxzZTsKIAotICBpbnQgbkZpZWxkVHlwZSA9IEdldEZpZWxkVHlwZSgpOwotICBzd2l0Y2ggKG5GaWVsZFR5cGUpIHsKLSAgICBjYXNlIEZJRUxEVFlQRV9QVVNIQlVUVE9OOgotICAgIGNhc2UgRklFTERUWVBFX0NPTUJPQk9YOgotICAgIGNhc2UgRklFTERUWVBFX0xJU1RCT1g6Ci0gICAgY2FzZSBGSUVMRFRZUEVfVEVYVEZJRUxEOgotICAgIGNhc2UgRklFTERUWVBFX1NJR05BVFVSRToKKyAgRm9ybUZpZWxkVHlwZSBmaWVsZFR5cGUgPSBHZXRGaWVsZFR5cGUoKTsKKyAgc3dpdGNoIChmaWVsZFR5cGUpIHsKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtQdXNoQnV0dG9uOgorICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a0NvbWJvQm94OgorICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a0xpc3RCb3g6CisgICAgY2FzZSBGb3JtRmllbGRUeXBlOjprVGV4dEZpZWxkOgorICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a1NpZ25hdHVyZToKICAgICAgIHJldHVybiBwc3ViLT5Jc1N0cmVhbSgpOwotICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgotICAgIGNhc2UgRklFTERUWVBFX1JBRElPQlVUVE9OOgorICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a0NoZWNrQm94OgorICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a1JhZGlvQnV0dG9uOgogICAgICAgaWYgKENQREZfRGljdGlvbmFyeSogcFN1YkRpY3QgPSBwc3ViLT5Bc0RpY3Rpb25hcnkoKSkgewogICAgICAgICByZXR1cm4gISFwU3ViRGljdC0+R2V0U3RyZWFtRm9yKEdldEFwcFN0YXRlKCkpOwogICAgICAgfQogICAgICAgcmV0dXJuIGZhbHNlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gdHJ1ZTsKICAgfQotICByZXR1cm4gdHJ1ZTsKIH0KIAotaW50IENQREZTREtfV2lkZ2V0OjpHZXRGaWVsZFR5cGUoKSBjb25zdCB7CitGb3JtRmllbGRUeXBlIENQREZTREtfV2lkZ2V0OjpHZXRGaWVsZFR5cGUoKSBjb25zdCB7CiAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKLSAgcmV0dXJuIHBGaWVsZCA/IHBGaWVsZC0+R2V0RmllbGRUeXBlKCkgOiBGSUVMRFRZUEVfVU5LTk9XTjsKKyAgcmV0dXJuIHBGaWVsZCA/IHBGaWVsZC0+R2V0RmllbGRUeXBlKCkgOiBGb3JtRmllbGRUeXBlOjprVW5rbm93bjsKIH0KIAogYm9vbCBDUERGU0RLX1dpZGdldDo6SXNBcHBlYXJhbmNlVmFsaWQoKSB7CiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKICAgQ1BERlhGQV9Db250ZXh0KiBwQ29udGV4dCA9IG1fcFBhZ2VWaWV3LT5HZXRGb3JtRmlsbEVudigpLT5HZXRYRkFDb250ZXh0KCk7Ci0gIGludCBuRG9jVHlwZSA9IHBDb250ZXh0LT5HZXREb2NUeXBlKCk7Ci0gIGlmIChuRG9jVHlwZSAhPSBET0NUWVBFX1BERiAmJiBuRG9jVHlwZSAhPSBET0NUWVBFX1NUQVRJQ19YRkEpCisgIEZvcm1UeXBlIGZvcm1UeXBlID0gcENvbnRleHQtPkdldEZvcm1UeXBlKCk7CisgIGlmIChmb3JtVHlwZSA9PSBGb3JtVHlwZTo6a1hGQUZ1bGwpCiAgICAgcmV0dXJuIHRydWU7CiAjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAgIHJldHVybiBDUERGU0RLX0JBQW5ub3Q6OklzQXBwZWFyYW5jZVZhbGlkKCk7CkBAIC01MjUsNyArNTI5LDcgQEAKIH0KIAogYm9vbCBDUERGU0RLX1dpZGdldDo6SXNTaWduYXR1cmVXaWRnZXQoKSBjb25zdCB7Ci0gIHJldHVybiBHZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfU0lHTkFUVVJFOworICByZXR1cm4gR2V0RmllbGRUeXBlKCkgPT0gRm9ybUZpZWxkVHlwZTo6a1NpZ25hdHVyZTsKIH0KIAogQ1BERl9Gb3JtRmllbGQqIENQREZTREtfV2lkZ2V0OjpHZXRGb3JtRmllbGQoKSBjb25zdCB7CkBAIC01NTEsNyArNTU1LDcgQEAKIH0KIAogI2lmZGVmIFBERl9FTkFCTEVfWEZBCi1DRlhfV2lkZVN0cmluZyBDUERGU0RLX1dpZGdldDo6R2V0TmFtZSgpIGNvbnN0IHsKK1dpZGVTdHJpbmcgQ1BERlNES19XaWRnZXQ6OkdldE5hbWUoKSBjb25zdCB7CiAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gR2V0Rm9ybUZpZWxkKCk7CiAgIHJldHVybiBwRm9ybUZpZWxkLT5HZXRGdWxsTmFtZSgpOwogfQpAQCAtNTYxLDE0ICs1NjUsMTQgQEAKICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKICAgaW50IGlDb2xvclR5cGUgPSAwOwogICBjb2xvciA9IEFSR0JUb0NvbG9yUmVmKHBGb3JtQ3RybC0+R2V0QmFja2dyb3VuZENvbG9yKGlDb2xvclR5cGUpKTsKLSAgcmV0dXJuIGlDb2xvclR5cGUgIT0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOworICByZXR1cm4gaUNvbG9yVHlwZSAhPSBDRlhfQ29sb3I6OmtUcmFuc3BhcmVudDsKIH0KIAogYm9vbCBDUERGU0RLX1dpZGdldDo6R2V0Qm9yZGVyQ29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdCB7CiAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7CiAgIGludCBpQ29sb3JUeXBlID0gMDsKICAgY29sb3IgPSBBUkdCVG9Db2xvclJlZihwRm9ybUN0cmwtPkdldEJvcmRlckNvbG9yKGlDb2xvclR5cGUpKTsKLSAgcmV0dXJuIGlDb2xvclR5cGUgIT0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOworICByZXR1cm4gaUNvbG9yVHlwZSAhPSBDRlhfQ29sb3I6OmtUcmFuc3BhcmVudDsKIH0KIAogYm9vbCBDUERGU0RLX1dpZGdldDo6R2V0VGV4dENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3QgewpAQCAtNTc4LDI2ICs1ODIsMjQgQEAKICAgICByZXR1cm4gZmFsc2U7CiAKICAgRlhfQVJHQiBhcmdiOwotICBpbnQgaUNvbG9yVHlwZSA9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsKKyAgaW50IGlDb2xvclR5cGUgPSBDRlhfQ29sb3I6OmtUcmFuc3BhcmVudDsKICAgZGEuR2V0Q29sb3IoYXJnYiwgaUNvbG9yVHlwZSk7CiAgIGNvbG9yID0gQVJHQlRvQ29sb3JSZWYoYXJnYik7Ci0gIHJldHVybiBpQ29sb3JUeXBlICE9IENPTE9SVFlQRV9UUkFOU1BBUkVOVDsKKyAgcmV0dXJuIGlDb2xvclR5cGUgIT0gQ0ZYX0NvbG9yOjprVHJhbnNwYXJlbnQ7CiB9CiAKLUZYX0ZMT0FUIENQREZTREtfV2lkZ2V0OjpHZXRGb250U2l6ZSgpIGNvbnN0IHsKK2Zsb2F0IENQREZTREtfV2lkZ2V0OjpHZXRGb250U2l6ZSgpIGNvbnN0IHsKICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKICAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBwRGEgPSBwRm9ybUN0cmwtPkdldERlZmF1bHRBcHBlYXJhbmNlKCk7Ci0gIENGWF9CeXRlU3RyaW5nIGNzRm9udCA9ICIiOwotICBGWF9GTE9BVCBmRm9udFNpemUgPSAwLjBmOwotICBwRGEuR2V0Rm9udChjc0ZvbnQsIGZGb250U2l6ZSk7Ci0KKyAgZmxvYXQgZkZvbnRTaXplOworICBwRGEuR2V0Rm9udCgmZkZvbnRTaXplKTsKICAgcmV0dXJuIGZGb250U2l6ZTsKIH0KIAogaW50IENQREZTREtfV2lkZ2V0OjpHZXRTZWxlY3RlZEluZGV4KGludCBuSW5kZXgpIGNvbnN0IHsKICNpZmRlZiBQREZfRU5BQkxFX1hGQQogICBpZiAoQ1hGQV9GRldpZGdldCogaFdpZGdldCA9IEdldE1peFhGQVdpZGdldCgpKSB7Ci0gICAgaWYgKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gaFdpZGdldC0+R2V0RGF0YUFjYygpKSB7CisgICAgaWYgKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gaFdpZGdldC0+R2V0Tm9kZSgpLT5HZXRXaWRnZXRBY2MoKSkgewogICAgICAgaWYgKG5JbmRleCA8IHBXaWRnZXRBY2MtPkNvdW50U2VsZWN0ZWRJdGVtcygpKQogICAgICAgICByZXR1cm4gcFdpZGdldEFjYy0+R2V0U2VsZWN0ZWRJdGVtKG5JbmRleCk7CiAgICAgfQpAQCAtNjA4LDI4ICs2MTAsMjYgQEAKIH0KIAogI2lmZGVmIFBERl9FTkFCTEVfWEZBCi1DRlhfV2lkZVN0cmluZyBDUERGU0RLX1dpZGdldDo6R2V0VmFsdWUoYm9vbCBiRGlzcGxheSkgY29uc3QgeworV2lkZVN0cmluZyBDUERGU0RLX1dpZGdldDo6R2V0VmFsdWUoYm9vbCBiRGlzcGxheSkgY29uc3QgewogICBpZiAoQ1hGQV9GRldpZGdldCogaFdpZGdldCA9IEdldE1peFhGQVdpZGdldCgpKSB7Ci0gICAgaWYgKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gaFdpZGdldC0+R2V0RGF0YUFjYygpKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWU7Ci0gICAgICBwV2lkZ2V0QWNjLT5HZXRWYWx1ZSgKLSAgICAgICAgICBzVmFsdWUsIGJEaXNwbGF5ID8gWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5IDogWEZBX1ZBTFVFUElDVFVSRV9FZGl0KTsKLSAgICAgIHJldHVybiBzVmFsdWU7CisgICAgaWYgKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gaFdpZGdldC0+R2V0Tm9kZSgpLT5HZXRXaWRnZXRBY2MoKSkgeworICAgICAgcmV0dXJuIHBXaWRnZXRBY2MtPkdldFZhbHVlKGJEaXNwbGF5ID8gWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBYRkFfVkFMVUVQSUNUVVJFX0VkaXQpOwogICAgIH0KICAgfQogI2Vsc2UKLUNGWF9XaWRlU3RyaW5nIENQREZTREtfV2lkZ2V0OjpHZXRWYWx1ZSgpIGNvbnN0IHsKK1dpZGVTdHJpbmcgQ1BERlNES19XaWRnZXQ6OkdldFZhbHVlKCkgY29uc3QgewogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOwogICByZXR1cm4gcEZvcm1GaWVsZC0+R2V0VmFsdWUoKTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19XaWRnZXQ6OkdldERlZmF1bHRWYWx1ZSgpIGNvbnN0IHsKK1dpZGVTdHJpbmcgQ1BERlNES19XaWRnZXQ6OkdldERlZmF1bHRWYWx1ZSgpIGNvbnN0IHsKICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKICAgcmV0dXJuIHBGb3JtRmllbGQtPkdldERlZmF1bHRWYWx1ZSgpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDUERGU0RLX1dpZGdldDo6R2V0T3B0aW9uTGFiZWwoaW50IG5JbmRleCkgY29uc3QgeworV2lkZVN0cmluZyBDUERGU0RLX1dpZGdldDo6R2V0T3B0aW9uTGFiZWwoaW50IG5JbmRleCkgY29uc3QgewogICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOwogICByZXR1cm4gcEZvcm1GaWVsZC0+R2V0T3B0aW9uTGFiZWwobkluZGV4KTsKIH0KQEAgLTY0Miw4ICs2NDIsOCBAQAogYm9vbCBDUERGU0RLX1dpZGdldDo6SXNPcHRpb25TZWxlY3RlZChpbnQgbkluZGV4KSBjb25zdCB7CiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKICAgaWYgKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQgPSBHZXRNaXhYRkFXaWRnZXQoKSkgewotICAgIGlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IGhXaWRnZXQtPkdldERhdGFBY2MoKSkgewotICAgICAgaWYgKG5JbmRleCA+IC0xICYmIG5JbmRleCA8IHBXaWRnZXRBY2MtPkNvdW50Q2hvaWNlTGlzdEl0ZW1zKCkpCisgICAgaWYgKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gaFdpZGdldC0+R2V0Tm9kZSgpLT5HZXRXaWRnZXRBY2MoKSkgeworICAgICAgaWYgKG5JbmRleCA+IC0xICYmIG5JbmRleCA8IHBXaWRnZXRBY2MtPkNvdW50Q2hvaWNlTGlzdEl0ZW1zKGZhbHNlKSkKICAgICAgICAgcmV0dXJuIHBXaWRnZXRBY2MtPkdldEl0ZW1TdGF0ZShuSW5kZXgpOwogCiAgICAgICByZXR1cm4gZmFsc2U7CkBAIC02NjIsNyArNjYyLDcgQEAKIGJvb2wgQ1BERlNES19XaWRnZXQ6OklzQ2hlY2tlZCgpIGNvbnN0IHsKICNpZmRlZiBQREZfRU5BQkxFX1hGQQogICBpZiAoQ1hGQV9GRldpZGdldCogaFdpZGdldCA9IEdldE1peFhGQVdpZGdldCgpKSB7Ci0gICAgaWYgKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gaFdpZGdldC0+R2V0RGF0YUFjYygpKQorICAgIGlmIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IGhXaWRnZXQtPkdldE5vZGUoKS0+R2V0V2lkZ2V0QWNjKCkpCiAgICAgICByZXR1cm4gcFdpZGdldEFjYy0+R2V0Q2hlY2tTdGF0ZSgpID09IFhGQV9DSEVDS1NUQVRFX09uOwogICB9CiAjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCkBAIC02OTMsNyArNjkzLDcgQEAKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIH0KIAotdm9pZCBDUERGU0RLX1dpZGdldDo6U2V0VmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNWYWx1ZSwgYm9vbCBiTm90aWZ5KSB7Cit2b2lkIENQREZTREtfV2lkZ2V0OjpTZXRWYWx1ZShjb25zdCBXaWRlU3RyaW5nJiBzVmFsdWUsIGJvb2wgYk5vdGlmeSkgewogICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEdldEZvcm1GaWVsZCgpOwogICBwRm9ybUZpZWxkLT5TZXRWYWx1ZShzVmFsdWUsIGJOb3RpZnkpOwogI2lmZGVmIFBERl9FTkFCTEVfWEZBCkBAIC03MDIsNyArNzAyLDcgQEAKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIH0KIAotdm9pZCBDUERGU0RLX1dpZGdldDo6U2V0RGVmYXVsdFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVmFsdWUpIHt9Cit2b2lkIENQREZTREtfV2lkZ2V0OjpTZXREZWZhdWx0VmFsdWUoY29uc3QgV2lkZVN0cmluZyYgc1ZhbHVlKSB7fQogdm9pZCBDUERGU0RLX1dpZGdldDo6U2V0T3B0aW9uU2VsZWN0aW9uKGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZWxlY3RlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJOb3RpZnkpIHsKQEAgLTc0MCwxMCArNzQwLDEwIEBACiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKIHZvaWQgQ1BERlNES19XaWRnZXQ6OlJlc2V0QXBwZWFyYW5jZShib29sIGJWYWx1ZUNoYW5nZWQpIHsKICAgc3dpdGNoIChHZXRGaWVsZFR5cGUoKSkgewotICAgIGNhc2UgRklFTERUWVBFX1RFWFRGSUVMRDoKLSAgICBjYXNlIEZJRUxEVFlQRV9DT01CT0JPWDogeworICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a1RleHRGaWVsZDoKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtDb21ib0JveDogewogICAgICAgYm9vbCBiRm9ybWF0dGVkID0gZmFsc2U7Ci0gICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBPbkZvcm1hdChiRm9ybWF0dGVkKTsKKyAgICAgIFdpZGVTdHJpbmcgc1ZhbHVlID0gT25Gb3JtYXQoYkZvcm1hdHRlZCk7CiAgICAgICBSZXNldEFwcGVhcmFuY2UoYkZvcm1hdHRlZCA/ICZzVmFsdWUgOiBudWxscHRyLCB0cnVlKTsKICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTc1NCw0MyArNzU0LDQyIEBACiB9CiAjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKLXZvaWQgQ1BERlNES19XaWRnZXQ6OlJlc2V0QXBwZWFyYW5jZShjb25zdCBDRlhfV2lkZVN0cmluZyogc1ZhbHVlLAordm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRBcHBlYXJhbmNlKGNvbnN0IFdpZGVTdHJpbmcqIHNWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJWYWx1ZUNoYW5nZWQpIHsKICAgU2V0QXBwTW9kaWZpZWQoKTsKIAotICBtX25BcHBBZ2UrKzsKLSAgaWYgKG1fbkFwcEFnZSA+IDk5OTk5OSkKLSAgICBtX25BcHBBZ2UgPSAwOworICBtX25BcHBlYXJhbmNlQWdlKys7CiAgIGlmIChiVmFsdWVDaGFuZ2VkKQogICAgIG1fblZhbHVlQWdlKys7CiAKLSAgaW50IG5GaWVsZFR5cGUgPSBHZXRGaWVsZFR5cGUoKTsKLQotICBzd2l0Y2ggKG5GaWVsZFR5cGUpIHsKLSAgICBjYXNlIEZJRUxEVFlQRV9QVVNIQlVUVE9OOgotICAgICAgUmVzZXRBcHBlYXJhbmNlX1B1c2hCdXR0b24oKTsKKyAgQ1BXTF9BcHBTdHJlYW0gYXBwU3RyZWFtKHRoaXMsIEdldEFQRGljdCgpKTsKKyAgc3dpdGNoIChHZXRGaWVsZFR5cGUoKSkgeworICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a1B1c2hCdXR0b246CisgICAgICBhcHBTdHJlYW0uU2V0QXNQdXNoQnV0dG9uKCk7CiAgICAgICBicmVhazsKLSAgICBjYXNlIEZJRUxEVFlQRV9DSEVDS0JPWDoKLSAgICAgIFJlc2V0QXBwZWFyYW5jZV9DaGVja0JveCgpOworICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a0NoZWNrQm94OgorICAgICAgYXBwU3RyZWFtLlNldEFzQ2hlY2tCb3goKTsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgRklFTERUWVBFX1JBRElPQlVUVE9OOgotICAgICAgUmVzZXRBcHBlYXJhbmNlX1JhZGlvQnV0dG9uKCk7CisgICAgY2FzZSBGb3JtRmllbGRUeXBlOjprUmFkaW9CdXR0b246CisgICAgICBhcHBTdHJlYW0uU2V0QXNSYWRpb0J1dHRvbigpOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6Ci0gICAgICBSZXNldEFwcGVhcmFuY2VfQ29tYm9Cb3goc1ZhbHVlKTsKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtDb21ib0JveDoKKyAgICAgIGFwcFN0cmVhbS5TZXRBc0NvbWJvQm94KHNWYWx1ZSk7CiAgICAgICBicmVhazsKLSAgICBjYXNlIEZJRUxEVFlQRV9MSVNUQk9YOgotICAgICAgUmVzZXRBcHBlYXJhbmNlX0xpc3RCb3goKTsKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtMaXN0Qm94OgorICAgICAgYXBwU3RyZWFtLlNldEFzTGlzdEJveCgpOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGSUVMRFRZUEVfVEVYVEZJRUxEOgotICAgICAgUmVzZXRBcHBlYXJhbmNlX1RleHRGaWVsZChzVmFsdWUpOworICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a1RleHRGaWVsZDoKKyAgICAgIGFwcFN0cmVhbS5TZXRBc1RleHRGaWVsZChzVmFsdWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKICAgICAgIGJyZWFrOwogICB9CiAKICAgbV9wQW5ub3QtPkNsZWFyQ2FjaGVkQVAoKTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERlNES19XaWRnZXQ6Ok9uRm9ybWF0KGJvb2wmIGJGb3JtYXR0ZWQpIHsKK1dpZGVTdHJpbmcgQ1BERlNES19XaWRnZXQ6Ok9uRm9ybWF0KGJvb2wmIGJGb3JtYXR0ZWQpIHsKICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKICAgQVNTRVJUKHBGb3JtRmllbGQpOwogICByZXR1cm4gbV9wSW50ZXJGb3JtLT5PbkZvcm1hdChwRm9ybUZpZWxkLCBiRm9ybWF0dGVkKTsKQEAgLTgwMywxMyArODAyLDEzIEBACiB9CiAKIHZvaWQgQ1BERlNES19XaWRnZXQ6OkRyYXdBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtdFVzZXIyRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpIHsKLSAgaW50IG5GaWVsZFR5cGUgPSBHZXRGaWVsZFR5cGUoKTsKKyAgRm9ybUZpZWxkVHlwZSBmaWVsZFR5cGUgPSBHZXRGaWVsZFR5cGUoKTsKIAotICBpZiAoKG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX0NIRUNLQk9YIHx8Ci0gICAgICAgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfUkFESU9CVVRUT04pICYmCisgIGlmICgoZmllbGRUeXBlID09IEZvcm1GaWVsZFR5cGU6OmtDaGVja0JveCB8fAorICAgICAgIGZpZWxkVHlwZSA9PSBGb3JtRmllbGRUeXBlOjprUmFkaW9CdXR0b24pICYmCiAgICAgICBtb2RlID09IENQREZfQW5ub3Q6Ok5vcm1hbCAmJgogICAgICAgIUlzV2lkZ2V0QXBwZWFyYW5jZVZhbGlkKENQREZfQW5ub3Q6Ok5vcm1hbCkpIHsKICAgICBDRlhfUGF0aERhdGEgcGF0aERhdGE7CkBAIC04MjIsMTAgKzgyMSwxMCBAQAogICAgIENGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7CiAgICAgZ3NkLm1fTGluZVdpZHRoID0gMC4wZjsKIAotICAgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoRGF0YSwgcFVzZXIyRGV2aWNlLCAmZ3NkLCAwLCAweEZGQUFBQUFBLAorICAgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoRGF0YSwgJm10VXNlcjJEZXZpY2UsICZnc2QsIDAsIDB4RkZBQUFBQUEsCiAgICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX0FMVEVSTkFURSk7CiAgIH0gZWxzZSB7Ci0gICAgQ1BERlNES19CQUFubm90OjpEcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIG1vZGUsIHBPcHRpb25zKTsKKyAgICBDUERGU0RLX0JBQW5ub3Q6OkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIG10VXNlcjJEZXZpY2UsIG1vZGUsIHBPcHRpb25zKTsKICAgfQogfQogCkBAIC04MzcsOCArODM2LDggQEAKIAogdm9pZCBDUERGU0RLX1dpZGdldDo6RHJhd1NoYWRvdyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKLSAgaW50IG5GaWVsZFR5cGUgPSBHZXRGaWVsZFR5cGUoKTsKLSAgaWYgKCFtX3BJbnRlckZvcm0tPklzTmVlZEhpZ2hMaWdodChuRmllbGRUeXBlKSkKKyAgRm9ybUZpZWxkVHlwZSBmaWVsZFR5cGUgPSBHZXRGaWVsZFR5cGUoKTsKKyAgaWYgKCFtX3BJbnRlckZvcm0tPklzTmVlZEhpZ2hMaWdodChmaWVsZFR5cGUpKQogICAgIHJldHVybjsKIAogICBDRlhfTWF0cml4IHBhZ2UyZGV2aWNlOwpAQCAtODU4LDc5MSArODU3LDEyIEBACiAgIEZYX1JFQ1QgcmNEZXYgPSByY0RldmljZS5Ub0Z4UmVjdCgpOwogICBwRGV2aWNlLT5GaWxsUmVjdCgKICAgICAgICZyY0RldiwgQXJnYkVuY29kZShzdGF0aWNfY2FzdDxpbnQ+KG1fcEludGVyRm9ybS0+R2V0SGlnaGxpZ2h0QWxwaGEoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgbV9wSW50ZXJGb3JtLT5HZXRIaWdobGlnaHRDb2xvcihuRmllbGRUeXBlKSkpOwotfQotCi12b2lkIENQREZTREtfV2lkZ2V0OjpSZXNldEFwcGVhcmFuY2VfUHVzaEJ1dHRvbigpIHsKLSAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSBHZXRGb3JtQ29udHJvbCgpOwotICBDRlhfRmxvYXRSZWN0IHJjV2luZG93ID0gR2V0Um90YXRlZFJlY3QoKTsKLSAgaW50MzJfdCBuTGF5b3V0ID0gMDsKLSAgc3dpdGNoIChwQ29udHJvbC0+R2V0VGV4dFBvc2l0aW9uKCkpIHsKLSAgICBjYXNlIFRFWFRQT1NfSUNPTjoKLSAgICAgIG5MYXlvdXQgPSBQUEJMX0lDT047Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRFWFRQT1NfQkVMT1c6Ci0gICAgICBuTGF5b3V0ID0gUFBCTF9JQ09OVE9QTEFCRUxCT1RUT007Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRFWFRQT1NfQUJPVkU6Ci0gICAgICBuTGF5b3V0ID0gUFBCTF9MQUJFTFRPUElDT05CT1RUT007Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRFWFRQT1NfUklHSFQ6Ci0gICAgICBuTGF5b3V0ID0gUFBCTF9JQ09OTEVGVExBQkVMUklHSFQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRFWFRQT1NfTEVGVDoKLSAgICAgIG5MYXlvdXQgPSBQUEJMX0xBQkVMTEVGVElDT05SSUdIVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVEVYVFBPU19PVkVSTEFJRDoKLSAgICAgIG5MYXlvdXQgPSBQUEJMX0xBQkVMT1ZFUklDT047Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgbkxheW91dCA9IFBQQkxfTEFCRUw7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIENQV0xfQ29sb3IgY3JCYWNrZ3JvdW5kOwotICBDUFdMX0NvbG9yIGNyQm9yZGVyOwotICBpbnQgaUNvbG9yVHlwZTsKLSAgRlhfRkxPQVQgZmNbNF07Ci0gIHBDb250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcihpQ29sb3JUeXBlLCBmYyk7Ci0gIGlmIChpQ29sb3JUeXBlID4gMCkKLSAgICBjckJhY2tncm91bmQgPSBDUFdMX0NvbG9yKGlDb2xvclR5cGUsIGZjWzBdLCBmY1sxXSwgZmNbMl0sIGZjWzNdKTsKLQotICBwQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpQ29sb3JUeXBlLCBmYyk7Ci0gIGlmIChpQ29sb3JUeXBlID4gMCkKLSAgICBjckJvcmRlciA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOwotCi0gIEZYX0ZMT0FUIGZCb3JkZXJXaWR0aCA9IChGWF9GTE9BVClHZXRCb3JkZXJXaWR0aCgpOwotICBDUFdMX0Rhc2ggZHNCb3JkZXIoMywgMCwgMCk7Ci0gIENQV0xfQ29sb3IgY3JMZWZ0VG9wOwotICBDUFdMX0NvbG9yIGNyUmlnaHRCb3R0b207Ci0KLSAgQm9yZGVyU3R5bGUgbkJvcmRlclN0eWxlID0gR2V0Qm9yZGVyU3R5bGUoKTsKLSAgc3dpdGNoIChuQm9yZGVyU3R5bGUpIHsKLSAgICBjYXNlIEJvcmRlclN0eWxlOjpEQVNIOgotICAgICAgZHNCb3JkZXIgPSBDUFdMX0Rhc2goMywgMywgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJvcmRlclN0eWxlOjpCRVZFTEVEOgotICAgICAgZkJvcmRlcldpZHRoICo9IDI7Ci0gICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAxKTsKLSAgICAgIGNyUmlnaHRCb3R0b20gPSBjckJhY2tncm91bmQgLyAyLjBmOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCb3JkZXJTdHlsZTo6SU5TRVQ6Ci0gICAgICBmQm9yZGVyV2lkdGggKj0gMjsKLSAgICAgIGNyTGVmdFRvcCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDAuNSk7Ci0gICAgICBjclJpZ2h0Qm90dG9tID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMC43NSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICBDRlhfRmxvYXRSZWN0IHJjQ2xpZW50ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmNXaW5kb3csIGZCb3JkZXJXaWR0aCk7Ci0KLSAgQ1BXTF9Db2xvciBjclRleHQoQ09MT1JUWVBFX0dSQVksIDApOwotCi0gIEZYX0ZMT0FUIGZGb250U2l6ZSA9IDEyLjBmOwotICBDRlhfQnl0ZVN0cmluZyBjc05hbWVUYWc7Ci0KLSAgQ1BERl9EZWZhdWx0QXBwZWFyYW5jZSBkYSA9IHBDb250cm9sLT5HZXREZWZhdWx0QXBwZWFyYW5jZSgpOwotICBpZiAoZGEuSGFzQ29sb3IoKSkgewotICAgIGRhLkdldENvbG9yKGlDb2xvclR5cGUsIGZjKTsKLSAgICBjclRleHQgPSBDUFdMX0NvbG9yKGlDb2xvclR5cGUsIGZjWzBdLCBmY1sxXSwgZmNbMl0sIGZjWzNdKTsKLSAgfQotCi0gIGlmIChkYS5IYXNGb250KCkpCi0gICAgZGEuR2V0Rm9udChjc05hbWVUYWcsIGZGb250U2l6ZSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgY3NXQ2FwdGlvbjsKLSAgQ0ZYX1dpZGVTdHJpbmcgY3NOb3JtYWxDYXB0aW9uLCBjc1JvbGxvdmVyQ2FwdGlvbiwgY3NEb3duQ2FwdGlvbjsKLQotICBpZiAocENvbnRyb2wtPkhhc01LRW50cnkoIkNBIikpCi0gICAgY3NOb3JtYWxDYXB0aW9uID0gcENvbnRyb2wtPkdldE5vcm1hbENhcHRpb24oKTsKLQotICBpZiAocENvbnRyb2wtPkhhc01LRW50cnkoIlJDIikpCi0gICAgY3NSb2xsb3ZlckNhcHRpb24gPSBwQ29udHJvbC0+R2V0Um9sbG92ZXJDYXB0aW9uKCk7Ci0KLSAgaWYgKHBDb250cm9sLT5IYXNNS0VudHJ5KCJBQyIpKQotICAgIGNzRG93bkNhcHRpb24gPSBwQ29udHJvbC0+R2V0RG93bkNhcHRpb24oKTsKLQotICBDUERGX1N0cmVhbSogcE5vcm1hbEljb24gPSBudWxscHRyOwotICBDUERGX1N0cmVhbSogcFJvbGxvdmVySWNvbiA9IG51bGxwdHI7Ci0gIENQREZfU3RyZWFtKiBwRG93bkljb24gPSBudWxscHRyOwotCi0gIGlmIChwQ29udHJvbC0+SGFzTUtFbnRyeSgiSSIpKQotICAgIHBOb3JtYWxJY29uID0gcENvbnRyb2wtPkdldE5vcm1hbEljb24oKTsKLQotICBpZiAocENvbnRyb2wtPkhhc01LRW50cnkoIlJJIikpCi0gICAgcFJvbGxvdmVySWNvbiA9IHBDb250cm9sLT5HZXRSb2xsb3Zlckljb24oKTsKLQotICBpZiAocENvbnRyb2wtPkhhc01LRW50cnkoIklYIikpCi0gICAgcERvd25JY29uID0gcENvbnRyb2wtPkdldERvd25JY29uKCk7Ci0KLSAgaWYgKHBOb3JtYWxJY29uKSB7Ci0gICAgaWYgKENQREZfRGljdGlvbmFyeSogcEltYWdlRGljdCA9IHBOb3JtYWxJY29uLT5HZXREaWN0KCkpIHsKLSAgICAgIGlmIChwSW1hZ2VEaWN0LT5HZXRTdHJpbmdGb3IoIk5hbWUiKS5Jc0VtcHR5KCkpCi0gICAgICAgIHBJbWFnZURpY3QtPlNldE5ld0ZvcjxDUERGX1N0cmluZz4oIk5hbWUiLCAiSW1nQSIsIGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICBpZiAocFJvbGxvdmVySWNvbikgewotICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBJbWFnZURpY3QgPSBwUm9sbG92ZXJJY29uLT5HZXREaWN0KCkpIHsKLSAgICAgIGlmIChwSW1hZ2VEaWN0LT5HZXRTdHJpbmdGb3IoIk5hbWUiKS5Jc0VtcHR5KCkpCi0gICAgICAgIHBJbWFnZURpY3QtPlNldE5ld0ZvcjxDUERGX1N0cmluZz4oIk5hbWUiLCAiSW1nQiIsIGZhbHNlKTsKLSAgICB9Ci0gIH0KLQotICBpZiAocERvd25JY29uKSB7Ci0gICAgaWYgKENQREZfRGljdGlvbmFyeSogcEltYWdlRGljdCA9IHBEb3duSWNvbi0+R2V0RGljdCgpKSB7Ci0gICAgICBpZiAocEltYWdlRGljdC0+R2V0U3RyaW5nRm9yKCJOYW1lIikuSXNFbXB0eSgpKQotICAgICAgICBwSW1hZ2VEaWN0LT5TZXROZXdGb3I8Q1BERl9TdHJpbmc+KCJOYW1lIiwgIkltZ0MiLCBmYWxzZSk7Ci0gICAgfQotICB9Ci0KLSAgQ1BERl9JY29uRml0IGljb25GaXQgPSBwQ29udHJvbC0+R2V0SWNvbkZpdCgpOwotCi0gIENCQV9Gb250TWFwIGZvbnRfbWFwKHRoaXMsIG1fcEludGVyRm9ybS0+R2V0Rm9ybUZpbGxFbnYoKS0+R2V0U3lzSGFuZGxlcigpKTsKLSAgZm9udF9tYXAuU2V0QVBUeXBlKCJOIik7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgY3NBUCA9Ci0gICAgICBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShyY1dpbmRvdywgY3JCYWNrZ3JvdW5kKSArCi0gICAgICBDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0ocmNXaW5kb3csIGZCb3JkZXJXaWR0aCwgY3JCb3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JMZWZ0VG9wLCBjclJpZ2h0Qm90dG9tLCBuQm9yZGVyU3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNCb3JkZXIpICsKLSAgICAgIENQV0xfVXRpbHM6OkdldFB1c2hCdXR0b25BcHBTdHJlYW0oCi0gICAgICAgICAgaWNvbkZpdC5HZXRGaXR0aW5nQm91bmRzKCkgPyByY1dpbmRvdyA6IHJjQ2xpZW50LCAmZm9udF9tYXAsCi0gICAgICAgICAgcE5vcm1hbEljb24sIGljb25GaXQsIGNzTm9ybWFsQ2FwdGlvbiwgY3JUZXh0LCBmRm9udFNpemUsIG5MYXlvdXQpOwotCi0gIFdyaXRlQXBwZWFyYW5jZSgiTiIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBjc0FQKTsKLSAgaWYgKHBOb3JtYWxJY29uKQotICAgIEFkZEltYWdlVG9BcHBlYXJhbmNlKCJOIiwgcE5vcm1hbEljb24pOwotCi0gIENQREZfRm9ybUNvbnRyb2w6OkhpZ2hsaWdodGluZ01vZGUgZUhMTSA9IHBDb250cm9sLT5HZXRIaWdobGlnaHRpbmdNb2RlKCk7Ci0gIGlmIChlSExNID09IENQREZfRm9ybUNvbnRyb2w6OlB1c2ggfHwgZUhMTSA9PSBDUERGX0Zvcm1Db250cm9sOjpUb2dnbGUpIHsKLSAgICBpZiAoY3NSb2xsb3ZlckNhcHRpb24uSXNFbXB0eSgpICYmICFwUm9sbG92ZXJJY29uKSB7Ci0gICAgICBjc1JvbGxvdmVyQ2FwdGlvbiA9IGNzTm9ybWFsQ2FwdGlvbjsKLSAgICAgIHBSb2xsb3Zlckljb24gPSBwTm9ybWFsSWNvbjsKLSAgICB9Ci0KLSAgICBmb250X21hcC5TZXRBUFR5cGUoIlIiKTsKLQotICAgIGNzQVAgPSBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShyY1dpbmRvdywgY3JCYWNrZ3JvdW5kKSArCi0gICAgICAgICAgIENQV0xfVXRpbHM6OkdldEJvcmRlckFwcFN0cmVhbShyY1dpbmRvdywgZkJvcmRlcldpZHRoLCBjckJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyTGVmdFRvcCwgY3JSaWdodEJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Cb3JkZXJTdHlsZSwgZHNCb3JkZXIpICsKLSAgICAgICAgICAgQ1BXTF9VdGlsczo6R2V0UHVzaEJ1dHRvbkFwcFN0cmVhbSgKLSAgICAgICAgICAgICAgIGljb25GaXQuR2V0Rml0dGluZ0JvdW5kcygpID8gcmNXaW5kb3cgOiByY0NsaWVudCwgJmZvbnRfbWFwLAotICAgICAgICAgICAgICAgcFJvbGxvdmVySWNvbiwgaWNvbkZpdCwgY3NSb2xsb3ZlckNhcHRpb24sIGNyVGV4dCwgZkZvbnRTaXplLAotICAgICAgICAgICAgICAgbkxheW91dCk7Ci0KLSAgICBXcml0ZUFwcGVhcmFuY2UoIlIiLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgY3NBUCk7Ci0gICAgaWYgKHBSb2xsb3Zlckljb24pCi0gICAgICBBZGRJbWFnZVRvQXBwZWFyYW5jZSgiUiIsIHBSb2xsb3Zlckljb24pOwotCi0gICAgaWYgKGNzRG93bkNhcHRpb24uSXNFbXB0eSgpICYmICFwRG93bkljb24pIHsKLSAgICAgIGNzRG93bkNhcHRpb24gPSBjc05vcm1hbENhcHRpb247Ci0gICAgICBwRG93bkljb24gPSBwTm9ybWFsSWNvbjsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKG5Cb3JkZXJTdHlsZSkgewotICAgICAgY2FzZSBCb3JkZXJTdHlsZTo6QkVWRUxFRDogewotICAgICAgICBDUFdMX0NvbG9yIGNyVGVtcCA9IGNyTGVmdFRvcDsKLSAgICAgICAgY3JMZWZ0VG9wID0gY3JSaWdodEJvdHRvbTsKLSAgICAgICAgY3JSaWdodEJvdHRvbSA9IGNyVGVtcDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEJvcmRlclN0eWxlOjpJTlNFVDogewotICAgICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwKTsKLSAgICAgICAgY3JSaWdodEJvdHRvbSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGZvbnRfbWFwLlNldEFQVHlwZSgiRCIpOwotCi0gICAgY3NBUCA9IENQV0xfVXRpbHM6OkdldFJlY3RGaWxsQXBwU3RyZWFtKHJjV2luZG93LCBjckJhY2tncm91bmQgLSAwLjI1ZikgKwotICAgICAgICAgICBDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0ocmNXaW5kb3csIGZCb3JkZXJXaWR0aCwgY3JCb3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckxlZnRUb3AsIGNyUmlnaHRCb3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQm9yZGVyU3R5bGUsIGRzQm9yZGVyKSArCi0gICAgICAgICAgIENQV0xfVXRpbHM6OkdldFB1c2hCdXR0b25BcHBTdHJlYW0oCi0gICAgICAgICAgICAgICBpY29uRml0LkdldEZpdHRpbmdCb3VuZHMoKSA/IHJjV2luZG93IDogcmNDbGllbnQsICZmb250X21hcCwKLSAgICAgICAgICAgICAgIHBEb3duSWNvbiwgaWNvbkZpdCwgY3NEb3duQ2FwdGlvbiwgY3JUZXh0LCBmRm9udFNpemUsIG5MYXlvdXQpOwotCi0gICAgV3JpdGVBcHBlYXJhbmNlKCJEIiwgR2V0Um90YXRlZFJlY3QoKSwgR2V0TWF0cml4KCksIGNzQVApOwotICAgIGlmIChwRG93bkljb24pCi0gICAgICBBZGRJbWFnZVRvQXBwZWFyYW5jZSgiRCIsIHBEb3duSWNvbik7Ci0gIH0gZWxzZSB7Ci0gICAgUmVtb3ZlQXBwZWFyYW5jZSgiRCIpOwotICAgIFJlbW92ZUFwcGVhcmFuY2UoIlIiKTsKLSAgfQotfQotCi12b2lkIENQREZTREtfV2lkZ2V0OjpSZXNldEFwcGVhcmFuY2VfQ2hlY2tCb3goKSB7Ci0gIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Rm9ybUNvbnRyb2woKTsKLSAgQ1BXTF9Db2xvciBjckJhY2tncm91bmQsIGNyQm9yZGVyLCBjclRleHQ7Ci0gIGludCBpQ29sb3JUeXBlOwotICBGWF9GTE9BVCBmY1s0XTsKLQotICBwQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoaUNvbG9yVHlwZSwgZmMpOwotICBpZiAoaUNvbG9yVHlwZSA+IDApCi0gICAgY3JCYWNrZ3JvdW5kID0gQ1BXTF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7Ci0KLSAgcENvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoaUNvbG9yVHlwZSwgZmMpOwotICBpZiAoaUNvbG9yVHlwZSA+IDApCi0gICAgY3JCb3JkZXIgPSBDUFdMX0NvbG9yKGlDb2xvclR5cGUsIGZjWzBdLCBmY1sxXSwgZmNbMl0sIGZjWzNdKTsKLQotICBGWF9GTE9BVCBmQm9yZGVyV2lkdGggPSAoRlhfRkxPQVQpR2V0Qm9yZGVyV2lkdGgoKTsKLSAgQ1BXTF9EYXNoIGRzQm9yZGVyKDMsIDAsIDApOwotICBDUFdMX0NvbG9yIGNyTGVmdFRvcCwgY3JSaWdodEJvdHRvbTsKLQotICBCb3JkZXJTdHlsZSBuQm9yZGVyU3R5bGUgPSBHZXRCb3JkZXJTdHlsZSgpOwotICBzd2l0Y2ggKG5Cb3JkZXJTdHlsZSkgewotICAgIGNhc2UgQm9yZGVyU3R5bGU6OkRBU0g6Ci0gICAgICBkc0JvcmRlciA9IENQV0xfRGFzaCgzLCAzLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQm9yZGVyU3R5bGU6OkJFVkVMRUQ6Ci0gICAgICBmQm9yZGVyV2lkdGggKj0gMjsKLSAgICAgIGNyTGVmdFRvcCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpOwotICAgICAgY3JSaWdodEJvdHRvbSA9IGNyQmFja2dyb3VuZCAvIDIuMGY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJvcmRlclN0eWxlOjpJTlNFVDoKLSAgICAgIGZCb3JkZXJXaWR0aCAqPSAyOwotICAgICAgY3JMZWZ0VG9wID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMC41KTsKLSAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjc1KTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIENGWF9GbG9hdFJlY3QgcmNXaW5kb3cgPSBHZXRSb3RhdGVkUmVjdCgpOwotICBDRlhfRmxvYXRSZWN0IHJjQ2xpZW50ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmNXaW5kb3csIGZCb3JkZXJXaWR0aCk7Ci0gIENQREZfRGVmYXVsdEFwcGVhcmFuY2UgZGEgPSBwQ29udHJvbC0+R2V0RGVmYXVsdEFwcGVhcmFuY2UoKTsKLSAgaWYgKGRhLkhhc0NvbG9yKCkpIHsKLSAgICBkYS5HZXRDb2xvcihpQ29sb3JUeXBlLCBmYyk7Ci0gICAgY3JUZXh0ID0gQ1BXTF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7Ci0gIH0KLQotICBpbnQzMl90IG5TdHlsZSA9IDA7Ci0gIENGWF9XaWRlU3RyaW5nIGNzV0NhcHRpb24gPSBwQ29udHJvbC0+R2V0Tm9ybWFsQ2FwdGlvbigpOwotICBpZiAoY3NXQ2FwdGlvbi5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICBzd2l0Y2ggKGNzV0NhcHRpb25bMF0pIHsKLSAgICAgIGNhc2UgTCdsJzoKLSAgICAgICAgblN0eWxlID0gUENTX0NJUkNMRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEwnOCc6Ci0gICAgICAgIG5TdHlsZSA9IFBDU19DUk9TUzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEwndSc6Ci0gICAgICAgIG5TdHlsZSA9IFBDU19ESUFNT05EOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTCduJzoKLSAgICAgICAgblN0eWxlID0gUENTX1NRVUFSRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEwnSCc6Ci0gICAgICAgIG5TdHlsZSA9IFBDU19TVEFSOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6ICAvLyBMJzQnCi0gICAgICAgIG5TdHlsZSA9IFBDU19DSEVDSzsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9IGVsc2UgewotICAgIG5TdHlsZSA9IFBDU19DSEVDSzsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIGNzQVBfTl9PTiA9Ci0gICAgICBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShyY1dpbmRvdywgY3JCYWNrZ3JvdW5kKSArCi0gICAgICBDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0ocmNXaW5kb3csIGZCb3JkZXJXaWR0aCwgY3JCb3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JMZWZ0VG9wLCBjclJpZ2h0Qm90dG9tLCBuQm9yZGVyU3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNCb3JkZXIpOwotCi0gIENGWF9CeXRlU3RyaW5nIGNzQVBfTl9PRkYgPSBjc0FQX05fT047Ci0KLSAgc3dpdGNoIChuQm9yZGVyU3R5bGUpIHsKLSAgICBjYXNlIEJvcmRlclN0eWxlOjpCRVZFTEVEOiB7Ci0gICAgICBDUFdMX0NvbG9yIGNyVGVtcCA9IGNyTGVmdFRvcDsKLSAgICAgIGNyTGVmdFRvcCA9IGNyUmlnaHRCb3R0b207Ci0gICAgICBjclJpZ2h0Qm90dG9tID0gY3JUZW1wOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQm9yZGVyU3R5bGU6OklOU0VUOiB7Ci0gICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwKTsKLSAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAxKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICBDRlhfQnl0ZVN0cmluZyBjc0FQX0RfT04gPQotICAgICAgQ1BXTF9VdGlsczo6R2V0UmVjdEZpbGxBcHBTdHJlYW0ocmNXaW5kb3csIGNyQmFja2dyb3VuZCAtIDAuMjVmKSArCi0gICAgICBDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0ocmNXaW5kb3csIGZCb3JkZXJXaWR0aCwgY3JCb3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JMZWZ0VG9wLCBjclJpZ2h0Qm90dG9tLCBuQm9yZGVyU3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNCb3JkZXIpOwotCi0gIENGWF9CeXRlU3RyaW5nIGNzQVBfRF9PRkYgPSBjc0FQX0RfT047Ci0KLSAgY3NBUF9OX09OICs9IENQV0xfVXRpbHM6OkdldENoZWNrQm94QXBwU3RyZWFtKHJjQ2xpZW50LCBuU3R5bGUsIGNyVGV4dCk7Ci0gIGNzQVBfRF9PTiArPSBDUFdMX1V0aWxzOjpHZXRDaGVja0JveEFwcFN0cmVhbShyY0NsaWVudCwgblN0eWxlLCBjclRleHQpOwotCi0gIFdyaXRlQXBwZWFyYW5jZSgiTiIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBjc0FQX05fT04sCi0gICAgICAgICAgICAgICAgICBwQ29udHJvbC0+R2V0Q2hlY2tlZEFQU3RhdGUoKSk7Ci0gIFdyaXRlQXBwZWFyYW5jZSgiTiIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBjc0FQX05fT0ZGLCAiT2ZmIik7Ci0KLSAgV3JpdGVBcHBlYXJhbmNlKCJEIiwgR2V0Um90YXRlZFJlY3QoKSwgR2V0TWF0cml4KCksIGNzQVBfRF9PTiwKLSAgICAgICAgICAgICAgICAgIHBDb250cm9sLT5HZXRDaGVja2VkQVBTdGF0ZSgpKTsKLSAgV3JpdGVBcHBlYXJhbmNlKCJEIiwgR2V0Um90YXRlZFJlY3QoKSwgR2V0TWF0cml4KCksIGNzQVBfRF9PRkYsICJPZmYiKTsKLQotICBDRlhfQnl0ZVN0cmluZyBjc0FTID0gR2V0QXBwU3RhdGUoKTsKLSAgaWYgKGNzQVMuSXNFbXB0eSgpKQotICAgIFNldEFwcFN0YXRlKCJPZmYiKTsKLX0KLQotdm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRBcHBlYXJhbmNlX1JhZGlvQnV0dG9uKCkgewotICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldEZvcm1Db250cm9sKCk7Ci0gIENQV0xfQ29sb3IgY3JCYWNrZ3JvdW5kLCBjckJvcmRlciwgY3JUZXh0OwotICBpbnQgaUNvbG9yVHlwZTsKLSAgRlhfRkxPQVQgZmNbNF07Ci0KLSAgcENvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKGlDb2xvclR5cGUsIGZjKTsKLSAgaWYgKGlDb2xvclR5cGUgPiAwKQotICAgIGNyQmFja2dyb3VuZCA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOwotCi0gIHBDb250cm9sLT5HZXRPcmlnaW5hbEJvcmRlckNvbG9yKGlDb2xvclR5cGUsIGZjKTsKLSAgaWYgKGlDb2xvclR5cGUgPiAwKQotICAgIGNyQm9yZGVyID0gQ1BXTF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7Ci0KLSAgRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7Ci0gIENQV0xfRGFzaCBkc0JvcmRlcigzLCAwLCAwKTsKLSAgQ1BXTF9Db2xvciBjckxlZnRUb3A7Ci0gIENQV0xfQ29sb3IgY3JSaWdodEJvdHRvbTsKLSAgQm9yZGVyU3R5bGUgbkJvcmRlclN0eWxlID0gR2V0Qm9yZGVyU3R5bGUoKTsKLSAgc3dpdGNoIChuQm9yZGVyU3R5bGUpIHsKLSAgICBjYXNlIEJvcmRlclN0eWxlOjpEQVNIOgotICAgICAgZHNCb3JkZXIgPSBDUFdMX0Rhc2goMywgMywgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJvcmRlclN0eWxlOjpCRVZFTEVEOgotICAgICAgZkJvcmRlcldpZHRoICo9IDI7Ci0gICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAxKTsKLSAgICAgIGNyUmlnaHRCb3R0b20gPSBjckJhY2tncm91bmQgLyAyLjBmOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBCb3JkZXJTdHlsZTo6SU5TRVQ6Ci0gICAgICBmQm9yZGVyV2lkdGggKj0gMjsKLSAgICAgIGNyTGVmdFRvcCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDAuNSk7Ci0gICAgICBjclJpZ2h0Qm90dG9tID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMC43NSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICBDRlhfRmxvYXRSZWN0IHJjV2luZG93ID0gR2V0Um90YXRlZFJlY3QoKTsKLSAgQ0ZYX0Zsb2F0UmVjdCByY0NsaWVudCA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJjV2luZG93LCBmQm9yZGVyV2lkdGgpOwotCi0gIENQREZfRGVmYXVsdEFwcGVhcmFuY2UgZGEgPSBwQ29udHJvbC0+R2V0RGVmYXVsdEFwcGVhcmFuY2UoKTsKLSAgaWYgKGRhLkhhc0NvbG9yKCkpIHsKLSAgICBkYS5HZXRDb2xvcihpQ29sb3JUeXBlLCBmYyk7Ci0gICAgY3JUZXh0ID0gQ1BXTF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7Ci0gIH0KLQotICBpbnQzMl90IG5TdHlsZSA9IDA7Ci0gIENGWF9XaWRlU3RyaW5nIGNzV0NhcHRpb24gPSBwQ29udHJvbC0+R2V0Tm9ybWFsQ2FwdGlvbigpOwotICBpZiAoY3NXQ2FwdGlvbi5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICBzd2l0Y2ggKGNzV0NhcHRpb25bMF0pIHsKLSAgICAgIGRlZmF1bHQ6ICAvLyBMJ2wnOgotICAgICAgICBuU3R5bGUgPSBQQ1NfQ0lSQ0xFOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTCc4JzoKLSAgICAgICAgblN0eWxlID0gUENTX0NST1NTOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTCd1JzoKLSAgICAgICAgblN0eWxlID0gUENTX0RJQU1PTkQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBMJ24nOgotICAgICAgICBuU3R5bGUgPSBQQ1NfU1FVQVJFOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTCdIJzoKLSAgICAgICAgblN0eWxlID0gUENTX1NUQVI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBMJzQnOgotICAgICAgICBuU3R5bGUgPSBQQ1NfQ0hFQ0s7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBuU3R5bGUgPSBQQ1NfQ0lSQ0xFOwotICB9Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgY3NBUF9OX09OOwotCi0gIENGWF9GbG9hdFJlY3QgcmNDZW50ZXIgPQotICAgICAgQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoQ1BXTF9VdGlsczo6R2V0Q2VudGVyU3F1YXJlKHJjV2luZG93KSwgMS4wZik7Ci0KLSAgaWYgKG5TdHlsZSA9PSBQQ1NfQ0lSQ0xFKSB7Ci0gICAgaWYgKG5Cb3JkZXJTdHlsZSA9PSBCb3JkZXJTdHlsZTo6QkVWRUxFRCkgewotICAgICAgY3JMZWZ0VG9wID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMSk7Ci0gICAgICBjclJpZ2h0Qm90dG9tID0gY3JCYWNrZ3JvdW5kIC0gMC4yNWY7Ci0gICAgfSBlbHNlIGlmIChuQm9yZGVyU3R5bGUgPT0gQm9yZGVyU3R5bGU6OklOU0VUKSB7Ci0gICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjVmKTsKLSAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjc1Zik7Ci0gICAgfQotCi0gICAgY3NBUF9OX09OID0gQ1BXTF9VdGlsczo6R2V0Q2lyY2xlRmlsbEFwcFN0cmVhbShyY0NlbnRlciwgY3JCYWNrZ3JvdW5kKSArCi0gICAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6R2V0Q2lyY2xlQm9yZGVyQXBwU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICByY0NlbnRlciwgZkJvcmRlcldpZHRoLCBjckJvcmRlciwgY3JMZWZ0VG9wLCBjclJpZ2h0Qm90dG9tLAotICAgICAgICAgICAgICAgICAgICBuQm9yZGVyU3R5bGUsIGRzQm9yZGVyKTsKLSAgfSBlbHNlIHsKLSAgICBjc0FQX05fT04gPSBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShyY1dpbmRvdywgY3JCYWNrZ3JvdW5kKSArCi0gICAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKHJjV2luZG93LCBmQm9yZGVyV2lkdGgsIGNyQm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjckxlZnRUb3AsIGNyUmlnaHRCb3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Cb3JkZXJTdHlsZSwgZHNCb3JkZXIpOwotICB9Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgY3NBUF9OX09GRiA9IGNzQVBfTl9PTjsKLQotICBzd2l0Y2ggKG5Cb3JkZXJTdHlsZSkgewotICAgIGNhc2UgQm9yZGVyU3R5bGU6OkJFVkVMRUQ6IHsKLSAgICAgIENQV0xfQ29sb3IgY3JUZW1wID0gY3JMZWZ0VG9wOwotICAgICAgY3JMZWZ0VG9wID0gY3JSaWdodEJvdHRvbTsKLSAgICAgIGNyUmlnaHRCb3R0b20gPSBjclRlbXA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBCb3JkZXJTdHlsZTo6SU5TRVQ6IHsKLSAgICAgIGNyTGVmdFRvcCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDApOwotICAgICAgY3JSaWdodEJvdHRvbSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIGNzQVBfRF9PTjsKLQotICBpZiAoblN0eWxlID09IFBDU19DSVJDTEUpIHsKLSAgICBDUFdMX0NvbG9yIGNyQksgPSBjckJhY2tncm91bmQgLSAwLjI1ZjsKLSAgICBpZiAobkJvcmRlclN0eWxlID09IEJvcmRlclN0eWxlOjpCRVZFTEVEKSB7Ci0gICAgICBjckxlZnRUb3AgPSBjckJhY2tncm91bmQgLSAwLjI1ZjsKLSAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAxKTsKLSAgICAgIGNyQksgPSBjckJhY2tncm91bmQ7Ci0gICAgfSBlbHNlIGlmIChuQm9yZGVyU3R5bGUgPT0gQm9yZGVyU3R5bGU6OklOU0VUKSB7Ci0gICAgICBjckxlZnRUb3AgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwKTsKLSAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAxKTsKLSAgICB9Ci0KLSAgICBjc0FQX0RfT04gPSBDUFdMX1V0aWxzOjpHZXRDaXJjbGVGaWxsQXBwU3RyZWFtKHJjQ2VudGVyLCBjckJLKSArCi0gICAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6R2V0Q2lyY2xlQm9yZGVyQXBwU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICByY0NlbnRlciwgZkJvcmRlcldpZHRoLCBjckJvcmRlciwgY3JMZWZ0VG9wLCBjclJpZ2h0Qm90dG9tLAotICAgICAgICAgICAgICAgICAgICBuQm9yZGVyU3R5bGUsIGRzQm9yZGVyKTsKLSAgfSBlbHNlIHsKLSAgICBjc0FQX0RfT04gPQotICAgICAgICBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShyY1dpbmRvdywgY3JCYWNrZ3JvdW5kIC0gMC4yNWYpICsKLSAgICAgICAgQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKHJjV2luZG93LCBmQm9yZGVyV2lkdGgsIGNyQm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JMZWZ0VG9wLCBjclJpZ2h0Qm90dG9tLCBuQm9yZGVyU3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc0JvcmRlcik7Ci0gIH0KLQotICBDRlhfQnl0ZVN0cmluZyBjc0FQX0RfT0ZGID0gY3NBUF9EX09OOwotCi0gIGNzQVBfTl9PTiArPSBDUFdMX1V0aWxzOjpHZXRSYWRpb0J1dHRvbkFwcFN0cmVhbShyY0NsaWVudCwgblN0eWxlLCBjclRleHQpOwotICBjc0FQX0RfT04gKz0gQ1BXTF9VdGlsczo6R2V0UmFkaW9CdXR0b25BcHBTdHJlYW0ocmNDbGllbnQsIG5TdHlsZSwgY3JUZXh0KTsKLQotICBXcml0ZUFwcGVhcmFuY2UoIk4iLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgY3NBUF9OX09OLAotICAgICAgICAgICAgICAgICAgcENvbnRyb2wtPkdldENoZWNrZWRBUFN0YXRlKCkpOwotICBXcml0ZUFwcGVhcmFuY2UoIk4iLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgY3NBUF9OX09GRiwgIk9mZiIpOwotCi0gIFdyaXRlQXBwZWFyYW5jZSgiRCIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBjc0FQX0RfT04sCi0gICAgICAgICAgICAgICAgICBwQ29udHJvbC0+R2V0Q2hlY2tlZEFQU3RhdGUoKSk7Ci0gIFdyaXRlQXBwZWFyYW5jZSgiRCIsIEdldFJvdGF0ZWRSZWN0KCksIEdldE1hdHJpeCgpLCBjc0FQX0RfT0ZGLCAiT2ZmIik7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgY3NBUyA9IEdldEFwcFN0YXRlKCk7Ci0gIGlmIChjc0FTLklzRW1wdHkoKSkKLSAgICBTZXRBcHBTdGF0ZSgiT2ZmIik7Ci19Ci0KLXZvaWQgQ1BERlNES19XaWRnZXQ6OlJlc2V0QXBwZWFyYW5jZV9Db21ib0JveChjb25zdCBDRlhfV2lkZVN0cmluZyogc1ZhbHVlKSB7Ci0gIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Rm9ybUNvbnRyb2woKTsKLSAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IHBDb250cm9sLT5HZXRGaWVsZCgpOwotICBDRlhfQnl0ZVRleHRCdWYgc0JvZHksIHNMaW5lczsKLQotICBDRlhfRmxvYXRSZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotICBDRlhfRmxvYXRSZWN0IHJjQnV0dG9uID0gcmNDbGllbnQ7Ci0gIHJjQnV0dG9uLmxlZnQgPSByY0J1dHRvbi5yaWdodCAtIDEzOwotICByY0J1dHRvbi5Ob3JtYWxpemUoKTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0VkaXQ+IHBFZGl0KG5ldyBDRlhfRWRpdCk7Ci0gIHBFZGl0LT5FbmFibGVSZWZyZXNoKGZhbHNlKTsKLQotICBDQkFfRm9udE1hcCBmb250X21hcCh0aGlzLCBtX3BJbnRlckZvcm0tPkdldEZvcm1GaWxsRW52KCktPkdldFN5c0hhbmRsZXIoKSk7Ci0gIHBFZGl0LT5TZXRGb250TWFwKCZmb250X21hcCk7Ci0KLSAgQ0ZYX0Zsb2F0UmVjdCByY0VkaXQgPSByY0NsaWVudDsKLSAgcmNFZGl0LnJpZ2h0ID0gcmNCdXR0b24ubGVmdDsKLSAgcmNFZGl0Lk5vcm1hbGl6ZSgpOwotCi0gIHBFZGl0LT5TZXRQbGF0ZVJlY3QocmNFZGl0KTsKLSAgcEVkaXQtPlNldEFsaWdubWVudFYoMSwgdHJ1ZSk7Ci0KLSAgRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Rm9udFNpemUoKTsKLSAgaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpCi0gICAgcEVkaXQtPlNldEF1dG9Gb250U2l6ZSh0cnVlLCB0cnVlKTsKLSAgZWxzZQotICAgIHBFZGl0LT5TZXRGb250U2l6ZShmRm9udFNpemUpOwotCi0gIHBFZGl0LT5Jbml0aWFsaXplKCk7Ci0KLSAgaWYgKHNWYWx1ZSkgewotICAgIHBFZGl0LT5TZXRUZXh0KCpzVmFsdWUpOwotICB9IGVsc2UgewotICAgIGludDMyX3QgbkN1clNlbCA9IHBGaWVsZC0+R2V0U2VsZWN0ZWRJbmRleCgwKTsKLSAgICBpZiAobkN1clNlbCA8IDApCi0gICAgICBwRWRpdC0+U2V0VGV4dChwRmllbGQtPkdldFZhbHVlKCkpOwotICAgIGVsc2UKLSAgICAgIHBFZGl0LT5TZXRUZXh0KHBGaWVsZC0+R2V0T3B0aW9uTGFiZWwobkN1clNlbCkpOwotICB9Ci0KLSAgQ0ZYX0Zsb2F0UmVjdCByY0NvbnRlbnQgPSBwRWRpdC0+R2V0Q29udGVudFJlY3QoKTsKLQotICBDRlhfQnl0ZVN0cmluZyBzRWRpdCA9Ci0gICAgICBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKHBFZGl0LmdldCgpLCBDRlhfUG9pbnRGKCkpOwotICBpZiAoc0VkaXQuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgc0JvZHkgPDwgIi9UeCBCTUNcbiIKLSAgICAgICAgICA8PCAicVxuIjsKLSAgICBpZiAocmNDb250ZW50LldpZHRoKCkgPiByY0VkaXQuV2lkdGgoKSB8fAotICAgICAgICByY0NvbnRlbnQuSGVpZ2h0KCkgPiByY0VkaXQuSGVpZ2h0KCkpIHsKLSAgICAgIHNCb2R5IDw8IHJjRWRpdC5sZWZ0IDw8ICIgIiA8PCByY0VkaXQuYm90dG9tIDw8ICIgIiA8PCByY0VkaXQuV2lkdGgoKQotICAgICAgICAgICAgPDwgIiAiIDw8IHJjRWRpdC5IZWlnaHQoKSA8PCAiIHJlXG5XXG5uXG4iOwotICAgIH0KLQotICAgIENQV0xfQ29sb3IgY3JUZXh0ID0gR2V0VGV4dFBXTENvbG9yKCk7Ci0gICAgc0JvZHkgPDwgIkJUXG4iCi0gICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0KSA8PCBzRWRpdCA8PCAiRVRcbiIKLSAgICAgICAgICA8PCAiUVxuRU1DXG4iOwotICB9Ci0KLSAgc0JvZHkgPDwgQ1BXTF9VdGlsczo6R2V0RHJvcEJ1dHRvbkFwcFN0cmVhbShyY0J1dHRvbik7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgc0FQID0gR2V0QmFja2dyb3VuZEFwcFN0cmVhbSgpICsgR2V0Qm9yZGVyQXBwU3RyZWFtKCkgKwotICAgICAgICAgICAgICAgICAgICAgICBzTGluZXMuQXNTdHJpbmdDKCkgKyBzQm9keS5Bc1N0cmluZ0MoKTsKLQotICBXcml0ZUFwcGVhcmFuY2UoIk4iLCBHZXRSb3RhdGVkUmVjdCgpLCBHZXRNYXRyaXgoKSwgc0FQKTsKLX0KLQotdm9pZCBDUERGU0RLX1dpZGdldDo6UmVzZXRBcHBlYXJhbmNlX0xpc3RCb3goKSB7Ci0gIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Rm9ybUNvbnRyb2woKTsKLSAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IHBDb250cm9sLT5HZXRGaWVsZCgpOwotICBDRlhfRmxvYXRSZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotICBDRlhfQnl0ZVRleHRCdWYgc0JvZHksIHNMaW5lczsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0VkaXQ+IHBFZGl0KG5ldyBDRlhfRWRpdCk7Ci0gIHBFZGl0LT5FbmFibGVSZWZyZXNoKGZhbHNlKTsKLQotICBDQkFfRm9udE1hcCBmb250X21hcCh0aGlzLCBtX3BJbnRlckZvcm0tPkdldEZvcm1GaWxsRW52KCktPkdldFN5c0hhbmRsZXIoKSk7Ci0gIHBFZGl0LT5TZXRGb250TWFwKCZmb250X21hcCk7Ci0KLSAgcEVkaXQtPlNldFBsYXRlUmVjdChDRlhfRmxvYXRSZWN0KHJjQ2xpZW50LmxlZnQsIDAuMGYsIHJjQ2xpZW50LnJpZ2h0LCAwLjBmKSk7Ci0KLSAgRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Rm9udFNpemUoKTsKLQotICBwRWRpdC0+U2V0Rm9udFNpemUoSXNGbG9hdFplcm8oZkZvbnRTaXplKSA/IDEyLjBmIDogZkZvbnRTaXplKTsKLQotICBwRWRpdC0+SW5pdGlhbGl6ZSgpOwotCi0gIENGWF9CeXRlVGV4dEJ1ZiBzTGlzdDsKLSAgRlhfRkxPQVQgZnkgPSByY0NsaWVudC50b3A7Ci0KLSAgaW50MzJfdCBuVG9wID0gcEZpZWxkLT5HZXRUb3BWaXNpYmxlSW5kZXgoKTsKLSAgaW50MzJfdCBuQ291bnQgPSBwRmllbGQtPkNvdW50T3B0aW9ucygpOwotICBpbnQzMl90IG5TZWxDb3VudCA9IHBGaWVsZC0+Q291bnRTZWxlY3RlZEl0ZW1zKCk7Ci0KLSAgZm9yIChpbnQzMl90IGkgPSBuVG9wOyBpIDwgbkNvdW50OyArK2kpIHsKLSAgICBib29sIGJTZWxlY3RlZCA9IGZhbHNlOwotICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IG5TZWxDb3VudDsgKytqKSB7Ci0gICAgICBpZiAocEZpZWxkLT5HZXRTZWxlY3RlZEluZGV4KGopID09IGkpIHsKLSAgICAgICAgYlNlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcEVkaXQtPlNldFRleHQocEZpZWxkLT5HZXRPcHRpb25MYWJlbChpKSk7Ci0KLSAgICBDRlhfRmxvYXRSZWN0IHJjQ29udGVudCA9IHBFZGl0LT5HZXRDb250ZW50UmVjdCgpOwotICAgIEZYX0ZMT0FUIGZJdGVtSGVpZ2h0ID0gcmNDb250ZW50LkhlaWdodCgpOwotCi0gICAgaWYgKGJTZWxlY3RlZCkgewotICAgICAgQ0ZYX0Zsb2F0UmVjdCByY0l0ZW0gPQotICAgICAgICAgIENGWF9GbG9hdFJlY3QocmNDbGllbnQubGVmdCwgZnkgLSBmSXRlbUhlaWdodCwgcmNDbGllbnQucmlnaHQsIGZ5KTsKLSAgICAgIHNMaXN0IDw8ICJxXG4iCi0gICAgICAgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIDAsIDUxLjBmIC8gMjU1LjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEzLjBmIC8gMjU1LjBmKSwKLSAgICAgICAgICAgICAgICAgICB0cnVlKQotICAgICAgICAgICAgPDwgcmNJdGVtLmxlZnQgPDwgIiAiIDw8IHJjSXRlbS5ib3R0b20gPDwgIiAiIDw8IHJjSXRlbS5XaWR0aCgpCi0gICAgICAgICAgICA8PCAiICIgPDwgcmNJdGVtLkhlaWdodCgpIDw8ICIgcmUgZlxuIgotICAgICAgICAgICAgPDwgIlFcbiI7Ci0KLSAgICAgIHNMaXN0IDw8ICJCVFxuIgotICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKQotICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbShwRWRpdC5nZXQoKSwgQ0ZYX1BvaW50RigwLjBmLCBmeSkpCi0gICAgICAgICAgICA8PCAiRVRcbiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIENQV0xfQ29sb3IgY3JUZXh0ID0gR2V0VGV4dFBXTENvbG9yKCk7Ci0gICAgICBzTGlzdCA8PCAiQlRcbiIKLSAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCwgdHJ1ZSkKLSAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0ocEVkaXQuZ2V0KCksIENGWF9Qb2ludEYoMC4wZiwgZnkpKQotICAgICAgICAgICAgPDwgIkVUXG4iOwotICAgIH0KLQotICAgIGZ5IC09IGZJdGVtSGVpZ2h0OwotICB9Ci0KLSAgaWYgKHNMaXN0LkdldFNpemUoKSA+IDApIHsKLSAgICBzQm9keSA8PCAiL1R4IEJNQ1xuIgotICAgICAgICAgIDw8ICJxXG4iCi0gICAgICAgICAgPDwgcmNDbGllbnQubGVmdCA8PCAiICIgPDwgcmNDbGllbnQuYm90dG9tIDw8ICIgIiA8PCByY0NsaWVudC5XaWR0aCgpCi0gICAgICAgICAgPDwgIiAiIDw8IHJjQ2xpZW50LkhlaWdodCgpIDw8ICIgcmVcbldcbm5cbiI7Ci0gICAgc0JvZHkgPDwgc0xpc3QgPDwgIlFcbkVNQ1xuIjsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIHNBUCA9IEdldEJhY2tncm91bmRBcHBTdHJlYW0oKSArIEdldEJvcmRlckFwcFN0cmVhbSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgc0xpbmVzLkFzU3RyaW5nQygpICsgc0JvZHkuQXNTdHJpbmdDKCk7Ci0KLSAgV3JpdGVBcHBlYXJhbmNlKCJOIiwgR2V0Um90YXRlZFJlY3QoKSwgR2V0TWF0cml4KCksIHNBUCk7Ci19Ci0KLXZvaWQgQ1BERlNES19XaWRnZXQ6OlJlc2V0QXBwZWFyYW5jZV9UZXh0RmllbGQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcqIHNWYWx1ZSkgewotICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldEZvcm1Db250cm9sKCk7Ci0gIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBwQ29udHJvbC0+R2V0RmllbGQoKTsKLSAgQ0ZYX0J5dGVUZXh0QnVmIHNCb2R5LCBzTGluZXM7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWF9FZGl0PiBwRWRpdChuZXcgQ0ZYX0VkaXQpOwotICBwRWRpdC0+RW5hYmxlUmVmcmVzaChmYWxzZSk7Ci0KLSAgQ0JBX0ZvbnRNYXAgZm9udF9tYXAodGhpcywgbV9wSW50ZXJGb3JtLT5HZXRGb3JtRmlsbEVudigpLT5HZXRTeXNIYW5kbGVyKCkpOwotICBwRWRpdC0+U2V0Rm9udE1hcCgmZm9udF9tYXApOwotCi0gIENGWF9GbG9hdFJlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7Ci0gIHBFZGl0LT5TZXRQbGF0ZVJlY3QocmNDbGllbnQpOwotICBwRWRpdC0+U2V0QWxpZ25tZW50SChwQ29udHJvbC0+R2V0Q29udHJvbEFsaWdubWVudCgpLCB0cnVlKTsKLQotICB1aW50MzJfdCBkd0ZpZWxkRmxhZ3MgPSBwRmllbGQtPkdldEZpZWxkRmxhZ3MoKTsKLSAgYm9vbCBiTXVsdGlMaW5lID0gKGR3RmllbGRGbGFncyA+PiAxMikgJiAxOwotCi0gIGlmIChiTXVsdGlMaW5lKSB7Ci0gICAgcEVkaXQtPlNldE11bHRpTGluZSh0cnVlLCB0cnVlKTsKLSAgICBwRWRpdC0+U2V0QXV0b1JldHVybih0cnVlLCB0cnVlKTsKLSAgfSBlbHNlIHsKLSAgICBwRWRpdC0+U2V0QWxpZ25tZW50VigxLCB0cnVlKTsKLSAgfQotCi0gIHVpbnQxNl90IHN1YldvcmQgPSAwOwotICBpZiAoKGR3RmllbGRGbGFncyA+PiAxMykgJiAxKSB7Ci0gICAgc3ViV29yZCA9ICcqJzsKLSAgICBwRWRpdC0+U2V0UGFzc3dvcmRDaGFyKHN1YldvcmQsIHRydWUpOwotICB9Ci0KLSAgaW50IG5NYXhMZW4gPSBwRmllbGQtPkdldE1heExlbigpOwotICBib29sIGJDaGFyQXJyYXkgPSAoZHdGaWVsZEZsYWdzID4+IDI0KSAmIDE7Ci0gIEZYX0ZMT0FUIGZGb250U2l6ZSA9IEdldEZvbnRTaXplKCk7Ci0KLSNpZmRlZiBQREZfRU5BQkxFX1hGQQotICBDRlhfV2lkZVN0cmluZyBzVmFsdWVUbXA7Ci0gIGlmICghc1ZhbHVlICYmIEdldE1peFhGQVdpZGdldCgpKSB7Ci0gICAgc1ZhbHVlVG1wID0gR2V0VmFsdWUodHJ1ZSk7Ci0gICAgc1ZhbHVlID0gJnNWYWx1ZVRtcDsKLSAgfQotI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQotCi0gIGlmIChuTWF4TGVuID4gMCkgewotICAgIGlmIChiQ2hhckFycmF5KSB7Ci0gICAgICBwRWRpdC0+U2V0Q2hhckFycmF5KG5NYXhMZW4pOwotCi0gICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkgewotICAgICAgICBmRm9udFNpemUgPSBDUFdMX0VkaXQ6OkdldENoYXJBcnJheUF1dG9Gb250U2l6ZShmb250X21hcC5HZXRQREZGb250KDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudCwgbk1heExlbik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChzVmFsdWUpCi0gICAgICAgIG5NYXhMZW4gPSBzVmFsdWUtPkdldExlbmd0aCgpOwotICAgICAgcEVkaXQtPlNldExpbWl0Q2hhcihuTWF4TGVuKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkKLSAgICBwRWRpdC0+U2V0QXV0b0ZvbnRTaXplKHRydWUsIHRydWUpOwotICBlbHNlCi0gICAgcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7Ci0KLSAgcEVkaXQtPkluaXRpYWxpemUoKTsKLSAgcEVkaXQtPlNldFRleHQoc1ZhbHVlID8gKnNWYWx1ZSA6IHBGaWVsZC0+R2V0VmFsdWUoKSk7Ci0KLSAgQ0ZYX0Zsb2F0UmVjdCByY0NvbnRlbnQgPSBwRWRpdC0+R2V0Q29udGVudFJlY3QoKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgc0VkaXQgPSBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKAotICAgICAgcEVkaXQuZ2V0KCksIENGWF9Qb2ludEYoKSwgbnVsbHB0ciwgIWJDaGFyQXJyYXksIHN1YldvcmQpOwotCi0gIGlmIChzRWRpdC5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICBzQm9keSA8PCAiL1R4IEJNQ1xuIgotICAgICAgICAgIDw8ICJxXG4iOwotICAgIGlmIChyY0NvbnRlbnQuV2lkdGgoKSA+IHJjQ2xpZW50LldpZHRoKCkgfHwKLSAgICAgICAgcmNDb250ZW50LkhlaWdodCgpID4gcmNDbGllbnQuSGVpZ2h0KCkpIHsKLSAgICAgIHNCb2R5IDw8IHJjQ2xpZW50LmxlZnQgPDwgIiAiIDw8IHJjQ2xpZW50LmJvdHRvbSA8PCAiICIKLSAgICAgICAgICAgIDw8IHJjQ2xpZW50LldpZHRoKCkgPDwgIiAiIDw8IHJjQ2xpZW50LkhlaWdodCgpIDw8ICIgcmVcbldcbm5cbiI7Ci0gICAgfQotICAgIENQV0xfQ29sb3IgY3JUZXh0ID0gR2V0VGV4dFBXTENvbG9yKCk7Ci0gICAgc0JvZHkgPDwgIkJUXG4iCi0gICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0KSA8PCBzRWRpdCA8PCAiRVRcbiIKLSAgICAgICAgICA8PCAiUVxuRU1DXG4iOwotICB9Ci0KLSAgaWYgKGJDaGFyQXJyYXkpIHsKLSAgICBzd2l0Y2ggKEdldEJvcmRlclN0eWxlKCkpIHsKLSAgICAgIGNhc2UgQm9yZGVyU3R5bGU6OlNPTElEOiB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHNDb2xvciA9Ci0gICAgICAgICAgICBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCb3JkZXJQV0xDb2xvcigpLCBmYWxzZSk7Ci0gICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgc0xpbmVzIDw8ICJxXG4iCi0gICAgICAgICAgICAgICAgIDw8IEdldEJvcmRlcldpZHRoKCkgPDwgIiB3XG4iCi0gICAgICAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlclBXTENvbG9yKCksIGZhbHNlKQotICAgICAgICAgICAgICAgICA8PCAiIDIgSiAwIGpcbiI7Ci0KLSAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBuTWF4TGVuOyArK2kpIHsKLSAgICAgICAgICAgIHNMaW5lcyA8PCByY0NsaWVudC5sZWZ0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpIC8gbk1heExlbikgKiBpCi0gICAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IHJjQ2xpZW50LmJvdHRvbSA8PCAiIG1cbiIKLSAgICAgICAgICAgICAgICAgICA8PCByY0NsaWVudC5sZWZ0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpIC8gbk1heExlbikgKiBpCi0gICAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IHJjQ2xpZW50LnRvcCA8PCAiIGwgU1xuIjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzTGluZXMgPDwgIlFcbiI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEJvcmRlclN0eWxlOjpEQVNIOiB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHNDb2xvciA9Ci0gICAgICAgICAgICBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCb3JkZXJQV0xDb2xvcigpLCBmYWxzZSk7Ci0gICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgQ1BXTF9EYXNoIGRzQm9yZGVyID0gQ1BXTF9EYXNoKDMsIDMsIDApOwotCi0gICAgICAgICAgc0xpbmVzIDw8ICJxXG4iCi0gICAgICAgICAgICAgICAgIDw8IEdldEJvcmRlcldpZHRoKCkgPDwgIiB3XG4iCi0gICAgICAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlclBXTENvbG9yKCksIGZhbHNlKQotICAgICAgICAgICAgICAgICA8PCAiWyIgPDwgZHNCb3JkZXIubkRhc2ggPDwgIiAiIDw8IGRzQm9yZGVyLm5HYXAgPDwgIl0gIgotICAgICAgICAgICAgICAgICA8PCBkc0JvcmRlci5uUGhhc2UgPDwgIiBkXG4iOwotCi0gICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgbk1heExlbjsgKytpKSB7Ci0gICAgICAgICAgICBzTGluZXMgPDwgcmNDbGllbnQubGVmdCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KSAvIG5NYXhMZW4pICogaQotICAgICAgICAgICAgICAgICAgIDw8ICIgIiA8PCByY0NsaWVudC5ib3R0b20gPDwgIiBtXG4iCi0gICAgICAgICAgICAgICAgICAgPDwgcmNDbGllbnQubGVmdCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KSAvIG5NYXhMZW4pICogaQotICAgICAgICAgICAgICAgICAgIDw8ICIgIiA8PCByY0NsaWVudC50b3AgPDwgIiBsIFNcbiI7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgc0xpbmVzIDw8ICJRXG4iOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgc0FQID0gR2V0QmFja2dyb3VuZEFwcFN0cmVhbSgpICsgR2V0Qm9yZGVyQXBwU3RyZWFtKCkgKwotICAgICAgICAgICAgICAgICAgICAgICBzTGluZXMuQXNTdHJpbmdDKCkgKyBzQm9keS5Bc1N0cmluZ0MoKTsKLSAgV3JpdGVBcHBlYXJhbmNlKCJOIiwgR2V0Um90YXRlZFJlY3QoKSwgR2V0TWF0cml4KCksIHNBUCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgbV9wSW50ZXJGb3JtLT5HZXRIaWdobGlnaHRDb2xvcihmaWVsZFR5cGUpKSk7CiB9CiAKIENGWF9GbG9hdFJlY3QgQ1BERlNES19XaWRnZXQ6OkdldENsaWVudFJlY3QoKSBjb25zdCB7CiAgIENGWF9GbG9hdFJlY3QgcmNXaW5kb3cgPSBHZXRSb3RhdGVkUmVjdCgpOwotICBGWF9GTE9BVCBmQm9yZGVyV2lkdGggPSAoRlhfRkxPQVQpR2V0Qm9yZGVyV2lkdGgoKTsKKyAgZmxvYXQgZkJvcmRlcldpZHRoID0gKGZsb2F0KUdldEJvcmRlcldpZHRoKCk7CiAgIHN3aXRjaCAoR2V0Qm9yZGVyU3R5bGUoKSkgewogICAgIGNhc2UgQm9yZGVyU3R5bGU6OkJFVkVMRUQ6CiAgICAgY2FzZSBCb3JkZXJTdHlsZTo6SU5TRVQ6CkBAIC0xNjUxLDE0ICs4NzEsMTMgQEAKICAgICBkZWZhdWx0OgogICAgICAgYnJlYWs7CiAgIH0KLQotICByZXR1cm4gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmNXaW5kb3csIGZCb3JkZXJXaWR0aCk7CisgIHJldHVybiByY1dpbmRvdy5HZXREZWZsYXRlZChmQm9yZGVyV2lkdGgsIGZCb3JkZXJXaWR0aCk7CiB9CiAKIENGWF9GbG9hdFJlY3QgQ1BERlNES19XaWRnZXQ6OkdldFJvdGF0ZWRSZWN0KCkgY29uc3QgewogICBDRlhfRmxvYXRSZWN0IHJlY3RBbm5vdCA9IEdldFJlY3QoKTsKLSAgRlhfRkxPQVQgZldpZHRoID0gcmVjdEFubm90LnJpZ2h0IC0gcmVjdEFubm90LmxlZnQ7Ci0gIEZYX0ZMT0FUIGZIZWlnaHQgPSByZWN0QW5ub3QudG9wIC0gcmVjdEFubm90LmJvdHRvbTsKKyAgZmxvYXQgZldpZHRoID0gcmVjdEFubm90LnJpZ2h0IC0gcmVjdEFubm90LmxlZnQ7CisgIGZsb2F0IGZIZWlnaHQgPSByZWN0QW5ub3QudG9wIC0gcmVjdEFubm90LmJvdHRvbTsKIAogICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IEdldEZvcm1Db250cm9sKCk7CiAgIENGWF9GbG9hdFJlY3QgcmNQREZXaW5kb3c7CkBAIC0xNjc3LDU4ICs4OTYsMTYgQEAKICAgcmV0dXJuIHJjUERGV2luZG93OwogfQogCi1DRlhfQnl0ZVN0cmluZyBDUERGU0RLX1dpZGdldDo6R2V0QmFja2dyb3VuZEFwcFN0cmVhbSgpIGNvbnN0IHsKLSAgQ1BXTF9Db2xvciBjckJhY2tncm91bmQgPSBHZXRGaWxsUFdMQ29sb3IoKTsKLSAgaWYgKGNyQmFja2dyb3VuZC5uQ29sb3JUeXBlICE9IENPTE9SVFlQRV9UUkFOU1BBUkVOVCkKLSAgICByZXR1cm4gQ1BXTF9VdGlsczo6R2V0UmVjdEZpbGxBcHBTdHJlYW0oR2V0Um90YXRlZFJlY3QoKSwgY3JCYWNrZ3JvdW5kKTsKLQotICByZXR1cm4gIiI7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQREZTREtfV2lkZ2V0OjpHZXRCb3JkZXJBcHBTdHJlYW0oKSBjb25zdCB7Ci0gIENGWF9GbG9hdFJlY3QgcmNXaW5kb3cgPSBHZXRSb3RhdGVkUmVjdCgpOwotICBDUFdMX0NvbG9yIGNyQm9yZGVyID0gR2V0Qm9yZGVyUFdMQ29sb3IoKTsKLSAgQ1BXTF9Db2xvciBjckJhY2tncm91bmQgPSBHZXRGaWxsUFdMQ29sb3IoKTsKLSAgQ1BXTF9Db2xvciBjckxlZnRUb3AsIGNyUmlnaHRCb3R0b207Ci0KLSAgRlhfRkxPQVQgZkJvcmRlcldpZHRoID0gKEZYX0ZMT0FUKUdldEJvcmRlcldpZHRoKCk7Ci0gIENQV0xfRGFzaCBkc0JvcmRlcigzLCAwLCAwKTsKLQotICBCb3JkZXJTdHlsZSBuQm9yZGVyU3R5bGUgPSBHZXRCb3JkZXJTdHlsZSgpOwotICBzd2l0Y2ggKG5Cb3JkZXJTdHlsZSkgewotICAgIGNhc2UgQm9yZGVyU3R5bGU6OkRBU0g6Ci0gICAgICBkc0JvcmRlciA9IENQV0xfRGFzaCgzLCAzLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQm9yZGVyU3R5bGU6OkJFVkVMRUQ6Ci0gICAgICBmQm9yZGVyV2lkdGggKj0gMjsKLSAgICAgIGNyTGVmdFRvcCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpOwotICAgICAgY3JSaWdodEJvdHRvbSA9IGNyQmFja2dyb3VuZCAvIDIuMGY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJvcmRlclN0eWxlOjpJTlNFVDoKLSAgICAgIGZCb3JkZXJXaWR0aCAqPSAyOwotICAgICAgY3JMZWZ0VG9wID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMC41KTsKLSAgICAgIGNyUmlnaHRCb3R0b20gPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjc1KTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBDUFdMX1V0aWxzOjpHZXRCb3JkZXJBcHBTdHJlYW0ocmNXaW5kb3csIGZCb3JkZXJXaWR0aCwgY3JCb3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JMZWZ0VG9wLCBjclJpZ2h0Qm90dG9tLCBuQm9yZGVyU3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNCb3JkZXIpOwotfQotCiBDRlhfTWF0cml4IENQREZTREtfV2lkZ2V0OjpHZXRNYXRyaXgoKSBjb25zdCB7CiAgIENGWF9NYXRyaXggbXQ7CiAgIENQREZfRm9ybUNvbnRyb2wqIHBDb250cm9sID0gR2V0Rm9ybUNvbnRyb2woKTsKICAgQ0ZYX0Zsb2F0UmVjdCByY0Fubm90ID0gR2V0UmVjdCgpOwotICBGWF9GTE9BVCBmV2lkdGggPSByY0Fubm90LnJpZ2h0IC0gcmNBbm5vdC5sZWZ0OwotICBGWF9GTE9BVCBmSGVpZ2h0ID0gcmNBbm5vdC50b3AgLSByY0Fubm90LmJvdHRvbTsKKyAgZmxvYXQgZldpZHRoID0gcmNBbm5vdC5yaWdodCAtIHJjQW5ub3QubGVmdDsKKyAgZmxvYXQgZkhlaWdodCA9IHJjQW5ub3QudG9wIC0gcmNBbm5vdC5ib3R0b207CiAKICAgc3dpdGNoIChhYnMocENvbnRyb2wtPkdldFJvdGF0aW9uKCkgJSAzNjApKSB7Ci0gICAgY2FzZSAwOgogICAgIGRlZmF1bHQ6Ci0gICAgICBtdCA9IENGWF9NYXRyaXgoMSwgMCwgMCwgMSwgMCwgMCk7CisgICAgY2FzZSAwOgogICAgICAgYnJlYWs7CiAgICAgY2FzZSA5MDoKICAgICAgIG10ID0gQ0ZYX01hdHJpeCgwLCAxLCAtMSwgMCwgZldpZHRoLCAwKTsKQEAgLTE3NDQsNzUgKzkyMSw0NyBAQAogICByZXR1cm4gbXQ7CiB9CiAKLUNQV0xfQ29sb3IgQ1BERlNES19XaWRnZXQ6OkdldFRleHRQV0xDb2xvcigpIGNvbnN0IHsKLSAgQ1BXTF9Db2xvciBjclRleHQgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwKTsKK0NGWF9Db2xvciBDUERGU0RLX1dpZGdldDo6R2V0VGV4dFBXTENvbG9yKCkgY29uc3QgeworICBDRlhfQ29sb3IgY3JUZXh0ID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIDApOwogCiAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IEdldEZvcm1Db250cm9sKCk7CiAgIENQREZfRGVmYXVsdEFwcGVhcmFuY2UgZGEgPSBwRm9ybUN0cmwtPkdldERlZmF1bHRBcHBlYXJhbmNlKCk7CiAgIGlmIChkYS5IYXNDb2xvcigpKSB7CiAgICAgaW50MzJfdCBpQ29sb3JUeXBlOwotICAgIEZYX0ZMT0FUIGZjWzRdOworICAgIGZsb2F0IGZjWzRdOwogICAgIGRhLkdldENvbG9yKGlDb2xvclR5cGUsIGZjKTsKLSAgICBjclRleHQgPSBDUFdMX0NvbG9yKGlDb2xvclR5cGUsIGZjWzBdLCBmY1sxXSwgZmNbMl0sIGZjWzNdKTsKKyAgICBjclRleHQgPSBDRlhfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOwogICB9CiAKICAgcmV0dXJuIGNyVGV4dDsKIH0KIAotQ1BXTF9Db2xvciBDUERGU0RLX1dpZGdldDo6R2V0Qm9yZGVyUFdMQ29sb3IoKSBjb25zdCB7Ci0gIENQV0xfQ29sb3IgY3JCb3JkZXI7CitDRlhfQ29sb3IgQ1BERlNES19XaWRnZXQ6OkdldEJvcmRlclBXTENvbG9yKCkgY29uc3QgeworICBDRlhfQ29sb3IgY3JCb3JkZXI7CiAKICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gR2V0Rm9ybUNvbnRyb2woKTsKICAgaW50MzJfdCBpQ29sb3JUeXBlOwotICBGWF9GTE9BVCBmY1s0XTsKKyAgZmxvYXQgZmNbNF07CiAgIHBGb3JtQ3RybC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpQ29sb3JUeXBlLCBmYyk7CiAgIGlmIChpQ29sb3JUeXBlID4gMCkKLSAgICBjckJvcmRlciA9IENQV0xfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOworICAgIGNyQm9yZGVyID0gQ0ZYX0NvbG9yKGlDb2xvclR5cGUsIGZjWzBdLCBmY1sxXSwgZmNbMl0sIGZjWzNdKTsKIAogICByZXR1cm4gY3JCb3JkZXI7CiB9CiAKLUNQV0xfQ29sb3IgQ1BERlNES19XaWRnZXQ6OkdldEZpbGxQV0xDb2xvcigpIGNvbnN0IHsKLSAgQ1BXTF9Db2xvciBjckZpbGw7CitDRlhfQ29sb3IgQ1BERlNES19XaWRnZXQ6OkdldEZpbGxQV0xDb2xvcigpIGNvbnN0IHsKKyAgQ0ZYX0NvbG9yIGNyRmlsbDsKIAogICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBHZXRGb3JtQ29udHJvbCgpOwogICBpbnQzMl90IGlDb2xvclR5cGU7Ci0gIEZYX0ZMT0FUIGZjWzRdOworICBmbG9hdCBmY1s0XTsKICAgcEZvcm1DdHJsLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcihpQ29sb3JUeXBlLCBmYyk7CiAgIGlmIChpQ29sb3JUeXBlID4gMCkKLSAgICBjckZpbGwgPSBDUFdMX0NvbG9yKGlDb2xvclR5cGUsIGZjWzBdLCBmY1sxXSwgZmNbMl0sIGZjWzNdKTsKKyAgICBjckZpbGwgPSBDRlhfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOwogCiAgIHJldHVybiBjckZpbGw7CiB9CiAKLXZvaWQgQ1BERlNES19XaWRnZXQ6OkFkZEltYWdlVG9BcHBlYXJhbmNlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW0qIHBJbWFnZSkgewotICBDUERGX0RpY3Rpb25hcnkqIHBBUERpY3QgPSBtX3BBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3RGb3IoIkFQIik7Ci0gIENQREZfU3RyZWFtKiBwU3RyZWFtID0gcEFQRGljdC0+R2V0U3RyZWFtRm9yKHNBUFR5cGUpOwotICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1EaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOwotICBDRlhfQnl0ZVN0cmluZyBzSW1hZ2VBbGlhcyA9ICJJTUciOwotCi0gIGlmIChDUERGX0RpY3Rpb25hcnkqIHBJbWFnZURpY3QgPSBwSW1hZ2UtPkdldERpY3QoKSkgewotICAgIHNJbWFnZUFsaWFzID0gcEltYWdlRGljdC0+R2V0U3RyaW5nRm9yKCJOYW1lIik7Ci0gICAgaWYgKHNJbWFnZUFsaWFzLklzRW1wdHkoKSkKLSAgICAgIHNJbWFnZUFsaWFzID0gIklNRyI7Ci0gIH0KLQotICBDUERGX0RvY3VtZW50KiBwRG9jID0gbV9wUGFnZVZpZXctPkdldFBERkRvY3VtZW50KCk7Ci0gIENQREZfRGljdGlvbmFyeSogcFN0cmVhbVJlc0xpc3QgPSBwU3RyZWFtRGljdC0+R2V0RGljdEZvcigiUmVzb3VyY2VzIik7Ci0gIGlmICghcFN0cmVhbVJlc0xpc3QpCi0gICAgcFN0cmVhbVJlc0xpc3QgPSBwU3RyZWFtRGljdC0+U2V0TmV3Rm9yPENQREZfRGljdGlvbmFyeT4oIlJlc291cmNlcyIpOwotCi0gIENQREZfRGljdGlvbmFyeSogcFhPYmplY3QgPQotICAgICAgcFN0cmVhbVJlc0xpc3QtPlNldE5ld0ZvcjxDUERGX0RpY3Rpb25hcnk+KCJYT2JqZWN0Iik7Ci0gIHBYT2JqZWN0LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KHNJbWFnZUFsaWFzLCBwRG9jLCBwSW1hZ2UtPkdldE9iak51bSgpKTsKLX0KLQotdm9pZCBDUERGU0RLX1dpZGdldDo6UmVtb3ZlQXBwZWFyYW5jZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0FQVHlwZSkgewotICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwQVBEaWN0ID0gbV9wQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXREaWN0Rm9yKCJBUCIpKQotICAgIHBBUERpY3QtPlJlbW92ZUZvcihzQVBUeXBlKTsKLX0KLQogYm9vbCBDUERGU0RLX1dpZGdldDo6T25BQWN0aW9uKENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CkBAIC0xODQzLDcgKzk5Miw3IEBACiAgICAgICAgICAgcGFyYW0ubV93c05ld1RleHQuSW5zZXJ0KGRhdGEublNlbFN0YXJ0LCBkYXRhLnNDaGFuZ2VbaV0pOwogICAgICAgICBwYXJhbS5tX3dzUHJldlRleHQgPSBkYXRhLnNWYWx1ZTsKIAotICAgICAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IGhXaWRnZXQtPkdldERhdGFBY2MoKTsKKyAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBoV2lkZ2V0LT5HZXROb2RlKCktPkdldFdpZGdldEFjYygpOwogICAgICAgICBwYXJhbS5tX3BUYXJnZXQgPSBwQWNjOwogICAgICAgICBpbnQzMl90IG5SZXQgPSBwWEZBV2lkZ2V0SGFuZGxlci0+UHJvY2Vzc0V2ZW50KHBBY2MsICZwYXJhbSk7CiAKQEAgLTE4NTksNyArMTAwOCw3IEBACiAKICAgQ1BERl9BY3Rpb24gYWN0aW9uID0gR2V0QUFjdGlvbih0eXBlKTsKICAgaWYgKGFjdGlvbi5HZXREaWN0KCkgJiYgYWN0aW9uLkdldFR5cGUoKSAhPSBDUERGX0FjdGlvbjo6VW5rbm93bikgewotICAgIENQREZTREtfQWN0aW9uSGFuZGxlciogcEFjdGlvbkhhbmRsZXIgPSBwRm9ybUZpbGxFbnYtPkdldEFjdGlvbkhhbmRlcigpOworICAgIENQREZTREtfQWN0aW9uSGFuZGxlciogcEFjdGlvbkhhbmRsZXIgPSBwRm9ybUZpbGxFbnYtPkdldEFjdGlvbkhhbmRsZXIoKTsKICAgICByZXR1cm4gcEFjdGlvbkhhbmRsZXItPkRvQWN0aW9uX0ZpZWxkKGFjdGlvbiwgdHlwZSwgcEZvcm1GaWxsRW52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Rm9ybUZpZWxkKCksIGRhdGEpOwogICB9CkBAIC0xODkzLDE4ICsxMDQyLDEwIEBACiAgICAgICBicmVhazsKICAgfQogCi0gIHJldHVybiBDUERGX0FjdGlvbigpOworICByZXR1cm4gQ1BERl9BY3Rpb24obnVsbHB0cik7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQREZTREtfV2lkZ2V0OjpHZXRBbHRlcm5hdGVOYW1lKCkgY29uc3QgeworV2lkZVN0cmluZyBDUERGU0RLX1dpZGdldDo6R2V0QWx0ZXJuYXRlTmFtZSgpIGNvbnN0IHsKICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBHZXRGb3JtRmllbGQoKTsKICAgcmV0dXJuIHBGb3JtRmllbGQtPkdldEFsdGVybmF0ZU5hbWUoKTsKIH0KLQotaW50MzJfdCBDUERGU0RLX1dpZGdldDo6R2V0QXBwZWFyYW5jZUFnZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fbkFwcEFnZTsKLX0KLQotaW50MzJfdCBDUERGU0RLX1dpZGdldDo6R2V0VmFsdWVBZ2UoKSBjb25zdCB7Ci0gIHJldHVybiBtX25WYWx1ZUFnZTsKLX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvY3BkZnNka193aWRnZXQuaCBiL2ZwZGZzZGsvY3BkZnNka193aWRnZXQuaAppbmRleCAyMWU1MTY5Li40YjExMTUwIDEwMDY0NAotLS0gYS9mcGRmc2RrL2NwZGZzZGtfd2lkZ2V0LmgKKysrIGIvZnBkZnNkay9jcGRmc2RrX3dpZGdldC5oCkBAIC0xNCw5ICsxNCwxMCBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2Fubm90LmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfY29sb3IuaCIKICNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfYmFhbm5vdC5oIgogI2luY2x1ZGUgImZwZGZzZGsvcGRmc2RrX2ZpZWxkYWN0aW9uLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvY3B3bF9jb2xvci5oIgogCiBjbGFzcyBDRlhfUmVuZGVyRGV2aWNlOwogY2xhc3MgQ1BERl9Bbm5vdDsKQEAgLTcwLDIzICs3MSwyMyBAQAogCiAgIGludCBHZXRMYXlvdXRPcmRlcigpIGNvbnN0IG92ZXJyaWRlOwogCi0gIGludCBHZXRGaWVsZFR5cGUoKSBjb25zdDsKKyAgRm9ybUZpZWxkVHlwZSBHZXRGaWVsZFR5cGUoKSBjb25zdDsKICAgaW50IEdldEZpZWxkRmxhZ3MoKSBjb25zdDsKICAgaW50IEdldFJvdGF0ZSgpIGNvbnN0OwogCiAgIGJvb2wgR2V0RmlsbENvbG9yKEZYX0NPTE9SUkVGJiBjb2xvcikgY29uc3Q7CiAgIGJvb2wgR2V0Qm9yZGVyQ29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdDsKICAgYm9vbCBHZXRUZXh0Q29sb3IoRlhfQ09MT1JSRUYmIGNvbG9yKSBjb25zdDsKLSAgRlhfRkxPQVQgR2V0Rm9udFNpemUoKSBjb25zdDsKKyAgZmxvYXQgR2V0Rm9udFNpemUoKSBjb25zdDsKIAogICBpbnQgR2V0U2VsZWN0ZWRJbmRleChpbnQgbkluZGV4KSBjb25zdDsKICNpZm5kZWYgUERGX0VOQUJMRV9YRkEKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0VmFsdWUoKSBjb25zdDsKKyAgV2lkZVN0cmluZyBHZXRWYWx1ZSgpIGNvbnN0OwogI2Vsc2UKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0VmFsdWUoYm9vbCBiRGlzcGxheSA9IHRydWUpIGNvbnN0OworICBXaWRlU3RyaW5nIEdldFZhbHVlKGJvb2wgYkRpc3BsYXkgPSB0cnVlKSBjb25zdDsKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0RGVmYXVsdFZhbHVlKCkgY29uc3Q7Ci0gIENGWF9XaWRlU3RyaW5nIEdldE9wdGlvbkxhYmVsKGludCBuSW5kZXgpIGNvbnN0OworICBXaWRlU3RyaW5nIEdldERlZmF1bHRWYWx1ZSgpIGNvbnN0OworICBXaWRlU3RyaW5nIEdldE9wdGlvbkxhYmVsKGludCBuSW5kZXgpIGNvbnN0OwogICBpbnQgQ291bnRPcHRpb25zKCkgY29uc3Q7CiAgIGJvb2wgSXNPcHRpb25TZWxlY3RlZChpbnQgbkluZGV4KSBjb25zdDsKICAgaW50IEdldFRvcFZpc2libGVJbmRleCgpIGNvbnN0OwpAQCAtOTQsMTMgKzk1LDEzIEBACiAgIGludCBHZXRBbGlnbm1lbnQoKSBjb25zdDsKICAgaW50IEdldE1heExlbigpIGNvbnN0OwogI2lmZGVmIFBERl9FTkFCTEVfWEZBCi0gIENGWF9XaWRlU3RyaW5nIEdldE5hbWUoKSBjb25zdDsKKyAgV2lkZVN0cmluZyBHZXROYW1lKCkgY29uc3Q7CiAjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCi0gIENGWF9XaWRlU3RyaW5nIEdldEFsdGVybmF0ZU5hbWUoKSBjb25zdDsKKyAgV2lkZVN0cmluZyBHZXRBbHRlcm5hdGVOYW1lKCkgY29uc3Q7CiAKICAgdm9pZCBTZXRDaGVjayhib29sIGJDaGVja2VkLCBib29sIGJOb3RpZnkpOwotICB2b2lkIFNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVmFsdWUsIGJvb2wgYk5vdGlmeSk7Ci0gIHZvaWQgU2V0RGVmYXVsdFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVmFsdWUpOworICB2b2lkIFNldFZhbHVlKGNvbnN0IFdpZGVTdHJpbmcmIHNWYWx1ZSwgYm9vbCBiTm90aWZ5KTsKKyAgdm9pZCBTZXREZWZhdWx0VmFsdWUoY29uc3QgV2lkZVN0cmluZyYgc1ZhbHVlKTsKICAgdm9pZCBTZXRPcHRpb25TZWxlY3Rpb24oaW50IGluZGV4LCBib29sIGJTZWxlY3RlZCwgYm9vbCBiTm90aWZ5KTsKICAgdm9pZCBDbGVhclNlbGVjdGlvbihib29sIGJOb3RpZnkpOwogICB2b2lkIFNldFRvcFZpc2libGVJbmRleChpbnQgaW5kZXgpOwpAQCAtMTA4LDE2ICsxMDksMTYgQEAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQogICB2b2lkIFJlc2V0QXBwZWFyYW5jZShib29sIGJWYWx1ZUNoYW5nZWQpOwogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQotICB2b2lkIFJlc2V0QXBwZWFyYW5jZShjb25zdCBDRlhfV2lkZVN0cmluZyogc1ZhbHVlLCBib29sIGJWYWx1ZUNoYW5nZWQpOworICB2b2lkIFJlc2V0QXBwZWFyYW5jZShjb25zdCBXaWRlU3RyaW5nKiBzVmFsdWUsIGJvb2wgYlZhbHVlQ2hhbmdlZCk7CiAgIHZvaWQgUmVzZXRGaWVsZEFwcGVhcmFuY2UoYm9vbCBiVmFsdWVDaGFuZ2VkKTsKICAgdm9pZCBVcGRhdGVGaWVsZCgpOwotICBDRlhfV2lkZVN0cmluZyBPbkZvcm1hdChib29sJiBiRm9ybWF0dGVkKTsKKyAgV2lkZVN0cmluZyBPbkZvcm1hdChib29sJiBiRm9ybWF0dGVkKTsKIAogICBib29sIE9uQUFjdGlvbihDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCiAgICAgICAgICAgICAgICAgIFBERlNES19GaWVsZEFjdGlvbiYgZGF0YSwKICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKIAotICBDUERGU0RLX0ludGVyRm9ybSogR2V0SW50ZXJGb3JtKCkgY29uc3QgeyByZXR1cm4gbV9wSW50ZXJGb3JtOyB9CisgIENQREZTREtfSW50ZXJGb3JtKiBHZXRJbnRlckZvcm0oKSBjb25zdCB7IHJldHVybiBtX3BJbnRlckZvcm0uR2V0KCk7IH0KICAgQ1BERl9Gb3JtRmllbGQqIEdldEZvcm1GaWVsZCgpIGNvbnN0OwogICBDUERGX0Zvcm1Db250cm9sKiBHZXRGb3JtQ29udHJvbCgpIGNvbnN0OwogICBzdGF0aWMgQ1BERl9Gb3JtQ29udHJvbCogR2V0Rm9ybUNvbnRyb2woQ1BERl9JbnRlckZvcm0qIHBJbnRlckZvcm0sCkBAIC0xMjksNDUgKzEzMCwzMSBAQAogICB2b2lkIENsZWFyQXBwTW9kaWZpZWQoKTsKICAgYm9vbCBJc0FwcE1vZGlmaWVkKCkgY29uc3Q7CiAKLSAgaW50MzJfdCBHZXRBcHBlYXJhbmNlQWdlKCkgY29uc3Q7Ci0gIGludDMyX3QgR2V0VmFsdWVBZ2UoKSBjb25zdDsKKyAgdWludDMyX3QgR2V0QXBwZWFyYW5jZUFnZSgpIGNvbnN0IHsgcmV0dXJuIG1fbkFwcGVhcmFuY2VBZ2U7IH0KKyAgdWludDMyX3QgR2V0VmFsdWVBZ2UoKSBjb25zdCB7IHJldHVybiBtX25WYWx1ZUFnZTsgfQogCiAgIGJvb2wgSXNXaWRnZXRBcHBlYXJhbmNlVmFsaWQoQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGUgbW9kZSk7CiAgIHZvaWQgRHJhd0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbXRVc2VyMkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZSBtb2RlLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQREZfUmVuZGVyT3B0aW9ucyogcE9wdGlvbnMpIG92ZXJyaWRlOwogCi0gcHJpdmF0ZToKLSAgdm9pZCBSZXNldEFwcGVhcmFuY2VfUHVzaEJ1dHRvbigpOwotICB2b2lkIFJlc2V0QXBwZWFyYW5jZV9DaGVja0JveCgpOwotICB2b2lkIFJlc2V0QXBwZWFyYW5jZV9SYWRpb0J1dHRvbigpOwotICB2b2lkIFJlc2V0QXBwZWFyYW5jZV9Db21ib0JveChjb25zdCBDRlhfV2lkZVN0cmluZyogc1ZhbHVlKTsKLSAgdm9pZCBSZXNldEFwcGVhcmFuY2VfTGlzdEJveCgpOwotICB2b2lkIFJlc2V0QXBwZWFyYW5jZV9UZXh0RmllbGQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcqIHNWYWx1ZSk7Ci0KKyAgQ0ZYX01hdHJpeCBHZXRNYXRyaXgoKSBjb25zdDsKICAgQ0ZYX0Zsb2F0UmVjdCBHZXRDbGllbnRSZWN0KCkgY29uc3Q7CiAgIENGWF9GbG9hdFJlY3QgR2V0Um90YXRlZFJlY3QoKSBjb25zdDsKKyAgQ0ZYX0NvbG9yIEdldFRleHRQV0xDb2xvcigpIGNvbnN0OworICBDRlhfQ29sb3IgR2V0Qm9yZGVyUFdMQ29sb3IoKSBjb25zdDsKKyAgQ0ZYX0NvbG9yIEdldEZpbGxQV0xDb2xvcigpIGNvbnN0OwogCi0gIENGWF9CeXRlU3RyaW5nIEdldEJhY2tncm91bmRBcHBTdHJlYW0oKSBjb25zdDsKLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0Qm9yZGVyQXBwU3RyZWFtKCkgY29uc3Q7Ci0gIENGWF9NYXRyaXggR2V0TWF0cml4KCkgY29uc3Q7Ci0KLSAgQ1BXTF9Db2xvciBHZXRUZXh0UFdMQ29sb3IoKSBjb25zdDsKLSAgQ1BXTF9Db2xvciBHZXRCb3JkZXJQV0xDb2xvcigpIGNvbnN0OwotICBDUFdMX0NvbG9yIEdldEZpbGxQV0xDb2xvcigpIGNvbnN0OwotCi0gIHZvaWQgQWRkSW1hZ2VUb0FwcGVhcmFuY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBUFR5cGUsIENQREZfU3RyZWFtKiBwSW1hZ2UpOwotICB2b2lkIFJlbW92ZUFwcGVhcmFuY2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBUFR5cGUpOwotCi0gIENQREZTREtfSW50ZXJGb3JtKiBjb25zdCBtX3BJbnRlckZvcm07CisgcHJpdmF0ZToKKyAgVW5vd25lZFB0cjxDUERGU0RLX0ludGVyRm9ybT4gY29uc3QgbV9wSW50ZXJGb3JtOwogICBib29sIG1fYkFwcE1vZGlmaWVkOwotICBpbnQzMl90IG1fbkFwcEFnZTsKLSAgaW50MzJfdCBtX25WYWx1ZUFnZTsKKyAgdWludDMyX3QgbV9uQXBwZWFyYW5jZUFnZTsKKyAgdWludDMyX3QgbV9uVmFsdWVBZ2U7CiAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQotICBtdXRhYmxlIENYRkFfRkZXaWRnZXQqIG1faE1peFhGQVdpZGdldDsKLSAgbXV0YWJsZSBDWEZBX0ZGV2lkZ2V0SGFuZGxlciogbV9wV2lkZ2V0SGFuZGxlcjsKKyAgbXV0YWJsZSBVbm93bmVkUHRyPENYRkFfRkZXaWRnZXQ+IG1faE1peFhGQVdpZGdldDsKKyAgbXV0YWJsZSBVbm93bmVkUHRyPENYRkFfRkZXaWRnZXRIYW5kbGVyPiBtX3BXaWRnZXRIYW5kbGVyOwogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogfTsKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9jcGRmc2RrX3dpZGdldGhhbmRsZXIuY3BwIGIvZnBkZnNkay9jcGRmc2RrX3dpZGdldGhhbmRsZXIuY3BwCmluZGV4IGU4NWQyNGMuLmRjY2U3YjYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvY3BkZnNka193aWRnZXRoYW5kbGVyLmNwcAorKysgYi9mcGRmc2RrL2NwZGZzZGtfd2lkZ2V0aGFuZGxlci5jcHAKQEAgLTI1LDcgKzI1LDggQEAKIAogQ1BERlNES19XaWRnZXRIYW5kbGVyOjpDUERGU0RLX1dpZGdldEhhbmRsZXIoCiAgICAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpCi0gICAgOiBtX3BGb3JtRmlsbEVudihwRm9ybUZpbGxFbnYpLCBtX3BGb3JtRmlsbGVyKG51bGxwdHIpIHt9CisgICAgOiBtX3BGb3JtRmlsbEVudihwRm9ybUZpbGxFbnYpLAorICAgICAgbV9wRm9ybUZpbGxlcihwRm9ybUZpbGxFbnYtPkdldEludGVyYWN0aXZlRm9ybUZpbGxlcigpKSB7fQogCiBDUERGU0RLX1dpZGdldEhhbmRsZXI6On5DUERGU0RLX1dpZGdldEhhbmRsZXIoKSB7fQogCkBAIC00MiwxMiArNDMsMTEgQEAKICAgaWYgKChuRmllbGRGbGFncyAmIEZJRUxERkxBR19SRUFET05MWSkgPT0gRklFTERGTEFHX1JFQURPTkxZKQogICAgIHJldHVybiBmYWxzZTsKIAotICBpZiAocFdpZGdldC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1BVU0hCVVRUT04pCisgIGlmIChwV2lkZ2V0LT5HZXRGaWVsZFR5cGUoKSA9PSBGb3JtRmllbGRUeXBlOjprUHVzaEJ1dHRvbikKICAgICByZXR1cm4gdHJ1ZTsKIAogICBDUERGX1BhZ2UqIHBQYWdlID0gcFdpZGdldC0+R2V0UERGUGFnZSgpOwotICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7Ci0gIHVpbnQzMl90IGR3UGVybWlzc2lvbnMgPSBwRG9jdW1lbnQtPkdldFVzZXJQZXJtaXNzaW9ucygpOworICB1aW50MzJfdCBkd1Blcm1pc3Npb25zID0gcFBhZ2UtPm1fcERvY3VtZW50LT5HZXRVc2VyUGVybWlzc2lvbnMoKTsKICAgcmV0dXJuIChkd1Blcm1pc3Npb25zICYgRlBERlBFUk1fRklMTF9GT1JNKSB8fAogICAgICAgICAgKGR3UGVybWlzc2lvbnMgJiBGUERGUEVSTV9BTk5PVF9GT1JNKTsKIH0KQEAgLTk1LDcgKzk1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRHJhd0Fubm90cykgewogICBpZiAocEFubm90LT5Jc1NpZ25hdHVyZVdpZGdldCgpKSB7CiAgICAgc3RhdGljX2Nhc3Q8Q1BERlNES19CQUFubm90Kj4ocEFubm90KS0+RHJhd0FwcGVhcmFuY2UoCi0gICAgICAgIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Bbm5vdDo6Tm9ybWFsLCBudWxscHRyKTsKKyAgICAgICAgcERldmljZSwgKnBVc2VyMkRldmljZSwgQ1BERl9Bbm5vdDo6Tm9ybWFsLCBudWxscHRyKTsKICAgfSBlbHNlIHsKICAgICBpZiAobV9wRm9ybUZpbGxlcikKICAgICAgIG1fcEZvcm1GaWxsZXItPk9uRHJhdyhwUGFnZVZpZXcsIHBBbm5vdCwgcERldmljZSwgcFVzZXIyRGV2aWNlKTsKQEAgLTIyNywxOCArMjI3LDIzIEBACiAgIGlmICghcFdpZGdldC0+SXNBcHBlYXJhbmNlVmFsaWQoKSkKICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UobnVsbHB0ciwgZmFsc2UpOwogCi0gIGludCBuRmllbGRUeXBlID0gcFdpZGdldC0+R2V0RmllbGRUeXBlKCk7Ci0gIGlmIChuRmllbGRUeXBlID09IEZJRUxEVFlQRV9URVhURklFTEQgfHwgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1gpIHsKKyAgRm9ybUZpZWxkVHlwZSBmaWVsZFR5cGUgPSBwV2lkZ2V0LT5HZXRGaWVsZFR5cGUoKTsKKyAgaWYgKGZpZWxkVHlwZSA9PSBGb3JtRmllbGRUeXBlOjprVGV4dEZpZWxkIHx8CisgICAgICBmaWVsZFR5cGUgPT0gRm9ybUZpZWxkVHlwZTo6a0NvbWJvQm94KSB7CiAgICAgYm9vbCBiRm9ybWF0dGVkID0gZmFsc2U7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gcFdpZGdldC0+T25Gb3JtYXQoYkZvcm1hdHRlZCk7Ci0gICAgaWYgKGJGb3JtYXR0ZWQgJiYgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1gpCisgICAgQ1BERlNES19Bbm5vdDo6T2JzZXJ2ZWRQdHIgcE9ic2VydmVkKHBXaWRnZXQpOworICAgIFdpZGVTdHJpbmcgc1ZhbHVlID0gcFdpZGdldC0+T25Gb3JtYXQoYkZvcm1hdHRlZCk7CisgICAgaWYgKCFwT2JzZXJ2ZWQpCisgICAgICByZXR1cm47CisKKyAgICBpZiAoYkZvcm1hdHRlZCAmJiBmaWVsZFR5cGUgPT0gRm9ybUZpZWxkVHlwZTo6a0NvbWJvQm94KQogICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKCZzVmFsdWUsIGZhbHNlKTsKICAgfQogCiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcEFubm90LT5HZXRQYWdlVmlldygpOwogICBDUERGWEZBX0NvbnRleHQqIHBDb250ZXh0ID0gcFBhZ2VWaWV3LT5HZXRGb3JtRmlsbEVudigpLT5HZXRYRkFDb250ZXh0KCk7Ci0gIGlmIChwQ29udGV4dC0+R2V0RG9jVHlwZSgpID09IERPQ1RZUEVfU1RBVElDX1hGQSkgeworICBpZiAocENvbnRleHQtPkdldEZvcm1UeXBlKCkgPT0gRm9ybVR5cGU6OmtYRkFGb3JlZ3JvdW5kKSB7CiAgICAgaWYgKCFwV2lkZ2V0LT5Jc0FwcGVhcmFuY2VWYWxpZCgpICYmICFwV2lkZ2V0LT5HZXRWYWx1ZSgpLklzRW1wdHkoKSkKICAgICAgIHBXaWRnZXQtPlJlc2V0QXBwZWFyYW5jZShmYWxzZSk7CiAgIH0KQEAgLTI3Myw4ICsyNzgsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKICAgaWYgKCFwQW5ub3QtPklzU2lnbmF0dXJlV2lkZ2V0KCkgJiYgbV9wRm9ybUZpbGxlcikKICAgICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdChtX3BGb3JtRmlsbGVyLT5HZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCkpOworICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdCgpOworfQogCi0gIHJldHVybiBDRlhfRmxvYXRSZWN0KDAsIDAsIDAsIDApOworV2lkZVN0cmluZyBDUERGU0RLX1dpZGdldEhhbmRsZXI6OkdldFNlbGVjdGVkVGV4dChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKKyAgaWYgKCFwQW5ub3QtPklzU2lnbmF0dXJlV2lkZ2V0KCkgJiYgbV9wRm9ybUZpbGxlcikKKyAgICByZXR1cm4gbV9wRm9ybUZpbGxlci0+R2V0U2VsZWN0ZWRUZXh0KHBBbm5vdCk7CisKKyAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKK30KKwordm9pZCBDUERGU0RLX1dpZGdldEhhbmRsZXI6OlJlcGxhY2VTZWxlY3Rpb24oQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgdGV4dCkgeworICBpZiAoIXBBbm5vdC0+SXNTaWduYXR1cmVXaWRnZXQoKSAmJiBtX3BGb3JtRmlsbGVyKQorICAgIG1fcEZvcm1GaWxsZXItPlJlcGxhY2VTZWxlY3Rpb24ocEFubm90LCB0ZXh0KTsKIH0KIAogYm9vbCBDUERGU0RLX1dpZGdldEhhbmRsZXI6OkhpdFRlc3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LApkaWZmIC0tZ2l0IGEvZnBkZnNkay9jcGRmc2RrX3dpZGdldGhhbmRsZXIuaCBiL2ZwZGZzZGsvY3BkZnNka193aWRnZXRoYW5kbGVyLmgKaW5kZXggNmU0ZDUwYi4uZjhhYTdkZSAxMDA2NDQKLS0tIGEvZnBkZnNkay9jcGRmc2RrX3dpZGdldGhhbmRsZXIuaAorKysgYi9mcGRmc2RrL2NwZGZzZGtfd2lkZ2V0aGFuZGxlci5oCkBAIC03LDggKzcsOCBAQAogI2lmbmRlZiBGUERGU0RLX0NQREZTREtfV0lER0VUSEFORExFUl9IXwogI2RlZmluZSBGUERGU0RLX0NQREZTREtfV0lER0VUSEFORExFUl9IXwogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAjaW5jbHVkZSAiZnBkZnNkay9pcGRmc2RrX2Fubm90aGFuZGxlci5oIgogCiBjbGFzcyBDRkZMX0ludGVyYWN0aXZlRm9ybUZpbGxlcjsKQEAgLTM3LDYgKzM3LDggQEAKICAgdm9pZCBSZWxlYXNlQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90KSBvdmVycmlkZTsKICAgQ0ZYX0Zsb2F0UmVjdCBHZXRWaWV3QkJveChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90KSBvdmVycmlkZTsKKyAgV2lkZVN0cmluZyBHZXRTZWxlY3RlZFRleHQoQ1BERlNES19Bbm5vdCogcEFubm90KSBvdmVycmlkZTsKKyAgdm9pZCBSZXBsYWNlU2VsZWN0aW9uKENQREZTREtfQW5ub3QqIHBBbm5vdCwgY29uc3QgV2lkZVN0cmluZyYgdGV4dCkgb3ZlcnJpZGU7CiAgIGJvb2wgSGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCiAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCiAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7CkBAIC05NiwxNCArOTgsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciogcE5ld0Fubm90KSBvdmVycmlkZTsKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotICB2b2lkIFNldEZvcm1GaWxsZXIoQ0ZGTF9JbnRlcmFjdGl2ZUZvcm1GaWxsZXIqIHBGaWxsZXIpIHsKLSAgICBtX3BGb3JtRmlsbGVyID0gcEZpbGxlcjsKKyAgQ0ZGTF9JbnRlcmFjdGl2ZUZvcm1GaWxsZXIqIEdldEZvcm1GaWxsZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fcEZvcm1GaWxsZXIuR2V0KCk7CiAgIH0KLSAgQ0ZGTF9JbnRlcmFjdGl2ZUZvcm1GaWxsZXIqIEdldEZvcm1GaWxsZXIoKSB7IHJldHVybiBtX3BGb3JtRmlsbGVyOyB9CiAKICBwcml2YXRlOgotICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIG1fcEZvcm1GaWxsRW52OwotICBDRkZMX0ludGVyYWN0aXZlRm9ybUZpbGxlciogbV9wRm9ybUZpbGxlcjsKKyAgVW5vd25lZFB0cjxDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ+IGNvbnN0IG1fcEZvcm1GaWxsRW52OworICBVbm93bmVkUHRyPENGRkxfSW50ZXJhY3RpdmVGb3JtRmlsbGVyPiBjb25zdCBtX3BGb3JtRmlsbGVyOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0NQREZTREtfV0lER0VUSEFORExFUl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9jcGRmc2RrX3hmYXdpZGdldC5jcHAgYi9mcGRmc2RrL2NwZGZzZGtfeGZhd2lkZ2V0LmNwcAppbmRleCBiMzBlNWYzLi5hZjA4MDIzIDEwMDY0NAotLS0gYS9mcGRmc2RrL2NwZGZzZGtfeGZhd2lkZ2V0LmNwcAorKysgYi9mcGRmc2RrL2NwZGZzZGtfeGZhd2lkZ2V0LmNwcApAQCAtNyw3ICs3LDcgQEAKICNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfeGZhd2lkZ2V0LmgiCiAKICNpbmNsdWRlICJmcGRmc2RrL2lwZGZzZGtfYW5ub3RoYW5kbGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZndpZGdldC5oIgogCiBDUERGU0RLX1hGQVdpZGdldDo6Q1BERlNES19YRkFXaWRnZXQoQ1hGQV9GRldpZGdldCogcEFubm90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKQEAgLTE2LDEyICsxNiwxNCBAQAogICAgICAgbV9wSW50ZXJGb3JtKHBJbnRlckZvcm0pLAogICAgICAgbV9oWEZBV2lkZ2V0KHBBbm5vdCkge30KIAorQ1BERlNES19YRkFXaWRnZXQ6On5DUERGU0RLX1hGQVdpZGdldCgpIHt9CisKIGJvb2wgQ1BERlNES19YRkFXaWRnZXQ6OklzWEZBRmllbGQoKSB7CiAgIHJldHVybiB0cnVlOwogfQogCiBDWEZBX0ZGV2lkZ2V0KiBDUERGU0RLX1hGQVdpZGdldDo6R2V0WEZBV2lkZ2V0KCkgY29uc3QgewotICByZXR1cm4gbV9oWEZBV2lkZ2V0OworICByZXR1cm4gbV9oWEZBV2lkZ2V0LkdldCgpOwogfQogCiBDUERGX0Fubm90OjpTdWJ0eXBlIENQREZTREtfWEZBV2lkZ2V0OjpHZXRBbm5vdFN1YnR5cGUoKSBjb25zdCB7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2NwZGZzZGtfeGZhd2lkZ2V0LmggYi9mcGRmc2RrL2NwZGZzZGtfeGZhd2lkZ2V0LmgKaW5kZXggOWQwYmU3NS4uZDI2MzVlYiAxMDA2NDQKLS0tIGEvZnBkZnNkay9jcGRmc2RrX3hmYXdpZGdldC5oCisrKyBiL2ZwZGZzZGsvY3BkZnNka194ZmF3aWRnZXQuaApAQCAtOSw2ICs5LDcgQEAKIAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKICNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfYW5ub3QuaCIKIAogY2xhc3MgQ1BERlNES19JbnRlckZvcm07CkBAIC0yMCwxOCArMjEsMTkgQEAKICAgQ1BERlNES19YRkFXaWRnZXQoQ1hGQV9GRldpZGdldCogcEFubm90LAogICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCiAgICAgICAgICAgICAgICAgICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtKTsKLSAgfkNQREZTREtfWEZBV2lkZ2V0KCkgb3ZlcnJpZGUge30KKyAgfkNQREZTREtfWEZBV2lkZ2V0KCkgb3ZlcnJpZGU7CiAKKyAgLy8gQ1BERlNES19Bbm5vdDoKICAgYm9vbCBJc1hGQUZpZWxkKCkgb3ZlcnJpZGU7CiAgIENYRkFfRkZXaWRnZXQqIEdldFhGQVdpZGdldCgpIGNvbnN0IG92ZXJyaWRlOwogICBDUERGX0Fubm90OjpTdWJ0eXBlIEdldEFubm90U3VidHlwZSgpIGNvbnN0IG92ZXJyaWRlOwogICBDRlhfRmxvYXRSZWN0IEdldFJlY3QoKSBjb25zdCBvdmVycmlkZTsKIAotICBDUERGU0RLX0ludGVyRm9ybSogR2V0SW50ZXJGb3JtKCkgeyByZXR1cm4gbV9wSW50ZXJGb3JtOyB9CisgIENQREZTREtfSW50ZXJGb3JtKiBHZXRJbnRlckZvcm0oKSBjb25zdCB7IHJldHVybiBtX3BJbnRlckZvcm0uR2V0KCk7IH0KIAogIHByaXZhdGU6Ci0gIENQREZTREtfSW50ZXJGb3JtKiBtX3BJbnRlckZvcm07Ci0gIENYRkFfRkZXaWRnZXQqIG1faFhGQVdpZGdldDsKKyAgVW5vd25lZFB0cjxDUERGU0RLX0ludGVyRm9ybT4gbV9wSW50ZXJGb3JtOworICBVbm93bmVkUHRyPENYRkFfRkZXaWRnZXQ+IG1faFhGQVdpZGdldDsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19DUERGU0RLX1hGQVdJREdFVF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9jcGRmc2RrX3hmYXdpZGdldGhhbmRsZXIuY3BwIGIvZnBkZnNkay9jcGRmc2RrX3hmYXdpZGdldGhhbmRsZXIuY3BwCmluZGV4IDY1M2ViOGEuLjg5N2UxNmQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvY3BkZnNka194ZmF3aWRnZXRoYW5kbGVyLmNwcAorKysgYi9mcGRmc2RrL2NwZGZzZGtfeGZhd2lkZ2V0aGFuZGxlci5jcHAKQEAgLTE1LDEyICsxNSwxMyBAQAogI2luY2x1ZGUgImZwZGZzZGsvZnBkZnhmYS9jcGRmeGZhX2NvbnRleHQuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfYXBwLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9md2xfd2lkZ2V0aGl0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRvY3ZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZndpZGdldGhhbmRsZXIuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9meGZhX2Jhc2ljLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jdmlldy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZnBhZ2V2aWV3LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0aGFuZGxlci5oIgotI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2NmeF9ncmFwaGljcy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jeGZhX2dyYXBoaWNzLmgiCiAKIENQREZTREtfWEZBV2lkZ2V0SGFuZGxlcjo6Q1BERlNES19YRkFXaWRnZXRIYW5kbGVyKAogICAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KQpAQCAtNTMsMTQgKzU0LDE0IEBACiAgIEFTU0VSVChwUGFnZVZpZXcpOwogICBBU1NFUlQocEFubm90KTsKIAotICBDRlhfR3JhcGhpY3MgZ3MocERldmljZSk7CisgIENYRkFfR3JhcGhpY3MgZ3MocERldmljZSk7CiAKICAgQ0ZYX01hdHJpeCBtdCA9ICpwVXNlcjJEZXZpY2U7CiAgIGJvb2wgYklzSGlnaGxpZ2h0ID0gZmFsc2U7CiAgIGlmIChwUGFnZVZpZXctPkdldEZvcm1GaWxsRW52KCktPkdldEZvY3VzQW5ub3QoKSAhPSBwQW5ub3QpCiAgICAgYklzSGlnaGxpZ2h0ID0gdHJ1ZTsKIAotICBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCktPlJlbmRlcldpZGdldChwQW5ub3QtPkdldFhGQVdpZGdldCgpLCAmZ3MsICZtdCwKKyAgR2V0WEZBV2lkZ2V0SGFuZGxlcihwQW5ub3QpLT5SZW5kZXJXaWRnZXQocEFubm90LT5HZXRYRkFXaWRnZXQoKSwgJmdzLCBtdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYklzSGlnaGxpZ2h0KTsKIAogICAvLyB0byBkbyBoaWdobGlnaHQgYW5kIHNoYWRvdwpAQCAtODEsNyArODIsOCBAQAogICBBU1NFUlQocEFubm90KTsKIAogICBDRlhfUmVjdEYgcmNCQm94OwotICBYRkFfRWxlbWVudCBlVHlwZSA9IHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCktPkdldERhdGFBY2MoKS0+R2V0VUlUeXBlKCk7CisgIFhGQV9FbGVtZW50IGVUeXBlID0KKyAgICAgIHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCktPkdldE5vZGUoKS0+R2V0V2lkZ2V0QWNjKCktPkdldFVJVHlwZSgpOwogICBpZiAoZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OlNpZ25hdHVyZSkKICAgICByY0JCb3ggPSBwQW5ub3QtPkdldFhGQVdpZGdldCgpLT5HZXRCQm94KFhGQV9XaWRnZXRTdGF0dXNfVmlzaWJsZSwgdHJ1ZSk7CiAgIGVsc2UKQEAgLTk3LDYgKzk5LDIzIEBACiAgIHJldHVybiByY1dpZGdldDsKIH0KIAorV2lkZVN0cmluZyBDUERGU0RLX1hGQVdpZGdldEhhbmRsZXI6OkdldFNlbGVjdGVkVGV4dChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKKyAgaWYgKCFwQW5ub3QpCisgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKKworICBDWEZBX0ZGV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7CisgIHJldHVybiBwV2lkZ2V0SGFuZGxlci0+R2V0U2VsZWN0ZWRUZXh0KHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCkpOworfQorCit2b2lkIENQREZTREtfWEZBV2lkZ2V0SGFuZGxlcjo6UmVwbGFjZVNlbGVjdGlvbihDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB0ZXh0KSB7CisgIGlmICghcEFubm90KQorICAgIHJldHVybjsKKworICBDWEZBX0ZGV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBHZXRYRkFXaWRnZXRIYW5kbGVyKHBBbm5vdCk7CisgIHJldHVybiBwV2lkZ2V0SGFuZGxlci0+UGFzdGVUZXh0KHBBbm5vdC0+R2V0WEZBV2lkZ2V0KCksIHRleHQpOworfQorCiBib29sIENQREZTREtfWEZBV2lkZ2V0SGFuZGxlcjo6SGl0VGVzdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewpkaWZmIC0tZ2l0IGEvZnBkZnNkay9jcGRmc2RrX3hmYXdpZGdldGhhbmRsZXIuaCBiL2ZwZGZzZGsvY3BkZnNka194ZmF3aWRnZXRoYW5kbGVyLmgKaW5kZXggMzkwMzEwMy4uZTBkY2NiZSAxMDA2NDQKLS0tIGEvZnBkZnNkay9jcGRmc2RrX3hmYXdpZGdldGhhbmRsZXIuaAorKysgYi9mcGRmc2RrL2NwZGZzZGtfeGZhd2lkZ2V0aGFuZGxlci5oCkBAIC03LDggKzcsOCBAQAogI2lmbmRlZiBGUERGU0RLX0NQREZTREtfWEZBV0lER0VUSEFORExFUl9IXwogI2RlZmluZSBGUERGU0RLX0NQREZTREtfWEZBV0lER0VUSEFORExFUl9IXwogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAjaW5jbHVkZSAiZnBkZnNkay9pcGRmc2RrX2Fubm90aGFuZGxlci5oIgogCiBjbGFzcyBDRlhfTWF0cml4OwpAQCAtMzIsNiArMzIsOCBAQAogICB2b2lkIFJlbGVhc2VBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpIG92ZXJyaWRlOwogICBDRlhfRmxvYXRSZWN0IEdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QpIG92ZXJyaWRlOworICBXaWRlU3RyaW5nIEdldFNlbGVjdGVkVGV4dChDUERGU0RLX0Fubm90KiBwQW5ub3QpIG92ZXJyaWRlOworICB2b2lkIFJlcGxhY2VTZWxlY3Rpb24oQ1BERlNES19Bbm5vdCogcEFubm90LCBjb25zdCBXaWRlU3RyaW5nJiB0ZXh0KSBvdmVycmlkZTsKICAgYm9vbCBIaXRUZXN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKQEAgLTkyLDcgKzk0LDcgQEAKICAgQ1hGQV9GRldpZGdldEhhbmRsZXIqIEdldFhGQVdpZGdldEhhbmRsZXIoQ1BERlNES19Bbm5vdCogcEFubm90KTsKICAgdWludDMyX3QgR2V0RldMRmxhZ3ModWludDMyX3QgZHdGbGFnKTsKIAotICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIG1fcEZvcm1GaWxsRW52OworICBVbm93bmVkUHRyPENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudD4gY29uc3QgbV9wRm9ybUZpbGxFbnY7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfQ1BERlNES19YRkFXSURHRVRIQU5ETEVSX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2Zvcm1maWxsZXIvY2JhX2ZvbnRtYXAuY3BwIGIvZnBkZnNkay9mb3JtZmlsbGVyL2NiYV9mb250bWFwLmNwcAppbmRleCA3NTBiNDE2Li5kNjc1Njc2IDEwMDY0NAotLS0gYS9mcGRmc2RrL2Zvcm1maWxsZXIvY2JhX2ZvbnRtYXAuY3BwCisrKyBiL2ZwZGZzZGsvZm9ybWZpbGxlci9jYmFfZm9udG1hcC5jcHAKQEAgLTI4LDcgKzI4LDcgQEAKICAgICAgIG1fc0FQVHlwZSgiTiIpIHsKICAgQ1BERl9QYWdlKiBwUGFnZSA9IHBBbm5vdC0+R2V0UERGUGFnZSgpOwogCi0gIG1fcERvY3VtZW50ID0gcFBhZ2UtPm1fcERvY3VtZW50OworICBtX3BEb2N1bWVudCA9IHBQYWdlLT5tX3BEb2N1bWVudC5HZXQoKTsKICAgbV9wQW5ub3REaWN0ID0gcEFubm90LT5HZXRQREZBbm5vdCgpLT5HZXRBbm5vdERpY3QoKTsKICAgSW5pdGlhbGl6ZSgpOwogfQpAQCAtMzgsMTQgKzM4LDE0IEBACiB2b2lkIENCQV9Gb250TWFwOjpSZXNldCgpIHsKICAgRW1wdHkoKTsKICAgbV9wRGVmYXVsdEZvbnQgPSBudWxscHRyOwotICBtX3NEZWZhdWx0Rm9udE5hbWUgPSAiIjsKKyAgbV9zRGVmYXVsdEZvbnROYW1lLmNsZWFyKCk7CiB9CiAKIHZvaWQgQ0JBX0ZvbnRNYXA6OkluaXRpYWxpemUoKSB7Ci0gIGludDMyX3QgbkNoYXJzZXQgPSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUOworICBpbnQzMl90IG5DaGFyc2V0ID0gRlhfQ0hBUlNFVF9EZWZhdWx0OwogCiAgIGlmICghbV9wRGVmYXVsdEZvbnQpIHsKLSAgICBtX3BEZWZhdWx0Rm9udCA9IEdldEFubm90RGVmYXVsdEZvbnQobV9zRGVmYXVsdEZvbnROYW1lKTsKKyAgICBtX3BEZWZhdWx0Rm9udCA9IEdldEFubm90RGVmYXVsdEZvbnQoJm1fc0RlZmF1bHRGb250TmFtZSk7CiAgICAgaWYgKG1fcERlZmF1bHRGb250KSB7CiAgICAgICBpZiAoY29uc3QgQ0ZYX1N1YnN0Rm9udCogcFN1YnN0Rm9udCA9IG1fcERlZmF1bHRGb250LT5HZXRTdWJzdEZvbnQoKSkgewogICAgICAgICBuQ2hhcnNldCA9IHBTdWJzdEZvbnQtPm1fQ2hhcnNldDsKQEAgLTU0LDIxICs1NCwyMSBAQAogICAgICAgICAgICAgbV9zRGVmYXVsdEZvbnROYW1lID09ICJXaW5nZGluZ3MyIiB8fAogICAgICAgICAgICAgbV9zRGVmYXVsdEZvbnROYW1lID09ICJXaW5nZGluZ3MzIiB8fAogICAgICAgICAgICAgbV9zRGVmYXVsdEZvbnROYW1lID09ICJXZWJkaW5ncyIpCi0gICAgICAgICAgbkNoYXJzZXQgPSBGWEZPTlRfU1lNQk9MX0NIQVJTRVQ7CisgICAgICAgICAgbkNoYXJzZXQgPSBGWF9DSEFSU0VUX1N5bWJvbDsKICAgICAgICAgZWxzZQotICAgICAgICAgIG5DaGFyc2V0ID0gRlhGT05UX0FOU0lfQ0hBUlNFVDsKKyAgICAgICAgICBuQ2hhcnNldCA9IEZYX0NIQVJTRVRfQU5TSTsKICAgICAgIH0KLSAgICAgIEFkZEZvbnREYXRhKG1fcERlZmF1bHRGb250LCBtX3NEZWZhdWx0Rm9udE5hbWUsIG5DaGFyc2V0KTsKLSAgICAgIEFkZEZvbnRUb0Fubm90RGljdChtX3BEZWZhdWx0Rm9udCwgbV9zRGVmYXVsdEZvbnROYW1lKTsKKyAgICAgIEFkZEZvbnREYXRhKG1fcERlZmF1bHRGb250LkdldCgpLCBtX3NEZWZhdWx0Rm9udE5hbWUsIG5DaGFyc2V0KTsKKyAgICAgIEFkZEZvbnRUb0Fubm90RGljdChtX3BEZWZhdWx0Rm9udC5HZXQoKSwgbV9zRGVmYXVsdEZvbnROYW1lKTsKICAgICB9CiAgIH0KIAotICBpZiAobkNoYXJzZXQgIT0gRlhGT05UX0FOU0lfQ0hBUlNFVCkKKyAgaWYgKG5DaGFyc2V0ICE9IEZYX0NIQVJTRVRfQU5TSSkKICAgICBDUFdMX0ZvbnRNYXA6OkluaXRpYWxpemUoKTsKIH0KIAogdm9pZCBDQkFfRm9udE1hcDo6U2V0RGVmYXVsdEZvbnQoQ1BERl9Gb250KiBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIHNGb250TmFtZSkgewogICBBU1NFUlQocEZvbnQpOwogCiAgIGlmIChtX3BEZWZhdWx0Rm9udCkKQEAgLTc3LDE5ICs3NywxOSBAQAogICBtX3BEZWZhdWx0Rm9udCA9IHBGb250OwogICBtX3NEZWZhdWx0Rm9udE5hbWUgPSBzRm9udE5hbWU7CiAKLSAgaW50MzJfdCBuQ2hhcnNldCA9IEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQ7CisgIGludDMyX3QgbkNoYXJzZXQgPSBGWF9DSEFSU0VUX0RlZmF1bHQ7CiAgIGlmIChjb25zdCBDRlhfU3Vic3RGb250KiBwU3Vic3RGb250ID0gbV9wRGVmYXVsdEZvbnQtPkdldFN1YnN0Rm9udCgpKQogICAgIG5DaGFyc2V0ID0gcFN1YnN0Rm9udC0+bV9DaGFyc2V0OwotICBBZGRGb250RGF0YShtX3BEZWZhdWx0Rm9udCwgbV9zRGVmYXVsdEZvbnROYW1lLCBuQ2hhcnNldCk7CisgIEFkZEZvbnREYXRhKG1fcERlZmF1bHRGb250LkdldCgpLCBtX3NEZWZhdWx0Rm9udE5hbWUsIG5DaGFyc2V0KTsKIH0KIAotQ1BERl9Gb250KiBDQkFfRm9udE1hcDo6RmluZEZvbnRTYW1lQ2hhcnNldChDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcywKK0NQREZfRm9udCogQ0JBX0ZvbnRNYXA6OkZpbmRGb250U2FtZUNoYXJzZXQoQnl0ZVN0cmluZyogc0ZvbnRBbGlhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhcnNldCkgewogICBpZiAobV9wQW5ub3REaWN0LT5HZXRTdHJpbmdGb3IoIlN1YnR5cGUiKSAhPSAiV2lkZ2V0IikKICAgICByZXR1cm4gbnVsbHB0cjsKIAogICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBHZXREb2N1bWVudCgpOwotICBDUERGX0RpY3Rpb25hcnkqIHBSb290RGljdCA9IHBEb2N1bWVudC0+R2V0Um9vdCgpOworICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBSb290RGljdCA9IHBEb2N1bWVudC0+R2V0Um9vdCgpOwogICBpZiAoIXBSb290RGljdCkKICAgICByZXR1cm4gbnVsbHB0cjsKIApAQCAtMTA1LDExICsxMDUsMTEgQEAKIH0KIAogQ1BERl9Eb2N1bWVudCogQ0JBX0ZvbnRNYXA6OkdldERvY3VtZW50KCkgewotICByZXR1cm4gbV9wRG9jdW1lbnQ7CisgIHJldHVybiBtX3BEb2N1bWVudC5HZXQoKTsKIH0KIAogQ1BERl9Gb250KiBDQkFfRm9udE1hcDo6RmluZFJlc0ZvbnRTYW1lQ2hhcnNldChDUERGX0RpY3Rpb25hcnkqIHBSZXNEaWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0cmluZyogc0ZvbnRBbGlhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhcnNldCkgewogICBpZiAoIXBSZXNEaWN0KQogICAgIHJldHVybiBudWxscHRyOwpAQCAtMTIxLDcgKzEyMSw3IEBACiAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCA9IEdldERvY3VtZW50KCk7CiAgIENQREZfRm9udCogcEZpbmQgPSBudWxscHRyOwogICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogKnBGb250cykgewotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjc0tleSA9IGl0LmZpcnN0OworICAgIGNvbnN0IEJ5dGVTdHJpbmcmIGNzS2V5ID0gaXQuZmlyc3Q7CiAgICAgaWYgKCFpdC5zZWNvbmQpCiAgICAgICBjb250aW51ZTsKIApAQCAtMTM4LDIwICsxMzgsMTkgQEAKICAgICBpZiAoIXBTdWJzdCkKICAgICAgIGNvbnRpbnVlOwogICAgIGlmIChwU3Vic3QtPm1fQ2hhcnNldCA9PSBuQ2hhcnNldCkgewotICAgICAgc0ZvbnRBbGlhcyA9IGNzS2V5OworICAgICAgKnNGb250QWxpYXMgPSBjc0tleTsKICAgICAgIHBGaW5kID0gcEZvbnQ7CiAgICAgfQogICB9CiAgIHJldHVybiBwRmluZDsKIH0KIAotdm9pZCBDQkFfRm9udE1hcDo6QWRkZWRGb250KENQREZfRm9udCogcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMpIHsKK3ZvaWQgQ0JBX0ZvbnRNYXA6OkFkZGVkRm9udChDUERGX0ZvbnQqIHBGb250LCBjb25zdCBCeXRlU3RyaW5nJiBzRm9udEFsaWFzKSB7CiAgIEFkZEZvbnRUb0Fubm90RGljdChwRm9udCwgc0ZvbnRBbGlhcyk7CiB9CiAKIHZvaWQgQ0JBX0ZvbnRNYXA6OkFkZEZvbnRUb0Fubm90RGljdChDUERGX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQWxpYXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBzQWxpYXMpIHsKICAgaWYgKCFwRm9udCkKICAgICByZXR1cm47CiAKQEAgLTE2Nyw3ICsxNjYsNyBAQAogICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBBUERpY3QtPkdldFN0cmVhbUZvcihtX3NBUFR5cGUpOwogICBpZiAoIXBTdHJlYW0pIHsKICAgICBwU3RyZWFtID0gbV9wRG9jdW1lbnQtPk5ld0luZGlyZWN0PENQREZfU3RyZWFtPigpOwotICAgIHBBUERpY3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4obV9zQVBUeXBlLCBtX3BEb2N1bWVudCwKKyAgICBwQVBEaWN0LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KG1fc0FQVHlwZSwgbV9wRG9jdW1lbnQuR2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5HZXRPYmpOdW0oKSk7CiAgIH0KIApAQCAtMTg1LDY0ICsxODQsNjUgQEAKICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3RyZWFtUmVzRm9udExpc3QgPSBwU3RyZWFtUmVzTGlzdC0+R2V0RGljdEZvcigiRm9udCIpOwogICBpZiAoIXBTdHJlYW1SZXNGb250TGlzdCkgewogICAgIHBTdHJlYW1SZXNGb250TGlzdCA9IG1fcERvY3VtZW50LT5OZXdJbmRpcmVjdDxDUERGX0RpY3Rpb25hcnk+KCk7Ci0gICAgcFN0cmVhbVJlc0xpc3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIkZvbnQiLCBtX3BEb2N1bWVudCwKKyAgICBwU3RyZWFtUmVzTGlzdC0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiRm9udCIsIG1fcERvY3VtZW50LkdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdHJlYW1SZXNGb250TGlzdC0+R2V0T2JqTnVtKCkpOwogICB9CiAgIGlmICghcFN0cmVhbVJlc0ZvbnRMaXN0LT5LZXlFeGlzdChzQWxpYXMpKSB7CiAgICAgcFN0cmVhbVJlc0ZvbnRMaXN0LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KAotICAgICAgICBzQWxpYXMsIG1fcERvY3VtZW50LCBwRm9udC0+R2V0Rm9udERpY3QoKS0+R2V0T2JqTnVtKCkpOworICAgICAgICBzQWxpYXMsIG1fcERvY3VtZW50LkdldCgpLCBwRm9udC0+R2V0Rm9udERpY3QoKS0+R2V0T2JqTnVtKCkpOwogICB9CiB9CiAKLUNQREZfRm9udCogQ0JBX0ZvbnRNYXA6OkdldEFubm90RGVmYXVsdEZvbnQoQ0ZYX0J5dGVTdHJpbmcmIHNBbGlhcykgeworQ1BERl9Gb250KiBDQkFfRm9udE1hcDo6R2V0QW5ub3REZWZhdWx0Rm9udChCeXRlU3RyaW5nKiBzQWxpYXMpIHsKICAgQ1BERl9EaWN0aW9uYXJ5KiBwQWNyb0Zvcm1EaWN0ID0gbnVsbHB0cjsKICAgY29uc3QgYm9vbCBiV2lkZ2V0ID0gKG1fcEFubm90RGljdC0+R2V0U3RyaW5nRm9yKCJTdWJ0eXBlIikgPT0gIldpZGdldCIpOwogICBpZiAoYldpZGdldCkgewotICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBSb290RGljdCA9IG1fcERvY3VtZW50LT5HZXRSb290KCkpCisgICAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdERpY3QgPSBtX3BEb2N1bWVudC0+R2V0Um9vdCgpOworICAgIGlmIChwUm9vdERpY3QpCiAgICAgICBwQWNyb0Zvcm1EaWN0ID0gcFJvb3REaWN0LT5HZXREaWN0Rm9yKCJBY3JvRm9ybSIpOwogICB9CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgc0RBOwotICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcEFubm90RGljdCwgIkRBIik7CisgIEJ5dGVTdHJpbmcgc0RBOworICBDUERGX09iamVjdCogcE9iaiA9IEZQREZfR2V0RmllbGRBdHRyKG1fcEFubm90RGljdC5HZXQoKSwgIkRBIik7CiAgIGlmIChwT2JqKQogICAgIHNEQSA9IHBPYmotPkdldFN0cmluZygpOwogCiAgIGlmIChiV2lkZ2V0KSB7CiAgICAgaWYgKHNEQS5Jc0VtcHR5KCkpIHsKICAgICAgIHBPYmogPSBGUERGX0dldEZpZWxkQXR0cihwQWNyb0Zvcm1EaWN0LCAiREEiKTsKLSAgICAgIHNEQSA9IHBPYmogPyBwT2JqLT5HZXRTdHJpbmcoKSA6IENGWF9CeXRlU3RyaW5nKCk7CisgICAgICBzREEgPSBwT2JqID8gcE9iai0+R2V0U3RyaW5nKCkgOiBCeXRlU3RyaW5nKCk7CiAgICAgfQogICB9CiAgIGlmIChzREEuSXNFbXB0eSgpKQogICAgIHJldHVybiBudWxscHRyOwogCi0gIENQREZfU2ltcGxlUGFyc2VyIHN5bnRheChzREEuQXNTdHJpbmdDKCkpOworICBDUERGX1NpbXBsZVBhcnNlciBzeW50YXgoc0RBLkFzU3RyaW5nVmlldygpKTsKICAgc3ludGF4LkZpbmRUYWdQYXJhbUZyb21TdGFydCgiVGYiLCAyKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnROYW1lKHN5bnRheC5HZXRXb3JkKCkpOwotICBzQWxpYXMgPSBQREZfTmFtZURlY29kZShzRm9udE5hbWUpLk1pZCgxKTsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QgPSBudWxscHRyOwogCisgIEJ5dGVTdHJpbmcgc0ZvbnROYW1lKHN5bnRheC5HZXRXb3JkKCkpOworICBCeXRlU3RyaW5nIHNEZWNvZGVkRm9udE5hbWUgPSBQREZfTmFtZURlY29kZShzRm9udE5hbWUpOworICAqc0FsaWFzID0gc0RlY29kZWRGb250TmFtZS5SaWdodChzRGVjb2RlZEZvbnROYW1lLkdldExlbmd0aCgpIC0gMSk7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwRm9udERpY3QgPSBudWxscHRyOwogICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwQVBEaWN0ID0gbV9wQW5ub3REaWN0LT5HZXREaWN0Rm9yKCJBUCIpKSB7CiAgICAgaWYgKENQREZfRGljdGlvbmFyeSogcE5vcm1hbERpY3QgPSBwQVBEaWN0LT5HZXREaWN0Rm9yKCJOIikpIHsKICAgICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBOb3JtYWxSZXNEaWN0ID0KICAgICAgICAgICAgICAgcE5vcm1hbERpY3QtPkdldERpY3RGb3IoIlJlc291cmNlcyIpKSB7CiAgICAgICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBSZXNGb250RGljdCA9IHBOb3JtYWxSZXNEaWN0LT5HZXREaWN0Rm9yKCJGb250IikpCi0gICAgICAgICAgcEZvbnREaWN0ID0gcFJlc0ZvbnREaWN0LT5HZXREaWN0Rm9yKHNBbGlhcyk7CisgICAgICAgICAgcEZvbnREaWN0ID0gcFJlc0ZvbnREaWN0LT5HZXREaWN0Rm9yKCpzQWxpYXMpOwogICAgICAgfQogICAgIH0KICAgfQotCiAgIGlmIChiV2lkZ2V0ICYmICFwRm9udERpY3QgJiYgcEFjcm9Gb3JtRGljdCkgewogICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBEUkRpY3QgPSBwQWNyb0Zvcm1EaWN0LT5HZXREaWN0Rm9yKCJEUiIpKSB7CiAgICAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRFJGb250RGljdCA9IHBEUkRpY3QtPkdldERpY3RGb3IoIkZvbnQiKSkKLSAgICAgICAgcEZvbnREaWN0ID0gcERSRm9udERpY3QtPkdldERpY3RGb3Ioc0FsaWFzKTsKKyAgICAgICAgcEZvbnREaWN0ID0gcERSRm9udERpY3QtPkdldERpY3RGb3IoKnNBbGlhcyk7CiAgICAgfQogICB9Ci0KICAgcmV0dXJuIHBGb250RGljdCA/IG1fcERvY3VtZW50LT5Mb2FkRm9udChwRm9udERpY3QpIDogbnVsbHB0cjsKIH0KIAotdm9pZCBDQkFfRm9udE1hcDo6U2V0QVBUeXBlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzQVBUeXBlKSB7Cit2b2lkIENCQV9Gb250TWFwOjpTZXRBUFR5cGUoY29uc3QgQnl0ZVN0cmluZyYgc0FQVHlwZSkgewogICBtX3NBUFR5cGUgPSBzQVBUeXBlOwogCiAgIFJlc2V0KCk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2Zvcm1maWxsZXIvY2JhX2ZvbnRtYXAuaCBiL2ZwZGZzZGsvZm9ybWZpbGxlci9jYmFfZm9udG1hcC5oCmluZGV4IGMwZTU2OWEuLjQ1ZGY4YzggMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvZm9ybWZpbGxlci9jYmFfZm9udG1hcC5oCisrKyBiL2ZwZGZzZGsvZm9ybWZpbGxlci9jYmFfZm9udG1hcC5oCkBAIC03LDcgKzcsOCBAQAogI2lmbmRlZiBGUERGU0RLX0ZPUk1GSUxMRVJfQ0JBX0ZPTlRNQVBfSF8KICNkZWZpbmUgRlBERlNES19GT1JNRklMTEVSX0NCQV9GT05UTUFQX0hfCiAKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfRm9udE1hcC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX2ZvbnRfbWFwLmgiCiAKIGNsYXNzIENQREZfRGljdGlvbmFyeTsKIGNsYXNzIENQREZTREtfQW5ub3Q7CkBAIC0xNywzMCArMTgsMjkgQEAKICAgQ0JBX0ZvbnRNYXAoQ1BERlNES19Bbm5vdCogcEFubm90LCBDRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpOwogICB+Q0JBX0ZvbnRNYXAoKSBvdmVycmlkZTsKIAotICB2b2lkIFNldERlZmF1bHRGb250KENQREZfRm9udCogcEZvbnQsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUpOwotCiAgIHZvaWQgUmVzZXQoKTsKLSAgdm9pZCBTZXRBUFR5cGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBUFR5cGUpOworICB2b2lkIFNldERlZmF1bHRGb250KENQREZfRm9udCogcEZvbnQsIGNvbnN0IEJ5dGVTdHJpbmcmIHNGb250TmFtZSk7CisgIHZvaWQgU2V0QVBUeXBlKGNvbnN0IEJ5dGVTdHJpbmcmIHNBUFR5cGUpOwogCiAgcHJpdmF0ZToKICAgLy8gQ1BXTF9Gb250TWFwOgogICB2b2lkIEluaXRpYWxpemUoKSBvdmVycmlkZTsKICAgQ1BERl9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBvdmVycmlkZTsKLSAgQ1BERl9Gb250KiBGaW5kRm9udFNhbWVDaGFyc2V0KENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzLAorICBDUERGX0ZvbnQqIEZpbmRGb250U2FtZUNoYXJzZXQoQnl0ZVN0cmluZyogc0ZvbnRBbGlhcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJzZXQpIG92ZXJyaWRlOwotICB2b2lkIEFkZGVkRm9udChDUERGX0ZvbnQqIHBGb250LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcykgb3ZlcnJpZGU7CisgIHZvaWQgQWRkZWRGb250KENQREZfRm9udCogcEZvbnQsIGNvbnN0IEJ5dGVTdHJpbmcmIHNGb250QWxpYXMpIG92ZXJyaWRlOwogCiAgIENQREZfRm9udCogRmluZFJlc0ZvbnRTYW1lQ2hhcnNldChDUERGX0RpY3Rpb25hcnkqIHBSZXNEaWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nKiBzRm9udEFsaWFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhcnNldCk7Ci0gIENQREZfRm9udCogR2V0QW5ub3REZWZhdWx0Rm9udChDRlhfQnl0ZVN0cmluZyYgY3NOYW1lVGFnKTsKLSAgdm9pZCBBZGRGb250VG9Bbm5vdERpY3QoQ1BERl9Gb250KiBwRm9udCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNBbGlhcyk7CisgIENQREZfRm9udCogR2V0QW5ub3REZWZhdWx0Rm9udChCeXRlU3RyaW5nKiBjc05hbWVUYWcpOworICB2b2lkIEFkZEZvbnRUb0Fubm90RGljdChDUERGX0ZvbnQqIHBGb250LCBjb25zdCBCeXRlU3RyaW5nJiBzQWxpYXMpOwogCi0gIENQREZfRG9jdW1lbnQqIG1fcERvY3VtZW50OwotICBDUERGX0RpY3Rpb25hcnkqIG1fcEFubm90RGljdDsKLSAgQ1BERl9Gb250KiBtX3BEZWZhdWx0Rm9udDsKLSAgQ0ZYX0J5dGVTdHJpbmcgbV9zRGVmYXVsdEZvbnROYW1lOwotICBDRlhfQnl0ZVN0cmluZyBtX3NBUFR5cGU7CisgIFVub3duZWRQdHI8Q1BERl9Eb2N1bWVudD4gbV9wRG9jdW1lbnQ7CisgIFVub3duZWRQdHI8Q1BERl9EaWN0aW9uYXJ5PiBtX3BBbm5vdERpY3Q7CisgIFVub3duZWRQdHI8Q1BERl9Gb250PiBtX3BEZWZhdWx0Rm9udDsKKyAgQnl0ZVN0cmluZyBtX3NEZWZhdWx0Rm9udE5hbWU7CisgIEJ5dGVTdHJpbmcgbV9zQVBUeXBlOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0ZPUk1GSUxMRVJfQ0JBX0ZPTlRNQVBfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2J1dHRvbi5jcHAgYi9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9idXR0b24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYjAwNDUKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9idXR0b24uY3BwCkBAIC0wLDAgKzEsMTAzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9idXR0b24uaCIKKworQ0ZGTF9CdXR0b246OkNGRkxfQnV0dG9uKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEFwcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCkKKyAgICA6IENGRkxfRm9ybUZpbGxlcihwQXBwLCBwV2lkZ2V0KSwgbV9iTW91c2VJbihmYWxzZSksIG1fYk1vdXNlRG93bihmYWxzZSkge30KKworQ0ZGTF9CdXR0b246On5DRkZMX0J1dHRvbigpIHt9CisKK3ZvaWQgQ0ZGTF9CdXR0b246Ok9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90KSB7CisgIG1fYk1vdXNlSW4gPSB0cnVlOworICBJbnZhbGlkYXRlUmVjdChHZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCkpOworfQorCit2b2lkIENGRkxfQnV0dG9uOjpPbk1vdXNlRXhpdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKKyAgbV9iTW91c2VJbiA9IGZhbHNlOworICBJbnZhbGlkYXRlUmVjdChHZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCkpOworICBFbmRUaW1lcigpOworICBBU1NFUlQobV9wV2lkZ2V0KTsKK30KKworYm9vbCBDRkZMX0J1dHRvbjo6T25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICBpZiAoIXBBbm5vdC0+R2V0UmVjdCgpLkNvbnRhaW5zKHBvaW50KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbV9iTW91c2VEb3duID0gdHJ1ZTsKKyAgbV9iVmFsaWQgPSB0cnVlOworICBJbnZhbGlkYXRlUmVjdChHZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCkpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDRkZMX0J1dHRvbjo6T25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKKyAgaWYgKCFwQW5ub3QtPkdldFJlY3QoKS5Db250YWlucyhwb2ludCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG1fYk1vdXNlRG93biA9IGZhbHNlOworICBtX3BXaWRnZXQtPkdldFBERlBhZ2UoKTsKKyAgSW52YWxpZGF0ZVJlY3QoR2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ0ZGTF9CdXR0b246Ok9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENGRkxfQnV0dG9uOjpPbkRyYXcoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG10VXNlcjJEZXZpY2UpIHsKKyAgQVNTRVJUKHBQYWdlVmlldyk7CisgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gc3RhdGljX2Nhc3Q8Q1BERlNES19XaWRnZXQqPihwQW5ub3QpOworICBDUERGX0Zvcm1Db250cm9sKiBwQ3RybCA9IHBXaWRnZXQtPkdldEZvcm1Db250cm9sKCk7CisgIGlmIChwQ3RybC0+R2V0SGlnaGxpZ2h0aW5nTW9kZSgpICE9IENQREZfRm9ybUNvbnRyb2w6OlB1c2gpIHsKKyAgICBwV2lkZ2V0LT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBtdFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX2JNb3VzZURvd24pIHsKKyAgICBpZiAocFdpZGdldC0+SXNXaWRnZXRBcHBlYXJhbmNlVmFsaWQoQ1BERl9Bbm5vdDo6RG93bikpIHsKKyAgICAgIHBXaWRnZXQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIG10VXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6OkRvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICB9IGVsc2UgeworICAgICAgcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgbXRVc2VyMkRldmljZSwgQ1BERl9Bbm5vdDo6Tm9ybWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBpZiAobV9iTW91c2VJbikgeworICAgIGlmIChwV2lkZ2V0LT5Jc1dpZGdldEFwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpSb2xsb3ZlcikpIHsKKyAgICAgIHBXaWRnZXQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIG10VXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6OlJvbGxvdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgfSBlbHNlIHsKKyAgICAgIHBXaWRnZXQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIG10VXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6Ok5vcm1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICBwV2lkZ2V0LT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBtdFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIG51bGxwdHIpOworfQorCit2b2lkIENGRkxfQnV0dG9uOjpPbkRyYXdEZWFjdGl2ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbXRVc2VyMkRldmljZSkgeworICBPbkRyYXcocFBhZ2VWaWV3LCBwQW5ub3QsIHBEZXZpY2UsIG10VXNlcjJEZXZpY2UpOworfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfYnV0dG9uLmggYi9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9idXR0b24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDJlYjViCi0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfYnV0dG9uLmgKQEAgLTAsMCArMSw1NiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZQREZTREtfRk9STUZJTExFUl9DRkZMX0JVVFRPTl9IXworI2RlZmluZSBGUERGU0RLX0ZPUk1GSUxMRVJfQ0ZGTF9CVVRUT05fSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9mb3JtZmlsbGVyLmgiCisKK2NsYXNzIENGWF9SZW5kZXJEZXZpY2U7CitjbGFzcyBDRlhfTWF0cml4OworY2xhc3MgQ1BERlNES19Bbm5vdDsKK2NsYXNzIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDsKK2NsYXNzIENQREZTREtfUGFnZVZpZXc7CitjbGFzcyBDUERGU0RLX1dpZGdldDsKKworY2xhc3MgQ0ZGTF9CdXR0b24gOiBwdWJsaWMgQ0ZGTF9Gb3JtRmlsbGVyIHsKKyBwdWJsaWM6CisgIENGRkxfQnV0dG9uKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAorICAgICAgICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCk7CisgIH5DRkZMX0J1dHRvbigpIG92ZXJyaWRlOworCisgIC8vIENGRkxfRm9ybUZpbGxlcgorICB2b2lkIE9uTW91c2VFbnRlcihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCkgb3ZlcnJpZGU7CisgIHZvaWQgT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpIG92ZXJyaWRlOworICBib29sIE9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOworICBib29sIE9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWdzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKKyAgYm9vbCBPbk1vdXNlTW92ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFncywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7CisgIHZvaWQgT25EcmF3KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtdFVzZXIyRGV2aWNlKSBvdmVycmlkZTsKKyAgdm9pZCBPbkRyYXdEZWFjdGl2ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbXRVc2VyMkRldmljZSkgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBib29sIG1fYk1vdXNlSW47CisgIGJvb2wgbV9iTW91c2VEb3duOworfTsKKworI2VuZGlmICAvLyBGUERGU0RLX0ZPUk1GSUxMRVJfQ0ZGTF9CVVRUT05fSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2NoZWNrYm94LmNwcCBiL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2NoZWNrYm94LmNwcAppbmRleCBjMjMzYzEzLi5lOWM3MmVmIDEwMDY0NAotLS0gYS9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9jaGVja2JveC5jcHAKKysrIGIvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfY2hlY2tib3guY3BwCkBAIC05LDcgKzksNyBAQAogI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19mb3JtZmlsbGVudmlyb25tZW50LmgiCiAjaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX3dpZGdldC5oIgogI2luY2x1ZGUgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2Zvcm1maWxsZXIuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfc3BlY2lhbF9idXR0b24uaCIKICNpbmNsdWRlICJwdWJsaWMvZnBkZl9md2xldmVudC5oIgogCiBDRkZMX0NoZWNrQm94OjpDRkZMX0NoZWNrQm94KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEFwcCwKQEAgLTE4LDkgKzE4LDggQEAKIAogQ0ZGTF9DaGVja0JveDo6fkNGRkxfQ2hlY2tCb3goKSB7fQogCi1DUFdMX1duZCogQ0ZGTF9DaGVja0JveDo6TmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgewotICBDUFdMX0NoZWNrQm94KiBwV25kID0gbmV3IENQV0xfQ2hlY2tCb3goKTsKK0NQV0xfV25kKiBDRkZMX0NoZWNrQm94OjpOZXdQREZXaW5kb3coY29uc3QgQ1BXTF9XbmQ6OkNyZWF0ZVBhcmFtcyYgY3ApIHsKKyAgYXV0byogcFduZCA9IG5ldyBDUFdMX0NoZWNrQm94KCk7CiAgIHBXbmQtPkNyZWF0ZShjcCk7CiAgIHBXbmQtPlNldENoZWNrKG1fcFdpZGdldC0+SXNDaGVja2VkKCkpOwogICByZXR1cm4gcFduZDsKQEAgLTQ2LDI0ICs0NSwyNyBAQAogICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcEFubm90LT5HZXRQYWdlVmlldygpOwogICAgICAgQVNTRVJUKHBQYWdlVmlldyk7CiAKLSAgICAgIGJvb2wgYlJlc2V0ID0gZmFsc2U7Ci0gICAgICBib29sIGJFeGl0ID0gZmFsc2U7Ci0gICAgICBDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciBwT2JzZXJ2ZWQobV9wV2lkZ2V0KTsKLSAgICAgIG1fcEZvcm1GaWxsRW52LT5HZXRJbnRlcmFjdGl2ZUZvcm1GaWxsZXIoKS0+T25CdXR0b25VcCgKLSAgICAgICAgICAmcE9ic2VydmVkLCBwUGFnZVZpZXcsIGJSZXNldCwgYkV4aXQsIG5GbGFncyk7CisgICAgICBDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciBwT2JzZXJ2ZWQobV9wV2lkZ2V0LkdldCgpKTsKKyAgICAgIGlmIChtX3BGb3JtRmlsbEVudi0+R2V0SW50ZXJhY3RpdmVGb3JtRmlsbGVyKCktPk9uQnV0dG9uVXAoCisgICAgICAgICAgICAgICZwT2JzZXJ2ZWQsIHBQYWdlVmlldywgbkZsYWdzKSkgeworICAgICAgICBpZiAoIXBPYnNlcnZlZCkKKyAgICAgICAgICBtX3BXaWRnZXQgPSBudWxscHRyOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KICAgICAgIGlmICghcE9ic2VydmVkKSB7CiAgICAgICAgIG1fcFdpZGdldCA9IG51bGxwdHI7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgfQotICAgICAgaWYgKGJSZXNldCB8fCBiRXhpdCkKLSAgICAgICAgcmV0dXJuIHRydWU7CiAKICAgICAgIENGRkxfRm9ybUZpbGxlcjo6T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7Ci0gICAgICBpZiAoQ1BXTF9DaGVja0JveCogcFduZCA9IChDUFdMX0NoZWNrQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCB0cnVlKSkKLSAgICAgICAgcFduZC0+U2V0Q2hlY2soIXBXbmQtPklzQ2hlY2tlZCgpKTsKIAotICAgICAgQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFncyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIENQV0xfQ2hlY2tCb3gqIHBXbmQgPSBHZXRDaGVja0JveChwUGFnZVZpZXcsIHRydWUpOworICAgICAgaWYgKHBXbmQpIHsKKyAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBzdGF0aWNfY2FzdDxDUERGU0RLX1dpZGdldCo+KHBBbm5vdCk7CisgICAgICAgIHBXbmQtPlNldENoZWNrKCFwV2lkZ2V0LT5Jc0NoZWNrZWQoKSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBDb21taXREYXRhKHBQYWdlVmlldywgbkZsYWdzKTsKICAgICB9CiAgICAgZGVmYXVsdDoKICAgICAgIHJldHVybiBDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOwpAQCAtNzYsNDEgKzc4LDUyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CiAgIENGRkxfQnV0dG9uOjpPbkxCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAKLSAgaWYgKElzVmFsaWQoKSkgewotICAgIGlmIChDUFdMX0NoZWNrQm94KiBwV25kID0gKENQV0xfQ2hlY2tCb3gqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIHRydWUpKSB7Ci0gICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwotICAgICAgcFduZC0+U2V0Q2hlY2soIXBXaWRnZXQtPklzQ2hlY2tlZCgpKTsKLSAgICB9CisgIGlmICghSXNWYWxpZCgpKQorICAgIHJldHVybiB0cnVlOwogCi0gICAgaWYgKCFDb21taXREYXRhKHBQYWdlVmlldywgbkZsYWdzKSkKLSAgICAgIHJldHVybiBmYWxzZTsKKyAgQ1BXTF9DaGVja0JveCogcFduZCA9IEdldENoZWNrQm94KHBQYWdlVmlldywgdHJ1ZSk7CisgIGlmIChwV25kKSB7CisgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBzdGF0aWNfY2FzdDxDUERGU0RLX1dpZGdldCo+KHBBbm5vdCk7CisgICAgcFduZC0+U2V0Q2hlY2soIXBXaWRnZXQtPklzQ2hlY2tlZCgpKTsKICAgfQogCi0gIHJldHVybiB0cnVlOworICByZXR1cm4gQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFncyk7CiB9CiAKIGJvb2wgQ0ZGTF9DaGVja0JveDo6SXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKLSAgQ1BXTF9DaGVja0JveCogcFduZCA9IChDUFdMX0NoZWNrQm94KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSk7CisgIENQV0xfQ2hlY2tCb3gqIHBXbmQgPSBHZXRDaGVja0JveChwUGFnZVZpZXcsIGZhbHNlKTsKICAgcmV0dXJuIHBXbmQgJiYgcFduZC0+SXNDaGVja2VkKCkgIT0gbV9wV2lkZ2V0LT5Jc0NoZWNrZWQoKTsKIH0KIAogdm9pZCBDRkZMX0NoZWNrQm94OjpTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKLSAgaWYgKENQV0xfQ2hlY2tCb3gqIHBXbmQgPSAoQ1BXTF9DaGVja0JveCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKSB7Ci0gICAgYm9vbCBiTmV3Q2hlY2tlZCA9IHBXbmQtPklzQ2hlY2tlZCgpOworICBDUFdMX0NoZWNrQm94KiBwV25kID0gR2V0Q2hlY2tCb3gocFBhZ2VWaWV3LCBmYWxzZSk7CisgIGlmICghcFduZCkKKyAgICByZXR1cm47CiAKLSAgICBpZiAoYk5ld0NoZWNrZWQpIHsKLSAgICAgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBtX3BXaWRnZXQtPkdldEZvcm1GaWVsZCgpOwotICAgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IHBGaWVsZC0+Q291bnRDb250cm9scygpOyBpIDwgc3o7IGkrKykgewotICAgICAgICBpZiAoQ1BERl9Gb3JtQ29udHJvbCogcEN0cmwgPSBwRmllbGQtPkdldENvbnRyb2woaSkpIHsKLSAgICAgICAgICBpZiAocEN0cmwtPklzQ2hlY2tlZCgpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9CisgIGJvb2wgYk5ld0NoZWNrZWQgPSBwV25kLT5Jc0NoZWNrZWQoKTsKKyAgaWYgKGJOZXdDaGVja2VkKSB7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcFdpZGdldC0+R2V0Rm9ybUZpZWxkKCk7CisgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IHBGaWVsZC0+Q291bnRDb250cm9scygpOyBpIDwgc3o7IGkrKykgeworICAgICAgaWYgKENQREZfRm9ybUNvbnRyb2wqIHBDdHJsID0gcEZpZWxkLT5HZXRDb250cm9sKGkpKSB7CisgICAgICAgIGlmIChwQ3RybC0+SXNDaGVja2VkKCkpIHsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KLQotICAgIG1fcFdpZGdldC0+U2V0Q2hlY2soYk5ld0NoZWNrZWQsIGZhbHNlKTsKLSAgICBtX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7Ci0gICAgU2V0Q2hhbmdlTWFyaygpOwogICB9CisgIENQREZTREtfV2lkZ2V0OjpPYnNlcnZlZFB0ciBvYnNlcnZlZF93aWRnZXQobV9wV2lkZ2V0LkdldCgpKTsKKyAgQ0ZGTF9DaGVja0JveDo6T2JzZXJ2ZWRQdHIgb2JzZXJ2ZWRfdGhpcyh0aGlzKTsKKworICBtX3BXaWRnZXQtPlNldENoZWNrKGJOZXdDaGVja2VkLCBmYWxzZSk7CisgIGlmICghb2JzZXJ2ZWRfd2lkZ2V0KQorICAgIHJldHVybjsKKyAgbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOworICBpZiAoIW9ic2VydmVkX3dpZGdldCB8fCAhb2JzZXJ2ZWRfdGhpcykKKyAgICByZXR1cm47CisgIFNldENoYW5nZU1hcmsoKTsKK30KKworQ1BXTF9DaGVja0JveCogQ0ZGTF9DaGVja0JveDo6R2V0Q2hlY2tCb3goQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTmV3KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxDUFdMX0NoZWNrQm94Kj4oR2V0UERGV2luZG93KHBQYWdlVmlldywgYk5ldykpOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfY2hlY2tib3guaCBiL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2NoZWNrYm94LmgKaW5kZXggNzlkZGM4NC4uOGVmM2RlNiAxMDA2NDQKLS0tIGEvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfY2hlY2tib3guaAorKysgYi9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9jaGVja2JveC5oCkBAIC03LDE2ICs3LDE3IEBACiAjaWZuZGVmIEZQREZTREtfRk9STUZJTExFUl9DRkZMX0NIRUNLQk9YX0hfCiAjZGVmaW5lIEZQREZTREtfRk9STUZJTExFUl9DRkZMX0NIRUNLQk9YX0hfCiAKLSNpbmNsdWRlICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9mb3JtZmlsbGVyLmgiCisjaW5jbHVkZSAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfYnV0dG9uLmgiCisKK2NsYXNzIENQV0xfQ2hlY2tCb3g7CiAKIGNsYXNzIENGRkxfQ2hlY2tCb3ggOiBwdWJsaWMgQ0ZGTF9CdXR0b24gewogIHB1YmxpYzoKICAgQ0ZGTF9DaGVja0JveChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KTsKICAgfkNGRkxfQ2hlY2tCb3goKSBvdmVycmlkZTsKIAotICAvLyBDRkZMX0J1dHRvbgotICBDUFdMX1duZCogTmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKKyAgLy8gQ0ZGTF9CdXR0b246CisgIENQV0xfV25kKiBOZXdQREZXaW5kb3coY29uc3QgQ1BXTF9XbmQ6OkNyZWF0ZVBhcmFtcyYgY3ApIG92ZXJyaWRlOwogICBib29sIE9uS2V5RG93bihDUERGU0RLX0Fubm90KiBwQW5ub3QsCiAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5LZXlDb2RlLAogICAgICAgICAgICAgICAgICB1aW50MzJfdCBuRmxhZ3MpIG92ZXJyaWRlOwpAQCAtMjcsNiArMjgsOSBAQAogICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKICAgYm9vbCBJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgb3ZlcnJpZGU7CiAgIHZvaWQgU2F2ZURhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIENQV0xfQ2hlY2tCb3gqIEdldENoZWNrQm94KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywgYm9vbCBiTmV3KTsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19GT1JNRklMTEVSX0NGRkxfQ0hFQ0tCT1hfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2NvbWJvYm94LmNwcCBiL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2NvbWJvYm94LmNwcAppbmRleCBjODQzOGEzLi5kOWIxMmY1IDEwMDY0NAotLS0gYS9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9jb21ib2JveC5jcHAKKysrIGIvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfY29tYm9ib3guY3BwCkBAIC05LDE0ICs5LDE0IEBACiAjaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX2Zvcm1maWxsZW52aXJvbm1lbnQuaCIKICNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfd2lkZ2V0LmgiCiAjaW5jbHVkZSAiZnBkZnNkay9mb3JtZmlsbGVyL2NiYV9mb250bWFwLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfZm9ybWZpbGxlci5oIgogI2luY2x1ZGUgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2ludGVyYWN0aXZlZm9ybWZpbGxlci5oIgogI2luY2x1ZGUgImZwZGZzZGsvZnNka19jb21tb24uaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX2NvbWJvX2JveC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAogQ0ZGTF9Db21ib0JveDo6Q0ZGTF9Db21ib0JveChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBBcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCkKLSAgICA6IENGRkxfRm9ybUZpbGxlcihwQXBwLCBwQW5ub3QpLCBtX3BGb250TWFwKG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpCisgICAgOiBDRkZMX1RleHRPYmplY3QocEFwcCwgcFdpZGdldCkgewogICBtX1N0YXRlLm5JbmRleCA9IDA7CiAgIG1fU3RhdGUublN0YXJ0ID0gMDsKICAgbV9TdGF0ZS5uRW5kID0gMDsKQEAgLTMwLDI4ICszMCwyMCBAQAogICAvLyBUaGUgZm9udCBtYXAgc2hvdWxkIGJlIHN0b3JlZCBzb21ld2hlcmUgbW9yZSBhcHByb3ByaWF0ZSBzbyBpdCB3aWxsIGxpdmUKICAgLy8gdW50aWwgdGhlIFBXTF9FZGl0IGlzIGRvbmUgd2l0aCBpdC4gcGRmaXVtOjU2NgogICBEZXN0cm95V2luZG93cygpOwotICBkZWxldGUgbV9wRm9udE1hcDsKIH0KIAotUFdMX0NSRUFURVBBUkFNIENGRkxfQ29tYm9Cb3g6OkdldENyZWF0ZVBhcmFtKCkgewotICBQV0xfQ1JFQVRFUEFSQU0gY3AgPSBDRkZMX0Zvcm1GaWxsZXI6OkdldENyZWF0ZVBhcmFtKCk7Ci0KLSAgaW50IG5GbGFncyA9IG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpOwotICBpZiAobkZsYWdzICYgRklFTERGTEFHX0VESVQpIHsKK0NQV0xfV25kOjpDcmVhdGVQYXJhbXMgQ0ZGTF9Db21ib0JveDo6R2V0Q3JlYXRlUGFyYW0oKSB7CisgIENQV0xfV25kOjpDcmVhdGVQYXJhbXMgY3AgPSBDRkZMX1RleHRPYmplY3Q6OkdldENyZWF0ZVBhcmFtKCk7CisgIGlmIChtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19FRElUKQogICAgIGNwLmR3RmxhZ3MgfD0gUENCU19BTExPV0NVU1RPTVRFWFQ7Ci0gIH0KIAotICBpZiAoIW1fcEZvbnRNYXApCi0gICAgbV9wRm9udE1hcCA9IG5ldyBDQkFfRm9udE1hcChtX3BXaWRnZXQsIEdldFN5c3RlbUhhbmRsZXIoKSk7Ci0gIGNwLnBGb250TWFwID0gbV9wRm9udE1hcDsKKyAgY3AucEZvbnRNYXAgPSBNYXliZUNyZWF0ZUZvbnRNYXAoKTsKICAgY3AucEZvY3VzSGFuZGxlciA9IHRoaXM7Ci0KICAgcmV0dXJuIGNwOwogfQogCi1DUFdMX1duZCogQ0ZGTF9Db21ib0JveDo6TmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgewotICBDUFdMX0NvbWJvQm94KiBwV25kID0gbmV3IENQV0xfQ29tYm9Cb3goKTsKK0NQV0xfV25kKiBDRkZMX0NvbWJvQm94OjpOZXdQREZXaW5kb3coY29uc3QgQ1BXTF9XbmQ6OkNyZWF0ZVBhcmFtcyYgY3ApIHsKKyAgYXV0byogcFduZCA9IG5ldyBDUFdMX0NvbWJvQm94KCk7CiAgIHBXbmQtPkF0dGFjaEZGTERhdGEodGhpcyk7CiAgIHBXbmQtPkNyZWF0ZShjcCk7CiAKQEAgLTYwLDcgKzUyLDcgQEAKICAgcFduZC0+U2V0RmlsbGVyTm90aWZ5KHBGb3JtRmlsbGVyKTsKIAogICBpbnQzMl90IG5DdXJTZWwgPSBtX3BXaWRnZXQtPkdldFNlbGVjdGVkSW5kZXgoMCk7Ci0gIENGWF9XaWRlU3RyaW5nIHN3VGV4dDsKKyAgV2lkZVN0cmluZyBzd1RleHQ7CiAgIGlmIChuQ3VyU2VsIDwgMCkKICAgICBzd1RleHQgPSBtX3BXaWRnZXQtPkdldFZhbHVlKCk7CiAgIGVsc2UKQEAgLTc4LDcgKzcwLDcgQEAKIGJvb2wgQ0ZGTF9Db21ib0JveDo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5DaGFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWdzKSB7Ci0gIHJldHVybiBDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOworICByZXR1cm4gQ0ZGTF9UZXh0T2JqZWN0OjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKIH0KIAogYm9vbCBDRkZMX0NvbWJvQm94OjpJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgewpAQCAtMTAyLDcgKzk0LDcgQEAKICAgaWYgKCFwV25kKQogICAgIHJldHVybjsKIAotICBDRlhfV2lkZVN0cmluZyBzd1RleHQgPSBwV25kLT5HZXRUZXh0KCk7CisgIFdpZGVTdHJpbmcgc3dUZXh0ID0gcFduZC0+R2V0VGV4dCgpOwogICBpbnQzMl90IG5DdXJTZWwgPSBwV25kLT5HZXRTZWxlY3QoKTsKIAogICBib29sIGJTZXRWYWx1ZSA9IGZhbHNlOwpAQCAtMTE2LDExICsxMDgsMTYgQEAKICAgICBtX3BXaWRnZXQtPkdldFNlbGVjdGVkSW5kZXgoMCk7CiAgICAgbV9wV2lkZ2V0LT5TZXRPcHRpb25TZWxlY3Rpb24obkN1clNlbCwgdHJ1ZSwgZmFsc2UpOwogICB9CisgIENQREZTREtfV2lkZ2V0OjpPYnNlcnZlZFB0ciBvYnNlcnZlZF93aWRnZXQobV9wV2lkZ2V0LkdldCgpKTsKKyAgQ0ZGTF9Db21ib0JveDo6T2JzZXJ2ZWRQdHIgb2JzZXJ2ZWRfdGhpcyh0aGlzKTsKIAogICBtX3BXaWRnZXQtPlJlc2V0RmllbGRBcHBlYXJhbmNlKHRydWUpOworICBpZiAoIW9ic2VydmVkX3dpZGdldCkKKyAgICByZXR1cm47CiAgIG1fcFdpZGdldC0+VXBkYXRlRmllbGQoKTsKKyAgaWYgKCFvYnNlcnZlZF93aWRnZXQgfHwgIW9ic2VydmVkX3RoaXMpCisgICAgcmV0dXJuOwogICBTZXRDaGFuZ2VNYXJrKCk7Ci0KICAgbV9wV2lkZ2V0LT5HZXRQREZQYWdlKCk7CiB9CiAKQEAgLTEzNSw3ICsxMzIsNyBAQAogICAgICAgICAgIGZhLmJGaWVsZEZ1bGwgPSBwRWRpdC0+SXNUZXh0RnVsbCgpOwogICAgICAgICAgIGludCBuU2VsU3RhcnQgPSAwOwogICAgICAgICAgIGludCBuU2VsRW5kID0gMDsKLSAgICAgICAgICBwRWRpdC0+R2V0U2VsKG5TZWxTdGFydCwgblNlbEVuZCk7CisgICAgICAgICAgcEVkaXQtPkdldFNlbGVjdGlvbihuU2VsU3RhcnQsIG5TZWxFbmQpOwogICAgICAgICAgIGZhLm5TZWxFbmQgPSBuU2VsRW5kOwogICAgICAgICAgIGZhLm5TZWxTdGFydCA9IG5TZWxTdGFydDsKICAgICAgICAgICBmYS5zVmFsdWUgPSBwRWRpdC0+R2V0VGV4dCgpOwpAQCAtMTczLDcgKzE3MCw3IEBACiAgICAgICBpZiAoQ1BXTF9Db21ib0JveCogcENvbWJvQm94ID0KICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1BXTF9Db21ib0JveCo+KEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkpIHsKICAgICAgICAgaWYgKENQV0xfRWRpdCogcEVkaXQgPSBwQ29tYm9Cb3gtPkdldEVkaXQoKSkgewotICAgICAgICAgIHBFZGl0LT5TZXRTZWwoZmEublNlbFN0YXJ0LCBmYS5uU2VsRW5kKTsKKyAgICAgICAgICBwRWRpdC0+U2V0U2VsZWN0aW9uKGZhLm5TZWxTdGFydCwgZmEublNlbEVuZCk7CiAgICAgICAgICAgcEVkaXQtPlJlcGxhY2VTZWwoZmEuc0NoYW5nZSk7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTIwNiw3ICsyMDMsNyBAQAogICAgIG1fU3RhdGUubkluZGV4ID0gcENvbWJvQm94LT5HZXRTZWxlY3QoKTsKIAogICAgIGlmIChDUFdMX0VkaXQqIHBFZGl0ID0gcENvbWJvQm94LT5HZXRFZGl0KCkpIHsKLSAgICAgIHBFZGl0LT5HZXRTZWwobV9TdGF0ZS5uU3RhcnQsIG1fU3RhdGUubkVuZCk7CisgICAgICBwRWRpdC0+R2V0U2VsZWN0aW9uKG1fU3RhdGUublN0YXJ0LCBtX1N0YXRlLm5FbmQpOwogICAgICAgbV9TdGF0ZS5zVmFsdWUgPSBwRWRpdC0+R2V0VGV4dCgpOwogICAgIH0KICAgfQpAQCAtMjIyLDMzICsyMTksMTIgQEAKICAgICB9IGVsc2UgewogICAgICAgaWYgKENQV0xfRWRpdCogcEVkaXQgPSBwQ29tYm9Cb3gtPkdldEVkaXQoKSkgewogICAgICAgICBwRWRpdC0+U2V0VGV4dChtX1N0YXRlLnNWYWx1ZSk7Ci0gICAgICAgIHBFZGl0LT5TZXRTZWwobV9TdGF0ZS5uU3RhcnQsIG1fU3RhdGUubkVuZCk7CisgICAgICAgIHBFZGl0LT5TZXRTZWxlY3Rpb24obV9TdGF0ZS5uU3RhcnQsIG1fU3RhdGUubkVuZCk7CiAgICAgICB9CiAgICAgfQogICB9CiB9CiAKLUNQV0xfV25kKiBDRkZMX0NvbWJvQm94OjpSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmVzdG9yZVZhbHVlKSB7Ci0gIGlmIChiUmVzdG9yZVZhbHVlKQotICAgIFNhdmVTdGF0ZShwUGFnZVZpZXcpOwotCi0gIERlc3Ryb3lQREZXaW5kb3cocFBhZ2VWaWV3KTsKLQotICBDUFdMX1duZCogcFJldCA9IG51bGxwdHI7Ci0KLSAgaWYgKGJSZXN0b3JlVmFsdWUpIHsKLSAgICBSZXN0b3JlU3RhdGUocFBhZ2VWaWV3KTsKLSAgICBwUmV0ID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpOwotICB9IGVsc2UgewotICAgIHBSZXQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCB0cnVlKTsKLSAgfQotCi0gIG1fcFdpZGdldC0+VXBkYXRlRmllbGQoKTsKLQotICByZXR1cm4gcFJldDsKLX0KLQogI2lmZGVmIFBERl9FTkFCTEVfWEZBCiBib29sIENGRkxfQ29tYm9Cb3g6OklzRmllbGRGdWxsKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgewogICBpZiAoQ1BXTF9Db21ib0JveCogcENvbWJvQm94ID0KQEAgLTI2MCwyNSArMjM2LDE5IEBACiB9CiAjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKLXZvaWQgQ0ZGTF9Db21ib0JveDo6T25TZXRGb2N1cyhDUFdMX1duZCogcFduZCkgewotICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOwordm9pZCBDRkZMX0NvbWJvQm94OjpPblNldEZvY3VzKENQV0xfRWRpdCogcEVkaXQpIHsKKyAgcEVkaXQtPlNldENoYXJTZXQoRlhfQ0hBUlNFVF9DaGluZXNlU2ltcGxpZmllZCk7CisgIHBFZGl0LT5TZXRSZWFkeVRvSW5wdXQoKTsKIAotICBpZiAocFduZC0+R2V0Q2xhc3NOYW1lKCkgPT0gUFdMX0NMQVNTTkFNRV9FRElUKSB7Ci0gICAgQ1BXTF9FZGl0KiBwRWRpdCA9IChDUFdMX0VkaXQqKXBXbmQ7Ci0gICAgcEVkaXQtPlNldENoYXJTZXQoRlhGT05UX0dCMjMxMl9DSEFSU0VUKTsKLSAgICBwRWRpdC0+U2V0Q29kZVBhZ2UoOTM2KTsKLQotICAgIHBFZGl0LT5TZXRSZWFkeVRvSW5wdXQoKTsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQgPSBwRWRpdC0+R2V0VGV4dCgpOwotICAgIGludCBuQ2hhcmFjdGVycyA9IHdzVGV4dC5HZXRMZW5ndGgoKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBic1VURlRleHQgPSB3c1RleHQuVVRGMTZMRV9FbmNvZGUoKTsKLSAgICB1bnNpZ25lZCBzaG9ydCogcEJ1ZmZlciA9ICh1bnNpZ25lZCBzaG9ydCopYnNVVEZUZXh0LmNfc3RyKCk7Ci0gICAgbV9wRm9ybUZpbGxFbnYtPk9uU2V0RmllbGRJbnB1dEZvY3VzKHBCdWZmZXIsIG5DaGFyYWN0ZXJzLCB0cnVlKTsKLSAgfQorICBXaWRlU3RyaW5nIHdzVGV4dCA9IHBFZGl0LT5HZXRUZXh0KCk7CisgIGludCBuQ2hhcmFjdGVycyA9IHdzVGV4dC5HZXRMZW5ndGgoKTsKKyAgQnl0ZVN0cmluZyBic1VURlRleHQgPSB3c1RleHQuVVRGMTZMRV9FbmNvZGUoKTsKKyAgYXV0byogcEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgc2hvcnQqPihic1VURlRleHQuY19zdHIoKSk7CisgIG1fcEZvcm1GaWxsRW52LT5PblNldEZpZWxkSW5wdXRGb2N1cyhwQnVmZmVyLCBuQ2hhcmFjdGVycywgdHJ1ZSk7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENGRkxfQ29tYm9Cb3g6OkdldFNlbGVjdEV4cG9ydFRleHQoKSB7Ci0gIENGWF9XaWRlU3RyaW5nIHN3UmV0OworV2lkZVN0cmluZyBDRkZMX0NvbWJvQm94OjpHZXRTZWxlY3RFeHBvcnRUZXh0KCkgeworICBXaWRlU3RyaW5nIHN3UmV0OwogCiAgIGludCBuRXhwb3J0ID0gLTE7CiAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KHRydWUpOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfY29tYm9ib3guaCBiL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2NvbWJvYm94LmgKaW5kZXggYWFiMTBiOS4uYmRjMDkzNCAxMDA2NDQKLS0tIGEvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfY29tYm9ib3guaAorKysgYi9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9jb21ib2JveC5oCkBAIC04LDcgKzgsNyBAQAogI2RlZmluZSBGUERGU0RLX0ZPUk1GSUxMRVJfQ0ZGTF9DT01CT0JPWF9IXwogCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9mb3JtZmlsbGVyLmgiCisjaW5jbHVkZSAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfdGV4dG9iamVjdC5oIgogCiBjbGFzcyBDQkFfRm9udE1hcDsKIApAQCAtMTYsMTggKzE2LDE4IEBACiAgIGludCBuSW5kZXg7CiAgIGludCBuU3RhcnQ7CiAgIGludCBuRW5kOwotICBDRlhfV2lkZVN0cmluZyBzVmFsdWU7CisgIFdpZGVTdHJpbmcgc1ZhbHVlOwogfTsKIAotY2xhc3MgQ0ZGTF9Db21ib0JveCA6IHB1YmxpYyBDRkZMX0Zvcm1GaWxsZXIsIHB1YmxpYyBJUFdMX0ZvY3VzSGFuZGxlciB7CitjbGFzcyBDRkZMX0NvbWJvQm94IDogcHVibGljIENGRkxfVGV4dE9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQ1BXTF9XbmQ6OkZvY3VzSGFuZGxlcklmYWNlIHsKICBwdWJsaWM6Ci0gIENGRkxfQ29tYm9Cb3goQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwV2lkZ2V0KTsKKyAgQ0ZGTF9Db21ib0JveChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KTsKICAgfkNGRkxfQ29tYm9Cb3goKSBvdmVycmlkZTsKIAotICAvLyBDRkZMX0Zvcm1GaWxsZXI6Ci0gIFBXTF9DUkVBVEVQQVJBTSBHZXRDcmVhdGVQYXJhbSgpIG92ZXJyaWRlOwotICBDUFdMX1duZCogTmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKKyAgLy8gQ0ZGTF9UZXh0T2JqZWN0OgorICBDUFdMX1duZDo6Q3JlYXRlUGFyYW1zIEdldENyZWF0ZVBhcmFtKCkgb3ZlcnJpZGU7CisgIENQV0xfV25kKiBOZXdQREZXaW5kb3coY29uc3QgQ1BXTF9XbmQ6OkNyZWF0ZVBhcmFtcyYgY3ApIG92ZXJyaWRlOwogICBib29sIE9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIHVpbnQzMl90IG5DaGFyLCB1aW50MzJfdCBuRmxhZ3MpIG92ZXJyaWRlOwogICBib29sIElzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKICAgdm9pZCBTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIG92ZXJyaWRlOwpAQCAtNDIsMjEgKzQyLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KSBvdmVycmlkZTsKICAgdm9pZCBTYXZlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKICAgdm9pZCBSZXN0b3JlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKLSAgQ1BXTF9XbmQqIFJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJlc3RvcmVWYWx1ZSkgb3ZlcnJpZGU7Ci0KLSAgLy8gSVBXTF9Gb2N1c0hhbmRsZXI6Ci0gIHZvaWQgT25TZXRGb2N1cyhDUFdMX1duZCogcFduZCkgb3ZlcnJpZGU7Ci0KICNpZmRlZiBQREZfRU5BQkxFX1hGQQotICAvLyBDRkZMX0Zvcm1GaWxsZXI6CiAgIGJvb2wgSXNGaWVsZEZ1bGwoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKLSNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyNlbmRpZgorCisgIC8vIENQV0xfV25kOjpGb2N1c0hhbmRsZXJJZmFjZToKKyAgdm9pZCBPblNldEZvY3VzKENQV0xfRWRpdCogcEVkaXQpIG92ZXJyaWRlOwogCiAgcHJpdmF0ZToKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0U2VsZWN0RXhwb3J0VGV4dCgpOworICBXaWRlU3RyaW5nIEdldFNlbGVjdEV4cG9ydFRleHQoKTsKIAotICBDQkFfRm9udE1hcCogbV9wRm9udE1hcDsKICAgRkZMX0NvbWJvQm94U3RhdGUgbV9TdGF0ZTsKIH07CiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2Zvcm1maWxsZXIuY3BwIGIvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfZm9ybWZpbGxlci5jcHAKaW5kZXggZGE2ZjkyMC4uZDNhYTM3ZSAxMDA2NDQKLS0tIGEvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfZm9ybWZpbGxlci5jcHAKKysrIGIvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfZm9ybWZpbGxlci5jcHAKQEAgLTYsNiArNiw4IEBACiAKICNpbmNsdWRlICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9mb3JtZmlsbGVyLmgiCiAKKyNpbmNsdWRlIDx1dGlsaXR5PgorCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaCIKICNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfZm9ybWZpbGxlbnZpcm9ubWVudC5oIgpAQCAtMTMsMTggKzE1LDE5IEBACiAjaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX3dpZGdldC5oIgogI2luY2x1ZGUgImZwZGZzZGsvZm9ybWZpbGxlci9jYmFfZm9udG1hcC5oIgogI2luY2x1ZGUgImZwZGZzZGsvZnNka19jb21tb24uaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfVXRpbHMuaCIKIAotI2RlZmluZSBHZXRSZWQocmdiKSAoKHVpbnQ4X3QpKHJnYikpCi0jZGVmaW5lIEdldEdyZWVuKHJnYikgKCh1aW50OF90KSgoKHVpbnQxNl90KShyZ2IpKSA+PiA4KSkKLSNkZWZpbmUgR2V0Qmx1ZShyZ2IpICgodWludDhfdCkoKHJnYikgPj4gMTYpKQorbmFtZXNwYWNlIHsKIAotI2RlZmluZSBGRkxfSElOVF9FTEFQU0UgODAwCitDUERGU0RLX1dpZGdldCogQ1BERlNES0Fubm90VG9XaWRnZXQoQ1BERlNES19Bbm5vdCogYW5ub3QpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PENQREZTREtfV2lkZ2V0Kj4oYW5ub3QpOworfQorCit9ICAvLyBuYW1lc3BhY2UKIAogQ0ZGTF9Gb3JtRmlsbGVyOjpDRkZMX0Zvcm1GaWxsZXIoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QpCi0gICAgOiBtX3BGb3JtRmlsbEVudihwRm9ybUZpbGxFbnYpLCBtX3BBbm5vdChwQW5ub3QpLCBtX2JWYWxpZChmYWxzZSkgewotICBtX3BXaWRnZXQgPSBzdGF0aWNfY2FzdDxDUERGU0RLX1dpZGdldCo+KHBBbm5vdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCkKKyAgICA6IG1fcEZvcm1GaWxsRW52KHBGb3JtRmlsbEVudiksIG1fcFdpZGdldChwV2lkZ2V0KSwgbV9iVmFsaWQoZmFsc2UpIHsKKyAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKIH0KIAogQ0ZGTF9Gb3JtRmlsbGVyOjp+Q0ZGTF9Gb3JtRmlsbGVyKCkgewpAQCAtMzQsNyArMzcsNyBAQAogdm9pZCBDRkZMX0Zvcm1GaWxsZXI6OkRlc3Ryb3lXaW5kb3dzKCkgewogICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbV9NYXBzKSB7CiAgICAgQ1BXTF9XbmQqIHBXbmQgPSBpdC5zZWNvbmQ7Ci0gICAgQ0ZGTF9Qcml2YXRlRGF0YSogcERhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcFduZC0+R2V0QXR0YWNoZWREYXRhKCk7CisgICAgYXV0byogcERhdGEgPSBzdGF0aWNfY2FzdDxDRkZMX1ByaXZhdGVEYXRhKj4ocFduZC0+R2V0QXR0YWNoZWREYXRhKCkpOwogICAgIHBXbmQtPkludmFsaWRhdGVQcm92aWRlcih0aGlzKTsKICAgICBwV25kLT5EZXN0cm95KCk7CiAgICAgZGVsZXRlIHBXbmQ7CkBAIC00Myw2OCArNDYsNTMgQEAKICAgbV9NYXBzLmNsZWFyKCk7CiB9CiAKLXZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpTZXRXaW5kb3dSZWN0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjV2luZG93KSB7Ci0gIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkgewotICAgIHBXbmQtPk1vdmUoQ0ZYX0Zsb2F0UmVjdChyY1dpbmRvdyksIHRydWUsIGZhbHNlKTsKLSAgfQotfQotCi1DRlhfRmxvYXRSZWN0IENGRkxfRm9ybUZpbGxlcjo6R2V0V2luZG93UmVjdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKLSAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKSB7Ci0gICAgcmV0dXJuIHBXbmQtPkdldFdpbmRvd1JlY3QoKTsKLSAgfQotCi0gIHJldHVybiBDRlhfRmxvYXRSZWN0KDAsIDAsIDAsIDApOwotfQotCiBGWF9SRUNUIENGRkxfRm9ybUZpbGxlcjo6R2V0Vmlld0JCb3goQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCkgewogICBBU1NFUlQocFBhZ2VWaWV3KTsKICAgQVNTRVJUKHBBbm5vdCk7CiAKICAgQ0ZYX0Zsb2F0UmVjdCByY0Fubm90ID0gbV9wV2lkZ2V0LT5HZXRSZWN0KCk7Ci0KLSAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKSB7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByY1dpbmRvdyA9IHBXbmQtPkdldFdpbmRvd1JlY3QoKTsKLSAgICByY0Fubm90ID0gUFdMdG9GRkwocmNXaW5kb3cpOwotICB9CisgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkKKyAgICByY0Fubm90ID0gUFdMdG9GRkwocFduZC0+R2V0V2luZG93UmVjdCgpKTsKIAogICBDRlhfRmxvYXRSZWN0IHJjV2luID0gcmNBbm5vdDsKLQogICBDRlhfRmxvYXRSZWN0IHJjRm9jdXMgPSBHZXRGb2N1c0JveChwUGFnZVZpZXcpOwogICBpZiAoIXJjRm9jdXMuSXNFbXB0eSgpKQogICAgIHJjV2luLlVuaW9uKHJjRm9jdXMpOwogCi0gIENGWF9GbG9hdFJlY3QgcmVjdCA9IENQV0xfVXRpbHM6OkluZmxhdGVSZWN0KHJjV2luLCAxKTsKLQotICByZXR1cm4gcmVjdC5HZXRPdXRlclJlY3QoKTsKKyAgaWYgKCFyY1dpbi5Jc0VtcHR5KCkpIHsKKyAgICByY1dpbi5JbmZsYXRlKDEsIDEpOworICAgIHJjV2luLk5vcm1hbGl6ZSgpOworICB9CisgIHJldHVybiByY1dpbi5HZXRPdXRlclJlY3QoKTsKIH0KIAogdm9pZCBDRkZMX0Zvcm1GaWxsZXI6Ok9uRHJhdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG10VXNlcjJEZXZpY2UpIHsKICAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3VidHlwZSgpID09IENQREZfQW5ub3Q6OlN1YnR5cGU6OldJREdFVCk7CiAKICAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKSB7CiAgICAgQ0ZYX01hdHJpeCBtdCA9IEdldEN1ck1hdHJpeCgpOwotICAgIG10LkNvbmNhdCgqcFVzZXIyRGV2aWNlKTsKLSAgICBwV25kLT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCAmbXQpOwotICB9IGVsc2UgewotICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7Ci0gICAgaWYgKENGRkxfSW50ZXJhY3RpdmVGb3JtRmlsbGVyOjpJc1Zpc2libGUocFdpZGdldCkpCi0gICAgICBwV2lkZ2V0LT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6Ok5vcm1hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIG10LkNvbmNhdChtdFVzZXIyRGV2aWNlKTsKKyAgICBwV25kLT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBtdCk7CisgICAgcmV0dXJuOwogICB9CisKKyAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBDUERGU0RLQW5ub3RUb1dpZGdldChwQW5ub3QpOworICBpZiAoIUNGRkxfSW50ZXJhY3RpdmVGb3JtRmlsbGVyOjpJc1Zpc2libGUocFdpZGdldCkpCisgICAgcmV0dXJuOworCisgIHBXaWRnZXQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIG10VXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6Ok5vcm1hbCwgbnVsbHB0cik7CiB9CiAKIHZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpPbkRyYXdEZWFjdGl2ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKSB7Ci0gIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gKENQREZTREtfV2lkZ2V0KilwQW5ub3Q7Ci0gIHBXaWRnZXQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Bbm5vdDo6Tm9ybWFsLCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtdFVzZXIyRGV2aWNlKSB7CisgIENQREZTREtBbm5vdFRvV2lkZ2V0KHBBbm5vdCktPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIG10VXNlcjJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQW5ub3Q6Ok5vcm1hbCwgbnVsbHB0cik7CiB9CiAKIHZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpPbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LApAQCAtMTIwLDE3ICsxMDgsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIHRydWUpKSB7Ci0gICAgbV9iVmFsaWQgPSB0cnVlOwotICAgIEZYX1JFQ1QgcmVjdCA9IEdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KTsKLSAgICBJbnZhbGlkYXRlUmVjdChyZWN0KTsKLSAgICBpZiAoIXJlY3QuQ29udGFpbnMoc3RhdGljX2Nhc3Q8aW50Pihwb2ludC54KSwgc3RhdGljX2Nhc3Q8aW50Pihwb2ludC55KSkpCi0gICAgICByZXR1cm4gZmFsc2U7CisgIENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgdHJ1ZSk7CisgIGlmICghcFduZCkKKyAgICByZXR1cm4gZmFsc2U7CiAKLSAgICByZXR1cm4gcFduZC0+T25MQnV0dG9uRG93bihXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSwgbkZsYWdzKTsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKKyAgbV9iVmFsaWQgPSB0cnVlOworICBGWF9SRUNUIHJlY3QgPSBHZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdCk7CisgIEludmFsaWRhdGVSZWN0KHJlY3QpOworICBpZiAoIXJlY3QuQ29udGFpbnMoc3RhdGljX2Nhc3Q8aW50Pihwb2ludC54KSwgc3RhdGljX2Nhc3Q8aW50Pihwb2ludC55KSkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gcFduZC0+T25MQnV0dG9uRG93bihXbmR0b1BXTChwUGFnZVZpZXcsIHBvaW50KSwgbkZsYWdzKTsKIH0KIAogYm9vbCBDRkZMX0Zvcm1GaWxsZXI6Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKQEAgLTE2Miw5ICsxNDksNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuRmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgaWYgKG1fcHRPbGRQb3MgIT0gcG9pbnQpCi0gICAgbV9wdE9sZFBvcyA9IHBvaW50OwotCiAgIENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpOwogICBpZiAoIXBXbmQpCiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjEyLDMxICsxOTYsNTMgQEAKIGJvb2wgQ0ZGTF9Gb3JtRmlsbGVyOjpPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuS2V5Q29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWdzKSB7Ci0gIGlmIChJc1ZhbGlkKCkpIHsKLSAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBHZXRDdXJQYWdlVmlldyh0cnVlKTsKLSAgICBBU1NFUlQocFBhZ2VWaWV3KTsKKyAgaWYgKCFJc1ZhbGlkKCkpCisgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKSB7Ci0gICAgICByZXR1cm4gcFduZC0+T25LZXlEb3duKG5LZXlDb2RlLCBuRmxhZ3MpOwotICAgIH0KLSAgfQorICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBHZXRDdXJQYWdlVmlldyh0cnVlKTsKKyAgQVNTRVJUKHBQYWdlVmlldyk7CiAKLSAgcmV0dXJuIGZhbHNlOworICBDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKTsKKyAgcmV0dXJuIHBXbmQgJiYgcFduZC0+T25LZXlEb3duKG5LZXlDb2RlLCBuRmxhZ3MpOwogfQogCiBib29sIENGRkxfRm9ybUZpbGxlcjo6T25DaGFyKENQREZTREtfQW5ub3QqIHBBbm5vdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkNoYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFncykgewotICBpZiAoSXNWYWxpZCgpKSB7Ci0gICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gR2V0Q3VyUGFnZVZpZXcodHJ1ZSk7Ci0gICAgQVNTRVJUKHBQYWdlVmlldyk7CisgIGlmICghSXNWYWxpZCgpKQorICAgIHJldHVybiBmYWxzZTsKIAotICAgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkgewotICAgICAgcmV0dXJuIHBXbmQtPk9uQ2hhcihuQ2hhciwgbkZsYWdzKTsKLSAgICB9Ci0gIH0KKyAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gR2V0Q3VyUGFnZVZpZXcodHJ1ZSk7CisgIEFTU0VSVChwUGFnZVZpZXcpOwogCi0gIHJldHVybiBmYWxzZTsKKyAgQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSk7CisgIHJldHVybiBwV25kICYmIHBXbmQtPk9uQ2hhcihuQ2hhciwgbkZsYWdzKTsKK30KKworV2lkZVN0cmluZyBDRkZMX0Zvcm1GaWxsZXI6OkdldFNlbGVjdGVkVGV4dChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKKyAgaWYgKCFJc1ZhbGlkKCkpCisgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKKworICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBHZXRDdXJQYWdlVmlldyh0cnVlKTsKKyAgQVNTRVJUKHBQYWdlVmlldyk7CisKKyAgQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSk7CisgIHJldHVybiBwV25kID8gcFduZC0+R2V0U2VsZWN0ZWRUZXh0KCkgOiBXaWRlU3RyaW5nKCk7Cit9CisKK3ZvaWQgQ0ZGTF9Gb3JtRmlsbGVyOjpSZXBsYWNlU2VsZWN0aW9uKENQREZTREtfQW5ub3QqIHBBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHRleHQpIHsKKyAgaWYgKCFJc1ZhbGlkKCkpCisgICAgcmV0dXJuOworCisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KHRydWUpOworICBBU1NFUlQocFBhZ2VWaWV3KTsKKworICBDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKTsKKyAgaWYgKCFwV25kKQorICAgIHJldHVybjsKKworICBwV25kLT5SZXBsYWNlU2VsZWN0aW9uKHRleHQpOwogfQogCiB2b2lkIENGRkxfRm9ybUZpbGxlcjo6U2V0Rm9jdXNGb3JBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QsIHVpbnQzMl90IG5GbGFnKSB7CkBAIC0yNTUsMTkgKzI2MSwxNiBAQAogICAgIHJldHVybjsKIAogICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBHZXRDdXJQYWdlVmlldyhmYWxzZSk7Ci0gIGlmICghcFBhZ2VWaWV3KQorICBpZiAoIXBQYWdlVmlldyB8fCAhQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFnKSkKICAgICByZXR1cm47Ci0KLSAgQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFnKTsKLQogICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpCiAgICAgcFduZC0+S2lsbEZvY3VzKCk7CiAKICAgYm9vbCBiRGVzdHJveVBERldpbmRvdzsKICAgc3dpdGNoIChtX3BXaWRnZXQtPkdldEZpZWxkVHlwZSgpKSB7Ci0gICAgY2FzZSBGSUVMRFRZUEVfUFVTSEJVVFRPTjoKLSAgICBjYXNlIEZJRUxEVFlQRV9DSEVDS0JPWDoKLSAgICBjYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjoKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtQdXNoQnV0dG9uOgorICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a0NoZWNrQm94OgorICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a1JhZGlvQnV0dG9uOgogICAgICAgYkRlc3Ryb3lQREZXaW5kb3cgPSB0cnVlOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKQEAgLTI4MSwzNiArMjg0LDI3IEBACiAgIHJldHVybiBtX2JWYWxpZDsKIH0KIAotUFdMX0NSRUFURVBBUkFNIENGRkxfRm9ybUZpbGxlcjo6R2V0Q3JlYXRlUGFyYW0oKSB7Ci0gIEFTU0VSVChtX3BGb3JtRmlsbEVudik7Ci0KLSAgUFdMX0NSRUFURVBBUkFNIGNwOworQ1BXTF9XbmQ6OkNyZWF0ZVBhcmFtcyBDRkZMX0Zvcm1GaWxsZXI6OkdldENyZWF0ZVBhcmFtKCkgeworICBDUFdMX1duZDo6Q3JlYXRlUGFyYW1zIGNwOwogICBjcC5wUGFyZW50V25kID0gbnVsbHB0cjsKICAgY3AucFByb3ZpZGVyLlJlc2V0KHRoaXMpOwogICBjcC5yY1JlY3RXbmQgPSBHZXRQREZXaW5kb3dSZWN0KCk7CiAKICAgdWludDMyX3QgZHdDcmVhdGVGbGFncyA9IFBXU19CT1JERVIgfCBQV1NfQkFDS0dST1VORCB8IFBXU19WSVNJQkxFOwogICB1aW50MzJfdCBkd0ZpZWxkRmxhZyA9IG1fcFdpZGdldC0+R2V0RmllbGRGbGFncygpOwotICBpZiAoZHdGaWVsZEZsYWcgJiBGSUVMREZMQUdfUkVBRE9OTFkpIHsKKyAgaWYgKGR3RmllbGRGbGFnICYgRklFTERGTEFHX1JFQURPTkxZKQogICAgIGR3Q3JlYXRlRmxhZ3MgfD0gUFdTX1JFQURPTkxZOwotICB9CiAKICAgRlhfQ09MT1JSRUYgY29sb3I7Ci0gIGlmIChtX3BXaWRnZXQtPkdldEZpbGxDb2xvcihjb2xvcikpIHsKLSAgICBjcC5zQmFja2dyb3VuZENvbG9yID0KLSAgICAgICAgQ1BXTF9Db2xvcihHZXRSZWQoY29sb3IpLCBHZXRHcmVlbihjb2xvciksIEdldEJsdWUoY29sb3IpKTsKLSAgfQorICBpZiAobV9wV2lkZ2V0LT5HZXRGaWxsQ29sb3IoY29sb3IpKQorICAgIGNwLnNCYWNrZ3JvdW5kQ29sb3IgPSBDRlhfQ29sb3IoY29sb3IpOworICBpZiAobV9wV2lkZ2V0LT5HZXRCb3JkZXJDb2xvcihjb2xvcikpCisgICAgY3Auc0JvcmRlckNvbG9yID0gQ0ZYX0NvbG9yKGNvbG9yKTsKIAotICBpZiAobV9wV2lkZ2V0LT5HZXRCb3JkZXJDb2xvcihjb2xvcikpIHsKLSAgICBjcC5zQm9yZGVyQ29sb3IgPQotICAgICAgICBDUFdMX0NvbG9yKEdldFJlZChjb2xvciksIEdldEdyZWVuKGNvbG9yKSwgR2V0Qmx1ZShjb2xvcikpOwotICB9CisgIGNwLnNUZXh0Q29sb3IgPSBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprR3JheSwgMCk7CiAKLSAgY3Auc1RleHRDb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDApOwotCi0gIGlmIChtX3BXaWRnZXQtPkdldFRleHRDb2xvcihjb2xvcikpIHsKLSAgICBjcC5zVGV4dENvbG9yID0gQ1BXTF9Db2xvcihHZXRSZWQoY29sb3IpLCBHZXRHcmVlbihjb2xvciksIEdldEJsdWUoY29sb3IpKTsKLSAgfQorICBpZiAobV9wV2lkZ2V0LT5HZXRUZXh0Q29sb3IoY29sb3IpKQorICAgIGNwLnNUZXh0Q29sb3IgPSBDRlhfQ29sb3IoY29sb3IpOwogCiAgIGNwLmZGb250U2l6ZSA9IG1fcFdpZGdldC0+R2V0Rm9udFNpemUoKTsKICAgY3AuZHdCb3JkZXJXaWR0aCA9IG1fcFdpZGdldC0+R2V0Qm9yZGVyV2lkdGgoKTsKQEAgLTMyMSw4ICszMTUsNiBAQAogICAgICAgY3Auc0Rhc2ggPSBDUFdMX0Rhc2goMywgMywgMCk7CiAgICAgICBicmVhazsKICAgICBjYXNlIEJvcmRlclN0eWxlOjpCRVZFTEVEOgotICAgICAgY3AuZHdCb3JkZXJXaWR0aCAqPSAyOwotICAgICAgYnJlYWs7CiAgICAgY2FzZSBCb3JkZXJTdHlsZTo6SU5TRVQ6CiAgICAgICBjcC5kd0JvcmRlcldpZHRoICo9IDI7CiAgICAgICBicmVhazsKQEAgLTM0OCwyOSArMzQwLDI3IEBACiAgIGlmICghYk5ldykKICAgICByZXR1cm4gcFduZDsKIAotICBpZiAoZm91bmQpIHsKLSAgICBDRkZMX1ByaXZhdGVEYXRhKiBwUHJpdmF0ZURhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcFduZC0+R2V0QXR0YWNoZWREYXRhKCk7Ci0gICAgaWYgKHBQcml2YXRlRGF0YS0+bldpZGdldEFnZSAhPSBtX3BXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKSkgewotICAgICAgcmV0dXJuIFJlc2V0UERGV2luZG93KAotICAgICAgICAgIHBQYWdlVmlldywgbV9wV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpID09IHBQcml2YXRlRGF0YS0+blZhbHVlQWdlKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgUFdMX0NSRUFURVBBUkFNIGNwID0gR2V0Q3JlYXRlUGFyYW0oKTsKLSAgICBjcC5wQXR0YWNoZWRXaWRnZXQuUmVzZXQobV9wV2lkZ2V0KTsKKyAgaWYgKCFmb3VuZCkgeworICAgIENQV0xfV25kOjpDcmVhdGVQYXJhbXMgY3AgPSBHZXRDcmVhdGVQYXJhbSgpOworICAgIGNwLnBBdHRhY2hlZFdpZGdldC5SZXNldChtX3BXaWRnZXQuR2V0KCkpOwogCi0gICAgQ0ZGTF9Qcml2YXRlRGF0YSogcFByaXZhdGVEYXRhID0gbmV3IENGRkxfUHJpdmF0ZURhdGE7Ci0gICAgcFByaXZhdGVEYXRhLT5wV2lkZ2V0ID0gbV9wV2lkZ2V0OworICAgIGF1dG8qIHBQcml2YXRlRGF0YSA9IG5ldyBDRkZMX1ByaXZhdGVEYXRhOworICAgIHBQcml2YXRlRGF0YS0+cFdpZGdldCA9IG1fcFdpZGdldC5HZXQoKTsKICAgICBwUHJpdmF0ZURhdGEtPnBQYWdlVmlldyA9IHBQYWdlVmlldzsKLSAgICBwUHJpdmF0ZURhdGEtPm5XaWRnZXRBZ2UgPSBtX3BXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKLSAgICBwUHJpdmF0ZURhdGEtPm5WYWx1ZUFnZSA9IDA7Ci0KKyAgICBwUHJpdmF0ZURhdGEtPm5XaWRnZXRBcHBlYXJhbmNlQWdlID0gbV9wV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7CisgICAgcFByaXZhdGVEYXRhLT5uV2lkZ2V0VmFsdWVBZ2UgPSAwOwogICAgIGNwLnBBdHRhY2hlZERhdGEgPSBwUHJpdmF0ZURhdGE7Ci0KLSAgICBwV25kID0gTmV3UERGV2luZG93KGNwLCBwUGFnZVZpZXcpOwotICAgIG1fTWFwc1twUGFnZVZpZXddID0gcFduZDsKKyAgICBDUFdMX1duZCogcE5ld1duZCA9IE5ld1BERldpbmRvdyhjcCk7CisgICAgbV9NYXBzW3BQYWdlVmlld10gPSBwTmV3V25kOworICAgIHJldHVybiBwTmV3V25kOwogICB9CiAKLSAgcmV0dXJuIHBXbmQ7CisgIGF1dG8qIHBQcml2YXRlRGF0YSA9IHN0YXRpY19jYXN0PENGRkxfUHJpdmF0ZURhdGEqPihwV25kLT5HZXRBdHRhY2hlZERhdGEoKSk7CisgIGlmIChwUHJpdmF0ZURhdGEtPm5XaWRnZXRBcHBlYXJhbmNlQWdlID09IG1fcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpKQorICAgIHJldHVybiBwV25kOworCisgIHJldHVybiBSZXNldFBERldpbmRvdygKKyAgICAgIHBQYWdlVmlldywgcFByaXZhdGVEYXRhLT5uV2lkZ2V0VmFsdWVBZ2UgPT0gbV9wV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKIH0KIAogdm9pZCBDRkZMX0Zvcm1GaWxsZXI6OkRlc3Ryb3lQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7CkBAIC0zNzksMzkgKzM2OSwzMCBAQAogICAgIHJldHVybjsKIAogICBDUFdMX1duZCogcFduZCA9IGl0LT5zZWNvbmQ7Ci0gIENGRkxfUHJpdmF0ZURhdGEqIHBEYXRhID0gKENGRkxfUHJpdmF0ZURhdGEqKXBXbmQtPkdldEF0dGFjaGVkRGF0YSgpOworICBhdXRvKiBwRGF0YSA9IHN0YXRpY19jYXN0PENGRkxfUHJpdmF0ZURhdGEqPihwV25kLT5HZXRBdHRhY2hlZERhdGEoKSk7CiAgIHBXbmQtPkRlc3Ryb3koKTsKICAgZGVsZXRlIHBXbmQ7CiAgIGRlbGV0ZSBwRGF0YTsKLQogICBtX01hcHMuZXJhc2UoaXQpOwogfQogCi1DRlhfTWF0cml4IENGRkxfRm9ybUZpbGxlcjo6R2V0V2luZG93TWF0cml4KHZvaWQqIHBBdHRhY2hlZERhdGEpIHsKLSAgaWYgKENGRkxfUHJpdmF0ZURhdGEqIHBQcml2YXRlRGF0YSA9IChDRkZMX1ByaXZhdGVEYXRhKilwQXR0YWNoZWREYXRhKSB7Ci0gICAgaWYgKHBQcml2YXRlRGF0YS0+cFBhZ2VWaWV3KSB7Ci0gICAgICBDRlhfTWF0cml4IG10UGFnZVZpZXc7Ci0gICAgICBwUHJpdmF0ZURhdGEtPnBQYWdlVmlldy0+R2V0Q3VycmVudE1hdHJpeChtdFBhZ2VWaWV3KTsKK0NGWF9NYXRyaXggQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRXaW5kb3dNYXRyaXgoQ1BXTF9XbmQ6OlByaXZhdGVEYXRhKiBwQXR0YWNoZWQpIHsKKyAgQ0ZYX01hdHJpeCBtdDsKKyAgYXV0byogcFByaXZhdGVEYXRhID0gc3RhdGljX2Nhc3Q8Q0ZGTF9Qcml2YXRlRGF0YSo+KHBBdHRhY2hlZCk7CisgIGlmICghcFByaXZhdGVEYXRhIHx8ICFwUHJpdmF0ZURhdGEtPnBQYWdlVmlldykKKyAgICByZXR1cm4gbXQ7CiAKLSAgICAgIENGWF9NYXRyaXggbXQgPSBHZXRDdXJNYXRyaXgoKTsKLSAgICAgIG10LkNvbmNhdChtdFBhZ2VWaWV3KTsKLQotICAgICAgcmV0dXJuIG10OwotICAgIH0KLSAgfQotICByZXR1cm4gQ0ZYX01hdHJpeCgxLCAwLCAwLCAxLCAwLCAwKTsKKyAgQ0ZYX01hdHJpeCBtdFBhZ2VWaWV3OworICBwUHJpdmF0ZURhdGEtPnBQYWdlVmlldy0+R2V0Q3VycmVudE1hdHJpeChtdFBhZ2VWaWV3KTsKKyAgbXQgPSBHZXRDdXJNYXRyaXgoKTsKKyAgbXQuQ29uY2F0KG10UGFnZVZpZXcpOworICByZXR1cm4gbXQ7CiB9CiAKIENGWF9NYXRyaXggQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRDdXJNYXRyaXgoKSB7CiAgIENGWF9NYXRyaXggbXQ7Ci0KICAgQ0ZYX0Zsb2F0UmVjdCByY0RBID0gbV9wV2lkZ2V0LT5HZXRQREZBbm5vdCgpLT5HZXRSZWN0KCk7Ci0KICAgc3dpdGNoIChtX3BXaWRnZXQtPkdldFJvdGF0ZSgpKSB7Ci0gICAgZGVmYXVsdDoKLSAgICBjYXNlIDA6Ci0gICAgICBtdCA9IENGWF9NYXRyaXgoMSwgMCwgMCwgMSwgMCwgMCk7Ci0gICAgICBicmVhazsKICAgICBjYXNlIDkwOgogICAgICAgbXQgPSBDRlhfTWF0cml4KDAsIDEsIC0xLCAwLCByY0RBLnJpZ2h0IC0gcmNEQS5sZWZ0LCAwKTsKICAgICAgIGJyZWFrOwpAQCAtNDIyLDYgKzQwMyw5IEBACiAgICAgY2FzZSAyNzA6CiAgICAgICBtdCA9IENGWF9NYXRyaXgoMCwgLTEsIDEsIDAsIDAsIHJjREEudG9wIC0gcmNEQS5ib3R0b20pOwogICAgICAgYnJlYWs7CisgICAgY2FzZSAwOgorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKICAgfQogICBtdC5lICs9IHJjREEubGVmdDsKICAgbXQuZiArPSByY0RBLmJvdHRvbTsKQEAgLTQyOSw2MSArNDEzLDQyIEBACiAgIHJldHVybiBtdDsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ0ZGTF9Gb3JtRmlsbGVyOjpMb2FkUG9wdXBNZW51U3RyaW5nKGludCBuSW5kZXgpIHsKLSAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKLQotICByZXR1cm4gTCIiOwotfQotCiBDRlhfRmxvYXRSZWN0IENGRkxfRm9ybUZpbGxlcjo6R2V0UERGV2luZG93UmVjdCgpIGNvbnN0IHsKICAgQ0ZYX0Zsb2F0UmVjdCByZWN0QW5ub3QgPSBtX3BXaWRnZXQtPkdldFBERkFubm90KCktPkdldFJlY3QoKTsKIAotICBGWF9GTE9BVCBmV2lkdGggPSByZWN0QW5ub3QucmlnaHQgLSByZWN0QW5ub3QubGVmdDsKLSAgRlhfRkxPQVQgZkhlaWdodCA9IHJlY3RBbm5vdC50b3AgLSByZWN0QW5ub3QuYm90dG9tOworICBmbG9hdCBmV2lkdGggPSByZWN0QW5ub3QucmlnaHQgLSByZWN0QW5ub3QubGVmdDsKKyAgZmxvYXQgZkhlaWdodCA9IHJlY3RBbm5vdC50b3AgLSByZWN0QW5ub3QuYm90dG9tOwogICBpZiAoKG1fcFdpZGdldC0+R2V0Um90YXRlKCkgLyA5MCkgJiAweDAxKQotICAgIHJldHVybiBDRlhfRmxvYXRSZWN0KDAsIDAsIGZIZWlnaHQsIGZXaWR0aCk7Ci0KKyAgICBzdGQ6OnN3YXAoZldpZHRoLCBmSGVpZ2h0KTsKICAgcmV0dXJuIENGWF9GbG9hdFJlY3QoMCwgMCwgZldpZHRoLCBmSGVpZ2h0KTsKIH0KIAogQ1BERlNES19QYWdlVmlldyogQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRDdXJQYWdlVmlldyhib29sIHJlbmV3KSB7Ci0gIFVuZGVybHlpbmdQYWdlVHlwZSogcFBhZ2UgPSBtX3BBbm5vdC0+R2V0VW5kZXJseWluZ1BhZ2UoKTsKLSAgcmV0dXJuIG1fcEZvcm1GaWxsRW52ID8gbV9wRm9ybUZpbGxFbnYtPkdldFBhZ2VWaWV3KHBQYWdlLCByZW5ldykgOiBudWxscHRyOworICBVbmRlcmx5aW5nUGFnZVR5cGUqIHBQYWdlID0gbV9wV2lkZ2V0LT5HZXRVbmRlcmx5aW5nUGFnZSgpOworICByZXR1cm4gbV9wRm9ybUZpbGxFbnYtPkdldFBhZ2VWaWV3KHBQYWdlLCByZW5ldyk7CiB9CiAKIENGWF9GbG9hdFJlY3QgQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRGb2N1c0JveChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKLSAgaWYgKENQV0xfV25kKiBwV25kID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKSB7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByY0ZvY3VzID0gRkZMdG9XbmQocFBhZ2VWaWV3LCBQV0x0b0ZGTChwV25kLT5HZXRGb2N1c1JlY3QoKSkpOwotICAgIENGWF9GbG9hdFJlY3QgcmNQYWdlID0gcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCktPkdldFBhZ2VCQm94KCk7Ci0gICAgaWYgKHJjUGFnZS5Db250YWlucyhyY0ZvY3VzKSkKLSAgICAgIHJldHVybiByY0ZvY3VzOwotICB9Ci0gIHJldHVybiBDRlhfRmxvYXRSZWN0KDAsIDAsIDAsIDApOworICBDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKTsKKyAgaWYgKCFwV25kKQorICAgIHJldHVybiBDRlhfRmxvYXRSZWN0KCk7CisKKyAgQ0ZYX0Zsb2F0UmVjdCByY0ZvY3VzID0gRkZMdG9XbmQocFBhZ2VWaWV3LCBQV0x0b0ZGTChwV25kLT5HZXRGb2N1c1JlY3QoKSkpOworICByZXR1cm4gcFBhZ2VWaWV3LT5HZXRQREZQYWdlKCktPkdldFBhZ2VCQm94KCkuQ29udGFpbnMocmNGb2N1cykKKyAgICAgICAgICAgICA/IHJjRm9jdXMKKyAgICAgICAgICAgICA6IENGWF9GbG9hdFJlY3QoKTsKIH0KIAogQ0ZYX0Zsb2F0UmVjdCBDRkZMX0Zvcm1GaWxsZXI6OkZGTHRvUFdMKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIHsKLSAgQ0ZYX01hdHJpeCBtdDsKLSAgbXQuU2V0UmV2ZXJzZShHZXRDdXJNYXRyaXgoKSk7Ci0KLSAgQ0ZYX0Zsb2F0UmVjdCB0ZW1wID0gcmVjdDsKLSAgbXQuVHJhbnNmb3JtUmVjdCh0ZW1wKTsKLQotICByZXR1cm4gdGVtcDsKKyAgcmV0dXJuIEdldEN1ck1hdHJpeCgpLkdldEludmVyc2UoKS5UcmFuc2Zvcm1SZWN0KHJlY3QpOwogfQogCiBDRlhfRmxvYXRSZWN0IENGRkxfRm9ybUZpbGxlcjo6UFdMdG9GRkwoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgewotICBDRlhfTWF0cml4IG10ID0gR2V0Q3VyTWF0cml4KCk7Ci0KLSAgQ0ZYX0Zsb2F0UmVjdCB0ZW1wID0gcmVjdDsKLSAgbXQuVHJhbnNmb3JtUmVjdCh0ZW1wKTsKLQotICByZXR1cm4gdGVtcDsKKyAgcmV0dXJuIEdldEN1ck1hdHJpeCgpLlRyYW5zZm9ybVJlY3QocmVjdCk7CiB9CiAKIENGWF9Qb2ludEYgQ0ZGTF9Gb3JtRmlsbGVyOjpGRkx0b1BXTChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewotICBDRlhfTWF0cml4IG10OwotICBtdC5TZXRSZXZlcnNlKEdldEN1ck1hdHJpeCgpKTsKLSAgcmV0dXJuIG10LlRyYW5zZm9ybShwb2ludCk7CisgIHJldHVybiBHZXRDdXJNYXRyaXgoKS5HZXRJbnZlcnNlKCkuVHJhbnNmb3JtKHBvaW50KTsKIH0KIAogQ0ZYX1BvaW50RiBDRkZMX0Zvcm1GaWxsZXI6OlBXTHRvRkZMKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CkBAIC01MDEsMzMgKzQ2Niw0MyBAQAogfQogCiBib29sIENGRkxfRm9ybUZpbGxlcjo6Q29tbWl0RGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIHVpbnQzMl90IG5GbGFnKSB7Ci0gIGlmIChJc0RhdGFDaGFuZ2VkKHBQYWdlVmlldykpIHsKLSAgICBib29sIGJSQyA9IHRydWU7Ci0gICAgYm9vbCBiRXhpdCA9IGZhbHNlOwotICAgIENGRkxfSW50ZXJhY3RpdmVGb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9Ci0gICAgICAgIG1fcEZvcm1GaWxsRW52LT5HZXRJbnRlcmFjdGl2ZUZvcm1GaWxsZXIoKTsKLSAgICBDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciBwT2JzZXJ2ZWQobV9wV2lkZ2V0KTsKLSAgICBwRm9ybUZpbGxlci0+T25LZXlTdHJva2VDb21taXQoJnBPYnNlcnZlZCwgcFBhZ2VWaWV3LCBiUkMsIGJFeGl0LCBuRmxhZyk7Ci0gICAgaWYgKCFwT2JzZXJ2ZWQgfHwgYkV4aXQpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoIWJSQykgewotICAgICAgUmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcEZvcm1GaWxsZXItPk9uVmFsaWRhdGUoJnBPYnNlcnZlZCwgcFBhZ2VWaWV3LCBiUkMsIGJFeGl0LCBuRmxhZyk7Ci0gICAgaWYgKCFwT2JzZXJ2ZWQgfHwgYkV4aXQpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoIWJSQykgewotICAgICAgUmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgU2F2ZURhdGEocFBhZ2VWaWV3KTsKLSAgICBwRm9ybUZpbGxlci0+T25DYWxjdWxhdGUobV9wV2lkZ2V0LCBwUGFnZVZpZXcsIGJFeGl0LCBuRmxhZyk7Ci0gICAgaWYgKGJFeGl0KQotICAgICAgcmV0dXJuIHRydWU7CisgIGlmICghSXNEYXRhQ2hhbmdlZChwUGFnZVZpZXcpKQorICAgIHJldHVybiB0cnVlOwogCi0gICAgcEZvcm1GaWxsZXItPk9uRm9ybWF0KG1fcFdpZGdldCwgcFBhZ2VWaWV3LCBiRXhpdCwgbkZsYWcpOworICBDRkZMX0ludGVyYWN0aXZlRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPQorICAgICAgbV9wRm9ybUZpbGxFbnYtPkdldEludGVyYWN0aXZlRm9ybUZpbGxlcigpOworICBDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciBwT2JzZXJ2ZWQobV9wV2lkZ2V0LkdldCgpKTsKKworICBpZiAoIXBGb3JtRmlsbGVyLT5PbktleVN0cm9rZUNvbW1pdCgmcE9ic2VydmVkLCBwUGFnZVZpZXcsIG5GbGFnKSkgeworICAgIGlmICghcE9ic2VydmVkKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIFJlc2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpOworICAgIHJldHVybiB0cnVlOwogICB9CisgIGlmICghcE9ic2VydmVkKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoIXBGb3JtRmlsbGVyLT5PblZhbGlkYXRlKCZwT2JzZXJ2ZWQsIHBQYWdlVmlldywgbkZsYWcpKSB7CisgICAgaWYgKCFwT2JzZXJ2ZWQpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgUmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKCFwT2JzZXJ2ZWQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIFNhdmVEYXRhKHBQYWdlVmlldyk7IC8vIG1heSBpbnZva2luZyBKUyB0byBkZWxldGUgdGhpcyB3aWRnZXQuCisgIGlmICghcE9ic2VydmVkKQorICAgIHJldHVybiBmYWxzZTsKKworICBwRm9ybUZpbGxlci0+T25DYWxjdWxhdGUoJnBPYnNlcnZlZCwgcFBhZ2VWaWV3LCBuRmxhZyk7CisgIGlmICghcE9ic2VydmVkKQorICAgIHJldHVybiBmYWxzZTsKKworICBwRm9ybUZpbGxlci0+T25Gb3JtYXQoJnBPYnNlcnZlZCwgcFBhZ2VWaWV3LCBuRmxhZyk7CisgIGlmICghcE9ic2VydmVkKQorICAgIHJldHVybiBmYWxzZTsKKwogICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtNTgyLDcgKzU1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkRlc3Ryb3lQREZXaW5kb3cpIHsKICAgbV9iVmFsaWQgPSBmYWxzZTsKIAotICBJbnZhbGlkYXRlUmVjdChHZXRWaWV3QkJveChwUGFnZVZpZXcsIG1fcFdpZGdldCkpOworICBJbnZhbGlkYXRlUmVjdChHZXRWaWV3QkJveChwUGFnZVZpZXcsIG1fcFdpZGdldC5HZXQoKSkpOwogICBpZiAoYkRlc3Ryb3lQREZXaW5kb3cpCiAgICAgRGVzdHJveVBERldpbmRvdyhwUGFnZVZpZXcpOwogfQpAQCAtNTkwLDk4ICs1NjUsMyBAQAogdm9pZCBDRkZMX0Zvcm1GaWxsZXI6OkludmFsaWRhdGVSZWN0KGNvbnN0IEZYX1JFQ1QmIHJlY3QpIHsKICAgbV9wRm9ybUZpbGxFbnYtPkludmFsaWRhdGUobV9wV2lkZ2V0LT5HZXRVbmRlcmx5aW5nUGFnZSgpLCByZWN0KTsKIH0KLQotQ0ZGTF9CdXR0b246OkNGRkxfQnV0dG9uKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEFwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwV2lkZ2V0KQotICAgIDogQ0ZGTF9Gb3JtRmlsbGVyKHBBcHAsIHBXaWRnZXQpLCBtX2JNb3VzZUluKGZhbHNlKSwgbV9iTW91c2VEb3duKGZhbHNlKSB7fQotCi1DRkZMX0J1dHRvbjo6fkNGRkxfQnV0dG9uKCkge30KLQotdm9pZCBDRkZMX0J1dHRvbjo6T25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKLSAgbV9iTW91c2VJbiA9IHRydWU7Ci0gIEludmFsaWRhdGVSZWN0KEdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90KSk7Ci19Ci0KLXZvaWQgQ0ZGTF9CdXR0b246Ok9uTW91c2VFeGl0KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCkgewotICBtX2JNb3VzZUluID0gZmFsc2U7Ci0KLSAgSW52YWxpZGF0ZVJlY3QoR2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpKTsKLSAgRW5kVGltZXIoKTsKLSAgQVNTRVJUKG1fcFdpZGdldCk7Ci19Ci0KLWJvb2wgQ0ZGTF9CdXR0b246Ok9uTEJ1dHRvbkRvd24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgaWYgKCFwQW5ub3QtPkdldFJlY3QoKS5Db250YWlucyhwb2ludCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG1fYk1vdXNlRG93biA9IHRydWU7Ci0gIG1fYlZhbGlkID0gdHJ1ZTsKLSAgSW52YWxpZGF0ZVJlY3QoR2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0ZGTF9CdXR0b246Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIGlmICghcEFubm90LT5HZXRSZWN0KCkuQ29udGFpbnMocG9pbnQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBtX2JNb3VzZURvd24gPSBmYWxzZTsKLSAgbV9wV2lkZ2V0LT5HZXRQREZQYWdlKCk7Ci0KLSAgSW52YWxpZGF0ZVJlY3QoR2V0Vmlld0JCb3gocFBhZ2VWaWV3LCBwQW5ub3QpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0ZGTF9CdXR0b246Ok9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIEFTU0VSVChtX3BGb3JtRmlsbEVudik7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIENGRkxfQnV0dG9uOjpPbkRyYXcoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgewotICBBU1NFUlQocFBhZ2VWaWV3KTsKLSAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBBbm5vdDsKLSAgQ1BERl9Gb3JtQ29udHJvbCogcEN0cmwgPSBwV2lkZ2V0LT5HZXRGb3JtQ29udHJvbCgpOwotICBDUERGX0Zvcm1Db250cm9sOjpIaWdobGlnaHRpbmdNb2RlIGVITSA9IHBDdHJsLT5HZXRIaWdobGlnaHRpbmdNb2RlKCk7Ci0KLSAgaWYgKGVITSAhPSBDUERGX0Zvcm1Db250cm9sOjpQdXNoKSB7Ci0gICAgcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIG51bGxwdHIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChtX2JNb3VzZURvd24pIHsKLSAgICBpZiAocFdpZGdldC0+SXNXaWRnZXRBcHBlYXJhbmNlVmFsaWQoQ1BERl9Bbm5vdDo6RG93bikpCi0gICAgICBwV2lkZ2V0LT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6OkRvd24sIG51bGxwdHIpOwotICAgIGVsc2UKLSAgICAgIHBXaWRnZXQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgQ1BERl9Bbm5vdDo6Tm9ybWFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7Ci0gIH0gZWxzZSBpZiAobV9iTW91c2VJbikgewotICAgIGlmIChwV2lkZ2V0LT5Jc1dpZGdldEFwcGVhcmFuY2VWYWxpZChDUERGX0Fubm90OjpSb2xsb3ZlcikpCi0gICAgICBwV2lkZ2V0LT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6OlJvbGxvdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7Ci0gICAgZWxzZQotICAgICAgcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKLSAgfSBlbHNlIHsKLSAgICBwV2lkZ2V0LT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6Ok5vcm1hbCwgbnVsbHB0cik7Ci0gIH0KLX0KLQotdm9pZCBDRkZMX0J1dHRvbjo6T25EcmF3RGVhY3RpdmUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgewotICBPbkRyYXcocFBhZ2VWaWV3LCBwQW5ub3QsIHBEZXZpY2UsIHBVc2VyMkRldmljZSk7Ci19CmRpZmYgLS1naXQgYS9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9mb3JtZmlsbGVyLmggYi9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9mb3JtZmlsbGVyLmgKaW5kZXggYzZiMWU1OS4uMTFhMmY4YyAxMDA2NDQKLS0tIGEvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfZm9ybWZpbGxlci5oCisrKyBiL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2Zvcm1maWxsZXIuaApAQCAtOSw2ICs5LDcgQEAKIAogI2luY2x1ZGUgPG1hcD4KIAorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKICNpbmNsdWRlICJmcGRmc2RrL2Zvcm1maWxsZXIvY2JhX2ZvbnRtYXAuaCIKICNpbmNsdWRlICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9pbnRlcmFjdGl2ZWZvcm1maWxsZXIuaCIKICNpbmNsdWRlICJmcGRmc2RrL3BkZnNka19maWVsZGFjdGlvbi5oIgpAQCAtMTgsMTAgKzE5LDExIEBACiBjbGFzcyBDUERGU0RLX1BhZ2VWaWV3OwogY2xhc3MgQ1BERlNES19XaWRnZXQ7CiAKLWNsYXNzIENGRkxfRm9ybUZpbGxlciA6IHB1YmxpYyBJUFdMX1Byb3ZpZGVyLCBwdWJsaWMgQ1BXTF9UaW1lckhhbmRsZXIgeworY2xhc3MgQ0ZGTF9Gb3JtRmlsbGVyIDogcHVibGljIENQV0xfV25kOjpQcm92aWRlcklmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIENQV0xfVGltZXJIYW5kbGVyIHsKICBwdWJsaWM6CiAgIENGRkxfRm9ybUZpbGxlcihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisgICAgICAgICAgICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCk7CiAgIH5DRkZMX0Zvcm1GaWxsZXIoKSBvdmVycmlkZTsKIAogICB2aXJ0dWFsIEZYX1JFQ1QgR2V0Vmlld0JCb3goQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LApAQCAtMjksMTEgKzMxLDExIEBACiAgIHZpcnR1YWwgdm9pZCBPbkRyYXcoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAogICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSk7CisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbXRVc2VyMkRldmljZSk7CiAgIHZpcnR1YWwgdm9pZCBPbkRyYXdEZWFjdGl2ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG10VXNlcjJEZXZpY2UpOwogCiAgIHZpcnR1YWwgdm9pZCBPbk1vdXNlRW50ZXIoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOwogICB2aXJ0dWFsIHZvaWQgT25Nb3VzZUV4aXQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOwpAQCAtNzMsNiArNzUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFncyk7CiAgIHZpcnR1YWwgYm9vbCBPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCB1aW50MzJfdCBuQ2hhciwgdWludDMyX3QgbkZsYWdzKTsKIAorICBXaWRlU3RyaW5nIEdldFNlbGVjdGVkVGV4dChDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICB2b2lkIFJlcGxhY2VTZWxlY3Rpb24oQ1BERlNES19Bbm5vdCogcEFubm90LCBjb25zdCBXaWRlU3RyaW5nJiB0ZXh0KTsKKwogICB2b2lkIFNldEZvY3VzRm9yQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90LCB1aW50MzJfdCBuRmxhZyk7CiAgIHZvaWQgS2lsbEZvY3VzRm9yQW5ub3QoQ1BERlNES19Bbm5vdCogcEFubm90LCB1aW50MzJfdCBuRmxhZyk7CiAKQEAgLTgwLDkgKzg1LDggQEAKICAgdm9pZCBUaW1lclByb2MoKSBvdmVycmlkZTsKICAgQ0ZYX1N5c3RlbUhhbmRsZXIqIEdldFN5c3RlbUhhbmRsZXIoKSBjb25zdCBvdmVycmlkZTsKIAotICAvLyBJUFdMX1Byb3ZpZGVyCi0gIENGWF9NYXRyaXggR2V0V2luZG93TWF0cml4KHZvaWQqIHBBdHRhY2hlZERhdGEpIG92ZXJyaWRlOwotICBDRlhfV2lkZVN0cmluZyBMb2FkUG9wdXBNZW51U3RyaW5nKGludCBuSW5kZXgpIG92ZXJyaWRlOworICAvLyBDUFdMX1duZDo6UHJvdmlkZXJJZmFjZToKKyAgQ0ZYX01hdHJpeCBHZXRXaW5kb3dNYXRyaXgoQ1BXTF9XbmQ6OlByaXZhdGVEYXRhKiBwQXR0YWNoZWQpIG92ZXJyaWRlOwogCiAgIHZpcnR1YWwgdm9pZCBHZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLApAQCAtMTExLDEwICsxMTUsNiBAQAogICBDRlhfRmxvYXRSZWN0IEZGTHRvV25kKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KTsKIAotICB2b2lkIFNldFdpbmRvd1JlY3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNXaW5kb3cpOwotICBDRlhfRmxvYXRSZWN0IEdldFdpbmRvd1JlY3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KTsKLQogICBib29sIENvbW1pdERhdGEoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCB1aW50MzJfdCBuRmxhZyk7CiAgIHZpcnR1YWwgYm9vbCBJc0RhdGFDaGFuZ2VkKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAgIHZpcnR1YWwgdm9pZCBTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwpAQCAtMTI3LDkgKzEyNyw4IEBACiAgIHZvaWQgRGVzdHJveVBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpOwogICB2b2lkIEVzY2FwZUZpbGxlcihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wgYkRlc3Ryb3lQREZXaW5kb3cpOwogCi0gIHZpcnR1YWwgUFdMX0NSRUFURVBBUkFNIEdldENyZWF0ZVBhcmFtKCk7Ci0gIHZpcnR1YWwgQ1BXTF9XbmQqIE5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSA9IDA7CisgIHZpcnR1YWwgQ1BXTF9XbmQ6OkNyZWF0ZVBhcmFtcyBHZXRDcmVhdGVQYXJhbSgpOworICB2aXJ0dWFsIENQV0xfV25kKiBOZXdQREZXaW5kb3coY29uc3QgQ1BXTF9XbmQ6OkNyZWF0ZVBhcmFtcyYgY3ApID0gMDsKICAgdmlydHVhbCBDRlhfRmxvYXRSZWN0IEdldEZvY3VzQm94KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyk7CiAKICAgYm9vbCBJc1ZhbGlkKCkgY29uc3Q7CkBAIC0xMzgsOCArMTM3LDcgQEAKICAgQ1BERlNES19QYWdlVmlldyogR2V0Q3VyUGFnZVZpZXcoYm9vbCByZW5ldyk7CiAgIHZvaWQgU2V0Q2hhbmdlTWFyaygpOwogCi0gIHZpcnR1YWwgdm9pZCBJbnZhbGlkYXRlUmVjdChjb25zdCBGWF9SRUNUJiByZWN0KTsKLSAgQ1BERlNES19Bbm5vdCogR2V0U0RLQW5ub3QoKSB7IHJldHVybiBtX3BBbm5vdDsgfQorICBDUERGU0RLX0Fubm90KiBHZXRTREtBbm5vdCgpIHsgcmV0dXJuIG1fcFdpZGdldC5HZXQoKTsgfQogCiAgcHJvdGVjdGVkOgogICB1c2luZyBDRkZMX1BhZ2VWaWV3MlBERldpbmRvdyA9IHN0ZDo6bWFwPENQREZTREtfUGFnZVZpZXcqLCBDUFdMX1duZCo+OwpAQCAtMTUyLDQ4ICsxNTAsMTIgQEAKICAgLy8gdW50aWwgdGhlIFBXTF9FZGl0IGlzIGRvbmUgd2l0aCBpdC4gcGRmaXVtOjU2NgogICB2b2lkIERlc3Ryb3lXaW5kb3dzKCk7CiAKLSAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBtX3BGb3JtRmlsbEVudjsKLSAgQ1BERlNES19XaWRnZXQqIG1fcFdpZGdldDsKLSAgQ1BERlNES19Bbm5vdCogbV9wQW5ub3Q7CisgIHZvaWQgSW52YWxpZGF0ZVJlY3QoY29uc3QgRlhfUkVDVCYgcmVjdCk7CisKKyAgVW5vd25lZFB0cjxDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ+IGNvbnN0IG1fcEZvcm1GaWxsRW52OworICBVbm93bmVkUHRyPENQREZTREtfV2lkZ2V0PiBtX3BXaWRnZXQ7CiAgIGJvb2wgbV9iVmFsaWQ7CiAgIENGRkxfUGFnZVZpZXcyUERGV2luZG93IG1fTWFwczsKLSAgQ0ZYX1BvaW50RiBtX3B0T2xkUG9zOwotfTsKLQotY2xhc3MgQ0ZGTF9CdXR0b24gOiBwdWJsaWMgQ0ZGTF9Gb3JtRmlsbGVyIHsKLSBwdWJsaWM6Ci0gIENGRkxfQnV0dG9uKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwV2lkZ2V0KTsKLSAgfkNGRkxfQnV0dG9uKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ0ZGTF9Gb3JtRmlsbGVyCi0gIHZvaWQgT25Nb3VzZUVudGVyKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90KSBvdmVycmlkZTsKLSAgdm9pZCBPbk1vdXNlRXhpdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCkgb3ZlcnJpZGU7Ci0gIGJvb2wgT25MQnV0dG9uRG93bihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCi0gICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuRmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7Ci0gIGJvb2wgT25MQnV0dG9uVXAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAotICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKLSAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuRmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOwotICBib29sIE9uTW91c2VNb3ZlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCi0gICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWdzLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKLSAgdm9pZCBPbkRyYXcoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAotICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCi0gICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25EcmF3RGVhY3RpdmUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAotICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgb3ZlcnJpZGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGJvb2wgbV9iTW91c2VJbjsKLSAgYm9vbCBtX2JNb3VzZURvd247CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfRk9STUZJTExFUl9DRkZMX0ZPUk1GSUxMRVJfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2ludGVyYWN0aXZlZm9ybWZpbGxlci5jcHAgYi9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9pbnRlcmFjdGl2ZWZvcm1maWxsZXIuY3BwCmluZGV4IGE4MzBkNTIuLmU3NGY5MDIgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2ludGVyYWN0aXZlZm9ybWZpbGxlci5jcHAKKysrIGIvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfaW50ZXJhY3RpdmVmb3JtZmlsbGVyLmNwcApAQCAtOCw2ICs4LDcgQEAKIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvYXV0b3Jlc3RvcmVyLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9ncmFwaHN0YXRlZGF0YS5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcGF0aGRhdGEuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgpAQCAtMjIsOSArMjMsNyBAQAogI2luY2x1ZGUgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX3B1c2hidXR0b24uaCIKICNpbmNsdWRlICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9yYWRpb2J1dHRvbi5oIgogI2luY2x1ZGUgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX3RleHRmaWVsZC5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9VdGlscy5oIgotCi0jZGVmaW5lIEZGTF9NQVhMSVNUQk9YSEVJR0hUIDE0MC4wZgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKIAogQ0ZGTF9JbnRlcmFjdGl2ZUZvcm1GaWxsZXI6OkNGRkxfSW50ZXJhY3RpdmVGb3JtRmlsbGVyKAogICAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KQpAQCAtNDYsNyArNDUsMTEgQEAKICAgQVNTRVJUKHBQYWdlVmlldyk7CiAKICAgQ1BERl9Bbm5vdCogcFBERkFubm90ID0gcEFubm90LT5HZXRQREZBbm5vdCgpOwotICBDRlhfRmxvYXRSZWN0IHJjV2luID0gQ1BXTF9VdGlsczo6SW5mbGF0ZVJlY3QocFBERkFubm90LT5HZXRSZWN0KCksIDEpOworICBDRlhfRmxvYXRSZWN0IHJjV2luID0gcFBERkFubm90LT5HZXRSZWN0KCk7CisgIGlmICghcmNXaW4uSXNFbXB0eSgpKSB7CisgICAgcmNXaW4uSW5mbGF0ZSgxLCAxKTsKKyAgICByY1dpbi5Ob3JtYWxpemUoKTsKKyAgfQogICByZXR1cm4gcmNXaW4uR2V0T3V0ZXJSZWN0KCk7CiB9CiAKQEAgLTU1LDQ4ICs1OCw1MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKSB7CiAgIEFTU0VSVChwUGFnZVZpZXcpOwotICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwotCisgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gc3RhdGljX2Nhc3Q8Q1BERlNES19XaWRnZXQqPihwQW5ub3QpOwogICBpZiAoIUlzVmlzaWJsZShwV2lkZ2V0KSkKICAgICByZXR1cm47CiAKLSAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKSB7Ci0gICAgaWYgKHBGb3JtRmlsbGVyLT5Jc1ZhbGlkKCkpIHsKLSAgICAgIHBGb3JtRmlsbGVyLT5PbkRyYXcocFBhZ2VWaWV3LCBwQW5ub3QsIHBEZXZpY2UsIHBVc2VyMkRldmljZSk7Ci0gICAgICBwQW5ub3QtPkdldFBERlBhZ2UoKTsKKyAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBmYWxzZSk7CisgIGlmIChwRm9ybUZpbGxlciAmJiBwRm9ybUZpbGxlci0+SXNWYWxpZCgpKSB7CisgICAgcEZvcm1GaWxsZXItPk9uRHJhdyhwUGFnZVZpZXcsIHBBbm5vdCwgcERldmljZSwgKnBVc2VyMkRldmljZSk7CisgICAgcEFubm90LT5HZXRQREZQYWdlKCk7CiAKLSAgICAgIGlmIChtX3BGb3JtRmlsbEVudi0+R2V0Rm9jdXNBbm5vdCgpID09IHBBbm5vdCkgewotICAgICAgICBDRlhfRmxvYXRSZWN0IHJjRm9jdXMgPSBwRm9ybUZpbGxlci0+R2V0Rm9jdXNCb3gocFBhZ2VWaWV3KTsKLSAgICAgICAgaWYgKCFyY0ZvY3VzLklzRW1wdHkoKSkgewotICAgICAgICAgIENGWF9QYXRoRGF0YSBwYXRoOwotICAgICAgICAgIHBhdGguQXBwZW5kUG9pbnQoQ0ZYX1BvaW50RihyY0ZvY3VzLmxlZnQsIHJjRm9jdXMudG9wKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYUFRfVFlQRTo6TW92ZVRvLCBmYWxzZSk7Ci0gICAgICAgICAgcGF0aC5BcHBlbmRQb2ludChDRlhfUG9pbnRGKHJjRm9jdXMubGVmdCwgcmNGb2N1cy5ib3R0b20pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKLSAgICAgICAgICBwYXRoLkFwcGVuZFBvaW50KENGWF9Qb2ludEYocmNGb2N1cy5yaWdodCwgcmNGb2N1cy5ib3R0b20pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKLSAgICAgICAgICBwYXRoLkFwcGVuZFBvaW50KENGWF9Qb2ludEYocmNGb2N1cy5yaWdodCwgcmNGb2N1cy50b3ApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKLSAgICAgICAgICBwYXRoLkFwcGVuZFBvaW50KENGWF9Qb2ludEYocmNGb2N1cy5sZWZ0LCByY0ZvY3VzLnRvcCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOwotCi0gICAgICAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKLSAgICAgICAgICBnc2QuU2V0RGFzaENvdW50KDEpOwotICAgICAgICAgIGdzZC5tX0Rhc2hBcnJheVswXSA9IDEuMGY7Ci0gICAgICAgICAgZ3NkLm1fRGFzaFBoYXNlID0gMDsKLSAgICAgICAgICBnc2QubV9MaW5lV2lkdGggPSAxLjBmOwotICAgICAgICAgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsICZnc2QsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZSgyNTUsIDAsIDAsIDApLCBGWEZJTExfQUxURVJOQVRFKTsKLSAgICAgICAgfQotICAgICAgfQorICAgIGlmIChtX3BGb3JtRmlsbEVudi0+R2V0Rm9jdXNBbm5vdCgpICE9IHBBbm5vdCkKICAgICAgIHJldHVybjsKLSAgICB9CisKKyAgICBDRlhfRmxvYXRSZWN0IHJjRm9jdXMgPSBwRm9ybUZpbGxlci0+R2V0Rm9jdXNCb3gocFBhZ2VWaWV3KTsKKyAgICBpZiAocmNGb2N1cy5Jc0VtcHR5KCkpCisgICAgICByZXR1cm47CisKKyAgICBDRlhfUGF0aERhdGEgcGF0aDsKKyAgICBwYXRoLkFwcGVuZFBvaW50KENGWF9Qb2ludEYocmNGb2N1cy5sZWZ0LCByY0ZvY3VzLnRvcCksIEZYUFRfVFlQRTo6TW92ZVRvLAorICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIHBhdGguQXBwZW5kUG9pbnQoQ0ZYX1BvaW50RihyY0ZvY3VzLmxlZnQsIHJjRm9jdXMuYm90dG9tKSwKKyAgICAgICAgICAgICAgICAgICAgIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7CisgICAgcGF0aC5BcHBlbmRQb2ludChDRlhfUG9pbnRGKHJjRm9jdXMucmlnaHQsIHJjRm9jdXMuYm90dG9tKSwKKyAgICAgICAgICAgICAgICAgICAgIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7CisgICAgcGF0aC5BcHBlbmRQb2ludChDRlhfUG9pbnRGKHJjRm9jdXMucmlnaHQsIHJjRm9jdXMudG9wKSwgRlhQVF9UWVBFOjpMaW5lVG8sCisgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgcGF0aC5BcHBlbmRQb2ludChDRlhfUG9pbnRGKHJjRm9jdXMubGVmdCwgcmNGb2N1cy50b3ApLCBGWFBUX1RZUEU6OkxpbmVUbywKKyAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKworICAgIENGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7CisgICAgZ3NkLlNldERhc2hDb3VudCgxKTsKKyAgICBnc2QubV9EYXNoQXJyYXlbMF0gPSAxLjBmOworICAgIGdzZC5tX0Rhc2hQaGFzZSA9IDA7CisgICAgZ3NkLm1fTGluZVdpZHRoID0gMS4wZjsKKyAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3NkLCAwLCBBcmdiRW5jb2RlKDI1NSwgMCwgMCwgMCksCisgICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX0FMVEVSTkFURSk7CisgICAgcmV0dXJuOwogICB9CiAKLSAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKSB7Ci0gICAgcEZvcm1GaWxsZXItPk9uRHJhd0RlYWN0aXZlKHBQYWdlVmlldywgcEFubm90LCBwRGV2aWNlLCBwVXNlcjJEZXZpY2UpOworICBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBmYWxzZSk7CisgIGlmIChwRm9ybUZpbGxlcikgeworICAgIHBGb3JtRmlsbGVyLT5PbkRyYXdEZWFjdGl2ZShwUGFnZVZpZXcsIHBBbm5vdCwgcERldmljZSwgKnBVc2VyMkRldmljZSk7CiAgIH0gZWxzZSB7Ci0gICAgcFdpZGdldC0+RHJhd0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlLCBDUERGX0Fubm90OjpOb3JtYWwsIG51bGxwdHIpOworICAgIHBXaWRnZXQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsICpwVXNlcjJEZXZpY2UsIENQREZfQW5ub3Q6Ok5vcm1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKICAgfQogCiAgIGlmICghSXNSZWFkT25seShwV2lkZ2V0KSAmJiBJc0ZpbGxpbmdBbGxvd2VkKHBXaWRnZXQpKQpAQCAtMTE3LDEzICsxMjIsMTMgQEAKICAgICBpZiAocFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkN1cnNvckVudGVyKS5HZXREaWN0KCkpIHsKICAgICAgIG1fYk5vdGlmeWluZyA9IHRydWU7CiAKLSAgICAgIGludCBuVmFsdWVBZ2UgPSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOworICAgICAgdWludDMyX3QgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKICAgICAgIHBXaWRnZXQtPkNsZWFyQXBwTW9kaWZpZWQoKTsKICAgICAgIEFTU0VSVChwUGFnZVZpZXcpOwogCiAgICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7Ci0gICAgICBmYS5iTW9kaWZpZXIgPSBtX3BGb3JtRmlsbEVudi0+SXNDVFJMS2V5RG93bihuRmxhZyk7Ci0gICAgICBmYS5iU2hpZnQgPSBtX3BGb3JtRmlsbEVudi0+SXNTSElGVEtleURvd24obkZsYWcpOworICAgICAgZmEuYk1vZGlmaWVyID0gQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpJc0NUUkxLZXlEb3duKG5GbGFnKTsKKyAgICAgIGZhLmJTaGlmdCA9IENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6SXNTSElGVEtleURvd24obkZsYWcpOwogICAgICAgcFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6Q3Vyc29yRW50ZXIsIGZhLCBwUGFnZVZpZXcpOwogICAgICAgbV9iTm90aWZ5aW5nID0gZmFsc2U7CiAgICAgICBpZiAoISgqcEFubm90KSkKQEAgLTE0OSwxNSArMTU0LDE0IEBACiAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBzdGF0aWNfY2FzdDxDUERGU0RLX1dpZGdldCo+KHBBbm5vdC0+R2V0KCkpOwogICAgIGlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6Q3Vyc29yRXhpdCkuR2V0RGljdCgpKSB7CiAgICAgICBtX2JOb3RpZnlpbmcgPSB0cnVlOwotICAgICAgcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOwogCi0gICAgICBpbnQgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKKyAgICAgIHVpbnQzMl90IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CiAgICAgICBwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7CiAgICAgICBBU1NFUlQocFBhZ2VWaWV3KTsKIAogICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOwotICAgICAgZmEuYk1vZGlmaWVyID0gbV9wRm9ybUZpbGxFbnYtPklzQ1RSTEtleURvd24obkZsYWcpOwotICAgICAgZmEuYlNoaWZ0ID0gbV9wRm9ybUZpbGxFbnYtPklzU0hJRlRLZXlEb3duKG5GbGFnKTsKKyAgICAgIGZhLmJNb2RpZmllciA9IENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6SXNDVFJMS2V5RG93bihuRmxhZyk7CisgICAgICBmYS5iU2hpZnQgPSBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OklzU0hJRlRLZXlEb3duKG5GbGFnKTsKICAgICAgIHBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OkN1cnNvckV4aXQsIGZhLCBwUGFnZVZpZXcpOwogICAgICAgbV9iTm90aWZ5aW5nID0gZmFsc2U7CiAgICAgICBpZiAoISgqcEFubm90KSkKQEAgLTE4NiwxNSArMTkwLDE0IEBACiAgICAgaWYgKEFubm90X0hpdFRlc3QocFBhZ2VWaWV3LCBwQW5ub3QtPkdldCgpLCBwb2ludCkgJiYKICAgICAgICAgcFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkJ1dHRvbkRvd24pLkdldERpY3QoKSkgewogICAgICAgbV9iTm90aWZ5aW5nID0gdHJ1ZTsKLSAgICAgIHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKIAotICAgICAgaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CisgICAgICB1aW50MzJfdCBuVmFsdWVBZ2UgPSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOwogICAgICAgcFdpZGdldC0+Q2xlYXJBcHBNb2RpZmllZCgpOwogICAgICAgQVNTRVJUKHBQYWdlVmlldyk7CiAKICAgICAgIFBERlNES19GaWVsZEFjdGlvbiBmYTsKLSAgICAgIGZhLmJNb2RpZmllciA9IG1fcEZvcm1GaWxsRW52LT5Jc0NUUkxLZXlEb3duKG5GbGFncyk7Ci0gICAgICBmYS5iU2hpZnQgPSBtX3BGb3JtRmlsbEVudi0+SXNTSElGVEtleURvd24obkZsYWdzKTsKKyAgICAgIGZhLmJNb2RpZmllciA9IENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6SXNDVFJMS2V5RG93bihuRmxhZ3MpOworICAgICAgZmEuYlNoaWZ0ID0gQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpJc1NISUZUS2V5RG93bihuRmxhZ3MpOwogICAgICAgcFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6QnV0dG9uRG93biwgZmEsIHBQYWdlVmlldyk7CiAgICAgICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKICAgICAgIGlmICghKCpwQW5ub3QpKQpAQCAtMjExLDEwICsyMTQsOSBAQAogICAgICAgfQogICAgIH0KICAgfQotICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LT5HZXQoKSwgZmFsc2UpKQotICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25MQnV0dG9uRG93bihwUGFnZVZpZXcsIHBBbm5vdC0+R2V0KCksIG5GbGFncywgcG9pbnQpOwotCi0gIHJldHVybiBmYWxzZTsKKyAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LT5HZXQoKSwgZmFsc2UpOworICByZXR1cm4gcEZvcm1GaWxsZXIgJiYKKyAgICAgICAgIHBGb3JtRmlsbGVyLT5PbkxCdXR0b25Eb3duKHBQYWdlVmlldywgcEFubm90LT5HZXQoKSwgbkZsYWdzLCBwb2ludCk7CiB9CiAKIGJvb2wgQ0ZGTF9JbnRlcmFjdGl2ZUZvcm1GaWxsZXI6Ok9uTEJ1dHRvblVwKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKQEAgLTIyNCw3MCArMjI2LDY3IEBACiAgIEFTU0VSVCgoKnBBbm5vdCktPkdldFBERkFubm90KCktPkdldFN1YnR5cGUoKSA9PSBDUERGX0Fubm90OjpTdWJ0eXBlOjpXSURHRVQpOwogICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHN0YXRpY19jYXN0PENQREZTREtfV2lkZ2V0Kj4ocEFubm90LT5HZXQoKSk7CiAKKyAgYm9vbCBiU2V0Rm9jdXM7CiAgIHN3aXRjaCAocFdpZGdldC0+R2V0RmllbGRUeXBlKCkpIHsKLSAgICBjYXNlIEZJRUxEVFlQRV9QVVNIQlVUVE9OOgotICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgotICAgIGNhc2UgRklFTERUWVBFX1JBRElPQlVUVE9OOgotICAgICAgaWYgKEdldFZpZXdCQm94KHBQYWdlVmlldywgcEFubm90LT5HZXQoKSkKLSAgICAgICAgICAgICAgLkNvbnRhaW5zKChpbnQpcG9pbnQueCwgKGludClwb2ludC55KSkKLSAgICAgICAgbV9wRm9ybUZpbGxFbnYtPlNldEZvY3VzQW5ub3QocEFubm90KTsKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtQdXNoQnV0dG9uOgorICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a0NoZWNrQm94OgorICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a1JhZGlvQnV0dG9uOiB7CisgICAgICBGWF9SRUNUIGJib3ggPSBHZXRWaWV3QkJveChwUGFnZVZpZXcsIHBBbm5vdC0+R2V0KCkpOworICAgICAgYlNldEZvY3VzID0KKyAgICAgICAgICBiYm94LkNvbnRhaW5zKHN0YXRpY19jYXN0PGludD4ocG9pbnQueCksIHN0YXRpY19jYXN0PGludD4ocG9pbnQueSkpOwogICAgICAgYnJlYWs7CisgICAgfQogICAgIGRlZmF1bHQ6Ci0gICAgICBtX3BGb3JtRmlsbEVudi0+U2V0Rm9jdXNBbm5vdChwQW5ub3QpOworICAgICAgYlNldEZvY3VzID0gdHJ1ZTsKICAgICAgIGJyZWFrOwogICB9CisgIGlmIChiU2V0Rm9jdXMpCisgICAgbV9wRm9ybUZpbGxFbnYtPlNldEZvY3VzQW5ub3QocEFubm90KTsKIAotICBib29sIGJSZXQgPSBmYWxzZTsKLSAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdC0+R2V0KCksIGZhbHNlKSkKLSAgICBiUmV0ID0gcEZvcm1GaWxsZXItPk9uTEJ1dHRvblVwKHBQYWdlVmlldywgcEFubm90LT5HZXQoKSwgbkZsYWdzLCBwb2ludCk7Ci0KLSAgaWYgKG1fcEZvcm1GaWxsRW52LT5HZXRGb2N1c0Fubm90KCkgPT0gcEFubm90LT5HZXQoKSkgewotICAgIGJvb2wgYkV4aXQgPSBmYWxzZTsKLSAgICBib29sIGJSZXNldCA9IGZhbHNlOwotICAgIE9uQnV0dG9uVXAocEFubm90LCBwUGFnZVZpZXcsIGJSZXNldCwgYkV4aXQsIG5GbGFncyk7Ci0gICAgaWYgKCFwQW5ub3QgfHwgYkV4aXQpCi0gICAgICByZXR1cm4gdHJ1ZTsKKyAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LT5HZXQoKSwgZmFsc2UpOworICBib29sIGJSZXQgPSBwRm9ybUZpbGxlciAmJgorICAgICAgICAgICAgICBwRm9ybUZpbGxlci0+T25MQnV0dG9uVXAocFBhZ2VWaWV3LCBwQW5ub3QtPkdldCgpLCBuRmxhZ3MsIHBvaW50KTsKKyAgaWYgKG1fcEZvcm1GaWxsRW52LT5HZXRGb2N1c0Fubm90KCkgIT0gcEFubm90LT5HZXQoKSkKKyAgICByZXR1cm4gYlJldDsKKyAgaWYgKE9uQnV0dG9uVXAocEFubm90LCBwUGFnZVZpZXcsIG5GbGFncykgfHwgIXBBbm5vdCkKKyAgICByZXR1cm4gdHJ1ZTsKICNpZmRlZiBQREZfRU5BQkxFX1hGQQotICAgIE9uQ2xpY2socFdpZGdldCwgcFBhZ2VWaWV3LCBiUmVzZXQsIGJFeGl0LCBuRmxhZ3MpOwotICAgIGlmICghcEFubm90IHx8IGJFeGl0KQotICAgICAgcmV0dXJuIHRydWU7CisgIGlmIChPbkNsaWNrKHBBbm5vdCwgcFBhZ2VWaWV3LCBuRmxhZ3MpIHx8ICFwQW5ub3QpCisgICAgcmV0dXJuIHRydWU7CiAjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCi0gIH0KICAgcmV0dXJuIGJSZXQ7CiB9CiAKLXZvaWQgQ0ZGTF9JbnRlcmFjdGl2ZUZvcm1GaWxsZXI6Ok9uQnV0dG9uVXAoQ1BERlNES19Bbm5vdDo6T2JzZXJ2ZWRQdHIqIHBBbm5vdCwKK2Jvb2wgQ0ZGTF9JbnRlcmFjdGl2ZUZvcm1GaWxsZXI6Ok9uQnV0dG9uVXAoQ1BERlNES19Bbm5vdDo6T2JzZXJ2ZWRQdHIqIHBBbm5vdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiUmVzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJFeGl0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuRmxhZykgewotICBpZiAoIW1fYk5vdGlmeWluZykgewotICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gc3RhdGljX2Nhc3Q8Q1BERlNES19XaWRnZXQqPihwQW5ub3QtPkdldCgpKTsKLSAgICBpZiAocFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OkJ1dHRvblVwKS5HZXREaWN0KCkpIHsKLSAgICAgIG1fYk5vdGlmeWluZyA9IHRydWU7CisgIGlmIChtX2JOb3RpZnlpbmcpCisgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICBpbnQgbkFnZSA9IHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKLSAgICAgIGludCBuVmFsdWVBZ2UgPSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOwotICAgICAgQVNTRVJUKHBQYWdlVmlldyk7CisgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gc3RhdGljX2Nhc3Q8Q1BERlNES19XaWRnZXQqPihwQW5ub3QtPkdldCgpKTsKKyAgaWYgKCFwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6QnV0dG9uVXApLkdldERpY3QoKSkKKyAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgIFBERlNES19GaWVsZEFjdGlvbiBmYTsKLSAgICAgIGZhLmJNb2RpZmllciA9IG1fcEZvcm1GaWxsRW52LT5Jc0NUUkxLZXlEb3duKG5GbGFnKTsKLSAgICAgIGZhLmJTaGlmdCA9IG1fcEZvcm1GaWxsRW52LT5Jc1NISUZUS2V5RG93bihuRmxhZyk7Ci0gICAgICBwV2lkZ2V0LT5PbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpCdXR0b25VcCwgZmEsIHBQYWdlVmlldyk7Ci0gICAgICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKLSAgICAgIGlmICghKCpwQW5ub3QpIHx8ICFJc1ZhbGlkQW5ub3QocFBhZ2VWaWV3LCBwV2lkZ2V0KSkgewotICAgICAgICBiRXhpdCA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChuQWdlICE9IHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKSkgewotICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgZmFsc2UpKSB7Ci0gICAgICAgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblZhbHVlQWdlID09IHBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGJSZXNldCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9CisgIG1fYk5vdGlmeWluZyA9IHRydWU7CisKKyAgdWludDMyX3QgbkFnZSA9IHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKKyAgdWludDMyX3QgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKKyAgQVNTRVJUKHBQYWdlVmlldyk7CisKKyAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOworICBmYS5iTW9kaWZpZXIgPSBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OklzQ1RSTEtleURvd24obkZsYWcpOworICBmYS5iU2hpZnQgPSBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OklzU0hJRlRLZXlEb3duKG5GbGFnKTsKKyAgcFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6QnV0dG9uVXAsIGZhLCBwUGFnZVZpZXcpOworICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKKyAgaWYgKCEoKnBBbm5vdCkgfHwgIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBXaWRnZXQpKQorICAgIHJldHVybiB0cnVlOworICBpZiAobkFnZSA9PSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIGZhbHNlKTsKKyAgaWYgKHBGb3JtRmlsbGVyKQorICAgIHBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsIG5WYWx1ZUFnZSA9PSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgQ0ZGTF9JbnRlcmFjdGl2ZUZvcm1GaWxsZXI6Ok9uTEJ1dHRvbkRibENsaygKQEAgLTM1MCwxMSArMzQ5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuRmxhZ3MpIHsKICAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3VidHlwZSgpID09IENQREZfQW5ub3Q6OlN1YnR5cGU6OldJREdFVCk7CiAKLSAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKSB7Ci0gICAgcmV0dXJuIHBGb3JtRmlsbGVyLT5PbktleURvd24ocEFubm90LCBuS2V5Q29kZSwgbkZsYWdzKTsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKKyAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LCBmYWxzZSk7CisgIHJldHVybiBwRm9ybUZpbGxlciAmJiBwRm9ybUZpbGxlci0+T25LZXlEb3duKHBBbm5vdCwgbktleUNvZGUsIG5GbGFncyk7CiB9CiAKIGJvb2wgQ0ZGTF9JbnRlcmFjdGl2ZUZvcm1GaWxsZXI6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsCkBAIC0zNjQsMTAgKzM2MCw4IEBACiAgIGlmIChuQ2hhciA9PSBGV0xfVktFWV9UYWIpCiAgICAgcmV0dXJuIHRydWU7CiAKLSAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpKQotICAgIHJldHVybiBwRm9ybUZpbGxlci0+T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7Ci0KLSAgcmV0dXJuIGZhbHNlOworICBDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIGZhbHNlKTsKKyAgcmV0dXJuIHBGb3JtRmlsbGVyICYmIHBGb3JtRmlsbGVyLT5PbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKIH0KIAogYm9vbCBDRkZMX0ludGVyYWN0aXZlRm9ybUZpbGxlcjo6T25TZXRGb2N1cyhDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciogcEFubm90LApAQCAtMzgwLDkgKzM3NCw4IEBACiAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBzdGF0aWNfY2FzdDxDUERGU0RLX1dpZGdldCo+KHBBbm5vdC0+R2V0KCkpOwogICAgIGlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6R2V0Rm9jdXMpLkdldERpY3QoKSkgewogICAgICAgbV9iTm90aWZ5aW5nID0gdHJ1ZTsKLSAgICAgIHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKIAotICAgICAgaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CisgICAgICB1aW50MzJfdCBuVmFsdWVBZ2UgPSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOwogICAgICAgcFdpZGdldC0+Q2xlYXJBcHBNb2RpZmllZCgpOwogCiAgICAgICBDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCB0cnVlKTsKQEAgLTM5Myw4ICszODYsOCBAQAogICAgICAgQVNTRVJUKHBQYWdlVmlldyk7CiAKICAgICAgIFBERlNES19GaWVsZEFjdGlvbiBmYTsKLSAgICAgIGZhLmJNb2RpZmllciA9IG1fcEZvcm1GaWxsRW52LT5Jc0NUUkxLZXlEb3duKG5GbGFnKTsKLSAgICAgIGZhLmJTaGlmdCA9IG1fcEZvcm1GaWxsRW52LT5Jc1NISUZUS2V5RG93bihuRmxhZyk7CisgICAgICBmYS5iTW9kaWZpZXIgPSBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OklzQ1RSTEtleURvd24obkZsYWcpOworICAgICAgZmEuYlNoaWZ0ID0gQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpJc1NISUZUS2V5RG93bihuRmxhZyk7CiAgICAgICBwRm9ybUZpbGxlci0+R2V0QWN0aW9uRGF0YShwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6R2V0Rm9jdXMsIGZhKTsKICAgICAgIHBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OkdldEZvY3VzLCBmYSwgcFBhZ2VWaWV3KTsKICAgICAgIG1fYk5vdGlmeWluZyA9IGZhbHNlOwpAQCAtNDIyLDI5ICs0MTUsMzQgQEAKICAgICByZXR1cm4gZmFsc2U7CiAKICAgQVNTRVJUKCgqcEFubm90KS0+R2V0UERGQW5ub3QoKS0+R2V0U3VidHlwZSgpID09IENQREZfQW5ub3Q6OlN1YnR5cGU6OldJREdFVCk7Ci0gIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QtPkdldCgpLCBmYWxzZSkpIHsKLSAgICBwRm9ybUZpbGxlci0+S2lsbEZvY3VzRm9yQW5ub3QocEFubm90LT5HZXQoKSwgbkZsYWcpOwotICAgIGlmICghbV9iTm90aWZ5aW5nKSB7Ci0gICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHN0YXRpY19jYXN0PENQREZTREtfV2lkZ2V0Kj4ocEFubm90LT5HZXQoKSk7Ci0gICAgICBpZiAocFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246Okxvc2VGb2N1cykuR2V0RGljdCgpKSB7Ci0gICAgICAgIG1fYk5vdGlmeWluZyA9IHRydWU7Ci0gICAgICAgIHBXaWRnZXQtPkNsZWFyQXBwTW9kaWZpZWQoKTsKKyAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocEFubm90LT5HZXQoKSwgZmFsc2UpOworICBpZiAoIXBGb3JtRmlsbGVyKQorICAgIHJldHVybiB0cnVlOwogCi0gICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBXaWRnZXQtPkdldFBhZ2VWaWV3KCk7Ci0gICAgICAgIEFTU0VSVChwUGFnZVZpZXcpOworICBwRm9ybUZpbGxlci0+S2lsbEZvY3VzRm9yQW5ub3QocEFubm90LT5HZXQoKSwgbkZsYWcpOworICBpZiAoISgqcEFubm90KSkKKyAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOwotICAgICAgICBmYS5iTW9kaWZpZXIgPSBtX3BGb3JtRmlsbEVudi0+SXNDVFJMS2V5RG93bihuRmxhZyk7Ci0gICAgICAgIGZhLmJTaGlmdCA9IG1fcEZvcm1GaWxsRW52LT5Jc1NISUZUS2V5RG93bihuRmxhZyk7Ci0gICAgICAgIHBGb3JtRmlsbGVyLT5HZXRBY3Rpb25EYXRhKHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpMb3NlRm9jdXMsIGZhKTsKLSAgICAgICAgcFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6TG9zZUZvY3VzLCBmYSwgcFBhZ2VWaWV3KTsKLSAgICAgICAgbV9iTm90aWZ5aW5nID0gZmFsc2U7Ci0gICAgICAgIGlmICghKCpwQW5ub3QpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7CisgIGlmIChtX2JOb3RpZnlpbmcpCisgICAgcmV0dXJuIHRydWU7CisKKyAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBzdGF0aWNfY2FzdDxDUERGU0RLX1dpZGdldCo+KHBBbm5vdC0+R2V0KCkpOworICBpZiAoIXBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpMb3NlRm9jdXMpLkdldERpY3QoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBtX2JOb3RpZnlpbmcgPSB0cnVlOworICBwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7CisKKyAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcFdpZGdldC0+R2V0UGFnZVZpZXcoKTsKKyAgQVNTRVJUKHBQYWdlVmlldyk7CisKKyAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOworICBmYS5iTW9kaWZpZXIgPSBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OklzQ1RSTEtleURvd24obkZsYWcpOworICBmYS5iU2hpZnQgPSBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OklzU0hJRlRLZXlEb3duKG5GbGFnKTsKKyAgcEZvcm1GaWxsZXItPkdldEFjdGlvbkRhdGEocFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246Okxvc2VGb2N1cywgZmEpOworICBwV2lkZ2V0LT5PbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpMb3NlRm9jdXMsIGZhLCBwUGFnZVZpZXcpOworICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKKyAgcmV0dXJuICEhKCpwQW5ub3QpOwogfQogCiBib29sIENGRkxfSW50ZXJhY3RpdmVGb3JtRmlsbGVyOjpJc1Zpc2libGUoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpIHsKQEAgLTQ1NywxMiArNDU1LDExIEBACiB9CiAKIGJvb2wgQ0ZGTF9JbnRlcmFjdGl2ZUZvcm1GaWxsZXI6OklzRmlsbGluZ0FsbG93ZWQoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpIHsKLSAgaWYgKHBXaWRnZXQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgIHJldHVybiB0cnVlOworICBpZiAocFdpZGdldC0+R2V0RmllbGRUeXBlKCkgPT0gRm9ybUZpZWxkVHlwZTo6a1B1c2hCdXR0b24pCisgICAgcmV0dXJuIGZhbHNlOwogCiAgIENQREZfUGFnZSogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZQYWdlKCk7Ci0gIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCA9IHBQYWdlLT5tX3BEb2N1bWVudDsKLSAgdWludDMyX3QgZHdQZXJtaXNzaW9ucyA9IHBEb2N1bWVudC0+R2V0VXNlclBlcm1pc3Npb25zKCk7CisgIHVpbnQzMl90IGR3UGVybWlzc2lvbnMgPSBwUGFnZS0+bV9wRG9jdW1lbnQtPkdldFVzZXJQZXJtaXNzaW9ucygpOwogICByZXR1cm4gKGR3UGVybWlzc2lvbnMgJiBGUERGUEVSTV9GSUxMX0ZPUk0pIHx8CiAgICAgICAgICAoZHdQZXJtaXNzaW9ucyAmIEZQREZQRVJNX0FOTk9UX0ZPUk0pIHx8CiAgICAgICAgICAoZHdQZXJtaXNzaW9ucyAmIEZQREZQRVJNX01PRElGWSk7CkBAIC00NzgsMjkgKzQ3NSwzMCBAQAogICBpZiAoIWJSZWdpc3RlcikKICAgICByZXR1cm4gbnVsbHB0cjsKIAotICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IChDUERGU0RLX1dpZGdldCopcEFubm90OwotICBpbnQgbkZpZWxkVHlwZSA9IHBXaWRnZXQtPkdldEZpZWxkVHlwZSgpOworICAvLyBUT0RPKHRoZXN0aWcpOiBIb3cgZG8gd2Uga25vdyB8cEFubm90fCBpcyBhIENQREZTREtfV2lkZ2V0PworICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHN0YXRpY19jYXN0PENQREZTREtfV2lkZ2V0Kj4ocEFubm90KTsKKyAgRm9ybUZpZWxkVHlwZSBmaWVsZFR5cGUgPSBwV2lkZ2V0LT5HZXRGaWVsZFR5cGUoKTsKICAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlcjsKLSAgc3dpdGNoIChuRmllbGRUeXBlKSB7Ci0gICAgY2FzZSBGSUVMRFRZUEVfUFVTSEJVVFRPTjoKLSAgICAgIHBGb3JtRmlsbGVyID0gbmV3IENGRkxfUHVzaEJ1dHRvbihtX3BGb3JtRmlsbEVudiwgcFdpZGdldCk7CisgIHN3aXRjaCAoZmllbGRUeXBlKSB7CisgICAgY2FzZSBGb3JtRmllbGRUeXBlOjprUHVzaEJ1dHRvbjoKKyAgICAgIHBGb3JtRmlsbGVyID0gbmV3IENGRkxfUHVzaEJ1dHRvbihtX3BGb3JtRmlsbEVudi5HZXQoKSwgcFdpZGdldCk7CiAgICAgICBicmVhazsKLSAgICBjYXNlIEZJRUxEVFlQRV9DSEVDS0JPWDoKLSAgICAgIHBGb3JtRmlsbGVyID0gbmV3IENGRkxfQ2hlY2tCb3gobV9wRm9ybUZpbGxFbnYsIHBXaWRnZXQpOworICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a0NoZWNrQm94OgorICAgICAgcEZvcm1GaWxsZXIgPSBuZXcgQ0ZGTF9DaGVja0JveChtX3BGb3JtRmlsbEVudi5HZXQoKSwgcFdpZGdldCk7CiAgICAgICBicmVhazsKLSAgICBjYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjoKLSAgICAgIHBGb3JtRmlsbGVyID0gbmV3IENGRkxfUmFkaW9CdXR0b24obV9wRm9ybUZpbGxFbnYsIHBXaWRnZXQpOworICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a1JhZGlvQnV0dG9uOgorICAgICAgcEZvcm1GaWxsZXIgPSBuZXcgQ0ZGTF9SYWRpb0J1dHRvbihtX3BGb3JtRmlsbEVudi5HZXQoKSwgcFdpZGdldCk7CiAgICAgICBicmVhazsKLSAgICBjYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6Ci0gICAgICBwRm9ybUZpbGxlciA9IG5ldyBDRkZMX1RleHRGaWVsZChtX3BGb3JtRmlsbEVudiwgcFdpZGdldCk7CisgICAgY2FzZSBGb3JtRmllbGRUeXBlOjprVGV4dEZpZWxkOgorICAgICAgcEZvcm1GaWxsZXIgPSBuZXcgQ0ZGTF9UZXh0RmllbGQobV9wRm9ybUZpbGxFbnYuR2V0KCksIHBXaWRnZXQpOwogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGSUVMRFRZUEVfTElTVEJPWDoKLSAgICAgIHBGb3JtRmlsbGVyID0gbmV3IENGRkxfTGlzdEJveChtX3BGb3JtRmlsbEVudiwgcFdpZGdldCk7CisgICAgY2FzZSBGb3JtRmllbGRUeXBlOjprTGlzdEJveDoKKyAgICAgIHBGb3JtRmlsbGVyID0gbmV3IENGRkxfTGlzdEJveChtX3BGb3JtRmlsbEVudi5HZXQoKSwgcFdpZGdldCk7CiAgICAgICBicmVhazsKLSAgICBjYXNlIEZJRUxEVFlQRV9DT01CT0JPWDoKLSAgICAgIHBGb3JtRmlsbGVyID0gbmV3IENGRkxfQ29tYm9Cb3gobV9wRm9ybUZpbGxFbnYsIHBXaWRnZXQpOworICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a0NvbWJvQm94OgorICAgICAgcEZvcm1GaWxsZXIgPSBuZXcgQ0ZGTF9Db21ib0JveChtX3BGb3JtRmlsbEVudi5HZXQoKSwgcFdpZGdldCk7CiAgICAgICBicmVhazsKLSAgICBjYXNlIEZJRUxEVFlQRV9VTktOT1dOOgorICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a1Vua25vd246CiAgICAgZGVmYXVsdDoKICAgICAgIHBGb3JtRmlsbGVyID0gbnVsbHB0cjsKICAgICAgIGJyZWFrOwpAQCAtNTEzLDkgKzUxMSwyMCBAQAogICByZXR1cm4gcEZvcm1GaWxsZXI7CiB9CiAKLXZvaWQgQ0ZGTF9JbnRlcmFjdGl2ZUZvcm1GaWxsZXI6OlJlbW92ZUZvcm1GaWxsZXIoQ1BERlNES19Bbm5vdCogcEFubm90KSB7Ci0gIGlmIChwQW5ub3QpCi0gICAgVW5SZWdpc3RlckZvcm1GaWxsZXIocEFubm90KTsKK1dpZGVTdHJpbmcgQ0ZGTF9JbnRlcmFjdGl2ZUZvcm1GaWxsZXI6OkdldFNlbGVjdGVkVGV4dChDUERGU0RLX0Fubm90KiBwQW5ub3QpIHsKKyAgQVNTRVJUKHBBbm5vdC0+R2V0UERGQW5ub3QoKS0+R2V0U3VidHlwZSgpID09IENQREZfQW5ub3Q6OlN1YnR5cGU6OldJREdFVCk7CisgIENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBBbm5vdCwgZmFsc2UpOworICByZXR1cm4gcEZvcm1GaWxsZXIgPyBwRm9ybUZpbGxlci0+R2V0U2VsZWN0ZWRUZXh0KHBBbm5vdCkgOiBXaWRlU3RyaW5nKCk7Cit9CisKK3ZvaWQgQ0ZGTF9JbnRlcmFjdGl2ZUZvcm1GaWxsZXI6OlJlcGxhY2VTZWxlY3Rpb24oQ1BERlNES19Bbm5vdCogcEFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB0ZXh0KSB7CisgIEFTU0VSVChwQW5ub3QtPkdldFBERkFubm90KCktPkdldFN1YnR5cGUoKSA9PSBDUERGX0Fubm90OjpTdWJ0eXBlOjpXSURHRVQpOworICBDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwQW5ub3QsIGZhbHNlKTsKKyAgaWYgKCFwRm9ybUZpbGxlcikKKyAgICByZXR1cm47CisKKyAgcEZvcm1GaWxsZXItPlJlcGxhY2VTZWxlY3Rpb24ocEFubm90LCB0ZXh0KTsKIH0KIAogdm9pZCBDRkZMX0ludGVyYWN0aXZlRm9ybUZpbGxlcjo6VW5SZWdpc3RlckZvcm1GaWxsZXIoQ1BERlNES19Bbm5vdCogcEFubm90KSB7CkBAIC01MjYsMjQgKzUzNSwyMiBAQAogICBtX01hcHMuZXJhc2UoaXQpOwogfQogCi12b2lkIENGRkxfSW50ZXJhY3RpdmVGb3JtRmlsbGVyOjpRdWVyeVdoZXJlUG9wdXAodm9pZCogcFByaXZhdGVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQb3B1cE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUG9wdXBNYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgblJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZlBvcHVwUmV0KSB7Ci0gIENGRkxfUHJpdmF0ZURhdGEqIHBEYXRhID0gKENGRkxfUHJpdmF0ZURhdGEqKXBQcml2YXRlRGF0YTsKK3ZvaWQgQ0ZGTF9JbnRlcmFjdGl2ZUZvcm1GaWxsZXI6OlF1ZXJ5V2hlcmVQb3B1cCgKKyAgICBDUFdMX1duZDo6UHJpdmF0ZURhdGEqIHBBdHRhY2hlZCwKKyAgICBmbG9hdCBmUG9wdXBNaW4sCisgICAgZmxvYXQgZlBvcHVwTWF4LAorICAgIGJvb2wqIGJCb3R0b20sCisgICAgZmxvYXQqIGZQb3B1cFJldCkgeworICBhdXRvKiBwRGF0YSA9IHN0YXRpY19jYXN0PENGRkxfUHJpdmF0ZURhdGEqPihwQXR0YWNoZWQpOworICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBEYXRhLT5wV2lkZ2V0OworICBDUERGX1BhZ2UqIHBQYWdlID0gcFdpZGdldC0+R2V0UERGUGFnZSgpOwogCi0gIENGWF9GbG9hdFJlY3QgcmNQYWdlVmlldygwLCAwLCAwLCAwKTsKLSAgcmNQYWdlVmlldy5yaWdodCA9IHBEYXRhLT5wV2lkZ2V0LT5HZXRQREZQYWdlKCktPkdldFBhZ2VXaWR0aCgpOwotICByY1BhZ2VWaWV3LmJvdHRvbSA9IHBEYXRhLT5wV2lkZ2V0LT5HZXRQREZQYWdlKCktPkdldFBhZ2VIZWlnaHQoKTsKKyAgQ0ZYX0Zsb2F0UmVjdCByY1BhZ2VWaWV3KDAsIHBQYWdlLT5HZXRQYWdlSGVpZ2h0KCksIHBQYWdlLT5HZXRQYWdlV2lkdGgoKSwgMCk7CiAgIHJjUGFnZVZpZXcuTm9ybWFsaXplKCk7CiAKLSAgQ0ZYX0Zsb2F0UmVjdCByY0Fubm90ID0gcERhdGEtPnBXaWRnZXQtPkdldFJlY3QoKTsKLQotICBGWF9GTE9BVCBmVG9wID0gMC4wZjsKLSAgRlhfRkxPQVQgZkJvdHRvbSA9IDAuMGY7Ci0KLSAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSAoQ1BERlNES19XaWRnZXQqKXBEYXRhLT5wV2lkZ2V0OworICBDRlhfRmxvYXRSZWN0IHJjQW5ub3QgPSBwV2lkZ2V0LT5HZXRSZWN0KCk7CisgIGZsb2F0IGZUb3AgPSAwLjBmOworICBmbG9hdCBmQm90dG9tID0gMC4wZjsKICAgc3dpdGNoIChwV2lkZ2V0LT5HZXRSb3RhdGUoKSAvIDkwKSB7CiAgICAgZGVmYXVsdDoKICAgICBjYXNlIDA6CkBAIC01NjQsMzA4ICs1NzEsMjc2IEBACiAgICAgICBicmVhazsKICAgfQogCi0gIEZYX0ZMT0FUIGZGYWN0SGVpZ2h0ID0gMDsKLSAgYm9vbCBiQm90dG9tID0gdHJ1ZTsKLSAgRlhfRkxPQVQgZk1heExpc3RCb3hIZWlnaHQgPSAwOwotICBpZiAoZlBvcHVwTWF4ID4gRkZMX01BWExJU1RCT1hIRUlHSFQpIHsKLSAgICBpZiAoZlBvcHVwTWluID4gRkZMX01BWExJU1RCT1hIRUlHSFQpIHsKLSAgICAgIGZNYXhMaXN0Qm94SGVpZ2h0ID0gZlBvcHVwTWluOwotICAgIH0gZWxzZSB7Ci0gICAgICBmTWF4TGlzdEJveEhlaWdodCA9IEZGTF9NQVhMSVNUQk9YSEVJR0hUOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmTWF4TGlzdEJveEhlaWdodCA9IGZQb3B1cE1heDsKLSAgfQorICBjb25zdGV4cHIgZmxvYXQga01heExpc3RCb3hIZWlnaHQgPSAxNDA7CisgIGNvbnN0IGZsb2F0IGZNYXhMaXN0Qm94SGVpZ2h0ID0KKyAgICAgIHBkZml1bTo6Y2xhbXAoa01heExpc3RCb3hIZWlnaHQsIGZQb3B1cE1pbiwgZlBvcHVwTWF4KTsKIAogICBpZiAoZkJvdHRvbSA+IGZNYXhMaXN0Qm94SGVpZ2h0KSB7Ci0gICAgZkZhY3RIZWlnaHQgPSBmTWF4TGlzdEJveEhlaWdodDsKLSAgICBiQm90dG9tID0gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZlRvcCA+IGZNYXhMaXN0Qm94SGVpZ2h0KSB7Ci0gICAgICBmRmFjdEhlaWdodCA9IGZNYXhMaXN0Qm94SGVpZ2h0OwotICAgICAgYkJvdHRvbSA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoZlRvcCA+IGZCb3R0b20pIHsKLSAgICAgICAgZkZhY3RIZWlnaHQgPSBmVG9wOwotICAgICAgICBiQm90dG9tID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmRmFjdEhlaWdodCA9IGZCb3R0b207Ci0gICAgICAgIGJCb3R0b20gPSB0cnVlOwotICAgICAgfQotICAgIH0KKyAgICAqZlBvcHVwUmV0ID0gZk1heExpc3RCb3hIZWlnaHQ7CisgICAgKmJCb3R0b20gPSB0cnVlOworICAgIHJldHVybjsKICAgfQogCi0gIG5SZXQgPSBiQm90dG9tID8gMCA6IDE7Ci0gIGZQb3B1cFJldCA9IGZGYWN0SGVpZ2h0OworICBpZiAoZlRvcCA+IGZNYXhMaXN0Qm94SGVpZ2h0KSB7CisgICAgKmZQb3B1cFJldCA9IGZNYXhMaXN0Qm94SGVpZ2h0OworICAgICpiQm90dG9tID0gZmFsc2U7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGZUb3AgPiBmQm90dG9tKSB7CisgICAgKmZQb3B1cFJldCA9IGZUb3A7CisgICAgKmJCb3R0b20gPSBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICAqZlBvcHVwUmV0ID0gZkJvdHRvbTsKKyAgICAqYkJvdHRvbSA9IHRydWU7CisgIH0KIH0KIAotdm9pZCBDRkZMX0ludGVyYWN0aXZlRm9ybUZpbGxlcjo6T25LZXlTdHJva2VDb21taXQoCitib29sIENGRkxfSW50ZXJhY3RpdmVGb3JtRmlsbGVyOjpPbktleVN0cm9rZUNvbW1pdCgKICAgICBDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciogcEFubm90LAogICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKLSAgICBib29sJiBiUkMsCi0gICAgYm9vbCYgYkV4aXQsCiAgICAgdWludDMyX3QgbkZsYWcpIHsKLSAgaWYgKCFtX2JOb3RpZnlpbmcpIHsKLSAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHN0YXRpY19jYXN0PENQREZTREtfV2lkZ2V0Kj4ocEFubm90LT5HZXQoKSk7Ci0gICAgaWYgKHBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UpLkdldERpY3QoKSkgewotICAgICAgQVNTRVJUKHBQYWdlVmlldyk7Ci0gICAgICBtX2JOb3RpZnlpbmcgPSB0cnVlOwotICAgICAgcFdpZGdldC0+Q2xlYXJBcHBNb2RpZmllZCgpOworICBpZiAobV9iTm90aWZ5aW5nKQorICAgIHJldHVybiB0cnVlOwogCi0gICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7Ci0gICAgICBmYS5iTW9kaWZpZXIgPSBtX3BGb3JtRmlsbEVudi0+SXNDVFJMS2V5RG93bihuRmxhZyk7Ci0gICAgICBmYS5iU2hpZnQgPSBtX3BGb3JtRmlsbEVudi0+SXNTSElGVEtleURvd24obkZsYWcpOwotICAgICAgZmEuYldpbGxDb21taXQgPSB0cnVlOwotICAgICAgZmEuYktleURvd24gPSB0cnVlOwotICAgICAgZmEuYlJDID0gdHJ1ZTsKKyAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBzdGF0aWNfY2FzdDxDUERGU0RLX1dpZGdldCo+KHBBbm5vdC0+R2V0KCkpOworICBpZiAoIXBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UpLkdldERpY3QoKSkKKyAgICByZXR1cm4gdHJ1ZTsKIAotICAgICAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgZmFsc2UpOwotICAgICAgcEZvcm1GaWxsZXItPkdldEFjdGlvbkRhdGEocFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OktleVN0cm9rZSwgZmEpOwotICAgICAgcEZvcm1GaWxsZXItPlNhdmVTdGF0ZShwUGFnZVZpZXcpOwotICAgICAgcFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlLCBmYSwgcFBhZ2VWaWV3KTsKLSAgICAgIGlmICghKCpwQW5ub3QpKQotICAgICAgICByZXR1cm47CisgIEFTU0VSVChwUGFnZVZpZXcpOworICBtX2JOb3RpZnlpbmcgPSB0cnVlOworICBwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7CiAKLSAgICAgIGJSQyA9IGZhLmJSQzsKLSAgICAgIG1fYk5vdGlmeWluZyA9IGZhbHNlOwotICAgIH0KLSAgfQorICBQREZTREtfRmllbGRBY3Rpb24gZmE7CisgIGZhLmJNb2RpZmllciA9IENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6SXNDVFJMS2V5RG93bihuRmxhZyk7CisgIGZhLmJTaGlmdCA9IENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6SXNTSElGVEtleURvd24obkZsYWcpOworICBmYS5iV2lsbENvbW1pdCA9IHRydWU7CisgIGZhLmJLZXlEb3duID0gdHJ1ZTsKKyAgZmEuYlJDID0gdHJ1ZTsKKworICBDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBmYWxzZSk7CisgIHBGb3JtRmlsbGVyLT5HZXRBY3Rpb25EYXRhKHBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UsIGZhKTsKKyAgcEZvcm1GaWxsZXItPlNhdmVTdGF0ZShwUGFnZVZpZXcpOworICBwV2lkZ2V0LT5PbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UsIGZhLCBwUGFnZVZpZXcpOworICBpZiAoISgqcEFubm90KSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKKyAgcmV0dXJuIGZhLmJSQzsKIH0KIAotdm9pZCBDRkZMX0ludGVyYWN0aXZlRm9ybUZpbGxlcjo6T25WYWxpZGF0ZShDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciogcEFubm90LAorYm9vbCBDRkZMX0ludGVyYWN0aXZlRm9ybUZpbGxlcjo6T25WYWxpZGF0ZShDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciogcEFubm90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJSQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYkV4aXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFnKSB7Ci0gIGlmICghbV9iTm90aWZ5aW5nKSB7Ci0gICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBzdGF0aWNfY2FzdDxDUERGU0RLX1dpZGdldCo+KHBBbm5vdC0+R2V0KCkpOwotICAgIGlmIChwV2lkZ2V0LT5HZXRBQWN0aW9uKENQREZfQUFjdGlvbjo6VmFsaWRhdGUpLkdldERpY3QoKSkgewotICAgICAgQVNTRVJUKHBQYWdlVmlldyk7Ci0gICAgICBtX2JOb3RpZnlpbmcgPSB0cnVlOwotICAgICAgcFdpZGdldC0+Q2xlYXJBcHBNb2RpZmllZCgpOworICBpZiAobV9iTm90aWZ5aW5nKQorICAgIHJldHVybiB0cnVlOwogCi0gICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7Ci0gICAgICBmYS5iTW9kaWZpZXIgPSBtX3BGb3JtRmlsbEVudi0+SXNDVFJMS2V5RG93bihuRmxhZyk7Ci0gICAgICBmYS5iU2hpZnQgPSBtX3BGb3JtRmlsbEVudi0+SXNTSElGVEtleURvd24obkZsYWcpOwotICAgICAgZmEuYktleURvd24gPSB0cnVlOwotICAgICAgZmEuYlJDID0gdHJ1ZTsKKyAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBzdGF0aWNfY2FzdDxDUERGU0RLX1dpZGdldCo+KHBBbm5vdC0+R2V0KCkpOworICBpZiAoIXBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZSkuR2V0RGljdCgpKQorICAgIHJldHVybiB0cnVlOwogCi0gICAgICBDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBmYWxzZSk7Ci0gICAgICBwRm9ybUZpbGxlci0+R2V0QWN0aW9uRGF0YShwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6VmFsaWRhdGUsIGZhKTsKLSAgICAgIHBGb3JtRmlsbGVyLT5TYXZlU3RhdGUocFBhZ2VWaWV3KTsKLSAgICAgIHBXaWRnZXQtPk9uQUFjdGlvbihDUERGX0FBY3Rpb246OlZhbGlkYXRlLCBmYSwgcFBhZ2VWaWV3KTsKLSAgICAgIGlmICghKCpwQW5ub3QpKQotICAgICAgICByZXR1cm47CisgIEFTU0VSVChwUGFnZVZpZXcpOworICBtX2JOb3RpZnlpbmcgPSB0cnVlOworICBwV2lkZ2V0LT5DbGVhckFwcE1vZGlmaWVkKCk7CiAKLSAgICAgIGJSQyA9IGZhLmJSQzsKLSAgICAgIG1fYk5vdGlmeWluZyA9IGZhbHNlOwotICAgIH0KLSAgfQorICBQREZTREtfRmllbGRBY3Rpb24gZmE7CisgIGZhLmJNb2RpZmllciA9IENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6SXNDVFJMS2V5RG93bihuRmxhZyk7CisgIGZhLmJTaGlmdCA9IENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6SXNTSElGVEtleURvd24obkZsYWcpOworICBmYS5iS2V5RG93biA9IHRydWU7CisgIGZhLmJSQyA9IHRydWU7CisKKyAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgZmFsc2UpOworICBwRm9ybUZpbGxlci0+R2V0QWN0aW9uRGF0YShwUGFnZVZpZXcsIENQREZfQUFjdGlvbjo6VmFsaWRhdGUsIGZhKTsKKyAgcEZvcm1GaWxsZXItPlNhdmVTdGF0ZShwUGFnZVZpZXcpOworICBwV2lkZ2V0LT5PbkFBY3Rpb24oQ1BERl9BQWN0aW9uOjpWYWxpZGF0ZSwgZmEsIHBQYWdlVmlldyk7CisgIGlmICghKCpwQW5ub3QpKQorICAgIHJldHVybiB0cnVlOworCisgIG1fYk5vdGlmeWluZyA9IGZhbHNlOworICByZXR1cm4gZmEuYlJDOwogfQogCi12b2lkIENGRkxfSW50ZXJhY3RpdmVGb3JtRmlsbGVyOjpPbkNhbGN1bGF0ZShDUERGU0RLX1dpZGdldCogcFdpZGdldCwKK3ZvaWQgQ0ZGTF9JbnRlcmFjdGl2ZUZvcm1GaWxsZXI6Ok9uQ2FsY3VsYXRlKENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyKiBwQW5ub3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiRXhpdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFnKSB7Ci0gIGlmICghbV9iTm90aWZ5aW5nKSB7Ci0gICAgQVNTRVJUKHBXaWRnZXQpOworICBpZiAobV9iTm90aWZ5aW5nKQorICAgIHJldHVybjsKKworICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHN0YXRpY19jYXN0PENQREZTREtfV2lkZ2V0Kj4ocEFubm90LT5HZXQoKSk7CisgIGlmIChwV2lkZ2V0KSB7CiAgICAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBwUGFnZVZpZXctPkdldEZvcm1GaWxsRW52KCktPkdldEludGVyRm9ybSgpOwogICAgIHBJbnRlckZvcm0tPk9uQ2FsY3VsYXRlKHBXaWRnZXQtPkdldEZvcm1GaWVsZCgpKTsKLSAgICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKICAgfQorICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKIH0KIAotdm9pZCBDRkZMX0ludGVyYWN0aXZlRm9ybUZpbGxlcjo6T25Gb3JtYXQoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsCit2b2lkIENGRkxfSW50ZXJhY3RpdmVGb3JtRmlsbGVyOjpPbkZvcm1hdChDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciogcEFubm90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYkV4aXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuRmxhZykgewotICBpZiAoIW1fYk5vdGlmeWluZykgewotICAgIEFTU0VSVChwV2lkZ2V0KTsKLSAgICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IHBQYWdlVmlldy0+R2V0Rm9ybUZpbGxFbnYoKS0+R2V0SW50ZXJGb3JtKCk7CisgIGlmIChtX2JOb3RpZnlpbmcpCisgICAgcmV0dXJuOwogCi0gICAgYm9vbCBiRm9ybWF0dGVkID0gZmFsc2U7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0KLSAgICAgICAgcEludGVyRm9ybS0+T25Gb3JtYXQocFdpZGdldC0+R2V0Rm9ybUZpZWxkKCksIGJGb3JtYXR0ZWQpOworICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHN0YXRpY19jYXN0PENQREZTREtfV2lkZ2V0Kj4ocEFubm90LT5HZXQoKSk7CisgIEFTU0VSVChwV2lkZ2V0KTsKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBwUGFnZVZpZXctPkdldEZvcm1GaWxsRW52KCktPkdldEludGVyRm9ybSgpOwogCi0gICAgaWYgKGJFeGl0KQotICAgICAgcmV0dXJuOworICBib29sIGJGb3JtYXR0ZWQgPSBmYWxzZTsKKyAgV2lkZVN0cmluZyBzVmFsdWUgPSBwSW50ZXJGb3JtLT5PbkZvcm1hdChwV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSwgYkZvcm1hdHRlZCk7CisgIGlmICghKCpwQW5ub3QpKQorICAgIHJldHVybjsKIAotICAgIGlmIChiRm9ybWF0dGVkKSB7Ci0gICAgICBwSW50ZXJGb3JtLT5SZXNldEZpZWxkQXBwZWFyYW5jZShwV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSwgJnNWYWx1ZSwgdHJ1ZSk7Ci0gICAgICBwSW50ZXJGb3JtLT5VcGRhdGVGaWVsZChwV2lkZ2V0LT5HZXRGb3JtRmllbGQoKSk7Ci0gICAgfQotCi0gICAgbV9iTm90aWZ5aW5nID0gZmFsc2U7CisgIGlmIChiRm9ybWF0dGVkKSB7CisgICAgcEludGVyRm9ybS0+UmVzZXRGaWVsZEFwcGVhcmFuY2UocFdpZGdldC0+R2V0Rm9ybUZpZWxkKCksICZzVmFsdWUsIHRydWUpOworICAgIHBJbnRlckZvcm0tPlVwZGF0ZUZpZWxkKHBXaWRnZXQtPkdldEZvcm1GaWVsZCgpKTsKICAgfQorCisgIG1fYk5vdGlmeWluZyA9IGZhbHNlOwogfQogCiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKLXZvaWQgQ0ZGTF9JbnRlcmFjdGl2ZUZvcm1GaWxsZXI6Ok9uQ2xpY2soQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsCitib29sIENGRkxfSW50ZXJhY3RpdmVGb3JtRmlsbGVyOjpPbkNsaWNrKENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyKiBwQW5ub3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYlJlc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiRXhpdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWcpIHsKLSAgaWYgKCFtX2JOb3RpZnlpbmcpIHsKLSAgICBpZiAocFdpZGdldC0+SGFzWEZBQUFjdGlvbihQREZTREtfWEZBX0NsaWNrKSkgewotICAgICAgbV9iTm90aWZ5aW5nID0gdHJ1ZTsKLSAgICAgIGludCBuQWdlID0gcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOwotICAgICAgaW50IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CisgIGlmIChtX2JOb3RpZnlpbmcpCisgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICBQREZTREtfRmllbGRBY3Rpb24gZmE7Ci0gICAgICBmYS5iTW9kaWZpZXIgPSBtX3BGb3JtRmlsbEVudi0+SXNDVFJMS2V5RG93bihuRmxhZyk7Ci0gICAgICBmYS5iU2hpZnQgPSBtX3BGb3JtRmlsbEVudi0+SXNTSElGVEtleURvd24obkZsYWcpOworICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHN0YXRpY19jYXN0PENQREZTREtfV2lkZ2V0Kj4ocEFubm90LT5HZXQoKSk7CisgIGlmICghcFdpZGdldC0+SGFzWEZBQUFjdGlvbihQREZTREtfWEZBX0NsaWNrKSkKKyAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgIHBXaWRnZXQtPk9uWEZBQUFjdGlvbihQREZTREtfWEZBX0NsaWNrLCBmYSwgcFBhZ2VWaWV3KTsKLSAgICAgIG1fYk5vdGlmeWluZyA9IGZhbHNlOworICBtX2JOb3RpZnlpbmcgPSB0cnVlOworICB1aW50MzJfdCBuQWdlID0gcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOworICB1aW50MzJfdCBuVmFsdWVBZ2UgPSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOwogCi0gICAgICBpZiAoIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBXaWRnZXQpKSB7Ci0gICAgICAgIGJFeGl0ID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQorICBQREZTREtfRmllbGRBY3Rpb24gZmE7CisgIGZhLmJNb2RpZmllciA9IENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6SXNDVFJMS2V5RG93bihuRmxhZyk7CisgIGZhLmJTaGlmdCA9IENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6SXNTSElGVEtleURvd24obkZsYWcpOwogCi0gICAgICBpZiAobkFnZSAhPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCkpIHsKLSAgICAgICAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIGZhbHNlKSkgewotICAgICAgICAgIHBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdyhwUGFnZVZpZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5WYWx1ZUFnZSA9PSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKLSAgICAgICAgfQorICBwV2lkZ2V0LT5PblhGQUFBY3Rpb24oUERGU0RLX1hGQV9DbGljaywgZmEsIHBQYWdlVmlldyk7CisgIG1fYk5vdGlmeWluZyA9IGZhbHNlOworICBpZiAoISgqcEFubm90KSB8fCAhSXNWYWxpZEFubm90KHBQYWdlVmlldywgcFdpZGdldCkpCisgICAgcmV0dXJuIHRydWU7CisgIGlmIChuQWdlID09IHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKSkKKyAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgYlJlc2V0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KKyAgaWYgKENGRkxfRm9ybUZpbGxlciogcEZvcm1GaWxsZXIgPSBHZXRGb3JtRmlsbGVyKHBXaWRnZXQsIGZhbHNlKSkKKyAgICBwRm9ybUZpbGxlci0+UmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBuVmFsdWVBZ2UgPT0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKSk7CisgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBDRkZMX0ludGVyYWN0aXZlRm9ybUZpbGxlcjo6T25GdWxsKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LAorYm9vbCBDRkZMX0ludGVyYWN0aXZlRm9ybUZpbGxlcjo6T25GdWxsKENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyKiBwQW5ub3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJSZXNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiRXhpdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuRmxhZykgewotICBpZiAoIW1fYk5vdGlmeWluZykgewotICAgIGlmIChwV2lkZ2V0LT5IYXNYRkFBQWN0aW9uKFBERlNES19YRkFfRnVsbCkpIHsKLSAgICAgIG1fYk5vdGlmeWluZyA9IHRydWU7Ci0gICAgICBpbnQgbkFnZSA9IHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKLSAgICAgIGludCBuVmFsdWVBZ2UgPSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOworICBpZiAobV9iTm90aWZ5aW5nKQorICAgIHJldHVybiBmYWxzZTsKIAotICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOwotICAgICAgZmEuYk1vZGlmaWVyID0gbV9wRm9ybUZpbGxFbnYtPklzQ1RSTEtleURvd24obkZsYWcpOwotICAgICAgZmEuYlNoaWZ0ID0gbV9wRm9ybUZpbGxFbnYtPklzU0hJRlRLZXlEb3duKG5GbGFnKTsKKyAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBzdGF0aWNfY2FzdDxDUERGU0RLX1dpZGdldCo+KHBBbm5vdC0+R2V0KCkpOworICBpZiAoIXBXaWRnZXQtPkhhc1hGQUFBY3Rpb24oUERGU0RLX1hGQV9GdWxsKSkKKyAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgIHBXaWRnZXQtPk9uWEZBQUFjdGlvbihQREZTREtfWEZBX0Z1bGwsIGZhLCBwUGFnZVZpZXcpOwotICAgICAgbV9iTm90aWZ5aW5nID0gZmFsc2U7CisgIG1fYk5vdGlmeWluZyA9IHRydWU7CisgIHVpbnQzMl90IG5BZ2UgPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7CisgIHVpbnQzMl90IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CiAKLSAgICAgIGlmICghSXNWYWxpZEFubm90KHBQYWdlVmlldywgcFdpZGdldCkpIHsKLSAgICAgICAgYkV4aXQgPSB0cnVlOwotICAgICAgICByZXR1cm47Ci0gICAgICB9CisgIFBERlNES19GaWVsZEFjdGlvbiBmYTsKKyAgZmEuYk1vZGlmaWVyID0gQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpJc0NUUkxLZXlEb3duKG5GbGFnKTsKKyAgZmEuYlNoaWZ0ID0gQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpJc1NISUZUS2V5RG93bihuRmxhZyk7CiAKLSAgICAgIGlmIChuQWdlICE9IHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKSkgewotICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgZmFsc2UpKSB7Ci0gICAgICAgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblZhbHVlQWdlID09IHBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOwotICAgICAgICB9CisgIHBXaWRnZXQtPk9uWEZBQUFjdGlvbihQREZTREtfWEZBX0Z1bGwsIGZhLCBwUGFnZVZpZXcpOworICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKKyAgaWYgKCEoKnBBbm5vdCkgfHwgIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBXaWRnZXQpKQorICAgIHJldHVybiB0cnVlOworICBpZiAobkFnZSA9PSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCkpCisgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIGJSZXNldCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9CisgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBmYWxzZSkpCisgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywgblZhbHVlQWdlID09IHBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOworCisgIHJldHVybiB0cnVlOwogfQogCi12b2lkIENGRkxfSW50ZXJhY3RpdmVGb3JtRmlsbGVyOjpPblBvcHVwUHJlT3Blbih2b2lkKiBwUHJpdmF0ZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiRXhpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFnKSB7Ci0gIENGRkxfUHJpdmF0ZURhdGEqIHBEYXRhID0gKENGRkxfUHJpdmF0ZURhdGEqKXBQcml2YXRlRGF0YTsKK2Jvb2wgQ0ZGTF9JbnRlcmFjdGl2ZUZvcm1GaWxsZXI6Ok9uUG9wdXBQcmVPcGVuKAorICAgIENQV0xfV25kOjpQcml2YXRlRGF0YSogcEF0dGFjaGVkLAorICAgIHVpbnQzMl90IG5GbGFnKSB7CisgIGF1dG8qIHBEYXRhID0gc3RhdGljX2Nhc3Q8Q0ZGTF9Qcml2YXRlRGF0YSo+KHBBdHRhY2hlZCk7CiAgIEFTU0VSVChwRGF0YSk7CiAgIEFTU0VSVChwRGF0YS0+cFdpZGdldCk7CiAKLSAgYm9vbCBiVGVtcFJlc2V0ID0gZmFsc2U7Ci0gIGJvb2wgYlRlbXBFeGl0ID0gZmFsc2U7Ci0gIE9uUHJlT3BlbihwRGF0YS0+cFdpZGdldCwgcERhdGEtPnBQYWdlVmlldywgYlRlbXBSZXNldCwgYlRlbXBFeGl0LCBuRmxhZyk7Ci0gIGlmIChiVGVtcFJlc2V0IHx8IGJUZW1wRXhpdCkKLSAgICBiRXhpdCA9IHRydWU7CisgIENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyIHBPYnNlcnZlZChwRGF0YS0+cFdpZGdldCk7CisgIHJldHVybiBPblByZU9wZW4oJnBPYnNlcnZlZCwgcERhdGEtPnBQYWdlVmlldywgbkZsYWcpIHx8ICFwT2JzZXJ2ZWQ7CiB9CiAKLXZvaWQgQ0ZGTF9JbnRlcmFjdGl2ZUZvcm1GaWxsZXI6Ok9uUG9wdXBQb3N0T3Blbih2b2lkKiBwUHJpdmF0ZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYkV4aXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWcpIHsKLSAgQ0ZGTF9Qcml2YXRlRGF0YSogcERhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcFByaXZhdGVEYXRhOworYm9vbCBDRkZMX0ludGVyYWN0aXZlRm9ybUZpbGxlcjo6T25Qb3B1cFBvc3RPcGVuKAorICAgIENQV0xfV25kOjpQcml2YXRlRGF0YSogcEF0dGFjaGVkLAorICAgIHVpbnQzMl90IG5GbGFnKSB7CisgIGF1dG8qIHBEYXRhID0gc3RhdGljX2Nhc3Q8Q0ZGTF9Qcml2YXRlRGF0YSo+KHBBdHRhY2hlZCk7CiAgIEFTU0VSVChwRGF0YSk7CiAgIEFTU0VSVChwRGF0YS0+cFdpZGdldCk7CiAKLSAgYm9vbCBiVGVtcFJlc2V0ID0gZmFsc2U7Ci0gIGJvb2wgYlRlbXBFeGl0ID0gZmFsc2U7Ci0gIE9uUG9zdE9wZW4ocERhdGEtPnBXaWRnZXQsIHBEYXRhLT5wUGFnZVZpZXcsIGJUZW1wUmVzZXQsIGJUZW1wRXhpdCwgbkZsYWcpOwotICBpZiAoYlRlbXBSZXNldCB8fCBiVGVtcEV4aXQpCi0gICAgYkV4aXQgPSB0cnVlOworICBDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciBwT2JzZXJ2ZWQocERhdGEtPnBXaWRnZXQpOworICByZXR1cm4gT25Qb3N0T3BlbigmcE9ic2VydmVkLCBwRGF0YS0+cFBhZ2VWaWV3LCBuRmxhZykgfHwgIXBPYnNlcnZlZDsKIH0KIAotdm9pZCBDRkZMX0ludGVyYWN0aXZlRm9ybUZpbGxlcjo6T25QcmVPcGVuKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LAorYm9vbCBDRkZMX0ludGVyYWN0aXZlRm9ybUZpbGxlcjo6T25QcmVPcGVuKENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyKiBwQW5ub3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJSZXNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiRXhpdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuRmxhZykgewotICBpZiAoIW1fYk5vdGlmeWluZykgewotICAgIGlmIChwV2lkZ2V0LT5IYXNYRkFBQWN0aW9uKFBERlNES19YRkFfUHJlT3BlbikpIHsKLSAgICAgIG1fYk5vdGlmeWluZyA9IHRydWU7Ci0gICAgICBpbnQgbkFnZSA9IHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKLSAgICAgIGludCBuVmFsdWVBZ2UgPSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOworICBpZiAobV9iTm90aWZ5aW5nKQorICAgIHJldHVybiBmYWxzZTsKIAotICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOwotICAgICAgZmEuYk1vZGlmaWVyID0gbV9wRm9ybUZpbGxFbnYtPklzQ1RSTEtleURvd24obkZsYWcpOwotICAgICAgZmEuYlNoaWZ0ID0gbV9wRm9ybUZpbGxFbnYtPklzU0hJRlRLZXlEb3duKG5GbGFnKTsKKyAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBzdGF0aWNfY2FzdDxDUERGU0RLX1dpZGdldCo+KHBBbm5vdC0+R2V0KCkpOworICBpZiAoIXBXaWRnZXQtPkhhc1hGQUFBY3Rpb24oUERGU0RLX1hGQV9QcmVPcGVuKSkKKyAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgIHBXaWRnZXQtPk9uWEZBQUFjdGlvbihQREZTREtfWEZBX1ByZU9wZW4sIGZhLCBwUGFnZVZpZXcpOwotICAgICAgbV9iTm90aWZ5aW5nID0gZmFsc2U7CisgIG1fYk5vdGlmeWluZyA9IHRydWU7CisgIHVpbnQzMl90IG5BZ2UgPSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7CisgIHVpbnQzMl90IG5WYWx1ZUFnZSA9IHBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CiAKLSAgICAgIGlmICghSXNWYWxpZEFubm90KHBQYWdlVmlldywgcFdpZGdldCkpIHsKLSAgICAgICAgYkV4aXQgPSB0cnVlOwotICAgICAgICByZXR1cm47Ci0gICAgICB9CisgIFBERlNES19GaWVsZEFjdGlvbiBmYTsKKyAgZmEuYk1vZGlmaWVyID0gQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpJc0NUUkxLZXlEb3duKG5GbGFnKTsKKyAgZmEuYlNoaWZ0ID0gQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpJc1NISUZUS2V5RG93bihuRmxhZyk7CiAKLSAgICAgIGlmIChuQWdlICE9IHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKSkgewotICAgICAgICBpZiAoQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocFdpZGdldCwgZmFsc2UpKSB7Ci0gICAgICAgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblZhbHVlQWdlID09IHBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOwotICAgICAgICB9CisgIHBXaWRnZXQtPk9uWEZBQUFjdGlvbihQREZTREtfWEZBX1ByZU9wZW4sIGZhLCBwUGFnZVZpZXcpOworICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKKyAgaWYgKCEoKnBBbm5vdCkgfHwgIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBXaWRnZXQpKQorICAgIHJldHVybiB0cnVlOworICBpZiAobkFnZSA9PSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCkpCisgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIGJSZXNldCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9CisgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBmYWxzZSkpCisgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywgblZhbHVlQWdlID09IHBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOworCisgIHJldHVybiB0cnVlOwogfQogCi12b2lkIENGRkxfSW50ZXJhY3RpdmVGb3JtRmlsbGVyOjpPblBvc3RPcGVuKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LAorYm9vbCBDRkZMX0ludGVyYWN0aXZlRm9ybUZpbGxlcjo6T25Qb3N0T3BlbihDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciogcEFubm90LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJSZXNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYkV4aXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFnKSB7Ci0gIGlmICghbV9iTm90aWZ5aW5nKSB7Ci0gICAgaWYgKHBXaWRnZXQtPkhhc1hGQUFBY3Rpb24oUERGU0RLX1hGQV9Qb3N0T3BlbikpIHsKLSAgICAgIG1fYk5vdGlmeWluZyA9IHRydWU7Ci0gICAgICBpbnQgbkFnZSA9IHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKLSAgICAgIGludCBuVmFsdWVBZ2UgPSBwV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOworICBpZiAobV9iTm90aWZ5aW5nKQorICAgIHJldHVybiBmYWxzZTsKIAotICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOwotICAgICAgZmEuYk1vZGlmaWVyID0gbV9wRm9ybUZpbGxFbnYtPklzQ1RSTEtleURvd24obkZsYWcpOwotICAgICAgZmEuYlNoaWZ0ID0gbV9wRm9ybUZpbGxFbnYtPklzU0hJRlRLZXlEb3duKG5GbGFnKTsKKyAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBzdGF0aWNfY2FzdDxDUERGU0RLX1dpZGdldCo+KHBBbm5vdC0+R2V0KCkpOworICBpZiAoIXBXaWRnZXQtPkhhc1hGQUFBY3Rpb24oUERGU0RLX1hGQV9Qb3N0T3BlbikpCisgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICBwV2lkZ2V0LT5PblhGQUFBY3Rpb24oUERGU0RLX1hGQV9Qb3N0T3BlbiwgZmEsIHBQYWdlVmlldyk7Ci0gICAgICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKKyAgbV9iTm90aWZ5aW5nID0gdHJ1ZTsKKyAgdWludDMyX3QgbkFnZSA9IHBXaWRnZXQtPkdldEFwcGVhcmFuY2VBZ2UoKTsKKyAgdWludDMyX3QgblZhbHVlQWdlID0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKTsKIAotICAgICAgaWYgKCFJc1ZhbGlkQW5ub3QocFBhZ2VWaWV3LCBwV2lkZ2V0KSkgewotICAgICAgICBiRXhpdCA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KKyAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOworICBmYS5iTW9kaWZpZXIgPSBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OklzQ1RSTEtleURvd24obkZsYWcpOworICBmYS5iU2hpZnQgPSBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OklzU0hJRlRLZXlEb3duKG5GbGFnKTsKIAotICAgICAgaWYgKG5BZ2UgIT0gcFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpKSB7Ci0gICAgICAgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBmYWxzZSkpIHsKLSAgICAgICAgICBwRm9ybUZpbGxlci0+UmVzZXRQREZXaW5kb3cocFBhZ2VWaWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuVmFsdWVBZ2UgPT0gcFdpZGdldC0+R2V0VmFsdWVBZ2UoKSk7Ci0gICAgICAgIH0KKyAgcFdpZGdldC0+T25YRkFBQWN0aW9uKFBERlNES19YRkFfUG9zdE9wZW4sIGZhLCBwUGFnZVZpZXcpOworICBtX2JOb3RpZnlpbmcgPSBmYWxzZTsKKyAgaWYgKCEoKnBBbm5vdCkgfHwgIUlzVmFsaWRBbm5vdChwUGFnZVZpZXcsIHBXaWRnZXQpKQorICAgIHJldHVybiB0cnVlOworICBpZiAobkFnZSA9PSBwV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCkpCisgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIGJSZXNldCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9CisgIGlmIChDRkZMX0Zvcm1GaWxsZXIqIHBGb3JtRmlsbGVyID0gR2V0Rm9ybUZpbGxlcihwV2lkZ2V0LCBmYWxzZSkpCisgICAgcEZvcm1GaWxsZXItPlJlc2V0UERGV2luZG93KHBQYWdlVmlldywgblZhbHVlQWdlID09IHBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOworCisgIHJldHVybiB0cnVlOwogfQogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCkBAIC04NzQsOTUgKzg0OSw4MyBAQAogICByZXR1cm4gcFBhZ2VWaWV3ICYmIHBQYWdlVmlldy0+SXNWYWxpZEFubm90KHBBbm5vdC0+R2V0UERGQW5ub3QoKSk7CiB9CiAKLXZvaWQgQ0ZGTF9JbnRlcmFjdGl2ZUZvcm1GaWxsZXI6Ok9uQmVmb3JlS2V5U3Ryb2tlKAotICAgIHZvaWQqIHBQcml2YXRlRGF0YSwKLSAgICBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKK3N0ZDo6cGFpcjxib29sLCBib29sPiBDRkZMX0ludGVyYWN0aXZlRm9ybUZpbGxlcjo6T25CZWZvcmVLZXlTdHJva2UoCisgICAgQ1BXTF9XbmQ6OlByaXZhdGVEYXRhKiBwQXR0YWNoZWQsCisgICAgV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAorICAgIGNvbnN0IFdpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAogICAgIGludCBuU2VsU3RhcnQsCiAgICAgaW50IG5TZWxFbmQsCiAgICAgYm9vbCBiS2V5RG93biwKLSAgICBib29sJiBiUkMsCi0gICAgYm9vbCYgYkV4aXQsCiAgICAgdWludDMyX3QgbkZsYWcpIHsKLSAgQ0ZGTF9Qcml2YXRlRGF0YSogcERhdGEgPSAoQ0ZGTF9Qcml2YXRlRGF0YSopcFByaXZhdGVEYXRhOwotICBBU1NFUlQocERhdGEtPnBXaWRnZXQpOworICAvLyBDb3B5IHRoZSBwcml2YXRlIGRhdGEgc2luY2UgdGhlIHdpbmRvdyBvd25pbmcgaXQgbWF5IG5vdCBzdXJ2aXZlLgorICBDRkZMX1ByaXZhdGVEYXRhIHByaXZhdGVEYXRhID0gKnN0YXRpY19jYXN0PENGRkxfUHJpdmF0ZURhdGEqPihwQXR0YWNoZWQpOworICBBU1NFUlQocHJpdmF0ZURhdGEucFdpZGdldCk7CiAKLSAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocERhdGEtPnBXaWRnZXQsIGZhbHNlKTsKKyAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRm9ybUZpbGxlciA9IEdldEZvcm1GaWxsZXIocHJpdmF0ZURhdGEucFdpZGdldCwgZmFsc2UpOwogCiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKLSAgaWYgKHBGb3JtRmlsbGVyLT5Jc0ZpZWxkRnVsbChwRGF0YS0+cFBhZ2VWaWV3KSkgewotICAgIGJvb2wgYkZ1bGxFeGl0ID0gZmFsc2U7Ci0gICAgYm9vbCBiRnVsbFJlc2V0ID0gZmFsc2U7Ci0gICAgT25GdWxsKHBEYXRhLT5wV2lkZ2V0LCBwRGF0YS0+cFBhZ2VWaWV3LCBiRnVsbFJlc2V0LCBiRnVsbEV4aXQsIG5GbGFnKTsKLQotICAgIGlmIChiRnVsbFJlc2V0IHx8IGJGdWxsRXhpdCkgewotICAgICAgYkV4aXQgPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KKyAgaWYgKHBGb3JtRmlsbGVyLT5Jc0ZpZWxkRnVsbChwcml2YXRlRGF0YS5wUGFnZVZpZXcpKSB7CisgICAgQ1BERlNES19Bbm5vdDo6T2JzZXJ2ZWRQdHIgcE9ic2VydmVkKHByaXZhdGVEYXRhLnBXaWRnZXQpOworICAgIGlmIChPbkZ1bGwoJnBPYnNlcnZlZCwgcHJpdmF0ZURhdGEucFBhZ2VWaWV3LCBuRmxhZykgfHwgIXBPYnNlcnZlZCkKKyAgICAgIHJldHVybiB7dHJ1ZSwgdHJ1ZX07CiAgIH0KICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotICBpZiAoIW1fYk5vdGlmeWluZykgewotICAgIGlmIChwRGF0YS0+cFdpZGdldC0+R2V0QUFjdGlvbihDUERGX0FBY3Rpb246OktleVN0cm9rZSkuR2V0RGljdCgpKSB7Ci0gICAgICBtX2JOb3RpZnlpbmcgPSB0cnVlOwotICAgICAgaW50IG5BZ2UgPSBwRGF0YS0+cFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpOwotICAgICAgaW50IG5WYWx1ZUFnZSA9IHBEYXRhLT5wV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpOwotCi0gICAgICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiA9Ci0gICAgICAgICAgcERhdGEtPnBQYWdlVmlldy0+R2V0Rm9ybUZpbGxFbnYoKTsKLQotICAgICAgUERGU0RLX0ZpZWxkQWN0aW9uIGZhOwotICAgICAgZmEuYk1vZGlmaWVyID0gbV9wRm9ybUZpbGxFbnYtPklzQ1RSTEtleURvd24obkZsYWcpOwotICAgICAgZmEuYlNoaWZ0ID0gbV9wRm9ybUZpbGxFbnYtPklzU0hJRlRLZXlEb3duKG5GbGFnKTsKLSAgICAgIGZhLnNDaGFuZ2UgPSBzdHJDaGFuZ2U7Ci0gICAgICBmYS5zQ2hhbmdlRXggPSBzdHJDaGFuZ2VFeDsKLSAgICAgIGZhLmJLZXlEb3duID0gYktleURvd247Ci0gICAgICBmYS5iV2lsbENvbW1pdCA9IGZhbHNlOwotICAgICAgZmEuYlJDID0gdHJ1ZTsKLSAgICAgIGZhLm5TZWxTdGFydCA9IG5TZWxTdGFydDsKLSAgICAgIGZhLm5TZWxFbmQgPSBuU2VsRW5kOwotCi0gICAgICBwRm9ybUZpbGxlci0+R2V0QWN0aW9uRGF0YShwRGF0YS0+cFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OktleVN0cm9rZSwgZmEpOwotICAgICAgcEZvcm1GaWxsZXItPlNhdmVTdGF0ZShwRGF0YS0+cFBhZ2VWaWV3KTsKLQotICAgICAgQ1BERlNES19Bbm5vdDo6T2JzZXJ2ZWRQdHIgcE9ic2VydmVkKHBEYXRhLT5wV2lkZ2V0KTsKLSAgICAgIGlmIChwRGF0YS0+cFdpZGdldC0+T25BQWN0aW9uKENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlLCBmYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5wUGFnZVZpZXcpKSB7Ci0gICAgICAgIGlmICghcE9ic2VydmVkIHx8ICFJc1ZhbGlkQW5ub3QocERhdGEtPnBQYWdlVmlldywgcERhdGEtPnBXaWRnZXQpKSB7Ci0gICAgICAgICAgYkV4aXQgPSB0cnVlOwotICAgICAgICAgIG1fYk5vdGlmeWluZyA9IGZhbHNlOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuQWdlICE9IHBEYXRhLT5wV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCkpIHsKLSAgICAgICAgICBDUFdMX1duZCogcFduZCA9IHBGb3JtRmlsbGVyLT5SZXNldFBERldpbmRvdygKLSAgICAgICAgICAgICAgcERhdGEtPnBQYWdlVmlldywgblZhbHVlQWdlID09IHBEYXRhLT5wV2lkZ2V0LT5HZXRWYWx1ZUFnZSgpKTsKLSAgICAgICAgICBwRGF0YSA9IChDRkZMX1ByaXZhdGVEYXRhKilwV25kLT5HZXRBdHRhY2hlZERhdGEoKTsKLSAgICAgICAgICBiRXhpdCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmEuYlJDKSB7Ci0gICAgICAgICAgcEZvcm1GaWxsZXItPlNldEFjdGlvbkRhdGEocERhdGEtPnBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmEpOwotICAgICAgICAgIGJSQyA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBGb3JtRmlsbGVyLT5SZXN0b3JlU3RhdGUocERhdGEtPnBQYWdlVmlldyk7Ci0gICAgICAgICAgYlJDID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocEZvcm1GaWxsRW52LT5HZXRGb2N1c0Fubm90KCkgIT0gcERhdGEtPnBXaWRnZXQpIHsKLSAgICAgICAgICBwRm9ybUZpbGxlci0+Q29tbWl0RGF0YShwRGF0YS0+cFBhZ2VWaWV3LCBuRmxhZyk7Ci0gICAgICAgICAgYkV4aXQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoIUlzVmFsaWRBbm5vdChwRGF0YS0+cFBhZ2VWaWV3LCBwRGF0YS0+cFdpZGdldCkpIHsKLSAgICAgICAgICBiRXhpdCA9IHRydWU7Ci0gICAgICAgICAgbV9iTm90aWZ5aW5nID0gZmFsc2U7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIG1fYk5vdGlmeWluZyA9IGZhbHNlOwotICAgIH0KKyAgaWYgKG1fYk5vdGlmeWluZyB8fAorICAgICAgIXByaXZhdGVEYXRhLnBXaWRnZXQtPkdldEFBY3Rpb24oQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UpLkdldERpY3QoKSkgeworICAgIHJldHVybiB7dHJ1ZSwgZmFsc2V9OwogICB9CisKKyAgQXV0b1Jlc3RvcmVyPGJvb2w+IHJlc3RvcmVyKCZtX2JOb3RpZnlpbmcpOworICBtX2JOb3RpZnlpbmcgPSB0cnVlOworCisgIHVpbnQzMl90IG5BZ2UgPSBwcml2YXRlRGF0YS5wV2lkZ2V0LT5HZXRBcHBlYXJhbmNlQWdlKCk7CisgIHVpbnQzMl90IG5WYWx1ZUFnZSA9IHByaXZhdGVEYXRhLnBXaWRnZXQtPkdldFZhbHVlQWdlKCk7CisgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52ID0KKyAgICAgIHByaXZhdGVEYXRhLnBQYWdlVmlldy0+R2V0Rm9ybUZpbGxFbnYoKTsKKworICBQREZTREtfRmllbGRBY3Rpb24gZmE7CisgIGZhLmJNb2RpZmllciA9IENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6SXNDVFJMS2V5RG93bihuRmxhZyk7CisgIGZhLmJTaGlmdCA9IENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6SXNTSElGVEtleURvd24obkZsYWcpOworICBmYS5zQ2hhbmdlID0gc3RyQ2hhbmdlOworICBmYS5zQ2hhbmdlRXggPSBzdHJDaGFuZ2VFeDsKKyAgZmEuYktleURvd24gPSBiS2V5RG93bjsKKyAgZmEuYldpbGxDb21taXQgPSBmYWxzZTsKKyAgZmEuYlJDID0gdHJ1ZTsKKyAgZmEublNlbFN0YXJ0ID0gblNlbFN0YXJ0OworICBmYS5uU2VsRW5kID0gblNlbEVuZDsKKyAgcEZvcm1GaWxsZXItPkdldEFjdGlvbkRhdGEocHJpdmF0ZURhdGEucFBhZ2VWaWV3LCBDUERGX0FBY3Rpb246OktleVN0cm9rZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmEpOworICBwRm9ybUZpbGxlci0+U2F2ZVN0YXRlKHByaXZhdGVEYXRhLnBQYWdlVmlldyk7CisKKyAgQ1BERlNES19Bbm5vdDo6T2JzZXJ2ZWRQdHIgcE9ic2VydmVkKHByaXZhdGVEYXRhLnBXaWRnZXQpOworICBib29sIGFjdGlvbl9zdGF0dXMgPSBwcml2YXRlRGF0YS5wV2lkZ2V0LT5PbkFBY3Rpb24oCisgICAgICBDUERGX0FBY3Rpb246OktleVN0cm9rZSwgZmEsIHByaXZhdGVEYXRhLnBQYWdlVmlldyk7CisKKyAgaWYgKCFwT2JzZXJ2ZWQgfHwgIUlzVmFsaWRBbm5vdChwcml2YXRlRGF0YS5wUGFnZVZpZXcsIHByaXZhdGVEYXRhLnBXaWRnZXQpKQorICAgIHJldHVybiB7dHJ1ZSwgdHJ1ZX07CisKKyAgaWYgKCFhY3Rpb25fc3RhdHVzKQorICAgIHJldHVybiB7dHJ1ZSwgZmFsc2V9OworCisgIGJvb2wgYkV4aXQgPSBmYWxzZTsKKyAgaWYgKG5BZ2UgIT0gcHJpdmF0ZURhdGEucFdpZGdldC0+R2V0QXBwZWFyYW5jZUFnZSgpKSB7CisgICAgQ1BXTF9XbmQqIHBXbmQgPSBwRm9ybUZpbGxlci0+UmVzZXRQREZXaW5kb3coCisgICAgICAgIHByaXZhdGVEYXRhLnBQYWdlVmlldywgblZhbHVlQWdlID09IHByaXZhdGVEYXRhLnBXaWRnZXQtPkdldFZhbHVlQWdlKCkpOworICAgIGlmICghcFduZCkKKyAgICAgIHJldHVybiB7dHJ1ZSwgdHJ1ZX07CisgICAgcHJpdmF0ZURhdGEgPSAqc3RhdGljX2Nhc3Q8Q0ZGTF9Qcml2YXRlRGF0YSo+KHBXbmQtPkdldEF0dGFjaGVkRGF0YSgpKTsKKyAgICBiRXhpdCA9IHRydWU7CisgIH0KKyAgaWYgKGZhLmJSQykgeworICAgIHBGb3JtRmlsbGVyLT5TZXRBY3Rpb25EYXRhKHByaXZhdGVEYXRhLnBQYWdlVmlldywgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmEpOworICB9IGVsc2UgeworICAgIHBGb3JtRmlsbGVyLT5SZXN0b3JlU3RhdGUocHJpdmF0ZURhdGEucFBhZ2VWaWV3KTsKKyAgfQorICBpZiAocEZvcm1GaWxsRW52LT5HZXRGb2N1c0Fubm90KCkgPT0gcHJpdmF0ZURhdGEucFdpZGdldCkKKyAgICByZXR1cm4ge2ZhbHNlLCBiRXhpdH07CisKKyAgcEZvcm1GaWxsZXItPkNvbW1pdERhdGEocHJpdmF0ZURhdGEucFBhZ2VWaWV3LCBuRmxhZyk7CisgIHJldHVybiB7ZmFsc2UsIHRydWV9OwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfaW50ZXJhY3RpdmVmb3JtZmlsbGVyLmggYi9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9pbnRlcmFjdGl2ZWZvcm1maWxsZXIuaAppbmRleCA5MGZkOThjLi4wMTkyNzUyIDEwMDY0NAotLS0gYS9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9pbnRlcmFjdGl2ZWZvcm1maWxsZXIuaAorKysgYi9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9pbnRlcmFjdGl2ZWZvcm1maWxsZXIuaApAQCAtOSwxMCArOSwxMiBAQAogCiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgogCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19hbm5vdC5oIgogI2luY2x1ZGUgImZwZGZzZGsvZnNka19kZWZpbmUuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfRWRpdC5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfZWRpdC5oIgogCiBjbGFzcyBDRkZMX0Zvcm1GaWxsZXI7CiBjbGFzcyBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ7CkBAIC03OSw1NyArODEsNDIgQEAKICAgYm9vbCBPbktpbGxGb2N1cyhDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciogcEFubm90LCB1aW50MzJfdCBuRmxhZyk7CiAKICAgQ0ZGTF9Gb3JtRmlsbGVyKiBHZXRGb3JtRmlsbGVyKENQREZTREtfQW5ub3QqIHBBbm5vdCwgYm9vbCBiUmVnaXN0ZXIpOwotICB2b2lkIFJlbW92ZUZvcm1GaWxsZXIoQ1BERlNES19Bbm5vdCogcEFubm90KTsKKworICBXaWRlU3RyaW5nIEdldFNlbGVjdGVkVGV4dChDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICB2b2lkIFJlcGxhY2VTZWxlY3Rpb24oQ1BERlNES19Bbm5vdCogcEFubm90LCBjb25zdCBXaWRlU3RyaW5nJiB0ZXh0KTsKIAogICBzdGF0aWMgYm9vbCBJc1Zpc2libGUoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpOwogICBzdGF0aWMgYm9vbCBJc1JlYWRPbmx5KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KTsKICAgc3RhdGljIGJvb2wgSXNGaWxsaW5nQWxsb3dlZChDUERGU0RLX1dpZGdldCogcFdpZGdldCk7CiAgIHN0YXRpYyBib29sIElzVmFsaWRBbm5vdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CiAKLSAgdm9pZCBPbktleVN0cm9rZUNvbW1pdChDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciogcFdpZGdldCwKKyAgYm9vbCBPbktleVN0cm9rZUNvbW1pdChDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciogcFdpZGdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYlJDLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJFeGl0LAogICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFnKTsKLSAgdm9pZCBPblZhbGlkYXRlKENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyKiBwV2lkZ2V0LAorICBib29sIE9uVmFsaWRhdGUoQ1BERlNES19Bbm5vdDo6T2JzZXJ2ZWRQdHIqIHBBbm5vdCwKICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgIGJvb2wmIGJSQywKLSAgICAgICAgICAgICAgICAgIGJvb2wmIGJFeGl0LAogICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWcpOwotCi0gIHZvaWQgT25DYWxjdWxhdGUoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsCisgIHZvaWQgT25DYWxjdWxhdGUoQ1BERlNES19Bbm5vdDo6T2JzZXJ2ZWRQdHIqIHBBbm5vdCwKICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCi0gICAgICAgICAgICAgICAgICAgYm9vbCYgYkV4aXQsCiAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWcpOwotICB2b2lkIE9uRm9ybWF0KENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LAorICB2b2lkIE9uRm9ybWF0KENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyKiBwQW5ub3QsCiAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAotICAgICAgICAgICAgICAgIGJvb2wmIGJFeGl0LAogICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFnKTsKLSAgdm9pZCBPbkJ1dHRvblVwKENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyKiBwV2lkZ2V0LAorICBib29sIE9uQnV0dG9uVXAoQ1BERlNES19Bbm5vdDo6T2JzZXJ2ZWRQdHIqIHBBbm5vdCwKICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgIGJvb2wmIGJSZXNldCwKLSAgICAgICAgICAgICAgICAgIGJvb2wmIGJFeGl0LAogICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWcpOwogI2lmZGVmIFBERl9FTkFCTEVfWEZBCi0gIHZvaWQgT25DbGljayhDUERGU0RLX1dpZGdldCogcFdpZGdldCwKKyAgYm9vbCBPbkNsaWNrKENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyKiBwQW5ub3QsCiAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCi0gICAgICAgICAgICAgICBib29sJiBiUmVzZXQsCi0gICAgICAgICAgICAgICBib29sJiBiRXhpdCwKICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFnKTsKLSAgdm9pZCBPbkZ1bGwoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQsCisgIGJvb2wgT25GdWxsKENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyKiBwQW5ub3QsCiAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKLSAgICAgICAgICAgICAgYm9vbCYgYlJlc2V0LAotICAgICAgICAgICAgICBib29sJiBiRXhpdCwKICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWcpOwotICB2b2lkIE9uUHJlT3BlbihDUERGU0RLX1dpZGdldCogcFdpZGdldCwKKyAgYm9vbCBPblByZU9wZW4oQ1BERlNES19Bbm5vdDo6T2JzZXJ2ZWRQdHIqIHBBbm5vdCwKICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAotICAgICAgICAgICAgICAgICBib29sJiBiUmVzZXQsCi0gICAgICAgICAgICAgICAgIGJvb2wmIGJFeGl0LAogICAgICAgICAgICAgICAgICB1aW50MzJfdCBuRmxhZyk7Ci0gIHZvaWQgT25Qb3N0T3BlbihDUERGU0RLX1dpZGdldCogcFdpZGdldCwKKyAgYm9vbCBPblBvc3RPcGVuKENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyKiBwQW5ub3QsCiAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCi0gICAgICAgICAgICAgICAgICBib29sJiBiUmVzZXQsCi0gICAgICAgICAgICAgICAgICBib29sJiBiRXhpdCwKICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFnKTsKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIApAQCAtMTM4LDQwICsxMjUsMzkgQEAKICAgICAgIHN0ZDo6bWFwPENQREZTREtfQW5ub3QqLCBzdGQ6OnVuaXF1ZV9wdHI8Q0ZGTF9Gb3JtRmlsbGVyPj47CiAKICAgLy8gSVBXTF9GaWxsZXJfTm90aWZ5OgotICB2b2lkIFF1ZXJ5V2hlcmVQb3B1cCh2b2lkKiBwUHJpdmF0ZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQb3B1cE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBvcHVwTWF4LAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuUmV0LAotICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZlBvcHVwUmV0KSBvdmVycmlkZTsKLSAgdm9pZCBPbkJlZm9yZUtleVN0cm9rZSh2b2lkKiBwUHJpdmF0ZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TZWxTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblNlbEVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJLZXlEb3duLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJSQywKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiRXhpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuRmxhZykgb3ZlcnJpZGU7CisgIHZvaWQgUXVlcnlXaGVyZVBvcHVwKENQV0xfV25kOjpQcml2YXRlRGF0YSogcEF0dGFjaGVkLAorICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmUG9wdXBNaW4sCisgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZQb3B1cE1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogYkJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZQb3B1cFJldCkgb3ZlcnJpZGU7CisgIC8vIFJldHVybnMge2JSQywgYkV4aXR9LgorICBzdGQ6OnBhaXI8Ym9vbCwgYm9vbD4gT25CZWZvcmVLZXlTdHJva2UoQ1BXTF9XbmQ6OlByaXZhdGVEYXRhKiBwQXR0YWNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiBzdHJDaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU2VsU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblNlbEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYktleURvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuRmxhZykgb3ZlcnJpZGU7CiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKLSAgdm9pZCBPblBvcHVwUHJlT3Blbih2b2lkKiBwUHJpdmF0ZURhdGEsIGJvb2wmIGJFeGl0LCB1aW50MzJfdCBuRmxhZykgb3ZlcnJpZGU7Ci0gIHZvaWQgT25Qb3B1cFBvc3RPcGVuKHZvaWQqIHBQcml2YXRlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYkV4aXQsCisgIGJvb2wgT25Qb3B1cFByZU9wZW4oQ1BXTF9XbmQ6OlByaXZhdGVEYXRhKiBwQXR0YWNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOworICBib29sIE9uUG9wdXBQb3N0T3BlbihDUFdMX1duZDo6UHJpdmF0ZURhdGEqIHBBdHRhY2hlZCwKICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOwogICB2b2lkIFNldEZvY3VzQW5ub3RUYWIoQ1BERlNES19Bbm5vdCogcFdpZGdldCwgYm9vbCBiU2FtZUZpZWxkLCBib29sIGJOZXh0KTsKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKICAgdm9pZCBVblJlZ2lzdGVyRm9ybUZpbGxlcihDUERGU0RLX0Fubm90KiBwQW5ub3QpOwogCi0gIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogY29uc3QgbV9wRm9ybUZpbGxFbnY7CisgIFVub3duZWRQdHI8Q1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50PiBjb25zdCBtX3BGb3JtRmlsbEVudjsKICAgQ0ZGTF9XaWRnZXQyRmlsbGVyIG1fTWFwczsKICAgYm9vbCBtX2JOb3RpZnlpbmc7CiB9OwogCi1jbGFzcyBDRkZMX1ByaXZhdGVEYXRhIHsKK2NsYXNzIENGRkxfUHJpdmF0ZURhdGEgOiBwdWJsaWMgQ1BXTF9XbmQ6OlByaXZhdGVEYXRhIHsKICBwdWJsaWM6CiAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0OwogICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXc7Ci0gIGludCBuV2lkZ2V0QWdlOwotICBpbnQgblZhbHVlQWdlOworICB1aW50MzJfdCBuV2lkZ2V0QXBwZWFyYW5jZUFnZTsKKyAgdWludDMyX3QgbldpZGdldFZhbHVlQWdlOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0ZPUk1GSUxMRVJfQ0ZGTF9JTlRFUkFDVElWRUZPUk1GSUxMRVJfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2xpc3Rib3guY3BwIGIvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfbGlzdGJveC5jcHAKaW5kZXggNTU2ZTBlMS4uZTYyOGU1OSAxMDA2NDQKLS0tIGEvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfbGlzdGJveC5jcHAKKysrIGIvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfbGlzdGJveC5jcHAKQEAgLTksNDYgKzksMzYgQEAKICNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfZm9ybWZpbGxlbnZpcm9ubWVudC5oIgogI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka193aWRnZXQuaCIKICNpbmNsdWRlICJmcGRmc2RrL2Zvcm1maWxsZXIvY2JhX2ZvbnRtYXAuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9mb3JtZmlsbGVyLmgiCiAjaW5jbHVkZSAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfaW50ZXJhY3RpdmVmb3JtZmlsbGVyLmgiCiAjaW5jbHVkZSAiZnBkZnNkay9mc2RrX2NvbW1vbi5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9MaXN0Qm94LmgiCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF9saXN0X2JveC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAogI2RlZmluZSBGRkxfREVGQVVMVExJU1RCT1hGT05UU0laRSAxMi4wZgogCiBDRkZMX0xpc3RCb3g6OkNGRkxfTGlzdEJveChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBBcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwV2lkZ2V0KQotICAgIDogQ0ZGTF9Gb3JtRmlsbGVyKHBBcHAsIHBXaWRnZXQpIHt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCkKKyAgICA6IENGRkxfVGV4dE9iamVjdChwQXBwLCBwV2lkZ2V0KSB7fQogCiBDRkZMX0xpc3RCb3g6On5DRkZMX0xpc3RCb3goKSB7fQogCi1QV0xfQ1JFQVRFUEFSQU0gQ0ZGTF9MaXN0Qm94OjpHZXRDcmVhdGVQYXJhbSgpIHsKLSAgUFdMX0NSRUFURVBBUkFNIGNwID0gQ0ZGTF9Gb3JtRmlsbGVyOjpHZXRDcmVhdGVQYXJhbSgpOwotCitDUFdMX1duZDo6Q3JlYXRlUGFyYW1zIENGRkxfTGlzdEJveDo6R2V0Q3JlYXRlUGFyYW0oKSB7CisgIENQV0xfV25kOjpDcmVhdGVQYXJhbXMgY3AgPSBDRkZMX1RleHRPYmplY3Q6OkdldENyZWF0ZVBhcmFtKCk7CiAgIHVpbnQzMl90IGR3RmllbGRGbGFnID0gbV9wV2lkZ2V0LT5HZXRGaWVsZEZsYWdzKCk7Ci0KLSAgaWYgKGR3RmllbGRGbGFnICYgRklFTERGTEFHX01VTFRJU0VMRUNUKSB7CisgIGlmIChkd0ZpZWxkRmxhZyAmIEZJRUxERkxBR19NVUxUSVNFTEVDVCkKICAgICBjcC5kd0ZsYWdzIHw9IFBMQlNfTVVMVElQTEVTRUw7Ci0gIH0KIAogICBjcC5kd0ZsYWdzIHw9IFBXU19WU0NST0xMOwogCiAgIGlmIChjcC5kd0ZsYWdzICYgUFdTX0FVVE9GT05UU0laRSkKICAgICBjcC5mRm9udFNpemUgPSBGRkxfREVGQVVMVExJU1RCT1hGT05UU0laRTsKIAotICBpZiAoIW1fcEZvbnRNYXApIHsKLSAgICBtX3BGb250TWFwID0gcGRmaXVtOjpNYWtlVW5pcXVlPENCQV9Gb250TWFwPigKLSAgICAgICAgbV9wV2lkZ2V0LCBtX3BGb3JtRmlsbEVudi0+R2V0U3lzSGFuZGxlcigpKTsKLSAgfQotICBjcC5wRm9udE1hcCA9IG1fcEZvbnRNYXAuZ2V0KCk7Ci0KKyAgY3AucEZvbnRNYXAgPSBNYXliZUNyZWF0ZUZvbnRNYXAoKTsKICAgcmV0dXJuIGNwOwogfQogCi1DUFdMX1duZCogQ0ZGTF9MaXN0Qm94OjpOZXdQREZXaW5kb3coY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKLSAgQ1BXTF9MaXN0Qm94KiBwV25kID0gbmV3IENQV0xfTGlzdEJveCgpOworQ1BXTF9XbmQqIENGRkxfTGlzdEJveDo6TmV3UERGV2luZG93KGNvbnN0IENQV0xfV25kOjpDcmVhdGVQYXJhbXMmIGNwKSB7CisgIGF1dG8qIHBXbmQgPSBuZXcgQ1BXTF9MaXN0Qm94KCk7CiAgIHBXbmQtPkF0dGFjaEZGTERhdGEodGhpcyk7CiAgIHBXbmQtPkNyZWF0ZShjcCk7CiAgIHBXbmQtPlNldEZpbGxlck5vdGlmeShtX3BGb3JtRmlsbEVudi0+R2V0SW50ZXJhY3RpdmVGb3JtRmlsbGVyKCkpOwpAQCAtODcsNyArNzcsNyBAQAogYm9vbCBDRkZMX0xpc3RCb3g6Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5DaGFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuRmxhZ3MpIHsKLSAgcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7CisgIHJldHVybiBDRkZMX1RleHRPYmplY3Q6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOwogfQogCiBib29sIENGRkxfTGlzdEJveDo6SXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKQEAgLTEyNyw5ICsxMTcsMTggQEAKICAgfSBlbHNlIHsKICAgICBtX3BXaWRnZXQtPlNldE9wdGlvblNlbGVjdGlvbihwTGlzdEJveC0+R2V0Q3VyU2VsKCksIHRydWUsIGZhbHNlKTsKICAgfQorICBDUERGU0RLX1dpZGdldDo6T2JzZXJ2ZWRQdHIgb2JzZXJ2ZWRfd2lkZ2V0KG1fcFdpZGdldC5HZXQoKSk7CisgIENGRkxfTGlzdEJveDo6T2JzZXJ2ZWRQdHIgb2JzZXJ2ZWRfdGhpcyh0aGlzKTsKKwogICBtX3BXaWRnZXQtPlNldFRvcFZpc2libGVJbmRleChuTmV3VG9wSW5kZXgpOworICBpZiAoIW9ic2VydmVkX3dpZGdldCkKKyAgICByZXR1cm47CiAgIG1fcFdpZGdldC0+UmVzZXRGaWVsZEFwcGVhcmFuY2UodHJ1ZSk7CisgIGlmICghb2JzZXJ2ZWRfd2lkZ2V0KQorICAgIHJldHVybjsKICAgbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOworICBpZiAoIW9ic2VydmVkX3dpZGdldCB8fCAhb2JzZXJ2ZWRfdGhpcykKKyAgICByZXR1cm47CiAgIFNldENoYW5nZU1hcmsoKTsKIH0KIApAQCAtMTg3LDI0ICsxODYsMyBAQAogICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiBtX1N0YXRlKQogICAgIHBMaXN0Qm94LT5TZWxlY3QoaXRlbSk7CiB9Ci0KLUNQV0xfV25kKiBDRkZMX0xpc3RCb3g6OlJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJlc3RvcmVWYWx1ZSkgewotICBpZiAoYlJlc3RvcmVWYWx1ZSkKLSAgICBTYXZlU3RhdGUocFBhZ2VWaWV3KTsKLQotICBEZXN0cm95UERGV2luZG93KHBQYWdlVmlldyk7Ci0KLSAgQ1BXTF9XbmQqIHBSZXQgPSBudWxscHRyOwotCi0gIGlmIChiUmVzdG9yZVZhbHVlKSB7Ci0gICAgUmVzdG9yZVN0YXRlKHBQYWdlVmlldyk7Ci0gICAgcFJldCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKTsKLSAgfSBlbHNlIHsKLSAgICBwUmV0ID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgdHJ1ZSk7Ci0gIH0KLQotICBtX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7Ci0KLSAgcmV0dXJuIHBSZXQ7Ci19CmRpZmYgLS1naXQgYS9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9saXN0Ym94LmggYi9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9saXN0Ym94LmgKaW5kZXggNjA5ZjJjNC4uMDE0ODY1ZCAxMDA2NDQKLS0tIGEvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfbGlzdGJveC5oCisrKyBiL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2xpc3Rib3guaApAQCAtNywyMyArNywyMSBAQAogI2lmbmRlZiBGUERGU0RLX0ZPUk1GSUxMRVJfQ0ZGTF9MSVNUQk9YX0hfCiAjZGVmaW5lIEZQREZTREtfRk9STUZJTExFUl9DRkZMX0xJU1RCT1hfSF8KIAotI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfZm9ybWZpbGxlci5oIgorI2luY2x1ZGUgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX3RleHRvYmplY3QuaCIKIAogY2xhc3MgQ0JBX0ZvbnRNYXA7CiAKLWNsYXNzIENGRkxfTGlzdEJveCA6IHB1YmxpYyBDRkZMX0Zvcm1GaWxsZXIgeworY2xhc3MgQ0ZGTF9MaXN0Qm94IDogcHVibGljIENGRkxfVGV4dE9iamVjdCB7CiAgcHVibGljOgotICBDRkZMX0xpc3RCb3goQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwV2lkZ2V0KTsKKyAgQ0ZGTF9MaXN0Qm94KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpOwogICB+Q0ZGTF9MaXN0Qm94KCkgb3ZlcnJpZGU7CiAKLSAgLy8gQ0ZGTF9Gb3JtRmlsbGVyCi0gIFBXTF9DUkVBVEVQQVJBTSBHZXRDcmVhdGVQYXJhbSgpIG92ZXJyaWRlOwotICBDUFdMX1duZCogTmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKKyAgLy8gQ0ZGTF9UZXh0T2JqZWN0OgorICBDUFdMX1duZDo6Q3JlYXRlUGFyYW1zIEdldENyZWF0ZVBhcmFtKCkgb3ZlcnJpZGU7CisgIENQV0xfV25kKiBOZXdQREZXaW5kb3coY29uc3QgQ1BXTF9XbmQ6OkNyZWF0ZVBhcmFtcyYgY3ApIG92ZXJyaWRlOwogICBib29sIE9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIHVpbnQzMl90IG5DaGFyLCB1aW50MzJfdCBuRmxhZ3MpIG92ZXJyaWRlOwogICBib29sIElzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKICAgdm9pZCBTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIG92ZXJyaWRlOwpAQCAtMzIsMTEgKzMwLDggQEAKICAgICAgICAgICAgICAgICAgICAgIFBERlNES19GaWVsZEFjdGlvbiYgZmEpIG92ZXJyaWRlOwogICB2b2lkIFNhdmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIG92ZXJyaWRlOwogICB2b2lkIFJlc3RvcmVTdGF0ZShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIG92ZXJyaWRlOwotICBDUFdMX1duZCogUmVzZXRQREZXaW5kb3coQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmVzdG9yZVZhbHVlKSBvdmVycmlkZTsKIAogIHByaXZhdGU6Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDQkFfRm9udE1hcD4gbV9wRm9udE1hcDsKICAgc3RkOjpzZXQ8aW50PiBtX09yaWdpblNlbGVjdGlvbnM7CiAgIHN0ZDo6dmVjdG9yPGludD4gbV9TdGF0ZTsKIH07CmRpZmYgLS1naXQgYS9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9wdXNoYnV0dG9uLmNwcCBiL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX3B1c2hidXR0b24uY3BwCmluZGV4IDliNDEyMWEuLjczMTBkYTYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX3B1c2hidXR0b24uY3BwCisrKyBiL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX3B1c2hidXR0b24uY3BwCkBAIC03LDMxICs3LDE2IEBACiAjaW5jbHVkZSAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfcHVzaGJ1dHRvbi5oIgogCiAjaW5jbHVkZSAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfZm9ybWZpbGxlci5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmgiCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF9zcGVjaWFsX2J1dHRvbi5oIgogCiBDRkZMX1B1c2hCdXR0b246OkNGRkxfUHVzaEJ1dHRvbihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBBcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QpCi0gICAgOiBDRkZMX0J1dHRvbihwQXBwLCBwQW5ub3QpIHt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCkKKyAgICA6IENGRkxfQnV0dG9uKHBBcHAsIHBXaWRnZXQpIHt9CiAKIENGRkxfUHVzaEJ1dHRvbjo6fkNGRkxfUHVzaEJ1dHRvbigpIHt9CiAKLUNQV0xfV25kKiBDRkZMX1B1c2hCdXR0b246Ok5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgewotICBDUFdMX1B1c2hCdXR0b24qIHBXbmQgPSBuZXcgQ1BXTF9QdXNoQnV0dG9uKCk7CitDUFdMX1duZCogQ0ZGTF9QdXNoQnV0dG9uOjpOZXdQREZXaW5kb3coY29uc3QgQ1BXTF9XbmQ6OkNyZWF0ZVBhcmFtcyYgY3ApIHsKKyAgYXV0byogcFduZCA9IG5ldyBDUFdMX1B1c2hCdXR0b24oKTsKICAgcFduZC0+Q3JlYXRlKGNwKTsKLQogICByZXR1cm4gcFduZDsKIH0KLQotYm9vbCBDRkZMX1B1c2hCdXR0b246Ok9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5DaGFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuRmxhZ3MpIHsKLSAgcmV0dXJuIENGRkxfRm9ybUZpbGxlcjo6T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7Ci19Ci0KLXZvaWQgQ0ZGTF9QdXNoQnV0dG9uOjpPbkRyYXcoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgewotICBDRkZMX0J1dHRvbjo6T25EcmF3KHBQYWdlVmlldywgcEFubm90LCBwRGV2aWNlLCBwVXNlcjJEZXZpY2UpOwotfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfcHVzaGJ1dHRvbi5oIGIvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfcHVzaGJ1dHRvbi5oCmluZGV4IDFkNTA1OTUuLjdlZTA3NjcgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX3B1c2hidXR0b24uaAorKysgYi9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9wdXNoYnV0dG9uLmgKQEAgLTcsMjEgKzcsMTUgQEAKICNpZm5kZWYgRlBERlNES19GT1JNRklMTEVSX0NGRkxfUFVTSEJVVFRPTl9IXwogI2RlZmluZSBGUERGU0RLX0ZPUk1GSUxMRVJfQ0ZGTF9QVVNIQlVUVE9OX0hfCiAKLSNpbmNsdWRlICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9mb3JtZmlsbGVyLmgiCisjaW5jbHVkZSAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfYnV0dG9uLmgiCiAKIGNsYXNzIENGRkxfUHVzaEJ1dHRvbiA6IHB1YmxpYyBDRkZMX0J1dHRvbiB7CiAgcHVibGljOgotICBDRkZMX1B1c2hCdXR0b24oQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX0Fubm90KiBwQW5ub3QpOworICBDRkZMX1B1c2hCdXR0b24oQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX1dpZGdldCogcFdpZGdldCk7CiAgIH5DRkZMX1B1c2hCdXR0b24oKSBvdmVycmlkZTsKIAotICAvLyBDRkZMX0J1dHRvbgotICBDUFdMX1duZCogTmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKLSAgYm9vbCBPbkNoYXIoQ1BERlNES19Bbm5vdCogcEFubm90LCB1aW50MzJfdCBuQ2hhciwgdWludDMyX3QgbkZsYWdzKSBvdmVycmlkZTsKLSAgdm9pZCBPbkRyYXcoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAotICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCi0gICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgb3ZlcnJpZGU7CisgIC8vIENGRkxfQnV0dG9uOgorICBDUFdMX1duZCogTmV3UERGV2luZG93KGNvbnN0IENQV0xfV25kOjpDcmVhdGVQYXJhbXMmIGNwKSBvdmVycmlkZTsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19GT1JNRklMTEVSX0NGRkxfUFVTSEJVVFRPTl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfcmFkaW9idXR0b24uY3BwIGIvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfcmFkaW9idXR0b24uY3BwCmluZGV4IGU3ODE2MGUuLjczYWM0NGQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX3JhZGlvYnV0dG9uLmNwcAorKysgYi9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9yYWRpb2J1dHRvbi5jcHAKQEAgLTksMjIgKzksMTkgQEAKICNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfZm9ybWZpbGxlbnZpcm9ubWVudC5oIgogI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka193aWRnZXQuaCIKICNpbmNsdWRlICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9mb3JtZmlsbGVyLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX1NwZWNpYWxCdXR0b24uaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX3NwZWNpYWxfYnV0dG9uLmgiCiAjaW5jbHVkZSAicHVibGljL2ZwZGZfZndsZXZlbnQuaCIKIAogQ0ZGTF9SYWRpb0J1dHRvbjo6Q0ZGTF9SYWRpb0J1dHRvbihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBBcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBXaWRnZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KQogICAgIDogQ0ZGTF9CdXR0b24ocEFwcCwgcFdpZGdldCkge30KIAogQ0ZGTF9SYWRpb0J1dHRvbjo6fkNGRkxfUmFkaW9CdXR0b24oKSB7fQogCi1DUFdMX1duZCogQ0ZGTF9SYWRpb0J1dHRvbjo6TmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgewotICBDUFdMX1JhZGlvQnV0dG9uKiBwV25kID0gbmV3IENQV0xfUmFkaW9CdXR0b24oKTsKK0NQV0xfV25kKiBDRkZMX1JhZGlvQnV0dG9uOjpOZXdQREZXaW5kb3coY29uc3QgQ1BXTF9XbmQ6OkNyZWF0ZVBhcmFtcyYgY3ApIHsKKyAgYXV0byogcFduZCA9IG5ldyBDUFdMX1JhZGlvQnV0dG9uKCk7CiAgIHBXbmQtPkNyZWF0ZShjcCk7Ci0KICAgcFduZC0+U2V0Q2hlY2sobV9wV2lkZ2V0LT5Jc0NoZWNrZWQoKSk7Ci0KICAgcmV0dXJuIHBXbmQ7CiB9CiAKQEAgLTQ5LDIwICs0NiwxOCBAQAogICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcEFubm90LT5HZXRQYWdlVmlldygpOwogICAgICAgQVNTRVJUKHBQYWdlVmlldyk7CiAKLSAgICAgIGJvb2wgYlJlc2V0ID0gZmFsc2U7Ci0gICAgICBib29sIGJFeGl0ID0gZmFsc2U7Ci0gICAgICBDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciBwT2JzZXJ2ZWQobV9wV2lkZ2V0KTsKLSAgICAgIG1fcEZvcm1GaWxsRW52LT5HZXRJbnRlcmFjdGl2ZUZvcm1GaWxsZXIoKS0+T25CdXR0b25VcCgKLSAgICAgICAgICAmcE9ic2VydmVkLCBwUGFnZVZpZXcsIGJSZXNldCwgYkV4aXQsIG5GbGFncyk7Ci0gICAgICBpZiAoIXBPYnNlcnZlZCB8fCBiUmVzZXQgfHwgYkV4aXQpCisgICAgICBDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciBwT2JzZXJ2ZWQobV9wV2lkZ2V0LkdldCgpKTsKKyAgICAgIGlmIChtX3BGb3JtRmlsbEVudi0+R2V0SW50ZXJhY3RpdmVGb3JtRmlsbGVyKCktPk9uQnV0dG9uVXAoCisgICAgICAgICAgICAgICZwT2JzZXJ2ZWQsIHBQYWdlVmlldywgbkZsYWdzKSB8fAorICAgICAgICAgICFwT2JzZXJ2ZWQpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CiAKICAgICAgIENGRkxfRm9ybUZpbGxlcjo6T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7Ci0gICAgICBpZiAoQ1BXTF9SYWRpb0J1dHRvbiogcFduZCA9Ci0gICAgICAgICAgICAgIChDUFdMX1JhZGlvQnV0dG9uKilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCB0cnVlKSkKKyAgICAgIENQV0xfUmFkaW9CdXR0b24qIHBXbmQgPSBHZXRSYWRpb0J1dHRvbihwUGFnZVZpZXcsIHRydWUpOworICAgICAgaWYgKHBXbmQpCiAgICAgICAgIHBXbmQtPlNldENoZWNrKHRydWUpOwotICAgICAgQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFncyk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIHJldHVybiBDb21taXREYXRhKHBQYWdlVmlldywgbkZsYWdzKTsKICAgICB9CiAgICAgZGVmYXVsdDoKICAgICAgIHJldHVybiBDRkZMX0Zvcm1GaWxsZXI6Ok9uQ2hhcihwQW5ub3QsIG5DaGFyLCBuRmxhZ3MpOwpAQCAtNzUsNDUgKzcwLDUxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CiAgIENGRkxfQnV0dG9uOjpPbkxCdXR0b25VcChwUGFnZVZpZXcsIHBBbm5vdCwgbkZsYWdzLCBwb2ludCk7CiAKLSAgaWYgKElzVmFsaWQoKSkgewotICAgIGlmIChDUFdMX1JhZGlvQnV0dG9uKiBwV25kID0KLSAgICAgICAgICAgIChDUFdMX1JhZGlvQnV0dG9uKilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCB0cnVlKSkKLSAgICAgIHBXbmQtPlNldENoZWNrKHRydWUpOworICBpZiAoIUlzVmFsaWQoKSkKKyAgICByZXR1cm4gdHJ1ZTsKIAotICAgIGlmICghQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFncykpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KKyAgQ1BXTF9SYWRpb0J1dHRvbiogcFduZCA9IEdldFJhZGlvQnV0dG9uKHBQYWdlVmlldywgdHJ1ZSk7CisgIGlmIChwV25kKQorICAgIHBXbmQtPlNldENoZWNrKHRydWUpOwogCi0gIHJldHVybiB0cnVlOworICByZXR1cm4gQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFncyk7CiB9CiAKIGJvb2wgQ0ZGTF9SYWRpb0J1dHRvbjo6SXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKLSAgaWYgKENQV0xfUmFkaW9CdXR0b24qIHBXbmQgPQotICAgICAgICAgIChDUFdMX1JhZGlvQnV0dG9uKilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpIHsKLSAgICByZXR1cm4gcFduZC0+SXNDaGVja2VkKCkgIT0gbV9wV2lkZ2V0LT5Jc0NoZWNrZWQoKTsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKKyAgQ1BXTF9SYWRpb0J1dHRvbiogcFduZCA9IEdldFJhZGlvQnV0dG9uKHBQYWdlVmlldywgZmFsc2UpOworICByZXR1cm4gcFduZCAmJiBwV25kLT5Jc0NoZWNrZWQoKSAhPSBtX3BXaWRnZXQtPklzQ2hlY2tlZCgpOwogfQogCiB2b2lkIENGRkxfUmFkaW9CdXR0b246OlNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgewotICBpZiAoQ1BXTF9SYWRpb0J1dHRvbiogcFduZCA9Ci0gICAgICAgICAgKENQV0xfUmFkaW9CdXR0b24qKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkgewotICAgIGJvb2wgYk5ld0NoZWNrZWQgPSBwV25kLT5Jc0NoZWNrZWQoKTsKKyAgQ1BXTF9SYWRpb0J1dHRvbiogcFduZCA9IEdldFJhZGlvQnV0dG9uKHBQYWdlVmlldywgZmFsc2UpOworICBpZiAoIXBXbmQpCisgICAgcmV0dXJuOwogCi0gICAgaWYgKGJOZXdDaGVja2VkKSB7Ci0gICAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gbV9wV2lkZ2V0LT5HZXRGb3JtRmllbGQoKTsKLSAgICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBwRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaSA8IHN6OyBpKyspIHsKLSAgICAgICAgaWYgKENQREZfRm9ybUNvbnRyb2wqIHBDdHJsID0gcEZpZWxkLT5HZXRDb250cm9sKGkpKSB7Ci0gICAgICAgICAgaWYgKHBDdHJsLT5Jc0NoZWNrZWQoKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQorICBib29sIGJOZXdDaGVja2VkID0gcFduZC0+SXNDaGVja2VkKCk7CisKKyAgaWYgKGJOZXdDaGVja2VkKSB7CisgICAgQ1BERl9Gb3JtRmllbGQqIHBGaWVsZCA9IG1fcFdpZGdldC0+R2V0Rm9ybUZpZWxkKCk7CisgICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IHBGaWVsZC0+Q291bnRDb250cm9scygpOyBpIDwgc3o7IGkrKykgeworICAgICAgaWYgKENQREZfRm9ybUNvbnRyb2wqIHBDdHJsID0gcEZpZWxkLT5HZXRDb250cm9sKGkpKSB7CisgICAgICAgIGlmIChwQ3RybC0+SXNDaGVja2VkKCkpIHsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KLQotICAgIG1fcFdpZGdldC0+U2V0Q2hlY2soYk5ld0NoZWNrZWQsIGZhbHNlKTsKLSAgICBtX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7Ci0gICAgU2V0Q2hhbmdlTWFyaygpOwogICB9CisgIENQREZTREtfV2lkZ2V0OjpPYnNlcnZlZFB0ciBvYnNlcnZlZF93aWRnZXQobV9wV2lkZ2V0LkdldCgpKTsKKyAgQ0ZGTF9SYWRpb0J1dHRvbjo6T2JzZXJ2ZWRQdHIgb2JzZXJ2ZWRfdGhpcyh0aGlzKTsKKworICBtX3BXaWRnZXQtPlNldENoZWNrKGJOZXdDaGVja2VkLCBmYWxzZSk7CisgIGlmICghb2JzZXJ2ZWRfd2lkZ2V0KQorICAgIHJldHVybjsKKyAgbV9wV2lkZ2V0LT5VcGRhdGVGaWVsZCgpOworICBpZiAoIW9ic2VydmVkX3dpZGdldCB8fCAhb2JzZXJ2ZWRfdGhpcykKKyAgICByZXR1cm47CisgIFNldENoYW5nZU1hcmsoKTsKK30KKworQ1BXTF9SYWRpb0J1dHRvbiogQ0ZGTF9SYWRpb0J1dHRvbjo6R2V0UmFkaW9CdXR0b24oQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTmV3KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxDUFdMX1JhZGlvQnV0dG9uKj4oR2V0UERGV2luZG93KHBQYWdlVmlldywgYk5ldykpOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfcmFkaW9idXR0b24uaCBiL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX3JhZGlvYnV0dG9uLmgKaW5kZXggMTBhYzM3ZC4uMjgzODI1NCAxMDA2NDQKLS0tIGEvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfcmFkaW9idXR0b24uaAorKysgYi9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9yYWRpb2J1dHRvbi5oCkBAIC03LDE2ICs3LDE3IEBACiAjaWZuZGVmIEZQREZTREtfRk9STUZJTExFUl9DRkZMX1JBRElPQlVUVE9OX0hfCiAjZGVmaW5lIEZQREZTREtfRk9STUZJTExFUl9DRkZMX1JBRElPQlVUVE9OX0hfCiAKLSNpbmNsdWRlICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9mb3JtZmlsbGVyLmgiCisjaW5jbHVkZSAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfYnV0dG9uLmgiCisKK2NsYXNzIENQV0xfUmFkaW9CdXR0b247CiAKIGNsYXNzIENGRkxfUmFkaW9CdXR0b24gOiBwdWJsaWMgQ0ZGTF9CdXR0b24gewogIHB1YmxpYzoKLSAgQ0ZGTF9SYWRpb0J1dHRvbihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisgIENGRkxfUmFkaW9CdXR0b24oQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwQXBwLCBDUERGU0RLX1dpZGdldCogcFdpZGdldCk7CiAgIH5DRkZMX1JhZGlvQnV0dG9uKCkgb3ZlcnJpZGU7CiAKLSAgLy8gQ0ZGTF9CdXR0b24KLSAgQ1BXTF9XbmQqIE5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLAotICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgb3ZlcnJpZGU7CisgIC8vIENGRkxfQnV0dG9uOgorICBDUFdMX1duZCogTmV3UERGV2luZG93KGNvbnN0IENQV0xfV25kOjpDcmVhdGVQYXJhbXMmIGNwKSBvdmVycmlkZTsKICAgYm9vbCBPbktleURvd24oQ1BERlNES19Bbm5vdCogcEFubm90LAogICAgICAgICAgICAgICAgICB1aW50MzJfdCBuS2V5Q29kZSwKICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWdzKSBvdmVycmlkZTsKQEAgLTI3LDYgKzI4LDkgQEAKICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7CiAgIGJvb2wgSXNEYXRhQ2hhbmdlZChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIG92ZXJyaWRlOwogICB2b2lkIFNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBDUFdMX1JhZGlvQnV0dG9uKiBHZXRSYWRpb0J1dHRvbihDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wgYk5ldyk7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfRk9STUZJTExFUl9DRkZMX1JBRElPQlVUVE9OX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF90ZXh0ZmllbGQuY3BwIGIvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfdGV4dGZpZWxkLmNwcAppbmRleCA5MWRiMDk1Li5hZDhkMjdjIDEwMDY0NAotLS0gYS9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF90ZXh0ZmllbGQuY3BwCisrKyBiL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX3RleHRmaWVsZC5jcHAKQEAgLTEzLDggKzEzLDggQEAKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKIENGRkxfVGV4dEZpZWxkOjpDRkZMX1RleHRGaWVsZChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBBcHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcEFubm90KQotICAgIDogQ0ZGTF9Gb3JtRmlsbGVyKHBBcHAsIHBBbm5vdCkge30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCkKKyAgICA6IENGRkxfVGV4dE9iamVjdChwQXBwLCBwV2lkZ2V0KSB7fQogCiBDRkZMX1RleHRGaWVsZDo6fkNGRkxfVGV4dEZpZWxkKCkgewogICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbV9NYXBzKQpAQCAtMjYsMzYgKzI2LDI3IEBACiAgIERlc3Ryb3lXaW5kb3dzKCk7CiB9CiAKLVBXTF9DUkVBVEVQQVJBTSBDRkZMX1RleHRGaWVsZDo6R2V0Q3JlYXRlUGFyYW0oKSB7Ci0gIFBXTF9DUkVBVEVQQVJBTSBjcCA9IENGRkxfRm9ybUZpbGxlcjo6R2V0Q3JlYXRlUGFyYW0oKTsKLQorQ1BXTF9XbmQ6OkNyZWF0ZVBhcmFtcyBDRkZMX1RleHRGaWVsZDo6R2V0Q3JlYXRlUGFyYW0oKSB7CisgIENQV0xfV25kOjpDcmVhdGVQYXJhbXMgY3AgPSBDRkZMX1RleHRPYmplY3Q6OkdldENyZWF0ZVBhcmFtKCk7CiAgIGludCBuRmxhZ3MgPSBtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKTsKLQotICBpZiAobkZsYWdzICYgRklFTERGTEFHX1BBU1NXT1JEKSB7CisgIGlmIChuRmxhZ3MgJiBGSUVMREZMQUdfUEFTU1dPUkQpCiAgICAgY3AuZHdGbGFncyB8PSBQRVNfUEFTU1dPUkQ7Ci0gIH0KIAogICBpZiAobkZsYWdzICYgRklFTERGTEFHX01VTFRJTElORSkgewogICAgIGNwLmR3RmxhZ3MgfD0gUEVTX01VTFRJTElORSB8IFBFU19BVVRPUkVUVVJOIHwgUEVTX1RPUDsKLQotICAgIGlmICghKG5GbGFncyAmIEZJRUxERkxBR19ET05PVFNDUk9MTCkpIHsKKyAgICBpZiAoIShuRmxhZ3MgJiBGSUVMREZMQUdfRE9OT1RTQ1JPTEwpKQogICAgICAgY3AuZHdGbGFncyB8PSBQV1NfVlNDUk9MTCB8IFBFU19BVVRPU0NST0xMOwotICAgIH0KICAgfSBlbHNlIHsKICAgICBjcC5kd0ZsYWdzIHw9IFBFU19DRU5URVI7Ci0KLSAgICBpZiAoIShuRmxhZ3MgJiBGSUVMREZMQUdfRE9OT1RTQ1JPTEwpKSB7CisgICAgaWYgKCEobkZsYWdzICYgRklFTERGTEFHX0RPTk9UU0NST0xMKSkKICAgICAgIGNwLmR3RmxhZ3MgfD0gUEVTX0FVVE9TQ1JPTEw7Ci0gICAgfQogICB9CiAKLSAgaWYgKG5GbGFncyAmIEZJRUxERkxBR19DT01CKSB7CisgIGlmIChuRmxhZ3MgJiBGSUVMREZMQUdfQ09NQikKICAgICBjcC5kd0ZsYWdzIHw9IFBFU19DSEFSQVJSQVk7Ci0gIH0KIAotICBpZiAobkZsYWdzICYgRklFTERGTEFHX1JJQ0hURVhUKSB7CisgIGlmIChuRmxhZ3MgJiBGSUVMREZMQUdfUklDSFRFWFQpCiAgICAgY3AuZHdGbGFncyB8PSBQRVNfUklDSDsKLSAgfQogCiAgIGNwLmR3RmxhZ3MgfD0gUEVTX1VORE87CiAKQEAgLTcxLDI2ICs2MiwxOSBAQAogICAgICAgY3AuZHdGbGFncyB8PSBQRVNfUklHSFQ7CiAgICAgICBicmVhazsKICAgfQotCi0gIGlmICghbV9wRm9udE1hcCkgewotICAgIG1fcEZvbnRNYXAgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0JBX0ZvbnRNYXA+KAotICAgICAgICBtX3BXaWRnZXQsIG1fcEZvcm1GaWxsRW52LT5HZXRTeXNIYW5kbGVyKCkpOwotICB9Ci0gIGNwLnBGb250TWFwID0gbV9wRm9udE1hcC5nZXQoKTsKKyAgY3AucEZvbnRNYXAgPSBNYXliZUNyZWF0ZUZvbnRNYXAoKTsKICAgY3AucEZvY3VzSGFuZGxlciA9IHRoaXM7Ci0KICAgcmV0dXJuIGNwOwogfQogCi1DUFdMX1duZCogQ0ZGTF9UZXh0RmllbGQ6Ok5ld1BERldpbmRvdyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7Ci0gIENQV0xfRWRpdCogcFduZCA9IG5ldyBDUFdMX0VkaXQoKTsKK0NQV0xfV25kKiBDRkZMX1RleHRGaWVsZDo6TmV3UERGV2luZG93KGNvbnN0IENQV0xfV25kOjpDcmVhdGVQYXJhbXMmIGNwKSB7CisgIGF1dG8qIHBXbmQgPSBuZXcgQ1BXTF9FZGl0KCk7CiAgIHBXbmQtPkF0dGFjaEZGTERhdGEodGhpcyk7CiAgIHBXbmQtPkNyZWF0ZShjcCk7CiAgIHBXbmQtPlNldEZpbGxlck5vdGlmeShtX3BGb3JtRmlsbEVudi0+R2V0SW50ZXJhY3RpdmVGb3JtRmlsbGVyKCkpOwogCiAgIGludDMyX3Qgbk1heExlbiA9IG1fcFdpZGdldC0+R2V0TWF4TGVuKCk7Ci0gIENGWF9XaWRlU3RyaW5nIHN3VmFsdWUgPSBtX3BXaWRnZXQtPkdldFZhbHVlKCk7CisgIFdpZGVTdHJpbmcgc3dWYWx1ZSA9IG1fcFdpZGdldC0+R2V0VmFsdWUoKTsKIAogICBpZiAobk1heExlbiA+IDApIHsKICAgICBpZiAocFduZC0+SGFzRmxhZyhQRVNfQ0hBUkFSUkFZKSkgewpAQCAtMTA5LDI2ICs5MywyOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5DaGFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFncykgewogICBzd2l0Y2ggKG5DaGFyKSB7Ci0gICAgY2FzZSBGV0xfVktFWV9SZXR1cm46Ci0gICAgICBpZiAoIShtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19NVUxUSUxJTkUpKSB7Ci0gICAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KHRydWUpOwotICAgICAgICBBU1NFUlQocFBhZ2VWaWV3KTsKLSAgICAgICAgbV9iVmFsaWQgPSAhbV9iVmFsaWQ7Ci0gICAgICAgIG1fcEZvcm1GaWxsRW52LT5JbnZhbGlkYXRlKHBBbm5vdC0+R2V0VW5kZXJseWluZ1BhZ2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFubm90LT5HZXRSZWN0KCkuVG9GeFJlY3QoKSk7CisgICAgY2FzZSBGV0xfVktFWV9SZXR1cm46IHsKKyAgICAgIGlmIChtX3BXaWRnZXQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19NVUxUSUxJTkUpCisgICAgICAgIGJyZWFrOwogCi0gICAgICAgIGlmIChtX2JWYWxpZCkgewotICAgICAgICAgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIHRydWUpKQotICAgICAgICAgICAgcFduZC0+U2V0Rm9jdXMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFncykpIHsKLSAgICAgICAgICAgIERlc3Ryb3lQREZXaW5kb3cocFBhZ2VWaWV3KTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KKyAgICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEdldEN1clBhZ2VWaWV3KHRydWUpOworICAgICAgQVNTRVJUKHBQYWdlVmlldyk7CisgICAgICBtX2JWYWxpZCA9ICFtX2JWYWxpZDsKKyAgICAgIG1fcEZvcm1GaWxsRW52LT5JbnZhbGlkYXRlKHBBbm5vdC0+R2V0VW5kZXJseWluZ1BhZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBBbm5vdC0+R2V0UmVjdCgpLkdldE91dGVyUmVjdCgpKTsKKworICAgICAgaWYgKG1fYlZhbGlkKSB7CisgICAgICAgIGlmIChDUFdMX1duZCogcFduZCA9IEdldFBERldpbmRvdyhwUGFnZVZpZXcsIHRydWUpKQorICAgICAgICAgIHBXbmQtPlNldEZvY3VzKCk7CisgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgYnJlYWs7CisKKyAgICAgIGlmICghQ29tbWl0RGF0YShwUGFnZVZpZXcsIG5GbGFncykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgRGVzdHJveVBERldpbmRvdyhwUGFnZVZpZXcpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogICAgIGNhc2UgRldMX1ZLRVlfRXNjYXBlOiB7CiAgICAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBHZXRDdXJQYWdlVmlldyh0cnVlKTsKICAgICAgIEFTU0VSVChwUGFnZVZpZXcpOwpAQCAtMTM3LDI2ICsxMjMsMzUgQEAKICAgICB9CiAgIH0KIAotICByZXR1cm4gQ0ZGTF9Gb3JtRmlsbGVyOjpPbkNoYXIocEFubm90LCBuQ2hhciwgbkZsYWdzKTsKKyAgcmV0dXJuIENGRkxfVGV4dE9iamVjdDo6T25DaGFyKHBBbm5vdCwgbkNoYXIsIG5GbGFncyk7CiB9CiAKIGJvb2wgQ0ZGTF9UZXh0RmllbGQ6OklzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSB7Ci0gIGlmIChDUFdMX0VkaXQqIHBFZGl0ID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKQotICAgIHJldHVybiBwRWRpdC0+R2V0VGV4dCgpICE9IG1fcFdpZGdldC0+R2V0VmFsdWUoKTsKLQotICByZXR1cm4gZmFsc2U7CisgIENQV0xfRWRpdCogcEVkaXQgPSBHZXRFZGl0KHBQYWdlVmlldywgZmFsc2UpOworICByZXR1cm4gcEVkaXQgJiYgcEVkaXQtPkdldFRleHQoKSAhPSBtX3BXaWRnZXQtPkdldFZhbHVlKCk7CiB9CiAKIHZvaWQgQ0ZGTF9UZXh0RmllbGQ6OlNhdmVEYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgewotICBpZiAoQ1BXTF9FZGl0KiBwV25kID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc09sZFZhbHVlID0gbV9wV2lkZ2V0LT5HZXRWYWx1ZSgpOwotICAgIENGWF9XaWRlU3RyaW5nIHNOZXdWYWx1ZSA9IHBXbmQtPkdldFRleHQoKTsKKyAgQ1BXTF9FZGl0KiBwV25kID0gR2V0RWRpdChwUGFnZVZpZXcsIGZhbHNlKTsKKyAgaWYgKCFwV25kKQorICAgIHJldHVybjsKIAotICAgIG1fcFdpZGdldC0+U2V0VmFsdWUoc05ld1ZhbHVlLCBmYWxzZSk7Ci0gICAgbV9wV2lkZ2V0LT5SZXNldEZpZWxkQXBwZWFyYW5jZSh0cnVlKTsKLSAgICBtX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7Ci0gICAgU2V0Q2hhbmdlTWFyaygpOwotICB9CisgIFdpZGVTdHJpbmcgc09sZFZhbHVlID0gbV9wV2lkZ2V0LT5HZXRWYWx1ZSgpOworICBXaWRlU3RyaW5nIHNOZXdWYWx1ZSA9IHBXbmQtPkdldFRleHQoKTsKKworICBDUERGU0RLX1dpZGdldDo6T2JzZXJ2ZWRQdHIgb2JzZXJ2ZWRfd2lkZ2V0KG1fcFdpZGdldC5HZXQoKSk7CisgIENGRkxfVGV4dEZpZWxkOjpPYnNlcnZlZFB0ciBvYnNlcnZlZF90aGlzKHRoaXMpOworCisgIG1fcFdpZGdldC0+U2V0VmFsdWUoc05ld1ZhbHVlLCBmYWxzZSk7CisgIGlmICghb2JzZXJ2ZWRfd2lkZ2V0KQorICAgIHJldHVybjsKKyAgbV9wV2lkZ2V0LT5SZXNldEZpZWxkQXBwZWFyYW5jZSh0cnVlKTsKKyAgaWYgKCFvYnNlcnZlZF93aWRnZXQpCisgICAgcmV0dXJuOworICBtX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7CisgIGlmICghb2JzZXJ2ZWRfd2lkZ2V0IHx8ICFvYnNlcnZlZF90aGlzKQorICAgIHJldHVybjsKKyAgU2V0Q2hhbmdlTWFyaygpOwogfQogCiB2b2lkIENGRkxfVGV4dEZpZWxkOjpHZXRBY3Rpb25EYXRhKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKQEAgLTE2NCw3ICsxNTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24mIGZhKSB7CiAgIHN3aXRjaCAodHlwZSkgewogICAgIGNhc2UgQ1BERl9BQWN0aW9uOjpLZXlTdHJva2U6Ci0gICAgICBpZiAoQ1BXTF9FZGl0KiBwV25kID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKSB7CisgICAgICBpZiAoQ1BXTF9FZGl0KiBwV25kID0gR2V0RWRpdChwUGFnZVZpZXcsIGZhbHNlKSkgewogICAgICAgICBmYS5iRmllbGRGdWxsID0gcFduZC0+SXNUZXh0RnVsbCgpOwogCiAgICAgICAgIGZhLnNWYWx1ZSA9IHBXbmQtPkdldFRleHQoKTsKQEAgLTE3Niw3ICsxNzEsNyBAQAogICAgICAgfQogICAgICAgYnJlYWs7CiAgICAgY2FzZSBDUERGX0FBY3Rpb246OlZhbGlkYXRlOgotICAgICAgaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkgeworICAgICAgaWYgKENQV0xfRWRpdCogcFduZCA9IEdldEVkaXQocFBhZ2VWaWV3LCBmYWxzZSkpIHsKICAgICAgICAgZmEuc1ZhbHVlID0gcFduZC0+R2V0VGV4dCgpOwogICAgICAgfQogICAgICAgYnJlYWs7CkBAIC0xOTQsOSArMTg5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUERGU0RLX0ZpZWxkQWN0aW9uJiBmYSkgewogICBzd2l0Y2ggKHR5cGUpIHsKICAgICBjYXNlIENQREZfQUFjdGlvbjo6S2V5U3Ryb2tlOgotICAgICAgaWYgKENQV0xfRWRpdCogcEVkaXQgPSAoQ1BXTF9FZGl0KilHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCBmYWxzZSkpIHsKKyAgICAgIGlmIChDUFdMX0VkaXQqIHBFZGl0ID0gR2V0RWRpdChwUGFnZVZpZXcsIGZhbHNlKSkgewogICAgICAgICBwRWRpdC0+U2V0Rm9jdXMoKTsKLSAgICAgICAgcEVkaXQtPlNldFNlbChmYS5uU2VsU3RhcnQsIGZhLm5TZWxFbmQpOworICAgICAgICBwRWRpdC0+U2V0U2VsZWN0aW9uKGZhLm5TZWxTdGFydCwgZmEublNlbEVuZCk7CiAgICAgICAgIHBFZGl0LT5SZXBsYWNlU2VsKGZhLnNDaGFuZ2UpOwogICAgICAgfQogICAgICAgYnJlYWs7CkBAIC0yMjMsNjQgKzIxOCw0MyBAQAogdm9pZCBDRkZMX1RleHRGaWVsZDo6U2F2ZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgewogICBBU1NFUlQocFBhZ2VWaWV3KTsKIAotICBpZiAoQ1BXTF9FZGl0KiBwV25kID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpKSB7Ci0gICAgcFduZC0+R2V0U2VsKG1fU3RhdGUublN0YXJ0LCBtX1N0YXRlLm5FbmQpOwotICAgIG1fU3RhdGUuc1ZhbHVlID0gcFduZC0+R2V0VGV4dCgpOwotICB9CisgIENQV0xfRWRpdCogcFduZCA9IEdldEVkaXQocFBhZ2VWaWV3LCBmYWxzZSk7CisgIGlmICghcFduZCkKKyAgICByZXR1cm47CisKKyAgcFduZC0+R2V0U2VsZWN0aW9uKG1fU3RhdGUublN0YXJ0LCBtX1N0YXRlLm5FbmQpOworICBtX1N0YXRlLnNWYWx1ZSA9IHBXbmQtPkdldFRleHQoKTsKIH0KIAogdm9pZCBDRkZMX1RleHRGaWVsZDo6UmVzdG9yZVN0YXRlKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldykgewogICBBU1NFUlQocFBhZ2VWaWV3KTsKIAotICBpZiAoQ1BXTF9FZGl0KiBwV25kID0gKENQV0xfRWRpdCopR2V0UERGV2luZG93KHBQYWdlVmlldywgdHJ1ZSkpIHsKLSAgICBwV25kLT5TZXRUZXh0KG1fU3RhdGUuc1ZhbHVlKTsKLSAgICBwV25kLT5TZXRTZWwobV9TdGF0ZS5uU3RhcnQsIG1fU3RhdGUubkVuZCk7Ci0gIH0KLX0KKyAgQ1BXTF9FZGl0KiBwV25kID0gR2V0RWRpdChwUGFnZVZpZXcsIHRydWUpOworICBpZiAoIXBXbmQpCisgICAgcmV0dXJuOwogCi1DUFdMX1duZCogQ0ZGTF9UZXh0RmllbGQ6OlJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmVzdG9yZVZhbHVlKSB7Ci0gIGlmIChiUmVzdG9yZVZhbHVlKQotICAgIFNhdmVTdGF0ZShwUGFnZVZpZXcpOwotCi0gIERlc3Ryb3lQREZXaW5kb3cocFBhZ2VWaWV3KTsKLQotICBDUFdMX1duZCogcFJldCA9IG51bGxwdHI7Ci0KLSAgaWYgKGJSZXN0b3JlVmFsdWUpIHsKLSAgICBSZXN0b3JlU3RhdGUocFBhZ2VWaWV3KTsKLSAgICBwUmV0ID0gR2V0UERGV2luZG93KHBQYWdlVmlldywgZmFsc2UpOwotICB9IGVsc2UgewotICAgIHBSZXQgPSBHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCB0cnVlKTsKLSAgfQotCi0gIG1fcFdpZGdldC0+VXBkYXRlRmllbGQoKTsKLQotICByZXR1cm4gcFJldDsKKyAgcFduZC0+U2V0VGV4dChtX1N0YXRlLnNWYWx1ZSk7CisgIHBXbmQtPlNldFNlbGVjdGlvbihtX1N0YXRlLm5TdGFydCwgbV9TdGF0ZS5uRW5kKTsKIH0KIAogI2lmZGVmIFBERl9FTkFCTEVfWEZBCiBib29sIENGRkxfVGV4dEZpZWxkOjpJc0ZpZWxkRnVsbChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIHsKLSAgaWYgKENQV0xfRWRpdCogcFduZCA9IChDUFdMX0VkaXQqKUdldFBERldpbmRvdyhwUGFnZVZpZXcsIGZhbHNlKSkgewotICAgIHJldHVybiBwV25kLT5Jc1RleHRGdWxsKCk7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7CisgIENQV0xfRWRpdCogcFduZCA9IEdldEVkaXQocFBhZ2VWaWV3LCBmYWxzZSk7CisgIHJldHVybiBwV25kICYmIHBXbmQtPklzVGV4dEZ1bGwoKTsKIH0KICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotdm9pZCBDRkZMX1RleHRGaWVsZDo6T25TZXRGb2N1cyhDUFdMX1duZCogcFduZCkgewotICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOwotICBpZiAocFduZC0+R2V0Q2xhc3NOYW1lKCkgPT0gUFdMX0NMQVNTTkFNRV9FRElUKSB7Ci0gICAgQ1BXTF9FZGl0KiBwRWRpdCA9IChDUFdMX0VkaXQqKXBXbmQ7Ci0gICAgcEVkaXQtPlNldENoYXJTZXQoRlhGT05UX0dCMjMxMl9DSEFSU0VUKTsKLSAgICBwRWRpdC0+U2V0Q29kZVBhZ2UoOTM2KTsKK3ZvaWQgQ0ZGTF9UZXh0RmllbGQ6Ok9uU2V0Rm9jdXMoQ1BXTF9FZGl0KiBwRWRpdCkgeworICBwRWRpdC0+U2V0Q2hhclNldChGWF9DSEFSU0VUX0NoaW5lc2VTaW1wbGlmaWVkKTsKKyAgcEVkaXQtPlNldFJlYWR5VG9JbnB1dCgpOwogCi0gICAgcEVkaXQtPlNldFJlYWR5VG9JbnB1dCgpOwotICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dCA9IHBFZGl0LT5HZXRUZXh0KCk7Ci0gICAgaW50IG5DaGFyYWN0ZXJzID0gd3NUZXh0LkdldExlbmd0aCgpOwotICAgIENGWF9CeXRlU3RyaW5nIGJzVVRGVGV4dCA9IHdzVGV4dC5VVEYxNkxFX0VuY29kZSgpOwotICAgIHVuc2lnbmVkIHNob3J0KiBwQnVmZmVyID0gKHVuc2lnbmVkIHNob3J0Kilic1VURlRleHQuY19zdHIoKTsKLSAgICBtX3BGb3JtRmlsbEVudi0+T25TZXRGaWVsZElucHV0Rm9jdXMocEJ1ZmZlciwgbkNoYXJhY3RlcnMsIHRydWUpOwotICB9CisgIFdpZGVTdHJpbmcgd3NUZXh0ID0gcEVkaXQtPkdldFRleHQoKTsKKyAgaW50IG5DaGFyYWN0ZXJzID0gd3NUZXh0LkdldExlbmd0aCgpOworICBCeXRlU3RyaW5nIGJzVVRGVGV4dCA9IHdzVGV4dC5VVEYxNkxFX0VuY29kZSgpOworICBhdXRvKiBwQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBzaG9ydCo+KGJzVVRGVGV4dC5jX3N0cigpKTsKKyAgbV9wRm9ybUZpbGxFbnYtPk9uU2V0RmllbGRJbnB1dEZvY3VzKHBCdWZmZXIsIG5DaGFyYWN0ZXJzLCB0cnVlKTsKK30KKworQ1BXTF9FZGl0KiBDRkZMX1RleHRGaWVsZDo6R2V0RWRpdChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsIGJvb2wgYk5ldykgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1BXTF9FZGl0Kj4oR2V0UERGV2luZG93KHBQYWdlVmlldywgYk5ldykpOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfdGV4dGZpZWxkLmggYi9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF90ZXh0ZmllbGQuaAppbmRleCAyOTU3OWY3Li40OWZmYzBmIDEwMDY0NAotLS0gYS9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF90ZXh0ZmllbGQuaAorKysgYi9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF90ZXh0ZmllbGQuaApAQCAtNywzMyArNywzMiBAQAogI2lmbmRlZiBGUERGU0RLX0ZPUk1GSUxMRVJfQ0ZGTF9URVhURklFTERfSF8KICNkZWZpbmUgRlBERlNES19GT1JNRklMTEVSX0NGRkxfVEVYVEZJRUxEX0hfCiAKLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9mb3JtZmlsbGVyLmgiCisjaW5jbHVkZSAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfdGV4dG9iamVjdC5oIgogCiAjZGVmaW5lIEJGX0FMSUdOX0xFRlQgMAogI2RlZmluZSBCRl9BTElHTl9NSURETEUgMQogI2RlZmluZSBCRl9BTElHTl9SSUdIVCAyCiAKIGNsYXNzIENCQV9Gb250TWFwOworY2xhc3MgQ1BXTF9FZGl0OwogCiBzdHJ1Y3QgRkZMX1RleHRGaWVsZFN0YXRlIHsKICAgRkZMX1RleHRGaWVsZFN0YXRlKCkgOiBuU3RhcnQoMCksIG5FbmQoMCkge30KIAogICBpbnQgblN0YXJ0OwogICBpbnQgbkVuZDsKLSAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlOworICBXaWRlU3RyaW5nIHNWYWx1ZTsKIH07CiAKLWNsYXNzIENGRkxfVGV4dEZpZWxkIDogcHVibGljIENGRkxfRm9ybUZpbGxlciwgcHVibGljIElQV0xfRm9jdXNIYW5kbGVyIHsKK2NsYXNzIENGRkxfVGV4dEZpZWxkIDogcHVibGljIENGRkxfVGV4dE9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIENQV0xfV25kOjpGb2N1c0hhbmRsZXJJZmFjZSB7CiAgcHVibGljOgotICBDRkZMX1RleHRGaWVsZChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfQW5ub3QqIHBBbm5vdCk7CisgIENGRkxfVGV4dEZpZWxkKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEFwcCwgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpOwogICB+Q0ZGTF9UZXh0RmllbGQoKSBvdmVycmlkZTsKIAotICAvLyBDRkZMX0Zvcm1GaWxsZXI6Ci0gIFBXTF9DUkVBVEVQQVJBTSBHZXRDcmVhdGVQYXJhbSgpIG92ZXJyaWRlOwotICBDUFdMX1duZCogTmV3UERGV2luZG93KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKKyAgLy8gQ0ZGTF9UZXh0T2JqZWN0OgorICBDUFdMX1duZDo6Q3JlYXRlUGFyYW1zIEdldENyZWF0ZVBhcmFtKCkgb3ZlcnJpZGU7CisgIENQV0xfV25kKiBOZXdQREZXaW5kb3coY29uc3QgQ1BXTF9XbmQ6OkNyZWF0ZVBhcmFtcyYgY3ApIG92ZXJyaWRlOwogICBib29sIE9uQ2hhcihDUERGU0RLX0Fubm90KiBwQW5ub3QsIHVpbnQzMl90IG5DaGFyLCB1aW50MzJfdCBuRmxhZ3MpIG92ZXJyaWRlOwogICBib29sIElzRGF0YUNoYW5nZWQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKICAgdm9pZCBTYXZlRGF0YShDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcpIG92ZXJyaWRlOwpAQCAtNDgsMTkgKzQ3LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQREZTREtfRmllbGRBY3Rpb24mIGZhTmV3KSBvdmVycmlkZTsKICAgdm9pZCBTYXZlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKICAgdm9pZCBSZXN0b3JlU3RhdGUoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKLSAgQ1BXTF9XbmQqIFJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJlc3RvcmVWYWx1ZSkgb3ZlcnJpZGU7Ci0KLSAgLy8gSVBXTF9Gb2N1c0hhbmRsZXI6Ci0gIHZvaWQgT25TZXRGb2N1cyhDUFdMX1duZCogcFduZCkgb3ZlcnJpZGU7Ci0KICNpZmRlZiBQREZfRU5BQkxFX1hGQQotICAvLyBDRkZMX0Zvcm1GaWxsZXI6CiAgIGJvb2wgSXNGaWVsZEZ1bGwoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3KSBvdmVycmlkZTsKLSNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyNlbmRpZgorCisgIC8vIENQV0xfV25kOjpGb2N1c0hhbmRsZXJJZmFjZToKKyAgdm9pZCBPblNldEZvY3VzKENQV0xfRWRpdCogcEVkaXQpIG92ZXJyaWRlOwogCiAgcHJpdmF0ZToKLSAgc3RkOjp1bmlxdWVfcHRyPENCQV9Gb250TWFwPiBtX3BGb250TWFwOworICBDUFdMX0VkaXQqIEdldEVkaXQoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LCBib29sIGJOZXcpOworCiAgIEZGTF9UZXh0RmllbGRTdGF0ZSBtX1N0YXRlOwogfTsKIApkaWZmIC0tZ2l0IGEvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfdGV4dG9iamVjdC5jcHAgYi9mcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF90ZXh0b2JqZWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjJmNWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfdGV4dG9iamVjdC5jcHAKQEAgLTAsMCArMSwzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfdGV4dG9iamVjdC5oIgorCitDUFdMX1duZCogQ0ZGTF9UZXh0T2JqZWN0OjpSZXNldFBERldpbmRvdyhDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZXN0b3JlVmFsdWUpIHsKKyAgaWYgKGJSZXN0b3JlVmFsdWUpCisgICAgU2F2ZVN0YXRlKHBQYWdlVmlldyk7CisKKyAgRGVzdHJveVBERldpbmRvdyhwUGFnZVZpZXcpOworICBpZiAoYlJlc3RvcmVWYWx1ZSkKKyAgICBSZXN0b3JlU3RhdGUocFBhZ2VWaWV3KTsKKworICBDUFdMX1duZDo6T2JzZXJ2ZWRQdHIgcFJldChHZXRQREZXaW5kb3cocFBhZ2VWaWV3LCAhYlJlc3RvcmVWYWx1ZSkpOworICBtX3BXaWRnZXQtPlVwZGF0ZUZpZWxkKCk7ICAvLyBNYXkgaW52b2tlIEpTLCBpbnZhbGlkYXRpbmcgfHBSZXR8LgorICByZXR1cm4gcFJldC5HZXQoKTsKK30KKworQ0ZGTF9UZXh0T2JqZWN0OjpDRkZMX1RleHRPYmplY3QoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwQXBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQpCisgICAgOiBDRkZMX0Zvcm1GaWxsZXIocEFwcCwgcFdpZGdldCkge30KKworQ0ZGTF9UZXh0T2JqZWN0Ojp+Q0ZGTF9UZXh0T2JqZWN0KCkgeworICAvLyBEZXN0cm95IHZpZXcgY2xhc3NlcyBiZWZvcmUgdGhpcyBvYmplY3QncyBtZW1iZXJzIGFyZSBkZXN0cm95ZWQgc2luY2UKKyAgLy8gdGhlIHZpZXcgY2xhc3NlcyBoYXZlIHBvaW50ZXJzIHRvIG1fcEZvbnRNYXAgdGhhdCB3b3VsZCBiZSBsZWZ0IGRhbmdsaW5nLgorICBEZXN0cm95V2luZG93cygpOworfQorCitDQkFfRm9udE1hcCogQ0ZGTF9UZXh0T2JqZWN0OjpNYXliZUNyZWF0ZUZvbnRNYXAoKSB7CisgIGlmICghbV9wRm9udE1hcCkgeworICAgIG1fcEZvbnRNYXAgPQorICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0JBX0ZvbnRNYXA+KG1fcFdpZGdldC5HZXQoKSwgR2V0U3lzdGVtSGFuZGxlcigpKTsKKyAgfQorICByZXR1cm4gbV9wRm9udE1hcC5nZXQoKTsKK30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX3RleHRvYmplY3QuaCBiL2ZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX3RleHRvYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2IzYzFiCi0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfdGV4dG9iamVjdC5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGUERGU0RLX0ZPUk1GSUxMRVJfQ0ZGTF9URVhUT0JKRUNUX0hfCisjZGVmaW5lIEZQREZTREtfRk9STUZJTExFUl9DRkZMX1RFWFRPQkpFQ1RfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2Zvcm1maWxsZXIuaCIKKworLy8gQ2xhc3MgdG8gaW1wbGVtZW50IGNvbW1vbiBmdW5jdGlvbmFsaXR5IGZvciBDRkZMX0Zvcm1GaWxsZXIgc3ViLWNsYXNzZXMgd2l0aAorLy8gdGV4dCBmaWVsZHMuCitjbGFzcyBDRkZMX1RleHRPYmplY3QgOiBwdWJsaWMgQ0ZGTF9Gb3JtRmlsbGVyIHsKKyBwdWJsaWM6CisgIC8vIENGRkxfRm9ybUZpbGxlcjoKKyAgQ1BXTF9XbmQqIFJlc2V0UERGV2luZG93KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJlc3RvcmVWYWx1ZSkgb3ZlcnJpZGU7CisKKyBwcm90ZWN0ZWQ6CisgIENGRkxfVGV4dE9iamVjdChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBBcHAsIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0KTsKKyAgfkNGRkxfVGV4dE9iamVjdCgpIG92ZXJyaWRlOworCisgIENCQV9Gb250TWFwKiBNYXliZUNyZWF0ZUZvbnRNYXAoKTsKKworIHByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxDQkFfRm9udE1hcD4gbV9wRm9udE1hcDsKK307CisKKyNlbmRpZiAgLy8gRlBERlNES19GT1JNRklMTEVSX0NGRkxfVEVYVE9CSkVDVF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9mcGRmX2RhdGFhdmFpbC5jcHAgYi9mcGRmc2RrL2ZwZGZfZGF0YWF2YWlsLmNwcAppbmRleCBiMWJjMWUzLi5iMWExMzRkIDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZwZGZfZGF0YWF2YWlsLmNwcAorKysgYi9mcGRmc2RrL2ZwZGZfZGF0YWF2YWlsLmNwcApAQCAtMTEsNyArMTEsOCBAQAogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RhdGFfYXZhaWwuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJlYW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKICNpbmNsdWRlICJmcGRmc2RrL2ZzZGtfZGVmaW5lLmgiCiAjaW5jbHVkZSAicHVibGljL2ZwZGZfZm9ybWZpbGwuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCkBAIC00MiwxNSArNDMsMTUgQEAKIAogbmFtZXNwYWNlIHsKIAotY2xhc3MgQ0ZQREZfRmlsZUF2YWlsV3JhcCA6IHB1YmxpYyBDUERGX0RhdGFBdmFpbDo6RmlsZUF2YWlsIHsKK2NsYXNzIEZQREZfRmlsZUF2YWlsQ29udGV4dCA6IHB1YmxpYyBDUERGX0RhdGFBdmFpbDo6RmlsZUF2YWlsIHsKICBwdWJsaWM6Ci0gIENGUERGX0ZpbGVBdmFpbFdyYXAoKSA6IG1fcGZpbGVBdmFpbChudWxscHRyKSB7fQotICB+Q0ZQREZfRmlsZUF2YWlsV3JhcCgpIG92ZXJyaWRlIHt9CisgIEZQREZfRmlsZUF2YWlsQ29udGV4dCgpIDogbV9wZmlsZUF2YWlsKG51bGxwdHIpIHt9CisgIH5GUERGX0ZpbGVBdmFpbENvbnRleHQoKSBvdmVycmlkZSB7fQogCiAgIHZvaWQgU2V0KEZYX0ZJTEVBVkFJTCogcGZpbGVBdmFpbCkgeyBtX3BmaWxlQXZhaWwgPSBwZmlsZUF2YWlsOyB9CiAKICAgLy8gQ1BERl9EYXRhQXZhaWw6OkZpbGVBdmFpbDoKLSAgYm9vbCBJc0RhdGFBdmFpbChGWF9GSUxFU0laRSBvZmZzZXQsIHVpbnQzMl90IHNpemUpIG92ZXJyaWRlIHsKKyAgYm9vbCBJc0RhdGFBdmFpbChGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZSB7CiAgICAgcmV0dXJuICEhbV9wZmlsZUF2YWlsLT5Jc0RhdGFBdmFpbChtX3BmaWxlQXZhaWwsIG9mZnNldCwgc2l6ZSk7CiAgIH0KIApAQCAtNTgsMTIgKzU5LDEyIEBACiAgIEZYX0ZJTEVBVkFJTCogbV9wZmlsZUF2YWlsOwogfTsKIAotY2xhc3MgQ0ZQREZfRmlsZUFjY2Vzc1dyYXAgOiBwdWJsaWMgSUZYX1NlZWthYmxlUmVhZFN0cmVhbSB7CitjbGFzcyBGUERGX0ZpbGVBY2Nlc3NDb250ZXh0IDogcHVibGljIElGWF9TZWVrYWJsZVJlYWRTdHJlYW0gewogIHB1YmxpYzoKLSAgc3RhdGljIENGWF9SZXRhaW5QdHI8Q0ZQREZfRmlsZUFjY2Vzc1dyYXA+IENyZWF0ZSgpIHsKLSAgICByZXR1cm4gQ0ZYX1JldGFpblB0cjxDRlBERl9GaWxlQWNjZXNzV3JhcD4obmV3IENGUERGX0ZpbGVBY2Nlc3NXcmFwKCkpOwotICB9Ci0gIH5DRlBERl9GaWxlQWNjZXNzV3JhcCgpIG92ZXJyaWRlIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgorICBmcmllbmQgUmV0YWluUHRyPFQ+IHBkZml1bTo6TWFrZVJldGFpbihBcmdzJiYuLi4gYXJncyk7CisKKyAgfkZQREZfRmlsZUFjY2Vzc0NvbnRleHQoKSBvdmVycmlkZSB7fQogCiAgIHZvaWQgU2V0KEZQREZfRklMRUFDQ0VTUyogcEZpbGUpIHsgbV9wRmlsZUFjY2VzcyA9IHBGaWxlOyB9CiAKQEAgLTc2LDExOSArNzcsMTE1IEBACiAgIH0KIAogIHByaXZhdGU6Ci0gIENGUERGX0ZpbGVBY2Nlc3NXcmFwKCkgOiBtX3BGaWxlQWNjZXNzKG51bGxwdHIpIHt9CisgIEZQREZfRmlsZUFjY2Vzc0NvbnRleHQoKSA6IG1fcEZpbGVBY2Nlc3MobnVsbHB0cikge30KIAogICBGUERGX0ZJTEVBQ0NFU1MqIG1fcEZpbGVBY2Nlc3M7CiB9OwogCi1jbGFzcyBDRlBERl9Eb3dubG9hZEhpbnRzV3JhcCA6IHB1YmxpYyBDUERGX0RhdGFBdmFpbDo6RG93bmxvYWRIaW50cyB7CitjbGFzcyBGUERGX0Rvd25sb2FkSGludHNDb250ZXh0IDogcHVibGljIENQREZfRGF0YUF2YWlsOjpEb3dubG9hZEhpbnRzIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IENGUERGX0Rvd25sb2FkSGludHNXcmFwKEZYX0RPV05MT0FESElOVFMqIHBEb3dubG9hZEhpbnRzKSB7CisgIGV4cGxpY2l0IEZQREZfRG93bmxvYWRIaW50c0NvbnRleHQoRlhfRE9XTkxPQURISU5UUyogcERvd25sb2FkSGludHMpIHsKICAgICBtX3BEb3dubG9hZEhpbnRzID0gcERvd25sb2FkSGludHM7CiAgIH0KLSAgfkNGUERGX0Rvd25sb2FkSGludHNXcmFwKCkgb3ZlcnJpZGUge30KKyAgfkZQREZfRG93bmxvYWRIaW50c0NvbnRleHQoKSBvdmVycmlkZSB7fQogCiAgcHVibGljOgogICAvLyBJRlhfRG93bmxvYWRIaW50cwotICB2b2lkIEFkZFNlZ21lbnQoRlhfRklMRVNJWkUgb2Zmc2V0LCB1aW50MzJfdCBzaXplKSBvdmVycmlkZSB7Ci0gICAgbV9wRG93bmxvYWRIaW50cy0+QWRkU2VnbWVudChtX3BEb3dubG9hZEhpbnRzLCBvZmZzZXQsIHNpemUpOworICB2b2lkIEFkZFNlZ21lbnQoRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUgeworICAgIGlmIChtX3BEb3dubG9hZEhpbnRzKQorICAgICAgbV9wRG93bmxvYWRIaW50cy0+QWRkU2VnbWVudChtX3BEb3dubG9hZEhpbnRzLCBvZmZzZXQsIHNpemUpOwogICB9CiAKICBwcml2YXRlOgogICBGWF9ET1dOTE9BREhJTlRTKiBtX3BEb3dubG9hZEhpbnRzOwogfTsKIAotY2xhc3MgQ0ZQREZfRGF0YUF2YWlsIHsKK2NsYXNzIEZQREZfQXZhaWxDb250ZXh0IHsKICBwdWJsaWM6Ci0gIENGUERGX0RhdGFBdmFpbCgpCi0gICAgICA6IG1fRmlsZUF2YWlsKG5ldyBDRlBERl9GaWxlQXZhaWxXcmFwKSwKLSAgICAgICAgbV9GaWxlUmVhZChDRlBERl9GaWxlQWNjZXNzV3JhcDo6Q3JlYXRlKCkpIHt9Ci0gIH5DRlBERl9EYXRhQXZhaWwoKSB7fQorICBGUERGX0F2YWlsQ29udGV4dCgpCisgICAgICA6IG1fRmlsZUF2YWlsKHBkZml1bTo6TWFrZVVuaXF1ZTxGUERGX0ZpbGVBdmFpbENvbnRleHQ+KCkpLAorICAgICAgICBtX0ZpbGVSZWFkKHBkZml1bTo6TWFrZVJldGFpbjxGUERGX0ZpbGVBY2Nlc3NDb250ZXh0PigpKSB7fQorICB+RlBERl9BdmFpbENvbnRleHQoKSB7fQogCisgIHN0ZDo6dW5pcXVlX3B0cjxGUERGX0ZpbGVBdmFpbENvbnRleHQ+IG1fRmlsZUF2YWlsOworICBSZXRhaW5QdHI8RlBERl9GaWxlQWNjZXNzQ29udGV4dD4gbV9GaWxlUmVhZDsKICAgc3RkOjp1bmlxdWVfcHRyPENQREZfRGF0YUF2YWlsPiBtX3BEYXRhQXZhaWw7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlBERl9GaWxlQXZhaWxXcmFwPiBtX0ZpbGVBdmFpbDsKLSAgQ0ZYX1JldGFpblB0cjxDRlBERl9GaWxlQWNjZXNzV3JhcD4gbV9GaWxlUmVhZDsKIH07CiAKLUNGUERGX0RhdGFBdmFpbCogQ0ZQREZEYXRhQXZhaWxGcm9tRlBERkF2YWlsKEZQREZfQVZBSUwgYXZhaWwpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PENGUERGX0RhdGFBdmFpbCo+KGF2YWlsKTsKK0ZQREZfQXZhaWxDb250ZXh0KiBGUERGQXZhaWxDb250ZXh0RnJvbUZQREZBdmFpbChGUERGX0FWQUlMIGF2YWlsKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxGUERGX0F2YWlsQ29udGV4dCo+KGF2YWlsKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCiAKLURMTEVYUE9SVCBGUERGX0FWQUlMIFNURENBTEwgRlBERkF2YWlsX0NyZWF0ZShGWF9GSUxFQVZBSUwqIGZpbGVfYXZhaWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GSUxFQUNDRVNTKiBmaWxlKSB7Ci0gIENGUERGX0RhdGFBdmFpbCogcEF2YWlsID0gbmV3IENGUERGX0RhdGFBdmFpbDsKK0ZQREZfRVhQT1JUIEZQREZfQVZBSUwgRlBERl9DQUxMQ09OViBGUERGQXZhaWxfQ3JlYXRlKEZYX0ZJTEVBVkFJTCogZmlsZV9hdmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRklMRUFDQ0VTUyogZmlsZSkgeworICBhdXRvIHBBdmFpbCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxGUERGX0F2YWlsQ29udGV4dD4oKTsKICAgcEF2YWlsLT5tX0ZpbGVBdmFpbC0+U2V0KGZpbGVfYXZhaWwpOwogICBwQXZhaWwtPm1fRmlsZVJlYWQtPlNldChmaWxlKTsKICAgcEF2YWlsLT5tX3BEYXRhQXZhaWwgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EYXRhQXZhaWw+KAogICAgICAgcEF2YWlsLT5tX0ZpbGVBdmFpbC5nZXQoKSwgcEF2YWlsLT5tX0ZpbGVSZWFkLCB0cnVlKTsKLSAgcmV0dXJuIHBBdmFpbDsKKyAgcmV0dXJuIHBBdmFpbC5yZWxlYXNlKCk7ICAvLyBDYWxsZXIgdGFrZXMgb3duZXJzaGlwLgogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZBdmFpbF9EZXN0cm95KEZQREZfQVZBSUwgYXZhaWwpIHsKLSAgZGVsZXRlIChDRlBERl9EYXRhQXZhaWwqKWF2YWlsOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZBdmFpbF9EZXN0cm95KEZQREZfQVZBSUwgYXZhaWwpIHsKKyAgLy8gVGFrZSBvd25lcnNoaXAgYmFjayBmcm9tIGNhbGxlciBhbmQgZGVzdHJveS4KKyAgc3RkOjp1bmlxdWVfcHRyPEZQREZfQXZhaWxDb250ZXh0PihGUERGQXZhaWxDb250ZXh0RnJvbUZQREZBdmFpbChhdmFpbCkpOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERkF2YWlsX0lzRG9jQXZhaWwoRlBERl9BVkFJTCBhdmFpbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ET1dOTE9BREhJTlRTKiBoaW50cykgewotICBpZiAoIWF2YWlsIHx8ICFoaW50cykKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZBdmFpbF9Jc0RvY0F2YWlsKEZQREZfQVZBSUwgYXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ET1dOTE9BREhJTlRTKiBoaW50cykgeworICBpZiAoIWF2YWlsKQogICAgIHJldHVybiBQREZfREFUQV9FUlJPUjsKLSAgQ0ZQREZfRG93bmxvYWRIaW50c1dyYXAgaGludHNfd3JhcChoaW50cyk7Ci0gIHJldHVybiBDRlBERkRhdGFBdmFpbEZyb21GUERGQXZhaWwoYXZhaWwpLT5tX3BEYXRhQXZhaWwtPklzRG9jQXZhaWwoCi0gICAgICAmaGludHNfd3JhcCk7CisgIEZQREZfRG93bmxvYWRIaW50c0NvbnRleHQgaGludHNfY29udGV4dChoaW50cyk7CisgIHJldHVybiBGUERGQXZhaWxDb250ZXh0RnJvbUZQREZBdmFpbChhdmFpbCktPm1fcERhdGFBdmFpbC0+SXNEb2NBdmFpbCgKKyAgICAgICZoaW50c19jb250ZXh0KTsKIH0KIAotRExMRVhQT1JUIEZQREZfRE9DVU1FTlQgU1REQ0FMTAorRlBERl9FWFBPUlQgRlBERl9ET0NVTUVOVCBGUERGX0NBTExDT05WCiBGUERGQXZhaWxfR2V0RG9jdW1lbnQoRlBERl9BVkFJTCBhdmFpbCwgRlBERl9CWVRFU1RSSU5HIHBhc3N3b3JkKSB7Ci0gIENGUERGX0RhdGFBdmFpbCogcERhdGFBdmFpbCA9IHN0YXRpY19jYXN0PENGUERGX0RhdGFBdmFpbCo+KGF2YWlsKTsKKyAgYXV0byogcERhdGFBdmFpbCA9IEZQREZBdmFpbENvbnRleHRGcm9tRlBERkF2YWlsKGF2YWlsKTsKICAgaWYgKCFwRGF0YUF2YWlsKQogICAgIHJldHVybiBudWxscHRyOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1BhcnNlcj4gcFBhcnNlcihuZXcgQ1BERl9QYXJzZXIpOwotICBwUGFyc2VyLT5TZXRQYXNzd29yZChwYXNzd29yZCk7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENQREZfRG9jdW1lbnQ+IHBEb2N1bWVudCgKLSAgICAgIG5ldyBDUERGX0RvY3VtZW50KHN0ZDo6bW92ZShwUGFyc2VyKSkpOwotICBDUERGX1BhcnNlcjo6RXJyb3IgZXJyb3IgPSBwRG9jdW1lbnQtPkdldFBhcnNlcigpLT5TdGFydExpbmVhcml6ZWRQYXJzZSgKLSAgICAgIHBEYXRhQXZhaWwtPm1fcERhdGFBdmFpbC0+R2V0RmlsZVJlYWQoKSwgcERvY3VtZW50LmdldCgpKTsKKyAgQ1BERl9QYXJzZXI6OkVycm9yIGVycm9yOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Eb2N1bWVudD4gZG9jdW1lbnQ7CisgIHN0ZDo6dGllKGVycm9yLCBkb2N1bWVudCkgPSBwRGF0YUF2YWlsLT5tX3BEYXRhQXZhaWwtPlBhcnNlRG9jdW1lbnQocGFzc3dvcmQpOwogICBpZiAoZXJyb3IgIT0gQ1BERl9QYXJzZXI6OlNVQ0NFU1MpIHsKICAgICBQcm9jZXNzUGFyc2VFcnJvcihlcnJvcik7CiAgICAgcmV0dXJuIG51bGxwdHI7CiAgIH0KLSAgcERhdGFBdmFpbC0+bV9wRGF0YUF2YWlsLT5TZXREb2N1bWVudChwRG9jdW1lbnQuZ2V0KCkpOwotICBDaGVja1VuU3VwcG9ydEVycm9yKHBEb2N1bWVudC5nZXQoKSwgRlBERl9FUlJfU1VDQ0VTUyk7Ci0gIHJldHVybiBGUERGRG9jdW1lbnRGcm9tQ1BERkRvY3VtZW50KHBEb2N1bWVudC5yZWxlYXNlKCkpOworICBDaGVja1VuU3VwcG9ydEVycm9yKGRvY3VtZW50LmdldCgpLCBGUERGX0VSUl9TVUNDRVNTKTsKKyAgcmV0dXJuIEZQREZEb2N1bWVudEZyb21DUERGRG9jdW1lbnQoZG9jdW1lbnQucmVsZWFzZSgpKTsKIH0KIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZBdmFpbF9HZXRGaXJzdFBhZ2VOdW0oRlBERl9ET0NVTUVOVCBkb2MpIHsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZBdmFpbF9HZXRGaXJzdFBhZ2VOdW0oRlBERl9ET0NVTUVOVCBkb2MpIHsKICAgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jKTsKICAgcmV0dXJuIHBEb2MgPyBwRG9jLT5HZXRQYXJzZXIoKS0+R2V0Rmlyc3RQYWdlTm8oKSA6IDA7CiB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGQXZhaWxfSXNQYWdlQXZhaWwoRlBERl9BVkFJTCBhdmFpbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RPV05MT0FESElOVFMqIGhpbnRzKSB7Ci0gIGlmICghYXZhaWwgfHwgIWhpbnRzKQorRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERkF2YWlsX0lzUGFnZUF2YWlsKEZQREZfQVZBSUwgYXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRE9XTkxPQURISU5UUyogaGludHMpIHsKKyAgaWYgKCFhdmFpbCkKICAgICByZXR1cm4gUERGX0RBVEFfRVJST1I7CiAgIGlmIChwYWdlX2luZGV4IDwgMCkKICAgICByZXR1cm4gUERGX0RBVEFfTk9UQVZBSUw7Ci0gIENGUERGX0Rvd25sb2FkSGludHNXcmFwIGhpbnRzX3dyYXAoaGludHMpOwotICByZXR1cm4gQ0ZQREZEYXRhQXZhaWxGcm9tRlBERkF2YWlsKGF2YWlsKS0+bV9wRGF0YUF2YWlsLT5Jc1BhZ2VBdmFpbCgKLSAgICAgIHBhZ2VfaW5kZXgsICZoaW50c193cmFwKTsKKyAgRlBERl9Eb3dubG9hZEhpbnRzQ29udGV4dCBoaW50c19jb250ZXh0KGhpbnRzKTsKKyAgcmV0dXJuIEZQREZBdmFpbENvbnRleHRGcm9tRlBERkF2YWlsKGF2YWlsKS0+bV9wRGF0YUF2YWlsLT5Jc1BhZ2VBdmFpbCgKKyAgICAgIHBhZ2VfaW5kZXgsICZoaW50c19jb250ZXh0KTsKIH0KIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZBdmFpbF9Jc0Zvcm1BdmFpbChGUERGX0FWQUlMIGF2YWlsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ET1dOTE9BREhJTlRTKiBoaW50cykgewotICBpZiAoIWF2YWlsIHx8ICFoaW50cykKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZBdmFpbF9Jc0Zvcm1BdmFpbChGUERGX0FWQUlMIGF2YWlsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RPV05MT0FESElOVFMqIGhpbnRzKSB7CisgIGlmICghYXZhaWwpCiAgICAgcmV0dXJuIFBERl9GT1JNX0VSUk9SOwotICBDRlBERl9Eb3dubG9hZEhpbnRzV3JhcCBoaW50c193cmFwKGhpbnRzKTsKLSAgcmV0dXJuIENGUERGRGF0YUF2YWlsRnJvbUZQREZBdmFpbChhdmFpbCktPm1fcERhdGFBdmFpbC0+SXNGb3JtQXZhaWwoCi0gICAgICAmaGludHNfd3JhcCk7CisgIEZQREZfRG93bmxvYWRIaW50c0NvbnRleHQgaGludHNfY29udGV4dChoaW50cyk7CisgIHJldHVybiBGUERGQXZhaWxDb250ZXh0RnJvbUZQREZBdmFpbChhdmFpbCktPm1fcERhdGFBdmFpbC0+SXNGb3JtQXZhaWwoCisgICAgICAmaGludHNfY29udGV4dCk7CiB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGQXZhaWxfSXNMaW5lYXJpemVkKEZQREZfQVZBSUwgYXZhaWwpIHsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZBdmFpbF9Jc0xpbmVhcml6ZWQoRlBERl9BVkFJTCBhdmFpbCkgewogICBpZiAoIWF2YWlsKQogICAgIHJldHVybiBQREZfTElORUFSSVpBVElPTl9VTktOT1dOOwotICByZXR1cm4gQ0ZQREZEYXRhQXZhaWxGcm9tRlBERkF2YWlsKGF2YWlsKS0+bV9wRGF0YUF2YWlsLT5Jc0xpbmVhcml6ZWRQREYoKTsKKyAgcmV0dXJuIEZQREZBdmFpbENvbnRleHRGcm9tRlBERkF2YWlsKGF2YWlsKS0+bV9wRGF0YUF2YWlsLT5Jc0xpbmVhcml6ZWRQREYoKTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnBkZl9kYXRhYXZhaWxfZW1iZWRkZXJ0ZXN0LmNwcCBiL2ZwZGZzZGsvZnBkZl9kYXRhYXZhaWxfZW1iZWRkZXJ0ZXN0LmNwcAppbmRleCBjMjI2YTMxLi4yMDg0MTUzIDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZwZGZfZGF0YWF2YWlsX2VtYmVkZGVydGVzdC5jcHAKKysrIGIvZnBkZnNkay9mcGRmX2RhdGFhdmFpbF9lbWJlZGRlcnRlc3QuY3BwCkBAIC0xMiwxMCArMTIsMjUgQEAKICNpbmNsdWRlICJwdWJsaWMvZnBkZnZpZXcuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL3JhbmdlX3NldC5oIgogI2luY2x1ZGUgInRlc3RpbmcvdGVzdF9zdXBwb3J0LmgiCiAjaW5jbHVkZSAidGVzdGluZy91dGlscy9wYXRoX3NlcnZpY2UuaCIKIAogbmFtZXNwYWNlIHsKKworY2xhc3MgTW9ja0Rvd25sb2FkSGludHMgOiBwdWJsaWMgRlhfRE9XTkxPQURISU5UUyB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBTQWRkU2VnbWVudChGWF9ET1dOTE9BREhJTlRTKiBwVGhpcywgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgfQorCisgIE1vY2tEb3dubG9hZEhpbnRzKCkgeworICAgIEZYX0RPV05MT0FESElOVFM6OnZlcnNpb24gPSAxOworICAgIEZYX0RPV05MT0FESElOVFM6OkFkZFNlZ21lbnQgPSBTQWRkU2VnbWVudDsKKyAgfQorCisgIH5Nb2NrRG93bmxvYWRIaW50cygpIHt9Cit9OworCiBjbGFzcyBUZXN0QXN5bmNMb2FkZXIgOiBwdWJsaWMgRlhfRE9XTkxPQURISU5UUywgRlhfRklMRUFWQUlMIHsKICBwdWJsaWM6CiAgIGV4cGxpY2l0IFRlc3RBc3luY0xvYWRlcihjb25zdCBzdGQ6OnN0cmluZyYgZmlsZV9uYW1lKSB7CkBAIC02MCw1MCArNzUsMjUgQEAKICAgfQogCiAgIHNpemVfdCBtYXhfYWxyZWFkeV9hdmFpbGFibGVfYm91bmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGF2YWlsYWJsZV9yYW5nZXNfLmVtcHR5KCkgPyAwIDogYXZhaWxhYmxlX3Jhbmdlc18ucmJlZ2luKCktPnNlY29uZDsKKyAgICByZXR1cm4gYXZhaWxhYmxlX3Jhbmdlc18uSXNFbXB0eSgpCisgICAgICAgICAgICAgICA/IDAKKyAgICAgICAgICAgICAgIDogYXZhaWxhYmxlX3Jhbmdlc18ucmFuZ2VzKCkucmJlZ2luKCktPnNlY29uZDsKKyAgfQorCisgIHZvaWQgRmx1c2hSZXF1ZXN0ZWREYXRhKCkgeworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiByZXF1ZXN0ZWRfc2VnbWVudHNfKSB7CisgICAgICBTZXREYXRhQXZhaWxhYmxlKGl0LmZpcnN0LCBpdC5zZWNvbmQpOworICAgIH0KKyAgICBDbGVhclJlcXVlc3RlZFNlZ21lbnRzKCk7CiAgIH0KIAogIHByaXZhdGU6CiAgIHZvaWQgU2V0RGF0YUF2YWlsYWJsZShzaXplX3Qgc3RhcnQsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKHNpemUgPT0gMCkKLSAgICAgIHJldHVybjsKLSAgICBjb25zdCBhdXRvIHJhbmdlID0gc3RkOjptYWtlX3BhaXIoc3RhcnQsIHN0YXJ0ICsgc2l6ZSk7Ci0gICAgaWYgKGF2YWlsYWJsZV9yYW5nZXNfLmVtcHR5KCkpIHsKLSAgICAgIGF2YWlsYWJsZV9yYW5nZXNfLmluc2VydChyYW5nZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGF1dG8gc3RhcnRfaXQgPSBhdmFpbGFibGVfcmFuZ2VzXy51cHBlcl9ib3VuZChyYW5nZSk7Ci0gICAgaWYgKHN0YXJ0X2l0ICE9IGF2YWlsYWJsZV9yYW5nZXNfLmJlZ2luKCkpCi0gICAgICAtLXN0YXJ0X2l0OyAgLy8gc3RhcnQgbm93IHBvaW50cyB0byB0aGUga2V5IGVxdWFsIG9yIGxvd2VyIHRoYW4gb2Zmc2V0LgotICAgIGlmIChzdGFydF9pdC0+c2Vjb25kIDwgcmFuZ2UuZmlyc3QpCi0gICAgICArK3N0YXJ0X2l0OyAgLy8gc3RhcnQgZWxlbWVudCBpcyBlbnRpcmVseSBiZWZvcmUgY3VycmVudCByYW5nZSwgc2tpcCBpdC4KLQotICAgIGF1dG8gZW5kX2l0ID0gYXZhaWxhYmxlX3Jhbmdlc18udXBwZXJfYm91bmQoCi0gICAgICAgIHN0ZDo6bWFrZV9wYWlyKHJhbmdlLnNlY29uZCwgcmFuZ2Uuc2Vjb25kKSk7Ci0gICAgaWYgKHN0YXJ0X2l0ID09IGVuZF9pdCkgeyAgLy8gTm8gcmFuZ2VzIHRvIG1lcmdlLgotICAgICAgYXZhaWxhYmxlX3Jhbmdlc18uaW5zZXJ0KHJhbmdlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAtLWVuZF9pdDsKLQotICAgIHNpemVfdCBuZXdfc3RhcnQgPSBzdGQ6Om1pbjxzaXplX3Q+KHN0YXJ0X2l0LT5maXJzdCwgcmFuZ2UuZmlyc3QpOwotICAgIHNpemVfdCBuZXdfZW5kID0gc3RkOjptYXgoZW5kX2l0LT5zZWNvbmQsIHJhbmdlLnNlY29uZCk7Ci0KLSAgICBhdmFpbGFibGVfcmFuZ2VzXy5lcmFzZShzdGFydF9pdCwgKytlbmRfaXQpOwotICAgIGF2YWlsYWJsZV9yYW5nZXNfLmluc2VydChzdGQ6Om1ha2VfcGFpcihuZXdfc3RhcnQsIG5ld19lbmQpKTsKKyAgICBhdmFpbGFibGVfcmFuZ2VzXy5VbmlvbihSYW5nZVNldDo6UmFuZ2Uoc3RhcnQsIHN0YXJ0ICsgc2l6ZSkpOwogICB9CiAKICAgYm9vbCBDaGVja0RhdGFBbHJlYWR5QXZhaWxhYmxlKHNpemVfdCBzdGFydCwgc2l6ZV90IHNpemUpIGNvbnN0IHsKLSAgICBpZiAoc2l6ZSA9PSAwKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNvbnN0IGF1dG8gcmFuZ2UgPSBzdGQ6Om1ha2VfcGFpcihzdGFydCwgc3RhcnQgKyBzaXplKTsKLSAgICBhdXRvIGl0ID0gYXZhaWxhYmxlX3Jhbmdlc18udXBwZXJfYm91bmQocmFuZ2UpOwotICAgIGlmIChpdCA9PSBhdmFpbGFibGVfcmFuZ2VzXy5iZWdpbigpKQotICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gTm8gcmFuZ2VzIGluY2x1ZGVzIHJhbmdlLnN0YXJ0KCkuCi0KLSAgICAtLWl0OyAgLy8gTm93IGl0IHN0YXJ0cyBlcXVhbCBvciBiZWZvcmUgcmFuZ2Uuc3RhcnQoKS4KLSAgICByZXR1cm4gaXQtPnNlY29uZCA+PSByYW5nZS5zZWNvbmQ7CisgICAgcmV0dXJuIGF2YWlsYWJsZV9yYW5nZXNfLkNvbnRhaW5zKFJhbmdlU2V0OjpSYW5nZShzdGFydCwgc3RhcnQgKyBzaXplKSk7CiAgIH0KIAogICBpbnQgR2V0QmxvY2tJbXBsKHVuc2lnbmVkIGxvbmcgcG9zLCB1bnNpZ25lZCBjaGFyKiBwQnVmLCB1bnNpZ25lZCBsb25nIHNpemUpIHsKQEAgLTE1OCwxNCArMTQ4LDcgQEAKICAgc2l6ZV90IG1heF9yZXF1ZXN0ZWRfYm91bmRfID0gMDsKICAgYm9vbCBpc19uZXdfZGF0YV9hdmFpbGFibGVfID0gdHJ1ZTsKIAotICB1c2luZyBSYW5nZSA9IHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD47Ci0gIHN0cnVjdCByYW5nZV9jb21wYXJlIHsKLSAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgUmFuZ2UmIGx2YWwsIGNvbnN0IFJhbmdlJiBydmFsKSBjb25zdCB7Ci0gICAgICByZXR1cm4gbHZhbC5maXJzdCA8IHJ2YWwuZmlyc3Q7Ci0gICAgfQotICB9OwotICB1c2luZyBSYW5nZXNDb250YWluZXIgPSBzdGQ6OnNldDxSYW5nZSwgcmFuZ2VfY29tcGFyZT47Ci0gIFJhbmdlc0NvbnRhaW5lciBhdmFpbGFibGVfcmFuZ2VzXzsKKyAgUmFuZ2VTZXQgYXZhaWxhYmxlX3Jhbmdlc187CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UKQEAgLTE3NSwxMyArMTU4LDE1IEBACiBURVNUX0YoRlBERkRhdGFBdmFpbEVtYmVkZGVydGVzdCwgVHJhaWxlclVudGVybWluYXRlZCkgewogICAvLyBEb2N1bWVudCBtdXN0IGxvYWQgd2l0aG91dCBjcmFzaGluZyBidXQgaXMgdG9vIG1hbGZvcm1lZCB0byBiZSBhdmFpbGFibGUuCiAgIEVYUEVDVF9GQUxTRShPcGVuRG9jdW1lbnQoInRyYWlsZXJfdW50ZXJtaW5hdGVkLnBkZiIpKTsKLSAgRVhQRUNUX0ZBTFNFKEZQREZBdmFpbF9Jc0RvY0F2YWlsKGF2YWlsXywgJmhpbnRzXykpOworICBNb2NrRG93bmxvYWRIaW50cyBoaW50czsKKyAgRVhQRUNUX0ZBTFNFKEZQREZBdmFpbF9Jc0RvY0F2YWlsKGF2YWlsXywgJmhpbnRzKSk7CiB9CiAKIFRFU1RfRihGUERGRGF0YUF2YWlsRW1iZWRkZXJ0ZXN0LCBUcmFpbGVyQXNIZXhzdHJpbmcpIHsKICAgLy8gRG9jdW1lbnQgbXVzdCBsb2FkIHdpdGhvdXQgY3Jhc2hpbmcgYnV0IGlzIHRvbyBtYWxmb3JtZWQgdG8gYmUgYXZhaWxhYmxlLgogICBFWFBFQ1RfRkFMU0UoT3BlbkRvY3VtZW50KCJ0cmFpbGVyX2FzX2hleHN0cmluZy5wZGYiKSk7Ci0gIEVYUEVDVF9GQUxTRShGUERGQXZhaWxfSXNEb2NBdmFpbChhdmFpbF8sICZoaW50c18pKTsKKyAgTW9ja0Rvd25sb2FkSGludHMgaGludHM7CisgIEVYUEVDVF9GQUxTRShGUERGQXZhaWxfSXNEb2NBdmFpbChhdmFpbF8sICZoaW50cykpOwogfQogCiBURVNUX0YoRlBERkRhdGFBdmFpbEVtYmVkZGVydGVzdCwgTG9hZFVzaW5nSGludFRhYmxlcykgewpAQCAtMTk0LDkgKzE3OSwyOSBAQAogCiAgIC8vIE5vIG5ldyBkYXRhIGF2YWlsYWJsZSwgdG8gcHJldmVudCBsb2FkICJQYWdlcyIgbm9kZS4KICAgbG9hZGVyLnNldF9pc19uZXdfZGF0YV9hdmFpbGFibGUoZmFsc2UpOwotICBGUERGX1BBR0UgcGFnZSA9IExvYWRQYWdlKDEpOworICBGUERGX1BBR0UgcGFnZSA9IEZQREZfTG9hZFBhZ2UoZG9jdW1lbnQoKSwgMSk7CiAgIEVYUEVDVF9UUlVFKHBhZ2UpOwotICBVbmxvYWRQYWdlKHBhZ2UpOworICBGUERGX0Nsb3NlUGFnZShwYWdlKTsKK30KKworVEVTVF9GKEZQREZEYXRhQXZhaWxFbWJlZGRlcnRlc3QsIENoZWNrRm9ybUF2YWlsSWZMaW5lYXJpemVkKSB7CisgIFRlc3RBc3luY0xvYWRlciBsb2FkZXIoImZlYXR1cmVfbGluZWFyaXplZF9sb2FkaW5nLnBkZiIpOworICBhdmFpbF8gPSBGUERGQXZhaWxfQ3JlYXRlKGxvYWRlci5maWxlX2F2YWlsKCksIGxvYWRlci5maWxlX2FjY2VzcygpKTsKKyAgQVNTRVJUX0VRKFBERl9EQVRBX0FWQUlMLCBGUERGQXZhaWxfSXNEb2NBdmFpbChhdmFpbF8sIGxvYWRlci5oaW50cygpKSk7CisgIGRvY3VtZW50XyA9IEZQREZBdmFpbF9HZXREb2N1bWVudChhdmFpbF8sIG51bGxwdHIpOworICBBU1NFUlRfVFJVRShkb2N1bWVudF8pOworCisgIC8vIFByZXZlbnQgYWNjZXNzIHRvIG5vbiByZXF1ZXN0ZWQgZGF0YSB0byBjb2VyY2UgdGhlIHBhcnNlciB0byBzZW5kIG5ldworICAvLyByZXF1ZXN0IGZvciBub24gYXZhaWxhYmxlIChub24gcmVxdWVzdGVkIGJlZm9yZSkgZGF0YS4KKyAgbG9hZGVyLnNldF9pc19uZXdfZGF0YV9hdmFpbGFibGUoZmFsc2UpOworICBsb2FkZXIuQ2xlYXJSZXF1ZXN0ZWRTZWdtZW50cygpOworCisgIGludCBzdGF0dXMgPSBQREZfRk9STV9OT1RBVkFJTDsKKyAgd2hpbGUgKHN0YXR1cyA9PSBQREZfRk9STV9OT1RBVkFJTCkgeworICAgIGxvYWRlci5GbHVzaFJlcXVlc3RlZERhdGEoKTsKKyAgICBzdGF0dXMgPSBGUERGQXZhaWxfSXNGb3JtQXZhaWwoYXZhaWxfLCBsb2FkZXIuaGludHMoKSk7CisgIH0KKyAgRVhQRUNUX05FKFBERl9GT1JNX0VSUk9SLCBzdGF0dXMpOwogfQogCiBURVNUX0YoRlBERkRhdGFBdmFpbEVtYmVkZGVydGVzdCwKQEAgLTIzNCw3ICsyMzksMzUgQEAKIAogICAvLyBQcmV2ZW50IGxvYWRpbmcgZGF0YSwgd2hpbGUgcGFnZSBsb2FkaW5nLgogICBsb2FkZXIuc2V0X2lzX25ld19kYXRhX2F2YWlsYWJsZShmYWxzZSk7Ci0gIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoZmlyc3RfcGFnZV9udW0pOworICBGUERGX1BBR0UgcGFnZSA9IEZQREZfTG9hZFBhZ2UoZG9jdW1lbnQoKSwgZmlyc3RfcGFnZV9udW0pOwogICBFWFBFQ1RfVFJVRShwYWdlKTsKLSAgVW5sb2FkUGFnZShwYWdlKTsKKyAgRlBERl9DbG9zZVBhZ2UocGFnZSk7Cit9CisKK1RFU1RfRihGUERGRGF0YUF2YWlsRW1iZWRkZXJ0ZXN0LCBMb2FkU2Vjb25kUGFnZUlmTGluZWFyaXplZFdpdGhIaW50cykgeworICBUZXN0QXN5bmNMb2FkZXIgbG9hZGVyKCJmZWF0dXJlX2xpbmVhcml6ZWRfbG9hZGluZy5wZGYiKTsKKyAgYXZhaWxfID0gRlBERkF2YWlsX0NyZWF0ZShsb2FkZXIuZmlsZV9hdmFpbCgpLCBsb2FkZXIuZmlsZV9hY2Nlc3MoKSk7CisgIEFTU0VSVF9FUShQREZfREFUQV9BVkFJTCwgRlBERkF2YWlsX0lzRG9jQXZhaWwoYXZhaWxfLCBsb2FkZXIuaGludHMoKSkpOworICBkb2N1bWVudF8gPSBGUERGQXZhaWxfR2V0RG9jdW1lbnQoYXZhaWxfLCBudWxscHRyKTsKKyAgQVNTRVJUX1RSVUUoZG9jdW1lbnRfKTsKKworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtTZWNvbmRQYWdlTnVtID0gMTsKKworICAvLyBQcmV2ZW50IGFjY2VzcyB0byBub24gcmVxdWVzdGVkIGRhdGEgdG8gY29lcmNlIHRoZSBwYXJzZXIgdG8gc2VuZCBuZXcKKyAgLy8gcmVxdWVzdCBmb3Igbm9uIGF2YWlsYWJsZSAobm9uIHJlcXVlc3RlZCBiZWZvcmUpIGRhdGEuCisgIGxvYWRlci5zZXRfaXNfbmV3X2RhdGFfYXZhaWxhYmxlKGZhbHNlKTsKKyAgbG9hZGVyLkNsZWFyUmVxdWVzdGVkU2VnbWVudHMoKTsKKworICBpbnQgc3RhdHVzID0gUERGX0RBVEFfTk9UQVZBSUw7CisgIHdoaWxlIChzdGF0dXMgPT0gUERGX0RBVEFfTk9UQVZBSUwpIHsKKyAgICBsb2FkZXIuRmx1c2hSZXF1ZXN0ZWREYXRhKCk7CisgICAgc3RhdHVzID0gRlBERkF2YWlsX0lzUGFnZUF2YWlsKGF2YWlsXywga1NlY29uZFBhZ2VOdW0sIGxvYWRlci5oaW50cygpKTsKKyAgfQorICBFWFBFQ1RfRVEoUERGX0RBVEFfQVZBSUwsIHN0YXR1cyk7CisKKyAgLy8gUHJldmVudCBsb2FkaW5nIGRhdGEsIHdoaWxlIHBhZ2UgbG9hZGluZy4KKyAgbG9hZGVyLnNldF9pc19uZXdfZGF0YV9hdmFpbGFibGUoZmFsc2UpOworICBGUERGX1BBR0UgcGFnZSA9IEZQREZfTG9hZFBhZ2UoZG9jdW1lbnQoKSwga1NlY29uZFBhZ2VOdW0pOworICBFWFBFQ1RfVFJVRShwYWdlKTsKKyAgRlBERl9DbG9zZVBhZ2UocGFnZSk7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZfZXh0LmNwcCBiL2ZwZGZzZGsvZnBkZl9leHQuY3BwCmluZGV4IDNiY2IwYzAuLjg3NjA1Y2YgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvZnBkZl9leHQuY3BwCisrKyBiL2ZwZGZzZGsvZnBkZl9leHQuY3BwCkBAIC0xNCw5ICsxNCw5IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfYW5ub3QuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9pbnRlcmZvcm0uaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9tZXRhZGF0YS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfeG1sLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY3htbF9jb250ZW50LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY3htbF9lbGVtZW50LmgiCiAjaW5jbHVkZSAiZnBkZnNkay9mc2RrX2RlZmluZS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIApAQCAtMzYsNyArMzYsNyBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgogRlNES19TZXRVblNwT2JqUHJvY2Vzc0hhbmRsZXIoVU5TVVBQT1JUX0lORk8qIHVuc3BfaW5mbykgewogICBpZiAoIXVuc3BfaW5mbyB8fCB1bnNwX2luZm8tPnZlcnNpb24gIT0gMSkKICAgICByZXR1cm4gZmFsc2U7CkBAIC01Miw3ICs1Miw3IEBACiAgICAgRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfQU5OT1RfM0RBTk5PVCk7CiAgIH0gZWxzZSBpZiAobkFubm90U3VidHlwZSA9PSBDUERGX0Fubm90OjpTdWJ0eXBlOjpTQ1JFRU4pIHsKICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPSBwUERGQW5ub3QtPkdldEFubm90RGljdCgpOwotICAgIENGWF9CeXRlU3RyaW5nIGNiU3RyaW5nOworICAgIEJ5dGVTdHJpbmcgY2JTdHJpbmc7CiAgICAgaWYgKHBBbm5vdERpY3QtPktleUV4aXN0KCJJVCIpKQogICAgICAgY2JTdHJpbmcgPSBwQW5ub3REaWN0LT5HZXRTdHJpbmdGb3IoIklUIik7CiAgICAgaWYgKGNiU3RyaW5nLkNvbXBhcmUoIkltZyIpICE9IDApCkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfQU5OT1RfQVRUQUNITUVOVCk7CiAgIH0gZWxzZSBpZiAobkFubm90U3VidHlwZSA9PSBDUERGX0Fubm90OjpTdWJ0eXBlOjpXSURHRVQpIHsKICAgICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPSBwUERGQW5ub3QtPkdldEFubm90RGljdCgpOwotICAgIENGWF9CeXRlU3RyaW5nIGNiU3RyaW5nOworICAgIEJ5dGVTdHJpbmcgY2JTdHJpbmc7CiAgICAgaWYgKHBBbm5vdERpY3QtPktleUV4aXN0KCJGVCIpKQogICAgICAgY2JTdHJpbmcgPSBwQW5ub3REaWN0LT5HZXRTdHJpbmdGb3IoIkZUIik7CiAgICAgaWYgKGNiU3RyaW5nLkNvbXBhcmUoIlNpZyIpID09IDApCkBAIC03NSwyMiArNzUsMjMgQEAKICAgfQogfQogCi1ib29sIENoZWNrU2hhcmVkRm9ybShjb25zdCBDWE1MX0VsZW1lbnQqIHBFbGVtZW50LCBDRlhfQnl0ZVN0cmluZyBjYk5hbWUpIHsKLSAgaW50IGNvdW50ID0gcEVsZW1lbnQtPkNvdW50QXR0cnMoKTsKLSAgaW50IGkgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgIENGWF9CeXRlU3RyaW5nIHNwYWNlLCBuYW1lOwotICAgIENGWF9XaWRlU3RyaW5nIHZhbHVlOwotICAgIHBFbGVtZW50LT5HZXRBdHRyQnlJbmRleChpLCBzcGFjZSwgbmFtZSwgdmFsdWUpOworYm9vbCBDaGVja1NoYXJlZEZvcm0oY29uc3QgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCwgQnl0ZVN0cmluZyBjYk5hbWUpIHsKKyAgc2l6ZV90IGNvdW50ID0gcEVsZW1lbnQtPkNvdW50QXR0cnMoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgQnl0ZVN0cmluZyBzcGFjZTsKKyAgICBCeXRlU3RyaW5nIG5hbWU7CisgICAgV2lkZVN0cmluZyB2YWx1ZTsKKyAgICBwRWxlbWVudC0+R2V0QXR0ckJ5SW5kZXgoaSwgJnNwYWNlLCAmbmFtZSwgJnZhbHVlKTsKICAgICBpZiAoc3BhY2UgPT0gInhtbG5zIiAmJiBuYW1lID09ICJhZGhvY3dmIiAmJgogICAgICAgICB2YWx1ZSA9PSBMImh0dHA6Ly9ucy5hZG9iZS5jb20vQWNyb2JhdEFkaG9jV29ya2Zsb3cvMS4wLyIpIHsKICAgICAgIENYTUxfRWxlbWVudCogcFZlcnNpb24gPQotICAgICAgICAgIHBFbGVtZW50LT5HZXRFbGVtZW50KCJhZGhvY3dmIiwgY2JOYW1lLkFzU3RyaW5nQygpKTsKKyAgICAgICAgICBwRWxlbWVudC0+R2V0RWxlbWVudCgiYWRob2N3ZiIsIGNiTmFtZS5Bc1N0cmluZ1ZpZXcoKSwgMCk7CiAgICAgICBpZiAoIXBWZXJzaW9uKQogICAgICAgICBjb250aW51ZTsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudCA9IHBWZXJzaW9uLT5HZXRDb250ZW50KDApOwotICAgICAgaW50IG5UeXBlID0gd3NDb250ZW50LkdldEludGVnZXIoKTsKLSAgICAgIHN3aXRjaCAoblR5cGUpIHsKKyAgICAgIENYTUxfQ29udGVudCogcENvbnRlbnQgPSBUb0NvbnRlbnQocFZlcnNpb24tPkdldENoaWxkKDApKTsKKyAgICAgIGlmICghcENvbnRlbnQpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgc3dpdGNoIChwQ29udGVudC0+bV9Db250ZW50LkdldEludGVnZXIoKSkgewogICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgRlBERl9VblN1cHBvcnRFcnJvcihGUERGX1VOU1BfRE9DX1NIQVJFREZPUk1fQUNST0JBVCk7CiAgICAgICAgICAgYnJlYWs7CkBAIC0xMDQsMTQgKzEwNSwxMSBAQAogICAgIH0KICAgfQogCi0gIHVpbnQzMl90IG5Db3VudCA9IHBFbGVtZW50LT5Db3VudENoaWxkcmVuKCk7Ci0gIGZvciAoaSA9IDA7IGkgPCAoaW50KW5Db3VudDsgaSsrKSB7Ci0gICAgQ1hNTF9FbGVtZW50OjpDaGlsZFR5cGUgY2hpbGRUeXBlID0gcEVsZW1lbnQtPkdldENoaWxkVHlwZShpKTsKLSAgICBpZiAoY2hpbGRUeXBlID09IENYTUxfRWxlbWVudDo6RWxlbWVudCkgewotICAgICAgQ1hNTF9FbGVtZW50KiBwQ2hpbGQgPSBwRWxlbWVudC0+R2V0RWxlbWVudChpKTsKLSAgICAgIGlmIChDaGVja1NoYXJlZEZvcm0ocENoaWxkLCBjYk5hbWUpKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9CisgIHNpemVfdCBuQ291bnQgPSBwRWxlbWVudC0+Q291bnRDaGlsZHJlbigpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5Db3VudDsgKytpKSB7CisgICAgQ1hNTF9FbGVtZW50KiBwQ2hpbGQgPSBUb0VsZW1lbnQocEVsZW1lbnQtPkdldENoaWxkKGkpKTsKKyAgICBpZiAocENoaWxkICYmIENoZWNrU2hhcmVkRm9ybShwQ2hpbGQsIGNiTmFtZSkpCisgICAgICByZXR1cm4gdHJ1ZTsKICAgfQogICByZXR1cm4gZmFsc2U7CiB9CkBAIC0xMjYsOSArMTI0LDkgQEAKICAgICByZXR1cm47CiAKICAgLy8gUG9ydGZvbGlvcyBhbmQgUGFja2FnZXMKLSAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdERpY3QgPSBwRG9jLT5HZXRSb290KCk7CisgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJvb3REaWN0ID0gcERvYy0+R2V0Um9vdCgpOwogICBpZiAocFJvb3REaWN0KSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgY2JTdHJpbmc7CisgICAgQnl0ZVN0cmluZyBjYlN0cmluZzsKICAgICBpZiAocFJvb3REaWN0LT5LZXlFeGlzdCgiQ29sbGVjdGlvbiIpKSB7CiAgICAgICBGUERGX1VuU3VwcG9ydEVycm9yKEZQREZfVU5TUF9ET0NfUE9SVEFCTEVDT0xMRUNUSU9OKTsKICAgICAgIHJldHVybjsKQEAgLTE0NCw3ICsxNDIsNyBAQAogICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBwSlNEaWN0ID8gcEpTRGljdC0+R2V0QXJyYXlGb3IoIk5hbWVzIikgOiBudWxscHRyOwogICAgICAgICBpZiAocEFycmF5KSB7CiAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwQXJyYXktPkdldENvdW50KCk7IGkrKykgewotICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgY2JTdHIgPSBwQXJyYXktPkdldFN0cmluZ0F0KGkpOworICAgICAgICAgICAgQnl0ZVN0cmluZyBjYlN0ciA9IHBBcnJheS0+R2V0U3RyaW5nQXQoaSk7CiAgICAgICAgICAgICBpZiAoY2JTdHIuQ29tcGFyZSgiY29tLmFkb2JlLmFjcm9iYXQuU2hhcmVkUmV2aWV3LlJlZ2lzdGVyIikgPT0gMCkgewogICAgICAgICAgICAgICBGUERGX1VuU3VwcG9ydEVycm9yKEZQREZfVU5TUF9ET0NfU0hBUkVEUkVWSUVXKTsKICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTY5LDEyICsxNjcsMTIgQEAKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIH0KIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZEb2NfR2V0UGFnZU1vZGUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkgeworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERkRvY19HZXRQYWdlTW9kZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CiAgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBDUERGRG9jdW1lbnRGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKICAgaWYgKCFwRG9jKQogICAgIHJldHVybiBQQUdFTU9ERV9VTktOT1dOOwogCi0gIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBwRG9jLT5HZXRSb290KCk7CisgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBwRG9jLT5HZXRSb290KCk7CiAgIGlmICghcFJvb3QpCiAgICAgcmV0dXJuIFBBR0VNT0RFX1VOS05PV047CiAKQEAgLTE4Miw3ICsxODAsNyBAQAogICBpZiAoIXBOYW1lKQogICAgIHJldHVybiBQQUdFTU9ERV9VU0VOT05FOwogCi0gIENGWF9CeXRlU3RyaW5nIHN0clBhZ2VNb2RlID0gcE5hbWUtPkdldFN0cmluZygpOworICBCeXRlU3RyaW5nIHN0clBhZ2VNb2RlID0gcE5hbWUtPkdldFN0cmluZygpOwogICBpZiAoc3RyUGFnZU1vZGUuSXNFbXB0eSgpIHx8IHN0clBhZ2VNb2RlLkVxdWFsTm9DYXNlKCJVc2VOb25lIikpCiAgICAgcmV0dXJuIFBBR0VNT0RFX1VTRU5PTkU7CiAgIGlmIChzdHJQYWdlTW9kZS5FcXVhbE5vQ2FzZSgiVXNlT3V0bGluZXMiKSkKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnBkZl9mbGF0dGVuLmNwcCBiL2ZwZGZzZGsvZnBkZl9mbGF0dGVuLmNwcAppbmRleCBlNjQ5YmFjLi40ZDA2NjkzIDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZwZGZfZmxhdHRlbi5jcHAKKysrIGIvZnBkZnNkay9mcGRmX2ZsYXR0ZW4uY3BwCkBAIC0yOSwyOSArMjksMjUgQEAKIAogbmFtZXNwYWNlIHsKIAotYm9vbCBJc1ZhbGlhYmxlUmVjdChDRlhfRmxvYXRSZWN0IHJlY3QsIENGWF9GbG9hdFJlY3QgcmNQYWdlKSB7Ci0gIGlmIChyZWN0LmxlZnQgLSByZWN0LnJpZ2h0ID4gMC4wMDAwMDFmIHx8IHJlY3QuYm90dG9tIC0gcmVjdC50b3AgPiAwLjAwMDAwMWYpCitib29sIElzVmFsaWRSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjUGFnZSkgeworICBjb25zdGV4cHIgZmxvYXQga01pblNpemUgPSAwLjAwMDAwMWY7CisgIGlmIChyZWN0LklzRW1wdHkoKSB8fCByZWN0LldpZHRoKCkgPCBrTWluU2l6ZSB8fCByZWN0LkhlaWdodCgpIDwga01pblNpemUpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIGlmIChyZWN0LmxlZnQgPT0gMC4wZiAmJiByZWN0LnRvcCA9PSAwLjBmICYmIHJlY3QucmlnaHQgPT0gMC4wZiAmJgotICAgICAgcmVjdC5ib3R0b20gPT0gMC4wZikKLSAgICByZXR1cm4gZmFsc2U7CisgIGlmIChyY1BhZ2UuSXNFbXB0eSgpKQorICAgIHJldHVybiB0cnVlOwogCi0gIGlmICghcmNQYWdlLklzRW1wdHkoKSkgewotICAgIGlmIChyZWN0LmxlZnQgLSByY1BhZ2UubGVmdCA8IC0xMC4wMDAwMDFmIHx8Ci0gICAgICAgIHJlY3QucmlnaHQgLSByY1BhZ2UucmlnaHQgPiAxMC4wMDAwMDFmIHx8Ci0gICAgICAgIHJlY3QudG9wIC0gcmNQYWdlLnRvcCA+IDEwLjAwMDAwMWYgfHwKLSAgICAgICAgcmVjdC5ib3R0b20gLSByY1BhZ2UuYm90dG9tIDwgLTEwLjAwMDAwMWYpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKKyAgY29uc3RleHByIGZsb2F0IGtNaW5Cb3JkZXJTaXplID0gMTAuMDAwMDAxZjsKKyAgcmV0dXJuIHJlY3QubGVmdCAtIHJjUGFnZS5sZWZ0ID49IC1rTWluQm9yZGVyU2l6ZSAmJgorICAgICAgICAgcmVjdC5yaWdodCAtIHJjUGFnZS5yaWdodCA8PSBrTWluQm9yZGVyU2l6ZSAmJgorICAgICAgICAgcmVjdC50b3AgLSByY1BhZ2UudG9wIDw9IGtNaW5Cb3JkZXJTaXplICYmCisgICAgICAgICByZWN0LmJvdHRvbSAtIHJjUGFnZS5ib3R0b20gPj0gLWtNaW5Cb3JkZXJTaXplOwogfQogCiB2b2lkIEdldENvbnRlbnRzUmVjdChDUERGX0RvY3VtZW50KiBwRG9jLAogICAgICAgICAgICAgICAgICAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCwKICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENGWF9GbG9hdFJlY3Q+KiBwUmVjdEFycmF5KSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1BhZ2U+IHBQREZQYWdlKG5ldyBDUERGX1BhZ2UocERvYywgcERpY3QsIGZhbHNlKSk7CisgIGF1dG8gcFBERlBhZ2UgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9QYWdlPihwRG9jLCBwRGljdCwgZmFsc2UpOwogICBwUERGUGFnZS0+UGFyc2VDb250ZW50KCk7CiAKICAgZm9yIChjb25zdCBhdXRvJiBwUGFnZU9iamVjdCA6ICpwUERGUGFnZS0+R2V0UGFnZU9iamVjdExpc3QoKSkgewpAQCAtNjAsNyArNTYsNyBAQAogICAgIHJjLnJpZ2h0ID0gcFBhZ2VPYmplY3QtPm1fUmlnaHQ7CiAgICAgcmMuYm90dG9tID0gcFBhZ2VPYmplY3QtPm1fQm90dG9tOwogICAgIHJjLnRvcCA9IHBQYWdlT2JqZWN0LT5tX1RvcDsKLSAgICBpZiAoSXNWYWxpYWJsZVJlY3QocmMsIHBEaWN0LT5HZXRSZWN0Rm9yKCJNZWRpYUJveCIpKSkKKyAgICBpZiAoSXNWYWxpZFJlY3QocmMsIHBEaWN0LT5HZXRSZWN0Rm9yKCJNZWRpYUJveCIpKSkKICAgICAgIHBSZWN0QXJyYXktPnB1c2hfYmFjayhyYyk7CiAgIH0KIH0KQEAgLTc3LDcgKzczLDcgQEAKICAgZWxzZSBpZiAocFN0cmVhbS0+S2V5RXhpc3QoIkJCb3giKSkKICAgICByZWN0ID0gcFN0cmVhbS0+R2V0UmVjdEZvcigiQkJveCIpOwogCi0gIGlmIChJc1ZhbGlhYmxlUmVjdChyZWN0LCBwUGFnZURpYy0+R2V0UmVjdEZvcigiTWVkaWFCb3giKSkpCisgIGlmIChJc1ZhbGlkUmVjdChyZWN0LCBwUGFnZURpYy0+R2V0UmVjdEZvcigiTWVkaWFCb3giKSkpCiAgICAgcFJlY3RBcnJheS0+cHVzaF9iYWNrKHJlY3QpOwogCiAgIHBPYmplY3RBcnJheS0+cHVzaF9iYWNrKHBTdHJlYW0pOwpAQCAtOTYsMTMgKzkyLDEyIEBACiAgIGlmICghcEFubm90cykKICAgICByZXR1cm4gRkxBVFRFTl9OT1RISU5HVE9ETzsKIAotICB1aW50MzJfdCBkd1NpemUgPSBwQW5ub3RzLT5HZXRDb3VudCgpOwotICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpZHdTaXplOyBpKyspIHsKLSAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpYyA9IFRvRGljdGlvbmFyeShwQW5ub3RzLT5HZXREaXJlY3RPYmplY3RBdChpKSk7CisgIGZvciAoY29uc3QgYXV0byYgcEFubm90IDogKnBBbm5vdHMpIHsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpYyA9IFRvRGljdGlvbmFyeShwQW5ub3QtPkdldERpcmVjdCgpKTsKICAgICBpZiAoIXBBbm5vdERpYykKICAgICAgIGNvbnRpbnVlOwogCi0gICAgQ0ZYX0J5dGVTdHJpbmcgc1N1YnR5cGUgPSBwQW5ub3REaWMtPkdldFN0cmluZ0ZvcigiU3VidHlwZSIpOworICAgIEJ5dGVTdHJpbmcgc1N1YnR5cGUgPSBwQW5ub3REaWMtPkdldFN0cmluZ0ZvcigiU3VidHlwZSIpOwogICAgIGlmIChzU3VidHlwZSA9PSAiUG9wdXAiKQogICAgICAgY29udGludWU7CiAKQEAgLTExMCwyNyArMTA1LDI1IEBACiAgICAgaWYgKG5Bbm5vdEZsYWcgJiBBTk5PVEZMQUdfSElEREVOKQogICAgICAgY29udGludWU7CiAKLSAgICBpZiAoblVzYWdlID09IEZMQVRfTk9STUFMRElTUExBWSkgewotICAgICAgaWYgKG5Bbm5vdEZsYWcgJiBBTk5PVEZMQUdfSU5WSVNJQkxFKQotICAgICAgICBjb250aW51ZTsKLQorICAgIGJvb2wgYlBhcnNlU3RyZWFtOworICAgIGlmIChuVXNhZ2UgPT0gRkxBVF9OT1JNQUxESVNQTEFZKQorICAgICAgYlBhcnNlU3RyZWFtID0gIShuQW5ub3RGbGFnICYgQU5OT1RGTEFHX0lOVklTSUJMRSk7CisgICAgZWxzZQorICAgICAgYlBhcnNlU3RyZWFtID0gISEobkFubm90RmxhZyAmIEFOTk9URkxBR19QUklOVCk7CisgICAgaWYgKGJQYXJzZVN0cmVhbSkKICAgICAgIFBhcnNlclN0cmVhbShwUGFnZURpYywgcEFubm90RGljLCBwUmVjdEFycmF5LCBwT2JqZWN0QXJyYXkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAobkFubm90RmxhZyAmIEFOTk9URkxBR19QUklOVCkKLSAgICAgICAgUGFyc2VyU3RyZWFtKHBQYWdlRGljLCBwQW5ub3REaWMsIHBSZWN0QXJyYXksIHBPYmplY3RBcnJheSk7Ci0gICAgfQogICB9CiAgIHJldHVybiBGTEFUVEVOX1NVQ0NFU1M7CiB9CiAKLUZYX0ZMT0FUIEdldE1pbk1heFZhbHVlKGNvbnN0IHN0ZDo6dmVjdG9yPENGWF9GbG9hdFJlY3Q+JiBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfVFlQRSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9WQUxVRSB2YWx1ZSkgewotICBzaXplX3QgblJlY3RzID0gYXJyYXkuc2l6ZSgpOwotICBpZiAoblJlY3RzIDw9IDApCitmbG9hdCBHZXRNaW5NYXhWYWx1ZShjb25zdCBzdGQ6OnZlY3RvcjxDRlhfRmxvYXRSZWN0PiYgYXJyYXksCisgICAgICAgICAgICAgICAgICAgICBGUERGX1RZUEUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIEZQREZfVkFMVUUgdmFsdWUpIHsKKyAgaWYgKGFycmF5LmVtcHR5KCkpCiAgICAgcmV0dXJuIDAuMGY7CiAKLSAgc3RkOjp2ZWN0b3I8RlhfRkxPQVQ+IHBBcnJheShuUmVjdHMpOworICBzaXplX3QgblJlY3RzID0gYXJyYXkuc2l6ZSgpOworICBzdGQ6OnZlY3RvcjxmbG9hdD4gcEFycmF5KG5SZWN0cyk7CiAgIHN3aXRjaCAodmFsdWUpIHsKICAgICBjYXNlIExFRlQ6CiAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5SZWN0czsgaSsrKQpAQCAtMTQ5LDExICsxNDIsMTEgQEAKICAgICAgICAgcEFycmF5W2ldID0gYXJyYXlbaV0uYm90dG9tOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgIC8vIE5vdCByZWFjaGFibGUuCisgICAgICBOT1RSRUFDSEVEKCk7CiAgICAgICByZXR1cm4gMC4wZjsKICAgfQogCi0gIEZYX0ZMT0FUIGZSZXQgPSBwQXJyYXlbMF07CisgIGZsb2F0IGZSZXQgPSBwQXJyYXlbMF07CiAgIGlmICh0eXBlID09IE1BWCkgewogICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgblJlY3RzOyBpKyspCiAgICAgICBmUmV0ID0gc3RkOjptYXgoZlJldCwgcEFycmF5W2ldKTsKQEAgLTE3NSwxOCArMTY4LDE4IEBACiAgIHJldHVybiByY1JldDsKIH0KIAotdWludDMyX3QgTmV3SW5kaXJlY3RDb250ZW50c1N0cmVhbShjb25zdCBDRlhfQnl0ZVN0cmluZyYga2V5LAordWludDMyX3QgTmV3SW5kaXJlY3RDb250ZW50c1N0cmVhbShjb25zdCBCeXRlU3RyaW5nJiBrZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCkgewogICBDUERGX1N0cmVhbSogcE5ld0NvbnRlbnRzID0gcERvY3VtZW50LT5OZXdJbmRpcmVjdDxDUERGX1N0cmVhbT4oCiAgICAgICBudWxscHRyLCAwLAogICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4ocERvY3VtZW50LT5HZXRCeXRlU3RyaW5nUG9vbCgpKSk7Ci0gIENGWF9CeXRlU3RyaW5nIHNTdHJlYW07Ci0gIHNTdHJlYW0uRm9ybWF0KCJxIDEgMCAwIDEgMCAwIGNtIC8lcyBEbyBRIiwga2V5LmNfc3RyKCkpOworICBCeXRlU3RyaW5nIHNTdHJlYW0gPQorICAgICAgQnl0ZVN0cmluZzo6Rm9ybWF0KCJxIDEgMCAwIDEgMCAwIGNtIC8lcyBEbyBRIiwga2V5LmNfc3RyKCkpOwogICBwTmV3Q29udGVudHMtPlNldERhdGEoc1N0cmVhbS5yYXdfc3RyKCksIHNTdHJlYW0uR2V0TGVuZ3RoKCkpOwogICByZXR1cm4gcE5ld0NvbnRlbnRzLT5HZXRPYmpOdW0oKTsKIH0KIAotdm9pZCBTZXRQYWdlQ29udGVudHMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGtleSwKK3ZvaWQgU2V0UGFnZUNvbnRlbnRzKGNvbnN0IEJ5dGVTdHJpbmcmIGtleSwKICAgICAgICAgICAgICAgICAgICAgIENQREZfRGljdGlvbmFyeSogcFBhZ2UsCiAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQpIHsKICAgQ1BERl9BcnJheSogcENvbnRlbnRzQXJyYXkgPSBudWxscHRyOwpAQCAtMjA0LDEzICsxOTcsMTMgQEAKICAgcFBhZ2UtPkNvbnZlcnRUb0luZGlyZWN0T2JqZWN0Rm9yKCJDb250ZW50cyIsIHBEb2N1bWVudCk7CiAgIGlmICghcENvbnRlbnRzQXJyYXkpIHsKICAgICBwQ29udGVudHNBcnJheSA9IHBEb2N1bWVudC0+TmV3SW5kaXJlY3Q8Q1BERl9BcnJheT4oKTsKLSAgICBDUERGX1N0cmVhbUFjYyBhY2M7Ci0gICAgYWNjLkxvYWRBbGxEYXRhKHBDb250ZW50c1N0cmVhbSk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc1N0cmVhbSA9ICJxXG4iOwotICAgIENGWF9CeXRlU3RyaW5nIHNCb2R5ID0KLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcoKGNvbnN0IEZYX0NIQVIqKWFjYy5HZXREYXRhKCksIGFjYy5HZXRTaXplKCkpOworICAgIGF1dG8gcEFjYyA9IHBkZml1bTo6TWFrZVJldGFpbjxDUERGX1N0cmVhbUFjYz4ocENvbnRlbnRzU3RyZWFtKTsKKyAgICBwQWNjLT5Mb2FkQWxsRGF0YUZpbHRlcmVkKCk7CisgICAgQnl0ZVN0cmluZyBzU3RyZWFtID0gInFcbiI7CisgICAgQnl0ZVN0cmluZyBzQm9keSA9IEJ5dGVTdHJpbmcocEFjYy0+R2V0RGF0YSgpLCBwQWNjLT5HZXRTaXplKCkpOwogICAgIHNTdHJlYW0gPSBzU3RyZWFtICsgc0JvZHkgKyAiXG5RIjsKLSAgICBwQ29udGVudHNTdHJlYW0tPlNldERhdGEoc1N0cmVhbS5yYXdfc3RyKCksIHNTdHJlYW0uR2V0TGVuZ3RoKCkpOworICAgIHBDb250ZW50c1N0cmVhbS0+U2V0RGF0YUFuZFJlbW92ZUZpbHRlcihzU3RyZWFtLnJhd19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1N0cmVhbS5HZXRMZW5ndGgoKSk7CiAgICAgcENvbnRlbnRzQXJyYXktPkFkZE5ldzxDUERGX1JlZmVyZW5jZT4ocERvY3VtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZW50c1N0cmVhbS0+R2V0T2JqTnVtKCkpOwogICAgIHBQYWdlLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJDb250ZW50cyIsIHBEb2N1bWVudCwKQEAgLTIyOCwyNiArMjIxLDI2IEBACiAgIGlmIChyY1N0cmVhbS5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuIENGWF9NYXRyaXgoKTsKIAotICBtYXRyaXguVHJhbnNmb3JtUmVjdChyY1N0cmVhbSk7CisgIHJjU3RyZWFtID0gbWF0cml4LlRyYW5zZm9ybVJlY3QocmNTdHJlYW0pOwogICByY1N0cmVhbS5Ob3JtYWxpemUoKTsKIAotICBGWF9GTE9BVCBhID0gcmNBbm5vdC5XaWR0aCgpIC8gcmNTdHJlYW0uV2lkdGgoKTsKLSAgRlhfRkxPQVQgZCA9IHJjQW5ub3QuSGVpZ2h0KCkgLyByY1N0cmVhbS5IZWlnaHQoKTsKKyAgZmxvYXQgYSA9IHJjQW5ub3QuV2lkdGgoKSAvIHJjU3RyZWFtLldpZHRoKCk7CisgIGZsb2F0IGQgPSByY0Fubm90LkhlaWdodCgpIC8gcmNTdHJlYW0uSGVpZ2h0KCk7CiAKLSAgRlhfRkxPQVQgZSA9IHJjQW5ub3QubGVmdCAtIHJjU3RyZWFtLmxlZnQgKiBhOwotICBGWF9GTE9BVCBmID0gcmNBbm5vdC5ib3R0b20gLSByY1N0cmVhbS5ib3R0b20gKiBkOworICBmbG9hdCBlID0gcmNBbm5vdC5sZWZ0IC0gcmNTdHJlYW0ubGVmdCAqIGE7CisgIGZsb2F0IGYgPSByY0Fubm90LmJvdHRvbSAtIHJjU3RyZWFtLmJvdHRvbSAqIGQ7CiAgIHJldHVybiBDRlhfTWF0cml4KGEsIDAsIDAsIGQsIGUsIGYpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UKIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZQYWdlX0ZsYXR0ZW4oRlBERl9QQUdFIHBhZ2UsIGludCBuRmxhZykgeworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERlBhZ2VfRmxhdHRlbihGUERGX1BBR0UgcGFnZSwgaW50IG5GbGFnKSB7CiAgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKICAgaWYgKCFwYWdlKQogICAgIHJldHVybiBGTEFUVEVOX0ZBSUw7CiAKLSAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gcFBhZ2UtPm1fcERvY3VtZW50OwotICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBQYWdlLT5tX3BGb3JtRGljdDsKKyAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gcFBhZ2UtPm1fcERvY3VtZW50LkdldCgpOworICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBQYWdlLT5tX3BGb3JtRGljdC5HZXQoKTsKICAgaWYgKCFwRG9jdW1lbnQgfHwgIXBQYWdlRGljdCkKICAgICByZXR1cm4gRkxBVFRFTl9GQUlMOwogCkBAIC0zMDUsMTUgKzI5OCwxNiBAQAogICBpZiAoIXBQYWdlWE9iamVjdCkKICAgICBwUGFnZVhPYmplY3QgPSBwUmVzLT5TZXROZXdGb3I8Q1BERl9EaWN0aW9uYXJ5PigiWE9iamVjdCIpOwogCi0gIENGWF9CeXRlU3RyaW5nIGtleSA9ICIiOwotICBpbnQgblN0cmVhbXMgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludD4oT2JqZWN0QXJyYXkpOwotICBpZiAoblN0cmVhbXMgPiAwKSB7Ci0gICAgZm9yIChpbnQgaUtleSA9IDA7IC8qaUtleSA8IDEwMCovOyBpS2V5KyspIHsKLSAgICAgIGNoYXIgc0V4dGVuZFs1XSA9IHt9OwotICAgICAgRlhTWVNfaXRvYShpS2V5LCBzRXh0ZW5kLCAxMCk7Ci0gICAgICBrZXkgPSBDRlhfQnl0ZVN0cmluZygiRkZUIikgKyBDRlhfQnl0ZVN0cmluZyhzRXh0ZW5kKTsKLSAgICAgIGlmICghcFBhZ2VYT2JqZWN0LT5LZXlFeGlzdChrZXkpKQorICBCeXRlU3RyaW5nIGtleTsKKyAgaWYgKCFPYmplY3RBcnJheS5lbXB0eSgpKSB7CisgICAgaW50IGkgPSAwOworICAgIHdoaWxlIChpIDwgSU5UX01BWCkgeworICAgICAgQnl0ZVN0cmluZyBzS2V5ID0gQnl0ZVN0cmluZzo6Rm9ybWF0KCJGRlQlZCIsIGkpOworICAgICAgaWYgKCFwUGFnZVhPYmplY3QtPktleUV4aXN0KHNLZXkpKSB7CisgICAgICAgIGtleSA9IHNLZXk7CiAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgKytpOwogICAgIH0KICAgfQogCkBAIC0zMjcsMTIgKzMyMSwxMSBAQAogICAgIHBOZXdPWGJqZWN0RGljLT5TZXROZXdGb3I8Q1BERl9OYW1lPigiVHlwZSIsICJYT2JqZWN0Iik7CiAgICAgcE5ld09YYmplY3REaWMtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJTdWJ0eXBlIiwgIkZvcm0iKTsKICAgICBwTmV3T1hiamVjdERpYy0+U2V0TmV3Rm9yPENQREZfTnVtYmVyPigiRm9ybVR5cGUiLCAxKTsKLSAgICBwTmV3T1hiamVjdERpYy0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIk5hbWUiLCAiRlJNIik7CiAgICAgQ0ZYX0Zsb2F0UmVjdCByY0JCb3ggPSBwUGFnZURpY3QtPkdldFJlY3RGb3IoIkFydEJveCIpOwogICAgIHBOZXdPWGJqZWN0RGljLT5TZXRSZWN0Rm9yKCJCQm94IiwgcmNCQm94KTsKICAgfQogCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgblN0cmVhbXM7IGkrKykgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE9iamVjdEFycmF5LnNpemUoKTsgKytpKSB7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWMgPSBPYmplY3RBcnJheVtpXTsKICAgICBpZiAoIXBBbm5vdERpYykKICAgICAgIGNvbnRpbnVlOwpAQCAtMzQwLDcgKzMzMyw3IEBACiAgICAgQ0ZYX0Zsb2F0UmVjdCByY0Fubm90ID0gcEFubm90RGljLT5HZXRSZWN0Rm9yKCJSZWN0Iik7CiAgICAgcmNBbm5vdC5Ob3JtYWxpemUoKTsKIAotICAgIENGWF9CeXRlU3RyaW5nIHNBbm5vdFN0YXRlID0gcEFubm90RGljLT5HZXRTdHJpbmdGb3IoIkFTIik7CisgICAgQnl0ZVN0cmluZyBzQW5ub3RTdGF0ZSA9IHBBbm5vdERpYy0+R2V0U3RyaW5nRm9yKCJBUyIpOwogICAgIENQREZfRGljdGlvbmFyeSogcEFubm90QVAgPSBwQW5ub3REaWMtPkdldERpY3RGb3IoIkFQIik7CiAgICAgaWYgKCFwQW5ub3RBUCkKICAgICAgIGNvbnRpbnVlOwpAQCAtMzU0LDkgKzM0Nyw4IEBACiAgICAgICBpZiAoIXNBbm5vdFN0YXRlLklzRW1wdHkoKSkgewogICAgICAgICBwQVBTdHJlYW0gPSBwQVBEaWMtPkdldFN0cmVhbUZvcihzQW5ub3RTdGF0ZSk7CiAgICAgICB9IGVsc2UgewotICAgICAgICBhdXRvIGl0ID0gcEFQRGljLT5iZWdpbigpOwotICAgICAgICBpZiAoaXQgIT0gcEFQRGljLT5lbmQoKSkgewotICAgICAgICAgIENQREZfT2JqZWN0KiBwRmlyc3RPYmogPSBpdC0+c2Vjb25kLmdldCgpOworICAgICAgICBpZiAocEFQRGljLT5HZXRDb3VudCgpID4gMCkgeworICAgICAgICAgIENQREZfT2JqZWN0KiBwRmlyc3RPYmogPSBwQVBEaWMtPmJlZ2luKCktPnNlY29uZC5nZXQoKTsKICAgICAgICAgICBpZiAocEZpcnN0T2JqKSB7CiAgICAgICAgICAgICBpZiAocEZpcnN0T2JqLT5Jc1JlZmVyZW5jZSgpKQogICAgICAgICAgICAgICBwRmlyc3RPYmogPSBwRmlyc3RPYmotPkdldERpcmVjdCgpOwpAQCAtMzk3LDMyICszODksMTggQEAKICAgICBpZiAoIXBYT2JqZWN0KQogICAgICAgcFhPYmplY3QgPSBwTmV3WE9SZXMtPlNldE5ld0ZvcjxDUERGX0RpY3Rpb25hcnk+KCJYT2JqZWN0Iik7CiAKLSAgICBDRlhfQnl0ZVN0cmluZyBzRm9ybU5hbWU7Ci0gICAgc0Zvcm1OYW1lLkZvcm1hdCgiRiVkIiwgaSk7CisgICAgQnl0ZVN0cmluZyBzRm9ybU5hbWUgPSBCeXRlU3RyaW5nOjpGb3JtYXQoIkYlZCIsIGkpOwogICAgIHBYT2JqZWN0LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KHNGb3JtTmFtZSwgcERvY3VtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPYmotPkdldE9iak51bSgpKTsKIAotICAgIENQREZfU3RyZWFtQWNjIGFjYzsKLSAgICBhY2MuTG9hZEFsbERhdGEocE5ld1hPYmplY3QpOwotCi0gICAgY29uc3QgdWludDhfdCogcERhdGEgPSBhY2MuR2V0RGF0YSgpOwotICAgIENGWF9CeXRlU3RyaW5nIHNTdHJlYW0ocERhdGEsIGFjYy5HZXRTaXplKCkpOworICAgIGF1dG8gcEFjYyA9IHBkZml1bTo6TWFrZVJldGFpbjxDUERGX1N0cmVhbUFjYz4ocE5ld1hPYmplY3QpOworICAgIHBBY2MtPkxvYWRBbGxEYXRhRmlsdGVyZWQoKTsKKyAgICBCeXRlU3RyaW5nIHNTdHJlYW0ocEFjYy0+R2V0RGF0YSgpLCBwQWNjLT5HZXRTaXplKCkpOwogICAgIENGWF9NYXRyaXggbWF0cml4ID0gcEFQRGljLT5HZXRNYXRyaXhGb3IoIk1hdHJpeCIpOwotICAgIGlmIChtYXRyaXguSXNJZGVudGl0eSgpKSB7Ci0gICAgICBtYXRyaXguYSA9IDEuMGY7Ci0gICAgICBtYXRyaXguYiA9IDAuMGY7Ci0gICAgICBtYXRyaXguYyA9IDAuMGY7Ci0gICAgICBtYXRyaXguZCA9IDEuMGY7Ci0gICAgICBtYXRyaXguZSA9IDAuMGY7Ci0gICAgICBtYXRyaXguZiA9IDAuMGY7Ci0gICAgfQotCi0gICAgQ0ZYX0J5dGVTdHJpbmcgc1RlbXA7CiAgICAgQ0ZYX01hdHJpeCBtID0gR2V0TWF0cml4KHJjQW5ub3QsIHJjU3RyZWFtLCBtYXRyaXgpOwotICAgIHNUZW1wLkZvcm1hdCgicSAlZiAwIDAgJWYgJWYgJWYgY20gLyVzIERvIFFcbiIsIG0uYSwgbS5kLCBtLmUsIG0uZiwKLSAgICAgICAgICAgICAgICAgc0Zvcm1OYW1lLmNfc3RyKCkpOwotICAgIHNTdHJlYW0gKz0gc1RlbXA7Ci0gICAgcE5ld1hPYmplY3QtPlNldERhdGEoc1N0cmVhbS5yYXdfc3RyKCksIHNTdHJlYW0uR2V0TGVuZ3RoKCkpOworICAgIHNTdHJlYW0gKz0gQnl0ZVN0cmluZzo6Rm9ybWF0KCJxICVmIDAgMCAlZiAlZiAlZiBjbSAvJXMgRG8gUVxuIiwgbS5hLCBtLmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5lLCBtLmYsIHNGb3JtTmFtZS5jX3N0cigpKTsKKyAgICBwTmV3WE9iamVjdC0+U2V0RGF0YUFuZFJlbW92ZUZpbHRlcihzU3RyZWFtLnJhd19zdHIoKSwgc1N0cmVhbS5HZXRMZW5ndGgoKSk7CiAgIH0KICAgcFBhZ2VEaWN0LT5SZW1vdmVGb3IoIkFubm90cyIpOwogICByZXR1cm4gRkxBVFRFTl9TVUNDRVNTOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9mcGRmX2ZsYXR0ZW5fZW1iZWRkZXJ0ZXN0LmNwcCBiL2ZwZGZzZGsvZnBkZl9mbGF0dGVuX2VtYmVkZGVydGVzdC5jcHAKaW5kZXggZDcwOWY1OS4uYTg5MTVmZSAxMDA2NDQKLS0tIGEvZnBkZnNkay9mcGRmX2ZsYXR0ZW5fZW1iZWRkZXJ0ZXN0LmNwcAorKysgYi9mcGRmc2RrL2ZwZGZfZmxhdHRlbl9lbWJlZGRlcnRlc3QuY3BwCkBAIC0yLDcgKzIsNiBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKICNpbmNsdWRlICJwdWJsaWMvZnBkZl9mbGF0dGVuLmgiCiAjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCiAjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZfcHJvZ3Jlc3NpdmUuY3BwIGIvZnBkZnNkay9mcGRmX3Byb2dyZXNzaXZlLmNwcAppbmRleCBjYzA5ZDA3Li43MzBiYTQ4IDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZwZGZfcHJvZ3Jlc3NpdmUuY3BwCisrKyBiL2ZwZGZzZGsvZnBkZl9wcm9ncmVzc2l2ZS5jcHAKQEAgLTYsMTEgKzYsMTMgQEAKIAogI2luY2x1ZGUgInB1YmxpYy9mcGRmX3Byb2dyZXNzaXZlLmgiCiAKKyNpbmNsdWRlIDx1dGlsaXR5PgorCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2NwZGZfcGFnZXJlbmRlcmNvbnRleHQuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2UuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcHJvZ3Jlc3NpdmVyZW5kZXJlci5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9meGdlZGV2aWNlLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9kZWZhdWx0cmVuZGVyZGV2aWNlLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaCIKICNpbmNsdWRlICJmcGRmc2RrL2ZzZGtfZGVmaW5lLmgiCiAjaW5jbHVkZSAiZnBkZnNkay9mc2RrX3BhdXNlYWRhcHRlci5oIgpAQCAtMTgsMjUgKzIwLDI1IEBACiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogCiAvLyBUaGVzZSBjaGVja3MgYXJlIGhlcmUgYmVjYXVzZSBjb3JlLyBhbmQgcHVibGljLyBjYW5ub3QgZGVwZW5kIG9uIGVhY2ggb3RoZXIuCi1zdGF0aWNfYXNzZXJ0KENQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjo6UmVhZHkgPT0gRlBERl9SRU5ERVJfUkVBREVSLAorc3RhdGljX2Fzc2VydChDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI6OlJlYWR5ID09IEZQREZfUkVOREVSX1JFQURZLAogICAgICAgICAgICAgICAiQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjpSZWFkeSB2YWx1ZSBtaXNtYXRjaCIpOwogc3RhdGljX2Fzc2VydChDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI6OlRvQmVDb250aW51ZWQgPT0KLSAgICAgICAgICAgICAgICAgIEZQREZfUkVOREVSX1RPQkVDT1VOVElOVUVELAorICAgICAgICAgICAgICAgICAgRlBERl9SRU5ERVJfVE9CRUNPTlRJTlVFRCwKICAgICAgICAgICAgICAgIkNQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjo6VG9CZUNvbnRpbnVlZCB2YWx1ZSBtaXNtYXRjaCIpOwogc3RhdGljX2Fzc2VydChDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI6OkRvbmUgPT0gRlBERl9SRU5ERVJfRE9ORSwKICAgICAgICAgICAgICAgIkNQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjo6RG9uZSB2YWx1ZSBtaXNtYXRjaCIpOwogc3RhdGljX2Fzc2VydChDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI6OkZhaWxlZCA9PSBGUERGX1JFTkRFUl9GQUlMRUQsCiAgICAgICAgICAgICAgICJDUERGX1Byb2dyZXNzaXZlUmVuZGVyZXI6OkZhaWxlZCB2YWx1ZSBtaXNtYXRjaCIpOwogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9SZW5kZXJQYWdlQml0bWFwX1N0YXJ0KEZQREZfQklUTUFQIGJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlNES19QQVVTRSogcGF1c2UpIHsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZfUmVuZGVyUGFnZUJpdG1hcF9TdGFydChGUERGX0JJVE1BUCBiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGU0RLX1BBVVNFKiBwYXVzZSkgewogICBpZiAoIWJpdG1hcCB8fCAhcGF1c2UgfHwgcGF1c2UtPnZlcnNpb24gIT0gMSkKICAgICByZXR1cm4gRlBERl9SRU5ERVJfRkFJTEVEOwogCkBAIC00NCwxNyArNDYsMjQgQEAKICAgaWYgKCFwUGFnZSkKICAgICByZXR1cm4gRlBERl9SRU5ERVJfRkFJTEVEOwogCi0gIENQREZfUGFnZVJlbmRlckNvbnRleHQqIHBDb250ZXh0ID0gbmV3IENQREZfUGFnZVJlbmRlckNvbnRleHQ7Ci0gIHBQYWdlLT5TZXRSZW5kZXJDb250ZXh0KHBkZml1bTo6V3JhcFVuaXF1ZShwQ29udGV4dCkpOwotICBDRlhfRnhnZURldmljZSogcERldmljZSA9IG5ldyBDRlhfRnhnZURldmljZTsKLSAgcENvbnRleHQtPm1fcERldmljZS5yZXNldChwRGV2aWNlKTsKLSAgQ0ZYX0RJQml0bWFwKiBwQml0bWFwID0gQ0ZYQml0bWFwRnJvbUZQREZCaXRtYXAoYml0bWFwKTsKKyAgYXV0byBwT3duZWRDb250ZXh0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfUGFnZVJlbmRlckNvbnRleHQ+KCk7CisgIENQREZfUGFnZVJlbmRlckNvbnRleHQqIHBDb250ZXh0ID0gcE93bmVkQ29udGV4dC5nZXQoKTsKKyAgcFBhZ2UtPlNldFJlbmRlckNvbnRleHQoc3RkOjptb3ZlKHBPd25lZENvbnRleHQpKTsKKworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwQml0bWFwKENGWEJpdG1hcEZyb21GUERGQml0bWFwKGJpdG1hcCkpOworICBhdXRvIHBPd25lZERldmljZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfRGVmYXVsdFJlbmRlckRldmljZT4oKTsKKyAgQ0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2UqIHBEZXZpY2UgPSBwT3duZWREZXZpY2UuZ2V0KCk7CisgIHBDb250ZXh0LT5tX3BEZXZpY2UgPSBzdGQ6Om1vdmUocE93bmVkRGV2aWNlKTsKICAgcERldmljZS0+QXR0YWNoKHBCaXRtYXAsICEhKGZsYWdzICYgRlBERl9SRVZFUlNFX0JZVEVfT1JERVIpLCBudWxscHRyLCBmYWxzZSk7CiAKICAgSUZTREtfUEFVU0VfQWRhcHRlciBJUGF1c2VBZGFwdGVyKHBhdXNlKTsKICAgRlBERl9SZW5kZXJQYWdlX1JldGFpbChwQ29udGV4dCwgcGFnZSwgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlLCBmbGFncywgZmFsc2UsICZJUGF1c2VBZGFwdGVyKTsKIAorI2lmZGVmIF9TS0lBX1NVUFBPUlRfUEFUSFNfCisgIHBEZXZpY2UtPkZsdXNoKGZhbHNlKTsKKyAgcEJpdG1hcC0+VW5QcmVNdWx0aXBseSgpOworI2VuZGlmCiAgIGlmIChwQ29udGV4dC0+bV9wUmVuZGVyZXIpIHsKICAgICByZXR1cm4gQ1BERl9Qcm9ncmVzc2l2ZVJlbmRlcmVyOjpUb0ZQREZTdGF0dXMoCiAgICAgICAgIHBDb250ZXh0LT5tX3BSZW5kZXJlci0+R2V0U3RhdHVzKCkpOwpAQCAtNjIsOCArNzEsOCBAQAogICByZXR1cm4gRlBERl9SRU5ERVJfRkFJTEVEOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9SZW5kZXJQYWdlX0NvbnRpbnVlKEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlNES19QQVVTRSogcGF1c2UpIHsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZfUmVuZGVyUGFnZV9Db250aW51ZShGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlNES19QQVVTRSogcGF1c2UpIHsKICAgaWYgKCFwYXVzZSB8fCBwYXVzZS0+dmVyc2lvbiAhPSAxKQogICAgIHJldHVybiBGUERGX1JFTkRFUl9GQUlMRUQ7CiAKQEAgLTc1LDIxICs4NCwyOCBAQAogICBpZiAocENvbnRleHQgJiYgcENvbnRleHQtPm1fcFJlbmRlcmVyKSB7CiAgICAgSUZTREtfUEFVU0VfQWRhcHRlciBJUGF1c2VBZGFwdGVyKHBhdXNlKTsKICAgICBwQ29udGV4dC0+bV9wUmVuZGVyZXItPkNvbnRpbnVlKCZJUGF1c2VBZGFwdGVyKTsKKyNpZmRlZiBfU0tJQV9TVVBQT1JUX1BBVEhTXworICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UgPSBwQ29udGV4dC0+bV9wRGV2aWNlLmdldCgpOworICAgIHBEZXZpY2UtPkZsdXNoKGZhbHNlKTsKKyAgICBwRGV2aWNlLT5HZXRCaXRtYXAoKS0+VW5QcmVNdWx0aXBseSgpOworI2VuZGlmCiAgICAgcmV0dXJuIENQREZfUHJvZ3Jlc3NpdmVSZW5kZXJlcjo6VG9GUERGU3RhdHVzKAogICAgICAgICBwQ29udGV4dC0+bV9wUmVuZGVyZXItPkdldFN0YXR1cygpKTsKICAgfQogICByZXR1cm4gRlBERl9SRU5ERVJfRkFJTEVEOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZV9DbG9zZShGUERGX1BBR0UgcGFnZSkgeworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZfUmVuZGVyUGFnZV9DbG9zZShGUERGX1BBR0UgcGFnZSkgewogICBDUERGX1BhZ2UqIHBQYWdlID0gQ1BERlBhZ2VGcm9tRlBERlBhZ2UocGFnZSk7Ci0gIGlmICghcFBhZ2UpCi0gICAgcmV0dXJuOwotCi0gIENQREZfUGFnZVJlbmRlckNvbnRleHQqIHBDb250ZXh0ID0gcFBhZ2UtPkdldFJlbmRlckNvbnRleHQoKTsKLSAgaWYgKCFwQ29udGV4dCkKLSAgICByZXR1cm47Ci0KLSAgcENvbnRleHQtPm1fcERldmljZS0+UmVzdG9yZVN0YXRlKGZhbHNlKTsKLSAgcFBhZ2UtPlNldFJlbmRlckNvbnRleHQobnVsbHB0cik7CisgIGlmIChwUGFnZSkgeworI2lmZGVmIF9TS0lBX1NVUFBPUlRfUEFUSFNfCisgICAgQ1BERl9QYWdlUmVuZGVyQ29udGV4dCogcENvbnRleHQgPSBwUGFnZS0+R2V0UmVuZGVyQ29udGV4dCgpOworICAgIGlmIChwQ29udGV4dCAmJiBwQ29udGV4dC0+bV9wUmVuZGVyZXIpIHsKKyAgICAgIENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UgPSBwQ29udGV4dC0+bV9wRGV2aWNlLmdldCgpOworICAgICAgcERldmljZS0+Rmx1c2godHJ1ZSk7CisgICAgICBwRGV2aWNlLT5HZXRCaXRtYXAoKS0+VW5QcmVNdWx0aXBseSgpOworICAgIH0KKyNlbmRpZgorICAgIHBQYWdlLT5TZXRSZW5kZXJDb250ZXh0KG51bGxwdHIpOworICB9CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZfc2VhcmNoZXguY3BwIGIvZnBkZnNkay9mcGRmX3NlYXJjaGV4LmNwcAppbmRleCBmODJkYjM3Li45ZDQ4Y2ViIDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZwZGZfc2VhcmNoZXguY3BwCisrKyBiL2ZwZGZzZGsvZnBkZl9zZWFyY2hleC5jcHAKQEAgLTgsMTAgKzgsMTggQEAKIAogI2luY2x1ZGUgImNvcmUvZnBkZnRleHQvY3BkZl90ZXh0cGFnZS5oIgogCi1ETExFWFBPUlQgaW50IFNURENBTEwKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WCiBGUERGVGV4dF9HZXRDaGFySW5kZXhGcm9tVGV4dEluZGV4KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLCBpbnQgblRleHRJbmRleCkgewogICBpZiAoIXRleHRfcGFnZSkKICAgICByZXR1cm4gLTE7CiAgIHJldHVybiBzdGF0aWNfY2FzdDxDUERGX1RleHRQYWdlKj4odGV4dF9wYWdlKQogICAgICAgLT5DaGFySW5kZXhGcm9tVGV4dEluZGV4KG5UZXh0SW5kZXgpOwogfQorCitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OVgorRlBERlRleHRfR2V0VGV4dEluZGV4RnJvbUNoYXJJbmRleChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwgaW50IG5DaGFySW5kZXgpIHsKKyAgaWYgKCF0ZXh0X3BhZ2UpCisgICAgcmV0dXJuIC0xOworICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1BERl9UZXh0UGFnZSo+KHRleHRfcGFnZSktPlRleHRJbmRleEZyb21DaGFySW5kZXgoCisgICAgICBuQ2hhckluZGV4KTsKK30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnBkZl9zdHJ1Y3R0cmVlLmNwcCBiL2ZwZGZzZGsvZnBkZl9zdHJ1Y3R0cmVlLmNwcAppbmRleCA1YTkyMmExLi42NzY4MjRlIDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZwZGZfc3RydWN0dHJlZS5jcHAKKysrIGIvZnBkZnNkay9mcGRmX3N0cnVjdHRyZWUuY3BwCkBAIC04LDgyICs4LDEyNCBAQAogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvZnBkZl90YWdnZWQuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9zdHJ1Y3RlbGVtZW50LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfc3RydWN0dHJlZS5oIgogI2luY2x1ZGUgImZwZGZzZGsvZnNka19kZWZpbmUuaCIKIAogbmFtZXNwYWNlIHsKIAotSVBERl9TdHJ1Y3RUcmVlKiBUb1N0cnVjdFRyZWUoRlBERl9TVFJVQ1RUUkVFIHN0cnVjdF90cmVlKSB7Ci0gIHJldHVybiByZWludGVycHJldF9jYXN0PElQREZfU3RydWN0VHJlZSo+KHN0cnVjdF90cmVlKTsKK0NQREZfU3RydWN0VHJlZSogVG9TdHJ1Y3RUcmVlKEZQREZfU1RSVUNUVFJFRSBzdHJ1Y3RfdHJlZSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1BERl9TdHJ1Y3RUcmVlKj4oc3RydWN0X3RyZWUpOwogfQogCi1JUERGX1N0cnVjdEVsZW1lbnQqIFRvU3RydWN0VHJlZUVsZW1lbnQoRlBERl9TVFJVQ1RFTEVNRU5UIHN0cnVjdF9lbGVtZW50KSB7Ci0gIHJldHVybiByZWludGVycHJldF9jYXN0PElQREZfU3RydWN0RWxlbWVudCo+KHN0cnVjdF9lbGVtZW50KTsKK0NQREZfU3RydWN0RWxlbWVudCogVG9TdHJ1Y3RUcmVlRWxlbWVudChGUERGX1NUUlVDVEVMRU1FTlQgc3RydWN0X2VsZW1lbnQpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PENQREZfU3RydWN0RWxlbWVudCo+KHN0cnVjdF9lbGVtZW50KTsKK30KKwordW5zaWduZWQgbG9uZyBXaWRlU3RyaW5nVG9CdWZmZXIoY29uc3QgV2lkZVN0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZsZW4pIHsKKyAgaWYgKHN0ci5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIDA7CisKKyAgQnl0ZVN0cmluZyBlbmNvZGVkU3RyID0gc3RyLlVURjE2TEVfRW5jb2RlKCk7CisgIGNvbnN0IHVuc2lnbmVkIGxvbmcgbGVuID0gZW5jb2RlZFN0ci5HZXRMZW5ndGgoKTsKKyAgaWYgKGJ1ZmZlciAmJiBsZW4gPD0gYnVmbGVuKQorICAgIG1lbWNweShidWZmZXIsIGVuY29kZWRTdHIuY19zdHIoKSwgbGVuKTsKKyAgcmV0dXJuIGxlbjsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCiAKLURMTEVYUE9SVCBGUERGX1NUUlVDVFRSRUUgU1REQ0FMTCBGUERGX1N0cnVjdFRyZWVfR2V0Rm9yUGFnZShGUERGX1BBR0UgcGFnZSkgeworRlBERl9FWFBPUlQgRlBERl9TVFJVQ1RUUkVFIEZQREZfQ0FMTENPTlYKK0ZQREZfU3RydWN0VHJlZV9HZXRGb3JQYWdlKEZQREZfUEFHRSBwYWdlKSB7CiAgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKICAgaWYgKCFwUGFnZSkKICAgICByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIElQREZfU3RydWN0VHJlZTo6TG9hZFBhZ2UocFBhZ2UtPm1fcERvY3VtZW50LCBwUGFnZS0+bV9wRm9ybURpY3QpCisgIHJldHVybiBDUERGX1N0cnVjdFRyZWU6OkxvYWRQYWdlKHBQYWdlLT5tX3BEb2N1bWVudC5HZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhZ2UtPm1fcEZvcm1EaWN0LkdldCgpKQogICAgICAgLnJlbGVhc2UoKTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1N0cnVjdFRyZWVfQ2xvc2UoRlBERl9TVFJVQ1RUUkVFIHN0cnVjdF90cmVlKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxJUERGX1N0cnVjdFRyZWU+KFRvU3RydWN0VHJlZShzdHJ1Y3RfdHJlZSkpOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WCitGUERGX1N0cnVjdFRyZWVfQ2xvc2UoRlBERl9TVFJVQ1RUUkVFIHN0cnVjdF90cmVlKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1N0cnVjdFRyZWU+KFRvU3RydWN0VHJlZShzdHJ1Y3RfdHJlZSkpOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WCiBGUERGX1N0cnVjdFRyZWVfQ291bnRDaGlsZHJlbihGUERGX1NUUlVDVFRSRUUgc3RydWN0X3RyZWUpIHsKLSAgSVBERl9TdHJ1Y3RUcmVlKiB0cmVlID0gVG9TdHJ1Y3RUcmVlKHN0cnVjdF90cmVlKTsKLSAgcmV0dXJuIHRyZWUgPyB0cmVlLT5Db3VudFRvcEVsZW1lbnRzKCkgOiAtMTsKKyAgQ1BERl9TdHJ1Y3RUcmVlKiB0cmVlID0gVG9TdHJ1Y3RUcmVlKHN0cnVjdF90cmVlKTsKKyAgaWYgKCF0cmVlKQorICAgIHJldHVybiAtMTsKKworICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPGludD4gdG1wX3NpemUgPSB0cmVlLT5Db3VudFRvcEVsZW1lbnRzKCk7CisgIHJldHVybiB0bXBfc2l6ZS5WYWx1ZU9yRGVmYXVsdCgtMSk7CiB9CiAKLURMTEVYUE9SVCBGUERGX1NUUlVDVEVMRU1FTlQgU1REQ0FMTAorRlBERl9FWFBPUlQgRlBERl9TVFJVQ1RFTEVNRU5UIEZQREZfQ0FMTENPTlYKIEZQREZfU3RydWN0VHJlZV9HZXRDaGlsZEF0SW5kZXgoRlBERl9TVFJVQ1RUUkVFIHN0cnVjdF90cmVlLCBpbnQgaW5kZXgpIHsKLSAgSVBERl9TdHJ1Y3RUcmVlKiB0cmVlID0gVG9TdHJ1Y3RUcmVlKHN0cnVjdF90cmVlKTsKLSAgaWYgKCF0cmVlIHx8IGluZGV4IDwgMCB8fCBpbmRleCA+PSB0cmVlLT5Db3VudFRvcEVsZW1lbnRzKCkpCisgIENQREZfU3RydWN0VHJlZSogdHJlZSA9IFRvU3RydWN0VHJlZShzdHJ1Y3RfdHJlZSk7CisgIGlmICghdHJlZSB8fCBpbmRleCA8IDAgfHwKKyAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4oaW5kZXgpID49IHRyZWUtPkNvdW50VG9wRWxlbWVudHMoKSkgewogICAgIHJldHVybiBudWxscHRyOwotICByZXR1cm4gdHJlZS0+R2V0VG9wRWxlbWVudChpbmRleCk7CisgIH0KKyAgcmV0dXJuIHRyZWUtPkdldFRvcEVsZW1lbnQoc3RhdGljX2Nhc3Q8c2l6ZV90PihpbmRleCkpOwogfQogCi1ETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMCitGUERGX0VYUE9SVCB1bnNpZ25lZCBsb25nIEZQREZfQ0FMTENPTlYKIEZQREZfU3RydWN0RWxlbWVudF9HZXRBbHRUZXh0KEZQREZfU1RSVUNURUxFTUVOVCBzdHJ1Y3RfZWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmbGVuKSB7Ci0gIElQREZfU3RydWN0RWxlbWVudCogZWxlbSA9IFRvU3RydWN0VHJlZUVsZW1lbnQoc3RydWN0X2VsZW1lbnQpOwotICBpZiAoIWVsZW0pCi0gICAgcmV0dXJuIDA7Ci0KLSAgQ1BERl9EaWN0aW9uYXJ5KiBkaWN0ID0gZWxlbS0+R2V0RGljdCgpOwotICBpZiAoIWRpY3QpCi0gICAgcmV0dXJuIDA7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgc3RyID0gZWxlbS0+R2V0RGljdCgpLT5HZXRVbmljb2RlVGV4dEZvcigiQWx0Iik7Ci0gIGlmIChzdHIuSXNFbXB0eSgpKQotICAgIHJldHVybiAwOwotCi0gIENGWF9CeXRlU3RyaW5nIGVuY29kZWRTdHIgPSBzdHIuVVRGMTZMRV9FbmNvZGUoKTsKLSAgY29uc3QgdW5zaWduZWQgbG9uZyBsZW4gPSBlbmNvZGVkU3RyLkdldExlbmd0aCgpOwotICBpZiAoYnVmZmVyICYmIGxlbiA8PSBidWZsZW4pCi0gICAgRlhTWVNfbWVtY3B5KGJ1ZmZlciwgZW5jb2RlZFN0ci5jX3N0cigpLCBsZW4pOwotICByZXR1cm4gbGVuOworICBDUERGX1N0cnVjdEVsZW1lbnQqIGVsZW0gPSBUb1N0cnVjdFRyZWVFbGVtZW50KHN0cnVjdF9lbGVtZW50KTsKKyAgcmV0dXJuIChlbGVtICYmIGVsZW0tPkdldERpY3QoKSkKKyAgICAgICAgICAgICA/IFdpZGVTdHJpbmdUb0J1ZmZlcihlbGVtLT5HZXREaWN0KCktPkdldFVuaWNvZGVUZXh0Rm9yKCJBbHQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmxlbikKKyAgICAgICAgICAgICA6IDA7CiB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTAorRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYKK0ZQREZfU3RydWN0RWxlbWVudF9HZXRNYXJrZWRDb250ZW50SUQoRlBERl9TVFJVQ1RFTEVNRU5UIHN0cnVjdF9lbGVtZW50KSB7CisgIENQREZfU3RydWN0RWxlbWVudCogZWxlbSA9IFRvU3RydWN0VHJlZUVsZW1lbnQoc3RydWN0X2VsZW1lbnQpOworICBDUERGX09iamVjdCogcCA9CisgICAgICAoZWxlbSAmJiBlbGVtLT5HZXREaWN0KCkpID8gZWxlbS0+R2V0RGljdCgpLT5HZXRPYmplY3RGb3IoIksiKSA6IG51bGxwdHI7CisgIHJldHVybiBwICYmIHAtPklzTnVtYmVyKCkgPyBwLT5HZXRJbnRlZ2VyKCkgOiAtMTsKK30KKworRlBERl9FWFBPUlQgdW5zaWduZWQgbG9uZyBGUERGX0NBTExDT05WCitGUERGX1N0cnVjdEVsZW1lbnRfR2V0VHlwZShGUERGX1NUUlVDVEVMRU1FTlQgc3RydWN0X2VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1ZmxlbikgeworICBDUERGX1N0cnVjdEVsZW1lbnQqIGVsZW0gPSBUb1N0cnVjdFRyZWVFbGVtZW50KHN0cnVjdF9lbGVtZW50KTsKKyAgcmV0dXJuIGVsZW0gPyBXaWRlU3RyaW5nVG9CdWZmZXIoZWxlbS0+R2V0VHlwZSgpLlVURjhEZWNvZGUoKSwgYnVmZmVyLCBidWZsZW4pCisgICAgICAgICAgICAgIDogMDsKK30KKworRlBERl9FWFBPUlQgdW5zaWduZWQgbG9uZyBGUERGX0NBTExDT05WCitGUERGX1N0cnVjdEVsZW1lbnRfR2V0VGl0bGUoRlBERl9TVFJVQ1RFTEVNRU5UIHN0cnVjdF9lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1ZmxlbikgeworICBDUERGX1N0cnVjdEVsZW1lbnQqIGVsZW0gPSBUb1N0cnVjdFRyZWVFbGVtZW50KHN0cnVjdF9lbGVtZW50KTsKKyAgcmV0dXJuIGVsZW0KKyAgICAgICAgICAgICA/IFdpZGVTdHJpbmdUb0J1ZmZlcihlbGVtLT5HZXRUaXRsZSgpLlVURjhEZWNvZGUoKSwgYnVmZmVyLCBidWZsZW4pCisgICAgICAgICAgICAgOiAwOworfQorCitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OVgogRlBERl9TdHJ1Y3RFbGVtZW50X0NvdW50Q2hpbGRyZW4oRlBERl9TVFJVQ1RFTEVNRU5UIHN0cnVjdF9lbGVtZW50KSB7Ci0gIElQREZfU3RydWN0RWxlbWVudCogZWxlbSA9IFRvU3RydWN0VHJlZUVsZW1lbnQoc3RydWN0X2VsZW1lbnQpOwotICByZXR1cm4gZWxlbSA/IGVsZW0tPkNvdW50S2lkcygpIDogLTE7CisgIENQREZfU3RydWN0RWxlbWVudCogZWxlbSA9IFRvU3RydWN0VHJlZUVsZW1lbnQoc3RydWN0X2VsZW1lbnQpOworICBpZiAoIWVsZW0pCisgICAgcmV0dXJuIC0xOworCisgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8aW50PiB0bXBfc2l6ZSA9IGVsZW0tPkNvdW50S2lkcygpOworICByZXR1cm4gdG1wX3NpemUuVmFsdWVPckRlZmF1bHQoLTEpOwogfQogCi1ETExFWFBPUlQgRlBERl9TVFJVQ1RFTEVNRU5UIFNURENBTEwKK0ZQREZfRVhQT1JUIEZQREZfU1RSVUNURUxFTUVOVCBGUERGX0NBTExDT05WCiBGUERGX1N0cnVjdEVsZW1lbnRfR2V0Q2hpbGRBdEluZGV4KEZQREZfU1RSVUNURUxFTUVOVCBzdHJ1Y3RfZWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSB7Ci0gIElQREZfU3RydWN0RWxlbWVudCogZWxlbSA9IFRvU3RydWN0VHJlZUVsZW1lbnQoc3RydWN0X2VsZW1lbnQpOwotICBpZiAoIWVsZW0gfHwgaW5kZXggPCAwIHx8IGluZGV4ID49IGVsZW0tPkNvdW50S2lkcygpKQorICBDUERGX1N0cnVjdEVsZW1lbnQqIGVsZW0gPSBUb1N0cnVjdFRyZWVFbGVtZW50KHN0cnVjdF9lbGVtZW50KTsKKyAgaWYgKCFlbGVtIHx8IGluZGV4IDwgMCB8fCBzdGF0aWNfY2FzdDxzaXplX3Q+KGluZGV4KSA+PSBlbGVtLT5Db3VudEtpZHMoKSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAotICByZXR1cm4gZWxlbS0+R2V0S2lkSWZFbGVtZW50KGluZGV4KTsKKyAgcmV0dXJuIGVsZW0tPkdldEtpZElmRWxlbWVudChzdGF0aWNfY2FzdDxzaXplX3Q+KGluZGV4KSk7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZfc3RydWN0dHJlZV9lbWJlZGRlcnRlc3QuY3BwIGIvZnBkZnNkay9mcGRmX3N0cnVjdHRyZWVfZW1iZWRkZXJ0ZXN0LmNwcAppbmRleCA1OGIzMTcyLi43Y2E4MWY3IDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZwZGZfc3RydWN0dHJlZV9lbWJlZGRlcnRlc3QuY3BwCisrKyBiL2ZwZGZzZGsvZnBkZl9zdHJ1Y3R0cmVlX2VtYmVkZGVydGVzdC5jcHAKQEAgLTYsOCArNiw5IEBACiAjaW5jbHVkZSAicHVibGljL2ZwZGZfc3RydWN0dHJlZS5oIgogI2luY2x1ZGUgInRlc3RpbmcvZW1iZWRkZXJfdGVzdC5oIgogI2luY2x1ZGUgInRlc3RpbmcvdGVzdF9zdXBwb3J0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9vcHRpb25hbC5oIgogCi1jbGFzcyBGUERGU3RydWN0VHJlZUVtYmVkZGVydGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3QsIHB1YmxpYyBUZXN0U2F2ZXIge307CitjbGFzcyBGUERGU3RydWN0VHJlZUVtYmVkZGVydGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3Qge307CiAKIFRFU1RfRihGUERGU3RydWN0VHJlZUVtYmVkZGVydGVzdCwgR2V0QWx0VGV4dCkgewogICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInRhZ2dlZF9hbHRfdGV4dC5wZGYiKSk7CkBAIC0yNCw2ICsyNSw3IEBACiAgIEVYUEVDVF9FUShudWxscHRyLCBlbGVtZW50KTsKICAgZWxlbWVudCA9IEZQREZfU3RydWN0VHJlZV9HZXRDaGlsZEF0SW5kZXgoc3RydWN0X3RyZWUsIDApOwogICBBU1NFUlRfTkUobnVsbHB0ciwgZWxlbWVudCk7CisgIEVYUEVDVF9FUSgtMSwgRlBERl9TdHJ1Y3RFbGVtZW50X0dldE1hcmtlZENvbnRlbnRJRChlbGVtZW50KSk7CiAgIEVYUEVDVF9FUSgwVSwgRlBERl9TdHJ1Y3RFbGVtZW50X0dldEFsdFRleHQoZWxlbWVudCwgbnVsbHB0ciwgMCkpOwogCiAgIEFTU0VSVF9FUSgxLCBGUERGX1N0cnVjdEVsZW1lbnRfQ291bnRDaGlsZHJlbihlbGVtZW50KSk7CkBAIC0zNCw2ICszNiw3IEBACiAgIEVYUEVDVF9FUShudWxscHRyLCBjaGlsZF9lbGVtZW50KTsKICAgY2hpbGRfZWxlbWVudCA9IEZQREZfU3RydWN0RWxlbWVudF9HZXRDaGlsZEF0SW5kZXgoZWxlbWVudCwgMCk7CiAgIEFTU0VSVF9ORShudWxscHRyLCBjaGlsZF9lbGVtZW50KTsKKyAgRVhQRUNUX0VRKC0xLCBGUERGX1N0cnVjdEVsZW1lbnRfR2V0TWFya2VkQ29udGVudElEKGNoaWxkX2VsZW1lbnQpKTsKICAgRVhQRUNUX0VRKDBVLCBGUERGX1N0cnVjdEVsZW1lbnRfR2V0QWx0VGV4dChjaGlsZF9lbGVtZW50LCBudWxscHRyLCAwKSk7CiAKICAgQVNTRVJUX0VRKDEsIEZQREZfU3RydWN0RWxlbWVudF9Db3VudENoaWxkcmVuKGNoaWxkX2VsZW1lbnQpKTsKQEAgLTQ0LDYgKzQ3LDcgQEAKICAgRVhQRUNUX0VRKG51bGxwdHIsIGdjaGlsZF9lbGVtZW50KTsKICAgZ2NoaWxkX2VsZW1lbnQgPSBGUERGX1N0cnVjdEVsZW1lbnRfR2V0Q2hpbGRBdEluZGV4KGNoaWxkX2VsZW1lbnQsIDApOwogICBBU1NFUlRfTkUobnVsbHB0ciwgZ2NoaWxkX2VsZW1lbnQpOworICBFWFBFQ1RfRVEoLTEsIEZQREZfU3RydWN0RWxlbWVudF9HZXRNYXJrZWRDb250ZW50SUQoZ2NoaWxkX2VsZW1lbnQpKTsKICAgQVNTRVJUX0VRKDI0VSwgRlBERl9TdHJ1Y3RFbGVtZW50X0dldEFsdFRleHQoZ2NoaWxkX2VsZW1lbnQsIG51bGxwdHIsIDApKTsKIAogICB1bnNpZ25lZCBzaG9ydCBidWZmZXJbMTJdOwpAQCAtNTQsMTEgKzU4LDEyIEBACiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGJ1ZmZlcik7ICsraSkKICAgICBFWFBFQ1RfRVEoMFUsIGJ1ZmZlcltpXSk7CiAKKyAgRVhQRUNUX0VRKC0xLCBGUERGX1N0cnVjdEVsZW1lbnRfR2V0TWFya2VkQ29udGVudElEKGdjaGlsZF9lbGVtZW50KSk7CiAgIEFTU0VSVF9FUSgyNFUsIEZQREZfU3RydWN0RWxlbWVudF9HZXRBbHRUZXh0KGdjaGlsZF9lbGVtZW50LCBidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihidWZmZXIpKSk7Ci0gIGNvbnN0IEZYX1dDSEFSIGtFeHBlY3RlZFtdID0gTCJCbGFjayBJbWFnZSI7Ci0gIEVYUEVDVF9FUShDRlhfV2lkZVN0cmluZyhrRXhwZWN0ZWQpLAotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKGJ1ZmZlciwgRlhTWVNfbGVuKGtFeHBlY3RlZCkpKTsKKyAgY29uc3Qgd2NoYXJfdCBrRXhwZWN0ZWRbXSA9IEwiQmxhY2sgSW1hZ2UiOworICBFWFBFQ1RfRVEoV2lkZVN0cmluZyhrRXhwZWN0ZWQpLAorICAgICAgICAgICAgV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoYnVmZmVyLCBGWFNZU19sZW4oa0V4cGVjdGVkKSkpOwogCiAgIEFTU0VSVF9FUSgxLCBGUERGX1N0cnVjdEVsZW1lbnRfQ291bnRDaGlsZHJlbihnY2hpbGRfZWxlbWVudCkpOwogICBGUERGX1NUUlVDVEVMRU1FTlQgZ2djaGlsZF9lbGVtZW50ID0KQEAgLTY4LDMgKzczLDQ4IEBACiAgIEZQREZfU3RydWN0VHJlZV9DbG9zZShzdHJ1Y3RfdHJlZSk7CiAgIEZQREZfQ2xvc2VQYWdlKHBhZ2UpOwogfQorCitURVNUX0YoRlBERlN0cnVjdFRyZWVFbWJlZGRlcnRlc3QsIEdldE1hcmtlZENvbnRlbnRJRCkgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoIm1hcmtlZF9jb250ZW50X2lkLnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkUGFnZSgwKTsKKyAgQVNTRVJUX1RSVUUocGFnZSk7CisKKyAgRlBERl9TVFJVQ1RUUkVFIHN0cnVjdF90cmVlID0gRlBERl9TdHJ1Y3RUcmVlX0dldEZvclBhZ2UocGFnZSk7CisgIEFTU0VSVF9UUlVFKHN0cnVjdF90cmVlKTsKKyAgQVNTRVJUX0VRKDEsIEZQREZfU3RydWN0VHJlZV9Db3VudENoaWxkcmVuKHN0cnVjdF90cmVlKSk7CisKKyAgRlBERl9TVFJVQ1RFTEVNRU5UIGVsZW1lbnQgPSBGUERGX1N0cnVjdFRyZWVfR2V0Q2hpbGRBdEluZGV4KHN0cnVjdF90cmVlLCAwKTsKKyAgRVhQRUNUX0VRKDAsIEZQREZfU3RydWN0RWxlbWVudF9HZXRNYXJrZWRDb250ZW50SUQoZWxlbWVudCkpOworCisgIEZQREZfU3RydWN0VHJlZV9DbG9zZShzdHJ1Y3RfdHJlZSk7CisgIEZQREZfQ2xvc2VQYWdlKHBhZ2UpOworfQorCitURVNUX0YoRlBERlN0cnVjdFRyZWVFbWJlZGRlcnRlc3QsIEdldFR5cGUpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJ0YWdnZWRfYWx0X3RleHQucGRmIikpOworICBGUERGX1BBR0UgcGFnZSA9IExvYWRQYWdlKDApOworICBBU1NFUlRfVFJVRShwYWdlKTsKKworICBGUERGX1NUUlVDVFRSRUUgc3RydWN0X3RyZWUgPSBGUERGX1N0cnVjdFRyZWVfR2V0Rm9yUGFnZShwYWdlKTsKKyAgQVNTRVJUX1RSVUUoc3RydWN0X3RyZWUpOworICBBU1NFUlRfRVEoMSwgRlBERl9TdHJ1Y3RUcmVlX0NvdW50Q2hpbGRyZW4oc3RydWN0X3RyZWUpKTsKKworICBGUERGX1NUUlVDVEVMRU1FTlQgZWxlbWVudCA9IEZQREZfU3RydWN0VHJlZV9HZXRDaGlsZEF0SW5kZXgoc3RydWN0X3RyZWUsIDApOworICBBU1NFUlRfTkUobnVsbHB0ciwgZWxlbWVudCk7CisKKyAgdW5zaWduZWQgc2hvcnQgYnVmZmVyWzEyXTsKKyAgbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKGJ1ZmZlcikpOworICAvLyBEZWxpYmVyYXRlbHkgcGFzcyBpbiBhIHNtYWxsIGJ1ZmZlciBzaXplIHRvIG1ha2Ugc3VyZSB8YnVmZmVyfCByZW1haW5zCisgIC8vIHVudG91Y2hlZC4KKyAgQVNTRVJUX0VRKDE4VSwgRlBERl9TdHJ1Y3RFbGVtZW50X0dldFR5cGUoZWxlbWVudCwgYnVmZmVyLCAxKSk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGJ1ZmZlcik7ICsraSkKKyAgICBFWFBFQ1RfRVEoMFUsIGJ1ZmZlcltpXSk7CisKKyAgQVNTRVJUX0VRKDE4VSwgRlBERl9TdHJ1Y3RFbGVtZW50X0dldFR5cGUoZWxlbWVudCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkpOworICBjb25zdCB3Y2hhcl90IGtFeHBlY3RlZFtdID0gTCJEb2N1bWVudCI7CisgIEVYUEVDVF9FUShXaWRlU3RyaW5nKGtFeHBlY3RlZCksCisgICAgICAgICAgICBXaWRlU3RyaW5nOjpGcm9tVVRGMTZMRShidWZmZXIsIEZYU1lTX2xlbihrRXhwZWN0ZWQpKSk7CisKKyAgRlBERl9TdHJ1Y3RUcmVlX0Nsb3NlKHN0cnVjdF90cmVlKTsKKyAgRlBERl9DbG9zZVBhZ2UocGFnZSk7Cit9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZfc3lzZm9udGluZm8uY3BwIGIvZnBkZnNkay9mcGRmX3N5c2ZvbnRpbmZvLmNwcAppbmRleCAxYjYyZGM0Li45N2QwMmU4IDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZwZGZfc3lzZm9udGluZm8uY3BwCisrKyBiL2ZwZGZzZGsvZnBkZl9zeXNmb250aW5mby5jcHAKQEAgLTgsMTIgKzgsMjggQEAKIAogI2luY2x1ZGUgPG1lbW9yeT4KIAorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29kZXBhZ2UuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnRtYXBwZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnRtZ3IuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dlbW9kdWxlLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZvbnQuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvaWZ4X3N5c3RlbWZvbnRpbmZvLmgiCiAjaW5jbHVkZSAiZnBkZnNkay9mc2RrX2RlZmluZS5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9Gb250TWFwLmgiCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF9mb250X21hcC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworc3RhdGljX2Fzc2VydChGWEZPTlRfQU5TSV9DSEFSU0VUID09IEZYX0NIQVJTRVRfQU5TSSwgIkNoYXJzZXQgbXVzdCBtYXRjaCIpOworc3RhdGljX2Fzc2VydChGWEZPTlRfREVGQVVMVF9DSEFSU0VUID09IEZYX0NIQVJTRVRfRGVmYXVsdCwKKyAgICAgICAgICAgICAgIkNoYXJzZXQgbXVzdCBtYXRjaCIpOworc3RhdGljX2Fzc2VydChGWEZPTlRfU1lNQk9MX0NIQVJTRVQgPT0gRlhfQ0hBUlNFVF9TeW1ib2wsICJDaGFyc2V0IG11c3QgbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoRlhGT05UX1NISUZUSklTX0NIQVJTRVQgPT0gRlhfQ0hBUlNFVF9TaGlmdEpJUywKKyAgICAgICAgICAgICAgIkNoYXJzZXQgbXVzdCBtYXRjaCIpOworc3RhdGljX2Fzc2VydChGWEZPTlRfSEFOR0VVTF9DSEFSU0VUID09IEZYX0NIQVJTRVRfSGFuZ3VsLAorICAgICAgICAgICAgICAiQ2hhcnNldCBtdXN0IG1hdGNoIik7CitzdGF0aWNfYXNzZXJ0KEZYRk9OVF9HQjIzMTJfQ0hBUlNFVCA9PSBGWF9DSEFSU0VUX0NoaW5lc2VTaW1wbGlmaWVkLAorICAgICAgICAgICAgICAiQ2hhcnNldCBtdXN0IG1hdGNoIik7CitzdGF0aWNfYXNzZXJ0KEZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VUID09IEZYX0NIQVJTRVRfQ2hpbmVzZVRyYWRpdGlvbmFsLAorICAgICAgICAgICAgICAiQ2hhcnNldCBtdXN0IG1hdGNoIik7CiAKIGNsYXNzIENGWF9FeHRlcm5hbEZvbnRJbmZvIGZpbmFsIDogcHVibGljIElGWF9TeXN0ZW1Gb250SW5mbyB7CiAgcHVibGljOgpAQCAtMzUsMTUgKzUxLDE2IEBACiAgICAgICAgICAgICAgICAgYm9vbCBiSXRhbGljLAogICAgICAgICAgICAgICAgIGludCBjaGFyc2V0LAogICAgICAgICAgICAgICAgIGludCBwaXRjaF9mYW1pbHksCi0gICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogZmFtaWx5LAotICAgICAgICAgICAgICAgIGludCYgaUV4YWN0KSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmFtaWx5KSBvdmVycmlkZSB7CiAgICAgaWYgKCFtX3BJbmZvLT5NYXBGb250KQogICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBpbnQgaUV4YWN0OwogICAgIHJldHVybiBtX3BJbmZvLT5NYXBGb250KG1fcEluZm8sIHdlaWdodCwgYkl0YWxpYywgY2hhcnNldCwgcGl0Y2hfZmFtaWx5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSwgJmlFeGFjdCk7CiAgIH0KIAotICB2b2lkKiBHZXRGb250KGNvbnN0IEZYX0NIQVIqIGZhbWlseSkgb3ZlcnJpZGUgeworICB2b2lkKiBHZXRGb250KGNvbnN0IGNoYXIqIGZhbWlseSkgb3ZlcnJpZGUgewogICAgIGlmICghbV9wSW5mby0+R2V0Rm9udCkKICAgICAgIHJldHVybiBudWxscHRyOwogICAgIHJldHVybiBtX3BJbmZvLT5HZXRGb250KG1fcEluZm8sIGZhbWlseSk7CkBAIC01OCw3ICs3NSw3IEBACiAgICAgcmV0dXJuIG1fcEluZm8tPkdldEZvbnREYXRhKG1fcEluZm8sIGhGb250LCB0YWJsZSwgYnVmZmVyLCBzaXplKTsKICAgfQogCi0gIGJvb2wgR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIENGWF9CeXRlU3RyaW5nJiBuYW1lKSBvdmVycmlkZSB7CisgIGJvb2wgR2V0RmFjZU5hbWUodm9pZCogaEZvbnQsIEJ5dGVTdHJpbmcqIG5hbWUpIG92ZXJyaWRlIHsKICAgICBpZiAoIW1fcEluZm8tPkdldEZhY2VOYW1lKQogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIHVpbnQzMl90IHNpemUgPSBtX3BJbmZvLT5HZXRGYWNlTmFtZShtX3BJbmZvLCBoRm9udCwgbnVsbHB0ciwgMCk7CkBAIC02NiwxNiArODMsMTYgQEAKICAgICAgIHJldHVybiBmYWxzZTsKICAgICBjaGFyKiBidWZmZXIgPSBGWF9BbGxvYyhjaGFyLCBzaXplKTsKICAgICBzaXplID0gbV9wSW5mby0+R2V0RmFjZU5hbWUobV9wSW5mbywgaEZvbnQsIGJ1ZmZlciwgc2l6ZSk7Ci0gICAgbmFtZSA9IENGWF9CeXRlU3RyaW5nKGJ1ZmZlciwgc2l6ZSk7CisgICAgKm5hbWUgPSBCeXRlU3RyaW5nKGJ1ZmZlciwgc2l6ZSk7CiAgICAgRlhfRnJlZShidWZmZXIpOwogICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgYm9vbCBHZXRGb250Q2hhcnNldCh2b2lkKiBoRm9udCwgaW50JiBjaGFyc2V0KSBvdmVycmlkZSB7CisgIGJvb2wgR2V0Rm9udENoYXJzZXQodm9pZCogaEZvbnQsIGludCogY2hhcnNldCkgb3ZlcnJpZGUgewogICAgIGlmICghbV9wSW5mby0+R2V0Rm9udENoYXJzZXQpCiAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICBjaGFyc2V0ID0gbV9wSW5mby0+R2V0Rm9udENoYXJzZXQobV9wSW5mbywgaEZvbnQpOworICAgICpjaGFyc2V0ID0gbV9wSW5mby0+R2V0Rm9udENoYXJzZXQobV9wSW5mbywgaEZvbnQpOwogICAgIHJldHVybiB0cnVlOwogICB9CiAKQEAgLTg4LDM0ICsxMDUsMzMgQEAKICAgRlBERl9TWVNGT05USU5GTyogY29uc3QgbV9wSW5mbzsKIH07CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9BZGRJbnN0YWxsZWRGb250KHZvaWQqIG1hcHBlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcnNldCkgewotICBDRlhfRm9udE1hcHBlciogcE1hcHBlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYX0ZvbnRNYXBwZXIqPihtYXBwZXIpOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZfQWRkSW5zdGFsbGVkRm9udCh2b2lkKiBtYXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0KSB7CisgIENGWF9Gb250TWFwcGVyKiBwTWFwcGVyID0gc3RhdGljX2Nhc3Q8Q0ZYX0ZvbnRNYXBwZXIqPihtYXBwZXIpOwogICBwTWFwcGVyLT5BZGRJbnN0YWxsZWRGb250KG5hbWUsIGNoYXJzZXQpOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfU2V0U3lzdGVtRm9udEluZm8oRlBERl9TWVNGT05USU5GTyogcEZvbnRJbmZvRXh0KSB7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYKK0ZQREZfU2V0U3lzdGVtRm9udEluZm8oRlBERl9TWVNGT05USU5GTyogcEZvbnRJbmZvRXh0KSB7CiAgIGlmIChwRm9udEluZm9FeHQtPnZlcnNpb24gIT0gMSkKICAgICByZXR1cm47CiAKICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5TZXRTeXN0ZW1Gb250SW5mbygKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJRlhfU3lzdGVtRm9udEluZm8+KAotICAgICAgICAgIG5ldyBDRlhfRXh0ZXJuYWxGb250SW5mbyhwRm9udEluZm9FeHQpKSk7CisgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0V4dGVybmFsRm9udEluZm8+KHBGb250SW5mb0V4dCkpOwogfQogCi1ETExFWFBPUlQgY29uc3QgRlBERl9DaGFyc2V0Rm9udE1hcCogU1REQ0FMTCBGUERGX0dldERlZmF1bHRUVEZNYXAoKSB7CitGUERGX0VYUE9SVCBjb25zdCBGUERGX0NoYXJzZXRGb250TWFwKiBGUERGX0NBTExDT05WIEZQREZfR2V0RGVmYXVsdFRURk1hcCgpIHsKICAgcmV0dXJuIENQV0xfRm9udE1hcDo6ZGVmYXVsdFRURk1hcDsKIH0KIAogc3RydWN0IEZQREZfU1lTRk9OVElORk9fREVGQVVMVCA6IHB1YmxpYyBGUERGX1NZU0ZPTlRJTkZPIHsKLSAgSUZYX1N5c3RlbUZvbnRJbmZvKiBtX3BGb250SW5mbzsKKyAgVW5vd25lZFB0cjxJRlhfU3lzdGVtRm9udEluZm8+IG1fcEZvbnRJbmZvOwogfTsKIAogc3RhdGljIHZvaWQgRGVmYXVsdFJlbGVhc2Uoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcykgewogICBhdXRvKiBwRGVmYXVsdCA9IHN0YXRpY19jYXN0PEZQREZfU1lTRk9OVElORk9fREVGQVVMVCo+KHBUaGlzKTsKLSAgLy8gVE9ETyh0aGVzdGlnKTogU2hvdWxkIHRoaXMgYmUgc2V0IHRvIG51bGxwdHIgdG9vPwotICBkZWxldGUgcERlZmF1bHQtPm1fcEZvbnRJbmZvOworICBkZWxldGUgcERlZmF1bHQtPm1fcEZvbnRJbmZvLlJlbGVhc2UoKTsKIH0KIAogc3RhdGljIHZvaWQgRGVmYXVsdEVudW1Gb250cyhzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCB2b2lkKiBwTWFwcGVyKSB7CkBAIC0xMzIsNyArMTQ4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGJFeGFjdCkgewogICBhdXRvKiBwRGVmYXVsdCA9IHN0YXRpY19jYXN0PEZQREZfU1lTRk9OVElORk9fREVGQVVMVCo+KHBUaGlzKTsKICAgcmV0dXJuIHBEZWZhdWx0LT5tX3BGb250SW5mby0+TWFwRm9udCh3ZWlnaHQsICEhYkl0YWxpYywgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXRjaF9mYW1pbHksIGZhbWlseSwgKmJFeGFjdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl0Y2hfZmFtaWx5LCBmYW1pbHkpOwogfQogCiB2b2lkKiBEZWZhdWx0R2V0Rm9udChzdHJ1Y3QgX0ZQREZfU1lTRk9OVElORk8qIHBUaGlzLCBjb25zdCBjaGFyKiBmYW1pbHkpIHsKQEAgLTE1MywyMCArMTY5LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogaEZvbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmX3NpemUpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgbmFtZTsKKyAgQnl0ZVN0cmluZyBuYW1lOwogICBhdXRvKiBwRGVmYXVsdCA9IHN0YXRpY19jYXN0PEZQREZfU1lTRk9OVElORk9fREVGQVVMVCo+KHBUaGlzKTsKLSAgaWYgKCFwRGVmYXVsdC0+bV9wRm9udEluZm8tPkdldEZhY2VOYW1lKGhGb250LCBuYW1lKSkKKyAgaWYgKCFwRGVmYXVsdC0+bV9wRm9udEluZm8tPkdldEZhY2VOYW1lKGhGb250LCAmbmFtZSkpCiAgICAgcmV0dXJuIDA7Ci0gIGlmIChuYW1lLkdldExlbmd0aCgpID49IChsb25nKWJ1Zl9zaXplKQorICBpZiAobmFtZS5HZXRMZW5ndGgoKSA+PSBzdGF0aWNfY2FzdDxzaXplX3Q+KGJ1Zl9zaXplKSkKICAgICByZXR1cm4gbmFtZS5HZXRMZW5ndGgoKSArIDE7Ci0gIEZYU1lTX3N0cmNweShidWZmZXIsIG5hbWUuY19zdHIoKSk7CisKKyAgc3RybmNweShidWZmZXIsIG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAobmFtZS5HZXRMZW5ndGgoKSArIDEpICogc2l6ZW9mKEJ5dGVTdHJpbmc6OkNoYXJUeXBlKSk7CiAgIHJldHVybiBuYW1lLkdldExlbmd0aCgpICsgMTsKIH0KIAogc3RhdGljIGludCBEZWZhdWx0R2V0Rm9udENoYXJzZXQoc3RydWN0IF9GUERGX1NZU0ZPTlRJTkZPKiBwVGhpcywgdm9pZCogaEZvbnQpIHsKICAgaW50IGNoYXJzZXQ7CiAgIGF1dG8qIHBEZWZhdWx0ID0gc3RhdGljX2Nhc3Q8RlBERl9TWVNGT05USU5GT19ERUZBVUxUKj4ocFRoaXMpOwotICBpZiAoIXBEZWZhdWx0LT5tX3BGb250SW5mby0+R2V0Rm9udENoYXJzZXQoaEZvbnQsIGNoYXJzZXQpKQorICBpZiAoIXBEZWZhdWx0LT5tX3BGb250SW5mby0+R2V0Rm9udENoYXJzZXQoaEZvbnQsICZjaGFyc2V0KSkKICAgICByZXR1cm4gMDsKICAgcmV0dXJuIGNoYXJzZXQ7CiB9CkBAIC0xNzYsNyArMTk0LDcgQEAKICAgcERlZmF1bHQtPm1fcEZvbnRJbmZvLT5EZWxldGVGb250KGhGb250KTsKIH0KIAotRExMRVhQT1JUIEZQREZfU1lTRk9OVElORk8qIFNURENBTEwgRlBERl9HZXREZWZhdWx0U3lzdGVtRm9udEluZm8oKSB7CitGUERGX0VYUE9SVCBGUERGX1NZU0ZPTlRJTkZPKiBGUERGX0NBTExDT05WIEZQREZfR2V0RGVmYXVsdFN5c3RlbUZvbnRJbmZvKCkgewogICBzdGQ6OnVuaXF1ZV9wdHI8SUZYX1N5c3RlbUZvbnRJbmZvPiBwRm9udEluZm8gPQogICAgICAgSUZYX1N5c3RlbUZvbnRJbmZvOjpDcmVhdGVEZWZhdWx0KG51bGxwdHIpOwogICBpZiAoIXBGb250SW5mbykKQEAgLTE5Nyw3ICsyMTUsNyBAQAogICByZXR1cm4gcEZvbnRJbmZvRXh0OwogfQogCi1ETExFWFBPUlQgdm9pZCBGUERGX0ZyZWVEZWZhdWx0U3lzdGVtRm9udEluZm8oCi0gICAgRlBERl9TWVNGT05USU5GTyogcERlZmF1bHRGb250SW5mbykgeworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WCitGUERGX0ZyZWVEZWZhdWx0U3lzdGVtRm9udEluZm8oRlBERl9TWVNGT05USU5GTyogcERlZmF1bHRGb250SW5mbykgewogICBGWF9GcmVlKHN0YXRpY19jYXN0PEZQREZfU1lTRk9OVElORk9fREVGQVVMVCo+KHBEZWZhdWx0Rm9udEluZm8pKTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnBkZl90cmFuc2Zvcm1wYWdlLmNwcCBiL2ZwZGZzZGsvZnBkZl90cmFuc2Zvcm1wYWdlLmNwcAppbmRleCAzNDI3ZjRlLi41NjVkOTBiIDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZwZGZfdHJhbnNmb3JtcGFnZS5jcHAKKysrIGIvZnBkZnNkay9mcGRmX3RyYW5zZm9ybXBhZ2UuY3BwCkBAIC02LDYgKzYsOCBAQAogCiAjaW5jbHVkZSAicHVibGljL2ZwZGZfdHJhbnNmb3JtcGFnZS5oIgogCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jbGlwcGF0aC5oIgpAQCAtMjMsNyArMjUsNyBAQAogbmFtZXNwYWNlIHsKIAogdm9pZCBTZXRCb3VuZGluZ0JveChDUERGX1BhZ2UqIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIGtleSwKICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGVmdCwKICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYm90dG9tLAogICAgICAgICAgICAgICAgICAgICBmbG9hdCByaWdodCwKQEAgLTM2LDcgKzM4LDcgQEAKIH0KIAogYm9vbCBHZXRCb3VuZGluZ0JveChDUERGX1BhZ2UqIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIGtleSwKICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGxlZnQsCiAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBib3R0b20sCiAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByaWdodCwKQEAgLTUyLDEzICs1NCwxNyBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAorQ1BERl9PYmplY3QqIEdldFBhZ2VDb250ZW50KENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0KSB7CisgIHJldHVybiBwUGFnZURpY3QgPyBwUGFnZURpY3QtPkdldERpcmVjdE9iamVjdEZvcigiQ29udGVudHMiKSA6IG51bGxwdHI7Cit9CisKIH0gIC8vIG5hbWVzcGFjZQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX1NldE1lZGlhQm94KEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0b3ApIHsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGUGFnZV9TZXRNZWRpYUJveChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0b3ApIHsKICAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOwogICBpZiAoIXBQYWdlKQogICAgIHJldHVybjsKQEAgLTY2LDExICs3MiwxMSBAQAogICBTZXRCb3VuZGluZ0JveChwUGFnZSwgIk1lZGlhQm94IiwgbGVmdCwgYm90dG9tLCByaWdodCwgdG9wKTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9TZXRDcm9wQm94KEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRvcCkgeworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZQYWdlX1NldENyb3BCb3goRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0b3ApIHsKICAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOwogICBpZiAoIXBQYWdlKQogICAgIHJldHVybjsKQEAgLTc4LDk2ICs4NCw4MyBAQAogICBTZXRCb3VuZGluZ0JveChwUGFnZSwgIkNyb3BCb3giLCBsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3ApOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfR2V0TWVkaWFCb3goRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRvcCkgeworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRlBERlBhZ2VfR2V0TWVkaWFCb3goRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdG9wKSB7CiAgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKICAgcmV0dXJuIHBQYWdlICYmIEdldEJvdW5kaW5nQm94KHBQYWdlLCAiTWVkaWFCb3giLCBsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3ApOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfR2V0Q3JvcEJveChGUERGX1BBR0UgcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB0b3ApIHsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZQYWdlX0dldENyb3BCb3goRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB0b3ApIHsKICAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOwogICByZXR1cm4gcFBhZ2UgJiYgR2V0Qm91bmRpbmdCb3gocFBhZ2UsICJDcm9wQm94IiwgbGVmdCwgYm90dG9tLCByaWdodCwgdG9wKTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX1RyYW5zRm9ybVdpdGhDbGlwKEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX01BVFJJWCogbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX1JFQ1RGKiBjbGlwUmVjdCkgeworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZQYWdlX1RyYW5zRm9ybVdpdGhDbGlwKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfTUFUUklYKiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19SRUNURiogY2xpcFJlY3QpIHsKKyAgaWYgKCFtYXRyaXggJiYgIWNsaXBSZWN0KQorICAgIHJldHVybiBmYWxzZTsKKwogICBDUERGX1BhZ2UqIHBQYWdlID0gQ1BERlBhZ2VGcm9tRlBERlBhZ2UocGFnZSk7CiAgIGlmICghcFBhZ2UpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIENGWF9CeXRlVGV4dEJ1ZiB0ZXh0QnVmOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gdGV4dEJ1ZjsKICAgdGV4dEJ1ZiA8PCAicSAiOwotICBDRlhfRmxvYXRSZWN0IHJlY3QoY2xpcFJlY3QtPmxlZnQsIGNsaXBSZWN0LT5ib3R0b20sIGNsaXBSZWN0LT5yaWdodCwKLSAgICAgICAgICAgICAgICAgICAgIGNsaXBSZWN0LT50b3ApOwotICByZWN0Lk5vcm1hbGl6ZSgpOwotICBDRlhfQnl0ZVN0cmluZyBic0NsaXBwaW5nOwotICBic0NsaXBwaW5nLkZvcm1hdCgiJWYgJWYgJWYgJWYgcmUgVyogbiAiLCByZWN0LmxlZnQsIHJlY3QuYm90dG9tLAotICAgICAgICAgICAgICAgICAgICByZWN0LldpZHRoKCksIHJlY3QuSGVpZ2h0KCkpOwotICB0ZXh0QnVmIDw8IGJzQ2xpcHBpbmc7CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgYnNNYXRpeDsKLSAgYnNNYXRpeC5Gb3JtYXQoIiVmICVmICVmICVmICVmICVmIGNtICIsIG1hdHJpeC0+YSwgbWF0cml4LT5iLCBtYXRyaXgtPmMsCi0gICAgICAgICAgICAgICAgIG1hdHJpeC0+ZCwgbWF0cml4LT5lLCBtYXRyaXgtPmYpOwotICB0ZXh0QnVmIDw8IGJzTWF0aXg7CisgIGlmIChjbGlwUmVjdCkgeworICAgIENGWF9GbG9hdFJlY3QgcmVjdCA9IENGWEZsb2F0UmVjdEZyb21GU1JFQ1RGKCpjbGlwUmVjdCk7CisgICAgcmVjdC5Ob3JtYWxpemUoKTsKIAotICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljID0gcFBhZ2UtPm1fcEZvcm1EaWN0OwotICBDUERGX09iamVjdCogcENvbnRlbnRPYmogPQotICAgICAgcFBhZ2VEaWMgPyBwUGFnZURpYy0+R2V0T2JqZWN0Rm9yKCJDb250ZW50cyIpIDogbnVsbHB0cjsKLSAgaWYgKCFwQ29udGVudE9iaikKLSAgICBwQ29udGVudE9iaiA9IHBQYWdlRGljID8gcFBhZ2VEaWMtPkdldEFycmF5Rm9yKCJDb250ZW50cyIpIDogbnVsbHB0cjsKKyAgICB0ZXh0QnVmIDw8IEJ5dGVTdHJpbmc6OkZvcm1hdCgiJWYgJWYgJWYgJWYgcmUgVyogbiAiLCByZWN0LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC5ib3R0b20sIHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSk7CisgIH0KKyAgaWYgKG1hdHJpeCkgeworICAgIHRleHRCdWYgPDwgQnl0ZVN0cmluZzo6Rm9ybWF0KCIlZiAlZiAlZiAlZiAlZiAlZiBjbSAiLCBtYXRyaXgtPmEsIG1hdHJpeC0+YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgtPmMsIG1hdHJpeC0+ZCwgbWF0cml4LT5lLCBtYXRyaXgtPmYpOworICB9CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBwUGFnZS0+bV9wRm9ybURpY3QuR2V0KCk7CisgIENQREZfT2JqZWN0KiBwQ29udGVudE9iaiA9IEdldFBhZ2VDb250ZW50KHBQYWdlRGljdCk7CiAgIGlmICghcENvbnRlbnRPYmopCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIENQREZfRG9jdW1lbnQqIHBEb2MgPSBwUGFnZS0+bV9wRG9jdW1lbnQ7CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBwUGFnZS0+bV9wRG9jdW1lbnQuR2V0KCk7CiAgIGlmICghcERvYykKICAgICByZXR1cm4gZmFsc2U7CiAKICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwRG9jLT5OZXdJbmRpcmVjdDxDUERGX1N0cmVhbT4oCiAgICAgICBudWxscHRyLCAwLAogICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4ocERvYy0+R2V0Qnl0ZVN0cmluZ1Bvb2woKSkpOwotICBwU3RyZWFtLT5TZXREYXRhKHRleHRCdWYuR2V0QnVmZmVyKCksIHRleHRCdWYuR2V0U2l6ZSgpKTsKKyAgcFN0cmVhbS0+U2V0RGF0YSgmdGV4dEJ1Zik7CiAKICAgQ1BERl9TdHJlYW0qIHBFbmRTdHJlYW0gPSBwRG9jLT5OZXdJbmRpcmVjdDxDUERGX1N0cmVhbT4oCiAgICAgICBudWxscHRyLCAwLAogICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4ocERvYy0+R2V0Qnl0ZVN0cmluZ1Bvb2woKSkpOwogICBwRW5kU3RyZWFtLT5TZXREYXRhKChjb25zdCB1aW50OF90KikiIFEiLCAyKTsKIAotICBDUERGX0FycmF5KiBwQ29udGVudEFycmF5ID0gbnVsbHB0cjsKLSAgQ1BERl9BcnJheSogcEFycmF5ID0gVG9BcnJheShwQ29udGVudE9iaik7Ci0gIGlmIChwQXJyYXkpIHsKLSAgICBwQ29udGVudEFycmF5ID0gcEFycmF5OworICBpZiAoQ1BERl9BcnJheSogcENvbnRlbnRBcnJheSA9IFRvQXJyYXkocENvbnRlbnRPYmopKSB7CiAgICAgcENvbnRlbnRBcnJheS0+SW5zZXJ0TmV3QXQ8Q1BERl9SZWZlcmVuY2U+KDAsIHBEb2MsIHBTdHJlYW0tPkdldE9iak51bSgpKTsKICAgICBwQ29udGVudEFycmF5LT5BZGROZXc8Q1BERl9SZWZlcmVuY2U+KHBEb2MsIHBFbmRTdHJlYW0tPkdldE9iak51bSgpKTsKLSAgfSBlbHNlIGlmIChDUERGX1JlZmVyZW5jZSogcFJlZmVyZW5jZSA9IFRvUmVmZXJlbmNlKHBDb250ZW50T2JqKSkgewotICAgIENQREZfT2JqZWN0KiBwRGlyZWN0T2JqID0gcFJlZmVyZW5jZS0+R2V0RGlyZWN0KCk7Ci0gICAgaWYgKHBEaXJlY3RPYmopIHsKLSAgICAgIENQREZfQXJyYXkqIHBPYmpBcnJheSA9IHBEaXJlY3RPYmotPkFzQXJyYXkoKTsKLSAgICAgIGlmIChwT2JqQXJyYXkpIHsKLSAgICAgICAgcENvbnRlbnRBcnJheSA9IHBPYmpBcnJheTsKLSAgICAgICAgcENvbnRlbnRBcnJheS0+SW5zZXJ0TmV3QXQ8Q1BERl9SZWZlcmVuY2U+KDAsIHBEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RyZWFtLT5HZXRPYmpOdW0oKSk7Ci0gICAgICAgIHBDb250ZW50QXJyYXktPkFkZE5ldzxDUERGX1JlZmVyZW5jZT4ocERvYywgcEVuZFN0cmVhbS0+R2V0T2JqTnVtKCkpOwotICAgICAgfSBlbHNlIGlmIChwRGlyZWN0T2JqLT5Jc1N0cmVhbSgpKSB7Ci0gICAgICAgIHBDb250ZW50QXJyYXkgPSBwRG9jLT5OZXdJbmRpcmVjdDxDUERGX0FycmF5PigpOwotICAgICAgICBwQ29udGVudEFycmF5LT5BZGROZXc8Q1BERl9SZWZlcmVuY2U+KHBEb2MsIHBTdHJlYW0tPkdldE9iak51bSgpKTsKLSAgICAgICAgcENvbnRlbnRBcnJheS0+QWRkTmV3PENQREZfUmVmZXJlbmNlPihwRG9jLCBwRGlyZWN0T2JqLT5HZXRPYmpOdW0oKSk7Ci0gICAgICAgIHBDb250ZW50QXJyYXktPkFkZE5ldzxDUERGX1JlZmVyZW5jZT4ocERvYywgcEVuZFN0cmVhbS0+R2V0T2JqTnVtKCkpOwotICAgICAgICBwUGFnZURpYy0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiQ29udGVudHMiLCBwRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGVudEFycmF5LT5HZXRPYmpOdW0oKSk7Ci0gICAgICB9Ci0gICAgfQorICB9IGVsc2UgaWYgKHBDb250ZW50T2JqLT5Jc1N0cmVhbSgpICYmICFwQ29udGVudE9iai0+SXNJbmxpbmUoKSkgeworICAgIENQREZfQXJyYXkqIHBDb250ZW50QXJyYXkgPSBwRG9jLT5OZXdJbmRpcmVjdDxDUERGX0FycmF5PigpOworICAgIHBDb250ZW50QXJyYXktPkFkZE5ldzxDUERGX1JlZmVyZW5jZT4ocERvYywgcFN0cmVhbS0+R2V0T2JqTnVtKCkpOworICAgIHBDb250ZW50QXJyYXktPkFkZE5ldzxDUERGX1JlZmVyZW5jZT4ocERvYywgcENvbnRlbnRPYmotPkdldE9iak51bSgpKTsKKyAgICBwQ29udGVudEFycmF5LT5BZGROZXc8Q1BERl9SZWZlcmVuY2U+KHBEb2MsIHBFbmRTdHJlYW0tPkdldE9iak51bSgpKTsKKyAgICBwUGFnZURpY3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIkNvbnRlbnRzIiwgcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRlbnRBcnJheS0+R2V0T2JqTnVtKCkpOwogICB9CiAKICAgLy8gTmVlZCB0byB0cmFuc2Zvcm0gdGhlIHBhdHRlcm5zIGFzIHdlbGwuCi0gIENQREZfRGljdGlvbmFyeSogcFJlcyA9IHBQYWdlRGljLT5HZXREaWN0Rm9yKCJSZXNvdXJjZXMiKTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUmVzID0gcFBhZ2VEaWN0LT5HZXREaWN0Rm9yKCJSZXNvdXJjZXMiKTsKICAgaWYgKHBSZXMpIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBQYXR0ZW5EaWN0ID0gcFJlcy0+R2V0RGljdEZvcigiUGF0dGVybiIpOwogICAgIGlmIChwUGF0dGVuRGljdCkgewpAQCAtMTk1LDcgKzE4OCw3IEBACiAgIHJldHVybiB0cnVlOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMCitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYKIEZQREZQYWdlT2JqX1RyYW5zZm9ybUNsaXBQYXRoKEZQREZfUEFHRU9CSkVDVCBwYWdlX29iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGIsCkBAIC0yMDYsOCArMTk5LDcgQEAKICAgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiA9IChDUERGX1BhZ2VPYmplY3QqKXBhZ2Vfb2JqZWN0OwogICBpZiAoIXBQYWdlT2JqKQogICAgIHJldHVybjsKLSAgQ0ZYX01hdHJpeCBtYXRyaXgoKEZYX0ZMT0FUKWEsIChGWF9GTE9BVCliLCAoRlhfRkxPQVQpYywgKEZYX0ZMT0FUKWQsCi0gICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCllLCAoRlhfRkxPQVQpZik7CisgIENGWF9NYXRyaXggbWF0cml4KChmbG9hdClhLCAoZmxvYXQpYiwgKGZsb2F0KWMsIChmbG9hdClkLCAoZmxvYXQpZSwgKGZsb2F0KWYpOwogCiAgIC8vIFNwZWNpYWwgdHJlYXRtZW50IHRvIHNoYWRpbmcgb2JqZWN0LCBiZWNhdXNlIHRoZSBDbGlwUGF0aCBmb3Igc2hhZGluZwogICAvLyBvYmplY3QgaXMgYWxyZWFkeSB0cmFuc2Zvcm1lZC4KQEAgLTIxNiwyMyArMjA4LDI0IEBACiAgIHBQYWdlT2JqLT5UcmFuc2Zvcm1HZW5lcmFsU3RhdGUobWF0cml4KTsKIH0KIAotRExMRVhQT1JUIEZQREZfQ0xJUFBBVEggU1REQ0FMTCBGUERGX0NyZWF0ZUNsaXBQYXRoKGZsb2F0IGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRvcCkgeworRlBERl9FWFBPUlQgRlBERl9DTElQUEFUSCBGUERGX0NBTExDT05WIEZQREZfQ3JlYXRlQ2xpcFBhdGgoZmxvYXQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdG9wKSB7CiAgIENQREZfUGF0aCBQYXRoOwogICBQYXRoLkFwcGVuZFJlY3QobGVmdCwgYm90dG9tLCByaWdodCwgdG9wKTsKIAotICBDUERGX0NsaXBQYXRoKiBwTmV3Q2xpcFBhdGggPSBuZXcgQ1BERl9DbGlwUGF0aCgpOworICBhdXRvIHBOZXdDbGlwUGF0aCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0NsaXBQYXRoPigpOwogICBwTmV3Q2xpcFBhdGgtPkFwcGVuZFBhdGgoUGF0aCwgRlhGSUxMX0FMVEVSTkFURSwgZmFsc2UpOwotICByZXR1cm4gcE5ld0NsaXBQYXRoOworICByZXR1cm4gcE5ld0NsaXBQYXRoLnJlbGVhc2UoKTsgIC8vIENhbGxlciB0YWtlcyBvd25lcnNoaXAuCiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9EZXN0cm95Q2xpcFBhdGgoRlBERl9DTElQUEFUSCBjbGlwUGF0aCkgewotICBkZWxldGUgKENQREZfQ2xpcFBhdGgqKWNsaXBQYXRoOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZfRGVzdHJveUNsaXBQYXRoKEZQREZfQ0xJUFBBVEggY2xpcFBhdGgpIHsKKyAgLy8gVGFrZSBvd25lcnNoaXAgYmFjayBmcm9tIGNhbGxlciBhbmQgZGVzdHJveS4KKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfQ2xpcFBhdGg+KHN0YXRpY19jYXN0PENQREZfQ2xpcFBhdGgqPihjbGlwUGF0aCkpOwogfQogCi12b2lkIE91dHB1dFBhdGgoQ0ZYX0J5dGVUZXh0QnVmJiBidWYsIENQREZfUGF0aCBwYXRoKSB7Cit2b2lkIE91dHB1dFBhdGgoc3RkOjpvc3RyaW5nc3RyZWFtJiBidWYsIENQREZfUGF0aCBwYXRoKSB7CiAgIGNvbnN0IENGWF9QYXRoRGF0YSogcFBhdGhEYXRhID0gcGF0aC5HZXRPYmplY3QoKTsKICAgaWYgKCFwUGF0aERhdGEpCiAgICAgcmV0dXJuOwpAQCAtMjQ1LDcgKzIzOCw3IEBACiAgICAgcmV0dXJuOwogICB9CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgdGVtcDsKKyAgQnl0ZVN0cmluZyB0ZW1wOwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBQb2ludHMuc2l6ZSgpOyBpKyspIHsKICAgICBidWYgPDwgcFBvaW50c1tpXS5tX1BvaW50LnggPDwgIiAiIDw8IHBQb2ludHNbaV0ubV9Qb2ludC55OwogICAgIEZYUFRfVFlQRSBwb2ludF90eXBlID0gcFBvaW50c1tpXS5tX1R5cGU7CkBAIC0yNjksNjkgKzI2Miw0OCBAQAogICB9CiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfSW5zZXJ0Q2xpcFBhdGgoRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQ0xJUFBBVEggY2xpcFBhdGgpIHsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGUGFnZV9JbnNlcnRDbGlwUGF0aChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0NMSVBQQVRIIGNsaXBQYXRoKSB7CiAgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKICAgaWYgKCFwUGFnZSkKICAgICByZXR1cm47CiAKLSAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpYyA9IHBQYWdlLT5tX3BGb3JtRGljdDsKLSAgQ1BERl9PYmplY3QqIHBDb250ZW50T2JqID0KLSAgICAgIHBQYWdlRGljID8gcFBhZ2VEaWMtPkdldE9iamVjdEZvcigiQ29udGVudHMiKSA6IG51bGxwdHI7Ci0gIGlmICghcENvbnRlbnRPYmopCi0gICAgcENvbnRlbnRPYmogPSBwUGFnZURpYyA/IHBQYWdlRGljLT5HZXRBcnJheUZvcigiQ29udGVudHMiKSA6IG51bGxwdHI7CisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0LkdldCgpOworICBDUERGX09iamVjdCogcENvbnRlbnRPYmogPSBHZXRQYWdlQ29udGVudChwUGFnZURpY3QpOwogICBpZiAoIXBDb250ZW50T2JqKQogICAgIHJldHVybjsKIAotICBDRlhfQnl0ZVRleHRCdWYgc3RyQ2xpcDsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHN0ckNsaXA7CiAgIENQREZfQ2xpcFBhdGgqIHBDbGlwUGF0aCA9IChDUERGX0NsaXBQYXRoKiljbGlwUGF0aDsKLSAgdWludDMyX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IHBDbGlwUGF0aC0+R2V0UGF0aENvdW50KCk7IGkrKykgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBDbGlwUGF0aC0+R2V0UGF0aENvdW50KCk7ICsraSkgewogICAgIENQREZfUGF0aCBwYXRoID0gcENsaXBQYXRoLT5HZXRQYXRoKGkpOwotICAgIGludCBpQ2xpcFR5cGUgPSBwQ2xpcFBhdGgtPkdldENsaXBUeXBlKGkpOwogICAgIGlmIChwYXRoLkdldFBvaW50cygpLmVtcHR5KCkpIHsKICAgICAgIC8vIEVtcHR5IGNsaXBwaW5nICh0b3RhbGx5IGNsaXBwZWQgb3V0KQogICAgICAgc3RyQ2xpcCA8PCAiMCAwIG0gVyBuICI7CiAgICAgfSBlbHNlIHsKICAgICAgIE91dHB1dFBhdGgoc3RyQ2xpcCwgcGF0aCk7Ci0gICAgICBpZiAoaUNsaXBUeXBlID09IEZYRklMTF9XSU5ESU5HKQorICAgICAgaWYgKHBDbGlwUGF0aC0+R2V0Q2xpcFR5cGUoaSkgPT0gRlhGSUxMX1dJTkRJTkcpCiAgICAgICAgIHN0ckNsaXAgPDwgIlcgblxuIjsKICAgICAgIGVsc2UKICAgICAgICAgc3RyQ2xpcCA8PCAiVyogblxuIjsKICAgICB9CiAgIH0KLSAgQ1BERl9Eb2N1bWVudCogcERvYyA9IHBQYWdlLT5tX3BEb2N1bWVudDsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IHBQYWdlLT5tX3BEb2N1bWVudC5HZXQoKTsKICAgaWYgKCFwRG9jKQogICAgIHJldHVybjsKIAogICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBEb2MtPk5ld0luZGlyZWN0PENQREZfU3RyZWFtPigKICAgICAgIG51bGxwdHIsIDAsCiAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PihwRG9jLT5HZXRCeXRlU3RyaW5nUG9vbCgpKSk7Ci0gIHBTdHJlYW0tPlNldERhdGEoc3RyQ2xpcC5HZXRCdWZmZXIoKSwgc3RyQ2xpcC5HZXRTaXplKCkpOworICBwU3RyZWFtLT5TZXREYXRhKCZzdHJDbGlwKTsKIAotICBDUERGX0FycmF5KiBwQXJyYXkgPSBUb0FycmF5KHBDb250ZW50T2JqKTsKLSAgaWYgKHBBcnJheSkgeworICBpZiAoQ1BERl9BcnJheSogcEFycmF5ID0gVG9BcnJheShwQ29udGVudE9iaikpIHsKICAgICBwQXJyYXktPkluc2VydE5ld0F0PENQREZfUmVmZXJlbmNlPigwLCBwRG9jLCBwU3RyZWFtLT5HZXRPYmpOdW0oKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENQREZfUmVmZXJlbmNlKiBwUmVmZXJlbmNlID0gVG9SZWZlcmVuY2UocENvbnRlbnRPYmopOwotICBpZiAoIXBSZWZlcmVuY2UpCi0gICAgcmV0dXJuOwotCi0gIENQREZfT2JqZWN0KiBwRGlyZWN0T2JqID0gcFJlZmVyZW5jZS0+R2V0RGlyZWN0KCk7Ci0gIGlmICghcERpcmVjdE9iaikKLSAgICByZXR1cm47Ci0KLSAgQ1BERl9BcnJheSogcE9iakFycmF5ID0gcERpcmVjdE9iai0+QXNBcnJheSgpOwotICBpZiAocE9iakFycmF5KSB7Ci0gICAgcE9iakFycmF5LT5JbnNlcnROZXdBdDxDUERGX1JlZmVyZW5jZT4oMCwgcERvYywgcFN0cmVhbS0+R2V0T2JqTnVtKCkpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAocERpcmVjdE9iai0+SXNTdHJlYW0oKSkgeworICB9IGVsc2UgaWYgKHBDb250ZW50T2JqLT5Jc1N0cmVhbSgpICYmICFwQ29udGVudE9iai0+SXNJbmxpbmUoKSkgewogICAgIENQREZfQXJyYXkqIHBDb250ZW50QXJyYXkgPSBwRG9jLT5OZXdJbmRpcmVjdDxDUERGX0FycmF5PigpOwogICAgIHBDb250ZW50QXJyYXktPkFkZE5ldzxDUERGX1JlZmVyZW5jZT4ocERvYywgcFN0cmVhbS0+R2V0T2JqTnVtKCkpOwotICAgIHBDb250ZW50QXJyYXktPkFkZE5ldzxDUERGX1JlZmVyZW5jZT4ocERvYywgcERpcmVjdE9iai0+R2V0T2JqTnVtKCkpOwotICAgIHBQYWdlRGljLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJDb250ZW50cyIsIHBEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRlbnRBcnJheS0+R2V0T2JqTnVtKCkpOworICAgIHBDb250ZW50QXJyYXktPkFkZE5ldzxDUERGX1JlZmVyZW5jZT4ocERvYywgcENvbnRlbnRPYmotPkdldE9iak51bSgpKTsKKyAgICBwUGFnZURpY3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIkNvbnRlbnRzIiwgcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRlbnRBcnJheS0+R2V0T2JqTnVtKCkpOwogICB9CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZhbm5vdC5jcHAgYi9mcGRmc2RrL2ZwZGZhbm5vdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIwY2IzOQotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvZnBkZmFubm90LmNwcApAQCAtMCwwICsxLDg5MCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAicHVibGljL2ZwZGZfYW5ub3QuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9wYWdlY29udGVudGdlbmVyYXRvci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZm9ybS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW9iamVjdC5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RvY3VtZW50LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX25hbWUuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbnVtYmVyLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2Fubm90LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfZm9ybWZpZWxkLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfaW50ZXJmb3JtLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwdnRfZ2VuZXJhdGVhcC5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfY29sb3IuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2ZzZGtfZGVmaW5lLmgiCisKK25hbWVzcGFjZSB7CisKKy8vIFRoZXNlIGNoZWNrcyBlbnN1cmUgdGhlIGNvbnNpc3RlbmN5IG9mIGFubm90YXRpb24gc3VidHlwZSB2YWx1ZXMgYWNyb3NzIGNvcmUvCisvLyBhbmQgcHVibGljLgorc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KENQREZfQW5ub3Q6OlN1YnR5cGU6OlVOS05PV04pID09CisgICAgICAgICAgICAgICAgICBGUERGX0FOTk9UX1VOS05PV04sCisgICAgICAgICAgICAgICJDUERGX0Fubm90OjpVTktOT1dOIHZhbHVlIG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PGludD4oQ1BERl9Bbm5vdDo6U3VidHlwZTo6VEVYVCkgPT0gRlBERl9BTk5PVF9URVhULAorICAgICAgICAgICAgICAiQ1BERl9Bbm5vdDo6VEVYVCB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KENQREZfQW5ub3Q6OlN1YnR5cGU6OkxJTkspID09IEZQREZfQU5OT1RfTElOSywKKyAgICAgICAgICAgICAgIkNQREZfQW5ub3Q6OkxJTksgdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihDUERGX0Fubm90OjpTdWJ0eXBlOjpGUkVFVEVYVCkgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfQU5OT1RfRlJFRVRFWFQsCisgICAgICAgICAgICAgICJDUERGX0Fubm90OjpGUkVFVEVYVCB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KENQREZfQW5ub3Q6OlN1YnR5cGU6OkxJTkUpID09IEZQREZfQU5OT1RfTElORSwKKyAgICAgICAgICAgICAgIkNQREZfQW5ub3Q6OkxJTkUgdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihDUERGX0Fubm90OjpTdWJ0eXBlOjpTUVVBUkUpID09CisgICAgICAgICAgICAgICAgICBGUERGX0FOTk9UX1NRVUFSRSwKKyAgICAgICAgICAgICAgIkNQREZfQW5ub3Q6OlNRVUFSRSB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KENQREZfQW5ub3Q6OlN1YnR5cGU6OkNJUkNMRSkgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfQU5OT1RfQ0lSQ0xFLAorICAgICAgICAgICAgICAiQ1BERl9Bbm5vdDo6Q0lSQ0xFIHZhbHVlIG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PGludD4oQ1BERl9Bbm5vdDo6U3VidHlwZTo6UE9MWUdPTikgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfQU5OT1RfUE9MWUdPTiwKKyAgICAgICAgICAgICAgIkNQREZfQW5ub3Q6OlBPTFlHT04gdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihDUERGX0Fubm90OjpTdWJ0eXBlOjpQT0xZTElORSkgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfQU5OT1RfUE9MWUxJTkUsCisgICAgICAgICAgICAgICJDUERGX0Fubm90OjpQT0xZTElORSB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KENQREZfQW5ub3Q6OlN1YnR5cGU6OkhJR0hMSUdIVCkgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfQU5OT1RfSElHSExJR0hULAorICAgICAgICAgICAgICAiQ1BERl9Bbm5vdDo6SElHSExJR0hUIHZhbHVlIG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PGludD4oQ1BERl9Bbm5vdDo6U3VidHlwZTo6VU5ERVJMSU5FKSA9PQorICAgICAgICAgICAgICAgICAgRlBERl9BTk5PVF9VTkRFUkxJTkUsCisgICAgICAgICAgICAgICJDUERGX0Fubm90OjpVTkRFUkxJTkUgdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihDUERGX0Fubm90OjpTdWJ0eXBlOjpTUVVJR0dMWSkgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfQU5OT1RfU1FVSUdHTFksCisgICAgICAgICAgICAgICJDUERGX0Fubm90OjpTUVVJR0dMWSB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KENQREZfQW5ub3Q6OlN1YnR5cGU6OlNUUklLRU9VVCkgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfQU5OT1RfU1RSSUtFT1VULAorICAgICAgICAgICAgICAiQ1BERl9Bbm5vdDo6U1RSSUtFT1VUIHZhbHVlIG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PGludD4oQ1BERl9Bbm5vdDo6U3VidHlwZTo6U1RBTVApID09IEZQREZfQU5OT1RfU1RBTVAsCisgICAgICAgICAgICAgICJDUERGX0Fubm90OjpTVEFNUCB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KENQREZfQW5ub3Q6OlN1YnR5cGU6OkNBUkVUKSA9PSBGUERGX0FOTk9UX0NBUkVULAorICAgICAgICAgICAgICAiQ1BERl9Bbm5vdDo6Q0FSRVQgdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihDUERGX0Fubm90OjpTdWJ0eXBlOjpJTkspID09IEZQREZfQU5OT1RfSU5LLAorICAgICAgICAgICAgICAiQ1BERl9Bbm5vdDo6SU5LIHZhbHVlIG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PGludD4oQ1BERl9Bbm5vdDo6U3VidHlwZTo6UE9QVVApID09IEZQREZfQU5OT1RfUE9QVVAsCisgICAgICAgICAgICAgICJDUERGX0Fubm90OjpQT1BVUCB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KENQREZfQW5ub3Q6OlN1YnR5cGU6OkZJTEVBVFRBQ0hNRU5UKSA9PQorICAgICAgICAgICAgICAgICAgRlBERl9BTk5PVF9GSUxFQVRUQUNITUVOVCwKKyAgICAgICAgICAgICAgIkNQREZfQW5ub3Q6OkZJTEVBVFRBQ0hNRU5UIHZhbHVlIG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PGludD4oQ1BERl9Bbm5vdDo6U3VidHlwZTo6U09VTkQpID09IEZQREZfQU5OT1RfU09VTkQsCisgICAgICAgICAgICAgICJDUERGX0Fubm90OjpTT1VORCB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KENQREZfQW5ub3Q6OlN1YnR5cGU6Ok1PVklFKSA9PSBGUERGX0FOTk9UX01PVklFLAorICAgICAgICAgICAgICAiQ1BERl9Bbm5vdDo6TU9WSUUgdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihDUERGX0Fubm90OjpTdWJ0eXBlOjpXSURHRVQpID09CisgICAgICAgICAgICAgICAgICBGUERGX0FOTk9UX1dJREdFVCwKKyAgICAgICAgICAgICAgIkNQREZfQW5ub3Q6OldJREdFVCB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KENQREZfQW5ub3Q6OlN1YnR5cGU6OlNDUkVFTikgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfQU5OT1RfU0NSRUVOLAorICAgICAgICAgICAgICAiQ1BERl9Bbm5vdDo6U0NSRUVOIHZhbHVlIG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PGludD4oQ1BERl9Bbm5vdDo6U3VidHlwZTo6UFJJTlRFUk1BUkspID09CisgICAgICAgICAgICAgICAgICBGUERGX0FOTk9UX1BSSU5URVJNQVJLLAorICAgICAgICAgICAgICAiQ1BERl9Bbm5vdDo6UFJJTlRFUk1BUksgdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihDUERGX0Fubm90OjpTdWJ0eXBlOjpUUkFQTkVUKSA9PQorICAgICAgICAgICAgICAgICAgRlBERl9BTk5PVF9UUkFQTkVULAorICAgICAgICAgICAgICAiQ1BERl9Bbm5vdDo6VFJBUE5FVCB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KENQREZfQW5ub3Q6OlN1YnR5cGU6OldBVEVSTUFSSykgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfQU5OT1RfV0FURVJNQVJLLAorICAgICAgICAgICAgICAiQ1BERl9Bbm5vdDo6V0FURVJNQVJLIHZhbHVlIG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PGludD4oQ1BERl9Bbm5vdDo6U3VidHlwZTo6VEhSRUVEKSA9PQorICAgICAgICAgICAgICAgICAgRlBERl9BTk5PVF9USFJFRUQsCisgICAgICAgICAgICAgICJDUERGX0Fubm90OjpUSFJFRUQgdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihDUERGX0Fubm90OjpTdWJ0eXBlOjpSSUNITUVESUEpID09CisgICAgICAgICAgICAgICAgICBGUERGX0FOTk9UX1JJQ0hNRURJQSwKKyAgICAgICAgICAgICAgIkNQREZfQW5ub3Q6OlJJQ0hNRURJQSB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KENQREZfQW5ub3Q6OlN1YnR5cGU6OlhGQVdJREdFVCkgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfQU5OT1RfWEZBV0lER0VULAorICAgICAgICAgICAgICAiQ1BERl9Bbm5vdDo6WEZBV0lER0VUIHZhbHVlIG1pc21hdGNoIik7CisKKy8vIFRoZXNlIGNoZWNrcyBlbnN1cmUgdGhlIGNvbnNpc3RlbmN5IG9mIGFubm90YXRpb24gYXBwZWFyYW5jZSBtb2RlIHZhbHVlcworLy8gYWNyb3NzIGNvcmUvIGFuZCBwdWJsaWMuCitzdGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PGludD4oQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGU6Ok5vcm1hbCkgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfQU5OT1RfQVBQRUFSQU5DRU1PREVfTk9STUFMLAorICAgICAgICAgICAgICAiQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGU6Ok5vcm1hbCB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlOjpSb2xsb3ZlcikgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfQU5OT1RfQVBQRUFSQU5DRU1PREVfUk9MTE9WRVIsCisgICAgICAgICAgICAgICJDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZTo6Um9sbG92ZXIgdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZTo6RG93bikgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfQU5OT1RfQVBQRUFSQU5DRU1PREVfRE9XTiwKKyAgICAgICAgICAgICAgIkNQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlOjpEb3duIHZhbHVlIG1pc21hdGNoIik7CisKKy8vIFRoZXNlIGNoZWNrcyBlbnN1cmUgdGhlIGNvbnNpc3RlbmN5IG9mIGRpY3Rpb25hcnkgdmFsdWUgdHlwZXMgYWNyb3NzIGNvcmUvCisvLyBhbmQgcHVibGljLy4KK3N0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihDUERGX09iamVjdDo6VHlwZTo6Qk9PTEVBTikgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfT0JKRUNUX0JPT0xFQU4sCisgICAgICAgICAgICAgICJDUERGX09iamVjdDo6Qk9PTEVBTiB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KENQREZfT2JqZWN0OjpUeXBlOjpOVU1CRVIpID09IEZQREZfT0JKRUNUX05VTUJFUiwKKyAgICAgICAgICAgICAgIkNQREZfT2JqZWN0OjpOVU1CRVIgdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihDUERGX09iamVjdDo6VHlwZTo6U1RSSU5HKSA9PSBGUERGX09CSkVDVF9TVFJJTkcsCisgICAgICAgICAgICAgICJDUERGX09iamVjdDo6U1RSSU5HIHZhbHVlIG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PGludD4oQ1BERl9PYmplY3Q6OlR5cGU6Ok5BTUUpID09IEZQREZfT0JKRUNUX05BTUUsCisgICAgICAgICAgICAgICJDUERGX09iamVjdDo6TkFNRSB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KENQREZfT2JqZWN0OjpUeXBlOjpBUlJBWSkgPT0gRlBERl9PQkpFQ1RfQVJSQVksCisgICAgICAgICAgICAgICJDUERGX09iamVjdDo6QVJSQVkgdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihDUERGX09iamVjdDo6VHlwZTo6RElDVElPTkFSWSkgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfT0JKRUNUX0RJQ1RJT05BUlksCisgICAgICAgICAgICAgICJDUERGX09iamVjdDo6RElDVElPTkFSWSB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KENQREZfT2JqZWN0OjpUeXBlOjpTVFJFQU0pID09IEZQREZfT0JKRUNUX1NUUkVBTSwKKyAgICAgICAgICAgICAgIkNQREZfT2JqZWN0OjpTVFJFQU0gdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihDUERGX09iamVjdDo6VHlwZTo6TlVMTE9CSikgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfT0JKRUNUX05VTExPQkosCisgICAgICAgICAgICAgICJDUERGX09iamVjdDo6TlVMTE9CSiB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KENQREZfT2JqZWN0OjpUeXBlOjpSRUZFUkVOQ0UpID09CisgICAgICAgICAgICAgICAgICBGUERGX09CSkVDVF9SRUZFUkVOQ0UsCisgICAgICAgICAgICAgICJDUERGX09iamVjdDo6UkVGRVJFTkNFIHZhbHVlIG1pc21hdGNoIik7CisKK2NsYXNzIENQREZfQW5ub3RDb250ZXh0IHsKKyBwdWJsaWM6CisgIENQREZfQW5ub3RDb250ZXh0KENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCwKKyAgICAgICAgICAgICAgICAgICAgQ1BERl9QYWdlKiBwUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0pCisgICAgICA6IG1fcEFubm90RGljdChwQW5ub3REaWN0KSwgbV9wUGFnZShwUGFnZSkgeworICAgIFNldEZvcm0ocFN0cmVhbSk7CisgIH0KKyAgfkNQREZfQW5ub3RDb250ZXh0KCkge30KKworICBib29sIEhhc0Zvcm0oKSBjb25zdCB7IHJldHVybiAhIW1fcEFubm90Rm9ybTsgfQorCisgIHZvaWQgU2V0Rm9ybShDUERGX1N0cmVhbSogcFN0cmVhbSkgeworICAgIGlmICghcFN0cmVhbSkKKyAgICAgIHJldHVybjsKKworICAgIC8vIFJlc2V0IHRoZSBhbm5vdGF0aW9uIG1hdHJpeCB0byBiZSB0aGUgaWRlbnRpdHkgbWF0cml4LCBzaW5jZSB0aGUKKyAgICAvLyBhcHBlYXJhbmNlIHN0cmVhbSBhbHJlYWR5IHRha2VzIG1hdHJpeCBpbnRvIGFjY291bnQuCisgICAgcFN0cmVhbS0+R2V0RGljdCgpLT5TZXRNYXRyaXhGb3IoIk1hdHJpeCIsIENGWF9NYXRyaXgoKSk7CisKKyAgICBtX3BBbm5vdEZvcm0gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9Gb3JtPigKKyAgICAgICAgbV9wUGFnZS0+bV9wRG9jdW1lbnQuR2V0KCksIG1fcFBhZ2UtPm1fcFJlc291cmNlcy5HZXQoKSwgcFN0cmVhbSk7CisgICAgbV9wQW5ub3RGb3JtLT5QYXJzZUNvbnRlbnQoKTsKKyAgfQorCisgIENQREZfRm9ybSogR2V0Rm9ybSgpIGNvbnN0IHsgcmV0dXJuIG1fcEFubm90Rm9ybS5nZXQoKTsgfQorICBDUERGX0RpY3Rpb25hcnkqIEdldEFubm90RGljdCgpIGNvbnN0IHsgcmV0dXJuIG1fcEFubm90RGljdC5HZXQoKTsgfQorICBDUERGX1BhZ2UqIEdldFBhZ2UoKSBjb25zdCB7IHJldHVybiBtX3BQYWdlLkdldCgpOyB9CisKKyBwcml2YXRlOgorICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Gb3JtPiBtX3BBbm5vdEZvcm07CisgIFVub3duZWRQdHI8Q1BERl9EaWN0aW9uYXJ5PiBtX3BBbm5vdERpY3Q7CisgIFVub3duZWRQdHI8Q1BERl9QYWdlPiBtX3BQYWdlOworfTsKKworQ1BERl9Bbm5vdENvbnRleHQqIENQREZBbm5vdENvbnRleHRGcm9tRlBERkFubm90YXRpb24oRlBERl9BTk5PVEFUSU9OIGFubm90KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxDUERGX0Fubm90Q29udGV4dCo+KGFubm90KTsKK30KKworYm9vbCBIYXNBUFN0cmVhbShjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QpIHsKKyAgcmV0dXJuICEhRlBERkRPQ19HZXRBbm5vdEFQKHBBbm5vdERpY3QsIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlOjpOb3JtYWwpOworfQorCit2b2lkIFVwZGF0ZUNvbnRlbnRTdHJlYW0oQ1BERl9Gb3JtKiBwRm9ybSwgQ1BERl9TdHJlYW0qIHBTdHJlYW0pIHsKKyAgQVNTRVJUKHBGb3JtKTsKKyAgQVNTRVJUKHBTdHJlYW0pOworCisgIENQREZfUGFnZUNvbnRlbnRHZW5lcmF0b3IgZ2VuZXJhdG9yKHBGb3JtKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGJ1ZjsKKyAgZ2VuZXJhdG9yLlByb2Nlc3NQYWdlT2JqZWN0cygmYnVmKTsKKyAgcFN0cmVhbS0+U2V0RGF0YUFuZFJlbW92ZUZpbHRlcigmYnVmKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCitGUERGQW5ub3RfSXNTdXBwb3J0ZWRTdWJ0eXBlKEZQREZfQU5OT1RBVElPTl9TVUJUWVBFIHN1YnR5cGUpIHsKKyAgLy8gVGhlIHN1cHBvcnRlZCBzdWJ0eXBlcyBtdXN0IGFsc28gYmUgY29tbXVuaWNhdGVkIGluIHRoZSB1c2VyIGRvYy4KKyAgcmV0dXJuIHN1YnR5cGUgPT0gRlBERl9BTk5PVF9DSVJDTEUgfHwgc3VidHlwZSA9PSBGUERGX0FOTk9UX0hJR0hMSUdIVCB8fAorICAgICAgICAgc3VidHlwZSA9PSBGUERGX0FOTk9UX0lOSyB8fCBzdWJ0eXBlID09IEZQREZfQU5OT1RfUE9QVVAgfHwKKyAgICAgICAgIHN1YnR5cGUgPT0gRlBERl9BTk5PVF9TUVVBUkUgfHwgc3VidHlwZSA9PSBGUERGX0FOTk9UX1NRVUlHR0xZIHx8CisgICAgICAgICBzdWJ0eXBlID09IEZQREZfQU5OT1RfU1RBTVAgfHwgc3VidHlwZSA9PSBGUERGX0FOTk9UX1NUUklLRU9VVCB8fAorICAgICAgICAgc3VidHlwZSA9PSBGUERGX0FOTk9UX1RFWFQgfHwgc3VidHlwZSA9PSBGUERGX0FOTk9UX1VOREVSTElORTsKK30KKworRlBERl9FWFBPUlQgRlBERl9BTk5PVEFUSU9OIEZQREZfQ0FMTENPTlYKK0ZQREZQYWdlX0NyZWF0ZUFubm90KEZQREZfUEFHRSBwYWdlLCBGUERGX0FOTk9UQVRJT05fU1VCVFlQRSBzdWJ0eXBlKSB7CisgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKKyAgaWYgKCFwUGFnZSB8fCAhRlBERkFubm90X0lzU3VwcG9ydGVkU3VidHlwZShzdWJ0eXBlKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBhdXRvIHBEaWN0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4oCisgICAgICBwUGFnZS0+bV9wRG9jdW1lbnQtPkdldEJ5dGVTdHJpbmdQb29sKCkpOworICBwRGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIlR5cGUiLCAiQW5ub3QiKTsKKyAgcERpY3QtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJTdWJ0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQW5ub3Q6OkFubm90U3VidHlwZVRvU3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENQREZfQW5ub3Q6OlN1YnR5cGU+KHN1YnR5cGUpKSk7CisgIGF1dG8gcE5ld0Fubm90ID0KKyAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0Fubm90Q29udGV4dD4ocERpY3QuZ2V0KCksIHBQYWdlLCBudWxscHRyKTsKKworICBDUERGX0FycmF5KiBwQW5ub3RMaXN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0LT5HZXRBcnJheUZvcigiQW5ub3RzIik7CisgIGlmICghcEFubm90TGlzdCkKKyAgICBwQW5ub3RMaXN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0LT5TZXROZXdGb3I8Q1BERl9BcnJheT4oIkFubm90cyIpOworCisgIHBBbm5vdExpc3QtPkFkZChzdGQ6Om1vdmUocERpY3QpKTsKKyAgcmV0dXJuIHBOZXdBbm5vdC5yZWxlYXNlKCk7Cit9CisKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZQYWdlX0dldEFubm90Q291bnQoRlBERl9QQUdFIHBhZ2UpIHsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOworICBpZiAoIXBQYWdlIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QpCisgICAgcmV0dXJuIDA7CisKKyAgQ1BERl9BcnJheSogcEFubm90cyA9IHBQYWdlLT5tX3BGb3JtRGljdC0+R2V0QXJyYXlGb3IoIkFubm90cyIpOworICByZXR1cm4gcEFubm90cyA/IHBBbm5vdHMtPkdldENvdW50KCkgOiAwOworfQorCitGUERGX0VYUE9SVCBGUERGX0FOTk9UQVRJT04gRlBERl9DQUxMQ09OViBGUERGUGFnZV9HZXRBbm5vdChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgeworICBDUERGX1BhZ2UqIHBQYWdlID0gQ1BERlBhZ2VGcm9tRlBERlBhZ2UocGFnZSk7CisgIGlmICghcFBhZ2UgfHwgIXBQYWdlLT5tX3BGb3JtRGljdCB8fCBpbmRleCA8IDApCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQ1BERl9BcnJheSogcEFubm90cyA9IHBQYWdlLT5tX3BGb3JtRGljdC0+R2V0QXJyYXlGb3IoIkFubm90cyIpOworICBpZiAoIXBBbm5vdHMgfHwgc3RhdGljX2Nhc3Q8c2l6ZV90PihpbmRleCkgPj0gcEFubm90cy0+R2V0Q291bnQoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gVG9EaWN0aW9uYXJ5KHBBbm5vdHMtPkdldERpcmVjdE9iamVjdEF0KGluZGV4KSk7CisgIGF1dG8gcE5ld0Fubm90ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfQW5ub3RDb250ZXh0PihwRGljdCwgcFBhZ2UsIG51bGxwdHIpOworICByZXR1cm4gcE5ld0Fubm90LnJlbGVhc2UoKTsKK30KKworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERlBhZ2VfR2V0QW5ub3RJbmRleChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9BTk5PVEFUSU9OIGFubm90KSB7CisgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKKyAgQ1BERl9Bbm5vdENvbnRleHQqIHBBbm5vdCA9IENQREZBbm5vdENvbnRleHRGcm9tRlBERkFubm90YXRpb24oYW5ub3QpOworICBpZiAoIXBQYWdlIHx8ICFwUGFnZS0+bV9wRm9ybURpY3QgfHwgIXBBbm5vdCB8fCAhcEFubm90LT5HZXRBbm5vdERpY3QoKSkKKyAgICByZXR1cm4gLTE7CisKKyAgQ1BERl9BcnJheSogcEFubm90cyA9IHBQYWdlLT5tX3BGb3JtRGljdC0+R2V0QXJyYXlGb3IoIkFubm90cyIpOworICBpZiAoIXBBbm5vdHMpCisgICAgcmV0dXJuIC0xOworCisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwQW5ub3QtPkdldEFubm90RGljdCgpOworICBhdXRvIGl0ID0KKyAgICAgIHN0ZDo6ZmluZF9pZihwQW5ub3RzLT5iZWdpbigpLCBwQW5ub3RzLT5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICBbcERpY3RdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4mIGNhbmRpZGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZS0+R2V0RGlyZWN0KCkgPT0gcERpY3Q7CisgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgaWYgKGl0ID09IHBBbm5vdHMtPmVuZCgpKQorICAgIHJldHVybiAtMTsKKworICByZXR1cm4gaXQgLSBwQW5ub3RzLT5iZWdpbigpOworfQorCitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRlBERlBhZ2VfQ2xvc2VBbm5vdChGUERGX0FOTk9UQVRJT04gYW5ub3QpIHsKKyAgZGVsZXRlIENQREZBbm5vdENvbnRleHRGcm9tRlBERkFubm90YXRpb24oYW5ub3QpOworfQorCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGUGFnZV9SZW1vdmVBbm5vdChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgeworICBDUERGX1BhZ2UqIHBQYWdlID0gQ1BERlBhZ2VGcm9tRlBERlBhZ2UocGFnZSk7CisgIGlmICghcFBhZ2UgfHwgIXBQYWdlLT5tX3BGb3JtRGljdCB8fCBpbmRleCA8IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIENQREZfQXJyYXkqIHBBbm5vdHMgPSBwUGFnZS0+bV9wRm9ybURpY3QtPkdldEFycmF5Rm9yKCJBbm5vdHMiKTsKKyAgaWYgKCFwQW5ub3RzIHx8IHN0YXRpY19jYXN0PHNpemVfdD4oaW5kZXgpID49IHBBbm5vdHMtPkdldENvdW50KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHBBbm5vdHMtPlJlbW92ZUF0KGluZGV4KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ZQREZfRVhQT1JUIEZQREZfQU5OT1RBVElPTl9TVUJUWVBFIEZQREZfQ0FMTENPTlYKK0ZQREZBbm5vdF9HZXRTdWJ0eXBlKEZQREZfQU5OT1RBVElPTiBhbm5vdCkgeworICBpZiAoIWFubm90KQorICAgIHJldHVybiBGUERGX0FOTk9UX1VOS05PV047CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0ID0KKyAgICAgIENQREZBbm5vdENvbnRleHRGcm9tRlBERkFubm90YXRpb24oYW5ub3QpLT5HZXRBbm5vdERpY3QoKTsKKyAgaWYgKCFwQW5ub3REaWN0KQorICAgIHJldHVybiBGUERGX0FOTk9UX1VOS05PV047CisKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEZQREZfQU5OT1RBVElPTl9TVUJUWVBFPigKKyAgICAgIENQREZfQW5ub3Q6OlN0cmluZ1RvQW5ub3RTdWJ0eXBlKHBBbm5vdERpY3QtPkdldFN0cmluZ0ZvcigiU3VidHlwZSIpKSk7Cit9CisKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCitGUERGQW5ub3RfSXNPYmplY3RTdXBwb3J0ZWRTdWJ0eXBlKEZQREZfQU5OT1RBVElPTl9TVUJUWVBFIHN1YnR5cGUpIHsKKyAgLy8gVGhlIHN1cHBvcnRlZCBzdWJ0eXBlcyBtdXN0IGFsc28gYmUgY29tbXVuaWNhdGVkIGluIHRoZSB1c2VyIGRvYy4KKyAgcmV0dXJuIHN1YnR5cGUgPT0gRlBERl9BTk5PVF9JTksgfHwgc3VidHlwZSA9PSBGUERGX0FOTk9UX1NUQU1QOworfQorCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgorRlBERkFubm90X1VwZGF0ZU9iamVjdChGUERGX0FOTk9UQVRJT04gYW5ub3QsIEZQREZfUEFHRU9CSkVDVCBvYmopIHsKKyAgQ1BERl9Bbm5vdENvbnRleHQqIHBBbm5vdCA9IENQREZBbm5vdENvbnRleHRGcm9tRlBERkFubm90YXRpb24oYW5ub3QpOworICBDUERGX1BhZ2VPYmplY3QqIHBPYmogPSBDUERGUGFnZU9iamVjdEZyb21GUERGUGFnZU9iamVjdChvYmopOworICBpZiAoIXBBbm5vdCB8fCAhcEFubm90LT5HZXRBbm5vdERpY3QoKSB8fCAhcEFubm90LT5IYXNGb3JtKCkgfHwgIXBPYmopCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIENoZWNrIHRoYXQgdGhlIGFubm90YXRpb24gdHlwZSBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBtZXRob2QuCisgIGlmICghRlBERkFubm90X0lzT2JqZWN0U3VwcG9ydGVkU3VidHlwZShGUERGQW5ub3RfR2V0U3VidHlwZShhbm5vdCkpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBhbm5vdGF0aW9uIGFscmVhZHkgaGFzIGFuIGFwcGVhcmFuY2Ugc3RyZWFtLCBzaW5jZSBhbgorICAvLyBleGlzdGluZyBvYmplY3QgaXMgdG8gYmUgdXBkYXRlZC4KKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBGUERGRE9DX0dldEFubm90QVAocEFubm90LT5HZXRBbm5vdERpY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGU6Ok5vcm1hbCk7CisgIGlmICghcFN0cmVhbSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgb2JqZWN0IGlzIGFscmVhZHkgaW4gdGhpcyBhbm5vdGF0aW9uJ3Mgb2JqZWN0IGxpc3QuCisgIENQREZfRm9ybSogcEZvcm0gPSBwQW5ub3QtPkdldEZvcm0oKTsKKyAgQ1BERl9QYWdlT2JqZWN0TGlzdCogcE9iakxpc3QgPSBwRm9ybS0+R2V0UGFnZU9iamVjdExpc3QoKTsKKyAgYXV0byBpdCA9CisgICAgICBzdGQ6OmZpbmRfaWYocE9iakxpc3QtPmJlZ2luKCksIHBPYmpMaXN0LT5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICBbcE9ial0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPENQREZfUGFnZU9iamVjdD4mIGNhbmRpZGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZS5nZXQoKSA9PSBwT2JqOworICAgICAgICAgICAgICAgICAgIH0pOworICBpZiAoaXQgPT0gcE9iakxpc3QtPmVuZCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBVcGRhdGUgdGhlIGNvbnRlbnQgc3RyZWFtIGRhdGEgaW4gdGhlIGFubm90YXRpb24ncyBBUCBzdHJlYW0uCisgIFVwZGF0ZUNvbnRlbnRTdHJlYW0ocEZvcm0sIHBTdHJlYW0pOworICByZXR1cm4gdHJ1ZTsKK30KKworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZBbm5vdF9BcHBlbmRPYmplY3QoRlBERl9BTk5PVEFUSU9OIGFubm90LCBGUERGX1BBR0VPQkpFQ1Qgb2JqKSB7CisgIENQREZfQW5ub3RDb250ZXh0KiBwQW5ub3QgPSBDUERGQW5ub3RDb250ZXh0RnJvbUZQREZBbm5vdGF0aW9uKGFubm90KTsKKyAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqID0gQ1BERlBhZ2VPYmplY3RGcm9tRlBERlBhZ2VPYmplY3Qob2JqKTsKKyAgaWYgKCFwQW5ub3QgfHwgIXBPYmopCisgICAgcmV0dXJuIGZhbHNlOworCisgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCA9IHBBbm5vdC0+R2V0QW5ub3REaWN0KCk7CisgIENQREZfUGFnZSogcFBhZ2UgPSBwQW5ub3QtPkdldFBhZ2UoKTsKKyAgaWYgKCFwQW5ub3REaWN0IHx8ICFwUGFnZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgYW5ub3RhdGlvbiB0eXBlIGlzIHN1cHBvcnRlZCBieSB0aGlzIG1ldGhvZC4KKyAgaWYgKCFGUERGQW5ub3RfSXNPYmplY3RTdXBwb3J0ZWRTdWJ0eXBlKEZQREZBbm5vdF9HZXRTdWJ0eXBlKGFubm90KSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIElmIHRoZSBhbm5vdGF0aW9uIGRvZXMgbm90IGhhdmUgYW4gQVAgc3RyZWFtIHlldCwgZ2VuZXJhdGUgYW5kIHNldCBpdC4KKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBGUERGRE9DX0dldEFubm90QVAocEFubm90LT5HZXRBbm5vdERpY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGU6Ok5vcm1hbCk7CisgIGlmICghcFN0cmVhbSkgeworICAgIENQVlRfR2VuZXJhdGVBUDo6R2VuZXJhdGVFbXB0eUFQKHBQYWdlLT5tX3BEb2N1bWVudC5HZXQoKSwgcEFubm90RGljdCk7CisgICAgcFN0cmVhbSA9CisgICAgICAgIEZQREZET0NfR2V0QW5ub3RBUChwQW5ub3REaWN0LCBDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZTo6Tm9ybWFsKTsKKyAgICBpZiAoIXBTdHJlYW0pCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBHZXQgdGhlIGFubm90YXRpb24ncyBjb3JyZXNwb25kaW5nIGZvcm0gb2JqZWN0IGZvciBwYXJzaW5nIGl0cyBBUCBzdHJlYW0uCisgIGlmICghcEFubm90LT5IYXNGb3JtKCkpCisgICAgcEFubm90LT5TZXRGb3JtKHBTdHJlYW0pOworCisgIC8vIENoZWNrIHRoYXQgdGhlIG9iamVjdCBkaWQgbm90IGNvbWUgZnJvbSB0aGUgc2FtZSBhbm5vdGF0aW9uLiBJZiB0aGlzIGNoZWNrCisgIC8vIHN1Y2NlZWRzLCB0aGVuIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgb2JqZWN0IGNhbWUgZnJvbQorICAvLyBGUERGUGFnZU9ial9DcmVhdGVOZXd7UGF0aHxSZWN0fSgpIG9yIEZQREZQYWdlT2JqX05ld3tUZXh0fEltYWdlfU9iaigpLgorICAvLyBOb3RlIHRoYXQgYW4gb2JqZWN0IHRoYXQgY2FtZSBmcm9tIGEgZGlmZmVyZW50IGFubm90YXRpb24gbXVzdCBub3QgYmUKKyAgLy8gcGFzc2VkIGhlcmUsIHNpbmNlIGFuIG9iamVjdCBjYW5ub3QgYmVsb25nIHRvIG1vcmUgdGhhbiBvbmUgYW5ub3RhdGlvbi4KKyAgQ1BERl9Gb3JtKiBwRm9ybSA9IHBBbm5vdC0+R2V0Rm9ybSgpOworICBDUERGX1BhZ2VPYmplY3RMaXN0KiBwT2JqTGlzdCA9IHBGb3JtLT5HZXRQYWdlT2JqZWN0TGlzdCgpOworICBhdXRvIGl0ID0KKyAgICAgIHN0ZDo6ZmluZF9pZihwT2JqTGlzdC0+YmVnaW4oKSwgcE9iakxpc3QtPmVuZCgpLAorICAgICAgICAgICAgICAgICAgIFtwT2JqXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9QYWdlT2JqZWN0PiYgY2FuZGlkYXRlKSB7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlLmdldCgpID09IHBPYmo7CisgICAgICAgICAgICAgICAgICAgfSk7CisgIGlmIChpdCAhPSBwT2JqTGlzdC0+ZW5kKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIEFwcGVuZCB0aGUgb2JqZWN0IHRvIHRoZSBvYmplY3QgbGlzdC4KKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfUGFnZU9iamVjdD4gcFBhZ2VPYmpIb2xkZXIocE9iaik7CisgIHBPYmpMaXN0LT5wdXNoX2JhY2soc3RkOjptb3ZlKHBQYWdlT2JqSG9sZGVyKSk7CisKKyAgLy8gU2V0IHRoZSBjb250ZW50IHN0cmVhbSBkYXRhIGluIHRoZSBhbm5vdGF0aW9uJ3MgQVAgc3RyZWFtLgorICBVcGRhdGVDb250ZW50U3RyZWFtKHBGb3JtLCBwU3RyZWFtKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZBbm5vdF9HZXRPYmplY3RDb3VudChGUERGX0FOTk9UQVRJT04gYW5ub3QpIHsKKyAgQ1BERl9Bbm5vdENvbnRleHQqIHBBbm5vdCA9IENQREZBbm5vdENvbnRleHRGcm9tRlBERkFubm90YXRpb24oYW5ub3QpOworICBpZiAoIXBBbm5vdCB8fCAhcEFubm90LT5HZXRBbm5vdERpY3QoKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoIXBBbm5vdC0+SGFzRm9ybSgpKSB7CisgICAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBGUERGRE9DX0dldEFubm90QVAoCisgICAgICAgIHBBbm5vdC0+R2V0QW5ub3REaWN0KCksIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlOjpOb3JtYWwpOworICAgIGlmICghcFN0cmVhbSkKKyAgICAgIHJldHVybiAwOworCisgICAgcEFubm90LT5TZXRGb3JtKHBTdHJlYW0pOworICB9CisgIHJldHVybiBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludD4oKnBBbm5vdC0+R2V0Rm9ybSgpLT5HZXRQYWdlT2JqZWN0TGlzdCgpKTsKK30KKworRlBERl9FWFBPUlQgRlBERl9QQUdFT0JKRUNUIEZQREZfQ0FMTENPTlYKK0ZQREZBbm5vdF9HZXRPYmplY3QoRlBERl9BTk5PVEFUSU9OIGFubm90LCBpbnQgaW5kZXgpIHsKKyAgQ1BERl9Bbm5vdENvbnRleHQqIHBBbm5vdCA9IENQREZBbm5vdENvbnRleHRGcm9tRlBERkFubm90YXRpb24oYW5ub3QpOworICBpZiAoIXBBbm5vdCB8fCAhcEFubm90LT5HZXRBbm5vdERpY3QoKSB8fCBpbmRleCA8IDApCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgaWYgKCFwQW5ub3QtPkhhc0Zvcm0oKSkgeworICAgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gRlBERkRPQ19HZXRBbm5vdEFQKAorICAgICAgICBwQW5ub3QtPkdldEFubm90RGljdCgpLCBDUERGX0Fubm90OjpBcHBlYXJhbmNlTW9kZTo6Tm9ybWFsKTsKKyAgICBpZiAoIXBTdHJlYW0pCisgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIHBBbm5vdC0+U2V0Rm9ybShwU3RyZWFtKTsKKyAgfQorCisgIHJldHVybiBwQW5ub3QtPkdldEZvcm0oKS0+R2V0UGFnZU9iamVjdExpc3QoKS0+R2V0UGFnZU9iamVjdEJ5SW5kZXgoaW5kZXgpOworfQorCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgorRlBERkFubm90X1JlbW92ZU9iamVjdChGUERGX0FOTk9UQVRJT04gYW5ub3QsIGludCBpbmRleCkgeworICBDUERGX0Fubm90Q29udGV4dCogcEFubm90ID0gQ1BERkFubm90Q29udGV4dEZyb21GUERGQW5ub3RhdGlvbihhbm5vdCk7CisgIGlmICghcEFubm90IHx8ICFwQW5ub3QtPkdldEFubm90RGljdCgpIHx8ICFwQW5ub3QtPkhhc0Zvcm0oKSB8fCBpbmRleCA8IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIENoZWNrIHRoYXQgdGhlIGFubm90YXRpb24gdHlwZSBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBtZXRob2QuCisgIGlmICghRlBERkFubm90X0lzT2JqZWN0U3VwcG9ydGVkU3VidHlwZShGUERGQW5ub3RfR2V0U3VidHlwZShhbm5vdCkpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBhbm5vdGF0aW9uIGFscmVhZHkgaGFzIGFuIGFwcGVhcmFuY2Ugc3RyZWFtLCBzaW5jZSBhbgorICAvLyBleGlzdGluZyBvYmplY3QgaXMgdG8gYmUgZGVsZXRlZC4KKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBGUERGRE9DX0dldEFubm90QVAocEFubm90LT5HZXRBbm5vdERpY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGU6Ok5vcm1hbCk7CisgIGlmICghcFN0cmVhbSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQ1BERl9QYWdlT2JqZWN0TGlzdCogcE9iakxpc3QgPSBwQW5ub3QtPkdldEZvcm0oKS0+R2V0UGFnZU9iamVjdExpc3QoKTsKKyAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4oaW5kZXgpID49IHBPYmpMaXN0LT5zaXplKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHBPYmpMaXN0LT5lcmFzZShwT2JqTGlzdC0+YmVnaW4oKSArIGluZGV4KTsKKyAgVXBkYXRlQ29udGVudFN0cmVhbShwQW5ub3QtPkdldEZvcm0oKSwgcFN0cmVhbSk7CisgIHJldHVybiB0cnVlOworfQorCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGQW5ub3RfU2V0Q29sb3IoRlBERl9BTk5PVEFUSU9OIGFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZBTk5PVF9DT0xPUlRZUEUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgQSkgeworICBpZiAoIWFubm90IHx8IFIgPiAyNTUgfHwgRyA+IDI1NSB8fCBCID4gMjU1IHx8IEEgPiAyNTUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCA9CisgICAgICBDUERGQW5ub3RDb250ZXh0RnJvbUZQREZBbm5vdGF0aW9uKGFubm90KS0+R2V0QW5ub3REaWN0KCk7CisgIGlmICghcEFubm90RGljdCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gRm9yIGFubm90YXRpb25zIHdpdGggdGhlaXIgYXBwZWFyYW5jZSBzdHJlYW1zIGFscmVhZHkgZGVmaW5lZCwgdGhlIHBhdGgKKyAgLy8gc3RyZWFtJ3Mgb3duIGNvbG9yIGRlZmluaXRpb25zIHRha2UgcHJpb3JpdHkgb3ZlciB0aGUgYW5ub3RhdGlvbiBjb2xvcgorICAvLyBkZWZpbml0aW9ucyBzZXQgYnkgdGhpcyBtZXRob2QsIGhlbmNlIHRoaXMgbWV0aG9kIHdpbGwgc2ltcGx5IGZhaWwuCisgIGlmIChIYXNBUFN0cmVhbShwQW5ub3REaWN0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gU2V0IHRoZSBvcGFjaXR5IG9mIHRoZSBhbm5vdGF0aW9uLgorICBwQW5ub3REaWN0LT5TZXROZXdGb3I8Q1BERl9OdW1iZXI+KCJDQSIsIEEgLyAyNTUuZik7CisKKyAgLy8gU2V0IHRoZSBjb2xvciBvZiB0aGUgYW5ub3RhdGlvbi4KKyAgQnl0ZVN0cmluZyBrZXkgPSB0eXBlID09IEZQREZBTk5PVF9DT0xPUlRZUEVfSW50ZXJpb3JDb2xvciA/ICJJQyIgOiAiQyI7CisgIENQREZfQXJyYXkqIHBDb2xvciA9IHBBbm5vdERpY3QtPkdldEFycmF5Rm9yKGtleSk7CisgIGlmIChwQ29sb3IpCisgICAgcENvbG9yLT5DbGVhcigpOworICBlbHNlCisgICAgcENvbG9yID0gcEFubm90RGljdC0+U2V0TmV3Rm9yPENQREZfQXJyYXk+KGtleSk7CisKKyAgcENvbG9yLT5BZGROZXc8Q1BERl9OdW1iZXI+KFIgLyAyNTUuZik7CisgIHBDb2xvci0+QWRkTmV3PENQREZfTnVtYmVyPihHIC8gMjU1LmYpOworICBwQ29sb3ItPkFkZE5ldzxDUERGX051bWJlcj4oQiAvIDI1NS5mKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRlBERkFubm90X0dldENvbG9yKEZQREZfQU5OT1RBVElPTiBhbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGQU5OT1RfQ09MT1JUWVBFIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50KiBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCogRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQqIEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50KiBBKSB7CisgIGlmICghYW5ub3QgfHwgIVIgfHwgIUcgfHwgIUIgfHwgIUEpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCA9CisgICAgICBDUERGQW5ub3RDb250ZXh0RnJvbUZQREZBbm5vdGF0aW9uKGFubm90KS0+R2V0QW5ub3REaWN0KCk7CisgIGlmICghcEFubm90RGljdCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gRm9yIGFubm90YXRpb25zIHdpdGggdGhlaXIgYXBwZWFyYW5jZSBzdHJlYW1zIGFscmVhZHkgZGVmaW5lZCwgdGhlIHBhdGgKKyAgLy8gc3RyZWFtJ3Mgb3duIGNvbG9yIGRlZmluaXRpb25zIHRha2UgcHJpb3JpdHkgb3ZlciB0aGUgYW5ub3RhdGlvbiBjb2xvcgorICAvLyBkZWZpbml0aW9ucyByZXRyaWV2ZWQgYnkgdGhpcyBtZXRob2QsIGhlbmNlIHRoaXMgbWV0aG9kIHdpbGwgc2ltcGx5IGZhaWwuCisgIGlmIChIYXNBUFN0cmVhbShwQW5ub3REaWN0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQ1BERl9BcnJheSogcENvbG9yID0gcEFubm90RGljdC0+R2V0QXJyYXlGb3IoCisgICAgICB0eXBlID09IEZQREZBTk5PVF9DT0xPUlRZUEVfSW50ZXJpb3JDb2xvciA/ICJJQyIgOiAiQyIpOworICAqQSA9CisgICAgICAocEFubm90RGljdC0+S2V5RXhpc3QoIkNBIikgPyBwQW5ub3REaWN0LT5HZXROdW1iZXJGb3IoIkNBIikgOiAxKSAqIDI1NS5mOworICBpZiAoIXBDb2xvcikgeworICAgIC8vIFVzZSBkZWZhdWx0IGNvbG9yLiBUaGUgZGVmYXVsdCBjb2xvcnMgbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIG9uZXMKKyAgICAvLyB1c2VkIHRvIGdlbmVyYXRlIEFQLiBTZWUgY2FsbHMgdG8gR2V0Q29sb3JTdHJpbmdXaXRoRGVmYXVsdCgpIGluCisgICAgLy8gQ1BWVF9HZW5lcmF0ZUFQOjpHZW5lcmF0ZSpBUCgpLgorICAgIGlmIChwQW5ub3REaWN0LT5HZXRTdHJpbmdGb3IoIlN1YnR5cGUiKSA9PSAiSGlnaGxpZ2h0IikgeworICAgICAgKlIgPSAyNTU7CisgICAgICAqRyA9IDI1NTsKKyAgICAgICpCID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgKlIgPSAwOworICAgICAgKkcgPSAwOworICAgICAgKkIgPSAwOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIENGWF9Db2xvciBjb2xvciA9IENGWF9Db2xvcjo6UGFyc2VDb2xvcigqcENvbG9yKTsKKyAgc3dpdGNoIChjb2xvci5uQ29sb3JUeXBlKSB7CisgICAgY2FzZSBDRlhfQ29sb3I6OmtSR0I6CisgICAgICAqUiA9IGNvbG9yLmZDb2xvcjEgKiAyNTUuZjsKKyAgICAgICpHID0gY29sb3IuZkNvbG9yMiAqIDI1NS5mOworICAgICAgKkIgPSBjb2xvci5mQ29sb3IzICogMjU1LmY7CisgICAgICBicmVhazsKKyAgICBjYXNlIENGWF9Db2xvcjo6a0dyYXk6CisgICAgICAqUiA9IDI1NS5mICogY29sb3IuZkNvbG9yMTsKKyAgICAgICpHID0gMjU1LmYgKiBjb2xvci5mQ29sb3IxOworICAgICAgKkIgPSAyNTUuZiAqIGNvbG9yLmZDb2xvcjE7CisgICAgICBicmVhazsKKyAgICBjYXNlIENGWF9Db2xvcjo6a0NNWUs6CisgICAgICAqUiA9IDI1NS5mICogKDEgLSBjb2xvci5mQ29sb3IxKSAqICgxIC0gY29sb3IuZkNvbG9yNCk7CisgICAgICAqRyA9IDI1NS5mICogKDEgLSBjb2xvci5mQ29sb3IyKSAqICgxIC0gY29sb3IuZkNvbG9yNCk7CisgICAgICAqQiA9IDI1NS5mICogKDEgLSBjb2xvci5mQ29sb3IzKSAqICgxIC0gY29sb3IuZkNvbG9yNCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENGWF9Db2xvcjo6a1RyYW5zcGFyZW50OgorICAgICAgKlIgPSAwOworICAgICAgKkcgPSAwOworICAgICAgKkIgPSAwOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCitGUERGQW5ub3RfSGFzQXR0YWNobWVudFBvaW50cyhGUERGX0FOTk9UQVRJT04gYW5ub3QpIHsKKyAgaWYgKCFhbm5vdCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgRlBERl9BTk5PVEFUSU9OX1NVQlRZUEUgc3VidHlwZSA9IEZQREZBbm5vdF9HZXRTdWJ0eXBlKGFubm90KTsKKyAgcmV0dXJuIHN1YnR5cGUgPT0gRlBERl9BTk5PVF9MSU5LIHx8IHN1YnR5cGUgPT0gRlBERl9BTk5PVF9ISUdITElHSFQgfHwKKyAgICAgICAgIHN1YnR5cGUgPT0gRlBERl9BTk5PVF9VTkRFUkxJTkUgfHwgc3VidHlwZSA9PSBGUERGX0FOTk9UX1NRVUlHR0xZIHx8CisgICAgICAgICBzdWJ0eXBlID09IEZQREZfQU5OT1RfU1RSSUtFT1VUOworfQorCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgorRlBERkFubm90X1NldEF0dGFjaG1lbnRQb2ludHMoRlBERl9BTk5PVEFUSU9OIGFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlNfUVVBRFBPSU5UU0YqIHF1YWRQb2ludHMpIHsKKyAgaWYgKCFhbm5vdCB8fCAhcXVhZFBvaW50cyB8fCAhRlBERkFubm90X0hhc0F0dGFjaG1lbnRQb2ludHMoYW5ub3QpKQorICAgIHJldHVybiBmYWxzZTsKKworICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPQorICAgICAgQ1BERkFubm90Q29udGV4dEZyb21GUERGQW5ub3RhdGlvbihhbm5vdCktPkdldEFubm90RGljdCgpOworICBpZiAoIXBBbm5vdERpY3QpCisgICAgcmV0dXJuIGZhbHNlOworCisgIC8vIFVwZGF0ZSB0aGUgIlF1YWRQb2ludHMiIGVudHJ5IGluIHRoZSBhbm5vdGF0aW9uIGRpY3Rpb25hcnkuCisgIENQREZfQXJyYXkqIHBRdWFkUG9pbnRzID0gcEFubm90RGljdC0+R2V0QXJyYXlGb3IoIlF1YWRQb2ludHMiKTsKKyAgaWYgKHBRdWFkUG9pbnRzKQorICAgIHBRdWFkUG9pbnRzLT5DbGVhcigpOworICBlbHNlCisgICAgcFF1YWRQb2ludHMgPSBwQW5ub3REaWN0LT5TZXROZXdGb3I8Q1BERl9BcnJheT4oIlF1YWRQb2ludHMiKTsKKworICBwUXVhZFBvaW50cy0+QWRkTmV3PENQREZfTnVtYmVyPihxdWFkUG9pbnRzLT54MSk7CisgIHBRdWFkUG9pbnRzLT5BZGROZXc8Q1BERl9OdW1iZXI+KHF1YWRQb2ludHMtPnkxKTsKKyAgcFF1YWRQb2ludHMtPkFkZE5ldzxDUERGX051bWJlcj4ocXVhZFBvaW50cy0+eDIpOworICBwUXVhZFBvaW50cy0+QWRkTmV3PENQREZfTnVtYmVyPihxdWFkUG9pbnRzLT55Mik7CisgIHBRdWFkUG9pbnRzLT5BZGROZXc8Q1BERl9OdW1iZXI+KHF1YWRQb2ludHMtPngzKTsKKyAgcFF1YWRQb2ludHMtPkFkZE5ldzxDUERGX051bWJlcj4ocXVhZFBvaW50cy0+eTMpOworICBwUXVhZFBvaW50cy0+QWRkTmV3PENQREZfTnVtYmVyPihxdWFkUG9pbnRzLT54NCk7CisgIHBRdWFkUG9pbnRzLT5BZGROZXc8Q1BERl9OdW1iZXI+KHF1YWRQb2ludHMtPnk0KTsKKworICAvLyBJZiB0aGUgYW5ub3RhdGlvbidzIGFwcGVhcmFuY2Ugc3RyZWFtIGlzIGRlZmluZWQsIGFuZCB0aGUgbmV3IHF1YWRwb2ludHMKKyAgLy8gZGVmaW5lcyBhIGJpZ2dlciBib3VuZGluZyBib3ggdGhhbiB0aGUgYXBwZWFyYW5jZSBzdHJlYW0gY3VycmVudGx5CisgIC8vIHNwZWNpZmllcywgdGhlbiB1cGRhdGUgdGhlICJCQm94IiBlbnRyeSBpbiB0aGUgQVAgZGljdGlvbmFyeSB0b28sIHNpbmNlIGl0CisgIC8vIGNvbWVzIGZyb20gYW5ub3RhdGlvbiBkaWN0aW9uYXJ5J3MgIlF1YWRQb2ludHMiIGVudHJ5LgorICBDUERGX1N0cmVhbSogcFN0cmVhbSA9CisgICAgICBGUERGRE9DX0dldEFubm90QVAocEFubm90RGljdCwgQ1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGU6Ok5vcm1hbCk7CisgIGlmIChwU3RyZWFtKSB7CisgICAgQ0ZYX0Zsb2F0UmVjdCBuZXdSZWN0ID0gQ1BERl9Bbm5vdDo6UmVjdEZyb21RdWFkUG9pbnRzKHBBbm5vdERpY3QpOworICAgIGlmIChuZXdSZWN0LkNvbnRhaW5zKHBTdHJlYW0tPkdldERpY3QoKS0+R2V0UmVjdEZvcigiQkJveCIpKSkKKyAgICAgIHBTdHJlYW0tPkdldERpY3QoKS0+U2V0UmVjdEZvcigiQkJveCIsIG5ld1JlY3QpOworICB9CisgIHJldHVybiB0cnVlOworfQorCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgorRlBERkFubm90X0dldEF0dGFjaG1lbnRQb2ludHMoRlBERl9BTk5PVEFUSU9OIGFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfUVVBRFBPSU5UU0YqIHF1YWRQb2ludHMpIHsKKyAgaWYgKCFhbm5vdCB8fCAhRlBERkFubm90X0hhc0F0dGFjaG1lbnRQb2ludHMoYW5ub3QpIHx8ICFxdWFkUG9pbnRzKQorICAgIHJldHVybiBmYWxzZTsKKworICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPQorICAgICAgQ1BERkFubm90Q29udGV4dEZyb21GUERGQW5ub3RhdGlvbihhbm5vdCktPkdldEFubm90RGljdCgpOworICBpZiAoIXBBbm5vdERpY3QpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENQREZfQXJyYXkqIHBBcnJheSA9IHBBbm5vdERpY3QtPkdldEFycmF5Rm9yKCJRdWFkUG9pbnRzIik7CisgIGlmICghcEFycmF5KQorICAgIHJldHVybiBmYWxzZTsKKworICBxdWFkUG9pbnRzLT54MSA9IHBBcnJheS0+R2V0TnVtYmVyQXQoMCk7CisgIHF1YWRQb2ludHMtPnkxID0gcEFycmF5LT5HZXROdW1iZXJBdCgxKTsKKyAgcXVhZFBvaW50cy0+eDIgPSBwQXJyYXktPkdldE51bWJlckF0KDIpOworICBxdWFkUG9pbnRzLT55MiA9IHBBcnJheS0+R2V0TnVtYmVyQXQoMyk7CisgIHF1YWRQb2ludHMtPngzID0gcEFycmF5LT5HZXROdW1iZXJBdCg0KTsKKyAgcXVhZFBvaW50cy0+eTMgPSBwQXJyYXktPkdldE51bWJlckF0KDUpOworICBxdWFkUG9pbnRzLT54NCA9IHBBcnJheS0+R2V0TnVtYmVyQXQoNik7CisgIHF1YWRQb2ludHMtPnk0ID0gcEFycmF5LT5HZXROdW1iZXJBdCg3KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZBbm5vdF9TZXRSZWN0KEZQREZfQU5OT1RBVElPTiBhbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZTX1JFQ1RGKiByZWN0KSB7CisgIGlmICghYW5ub3QgfHwgIXJlY3QpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCA9CisgICAgICBDUERGQW5ub3RDb250ZXh0RnJvbUZQREZBbm5vdGF0aW9uKGFubm90KS0+R2V0QW5ub3REaWN0KCk7CisgIGlmICghcEFubm90RGljdCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQ0ZYX0Zsb2F0UmVjdCBuZXdSZWN0ID0gQ0ZYRmxvYXRSZWN0RnJvbUZTUkVDVEYoKnJlY3QpOworCisgIC8vIFVwZGF0ZSB0aGUgIlJlY3QiIGVudHJ5IGluIHRoZSBhbm5vdGF0aW9uIGRpY3Rpb25hcnkuCisgIHBBbm5vdERpY3QtPlNldFJlY3RGb3IoIlJlY3QiLCBuZXdSZWN0KTsKKworICAvLyBJZiB0aGUgYW5ub3RhdGlvbidzIGFwcGVhcmFuY2Ugc3RyZWFtIGlzIGRlZmluZWQsIHRoZSBhbm5vdGF0aW9uIGlzIG9mIGEKKyAgLy8gdHlwZSB0aGF0IGRvZXMgbm90IGhhdmUgcXVhZHBvaW50cywgYW5kIHRoZSBuZXcgcmVjdGFuZ2xlIGlzIGJpZ2dlciB0aGFuCisgIC8vIHRoZSBjdXJyZW50IGJvdW5kaW5nIGJveCwgdGhlbiB1cGRhdGUgdGhlICJCQm94IiBlbnRyeSBpbiB0aGUgQVAKKyAgLy8gZGljdGlvbmFyeSB0b28sIHNpbmNlIGl0cyAiQkJveCIgZW50cnkgY29tZXMgZnJvbSBhbm5vdGF0aW9uIGRpY3Rpb25hcnkncworICAvLyAiUmVjdCIgZW50cnkuCisgIGlmIChGUERGQW5ub3RfSGFzQXR0YWNobWVudFBvaW50cyhhbm5vdCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPQorICAgICAgRlBERkRPQ19HZXRBbm5vdEFQKHBBbm5vdERpY3QsIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlOjpOb3JtYWwpOworICBpZiAocFN0cmVhbSAmJiBuZXdSZWN0LkNvbnRhaW5zKHBTdHJlYW0tPkdldERpY3QoKS0+R2V0UmVjdEZvcigiQkJveCIpKSkKKyAgICBwU3RyZWFtLT5HZXREaWN0KCktPlNldFJlY3RGb3IoIkJCb3giLCBuZXdSZWN0KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZBbm5vdF9HZXRSZWN0KEZQREZfQU5OT1RBVElPTiBhbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX1JFQ1RGKiByZWN0KSB7CisgIGlmICghYW5ub3QgfHwgIXJlY3QpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCA9CisgICAgICBDUERGQW5ub3RDb250ZXh0RnJvbUZQREZBbm5vdGF0aW9uKGFubm90KS0+R2V0QW5ub3REaWN0KCk7CisgIGlmICghcEFubm90RGljdCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgRlNSRUNURkZyb21DRlhGbG9hdFJlY3QocEFubm90RGljdC0+R2V0UmVjdEZvcigiUmVjdCIpLCByZWN0KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZBbm5vdF9IYXNLZXkoRlBERl9BTk5PVEFUSU9OIGFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcga2V5KSB7CisgIGlmICghYW5ub3QpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCA9CisgICAgICBDUERGQW5ub3RDb250ZXh0RnJvbUZQREZBbm5vdGF0aW9uKGFubm90KS0+R2V0QW5ub3REaWN0KCk7CisgIGlmICghcEFubm90RGljdCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHBBbm5vdERpY3QtPktleUV4aXN0KGtleSk7Cit9CisKK0ZQREZfRVhQT1JUIEZQREZfT0JKRUNUX1RZUEUgRlBERl9DQUxMQ09OVgorRlBERkFubm90X0dldFZhbHVlVHlwZShGUERGX0FOTk9UQVRJT04gYW5ub3QsIEZQREZfQllURVNUUklORyBrZXkpIHsKKyAgaWYgKCFGUERGQW5ub3RfSGFzS2V5KGFubm90LCBrZXkpKQorICAgIHJldHVybiBGUERGX09CSkVDVF9VTktOT1dOOworCisgIGF1dG8qIHBBbm5vdCA9IENQREZBbm5vdENvbnRleHRGcm9tRlBERkFubm90YXRpb24oYW5ub3QpOworICBDUERGX09iamVjdCogcE9iaiA9IHBBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldE9iamVjdEZvcihrZXkpOworICByZXR1cm4gcE9iaiA/IHBPYmotPkdldFR5cGUoKSA6IEZQREZfT0JKRUNUX1VOS05PV047Cit9CisKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCitGUERGQW5ub3RfU2V0U3RyaW5nVmFsdWUoRlBERl9BTk5PVEFUSU9OIGFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHZhbHVlKSB7CisgIGlmICghYW5ub3QpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCA9CisgICAgICBDUERGQW5ub3RDb250ZXh0RnJvbUZQREZBbm5vdGF0aW9uKGFubm90KS0+R2V0QW5ub3REaWN0KCk7CisgIGlmICghcEFubm90RGljdCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcEFubm90RGljdC0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigKKyAgICAgIGtleSwgQ0ZYQnl0ZVN0cmluZ0Zyb21GUERGV2lkZVN0cmluZyh2YWx1ZSksIGZhbHNlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ZQREZfRVhQT1JUIHVuc2lnbmVkIGxvbmcgRlBERl9DQUxMQ09OVgorRlBERkFubm90X0dldFN0cmluZ1ZhbHVlKEZQREZfQU5OT1RBVElPTiBhbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1ZmxlbikgeworICBpZiAoIWFubm90KQorICAgIHJldHVybiAwOworCisgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCA9CisgICAgICBDUERGQW5ub3RDb250ZXh0RnJvbUZQREZBbm5vdGF0aW9uKGFubm90KS0+R2V0QW5ub3REaWN0KCk7CisgIGlmICghcEFubm90RGljdCkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gVXRmMTZFbmNvZGVNYXliZUNvcHlBbmRSZXR1cm5MZW5ndGgocEFubm90RGljdC0+R2V0VW5pY29kZVRleHRGb3Ioa2V5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmbGVuKTsKK30KKworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZBbm5vdF9TZXRBUChGUERGX0FOTk9UQVRJT04gYW5ub3QsCisgICAgICAgICAgICAgICAgRlBERl9BTk5PVF9BUFBFQVJBTkNFTU9ERSBhcHBlYXJhbmNlTW9kZSwKKyAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgdmFsdWUpIHsKKyAgaWYgKGFwcGVhcmFuY2VNb2RlIDwgMCB8fCBhcHBlYXJhbmNlTW9kZSA+PSBGUERGX0FOTk9UX0FQUEVBUkFOQ0VNT0RFX0NPVU5UKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoIWFubm90KQorICAgIHJldHVybiBmYWxzZTsKKworICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPQorICAgICAgQ1BERkFubm90Q29udGV4dEZyb21GUERGQW5ub3RhdGlvbihhbm5vdCktPkdldEFubm90RGljdCgpOworICBpZiAoIXBBbm5vdERpY3QpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBtb2RlS2V5Rm9yTW9kZVtdID0geyJOIiwgIlIiLCAiRCJ9OworICBzdGF0aWNfYXNzZXJ0KEZYX0FycmF5U2l6ZShtb2RlS2V5Rm9yTW9kZSkgPT0gRlBERl9BTk5PVF9BUFBFQVJBTkNFTU9ERV9DT1VOVCwKKyAgICAgICAgICAgICAgICAibGVuZ3RoIG9mIG1vZGVLZXlGb3JNb2RlIHNob3VsZCBiZSBlcXVhbCB0byAiCisgICAgICAgICAgICAgICAgIkZQREZfQU5OT1RfQVBQRUFSQU5DRU1PREVfQ09VTlQiKTsKKyAgY29uc3QgY2hhciogbW9kZUtleSA9IG1vZGVLZXlGb3JNb2RlW2FwcGVhcmFuY2VNb2RlXTsKKworICBDUERGX0RpY3Rpb25hcnkqIHBBcERpY3QgPSBwQW5ub3REaWN0LT5HZXREaWN0Rm9yKCJBUCIpOworCisgIC8vIElmIHZhbHVlIGlzIG51bGwsIHdlJ3JlIGluIHJlbW92ZSBtb2RlLiBPdGhlcndpc2UsIHdlJ3JlIGluIGFkZC91cGRhdGUKKyAgLy8gbW9kZS4KKyAgaWYgKHZhbHVlKSB7CisgICAgaWYgKCFwQXBEaWN0KQorICAgICAgcEFwRGljdCA9IHBBbm5vdERpY3QtPlNldE5ld0ZvcjxDUERGX0RpY3Rpb25hcnk+KCJBUCIpOworCisgICAgQnl0ZVN0cmluZyBuZXdWYWx1ZSA9IENGWEJ5dGVTdHJpbmdGcm9tRlBERldpZGVTdHJpbmcodmFsdWUpOworICAgIGF1dG8gcE5ld0FwU3RyZWFtID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU3RyZWFtPigpOworICAgIHBOZXdBcFN0cmVhbS0+U2V0RGF0YShuZXdWYWx1ZS5yYXdfc3RyKCksIG5ld1ZhbHVlLkdldExlbmd0aCgpKTsKKyAgICBwQXBEaWN0LT5TZXRGb3IobW9kZUtleSwgc3RkOjptb3ZlKHBOZXdBcFN0cmVhbSkpOworICB9IGVsc2UgeworICAgIGlmIChwQXBEaWN0KSB7CisgICAgICBpZiAoYXBwZWFyYW5jZU1vZGUgPT0gRlBERl9BTk5PVF9BUFBFQVJBTkNFTU9ERV9OT1JNQUwpCisgICAgICAgIHBBbm5vdERpY3QtPlJlbW92ZUZvcigiQVAiKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcEFwRGljdC0+UmVtb3ZlRm9yKG1vZGVLZXkpOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitGUERGX0VYUE9SVCB1bnNpZ25lZCBsb25nIEZQREZfQ0FMTENPTlYKK0ZQREZBbm5vdF9HZXRBUChGUERGX0FOTk9UQVRJT04gYW5ub3QsCisgICAgICAgICAgICAgICAgRlBERl9BTk5PVF9BUFBFQVJBTkNFTU9ERSBhcHBlYXJhbmNlTW9kZSwKKyAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZsZW4pIHsKKyAgaWYgKGFwcGVhcmFuY2VNb2RlIDwgMCB8fCBhcHBlYXJhbmNlTW9kZSA+PSBGUERGX0FOTk9UX0FQUEVBUkFOQ0VNT0RFX0NPVU5UKQorICAgIHJldHVybiAwOworCisgIGlmICghYW5ub3QpCisgICAgcmV0dXJuIDA7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0ID0KKyAgICAgIENQREZBbm5vdENvbnRleHRGcm9tRlBERkFubm90YXRpb24oYW5ub3QpLT5HZXRBbm5vdERpY3QoKTsKKyAgaWYgKCFwQW5ub3REaWN0KQorICAgIHJldHVybiAwOworCisgIENQREZfQW5ub3Q6OkFwcGVhcmFuY2VNb2RlIG1vZGUgPQorICAgICAgc3RhdGljX2Nhc3Q8Q1BERl9Bbm5vdDo6QXBwZWFyYW5jZU1vZGU+KGFwcGVhcmFuY2VNb2RlKTsKKworICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IEZQREZET0NfR2V0QW5ub3RBUE5vRmFsbGJhY2socEFubm90RGljdCwgbW9kZSk7CisgIHJldHVybiBVdGYxNkVuY29kZU1heWJlQ29weUFuZFJldHVybkxlbmd0aCgKKyAgICAgIHBTdHJlYW0gPyBwU3RyZWFtLT5HZXRVbmljb2RlVGV4dCgpIDogTCIiLCBidWZmZXIsIGJ1Zmxlbik7Cit9CisKK0ZQREZfRVhQT1JUIEZQREZfQU5OT1RBVElPTiBGUERGX0NBTExDT05WCitGUERGQW5ub3RfR2V0TGlua2VkQW5ub3QoRlBERl9BTk5PVEFUSU9OIGFubm90LCBGUERGX0JZVEVTVFJJTkcga2V5KSB7CisgIENQREZfQW5ub3RDb250ZXh0KiBwQW5ub3QgPSBDUERGQW5ub3RDb250ZXh0RnJvbUZQREZBbm5vdGF0aW9uKGFubm90KTsKKyAgaWYgKCFwQW5ub3QgfHwgIXBBbm5vdC0+R2V0QW5ub3REaWN0KCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwTGlua2VkRGljdCA9IHBBbm5vdC0+R2V0QW5ub3REaWN0KCktPkdldERpY3RGb3Ioa2V5KTsKKyAgaWYgKCFwTGlua2VkRGljdCB8fCBwTGlua2VkRGljdC0+R2V0U3RyaW5nRm9yKCJUeXBlIikgIT0gIkFubm90IikKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBhdXRvIHBMaW5rZWRBbm5vdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0Fubm90Q29udGV4dD4oCisgICAgICBwTGlua2VkRGljdCwgcEFubm90LT5HZXRQYWdlKCksIG51bGxwdHIpOworICByZXR1cm4gcExpbmtlZEFubm90LnJlbGVhc2UoKTsKK30KKworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERkFubm90X0dldEZsYWdzKEZQREZfQU5OT1RBVElPTiBhbm5vdCkgeworICBpZiAoIWFubm90KQorICAgIHJldHVybiBGUERGX0FOTk9UX0ZMQUdfTk9ORTsKKworICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPQorICAgICAgQ1BERkFubm90Q29udGV4dEZyb21GUERGQW5ub3RhdGlvbihhbm5vdCktPkdldEFubm90RGljdCgpOworICByZXR1cm4gcEFubm90RGljdCA/IHBBbm5vdERpY3QtPkdldEludGVnZXJGb3IoIkYiKSA6IEZQREZfQU5OT1RfRkxBR19OT05FOworfQorCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGQW5ub3RfU2V0RmxhZ3MoRlBERl9BTk5PVEFUSU9OIGFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykgeworICBpZiAoIWFubm90KQorICAgIHJldHVybiBmYWxzZTsKKworICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPQorICAgICAgQ1BERkFubm90Q29udGV4dEZyb21GUERGQW5ub3RhdGlvbihhbm5vdCktPkdldEFubm90RGljdCgpOworICBpZiAoIXBBbm5vdERpY3QpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHBBbm5vdERpY3QtPlNldE5ld0ZvcjxDUERGX051bWJlcj4oIkYiLCBmbGFncyk7CisgIHJldHVybiB0cnVlOworfQorCitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OVgorRlBERkFubm90X0dldEZvcm1GaWVsZEZsYWdzKEZQREZfUEFHRSBwYWdlLCBGUERGX0FOTk9UQVRJT04gYW5ub3QpIHsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOworICBpZiAoIXBQYWdlIHx8ICFhbm5vdCkKKyAgICByZXR1cm4gRlBERl9GT1JNRkxBR19OT05FOworCisgIENQREZfRGljdGlvbmFyeSogcEFubm90RGljdCA9CisgICAgICBDUERGQW5ub3RDb250ZXh0RnJvbUZQREZBbm5vdGF0aW9uKGFubm90KS0+R2V0QW5ub3REaWN0KCk7CisgIGlmICghcEFubm90RGljdCkKKyAgICByZXR1cm4gRlBERl9GT1JNRkxBR19OT05FOworCisgIENQREZfSW50ZXJGb3JtIGludGVyZm9ybShwUGFnZS0+bV9wRG9jdW1lbnQuR2V0KCkpOworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IGludGVyZm9ybS5HZXRGaWVsZEJ5RGljdChwQW5ub3REaWN0KTsKKyAgcmV0dXJuIHBGb3JtRmllbGQgPyBwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgOiBGUERGX0ZPUk1GTEFHX05PTkU7Cit9CisKK0ZQREZfRVhQT1JUIEZQREZfQU5OT1RBVElPTiBGUERGX0NBTExDT05WCitGUERGQW5ub3RfR2V0Rm9ybUZpZWxkQXRQb2ludChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpIHsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOworICBpZiAoIWhIYW5kbGUgfHwgIXBQYWdlKQorICAgIHJldHVybiBudWxscHRyOworCisgIENQREZfSW50ZXJGb3JtIGludGVyZm9ybShwUGFnZS0+bV9wRG9jdW1lbnQuR2V0KCkpOworICBpbnQgYW5ub3RfaW5kZXggPSAtMTsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1DdHJsID0gaW50ZXJmb3JtLkdldENvbnRyb2xBdFBvaW50KAorICAgICAgcFBhZ2UsIENGWF9Qb2ludEYoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBhZ2VfeCksIHN0YXRpY19jYXN0PGZsb2F0PihwYWdlX3kpKSwKKyAgICAgICZhbm5vdF9pbmRleCk7CisgIGlmICghcEZvcm1DdHJsIHx8IGFubm90X2luZGV4ID09IC0xKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gRlBERlBhZ2VfR2V0QW5ub3QocGFnZSwgYW5ub3RfaW5kZXgpOworfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9mcGRmYW5ub3RfZW1iZWRkZXJ0ZXN0LmNwcCBiL2ZwZGZzZGsvZnBkZmFubm90X2VtYmVkZGVydGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4YmQ4NwotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvZnBkZmFubm90X2VtYmVkZGVydGVzdC5jcHAKQEAgLTAsMCArMSwxMjY3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlIDxjd2NoYXI+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2Fubm90LmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfZWRpdC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmdmlldy5oIgorI2luY2x1ZGUgInRlc3RpbmcvZW1iZWRkZXJfdGVzdC5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay1tYXRjaGVycy5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCitzdGF0aWMgY29uc3RleHByIGNoYXIga0NvbnRlbnRzS2V5W10gPSAiQ29udGVudHMiOworCitjbGFzcyBGUERGQW5ub3RFbWJlZGRlcnRlc3QgOiBwdWJsaWMgRW1iZWRkZXJUZXN0IHt9OworCitzdGQ6OndzdHJpbmcgQnVmZmVyVG9XU3RyaW5nKGNvbnN0IHN0ZDo6dmVjdG9yPGNoYXI+JiBidWYpIHsKKyAgcmV0dXJuIEdldFBsYXRmb3JtV1N0cmluZyhyZWludGVycHJldF9jYXN0PEZQREZfV0lERVNUUklORz4oYnVmLmRhdGEoKSkpOworfQorCitzdGQ6OnN0cmluZyBCdWZmZXJUb1N0cmluZyhjb25zdCBzdGQ6OnZlY3RvcjxjaGFyPiYgYnVmKSB7CisgIHJldHVybiBHZXRQbGF0Zm9ybVN0cmluZyhyZWludGVycHJldF9jYXN0PEZQREZfV0lERVNUUklORz4oYnVmLmRhdGEoKSkpOworfQorCitURVNUX0YoRlBERkFubm90RW1iZWRkZXJ0ZXN0LCBSZW5kZXJBbm5vdFdpdGhPbmx5Um9sbG92ZXJBUCkgeworICAvLyBPcGVuIGEgZmlsZSB3aXRoIG9uZSBhbm5vdGF0aW9uIGFuZCBsb2FkIGl0cyBmaXJzdCBwYWdlLgorICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoImFubm90YXRpb25faGlnaGxpZ2h0X3JvbGxvdmVyX2FwLnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBGUERGX0xvYWRQYWdlKGRvY3VtZW50KCksIDApOworICBBU1NFUlRfVFJVRShwYWdlKTsKKworICAvLyBUaGlzIGFubm90YXRpb24gaGFzIGEgbWFsZm9ybWVkIGFwcGVhcmFuY2Ugc3RyZWFtLCB3aGljaCBkb2VzIG5vdCBoYXZlIGl0cworICAvLyBub3JtYWwgYXBwZWFyYW5jZSBkZWZpbmVkLCBvbmx5IGl0cyByb2xsb3ZlciBhcHBlYXJhbmNlLiBJbiB0aGlzIGNhc2UsIGl0cworICAvLyBub3JtYWwgYXBwZWFyYW5jZSBzaG91bGQgYmUgZ2VuZXJhdGVkLCBhbGxvd2luZyB0aGUgaGlnaGxpZ2h0IGFubm90YXRpb24gdG8KKyAgLy8gc3RpbGwgZGlzcGxheS4KKyAgRlBERl9CSVRNQVAgYml0bWFwID0gUmVuZGVyUGFnZVdpdGhGbGFncyhwYWdlLCBmb3JtX2hhbmRsZSgpLCBGUERGX0FOTk9UKTsKKyAgQ29tcGFyZUJpdG1hcChiaXRtYXAsIDYxMiwgNzkyLCAiZGM5OGYwNmRhMDQ3YmQ4YWFiZmE5OTU2MmQyY2JkMWUiKTsKKyAgRlBERkJpdG1hcF9EZXN0cm95KGJpdG1hcCk7CisKKyAgVW5sb2FkUGFnZShwYWdlKTsKK30KKworVEVTVF9GKEZQREZBbm5vdEVtYmVkZGVydGVzdCwgRXh0cmFjdEhpZ2hsaWdodExvbmdDb250ZW50KSB7CisgIC8vIE9wZW4gYSBmaWxlIHdpdGggb25lIGFubm90YXRpb24gYW5kIGxvYWQgaXRzIGZpcnN0IHBhZ2UuCisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiYW5ub3RhdGlvbl9oaWdobGlnaHRfbG9uZ19jb250ZW50LnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBGUERGX0xvYWRQYWdlKGRvY3VtZW50KCksIDApOworICBBU1NFUlRfVFJVRShwYWdlKTsKKworICAvLyBDaGVjayB0aGF0IHRoZXJlIGlzIGEgdG90YWwgb2YgMSBhbm5vdGF0aW9uIG9uIGl0cyBmaXJzdCBwYWdlLgorICBFWFBFQ1RfRVEoMSwgRlBERlBhZ2VfR2V0QW5ub3RDb3VudChwYWdlKSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgYW5ub3RhdGlvbiBpcyBvZiB0eXBlICJoaWdobGlnaHQiLgorICBGUERGX0FOTk9UQVRJT04gYW5ub3QgPSBGUERGUGFnZV9HZXRBbm5vdChwYWdlLCAwKTsKKyAgQVNTRVJUX1RSVUUoYW5ub3QpOworICBFWFBFQ1RfRVEoRlBERl9BTk5PVF9ISUdITElHSFQsIEZQREZBbm5vdF9HZXRTdWJ0eXBlKGFubm90KSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgYW5ub3RhdGlvbiBjb2xvciBpcyB5ZWxsb3cuCisgIHVuc2lnbmVkIGludCBSOworICB1bnNpZ25lZCBpbnQgRzsKKyAgdW5zaWduZWQgaW50IEI7CisgIHVuc2lnbmVkIGludCBBOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIEZQREZBbm5vdF9HZXRDb2xvcihhbm5vdCwgRlBERkFOTk9UX0NPTE9SVFlQRV9Db2xvciwgJlIsICZHLCAmQiwgJkEpKTsKKyAgRVhQRUNUX0VRKDI1NXUsIFIpOworICBFWFBFQ1RfRVEoMjU1dSwgRyk7CisgIEVYUEVDVF9FUSgwdSwgQik7CisgIEVYUEVDVF9FUSgyNTV1LCBBKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBhdXRob3IgaXMgY29ycmVjdC4KKyAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdXRob3JLZXlbXSA9ICJUIjsKKyAgRVhQRUNUX0VRKEZQREZfT0JKRUNUX1NUUklORywgRlBERkFubm90X0dldFZhbHVlVHlwZShhbm5vdCwga0F1dGhvcktleSkpOworICB1bnNpZ25lZCBsb25nIGxlbiA9IEZQREZBbm5vdF9HZXRTdHJpbmdWYWx1ZShhbm5vdCwga0F1dGhvcktleSwgbnVsbHB0ciwgMCk7CisgIHN0ZDo6dmVjdG9yPGNoYXI+IGJ1ZihsZW4pOworICBFWFBFQ1RfRVEoMjh1LCBGUERGQW5ub3RfR2V0U3RyaW5nVmFsdWUoYW5ub3QsIGtBdXRob3JLZXksIGJ1Zi5kYXRhKCksIGxlbikpOworICBFWFBFQ1RfU1RSRVEoTCJKYWUgSHl1biBQYXJrIiwgQnVmZmVyVG9XU3RyaW5nKGJ1ZikuY19zdHIoKSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgY29udGVudCBpcyBjb3JyZWN0LgorICBFWFBFQ1RfRVEoRlBERl9PQkpFQ1RfU1RSSU5HLCBGUERGQW5ub3RfR2V0VmFsdWVUeXBlKGFubm90LCBrQ29udGVudHNLZXkpKTsKKyAgbGVuID0gRlBERkFubm90X0dldFN0cmluZ1ZhbHVlKGFubm90LCBrQ29udGVudHNLZXksIG51bGxwdHIsIDApOworICBidWYuY2xlYXIoKTsKKyAgYnVmLnJlc2l6ZShsZW4pOworICBFWFBFQ1RfRVEoMjY5MHUsCisgICAgICAgICAgICBGUERGQW5ub3RfR2V0U3RyaW5nVmFsdWUoYW5ub3QsIGtDb250ZW50c0tleSwgYnVmLmRhdGEoKSwgbGVuKSk7CisgIGNvbnN0IHdjaGFyX3QgY29udGVudHNbXSA9CisgICAgICBMIlRoaXMgaXMgYSBub3RlIGZvciB0aGF0IGhpZ2hsaWdodCBhbm5vdGF0aW9uLiBWZXJ5IGxvbmcgaGlnaGxpZ2h0ICIKKyAgICAgICJhbm5vdGF0aW9uLiBMb25nIGxvbmcgbG9uZyBMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nICIKKyAgICAgICJsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgIgorICAgICAgImxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyAiCisgICAgICAibG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nICIKKyAgICAgICJsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgIgorICAgICAgImxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyAiCisgICAgICAibG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nICIKKyAgICAgICJsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgIgorICAgICAgImxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyAiCisgICAgICAibG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nICIKKyAgICAgICJsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgIgorICAgICAgImxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyAiCisgICAgICAibG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nICIKKyAgICAgICJsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgIgorICAgICAgImxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyAiCisgICAgICAibG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nICIKKyAgICAgICJsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgIgorICAgICAgImxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyBsb25nTG9uZyBsb25nIGxvbmdMb25nIGxvbmcgbG9uZ0xvbmcgbG9uZyAiCisgICAgICAibG9uZ0xvbmcgbG9uZyBsb25nLiBFTkQiOworICBFWFBFQ1RfU1RSRVEoY29udGVudHMsIEJ1ZmZlclRvV1N0cmluZyhidWYpLmNfc3RyKCkpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIHF1YWRwb2ludHMgYXJlIGNvcnJlY3QuCisgIEZTX1FVQURQT0lOVFNGIHF1YWRwb2ludHM7CisgIEFTU0VSVF9UUlVFKEZQREZBbm5vdF9HZXRBdHRhY2htZW50UG9pbnRzKGFubm90LCAmcXVhZHBvaW50cykpOworICBFWFBFQ1RfRVEoMTE1LjgwMjY0M2YsIHF1YWRwb2ludHMueDEpOworICBFWFBFQ1RfRVEoNzE4LjkxMzk0MGYsIHF1YWRwb2ludHMueTEpOworICBFWFBFQ1RfRVEoMTU3LjIxMTE4MmYsIHF1YWRwb2ludHMueDQpOworICBFWFBFQ1RfRVEoNzA2LjI2NDQ2NWYsIHF1YWRwb2ludHMueTQpOworCisgIEZQREZQYWdlX0Nsb3NlQW5ub3QoYW5ub3QpOworICBVbmxvYWRQYWdlKHBhZ2UpOworfQorCitURVNUX0YoRlBERkFubm90RW1iZWRkZXJ0ZXN0LCBFeHRyYWN0SW5rTXVsdGlwbGUpIHsKKyAgLy8gT3BlbiBhIGZpbGUgd2l0aCB0aHJlZSBhbm5vdGF0aW9ucyBhbmQgbG9hZCBpdHMgZmlyc3QgcGFnZS4KKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJhbm5vdGF0aW9uX2lua19tdWx0aXBsZS5wZGYiKSk7CisgIEZQREZfUEFHRSBwYWdlID0gRlBERl9Mb2FkUGFnZShkb2N1bWVudCgpLCAwKTsKKyAgQVNTRVJUX1RSVUUocGFnZSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGVyZSBpcyBhIHRvdGFsIG9mIDMgYW5ub3RhdGlvbiBvbiBpdHMgZmlyc3QgcGFnZS4KKyAgRVhQRUNUX0VRKDMsIEZQREZQYWdlX0dldEFubm90Q291bnQocGFnZSkpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIHRoaXJkIGFubm90YXRpb24gaXMgb2YgdHlwZSAiaW5rIi4KKyAgRlBERl9BTk5PVEFUSU9OIGFubm90ID0gRlBERlBhZ2VfR2V0QW5ub3QocGFnZSwgMik7CisgIEFTU0VSVF9UUlVFKGFubm90KTsKKyAgRVhQRUNUX0VRKEZQREZfQU5OT1RfSU5LLCBGUERGQW5ub3RfR2V0U3VidHlwZShhbm5vdCkpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIGFubm90YXRpb24gY29sb3IgaXMgYmx1ZSB3aXRoIG9wYWNpdHkuCisgIHVuc2lnbmVkIGludCBSOworICB1bnNpZ25lZCBpbnQgRzsKKyAgdW5zaWduZWQgaW50IEI7CisgIHVuc2lnbmVkIGludCBBOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIEZQREZBbm5vdF9HZXRDb2xvcihhbm5vdCwgRlBERkFOTk9UX0NPTE9SVFlQRV9Db2xvciwgJlIsICZHLCAmQiwgJkEpKTsKKyAgRVhQRUNUX0VRKDB1LCBSKTsKKyAgRVhQRUNUX0VRKDB1LCBHKTsKKyAgRVhQRUNUX0VRKDI1NXUsIEIpOworICBFWFBFQ1RfRVEoNzZ1LCBBKTsKKworICAvLyBDaGVjayB0aGF0IHRoZXJlIGlzIG5vIGNvbnRlbnQuCisgIEVYUEVDVF9FUSgydSwgRlBERkFubm90X0dldFN0cmluZ1ZhbHVlKGFubm90LCBrQ29udGVudHNLZXksIG51bGxwdHIsIDApKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSByZWN0YW5nZSBjb29yZGluYXRlcyBhcmUgY29ycmVjdC4KKyAgLy8gTm90ZSB0aGF0IHVwb24gcmVuZGVyaW5nLCB0aGUgcmVjdGFuZ2xlIGNvb3JkaW5hdGVzIHdpbGwgYmUgYWRqdXN0ZWQuCisgIEZTX1JFQ1RGIHJlY3Q7CisgIEFTU0VSVF9UUlVFKEZQREZBbm5vdF9HZXRSZWN0KGFubm90LCAmcmVjdCkpOworICBFWFBFQ1RfRVEoMzUxLjgyMDQwNGYsIHJlY3QubGVmdCk7CisgIEVYUEVDVF9FUSg1ODMuODMwNjg4ZiwgcmVjdC5ib3R0b20pOworICBFWFBFQ1RfRVEoNDc1LjMzNjA5MGYsIHJlY3QucmlnaHQpOworICBFWFBFQ1RfRVEoNjgxLjUzNTAzNGYsIHJlY3QudG9wKTsKKworICBGUERGUGFnZV9DbG9zZUFubm90KGFubm90KTsKKyAgVW5sb2FkUGFnZShwYWdlKTsKK30KKworVEVTVF9GKEZQREZBbm5vdEVtYmVkZGVydGVzdCwgQWRkSWxsZWdhbFN1YnR5cGVBbm5vdGF0aW9uKSB7CisgIC8vIE9wZW4gYSBmaWxlIHdpdGggb25lIGFubm90YXRpb24gYW5kIGxvYWQgaXRzIGZpcnN0IHBhZ2UuCisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiYW5ub3RhdGlvbl9oaWdobGlnaHRfbG9uZ19jb250ZW50LnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBGUERGX0xvYWRQYWdlKGRvY3VtZW50KCksIDApOworICBBU1NFUlRfVFJVRShwYWdlKTsKKworICAvLyBBZGQgYW4gYW5ub3RhdGlvbiB3aXRoIGFuIGlsbGVnYWwgc3VidHlwZS4KKyAgQVNTRVJUX0ZBTFNFKEZQREZQYWdlX0NyZWF0ZUFubm90KHBhZ2UsIC0xKSk7CisKKyAgVW5sb2FkUGFnZShwYWdlKTsKK30KKworVEVTVF9GKEZQREZBbm5vdEVtYmVkZGVydGVzdCwgQWRkRmlyc3RUZXh0QW5ub3RhdGlvbikgeworICAvLyBPcGVuIGEgZmlsZSB3aXRoIG5vIGFubm90YXRpb24gYW5kIGxvYWQgaXRzIGZpcnN0IHBhZ2UuCisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiaGVsbG9fd29ybGQucGRmIikpOworICBGUERGX1BBR0UgcGFnZSA9IEZQREZfTG9hZFBhZ2UoZG9jdW1lbnQoKSwgMCk7CisgIEFTU0VSVF9UUlVFKHBhZ2UpOworICBFWFBFQ1RfRVEoMCwgRlBERlBhZ2VfR2V0QW5ub3RDb3VudChwYWdlKSk7CisKKyAgLy8gQWRkIGEgdGV4dCBhbm5vdGF0aW9uIHRvIHRoZSBwYWdlLgorICBGUERGX0FOTk9UQVRJT04gYW5ub3QgPSBGUERGUGFnZV9DcmVhdGVBbm5vdChwYWdlLCBGUERGX0FOTk9UX1RFWFQpOworICBBU1NFUlRfVFJVRShhbm5vdCk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGVyZSBpcyBub3cgMSBhbm5vdGF0aW9ucyBvbiB0aGlzIHBhZ2UuCisgIEVYUEVDVF9FUSgxLCBGUERGUGFnZV9HZXRBbm5vdENvdW50KHBhZ2UpKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBzdWJ0eXBlIG9mIHRoZSBhbm5vdGF0aW9uIGlzIGNvcnJlY3QuCisgIEVYUEVDVF9FUShGUERGX0FOTk9UX1RFWFQsIEZQREZBbm5vdF9HZXRTdWJ0eXBlKGFubm90KSk7CisgIEZQREZQYWdlX0Nsb3NlQW5ub3QoYW5ub3QpOworCisgIGFubm90ID0gRlBERlBhZ2VfR2V0QW5ub3QocGFnZSwgMCk7CisgIEFTU0VSVF9UUlVFKGFubm90KTsKKyAgRVhQRUNUX0VRKEZQREZfQU5OT1RfVEVYVCwgRlBERkFubm90X0dldFN1YnR5cGUoYW5ub3QpKTsKKworICAvLyBTZXQgdGhlIGNvbG9yIG9mIHRoZSBhbm5vdGF0aW9uLgorICBBU1NFUlRfVFJVRSgKKyAgICAgIEZQREZBbm5vdF9TZXRDb2xvcihhbm5vdCwgRlBERkFOTk9UX0NPTE9SVFlQRV9Db2xvciwgNTEsIDEwMiwgMTUzLCAyMDQpKTsKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgY29sb3IgaGFzIGJlZW4gc2V0IGNvcnJlY3RseS4KKyAgdW5zaWduZWQgaW50IFI7CisgIHVuc2lnbmVkIGludCBHOworICB1bnNpZ25lZCBpbnQgQjsKKyAgdW5zaWduZWQgaW50IEE7CisgIEVYUEVDVF9UUlVFKAorICAgICAgRlBERkFubm90X0dldENvbG9yKGFubm90LCBGUERGQU5OT1RfQ09MT1JUWVBFX0NvbG9yLCAmUiwgJkcsICZCLCAmQSkpOworICBFWFBFQ1RfRVEoNTF1LCBSKTsKKyAgRVhQRUNUX0VRKDEwMnUsIEcpOworICBFWFBFQ1RfRVEoMTUzdSwgQik7CisgIEVYUEVDVF9FUSgyMDR1LCBBKTsKKworICAvLyBDaGFuZ2UgdGhlIGNvbG9yIG9mIHRoZSBhbm5vdGF0aW9uLgorICBBU1NFUlRfVFJVRSgKKyAgICAgIEZQREZBbm5vdF9TZXRDb2xvcihhbm5vdCwgRlBERkFOTk9UX0NPTE9SVFlQRV9Db2xvciwgMjA0LCAxNTMsIDEwMiwgNTEpKTsKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgY29sb3IgaGFzIGJlZW4gc2V0IGNvcnJlY3RseS4KKyAgRVhQRUNUX1RSVUUoCisgICAgICBGUERGQW5ub3RfR2V0Q29sb3IoYW5ub3QsIEZQREZBTk5PVF9DT0xPUlRZUEVfQ29sb3IsICZSLCAmRywgJkIsICZBKSk7CisgIEVYUEVDVF9FUSgyMDR1LCBSKTsKKyAgRVhQRUNUX0VRKDE1M3UsIEcpOworICBFWFBFQ1RfRVEoMTAydSwgQik7CisgIEVYUEVDVF9FUSg1MXUsIEEpOworCisgIC8vIFNldCB0aGUgYW5ub3RhdGlvbiByZWN0YW5nbGUuCisgIEZTX1JFQ1RGIHJlY3Q7CisgIEFTU0VSVF9UUlVFKEZQREZBbm5vdF9HZXRSZWN0KGFubm90LCAmcmVjdCkpOworICBFWFBFQ1RfRVEoMC5mLCByZWN0LmxlZnQpOworICBFWFBFQ1RfRVEoMC5mLCByZWN0LnJpZ2h0KTsKKyAgcmVjdC5sZWZ0ID0gMzU7CisgIHJlY3QuYm90dG9tID0gMTUwOworICByZWN0LnJpZ2h0ID0gNTM7CisgIHJlY3QudG9wID0gMTY1OworICBBU1NFUlRfVFJVRShGUERGQW5ub3RfU2V0UmVjdChhbm5vdCwgJnJlY3QpKTsKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgYW5ub3RhdGlvbiByZWN0YW5nbGUgaGFzIGJlZW4gc2V0IGNvcnJlY3RseS4KKyAgQVNTRVJUX1RSVUUoRlBERkFubm90X0dldFJlY3QoYW5ub3QsICZyZWN0KSk7CisgIEVYUEVDVF9FUSgzNS5mLCByZWN0LmxlZnQpOworICBFWFBFQ1RfRVEoMTUwLmYsIHJlY3QuYm90dG9tKTsKKyAgRVhQRUNUX0VRKDUzLmYsIHJlY3QucmlnaHQpOworICBFWFBFQ1RfRVEoMTY1LmYsIHJlY3QudG9wKTsKKworICAvLyBTZXQgdGhlIGNvbnRlbnQgb2YgdGhlIGFubm90YXRpb24uCisgIHN0YXRpYyBjb25zdGV4cHIgd2NoYXJfdCBjb250ZW50c1tdID0gTCJIZWxsbyEgVGhpcyBpcyBhIGN1c3RvbWl6ZWQgY29udGVudC4iOworICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IHRleHQgPQorICAgICAgR2V0RlBERldpZGVTdHJpbmcoY29udGVudHMpOworICBBU1NFUlRfVFJVRShGUERGQW5ub3RfU2V0U3RyaW5nVmFsdWUoYW5ub3QsIGtDb250ZW50c0tleSwgdGV4dC5nZXQoKSkpOworICAvLyBDaGVjayB0aGF0IHRoZSBjb250ZW50IGhhcyBiZWVuIHNldCBjb3JyZWN0bHkuCisgIHVuc2lnbmVkIGxvbmcgbGVuID0gRlBERkFubm90X0dldFN0cmluZ1ZhbHVlKGFubm90LCBrQ29udGVudHNLZXksIG51bGxwdHIsIDApOworICBzdGQ6OnZlY3RvcjxjaGFyPiBidWYobGVuKTsKKyAgRVhQRUNUX0VRKDc0dSwKKyAgICAgICAgICAgIEZQREZBbm5vdF9HZXRTdHJpbmdWYWx1ZShhbm5vdCwga0NvbnRlbnRzS2V5LCBidWYuZGF0YSgpLCBsZW4pKTsKKyAgRVhQRUNUX1NUUkVRKGNvbnRlbnRzLCBCdWZmZXJUb1dTdHJpbmcoYnVmKS5jX3N0cigpKTsKKworICBGUERGUGFnZV9DbG9zZUFubm90KGFubm90KTsKKyAgVW5sb2FkUGFnZShwYWdlKTsKK30KKworVEVTVF9GKEZQREZBbm5vdEVtYmVkZGVydGVzdCwgQWRkQW5kU2F2ZVVuZGVybGluZUFubm90YXRpb24pIHsKKyAgLy8gT3BlbiBhIGZpbGUgd2l0aCBvbmUgYW5ub3RhdGlvbiBhbmQgbG9hZCBpdHMgZmlyc3QgcGFnZS4KKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJhbm5vdGF0aW9uX2hpZ2hsaWdodF9sb25nX2NvbnRlbnQucGRmIikpOworICBGUERGX1BBR0UgcGFnZSA9IEZQREZfTG9hZFBhZ2UoZG9jdW1lbnQoKSwgMCk7CisgIEFTU0VSVF9UUlVFKHBhZ2UpOworCisgIC8vIENoZWNrIHRoYXQgdGhlcmUgaXMgYSB0b3RhbCBvZiBvbmUgYW5ub3RhdGlvbiBvbiBpdHMgZmlyc3QgcGFnZSwgYW5kIHZlcmlmeQorICAvLyBpdHMgcXVhZHBvaW50cy4KKyAgRVhQRUNUX0VRKDEsIEZQREZQYWdlX0dldEFubm90Q291bnQocGFnZSkpOworICBGUERGX0FOTk9UQVRJT04gYW5ub3QgPSBGUERGUGFnZV9HZXRBbm5vdChwYWdlLCAwKTsKKyAgQVNTRVJUX1RSVUUoYW5ub3QpOworICBGU19RVUFEUE9JTlRTRiBxdWFkcG9pbnRzOworICBBU1NFUlRfVFJVRShGUERGQW5ub3RfR2V0QXR0YWNobWVudFBvaW50cyhhbm5vdCwgJnF1YWRwb2ludHMpKTsKKyAgRVhQRUNUX0VRKDExNS44MDI2NDNmLCBxdWFkcG9pbnRzLngxKTsKKyAgRVhQRUNUX0VRKDcxOC45MTM5NDBmLCBxdWFkcG9pbnRzLnkxKTsKKyAgRVhQRUNUX0VRKDE1Ny4yMTExODJmLCBxdWFkcG9pbnRzLng0KTsKKyAgRVhQRUNUX0VRKDcwNi4yNjQ0NjVmLCBxdWFkcG9pbnRzLnk0KTsKKyAgRlBERlBhZ2VfQ2xvc2VBbm5vdChhbm5vdCk7CisKKyAgLy8gQWRkIGFuIHVuZGVybGluZSBhbm5vdGF0aW9uIHRvIHRoZSBwYWdlIGFuZCBzZXQgaXRzIHF1YWRwb2ludHMuCisgIGFubm90ID0gRlBERlBhZ2VfQ3JlYXRlQW5ub3QocGFnZSwgRlBERl9BTk5PVF9VTkRFUkxJTkUpOworICBBU1NFUlRfVFJVRShhbm5vdCk7CisgIHF1YWRwb2ludHMueDEgPSAxNDAuODAyNjQzZjsKKyAgcXVhZHBvaW50cy54MyA9IDE0MC44MDI2NDNmOworICBBU1NFUlRfVFJVRShGUERGQW5ub3RfU2V0QXR0YWNobWVudFBvaW50cyhhbm5vdCwgJnF1YWRwb2ludHMpKTsKKyAgRlBERlBhZ2VfQ2xvc2VBbm5vdChhbm5vdCk7CisKKyAgLy8gU2F2ZSB0aGUgZG9jdW1lbnQsIGNsb3NpbmcgdGhlIHBhZ2UgYW5kIGRvY3VtZW50LgorICBFWFBFQ1RfVFJVRShGUERGX1NhdmVBc0NvcHkoZG9jdW1lbnQoKSwgdGhpcywgMCkpOworICBGUERGX0Nsb3NlUGFnZShwYWdlKTsKKworICAvLyBPcGVuIHRoZSBzYXZlZCBkb2N1bWVudC4KKyAgY29uc3QgY2hhciBtZDVbXSA9ICJkYmExNTM0MTlmNjdiN2MwYzBlM2QyMmQzZTg5MTBkNSI7CisKKyAgT3BlblNhdmVkRG9jdW1lbnQoKTsKKyAgcGFnZSA9IExvYWRTYXZlZFBhZ2UoMCk7CisgIFZlcmlmeVNhdmVkUmVuZGVyaW5nKHBhZ2UsIDYxMiwgNzkyLCBtZDUpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIHNhdmVkIGRvY3VtZW50IGhhcyAyIGFubm90YXRpb25zIG9uIHRoZSBmaXJzdCBwYWdlCisgIEVYUEVDVF9FUSgyLCBGUERGUGFnZV9HZXRBbm5vdENvdW50KHBhZ2UpKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBzZWNvbmQgYW5ub3RhdGlvbiBpcyBhbiB1bmRlcmxpbmUgYW5ub3RhdGlvbiBhbmQgdmVyaWZ5CisgIC8vIGl0cyBxdWFkcG9pbnRzLgorICBGUERGX0FOTk9UQVRJT04gbmV3X2Fubm90ID0gRlBERlBhZ2VfR2V0QW5ub3QocGFnZSwgMSk7CisgIEFTU0VSVF9UUlVFKG5ld19hbm5vdCk7CisgIEVYUEVDVF9FUShGUERGX0FOTk9UX1VOREVSTElORSwgRlBERkFubm90X0dldFN1YnR5cGUobmV3X2Fubm90KSk7CisgIEZTX1FVQURQT0lOVFNGIG5ld19xdWFkcG9pbnRzOworICBBU1NFUlRfVFJVRShGUERGQW5ub3RfR2V0QXR0YWNobWVudFBvaW50cyhuZXdfYW5ub3QsICZuZXdfcXVhZHBvaW50cykpOworICBFWFBFQ1RfTkVBUihxdWFkcG9pbnRzLngxLCBuZXdfcXVhZHBvaW50cy54MSwgMC4wMDFmKTsKKyAgRVhQRUNUX05FQVIocXVhZHBvaW50cy55MSwgbmV3X3F1YWRwb2ludHMueTEsIDAuMDAxZik7CisgIEVYUEVDVF9ORUFSKHF1YWRwb2ludHMueDQsIG5ld19xdWFkcG9pbnRzLng0LCAwLjAwMWYpOworICBFWFBFQ1RfTkVBUihxdWFkcG9pbnRzLnk0LCBuZXdfcXVhZHBvaW50cy55NCwgMC4wMDFmKTsKKworICBGUERGUGFnZV9DbG9zZUFubm90KG5ld19hbm5vdCk7CisKKyAgQ2xvc2VTYXZlZFBhZ2UocGFnZSk7CisgIENsb3NlU2F2ZWREb2N1bWVudCgpOworfQorCitURVNUX0YoRlBERkFubm90RW1iZWRkZXJ0ZXN0LCBNb2RpZnlSZWN0UXVhZHBvaW50c1dpdGhBUCkgeworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXworICBjb25zdCBjaGFyIG1kNV9vcmlnaW5hbFtdID0gIjYzYWY4NDMyZmFiOTVhNjdjZGViYjdjZDBlNTE0OTQxIjsKKyAgY29uc3QgY2hhciBtZDVfbW9kaWZpZWRfaGlnaGxpZ2h0W10gPSAiYWVjMjYwNzUwMTEzNDlkZWM5YmFjZTg5MTg1NmI1ZjIiOworICBjb25zdCBjaGFyIG1kNV9tb2RpZmllZF9zcXVhcmVbXSA9ICIwNTdmNTdhMzJiZTk1OTc1Nzc1ZTVlYzUxM2ZkY2I1NiI7CisjZWxpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXworICBjb25zdCBjaGFyIG1kNV9vcmlnaW5hbFtdID0gIjBlMjczNzYwOTRmMTE0OTBmNzRjNjVmM2RjM2E0MmM1IjsKKyAgY29uc3QgY2hhciBtZDVfbW9kaWZpZWRfaGlnaGxpZ2h0W10gPSAiNjZmM2NhZWYzYTdkNDg4YTRmYTFhZDM3ZmMwNjMxMGUiOworICBjb25zdCBjaGFyIG1kNV9tb2RpZmllZF9zcXVhcmVbXSA9ICJhNDU2ZGFkMGJjNjgwMWVlMmQ2NDA4YTQzOTRhZjU2MyI7CisjZWxzZQorICBjb25zdCBjaGFyIG1kNV9vcmlnaW5hbFtdID0gIjBlMjczNzYwOTRmMTE0OTBmNzRjNjVmM2RjM2E0MmM1IjsKKyAgY29uc3QgY2hhciBtZDVfbW9kaWZpZWRfaGlnaGxpZ2h0W10gPSAiNjZmM2NhZWYzYTdkNDg4YTRmYTFhZDM3ZmMwNjMxMGUiOworICBjb25zdCBjaGFyIG1kNV9tb2RpZmllZF9zcXVhcmVbXSA9ICJhNDU2ZGFkMGJjNjgwMWVlMmQ2NDA4YTQzOTRhZjU2MyI7CisjZW5kaWYKKworICAvLyBPcGVuIGEgZmlsZSB3aXRoIGZvdXIgYW5ub3RhdGlvbnMgYW5kIGxvYWQgaXRzIGZpcnN0IHBhZ2UuCisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiYW5ub3RhdGlvbl9oaWdobGlnaHRfc3F1YXJlX3dpdGhfYXAucGRmIikpOworICBGUERGX1BBR0UgcGFnZSA9IEZQREZfTG9hZFBhZ2UoZG9jdW1lbnQoKSwgMCk7CisgIEFTU0VSVF9UUlVFKHBhZ2UpOworICBFWFBFQ1RfRVEoNCwgRlBERlBhZ2VfR2V0QW5ub3RDb3VudChwYWdlKSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgb3JpZ2luYWwgZmlsZSByZW5kZXJzIGNvcnJlY3RseS4KKyAgRlBERl9CSVRNQVAgYml0bWFwID0gUmVuZGVyUGFnZVdpdGhGbGFncyhwYWdlLCBmb3JtX2hhbmRsZV8sIEZQREZfQU5OT1QpOworICBDb21wYXJlQml0bWFwKGJpdG1hcCwgNjEyLCA3OTIsIG1kNV9vcmlnaW5hbCk7CisgIEZQREZCaXRtYXBfRGVzdHJveShiaXRtYXApOworCisgIC8vIFJldHJpZXZlIHRoZSBoaWdobGlnaHQgYW5ub3RhdGlvbiB3aGljaCBoYXMgaXRzIEFQIHN0cmVhbSBhbHJlYWR5IGRlZmluZWQuCisgIEZQREZfQU5OT1RBVElPTiBhbm5vdCA9IEZQREZQYWdlX0dldEFubm90KHBhZ2UsIDApOworICBBU1NFUlRfVFJVRShhbm5vdCk7CisgIEVYUEVDVF9FUShGUERGX0FOTk9UX0hJR0hMSUdIVCwgRlBERkFubm90X0dldFN1YnR5cGUoYW5ub3QpKTsKKworICAvLyBDaGVjayB0aGF0IGNvbG9yIGNhbm5vdCBiZSBzZXQgd2hlbiBhbiBBUCBzdHJlYW0gaXMgZGVmaW5lZCBhbHJlYWR5LgorICBFWFBFQ1RfRkFMU0UoCisgICAgICBGUERGQW5ub3RfU2V0Q29sb3IoYW5ub3QsIEZQREZBTk5PVF9DT0xPUlRZUEVfQ29sb3IsIDUxLCAxMDIsIDE1MywgMjA0KSk7CisKKyAgLy8gVmVyaWZ5IGl0cyBhdHRhY2htZW50IHBvaW50cy4KKyAgRlNfUVVBRFBPSU5UU0YgcXVhZHBvaW50czsKKyAgQVNTRVJUX1RSVUUoRlBERkFubm90X0dldEF0dGFjaG1lbnRQb2ludHMoYW5ub3QsICZxdWFkcG9pbnRzKSk7CisgIEVYUEVDVF9ORUFSKDcyLjAwMDBmLCBxdWFkcG9pbnRzLngxLCAwLjAwMWYpOworICBFWFBFQ1RfTkVBUig3MjAuNzkyZiwgcXVhZHBvaW50cy55MSwgMC4wMDFmKTsKKyAgRVhQRUNUX05FQVIoMTMyLjA1NWYsIHF1YWRwb2ludHMueDQsIDAuMDAxZik7CisgIEVYUEVDVF9ORUFSKDcwNC43OTZmLCBxdWFkcG9pbnRzLnk0LCAwLjAwMWYpOworCisgIC8vIENoZWNrIHRoYXQgdXBkYXRpbmcgdGhlIGF0dGFjaG1lbnQgcG9pbnRzIHdvdWxkIHN1Y2NlZWQuCisgIHF1YWRwb2ludHMueDEgLT0gNTAuZjsKKyAgcXVhZHBvaW50cy54MiAtPSA1MC5mOworICBxdWFkcG9pbnRzLngzIC09IDUwLmY7CisgIHF1YWRwb2ludHMueDQgLT0gNTAuZjsKKyAgQVNTRVJUX1RSVUUoRlBERkFubm90X1NldEF0dGFjaG1lbnRQb2ludHMoYW5ub3QsICZxdWFkcG9pbnRzKSk7CisgIEZTX1FVQURQT0lOVFNGIG5ld19xdWFkcG9pbnRzOworICBBU1NFUlRfVFJVRShGUERGQW5ub3RfR2V0QXR0YWNobWVudFBvaW50cyhhbm5vdCwgJm5ld19xdWFkcG9pbnRzKSk7CisgIEVYUEVDVF9FUShxdWFkcG9pbnRzLngxLCBuZXdfcXVhZHBvaW50cy54MSk7CisgIEVYUEVDVF9FUShxdWFkcG9pbnRzLnkxLCBuZXdfcXVhZHBvaW50cy55MSk7CisgIEVYUEVDVF9FUShxdWFkcG9pbnRzLng0LCBuZXdfcXVhZHBvaW50cy54NCk7CisgIEVYUEVDVF9FUShxdWFkcG9pbnRzLnk0LCBuZXdfcXVhZHBvaW50cy55NCk7CisKKyAgLy8gQ2hlY2sgdGhhdCB1cGRhdGluZyBxdWFkcG9pbnRzIGRvZXMgbm90IGNoYW5nZSB0aGUgYW5ub3RhdGlvbidzIHBvc2l0aW9uLgorICBiaXRtYXAgPSBSZW5kZXJQYWdlV2l0aEZsYWdzKHBhZ2UsIGZvcm1faGFuZGxlXywgRlBERl9BTk5PVCk7CisgIENvbXBhcmVCaXRtYXAoYml0bWFwLCA2MTIsIDc5MiwgbWQ1X29yaWdpbmFsKTsKKyAgRlBERkJpdG1hcF9EZXN0cm95KGJpdG1hcCk7CisKKyAgLy8gVmVyaWZ5IGl0cyBhbm5vdGF0aW9uIHJlY3RhbmdsZS4KKyAgRlNfUkVDVEYgcmVjdDsKKyAgQVNTRVJUX1RSVUUoRlBERkFubm90X0dldFJlY3QoYW5ub3QsICZyZWN0KSk7CisgIEVYUEVDVF9ORUFSKDY3LjcyOTlmLCByZWN0LmxlZnQsIDAuMDAxZik7CisgIEVYUEVDVF9ORUFSKDcwNC4yOTZmLCByZWN0LmJvdHRvbSwgMC4wMDFmKTsKKyAgRVhQRUNUX05FQVIoMTM2LjMyNWYsIHJlY3QucmlnaHQsIDAuMDAxZik7CisgIEVYUEVDVF9ORUFSKDcyMS4yOTJmLCByZWN0LnRvcCwgMC4wMDFmKTsKKworICAvLyBDaGVjayB0aGF0IHVwZGF0aW5nIHRoZSByZWN0YW5nbGUgd291bGQgc3VjY2VlZC4KKyAgcmVjdC5sZWZ0IC09IDYwLmY7CisgIHJlY3QucmlnaHQgLT0gNjAuZjsKKyAgQVNTRVJUX1RSVUUoRlBERkFubm90X1NldFJlY3QoYW5ub3QsICZyZWN0KSk7CisgIEZTX1JFQ1RGIG5ld19yZWN0OworICBBU1NFUlRfVFJVRShGUERGQW5ub3RfR2V0UmVjdChhbm5vdCwgJm5ld19yZWN0KSk7CisgIEVYUEVDVF9FUShyZWN0LnJpZ2h0LCBuZXdfcmVjdC5yaWdodCk7CisgIEZQREZQYWdlX0Nsb3NlQW5ub3QoYW5ub3QpOworCisgIC8vIENoZWNrIHRoYXQgdXBkYXRpbmcgdGhlIHJlY3RhbmdsZSBjaGFuZ2VzIHRoZSBhbm5vdGF0aW9uJ3MgcG9zaXRpb24uCisgIGJpdG1hcCA9IFJlbmRlclBhZ2VXaXRoRmxhZ3MocGFnZSwgZm9ybV9oYW5kbGVfLCBGUERGX0FOTk9UKTsKKyAgQ29tcGFyZUJpdG1hcChiaXRtYXAsIDYxMiwgNzkyLCBtZDVfbW9kaWZpZWRfaGlnaGxpZ2h0KTsKKyAgRlBERkJpdG1hcF9EZXN0cm95KGJpdG1hcCk7CisKKyAgLy8gUmV0cmlldmUgdGhlIHNxdWFyZSBhbm5vdGF0aW9uIHdoaWNoIGhhcyBpdHMgQVAgc3RyZWFtIGFscmVhZHkgZGVmaW5lZC4KKyAgYW5ub3QgPSBGUERGUGFnZV9HZXRBbm5vdChwYWdlLCAyKTsKKyAgQVNTRVJUX1RSVUUoYW5ub3QpOworICBFWFBFQ1RfRVEoRlBERl9BTk5PVF9TUVVBUkUsIEZQREZBbm5vdF9HZXRTdWJ0eXBlKGFubm90KSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB1cGRhdGluZyB0aGUgcmVjdGFuZ2xlIHdvdWxkIHN1Y2NlZWQuCisgIEFTU0VSVF9UUlVFKEZQREZBbm5vdF9HZXRSZWN0KGFubm90LCAmcmVjdCkpOworICByZWN0LmxlZnQgKz0gNzAuZjsKKyAgcmVjdC5yaWdodCArPSA3MC5mOworICBBU1NFUlRfVFJVRShGUERGQW5ub3RfU2V0UmVjdChhbm5vdCwgJnJlY3QpKTsKKyAgQVNTRVJUX1RSVUUoRlBERkFubm90X0dldFJlY3QoYW5ub3QsICZuZXdfcmVjdCkpOworICBFWFBFQ1RfRVEocmVjdC5yaWdodCwgbmV3X3JlY3QucmlnaHQpOworCisgIC8vIENoZWNrIHRoYXQgdXBkYXRpbmcgdGhlIHJlY3RhbmdsZSBjaGFuZ2VzIHRoZSBzcXVhcmUgYW5ub3RhdGlvbidzIHBvc2l0aW9uLgorICBiaXRtYXAgPSBSZW5kZXJQYWdlV2l0aEZsYWdzKHBhZ2UsIGZvcm1faGFuZGxlXywgRlBERl9BTk5PVCk7CisgIENvbXBhcmVCaXRtYXAoYml0bWFwLCA2MTIsIDc5MiwgbWQ1X21vZGlmaWVkX3NxdWFyZSk7CisgIEZQREZCaXRtYXBfRGVzdHJveShiaXRtYXApOworCisgIEZQREZQYWdlX0Nsb3NlQW5ub3QoYW5ub3QpOworICBVbmxvYWRQYWdlKHBhZ2UpOworfQorCitURVNUX0YoRlBERkFubm90RW1iZWRkZXJ0ZXN0LCBSZW1vdmVBbm5vdGF0aW9uKSB7CisgIC8vIE9wZW4gYSBmaWxlIHdpdGggMyBhbm5vdGF0aW9ucyBvbiBpdHMgZmlyc3QgcGFnZS4KKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJhbm5vdGF0aW9uX2lua19tdWx0aXBsZS5wZGYiKSk7CisgIEZQREZfUEFHRSBwYWdlID0gRlBERl9Mb2FkUGFnZShkb2N1bWVudCgpLCAwKTsKKyAgQVNTRVJUX1RSVUUocGFnZSk7CisgIEVYUEVDVF9FUSgzLCBGUERGUGFnZV9HZXRBbm5vdENvdW50KHBhZ2UpKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBhbm5vdGF0aW9ucyBoYXZlIHRoZSBleHBlY3RlZCByZWN0YW5nbGUgY29vcmRpbmF0ZXMuCisgIEZQREZfQU5OT1RBVElPTiBhbm5vdCA9IEZQREZQYWdlX0dldEFubm90KHBhZ2UsIDApOworICBGU19SRUNURiByZWN0OworICBBU1NFUlRfVFJVRShGUERGQW5ub3RfR2V0UmVjdChhbm5vdCwgJnJlY3QpKTsKKyAgRVhQRUNUX05FQVIoODYuMTk3MWYsIHJlY3QubGVmdCwgMC4wMDFmKTsKKyAgRlBERlBhZ2VfQ2xvc2VBbm5vdChhbm5vdCk7CisKKyAgYW5ub3QgPSBGUERGUGFnZV9HZXRBbm5vdChwYWdlLCAxKTsKKyAgQVNTRVJUX1RSVUUoRlBERkFubm90X0dldFJlY3QoYW5ub3QsICZyZWN0KSk7CisgIEVYUEVDVF9ORUFSKDE0OS44MTI3ZiwgcmVjdC5sZWZ0LCAwLjAwMWYpOworICBGUERGUGFnZV9DbG9zZUFubm90KGFubm90KTsKKworICBhbm5vdCA9IEZQREZQYWdlX0dldEFubm90KHBhZ2UsIDIpOworICBBU1NFUlRfVFJVRShGUERGQW5ub3RfR2V0UmVjdChhbm5vdCwgJnJlY3QpKTsKKyAgRVhQRUNUX05FQVIoMzUxLjgyMDRmLCByZWN0LmxlZnQsIDAuMDAxZik7CisgIEZQREZQYWdlX0Nsb3NlQW5ub3QoYW5ub3QpOworCisgIC8vIENoZWNrIHRoYXQgbm90aGluZyBoYXBwZW5zIHdoZW4gYXR0ZW1wdGluZyB0byByZW1vdmUgYW4gYW5ub3RhdGlvbiB3aXRoIGFuCisgIC8vIG91dC1vZi1ib3VuZCBpbmRleC4KKyAgRVhQRUNUX0ZBTFNFKEZQREZQYWdlX1JlbW92ZUFubm90KHBhZ2UsIDQpKTsKKyAgRVhQRUNUX0ZBTFNFKEZQREZQYWdlX1JlbW92ZUFubm90KHBhZ2UsIC0xKSk7CisgIEVYUEVDVF9FUSgzLCBGUERGUGFnZV9HZXRBbm5vdENvdW50KHBhZ2UpKTsKKworICAvLyBSZW1vdmUgdGhlIHNlY29uZCBhbm5vdGF0aW9uLgorICBFWFBFQ1RfVFJVRShGUERGUGFnZV9SZW1vdmVBbm5vdChwYWdlLCAxKSk7CisgIEVYUEVDVF9FUSgyLCBGUERGUGFnZV9HZXRBbm5vdENvdW50KHBhZ2UpKTsKKyAgRVhQRUNUX0ZBTFNFKEZQREZQYWdlX0dldEFubm90KHBhZ2UsIDIpKTsKKworICAvLyBTYXZlIHRoZSBkb2N1bWVudCwgY2xvc2luZyB0aGUgcGFnZSBhbmQgZG9jdW1lbnQuCisgIEVYUEVDVF9UUlVFKEZQREZfU2F2ZUFzQ29weShkb2N1bWVudCgpLCB0aGlzLCAwKSk7CisgIEZQREZfQ2xvc2VQYWdlKHBhZ2UpOworCisgIC8vIFRPRE8obnBtKTogVmVyaWZ5U2F2ZWRSZW5kZXJpbmcgY2hhbmdlcyBhbm5vdCByZWN0IGRpbWVuc2lvbnMgYnkgMT8/CisgIC8vIE9wZW4gdGhlIHNhdmVkIGRvY3VtZW50LgorICBzdGQ6OnN0cmluZyBuZXdfZmlsZSA9IEdldFN0cmluZygpOworICBGUERGX0ZJTEVBQ0NFU1MgZmlsZV9hY2Nlc3M7CisgIG1lbXNldCgmZmlsZV9hY2Nlc3MsIDAsIHNpemVvZihmaWxlX2FjY2VzcykpOworICBmaWxlX2FjY2Vzcy5tX0ZpbGVMZW4gPSBuZXdfZmlsZS5zaXplKCk7CisgIGZpbGVfYWNjZXNzLm1fR2V0QmxvY2sgPSBHZXRCbG9ja0Zyb21TdHJpbmc7CisgIGZpbGVfYWNjZXNzLm1fUGFyYW0gPSAmbmV3X2ZpbGU7CisgIEZQREZfRE9DVU1FTlQgbmV3X2RvYyA9IEZQREZfTG9hZEN1c3RvbURvY3VtZW50KCZmaWxlX2FjY2VzcywgbnVsbHB0cik7CisgIEFTU0VSVF9UUlVFKG5ld19kb2MpOworICBGUERGX1BBR0UgbmV3X3BhZ2UgPSBGUERGX0xvYWRQYWdlKG5ld19kb2MsIDApOworICBBU1NFUlRfVFJVRShuZXdfcGFnZSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgc2F2ZWQgZG9jdW1lbnQgaGFzIDIgYW5ub3RhdGlvbnMgb24gdGhlIGZpcnN0IHBhZ2UuCisgIEVYUEVDVF9FUSgyLCBGUERGUGFnZV9HZXRBbm5vdENvdW50KG5ld19wYWdlKSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgcmVtYWluaW5nIDIgYW5ub3RhdGlvbnMgYXJlIHRoZSBvcmlnaW5hbCAxc3QgYW5kIDNyZCBvbmVzIGJ5CisgIC8vIHZlcmlmeWluZyB0aGVpciByZWN0YW5nbGUgY29vcmRpbmF0ZXMuCisgIGFubm90ID0gRlBERlBhZ2VfR2V0QW5ub3QobmV3X3BhZ2UsIDApOworICBBU1NFUlRfVFJVRShGUERGQW5ub3RfR2V0UmVjdChhbm5vdCwgJnJlY3QpKTsKKyAgRVhQRUNUX05FQVIoODYuMTk3MWYsIHJlY3QubGVmdCwgMC4wMDFmKTsKKyAgRlBERlBhZ2VfQ2xvc2VBbm5vdChhbm5vdCk7CisKKyAgYW5ub3QgPSBGUERGUGFnZV9HZXRBbm5vdChuZXdfcGFnZSwgMSk7CisgIEFTU0VSVF9UUlVFKEZQREZBbm5vdF9HZXRSZWN0KGFubm90LCAmcmVjdCkpOworICBFWFBFQ1RfTkVBUigzNTEuODIwNGYsIHJlY3QubGVmdCwgMC4wMDFmKTsKKyAgRlBERlBhZ2VfQ2xvc2VBbm5vdChhbm5vdCk7CisgIEZQREZfQ2xvc2VQYWdlKG5ld19wYWdlKTsKKyAgRlBERl9DbG9zZURvY3VtZW50KG5ld19kb2MpOworfQorCitURVNUX0YoRlBERkFubm90RW1iZWRkZXJ0ZXN0LCBBZGRBbmRNb2RpZnlQYXRoKSB7CisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCisgIGNvbnN0IGNoYXIgbWQ1X29yaWdpbmFsW10gPSAiYzM1NDA4NzE3NzU5NTYyZDFmOGJmMzNkMzE3NDgzZDIiOworICBjb25zdCBjaGFyIG1kNV9tb2RpZmllZF9wYXRoW10gPSAiY2YzY2VhNzRiZDQ2NDk3NTIwZmY2YzRkMWVhMjI4YzgiOworICBjb25zdCBjaGFyIG1kNV90d29fcGF0aHNbXSA9ICJlODk5NDQ1MmZjNDM4NTMzN2JhZTU1MjIzNTRlMTBmZiI7CisgIGNvbnN0IGNoYXIgbWQ1X25ld19hbm5vdFtdID0gImVlNTM3MmIzMWZlZGUxMTdmYzgzYjkzODQ1OThhYTI1IjsKKyNlbHNlCisgIGNvbnN0IGNoYXIgbWQ1X29yaWdpbmFsW10gPSAiOTY0Zjg5YmJlODkxMWU1NDBhNDY1Y2YxYTY0YjdmN2UiOworICBjb25zdCBjaGFyIG1kNV9tb2RpZmllZF9wYXRoW10gPSAiM2Y3N2I4OGNlNjA0OGUwOGU2MzZjOWEwMzkyMWIyZTUiOworICBjb25zdCBjaGFyIG1kNV90d29fcGF0aHNbXSA9ICJiZmZiZjVlY2QxNTg2MmI5ZmU1NTNjNzk1NDAwZmY4ZSI7CisgIGNvbnN0IGNoYXIgbWQ1X25ld19hbm5vdFtdID0gImUwMjA1MzRjN2VlZWE3NmJlNTM3YzcwZDZlMzU5YTQwIjsKKyNlbmRpZgorCisgIC8vIE9wZW4gYSBmaWxlIHdpdGggdHdvIGFubm90YXRpb25zIGFuZCBsb2FkIGl0cyBmaXJzdCBwYWdlLgorICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoImFubm90YXRpb25fc3RhbXBfd2l0aF9hcC5wZGYiKSk7CisgIEZQREZfUEFHRSBwYWdlID0gRlBERl9Mb2FkUGFnZShkb2N1bWVudCgpLCAwKTsKKyAgQVNTRVJUX1RSVUUocGFnZSk7CisgIEVYUEVDVF9FUSgyLCBGUERGUGFnZV9HZXRBbm5vdENvdW50KHBhZ2UpKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBwYWdlIHJlbmRlcnMgY29ycmVjdGx5LgorICBGUERGX0JJVE1BUCBiaXRtYXAgPSBSZW5kZXJQYWdlV2l0aEZsYWdzKHBhZ2UsIGZvcm1faGFuZGxlXywgRlBERl9BTk5PVCk7CisgIENvbXBhcmVCaXRtYXAoYml0bWFwLCA1OTUsIDg0MiwgbWQ1X29yaWdpbmFsKTsKKyAgRlBERkJpdG1hcF9EZXN0cm95KGJpdG1hcCk7CisKKyAgLy8gUmV0cmlldmUgdGhlIHN0YW1wIGFubm90YXRpb24gd2hpY2ggaGFzIGl0cyBBUCBzdHJlYW0gYWxyZWFkeSBkZWZpbmVkLgorICBGUERGX0FOTk9UQVRJT04gYW5ub3QgPSBGUERGUGFnZV9HZXRBbm5vdChwYWdlLCAwKTsKKyAgQVNTRVJUX1RSVUUoYW5ub3QpOworCisgIC8vIENoZWNrIHRoYXQgdGhpcyBhbm5vdGF0aW9uIGhhcyBvbmUgcGF0aCBvYmplY3QgYW5kIHJldHJpZXZlIGl0LgorICBFWFBFQ1RfRVEoMSwgRlBERkFubm90X0dldE9iamVjdENvdW50KGFubm90KSk7CisgIEZQREZfUEFHRU9CSkVDVCBwYXRoID0gRlBERkFubm90X0dldE9iamVjdChhbm5vdCwgMSk7CisgIEVYUEVDVF9GQUxTRShwYXRoKTsKKyAgcGF0aCA9IEZQREZBbm5vdF9HZXRPYmplY3QoYW5ub3QsIDApOworICBFWFBFQ1RfRVEoRlBERl9QQUdFT0JKX1BBVEgsIEZQREZQYWdlT2JqX0dldFR5cGUocGF0aCkpOworICBFWFBFQ1RfVFJVRShwYXRoKTsKKworICAvLyBNb2RpZnkgdGhlIGNvbG9yIG9mIHRoZSBwYXRoIG9iamVjdC4KKyAgRVhQRUNUX1RSVUUoRlBERlBhdGhfU2V0U3Ryb2tlQ29sb3IocGF0aCwgMCwgMCwgMCwgMjU1KSk7CisgIEVYUEVDVF9UUlVFKEZQREZBbm5vdF9VcGRhdGVPYmplY3QoYW5ub3QsIHBhdGgpKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBwYWdlIHdpdGggdGhlIG1vZGlmaWVkIGFubm90YXRpb24gcmVuZGVycyBjb3JyZWN0bHkuCisgIGJpdG1hcCA9IFJlbmRlclBhZ2VXaXRoRmxhZ3MocGFnZSwgZm9ybV9oYW5kbGVfLCBGUERGX0FOTk9UKTsKKyAgQ29tcGFyZUJpdG1hcChiaXRtYXAsIDU5NSwgODQyLCBtZDVfbW9kaWZpZWRfcGF0aCk7CisgIEZQREZCaXRtYXBfRGVzdHJveShiaXRtYXApOworCisgIC8vIEFkZCBhIHNlY29uZCBwYXRoIG9iamVjdCB0byB0aGUgc2FtZSBhbm5vdGF0aW9uLgorICBGUERGX1BBR0VPQkpFQ1QgZG90ID0gRlBERlBhZ2VPYmpfQ3JlYXRlTmV3UGF0aCg3LCA4NCk7CisgIEVYUEVDVF9UUlVFKEZQREZQYXRoX0JlemllclRvKGRvdCwgOSwgODYsIDEwLCA4NywgMTEsIDg4KSk7CisgIEVYUEVDVF9UUlVFKEZQREZQYXRoX1NldFN0cm9rZUNvbG9yKGRvdCwgMjU1LCAwLCAwLCAxMDApKTsKKyAgRVhQRUNUX1RSVUUoRlBERlBhdGhfU2V0U3Ryb2tlV2lkdGgoZG90LCAxNCkpOworICBFWFBFQ1RfVFJVRShGUERGUGF0aF9TZXREcmF3TW9kZShkb3QsIDAsIDEpKTsKKyAgRVhQRUNUX1RSVUUoRlBERkFubm90X0FwcGVuZE9iamVjdChhbm5vdCwgZG90KSk7CisgIEVYUEVDVF9FUSgyLCBGUERGQW5ub3RfR2V0T2JqZWN0Q291bnQoYW5ub3QpKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBwYWdlIHdpdGggYW4gYW5ub3RhdGlvbiB3aXRoIHR3byBwYXRocyByZW5kZXJzIGNvcnJlY3RseS4KKyAgYml0bWFwID0gUmVuZGVyUGFnZVdpdGhGbGFncyhwYWdlLCBmb3JtX2hhbmRsZV8sIEZQREZfQU5OT1QpOworICBDb21wYXJlQml0bWFwKGJpdG1hcCwgNTk1LCA4NDIsIG1kNV90d29fcGF0aHMpOworICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsKKworICAvLyBEZWxldGUgdGhlIG5ld2x5IGFkZGVkIHBhdGggb2JqZWN0LgorICBFWFBFQ1RfVFJVRShGUERGQW5ub3RfUmVtb3ZlT2JqZWN0KGFubm90LCAxKSk7CisgIEVYUEVDVF9FUSgxLCBGUERGQW5ub3RfR2V0T2JqZWN0Q291bnQoYW5ub3QpKTsKKyAgRlBERlBhZ2VfQ2xvc2VBbm5vdChhbm5vdCk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgcGFnZSByZW5kZXJzIHRoZSBzYW1lIGFzIGJlZm9yZS4KKyAgYml0bWFwID0gUmVuZGVyUGFnZVdpdGhGbGFncyhwYWdlLCBmb3JtX2hhbmRsZV8sIEZQREZfQU5OT1QpOworICBDb21wYXJlQml0bWFwKGJpdG1hcCwgNTk1LCA4NDIsIG1kNV9tb2RpZmllZF9wYXRoKTsKKyAgRlBERkJpdG1hcF9EZXN0cm95KGJpdG1hcCk7CisKKyAgLy8gQ3JlYXRlIGFub3RoZXIgc3RhbXAgYW5ub3RhdGlvbiBhbmQgc2V0IGl0cyBhbm5vdGF0aW9uIHJlY3RhbmdsZS4KKyAgYW5ub3QgPSBGUERGUGFnZV9DcmVhdGVBbm5vdChwYWdlLCBGUERGX0FOTk9UX1NUQU1QKTsKKyAgQVNTRVJUX1RSVUUoYW5ub3QpOworICBGU19SRUNURiByZWN0OworICByZWN0LmxlZnQgPSAyMDAuZjsKKyAgcmVjdC5ib3R0b20gPSA0MDAuZjsKKyAgcmVjdC5yaWdodCA9IDUwMC5mOworICByZWN0LnRvcCA9IDYwMC5mOworICBFWFBFQ1RfVFJVRShGUERGQW5ub3RfU2V0UmVjdChhbm5vdCwgJnJlY3QpKTsKKworICAvLyBBZGQgYSBuZXcgcGF0aCB0byB0aGUgYW5ub3RhdGlvbi4KKyAgRlBERl9QQUdFT0JKRUNUIGNoZWNrID0gRlBERlBhZ2VPYmpfQ3JlYXRlTmV3UGF0aCgyMDAsIDUwMCk7CisgIEVYUEVDVF9UUlVFKEZQREZQYXRoX0xpbmVUbyhjaGVjaywgMzAwLCA0MDApKTsKKyAgRVhQRUNUX1RSVUUoRlBERlBhdGhfTGluZVRvKGNoZWNrLCA1MDAsIDYwMCkpOworICBFWFBFQ1RfVFJVRShGUERGUGF0aF9Nb3ZlVG8oY2hlY2ssIDM1MCwgNTUwKSk7CisgIEVYUEVDVF9UUlVFKEZQREZQYXRoX0xpbmVUbyhjaGVjaywgNDUwLCA0NTApKTsKKyAgRVhQRUNUX1RSVUUoRlBERlBhdGhfU2V0U3Ryb2tlQ29sb3IoY2hlY2ssIDAsIDI1NSwgMjU1LCAxODApKTsKKyAgRVhQRUNUX1RSVUUoRlBERlBhdGhfU2V0U3Ryb2tlV2lkdGgoY2hlY2ssIDguMzVmKSk7CisgIEVYUEVDVF9UUlVFKEZQREZQYXRoX1NldERyYXdNb2RlKGNoZWNrLCAwLCAxKSk7CisgIEVYUEVDVF9UUlVFKEZQREZBbm5vdF9BcHBlbmRPYmplY3QoYW5ub3QsIGNoZWNrKSk7CisgIEVYUEVDVF9FUSgxLCBGUERGQW5ub3RfR2V0T2JqZWN0Q291bnQoYW5ub3QpKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBhbm5vdGF0aW9uJ3MgYm91bmRpbmcgYm94IGNhbWUgZnJvbSBpdHMgcmVjdGFuZ2xlLgorICBGU19SRUNURiBuZXdfcmVjdDsKKyAgQVNTRVJUX1RSVUUoRlBERkFubm90X0dldFJlY3QoYW5ub3QsICZuZXdfcmVjdCkpOworICBFWFBFQ1RfRVEocmVjdC5sZWZ0LCBuZXdfcmVjdC5sZWZ0KTsKKyAgRVhQRUNUX0VRKHJlY3QuYm90dG9tLCBuZXdfcmVjdC5ib3R0b20pOworICBFWFBFQ1RfRVEocmVjdC5yaWdodCwgbmV3X3JlY3QucmlnaHQpOworICBFWFBFQ1RfRVEocmVjdC50b3AsIG5ld19yZWN0LnRvcCk7CisKKyAgLy8gU2F2ZSB0aGUgZG9jdW1lbnQsIGNsb3NpbmcgdGhlIHBhZ2UgYW5kIGRvY3VtZW50LgorICBGUERGUGFnZV9DbG9zZUFubm90KGFubm90KTsKKyAgRVhQRUNUX1RSVUUoRlBERl9TYXZlQXNDb3B5KGRvY3VtZW50KCksIHRoaXMsIDApKTsKKyAgRlBERl9DbG9zZVBhZ2UocGFnZSk7CisKKyAgLy8gT3BlbiB0aGUgc2F2ZWQgZG9jdW1lbnQuCisgIE9wZW5TYXZlZERvY3VtZW50KCk7CisgIHBhZ2UgPSBMb2FkU2F2ZWRQYWdlKDApOworICBWZXJpZnlTYXZlZFJlbmRlcmluZyhwYWdlLCA1OTUsIDg0MiwgbWQ1X25ld19hbm5vdCk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgZG9jdW1lbnQgaGFzIGEgY29ycmVjdCBjb3VudCBvZiBhbm5vdGF0aW9ucyBhbmQgb2JqZWN0cy4KKyAgRVhQRUNUX0VRKDMsIEZQREZQYWdlX0dldEFubm90Q291bnQocGFnZSkpOworICBhbm5vdCA9IEZQREZQYWdlX0dldEFubm90KHBhZ2UsIDIpOworICBBU1NFUlRfVFJVRShhbm5vdCk7CisgIEVYUEVDVF9FUSgxLCBGUERGQW5ub3RfR2V0T2JqZWN0Q291bnQoYW5ub3QpKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBuZXcgYW5ub3RhdGlvbidzIHJlY3RhbmdsZSBpcyBhcyBkZWZpbmVkLgorICBBU1NFUlRfVFJVRShGUERGQW5ub3RfR2V0UmVjdChhbm5vdCwgJm5ld19yZWN0KSk7CisgIEVYUEVDVF9FUShyZWN0LmxlZnQsIG5ld19yZWN0LmxlZnQpOworICBFWFBFQ1RfRVEocmVjdC5ib3R0b20sIG5ld19yZWN0LmJvdHRvbSk7CisgIEVYUEVDVF9FUShyZWN0LnJpZ2h0LCBuZXdfcmVjdC5yaWdodCk7CisgIEVYUEVDVF9FUShyZWN0LnRvcCwgbmV3X3JlY3QudG9wKTsKKworICBGUERGUGFnZV9DbG9zZUFubm90KGFubm90KTsKKyAgQ2xvc2VTYXZlZFBhZ2UocGFnZSk7CisgIENsb3NlU2F2ZWREb2N1bWVudCgpOworfQorCitURVNUX0YoRlBERkFubm90RW1iZWRkZXJ0ZXN0LCBNb2RpZnlBbm5vdGF0aW9uRmxhZ3MpIHsKKyAgLy8gT3BlbiBhIGZpbGUgd2l0aCBhbiBhbm5vdGF0aW9uIGFuZCBsb2FkIGl0cyBmaXJzdCBwYWdlLgorICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoImFubm90YXRpb25faGlnaGxpZ2h0X3JvbGxvdmVyX2FwLnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBGUERGX0xvYWRQYWdlKGRvY3VtZW50KCksIDApOworICBBU1NFUlRfVFJVRShwYWdlKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBwYWdlIHJlbmRlcnMgY29ycmVjdGx5LgorICBGUERGX0JJVE1BUCBiaXRtYXAgPSBSZW5kZXJQYWdlV2l0aEZsYWdzKHBhZ2UsIGZvcm1faGFuZGxlXywgRlBERl9BTk5PVCk7CisgIENvbXBhcmVCaXRtYXAoYml0bWFwLCA2MTIsIDc5MiwgImRjOThmMDZkYTA0N2JkOGFhYmZhOTk1NjJkMmNiZDFlIik7CisgIEZQREZCaXRtYXBfRGVzdHJveShiaXRtYXApOworCisgIC8vIFJldHJpZXZlIHRoZSBhbm5vdGF0aW9uLgorICBGUERGX0FOTk9UQVRJT04gYW5ub3QgPSBGUERGUGFnZV9HZXRBbm5vdChwYWdlLCAwKTsKKyAgQVNTRVJUX1RSVUUoYW5ub3QpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIG9yaWdpbmFsIGZsYWcgdmFsdWVzIGFyZSBhcyBleHBlY3RlZC4KKyAgaW50IGZsYWdzID0gRlBERkFubm90X0dldEZsYWdzKGFubm90KTsKKyAgRVhQRUNUX0ZBTFNFKGZsYWdzICYgRlBERl9BTk5PVF9GTEFHX0hJRERFTik7CisgIEVYUEVDVF9UUlVFKGZsYWdzICYgRlBERl9BTk5PVF9GTEFHX1BSSU5UKTsKKworICAvLyBTZXQgdGhlIEhJRERFTiBmbGFnLgorICBmbGFncyB8PSBGUERGX0FOTk9UX0ZMQUdfSElEREVOOworICBFWFBFQ1RfVFJVRShGUERGQW5ub3RfU2V0RmxhZ3MoYW5ub3QsIGZsYWdzKSk7CisgIGZsYWdzID0gRlBERkFubm90X0dldEZsYWdzKGFubm90KTsKKyAgRVhQRUNUX1RSVUUoZmxhZ3MgJiBGUERGX0FOTk9UX0ZMQUdfSElEREVOKTsKKyAgRVhQRUNUX1RSVUUoZmxhZ3MgJiBGUERGX0FOTk9UX0ZMQUdfUFJJTlQpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIHBhZ2UgcmVuZGVycyBjb3JyZWN0bHkgd2l0aG91dCByZW5kZXJpbmcgdGhlIGFubm90YXRpb24uCisgIGJpdG1hcCA9IFJlbmRlclBhZ2VXaXRoRmxhZ3MocGFnZSwgZm9ybV9oYW5kbGVfLCBGUERGX0FOTk9UKTsKKyAgQ29tcGFyZUJpdG1hcChiaXRtYXAsIDYxMiwgNzkyLCAiMTk0MDU2OGM5YmEzM2JhYzVkMGIxZWU5NTU4Yzc2YjMiKTsKKyAgRlBERkJpdG1hcF9EZXN0cm95KGJpdG1hcCk7CisKKyAgLy8gVW5zZXQgdGhlIEhJRERFTiBmbGFnLgorICBFWFBFQ1RfVFJVRShGUERGQW5ub3RfU2V0RmxhZ3MoYW5ub3QsIEZQREZfQU5OT1RfRkxBR19OT05FKSk7CisgIEVYUEVDVF9GQUxTRShGUERGQW5ub3RfR2V0RmxhZ3MoYW5ub3QpKTsKKyAgZmxhZ3MgJj0gfkZQREZfQU5OT1RfRkxBR19ISURERU47CisgIEVYUEVDVF9UUlVFKEZQREZBbm5vdF9TZXRGbGFncyhhbm5vdCwgZmxhZ3MpKTsKKyAgZmxhZ3MgPSBGUERGQW5ub3RfR2V0RmxhZ3MoYW5ub3QpOworICBFWFBFQ1RfRkFMU0UoZmxhZ3MgJiBGUERGX0FOTk9UX0ZMQUdfSElEREVOKTsKKyAgRVhQRUNUX1RSVUUoZmxhZ3MgJiBGUERGX0FOTk9UX0ZMQUdfUFJJTlQpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIHBhZ2UgcmVuZGVycyBjb3JyZWN0bHkgYXMgYmVmb3JlLgorICBiaXRtYXAgPSBSZW5kZXJQYWdlV2l0aEZsYWdzKHBhZ2UsIGZvcm1faGFuZGxlXywgRlBERl9BTk5PVCk7CisgIENvbXBhcmVCaXRtYXAoYml0bWFwLCA2MTIsIDc5MiwgImRjOThmMDZkYTA0N2JkOGFhYmZhOTk1NjJkMmNiZDFlIik7CisgIEZQREZCaXRtYXBfRGVzdHJveShiaXRtYXApOworCisgIEZQREZQYWdlX0Nsb3NlQW5ub3QoYW5ub3QpOworICBVbmxvYWRQYWdlKHBhZ2UpOworfQorCitURVNUX0YoRlBERkFubm90RW1iZWRkZXJ0ZXN0LCBBZGRBbmRNb2RpZnlJbWFnZSkgeworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXworICBjb25zdCBjaGFyIG1kNV9vcmlnaW5hbFtdID0gImMzNTQwODcxNzc1OTU2MmQxZjhiZjMzZDMxNzQ4M2QyIjsKKyAgY29uc3QgY2hhciBtZDVfbmV3X2ltYWdlW10gPSAiZmYwMTJmNTY5NzQzNmRmY2FlYzI1YjMyZDEzMzM1OTYiOworICBjb25zdCBjaGFyIG1kNV9tb2RpZmllZF9pbWFnZVtdID0gIjg2Y2Y4Y2IyNzU1YTdhMjA0NmE1NDNlNjZkOWMxZTYxIjsKKyNlbHNlCisgIGNvbnN0IGNoYXIgbWQ1X29yaWdpbmFsW10gPSAiOTY0Zjg5YmJlODkxMWU1NDBhNDY1Y2YxYTY0YjdmN2UiOworICBjb25zdCBjaGFyIG1kNV9uZXdfaW1hZ2VbXSA9ICI5ZWE4NzMyZGM5ZDU3OWY2ODg1M2YxNjg5Mjg1NjIwOCI7CisgIGNvbnN0IGNoYXIgbWQ1X21vZGlmaWVkX2ltYWdlW10gPSAiNzQyMzlkMmE4YzU1YzlkZTFkYmI5Y2Q4NzgxODk1YWEiOworI2VuZGlmCisKKyAgLy8gT3BlbiBhIGZpbGUgd2l0aCB0d28gYW5ub3RhdGlvbnMgYW5kIGxvYWQgaXRzIGZpcnN0IHBhZ2UuCisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiYW5ub3RhdGlvbl9zdGFtcF93aXRoX2FwLnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBGUERGX0xvYWRQYWdlKGRvY3VtZW50KCksIDApOworICBBU1NFUlRfVFJVRShwYWdlKTsKKyAgRVhQRUNUX0VRKDIsIEZQREZQYWdlX0dldEFubm90Q291bnQocGFnZSkpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIHBhZ2UgcmVuZGVycyBjb3JyZWN0bHkuCisgIEZQREZfQklUTUFQIGJpdG1hcCA9IFJlbmRlclBhZ2VXaXRoRmxhZ3MocGFnZSwgZm9ybV9oYW5kbGVfLCBGUERGX0FOTk9UKTsKKyAgQ29tcGFyZUJpdG1hcChiaXRtYXAsIDU5NSwgODQyLCBtZDVfb3JpZ2luYWwpOworICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsKKworICAvLyBDcmVhdGUgYSBzdGFtcCBhbm5vdGF0aW9uIGFuZCBzZXQgaXRzIGFubm90YXRpb24gcmVjdGFuZ2xlLgorICBGUERGX0FOTk9UQVRJT04gYW5ub3QgPSBGUERGUGFnZV9DcmVhdGVBbm5vdChwYWdlLCBGUERGX0FOTk9UX1NUQU1QKTsKKyAgQVNTRVJUX1RSVUUoYW5ub3QpOworICBGU19SRUNURiByZWN0OworICByZWN0LmxlZnQgPSAyMDAuZjsKKyAgcmVjdC5ib3R0b20gPSA2MDAuZjsKKyAgcmVjdC5yaWdodCA9IDQwMC5mOworICByZWN0LnRvcCA9IDgwMC5mOworICBFWFBFQ1RfVFJVRShGUERGQW5ub3RfU2V0UmVjdChhbm5vdCwgJnJlY3QpKTsKKworICAvLyBBZGQgYSBzb2xpZC1jb2xvciB0cmFuc2x1Y2VudCBpbWFnZSBvYmplY3QgdG8gdGhlIG5ldyBhbm5vdGF0aW9uLgorICBjb25zdGV4cHIgaW50IGtCaXRtYXBTaXplID0gMjAwOworICBGUERGX0JJVE1BUCBpbWFnZV9iaXRtYXAgPSBGUERGQml0bWFwX0NyZWF0ZShrQml0bWFwU2l6ZSwga0JpdG1hcFNpemUsIDEpOworICBGUERGQml0bWFwX0ZpbGxSZWN0KGltYWdlX2JpdG1hcCwgMCwgMCwga0JpdG1hcFNpemUsIGtCaXRtYXBTaXplLCAweGVlZWVjY2NjKTsKKyAgRVhQRUNUX0VRKGtCaXRtYXBTaXplLCBGUERGQml0bWFwX0dldFdpZHRoKGltYWdlX2JpdG1hcCkpOworICBFWFBFQ1RfRVEoa0JpdG1hcFNpemUsIEZQREZCaXRtYXBfR2V0SGVpZ2h0KGltYWdlX2JpdG1hcCkpOworICBGUERGX1BBR0VPQkpFQ1QgaW1hZ2Vfb2JqZWN0ID0gRlBERlBhZ2VPYmpfTmV3SW1hZ2VPYmooZG9jdW1lbnQoKSk7CisgIEFTU0VSVF9UUlVFKEZQREZJbWFnZU9ial9TZXRCaXRtYXAoJnBhZ2UsIDAsIGltYWdlX29iamVjdCwgaW1hZ2VfYml0bWFwKSk7CisgIEFTU0VSVF9UUlVFKEZQREZJbWFnZU9ial9TZXRNYXRyaXgoaW1hZ2Vfb2JqZWN0LCBrQml0bWFwU2l6ZSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQml0bWFwU2l6ZSwgMCwgMCkpOworICBGUERGUGFnZU9ial9UcmFuc2Zvcm0oaW1hZ2Vfb2JqZWN0LCAxLCAwLCAwLCAxLCAyMDAsIDYwMCk7CisgIEVYUEVDVF9UUlVFKEZQREZBbm5vdF9BcHBlbmRPYmplY3QoYW5ub3QsIGltYWdlX29iamVjdCkpOworICBGUERGUGFnZV9DbG9zZUFubm90KGFubm90KTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBwYWdlIHJlbmRlcnMgY29ycmVjdGx5IHdpdGggdGhlIG5ldyBpbWFnZSBvYmplY3QuCisgIGJpdG1hcCA9IFJlbmRlclBhZ2VXaXRoRmxhZ3MocGFnZSwgZm9ybV9oYW5kbGVfLCBGUERGX0FOTk9UKTsKKyAgQ29tcGFyZUJpdG1hcChiaXRtYXAsIDU5NSwgODQyLCBtZDVfbmV3X2ltYWdlKTsKKyAgRlBERkJpdG1hcF9EZXN0cm95KGJpdG1hcCk7CisKKyAgLy8gUmV0cmlldmUgdGhlIG5ld2x5IGFkZGVkIHN0YW1wIGFubm90YXRpb24gYW5kIGl0cyBpbWFnZSBvYmplY3QuCisgIGFubm90ID0gRlBERlBhZ2VfR2V0QW5ub3QocGFnZSwgMik7CisgIEFTU0VSVF9UUlVFKGFubm90KTsKKyAgRVhQRUNUX0VRKDEsIEZQREZBbm5vdF9HZXRPYmplY3RDb3VudChhbm5vdCkpOworICBpbWFnZV9vYmplY3QgPSBGUERGQW5ub3RfR2V0T2JqZWN0KGFubm90LCAwKTsKKyAgRVhQRUNUX0VRKEZQREZfUEFHRU9CSl9JTUFHRSwgRlBERlBhZ2VPYmpfR2V0VHlwZShpbWFnZV9vYmplY3QpKTsKKworICAvLyBNb2RpZnkgdGhlIGltYWdlIGluIHRoZSBuZXcgYW5ub3RhdGlvbi4KKyAgRlBERkJpdG1hcF9GaWxsUmVjdChpbWFnZV9iaXRtYXAsIDAsIDAsIGtCaXRtYXBTaXplLCBrQml0bWFwU2l6ZSwgMHhmZjAwMDAwMCk7CisgIEFTU0VSVF9UUlVFKEZQREZJbWFnZU9ial9TZXRCaXRtYXAoJnBhZ2UsIDAsIGltYWdlX29iamVjdCwgaW1hZ2VfYml0bWFwKSk7CisgIEVYUEVDVF9UUlVFKEZQREZBbm5vdF9VcGRhdGVPYmplY3QoYW5ub3QsIGltYWdlX29iamVjdCkpOworICBGUERGUGFnZV9DbG9zZUFubm90KGFubm90KTsKKworICAvLyBTYXZlIHRoZSBkb2N1bWVudCwgY2xvc2luZyB0aGUgcGFnZSBhbmQgZG9jdW1lbnQuCisgIEVYUEVDVF9UUlVFKEZQREZfU2F2ZUFzQ29weShkb2N1bWVudCgpLCB0aGlzLCAwKSk7CisgIEZQREZfQ2xvc2VQYWdlKHBhZ2UpOworICBGUERGQml0bWFwX0Rlc3Ryb3koaW1hZ2VfYml0bWFwKTsKKworICAvLyBUZXN0IHRoYXQgdGhlIHNhdmVkIGRvY3VtZW50IHJlbmRlcnMgdGhlIG1vZGlmaWVkIGltYWdlIG9iamVjdCBjb3JyZWN0bHkuCisgIFZlcmlmeVNhdmVkRG9jdW1lbnQoNTk1LCA4NDIsIG1kNV9tb2RpZmllZF9pbWFnZSk7Cit9CisKK1RFU1RfRihGUERGQW5ub3RFbWJlZGRlcnRlc3QsIEFkZEFuZE1vZGlmeVRleHQpIHsKKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9BUFBMRV8KKyAgY29uc3QgY2hhciBtZDVfb3JpZ2luYWxbXSA9ICJjMzU0MDg3MTc3NTk1NjJkMWY4YmYzM2QzMTc0ODNkMiI7CisgIGNvbnN0IGNoYXIgbWQ1X25ld190ZXh0W10gPSAiZTU2ODBlZDA0OGMyY2ZkOWExZDI3MjEyY2RmNDEyODYiOworICBjb25zdCBjaGFyIG1kNV9tb2RpZmllZF90ZXh0W10gPSAiNzlmNWNmYjBiMDdjYWFmOTM2ZjY1ZjZhN2E1N2NlNzciOworI2Vsc2UKKyAgY29uc3QgY2hhciBtZDVfb3JpZ2luYWxbXSA9ICI5NjRmODliYmU4OTExZTU0MGE0NjVjZjFhNjRiN2Y3ZSI7CisgIGNvbnN0IGNoYXIgbWQ1X25ld190ZXh0W10gPSAiMDBiMTRmYTJkYzFjOTBkMWIwZDAzNGUxNjA4ZWZlZjUiOworICBjb25zdCBjaGFyIG1kNV9tb2RpZmllZF90ZXh0W10gPSAiMDc2YzhmMjRhMDlkZGMwZTQ5ZjdlNzU4ZWRlYWQ2ZjAiOworI2VuZGlmCisKKyAgLy8gT3BlbiBhIGZpbGUgd2l0aCB0d28gYW5ub3RhdGlvbnMgYW5kIGxvYWQgaXRzIGZpcnN0IHBhZ2UuCisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiYW5ub3RhdGlvbl9zdGFtcF93aXRoX2FwLnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBGUERGX0xvYWRQYWdlKGRvY3VtZW50KCksIDApOworICBBU1NFUlRfVFJVRShwYWdlKTsKKyAgRVhQRUNUX0VRKDIsIEZQREZQYWdlX0dldEFubm90Q291bnQocGFnZSkpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIHBhZ2UgcmVuZGVycyBjb3JyZWN0bHkuCisgIEZQREZfQklUTUFQIGJpdG1hcCA9IFJlbmRlclBhZ2VXaXRoRmxhZ3MocGFnZSwgZm9ybV9oYW5kbGVfLCBGUERGX0FOTk9UKTsKKyAgQ29tcGFyZUJpdG1hcChiaXRtYXAsIDU5NSwgODQyLCBtZDVfb3JpZ2luYWwpOworICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsKKworICAvLyBDcmVhdGUgYSBzdGFtcCBhbm5vdGF0aW9uIGFuZCBzZXQgaXRzIGFubm90YXRpb24gcmVjdGFuZ2xlLgorICBGUERGX0FOTk9UQVRJT04gYW5ub3QgPSBGUERGUGFnZV9DcmVhdGVBbm5vdChwYWdlLCBGUERGX0FOTk9UX1NUQU1QKTsKKyAgQVNTRVJUX1RSVUUoYW5ub3QpOworICBGU19SRUNURiByZWN0OworICByZWN0LmxlZnQgPSAyMDAuZjsKKyAgcmVjdC5ib3R0b20gPSA1NTAuZjsKKyAgcmVjdC5yaWdodCA9IDQ1MC5mOworICByZWN0LnRvcCA9IDY1MC5mOworICBFWFBFQ1RfVFJVRShGUERGQW5ub3RfU2V0UmVjdChhbm5vdCwgJnJlY3QpKTsKKworICAvLyBBZGQgYSB0cmFuc2x1Y2VudCB0ZXh0IG9iamVjdCB0byB0aGUgbmV3IGFubm90YXRpb24uCisgIEZQREZfUEFHRU9CSkVDVCB0ZXh0X29iamVjdCA9CisgICAgICBGUERGUGFnZU9ial9OZXdUZXh0T2JqKGRvY3VtZW50KCksICJBcmlhbCIsIDEyLjBmKTsKKyAgRVhQRUNUX1RSVUUodGV4dF9vYmplY3QpOworICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IHRleHQgPQorICAgICAgR2V0RlBERldpZGVTdHJpbmcoTCJJJ20gYSB0cmFuc2x1Y2VudCB0ZXh0IGxheWluZyBvbiBvdGhlciB0ZXh0LiIpOworICBFWFBFQ1RfVFJVRShGUERGVGV4dF9TZXRUZXh0KHRleHRfb2JqZWN0LCB0ZXh0LmdldCgpKSk7CisgIEVYUEVDVF9UUlVFKEZQREZUZXh0X1NldEZpbGxDb2xvcih0ZXh0X29iamVjdCwgMCwgMCwgMjU1LCAxNTApKTsKKyAgRlBERlBhZ2VPYmpfVHJhbnNmb3JtKHRleHRfb2JqZWN0LCAxLCAwLCAwLCAxLCAyMDAsIDYwMCk7CisgIEVYUEVDVF9UUlVFKEZQREZBbm5vdF9BcHBlbmRPYmplY3QoYW5ub3QsIHRleHRfb2JqZWN0KSk7CisgIEZQREZQYWdlX0Nsb3NlQW5ub3QoYW5ub3QpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIHBhZ2UgcmVuZGVycyBjb3JyZWN0bHkgd2l0aCB0aGUgbmV3IHRleHQgb2JqZWN0LgorICBiaXRtYXAgPSBSZW5kZXJQYWdlV2l0aEZsYWdzKHBhZ2UsIGZvcm1faGFuZGxlXywgRlBERl9BTk5PVCk7CisgIENvbXBhcmVCaXRtYXAoYml0bWFwLCA1OTUsIDg0MiwgbWQ1X25ld190ZXh0KTsKKyAgRlBERkJpdG1hcF9EZXN0cm95KGJpdG1hcCk7CisKKyAgLy8gUmV0cmlldmUgdGhlIG5ld2x5IGFkZGVkIHN0YW1wIGFubm90YXRpb24gYW5kIGl0cyB0ZXh0IG9iamVjdC4KKyAgYW5ub3QgPSBGUERGUGFnZV9HZXRBbm5vdChwYWdlLCAyKTsKKyAgQVNTRVJUX1RSVUUoYW5ub3QpOworICBFWFBFQ1RfRVEoMSwgRlBERkFubm90X0dldE9iamVjdENvdW50KGFubm90KSk7CisgIHRleHRfb2JqZWN0ID0gRlBERkFubm90X0dldE9iamVjdChhbm5vdCwgMCk7CisgIEVYUEVDVF9FUShGUERGX1BBR0VPQkpfVEVYVCwgRlBERlBhZ2VPYmpfR2V0VHlwZSh0ZXh0X29iamVjdCkpOworCisgIC8vIE1vZGlmeSB0aGUgdGV4dCBpbiB0aGUgbmV3IGFubm90YXRpb24uCisgIHN0ZDo6dW5pcXVlX3B0cjx1bnNpZ25lZCBzaG9ydCwgcGRmaXVtOjpGcmVlRGVsZXRlcj4gbmV3X3RleHQgPQorICAgICAgR2V0RlBERldpZGVTdHJpbmcoTCJOZXcgdGV4dCEiKTsKKyAgRVhQRUNUX1RSVUUoRlBERlRleHRfU2V0VGV4dCh0ZXh0X29iamVjdCwgbmV3X3RleHQuZ2V0KCkpKTsKKyAgRVhQRUNUX1RSVUUoRlBERkFubm90X1VwZGF0ZU9iamVjdChhbm5vdCwgdGV4dF9vYmplY3QpKTsKKyAgRlBERlBhZ2VfQ2xvc2VBbm5vdChhbm5vdCk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgcGFnZSByZW5kZXJzIGNvcnJlY3RseSB3aXRoIHRoZSBtb2RpZmllZCB0ZXh0IG9iamVjdC4KKyAgYml0bWFwID0gUmVuZGVyUGFnZVdpdGhGbGFncyhwYWdlLCBmb3JtX2hhbmRsZV8sIEZQREZfQU5OT1QpOworICBDb21wYXJlQml0bWFwKGJpdG1hcCwgNTk1LCA4NDIsIG1kNV9tb2RpZmllZF90ZXh0KTsKKyAgRlBERkJpdG1hcF9EZXN0cm95KGJpdG1hcCk7CisKKyAgLy8gUmVtb3ZlIHRoZSBuZXcgYW5ub3RhdGlvbiwgYW5kIGNoZWNrIHRoYXQgdGhlIHBhZ2UgcmVuZGVycyBhcyBiZWZvcmUuCisgIEVYUEVDVF9UUlVFKEZQREZQYWdlX1JlbW92ZUFubm90KHBhZ2UsIDIpKTsKKyAgYml0bWFwID0gUmVuZGVyUGFnZVdpdGhGbGFncyhwYWdlLCBmb3JtX2hhbmRsZV8sIEZQREZfQU5OT1QpOworICBDb21wYXJlQml0bWFwKGJpdG1hcCwgNTk1LCA4NDIsIG1kNV9vcmlnaW5hbCk7CisgIEZQREZCaXRtYXBfRGVzdHJveShiaXRtYXApOworCisgIFVubG9hZFBhZ2UocGFnZSk7Cit9CisKK1RFU1RfRihGUERGQW5ub3RFbWJlZGRlcnRlc3QsIEdldFNldFN0cmluZ1ZhbHVlKSB7CisgIC8vIE9wZW4gYSBmaWxlIHdpdGggZm91ciBhbm5vdGF0aW9ucyBhbmQgbG9hZCBpdHMgZmlyc3QgcGFnZS4KKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJhbm5vdGF0aW9uX3N0YW1wX3dpdGhfYXAucGRmIikpOworICBGUERGX1BBR0UgcGFnZSA9IEZQREZfTG9hZFBhZ2UoZG9jdW1lbnQoKSwgMCk7CisgIEFTU0VSVF9UUlVFKHBhZ2UpOworCisgIC8vIFJldHJpZXZlIHRoZSBmaXJzdCBhbm5vdGF0aW9uLgorICBGUERGX0FOTk9UQVRJT04gYW5ub3QgPSBGUERGUGFnZV9HZXRBbm5vdChwYWdlLCAwKTsKKyAgQVNTRVJUX1RSVUUoYW5ub3QpOworCisgIC8vIENoZWNrIHRoYXQgYSBub24tZXhpc3RlbnQga2V5IGRvZXMgbm90IGV4aXN0LgorICBFWFBFQ1RfRkFMU0UoRlBERkFubm90X0hhc0tleShhbm5vdCwgIm5vbmUiKSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgc3RyaW5nIHZhbHVlIG9mIGEgbm9uLXN0cmluZyBkaWN0aW9uYXJ5IGVudHJ5IGlzIGVtcHR5LgorICBzdGF0aWMgY29uc3RleHByIGNoYXIga0FwS2V5W10gPSAiQVAiOworICBFWFBFQ1RfVFJVRShGUERGQW5ub3RfSGFzS2V5KGFubm90LCBrQXBLZXkpKTsKKyAgRVhQRUNUX0VRKEZQREZfT0JKRUNUX1JFRkVSRU5DRSwgRlBERkFubm90X0dldFZhbHVlVHlwZShhbm5vdCwga0FwS2V5KSk7CisgIEVYUEVDVF9FUSgydSwgRlBERkFubm90X0dldFN0cmluZ1ZhbHVlKGFubm90LCBrQXBLZXksIG51bGxwdHIsIDApKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGhhc2ggaXMgY29ycmVjdC4KKyAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtIYXNoS2V5W10gPSAiQUFQTDpIYXNoIjsKKyAgRVhQRUNUX0VRKEZQREZfT0JKRUNUX05BTUUsIEZQREZBbm5vdF9HZXRWYWx1ZVR5cGUoYW5ub3QsIGtIYXNoS2V5KSk7CisgIHVuc2lnbmVkIGxvbmcgbGVuID0gRlBERkFubm90X0dldFN0cmluZ1ZhbHVlKGFubm90LCBrSGFzaEtleSwgbnVsbHB0ciwgMCk7CisgIHN0ZDo6dmVjdG9yPGNoYXI+IGJ1ZihsZW4pOworICBFWFBFQ1RfRVEoNjZ1LCBGUERGQW5ub3RfR2V0U3RyaW5nVmFsdWUoYW5ub3QsIGtIYXNoS2V5LCBidWYuZGF0YSgpLCBsZW4pKTsKKyAgRVhQRUNUX1NUUkVRKEwiMzk1ZmJjYjk4ZDU1ODY4MTc0MmYzMDY4M2E2MmEyYWQiLAorICAgICAgICAgICAgICAgQnVmZmVyVG9XU3RyaW5nKGJ1ZikuY19zdHIoKSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBtb2RpZmllZCBkYXRlIGlzIGNvcnJlY3QuCisgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrRGF0ZUtleVtdID0gIk0iOworICBFWFBFQ1RfRVEoRlBERl9PQkpFQ1RfTkFNRSwgRlBERkFubm90X0dldFZhbHVlVHlwZShhbm5vdCwga0hhc2hLZXkpKTsKKyAgbGVuID0gRlBERkFubm90X0dldFN0cmluZ1ZhbHVlKGFubm90LCBrRGF0ZUtleSwgbnVsbHB0ciwgMCk7CisgIGJ1Zi5jbGVhcigpOworICBidWYucmVzaXplKGxlbik7CisgIEVYUEVDVF9FUSg0NHUsIEZQREZBbm5vdF9HZXRTdHJpbmdWYWx1ZShhbm5vdCwga0RhdGVLZXksIGJ1Zi5kYXRhKCksIGxlbikpOworICBFWFBFQ1RfU1RSRVEoTCJEOjIwMTcwNjA3MTcyMVowMCcwMCciLCBCdWZmZXJUb1dTdHJpbmcoYnVmKS5jX3N0cigpKTsKKworICAvLyBVcGRhdGUgdGhlIGRhdGUgZW50cnkgZm9yIHRoZSBhbm5vdGF0aW9uLgorICBjb25zdCB3Y2hhcl90IG5ld19kYXRlW10gPSBMIkQ6MjAxNzA2MjgyMzU5WjAwJzAwJyI7CisgIHN0ZDo6dW5pcXVlX3B0cjx1bnNpZ25lZCBzaG9ydCwgcGRmaXVtOjpGcmVlRGVsZXRlcj4gdGV4dCA9CisgICAgICBHZXRGUERGV2lkZVN0cmluZyhuZXdfZGF0ZSk7CisgIEVYUEVDVF9UUlVFKEZQREZBbm5vdF9TZXRTdHJpbmdWYWx1ZShhbm5vdCwga0RhdGVLZXksIHRleHQuZ2V0KCkpKTsKKworICAvLyBTYXZlIHRoZSBkb2N1bWVudCwgY2xvc2luZyB0aGUgcGFnZSBhbmQgZG9jdW1lbnQuCisgIEZQREZQYWdlX0Nsb3NlQW5ub3QoYW5ub3QpOworICBFWFBFQ1RfVFJVRShGUERGX1NhdmVBc0NvcHkoZG9jdW1lbnQoKSwgdGhpcywgMCkpOworICBGUERGX0Nsb3NlUGFnZShwYWdlKTsKKworICAvLyBPcGVuIHRoZSBzYXZlZCBhbm5vdGF0aW9uLgorI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXworICBjb25zdCBjaGFyIG1kNVtdID0gIjRkNjRlNjFjOWMwZjhjNjBhYjNjYzMyMzRiYjczYjFjIjsKKyNlbHNlCisgIGNvbnN0IGNoYXIgbWQ1W10gPSAiYzk2ZWUxZjMxNmQ3ZjVhMWIxNTRkZTlmOWQ0NjdmMDEiOworI2VuZGlmCisgIE9wZW5TYXZlZERvY3VtZW50KCk7CisgIHBhZ2UgPSBMb2FkU2F2ZWRQYWdlKDApOworICBWZXJpZnlTYXZlZFJlbmRlcmluZyhwYWdlLCA1OTUsIDg0MiwgbWQ1KTsKKyAgRlBERl9BTk5PVEFUSU9OIG5ld19hbm5vdCA9IEZQREZQYWdlX0dldEFubm90KHBhZ2UsIDApOworCisgIC8vIENoZWNrIHRoYXQgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgbW9kaWZpZWQgZGF0ZSBpcyB0aGUgbmV3bHktc2V0IHZhbHVlLgorICBFWFBFQ1RfRVEoRlBERl9PQkpFQ1RfU1RSSU5HLCBGUERGQW5ub3RfR2V0VmFsdWVUeXBlKG5ld19hbm5vdCwga0RhdGVLZXkpKTsKKyAgbGVuID0gRlBERkFubm90X0dldFN0cmluZ1ZhbHVlKG5ld19hbm5vdCwga0RhdGVLZXksIG51bGxwdHIsIDApOworICBidWYuY2xlYXIoKTsKKyAgYnVmLnJlc2l6ZShsZW4pOworICBFWFBFQ1RfRVEoNDR1LAorICAgICAgICAgICAgRlBERkFubm90X0dldFN0cmluZ1ZhbHVlKG5ld19hbm5vdCwga0RhdGVLZXksIGJ1Zi5kYXRhKCksIGxlbikpOworICBFWFBFQ1RfU1RSRVEobmV3X2RhdGUsIEJ1ZmZlclRvV1N0cmluZyhidWYpLmNfc3RyKCkpOworCisgIEZQREZQYWdlX0Nsb3NlQW5ub3QobmV3X2Fubm90KTsKKyAgQ2xvc2VTYXZlZFBhZ2UocGFnZSk7CisgIENsb3NlU2F2ZWREb2N1bWVudCgpOworfQorCitURVNUX0YoRlBERkFubm90RW1iZWRkZXJ0ZXN0LCBHZXRTZXRBUCkgeworICAvLyBPcGVuIGEgZmlsZSB3aXRoIGZvdXIgYW5ub3RhdGlvbnMgYW5kIGxvYWQgaXRzIGZpcnN0IHBhZ2UuCisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiYW5ub3RhdGlvbl9zdGFtcF93aXRoX2FwLnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBGUERGX0xvYWRQYWdlKGRvY3VtZW50KCksIDApOworICBBU1NFUlRfVFJVRShwYWdlKTsKKworICAvLyBSZXRyaWV2ZSB0aGUgZmlyc3QgYW5ub3RhdGlvbi4KKyAgRlBERl9BTk5PVEFUSU9OIGFubm90ID0gRlBERlBhZ2VfR2V0QW5ub3QocGFnZSwgMCk7CisgIEFTU0VSVF9UUlVFKGFubm90KTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBzdHJpbmcgdmFsdWUgb2YgYW4gQVAgcmV0dXJucyB0aGUgZXhwZWN0ZWQgbGVuZ3RoLgorICB1bnNpZ25lZCBsb25nIG5vcm1hbF9sZW4gPQorICAgICAgRlBERkFubm90X0dldEFQKGFubm90LCBGUERGX0FOTk9UX0FQUEVBUkFOQ0VNT0RFX05PUk1BTCwgbnVsbHB0ciwgMCk7CisgIEVYUEVDVF9FUSg3Mzk3MHUsIG5vcm1hbF9sZW4pOworCisgIC8vIENoZWNrIHRoYXQgdGhlIHN0cmluZyB2YWx1ZSBvZiBhbiBBUCBpcyBub3QgcmV0dXJuZWQgaWYgdGhlIGJ1ZmZlciBpcyB0b28KKyAgLy8gc21hbGwuIFRoZSByZXN1bHQgYnVmZmVyIHNob3VsZCBiZSBvdmVyd3JpdHRlbiB3aXRoIGFuIGVtcHR5IHN0cmluZy4KKyAgc3RkOjp2ZWN0b3I8Y2hhcj4gYnVmKG5vcm1hbF9sZW4gLSAxKTsKKyAgLy8gV3JpdGUgTCJ6IiBpbiB0aGUgYnVmZmVyIHRvIHZlcmlmeSBpdCdzIG5vdCBvdmVyd3JpdHRlbi4KKyAgd2NzY3B5KHJlaW50ZXJwcmV0X2Nhc3Q8d2NoYXJfdCo+KGJ1Zi5kYXRhKCkpLCBMInoiKTsKKyAgRVhQRUNUX0VRKDczOTcwdSwgRlBERkFubm90X0dldEFQKGFubm90LCBGUERGX0FOTk9UX0FQUEVBUkFOQ0VNT0RFX05PUk1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5kYXRhKCksIGJ1Zi5zaXplKCkpKTsKKyAgc3RkOjpzdHJpbmcgYXAgPSBCdWZmZXJUb1N0cmluZyhidWYpOworICBFWFBFQ1RfU1RSRVEoInoiLCBhcC5jX3N0cigpKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBzdHJpbmcgdmFsdWUgb2YgYW4gQVAgaXMgcmV0dXJuZWQgdGhyb3VnaCBhIGJ1ZmZlciB0aGF0IGlzCisgIC8vIHRoZSByaWdodCBzaXplLgorICBidWYuY2xlYXIoKTsKKyAgYnVmLnJlc2l6ZShub3JtYWxfbGVuKTsKKyAgRVhQRUNUX0VRKDczOTcwdSwgRlBERkFubm90X0dldEFQKGFubm90LCBGUERGX0FOTk9UX0FQUEVBUkFOQ0VNT0RFX05PUk1BTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5kYXRhKCksIGJ1Zi5zaXplKCkpKTsKKyAgYXAgPSBCdWZmZXJUb1N0cmluZyhidWYpOworICBFWFBFQ1RfVEhBVChhcCwgdGVzdGluZzo6U3RhcnRzV2l0aCgicSBRIHEgNy40NDI3ODYgdyAyIEoiKSk7CisgIEVYUEVDVF9USEFUKGFwLCB0ZXN0aW5nOjpFbmRzV2l0aCgiYyA3MTYuNTM4MSAzMjcuNzE1NiBsIFMgUSBRIikpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIHN0cmluZyB2YWx1ZSBvZiBhbiBBUCBpcyByZXR1cm5lZCB0aHJvdWdoIGEgYnVmZmVyIHRoYXQgaXMKKyAgLy8gbGFyZ2VyIHRoYW4gbmVjZXNzYXJ5LgorICBidWYuY2xlYXIoKTsKKyAgYnVmLnJlc2l6ZShub3JtYWxfbGVuICsgMSk7CisgIEVYUEVDVF9FUSg3Mzk3MHUsIEZQREZBbm5vdF9HZXRBUChhbm5vdCwgRlBERl9BTk5PVF9BUFBFQVJBTkNFTU9ERV9OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuZGF0YSgpLCBidWYuc2l6ZSgpKSk7CisgIGFwID0gQnVmZmVyVG9TdHJpbmcoYnVmKTsKKyAgRVhQRUNUX1RIQVQoYXAsIHRlc3Rpbmc6OlN0YXJ0c1dpdGgoInEgUSBxIDcuNDQyNzg2IHcgMiBKIikpOworICBFWFBFQ1RfVEhBVChhcCwgdGVzdGluZzo6RW5kc1dpdGgoImMgNzE2LjUzODEgMzI3LjcxNTYgbCBTIFEgUSIpKTsKKworICAvLyBDaGVjayB0aGF0IGdldHRpbmcgYW4gQVAgZm9yIGEgbW9kZSB0aGF0IGRvZXMgbm90IGhhdmUgYW4gQVAgcmV0dXJucyBhbgorICAvLyBlbXB0eSBzdHJpbmcuCisgIHVuc2lnbmVkIGxvbmcgcm9sbG92ZXJfbGVuID0KKyAgICAgIEZQREZBbm5vdF9HZXRBUChhbm5vdCwgRlBERl9BTk5PVF9BUFBFQVJBTkNFTU9ERV9ST0xMT1ZFUiwgbnVsbHB0ciwgMCk7CisgIEVYUEVDVF9FUSgydSwgcm9sbG92ZXJfbGVuKTsKKworICBidWYuY2xlYXIoKTsKKyAgYnVmLnJlc2l6ZSgxMDAwKTsKKyAgRVhQRUNUX0VRKDJ1LCBGUERGQW5ub3RfR2V0QVAoYW5ub3QsIEZQREZfQU5OT1RfQVBQRUFSQU5DRU1PREVfUk9MTE9WRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5kYXRhKCksIGJ1Zi5zaXplKCkpKTsKKyAgRVhQRUNUX1NUUkVRKCIiLCBCdWZmZXJUb1N0cmluZyhidWYpLmNfc3RyKCkpOworCisgIC8vIENoZWNrIHRoYXQgc2V0dGluZyB0aGUgQVAgZm9yIGFuIGludmFsaWQgYXBwZWFyYW5jZSBtb2RlIGZhaWxzLgorICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IGFwVGV4dCA9CisgICAgICBHZXRGUERGV2lkZVN0cmluZyhMIm5ldyB0ZXN0IGFwIik7CisgIEVYUEVDVF9GQUxTRShGUERGQW5ub3RfU2V0QVAoYW5ub3QsIC0xLCBhcFRleHQuZ2V0KCkpKTsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgRlBERkFubm90X1NldEFQKGFubm90LCBGUERGX0FOTk9UX0FQUEVBUkFOQ0VNT0RFX0NPVU5ULCBhcFRleHQuZ2V0KCkpKTsKKyAgRVhQRUNUX0ZBTFNFKEZQREZBbm5vdF9TZXRBUChhbm5vdCwgRlBERl9BTk5PVF9BUFBFQVJBTkNFTU9ERV9DT1VOVCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBUZXh0LmdldCgpKSk7CisKKyAgLy8gU2V0IHRoZSBBUCBjb3JyZWN0bHkgbm93LgorICBFWFBFQ1RfVFJVRSgKKyAgICAgIEZQREZBbm5vdF9TZXRBUChhbm5vdCwgRlBERl9BTk5PVF9BUFBFQVJBTkNFTU9ERV9ST0xMT1ZFUiwgYXBUZXh0LmdldCgpKSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgbmV3IGFubm90YXRpb24gdmFsdWUgaXMgZXF1YWwgdG8gdGhlIHZhbHVlIHdlIGp1c3Qgc2V0LgorICByb2xsb3Zlcl9sZW4gPQorICAgICAgRlBERkFubm90X0dldEFQKGFubm90LCBGUERGX0FOTk9UX0FQUEVBUkFOQ0VNT0RFX1JPTExPVkVSLCBudWxscHRyLCAwKTsKKyAgRVhQRUNUX0VRKDI0dSwgcm9sbG92ZXJfbGVuKTsKKyAgYnVmLmNsZWFyKCk7CisgIGJ1Zi5yZXNpemUocm9sbG92ZXJfbGVuKTsKKyAgRVhQRUNUX0VRKDI0dSwgRlBERkFubm90X0dldEFQKGFubm90LCBGUERGX0FOTk9UX0FQUEVBUkFOQ0VNT0RFX1JPTExPVkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmRhdGEoKSwgYnVmLnNpemUoKSkpOworICBFWFBFQ1RfU1RSRVEoTCJuZXcgdGVzdCBhcCIsIEJ1ZmZlclRvV1N0cmluZyhidWYpLmNfc3RyKCkpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIE5vcm1hbCBBUCB3YXMgbm90IHRvdWNoZWQgd2hlbiB0aGUgUm9sbG92ZXIgQVAgd2FzIHNldC4KKyAgYnVmLmNsZWFyKCk7CisgIGJ1Zi5yZXNpemUobm9ybWFsX2xlbik7CisgIEVYUEVDVF9FUSg3Mzk3MHUsIEZQREZBbm5vdF9HZXRBUChhbm5vdCwgRlBERl9BTk5PVF9BUFBFQVJBTkNFTU9ERV9OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuZGF0YSgpLCBidWYuc2l6ZSgpKSk7CisgIGFwID0gQnVmZmVyVG9TdHJpbmcoYnVmKTsKKyAgRVhQRUNUX1RIQVQoYXAsIHRlc3Rpbmc6OlN0YXJ0c1dpdGgoInEgUSBxIDcuNDQyNzg2IHcgMiBKIikpOworICBFWFBFQ1RfVEhBVChhcCwgdGVzdGluZzo6RW5kc1dpdGgoImMgNzE2LjUzODEgMzI3LjcxNTYgbCBTIFEgUSIpKTsKKworICAvLyBTYXZlIHRoZSBtb2RpZmllZCBkb2N1bWVudCwgdGhlbiByZW9wZW4gaXQuCisgIEZQREZQYWdlX0Nsb3NlQW5ub3QoYW5ub3QpOworICBFWFBFQ1RfVFJVRShGUERGX1NhdmVBc0NvcHkoZG9jdW1lbnQoKSwgdGhpcywgMCkpOworICBGUERGX0Nsb3NlUGFnZShwYWdlKTsKKworICBPcGVuU2F2ZWREb2N1bWVudCgpOworICBwYWdlID0gTG9hZFNhdmVkUGFnZSgwKTsKKyAgRlBERl9BTk5PVEFUSU9OIG5ld19hbm5vdCA9IEZQREZQYWdlX0dldEFubm90KHBhZ2UsIDApOworCisgIC8vIENoZWNrIHRoYXQgdGhlIG5ldyBhbm5vdGF0aW9uIHZhbHVlIGlzIGVxdWFsIHRvIHRoZSB2YWx1ZSB3ZSBzZXQgYmVmb3JlCisgIC8vIHNhdmluZy4KKyAgcm9sbG92ZXJfbGVuID0gRlBERkFubm90X0dldEFQKG5ld19hbm5vdCwgRlBERl9BTk5PVF9BUFBFQVJBTkNFTU9ERV9ST0xMT1ZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIDApOworICBFWFBFQ1RfRVEoMjR1LCByb2xsb3Zlcl9sZW4pOworICBidWYuY2xlYXIoKTsKKyAgYnVmLnJlc2l6ZShyb2xsb3Zlcl9sZW4pOworICBFWFBFQ1RfRVEoMjR1LCBGUERGQW5ub3RfR2V0QVAobmV3X2Fubm90LCBGUERGX0FOTk9UX0FQUEVBUkFOQ0VNT0RFX1JPTExPVkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmRhdGEoKSwgYnVmLnNpemUoKSkpOworICBFWFBFQ1RfU1RSRVEoTCJuZXcgdGVzdCBhcCIsIEJ1ZmZlclRvV1N0cmluZyhidWYpLmNfc3RyKCkpOworCisgIC8vIENsb3NlIHNhdmVkIGRvY3VtZW50LgorICBGUERGUGFnZV9DbG9zZUFubm90KG5ld19hbm5vdCk7CisgIENsb3NlU2F2ZWRQYWdlKHBhZ2UpOworICBDbG9zZVNhdmVkRG9jdW1lbnQoKTsKK30KKworVEVTVF9GKEZQREZBbm5vdEVtYmVkZGVydGVzdCwgUmVtb3ZlT3B0aW9uYWxBUCkgeworICAvLyBPcGVuIGEgZmlsZSB3aXRoIGZvdXIgYW5ub3RhdGlvbnMgYW5kIGxvYWQgaXRzIGZpcnN0IHBhZ2UuCisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiYW5ub3RhdGlvbl9zdGFtcF93aXRoX2FwLnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBGUERGX0xvYWRQYWdlKGRvY3VtZW50KCksIDApOworICBBU1NFUlRfVFJVRShwYWdlKTsKKworICAvLyBSZXRyaWV2ZSB0aGUgZmlyc3QgYW5ub3RhdGlvbi4KKyAgRlBERl9BTk5PVEFUSU9OIGFubm90ID0gRlBERlBhZ2VfR2V0QW5ub3QocGFnZSwgMCk7CisgIEFTU0VSVF9UUlVFKGFubm90KTsKKworICAvLyBTZXQgRG93biBBUC4gTm9ybWFsIEFQIGlzIGFscmVhZHkgc2V0LgorICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IGFwVGV4dCA9CisgICAgICBHZXRGUERGV2lkZVN0cmluZyhMIm5ldyB0ZXN0IGFwIik7CisgIEVYUEVDVF9UUlVFKAorICAgICAgRlBERkFubm90X1NldEFQKGFubm90LCBGUERGX0FOTk9UX0FQUEVBUkFOQ0VNT0RFX0RPV04sIGFwVGV4dC5nZXQoKSkpOworICBFWFBFQ1RfRVEoNzM5NzB1LCBGUERGQW5ub3RfR2V0QVAoYW5ub3QsIEZQREZfQU5OT1RfQVBQRUFSQU5DRU1PREVfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgMCkpOworICBFWFBFQ1RfRVEoMjR1LAorICAgICAgICAgICAgRlBERkFubm90X0dldEFQKGFubm90LCBGUERGX0FOTk9UX0FQUEVBUkFOQ0VNT0RFX0RPV04sIG51bGxwdHIsIDApKTsKKworICAvLyBDaGVjayB0aGF0IHNldHRpbmcgdGhlIERvd24gQVAgdG8gbnVsbCByZW1vdmVzIHRoZSBEb3duIGVudHJ5IGJ1dCBrZWVwcworICAvLyBOb3JtYWwgaW50YWN0LgorICBFWFBFQ1RfVFJVRShGUERGQW5ub3RfU2V0QVAoYW5ub3QsIEZQREZfQU5OT1RfQVBQRUFSQU5DRU1PREVfRE9XTiwgbnVsbHB0cikpOworICBFWFBFQ1RfRVEoNzM5NzB1LCBGUERGQW5ub3RfR2V0QVAoYW5ub3QsIEZQREZfQU5OT1RfQVBQRUFSQU5DRU1PREVfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgMCkpOworICBFWFBFQ1RfRVEoMnUsCisgICAgICAgICAgICBGUERGQW5ub3RfR2V0QVAoYW5ub3QsIEZQREZfQU5OT1RfQVBQRUFSQU5DRU1PREVfRE9XTiwgbnVsbHB0ciwgMCkpOworCisgIEZQREZQYWdlX0Nsb3NlQW5ub3QoYW5ub3QpOworICBGUERGX0Nsb3NlUGFnZShwYWdlKTsKK30KKworVEVTVF9GKEZQREZBbm5vdEVtYmVkZGVydGVzdCwgUmVtb3ZlUmVxdWlyZWRBUCkgeworICAvLyBPcGVuIGEgZmlsZSB3aXRoIGZvdXIgYW5ub3RhdGlvbnMgYW5kIGxvYWQgaXRzIGZpcnN0IHBhZ2UuCisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiYW5ub3RhdGlvbl9zdGFtcF93aXRoX2FwLnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBGUERGX0xvYWRQYWdlKGRvY3VtZW50KCksIDApOworICBBU1NFUlRfVFJVRShwYWdlKTsKKworICAvLyBSZXRyaWV2ZSB0aGUgZmlyc3QgYW5ub3RhdGlvbi4KKyAgRlBERl9BTk5PVEFUSU9OIGFubm90ID0gRlBERlBhZ2VfR2V0QW5ub3QocGFnZSwgMCk7CisgIEFTU0VSVF9UUlVFKGFubm90KTsKKworICAvLyBTZXQgRG93biBBUC4gTm9ybWFsIEFQIGlzIGFscmVhZHkgc2V0LgorICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IGFwVGV4dCA9CisgICAgICBHZXRGUERGV2lkZVN0cmluZyhMIm5ldyB0ZXN0IGFwIik7CisgIEVYUEVDVF9UUlVFKAorICAgICAgRlBERkFubm90X1NldEFQKGFubm90LCBGUERGX0FOTk9UX0FQUEVBUkFOQ0VNT0RFX0RPV04sIGFwVGV4dC5nZXQoKSkpOworICBFWFBFQ1RfRVEoNzM5NzB1LCBGUERGQW5ub3RfR2V0QVAoYW5ub3QsIEZQREZfQU5OT1RfQVBQRUFSQU5DRU1PREVfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgMCkpOworICBFWFBFQ1RfRVEoMjR1LAorICAgICAgICAgICAgRlBERkFubm90X0dldEFQKGFubm90LCBGUERGX0FOTk9UX0FQUEVBUkFOQ0VNT0RFX0RPV04sIG51bGxwdHIsIDApKTsKKworICAvLyBDaGVjayB0aGF0IHNldHRpbmcgdGhlIE5vcm1hbCBBUCB0byBudWxsIHJlbW92ZXMgdGhlIHdob2xlIEFQIGRpY3Rpb25hcnkuCisgIEVYUEVDVF9UUlVFKAorICAgICAgRlBERkFubm90X1NldEFQKGFubm90LCBGUERGX0FOTk9UX0FQUEVBUkFOQ0VNT0RFX05PUk1BTCwgbnVsbHB0cikpOworICBFWFBFQ1RfRVEoCisgICAgICAydSwgRlBERkFubm90X0dldEFQKGFubm90LCBGUERGX0FOTk9UX0FQUEVBUkFOQ0VNT0RFX05PUk1BTCwgbnVsbHB0ciwgMCkpOworICBFWFBFQ1RfRVEoMnUsCisgICAgICAgICAgICBGUERGQW5ub3RfR2V0QVAoYW5ub3QsIEZQREZfQU5OT1RfQVBQRUFSQU5DRU1PREVfRE9XTiwgbnVsbHB0ciwgMCkpOworCisgIEZQREZQYWdlX0Nsb3NlQW5ub3QoYW5ub3QpOworICBGUERGX0Nsb3NlUGFnZShwYWdlKTsKK30KKworVEVTVF9GKEZQREZBbm5vdEVtYmVkZGVydGVzdCwgRXh0cmFjdExpbmtlZEFubm90YXRpb25zKSB7CisgIC8vIE9wZW4gYSBmaWxlIHdpdGggYW5ub3RhdGlvbnMgYW5kIGxvYWQgaXRzIGZpcnN0IHBhZ2UuCisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiYW5ub3RhdGlvbl9oaWdobGlnaHRfc3F1YXJlX3dpdGhfYXAucGRmIikpOworICBGUERGX1BBR0UgcGFnZSA9IEZQREZfTG9hZFBhZ2UoZG9jdW1lbnQoKSwgMCk7CisgIEFTU0VSVF9UUlVFKHBhZ2UpOworICBFWFBFQ1RfRVEoLTEsIEZQREZQYWdlX0dldEFubm90SW5kZXgocGFnZSwgbnVsbHB0cikpOworCisgIC8vIFJldHJpZXZlIHRoZSBoaWdobGlnaHQgYW5ub3RhdGlvbiB3aGljaCBoYXMgaXRzIHBvcHVwIGRlZmluZWQuCisgIEZQREZfQU5OT1RBVElPTiBhbm5vdCA9IEZQREZQYWdlX0dldEFubm90KHBhZ2UsIDApOworICBBU1NFUlRfVFJVRShhbm5vdCk7CisgIEVYUEVDVF9FUShGUERGX0FOTk9UX0hJR0hMSUdIVCwgRlBERkFubm90X0dldFN1YnR5cGUoYW5ub3QpKTsKKyAgRVhQRUNUX0VRKDAsIEZQREZQYWdlX0dldEFubm90SW5kZXgocGFnZSwgYW5ub3QpKTsKKyAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtQb3B1cEtleVtdID0gIlBvcHVwIjsKKyAgQVNTRVJUX1RSVUUoRlBERkFubm90X0hhc0tleShhbm5vdCwga1BvcHVwS2V5KSk7CisgIEFTU0VSVF9FUShGUERGX09CSkVDVF9SRUZFUkVOQ0UsIEZQREZBbm5vdF9HZXRWYWx1ZVR5cGUoYW5ub3QsIGtQb3B1cEtleSkpOworCisgIC8vIFJldHJpZXZlIGFuZCB2ZXJpZnkgdGhlIHBvcHVwIG9mIHRoZSBoaWdobGlnaHQgYW5ub3RhdGlvbi4KKyAgRlBERl9BTk5PVEFUSU9OIHBvcHVwID0gRlBERkFubm90X0dldExpbmtlZEFubm90KGFubm90LCBrUG9wdXBLZXkpOworICBBU1NFUlRfVFJVRShwb3B1cCk7CisgIEVYUEVDVF9FUShGUERGX0FOTk9UX1BPUFVQLCBGUERGQW5ub3RfR2V0U3VidHlwZShwb3B1cCkpOworICBFWFBFQ1RfRVEoMSwgRlBERlBhZ2VfR2V0QW5ub3RJbmRleChwYWdlLCBwb3B1cCkpOworICBGU19SRUNURiByZWN0OworICBBU1NFUlRfVFJVRShGUERGQW5ub3RfR2V0UmVjdChwb3B1cCwgJnJlY3QpKTsKKyAgRVhQRUNUX05FQVIoNjEyLjBmLCByZWN0LmxlZnQsIDAuMDAxZik7CisgIEVYUEVDVF9ORUFSKDU3OC43OTIsIHJlY3QuYm90dG9tLCAwLjAwMWYpOworCisgIC8vIEF0dGVtcHRpbmcgdG8gcmV0cmlldmUgfGFubm90fCdzICJJUlQiLWxpbmtlZCBhbm5vdGF0aW9uIHdvdWxkIGZhaWwsIHNpbmNlCisgIC8vICJJUlQiIGlzIG5vdCBhIGtleSBpbiB8YW5ub3R8J3MgZGljdGlvbmFyeS4KKyAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtJUlRLZXlbXSA9ICJJUlQiOworICBBU1NFUlRfRkFMU0UoRlBERkFubm90X0hhc0tleShhbm5vdCwga0lSVEtleSkpOworICBFWFBFQ1RfRkFMU0UoRlBERkFubm90X0dldExpbmtlZEFubm90KGFubm90LCBrSVJUS2V5KSk7CisKKyAgLy8gQXR0ZW1wdGluZyB0byByZXRyaWV2ZSB8YW5ub3R8J3MgcGFyZW50IGRpY3Rpb25hcnkgYXMgYW4gYW5ub3RhdGlvbiB3b3VsZAorICAvLyBmYWlsLCBzaW5jZSBpdHMgcGFyZW50IGlzIG5vdCBhbiBhbm5vdGF0aW9uLgorICBzdGF0aWMgY29uc3RleHByIGNoYXIga1BLZXlbXSA9ICJQIjsKKyAgQVNTRVJUX1RSVUUoRlBERkFubm90X0hhc0tleShhbm5vdCwga1BLZXkpKTsKKyAgRVhQRUNUX0VRKEZQREZfT0JKRUNUX1JFRkVSRU5DRSwgRlBERkFubm90X0dldFZhbHVlVHlwZShhbm5vdCwga1BLZXkpKTsKKyAgRVhQRUNUX0ZBTFNFKEZQREZBbm5vdF9HZXRMaW5rZWRBbm5vdChhbm5vdCwga1BLZXkpKTsKKworICBGUERGUGFnZV9DbG9zZUFubm90KHBvcHVwKTsKKyAgRlBERlBhZ2VfQ2xvc2VBbm5vdChhbm5vdCk7CisgIFVubG9hZFBhZ2UocGFnZSk7Cit9CisKK1RFU1RfRihGUERGQW5ub3RFbWJlZGRlcnRlc3QsIEdldEZvcm1GaWVsZEZsYWdzVGV4dEZpZWxkKSB7CisgIC8vIE9wZW4gZmlsZSB3aXRoIGZvcm0gdGV4dCBmaWVsZHMuCisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgidGV4dF9mb3JtX211bHRpcGxlLnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBGUERGX0xvYWRQYWdlKGRvY3VtZW50KCksIDApOworICBBU1NFUlRfVFJVRShwYWdlKTsKKworICAvLyBSZXRyaWV2ZSB0aGUgZmlyc3QgYW5ub3RhdGlvbjogdXNlci1lZGl0YWJsZSB0ZXh0IGZpZWxkLgorICBGUERGX0FOTk9UQVRJT04gYW5ub3QgPSBGUERGUGFnZV9HZXRBbm5vdChwYWdlLCAwKTsKKyAgQVNTRVJUX1RSVUUoYW5ub3QpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIGZsYWcgdmFsdWVzIGFyZSBhcyBleHBlY3RlZC4KKyAgaW50IGZsYWdzID0gRlBERkFubm90X0dldEZvcm1GaWVsZEZsYWdzKHBhZ2UsIGFubm90KTsKKyAgRVhQRUNUX0ZBTFNFKGZsYWdzICYgRlBERl9GT1JNRkxBR19SRUFET05MWSk7CisgIEZQREZQYWdlX0Nsb3NlQW5ub3QoYW5ub3QpOworCisgIC8vIFJldHJpZXZlIHRoZSBzZWNvbmQgYW5ub3RhdGlvbjogcmVhZC1vbmx5IHRleHQgZmllbGQuCisgIGFubm90ID0gRlBERlBhZ2VfR2V0QW5ub3QocGFnZSwgMSk7CisgIEFTU0VSVF9UUlVFKGFubm90KTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBmbGFnIHZhbHVlcyBhcmUgYXMgZXhwZWN0ZWQuCisgIGZsYWdzID0gRlBERkFubm90X0dldEZvcm1GaWVsZEZsYWdzKHBhZ2UsIGFubm90KTsKKyAgRVhQRUNUX1RSVUUoZmxhZ3MgJiBGUERGX0ZPUk1GTEFHX1JFQURPTkxZKTsKKyAgRlBERlBhZ2VfQ2xvc2VBbm5vdChhbm5vdCk7CisKKyAgVW5sb2FkUGFnZShwYWdlKTsKK30KKworVEVTVF9GKEZQREZBbm5vdEVtYmVkZGVydGVzdCwgR2V0Rm9ybUZpZWxkRmxhZ3NDb21ib0JveCkgeworICAvLyBPcGVuIGZpbGUgd2l0aCBmb3JtIHRleHQgZmllbGRzLgorICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoImNvbWJvYm94X2Zvcm0ucGRmIikpOworICBGUERGX1BBR0UgcGFnZSA9IEZQREZfTG9hZFBhZ2UoZG9jdW1lbnQoKSwgMCk7CisgIEFTU0VSVF9UUlVFKHBhZ2UpOworCisgIC8vIFJldHJpZXZlIHRoZSBmaXJzdCBhbm5vdGF0aW9uOiB1c2VyLWVkaXRhYmxlIGNvbWJvYm94LgorICBGUERGX0FOTk9UQVRJT04gYW5ub3QgPSBGUERGUGFnZV9HZXRBbm5vdChwYWdlLCAwKTsKKyAgQVNTRVJUX1RSVUUoYW5ub3QpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIGZsYWcgdmFsdWVzIGFyZSBhcyBleHBlY3RlZC4KKyAgaW50IGZsYWdzID0gRlBERkFubm90X0dldEZvcm1GaWVsZEZsYWdzKHBhZ2UsIGFubm90KTsKKyAgRVhQRUNUX0ZBTFNFKGZsYWdzICYgRlBERl9GT1JNRkxBR19SRUFET05MWSk7CisgIEVYUEVDVF9UUlVFKGZsYWdzICYgRlBERl9GT1JNRkxBR19DSE9JQ0VfQ09NQk8pOworICBFWFBFQ1RfVFJVRShmbGFncyAmIEZQREZfRk9STUZMQUdfQ0hPSUNFX0VESVQpOworICBGUERGUGFnZV9DbG9zZUFubm90KGFubm90KTsKKworICAvLyBSZXRyaWV2ZSB0aGUgc2Vjb25kIGFubm90YXRpb246IHJlZ3VsYXIgY29tYm9ib3guCisgIGFubm90ID0gRlBERlBhZ2VfR2V0QW5ub3QocGFnZSwgMSk7CisgIEFTU0VSVF9UUlVFKGFubm90KTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBmbGFnIHZhbHVlcyBhcmUgYXMgZXhwZWN0ZWQuCisgIGZsYWdzID0gRlBERkFubm90X0dldEZvcm1GaWVsZEZsYWdzKHBhZ2UsIGFubm90KTsKKyAgRVhQRUNUX0ZBTFNFKGZsYWdzICYgRlBERl9GT1JNRkxBR19SRUFET05MWSk7CisgIEVYUEVDVF9UUlVFKGZsYWdzICYgRlBERl9GT1JNRkxBR19DSE9JQ0VfQ09NQk8pOworICBFWFBFQ1RfRkFMU0UoZmxhZ3MgJiBGUERGX0ZPUk1GTEFHX0NIT0lDRV9FRElUKTsKKyAgRlBERlBhZ2VfQ2xvc2VBbm5vdChhbm5vdCk7CisKKyAgLy8gUmV0cmlldmUgdGhlIHRoaXJkIGFubm90YXRpb246IHJlYWQtb25seSBjb21ib2JveC4KKyAgYW5ub3QgPSBGUERGUGFnZV9HZXRBbm5vdChwYWdlLCAyKTsKKyAgQVNTRVJUX1RSVUUoYW5ub3QpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIGZsYWcgdmFsdWVzIGFyZSBhcyBleHBlY3RlZC4KKyAgZmxhZ3MgPSBGUERGQW5ub3RfR2V0Rm9ybUZpZWxkRmxhZ3MocGFnZSwgYW5ub3QpOworICBFWFBFQ1RfVFJVRShmbGFncyAmIEZQREZfRk9STUZMQUdfUkVBRE9OTFkpOworICBFWFBFQ1RfVFJVRShmbGFncyAmIEZQREZfRk9STUZMQUdfQ0hPSUNFX0NPTUJPKTsKKyAgRVhQRUNUX0ZBTFNFKGZsYWdzICYgRlBERl9GT1JNRkxBR19DSE9JQ0VfRURJVCk7CisgIEZQREZQYWdlX0Nsb3NlQW5ub3QoYW5ub3QpOworCisgIFVubG9hZFBhZ2UocGFnZSk7Cit9CisKK1RFU1RfRihGUERGQW5ub3RFbWJlZGRlcnRlc3QsIEdldEZvcm1Bbm5vdE51bGwpIHsKKyAgLy8gT3BlbiBmaWxlIHdpdGggZm9ybSB0ZXh0IGZpZWxkcy4KKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJ0ZXh0X2Zvcm0ucGRmIikpOworICBGUERGX1BBR0UgcGFnZSA9IExvYWRQYWdlKDApOworICBBU1NFUlRfVFJVRShwYWdlKTsKKworICAvLyBBdHRlbXB0IHRvIGdldCBhbiBhbm5vdGF0aW9uIHdoZXJlIG5vIGFubm90YXRpb24gZXhpc3RzIG9uIHBhZ2UuCisgIEZQREZfQU5OT1RBVElPTiBhbm5vdCA9CisgICAgICBGUERGQW5ub3RfR2V0Rm9ybUZpZWxkQXRQb2ludChmb3JtX2hhbmRsZSgpLCBwYWdlLCAwLCAwKTsKKyAgRVhQRUNUX0ZBTFNFKGFubm90KTsKKworICBVbmxvYWRQYWdlKHBhZ2UpOworfQorCitURVNUX0YoRlBERkFubm90RW1iZWRkZXJ0ZXN0LCBHZXRGb3JtQW5ub3RBbmRDaGVja0ZsYWdzVGV4dEZpZWxkKSB7CisgIC8vIE9wZW4gZmlsZSB3aXRoIGZvcm0gdGV4dCBmaWVsZHMuCisgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgidGV4dF9mb3JtX211bHRpcGxlLnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkUGFnZSgwKTsKKyAgQVNTRVJUX1RSVUUocGFnZSk7CisKKyAgLy8gUmV0cmlldmUgdXNlci1lZGl0YWJsZSB0ZXh0IGZpZWxkIGFubm90YXRpb24uCisgIEZQREZfQU5OT1RBVElPTiBhbm5vdCA9CisgICAgICBGUERGQW5ub3RfR2V0Rm9ybUZpZWxkQXRQb2ludChmb3JtX2hhbmRsZSgpLCBwYWdlLCAxMDUsIDExOCk7CisgIEFTU0VSVF9UUlVFKGFubm90KTsKKworICAvLyBDaGVjayB0aGF0IGludGVyYWN0aXZlIGZvcm0gYW5ub3RhdGlvbiBmbGFnIHZhbHVlcyBhcmUgYXMgZXhwZWN0ZWQuCisgIGludCBmbGFncyA9IEZQREZBbm5vdF9HZXRGb3JtRmllbGRGbGFncyhwYWdlLCBhbm5vdCk7CisgIEVYUEVDVF9GQUxTRShmbGFncyAmIEZQREZfRk9STUZMQUdfUkVBRE9OTFkpOworICBGUERGUGFnZV9DbG9zZUFubm90KGFubm90KTsKKworICAvLyBSZXRyaWV2ZSByZWFkLW9ubHkgdGV4dCBmaWVsZCBhbm5vdGF0aW9uLgorICBhbm5vdCA9IEZQREZBbm5vdF9HZXRGb3JtRmllbGRBdFBvaW50KGZvcm1faGFuZGxlKCksIHBhZ2UsIDEwNSwgMjAyKTsKKyAgQVNTRVJUX1RSVUUoYW5ub3QpOworCisgIC8vIENoZWNrIHRoYXQgaW50ZXJhY3RpdmUgZm9ybSBhbm5vdGF0aW9uIGZsYWcgdmFsdWVzIGFyZSBhcyBleHBlY3RlZC4KKyAgZmxhZ3MgPSBGUERGQW5ub3RfR2V0Rm9ybUZpZWxkRmxhZ3MocGFnZSwgYW5ub3QpOworICBFWFBFQ1RfVFJVRShmbGFncyAmIEZQREZfRk9STUZMQUdfUkVBRE9OTFkpOworICBGUERGUGFnZV9DbG9zZUFubm90KGFubm90KTsKKworICBVbmxvYWRQYWdlKHBhZ2UpOworfQorCitURVNUX0YoRlBERkFubm90RW1iZWRkZXJ0ZXN0LCBHZXRGb3JtQW5ub3RBbmRDaGVja0ZsYWdzQ29tYm9Cb3gpIHsKKyAgLy8gT3BlbiBmaWxlIHdpdGggZm9ybSBjb21ib2JveGVzLgorICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoImNvbWJvYm94X2Zvcm0ucGRmIikpOworICBGUERGX1BBR0UgcGFnZSA9IExvYWRQYWdlKDApOworICBBU1NFUlRfVFJVRShwYWdlKTsKKworICAvLyBSZXRyaWV2ZSB1c2VyLWVkaXRhYmxlIGNvbWJvYm94IGFubm90YXRpb24uCisgIEZQREZfQU5OT1RBVElPTiBhbm5vdCA9CisgICAgICBGUERGQW5ub3RfR2V0Rm9ybUZpZWxkQXRQb2ludChmb3JtX2hhbmRsZSgpLCBwYWdlLCAxMDIsIDYzKTsKKyAgQVNTRVJUX1RSVUUoYW5ub3QpOworCisgIC8vIENoZWNrIHRoYXQgaW50ZXJhY3RpdmUgZm9ybSBhbm5vdGF0aW9uIGZsYWcgdmFsdWVzIGFyZSBhcyBleHBlY3RlZC4KKyAgaW50IGZsYWdzID0gRlBERkFubm90X0dldEZvcm1GaWVsZEZsYWdzKHBhZ2UsIGFubm90KTsKKyAgRVhQRUNUX0ZBTFNFKGZsYWdzICYgRlBERl9GT1JNRkxBR19SRUFET05MWSk7CisgIEVYUEVDVF9UUlVFKGZsYWdzICYgRlBERl9GT1JNRkxBR19DSE9JQ0VfQ09NQk8pOworICBFWFBFQ1RfVFJVRShmbGFncyAmIEZQREZfRk9STUZMQUdfQ0hPSUNFX0VESVQpOworICBGUERGUGFnZV9DbG9zZUFubm90KGFubm90KTsKKworICAvLyBSZXRyaWV2ZSByZWd1bGFyIGNvbWJvYm94IGFubm90YXRpb24uCisgIGFubm90ID0gRlBERkFubm90X0dldEZvcm1GaWVsZEF0UG9pbnQoZm9ybV9oYW5kbGUoKSwgcGFnZSwgMTAyLCAxMTMpOworICBBU1NFUlRfVFJVRShhbm5vdCk7CisKKyAgLy8gQ2hlY2sgdGhhdCBpbnRlcmFjdGl2ZSBmb3JtIGFubm90YXRpb24gZmxhZyB2YWx1ZXMgYXJlIGFzIGV4cGVjdGVkLgorICBmbGFncyA9IEZQREZBbm5vdF9HZXRGb3JtRmllbGRGbGFncyhwYWdlLCBhbm5vdCk7CisgIEVYUEVDVF9GQUxTRShmbGFncyAmIEZQREZfRk9STUZMQUdfUkVBRE9OTFkpOworICBFWFBFQ1RfVFJVRShmbGFncyAmIEZQREZfRk9STUZMQUdfQ0hPSUNFX0NPTUJPKTsKKyAgRVhQRUNUX0ZBTFNFKGZsYWdzICYgRlBERl9GT1JNRkxBR19DSE9JQ0VfRURJVCk7CisgIEZQREZQYWdlX0Nsb3NlQW5ub3QoYW5ub3QpOworCisgIC8vIFJldHJpZXZlIHJlYWQtb25seSBjb21ib2JveCBhbm5vdGF0aW9uLgorICBhbm5vdCA9IEZQREZBbm5vdF9HZXRGb3JtRmllbGRBdFBvaW50KGZvcm1faGFuZGxlKCksIHBhZ2UsIDEwMiwgMjEzKTsKKyAgQVNTRVJUX1RSVUUoYW5ub3QpOworCisgIC8vIENoZWNrIHRoYXQgaW50ZXJhY3RpdmUgZm9ybSBhbm5vdGF0aW9uIGZsYWcgdmFsdWVzIGFyZSBhcyBleHBlY3RlZC4KKyAgZmxhZ3MgPSBGUERGQW5ub3RfR2V0Rm9ybUZpZWxkRmxhZ3MocGFnZSwgYW5ub3QpOworICBFWFBFQ1RfVFJVRShmbGFncyAmIEZQREZfRk9STUZMQUdfUkVBRE9OTFkpOworICBFWFBFQ1RfVFJVRShmbGFncyAmIEZQREZfRk9STUZMQUdfQ0hPSUNFX0NPTUJPKTsKKyAgRVhQRUNUX0ZBTFNFKGZsYWdzICYgRlBERl9GT1JNRkxBR19DSE9JQ0VfRURJVCk7CisgIEZQREZQYWdlX0Nsb3NlQW5ub3QoYW5ub3QpOworCisgIFVubG9hZFBhZ2UocGFnZSk7Cit9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZhdHRhY2htZW50LmNwcCBiL2ZwZGZzZGsvZnBkZmF0dGFjaG1lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViODM1MzQKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL2ZwZGZhdHRhY2htZW50LmNwcApAQCAtMCwwICsxLDI3MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAicHVibGljL2ZwZGZfYXR0YWNobWVudC5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RvY3VtZW50LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX25hbWUuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbnVtYmVyLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3JlZmVyZW5jZS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2ZpbGVzcGVjLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfbmFtZXRyZWUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9kYXRldGltZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAiZnBkZnNkay9mc2RrX2RlZmluZS5oIgorCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBrQ2hlY2tzdW1LZXlbXSA9ICJDaGVja1N1bSI7CisKK0J5dGVTdHJpbmcgQ0ZYQnl0ZVN0cmluZ0hleERlY29kZShjb25zdCBCeXRlU3RyaW5nJiBic0hleCkgeworICB1aW50OF90KiByZXN1bHQgPSBudWxscHRyOworICB1aW50MzJfdCBzaXplID0gMDsKKyAgSGV4RGVjb2RlKGJzSGV4LnJhd19zdHIoKSwgYnNIZXguR2V0TGVuZ3RoKCksICZyZXN1bHQsICZzaXplKTsKKyAgQnl0ZVN0cmluZyBic0RlY29kZWQocmVzdWx0LCBzaXplKTsKKyAgRlhfRnJlZShyZXN1bHQpOworICByZXR1cm4gYnNEZWNvZGVkOworfQorCitCeXRlU3RyaW5nIEdlbmVyYXRlTUQ1QmFzZTE2KGNvbnN0IHZvaWQqIGNvbnRlbnRzLCBjb25zdCB1bnNpZ25lZCBsb25nIGxlbikgeworICB1aW50OF90IGRpZ2VzdFsxNl07CisgIENSWVBUX01ENUdlbmVyYXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGNvbnRlbnRzKSwgbGVuLCBkaWdlc3QpOworICBjaGFyIGJ1ZlszMl07CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSkKKyAgICBGWFNZU19JbnRUb1R3b0hleENoYXJzKGRpZ2VzdFtpXSwgJmJ1ZltpICogMl0pOworCisgIHJldHVybiBCeXRlU3RyaW5nKGJ1ZiwgMzIpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYKK0ZQREZEb2NfR2V0QXR0YWNobWVudENvdW50KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpIHsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOworICBpZiAoIXBEb2MpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIENQREZfTmFtZVRyZWUocERvYywgIkVtYmVkZGVkRmlsZXMiKS5HZXRDb3VudCgpOworfQorCitGUERGX0VYUE9SVCBGUERGX0FUVEFDSE1FTlQgRlBERl9DQUxMQ09OVgorRlBERkRvY19BZGRBdHRhY2htZW50KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lERVNUUklORyBuYW1lKSB7CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBDUERGRG9jdW1lbnRGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKKyAgV2lkZVN0cmluZyB3c05hbWUgPQorICAgICAgV2lkZVN0cmluZzo6RnJvbVVURjE2TEUobmFtZSwgV2lkZVN0cmluZzo6V1N0cmluZ0xlbmd0aChuYW1lKSk7CisgIGlmICghcERvYyB8fCB3c05hbWUuSXNFbXB0eSgpKQorICAgIHJldHVybiBudWxscHRyOworCisgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBwRG9jLT5HZXRSb290KCk7CisgIGlmICghcFJvb3QpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgLy8gUmV0cmlldmUgdGhlIGRvY3VtZW50J3MgTmFtZXMgZGljdGlvbmFyeTsgY3JlYXRlIGl0IGlmIG1pc3NpbmcuCisgIENQREZfRGljdGlvbmFyeSogcE5hbWVzID0gcFJvb3QtPkdldERpY3RGb3IoIk5hbWVzIik7CisgIGlmICghcE5hbWVzKSB7CisgICAgcE5hbWVzID0gcERvYy0+TmV3SW5kaXJlY3Q8Q1BERl9EaWN0aW9uYXJ5PigpOworICAgIHBSb290LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJOYW1lcyIsIHBEb2MsIHBOYW1lcy0+R2V0T2JqTnVtKCkpOworICB9CisKKyAgLy8gQ3JlYXRlIHRoZSBFbWJlZGRlZEZpbGVzIGRpY3Rpb25hcnkgaWYgbWlzc2luZy4KKyAgaWYgKCFwTmFtZXMtPkdldERpY3RGb3IoIkVtYmVkZGVkRmlsZXMiKSkgeworICAgIENQREZfRGljdGlvbmFyeSogcEZpbGVzID0gcERvYy0+TmV3SW5kaXJlY3Q8Q1BERl9EaWN0aW9uYXJ5PigpOworICAgIHBGaWxlcy0+U2V0TmV3Rm9yPENQREZfQXJyYXk+KCJOYW1lcyIpOworICAgIHBOYW1lcy0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiRW1iZWRkZWRGaWxlcyIsIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGaWxlcy0+R2V0T2JqTnVtKCkpOworICB9CisKKyAgLy8gU2V0IHVwIHRoZSBiYXNpYyBlbnRyaWVzIGluIHRoZSBmaWxlc3BlYyBkaWN0aW9uYXJ5LgorICBDUERGX0RpY3Rpb25hcnkqIHBGaWxlID0gcERvYy0+TmV3SW5kaXJlY3Q8Q1BERl9EaWN0aW9uYXJ5PigpOworICBwRmlsZS0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIlR5cGUiLCAiRmlsZXNwZWMiKTsKKyAgcEZpbGUtPlNldE5ld0ZvcjxDUERGX1N0cmluZz4oIlVGIiwgd3NOYW1lKTsKKyAgcEZpbGUtPlNldE5ld0ZvcjxDUERGX1N0cmluZz4oIkYiLCB3c05hbWUpOworCisgIC8vIEFkZCB0aGUgbmV3IGF0dGFjaG1lbnQgbmFtZSBhbmQgZmlsZXNwZWMgaW50byB0aGUgZG9jdW1lbnQncyBFbWJlZGRlZEZpbGVzLgorICBDUERGX05hbWVUcmVlIG5hbWVUcmVlKHBEb2MsICJFbWJlZGRlZEZpbGVzIik7CisgIGlmICghbmFtZVRyZWUuQWRkVmFsdWVBbmROYW1lKAorICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1JlZmVyZW5jZT4ocERvYywgcEZpbGUtPkdldE9iak51bSgpKSwKKyAgICAgICAgICB3c05hbWUpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICByZXR1cm4gcEZpbGU7Cit9CisKK0ZQREZfRVhQT1JUIEZQREZfQVRUQUNITUVOVCBGUERGX0NBTExDT05WCitGUERGRG9jX0dldEF0dGFjaG1lbnQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgaW50IGluZGV4KSB7CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBDUERGRG9jdW1lbnRGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKKyAgaWYgKCFwRG9jIHx8IGluZGV4IDwgMCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBDUERGX05hbWVUcmVlIG5hbWVUcmVlKHBEb2MsICJFbWJlZGRlZEZpbGVzIik7CisgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KGluZGV4KSA+PSBuYW1lVHJlZS5HZXRDb3VudCgpKQorICAgIHJldHVybiBudWxscHRyOworCisgIFdpZGVTdHJpbmcgY3NOYW1lOworICByZXR1cm4gbmFtZVRyZWUuTG9va3VwVmFsdWVBbmROYW1lKGluZGV4LCAmY3NOYW1lKTsKK30KKworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZEb2NfRGVsZXRlQXR0YWNobWVudChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBpbnQgaW5kZXgpIHsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOworICBpZiAoIXBEb2MgfHwgaW5kZXggPCAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBDUERGX05hbWVUcmVlIG5hbWVUcmVlKHBEb2MsICJFbWJlZGRlZEZpbGVzIik7CisgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KGluZGV4KSA+PSBuYW1lVHJlZS5HZXRDb3VudCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gbmFtZVRyZWUuRGVsZXRlVmFsdWVBbmROYW1lKGluZGV4KTsKK30KKworRlBERl9FWFBPUlQgdW5zaWduZWQgbG9uZyBGUERGX0NBTExDT05WCitGUERGQXR0YWNobWVudF9HZXROYW1lKEZQREZfQVRUQUNITUVOVCBhdHRhY2htZW50LAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmbGVuKSB7CisgIENQREZfT2JqZWN0KiBwRmlsZSA9IENQREZPYmplY3RGcm9tRlBERkF0dGFjaG1lbnQoYXR0YWNobWVudCk7CisgIGlmICghcEZpbGUpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIFV0ZjE2RW5jb2RlTWF5YmVDb3B5QW5kUmV0dXJuTGVuZ3RoKENQREZfRmlsZVNwZWMocEZpbGUpLkdldEZpbGVOYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGJ1Zmxlbik7Cit9CisKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCitGUERGQXR0YWNobWVudF9IYXNLZXkoRlBERl9BVFRBQ0hNRU5UIGF0dGFjaG1lbnQsIEZQREZfQllURVNUUklORyBrZXkpIHsKKyAgQ1BERl9PYmplY3QqIHBGaWxlID0gQ1BERk9iamVjdEZyb21GUERGQXR0YWNobWVudChhdHRhY2htZW50KTsKKyAgaWYgKCFwRmlsZSkKKyAgICByZXR1cm4gMDsKKworICBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXNEaWN0ID0gQ1BERl9GaWxlU3BlYyhwRmlsZSkuR2V0UGFyYW1zRGljdCgpOworICByZXR1cm4gcFBhcmFtc0RpY3QgPyBwUGFyYW1zRGljdC0+S2V5RXhpc3Qoa2V5KSA6IDA7Cit9CisKK0ZQREZfRVhQT1JUIEZQREZfT0JKRUNUX1RZUEUgRlBERl9DQUxMQ09OVgorRlBERkF0dGFjaG1lbnRfR2V0VmFsdWVUeXBlKEZQREZfQVRUQUNITUVOVCBhdHRhY2htZW50LCBGUERGX0JZVEVTVFJJTkcga2V5KSB7CisgIGlmICghRlBERkF0dGFjaG1lbnRfSGFzS2V5KGF0dGFjaG1lbnQsIGtleSkpCisgICAgcmV0dXJuIEZQREZfT0JKRUNUX1VOS05PV047CisKKyAgQ1BERl9GaWxlU3BlYyBzcGVjKENQREZPYmplY3RGcm9tRlBERkF0dGFjaG1lbnQoYXR0YWNobWVudCkpOworICBDUERGX09iamVjdCogcE9iaiA9IHNwZWMuR2V0UGFyYW1zRGljdCgpLT5HZXRPYmplY3RGb3Ioa2V5KTsKKyAgcmV0dXJuIHBPYmogPyBwT2JqLT5HZXRUeXBlKCkgOiBGUERGX09CSkVDVF9VTktOT1dOOworfQorCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgorRlBERkF0dGFjaG1lbnRfU2V0U3RyaW5nVmFsdWUoRlBERl9BVFRBQ0hNRU5UIGF0dGFjaG1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHZhbHVlKSB7CisgIENQREZfT2JqZWN0KiBwRmlsZSA9IENQREZPYmplY3RGcm9tRlBERkF0dGFjaG1lbnQoYXR0YWNobWVudCk7CisgIGlmICghcEZpbGUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENQREZfRGljdGlvbmFyeSogcFBhcmFtc0RpY3QgPSBDUERGX0ZpbGVTcGVjKHBGaWxlKS5HZXRQYXJhbXNEaWN0KCk7CisgIGlmICghcFBhcmFtc0RpY3QpCisgICAgcmV0dXJuIGZhbHNlOworCisgIEJ5dGVTdHJpbmcgYnNLZXkgPSBrZXk7CisgIEJ5dGVTdHJpbmcgYnNWYWx1ZSA9IENGWEJ5dGVTdHJpbmdGcm9tRlBERldpZGVTdHJpbmcodmFsdWUpOworICBib29sIGJFbmNvZGVkQXNIZXggPSBic0tleSA9PSBrQ2hlY2tzdW1LZXk7CisgIGlmIChiRW5jb2RlZEFzSGV4KQorICAgIGJzVmFsdWUgPSBDRlhCeXRlU3RyaW5nSGV4RGVjb2RlKGJzVmFsdWUpOworCisgIHBQYXJhbXNEaWN0LT5TZXROZXdGb3I8Q1BERl9TdHJpbmc+KGJzS2V5LCBic1ZhbHVlLCBiRW5jb2RlZEFzSGV4KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ZQREZfRVhQT1JUIHVuc2lnbmVkIGxvbmcgRlBERl9DQUxMQ09OVgorRlBERkF0dGFjaG1lbnRfR2V0U3RyaW5nVmFsdWUoRlBERl9BVFRBQ0hNRU5UIGF0dGFjaG1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZsZW4pIHsKKyAgQ1BERl9PYmplY3QqIHBGaWxlID0gQ1BERk9iamVjdEZyb21GUERGQXR0YWNobWVudChhdHRhY2htZW50KTsKKyAgaWYgKCFwRmlsZSkKKyAgICByZXR1cm4gMDsKKworICBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXNEaWN0ID0gQ1BERl9GaWxlU3BlYyhwRmlsZSkuR2V0UGFyYW1zRGljdCgpOworICBpZiAoIXBQYXJhbXNEaWN0KQorICAgIHJldHVybiAwOworCisgIEJ5dGVTdHJpbmcgYnNLZXkgPSBrZXk7CisgIFdpZGVTdHJpbmcgdmFsdWUgPSBwUGFyYW1zRGljdC0+R2V0VW5pY29kZVRleHRGb3IoYnNLZXkpOworICBpZiAoYnNLZXkgPT0ga0NoZWNrc3VtS2V5ICYmICF2YWx1ZS5Jc0VtcHR5KCkpIHsKKyAgICBDUERGX1N0cmluZyogc3RyaW5nVmFsdWUgPSBwUGFyYW1zRGljdC0+R2V0T2JqZWN0Rm9yKGJzS2V5KS0+QXNTdHJpbmcoKTsKKyAgICBpZiAoc3RyaW5nVmFsdWUtPklzSGV4KCkpIHsKKyAgICAgIEJ5dGVTdHJpbmcgZW5jb2RlZCA9IFBERl9FbmNvZGVTdHJpbmcoc3RyaW5nVmFsdWUtPkdldFN0cmluZygpLCB0cnVlKTsKKyAgICAgIHZhbHVlID0gQ1BERl9TdHJpbmcobnVsbHB0ciwgZW5jb2RlZCwgZmFsc2UpLkdldFVuaWNvZGVUZXh0KCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIFV0ZjE2RW5jb2RlTWF5YmVDb3B5QW5kUmV0dXJuTGVuZ3RoKHZhbHVlLCBidWZmZXIsIGJ1Zmxlbik7Cit9CisKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCitGUERGQXR0YWNobWVudF9TZXRGaWxlKEZQREZfQVRUQUNITUVOVCBhdHRhY2htZW50LAorICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyBsZW4pIHsKKyAgQ1BERl9PYmplY3QqIHBGaWxlID0gQ1BERk9iamVjdEZyb21GUERGQXR0YWNobWVudChhdHRhY2htZW50KTsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOworICBpZiAoIXBGaWxlIHx8ICFwRmlsZS0+SXNEaWN0aW9uYXJ5KCkgfHwgIXBEb2MgfHwgbGVuID4gSU5UX01BWCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gQW4gZW1wdHkgY29udGVudCBtdXN0IGhhdmUgYSB6ZXJvIGxlbmd0aC4KKyAgaWYgKCFjb250ZW50cyAmJiBsZW4gIT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gQ3JlYXRlIGEgZGljdGlvbmFyeSBmb3IgdGhlIG5ldyBlbWJlZGRlZCBmaWxlIHN0cmVhbS4KKyAgYXV0byBwRmlsZVN0cmVhbURpY3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9EaWN0aW9uYXJ5PigpOworICBDUERGX0RpY3Rpb25hcnkqIHBQYXJhbXNEaWN0ID0KKyAgICAgIHBGaWxlU3RyZWFtRGljdC0+U2V0TmV3Rm9yPENQREZfRGljdGlvbmFyeT4oIlBhcmFtcyIpOworCisgIC8vIFNldCB0aGUgc2l6ZSBvZiB0aGUgbmV3IGZpbGUgaW4gdGhlIGRpY3Rpb25hcnkuCisgIHBGaWxlU3RyZWFtRGljdC0+U2V0TmV3Rm9yPENQREZfTnVtYmVyPigiREwiLCBzdGF0aWNfY2FzdDxpbnQ+KGxlbikpOworICBwUGFyYW1zRGljdC0+U2V0TmV3Rm9yPENQREZfTnVtYmVyPigiU2l6ZSIsIHN0YXRpY19jYXN0PGludD4obGVuKSk7CisKKyAgLy8gU2V0IHRoZSBjcmVhdGlvbiBkYXRlIG9mIHRoZSBuZXcgYXR0YWNobWVudCBpbiB0aGUgZGljdGlvbmFyeS4KKyAgQ0ZYX0RhdGVUaW1lIGRhdGVUaW1lID0gQ0ZYX0RhdGVUaW1lOjpOb3coKTsKKyAgcFBhcmFtc0RpY3QtPlNldE5ld0ZvcjxDUERGX1N0cmluZz4oCisgICAgICAiQ3JlYXRpb25EYXRlIiwKKyAgICAgIEJ5dGVTdHJpbmc6OkZvcm1hdCgiRDolZCUwMmQlMDJkJTAyZCUwMmQlMDJkIiwgZGF0ZVRpbWUuR2V0WWVhcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVUaW1lLkdldE1vbnRoKCksIGRhdGVUaW1lLkdldERheSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGVUaW1lLkdldEhvdXIoKSwgZGF0ZVRpbWUuR2V0TWludXRlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZVRpbWUuR2V0U2Vjb25kKCkpLAorICAgICAgZmFsc2UpOworCisgIC8vIFNldCB0aGUgY2hlY2tzdW0gb2YgdGhlIG5ldyBhdHRhY2htZW50IGluIHRoZSBkaWN0aW9uYXJ5LgorICBwUGFyYW1zRGljdC0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigKKyAgICAgIGtDaGVja3N1bUtleSwgQ0ZYQnl0ZVN0cmluZ0hleERlY29kZShHZW5lcmF0ZU1ENUJhc2UxNihjb250ZW50cywgbGVuKSksCisgICAgICB0cnVlKTsKKworICAvLyBDcmVhdGUgdGhlIGZpbGUgc3RyZWFtIGFuZCBoYXZlIHRoZSBmaWxlc3BlYyBkaWN0aW9uYXJ5IGxpbmsgdG8gaXQuCisgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90LCBGeEZyZWVEZWxldGVyPiBzdHJlYW0oRlhfQWxsb2ModWludDhfdCwgbGVuKSk7CisgIG1lbWNweShzdHJlYW0uZ2V0KCksIGNvbnRlbnRzLCBsZW4pOworICBDUERGX1N0cmVhbSogcEZpbGVTdHJlYW0gPSBwRG9jLT5OZXdJbmRpcmVjdDxDUERGX1N0cmVhbT4oCisgICAgICBzdGQ6Om1vdmUoc3RyZWFtKSwgbGVuLCBzdGQ6Om1vdmUocEZpbGVTdHJlYW1EaWN0KSk7CisgIENQREZfRGljdGlvbmFyeSogcEVGRGljdCA9CisgICAgICBwRmlsZS0+QXNEaWN0aW9uYXJ5KCktPlNldE5ld0ZvcjxDUERGX0RpY3Rpb25hcnk+KCJFRiIpOworICBwRUZEaWN0LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJGIiwgcERvYywgcEZpbGVTdHJlYW0tPkdldE9iak51bSgpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ZQREZfRVhQT1JUIHVuc2lnbmVkIGxvbmcgRlBERl9DQUxMQ09OVgorRlBERkF0dGFjaG1lbnRfR2V0RmlsZShGUERGX0FUVEFDSE1FTlQgYXR0YWNobWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1ZmxlbikgeworICBDUERGX09iamVjdCogcEZpbGUgPSBDUERGT2JqZWN0RnJvbUZQREZBdHRhY2htZW50KGF0dGFjaG1lbnQpOworICBpZiAoIXBGaWxlKQorICAgIHJldHVybiAwOworCisgIENQREZfU3RyZWFtKiBwRmlsZVN0cmVhbSA9IENQREZfRmlsZVNwZWMocEZpbGUpLkdldEZpbGVTdHJlYW0oKTsKKyAgaWYgKCFwRmlsZVN0cmVhbSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gRGVjb2RlU3RyZWFtTWF5YmVDb3B5QW5kUmV0dXJuTGVuZ3RoKHBGaWxlU3RyZWFtLCBidWZmZXIsIGJ1Zmxlbik7Cit9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZhdHRhY2htZW50X2VtYmVkZGVydGVzdC5jcHAgYi9mcGRmc2RrL2ZwZGZhdHRhY2htZW50X2VtYmVkZGVydGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ5YjVhZQotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvZnBkZmF0dGFjaG1lbnRfZW1iZWRkZXJ0ZXN0LmNwcApAQCAtMCwwICsxLDI2MCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9hdHRhY2htZW50LmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCisjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCisKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBrRGF0ZUtleVtdID0gIkNyZWF0aW9uRGF0ZSI7CitzdGF0aWMgY29uc3RleHByIGNoYXIga0NoZWNrc3VtS2V5W10gPSAiQ2hlY2tTdW0iOworCitjbGFzcyBGUERGQXR0YWNobWVudEVtYmVkZGVydGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3Qge307CisKK1RFU1RfRihGUERGQXR0YWNobWVudEVtYmVkZGVydGVzdCwgRXh0cmFjdEF0dGFjaG1lbnRzKSB7CisgIC8vIE9wZW4gYSBmaWxlIHdpdGggdHdvIGF0dGFjaG1lbnRzLgorICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoImVtYmVkZGVkX2F0dGFjaG1lbnRzLnBkZiIpKTsKKyAgRVhQRUNUX0VRKDIsIEZQREZEb2NfR2V0QXR0YWNobWVudENvdW50KGRvY3VtZW50KCkpKTsKKworICAvLyBSZXRyaWV2ZSB0aGUgZmlyc3QgYXR0YWNobWVudC4KKyAgRlBERl9BVFRBQ0hNRU5UIGF0dGFjaG1lbnQgPSBGUERGRG9jX0dldEF0dGFjaG1lbnQoZG9jdW1lbnQoKSwgMCk7CisgIEFTU0VSVF9UUlVFKGF0dGFjaG1lbnQpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGZpcnN0IGF0dGFjaG1lbnQgaXMgY29ycmVjdC4KKyAgdW5zaWduZWQgbG9uZyBsZW4gPSBGUERGQXR0YWNobWVudF9HZXROYW1lKGF0dGFjaG1lbnQsIG51bGxwdHIsIDApOworICBzdGQ6OnZlY3RvcjxjaGFyPiBidWYobGVuKTsKKyAgRVhQRUNUX0VRKDEydSwgRlBERkF0dGFjaG1lbnRfR2V0TmFtZShhdHRhY2htZW50LCBidWYuZGF0YSgpLCBsZW4pKTsKKyAgRVhQRUNUX1NUUkVRKEwiMS50eHQiLAorICAgICAgICAgICAgICAgR2V0UGxhdGZvcm1XU3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgc2hvcnQqPihidWYuZGF0YSgpKSkKKyAgICAgICAgICAgICAgICAgICAuY19zdHIoKSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgY29udGVudCBvZiB0aGUgZmlyc3QgYXR0YWNobWVudCBpcyBjb3JyZWN0LgorICBsZW4gPSBGUERGQXR0YWNobWVudF9HZXRGaWxlKGF0dGFjaG1lbnQsIG51bGxwdHIsIDApOworICBidWYuY2xlYXIoKTsKKyAgYnVmLnJlc2l6ZShsZW4pOworICBBU1NFUlRfRVEoNHUsIEZQREZBdHRhY2htZW50X0dldEZpbGUoYXR0YWNobWVudCwgYnVmLmRhdGEoKSwgbGVuKSk7CisgIEVYUEVDVF9FUShzdGQ6OnN0cmluZygidGVzdCIpLCBzdGQ6OnN0cmluZyhidWYuZGF0YSgpLCA0KSk7CisKKyAgLy8gQ2hlY2sgdGhhdCBhIG5vbi1leGlzdGVudCBrZXkgZG9lcyBub3QgZXhpc3QuCisgIEVYUEVDVF9GQUxTRShGUERGQXR0YWNobWVudF9IYXNLZXkoYXR0YWNobWVudCwgIm5vbmUiKSk7CisKKyAgLy8gQ2hlY2sgdGhhdCB0aGUgc3RyaW5nIHZhbHVlIG9mIGEgbm9uLXN0cmluZyBkaWN0aW9uYXJ5IGVudHJ5IGlzIGVtcHR5LgorICBzdGF0aWMgY29uc3RleHByIGNoYXIga1NpemVLZXlbXSA9ICJTaXplIjsKKyAgRVhQRUNUX0VRKEZQREZfT0JKRUNUX05VTUJFUiwKKyAgICAgICAgICAgIEZQREZBdHRhY2htZW50X0dldFZhbHVlVHlwZShhdHRhY2htZW50LCBrU2l6ZUtleSkpOworICBFWFBFQ1RfRVEoMnUsCisgICAgICAgICAgICBGUERGQXR0YWNobWVudF9HZXRTdHJpbmdWYWx1ZShhdHRhY2htZW50LCBrU2l6ZUtleSwgbnVsbHB0ciwgMCkpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIGNyZWF0aW9uIGRhdGUgb2YgdGhlIGZpcnN0IGF0dGFjaG1lbnQgaXMgY29ycmVjdC4KKyAgbGVuID0gRlBERkF0dGFjaG1lbnRfR2V0U3RyaW5nVmFsdWUoYXR0YWNobWVudCwga0RhdGVLZXksIG51bGxwdHIsIDApOworICBidWYuY2xlYXIoKTsKKyAgYnVmLnJlc2l6ZShsZW4pOworICBFWFBFQ1RfRVEoNDh1LCBGUERGQXR0YWNobWVudF9HZXRTdHJpbmdWYWx1ZShhdHRhY2htZW50LCBrRGF0ZUtleSwgYnVmLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKSk7CisgIEVYUEVDVF9TVFJFUShMIkQ6MjAxNzA3MTIyMTQ0MzgtMDcnMDAnIiwKKyAgICAgICAgICAgICAgIEdldFBsYXRmb3JtV1N0cmluZyhyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIHNob3J0Kj4oYnVmLmRhdGEoKSkpCisgICAgICAgICAgICAgICAgICAgLmNfc3RyKCkpOworCisgIC8vIFJldHJpZXZlIHRoZSBzZWNvbmQgYXR0YWNobWVudC4KKyAgYXR0YWNobWVudCA9IEZQREZEb2NfR2V0QXR0YWNobWVudChkb2N1bWVudCgpLCAxKTsKKyAgQVNTRVJUX1RSVUUoYXR0YWNobWVudCk7CisKKyAgLy8gUmV0cmlldmUgdGhlIHNlY29uZCBhdHRhY2htZW50IGZpbGUuCisgIGxlbiA9IEZQREZBdHRhY2htZW50X0dldEZpbGUoYXR0YWNobWVudCwgbnVsbHB0ciwgMCk7CisgIGJ1Zi5jbGVhcigpOworICBidWYucmVzaXplKGxlbik7CisgIEVYUEVDVF9FUSg1ODY5dSwgRlBERkF0dGFjaG1lbnRfR2V0RmlsZShhdHRhY2htZW50LCBidWYuZGF0YSgpLCBsZW4pKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBjYWxjdWxhdGVkIGNoZWNrc3VtIG9mIHRoZSBmaWxlIGRhdGEgbWF0Y2hlcyBleHBlY3RhdGlvbi4KKyAgY29uc3QgY2hhciBrQ2hlY2tTdW1bXSA9ICI3MmFmY2RkZWRmNTU0ZGRhNjNjMGM4OGUwNmYxY2UxOCI7CisgIGNvbnN0IHdjaGFyX3Qga0NoZWNrU3VtV1tdID0gTCI8NzJBRkNEREVERjU1NEREQTYzQzBDODhFMDZGMUNFMTg+IjsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZ2VuZXJhdGVkX2NoZWNrc3VtID0KKyAgICAgIEdlbmVyYXRlTUQ1QmFzZTE2KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJ1Zi5kYXRhKCkpLCBsZW4pOworICBFWFBFQ1RfRVEoa0NoZWNrU3VtLCBnZW5lcmF0ZWRfY2hlY2tzdW0pOworCisgIC8vIENoZWNrIHRoYXQgdGhlIHN0b3JlZCBjaGVja3N1bSBtYXRjaGVzIGV4cGVjdGF0aW9uLgorICBsZW4gPSBGUERGQXR0YWNobWVudF9HZXRTdHJpbmdWYWx1ZShhdHRhY2htZW50LCBrQ2hlY2tzdW1LZXksIG51bGxwdHIsIDApOworICBidWYuY2xlYXIoKTsKKyAgYnVmLnJlc2l6ZShsZW4pOworICBFWFBFQ1RfRVEoNzB1LCBGUERGQXR0YWNobWVudF9HZXRTdHJpbmdWYWx1ZShhdHRhY2htZW50LCBrQ2hlY2tzdW1LZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Zi5kYXRhKCksIGxlbikpOworICBFWFBFQ1RfRVEoa0NoZWNrU3VtVywKKyAgICAgICAgICAgIEdldFBsYXRmb3JtV1N0cmluZyhyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIHNob3J0Kj4oYnVmLmRhdGEoKSkpKTsKK30KKworVEVTVF9GKEZQREZBdHRhY2htZW50RW1iZWRkZXJ0ZXN0LCBBZGRBdHRhY2htZW50cykgeworICAvLyBPcGVuIGEgZmlsZSB3aXRoIHR3byBhdHRhY2htZW50cy4KKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJlbWJlZGRlZF9hdHRhY2htZW50cy5wZGYiKSk7CisgIEVYUEVDVF9FUSgyLCBGUERGRG9jX0dldEF0dGFjaG1lbnRDb3VudChkb2N1bWVudCgpKSk7CisKKyAgLy8gQ2hlY2sgdGhhdCBhZGRpbmcgYW4gYXR0YWNobWVudCB3aXRoIGFuIGVtcHR5IG5hbWUgd291bGQgZmFpbC4KKyAgRVhQRUNUX0ZBTFNFKEZQREZEb2NfQWRkQXR0YWNobWVudChkb2N1bWVudCgpLCBudWxscHRyKSk7CisKKyAgLy8gQWRkIGFuIGF0dGFjaG1lbnQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZW1iZWRkZWQgZmlsZSBsaXN0LgorICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IGZpbGVfbmFtZSA9CisgICAgICBHZXRGUERGV2lkZVN0cmluZyhMIjAudHh0Iik7CisgIEZQREZfQVRUQUNITUVOVCBhdHRhY2htZW50ID0KKyAgICAgIEZQREZEb2NfQWRkQXR0YWNobWVudChkb2N1bWVudCgpLCBmaWxlX25hbWUuZ2V0KCkpOworCisgIC8vIENoZWNrIHRoYXQgd3JpdGluZyB0byBhIGZpbGUgd2l0aCBudWxscHRyIGJ1dCBub24temVybyBieXRlcyB3b3VsZCBmYWlsLgorICBFWFBFQ1RfRkFMU0UoRlBERkF0dGFjaG1lbnRfU2V0RmlsZShhdHRhY2htZW50LCBkb2N1bWVudCgpLCBudWxscHRyLCAxMCkpOworCisgIC8vIFNldCB0aGUgbmV3IGF0dGFjaG1lbnQncyBmaWxlLgorICBjb25zdGV4cHIgY2hhciBrQ29udGVudHMxW10gPSAiSGVsbG8hIjsKKyAgRVhQRUNUX1RSVUUoRlBERkF0dGFjaG1lbnRfU2V0RmlsZShhdHRhY2htZW50LCBkb2N1bWVudCgpLCBrQ29udGVudHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihrQ29udGVudHMxKSkpOworCisgIC8vIFZlcmlmeSB0aGUgbmFtZSBvZiB0aGUgbmV3IGF0dGFjaG1lbnQgKGkuZS4gdGhlIGZpcnN0IGF0dGFjaG1lbnQpLgorICBhdHRhY2htZW50ID0gRlBERkRvY19HZXRBdHRhY2htZW50KGRvY3VtZW50KCksIDApOworICBBU1NFUlRfVFJVRShhdHRhY2htZW50KTsKKyAgdW5zaWduZWQgbG9uZyBsZW4gPSBGUERGQXR0YWNobWVudF9HZXROYW1lKGF0dGFjaG1lbnQsIG51bGxwdHIsIDApOworICBzdGQ6OnZlY3RvcjxjaGFyPiBidWYobGVuKTsKKyAgRVhQRUNUX0VRKDEydSwgRlBERkF0dGFjaG1lbnRfR2V0TmFtZShhdHRhY2htZW50LCBidWYuZGF0YSgpLCBsZW4pKTsKKyAgRVhQRUNUX1NUUkVRKEwiMC50eHQiLAorICAgICAgICAgICAgICAgR2V0UGxhdGZvcm1XU3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgc2hvcnQqPihidWYuZGF0YSgpKSkKKyAgICAgICAgICAgICAgICAgICAuY19zdHIoKSk7CisKKyAgLy8gVmVyaWZ5IHRoZSBjb250ZW50IG9mIHRoZSBuZXcgYXR0YWNobWVudCAoaS5lLiB0aGUgZmlyc3QgYXR0YWNobWVudCkuCisgIGxlbiA9IEZQREZBdHRhY2htZW50X0dldEZpbGUoYXR0YWNobWVudCwgbnVsbHB0ciwgMCk7CisgIGJ1Zi5jbGVhcigpOworICBidWYucmVzaXplKGxlbik7CisgIEFTU0VSVF9FUSg2dSwgRlBERkF0dGFjaG1lbnRfR2V0RmlsZShhdHRhY2htZW50LCBidWYuZGF0YSgpLCBsZW4pKTsKKyAgRVhQRUNUX0VRKHN0ZDo6c3RyaW5nKGtDb250ZW50czEpLCBzdGQ6OnN0cmluZyhidWYuZGF0YSgpLCA2KSk7CisKKyAgLy8gQWRkIGFuIGF0dGFjaG1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgZW1iZWRkZWQgZmlsZSBsaXN0IGFuZCBzZXQgaXRzIGZpbGUuCisgIGZpbGVfbmFtZSA9IEdldEZQREZXaWRlU3RyaW5nKEwiei50eHQiKTsKKyAgYXR0YWNobWVudCA9IEZQREZEb2NfQWRkQXR0YWNobWVudChkb2N1bWVudCgpLCBmaWxlX25hbWUuZ2V0KCkpOworICBjb25zdGV4cHIgY2hhciBrQ29udGVudHMyW10gPSAiV29ybGQhIjsKKyAgRVhQRUNUX1RSVUUoRlBERkF0dGFjaG1lbnRfU2V0RmlsZShhdHRhY2htZW50LCBkb2N1bWVudCgpLCBrQ29udGVudHMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihrQ29udGVudHMyKSkpOworICBFWFBFQ1RfRVEoNCwgRlBERkRvY19HZXRBdHRhY2htZW50Q291bnQoZG9jdW1lbnQoKSkpOworCisgIC8vIFZlcmlmeSB0aGUgbmFtZSBvZiB0aGUgbmV3IGF0dGFjaG1lbnQgKGkuZS4gdGhlIGZvdXJ0aCBhdHRhY2htZW50KS4KKyAgYXR0YWNobWVudCA9IEZQREZEb2NfR2V0QXR0YWNobWVudChkb2N1bWVudCgpLCAzKTsKKyAgQVNTRVJUX1RSVUUoYXR0YWNobWVudCk7CisgIGxlbiA9IEZQREZBdHRhY2htZW50X0dldE5hbWUoYXR0YWNobWVudCwgbnVsbHB0ciwgMCk7CisgIGJ1Zi5jbGVhcigpOworICBidWYucmVzaXplKGxlbik7CisgIEVYUEVDVF9FUSgxMnUsIEZQREZBdHRhY2htZW50X0dldE5hbWUoYXR0YWNobWVudCwgYnVmLmRhdGEoKSwgbGVuKSk7CisgIEVYUEVDVF9TVFJFUShMInoudHh0IiwKKyAgICAgICAgICAgICAgIEdldFBsYXRmb3JtV1N0cmluZyhyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIHNob3J0Kj4oYnVmLmRhdGEoKSkpCisgICAgICAgICAgICAgICAgICAgLmNfc3RyKCkpOworCisgIC8vIFZlcmlmeSB0aGUgY29udGVudCBvZiB0aGUgbmV3IGF0dGFjaG1lbnQgKGkuZS4gdGhlIGZvdXJ0aCBhdHRhY2htZW50KS4KKyAgbGVuID0gRlBERkF0dGFjaG1lbnRfR2V0RmlsZShhdHRhY2htZW50LCBudWxscHRyLCAwKTsKKyAgYnVmLmNsZWFyKCk7CisgIGJ1Zi5yZXNpemUobGVuKTsKKyAgQVNTRVJUX0VRKDZ1LCBGUERGQXR0YWNobWVudF9HZXRGaWxlKGF0dGFjaG1lbnQsIGJ1Zi5kYXRhKCksIGxlbikpOworICBFWFBFQ1RfRVEoc3RkOjpzdHJpbmcoa0NvbnRlbnRzMiksIHN0ZDo6c3RyaW5nKGJ1Zi5kYXRhKCksIDYpKTsKK30KKworVEVTVF9GKEZQREZBdHRhY2htZW50RW1iZWRkZXJ0ZXN0LCBBZGRBdHRhY2htZW50c1dpdGhQYXJhbXMpIHsKKyAgLy8gT3BlbiBhIGZpbGUgd2l0aCB0d28gYXR0YWNobWVudHMuCisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiZW1iZWRkZWRfYXR0YWNobWVudHMucGRmIikpOworICBFWFBFQ1RfRVEoMiwgRlBERkRvY19HZXRBdHRhY2htZW50Q291bnQoZG9jdW1lbnQoKSkpOworCisgIC8vIEFkZCBhbiBhdHRhY2htZW50IHRvIHRoZSBlbWJlZGRlZCBmaWxlIGxpc3QuCisgIHN0ZDo6dW5pcXVlX3B0cjx1bnNpZ25lZCBzaG9ydCwgcGRmaXVtOjpGcmVlRGVsZXRlcj4gZmlsZV9uYW1lID0KKyAgICAgIEdldEZQREZXaWRlU3RyaW5nKEwiNS50eHQiKTsKKyAgRlBERl9BVFRBQ0hNRU5UIGF0dGFjaG1lbnQgPQorICAgICAgRlBERkRvY19BZGRBdHRhY2htZW50KGRvY3VtZW50KCksIGZpbGVfbmFtZS5nZXQoKSk7CisgIGNvbnN0ZXhwciBjaGFyIGtDb250ZW50c1tdID0gIkhlbGxvIFdvcmxkISI7CisgIEVYUEVDVF9UUlVFKEZQREZBdHRhY2htZW50X1NldEZpbGUoYXR0YWNobWVudCwgZG9jdW1lbnQoKSwga0NvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihrQ29udGVudHMpKSk7CisKKyAgLy8gU2V0IHRoZSBkYXRlIHRvIGJlIGFuIGFyYml0cmFyeSB2YWx1ZS4KKyAgY29uc3RleHByIHdjaGFyX3Qga0RhdGVXW10gPSBMIkQ6MjAxNzA3MjAxNjE1MjctMDQnMDAnIjsKKyAgc3RkOjp1bmlxdWVfcHRyPHVuc2lnbmVkIHNob3J0LCBwZGZpdW06OkZyZWVEZWxldGVyPiB3c19kYXRlID0KKyAgICAgIEdldEZQREZXaWRlU3RyaW5nKGtEYXRlVyk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgRlBERkF0dGFjaG1lbnRfU2V0U3RyaW5nVmFsdWUoYXR0YWNobWVudCwga0RhdGVLZXksIHdzX2RhdGUuZ2V0KCkpKTsKKworICAvLyBTZXQgdGhlIGNoZWNrc3VtIHRvIGJlIGFuIGFyYml0cmFyeSB2YWx1ZS4KKyAgY29uc3RleHByIHdjaGFyX3Qga0NoZWNrU3VtV1tdID0gTCI8QUJDREVGMDEyMzQ1Njc4OTk4NzY1NDMyMTBGRURDQkE+IjsKKyAgc3RkOjp1bmlxdWVfcHRyPHVuc2lnbmVkIHNob3J0LCBwZGZpdW06OkZyZWVEZWxldGVyPiB3c19jaGVja3N1bSA9CisgICAgICBHZXRGUERGV2lkZVN0cmluZyhrQ2hlY2tTdW1XKTsKKyAgRVhQRUNUX1RSVUUoRlBERkF0dGFjaG1lbnRfU2V0U3RyaW5nVmFsdWUoYXR0YWNobWVudCwga0NoZWNrc3VtS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c19jaGVja3N1bS5nZXQoKSkpOworCisgIC8vIFZlcmlmeSB0aGUgbmFtZSBvZiB0aGUgbmV3IGF0dGFjaG1lbnQgKGkuZS4gdGhlIHNlY29uZCBhdHRhY2htZW50KS4KKyAgYXR0YWNobWVudCA9IEZQREZEb2NfR2V0QXR0YWNobWVudChkb2N1bWVudCgpLCAxKTsKKyAgQVNTRVJUX1RSVUUoYXR0YWNobWVudCk7CisgIHVuc2lnbmVkIGxvbmcgbGVuID0gRlBERkF0dGFjaG1lbnRfR2V0TmFtZShhdHRhY2htZW50LCBudWxscHRyLCAwKTsKKyAgc3RkOjp2ZWN0b3I8Y2hhcj4gYnVmKGxlbik7CisgIEVYUEVDVF9FUSgxMnUsIEZQREZBdHRhY2htZW50X0dldE5hbWUoYXR0YWNobWVudCwgYnVmLmRhdGEoKSwgbGVuKSk7CisgIEVYUEVDVF9TVFJFUShMIjUudHh0IiwKKyAgICAgICAgICAgICAgIEdldFBsYXRmb3JtV1N0cmluZyhyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIHNob3J0Kj4oYnVmLmRhdGEoKSkpCisgICAgICAgICAgICAgICAgICAgLmNfc3RyKCkpOworCisgIC8vIFZlcmlmeSB0aGUgY29udGVudCBvZiB0aGUgbmV3IGF0dGFjaG1lbnQuCisgIGxlbiA9IEZQREZBdHRhY2htZW50X0dldEZpbGUoYXR0YWNobWVudCwgbnVsbHB0ciwgMCk7CisgIGJ1Zi5jbGVhcigpOworICBidWYucmVzaXplKGxlbik7CisgIEFTU0VSVF9FUSgxMnUsIEZQREZBdHRhY2htZW50X0dldEZpbGUoYXR0YWNobWVudCwgYnVmLmRhdGEoKSwgbGVuKSk7CisgIEVYUEVDVF9FUShzdGQ6OnN0cmluZyhrQ29udGVudHMpLCBzdGQ6OnN0cmluZyhidWYuZGF0YSgpLCAxMikpOworCisgIC8vIFZlcmlmeSB0aGUgY3JlYXRpb24gZGF0ZSBvZiB0aGUgbmV3IGF0dGFjaG1lbnQuCisgIGxlbiA9IEZQREZBdHRhY2htZW50X0dldFN0cmluZ1ZhbHVlKGF0dGFjaG1lbnQsIGtEYXRlS2V5LCBudWxscHRyLCAwKTsKKyAgYnVmLmNsZWFyKCk7CisgIGJ1Zi5yZXNpemUobGVuKTsKKyAgRVhQRUNUX0VRKDQ4dSwgRlBERkF0dGFjaG1lbnRfR2V0U3RyaW5nVmFsdWUoYXR0YWNobWVudCwga0RhdGVLZXksIGJ1Zi5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbikpOworICBFWFBFQ1RfU1RSRVEoa0RhdGVXLAorICAgICAgICAgICAgICAgR2V0UGxhdGZvcm1XU3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgc2hvcnQqPihidWYuZGF0YSgpKSkKKyAgICAgICAgICAgICAgICAgICAuY19zdHIoKSk7CisKKyAgLy8gVmVyaWZ5IHRoZSBjaGVja3N1bSBvZiB0aGUgbmV3IGF0dGFjaG1lbnQuCisgIGxlbiA9IEZQREZBdHRhY2htZW50X0dldFN0cmluZ1ZhbHVlKGF0dGFjaG1lbnQsIGtDaGVja3N1bUtleSwgbnVsbHB0ciwgMCk7CisgIGJ1Zi5jbGVhcigpOworICBidWYucmVzaXplKGxlbik7CisgIEVYUEVDVF9FUSg3MHUsIEZQREZBdHRhY2htZW50X0dldFN0cmluZ1ZhbHVlKGF0dGFjaG1lbnQsIGtDaGVja3N1bUtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmRhdGEoKSwgbGVuKSk7CisgIEVYUEVDVF9TVFJFUShrQ2hlY2tTdW1XLAorICAgICAgICAgICAgICAgR2V0UGxhdGZvcm1XU3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgc2hvcnQqPihidWYuZGF0YSgpKSkKKyAgICAgICAgICAgICAgICAgICAuY19zdHIoKSk7CisKKyAgLy8gT3ZlcndyaXRlIHRoZSBleGlzdGluZyBmaWxlIHdpdGggZW1wdHkgY29udGVudCwgYW5kIGNoZWNrIHRoYXQgdGhlIGNoZWNrc3VtCisgIC8vIGdldHMgdXBkYXRlZCB0byB0aGUgY29ycmVjdCB2YWx1ZS4KKyAgRVhQRUNUX1RSVUUoRlBERkF0dGFjaG1lbnRfU2V0RmlsZShhdHRhY2htZW50LCBkb2N1bWVudCgpLCBudWxscHRyLCAwKSk7CisgIEVYUEVDVF9FUSgwdSwgRlBERkF0dGFjaG1lbnRfR2V0RmlsZShhdHRhY2htZW50LCBudWxscHRyLCAwKSk7CisgIGxlbiA9IEZQREZBdHRhY2htZW50X0dldFN0cmluZ1ZhbHVlKGF0dGFjaG1lbnQsIGtDaGVja3N1bUtleSwgbnVsbHB0ciwgMCk7CisgIGJ1Zi5jbGVhcigpOworICBidWYucmVzaXplKGxlbik7CisgIEVYUEVDVF9FUSg3MHUsIEZQREZBdHRhY2htZW50X0dldFN0cmluZ1ZhbHVlKGF0dGFjaG1lbnQsIGtDaGVja3N1bUtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLmRhdGEoKSwgbGVuKSk7CisgIEVYUEVDVF9FUShMIjxENDFEOENEOThGMDBCMjA0RTk4MDA5OThFQ0Y4NDI3RT4iLAorICAgICAgICAgICAgR2V0UGxhdGZvcm1XU3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgc2hvcnQqPihidWYuZGF0YSgpKSkpOworfQorCitURVNUX0YoRlBERkF0dGFjaG1lbnRFbWJlZGRlcnRlc3QsIERlbGV0ZUF0dGFjaG1lbnQpIHsKKyAgLy8gT3BlbiBhIGZpbGUgd2l0aCB0d28gYXR0YWNobWVudHMuCisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiZW1iZWRkZWRfYXR0YWNobWVudHMucGRmIikpOworICBFWFBFQ1RfRVEoMiwgRlBERkRvY19HZXRBdHRhY2htZW50Q291bnQoZG9jdW1lbnQoKSkpOworCisgIC8vIFZlcmlmeSB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgYXR0YWNobWVudC4KKyAgRlBERl9BVFRBQ0hNRU5UIGF0dGFjaG1lbnQgPSBGUERGRG9jX0dldEF0dGFjaG1lbnQoZG9jdW1lbnQoKSwgMCk7CisgIHVuc2lnbmVkIGxvbmcgbGVuID0gRlBERkF0dGFjaG1lbnRfR2V0TmFtZShhdHRhY2htZW50LCBudWxscHRyLCAwKTsKKyAgc3RkOjp2ZWN0b3I8Y2hhcj4gYnVmKGxlbik7CisgIEVYUEVDVF9FUSgxMnUsIEZQREZBdHRhY2htZW50X0dldE5hbWUoYXR0YWNobWVudCwgYnVmLmRhdGEoKSwgbGVuKSk7CisgIEVYUEVDVF9TVFJFUShMIjEudHh0IiwKKyAgICAgICAgICAgICAgIEdldFBsYXRmb3JtV1N0cmluZyhyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIHNob3J0Kj4oYnVmLmRhdGEoKSkpCisgICAgICAgICAgICAgICAgICAgLmNfc3RyKCkpOworCisgIC8vIERlbGV0ZSB0aGUgZmlyc3QgYXR0YWNobWVudC4KKyAgRVhQRUNUX1RSVUUoRlBERkRvY19EZWxldGVBdHRhY2htZW50KGRvY3VtZW50KCksIDApKTsKKyAgRVhQRUNUX0VRKDEsIEZQREZEb2NfR2V0QXR0YWNobWVudENvdW50KGRvY3VtZW50KCkpKTsKKworICAvLyBWZXJpZnkgdGhlIG5hbWUgb2YgdGhlIG5ldyBmaXJzdCBhdHRhY2htZW50LgorICBhdHRhY2htZW50ID0gRlBERkRvY19HZXRBdHRhY2htZW50KGRvY3VtZW50KCksIDApOworICBsZW4gPSBGUERGQXR0YWNobWVudF9HZXROYW1lKGF0dGFjaG1lbnQsIG51bGxwdHIsIDApOworICBidWYuY2xlYXIoKTsKKyAgYnVmLnJlc2l6ZShsZW4pOworICBFWFBFQ1RfRVEoMjZ1LCBGUERGQXR0YWNobWVudF9HZXROYW1lKGF0dGFjaG1lbnQsIGJ1Zi5kYXRhKCksIGxlbikpOworICBFWFBFQ1RfU1RSRVEoTCJhdHRhY2hlZC5wZGYiLAorICAgICAgICAgICAgICAgR2V0UGxhdGZvcm1XU3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgc2hvcnQqPihidWYuZGF0YSgpKSkKKyAgICAgICAgICAgICAgICAgICAuY19zdHIoKSk7Cit9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZjYXRhbG9nLmNwcCBiL2ZwZGZzZGsvZnBkZmNhdGFsb2cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5M2U1YWUKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL2ZwZGZjYXRhbG9nLmNwcApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9jYXRhbG9nLmgiCisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2ZzZGtfZGVmaW5lLmgiCisKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCitGUERGQ2F0YWxvZ19Jc1RhZ2dlZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBDUERGRG9jdW1lbnRGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKKyAgaWYgKCFwRG9jKQorICAgIHJldHVybiBmYWxzZTsKKworICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBDYXRhbG9nID0gcERvYy0+R2V0Um9vdCgpOworICBpZiAoIXBDYXRhbG9nKQorICAgIHJldHVybiBmYWxzZTsKKworICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBNYXJrSW5mbyA9IHBDYXRhbG9nLT5HZXREaWN0Rm9yKCJNYXJrSW5mbyIpOworICByZXR1cm4gcE1hcmtJbmZvICYmIHBNYXJrSW5mby0+R2V0SW50ZWdlckZvcigiTWFya2VkIikgIT0gMDsKK30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnBkZmNhdGFsb2dfdW5pdHRlc3QuY3BwIGIvZnBkZnNkay9mcGRmY2F0YWxvZ191bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNjMDYzNAotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvZnBkZmNhdGFsb2dfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsOTUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInB1YmxpYy9mcGRmX2NhdGFsb2cuaCIKKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9jcGRmX21vZHVsZW1nci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudC5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9udW1iZXIuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmluZy5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInRlc3RpbmcvdGVzdF9zdXBwb3J0LmgiCisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorI2luY2x1ZGUgImZwZGZzZGsvZnBkZnhmYS9jcGRmeGZhX2NvbnRleHQuaCIKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworY2xhc3MgQ1BERl9UZXN0RG9jdW1lbnQgOiBwdWJsaWMgQ1BERl9Eb2N1bWVudCB7CisgcHVibGljOgorICBDUERGX1Rlc3REb2N1bWVudCgpIDogQ1BERl9Eb2N1bWVudChudWxscHRyKSB7fQorCisgIHZvaWQgU2V0Um9vdChDUERGX0RpY3Rpb25hcnkqIHJvb3QpIHsKKyAgICBtX3BSb290RGljdCA9IHJvb3Q7CisgICAgR2V0Um9vdCgpOworICB9Cit9OworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK2NsYXNzIENQREZfVGVzdFhGQUNvbnRleHQgOiBwdWJsaWMgQ1BERlhGQV9Db250ZXh0IHsKKyBwdWJsaWM6CisgIENQREZfVGVzdFhGQUNvbnRleHQoKQorICAgICAgOiBDUERGWEZBX0NvbnRleHQocGRmaXVtOjpNYWtlVW5pcXVlPENQREZfVGVzdERvY3VtZW50PigpKSB7fQorCisgIHZvaWQgU2V0Um9vdChDUERGX0RpY3Rpb25hcnkqIHJvb3QpIHsKKyAgICByZWludGVycHJldF9jYXN0PENQREZfVGVzdERvY3VtZW50Kj4oR2V0UERGRG9jKCkpLT5TZXRSb290KHJvb3QpOworICB9CisKKyAgQ1BERl9JbmRpcmVjdE9iamVjdEhvbGRlciogR2V0SG9sZGVyKCkgeyByZXR1cm4gR2V0UERGRG9jKCk7IH0KK307Cit1c2luZyBDUERGX1Rlc3RQZGZEb2N1bWVudCA9IENQREZfVGVzdFhGQUNvbnRleHQ7CisjZWxzZSAgIC8vIFBERl9FTkFCTEVfWEZBCit1c2luZyBDUERGX1Rlc3RQZGZEb2N1bWVudCA9IENQREZfVGVzdERvY3VtZW50OworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCitjbGFzcyBQREZDYXRhbG9nVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5Jbml0KCk7CisKKyAgICBtX3BEb2MgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9UZXN0UGRmRG9jdW1lbnQ+KCk7CisKKyAgICAvLyBTZXR1cCB0aGUgcm9vdCBkaXJlY3RvcnkuCisgICAgbV9wUm9vdE9iaiA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCk7CisgIH0KKworICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIG1fcERvYy5yZXNldCgpOworICAgIENQREZfTW9kdWxlTWdyOjpEZXN0cm95KCk7CisgIH0KKworIHByb3RlY3RlZDoKKyAgc3RkOjp1bmlxdWVfcHRyPENQREZfVGVzdFBkZkRvY3VtZW50PiBtX3BEb2M7CisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0RpY3Rpb25hcnk+IG1fcFJvb3RPYmo7Cit9OworCitURVNUX0YoUERGQ2F0YWxvZ1Rlc3QsIElzVGFnZ2VkKSB7CisgIC8vIE51bGwgZG9jCisgIEVYUEVDVF9GQUxTRShGUERGQ2F0YWxvZ19Jc1RhZ2dlZChudWxscHRyKSk7CisKKyAgLy8gTm8gcm9vdAorICBtX3BEb2MtPlNldFJvb3QobnVsbHB0cik7CisgIEVYUEVDVF9GQUxTRShGUERGQ2F0YWxvZ19Jc1RhZ2dlZChtX3BEb2MuZ2V0KCkpKTsKKworICAvLyBFbXB0eSByb290CisgIG1fcERvYy0+U2V0Um9vdChtX3BSb290T2JqLmdldCgpKTsKKyAgRVhQRUNUX0ZBTFNFKEZQREZDYXRhbG9nX0lzVGFnZ2VkKG1fcERvYy5nZXQoKSkpOworCisgIC8vIFJvb3Qgd2l0aCBvdGhlciBrZXkKKyAgbV9wUm9vdE9iai0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigiT1RIRVJfS0VZIiwgIm90aGVyIHZhbHVlIiwgZmFsc2UpOworICBFWFBFQ1RfRkFMU0UoRlBERkNhdGFsb2dfSXNUYWdnZWQobV9wRG9jLmdldCgpKSk7CisKKyAgLy8gUm9vdCB3aXRoIGVtcHR5IE1hcmtJbmZvCisgIENQREZfRGljdGlvbmFyeSogbWFya0luZm9EaWN0ID0KKyAgICAgIG1fcFJvb3RPYmotPlNldE5ld0ZvcjxDUERGX0RpY3Rpb25hcnk+KCJNYXJrSW5mbyIpOworICBFWFBFQ1RfRkFMU0UoRlBERkNhdGFsb2dfSXNUYWdnZWQobV9wRG9jLmdldCgpKSk7CisKKyAgLy8gTWFya0luZm8gcHJlc2VudCBidXQgTWFya2VkIGlzIDAKKyAgbWFya0luZm9EaWN0LT5TZXROZXdGb3I8Q1BERl9OdW1iZXI+KCJNYXJrZWQiLCAwKTsKKyAgRVhQRUNUX0ZBTFNFKEZQREZDYXRhbG9nX0lzVGFnZ2VkKG1fcERvYy5nZXQoKSkpOworCisgIC8vIE1hcmtJbmZvIHByZXNlbnQgYW5kIE1hcmtlZCBpcyAxLCBQREYgaXMgY29uc2lkZXJlZCB0YWdnZWQuCisgIG1hcmtJbmZvRGljdC0+U2V0TmV3Rm9yPENQREZfTnVtYmVyPigiTWFya2VkIiwgMSk7CisgIEVYUEVDVF9UUlVFKEZQREZDYXRhbG9nX0lzVGFnZ2VkKG1fcERvYy5nZXQoKSkpOworfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9mcGRmZG9jLmNwcCBiL2ZwZGZzZGsvZnBkZmRvYy5jcHAKaW5kZXggZjdkOTRjMi4uNDdlY2Y0MiAxMDA2NDQKLS0tIGEvZnBkZnNkay9mcGRmZG9jLmNwcAorKysgYi9mcGRmc2RrL2ZwZGZkb2MuY3BwCkBAIC0yNCw3ICsyNCw3IEBACiAKIENQREZfQm9va21hcmsgRmluZEJvb2ttYXJrKGNvbnN0IENQREZfQm9va21hcmtUcmVlJiB0cmVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Cb29rbWFyayBib29rbWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHRpdGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8Q1BERl9EaWN0aW9uYXJ5Kj4qIHZpc2l0ZWQpIHsKICAgLy8gUmV0dXJuIGlmIGFscmVhZHkgY2hlY2tlZCB0byBhdm9pZCBjaXJjdWxhciBjYWxsaW5nLgogICBpZiAocGRmaXVtOjpDb250YWluc0tleSgqdmlzaXRlZCwgYm9va21hcmsuR2V0RGljdCgpKSkKQEAgLTUzLDI2ICs1MywxNiBAQAogICBpZiAoIXBhZ2UpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgQ1BERl9Eb2N1bWVudCogcERvYyA9IHBhZ2UtPm1fcERvY3VtZW50OworICBDUERGX0RvY3VtZW50KiBwRG9jID0gcGFnZS0+bV9wRG9jdW1lbnQuR2V0KCk7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0xpbmtMaXN0PiogcEhvbGRlciA9IHBEb2MtPkxpbmtzQ29udGV4dCgpOwogICBpZiAoIXBIb2xkZXItPmdldCgpKQogICAgICpwSG9sZGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfTGlua0xpc3Q+KCk7CiAgIHJldHVybiBwSG9sZGVyLT5nZXQoKTsKIH0KIAotdW5zaWduZWQgbG9uZyBVdGYxNkVuY29kZU1heWJlQ29weUFuZFJldHVybkxlbmd0aChjb25zdCBDRlhfV2lkZVN0cmluZyYgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1ZmxlbikgewotICBDRlhfQnl0ZVN0cmluZyBlbmNvZGVkVGV4dCA9IHRleHQuVVRGMTZMRV9FbmNvZGUoKTsKLSAgdW5zaWduZWQgbG9uZyBsZW4gPSBlbmNvZGVkVGV4dC5HZXRMZW5ndGgoKTsKLSAgaWYgKGJ1ZmZlciAmJiBsZW4gPD0gYnVmbGVuKQotICAgIEZYU1lTX21lbWNweShidWZmZXIsIGVuY29kZWRUZXh0LmNfc3RyKCksIGxlbik7Ci0gIHJldHVybiBsZW47Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZQogCi1ETExFWFBPUlQgRlBERl9CT09LTUFSSyBTVERDQUxMCitGUERGX0VYUE9SVCBGUERGX0JPT0tNQVJLIEZQREZfQ0FMTENPTlYKIEZQREZCb29rbWFya19HZXRGaXJzdENoaWxkKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQk9PS01BUksgcERpY3QpIHsKICAgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOwogICBpZiAoIXBEb2MpCkBAIC04Myw3ICs3Myw3IEBACiAgIHJldHVybiB0cmVlLkdldEZpcnN0Q2hpbGQoYm9va21hcmspLkdldERpY3QoKTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PS01BUksgU1REQ0FMTAorRlBERl9FWFBPUlQgRlBERl9CT09LTUFSSyBGUERGX0NBTExDT05WCiBGUERGQm9va21hcmtfR2V0TmV4dFNpYmxpbmcoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9CT09LTUFSSyBwRGljdCkgewogICBpZiAoIXBEaWN0KQogICAgIHJldHVybiBudWxscHRyOwpAQCAtOTYsMzIgKzg2LDMxIEBACiAgIHJldHVybiB0cmVlLkdldE5leHRTaWJsaW5nKGJvb2ttYXJrKS5HZXREaWN0KCk7CiB9CiAKLURMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkJvb2ttYXJrX0dldFRpdGxlKEZQREZfQk9PS01BUksgcERpY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1ZmxlbikgeworRlBERl9FWFBPUlQgdW5zaWduZWQgbG9uZyBGUERGX0NBTExDT05WCitGUERGQm9va21hcmtfR2V0VGl0bGUoRlBERl9CT09LTUFSSyBwRGljdCwgdm9pZCogYnVmZmVyLCB1bnNpZ25lZCBsb25nIGJ1ZmxlbikgewogICBpZiAoIXBEaWN0KQogICAgIHJldHVybiAwOwogICBDUERGX0Jvb2ttYXJrIGJvb2ttYXJrKFRvRGljdGlvbmFyeShzdGF0aWNfY2FzdDxDUERGX09iamVjdCo+KHBEaWN0KSkpOwotICBDRlhfV2lkZVN0cmluZyB0aXRsZSA9IGJvb2ttYXJrLkdldFRpdGxlKCk7CisgIFdpZGVTdHJpbmcgdGl0bGUgPSBib29rbWFyay5HZXRUaXRsZSgpOwogICByZXR1cm4gVXRmMTZFbmNvZGVNYXliZUNvcHlBbmRSZXR1cm5MZW5ndGgodGl0bGUsIGJ1ZmZlciwgYnVmbGVuKTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PS01BUksgU1REQ0FMTCBGUERGQm9va21hcmtfRmluZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgdGl0bGUpIHsKK0ZQREZfRVhQT1JUIEZQREZfQk9PS01BUksgRlBERl9DQUxMQ09OVgorRlBERkJvb2ttYXJrX0ZpbmQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9XSURFU1RSSU5HIHRpdGxlKSB7CiAgIGlmICghdGl0bGUgfHwgdGl0bGVbMF0gPT0gMCkKICAgICByZXR1cm4gbnVsbHB0cjsKICAgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOwogICBpZiAoIXBEb2MpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAgIENQREZfQm9va21hcmtUcmVlIHRyZWUocERvYyk7Ci0gIEZYX1NUUlNJWkUgbGVuID0gQ0ZYX1dpZGVTdHJpbmc6OldTdHJpbmdMZW5ndGgodGl0bGUpOwotICBDRlhfV2lkZVN0cmluZyBlbmNvZGVkVGl0bGUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUodGl0bGUsIGxlbik7CisgIHNpemVfdCBsZW4gPSBXaWRlU3RyaW5nOjpXU3RyaW5nTGVuZ3RoKHRpdGxlKTsKKyAgV2lkZVN0cmluZyBlbmNvZGVkVGl0bGUgPSBXaWRlU3RyaW5nOjpGcm9tVVRGMTZMRSh0aXRsZSwgbGVuKTsKICAgc3RkOjpzZXQ8Q1BERl9EaWN0aW9uYXJ5Kj4gdmlzaXRlZDsKICAgcmV0dXJuIEZpbmRCb29rbWFyayh0cmVlLCBDUERGX0Jvb2ttYXJrKCksIGVuY29kZWRUaXRsZSwgJnZpc2l0ZWQpLkdldERpY3QoKTsKIH0KIAotRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZCb29rbWFya19HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09LTUFSSyBwRGljdCkgeworRlBERl9FWFBPUlQgRlBERl9ERVNUIEZQREZfQ0FMTENPTlYgRlBERkJvb2ttYXJrX0dldERlc3QoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PS01BUksgcERpY3QpIHsKICAgaWYgKCFwRGljdCkKICAgICByZXR1cm4gbnVsbHB0cjsKICAgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOwpAQCAtMTM5LDE0ICsxMjgsMTUgQEAKICAgcmV0dXJuIGFjdGlvbi5HZXREZXN0KHBEb2MpLkdldE9iamVjdCgpOwogfQogCi1ETExFWFBPUlQgRlBERl9BQ1RJT04gU1REQ0FMTCBGUERGQm9va21hcmtfR2V0QWN0aW9uKEZQREZfQk9PS01BUksgcERpY3QpIHsKK0ZQREZfRVhQT1JUIEZQREZfQUNUSU9OIEZQREZfQ0FMTENPTlYKK0ZQREZCb29rbWFya19HZXRBY3Rpb24oRlBERl9CT09LTUFSSyBwRGljdCkgewogICBpZiAoIXBEaWN0KQogICAgIHJldHVybiBudWxscHRyOwogICBDUERGX0Jvb2ttYXJrIGJvb2ttYXJrKFRvRGljdGlvbmFyeShzdGF0aWNfY2FzdDxDUERGX09iamVjdCo+KHBEaWN0KSkpOwogICByZXR1cm4gYm9va21hcmsuR2V0QWN0aW9uKCkuR2V0RGljdCgpOwogfQogCi1ETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZBY3Rpb25fR2V0VHlwZShGUERGX0FDVElPTiBwRGljdCkgeworRlBERl9FWFBPUlQgdW5zaWduZWQgbG9uZyBGUERGX0NBTExDT05WIEZQREZBY3Rpb25fR2V0VHlwZShGUERGX0FDVElPTiBwRGljdCkgewogICBpZiAoIXBEaWN0KQogICAgIHJldHVybiBQREZBQ1RJT05fVU5TVVBQT1JURUQ7CiAKQEAgLTE2Niw4ICsxNTYsOCBAQAogICB9CiB9CiAKLURMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGQWN0aW9uX0dldERlc3QoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9BQ1RJT04gcERpY3QpIHsKK0ZQREZfRVhQT1JUIEZQREZfREVTVCBGUERGX0NBTExDT05WIEZQREZBY3Rpb25fR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQUNUSU9OIHBEaWN0KSB7CiAgIGlmICghcERpY3QpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBDUERGRG9jdW1lbnRGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKQEAgLTE3Nyw0MCArMTY3LDQwIEBACiAgIHJldHVybiBhY3Rpb24uR2V0RGVzdChwRG9jKS5HZXRPYmplY3QoKTsKIH0KIAotRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGQWN0aW9uX0dldEZpbGVQYXRoKEZQREZfQUNUSU9OIHBEaWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1ZmxlbikgeworRlBERl9FWFBPUlQgdW5zaWduZWQgbG9uZyBGUERGX0NBTExDT05WCitGUERGQWN0aW9uX0dldEZpbGVQYXRoKEZQREZfQUNUSU9OIHBEaWN0LCB2b2lkKiBidWZmZXIsIHVuc2lnbmVkIGxvbmcgYnVmbGVuKSB7CiAgIHVuc2lnbmVkIGxvbmcgdHlwZSA9IEZQREZBY3Rpb25fR2V0VHlwZShwRGljdCk7CiAgIGlmICh0eXBlICE9IFBERkFDVElPTl9SRU1PVEVHT1RPICYmIHR5cGUgIT0gUERGQUNUSU9OX0xBVU5DSCkKICAgICByZXR1cm4gMDsKIAogICBDUERGX0FjdGlvbiBhY3Rpb24oVG9EaWN0aW9uYXJ5KHN0YXRpY19jYXN0PENQREZfT2JqZWN0Kj4ocERpY3QpKSk7Ci0gIENGWF9CeXRlU3RyaW5nIHBhdGggPSBhY3Rpb24uR2V0RmlsZVBhdGgoKS5VVEY4RW5jb2RlKCk7CisgIEJ5dGVTdHJpbmcgcGF0aCA9IGFjdGlvbi5HZXRGaWxlUGF0aCgpLlVURjhFbmNvZGUoKTsKICAgdW5zaWduZWQgbG9uZyBsZW4gPSBwYXRoLkdldExlbmd0aCgpICsgMTsKICAgaWYgKGJ1ZmZlciAmJiBsZW4gPD0gYnVmbGVuKQotICAgIEZYU1lTX21lbWNweShidWZmZXIsIHBhdGguY19zdHIoKSwgbGVuKTsKKyAgICBtZW1jcHkoYnVmZmVyLCBwYXRoLmNfc3RyKCksIGxlbik7CiAgIHJldHVybiBsZW47CiB9CiAKLURMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkFjdGlvbl9HZXRVUklQYXRoKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0FDVElPTiBwRGljdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmbGVuKSB7CitGUERGX0VYUE9SVCB1bnNpZ25lZCBsb25nIEZQREZfQ0FMTENPTlYKK0ZQREZBY3Rpb25fR2V0VVJJUGF0aChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgIEZQREZfQUNUSU9OIHBEaWN0LAorICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1ZmxlbikgewogICBpZiAoIXBEaWN0KQogICAgIHJldHVybiAwOwogICBDUERGX0RvY3VtZW50KiBwRG9jID0gQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChkb2N1bWVudCk7CiAgIGlmICghcERvYykKICAgICByZXR1cm4gMDsKICAgQ1BERl9BY3Rpb24gYWN0aW9uKFRvRGljdGlvbmFyeShzdGF0aWNfY2FzdDxDUERGX09iamVjdCo+KHBEaWN0KSkpOwotICBDRlhfQnl0ZVN0cmluZyBwYXRoID0gYWN0aW9uLkdldFVSSShwRG9jKTsKKyAgQnl0ZVN0cmluZyBwYXRoID0gYWN0aW9uLkdldFVSSShwRG9jKTsKICAgdW5zaWduZWQgbG9uZyBsZW4gPSBwYXRoLkdldExlbmd0aCgpICsgMTsKICAgaWYgKGJ1ZmZlciAmJiBsZW4gPD0gYnVmbGVuKQotICAgIEZYU1lTX21lbWNweShidWZmZXIsIHBhdGguY19zdHIoKSwgbGVuKTsKKyAgICBtZW1jcHkoYnVmZmVyLCBwYXRoLmNfc3RyKCksIGxlbik7CiAgIHJldHVybiBsZW47CiB9CiAKLURMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkRlc3RfR2V0UGFnZUluZGV4KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RFU1QgcERpY3QpIHsKK0ZQREZfRVhQT1JUIHVuc2lnbmVkIGxvbmcgRlBERl9DQUxMQ09OVgorRlBERkRlc3RfR2V0UGFnZUluZGV4KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfREVTVCBwRGljdCkgewogICBpZiAoIXBEaWN0KQogICAgIHJldHVybiAwOwogICBDUERGX0RvY3VtZW50KiBwRG9jID0gQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChkb2N1bWVudCk7CkBAIC0yMjAsMTggKzIxMCwzNiBAQAogICByZXR1cm4gZGVzdC5HZXRQYWdlSW5kZXgocERvYyk7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGRGVzdF9HZXRMb2NhdGlvbkluUGFnZShGUERGX0RFU1QgcERpY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MKiBoYXNYVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCogaGFzWVZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wqIGhhc1pvb21WYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfRkxPQVQqIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfRkxPQVQqIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfRkxPQVQqIHpvb20pIHsKK0ZQREZfRVhQT1JUIHVuc2lnbmVkIGxvbmcgRlBERl9DQUxMQ09OVgorRlBERkRlc3RfR2V0VmlldyhGUERGX0RFU1QgcERpY3QsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcqIHBOdW1QYXJhbXMsCisgICAgICAgICAgICAgICAgIEZTX0ZMT0FUKiBwUGFyYW1zKSB7CisgIGlmICghcERpY3QpIHsKKyAgICAqcE51bVBhcmFtcyA9IDA7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBDUERGX0Rlc3QgZGVzdChzdGF0aWNfY2FzdDxDUERGX0FycmF5Kj4ocERpY3QpKTsKKyAgdW5zaWduZWQgbG9uZyBuUGFyYW1zID0gZGVzdC5HZXROdW1QYXJhbXMoKTsKKyAgQVNTRVJUKG5QYXJhbXMgPD0gNCk7CisgICpwTnVtUGFyYW1zID0gblBhcmFtczsKKyAgZm9yICh1bnNpZ25lZCBsb25nIGkgPSAwOyBpIDwgblBhcmFtczsgKytpKQorICAgIHBQYXJhbXNbaV0gPSBkZXN0LkdldFBhcmFtKGkpOworICByZXR1cm4gZGVzdC5HZXRab29tTW9kZSgpOworfQorCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgorRlBERkRlc3RfR2V0TG9jYXRpb25JblBhZ2UoRlBERl9ERVNUIHBEaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MKiBoYXNYVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MKiBoYXNZVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MKiBoYXNab29tVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfRkxPQVQqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19GTE9BVCogeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX0ZMT0FUKiB6b29tKSB7CiAgIGlmICghcERpY3QpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0Rlc3Q+IGRlc3QoCi0gICAgICBuZXcgQ1BERl9EZXN0KHN0YXRpY19jYXN0PENQREZfT2JqZWN0Kj4ocERpY3QpKSk7CisgIGF1dG8gZGVzdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0Rlc3Q+KHN0YXRpY19jYXN0PENQREZfT2JqZWN0Kj4ocERpY3QpKTsKIAogICAvLyBGUERGX0JPT0wgaXMgYW4gaW50LCBHZXRYWVogZXhwZWN0cyBib29scy4KICAgYm9vbCBiSGFzWDsKQEAgLTI0Niw5ICsyNTQsOSBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotRExMRVhQT1JUIEZQREZfTElOSyBTVERDQUxMIEZQREZMaW5rX0dldExpbmtBdFBvaW50KEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB5KSB7CitGUERGX0VYUE9SVCBGUERGX0xJTksgRlBERl9DQUxMQ09OViBGUERGTGlua19HZXRMaW5rQXRQb2ludChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHkpIHsKICAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOwogICBpZiAoIXBQYWdlKQogICAgIHJldHVybiBudWxscHRyOwpAQCAtMjU4LDE1ICsyNjYsMTUgQEAKICAgICByZXR1cm4gbnVsbHB0cjsKIAogICByZXR1cm4gcExpbmtMaXN0Ci0gICAgICAtPkdldExpbmtBdFBvaW50KAotICAgICAgICAgIHBQYWdlLCBDRlhfUG9pbnRGKHN0YXRpY19jYXN0PEZYX0ZMT0FUPih4KSwgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHkpKSwKLSAgICAgICAgICBudWxscHRyKQorICAgICAgLT5HZXRMaW5rQXRQb2ludChwUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RihzdGF0aWNfY2FzdDxmbG9hdD4oeCksIHN0YXRpY19jYXN0PGZsb2F0Pih5KSksCisgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpCiAgICAgICAuR2V0RGljdCgpOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERkxpbmtfR2V0TGlua1pPcmRlckF0UG9pbnQoRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHkpIHsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZMaW5rX0dldExpbmtaT3JkZXJBdFBvaW50KEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeSkgewogICBDUERGX1BhZ2UqIHBQYWdlID0gQ1BERlBhZ2VGcm9tRlBERlBhZ2UocGFnZSk7CiAgIGlmICghcFBhZ2UpCiAgICAgcmV0dXJuIC0xOwpAQCAtMjc3LDEzICsyODUsMTMgQEAKIAogICBpbnQgel9vcmRlciA9IC0xOwogICBwTGlua0xpc3QtPkdldExpbmtBdFBvaW50KAotICAgICAgcFBhZ2UsIENGWF9Qb2ludEYoc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHgpLCBzdGF0aWNfY2FzdDxGWF9GTE9BVD4oeSkpLAorICAgICAgcFBhZ2UsIENGWF9Qb2ludEYoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHgpLCBzdGF0aWNfY2FzdDxmbG9hdD4oeSkpLAogICAgICAgJnpfb3JkZXIpOwogICByZXR1cm4gel9vcmRlcjsKIH0KIAotRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZMaW5rX0dldERlc3QoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfTElOSyBwRGljdCkgeworRlBERl9FWFBPUlQgRlBERl9ERVNUIEZQREZfQ0FMTENPTlYgRlBERkxpbmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0xJTksgcERpY3QpIHsKICAgaWYgKCFwRGljdCkKICAgICByZXR1cm4gbnVsbHB0cjsKICAgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOwpAQCAtMzAwLDcgKzMwOCw3IEBACiAgIHJldHVybiBhY3Rpb24uR2V0RGVzdChwRG9jKS5HZXRPYmplY3QoKTsKIH0KIAotRExMRVhQT1JUIEZQREZfQUNUSU9OIFNURENBTEwgRlBERkxpbmtfR2V0QWN0aW9uKEZQREZfTElOSyBwRGljdCkgeworRlBERl9FWFBPUlQgRlBERl9BQ1RJT04gRlBERl9DQUxMQ09OViBGUERGTGlua19HZXRBY3Rpb24oRlBERl9MSU5LIHBEaWN0KSB7CiAgIGlmICghcERpY3QpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKQEAgLTMwOCw5ICszMTYsOSBAQAogICByZXR1cm4gbGluay5HZXRBY3Rpb24oKS5HZXREaWN0KCk7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGTGlua19FbnVtZXJhdGUoRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc3RhcnRQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfTElOSyogbGlua0Fubm90KSB7CitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGTGlua19FbnVtZXJhdGUoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzdGFydFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0xJTksqIGxpbmtBbm5vdCkgewogICBpZiAoIXN0YXJ0UG9zIHx8ICFsaW5rQW5ub3QpCiAgICAgcmV0dXJuIGZhbHNlOwogICBDUERGX1BhZ2UqIHBQYWdlID0gQ1BERlBhZ2VGcm9tRlBERlBhZ2UocGFnZSk7CkBAIC0zMzMsMjEgKzM0MSwxNyBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGTGlua19HZXRBbm5vdFJlY3QoRlBERl9MSU5LIGxpbmtBbm5vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfUkVDVEYqIHJlY3QpIHsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZMaW5rX0dldEFubm90UmVjdChGUERGX0xJTksgbGlua0Fubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX1JFQ1RGKiByZWN0KSB7CiAgIGlmICghbGlua0Fubm90IHx8ICFyZWN0KQogICAgIHJldHVybiBmYWxzZTsKICAgQ1BERl9EaWN0aW9uYXJ5KiBwQW5ub3REaWN0ID0KICAgICAgIFRvRGljdGlvbmFyeShzdGF0aWNfY2FzdDxDUERGX09iamVjdCo+KGxpbmtBbm5vdCkpOwotICBDRlhfRmxvYXRSZWN0IHJ0ID0gcEFubm90RGljdC0+R2V0UmVjdEZvcigiUmVjdCIpOwotICByZWN0LT5sZWZ0ID0gcnQubGVmdDsKLSAgcmVjdC0+Ym90dG9tID0gcnQuYm90dG9tOwotICByZWN0LT5yaWdodCA9IHJ0LnJpZ2h0OwotICByZWN0LT50b3AgPSBydC50b3A7CisgIEZTUkVDVEZGcm9tQ0ZYRmxvYXRSZWN0KHBBbm5vdERpY3QtPkdldFJlY3RGb3IoIlJlY3QiKSwgcmVjdCk7CiAgIHJldHVybiB0cnVlOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERkxpbmtfQ291bnRRdWFkUG9pbnRzKEZQREZfTElOSyBsaW5rQW5ub3QpIHsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZMaW5rX0NvdW50UXVhZFBvaW50cyhGUERGX0xJTksgbGlua0Fubm90KSB7CiAgIGlmICghbGlua0Fubm90KQogICAgIHJldHVybiAwOwogICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPQpAQCAtMzU4LDkgKzM2MiwxMCBAQAogICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihwQXJyYXktPkdldENvdW50KCkgLyA4KTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZMaW5rX0dldFF1YWRQb2ludHMoRlBERl9MSU5LIGxpbmtBbm5vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19RVUFEUE9JTlRTRiogcXVhZFBvaW50cykgeworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZMaW5rX0dldFF1YWRQb2ludHMoRlBERl9MSU5LIGxpbmtBbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlNfUVVBRFBPSU5UU0YqIHF1YWRQb2ludHMpIHsKICAgaWYgKCFsaW5rQW5ub3QgfHwgIXF1YWRQb2ludHMpCiAgICAgcmV0dXJuIGZhbHNlOwogICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPQpAQCAtMzg2LDMzICszOTEsMzUgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLURMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERl9HZXRNZXRhVGV4dChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmbGVuKSB7CitGUERGX0VYUE9SVCB1bnNpZ25lZCBsb25nIEZQREZfQ0FMTENPTlYgRlBERl9HZXRNZXRhVGV4dChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmbGVuKSB7CiAgIGlmICghdGFnKQogICAgIHJldHVybiAwOwogICBDUERGX0RvY3VtZW50KiBwRG9jID0gQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChkb2N1bWVudCk7CiAgIGlmICghcERvYykKICAgICByZXR1cm4gMDsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBwSW5mbyA9IHBEb2MtPkdldEluZm8oKTsKKyAgcERvYy0+TG9hZERvY3VtZW50SW5mbygpOworICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBJbmZvID0gcERvYy0+R2V0SW5mbygpOwogICBpZiAoIXBJbmZvKQogICAgIHJldHVybiAwOwotICBDRlhfV2lkZVN0cmluZyB0ZXh0ID0gcEluZm8tPkdldFVuaWNvZGVUZXh0Rm9yKHRhZyk7CisgIFdpZGVTdHJpbmcgdGV4dCA9IHBJbmZvLT5HZXRVbmljb2RlVGV4dEZvcih0YWcpOwogICByZXR1cm4gVXRmMTZFbmNvZGVNYXliZUNvcHlBbmRSZXR1cm5MZW5ndGgodGV4dCwgYnVmZmVyLCBidWZsZW4pOwogfQogCi1ETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZfR2V0UGFnZUxhYmVsKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWdlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmbGVuKSB7CitGUERGX0VYUE9SVCB1bnNpZ25lZCBsb25nIEZQREZfQ0FMTENPTlYKK0ZQREZfR2V0UGFnZUxhYmVsKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICBpbnQgcGFnZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmbGVuKSB7CiAgIGlmIChwYWdlX2luZGV4IDwgMCkKICAgICByZXR1cm4gMDsKIAogICAvLyBDUERGX1BhZ2VMYWJlbCBjYW4gZGVhbCB3aXRoIE5VTEwgfGRvY3VtZW50fC4KICAgQ1BERl9QYWdlTGFiZWwgbGFiZWwoQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChkb2N1bWVudCkpOwotICBDRlhfV2lkZVN0cmluZyBzdHI7Ci0gIGlmICghbGFiZWwuR2V0TGFiZWwocGFnZV9pbmRleCwgJnN0cikpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBVdGYxNkVuY29kZU1heWJlQ29weUFuZFJldHVybkxlbmd0aChzdHIsIGJ1ZmZlciwgYnVmbGVuKTsKKyAgT3B0aW9uYWw8V2lkZVN0cmluZz4gc3RyID0gbGFiZWwuR2V0TGFiZWwocGFnZV9pbmRleCk7CisgIHJldHVybiBzdHIuaGFzX3ZhbHVlKCkKKyAgICAgICAgICAgICA/IFV0ZjE2RW5jb2RlTWF5YmVDb3B5QW5kUmV0dXJuTGVuZ3RoKHN0ci52YWx1ZSgpLCBidWZmZXIsIGJ1ZmxlbikKKyAgICAgICAgICAgICA6IDA7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZkb2NfZW1iZWRkZXJ0ZXN0LmNwcCBiL2ZwZGZzZGsvZnBkZmRvY19lbWJlZGRlcnRlc3QuY3BwCmluZGV4IDM2NjY2ODcuLmQzNDYzMzAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvZnBkZmRvY19lbWJlZGRlcnRlc3QuY3BwCisrKyBiL2ZwZGZzZGsvZnBkZmRvY19lbWJlZGRlcnRlc3QuY3BwCkBAIC0xMCw3ICsxMCw2IEBACiAjaW5jbHVkZSAicHVibGljL2ZwZGZfZWRpdC5oIgogI2luY2x1ZGUgInB1YmxpYy9mcGRmdmlldy5oIgogI2luY2x1ZGUgInRlc3RpbmcvZW1iZWRkZXJfdGVzdC5oIgotI2luY2x1ZGUgInRlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAjaW5jbHVkZSAidGVzdGluZy90ZXN0X3N1cHBvcnQuaCIKIApAQCAtNDMsNiArNDIsNjUgQEAKICAgRVhQRUNUX0VRKDBVLCBGUERGRGVzdF9HZXRQYWdlSW5kZXgoZG9jdW1lbnQoKSwgZGVzdCkpOwogfQogCitURVNUX0YoRlBERkRvY0VtYmVkZGVydGVzdCwgRGVzdEdldFZpZXcpIHsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJuYW1lZF9kZXN0cy5wZGYiKSk7CisKKyAgdW5zaWduZWQgbG9uZyBudW1QYXJhbXM7CisgIEZTX0ZMT0FUIHBhcmFtc1s0XTsKKworICBudW1QYXJhbXMgPSA0MjsKKyAgc3RkOjpmaWxsX24ocGFyYW1zLCA0LCA0Mi40MjQyZik7CisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihQREZERVNUX1ZJRVdfVU5LTk9XTl9NT0RFKSwKKyAgICAgICAgICAgIEZQREZEZXN0X0dldFZpZXcobnVsbHB0ciwgJm51bVBhcmFtcywgcGFyYW1zKSk7CisgIEVYUEVDVF9FUSgwVSwgbnVtUGFyYW1zKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDQyLjQyNDJmLCBwYXJhbXNbMF0pOworCisgIG51bVBhcmFtcyA9IDQyOworICBzdGQ6OmZpbGxfbihwYXJhbXMsIDQsIDQyLjQyNDJmKTsKKyAgRlBERl9ERVNUIGRlc3QgPSBGUERGX0dldE5hbWVkRGVzdEJ5TmFtZShkb2N1bWVudCgpLCAiRmlyc3QiKTsKKyAgRVhQRUNUX1RSVUUoZGVzdCk7CisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihQREZERVNUX1ZJRVdfWFlaKSwKKyAgICAgICAgICAgIEZQREZEZXN0X0dldFZpZXcoZGVzdCwgJm51bVBhcmFtcywgcGFyYW1zKSk7CisgIEVYUEVDVF9FUSgzVSwgbnVtUGFyYW1zKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDAsIHBhcmFtc1swXSk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLCBwYXJhbXNbMV0pOworICBFWFBFQ1RfRkxPQVRfRVEoMSwgcGFyYW1zWzJdKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDQyLjQyNDJmLCBwYXJhbXNbM10pOworCisgIG51bVBhcmFtcyA9IDQyOworICBzdGQ6OmZpbGxfbihwYXJhbXMsIDQsIDQyLjQyNDJmKTsKKyAgZGVzdCA9IEZQREZfR2V0TmFtZWREZXN0QnlOYW1lKGRvY3VtZW50KCksICJOZXh0Iik7CisgIEVYUEVDVF9UUlVFKGRlc3QpOworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oUERGREVTVF9WSUVXX0ZJVCksCisgICAgICAgICAgICBGUERGRGVzdF9HZXRWaWV3KGRlc3QsICZudW1QYXJhbXMsIHBhcmFtcykpOworICBFWFBFQ1RfRVEoMFUsIG51bVBhcmFtcyk7CisgIEVYUEVDVF9GTE9BVF9FUSg0Mi40MjQyZiwgcGFyYW1zWzBdKTsKKworICBudW1QYXJhbXMgPSA0MjsKKyAgc3RkOjpmaWxsX24ocGFyYW1zLCA0LCA0Mi40MjQyZik7CisgIGRlc3QgPSBGUERGX0dldE5hbWVkRGVzdEJ5TmFtZShkb2N1bWVudCgpLCAiRmlyc3RBbHRlcm5hdGUiKTsKKyAgRVhQRUNUX1RSVUUoZGVzdCk7CisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nPihQREZERVNUX1ZJRVdfWFlaKSwKKyAgICAgICAgICAgIEZQREZEZXN0X0dldFZpZXcoZGVzdCwgJm51bVBhcmFtcywgcGFyYW1zKSk7CisgIEVYUEVDVF9FUSgzVSwgbnVtUGFyYW1zKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDIwMCwgcGFyYW1zWzBdKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDQwMCwgcGFyYW1zWzFdKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDgwMCwgcGFyYW1zWzJdKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDQyLjQyNDJmLCBwYXJhbXNbM10pOworCisgIG51bVBhcmFtcyA9IDQyOworICBzdGQ6OmZpbGxfbihwYXJhbXMsIDQsIDQyLjQyNDJmKTsKKyAgZGVzdCA9IEZQREZfR2V0TmFtZWREZXN0QnlOYW1lKGRvY3VtZW50KCksICJMYXN0QWx0ZXJuYXRlIik7CisgIEVYUEVDVF9UUlVFKGRlc3QpOworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4oUERGREVTVF9WSUVXX1hZWiksCisgICAgICAgICAgICBGUERGRGVzdF9HZXRWaWV3KGRlc3QsICZudW1QYXJhbXMsIHBhcmFtcykpOworICBFWFBFQ1RfRVEoM1UsIG51bVBhcmFtcyk7CisgIEVYUEVDVF9GTE9BVF9FUSgwLCBwYXJhbXNbMF0pOworICBFWFBFQ1RfRkxPQVRfRVEoMCwgcGFyYW1zWzFdKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKC0yMDAsIHBhcmFtc1syXSk7CisgIEVYUEVDVF9GTE9BVF9FUSg0Mi40MjQyZiwgcGFyYW1zWzNdKTsKK30KKwogVEVTVF9GKEZQREZEb2NFbWJlZGRlcnRlc3QsIERlc3RHZXRMb2NhdGlvbkluUGFnZSkgewogICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoIm5hbWVkX2Rlc3RzLnBkZiIpKTsKIApAQCAtMTI2LDE2ICsxODQsMTQgQEAKICAgRlBERl9CT09LTUFSSyBjaGlsZCA9IEZQREZCb29rbWFya19HZXRGaXJzdENoaWxkKGRvY3VtZW50KCksIG51bGxwdHIpOwogICBFWFBFQ1RfVFJVRShjaGlsZCk7CiAgIEVYUEVDVF9FUSgzNHUsIEZQREZCb29rbWFya19HZXRUaXRsZShjaGlsZCwgYnVmLCBzaXplb2YoYnVmKSkpOwotICBFWFBFQ1RfRVEoQ0ZYX1dpZGVTdHJpbmcoTCJBIEdvb2QgQmVnaW5uaW5nIiksCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoYnVmLCAxNikpOworICBFWFBFQ1RfRVEoV2lkZVN0cmluZyhMIkEgR29vZCBCZWdpbm5pbmciKSwgV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoYnVmLCAxNikpOwogCiAgIEVYUEVDVF9FUShudWxscHRyLCBGUERGQm9va21hcmtfR2V0Rmlyc3RDaGlsZChkb2N1bWVudCgpLCBjaGlsZCkpOwogCiAgIEZQREZfQk9PS01BUksgc2libGluZyA9IEZQREZCb29rbWFya19HZXROZXh0U2libGluZyhkb2N1bWVudCgpLCBjaGlsZCk7CiAgIEVYUEVDVF9UUlVFKHNpYmxpbmcpOwogICBFWFBFQ1RfRVEoMjh1LCBGUERGQm9va21hcmtfR2V0VGl0bGUoc2libGluZywgYnVmLCBzaXplb2YoYnVmKSkpOwotICBFWFBFQ1RfRVEoQ0ZYX1dpZGVTdHJpbmcoTCJBIEdvb2QgRW5kaW5nIiksCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoYnVmLCAxMykpOworICBFWFBFQ1RfRVEoV2lkZVN0cmluZyhMIkEgR29vZCBFbmRpbmciKSwgV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoYnVmLCAxMykpOwogCiAgIEVYUEVDVF9FUShudWxscHRyLCBGUERGQm9va21hcmtfR2V0TmV4dFNpYmxpbmcoZG9jdW1lbnQoKSwgc2libGluZykpOwogfQpAQCAtMTUzLDggKzIwOSw3IEBACiAgIC8vIENoZWNrIHRoYXQgdGhlIHN0cmluZyBtYXRjaGVzLgogICB1bnNpZ25lZCBzaG9ydCBidWZbMTI4XTsKICAgRVhQRUNUX0VRKDM0dSwgRlBERkJvb2ttYXJrX0dldFRpdGxlKGNoaWxkLCBidWYsIHNpemVvZihidWYpKSk7Ci0gIEVYUEVDVF9FUShDRlhfV2lkZVN0cmluZyhMIkEgR29vZCBCZWdpbm5pbmciKSwKLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGMTZMRShidWYsIDE2KSk7CisgIEVYUEVDVF9FUShXaWRlU3RyaW5nKEwiQSBHb29kIEJlZ2lubmluZyIpLCBXaWRlU3RyaW5nOjpGcm9tVVRGMTZMRShidWYsIDE2KSk7CiAKICAgLy8gQ2hlY2sgdGhhdCBpdCBpcyB0aGVtIHNhbWUgYXMgdGhlIG9uZSByZXR1cm5lZCBieSBHZXRGaXJzdENoaWxkLgogICBFWFBFQ1RfRVEoY2hpbGQsIEZQREZCb29rbWFya19HZXRGaXJzdENoaWxkKGRvY3VtZW50KCksIG51bGxwdHIpKTsKQEAgLTE4Myw2ICsyMzgsNzEgQEAKICAgRVhQRUNUX0VRKDAsIEZQREZfR2V0UGFnZUNvdW50KGRvY3VtZW50KCkpKTsKIH0KIAorVEVTVF9GKEZQREZEb2NFbWJlZGRlcnRlc3QsIEdldE1ldGFUZXh0KSB7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiYnVnXzYwMTM2Mi5wZGYiKSk7CisKKyAgLy8gSW52YWxpZCBkb2N1bWVudCAvIHRhZyByZXN1bHRzIGluIDAuCisgIHVuc2lnbmVkIHNob3J0IGJ1ZlsxMjhdOworICBFWFBFQ1RfRVEoMHUsIEZQREZfR2V0TWV0YVRleHQoZG9jdW1lbnQoKSwgbnVsbHB0ciwgYnVmLCBzaXplb2YoYnVmKSkpOworICBFWFBFQ1RfRVEoMHUsIEZQREZfR2V0TWV0YVRleHQobnVsbHB0ciwgIiIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKKworICAvLyBUYWdzIHRoYXQgZG8gbm90IGVpeHN0IHJlc3VsdHMgaW4gYW4gZW1wdHkgd2lkZSBzdHJpbmcuCisgIEVYUEVDVF9FUSgydSwgRlBERl9HZXRNZXRhVGV4dChkb2N1bWVudCgpLCAiIiwgYnVmLCBzaXplb2YoYnVmKSkpOworICBFWFBFQ1RfRVEoMnUsIEZQREZfR2V0TWV0YVRleHQoZG9jdW1lbnQoKSwgImZvbyIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKKyAgQVNTRVJUX0VRKDJ1LCBGUERGX0dldE1ldGFUZXh0KGRvY3VtZW50KCksICJUaXRsZSIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKKyAgQVNTRVJUX0VRKDJ1LCBGUERGX0dldE1ldGFUZXh0KGRvY3VtZW50KCksICJBdXRob3IiLCBidWYsIHNpemVvZihidWYpKSk7CisgIEFTU0VSVF9FUSgydSwgRlBERl9HZXRNZXRhVGV4dChkb2N1bWVudCgpLCAiU3ViamVjdCIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKKyAgQVNTRVJUX0VRKDJ1LCBGUERGX0dldE1ldGFUZXh0KGRvY3VtZW50KCksICJLZXl3b3JkcyIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKKyAgQVNTRVJUX0VRKDJ1LCBGUERGX0dldE1ldGFUZXh0KGRvY3VtZW50KCksICJQcm9kdWNlciIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKKworICBjb25zdGV4cHIgd2NoYXJfdCBrRXhwZWN0ZWRDcmVhdG9yW10gPSBMIk1pY3Jvc29mdCBXb3JkIjsKKyAgQVNTRVJUX0VRKDMwdSwgRlBERl9HZXRNZXRhVGV4dChkb2N1bWVudCgpLCAiQ3JlYXRvciIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKKyAgRVhQRUNUX0VRKFdpZGVTdHJpbmcoa0V4cGVjdGVkQ3JlYXRvciksCisgICAgICAgICAgICBXaWRlU3RyaW5nOjpGcm9tVVRGMTZMRShidWYsIEZYU1lTX2xlbihrRXhwZWN0ZWRDcmVhdG9yKSkpOworCisgIGNvbnN0ZXhwciB3Y2hhcl90IGtFeHBlY3RlZENyZWF0aW9uRGF0ZVtdID0gTCJEOjIwMTYwNDExMTkwMDM5KzAwJzAwJyI7CisgIEFTU0VSVF9FUSg0OHUsCisgICAgICAgICAgICBGUERGX0dldE1ldGFUZXh0KGRvY3VtZW50KCksICJDcmVhdGlvbkRhdGUiLCBidWYsIHNpemVvZihidWYpKSk7CisgIEVYUEVDVF9FUShXaWRlU3RyaW5nKGtFeHBlY3RlZENyZWF0aW9uRGF0ZSksCisgICAgICAgICAgICBXaWRlU3RyaW5nOjpGcm9tVVRGMTZMRShidWYsIEZYU1lTX2xlbihrRXhwZWN0ZWRDcmVhdGlvbkRhdGUpKSk7CisKKyAgY29uc3RleHByIHdjaGFyX3Qga0V4cGVjdGVkTW9kRGF0ZVtdID0gTCJEOjIwMTYwNDExMTkwMDM5KzAwJzAwJyI7CisgIEFTU0VSVF9FUSg0OHUsIEZQREZfR2V0TWV0YVRleHQoZG9jdW1lbnQoKSwgIk1vZERhdGUiLCBidWYsIHNpemVvZihidWYpKSk7CisgIEVYUEVDVF9FUShXaWRlU3RyaW5nKGtFeHBlY3RlZE1vZERhdGUpLAorICAgICAgICAgICAgV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoYnVmLCBGWFNZU19sZW4oa0V4cGVjdGVkTW9kRGF0ZSkpKTsKK30KKworVEVTVF9GKEZQREZEb2NFbWJlZGRlcnRlc3QsIEdldE1ldGFUZXh0U2FtZU9iamVjdE51bWJlcikgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoImFubm90YXRpb25faGlnaGxpZ2h0X3NxdWFyZV93aXRoX2FwLnBkZiIpKTsKKworICAvLyBUaGUgUERGIGhhcyBiZWVuIGVkaXRlZC4gSXQgaGFzIHR3byAlJUVPRiBtYXJrZXJzLCBhbmQgMiBvYmplY3RzIG51bWJlcmVkCisgIC8vICgxIDApLiBCb3RoIG9iamVjdHMgYXJlIC9JbmZvIGRpY3Rpb25hcmllcywgYnV0IGNvbnRhaW4gZGlmZmVyZW50IGRhdGEuCisgIC8vIE1ha2Ugc3VyZSBNb2REYXRlIGlzIHRoZSBkYXRlIG9mIHRoZSBsYXN0IG1vZGlmaWNhdGlvbi4KKyAgdW5zaWduZWQgc2hvcnQgYnVmWzEyOF07CisgIGNvbnN0ZXhwciB3Y2hhcl90IGtFeHBlY3RlZE1vZERhdGVbXSA9IEwiRDoyMDE3MDYxMjIzMjk0MC0wNCcwMCciOworICBBU1NFUlRfRVEoNDh1LCBGUERGX0dldE1ldGFUZXh0KGRvY3VtZW50KCksICJNb2REYXRlIiwgYnVmLCBzaXplb2YoYnVmKSkpOworICBFWFBFQ1RfRVEoV2lkZVN0cmluZyhrRXhwZWN0ZWRNb2REYXRlKSwKKyAgICAgICAgICAgIFdpZGVTdHJpbmc6OkZyb21VVEYxNkxFKGJ1ZiwgRlhTWVNfbGVuKGtFeHBlY3RlZE1vZERhdGUpKSk7Cit9CisKK1RFU1RfRihGUERGRG9jRW1iZWRkZXJ0ZXN0LCBHZXRNZXRhVGV4dEluQXR0YWNobWVudEZpbGUpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJlbWJlZGRlZF9hdHRhY2htZW50cy5wZGYiKSk7CisKKyAgLy8gTWFrZSBzdXJlIHRoaXMgaXMgdGhlIGRhdGUgZnJvbSB0aGUgUERGIGl0c2VsZiBhbmQgbm90IHRoZSBhdHRhY2hlZCBQREYuCisgIHVuc2lnbmVkIHNob3J0IGJ1ZlsxMjhdOworICBjb25zdGV4cHIgd2NoYXJfdCBrRXhwZWN0ZWRNb2REYXRlW10gPSBMIkQ6MjAxNzA3MTIyMTQ0NDgtMDcnMDAnIjsKKyAgQVNTRVJUX0VRKDQ4dSwgRlBERl9HZXRNZXRhVGV4dChkb2N1bWVudCgpLCAiTW9kRGF0ZSIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKKyAgRVhQRUNUX0VRKFdpZGVTdHJpbmcoa0V4cGVjdGVkTW9kRGF0ZSksCisgICAgICAgICAgICBXaWRlU3RyaW5nOjpGcm9tVVRGMTZMRShidWYsIEZYU1lTX2xlbihrRXhwZWN0ZWRNb2REYXRlKSkpOworfQorCitURVNUX0YoRlBERkRvY0VtYmVkZGVydGVzdCwgR2V0TWV0YVRleHRGcm9tTmV3RG9jdW1lbnQpIHsKKyAgRlBERl9ET0NVTUVOVCBlbXB0eV9kb2MgPSBGUERGX0NyZWF0ZU5ld0RvY3VtZW50KCk7CisgIHVuc2lnbmVkIHNob3J0IGJ1ZlsxMjhdOworICBFWFBFQ1RfRVEoMnUsIEZQREZfR2V0TWV0YVRleHQoZW1wdHlfZG9jLCAiVGl0bGUiLCBidWYsIHNpemVvZihidWYpKSk7CisgIEZQREZfQ2xvc2VEb2N1bWVudChlbXB0eV9kb2MpOworfQorCiBURVNUX0YoRlBERkRvY0VtYmVkZGVydGVzdCwgTm9QYWdlTGFiZWxzKSB7CiAgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgiYWJvdXRfYmxhbmsucGRmIikpOwogICBFWFBFQ1RfRVEoMSwgRlBERl9HZXRQYWdlQ291bnQoZG9jdW1lbnQoKSkpOwpAQCAtMTk0LDQ0ICszMTQsNDggQEAKICAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJwYWdlX2xhYmVscy5wZGYiKSk7CiAgIEVYUEVDVF9FUSg3LCBGUERGX0dldFBhZ2VDb3VudChkb2N1bWVudCgpKSk7CiAKKyAgLy8gV2UgZG8gbm90IHJlcXVlc3QgbGFiZWxzLCB3aGVuIHVzZSBGUERGQXZhaWxfSXNYWFhBdmFpbC4KKyAgLy8gRmx1c2ggYWxsIGRhdGEsIHRvIGFsbG93IHJlYWQgbGFiZWxzLgorICBTZXRXaG9sZUZpbGVBdmFpbGFibGUoKTsKKwogICB1bnNpZ25lZCBzaG9ydCBidWZbMTI4XTsKICAgRVhQRUNUX0VRKDB1LCBGUERGX0dldFBhZ2VMYWJlbChkb2N1bWVudCgpLCAtMiwgYnVmLCBzaXplb2YoYnVmKSkpOwogICBFWFBFQ1RfRVEoMHUsIEZQREZfR2V0UGFnZUxhYmVsKGRvY3VtZW50KCksIC0xLCBidWYsIHNpemVvZihidWYpKSk7CiAKLSAgY29uc3QgRlhfV0NIQVIga0V4cGVjdGVkUGFnZUxhYmVsMFtdID0gTCJpIjsKKyAgY29uc3Qgd2NoYXJfdCBrRXhwZWN0ZWRQYWdlTGFiZWwwW10gPSBMImkiOwogICBBU1NFUlRfRVEoNHUsIEZQREZfR2V0UGFnZUxhYmVsKGRvY3VtZW50KCksIDAsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKLSAgRVhQRUNUX0VRKENGWF9XaWRlU3RyaW5nKGtFeHBlY3RlZFBhZ2VMYWJlbDApLAotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKGJ1ZiwgRlhTWVNfbGVuKGtFeHBlY3RlZFBhZ2VMYWJlbDApKSk7CisgIEVYUEVDVF9FUShXaWRlU3RyaW5nKGtFeHBlY3RlZFBhZ2VMYWJlbDApLAorICAgICAgICAgICAgV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoYnVmLCBGWFNZU19sZW4oa0V4cGVjdGVkUGFnZUxhYmVsMCkpKTsKIAotICBjb25zdCBGWF9XQ0hBUiBrRXhwZWN0ZWRQYWdlTGFiZWwxW10gPSBMImlpIjsKKyAgY29uc3Qgd2NoYXJfdCBrRXhwZWN0ZWRQYWdlTGFiZWwxW10gPSBMImlpIjsKICAgQVNTRVJUX0VRKDZ1LCBGUERGX0dldFBhZ2VMYWJlbChkb2N1bWVudCgpLCAxLCBidWYsIHNpemVvZihidWYpKSk7Ci0gIEVYUEVDVF9FUShDRlhfV2lkZVN0cmluZyhrRXhwZWN0ZWRQYWdlTGFiZWwxKSwKLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGMTZMRShidWYsIEZYU1lTX2xlbihrRXhwZWN0ZWRQYWdlTGFiZWwxKSkpOworICBFWFBFQ1RfRVEoV2lkZVN0cmluZyhrRXhwZWN0ZWRQYWdlTGFiZWwxKSwKKyAgICAgICAgICAgIFdpZGVTdHJpbmc6OkZyb21VVEYxNkxFKGJ1ZiwgRlhTWVNfbGVuKGtFeHBlY3RlZFBhZ2VMYWJlbDEpKSk7CiAKLSAgY29uc3QgRlhfV0NIQVIga0V4cGVjdGVkUGFnZUxhYmVsMltdID0gTCIxIjsKKyAgY29uc3Qgd2NoYXJfdCBrRXhwZWN0ZWRQYWdlTGFiZWwyW10gPSBMIjEiOwogICBBU1NFUlRfRVEoNHUsIEZQREZfR2V0UGFnZUxhYmVsKGRvY3VtZW50KCksIDIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKLSAgRVhQRUNUX0VRKENGWF9XaWRlU3RyaW5nKGtFeHBlY3RlZFBhZ2VMYWJlbDIpLAotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEYxNkxFKGJ1ZiwgRlhTWVNfbGVuKGtFeHBlY3RlZFBhZ2VMYWJlbDIpKSk7CisgIEVYUEVDVF9FUShXaWRlU3RyaW5nKGtFeHBlY3RlZFBhZ2VMYWJlbDIpLAorICAgICAgICAgICAgV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoYnVmLCBGWFNZU19sZW4oa0V4cGVjdGVkUGFnZUxhYmVsMikpKTsKIAotICBjb25zdCBGWF9XQ0hBUiBrRXhwZWN0ZWRQYWdlTGFiZWwzW10gPSBMIjIiOworICBjb25zdCB3Y2hhcl90IGtFeHBlY3RlZFBhZ2VMYWJlbDNbXSA9IEwiMiI7CiAgIEFTU0VSVF9FUSg0dSwgRlBERl9HZXRQYWdlTGFiZWwoZG9jdW1lbnQoKSwgMywgYnVmLCBzaXplb2YoYnVmKSkpOwotICBFWFBFQ1RfRVEoQ0ZYX1dpZGVTdHJpbmcoa0V4cGVjdGVkUGFnZUxhYmVsMyksCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoYnVmLCBGWFNZU19sZW4oa0V4cGVjdGVkUGFnZUxhYmVsMykpKTsKKyAgRVhQRUNUX0VRKFdpZGVTdHJpbmcoa0V4cGVjdGVkUGFnZUxhYmVsMyksCisgICAgICAgICAgICBXaWRlU3RyaW5nOjpGcm9tVVRGMTZMRShidWYsIEZYU1lTX2xlbihrRXhwZWN0ZWRQYWdlTGFiZWwzKSkpOwogCi0gIGNvbnN0IEZYX1dDSEFSIGtFeHBlY3RlZFBhZ2VMYWJlbDRbXSA9IEwienpBIjsKKyAgY29uc3Qgd2NoYXJfdCBrRXhwZWN0ZWRQYWdlTGFiZWw0W10gPSBMInp6QSI7CiAgIEFTU0VSVF9FUSg4dSwgRlBERl9HZXRQYWdlTGFiZWwoZG9jdW1lbnQoKSwgNCwgYnVmLCBzaXplb2YoYnVmKSkpOwotICBFWFBFQ1RfRVEoQ0ZYX1dpZGVTdHJpbmcoa0V4cGVjdGVkUGFnZUxhYmVsNCksCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoYnVmLCBGWFNZU19sZW4oa0V4cGVjdGVkUGFnZUxhYmVsNCkpKTsKKyAgRVhQRUNUX0VRKFdpZGVTdHJpbmcoa0V4cGVjdGVkUGFnZUxhYmVsNCksCisgICAgICAgICAgICBXaWRlU3RyaW5nOjpGcm9tVVRGMTZMRShidWYsIEZYU1lTX2xlbihrRXhwZWN0ZWRQYWdlTGFiZWw0KSkpOwogCi0gIGNvbnN0IEZYX1dDSEFSIGtFeHBlY3RlZFBhZ2VMYWJlbDVbXSA9IEwienpCIjsKKyAgY29uc3Qgd2NoYXJfdCBrRXhwZWN0ZWRQYWdlTGFiZWw1W10gPSBMInp6QiI7CiAgIEFTU0VSVF9FUSg4dSwgRlBERl9HZXRQYWdlTGFiZWwoZG9jdW1lbnQoKSwgNSwgYnVmLCBzaXplb2YoYnVmKSkpOwotICBFWFBFQ1RfRVEoQ0ZYX1dpZGVTdHJpbmcoa0V4cGVjdGVkUGFnZUxhYmVsNSksCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoYnVmLCBGWFNZU19sZW4oa0V4cGVjdGVkUGFnZUxhYmVsNSkpKTsKKyAgRVhQRUNUX0VRKFdpZGVTdHJpbmcoa0V4cGVjdGVkUGFnZUxhYmVsNSksCisgICAgICAgICAgICBXaWRlU3RyaW5nOjpGcm9tVVRGMTZMRShidWYsIEZYU1lTX2xlbihrRXhwZWN0ZWRQYWdlTGFiZWw1KSkpOwogCi0gIGNvbnN0IEZYX1dDSEFSIGtFeHBlY3RlZFBhZ2VMYWJlbDZbXSA9IEwiIjsKKyAgY29uc3Qgd2NoYXJfdCBrRXhwZWN0ZWRQYWdlTGFiZWw2W10gPSBMIiI7CiAgIEFTU0VSVF9FUSgydSwgRlBERl9HZXRQYWdlTGFiZWwoZG9jdW1lbnQoKSwgNiwgYnVmLCBzaXplb2YoYnVmKSkpOwotICBFWFBFQ1RfRVEoQ0ZYX1dpZGVTdHJpbmcoa0V4cGVjdGVkUGFnZUxhYmVsNiksCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoYnVmLCBGWFNZU19sZW4oa0V4cGVjdGVkUGFnZUxhYmVsNikpKTsKKyAgRVhQRUNUX0VRKFdpZGVTdHJpbmcoa0V4cGVjdGVkUGFnZUxhYmVsNiksCisgICAgICAgICAgICBXaWRlU3RyaW5nOjpGcm9tVVRGMTZMRShidWYsIEZYU1lTX2xlbihrRXhwZWN0ZWRQYWdlTGFiZWw2KSkpOwogCiAgIEFTU0VSVF9FUSgwdSwgRlBERl9HZXRQYWdlTGFiZWwoZG9jdW1lbnQoKSwgNywgYnVmLCBzaXplb2YoYnVmKSkpOwogICBBU1NFUlRfRVEoMHUsIEZQREZfR2V0UGFnZUxhYmVsKGRvY3VtZW50KCksIDgsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnBkZmRvY191bml0dGVzdC5jcHAgYi9mcGRmc2RrL2ZwZGZkb2NfdW5pdHRlc3QuY3BwCmluZGV4IGM2M2Q2YzIuLmI1MmNjY2YgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvZnBkZmRvY191bml0dGVzdC5jcHAKKysrIGIvZnBkZnNkay9mcGRmZG9jX3VuaXR0ZXN0LmNwcApAQCAtNTgsMTAgKzU4LDcgQEAKICAgfTsKIAogICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIC8vIFdlIGRvbid0IG5lZWQgcGFnZSBtb2R1bGUgb3IgcmVuZGVyIG1vZHVsZSwgYnV0Ci0gICAgLy8gaW5pdGlhbGl6ZSB0aGVtIHRvIGtlZXAgdGhlIGNvZGUgc2FuZS4KLSAgICBDUERGX01vZHVsZU1nciogbW9kdWxlX21nciA9IENQREZfTW9kdWxlTWdyOjpHZXQoKTsKLSAgICBtb2R1bGVfbWdyLT5Jbml0UGFnZU1vZHVsZSgpOworICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+SW5pdCgpOwogCiAgICAgbV9wRG9jID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfVGVzdFBkZkRvY3VtZW50PigpOwogICAgIG1fcEluZGlyZWN0T2JqcyA9IG1fcERvYy0+R2V0SG9sZGVyKCk7CkBAIC05MCw3ICs4Nyw3IEBACiAKICBwcm90ZWN0ZWQ6CiAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1Rlc3RQZGZEb2N1bWVudD4gbV9wRG9jOwotICBDUERGX0luZGlyZWN0T2JqZWN0SG9sZGVyKiBtX3BJbmRpcmVjdE9ianM7CisgIFVub3duZWRQdHI8Q1BERl9JbmRpcmVjdE9iamVjdEhvbGRlcj4gbV9wSW5kaXJlY3RPYmpzOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9EaWN0aW9uYXJ5PiBtX3BSb290T2JqOwogfTsKIApAQCAtMTE5LDI1ICsxMTYsMjUgQEAKICAgICBhdXRvIGJvb2ttYXJrcyA9IENyZWF0ZURpY3RPYmpzKDMpOwogCiAgICAgYm9va21hcmtzWzFdLm9iai0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigiVGl0bGUiLCBMIkNoYXB0ZXIgMSIpOwotICAgIGJvb2ttYXJrc1sxXS5vYmotPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIlBhcmVudCIsIG1fcEluZGlyZWN0T2JqcywKKyAgICBib29rbWFya3NbMV0ub2JqLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJQYXJlbnQiLCBtX3BJbmRpcmVjdE9ianMuR2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29rbWFya3NbMF0ubnVtKTsKLSAgICBib29rbWFya3NbMV0ub2JqLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJOZXh0IiwgbV9wSW5kaXJlY3RPYmpzLAorICAgIGJvb2ttYXJrc1sxXS5vYmotPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIk5leHQiLCBtX3BJbmRpcmVjdE9ianMuR2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29rbWFya3NbMl0ubnVtKTsKIAogICAgIGJvb2ttYXJrc1syXS5vYmotPlNldE5ld0ZvcjxDUERGX1N0cmluZz4oIlRpdGxlIiwgTCJDaGFwdGVyIDIiKTsKLSAgICBib29rbWFya3NbMl0ub2JqLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJQYXJlbnQiLCBtX3BJbmRpcmVjdE9ianMsCisgICAgYm9va21hcmtzWzJdLm9iai0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiUGFyZW50IiwgbV9wSW5kaXJlY3RPYmpzLkdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9va21hcmtzWzBdLm51bSk7Ci0gICAgYm9va21hcmtzWzJdLm9iai0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiUHJldiIsIG1fcEluZGlyZWN0T2JqcywKKyAgICBib29rbWFya3NbMl0ub2JqLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJQcmV2IiwgbV9wSW5kaXJlY3RPYmpzLkdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9va21hcmtzWzFdLm51bSk7CiAKICAgICBib29rbWFya3NbMF0ub2JqLT5TZXROZXdGb3I8Q1BERl9OYW1lPigiVHlwZSIsICJPdXRsaW5lcyIpOwogICAgIGJvb2ttYXJrc1swXS5vYmotPlNldE5ld0ZvcjxDUERGX051bWJlcj4oIkNvdW50IiwgMik7Ci0gICAgYm9va21hcmtzWzBdLm9iai0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiRmlyc3QiLCBtX3BJbmRpcmVjdE9ianMsCisgICAgYm9va21hcmtzWzBdLm9iai0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiRmlyc3QiLCBtX3BJbmRpcmVjdE9ianMuR2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29rbWFya3NbMV0ubnVtKTsKLSAgICBib29rbWFya3NbMF0ub2JqLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJMYXN0IiwgbV9wSW5kaXJlY3RPYmpzLAorICAgIGJvb2ttYXJrc1swXS5vYmotPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIkxhc3QiLCBtX3BJbmRpcmVjdE9ianMuR2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29rbWFya3NbMl0ubnVtKTsKIAotICAgIG1fcFJvb3RPYmotPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIk91dGxpbmVzIiwgbV9wSW5kaXJlY3RPYmpzLAorICAgIG1fcFJvb3RPYmotPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIk91dGxpbmVzIiwgbV9wSW5kaXJlY3RPYmpzLkdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9va21hcmtzWzBdLm51bSk7CiAKICAgICAvLyBUaXRsZSB3aXRoIG5vIG1hdGNoLgpAQCAtMTYyLDI1ICsxNTksMjUgQEAKICAgICBhdXRvIGJvb2ttYXJrcyA9IENyZWF0ZURpY3RPYmpzKDMpOwogCiAgICAgYm9va21hcmtzWzFdLm9iai0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigiVGl0bGUiLCBMIkNoYXB0ZXIgMSIpOwotICAgIGJvb2ttYXJrc1sxXS5vYmotPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIlBhcmVudCIsIG1fcEluZGlyZWN0T2JqcywKKyAgICBib29rbWFya3NbMV0ub2JqLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJQYXJlbnQiLCBtX3BJbmRpcmVjdE9ianMuR2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29rbWFya3NbMF0ubnVtKTsKLSAgICBib29rbWFya3NbMV0ub2JqLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJGaXJzdCIsIG1fcEluZGlyZWN0T2JqcywKKyAgICBib29rbWFya3NbMV0ub2JqLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJGaXJzdCIsIG1fcEluZGlyZWN0T2Jqcy5HZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2ttYXJrc1syXS5udW0pOwogCiAgICAgYm9va21hcmtzWzJdLm9iai0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigiVGl0bGUiLCBMIkNoYXB0ZXIgMiIpOwotICAgIGJvb2ttYXJrc1syXS5vYmotPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIlBhcmVudCIsIG1fcEluZGlyZWN0T2JqcywKKyAgICBib29rbWFya3NbMl0ub2JqLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJQYXJlbnQiLCBtX3BJbmRpcmVjdE9ianMuR2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29rbWFya3NbMV0ubnVtKTsKLSAgICBib29rbWFya3NbMl0ub2JqLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJGaXJzdCIsIG1fcEluZGlyZWN0T2JqcywKKyAgICBib29rbWFya3NbMl0ub2JqLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJGaXJzdCIsIG1fcEluZGlyZWN0T2Jqcy5HZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2ttYXJrc1sxXS5udW0pOwogCiAgICAgYm9va21hcmtzWzBdLm9iai0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIlR5cGUiLCAiT3V0bGluZXMiKTsKICAgICBib29rbWFya3NbMF0ub2JqLT5TZXROZXdGb3I8Q1BERl9OdW1iZXI+KCJDb3VudCIsIDIpOwotICAgIGJvb2ttYXJrc1swXS5vYmotPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIkZpcnN0IiwgbV9wSW5kaXJlY3RPYmpzLAorICAgIGJvb2ttYXJrc1swXS5vYmotPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIkZpcnN0IiwgbV9wSW5kaXJlY3RPYmpzLkdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9va21hcmtzWzFdLm51bSk7Ci0gICAgYm9va21hcmtzWzBdLm9iai0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiTGFzdCIsIG1fcEluZGlyZWN0T2JqcywKKyAgICBib29rbWFya3NbMF0ub2JqLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJMYXN0IiwgbV9wSW5kaXJlY3RPYmpzLkdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9va21hcmtzWzJdLm51bSk7CiAKLSAgICBtX3BSb290T2JqLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJPdXRsaW5lcyIsIG1fcEluZGlyZWN0T2JqcywKKyAgICBtX3BSb290T2JqLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJPdXRsaW5lcyIsIG1fcEluZGlyZWN0T2Jqcy5HZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2ttYXJrc1swXS5udW0pOwogCiAgICAgLy8gVGl0bGUgd2l0aCBubyBtYXRjaC4KQEAgLTE5NywzMSArMTk0LDMxIEBACiAgICAgYXV0byBib29rbWFya3MgPSBDcmVhdGVEaWN0T2Jqcyg0KTsKIAogICAgIGJvb2ttYXJrc1sxXS5vYmotPlNldE5ld0ZvcjxDUERGX1N0cmluZz4oIlRpdGxlIiwgTCJDaGFwdGVyIDEiKTsKLSAgICBib29rbWFya3NbMV0ub2JqLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJQYXJlbnQiLCBtX3BJbmRpcmVjdE9ianMsCisgICAgYm9va21hcmtzWzFdLm9iai0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiUGFyZW50IiwgbV9wSW5kaXJlY3RPYmpzLkdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9va21hcmtzWzBdLm51bSk7Ci0gICAgYm9va21hcmtzWzFdLm9iai0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiTmV4dCIsIG1fcEluZGlyZWN0T2JqcywKKyAgICBib29rbWFya3NbMV0ub2JqLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJOZXh0IiwgbV9wSW5kaXJlY3RPYmpzLkdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9va21hcmtzWzJdLm51bSk7CiAKICAgICBib29rbWFya3NbMl0ub2JqLT5TZXROZXdGb3I8Q1BERl9TdHJpbmc+KCJUaXRsZSIsIEwiQ2hhcHRlciAyIik7Ci0gICAgYm9va21hcmtzWzJdLm9iai0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiUGFyZW50IiwgbV9wSW5kaXJlY3RPYmpzLAorICAgIGJvb2ttYXJrc1syXS5vYmotPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIlBhcmVudCIsIG1fcEluZGlyZWN0T2Jqcy5HZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2ttYXJrc1swXS5udW0pOwotICAgIGJvb2ttYXJrc1syXS5vYmotPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIk5leHQiLCBtX3BJbmRpcmVjdE9ianMsCisgICAgYm9va21hcmtzWzJdLm9iai0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiTmV4dCIsIG1fcEluZGlyZWN0T2Jqcy5HZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2ttYXJrc1szXS5udW0pOwogCiAgICAgYm9va21hcmtzWzNdLm9iai0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigiVGl0bGUiLCBMIkNoYXB0ZXIgMyIpOwotICAgIGJvb2ttYXJrc1szXS5vYmotPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIlBhcmVudCIsIG1fcEluZGlyZWN0T2JqcywKKyAgICBib29rbWFya3NbM10ub2JqLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJQYXJlbnQiLCBtX3BJbmRpcmVjdE9ianMuR2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29rbWFya3NbMF0ubnVtKTsKLSAgICBib29rbWFya3NbM10ub2JqLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJOZXh0IiwgbV9wSW5kaXJlY3RPYmpzLAorICAgIGJvb2ttYXJrc1szXS5vYmotPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIk5leHQiLCBtX3BJbmRpcmVjdE9ianMuR2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29rbWFya3NbMV0ubnVtKTsKIAogICAgIGJvb2ttYXJrc1swXS5vYmotPlNldE5ld0ZvcjxDUERGX05hbWU+KCJUeXBlIiwgIk91dGxpbmVzIik7CiAgICAgYm9va21hcmtzWzBdLm9iai0+U2V0TmV3Rm9yPENQREZfTnVtYmVyPigiQ291bnQiLCAyKTsKLSAgICBib29rbWFya3NbMF0ub2JqLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJGaXJzdCIsIG1fcEluZGlyZWN0T2JqcywKKyAgICBib29rbWFya3NbMF0ub2JqLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJGaXJzdCIsIG1fcEluZGlyZWN0T2Jqcy5HZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2ttYXJrc1sxXS5udW0pOwotICAgIGJvb2ttYXJrc1swXS5vYmotPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIkxhc3QiLCBtX3BJbmRpcmVjdE9ianMsCisgICAgYm9va21hcmtzWzBdLm9iai0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiTGFzdCIsIG1fcEluZGlyZWN0T2Jqcy5HZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2ttYXJrc1syXS5udW0pOwogCi0gICAgbV9wUm9vdE9iai0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiT3V0bGluZXMiLCBtX3BJbmRpcmVjdE9ianMsCisgICAgbV9wUm9vdE9iai0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiT3V0bGluZXMiLCBtX3BJbmRpcmVjdE9ianMuR2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29rbWFya3NbMF0ubnVtKTsKIAogICAgIC8vIFRpdGxlIHdpdGggbm8gbWF0Y2guCmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZlZGl0X2VtYmVkZGVydGVzdC5jcHAgYi9mcGRmc2RrL2ZwZGZlZGl0X2VtYmVkZGVydGVzdC5jcHAKaW5kZXggNTM1NTRhMS4uZWUyZmM3ZSAxMDA2NDQKLS0tIGEvZnBkZnNkay9mcGRmZWRpdF9lbWJlZGRlcnRlc3QuY3BwCisrKyBiL2ZwZGZzZGsvZnBkZmVkaXRfZW1iZWRkZXJ0ZXN0LmNwcApAQCAtNCwxNCArNCwxOSBAQAogCiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bWJlci5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgogI2luY2x1ZGUgImZwZGZzZGsvZnNka19kZWZpbmUuaCIKKyNpbmNsdWRlICJwdWJsaWMvY3BwL2ZwZGZfZGVsZXRlcnMuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9hbm5vdC5oIgogI2luY2x1ZGUgInB1YmxpYy9mcGRmX2VkaXQuaCIKICNpbmNsdWRlICJwdWJsaWMvZnBkZnZpZXcuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuaCIKQEAgLTE5LDcgKzI0LDExMyBAQAogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogI2luY2x1ZGUgInRlc3RpbmcvdGVzdF9zdXBwb3J0LmgiCiAKLWNsYXNzIEZQREZFZGl0RW1iZWRkZXJ0ZXN0IDogcHVibGljIEVtYmVkZGVyVGVzdCwgcHVibGljIFRlc3RTYXZlciB7fTsKK2NsYXNzIEZQREZFZGl0RW1iZWRkZXJ0ZXN0IDogcHVibGljIEVtYmVkZGVyVGVzdCB7CisgcHJvdGVjdGVkOgorICBGUERGX0RPQ1VNRU5UIENyZWF0ZU5ld0RvY3VtZW50KCkgeworICAgIGRvY3VtZW50XyA9IEZQREZfQ3JlYXRlTmV3RG9jdW1lbnQoKTsKKyAgICBjcGRmX2RvY18gPSBDUERGRG9jdW1lbnRGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50Xyk7CisgICAgcmV0dXJuIGRvY3VtZW50XzsKKyAgfQorCisgIHZvaWQgQ2hlY2tGb250RGVzY3JpcHRvcihDUERGX0RpY3Rpb25hcnkqIGZvbnRfZGljdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb250X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGl0YWxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhKSB7CisgICAgQ1BERl9EaWN0aW9uYXJ5KiBmb250X2Rlc2MgPSBmb250X2RpY3QtPkdldERpY3RGb3IoIkZvbnREZXNjcmlwdG9yIik7CisgICAgQVNTRVJUX1RSVUUoZm9udF9kZXNjKTsKKyAgICBFWFBFQ1RfRVEoIkZvbnREZXNjcmlwdG9yIiwgZm9udF9kZXNjLT5HZXRTdHJpbmdGb3IoIlR5cGUiKSk7CisgICAgRVhQRUNUX0VRKGZvbnRfZGljdC0+R2V0U3RyaW5nRm9yKCJCYXNlRm9udCIpLAorICAgICAgICAgICAgICBmb250X2Rlc2MtPkdldFN0cmluZ0ZvcigiRm9udE5hbWUiKSk7CisKKyAgICAvLyBDaGVjayB0aGF0IHRoZSBmb250IGRlc2NyaXB0b3IgaGFzIHRoZSByZXF1aXJlZCBrZXlzIGFjY29yZGluZyB0byBzcGVjCisgICAgLy8gMS43IFRhYmxlIDUuMTkKKyAgICBBU1NFUlRfVFJVRShmb250X2Rlc2MtPktleUV4aXN0KCJGbGFncyIpKTsKKworICAgIGludCBmb250X2ZsYWdzID0gZm9udF9kZXNjLT5HZXRJbnRlZ2VyRm9yKCJGbGFncyIpOworICAgIEVYUEVDVF9FUShib2xkLCBGb250U3R5bGVJc0JvbGQoZm9udF9mbGFncykpOworICAgIEVYUEVDVF9FUShpdGFsaWMsIEZvbnRTdHlsZUlzSXRhbGljKGZvbnRfZmxhZ3MpKTsKKyAgICBFWFBFQ1RfVFJVRShGb250U3R5bGVJc05vblN5bWJvbGljKGZvbnRfZmxhZ3MpKTsKKyAgICBBU1NFUlRfVFJVRShmb250X2Rlc2MtPktleUV4aXN0KCJGb250QkJveCIpKTsKKworICAgIENQREZfQXJyYXkqIGZvbnRCQm94ID0gZm9udF9kZXNjLT5HZXRBcnJheUZvcigiRm9udEJCb3giKTsKKyAgICBBU1NFUlRfVFJVRShmb250QkJveCk7CisgICAgRVhQRUNUX0VRKDRVLCBmb250QkJveC0+R2V0Q291bnQoKSk7CisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgY29vcmRpbmF0ZXMgYXJlIGluIHRoZSBwcmVmZXJyZWQgb3JkZXIgYWNjb3JkaW5nIHRvIHNwZWMKKyAgICAvLyAxLjcgU2VjdGlvbiAzLjguNAorICAgIEVYUEVDVF9UUlVFKGZvbnRCQm94LT5HZXRJbnRlZ2VyQXQoMCkgPCBmb250QkJveC0+R2V0SW50ZWdlckF0KDIpKTsKKyAgICBFWFBFQ1RfVFJVRShmb250QkJveC0+R2V0SW50ZWdlckF0KDEpIDwgZm9udEJCb3gtPkdldEludGVnZXJBdCgzKSk7CisKKyAgICBFWFBFQ1RfVFJVRShmb250X2Rlc2MtPktleUV4aXN0KCJJdGFsaWNBbmdsZSIpKTsKKyAgICBFWFBFQ1RfVFJVRShmb250X2Rlc2MtPktleUV4aXN0KCJBc2NlbnQiKSk7CisgICAgRVhQRUNUX1RSVUUoZm9udF9kZXNjLT5LZXlFeGlzdCgiRGVzY2VudCIpKTsKKyAgICBFWFBFQ1RfVFJVRShmb250X2Rlc2MtPktleUV4aXN0KCJDYXBIZWlnaHQiKSk7CisgICAgRVhQRUNUX1RSVUUoZm9udF9kZXNjLT5LZXlFeGlzdCgiU3RlbVYiKSk7CisgICAgQnl0ZVN0cmluZyBwcmVzZW50KCJGb250RmlsZSIpOworICAgIEJ5dGVTdHJpbmcgYWJzZW50KCJGb250RmlsZTIiKTsKKyAgICBpZiAoZm9udF90eXBlID09IEZQREZfRk9OVF9UUlVFVFlQRSkKKyAgICAgIHN0ZDo6c3dhcChwcmVzZW50LCBhYnNlbnQpOworICAgIEVYUEVDVF9UUlVFKGZvbnRfZGVzYy0+S2V5RXhpc3QocHJlc2VudCkpOworICAgIEVYUEVDVF9GQUxTRShmb250X2Rlc2MtPktleUV4aXN0KGFic2VudCkpOworCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgZm9udCBzdHJlYW0gaXMgdGhlIG9uZSB0aGF0IHdhcyBwcm92aWRlZAorICAgIENQREZfU3RyZWFtKiBmb250X3N0cmVhbSA9IGZvbnRfZGVzYy0+R2V0U3RyZWFtRm9yKHByZXNlbnQpOworICAgIEFTU0VSVF9FUShzaXplLCBmb250X3N0cmVhbS0+R2V0UmF3U2l6ZSgpKTsKKyAgICBpZiAoZm9udF90eXBlID09IEZQREZfRk9OVF9UUlVFVFlQRSkgeworICAgICAgQVNTRVJUX0VRKHN0YXRpY19jYXN0PGludD4oc2l6ZSksCisgICAgICAgICAgICAgICAgZm9udF9zdHJlYW0tPkdldERpY3QoKS0+R2V0SW50ZWdlckZvcigiTGVuZ3RoMSIpKTsKKyAgICB9CisgICAgdWludDhfdCogc3RyZWFtX2RhdGEgPSBmb250X3N0cmVhbS0+R2V0UmF3RGF0YSgpOworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2l6ZTsgaisrKQorICAgICAgRVhQRUNUX0VRKGRhdGFbal0sIHN0cmVhbV9kYXRhW2pdKSA8PCAiIGF0IGJ5dGUgIiA8PCBqOworICB9CisKKyAgdm9pZCBDaGVja0NvbXBvc2l0ZUZvbnRXaWR0aHMoQ1BERl9BcnJheSogd2lkdGhzX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqIHR5cGVkX2ZvbnQpIHsKKyAgICAvLyBDaGVjayB0aGF0IFcgYXJyYXkgaXMgaW4gYSBmb3JtYXQgdGhhdCBjb25mb3JtcyB0byBQREYgc3BlYyAxLjcgc2VjdGlvbgorICAgIC8vICJHbHlwaCBNZXRyaWNzIGluIENJREZvbnRzIiAodGhlc2UgY2hlY2tzIGFyZSBub3QKKyAgICAvLyBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYykuCisgICAgRVhQRUNUX0dUKHdpZHRoc19hcnJheS0+R2V0Q291bnQoKSwgMVUpOworICAgIGludCBudW1fY2lkc19jaGVja2VkID0gMDsKKyAgICBpbnQgY3VyX2NpZCA9IDA7CisgICAgZm9yIChzaXplX3QgaWR4ID0gMDsgaWR4IDwgd2lkdGhzX2FycmF5LT5HZXRDb3VudCgpOyBpZHgrKykgeworICAgICAgaW50IGNpZCA9IHdpZHRoc19hcnJheS0+R2V0TnVtYmVyQXQoaWR4KTsKKyAgICAgIEVYUEVDVF9HRShjaWQsIGN1cl9jaWQpOworICAgICAgQVNTRVJUX0ZBTFNFKCsraWR4ID09IHdpZHRoc19hcnJheS0+R2V0Q291bnQoKSk7CisgICAgICBDUERGX09iamVjdCogbmV4dCA9IHdpZHRoc19hcnJheS0+R2V0T2JqZWN0QXQoaWR4KTsKKyAgICAgIGlmIChuZXh0LT5Jc0FycmF5KCkpIHsKKyAgICAgICAgLy8gV2UgYXJlIGluIHRoZSBjIFt3MSB3MiAuLi5dIGNhc2UKKyAgICAgICAgQ1BERl9BcnJheSogYXJyID0gbmV4dC0+QXNBcnJheSgpOworICAgICAgICBpbnQgY250ID0gc3RhdGljX2Nhc3Q8aW50PihhcnItPkdldENvdW50KCkpOworICAgICAgICBzaXplX3QgaW5uZXJfaWR4ID0gMDsKKyAgICAgICAgZm9yIChjdXJfY2lkID0gY2lkOyBjdXJfY2lkIDwgY2lkICsgY250OyBjdXJfY2lkKyspIHsKKyAgICAgICAgICBpbnQgd2lkdGggPSBhcnItPkdldE51bWJlckF0KGlubmVyX2lkeCsrKTsKKyAgICAgICAgICBFWFBFQ1RfRVEod2lkdGgsIHR5cGVkX2ZvbnQtPkdldENoYXJXaWR0aEYoY3VyX2NpZCkpIDw8ICIgYXQgY2lkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGN1cl9jaWQ7CisgICAgICAgIH0KKyAgICAgICAgbnVtX2NpZHNfY2hlY2tlZCArPSBjbnQ7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgLy8gT3RoZXJ3aXNlLCBhcmUgaW4gdGhlIGNfZmlyc3QgY19sYXN0IHcgY2FzZS4KKyAgICAgIEFTU0VSVF9UUlVFKG5leHQtPklzTnVtYmVyKCkpOworICAgICAgaW50IGxhc3RfY2lkID0gbmV4dC0+QXNOdW1iZXIoKS0+R2V0SW50ZWdlcigpOworICAgICAgQVNTRVJUX0ZBTFNFKCsraWR4ID09IHdpZHRoc19hcnJheS0+R2V0Q291bnQoKSk7CisgICAgICBpbnQgd2lkdGggPSB3aWR0aHNfYXJyYXktPkdldE51bWJlckF0KGlkeCk7CisgICAgICBmb3IgKGN1cl9jaWQgPSBjaWQ7IGN1cl9jaWQgPD0gbGFzdF9jaWQ7IGN1cl9jaWQrKykgeworICAgICAgICBFWFBFQ1RfRVEod2lkdGgsIHR5cGVkX2ZvbnQtPkdldENoYXJXaWR0aEYoY3VyX2NpZCkpIDw8ICIgYXQgY2lkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBjdXJfY2lkOworICAgICAgfQorICAgICAgbnVtX2NpZHNfY2hlY2tlZCArPSBsYXN0X2NpZCAtIGNpZCArIDE7CisgICAgfQorICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZ29vZCBhbW91bnQgb2YgY2lkcyBkZXNjcmliZWQKKyAgICBFWFBFQ1RfR1QobnVtX2NpZHNfY2hlY2tlZCwgOTAwKTsKKyAgfQorICBDUERGX0RvY3VtZW50KiBjcGRmX2RvYygpIHsgcmV0dXJuIGNwZGZfZG9jXzsgfQorCisgcHJpdmF0ZToKKyAgQ1BERl9Eb2N1bWVudCogY3BkZl9kb2NfOworfTsKIAogbmFtZXNwYWNlIHsKIApAQCAtMzYsMTUgKzE0NywxMyBAQAogICAgICI8PC9DcmVhdGlvbkRhdGVcXChEOi4qXFwpL0NyZWF0b3JcXChQREZpdW1cXCk+PlxyXG4iCiAgICAgImVuZG9ialxyXG4iCiAgICAgIjQgMCBvYmpcclxuIgotICAgICI8PC9Db250ZW50cyA1IDAgUiAvTWVkaWFCb3hcXFsgMCAwIDY0MCA0ODBcXF0iCi0gICAgIi9QYXJlbnQgMiAwIFIgL1Jlc291cmNlczw8Pj4vUm90YXRlIDAvVHlwZS9QYWdlIgorICAgICI8PC9NZWRpYUJveFxcWyAwIDAgNjQwIDQ4MFxcXS9QYXJlbnQgMiAwIFIgIgorICAgICIvUmVzb3VyY2VzPDwvRXh0R1N0YXRlPDwvRlhFMSA1IDAgUiA+Pj4+IgorICAgICIvUm90YXRlIDAvVHlwZS9QYWdlIgogICAgICI+PlxyXG4iCiAgICAgImVuZG9ialxyXG4iCiAgICAgIjUgMCBvYmpcclxuIgotICAgICI8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvTGVuZ3RoIDg+PnN0cmVhbVxyXG4iCi0gICAgLy8gQ2hhcmFjdGVyICdfJyBpcyBtYXRjaGluZyAnXDAnIChzZWUgY29tbWVudCBiZWxvdykuCi0gICAgInhceDlDXHgzX19fX1x4MVxyXG4iCi0gICAgImVuZHN0cmVhbVxyXG4iCisgICAgIjw8L0JNL05vcm1hbC9DQSAxL2NhIDE+PlxyXG4iCiAgICAgImVuZG9ialxyXG4iCiAgICAgInhyZWZcclxuIgogICAgICIwIDZcclxuIgpAQCAtNTMsNDcgKzE2MiwyOCBAQAogICAgICIwMDAwMDAwMDY2IDAwMDAwIG5cclxuIgogICAgICIwMDAwMDAwMTIyIDAwMDAwIG5cclxuIgogICAgICIwMDAwMDAwMTkyIDAwMDAwIG5cclxuIgotICAgICIwMDAwMDAwMzAxIDAwMDAwIG5cclxuIgorICAgICIwMDAwMDAwMzExIDAwMDAwIG5cclxuIgogICAgICJ0cmFpbGVyXHJcbiIKICAgICAiPDxcclxuIgogICAgICIvUm9vdCAxIDAgUlxyXG4iCiAgICAgIi9JbmZvIDMgMCBSXHJcbiIKICAgICAiL1NpemUgNi9JRFxcWzwuKj48Lio+XFxdPj5cclxuIgogICAgICJzdGFydHhyZWZcclxuIgotICAgICIzNzlcclxuIgorICAgICIzNTRcclxuIgogICAgICIlJUVPRlxyXG4iOwogCi1pbnQgR2V0QmxvY2tGcm9tU3RyaW5nKHZvaWQqIHBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogYnVmLAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpIHsKLSAgc3RkOjpzdHJpbmcqIG5ld19maWxlID0gc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmcqPihwYXJhbSk7Ci0gIGlmICghbmV3X2ZpbGUgfHwgcG9zICsgc2l6ZSA8IHBvcykKLSAgICByZXR1cm4gMDsKLQotICB1bnNpZ25lZCBsb25nIGZpbGVfc2l6ZSA9IG5ld19maWxlLT5zaXplKCk7Ci0gIGlmIChwb3MgKyBzaXplID4gZmlsZV9zaXplKQotICAgIHJldHVybiAwOwotCi0gIG1lbWNweShidWYsIG5ld19maWxlLT5kYXRhKCkgKyBwb3MsIHNpemUpOwotICByZXR1cm4gMTsKLX0KLQogfSAgLy8gbmFtZXNwYWNlCiAKIFRFU1RfRihGUERGRWRpdEVtYmVkZGVydGVzdCwgRW1wdHlDcmVhdGlvbikgewogICBFWFBFQ1RfVFJVRShDcmVhdGVFbXB0eURvY3VtZW50KCkpOwogICBGUERGX1BBR0UgcGFnZSA9IEZQREZQYWdlX05ldyhkb2N1bWVudCgpLCAwLCA2NDAuMCwgNDgwLjApOwogICBFWFBFQ1RfTkUobnVsbHB0ciwgcGFnZSk7CisgIC8vIFRoZSBGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQgY2FsbCBzaG91bGQgZG8gbm90aGluZy4KICAgRVhQRUNUX1RSVUUoRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KHBhZ2UpKTsKICAgRVhQRUNUX1RSVUUoRlBERl9TYXZlQXNDb3B5KGRvY3VtZW50KCksIHRoaXMsIDApKTsKIAotICAvLyBUaGUgTWF0Y2hlc1JlZ2V4cCBkb2Vzbid0IHN1cHBvcnQgZW1iZWRkZWQgTlVMICgnXDAnKSBjaGFyYWN0ZXJzLiBUaGV5IGFyZQotICAvLyByZXBsYWNlZCBieSAnXycgZm9yIHRoZSBwdXJwb3NlIG9mIHRoZSB0ZXN0LgotICBzdGQ6OnN0cmluZyByZXN1bHQgPSBHZXRTdHJpbmcoKTsKLSAgc3RkOjpyZXBsYWNlKHJlc3VsdC5iZWdpbigpLCByZXN1bHQuZW5kKCksICdcMCcsICdfJyk7Ci0gIEVYUEVDVF9USEFUKHJlc3VsdCwgdGVzdGluZzo6TWF0Y2hlc1JlZ2V4KAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhrRXhwZWN0ZWRQREYsIHNpemVvZihrRXhwZWN0ZWRQREYpKSkpOworICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwgdGVzdGluZzo6TWF0Y2hlc1JlZ2V4KHN0ZDo6c3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtFeHBlY3RlZFBERiwgc2l6ZW9mKGtFeHBlY3RlZFBERikpKSk7CiAgIEZQREZfQ2xvc2VQYWdlKHBhZ2UpOwogfQogCkBAIC0xMTksNyArMjA5LDcgQEAKIAogICAgIC8vIEFkZCB0aGUgYml0bWFwIHRvIGFuIGltYWdlIG9iamVjdCBhbmQgYWRkIHRoZSBpbWFnZSBvYmplY3QgdG8gdGhlIG91dHB1dAogICAgIC8vIHBhZ2UuCi0gICAgRlBERl9QQUdFT0JKRUNUIHRlbXBfaW1nID0gRlBERlBhZ2VPYmpfTmV3SW1nZU9iaih0ZW1wX2RvYyk7CisgICAgRlBERl9QQUdFT0JKRUNUIHRlbXBfaW1nID0gRlBERlBhZ2VPYmpfTmV3SW1hZ2VPYmoodGVtcF9kb2MpOwogICAgIEVYUEVDVF9UUlVFKEZQREZJbWFnZU9ial9TZXRCaXRtYXAoJnRlbXBfcGFnZSwgMSwgdGVtcF9pbWcsIG9yaWdfYml0bWFwKSk7CiAgICAgRVhQRUNUX1RSVUUoRlBERkltYWdlT2JqX1NldE1hdHJpeCh0ZW1wX2ltZywgNjEyLCAwLCAwLCA3OTIsIDAsIDApKTsKICAgICBGUERGUGFnZV9JbnNlcnRPYmplY3QodGVtcF9wYWdlLCB0ZW1wX2ltZyk7CkBAIC0xMzIsMzMgKzIyMiwxMyBAQAogCiAgIC8vIEdldCB0aGUgZ2VuZXJhdGVkIGNvbnRlbnQuIE1ha2Ugc3VyZSBpdCBpcyBhdCBsZWFzdCBhcyBiaWcgYXMgdGhlIG9yaWdpbmFsCiAgIC8vIFBERi4KLSAgc3RkOjpzdHJpbmcgbmV3X2ZpbGUgPSBHZXRTdHJpbmcoKTsKLSAgRVhQRUNUX0dUKG5ld19maWxlLnNpemUoKSwgOTIzVSk7Ci0KLSAgLy8gUmVhZCB8bmV3X2ZpbGV8IGluLCBhbmQgdmVyaWZ5IGl0cyByZW5kZXJlZCBiaXRtYXAuCi0gIHsKLSAgICBGUERGX0ZJTEVBQ0NFU1MgZmlsZV9hY2Nlc3M7Ci0gICAgbWVtc2V0KCZmaWxlX2FjY2VzcywgMCwgc2l6ZW9mKGZpbGVfYWNjZXNzKSk7Ci0gICAgZmlsZV9hY2Nlc3MubV9GaWxlTGVuID0gbmV3X2ZpbGUuc2l6ZSgpOwotICAgIGZpbGVfYWNjZXNzLm1fR2V0QmxvY2sgPSBHZXRCbG9ja0Zyb21TdHJpbmc7Ci0gICAgZmlsZV9hY2Nlc3MubV9QYXJhbSA9ICZuZXdfZmlsZTsKLQotICAgIEZQREZfRE9DVU1FTlQgbmV3X2RvYyA9IEZQREZfTG9hZEN1c3RvbURvY3VtZW50KCZmaWxlX2FjY2VzcywgbnVsbHB0cik7Ci0gICAgRVhQRUNUX0VRKDEsIEZQREZfR2V0UGFnZUNvdW50KGRvY3VtZW50XykpOwotICAgIEZQREZfUEFHRSBuZXdfcGFnZSA9IEZQREZfTG9hZFBhZ2UobmV3X2RvYywgMCk7Ci0gICAgRVhQRUNUX05FKG51bGxwdHIsIG5ld19wYWdlKTsKLSAgICBGUERGX0JJVE1BUCBuZXdfYml0bWFwID0gUmVuZGVyUGFnZShuZXdfcGFnZSk7Ci0gICAgQ29tcGFyZUJpdG1hcChuZXdfYml0bWFwLCA2MTIsIDc5Miwga0FsbEJsYWNrTWQ1c3VtKTsKLSAgICBGUERGX0Nsb3NlUGFnZShuZXdfcGFnZSk7Ci0gICAgRlBERl9DbG9zZURvY3VtZW50KG5ld19kb2MpOwotICAgIEZQREZCaXRtYXBfRGVzdHJveShuZXdfYml0bWFwKTsKLSAgfQorICBFWFBFQ1RfR1QoR2V0U3RyaW5nKCkuc2l6ZSgpLCA5MjNVKTsKKyAgVmVyaWZ5U2F2ZWREb2N1bWVudCg2MTIsIDc5Miwga0FsbEJsYWNrTWQ1c3VtKTsKIH0KIAogVEVTVF9GKEZQREZFZGl0RW1iZWRkZXJ0ZXN0LCBBZGRQYXRocykgewogICAvLyBTdGFydCB3aXRoIGEgYmxhbmsgcGFnZQotICBGUERGX0RPQ1VNRU5UIGRvYyA9IEZQREZfQ3JlYXRlTmV3RG9jdW1lbnQoKTsKLSAgRlBERl9QQUdFIHBhZ2UgPSBGUERGUGFnZV9OZXcoZG9jLCAwLCA2MTIsIDc5Mik7CisgIEZQREZfUEFHRSBwYWdlID0gRlBERlBhZ2VfTmV3KENyZWF0ZU5ld0RvY3VtZW50KCksIDAsIDYxMiwgNzkyKTsKIAogICAvLyBXZSB3aWxsIGZpcnN0IGFkZCBhIHJlZCByZWN0YW5nbGUKICAgRlBERl9QQUdFT0JKRUNUIHJlZF9yZWN0ID0gRlBERlBhZ2VPYmpfQ3JlYXRlTmV3UmVjdCgxMCwgMTAsIDIwLCAyMCk7CkBAIC0xNzEsNyArMjQxLDYgQEAKICAgRVhQRUNUX1RSVUUoRlBERlBhdGhfU2V0RmlsbENvbG9yKHJlZF9yZWN0LCAyNTUsIDAsIDAsIDI1NSkpOwogICBFWFBFQ1RfVFJVRShGUERGUGF0aF9TZXREcmF3TW9kZShyZWRfcmVjdCwgRlBERl9GSUxMTU9ERV9BTFRFUk5BVEUsIDApKTsKICAgRlBERlBhZ2VfSW5zZXJ0T2JqZWN0KHBhZ2UsIHJlZF9yZWN0KTsKLSAgRVhQRUNUX1RSVUUoRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KHBhZ2UpKTsKICAgRlBERl9CSVRNQVAgcGFnZV9iaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UpOwogICBDb21wYXJlQml0bWFwKHBhZ2VfYml0bWFwLCA2MTIsIDc5MiwgIjY2ZDAyZWFhNjE4MWUyYzA2OWNlMmVhOTliZWRhNDk3Iik7CiAgIEZQREZCaXRtYXBfRGVzdHJveShwYWdlX2JpdG1hcCk7CkBAIC0xNzksOSArMjQ4LDYwIEBACiAgIC8vIE5vdyBhZGQgdG8gdGhhdCBhIGdyZWVuIHJlY3RhbmdsZSB3aXRoIHNvbWUgbWVkaXVtIGFscGhhCiAgIEZQREZfUEFHRU9CSkVDVCBncmVlbl9yZWN0ID0gRlBERlBhZ2VPYmpfQ3JlYXRlTmV3UmVjdCgxMDAsIDEwMCwgNDAsIDQwKTsKICAgRVhQRUNUX1RSVUUoRlBERlBhdGhfU2V0RmlsbENvbG9yKGdyZWVuX3JlY3QsIDAsIDI1NSwgMCwgMTI4KSk7CisKKyAgLy8gTWFrZSBzdXJlIHRoZSB0eXBlIG9mIHRoZSByZWN0YW5nbGUgaXMgYSBwYXRoLgorICBFWFBFQ1RfRVEoRlBERl9QQUdFT0JKX1BBVEgsIEZQREZQYWdlT2JqX0dldFR5cGUoZ3JlZW5fcmVjdCkpOworCisgIC8vIE1ha2Ugc3VyZSB3ZSBnZXQgYmFjayB0aGUgc2FtZSBjb2xvciB3ZSBzZXQgcHJldmlvdXNseS4KKyAgdW5zaWduZWQgaW50IFI7CisgIHVuc2lnbmVkIGludCBHOworICB1bnNpZ25lZCBpbnQgQjsKKyAgdW5zaWduZWQgaW50IEE7CisgIEVYUEVDVF9UUlVFKEZQREZQYXRoX0dldEZpbGxDb2xvcihncmVlbl9yZWN0LCAmUiwgJkcsICZCLCAmQSkpOworICBFWFBFQ1RfRVEoMFUsIFIpOworICBFWFBFQ1RfRVEoMjU1VSwgRyk7CisgIEVYUEVDVF9FUSgwVSwgQik7CisgIEVYUEVDVF9FUSgxMjhVLCBBKTsKKworICAvLyBNYWtlIHN1cmUgdGhlIHBhdGggaGFzIDUgcG9pbnRzICgxIEZYUFRfVFlQRTo6TW92ZVRvIGFuZCA0CisgIC8vIEZYUFRfVFlQRTo6TGluZVRvKS4KKyAgQVNTRVJUX0VRKDUsIEZQREZQYXRoX0NvdW50U2VnbWVudHMoZ3JlZW5fcmVjdCkpOworICAvLyBWZXJpZnkgYWN0dWFsIGNvb3JkaW5hdGVzLgorICBGUERGX1BBVEhTRUdNRU5UIHNlZ21lbnQgPSBGUERGUGF0aF9HZXRQYXRoU2VnbWVudChncmVlbl9yZWN0LCAwKTsKKyAgZmxvYXQgeDsKKyAgZmxvYXQgeTsKKyAgRVhQRUNUX1RSVUUoRlBERlBhdGhTZWdtZW50X0dldFBvaW50KHNlZ21lbnQsICZ4LCAmeSkpOworICBFWFBFQ1RfRVEoMTAwLCB4KTsKKyAgRVhQRUNUX0VRKDEwMCwgeSk7CisgIEVYUEVDVF9FUShGUERGX1NFR01FTlRfTU9WRVRPLCBGUERGUGF0aFNlZ21lbnRfR2V0VHlwZShzZWdtZW50KSk7CisgIEVYUEVDVF9GQUxTRShGUERGUGF0aFNlZ21lbnRfR2V0Q2xvc2Uoc2VnbWVudCkpOworICBzZWdtZW50ID0gRlBERlBhdGhfR2V0UGF0aFNlZ21lbnQoZ3JlZW5fcmVjdCwgMSk7CisgIEVYUEVDVF9UUlVFKEZQREZQYXRoU2VnbWVudF9HZXRQb2ludChzZWdtZW50LCAmeCwgJnkpKTsKKyAgRVhQRUNUX0VRKDEwMCwgeCk7CisgIEVYUEVDVF9FUSgxNDAsIHkpOworICBFWFBFQ1RfRVEoRlBERl9TRUdNRU5UX0xJTkVUTywgRlBERlBhdGhTZWdtZW50X0dldFR5cGUoc2VnbWVudCkpOworICBFWFBFQ1RfRkFMU0UoRlBERlBhdGhTZWdtZW50X0dldENsb3NlKHNlZ21lbnQpKTsKKyAgc2VnbWVudCA9IEZQREZQYXRoX0dldFBhdGhTZWdtZW50KGdyZWVuX3JlY3QsIDIpOworICBFWFBFQ1RfVFJVRShGUERGUGF0aFNlZ21lbnRfR2V0UG9pbnQoc2VnbWVudCwgJngsICZ5KSk7CisgIEVYUEVDVF9FUSgxNDAsIHgpOworICBFWFBFQ1RfRVEoMTQwLCB5KTsKKyAgRVhQRUNUX0VRKEZQREZfU0VHTUVOVF9MSU5FVE8sIEZQREZQYXRoU2VnbWVudF9HZXRUeXBlKHNlZ21lbnQpKTsKKyAgRVhQRUNUX0ZBTFNFKEZQREZQYXRoU2VnbWVudF9HZXRDbG9zZShzZWdtZW50KSk7CisgIHNlZ21lbnQgPSBGUERGUGF0aF9HZXRQYXRoU2VnbWVudChncmVlbl9yZWN0LCAzKTsKKyAgRVhQRUNUX1RSVUUoRlBERlBhdGhTZWdtZW50X0dldFBvaW50KHNlZ21lbnQsICZ4LCAmeSkpOworICBFWFBFQ1RfRVEoMTQwLCB4KTsKKyAgRVhQRUNUX0VRKDEwMCwgeSk7CisgIEVYUEVDVF9FUShGUERGX1NFR01FTlRfTElORVRPLCBGUERGUGF0aFNlZ21lbnRfR2V0VHlwZShzZWdtZW50KSk7CisgIEVYUEVDVF9GQUxTRShGUERGUGF0aFNlZ21lbnRfR2V0Q2xvc2Uoc2VnbWVudCkpOworICBzZWdtZW50ID0gRlBERlBhdGhfR2V0UGF0aFNlZ21lbnQoZ3JlZW5fcmVjdCwgNCk7CisgIEVYUEVDVF9UUlVFKEZQREZQYXRoU2VnbWVudF9HZXRQb2ludChzZWdtZW50LCAmeCwgJnkpKTsKKyAgRVhQRUNUX0VRKDEwMCwgeCk7CisgIEVYUEVDVF9FUSgxMDAsIHkpOworICBFWFBFQ1RfRVEoRlBERl9TRUdNRU5UX0xJTkVUTywgRlBERlBhdGhTZWdtZW50X0dldFR5cGUoc2VnbWVudCkpOworICBFWFBFQ1RfVFJVRShGUERGUGF0aFNlZ21lbnRfR2V0Q2xvc2Uoc2VnbWVudCkpOworCiAgIEVYUEVDVF9UUlVFKEZQREZQYXRoX1NldERyYXdNb2RlKGdyZWVuX3JlY3QsIEZQREZfRklMTE1PREVfV0lORElORywgMCkpOwogICBGUERGUGFnZV9JbnNlcnRPYmplY3QocGFnZSwgZ3JlZW5fcmVjdCk7Ci0gIEVYUEVDVF9UUlVFKEZQREZQYWdlX0dlbmVyYXRlQ29udGVudChwYWdlKSk7CiAgIHBhZ2VfYml0bWFwID0gUmVuZGVyUGFnZShwYWdlKTsKICAgQ29tcGFyZUJpdG1hcChwYWdlX2JpdG1hcCwgNjEyLCA3OTIsICI3YjBiODc2MDQ1OTRlNzczYWRkNTI4ZmFlNTY3YTU1OCIpOwogICBGUERGQml0bWFwX0Rlc3Ryb3kocGFnZV9iaXRtYXApOwpAQCAtMTkzLDggKzMxMywzMyBAQAogICBFWFBFQ1RfVFJVRShGUERGUGF0aF9MaW5lVG8oYmxhY2tfcGF0aCwgNDAwLCAyMDApKTsKICAgRVhQRUNUX1RSVUUoRlBERlBhdGhfTGluZVRvKGJsYWNrX3BhdGgsIDMwMCwgMTAwKSk7CiAgIEVYUEVDVF9UUlVFKEZQREZQYXRoX0Nsb3NlKGJsYWNrX3BhdGgpKTsKKworICAvLyBNYWtlIHN1cmUgdGhlIHBhdGggaGFzIDMgcG9pbnRzICgxIEZYUFRfVFlQRTo6TW92ZVRvIGFuZCAyCisgIC8vIEZYUFRfVFlQRTo6TGluZVRvKS4KKyAgQVNTRVJUX0VRKDMsIEZQREZQYXRoX0NvdW50U2VnbWVudHMoYmxhY2tfcGF0aCkpOworICAvLyBWZXJpZnkgYWN0dWFsIGNvb3JkaW5hdGVzLgorICBzZWdtZW50ID0gRlBERlBhdGhfR2V0UGF0aFNlZ21lbnQoYmxhY2tfcGF0aCwgMCk7CisgIEVYUEVDVF9UUlVFKEZQREZQYXRoU2VnbWVudF9HZXRQb2ludChzZWdtZW50LCAmeCwgJnkpKTsKKyAgRVhQRUNUX0VRKDQwMCwgeCk7CisgIEVYUEVDVF9FUSgxMDAsIHkpOworICBFWFBFQ1RfRVEoRlBERl9TRUdNRU5UX01PVkVUTywgRlBERlBhdGhTZWdtZW50X0dldFR5cGUoc2VnbWVudCkpOworICBFWFBFQ1RfRkFMU0UoRlBERlBhdGhTZWdtZW50X0dldENsb3NlKHNlZ21lbnQpKTsKKyAgc2VnbWVudCA9IEZQREZQYXRoX0dldFBhdGhTZWdtZW50KGJsYWNrX3BhdGgsIDEpOworICBFWFBFQ1RfVFJVRShGUERGUGF0aFNlZ21lbnRfR2V0UG9pbnQoc2VnbWVudCwgJngsICZ5KSk7CisgIEVYUEVDVF9FUSg0MDAsIHgpOworICBFWFBFQ1RfRVEoMjAwLCB5KTsKKyAgRVhQRUNUX0VRKEZQREZfU0VHTUVOVF9MSU5FVE8sIEZQREZQYXRoU2VnbWVudF9HZXRUeXBlKHNlZ21lbnQpKTsKKyAgRVhQRUNUX0ZBTFNFKEZQREZQYXRoU2VnbWVudF9HZXRDbG9zZShzZWdtZW50KSk7CisgIHNlZ21lbnQgPSBGUERGUGF0aF9HZXRQYXRoU2VnbWVudChibGFja19wYXRoLCAyKTsKKyAgRVhQRUNUX1RSVUUoRlBERlBhdGhTZWdtZW50X0dldFBvaW50KHNlZ21lbnQsICZ4LCAmeSkpOworICBFWFBFQ1RfRVEoMzAwLCB4KTsKKyAgRVhQRUNUX0VRKDEwMCwgeSk7CisgIEVYUEVDVF9FUShGUERGX1NFR01FTlRfTElORVRPLCBGUERGUGF0aFNlZ21lbnRfR2V0VHlwZShzZWdtZW50KSk7CisgIEVYUEVDVF9UUlVFKEZQREZQYXRoU2VnbWVudF9HZXRDbG9zZShzZWdtZW50KSk7CisgIC8vIE1ha2Ugc3VyZSBvdXQgb2YgYm91bmRzIGluZGV4IGFjY2VzcyBmYWlscyBwcm9wZXJseS4KKyAgRVhQRUNUX0VRKG51bGxwdHIsIEZQREZQYXRoX0dldFBhdGhTZWdtZW50KGJsYWNrX3BhdGgsIDMpKTsKKwogICBGUERGUGFnZV9JbnNlcnRPYmplY3QocGFnZSwgYmxhY2tfcGF0aCk7Ci0gIEVYUEVDVF9UUlVFKEZQREZQYWdlX0dlbmVyYXRlQ29udGVudChwYWdlKSk7CiAgIHBhZ2VfYml0bWFwID0gUmVuZGVyUGFnZShwYWdlKTsKICAgQ29tcGFyZUJpdG1hcChwYWdlX2JpdG1hcCwgNjEyLCA3OTIsICJlYWRjODAyMGExNGRmY2YwOTFkYTI2ODg3MzNkODgwNiIpOwogICBGUERGQml0bWFwX0Rlc3Ryb3kocGFnZV9iaXRtYXApOwpAQCAtMjEwLDMzICszNTUsNDUgQEAKICAgRVhQRUNUX1RSVUUoRlBERlBhdGhfQmV6aWVyVG8oYmx1ZV9wYXRoLCAzNzUsIDMzMCwgMzkwLCAzNjAsIDQwMCwgNDAwKSk7CiAgIEVYUEVDVF9UUlVFKEZQREZQYXRoX0Nsb3NlKGJsdWVfcGF0aCkpOwogICBGUERGUGFnZV9JbnNlcnRPYmplY3QocGFnZSwgYmx1ZV9wYXRoKTsKLSAgRVhQRUNUX1RSVUUoRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KHBhZ2UpKTsKICAgcGFnZV9iaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UpOwotICBDb21wYXJlQml0bWFwKHBhZ2VfYml0bWFwLCA2MTIsIDc5MiwgIjk4MjNlMWEyMWJkOWI3MmI2YTQ0MmJhNGYxMmFmOTQ2Iik7CisgIGNvbnN0IGNoYXIgbGFzdF9tZDVbXSA9ICI5ODIzZTFhMjFiZDliNzJiNmE0NDJiYTRmMTJhZjk0NiI7CisgIENvbXBhcmVCaXRtYXAocGFnZV9iaXRtYXAsIDYxMiwgNzkyLCBsYXN0X21kNSk7CiAgIEZQREZCaXRtYXBfRGVzdHJveShwYWdlX2JpdG1hcCk7CiAKICAgLy8gTm93IHNhdmUgdGhlIHJlc3VsdCwgY2xvc2luZyB0aGUgcGFnZSBhbmQgZG9jdW1lbnQKLSAgRVhQRUNUX1RSVUUoRlBERl9TYXZlQXNDb3B5KGRvYywgdGhpcywgMCkpOworICBFWFBFQ1RfVFJVRShGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQocGFnZSkpOworICBFWFBFQ1RfVFJVRShGUERGX1NhdmVBc0NvcHkoZG9jdW1lbnQoKSwgdGhpcywgMCkpOwogICBGUERGX0Nsb3NlUGFnZShwYWdlKTsKLSAgRlBERl9DbG9zZURvY3VtZW50KGRvYyk7Ci0gIHN0ZDo6c3RyaW5nIG5ld19maWxlID0gR2V0U3RyaW5nKCk7CiAKICAgLy8gUmVuZGVyIHRoZSBzYXZlZCByZXN1bHQKLSAgRlBERl9GSUxFQUNDRVNTIGZpbGVfYWNjZXNzOwotICBtZW1zZXQoJmZpbGVfYWNjZXNzLCAwLCBzaXplb2YoZmlsZV9hY2Nlc3MpKTsKLSAgZmlsZV9hY2Nlc3MubV9GaWxlTGVuID0gbmV3X2ZpbGUuc2l6ZSgpOwotICBmaWxlX2FjY2Vzcy5tX0dldEJsb2NrID0gR2V0QmxvY2tGcm9tU3RyaW5nOwotICBmaWxlX2FjY2Vzcy5tX1BhcmFtID0gJm5ld19maWxlOwotICBGUERGX0RPQ1VNRU5UIG5ld19kb2MgPSBGUERGX0xvYWRDdXN0b21Eb2N1bWVudCgmZmlsZV9hY2Nlc3MsIG51bGxwdHIpOwotICBBU1NFUlRfTkUobnVsbHB0ciwgbmV3X2RvYyk7Ci0gIEVYUEVDVF9FUSgxLCBGUERGX0dldFBhZ2VDb3VudChuZXdfZG9jKSk7Ci0gIEZQREZfUEFHRSBuZXdfcGFnZSA9IEZQREZfTG9hZFBhZ2UobmV3X2RvYywgMCk7Ci0gIEFTU0VSVF9ORShudWxscHRyLCBuZXdfcGFnZSk7Ci0gIEZQREZfQklUTUFQIG5ld19iaXRtYXAgPSBSZW5kZXJQYWdlKG5ld19wYWdlKTsKLSAgQ29tcGFyZUJpdG1hcChuZXdfYml0bWFwLCA2MTIsIDc5MiwgIjk4MjNlMWEyMWJkOWI3MmI2YTQ0MmJhNGYxMmFmOTQ2Iik7Ci0gIEZQREZCaXRtYXBfRGVzdHJveShuZXdfYml0bWFwKTsKLSAgRlBERl9DbG9zZVBhZ2UobmV3X3BhZ2UpOwotICBGUERGX0Nsb3NlRG9jdW1lbnQobmV3X2RvYyk7CisgIFZlcmlmeVNhdmVkRG9jdW1lbnQoNjEyLCA3OTIsIGxhc3RfbWQ1KTsKK30KKworVEVTVF9GKEZQREZFZGl0RW1iZWRkZXJ0ZXN0LCBQYXRoc1BvaW50cykgeworICBDcmVhdGVOZXdEb2N1bWVudCgpOworICBGUERGX1BBR0VPQkpFQ1QgaW1nID0gRlBERlBhZ2VPYmpfTmV3SW1hZ2VPYmooZG9jdW1lbnRfKTsKKyAgLy8gVGhpcyBzaG91bGQgZmFpbCBncmFjZWZ1bGx5LCBldmVuIGlmIGltZyBpcyBub3QgYSBwYXRoLgorICBBU1NFUlRfRVEoLTEsIEZQREZQYXRoX0NvdW50U2VnbWVudHMoaW1nKSk7CisKKyAgLy8gVGhpcyBzaG91bGQgZmFpbCBncmFjZWZ1bGx5LCBldmVuIGlmIHBhdGggaXMgTlVMTC4KKyAgQVNTRVJUX0VRKC0xLCBGUERGUGF0aF9Db3VudFNlZ21lbnRzKG51bGxwdHIpKTsKKworICAvLyBGUERGUGF0aF9HZXRQYXRoU2VnbWVudCgpIHdpdGggYSBub24tcGF0aC4KKyAgQVNTRVJUX0VRKG51bGxwdHIsIEZQREZQYXRoX0dldFBhdGhTZWdtZW50KGltZywgMCkpOworICAvLyBGUERGUGF0aF9HZXRQYXRoU2VnbWVudCgpIHdpdGggYSBOVUxMIHBhdGguCisgIEFTU0VSVF9FUShudWxscHRyLCBGUERGUGF0aF9HZXRQYXRoU2VnbWVudChudWxscHRyLCAwKSk7CisgIGZsb2F0IHg7CisgIGZsb2F0IHk7CisgIC8vIEZQREZQYXRoU2VnbWVudF9HZXRQb2ludCgpIHdpdGggYSBOVUxMIHNlZ21lbnQuCisgIEVYUEVDVF9GQUxTRShGUERGUGF0aFNlZ21lbnRfR2V0UG9pbnQobnVsbHB0ciwgJngsICZ5KSk7CisKKyAgLy8gRlBERlBhdGhTZWdtZW50X0dldFR5cGUoKSB3aXRoIGEgTlVMTCBzZWdtZW50LgorICBBU1NFUlRfRVEoRlBERl9TRUdNRU5UX1VOS05PV04sIEZQREZQYXRoU2VnbWVudF9HZXRUeXBlKG51bGxwdHIpKTsKKworICAvLyBGUERGUGF0aFNlZ21lbnRfR2V0Q2xvc2UoKSB3aXRoIGEgTlVMTCBzZWdtZW50LgorICBFWFBFQ1RfRkFMU0UoRlBERlBhdGhTZWdtZW50X0dldENsb3NlKG51bGxwdHIpKTsKKworICBGUERGUGFnZU9ial9EZXN0cm95KGltZyk7CiB9CiAKIFRFU1RfRihGUERGRWRpdEVtYmVkZGVydGVzdCwgUGF0aE9uVG9wT2ZUZXh0KSB7CkBAIC0yNTAsNyArNDA3LDYgQEAKICAgRVhQRUNUX1RSVUUoRlBERlBhdGhfU2V0RmlsbENvbG9yKHJlZF9yZWN0LCAyNTUsIDAsIDAsIDI1NSkpOwogICBFWFBFQ1RfVFJVRShGUERGUGF0aF9TZXREcmF3TW9kZShyZWRfcmVjdCwgRlBERl9GSUxMTU9ERV9BTFRFUk5BVEUsIDApKTsKICAgRlBERlBhZ2VfSW5zZXJ0T2JqZWN0KHBhZ2UsIHJlZF9yZWN0KTsKLSAgRVhQRUNUX1RSVUUoRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KHBhZ2UpKTsKIAogICAvLyBBZGQgYSB0cmFuc3BhcmVudCB0cmlhbmdsZSBvbiB0b3Agb2Ygb3RoZXIgcGFydCBvZiB0aGUgdGV4dC4KICAgRlBERl9QQUdFT0JKRUNUIGJsYWNrX3BhdGggPSBGUERGUGFnZU9ial9DcmVhdGVOZXdQYXRoKDIwLCA1MCk7CkBAIC0yNjAsMjQgKzQxNiw4MSBAQAogICBFWFBFQ1RfVFJVRShGUERGUGF0aF9MaW5lVG8oYmxhY2tfcGF0aCwgNDAsIDEwKSk7CiAgIEVYUEVDVF9UUlVFKEZQREZQYXRoX0Nsb3NlKGJsYWNrX3BhdGgpKTsKICAgRlBERlBhZ2VfSW5zZXJ0T2JqZWN0KHBhZ2UsIGJsYWNrX3BhdGgpOwotICBFWFBFQ1RfVFJVRShGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQocGFnZSkpOwogCiAgIC8vIFJlbmRlciBhbmQgY2hlY2sgdGhlIHJlc3VsdC4gVGV4dCBpcyBzbGlnaHRseSBkaWZmZXJlbnQgb24gTWFjLgogICBGUERGX0JJVE1BUCBiaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UpOwotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gIGNvbnN0IGNoYXIgbWQ1W10gPSAiMmY3YzBkZWVlMTBhOTQ5MDUzOGUxOTVhZjY0YmViNjciOworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXworICBjb25zdCBjaGFyIG1kNVtdID0gImY5ZTZmYTc0MjMwZjIzNDI4NmJmY2FkYTlmNzYwNmQ4IjsKICNlbHNlCi0gIGNvbnN0IGNoYXIgbWQ1W10gPSAiMTdjOTQyYzc2ZmYyMjkyMDBmMmM5ODA3M2JiNjBkODUiOworICBjb25zdCBjaGFyIG1kNVtdID0gImFhNzFiMDliOTNiNTVmNDY3ZjEyOTBlNTExMWJhYmVlIjsKICNlbmRpZgogICBDb21wYXJlQml0bWFwKGJpdG1hcCwgMjAwLCAyMDAsIG1kNSk7CiAgIEZQREZCaXRtYXBfRGVzdHJveShiaXRtYXApOwogICBVbmxvYWRQYWdlKHBhZ2UpOwogfQogCitURVNUX0YoRlBERkVkaXRFbWJlZGRlcnRlc3QsIEVkaXRPdmVyRXhpc3RpbmdDb250ZW50KSB7CisgIC8vIExvYWQgZG9jdW1lbnQgd2l0aCBleGlzdGluZyBjb250ZW50CisgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgiYnVnXzcxNy5wZGYiKSk7CisgIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoMCk7CisgIEVYUEVDVF9ORShudWxscHRyLCBwYWdlKTsKKworICAvLyBBZGQgYSB0cmFuc3BhcmVudCByZWN0YW5nbGUgb24gdG9wIG9mIHRoZSBleGlzdGluZyBjb250ZW50CisgIEZQREZfUEFHRU9CSkVDVCByZWRfcmVjdDIgPSBGUERGUGFnZU9ial9DcmVhdGVOZXdSZWN0KDkwLCA3MDAsIDI1LCA1MCk7CisgIEVYUEVDVF9UUlVFKEZQREZQYXRoX1NldEZpbGxDb2xvcihyZWRfcmVjdDIsIDI1NSwgMCwgMCwgMTAwKSk7CisgIEVYUEVDVF9UUlVFKEZQREZQYXRoX1NldERyYXdNb2RlKHJlZF9yZWN0MiwgRlBERl9GSUxMTU9ERV9BTFRFUk5BVEUsIDApKTsKKyAgRlBERlBhZ2VfSW5zZXJ0T2JqZWN0KHBhZ2UsIHJlZF9yZWN0Mik7CisKKyAgLy8gQWRkIGFuIG9wYXF1ZSByZWN0YW5nbGUgb24gdG9wIG9mIHRoZSBleGlzdGluZyBjb250ZW50CisgIEZQREZfUEFHRU9CSkVDVCByZWRfcmVjdCA9IEZQREZQYWdlT2JqX0NyZWF0ZU5ld1JlY3QoMTE1LCA3MDAsIDI1LCA1MCk7CisgIEVYUEVDVF9UUlVFKEZQREZQYXRoX1NldEZpbGxDb2xvcihyZWRfcmVjdCwgMjU1LCAwLCAwLCAyNTUpKTsKKyAgRVhQRUNUX1RSVUUoRlBERlBhdGhfU2V0RHJhd01vZGUocmVkX3JlY3QsIEZQREZfRklMTE1PREVfQUxURVJOQVRFLCAwKSk7CisgIEZQREZQYWdlX0luc2VydE9iamVjdChwYWdlLCByZWRfcmVjdCk7CisKKyAgRlBERl9CSVRNQVAgYml0bWFwID0gUmVuZGVyUGFnZShwYWdlKTsKKyAgQ29tcGFyZUJpdG1hcChiaXRtYXAsIDYxMiwgNzkyLCAiYWQwNGU1YmQwZjQ3MWE5YTU2NGZiMDM0YmQwZmIwNzMiKTsKKyAgRlBERkJpdG1hcF9EZXN0cm95KGJpdG1hcCk7CisgIEVYUEVDVF9UUlVFKEZQREZQYWdlX0dlbmVyYXRlQ29udGVudChwYWdlKSk7CisKKyAgLy8gTm93IHNhdmUgdGhlIHJlc3VsdCwgY2xvc2luZyB0aGUgcGFnZSBhbmQgZG9jdW1lbnQKKyAgRVhQRUNUX1RSVUUoRlBERl9TYXZlQXNDb3B5KGRvY3VtZW50KCksIHRoaXMsIDApKTsKKyAgVW5sb2FkUGFnZShwYWdlKTsKKworICBPcGVuU2F2ZWREb2N1bWVudCgpOworICBwYWdlID0gTG9hZFNhdmVkUGFnZSgwKTsKKyAgVmVyaWZ5U2F2ZWRSZW5kZXJpbmcocGFnZSwgNjEyLCA3OTIsICJhZDA0ZTViZDBmNDcxYTlhNTY0ZmIwMzRiZDBmYjA3MyIpOworCisgIENsZWFyU3RyaW5nKCk7CisgIC8vIEFkZCBhbm90aGVyIG9wYXF1ZSByZWN0YW5nbGUgb24gdG9wIG9mIHRoZSBleGlzdGluZyBjb250ZW50CisgIEZQREZfUEFHRU9CSkVDVCBncmVlbl9yZWN0ID0gRlBERlBhZ2VPYmpfQ3JlYXRlTmV3UmVjdCgxNTAsIDcwMCwgMjUsIDUwKTsKKyAgRVhQRUNUX1RSVUUoRlBERlBhdGhfU2V0RmlsbENvbG9yKGdyZWVuX3JlY3QsIDAsIDI1NSwgMCwgMjU1KSk7CisgIEVYUEVDVF9UUlVFKEZQREZQYXRoX1NldERyYXdNb2RlKGdyZWVuX3JlY3QsIEZQREZfRklMTE1PREVfQUxURVJOQVRFLCAwKSk7CisgIEZQREZQYWdlX0luc2VydE9iamVjdChwYWdlLCBncmVlbl9yZWN0KTsKKworICAvLyBBZGQgYW5vdGhlciB0cmFuc3BhcmVudCByZWN0YW5nbGUgb24gdG9wIG9mIGV4aXN0aW5nIGNvbnRlbnQKKyAgRlBERl9QQUdFT0JKRUNUIGdyZWVuX3JlY3QyID0gRlBERlBhZ2VPYmpfQ3JlYXRlTmV3UmVjdCgxNzUsIDcwMCwgMjUsIDUwKTsKKyAgRVhQRUNUX1RSVUUoRlBERlBhdGhfU2V0RmlsbENvbG9yKGdyZWVuX3JlY3QyLCAwLCAyNTUsIDAsIDEwMCkpOworICBFWFBFQ1RfVFJVRShGUERGUGF0aF9TZXREcmF3TW9kZShncmVlbl9yZWN0MiwgRlBERl9GSUxMTU9ERV9BTFRFUk5BVEUsIDApKTsKKyAgRlBERlBhZ2VfSW5zZXJ0T2JqZWN0KHBhZ2UsIGdyZWVuX3JlY3QyKTsKKyAgRlBERl9CSVRNQVAgbmV3X2JpdG1hcCA9IFJlbmRlclBhZ2VXaXRoRmxhZ3MocGFnZSwgbV9TYXZlZEZvcm0sIDApOworICBjb25zdCBjaGFyIGxhc3RfbWQ1W10gPSAiNGI1YjAwZjgyNDYyMGY4YzliODgwMWViYjk4ZTFjZGQiOworICBDb21wYXJlQml0bWFwKG5ld19iaXRtYXAsIDYxMiwgNzkyLCBsYXN0X21kNSk7CisgIEZQREZCaXRtYXBfRGVzdHJveShuZXdfYml0bWFwKTsKKyAgRVhQRUNUX1RSVUUoRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KHBhZ2UpKTsKKworICAvLyBOb3cgc2F2ZSB0aGUgcmVzdWx0LCBjbG9zaW5nIHRoZSBwYWdlIGFuZCBkb2N1bWVudAorICBFWFBFQ1RfVFJVRShGUERGX1NhdmVBc0NvcHkobV9TYXZlZERvY3VtZW50LCB0aGlzLCAwKSk7CisKKyAgQ2xvc2VTYXZlZFBhZ2UocGFnZSk7CisgIENsb3NlU2F2ZWREb2N1bWVudCgpOworCisgIC8vIFJlbmRlciB0aGUgc2F2ZWQgcmVzdWx0CisgIFZlcmlmeVNhdmVkRG9jdW1lbnQoNjEyLCA3OTIsIGxhc3RfbWQ1KTsKK30KKwogVEVTVF9GKEZQREZFZGl0RW1iZWRkZXJ0ZXN0LCBBZGRTdHJva2VkUGF0aHMpIHsKICAgLy8gU3RhcnQgd2l0aCBhIGJsYW5rIHBhZ2UKLSAgRlBERl9ET0NVTUVOVCBkb2MgPSBGUERGX0NyZWF0ZU5ld0RvY3VtZW50KCk7Ci0gIEZQREZfUEFHRSBwYWdlID0gRlBERlBhZ2VfTmV3KGRvYywgMCwgNjEyLCA3OTIpOworICBGUERGX1BBR0UgcGFnZSA9IEZQREZQYWdlX05ldyhDcmVhdGVOZXdEb2N1bWVudCgpLCAwLCA2MTIsIDc5Mik7CiAKICAgLy8gQWRkIGEgbGFyZ2Ugc3Ryb2tlZCByZWN0YW5nbGUgKGZpbGwgY29sb3Igc2hvdWxkIG5vdCBhZmZlY3QgaXQpLgogICBGUERGX1BBR0VPQkpFQ1QgcmVjdCA9IEZQREZQYWdlT2JqX0NyZWF0ZU5ld1JlY3QoMjAsIDIwLCAyMDAsIDQwMCk7CkBAIC0yODYsNyArNDk5LDYgQEAKICAgRVhQRUNUX1RSVUUoRlBERlBhdGhfU2V0U3Ryb2tlV2lkdGgocmVjdCwgMTUuMGYpKTsKICAgRVhQRUNUX1RSVUUoRlBERlBhdGhfU2V0RHJhd01vZGUocmVjdCwgMCwgMSkpOwogICBGUERGUGFnZV9JbnNlcnRPYmplY3QocGFnZSwgcmVjdCk7Ci0gIEVYUEVDVF9UUlVFKEZQREZQYWdlX0dlbmVyYXRlQ29udGVudChwYWdlKSk7CiAgIEZQREZfQklUTUFQIHBhZ2VfYml0bWFwID0gUmVuZGVyUGFnZShwYWdlKTsKICAgQ29tcGFyZUJpdG1hcChwYWdlX2JpdG1hcCwgNjEyLCA3OTIsICI2NGJkMzFmODYyYTg5ZTBhOWU1MDVhNWFmNmVmZDUwNiIpOwogICBGUERGQml0bWFwX0Rlc3Ryb3kocGFnZV9iaXRtYXApOwpAQCAtMzAxLDcgKzUxMyw2IEBACiAgIEVYUEVDVF9UUlVFKEZQREZQYXRoX1NldFN0cm9rZVdpZHRoKGNoZWNrLCA4LjM1ZikpOwogICBFWFBFQ1RfVFJVRShGUERGUGF0aF9TZXREcmF3TW9kZShjaGVjaywgMCwgMSkpOwogICBGUERGUGFnZV9JbnNlcnRPYmplY3QocGFnZSwgY2hlY2spOwotICBFWFBFQ1RfVFJVRShGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQocGFnZSkpOwogICBwYWdlX2JpdG1hcCA9IFJlbmRlclBhZ2UocGFnZSk7CiAgIENvbXBhcmVCaXRtYXAocGFnZV9iaXRtYXAsIDYxMiwgNzkyLCAiNGI2ZjNiOWQyNWM0ZTE5NDgyMTIxN2Q1MDE2YzM3MjQiKTsKICAgRlBERkJpdG1hcF9EZXN0cm95KHBhZ2VfYml0bWFwKTsKQEAgLTMxNyw2NCArNTI4LDcwIEBACiAgIEVYUEVDVF9UUlVFKEZQREZQYXRoX1NldFN0cm9rZVdpZHRoKHBhdGgsIDEwLjVmKSk7CiAgIEVYUEVDVF9UUlVFKEZQREZQYXRoX1NldERyYXdNb2RlKHBhdGgsIEZQREZfRklMTE1PREVfQUxURVJOQVRFLCAxKSk7CiAgIEZQREZQYWdlX0luc2VydE9iamVjdChwYWdlLCBwYXRoKTsKLSAgRVhQRUNUX1RSVUUoRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KHBhZ2UpKTsKICAgcGFnZV9iaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UpOwogICBDb21wYXJlQml0bWFwKHBhZ2VfYml0bWFwLCA2MTIsIDc5MiwgImZmM2U2YTIyMzI2NzU0OTQ0Y2M2ZTU2NjA5YWNkNzNiIik7CiAgIEZQREZCaXRtYXBfRGVzdHJveShwYWdlX2JpdG1hcCk7CiAgIEZQREZfQ2xvc2VQYWdlKHBhZ2UpOwotICBGUERGX0Nsb3NlRG9jdW1lbnQoZG9jKTsKIH0KIAogVEVTVF9GKEZQREZFZGl0RW1iZWRkZXJ0ZXN0LCBBZGRTdGFuZGFyZEZvbnRUZXh0KSB7CiAgIC8vIFN0YXJ0IHdpdGggYSBibGFuayBwYWdlCi0gIEZQREZfRE9DVU1FTlQgZG9jID0gRlBERl9DcmVhdGVOZXdEb2N1bWVudCgpOwotICBGUERGX1BBR0UgcGFnZSA9IEZQREZQYWdlX05ldyhkb2MsIDAsIDYxMiwgNzkyKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBGUERGUGFnZV9OZXcoQ3JlYXRlTmV3RG9jdW1lbnQoKSwgMCwgNjEyLCA3OTIpOwogCiAgIC8vIEFkZCBzb21lIHRleHQgdG8gdGhlIHBhZ2UKLSAgRlBERl9QQUdFT0JKRUNUIHRleHQxID0gRlBERlBhZ2VPYmpfTmV3VGV4dE9iaihkb2MsICJBcmlhbCIsIDEyLjBmKTsKLSAgRVhQRUNUX1RSVUUodGV4dDEpOwotICBFWFBFQ1RfVFJVRShGUERGVGV4dF9TZXRUZXh0KHRleHQxLCAiSSdtIGF0IHRoZSBib3R0b20gb2YgdGhlIHBhZ2UiKSk7Ci0gIEZQREZQYWdlT2JqX1RyYW5zZm9ybSh0ZXh0MSwgMSwgMCwgMCwgMSwgMjAsIDIwKTsKLSAgRlBERlBhZ2VfSW5zZXJ0T2JqZWN0KHBhZ2UsIHRleHQxKTsKLSAgRVhQRUNUX1RSVUUoRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KHBhZ2UpKTsKKyAgRlBERl9QQUdFT0JKRUNUIHRleHRfb2JqZWN0MSA9CisgICAgICBGUERGUGFnZU9ial9OZXdUZXh0T2JqKGRvY3VtZW50KCksICJBcmlhbCIsIDEyLjBmKTsKKyAgRVhQRUNUX1RSVUUodGV4dF9vYmplY3QxKTsKKyAgc3RkOjp1bmlxdWVfcHRyPHVuc2lnbmVkIHNob3J0LCBwZGZpdW06OkZyZWVEZWxldGVyPiB0ZXh0MSA9CisgICAgICBHZXRGUERGV2lkZVN0cmluZyhMIkknbSBhdCB0aGUgYm90dG9tIG9mIHRoZSBwYWdlIik7CisgIEVYUEVDVF9UUlVFKEZQREZUZXh0X1NldFRleHQodGV4dF9vYmplY3QxLCB0ZXh0MS5nZXQoKSkpOworICBGUERGUGFnZU9ial9UcmFuc2Zvcm0odGV4dF9vYmplY3QxLCAxLCAwLCAwLCAxLCAyMCwgMjApOworICBGUERGUGFnZV9JbnNlcnRPYmplY3QocGFnZSwgdGV4dF9vYmplY3QxKTsKICAgRlBERl9CSVRNQVAgcGFnZV9iaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UpOwotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gIGNvbnN0IGNoYXIgbWQ1W10gPSAiZTE5YzkwMzk1ZDczY2I5ZjM3YTZjM2IwZThiMThhOWUiOworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXworICBjb25zdCBjaGFyIG1kNVtdID0gImE0ZGRkYzFhMzkzMGZhNjk0YmJmZjk3ODlkYWI0MTYxIjsKICNlbHNlCi0gIGNvbnN0IGNoYXIgbWQ1W10gPSAiN2MzYTM2YmE3Y2VjMDE2ODhhMTZhMTRiZmVkOWVjZmMiOworICBjb25zdCBjaGFyIG1kNVtdID0gImVhY2FhMjQ1NzNiOGNlOTk3YjM4ODI1OTVmMDk2ZjAwIjsKICNlbmRpZgogICBDb21wYXJlQml0bWFwKHBhZ2VfYml0bWFwLCA2MTIsIDc5MiwgbWQ1KTsKICAgRlBERkJpdG1hcF9EZXN0cm95KHBhZ2VfYml0bWFwKTsKIAogICAvLyBUcnkgYW5vdGhlciBmb250Ci0gIEZQREZfUEFHRU9CSkVDVCB0ZXh0MiA9Ci0gICAgICBGUERGUGFnZU9ial9OZXdUZXh0T2JqKGRvYywgIlRpbWVzTmV3Um9tYW5Cb2xkIiwgMTUuMGYpOwotICBFWFBFQ1RfVFJVRSh0ZXh0Mik7Ci0gIEVYUEVDVF9UUlVFKEZQREZUZXh0X1NldFRleHQodGV4dDIsICJIaSwgSSdtIEJvbGQuIFRpbWVzIE5ldyBSb21hbiBCb2xkLiIpKTsKLSAgRlBERlBhZ2VPYmpfVHJhbnNmb3JtKHRleHQyLCAxLCAwLCAwLCAxLCAxMDAsIDYwMCk7Ci0gIEZQREZQYWdlX0luc2VydE9iamVjdChwYWdlLCB0ZXh0Mik7Ci0gIEVYUEVDVF9UUlVFKEZQREZQYWdlX0dlbmVyYXRlQ29udGVudChwYWdlKSk7CisgIEZQREZfUEFHRU9CSkVDVCB0ZXh0X29iamVjdDIgPQorICAgICAgRlBERlBhZ2VPYmpfTmV3VGV4dE9iaihkb2N1bWVudCgpLCAiVGltZXNOZXdSb21hbkJvbGQiLCAxNS4wZik7CisgIEVYUEVDVF9UUlVFKHRleHRfb2JqZWN0Mik7CisgIHN0ZDo6dW5pcXVlX3B0cjx1bnNpZ25lZCBzaG9ydCwgcGRmaXVtOjpGcmVlRGVsZXRlcj4gdGV4dDIgPQorICAgICAgR2V0RlBERldpZGVTdHJpbmcoTCJIaSwgSSdtIEJvbGQuIFRpbWVzIE5ldyBSb21hbiBCb2xkLiIpOworICBFWFBFQ1RfVFJVRShGUERGVGV4dF9TZXRUZXh0KHRleHRfb2JqZWN0MiwgdGV4dDIuZ2V0KCkpKTsKKyAgRlBERlBhZ2VPYmpfVHJhbnNmb3JtKHRleHRfb2JqZWN0MiwgMSwgMCwgMCwgMSwgMTAwLCA2MDApOworICBGUERGUGFnZV9JbnNlcnRPYmplY3QocGFnZSwgdGV4dF9vYmplY3QyKTsKICAgcGFnZV9iaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UpOwotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gIGNvbnN0IGNoYXIgbWQ1XzJbXSA9ICI4ZTFjNDNkY2E2YmU2OGQzNjRkYmMyODNmNTUyMTA0MSI7CisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCisgIGNvbnN0IGNoYXIgbWQ1XzJbXSA9ICJhNWM0YWNlNGM2ZjI3NjQ0MDk0ODEzZmUxNDQxYTIxYyI7CisjZWxpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXworICBjb25zdCBjaGFyIG1kNV8yW10gPSAiMjU4N2VhYzlhNzg3ZTk3YTM3NjM2ZDU0ZDExYmQyOGQiOwogI2Vsc2UKLSAgY29uc3QgY2hhciBtZDVfMltdID0gImUwZTA4NzNlM2EyNjM0YTYzOTRhNDMxYTUxY2U5MGZmIjsKKyAgY29uc3QgY2hhciBtZDVfMltdID0gIjc2ZmNjN2QwOGFhMTU0NDVlZmQyZTJjZWI3YzZjYzNiIjsKICNlbmRpZgogICBDb21wYXJlQml0bWFwKHBhZ2VfYml0bWFwLCA2MTIsIDc5MiwgbWQ1XzIpOwogICBGUERGQml0bWFwX0Rlc3Ryb3kocGFnZV9iaXRtYXApOwogCiAgIC8vIEFuZCBzb21lIHJhbmRvbWx5IHRyYW5zZm9ybWVkIHRleHQKLSAgRlBERl9QQUdFT0JKRUNUIHRleHQzID0gRlBERlBhZ2VPYmpfTmV3VGV4dE9iaihkb2MsICJDb3VyaWVyLUJvbGQiLCAyMC4wZik7Ci0gIEVYUEVDVF9UUlVFKHRleHQzKTsKLSAgRVhQRUNUX1RSVUUoRlBERlRleHRfU2V0VGV4dCh0ZXh0MywgIkNhbiB5b3UgcmVhZCBtZT8gPDopPiIpKTsKLSAgRlBERlBhZ2VPYmpfVHJhbnNmb3JtKHRleHQzLCAxLCAxLjUsIDIsIDAuNSwgMjAwLCAyMDApOwotICBGUERGUGFnZV9JbnNlcnRPYmplY3QocGFnZSwgdGV4dDMpOwotICBFWFBFQ1RfVFJVRShGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQocGFnZSkpOworICBGUERGX1BBR0VPQkpFQ1QgdGV4dF9vYmplY3QzID0KKyAgICAgIEZQREZQYWdlT2JqX05ld1RleHRPYmooZG9jdW1lbnQoKSwgIkNvdXJpZXItQm9sZCIsIDIwLjBmKTsKKyAgRVhQRUNUX1RSVUUodGV4dF9vYmplY3QzKTsKKyAgc3RkOjp1bmlxdWVfcHRyPHVuc2lnbmVkIHNob3J0LCBwZGZpdW06OkZyZWVEZWxldGVyPiB0ZXh0MyA9CisgICAgICBHZXRGUERGV2lkZVN0cmluZyhMIkNhbiB5b3UgcmVhZCBtZT8gPDopPiIpOworICBFWFBFQ1RfVFJVRShGUERGVGV4dF9TZXRUZXh0KHRleHRfb2JqZWN0MywgdGV4dDMuZ2V0KCkpKTsKKyAgRlBERlBhZ2VPYmpfVHJhbnNmb3JtKHRleHRfb2JqZWN0MywgMSwgMS41LCAyLCAwLjUsIDIwMCwgMjAwKTsKKyAgRlBERlBhZ2VfSW5zZXJ0T2JqZWN0KHBhZ2UsIHRleHRfb2JqZWN0Myk7CiAgIHBhZ2VfYml0bWFwID0gUmVuZGVyUGFnZShwYWdlKTsKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICBjb25zdCBjaGFyIG1kNV8zW10gPSAiYzZlNWRmNDQ4NDI4NzkzYzdlNGIwYzgyMGJkOGM4NWUiOworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXworICBjb25zdCBjaGFyIG1kNV8zW10gPSAiNDBiM2VmMDRmOTE1ZmY0YzQyMDg5NDgwMDE3NjM1NDQiOworI2VsaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KKyAgY29uc3QgY2hhciBtZDVfM1tdID0gIjdjYjYxZWMxMTJjZjQwMGI0ODkzNjBkNDQzZmZjOWQyIjsKICNlbHNlCi0gIGNvbnN0IGNoYXIgbWQ1XzNbXSA9ICI5MDNlZTEwYjZhOWYwYmU1MWVjYWQwYTFhMGVlYjE3MSI7CisgIGNvbnN0IGNoYXIgbWQ1XzNbXSA9ICJiOGEyMTY2OGYxZGFiNjI1YWY3YzA3MmUwN2ZjZWZjNCI7CiAjZW5kaWYKICAgQ29tcGFyZUJpdG1hcChwYWdlX2JpdG1hcCwgNjEyLCA3OTIsIG1kNV8zKTsKICAgRlBERkJpdG1hcF9EZXN0cm95KHBhZ2VfYml0bWFwKTsKQEAgLTM4MiwxMyArNTk5LDY1IEBACiAgIC8vIFRPRE8obnBtKTogV2h5IGFyZSB0aGVyZSBpc3N1ZXMgd2l0aCB0ZXh0IHJvdGF0ZWQgYnkgOTAgZGVncmVlcz8KICAgLy8gVE9ETyhucG0pOiBGUERGX1NhdmVBc0NvcHkgbm90IGdpdmluZyB0aGUgZGVzaXJlZCByZXN1bHQgYWZ0ZXIgdGhpcy4KICAgRlBERl9DbG9zZVBhZ2UocGFnZSk7Ci0gIEZQREZfQ2xvc2VEb2N1bWVudChkb2MpOworfQorCitURVNUX0YoRlBERkVkaXRFbWJlZGRlcnRlc3QsIEdyYXBoaWNzRGF0YSkgeworICAvLyBOZXcgcGFnZQorICBzdGQ6OnVuaXF1ZV9wdHI8dm9pZCwgRlBERlBhZ2VEZWxldGVyPiBwYWdlKAorICAgICAgRlBERlBhZ2VfTmV3KENyZWF0ZU5ld0RvY3VtZW50KCksIDAsIDYxMiwgNzkyKSk7CisKKyAgLy8gQ3JlYXRlIGEgcmVjdCB3aXRoIG5vbnRyaXZpYWwgZ3JhcGhpY3MKKyAgRlBERl9QQUdFT0JKRUNUIHJlY3QxID0gRlBERlBhZ2VPYmpfQ3JlYXRlTmV3UmVjdCgxMCwgMTAsIDEwMCwgMTAwKTsKKyAgRlBERlBhZ2VPYmpfU2V0QmxlbmRNb2RlKHJlY3QxLCAiQ29sb3IiKTsKKyAgRlBERlBhZ2VfSW5zZXJ0T2JqZWN0KHBhZ2UuZ2V0KCksIHJlY3QxKTsKKyAgRVhQRUNUX1RSVUUoRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KHBhZ2UuZ2V0KCkpKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBFeHRHU3RhdGUgd2FzIGNyZWF0ZWQKKyAgQ1BERl9QYWdlKiB0aGVfcGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UuZ2V0KCkpOworICBDUERGX0RpY3Rpb25hcnkqIGdyYXBoaWNzX2RpY3QgPQorICAgICAgdGhlX3BhZ2UtPm1fcFJlc291cmNlcy0+R2V0RGljdEZvcigiRXh0R1N0YXRlIik7CisgIEFTU0VSVF9UUlVFKGdyYXBoaWNzX2RpY3QpOworICBFWFBFQ1RfRVEoMiwgc3RhdGljX2Nhc3Q8aW50PihncmFwaGljc19kaWN0LT5HZXRDb3VudCgpKSk7CisKKyAgLy8gQWRkIGEgdGV4dCBvYmplY3QgY2F1c2luZyBubyBjaGFuZ2UgdG8gdGhlIGdyYXBoaWNzIGRpY3Rpb25hcnkKKyAgRlBERl9QQUdFT0JKRUNUIHRleHQxID0gRlBERlBhZ2VPYmpfTmV3VGV4dE9iaihkb2N1bWVudCgpLCAiQXJpYWwiLCAxMi4wZik7CisgIC8vIE9ubHkgYWxwaGEsIHRoZSBsYXN0IGNvbXBvbmVudCwgbWF0dGVycyBmb3IgdGhlIGdyYXBoaWNzIGRpY3Rpb25hcnkuIEFuZAorICAvLyB0aGUgZGVmYXVsdCB2YWx1ZSBpcyAyNTUuCisgIEVYUEVDVF9UUlVFKEZQREZUZXh0X1NldEZpbGxDb2xvcih0ZXh0MSwgMTAwLCAxMDAsIDEwMCwgMjU1KSk7CisgIEZQREZQYWdlX0luc2VydE9iamVjdChwYWdlLmdldCgpLCB0ZXh0MSk7CisgIEVYUEVDVF9UUlVFKEZQREZQYWdlX0dlbmVyYXRlQ29udGVudChwYWdlLmdldCgpKSk7CisgIEVYUEVDVF9FUSgyLCBzdGF0aWNfY2FzdDxpbnQ+KGdyYXBoaWNzX2RpY3QtPkdldENvdW50KCkpKTsKKworICAvLyBBZGQgYSB0ZXh0IG9iamVjdCBpbmNyZWFzaW5nIHRoZSBzaXplIG9mIHRoZSBncmFwaGljcyBkaWN0aW9uYXJ5CisgIEZQREZfUEFHRU9CSkVDVCB0ZXh0MiA9CisgICAgICBGUERGUGFnZU9ial9OZXdUZXh0T2JqKGRvY3VtZW50KCksICJUaW1lcy1Sb21hbiIsIDEyLjBmKTsKKyAgRlBERlBhZ2VfSW5zZXJ0T2JqZWN0KHBhZ2UuZ2V0KCksIHRleHQyKTsKKyAgRlBERlBhZ2VPYmpfU2V0QmxlbmRNb2RlKHRleHQyLCAiRGFya2VuIik7CisgIEVYUEVDVF9UUlVFKEZQREZUZXh0X1NldEZpbGxDb2xvcih0ZXh0MiwgMCwgMCwgMjU1LCAxNTApKTsKKyAgRVhQRUNUX1RSVUUoRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KHBhZ2UuZ2V0KCkpKTsKKyAgRVhQRUNUX0VRKDMsIHN0YXRpY19jYXN0PGludD4oZ3JhcGhpY3NfZGljdC0+R2V0Q291bnQoKSkpOworCisgIC8vIEFkZCBhIHBhdGggdGhhdCBzaG91bGQgcmV1c2UgZ3JhcGhpY3MKKyAgRlBERl9QQUdFT0JKRUNUIHBhdGggPSBGUERGUGFnZU9ial9DcmVhdGVOZXdQYXRoKDQwMCwgMTAwKTsKKyAgRlBERlBhZ2VPYmpfU2V0QmxlbmRNb2RlKHBhdGgsICJEYXJrZW4iKTsKKyAgRVhQRUNUX1RSVUUoRlBERlBhdGhfU2V0RmlsbENvbG9yKHBhdGgsIDIwMCwgMjAwLCAxMDAsIDE1MCkpOworICBGUERGUGFnZV9JbnNlcnRPYmplY3QocGFnZS5nZXQoKSwgcGF0aCk7CisgIEVYUEVDVF9UUlVFKEZQREZQYWdlX0dlbmVyYXRlQ29udGVudChwYWdlLmdldCgpKSk7CisgIEVYUEVDVF9FUSgzLCBzdGF0aWNfY2FzdDxpbnQ+KGdyYXBoaWNzX2RpY3QtPkdldENvdW50KCkpKTsKKworICAvLyBBZGQgYSByZWN0IGluY3JlYXNpbmcgdGhlIHNpemUgb2YgdGhlIGdyYXBoaWNzIGRpY3Rpb25hcnkKKyAgRlBERl9QQUdFT0JKRUNUIHJlY3QyID0gRlBERlBhZ2VPYmpfQ3JlYXRlTmV3UmVjdCgxMCwgMTAsIDEwMCwgMTAwKTsKKyAgRlBERlBhZ2VPYmpfU2V0QmxlbmRNb2RlKHJlY3QyLCAiRGFya2VuIik7CisgIEVYUEVDVF9UUlVFKEZQREZQYXRoX1NldEZpbGxDb2xvcihyZWN0MiwgMCwgMCwgMjU1LCAxNTApKTsKKyAgRVhQRUNUX1RSVUUoRlBERlBhdGhfU2V0U3Ryb2tlQ29sb3IocmVjdDIsIDAsIDAsIDAsIDIwMCkpOworICBGUERGUGFnZV9JbnNlcnRPYmplY3QocGFnZS5nZXQoKSwgcmVjdDIpOworICBFWFBFQ1RfVFJVRShGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQocGFnZS5nZXQoKSkpOworICBFWFBFQ1RfRVEoNCwgc3RhdGljX2Nhc3Q8aW50PihncmFwaGljc19kaWN0LT5HZXRDb3VudCgpKSk7CiB9CiAKIFRFU1RfRihGUERGRWRpdEVtYmVkZGVydGVzdCwgRG91YmxlR2VuZXJhdGluZykgewogICAvLyBTdGFydCB3aXRoIGEgYmxhbmsgcGFnZQotICBGUERGX0RPQ1VNRU5UIGRvYyA9IEZQREZfQ3JlYXRlTmV3RG9jdW1lbnQoKTsKLSAgRlBERl9QQUdFIHBhZ2UgPSBGUERGUGFnZV9OZXcoZG9jLCAwLCA2MTIsIDc5Mik7CisgIEZQREZfUEFHRSBwYWdlID0gRlBERlBhZ2VfTmV3KENyZWF0ZU5ld0RvY3VtZW50KCksIDAsIDYxMiwgNzkyKTsKIAogICAvLyBBZGQgYSByZWQgcmVjdGFuZ2xlIHdpdGggc29tZSBub24tZGVmYXVsdCBhbHBoYQogICBGUERGX1BBR0VPQkpFQ1QgcmVjdCA9IEZQREZQYWdlT2JqX0NyZWF0ZU5ld1JlY3QoMTAsIDEwLCAxMDAsIDEwMCk7CkBAIC00MDIsNyArNjcxLDcgQEAKICAgQ1BERl9EaWN0aW9uYXJ5KiBncmFwaGljc19kaWN0ID0KICAgICAgIHRoZV9wYWdlLT5tX3BSZXNvdXJjZXMtPkdldERpY3RGb3IoIkV4dEdTdGF0ZSIpOwogICBBU1NFUlRfVFJVRShncmFwaGljc19kaWN0KTsKLSAgRVhQRUNUX0VRKDEsIHN0YXRpY19jYXN0PGludD4oZ3JhcGhpY3NfZGljdC0+R2V0Q291bnQoKSkpOworICBFWFBFQ1RfRVEoMiwgc3RhdGljX2Nhc3Q8aW50PihncmFwaGljc19kaWN0LT5HZXRDb3VudCgpKSk7CiAKICAgLy8gQ2hlY2sgdGhlIGJpdG1hcAogICBGUERGX0JJVE1BUCBwYWdlX2JpdG1hcCA9IFJlbmRlclBhZ2UocGFnZSk7CkBAIC00MTIsNyArNjgxLDcgQEAKICAgLy8gTmV2ZXIgbWluZCwgbXkgbmV3IGZhdm9yaXRlIGNvbG9yIGlzIGJsdWUsIGluY3JlYXNlIGFscGhhCiAgIEVYUEVDVF9UUlVFKEZQREZQYXRoX1NldEZpbGxDb2xvcihyZWN0LCAwLCAwLCAyNTUsIDE4MCkpOwogICBFWFBFQ1RfVFJVRShGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQocGFnZSkpOwotICBFWFBFQ1RfRVEoMiwgc3RhdGljX2Nhc3Q8aW50PihncmFwaGljc19kaWN0LT5HZXRDb3VudCgpKSk7CisgIEVYUEVDVF9FUSgzLCBzdGF0aWNfY2FzdDxpbnQ+KGdyYXBoaWNzX2RpY3QtPkdldENvdW50KCkpKTsKIAogICAvLyBDaGVjayB0aGF0IGJpdG1hcCBkaXNwbGF5cyBjaGFuZ2VkIGNvbnRlbnQKICAgcGFnZV9iaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UpOwpAQCAtNDIxLDE2ICs2OTAsMTkgQEAKIAogICAvLyBBbmQgbm93IGdlbmVyYXRlLCB3aXRob3V0IGNoYW5nZXMKICAgRVhQRUNUX1RSVUUoRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KHBhZ2UpKTsKLSAgRVhQRUNUX0VRKDIsIHN0YXRpY19jYXN0PGludD4oZ3JhcGhpY3NfZGljdC0+R2V0Q291bnQoKSkpOworICBFWFBFQ1RfRVEoMywgc3RhdGljX2Nhc3Q8aW50PihncmFwaGljc19kaWN0LT5HZXRDb3VudCgpKSk7CiAgIHBhZ2VfYml0bWFwID0gUmVuZGVyUGFnZShwYWdlKTsKICAgQ29tcGFyZUJpdG1hcChwYWdlX2JpdG1hcCwgNjEyLCA3OTIsICIyZTUxNjU2ZjUwNzNiMGJlZTYxMWQ5Y2QwODZhYTA5YyIpOwogICBGUERGQml0bWFwX0Rlc3Ryb3kocGFnZV9iaXRtYXApOwogCiAgIC8vIEFkZCBzb21lIHRleHQgdG8gdGhlIHBhZ2UKLSAgRlBERl9QQUdFT0JKRUNUIHRleHQgPSBGUERGUGFnZU9ial9OZXdUZXh0T2JqKGRvYywgIkFyaWFsIiwgMTIuMGYpOwotICBFWFBFQ1RfVFJVRShGUERGVGV4dF9TZXRUZXh0KHRleHQsICJTb21ldGhpbmcgc29tZXRoaW5nICN0ZXh0IyBzb21ldGhpbmciKSk7Ci0gIEZQREZQYWdlT2JqX1RyYW5zZm9ybSh0ZXh0LCAxLCAwLCAwLCAxLCAzMDAsIDMwMCk7Ci0gIEZQREZQYWdlX0luc2VydE9iamVjdChwYWdlLCB0ZXh0KTsKKyAgRlBERl9QQUdFT0JKRUNUIHRleHRfb2JqZWN0ID0KKyAgICAgIEZQREZQYWdlT2JqX05ld1RleHRPYmooZG9jdW1lbnQoKSwgIkFyaWFsIiwgMTIuMGYpOworICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IHRleHQgPQorICAgICAgR2V0RlBERldpZGVTdHJpbmcoTCJTb21ldGhpbmcgc29tZXRoaW5nICN0ZXh0IyBzb21ldGhpbmciKTsKKyAgRVhQRUNUX1RSVUUoRlBERlRleHRfU2V0VGV4dCh0ZXh0X29iamVjdCwgdGV4dC5nZXQoKSkpOworICBGUERGUGFnZU9ial9UcmFuc2Zvcm0odGV4dF9vYmplY3QsIDEsIDAsIDAsIDEsIDMwMCwgMzAwKTsKKyAgRlBERlBhZ2VfSW5zZXJ0T2JqZWN0KHBhZ2UsIHRleHRfb2JqZWN0KTsKICAgRVhQRUNUX1RSVUUoRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KHBhZ2UpKTsKICAgQ1BERl9EaWN0aW9uYXJ5KiBmb250X2RpY3QgPSB0aGVfcGFnZS0+bV9wUmVzb3VyY2VzLT5HZXREaWN0Rm9yKCJGb250Iik7CiAgIEFTU0VSVF9UUlVFKGZvbnRfZGljdCk7CkBAIC00MzgsNjggKzcxMCw1MzAgQEAKIAogICAvLyBHZW5lcmF0ZSB5ZXQgYWdhaW4sIGNoZWNrIGRpY3RzIGFyZSByZWFzb25hYmx5IHNpemVkCiAgIEVYUEVDVF9UUlVFKEZQREZQYWdlX0dlbmVyYXRlQ29udGVudChwYWdlKSk7Ci0gIEVYUEVDVF9FUSgyLCBzdGF0aWNfY2FzdDxpbnQ+KGdyYXBoaWNzX2RpY3QtPkdldENvdW50KCkpKTsKKyAgRVhQRUNUX0VRKDMsIHN0YXRpY19jYXN0PGludD4oZ3JhcGhpY3NfZGljdC0+R2V0Q291bnQoKSkpOwogICBFWFBFQ1RfRVEoMSwgc3RhdGljX2Nhc3Q8aW50Pihmb250X2RpY3QtPkdldENvdW50KCkpKTsKICAgRlBERl9DbG9zZVBhZ2UocGFnZSk7Ci0gIEZQREZfQ2xvc2VEb2N1bWVudChkb2MpOwogfQogCi1URVNUX0YoRlBERkVkaXRFbWJlZGRlcnRlc3QsIFR5cGUxRm9udCkgewotICAvLyBDcmVhdGUgYSBuZXcgZG9jdW1lbnQKLSAgRlBERl9ET0NVTUVOVCBkb2MgPSBGUERGX0NyZWF0ZU5ld0RvY3VtZW50KCk7Ci0gIENQREZfRG9jdW1lbnQqIGRvY3VtZW50ID0gcmVpbnRlcnByZXRfY2FzdDxDUERGX0RvY3VtZW50Kj4oZG9jKTsKK1RFU1RfRihGUERGRWRpdEVtYmVkZGVydGVzdCwgTG9hZFNpbXBsZVR5cGUxRm9udCkgeworICBDcmVhdGVOZXdEb2N1bWVudCgpOworICAvLyBUT0RPKG5wbSk6IHVzZSBvdGhlciBmb250cyBhZnRlciBkaXNhbGxvd2luZyBsb2FkaW5nIGFueSBmb250IGFzIGFueSB0eXBlCisgIGNvbnN0IENQREZfRm9udCogc3RvY2tfZm9udCA9CisgICAgICBDUERGX0ZvbnQ6OkdldFN0b2NrRm9udChjcGRmX2RvYygpLCAiVGltZXMtQm9sZCIpOworICBjb25zdCB1aW50OF90KiBkYXRhID0gc3RvY2tfZm9udC0+R2V0Rm9udCgpLT5HZXRGb250RGF0YSgpOworICBjb25zdCB1aW50MzJfdCBzaXplID0gc3RvY2tfZm9udC0+R2V0Rm9udCgpLT5HZXRTaXplKCk7CisgIHN0ZDo6dW5pcXVlX3B0cjx2b2lkLCBGUERGRm9udERlbGV0ZXI+IGZvbnQoCisgICAgICBGUERGVGV4dF9Mb2FkRm9udChkb2N1bWVudCgpLCBkYXRhLCBzaXplLCBGUERGX0ZPTlRfVFlQRTEsIGZhbHNlKSk7CisgIEFTU0VSVF9UUlVFKGZvbnQuZ2V0KCkpOworICBDUERGX0ZvbnQqIHR5cGVkX2ZvbnQgPSBzdGF0aWNfY2FzdDxDUERGX0ZvbnQqPihmb250LmdldCgpKTsKKyAgRVhQRUNUX1RSVUUodHlwZWRfZm9udC0+SXNUeXBlMUZvbnQoKSk7CiAKLSAgLy8gR2V0IFRpbWVzIE5ldyBSb21hbiBCb2xkIGFzIGEgVHlwZSAxIGZvbnQKLSAgQ1BERl9Gb250KiB0aW1lc19ib2xkID0gQ1BERl9Gb250OjpHZXRTdG9ja0ZvbnQoZG9jdW1lbnQsICJUaW1lcy1Cb2xkIik7Ci0gIHVpbnQ4X3QqIGRhdGEgPSB0aW1lc19ib2xkLT5tX0ZvbnQuR2V0Rm9udERhdGEoKTsKLSAgdWludDMyX3Qgc2l6ZSA9IHRpbWVzX2JvbGQtPm1fRm9udC5HZXRTaXplKCk7Ci0gIEZQREZfRk9OVCBmb250ID0gRlBERlRleHRfTG9hZFR5cGUxRm9udChkb2MsIGRhdGEsIHNpemUpOwotICBBU1NFUlRfVFJVRShmb250KTsKLSAgQ1BERl9Gb250KiB0eXBlMV9mb250ID0gcmVpbnRlcnByZXRfY2FzdDxDUERGX0ZvbnQqPihmb250KTsKLSAgRVhQRUNUX1RSVUUodHlwZTFfZm9udC0+SXNUeXBlMUZvbnQoKSk7Ci0KLSAgLy8gQ2hlY2sgdGhhdCB0aGUgZm9udCBkaWN0aW9uYXJ5IGhhcyB0aGUgcmVxdWlyZWQga2V5cyBhY2NvcmRpbmcgdG8gdGhlIHNwZWMKLSAgQ1BERl9EaWN0aW9uYXJ5KiBmb250X2RpY3QgPSB0eXBlMV9mb250LT5HZXRGb250RGljdCgpOworICBDUERGX0RpY3Rpb25hcnkqIGZvbnRfZGljdCA9IHR5cGVkX2ZvbnQtPkdldEZvbnREaWN0KCk7CiAgIEVYUEVDVF9FUSgiRm9udCIsIGZvbnRfZGljdC0+R2V0U3RyaW5nRm9yKCJUeXBlIikpOwogICBFWFBFQ1RfRVEoIlR5cGUxIiwgZm9udF9kaWN0LT5HZXRTdHJpbmdGb3IoIlN1YnR5cGUiKSk7CiAgIEVYUEVDVF9FUSgiVGltZXMgTmV3IFJvbWFuIEJvbGQiLCBmb250X2RpY3QtPkdldFN0cmluZ0ZvcigiQmFzZUZvbnQiKSk7CiAgIEFTU0VSVF9UUlVFKGZvbnRfZGljdC0+S2V5RXhpc3QoIkZpcnN0Q2hhciIpKTsKICAgQVNTRVJUX1RSVUUoZm9udF9kaWN0LT5LZXlFeGlzdCgiTGFzdENoYXIiKSk7CiAgIEVYUEVDVF9FUSgzMiwgZm9udF9kaWN0LT5HZXRJbnRlZ2VyRm9yKCJGaXJzdENoYXIiKSk7Ci0gIEVYUEVDVF9FUSg2NTUzMiwgZm9udF9kaWN0LT5HZXRJbnRlZ2VyRm9yKCJMYXN0Q2hhciIpKTsKLSAgQVNTRVJUX1RSVUUoZm9udF9kaWN0LT5LZXlFeGlzdCgiV2lkdGhzIikpOworICBFWFBFQ1RfRVEoMjU1LCBmb250X2RpY3QtPkdldEludGVnZXJGb3IoIkxhc3RDaGFyIikpOworCiAgIENQREZfQXJyYXkqIHdpZHRoc19hcnJheSA9IGZvbnRfZGljdC0+R2V0QXJyYXlGb3IoIldpZHRocyIpOwotICBFWFBFQ1RfRVEoNjU1MDFVLCB3aWR0aHNfYXJyYXktPkdldENvdW50KCkpOworICBBU1NFUlRfVFJVRSh3aWR0aHNfYXJyYXkpOworICBBU1NFUlRfRVEoMjI0VSwgd2lkdGhzX2FycmF5LT5HZXRDb3VudCgpKTsKICAgRVhQRUNUX0VRKDI1MCwgd2lkdGhzX2FycmF5LT5HZXROdW1iZXJBdCgwKSk7Ci0gIEVYUEVDVF9FUSgwLCB3aWR0aHNfYXJyYXktPkdldE51bWJlckF0KDgxNzIpKTsKLSAgRVhQRUNUX0VRKDEwMDAsIHdpZHRoc19hcnJheS0+R2V0TnVtYmVyQXQoNjU1MDApKTsKLSAgQVNTRVJUX1RSVUUoZm9udF9kaWN0LT5LZXlFeGlzdCgiRm9udERlc2NyaXB0b3IiKSk7Ci0gIENQREZfRGljdGlvbmFyeSogZm9udF9kZXNjID0gZm9udF9kaWN0LT5HZXREaWN0Rm9yKCJGb250RGVzY3JpcHRvciIpOwotICBFWFBFQ1RfRVEoIkZvbnREZXNjcmlwdG9yIiwgZm9udF9kZXNjLT5HZXRTdHJpbmdGb3IoIlR5cGUiKSk7Ci0gIEVYUEVDVF9FUShmb250X2RpY3QtPkdldFN0cmluZ0ZvcigiQmFzZUZvbnQiKSwKLSAgICAgICAgICAgIGZvbnRfZGVzYy0+R2V0U3RyaW5nRm9yKCJGb250TmFtZSIpKTsKKyAgRVhQRUNUX0VRKDU2OSwgd2lkdGhzX2FycmF5LT5HZXROdW1iZXJBdCgxMSkpOworICBFWFBFQ1RfRVEoNTAwLCB3aWR0aHNfYXJyYXktPkdldE51bWJlckF0KDIyMykpOworICBDaGVja0ZvbnREZXNjcmlwdG9yKGZvbnRfZGljdCwgRlBERl9GT05UX1RZUEUxLCB0cnVlLCBmYWxzZSwgc2l6ZSwgZGF0YSk7Cit9CiAKLSAgLy8gQ2hlY2sgdGhhdCB0aGUgZm9udCBkZXNjcmlwdG9yIGhhcyB0aGUgcmVxdWlyZWQga2V5cyBhY2NvcmRpbmcgdG8gdGhlIHNwZWMKLSAgQVNTRVJUX1RSVUUoZm9udF9kZXNjLT5LZXlFeGlzdCgiRmxhZ3MiKSk7Ci0gIGludCBmb250X2ZsYWdzID0gZm9udF9kZXNjLT5HZXRJbnRlZ2VyRm9yKCJGbGFncyIpOwotICBFWFBFQ1RfVFJVRShmb250X2ZsYWdzICYgRlhGT05UX0JPTEQpOwotICBFWFBFQ1RfVFJVRShmb250X2ZsYWdzICYgRlhGT05UX05PTlNZTUJPTElDKTsKLSAgQVNTRVJUX1RSVUUoZm9udF9kZXNjLT5LZXlFeGlzdCgiRm9udEJCb3giKSk7Ci0gIEVYUEVDVF9FUSg0VSwgZm9udF9kZXNjLT5HZXRBcnJheUZvcigiRm9udEJCb3giKS0+R2V0Q291bnQoKSk7Ci0gIEVYUEVDVF9UUlVFKGZvbnRfZGVzYy0+S2V5RXhpc3QoIkl0YWxpY0FuZ2xlIikpOwotICBFWFBFQ1RfVFJVRShmb250X2Rlc2MtPktleUV4aXN0KCJBc2NlbnQiKSk7Ci0gIEVYUEVDVF9UUlVFKGZvbnRfZGVzYy0+S2V5RXhpc3QoIkRlc2NlbnQiKSk7Ci0gIEVYUEVDVF9UUlVFKGZvbnRfZGVzYy0+S2V5RXhpc3QoIkNhcEhlaWdodCIpKTsKLSAgRVhQRUNUX1RSVUUoZm9udF9kZXNjLT5LZXlFeGlzdCgiU3RlbVYiKSk7Ci0gIEFTU0VSVF9UUlVFKGZvbnRfZGVzYy0+S2V5RXhpc3QoIkZvbnRGaWxlIikpOworVEVTVF9GKEZQREZFZGl0RW1iZWRkZXJ0ZXN0LCBMb2FkU2ltcGxlVHJ1ZVR5cGVGb250KSB7CisgIENyZWF0ZU5ld0RvY3VtZW50KCk7CisgIGNvbnN0IENQREZfRm9udCogc3RvY2tfZm9udCA9IENQREZfRm9udDo6R2V0U3RvY2tGb250KGNwZGZfZG9jKCksICJDb3VyaWVyIik7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBzdG9ja19mb250LT5HZXRGb250KCktPkdldEZvbnREYXRhKCk7CisgIGNvbnN0IHVpbnQzMl90IHNpemUgPSBzdG9ja19mb250LT5HZXRGb250KCktPkdldFNpemUoKTsKKyAgc3RkOjp1bmlxdWVfcHRyPHZvaWQsIEZQREZGb250RGVsZXRlcj4gZm9udCgKKyAgICAgIEZQREZUZXh0X0xvYWRGb250KGRvY3VtZW50KCksIGRhdGEsIHNpemUsIEZQREZfRk9OVF9UUlVFVFlQRSwgZmFsc2UpKTsKKyAgQVNTRVJUX1RSVUUoZm9udC5nZXQoKSk7CisgIENQREZfRm9udCogdHlwZWRfZm9udCA9IHN0YXRpY19jYXN0PENQREZfRm9udCo+KGZvbnQuZ2V0KCkpOworICBFWFBFQ1RfVFJVRSh0eXBlZF9mb250LT5Jc1RydWVUeXBlRm9udCgpKTsKIAotICAvLyBDaGVjayB0aGF0IHRoZSBmb250IHN0cmVhbSBpcyB0aGUgb25lIHRoYXQgd2FzIHByb3ZpZGVkCi0gIENQREZfU3RyZWFtKiBmb250X3N0cmVhbSA9IGZvbnRfZGVzYy0+R2V0U3RyZWFtRm9yKCJGb250RmlsZSIpOwotICBBU1NFUlRfRVEoc2l6ZSwgZm9udF9zdHJlYW0tPkdldFJhd1NpemUoKSk7Ci0gIHVpbnQ4X3QqIHN0cmVhbV9kYXRhID0gZm9udF9zdHJlYW0tPkdldFJhd0RhdGEoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgRVhQRUNUX0VRKGRhdGFbaV0sIHN0cmVhbV9kYXRhW2ldKTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBmb250X2RpY3QgPSB0eXBlZF9mb250LT5HZXRGb250RGljdCgpOworICBFWFBFQ1RfRVEoIkZvbnQiLCBmb250X2RpY3QtPkdldFN0cmluZ0ZvcigiVHlwZSIpKTsKKyAgRVhQRUNUX0VRKCJUcnVlVHlwZSIsIGZvbnRfZGljdC0+R2V0U3RyaW5nRm9yKCJTdWJ0eXBlIikpOworICBFWFBFQ1RfRVEoIkNvdXJpZXIgTmV3IiwgZm9udF9kaWN0LT5HZXRTdHJpbmdGb3IoIkJhc2VGb250IikpOworICBBU1NFUlRfVFJVRShmb250X2RpY3QtPktleUV4aXN0KCJGaXJzdENoYXIiKSk7CisgIEFTU0VSVF9UUlVFKGZvbnRfZGljdC0+S2V5RXhpc3QoIkxhc3RDaGFyIikpOworICBFWFBFQ1RfRVEoMzIsIGZvbnRfZGljdC0+R2V0SW50ZWdlckZvcigiRmlyc3RDaGFyIikpOworICBFWFBFQ1RfRVEoMjU1LCBmb250X2RpY3QtPkdldEludGVnZXJGb3IoIkxhc3RDaGFyIikpOwogCi0gIC8vIENsb3NlIGRvY3VtZW50Ci0gIEZQREZfQ2xvc2VEb2N1bWVudChkb2MpOworICBDUERGX0FycmF5KiB3aWR0aHNfYXJyYXkgPSBmb250X2RpY3QtPkdldEFycmF5Rm9yKCJXaWR0aHMiKTsKKyAgQVNTRVJUX1RSVUUod2lkdGhzX2FycmF5KTsKKyAgQVNTRVJUX0VRKDIyNFUsIHdpZHRoc19hcnJheS0+R2V0Q291bnQoKSk7CisgIEVYUEVDVF9FUSg2MDAsIHdpZHRoc19hcnJheS0+R2V0TnVtYmVyQXQoMzMpKTsKKyAgRVhQRUNUX0VRKDYwMCwgd2lkdGhzX2FycmF5LT5HZXROdW1iZXJBdCg3NCkpOworICBFWFBFQ1RfRVEoNjAwLCB3aWR0aHNfYXJyYXktPkdldE51bWJlckF0KDIyMykpOworICBDaGVja0ZvbnREZXNjcmlwdG9yKGZvbnRfZGljdCwgRlBERl9GT05UX1RSVUVUWVBFLCBmYWxzZSwgZmFsc2UsIHNpemUsIGRhdGEpOworfQorCitURVNUX0YoRlBERkVkaXRFbWJlZGRlcnRlc3QsIExvYWRDSURUeXBlMEZvbnQpIHsKKyAgQ3JlYXRlTmV3RG9jdW1lbnQoKTsKKyAgY29uc3QgQ1BERl9Gb250KiBzdG9ja19mb250ID0KKyAgICAgIENQREZfRm9udDo6R2V0U3RvY2tGb250KGNwZGZfZG9jKCksICJUaW1lcy1Sb21hbiIpOworICBjb25zdCB1aW50OF90KiBkYXRhID0gc3RvY2tfZm9udC0+R2V0Rm9udCgpLT5HZXRGb250RGF0YSgpOworICBjb25zdCB1aW50MzJfdCBzaXplID0gc3RvY2tfZm9udC0+R2V0Rm9udCgpLT5HZXRTaXplKCk7CisgIHN0ZDo6dW5pcXVlX3B0cjx2b2lkLCBGUERGRm9udERlbGV0ZXI+IGZvbnQoCisgICAgICBGUERGVGV4dF9Mb2FkRm9udChkb2N1bWVudCgpLCBkYXRhLCBzaXplLCBGUERGX0ZPTlRfVFlQRTEsIDEpKTsKKyAgQVNTRVJUX1RSVUUoZm9udC5nZXQoKSk7CisgIENQREZfRm9udCogdHlwZWRfZm9udCA9IHN0YXRpY19jYXN0PENQREZfRm9udCo+KGZvbnQuZ2V0KCkpOworICBFWFBFQ1RfVFJVRSh0eXBlZF9mb250LT5Jc0NJREZvbnQoKSk7CisKKyAgLy8gQ2hlY2sgZm9udCBkaWN0aW9uYXJ5IGVudHJpZXMKKyAgQ1BERl9EaWN0aW9uYXJ5KiBmb250X2RpY3QgPSB0eXBlZF9mb250LT5HZXRGb250RGljdCgpOworICBFWFBFQ1RfRVEoIkZvbnQiLCBmb250X2RpY3QtPkdldFN0cmluZ0ZvcigiVHlwZSIpKTsKKyAgRVhQRUNUX0VRKCJUeXBlMCIsIGZvbnRfZGljdC0+R2V0U3RyaW5nRm9yKCJTdWJ0eXBlIikpOworICBFWFBFQ1RfRVEoIlRpbWVzIE5ldyBSb21hbi1JZGVudGl0eS1IIiwgZm9udF9kaWN0LT5HZXRTdHJpbmdGb3IoIkJhc2VGb250IikpOworICBFWFBFQ1RfRVEoIklkZW50aXR5LUgiLCBmb250X2RpY3QtPkdldFN0cmluZ0ZvcigiRW5jb2RpbmciKSk7CisgIENQREZfQXJyYXkqIGRlc2NlbmRhbnRfYXJyYXkgPSBmb250X2RpY3QtPkdldEFycmF5Rm9yKCJEZXNjZW5kYW50Rm9udHMiKTsKKyAgQVNTRVJUX1RSVUUoZGVzY2VuZGFudF9hcnJheSk7CisgIEVYUEVDVF9FUSgxVSwgZGVzY2VuZGFudF9hcnJheS0+R2V0Q291bnQoKSk7CisKKyAgLy8gQ2hlY2sgdGhlIENJREZvbnREaWN0CisgIENQREZfRGljdGlvbmFyeSogY2lkZm9udF9kaWN0ID0gZGVzY2VuZGFudF9hcnJheS0+R2V0RGljdEF0KDApOworICBFWFBFQ1RfRVEoIkZvbnQiLCBjaWRmb250X2RpY3QtPkdldFN0cmluZ0ZvcigiVHlwZSIpKTsKKyAgRVhQRUNUX0VRKCJDSURGb250VHlwZTAiLCBjaWRmb250X2RpY3QtPkdldFN0cmluZ0ZvcigiU3VidHlwZSIpKTsKKyAgRVhQRUNUX0VRKCJUaW1lcyBOZXcgUm9tYW4iLCBjaWRmb250X2RpY3QtPkdldFN0cmluZ0ZvcigiQmFzZUZvbnQiKSk7CisgIENQREZfRGljdGlvbmFyeSogY2lkaW5mb19kaWN0ID0gY2lkZm9udF9kaWN0LT5HZXREaWN0Rm9yKCJDSURTeXN0ZW1JbmZvIik7CisgIEFTU0VSVF9UUlVFKGNpZGluZm9fZGljdCk7CisgIEVYUEVDVF9FUSgiQWRvYmUiLCBjaWRpbmZvX2RpY3QtPkdldFN0cmluZ0ZvcigiUmVnaXN0cnkiKSk7CisgIEVYUEVDVF9FUSgiSWRlbnRpdHkiLCBjaWRpbmZvX2RpY3QtPkdldFN0cmluZ0ZvcigiT3JkZXJpbmciKSk7CisgIEVYUEVDVF9FUSgwLCBjaWRpbmZvX2RpY3QtPkdldE51bWJlckZvcigiU3VwcGxlbWVudCIpKTsKKyAgQ2hlY2tGb250RGVzY3JpcHRvcihjaWRmb250X2RpY3QsIEZQREZfRk9OVF9UWVBFMSwgZmFsc2UsIGZhbHNlLCBzaXplLCBkYXRhKTsKKworICAvLyBDaGVjayB3aWR0aHMKKyAgQ1BERl9BcnJheSogd2lkdGhzX2FycmF5ID0gY2lkZm9udF9kaWN0LT5HZXRBcnJheUZvcigiVyIpOworICBBU1NFUlRfVFJVRSh3aWR0aHNfYXJyYXkpOworICBFWFBFQ1RfR1Qod2lkdGhzX2FycmF5LT5HZXRDb3VudCgpLCAxVSk7CisgIENoZWNrQ29tcG9zaXRlRm9udFdpZHRocyh3aWR0aHNfYXJyYXksIHR5cGVkX2ZvbnQpOworfQorCitURVNUX0YoRlBERkVkaXRFbWJlZGRlcnRlc3QsIExvYWRDSURUeXBlMkZvbnQpIHsKKyAgQ3JlYXRlTmV3RG9jdW1lbnQoKTsKKyAgY29uc3QgQ1BERl9Gb250KiBzdG9ja19mb250ID0KKyAgICAgIENQREZfRm9udDo6R2V0U3RvY2tGb250KGNwZGZfZG9jKCksICJIZWx2ZXRpY2EtT2JsaXF1ZSIpOworICBjb25zdCB1aW50OF90KiBkYXRhID0gc3RvY2tfZm9udC0+R2V0Rm9udCgpLT5HZXRGb250RGF0YSgpOworICBjb25zdCB1aW50MzJfdCBzaXplID0gc3RvY2tfZm9udC0+R2V0Rm9udCgpLT5HZXRTaXplKCk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPHZvaWQsIEZQREZGb250RGVsZXRlcj4gZm9udCgKKyAgICAgIEZQREZUZXh0X0xvYWRGb250KGRvY3VtZW50KCksIGRhdGEsIHNpemUsIEZQREZfRk9OVF9UUlVFVFlQRSwgMSkpOworICBBU1NFUlRfVFJVRShmb250LmdldCgpKTsKKyAgQ1BERl9Gb250KiB0eXBlZF9mb250ID0gc3RhdGljX2Nhc3Q8Q1BERl9Gb250Kj4oZm9udC5nZXQoKSk7CisgIEVYUEVDVF9UUlVFKHR5cGVkX2ZvbnQtPklzQ0lERm9udCgpKTsKKworICAvLyBDaGVjayBmb250IGRpY3Rpb25hcnkgZW50cmllcworICBDUERGX0RpY3Rpb25hcnkqIGZvbnRfZGljdCA9IHR5cGVkX2ZvbnQtPkdldEZvbnREaWN0KCk7CisgIEVYUEVDVF9FUSgiRm9udCIsIGZvbnRfZGljdC0+R2V0U3RyaW5nRm9yKCJUeXBlIikpOworICBFWFBFQ1RfRVEoIlR5cGUwIiwgZm9udF9kaWN0LT5HZXRTdHJpbmdGb3IoIlN1YnR5cGUiKSk7CisgIEVYUEVDVF9FUSgiQXJpYWwgSXRhbGljIiwgZm9udF9kaWN0LT5HZXRTdHJpbmdGb3IoIkJhc2VGb250IikpOworICBFWFBFQ1RfRVEoIklkZW50aXR5LUgiLCBmb250X2RpY3QtPkdldFN0cmluZ0ZvcigiRW5jb2RpbmciKSk7CisgIENQREZfQXJyYXkqIGRlc2NlbmRhbnRfYXJyYXkgPSBmb250X2RpY3QtPkdldEFycmF5Rm9yKCJEZXNjZW5kYW50Rm9udHMiKTsKKyAgQVNTRVJUX1RSVUUoZGVzY2VuZGFudF9hcnJheSk7CisgIEVYUEVDVF9FUSgxVSwgZGVzY2VuZGFudF9hcnJheS0+R2V0Q291bnQoKSk7CisKKyAgLy8gQ2hlY2sgdGhlIENJREZvbnREaWN0CisgIENQREZfRGljdGlvbmFyeSogY2lkZm9udF9kaWN0ID0gZGVzY2VuZGFudF9hcnJheS0+R2V0RGljdEF0KDApOworICBFWFBFQ1RfRVEoIkZvbnQiLCBjaWRmb250X2RpY3QtPkdldFN0cmluZ0ZvcigiVHlwZSIpKTsKKyAgRVhQRUNUX0VRKCJDSURGb250VHlwZTIiLCBjaWRmb250X2RpY3QtPkdldFN0cmluZ0ZvcigiU3VidHlwZSIpKTsKKyAgRVhQRUNUX0VRKCJBcmlhbCBJdGFsaWMiLCBjaWRmb250X2RpY3QtPkdldFN0cmluZ0ZvcigiQmFzZUZvbnQiKSk7CisgIENQREZfRGljdGlvbmFyeSogY2lkaW5mb19kaWN0ID0gY2lkZm9udF9kaWN0LT5HZXREaWN0Rm9yKCJDSURTeXN0ZW1JbmZvIik7CisgIEFTU0VSVF9UUlVFKGNpZGluZm9fZGljdCk7CisgIEVYUEVDVF9FUSgiQWRvYmUiLCBjaWRpbmZvX2RpY3QtPkdldFN0cmluZ0ZvcigiUmVnaXN0cnkiKSk7CisgIEVYUEVDVF9FUSgiSWRlbnRpdHkiLCBjaWRpbmZvX2RpY3QtPkdldFN0cmluZ0ZvcigiT3JkZXJpbmciKSk7CisgIEVYUEVDVF9FUSgwLCBjaWRpbmZvX2RpY3QtPkdldE51bWJlckZvcigiU3VwcGxlbWVudCIpKTsKKyAgQ2hlY2tGb250RGVzY3JpcHRvcihjaWRmb250X2RpY3QsIEZQREZfRk9OVF9UUlVFVFlQRSwgZmFsc2UsIHRydWUsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgZGF0YSk7CisKKyAgLy8gQ2hlY2sgd2lkdGhzCisgIENQREZfQXJyYXkqIHdpZHRoc19hcnJheSA9IGNpZGZvbnRfZGljdC0+R2V0QXJyYXlGb3IoIlciKTsKKyAgQVNTRVJUX1RSVUUod2lkdGhzX2FycmF5KTsKKyAgQ2hlY2tDb21wb3NpdGVGb250V2lkdGhzKHdpZHRoc19hcnJheSwgdHlwZWRfZm9udCk7Cit9CisKK1RFU1RfRihGUERGRWRpdEVtYmVkZGVydGVzdCwgTm9ybWFsaXplTmVnYXRpdmVSb3RhdGlvbikgeworICAvLyBMb2FkIGRvY3VtZW50IHdpdGggYSAtOTAgZGVncmVlIHJvdGF0aW9uCisgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgiYnVnXzcxMzE5Ny5wZGYiKSk7CisgIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoMCk7CisgIEVYUEVDVF9ORShudWxscHRyLCBwYWdlKTsKKworICBFWFBFQ1RfRVEoMywgRlBERlBhZ2VfR2V0Um90YXRpb24ocGFnZSkpOworICBVbmxvYWRQYWdlKHBhZ2UpOworfQorCitURVNUX0YoRlBERkVkaXRFbWJlZGRlcnRlc3QsIEFkZFRydWVUeXBlRm9udFRleHQpIHsKKyAgLy8gU3RhcnQgd2l0aCBhIGJsYW5rIHBhZ2UKKyAgRlBERl9QQUdFIHBhZ2UgPSBGUERGUGFnZV9OZXcoQ3JlYXRlTmV3RG9jdW1lbnQoKSwgMCwgNjEyLCA3OTIpOworICB7CisgICAgY29uc3QgQ1BERl9Gb250KiBzdG9ja19mb250ID0gQ1BERl9Gb250OjpHZXRTdG9ja0ZvbnQoY3BkZl9kb2MoKSwgIkFyaWFsIik7CisgICAgY29uc3QgdWludDhfdCogZGF0YSA9IHN0b2NrX2ZvbnQtPkdldEZvbnQoKS0+R2V0Rm9udERhdGEoKTsKKyAgICBjb25zdCB1aW50MzJfdCBzaXplID0gc3RvY2tfZm9udC0+R2V0Rm9udCgpLT5HZXRTaXplKCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPHZvaWQsIEZQREZGb250RGVsZXRlcj4gZm9udCgKKyAgICAgICAgRlBERlRleHRfTG9hZEZvbnQoZG9jdW1lbnQoKSwgZGF0YSwgc2l6ZSwgRlBERl9GT05UX1RSVUVUWVBFLCAwKSk7CisgICAgQVNTRVJUX1RSVUUoZm9udC5nZXQoKSk7CisKKyAgICAvLyBBZGQgc29tZSB0ZXh0IHRvIHRoZSBwYWdlCisgICAgRlBERl9QQUdFT0JKRUNUIHRleHRfb2JqZWN0ID0KKyAgICAgICAgRlBERlBhZ2VPYmpfQ3JlYXRlVGV4dE9iaihkb2N1bWVudCgpLCBmb250LmdldCgpLCAxMi4wZik7CisgICAgRVhQRUNUX1RSVUUodGV4dF9vYmplY3QpOworICAgIHN0ZDo6dW5pcXVlX3B0cjx1bnNpZ25lZCBzaG9ydCwgcGRmaXVtOjpGcmVlRGVsZXRlcj4gdGV4dCA9CisgICAgICAgIEdldEZQREZXaWRlU3RyaW5nKEwiSSBhbSB0ZXN0aW5nIG15IGxvYWRlZCBmb250LCBXRUUuIik7CisgICAgRVhQRUNUX1RSVUUoRlBERlRleHRfU2V0VGV4dCh0ZXh0X29iamVjdCwgdGV4dC5nZXQoKSkpOworICAgIEZQREZQYWdlT2JqX1RyYW5zZm9ybSh0ZXh0X29iamVjdCwgMSwgMCwgMCwgMSwgNDAwLCA0MDApOworICAgIEZQREZQYWdlX0luc2VydE9iamVjdChwYWdlLCB0ZXh0X29iamVjdCk7CisgICAgRlBERl9CSVRNQVAgcGFnZV9iaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UpOworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXworICAgIGNvbnN0IGNoYXIgbWQ1W10gPSAiMTdkMmI2Y2Q1NzRjZjY2MTcwYjA5Yzg5Mjc1MjlhOTQiOworI2Vsc2UKKyAgICBjb25zdCBjaGFyIG1kNVtdID0gIjcwNTkyODU5MDEwZmZiZjUzMmEyMjM3YjgxMThiY2M0IjsKKyNlbmRpZiAgLy8gX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCisgICAgQ29tcGFyZUJpdG1hcChwYWdlX2JpdG1hcCwgNjEyLCA3OTIsIG1kNSk7CisgICAgRlBERkJpdG1hcF9EZXN0cm95KHBhZ2VfYml0bWFwKTsKKworICAgIC8vIEFkZCBzb21lIG1vcmUgdGV4dCwgc2FtZSBmb250CisgICAgRlBERl9QQUdFT0JKRUNUIHRleHRfb2JqZWN0MiA9CisgICAgICAgIEZQREZQYWdlT2JqX0NyZWF0ZVRleHRPYmooZG9jdW1lbnQoKSwgZm9udC5nZXQoKSwgMTUuMGYpOworICAgIHN0ZDo6dW5pcXVlX3B0cjx1bnNpZ25lZCBzaG9ydCwgcGRmaXVtOjpGcmVlRGVsZXRlcj4gdGV4dDIgPQorICAgICAgICBHZXRGUERGV2lkZVN0cmluZyhMIkJpZ2dlciBmb250IHNpemUiKTsKKyAgICBFWFBFQ1RfVFJVRShGUERGVGV4dF9TZXRUZXh0KHRleHRfb2JqZWN0MiwgdGV4dDIuZ2V0KCkpKTsKKyAgICBGUERGUGFnZU9ial9UcmFuc2Zvcm0odGV4dF9vYmplY3QyLCAxLCAwLCAwLCAxLCAyMDAsIDIwMCk7CisgICAgRlBERlBhZ2VfSW5zZXJ0T2JqZWN0KHBhZ2UsIHRleHRfb2JqZWN0Mik7CisgIH0KKyAgRlBERl9CSVRNQVAgcGFnZV9iaXRtYXAyID0gUmVuZGVyUGFnZShwYWdlKTsKKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9BUFBMRV8KKyAgY29uc3QgY2hhciBtZDVfMltdID0gIjhlZGVkNDE5M2ZmMWYwZjc3YjhiNjAwYTgyNWU5N2VhIjsKKyNlbHNlCisgIGNvbnN0IGNoYXIgbWQ1XzJbXSA9ICJjMWQxMGNjZTE3NjFjNGE5OThhMTZiMjU2MjAzMDU2OCI7CisjZW5kaWYgIC8vIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXworICBDb21wYXJlQml0bWFwKHBhZ2VfYml0bWFwMiwgNjEyLCA3OTIsIG1kNV8yKTsKKyAgRlBERkJpdG1hcF9EZXN0cm95KHBhZ2VfYml0bWFwMik7CisKKyAgRVhQRUNUX1RSVUUoRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KHBhZ2UpKTsKKyAgRVhQRUNUX1RSVUUoRlBERl9TYXZlQXNDb3B5KGRvY3VtZW50KCksIHRoaXMsIDApKTsKKyAgRlBERl9DbG9zZVBhZ2UocGFnZSk7CisKKyAgVmVyaWZ5U2F2ZWREb2N1bWVudCg2MTIsIDc5MiwgbWQ1XzIpOworfQorCitURVNUX0YoRlBERkVkaXRFbWJlZGRlcnRlc3QsIFRyYW5zZm9ybUFubm90KSB7CisgIC8vIE9wZW4gYSBmaWxlIHdpdGggb25lIGFubm90YXRpb24gYW5kIGxvYWQgaXRzIGZpcnN0IHBhZ2UuCisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiYW5ub3RhdGlvbl9oaWdobGlnaHRfbG9uZ19jb250ZW50LnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBGUERGX0xvYWRQYWdlKGRvY3VtZW50KCksIDApOworICBBU1NFUlRfVFJVRShwYWdlKTsKKworICAvLyBBZGQgYW4gdW5kZXJsaW5lIGFubm90YXRpb24gdG8gdGhlIHBhZ2Ugd2l0aG91dCBzcGVjaWZ5aW5nIGl0cyByZWN0YW5nbGUuCisgIEZQREZfQU5OT1RBVElPTiBhbm5vdCA9IEZQREZQYWdlX0NyZWF0ZUFubm90KHBhZ2UsIEZQREZfQU5OT1RfVU5ERVJMSU5FKTsKKyAgQVNTRVJUX1RSVUUoYW5ub3QpOworCisgIC8vIEZQREZQYWdlX1RyYW5zZm9ybUFubm90cygpIHNob3VsZCBydW4gd2l0aG91dCBlcnJvcnMgd2hlbiBtb2RpZnlpbmcKKyAgLy8gYW5ub3RhdGlvbiByZWN0YW5nbGVzLgorICBGUERGUGFnZV9UcmFuc2Zvcm1Bbm5vdHMocGFnZSwgMSwgMiwgMywgNCwgNSwgNik7CisKKyAgRlBERlBhZ2VfQ2xvc2VBbm5vdChhbm5vdCk7CisgIFVubG9hZFBhZ2UocGFnZSk7Cit9CisKKy8vIFRPRE8obnBtKTogQWRkIHRlc3RzIHVzaW5nIEphcGFuZXNlIGZvbnRzIGluIG90aGVyIE9TLgorI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0xJTlVYXworVEVTVF9GKEZQREZFZGl0RW1iZWRkZXJ0ZXN0LCBBZGRDSURGb250VGV4dCkgeworICAvLyBTdGFydCB3aXRoIGEgYmxhbmsgcGFnZQorICBGUERGX1BBR0UgcGFnZSA9IEZQREZQYWdlX05ldyhDcmVhdGVOZXdEb2N1bWVudCgpLCAwLCA2MTIsIDc5Mik7CisgIENGWF9Gb250IENJRGZvbnQ7CisgIHsKKyAgICAvLyBGaXJzdCwgZ2V0IHRoZSBkYXRhIGZyb20gdGhlIGZvbnQKKyAgICBDSURmb250LkxvYWRTdWJzdCgiSVBBR290aGljIiwgMSwgMCwgNDAwLCAwLCA5MzIsIDApOworICAgIEVYUEVDVF9FUSgiSVBBR290aGljIiwgQ0lEZm9udC5HZXRGYWNlTmFtZSgpKTsKKyAgICBjb25zdCB1aW50OF90KiBkYXRhID0gQ0lEZm9udC5HZXRGb250RGF0YSgpOworICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSBDSURmb250LkdldFNpemUoKTsKKworICAgIC8vIExvYWQgdGhlIGRhdGEgaW50byBhIEZQREZfRm9udC4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dm9pZCwgRlBERkZvbnREZWxldGVyPiBmb250KAorICAgICAgICBGUERGVGV4dF9Mb2FkRm9udChkb2N1bWVudCgpLCBkYXRhLCBzaXplLCBGUERGX0ZPTlRfVFJVRVRZUEUsIDEpKTsKKyAgICBBU1NFUlRfVFJVRShmb250LmdldCgpKTsKKworICAgIC8vIEFkZCBzb21lIHRleHQgdG8gdGhlIHBhZ2UKKyAgICBGUERGX1BBR0VPQkpFQ1QgdGV4dF9vYmplY3QgPQorICAgICAgICBGUERGUGFnZU9ial9DcmVhdGVUZXh0T2JqKGRvY3VtZW50KCksIGZvbnQuZ2V0KCksIDEyLjBmKTsKKyAgICBBU1NFUlRfVFJVRSh0ZXh0X29iamVjdCk7CisgICAgc3RkOjp3c3RyaW5nIHdzdHIgPSBMIkFCQ0RFRkdoaWprbG1ub3AuIjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IHRleHQgPQorICAgICAgICBHZXRGUERGV2lkZVN0cmluZyh3c3RyKTsKKyAgICBFWFBFQ1RfVFJVRShGUERGVGV4dF9TZXRUZXh0KHRleHRfb2JqZWN0LCB0ZXh0LmdldCgpKSk7CisgICAgRlBERlBhZ2VPYmpfVHJhbnNmb3JtKHRleHRfb2JqZWN0LCAxLCAwLCAwLCAxLCAyMDAsIDIwMCk7CisgICAgRlBERlBhZ2VfSW5zZXJ0T2JqZWN0KHBhZ2UsIHRleHRfb2JqZWN0KTsKKworICAgIC8vIEFuZCBhZGQgc29tZSBKYXBhbmVzZSBjaGFyYWN0ZXJzCisgICAgRlBERl9QQUdFT0JKRUNUIHRleHRfb2JqZWN0MiA9CisgICAgICAgIEZQREZQYWdlT2JqX0NyZWF0ZVRleHRPYmooZG9jdW1lbnQoKSwgZm9udC5nZXQoKSwgMTguMGYpOworICAgIEFTU0VSVF9UUlVFKHRleHRfb2JqZWN0Mik7CisgICAgc3RkOjp3c3RyaW5nIHdzdHIyID0KKyAgICAgICAgTCJcdTMwNTNcdTMwOTNcdTMwNkJcdTMwNjFcdTMwNmZcdTRlMTZcdTc1NENcdTMwMDJcdTMwNTNcdTMwNTNcdTMwNkIxIgorICAgICAgICBMIlx1NzU2QSI7CisgICAgc3RkOjp1bmlxdWVfcHRyPHVuc2lnbmVkIHNob3J0LCBwZGZpdW06OkZyZWVEZWxldGVyPiB0ZXh0MiA9CisgICAgICAgIEdldEZQREZXaWRlU3RyaW5nKHdzdHIyKTsKKyAgICBFWFBFQ1RfVFJVRShGUERGVGV4dF9TZXRUZXh0KHRleHRfb2JqZWN0MiwgdGV4dDIuZ2V0KCkpKTsKKyAgICBGUERGUGFnZU9ial9UcmFuc2Zvcm0odGV4dF9vYmplY3QyLCAxLCAwLCAwLCAxLCAxMDAsIDUwMCk7CisgICAgRlBERlBhZ2VfSW5zZXJ0T2JqZWN0KHBhZ2UsIHRleHRfb2JqZWN0Mik7CisgIH0KKworICAvLyBDaGVjayB0aGF0IHRoZSB0ZXh0IHJlbmRlcnMgcHJvcGVybHkuCisgIEZQREZfQklUTUFQIHBhZ2VfYml0bWFwID0gUmVuZGVyUGFnZShwYWdlKTsKKyAgY29uc3QgY2hhciBtZDVbXSA9ICJjNjhjZDc5YWE3MmJmODNhN2IyNTI3MTM3MGQ0NmIyMSI7CisgIENvbXBhcmVCaXRtYXAocGFnZV9iaXRtYXAsIDYxMiwgNzkyLCBtZDUpOworICBGUERGQml0bWFwX0Rlc3Ryb3kocGFnZV9iaXRtYXApOworCisgIC8vIFNhdmUgdGhlIGRvY3VtZW50LCBjbG9zZSB0aGUgcGFnZS4KKyAgRVhQRUNUX1RSVUUoRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KHBhZ2UpKTsKKyAgRVhQRUNUX1RSVUUoRlBERl9TYXZlQXNDb3B5KGRvY3VtZW50KCksIHRoaXMsIDApKTsKKyAgRlBERl9DbG9zZVBhZ2UocGFnZSk7CisKKyAgVmVyaWZ5U2F2ZWREb2N1bWVudCg2MTIsIDc5MiwgbWQ1KTsKK30KKyNlbmRpZiAgLy8gX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fTElOVVhfCisKK1RFU1RfRihGUERGRWRpdEVtYmVkZGVydGVzdCwgU2F2ZUFuZFJlbmRlcikgeworICBjb25zdCBjaGFyIG1kNVtdID0gIjNjMjA0NzJiMDU1MmMwYzIyYjg4YWIxZWQ4YzYyMDJiIjsKKyAgeworICAgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgiYnVnXzc3OS5wZGYiKSk7CisgICAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkUGFnZSgwKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgcGFnZSk7CisKKyAgICAvLyBOb3cgYWRkIGEgbW9yZSBjb21wbGV4IGJsdWUgcGF0aC4KKyAgICBGUERGX1BBR0VPQkpFQ1QgZ3JlZW5fcGF0aCA9IEZQREZQYWdlT2JqX0NyZWF0ZU5ld1BhdGgoMjAsIDIwKTsKKyAgICBFWFBFQ1RfVFJVRShGUERGUGF0aF9TZXRGaWxsQ29sb3IoZ3JlZW5fcGF0aCwgMCwgMjU1LCAwLCAyMDApKTsKKyAgICAvLyBUT0RPKG5wbSk6IHN0cm9raW5nIHdpbGwgY2F1c2UgdGhlIE1ENXMgdG8gZGlmZmVyLgorICAgIEVYUEVDVF9UUlVFKEZQREZQYXRoX1NldERyYXdNb2RlKGdyZWVuX3BhdGgsIEZQREZfRklMTE1PREVfV0lORElORywgMCkpOworICAgIEVYUEVDVF9UUlVFKEZQREZQYXRoX0xpbmVUbyhncmVlbl9wYXRoLCAyMCwgNjMpKTsKKyAgICBFWFBFQ1RfVFJVRShGUERGUGF0aF9CZXppZXJUbyhncmVlbl9wYXRoLCA1NSwgNTUsIDc4LCA3OCwgOTAsIDkwKSk7CisgICAgRVhQRUNUX1RSVUUoRlBERlBhdGhfTGluZVRvKGdyZWVuX3BhdGgsIDEzMywgMTMzKSk7CisgICAgRVhQRUNUX1RSVUUoRlBERlBhdGhfTGluZVRvKGdyZWVuX3BhdGgsIDEzMywgMzMpKTsKKyAgICBFWFBFQ1RfVFJVRShGUERGUGF0aF9CZXppZXJUbyhncmVlbl9wYXRoLCAzOCwgMzMsIDM5LCAzNiwgNDAsIDQwKSk7CisgICAgRVhQRUNUX1RSVUUoRlBERlBhdGhfQ2xvc2UoZ3JlZW5fcGF0aCkpOworICAgIEZQREZQYWdlX0luc2VydE9iamVjdChwYWdlLCBncmVlbl9wYXRoKTsKKyAgICBGUERGX0JJVE1BUCBwYWdlX2JpdG1hcCA9IFJlbmRlclBhZ2UocGFnZSk7CisgICAgQ29tcGFyZUJpdG1hcChwYWdlX2JpdG1hcCwgNjEyLCA3OTIsIG1kNSk7CisgICAgRlBERkJpdG1hcF9EZXN0cm95KHBhZ2VfYml0bWFwKTsKKworICAgIC8vIE5vdyBzYXZlIHRoZSByZXN1bHQsIGNsb3NpbmcgdGhlIHBhZ2UgYW5kIGRvY3VtZW50CisgICAgRVhQRUNUX1RSVUUoRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KHBhZ2UpKTsKKyAgICBFWFBFQ1RfVFJVRShGUERGX1NhdmVBc0NvcHkoZG9jdW1lbnQoKSwgdGhpcywgMCkpOworICAgIFVubG9hZFBhZ2UocGFnZSk7CisgIH0KKworICBWZXJpZnlTYXZlZERvY3VtZW50KDYxMiwgNzkyLCBtZDUpOworfQorCitURVNUX0YoRlBERkVkaXRFbWJlZGRlcnRlc3QsIEV4dHJhY3RJbWFnZUJpdG1hcCkgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoImVtYmVkZGVkX2ltYWdlcy5wZGYiKSk7CisgIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoMCk7CisgIEFTU0VSVF9UUlVFKHBhZ2UpOworICBBU1NFUlRfRVEoMzksIEZQREZQYWdlX0NvdW50T2JqZWN0cyhwYWdlKSk7CisKKyAgRlBERl9QQUdFT0JKRUNUIG9iaiA9IEZQREZQYWdlX0dldE9iamVjdChwYWdlLCAzMik7CisgIEVYUEVDVF9ORShGUERGX1BBR0VPQkpfSU1BR0UsIEZQREZQYWdlT2JqX0dldFR5cGUob2JqKSk7CisgIEVYUEVDVF9GQUxTRShGUERGSW1hZ2VPYmpfR2V0Qml0bWFwKG9iaikpOworCisgIG9iaiA9IEZQREZQYWdlX0dldE9iamVjdChwYWdlLCAzMyk7CisgIEFTU0VSVF9FUShGUERGX1BBR0VPQkpfSU1BR0UsIEZQREZQYWdlT2JqX0dldFR5cGUob2JqKSk7CisgIEZQREZfQklUTUFQIGJpdG1hcCA9IEZQREZJbWFnZU9ial9HZXRCaXRtYXAob2JqKTsKKyAgRVhQRUNUX0VRKEZQREZCaXRtYXBfQkdSLCBGUERGQml0bWFwX0dldEZvcm1hdChiaXRtYXApKTsKKyAgQ29tcGFyZUJpdG1hcChiaXRtYXAsIDEwOSwgODgsICJkNjVlOThkOTY4ZDE5NmFiZjEzZjc4YWVjNjU1ZmZhZSIpOworICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsKKworICBvYmogPSBGUERGUGFnZV9HZXRPYmplY3QocGFnZSwgMzQpOworICBBU1NFUlRfRVEoRlBERl9QQUdFT0JKX0lNQUdFLCBGUERGUGFnZU9ial9HZXRUeXBlKG9iaikpOworICBiaXRtYXAgPSBGUERGSW1hZ2VPYmpfR2V0Qml0bWFwKG9iaik7CisgIEVYUEVDVF9FUShGUERGQml0bWFwX0JHUiwgRlBERkJpdG1hcF9HZXRGb3JtYXQoYml0bWFwKSk7CisgIENvbXBhcmVCaXRtYXAoYml0bWFwLCAxMDMsIDc1LCAiMTI4NzcxMWM4NGRiZWY3NjdjNDM1ZDExNjk3NjYxZDYiKTsKKyAgRlBERkJpdG1hcF9EZXN0cm95KGJpdG1hcCk7CisKKyAgb2JqID0gRlBERlBhZ2VfR2V0T2JqZWN0KHBhZ2UsIDM1KTsKKyAgQVNTRVJUX0VRKEZQREZfUEFHRU9CSl9JTUFHRSwgRlBERlBhZ2VPYmpfR2V0VHlwZShvYmopKTsKKyAgYml0bWFwID0gRlBERkltYWdlT2JqX0dldEJpdG1hcChvYmopOworICBFWFBFQ1RfRVEoRlBERkJpdG1hcF9HcmF5LCBGUERGQml0bWFwX0dldEZvcm1hdChiaXRtYXApKTsKKyAgQ29tcGFyZUJpdG1hcChiaXRtYXAsIDkyLCA2OCwgIjljNmQ3NmNiMWUzN2VmODUxNGY5NDU1ZDc1OTM5MWYzIik7CisgIEZQREZCaXRtYXBfRGVzdHJveShiaXRtYXApOworCisgIG9iaiA9IEZQREZQYWdlX0dldE9iamVjdChwYWdlLCAzNik7CisgIEFTU0VSVF9FUShGUERGX1BBR0VPQkpfSU1BR0UsIEZQREZQYWdlT2JqX0dldFR5cGUob2JqKSk7CisgIGJpdG1hcCA9IEZQREZJbWFnZU9ial9HZXRCaXRtYXAob2JqKTsKKyAgRVhQRUNUX0VRKEZQREZCaXRtYXBfQkdSLCBGUERGQml0bWFwX0dldEZvcm1hdChiaXRtYXApKTsKKyAgQ29tcGFyZUJpdG1hcChiaXRtYXAsIDc5LCA2MCwgIjE1Y2I2YTQ5YTJlMzU0ZWQwZTlmNDVkZDM0ZTNkYTFhIik7CisgIEZQREZCaXRtYXBfRGVzdHJveShiaXRtYXApOworCisgIG9iaiA9IEZQREZQYWdlX0dldE9iamVjdChwYWdlLCAzNyk7CisgIEFTU0VSVF9FUShGUERGX1BBR0VPQkpfSU1BR0UsIEZQREZQYWdlT2JqX0dldFR5cGUob2JqKSk7CisgIGJpdG1hcCA9IEZQREZJbWFnZU9ial9HZXRCaXRtYXAob2JqKTsKKyAgRVhQRUNUX0VRKEZQREZCaXRtYXBfQkdSLCBGUERGQml0bWFwX0dldEZvcm1hdChiaXRtYXApKTsKKyAgQ29tcGFyZUJpdG1hcChiaXRtYXAsIDEyNiwgMTA2LCAiYmU1YTY0YmE3ODkwZDI2NTc1MjJhZjY1MjQxMTg1MzQiKTsKKyAgRlBERkJpdG1hcF9EZXN0cm95KGJpdG1hcCk7CisKKyAgb2JqID0gRlBERlBhZ2VfR2V0T2JqZWN0KHBhZ2UsIDM4KTsKKyAgQVNTRVJUX0VRKEZQREZfUEFHRU9CSl9JTUFHRSwgRlBERlBhZ2VPYmpfR2V0VHlwZShvYmopKTsKKyAgYml0bWFwID0gRlBERkltYWdlT2JqX0dldEJpdG1hcChvYmopOworICBFWFBFQ1RfRVEoRlBERkJpdG1hcF9CR1IsIEZQREZCaXRtYXBfR2V0Rm9ybWF0KGJpdG1hcCkpOworICBDb21wYXJlQml0bWFwKGJpdG1hcCwgMTk0LCAxMTksICJmOWUyNDIwN2VlMWJjMGRiNmM1NDNkMzNhNWYxMmVjNSIpOworICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsKKyAgVW5sb2FkUGFnZShwYWdlKTsKK30KKworVEVTVF9GKEZQREZFZGl0RW1iZWRkZXJ0ZXN0LCBHZXRJbWFnZURhdGEpIHsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJlbWJlZGRlZF9pbWFnZXMucGRmIikpOworICBGUERGX1BBR0UgcGFnZSA9IExvYWRQYWdlKDApOworICBBU1NFUlRfVFJVRShwYWdlKTsKKyAgQVNTRVJUX0VRKDM5LCBGUERGUGFnZV9Db3VudE9iamVjdHMocGFnZSkpOworCisgIC8vIFJldHJpZXZlIGFuIGltYWdlIG9iamVjdCB3aXRoIGZsYXRlLWVuY29kZWQgZGF0YSBzdHJlYW0uCisgIEZQREZfUEFHRU9CSkVDVCBvYmogPSBGUERGUGFnZV9HZXRPYmplY3QocGFnZSwgMzMpOworICBBU1NFUlRfRVEoRlBERl9QQUdFT0JKX0lNQUdFLCBGUERGUGFnZU9ial9HZXRUeXBlKG9iaikpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIHJhdyBpbWFnZSBkYXRhIGhhcyB0aGUgY29ycmVjdCBsZW5ndGggYW5kIGhhc2ggdmFsdWUuCisgIHVuc2lnbmVkIGxvbmcgbGVuID0gRlBERkltYWdlT2JqX0dldEltYWdlRGF0YVJhdyhvYmosIG51bGxwdHIsIDApOworICBzdGQ6OnZlY3RvcjxjaGFyPiBidWYobGVuKTsKKyAgRVhQRUNUX0VRKDQwOTF1LCBGUERGSW1hZ2VPYmpfR2V0SW1hZ2VEYXRhUmF3KG9iaiwgYnVmLmRhdGEoKSwgbGVuKSk7CisgIEVYUEVDVF9FUSgiZjczODAyMzI3ZDJlODhlODkwZjY1Mzk2MWJjZGE4MWEiLAorICAgICAgICAgICAgR2VuZXJhdGVNRDVCYXNlMTYocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYnVmLmRhdGEoKSksIGxlbikpOworCisgIC8vIENoZWNrIHRoYXQgdGhlIGRlY29kZWQgaW1hZ2UgZGF0YSBoYXMgdGhlIGNvcnJlY3QgbGVuZ3RoIGFuZCBoYXNoIHZhbHVlLgorICBsZW4gPSBGUERGSW1hZ2VPYmpfR2V0SW1hZ2VEYXRhRGVjb2RlZChvYmosIG51bGxwdHIsIDApOworICBidWYuY2xlYXIoKTsKKyAgYnVmLnJlc2l6ZShsZW4pOworICBFWFBFQ1RfRVEoMjg3NzZ1LCBGUERGSW1hZ2VPYmpfR2V0SW1hZ2VEYXRhRGVjb2RlZChvYmosIGJ1Zi5kYXRhKCksIGxlbikpOworICBFWFBFQ1RfRVEoImNiMzYzNzkzNGJiM2I5NWE2ZTRhZTFlYTllYjllNTZlIiwKKyAgICAgICAgICAgIEdlbmVyYXRlTUQ1QmFzZTE2KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJ1Zi5kYXRhKCkpLCBsZW4pKTsKKworICAvLyBSZXRyaWV2ZSBhbiBpbWFnZSBvYmVqY3Qgd2l0aCBEQ1REZWNvZGUtZW5jb2RlZCBkYXRhIHN0cmVhbS4KKyAgb2JqID0gRlBERlBhZ2VfR2V0T2JqZWN0KHBhZ2UsIDM3KTsKKyAgQVNTRVJUX0VRKEZQREZfUEFHRU9CSl9JTUFHRSwgRlBERlBhZ2VPYmpfR2V0VHlwZShvYmopKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSByYXcgaW1hZ2UgZGF0YSBoYXMgdGhlIGNvcnJlY3QgbGVuZ3RoIGFuZCBoYXNoIHZhbHVlLgorICBsZW4gPSBGUERGSW1hZ2VPYmpfR2V0SW1hZ2VEYXRhUmF3KG9iaiwgbnVsbHB0ciwgMCk7CisgIGJ1Zi5jbGVhcigpOworICBidWYucmVzaXplKGxlbik7CisgIEVYUEVDVF9FUSg0MzcwdSwgRlBERkltYWdlT2JqX0dldEltYWdlRGF0YVJhdyhvYmosIGJ1Zi5kYXRhKCksIGxlbikpOworICBFWFBFQ1RfRVEoIjZhYWUxZjM3MTAzMzUwMjNhOWUxMjE5MWJlNjZiNjRiIiwKKyAgICAgICAgICAgIEdlbmVyYXRlTUQ1QmFzZTE2KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJ1Zi5kYXRhKCkpLCBsZW4pKTsKKworICAvLyBDaGVjayB0aGF0IHRoZSBkZWNvZGVkIGltYWdlIGRhdGEgaGFzIHRoZSBjb3JyZWN0IGxlbmd0aCBhbmQgaGFzaCB2YWx1ZSwKKyAgLy8gd2hpY2ggc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRob3NlIG9mIHRoZSByYXcgZGF0YSwgc2luY2UgdGhpcyBpbWFnZSBpcworICAvLyBlbmNvZGVkIGJ5IGEgc2luZ2xlIERDVERlY29kZSBmaWx0ZXIgYW5kIGRlY29kaW5nIGlzIGEgbm9vcC4KKyAgbGVuID0gRlBERkltYWdlT2JqX0dldEltYWdlRGF0YURlY29kZWQob2JqLCBudWxscHRyLCAwKTsKKyAgYnVmLmNsZWFyKCk7CisgIGJ1Zi5yZXNpemUobGVuKTsKKyAgRVhQRUNUX0VRKDQzNzB1LCBGUERGSW1hZ2VPYmpfR2V0SW1hZ2VEYXRhRGVjb2RlZChvYmosIGJ1Zi5kYXRhKCksIGxlbikpOworICBFWFBFQ1RfRVEoIjZhYWUxZjM3MTAzMzUwMjNhOWUxMjE5MWJlNjZiNjRiIiwKKyAgICAgICAgICAgIEdlbmVyYXRlTUQ1QmFzZTE2KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGJ1Zi5kYXRhKCkpLCBsZW4pKTsKKworICBVbmxvYWRQYWdlKHBhZ2UpOworfQorCitURVNUX0YoRlBERkVkaXRFbWJlZGRlcnRlc3QsIERlc3Ryb3lQYWdlT2JqZWN0KSB7CisgIEZQREZfUEFHRU9CSkVDVCByZWN0ID0gRlBERlBhZ2VPYmpfQ3JlYXRlTmV3UmVjdCgxMCwgMTAsIDIwLCAyMCk7CisgIEFTU0VSVF9UUlVFKHJlY3QpOworCisgIC8vIFRoZXJlIHNob3VsZCBiZSBubyBtZW1vcnkgbGVha3Mgd2l0aCBhIGNhbGwgdG8gRlBERlBhZ2VPYmpfRGVzdHJveSgpLgorICBGUERGUGFnZU9ial9EZXN0cm95KHJlY3QpOworfQorCitURVNUX0YoRlBERkVkaXRFbWJlZGRlcnRlc3QsIEdldEltYWdlRmlsdGVycykgeworICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoImVtYmVkZGVkX2ltYWdlcy5wZGYiKSk7CisgIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoMCk7CisgIEFTU0VSVF9UUlVFKHBhZ2UpOworCisgIC8vIFZlcmlmeSB0aGF0IHJldHJpZXZpbmcgdGhlIGZpbHRlciBvZiBhIG5vbi1pbWFnZSBvYmplY3Qgd291bGQgZmFpbC4KKyAgRlBERl9QQUdFT0JKRUNUIG9iaiA9IEZQREZQYWdlX0dldE9iamVjdChwYWdlLCAzMik7CisgIEFTU0VSVF9ORShGUERGX1BBR0VPQkpfSU1BR0UsIEZQREZQYWdlT2JqX0dldFR5cGUob2JqKSk7CisgIEFTU0VSVF9FUSgwLCBGUERGSW1hZ2VPYmpfR2V0SW1hZ2VGaWx0ZXJDb3VudChvYmopKTsKKyAgRVhQRUNUX0VRKDB1LCBGUERGSW1hZ2VPYmpfR2V0SW1hZ2VGaWx0ZXIob2JqLCAwLCBudWxscHRyLCAwKSk7CisKKyAgLy8gVmVyaWZ5IHRoZSByZXR1cm5lZCBmaWx0ZXIgc3RyaW5nIGZvciBhbiBpbWFnZSBvYmplY3Qgd2l0aCBhIHNpbmdsZSBmaWx0ZXIuCisgIG9iaiA9IEZQREZQYWdlX0dldE9iamVjdChwYWdlLCAzMyk7CisgIEFTU0VSVF9FUShGUERGX1BBR0VPQkpfSU1BR0UsIEZQREZQYWdlT2JqX0dldFR5cGUob2JqKSk7CisgIEFTU0VSVF9FUSgxLCBGUERGSW1hZ2VPYmpfR2V0SW1hZ2VGaWx0ZXJDb3VudChvYmopKTsKKyAgdW5zaWduZWQgbG9uZyBsZW4gPSBGUERGSW1hZ2VPYmpfR2V0SW1hZ2VGaWx0ZXIob2JqLCAwLCBudWxscHRyLCAwKTsKKyAgc3RkOjp2ZWN0b3I8Y2hhcj4gYnVmKGxlbik7CisgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrRmxhdGVEZWNvZGVbXSA9ICJGbGF0ZURlY29kZSI7CisgIEVYUEVDVF9FUShzaXplb2Yoa0ZsYXRlRGVjb2RlKSwKKyAgICAgICAgICAgIEZQREZJbWFnZU9ial9HZXRJbWFnZUZpbHRlcihvYmosIDAsIGJ1Zi5kYXRhKCksIGxlbikpOworICBFWFBFQ1RfU1RSRVEoa0ZsYXRlRGVjb2RlLCBidWYuZGF0YSgpKTsKKyAgRVhQRUNUX0VRKDB1LCBGUERGSW1hZ2VPYmpfR2V0SW1hZ2VGaWx0ZXIob2JqLCAxLCBudWxscHRyLCAwKSk7CisKKyAgLy8gVmVyaWZ5IGFsbCB0aGUgZmlsdGVycyBmb3IgYW4gaW1hZ2Ugb2JqZWN0IHdpdGggYSBsaXN0IG9mIGZpbHRlcnMuCisgIG9iaiA9IEZQREZQYWdlX0dldE9iamVjdChwYWdlLCAzOCk7CisgIEFTU0VSVF9FUShGUERGX1BBR0VPQkpfSU1BR0UsIEZQREZQYWdlT2JqX0dldFR5cGUob2JqKSk7CisgIEFTU0VSVF9FUSgyLCBGUERGSW1hZ2VPYmpfR2V0SW1hZ2VGaWx0ZXJDb3VudChvYmopKTsKKyAgbGVuID0gRlBERkltYWdlT2JqX0dldEltYWdlRmlsdGVyKG9iaiwgMCwgbnVsbHB0ciwgMCk7CisgIGJ1Zi5jbGVhcigpOworICBidWYucmVzaXplKGxlbik7CisgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQVNDSUlIZXhEZWNvZGVbXSA9ICJBU0NJSUhleERlY29kZSI7CisgIEVYUEVDVF9FUShzaXplb2Yoa0FTQ0lJSGV4RGVjb2RlKSwKKyAgICAgICAgICAgIEZQREZJbWFnZU9ial9HZXRJbWFnZUZpbHRlcihvYmosIDAsIGJ1Zi5kYXRhKCksIGxlbikpOworICBFWFBFQ1RfU1RSRVEoa0FTQ0lJSGV4RGVjb2RlLCBidWYuZGF0YSgpKTsKKworICBsZW4gPSBGUERGSW1hZ2VPYmpfR2V0SW1hZ2VGaWx0ZXIob2JqLCAxLCBudWxscHRyLCAwKTsKKyAgYnVmLmNsZWFyKCk7CisgIGJ1Zi5yZXNpemUobGVuKTsKKyAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtEQ1REZWNvZGVbXSA9ICJEQ1REZWNvZGUiOworICBFWFBFQ1RfRVEoc2l6ZW9mKGtEQ1REZWNvZGUpLAorICAgICAgICAgICAgRlBERkltYWdlT2JqX0dldEltYWdlRmlsdGVyKG9iaiwgMSwgYnVmLmRhdGEoKSwgbGVuKSk7CisgIEVYUEVDVF9TVFJFUShrRENURGVjb2RlLCBidWYuZGF0YSgpKTsKKworICBVbmxvYWRQYWdlKHBhZ2UpOworfQorCitURVNUX0YoRlBERkVkaXRFbWJlZGRlcnRlc3QsIEdldEltYWdlTWV0YWRhdGEpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJlbWJlZGRlZF9pbWFnZXMucGRmIikpOworICBGUERGX1BBR0UgcGFnZSA9IExvYWRQYWdlKDApOworICBBU1NFUlRfVFJVRShwYWdlKTsKKworICAvLyBDaGVjayB0aGF0IGdldHRpbmcgdGhlIG1ldGFkYXRhIG9mIGEgbnVsbCBvYmplY3Qgd291bGQgZmFpbC4KKyAgRlBERl9JTUFHRU9CSl9NRVRBREFUQSBtZXRhZGF0YTsKKyAgRVhQRUNUX0ZBTFNFKEZQREZJbWFnZU9ial9HZXRJbWFnZU1ldGFkYXRhKG51bGxwdHIsIHBhZ2UsICZtZXRhZGF0YSkpOworCisgIC8vIENoZWNrIHRoYXQgcmVjZWl2aW5nIHRoZSBtZXRhZGF0YSB3aXRoIGEgbnVsbCBtZXRhZGF0YSBvYmplY3Qgd291bGQgZmFpbC4KKyAgRlBERl9QQUdFT0JKRUNUIG9iaiA9IEZQREZQYWdlX0dldE9iamVjdChwYWdlLCAzNSk7CisgIEVYUEVDVF9GQUxTRShGUERGSW1hZ2VPYmpfR2V0SW1hZ2VNZXRhZGF0YShvYmosIHBhZ2UsIG51bGxwdHIpKTsKKworICAvLyBDaGVjayB0aGF0IHdoZW4gcmV0cmlldmluZyBhbiBpbWFnZSBvYmplY3QncyBtZXRhZGF0YSB3aXRob3V0IHBhc3NpbmcgaW4KKyAgLy8gfHBhZ2V8LCBhbGwgdmFsdWVzIGFyZSBjb3JyZWN0LCB3aXRoIHRoZSBsYXN0IHR3byBiZWluZyBkZWZhdWx0IHZhbHVlcy4KKyAgQVNTRVJUX0VRKEZQREZfUEFHRU9CSl9JTUFHRSwgRlBERlBhZ2VPYmpfR2V0VHlwZShvYmopKTsKKyAgQVNTRVJUX1RSVUUoRlBERkltYWdlT2JqX0dldEltYWdlTWV0YWRhdGEob2JqLCBudWxscHRyLCAmbWV0YWRhdGEpKTsKKyAgRVhQRUNUX0VRKDcsIG1ldGFkYXRhLm1hcmtlZF9jb250ZW50X2lkKTsKKyAgRVhQRUNUX0VRKDkydSwgbWV0YWRhdGEud2lkdGgpOworICBFWFBFQ1RfRVEoNjh1LCBtZXRhZGF0YS5oZWlnaHQpOworICBFWFBFQ1RfTkVBUig5Ni4wMDAwMDAsIG1ldGFkYXRhLmhvcml6b250YWxfZHBpLCAwLjAwMSk7CisgIEVYUEVDVF9ORUFSKDk2LjAwMDAwMCwgbWV0YWRhdGEudmVydGljYWxfZHBpLCAwLjAwMSk7CisgIEVYUEVDVF9FUSgwdSwgbWV0YWRhdGEuYml0c19wZXJfcGl4ZWwpOworICBFWFBFQ1RfRVEoRlBERl9DT0xPUlNQQUNFX1VOS05PV04sIG1ldGFkYXRhLmNvbG9yc3BhY2UpOworCisgIC8vIFZlcmlmeSB0aGUgbWV0YWRhdGEgb2YgYSBiaXRtYXAgaW1hZ2Ugd2l0aCBpbmRleGVkIGNvbG9yc3BhY2UuCisgIEFTU0VSVF9UUlVFKEZQREZJbWFnZU9ial9HZXRJbWFnZU1ldGFkYXRhKG9iaiwgcGFnZSwgJm1ldGFkYXRhKSk7CisgIEVYUEVDVF9FUSg3LCBtZXRhZGF0YS5tYXJrZWRfY29udGVudF9pZCk7CisgIEVYUEVDVF9FUSg5MnUsIG1ldGFkYXRhLndpZHRoKTsKKyAgRVhQRUNUX0VRKDY4dSwgbWV0YWRhdGEuaGVpZ2h0KTsKKyAgRVhQRUNUX05FQVIoOTYuMDAwMDAwLCBtZXRhZGF0YS5ob3Jpem9udGFsX2RwaSwgMC4wMDEpOworICBFWFBFQ1RfTkVBUig5Ni4wMDAwMDAsIG1ldGFkYXRhLnZlcnRpY2FsX2RwaSwgMC4wMDEpOworICBFWFBFQ1RfRVEoMXUsIG1ldGFkYXRhLmJpdHNfcGVyX3BpeGVsKTsKKyAgRVhQRUNUX0VRKEZQREZfQ09MT1JTUEFDRV9JTkRFWEVELCBtZXRhZGF0YS5jb2xvcnNwYWNlKTsKKworICAvLyBWZXJpZnkgdGhlIG1ldGFkYXRhIG9mIGFuIGltYWdlIHdpdGggUkdCIGNvbG9yc3BhY2UuCisgIG9iaiA9IEZQREZQYWdlX0dldE9iamVjdChwYWdlLCAzNyk7CisgIEFTU0VSVF9FUShGUERGX1BBR0VPQkpfSU1BR0UsIEZQREZQYWdlT2JqX0dldFR5cGUob2JqKSk7CisgIEFTU0VSVF9UUlVFKEZQREZJbWFnZU9ial9HZXRJbWFnZU1ldGFkYXRhKG9iaiwgcGFnZSwgJm1ldGFkYXRhKSk7CisgIEVYUEVDVF9FUSg5LCBtZXRhZGF0YS5tYXJrZWRfY29udGVudF9pZCk7CisgIEVYUEVDVF9FUSgxMjZ1LCBtZXRhZGF0YS53aWR0aCk7CisgIEVYUEVDVF9FUSgxMDZ1LCBtZXRhZGF0YS5oZWlnaHQpOworICBFWFBFQ1RfTkVBUigxNjIuMTczNzUyLCBtZXRhZGF0YS5ob3Jpem9udGFsX2RwaSwgMC4wMDEpOworICBFWFBFQ1RfTkVBUigxNjIuNTU1ODc4LCBtZXRhZGF0YS52ZXJ0aWNhbF9kcGksIDAuMDAxKTsKKyAgRVhQRUNUX0VRKDI0dSwgbWV0YWRhdGEuYml0c19wZXJfcGl4ZWwpOworICBFWFBFQ1RfRVEoRlBERl9DT0xPUlNQQUNFX0RFVklDRVJHQiwgbWV0YWRhdGEuY29sb3JzcGFjZSk7CisKKyAgVW5sb2FkUGFnZShwYWdlKTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnBkZmVkaXRpbWcuY3BwIGIvZnBkZnNkay9mcGRmZWRpdGltZy5jcHAKaW5kZXggNTY4NzVlMi4uMGQ3YmE1NiAxMDA2NDQKLS0tIGEvZnBkZnNkay9mcGRmZWRpdGltZy5jcHAKKysrIGIvZnBkZnNkay9mcGRmZWRpdGltZy5jcHAKQEAgLTksOTcgKzksMjk2IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2NwZGZfbW9kdWxlbWdyLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9pbWFnZS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfaW1hZ2VvYmplY3QuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2UuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2VvYmplY3QuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbmFtZS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9kaWJzb3VyY2UuaCIKICNpbmNsdWRlICJmcGRmc2RrL2ZzZGtfZGVmaW5lLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogCi1ETExFWFBPUlQgRlBERl9QQUdFT0JKRUNUIFNURENBTEwKLUZQREZQYWdlT2JqX05ld0ltZ2VPYmooRlBERl9ET0NVTUVOVCBkb2N1bWVudCkgewotICBDUERGX0RvY3VtZW50KiBwRG9jID0gQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChkb2N1bWVudCk7Ci0gIGlmICghcERvYykKLSAgICByZXR1cm4gbnVsbHB0cjsKK25hbWVzcGFjZSB7CiAKLSAgQ1BERl9JbWFnZU9iamVjdCogcEltYWdlT2JqID0gbmV3IENQREZfSW1hZ2VPYmplY3Q7Ci0gIHBJbWFnZU9iai0+U2V0T3duZWRJbWFnZShwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9JbWFnZT4ocERvYykpOwotICByZXR1cm4gcEltYWdlT2JqOwotfQorLy8gVGhlc2UgY2hlY2tzIGVuc3VyZSB0aGUgY29uc2lzdGVuY3kgb2YgY29sb3JzcGFjZSB2YWx1ZXMgYWNyb3NzIGNvcmUvIGFuZAorLy8gcHVibGljLy4KK3N0YXRpY19hc3NlcnQoUERGQ1NfREVWSUNFR1JBWSA9PSBGUERGX0NPTE9SU1BBQ0VfREVWSUNFR1JBWSwKKyAgICAgICAgICAgICAgIlBERkNTX0RFVklDRUdSQVkgdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoUERGQ1NfREVWSUNFUkdCID09IEZQREZfQ09MT1JTUEFDRV9ERVZJQ0VSR0IsCisgICAgICAgICAgICAgICJQREZDU19ERVZJQ0VSR0IgdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoUERGQ1NfREVWSUNFQ01ZSyA9PSBGUERGX0NPTE9SU1BBQ0VfREVWSUNFQ01ZSywKKyAgICAgICAgICAgICAgIlBERkNTX0RFVklDRUNNWUsgdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoUERGQ1NfQ0FMR1JBWSA9PSBGUERGX0NPTE9SU1BBQ0VfQ0FMR1JBWSwKKyAgICAgICAgICAgICAgIlBERkNTX0NBTEdSQVkgdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoUERGQ1NfQ0FMUkdCID09IEZQREZfQ09MT1JTUEFDRV9DQUxSR0IsCisgICAgICAgICAgICAgICJQREZDU19DQUxSR0IgdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoUERGQ1NfTEFCID09IEZQREZfQ09MT1JTUEFDRV9MQUIsICJQREZDU19MQUIgdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoUERGQ1NfSUNDQkFTRUQgPT0gRlBERl9DT0xPUlNQQUNFX0lDQ0JBU0VELAorICAgICAgICAgICAgICAiUERGQ1NfSUNDQkFTRUQgdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoUERGQ1NfU0VQQVJBVElPTiA9PSBGUERGX0NPTE9SU1BBQ0VfU0VQQVJBVElPTiwKKyAgICAgICAgICAgICAgIlBERkNTX1NFUEFSQVRJT04gdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoUERGQ1NfREVWSUNFTiA9PSBGUERGX0NPTE9SU1BBQ0VfREVWSUNFTiwKKyAgICAgICAgICAgICAgIlBERkNTX0RFVklDRU4gdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoUERGQ1NfSU5ERVhFRCA9PSBGUERGX0NPTE9SU1BBQ0VfSU5ERVhFRCwKKyAgICAgICAgICAgICAgIlBERkNTX0lOREVYRUQgdmFsdWUgbWlzbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoUERGQ1NfUEFUVEVSTiA9PSBGUERGX0NPTE9SU1BBQ0VfUEFUVEVSTiwKKyAgICAgICAgICAgICAgIlBERkNTX1BBVFRFUk4gdmFsdWUgbWlzbWF0Y2giKTsKIAotRlBERl9CT09MIEZQREZJbWFnZU9ial9Mb2FkSnBlZ0hlbHBlcihGUERGX1BBR0UqIHBhZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0VPQkpFQ1QgaW1hZ2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZJTEVBQ0NFU1MqIGZpbGVBY2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5saW5lSnBlZykgewotICBpZiAoIWltYWdlX29iamVjdCB8fCAhZmlsZUFjY2VzcyB8fCAhcGFnZXMpCitib29sIExvYWRKcGVnSGVscGVyKEZQREZfUEFHRSogcGFnZXMsCisgICAgICAgICAgICAgICAgICAgIGludCBuQ291bnQsCisgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgIEZQREZfRklMRUFDQ0VTUyogZmlsZUFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmxpbmVKcGVnKSB7CisgIGlmICghaW1hZ2Vfb2JqZWN0IHx8ICFmaWxlQWNjZXNzKQogICAgIHJldHVybiBmYWxzZTsKIAotICBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IHBGaWxlID0KLSAgICAgIE1ha2VTZWVrYWJsZVJlYWRTdHJlYW0oZmlsZUFjY2Vzcyk7Ci0gIENQREZfSW1hZ2VPYmplY3QqIHBJbWdPYmogPSByZWludGVycHJldF9jYXN0PENQREZfSW1hZ2VPYmplY3QqPihpbWFnZV9vYmplY3QpOwotICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbkNvdW50OyBpbmRleCsrKSB7Ci0gICAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2VzW2luZGV4XSk7Ci0gICAgaWYgKHBQYWdlKQotICAgICAgcEltZ09iai0+R2V0SW1hZ2UoKS0+UmVzZXRDYWNoZShwUGFnZSwgbnVsbHB0cik7CisgIFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBwRmlsZSA9IE1ha2VTZWVrYWJsZVJlYWRTdHJlYW0oZmlsZUFjY2Vzcyk7CisgIENQREZfSW1hZ2VPYmplY3QqIHBJbWdPYmogPSBzdGF0aWNfY2FzdDxDUERGX0ltYWdlT2JqZWN0Kj4oaW1hZ2Vfb2JqZWN0KTsKKworICBpZiAocGFnZXMpIHsKKyAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbkNvdW50OyBpbmRleCsrKSB7CisgICAgICBDUERGX1BhZ2UqIHBQYWdlID0gQ1BERlBhZ2VGcm9tRlBERlBhZ2UocGFnZXNbaW5kZXhdKTsKKyAgICAgIGlmIChwUGFnZSkKKyAgICAgICAgcEltZ09iai0+R2V0SW1hZ2UoKS0+UmVzZXRDYWNoZShwUGFnZSwgbnVsbHB0cik7CisgICAgfQogICB9CiAKICAgaWYgKGlubGluZUpwZWcpCiAgICAgcEltZ09iai0+R2V0SW1hZ2UoKS0+U2V0SnBlZ0ltYWdlSW5saW5lKHBGaWxlKTsKICAgZWxzZQogICAgIHBJbWdPYmotPkdldEltYWdlKCktPlNldEpwZWdJbWFnZShwRmlsZSk7Ci0KKyAgcEltZ09iai0+U2V0RGlydHkodHJ1ZSk7CiAgIHJldHVybiB0cnVlOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwKK30gIC8vIG5hbWVzcGFjZQorCitGUERGX0VYUE9SVCBGUERGX1BBR0VPQkpFQ1QgRlBERl9DQUxMQ09OVgorRlBERlBhZ2VPYmpfTmV3SW1hZ2VPYmooRlBERl9ET0NVTUVOVCBkb2N1bWVudCkgeworICBDUERGX0RvY3VtZW50KiBwRG9jID0gQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChkb2N1bWVudCk7CisgIGlmICghcERvYykKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBhdXRvIHBJbWFnZU9iaiA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0ltYWdlT2JqZWN0PigpOworICBwSW1hZ2VPYmotPlNldEltYWdlKHBkZml1bTo6TWFrZVJldGFpbjxDUERGX0ltYWdlPihwRG9jKSk7CisgIHJldHVybiBwSW1hZ2VPYmoucmVsZWFzZSgpOworfQorCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgogRlBERkltYWdlT2JqX0xvYWRKcGVnRmlsZShGUERGX1BBR0UqIHBhZ2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0VPQkpFQ1QgaW1hZ2Vfb2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZJTEVBQ0NFU1MqIGZpbGVBY2Nlc3MpIHsKLSAgcmV0dXJuIEZQREZJbWFnZU9ial9Mb2FkSnBlZ0hlbHBlcihwYWdlcywgbkNvdW50LCBpbWFnZV9vYmplY3QsIGZpbGVBY2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICByZXR1cm4gTG9hZEpwZWdIZWxwZXIocGFnZXMsIG5Db3VudCwgaW1hZ2Vfb2JqZWN0LCBmaWxlQWNjZXNzLCBmYWxzZSk7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTAorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKIEZQREZJbWFnZU9ial9Mb2FkSnBlZ0ZpbGVJbmxpbmUoRlBERl9QQUdFKiBwYWdlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GSUxFQUNDRVNTKiBmaWxlQWNjZXNzKSB7Ci0gIHJldHVybiBGUERGSW1hZ2VPYmpfTG9hZEpwZWdIZWxwZXIocGFnZXMsIG5Db3VudCwgaW1hZ2Vfb2JqZWN0LCBmaWxlQWNjZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICByZXR1cm4gTG9hZEpwZWdIZWxwZXIocGFnZXMsIG5Db3VudCwgaW1hZ2Vfb2JqZWN0LCBmaWxlQWNjZXNzLCB0cnVlKTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZJbWFnZU9ial9TZXRNYXRyaXgoRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZikgeworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZJbWFnZU9ial9TZXRNYXRyaXgoRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGEsCisgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiLAorICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYywKKyAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGQsCisgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlLAorICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZikgewogICBpZiAoIWltYWdlX29iamVjdCkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgQ1BERl9JbWFnZU9iamVjdCogcEltZ09iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q1BERl9JbWFnZU9iamVjdCo+KGltYWdlX29iamVjdCk7Ci0gIHBJbWdPYmotPnNldF9tYXRyaXgoCi0gICAgICBDRlhfTWF0cml4KHN0YXRpY19jYXN0PEZYX0ZMT0FUPihhKSwgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KGIpLAotICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGWF9GTE9BVD4oYyksIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihkKSwKLSAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KGUpLCBzdGF0aWNfY2FzdDxGWF9GTE9BVD4oZikpKTsKKyAgQ1BERl9JbWFnZU9iamVjdCogcEltZ09iaiA9IHN0YXRpY19jYXN0PENQREZfSW1hZ2VPYmplY3QqPihpbWFnZV9vYmplY3QpOworICBwSW1nT2JqLT5zZXRfbWF0cml4KENGWF9NYXRyaXgoc3RhdGljX2Nhc3Q8ZmxvYXQ+KGEpLCBzdGF0aWNfY2FzdDxmbG9hdD4oYiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oYyksIHN0YXRpY19jYXN0PGZsb2F0PihkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihlKSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGYpKSk7CiAgIHBJbWdPYmotPkNhbGNCb3VuZGluZ0JveCgpOworICBwSW1nT2JqLT5TZXREaXJ0eSh0cnVlKTsKICAgcmV0dXJuIHRydWU7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGSW1hZ2VPYmpfU2V0Qml0bWFwKEZQREZfUEFHRSogcGFnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQklUTUFQIGJpdG1hcCkgeworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZJbWFnZU9ial9TZXRCaXRtYXAoRlBERl9QQUdFKiBwYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CSVRNQVAgYml0bWFwKSB7CiAgIGlmICghaW1hZ2Vfb2JqZWN0IHx8ICFiaXRtYXAgfHwgIXBhZ2VzKQogICAgIHJldHVybiBmYWxzZTsKIAotICBDUERGX0ltYWdlT2JqZWN0KiBwSW1nT2JqID0gcmVpbnRlcnByZXRfY2FzdDxDUERGX0ltYWdlT2JqZWN0Kj4oaW1hZ2Vfb2JqZWN0KTsKKyAgQ1BERl9JbWFnZU9iamVjdCogcEltZ09iaiA9IHN0YXRpY19jYXN0PENQREZfSW1hZ2VPYmplY3QqPihpbWFnZV9vYmplY3QpOwogICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbkNvdW50OyBpbmRleCsrKSB7CiAgICAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2VzW2luZGV4XSk7CiAgICAgaWYgKHBQYWdlKQogICAgICAgcEltZ09iai0+R2V0SW1hZ2UoKS0+UmVzZXRDYWNoZShwUGFnZSwgbnVsbHB0cik7CiAgIH0KLSAgcEltZ09iai0+R2V0SW1hZ2UoKS0+U2V0SW1hZ2UocmVpbnRlcnByZXRfY2FzdDxDRlhfRElCaXRtYXAqPihiaXRtYXApKTsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gaG9sZGVyKENGWEJpdG1hcEZyb21GUERGQml0bWFwKGJpdG1hcCkpOworICBwSW1nT2JqLT5HZXRJbWFnZSgpLT5TZXRJbWFnZShob2xkZXIpOwogICBwSW1nT2JqLT5DYWxjQm91bmRpbmdCb3goKTsKKyAgcEltZ09iai0+U2V0RGlydHkodHJ1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitGUERGX0VYUE9SVCBGUERGX0JJVE1BUCBGUERGX0NBTExDT05WCitGUERGSW1hZ2VPYmpfR2V0Qml0bWFwKEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QpIHsKKyAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqID0gQ1BERlBhZ2VPYmplY3RGcm9tRlBERlBhZ2VPYmplY3QoaW1hZ2Vfb2JqZWN0KTsKKyAgaWYgKCFwT2JqIHx8ICFwT2JqLT5Jc0ltYWdlKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgUmV0YWluUHRyPENQREZfSW1hZ2U+IHBJbWcgPSBwT2JqLT5Bc0ltYWdlKCktPkdldEltYWdlKCk7CisgIGlmICghcEltZykKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4gcFNvdXJjZSA9IHBJbWctPkxvYWRESUJTb3VyY2UoKTsKKyAgaWYgKCFwU291cmNlKQorICAgIHJldHVybiBudWxscHRyOworCisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBCaXRtYXA7CisgIC8vIElmIHRoZSBzb3VyY2UgaW1hZ2UgaGFzIGEgcmVwcmVzZW50YXRpb24gb2YgMSBiaXQgcGVyIHBpeGVsLCB0aGVuIGNvbnZlcnQKKyAgLy8gaXQgdG8gYSBncmF5c2NhbGUgYml0bWFwIGhhdmluZyAxIGJ5dGUgcGVyIHBpeGVsLCBzaW5jZSBiaXRtYXBzIGhhdmUgbm8KKyAgLy8gY29uY2VwdCBvZiBiaXRzLiBPdGhlcndpc2UsIGNvbnZlcnQgdGhlIHNvdXJjZSBpbWFnZSB0byBhIGJpdG1hcCBkaXJlY3RseSwKKyAgLy8gcmV0YWluaW5nIGl0cyBjb2xvciByZXByZXNlbnRhdGlvbi4KKyAgaWYgKHBTb3VyY2UtPkdldEJQUCgpID09IDEpCisgICAgcEJpdG1hcCA9IHBTb3VyY2UtPkNsb25lQ29udmVydChGWERJQl84YnBwUmdiKTsKKyAgZWxzZQorICAgIHBCaXRtYXAgPSBwU291cmNlLT5DbG9uZShudWxscHRyKTsKKworICByZXR1cm4gcEJpdG1hcC5MZWFrKCk7Cit9CisKK0ZQREZfRVhQT1JUIHVuc2lnbmVkIGxvbmcgRlBERl9DQUxMQ09OVgorRlBERkltYWdlT2JqX0dldEltYWdlRGF0YURlY29kZWQoRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmbGVuKSB7CisgIENQREZfUGFnZU9iamVjdCogcE9iaiA9IENQREZQYWdlT2JqZWN0RnJvbUZQREZQYWdlT2JqZWN0KGltYWdlX29iamVjdCk7CisgIGlmICghcE9iaiB8fCAhcE9iai0+SXNJbWFnZSgpKQorICAgIHJldHVybiAwOworCisgIFJldGFpblB0cjxDUERGX0ltYWdlPiBwSW1nID0gcE9iai0+QXNJbWFnZSgpLT5HZXRJbWFnZSgpOworICBpZiAoIXBJbWcpCisgICAgcmV0dXJuIDA7CisKKyAgQ1BERl9TdHJlYW0qIHBJbWdTdHJlYW0gPSBwSW1nLT5HZXRTdHJlYW0oKTsKKyAgaWYgKCFwSW1nU3RyZWFtKQorICAgIHJldHVybiAwOworCisgIHJldHVybiBEZWNvZGVTdHJlYW1NYXliZUNvcHlBbmRSZXR1cm5MZW5ndGgocEltZ1N0cmVhbSwgYnVmZmVyLCBidWZsZW4pOworfQorCitGUERGX0VYUE9SVCB1bnNpZ25lZCBsb25nIEZQREZfQ0FMTENPTlYKK0ZQREZJbWFnZU9ial9HZXRJbWFnZURhdGFSYXcoRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1ZmxlbikgeworICBDUERGX1BhZ2VPYmplY3QqIHBPYmogPSBDUERGUGFnZU9iamVjdEZyb21GUERGUGFnZU9iamVjdChpbWFnZV9vYmplY3QpOworICBpZiAoIXBPYmogfHwgIXBPYmotPklzSW1hZ2UoKSkKKyAgICByZXR1cm4gMDsKKworICBSZXRhaW5QdHI8Q1BERl9JbWFnZT4gcEltZyA9IHBPYmotPkFzSW1hZ2UoKS0+R2V0SW1hZ2UoKTsKKyAgaWYgKCFwSW1nKQorICAgIHJldHVybiAwOworCisgIENQREZfU3RyZWFtKiBwSW1nU3RyZWFtID0gcEltZy0+R2V0U3RyZWFtKCk7CisgIGlmICghcEltZ1N0cmVhbSkKKyAgICByZXR1cm4gMDsKKworICB1aW50MzJfdCBsZW4gPSBwSW1nU3RyZWFtLT5HZXRSYXdTaXplKCk7CisgIGlmIChidWZmZXIgJiYgYnVmbGVuID49IGxlbikKKyAgICBtZW1jcHkoYnVmZmVyLCBwSW1nU3RyZWFtLT5HZXRSYXdEYXRhKCksIGxlbik7CisKKyAgcmV0dXJuIGxlbjsKK30KKworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYKK0ZQREZJbWFnZU9ial9HZXRJbWFnZUZpbHRlckNvdW50KEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QpIHsKKyAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqID0gQ1BERlBhZ2VPYmplY3RGcm9tRlBERlBhZ2VPYmplY3QoaW1hZ2Vfb2JqZWN0KTsKKyAgaWYgKCFwT2JqIHx8ICFwT2JqLT5Jc0ltYWdlKCkpCisgICAgcmV0dXJuIDA7CisKKyAgUmV0YWluUHRyPENQREZfSW1hZ2U+IHBJbWcgPSBwT2JqLT5Bc0ltYWdlKCktPkdldEltYWdlKCk7CisgIGlmICghcEltZykKKyAgICByZXR1cm4gMDsKKworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcEltZy0+R2V0RGljdCgpOworICBDUERGX09iamVjdCogcEZpbHRlciA9IHBEaWN0ID8gcERpY3QtPkdldERpcmVjdE9iamVjdEZvcigiRmlsdGVyIikgOiBudWxscHRyOworICBpZiAoIXBGaWx0ZXIpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHBGaWx0ZXItPklzQXJyYXkoKSkKKyAgICByZXR1cm4gcEZpbHRlci0+QXNBcnJheSgpLT5HZXRDb3VudCgpOworICBpZiAocEZpbHRlci0+SXNOYW1lKCkpCisgICAgcmV0dXJuIDE7CisKKyAgcmV0dXJuIDA7Cit9CisKK0ZQREZfRVhQT1JUIHVuc2lnbmVkIGxvbmcgRlBERl9DQUxMQ09OVgorRlBERkltYWdlT2JqX0dldEltYWdlRmlsdGVyKEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1ZmxlbikgeworICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IEZQREZJbWFnZU9ial9HZXRJbWFnZUZpbHRlckNvdW50KGltYWdlX29iamVjdCkpCisgICAgcmV0dXJuIDA7CisKKyAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqID0gQ1BERlBhZ2VPYmplY3RGcm9tRlBERlBhZ2VPYmplY3QoaW1hZ2Vfb2JqZWN0KTsKKyAgQ1BERl9PYmplY3QqIHBGaWx0ZXIgPQorICAgICAgcE9iai0+QXNJbWFnZSgpLT5HZXRJbWFnZSgpLT5HZXREaWN0KCktPkdldERpcmVjdE9iamVjdEZvcigiRmlsdGVyIik7CisgIEJ5dGVTdHJpbmcgYnNGaWx0ZXI7CisgIGlmIChwRmlsdGVyLT5Jc05hbWUoKSkKKyAgICBic0ZpbHRlciA9IHBGaWx0ZXItPkFzTmFtZSgpLT5HZXRTdHJpbmcoKTsKKyAgZWxzZQorICAgIGJzRmlsdGVyID0gcEZpbHRlci0+QXNBcnJheSgpLT5HZXRTdHJpbmdBdChpbmRleCk7CisKKyAgdW5zaWduZWQgbG9uZyBsZW4gPSBic0ZpbHRlci5HZXRMZW5ndGgoKSArIDE7CisgIGlmIChidWZmZXIgJiYgbGVuIDw9IGJ1ZmxlbikKKyAgICBtZW1jcHkoYnVmZmVyLCBic0ZpbHRlci5jX3N0cigpLCBsZW4pOworICByZXR1cm4gbGVuOworfQorCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgorRlBERkltYWdlT2JqX0dldEltYWdlTWV0YWRhdGEoRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9JTUFHRU9CSl9NRVRBREFUQSogbWV0YWRhdGEpIHsKKyAgQ1BERl9QYWdlT2JqZWN0KiBwT2JqID0gQ1BERlBhZ2VPYmplY3RGcm9tRlBERlBhZ2VPYmplY3QoaW1hZ2Vfb2JqZWN0KTsKKyAgaWYgKCFwT2JqIHx8ICFwT2JqLT5Jc0ltYWdlKCkgfHwgIW1ldGFkYXRhKQorICAgIHJldHVybiBmYWxzZTsKKworICBSZXRhaW5QdHI8Q1BERl9JbWFnZT4gcEltZyA9IHBPYmotPkFzSW1hZ2UoKS0+R2V0SW1hZ2UoKTsKKyAgaWYgKCFwSW1nKQorICAgIHJldHVybiBmYWxzZTsKKworICBtZXRhZGF0YS0+bWFya2VkX2NvbnRlbnRfaWQgPSBwT2JqLT5tX0NvbnRlbnRNYXJrLkdldE1hcmtlZENvbnRlbnRJRCgpOworCisgIGNvbnN0IGludCBuUGl4ZWxXaWR0aCA9IHBJbWctPkdldFBpeGVsV2lkdGgoKTsKKyAgY29uc3QgaW50IG5QaXhlbEhlaWdodCA9IHBJbWctPkdldFBpeGVsSGVpZ2h0KCk7CisgIG1ldGFkYXRhLT53aWR0aCA9IG5QaXhlbFdpZHRoOworICBtZXRhZGF0YS0+aGVpZ2h0ID0gblBpeGVsSGVpZ2h0OworCisgIGNvbnN0IGZsb2F0IG5XaWR0aCA9IHBPYmotPm1fUmlnaHQgLSBwT2JqLT5tX0xlZnQ7CisgIGNvbnN0IGZsb2F0IG5IZWlnaHQgPSBwT2JqLT5tX1RvcCAtIHBPYmotPm1fQm90dG9tOworICBjb25zdGV4cHIgaW50IG5Qb2ludHNQZXJJbmNoID0gNzI7CisgIGlmIChuV2lkdGggIT0gMCAmJiBuSGVpZ2h0ICE9IDApIHsKKyAgICBtZXRhZGF0YS0+aG9yaXpvbnRhbF9kcGkgPSBuUGl4ZWxXaWR0aCAvIG5XaWR0aCAqIG5Qb2ludHNQZXJJbmNoOworICAgIG1ldGFkYXRhLT52ZXJ0aWNhbF9kcGkgPSBuUGl4ZWxIZWlnaHQgLyBuSGVpZ2h0ICogblBvaW50c1BlckluY2g7CisgIH0KKworICBtZXRhZGF0YS0+Yml0c19wZXJfcGl4ZWwgPSAwOworICBtZXRhZGF0YS0+Y29sb3JzcGFjZSA9IEZQREZfQ09MT1JTUEFDRV9VTktOT1dOOworCisgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKKyAgaWYgKCFwUGFnZSB8fCAhcFBhZ2UtPm1fcERvY3VtZW50LkdldCgpIHx8ICFwSW1nLT5HZXRTdHJlYW0oKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBhdXRvIHBTb3VyY2UgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERl9ESUJTb3VyY2U+KCk7CisgIGlmICghcFNvdXJjZS0+U3RhcnRMb2FkRElCU291cmNlKHBQYWdlLT5tX3BEb2N1bWVudC5HZXQoKSwgcEltZy0+R2V0U3RyZWFtKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFnZS0+bV9wUGFnZVJlc291cmNlcy5HZXQoKSkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIG1ldGFkYXRhLT5iaXRzX3Blcl9waXhlbCA9IHBTb3VyY2UtPkdldEJQUCgpOworICBpZiAocFNvdXJjZS0+R2V0Q29sb3JTcGFjZSgpKQorICAgIG1ldGFkYXRhLT5jb2xvcnNwYWNlID0gcFNvdXJjZS0+R2V0Q29sb3JTcGFjZSgpLT5HZXRGYW1pbHkoKTsKKwogICByZXR1cm4gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnBkZmVkaXRpbWdfdW5pdHRlc3QuY3BwIGIvZnBkZnNkay9mcGRmZWRpdGltZ191bml0dGVzdC5jcHAKaW5kZXggYWU0YWYyNS4uZmNjMDgxYSAxMDA2NDQKLS0tIGEvZnBkZnNkay9mcGRmZWRpdGltZ191bml0dGVzdC5jcHAKKysrIGIvZnBkZnNkay9mcGRmZWRpdGltZ191bml0dGVzdC5jcHAKQEAgLTgsMTAgKzgsNyBAQAogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogCiBjbGFzcyBQREZFZGl0VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKLSAgICBDUERGX01vZHVsZU1nciogbW9kdWxlX21nciA9IENQREZfTW9kdWxlTWdyOjpHZXQoKTsKLSAgICBtb2R1bGVfbWdyLT5Jbml0UGFnZU1vZHVsZSgpOwotICB9CisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+SW5pdCgpOyB9CiAKICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsgQ1BERl9Nb2R1bGVNZ3I6OkRlc3Ryb3koKTsgfQogfTsKQEAgLTE5LDQwICsxNiw0MCBAQAogVEVTVF9GKFBERkVkaXRUZXN0LCBJbnNlcnRPYmplY3RXaXRoSW52YWxpZFBhZ2UpIHsKICAgRlBERl9ET0NVTUVOVCBkb2MgPSBGUERGX0NyZWF0ZU5ld0RvY3VtZW50KCk7CiAgIEZQREZfUEFHRSBwYWdlID0gRlBERlBhZ2VfTmV3KGRvYywgMCwgMTAwLCAxMDApOwotICBFWFBFQ1RfRVEoMCwgRlBERlBhZ2VfQ291bnRPYmplY3QocGFnZSkpOworICBFWFBFQ1RfRVEoMCwgRlBERlBhZ2VfQ291bnRPYmplY3RzKHBhZ2UpKTsKIAogICBGUERGUGFnZV9JbnNlcnRPYmplY3QobnVsbHB0ciwgbnVsbHB0cik7Ci0gIEVYUEVDVF9FUSgwLCBGUERGUGFnZV9Db3VudE9iamVjdChwYWdlKSk7CisgIEVYUEVDVF9FUSgwLCBGUERGUGFnZV9Db3VudE9iamVjdHMocGFnZSkpOwogCiAgIEZQREZQYWdlX0luc2VydE9iamVjdChwYWdlLCBudWxscHRyKTsKLSAgRVhQRUNUX0VRKDAsIEZQREZQYWdlX0NvdW50T2JqZWN0KHBhZ2UpKTsKKyAgRVhQRUNUX0VRKDAsIEZQREZQYWdlX0NvdW50T2JqZWN0cyhwYWdlKSk7CiAKLSAgRlBERl9QQUdFT0JKRUNUIHBhZ2VfaW1hZ2UgPSBGUERGUGFnZU9ial9OZXdJbWdlT2JqKGRvYyk7CisgIEZQREZfUEFHRU9CSkVDVCBwYWdlX2ltYWdlID0gRlBERlBhZ2VPYmpfTmV3SW1hZ2VPYmooZG9jKTsKICAgRlBERlBhZ2VfSW5zZXJ0T2JqZWN0KG51bGxwdHIsIHBhZ2VfaW1hZ2UpOwotICBFWFBFQ1RfRVEoMCwgRlBERlBhZ2VfQ291bnRPYmplY3QocGFnZSkpOworICBFWFBFQ1RfRVEoMCwgRlBERlBhZ2VfQ291bnRPYmplY3RzKHBhZ2UpKTsKIAogICBGUERGX0Nsb3NlUGFnZShwYWdlKTsKICAgRlBERl9DbG9zZURvY3VtZW50KGRvYyk7CiB9CiAKLVRFU1RfRihQREZFZGl0VGVzdCwgTmV3SW1nZU9iaikgeworVEVTVF9GKFBERkVkaXRUZXN0LCBOZXdJbWFnZU9iaikgewogICBGUERGX0RPQ1VNRU5UIGRvYyA9IEZQREZfQ3JlYXRlTmV3RG9jdW1lbnQoKTsKICAgRlBERl9QQUdFIHBhZ2UgPSBGUERGUGFnZV9OZXcoZG9jLCAwLCAxMDAsIDEwMCk7Ci0gIEVYUEVDVF9FUSgwLCBGUERGUGFnZV9Db3VudE9iamVjdChwYWdlKSk7CisgIEVYUEVDVF9FUSgwLCBGUERGUGFnZV9Db3VudE9iamVjdHMocGFnZSkpOwogCi0gIEZQREZfUEFHRU9CSkVDVCBwYWdlX2ltYWdlID0gRlBERlBhZ2VPYmpfTmV3SW1nZU9iaihkb2MpOworICBGUERGX1BBR0VPQkpFQ1QgcGFnZV9pbWFnZSA9IEZQREZQYWdlT2JqX05ld0ltYWdlT2JqKGRvYyk7CiAgIEZQREZQYWdlX0luc2VydE9iamVjdChwYWdlLCBwYWdlX2ltYWdlKTsKLSAgRVhQRUNUX0VRKDEsIEZQREZQYWdlX0NvdW50T2JqZWN0KHBhZ2UpKTsKKyAgRVhQRUNUX0VRKDEsIEZQREZQYWdlX0NvdW50T2JqZWN0cyhwYWdlKSk7CiAgIEVYUEVDVF9UUlVFKEZQREZQYWdlX0dlbmVyYXRlQ29udGVudChwYWdlKSk7CiAKICAgRlBERl9DbG9zZVBhZ2UocGFnZSk7CiAgIEZQREZfQ2xvc2VEb2N1bWVudChkb2MpOwogfQogCi1URVNUX0YoUERGRWRpdFRlc3QsIE5ld0ltZ2VPYmpHZW5lcmF0ZUNvbnRlbnQpIHsKK1RFU1RfRihQREZFZGl0VGVzdCwgTmV3SW1hZ2VPYmpHZW5lcmF0ZUNvbnRlbnQpIHsKICAgRlBERl9ET0NVTUVOVCBkb2MgPSBGUERGX0NyZWF0ZU5ld0RvY3VtZW50KCk7CiAgIEZQREZfUEFHRSBwYWdlID0gRlBERlBhZ2VfTmV3KGRvYywgMCwgMTAwLCAxMDApOwotICBFWFBFQ1RfRVEoMCwgRlBERlBhZ2VfQ291bnRPYmplY3QocGFnZSkpOworICBFWFBFQ1RfRVEoMCwgRlBERlBhZ2VfQ291bnRPYmplY3RzKHBhZ2UpKTsKIAogICBjb25zdGV4cHIgaW50IGtCaXRtYXBTaXplID0gNTA7CiAgIEZQREZfQklUTUFQIGJpdG1hcCA9IEZQREZCaXRtYXBfQ3JlYXRlKGtCaXRtYXBTaXplLCBrQml0bWFwU2l6ZSwgMCk7CkBAIC02MCwxMiArNTcsMTIgQEAKICAgRVhQRUNUX0VRKGtCaXRtYXBTaXplLCBGUERGQml0bWFwX0dldFdpZHRoKGJpdG1hcCkpOwogICBFWFBFQ1RfRVEoa0JpdG1hcFNpemUsIEZQREZCaXRtYXBfR2V0SGVpZ2h0KGJpdG1hcCkpOwogCi0gIEZQREZfUEFHRU9CSkVDVCBwYWdlX2ltYWdlID0gRlBERlBhZ2VPYmpfTmV3SW1nZU9iaihkb2MpOworICBGUERGX1BBR0VPQkpFQ1QgcGFnZV9pbWFnZSA9IEZQREZQYWdlT2JqX05ld0ltYWdlT2JqKGRvYyk7CiAgIEFTU0VSVF9UUlVFKEZQREZJbWFnZU9ial9TZXRCaXRtYXAoJnBhZ2UsIDAsIHBhZ2VfaW1hZ2UsIGJpdG1hcCkpOwogICBBU1NFUlRfVFJVRSgKICAgICAgIEZQREZJbWFnZU9ial9TZXRNYXRyaXgocGFnZV9pbWFnZSwga0JpdG1hcFNpemUsIDAsIDAsIGtCaXRtYXBTaXplLCAwLCAwKSk7CiAgIEZQREZQYWdlX0luc2VydE9iamVjdChwYWdlLCBwYWdlX2ltYWdlKTsKLSAgRVhQRUNUX0VRKDEsIEZQREZQYWdlX0NvdW50T2JqZWN0KHBhZ2UpKTsKKyAgRVhQRUNUX0VRKDEsIEZQREZQYWdlX0NvdW50T2JqZWN0cyhwYWdlKSk7CiAgIEVYUEVDVF9UUlVFKEZQREZQYWdlX0dlbmVyYXRlQ29udGVudChwYWdlKSk7CiAKICAgRlBERkJpdG1hcF9EZXN0cm95KGJpdG1hcCk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZlZGl0cGFnZS5jcHAgYi9mcGRmc2RrL2ZwZGZlZGl0cGFnZS5jcHAKaW5kZXggNjM3NDBiYS4uYTAzMmJmNiAxMDA2NDQKLS0tIGEvZnBkZnNkay9mcGRmZWRpdHBhZ2UuY3BwCisrKyBiL2ZwZGZzZGsvZnBkZmVkaXRwYWdlLmNwcApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2Fubm90bGlzdC5oIgogI2luY2x1ZGUgImZwZGZzZGsvZnNka19kZWZpbmUuaCIKICNpbmNsdWRlICJwdWJsaWMvZnBkZl9mb3JtZmlsbC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKIAogI2lmZGVmIFBERl9FTkFCTEVfWEZBCkBAIC0zMyw3ICszNCw3IEBACiAjaW5jbHVkZSAiZnBkZnNkay9mcGRmeGZhL2NwZGZ4ZmFfcGFnZS5oIgogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCi0jaWYgX0ZYX09TXyA9PSBfRlhfQU5EUk9JRF8KKyNpZiBfRlhfT1NfID09IF9GWF9PU19BTkRST0lEXwogI2luY2x1ZGUgPHRpbWUuaD4KICNlbHNlCiAjaW5jbHVkZSA8Y3RpbWU+CkBAIC02MCwxMDcgKzYxLDcgQEAKICAgcmV0dXJuIHBPYmplY3QgJiYgIXBPYmplY3QtPkdldFN0cmluZygpLkNvbXBhcmUoIlBhZ2UiKTsKIH0KIAotfSAgLy8gbmFtZXNwYWNlCi0KLURMTEVYUE9SVCBGUERGX0RPQ1VNRU5UIFNURENBTEwgRlBERl9DcmVhdGVOZXdEb2N1bWVudCgpIHsKLSAgQ1BERl9Eb2N1bWVudCogcERvYyA9IG5ldyBDUERGX0RvY3VtZW50KG51bGxwdHIpOwotICBwRG9jLT5DcmVhdGVOZXdEb2MoKTsKLSAgdGltZV90IGN1cnJlbnRUaW1lOwotCi0gIENGWF9CeXRlU3RyaW5nIERhdGVTdHI7Ci0KLSAgaWYgKEZTREtfSXNTYW5kQm94UG9saWN5RW5hYmxlZChGUERGX1BPTElDWV9NQUNISU5FVElNRV9BQ0NFU1MpKSB7Ci0gICAgaWYgKC0xICE9IHRpbWUoJmN1cnJlbnRUaW1lKSkgewotICAgICAgdG0qIHBUTSA9IGxvY2FsdGltZSgmY3VycmVudFRpbWUpOwotICAgICAgaWYgKHBUTSkgewotICAgICAgICBEYXRlU3RyLkZvcm1hdCgiRDolMDRkJTAyZCUwMmQlMDJkJTAyZCUwMmQiLCBwVE0tPnRtX3llYXIgKyAxOTAwLAotICAgICAgICAgICAgICAgICAgICAgICBwVE0tPnRtX21vbiArIDEsIHBUTS0+dG1fbWRheSwgcFRNLT50bV9ob3VyLCBwVE0tPnRtX21pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgcFRNLT50bV9zZWMpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIENQREZfRGljdGlvbmFyeSogcEluZm9EaWN0ID0gbnVsbHB0cjsKLSAgcEluZm9EaWN0ID0gcERvYy0+R2V0SW5mbygpOwotICBpZiAocEluZm9EaWN0KSB7Ci0gICAgaWYgKEZTREtfSXNTYW5kQm94UG9saWN5RW5hYmxlZChGUERGX1BPTElDWV9NQUNISU5FVElNRV9BQ0NFU1MpKQotICAgICAgcEluZm9EaWN0LT5TZXROZXdGb3I8Q1BERl9TdHJpbmc+KCJDcmVhdGlvbkRhdGUiLCBEYXRlU3RyLCBmYWxzZSk7Ci0gICAgcEluZm9EaWN0LT5TZXROZXdGb3I8Q1BERl9TdHJpbmc+KCJDcmVhdG9yIiwgTCJQREZpdW0iKTsKLSAgfQotCi0gIHJldHVybiBGUERGRG9jdW1lbnRGcm9tQ1BERkRvY3VtZW50KHBEb2MpOwotfQotCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX0RlbGV0ZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBpbnQgcGFnZV9pbmRleCkgewotICBpZiAoVW5kZXJseWluZ0RvY3VtZW50VHlwZSogcERvYyA9IFVuZGVybHlpbmdGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KSkKLSAgICBwRG9jLT5EZWxldGVQYWdlKHBhZ2VfaW5kZXgpOwotfQotCi1ETExFWFBPUlQgRlBERl9QQUdFIFNURENBTEwgRlBERlBhZ2VfTmV3KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWdlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBoZWlnaHQpIHsKLSAgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOwotICBpZiAoIXBEb2MpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgcGFnZV9pbmRleCA9IHN0ZDo6bWluKHN0ZDo6bWF4KHBhZ2VfaW5kZXgsIDApLCBwRG9jLT5HZXRQYWdlQ291bnQoKSk7Ci0gIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcERvYy0+Q3JlYXRlTmV3UGFnZShwYWdlX2luZGV4KTsKLSAgaWYgKCFwUGFnZURpY3QpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgQ1BERl9BcnJheSogcE1lZGlhQm94QXJyYXkgPSBwUGFnZURpY3QtPlNldE5ld0ZvcjxDUERGX0FycmF5PigiTWVkaWFCb3giKTsKLSAgcE1lZGlhQm94QXJyYXktPkFkZE5ldzxDUERGX051bWJlcj4oMCk7Ci0gIHBNZWRpYUJveEFycmF5LT5BZGROZXc8Q1BERl9OdW1iZXI+KDApOwotICBwTWVkaWFCb3hBcnJheS0+QWRkTmV3PENQREZfTnVtYmVyPihzdGF0aWNfY2FzdDxGWF9GTE9BVD4od2lkdGgpKTsKLSAgcE1lZGlhQm94QXJyYXktPkFkZE5ldzxDUERGX051bWJlcj4oc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KGhlaWdodCkpOwotICBwUGFnZURpY3QtPlNldE5ld0ZvcjxDUERGX051bWJlcj4oIlJvdGF0ZSIsIDApOwotICBwUGFnZURpY3QtPlNldE5ld0ZvcjxDUERGX0RpY3Rpb25hcnk+KCJSZXNvdXJjZXMiKTsKLQotI2lmZGVmIFBERl9FTkFCTEVfWEZBCi0gIENQREZYRkFfUGFnZSogcFBhZ2UgPQotICAgICAgbmV3IENQREZYRkFfUGFnZShzdGF0aWNfY2FzdDxDUERGWEZBX0NvbnRleHQqPihkb2N1bWVudCksIHBhZ2VfaW5kZXgpOwotICBwUGFnZS0+TG9hZFBERlBhZ2UocFBhZ2VEaWN0KTsKLSNlbHNlICAgLy8gUERGX0VOQUJMRV9YRkEKLSAgQ1BERl9QYWdlKiBwUGFnZSA9IG5ldyBDUERGX1BhZ2UocERvYywgcFBhZ2VEaWN0LCB0cnVlKTsKLSAgcFBhZ2UtPlBhcnNlQ29udGVudCgpOwotI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQotCi0gIHJldHVybiBwUGFnZTsKLX0KLQotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZQYWdlX0dldFJvdGF0aW9uKEZQREZfUEFHRSBwYWdlKSB7Ci0gIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKLSAgaWYgKCFJc1BhZ2VPYmplY3QocFBhZ2UpKQotICAgIHJldHVybiAtMTsKLQotICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcFBhZ2UtPm1fcEZvcm1EaWN0OwotICB3aGlsZSAocERpY3QpIHsKLSAgICBpZiAocERpY3QtPktleUV4aXN0KCJSb3RhdGUiKSkgewotICAgICAgQ1BERl9PYmplY3QqIHBSb3RhdGVPYmogPSBwRGljdC0+R2V0T2JqZWN0Rm9yKCJSb3RhdGUiKS0+R2V0RGlyZWN0KCk7Ci0gICAgICByZXR1cm4gcFJvdGF0ZU9iaiA/IHBSb3RhdGVPYmotPkdldEludGVnZXIoKSAvIDkwIDogMDsKLSAgICB9Ci0gICAgaWYgKCFwRGljdC0+S2V5RXhpc3QoIlBhcmVudCIpKQotICAgICAgYnJlYWs7Ci0KLSAgICBwRGljdCA9IFRvRGljdGlvbmFyeShwRGljdC0+R2V0T2JqZWN0Rm9yKCJQYXJlbnQiKS0+R2V0RGlyZWN0KCkpOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfSW5zZXJ0T2JqZWN0KEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFT0JKRUNUIHBhZ2Vfb2JqKSB7Ci0gIENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogPSByZWludGVycHJldF9jYXN0PENQREZfUGFnZU9iamVjdCo+KHBhZ2Vfb2JqKTsKLSAgaWYgKCFwUGFnZU9iaikKLSAgICByZXR1cm47Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENQREZfUGFnZU9iamVjdD4gcFBhZ2VPYmpIb2xkZXIocFBhZ2VPYmopOwotICBDUERGX1BhZ2UqIHBQYWdlID0gQ1BERlBhZ2VGcm9tRlBERlBhZ2UocGFnZSk7Ci0gIGlmICghSXNQYWdlT2JqZWN0KHBQYWdlKSkKLSAgICByZXR1cm47Ci0KLSAgcFBhZ2UtPkdldFBhZ2VPYmplY3RMaXN0KCktPnB1c2hfYmFjayhzdGQ6Om1vdmUocFBhZ2VPYmpIb2xkZXIpKTsKK3ZvaWQgQ2FsY0JvdW5kaW5nQm94KENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmopIHsKICAgc3dpdGNoIChwUGFnZU9iai0+R2V0VHlwZSgpKSB7CiAgICAgY2FzZSBDUERGX1BhZ2VPYmplY3Q6OlRFWFQ6IHsKICAgICAgIGJyZWFrOwpAQCAtMTg2LDM4ICs4NywxMzUgQEAKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBkZWZhdWx0OiB7Ci0gICAgICBBU1NFUlQoZmFsc2UpOworICAgICAgTk9UUkVBQ0hFRCgpOwogICAgICAgYnJlYWs7CiAgICAgfQogICB9CiB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGUGFnZV9Db3VudE9iamVjdChGUERGX1BBR0UgcGFnZSkgeworfSAgLy8gbmFtZXNwYWNlCisKK0ZQREZfRVhQT1JUIEZQREZfRE9DVU1FTlQgRlBERl9DQUxMQ09OViBGUERGX0NyZWF0ZU5ld0RvY3VtZW50KCkgeworICBhdXRvIHBEb2MgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9Eb2N1bWVudD4obnVsbHB0cik7CisgIHBEb2MtPkNyZWF0ZU5ld0RvYygpOworCisgIHRpbWVfdCBjdXJyZW50VGltZTsKKyAgQnl0ZVN0cmluZyBEYXRlU3RyOworICBpZiAoRlNES19Jc1NhbmRCb3hQb2xpY3lFbmFibGVkKEZQREZfUE9MSUNZX01BQ0hJTkVUSU1FX0FDQ0VTUykpIHsKKyAgICBpZiAodGltZSgmY3VycmVudFRpbWUpICE9IC0xKSB7CisgICAgICB0bSogcFRNID0gbG9jYWx0aW1lKCZjdXJyZW50VGltZSk7CisgICAgICBpZiAocFRNKSB7CisgICAgICAgIERhdGVTdHIgPSBCeXRlU3RyaW5nOjpGb3JtYXQoCisgICAgICAgICAgICAiRDolMDRkJTAyZCUwMmQlMDJkJTAyZCUwMmQiLCBwVE0tPnRtX3llYXIgKyAxOTAwLCBwVE0tPnRtX21vbiArIDEsCisgICAgICAgICAgICBwVE0tPnRtX21kYXksIHBUTS0+dG1faG91ciwgcFRNLT50bV9taW4sIHBUTS0+dG1fc2VjKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBDUERGX0RpY3Rpb25hcnkqIHBJbmZvRGljdCA9IHBEb2MtPkdldEluZm8oKTsKKyAgaWYgKHBJbmZvRGljdCkgeworICAgIGlmIChGU0RLX0lzU2FuZEJveFBvbGljeUVuYWJsZWQoRlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTKSkKKyAgICAgIHBJbmZvRGljdC0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigiQ3JlYXRpb25EYXRlIiwgRGF0ZVN0ciwgZmFsc2UpOworICAgIHBJbmZvRGljdC0+U2V0TmV3Rm9yPENQREZfU3RyaW5nPigiQ3JlYXRvciIsIEwiUERGaXVtIik7CisgIH0KKworICAvLyBDYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHBEb2MuCisgIHJldHVybiBGUERGRG9jdW1lbnRGcm9tQ1BERkRvY3VtZW50KHBEb2MucmVsZWFzZSgpKTsKK30KKworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZQYWdlX0RlbGV0ZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFnZV9pbmRleCkgeworICBpZiAoVW5kZXJseWluZ0RvY3VtZW50VHlwZSogcERvYyA9IFVuZGVybHlpbmdGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KSkKKyAgICBwRG9jLT5EZWxldGVQYWdlKHBhZ2VfaW5kZXgpOworfQorCitGUERGX0VYUE9SVCBGUERGX1BBR0UgRlBERl9DQUxMQ09OViBGUERGUGFnZV9OZXcoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFnZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGhlaWdodCkgeworICBDUERGX0RvY3VtZW50KiBwRG9jID0gQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChkb2N1bWVudCk7CisgIGlmICghcERvYykKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBwYWdlX2luZGV4ID0gcGRmaXVtOjpjbGFtcChwYWdlX2luZGV4LCAwLCBwRG9jLT5HZXRQYWdlQ291bnQoKSk7CisgIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcERvYy0+Q3JlYXRlTmV3UGFnZShwYWdlX2luZGV4KTsKKyAgaWYgKCFwUGFnZURpY3QpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQ1BERl9BcnJheSogcE1lZGlhQm94QXJyYXkgPSBwUGFnZURpY3QtPlNldE5ld0ZvcjxDUERGX0FycmF5PigiTWVkaWFCb3giKTsKKyAgcE1lZGlhQm94QXJyYXktPkFkZE5ldzxDUERGX051bWJlcj4oMCk7CisgIHBNZWRpYUJveEFycmF5LT5BZGROZXc8Q1BERl9OdW1iZXI+KDApOworICBwTWVkaWFCb3hBcnJheS0+QWRkTmV3PENQREZfTnVtYmVyPihzdGF0aWNfY2FzdDxmbG9hdD4od2lkdGgpKTsKKyAgcE1lZGlhQm94QXJyYXktPkFkZE5ldzxDUERGX051bWJlcj4oc3RhdGljX2Nhc3Q8ZmxvYXQ+KGhlaWdodCkpOworICBwUGFnZURpY3QtPlNldE5ld0ZvcjxDUERGX051bWJlcj4oIlJvdGF0ZSIsIDApOworICBwUGFnZURpY3QtPlNldE5ld0ZvcjxDUERGX0RpY3Rpb25hcnk+KCJSZXNvdXJjZXMiKTsKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIGF1dG8gcFhGQVBhZ2UgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERlhGQV9QYWdlPigKKyAgICAgIHN0YXRpY19jYXN0PENQREZYRkFfQ29udGV4dCo+KGRvY3VtZW50KSwgcGFnZV9pbmRleCk7CisgIHBYRkFQYWdlLT5Mb2FkUERGUGFnZShwUGFnZURpY3QpOworICByZXR1cm4gcFhGQVBhZ2UuTGVhaygpOyAgLy8gQ2FsbGVyIHRha2VzIG93bmVyc2hpcC4KKyNlbHNlICAgLy8gUERGX0VOQUJMRV9YRkEKKyAgYXV0byBwUGFnZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1BhZ2U+KHBEb2MsIHBQYWdlRGljdCwgdHJ1ZSk7CisgIHBQYWdlLT5QYXJzZUNvbnRlbnQoKTsKKyAgcmV0dXJuIHBQYWdlLnJlbGVhc2UoKTsgIC8vIENhbGxlciB0YWtlcyBvd25lcnNoaXAuCisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCit9CisKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZQYWdlX0dldFJvdGF0aW9uKEZQREZfUEFHRSBwYWdlKSB7CisgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKKyAgcmV0dXJuIElzUGFnZU9iamVjdChwUGFnZSkgPyBwUGFnZS0+R2V0UGFnZVJvdGF0aW9uKCkgOiAtMTsKK30KKworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZQYWdlX0luc2VydE9iamVjdChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFT0JKRUNUIHBhZ2Vfb2JqKSB7CisgIENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogPSBDUERGUGFnZU9iamVjdEZyb21GUERGUGFnZU9iamVjdChwYWdlX29iaik7CisgIGlmICghcFBhZ2VPYmopCisgICAgcmV0dXJuOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1BhZ2VPYmplY3Q+IHBQYWdlT2JqSG9sZGVyKHBQYWdlT2JqKTsKKyAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOworICBpZiAoIUlzUGFnZU9iamVjdChwUGFnZSkpCisgICAgcmV0dXJuOworICBwUGFnZU9iai0+U2V0RGlydHkodHJ1ZSk7CisgIHBQYWdlLT5HZXRQYWdlT2JqZWN0TGlzdCgpLT5wdXNoX2JhY2soc3RkOjptb3ZlKHBQYWdlT2JqSG9sZGVyKSk7CisgIENhbGNCb3VuZGluZ0JveChwUGFnZU9iaik7Cit9CisKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZQYWdlX0NvdW50T2JqZWN0KEZQREZfUEFHRSBwYWdlKSB7CisgIHJldHVybiBGUERGUGFnZV9Db3VudE9iamVjdHMocGFnZSk7Cit9CisKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZQYWdlX0NvdW50T2JqZWN0cyhGUERGX1BBR0UgcGFnZSkgewogICBDUERGX1BhZ2UqIHBQYWdlID0gQ1BERlBhZ2VGcm9tRlBERlBhZ2UocGFnZSk7CiAgIGlmICghSXNQYWdlT2JqZWN0KHBQYWdlKSkKICAgICByZXR1cm4gLTE7CiAgIHJldHVybiBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludD4oKnBQYWdlLT5HZXRQYWdlT2JqZWN0TGlzdCgpKTsKIH0KIAotRExMRVhQT1JUIEZQREZfUEFHRU9CSkVDVCBTVERDQUxMIEZQREZQYWdlX0dldE9iamVjdChGUERGX1BBR0UgcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSB7CitGUERGX0VYUE9SVCBGUERGX1BBR0VPQkpFQ1QgRlBERl9DQUxMQ09OViBGUERGUGFnZV9HZXRPYmplY3QoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSB7CiAgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKICAgaWYgKCFJc1BhZ2VPYmplY3QocFBhZ2UpKQogICAgIHJldHVybiBudWxscHRyOwogICByZXR1cm4gcFBhZ2UtPkdldFBhZ2VPYmplY3RMaXN0KCktPkdldFBhZ2VPYmplY3RCeUluZGV4KGluZGV4KTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX0hhc1RyYW5zcGFyZW5jeShGUERGX1BBR0UgcGFnZSkgeworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRlBERlBhZ2VfSGFzVHJhbnNwYXJlbmN5KEZQREZfUEFHRSBwYWdlKSB7CiAgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKICAgcmV0dXJuIHBQYWdlICYmIHBQYWdlLT5CYWNrZ3JvdW5kQWxwaGFOZWVkZWQoKTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMCitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRlBERlBhZ2VPYmpfRGVzdHJveShGUERGX1BBR0VPQkpFQ1QgcGFnZV9vYmopIHsKKyAgZGVsZXRlIENQREZQYWdlT2JqZWN0RnJvbUZQREZQYWdlT2JqZWN0KHBhZ2Vfb2JqKTsKK30KKworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKIEZQREZQYWdlT2JqX0hhc1RyYW5zcGFyZW5jeShGUERGX1BBR0VPQkpFQ1QgcGFnZU9iamVjdCkgewogICBpZiAoIXBhZ2VPYmplY3QpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIENQREZfUGFnZU9iamVjdCogcFBhZ2VPYmogPSByZWludGVycHJldF9jYXN0PENQREZfUGFnZU9iamVjdCo+KHBhZ2VPYmplY3QpOworICBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqID0gQ1BERlBhZ2VPYmplY3RGcm9tRlBERlBhZ2VPYmplY3QocGFnZU9iamVjdCk7CiAgIGludCBibGVuZF90eXBlID0gcFBhZ2VPYmotPm1fR2VuZXJhbFN0YXRlLkdldEJsZW5kVHlwZSgpOwogICBpZiAoYmxlbmRfdHlwZSAhPSBGWERJQl9CTEVORF9OT1JNQUwpCiAgICAgcmV0dXJuIHRydWU7CkBAIC0yMzcsNyArMjM1LDcgQEAKICAgaWYgKHBQYWdlT2JqLT5Jc0Zvcm0oKSkgewogICAgIGNvbnN0IENQREZfRm9ybSogcEZvcm0gPSBwUGFnZU9iai0+QXNGb3JtKCktPmZvcm0oKTsKICAgICBpZiAocEZvcm0pIHsKLSAgICAgIGludCB0cmFucyA9IHBGb3JtLT5tX1RyYW5zcGFyZW5jeTsKKyAgICAgIGludCB0cmFucyA9IHBGb3JtLT5tX2lUcmFuc3BhcmVuY3k7CiAgICAgICBpZiAoKHRyYW5zICYgUERGVFJBTlNfSVNPTEFURUQpIHx8ICh0cmFucyAmIFBERlRSQU5TX0dST1VQKSkKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtMjQ2LDcgKzI0NCwxNSBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQoRlBERl9QQUdFIHBhZ2UpIHsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZQYWdlT2JqX0dldFR5cGUoRlBERl9QQUdFT0JKRUNUIHBhZ2VPYmplY3QpIHsKKyAgaWYgKCFwYWdlT2JqZWN0KQorICAgIHJldHVybiBGUERGX1BBR0VPQkpfVU5LTk9XTjsKKworICBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqID0gQ1BERlBhZ2VPYmplY3RGcm9tRlBERlBhZ2VPYmplY3QocGFnZU9iamVjdCk7CisgIHJldHVybiBwUGFnZU9iai0+R2V0VHlwZSgpOworfQorCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQoRlBERl9QQUdFIHBhZ2UpIHsKICAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOwogICBpZiAoIUlzUGFnZU9iamVjdChwUGFnZSkpCiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjU2LDI5ICsyNjIsNDAgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VPYmpfVHJhbnNmb3JtKEZQREZfUEFHRU9CSkVDVCBwYWdlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZikgewotICBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqID0gcmVpbnRlcnByZXRfY2FzdDxDUERGX1BhZ2VPYmplY3QqPihwYWdlX29iamVjdCk7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYKK0ZQREZQYWdlT2JqX1RyYW5zZm9ybShGUERGX1BBR0VPQkpFQ1QgcGFnZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGEsCisgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGIsCisgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGMsCisgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGQsCisgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGUsCisgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGYpIHsKKyAgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiA9IENQREZQYWdlT2JqZWN0RnJvbUZQREZQYWdlT2JqZWN0KHBhZ2Vfb2JqZWN0KTsKICAgaWYgKCFwUGFnZU9iaikKICAgICByZXR1cm47CiAKLSAgQ0ZYX01hdHJpeCBtYXRyaXgoKEZYX0ZMT0FUKWEsIChGWF9GTE9BVCliLCAoRlhfRkxPQVQpYywgKEZYX0ZMT0FUKWQsCi0gICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCllLCAoRlhfRkxPQVQpZik7CisgIENGWF9NYXRyaXggbWF0cml4KChmbG9hdClhLCAoZmxvYXQpYiwgKGZsb2F0KWMsIChmbG9hdClkLCAoZmxvYXQpZSwgKGZsb2F0KWYpOwogICBwUGFnZU9iai0+VHJhbnNmb3JtKG1hdHJpeCk7CiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfVHJhbnNmb3JtQW5ub3RzKEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmKSB7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYKK0ZQREZQYWdlT2JqX1NldEJsZW5kTW9kZShGUERGX1BBR0VPQkpFQ1QgcGFnZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIGJsZW5kX21vZGUpIHsKKyAgQ1BERl9QYWdlT2JqZWN0KiBwUGFnZU9iaiA9IENQREZQYWdlT2JqZWN0RnJvbUZQREZQYWdlT2JqZWN0KHBhZ2Vfb2JqZWN0KTsKKyAgaWYgKCFwUGFnZU9iaikKKyAgICByZXR1cm47CisKKyAgcFBhZ2VPYmotPm1fR2VuZXJhbFN0YXRlLlNldEJsZW5kTW9kZShibGVuZF9tb2RlKTsKKyAgcFBhZ2VPYmotPlNldERpcnR5KHRydWUpOworfQorCitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRlBERlBhZ2VfVHJhbnNmb3JtQW5ub3RzKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmKSB7CiAgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKICAgaWYgKCFwUGFnZSkKICAgICByZXR1cm47CkBAIC0yODYsMzAgKzMwMyw2NyBAQAogICBDUERGX0Fubm90TGlzdCBBbm5vdExpc3QocFBhZ2UpOwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFubm90TGlzdC5Db3VudCgpOyArK2kpIHsKICAgICBDUERGX0Fubm90KiBwQW5ub3QgPSBBbm5vdExpc3QuR2V0QXQoaSk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gcEFubm90LT5HZXRSZWN0KCk7ICAvLyB0cmFuc2Zvcm1Bbm5vdHMgUmVjdGFuZ2xlCi0gICAgQ0ZYX01hdHJpeCBtYXRyaXgoKEZYX0ZMT0FUKWEsIChGWF9GTE9BVCliLCAoRlhfRkxPQVQpYywgKEZYX0ZMT0FUKWQsCi0gICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWUsIChGWF9GTE9BVClmKTsKLSAgICBtYXRyaXguVHJhbnNmb3JtUmVjdChyZWN0KTsKKyAgICBDRlhfTWF0cml4IG1hdHJpeCgoZmxvYXQpYSwgKGZsb2F0KWIsIChmbG9hdCljLCAoZmxvYXQpZCwgKGZsb2F0KWUsCisgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KWYpOworICAgIENGWF9GbG9hdFJlY3QgcmVjdCA9IG1hdHJpeC5UcmFuc2Zvcm1SZWN0KHBBbm5vdC0+R2V0UmVjdCgpKTsKIAotICAgIENQREZfQXJyYXkqIHBSZWN0QXJyYXkgPSBwQW5ub3QtPkdldEFubm90RGljdCgpLT5HZXRBcnJheUZvcigiUmVjdCIpOwotICAgIGlmICghcFJlY3RBcnJheSkKLSAgICAgIHBSZWN0QXJyYXkgPSBwQW5ub3QtPkdldEFubm90RGljdCgpLT5TZXROZXdGb3I8Q1BERl9BcnJheT4oIlJlY3QiKTsKKyAgICBDUERGX0RpY3Rpb25hcnkqIHBBbm5vdERpY3QgPSBwQW5ub3QtPkdldEFubm90RGljdCgpOworICAgIENQREZfQXJyYXkqIHBSZWN0QXJyYXkgPSBwQW5ub3REaWN0LT5HZXRBcnJheUZvcigiUmVjdCIpOworICAgIGlmIChwUmVjdEFycmF5KQorICAgICAgcFJlY3RBcnJheS0+Q2xlYXIoKTsKKyAgICBlbHNlCisgICAgICBwUmVjdEFycmF5ID0gcEFubm90RGljdC0+U2V0TmV3Rm9yPENQREZfQXJyYXk+KCJSZWN0Iik7CiAKLSAgICBwUmVjdEFycmF5LT5TZXROZXdBdDxDUERGX051bWJlcj4oMCwgcmVjdC5sZWZ0KTsKLSAgICBwUmVjdEFycmF5LT5TZXROZXdBdDxDUERGX051bWJlcj4oMSwgcmVjdC5ib3R0b20pOwotICAgIHBSZWN0QXJyYXktPlNldE5ld0F0PENQREZfTnVtYmVyPigyLCByZWN0LnJpZ2h0KTsKLSAgICBwUmVjdEFycmF5LT5TZXROZXdBdDxDUERGX051bWJlcj4oMywgcmVjdC50b3ApOworICAgIHBSZWN0QXJyYXktPkFkZE5ldzxDUERGX051bWJlcj4ocmVjdC5sZWZ0KTsKKyAgICBwUmVjdEFycmF5LT5BZGROZXc8Q1BERl9OdW1iZXI+KHJlY3QuYm90dG9tKTsKKyAgICBwUmVjdEFycmF5LT5BZGROZXc8Q1BERl9OdW1iZXI+KHJlY3QucmlnaHQpOworICAgIHBSZWN0QXJyYXktPkFkZE5ldzxDUERGX051bWJlcj4ocmVjdC50b3ApOwogCiAgICAgLy8gVE9ETyh1bmtub3duKTogVHJhbnNmb3JtIEFQJ3MgcmVjdGFuZ2xlCiAgIH0KIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9TZXRSb3RhdGlvbihGUERGX1BBR0UgcGFnZSwgaW50IHJvdGF0ZSkgeworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZQYWdlX1NldFJvdGF0aW9uKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUpIHsKICAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOwogICBpZiAoIUlzUGFnZU9iamVjdChwUGFnZSkpCiAgICAgcmV0dXJuOwogCi0gIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBwUGFnZS0+bV9wRm9ybURpY3Q7CiAgIHJvdGF0ZSAlPSA0OwotICBwRGljdC0+U2V0TmV3Rm9yPENQREZfTnVtYmVyPigiUm90YXRlIiwgcm90YXRlICogOTApOworICBwUGFnZS0+bV9wRm9ybURpY3QtPlNldE5ld0ZvcjxDUERGX051bWJlcj4oIlJvdGF0ZSIsIHJvdGF0ZSAqIDkwKTsKK30KKworRlBERl9CT09MIEZQREZQYWdlT2JqX1NldEZpbGxDb2xvcihGUERGX1BBR0VPQkpFQ1QgcGFnZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBBKSB7CisgIGlmICghcGFnZV9vYmplY3QgfHwgUiA+IDI1NSB8fCBHID4gMjU1IHx8IEIgPiAyNTUgfHwgQSA+IDI1NSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZmxvYXQgcmdiWzNdID0ge1IgLyAyNTUuZiwgRyAvIDI1NS5mLCBCIC8gMjU1LmZ9OworICBhdXRvKiBwUGFnZU9iaiA9IENQREZQYWdlT2JqZWN0RnJvbUZQREZQYWdlT2JqZWN0KHBhZ2Vfb2JqZWN0KTsKKyAgcFBhZ2VPYmotPm1fR2VuZXJhbFN0YXRlLlNldEZpbGxBbHBoYShBIC8gMjU1LmYpOworICBwUGFnZU9iai0+bV9Db2xvclN0YXRlLlNldEZpbGxDb2xvcigKKyAgICAgIENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VSR0IpLCByZ2IsIDMpOworICBwUGFnZU9iai0+U2V0RGlydHkodHJ1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgorRlBERlBhZ2VPYmpfR2V0Qm91bmRzKEZQREZfUEFHRU9CSkVDVCBwYWdlT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB0b3ApIHsKKyAgaWYgKCFwYWdlT2JqZWN0KQorICAgIHJldHVybiBmYWxzZTsKKworICBDUERGX1BhZ2VPYmplY3QqIHBQYWdlT2JqID0gQ1BERlBhZ2VPYmplY3RGcm9tRlBERlBhZ2VPYmplY3QocGFnZU9iamVjdCk7CisgIENGWF9GbG9hdFJlY3QgYmJveCA9IHBQYWdlT2JqLT5HZXRSZWN0KCk7CisgICpsZWZ0ID0gYmJveC5sZWZ0OworICAqYm90dG9tID0gYmJveC5ib3R0b207CisgICpyaWdodCA9IGJib3gucmlnaHQ7CisgICp0b3AgPSBiYm94LnRvcDsKKyAgcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZlZGl0cGF0aC5jcHAgYi9mcGRmc2RrL2ZwZGZlZGl0cGF0aC5jcHAKaW5kZXggMDc0ZjA4My4uYTI5MTk4NyAxMDA2NDQKLS0tIGEvZnBkZnNkay9mcGRmZWRpdHBhdGguY3BwCisrKyBiL2ZwZGZzZGsvZnBkZmVkaXRwYXRoLmNwcApAQCAtMiwxMjUgKzIsMjEwIEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCisjaW5jbHVkZSA8dmVjdG9yPgorCiAjaW5jbHVkZSAicHVibGljL2ZwZGZfZWRpdC5oIgogCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYXRoLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYXRob2JqZWN0LmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJmcGRmc2RrL2ZzZGtfZGVmaW5lLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogCi1ETExFWFBPUlQgRlBERl9QQUdFT0JKRUNUIFNURENBTEwgRlBERlBhZ2VPYmpfQ3JlYXRlTmV3UGF0aChmbG9hdCB4LCBmbG9hdCB5KSB7Ci0gIENQREZfUGF0aE9iamVjdCogcFBhdGhPYmogPSBuZXcgQ1BERl9QYXRoT2JqZWN0OworLy8gVGhlc2UgY2hlY2tzIGFyZSBoZXJlIGJlY2F1c2UgY29yZS8gYW5kIHB1YmxpYy8gY2Fubm90IGRlcGVuZCBvbiBlYWNoIG90aGVyLgorc3RhdGljX2Fzc2VydChDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBCdXR0ID09IEZQREZfTElORUNBUF9CVVRULAorICAgICAgICAgICAgICAiQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwQnV0dCB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBSb3VuZCA9PSBGUERGX0xJTkVDQVBfUk9VTkQsCisgICAgICAgICAgICAgICJDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBSb3VuZCB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBTcXVhcmUgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfTElORUNBUF9QUk9KRUNUSU5HX1NRVUFSRSwKKyAgICAgICAgICAgICAgIkNGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFNxdWFyZSB2YWx1ZSBtaXNtYXRjaCIpOworCitzdGF0aWNfYXNzZXJ0KENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW5NaXRlciA9PSBGUERGX0xJTkVKT0lOX01JVEVSLAorICAgICAgICAgICAgICAiQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbk1pdGVyIHZhbHVlIG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW5Sb3VuZCA9PSBGUERGX0xJTkVKT0lOX1JPVU5ELAorICAgICAgICAgICAgICAiQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pblJvdW5kIHZhbHVlIG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW5CZXZlbCA9PSBGUERGX0xJTkVKT0lOX0JFVkVMLAorICAgICAgICAgICAgICAiQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbkJldmVsIHZhbHVlIG1pc21hdGNoIik7CisKK3N0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihGWFBUX1RZUEU6OkxpbmVUbykgPT0gRlBERl9TRUdNRU5UX0xJTkVUTywKKyAgICAgICAgICAgICAgIkZYUFRfVFlQRTo6TGluZVRvIHZhbHVlIG1pc21hdGNoIik7CitzdGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PGludD4oRlhQVF9UWVBFOjpCZXppZXJUbykgPT0gRlBERl9TRUdNRU5UX0JFWklFUlRPLAorICAgICAgICAgICAgICAiRlhQVF9UWVBFOjpCZXppZXJUbyB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KEZYUFRfVFlQRTo6TW92ZVRvKSA9PSBGUERGX1NFR01FTlRfTU9WRVRPLAorICAgICAgICAgICAgICAiRlhQVF9UWVBFOjpNb3ZlVG8gdmFsdWUgbWlzbWF0Y2giKTsKKworRlBERl9FWFBPUlQgRlBERl9QQUdFT0JKRUNUIEZQREZfQ0FMTENPTlYgRlBERlBhZ2VPYmpfQ3JlYXRlTmV3UGF0aChmbG9hdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5KSB7CisgIGF1dG8gcFBhdGhPYmogPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9QYXRoT2JqZWN0PigpOwogICBwUGF0aE9iai0+bV9QYXRoLkFwcGVuZFBvaW50KENGWF9Qb2ludEYoeCwgeSksIEZYUFRfVFlQRTo6TW92ZVRvLCBmYWxzZSk7CiAgIHBQYXRoT2JqLT5EZWZhdWx0U3RhdGVzKCk7Ci0gIHJldHVybiBwUGF0aE9iajsKKyAgcmV0dXJuIHBQYXRoT2JqLnJlbGVhc2UoKTsgIC8vIENhbGxlciB0YWtlcyBvd25lcnNoaXAuCiB9CiAKLURMTEVYUE9SVCBGUERGX1BBR0VPQkpFQ1QgU1REQ0FMTCBGUERGUGFnZU9ial9DcmVhdGVOZXdSZWN0KGZsb2F0IHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGgpIHsKLSAgQ1BERl9QYXRoT2JqZWN0KiBwUGF0aE9iaiA9IG5ldyBDUERGX1BhdGhPYmplY3Q7CitGUERGX0VYUE9SVCBGUERGX1BBR0VPQkpFQ1QgRlBERl9DQUxMQ09OViBGUERGUGFnZU9ial9DcmVhdGVOZXdSZWN0KGZsb2F0IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGgpIHsKKyAgYXV0byBwUGF0aE9iaiA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1BhdGhPYmplY3Q+KCk7CiAgIHBQYXRoT2JqLT5tX1BhdGguQXBwZW5kUmVjdCh4LCB5LCB4ICsgdywgeSArIGgpOwogICBwUGF0aE9iai0+RGVmYXVsdFN0YXRlcygpOwotICByZXR1cm4gcFBhdGhPYmo7CisgIHJldHVybiBwUGF0aE9iai5yZWxlYXNlKCk7ICAvLyBDYWxsZXIgdGFrZXMgb3duZXJzaGlwLgogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIEZQREZQYXRoX1NldFN0cm9rZUNvbG9yKEZQREZfUEFHRU9CSkVDVCBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IEcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgQSkgewotICBpZiAoIXBhdGggfHwgUiA+IDI1NSB8fCBHID4gMjU1IHx8IEIgPiAyNTUgfHwgQSA+IDI1NSkKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCitGUERGUGF0aF9TZXRTdHJva2VDb2xvcihGUERGX1BBR0VPQkpFQ1QgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBSLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IEcsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBBKSB7CisgIGF1dG8qIHBQYXRoT2JqID0gQ1BERlBhdGhPYmplY3RGcm9tRlBERlBhZ2VPYmplY3QocGF0aCk7CisgIGlmICghcFBhdGhPYmogfHwgUiA+IDI1NSB8fCBHID4gMjU1IHx8IEIgPiAyNTUgfHwgQSA+IDI1NSkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgYXV0byBwUGF0aE9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q1BERl9QYXRoT2JqZWN0Kj4ocGF0aCk7CisgIGZsb2F0IHJnYlszXSA9IHtSIC8gMjU1LmYsIEcgLyAyNTUuZiwgQiAvIDI1NS5mfTsKICAgcFBhdGhPYmotPm1fR2VuZXJhbFN0YXRlLlNldFN0cm9rZUFscGhhKEEgLyAyNTUuZik7Ci0gIEZYX0ZMT0FUIHJnYlszXSA9IHtSIC8gMjU1LmYsIEcgLyAyNTUuZiwgQiAvIDI1NS5mfTsKICAgcFBhdGhPYmotPm1fQ29sb3JTdGF0ZS5TZXRTdHJva2VDb2xvcigKICAgICAgIENQREZfQ29sb3JTcGFjZTo6R2V0U3RvY2tDUyhQREZDU19ERVZJQ0VSR0IpLCByZ2IsIDMpOworICBwUGF0aE9iai0+U2V0RGlydHkodHJ1ZSk7CiAgIHJldHVybiB0cnVlOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIEZQREZQYXRoX1NldFN0cm9rZVdpZHRoKEZQREZfUEFHRU9CSkVDVCBwYXRoLCBmbG9hdCB3aWR0aCkgewotICBpZiAoIXBhdGggfHwgd2lkdGggPCAwLjBmKQorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZQYXRoX0dldFN0cm9rZUNvbG9yKEZQREZfUEFHRU9CSkVDVCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50KiBSLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50KiBHLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50KiBCLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50KiBBKSB7CisgIGF1dG8qIHBQYXRoT2JqID0gQ1BERlBhdGhPYmplY3RGcm9tRlBERlBhZ2VPYmplY3QocGF0aCk7CisgIGlmICghcFBhdGhPYmogfHwgIVIgfHwgIUcgfHwgIUIgfHwgIUEpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIGF1dG8gcFBhdGhPYmogPSByZWludGVycHJldF9jYXN0PENQREZfUGF0aE9iamVjdCo+KHBhdGgpOworICB1aW50MzJfdCBzdHJva2VSR0IgPSBwUGF0aE9iai0+bV9Db2xvclN0YXRlLkdldFN0cm9rZVJHQigpOworICAqUiA9IEZYU1lTX0dldFJWYWx1ZShzdHJva2VSR0IpOworICAqRyA9IEZYU1lTX0dldEdWYWx1ZShzdHJva2VSR0IpOworICAqQiA9IEZYU1lTX0dldEJWYWx1ZShzdHJva2VSR0IpOworICAqQSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oCisgICAgICAocFBhdGhPYmotPm1fR2VuZXJhbFN0YXRlLkdldFN0cm9rZUFscGhhKCkgKiAyNTUuZikgKyAwLjVmKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCitGUERGUGF0aF9TZXRTdHJva2VXaWR0aChGUERGX1BBR0VPQkpFQ1QgcGF0aCwgZmxvYXQgd2lkdGgpIHsKKyAgYXV0byogcFBhdGhPYmogPSBDUERGUGF0aE9iamVjdEZyb21GUERGUGFnZU9iamVjdChwYXRoKTsKKyAgaWYgKCFwUGF0aE9iaiB8fCB3aWR0aCA8IDAuMGYpCisgICAgcmV0dXJuIGZhbHNlOworCiAgIHBQYXRoT2JqLT5tX0dyYXBoU3RhdGUuU2V0TGluZVdpZHRoKHdpZHRoKTsKKyAgcFBhdGhPYmotPlNldERpcnR5KHRydWUpOwogICByZXR1cm4gdHJ1ZTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBGUERGUGF0aF9TZXRGaWxsQ29sb3IoRlBERl9QQUdFT0JKRUNUIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgQSkgewotICBpZiAoIXBhdGggfHwgUiA+IDI1NSB8fCBHID4gMjU1IHx8IEIgPiAyNTUgfHwgQSA+IDI1NSkKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZQYXRoX1NldEZpbGxDb2xvcihGUERGX1BBR0VPQkpFQ1QgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgQSkgeworICByZXR1cm4gRlBERlBhZ2VPYmpfU2V0RmlsbENvbG9yKHBhdGgsIFIsIEcsIEIsIEEpOworfQorCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGUGF0aF9HZXRGaWxsQ29sb3IoRlBERl9QQUdFT0JKRUNUIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50KiBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCogRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQqIEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50KiBBKSB7CisgIGF1dG8qIHBQYXRoT2JqID0gQ1BERlBhdGhPYmplY3RGcm9tRlBERlBhZ2VPYmplY3QocGF0aCk7CisgIGlmICghcFBhdGhPYmogfHwgIVIgfHwgIUcgfHwgIUIgfHwgIUEpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIGF1dG8gcFBhdGhPYmogPSByZWludGVycHJldF9jYXN0PENQREZfUGF0aE9iamVjdCo+KHBhdGgpOwotICBwUGF0aE9iai0+bV9HZW5lcmFsU3RhdGUuU2V0RmlsbEFscGhhKEEgLyAyNTUuZik7Ci0gIEZYX0ZMT0FUIHJnYlszXSA9IHtSIC8gMjU1LmYsIEcgLyAyNTUuZiwgQiAvIDI1NS5mfTsKLSAgcFBhdGhPYmotPm1fQ29sb3JTdGF0ZS5TZXRGaWxsQ29sb3IoCi0gICAgICBDUERGX0NvbG9yU3BhY2U6OkdldFN0b2NrQ1MoUERGQ1NfREVWSUNFUkdCKSwgcmdiLCAzKTsKKyAgdWludDMyX3QgZmlsbFJHQiA9IHBQYXRoT2JqLT5tX0NvbG9yU3RhdGUuR2V0RmlsbFJHQigpOworICAqUiA9IEZYU1lTX0dldFJWYWx1ZShmaWxsUkdCKTsKKyAgKkcgPSBGWFNZU19HZXRHVmFsdWUoZmlsbFJHQik7CisgICpCID0gRlhTWVNfR2V0QlZhbHVlKGZpbGxSR0IpOworICAqQSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGludD4oCisgICAgICAocFBhdGhPYmotPm1fR2VuZXJhbFN0YXRlLkdldEZpbGxBbHBoYSgpICogMjU1LmYpICsgMC41Zik7CiAgIHJldHVybiB0cnVlOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIEZQREZQYXRoX01vdmVUbyhGUERGX1BBR0VPQkpFQ1QgcGF0aCwgZmxvYXQgeCwgZmxvYXQgeSkgewotICBpZiAoIXBhdGgpCitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OViBGUERGUGF0aF9Db3VudFNlZ21lbnRzKEZQREZfUEFHRU9CSkVDVCBwYXRoKSB7CisgIGF1dG8qIHBQYXRoT2JqID0gQ1BERlBhdGhPYmplY3RGcm9tRlBERlBhZ2VPYmplY3QocGF0aCk7CisgIGlmICghcFBhdGhPYmopCisgICAgcmV0dXJuIC0xOworICByZXR1cm4gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQ+KHBQYXRoT2JqLT5tX1BhdGguR2V0UG9pbnRzKCkpOworfQorCitGUERGX0VYUE9SVCBGUERGX1BBVEhTRUdNRU5UIEZQREZfQ0FMTENPTlYKK0ZQREZQYXRoX0dldFBhdGhTZWdtZW50KEZQREZfUEFHRU9CSkVDVCBwYXRoLCBpbnQgaW5kZXgpIHsKKyAgYXV0byogcFBhdGhPYmogPSBDUERGUGF0aE9iamVjdEZyb21GUERGUGFnZU9iamVjdChwYXRoKTsKKyAgaWYgKCFwUGF0aE9iaikKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBjb25zdCBzdGQ6OnZlY3RvcjxGWF9QQVRIUE9JTlQ+JiBwb2ludHMgPSBwUGF0aE9iai0+bV9QYXRoLkdldFBvaW50cygpOworICByZXR1cm4gcGRmaXVtOjpJbmRleEluQm91bmRzKHBvaW50cywgaW5kZXgpID8gJnBvaW50c1tpbmRleF0gOiBudWxscHRyOworfQorCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGUGF0aF9Nb3ZlVG8oRlBERl9QQUdFT0JKRUNUIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5KSB7CisgIGF1dG8qIHBQYXRoT2JqID0gQ1BERlBhdGhPYmplY3RGcm9tRlBERlBhZ2VPYmplY3QocGF0aCk7CisgIGlmICghcFBhdGhPYmopCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIGF1dG8gcFBhdGhPYmogPSByZWludGVycHJldF9jYXN0PENQREZfUGF0aE9iamVjdCo+KHBhdGgpOwogICBwUGF0aE9iai0+bV9QYXRoLkFwcGVuZFBvaW50KENGWF9Qb2ludEYoeCwgeSksIEZYUFRfVFlQRTo6TW92ZVRvLCBmYWxzZSk7CisgIHBQYXRoT2JqLT5TZXREaXJ0eSh0cnVlKTsKICAgcmV0dXJuIHRydWU7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgRlBERlBhdGhfTGluZVRvKEZQREZfUEFHRU9CSkVDVCBwYXRoLCBmbG9hdCB4LCBmbG9hdCB5KSB7Ci0gIGlmICghcGF0aCkKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZQYXRoX0xpbmVUbyhGUERGX1BBR0VPQkpFQ1QgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHkpIHsKKyAgYXV0byogcFBhdGhPYmogPSBDUERGUGF0aE9iamVjdEZyb21GUERGUGFnZU9iamVjdChwYXRoKTsKKyAgaWYgKCFwUGF0aE9iaikKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgYXV0byBwUGF0aE9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q1BERl9QYXRoT2JqZWN0Kj4ocGF0aCk7CiAgIHBQYXRoT2JqLT5tX1BhdGguQXBwZW5kUG9pbnQoQ0ZYX1BvaW50Rih4LCB5KSwgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKKyAgcFBhdGhPYmotPlNldERpcnR5KHRydWUpOwogICByZXR1cm4gdHJ1ZTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBGUERGUGF0aF9CZXppZXJUbyhGUERGX1BBR0VPQkpFQ1QgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5MykgewotICBpZiAoIXBhdGgpCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGUGF0aF9CZXppZXJUbyhGUERGX1BBR0VPQkpFQ1QgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5MykgeworICBhdXRvKiBwUGF0aE9iaiA9IENQREZQYXRoT2JqZWN0RnJvbUZQREZQYWdlT2JqZWN0KHBhdGgpOworICBpZiAoIXBQYXRoT2JqKQogICAgIHJldHVybiBmYWxzZTsKIAotICBhdXRvIHBQYXRoT2JqID0gcmVpbnRlcnByZXRfY2FzdDxDUERGX1BhdGhPYmplY3QqPihwYXRoKTsKICAgcFBhdGhPYmotPm1fUGF0aC5BcHBlbmRQb2ludChDRlhfUG9pbnRGKHgxLCB5MSksIEZYUFRfVFlQRTo6QmV6aWVyVG8sIGZhbHNlKTsKICAgcFBhdGhPYmotPm1fUGF0aC5BcHBlbmRQb2ludChDRlhfUG9pbnRGKHgyLCB5MiksIEZYUFRfVFlQRTo6QmV6aWVyVG8sIGZhbHNlKTsKICAgcFBhdGhPYmotPm1fUGF0aC5BcHBlbmRQb2ludChDRlhfUG9pbnRGKHgzLCB5MyksIEZYUFRfVFlQRTo6QmV6aWVyVG8sIGZhbHNlKTsKKyAgcFBhdGhPYmotPlNldERpcnR5KHRydWUpOwogICByZXR1cm4gdHJ1ZTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBGUERGUGF0aF9DbG9zZShGUERGX1BBR0VPQkpFQ1QgcGF0aCkgewotICBpZiAoIXBhdGgpCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGUGF0aF9DbG9zZShGUERGX1BBR0VPQkpFQ1QgcGF0aCkgeworICBhdXRvKiBwUGF0aE9iaiA9IENQREZQYXRoT2JqZWN0RnJvbUZQREZQYWdlT2JqZWN0KHBhdGgpOworICBpZiAoIXBQYXRoT2JqKQogICAgIHJldHVybiBmYWxzZTsKIAotICBhdXRvIHBQYXRoT2JqID0gcmVpbnRlcnByZXRfY2FzdDxDUERGX1BhdGhPYmplY3QqPihwYXRoKTsKICAgaWYgKHBQYXRoT2JqLT5tX1BhdGguR2V0UG9pbnRzKCkuZW1wdHkoKSkKICAgICByZXR1cm4gZmFsc2U7CiAKICAgcFBhdGhPYmotPm1fUGF0aC5DbG9zZVBhdGgoKTsKKyAgcFBhdGhPYmotPlNldERpcnR5KHRydWUpOwogICByZXR1cm4gdHJ1ZTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBGUERGUGF0aF9TZXREcmF3TW9kZShGUERGX1BBR0VPQkpFQ1QgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgc3Ryb2tlKSB7Ci0gIGlmICghcGF0aCkKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZQYXRoX1NldERyYXdNb2RlKEZQREZfUEFHRU9CSkVDVCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGxtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIHN0cm9rZSkgeworICBhdXRvKiBwUGF0aE9iaiA9IENQREZQYXRoT2JqZWN0RnJvbUZQREZQYWdlT2JqZWN0KHBhdGgpOworICBpZiAoIXBQYXRoT2JqKQogICAgIHJldHVybiBmYWxzZTsKIAotICBhdXRvIHBQYXRoT2JqID0gcmVpbnRlcnByZXRfY2FzdDxDUERGX1BhdGhPYmplY3QqPihwYXRoKTsKLQogICBpZiAoZmlsbG1vZGUgPT0gRlBERl9GSUxMTU9ERV9BTFRFUk5BVEUpCiAgICAgcFBhdGhPYmotPm1fRmlsbFR5cGUgPSBGWEZJTExfQUxURVJOQVRFOwogICBlbHNlIGlmIChmaWxsbW9kZSA9PSBGUERGX0ZJTExNT0RFX1dJTkRJTkcpCkBAIC0xMjgsNSArMjEzLDY1IEBACiAgIGVsc2UKICAgICBwUGF0aE9iai0+bV9GaWxsVHlwZSA9IDA7CiAgIHBQYXRoT2JqLT5tX2JTdHJva2UgPSBzdHJva2UgIT0gMDsKKyAgcFBhdGhPYmotPlNldERpcnR5KHRydWUpOwogICByZXR1cm4gdHJ1ZTsKIH0KKworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZQYXRoX1NldExpbmVKb2luKEZQREZfUEFHRU9CSkVDVCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lX2pvaW4pIHsKKyAgaWYgKCFwYXRoKQorICAgIHJldHVybjsKKyAgaWYgKGxpbmVfam9pbiA8CisgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luOjpMaW5lSm9pbk1pdGVyKSB8fAorICAgICAgbGluZV9qb2luID4KKyAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW46OkxpbmVKb2luQmV2ZWwpKSB7CisgICAgcmV0dXJuOworICB9CisgIGF1dG8qIHBQYXRoT2JqID0gQ1BERlBhZ2VPYmplY3RGcm9tRlBERlBhZ2VPYmplY3QocGF0aCk7CisgIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW4gbGluZUpvaW4gPQorICAgICAgc3RhdGljX2Nhc3Q8Q0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lSm9pbj4obGluZV9qb2luKTsKKyAgcFBhdGhPYmotPm1fR3JhcGhTdGF0ZS5TZXRMaW5lSm9pbihsaW5lSm9pbik7CisgIHBQYXRoT2JqLT5TZXREaXJ0eSh0cnVlKTsKK30KKworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZQYXRoX1NldExpbmVDYXAoRlBERl9QQUdFT0JKRUNUIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZV9jYXApIHsKKyAgaWYgKCFwYXRoKQorICAgIHJldHVybjsKKyAgaWYgKGxpbmVfY2FwIDwgc3RhdGljX2Nhc3Q8aW50PihDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXA6OkxpbmVDYXBCdXR0KSB8fAorICAgICAgbGluZV9jYXAgPiBzdGF0aWNfY2FzdDxpbnQ+KENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcDo6TGluZUNhcFNxdWFyZSkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgYXV0byogcFBhdGhPYmogPSBDUERGUGFnZU9iamVjdEZyb21GUERGUGFnZU9iamVjdChwYXRoKTsKKyAgQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwIGxpbmVDYXAgPQorICAgICAgc3RhdGljX2Nhc3Q8Q0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwPihsaW5lX2NhcCk7CisgIHBQYXRoT2JqLT5tX0dyYXBoU3RhdGUuU2V0TGluZUNhcChsaW5lQ2FwKTsKKyAgcFBhdGhPYmotPlNldERpcnR5KHRydWUpOworfQorCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgorRlBERlBhdGhTZWdtZW50X0dldFBvaW50KEZQREZfUEFUSFNFR01FTlQgc2VnbWVudCwgZmxvYXQqIHgsIGZsb2F0KiB5KSB7CisgIGF1dG8qIHBQYXRoUG9pbnQgPSBGWFBhdGhQb2ludEZyb21GUERGUGF0aFNlZ21lbnQoc2VnbWVudCk7CisgIGlmICghcFBhdGhQb2ludCB8fCAheCB8fCAheSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgKnggPSBwUGF0aFBvaW50LT5tX1BvaW50Lng7CisgICp5ID0gcFBhdGhQb2ludC0+bV9Qb2ludC55OworCisgIHJldHVybiB0cnVlOworfQorCitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OVgorRlBERlBhdGhTZWdtZW50X0dldFR5cGUoRlBERl9QQVRIU0VHTUVOVCBzZWdtZW50KSB7CisgIGF1dG8qIHBQYXRoUG9pbnQgPSBGWFBhdGhQb2ludEZyb21GUERGUGF0aFNlZ21lbnQoc2VnbWVudCk7CisKKyAgcmV0dXJuIHBQYXRoUG9pbnQgPyBzdGF0aWNfY2FzdDxpbnQ+KHBQYXRoUG9pbnQtPm1fVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgOiBGUERGX1NFR01FTlRfVU5LTk9XTjsKK30KKworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZQYXRoU2VnbWVudF9HZXRDbG9zZShGUERGX1BBVEhTRUdNRU5UIHNlZ21lbnQpIHsKKyAgYXV0byogcFBhdGhQb2ludCA9IEZYUGF0aFBvaW50RnJvbUZQREZQYXRoU2VnbWVudChzZWdtZW50KTsKKworICByZXR1cm4gcFBhdGhQb2ludCA/IHBQYXRoUG9pbnQtPm1fQ2xvc2VGaWd1cmUgOiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnBkZmVkaXRwYXRoX2VtYmVkZGVydGVzdC5jcHAgYi9mcGRmc2RrL2ZwZGZlZGl0cGF0aF9lbWJlZGRlcnRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTVkYmIKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL2ZwZGZlZGl0cGF0aF9lbWJlZGRlcnRlc3QuY3BwCkBAIC0wLDAgKzEsNjMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfZWRpdC5oIgorI2luY2x1ZGUgInRlc3RpbmcvZW1iZWRkZXJfdGVzdC5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInRlc3RpbmcvdGVzdF9zdXBwb3J0LmgiCisKK2NsYXNzIEZQREZFZGl0UGF0aEVtYmVkZGVyVGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3Qge307CisKK1RFU1RfRihGUERGRWRpdFBhdGhFbWJlZGRlclRlc3QsIFZlcmlmeUNvcnJlY3RDb2xvdXJzUmV0dXJuZWQpIHsKKyAgQ3JlYXRlRW1wdHlEb2N1bWVudCgpOworICBGUERGX1BBR0UgcGFnZSA9IEZQREZQYWdlX05ldyhkb2N1bWVudCgpLCAwLCA2MTIsIDc5Mik7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAyNTY7ICsraSkgeworICAgIEZQREZfUEFHRU9CSkVDVCBwYXRoID0gRlBERlBhZ2VPYmpfQ3JlYXRlTmV3UGF0aCg0MDAsIDEwMCk7CisgICAgRVhQRUNUX1RSVUUoRlBERlBhdGhfU2V0RmlsbENvbG9yKHBhdGgsIGksIGksIGksIGkpKTsKKyAgICBFWFBFQ1RfVFJVRShGUERGUGF0aF9TZXRTdHJva2VDb2xvcihwYXRoLCBpLCBpLCBpLCBpKSk7CisgICAgRVhQRUNUX1RSVUUoRlBERlBhdGhfU2V0RHJhd01vZGUocGF0aCwgRlBERl9GSUxMTU9ERV9BTFRFUk5BVEUsIDApKTsKKyAgICBFWFBFQ1RfVFJVRShGUERGUGF0aF9MaW5lVG8ocGF0aCwgNDAwLCAyMDApKTsKKyAgICBFWFBFQ1RfVFJVRShGUERGUGF0aF9MaW5lVG8ocGF0aCwgMzAwLCAxMDApKTsKKyAgICBFWFBFQ1RfVFJVRShGUERGUGF0aF9DbG9zZShwYXRoKSk7CisKKyAgICBGUERGUGFnZV9JbnNlcnRPYmplY3QocGFnZSwgcGF0aCk7CisgIH0KKworICBFWFBFQ1RfVFJVRShGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQocGFnZSkpOworICBFWFBFQ1RfVFJVRShGUERGX1NhdmVBc0NvcHkoZG9jdW1lbnQoKSwgdGhpcywgMCkpOworICBGUERGX0Nsb3NlUGFnZShwYWdlKTsKKyAgcGFnZSA9IG51bGxwdHI7CisKKyAgT3BlblNhdmVkRG9jdW1lbnQoKTsKKyAgcGFnZSA9IExvYWRTYXZlZFBhZ2UoMCk7CisgIEFTU0VSVChwYWdlKTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDI1NjsgKytpKSB7CisgICAgRlBERl9QQUdFT0JKRUNUIHBhdGggPSBGUERGUGFnZV9HZXRPYmplY3QocGFnZSwgaSk7CisgICAgQVNTRVJUKHBhdGgpOworCisgICAgRVhQRUNUX0VRKEZQREZfUEFHRU9CSl9QQVRILCBGUERGUGFnZU9ial9HZXRUeXBlKHBhdGgpKTsKKworICAgIHVuc2lnbmVkIGludCByOworICAgIHVuc2lnbmVkIGludCBnOworICAgIHVuc2lnbmVkIGludCBiOworICAgIHVuc2lnbmVkIGludCBhOworICAgIEZQREZQYXRoX0dldEZpbGxDb2xvcihwYXRoLCAmciwgJmcsICZiLCAmYSk7CisgICAgRVhQRUNUX0VRKGksIHIpOworICAgIEVYUEVDVF9FUShpLCBnKTsKKyAgICBFWFBFQ1RfRVEoaSwgYik7CisgICAgRVhQRUNUX0VRKGksIGEpOworCisgICAgRlBERlBhdGhfR2V0U3Ryb2tlQ29sb3IocGF0aCwgJnIsICZnLCAmYiwgJmEpOworICAgIEVYUEVDVF9FUShpLCByKTsKKyAgICBFWFBFQ1RfRVEoaSwgZyk7CisgICAgRVhQRUNUX0VRKGksIGIpOworICAgIEVYUEVDVF9FUShpLCBhKTsKKyAgfQorCisgIENsb3NlU2F2ZWRQYWdlKHBhZ2UpOworICBDbG9zZVNhdmVkRG9jdW1lbnQoKTsKK30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnBkZmVkaXR0ZXh0LmNwcCBiL2ZwZGZzZGsvZnBkZmVkaXR0ZXh0LmNwcAppbmRleCA4YmYwYTBhLi4yMmM2MjY2IDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZwZGZlZGl0dGV4dC5jcHAKKysrIGIvZnBkZnNkay9mcGRmZWRpdHRleHQuY3BwCkBAIC0yLDExICsyLDE1IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9jcGRmX21vZHVsZW1nci5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfdHlwZTFmb250LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9kb2NwYWdlZGF0YS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfdGV4dG9iamVjdC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgiCkBAIC0xNSw5MiArMTksMzQgQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbnVtYmVyLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3JlZmVyZW5jZS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZm9udG1nci5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mb250LmgiCiAjaW5jbHVkZSAiZnBkZnNkay9mc2RrX2RlZmluZS5oIgogI2luY2x1ZGUgInB1YmxpYy9mcGRmX2VkaXQuaCIKIAotRExMRVhQT1JUIEZQREZfUEFHRU9CSkVDVCBTVERDQUxMIEZQREZQYWdlT2JqX05ld1RleHRPYmooRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBmb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZm9udF9zaXplKSB7Ci0gIENQREZfRG9jdW1lbnQqIHBEb2MgPSBDUERGRG9jdW1lbnRGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKLSAgaWYgKCFwRG9jKQotICAgIHJldHVybiBudWxscHRyOworbmFtZXNwYWNlIHsKIAotICBDUERGX0ZvbnQqIHBGb250ID0gQ1BERl9Gb250OjpHZXRTdG9ja0ZvbnQocERvYywgQ0ZYX0J5dGVTdHJpbmdDKGZvbnQpKTsKLSAgaWYgKCFwRm9udCkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqID0gbmV3IENQREZfVGV4dE9iamVjdDsKLSAgcFRleHRPYmotPm1fVGV4dFN0YXRlLlNldEZvbnQocEZvbnQpOwotICBwVGV4dE9iai0+bV9UZXh0U3RhdGUuU2V0Rm9udFNpemUoZm9udF9zaXplKTsKLSAgcFRleHRPYmotPkRlZmF1bHRTdGF0ZXMoKTsKLSAgcmV0dXJuIHBUZXh0T2JqOwotfQotCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlRleHRfU2V0VGV4dChGUERGX1BBR0VPQkpFQ1QgdGV4dF9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgdGV4dCkgewotICBpZiAoIXRleHRfb2JqZWN0KQotICAgIHJldHVybiBmYWxzZTsKLQotICBhdXRvIHBUZXh0T2JqID0gcmVpbnRlcnByZXRfY2FzdDxDUERGX1RleHRPYmplY3QqPih0ZXh0X29iamVjdCk7Ci0gIHBUZXh0T2JqLT5TZXRUZXh0KENGWF9CeXRlU3RyaW5nKHRleHQpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLURMTEVYUE9SVCBGUERGX0ZPTlQgU1REQ0FMTCBGUERGVGV4dF9Mb2FkVHlwZTFGb250KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSkgewotICBDUERGX0RvY3VtZW50KiBwRG9jID0gQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChkb2N1bWVudCk7Ci0gIGlmICghcERvYyB8fCAhZGF0YSB8fCBzaXplID09IDApCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgYXV0byBwRm9udCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfRm9udD4oKTsKLQotICAvLyBUT0RPKG5wbSk6IE1heWJlIHVzZSBGVF9HZXRfWDExX0ZvbnRfRm9ybWF0IHRvIGNoZWNrIGZvcm1hdD8KLSAgaWYgKCFwRm9udC0+TG9hZEVtYmVkZGVkKGRhdGEsIHNpemUpKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIENQREZfRGljdGlvbmFyeSogZm9udERpY3QgPSBwRG9jLT5OZXdJbmRpcmVjdDxDUERGX0RpY3Rpb25hcnk+KCk7Ci0gIGZvbnREaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiVHlwZSIsICJGb250Iik7Ci0gIGZvbnREaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiU3VidHlwZSIsICJUeXBlMSIpOwotICBDRlhfQnl0ZVN0cmluZyBuYW1lID0gcEZvbnQtPkdldEZhY2VOYW1lKCk7Ci0gIGlmIChuYW1lLklzRW1wdHkoKSkKLSAgICBuYW1lID0gIlVubmFtZWQiOwotICBmb250RGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIkJhc2VGb250IiwgbmFtZSk7Ci0KLSAgdWludDMyX3QgZ2x5cGhJbmRleDsKLSAgaW50IGN1cnJlbnRDaGFyID0gRlhGVF9HZXRfRmlyc3RfQ2hhcihwRm9udC0+R2V0RmFjZSgpLCAmZ2x5cGhJbmRleCk7Ci0gIGZvbnREaWN0LT5TZXROZXdGb3I8Q1BERl9OdW1iZXI+KCJGaXJzdENoYXIiLCBjdXJyZW50Q2hhcik7Ci0gIGludCBuZXh0Q2hhcjsKLSAgQ1BERl9BcnJheSogd2lkdGhzQXJyYXkgPSBwRG9jLT5OZXdJbmRpcmVjdDxDUERGX0FycmF5PigpOwotICB3aGlsZSAodHJ1ZSkgewotICAgIGludCB3aWR0aCA9IHBGb250LT5HZXRHbHlwaFdpZHRoKGdseXBoSW5kZXgpOwotICAgIHdpZHRoc0FycmF5LT5BZGROZXc8Q1BERl9OdW1iZXI+KHdpZHRoKTsKLSAgICBuZXh0Q2hhciA9IEZYRlRfR2V0X05leHRfQ2hhcihwRm9udC0+R2V0RmFjZSgpLCBjdXJyZW50Q2hhciwgJmdseXBoSW5kZXgpOwotICAgIGlmIChnbHlwaEluZGV4ID09IDApCi0gICAgICBicmVhazsKLSAgICBmb3IgKGludCBpID0gY3VycmVudENoYXIgKyAxOyBpIDwgbmV4dENoYXI7IGkrKykKLSAgICAgIHdpZHRoc0FycmF5LT5BZGROZXc8Q1BERl9OdW1iZXI+KDApOwotICAgIGN1cnJlbnRDaGFyID0gbmV4dENoYXI7Ci0gIH0KLSAgZm9udERpY3QtPlNldE5ld0ZvcjxDUERGX051bWJlcj4oIkxhc3RDaGFyIiwgY3VycmVudENoYXIpOwotICBmb250RGljdC0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiV2lkdGhzIiwgcERvYywgd2lkdGhzQXJyYXktPkdldE9iak51bSgpKTsKK0NQREZfRGljdGlvbmFyeSogTG9hZEZvbnREZXNjKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBmb250X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb250X3R5cGUpIHsKICAgQ1BERl9EaWN0aW9uYXJ5KiBmb250RGVzYyA9IHBEb2MtPk5ld0luZGlyZWN0PENQREZfRGljdGlvbmFyeT4oKTsKICAgZm9udERlc2MtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJUeXBlIiwgIkZvbnREZXNjcmlwdG9yIik7Ci0gIGZvbnREZXNjLT5TZXROZXdGb3I8Q1BERl9OYW1lPigiRm9udE5hbWUiLCBuYW1lKTsKKyAgZm9udERlc2MtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJGb250TmFtZSIsIGZvbnRfbmFtZSk7CiAgIGludCBmbGFncyA9IDA7CiAgIGlmIChGWEZUX0lzX0ZhY2VfZml4ZWR3aWR0aChwRm9udC0+R2V0RmFjZSgpKSkKICAgICBmbGFncyB8PSBGWEZPTlRfRklYRURfUElUQ0g7Ci0gIGlmIChuYW1lLkZpbmQoIlNlcmlmIikgPiAtMSkKKyAgaWYgKGZvbnRfbmFtZS5Db250YWlucygiU2VyaWYiKSkKICAgICBmbGFncyB8PSBGWEZPTlRfU0VSSUY7CiAgIGlmIChGWEZUX0lzX0ZhY2VfSXRhbGljKHBGb250LT5HZXRGYWNlKCkpKQogICAgIGZsYWdzIHw9IEZYRk9OVF9JVEFMSUM7CiAgIGlmIChGWEZUX0lzX0ZhY2VfQm9sZChwRm9udC0+R2V0RmFjZSgpKSkKICAgICBmbGFncyB8PSBGWEZPTlRfQk9MRDsKIAotICAvLyBUT0RPKG5wbSk6IEhvdyBkbyBJIGtub3cgaWYgYSBUeXBlMSBmb250IGlzIHN5bWJvbGljLCBzY3JpcHQsIGFsbGNhcCwKLSAgLy8gc21hbGxjYXAKKyAgLy8gVE9ETyhucG0pOiBIb3cgZG8gSSBrbm93IGlmIGEgIGZvbnQgaXMgc3ltYm9saWMsIHNjcmlwdCwgYWxsY2FwLCBzbWFsbGNhcAogICBmbGFncyB8PSBGWEZPTlRfTk9OU1lNQk9MSUM7CiAKICAgZm9udERlc2MtPlNldE5ld0ZvcjxDUERGX051bWJlcj4oIkZsYWdzIiwgZmxhZ3MpOwpAQCAtMTA4LDkgKzU0LDkgQEAKICAgcEZvbnQtPkdldEJCb3goYmJveCk7CiAgIGF1dG8gcEJCb3ggPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9BcnJheT4oKTsKICAgcEJCb3gtPkFkZE5ldzxDUERGX051bWJlcj4oYmJveC5sZWZ0KTsKLSAgcEJCb3gtPkFkZE5ldzxDUERGX051bWJlcj4oYmJveC5ib3R0b20pOwotICBwQkJveC0+QWRkTmV3PENQREZfTnVtYmVyPihiYm94LnJpZ2h0KTsKICAgcEJCb3gtPkFkZE5ldzxDUERGX051bWJlcj4oYmJveC50b3ApOworICBwQkJveC0+QWRkTmV3PENQREZfTnVtYmVyPihiYm94LnJpZ2h0KTsKKyAgcEJCb3gtPkFkZE5ldzxDUERGX051bWJlcj4oYmJveC5ib3R0b20pOwogICBmb250RGVzYy0+U2V0Rm9yKCJGb250QkJveCIsIHN0ZDo6bW92ZShwQkJveCkpOwogCiAgIC8vIFRPRE8obnBtKTogY2FsY3VsYXRlIGl0YWxpYyBhbmdsZSBjb3JyZWN0bHkKQEAgLTEyNSw4ICs3MSw0MjkgQEAKIAogICBDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBEb2MtPk5ld0luZGlyZWN0PENQREZfU3RyZWFtPigpOwogICBwU3RyZWFtLT5TZXREYXRhKGRhdGEsIHNpemUpOwotICBmb250RGVzYy0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiRm9udEZpbGUiLCBwRG9jLCBwU3RyZWFtLT5HZXRPYmpOdW0oKSk7CisgIC8vIFRPRE8obnBtKTogTGVuZ3RocyBmb3IgVHlwZTEgZm9udHMuCisgIGlmIChmb250X3R5cGUgPT0gRlBERl9GT05UX1RSVUVUWVBFKSB7CisgICAgcFN0cmVhbS0+R2V0RGljdCgpLT5TZXROZXdGb3I8Q1BERl9OdW1iZXI+KCJMZW5ndGgxIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzaXplKSk7CisgIH0KKyAgQnl0ZVN0cmluZyBmb250RmlsZSA9IGZvbnRfdHlwZSA9PSBGUERGX0ZPTlRfVFlQRTEgPyAiRm9udEZpbGUiIDogIkZvbnRGaWxlMiI7CisgIGZvbnREZXNjLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KGZvbnRGaWxlLCBwRG9jLCBwU3RyZWFtLT5HZXRPYmpOdW0oKSk7CisgIHJldHVybiBmb250RGVzYzsKK30KKworY29uc3QgY2hhciBUb1VuaWNvZGVTdGFydFtdID0KKyAgICAiL0NJREluaXQgL1Byb2NTZXQgZmluZHJlc291cmNlIGJlZ2luXG4iCisgICAgIjEyIGRpY3QgYmVnaW5cbiIKKyAgICAiYmVnaW5jbWFwXG4iCisgICAgIi9DSURTeXN0ZW1JbmZvXG4iCisgICAgIjw8L1JlZ2lzdHJ5IChBZG9iZSlcbiIKKyAgICAiL09yZGVyaW5nIChJZGVudGl0eSlcbiIKKyAgICAiL1N1cHBsZW1lbnQgMFxuIgorICAgICI+PiBkZWZcbiIKKyAgICAiL0NNYXBOYW1lIC9BZG9iZS1JZGVudGl0eS1IIGRlZlxuIgorICAgICJDTWFwVHlwZSAyIGRlZlxuIgorICAgICIxIGJlZ2luY29kZXNwYWNlcmFuZ2VcbiIKKyAgICAiPDAwMDA+IDxGRkZGRj5cbiIKKyAgICAiZW5kY29kZXNwYWNlcmFuZ2VcbiI7CisKK2NvbnN0IGNoYXIgVG9Vbmljb2RlRW5kW10gPQorICAgICJlbmRjbWFwXG4iCisgICAgIkNNYXBOYW1lIGN1cnJlbnRkaWN0IC9DTWFwIGRlZmluZXJlc291cmNlIHBvcFxuIgorICAgICJlbmRcbiIKKyAgICAiZW5kXG4iOworCit2b2lkIEFkZENoYXJjb2RlKHN0ZDo6b3N0cmluZ3N0cmVhbSogcEJ1ZmZlciwgdWludDMyX3QgbnVtYmVyKSB7CisgIEFTU0VSVChudW1iZXIgPD0gMHhGRkZGKTsKKyAgKnBCdWZmZXIgPDwgIjwiOworICBjaGFyIGFuc1s0XTsKKyAgRlhTWVNfSW50VG9Gb3VySGV4Q2hhcnMobnVtYmVyLCBhbnMpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDQ7ICsraSkKKyAgICAqcEJ1ZmZlciA8PCBhbnNbaV07CisgICpwQnVmZmVyIDw8ICI+IjsKK30KKworLy8gUERGIHNwZWMgMS43IFNlY3Rpb24gNS45LjI6ICJVbmljb2RlIGNoYXJhY3RlciBzZXF1ZW5jZXMgYXMgZXhwcmVzc2VkIGluCisvLyBVVEYtMTZCRSBlbmNvZGluZy4iIFNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VVEYtMTYjRGVzY3JpcHRpb24KK3ZvaWQgQWRkVW5pY29kZShzdGQ6Om9zdHJpbmdzdHJlYW0qIHBCdWZmZXIsIHVpbnQzMl90IHVuaWNvZGUpIHsKKyAgaWYgKHVuaWNvZGUgPj0gMHhEODAwICYmIHVuaWNvZGUgPD0gMHhERkZGKQorICAgIHVuaWNvZGUgPSAwOworCisgIGNoYXIgYW5zWzhdOworICAqcEJ1ZmZlciA8PCAiPCI7CisgIHNpemVfdCBudW1DaGFycyA9IEZYU1lTX1RvVVRGMTZCRSh1bmljb2RlLCBhbnMpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUNoYXJzOyArK2kpCisgICAgKnBCdWZmZXIgPDwgYW5zW2ldOworICAqcEJ1ZmZlciA8PCAiPiI7Cit9CisKKy8vIExvYWRzIHRoZSBjaGFyY29kZSB0byB1bmljb2RlIG1hcHBpbmcgaW50byBhIHN0cmVhbQorQ1BERl9TdHJlYW0qIExvYWRVbmljb2RlKENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8dWludDMyX3QsIHVpbnQzMl90PiYgdG9fdW5pY29kZSkgeworICAvLyBBIG1hcCBjaGFyY29kZS0+dW5pY29kZQorICBzdGQ6Om1hcDx1aW50MzJfdCwgdWludDMyX3Q+IGNoYXJfdG9fdW5pOworICAvLyBBIG1hcCA8Y2hhcl9zdGFydCwgY2hhcl9lbmQ+IHRvIHZlY3RvciB2IG9mIHVuaWNvZGUgY2hhcmFjdGVycyBvZiBzaXplIChlbmQKKyAgLy8gLSBzdGFydCArIDEpLiBUaGlzIGFiYnJldmlhdGVzOiBzdGFydC0+dlswXSwgc3RhcnQrMS0+dlsxXSwgZXRjLiBQREYgc3BlYworICAvLyAxLjcgU2VjdGlvbiA1LjkuMiBzYXlzIHRoYXQgb25seSB0aGUgbGFzdCBieXRlIG9mIHRoZSB1bmljb2RlIG1heSBjaGFuZ2UuCisgIHN0ZDo6bWFwPHN0ZDo6cGFpcjx1aW50MzJfdCwgdWludDMyX3Q+LCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4+CisgICAgICBtYXBfcmFuZ2VfdmVjdG9yOworICAvLyBBIG1hcCA8c3RhcnQsIGVuZD4gLT4gdW5pY29kZQorICAvLyBUaGlzIGFiYnJldmlhdGVzOiBzdGFydC0+dW5pY29kZSwgc3RhcnQrMS0+dW5pY29kZSsxLCBldGMuCisgIC8vIFBERiBzcGVjIDEuNyBTZWN0aW9uIDUuOS4yIHNheXMgdGhhdCBvbmx5IHRoZSBsYXN0IGJ5dGUgb2YgdGhlIHVuaWNvZGUgbWF5CisgIC8vIGNoYW5nZS4KKyAgc3RkOjptYXA8c3RkOjpwYWlyPHVpbnQzMl90LCB1aW50MzJfdD4sIHVpbnQzMl90PiBtYXBfcmFuZ2U7CisKKyAgLy8gQ2FsY3VsYXRlIHRoZSBtYXBzCisgIGZvciAoYXV0byBpdGVyID0gdG9fdW5pY29kZS5iZWdpbigpOyBpdGVyICE9IHRvX3VuaWNvZGUuZW5kKCk7ICsraXRlcikgeworICAgIHVpbnQzMl90IGZpcnN0Q2hhcmNvZGUgPSBpdGVyLT5maXJzdDsKKyAgICB1aW50MzJfdCBmaXJzdFVuaWNvZGUgPSBpdGVyLT5zZWNvbmQ7CisgICAgaWYgKHN0ZDo6bmV4dChpdGVyKSA9PSB0b191bmljb2RlLmVuZCgpIHx8CisgICAgICAgIGZpcnN0Q2hhcmNvZGUgKyAxICE9IHN0ZDo6bmV4dChpdGVyKS0+Zmlyc3QpIHsKKyAgICAgIGNoYXJfdG9fdW5pW2ZpcnN0Q2hhcmNvZGVdID0gZmlyc3RVbmljb2RlOworICAgICAgY29udGludWU7CisgICAgfQorICAgICsraXRlcjsKKyAgICB1aW50MzJfdCBjdXJDaGFyY29kZSA9IGl0ZXItPmZpcnN0OworICAgIHVpbnQzMl90IGN1clVuaWNvZGUgPSBpdGVyLT5zZWNvbmQ7CisgICAgaWYgKGN1ckNoYXJjb2RlICUgMjU2ID09IDApIHsKKyAgICAgIGNoYXJfdG9fdW5pW2ZpcnN0Q2hhcmNvZGVdID0gZmlyc3RVbmljb2RlOworICAgICAgY2hhcl90b191bmlbY3VyQ2hhcmNvZGVdID0gY3VyVW5pY29kZTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBjb25zdCBzaXplX3QgbWF4RXh0cmEgPSAyNTUgLSAoY3VyQ2hhcmNvZGUgJSAyNTYpOworICAgIGF1dG8gbmV4dF9pdCA9IHN0ZDo6bmV4dChpdGVyKTsKKyAgICBpZiAoZmlyc3RVbmljb2RlICsgMSAhPSBjdXJVbmljb2RlKSB7CisgICAgICAvLyBDb25zZWN1dGl2ZSBjaGFyY29kZXMgbWFwcGluZyB0byBub24tY29uc2VjdXRpdmUgdW5pY29kZXMKKyAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiB1bmljb2RlczsKKyAgICAgIHVuaWNvZGVzLnB1c2hfYmFjayhmaXJzdFVuaWNvZGUpOworICAgICAgdW5pY29kZXMucHVzaF9iYWNrKGN1clVuaWNvZGUpOworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXhFeHRyYTsgKytpKSB7CisgICAgICAgIGlmIChuZXh0X2l0ID09IHRvX3VuaWNvZGUuZW5kKCkgfHwgY3VyQ2hhcmNvZGUgKyAxICE9IG5leHRfaXQtPmZpcnN0KQorICAgICAgICAgIGJyZWFrOworICAgICAgICArK2l0ZXI7CisgICAgICAgICsrY3VyQ2hhcmNvZGU7CisgICAgICAgIHVuaWNvZGVzLnB1c2hfYmFjayhpdGVyLT5zZWNvbmQpOworICAgICAgICBuZXh0X2l0ID0gc3RkOjpuZXh0KGl0ZXIpOworICAgICAgfQorICAgICAgQVNTRVJUKGl0ZXItPmZpcnN0IC0gZmlyc3RDaGFyY29kZSArIDEgPT0gdW5pY29kZXMuc2l6ZSgpKTsKKyAgICAgIG1hcF9yYW5nZV92ZWN0b3Jbc3RkOjptYWtlX3BhaXIoZmlyc3RDaGFyY29kZSwgaXRlci0+Zmlyc3QpXSA9IHVuaWNvZGVzOworICAgICAgY29udGludWU7CisgICAgfQorICAgIC8vIENvbnNlY3V0aXZlIGNoYXJjb2RlcyBtYXBwaW5nIHRvIGNvbnNlY3V0aXZlIHVuaWNvZGVzCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXhFeHRyYTsgKytpKSB7CisgICAgICBpZiAobmV4dF9pdCA9PSB0b191bmljb2RlLmVuZCgpIHx8IGN1ckNoYXJjb2RlICsgMSAhPSBuZXh0X2l0LT5maXJzdCB8fAorICAgICAgICAgIGN1clVuaWNvZGUgKyAxICE9IG5leHRfaXQtPnNlY29uZCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgICsraXRlcjsKKyAgICAgICsrY3VyQ2hhcmNvZGU7CisgICAgICArK2N1clVuaWNvZGU7CisgICAgICBuZXh0X2l0ID0gc3RkOjpuZXh0KGl0ZXIpOworICAgIH0KKyAgICBtYXBfcmFuZ2Vbc3RkOjptYWtlX3BhaXIoZmlyc3RDaGFyY29kZSwgY3VyQ2hhcmNvZGUpXSA9IGZpcnN0VW5pY29kZTsKKyAgfQorICBzdGQ6Om9zdHJpbmdzdHJlYW0gYnVmZmVyOworICBidWZmZXIgPDwgVG9Vbmljb2RlU3RhcnQ7CisgIC8vIEFkZCBtYXBzIHRvIGJ1ZmZlcgorICBidWZmZXIgPDwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNoYXJfdG9fdW5pLnNpemUoKSkgPDwgIiBiZWdpbmJmY2hhclxuIjsKKyAgZm9yIChjb25zdCBhdXRvJiBpdGVyIDogY2hhcl90b191bmkpIHsKKyAgICBBZGRDaGFyY29kZSgmYnVmZmVyLCBpdGVyLmZpcnN0KTsKKyAgICBidWZmZXIgPDwgIiAiOworICAgIEFkZFVuaWNvZGUoJmJ1ZmZlciwgaXRlci5zZWNvbmQpOworICAgIGJ1ZmZlciA8PCAiXG4iOworICB9CisgIGJ1ZmZlciA8PCAiZW5kYmZjaGFyXG4iCisgICAgICAgICA8PCBzdGF0aWNfY2FzdDx1aW50MzJfdD4obWFwX3JhbmdlX3ZlY3Rvci5zaXplKCkgKyBtYXBfcmFuZ2Uuc2l6ZSgpKQorICAgICAgICAgPDwgIiBiZWdpbmJmcmFuZ2VcbiI7CisgIGZvciAoY29uc3QgYXV0byYgaXRlciA6IG1hcF9yYW5nZV92ZWN0b3IpIHsKKyAgICBjb25zdCBzdGQ6OnBhaXI8dWludDMyX3QsIHVpbnQzMl90PiYgY2hhcmNvZGVSYW5nZSA9IGl0ZXIuZmlyc3Q7CisgICAgQWRkQ2hhcmNvZGUoJmJ1ZmZlciwgY2hhcmNvZGVSYW5nZS5maXJzdCk7CisgICAgYnVmZmVyIDw8ICIgIjsKKyAgICBBZGRDaGFyY29kZSgmYnVmZmVyLCBjaGFyY29kZVJhbmdlLnNlY29uZCk7CisgICAgYnVmZmVyIDw8ICIgWyI7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiB1bmljb2RlcyA9IGl0ZXIuc2Vjb25kOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdW5pY29kZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIHVpbnQzMl90IHVuaSA9IHVuaWNvZGVzW2ldOworICAgICAgQWRkVW5pY29kZSgmYnVmZmVyLCB1bmkpOworICAgICAgaWYgKGkgIT0gdW5pY29kZXMuc2l6ZSgpIC0gMSkKKyAgICAgICAgYnVmZmVyIDw8ICIgIjsKKyAgICB9CisgICAgYnVmZmVyIDw8ICJdXG4iOworICB9CisgIGZvciAoY29uc3QgYXV0byYgaXRlciA6IG1hcF9yYW5nZSkgeworICAgIGNvbnN0IHN0ZDo6cGFpcjx1aW50MzJfdCwgdWludDMyX3Q+JiBjaGFyY29kZVJhbmdlID0gaXRlci5maXJzdDsKKyAgICBBZGRDaGFyY29kZSgmYnVmZmVyLCBjaGFyY29kZVJhbmdlLmZpcnN0KTsKKyAgICBidWZmZXIgPDwgIiAiOworICAgIEFkZENoYXJjb2RlKCZidWZmZXIsIGNoYXJjb2RlUmFuZ2Uuc2Vjb25kKTsKKyAgICBidWZmZXIgPDwgIiAiOworICAgIEFkZFVuaWNvZGUoJmJ1ZmZlciwgaXRlci5zZWNvbmQpOworICAgIGJ1ZmZlciA8PCAiXG4iOworICB9CisgIGJ1ZmZlciA8PCAiZW5kYmZyYW5nZVxuIjsKKyAgYnVmZmVyIDw8IFRvVW5pY29kZUVuZDsKKyAgLy8gVE9ETyhucG0pOiBFbmNyeXB0IC8gQ29tcHJlc3M/CisgIENQREZfU3RyZWFtKiBzdHJlYW0gPSBwRG9jLT5OZXdJbmRpcmVjdDxDUERGX1N0cmVhbT4oKTsKKyAgc3RyZWFtLT5TZXREYXRhKCZidWZmZXIpOworICByZXR1cm4gc3RyZWFtOworfQorCitjb25zdCB1aW50MzJfdCBrTWF4U2ltcGxlRm9udENoYXIgPSAweEZGOworCit2b2lkKiBMb2FkU2ltcGxlRm9udChDUERGX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENGWF9Gb250PiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgaW50IGZvbnRfdHlwZSkgeworICBDUERGX0RpY3Rpb25hcnkqIGZvbnREaWN0ID0gcERvYy0+TmV3SW5kaXJlY3Q8Q1BERl9EaWN0aW9uYXJ5PigpOworICBmb250RGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIlR5cGUiLCAiRm9udCIpOworICBmb250RGljdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oCisgICAgICAiU3VidHlwZSIsIGZvbnRfdHlwZSA9PSBGUERGX0ZPTlRfVFlQRTEgPyAiVHlwZTEiIDogIlRydWVUeXBlIik7CisgIEJ5dGVTdHJpbmcgbmFtZSA9IHBGb250LT5HZXRGYWNlTmFtZSgpOworICBpZiAobmFtZS5Jc0VtcHR5KCkpCisgICAgbmFtZSA9ICJVbm5hbWVkIjsKKyAgZm9udERpY3QtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJCYXNlRm9udCIsIG5hbWUpOworCisgIHVpbnQzMl90IGdseXBoSW5kZXg7CisgIHVpbnQzMl90IGN1cnJlbnRDaGFyID0gRlhGVF9HZXRfRmlyc3RfQ2hhcihwRm9udC0+R2V0RmFjZSgpLCAmZ2x5cGhJbmRleCk7CisgIGlmIChjdXJyZW50Q2hhciA+IGtNYXhTaW1wbGVGb250Q2hhciB8fCBnbHlwaEluZGV4ID09IDApCisgICAgcmV0dXJuIG51bGxwdHI7CisgIGZvbnREaWN0LT5TZXROZXdGb3I8Q1BERl9OdW1iZXI+KCJGaXJzdENoYXIiLCBzdGF0aWNfY2FzdDxpbnQ+KGN1cnJlbnRDaGFyKSk7CisgIENQREZfQXJyYXkqIHdpZHRoc0FycmF5ID0gcERvYy0+TmV3SW5kaXJlY3Q8Q1BERl9BcnJheT4oKTsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICB3aWR0aHNBcnJheS0+QWRkTmV3PENQREZfTnVtYmVyPihwRm9udC0+R2V0R2x5cGhXaWR0aChnbHlwaEluZGV4KSk7CisgICAgdWludDMyX3QgbmV4dENoYXIgPQorICAgICAgICBGWEZUX0dldF9OZXh0X0NoYXIocEZvbnQtPkdldEZhY2UoKSwgY3VycmVudENoYXIsICZnbHlwaEluZGV4KTsKKyAgICAvLyBTaW1wbGUgZm9udHMgaGF2ZSAxLWJ5dGUgY2hhcmNvZGVzIG9ubHkuCisgICAgaWYgKG5leHRDaGFyID4ga01heFNpbXBsZUZvbnRDaGFyIHx8IGdseXBoSW5kZXggPT0gMCkKKyAgICAgIGJyZWFrOworICAgIGZvciAodWludDMyX3QgaSA9IGN1cnJlbnRDaGFyICsgMTsgaSA8IG5leHRDaGFyOyBpKyspCisgICAgICB3aWR0aHNBcnJheS0+QWRkTmV3PENQREZfTnVtYmVyPigwKTsKKyAgICBjdXJyZW50Q2hhciA9IG5leHRDaGFyOworICB9CisgIGZvbnREaWN0LT5TZXROZXdGb3I8Q1BERl9OdW1iZXI+KCJMYXN0Q2hhciIsIHN0YXRpY19jYXN0PGludD4oY3VycmVudENoYXIpKTsKKyAgZm9udERpY3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIldpZHRocyIsIHBEb2MsIHdpZHRoc0FycmF5LT5HZXRPYmpOdW0oKSk7CisgIENQREZfRGljdGlvbmFyeSogZm9udERlc2MgPQorICAgICAgTG9hZEZvbnREZXNjKHBEb2MsIG5hbWUsIHBGb250LmdldCgpLCBkYXRhLCBzaXplLCBmb250X3R5cGUpOworCiAgIGZvbnREaWN0LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJGb250RGVzY3JpcHRvciIsIHBEb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnREZXNjLT5HZXRPYmpOdW0oKSk7CiAgIHJldHVybiBwRG9jLT5Mb2FkRm9udChmb250RGljdCk7CiB9CisKK2NvbnN0IHVpbnQzMl90IGtNYXhVbmljb2RlID0gMHgxMEZGRkY7CisKK3ZvaWQqIExvYWRDb21wb3NpdGVGb250KENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0ZvbnQ+IHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9udF90eXBlKSB7CisgIENQREZfRGljdGlvbmFyeSogZm9udERpY3QgPSBwRG9jLT5OZXdJbmRpcmVjdDxDUERGX0RpY3Rpb25hcnk+KCk7CisgIGZvbnREaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiVHlwZSIsICJGb250Iik7CisgIGZvbnREaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiU3VidHlwZSIsICJUeXBlMCIpOworICAvLyBUT0RPKG5wbSk6IEdldCB0aGUgY29ycmVjdCBlbmNvZGluZywgaWYgaXQncyBub3QgaWRlbnRpdHkuCisgIEJ5dGVTdHJpbmcgZW5jb2RpbmcgPSAiSWRlbnRpdHktSCI7CisgIGZvbnREaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiRW5jb2RpbmciLCBlbmNvZGluZyk7CisgIEJ5dGVTdHJpbmcgbmFtZSA9IHBGb250LT5HZXRGYWNlTmFtZSgpOworICBpZiAobmFtZS5Jc0VtcHR5KCkpCisgICAgbmFtZSA9ICJVbm5hbWVkIjsKKyAgZm9udERpY3QtPlNldE5ld0ZvcjxDUERGX05hbWU+KAorICAgICAgIkJhc2VGb250IiwgZm9udF90eXBlID09IEZQREZfRk9OVF9UWVBFMSA/IG5hbWUgKyAiLSIgKyBlbmNvZGluZyA6IG5hbWUpOworCisgIENQREZfRGljdGlvbmFyeSogcENJREZvbnQgPSBwRG9jLT5OZXdJbmRpcmVjdDxDUERGX0RpY3Rpb25hcnk+KCk7CisgIHBDSURGb250LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiVHlwZSIsICJGb250Iik7CisgIHBDSURGb250LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiU3VidHlwZSIsIGZvbnRfdHlwZSA9PSBGUERGX0ZPTlRfVFlQRTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIkNJREZvbnRUeXBlMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIkNJREZvbnRUeXBlMiIpOworICBwQ0lERm9udC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIkJhc2VGb250IiwgbmFtZSk7CisKKyAgLy8gVE9ETyhucG0pOiBNYXliZSB1c2UgRlRfR2V0X0NJRF9SZWdpc3RyeV9PcmRlcmluZ19TdXBwbGVtZW50IHRvIGdldCB0aGUKKyAgLy8gQ0lEU3lzdGVtSW5mbworICBDUERGX0RpY3Rpb25hcnkqIHBDSURTeXN0ZW1JbmZvID0gcERvYy0+TmV3SW5kaXJlY3Q8Q1BERl9EaWN0aW9uYXJ5PigpOworICBwQ0lEU3lzdGVtSW5mby0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIlJlZ2lzdHJ5IiwgIkFkb2JlIik7CisgIHBDSURTeXN0ZW1JbmZvLT5TZXROZXdGb3I8Q1BERl9OYW1lPigiT3JkZXJpbmciLCAiSWRlbnRpdHkiKTsKKyAgcENJRFN5c3RlbUluZm8tPlNldE5ld0ZvcjxDUERGX051bWJlcj4oIlN1cHBsZW1lbnQiLCAwKTsKKyAgcENJREZvbnQtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIkNJRFN5c3RlbUluZm8iLCBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ0lEU3lzdGVtSW5mby0+R2V0T2JqTnVtKCkpOworCisgIENQREZfRGljdGlvbmFyeSogZm9udERlc2MgPQorICAgICAgTG9hZEZvbnREZXNjKHBEb2MsIG5hbWUsIHBGb250LmdldCgpLCBkYXRhLCBzaXplLCBmb250X3R5cGUpOworICBwQ0lERm9udC0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiRm9udERlc2NyaXB0b3IiLCBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250RGVzYy0+R2V0T2JqTnVtKCkpOworCisgIHVpbnQzMl90IGdseXBoSW5kZXg7CisgIHVpbnQzMl90IGN1cnJlbnRDaGFyID0gRlhGVF9HZXRfRmlyc3RfQ2hhcihwRm9udC0+R2V0RmFjZSgpLCAmZ2x5cGhJbmRleCk7CisgIC8vIElmIGl0IGRvZXNuJ3QgaGF2ZSBhIHNpbmdsZSBjaGFyLCBqdXN0IGZhaWwKKyAgaWYgKGdseXBoSW5kZXggPT0gMCB8fCBjdXJyZW50Q2hhciA+IGtNYXhVbmljb2RlKQorICAgIHJldHVybiBudWxscHRyOworCisgIHN0ZDo6bWFwPHVpbnQzMl90LCB1aW50MzJfdD4gdG9fdW5pY29kZTsKKyAgc3RkOjptYXA8dWludDMyX3QsIHVpbnQzMl90PiB3aWR0aHM7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKGN1cnJlbnRDaGFyID4ga01heFVuaWNvZGUpCisgICAgICBicmVhazsKKworICAgIHdpZHRoc1tnbHlwaEluZGV4XSA9IHBGb250LT5HZXRHbHlwaFdpZHRoKGdseXBoSW5kZXgpOworICAgIHRvX3VuaWNvZGVbZ2x5cGhJbmRleF0gPSBjdXJyZW50Q2hhcjsKKyAgICBjdXJyZW50Q2hhciA9CisgICAgICAgIEZYRlRfR2V0X05leHRfQ2hhcihwRm9udC0+R2V0RmFjZSgpLCBjdXJyZW50Q2hhciwgJmdseXBoSW5kZXgpOworICAgIGlmIChnbHlwaEluZGV4ID09IDApCisgICAgICBicmVhazsKKyAgfQorICBDUERGX0FycmF5KiB3aWR0aHNBcnJheSA9IHBEb2MtPk5ld0luZGlyZWN0PENQREZfQXJyYXk+KCk7CisgIGZvciAoYXV0byBpdCA9IHdpZHRocy5iZWdpbigpOyBpdCAhPSB3aWR0aHMuZW5kKCk7ICsraXQpIHsKKyAgICBpbnQgY2ggPSBpdC0+Zmlyc3Q7CisgICAgaW50IHcgPSBpdC0+c2Vjb25kOworICAgIGlmIChzdGQ6Om5leHQoaXQpID09IHdpZHRocy5lbmQoKSkgeworICAgICAgLy8gT25seSBvbmUgY2hhciBsZWZ0LCB1c2UgZm9ybWF0IGMgW3ddCisgICAgICBhdXRvIG9uZVcgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9BcnJheT4oKTsKKyAgICAgIG9uZVctPkFkZE5ldzxDUERGX051bWJlcj4odyk7CisgICAgICB3aWR0aHNBcnJheS0+QWRkTmV3PENQREZfTnVtYmVyPihjaCk7CisgICAgICB3aWR0aHNBcnJheS0+QWRkKHN0ZDo6bW92ZShvbmVXKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgKytpdDsKKyAgICBpbnQgbmV4dF9jaCA9IGl0LT5maXJzdDsKKyAgICBpbnQgbmV4dF93ID0gaXQtPnNlY29uZDsKKyAgICBpZiAobmV4dF9jaCA9PSBjaCArIDEgJiYgbmV4dF93ID09IHcpIHsKKyAgICAgIC8vIFRoZSBhcnJheSBjYW4gaGF2ZSBhIGdyb3VwIGNfZmlyc3QgY19sYXN0IHc6IGFsbCBDSURzIGluIHRoZSByYW5nZSBmcm9tCisgICAgICAvLyBjX2ZpcnN0IHRvIGNfbGFzdCB3aWxsIGhhdmUgd2lkdGggdworICAgICAgd2lkdGhzQXJyYXktPkFkZE5ldzxDUERGX051bWJlcj4oY2gpOworICAgICAgY2ggPSBuZXh0X2NoOworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgYXV0byBuZXh0X2l0ID0gc3RkOjpuZXh0KGl0KTsKKyAgICAgICAgaWYgKG5leHRfaXQgPT0gd2lkdGhzLmVuZCgpIHx8IG5leHRfaXQtPmZpcnN0ICE9IGl0LT5maXJzdCArIDEgfHwKKyAgICAgICAgICAgIG5leHRfaXQtPnNlY29uZCAhPSBpdC0+c2Vjb25kKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKytpdDsKKyAgICAgICAgY2ggPSBpdC0+Zmlyc3Q7CisgICAgICB9CisgICAgICB3aWR0aHNBcnJheS0+QWRkTmV3PENQREZfTnVtYmVyPihjaCk7CisgICAgICB3aWR0aHNBcnJheS0+QWRkTmV3PENQREZfTnVtYmVyPih3KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAvLyBPdGhlcndpc2Ugd2UgY2FuIGhhdmUgYSBncm91cCBvZiB0aGUgZm9ybSBjIFt3MSB3MiAuLi5dOiBjIGhhcyB3aWR0aAorICAgIC8vIHcxLCBjKzEgaGFzIHdpZHRoIHcyLCBldGMuCisgICAgd2lkdGhzQXJyYXktPkFkZE5ldzxDUERGX051bWJlcj4oY2gpOworICAgIGF1dG8gY3VyV2lkdGhBcnJheSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0FycmF5PigpOworICAgIGN1cldpZHRoQXJyYXktPkFkZE5ldzxDUERGX051bWJlcj4odyk7CisgICAgY3VyV2lkdGhBcnJheS0+QWRkTmV3PENQREZfTnVtYmVyPihuZXh0X3cpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBhdXRvIG5leHRfaXQgPSBzdGQ6Om5leHQoaXQpOworICAgICAgaWYgKG5leHRfaXQgPT0gd2lkdGhzLmVuZCgpIHx8IG5leHRfaXQtPmZpcnN0ICE9IGl0LT5maXJzdCArIDEpCisgICAgICAgIGJyZWFrOworICAgICAgKytpdDsKKyAgICAgIGN1cldpZHRoQXJyYXktPkFkZE5ldzxDUERGX051bWJlcj4oc3RhdGljX2Nhc3Q8aW50PihpdC0+c2Vjb25kKSk7CisgICAgfQorICAgIHdpZHRoc0FycmF5LT5BZGQoc3RkOjptb3ZlKGN1cldpZHRoQXJyYXkpKTsKKyAgfQorICBwQ0lERm9udC0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiVyIsIHBEb2MsIHdpZHRoc0FycmF5LT5HZXRPYmpOdW0oKSk7CisgIC8vIFRPRE8obnBtKTogU3VwcG9ydCB2ZXJ0aWNhbCB3cml0aW5nCisKKyAgYXV0byBwRGVzY2VuZGFudCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0FycmF5PigpOworICBwRGVzY2VuZGFudC0+QWRkTmV3PENQREZfUmVmZXJlbmNlPihwRG9jLCBwQ0lERm9udC0+R2V0T2JqTnVtKCkpOworICBmb250RGljdC0+U2V0Rm9yKCJEZXNjZW5kYW50Rm9udHMiLCBzdGQ6Om1vdmUocERlc2NlbmRhbnQpKTsKKyAgQ1BERl9TdHJlYW0qIHRvVW5pY29kZVN0cmVhbSA9IExvYWRVbmljb2RlKHBEb2MsIHRvX3VuaWNvZGUpOworICBmb250RGljdC0+U2V0TmV3Rm9yPENQREZfUmVmZXJlbmNlPigiVG9Vbmljb2RlIiwgcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Vbmljb2RlU3RyZWFtLT5HZXRPYmpOdW0oKSk7CisgIHJldHVybiBwRG9jLT5Mb2FkRm9udChmb250RGljdCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitGUERGX0VYUE9SVCBGUERGX1BBR0VPQkpFQ1QgRlBERl9DQUxMQ09OVgorRlBERlBhZ2VPYmpfTmV3VGV4dE9iaihGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgZm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZm9udF9zaXplKSB7CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBDUERGRG9jdW1lbnRGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKKyAgaWYgKCFwRG9jKQorICAgIHJldHVybiBudWxscHRyOworCisgIENQREZfRm9udCogcEZvbnQgPSBDUERGX0ZvbnQ6OkdldFN0b2NrRm9udChwRG9jLCBCeXRlU3RyaW5nVmlldyhmb250KSk7CisgIGlmICghcEZvbnQpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgYXV0byBwVGV4dE9iaiA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1RleHRPYmplY3Q+KCk7CisgIHBUZXh0T2JqLT5tX1RleHRTdGF0ZS5TZXRGb250KHBGb250KTsKKyAgcFRleHRPYmotPm1fVGV4dFN0YXRlLlNldEZvbnRTaXplKGZvbnRfc2l6ZSk7CisgIHBUZXh0T2JqLT5EZWZhdWx0U3RhdGVzKCk7CisgIHJldHVybiBwVGV4dE9iai5yZWxlYXNlKCk7ICAvLyBDYWxsZXIgdGFrZXMgb3duZXJzaGlwLgorfQorCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgorRlBERlRleHRfU2V0VGV4dChGUERGX1BBR0VPQkpFQ1QgdGV4dF9vYmplY3QsIEZQREZfV0lERVNUUklORyB0ZXh0KSB7CisgIGF1dG8qIHBUZXh0T2JqID0gc3RhdGljX2Nhc3Q8Q1BERl9UZXh0T2JqZWN0Kj4odGV4dF9vYmplY3QpOworICBpZiAoIXBUZXh0T2JqKQorICAgIHJldHVybiBmYWxzZTsKKworICBzaXplX3QgbGVuID0gV2lkZVN0cmluZzo6V1N0cmluZ0xlbmd0aCh0ZXh0KTsKKyAgV2lkZVN0cmluZyBlbmNvZGVkVGV4dCA9IFdpZGVTdHJpbmc6OkZyb21VVEYxNkxFKHRleHQsIGxlbik7CisgIEJ5dGVTdHJpbmcgYnl0ZVRleHQ7CisgIGZvciAod2NoYXJfdCB3YyA6IGVuY29kZWRUZXh0KSB7CisgICAgcFRleHRPYmotPkdldEZvbnQoKS0+QXBwZW5kQ2hhcigKKyAgICAgICAgJmJ5dGVUZXh0LCBwVGV4dE9iai0+R2V0Rm9udCgpLT5DaGFyQ29kZUZyb21Vbmljb2RlKHdjKSk7CisgIH0KKyAgcFRleHRPYmotPlNldFRleHQoYnl0ZVRleHQpOworICByZXR1cm4gdHJ1ZTsKK30KKworRlBERl9FWFBPUlQgRlBERl9GT05UIEZQREZfQ0FMTENPTlYgRlBERlRleHRfTG9hZEZvbnQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBjaWQpIHsKKyAgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOworICBpZiAoIXBEb2MgfHwgIWRhdGEgfHwgc2l6ZSA9PSAwIHx8CisgICAgICAoZm9udF90eXBlICE9IEZQREZfRk9OVF9UWVBFMSAmJiBmb250X3R5cGUgIT0gRlBERl9GT05UX1RSVUVUWVBFKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgYXV0byBwRm9udCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfRm9udD4oKTsKKworICAvLyBUT0RPKG5wbSk6IE1heWJlIHVzZSBGVF9HZXRfWDExX0ZvbnRfRm9ybWF0IHRvIGNoZWNrIGZvcm1hdD8gT3RoZXJ3aXNlLCB3ZQorICAvLyBhcmUgYWxsb3dpbmcgZ2l2aW5nIGFueSBmb250IHRoYXQgY2FuIGJlIGxvYWRlZCBvbiBmcmVldHlwZSBhbmQgc2V0dGluZyBpdAorICAvLyBhcyBhbnkgZm9udCB0eXBlLgorICBpZiAoIXBGb250LT5Mb2FkRW1iZWRkZWQoZGF0YSwgc2l6ZSkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgcmV0dXJuIGNpZCA/IExvYWRDb21wb3NpdGVGb250KHBEb2MsIHN0ZDo6bW92ZShwRm9udCksIGRhdGEsIHNpemUsIGZvbnRfdHlwZSkKKyAgICAgICAgICAgICA6IExvYWRTaW1wbGVGb250KHBEb2MsIHN0ZDo6bW92ZShwRm9udCksIGRhdGEsIHNpemUsIGZvbnRfdHlwZSk7Cit9CisKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCitGUERGVGV4dF9TZXRGaWxsQ29sb3IoRlBERl9QQUdFT0JKRUNUIHRleHRfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBSLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBHLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBCLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBBKSB7CisgIHJldHVybiBGUERGUGFnZU9ial9TZXRGaWxsQ29sb3IodGV4dF9vYmplY3QsIFIsIEcsIEIsIEEpOworfQorCitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRlBERkZvbnRfQ2xvc2UoRlBERl9GT05UIGZvbnQpIHsKKyAgQ1BERl9Gb250KiBwRm9udCA9IHN0YXRpY19jYXN0PENQREZfRm9udCo+KGZvbnQpOworICBpZiAoIXBGb250KQorICAgIHJldHVybjsKKworICBDUERGX0RvY3VtZW50KiBwRG9jID0gcEZvbnQtPkdldERvY3VtZW50KCk7CisgIGlmICghcERvYykKKyAgICByZXR1cm47CisKKyAgQ1BERl9Eb2NQYWdlRGF0YSogcFBhZ2VEYXRhID0gcERvYy0+R2V0UGFnZURhdGEoKTsKKyAgaWYgKCFwUGFnZURhdGEtPklzRm9yY2VDbGVhcigpKQorICAgIHBQYWdlRGF0YS0+UmVsZWFzZUZvbnQocEZvbnQtPkdldEZvbnREaWN0KCkpOworfQorCitGUERGX0VYUE9SVCBGUERGX1BBR0VPQkpFQ1QgRlBERl9DQUxMQ09OVgorRlBERlBhZ2VPYmpfQ3JlYXRlVGV4dE9iaihGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZPTlQgZm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZm9udF9zaXplKSB7CisgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBDUERGRG9jdW1lbnRGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKKyAgQ1BERl9Gb250KiBwRm9udCA9IHN0YXRpY19jYXN0PENQREZfRm9udCo+KGZvbnQpOworICBpZiAoIXBEb2MgfHwgIXBGb250KQorICAgIHJldHVybiBudWxscHRyOworCisgIGF1dG8gcFRleHRPYmogPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9UZXh0T2JqZWN0PigpOworICBwVGV4dE9iai0+bV9UZXh0U3RhdGUuU2V0Rm9udChwRG9jLT5Mb2FkRm9udChwRm9udC0+R2V0Rm9udERpY3QoKSkpOworICBwVGV4dE9iai0+bV9UZXh0U3RhdGUuU2V0Rm9udFNpemUoZm9udF9zaXplKTsKKyAgcFRleHRPYmotPkRlZmF1bHRTdGF0ZXMoKTsKKyAgcmV0dXJuIHBUZXh0T2JqLnJlbGVhc2UoKTsKK30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnBkZmZvcm1maWxsLmNwcCBiL2ZwZGZzZGsvZnBkZmZvcm1maWxsLmNwcAppbmRleCA1N2ZmNmI2Li4xMGFlY2IzIDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZwZGZmb3JtZmlsbC5jcHAKKysrIGIvZnBkZnNkay9mcGRmZm9ybWZpbGwuY3BwCkBAIC0xNiw3ICsxNiw3IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfZm9ybWZpZWxkLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfaW50ZXJmb3JtLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfb2Njb250ZXh0LmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9meGdlZGV2aWNlLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9kZWZhdWx0cmVuZGVyZGV2aWNlLmgiCiAjaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX2Zvcm1maWxsZW52aXJvbm1lbnQuaCIKICNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfaW50ZXJmb3JtLmgiCiAjaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX3BhZ2V2aWV3LmgiCkBAIC0yOSwxMSArMjksNzMgQEAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQogI2luY2x1ZGUgImZwZGZzZGsvZnBkZnhmYS9jcGRmeGZhX2NvbnRleHQuaCIKICNpbmNsdWRlICJmcGRmc2RrL2ZwZGZ4ZmEvY3BkZnhmYV9wYWdlLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jdmlldy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZnBhZ2V2aWV3LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRvY3ZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0LmgiCisKK3N0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihGb3JtVHlwZTo6a05vbmUpID09IEZPUk1UWVBFX05PTkUsCisgICAgICAgICAgICAgICJOb25lIGZvcm0gdHlwZXMgbXVzdCBtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KEZvcm1UeXBlOjprQWNyb0Zvcm0pID09IEZPUk1UWVBFX0FDUk9fRk9STSwKKyAgICAgICAgICAgICAgIkFjcm9Gb3JtIGZvcm0gdHlwZXMgbXVzdCBtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KEZvcm1UeXBlOjprWEZBRnVsbCkgPT0gRk9STVRZUEVfWEZBX0ZVTEwsCisgICAgICAgICAgICAgICJYRkEgZnVsbCBmb3JtIHR5cGVzIG11c3QgbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihGb3JtVHlwZTo6a1hGQUZvcmVncm91bmQpID09CisgICAgICAgICAgICAgICAgICBGT1JNVFlQRV9YRkFfRk9SRUdST1VORCwKKyAgICAgICAgICAgICAgIlhGQSBmb3JlZ3JvdW5kIGZvcm0gdHlwZXMgbXVzdCBtYXRjaCIpOwogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCitzdGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PGludD4oRm9ybUZpZWxkVHlwZTo6a1Vua25vd24pID09CisgICAgICAgICAgICAgICAgICBGUERGX0ZPUk1GSUVMRF9VTktOT1dOLAorICAgICAgICAgICAgICAiVW5rbm93biBmb3JtIGZpZWxkIHR5cGVzIG11c3QgbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihGb3JtRmllbGRUeXBlOjprUHVzaEJ1dHRvbikgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfRk9STUZJRUxEX1BVU0hCVVRUT04sCisgICAgICAgICAgICAgICJQdXNoQnV0dG9uIGZvcm0gZmllbGQgdHlwZXMgbXVzdCBtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KEZvcm1GaWVsZFR5cGU6OmtDaGVja0JveCkgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfRk9STUZJRUxEX0NIRUNLQk9YLAorICAgICAgICAgICAgICAiQ2hlY2tCb3ggZm9ybSBmaWVsZCB0eXBlcyBtdXN0IG1hdGNoIik7CitzdGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PGludD4oRm9ybUZpZWxkVHlwZTo6a1JhZGlvQnV0dG9uKSA9PQorICAgICAgICAgICAgICAgICAgRlBERl9GT1JNRklFTERfUkFESU9CVVRUT04sCisgICAgICAgICAgICAgICJSYWRpb0J1dHRvbiBmb3JtIGZpZWxkIHR5cGVzIG11c3QgbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihGb3JtRmllbGRUeXBlOjprQ29tYm9Cb3gpID09CisgICAgICAgICAgICAgICAgICBGUERGX0ZPUk1GSUVMRF9DT01CT0JPWCwKKyAgICAgICAgICAgICAgIkNvbWJvQm94IGZvcm0gZmllbGQgdHlwZXMgbXVzdCBtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KEZvcm1GaWVsZFR5cGU6OmtMaXN0Qm94KSA9PQorICAgICAgICAgICAgICAgICAgRlBERl9GT1JNRklFTERfTElTVEJPWCwKKyAgICAgICAgICAgICAgIkxpc3RCb3ggZm9ybSBmaWVsZCB0eXBlcyBtdXN0IG1hdGNoIik7CitzdGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PGludD4oRm9ybUZpZWxkVHlwZTo6a1RleHRGaWVsZCkgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfRk9STUZJRUxEX1RFWFRGSUVMRCwKKyAgICAgICAgICAgICAgIlRleHRGaWVsZCBmb3JtIGZpZWxkIHR5cGVzIG11c3QgbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihGb3JtRmllbGRUeXBlOjprU2lnbmF0dXJlKSA9PQorICAgICAgICAgICAgICAgICAgRlBERl9GT1JNRklFTERfU0lHTkFUVVJFLAorICAgICAgICAgICAgICAiU2lnbmF0dXJlIGZvcm0gZmllbGQgdHlwZXMgbXVzdCBtYXRjaCIpOworI2lmZGVmIFBERl9FTkFCTEVfWEZBCitzdGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PGludD4oRm9ybUZpZWxkVHlwZTo6a1hGQSkgPT0gRlBERl9GT1JNRklFTERfWEZBLAorICAgICAgICAgICAgICAiWEZBIGZvcm0gZmllbGQgdHlwZXMgbXVzdCBtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KEZvcm1GaWVsZFR5cGU6OmtYRkFfQ2hlY2tCb3gpID09CisgICAgICAgICAgICAgICAgICBGUERGX0ZPUk1GSUVMRF9YRkFfQ0hFQ0tCT1gsCisgICAgICAgICAgICAgICJYRkEgQ2hlY2tCb3ggZm9ybSBmaWVsZCB0eXBlcyBtdXN0IG1hdGNoIik7CitzdGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PGludD4oRm9ybUZpZWxkVHlwZTo6a1hGQV9Db21ib0JveCkgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfRk9STUZJRUxEX1hGQV9DT01CT0JPWCwKKyAgICAgICAgICAgICAgIlhGQSBDb21ib0JveCBmb3JtIGZpZWxkIHR5cGVzIG11c3QgbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihGb3JtRmllbGRUeXBlOjprWEZBX0ltYWdlRmllbGQpID09CisgICAgICAgICAgICAgICAgICBGUERGX0ZPUk1GSUVMRF9YRkFfSU1BR0VGSUVMRCwKKyAgICAgICAgICAgICAgIlhGQSBJbWFnZUZpZWxkIGZvcm0gZmllbGQgdHlwZXMgbXVzdCBtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KEZvcm1GaWVsZFR5cGU6OmtYRkFfTGlzdEJveCkgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfRk9STUZJRUxEX1hGQV9MSVNUQk9YLAorICAgICAgICAgICAgICAiWEZBIExpc3RCb3ggZm9ybSBmaWVsZCB0eXBlcyBtdXN0IG1hdGNoIik7CitzdGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PGludD4oRm9ybUZpZWxkVHlwZTo6a1hGQV9QdXNoQnV0dG9uKSA9PQorICAgICAgICAgICAgICAgICAgRlBERl9GT1JNRklFTERfWEZBX1BVU0hCVVRUT04sCisgICAgICAgICAgICAgICJYRkEgUHVzaEJ1dHRvbiBmb3JtIGZpZWxkIHR5cGVzIG11c3QgbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8aW50PihGb3JtRmllbGRUeXBlOjprWEZBX1NpZ25hdHVyZSkgPT0KKyAgICAgICAgICAgICAgICAgIEZQREZfRk9STUZJRUxEX1hGQV9TSUdOQVRVUkUsCisgICAgICAgICAgICAgICJYRkEgU2lnbmF0dXJlIGZvcm0gZmllbGQgdHlwZXMgbXVzdCBtYXRjaCIpOworc3RhdGljX2Fzc2VydChzdGF0aWNfY2FzdDxpbnQ+KEZvcm1GaWVsZFR5cGU6OmtYRkFfVGV4dEZpZWxkKSA9PQorICAgICAgICAgICAgICAgICAgRlBERl9GT1JNRklFTERfWEZBX1RFWFRGSUVMRCwKKyAgICAgICAgICAgICAgIlhGQSBUZXh0RmllbGQgZm9ybSBmaWVsZCB0eXBlcyBtdXN0IG1hdGNoIik7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCitzdGF0aWNfYXNzZXJ0KGtGb3JtRmllbGRUeXBlQ291bnQgPT0gRlBERl9GT1JNRklFTERfQ09VTlQsCisgICAgICAgICAgICAgICJOdW1iZXIgb2YgZm9ybSBmaWVsZCB0eXBlcyBtdXN0IG1hdGNoIik7CisKIG5hbWVzcGFjZSB7CiAKIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogSGFuZGxlVG9DUERGU0RLRW52aXJvbm1lbnQoCkBAIC01OSwxMiArMTIxLDEyIEBACiB9CiAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQotc3RkOjp2ZWN0b3I8Q0ZYX0J5dGVTdHJpbmc+KiBGcm9tRlBERlN0cmluZ0hhbmRsZShGUERGX1NUUklOR0hBTkRMRSBoYW5kbGUpIHsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjp2ZWN0b3I8Q0ZYX0J5dGVTdHJpbmc+Kj4oaGFuZGxlKTsKK3N0ZDo6dmVjdG9yPEJ5dGVTdHJpbmc+KiBGcm9tRlBERlN0cmluZ0hhbmRsZShGUERGX1NUUklOR0hBTkRMRSBoYW5kbGUpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHN0ZDo6dmVjdG9yPEJ5dGVTdHJpbmc+Kj4oaGFuZGxlKTsKIH0KIAotRlBERl9TVFJJTkdIQU5ETEUgVG9GUERGU3RyaW5nSGFuZGxlKHN0ZDo6dmVjdG9yPENGWF9CeXRlU3RyaW5nPiogc3RyaW5ncykgewotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxGUERGX1NUUklOR0hBTkRMRT4oc3RyaW5ncyk7CitGUERGX1NUUklOR0hBTkRMRSBUb0ZQREZTdHJpbmdIYW5kbGUoc3RkOjp2ZWN0b3I8Qnl0ZVN0cmluZz4qIHN0cmluZ3MpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEZQREZfU1RSSU5HSEFORExFPihzdHJpbmdzKTsKIH0KICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIApAQCAtMTAyLDY3ICsxNjQsNjggQEAKICAgICAgIHBQYWdlLT5HZXREaXNwbGF5TWF0cml4KHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LCByb3RhdGUpOwogICBGWF9SRUNUIGNsaXAoc3RhcnRfeCwgc3RhcnRfeSwgc3RhcnRfeCArIHNpemVfeCwgc3RhcnRfeSArIHNpemVfeSk7CiAKLSAgc3RkOjp1bmlxdWVfcHRyPENGWF9GeGdlRGV2aWNlPiBwRGV2aWNlKG5ldyBDRlhfRnhnZURldmljZSk7CisgIGF1dG8gcERldmljZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfRGVmYXVsdFJlbmRlckRldmljZT4oKTsKICNpZmRlZiBfU0tJQV9TVVBQT1JUXwogICBwRGV2aWNlLT5BdHRhY2hSZWNvcmRlcihzdGF0aWNfY2FzdDxTa1BpY3R1cmVSZWNvcmRlcio+KHJlY29yZGVyKSk7CiAjZW5kaWYKLSAgcERldmljZS0+QXR0YWNoKENGWEJpdG1hcEZyb21GUERGQml0bWFwKGJpdG1hcCksIGZhbHNlLCBudWxscHRyLCBmYWxzZSk7Ci0gIHBEZXZpY2UtPlNhdmVTdGF0ZSgpOwotICBwRGV2aWNlLT5TZXRDbGlwX1JlY3QoY2xpcCk7CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IGhvbGRlcihDRlhCaXRtYXBGcm9tRlBERkJpdG1hcChiaXRtYXApKTsKKyAgcERldmljZS0+QXR0YWNoKGhvbGRlciwgZmFsc2UsIG51bGxwdHIsIGZhbHNlKTsKKyAgeworICAgIENGWF9SZW5kZXJEZXZpY2U6OlN0YXRlUmVzdG9yZXIgcmVzdG9yZXIocERldmljZS5nZXQoKSk7CisgICAgcERldmljZS0+U2V0Q2xpcF9SZWN0KGNsaXApOwogCi0gIENQREZfUmVuZGVyT3B0aW9ucyBvcHRpb25zOwotICBpZiAoZmxhZ3MgJiBGUERGX0xDRF9URVhUKQotICAgIG9wdGlvbnMubV9GbGFncyB8PSBSRU5ERVJfQ0xFQVJUWVBFOwotICBlbHNlCi0gICAgb3B0aW9ucy5tX0ZsYWdzICY9IH5SRU5ERVJfQ0xFQVJUWVBFOworICAgIENQREZfUmVuZGVyT3B0aW9ucyBvcHRpb25zOworICAgIHVpbnQzMl90IG9wdGlvbl9mbGFncyA9IG9wdGlvbnMuR2V0RmxhZ3MoKTsKKyAgICBpZiAoZmxhZ3MgJiBGUERGX0xDRF9URVhUKQorICAgICAgb3B0aW9uX2ZsYWdzIHw9IFJFTkRFUl9DTEVBUlRZUEU7CisgICAgZWxzZQorICAgICAgb3B0aW9uX2ZsYWdzICY9IH5SRU5ERVJfQ0xFQVJUWVBFOworICAgIG9wdGlvbnMuU2V0RmxhZ3Mob3B0aW9uX2ZsYWdzKTsKIAotICAvLyBHcmF5c2NhbGUgb3V0cHV0Ci0gIGlmIChmbGFncyAmIEZQREZfR1JBWVNDQUxFKSB7Ci0gICAgb3B0aW9ucy5tX0NvbG9yTW9kZSA9IFJFTkRFUl9DT0xPUl9HUkFZOwotICAgIG9wdGlvbnMubV9Gb3JlQ29sb3IgPSAwOwotICAgIG9wdGlvbnMubV9CYWNrQ29sb3IgPSAweGZmZmZmZjsKLSAgfQotICBvcHRpb25zLm1fQWRkRmxhZ3MgPSBmbGFncyA+PiA4OwotICBvcHRpb25zLm1fYkRyYXdBbm5vdHMgPSBmbGFncyAmIEZQREZfQU5OT1Q7CisgICAgLy8gR3JheXNjYWxlIG91dHB1dAorICAgIGlmIChmbGFncyAmIEZQREZfR1JBWVNDQUxFKQorICAgICAgb3B0aW9ucy5TZXRDb2xvck1vZGUoQ1BERl9SZW5kZXJPcHRpb25zOjprR3JheSk7CisKKyAgICBvcHRpb25zLlNldERyYXdBbm5vdHMoZmxhZ3MgJiBGUERGX0FOTk9UKTsKIAogI2lmZGVmIFBERl9FTkFCTEVfWEZBCi0gIG9wdGlvbnMubV9wT0NDb250ZXh0ID0KLSAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDUERGX09DQ29udGV4dD4ocFBERkRvYywgQ1BERl9PQ0NvbnRleHQ6OlZpZXcpOwotICBpZiAoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gcEZvcm1GaWxsRW52LT5HZXRQYWdlVmlldyhwUGFnZSwgdHJ1ZSkpCi0gICAgcFBhZ2VWaWV3LT5QYWdlVmlld19PbkRyYXcocERldmljZS5nZXQoKSwgJm1hdHJpeCwgJm9wdGlvbnMsIGNsaXApOworICAgIG9wdGlvbnMuU2V0T0NDb250ZXh0KAorICAgICAgICBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERl9PQ0NvbnRleHQ+KHBQREZEb2MsIENQREZfT0NDb250ZXh0OjpWaWV3KSk7CisgICAgaWYgKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBGb3JtRmlsbEVudi0+R2V0UGFnZVZpZXcocFBhZ2UsIHRydWUpKQorICAgICAgcFBhZ2VWaWV3LT5QYWdlVmlld19PbkRyYXcocERldmljZS5nZXQoKSwgJm1hdHJpeCwgJm9wdGlvbnMsIGNsaXApOwogI2Vsc2UgICAvLyBQREZfRU5BQkxFX1hGQQotICBvcHRpb25zLm1fcE9DQ29udGV4dCA9IHBkZml1bTo6TWFrZVJldGFpbjxDUERGX09DQ29udGV4dD4oCi0gICAgICBwUGFnZS0+bV9wRG9jdW1lbnQsIENQREZfT0NDb250ZXh0OjpWaWV3KTsKLSAgaWYgKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBQYWdlKSkKLSAgICBwUGFnZVZpZXctPlBhZ2VWaWV3X09uRHJhdyhwRGV2aWNlLmdldCgpLCAmbWF0cml4LCAmb3B0aW9ucyk7CisgICAgb3B0aW9ucy5TZXRPQ0NvbnRleHQocGRmaXVtOjpNYWtlUmV0YWluPENQREZfT0NDb250ZXh0PigKKyAgICAgICAgcFBhZ2UtPm1fcERvY3VtZW50LkdldCgpLCBDUERGX09DQ29udGV4dDo6VmlldykpOworICAgIGlmIChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBGb3JtSGFuZGxlVG9QYWdlVmlldyhoSGFuZGxlLCBwUGFnZSkpCisgICAgICBwUGFnZVZpZXctPlBhZ2VWaWV3X09uRHJhdyhwRGV2aWNlLmdldCgpLCAmbWF0cml4LCAmb3B0aW9ucyk7CiAjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCi0KLSAgcERldmljZS0+UmVzdG9yZVN0YXRlKGZhbHNlKTsKKyAgfQogI2lmZGVmIF9TS0lBX1NVUFBPUlRfUEFUSFNfCi0gIHBEZXZpY2UtPkZsdXNoKCk7Ci0gIENGWEJpdG1hcEZyb21GUERGQml0bWFwKGJpdG1hcCktPlVuUHJlTXVsdGlwbHkoKTsKKyAgcERldmljZS0+Rmx1c2godHJ1ZSk7CisgIGhvbGRlci0+VW5QcmVNdWx0aXBseSgpOwogI2VuZGlmCiB9CiAKIH0gIC8vIG5hbWVzcGFjZQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlBhZ2VfSGFzRm9ybUZpZWxkQXRQb2ludChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpIHsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WCitGUERGUGFnZV9IYXNGb3JtRmllbGRBdFBvaW50KEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSkgewogICBpZiAoIWhIYW5kbGUpCiAgICAgcmV0dXJuIC0xOwogICBDUERGX1BhZ2UqIHBQYWdlID0gQ1BERlBhZ2VGcm9tRlBERlBhZ2UocGFnZSk7CiAgIGlmIChwUGFnZSkgewotICAgIENQREZfSW50ZXJGb3JtIGludGVyZm9ybShwUGFnZS0+bV9wRG9jdW1lbnQpOworICAgIENQREZfSW50ZXJGb3JtIGludGVyZm9ybShwUGFnZS0+bV9wRG9jdW1lbnQuR2V0KCkpOwogICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IGludGVyZm9ybS5HZXRDb250cm9sQXRQb2ludCgKLSAgICAgICAgcFBhZ2UsIENGWF9Qb2ludEYoc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHBhZ2VfeCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihwYWdlX3kpKSwKKyAgICAgICAgcFBhZ2UsCisgICAgICAgIENGWF9Qb2ludEYoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBhZ2VfeCksIHN0YXRpY19jYXN0PGZsb2F0PihwYWdlX3kpKSwKICAgICAgICAgbnVsbHB0cik7CiAgICAgaWYgKCFwRm9ybUN0cmwpCiAgICAgICByZXR1cm4gLTE7CiAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBwRm9ybUN0cmwtPkdldEZpZWxkKCk7Ci0gICAgcmV0dXJuIHBGb3JtRmllbGQgPyBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA6IC0xOworICAgIHJldHVybiBwRm9ybUZpZWxkID8gc3RhdGljX2Nhc3Q8aW50PihwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSkgOiAtMTsKICAgfQogCiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKQEAgLTE4OCw1MiArMjUxLDQwIEBACiAgIGlmICghcFdpZGdldEl0ZXJhdG9yKQogICAgIHJldHVybiAtMTsKIAotICBDWEZBX0ZGV2lkZ2V0KiBwWEZBQW5ub3QgPSBwV2lkZ2V0SXRlcmF0b3ItPk1vdmVUb05leHQoKTsKLSAgd2hpbGUgKHBYRkFBbm5vdCkgeworICBDWEZBX0ZGV2lkZ2V0KiBwWEZBQW5ub3Q7CisgIHdoaWxlICgocFhGQUFubm90ID0gcFdpZGdldEl0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCkpICE9IG51bGxwdHIpIHsKICAgICBDRlhfUmVjdEYgcmNCQm94ID0gcFhGQUFubm90LT5HZXRCQm94KDApOwogICAgIENGWF9GbG9hdFJlY3QgcmNXaWRnZXQocmNCQm94LmxlZnQsIHJjQkJveC50b3AsIHJjQkJveC5sZWZ0ICsgcmNCQm94LndpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LnRvcCArIHJjQkJveC5oZWlnaHQpOwotICAgIHJjV2lkZ2V0LmxlZnQgLT0gMS4wZjsKLSAgICByY1dpZGdldC5yaWdodCArPSAxLjBmOwotICAgIHJjV2lkZ2V0LmJvdHRvbSAtPSAxLjBmOwotICAgIHJjV2lkZ2V0LnRvcCArPSAxLjBmOwotCi0gICAgaWYgKHJjV2lkZ2V0LkNvbnRhaW5zKENGWF9Qb2ludEYoc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHBhZ2VfeCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHBhZ2VfeSkpKSkgewotICAgICAgcmV0dXJuIEZQREZfRk9STUZJRUxEX1hGQTsKKyAgICByY1dpZGdldC5JbmZsYXRlKDEuMGYsIDEuMGYpOworICAgIGlmIChyY1dpZGdldC5Db250YWlucyhDRlhfUG9pbnRGKHN0YXRpY19jYXN0PGZsb2F0PihwYWdlX3gpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihwYWdlX3kpKSkpIHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHBYRkFBbm5vdC0+R2V0Rm9ybUZpZWxkVHlwZSgpKTsKICAgICB9Ci0gICAgcFhGQUFubm90ID0gcFdpZGdldEl0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7CiAgIH0KICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKICAgcmV0dXJuIC0xOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBEUGFnZV9IYXNGb3JtRmllbGRBdFBvaW50KEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSkgewotICByZXR1cm4gRlBERlBhZ2VfSGFzRm9ybUZpZWxkQXRQb2ludChoSGFuZGxlLCBwYWdlLCBwYWdlX3gsIHBhZ2VfeSk7Ci19Ci0KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGUGFnZV9Gb3JtRmllbGRaT3JkZXJBdFBvaW50KEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSkgeworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYKK0ZQREZQYWdlX0Zvcm1GaWVsZFpPcmRlckF0UG9pbnQoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV95KSB7CiAgIGlmICghaEhhbmRsZSkKICAgICByZXR1cm4gLTE7CiAgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKICAgaWYgKCFwUGFnZSkKICAgICByZXR1cm4gLTE7Ci0gIENQREZfSW50ZXJGb3JtIGludGVyZm9ybShwUGFnZS0+bV9wRG9jdW1lbnQpOworICBDUERGX0ludGVyRm9ybSBpbnRlcmZvcm0ocFBhZ2UtPm1fcERvY3VtZW50LkdldCgpKTsKICAgaW50IHpfb3JkZXIgPSAtMTsKICAgKHZvaWQpaW50ZXJmb3JtLkdldENvbnRyb2xBdFBvaW50KAotICAgICAgcFBhZ2UsCi0gICAgICBDRlhfUG9pbnRGKHN0YXRpY19jYXN0PEZYX0ZMT0FUPihwYWdlX3gpLCBzdGF0aWNfY2FzdDxGWF9GTE9BVD4ocGFnZV95KSksCisgICAgICBwUGFnZSwgQ0ZYX1BvaW50RihzdGF0aWNfY2FzdDxmbG9hdD4ocGFnZV94KSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBhZ2VfeSkpLAogICAgICAgJnpfb3JkZXIpOwogICByZXR1cm4gel9vcmRlcjsKIH0KIAotRExMRVhQT1JUIEZQREZfRk9STUhBTkRMRSBTVERDQUxMCitGUERGX0VYUE9SVCBGUERGX0ZPUk1IQU5ETEUgRlBERl9DQUxMQ09OVgogRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZPUk1GSUxMSU5GTyogZm9ybUluZm8pIHsKICNpZmRlZiBQREZfRU5BQkxFX1hGQQpAQCAtMjU2LDIzICszMDcsMjIgQEAKICAgICByZXR1cm4gcERvY3VtZW50LT5HZXRGb3JtRmlsbEVudigpOwogI2VuZGlmCiAKLSAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYgPQotICAgICAgbmV3IENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudChwRG9jdW1lbnQsIGZvcm1JbmZvKTsKKyAgYXV0byBwRm9ybUZpbGxFbnYgPQorICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudD4ocERvY3VtZW50LCBmb3JtSW5mbyk7CiAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQotICBwRG9jdW1lbnQtPlNldEZvcm1GaWxsRW52KHBGb3JtRmlsbEVudik7CisgIHBEb2N1bWVudC0+U2V0Rm9ybUZpbGxFbnYocEZvcm1GaWxsRW52LmdldCgpKTsKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotICByZXR1cm4gcEZvcm1GaWxsRW52OworICByZXR1cm4gcEZvcm1GaWxsRW52LnJlbGVhc2UoKTsgIC8vIENhbGxlciB0YWtlcyBvd25lcnNoaXAuCiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OVgogRlBERkRPQ19FeGl0Rm9ybUZpbGxFbnZpcm9ubWVudChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkgewotICBpZiAoIWhIYW5kbGUpCi0gICAgcmV0dXJuOwotCiAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52ID0KICAgICAgIEhhbmRsZVRvQ1BERlNES0Vudmlyb25tZW50KGhIYW5kbGUpOworICBpZiAoIXBGb3JtRmlsbEVudikKKyAgICByZXR1cm47CiAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQogICAvLyBSZXNldCB0aGUgZm9jdXNlZCBhbm5vdGF0aW9ucyBhbmQgcmVtb3ZlIHRoZSBTREsgZG9jdW1lbnQgZnJvbSB0aGUKQEAgLTI4MywxMDUgKzMzMywxNDEgQEAKICAgaWYgKHBGb3JtRmlsbEVudi0+R2V0WEZBQ29udGV4dCgpKQogICAgIHBGb3JtRmlsbEVudi0+R2V0WEZBQ29udGV4dCgpLT5TZXRGb3JtRmlsbEVudihudWxscHRyKTsKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKLQogICBkZWxldGUgcEZvcm1GaWxsRW52OwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9Pbk1vdXNlTW92ZShGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpIHsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZPUk1fT25Nb3VzZU1vdmUoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpIHsKICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gRm9ybUhhbmRsZVRvUGFnZVZpZXcoaEhhbmRsZSwgcGFnZSk7CiAgIGlmICghcFBhZ2VWaWV3KQogICAgIHJldHVybiBmYWxzZTsKICAgcmV0dXJuIHBQYWdlVmlldy0+T25Nb3VzZU1vdmUoQ0ZYX1BvaW50RihwYWdlX3gsIHBhZ2VfeSksIG1vZGlmaWVyKTsKIH0KIAotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25MQnV0dG9uRG93bihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSkgeworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRk9STV9PbkZvY3VzKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpIHsKKyAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gRm9ybUhhbmRsZVRvUGFnZVZpZXcoaEhhbmRsZSwgcGFnZSk7CisgIGlmICghcFBhZ2VWaWV3KQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHBQYWdlVmlldy0+T25Gb2N1cyhDRlhfUG9pbnRGKHBhZ2VfeCwgcGFnZV95KSwgbW9kaWZpZXIpOworfQorCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGT1JNX09uTEJ1dHRvbkRvd24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSkgewogICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBGb3JtSGFuZGxlVG9QYWdlVmlldyhoSGFuZGxlLCBwYWdlKTsKICAgaWYgKCFwUGFnZVZpZXcpCiAgICAgcmV0dXJuIGZhbHNlOwogICByZXR1cm4gcFBhZ2VWaWV3LT5PbkxCdXR0b25Eb3duKENGWF9Qb2ludEYocGFnZV94LCBwYWdlX3kpLCBtb2RpZmllcik7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uTEJ1dHRvblVwKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSkgeworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRk9STV9PbkxCdXR0b25VcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSkgewogICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBGb3JtSGFuZGxlVG9QYWdlVmlldyhoSGFuZGxlLCBwYWdlKTsKICAgaWYgKCFwUGFnZVZpZXcpCiAgICAgcmV0dXJuIGZhbHNlOwotCi0gIENGWF9Qb2ludEYgcHQoKEZYX0ZMT0FUKXBhZ2VfeCwgKEZYX0ZMT0FUKXBhZ2VfeSk7Ci0gIHJldHVybiBwUGFnZVZpZXctPk9uTEJ1dHRvblVwKHB0LCBtb2RpZmllcik7CisgIHJldHVybiBwUGFnZVZpZXctPk9uTEJ1dHRvblVwKENGWF9Qb2ludEYocGFnZV94LCBwYWdlX3kpLCBtb2RpZmllcik7CiB9CiAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25SQnV0dG9uRG93bihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSkgeworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRk9STV9PblJCdXR0b25Eb3duKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpIHsKICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gRm9ybUhhbmRsZVRvUGFnZVZpZXcoaEhhbmRsZSwgcGFnZSk7CiAgIGlmICghcFBhZ2VWaWV3KQogICAgIHJldHVybiBmYWxzZTsKICAgcmV0dXJuIHBQYWdlVmlldy0+T25SQnV0dG9uRG93bihDRlhfUG9pbnRGKHBhZ2VfeCwgcGFnZV95KSwgbW9kaWZpZXIpOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PblJCdXR0b25VcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpIHsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZPUk1fT25SQnV0dG9uVXAoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpIHsKICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gRm9ybUhhbmRsZVRvUGFnZVZpZXcoaEhhbmRsZSwgcGFnZSk7CiAgIGlmICghcFBhZ2VWaWV3KQogICAgIHJldHVybiBmYWxzZTsKLQotICBDRlhfUG9pbnRGIHB0KChGWF9GTE9BVClwYWdlX3gsIChGWF9GTE9BVClwYWdlX3kpOwotICByZXR1cm4gcFBhZ2VWaWV3LT5PblJCdXR0b25VcChwdCwgbW9kaWZpZXIpOworICByZXR1cm4gcFBhZ2VWaWV3LT5PblJCdXR0b25VcChDRlhfUG9pbnRGKHBhZ2VfeCwgcGFnZV95KSwgbW9kaWZpZXIpOwogfQogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbktleURvd24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5LZXlDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllcikgeworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRk9STV9PbktleURvd24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllcikgewogICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBGb3JtSGFuZGxlVG9QYWdlVmlldyhoSGFuZGxlLCBwYWdlKTsKICAgaWYgKCFwUGFnZVZpZXcpCiAgICAgcmV0dXJuIGZhbHNlOwotCiAgIHJldHVybiBwUGFnZVZpZXctPk9uS2V5RG93bihuS2V5Q29kZSwgbW9kaWZpZXIpOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbktleVVwKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5LZXlDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXIpIHsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZPUk1fT25LZXlVcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyKSB7CiAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBhZ2UpOwogICBpZiAoIXBQYWdlVmlldykKICAgICByZXR1cm4gZmFsc2U7Ci0KICAgcmV0dXJuIHBQYWdlVmlldy0+T25LZXlVcChuS2V5Q29kZSwgbW9kaWZpZXIpOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbkNoYXIoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5DaGFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllcikgeworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRk9STV9PbkNoYXIoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllcikgewogICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBGb3JtSGFuZGxlVG9QYWdlVmlldyhoSGFuZGxlLCBwYWdlKTsKICAgaWYgKCFwUGFnZVZpZXcpCiAgICAgcmV0dXJuIGZhbHNlOwotCiAgIHJldHVybiBwUGFnZVZpZXctPk9uQ2hhcihuQ2hhciwgbW9kaWZpZXIpOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9Gb3JjZVRvS2lsbEZvY3VzKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKSB7CitGUERGX0VYUE9SVCB1bnNpZ25lZCBsb25nIEZQREZfQ0FMTENPTlYKK0ZPUk1fR2V0U2VsZWN0ZWRUZXh0KEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1ZmxlbikgeworICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBGb3JtSGFuZGxlVG9QYWdlVmlldyhoSGFuZGxlLCBwYWdlKTsKKyAgaWYgKCFwUGFnZVZpZXcpCisgICAgcmV0dXJuIDA7CisKKyAgV2lkZVN0cmluZyB3aWRlX3N0cl9mb3JtX3RleHQgPSBwUGFnZVZpZXctPkdldFNlbGVjdGVkVGV4dCgpOworICBCeXRlU3RyaW5nIGVuY29kZWRfZm9ybV90ZXh0ID0gd2lkZV9zdHJfZm9ybV90ZXh0LlVURjE2TEVfRW5jb2RlKCk7CisgIHVuc2lnbmVkIGxvbmcgZm9ybV90ZXh0X2xlbiA9IGVuY29kZWRfZm9ybV90ZXh0LkdldExlbmd0aCgpOworCisgIGlmIChidWZmZXIgJiYgYnVmbGVuID49IGZvcm1fdGV4dF9sZW4pCisgICAgbWVtY3B5KGJ1ZmZlciwgZW5jb2RlZF9mb3JtX3RleHQuY19zdHIoKSwgZm9ybV90ZXh0X2xlbik7CisKKyAgcmV0dXJuIGZvcm1fdGV4dF9sZW47Cit9CisKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGT1JNX1JlcGxhY2VTZWxlY3Rpb24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgd3NUZXh0KSB7CisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBhZ2UpOworICBpZiAoIXBQYWdlVmlldykKKyAgICByZXR1cm47CisKKyAgc2l6ZV90IGxlbiA9IFdpZGVTdHJpbmc6OldTdHJpbmdMZW5ndGgod3NUZXh0KTsKKyAgV2lkZVN0cmluZyB3aWRlX3N0cl90ZXh0ID0gV2lkZVN0cmluZzo6RnJvbVVURjE2TEUod3NUZXh0LCBsZW4pOworCisgIHBQYWdlVmlldy0+UmVwbGFjZVNlbGVjdGlvbih3aWRlX3N0cl90ZXh0KTsKK30KKworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZPUk1fRm9yY2VUb0tpbGxGb2N1cyhGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkgewogICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiA9CiAgICAgICBIYW5kbGVUb0NQREZTREtFbnZpcm9ubWVudChoSGFuZGxlKTsKICAgaWYgKCFwRm9ybUZpbGxFbnYpCkBAIC0zODksOTAgKzQ3NSw4NiBAQAogICByZXR1cm4gcEZvcm1GaWxsRW52LT5LaWxsRm9jdXNBbm5vdCgwKTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0ZGTERyYXcoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JJVE1BUCBiaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpIHsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGX0ZGTERyYXcoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQklUTUFQIGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKSB7CiAgIEZGTENvbW1vbihoSGFuZGxlLCBiaXRtYXAsIG51bGxwdHIsIHBhZ2UsIHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LAogICAgICAgICAgICAgcm90YXRlLCBmbGFncyk7CiB9CiAKICNpZmRlZiBfU0tJQV9TVVBQT1JUXwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0ZGTFJlY29yZChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9SRUNPUkRFUiByZWNvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKSB7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRlBERl9GRkxSZWNvcmQoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9SRUNPUkRFUiByZWNvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpIHsKICAgRkZMQ29tbW9uKGhIYW5kbGUsIG51bGxwdHIsIHJlY29yZGVyLCBwYWdlLCBzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwKICAgICAgICAgICAgIHJvdGF0ZSwgZmxhZ3MpOwogfQogI2VuZGlmCiAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9VbmRvKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCkgeworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZfV2lkZ2V0X1VuZG8oRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQpIHsKICAgaWYgKCFoV2lkZ2V0IHx8ICFkb2N1bWVudCkKICAgICByZXR1cm47CiAKICAgQ1BERlhGQV9Db250ZXh0KiBwQ29udGV4dCA9IHN0YXRpY19jYXN0PENQREZYRkFfQ29udGV4dCo+KGRvY3VtZW50KTsKLSAgaWYgKHBDb250ZXh0LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfRHluYW1pYyAmJgotICAgICAgcENvbnRleHQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9TdGF0aWMpCisgIGlmICghcENvbnRleHQtPkNvbnRhaW5zWEZBRm9ybSgpKQogICAgIHJldHVybjsKIAogICBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPlVuZG8oKTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9SZWRvKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCkgeworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZfV2lkZ2V0X1JlZG8oRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQpIHsKICAgaWYgKCFoV2lkZ2V0IHx8ICFkb2N1bWVudCkKICAgICByZXR1cm47CiAKICAgQ1BERlhGQV9Db250ZXh0KiBwQ29udGV4dCA9IHN0YXRpY19jYXN0PENQREZYRkFfQ29udGV4dCo+KGRvY3VtZW50KTsKLSAgaWYgKHBDb250ZXh0LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfRHluYW1pYyAmJgotICAgICAgcENvbnRleHQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9TdGF0aWMpCisgIGlmICghcENvbnRleHQtPkNvbnRhaW5zWEZBRm9ybSgpKQogICAgIHJldHVybjsKIAogICBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPlJlZG8oKTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9TZWxlY3RBbGwoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQpIHsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGX1dpZGdldF9TZWxlY3RBbGwoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCkgewogICBpZiAoIWhXaWRnZXQgfHwgIWRvY3VtZW50KQogICAgIHJldHVybjsKIAogICBDUERGWEZBX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q1BERlhGQV9Db250ZXh0Kj4oZG9jdW1lbnQpOwotICBpZiAocENvbnRleHQtPkdldERvY1R5cGUoKSAhPSBYRkFfRE9DVFlQRV9EeW5hbWljICYmCi0gICAgICBwQ29udGV4dC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX1N0YXRpYykKKyAgaWYgKCFwQ29udGV4dC0+Q29udGFpbnNYRkFGb3JtKCkpCiAgICAgcmV0dXJuOwogCiAgIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+U2VsZWN0QWxsKCk7CiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfQ29weShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHdzVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEKiBzaXplKSB7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRlBERl9XaWRnZXRfQ29weShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyB3c1RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEKiBzaXplKSB7CiAgIGlmICghaFdpZGdldCB8fCAhZG9jdW1lbnQpCiAgICAgcmV0dXJuOwogCiAgIENQREZYRkFfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDUERGWEZBX0NvbnRleHQqPihkb2N1bWVudCk7Ci0gIGlmIChwQ29udGV4dC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX0R5bmFtaWMgJiYKLSAgICAgIHBDb250ZXh0LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfU3RhdGljKQorICBpZiAoIXBDb250ZXh0LT5Db250YWluc1hGQUZvcm0oKSkKICAgICByZXR1cm47CiAKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NDcFRleHQ7Ci0gIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Q29weSh3c0NwVGV4dCk7CisgIFdpZGVTdHJpbmcgd3NDcFRleHQgPQorICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5Db3B5KCkudmFsdWVfb3IoV2lkZVN0cmluZygpKTsKIAotICBDRlhfQnl0ZVN0cmluZyBic0NwVGV4dCA9IHdzQ3BUZXh0LlVURjE2TEVfRW5jb2RlKCk7CisgIEJ5dGVTdHJpbmcgYnNDcFRleHQgPSB3c0NwVGV4dC5VVEYxNkxFX0VuY29kZSgpOwogICB1aW50MzJfdCBsZW4gPSBic0NwVGV4dC5HZXRMZW5ndGgoKSAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCk7CiAgIGlmICghd3NUZXh0KSB7CiAgICAgKnNpemUgPSBsZW47CkBAIC00ODEsMzAgKzU2MywyOSBAQAogCiAgIHVpbnQzMl90IHJlYWxfc2l6ZSA9IGxlbiA8ICpzaXplID8gbGVuIDogKnNpemU7CiAgIGlmIChyZWFsX3NpemUgPiAwKSB7Ci0gICAgRlhTWVNfbWVtY3B5KCh2b2lkKil3c1RleHQsCi0gICAgICAgICAgICAgICAgIGJzQ3BUZXh0LkdldEJ1ZmZlcihyZWFsX3NpemUgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKSwKLSAgICAgICAgICAgICAgICAgcmVhbF9zaXplICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CisgICAgbWVtY3B5KCh2b2lkKil3c1RleHQsCisgICAgICAgICAgIGJzQ3BUZXh0LkdldEJ1ZmZlcihyZWFsX3NpemUgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKSwKKyAgICAgICAgICAgcmVhbF9zaXplICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CiAgICAgYnNDcFRleHQuUmVsZWFzZUJ1ZmZlcihyZWFsX3NpemUgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKICAgfQogICAqc2l6ZSA9IHJlYWxfc2l6ZTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9DdXQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgd3NUZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCogc2l6ZSkgeworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZfV2lkZ2V0X0N1dChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREdFVCBoV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgd3NUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEKiBzaXplKSB7CiAgIGlmICghaFdpZGdldCB8fCAhZG9jdW1lbnQpCiAgICAgcmV0dXJuOwogCiAgIENQREZYRkFfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDUERGWEZBX0NvbnRleHQqPihkb2N1bWVudCk7Ci0gIGlmIChwQ29udGV4dC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX0R5bmFtaWMgJiYKLSAgICAgIHBDb250ZXh0LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfU3RhdGljKQorICBpZiAoIXBDb250ZXh0LT5Db250YWluc1hGQUZvcm0oKSkKICAgICByZXR1cm47CiAKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NDcFRleHQ7Ci0gIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihoV2lkZ2V0KS0+Q3V0KHdzQ3BUZXh0KTsKKyAgV2lkZVN0cmluZyB3c0NwVGV4dCA9CisgICAgICBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPkN1dCgpLnZhbHVlX29yKFdpZGVTdHJpbmcoKSk7CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgYnNDcFRleHQgPSB3c0NwVGV4dC5VVEYxNkxFX0VuY29kZSgpOworICBCeXRlU3RyaW5nIGJzQ3BUZXh0ID0gd3NDcFRleHQuVVRGMTZMRV9FbmNvZGUoKTsKICAgdWludDMyX3QgbGVuID0gYnNDcFRleHQuR2V0TGVuZ3RoKCkgLyBzaXplb2YodW5zaWduZWQgc2hvcnQpOwogICBpZiAoIXdzVGV4dCkgewogICAgICpzaXplID0gbGVuOwpAQCAtNTEzLDMxICs1OTQsMzAgQEAKIAogICB1aW50MzJfdCByZWFsX3NpemUgPSBsZW4gPCAqc2l6ZSA/IGxlbiA6ICpzaXplOwogICBpZiAocmVhbF9zaXplID4gMCkgewotICAgIEZYU1lTX21lbWNweSgodm9pZCopd3NUZXh0LAotICAgICAgICAgICAgICAgICBic0NwVGV4dC5HZXRCdWZmZXIocmVhbF9zaXplICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSksCi0gICAgICAgICAgICAgICAgIHJlYWxfc2l6ZSAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOworICAgIG1lbWNweSgodm9pZCopd3NUZXh0LAorICAgICAgICAgICBic0NwVGV4dC5HZXRCdWZmZXIocmVhbF9zaXplICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSksCisgICAgICAgICAgIHJlYWxfc2l6ZSAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOwogICAgIGJzQ3BUZXh0LlJlbGVhc2VCdWZmZXIocmVhbF9zaXplICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CiAgIH0KICAgKnNpemUgPSByZWFsX3NpemU7CiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfUGFzdGUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHdzVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBzaXplKSB7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRlBERl9XaWRnZXRfUGFzdGUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREdFVCBoV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyB3c1RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBzaXplKSB7CiAgIGlmICghaFdpZGdldCB8fCAhZG9jdW1lbnQpCiAgICAgcmV0dXJuOwogCiAgIENQREZYRkFfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDUERGWEZBX0NvbnRleHQqPihkb2N1bWVudCk7Ci0gIGlmIChwQ29udGV4dC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX0R5bmFtaWMgJiYKLSAgICAgIHBDb250ZXh0LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfU3RhdGljKQorICBpZiAoIXBDb250ZXh0LT5Db250YWluc1hGQUZvcm0oKSkKICAgICByZXR1cm47CiAKLSAgQ0ZYX1dpZGVTdHJpbmcgd3N0ciA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGMTZMRSh3c1RleHQsIHNpemUpOworICBXaWRlU3RyaW5nIHdzdHIgPSBXaWRlU3RyaW5nOjpGcm9tVVRGMTZMRSh3c1RleHQsIHNpemUpOwogICBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oaFdpZGdldCktPlBhc3RlKHdzdHIpOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMCitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYKIEZQREZfV2lkZ2V0X1JlcGxhY2VTcGVsbENoZWNrV29yZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwKQEAgLTU0NywxOCArNjI3LDE3IEBACiAgICAgcmV0dXJuOwogCiAgIENQREZYRkFfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDUERGWEZBX0NvbnRleHQqPihkb2N1bWVudCk7Ci0gIGlmIChwQ29udGV4dC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX0R5bmFtaWMgJiYKLSAgICAgIHBDb250ZXh0LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfU3RhdGljKQorICBpZiAoIXBDb250ZXh0LT5Db250YWluc1hGQUZvcm0oKSkKICAgICByZXR1cm47CiAKICAgQ0ZYX1BvaW50RiBwdFBvcHVwOwogICBwdFBvcHVwLnggPSB4OwogICBwdFBvcHVwLnkgPSB5OwotICBDRlhfQnl0ZVN0cmluZ0MgYnMoYnNUZXh0KTsKKyAgQnl0ZVN0cmluZ1ZpZXcgYnMoYnNUZXh0KTsKICAgc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5SZXBsYWNlU3BlbGxDaGVja1dvcmQocHRQb3B1cCwgYnMpOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMCitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYKIEZQREZfV2lkZ2V0X0dldFNwZWxsQ2hlY2tXb3JkcyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwKQEAgLTU2NywyNiArNjQ2LDI4IEBACiAgIGlmICghaFdpZGdldCB8fCAhZG9jdW1lbnQpCiAgICAgcmV0dXJuOwogCi0gIENQREZYRkFfQ29udGV4dCogcENvbnRleHQgPSBzdGF0aWNfY2FzdDxDUERGWEZBX0NvbnRleHQqPihkb2N1bWVudCk7Ci0gIGlmIChwQ29udGV4dC0+R2V0RG9jVHlwZSgpICE9IFhGQV9ET0NUWVBFX0R5bmFtaWMgJiYKLSAgICAgIHBDb250ZXh0LT5HZXREb2NUeXBlKCkgIT0gWEZBX0RPQ1RZUEVfU3RhdGljKQorICBhdXRvKiBwQ29udGV4dCA9IHN0YXRpY19jYXN0PENQREZYRkFfQ29udGV4dCo+KGRvY3VtZW50KTsKKyAgaWYgKCFwQ29udGV4dC0+Q29udGFpbnNYRkFGb3JtKCkpCiAgICAgcmV0dXJuOwogCi0gIHN0ZDo6dmVjdG9yPENGWF9CeXRlU3RyaW5nPiogc1N1Z2dlc3RXb3JkcyA9IG5ldyBzdGQ6OnZlY3RvcjxDRlhfQnl0ZVN0cmluZz47CiAgIENGWF9Qb2ludEYgcHRQb3B1cDsKICAgcHRQb3B1cC54ID0geDsKICAgcHRQb3B1cC55ID0geTsKLSAgc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpCi0gICAgICAtPkdldFN1Z2dlc3RXb3JkcyhwdFBvcHVwLCAqc1N1Z2dlc3RXb3Jkcyk7Ci0gICpzdHJpbmdIYW5kbGUgPSBUb0ZQREZTdHJpbmdIYW5kbGUoc1N1Z2dlc3RXb3Jkcyk7CisgIGF1dG8gc1N1Z2dlc3RXb3JkcyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxzdGQ6OnZlY3RvcjxCeXRlU3RyaW5nPj4oKTsKKyAgc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KGhXaWRnZXQpLT5HZXRTdWdnZXN0V29yZHMocHRQb3B1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1N1Z2dlc3RXb3Jkcy5nZXQoKSk7CisKKyAgLy8gQ2FsbGVyIHRha2VzIG93bmVyc2hpcC4KKyAgKnN0cmluZ0hhbmRsZSA9IFRvRlBERlN0cmluZ0hhbmRsZShzU3VnZ2VzdFdvcmRzLnJlbGVhc2UoKSk7CiB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGX1N0cmluZ0hhbmRsZUNvdW50cyhGUERGX1NUUklOR0hBTkRMRSBzSGFuZGxlKSB7Ci0gIHN0ZDo6dmVjdG9yPENGWF9CeXRlU3RyaW5nPiogc1N1Z2dlc3RXb3JkcyA9IEZyb21GUERGU3RyaW5nSGFuZGxlKHNIYW5kbGUpOworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYKK0ZQREZfU3RyaW5nSGFuZGxlQ291bnRzKEZQREZfU1RSSU5HSEFORExFIHNIYW5kbGUpIHsKKyAgc3RkOjp2ZWN0b3I8Qnl0ZVN0cmluZz4qIHNTdWdnZXN0V29yZHMgPSBGcm9tRlBERlN0cmluZ0hhbmRsZShzSGFuZGxlKTsKICAgcmV0dXJuIHNTdWdnZXN0V29yZHMgPyBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludD4oKnNTdWdnZXN0V29yZHMpIDogLTE7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTAorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKIEZQREZfU3RyaW5nSGFuZGxlR2V0U3RyaW5nQnlJbmRleChGUERGX1NUUklOR0hBTkRMRSBzSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgYnNUZXh0LApAQCAtNTk4LDcgKzY3OSw3IEBACiAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gY291bnQpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIHN0ZDo6dmVjdG9yPENGWF9CeXRlU3RyaW5nPiogc1N1Z2dlc3RXb3JkcyA9IEZyb21GUERGU3RyaW5nSGFuZGxlKHNIYW5kbGUpOworICBzdGQ6OnZlY3RvcjxCeXRlU3RyaW5nPiogc1N1Z2dlc3RXb3JkcyA9IEZyb21GUERGU3RyaW5nSGFuZGxlKHNIYW5kbGUpOwogICB1aW50MzJfdCBsZW4gPSAoKnNTdWdnZXN0V29yZHMpW2luZGV4XS5HZXRMZW5ndGgoKTsKICAgaWYgKCFic1RleHQpIHsKICAgICAqc2l6ZSA9IGxlbjsKQEAgLTYwNyw1NyArNjg4LDY3IEBACiAKICAgdWludDMyX3QgcmVhbF9zaXplID0gbGVuIDwgKnNpemUgPyBsZW4gOiAqc2l6ZTsKICAgaWYgKHJlYWxfc2l6ZSA+IDApCi0gICAgRlhTWVNfbWVtY3B5KCh2b2lkKilic1RleHQsICgqc1N1Z2dlc3RXb3JkcylbaW5kZXhdLmNfc3RyKCksIHJlYWxfc2l6ZSk7CisgICAgbWVtY3B5KCh2b2lkKilic1RleHQsICgqc1N1Z2dlc3RXb3JkcylbaW5kZXhdLmNfc3RyKCksIHJlYWxfc2l6ZSk7CiAgICpzaXplID0gcmVhbF9zaXplOwogICByZXR1cm4gdHJ1ZTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTAorRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WCiBGUERGX1N0cmluZ0hhbmRsZVJlbGVhc2UoRlBERl9TVFJJTkdIQU5ETEUgc3RyaW5nSGFuZGxlKSB7CiAgIGRlbGV0ZSBGcm9tRlBERlN0cmluZ0hhbmRsZShzdHJpbmdIYW5kbGUpOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCiBGUERGX1N0cmluZ0hhbmRsZUFkZFN0cmluZyhGUERGX1NUUklOR0hBTkRMRSBzdHJpbmdIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgYnNUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBzaXplKSB7CiAgIGlmICghc3RyaW5nSGFuZGxlIHx8ICFic1RleHQgfHwgc2l6ZSA9PSAwKQogICAgIHJldHVybiBmYWxzZTsKIAotICBGcm9tRlBERlN0cmluZ0hhbmRsZShzdHJpbmdIYW5kbGUpLT5wdXNoX2JhY2soQ0ZYX0J5dGVTdHJpbmcoYnNUZXh0LCBzaXplKSk7CisgIEZyb21GUERGU3RyaW5nSGFuZGxlKHN0cmluZ0hhbmRsZSktPnB1c2hfYmFjayhCeXRlU3RyaW5nKGJzVGV4dCwgc2l6ZSkpOwogICByZXR1cm4gdHJ1ZTsKIH0KICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1NldEZvcm1GaWVsZEhpZ2hsaWdodENvbG9yKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb2xvcikgewotICBpZiAoQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBGb3JtSGFuZGxlVG9JbnRlckZvcm0oaEhhbmRsZSkpCi0gICAgcEludGVyRm9ybS0+U2V0SGlnaGxpZ2h0Q29sb3IoY29sb3IsIGZpZWxkVHlwZSk7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYKK0ZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0Q29sb3IoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgY29sb3IpIHsKKyAgQ1BERlNES19JbnRlckZvcm0qIGludGVyRm9ybSA9IEZvcm1IYW5kbGVUb0ludGVyRm9ybShoSGFuZGxlKTsKKyAgaWYgKCFpbnRlckZvcm0pCisgICAgcmV0dXJuOworCisgIE9wdGlvbmFsPEZvcm1GaWVsZFR5cGU+IGNhc3RfaW5wdXQgPSBJbnRUb0Zvcm1GaWVsZFR5cGUoZmllbGRUeXBlKTsKKyAgaWYgKCFjYXN0X2lucHV0KQorICAgIHJldHVybjsKKworICBpZiAoY2FzdF9pbnB1dC52YWx1ZSgpID09IEZvcm1GaWVsZFR5cGU6OmtVbmtub3duKSB7CisgICAgaW50ZXJGb3JtLT5TZXRBbGxIaWdobGlnaHRDb2xvcnMoY29sb3IpOworICB9IGVsc2UgeworICAgIGludGVyRm9ybS0+U2V0SGlnaGxpZ2h0Q29sb3IoY29sb3IsIGNhc3RfaW5wdXQudmFsdWUoKSk7CisgIH0KIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1NldEZvcm1GaWVsZEhpZ2hsaWdodEFscGhhKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYWxwaGEpIHsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OVgorRlBERl9TZXRGb3JtRmllbGRIaWdobGlnaHRBbHBoYShGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwgdW5zaWduZWQgY2hhciBhbHBoYSkgewogICBpZiAoQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBGb3JtSGFuZGxlVG9JbnRlckZvcm0oaEhhbmRsZSkpCiAgICAgcEludGVyRm9ybS0+U2V0SGlnaGxpZ2h0QWxwaGEoYWxwaGEpOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfUmVtb3ZlRm9ybUZpZWxkSGlnaGxpZ2h0KEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKSB7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYKK0ZQREZfUmVtb3ZlRm9ybUZpZWxkSGlnaGxpZ2h0KEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKSB7CiAgIGlmIChDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IEZvcm1IYW5kbGVUb0ludGVyRm9ybShoSGFuZGxlKSkKLSAgICBwSW50ZXJGb3JtLT5SZW1vdmVBbGxIaWdoTGlnaHQoKTsKKyAgICBwSW50ZXJGb3JtLT5SZW1vdmVBbGxIaWdoTGlnaHRzKCk7CiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9PbkFmdGVyTG9hZFBhZ2UoRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKSB7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRk9STV9PbkFmdGVyTG9hZFBhZ2UoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GT1JNSEFORExFIGhIYW5kbGUpIHsKICAgaWYgKENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IEZvcm1IYW5kbGVUb1BhZ2VWaWV3KGhIYW5kbGUsIHBhZ2UpKQogICAgIHBQYWdlVmlldy0+U2V0VmFsaWQodHJ1ZSk7CiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9PbkJlZm9yZUNsb3NlUGFnZShGUERGX1BBR0UgcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkgewotICBpZiAoIWhIYW5kbGUpCi0gICAgcmV0dXJuOwotCitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRk9STV9PbkJlZm9yZUNsb3NlUGFnZShGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKSB7CiAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52ID0KICAgICAgIEhhbmRsZVRvQ1BERlNES0Vudmlyb25tZW50KGhIYW5kbGUpOwogICBpZiAoIXBGb3JtRmlsbEVudikKQEAgLTY3NSw0OCArNzY2LDQ3IEBACiAgIH0KIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGT1JNX0RvRG9jdW1lbnRKU0FjdGlvbihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkgeworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WCitGT1JNX0RvRG9jdW1lbnRKU0FjdGlvbihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkgewogICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiA9CiAgICAgICBIYW5kbGVUb0NQREZTREtFbnZpcm9ubWVudChoSGFuZGxlKTsKICAgaWYgKHBGb3JtRmlsbEVudiAmJiBwRm9ybUZpbGxFbnYtPklzSlNJbml0aWF0ZWQoKSkKICAgICBwRm9ybUZpbGxFbnYtPlByb2NKYXZhc2NyaXB0RnVuKCk7CiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9Eb0RvY3VtZW50T3BlbkFjdGlvbihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSkgeworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WCitGT1JNX0RvRG9jdW1lbnRPcGVuQWN0aW9uKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKSB7CiAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52ID0KICAgICAgIEhhbmRsZVRvQ1BERlNES0Vudmlyb25tZW50KGhIYW5kbGUpOwogICBpZiAocEZvcm1GaWxsRW52ICYmIHBGb3JtRmlsbEVudi0+SXNKU0luaXRpYXRlZCgpKQogICAgIHBGb3JtRmlsbEVudi0+UHJvY09wZW5BY3Rpb24oKTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGT1JNX0RvRG9jdW1lbnRBQWN0aW9uKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhYVR5cGUpIHsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGT1JNX0RvRG9jdW1lbnRBQWN0aW9uKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFhVHlwZSkgewogICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiA9CiAgICAgICBIYW5kbGVUb0NQREZTREtFbnZpcm9ubWVudChoSGFuZGxlKTsKICAgaWYgKCFwRm9ybUZpbGxFbnYpCiAgICAgcmV0dXJuOwogCiAgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBwRm9ybUZpbGxFbnYtPkdldFBERkRvY3VtZW50KCk7Ci0gIENQREZfRGljdGlvbmFyeSogcERpYyA9IHBEb2MtPkdldFJvb3QoKTsKLSAgaWYgKCFwRGljKQorICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcERvYy0+R2V0Um9vdCgpOworICBpZiAoIXBEaWN0KQogICAgIHJldHVybjsKIAotICBDUERGX0FBY3Rpb24gYWEocERpYy0+R2V0RGljdEZvcigiQUEiKSk7Ci0gIGlmIChhYS5BY3Rpb25FeGlzdCgoQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSlhYVR5cGUpKSB7Ci0gICAgQ1BERl9BY3Rpb24gYWN0aW9uID0gYWEuR2V0QWN0aW9uKChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlKWFhVHlwZSk7CisgIENQREZfQUFjdGlvbiBhYShwRGljdC0+R2V0RGljdEZvcigiQUEiKSk7CisgIGF1dG8gdHlwZSA9IHN0YXRpY19jYXN0PENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGU+KGFhVHlwZSk7CisgIGlmIChhYS5BY3Rpb25FeGlzdCh0eXBlKSkgeworICAgIENQREZfQWN0aW9uIGFjdGlvbiA9IGFhLkdldEFjdGlvbih0eXBlKTsKICAgICBDUERGU0RLX0FjdGlvbkhhbmRsZXIqIHBBY3Rpb25IYW5kbGVyID0KLSAgICAgICAgSGFuZGxlVG9DUERGU0RLRW52aXJvbm1lbnQoaEhhbmRsZSktPkdldEFjdGlvbkhhbmRlcigpOwotICAgIHBBY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9Eb2N1bWVudChhY3Rpb24sIChDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlKWFhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWxsRW52KTsKKyAgICAgICAgSGFuZGxlVG9DUERGU0RLRW52aXJvbm1lbnQoaEhhbmRsZSktPkdldEFjdGlvbkhhbmRsZXIoKTsKKyAgICBwQWN0aW9uSGFuZGxlci0+RG9BY3Rpb25fRG9jdW1lbnQoYWN0aW9uLCB0eXBlLCBwRm9ybUZpbGxFbnYpOwogICB9CiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9Eb1BhZ2VBQWN0aW9uKEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWFUeXBlKSB7Ci0gIGlmICghaEhhbmRsZSkKLSAgICByZXR1cm47Ci0KK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGT1JNX0RvUGFnZUFBY3Rpb24oRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWFUeXBlKSB7CiAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52ID0KICAgICAgIEhhbmRsZVRvQ1BERlNES0Vudmlyb25tZW50KGhIYW5kbGUpOwogICBpZiAoIXBGb3JtRmlsbEVudikKQEAgLTczMCwyMCArODIwLDE0IEBACiAgIGlmICghcEZvcm1GaWxsRW52LT5HZXRQYWdlVmlldyhwUGFnZSwgZmFsc2UpKQogICAgIHJldHVybjsKIAotICBDUERGU0RLX0FjdGlvbkhhbmRsZXIqIHBBY3Rpb25IYW5kbGVyID0gcEZvcm1GaWxsRW52LT5HZXRBY3Rpb25IYW5kZXIoKTsKLSAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBwUERGUGFnZS0+bV9wRm9ybURpY3Q7CisgIENQREZTREtfQWN0aW9uSGFuZGxlciogcEFjdGlvbkhhbmRsZXIgPSBwRm9ybUZpbGxFbnYtPkdldEFjdGlvbkhhbmRsZXIoKTsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBwUERGUGFnZS0+bV9wRm9ybURpY3QuR2V0KCk7CiAgIENQREZfQUFjdGlvbiBhYShwUGFnZURpY3QtPkdldERpY3RGb3IoIkFBIikpOwotICBpZiAoRlBERlBBR0VfQUFDVElPTl9PUEVOID09IGFhVHlwZSkgewotICAgIGlmIChhYS5BY3Rpb25FeGlzdChDUERGX0FBY3Rpb246Ok9wZW5QYWdlKSkgewotICAgICAgQ1BERl9BY3Rpb24gYWN0aW9uID0gYWEuR2V0QWN0aW9uKENQREZfQUFjdGlvbjo6T3BlblBhZ2UpOwotICAgICAgcEFjdGlvbkhhbmRsZXItPkRvQWN0aW9uX1BhZ2UoYWN0aW9uLCBDUERGX0FBY3Rpb246Ok9wZW5QYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWxsRW52KTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGFhLkFjdGlvbkV4aXN0KENQREZfQUFjdGlvbjo6Q2xvc2VQYWdlKSkgewotICAgICAgQ1BERl9BY3Rpb24gYWN0aW9uID0gYWEuR2V0QWN0aW9uKENQREZfQUFjdGlvbjo6Q2xvc2VQYWdlKTsKLSAgICAgIHBBY3Rpb25IYW5kbGVyLT5Eb0FjdGlvbl9QYWdlKGFjdGlvbiwgQ1BERl9BQWN0aW9uOjpDbG9zZVBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybUZpbGxFbnYpOwotICAgIH0KKyAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlID0gYWFUeXBlID09IEZQREZQQUdFX0FBQ1RJT05fT1BFTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBDUERGX0FBY3Rpb246Ok9wZW5QYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENQREZfQUFjdGlvbjo6Q2xvc2VQYWdlOworICBpZiAoYWEuQWN0aW9uRXhpc3QodHlwZSkpIHsKKyAgICBDUERGX0FjdGlvbiBhY3Rpb24gPSBhYS5HZXRBY3Rpb24odHlwZSk7CisgICAgcEFjdGlvbkhhbmRsZXItPkRvQWN0aW9uX1BhZ2UoYWN0aW9uLCB0eXBlLCBwRm9ybUZpbGxFbnYpOwogICB9CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZmb3JtZmlsbF9lbWJlZGRlcnRlc3QuY3BwIGIvZnBkZnNkay9mcGRmZm9ybWZpbGxfZW1iZWRkZXJ0ZXN0LmNwcAppbmRleCA0N2YxYTc1Li5hZTFjMDJlIDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZwZGZmb3JtZmlsbF9lbWJlZGRlcnRlc3QuY3BwCisrKyBiL2ZwZGZzZGsvZnBkZmZvcm1maWxsX2VtYmVkZGVydGVzdC5jcHAKQEAgLTIsNyArMiwxNiBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJwdWJsaWMvY3BwL2ZwZGZfZGVsZXRlcnMuaCIKICNpbmNsdWRlICJwdWJsaWMvZnBkZl9mb3JtZmlsbC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2Z3bGV2ZW50LmgiCiAjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCiAjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0X21vY2tfZGVsZWdhdGUuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2VtYmVkZGVyX3Rlc3RfdGltZXJfaGFuZGxpbmdfZGVsZWdhdGUuaCIKQEAgLTEwLDkgKzE5LDI5MSBAQAogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogCiB1c2luZyB0ZXN0aW5nOjpfOwotdXNpbmcgdGVzdGluZzo6UmV0dXJuOwogCi1jbGFzcyBGUERGRm9ybUZpbGxFbWJlZGRlcnRlc3QgOiBwdWJsaWMgRW1iZWRkZXJUZXN0IHt9OwordXNpbmcgRlBERkZvcm1GaWxsRW1iZWRkZXJ0ZXN0ID0gRW1iZWRkZXJUZXN0OworCisvLyBBIGJhc2UgY2xhc3MgZm9yIG1hbnkgcmVsYXRlZCB0ZXN0cyB0aGF0IGludm9sdmUgY2xpY2tpbmcgYW5kIHR5cGluZyBpbnRvCisvLyBmb3JtIGZpZWxkcy4KK2NsYXNzIEZQREZGb3JtRmlsbEludGVyYWN0aXZlRW1iZWRkZXJ0ZXN0IDogcHVibGljIEZQREZGb3JtRmlsbEVtYmVkZGVydGVzdCB7CisgcHJvdGVjdGVkOgorICBGUERGRm9ybUZpbGxJbnRlcmFjdGl2ZUVtYmVkZGVydGVzdCgpID0gZGVmYXVsdDsKKyAgfkZQREZGb3JtRmlsbEludGVyYWN0aXZlRW1iZWRkZXJ0ZXN0KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgRlBERkZvcm1GaWxsRW1iZWRkZXJ0ZXN0OjpTZXRVcCgpOworICAgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudChHZXREb2N1bWVudE5hbWUoKSkpOworICAgIHBhZ2VfID0gTG9hZFBhZ2UoMCk7CisgICAgQVNTRVJUX1RSVUUocGFnZV8pOworICAgIEZvcm1TYW5pdHlDaGVja3MoKTsKKyAgfQorCisgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgVW5sb2FkUGFnZShwYWdlXyk7CisgICAgRlBERkZvcm1GaWxsRW1iZWRkZXJ0ZXN0OjpUZWFyRG93bigpOworICB9CisKKyAgLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgUERGIHRvIHVzZS4KKyAgdmlydHVhbCBjb25zdCBjaGFyKiBHZXREb2N1bWVudE5hbWUoKSBjb25zdCA9IDA7CisKKyAgLy8gUmV0dXJucyB0aGUgdHlwZSBvZiBmaWVsZChzKSBpbiB0aGUgUERGLgorICB2aXJ0dWFsIGludCBHZXRGb3JtVHlwZSgpIGNvbnN0ID0gMDsKKworICAvLyBPcHRpb25hbGx5IGRvIHNvbWUgc2FuaXR5IGNoZWNrIG9uIHRoZSBkb2N1bWVudCBhZnRlciBsb2FkaW5nLgorICB2aXJ0dWFsIHZvaWQgRm9ybVNhbml0eUNoZWNrcygpIHt9CisKKyAgRlBERl9QQUdFIHBhZ2UoKSB7IHJldHVybiBwYWdlXzsgfQorCisgIGludCBHZXRGb3JtVHlwZUF0UG9pbnQoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKKyAgICByZXR1cm4gRlBERlBhZ2VfSGFzRm9ybUZpZWxkQXRQb2ludChmb3JtX2hhbmRsZSgpLCBwYWdlXywgcG9pbnQueCwgcG9pbnQueSk7CisgIH0KKworICB2b2lkIENsaWNrT25Gb3JtRmllbGRBdFBvaW50KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgICAgLy8gQ2xpY2sgb24gdGhlIHRleHQgZmllbGQgb3IgY29tYm9ib3ggYXMgc3BlY2lmaWVkIGJ5IGNvb3JkaW5hdGVzLgorICAgIEZPUk1fT25Nb3VzZU1vdmUoZm9ybV9oYW5kbGUoKSwgcGFnZV8sIDAsIHBvaW50LngsIHBvaW50LnkpOworICAgIEZPUk1fT25MQnV0dG9uRG93bihmb3JtX2hhbmRsZSgpLCBwYWdlXywgMCwgcG9pbnQueCwgcG9pbnQueSk7CisgICAgRk9STV9PbkxCdXR0b25VcChmb3JtX2hhbmRsZSgpLCBwYWdlXywgMCwgcG9pbnQueCwgcG9pbnQueSk7CisgIH0KKworICB2b2lkIFR5cGVUZXh0SW50b1RleHRGaWVsZChpbnQgbnVtX2NoYXJzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICAgIEVYUEVDVF9FUShHZXRGb3JtVHlwZSgpLCBHZXRGb3JtVHlwZUF0UG9pbnQocG9pbnQpKTsKKyAgICBDbGlja09uRm9ybUZpZWxkQXRQb2ludChwb2ludCk7CisKKyAgICAvLyBUeXBlIHRleHQgc3RhcnRpbmcgd2l0aCAnQScgdG8gYXMgbWFueSBjaGFycyBhcyBzcGVjaWZpZWQgYnkgfG51bV9jaGFyc3wuCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fY2hhcnM7ICsraSkgeworICAgICAgRk9STV9PbkNoYXIoZm9ybV9oYW5kbGUoKSwgcGFnZV8sICdBJyArIGksIDApOworICAgIH0KKyAgfQorCisgIC8vIE5hdmlnYXRlcyB0byB0ZXh0IGZpZWxkIHVzaW5nIHRoZSBtb3VzZSBhbmQgdGhlbiBzZWxlY3RzIHRleHQgdmlhIHRoZQorICAvLyBzaGlmdCBhbmQgc3BlY2ZpZWQgbGVmdCBvciByaWdodCBhcnJvdyBrZXkuCisgIHZvaWQgU2VsZWN0VGV4dFdpdGhLZXlib2FyZChpbnQgbnVtX2NoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFycm93X2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgICAgLy8gTmF2aWdhdGUgdG8gc3RhcnRpbmcgcG9zaXRpb24gZm9yIHNlbGVjdGlvbi4KKyAgICBDbGlja09uRm9ybUZpZWxkQXRQb2ludChwb2ludCk7CisKKyAgICAvLyBIb2xkIGRvd24gc2hpZnQgKGFuZCBkb24ndCByZWxlYXNlIHVudGlsIGVudGlyZSB0ZXh0IGlzIHNlbGVjdGVkKS4KKyAgICBGT1JNX09uS2V5RG93bihmb3JtX2hhbmRsZSgpLCBwYWdlXywgRldMX1ZLRVlfU2hpZnQsIDApOworCisgICAgLy8gU2VsZWN0IHRleHQgY2hhciBieSBjaGFyIHZpYSBsZWZ0IG9yIHJpZ2h0IGFycm93IGtleS4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9jaGFyczsgKytpKSB7CisgICAgICBGT1JNX09uS2V5RG93bihmb3JtX2hhbmRsZSgpLCBwYWdlXywgYXJyb3dfa2V5LCBGV0xfRVZFTlRGTEFHX1NoaWZ0S2V5KTsKKyAgICAgIEZPUk1fT25LZXlVcChmb3JtX2hhbmRsZSgpLCBwYWdlXywgYXJyb3dfa2V5LCBGV0xfRVZFTlRGTEFHX1NoaWZ0S2V5KTsKKyAgICB9CisgICAgRk9STV9PbktleVVwKGZvcm1faGFuZGxlKCksIHBhZ2VfLCBGV0xfVktFWV9TaGlmdCwgMCk7CisgIH0KKworICAvLyBVc2VzIHRoZSBtb3VzZSB0byBuYXZpZ2F0ZSB0byB0ZXh0IGZpZWxkIGFuZCBzZWxlY3QgdGV4dC4KKyAgdm9pZCBTZWxlY3RUZXh0V2l0aE1vdXNlKGNvbnN0IENGWF9Qb2ludEYmIHN0YXJ0LCBjb25zdCBDRlhfUG9pbnRGJiBlbmQpIHsKKyAgICBBU1NFUlQoc3RhcnQueSA9PSBlbmQueSk7CisKKyAgICAvLyBOYXZpZ2F0ZSB0byBzdGFydGluZyBwb3NpdGlvbiBhbmQgY2xpY2sgbW91c2UuCisgICAgRk9STV9Pbk1vdXNlTW92ZShmb3JtX2hhbmRsZSgpLCBwYWdlXywgMCwgc3RhcnQueCwgc3RhcnQueSk7CisgICAgRk9STV9PbkxCdXR0b25Eb3duKGZvcm1faGFuZGxlKCksIHBhZ2VfLCAwLCBzdGFydC54LCBzdGFydC55KTsKKworICAgIC8vIEhvbGQgZG93biBtb3VzZSB1bnRpbCByZWFjaCBlbmQgb2YgZGVzaXJlZCBzZWxlY3Rpb24uCisgICAgRk9STV9Pbk1vdXNlTW92ZShmb3JtX2hhbmRsZSgpLCBwYWdlXywgMCwgZW5kLngsIGVuZC55KTsKKyAgICBGT1JNX09uTEJ1dHRvblVwKGZvcm1faGFuZGxlKCksIHBhZ2VfLCAwLCBlbmQueCwgZW5kLnkpOworICB9CisKKyAgdm9pZCBDaGVja1NlbGVjdGlvbihjb25zdCBXaWRlU3RyaW5nVmlldyYgZXhwZWN0ZWRfc3RyaW5nKSB7CisgICAgLy8gQ2FsY3VsYXRlIGV4cGVjdGVkIGxlbmd0aCBmb3Igc2VsZWN0ZWQgdGV4dC4KKyAgICBpbnQgbnVtX2NoYXJzID0gZXhwZWN0ZWRfc3RyaW5nLkdldExlbmd0aCgpOworCisgICAgLy8gQ2hlY2sgYWN0dWFsIHNlbGVjdGlvbiBhZ2FpbnN0IGV4cGVjdGVkIHNlbGVjdGlvbi4KKyAgICBjb25zdCB1bnNpZ25lZCBsb25nIGV4cGVjdGVkX2xlbmd0aCA9CisgICAgICAgIHNpemVvZih1bnNpZ25lZCBzaG9ydCkgKiAobnVtX2NoYXJzICsgMSk7CisgICAgdW5zaWduZWQgbG9uZyBzZWxfdGV4dF9sZW4gPQorICAgICAgICBGT1JNX0dldFNlbGVjdGVkVGV4dChmb3JtX2hhbmRsZSgpLCBwYWdlXywgbnVsbHB0ciwgMCk7CisgICAgQVNTRVJUX0VRKGV4cGVjdGVkX2xlbmd0aCwgc2VsX3RleHRfbGVuKTsKKworICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIHNob3J0PiBidWYoc2VsX3RleHRfbGVuKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfbGVuZ3RoLCBGT1JNX0dldFNlbGVjdGVkVGV4dChmb3JtX2hhbmRsZSgpLCBwYWdlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYuZGF0YSgpLCBzZWxfdGV4dF9sZW4pKTsKKworICAgIEVYUEVDVF9FUShleHBlY3RlZF9zdHJpbmcsIFdpZGVTdHJpbmc6OkZyb21VVEYxNkxFKGJ1Zi5kYXRhKCksIG51bV9jaGFycykpOworICB9CisKKyBwcml2YXRlOgorICBGUERGX1BBR0UgcGFnZV8gPSBudWxscHRyOworfTsKKworY2xhc3MgRlBERkZvcm1GaWxsVGV4dEZvcm1FbWJlZGRlcnRlc3QKKyAgICA6IHB1YmxpYyBGUERGRm9ybUZpbGxJbnRlcmFjdGl2ZUVtYmVkZGVydGVzdCB7CisgcHJvdGVjdGVkOgorICBGUERGRm9ybUZpbGxUZXh0Rm9ybUVtYmVkZGVydGVzdCgpID0gZGVmYXVsdDsKKyAgfkZQREZGb3JtRmlsbFRleHRGb3JtRW1iZWRkZXJ0ZXN0KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgIGNvbnN0IGNoYXIqIEdldERvY3VtZW50TmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAvLyBQREYgd2l0aCBzZXZlcmFsIGZvcm0gdGV4dCBmaWVsZHM6CisgICAgLy8gLSAiVGV4dCBCb3giIC0gUmVndWxhciB0ZXh0IGJveCB3aXRoIG5vIHNwZWNpYWwgYXR0cmlidXRlcy4KKyAgICAvLyAtICJSZWFkT25seSIgLSBGZjogMS4KKyAgICAvLyAtICJDaGFyTGltaXQiIC0gTWF4TGVuOiAxMCwgVjogRWxlcGhhbnQuCisgICAgcmV0dXJuICJ0ZXh0X2Zvcm1fbXVsdGlwbGUucGRmIjsKKyAgfQorCisgIGludCBHZXRGb3JtVHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIEZQREZfRk9STUZJRUxEX1RFWFRGSUVMRDsgfQorCisgIHZvaWQgRm9ybVNhbml0eUNoZWNrcygpIG92ZXJyaWRlIHsKKyAgICBFWFBFQ1RfRVEoR2V0Rm9ybVR5cGUoKSwgR2V0Rm9ybVR5cGVBdFBvaW50KENoYXJMaW1pdEZvcm1CZWdpbigpKSk7CisgICAgRVhQRUNUX0VRKEdldEZvcm1UeXBlKCksIEdldEZvcm1UeXBlQXRQb2ludChDaGFyTGltaXRGb3JtRW5kKCkpKTsKKyAgICBFWFBFQ1RfRVEoR2V0Rm9ybVR5cGUoKSwgR2V0Rm9ybVR5cGVBdFBvaW50KFJlZ3VsYXJGb3JtQmVnaW4oKSkpOworICAgIEVYUEVDVF9FUShHZXRGb3JtVHlwZSgpLCBHZXRGb3JtVHlwZUF0UG9pbnQoUmVndWxhckZvcm1FbmQoKSkpOworICB9CisKKyAgdm9pZCBTZWxlY3RBbGxDaGFyTGltaXRGb3JtVGV4dFdpdGhNb3VzZSgpIHsKKyAgICBTZWxlY3RUZXh0V2l0aE1vdXNlKENoYXJMaW1pdEZvcm1FbmQoKSwgQ2hhckxpbWl0Rm9ybUJlZ2luKCkpOworICB9CisKKyAgdm9pZCBTZWxlY3RBbGxSZWd1bGFyRm9ybVRleHRXaXRoTW91c2UoKSB7CisgICAgU2VsZWN0VGV4dFdpdGhNb3VzZShSZWd1bGFyRm9ybUVuZCgpLCBSZWd1bGFyRm9ybUJlZ2luKCkpOworICB9CisKKyAgY29uc3QgQ0ZYX1BvaW50RiYgQ2hhckxpbWl0Rm9ybUJlZ2luKCkgY29uc3QgeworICAgIHN0YXRpYyBjb25zdCBDRlhfUG9pbnRGIHBvaW50ID0gQ2hhckxpbWl0Rm9ybUF0WChrRm9ybUJlZ2luWCk7CisgICAgcmV0dXJuIHBvaW50OworICB9CisKKyAgY29uc3QgQ0ZYX1BvaW50RiYgQ2hhckxpbWl0Rm9ybUVuZCgpIGNvbnN0IHsKKyAgICBzdGF0aWMgY29uc3QgQ0ZYX1BvaW50RiBwb2ludCA9IENoYXJMaW1pdEZvcm1BdFgoa0Zvcm1FbmRYKTsKKyAgICByZXR1cm4gcG9pbnQ7CisgIH0KKworICBjb25zdCBDRlhfUG9pbnRGJiBSZWd1bGFyRm9ybUJlZ2luKCkgY29uc3QgeworICAgIHN0YXRpYyBjb25zdCBDRlhfUG9pbnRGIHBvaW50ID0gUmVndWxhckZvcm1BdFgoa0Zvcm1CZWdpblgpOworICAgIHJldHVybiBwb2ludDsKKyAgfQorCisgIGNvbnN0IENGWF9Qb2ludEYmIFJlZ3VsYXJGb3JtRW5kKCkgY29uc3QgeworICAgIHN0YXRpYyBjb25zdCBDRlhfUG9pbnRGIHBvaW50ID0gUmVndWxhckZvcm1BdFgoa0Zvcm1FbmRYKTsKKyAgICByZXR1cm4gcG9pbnQ7CisgIH0KKworICBzdGF0aWMgQ0ZYX1BvaW50RiBDaGFyTGltaXRGb3JtQXRYKGZsb2F0IHgpIHsKKyAgICBBU1NFUlQoeCA+PSBrRm9ybUJlZ2luWCk7CisgICAgQVNTRVJUKHggPD0ga0Zvcm1FbmRYKTsKKyAgICByZXR1cm4gQ0ZYX1BvaW50Rih4LCBrQ2hhckxpbWl0Rm9ybVkpOworICB9CisKKyAgc3RhdGljIENGWF9Qb2ludEYgUmVndWxhckZvcm1BdFgoZmxvYXQgeCkgeworICAgIEFTU0VSVCh4ID49IGtGb3JtQmVnaW5YKTsKKyAgICBBU1NFUlQoeCA8PSBrRm9ybUVuZFgpOworICAgIHJldHVybiBDRlhfUG9pbnRGKHgsIGtSZWd1bGFyRm9ybVkpOworICB9CisKKyBwcml2YXRlOgorICBzdGF0aWMgY29uc3RleHByIGZsb2F0IGtGb3JtQmVnaW5YID0gMTAyLjA7CisgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQga0Zvcm1FbmRYID0gMTk1LjA7CisgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQga0NoYXJMaW1pdEZvcm1ZID0gNjAuMDsKKyAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBrUmVndWxhckZvcm1ZID0gMTE1LjA7Cit9OworCitjbGFzcyBGUERGRm9ybUZpbGxDb21ib0JveEZvcm1FbWJlZGRlcnRlc3QKKyAgICA6IHB1YmxpYyBGUERGRm9ybUZpbGxJbnRlcmFjdGl2ZUVtYmVkZGVydGVzdCB7CisgcHJvdGVjdGVkOgorICBGUERGRm9ybUZpbGxDb21ib0JveEZvcm1FbWJlZGRlcnRlc3QoKSA9IGRlZmF1bHQ7CisgIH5GUERGRm9ybUZpbGxDb21ib0JveEZvcm1FbWJlZGRlcnRlc3QoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgY29uc3QgY2hhciogR2V0RG9jdW1lbnROYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIC8vIFBERiB3aXRoIGZvcm0gY29tYm9ib3hlczoKKyAgICAvLyAtICJDb21ib19FZGl0YWJsZSIgLSBGZjogMzkzMjE2LCAzIG9wdGlvbnMgd2l0aCBwYWlyIHZhbHVlcy4KKyAgICAvLyAtICJDb21ibzEiIC0gRmY6IDEzMTA3MiwgMyBvcHRpb25zIHdpdGggc2luZ2xlIHZhbHVlcy4KKyAgICAvLyAtICJDb21ib19SZWFkT25seSIgLSBGZjogMTMxMDczLCAzIG9wdGlvbnMgd2l0aCBzaW5nbGUgdmFsdWVzLgorICAgIHJldHVybiAiY29tYm9ib3hfZm9ybS5wZGYiOworICB9CisKKyAgaW50IEdldEZvcm1UeXBlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gRlBERl9GT1JNRklFTERfQ09NQk9CT1g7IH0KKworICB2b2lkIEZvcm1TYW5pdHlDaGVja3MoKSBvdmVycmlkZSB7CisgICAgRVhQRUNUX0VRKEdldEZvcm1UeXBlKCksIEdldEZvcm1UeXBlQXRQb2ludChFZGl0YWJsZUZvcm1CZWdpbigpKSk7CisgICAgRVhQRUNUX0VRKEdldEZvcm1UeXBlKCksIEdldEZvcm1UeXBlQXRQb2ludChFZGl0YWJsZUZvcm1FbmQoKSkpOworICAgIEVYUEVDVF9FUShHZXRGb3JtVHlwZSgpLCBHZXRGb3JtVHlwZUF0UG9pbnQoRWRpdGFibGVGb3JtRHJvcERvd24oKSkpOworICAgIEVYUEVDVF9FUShHZXRGb3JtVHlwZSgpLCBHZXRGb3JtVHlwZUF0UG9pbnQoTm9uRWRpdGFibGVGb3JtQmVnaW4oKSkpOworICAgIEVYUEVDVF9FUShHZXRGb3JtVHlwZSgpLCBHZXRGb3JtVHlwZUF0UG9pbnQoTm9uRWRpdGFibGVGb3JtRW5kKCkpKTsKKyAgICBFWFBFQ1RfRVEoR2V0Rm9ybVR5cGUoKSwgR2V0Rm9ybVR5cGVBdFBvaW50KE5vbkVkaXRhYmxlRm9ybURyb3BEb3duKCkpKTsKKyAgfQorCisgIHZvaWQgU2VsZWN0RWRpdGFibGVGb3JtT3B0aW9uKGludCBpdGVtX2luZGV4KSB7CisgICAgU2VsZWN0T3B0aW9uKGl0ZW1faW5kZXgsIEVkaXRhYmxlRm9ybURyb3BEb3duKCkpOworICB9CisKKyAgdm9pZCBTZWxlY3ROb25FZGl0YWJsZUZvcm1PcHRpb24oaW50IGl0ZW1faW5kZXgpIHsKKyAgICBTZWxlY3RPcHRpb24oaXRlbV9pbmRleCwgTm9uRWRpdGFibGVGb3JtRHJvcERvd24oKSk7CisgIH0KKworICB2b2lkIFNlbGVjdEFsbEVkaXRhYmxlRm9ybVRleHRXaXRoTW91c2UoKSB7CisgICAgU2VsZWN0VGV4dFdpdGhNb3VzZShFZGl0YWJsZUZvcm1FbmQoKSwgRWRpdGFibGVGb3JtQmVnaW4oKSk7CisgIH0KKworICBjb25zdCBDRlhfUG9pbnRGJiBFZGl0YWJsZUZvcm1CZWdpbigpIGNvbnN0IHsKKyAgICBzdGF0aWMgY29uc3QgQ0ZYX1BvaW50RiBwb2ludCA9IEVkaXRhYmxlRm9ybUF0WChrRm9ybUJlZ2luWCk7CisgICAgcmV0dXJuIHBvaW50OworICB9CisKKyAgY29uc3QgQ0ZYX1BvaW50RiYgRWRpdGFibGVGb3JtRW5kKCkgY29uc3QgeworICAgIHN0YXRpYyBjb25zdCBDRlhfUG9pbnRGIHBvaW50ID0gRWRpdGFibGVGb3JtQXRYKGtGb3JtRW5kWCk7CisgICAgcmV0dXJuIHBvaW50OworICB9CisKKyAgY29uc3QgQ0ZYX1BvaW50RiYgRWRpdGFibGVGb3JtRHJvcERvd24oKSBjb25zdCB7CisgICAgc3RhdGljIGNvbnN0IENGWF9Qb2ludEYgcG9pbnQoa0Zvcm1Ecm9wRG93blgsIGtFZGl0YWJsZUZvcm1ZKTsKKyAgICByZXR1cm4gcG9pbnQ7CisgIH0KKworICBjb25zdCBDRlhfUG9pbnRGJiBOb25FZGl0YWJsZUZvcm1CZWdpbigpIGNvbnN0IHsKKyAgICBzdGF0aWMgY29uc3QgQ0ZYX1BvaW50RiBwb2ludCA9IE5vbkVkaXRhYmxlRm9ybUF0WChrRm9ybUJlZ2luWCk7CisgICAgcmV0dXJuIHBvaW50OworICB9CisKKyAgY29uc3QgQ0ZYX1BvaW50RiYgTm9uRWRpdGFibGVGb3JtRW5kKCkgY29uc3QgeworICAgIHN0YXRpYyBjb25zdCBDRlhfUG9pbnRGIHBvaW50ID0gTm9uRWRpdGFibGVGb3JtQXRYKGtGb3JtRW5kWCk7CisgICAgcmV0dXJuIHBvaW50OworICB9CisKKyAgY29uc3QgQ0ZYX1BvaW50RiYgTm9uRWRpdGFibGVGb3JtRHJvcERvd24oKSBjb25zdCB7CisgICAgc3RhdGljIGNvbnN0IENGWF9Qb2ludEYgcG9pbnQoa0Zvcm1Ecm9wRG93blgsIGtOb25FZGl0YWJsZUZvcm1ZKTsKKyAgICByZXR1cm4gcG9pbnQ7CisgIH0KKworICBzdGF0aWMgQ0ZYX1BvaW50RiBFZGl0YWJsZUZvcm1BdFgoZmxvYXQgeCkgeworICAgIEFTU0VSVCh4ID49IGtGb3JtQmVnaW5YKTsKKyAgICBBU1NFUlQoeCA8PSBrRm9ybUVuZFgpOworICAgIHJldHVybiBDRlhfUG9pbnRGKHgsIGtFZGl0YWJsZUZvcm1ZKTsKKyAgfQorCisgIHN0YXRpYyBDRlhfUG9pbnRGIE5vbkVkaXRhYmxlRm9ybUF0WChmbG9hdCB4KSB7CisgICAgQVNTRVJUKHggPj0ga0Zvcm1CZWdpblgpOworICAgIEFTU0VSVCh4IDw9IGtGb3JtRW5kWCk7CisgICAgcmV0dXJuIENGWF9Qb2ludEYoeCwga05vbkVkaXRhYmxlRm9ybVkpOworICB9CisKKyBwcml2YXRlOgorICAvLyBTZWxlY3RzIG9uZSBvZiB0aGUgcHJlLXNlbGVjdGVkIHZhbHVlcyBmcm9tIGEgY29tYm9ib3ggd2l0aCB0aHJlZSBvcHRpb25zLgorICAvLyBPcHRpb25zIGFyZSBzcGVjaWZpZWQgYnkgfGl0ZW1faW5kZXh8LCB3aGljaCBpcyAwLWJhc2VkLgorICB2b2lkIFNlbGVjdE9wdGlvbihpbnQgaXRlbV9pbmRleCwgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKKyAgICAvLyBPbmx5IHJlbGV2YW50IGZvciBjb21ib2JveGVzIHdpdGggdGhyZWUgY2hvaWNlcyBhbmQgdGhlIHNhbWUgZGltZW5zaW9ucworICAgIC8vIGFzIHRob3NlIGluIGNvbWJvYm94X2Zvcm0ucGRmLgorICAgIEFTU0VSVChpdGVtX2luZGV4ID49IDApOworICAgIEFTU0VSVChpdGVtX2luZGV4IDwgMyk7CisKKyAgICAvLyBOYXZpZ2F0ZSB0byBidXR0b24gZm9yIGRyb3AgZG93biBhbmQgY2xpY2sgbW91c2UgdG8gcmV2ZWFsIG9wdGlvbnMuCisgICAgQ2xpY2tPbkZvcm1GaWVsZEF0UG9pbnQocG9pbnQpOworCisgICAgLy8gQ2FsY3VsYXRlIHRvIFktY29vcmRpbmF0ZSBvZiBkcm9wZG93biBvcHRpb24gdG8gYmUgc2VsZWN0ZWQuCisgICAgY29uc3RleHByIGRvdWJsZSBrQ2hvaWNlSGVpZ2h0ID0gMTU7CisgICAgQ0ZYX1BvaW50RiBvcHRpb25fcG9pbnQgPSBwb2ludDsKKyAgICBvcHRpb25fcG9pbnQueSAtPSBrQ2hvaWNlSGVpZ2h0ICogKGl0ZW1faW5kZXggKyAxKTsKKworICAgIC8vIE5hdmlnYXRlIHRvIG9wdGlvbiBhbmQgY2xpY2sgbW91c2UgdG8gc2VsZWN0IGl0LgorICAgIENsaWNrT25Gb3JtRmllbGRBdFBvaW50KG9wdGlvbl9wb2ludCk7CisgIH0KKworICBzdGF0aWMgY29uc3RleHByIGZsb2F0IGtGb3JtQmVnaW5YID0gMTAyLjA7CisgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQga0Zvcm1FbmRYID0gMTgzLjA7CisgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQga0Zvcm1Ecm9wRG93blggPSAxOTIuMDsKKyAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBrRWRpdGFibGVGb3JtWSA9IDYwLjA7CisgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQga05vbkVkaXRhYmxlRm9ybVkgPSAxMTAuMDsKK307CiAKIFRFU1RfRihGUERGRm9ybUZpbGxFbWJlZGRlcnRlc3QsIEZpcnN0VGVzdCkgewogICBFbWJlZGRlclRlc3RNb2NrRGVsZWdhdGUgbW9jazsKQEAgLTE5Niw0ICs0ODcsODg4IEBACiAgIEVYUEVDVF9FUSgwdSwgYWxlcnRzLnNpemUoKSk7CiB9CiAKK1RFU1RfRihGUERGRm9ybUZpbGxFbWJlZGRlcnRlc3QsIEJVR183MDc2NzMpIHsKKyAgRW1iZWRkZXJUZXN0VGltZXJIYW5kbGluZ0RlbGVnYXRlIGRlbGVnYXRlOworICBTZXREZWxlZ2F0ZSgmZGVsZWdhdGUpOworCisgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgiYnVnXzcwNzY3My5wZGYiKSk7CisgIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoMCk7CisgIEVYUEVDVF9UUlVFKHBhZ2UpOworCisgIERvT3BlbkFjdGlvbnMoKTsKKyAgRk9STV9PbkxCdXR0b25Eb3duKGZvcm1faGFuZGxlKCksIHBhZ2UsIDAsIDE0MCwgNTkwKTsKKyAgRk9STV9PbkxCdXR0b25VcChmb3JtX2hhbmRsZSgpLCBwYWdlLCAwLCAxNDAsIDU5MCk7CisgIGRlbGVnYXRlLkFkdmFuY2VUaW1lKDEwMDApOworICBVbmxvYWRQYWdlKHBhZ2UpOworCisgIGNvbnN0IGF1dG8mIGFsZXJ0cyA9IGRlbGVnYXRlLkdldEFsZXJ0cygpOworICBFWFBFQ1RfRVEoMHUsIGFsZXJ0cy5zaXplKCkpOworfQorCitURVNUX0YoRlBERkZvcm1GaWxsRW1iZWRkZXJ0ZXN0LCBCVUdfNzY1Mzg0KSB7CisgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgiYnVnXzc2NTM4NC5wZGYiKSk7CisgIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoMCk7CisgIEVYUEVDVF9UUlVFKHBhZ2UpOworCisgIERvT3BlbkFjdGlvbnMoKTsKKyAgRk9STV9PbkxCdXR0b25Eb3duKGZvcm1faGFuZGxlKCksIHBhZ2UsIDAsIDE0MCwgNTkwKTsKKyAgRk9STV9PbkxCdXR0b25VcChmb3JtX2hhbmRsZSgpLCBwYWdlLCAwLCAxNDAsIDU5MCk7CisgIFVubG9hZFBhZ2UocGFnZSk7Cit9CisKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9WOAorCitURVNUX0YoRlBERkZvcm1GaWxsRW1iZWRkZXJ0ZXN0LCBGb3JtVGV4dCkgeworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXworICBjb25zdCBjaGFyIG1kNV8xW10gPSAiNWYxMWRiZTU3NWZlMTk3YTM3YzNmYjQyMjU1OWY4ZmYiOworICBjb25zdCBjaGFyIG1kNV8yW10gPSAiMzViMWE0YjY3OWVhZmM3NDlhMGI2ZmRhNzUwYzBlOGQiOworICBjb25zdCBjaGFyIG1kNV8zW10gPSAiNjVjNjRhN2MzNTUzODhmNzE5YTc1MmFhMWUyM2Y2ZmUiOworI2Vsc2UKKyAgY29uc3QgY2hhciBtZDVfMVtdID0gImI4OTA5NTBkNGI5YmMxNjNiMWE5Njc5N2YzMDA0YjUzIjsKKyAgY29uc3QgY2hhciBtZDVfMltdID0gIjExNDg3ZDU1OTc1OTlhMjZlODkxMmI5YzFkOTQyMmNiIjsKKyAgY29uc3QgY2hhciBtZDVfM1tdID0gImJmZmUwZWNlYTlhNTMzZjIxNzA0N2VlNDFkNmJlNDY2IjsKKyNlbmRpZgorICB7CisgICAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJ0ZXh0X2Zvcm0ucGRmIikpOworICAgIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoMCk7CisgICAgQVNTRVJUX1RSVUUocGFnZSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPHZvaWQsIEZQREZCaXRtYXBEZWxldGVyPiBiaXRtYXAxKFJlbmRlclBhZ2UocGFnZSkpOworICAgIENvbXBhcmVCaXRtYXAoYml0bWFwMS5nZXQoKSwgMzAwLCAzMDAsIG1kNV8xKTsKKworICAgIC8vIENsaWNrIG9uIHRoZSB0ZXh0ZmllbGQKKyAgICBFWFBFQ1RfRVEoRlBERl9GT1JNRklFTERfVEVYVEZJRUxELAorICAgICAgICAgICAgICBGUERGUGFnZV9IYXNGb3JtRmllbGRBdFBvaW50KGZvcm1faGFuZGxlKCksIHBhZ2UsIDEyMC4wLCAxMjAuMCkpOworICAgIEZPUk1fT25Nb3VzZU1vdmUoZm9ybV9oYW5kbGUoKSwgcGFnZSwgMCwgMTIwLjAsIDEyMC4wKTsKKyAgICBGT1JNX09uTEJ1dHRvbkRvd24oZm9ybV9oYW5kbGUoKSwgcGFnZSwgMCwgMTIwLjAsIDEyMC4wKTsKKyAgICBGT1JNX09uTEJ1dHRvblVwKGZvcm1faGFuZGxlKCksIHBhZ2UsIDAsIDEyMC4wLCAxMjAuMCk7CisKKyAgICAvLyBXcml0ZSAiQUJDIgorICAgIEZPUk1fT25DaGFyKGZvcm1faGFuZGxlKCksIHBhZ2UsIDY1LCAwKTsKKyAgICBGT1JNX09uQ2hhcihmb3JtX2hhbmRsZSgpLCBwYWdlLCA2NiwgMCk7CisgICAgRk9STV9PbkNoYXIoZm9ybV9oYW5kbGUoKSwgcGFnZSwgNjcsIDApOworICAgIHN0ZDo6dW5pcXVlX3B0cjx2b2lkLCBGUERGQml0bWFwRGVsZXRlcj4gYml0bWFwMihSZW5kZXJQYWdlKHBhZ2UpKTsKKyAgICBDb21wYXJlQml0bWFwKGJpdG1hcDIuZ2V0KCksIDMwMCwgMzAwLCBtZDVfMik7CisKKyAgICAvLyBUYWtlIG91dCBmb2N1cyBieSBjbGlja2luZyBvdXQgb2YgdGhlIHRleHRmaWVsZAorICAgIEZPUk1fT25Nb3VzZU1vdmUoZm9ybV9oYW5kbGUoKSwgcGFnZSwgMCwgMTUuMCwgMTUuMCk7CisgICAgRk9STV9PbkxCdXR0b25Eb3duKGZvcm1faGFuZGxlKCksIHBhZ2UsIDAsIDE1LjAsIDE1LjApOworICAgIEZPUk1fT25MQnV0dG9uVXAoZm9ybV9oYW5kbGUoKSwgcGFnZSwgMCwgMTUuMCwgMTUuMCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPHZvaWQsIEZQREZCaXRtYXBEZWxldGVyPiBiaXRtYXAzKFJlbmRlclBhZ2UocGFnZSkpOworICAgIENvbXBhcmVCaXRtYXAoYml0bWFwMy5nZXQoKSwgMzAwLCAzMDAsIG1kNV8zKTsKKworICAgIEVYUEVDVF9UUlVFKEZQREZfU2F2ZUFzQ29weShkb2N1bWVudCgpLCB0aGlzLCAwKSk7CisKKyAgICAvLyBDbG9zZSBwYWdlCisgICAgVW5sb2FkUGFnZShwYWdlKTsKKyAgfQorICAvLyBDaGVjayBzYXZlZCBkb2N1bWVudAorICBWZXJpZnlTYXZlZERvY3VtZW50KDMwMCwgMzAwLCBtZDVfMyk7Cit9CisKK1RFU1RfRihGUERGRm9ybUZpbGxFbWJlZGRlcnRlc3QsIEhhc0Zvcm1JbmZvTm9uZSkgeworICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoImhlbGxvX3dvcmxkLnBkZiIpKTsKKyAgRVhQRUNUX0VRKEZPUk1UWVBFX05PTkUsIEZQREZfR2V0Rm9ybVR5cGUoZG9jdW1lbnRfKSk7Cit9CisKK1RFU1RfRihGUERGRm9ybUZpbGxFbWJlZGRlcnRlc3QsIEhhc0Zvcm1JbmZvQWNyb0Zvcm0pIHsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJ0ZXh0X2Zvcm0ucGRmIikpOworICBFWFBFQ1RfRVEoRk9STVRZUEVfQUNST19GT1JNLCBGUERGX0dldEZvcm1UeXBlKGRvY3VtZW50XykpOworfQorCitURVNUX0YoRlBERkZvcm1GaWxsRW1iZWRkZXJ0ZXN0LCBIYXNGb3JtSW5mb1hGQUZ1bGwpIHsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKyAgRVhQRUNUX0VRKEZPUk1UWVBFX1hGQV9GVUxMLCBGUERGX0dldEZvcm1UeXBlKGRvY3VtZW50XykpOworfQorCitURVNUX0YoRlBERkZvcm1GaWxsRW1iZWRkZXJ0ZXN0LCBIYXNGb3JtSW5mb1hGQUZvcmVncm91bmQpIHsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJidWdfMjE2LnBkZiIpKTsKKyAgRVhQRUNUX0VRKEZPUk1UWVBFX1hGQV9GT1JFR1JPVU5ELCBGUERGX0dldEZvcm1UeXBlKGRvY3VtZW50XykpOworfQorCitURVNUX0YoRlBERkZvcm1GaWxsVGV4dEZvcm1FbWJlZGRlcnRlc3QsIEdldFNlbGVjdGVkVGV4dEVtcHR5QW5kQmFzaWNLZXlib2FyZCkgeworICAvLyBUZXN0IGVtcHR5IHNlbGVjdGlvbi4KKyAgQ2hlY2tTZWxlY3Rpb24oTCIiKTsKKworICAvLyBUZXN0IGJhc2ljIHNlbGVjdGlvbi4KKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDMsIFJlZ3VsYXJGb3JtQmVnaW4oKSk7CisgIFNlbGVjdFRleHRXaXRoS2V5Ym9hcmQoMywgRldMX1ZLRVlfTGVmdCwgUmVndWxhckZvcm1BdFgoMTIzLjApKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJBQkMiKTsKK30KKworVEVTVF9GKEZQREZGb3JtRmlsbFRleHRGb3JtRW1iZWRkZXJ0ZXN0LCBHZXRTZWxlY3RlZFRleHRFbXB0eUFuZEJhc2ljTW91c2UpIHsKKyAgLy8gVGVzdCBlbXB0eSBzZWxlY3Rpb24uCisgIENoZWNrU2VsZWN0aW9uKEwiIik7CisKKyAgLy8gVGVzdCBiYXNpYyBzZWxlY3Rpb24uCisgIFR5cGVUZXh0SW50b1RleHRGaWVsZCgzLCBSZWd1bGFyRm9ybUJlZ2luKCkpOworICBTZWxlY3RUZXh0V2l0aE1vdXNlKFJlZ3VsYXJGb3JtQXRYKDEyNS4wKSwgUmVndWxhckZvcm1CZWdpbigpKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJBQkMiKTsKK30KKworVEVTVF9GKEZQREZGb3JtRmlsbFRleHRGb3JtRW1iZWRkZXJ0ZXN0LCBHZXRTZWxlY3RlZFRleHRGcmFnbWVudHNLZXlCb2FyZCkgeworICBUeXBlVGV4dEludG9UZXh0RmllbGQoMTIsIFJlZ3VsYXJGb3JtQmVnaW4oKSk7CisKKyAgLy8gVGVzdCBzZWxlY3RpbmcgZmlyc3QgY2hhcmFjdGVyIGluIGZvcndhcmQgZGlyZWN0aW9uLgorICBTZWxlY3RUZXh0V2l0aEtleWJvYXJkKDEsIEZXTF9WS0VZX1JpZ2h0LCBSZWd1bGFyRm9ybUJlZ2luKCkpOworICBDaGVja1NlbGVjdGlvbihMIkEiKTsKKworICAvLyBUZXN0IHNlbGVjdGluZyBlbnRpcmUgbG9uZyBzdHJpbmcgaW4gYmFja3dhcmRzIGRpcmVjdGlvbi4KKyAgU2VsZWN0VGV4dFdpdGhLZXlib2FyZCgxMiwgRldMX1ZLRVlfTGVmdCwgUmVndWxhckZvcm1FbmQoKSk7CisgIENoZWNrU2VsZWN0aW9uKEwiQUJDREVGR0hJSktMIik7CisKKyAgLy8gVGVzdCBzZWxlY3RpbmcgbWlkZGxlIHNlY3Rpb24gaW4gYmFja3dhcmRzIGRpcmVjdGlvbi4KKyAgU2VsZWN0VGV4dFdpdGhLZXlib2FyZCg2LCBGV0xfVktFWV9MZWZ0LCBSZWd1bGFyRm9ybUF0WCgxNzAuMCkpOworICBDaGVja1NlbGVjdGlvbihMIkRFRkdISSIpOworCisgIC8vIFRlc3Qgc2VsZWN0aW5nIG1pZGRsZSBzZWxlY3Rpb24gaW4gZm9yd2FyZCBkaXJlY3Rpb24uCisgIFNlbGVjdFRleHRXaXRoS2V5Ym9hcmQoNiwgRldMX1ZLRVlfUmlnaHQsIFJlZ3VsYXJGb3JtQXRYKDEyNS4wKSk7CisgIENoZWNrU2VsZWN0aW9uKEwiREVGR0hJIik7CisKKyAgLy8gVGVzdCBzZWxlY3RpbmcgbGFzdCBjaGFyYWN0ZXIgaW4gYmFja3dhcmRzIGRpcmVjdGlvbi4KKyAgU2VsZWN0VGV4dFdpdGhLZXlib2FyZCgxLCBGV0xfVktFWV9MZWZ0LCBSZWd1bGFyRm9ybUVuZCgpKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJMIik7Cit9CisKK1RFU1RfRihGUERGRm9ybUZpbGxUZXh0Rm9ybUVtYmVkZGVydGVzdCwgR2V0U2VsZWN0ZWRUZXh0RnJhZ21lbnRzTW91c2UpIHsKKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDEyLCBSZWd1bGFyRm9ybUJlZ2luKCkpOworCisgIC8vIFRlc3Qgc2VsZWN0aW5nIGZpcnN0IGNoYXJhY3RlciBpbiBmb3J3YXJkIGRpcmVjdGlvbi4KKyAgU2VsZWN0VGV4dFdpdGhNb3VzZShSZWd1bGFyRm9ybUJlZ2luKCksIFJlZ3VsYXJGb3JtQXRYKDEwNi4wKSk7CisgIENoZWNrU2VsZWN0aW9uKEwiQSIpOworCisgIC8vIFRlc3Qgc2VsZWN0aW5nIGVudGlyZSBsb25nIHN0cmluZyBpbiBiYWNrd2FyZHMgZGlyZWN0aW9uLgorICBTZWxlY3RBbGxSZWd1bGFyRm9ybVRleHRXaXRoTW91c2UoKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJBQkNERUZHSElKS0wiKTsKKworICAvLyBUZXN0IHNlbGVjdGluZyBtaWRkbGUgc2VjdGlvbiBpbiBiYWNrd2FyZHMgZGlyZWN0aW9uLgorICBTZWxlY3RUZXh0V2l0aE1vdXNlKFJlZ3VsYXJGb3JtQXRYKDE3MC4wKSwgUmVndWxhckZvcm1BdFgoMTI1LjApKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJERUZHSEkiKTsKKworICAvLyBUZXN0IHNlbGVjdGluZyBtaWRkbGUgc2VsZWN0aW9uIGluIGZvcndhcmQgZGlyZWN0aW9uLgorICBTZWxlY3RUZXh0V2l0aE1vdXNlKFJlZ3VsYXJGb3JtQXRYKDEyNS4wKSwgUmVndWxhckZvcm1BdFgoMTcwLjApKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJERUZHSEkiKTsKKworICAvLyBUZXN0IHNlbGVjdGluZyBsYXN0IGNoYXJhY3RlciBpbiBiYWNrd2FyZHMgZGlyZWN0aW9uLgorICBTZWxlY3RUZXh0V2l0aE1vdXNlKFJlZ3VsYXJGb3JtRW5kKCksIFJlZ3VsYXJGb3JtQXRYKDE4Ni4wKSk7CisgIENoZWNrU2VsZWN0aW9uKEwiTCIpOworfQorCitURVNUX0YoRlBERkZvcm1GaWxsQ29tYm9Cb3hGb3JtRW1iZWRkZXJ0ZXN0LAorICAgICAgIEdldFNlbGVjdGVkVGV4dEVtcHR5QW5kQmFzaWNOb3JtYWxDb21ib0JveCkgeworICAvLyBUZXN0IGVtcHR5IHNlbGVjdGlvbi4KKyAgQ2hlY2tTZWxlY3Rpb24oTCIiKTsKKworICAvLyBOb24tZWRpdGFibGUgY29tYm9ib3hlcyBkb24ndCBhbGxvdyBzZWxlY3Rpb24gd2l0aCBrZXlib2FyZC4KKyAgU2VsZWN0VGV4dFdpdGhNb3VzZShOb25FZGl0YWJsZUZvcm1CZWdpbigpLCBOb25FZGl0YWJsZUZvcm1BdFgoMTQyLjApKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJCYW5hbmEiKTsKKworICAvLyBTZWxlY3Qgb3RoZXIgYW5vdGhlciBwcm92aWRlZCBvcHRpb24uCisgIFNlbGVjdE5vbkVkaXRhYmxlRm9ybU9wdGlvbigwKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJBcHBsZSIpOworfQorCitURVNUX0YoRlBERkZvcm1GaWxsQ29tYm9Cb3hGb3JtRW1iZWRkZXJ0ZXN0LAorICAgICAgIEdldFNlbGVjdGVkVGV4dEVtcHR5QW5kQmFzaWNFZGl0YWJsZUNvbWJvQm94S2V5Ym9hcmQpIHsKKyAgLy8gVGVzdCBlbXB0eSBzZWxlY3Rpb24uCisgIENoZWNrU2VsZWN0aW9uKEwiIik7CisKKyAgLy8gVGVzdCBiYXNpYyBzZWxlY3Rpb24gb2YgdGV4dCB3aXRoaW4gdXNlciBlZGl0YWJsZSBjb21ib2JveCB1c2luZyBrZXlib2FyZC4KKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDMsIEVkaXRhYmxlRm9ybUJlZ2luKCkpOworICBTZWxlY3RUZXh0V2l0aEtleWJvYXJkKDMsIEZXTF9WS0VZX0xlZnQsIEVkaXRhYmxlRm9ybUF0WCgxMjguMCkpOworICBDaGVja1NlbGVjdGlvbihMIkFCQyIpOworCisgIC8vIFNlbGVjdCBhIHByb3ZpZGVkIG9wdGlvbi4KKyAgU2VsZWN0RWRpdGFibGVGb3JtT3B0aW9uKDEpOworICBDaGVja1NlbGVjdGlvbihMIkJhciIpOworfQorCitURVNUX0YoRlBERkZvcm1GaWxsQ29tYm9Cb3hGb3JtRW1iZWRkZXJ0ZXN0LAorICAgICAgIEdldFNlbGVjdGVkVGV4dEVtcHR5QW5kQmFzaWNFZGl0YWJsZUNvbWJvQm94TW91c2UpIHsKKyAgLy8gVGVzdCBlbXB0eSBzZWxlY3Rpb24uCisgIENoZWNrU2VsZWN0aW9uKEwiIik7CisKKyAgLy8gVGVzdCBiYXNpYyBzZWxlY3Rpb24gb2YgdGV4dCB3aXRoaW4gdXNlciBlZGl0YWJsZSBjb21ib2JveCB1c2luZyBtb3VzZS4KKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDMsIEVkaXRhYmxlRm9ybUJlZ2luKCkpOworICBTZWxlY3RUZXh0V2l0aE1vdXNlKEVkaXRhYmxlRm9ybUF0WCgxMjguMCksIEVkaXRhYmxlRm9ybUJlZ2luKCkpOworICBDaGVja1NlbGVjdGlvbihMIkFCQyIpOworCisgIC8vIFNlbGVjdCBhIHByb3ZpZGVkIG9wdGlvbi4KKyAgU2VsZWN0RWRpdGFibGVGb3JtT3B0aW9uKDIpOworICBDaGVja1NlbGVjdGlvbihMIlF1eCIpOworfQorCitURVNUX0YoRlBERkZvcm1GaWxsQ29tYm9Cb3hGb3JtRW1iZWRkZXJ0ZXN0LAorICAgICAgIEdldFNlbGVjdGVkVGV4dEZyYWdtZW50c05vcm1hbENvbWJvQm94KSB7CisgIC8vIFRlc3Qgc2VsZWN0aW5nIGZpcnN0IGNoYXJhY3RlciBpbiBmb3J3YXJkIGRpcmVjdGlvbi4KKyAgU2VsZWN0VGV4dFdpdGhNb3VzZShOb25FZGl0YWJsZUZvcm1CZWdpbigpLCBOb25FZGl0YWJsZUZvcm1BdFgoMTA3LjApKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJCIik7CisKKyAgLy8gVGVzdCBzZWxlY3RpbmcgZW50aXJlIHN0cmluZyBpbiBiYWNrd2FyZHMgZGlyZWN0aW9uLgorICBTZWxlY3RUZXh0V2l0aE1vdXNlKE5vbkVkaXRhYmxlRm9ybUF0WCgxNDIuMCksIE5vbkVkaXRhYmxlRm9ybUJlZ2luKCkpOworICBDaGVja1NlbGVjdGlvbihMIkJhbmFuYSIpOworCisgIC8vIFRlc3Qgc2VsZWN0aW5nIG1pZGRsZSBzZWN0aW9uIGluIGJhY2t3YXJkcyBkaXJlY3Rpb24uCisgIFNlbGVjdFRleHRXaXRoTW91c2UoTm9uRWRpdGFibGVGb3JtQXRYKDEzNS4wKSwgTm9uRWRpdGFibGVGb3JtQXRYKDExNy4wKSk7CisgIENoZWNrU2VsZWN0aW9uKEwibmFuIik7CisKKyAgLy8gVGVzdCBzZWxlY3RpbmcgbWlkZGxlIHNlY3Rpb24gaW4gZm9yd2FyZCBkaXJlY3Rpb24uCisgIFNlbGVjdFRleHRXaXRoTW91c2UoTm9uRWRpdGFibGVGb3JtQXRYKDExNy4wKSwgTm9uRWRpdGFibGVGb3JtQXRYKDEzNS4wKSk7CisgIENoZWNrU2VsZWN0aW9uKEwibmFuIik7CisKKyAgLy8gVGVzdCBzZWxlY3RpbmcgbGFzdCBjaGFyYWN0ZXIgaW4gYmFja3dhcmRzIGRpcmVjdGlvbi4KKyAgU2VsZWN0VGV4dFdpdGhNb3VzZShOb25FZGl0YWJsZUZvcm1BdFgoMTQyLjApLCBOb25FZGl0YWJsZUZvcm1BdFgoMTM4LjApKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJhIik7CisKKyAgLy8gU2VsZWN0IGFub3RoZXIgb3B0aW9uIGFuZCB0aGVuIHJlc2V0IHNlbGVjdGlvbiBhcyBmaXJzdCB0aHJlZSBjaGFycy4KKyAgU2VsZWN0Tm9uRWRpdGFibGVGb3JtT3B0aW9uKDIpOworICBDaGVja1NlbGVjdGlvbihMIkNoZXJyeSIpOworICBTZWxlY3RUZXh0V2l0aE1vdXNlKE5vbkVkaXRhYmxlRm9ybUJlZ2luKCksIE5vbkVkaXRhYmxlRm9ybUF0WCgxMjIuMCkpOworICBDaGVja1NlbGVjdGlvbihMIkNoZSIpOworfQorCitURVNUX0YoRlBERkZvcm1GaWxsQ29tYm9Cb3hGb3JtRW1iZWRkZXJ0ZXN0LAorICAgICAgIEdldFNlbGVjdGVkVGV4dEZyYWdtZW50c0VkaXRhYmxlQ29tYm9Cb3hLZXlib2FyZCkgeworICBUeXBlVGV4dEludG9UZXh0RmllbGQoMTAsIEVkaXRhYmxlRm9ybUJlZ2luKCkpOworCisgIC8vIFRlc3Qgc2VsZWN0aW5nIGZpcnN0IGNoYXJhY3RlciBpbiBmb3J3YXJkIGRpcmVjdGlvbi4KKyAgU2VsZWN0VGV4dFdpdGhLZXlib2FyZCgxLCBGV0xfVktFWV9SaWdodCwgRWRpdGFibGVGb3JtQmVnaW4oKSk7CisgIENoZWNrU2VsZWN0aW9uKEwiQSIpOworCisgIC8vIFRlc3Qgc2VsZWN0aW5nIGVudGlyZSBsb25nIHN0cmluZyBpbiBiYWNrd2FyZHMgZGlyZWN0aW9uLgorICBTZWxlY3RUZXh0V2l0aEtleWJvYXJkKDEwLCBGV0xfVktFWV9MZWZ0LCBFZGl0YWJsZUZvcm1FbmQoKSk7CisgIENoZWNrU2VsZWN0aW9uKEwiQUJDREVGR0hJSiIpOworCisgIC8vIFRlc3Qgc2VsZWN0aW5nIG1pZGRsZSBzZWN0aW9uIGluIGJhY2t3YXJkcyBkaXJlY3Rpb24uCisgIFNlbGVjdFRleHRXaXRoS2V5Ym9hcmQoNSwgRldMX1ZLRVlfTGVmdCwgRWRpdGFibGVGb3JtQXRYKDE2OC4wKSk7CisgIENoZWNrU2VsZWN0aW9uKEwiREVGR0giKTsKKworICAvLyBUZXN0IHNlbGVjdGluZyBtaWRkbGUgc2VsZWN0aW9uIGluIGZvcndhcmQgZGlyZWN0aW9uLgorICBTZWxlY3RUZXh0V2l0aEtleWJvYXJkKDUsIEZXTF9WS0VZX1JpZ2h0LCBFZGl0YWJsZUZvcm1BdFgoMTI3LjApKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJERUZHSCIpOworCisgIC8vIFRlc3Qgc2VsZWN0aW5nIGxhc3QgY2hhcmFjdGVyIGluIGJhY2t3YXJkcyBkaXJlY3Rpb24uCisgIFNlbGVjdFRleHRXaXRoS2V5Ym9hcmQoMSwgRldMX1ZLRVlfTGVmdCwgRWRpdGFibGVGb3JtRW5kKCkpOworICBDaGVja1NlbGVjdGlvbihMIkoiKTsKKworICAvLyBTZWxlY3QgYSBwcm92aWRlZCBvcHRpb24gYW5kIHRoZW4gcmVzZXQgc2VsZWN0aW9uIGFzIGZpcnN0IHR3byBjaGFycy4KKyAgU2VsZWN0RWRpdGFibGVGb3JtT3B0aW9uKDApOworICBDaGVja1NlbGVjdGlvbihMIkZvbyIpOworICBTZWxlY3RUZXh0V2l0aEtleWJvYXJkKDIsIEZXTF9WS0VZX1JpZ2h0LCBFZGl0YWJsZUZvcm1CZWdpbigpKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJGbyIpOworfQorCitURVNUX0YoRlBERkZvcm1GaWxsQ29tYm9Cb3hGb3JtRW1iZWRkZXJ0ZXN0LAorICAgICAgIEdldFNlbGVjdGVkVGV4dEZyYWdtZW50c0VkaXRhYmxlQ29tYm9Cb3hNb3VzZSkgeworICBUeXBlVGV4dEludG9UZXh0RmllbGQoMTAsIEVkaXRhYmxlRm9ybUJlZ2luKCkpOworCisgIC8vIFRlc3Qgc2VsZWN0aW5nIGZpcnN0IGNoYXJhY3RlciBpbiBmb3J3YXJkIGRpcmVjdGlvbi4KKyAgU2VsZWN0VGV4dFdpdGhNb3VzZShFZGl0YWJsZUZvcm1CZWdpbigpLCBFZGl0YWJsZUZvcm1BdFgoMTA3LjApKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJBIik7CisKKyAgLy8gVGVzdCBzZWxlY3RpbmcgZW50aXJlIGxvbmcgc3RyaW5nIGluIGJhY2t3YXJkcyBkaXJlY3Rpb24uCisgIFNlbGVjdEFsbEVkaXRhYmxlRm9ybVRleHRXaXRoTW91c2UoKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJBQkNERUZHSElKIik7CisKKyAgLy8gVGVzdCBzZWxlY3RpbmcgbWlkZGxlIHNlY3Rpb24gaW4gYmFja3dhcmRzIGRpcmVjdGlvbi4KKyAgU2VsZWN0VGV4dFdpdGhNb3VzZShFZGl0YWJsZUZvcm1BdFgoMTY4LjApLCBFZGl0YWJsZUZvcm1BdFgoMTI3LjApKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJERUZHSCIpOworCisgIC8vIFRlc3Qgc2VsZWN0aW5nIG1pZGRsZSBzZWxlY3Rpb24gaW4gZm9yd2FyZCBkaXJlY3Rpb24uCisgIFNlbGVjdFRleHRXaXRoTW91c2UoRWRpdGFibGVGb3JtQXRYKDEyNy4wKSwgRWRpdGFibGVGb3JtQXRYKDE2OC4wKSk7CisgIENoZWNrU2VsZWN0aW9uKEwiREVGR0giKTsKKworICAvLyBUZXN0IHNlbGVjdGluZyBsYXN0IGNoYXJhY3RlciBpbiBiYWNrd2FyZHMgZGlyZWN0aW9uLgorICBTZWxlY3RUZXh0V2l0aE1vdXNlKEVkaXRhYmxlRm9ybUVuZCgpLCBFZGl0YWJsZUZvcm1BdFgoMTc0LjApKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJKIik7Cit9CisKK1RFU1RfRihGUERGRm9ybUZpbGxUZXh0Rm9ybUVtYmVkZGVydGVzdCwgRGVsZXRlVGV4dEZpZWxkRW50aXJlU2VsZWN0aW9uKSB7CisgIC8vIFNlbGVjdCBlbnRpcmUgY29udGVudHMgb2YgdGV4dCBmaWVsZC4KKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDEyLCBSZWd1bGFyRm9ybUJlZ2luKCkpOworICBTZWxlY3RBbGxSZWd1bGFyRm9ybVRleHRXaXRoTW91c2UoKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJBQkNERUZHSElKS0wiKTsKKworICAvLyBUZXN0IGRlbGV0aW5nIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24uIFNlbGVjdCB3aGF0IHJlbWFpbnMgYWZ0ZXIgZGVsZXRpb24gdG8KKyAgLy8gY2hlY2sgdGhhdCByZW1haW5pbmcgdGV4dCBpcyBhcyBleHBlY3RlZC4KKyAgRk9STV9SZXBsYWNlU2VsZWN0aW9uKGZvcm1faGFuZGxlKCksIHBhZ2UoKSwgbnVsbHB0cik7CisKKyAgU2VsZWN0VGV4dFdpdGhLZXlib2FyZCgxMiwgRldMX1ZLRVlfTGVmdCwgUmVndWxhckZvcm1FbmQoKSk7CisgIENoZWNrU2VsZWN0aW9uKEwiIik7Cit9CisKK1RFU1RfRihGUERGRm9ybUZpbGxUZXh0Rm9ybUVtYmVkZGVydGVzdCwgRGVsZXRlVGV4dEZpZWxkU2VsZWN0aW9uTWlkZGxlKSB7CisgIC8vIFNlbGVjdCBtaWRkbGUgc2VjdGlvbiBvZiB0ZXh0LgorICBUeXBlVGV4dEludG9UZXh0RmllbGQoMTIsIFJlZ3VsYXJGb3JtQmVnaW4oKSk7CisgIFNlbGVjdFRleHRXaXRoTW91c2UoUmVndWxhckZvcm1BdFgoMTcwLjApLCBSZWd1bGFyRm9ybUF0WCgxMjUuMCkpOworICBDaGVja1NlbGVjdGlvbihMIkRFRkdISSIpOworCisgIC8vIFRlc3QgZGVsZXRpbmcgY3VycmVudCB0ZXh0IHNlbGVjdGlvbi4gU2VsZWN0IHdoYXQgcmVtYWlucyBhZnRlciBkZWxldGlvbiB0bworICAvLyBjaGVjayB0aGF0IHJlbWFpbmluZyB0ZXh0IGlzIGFzIGV4cGVjdGVkLgorICBGT1JNX1JlcGxhY2VTZWxlY3Rpb24oZm9ybV9oYW5kbGUoKSwgcGFnZSgpLCBudWxscHRyKTsKKyAgU2VsZWN0VGV4dFdpdGhLZXlib2FyZCgxMiwgRldMX1ZLRVlfTGVmdCwgUmVndWxhckZvcm1FbmQoKSk7CisgIENoZWNrU2VsZWN0aW9uKEwiQUJDSktMIik7Cit9CisKK1RFU1RfRihGUERGRm9ybUZpbGxUZXh0Rm9ybUVtYmVkZGVydGVzdCwgRGVsZXRlVGV4dEZpZWxkU2VsZWN0aW9uTGVmdCkgeworICAvLyBTZWxlY3QgZmlyc3QgZmV3IGNoYXJhY3RlcnMgb2YgdGV4dC4KKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDEyLCBSZWd1bGFyRm9ybUJlZ2luKCkpOworICBTZWxlY3RUZXh0V2l0aE1vdXNlKFJlZ3VsYXJGb3JtQmVnaW4oKSwgUmVndWxhckZvcm1BdFgoMTMyLjApKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJBQkNEIik7CisKKyAgLy8gVGVzdCBkZWxldGluZyBjdXJyZW50IHRleHQgc2VsZWN0aW9uLiBTZWxlY3Qgd2hhdCByZW1haW5zIGFmdGVyIGRlbGV0aW9uIHRvCisgIC8vIGNoZWNrIHRoYXQgcmVtYWluaW5nIHRleHQgaXMgYXMgZXhwZWN0ZWQuCisgIEZPUk1fUmVwbGFjZVNlbGVjdGlvbihmb3JtX2hhbmRsZSgpLCBwYWdlKCksIG51bGxwdHIpOworICBTZWxlY3RUZXh0V2l0aEtleWJvYXJkKDEyLCBGV0xfVktFWV9MZWZ0LCBSZWd1bGFyRm9ybUVuZCgpKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJFRkdISUpLTCIpOworfQorCitURVNUX0YoRlBERkZvcm1GaWxsVGV4dEZvcm1FbWJlZGRlcnRlc3QsIERlbGV0ZVRleHRGaWVsZFNlbGVjdGlvblJpZ2h0KSB7CisgIC8vIFNlbGVjdCBsYXN0IGZldyBjaGFyYWN0ZXJzIG9mIHRleHQuCisgIFR5cGVUZXh0SW50b1RleHRGaWVsZCgxMiwgUmVndWxhckZvcm1CZWdpbigpKTsKKyAgU2VsZWN0VGV4dFdpdGhNb3VzZShSZWd1bGFyRm9ybUVuZCgpLCBSZWd1bGFyRm9ybUF0WCgxNjUuMCkpOworICBDaGVja1NlbGVjdGlvbihMIklKS0wiKTsKKworICAvLyBUZXN0IGRlbGV0aW5nIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24uIFNlbGVjdCB3aGF0IHJlbWFpbnMgYWZ0ZXIgZGVsZXRpb24gdG8KKyAgLy8gY2hlY2sgdGhhdCByZW1haW5pbmcgdGV4dCBpcyBhcyBleHBlY3RlZC4KKyAgRk9STV9SZXBsYWNlU2VsZWN0aW9uKGZvcm1faGFuZGxlKCksIHBhZ2UoKSwgbnVsbHB0cik7CisgIFNlbGVjdFRleHRXaXRoS2V5Ym9hcmQoMTIsIEZXTF9WS0VZX0xlZnQsIFJlZ3VsYXJGb3JtRW5kKCkpOworICBDaGVja1NlbGVjdGlvbihMIkFCQ0RFRkdIIik7Cit9CisKK1RFU1RfRihGUERGRm9ybUZpbGxUZXh0Rm9ybUVtYmVkZGVydGVzdCwgRGVsZXRlRW1wdHlUZXh0RmllbGRTZWxlY3Rpb24pIHsKKyAgLy8gRG8gbm90IHNlbGVjdCB0ZXh0LgorICBUeXBlVGV4dEludG9UZXh0RmllbGQoMTIsIFJlZ3VsYXJGb3JtQmVnaW4oKSk7CisgIENoZWNrU2VsZWN0aW9uKEwiIik7CisKKyAgLy8gVGVzdCB0aGF0IGF0dGVtcHQgdG8gZGVsZXRlIGVtcHR5IHRleHQgc2VsZWN0aW9uIGhhcyBubyBlZmZlY3QuCisgIEZPUk1fUmVwbGFjZVNlbGVjdGlvbihmb3JtX2hhbmRsZSgpLCBwYWdlKCksIG51bGxwdHIpOworICBTZWxlY3RUZXh0V2l0aEtleWJvYXJkKDEyLCBGV0xfVktFWV9MZWZ0LCBSZWd1bGFyRm9ybUVuZCgpKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJBQkNERUZHSElKS0wiKTsKK30KKworVEVTVF9GKEZQREZGb3JtRmlsbENvbWJvQm94Rm9ybUVtYmVkZGVydGVzdCwKKyAgICAgICBEZWxldGVFZGl0YWJsZUNvbWJvQm94RW50aXJlU2VsZWN0aW9uKSB7CisgIC8vIFNlbGVjdCBlbnRpcmUgY29udGVudHMgb2YgdXNlci1lZGl0YWJsZSBjb21ib2JveCB0ZXh0IGZpZWxkLgorICBUeXBlVGV4dEludG9UZXh0RmllbGQoMTAsIEVkaXRhYmxlRm9ybUJlZ2luKCkpOworICBTZWxlY3RBbGxFZGl0YWJsZUZvcm1UZXh0V2l0aE1vdXNlKCk7CisgIENoZWNrU2VsZWN0aW9uKEwiQUJDREVGR0hJSiIpOworCisgIC8vIFRlc3QgZGVsZXRpbmcgY3VycmVudCB0ZXh0IHNlbGVjdGlvbi4gU2VsZWN0IHdoYXQgcmVtYWlucyBhZnRlciBkZWxldGlvbiB0bworICAvLyBjaGVjayB0aGF0IHJlbWFpbmluZyB0ZXh0IGlzIGFzIGV4cGVjdGVkLgorICBGT1JNX1JlcGxhY2VTZWxlY3Rpb24oZm9ybV9oYW5kbGUoKSwgcGFnZSgpLCBudWxscHRyKTsKKyAgU2VsZWN0QWxsRWRpdGFibGVGb3JtVGV4dFdpdGhNb3VzZSgpOworICBDaGVja1NlbGVjdGlvbihMIiIpOworfQorCitURVNUX0YoRlBERkZvcm1GaWxsQ29tYm9Cb3hGb3JtRW1iZWRkZXJ0ZXN0LAorICAgICAgIERlbGV0ZUVkaXRhYmxlQ29tYm9Cb3hTZWxlY3Rpb25NaWRkbGUpIHsKKyAgLy8gU2VsZWN0IG1pZGRsZSBzZWN0aW9uIG9mIHRleHQuCisgIFR5cGVUZXh0SW50b1RleHRGaWVsZCgxMCwgRWRpdGFibGVGb3JtQmVnaW4oKSk7CisgIFNlbGVjdFRleHRXaXRoTW91c2UoRWRpdGFibGVGb3JtQXRYKDE2OC4wKSwgRWRpdGFibGVGb3JtQXRYKDEyNy4wKSk7CisgIENoZWNrU2VsZWN0aW9uKEwiREVGR0giKTsKKworICAvLyBUZXN0IGRlbGV0aW5nIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24uIFNlbGVjdCB3aGF0IHJlbWFpbnMgYWZ0ZXIgZGVsZXRpb24gdG8KKyAgLy8gY2hlY2sgdGhhdCByZW1haW5pbmcgdGV4dCBpcyBhcyBleHBlY3RlZC4KKyAgRk9STV9SZXBsYWNlU2VsZWN0aW9uKGZvcm1faGFuZGxlKCksIHBhZ2UoKSwgbnVsbHB0cik7CisgIFNlbGVjdEFsbEVkaXRhYmxlRm9ybVRleHRXaXRoTW91c2UoKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJBQkNJSiIpOworfQorCitURVNUX0YoRlBERkZvcm1GaWxsQ29tYm9Cb3hGb3JtRW1iZWRkZXJ0ZXN0LAorICAgICAgIERlbGV0ZUVkaXRhYmxlQ29tYm9Cb3hTZWxlY3Rpb25MZWZ0KSB7CisgIC8vIFNlbGVjdCBmaXJzdCBmZXcgY2hhcmFjdGVycyBvZiB0ZXh0LgorICBUeXBlVGV4dEludG9UZXh0RmllbGQoMTAsIEVkaXRhYmxlRm9ybUJlZ2luKCkpOworICBTZWxlY3RUZXh0V2l0aE1vdXNlKEVkaXRhYmxlRm9ybUJlZ2luKCksIEVkaXRhYmxlRm9ybUF0WCgxMzIuMCkpOworICBDaGVja1NlbGVjdGlvbihMIkFCQ0QiKTsKKworICAvLyBUZXN0IGRlbGV0aW5nIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24uIFNlbGVjdCB3aGF0IHJlbWFpbnMgYWZ0ZXIgZGVsZXRpb24gdG8KKyAgLy8gY2hlY2sgdGhhdCByZW1haW5pbmcgdGV4dCBpcyBhcyBleHBlY3RlZC4KKyAgRk9STV9SZXBsYWNlU2VsZWN0aW9uKGZvcm1faGFuZGxlKCksIHBhZ2UoKSwgbnVsbHB0cik7CisgIFNlbGVjdEFsbEVkaXRhYmxlRm9ybVRleHRXaXRoTW91c2UoKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJFRkdISUoiKTsKK30KKworVEVTVF9GKEZQREZGb3JtRmlsbENvbWJvQm94Rm9ybUVtYmVkZGVydGVzdCwKKyAgICAgICBEZWxldGVFZGl0YWJsZUNvbWJvQm94U2VsZWN0aW9uUmlnaHQpIHsKKyAgLy8gU2VsZWN0IGxhc3QgZmV3IGNoYXJhY3RlcnMgb2YgdGV4dC4KKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDEwLCBFZGl0YWJsZUZvcm1CZWdpbigpKTsKKyAgU2VsZWN0VGV4dFdpdGhNb3VzZShFZGl0YWJsZUZvcm1FbmQoKSwgRWRpdGFibGVGb3JtQXRYKDE1Mi4wKSk7CisgIENoZWNrU2VsZWN0aW9uKEwiR0hJSiIpOworCisgIC8vIFRlc3QgZGVsZXRpbmcgY3VycmVudCB0ZXh0IHNlbGVjdGlvbi4gU2VsZWN0IHdoYXQgcmVtYWlucyBhZnRlciBkZWxldGlvbiB0bworICAvLyBjaGVjayB0aGF0IHJlbWFpbmluZyB0ZXh0IGlzIGFzIGV4cGVjdGVkLgorICBGT1JNX1JlcGxhY2VTZWxlY3Rpb24oZm9ybV9oYW5kbGUoKSwgcGFnZSgpLCBudWxscHRyKTsKKyAgU2VsZWN0QWxsRWRpdGFibGVGb3JtVGV4dFdpdGhNb3VzZSgpOworICBDaGVja1NlbGVjdGlvbihMIkFCQ0RFRiIpOworfQorCitURVNUX0YoRlBERkZvcm1GaWxsQ29tYm9Cb3hGb3JtRW1iZWRkZXJ0ZXN0LAorICAgICAgIERlbGV0ZUVtcHR5RWRpdGFibGVDb21ib0JveFNlbGVjdGlvbikgeworICAvLyBEbyBub3Qgc2VsZWN0IHRleHQuCisgIFR5cGVUZXh0SW50b1RleHRGaWVsZCgxMCwgRWRpdGFibGVGb3JtQmVnaW4oKSk7CisgIENoZWNrU2VsZWN0aW9uKEwiIik7CisKKyAgLy8gVGVzdCB0aGF0IGF0dGVtcHQgdG8gZGVsZXRlIGVtcHR5IHRleHQgc2VsZWN0aW9uIGhhcyBubyBlZmZlY3QuCisgIEZPUk1fUmVwbGFjZVNlbGVjdGlvbihmb3JtX2hhbmRsZSgpLCBwYWdlKCksIG51bGxwdHIpOworICBTZWxlY3RBbGxFZGl0YWJsZUZvcm1UZXh0V2l0aE1vdXNlKCk7CisgIENoZWNrU2VsZWN0aW9uKEwiQUJDREVGR0hJSiIpOworfQorCitURVNUX0YoRlBERkZvcm1GaWxsVGV4dEZvcm1FbWJlZGRlcnRlc3QsIEluc2VydFRleHRJbkVtcHR5VGV4dEZpZWxkKSB7CisgIENsaWNrT25Gb3JtRmllbGRBdFBvaW50KFJlZ3VsYXJGb3JtQmVnaW4oKSk7CisKKyAgLy8gVGVzdCBpbnNlcnRpbmcgdGV4dCBpbnRvIGVtcHR5IHRleHQgZmllbGQuCisgIHN0ZDo6dW5pcXVlX3B0cjx1bnNpZ25lZCBzaG9ydCwgcGRmaXVtOjpGcmVlRGVsZXRlcj4gdGV4dF90b19pbnNlcnQgPQorICAgICAgR2V0RlBERldpZGVTdHJpbmcoTCJIZWxsbyIpOworICBGT1JNX1JlcGxhY2VTZWxlY3Rpb24oZm9ybV9oYW5kbGUoKSwgcGFnZSgpLCB0ZXh0X3RvX2luc2VydC5nZXQoKSk7CisKKyAgLy8gU2VsZWN0IGVudGlyZSBjb250ZW50cyBvZiB0ZXh0IGZpZWxkIHRvIGNoZWNrIHRoYXQgaW5zZXJ0aW9uIHdvcmtlZAorICAvLyBhcyBleHBlY3RlZC4KKyAgU2VsZWN0QWxsUmVndWxhckZvcm1UZXh0V2l0aE1vdXNlKCk7CisgIENoZWNrU2VsZWN0aW9uKEwiSGVsbG8iKTsKK30KKworVEVTVF9GKEZQREZGb3JtRmlsbFRleHRGb3JtRW1iZWRkZXJ0ZXN0LCBJbnNlcnRUZXh0SW5Qb3B1bGF0ZWRUZXh0RmllbGRMZWZ0KSB7CisgIFR5cGVUZXh0SW50b1RleHRGaWVsZCg4LCBSZWd1bGFyRm9ybUJlZ2luKCkpOworCisgIC8vIENsaWNrIG9uIHRoZSBsZWZ0bW9zdCBwYXJ0IG9mIHRoZSB0ZXh0IGZpZWxkLgorICBDbGlja09uRm9ybUZpZWxkQXRQb2ludChSZWd1bGFyRm9ybUJlZ2luKCkpOworCisgIC8vIFRlc3QgaW5zZXJ0aW5nIHRleHQgaW4gZnJvbnQgb2YgZXhpc3RpbmcgdGV4dCBpbiB0ZXh0IGZpZWxkLgorICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IHRleHRfdG9faW5zZXJ0ID0KKyAgICAgIEdldEZQREZXaWRlU3RyaW5nKEwiSGVsbG8iKTsKKyAgRk9STV9SZXBsYWNlU2VsZWN0aW9uKGZvcm1faGFuZGxlKCksIHBhZ2UoKSwgdGV4dF90b19pbnNlcnQuZ2V0KCkpOworCisgIC8vIFNlbGVjdCBlbnRpcmUgY29udGVudHMgb2YgdGV4dCBmaWVsZCB0byBjaGVjayB0aGF0IGluc2VydGlvbiB3b3JrZWQKKyAgLy8gYXMgZXhwZWN0ZWQuCisgIFNlbGVjdEFsbFJlZ3VsYXJGb3JtVGV4dFdpdGhNb3VzZSgpOworICBDaGVja1NlbGVjdGlvbihMIkhlbGxvQUJDREVGR0giKTsKK30KKworVEVTVF9GKEZQREZGb3JtRmlsbFRleHRGb3JtRW1iZWRkZXJ0ZXN0LCBJbnNlcnRUZXh0SW5Qb3B1bGF0ZWRUZXh0RmllbGRNaWRkbGUpIHsKKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDgsIFJlZ3VsYXJGb3JtQmVnaW4oKSk7CisKKyAgLy8gQ2xpY2sgb24gdGhlIG1pZGRsZSBvZiB0aGUgdGV4dCBmaWVsZC4KKyAgQ2xpY2tPbkZvcm1GaWVsZEF0UG9pbnQoUmVndWxhckZvcm1BdFgoMTM0LjApKTsKKworICAvLyBUZXN0IGluc2VydGluZyB0ZXh0IGluIHRoZSBtaWRkbGUgb2YgZXhpc3RpbmcgdGV4dCBpbiB0ZXh0IGZpZWxkLgorICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IHRleHRfdG9faW5zZXJ0ID0KKyAgICAgIEdldEZQREZXaWRlU3RyaW5nKEwiSGVsbG8iKTsKKyAgRk9STV9SZXBsYWNlU2VsZWN0aW9uKGZvcm1faGFuZGxlKCksIHBhZ2UoKSwgdGV4dF90b19pbnNlcnQuZ2V0KCkpOworCisgIC8vIFNlbGVjdCBlbnRpcmUgY29udGVudHMgb2YgdGV4dCBmaWVsZCB0byBjaGVjayB0aGF0IGluc2VydGlvbiB3b3JrZWQKKyAgLy8gYXMgZXhwZWN0ZWQuCisgIFNlbGVjdEFsbFJlZ3VsYXJGb3JtVGV4dFdpdGhNb3VzZSgpOworICBDaGVja1NlbGVjdGlvbihMIkFCQ0RIZWxsb0VGR0giKTsKK30KKworVEVTVF9GKEZQREZGb3JtRmlsbFRleHRGb3JtRW1iZWRkZXJ0ZXN0LCBJbnNlcnRUZXh0SW5Qb3B1bGF0ZWRUZXh0RmllbGRSaWdodCkgeworICBUeXBlVGV4dEludG9UZXh0RmllbGQoOCwgUmVndWxhckZvcm1CZWdpbigpKTsKKworICAvLyBDbGljayBvbiB0aGUgcmlnaHRtb3N0IHBhcnQgb2YgdGhlIHRleHQgZmllbGQuCisgIENsaWNrT25Gb3JtRmllbGRBdFBvaW50KFJlZ3VsYXJGb3JtQXRYKDE2Ni4wKSk7CisKKyAgLy8gVGVzdCBpbnNlcnRpbmcgdGV4dCBiZWhpbmQgZXhpc3RpbmcgdGV4dCBpbiB0ZXh0IGZpZWxkLgorICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IHRleHRfdG9faW5zZXJ0ID0KKyAgICAgIEdldEZQREZXaWRlU3RyaW5nKEwiSGVsbG8iKTsKKyAgRk9STV9SZXBsYWNlU2VsZWN0aW9uKGZvcm1faGFuZGxlKCksIHBhZ2UoKSwgdGV4dF90b19pbnNlcnQuZ2V0KCkpOworCisgIC8vIFNlbGVjdCBlbnRpcmUgY29udGVudHMgb2YgdGV4dCBmaWVsZCB0byBjaGVjayB0aGF0IGluc2VydGlvbiB3b3JrZWQKKyAgLy8gYXMgZXhwZWN0ZWQuCisgIFNlbGVjdEFsbFJlZ3VsYXJGb3JtVGV4dFdpdGhNb3VzZSgpOworICBDaGVja1NlbGVjdGlvbihMIkFCQ0RFRkdISGVsbG8iKTsKK30KKworVEVTVF9GKEZQREZGb3JtRmlsbFRleHRGb3JtRW1iZWRkZXJ0ZXN0LAorICAgICAgIEluc2VydFRleHRBbmRSZXBsYWNlU2VsZWN0aW9uSW5Qb3B1bGF0ZWRUZXh0RmllbGRXaG9sZSkgeworICBUeXBlVGV4dEludG9UZXh0RmllbGQoMTIsIFJlZ3VsYXJGb3JtQmVnaW4oKSk7CisKKyAgLy8gU2VsZWN0IGVudGlyZSBzdHJpbmcgaW4gdGV4dCBmaWVsZC4KKyAgU2VsZWN0VGV4dFdpdGhLZXlib2FyZCgxMiwgRldMX1ZLRVlfTGVmdCwgUmVndWxhckZvcm1FbmQoKSk7CisgIENoZWNrU2VsZWN0aW9uKEwiQUJDREVGR0hJSktMIik7CisKKyAgLy8gVGVzdCByZXBsYWNpbmcgdGV4dCBzZWxlY3Rpb24gd2l0aCB0ZXh0IHRvIGJlIGluc2VydGVkLgorICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IHRleHRfdG9faW5zZXJ0ID0KKyAgICAgIEdldEZQREZXaWRlU3RyaW5nKEwiSGVsbG8iKTsKKyAgRk9STV9SZXBsYWNlU2VsZWN0aW9uKGZvcm1faGFuZGxlKCksIHBhZ2UoKSwgdGV4dF90b19pbnNlcnQuZ2V0KCkpOworCisgIC8vIFNlbGVjdCBlbnRpcmUgY29udGVudHMgb2YgdGV4dCBmaWVsZCB0byBjaGVjayB0aGF0IGluc2VydGlvbiB3b3JrZWQKKyAgLy8gYXMgZXhwZWN0ZWQuCisgIFNlbGVjdEFsbFJlZ3VsYXJGb3JtVGV4dFdpdGhNb3VzZSgpOworICBDaGVja1NlbGVjdGlvbihMIkhlbGxvIik7Cit9CisKK1RFU1RfRihGUERGRm9ybUZpbGxUZXh0Rm9ybUVtYmVkZGVydGVzdCwKKyAgICAgICBJbnNlcnRUZXh0QW5kUmVwbGFjZVNlbGVjdGlvbkluUG9wdWxhdGVkVGV4dEZpZWxkTGVmdCkgeworICBUeXBlVGV4dEludG9UZXh0RmllbGQoMTIsIFJlZ3VsYXJGb3JtQmVnaW4oKSk7CisKKyAgLy8gU2VsZWN0IGxlZnQgcG9ydGlvbiBvZiBzdHJpbmcgaW4gdGV4dCBmaWVsZC4KKyAgU2VsZWN0VGV4dFdpdGhLZXlib2FyZCg2LCBGV0xfVktFWV9MZWZ0LCBSZWd1bGFyRm9ybUF0WCgxNDguMCkpOworICBDaGVja1NlbGVjdGlvbihMIkFCQ0RFRiIpOworCisgIC8vIFRlc3QgcmVwbGFjaW5nIHRleHQgc2VsZWN0aW9uIHdpdGggdGV4dCB0byBiZSBpbnNlcnRlZC4KKyAgc3RkOjp1bmlxdWVfcHRyPHVuc2lnbmVkIHNob3J0LCBwZGZpdW06OkZyZWVEZWxldGVyPiB0ZXh0X3RvX2luc2VydCA9CisgICAgICBHZXRGUERGV2lkZVN0cmluZyhMIkhlbGxvIik7CisgIEZPUk1fUmVwbGFjZVNlbGVjdGlvbihmb3JtX2hhbmRsZSgpLCBwYWdlKCksIHRleHRfdG9faW5zZXJ0LmdldCgpKTsKKworICAvLyBTZWxlY3QgZW50aXJlIGNvbnRlbnRzIG9mIHRleHQgZmllbGQgdG8gY2hlY2sgdGhhdCBpbnNlcnRpb24gd29ya2VkCisgIC8vIGFzIGV4cGVjdGVkLgorICBTZWxlY3RBbGxSZWd1bGFyRm9ybVRleHRXaXRoTW91c2UoKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJIZWxsb0dISUpLTCIpOworfQorCitURVNUX0YoRlBERkZvcm1GaWxsVGV4dEZvcm1FbWJlZGRlcnRlc3QsCisgICAgICAgSW5zZXJ0VGV4dEFuZFJlcGxhY2VTZWxlY3Rpb25JblBvcHVsYXRlZFRleHRGaWVsZE1pZGRsZSkgeworICBUeXBlVGV4dEludG9UZXh0RmllbGQoMTIsIFJlZ3VsYXJGb3JtQmVnaW4oKSk7CisKKyAgLy8gU2VsZWN0IG1pZGRsZSBwb3J0aW9uIG9mIHN0cmluZyBpbiB0ZXh0IGZpZWxkLgorICBTZWxlY3RUZXh0V2l0aEtleWJvYXJkKDYsIEZXTF9WS0VZX0xlZnQsIFJlZ3VsYXJGb3JtQXRYKDE3MS4wKSk7CisgIENoZWNrU2VsZWN0aW9uKEwiREVGR0hJIik7CisKKyAgLy8gVGVzdCByZXBsYWNpbmcgdGV4dCBzZWxlY3Rpb24gd2l0aCB0ZXh0IHRvIGJlIGluc2VydGVkLgorICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IHRleHRfdG9faW5zZXJ0ID0KKyAgICAgIEdldEZQREZXaWRlU3RyaW5nKEwiSGVsbG8iKTsKKyAgRk9STV9SZXBsYWNlU2VsZWN0aW9uKGZvcm1faGFuZGxlKCksIHBhZ2UoKSwgdGV4dF90b19pbnNlcnQuZ2V0KCkpOworCisgIC8vIFNlbGVjdCBlbnRpcmUgY29udGVudHMgb2YgdGV4dCBmaWVsZCB0byBjaGVjayB0aGF0IGluc2VydGlvbiB3b3JrZWQKKyAgLy8gYXMgZXhwZWN0ZWQuCisgIFNlbGVjdEFsbFJlZ3VsYXJGb3JtVGV4dFdpdGhNb3VzZSgpOworICBDaGVja1NlbGVjdGlvbihMIkFCQ0hlbGxvSktMIik7Cit9CisKK1RFU1RfRihGUERGRm9ybUZpbGxUZXh0Rm9ybUVtYmVkZGVydGVzdCwKKyAgICAgICBJbnNlcnRUZXh0QW5kUmVwbGFjZVNlbGVjdGlvbkluUG9wdWxhdGVkVGV4dEZpZWxkUmlnaHQpIHsKKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDEyLCBSZWd1bGFyRm9ybUJlZ2luKCkpOworCisgIC8vIFNlbGVjdCByaWdodCBwb3J0aW9uIG9mIHN0cmluZyBpbiB0ZXh0IGZpZWxkLgorICBTZWxlY3RUZXh0V2l0aEtleWJvYXJkKDYsIEZXTF9WS0VZX0xlZnQsIFJlZ3VsYXJGb3JtRW5kKCkpOworICBDaGVja1NlbGVjdGlvbihMIkdISUpLTCIpOworCisgIC8vIFRlc3QgcmVwbGFjaW5nIHRleHQgc2VsZWN0aW9uIHdpdGggdGV4dCB0byBiZSBpbnNlcnRlZC4KKyAgc3RkOjp1bmlxdWVfcHRyPHVuc2lnbmVkIHNob3J0LCBwZGZpdW06OkZyZWVEZWxldGVyPiB0ZXh0X3RvX2luc2VydCA9CisgICAgICBHZXRGUERGV2lkZVN0cmluZyhMIkhlbGxvIik7CisgIEZPUk1fUmVwbGFjZVNlbGVjdGlvbihmb3JtX2hhbmRsZSgpLCBwYWdlKCksIHRleHRfdG9faW5zZXJ0LmdldCgpKTsKKworICAvLyBTZWxlY3QgZW50aXJlIGNvbnRlbnRzIG9mIHRleHQgZmllbGQgdG8gY2hlY2sgdGhhdCBpbnNlcnRpb24gd29ya2VkCisgIC8vIGFzIGV4cGVjdGVkLgorICBTZWxlY3RBbGxSZWd1bGFyRm9ybVRleHRXaXRoTW91c2UoKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJBQkNERUZIZWxsbyIpOworfQorCitURVNUX0YoRlBERkZvcm1GaWxsQ29tYm9Cb3hGb3JtRW1iZWRkZXJ0ZXN0LAorICAgICAgIEluc2VydFRleHRJbkVtcHR5RWRpdGFibGVDb21ib0JveCkgeworICBDbGlja09uRm9ybUZpZWxkQXRQb2ludChFZGl0YWJsZUZvcm1CZWdpbigpKTsKKworICAvLyBUZXN0IGluc2VydGluZyB0ZXh0IGludG8gZW1wdHkgdXNlci1lZGl0YWJsZSBjb21ib2JveC4KKyAgc3RkOjp1bmlxdWVfcHRyPHVuc2lnbmVkIHNob3J0LCBwZGZpdW06OkZyZWVEZWxldGVyPiB0ZXh0X3RvX2luc2VydCA9CisgICAgICBHZXRGUERGV2lkZVN0cmluZyhMIkhlbGxvIik7CisgIEZPUk1fUmVwbGFjZVNlbGVjdGlvbihmb3JtX2hhbmRsZSgpLCBwYWdlKCksIHRleHRfdG9faW5zZXJ0LmdldCgpKTsKKworICAvLyBTZWxlY3QgZW50aXJlIGNvbnRlbnRzIG9mIHVzZXItZWRpdGFibGUgY29tYm9ib3ggdGV4dCBmaWVsZCB0byBjaGVjayB0aGF0CisgIC8vIGluc2VydGlvbiB3b3JrZWQgYXMgZXhwZWN0ZWQuCisgIFNlbGVjdEFsbEVkaXRhYmxlRm9ybVRleHRXaXRoTW91c2UoKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJIZWxsbyIpOworfQorCitURVNUX0YoRlBERkZvcm1GaWxsQ29tYm9Cb3hGb3JtRW1iZWRkZXJ0ZXN0LAorICAgICAgIEluc2VydFRleHRJblBvcHVsYXRlZEVkaXRhYmxlQ29tYm9Cb3hMZWZ0KSB7CisgIFR5cGVUZXh0SW50b1RleHRGaWVsZCg2LCBFZGl0YWJsZUZvcm1CZWdpbigpKTsKKworICAvLyBDbGljayBvbiB0aGUgbGVmdG1vc3QgcGFydCBvZiB0aGUgdXNlci1lZGl0YWJsZSBjb21ib2JveC4KKyAgQ2xpY2tPbkZvcm1GaWVsZEF0UG9pbnQoRWRpdGFibGVGb3JtQmVnaW4oKSk7CisKKyAgLy8gVGVzdCBpbnNlcnRpbmcgdGV4dCBpbiBmcm9udCBvZiBleGlzdGluZyB0ZXh0IGluIHVzZXItZWRpdGFibGUgY29tYm9ib3guCisgIHN0ZDo6dW5pcXVlX3B0cjx1bnNpZ25lZCBzaG9ydCwgcGRmaXVtOjpGcmVlRGVsZXRlcj4gdGV4dF90b19pbnNlcnQgPQorICAgICAgR2V0RlBERldpZGVTdHJpbmcoTCJIZWxsbyIpOworICBGT1JNX1JlcGxhY2VTZWxlY3Rpb24oZm9ybV9oYW5kbGUoKSwgcGFnZSgpLCB0ZXh0X3RvX2luc2VydC5nZXQoKSk7CisKKyAgLy8gU2VsZWN0IGVudGlyZSBjb250ZW50cyBvZiB1c2VyLWVkaXRhYmxlIGNvbWJvYm94IHRleHQgZmllbGQgdG8gY2hlY2sgdGhhdAorICAvLyBpbnNlcnRpb24gd29ya2VkIGFzIGV4cGVjdGVkLgorICBTZWxlY3RBbGxFZGl0YWJsZUZvcm1UZXh0V2l0aE1vdXNlKCk7CisgIENoZWNrU2VsZWN0aW9uKEwiSGVsbG9BQkNERUYiKTsKK30KKworVEVTVF9GKEZQREZGb3JtRmlsbENvbWJvQm94Rm9ybUVtYmVkZGVydGVzdCwKKyAgICAgICBJbnNlcnRUZXh0SW5Qb3B1bGF0ZWRFZGl0YWJsZUNvbWJvQm94TWlkZGxlKSB7CisgIFR5cGVUZXh0SW50b1RleHRGaWVsZCg2LCBFZGl0YWJsZUZvcm1CZWdpbigpKTsKKworICAvLyBDbGljayBvbiB0aGUgbWlkZGxlIG9mIHRoZSB1c2VyLWVkaXRhYmxlIGNvbWJvYm94LgorICBDbGlja09uRm9ybUZpZWxkQXRQb2ludChFZGl0YWJsZUZvcm1BdFgoMTI2LjApKTsKKworICAvLyBUZXN0IGluc2VydGluZyB0ZXh0IGluIHRoZSBtaWRkbGUgb2YgZXhpc3RpbmcgdGV4dCBpbiB1c2VyLWVkaXRhYmxlCisgIC8vIGNvbWJvYm94LgorICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IHRleHRfdG9faW5zZXJ0ID0KKyAgICAgIEdldEZQREZXaWRlU3RyaW5nKEwiSGVsbG8iKTsKKyAgRk9STV9SZXBsYWNlU2VsZWN0aW9uKGZvcm1faGFuZGxlKCksIHBhZ2UoKSwgdGV4dF90b19pbnNlcnQuZ2V0KCkpOworCisgIC8vIFNlbGVjdCBlbnRpcmUgY29udGVudHMgb2YgdXNlci1lZGl0YWJsZSBjb21ib2JveCB0ZXh0IGZpZWxkIHRvIGNoZWNrIHRoYXQKKyAgLy8gaW5zZXJ0aW9uIHdvcmtlZCBhcyBleHBlY3RlZC4KKyAgU2VsZWN0QWxsRWRpdGFibGVGb3JtVGV4dFdpdGhNb3VzZSgpOworICBDaGVja1NlbGVjdGlvbihMIkFCQ0hlbGxvREVGIik7Cit9CisKK1RFU1RfRihGUERGRm9ybUZpbGxDb21ib0JveEZvcm1FbWJlZGRlcnRlc3QsCisgICAgICAgSW5zZXJ0VGV4dEluUG9wdWxhdGVkRWRpdGFibGVDb21ib0JveFJpZ2h0KSB7CisgIFR5cGVUZXh0SW50b1RleHRGaWVsZCg2LCBFZGl0YWJsZUZvcm1CZWdpbigpKTsKKworICAvLyBDbGljayBvbiB0aGUgcmlnaHRtb3N0IHBhcnQgb2YgdGhlIHVzZXItZWRpdGFibGUgY29tYm9ib3guCisgIENsaWNrT25Gb3JtRmllbGRBdFBvaW50KEVkaXRhYmxlRm9ybUVuZCgpKTsKKworICAvLyBUZXN0IGluc2VydGluZyB0ZXh0IGJlaGluZCBleGlzdGluZyB0ZXh0IGluIHVzZXItZWRpdGFibGUgY29tYm9ib3guCisgIHN0ZDo6dW5pcXVlX3B0cjx1bnNpZ25lZCBzaG9ydCwgcGRmaXVtOjpGcmVlRGVsZXRlcj4gdGV4dF90b19pbnNlcnQgPQorICAgICAgR2V0RlBERldpZGVTdHJpbmcoTCJIZWxsbyIpOworICBGT1JNX1JlcGxhY2VTZWxlY3Rpb24oZm9ybV9oYW5kbGUoKSwgcGFnZSgpLCB0ZXh0X3RvX2luc2VydC5nZXQoKSk7CisKKyAgLy8gU2VsZWN0IGVudGlyZSBjb250ZW50cyBvZiB1c2VyLWVkaXRhYmxlIGNvbWJvYm94IHRleHQgZmllbGQgdG8gY2hlY2sgdGhhdAorICAvLyBpbnNlcnRpb24gd29ya2VkIGFzIGV4cGVjdGVkLgorICBTZWxlY3RBbGxFZGl0YWJsZUZvcm1UZXh0V2l0aE1vdXNlKCk7CisgIENoZWNrU2VsZWN0aW9uKEwiQUJDREVGSGVsbG8iKTsKK30KKworVEVTVF9GKEZQREZGb3JtRmlsbENvbWJvQm94Rm9ybUVtYmVkZGVydGVzdCwKKyAgICAgICBJbnNlcnRUZXh0QW5kUmVwbGFjZVNlbGVjdGlvbkluUG9wdWxhdGVkRWRpdGFibGVDb21ib0JveFdob2xlKSB7CisgIFR5cGVUZXh0SW50b1RleHRGaWVsZCgxMCwgRWRpdGFibGVGb3JtQmVnaW4oKSk7CisKKyAgLy8gU2VsZWN0IGVudGlyZSBzdHJpbmcgaW4gdXNlci1lZGl0YWJsZSBjb21ib2JveC4KKyAgU2VsZWN0VGV4dFdpdGhLZXlib2FyZCgxMCwgRldMX1ZLRVlfTGVmdCwgRWRpdGFibGVGb3JtRW5kKCkpOworICBDaGVja1NlbGVjdGlvbihMIkFCQ0RFRkdISUoiKTsKKworICAvLyBUZXN0IHJlcGxhY2luZyB0ZXh0IHNlbGVjdGlvbiB3aXRoIHRleHQgdG8gYmUgaW5zZXJ0ZWQuCisgIHN0ZDo6dW5pcXVlX3B0cjx1bnNpZ25lZCBzaG9ydCwgcGRmaXVtOjpGcmVlRGVsZXRlcj4gdGV4dF90b19pbnNlcnQgPQorICAgICAgR2V0RlBERldpZGVTdHJpbmcoTCJIZWxsbyIpOworICBGT1JNX1JlcGxhY2VTZWxlY3Rpb24oZm9ybV9oYW5kbGUoKSwgcGFnZSgpLCB0ZXh0X3RvX2luc2VydC5nZXQoKSk7CisKKyAgLy8gU2VsZWN0IGVudGlyZSBjb250ZW50cyBvZiB1c2VyLWVkaXRhYmxlIGNvbWJvYm94IHRleHQgZmllbGQgdG8gY2hlY2sgdGhhdAorICAvLyBpbnNlcnRpb24gd29ya2VkIGFzIGV4cGVjdGVkLgorICBTZWxlY3RBbGxFZGl0YWJsZUZvcm1UZXh0V2l0aE1vdXNlKCk7CisgIENoZWNrU2VsZWN0aW9uKEwiSGVsbG8iKTsKK30KKworVEVTVF9GKEZQREZGb3JtRmlsbENvbWJvQm94Rm9ybUVtYmVkZGVydGVzdCwKKyAgICAgICBJbnNlcnRUZXh0QW5kUmVwbGFjZVNlbGVjdGlvbkluUG9wdWxhdGVkRWRpdGFibGVDb21ib0JveExlZnQpIHsKKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDEwLCBFZGl0YWJsZUZvcm1CZWdpbigpKTsKKworICAvLyBTZWxlY3QgbGVmdCBwb3J0aW9uIG9mIHN0cmluZyBpbiB1c2VyLWVkaXRhYmxlIGNvbWJvYm94LgorICBTZWxlY3RUZXh0V2l0aEtleWJvYXJkKDUsIEZXTF9WS0VZX0xlZnQsIEVkaXRhYmxlRm9ybUF0WCgxNDIuMCkpOworICBDaGVja1NlbGVjdGlvbihMIkFCQ0RFIik7CisKKyAgLy8gVGVzdCByZXBsYWNpbmcgdGV4dCBzZWxlY3Rpb24gd2l0aCB0ZXh0IHRvIGJlIGluc2VydGVkLgorICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IHRleHRfdG9faW5zZXJ0ID0KKyAgICAgIEdldEZQREZXaWRlU3RyaW5nKEwiSGVsbG8iKTsKKyAgRk9STV9SZXBsYWNlU2VsZWN0aW9uKGZvcm1faGFuZGxlKCksIHBhZ2UoKSwgdGV4dF90b19pbnNlcnQuZ2V0KCkpOworCisgIC8vIFNlbGVjdCBlbnRpcmUgY29udGVudHMgb2YgdXNlci1lZGl0YWJsZSBjb21ib2JveCB0ZXh0IGZpZWxkIHRvIGNoZWNrIHRoYXQKKyAgLy8gaW5zZXJ0aW9uIHdvcmtlZCBhcyBleHBlY3RlZC4KKyAgU2VsZWN0QWxsRWRpdGFibGVGb3JtVGV4dFdpdGhNb3VzZSgpOworICBDaGVja1NlbGVjdGlvbihMIkhlbGxvRkdISUoiKTsKK30KKworVEVTVF9GKEZQREZGb3JtRmlsbENvbWJvQm94Rm9ybUVtYmVkZGVydGVzdCwKKyAgICAgICBJbnNlcnRUZXh0QW5kUmVwbGFjZVNlbGVjdGlvbkluUG9wdWxhdGVkRWRpdGFibGVDb21ib0JveE1pZGRsZSkgeworICBUeXBlVGV4dEludG9UZXh0RmllbGQoMTAsIEVkaXRhYmxlRm9ybUJlZ2luKCkpOworCisgIC8vIFNlbGVjdCBtaWRkbGUgcG9ydGlvbiBvZiBzdHJpbmcgaW4gdXNlci1lZGl0YWJsZSBjb21ib2JveC4KKyAgU2VsZWN0VGV4dFdpdGhLZXlib2FyZCg1LCBGV0xfVktFWV9MZWZ0LCBFZGl0YWJsZUZvcm1BdFgoMTY3LjApKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJERUZHSCIpOworCisgIC8vIFRlc3QgcmVwbGFjaW5nIHRleHQgc2VsZWN0aW9uIHdpdGggdGV4dCB0byBiZSBpbnNlcnRlZC4KKyAgc3RkOjp1bmlxdWVfcHRyPHVuc2lnbmVkIHNob3J0LCBwZGZpdW06OkZyZWVEZWxldGVyPiB0ZXh0X3RvX2luc2VydCA9CisgICAgICBHZXRGUERGV2lkZVN0cmluZyhMIkhlbGxvIik7CisgIEZPUk1fUmVwbGFjZVNlbGVjdGlvbihmb3JtX2hhbmRsZSgpLCBwYWdlKCksIHRleHRfdG9faW5zZXJ0LmdldCgpKTsKKworICAvLyBTZWxlY3QgZW50aXJlIGNvbnRlbnRzIG9mIHVzZXItZWRpdGFibGUgY29tYm9ib3ggdGV4dCBmaWVsZCB0byBjaGVjayB0aGF0CisgIC8vIGluc2VydGlvbiB3b3JrZWQgYXMgZXhwZWN0ZWQuCisgIFNlbGVjdEFsbEVkaXRhYmxlRm9ybVRleHRXaXRoTW91c2UoKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJBQkNIZWxsb0lKIik7Cit9CisKK1RFU1RfRihGUERGRm9ybUZpbGxDb21ib0JveEZvcm1FbWJlZGRlcnRlc3QsCisgICAgICAgSW5zZXJ0VGV4dEFuZFJlcGxhY2VTZWxlY3Rpb25JblBvcHVsYXRlZEVkaXRhYmxlQ29tYm9Cb3hSaWdodCkgeworICBUeXBlVGV4dEludG9UZXh0RmllbGQoMTAsIEVkaXRhYmxlRm9ybUJlZ2luKCkpOworCisgIC8vIFNlbGVjdCByaWdodCBwb3J0aW9uIG9mIHN0cmluZyBpbiB1c2VyLWVkaXRhYmxlIGNvbWJvYm94LgorICBTZWxlY3RUZXh0V2l0aEtleWJvYXJkKDUsIEZXTF9WS0VZX0xlZnQsIEVkaXRhYmxlRm9ybUVuZCgpKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJGR0hJSiIpOworCisgIC8vIFRlc3QgcmVwbGFjaW5nIHRleHQgc2VsZWN0aW9uIHdpdGggdGV4dCB0byBiZSBpbnNlcnRlZC4KKyAgc3RkOjp1bmlxdWVfcHRyPHVuc2lnbmVkIHNob3J0LCBwZGZpdW06OkZyZWVEZWxldGVyPiB0ZXh0X3RvX2luc2VydCA9CisgICAgICBHZXRGUERGV2lkZVN0cmluZyhMIkhlbGxvIik7CisgIEZPUk1fUmVwbGFjZVNlbGVjdGlvbihmb3JtX2hhbmRsZSgpLCBwYWdlKCksIHRleHRfdG9faW5zZXJ0LmdldCgpKTsKKworICAvLyBTZWxlY3QgZW50aXJlIGNvbnRlbnRzIG9mIHVzZXItZWRpdGFibGUgY29tYm9ib3ggdGV4dCBmaWVsZCB0byBjaGVjayB0aGF0CisgIC8vIGluc2VydGlvbiB3b3JrZWQgYXMgZXhwZWN0ZWQuCisgIFNlbGVjdEFsbEVkaXRhYmxlRm9ybVRleHRXaXRoTW91c2UoKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJBQkNERUhlbGxvIik7Cit9CisKK1RFU1RfRihGUERGRm9ybUZpbGxUZXh0Rm9ybUVtYmVkZGVydGVzdCwKKyAgICAgICBJbnNlcnRUZXh0SW5FbXB0eUNoYXJMaW1pdFRleHRGaWVsZE92ZXJmbG93KSB7CisgIC8vIENsaWNrIG9uIHRoZSB0ZXh0ZmllbGQuCisgIENsaWNrT25Gb3JtRmllbGRBdFBvaW50KENoYXJMaW1pdEZvcm1FbmQoKSk7CisKKyAgLy8gRGVsZXRlIHByZS1maWxsZWQgY29udGVudHMgb2YgdGV4dCBmaWVsZCB3aXRoIGNoYXIgbGltaXQuCisgIFNlbGVjdEFsbENoYXJMaW1pdEZvcm1UZXh0V2l0aE1vdXNlKCk7CisgIENoZWNrU2VsZWN0aW9uKEwiRWxlcGhhbnQiKTsKKyAgRk9STV9SZXBsYWNlU2VsZWN0aW9uKGZvcm1faGFuZGxlKCksIHBhZ2UoKSwgbnVsbHB0cik7CisKKyAgLy8gVGVzdCBpbnNlcnRpbmcgdGV4dCBpbnRvIG5vdyBlbXB0eSB0ZXh0IGZpZWxkIHNvIHRleHQgdG8gYmUgaW5zZXJ0ZWQKKyAgLy8gZXhjZWVkcyB0aGUgY2hhciBsaW1pdCBhbmQgaXMgY3V0IG9mZi4KKyAgc3RkOjp1bmlxdWVfcHRyPHVuc2lnbmVkIHNob3J0LCBwZGZpdW06OkZyZWVEZWxldGVyPiB0ZXh0X3RvX2luc2VydCA9CisgICAgICBHZXRGUERGV2lkZVN0cmluZyhMIkhpcHBvcG90YW11cyIpOworICBGT1JNX1JlcGxhY2VTZWxlY3Rpb24oZm9ybV9oYW5kbGUoKSwgcGFnZSgpLCB0ZXh0X3RvX2luc2VydC5nZXQoKSk7CisKKyAgLy8gU2VsZWN0IGVudGlyZSBjb250ZW50cyBvZiB0ZXh0IGZpZWxkIHRvIGNoZWNrIHRoYXQgaW5zZXJ0aW9uIHdvcmtlZAorICAvLyBhcyBleHBlY3RlZC4KKyAgU2VsZWN0QWxsQ2hhckxpbWl0Rm9ybVRleHRXaXRoTW91c2UoKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJIaXBwb3BvdGFtIik7Cit9CisKK1RFU1RfRihGUERGRm9ybUZpbGxUZXh0Rm9ybUVtYmVkZGVydGVzdCwKKyAgICAgICBJbnNlcnRUZXh0SW5FbXB0eUNoYXJMaW1pdFRleHRGaWVsZEZpdCkgeworICAvLyBDbGljayBvbiB0aGUgdGV4dGZpZWxkLgorICBDbGlja09uRm9ybUZpZWxkQXRQb2ludChDaGFyTGltaXRGb3JtRW5kKCkpOworCisgIC8vIERlbGV0ZSBwcmUtZmlsbGVkIGNvbnRlbnRzIG9mIHRleHQgZmllbGQgd2l0aCBjaGFyIGxpbWl0LgorICBTZWxlY3RBbGxDaGFyTGltaXRGb3JtVGV4dFdpdGhNb3VzZSgpOworICBDaGVja1NlbGVjdGlvbihMIkVsZXBoYW50Iik7CisgIEZPUk1fUmVwbGFjZVNlbGVjdGlvbihmb3JtX2hhbmRsZSgpLCBwYWdlKCksIG51bGxwdHIpOworCisgIC8vIFRlc3QgaW5zZXJ0aW5nIHRleHQgaW50byBub3cgZW1wdHkgdGV4dCBmaWVsZCBzbyB0ZXh0IHRvIGJlIGluc2VydGVkCisgIC8vIGV4Y2VlZHMgdGhlIGNoYXIgbGltaXQgYW5kIGlzIGN1dCBvZmYuCisgIHN0ZDo6dW5pcXVlX3B0cjx1bnNpZ25lZCBzaG9ydCwgcGRmaXVtOjpGcmVlRGVsZXRlcj4gdGV4dF90b19pbnNlcnQgPQorICAgICAgR2V0RlBERldpZGVTdHJpbmcoTCJaZWJyYSIpOworICBGT1JNX1JlcGxhY2VTZWxlY3Rpb24oZm9ybV9oYW5kbGUoKSwgcGFnZSgpLCB0ZXh0X3RvX2luc2VydC5nZXQoKSk7CisKKyAgLy8gU2VsZWN0IGVudGlyZSBjb250ZW50cyBvZiB0ZXh0IGZpZWxkIHRvIGNoZWNrIHRoYXQgaW5zZXJ0aW9uIHdvcmtlZAorICAvLyBhcyBleHBlY3RlZC4KKyAgU2VsZWN0QWxsQ2hhckxpbWl0Rm9ybVRleHRXaXRoTW91c2UoKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJaZWJyYSIpOworfQorCitURVNUX0YoRlBERkZvcm1GaWxsVGV4dEZvcm1FbWJlZGRlcnRlc3QsCisgICAgICAgSW5zZXJ0VGV4dEluUG9wdWxhdGVkQ2hhckxpbWl0VGV4dEZpZWxkTGVmdCkgeworICAvLyBDbGljayBvbiB0aGUgbGVmdG1vc3QgcGFydCBvZiB0aGUgdGV4dCBmaWVsZC4KKyAgQ2xpY2tPbkZvcm1GaWVsZEF0UG9pbnQoQ2hhckxpbWl0Rm9ybUJlZ2luKCkpOworCisgIC8vIFRlc3QgaW5zZXJ0aW5nIHRleHQgaW4gZnJvbnQgb2YgZXhpc3RpbmcgdGV4dCBpbiB0ZXh0IGZpZWxkLgorICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IHRleHRfdG9faW5zZXJ0ID0KKyAgICAgIEdldEZQREZXaWRlU3RyaW5nKEwiSGlwcG9wb3RhbXVzIik7CisgIEZPUk1fUmVwbGFjZVNlbGVjdGlvbihmb3JtX2hhbmRsZSgpLCBwYWdlKCksIHRleHRfdG9faW5zZXJ0LmdldCgpKTsKKworICAvLyBTZWxlY3QgZW50aXJlIGNvbnRlbnRzIG9mIHRleHQgZmllbGQgdG8gY2hlY2sgdGhhdCBpbnNlcnRpb24gd29ya2VkCisgIC8vIGFzIGV4cGVjdGVkLgorICBTZWxlY3RBbGxDaGFyTGltaXRGb3JtVGV4dFdpdGhNb3VzZSgpOworICBDaGVja1NlbGVjdGlvbihMIkhpRWxlcGhhbnQiKTsKK30KKworVEVTVF9GKEZQREZGb3JtRmlsbFRleHRGb3JtRW1iZWRkZXJ0ZXN0LAorICAgICAgIEluc2VydFRleHRJblBvcHVsYXRlZENoYXJMaW1pdFRleHRGaWVsZE1pZGRsZSkgeworICBUeXBlVGV4dEludG9UZXh0RmllbGQoOCwgUmVndWxhckZvcm1CZWdpbigpKTsKKworICAvLyBDbGljayBvbiB0aGUgbWlkZGxlIG9mIHRoZSB0ZXh0IGZpZWxkLgorICBDbGlja09uRm9ybUZpZWxkQXRQb2ludChDaGFyTGltaXRGb3JtQXRYKDEzNC4wKSk7CisKKyAgLy8gVGVzdCBpbnNlcnRpbmcgdGV4dCBpbiB0aGUgbWlkZGxlIG9mIGV4aXN0aW5nIHRleHQgaW4gdGV4dCBmaWVsZC4KKyAgc3RkOjp1bmlxdWVfcHRyPHVuc2lnbmVkIHNob3J0LCBwZGZpdW06OkZyZWVEZWxldGVyPiB0ZXh0X3RvX2luc2VydCA9CisgICAgICBHZXRGUERGV2lkZVN0cmluZyhMIkhpcHBvcG90YW11cyIpOworICBGT1JNX1JlcGxhY2VTZWxlY3Rpb24oZm9ybV9oYW5kbGUoKSwgcGFnZSgpLCB0ZXh0X3RvX2luc2VydC5nZXQoKSk7CisKKyAgLy8gU2VsZWN0IGVudGlyZSBjb250ZW50cyBvZiB0ZXh0IGZpZWxkIHRvIGNoZWNrIHRoYXQgaW5zZXJ0aW9uIHdvcmtlZAorICAvLyBhcyBleHBlY3RlZC4KKyAgU2VsZWN0QWxsQ2hhckxpbWl0Rm9ybVRleHRXaXRoTW91c2UoKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJFbGVwaEhpYW50Iik7Cit9CisKK1RFU1RfRihGUERGRm9ybUZpbGxUZXh0Rm9ybUVtYmVkZGVydGVzdCwKKyAgICAgICBJbnNlcnRUZXh0SW5Qb3B1bGF0ZWRDaGFyTGltaXRUZXh0RmllbGRSaWdodCkgeworICBUeXBlVGV4dEludG9UZXh0RmllbGQoOCwgUmVndWxhckZvcm1CZWdpbigpKTsKKworICAvLyBDbGljayBvbiB0aGUgcmlnaHRtb3N0IHBhcnQgb2YgdGhlIHRleHQgZmllbGQuCisgIENsaWNrT25Gb3JtRmllbGRBdFBvaW50KENoYXJMaW1pdEZvcm1BdFgoMTY2LjApKTsKKworICAvLyBUZXN0IGluc2VydGluZyB0ZXh0IGJlaGluZCBleGlzdGluZyB0ZXh0IGluIHRleHQgZmllbGQuCisgIHN0ZDo6dW5pcXVlX3B0cjx1bnNpZ25lZCBzaG9ydCwgcGRmaXVtOjpGcmVlRGVsZXRlcj4gdGV4dF90b19pbnNlcnQgPQorICAgICAgR2V0RlBERldpZGVTdHJpbmcoTCJIaXBwb3BvdGFtdXMiKTsKKyAgRk9STV9SZXBsYWNlU2VsZWN0aW9uKGZvcm1faGFuZGxlKCksIHBhZ2UoKSwgdGV4dF90b19pbnNlcnQuZ2V0KCkpOworCisgIC8vIFNlbGVjdCBlbnRpcmUgY29udGVudHMgb2YgdGV4dCBmaWVsZCB0byBjaGVjayB0aGF0IGluc2VydGlvbiB3b3JrZWQKKyAgLy8gYXMgZXhwZWN0ZWQuCisgIFNlbGVjdEFsbENoYXJMaW1pdEZvcm1UZXh0V2l0aE1vdXNlKCk7CisgIENoZWNrU2VsZWN0aW9uKEwiRWxlcGhhbnRIaSIpOworfQorCitURVNUX0YoRlBERkZvcm1GaWxsVGV4dEZvcm1FbWJlZGRlcnRlc3QsCisgICAgICAgSW5zZXJ0VGV4dEFuZFJlcGxhY2VTZWxlY3Rpb25JblBvcHVsYXRlZENoYXJMaW1pdFRleHRGaWVsZFdob2xlKSB7CisgIFR5cGVUZXh0SW50b1RleHRGaWVsZCgxMiwgUmVndWxhckZvcm1CZWdpbigpKTsKKworICAvLyBTZWxlY3QgZW50aXJlIHN0cmluZyBpbiB0ZXh0IGZpZWxkLgorICBTZWxlY3RUZXh0V2l0aEtleWJvYXJkKDEyLCBGV0xfVktFWV9MZWZ0LCBDaGFyTGltaXRGb3JtRW5kKCkpOworICBDaGVja1NlbGVjdGlvbihMIkVsZXBoYW50Iik7CisKKyAgLy8gVGVzdCByZXBsYWNpbmcgdGV4dCBzZWxlY3Rpb24gd2l0aCB0ZXh0IHRvIGJlIGluc2VydGVkLgorICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IHRleHRfdG9faW5zZXJ0ID0KKyAgICAgIEdldEZQREZXaWRlU3RyaW5nKEwiSGlwcG9wb3RhbXVzIik7CisgIEZPUk1fUmVwbGFjZVNlbGVjdGlvbihmb3JtX2hhbmRsZSgpLCBwYWdlKCksIHRleHRfdG9faW5zZXJ0LmdldCgpKTsKKworICAvLyBTZWxlY3QgZW50aXJlIGNvbnRlbnRzIG9mIHRleHQgZmllbGQgdG8gY2hlY2sgdGhhdCBpbnNlcnRpb24gd29ya2VkCisgIC8vIGFzIGV4cGVjdGVkLgorICBTZWxlY3RBbGxDaGFyTGltaXRGb3JtVGV4dFdpdGhNb3VzZSgpOworICBDaGVja1NlbGVjdGlvbihMIkhpcHBvcG90YW0iKTsKK30KKworVEVTVF9GKEZQREZGb3JtRmlsbFRleHRGb3JtRW1iZWRkZXJ0ZXN0LAorICAgICAgIEluc2VydFRleHRBbmRSZXBsYWNlU2VsZWN0aW9uSW5Qb3B1bGF0ZWRDaGFyTGltaXRUZXh0RmllbGRMZWZ0KSB7CisgIFR5cGVUZXh0SW50b1RleHRGaWVsZCgxMiwgUmVndWxhckZvcm1CZWdpbigpKTsKKworICAvLyBTZWxlY3QgbGVmdCBwb3J0aW9uIG9mIHN0cmluZyBpbiB0ZXh0IGZpZWxkLgorICBTZWxlY3RUZXh0V2l0aEtleWJvYXJkKDQsIEZXTF9WS0VZX0xlZnQsIENoYXJMaW1pdEZvcm1BdFgoMTIyLjApKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJFbGVwIik7CisKKyAgLy8gVGVzdCByZXBsYWNpbmcgdGV4dCBzZWxlY3Rpb24gd2l0aCB0ZXh0IHRvIGJlIGluc2VydGVkLgorICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IHRleHRfdG9faW5zZXJ0ID0KKyAgICAgIEdldEZQREZXaWRlU3RyaW5nKEwiSGlwcG9wb3RhbXVzIik7CisgIEZPUk1fUmVwbGFjZVNlbGVjdGlvbihmb3JtX2hhbmRsZSgpLCBwYWdlKCksIHRleHRfdG9faW5zZXJ0LmdldCgpKTsKKworICAvLyBTZWxlY3QgZW50aXJlIGNvbnRlbnRzIG9mIHRleHQgZmllbGQgdG8gY2hlY2sgdGhhdCBpbnNlcnRpb24gd29ya2VkCisgIC8vIGFzIGV4cGVjdGVkLgorICBTZWxlY3RBbGxDaGFyTGltaXRGb3JtVGV4dFdpdGhNb3VzZSgpOworICBDaGVja1NlbGVjdGlvbihMIkhpcHBvcGhhbnQiKTsKK30KKworVEVTVF9GKEZQREZGb3JtRmlsbFRleHRGb3JtRW1iZWRkZXJ0ZXN0LAorICAgICAgIEluc2VydFRleHRBbmRSZXBsYWNlU2VsZWN0aW9uSW5Qb3B1bGF0ZWRDaGFyTGltaXRUZXh0RmllbGRNaWRkbGUpIHsKKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDEyLCBSZWd1bGFyRm9ybUJlZ2luKCkpOworCisgIC8vIFNlbGVjdCBtaWRkbGUgcG9ydGlvbiBvZiBzdHJpbmcgaW4gdGV4dCBmaWVsZC4KKyAgU2VsZWN0VGV4dFdpdGhLZXlib2FyZCg0LCBGV0xfVktFWV9MZWZ0LCBDaGFyTGltaXRGb3JtQXRYKDEzNi4wKSk7CisgIENoZWNrU2VsZWN0aW9uKEwiZXBoYSIpOworCisgIC8vIFRlc3QgcmVwbGFjaW5nIHRleHQgc2VsZWN0aW9uIHdpdGggdGV4dCB0byBiZSBpbnNlcnRlZC4KKyAgc3RkOjp1bmlxdWVfcHRyPHVuc2lnbmVkIHNob3J0LCBwZGZpdW06OkZyZWVEZWxldGVyPiB0ZXh0X3RvX2luc2VydCA9CisgICAgICBHZXRGUERGV2lkZVN0cmluZyhMIkhpcHBvcG90YW11cyIpOworICBGT1JNX1JlcGxhY2VTZWxlY3Rpb24oZm9ybV9oYW5kbGUoKSwgcGFnZSgpLCB0ZXh0X3RvX2luc2VydC5nZXQoKSk7CisKKyAgLy8gU2VsZWN0IGVudGlyZSBjb250ZW50cyBvZiB0ZXh0IGZpZWxkIHRvIGNoZWNrIHRoYXQgaW5zZXJ0aW9uIHdvcmtlZAorICAvLyBhcyBleHBlY3RlZC4KKyAgU2VsZWN0QWxsQ2hhckxpbWl0Rm9ybVRleHRXaXRoTW91c2UoKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJFbEhpcHBvcG50Iik7Cit9CisKK1RFU1RfRihGUERGRm9ybUZpbGxUZXh0Rm9ybUVtYmVkZGVydGVzdCwKKyAgICAgICBJbnNlcnRUZXh0QW5kUmVwbGFjZVNlbGVjdGlvbkluUG9wdWxhdGVkQ2hhckxpbWl0VGV4dEZpZWxkUmlnaHQpIHsKKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDEyLCBSZWd1bGFyRm9ybUJlZ2luKCkpOworCisgIC8vIFNlbGVjdCByaWdodCBwb3J0aW9uIG9mIHN0cmluZyBpbiB0ZXh0IGZpZWxkLgorICBTZWxlY3RUZXh0V2l0aEtleWJvYXJkKDQsIEZXTF9WS0VZX0xlZnQsIENoYXJMaW1pdEZvcm1BdFgoMTUyLjApKTsKKyAgQ2hlY2tTZWxlY3Rpb24oTCJoYW50Iik7CisKKyAgLy8gVGVzdCByZXBsYWNpbmcgdGV4dCBzZWxlY3Rpb24gd2l0aCB0ZXh0IHRvIGJlIGluc2VydGVkLgorICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWQgc2hvcnQsIHBkZml1bTo6RnJlZURlbGV0ZXI+IHRleHRfdG9faW5zZXJ0ID0KKyAgICAgIEdldEZQREZXaWRlU3RyaW5nKEwiSGlwcG9wb3RhbXVzIik7CisgIEZPUk1fUmVwbGFjZVNlbGVjdGlvbihmb3JtX2hhbmRsZSgpLCBwYWdlKCksIHRleHRfdG9faW5zZXJ0LmdldCgpKTsKKworICAvLyBTZWxlY3QgZW50aXJlIGNvbnRlbnRzIG9mIHRleHQgZmllbGQgdG8gY2hlY2sgdGhhdCBpbnNlcnRpb24gd29ya2VkCisgIC8vIGFzIGV4cGVjdGVkLgorICBTZWxlY3RBbGxDaGFyTGltaXRGb3JtVGV4dFdpdGhNb3VzZSgpOworICBDaGVja1NlbGVjdGlvbihMIkVsZXBIaXBwb3AiKTsKK30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnBkZnBwby5jcHAgYi9mcGRmc2RrL2ZwZGZwcG8uY3BwCmluZGV4IDRlMDY4NTYuLmQ4OGY5MTAgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvZnBkZnBwby5jcHAKKysrIGIvZnBkZnNkay9mcGRmcHBvLmNwcApAQCAtMTgsMTQgKzE4LDE0IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3JlZmVyZW5jZS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogI2luY2x1ZGUgImZwZGZzZGsvZnNka19kZWZpbmUuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgogCiBuYW1lc3BhY2UgewogCiBDUERGX09iamVjdCogUGFnZURpY3RHZXRJbmhlcml0YWJsZVRhZyhDUERGX0RpY3Rpb25hcnkqIHBEaWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzU3JjVGFnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBic1NyY1RhZykgewogICBpZiAoIXBEaWN0IHx8IGJzU3JjVGFnLklzRW1wdHkoKSkKICAgICByZXR1cm4gbnVsbHB0cjsKICAgaWYgKCFwRGljdC0+S2V5RXhpc3QoIlBhcmVudCIpIHx8ICFwRGljdC0+S2V5RXhpc3QoIlR5cGUiKSkKQEAgLTU3LDcgKzU3LDcgQEAKIAogYm9vbCBDb3B5SW5oZXJpdGFibGUoQ1BERl9EaWN0aW9uYXJ5KiBwQ3VyUGFnZURpY3QsCiAgICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBTcmNQYWdlRGljdCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXkpIHsKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIGtleSkgewogICBpZiAocEN1clBhZ2VEaWN0LT5LZXlFeGlzdChrZXkpKQogICAgIHJldHVybiB0cnVlOwogCkBAIC02OSw1NCArNjksNTcgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgUGFyc2VyUGFnZVJhbmdlU3RyaW5nKENGWF9CeXRlU3RyaW5nIHJhbmdzdHJpbmcsCitib29sIFBhcnNlclBhZ2VSYW5nZVN0cmluZyhCeXRlU3RyaW5nIHJhbmdzdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MTZfdD4qIHBhZ2VBcnJheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ291bnQpIHsKICAgaWYgKHJhbmdzdHJpbmcuSXNFbXB0eSgpKQogICAgIHJldHVybiB0cnVlOwogCiAgIHJhbmdzdHJpbmcuUmVtb3ZlKCcgJyk7Ci0gIGludCBuTGVuZ3RoID0gcmFuZ3N0cmluZy5HZXRMZW5ndGgoKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgY2JDb21wYXJlU3RyaW5nKCIwMTIzNDU2Nzg5LSwiKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTGVuZ3RoOyArK2kpIHsKLSAgICBpZiAoY2JDb21wYXJlU3RyaW5nLkZpbmQocmFuZ3N0cmluZ1tpXSkgPT0gLTEpCisgIHNpemVfdCBuTGVuZ3RoID0gcmFuZ3N0cmluZy5HZXRMZW5ndGgoKTsKKyAgQnl0ZVN0cmluZyBjYkNvbXBhcmVTdHJpbmcoIjAxMjM0NTY3ODktLCIpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5MZW5ndGg7ICsraSkgeworICAgIGlmICghY2JDb21wYXJlU3RyaW5nLkNvbnRhaW5zKHJhbmdzdHJpbmdbaV0pKQogICAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgY2JNaWRSYW5nZTsKLSAgaW50IG5TdHJpbmdGcm9tID0gMDsKLSAgaW50IG5TdHJpbmdUbyA9IDA7CisgIEJ5dGVTdHJpbmcgY2JNaWRSYW5nZTsKKyAgc2l6ZV90IG5TdHJpbmdGcm9tID0gMDsKKyAgT3B0aW9uYWw8c2l6ZV90PiBuU3RyaW5nVG8gPSAwOwogICB3aGlsZSAoblN0cmluZ1RvIDwgbkxlbmd0aCkgewogICAgIG5TdHJpbmdUbyA9IHJhbmdzdHJpbmcuRmluZCgnLCcsIG5TdHJpbmdGcm9tKTsKLSAgICBpZiAoblN0cmluZ1RvID09IC0xKQorICAgIGlmICghblN0cmluZ1RvLmhhc192YWx1ZSgpKQogICAgICAgblN0cmluZ1RvID0gbkxlbmd0aDsKLSAgICBjYk1pZFJhbmdlID0gcmFuZ3N0cmluZy5NaWQoblN0cmluZ0Zyb20sIG5TdHJpbmdUbyAtIG5TdHJpbmdGcm9tKTsKLSAgICBpbnQgbk1pZCA9IGNiTWlkUmFuZ2UuRmluZCgnLScpOwotICAgIGlmIChuTWlkID09IC0xKSB7Ci0gICAgICBsb25nIGxQYWdlTnVtID0gYXRvbChjYk1pZFJhbmdlLmNfc3RyKCkpOwotICAgICAgaWYgKGxQYWdlTnVtIDw9IDAgfHwgbFBhZ2VOdW0gPiBuQ291bnQpCisgICAgY2JNaWRSYW5nZSA9IHJhbmdzdHJpbmcuTWlkKG5TdHJpbmdGcm9tLCBuU3RyaW5nVG8udmFsdWUoKSAtIG5TdHJpbmdGcm9tKTsKKyAgICBhdXRvIG5NaWQgPSBjYk1pZFJhbmdlLkZpbmQoJy0nKTsKKyAgICBpZiAoIW5NaWQuaGFzX3ZhbHVlKCkpIHsKKyAgICAgIHVpbnQxNl90IHBhZ2VOdW0gPQorICAgICAgICAgIHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PHVpbnQxNl90PihhdG9pKGNiTWlkUmFuZ2UuY19zdHIoKSkpOworICAgICAgaWYgKHBhZ2VOdW0gPD0gMCB8fCBwYWdlTnVtID4gbkNvdW50KQogICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBwYWdlQXJyYXktPnB1c2hfYmFjaygodWludDE2X3QpbFBhZ2VOdW0pOworICAgICAgcGFnZUFycmF5LT5wdXNoX2JhY2socGFnZU51bSk7CiAgICAgfSBlbHNlIHsKLSAgICAgIGludCBuU3RhcnRQYWdlTnVtID0gYXRvbChjYk1pZFJhbmdlLk1pZCgwLCBuTWlkKS5jX3N0cigpKTsKKyAgICAgIHVpbnQxNl90IG5TdGFydFBhZ2VOdW0gPSBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDx1aW50MTZfdD4oCisgICAgICAgICAgYXRvaShjYk1pZFJhbmdlLkxlZnQobk1pZC52YWx1ZSgpKS5jX3N0cigpKSk7CiAgICAgICBpZiAoblN0YXJ0UGFnZU51bSA9PSAwKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgICsrbk1pZDsKLSAgICAgIGludCBuRW5kID0gY2JNaWRSYW5nZS5HZXRMZW5ndGgoKSAtIG5NaWQ7CisgICAgICBuTWlkID0gbk1pZC52YWx1ZSgpICsgMTsKKyAgICAgIHNpemVfdCBuRW5kID0gY2JNaWRSYW5nZS5HZXRMZW5ndGgoKSAtIG5NaWQudmFsdWUoKTsKICAgICAgIGlmIChuRW5kID09IDApCiAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgICAgaW50IG5FbmRQYWdlTnVtID0gYXRvbChjYk1pZFJhbmdlLk1pZChuTWlkLCBuRW5kKS5jX3N0cigpKTsKKyAgICAgIHVpbnQxNl90IG5FbmRQYWdlTnVtID0gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8dWludDE2X3Q+KAorICAgICAgICAgIGF0b2koY2JNaWRSYW5nZS5NaWQobk1pZC52YWx1ZSgpLCBuRW5kKS5jX3N0cigpKSk7CiAgICAgICBpZiAoblN0YXJ0UGFnZU51bSA8IDAgfHwgblN0YXJ0UGFnZU51bSA+IG5FbmRQYWdlTnVtIHx8CiAgICAgICAgICAgbkVuZFBhZ2VOdW0gPiBuQ291bnQpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQotICAgICAgZm9yIChpbnQgaSA9IG5TdGFydFBhZ2VOdW07IGkgPD0gbkVuZFBhZ2VOdW07ICsraSkgeworICAgICAgZm9yICh1aW50MTZfdCBpID0gblN0YXJ0UGFnZU51bTsgaSA8PSBuRW5kUGFnZU51bTsgKytpKSB7CiAgICAgICAgIHBhZ2VBcnJheS0+cHVzaF9iYWNrKGkpOwogICAgICAgfQogICAgIH0KLSAgICBuU3RyaW5nRnJvbSA9IG5TdHJpbmdUbyArIDE7CisgICAgblN0cmluZ0Zyb20gPSBuU3RyaW5nVG8udmFsdWUoKSArIDE7CiAgIH0KICAgcmV0dXJuIHRydWU7CiB9CkBAIC0xMzcsOCArMTQwLDggQEAKICAgYm9vbCBVcGRhdGVSZWZlcmVuY2UoQ1BERl9PYmplY3QqIHBPYmosIE9iamVjdE51bWJlck1hcCogcE9iak51bWJlck1hcCk7CiAgIHVpbnQzMl90IEdldE5ld09iaklkKE9iamVjdE51bWJlck1hcCogcE9iak51bWJlck1hcCwgQ1BERl9SZWZlcmVuY2UqIHBSZWYpOwogCi0gIENQREZfRG9jdW1lbnQqIG1fcERlc3RQREZEb2M7Ci0gIENQREZfRG9jdW1lbnQqIG1fcFNyY1BERkRvYzsKKyAgVW5vd25lZFB0cjxDUERGX0RvY3VtZW50PiBtX3BEZXN0UERGRG9jOworICBVbm93bmVkUHRyPENQREZfRG9jdW1lbnQ+IG1fcFNyY1BERkRvYzsKIH07CiAKIENQREZfUGFnZU9yZ2FuaXplcjo6Q1BERl9QYWdlT3JnYW5pemVyKENQREZfRG9jdW1lbnQqIHBEZXN0UERGRG9jLApAQCAtMTYxLDcgKzE2NCw3IEBACiAKICAgcERvY0luZm9EaWN0LT5TZXROZXdGb3I8Q1BERl9TdHJpbmc+KCJQcm9kdWNlciIsICJQREZpdW0iLCBmYWxzZSk7CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgY2JSb290VHlwZSA9IHBOZXdSb290LT5HZXRTdHJpbmdGb3IoIlR5cGUiLCAiIik7CisgIEJ5dGVTdHJpbmcgY2JSb290VHlwZSA9IHBOZXdSb290LT5HZXRTdHJpbmdGb3IoIlR5cGUiLCAiIik7CiAgIGlmIChjYlJvb3RUeXBlLklzRW1wdHkoKSkKICAgICBwTmV3Um9vdC0+U2V0TmV3Rm9yPENQREZfTmFtZT4oIlR5cGUiLCAiQ2F0YWxvZyIpOwogCkBAIC0xNzAsMTggKzE3MywxOCBAQAogICAgICAgcEVsZW1lbnQgPyBUb0RpY3Rpb25hcnkocEVsZW1lbnQtPkdldERpcmVjdCgpKSA6IG51bGxwdHI7CiAgIGlmICghcE5ld1BhZ2VzKSB7CiAgICAgcE5ld1BhZ2VzID0gbV9wRGVzdFBERkRvYy0+TmV3SW5kaXJlY3Q8Q1BERl9EaWN0aW9uYXJ5PigpOwotICAgIHBOZXdSb290LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KCJQYWdlcyIsIG1fcERlc3RQREZEb2MsCisgICAgcE5ld1Jvb3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oIlBhZ2VzIiwgbV9wRGVzdFBERkRvYy5HZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV3UGFnZXMtPkdldE9iak51bSgpKTsKICAgfQogCi0gIENGWF9CeXRlU3RyaW5nIGNiUGFnZVR5cGUgPSBwTmV3UGFnZXMtPkdldFN0cmluZ0ZvcigiVHlwZSIsICIiKTsKKyAgQnl0ZVN0cmluZyBjYlBhZ2VUeXBlID0gcE5ld1BhZ2VzLT5HZXRTdHJpbmdGb3IoIlR5cGUiLCAiIik7CiAgIGlmIChjYlBhZ2VUeXBlLklzRW1wdHkoKSkKICAgICBwTmV3UGFnZXMtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJUeXBlIiwgIlBhZ2VzIik7CiAKICAgaWYgKCFwTmV3UGFnZXMtPkdldEFycmF5Rm9yKCJLaWRzIikpIHsKICAgICBwTmV3UGFnZXMtPlNldE5ld0ZvcjxDUERGX051bWJlcj4oIkNvdW50IiwgMCk7CiAgICAgcE5ld1BhZ2VzLT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KAotICAgICAgICAiS2lkcyIsIG1fcERlc3RQREZEb2MsCisgICAgICAgICJLaWRzIiwgbV9wRGVzdFBERkRvYy5HZXQoKSwKICAgICAgICAgbV9wRGVzdFBERkRvYy0+TmV3SW5kaXJlY3Q8Q1BERl9BcnJheT4oKS0+R2V0T2JqTnVtKCkpOwogICB9CiAKQEAgLTE5Miw4ICsxOTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5JbmRleCkgewogICBpbnQgY3VycGFnZSA9IG5JbmRleDsKICAgYXV0byBwT2JqTnVtYmVyTWFwID0gcGRmaXVtOjpNYWtlVW5pcXVlPE9iamVjdE51bWJlck1hcD4oKTsKLSAgaW50IG5TaXplID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQ+KHBhZ2VOdW1zKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBuU2l6ZTsgKytpKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFnZU51bXMuc2l6ZSgpOyArK2kpIHsKICAgICBDUERGX0RpY3Rpb25hcnkqIHBDdXJQYWdlRGljdCA9IG1fcERlc3RQREZEb2MtPkNyZWF0ZU5ld1BhZ2UoY3VycGFnZSk7CiAgICAgQ1BERl9EaWN0aW9uYXJ5KiBwU3JjUGFnZURpY3QgPSBtX3BTcmNQREZEb2MtPkdldFBhZ2UocGFnZU51bXNbaV0gLSAxKTsKICAgICBpZiAoIXBTcmNQYWdlRGljdCB8fCAhcEN1clBhZ2VEaWN0KQpAQCAtMjAxLDcgKzIwMyw3IEBACiAKICAgICAvLyBDbG9uZSB0aGUgcGFnZSBkaWN0aW9uYXJ5CiAgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICpwU3JjUGFnZURpY3QpIHsKLSAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjYlNyY0tleVN0ciA9IGl0LmZpcnN0OworICAgICAgY29uc3QgQnl0ZVN0cmluZyYgY2JTcmNLZXlTdHIgPSBpdC5maXJzdDsKICAgICAgIGlmIChjYlNyY0tleVN0ciA9PSAiVHlwZSIgfHwgY2JTcmNLZXlTdHIgPT0gIlBhcmVudCIpCiAgICAgICAgIGNvbnRpbnVlOwogCkBAIC0yMTAsMTYgKzIxMiwxOCBAQAogICAgIH0KIAogICAgIC8vIGluaGVyaXRhYmxlIGl0ZW0KKyAgICAvLyBFdmVuIHRob3VnaCBzb21lIGVudHJpZXMgYXJlIHJlcXVpcmVkIGJ5IHRoZSBQREYgc3BlYywgdGhlcmUgZXhpc3QKKyAgICAvLyBQREZzIHRoYXQgb21pdCB0aGVtLiBTZXQgc29tZSBkZWZhdWx0cyBpbiB0aGlzIGNhc2UuCiAgICAgLy8gMSBNZWRpYUJveCAtIHJlcXVpcmVkCiAgICAgaWYgKCFDb3B5SW5oZXJpdGFibGUocEN1clBhZ2VEaWN0LCBwU3JjUGFnZURpY3QsICJNZWRpYUJveCIpKSB7Ci0gICAgICAvLyBTZWFyY2ggZm9yICJDcm9wQm94IiBpbiB0aGUgc291cmNlIHBhZ2UgZGljdGlvbmFyeSwKLSAgICAgIC8vIGlmIGl0IGRvZXMgbm90IGV4aXN0cywgdXNlIHRoZSBkZWZhdWx0IGxldHRlciBzaXplLgorICAgICAgLy8gU2VhcmNoIGZvciAiQ3JvcEJveCIgaW4gdGhlIHNvdXJjZSBwYWdlIGRpY3Rpb25hcnkuCisgICAgICAvLyBJZiBpdCBkb2VzIG5vdCBleGlzdCwgdXNlIHRoZSBkZWZhdWx0IGxldHRlciBzaXplLgogICAgICAgQ1BERl9PYmplY3QqIHBJbmhlcml0YWJsZSA9CiAgICAgICAgICAgUGFnZURpY3RHZXRJbmhlcml0YWJsZVRhZyhwU3JjUGFnZURpY3QsICJDcm9wQm94Iik7CiAgICAgICBpZiAocEluaGVyaXRhYmxlKSB7CiAgICAgICAgIHBDdXJQYWdlRGljdC0+U2V0Rm9yKCJNZWRpYUJveCIsIHBJbmhlcml0YWJsZS0+Q2xvbmUoKSk7CiAgICAgICB9IGVsc2UgewotICAgICAgICAvLyBNYWtlIHRoZSBkZWZhdWx0IHNpemUgdG8gYmUgbGV0dGVyIHNpemUgKDguNSd4MTEnKQorICAgICAgICAvLyBNYWtlIHRoZSBkZWZhdWx0IHNpemUgbGV0dGVyIHNpemUgKDguNSJ4MTEiKQogICAgICAgICBDUERGX0FycmF5KiBwQXJyYXkgPSBwQ3VyUGFnZURpY3QtPlNldE5ld0ZvcjxDUERGX0FycmF5PigiTWVkaWFCb3giKTsKICAgICAgICAgcEFycmF5LT5BZGROZXc8Q1BERl9OdW1iZXI+KDApOwogICAgICAgICBwQXJyYXktPkFkZE5ldzxDUERGX051bWJlcj4oMCk7CkBAIC0yMjksOCArMjMzLDEwIEBACiAgICAgfQogCiAgICAgLy8gMiBSZXNvdXJjZXMgLSByZXF1aXJlZAotICAgIGlmICghQ29weUluaGVyaXRhYmxlKHBDdXJQYWdlRGljdCwgcFNyY1BhZ2VEaWN0LCAiUmVzb3VyY2VzIikpCi0gICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFDb3B5SW5oZXJpdGFibGUocEN1clBhZ2VEaWN0LCBwU3JjUGFnZURpY3QsICJSZXNvdXJjZXMiKSkgeworICAgICAgLy8gVXNlIGEgZGVmYXVsdCBlbXB0eSByZXNvdXJjZXMgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgICAgICBwQ3VyUGFnZURpY3QtPlNldE5ld0ZvcjxDUERGX0RpY3Rpb25hcnk+KCJSZXNvdXJjZXMiKTsKKyAgICB9CiAKICAgICAvLyAzIENyb3BCb3ggLSBvcHRpb25hbAogICAgIENvcHlJbmhlcml0YWJsZShwQ3VyUGFnZURpY3QsIHBTcmNQYWdlRGljdCwgIkNyb3BCb3giKTsKQEAgLTI1NiwxNCArMjYyLDE0IEBACiAgICAgICB1aW50MzJfdCBuZXdvYmpudW0gPSBHZXROZXdPYmpJZChwT2JqTnVtYmVyTWFwLCBwUmVmZXJlbmNlKTsKICAgICAgIGlmIChuZXdvYmpudW0gPT0gMCkKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgcFJlZmVyZW5jZS0+U2V0UmVmKG1fcERlc3RQREZEb2MsIG5ld29iam51bSk7CisgICAgICBwUmVmZXJlbmNlLT5TZXRSZWYobV9wRGVzdFBERkRvYy5HZXQoKSwgbmV3b2JqbnVtKTsKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBjYXNlIENQREZfT2JqZWN0OjpESUNUSU9OQVJZOiB7CiAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcE9iai0+QXNEaWN0aW9uYXJ5KCk7CiAgICAgICBhdXRvIGl0ID0gcERpY3QtPmJlZ2luKCk7CiAgICAgICB3aGlsZSAoaXQgIT0gcERpY3QtPmVuZCgpKSB7Ci0gICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXkgPSBpdC0+Zmlyc3Q7CisgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIGtleSA9IGl0LT5maXJzdDsKICAgICAgICAgQ1BERl9PYmplY3QqIHBOZXh0T2JqID0gaXQtPnNlY29uZC5nZXQoKTsKICAgICAgICAgKytpdDsKICAgICAgICAgaWYgKGtleSA9PSAiUGFyZW50IiB8fCBrZXkgPT0gIlByZXYiIHx8IGtleSA9PSAiRmlyc3QiKQpAQCAtMzIyLDcgKzMyOCw3IEBACiAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX09iamVjdD4gcENsb25lID0gcERpcmVjdC0+Q2xvbmUoKTsKICAgaWYgKENQREZfRGljdGlvbmFyeSogcERpY3RDbG9uZSA9IHBDbG9uZS0+QXNEaWN0aW9uYXJ5KCkpIHsKICAgICBpZiAocERpY3RDbG9uZS0+S2V5RXhpc3QoIlR5cGUiKSkgewotICAgICAgQ0ZYX0J5dGVTdHJpbmcgc3RyVHlwZSA9IHBEaWN0Q2xvbmUtPkdldFN0cmluZ0ZvcigiVHlwZSIpOworICAgICAgQnl0ZVN0cmluZyBzdHJUeXBlID0gcERpY3RDbG9uZS0+R2V0U3RyaW5nRm9yKCJUeXBlIik7CiAgICAgICBpZiAoIUZYU1lTX3N0cmljbXAoc3RyVHlwZS5jX3N0cigpLCAiUGFnZXMiKSkKICAgICAgICAgcmV0dXJuIDQ7CiAgICAgICBpZiAoIUZYU1lTX3N0cmljbXAoc3RyVHlwZS5jX3N0cigpLCAiUGFnZSIpKQpAQCAtMzM5LDEwICszNDUsMTAgQEAKICAgcmV0dXJuIGR3TmV3T2JqTnVtOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9JbXBvcnRQYWdlcyhGUERGX0RPQ1VNRU5UIGRlc3RfZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9ET0NVTUVOVCBzcmNfZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIHBhZ2VyYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgeworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRlBERl9JbXBvcnRQYWdlcyhGUERGX0RPQ1VNRU5UIGRlc3RfZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RPQ1VNRU5UIHNyY19kb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBwYWdlcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgewogICBDUERGX0RvY3VtZW50KiBwRGVzdERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZGVzdF9kb2MpOwogICBpZiAoIWRlc3RfZG9jKQogICAgIHJldHVybiBmYWxzZTsKQEAgLTM2Niw4ICszNzIsOCBAQAogICByZXR1cm4gcGFnZU9yZy5QREZEb2NJbml0KCkgJiYgcGFnZU9yZy5FeHBvcnRQYWdlKHBhZ2VBcnJheSwgaW5kZXgpOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9Db3B5Vmlld2VyUHJlZmVyZW5jZXMoRlBERl9ET0NVTUVOVCBkZXN0X2RvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RPQ1VNRU5UIHNyY19kb2MpIHsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCitGUERGX0NvcHlWaWV3ZXJQcmVmZXJlbmNlcyhGUERGX0RPQ1VNRU5UIGRlc3RfZG9jLCBGUERGX0RPQ1VNRU5UIHNyY19kb2MpIHsKICAgQ1BERl9Eb2N1bWVudCogcERzdERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZGVzdF9kb2MpOwogICBpZiAoIXBEc3REb2MpCiAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9mcGRmcHBvX2VtYmVkZGVydGVzdC5jcHAgYi9mcGRmc2RrL2ZwZGZwcG9fZW1iZWRkZXJ0ZXN0LmNwcAppbmRleCAwOTcyMzE2Li5jNjQyYjcxIDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZwZGZwcG9fZW1iZWRkZXJ0ZXN0LmNwcAorKysgYi9mcGRmc2RrL2ZwZGZwcG9fZW1iZWRkZXJ0ZXN0LmNwcApAQCAtMSwxMSArMSwxMSBAQAogLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorI2luY2x1ZGUgPHN0cmluZz4KIAotI2luY2x1ZGUgInB1YmxpYy9mcGRmX3Bwby5oIgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgogI2luY2x1ZGUgInB1YmxpYy9mcGRmX2VkaXQuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9wcG8uaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9zYXZlLmgiCiAjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCiAjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCkBAIC0xNSw2ICsxNSwxMiBAQAogCiBjbGFzcyBGUERGUFBPRW1iZWRkZXJ0ZXN0IDogcHVibGljIEVtYmVkZGVyVGVzdCB7fTsKIAoraW50IEZha2VCbG9ja1dyaXRlcihGUERGX0ZJTEVXUklURSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpIHsKKyAgcmV0dXJuIHNpemU7Cit9CisKIH0gIC8vIG5hbWVzcGFjZQogCiBURVNUX0YoRlBERlBQT0VtYmVkZGVydGVzdCwgTm9WaWV3ZXJQcmVmZXJlbmNlcykgewpAQCAtMzYsMTMgKzQyLDEzIEBACiB9CiAKIFRFU1RfRihGUERGUFBPRW1iZWRkZXJ0ZXN0LCBJbXBvcnRQYWdlcykgewotICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoInZpZXdlcl9yZWYucGRmIikpOworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInZpZXdlcl9yZWYucGRmIikpOwogCiAgIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoMCk7CiAgIEVYUEVDVF9UUlVFKHBhZ2UpOwogCiAgIEZQREZfRE9DVU1FTlQgb3V0cHV0X2RvYyA9IEZQREZfQ3JlYXRlTmV3RG9jdW1lbnQoKTsKLSAgRVhQRUNUX1RSVUUob3V0cHV0X2RvYyk7CisgIEFTU0VSVF9UUlVFKG91dHB1dF9kb2MpOwogICBFWFBFQ1RfVFJVRShGUERGX0NvcHlWaWV3ZXJQcmVmZXJlbmNlcyhvdXRwdXRfZG9jLCBkb2N1bWVudCgpKSk7CiAgIEVYUEVDVF9UUlVFKEZQREZfSW1wb3J0UGFnZXMob3V0cHV0X2RvYywgZG9jdW1lbnQoKSwgIjEiLCAwKSk7CiAgIEVYUEVDVF9FUSgxLCBGUERGX0dldFBhZ2VDb3VudChvdXRwdXRfZG9jKSk7CkBAIC01MSw2ICs1NywzNiBAQAogICBVbmxvYWRQYWdlKHBhZ2UpOwogfQogCitURVNUX0YoRlBERlBQT0VtYmVkZGVydGVzdCwgQmFkUmVwZWF0Vmlld2VyUHJlZikgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInJlcGVhdF92aWV3ZXJfcmVmLnBkZiIpKTsKKworICBGUERGX0RPQ1VNRU5UIG91dHB1dF9kb2MgPSBGUERGX0NyZWF0ZU5ld0RvY3VtZW50KCk7CisgIEVYUEVDVF9UUlVFKG91dHB1dF9kb2MpOworICBFWFBFQ1RfVFJVRShGUERGX0NvcHlWaWV3ZXJQcmVmZXJlbmNlcyhvdXRwdXRfZG9jLCBkb2N1bWVudCgpKSk7CisKKyAgRlBERl9GSUxFV1JJVEUgd3JpdGVyOworICB3cml0ZXIudmVyc2lvbiA9IDE7CisgIHdyaXRlci5Xcml0ZUJsb2NrID0gRmFrZUJsb2NrV3JpdGVyOworCisgIEVYUEVDVF9UUlVFKEZQREZfU2F2ZUFzQ29weShvdXRwdXRfZG9jLCAmd3JpdGVyLCAwKSk7CisgIEZQREZfQ2xvc2VEb2N1bWVudChvdXRwdXRfZG9jKTsKK30KKworVEVTVF9GKEZQREZQUE9FbWJlZGRlcnRlc3QsIEJhZENpcmN1bGFyVmlld2VyUHJlZikgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoImNpcmN1bGFyX3ZpZXdlcl9yZWYucGRmIikpOworCisgIEZQREZfRE9DVU1FTlQgb3V0cHV0X2RvYyA9IEZQREZfQ3JlYXRlTmV3RG9jdW1lbnQoKTsKKyAgRVhQRUNUX1RSVUUob3V0cHV0X2RvYyk7CisgIEVYUEVDVF9UUlVFKEZQREZfQ29weVZpZXdlclByZWZlcmVuY2VzKG91dHB1dF9kb2MsIGRvY3VtZW50KCkpKTsKKworICBGUERGX0ZJTEVXUklURSB3cml0ZXI7CisgIHdyaXRlci52ZXJzaW9uID0gMTsKKyAgd3JpdGVyLldyaXRlQmxvY2sgPSBGYWtlQmxvY2tXcml0ZXI7CisKKyAgRVhQRUNUX1RSVUUoRlBERl9TYXZlQXNDb3B5KG91dHB1dF9kb2MsICZ3cml0ZXIsIDApKTsKKyAgRlBERl9DbG9zZURvY3VtZW50KG91dHB1dF9kb2MpOworfQorCiBURVNUX0YoRlBERlBQT0VtYmVkZGVydGVzdCwgQmFkUmFuZ2VzKSB7CiAgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgidmlld2VyX3JlZi5wZGYiKSk7CiAKQEAgLTk1LDcgKzEzMSw3IEBACiAgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgiYnVnXzY2NDI4NC5wZGYiKSk7CiAKICAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkUGFnZSgwKTsKLSAgRVhQRUNUX1RSVUUocGFnZSk7CisgIEFTU0VSVF9ORShudWxscHRyLCBwYWdlKTsKIAogICBGUERGX0RPQ1VNRU5UIG91dHB1dF9kb2MgPSBGUERGX0NyZWF0ZU5ld0RvY3VtZW50KCk7CiAgIEVYUEVDVF9UUlVFKG91dHB1dF9kb2MpOwpAQCAtMTA0LDMgKzE0MCw4MSBAQAogCiAgIFVubG9hZFBhZ2UocGFnZSk7CiB9CisKK1RFU1RfRihGUERGUFBPRW1iZWRkZXJ0ZXN0LCBCVUdfNzUwNTY4KSB7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGtIYXNoZXNbXSA9IHsKKyAgICAgICI2NGFkMDgxMzJhMWM1YTE2Njc2ODI5OGM4YTU3OGY1NyIsICI4M2I4M2UyZjZiYzgwNzA3ZDBhOTE3Yzc2MzQxNDBiOSIsCisgICAgICAiOTEzY2QzNzIzYTQ1MWU0ZTQ2ZmJjMmMwNTcwMmQxZWUiLCAiODFmYjdjZmQ0ODYwZjg1NWViNDY4ZjczZGZlYjZkNjAifTsKKworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoImJ1Z183NTA1NjgucGRmIikpOworICBBU1NFUlRfRVEoNCwgRlBERl9HZXRQYWdlQ291bnQoZG9jdW1lbnQoKSkpOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkUGFnZShpKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgcGFnZSk7CisKKyAgICBGUERGX0JJVE1BUCBiaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UpOworICAgIEFTU0VSVF9FUSgyMDAsIEZQREZCaXRtYXBfR2V0V2lkdGgoYml0bWFwKSk7CisgICAgQVNTRVJUX0VRKDIwMCwgRlBERkJpdG1hcF9HZXRIZWlnaHQoYml0bWFwKSk7CisgICAgQVNTRVJUX0VRKDgwMCwgRlBERkJpdG1hcF9HZXRTdHJpZGUoYml0bWFwKSk7CisKKyAgICBzdGQ6OnN0cmluZyBkaWdlc3QgPSBIYXNoQml0bWFwKGJpdG1hcCk7CisgICAgRlBERkJpdG1hcF9EZXN0cm95KGJpdG1hcCk7CisgICAgVW5sb2FkUGFnZShwYWdlKTsKKyAgICBFWFBFQ1RfRVEoa0hhc2hlc1tpXSwgZGlnZXN0KTsKKyAgfQorCisgIEZQREZfRE9DVU1FTlQgb3V0cHV0X2RvYyA9IEZQREZfQ3JlYXRlTmV3RG9jdW1lbnQoKTsKKyAgQVNTRVJUX1RSVUUob3V0cHV0X2RvYyk7CisgIEVYUEVDVF9UUlVFKEZQREZfSW1wb3J0UGFnZXMob3V0cHV0X2RvYywgZG9jdW1lbnQoKSwgIjEsMiwzLDQiLCAwKSk7CisgIEFTU0VSVF9FUSg0LCBGUERGX0dldFBhZ2VDb3VudChvdXRwdXRfZG9jKSk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgRlBERl9QQUdFIHBhZ2UgPSBGUERGX0xvYWRQYWdlKG91dHB1dF9kb2MsIGkpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBwYWdlKTsKKworICAgIEZQREZfQklUTUFQIGJpdG1hcCA9IFJlbmRlclBhZ2UocGFnZSk7CisgICAgQVNTRVJUX0VRKDIwMCwgRlBERkJpdG1hcF9HZXRXaWR0aChiaXRtYXApKTsKKyAgICBBU1NFUlRfRVEoMjAwLCBGUERGQml0bWFwX0dldEhlaWdodChiaXRtYXApKTsKKyAgICBBU1NFUlRfRVEoODAwLCBGUERGQml0bWFwX0dldFN0cmlkZShiaXRtYXApKTsKKworICAgIHN0ZDo6c3RyaW5nIGRpZ2VzdCA9IEhhc2hCaXRtYXAoYml0bWFwKTsKKyAgICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsKKyAgICBGUERGX0Nsb3NlUGFnZShwYWdlKTsKKyAgICBFWFBFQ1RfRVEoa0hhc2hlc1tpXSwgZGlnZXN0KTsKKyAgfQorICBGUERGX0Nsb3NlRG9jdW1lbnQob3V0cHV0X2RvYyk7Cit9CisKK1RFU1RfRihGUERGUFBPRW1iZWRkZXJ0ZXN0LCBJbXBvcnRXaXRoWmVyb0xlbmd0aFN0cmVhbSkgeworICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoInplcm9fbGVuZ3RoX3N0cmVhbS5wZGYiKSk7CisgIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoMCk7CisgIEFTU0VSVF9ORShudWxscHRyLCBwYWdlKTsKKworICBGUERGX0JJVE1BUCBiaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UpOworICBBU1NFUlRfRVEoMjAwLCBGUERGQml0bWFwX0dldFdpZHRoKGJpdG1hcCkpOworICBBU1NFUlRfRVEoMjAwLCBGUERGQml0bWFwX0dldEhlaWdodChiaXRtYXApKTsKKyAgQVNTRVJUX0VRKDgwMCwgRlBERkJpdG1hcF9HZXRTdHJpZGUoYml0bWFwKSk7CisKKyAgc3RkOjpzdHJpbmcgZGlnZXN0ID0gSGFzaEJpdG1hcChiaXRtYXApOworICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsKKyAgRlBERl9DbG9zZVBhZ2UocGFnZSk7CisKKyAgRlBERl9ET0NVTUVOVCBuZXdfZG9jID0gRlBERl9DcmVhdGVOZXdEb2N1bWVudCgpOworICBFWFBFQ1RfVFJVRShuZXdfZG9jKTsKKyAgRVhQRUNUX1RSVUUoRlBERl9JbXBvcnRQYWdlcyhuZXdfZG9jLCBkb2N1bWVudCgpLCAiMSIsIDApKTsKKworICBFWFBFQ1RfRVEoMSwgRlBERl9HZXRQYWdlQ291bnQobmV3X2RvYykpOworICBGUERGX1BBR0UgbmV3X3BhZ2UgPSBGUERGX0xvYWRQYWdlKG5ld19kb2MsIDApOworICBBU1NFUlRfTkUobnVsbHB0ciwgbmV3X3BhZ2UpOworICBGUERGX0JJVE1BUCBuZXdfYml0bWFwID0gUmVuZGVyUGFnZShuZXdfcGFnZSk7CisgIEFTU0VSVF9FUSgyMDAsIEZQREZCaXRtYXBfR2V0V2lkdGgobmV3X2JpdG1hcCkpOworICBBU1NFUlRfRVEoMjAwLCBGUERGQml0bWFwX0dldEhlaWdodChuZXdfYml0bWFwKSk7CisgIEFTU0VSVF9FUSg4MDAsIEZQREZCaXRtYXBfR2V0U3RyaWRlKG5ld19iaXRtYXApKTsKKworICBzdGQ6OnN0cmluZyBuZXdfZGlnZXN0ID0gSGFzaEJpdG1hcChuZXdfYml0bWFwKTsKKyAgRlBERkJpdG1hcF9EZXN0cm95KG5ld19iaXRtYXApOworICBGUERGX0Nsb3NlUGFnZShuZXdfcGFnZSk7CisgIEZQREZfQ2xvc2VEb2N1bWVudChuZXdfZG9jKTsKKworICBFWFBFQ1RfRVEoZGlnZXN0LCBuZXdfZGlnZXN0KTsKK30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnBkZnNhdmUuY3BwIGIvZnBkZnNkay9mcGRmc2F2ZS5jcHAKaW5kZXggMGNmY2Q0YS4uZGRiYzk5NCAxMDA2NDQKLS0tIGEvZnBkZnNkay9mcGRmc2F2ZS5jcHAKKysrIGIvZnBkZnNkay9mcGRmc2F2ZS5jcHAKQEAgLTE2LDczICsxNiw0MCBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9yZWZlcmVuY2UuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtX2FjYy5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJpbmcuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X21lbW9yeXN0cmVhbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCiAjaW5jbHVkZSAiZnBkZnNkay9mc2RrX2RlZmluZS5oIgorI2luY2x1ZGUgImZwZGZzZGsvZnNka19maWxld3JpdGVhZGFwdGVyLmgiCiAjaW5jbHVkZSAicHVibGljL2ZwZGZfZWRpdC5oIgogCiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9jaGVja3N1bWNvbnRleHQuaCIKICNpbmNsdWRlICJmcGRmc2RrL2ZwZGZ4ZmEvY3BkZnhmYV9jb250ZXh0LmgiCiAjaW5jbHVkZSAiZnBkZnNkay9mcGRmeGZhL2N4ZmFfZndsYWRhcHRlcnRpbWVybWdyLmgiCiAjaW5jbHVkZSAicHVibGljL2ZwZGZfZm9ybWZpbGwuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfY2hlY2tzdW0uaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZhcHAuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZkb2N2aWV3LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0aGFuZGxlci5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZhcHAuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZG9jdmlldy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZ3aWRnZXRoYW5kbGVyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV93aWRnZXRhY2NpdGVyYXRvci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX29iamVjdC5oIgogI2VuZGlmCiAKLSNpZiBfRlhfT1NfID09IF9GWF9BTkRST0lEXworI2lmIF9GWF9PU18gPT0gX0ZYX09TX0FORFJPSURfCiAjaW5jbHVkZSA8dGltZS5oPgogI2Vsc2UKICNpbmNsdWRlIDxjdGltZT4KICNlbmRpZgogCi1jbGFzcyBDRlhfSUZpbGVXcml0ZSBmaW5hbCA6IHB1YmxpYyBJRlhfV3JpdGVTdHJlYW0gewotIHB1YmxpYzoKLSAgc3RhdGljIENGWF9SZXRhaW5QdHI8Q0ZYX0lGaWxlV3JpdGU+IENyZWF0ZSgpOwotICBib29sIEluaXQoRlBERl9GSUxFV1JJVEUqIHBGaWxlV3JpdGVTdHJ1Y3QpOwotICBib29sIFdyaXRlQmxvY2soY29uc3Qgdm9pZCogcERhdGEsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKLQotIHByb3RlY3RlZDoKLSAgQ0ZYX0lGaWxlV3JpdGUoKTsKLSAgfkNGWF9JRmlsZVdyaXRlKCkgb3ZlcnJpZGUge30KLQotICBGUERGX0ZJTEVXUklURSogbV9wRmlsZVdyaXRlU3RydWN0OwotfTsKLQotQ0ZYX1JldGFpblB0cjxDRlhfSUZpbGVXcml0ZT4gQ0ZYX0lGaWxlV3JpdGU6OkNyZWF0ZSgpIHsKLSAgcmV0dXJuIENGWF9SZXRhaW5QdHI8Q0ZYX0lGaWxlV3JpdGU+KG5ldyBDRlhfSUZpbGVXcml0ZSgpKTsKLX0KLQotQ0ZYX0lGaWxlV3JpdGU6OkNGWF9JRmlsZVdyaXRlKCkgOiBtX3BGaWxlV3JpdGVTdHJ1Y3QobnVsbHB0cikge30KLQotYm9vbCBDRlhfSUZpbGVXcml0ZTo6SW5pdChGUERGX0ZJTEVXUklURSogcEZpbGVXcml0ZVN0cnVjdCkgewotICBpZiAoIXBGaWxlV3JpdGVTdHJ1Y3QpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG1fcEZpbGVXcml0ZVN0cnVjdCA9IHBGaWxlV3JpdGVTdHJ1Y3Q7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENGWF9JRmlsZVdyaXRlOjpXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIHBEYXRhLCBzaXplX3Qgc2l6ZSkgewotICBpZiAoIW1fcEZpbGVXcml0ZVN0cnVjdCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbV9wRmlsZVdyaXRlU3RydWN0LT5Xcml0ZUJsb2NrKG1fcEZpbGVXcml0ZVN0cnVjdCwgcERhdGEsIHNpemUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQogbmFtZXNwYWNlIHsKIAogI2lmZGVmIFBERl9FTkFCTEVfWEZBCi1ib29sIFNhdmVYRkFEb2N1bWVudERhdGEoCi0gICAgQ1BERlhGQV9Db250ZXh0KiBwQ29udGV4dCwKLSAgICBzdGQ6OnZlY3RvcjxDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVN0cmVhbT4+KiBmaWxlTGlzdCkgeworYm9vbCBTYXZlWEZBRG9jdW1lbnREYXRhKENQREZYRkFfQ29udGV4dCogcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UmV0YWluUHRyPElGWF9TZWVrYWJsZVN0cmVhbT4+KiBmaWxlTGlzdCkgewogICBpZiAoIXBDb250ZXh0KQogICAgIHJldHVybiBmYWxzZTsKIAotICBpZiAocENvbnRleHQtPkdldERvY1R5cGUoKSAhPSBET0NUWVBFX0RZTkFNSUNfWEZBICYmCi0gICAgICBwQ29udGV4dC0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfU1RBVElDX1hGQSkKKyAgaWYgKCFwQ29udGV4dC0+Q29udGFpbnNYRkFGb3JtKCkpCiAgICAgcmV0dXJuIHRydWU7CiAKICAgQ1hGQV9GRkRvY1ZpZXcqIHBYRkFEb2NWaWV3ID0gcENvbnRleHQtPkdldFhGQURvY1ZpZXcoKTsKQEAgLTkzLDcgKzYwLDcgQEAKICAgaWYgKCFwUERGRG9jdW1lbnQpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBwUERGRG9jdW1lbnQtPkdldFJvb3QoKTsKKyAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IHBQREZEb2N1bWVudC0+R2V0Um9vdCgpOwogICBpZiAoIXBSb290KQogICAgIHJldHVybiBmYWxzZTsKIApAQCAtMTI1LDE4ICs5MiwxNyBAQAogICAgIGVsc2UgaWYgKHBQREZPYmotPkdldFN0cmluZygpID09ICJ0ZW1wbGF0ZSIpCiAgICAgICBpVGVtcGxhdGUgPSBpICsgMTsKICAgfQotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9DaGVja3N1bUNvbnRleHQ+IHBDaGVja3N1bShuZXcgQ1hGQV9DaGVja3N1bUNvbnRleHQpOworICBhdXRvIHBDaGVja3N1bSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfQ2hlY2tzdW1Db250ZXh0PigpOwogICBwQ2hlY2tzdW0tPlN0YXJ0Q2hlY2tzdW0oKTsKIAogICAvLyB0ZW1wbGF0ZQogICBpZiAoaVRlbXBsYXRlID4gLTEpIHsKICAgICBDUERGX1N0cmVhbSogcFRlbXBsYXRlU3RyZWFtID0gcEFycmF5LT5HZXRTdHJlYW1BdChpVGVtcGxhdGUpOwotICAgIENQREZfU3RyZWFtQWNjIHN0cmVhbUFjYzsKLSAgICBzdHJlYW1BY2MuTG9hZEFsbERhdGEocFRlbXBsYXRlU3RyZWFtKTsKLSAgICB1aW50OF90KiBwRGF0YSA9ICh1aW50OF90KilzdHJlYW1BY2MuR2V0RGF0YSgpOwotICAgIHVpbnQzMl90IGR3U2l6ZTIgPSBzdHJlYW1BY2MuR2V0U2l6ZSgpOwotICAgIENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlU3RyZWFtPiBwVGVtcGxhdGUgPQotICAgICAgICBJRlhfTWVtb3J5U3RyZWFtOjpDcmVhdGUocERhdGEsIGR3U2l6ZTIpOworICAgIGF1dG8gcEFjYyA9IHBkZml1bTo6TWFrZVJldGFpbjxDUERGX1N0cmVhbUFjYz4ocFRlbXBsYXRlU3RyZWFtKTsKKyAgICBwQWNjLT5Mb2FkQWxsRGF0YUZpbHRlcmVkKCk7CisgICAgUmV0YWluUHRyPElGWF9TZWVrYWJsZVN0cmVhbT4gcFRlbXBsYXRlID0KKyAgICAgICAgcGRmaXVtOjpNYWtlUmV0YWluPENGWF9NZW1vcnlTdHJlYW0+KAorICAgICAgICAgICAgY29uc3RfY2FzdDx1aW50OF90Kj4ocEFjYy0+R2V0RGF0YSgpKSwgcEFjYy0+R2V0U2l6ZSgpLCBmYWxzZSk7CiAgICAgcENoZWNrc3VtLT5VcGRhdGVDaGVja3N1bShwVGVtcGxhdGUpOwogICB9CiAgIENQREZfU3RyZWFtKiBwRm9ybVN0cmVhbSA9IG51bGxwdHI7CkBAIC0xNjksOSArMTM1LDEyIEBACiAgIH0KICAgLy8gTCJkYXRhc2V0cyIKICAgewotICAgIENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlU3RyZWFtPiBwRHNmaWxlV3JpdGUgPSBJRlhfTWVtb3J5U3RyZWFtOjpDcmVhdGUoKTsKLSAgICBpZiAocFhGQURvY1ZpZXctPkdldERvYygpLT5TYXZlUGFja2FnZShYRkFfSEFTSENPREVfRGF0YXNldHMsIHBEc2ZpbGVXcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKSAmJgorICAgIFJldGFpblB0cjxJRlhfU2Vla2FibGVTdHJlYW0+IHBEc2ZpbGVXcml0ZSA9CisgICAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDRlhfTWVtb3J5U3RyZWFtPihmYWxzZSk7CisgICAgQ1hGQV9GRkRvYyogZmZkb2MgPSBwWEZBRG9jVmlldy0+R2V0RG9jKCk7CisgICAgaWYgKGZmZG9jLT5TYXZlUGFja2FnZSgKKyAgICAgICAgICAgIFRvTm9kZShmZmRvYy0+R2V0WEZBRG9jKCktPkdldFhGQU9iamVjdChYRkFfSEFTSENPREVfRGF0YXNldHMpKSwKKyAgICAgICAgICAgIHBEc2ZpbGVXcml0ZSwgbnVsbHB0cikgJiYKICAgICAgICAgcERzZmlsZVdyaXRlLT5HZXRTaXplKCkgPiAwKSB7CiAgICAgICAvLyBEYXRhc2V0cwogICAgICAgcENoZWNrc3VtLT5VcGRhdGVDaGVja3N1bShwRHNmaWxlV3JpdGUpOwpAQCAtMTk2LDkgKzE2NSwxMyBAQAogICB9CiAgIC8vIEwiZm9ybSIKICAgewotICAgIENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlU3RyZWFtPiBwZmlsZVdyaXRlID0gSUZYX01lbW9yeVN0cmVhbTo6Q3JlYXRlKCk7Ci0gICAgaWYgKHBYRkFEb2NWaWV3LT5HZXREb2MoKS0+U2F2ZVBhY2thZ2UoWEZBX0hBU0hDT0RFX0Zvcm0sIHBmaWxlV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoZWNrc3VtLmdldCgpKSAmJgorICAgIFJldGFpblB0cjxJRlhfU2Vla2FibGVTdHJlYW0+IHBmaWxlV3JpdGUgPQorICAgICAgICBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX01lbW9yeVN0cmVhbT4oZmFsc2UpOworCisgICAgQ1hGQV9GRkRvYyogZmZkb2MgPSBwWEZBRG9jVmlldy0+R2V0RG9jKCk7CisgICAgaWYgKGZmZG9jLT5TYXZlUGFja2FnZSgKKyAgICAgICAgICAgIFRvTm9kZShmZmRvYy0+R2V0WEZBRG9jKCktPkdldFhGQU9iamVjdChYRkFfSEFTSENPREVfRm9ybSkpLAorICAgICAgICAgICAgcGZpbGVXcml0ZSwgcENoZWNrc3VtLmdldCgpKSAmJgogICAgICAgICBwZmlsZVdyaXRlLT5HZXRTaXplKCkgPiAwKSB7CiAgICAgICBhdXRvIHBEYXRhRGljdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KAogICAgICAgICAgIHBQREZEb2N1bWVudC0+R2V0Qnl0ZVN0cmluZ1Bvb2woKSk7CkBAIC0yMjMsNDUgKzE5Niw0MiBAQAogICBpZiAoIXBDb250ZXh0KQogICAgIHJldHVybiBmYWxzZTsKIAotICBpZiAocENvbnRleHQtPkdldERvY1R5cGUoKSAhPSBET0NUWVBFX0RZTkFNSUNfWEZBICYmCi0gICAgICBwQ29udGV4dC0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfU1RBVElDX1hGQSkKKyAgaWYgKCFwQ29udGV4dC0+Q29udGFpbnNYRkFGb3JtKCkpCiAgICAgcmV0dXJuIHRydWU7CiAKICAgQ1hGQV9GRkRvY1ZpZXcqIHBYRkFEb2NWaWV3ID0gcENvbnRleHQtPkdldFhGQURvY1ZpZXcoKTsKICAgaWYgKCFwWEZBRG9jVmlldykKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgQ1hGQV9GRldpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kZXIgPSBwWEZBRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9XaWRnZXRBY2NJdGVyYXRvcj4gcFdpZGdldEFjY0l0ZXJhdG9yKAotICAgICAgcFhGQURvY1ZpZXctPkNyZWF0ZVdpZGdldEFjY0l0ZXJhdG9yKCkpOworICBDWEZBX0ZGV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRsZXIgPSBwWEZBRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9XaWRnZXRBY2NJdGVyYXRvcj4gcFdpZGdldEFjY0l0ZXJhdG9yID0KKyAgICAgIHBYRkFEb2NWaWV3LT5DcmVhdGVXaWRnZXRBY2NJdGVyYXRvcigpOwogICB3aGlsZSAoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwV2lkZ2V0QWNjSXRlcmF0b3ItPk1vdmVUb05leHQoKSkgewogICAgIENYRkFfRXZlbnRQYXJhbSBwcmVQYXJhbTsKICAgICBwcmVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX1Bvc3RTYXZlOwotICAgIHBXaWRnZXRIYW5kZXItPlByb2Nlc3NFdmVudChwV2lkZ2V0QWNjLCAmcHJlUGFyYW0pOworICAgIHBXaWRnZXRIYW5kbGVyLT5Qcm9jZXNzRXZlbnQocFdpZGdldEFjYywgJnByZVBhcmFtKTsKICAgfQogICBwWEZBRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOwogICBwQ29udGV4dC0+Q2xlYXJDaGFuZ2VNYXJrKCk7CiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFNlbmRQcmVTYXZlVG9YRkFEb2MoCi0gICAgQ1BERlhGQV9Db250ZXh0KiBwQ29udGV4dCwKLSAgICBzdGQ6OnZlY3RvcjxDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVN0cmVhbT4+KiBmaWxlTGlzdCkgewotICBpZiAocENvbnRleHQtPkdldERvY1R5cGUoKSAhPSBET0NUWVBFX0RZTkFNSUNfWEZBICYmCi0gICAgICBwQ29udGV4dC0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfU1RBVElDX1hGQSkKK2Jvb2wgU2VuZFByZVNhdmVUb1hGQURvYyhDUERGWEZBX0NvbnRleHQqIHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFJldGFpblB0cjxJRlhfU2Vla2FibGVTdHJlYW0+PiogZmlsZUxpc3QpIHsKKyAgaWYgKCFwQ29udGV4dC0+Q29udGFpbnNYRkFGb3JtKCkpCiAgICAgcmV0dXJuIHRydWU7CiAKICAgQ1hGQV9GRkRvY1ZpZXcqIHBYRkFEb2NWaWV3ID0gcENvbnRleHQtPkdldFhGQURvY1ZpZXcoKTsKICAgaWYgKCFwWEZBRG9jVmlldykKICAgICByZXR1cm4gdHJ1ZTsKIAotICBDWEZBX0ZGV2lkZ2V0SGFuZGxlciogcFdpZGdldEhhbmRlciA9IHBYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX1dpZGdldEFjY0l0ZXJhdG9yPiBwV2lkZ2V0QWNjSXRlcmF0b3IoCi0gICAgICBwWEZBRG9jVmlldy0+Q3JlYXRlV2lkZ2V0QWNjSXRlcmF0b3IoKSk7CisgIENYRkFfRkZXaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IHBYRkFEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX1dpZGdldEFjY0l0ZXJhdG9yPiBwV2lkZ2V0QWNjSXRlcmF0b3IgPQorICAgICAgcFhGQURvY1ZpZXctPkNyZWF0ZVdpZGdldEFjY0l0ZXJhdG9yKCk7CiAgIHdoaWxlIChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBXaWRnZXRBY2NJdGVyYXRvci0+TW92ZVRvTmV4dCgpKSB7CiAgICAgQ1hGQV9FdmVudFBhcmFtIHByZVBhcmFtOwogICAgIHByZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfUHJlU2F2ZTsKLSAgICBwV2lkZ2V0SGFuZGVyLT5Qcm9jZXNzRXZlbnQocFdpZGdldEFjYywgJnByZVBhcmFtKTsKKyAgICBwV2lkZ2V0SGFuZGxlci0+UHJvY2Vzc0V2ZW50KHBXaWRnZXRBY2MsICZwcmVQYXJhbSk7CiAgIH0KICAgcFhGQURvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsKICAgcmV0dXJuIFNhdmVYRkFEb2N1bWVudERhdGEocENvbnRleHQsIGZpbGVMaXN0KTsKQEAgLTI3OSwyNCArMjQ5LDIzIEBACiAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQogICBDUERGWEZBX0NvbnRleHQqIHBDb250ZXh0ID0gc3RhdGljX2Nhc3Q8Q1BERlhGQV9Db250ZXh0Kj4oZG9jdW1lbnQpOwotICBzdGQ6OnZlY3RvcjxDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVN0cmVhbT4+IGZpbGVMaXN0OworICBzdGQ6OnZlY3RvcjxSZXRhaW5QdHI8SUZYX1NlZWthYmxlU3RyZWFtPj4gZmlsZUxpc3Q7CiAgIFNlbmRQcmVTYXZlVG9YRkFEb2MocENvbnRleHQsICZmaWxlTGlzdCk7CiAjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKICAgaWYgKGZsYWdzIDwgRlBERl9JTkNSRU1FTlRBTCB8fCBmbGFncyA+IEZQREZfUkVNT1ZFX1NFQ1VSSVRZKQogICAgIGZsYWdzID0gMDsKIAotICBDUERGX0NyZWF0b3IgRmlsZU1ha2VyKHBQREZEb2MpOworICBDUERGX0NyZWF0b3IgZmlsZU1ha2VyKHBQREZEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlUmV0YWluPEZTREtfRmlsZVdyaXRlQWRhcHRlcj4ocEZpbGVXcml0ZSkpOwogICBpZiAoYlNldFZlcnNpb24pCi0gICAgRmlsZU1ha2VyLlNldEZpbGVWZXJzaW9uKGZpbGVWZXJpb24pOworICAgIGZpbGVNYWtlci5TZXRGaWxlVmVyc2lvbihmaWxlVmVyaW9uKTsKICAgaWYgKGZsYWdzID09IEZQREZfUkVNT1ZFX1NFQ1VSSVRZKSB7CiAgICAgZmxhZ3MgPSAwOwotICAgIEZpbGVNYWtlci5SZW1vdmVTZWN1cml0eSgpOworICAgIGZpbGVNYWtlci5SZW1vdmVTZWN1cml0eSgpOwogICB9CiAKLSAgQ0ZYX1JldGFpblB0cjxDRlhfSUZpbGVXcml0ZT4gcFN0cmVhbVdyaXRlID0gQ0ZYX0lGaWxlV3JpdGU6OkNyZWF0ZSgpOwotICBwU3RyZWFtV3JpdGUtPkluaXQocEZpbGVXcml0ZSk7Ci0gIGJvb2wgYlJldCA9IEZpbGVNYWtlci5DcmVhdGUocFN0cmVhbVdyaXRlLCBmbGFncyk7CisgIGJvb2wgYlJldCA9IGZpbGVNYWtlci5DcmVhdGUoZmxhZ3MpOwogI2lmZGVmIFBERl9FTkFCTEVfWEZBCiAgIFNlbmRQb3N0U2F2ZVRvWEZBRG9jKHBDb250ZXh0KTsKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKQEAgLTMwNSwxNSArMjc0LDE2IEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9TYXZlQXNDb3B5KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRklMRVdSSVRFKiBwRmlsZVdyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEIGZsYWdzKSB7CitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGX1NhdmVBc0NvcHkoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZJTEVXUklURSogcEZpbGVXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEIGZsYWdzKSB7CiAgIHJldHVybiBGUERGX0RvY19TYXZlKGRvY3VtZW50LCBwRmlsZVdyaXRlLCBmbGFncywgZmFsc2UsIDApOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9TYXZlV2l0aFZlcnNpb24oRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZJTEVXUklURSogcEZpbGVXcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEIGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxlVmVyc2lvbikgeworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZfU2F2ZVdpdGhWZXJzaW9uKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICBGUERGX0ZJTEVXUklURSogcEZpbGVXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICBpbnQgZmlsZVZlcnNpb24pIHsKICAgcmV0dXJuIEZQREZfRG9jX1NhdmUoZG9jdW1lbnQsIHBGaWxlV3JpdGUsIGZsYWdzLCB0cnVlLCBmaWxlVmVyc2lvbik7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZzYXZlX2VtYmVkZGVydGVzdC5jcHAgYi9mcGRmc2RrL2ZwZGZzYXZlX2VtYmVkZGVydGVzdC5jcHAKaW5kZXggOTE4NzI3MC4uMzEyMmJlMSAxMDA2NDQKLS0tIGEvZnBkZnNkay9mcGRmc2F2ZV9lbWJlZGRlcnRlc3QuY3BwCisrKyBiL2ZwZGZzZGsvZnBkZnNhdmVfZW1iZWRkZXJ0ZXN0LmNwcApAQCAtNCwzNCArNCwzMiBAQAogCiAjaW5jbHVkZSAicHVibGljL2ZwZGZfc2F2ZS5oIgogCi0jaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5nPgogCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKICNpbmNsdWRlICJwdWJsaWMvZnBkZl9lZGl0LmgiCiAjaW5jbHVkZSAicHVibGljL2ZwZGZfcHBvLmgiCiAjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCiAjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCi0jaW5jbHVkZSAidGVzdGluZy9meF9zdHJpbmdfdGVzdGhlbHBlcnMuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2stbWF0Y2hlcnMuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5oIgogCi1jbGFzcyBGUERGU2F2ZUVtYmVkZGVyVGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3QsIHB1YmxpYyBUZXN0U2F2ZXIge307CitjbGFzcyBGUERGU2F2ZUVtYmVkZGVyVGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3Qge307CiAKIFRFU1RfRihGUERGU2F2ZUVtYmVkZGVyVGVzdCwgU2F2ZVNpbXBsZURvYykgewogICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoImhlbGxvX3dvcmxkLnBkZiIpKTsKICAgRVhQRUNUX1RSVUUoRlBERl9TYXZlQXNDb3B5KGRvY3VtZW50KCksIHRoaXMsIDApKTsKICAgRVhQRUNUX1RIQVQoR2V0U3RyaW5nKCksIHRlc3Rpbmc6OlN0YXJ0c1dpdGgoIiVQREYtMS43XHJcbiIpKTsKLSAgRVhQRUNUX0VRKDg0M3UsIEdldFN0cmluZygpLmxlbmd0aCgpKTsKKyAgRVhQRUNUX0VRKDgwNXUsIEdldFN0cmluZygpLmxlbmd0aCgpKTsKIH0KIAogVEVTVF9GKEZQREZTYXZlRW1iZWRkZXJUZXN0LCBTYXZlU2ltcGxlRG9jV2l0aFZlcnNpb24pIHsKICAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJoZWxsb193b3JsZC5wZGYiKSk7CiAgIEVYUEVDVF9UUlVFKEZQREZfU2F2ZVdpdGhWZXJzaW9uKGRvY3VtZW50KCksIHRoaXMsIDAsIDE0KSk7CiAgIEVYUEVDVF9USEFUKEdldFN0cmluZygpLCB0ZXN0aW5nOjpTdGFydHNXaXRoKCIlUERGLTEuNFxyXG4iKSk7Ci0gIEVYUEVDVF9FUSg4NDN1LCBHZXRTdHJpbmcoKS5sZW5ndGgoKSk7CisgIEVYUEVDVF9FUSg4MDV1LCBHZXRTdHJpbmcoKS5sZW5ndGgoKSk7CiB9Ci0KIFRFU1RfRihGUERGU2F2ZUVtYmVkZGVyVGVzdCwgU2F2ZVNpbXBsZURvY1dpdGhCYWRWZXJzaW9uKSB7CiAgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgiaGVsbG9fd29ybGQucGRmIikpOwogICBFWFBFQ1RfVFJVRShGUERGX1NhdmVXaXRoVmVyc2lvbihkb2N1bWVudCgpLCB0aGlzLCAwLCAtMSkpOwpAQCAtNjEsNiArNTksMzkgQEAKICAgVW5sb2FkUGFnZShwYWdlKTsKIH0KIAorVEVTVF9GKEZQREZTYXZlRW1iZWRkZXJUZXN0LCBTYXZlTGluZWFyaXplZERvYykgeworICBjb25zdCBpbnQga1BhZ2VDb3VudCA9IDM7CisgIHN0ZDo6c3RyaW5nIG9yaWdpbmFsX21kNVtrUGFnZUNvdW50XTsKKworICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoImxpbmVhcml6ZWQucGRmIikpOworICBmb3IgKGludCBpID0gMDsgaSA8IGtQYWdlQ291bnQ7ICsraSkgeworICAgIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoaSk7CisgICAgRlBERl9CSVRNQVAgYml0bWFwID0gUmVuZGVyUGFnZShwYWdlKTsKKyAgICBFWFBFQ1RfRVEoNjEyLCBGUERGQml0bWFwX0dldFdpZHRoKGJpdG1hcCkpOworICAgIEVYUEVDVF9FUSg3OTIsIEZQREZCaXRtYXBfR2V0SGVpZ2h0KGJpdG1hcCkpOworICAgIG9yaWdpbmFsX21kNVtpXSA9IEhhc2hCaXRtYXAoYml0bWFwKTsKKyAgICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsKKyAgICBVbmxvYWRQYWdlKHBhZ2UpOworICB9CisKKyAgRVhQRUNUX1RSVUUoRlBERl9TYXZlQXNDb3B5KGRvY3VtZW50KCksIHRoaXMsIDApKTsKKyAgRVhQRUNUX1RIQVQoR2V0U3RyaW5nKCksIHRlc3Rpbmc6OlN0YXJ0c1dpdGgoIiVQREYtMS42XHJcbiIpKTsKKyAgRVhQRUNUX1RIQVQoR2V0U3RyaW5nKCksIHRlc3Rpbmc6Okhhc1N1YnN0cigiL1Jvb3QgIikpOworICBFWFBFQ1RfVEhBVChHZXRTdHJpbmcoKSwgdGVzdGluZzo6SGFzU3Vic3RyKCIvSW5mbyAiKSk7CisgIEVYUEVDVF9FUSg4MjE5dSwgR2V0U3RyaW5nKCkubGVuZ3RoKCkpOworCisgIC8vIE1ha2Ugc3VyZSBuZXcgZG9jdW1lbnQgcmVuZGVycyB0aGUgc2FtZSBhcyB0aGUgb2xkIG9uZS4KKyAgRVhQRUNUX1RSVUUoT3BlblNhdmVkRG9jdW1lbnQoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga1BhZ2VDb3VudDsgKytpKSB7CisgICAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkU2F2ZWRQYWdlKGkpOworICAgIEZQREZfQklUTUFQIGJpdG1hcCA9IFJlbmRlclNhdmVkUGFnZShwYWdlKTsKKyAgICBFWFBFQ1RfRVEob3JpZ2luYWxfbWQ1W2ldLCBIYXNoQml0bWFwKGJpdG1hcCkpOworICAgIEZQREZCaXRtYXBfRGVzdHJveShiaXRtYXApOworICAgIENsb3NlU2F2ZWRQYWdlKHBhZ2UpOworICB9CisgIENsb3NlU2F2ZWREb2N1bWVudCgpOworfQorCiBURVNUX0YoRlBERlNhdmVFbWJlZGRlclRlc3QsIEJVR18zNDIpIHsKICAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJoZWxsb193b3JsZC5wZGYiKSk7CiAgIEVYUEVDVF9UUlVFKEZQREZfU2F2ZUFzQ29weShkb2N1bWVudCgpLCB0aGlzLCAwKSk7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZ0ZXh0LmNwcCBiL2ZwZGZzZGsvZnBkZnRleHQuY3BwCmluZGV4IDA0MzJhZmQuLjY4YmY0ZjggMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvZnBkZnRleHQuY3BwCisrKyBiL2ZwZGZzZGsvZnBkZnRleHQuY3BwCkBAIC0yOSw2ICsyOSw4IEBACiAKIG5hbWVzcGFjZSB7CiAKK2NvbnN0ZXhwciBzaXplX3Qga0J5dGVzUGVyQ2hhcmFjdGVyID0gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsKKwogQ1BERl9UZXh0UGFnZSogQ1BERlRleHRQYWdlRnJvbUZQREZUZXh0UGFnZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSkgewogICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1BERl9UZXh0UGFnZSo+KHRleHRfcGFnZSk7CiB9CkBAIC00Myw3ICs0NSw3IEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCi1ETExFWFBPUlQgRlBERl9URVhUUEFHRSBTVERDQUxMIEZQREZUZXh0X0xvYWRQYWdlKEZQREZfUEFHRSBwYWdlKSB7CitGUERGX0VYUE9SVCBGUERGX1RFWFRQQUdFIEZQREZfQ0FMTENPTlYgRlBERlRleHRfTG9hZFBhZ2UoRlBERl9QQUdFIHBhZ2UpIHsKICAgQ1BERl9QYWdlKiBwUERGUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOwogICBpZiAoIXBQREZQYWdlKQogICAgIHJldHVybiBudWxscHRyOwpAQCAtNTMsNyArNTUsNyBAQAogICBDUERGWEZBX0NvbnRleHQqIHBDb250ZXh0ID0gcFBhZ2UtPkdldENvbnRleHQoKTsKICAgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlcyB2aWV3UmVmKHBDb250ZXh0LT5HZXRQREZEb2MoKSk7CiAjZWxzZSAgLy8gUERGX0VOQUJMRV9YRkEKLSAgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlcyB2aWV3UmVmKHBQREZQYWdlLT5tX3BEb2N1bWVudCk7CisgIENQREZfVmlld2VyUHJlZmVyZW5jZXMgdmlld1JlZihwUERGUGFnZS0+bV9wRG9jdW1lbnQuR2V0KCkpOwogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCiAgIENQREZfVGV4dFBhZ2UqIHRleHRwYWdlID0gbmV3IENQREZfVGV4dFBhZ2UoCkBAIC02MywxMSArNjUsMTEgQEAKICAgcmV0dXJuIHRleHRwYWdlOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZUZXh0X0Nsb3NlUGFnZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSkgeworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZUZXh0X0Nsb3NlUGFnZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSkgewogICBkZWxldGUgQ1BERlRleHRQYWdlRnJvbUZQREZUZXh0UGFnZSh0ZXh0X3BhZ2UpOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfQ291bnRDaGFycyhGUERGX1RFWFRQQUdFIHRleHRfcGFnZSkgeworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERlRleHRfQ291bnRDaGFycyhGUERGX1RFWFRQQUdFIHRleHRfcGFnZSkgewogICBpZiAoIXRleHRfcGFnZSkKICAgICByZXR1cm4gLTE7CiAKQEAgLTc1LDggKzc3LDggQEAKICAgcmV0dXJuIHRleHRwYWdlLT5Db3VudENoYXJzKCk7CiB9CiAKLURMTEVYUE9SVCB1bnNpZ25lZCBpbnQgU1REQ0FMTCBGUERGVGV4dF9HZXRVbmljb2RlKEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSB7CitGUERGX0VYUE9SVCB1bnNpZ25lZCBpbnQgRlBERl9DQUxMQ09OVgorRlBERlRleHRfR2V0VW5pY29kZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwgaW50IGluZGV4KSB7CiAgIGlmICghdGV4dF9wYWdlKQogICAgIHJldHVybiAwOwogCkBAIC04OSw4ICs5MSw4IEBACiAgIHJldHVybiBjaGFyaW5mby5tX1VuaWNvZGU7CiB9CiAKLURMTEVYUE9SVCBkb3VibGUgU1REQ0FMTCBGUERGVGV4dF9HZXRGb250U2l6ZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIHsKK0ZQREZfRVhQT1JUIGRvdWJsZSBGUERGX0NBTExDT05WIEZQREZUZXh0X0dldEZvbnRTaXplKEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSB7CiAgIGlmICghdGV4dF9wYWdlKQogICAgIHJldHVybiAwOwogICBDUERGX1RleHRQYWdlKiB0ZXh0cGFnZSA9IENQREZUZXh0UGFnZUZyb21GUERGVGV4dFBhZ2UodGV4dF9wYWdlKTsKQEAgLTEwMyw2OCArMTA1LDEwMSBAQAogICByZXR1cm4gY2hhcmluZm8ubV9Gb250U2l6ZTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGVGV4dF9HZXRDaGFyQm94KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRvcCkgewotICBpZiAoIXRleHRfcGFnZSkKLSAgICByZXR1cm47Ci0gIENQREZfVGV4dFBhZ2UqIHRleHRwYWdlID0gQ1BERlRleHRQYWdlRnJvbUZQREZUZXh0UGFnZSh0ZXh0X3BhZ2UpOworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRlBERlRleHRfR2V0Q2hhckJveChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRvcCkgeworICBpZiAoIXRleHRfcGFnZSB8fCBpbmRleCA8IDApCisgICAgcmV0dXJuIGZhbHNlOwogCi0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGV4dHBhZ2UtPkNvdW50Q2hhcnMoKSkKLSAgICByZXR1cm47CisgIENQREZfVGV4dFBhZ2UqIHRleHRwYWdlID0gQ1BERlRleHRQYWdlRnJvbUZQREZUZXh0UGFnZSh0ZXh0X3BhZ2UpOworICBpZiAoaW5kZXggPj0gdGV4dHBhZ2UtPkNvdW50Q2hhcnMoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKICAgRlBERl9DSEFSX0lORk8gY2hhcmluZm87CiAgIHRleHRwYWdlLT5HZXRDaGFySW5mbyhpbmRleCwgJmNoYXJpbmZvKTsKICAgKmxlZnQgPSBjaGFyaW5mby5tX0NoYXJCb3gubGVmdDsKICAgKnJpZ2h0ID0gY2hhcmluZm8ubV9DaGFyQm94LnJpZ2h0OwogICAqYm90dG9tID0gY2hhcmluZm8ubV9DaGFyQm94LmJvdHRvbTsKICAgKnRvcCA9IGNoYXJpbmZvLm1fQ2hhckJveC50b3A7CisgIHJldHVybiB0cnVlOworfQorCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgorRlBERlRleHRfR2V0Q2hhck9yaWdpbihGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHgsCisgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeSkgeworICBpZiAoIXRleHRfcGFnZSkKKyAgICByZXR1cm4gZmFsc2U7CisgIENQREZfVGV4dFBhZ2UqIHRleHRwYWdlID0gQ1BERlRleHRQYWdlRnJvbUZQREZUZXh0UGFnZSh0ZXh0X3BhZ2UpOworCisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGV4dHBhZ2UtPkNvdW50Q2hhcnMoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIEZQREZfQ0hBUl9JTkZPIGNoYXJpbmZvOworICB0ZXh0cGFnZS0+R2V0Q2hhckluZm8oaW5kZXgsICZjaGFyaW5mbyk7CisgICp4ID0gY2hhcmluZm8ubV9PcmlnaW4ueDsKKyAgKnkgPSBjaGFyaW5mby5tX09yaWdpbi55OworICByZXR1cm4gdHJ1ZTsKIH0KIAogLy8gc2VsZWN0Ci1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfR2V0Q2hhckluZGV4QXRQb3MoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHhUb2xlcmFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHlUb2xlcmFuY2UpIHsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WCitGUERGVGV4dF9HZXRDaGFySW5kZXhBdFBvcyhGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeFRvbGVyYW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB5VG9sZXJhbmNlKSB7CiAgIGlmICghdGV4dF9wYWdlKQogICAgIHJldHVybiAtMzsKIAogICBDUERGX1RleHRQYWdlKiB0ZXh0cGFnZSA9IENQREZUZXh0UGFnZUZyb21GUERGVGV4dFBhZ2UodGV4dF9wYWdlKTsKICAgcmV0dXJuIHRleHRwYWdlLT5HZXRJbmRleEF0UG9zKAotICAgICAgQ0ZYX1BvaW50RihzdGF0aWNfY2FzdDxGWF9GTE9BVD4oeCksIHN0YXRpY19jYXN0PEZYX0ZMT0FUPih5KSksCi0gICAgICBDRlhfU2l6ZUYoc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHhUb2xlcmFuY2UpLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPih5VG9sZXJhbmNlKSkpOworICAgICAgQ0ZYX1BvaW50RihzdGF0aWNfY2FzdDxmbG9hdD4oeCksIHN0YXRpY19jYXN0PGZsb2F0Pih5KSksCisgICAgICBDRlhfU2l6ZUYoc3RhdGljX2Nhc3Q8ZmxvYXQ+KHhUb2xlcmFuY2UpLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0Pih5VG9sZXJhbmNlKSkpOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfR2V0VGV4dChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0KiByZXN1bHQpIHsKLSAgaWYgKCF0ZXh0X3BhZ2UpCitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OViBGUERGVGV4dF9HZXRUZXh0KEZQREZfVEVYVFBBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYXJfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCogcmVzdWx0KSB7CisgIGlmICghcGFnZSB8fCBjaGFyX3N0YXJ0IDwgMCB8fCBjaGFyX2NvdW50IDwgMCB8fCAhcmVzdWx0KQogICAgIHJldHVybiAwOwogCi0gIENQREZfVGV4dFBhZ2UqIHRleHRwYWdlID0gQ1BERlRleHRQYWdlRnJvbUZQREZUZXh0UGFnZSh0ZXh0X3BhZ2UpOwotICBpZiAoc3RhcnQgPj0gdGV4dHBhZ2UtPkNvdW50Q2hhcnMoKSkKKyAgQ1BERl9UZXh0UGFnZSogdGV4dHBhZ2UgPSBDUERGVGV4dFBhZ2VGcm9tRlBERlRleHRQYWdlKHBhZ2UpOworICBpbnQgY2hhcl9hdmFpbGFibGUgPSB0ZXh0cGFnZS0+Q291bnRDaGFycygpIC0gY2hhcl9zdGFydDsKKyAgaWYgKGNoYXJfYXZhaWxhYmxlIDw9IDApCiAgICAgcmV0dXJuIDA7CiAKLSAgQ0ZYX1dpZGVTdHJpbmcgc3RyID0gdGV4dHBhZ2UtPkdldFBhZ2VUZXh0KHN0YXJ0LCBjb3VudCk7Ci0gIGlmIChzdHIuR2V0TGVuZ3RoKCkgPiBjb3VudCkKLSAgICBzdHIgPSBzdHIuTGVmdChjb3VudCk7CisgIGNoYXJfY291bnQgPSBzdGQ6Om1pbihjaGFyX2NvdW50LCBjaGFyX2F2YWlsYWJsZSk7CisgIGlmIChjaGFyX2NvdW50ID09IDApIHsKKyAgICAvLyBXcml0aW5nIG91dCAiIiwgd2hpY2ggaGFzIGEgY2hhcmFjdGVyIGNvdW50IG9mIDEgZHVlIHRvIHRoZSBOVUwuCisgICAgKnJlc3VsdCA9ICdcMCc7CisgICAgcmV0dXJuIDE7CisgIH0KIAotICBDRlhfQnl0ZVN0cmluZyBjYlVURjE2c3RyID0gc3RyLlVURjE2TEVfRW5jb2RlKCk7Ci0gIEZYU1lTX21lbWNweShyZXN1bHQsIGNiVVRGMTZzdHIuR2V0QnVmZmVyKGNiVVRGMTZzdHIuR2V0TGVuZ3RoKCkpLAotICAgICAgICAgICAgICAgY2JVVEYxNnN0ci5HZXRMZW5ndGgoKSk7Ci0gIGNiVVRGMTZzdHIuUmVsZWFzZUJ1ZmZlcihjYlVURjE2c3RyLkdldExlbmd0aCgpKTsKKyAgV2lkZVN0cmluZyBzdHIgPSB0ZXh0cGFnZS0+R2V0UGFnZVRleHQoY2hhcl9zdGFydCwgY2hhcl9jb3VudCk7CiAKLSAgcmV0dXJuIGNiVVRGMTZzdHIuR2V0TGVuZ3RoKCkgLyBzaXplb2YodW5zaWduZWQgc2hvcnQpOworICBpZiAoc3RyLkdldExlbmd0aCgpID4gc3RhdGljX2Nhc3Q8c2l6ZV90PihjaGFyX2NvdW50KSkKKyAgICBzdHIgPSBzdHIuTGVmdChzdGF0aWNfY2FzdDxzaXplX3Q+KGNoYXJfY291bnQpKTsKKworICAvLyBVRlQxNkxFX0VuY29kZSBkb2Vzbid0IGhhbmRsZSBzdXJyb2dhdGUgcGFpcnMgcHJvcGVybHksIHNvIGl0IGlzIGV4cGVjdGVkCisgIC8vIHRoZSBudW1iZXIgb2YgaXRlbXMgdG8gc3RheSB0aGUgc2FtZS4KKyAgQnl0ZVN0cmluZyBieXRlX3N0ciA9IHN0ci5VVEYxNkxFX0VuY29kZSgpOworICBzaXplX3QgYnl0ZV9zdHJfbGVuID0gYnl0ZV9zdHIuR2V0TGVuZ3RoKCk7CisgIGludCByZXRfY291bnQgPSBieXRlX3N0cl9sZW4gLyBrQnl0ZXNQZXJDaGFyYWN0ZXI7CisKKyAgQVNTRVJUKHJldF9jb3VudCA8PSBjaGFyX2NvdW50ICsgMSk7ICAvLyArMSB0byBhY2NvdW50IGZvciB0aGUgTlVMIHRlcm1pbmF0b3IuCisgIG1lbWNweShyZXN1bHQsIGJ5dGVfc3RyLkdldEJ1ZmZlcihieXRlX3N0cl9sZW4pLCBieXRlX3N0cl9sZW4pOworICByZXR1cm4gcmV0X2NvdW50OwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfQ291bnRSZWN0cyhGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCkgeworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERlRleHRfQ291bnRSZWN0cyhGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQpIHsKICAgaWYgKCF0ZXh0X3BhZ2UpCiAgICAgcmV0dXJuIDA7CiAKQEAgLTE3Miw0NyArMjA3LDQ4IEBACiAgIHJldHVybiB0ZXh0cGFnZS0+Q291bnRSZWN0cyhzdGFydCwgY291bnQpOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZUZXh0X0dldFJlY3QoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlY3RfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBib3R0b20pIHsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZUZXh0X0dldFJlY3QoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWN0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJvdHRvbSkgewogICBpZiAoIXRleHRfcGFnZSkKLSAgICByZXR1cm47CisgICAgcmV0dXJuIGZhbHNlOwogCiAgIENQREZfVGV4dFBhZ2UqIHRleHRwYWdlID0gQ1BERlRleHRQYWdlRnJvbUZQREZUZXh0UGFnZSh0ZXh0X3BhZ2UpOwogICBDRlhfRmxvYXRSZWN0IHJlY3Q7Ci0gIHRleHRwYWdlLT5HZXRSZWN0KHJlY3RfaW5kZXgsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKTsKKyAgYm9vbCByZXN1bHQgPSB0ZXh0cGFnZS0+R2V0UmVjdChyZWN0X2luZGV4LCAmcmVjdCk7CisKICAgKmxlZnQgPSByZWN0LmxlZnQ7CiAgICp0b3AgPSByZWN0LnRvcDsKICAgKnJpZ2h0ID0gcmVjdC5yaWdodDsKICAgKmJvdHRvbSA9IHJlY3QuYm90dG9tOworICByZXR1cm4gcmVzdWx0OwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfR2V0Qm91bmRlZFRleHQoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZsZW4pIHsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZUZXh0X0dldEJvdW5kZWRUZXh0KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0KiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmbGVuKSB7CiAgIGlmICghdGV4dF9wYWdlKQogICAgIHJldHVybiAwOwogCiAgIENQREZfVGV4dFBhZ2UqIHRleHRwYWdlID0gQ1BERlRleHRQYWdlRnJvbUZQREZUZXh0UGFnZSh0ZXh0X3BhZ2UpOwotICBDRlhfRmxvYXRSZWN0IHJlY3QoKEZYX0ZMT0FUKWxlZnQsIChGWF9GTE9BVClib3R0b20sIChGWF9GTE9BVClyaWdodCwKLSAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCl0b3ApOwotICBDRlhfV2lkZVN0cmluZyBzdHIgPSB0ZXh0cGFnZS0+R2V0VGV4dEJ5UmVjdChyZWN0KTsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0KChmbG9hdClsZWZ0LCAoZmxvYXQpYm90dG9tLCAoZmxvYXQpcmlnaHQsIChmbG9hdCl0b3ApOworICBXaWRlU3RyaW5nIHN0ciA9IHRleHRwYWdlLT5HZXRUZXh0QnlSZWN0KHJlY3QpOwogCiAgIGlmIChidWZsZW4gPD0gMCB8fCAhYnVmZmVyKQogICAgIHJldHVybiBzdHIuR2V0TGVuZ3RoKCk7CiAKLSAgQ0ZYX0J5dGVTdHJpbmcgY2JVVEYxNlN0ciA9IHN0ci5VVEYxNkxFX0VuY29kZSgpOworICBCeXRlU3RyaW5nIGNiVVRGMTZTdHIgPSBzdHIuVVRGMTZMRV9FbmNvZGUoKTsKICAgaW50IGxlbiA9IGNiVVRGMTZTdHIuR2V0TGVuZ3RoKCkgLyBzaXplb2YodW5zaWduZWQgc2hvcnQpOwogICBpbnQgc2l6ZSA9IGJ1ZmxlbiA+IGxlbiA/IGxlbiA6IGJ1ZmxlbjsKLSAgRlhTWVNfbWVtY3B5KGJ1ZmZlciwgY2JVVEYxNlN0ci5HZXRCdWZmZXIoc2l6ZSAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpLAotICAgICAgICAgICAgICAgc2l6ZSAqIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOworICBtZW1jcHkoYnVmZmVyLCBjYlVURjE2U3RyLkdldEJ1ZmZlcihzaXplICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSksCisgICAgICAgICBzaXplICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CiAgIGNiVVRGMTZTdHIuUmVsZWFzZUJ1ZmZlcihzaXplICogc2l6ZW9mKHVuc2lnbmVkIHNob3J0KSk7CiAKICAgcmV0dXJuIHNpemU7CkBAIC0yMjAsMjIgKzI1NiwyNCBAQAogCiAvLyBTZWFyY2gKIC8vIC0xIGZvciBlbmQKLURMTEVYUE9SVCBGUERGX1NDSEhBTkRMRSBTVERDQUxMIEZQREZUZXh0X0ZpbmRTdGFydChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgZmluZHdoYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfaW5kZXgpIHsKK0ZQREZfRVhQT1JUIEZQREZfU0NISEFORExFIEZQREZfQ0FMTENPTlYKK0ZQREZUZXh0X0ZpbmRTdGFydChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKKyAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgZmluZHdoYXQsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywKKyAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfaW5kZXgpIHsKICAgaWYgKCF0ZXh0X3BhZ2UpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKICAgQ1BERl9UZXh0UGFnZUZpbmQqIHRleHRwYWdlRmluZCA9CiAgICAgICBuZXcgQ1BERl9UZXh0UGFnZUZpbmQoQ1BERlRleHRQYWdlRnJvbUZQREZUZXh0UGFnZSh0ZXh0X3BhZ2UpKTsKLSAgRlhfU1RSU0laRSBsZW4gPSBDRlhfV2lkZVN0cmluZzo6V1N0cmluZ0xlbmd0aChmaW5kd2hhdCk7Ci0gIHRleHRwYWdlRmluZC0+RmluZEZpcnN0KENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGMTZMRShmaW5kd2hhdCwgbGVuKSwgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2luZGV4KTsKKyAgc2l6ZV90IGxlbiA9IFdpZGVTdHJpbmc6OldTdHJpbmdMZW5ndGgoZmluZHdoYXQpOworICB0ZXh0cGFnZUZpbmQtPkZpbmRGaXJzdCgKKyAgICAgIFdpZGVTdHJpbmc6OkZyb21VVEYxNkxFKGZpbmR3aGF0LCBsZW4pLCBmbGFncywKKyAgICAgIHN0YXJ0X2luZGV4ID49IDAgPyBPcHRpb25hbDxzaXplX3Q+KHN0YXJ0X2luZGV4KSA6IE9wdGlvbmFsPHNpemVfdD4oKSk7CiAgIHJldHVybiB0ZXh0cGFnZUZpbmQ7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGVGV4dF9GaW5kTmV4dChGUERGX1NDSEhBTkRMRSBoYW5kbGUpIHsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZUZXh0X0ZpbmROZXh0KEZQREZfU0NISEFORExFIGhhbmRsZSkgewogICBpZiAoIWhhbmRsZSkKICAgICByZXR1cm4gZmFsc2U7CiAKQEAgLTI0Myw3ICsyODEsNyBAQAogICByZXR1cm4gdGV4dHBhZ2VGaW5kLT5GaW5kTmV4dCgpOwogfQogCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlRleHRfRmluZFByZXYoRlBERl9TQ0hIQU5ETEUgaGFuZGxlKSB7CitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGVGV4dF9GaW5kUHJldihGUERGX1NDSEhBTkRMRSBoYW5kbGUpIHsKICAgaWYgKCFoYW5kbGUpCiAgICAgcmV0dXJuIGZhbHNlOwogCkBAIC0yNTEsNyArMjg5LDggQEAKICAgcmV0dXJuIHRleHRwYWdlRmluZC0+RmluZFByZXYoKTsKIH0KIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZUZXh0X0dldFNjaFJlc3VsdEluZGV4KEZQREZfU0NISEFORExFIGhhbmRsZSkgeworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYKK0ZQREZUZXh0X0dldFNjaFJlc3VsdEluZGV4KEZQREZfU0NISEFORExFIGhhbmRsZSkgewogICBpZiAoIWhhbmRsZSkKICAgICByZXR1cm4gMDsKIApAQCAtMjU5LDcgKzI5OCw3IEBACiAgIHJldHVybiB0ZXh0cGFnZUZpbmQtPkdldEN1ck9yZGVyKCk7CiB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGVGV4dF9HZXRTY2hDb3VudChGUERGX1NDSEhBTkRMRSBoYW5kbGUpIHsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZUZXh0X0dldFNjaENvdW50KEZQREZfU0NISEFORExFIGhhbmRsZSkgewogICBpZiAoIWhhbmRsZSkKICAgICByZXR1cm4gMDsKIApAQCAtMjY3LDcgKzMwNiw3IEBACiAgIHJldHVybiB0ZXh0cGFnZUZpbmQtPkdldE1hdGNoZWRDb3VudCgpOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZUZXh0X0ZpbmRDbG9zZShGUERGX1NDSEhBTkRMRSBoYW5kbGUpIHsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGVGV4dF9GaW5kQ2xvc2UoRlBERl9TQ0hIQU5ETEUgaGFuZGxlKSB7CiAgIGlmICghaGFuZGxlKQogICAgIHJldHVybjsKIApAQCAtMjc3LDcgKzMxNiw4IEBACiB9CiAKIC8vIHdlYiBsaW5rCi1ETExFWFBPUlQgRlBERl9QQUdFTElOSyBTVERDQUxMIEZQREZMaW5rX0xvYWRXZWJMaW5rcyhGUERGX1RFWFRQQUdFIHRleHRfcGFnZSkgeworRlBERl9FWFBPUlQgRlBERl9QQUdFTElOSyBGUERGX0NBTExDT05WCitGUERGTGlua19Mb2FkV2ViTGlua3MoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UpIHsKICAgaWYgKCF0ZXh0X3BhZ2UpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKQEAgLTI4Nyw3ICszMjcsNyBAQAogICByZXR1cm4gcGFnZUxpbms7CiB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGTGlua19Db3VudFdlYkxpbmtzKEZQREZfUEFHRUxJTksgbGlua19wYWdlKSB7CitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OViBGUERGTGlua19Db3VudFdlYkxpbmtzKEZQREZfUEFHRUxJTksgbGlua19wYWdlKSB7CiAgIGlmICghbGlua19wYWdlKQogICAgIHJldHVybiAwOwogCkBAIC0yOTUsMTYgKzMzNSwxNiBAQAogICByZXR1cm4gcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8aW50PihwYWdlTGluay0+Q291bnRMaW5rcygpKTsKIH0KIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZMaW5rX0dldFVSTChGUERGX1BBR0VMSU5LIGxpbmtfcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmtfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0KiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZsZW4pIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NVcmwoTCIiKTsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZMaW5rX0dldFVSTChGUERGX1BBR0VMSU5LIGxpbmtfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlua19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZsZW4pIHsKKyAgV2lkZVN0cmluZyB3c1VybChMIiIpOwogICBpZiAobGlua19wYWdlICYmIGxpbmtfaW5kZXggPj0gMCkgewogICAgIENQREZfTGlua0V4dHJhY3QqIHBhZ2VMaW5rID0gQ1BERkxpbmtFeHRyYWN0RnJvbUZQREZQYWdlTGluayhsaW5rX3BhZ2UpOwogICAgIHdzVXJsID0gcGFnZUxpbmstPkdldFVSTChsaW5rX2luZGV4KTsKICAgfQotICBDRlhfQnl0ZVN0cmluZyBjYlVURjE2VVJMID0gd3NVcmwuVVRGMTZMRV9FbmNvZGUoKTsKKyAgQnl0ZVN0cmluZyBjYlVURjE2VVJMID0gd3NVcmwuVVRGMTZMRV9FbmNvZGUoKTsKICAgaW50IHJlcXVpcmVkID0gY2JVVEYxNlVSTC5HZXRMZW5ndGgoKSAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCk7CiAgIGlmICghYnVmZmVyIHx8IGJ1ZmxlbiA8PSAwKQogICAgIHJldHVybiByZXF1aXJlZDsKQEAgLTMxMiwxMyArMzUyLDEzIEBACiAgIGludCBzaXplID0gc3RkOjptaW4ocmVxdWlyZWQsIGJ1Zmxlbik7CiAgIGlmIChzaXplID4gMCkgewogICAgIGludCBidWZfc2l6ZSA9IHNpemUgKiBzaXplb2YodW5zaWduZWQgc2hvcnQpOwotICAgIEZYU1lTX21lbWNweShidWZmZXIsIGNiVVRGMTZVUkwuR2V0QnVmZmVyKGJ1Zl9zaXplKSwgYnVmX3NpemUpOworICAgIG1lbWNweShidWZmZXIsIGNiVVRGMTZVUkwuR2V0QnVmZmVyKGJ1Zl9zaXplKSwgYnVmX3NpemUpOwogICB9CiAgIHJldHVybiBzaXplOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERkxpbmtfQ291bnRSZWN0cyhGUERGX1BBR0VMSU5LIGxpbmtfcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5rX2luZGV4KSB7CitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OViBGUERGTGlua19Db3VudFJlY3RzKEZQREZfUEFHRUxJTksgbGlua19wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlua19pbmRleCkgewogICBpZiAoIWxpbmtfcGFnZSB8fCBsaW5rX2luZGV4IDwgMCkKICAgICByZXR1cm4gMDsKIApAQCAtMzI2LDI3ICszNjYsMjggQEAKICAgcmV0dXJuIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50PihwYWdlTGluay0+R2V0UmVjdHMobGlua19pbmRleCkpOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZMaW5rX0dldFJlY3QoRlBERl9QQUdFTElOSyBsaW5rX3BhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmtfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlY3RfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBib3R0b20pIHsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZMaW5rX0dldFJlY3QoRlBERl9QQUdFTElOSyBsaW5rX3BhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5rX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVjdF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBib3R0b20pIHsKICAgaWYgKCFsaW5rX3BhZ2UgfHwgbGlua19pbmRleCA8IDAgfHwgcmVjdF9pbmRleCA8IDApCi0gICAgcmV0dXJuOworICAgIHJldHVybiBmYWxzZTsKIAogICBDUERGX0xpbmtFeHRyYWN0KiBwYWdlTGluayA9IENQREZMaW5rRXh0cmFjdEZyb21GUERGUGFnZUxpbmsobGlua19wYWdlKTsKICAgc3RkOjp2ZWN0b3I8Q0ZYX0Zsb2F0UmVjdD4gcmVjdEFycmF5ID0gcGFnZUxpbmstPkdldFJlY3RzKGxpbmtfaW5kZXgpOwogICBpZiAocmVjdF9pbmRleCA+PSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludD4ocmVjdEFycmF5KSkKLSAgICByZXR1cm47CisgICAgcmV0dXJuIGZhbHNlOwogCiAgICpsZWZ0ID0gcmVjdEFycmF5W3JlY3RfaW5kZXhdLmxlZnQ7CiAgICpyaWdodCA9IHJlY3RBcnJheVtyZWN0X2luZGV4XS5yaWdodDsKICAgKnRvcCA9IHJlY3RBcnJheVtyZWN0X2luZGV4XS50b3A7CiAgICpib3R0b20gPSByZWN0QXJyYXlbcmVjdF9pbmRleF0uYm90dG9tOworICByZXR1cm4gdHJ1ZTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGTGlua19DbG9zZVdlYkxpbmtzKEZQREZfUEFHRUxJTksgbGlua19wYWdlKSB7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRlBERkxpbmtfQ2xvc2VXZWJMaW5rcyhGUERGX1BBR0VMSU5LIGxpbmtfcGFnZSkgewogICBkZWxldGUgQ1BERkxpbmtFeHRyYWN0RnJvbUZQREZQYWdlTGluayhsaW5rX3BhZ2UpOwogfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9mcGRmdGV4dF9lbWJlZGRlcnRlc3QuY3BwIGIvZnBkZnNkay9mcGRmdGV4dF9lbWJlZGRlcnRlc3QuY3BwCmluZGV4IDE5OGVmOGEuLjg2ZDMyYTcgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvZnBkZnRleHRfZW1iZWRkZXJ0ZXN0LmNwcAorKysgYi9mcGRmc2RrL2ZwZGZ0ZXh0X2VtYmVkZGVydGVzdC5jcHAKQEAgLTQsNyArNCw3IEBACiAKICNpbmNsdWRlIDxtZW1vcnk+CiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9tZW1vcnkuaCIKICNpbmNsdWRlICJwdWJsaWMvZnBkZl90ZXh0LmgiCiAjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCiAjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCkBAIC0xNiwxMyArMTYsMTIgQEAKIGJvb2wgY2hlY2tfdW5zaWduZWRfc2hvcnRzKGNvbnN0IGNoYXIqIGV4cGVjdGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQqIGFjdHVhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpIHsKLSAgaWYgKGxlbmd0aCA+IHN0cmxlbihleHBlY3RlZCkgKyAxKSB7CisgIGlmIChsZW5ndGggPiBzdHJsZW4oZXhwZWN0ZWQpICsgMSkKICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KKwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7Ci0gICAgaWYgKGFjdHVhbFtpXSAhPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oZXhwZWN0ZWRbaV0pKSB7CisgICAgaWYgKGFjdHVhbFtpXSAhPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oZXhwZWN0ZWRbaV0pKQogICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KICAgfQogICByZXR1cm4gdHJ1ZTsKIH0KQEAgLTQzLDYgKzQyLDE5IEBACiAgIHVuc2lnbmVkIHNob3J0IGZpeGVkX2J1ZmZlclsxMjhdOwogICBtZW1zZXQoZml4ZWRfYnVmZmVyLCAweGJkLCBzaXplb2YoZml4ZWRfYnVmZmVyKSk7CiAKKyAgLy8gQ2hlY2sgdGhhdCBlZGdlIGNhc2VzIGFyZSBoYW5kbGVkIGdyYWNlZnVsbHkKKyAgRVhQRUNUX0VRKDAsIEZQREZUZXh0X0dldFRleHQodGV4dHBhZ2UsIDAsIDEyOCwgbnVsbHB0cikpOworICBFWFBFQ1RfRVEoMCwgRlBERlRleHRfR2V0VGV4dCh0ZXh0cGFnZSwgLTEsIDEyOCwgZml4ZWRfYnVmZmVyKSk7CisgIEVYUEVDVF9FUSgwLCBGUERGVGV4dF9HZXRUZXh0KHRleHRwYWdlLCAwLCAtMSwgZml4ZWRfYnVmZmVyKSk7CisgIEVYUEVDVF9FUSgxLCBGUERGVGV4dF9HZXRUZXh0KHRleHRwYWdlLCAwLCAwLCBmaXhlZF9idWZmZXIpKTsKKyAgRVhQRUNUX0VRKDAsIGZpeGVkX2J1ZmZlclswXSk7CisKKyAgLy8gS2VlcCBnb2luZyBhbmQgY2hlY2sgdGhlIG5leHQgY2FzZS4KKyAgbWVtc2V0KGZpeGVkX2J1ZmZlciwgMHhiZCwgc2l6ZW9mKGZpeGVkX2J1ZmZlcikpOworICBFWFBFQ1RfRVEoMiwgRlBERlRleHRfR2V0VGV4dCh0ZXh0cGFnZSwgMCwgMSwgZml4ZWRfYnVmZmVyKSk7CisgIEVYUEVDVF9FUShleHBlY3RlZFswXSwgZml4ZWRfYnVmZmVyWzBdKTsKKyAgRVhQRUNUX0VRKDAsIGZpeGVkX2J1ZmZlclsxXSk7CisKICAgLy8gQ2hlY2sgaW5jbHVkZXMgdGhlIHRlcm1pbmF0aW5nIE5VTCB0aGF0IGlzIHByb3ZpZGVkLgogICBpbnQgbnVtX2NoYXJzID0gRlBERlRleHRfR2V0VGV4dCh0ZXh0cGFnZSwgMCwgMTI4LCBmaXhlZF9idWZmZXIpOwogICBBU1NFUlRfR0UobnVtX2NoYXJzLCAwKTsKQEAgLTU4LDYgKzcwLDE2IEBACiAgICAgICAgIDw8ICIgYXQgIiA8PCBpOwogICB9CiAKKyAgLy8gRXh0cmFjdGluZyB1c2luZyBhIGJ1ZmZlciB0aGF0IHdpbGwgYmUgY29tcGxldGVseSBmaWxsZWQuIFNtYWxsIGJ1ZmZlciBpcworICAvLyAxMiBlbGVtZW50cyBsb25nLCBzaW5jZSBpdCB3aWxsIG5lZWQgMiBsb2NhdGlvbnMgcGVyIGRpc3BsYXllZCBjaGFyYWN0ZXIgaW4KKyAgLy8gdGhlIGV4cGVjdGVkIHN0cmluZywgcGx1cyAyIG1vcmUgZm9yIHRoZSB0ZXJtaW5hdGluZyBjaGFyYWN0ZXIuCisgIHN0YXRpYyBjb25zdCBjaGFyIHNtYWxsX2V4cGVjdGVkW10gPSAiSGVsbG8iOworICB1bnNpZ25lZCBzaG9ydCBzbWFsbF9idWZmZXJbMTJdOworICBtZW1zZXQoZml4ZWRfYnVmZmVyLCAweGJkLCBzaXplb2YoZml4ZWRfYnVmZmVyKSk7CisgIEVYUEVDVF9FUSg2LCBGUERGVGV4dF9HZXRUZXh0KHRleHRwYWdlLCAwLCA1LCBzbWFsbF9idWZmZXIpKTsKKyAgRVhQRUNUX1RSVUUoY2hlY2tfdW5zaWduZWRfc2hvcnRzKHNtYWxsX2V4cGVjdGVkLCBzbWFsbF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc21hbGxfZXhwZWN0ZWQpKSk7CisKICAgRVhQRUNUX0VRKDEyLjAsIEZQREZUZXh0X0dldEZvbnRTaXplKHRleHRwYWdlLCAwKSk7CiAgIEVYUEVDVF9FUSgxNi4wLCBGUERGVGV4dF9HZXRGb250U2l6ZSh0ZXh0cGFnZSwgMTUpKTsKIApAQCAtNjUsMTIgKzg3LDM0IEBACiAgIGRvdWJsZSByaWdodCA9IDAuMDsKICAgZG91YmxlIGJvdHRvbSA9IDAuMDsKICAgZG91YmxlIHRvcCA9IDAuMDsKLSAgRlBERlRleHRfR2V0Q2hhckJveCh0ZXh0cGFnZSwgNCwgJmxlZnQsICZyaWdodCwgJmJvdHRvbSwgJnRvcCk7CisgIEVYUEVDVF9GQUxTRShGUERGVGV4dF9HZXRDaGFyQm94KG51bGxwdHIsIDQsICZsZWZ0LCAmcmlnaHQsICZib3R0b20sICZ0b3ApKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgwLjAsIGxlZnQpOworICBFWFBFQ1RfRE9VQkxFX0VRKDAuMCwgcmlnaHQpOworICBFWFBFQ1RfRE9VQkxFX0VRKDAuMCwgYm90dG9tKTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgwLjAsIHRvcCk7CisgIEVYUEVDVF9GQUxTRShGUERGVGV4dF9HZXRDaGFyQm94KHRleHRwYWdlLCAtMSwgJmxlZnQsICZyaWdodCwgJmJvdHRvbSwgJnRvcCkpOworICBFWFBFQ1RfRE9VQkxFX0VRKDAuMCwgbGVmdCk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMC4wLCByaWdodCk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMC4wLCBib3R0b20pOworICBFWFBFQ1RfRE9VQkxFX0VRKDAuMCwgdG9wKTsKKyAgRVhQRUNUX0ZBTFNFKEZQREZUZXh0X0dldENoYXJCb3godGV4dHBhZ2UsIDU1LCAmbGVmdCwgJnJpZ2h0LCAmYm90dG9tLCAmdG9wKSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMC4wLCBsZWZ0KTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgwLjAsIHJpZ2h0KTsKKyAgRVhQRUNUX0RPVUJMRV9FUSgwLjAsIGJvdHRvbSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMC4wLCB0b3ApOworCisgIEVYUEVDVF9UUlVFKEZQREZUZXh0X0dldENoYXJCb3godGV4dHBhZ2UsIDQsICZsZWZ0LCAmcmlnaHQsICZib3R0b20sICZ0b3ApKTsKICAgRVhQRUNUX05FQVIoNDEuMDcxLCBsZWZ0LCAwLjAwMSk7CiAgIEVYUEVDVF9ORUFSKDQ2LjI0MywgcmlnaHQsIDAuMDAxKTsKICAgRVhQRUNUX05FQVIoNDkuODQ0LCBib3R0b20sIDAuMDAxKTsKICAgRVhQRUNUX05FQVIoNTUuNTIwLCB0b3AsIDAuMDAxKTsKIAorICBkb3VibGUgeCA9IDAuMDsKKyAgZG91YmxlIHkgPSAwLjA7CisgIEVYUEVDVF9UUlVFKEZQREZUZXh0X0dldENoYXJPcmlnaW4odGV4dHBhZ2UsIDQsICZ4LCAmeSkpOworICBFWFBFQ1RfTkVBUig0MC42NjQsIHgsIDAuMDAxKTsKKyAgRVhQRUNUX05FQVIoNTAuMDAwLCB5LCAwLjAwMSk7CisKICAgRVhQRUNUX0VRKDQsIEZQREZUZXh0X0dldENoYXJJbmRleEF0UG9zKHRleHRwYWdlLCA0Mi4wLCA1MC4wLCAxLjAsIDEuMCkpOwogICBFWFBFQ1RfRVEoLTEsIEZQREZUZXh0X0dldENoYXJJbmRleEF0UG9zKHRleHRwYWdlLCAwLjAsIDAuMCwgMS4wLCAxLjApKTsKICAgRVhQRUNUX0VRKC0xLCBGUERGVGV4dF9HZXRDaGFySW5kZXhBdFBvcyh0ZXh0cGFnZSwgMTk5LjAsIDE5OS4wLCAxLjAsIDEuMCkpOwpAQCAtODcsNyArMTMxLDcgQEAKICAgcmlnaHQgPSAwLjA7CiAgIGJvdHRvbSA9IDAuMDsKICAgdG9wID0gMC4wOwotICBGUERGVGV4dF9HZXRSZWN0KHRleHRwYWdlLCAxLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKTsKKyAgRVhQRUNUX1RSVUUoRlBERlRleHRfR2V0UmVjdCh0ZXh0cGFnZSwgMSwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSkpOwogICBFWFBFQ1RfTkVBUigyMC44NDcsIGxlZnQsIDAuMDAxKTsKICAgRVhQRUNUX05FQVIoMTM1LjE2NywgcmlnaHQsIDAuMDAxKTsKICAgRVhQRUNUX05FQVIoOTYuNjU1LCBib3R0b20sIDAuMDAxKTsKQEAgLTk4LDcgKzE0Miw3IEBACiAgIHJpZ2h0ID0gLTEuMDsKICAgYm90dG9tID0gLTEuMDsKICAgdG9wID0gLTEuMDsKLSAgRlBERlRleHRfR2V0UmVjdCh0ZXh0cGFnZSwgLTEsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pOworICBFWFBFQ1RfRkFMU0UoRlBERlRleHRfR2V0UmVjdCh0ZXh0cGFnZSwgLTEsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pKTsKICAgRVhQRUNUX0VRKDAuMCwgbGVmdCk7CiAgIEVYUEVDVF9FUSgwLjAsIHJpZ2h0KTsKICAgRVhQRUNUX0VRKDAuMCwgYm90dG9tKTsKQEAgLTEwOCw3ICsxNTIsNyBAQAogICByaWdodCA9IC0yLjA7CiAgIGJvdHRvbSA9IC0yLjA7CiAgIHRvcCA9IC0yLjA7Ci0gIEZQREZUZXh0X0dldFJlY3QodGV4dHBhZ2UsIDIsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pOworICBFWFBFQ1RfRkFMU0UoRlBERlRleHRfR2V0UmVjdCh0ZXh0cGFnZSwgMiwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSkpOwogICBFWFBFQ1RfRVEoMC4wLCBsZWZ0KTsKICAgRVhQRUNUX0VRKDAuMCwgcmlnaHQpOwogICBFWFBFQ1RfRVEoMC4wLCBib3R0b20pOwpAQCAtMzM3LDcgKzM4MSw3IEBACiAgIGRvdWJsZSByaWdodCA9IDAuMDsKICAgZG91YmxlIHRvcCA9IDAuMDsKICAgZG91YmxlIGJvdHRvbSA9IDAuMDsKLSAgRlBERkxpbmtfR2V0UmVjdChwYWdlbGluaywgMCwgMCwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSk7CisgIEVYUEVDVF9UUlVFKEZQREZMaW5rX0dldFJlY3QocGFnZWxpbmssIDAsIDAsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pKTsKICAgRVhQRUNUX05FQVIoNTAuNzkxLCBsZWZ0LCAwLjAwMSk7CiAgIEVYUEVDVF9ORUFSKDE4Ny45NjMsIHJpZ2h0LCAwLjAwMSk7CiAgIEVYUEVDVF9ORUFSKDk3LjYyNCwgYm90dG9tLCAwLjAwMSk7CkBAIC0zNDgsNyArMzkyLDcgQEAKICAgcmlnaHQgPSAtMS4wOwogICB0b3AgPSAtMS4wOwogICBib3R0b20gPSAtMS4wOwotICBGUERGTGlua19HZXRSZWN0KHBhZ2VsaW5rLCAwLCAxLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKTsKKyAgRVhQRUNUX0ZBTFNFKEZQREZMaW5rX0dldFJlY3QocGFnZWxpbmssIDAsIDEsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pKTsKICAgRVhQRUNUX0VRKC0xLjAsIGxlZnQpOwogICBFWFBFQ1RfRVEoLTEuMCwgcmlnaHQpOwogICBFWFBFQ1RfRVEoLTEuMCwgYm90dG9tKTsKQEAgLTM1OSw3ICs0MDMsNyBAQAogICByaWdodCA9IC0yLjA7CiAgIHRvcCA9IC0yLjA7CiAgIGJvdHRvbSA9IC0yLjA7Ci0gIEZQREZMaW5rX0dldFJlY3QocGFnZWxpbmssIC0xLCAwLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKTsKKyAgRVhQRUNUX0ZBTFNFKEZQREZMaW5rX0dldFJlY3QocGFnZWxpbmssIC0xLCAwLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKSk7CiAgIEVYUEVDVF9FUSgtMi4wLCBsZWZ0KTsKICAgRVhQRUNUX0VRKC0yLjAsIHJpZ2h0KTsKICAgRVhQRUNUX0VRKC0yLjAsIGJvdHRvbSk7CkBAIC0zNzAsNiArNDE0LDc0IEBACiAgIFVubG9hZFBhZ2UocGFnZSk7CiB9CiAKK1RFU1RfRihGUERGVGV4dEVtYmVkZGVydGVzdCwgV2ViTGlua3NBY3Jvc3NMaW5lcykgeworICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoIndlYmxpbmtzX2Fjcm9zc19saW5lcy5wZGYiKSk7CisgIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoMCk7CisgIEVYUEVDVF9UUlVFKHBhZ2UpOworCisgIEZQREZfVEVYVFBBR0UgdGV4dHBhZ2UgPSBGUERGVGV4dF9Mb2FkUGFnZShwYWdlKTsKKyAgRVhQRUNUX1RSVUUodGV4dHBhZ2UpOworCisgIEZQREZfUEFHRUxJTksgcGFnZWxpbmsgPSBGUERGTGlua19Mb2FkV2ViTGlua3ModGV4dHBhZ2UpOworICBFWFBFQ1RfVFJVRShwYWdlbGluayk7CisKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtFeHBlY3RlZFVybHNbXSA9IHsKKyAgICAgICJodHRwOi8vZXhhbXBsZS5jb20iLCAgICAgICAgICAgLy8gZnJvbSAiaHR0cDovL3d3dy5leGFtcGxlLmNvbT9cclxuZm9vIgorICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS8iLCAgICAgICAgICAvLyBmcm9tICJodHRwOi8vd3d3LmV4YW1wbGUuY29tL1xyXG5mb28iCisgICAgICAiaHR0cDovL2V4YW1wbGUuY29tL3Rlc3QtZm9vIiwgIC8vIGZyb20gImh0dHA6Ly9leGFtcGxlLmNvbS90ZXN0LVxyXG5mb28iCisgICAgICAiaHR0cDovL2FiYy5jb20vdGVzdC1mb28iLCAgICAgIC8vIGZyb20gImh0dHA6Ly9hYmMuY29tL3Rlc3QtXHJcblxyXG5mb28iCisgICAgICAvLyBOZXh0IHR3byBsaW5rcyBmcm9tICJodHRwOi8vd3d3LmV4YW1wbGUuY29tL1xyXG5odHRwOi8vd3d3LmFiYy5jb20vIgorICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS8iLCAiaHR0cDovL3d3dy5hYmMuY29tIiwKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGludCBrTnVtTGlua3MgPSBzdGF0aWNfY2FzdDxpbnQ+KEZYX0FycmF5U2l6ZShrRXhwZWN0ZWRVcmxzKSk7CisKKyAgRVhQRUNUX0VRKGtOdW1MaW5rcywgRlBERkxpbmtfQ291bnRXZWJMaW5rcyhwYWdlbGluaykpOworCisgIHVuc2lnbmVkIHNob3J0IGZpeGVkX2J1ZmZlclsxMjhdOworICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1MaW5rczsgaSsrKSB7CisgICAgY29uc3Qgc2l6ZV90IGV4cGVjdGVkX2xlbiA9IHN0cmxlbihrRXhwZWN0ZWRVcmxzW2ldKSArIDE7CisgICAgbWVtc2V0KGZpeGVkX2J1ZmZlciwgMCwgRlhfQXJyYXlTaXplKGZpeGVkX2J1ZmZlcikpOworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxpbnQ+KGV4cGVjdGVkX2xlbiksCisgICAgICAgICAgICAgIEZQREZMaW5rX0dldFVSTChwYWdlbGluaywgaSwgbnVsbHB0ciwgMCkpOworICAgIEVYUEVDVF9FUSgKKyAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihleHBlY3RlZF9sZW4pLAorICAgICAgICBGUERGTGlua19HZXRVUkwocGFnZWxpbmssIGksIGZpeGVkX2J1ZmZlciwgRlhfQXJyYXlTaXplKGZpeGVkX2J1ZmZlcikpKTsKKyAgICBFWFBFQ1RfVFJVRSgKKyAgICAgICAgY2hlY2tfdW5zaWduZWRfc2hvcnRzKGtFeHBlY3RlZFVybHNbaV0sIGZpeGVkX2J1ZmZlciwgZXhwZWN0ZWRfbGVuKSk7CisgIH0KKworICBGUERGTGlua19DbG9zZVdlYkxpbmtzKHBhZ2VsaW5rKTsKKyAgRlBERlRleHRfQ2xvc2VQYWdlKHRleHRwYWdlKTsKKyAgVW5sb2FkUGFnZShwYWdlKTsKK30KKworVEVTVF9GKEZQREZUZXh0RW1iZWRkZXJ0ZXN0LCBXZWJMaW5rc0Fjcm9zc0xpbmVzQnVnKSB7CisgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgiYnVnXzY1MC5wZGYiKSk7CisgIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoMCk7CisgIEVYUEVDVF9UUlVFKHBhZ2UpOworCisgIEZQREZfVEVYVFBBR0UgdGV4dHBhZ2UgPSBGUERGVGV4dF9Mb2FkUGFnZShwYWdlKTsKKyAgRVhQRUNUX1RSVUUodGV4dHBhZ2UpOworCisgIEZQREZfUEFHRUxJTksgcGFnZWxpbmsgPSBGUERGTGlua19Mb2FkV2ViTGlua3ModGV4dHBhZ2UpOworICBFWFBFQ1RfVFJVRShwYWdlbGluayk7CisKKyAgRVhQRUNUX0VRKDIsIEZQREZMaW5rX0NvdW50V2ViTGlua3MocGFnZWxpbmspKTsKKyAgdW5zaWduZWQgc2hvcnQgZml4ZWRfYnVmZmVyWzEyOF0gPSB7MH07CisgIHN0YXRpYyBjb25zdCBjaGFyIGtFeHBlY3RlZFVybFtdID0KKyAgICAgICJodHRwOi8vdHV0b3JpYWw0NS5jb20vbGVhcm4tYXV0b2NhZC1iYXNpY3MtZGF5LTE2Ni8iOworICBzdGF0aWMgY29uc3QgaW50IGtVcmxTaXplID0gc3RhdGljX2Nhc3Q8aW50PihzaXplb2Yoa0V4cGVjdGVkVXJsKSk7CisKKyAgRVhQRUNUX0VRKGtVcmxTaXplLCBGUERGTGlua19HZXRVUkwocGFnZWxpbmssIDEsIG51bGxwdHIsIDApKTsKKyAgRVhQRUNUX0VRKGtVcmxTaXplLCBGUERGTGlua19HZXRVUkwocGFnZWxpbmssIDEsIGZpeGVkX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQXJyYXlTaXplKGZpeGVkX2J1ZmZlcikpKTsKKyAgRVhQRUNUX1RSVUUoY2hlY2tfdW5zaWduZWRfc2hvcnRzKGtFeHBlY3RlZFVybCwgZml4ZWRfYnVmZmVyLCBrVXJsU2l6ZSkpOworCisgIEZQREZMaW5rX0Nsb3NlV2ViTGlua3MocGFnZWxpbmspOworICBGUERGVGV4dF9DbG9zZVBhZ2UodGV4dHBhZ2UpOworICBVbmxvYWRQYWdlKHBhZ2UpOworfQorCiBURVNUX0YoRlBERlRleHRFbWJlZGRlcnRlc3QsIEdldEZvbnRTaXplKSB7CiAgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgiaGVsbG9fd29ybGQucGRmIikpOwogICBGUERGX1BBR0UgcGFnZSA9IExvYWRQYWdlKDApOwpAQCAtNDA1LDMgKzUxNywxMjcgQEAKICAgRlBERlRleHRfQ2xvc2VQYWdlKHRleHRwYWdlKTsKICAgVW5sb2FkUGFnZShwYWdlKTsKIH0KKworVEVTVF9GKEZQREZUZXh0RW1iZWRkZXJ0ZXN0LCBCdWdfOTIxKSB7CisgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgiYnVnXzkyMS5wZGYiKSk7CisgIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoMCk7CisgIEVYUEVDVF9UUlVFKHBhZ2UpOworCisgIEZQREZfVEVYVFBBR0UgdGV4dHBhZ2UgPSBGUERGVGV4dF9Mb2FkUGFnZShwYWdlKTsKKyAgRVhQRUNUX1RSVUUodGV4dHBhZ2UpOworCisgIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgaW50IGtEYXRhW10gPSB7CisgICAgICAxMDk1LCAxMDc3LCAxMDgzLCAxMDg2LCAxMDc0LCAxMDc3LCAxMDk1LCAxMDc3LCAxMDg5LCAxMDgyLCAxMDg2LCAxMDc3LAorICAgICAgMzIsICAgMTA4OSwgMTA5MCwgMTA4OCwgMTA3MiwgMTA3NiwgMTA3MiwgMTA4NSwgMTA4MCwgMTA3NywgNDYsICAgMzJ9OworICBzdGF0aWMgY29uc3RleHByIGludCBrU3RhcnRJbmRleCA9IDIzODsKKworICBBU1NFUlRfRVEoMjY4LCBGUERGVGV4dF9Db3VudENoYXJzKHRleHRwYWdlKSk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGtEYXRhKTsgKytpKQorICAgIEVYUEVDVF9FUShrRGF0YVtpXSwgRlBERlRleHRfR2V0VW5pY29kZSh0ZXh0cGFnZSwga1N0YXJ0SW5kZXggKyBpKSk7CisKKyAgdW5zaWduZWQgc2hvcnQgYnVmZmVyW0ZYX0FycmF5U2l6ZShrRGF0YSkgKyAxXTsKKyAgbWVtc2V0KGJ1ZmZlciwgMHhiZCwgc2l6ZW9mKGJ1ZmZlcikpOworICBpbnQgY291bnQgPQorICAgICAgRlBERlRleHRfR2V0VGV4dCh0ZXh0cGFnZSwga1N0YXJ0SW5kZXgsIEZYX0FycmF5U2l6ZShrRGF0YSksIGJ1ZmZlcik7CisgIEFTU0VSVF9HVChjb3VudCwgMCk7CisgIEFTU0VSVF9FUShGWF9BcnJheVNpemUoa0RhdGEpICsgMSwgc3RhdGljX2Nhc3Q8c2l6ZV90Pihjb3VudCkpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShrRGF0YSk7ICsraSkKKyAgICBFWFBFQ1RfRVEoa0RhdGFbaV0sIGJ1ZmZlcltpXSk7CisgIEVYUEVDVF9FUSgwLCBidWZmZXJbRlhfQXJyYXlTaXplKGtEYXRhKV0pOworCisgIEZQREZUZXh0X0Nsb3NlUGFnZSh0ZXh0cGFnZSk7CisgIFVubG9hZFBhZ2UocGFnZSk7Cit9CisKK1RFU1RfRihGUERGVGV4dEVtYmVkZGVydGVzdCwgR2V0VGV4dFdpdGhIeXBoZW4pIHsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJidWdfNzgxODA0LnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkUGFnZSgwKTsKKyAgRVhQRUNUX1RSVUUocGFnZSk7CisKKyAgRlBERl9URVhUUEFHRSB0ZXh0cGFnZSA9IEZQREZUZXh0X0xvYWRQYWdlKHBhZ2UpOworICBFWFBFQ1RfVFJVRSh0ZXh0cGFnZSk7CisKKyAgLy8gQ2hlY2sgdGhhdCBzb2Z0IGh5cGhlbnMgYXJlIG5vdCBpbmNsdWRlZAorICAvLyBFeHBlY3RpbmcgJ1Zlcml0YXNlcnVtJywgZXhjZXB0IHRoZXJlIGlzIGEgXHVGRkZFIHdoZXJlIHRoZSBoeXBoZW4gd2FzIGluCisgIC8vIHRoZSBvcmlnaW5hbCB0ZXh0LiBUaGlzIGlzIGEgd2VpcmQgdGhpbmcgdGhhdCBBZG9iZSBkb2VzLCB3aGljaCB3ZQorICAvLyByZXBsaWNhdGUuCisgIGNvbnN0ZXhwciB1bnNpZ25lZCBzaG9ydCBzb2Z0X2V4cGVjdGVkW10gPSB7CisgICAgICAweDAwNTYsIDB4MDA2NSwgMHgwMDcyLCAweDAwNjksIDB4MDA3NCwgMHgwMDYxLCAweGZmZmUsCisgICAgICAweDAwNzMsIDB4MDA2NSwgMHgwMDcyLCAweDAwNzUsIDB4MDA2RCwgMHgwMDAwfTsKKyAgeworICAgIGNvbnN0ZXhwciBpbnQgY291bnQgPSBGWF9BcnJheVNpemUoc29mdF9leHBlY3RlZCkgLSAxOworICAgIHVuc2lnbmVkIHNob3J0IGJ1ZmZlcltGWF9BcnJheVNpemUoc29mdF9leHBlY3RlZCldOworICAgIG1lbXNldChidWZmZXIsIDAsIHNpemVvZihidWZmZXIpKTsKKworICAgIEVYUEVDVF9FUShjb3VudCArIDEsIEZQREZUZXh0X0dldFRleHQodGV4dHBhZ2UsIDAsIGNvdW50LCBidWZmZXIpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICBFWFBFQ1RfRVEoc29mdF9leHBlY3RlZFtpXSwgYnVmZmVyW2ldKTsKKyAgfQorCisgIC8vIENoZWNrIHRoYXQgaGFyZCBoeXBoZW5zIGFyZSBpbmNsdWRlZAorICB7CisgICAgLy8gVGhlcmUgaXNuJ3QgdGhlIFwwIGluIHRoZSBhY3R1YWwgZG9jLCBidXQgdGhlcmUgaXMgYSBcclxuLCBzbyBuZWVkIHRvCisgICAgLy8gYWRkIDEgdG8gZ2V0IGFsaWduZWQuCisgICAgY29uc3RleHByIHNpemVfdCBvZmZzZXQgPSBGWF9BcnJheVNpemUoc29mdF9leHBlY3RlZCkgKyAxOworICAgIC8vIEV4cGVjdGluZyAnVXNlci1cclxuZ2VuZXJhdGVkJywgdGhlIC0gaXMgYSB1bmljb2RlIGNoYXJhY3Rlciwgc28gY2Fubm5vdAorICAgIC8vIHN0b3JlIGluIGEgY2hhcltdLgorICAgIGNvbnN0ZXhwciB1bnNpZ25lZCBzaG9ydCBoYXJkX2V4cGVjdGVkW10gPSB7CisgICAgICAgIDB4MDA1NSwgMHgwMDczLCAweDAwNjUsIDB4MDA3MiwgMHgyMDEwLCAweDAwMGQsIDB4MDAwYSwgMHgwMDY3LCAweDAwNjUsCisgICAgICAgIDB4MDA2ZSwgMHgwMDY1LCAweDAwNzIsIDB4MDA2MSwgMHgwMDc0LCAweDAwNjUsIDB4MDA2NCwgMHgwMDAwfTsKKyAgICBjb25zdGV4cHIgaW50IGNvdW50ID0gRlhfQXJyYXlTaXplKGhhcmRfZXhwZWN0ZWQpIC0gMTsKKyAgICB1bnNpZ25lZCBzaG9ydCBidWZmZXJbRlhfQXJyYXlTaXplKGhhcmRfZXhwZWN0ZWQpXTsKKworICAgIEVYUEVDVF9FUShjb3VudCArIDEsIEZQREZUZXh0X0dldFRleHQodGV4dHBhZ2UsIG9mZnNldCwgY291bnQsIGJ1ZmZlcikpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICAgIEVYUEVDVF9FUShoYXJkX2V4cGVjdGVkW2ldLCBidWZmZXJbaV0pOworICB9CisKKyAgRlBERlRleHRfQ2xvc2VQYWdlKHRleHRwYWdlKTsKKyAgVW5sb2FkUGFnZShwYWdlKTsKK30KKworVEVTVF9GKEZQREZUZXh0RW1iZWRkZXJ0ZXN0LCBidWdfNzgyNTk2KSB7CisgIC8vIElmIHRoZXJlIGlzIGEgcmVncmVzc2lvbiBpbiB0aGlzIHRlc3QsIGl0IHdpbGwgb25seSBmYWlsIHVuZGVyIEFTQU4KKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJidWdfNzgyNTk2LnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkUGFnZSgwKTsKKyAgRVhQRUNUX1RSVUUocGFnZSk7CisgIEZQREZfVEVYVFBBR0UgdGV4dHBhZ2UgPSBGUERGVGV4dF9Mb2FkUGFnZShwYWdlKTsKKyAgRVhQRUNUX1RSVUUodGV4dHBhZ2UpOworICBGUERGVGV4dF9DbG9zZVBhZ2UodGV4dHBhZ2UpOworICBVbmxvYWRQYWdlKHBhZ2UpOworfQorCitURVNUX0YoRlBERlRleHRFbWJlZGRlcnRlc3QsIENvbnRyb2xDaGFyYWN0ZXJzKSB7CisgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgiY29udHJvbF9jaGFyYWN0ZXJzLnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkUGFnZSgwKTsKKyAgRVhQRUNUX1RSVUUocGFnZSk7CisKKyAgRlBERl9URVhUUEFHRSB0ZXh0cGFnZSA9IEZQREZUZXh0X0xvYWRQYWdlKHBhZ2UpOworICBFWFBFQ1RfVFJVRSh0ZXh0cGFnZSk7CisKKyAgLy8gU2hvdWxkIG5vdCBpbmNsdWRlIHRoZSBjb250cm9sIGNoYXJhY3RlcnMgaW4gdGhlIG91dHB1dAorICBzdGF0aWMgY29uc3QgY2hhciBleHBlY3RlZFtdID0gIkhlbGxvLCB3b3JsZCFcclxuR29vZGJ5ZSwgd29ybGQhIjsKKyAgdW5zaWduZWQgc2hvcnQgZml4ZWRfYnVmZmVyWzEyOF07CisgIG1lbXNldChmaXhlZF9idWZmZXIsIDB4YmQsIHNpemVvZihmaXhlZF9idWZmZXIpKTsKKyAgaW50IG51bV9jaGFycyA9IEZQREZUZXh0X0dldFRleHQodGV4dHBhZ2UsIDAsIDEyOCwgZml4ZWRfYnVmZmVyKTsKKworICBBU1NFUlRfR0UobnVtX2NoYXJzLCAwKTsKKyAgRVhQRUNUX0VRKHNpemVvZihleHBlY3RlZCksIHN0YXRpY19jYXN0PHNpemVfdD4obnVtX2NoYXJzKSk7CisgIEVYUEVDVF9UUlVFKGNoZWNrX3Vuc2lnbmVkX3Nob3J0cyhleHBlY3RlZCwgZml4ZWRfYnVmZmVyLCBzaXplb2YoZXhwZWN0ZWQpKSk7CisKKyAgLy8gQXR0ZW1wdGluZyB0byBnZXQgYSBjaHVuayBvZiB0ZXh0IGFmdGVyIHRoZSBjb250cm9sIGNoYXJhY3RlcnMKKyAgc3RhdGljIGNvbnN0IGNoYXIgZXhwZWN0ZWRfc3Vic3RyaW5nW10gPSAiR29vZGJ5ZSwgd29ybGQhIjsKKyAgLy8gT2Zmc2V0IGlzIHRoZSBsZW5ndGggb2YgJ0hlbGxvLCB3b3JsZCFcclxuJyArIDIgY29udHJvbCBjaGFyYWN0ZXJzIGluIHRoZQorICAvLyBvcmlnaW5hbCBzdHJlYW0KKyAgc3RhdGljIGNvbnN0IGludCBvZmZzZXQgPSAxNzsKKyAgbWVtc2V0KGZpeGVkX2J1ZmZlciwgMHhiZCwgc2l6ZW9mKGZpeGVkX2J1ZmZlcikpOworICBudW1fY2hhcnMgPSBGUERGVGV4dF9HZXRUZXh0KHRleHRwYWdlLCBvZmZzZXQsIDEyOCwgZml4ZWRfYnVmZmVyKTsKKworICBBU1NFUlRfR0UobnVtX2NoYXJzLCAwKTsKKyAgRVhQRUNUX0VRKHNpemVvZihleHBlY3RlZF9zdWJzdHJpbmcpLCBzdGF0aWNfY2FzdDxzaXplX3Q+KG51bV9jaGFycykpOworICBFWFBFQ1RfVFJVRShjaGVja191bnNpZ25lZF9zaG9ydHMoZXhwZWN0ZWRfc3Vic3RyaW5nLCBmaXhlZF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZXhwZWN0ZWRfc3Vic3RyaW5nKSkpOworCisgIEZQREZUZXh0X0Nsb3NlUGFnZSh0ZXh0cGFnZSk7CisgIFVubG9hZFBhZ2UocGFnZSk7Cit9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZ2aWV3LmNwcCBiL2ZwZGZzZGsvZnBkZnZpZXcuY3BwCmluZGV4IDFlN2E2NTEuLjk3ZmMwMmEgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvZnBkZnZpZXcuY3BwCisrKyBiL2ZwZGZzZGsvZnBkZnZpZXcuY3BwCkBAIC04LDExICs4LDE3IEBACiAKICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvY3BkZl9tb2R1bGVtZ3IuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvY3BkZl9wYWdlcmVuZGVyY29udGV4dC5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfaW1hZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2ltYWdlb2JqZWN0LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlb2JqZWN0LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYXRob2JqZWN0LmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2FycmF5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaCIKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl9wcm9ncmVzc2l2ZXJlbmRlcmVyLmgiCkBAIC0yMSwxOCArMjcsMjEgQEAKICNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9uYW1ldHJlZS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX29jY29udGV4dC5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX3ZpZXdlcnByZWZlcmVuY2VzLmgiCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2Z4X2NvZGVjLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9tZW1vcnkuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3NhZmVfdHlwZXMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2Z4Z2VkZXZpY2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmVhbS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZGVmYXVsdHJlbmRlcmRldmljZS5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZ2Vtb2R1bGUuaCIKICNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfZm9ybWZpbGxlbnZpcm9ubWVudC5oIgogI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19wYWdldmlldy5oIgogI2luY2x1ZGUgImZwZGZzZGsvZnNka19kZWZpbmUuaCIKICNpbmNsdWRlICJmcGRmc2RrL2ZzZGtfcGF1c2VhZGFwdGVyLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L2lqc19ydW50aW1lLmgiCisjaW5jbHVkZSAiZnhqcy9panNfcnVudGltZS5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2VkaXQuaCIKICNpbmNsdWRlICJwdWJsaWMvZnBkZl9leHQuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9mb3JtZmlsbC5oIgogI2luY2x1ZGUgInB1YmxpYy9mcGRmX3Byb2dyZXNzaXZlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jYXRvci9wYXJ0aXRpb25fYWxsb2MuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfY29udmVyc2lvbnNfaW1wbC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIApAQCAtNDAsMzQgKzQ5LDI2IEBACiAjaW5jbHVkZSAiZnBkZnNkay9mcGRmeGZhL2NwZGZ4ZmFfY29udGV4dC5oIgogI2luY2x1ZGUgImZwZGZzZGsvZnBkZnhmYS9jcGRmeGZhX3BhZ2UuaCIKICNpbmNsdWRlICJmcGRmc2RrL2ZwZGZ4ZmEvY3hmYV9md2xhZGFwdGVydGltZXJtZ3IuaCIKLSNpbmNsdWRlICJwdWJsaWMvZnBkZl9mb3JtZmlsbC5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvQkNfTGlicmFyeS5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9CQ19MaWJyYXJ5LmgiCiAjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKLSNpZmRlZiBQREZfRU5BQkxFX1hGQV9CTVAKLSNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2JtcG1vZHVsZS5oIgotI2VuZGlmCisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3dpbmRvd3NyZW5kZXJkZXZpY2UuaCIKIAotI2lmZGVmIFBERl9FTkFCTEVfWEZBX0dJRgotI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfZ2lmbW9kdWxlLmgiCi0jZW5kaWYKLQotI2lmZGVmIFBERl9FTkFCTEVfWEZBX1BORwotI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfcG5nbW9kdWxlLmgiCi0jZW5kaWYKLQotI2lmZGVmIFBERl9FTkFCTEVfWEZBX1RJRkYKLSNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX3RpZmZtb2R1bGUuaCIKLSNlbmRpZgotCi0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfd2luZG93c2RldmljZS5oIgorLy8gVGhlc2UgY2hlY2tzIGFyZSBoZXJlIGJlY2F1c2UgY29yZS8gYW5kIHB1YmxpYy8gY2Fubm90IGRlcGVuZCBvbiBlYWNoIG90aGVyLgorc3RhdGljX2Fzc2VydChXaW5kb3dzUHJpbnRNb2RlOjprTW9kZUVtZiA9PSBGUERGX1BSSU5UTU9ERV9FTUYsCisgICAgICAgICAgICAgICJXaW5kb3dzUHJpbnRNb2RlOjprTW9kZUVtZiB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChXaW5kb3dzUHJpbnRNb2RlOjprTW9kZVRleHRPbmx5ID09IEZQREZfUFJJTlRNT0RFX1RFWFRPTkxZLAorICAgICAgICAgICAgICAiV2luZG93c1ByaW50TW9kZTo6a01vZGVUZXh0T25seSB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChXaW5kb3dzUHJpbnRNb2RlOjprTW9kZVBvc3RTY3JpcHQyID09IEZQREZfUFJJTlRNT0RFX1BPU1RTQ1JJUFQyLAorICAgICAgICAgICAgICAiV2luZG93c1ByaW50TW9kZTo6a01vZGVQb3N0U2NyaXB0MiB2YWx1ZSBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChXaW5kb3dzUHJpbnRNb2RlOjprTW9kZVBvc3RTY3JpcHQzID09IEZQREZfUFJJTlRNT0RFX1BPU1RTQ1JJUFQzLAorICAgICAgICAgICAgICAiV2luZG93c1ByaW50TW9kZTo6a01vZGVQb3N0U2NyaXB0MyB2YWx1ZSBtaXNtYXRjaCIpOwogI2VuZGlmCiAKIG5hbWVzcGFjZSB7CiAKLS8vIEFsc28gaW5kaWNhdGVzIHdoZXRoZXIgbGlicmFyeSBpcyBjdXJyZW50bHkgaW5pdGlhbGl6ZWQuCi1DQ29kZWNfTW9kdWxlTWdyKiBnX3BDb2RlY01vZHVsZSA9IG51bGxwdHI7Citib29sIGdfYkxpYnJhcnlJbml0aWFsaXplZCA9IGZhbHNlOwogCiB2b2lkIFJlbmRlclBhZ2VJbXBsKENQREZfUGFnZVJlbmRlckNvbnRleHQqIHBDb250ZXh0LAogICAgICAgICAgICAgICAgICAgICBDUERGX1BhZ2UqIHBQYWdlLApAQCAtNzksNDIgKzgwLDM5IEBACiAgIGlmICghcENvbnRleHQtPm1fcE9wdGlvbnMpCiAgICAgcENvbnRleHQtPm1fcE9wdGlvbnMgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9SZW5kZXJPcHRpb25zPigpOwogCisgIHVpbnQzMl90IG9wdGlvbl9mbGFncyA9IHBDb250ZXh0LT5tX3BPcHRpb25zLT5HZXRGbGFncygpOwogICBpZiAoZmxhZ3MgJiBGUERGX0xDRF9URVhUKQotICAgIHBDb250ZXh0LT5tX3BPcHRpb25zLT5tX0ZsYWdzIHw9IFJFTkRFUl9DTEVBUlRZUEU7CisgICAgb3B0aW9uX2ZsYWdzIHw9IFJFTkRFUl9DTEVBUlRZUEU7CiAgIGVsc2UKLSAgICBwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9GbGFncyAmPSB+UkVOREVSX0NMRUFSVFlQRTsKKyAgICBvcHRpb25fZmxhZ3MgJj0gflJFTkRFUl9DTEVBUlRZUEU7CiAKICAgaWYgKGZsYWdzICYgRlBERl9OT19OQVRJVkVURVhUKQotICAgIHBDb250ZXh0LT5tX3BPcHRpb25zLT5tX0ZsYWdzIHw9IFJFTkRFUl9OT19OQVRJVkVURVhUOworICAgIG9wdGlvbl9mbGFncyB8PSBSRU5ERVJfTk9fTkFUSVZFVEVYVDsKICAgaWYgKGZsYWdzICYgRlBERl9SRU5ERVJfTElNSVRFRElNQUdFQ0FDSEUpCi0gICAgcENvbnRleHQtPm1fcE9wdGlvbnMtPm1fRmxhZ3MgfD0gUkVOREVSX0xJTUlURURJTUFHRUNBQ0hFOworICAgIG9wdGlvbl9mbGFncyB8PSBSRU5ERVJfTElNSVRFRElNQUdFQ0FDSEU7CiAgIGlmIChmbGFncyAmIEZQREZfUkVOREVSX0ZPUkNFSEFMRlRPTkUpCi0gICAgcENvbnRleHQtPm1fcE9wdGlvbnMtPm1fRmxhZ3MgfD0gUkVOREVSX0ZPUkNFX0hBTEZUT05FOworICAgIG9wdGlvbl9mbGFncyB8PSBSRU5ERVJfRk9SQ0VfSEFMRlRPTkU7CiAjaWZuZGVmIFBERl9FTkFCTEVfWEZBCiAgIGlmIChmbGFncyAmIEZQREZfUkVOREVSX05PX1NNT09USFRFWFQpCi0gICAgcENvbnRleHQtPm1fcE9wdGlvbnMtPm1fRmxhZ3MgfD0gUkVOREVSX05PVEVYVFNNT09USDsKKyAgICBvcHRpb25fZmxhZ3MgfD0gUkVOREVSX05PVEVYVFNNT09USDsKICAgaWYgKGZsYWdzICYgRlBERl9SRU5ERVJfTk9fU01PT1RISU1BR0UpCi0gICAgcENvbnRleHQtPm1fcE9wdGlvbnMtPm1fRmxhZ3MgfD0gUkVOREVSX05PSU1BR0VTTU9PVEg7CisgICAgb3B0aW9uX2ZsYWdzIHw9IFJFTkRFUl9OT0lNQUdFU01PT1RIOwogICBpZiAoZmxhZ3MgJiBGUERGX1JFTkRFUl9OT19TTU9PVEhQQVRIKQotICAgIHBDb250ZXh0LT5tX3BPcHRpb25zLT5tX0ZsYWdzIHw9IFJFTkRFUl9OT1BBVEhTTU9PVEg7CisgICAgb3B0aW9uX2ZsYWdzIHw9IFJFTkRFUl9OT1BBVEhTTU9PVEg7CiAjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisgIHBDb250ZXh0LT5tX3BPcHRpb25zLT5TZXRGbGFncyhvcHRpb25fZmxhZ3MpOwogCiAgIC8vIEdyYXlzY2FsZSBvdXRwdXQKLSAgaWYgKGZsYWdzICYgRlBERl9HUkFZU0NBTEUpIHsKLSAgICBwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9Db2xvck1vZGUgPSBSRU5ERVJfQ09MT1JfR1JBWTsKLSAgICBwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9Gb3JlQ29sb3IgPSAwOwotICAgIHBDb250ZXh0LT5tX3BPcHRpb25zLT5tX0JhY2tDb2xvciA9IDB4ZmZmZmZmOwotICB9CisgIGlmIChmbGFncyAmIEZQREZfR1JBWVNDQUxFKQorICAgIHBDb250ZXh0LT5tX3BPcHRpb25zLT5TZXRDb2xvck1vZGUoQ1BERl9SZW5kZXJPcHRpb25zOjprR3JheSk7CiAKICAgY29uc3QgQ1BERl9PQ0NvbnRleHQ6OlVzYWdlVHlwZSB1c2FnZSA9CiAgICAgICAoZmxhZ3MgJiBGUERGX1BSSU5USU5HKSA/IENQREZfT0NDb250ZXh0OjpQcmludCA6IENQREZfT0NDb250ZXh0OjpWaWV3OwotICBwQ29udGV4dC0+bV9wT3B0aW9ucy0+bV9BZGRGbGFncyA9IGZsYWdzID4+IDg7Ci0gIHBDb250ZXh0LT5tX3BPcHRpb25zLT5tX3BPQ0NvbnRleHQgPQotICAgICAgcGRmaXVtOjpNYWtlUmV0YWluPENQREZfT0NDb250ZXh0PihwUGFnZS0+bV9wRG9jdW1lbnQsIHVzYWdlKTsKKyAgcENvbnRleHQtPm1fcE9wdGlvbnMtPlNldE9DQ29udGV4dCgKKyAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDUERGX09DQ29udGV4dD4ocFBhZ2UtPm1fcERvY3VtZW50LkdldCgpLCB1c2FnZSkpOwogCiAgIHBDb250ZXh0LT5tX3BEZXZpY2UtPlNhdmVTdGF0ZSgpOwogICBwQ29udGV4dC0+bV9wRGV2aWNlLT5TZXRDbGlwX1JlY3QoY2xpcHBpbmdfcmVjdCk7Ci0KICAgcENvbnRleHQtPm1fcENvbnRleHQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9SZW5kZXJDb250ZXh0PihwUGFnZSk7CiAgIHBDb250ZXh0LT5tX3BDb250ZXh0LT5BcHBlbmRMYXllcihwUGFnZSwgJm1hdHJpeCk7CiAKQEAgLTEzNSw5ICsxMzMsOCBAQAogCiBjbGFzcyBDUERGX0N1c3RvbUFjY2VzcyBmaW5hbCA6IHB1YmxpYyBJRlhfU2Vla2FibGVSZWFkU3RyZWFtIHsKICBwdWJsaWM6Ci0gIHN0YXRpYyBDRlhfUmV0YWluUHRyPENQREZfQ3VzdG9tQWNjZXNzPiBDcmVhdGUoRlBERl9GSUxFQUNDRVNTKiBwRmlsZUFjY2VzcykgewotICAgIHJldHVybiBDRlhfUmV0YWluUHRyPENQREZfQ3VzdG9tQWNjZXNzPihuZXcgQ1BERl9DdXN0b21BY2Nlc3MocEZpbGVBY2Nlc3MpKTsKLSAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KKyAgZnJpZW5kIFJldGFpblB0cjxUPiBwZGZpdW06Ok1ha2VSZXRhaW4oQXJncyYmLi4uIGFyZ3MpOwogCiAgIC8vIElGWF9TZWVrYWJsZVJlYWRTdHJlYW0KICAgRlhfRklMRVNJWkUgR2V0U2l6ZSgpIG92ZXJyaWRlOwpAQCAtMTY5LDE2ICsxNjYsMTYgQEAKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KICAgcmV0dXJuICEhbV9GaWxlQWNjZXNzLm1fR2V0QmxvY2sobV9GaWxlQWNjZXNzLm1fUGFyYW0sIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3QqPihidWZmZXIpLCBzaXplKTsKIH0KIAogI2lmZGVmIFBERl9FTkFCTEVfWEZBCi1jbGFzcyBDRlBERl9GaWxlU3RyZWFtIDogcHVibGljIElGWF9TZWVrYWJsZVN0cmVhbSB7CitjbGFzcyBGUERGX0ZpbGVIYW5kbGVyQ29udGV4dCA6IHB1YmxpYyBJRlhfU2Vla2FibGVTdHJlYW0gewogIHB1YmxpYzoKLSAgc3RhdGljIENGWF9SZXRhaW5QdHI8Q0ZQREZfRmlsZVN0cmVhbT4gQ3JlYXRlKEZQREZfRklMRUhBTkRMRVIqIHBGUykgewotICAgIHJldHVybiBDRlhfUmV0YWluUHRyPENGUERGX0ZpbGVTdHJlYW0+KG5ldyBDRlBERl9GaWxlU3RyZWFtKHBGUykpOwotICB9Ci0gIH5DRlBERl9GaWxlU3RyZWFtKCkgb3ZlcnJpZGU7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgorICBmcmllbmQgUmV0YWluUHRyPFQ+IHBkZml1bTo6TWFrZVJldGFpbihBcmdzJiYuLi4gYXJncyk7CisKKyAgfkZQREZfRmlsZUhhbmRsZXJDb250ZXh0KCkgb3ZlcnJpZGU7CiAKICAgLy8gSUZYX1NlZWthYmxlU3RyZWFtOgogICBGWF9GSUxFU0laRSBHZXRTaXplKCkgb3ZlcnJpZGU7CkBAIC0xOTIsMzkgKzE4OSwzOSBAQAogICB2b2lkIFNldFBvc2l0aW9uKEZYX0ZJTEVTSVpFIHBvcykgeyBtX25DdXJQb3MgPSBwb3M7IH0KIAogIHByb3RlY3RlZDoKLSAgZXhwbGljaXQgQ0ZQREZfRmlsZVN0cmVhbShGUERGX0ZJTEVIQU5ETEVSKiBwRlMpOworICBleHBsaWNpdCBGUERGX0ZpbGVIYW5kbGVyQ29udGV4dChGUERGX0ZJTEVIQU5ETEVSKiBwRlMpOwogCiAgIEZQREZfRklMRUhBTkRMRVIqIG1fcEZTOwogICBGWF9GSUxFU0laRSBtX25DdXJQb3M7CiB9OwogCi1DRlBERl9GaWxlU3RyZWFtOjpDRlBERl9GaWxlU3RyZWFtKEZQREZfRklMRUhBTkRMRVIqIHBGUykgeworRlBERl9GaWxlSGFuZGxlckNvbnRleHQ6OkZQREZfRmlsZUhhbmRsZXJDb250ZXh0KEZQREZfRklMRUhBTkRMRVIqIHBGUykgewogICBtX3BGUyA9IHBGUzsKICAgbV9uQ3VyUG9zID0gMDsKIH0KIAotQ0ZQREZfRmlsZVN0cmVhbTo6fkNGUERGX0ZpbGVTdHJlYW0oKSB7CitGUERGX0ZpbGVIYW5kbGVyQ29udGV4dDo6fkZQREZfRmlsZUhhbmRsZXJDb250ZXh0KCkgewogICBpZiAobV9wRlMgJiYgbV9wRlMtPlJlbGVhc2UpCiAgICAgbV9wRlMtPlJlbGVhc2UobV9wRlMtPmNsaWVudERhdGEpOwogfQogCi1GWF9GSUxFU0laRSBDRlBERl9GaWxlU3RyZWFtOjpHZXRTaXplKCkgeworRlhfRklMRVNJWkUgRlBERl9GaWxlSGFuZGxlckNvbnRleHQ6OkdldFNpemUoKSB7CiAgIGlmIChtX3BGUyAmJiBtX3BGUy0+R2V0U2l6ZSkKICAgICByZXR1cm4gKEZYX0ZJTEVTSVpFKW1fcEZTLT5HZXRTaXplKG1fcEZTLT5jbGllbnREYXRhKTsKICAgcmV0dXJuIDA7CiB9CiAKLWJvb2wgQ0ZQREZfRmlsZVN0cmVhbTo6SXNFT0YoKSB7Citib29sIEZQREZfRmlsZUhhbmRsZXJDb250ZXh0OjpJc0VPRigpIHsKICAgcmV0dXJuIG1fbkN1clBvcyA+PSBHZXRTaXplKCk7CiB9CiAKLUZYX0ZJTEVTSVpFIENGUERGX0ZpbGVTdHJlYW06OkdldFBvc2l0aW9uKCkgeworRlhfRklMRVNJWkUgRlBERl9GaWxlSGFuZGxlckNvbnRleHQ6OkdldFBvc2l0aW9uKCkgewogICByZXR1cm4gbV9uQ3VyUG9zOwogfQogCi1ib29sIENGUERGX0ZpbGVTdHJlYW06OlJlYWRCbG9jayh2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgeworYm9vbCBGUERGX0ZpbGVIYW5kbGVyQ29udGV4dDo6UmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsKICAgaWYgKCFidWZmZXIgfHwgIXNpemUgfHwgIW1fcEZTLT5SZWFkQmxvY2spCiAgICAgcmV0dXJuIGZhbHNlOwogCkBAIC0yMzYsNyArMjMzLDcgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCi1zaXplX3QgQ0ZQREZfRmlsZVN0cmVhbTo6UmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKK3NpemVfdCBGUERGX0ZpbGVIYW5kbGVyQ29udGV4dDo6UmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKICAgaWYgKCFidWZmZXIgfHwgIXNpemUgfHwgIW1fcEZTLT5SZWFkQmxvY2spCiAgICAgcmV0dXJuIDA7CiAKQEAgLTI0NSw3ICsyNDIsNyBAQAogICAgIHJldHVybiAwOwogICBGWF9GSUxFU0laRSBkd0F2YWlsID0gblNpemUgLSBtX25DdXJQb3M7CiAgIGlmIChkd0F2YWlsIDwgKEZYX0ZJTEVTSVpFKXNpemUpCi0gICAgc2l6ZSA9IChzaXplX3QpZHdBdmFpbDsKKyAgICBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90Pihkd0F2YWlsKTsKICAgaWYgKG1fcEZTLT5SZWFkQmxvY2sobV9wRlMtPmNsaWVudERhdGEsIChGUERGX0RXT1JEKW1fbkN1clBvcywgYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAoRlBERl9EV09SRClzaXplKSA9PSAwKSB7CiAgICAgbV9uQ3VyUG9zICs9IHNpemU7CkBAIC0yNTUsOSArMjUyLDkgQEAKICAgcmV0dXJuIDA7CiB9CiAKLWJvb2wgQ0ZQREZfRmlsZVN0cmVhbTo6V3JpdGVCbG9jayhjb25zdCB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7Citib29sIEZQREZfRmlsZUhhbmRsZXJDb250ZXh0OjpXcml0ZUJsb2NrKGNvbnN0IHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRklMRVNJWkUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgewogICBpZiAoIW1fcEZTIHx8ICFtX3BGUy0+V3JpdGVCbG9jaykKICAgICByZXR1cm4gZmFsc2U7CiAKQEAgLTI2OSw3ICsyNjYsNyBAQAogICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgQ0ZQREZfRmlsZVN0cmVhbTo6Rmx1c2goKSB7Citib29sIEZQREZfRmlsZUhhbmRsZXJDb250ZXh0OjpGbHVzaCgpIHsKICAgaWYgKCFtX3BGUyB8fCAhbV9wRlMtPkZsdXNoKQogICAgIHJldHVybiB0cnVlOwogCkBAIC0yNzcsNiArMjc0LDI4IEBACiB9CiAjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKK0ZQREZfRE9DVU1FTlQgTG9hZERvY3VtZW50SW1wbCgKKyAgICBjb25zdCBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBGaWxlQWNjZXNzLAorICAgIEZQREZfQllURVNUUklORyBwYXNzd29yZCkgeworICBpZiAoIXBGaWxlQWNjZXNzKSB7CisgICAgUHJvY2Vzc1BhcnNlRXJyb3IoQ1BERl9QYXJzZXI6OkZJTEVfRVJST1IpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgYXV0byBwUGFyc2VyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfUGFyc2VyPigpOworICBwUGFyc2VyLT5TZXRQYXNzd29yZChwYXNzd29yZCk7CisKKyAgYXV0byBwRG9jdW1lbnQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9Eb2N1bWVudD4oc3RkOjptb3ZlKHBQYXJzZXIpKTsKKyAgQ1BERl9QYXJzZXI6OkVycm9yIGVycm9yID0KKyAgICAgIHBEb2N1bWVudC0+R2V0UGFyc2VyKCktPlN0YXJ0UGFyc2UocEZpbGVBY2Nlc3MsIHBEb2N1bWVudC5nZXQoKSk7CisgIGlmIChlcnJvciAhPSBDUERGX1BhcnNlcjo6U1VDQ0VTUykgeworICAgIFByb2Nlc3NQYXJzZUVycm9yKGVycm9yKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBDaGVja1VuU3VwcG9ydEVycm9yKHBEb2N1bWVudC5nZXQoKSwgZXJyb3IpOworICByZXR1cm4gRlBERkRvY3VtZW50RnJvbUNQREZEb2N1bWVudChwRG9jdW1lbnQucmVsZWFzZSgpKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlCiAKIFVuZGVybHlpbmdEb2N1bWVudFR5cGUqIFVuZGVybHlpbmdGcm9tRlBERkRvY3VtZW50KEZQREZfRE9DVU1FTlQgZG9jKSB7CkBAIC0zMTcsMTkgKzMzNiwxMDEgQEAKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIH0KIAorQ1BERl9QYXRoT2JqZWN0KiBDUERGUGF0aE9iamVjdEZyb21GUERGUGFnZU9iamVjdChGUERGX1BBR0VPQkpFQ1QgcGFnZV9vYmplY3QpIHsKKyAgYXV0byogb2JqID0gQ1BERlBhZ2VPYmplY3RGcm9tRlBERlBhZ2VPYmplY3QocGFnZV9vYmplY3QpOworICByZXR1cm4gb2JqID8gb2JqLT5Bc1BhdGgoKSA6IG51bGxwdHI7Cit9CisKK0NQREZfUGFnZU9iamVjdCogQ1BERlBhZ2VPYmplY3RGcm9tRlBERlBhZ2VPYmplY3QoRlBERl9QQUdFT0JKRUNUIHBhZ2Vfb2JqZWN0KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxDUERGX1BhZ2VPYmplY3QqPihwYWdlX29iamVjdCk7Cit9CisKK0NQREZfT2JqZWN0KiBDUERGT2JqZWN0RnJvbUZQREZBdHRhY2htZW50KEZQREZfQVRUQUNITUVOVCBhdHRhY2htZW50KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxDUERGX09iamVjdCo+KGF0dGFjaG1lbnQpOworfQorCitCeXRlU3RyaW5nIENGWEJ5dGVTdHJpbmdGcm9tRlBERldpZGVTdHJpbmcoRlBERl9XSURFU1RSSU5HIHdpZGVfc3RyaW5nKSB7CisgIHJldHVybiBXaWRlU3RyaW5nOjpGcm9tVVRGMTZMRSh3aWRlX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmc6OldTdHJpbmdMZW5ndGgod2lkZV9zdHJpbmcpKQorICAgICAgLlVURjhFbmNvZGUoKTsKK30KKwogQ0ZYX0RJQml0bWFwKiBDRlhCaXRtYXBGcm9tRlBERkJpdG1hcChGUERGX0JJVE1BUCBiaXRtYXApIHsKICAgcmV0dXJuIHN0YXRpY19jYXN0PENGWF9ESUJpdG1hcCo+KGJpdG1hcCk7CiB9CiAKLUNGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gTWFrZVNlZWthYmxlUmVhZFN0cmVhbSgKK0NGWF9GbG9hdFJlY3QgQ0ZYRmxvYXRSZWN0RnJvbUZTUkVDVEYoY29uc3QgRlNfUkVDVEYmIHJlY3QpIHsKKyAgcmV0dXJuIENGWF9GbG9hdFJlY3QocmVjdC5sZWZ0LCByZWN0LmJvdHRvbSwgcmVjdC5yaWdodCwgcmVjdC50b3ApOworfQorCit2b2lkIEZTUkVDVEZGcm9tQ0ZYRmxvYXRSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsIEZTX1JFQ1RGKiBvdXRfcmVjdCkgeworICBvdXRfcmVjdC0+bGVmdCA9IHJlY3QubGVmdDsKKyAgb3V0X3JlY3QtPnRvcCA9IHJlY3QudG9wOworICBvdXRfcmVjdC0+cmlnaHQgPSByZWN0LnJpZ2h0OworICBvdXRfcmVjdC0+Ym90dG9tID0gcmVjdC5ib3R0b207Cit9CisKK2NvbnN0IEZYX1BBVEhQT0lOVCogRlhQYXRoUG9pbnRGcm9tRlBERlBhdGhTZWdtZW50KEZQREZfUEFUSFNFR01FTlQgc2VnbWVudCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgRlhfUEFUSFBPSU5UKj4oc2VnbWVudCk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgVXRmMTZFbmNvZGVNYXliZUNvcHlBbmRSZXR1cm5MZW5ndGgoY29uc3QgV2lkZVN0cmluZyYgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1ZmxlbikgeworICBCeXRlU3RyaW5nIGVuY29kZWRfdGV4dCA9IHRleHQuVVRGMTZMRV9FbmNvZGUoKTsKKyAgdW5zaWduZWQgbG9uZyBsZW4gPSBlbmNvZGVkX3RleHQuR2V0TGVuZ3RoKCk7CisgIGlmIChidWZmZXIgJiYgbGVuIDw9IGJ1ZmxlbikKKyAgICBtZW1jcHkoYnVmZmVyLCBlbmNvZGVkX3RleHQuY19zdHIoKSwgbGVuKTsKKyAgcmV0dXJuIGxlbjsKK30KKwordW5zaWduZWQgbG9uZyBEZWNvZGVTdHJlYW1NYXliZUNvcHlBbmRSZXR1cm5MZW5ndGgoY29uc3QgQ1BERl9TdHJlYW0qIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmbGVuKSB7CisgIEFTU0VSVChzdHJlYW0pOworICB1aW50OF90KiBkYXRhID0gc3RyZWFtLT5HZXRSYXdEYXRhKCk7CisgIHVpbnQzMl90IGxlbiA9IHN0cmVhbS0+R2V0UmF3U2l6ZSgpOworICBDUERGX0RpY3Rpb25hcnkqIGRpY3QgPSBzdHJlYW0tPkdldERpY3QoKTsKKyAgQ1BERl9PYmplY3QqIGRlY29kZXIgPSBkaWN0ID8gZGljdC0+R2V0RGlyZWN0T2JqZWN0Rm9yKCJGaWx0ZXIiKSA6IG51bGxwdHI7CisgIGlmIChkZWNvZGVyICYmIChkZWNvZGVyLT5Jc0FycmF5KCkgfHwgZGVjb2Rlci0+SXNOYW1lKCkpKSB7CisgICAgLy8gRGVjb2RlIHRoZSBzdHJlYW0gaWYgb25lIG9yIG1vcmUgc3RyZWFtIGZpbHRlcnMgYXJlIHNwZWNpZmllZC4KKyAgICB1aW50OF90KiBkZWNvZGVkX2RhdGEgPSBudWxscHRyOworICAgIHVpbnQzMl90IGRlY29kZWRfbGVuID0gMDsKKyAgICBCeXRlU3RyaW5nIGR1bW15X2xhc3RfZGVjb2RlcjsKKyAgICBDUERGX0RpY3Rpb25hcnkqIGR1bW15X2xhc3RfcGFyYW07CisgICAgaWYgKFBERl9EYXRhRGVjb2RlKGRhdGEsIGxlbiwgZGljdCwgZGljdC0+R2V0SW50ZWdlckZvcigiREwiKSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICZkZWNvZGVkX2RhdGEsICZkZWNvZGVkX2xlbiwgJmR1bW15X2xhc3RfZGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgJmR1bW15X2xhc3RfcGFyYW0pKSB7CisgICAgICBpZiAoYnVmZmVyICYmIGJ1ZmxlbiA+PSBkZWNvZGVkX2xlbikKKyAgICAgICAgbWVtY3B5KGJ1ZmZlciwgZGVjb2RlZF9kYXRhLCBkZWNvZGVkX2xlbik7CisKKyAgICAgIC8vIEZyZWUgdGhlIGJ1ZmZlciBmb3IgdGhlIGRlY29kZWQgZGF0YSBpZiBpdCB3YXMgYWxsb2NhdGVkIGJ5CisgICAgICAvLyBQREZfRGF0YURlY29kZSgpLiBOb3RlIHRoYXQgZm9yIGltYWdlcyB3aXRoIGEgc2luZ2xlIGltYWdlLXNwZWNpZmljCisgICAgICAvLyBmaWx0ZXIsIHxkZWNvZGVkX2RhdGF8IGlzIGRpcmVjdGx5IGFzc2lnbmVkIHRvIGJlIHxkYXRhfCwgc28KKyAgICAgIC8vIHxkZWNvZGVkX2RhdGF8IGRvZXMgbm90IG5lZWQgdG8gYmUgZnJlZWQuCisgICAgICBpZiAoZGVjb2RlZF9kYXRhICE9IGRhdGEpCisgICAgICAgIEZYX0ZyZWUoZGVjb2RlZF9kYXRhKTsKKworICAgICAgcmV0dXJuIGRlY29kZWRfbGVuOworICAgIH0KKyAgfQorICAvLyBDb3B5IHRoZSByYXcgZGF0YSBhbmQgcmV0dXJuIGl0cyBsZW5ndGggaWYgdGhlcmUgaXMgbm8gdmFsaWQgZmlsdGVyCisgIC8vIHNwZWNpZmllZCBvciBpZiBkZWNvZGluZyBmYWlsZWQuCisgIGlmIChidWZmZXIgJiYgYnVmbGVuID49IGxlbikKKyAgICBtZW1jcHkoYnVmZmVyLCBkYXRhLCBsZW4pOworCisgIHJldHVybiBsZW47Cit9CisKK1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBNYWtlU2Vla2FibGVSZWFkU3RyZWFtKAogICAgIEZQREZfRklMRUFDQ0VTUyogcEZpbGVBY2Nlc3MpIHsKLSAgcmV0dXJuIENQREZfQ3VzdG9tQWNjZXNzOjpDcmVhdGUocEZpbGVBY2Nlc3MpOworICByZXR1cm4gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfQ3VzdG9tQWNjZXNzPihwRmlsZUFjY2Vzcyk7CiB9CiAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQotQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVTdHJlYW0+IE1ha2VTZWVrYWJsZVN0cmVhbSgKK1JldGFpblB0cjxJRlhfU2Vla2FibGVTdHJlYW0+IE1ha2VTZWVrYWJsZVN0cmVhbSgKICAgICBGUERGX0ZJTEVIQU5ETEVSKiBwRmlsZWhhbmRsZXIpIHsKLSAgcmV0dXJuIENGUERGX0ZpbGVTdHJlYW06OkNyZWF0ZShwRmlsZWhhbmRsZXIpOworICByZXR1cm4gcGRmaXVtOjpNYWtlUmV0YWluPEZQREZfRmlsZUhhbmRsZXJDb250ZXh0PihwRmlsZWhhbmRsZXIpOwogfQogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCkBAIC0zNTgsNzIgKzQ1OSw0NiBAQAogICB9CiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9Jbml0TGlicmFyeSgpIHsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGX0luaXRMaWJyYXJ5KCkgewogICBGUERGX0luaXRMaWJyYXJ5V2l0aENvbmZpZyhudWxscHRyKTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTAorRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WCiBGUERGX0luaXRMaWJyYXJ5V2l0aENvbmZpZyhjb25zdCBGUERGX0xJQlJBUllfQ09ORklHKiBjZmcpIHsKLSAgaWYgKGdfcENvZGVjTW9kdWxlKQorICBpZiAoZ19iTGlicmFyeUluaXRpYWxpemVkKQogICAgIHJldHVybjsKIAotICBnX3BDb2RlY01vZHVsZSA9IG5ldyBDQ29kZWNfTW9kdWxlTWdyKCk7CisgIEZYTUVNX0luaXRpYWxpemVQYXJ0aXRpb25BbGxvYygpOwogCiAgIENGWF9HRU1vZHVsZSogcE1vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCk7Ci0gIHBNb2R1bGUtPkluaXQoY2ZnID8gY2ZnLT5tX3BVc2VyRm9udFBhdGhzIDogbnVsbHB0ciwgZ19wQ29kZWNNb2R1bGUpOworICBwTW9kdWxlLT5Jbml0KGNmZyA/IGNmZy0+bV9wVXNlckZvbnRQYXRocyA6IG51bGxwdHIpOwogCiAgIENQREZfTW9kdWxlTWdyKiBwTW9kdWxlTWdyID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpOwotICBwTW9kdWxlTWdyLT5TZXRDb2RlY01vZHVsZShnX3BDb2RlY01vZHVsZSk7Ci0gIHBNb2R1bGVNZ3ItPkluaXRQYWdlTW9kdWxlKCk7Ci0gIHBNb2R1bGVNZ3ItPkxvYWRFbWJlZGRlZEdCMUNNYXBzKCk7Ci0gIHBNb2R1bGVNZ3ItPkxvYWRFbWJlZGRlZEphcGFuMUNNYXBzKCk7Ci0gIHBNb2R1bGVNZ3ItPkxvYWRFbWJlZGRlZENOUzFDTWFwcygpOwotICBwTW9kdWxlTWdyLT5Mb2FkRW1iZWRkZWRLb3JlYTFDTWFwcygpOwotCi0jaWZkZWYgUERGX0VOQUJMRV9YRkFfQk1QCi0gIHBNb2R1bGVNZ3ItPkdldENvZGVjTW9kdWxlKCktPlNldEJtcE1vZHVsZSgKLSAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDQ29kZWNfQm1wTW9kdWxlPigpKTsKLSNlbmRpZgotCi0jaWZkZWYgUERGX0VOQUJMRV9YRkFfR0lGCi0gIHBNb2R1bGVNZ3ItPkdldENvZGVjTW9kdWxlKCktPlNldEdpZk1vZHVsZSgKLSAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDQ29kZWNfR2lmTW9kdWxlPigpKTsKLSNlbmRpZgotCi0jaWZkZWYgUERGX0VOQUJMRV9YRkFfUE5HCi0gIHBNb2R1bGVNZ3ItPkdldENvZGVjTW9kdWxlKCktPlNldFBuZ01vZHVsZSgKLSAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDQ29kZWNfUG5nTW9kdWxlPigpKTsKLSNlbmRpZgotCi0jaWZkZWYgUERGX0VOQUJMRV9YRkFfVElGRgotICBwTW9kdWxlTWdyLT5HZXRDb2RlY01vZHVsZSgpLT5TZXRUaWZmTW9kdWxlKAotICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENDb2RlY19UaWZmTW9kdWxlPigpKTsKLSNlbmRpZgorICBwTW9kdWxlTWdyLT5Jbml0KCk7CiAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQotICBGWEpTRV9Jbml0aWFsaXplKCk7CiAgIEJDX0xpYnJhcnlfSW5pdCgpOwogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogICBpZiAoY2ZnICYmIGNmZy0+dmVyc2lvbiA+PSAyKQogICAgIElKU19SdW50aW1lOjpJbml0aWFsaXplKGNmZy0+bV92OEVtYmVkZGVyU2xvdCwgY2ZnLT5tX3BJc29sYXRlKTsKKworICBnX2JMaWJyYXJ5SW5pdGlhbGl6ZWQgPSB0cnVlOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfRGVzdHJveUxpYnJhcnkoKSB7Ci0gIGlmICghZ19wQ29kZWNNb2R1bGUpCitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRlBERl9EZXN0cm95TGlicmFyeSgpIHsKKyAgaWYgKCFnX2JMaWJyYXJ5SW5pdGlhbGl6ZWQpCiAgICAgcmV0dXJuOwogCiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKLSAgQkNfTGlicmFyeV9EZXN0b3J5KCk7Ci0gIEZYSlNFX0ZpbmFsaXplKCk7CisgIEJDX0xpYnJhcnlfRGVzdHJveSgpOwogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCiAgIENQREZfTW9kdWxlTWdyOjpEZXN0cm95KCk7CiAgIENGWF9HRU1vZHVsZTo6RGVzdHJveSgpOwogCi0gIGRlbGV0ZSBnX3BDb2RlY01vZHVsZTsKLSAgZ19wQ29kZWNNb2R1bGUgPSBudWxscHRyOwotCiAgIElKU19SdW50aW1lOjpEZXN0cm95KCk7CisKKyAgZ19iTGlicmFyeUluaXRpYWxpemVkID0gZmFsc2U7CiB9CiAKICNpZm5kZWYgX1dJTjMyCkBAIC00NjAsOTAgKzUzNSw3OCBAQAogICBTZXRMYXN0RXJyb3IoZXJyX2NvZGUpOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfU2V0U2FuZEJveFBvbGljeShGUERGX0RXT1JEIHBvbGljeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBlbmFibGUpIHsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGX1NldFNhbmRCb3hQb2xpY3koRlBERl9EV09SRCBwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBlbmFibGUpIHsKICAgcmV0dXJuIEZTREtfU2V0U2FuZEJveFBvbGljeShwb2xpY3ksIGVuYWJsZSk7CiB9CiAKICNpZiBkZWZpbmVkKF9XSU4zMikKICNpZiBkZWZpbmVkKFBERklVTV9QUklOVF9URVhUX1dJVEhfR0RJKQotRExMRVhQT1JUIHZvaWQgU1REQ0FMTAorRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WCiBGUERGX1NldFR5cGVmYWNlQWNjZXNzaWJsZUZ1bmMoUERGaXVtRW5zdXJlVHlwZWZhY2VDaGFyYWN0ZXJzQWNjZXNzaWJsZSBmdW5jKSB7CiAgIGdfcGRmaXVtX3R5cGVmYWNlX2FjY2Vzc2libGVfZnVuYyA9IGZ1bmM7CiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9TZXRQcmludFRleHRXaXRoR0RJKEZQREZfQk9PTCB1c2VfZ2RpKSB7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRlBERl9TZXRQcmludFRleHRXaXRoR0RJKEZQREZfQk9PTCB1c2VfZ2RpKSB7CiAgIGdfcGRmaXVtX3ByaW50X3RleHRfd2l0aF9nZGkgPSAhIXVzZV9nZGk7CiB9CiAjZW5kaWYgIC8vIFBERklVTV9QUklOVF9URVhUX1dJVEhfR0RJCiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX1NldFByaW50UG9zdHNjcmlwdExldmVsKGludCBwb3N0c2NyaXB0X2xldmVsKSB7Ci0gIGlmIChwb3N0c2NyaXB0X2xldmVsICE9IDAgJiYgcG9zdHNjcmlwdF9sZXZlbCAhPSAyICYmIHBvc3RzY3JpcHRfbGV2ZWwgIT0gMykKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCitGUERGX1NldFByaW50UG9zdHNjcmlwdExldmVsKGludCBwb3N0c2NyaXB0X2xldmVsKSB7CisgIHJldHVybiBwb3N0c2NyaXB0X2xldmVsICE9IDEgJiYgRlBERl9TZXRQcmludE1vZGUocG9zdHNjcmlwdF9sZXZlbCk7Cit9CisKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZfU2V0UHJpbnRNb2RlKGludCBtb2RlKSB7CisgIGlmIChtb2RlIDwgRlBERl9QUklOVE1PREVfRU1GIHx8IG1vZGUgPiBGUERGX1BSSU5UTU9ERV9QT1NUU0NSSVBUMykKICAgICByZXR1cm4gRkFMU0U7Ci0gIGdfcGRmaXVtX3ByaW50X3Bvc3RzY3JpcHRfbGV2ZWwgPSBwb3N0c2NyaXB0X2xldmVsOworICBnX3BkZml1bV9wcmludF9tb2RlID0gbW9kZTsKICAgcmV0dXJuIFRSVUU7CiB9CiAjZW5kaWYgIC8vIGRlZmluZWQoX1dJTjMyKQogCi1ETExFWFBPUlQgRlBERl9ET0NVTUVOVCBTVERDQUxMIEZQREZfTG9hZERvY3VtZW50KEZQREZfU1RSSU5HIGZpbGVfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIHBhc3N3b3JkKSB7CitGUERGX0VYUE9SVCBGUERGX0RPQ1VNRU5UIEZQREZfQ0FMTENPTlYKK0ZQREZfTG9hZERvY3VtZW50KEZQREZfU1RSSU5HIGZpbGVfcGF0aCwgRlBERl9CWVRFU1RSSU5HIHBhc3N3b3JkKSB7CiAgIC8vIE5PVEU6IHRoZSBjcmVhdGlvbiBvZiB0aGUgZmlsZSBuZWVkcyB0byBiZSBieSB0aGUgZW1iZWRkZXIgb24gdGhlCiAgIC8vIG90aGVyIHNpZGUgb2YgdGhpcyBBUEkuCi0gIENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gcEZpbGVBY2Nlc3MgPQotICAgICAgSUZYX1NlZWthYmxlUmVhZFN0cmVhbTo6Q3JlYXRlRnJvbUZpbGVuYW1lKChjb25zdCBGWF9DSEFSKilmaWxlX3BhdGgpOwotICBpZiAoIXBGaWxlQWNjZXNzKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIGF1dG8gcFBhcnNlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1BhcnNlcj4oKTsKLSAgcFBhcnNlci0+U2V0UGFzc3dvcmQocGFzc3dvcmQpOwotCi0gIGF1dG8gcERvY3VtZW50ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRG9jdW1lbnQ+KHN0ZDo6bW92ZShwUGFyc2VyKSk7Ci0gIENQREZfUGFyc2VyOjpFcnJvciBlcnJvciA9Ci0gICAgICBwRG9jdW1lbnQtPkdldFBhcnNlcigpLT5TdGFydFBhcnNlKHBGaWxlQWNjZXNzLCBwRG9jdW1lbnQuZ2V0KCkpOwotICBpZiAoZXJyb3IgIT0gQ1BERl9QYXJzZXI6OlNVQ0NFU1MpIHsKLSAgICBQcm9jZXNzUGFyc2VFcnJvcihlcnJvcik7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgcmV0dXJuIEZQREZEb2N1bWVudEZyb21DUERGRG9jdW1lbnQocERvY3VtZW50LnJlbGVhc2UoKSk7CisgIHJldHVybiBMb2FkRG9jdW1lbnRJbXBsKElGWF9TZWVrYWJsZVJlYWRTdHJlYW06OkNyZWF0ZUZyb21GaWxlbmFtZShmaWxlX3BhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCk7CiB9CiAKLSNpZmRlZiBQREZfRU5BQkxFX1hGQQotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfSGFzWEZBRmllbGQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZG9jVHlwZSkgeworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERl9HZXRGb3JtVHlwZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CiAgIGlmICghZG9jdW1lbnQpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIENQREZfRG9jdW1lbnQqIHBkZkRvYyA9Ci0gICAgICAoc3RhdGljX2Nhc3Q8Q1BERlhGQV9Db250ZXh0Kj4oZG9jdW1lbnQpKS0+R2V0UERGRG9jKCk7Ci0gIGlmICghcGRmRG9jKQotICAgIHJldHVybiBmYWxzZTsKKyAgY29uc3QgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOworICBpZiAoIXBEb2MpCisgICAgcmV0dXJuIEZPUk1UWVBFX05PTkU7CiAKLSAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IHBkZkRvYy0+R2V0Um9vdCgpOworICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gcERvYy0+R2V0Um9vdCgpOwogICBpZiAoIXBSb290KQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRk9STVRZUEVfTk9ORTsKIAogICBDUERGX0RpY3Rpb25hcnkqIHBBY3JvRm9ybSA9IHBSb290LT5HZXREaWN0Rm9yKCJBY3JvRm9ybSIpOwogICBpZiAoIXBBY3JvRm9ybSkKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZPUk1UWVBFX05PTkU7CiAKICAgQ1BERl9PYmplY3QqIHBYRkEgPSBwQWNyb0Zvcm0tPkdldE9iamVjdEZvcigiWEZBIik7CiAgIGlmICghcFhGQSkKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEZPUk1UWVBFX0FDUk9fRk9STTsKIAotICBib29sIGJEeW5hbWljWEZBID0gcFJvb3QtPkdldEJvb2xlYW5Gb3IoIk5lZWRzUmVuZGVyaW5nIiwgZmFsc2UpOwotICAqZG9jVHlwZSA9IGJEeW5hbWljWEZBID8gRE9DVFlQRV9EWU5BTUlDX1hGQSA6IERPQ1RZUEVfU1RBVElDX1hGQTsKLSAgcmV0dXJuIHRydWU7CisgIGJvb2wgbmVlZHNSZW5kZXJpbmcgPSBwUm9vdC0+R2V0Qm9vbGVhbkZvcigiTmVlZHNSZW5kZXJpbmciLCBmYWxzZSk7CisgIHJldHVybiBuZWVkc1JlbmRlcmluZyA/IEZPUk1UWVBFX1hGQV9GVUxMIDogRk9STVRZUEVfWEZBX0ZPUkVHUk9VTkQ7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX0xvYWRYRkEoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkgewotICByZXR1cm4gZG9jdW1lbnQgJiYgKHN0YXRpY19jYXN0PENQREZYRkFfQ29udGV4dCo+KGRvY3VtZW50KSktPkxvYWRYRkFEb2MoKTsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRlBERl9Mb2FkWEZBKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpIHsKKyAgcmV0dXJuIGRvY3VtZW50ICYmIHN0YXRpY19jYXN0PENQREZYRkFfQ29udGV4dCo+KGRvY3VtZW50KS0+TG9hZFhGQURvYygpOwogfQogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCiBjbGFzcyBDTWVtRmlsZSBmaW5hbCA6IHB1YmxpYyBJRlhfU2Vla2FibGVSZWFkU3RyZWFtIHsKICBwdWJsaWM6Ci0gIHN0YXRpYyBDRlhfUmV0YWluUHRyPENNZW1GaWxlPiBDcmVhdGUodWludDhfdCogcEJ1ZiwgRlhfRklMRVNJWkUgc2l6ZSkgewotICAgIHJldHVybiBDRlhfUmV0YWluUHRyPENNZW1GaWxlPihuZXcgQ01lbUZpbGUocEJ1Ziwgc2l6ZSkpOworICBzdGF0aWMgUmV0YWluUHRyPENNZW1GaWxlPiBDcmVhdGUoY29uc3QgdWludDhfdCogcEJ1ZiwgRlhfRklMRVNJWkUgc2l6ZSkgeworICAgIHJldHVybiBSZXRhaW5QdHI8Q01lbUZpbGU+KG5ldyBDTWVtRmlsZShwQnVmLCBzaXplKSk7CiAgIH0KIAogICBGWF9GSUxFU0laRSBHZXRTaXplKCkgb3ZlcnJpZGUgeyByZXR1cm4gbV9zaXplOyB9CkBAIC01NTYsNTYgKzYxOSwzMyBAQAogICAgIGlmICghbmV3UG9zLklzVmFsaWQoKSB8fCBuZXdQb3MuVmFsdWVPckRpZSgpID4gbV9zaXplKQogICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgRlhTWVNfbWVtY3B5KGJ1ZmZlciwgbV9wQnVmICsgb2Zmc2V0LCBzaXplKTsKKyAgICBtZW1jcHkoYnVmZmVyLCBtX3BCdWYgKyBvZmZzZXQsIHNpemUpOwogICAgIHJldHVybiB0cnVlOwogICB9CiAKICBwcml2YXRlOgotICBDTWVtRmlsZSh1aW50OF90KiBwQnVmLCBGWF9GSUxFU0laRSBzaXplKSA6IG1fcEJ1ZihwQnVmKSwgbV9zaXplKHNpemUpIHt9CisgIENNZW1GaWxlKGNvbnN0IHVpbnQ4X3QqIHBCdWYsIEZYX0ZJTEVTSVpFIHNpemUpCisgICAgICA6IG1fcEJ1ZihwQnVmKSwgbV9zaXplKHNpemUpIHt9CiAKLSAgdWludDhfdCogY29uc3QgbV9wQnVmOworICBjb25zdCB1aW50OF90KiBjb25zdCBtX3BCdWY7CiAgIGNvbnN0IEZYX0ZJTEVTSVpFIG1fc2l6ZTsKIH07CiAKLURMTEVYUE9SVCBGUERGX0RPQ1VNRU5UIFNURENBTEwgRlBERl9Mb2FkTWVtRG9jdW1lbnQoY29uc3Qgdm9pZCogZGF0YV9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpIHsKLSAgQ0ZYX1JldGFpblB0cjxDTWVtRmlsZT4gcE1lbUZpbGUgPSBDTWVtRmlsZTo6Q3JlYXRlKCh1aW50OF90KilkYXRhX2J1Ziwgc2l6ZSk7Ci0gIGF1dG8gcFBhcnNlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1BhcnNlcj4oKTsKLSAgcFBhcnNlci0+U2V0UGFzc3dvcmQocGFzc3dvcmQpOwotCi0gIGF1dG8gcERvY3VtZW50ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRG9jdW1lbnQ+KHN0ZDo6bW92ZShwUGFyc2VyKSk7Ci0gIENQREZfUGFyc2VyOjpFcnJvciBlcnJvciA9Ci0gICAgICBwRG9jdW1lbnQtPkdldFBhcnNlcigpLT5TdGFydFBhcnNlKHBNZW1GaWxlLCBwRG9jdW1lbnQuZ2V0KCkpOwotICBpZiAoZXJyb3IgIT0gQ1BERl9QYXJzZXI6OlNVQ0NFU1MpIHsKLSAgICBQcm9jZXNzUGFyc2VFcnJvcihlcnJvcik7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgQ2hlY2tVblN1cHBvcnRFcnJvcihwRG9jdW1lbnQuZ2V0KCksIGVycm9yKTsKLSAgcmV0dXJuIEZQREZEb2N1bWVudEZyb21DUERGRG9jdW1lbnQocERvY3VtZW50LnJlbGVhc2UoKSk7CitGUERGX0VYUE9SVCBGUERGX0RPQ1VNRU5UIEZQREZfQ0FMTENPTlYKK0ZQREZfTG9hZE1lbURvY3VtZW50KGNvbnN0IHZvaWQqIGRhdGFfYnVmLCBpbnQgc2l6ZSwgRlBERl9CWVRFU1RSSU5HIHBhc3N3b3JkKSB7CisgIHJldHVybiBMb2FkRG9jdW1lbnRJbXBsKAorICAgICAgQ01lbUZpbGU6OkNyZWF0ZShzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4oZGF0YV9idWYpLCBzaXplKSwgcGFzc3dvcmQpOwogfQogCi1ETExFWFBPUlQgRlBERl9ET0NVTUVOVCBTVERDQUxMCitGUERGX0VYUE9SVCBGUERGX0RPQ1VNRU5UIEZQREZfQ0FMTENPTlYKIEZQREZfTG9hZEN1c3RvbURvY3VtZW50KEZQREZfRklMRUFDQ0VTUyogcEZpbGVBY2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpIHsKLSAgQ0ZYX1JldGFpblB0cjxDUERGX0N1c3RvbUFjY2Vzcz4gcEZpbGUgPQotICAgICAgQ1BERl9DdXN0b21BY2Nlc3M6OkNyZWF0ZShwRmlsZUFjY2Vzcyk7Ci0gIGF1dG8gcFBhcnNlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1BhcnNlcj4oKTsKLSAgcFBhcnNlci0+U2V0UGFzc3dvcmQocGFzc3dvcmQpOwotCi0gIGF1dG8gcERvY3VtZW50ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRG9jdW1lbnQ+KHN0ZDo6bW92ZShwUGFyc2VyKSk7Ci0gIENQREZfUGFyc2VyOjpFcnJvciBlcnJvciA9Ci0gICAgICBwRG9jdW1lbnQtPkdldFBhcnNlcigpLT5TdGFydFBhcnNlKHBGaWxlLCBwRG9jdW1lbnQuZ2V0KCkpOwotICBpZiAoZXJyb3IgIT0gQ1BERl9QYXJzZXI6OlNVQ0NFU1MpIHsKLSAgICBQcm9jZXNzUGFyc2VFcnJvcihlcnJvcik7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgQ2hlY2tVblN1cHBvcnRFcnJvcihwRG9jdW1lbnQuZ2V0KCksIGVycm9yKTsKLSAgcmV0dXJuIEZQREZEb2N1bWVudEZyb21DUERGRG9jdW1lbnQocERvY3VtZW50LnJlbGVhc2UoKSk7CisgIHJldHVybiBMb2FkRG9jdW1lbnRJbXBsKHBkZml1bTo6TWFrZVJldGFpbjxDUERGX0N1c3RvbUFjY2Vzcz4ocEZpbGVBY2Nlc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCk7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX0dldEZpbGVWZXJzaW9uKEZQREZfRE9DVU1FTlQgZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBmaWxlVmVyc2lvbikgeworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRlBERl9HZXRGaWxlVmVyc2lvbihGUERGX0RPQ1VNRU5UIGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBmaWxlVmVyc2lvbikgewogICBpZiAoIWZpbGVWZXJzaW9uKQogICAgIHJldHVybiBmYWxzZTsKIApAQCAtNjE0LDcgKzY1NCw3IEBACiAgIGlmICghcERvYykKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgQ1BERl9QYXJzZXIqIHBQYXJzZXIgPSBwRG9jLT5HZXRQYXJzZXIoKTsKKyAgY29uc3QgQ1BERl9QYXJzZXIqIHBQYXJzZXIgPSBwRG9jLT5HZXRQYXJzZXIoKTsKICAgaWYgKCFwUGFyc2VyKQogICAgIHJldHVybiBmYWxzZTsKIApAQCAtNjI0LDcgKzY2NCw4IEBACiAKIC8vIGphYmRlbG1hbGVrOiBjaGFuZ2VkIHJldHVybiB0eXBlIGZyb20gdWludDMyX3QgdG8gYnVpbGQgb24gTGludXggKGFuZCBtYXRjaAogLy8gaGVhZGVyKS4KLURMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERl9HZXREb2NQZXJtaXNzaW9ucyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CitGUERGX0VYUE9SVCB1bnNpZ25lZCBsb25nIEZQREZfQ0FMTENPTlYKK0ZQREZfR2V0RG9jUGVybWlzc2lvbnMoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkgewogICBDUERGX0RvY3VtZW50KiBwRG9jID0gQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChkb2N1bWVudCk7CiAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9wZGZpdW0vaXNzdWVzL2RldGFpbD9pZD00OTkKICAgaWYgKCFwRG9jKSB7CkBAIC02MzgsNyArNjc5LDggQEAKICAgcmV0dXJuIHBEb2MtPkdldFVzZXJQZXJtaXNzaW9ucygpOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9HZXRTZWN1cml0eUhhbmRsZXJSZXZpc2lvbihGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OVgorRlBERl9HZXRTZWN1cml0eUhhbmRsZXJSZXZpc2lvbihGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CiAgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBDUERGRG9jdW1lbnRGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKICAgaWYgKCFwRG9jIHx8ICFwRG9jLT5HZXRQYXJzZXIoKSkKICAgICByZXR1cm4gLTE7CkBAIC02NDcsMTMgKzY4OSwxMyBAQAogICByZXR1cm4gcERpY3QgPyBwRGljdC0+R2V0SW50ZWdlckZvcigiUiIpIDogLTE7CiB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGX0dldFBhZ2VDb3VudChGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OViBGUERGX0dldFBhZ2VDb3VudChGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CiAgIFVuZGVybHlpbmdEb2N1bWVudFR5cGUqIHBEb2MgPSBVbmRlcmx5aW5nRnJvbUZQREZEb2N1bWVudChkb2N1bWVudCk7CiAgIHJldHVybiBwRG9jID8gcERvYy0+R2V0UGFnZUNvdW50KCkgOiAwOwogfQogCi1ETExFWFBPUlQgRlBERl9QQUdFIFNURENBTEwgRlBERl9Mb2FkUGFnZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfaW5kZXgpIHsKK0ZQREZfRVhQT1JUIEZQREZfUEFHRSBGUERGX0NBTExDT05WIEZQREZfTG9hZFBhZ2UoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfaW5kZXgpIHsKICAgVW5kZXJseWluZ0RvY3VtZW50VHlwZSogcERvYyA9IFVuZGVybHlpbmdGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKICAgaWYgKCFwRG9jKQogICAgIHJldHVybiBudWxscHRyOwpAQCAtNjYyLDcgKzcwNCw3IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQotICByZXR1cm4gcERvYy0+R2V0WEZBUGFnZShwYWdlX2luZGV4KTsKKyAgcmV0dXJuIHBEb2MtPkdldFhGQVBhZ2UocGFnZV9pbmRleCkuTGVhaygpOwogI2Vsc2UgICAvLyBQREZfRU5BQkxFX1hGQQogICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0ID0gcERvYy0+R2V0UGFnZShwYWdlX2luZGV4KTsKICAgaWYgKCFwRGljdCkKQEAgLTY3NCw2NCArNzE2LDI1OCBAQAogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogfQogCi1ETExFWFBPUlQgZG91YmxlIFNURENBTEwgRlBERl9HZXRQYWdlV2lkdGgoRlBERl9QQUdFIHBhZ2UpIHsKK0ZQREZfRVhQT1JUIGRvdWJsZSBGUERGX0NBTExDT05WIEZQREZfR2V0UGFnZVdpZHRoKEZQREZfUEFHRSBwYWdlKSB7CiAgIFVuZGVybHlpbmdQYWdlVHlwZSogcFBhZ2UgPSBVbmRlcmx5aW5nRnJvbUZQREZQYWdlKHBhZ2UpOwogICByZXR1cm4gcFBhZ2UgPyBwUGFnZS0+R2V0UGFnZVdpZHRoKCkgOiAwLjA7CiB9CiAKLURMTEVYUE9SVCBkb3VibGUgU1REQ0FMTCBGUERGX0dldFBhZ2VIZWlnaHQoRlBERl9QQUdFIHBhZ2UpIHsKK0ZQREZfRVhQT1JUIGRvdWJsZSBGUERGX0NBTExDT05WIEZQREZfR2V0UGFnZUhlaWdodChGUERGX1BBR0UgcGFnZSkgewogICBVbmRlcmx5aW5nUGFnZVR5cGUqIHBQYWdlID0gVW5kZXJseWluZ0Zyb21GUERGUGFnZShwYWdlKTsKICAgcmV0dXJuIHBQYWdlID8gcFBhZ2UtPkdldFBhZ2VIZWlnaHQoKSA6IDAuMDsKIH0KIAorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRlBERl9HZXRQYWdlQm91bmRpbmdCb3goRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19SRUNURiogcmVjdCkgeworICBpZiAoIXJlY3QpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKKyAgaWYgKCFwUGFnZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgRlNSRUNURkZyb21DRlhGbG9hdFJlY3QocFBhZ2UtPkdldFBhZ2VCQm94KCksIHJlY3QpOworICByZXR1cm4gdHJ1ZTsKK30KKwogI2lmIGRlZmluZWQoX1dJTjMyKQotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1JlbmRlclBhZ2UoSERDIGRjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKSB7CituYW1lc3BhY2UgeworCitjb25zdCBkb3VibGUga0Vwc2lsb25TaXplID0gMC4wMWY7CisKK3ZvaWQgR2V0U2NhbGluZyhDUERGX1BhZ2UqIHBQYWdlLAorICAgICAgICAgICAgICAgIGludCBzaXplX3gsCisgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKKyAgICAgICAgICAgICAgICBpbnQgcm90YXRlLAorICAgICAgICAgICAgICAgIGRvdWJsZSogc2NhbGVfeCwKKyAgICAgICAgICAgICAgICBkb3VibGUqIHNjYWxlX3kpIHsKKyAgQVNTRVJUKHBQYWdlKTsKKyAgQVNTRVJUKHNjYWxlX3gpOworICBBU1NFUlQoc2NhbGVfeSk7CisgIGRvdWJsZSBwYWdlX3dpZHRoID0gcFBhZ2UtPkdldFBhZ2VXaWR0aCgpOworICBkb3VibGUgcGFnZV9oZWlnaHQgPSBwUGFnZS0+R2V0UGFnZUhlaWdodCgpOworICBpZiAocGFnZV93aWR0aCA8IGtFcHNpbG9uU2l6ZSB8fCBwYWdlX2hlaWdodCA8IGtFcHNpbG9uU2l6ZSkKKyAgICByZXR1cm47CisKKyAgaWYgKHJvdGF0ZSAlIDIgPT0gMCkgeworICAgICpzY2FsZV94ID0gc2l6ZV94IC8gcGFnZV93aWR0aDsKKyAgICAqc2NhbGVfeSA9IHNpemVfeSAvIHBhZ2VfaGVpZ2h0OworICB9IGVsc2UgeworICAgICpzY2FsZV94ID0gc2l6ZV95IC8gcGFnZV93aWR0aDsKKyAgICAqc2NhbGVfeSA9IHNpemVfeCAvIHBhZ2VfaGVpZ2h0OworICB9Cit9CisKK0ZYX1JFQ1QgR2V0TWFza0RpbWVuc2lvbnNBbmRPZmZzZXRzKENQREZfUGFnZSogcFBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgbWFza19ib3gpIHsKKyAgZG91YmxlIHNjYWxlX3ggPSAwLjBmOworICBkb3VibGUgc2NhbGVfeSA9IDAuMGY7CisgIEdldFNjYWxpbmcocFBhZ2UsIHNpemVfeCwgc2l6ZV95LCByb3RhdGUsICZzY2FsZV94LCAmc2NhbGVfeSk7CisgIGlmIChzY2FsZV94IDwga0Vwc2lsb25TaXplIHx8IHNjYWxlX3kgPCBrRXBzaWxvblNpemUpCisgICAgcmV0dXJuIEZYX1JFQ1QoKTsKKworICAvLyBDb21wdXRlIHNpemVzIGluIHBhZ2UgcG9pbnRzLiBSb3VuZCBkb3duIHRvIGNhdGNoIHRoZSBlbnRpcmUgYml0bWFwLgorICBpbnQgc3RhcnRfeF9ibSA9IHN0YXRpY19jYXN0PGludD4obWFza19ib3gubGVmdCAqIHNjYWxlX3gpOworICBpbnQgc3RhcnRfeV9ibSA9IHN0YXRpY19jYXN0PGludD4obWFza19ib3guYm90dG9tICogc2NhbGVfeSk7CisgIGludCBzaXplX3hfYm0gPSBzdGF0aWNfY2FzdDxpbnQ+KG1hc2tfYm94LnJpZ2h0ICogc2NhbGVfeCArIDEuMGYpIC0KKyAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4obWFza19ib3gubGVmdCAqIHNjYWxlX3gpOworICBpbnQgc2l6ZV95X2JtID0gc3RhdGljX2Nhc3Q8aW50PihtYXNrX2JveC50b3AgKiBzY2FsZV95ICsgMS4wZikgLQorICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihtYXNrX2JveC5ib3R0b20gKiBzY2FsZV95KTsKKworICAvLyBHZXQgcGFnZSByb3RhdGlvbgorICBpbnQgcGFnZV9yb3RhdGlvbiA9IHBQYWdlLT5HZXRQYWdlUm90YXRpb24oKTsKKworICAvLyBDb21wdXRlIG9mZnNldHMKKyAgaW50IG9mZnNldF94ID0gMDsKKyAgaW50IG9mZnNldF95ID0gMDsKKyAgaWYgKHNpemVfeCA+IHNpemVfeSkKKyAgICBzdGQ6OnN3YXAoc2l6ZV94X2JtLCBzaXplX3lfYm0pOworCisgIHN3aXRjaCAoKHJvdGF0ZSArIHBhZ2Vfcm90YXRpb24pICUgNCkgeworICAgIGNhc2UgMDoKKyAgICAgIG9mZnNldF94ID0gc3RhcnRfeF9ibSArIHN0YXJ0X3g7CisgICAgICBvZmZzZXRfeSA9IHN0YXJ0X3kgKyBzaXplX3kgLSBzaXplX3lfYm0gLSBzdGFydF95X2JtOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgb2Zmc2V0X3ggPSBzdGFydF95X2JtICsgc3RhcnRfeDsKKyAgICAgIG9mZnNldF95ID0gc3RhcnRfeF9ibSArIHN0YXJ0X3k7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBvZmZzZXRfeCA9IHN0YXJ0X3ggKyBzaXplX3ggLSBzaXplX3hfYm0gLSBzdGFydF94X2JtOworICAgICAgb2Zmc2V0X3kgPSBzdGFydF95X2JtICsgc3RhcnRfeTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIG9mZnNldF94ID0gc3RhcnRfeCArIHNpemVfeCAtIHNpemVfeF9ibSAtIHN0YXJ0X3lfYm07CisgICAgICBvZmZzZXRfeSA9IHN0YXJ0X3kgKyBzaXplX3kgLSBzaXplX3lfYm0gLSBzdGFydF94X2JtOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIEZYX1JFQ1Qob2Zmc2V0X3gsIG9mZnNldF95LCBvZmZzZXRfeCArIHNpemVfeF9ibSwKKyAgICAgICAgICAgICAgICAgb2Zmc2V0X3kgKyBzaXplX3lfYm0pOworfQorCisvLyBHZXQgYSBiaXRtYXAgb2YganVzdCB0aGUgbWFzayBzZWN0aW9uIGRlZmluZWQgYnkgfG1hc2tfYm94fCBmcm9tIGEgZnVsbCBwYWdlCisvLyBiaXRtYXAgfHBCaXRtYXB8LgorUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gR2V0TWFza0JpdG1hcChDUERGX1BhZ2UqIHBQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRmxvYXRSZWN0JiBtYXNrX2JveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfUkVDVCogYml0bWFwX2FyZWEpIHsKKyAgQVNTRVJUKGJpdG1hcF9hcmVhKTsKKyAgKmJpdG1hcF9hcmVhID0gR2V0TWFza0RpbWVuc2lvbnNBbmRPZmZzZXRzKHBQYWdlLCBzdGFydF94LCBzdGFydF95LCBzaXplX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3ksIHJvdGF0ZSwgbWFza19ib3gpOworICBpZiAoYml0bWFwX2FyZWEtPklzRW1wdHkoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICAvLyBDcmVhdGUgYSBuZXcgYml0bWFwIHRvIHRyYW5zZmVyIHBhcnQgb2YgdGhlIHBhZ2UgYml0bWFwIHRvLgorICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwRHN0ID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKTsKKyAgcERzdC0+Q3JlYXRlKGJpdG1hcF9hcmVhLT5XaWR0aCgpLCBiaXRtYXBfYXJlYS0+SGVpZ2h0KCksIEZYRElCX0FyZ2IpOworICBwRHN0LT5DbGVhcigweDAwZmZmZmZmKTsKKyAgcERzdC0+VHJhbnNmZXJCaXRtYXAoMCwgMCwgYml0bWFwX2FyZWEtPldpZHRoKCksIGJpdG1hcF9hcmVhLT5IZWlnaHQoKSwgcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwX2FyZWEtPmxlZnQsIGJpdG1hcF9hcmVhLT50b3ApOworICByZXR1cm4gcERzdDsKK30KKwordm9pZCBSZW5kZXJCaXRtYXAoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLAorICAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIHBTcmMsCisgICAgICAgICAgICAgICAgICBjb25zdCBGWF9SRUNUJiBtYXNrX2FyZWEpIHsKKyAgaW50IHNpemVfeF9ibSA9IG1hc2tfYXJlYS5XaWR0aCgpOworICBpbnQgc2l6ZV95X2JtID0gbWFza19hcmVhLkhlaWdodCgpOworICBpZiAoc2l6ZV94X2JtID09IDAgfHwgc2l6ZV95X2JtID09IDApCisgICAgcmV0dXJuOworCisgIC8vIENyZWF0ZSBhIG5ldyBiaXRtYXAgZnJvbSB0aGUgb2xkIG9uZQorICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwRHN0ID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKTsKKyAgcERzdC0+Q3JlYXRlKHNpemVfeF9ibSwgc2l6ZV95X2JtLCBGWERJQl9SZ2IzMik7CisgIHBEc3QtPkNsZWFyKDB4ZmZmZmZmZmYpOworICBwRHN0LT5Db21wb3NpdGVCaXRtYXAoMCwgMCwgc2l6ZV94X2JtLCBzaXplX3lfYm0sIHBTcmMsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9CTEVORF9OT1JNQUwsIG51bGxwdHIsIGZhbHNlKTsKKworICBpZiAoZGV2aWNlLT5HZXREZXZpY2VDYXBzKEZYRENfREVWSUNFX0NMQVNTKSA9PSBGWERDX1BSSU5URVIpIHsKKyAgICBkZXZpY2UtPlN0cmV0Y2hESUJpdHMocERzdCwgbWFza19hcmVhLmxlZnQsIG1hc2tfYXJlYS50b3AsIHNpemVfeF9ibSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV95X2JtKTsKKyAgfSBlbHNlIHsKKyAgICBkZXZpY2UtPlNldERJQml0cyhwRHN0LCBtYXNrX2FyZWEubGVmdCwgbWFza19hcmVhLnRvcCk7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGX1JlbmRlclBhZ2UoSERDIGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpIHsKICAgQ1BERl9QYWdlKiBwUGFnZSA9IENQREZQYWdlRnJvbUZQREZQYWdlKHBhZ2UpOwogICBpZiAoIXBQYWdlKQogICAgIHJldHVybjsKKyAgcFBhZ2UtPlNldFJlbmRlckNvbnRleHQocGRmaXVtOjpNYWtlVW5pcXVlPENQREZfUGFnZVJlbmRlckNvbnRleHQ+KCkpOworICBDUERGX1BhZ2VSZW5kZXJDb250ZXh0KiBwQ29udGV4dCA9IHBQYWdlLT5HZXRSZW5kZXJDb250ZXh0KCk7CiAKLSAgQ1BERl9QYWdlUmVuZGVyQ29udGV4dCogcENvbnRleHQgPSBuZXcgQ1BERl9QYWdlUmVuZGVyQ29udGV4dDsKLSAgcFBhZ2UtPlNldFJlbmRlckNvbnRleHQocGRmaXVtOjpXcmFwVW5pcXVlKHBDb250ZXh0KSk7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gcEJpdG1hcDsKLSAgLy8gVE9ETzogVGhpcyByZXN1bHRzIGluIHVubmVjZXNzYXJ5IHJhc3Rlcml6YXRpb24gb2Ygc29tZSBQREZzIGR1ZSB0bwotICAvLyBIYXNJbWFnZU1hc2soKSByZXR1cm5pbmcgdHJ1ZS4gSWYgYW55IGltYWdlIG9uIHRoZSBwYWdlIGlzIGEgbWFzaywgdGhlCi0gIC8vIGVudGlyZSBwYWdlIGdldHMgcmFzdGVyaXplZCBhbmQgdGhlIHNwb29sIHNpemUgZ2V0cyBodWdlLgotICBjb25zdCBib29sIGJOZXdCaXRtYXAgPQotICAgICAgcFBhZ2UtPkJhY2tncm91bmRBbHBoYU5lZWRlZCgpIHx8IHBQYWdlLT5IYXNJbWFnZU1hc2soKTsKLSAgaWYgKGJOZXdCaXRtYXApIHsKLSAgICBwQml0bWFwID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9ESUJpdG1hcD4oKTsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcEJpdG1hcDsKKyAgLy8gRG9uJ3QgcmVuZGVyIHRoZSBmdWxsIHBhZ2UgdG8gYml0bWFwIGZvciBhIG1hc2sgdW5sZXNzIHRoZXJlIGFyZSBhIGxvdAorICAvLyBvZiBtYXNrcy4gRnVsbCBwYWdlIGJpdG1hcHMgcmVzdWx0IGluIGxhcmdlIHNwb29sIHNpemVzLCBzbyB0aGV5IHNob3VsZAorICAvLyBvbmx5IGJlIHVzZWQgd2hlbiBuZWNlc3NhcnkuIEZvciBsYXJnZSBudW1iZXJzIG9mIG1hc2tzLCByZW5kZXJpbmcgZWFjaAorICAvLyBpbmRpdmlkdWFsbHkgaXMgaW5lZmZpY2llbnQgYW5kIHVubGlrZWx5IHRvIHNpZ25pZmljYW50bHkgaW1wcm92ZSBzcG9vbAorICAvLyBzaXplLiBUT0RPIChyYnBvdHRlcik6IEZpbmQgb3V0IHdoeSB0aGlzIHN0aWxsIGJyZWFrcyBwcmludGluZyBmb3Igc29tZQorICAvLyBQREZzIChzZWUgY3JidWcuY29tLzc3NzgzNykuCisgIGNvbnN0IGJvb2wgYkVuYWJsZUltYWdlTWFza3MgPSBmYWxzZTsKKyAgY29uc3QgYm9vbCBiTmV3Qml0bWFwID0gcFBhZ2UtPkJhY2tncm91bmRBbHBoYU5lZWRlZCgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChwUGFnZS0+SGFzSW1hZ2VNYXNrKCkgJiYgIWJFbmFibGVJbWFnZU1hc2tzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFnZS0+R2V0TWFza0JvdW5kaW5nQm94ZXMoKS5zaXplKCkgPiAxMDA7CisgIGNvbnN0IGJvb2wgYkhhc01hc2sgPSBwUGFnZS0+SGFzSW1hZ2VNYXNrKCkgJiYgIWJOZXdCaXRtYXA7CisgIGlmIChiTmV3Qml0bWFwIHx8IGJIYXNNYXNrKSB7CisgICAgcEJpdG1hcCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfRElCaXRtYXA+KCk7CiAgICAgcEJpdG1hcC0+Q3JlYXRlKHNpemVfeCwgc2l6ZV95LCBGWERJQl9BcmdiKTsKICAgICBwQml0bWFwLT5DbGVhcigweDAwZmZmZmZmKTsKLSAgICBDRlhfRnhnZURldmljZSogcERldmljZSA9IG5ldyBDRlhfRnhnZURldmljZTsKKyAgICBDRlhfRGVmYXVsdFJlbmRlckRldmljZSogcERldmljZSA9IG5ldyBDRlhfRGVmYXVsdFJlbmRlckRldmljZTsKICAgICBwQ29udGV4dC0+bV9wRGV2aWNlID0gcGRmaXVtOjpXcmFwVW5pcXVlKHBEZXZpY2UpOwotICAgIHBEZXZpY2UtPkF0dGFjaChwQml0bWFwLmdldCgpLCBmYWxzZSwgbnVsbHB0ciwgZmFsc2UpOworICAgIHBEZXZpY2UtPkF0dGFjaChwQml0bWFwLCBmYWxzZSwgbnVsbHB0ciwgZmFsc2UpOworICAgIGlmIChiSGFzTWFzaykgeworICAgICAgcENvbnRleHQtPm1fcE9wdGlvbnMgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9SZW5kZXJPcHRpb25zPigpOworICAgICAgdWludDMyX3Qgb3B0aW9uX2ZsYWdzID0gcENvbnRleHQtPm1fcE9wdGlvbnMtPkdldEZsYWdzKCk7CisgICAgICBvcHRpb25fZmxhZ3MgfD0gUkVOREVSX0JSRUFLRk9STUFTS1M7CisgICAgICBwQ29udGV4dC0+bV9wT3B0aW9ucy0+U2V0RmxhZ3Mob3B0aW9uX2ZsYWdzKTsKKyAgICB9CiAgIH0gZWxzZSB7Ci0gICAgcENvbnRleHQtPm1fcERldmljZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfV2luZG93c0RldmljZT4oZGMpOworICAgIHBDb250ZXh0LT5tX3BEZXZpY2UgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX1dpbmRvd3NSZW5kZXJEZXZpY2U+KGRjKTsKICAgfQogCiAgIEZQREZfUmVuZGVyUGFnZV9SZXRhaWwocENvbnRleHQsIHBhZ2UsIHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LAogICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZSwgZmxhZ3MsIHRydWUsIG51bGxwdHIpOwogCi0gIGlmIChiTmV3Qml0bWFwKSB7Ci0gICAgQ0ZYX1dpbmRvd3NEZXZpY2UgV2luREMoZGMpOworICBpZiAoYkhhc01hc2spIHsKKyAgICAvLyBGaW5pc2ggcmVuZGVyaW5nIHRoZSBwYWdlIHRvIGJpdG1hcCBhbmQgY29weSB0aGUgY29ycmVjdCBzZWdtZW50cworICAgIC8vIG9mIHRoZSBwYWdlIHRvIGluZGl2aWR1YWwgaW1hZ2UgbWFzayBiaXRtYXBzLgorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENGWF9GbG9hdFJlY3Q+JiBtYXNrX2JveGVzID0KKyAgICAgICAgcFBhZ2UtPkdldE1hc2tCb3VuZGluZ0JveGVzKCk7CisgICAgc3RkOjp2ZWN0b3I8RlhfUkVDVD4gYml0bWFwX2FyZWFzKG1hc2tfYm94ZXMuc2l6ZSgpKTsKKyAgICBzdGQ6OnZlY3RvcjxSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPj4gYml0bWFwcyhtYXNrX2JveGVzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXNrX2JveGVzLnNpemUoKTsgaSsrKSB7CisgICAgICBiaXRtYXBzW2ldID0KKyAgICAgICAgICBHZXRNYXNrQml0bWFwKHBQYWdlLCBzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwgcm90YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgcEJpdG1hcCwgbWFza19ib3hlc1tpXSwgJmJpdG1hcF9hcmVhc1tpXSk7CisgICAgICBwQ29udGV4dC0+bV9wUmVuZGVyZXItPkNvbnRpbnVlKG51bGxwdHIpOworICAgIH0KKworICAgIC8vIFJlc2V0IHJlbmRlcmluZyBjb250ZXh0CisgICAgcFBhZ2UtPlNldFJlbmRlckNvbnRleHQobnVsbHB0cik7CisKKyAgICAvLyBCZWdpbiByZW5kZXJpbmcgdG8gdGhlIHByaW50ZXIuIEFkZCBmbGFnIHRvIGluZGljYXRlIHRoZSByZW5kZXJlciBzaG91bGQKKyAgICAvLyBwYXVzZSBhZnRlciBlYWNoIGltYWdlIG1hc2suCisgICAgcFBhZ2UtPlNldFJlbmRlckNvbnRleHQocGRmaXVtOjpNYWtlVW5pcXVlPENQREZfUGFnZVJlbmRlckNvbnRleHQ+KCkpOworICAgIHBDb250ZXh0ID0gcFBhZ2UtPkdldFJlbmRlckNvbnRleHQoKTsKKyAgICBwQ29udGV4dC0+bV9wRGV2aWNlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9XaW5kb3dzUmVuZGVyRGV2aWNlPihkYyk7CisgICAgcENvbnRleHQtPm1fcE9wdGlvbnMgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9SZW5kZXJPcHRpb25zPigpOworCisgICAgdWludDMyX3Qgb3B0aW9uX2ZsYWdzID0gcENvbnRleHQtPm1fcE9wdGlvbnMtPkdldEZsYWdzKCk7CisgICAgb3B0aW9uX2ZsYWdzIHw9IFJFTkRFUl9CUkVBS0ZPUk1BU0tTOworICAgIHBDb250ZXh0LT5tX3BPcHRpb25zLT5TZXRGbGFncyhvcHRpb25fZmxhZ3MpOworCisgICAgRlBERl9SZW5kZXJQYWdlX1JldGFpbChwQ29udGV4dCwgcGFnZSwgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGUsIGZsYWdzLCB0cnVlLCBudWxscHRyKTsKKworICAgIC8vIFJlbmRlciBtYXNrcworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWFza19ib3hlcy5zaXplKCk7IGkrKykgeworICAgICAgLy8gUmVuZGVyIHRoZSBiaXRtYXAgZm9yIHRoZSBtYXNrIGFuZCBmcmVlIHRoZSBiaXRtYXAuCisgICAgICBpZiAoYml0bWFwc1tpXSkgeyAgLy8gd2lsbCBiZSBudWxsIGlmIG1hc2sgaGFzIHplcm8gYXJlYQorICAgICAgICBSZW5kZXJCaXRtYXAocENvbnRleHQtPm1fcERldmljZS5nZXQoKSwgYml0bWFwc1tpXSwgYml0bWFwX2FyZWFzW2ldKTsKKyAgICAgIH0KKyAgICAgIC8vIFJlbmRlciB0aGUgbmV4dCBwb3J0aW9uIG9mIHBhZ2UuCisgICAgICBwQ29udGV4dC0+bV9wUmVuZGVyZXItPkNvbnRpbnVlKG51bGxwdHIpOworICAgIH0KKyAgfSBlbHNlIGlmIChiTmV3Qml0bWFwKSB7CisgICAgQ0ZYX1dpbmRvd3NSZW5kZXJEZXZpY2UgV2luREMoZGMpOwogICAgIGlmIChXaW5EQy5HZXREZXZpY2VDYXBzKEZYRENfREVWSUNFX0NMQVNTKSA9PSBGWERDX1BSSU5URVIpIHsKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IHBEc3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0RJQml0bWFwPigpOworICAgICAgYXV0byBwRHN0ID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKTsKICAgICAgIGludCBwaXRjaCA9IHBCaXRtYXAtPkdldFBpdGNoKCk7CiAgICAgICBwRHN0LT5DcmVhdGUoc2l6ZV94LCBzaXplX3ksIEZYRElCX1JnYjMyKTsKLSAgICAgIEZYU1lTX21lbXNldChwRHN0LT5HZXRCdWZmZXIoKSwgLTEsIHBpdGNoICogc2l6ZV95KTsKLSAgICAgIHBEc3QtPkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCBzaXplX3gsIHNpemVfeSwgcEJpdG1hcC5nZXQoKSwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9CTEVORF9OT1JNQUwsIG51bGxwdHIsIGZhbHNlLCBudWxscHRyKTsKLSAgICAgIFdpbkRDLlN0cmV0Y2hESUJpdHMocERzdC5nZXQoKSwgMCwgMCwgc2l6ZV94LCBzaXplX3kpOworICAgICAgbWVtc2V0KHBEc3QtPkdldEJ1ZmZlcigpLCAtMSwgcGl0Y2ggKiBzaXplX3kpOworICAgICAgcERzdC0+Q29tcG9zaXRlQml0bWFwKDAsIDAsIHNpemVfeCwgc2l6ZV95LCBwQml0bWFwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0JMRU5EX05PUk1BTCwgbnVsbHB0ciwgZmFsc2UpOworICAgICAgV2luREMuU3RyZXRjaERJQml0cyhwRHN0LCAwLCAwLCBzaXplX3gsIHNpemVfeSk7CiAgICAgfSBlbHNlIHsKLSAgICAgIFdpbkRDLlNldERJQml0cyhwQml0bWFwLmdldCgpLCAwLCAwKTsKKyAgICAgIFdpbkRDLlNldERJQml0cyhwQml0bWFwLCAwLCAwKTsKICAgICB9CiAgIH0KIApAQCAtNzM5LDE0ICs5NzUsMTQgQEAKIH0KICNlbmRpZiAgLy8gZGVmaW5lZChfV0lOMzIpCiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9SZW5kZXJQYWdlQml0bWFwKEZQREZfQklUTUFQIGJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykgeworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZfUmVuZGVyUGFnZUJpdG1hcChGUERGX0JJVE1BUCBiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykgewogICBpZiAoIWJpdG1hcCkKICAgICByZXR1cm47CiAKQEAgLTc1NiwyNiArOTkyLDI4IEBACiAKICAgQ1BERl9QYWdlUmVuZGVyQ29udGV4dCogcENvbnRleHQgPSBuZXcgQ1BERl9QYWdlUmVuZGVyQ29udGV4dDsKICAgcFBhZ2UtPlNldFJlbmRlckNvbnRleHQocGRmaXVtOjpXcmFwVW5pcXVlKHBDb250ZXh0KSk7Ci0gIENGWF9GeGdlRGV2aWNlKiBwRGV2aWNlID0gbmV3IENGWF9GeGdlRGV2aWNlOwotICBwQ29udGV4dC0+bV9wRGV2aWNlLnJlc2V0KHBEZXZpY2UpOwotICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBDRlhCaXRtYXBGcm9tRlBERkJpdG1hcChiaXRtYXApOwotICBwRGV2aWNlLT5BdHRhY2gocEJpdG1hcCwgISEoZmxhZ3MgJiBGUERGX1JFVkVSU0VfQllURV9PUkRFUiksIG51bGxwdHIsIGZhbHNlKTsKIAorICBDRlhfRGVmYXVsdFJlbmRlckRldmljZSogcERldmljZSA9IG5ldyBDRlhfRGVmYXVsdFJlbmRlckRldmljZTsKKyAgcENvbnRleHQtPm1fcERldmljZS5yZXNldChwRGV2aWNlKTsKKworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwQml0bWFwKENGWEJpdG1hcEZyb21GUERGQml0bWFwKGJpdG1hcCkpOworICBwRGV2aWNlLT5BdHRhY2gocEJpdG1hcCwgISEoZmxhZ3MgJiBGUERGX1JFVkVSU0VfQllURV9PUkRFUiksIG51bGxwdHIsIGZhbHNlKTsKICAgRlBERl9SZW5kZXJQYWdlX1JldGFpbChwQ29udGV4dCwgcGFnZSwgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlLCBmbGFncywgdHJ1ZSwgbnVsbHB0cik7CiAKICNpZmRlZiBfU0tJQV9TVVBQT1JUX1BBVEhTXwotICBwRGV2aWNlLT5GbHVzaCgpOworICBwRGV2aWNlLT5GbHVzaCh0cnVlKTsKICAgcEJpdG1hcC0+VW5QcmVNdWx0aXBseSgpOwogI2VuZGlmCiAgIHBQYWdlLT5TZXRSZW5kZXJDb250ZXh0KG51bGxwdHIpOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZUJpdG1hcFdpdGhNYXRyaXgoRlBERl9CSVRNQVAgYml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZTX01BVFJJWCogbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZTX1JFQ1RGKiBjbGlwcGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpIHsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OVgorRlBERl9SZW5kZXJQYWdlQml0bWFwV2l0aE1hdHJpeChGUERGX0JJVE1BUCBiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGU19NQVRSSVgqIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlNfUkVDVEYqIGNsaXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpIHsKICAgaWYgKCFiaXRtYXApCiAgICAgcmV0dXJuOwogCkBAIC03ODUsNDEgKzEwMjMsNDIgQEAKIAogICBDUERGX1BhZ2VSZW5kZXJDb250ZXh0KiBwQ29udGV4dCA9IG5ldyBDUERGX1BhZ2VSZW5kZXJDb250ZXh0OwogICBwUGFnZS0+U2V0UmVuZGVyQ29udGV4dChwZGZpdW06OldyYXBVbmlxdWUocENvbnRleHQpKTsKLSAgQ0ZYX0Z4Z2VEZXZpY2UqIHBEZXZpY2UgPSBuZXcgQ0ZYX0Z4Z2VEZXZpY2U7CisKKyAgQ0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2UqIHBEZXZpY2UgPSBuZXcgQ0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2U7CiAgIHBDb250ZXh0LT5tX3BEZXZpY2UucmVzZXQocERldmljZSk7Ci0gIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IENGWEJpdG1hcEZyb21GUERGQml0bWFwKGJpdG1hcCk7CisKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcEJpdG1hcChDRlhCaXRtYXBGcm9tRlBERkJpdG1hcChiaXRtYXApKTsKICAgcERldmljZS0+QXR0YWNoKHBCaXRtYXAsICEhKGZsYWdzICYgRlBERl9SRVZFUlNFX0JZVEVfT1JERVIpLCBudWxscHRyLCBmYWxzZSk7CiAKLSAgQ0ZYX01hdHJpeCB0cmFuc2Zvcm1fbWF0cml4ID0gcFBhZ2UtPkdldFBhZ2VNYXRyaXgoKTsKKyAgQ0ZYX0Zsb2F0UmVjdCBjbGlwcGluZ19yZWN0OworICBpZiAoY2xpcHBpbmcpCisgICAgY2xpcHBpbmdfcmVjdCA9IENGWEZsb2F0UmVjdEZyb21GU1JFQ1RGKCpjbGlwcGluZyk7CisgIEZYX1JFQ1QgY2xpcF9yZWN0ID0gY2xpcHBpbmdfcmVjdC5Ub0Z4UmVjdCgpOworCisgIENGWF9NYXRyaXggdHJhbnNmb3JtX21hdHJpeCA9IHBQYWdlLT5HZXREaXNwbGF5TWF0cml4KAorICAgICAgMCwgMCwgcFBhZ2UtPkdldFBhZ2VXaWR0aCgpLCBwUGFnZS0+R2V0UGFnZUhlaWdodCgpLCAwKTsKKwogICBpZiAobWF0cml4KSB7CiAgICAgdHJhbnNmb3JtX21hdHJpeC5Db25jYXQoQ0ZYX01hdHJpeChtYXRyaXgtPmEsIG1hdHJpeC0+YiwgbWF0cml4LT5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LT5kLCBtYXRyaXgtPmUsIG1hdHJpeC0+ZikpOwogICB9Ci0KLSAgQ0ZYX0Zsb2F0UmVjdCBjbGlwcGluZ19yZWN0OwotICBpZiAoY2xpcHBpbmcpIHsKLSAgICBjbGlwcGluZ19yZWN0LmxlZnQgPSBjbGlwcGluZy0+bGVmdDsKLSAgICBjbGlwcGluZ19yZWN0LmJvdHRvbSA9IGNsaXBwaW5nLT5ib3R0b207Ci0gICAgY2xpcHBpbmdfcmVjdC5yaWdodCA9IGNsaXBwaW5nLT5yaWdodDsKLSAgICBjbGlwcGluZ19yZWN0LnRvcCA9IGNsaXBwaW5nLT50b3A7Ci0gIH0KLSAgUmVuZGVyUGFnZUltcGwocENvbnRleHQsIHBQYWdlLCB0cmFuc2Zvcm1fbWF0cml4LCBjbGlwcGluZ19yZWN0LlRvRnhSZWN0KCksCi0gICAgICAgICAgICAgICAgIGZsYWdzLCB0cnVlLCBudWxscHRyKTsKKyAgUmVuZGVyUGFnZUltcGwocENvbnRleHQsIHBQYWdlLCB0cmFuc2Zvcm1fbWF0cml4LCBjbGlwX3JlY3QsIGZsYWdzLCB0cnVlLAorICAgICAgICAgICAgICAgICBudWxscHRyKTsKIAogICBwUGFnZS0+U2V0UmVuZGVyQ29udGV4dChudWxscHRyKTsKIH0KIAogI2lmZGVmIF9TS0lBX1NVUFBPUlRfCi1ETExFWFBPUlQgRlBERl9SRUNPUkRFUiBTVERDQUxMIEZQREZfUmVuZGVyUGFnZVNrcChGUERGX1BBR0UgcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95KSB7CitGUERGX0VYUE9SVCBGUERGX1JFQ09SREVSIEZQREZfQ0FMTENPTlYgRlBERl9SZW5kZXJQYWdlU2twKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95KSB7CiAgIENQREZfUGFnZSogcFBhZ2UgPSBDUERGUGFnZUZyb21GUERGUGFnZShwYWdlKTsKICAgaWYgKCFwUGFnZSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAogICBDUERGX1BhZ2VSZW5kZXJDb250ZXh0KiBwQ29udGV4dCA9IG5ldyBDUERGX1BhZ2VSZW5kZXJDb250ZXh0OwogICBwUGFnZS0+U2V0UmVuZGVyQ29udGV4dChwZGZpdW06OldyYXBVbmlxdWUocENvbnRleHQpKTsKLSAgQ0ZYX0Z4Z2VEZXZpY2UqIHNrRGV2aWNlID0gbmV3IENGWF9GeGdlRGV2aWNlOworICBDRlhfRGVmYXVsdFJlbmRlckRldmljZSogc2tEZXZpY2UgPSBuZXcgQ0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2U7CiAgIEZQREZfUkVDT1JERVIgcmVjb3JkZXIgPSBza0RldmljZS0+Q3JlYXRlUmVjb3JkZXIoc2l6ZV94LCBzaXplX3kpOwogICBwQ29udGV4dC0+bV9wRGV2aWNlLnJlc2V0KHNrRGV2aWNlKTsKICAgRlBERl9SZW5kZXJQYWdlX1JldGFpbChwQ29udGV4dCwgcGFnZSwgMCwgMCwgc2l6ZV94LCBzaXplX3ksIDAsIDAsIHRydWUsCkBAIC04MjksMTIgKzEwNjgsMTMgQEAKIH0KICNlbmRpZgogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfQ2xvc2VQYWdlKEZQREZfUEFHRSBwYWdlKSB7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRlBERl9DbG9zZVBhZ2UoRlBERl9QQUdFIHBhZ2UpIHsKICAgVW5kZXJseWluZ1BhZ2VUeXBlKiBwUGFnZSA9IFVuZGVybHlpbmdGcm9tRlBERlBhZ2UocGFnZSk7CiAgIGlmICghcGFnZSkKICAgICByZXR1cm47CiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKLSAgcFBhZ2UtPlJlbGVhc2UoKTsKKyAgLy8gVGFrZSBpdCBiYWNrIGFjcm9zcyB0aGUgQVBJIGFuZCB0aHJvdyBpdCBhd2F5LgorICBSZXRhaW5QdHI8Q1BERlhGQV9QYWdlPigpLlVubGVhayhwUGFnZSk7CiAjZWxzZSAgIC8vIFBERl9FTkFCTEVfWEZBCiAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9CiAgICAgICBzdGF0aWNfY2FzdDxDUERGU0RLX1BhZ2VWaWV3Kj4ocFBhZ2UtPkdldFZpZXcoKSk7CkBAIC04NjEsMjQgKzExMDEsMjQgQEAKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0Nsb3NlRG9jdW1lbnQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkgeworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZfQ2xvc2VEb2N1bWVudChGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CiAgIGRlbGV0ZSBVbmRlcmx5aW5nRnJvbUZQREZEb2N1bWVudChkb2N1bWVudCk7CiB9CiAKLURMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERl9HZXRMYXN0RXJyb3IoKSB7CitGUERGX0VYUE9SVCB1bnNpZ25lZCBsb25nIEZQREZfQ0FMTENPTlYgRlBERl9HZXRMYXN0RXJyb3IoKSB7CiAgIHJldHVybiBHZXRMYXN0RXJyb3IoKTsKIH0KIAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0RldmljZVRvUGFnZShGUERGX1BBR0UgcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGV2aWNlX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXZpY2VfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwYWdlX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcGFnZV95KSB7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRlBERl9EZXZpY2VUb1BhZ2UoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRldmljZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXZpY2VfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHBhZ2VfeSkgewogICBpZiAoIXBhZ2UgfHwgIXBhZ2VfeCB8fCAhcGFnZV95KQogICAgIHJldHVybjsKICAgVW5kZXJseWluZ1BhZ2VUeXBlKiBwUGFnZSA9IFVuZGVybHlpbmdGcm9tRlBERlBhZ2UocGFnZSk7CkBAIC04ODgsMjcgKzExMjgsMjUgQEAKICNlbHNlICAgLy8gUERGX0VOQUJMRV9YRkEKICAgQ0ZYX01hdHJpeCBwYWdlMmRldmljZSA9CiAgICAgICBwUGFnZS0+R2V0RGlzcGxheU1hdHJpeChzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwgcm90YXRlKTsKLSAgQ0ZYX01hdHJpeCBkZXZpY2UycGFnZTsKLSAgZGV2aWNlMnBhZ2UuU2V0UmV2ZXJzZShwYWdlMmRldmljZSk7CiAKLSAgQ0ZYX1BvaW50RiBwb3MgPSBkZXZpY2UycGFnZS5UcmFuc2Zvcm0oQ0ZYX1BvaW50RigKLSAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihkZXZpY2VfeCksIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihkZXZpY2VfeSkpKTsKKyAgQ0ZYX1BvaW50RiBwb3MgPSBwYWdlMmRldmljZS5HZXRJbnZlcnNlKCkuVHJhbnNmb3JtKAorICAgICAgQ0ZYX1BvaW50RihzdGF0aWNfY2FzdDxmbG9hdD4oZGV2aWNlX3gpLCBzdGF0aWNfY2FzdDxmbG9hdD4oZGV2aWNlX3kpKSk7CiAKICAgKnBhZ2VfeCA9IHBvcy54OwogICAqcGFnZV95ID0gcG9zLnk7CiAjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9QYWdlVG9EZXZpY2UoRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZXZpY2VfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZXZpY2VfeSkgeworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZfUGFnZVRvRGV2aWNlKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRldmljZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZGV2aWNlX3kpIHsKICAgaWYgKCFkZXZpY2VfeCB8fCAhZGV2aWNlX3kpCiAgICAgcmV0dXJuOwogICBVbmRlcmx5aW5nUGFnZVR5cGUqIHBQYWdlID0gVW5kZXJseWluZ0Zyb21GUERGUGFnZShwYWdlKTsKQEAgLTkyMSwyOCArMTE1OSwyOCBAQAogICBDRlhfTWF0cml4IHBhZ2UyZGV2aWNlID0KICAgICAgIHBQYWdlLT5HZXREaXNwbGF5TWF0cml4KHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LCByb3RhdGUpOwogICBDRlhfUG9pbnRGIHBvcyA9IHBhZ2UyZGV2aWNlLlRyYW5zZm9ybSgKLSAgICAgIENGWF9Qb2ludEYoc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHBhZ2VfeCksIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihwYWdlX3kpKSk7CisgICAgICBDRlhfUG9pbnRGKHN0YXRpY19jYXN0PGZsb2F0PihwYWdlX3gpLCBzdGF0aWNfY2FzdDxmbG9hdD4ocGFnZV95KSkpOwogCiAgICpkZXZpY2VfeCA9IEZYU1lTX3JvdW5kKHBvcy54KTsKICAgKmRldmljZV95ID0gRlhTWVNfcm91bmQocG9zLnkpOwogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogfQogCi1ETExFWFBPUlQgRlBERl9CSVRNQVAgU1REQ0FMTCBGUERGQml0bWFwX0NyZWF0ZShpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhKSB7Ci0gIGF1dG8gcEJpdG1hcCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfRElCaXRtYXA+KCk7CitGUERGX0VYUE9SVCBGUERGX0JJVE1BUCBGUERGX0NBTExDT05WIEZQREZCaXRtYXBfQ3JlYXRlKGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhKSB7CisgIGF1dG8gcEJpdG1hcCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfRElCaXRtYXA+KCk7CiAgIGlmICghcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGFscGhhID8gRlhESUJfQXJnYiA6IEZYRElCX1JnYjMyKSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAotICByZXR1cm4gcEJpdG1hcC5yZWxlYXNlKCk7CisgIHJldHVybiBwQml0bWFwLkxlYWsoKTsKIH0KIAotRExMRVhQT1JUIEZQREZfQklUTUFQIFNURENBTEwgRlBERkJpdG1hcF9DcmVhdGVFeChpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGZpcnN0X3NjYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpIHsKK0ZQREZfRVhQT1JUIEZQREZfQklUTUFQIEZQREZfQ0FMTENPTlYgRlBERkJpdG1hcF9DcmVhdGVFeChpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGZpcnN0X3NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSkgewogICBGWERJQl9Gb3JtYXQgZnhfZm9ybWF0OwogICBzd2l0Y2ggKGZvcm1hdCkgewogICAgIGNhc2UgRlBERkJpdG1hcF9HcmF5OgpAQCAtOTYwLDIyICsxMTk4LDQzIEBACiAgICAgZGVmYXVsdDoKICAgICAgIHJldHVybiBudWxscHRyOwogICB9Ci0gIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IG5ldyBDRlhfRElCaXRtYXA7Ci0gIHBCaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBmeF9mb3JtYXQsICh1aW50OF90KilmaXJzdF9zY2FuLCBzdHJpZGUpOwotICByZXR1cm4gcEJpdG1hcDsKKyAgYXV0byBwQml0bWFwID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKTsKKyAgcEJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZ4X2Zvcm1hdCwgc3RhdGljX2Nhc3Q8dWludDhfdCo+KGZpcnN0X3NjYW4pLAorICAgICAgICAgICAgICAgICAgc3RyaWRlKTsKKyAgcmV0dXJuIHBCaXRtYXAuTGVhaygpOwogfQogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZCaXRtYXBfRmlsbFJlY3QoRlBERl9CSVRNQVAgYml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBjb2xvcikgeworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERkJpdG1hcF9HZXRGb3JtYXQoRlBERl9CSVRNQVAgYml0bWFwKSB7CisgIGlmICghYml0bWFwKQorICAgIHJldHVybiBGUERGQml0bWFwX1Vua25vd247CisKKyAgRlhESUJfRm9ybWF0IGZvcm1hdCA9IENGWEJpdG1hcEZyb21GUERGQml0bWFwKGJpdG1hcCktPkdldEZvcm1hdCgpOworICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgRlhESUJfOGJwcFJnYjoKKyAgICBjYXNlIEZYRElCXzhicHBNYXNrOgorICAgICAgcmV0dXJuIEZQREZCaXRtYXBfR3JheTsKKyAgICBjYXNlIEZYRElCX1JnYjoKKyAgICAgIHJldHVybiBGUERGQml0bWFwX0JHUjsKKyAgICBjYXNlIEZYRElCX1JnYjMyOgorICAgICAgcmV0dXJuIEZQREZCaXRtYXBfQkdSeDsKKyAgICBjYXNlIEZYRElCX0FyZ2I6CisgICAgICByZXR1cm4gRlBERkJpdG1hcF9CR1JBOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRlBERkJpdG1hcF9Vbmtub3duOworICB9Cit9CisKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGQml0bWFwX0ZpbGxSZWN0KEZQREZfQklUTUFQIGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEIGNvbG9yKSB7CiAgIGlmICghYml0bWFwKQogICAgIHJldHVybjsKIAotICBDRlhfRnhnZURldmljZSBkZXZpY2U7Ci0gIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IENGWEJpdG1hcEZyb21GUERGQml0bWFwKGJpdG1hcCk7CisgIENGWF9EZWZhdWx0UmVuZGVyRGV2aWNlIGRldmljZTsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcEJpdG1hcChDRlhCaXRtYXBGcm9tRlBERkJpdG1hcChiaXRtYXApKTsKICAgZGV2aWNlLkF0dGFjaChwQml0bWFwLCBmYWxzZSwgbnVsbHB0ciwgZmFsc2UpOwogICBpZiAoIXBCaXRtYXAtPkhhc0FscGhhKCkpCiAgICAgY29sb3IgfD0gMHhGRjAwMDAwMDsKQEAgLTk4MywyNCArMTI0MiwyNSBAQAogICBkZXZpY2UuRmlsbFJlY3QoJnJlY3QsIGNvbG9yKTsKIH0KIAotRExMRVhQT1JUIHZvaWQqIFNURENBTEwgRlBERkJpdG1hcF9HZXRCdWZmZXIoRlBERl9CSVRNQVAgYml0bWFwKSB7CitGUERGX0VYUE9SVCB2b2lkKiBGUERGX0NBTExDT05WIEZQREZCaXRtYXBfR2V0QnVmZmVyKEZQREZfQklUTUFQIGJpdG1hcCkgewogICByZXR1cm4gYml0bWFwID8gQ0ZYQml0bWFwRnJvbUZQREZCaXRtYXAoYml0bWFwKS0+R2V0QnVmZmVyKCkgOiBudWxscHRyOwogfQogCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERkJpdG1hcF9HZXRXaWR0aChGUERGX0JJVE1BUCBiaXRtYXApIHsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZCaXRtYXBfR2V0V2lkdGgoRlBERl9CSVRNQVAgYml0bWFwKSB7CiAgIHJldHVybiBiaXRtYXAgPyBDRlhCaXRtYXBGcm9tRlBERkJpdG1hcChiaXRtYXApLT5HZXRXaWR0aCgpIDogMDsKIH0KIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZCaXRtYXBfR2V0SGVpZ2h0KEZQREZfQklUTUFQIGJpdG1hcCkgeworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERkJpdG1hcF9HZXRIZWlnaHQoRlBERl9CSVRNQVAgYml0bWFwKSB7CiAgIHJldHVybiBiaXRtYXAgPyBDRlhCaXRtYXBGcm9tRlBERkJpdG1hcChiaXRtYXApLT5HZXRIZWlnaHQoKSA6IDA7CiB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGQml0bWFwX0dldFN0cmlkZShGUERGX0JJVE1BUCBiaXRtYXApIHsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZCaXRtYXBfR2V0U3RyaWRlKEZQREZfQklUTUFQIGJpdG1hcCkgewogICByZXR1cm4gYml0bWFwID8gQ0ZYQml0bWFwRnJvbUZQREZCaXRtYXAoYml0bWFwKS0+R2V0UGl0Y2goKSA6IDA7CiB9CiAKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERkJpdG1hcF9EZXN0cm95KEZQREZfQklUTUFQIGJpdG1hcCkgewotICBkZWxldGUgQ0ZYQml0bWFwRnJvbUZQREZCaXRtYXAoYml0bWFwKTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGQml0bWFwX0Rlc3Ryb3koRlBERl9CSVRNQVAgYml0bWFwKSB7CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IGRlc3Ryb3llcjsKKyAgZGVzdHJveWVyLlVubGVhayhDRlhCaXRtYXBGcm9tRlBERkJpdG1hcChiaXRtYXApKTsKIH0KIAogdm9pZCBGUERGX1JlbmRlclBhZ2VfUmV0YWlsKENQREZfUGFnZVJlbmRlckNvbnRleHQqIHBDb250ZXh0LApAQCAtMTAyMywxMCArMTI4MywxMCBAQAogICAgICAgICAgICAgICAgICBmbGFncywgYk5lZWRUb1Jlc3RvcmUsIHBhdXNlKTsKIH0KIAotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfR2V0UGFnZVNpemVCeUluZGV4KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGhlaWdodCkgeworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERl9HZXRQYWdlU2l6ZUJ5SW5kZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWdlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogaGVpZ2h0KSB7CiAgIFVuZGVybHlpbmdEb2N1bWVudFR5cGUqIHBEb2MgPSBVbmRlcmx5aW5nRnJvbUZQREZEb2N1bWVudChkb2N1bWVudCk7CiAgIGlmICghcERvYykKICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMDM1LDcgKzEyOTUsNyBAQAogICBpbnQgY291bnQgPSBwRG9jLT5HZXRQYWdlQ291bnQoKTsKICAgaWYgKHBhZ2VfaW5kZXggPCAwIHx8IHBhZ2VfaW5kZXggPj0gY291bnQpCiAgICAgcmV0dXJuIGZhbHNlOwotICBDUERGWEZBX1BhZ2UqIHBQYWdlID0gcERvYy0+R2V0WEZBUGFnZShwYWdlX2luZGV4KTsKKyAgUmV0YWluUHRyPENQREZYRkFfUGFnZT4gcFBhZ2UgPSBwRG9jLT5HZXRYRkFQYWdlKHBhZ2VfaW5kZXgpOwogICBpZiAoIXBQYWdlKQogICAgIHJldHVybiBmYWxzZTsKICAgKndpZHRoID0gcFBhZ2UtPkdldFBhZ2VXaWR0aCgpOwpAQCAtMTA1Myw3ICsxMzEzLDcgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTAorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKIEZQREZfVklFV0VSUkVGX0dldFByaW50U2NhbGluZyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CiAgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBDUERGRG9jdW1lbnRGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKICAgaWYgKCFwRG9jKQpAQCAtMTA2Miw3ICsxMzIyLDggQEAKICAgcmV0dXJuIHZpZXdSZWYuUHJpbnRTY2FsaW5nKCk7CiB9CiAKLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGX1ZJRVdFUlJFRl9HZXROdW1Db3BpZXMoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkgeworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYKK0ZQREZfVklFV0VSUkVGX0dldE51bUNvcGllcyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CiAgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBDUERGRG9jdW1lbnRGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKICAgaWYgKCFwRG9jKQogICAgIHJldHVybiAxOwpAQCAtMTA3MCw3ICsxMzMxLDcgQEAKICAgcmV0dXJuIHZpZXdSZWYuTnVtQ29waWVzKCk7CiB9CiAKLURMTEVYUE9SVCBGUERGX1BBR0VSQU5HRSBTVERDQUxMCitGUERGX0VYUE9SVCBGUERGX1BBR0VSQU5HRSBGUERGX0NBTExDT05WCiBGUERGX1ZJRVdFUlJFRl9HZXRQcmludFBhZ2VSYW5nZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CiAgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBDUERGRG9jdW1lbnRGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKICAgaWYgKCFwRG9jKQpAQCAtMTA3OSwxMyArMTM0MCwxMyBAQAogICByZXR1cm4gdmlld1JlZi5QcmludFBhZ2VSYW5nZSgpOwogfQogCi1ETExFWFBPUlQgRlBERl9EVVBMRVhUWVBFIFNURENBTEwKK0ZQREZfRVhQT1JUIEZQREZfRFVQTEVYVFlQRSBGUERGX0NBTExDT05WCiBGUERGX1ZJRVdFUlJFRl9HZXREdXBsZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkgewogICBDUERGX0RvY3VtZW50KiBwRG9jID0gQ1BERkRvY3VtZW50RnJvbUZQREZEb2N1bWVudChkb2N1bWVudCk7CiAgIGlmICghcERvYykKICAgICByZXR1cm4gRHVwbGV4VW5kZWZpbmVkOwogICBDUERGX1ZpZXdlclByZWZlcmVuY2VzIHZpZXdSZWYocERvYyk7Ci0gIENGWF9CeXRlU3RyaW5nIGR1cGxleCA9IHZpZXdSZWYuRHVwbGV4KCk7CisgIEJ5dGVTdHJpbmcgZHVwbGV4ID0gdmlld1JlZi5EdXBsZXgoKTsKICAgaWYgKCJTaW1wbGV4IiA9PSBkdXBsZXgpCiAgICAgcmV0dXJuIFNpbXBsZXg7CiAgIGlmICgiRHVwbGV4RmxpcFNob3J0RWRnZSIgPT0gZHVwbGV4KQpAQCAtMTA5NSwxNiArMTM1NiwxNyBAQAogICByZXR1cm4gRHVwbGV4VW5kZWZpbmVkOwogfQogCi1ETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZfVklFV0VSUkVGX0dldE5hbWUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxlbmd0aCkgeworRlBERl9FWFBPUlQgdW5zaWduZWQgbG9uZyBGUERGX0NBTExDT05WCitGUERGX1ZJRVdFUlJFRl9HZXROYW1lKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBrZXksCisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGgpIHsKICAgQ1BERl9Eb2N1bWVudCogcERvYyA9IENQREZEb2N1bWVudEZyb21GUERGRG9jdW1lbnQoZG9jdW1lbnQpOwogICBpZiAoIXBEb2MpCiAgICAgcmV0dXJuIDA7CiAKICAgQ1BERl9WaWV3ZXJQcmVmZXJlbmNlcyB2aWV3UmVmKHBEb2MpOwotICBDRlhfQnl0ZVN0cmluZyBic1ZhbDsKKyAgQnl0ZVN0cmluZyBic1ZhbDsKICAgaWYgKCF2aWV3UmVmLkdlbmVyaWNOYW1lKGtleSwgJmJzVmFsKSkKICAgICByZXR1cm4gMDsKIApAQCAtMTExNCwxMiArMTM3NiwxMyBAQAogICByZXR1cm4gZHdTdHJpbmdMZW47CiB9CiAKLURMTEVYUE9SVCBGUERGX0RXT1JEIFNURENBTEwgRlBERl9Db3VudE5hbWVkRGVzdHMoRlBERl9ET0NVTUVOVCBkb2N1bWVudCkgeworRlBERl9FWFBPUlQgRlBERl9EV09SRCBGUERGX0NBTExDT05WCitGUERGX0NvdW50TmFtZWREZXN0cyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50KSB7CiAgIENQREZfRG9jdW1lbnQqIHBEb2MgPSBDUERGRG9jdW1lbnRGcm9tRlBERkRvY3VtZW50KGRvY3VtZW50KTsKICAgaWYgKCFwRG9jKQogICAgIHJldHVybiAwOwogCi0gIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBwRG9jLT5HZXRSb290KCk7CisgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBwRG9jLT5HZXRSb290KCk7CiAgIGlmICghcFJvb3QpCiAgICAgcmV0dXJuIDA7CiAKQEAgLTExMzUsOCArMTM5OCw4IEBACiAgIHJldHVybiBjb3VudC5WYWx1ZU9yRGllKCk7CiB9CiAKLURMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGX0dldE5hbWVkRGVzdEJ5TmFtZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBuYW1lKSB7CitGUERGX0VYUE9SVCBGUERGX0RFU1QgRlBERl9DQUxMQ09OVgorRlBERl9HZXROYW1lZERlc3RCeU5hbWUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9CWVRFU1RSSU5HIG5hbWUpIHsKICAgaWYgKCFuYW1lIHx8IG5hbWVbMF0gPT0gMCkKICAgICByZXR1cm4gbnVsbHB0cjsKIApAQCAtMTE0NSwzNCArMTQwOCwyOSBAQAogICAgIHJldHVybiBudWxscHRyOwogCiAgIENQREZfTmFtZVRyZWUgbmFtZV90cmVlKHBEb2MsICJEZXN0cyIpOwotICByZXR1cm4gbmFtZV90cmVlLkxvb2t1cE5hbWVkRGVzdChwRG9jLCBuYW1lKTsKKyAgcmV0dXJuIG5hbWVfdHJlZS5Mb29rdXBOYW1lZERlc3QocERvYywgUERGX0RlY29kZVRleHQoQnl0ZVN0cmluZyhuYW1lKSkpOwogfQogCiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKLURMTEVYUE9SVCBGUERGX1JFU1VMVCBTVERDQUxMIEZQREZfQlN0cl9Jbml0KEZQREZfQlNUUiogc3RyKSB7CitGUERGX0VYUE9SVCBGUERGX1JFU1VMVCBGUERGX0NBTExDT05WIEZQREZfQlN0cl9Jbml0KEZQREZfQlNUUiogc3RyKSB7CiAgIGlmICghc3RyKQogICAgIHJldHVybiAtMTsKIAotICBGWFNZU19tZW1zZXQoc3RyLCAwLCBzaXplb2YoRlBERl9CU1RSKSk7CisgIG1lbXNldChzdHIsIDAsIHNpemVvZihGUERGX0JTVFIpKTsKICAgcmV0dXJuIDA7CiB9CiAKLURMTEVYUE9SVCBGUERGX1JFU1VMVCBTVERDQUxMIEZQREZfQlN0cl9TZXQoRlBERl9CU1RSKiBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfTFBDU1RSIGJzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgpIHsKLSAgaWYgKCFzdHIpCitGUERGX0VYUE9SVCBGUERGX1JFU1VMVCBGUERGX0NBTExDT05WIEZQREZfQlN0cl9TZXQoRlBERl9CU1RSKiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9MUENTVFIgYnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKSB7CisgIGlmICghc3RyIHx8ICFic3RyIHx8ICFsZW5ndGgpCiAgICAgcmV0dXJuIC0xOwotICBpZiAoIWJzdHIgfHwgIWxlbmd0aCkKLSAgICByZXR1cm4gLTE7CisKICAgaWYgKGxlbmd0aCA9PSAtMSkKLSAgICBsZW5ndGggPSBGWFNZU19zdHJsZW4oYnN0cik7CisgICAgbGVuZ3RoID0gc3RybGVuKGJzdHIpOwogCiAgIGlmIChsZW5ndGggPT0gMCkgewotICAgIGlmIChzdHItPnN0cikgewotICAgICAgRlhfRnJlZShzdHItPnN0cik7Ci0gICAgICBzdHItPnN0ciA9IG51bGxwdHI7Ci0gICAgfQotICAgIHN0ci0+bGVuID0gMDsKKyAgICBGUERGX0JTdHJfQ2xlYXIoc3RyKTsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xMTgyLDEzICsxNDQwLDEzIEBACiAgICAgc3RyLT5zdHIgPSBGWF9BbGxvYyhjaGFyLCBsZW5ndGggKyAxKTsKIAogICBzdHItPnN0cltsZW5ndGhdID0gMDsKLSAgRlhTWVNfbWVtY3B5KHN0ci0+c3RyLCBic3RyLCBsZW5ndGgpOworICBtZW1jcHkoc3RyLT5zdHIsIGJzdHIsIGxlbmd0aCk7CiAgIHN0ci0+bGVuID0gbGVuZ3RoOwogCiAgIHJldHVybiAwOwogfQogCi1ETExFWFBPUlQgRlBERl9SRVNVTFQgU1REQ0FMTCBGUERGX0JTdHJfQ2xlYXIoRlBERl9CU1RSKiBzdHIpIHsKK0ZQREZfRVhQT1JUIEZQREZfUkVTVUxUIEZQREZfQ0FMTENPTlYgRlBERl9CU3RyX0NsZWFyKEZQREZfQlNUUiogc3RyKSB7CiAgIGlmICghc3RyKQogICAgIHJldHVybiAtMTsKIApAQCAtMTIwMSwxMCArMTQ1OSwxMCBAQAogfQogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCi1ETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERl9HZXROYW1lZERlc3QoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcqIGJ1ZmxlbikgeworRlBERl9FWFBPUlQgRlBERl9ERVNUIEZQREZfQ0FMTENPTlYgRlBERl9HZXROYW1lZERlc3QoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcqIGJ1ZmxlbikgewogICBpZiAoIWJ1ZmZlcikKICAgICAqYnVmbGVuID0gMDsKIApAQCAtMTIxNSwxMiArMTQ3MywxMiBAQAogICBpZiAoIXBEb2MpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IHBEb2MtPkdldFJvb3QoKTsKKyAgY29uc3QgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IHBEb2MtPkdldFJvb3QoKTsKICAgaWYgKCFwUm9vdCkKICAgICByZXR1cm4gbnVsbHB0cjsKIAogICBDUERGX09iamVjdCogcERlc3RPYmogPSBudWxscHRyOwotICBDRlhfQnl0ZVN0cmluZyBic05hbWU7CisgIFdpZGVTdHJpbmcgd3NOYW1lOwogICBDUERGX05hbWVUcmVlIG5hbWVUcmVlKHBEb2MsICJEZXN0cyIpOwogICBpbnQgY291bnQgPSBuYW1lVHJlZS5HZXRDb3VudCgpOwogICBpZiAoaW5kZXggPj0gY291bnQpIHsKQEAgLTEyMzUsNiArMTQ5Myw3IEBACiAKICAgICBpbmRleCAtPSBjb3VudDsKICAgICBpbnQgaSA9IDA7CisgICAgQnl0ZVN0cmluZyBic05hbWU7CiAgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICpwRGVzdCkgewogICAgICAgYnNOYW1lID0gaXQuZmlyc3Q7CiAgICAgICBwRGVzdE9iaiA9IGl0LnNlY29uZC5nZXQoKTsKQEAgLTEyNDQsOCArMTUwMyw5IEBACiAgICAgICAgIGJyZWFrOwogICAgICAgaSsrOwogICAgIH0KKyAgICB3c05hbWUgPSBQREZfRGVjb2RlVGV4dChic05hbWUpOwogICB9IGVsc2UgewotICAgIHBEZXN0T2JqID0gbmFtZVRyZWUuTG9va3VwVmFsdWUoaW5kZXgsIGJzTmFtZSk7CisgICAgcERlc3RPYmogPSBuYW1lVHJlZS5Mb29rdXBWYWx1ZUFuZE5hbWUoaW5kZXgsICZ3c05hbWUpOwogICB9CiAgIGlmICghcERlc3RPYmopCiAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC0xMjU3LDggKzE1MTcsNyBAQAogICBpZiAoIXBEZXN0T2JqLT5Jc0FycmF5KCkpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lID0gUERGX0RlY29kZVRleHQoYnNOYW1lKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgdXRmMTZOYW1lID0gd3NOYW1lLlVURjE2TEVfRW5jb2RlKCk7CisgIEJ5dGVTdHJpbmcgdXRmMTZOYW1lID0gd3NOYW1lLlVURjE2TEVfRW5jb2RlKCk7CiAgIGludCBsZW4gPSB1dGYxNk5hbWUuR2V0TGVuZ3RoKCk7CiAgIGlmICghYnVmZmVyKSB7CiAgICAgKmJ1ZmxlbiA9IGxlbjsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnBkZnZpZXdfY19hcGlfdGVzdC5jIGIvZnBkZnNkay9mcGRmdmlld19jX2FwaV90ZXN0LmMKaW5kZXggNTRhMzMyNS4uNTNkODc3NiAxMDA2NDQKLS0tIGEvZnBkZnNkay9mcGRmdmlld19jX2FwaV90ZXN0LmMKKysrIGIvZnBkZnNkay9mcGRmdmlld19jX2FwaV90ZXN0LmMKQEAgLTksNiArOSw5IEBACiAKICNpbmNsdWRlICJmcGRmc2RrL2ZwZGZ2aWV3X2NfYXBpX3Rlc3QuaCIKIAorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2Fubm90LmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfYXR0YWNobWVudC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2NhdGFsb2cuaCIKICNpbmNsdWRlICJwdWJsaWMvZnBkZl9kYXRhYXZhaWwuaCIKICNpbmNsdWRlICJwdWJsaWMvZnBkZl9kb2MuaCIKICNpbmNsdWRlICJwdWJsaWMvZnBkZl9lZGl0LmgiCkBAIC0zMyw2ICszNiw1NiBAQAogCiAvLyBGdW5jdGlvbiB0byBjYWxsIGZyb20gZ3Rlc3QgaGFybmVzcyB0byBlbnN1cmUgbGlua2VyIHJlc29sdXRpb24uCiBpbnQgQ2hlY2tQREZpdW1DQXBpKCkgeworICAgIC8vIGZwZGZfYW5ub3QuaAorICAgIENISyhGUERGQW5ub3RfSXNTdXBwb3J0ZWRTdWJ0eXBlKTsKKyAgICBDSEsoRlBERlBhZ2VfQ3JlYXRlQW5ub3QpOworICAgIENISyhGUERGUGFnZV9HZXRBbm5vdENvdW50KTsKKyAgICBDSEsoRlBERlBhZ2VfR2V0QW5ub3QpOworICAgIENISyhGUERGUGFnZV9HZXRBbm5vdEluZGV4KTsKKyAgICBDSEsoRlBERlBhZ2VfQ2xvc2VBbm5vdCk7CisgICAgQ0hLKEZQREZQYWdlX1JlbW92ZUFubm90KTsKKyAgICBDSEsoRlBERkFubm90X0dldFN1YnR5cGUpOworICAgIENISyhGUERGQW5ub3RfSXNPYmplY3RTdXBwb3J0ZWRTdWJ0eXBlKTsKKyAgICBDSEsoRlBERkFubm90X1VwZGF0ZU9iamVjdCk7CisgICAgQ0hLKEZQREZBbm5vdF9BcHBlbmRPYmplY3QpOworICAgIENISyhGUERGQW5ub3RfR2V0T2JqZWN0Q291bnQpOworICAgIENISyhGUERGQW5ub3RfR2V0T2JqZWN0KTsKKyAgICBDSEsoRlBERkFubm90X1JlbW92ZU9iamVjdCk7CisgICAgQ0hLKEZQREZBbm5vdF9TZXRDb2xvcik7CisgICAgQ0hLKEZQREZBbm5vdF9HZXRDb2xvcik7CisgICAgQ0hLKEZQREZBbm5vdF9IYXNBdHRhY2htZW50UG9pbnRzKTsKKyAgICBDSEsoRlBERkFubm90X1NldEF0dGFjaG1lbnRQb2ludHMpOworICAgIENISyhGUERGQW5ub3RfR2V0QXR0YWNobWVudFBvaW50cyk7CisgICAgQ0hLKEZQREZBbm5vdF9TZXRSZWN0KTsKKyAgICBDSEsoRlBERkFubm90X0dldFJlY3QpOworICAgIENISyhGUERGQW5ub3RfSGFzS2V5KTsKKyAgICBDSEsoRlBERkFubm90X0dldFZhbHVlVHlwZSk7CisgICAgQ0hLKEZQREZBbm5vdF9TZXRTdHJpbmdWYWx1ZSk7CisgICAgQ0hLKEZQREZBbm5vdF9HZXRTdHJpbmdWYWx1ZSk7CisgICAgQ0hLKEZQREZBbm5vdF9TZXRBUCk7CisgICAgQ0hLKEZQREZBbm5vdF9HZXRBUCk7CisgICAgQ0hLKEZQREZBbm5vdF9HZXRMaW5rZWRBbm5vdCk7CisgICAgQ0hLKEZQREZBbm5vdF9HZXRGbGFncyk7CisgICAgQ0hLKEZQREZBbm5vdF9TZXRGbGFncyk7CisgICAgQ0hLKEZQREZBbm5vdF9HZXRGb3JtRmllbGRGbGFncyk7CisgICAgQ0hLKEZQREZBbm5vdF9HZXRGb3JtRmllbGRBdFBvaW50KTsKKworICAgIC8vIGZwZGZfYXR0YWNobWVudC5oCisgICAgQ0hLKEZQREZEb2NfR2V0QXR0YWNobWVudENvdW50KTsKKyAgICBDSEsoRlBERkRvY19BZGRBdHRhY2htZW50KTsKKyAgICBDSEsoRlBERkRvY19HZXRBdHRhY2htZW50KTsKKyAgICBDSEsoRlBERkRvY19EZWxldGVBdHRhY2htZW50KTsKKyAgICBDSEsoRlBERkF0dGFjaG1lbnRfR2V0TmFtZSk7CisgICAgQ0hLKEZQREZBdHRhY2htZW50X0hhc0tleSk7CisgICAgQ0hLKEZQREZBdHRhY2htZW50X0dldFZhbHVlVHlwZSk7CisgICAgQ0hLKEZQREZBdHRhY2htZW50X1NldFN0cmluZ1ZhbHVlKTsKKyAgICBDSEsoRlBERkF0dGFjaG1lbnRfR2V0U3RyaW5nVmFsdWUpOworICAgIENISyhGUERGQXR0YWNobWVudF9TZXRGaWxlKTsKKyAgICBDSEsoRlBERkF0dGFjaG1lbnRfR2V0RmlsZSk7CisKKyAgICAvLyBmcGRmX2NhdGFsb2cuaAorICAgIENISyhGUERGQ2F0YWxvZ19Jc1RhZ2dlZCk7CisKICAgICAvLyBmcGRmX2RhdGFhdmFpbC5oCiAgICAgQ0hLKEZQREZBdmFpbF9DcmVhdGUpOwogICAgIENISyhGUERGQXZhaWxfRGVzdHJveSk7CkBAIC01Niw2ICsxMDksNyBAQAogICAgIENISyhGUERGQWN0aW9uX0dldFVSSVBhdGgpOwogICAgIENISyhGUERGRGVzdF9HZXRQYWdlSW5kZXgpOwogICAgIENISyhGUERGRGVzdF9HZXRMb2NhdGlvbkluUGFnZSk7CisgICAgQ0hLKEZQREZEZXN0X0dldFZpZXcpOwogICAgIENISyhGUERGTGlua19HZXRMaW5rQXRQb2ludCk7CiAgICAgQ0hLKEZQREZMaW5rX0dldExpbmtaT3JkZXJBdFBvaW50KTsKICAgICBDSEsoRlBERkxpbmtfR2V0RGVzdCk7CkBAIC03NSwzMCArMTI5LDUzIEBACiAgICAgQ0hLKEZQREZQYWdlX1NldFJvdGF0aW9uKTsKICAgICBDSEsoRlBERlBhZ2VfSW5zZXJ0T2JqZWN0KTsKICAgICBDSEsoRlBERlBhZ2VfQ291bnRPYmplY3QpOworICAgIENISyhGUERGUGFnZV9Db3VudE9iamVjdHMpOwogICAgIENISyhGUERGUGFnZV9HZXRPYmplY3QpOwogICAgIENISyhGUERGUGFnZV9IYXNUcmFuc3BhcmVuY3kpOwogICAgIENISyhGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQpOworICAgIENISyhGUERGUGFnZU9ial9EZXN0cm95KTsKICAgICBDSEsoRlBERlBhZ2VPYmpfSGFzVHJhbnNwYXJlbmN5KTsKKyAgICBDSEsoRlBERlBhZ2VPYmpfR2V0Qm91bmRzKTsKKyAgICBDSEsoRlBERlBhZ2VPYmpfR2V0VHlwZSk7CisgICAgQ0hLKEZQREZQYWdlT2JqX1NldEJsZW5kTW9kZSk7CiAgICAgQ0hLKEZQREZQYWdlT2JqX1RyYW5zZm9ybSk7CiAgICAgQ0hLKEZQREZQYWdlX1RyYW5zZm9ybUFubm90cyk7Ci0gICAgQ0hLKEZQREZQYWdlT2JqX05ld0ltZ2VPYmopOworICAgIENISyhGUERGUGFnZU9ial9OZXdJbWFnZU9iaik7CiAgICAgQ0hLKEZQREZJbWFnZU9ial9Mb2FkSnBlZ0ZpbGUpOwogICAgIENISyhGUERGSW1hZ2VPYmpfTG9hZEpwZWdGaWxlSW5saW5lKTsKICAgICBDSEsoRlBERkltYWdlT2JqX1NldE1hdHJpeCk7CiAgICAgQ0hLKEZQREZJbWFnZU9ial9TZXRCaXRtYXApOworICAgIENISyhGUERGSW1hZ2VPYmpfR2V0Qml0bWFwKTsKKyAgICBDSEsoRlBERkltYWdlT2JqX0dldEltYWdlRGF0YURlY29kZWQpOworICAgIENISyhGUERGSW1hZ2VPYmpfR2V0SW1hZ2VEYXRhUmF3KTsKKyAgICBDSEsoRlBERkltYWdlT2JqX0dldEltYWdlRmlsdGVyQ291bnQpOworICAgIENISyhGUERGSW1hZ2VPYmpfR2V0SW1hZ2VGaWx0ZXIpOworICAgIENISyhGUERGSW1hZ2VPYmpfR2V0SW1hZ2VNZXRhZGF0YSk7CiAgICAgQ0hLKEZQREZQYWdlT2JqX0NyZWF0ZU5ld1BhdGgpOwogICAgIENISyhGUERGUGFnZU9ial9DcmVhdGVOZXdSZWN0KTsKICAgICBDSEsoRlBERlBhdGhfU2V0U3Ryb2tlQ29sb3IpOworICAgIENISyhGUERGUGF0aF9HZXRTdHJva2VDb2xvcik7CiAgICAgQ0hLKEZQREZQYXRoX1NldFN0cm9rZVdpZHRoKTsKICAgICBDSEsoRlBERlBhdGhfU2V0RmlsbENvbG9yKTsKKyAgICBDSEsoRlBERlBhdGhfR2V0RmlsbENvbG9yKTsKKyAgICBDSEsoRlBERlBhdGhfQ291bnRTZWdtZW50cyk7CisgICAgQ0hLKEZQREZQYXRoX0dldFBhdGhTZWdtZW50KTsKKyAgICBDSEsoRlBERlBhdGhTZWdtZW50X0dldFBvaW50KTsKKyAgICBDSEsoRlBERlBhdGhTZWdtZW50X0dldFR5cGUpOworICAgIENISyhGUERGUGF0aFNlZ21lbnRfR2V0Q2xvc2UpOwogICAgIENISyhGUERGUGF0aF9Nb3ZlVG8pOwogICAgIENISyhGUERGUGF0aF9MaW5lVG8pOwogICAgIENISyhGUERGUGF0aF9CZXppZXJUbyk7CiAgICAgQ0hLKEZQREZQYXRoX0Nsb3NlKTsKICAgICBDSEsoRlBERlBhdGhfU2V0RHJhd01vZGUpOworICAgIENISyhGUERGUGF0aF9TZXRMaW5lQ2FwKTsKKyAgICBDSEsoRlBERlBhdGhfU2V0TGluZUpvaW4pOwogICAgIENISyhGUERGUGFnZU9ial9OZXdUZXh0T2JqKTsKICAgICBDSEsoRlBERlRleHRfU2V0VGV4dCk7Ci0gICAgQ0hLKEZQREZUZXh0X0xvYWRUeXBlMUZvbnQpOworICAgIENISyhGUERGVGV4dF9TZXRGaWxsQ29sb3IpOworICAgIENISyhGUERGVGV4dF9Mb2FkRm9udCk7CisgICAgQ0hLKEZQREZGb250X0Nsb3NlKTsKKyAgICBDSEsoRlBERlBhZ2VPYmpfQ3JlYXRlVGV4dE9iaik7CiAKICAgICAvLyBmcGRmX2V4dC5oCiAgICAgQ0hLKEZTREtfU2V0VW5TcE9ialByb2Nlc3NIYW5kbGVyKTsKQEAgLTExOSw2ICsxOTYsNyBAQAogICAgIENISyhGT1JNX0RvRG9jdW1lbnRBQWN0aW9uKTsKICAgICBDSEsoRk9STV9Eb1BhZ2VBQWN0aW9uKTsKICAgICBDSEsoRk9STV9Pbk1vdXNlTW92ZSk7CisgICAgQ0hLKEZPUk1fT25Gb2N1cyk7CiAgICAgQ0hLKEZPUk1fT25MQnV0dG9uRG93bik7CiAgICAgQ0hLKEZPUk1fT25MQnV0dG9uVXApOwogI2lmZGVmIFBERl9FTkFCTEVfWEZBCkBAIC0xMjgsMTYgKzIwNiwyMCBAQAogICAgIENISyhGT1JNX09uS2V5RG93bik7CiAgICAgQ0hLKEZPUk1fT25LZXlVcCk7CiAgICAgQ0hLKEZPUk1fT25DaGFyKTsKKyAgICBDSEsoRk9STV9HZXRTZWxlY3RlZFRleHQpOworICAgIENISyhGT1JNX1JlcGxhY2VTZWxlY3Rpb24pOwogICAgIENISyhGT1JNX0ZvcmNlVG9LaWxsRm9jdXMpOwogICAgIENISyhGUERGUGFnZV9IYXNGb3JtRmllbGRBdFBvaW50KTsKLSAgICBDSEsoRlBEUGFnZV9IYXNGb3JtRmllbGRBdFBvaW50KTsgIC8vIERFUFJFQ0FURUQuIFJlbW92ZSBpbiB0aGUgZnV0dXJlLgogICAgIENISyhGUERGUGFnZV9Gb3JtRmllbGRaT3JkZXJBdFBvaW50KTsKICAgICBDSEsoRlBERl9TZXRGb3JtRmllbGRIaWdobGlnaHRDb2xvcik7CiAgICAgQ0hLKEZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0QWxwaGEpOwogICAgIENISyhGUERGX1JlbW92ZUZvcm1GaWVsZEhpZ2hsaWdodCk7CiAgICAgQ0hLKEZQREZfRkZMRHJhdyk7CisjaWZkZWYgX1NLSUFfU1VQUE9SVF8KKyAgICBDSEsoRlBERl9GRkxSZWNvcmQpOworI2VuZGlmCisgICAgQ0hLKEZQREZfR2V0Rm9ybVR5cGUpOwogI2lmZGVmIFBERl9FTkFCTEVfWEZBCi0gICAgQ0hLKEZQREZfSGFzWEZBRmllbGQpOwogICAgIENISyhGUERGX0xvYWRYRkEpOwogICAgIENISyhGUERGX1dpZGdldF9VbmRvKTsKICAgICBDSEsoRlBERl9XaWRnZXRfUmVkbyk7CkBAIC0xNjgsNiArMjUwLDcgQEAKIAogICAgIC8vIGZwZGZfc2VhcmNoZXguaAogICAgIENISyhGUERGVGV4dF9HZXRDaGFySW5kZXhGcm9tVGV4dEluZGV4KTsKKyAgICBDSEsoRlBERlRleHRfR2V0VGV4dEluZGV4RnJvbUNoYXJJbmRleCk7CiAKICAgICAvLyBmcGRmX3N0cnVjdHRyZWUuaAogICAgIENISyhGUERGX1N0cnVjdFRyZWVfR2V0Rm9yUGFnZSk7CkBAIC0xNzUsNiArMjU4LDkgQEAKICAgICBDSEsoRlBERl9TdHJ1Y3RUcmVlX0NvdW50Q2hpbGRyZW4pOwogICAgIENISyhGUERGX1N0cnVjdFRyZWVfR2V0Q2hpbGRBdEluZGV4KTsKICAgICBDSEsoRlBERl9TdHJ1Y3RFbGVtZW50X0dldEFsdFRleHQpOworICAgIENISyhGUERGX1N0cnVjdEVsZW1lbnRfR2V0TWFya2VkQ29udGVudElEKTsKKyAgICBDSEsoRlBERl9TdHJ1Y3RFbGVtZW50X0dldFR5cGUpOworICAgIENISyhGUERGX1N0cnVjdEVsZW1lbnRfR2V0VGl0bGUpOwogICAgIENISyhGUERGX1N0cnVjdEVsZW1lbnRfQ291bnRDaGlsZHJlbik7CiAgICAgQ0hLKEZQREZfU3RydWN0RWxlbWVudF9HZXRDaGlsZEF0SW5kZXgpOwogCkBAIC0xOTIsNiArMjc4LDcgQEAKICAgICBDSEsoRlBERlRleHRfR2V0VW5pY29kZSk7CiAgICAgQ0hLKEZQREZUZXh0X0dldEZvbnRTaXplKTsKICAgICBDSEsoRlBERlRleHRfR2V0Q2hhckJveCk7CisgICAgQ0hLKEZQREZUZXh0X0dldENoYXJPcmlnaW4pOwogICAgIENISyhGUERGVGV4dF9HZXRDaGFySW5kZXhBdFBvcyk7CiAgICAgQ0hLKEZQREZUZXh0X0dldFRleHQpOwogICAgIENISyhGUERGVGV4dF9Db3VudFJlY3RzKTsKQEAgLTIyNiw2ICszMTMsMTQgQEAKICAgICBDSEsoRlBERl9Jbml0TGlicmFyeVdpdGhDb25maWcpOwogICAgIENISyhGUERGX0Rlc3Ryb3lMaWJyYXJ5KTsKICAgICBDSEsoRlBERl9TZXRTYW5kQm94UG9saWN5KTsKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyNpZiBkZWZpbmVkKFBERklVTV9QUklOVF9URVhUX1dJVEhfR0RJKQorICAgIENISyhGUERGX1NldFR5cGVmYWNlQWNjZXNzaWJsZUZ1bmMpOworICAgIENISyhGUERGX1NldFByaW50VGV4dFdpdGhHREkpOworI2VuZGlmCisgICAgQ0hLKEZQREZfU2V0UHJpbnRQb3N0c2NyaXB0TGV2ZWwpOworICAgIENISyhGUERGX1NldFByaW50TW9kZSk7CisjZW5kaWYKICAgICBDSEsoRlBERl9Mb2FkRG9jdW1lbnQpOwogICAgIENISyhGUERGX0xvYWRNZW1Eb2N1bWVudCk7CiAgICAgQ0hLKEZQREZfTG9hZEN1c3RvbURvY3VtZW50KTsKQEAgLTIzNywxNSArMzMyLDIzIEBACiAgICAgQ0hLKEZQREZfTG9hZFBhZ2UpOwogICAgIENISyhGUERGX0dldFBhZ2VXaWR0aCk7CiAgICAgQ0hLKEZQREZfR2V0UGFnZUhlaWdodCk7CisgICAgQ0hLKEZQREZfR2V0UGFnZUJvdW5kaW5nQm94KTsKICAgICBDSEsoRlBERl9HZXRQYWdlU2l6ZUJ5SW5kZXgpOworI2lmZGVmIF9XSU4zMgorICAgIENISyhGUERGX1JlbmRlclBhZ2UpOworI2VuZGlmCiAgICAgQ0hLKEZQREZfUmVuZGVyUGFnZUJpdG1hcCk7CiAgICAgQ0hLKEZQREZfUmVuZGVyUGFnZUJpdG1hcFdpdGhNYXRyaXgpOworI2lmZGVmIF9TS0lBX1NVUFBPUlRfCisgICAgQ0hLKEZQREZfUmVuZGVyUGFnZVNrcCk7CisjZW5kaWYKICAgICBDSEsoRlBERl9DbG9zZVBhZ2UpOwogICAgIENISyhGUERGX0Nsb3NlRG9jdW1lbnQpOwogICAgIENISyhGUERGX0RldmljZVRvUGFnZSk7CiAgICAgQ0hLKEZQREZfUGFnZVRvRGV2aWNlKTsKICAgICBDSEsoRlBERkJpdG1hcF9DcmVhdGUpOwogICAgIENISyhGUERGQml0bWFwX0NyZWF0ZUV4KTsKKyAgICBDSEsoRlBERkJpdG1hcF9HZXRGb3JtYXQpOwogICAgIENISyhGUERGQml0bWFwX0ZpbGxSZWN0KTsKICAgICBDSEsoRlBERkJpdG1hcF9HZXRCdWZmZXIpOwogICAgIENISyhGUERGQml0bWFwX0dldFdpZHRoKTsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnBkZnZpZXdfZW1iZWRkZXJ0ZXN0LmNwcCBiL2ZwZGZzZGsvZnBkZnZpZXdfZW1iZWRkZXJ0ZXN0LmNwcAppbmRleCAxZDk0YjcyLi5jY2E3N2M5IDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZwZGZ2aWV3X2VtYmVkZGVydGVzdC5jcHAKKysrIGIvZnBkZnNkay9mcGRmdmlld19lbWJlZGRlcnRlc3QuY3BwCkBAIC0yLDYgKzIsNyBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAorI2luY2x1ZGUgPGNtYXRoPgogI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDxzdHJpbmc+CiAKQEAgLTksMTIgKzEwLDM4IEBACiAjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCiAjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy91dGlscy9wYXRoX3NlcnZpY2UuaCIKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW9ja0Rvd25sb2FkSGludHMgOiBwdWJsaWMgRlhfRE9XTkxPQURISU5UUyB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBTQWRkU2VnbWVudChGWF9ET1dOTE9BREhJTlRTKiBwVGhpcywgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgfQorCisgIE1vY2tEb3dubG9hZEhpbnRzKCkgeworICAgIEZYX0RPV05MT0FESElOVFM6OnZlcnNpb24gPSAxOworICAgIEZYX0RPV05MT0FESElOVFM6OkFkZFNlZ21lbnQgPSBTQWRkU2VnbWVudDsKKyAgfQorCisgIH5Nb2NrRG93bmxvYWRIaW50cygpIHt9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKIAogVEVTVChmcGRmLCBDQXBpVGVzdCkgewogICBFWFBFQ1RfVFJVRShDaGVja1BERml1bUNBcGkoKSk7CiB9CiAKLWNsYXNzIEZQREZWaWV3RW1iZWRkZXJ0ZXN0IDogcHVibGljIEVtYmVkZGVyVGVzdCB7fTsKK2NsYXNzIEZQREZWaWV3RW1iZWRkZXJ0ZXN0IDogcHVibGljIEVtYmVkZGVyVGVzdCB7CisgcHJvdGVjdGVkOgorICB2b2lkIFRlc3RSZW5kZXJQYWdlQml0bWFwV2l0aE1hdHJpeChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJpdG1hcF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJpdG1hcF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZTX01BVFJJWCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGU19SRUNURiYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWRfbWQ1KTsKK307CiAKIFRFU1RfRihGUERGVmlld0VtYmVkZGVydGVzdCwgRG9jdW1lbnQpIHsKICAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJhYm91dF9ibGFuay5wZGYiKSk7CkBAIC0yOSw2ICs1NiwxMiBAQAogICBFWFBFQ1RfRVEoLTEsIEZQREZfR2V0U2VjdXJpdHlIYW5kbGVyUmV2aXNpb24oZG9jdW1lbnQoKSkpOwogfQogCitURVNUX0YoRlBERlZpZXdFbWJlZGRlcnRlc3QsIExvYWROb25leGlzdGVudERvY3VtZW50KSB7CisgIEZQREZfRE9DVU1FTlQgZG9jID0gRlBERl9Mb2FkRG9jdW1lbnQoIm5vbmV4aXN0ZW50X2RvY3VtZW50LnBkZiIsICIiKTsKKyAgQVNTRVJUX0ZBTFNFKGRvYyk7CisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxpbnQ+KEZQREZfR2V0TGFzdEVycm9yKCkpLCBGUERGX0VSUl9GSUxFKTsKK30KKwogLy8gU2VlIGJ1ZyA0NjUuCiBURVNUX0YoRlBERlZpZXdFbWJlZGRlcnRlc3QsIEVtcHR5RG9jdW1lbnQpIHsKICAgRVhQRUNUX1RSVUUoQ3JlYXRlRW1wdHlEb2N1bWVudCgpKTsKQEAgLTYzLDEyICs5NiwyOCBAQAogICBFWFBFQ1RfRVEoMHUsIEZQREZfQ291bnROYW1lZERlc3RzKGRvY3VtZW50KCkpKTsKIH0KIAorVEVTVF9GKEZQREZWaWV3RW1iZWRkZXJ0ZXN0LCBMaW5lYXJpemVkRG9jdW1lbnQpIHsKKyAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50TGluZWFyaXplZCgiZmVhdHVyZV9saW5lYXJpemVkX2xvYWRpbmcucGRmIikpOworICBpbnQgdmVyc2lvbjsKKyAgRVhQRUNUX1RSVUUoRlBERl9HZXRGaWxlVmVyc2lvbihkb2N1bWVudCgpLCAmdmVyc2lvbikpOworICBFWFBFQ1RfRVEoMTYsIHZlcnNpb24pOworfQorCiBURVNUX0YoRlBERlZpZXdFbWJlZGRlcnRlc3QsIFBhZ2UpIHsKICAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJhYm91dF9ibGFuay5wZGYiKSk7CiAgIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoMCk7CiAgIEVYUEVDVF9ORShudWxscHRyLCBwYWdlKTsKKwogICBFWFBFQ1RfRVEoNjEyLjAsIEZQREZfR2V0UGFnZVdpZHRoKHBhZ2UpKTsKICAgRVhQRUNUX0VRKDc5Mi4wLCBGUERGX0dldFBhZ2VIZWlnaHQocGFnZSkpOworCisgIEZTX1JFQ1RGIHJlY3Q7CisgIEVYUEVDVF9UUlVFKEZQREZfR2V0UGFnZUJvdW5kaW5nQm94KHBhZ2UsICZyZWN0KSk7CisgIEVYUEVDVF9FUSgwLjAsIHJlY3QubGVmdCk7CisgIEVYUEVDVF9FUSgwLjAsIHJlY3QuYm90dG9tKTsKKyAgRVhQRUNUX0VRKDYxMi4wLCByZWN0LnJpZ2h0KTsKKyAgRVhQRUNUX0VRKDc5Mi4wLCByZWN0LnRvcCk7CisKICAgVW5sb2FkUGFnZShwYWdlKTsKICAgRVhQRUNUX0VRKG51bGxwdHIsIExvYWRQYWdlKDEpKTsKIH0KQEAgLTMwNCw2ICszNTMsMTQgQEAKIC8vIHJlZmVyZW5jZSBsb29wLiBDcm9zcyByZWZlcmVuY2VzIHdpbGwgYmUgcmVidWlsdCBzdWNjZXNzZnVsbHkuCiBURVNUX0YoRlBERlZpZXdFbWJlZGRlcnRlc3QsIENyb3NzUmVmVjRMb29wKSB7CiAgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgiYnVnX3hyZWZ2NF9sb29wLnBkZiIpKTsKKyAgTW9ja0Rvd25sb2FkSGludHMgaGludHM7CisKKyAgLy8gTWFrZSBzdXJlIGNhbGxpbmcgRlBERkF2YWlsX0lzRG9jQXZhaWwoKSBvbiB0aGlzIGZpbGUgZG9lcyBub3QgaW5maW5pdGUKKyAgLy8gbG9vcCBlaXRoZXIuIFNlZSBidWcgODc1LgorICBpbnQgcmV0ID0gUERGX0RBVEFfTk9UQVZBSUw7CisgIHdoaWxlIChyZXQgPT0gUERGX0RBVEFfTk9UQVZBSUwpCisgICAgcmV0ID0gRlBERkF2YWlsX0lzRG9jQXZhaWwoYXZhaWxfLCAmaGludHMpOworICBFWFBFQ1RfRVEoUERGX0RBVEFfQVZBSUwsIHJldCk7CiB9CiAKIC8vIFRoZSB0ZXN0IHNob3VsZCBwYXNzIHdoZW4gY2lyY3VsYXIgcmVmZXJlbmNlcyB0byBQYXJzZUluZGlyZWN0T2JqZWN0IHdpbGwgbm90CkBAIC0zMjgsNTMgKzM4NSwyMTcgQEAKICAgRVhQRUNUX0ZBTFNFKE9wZW5Eb2N1bWVudCgiYnVnXzM2MC5wZGYiKSk7CiB9CiAKLVRFU1RfRihGUERGVmlld0VtYmVkZGVydGVzdCwgRlBERl9SZW5kZXJQYWdlQml0bWFwV2l0aE1hdHJpeCkgewotICBjb25zdCBjaGFyIGtBbGxCbGFja01kNXN1bVtdID0gIjU3MDhmYzVjNGE4YmQwYWJkZTk5YzhlOGYwMzkwNjE1IjsKLSAgY29uc3QgY2hhciBrVG9wTGVmdFF1YXJ0ZXJCbGFja01kNXN1bVtdID0gIjI0ZTRkMWVjMDZmYTAyNThhZjc1OGNmYzhiMmFkNTBhIjsKK3ZvaWQgRlBERlZpZXdFbWJlZGRlcnRlc3Q6OlRlc3RSZW5kZXJQYWdlQml0bWFwV2l0aE1hdHJpeCgKKyAgICBGUERGX1BBR0UgcGFnZSwKKyAgICBjb25zdCBpbnQgYml0bWFwX3dpZHRoLAorICAgIGNvbnN0IGludCBiaXRtYXBfaGVpZ2h0LAorICAgIGNvbnN0IEZTX01BVFJJWCYgbWF0cml4LAorICAgIGNvbnN0IEZTX1JFQ1RGJiByZWN0LAorICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX21kNSkgeworICBGUERGX0JJVE1BUCBiaXRtYXAgPSBGUERGQml0bWFwX0NyZWF0ZShiaXRtYXBfd2lkdGgsIGJpdG1hcF9oZWlnaHQsIDApOworICBGUERGQml0bWFwX0ZpbGxSZWN0KGJpdG1hcCwgMCwgMCwgYml0bWFwX3dpZHRoLCBiaXRtYXBfaGVpZ2h0LCAweEZGRkZGRkZGKTsKKyAgRlBERl9SZW5kZXJQYWdlQml0bWFwV2l0aE1hdHJpeChiaXRtYXAsIHBhZ2UsICZtYXRyaXgsICZyZWN0LCAwKTsKKyAgQ29tcGFyZUJpdG1hcChiaXRtYXAsIGJpdG1hcF93aWR0aCwgYml0bWFwX2hlaWdodCwgZXhwZWN0ZWRfbWQ1KTsKKyAgRlBERkJpdG1hcF9EZXN0cm95KGJpdG1hcCk7Cit9CiAKLSAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJibGFjay5wZGYiKSk7CitURVNUX0YoRlBERlZpZXdFbWJlZGRlcnRlc3QsIEZQREZfUmVuZGVyUGFnZUJpdG1hcFdpdGhNYXRyaXgpIHsKKyAgY29uc3QgY2hhciBrT3JpZ2luYWxNRDVbXSA9ICIwYTkwZGUzN2Y1MjEyNzYxOWMzZGZiNjQyYjVmYTJmZSI7CisgIGNvbnN0IGNoYXIga0NsaXBwZWRNRDVbXSA9ICJhODRjYWI5M2MxMDJiOWI5MjkwZmJhMzA0N2JhNzAyYyI7CisgIGNvbnN0IGNoYXIga1RvcExlZnRRdWFydGVyTUQ1W10gPSAiZjExYTExMTM3Yzg4MzQzODllMzFjZjU1NWE0YTY5NzkiOworICBjb25zdCBjaGFyIGtIb3JpU3RyZXRjaGVkTUQ1W10gPSAiNDhlZjkyMDU5NDFlZDE5NjkxY2NmYTAwZDcxNzE4N2UiOworICBjb25zdCBjaGFyIGtSb3RhdGVkOTBDbG9ja3dpc2VNRDVbXSA9ICJkOGRhMmM3YmY3NzUyMTU1MGQwZjI3NTJiOWNmMzQ4MiI7CisgIGNvbnN0IGNoYXIga1JvdGF0ZWQxODBDbG9ja3dpc2VNRDVbXSA9ICIwMTEzMzg2YmIwYmQ0NTEyNWJhY2M2ZGVlNzhiZmU3OCI7CisgIGNvbnN0IGNoYXIga1JvdGF0ZWQyNzBDbG9ja3dpc2VNRDVbXSA9ICJhMjg3ZTBmNzRjZTIwMzY5OWNkYTg5ZjljYzk3YTI0MCI7CisgIGNvbnN0IGNoYXIga01pcnJvckhvcmlNRDVbXSA9ICI2ZThkN2E2ZmRlMzlkOGU3MjBmYjllNjIwMTAyOTE4YyI7CisgIGNvbnN0IGNoYXIga01pcnJvclZlcnRNRDVbXSA9ICI4ZjNhNTU1ZWY5YzBkNTAzMTgzMWFlMzcxNTI3MzcwNyI7CisgIGNvbnN0IGNoYXIga0xhcmdlclRvcExlZnRRdWFydGVyTUQ1W10gPSAiMTcyYTJmNGFkYWZiYWRiZTk4MDE3YjFjMDI1YjllMjciOworICBjb25zdCBjaGFyIGtMYXJnZXJNRDVbXSA9ICJjODA2MTQ1NjQxYzNlNmZjNGUwMjJjNzA2NTM0Mzc0OSI7CisgIGNvbnN0IGNoYXIga0xhcmdlckNsaXBwZWRNRDVbXSA9ICIwOTFkM2IxYzc5MzNjOGY2OTQ1ZWIyY2I0MWU1ODhlOSI7CisgIGNvbnN0IGNoYXIga0xhcmdlclJvdGF0ZWRNRDVbXSA9ICIxMTVmMTMzNTNlYmZjODJkZGIzOTJkMWYwMDU5ZWIxMiI7CisgIGNvbnN0IGNoYXIga0xhcmdlclJvdGF0ZWRMYW5kc2NhcGVNRDVbXSA9ICJjOTAxMjM5ZDE3ZDg0YWM4NGNiNmYyMTI0ZGE3MWIwZCI7CisgIGNvbnN0IGNoYXIga0xhcmdlclJvdGF0ZWREaWFnb25hbE1ENVtdID0gIjNkNjI0MTc0NjhiZGFmZjBlYjE0MzkxYTBjMzBhM2IxIjsKKyAgY29uc3QgY2hhciBrVGlsZU1ENVtdID0gIjBhMTkwMDAzYzk3MjIwYmY4ODc3Njg0YzhkN2U4OWNmIjsKKworICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoInJlY3RhbmdsZXMucGRmIikpOwogICBGUERGX1BBR0UgcGFnZSA9IExvYWRQYWdlKDApOwogICBFWFBFQ1RfTkUobnVsbHB0ciwgcGFnZSk7Ci0gIGNvbnN0IGludCB3aWR0aCA9IHN0YXRpY19jYXN0PGludD4oRlBERl9HZXRQYWdlV2lkdGgocGFnZSkpOwotICBjb25zdCBpbnQgaGVpZ2h0ID0gc3RhdGljX2Nhc3Q8aW50PihGUERGX0dldFBhZ2VIZWlnaHQocGFnZSkpOwotICBFWFBFQ1RfRVEoNjEyLCB3aWR0aCk7Ci0gIEVYUEVDVF9FUSg3OTIsIGhlaWdodCk7CisgIGNvbnN0IGludCBwYWdlX3dpZHRoID0gc3RhdGljX2Nhc3Q8aW50PihGUERGX0dldFBhZ2VXaWR0aChwYWdlKSk7CisgIGNvbnN0IGludCBwYWdlX2hlaWdodCA9IHN0YXRpY19jYXN0PGludD4oRlBERl9HZXRQYWdlSGVpZ2h0KHBhZ2UpKTsKKyAgRVhQRUNUX0VRKDIwMCwgcGFnZV93aWR0aCk7CisgIEVYUEVDVF9FUSgzMDAsIHBhZ2VfaGVpZ2h0KTsKIAogICBGUERGX0JJVE1BUCBiaXRtYXAgPSBSZW5kZXJQYWdlKHBhZ2UpOwotICBDb21wYXJlQml0bWFwKGJpdG1hcCwgd2lkdGgsIGhlaWdodCwga0FsbEJsYWNrTWQ1c3VtKTsKKyAgQ29tcGFyZUJpdG1hcChiaXRtYXAsIHBhZ2Vfd2lkdGgsIHBhZ2VfaGVpZ2h0LCBrT3JpZ2luYWxNRDUpOwogICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsKIAorICBGU19SRUNURiBwYWdlX3JlY3R7MCwgMCwgcGFnZV93aWR0aCwgcGFnZV9oZWlnaHR9OworCiAgIC8vIFRyeSByZW5kZXJpbmcgd2l0aCBhbiBpZGVudGl0eSBtYXRyaXguIFRoZSBvdXRwdXQgc2hvdWxkIGJlIHRoZSBzYW1lIGFzCiAgIC8vIHRoZSBSZW5kZXJQYWdlKCkgb3V0cHV0LgotICBGU19NQVRSSVggbWF0cml4OwotICBtYXRyaXguYSA9IDE7Ci0gIG1hdHJpeC5iID0gMDsKLSAgbWF0cml4LmMgPSAwOwotICBtYXRyaXguZCA9IDE7Ci0gIG1hdHJpeC5lID0gMDsKLSAgbWF0cml4LmYgPSAwOworICBGU19NQVRSSVggaWRlbnRpdHlfbWF0cml4ezEsIDAsIDAsIDEsIDAsIDB9OworICBUZXN0UmVuZGVyUGFnZUJpdG1hcFdpdGhNYXRyaXgocGFnZSwgcGFnZV93aWR0aCwgcGFnZV9oZWlnaHQsIGlkZW50aXR5X21hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VfcmVjdCwga09yaWdpbmFsTUQ1KTsKIAotICBGU19SRUNURiByZWN0OwotICByZWN0LmxlZnQgPSAwOwotICByZWN0LnRvcCA9IDA7Ci0gIHJlY3QucmlnaHQgPSB3aWR0aDsKLSAgcmVjdC5ib3R0b20gPSBoZWlnaHQ7CisgIC8vIEFnYWluIHJlbmRlciB3aXRoIGFuIGlkZW50aXR5IG1hdHJpeCBidXQgd2l0aCBhIHNtYWxsZXIgY2xpcHBpbmcgcmVjdC4KKyAgRlNfUkVDVEYgbWlkZGxlX29mX3BhZ2VfcmVjdHtwYWdlX3dpZHRoIC8gNCwgcGFnZV9oZWlnaHQgLyA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2Vfd2lkdGggKiAzIC8gNCwgcGFnZV9oZWlnaHQgKiAzIC8gNH07CisgIFRlc3RSZW5kZXJQYWdlQml0bWFwV2l0aE1hdHJpeChwYWdlLCBwYWdlX3dpZHRoLCBwYWdlX2hlaWdodCwgaWRlbnRpdHlfbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlkZGxlX29mX3BhZ2VfcmVjdCwga0NsaXBwZWRNRDUpOwogCi0gIGJpdG1hcCA9IEZQREZCaXRtYXBfQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIDApOwotICBGUERGQml0bWFwX0ZpbGxSZWN0KGJpdG1hcCwgMCwgMCwgd2lkdGgsIGhlaWdodCwgMHhGRkZGRkZGRik7Ci0gIEZQREZfUmVuZGVyUGFnZUJpdG1hcFdpdGhNYXRyaXgoYml0bWFwLCBwYWdlLCAmbWF0cml4LCAmcmVjdCwgMCk7Ci0gIENvbXBhcmVCaXRtYXAoYml0bWFwLCB3aWR0aCwgaGVpZ2h0LCBrQWxsQmxhY2tNZDVzdW0pOwotICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsKKyAgLy8gTm93IHJlbmRlciBhZ2FpbiB3aXRoIHRoZSBpbWFnZSBzY2FsZWQgc21hbGxlci4KKyAgRlNfTUFUUklYIGhhbGZfc2NhbGVfbWF0cml4ezAuNSwgMCwgMCwgMC41LCAwLCAwfTsKKyAgVGVzdFJlbmRlclBhZ2VCaXRtYXBXaXRoTWF0cml4KHBhZ2UsIHBhZ2Vfd2lkdGgsIHBhZ2VfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsZl9zY2FsZV9tYXRyaXgsIHBhZ2VfcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUb3BMZWZ0UXVhcnRlck1ENSk7CiAKLSAgLy8gTm93IHJlbmRlciBhZ2FpbiB3aXRoIHRoZSBpbWFnZSBzY2FsZWQuCi0gIG1hdHJpeC5hID0gMC41OwotICBtYXRyaXguZCA9IDAuNTsKKyAgLy8gTm93IHJlbmRlciBhZ2FpbiB3aXRoIHRoZSBpbWFnZSBzY2FsZWQgbGFyZ2VyIGhvcml6b250YWxseSAodGhlIHJpZ2h0IGhhbGYKKyAgLy8gd2lsbCBiZSBjbGlwcGVkKS4KKyAgRlNfTUFUUklYIHN0cmV0Y2hfeF9tYXRyaXh7MiwgMCwgMCwgMSwgMCwgMH07CisgIFRlc3RSZW5kZXJQYWdlQml0bWFwV2l0aE1hdHJpeChwYWdlLCBwYWdlX3dpZHRoLCBwYWdlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmV0Y2hfeF9tYXRyaXgsIHBhZ2VfcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtIb3JpU3RyZXRjaGVkTUQ1KTsKIAotICBiaXRtYXAgPSBGUERGQml0bWFwX0NyZWF0ZSh3aWR0aCwgaGVpZ2h0LCAwKTsKLSAgRlBERkJpdG1hcF9GaWxsUmVjdChiaXRtYXAsIDAsIDAsIHdpZHRoLCBoZWlnaHQsIDB4RkZGRkZGRkYpOwotICBGUERGX1JlbmRlclBhZ2VCaXRtYXBXaXRoTWF0cml4KGJpdG1hcCwgcGFnZSwgJm1hdHJpeCwgJnJlY3QsIDApOwotICBDb21wYXJlQml0bWFwKGJpdG1hcCwgd2lkdGgsIGhlaWdodCwga1RvcExlZnRRdWFydGVyQmxhY2tNZDVzdW0pOwotICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsKKyAgLy8gVHJ5IGEgOTAgZGVncmVlIHJvdGF0aW9uIGNsb2Nrd2lzZSBidXQgd2l0aCB0aGUgc2FtZSBiaXRtYXAgc2l6ZSwgc28gcGFydAorICAvLyB3aWxsIGJlIGNsaXBwZWQuCisgIEZTX01BVFJJWCByb3RhdGVfOTBfbWF0cml4ezAsIDEsIC0xLCAwLCBwYWdlX3dpZHRoLCAwfTsKKyAgVGVzdFJlbmRlclBhZ2VCaXRtYXBXaXRoTWF0cml4KHBhZ2UsIHBhZ2Vfd2lkdGgsIHBhZ2VfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlXzkwX21hdHJpeCwgcGFnZV9yZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JvdGF0ZWQ5MENsb2Nrd2lzZU1ENSk7CisKKyAgLy8gMTgwIGRlZ3JlZSByb3RhdGlvbiBjbG9ja3dpc2UuCisgIEZTX01BVFJJWCByb3RhdGVfMTgwX21hdHJpeHstMSwgMCwgMCwgLTEsIHBhZ2Vfd2lkdGgsIHBhZ2VfaGVpZ2h0fTsKKyAgVGVzdFJlbmRlclBhZ2VCaXRtYXBXaXRoTWF0cml4KHBhZ2UsIHBhZ2Vfd2lkdGgsIHBhZ2VfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlXzE4MF9tYXRyaXgsIHBhZ2VfcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSb3RhdGVkMTgwQ2xvY2t3aXNlTUQ1KTsKKworICAvLyAyNzAgZGVncmVlIHJvdGF0aW9uIGNsb2Nrd2lzZS4KKyAgRlNfTUFUUklYIHJvdGF0ZV8yNzBfbWF0cml4ezAsIC0xLCAxLCAwLCAwLCBwYWdlX3dpZHRofTsKKyAgVGVzdFJlbmRlclBhZ2VCaXRtYXBXaXRoTWF0cml4KHBhZ2UsIHBhZ2Vfd2lkdGgsIHBhZ2VfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlXzI3MF9tYXRyaXgsIHBhZ2VfcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSb3RhdGVkMjcwQ2xvY2t3aXNlTUQ1KTsKKworICAvLyBNaXJyb3IgaG9yaXpvbnRhbGx5LgorICBGU19NQVRSSVggbWlycm9yX2hvcmlfbWF0cml4ey0xLCAwLCAwLCAxLCBwYWdlX3dpZHRoLCAwfTsKKyAgVGVzdFJlbmRlclBhZ2VCaXRtYXBXaXRoTWF0cml4KHBhZ2UsIHBhZ2Vfd2lkdGgsIHBhZ2VfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlycm9yX2hvcmlfbWF0cml4LCBwYWdlX3JlY3QsIGtNaXJyb3JIb3JpTUQ1KTsKKworICAvLyBNaXJyb3IgdmVydGljYWxseS4KKyAgRlNfTUFUUklYIG1pcnJvcl92ZXJ0X21hdHJpeHsxLCAwLCAwLCAtMSwgMCwgcGFnZV9oZWlnaHR9OworICBUZXN0UmVuZGVyUGFnZUJpdG1hcFdpdGhNYXRyaXgocGFnZSwgcGFnZV93aWR0aCwgcGFnZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXJyb3JfdmVydF9tYXRyaXgsIHBhZ2VfcmVjdCwga01pcnJvclZlcnRNRDUpOworCisgIC8vIFRlc3RzIHJlbmRlcmluZyB0byBhIGxhcmdlciBiaXRtYXAKKyAgY29uc3QgaW50IGJpdG1hcF93aWR0aCA9IHBhZ2Vfd2lkdGggKiAyOworICBjb25zdCBpbnQgYml0bWFwX2hlaWdodCA9IHBhZ2VfaGVpZ2h0ICogMjsKKworICAvLyBSZW5kZXIgdXNpbmcgYW4gaWRlbnRpdHkgbWF0cml4IGFuZCB0aGUgd2hvbGUgYml0bWFwIGFyZWEgYXMgY2xpcHBpbmcgcmVjdC4KKyAgRlNfUkVDVEYgYml0bWFwX3JlY3R7MCwgMCwgYml0bWFwX3dpZHRoLCBiaXRtYXBfaGVpZ2h0fTsKKyAgVGVzdFJlbmRlclBhZ2VCaXRtYXBXaXRoTWF0cml4KHBhZ2UsIGJpdG1hcF93aWR0aCwgYml0bWFwX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aXR5X21hdHJpeCwgYml0bWFwX3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTGFyZ2VyVG9wTGVmdFF1YXJ0ZXJNRDUpOworCisgIC8vIFJlbmRlciB1c2luZyBhIHNjYWxpbmcgbWF0cml4IHRvIGZpbGwgdGhlIGxhcmdlciBiaXRtYXAuCisgIEZTX01BVFJJWCBkb3VibGVfc2NhbGVfbWF0cml4ezIsIDAsIDAsIDIsIDAsIDB9OworICBUZXN0UmVuZGVyUGFnZUJpdG1hcFdpdGhNYXRyaXgocGFnZSwgYml0bWFwX3dpZHRoLCBiaXRtYXBfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlX3NjYWxlX21hdHJpeCwgYml0bWFwX3JlY3QsIGtMYXJnZXJNRDUpOworCisgIC8vIFJlbmRlciB0aGUgbGFyZ2VyIGltYWdlIGFnYWluIGJ1dCB3aXRoIGNsaXBwaW5nLgorICBGU19SRUNURiBtaWRkbGVfb2ZfYml0bWFwX3JlY3R7Yml0bWFwX3dpZHRoIC8gNCwgYml0bWFwX2hlaWdodCAvIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXBfd2lkdGggKiAzIC8gNCwgYml0bWFwX2hlaWdodCAqIDMgLyA0fTsKKyAgVGVzdFJlbmRlclBhZ2VCaXRtYXBXaXRoTWF0cml4KHBhZ2UsIGJpdG1hcF93aWR0aCwgYml0bWFwX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZV9zY2FsZV9tYXRyaXgsIG1pZGRsZV9vZl9iaXRtYXBfcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtMYXJnZXJDbGlwcGVkTUQ1KTsKKworICAvLyBPbiB0aGUgbGFyZ2VyIGJpdG1hcCwgdHJ5IGEgOTAgZGVncmVlIHJvdGF0aW9uIGJ1dCB3aXRoIHRoZSBzYW1lIGJpdG1hcAorICAvLyBzaXplLCBzbyBwYXJ0IHdpbGwgYmUgY2xpcHBlZC4KKyAgRlNfTUFUUklYIHJvdGF0ZV85MF9zY2FsZV8yX21hdHJpeHswLCAyLCAtMiwgMCwgYml0bWFwX3dpZHRoLCAwfTsKKyAgVGVzdFJlbmRlclBhZ2VCaXRtYXBXaXRoTWF0cml4KHBhZ2UsIGJpdG1hcF93aWR0aCwgYml0bWFwX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0ZV85MF9zY2FsZV8yX21hdHJpeCwgYml0bWFwX3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTGFyZ2VyUm90YXRlZE1ENSk7CisKKyAgLy8gT24gdGhlIGxhcmdlciBiaXRtYXAsIGFwcGx5IDkwIGRlZ3JlZSByb3RhdGlvbiB0byBhIGJpdG1hcCB3aXRoIHRoZQorICAvLyBhcHByb3ByaWF0ZSBkaW1lbnNpb25zLgorICBjb25zdCBpbnQgbGFuZHNjYXBlX2JpdG1hcF93aWR0aCA9IGJpdG1hcF9oZWlnaHQ7CisgIGNvbnN0IGludCBsYW5kc2NhcGVfYml0bWFwX2hlaWdodCA9IGJpdG1hcF93aWR0aDsKKyAgRlNfUkVDVEYgbGFuZHNjYXBlX2JpdG1hcF9yZWN0ezAsIDAsIGxhbmRzY2FwZV9iaXRtYXBfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5kc2NhcGVfYml0bWFwX2hlaWdodH07CisgIEZTX01BVFJJWCBsYW5kc2NhcGVfcm90YXRlXzkwX3NjYWxlXzJfbWF0cml4eworICAgICAgMCwgMiwgLTIsIDAsIGxhbmRzY2FwZV9iaXRtYXBfd2lkdGgsIDB9OworICBUZXN0UmVuZGVyUGFnZUJpdG1hcFdpdGhNYXRyaXgoCisgICAgICBwYWdlLCBsYW5kc2NhcGVfYml0bWFwX3dpZHRoLCBsYW5kc2NhcGVfYml0bWFwX2hlaWdodCwKKyAgICAgIGxhbmRzY2FwZV9yb3RhdGVfOTBfc2NhbGVfMl9tYXRyaXgsIGxhbmRzY2FwZV9iaXRtYXBfcmVjdCwKKyAgICAgIGtMYXJnZXJSb3RhdGVkTGFuZHNjYXBlTUQ1KTsKKworICAvLyBPbiB0aGUgbGFyZ2VyIGJpdG1hcCwgYXBwbHkgNDUgZGVncmVlIHJvdGF0aW9uIHRvIGEgYml0bWFwIHdpdGggdGhlCisgIC8vIGFwcHJvcHJpYXRlIGRpbWVuc2lvbnMuCisgIGNvbnN0IGZsb2F0IHNxcnQyID0gMS40MTQyMTM1NmY7CisgIGNvbnN0IGludCBkaWFnb25hbF9iaXRtYXBfc2l6ZSA9IGNlaWwoKGJpdG1hcF93aWR0aCArIGJpdG1hcF9oZWlnaHQpIC8gc3FydDIpOworICBGU19SRUNURiBkaWFnb25hbF9iaXRtYXBfcmVjdHswLCAwLCBkaWFnb25hbF9iaXRtYXBfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZ29uYWxfYml0bWFwX3NpemV9OworICBGU19NQVRSSVggcm90YXRlXzQ1X3NjYWxlXzJfbWF0cml4eworICAgICAgc3FydDIsIHNxcnQyLCAtc3FydDIsIHNxcnQyLCBiaXRtYXBfaGVpZ2h0IC8gc3FydDIsIDB9OworICBUZXN0UmVuZGVyUGFnZUJpdG1hcFdpdGhNYXRyaXgocGFnZSwgZGlhZ29uYWxfYml0bWFwX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWFnb25hbF9iaXRtYXBfc2l6ZSwgcm90YXRlXzQ1X3NjYWxlXzJfbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZ29uYWxfYml0bWFwX3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTGFyZ2VyUm90YXRlZERpYWdvbmFsTUQ1KTsKKworICAvLyBSZW5kZXIgdGhlICgyLCAxKSB0aWxlIG9mIHRoZSBwYWdlICh0aGlyZCBjb2x1bW4sIHNlY29uZCByb3cpIHdoZW4gdGhlIHBhZ2UKKyAgLy8gaXMgZGl2aWRlZCBpbiA1MHg1MCBwaXhlbCB0aWxlcy4gVGhlIHRpbGUgaXMgc2NhbGVkIGJ5IGEgZmFjdG9yIG9mIDcuCisgIGNvbnN0IGZsb2F0IHNjYWxlID0gNy4wOworICBjb25zdCBpbnQgdGlsZV9zaXplID0gNTA7CisgIGNvbnN0IGludCB0aWxlX3ggPSAyOworICBjb25zdCBpbnQgdGlsZV95ID0gMTsKKyAgaW50IHRpbGVfYml0bWFwX3NpemUgPSBzY2FsZSAqIHRpbGVfc2l6ZTsKKyAgRlNfUkVDVEYgdGlsZV9iaXRtYXBfcmVjdHswLCAwLCB0aWxlX2JpdG1hcF9zaXplLCB0aWxlX2JpdG1hcF9zaXplfTsKKyAgRlNfTUFUUklYIHRpbGVfMl8xX21hdHJpeHtzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXRpbGVfeCAqIHRpbGVfYml0bWFwX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXRpbGVfeSAqIHRpbGVfYml0bWFwX3NpemV9OworICBUZXN0UmVuZGVyUGFnZUJpdG1hcFdpdGhNYXRyaXgocGFnZSwgdGlsZV9iaXRtYXBfc2l6ZSwgdGlsZV9iaXRtYXBfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfMl8xX21hdHJpeCwgdGlsZV9iaXRtYXBfcmVjdCwga1RpbGVNRDUpOwogCiAgIFVubG9hZFBhZ2UocGFnZSk7CiB9CisKK2NsYXNzIFVuU3VwUmVjb3JkRGVsZWdhdGUgOiBwdWJsaWMgRW1iZWRkZXJUZXN0OjpEZWxlZ2F0ZSB7CisgcHVibGljOgorICBVblN1cFJlY29yZERlbGVnYXRlKCkgOiB0eXBlXygtMSkge30KKyAgflVuU3VwUmVjb3JkRGVsZWdhdGUoKSBvdmVycmlkZSB7fQorCisgIHZvaWQgVW5zdXBwb3J0ZWRIYW5kbGVyKGludCB0eXBlKSBvdmVycmlkZSB7IHR5cGVfID0gdHlwZTsgfQorCisgIGludCB0eXBlXzsKK307CisKK1RFU1RfRihGUERGVmlld0VtYmVkZGVydGVzdCwgVW5TdXBwb3J0ZWRPcGVyYXRpb25zX05vdEZvdW5kKSB7CisgIFVuU3VwUmVjb3JkRGVsZWdhdGUgZGVsZWdhdGU7CisgIFNldERlbGVnYXRlKCZkZWxlZ2F0ZSk7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgiaGVsbG9fd29ybGQucGRmIikpOworICBFWFBFQ1RfRVEoZGVsZWdhdGUudHlwZV8sIC0xKTsKKyAgU2V0RGVsZWdhdGUobnVsbHB0cik7Cit9CisKK1RFU1RfRihGUERGVmlld0VtYmVkZGVydGVzdCwgVW5TdXBwb3J0ZWRPcGVyYXRpb25zX0xvYWRDdXN0b21Eb2N1bWVudCkgeworICBVblN1cFJlY29yZERlbGVnYXRlIGRlbGVnYXRlOworICBTZXREZWxlZ2F0ZSgmZGVsZWdhdGUpOworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInVuc3VwcG9ydGVkX2ZlYXR1cmUucGRmIikpOworICBFWFBFQ1RfRVEoRlBERl9VTlNQX0RPQ19QT1JUQUJMRUNPTExFQ1RJT04sIGRlbGVnYXRlLnR5cGVfKTsKKyAgU2V0RGVsZWdhdGUobnVsbHB0cik7Cit9CisKK1RFU1RfRihGUERGVmlld0VtYmVkZGVydGVzdCwgVW5TdXBwb3J0ZWRPcGVyYXRpb25zX0xvYWREb2N1bWVudCkgeworICBzdGQ6OnN0cmluZyBmaWxlX3BhdGg7CisgIEFTU0VSVF9UUlVFKAorICAgICAgUGF0aFNlcnZpY2U6OkdldFRlc3RGaWxlUGF0aCgidW5zdXBwb3J0ZWRfZmVhdHVyZS5wZGYiLCAmZmlsZV9wYXRoKSk7CisKKyAgVW5TdXBSZWNvcmREZWxlZ2F0ZSBkZWxlZ2F0ZTsKKyAgU2V0RGVsZWdhdGUoJmRlbGVnYXRlKTsKKyAgRlBERl9ET0NVTUVOVCBkb2MgPSBGUERGX0xvYWREb2N1bWVudChmaWxlX3BhdGguY19zdHIoKSwgIiIpOworICBFWFBFQ1RfVFJVRShkb2MgIT0gbnVsbHB0cik7CisgIEVYUEVDVF9FUShGUERGX1VOU1BfRE9DX1BPUlRBQkxFQ09MTEVDVElPTiwgZGVsZWdhdGUudHlwZV8pOworICBGUERGX0Nsb3NlRG9jdW1lbnQoZG9jKTsKKyAgU2V0RGVsZWdhdGUobnVsbHB0cik7Cit9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZ2aWV3X3VuaXR0ZXN0LmNwcCBiL2ZwZGZzZGsvZnBkZnZpZXdfdW5pdHRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzY4MGIzLi4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvZnBkZnZpZXdfdW5pdHRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCi0KLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5oIgotCi1URVNUKEZQREZWaWV3LCBEb3VibGVJbml0KSB7Ci0gIEZQREZfSW5pdExpYnJhcnkoKTsKLSAgRlBERl9Jbml0TGlicmFyeSgpOwotICBGUERGX0Rlc3Ryb3lMaWJyYXJ5KCk7Ci19Ci0KLVRFU1QoRlBERlZpZXcsIERvdWJsZURlc3Ryb3kpIHsKLSAgRlBERl9Jbml0TGlicmFyeSgpOwotICBGUERGX0Rlc3Ryb3lMaWJyYXJ5KCk7Ci0gIEZQREZfRGVzdHJveUxpYnJhcnkoKTsKLX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnBkZnhmYS9ERVBTIGIvZnBkZnNkay9mcGRmeGZhL0RFUFMKaW5kZXggMTY4N2UzMC4uNWJhNzVmMiAxMDA2NDQKLS0tIGEvZnBkZnNkay9mcGRmeGZhL0RFUFMKKysrIGIvZnBkZnNkay9mcGRmeGZhL0RFUFMKQEAgLTEsNCArMSw1IEBACiBpbmNsdWRlX3J1bGVzID0gWwogICAnK2Z4anMnLAotICAnK3hmYS9meGJhcmNvZGUnLAorICAnK2Z4YmFyY29kZScsCisgICcreGZhL2ZnYXMvZm9udCcsCiBdCmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZ4ZmEvY3BkZnhmYV9jb250ZXh0LmNwcCBiL2ZwZGZzZGsvZnBkZnhmYS9jcGRmeGZhX2NvbnRleHQuY3BwCmluZGV4IDg4Yzg4YTEuLmQwNWUyZjYgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvZnBkZnhmYS9jcGRmeGZhX2NvbnRleHQuY3BwCisrKyBiL2ZwZGZzZGsvZnBkZnhmYS9jcGRmeGZhX2NvbnRleHQuY3BwCkBAIC02LDYgKzYsNyBAQAogCiAjaW5jbHVkZSAiZnBkZnNkay9mcGRmeGZhL2NwZGZ4ZmFfY29udGV4dC5oIgogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPHV0aWxpdHk+CiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaCIKQEAgLTE1LDE4ICsxNiwxOSBAQAogI2luY2x1ZGUgImZwZGZzZGsvZnBkZnhmYS9jcGRmeGZhX3BhZ2UuaCIKICNpbmNsdWRlICJmcGRmc2RrL2ZwZGZ4ZmEvY3hmYV9md2xhZGFwdGVydGltZXJtZ3IuaCIKICNpbmNsdWRlICJmcGRmc2RrL2ZzZGtfZGVmaW5lLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L2Nqc19ydW50aW1lLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L2lqc19ydW50aW1lLmgiCisjaW5jbHVkZSAiZnhqcy9janNfcnVudGltZS5oIgorI2luY2x1ZGUgImZ4anMvaWpzX3J1bnRpbWUuaCIKICNpbmNsdWRlICJwdWJsaWMvZnBkZl9mb3JtZmlsbC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisjaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9jZmdhc19kZWZhdWx0Zm9udG1hbmFnZXIuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZhcHAuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZkb2MuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZkb2N2aWV3LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmcGFnZXZpZXcuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZ3aWRnZXRoYW5kbGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZvbnRtZ3IuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmYXBwLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRvYy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZkb2N2aWV3LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZnBhZ2V2aWV3LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZndpZGdldGhhbmRsZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZvbnRtZ3IuaCIKIAogI2lmbmRlZiBfV0lOMzIKIGV4dGVybiB2b2lkIFNldExhc3RFcnJvcihpbnQgZXJyKTsKQEAgLTM0LDE1ICszNiwxMCBAQAogI2VuZGlmCiAKIENQREZYRkFfQ29udGV4dDo6Q1BERlhGQV9Db250ZXh0KHN0ZDo6dW5pcXVlX3B0cjxDUERGX0RvY3VtZW50PiBwUERGRG9jKQotICAgIDogbV9pRG9jVHlwZShET0NUWVBFX1BERiksCi0gICAgICBtX3BQREZEb2Moc3RkOjptb3ZlKHBQREZEb2MpKSwKLSAgICAgIG1fcEZvcm1GaWxsRW52KG51bGxwdHIpLAotICAgICAgbV9wWEZBRG9jVmlldyhudWxscHRyKSwKLSAgICAgIG1fbkxvYWRTdGF0dXMoRlhGQV9MT0FEU1RBVFVTX1BSRUxPQUQpLAotICAgICAgbV9uUGFnZUNvdW50KDApLAorICAgIDogbV9wUERGRG9jKHN0ZDo6bW92ZShwUERGRG9jKSksCisgICAgICBtX3BYRkFBcHAocGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRkZBcHA+KHRoaXMpKSwKICAgICAgIG1fRG9jRW52KHRoaXMpIHsKLSAgbV9wWEZBQXBwID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRkZBcHA+KHRoaXMpOwotICBtX3BYRkFBcHAtPlNldERlZmF1bHRGb250TWdyKHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0RlZkZvbnRNZ3I+KCkpOworICBtX3BYRkFBcHAtPlNldERlZmF1bHRGb250TWdyKHBkZml1bTo6TWFrZVVuaXF1ZTxDRkdBU19EZWZhdWx0Rm9udE1hbmFnZXI+KCkpOwogfQogCiBDUERGWEZBX0NvbnRleHQ6On5DUERGWEZBX0NvbnRleHQoKSB7CkBAIC01Niw3ICs1Myw3IEBACiAgICAgLy8gT25jZSB3ZSdyZSBkZWxldGVkIHRoZSBGb3JtRmlsbEVudmlyb25tZW50IHdpbGwgcG9pbnQgYXQgYSBiYWQgdW5kZXJseWluZwogICAgIC8vIGRvYyBzbyB3ZSBuZWVkIHRvIHJlc2V0IGl0IC4uLgogICAgIG1fcEZvcm1GaWxsRW52LT5SZXNldFhGQURvY3VtZW50KCk7Ci0gICAgbV9wRm9ybUZpbGxFbnYgPSBudWxscHRyOworICAgIG1fcEZvcm1GaWxsRW52LlJlc2V0KCk7CiAgIH0KIAogICBtX25Mb2FkU3RhdHVzID0gRlhGQV9MT0FEU1RBVFVTX0NMT1NFRDsKQEAgLTY1LDkgKzYyLDEwIEBACiB2b2lkIENQREZYRkFfQ29udGV4dDo6Q2xvc2VYRkFEb2MoKSB7CiAgIGlmICghbV9wWEZBRG9jKQogICAgIHJldHVybjsKKworICBtX3BYRkFEb2NWaWV3ID0gbnVsbHB0cjsKICAgbV9wWEZBRG9jLT5DbG9zZURvYygpOwogICBtX3BYRkFEb2MucmVzZXQoKTsKLSAgbV9wWEZBRG9jVmlldyA9IG51bGxwdHI7CiB9CiAKIHZvaWQgQ1BERlhGQV9Db250ZXh0OjpTZXRGb3JtRmlsbEVudigKQEAgLTc4LDcgKzc2LDcgQEAKICAgaWYgKG1fcFhGQURvYyAmJiBtX3BYRkFEb2MtPkdldFhGQURvYygpKQogICAgIG1fcFhGQURvYy0+R2V0WEZBRG9jKCktPkNsZWFyTGF5b3V0RGF0YSgpOwogCi0gIG1fcEZvcm1GaWxsRW52ID0gcEZvcm1GaWxsRW52OworICBtX3BGb3JtRmlsbEVudi5SZXNldChwRm9ybUZpbGxFbnYpOwogfQogCiBib29sIENQREZYRkFfQ29udGV4dDo6TG9hZFhGQURvYygpIHsKQEAgLTk4LDE0ICs5Niw4IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgQ1hGQV9GRkRvY0hhbmRsZXIqIHBEb2NIYW5kbGVyID0gcEFwcC0+R2V0RG9jSGFuZGxlcigpOwotICBpZiAoIXBEb2NIYW5kbGVyKSB7Ci0gICAgU2V0TGFzdEVycm9yKEZQREZfRVJSX1hGQUxPQUQpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCiAgIG1fcFhGQURvYy0+U3RhcnRMb2FkKCk7Ci0gIGludCBpU3RhdHVzID0gbV9wWEZBRG9jLT5Eb0xvYWQobnVsbHB0cik7CisgIGludCBpU3RhdHVzID0gbV9wWEZBRG9jLT5Eb0xvYWQoKTsKICAgaWYgKGlTdGF0dXMgIT0gWEZBX1BBUlNFU1RBVFVTX0RvbmUpIHsKICAgICBDbG9zZVhGQURvYygpOwogICAgIFNldExhc3RFcnJvcihGUERGX0VSUl9YRkFMT0FEKTsKQEAgLTExNCwxOSArMTA2LDE5IEBACiAgIG1fcFhGQURvYy0+U3RvcExvYWQoKTsKICAgbV9wWEZBRG9jLT5HZXRYRkFEb2MoKS0+SW5pdFNjcmlwdENvbnRleHQoR2V0SlNFUnVudGltZSgpKTsKIAotICBpZiAobV9wWEZBRG9jLT5HZXREb2NUeXBlKCkgPT0gWEZBX0RPQ1RZUEVfRHluYW1pYykKLSAgICBtX2lEb2NUeXBlID0gRE9DVFlQRV9EWU5BTUlDX1hGQTsKKyAgaWYgKG1fcFhGQURvYy0+R2V0Rm9ybVR5cGUoKSA9PSBGb3JtVHlwZTo6a1hGQUZ1bGwpCisgICAgbV9Gb3JtVHlwZSA9IEZvcm1UeXBlOjprWEZBRnVsbDsKICAgZWxzZQotICAgIG1faURvY1R5cGUgPSBET0NUWVBFX1NUQVRJQ19YRkE7CisgICAgbV9Gb3JtVHlwZSA9IEZvcm1UeXBlOjprWEZBRm9yZWdyb3VuZDsKIAotICBtX3BYRkFEb2NWaWV3ID0gbV9wWEZBRG9jLT5DcmVhdGVEb2NWaWV3KFhGQV9ET0NWSUVXX1ZpZXcpOworICBtX3BYRkFEb2NWaWV3ID0gbV9wWEZBRG9jLT5DcmVhdGVEb2NWaWV3KCk7CiAgIGlmIChtX3BYRkFEb2NWaWV3LT5TdGFydExheW91dCgpIDwgMCkgewogICAgIENsb3NlWEZBRG9jKCk7CiAgICAgU2V0TGFzdEVycm9yKEZQREZfRVJSX1hGQUxBWU9VVCk7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgbV9wWEZBRG9jVmlldy0+RG9MYXlvdXQobnVsbHB0cik7CisgIG1fcFhGQURvY1ZpZXctPkRvTGF5b3V0KCk7CiAgIG1fcFhGQURvY1ZpZXctPlN0b3BMYXlvdXQoKTsKICAgbV9uTG9hZFN0YXR1cyA9IEZYRkFfTE9BRFNUQVRVU19MT0FERUQ7CiAKQEAgLTEzNyw1OSArMTI5LDUzIEBACiAgIGlmICghbV9wUERGRG9jICYmICFtX3BYRkFEb2MpCiAgICAgcmV0dXJuIDA7CiAKLSAgc3dpdGNoIChtX2lEb2NUeXBlKSB7Ci0gICAgY2FzZSBET0NUWVBFX1BERjoKLSAgICBjYXNlIERPQ1RZUEVfU1RBVElDX1hGQToKKyAgc3dpdGNoIChtX0Zvcm1UeXBlKSB7CisgICAgY2FzZSBGb3JtVHlwZTo6a05vbmU6CisgICAgY2FzZSBGb3JtVHlwZTo6a0Fjcm9Gb3JtOgorICAgIGNhc2UgRm9ybVR5cGU6OmtYRkFGb3JlZ3JvdW5kOgogICAgICAgaWYgKG1fcFBERkRvYykKICAgICAgICAgcmV0dXJuIG1fcFBERkRvYy0+R2V0UGFnZUNvdW50KCk7Ci0gICAgY2FzZSBET0NUWVBFX0RZTkFNSUNfWEZBOgorICAgIGNhc2UgRm9ybVR5cGU6OmtYRkFGdWxsOgogICAgICAgaWYgKG1fcFhGQURvYykKICAgICAgICAgcmV0dXJuIG1fcFhGQURvY1ZpZXctPkNvdW50UGFnZVZpZXdzKCk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwOwogICB9CisgIHJldHVybiAwOwogfQogCi1DUERGWEZBX1BhZ2UqIENQREZYRkFfQ29udGV4dDo6R2V0WEZBUGFnZShpbnQgcGFnZV9pbmRleCkgeworUmV0YWluUHRyPENQREZYRkFfUGFnZT4gQ1BERlhGQV9Db250ZXh0OjpHZXRYRkFQYWdlKGludCBwYWdlX2luZGV4KSB7CiAgIGlmIChwYWdlX2luZGV4IDwgMCkKICAgICByZXR1cm4gbnVsbHB0cjsKIAotICBDUERGWEZBX1BhZ2UqIHBQYWdlID0gbnVsbHB0cjsKLSAgaW50IG5Db3VudCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50PihtX1hGQVBhZ2VMaXN0KTsKLSAgaWYgKG5Db3VudCA+IDAgJiYgcGFnZV9pbmRleCA8IG5Db3VudCkgewotICAgIHBQYWdlID0gbV9YRkFQYWdlTGlzdFtwYWdlX2luZGV4XTsKLSAgICBpZiAocFBhZ2UpIHsKLSAgICAgIHBQYWdlLT5SZXRhaW4oKTsKLSAgICAgIHJldHVybiBwUGFnZTsKLSAgICB9CisgIGlmIChwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9YRkFQYWdlTGlzdCwgcGFnZV9pbmRleCkpIHsKKyAgICBpZiAobV9YRkFQYWdlTGlzdFtwYWdlX2luZGV4XSkKKyAgICAgIHJldHVybiBtX1hGQVBhZ2VMaXN0W3BhZ2VfaW5kZXhdOwogICB9IGVsc2UgewogICAgIG1fblBhZ2VDb3VudCA9IEdldFBhZ2VDb3VudCgpOwogICAgIG1fWEZBUGFnZUxpc3QucmVzaXplKG1fblBhZ2VDb3VudCk7CiAgIH0KIAotICBwUGFnZSA9IG5ldyBDUERGWEZBX1BhZ2UodGhpcywgcGFnZV9pbmRleCk7Ci0gIGlmICghcFBhZ2UtPkxvYWRQYWdlKCkpIHsKLSAgICBwUGFnZS0+UmVsZWFzZSgpOworICBhdXRvIHBQYWdlID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZYRkFfUGFnZT4odGhpcywgcGFnZV9pbmRleCk7CisgIGlmICghcFBhZ2UtPkxvYWRQYWdlKCkpCiAgICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgaWYgKHBhZ2VfaW5kZXggPj0gMCAmJgotICAgICAgcGFnZV9pbmRleCA8IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50PihtX1hGQVBhZ2VMaXN0KSkgeworCisgIGlmIChwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9YRkFQYWdlTGlzdCwgcGFnZV9pbmRleCkpCiAgICAgbV9YRkFQYWdlTGlzdFtwYWdlX2luZGV4XSA9IHBQYWdlOwotICB9CisKICAgcmV0dXJuIHBQYWdlOwogfQogCi1DUERGWEZBX1BhZ2UqIENQREZYRkFfQ29udGV4dDo6R2V0WEZBUGFnZShDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlKSBjb25zdCB7CitSZXRhaW5QdHI8Q1BERlhGQV9QYWdlPiBDUERGWEZBX0NvbnRleHQ6OkdldFhGQVBhZ2UoCisgICAgQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZSkgY29uc3QgewogICBpZiAoIXBQYWdlKQogICAgIHJldHVybiBudWxscHRyOwogCiAgIGlmICghbV9wWEZBRG9jKQogICAgIHJldHVybiBudWxscHRyOwogCi0gIGlmIChtX2lEb2NUeXBlICE9IERPQ1RZUEVfRFlOQU1JQ19YRkEpCisgIGlmIChtX0Zvcm1UeXBlICE9IEZvcm1UeXBlOjprWEZBRnVsbCkKICAgICByZXR1cm4gbnVsbHB0cjsKIAotICBmb3IgKENQREZYRkFfUGFnZSogcFRlbXBQYWdlIDogbV9YRkFQYWdlTGlzdCkgeworICBmb3IgKGF1dG8mIHBUZW1wUGFnZSA6IG1fWEZBUGFnZUxpc3QpIHsKICAgICBpZiAocFRlbXBQYWdlICYmIHBUZW1wUGFnZS0+R2V0WEZBUGFnZVZpZXcoKSA9PSBwUGFnZSkKICAgICAgIHJldHVybiBwVGVtcFBhZ2U7CiAgIH0KQEAgLTIwMywyMCArMTg5LDggQEAKICAgaWYgKG1fcFBERkRvYykKICAgICBtX3BQREZEb2MtPkRlbGV0ZVBhZ2UocGFnZV9pbmRleCk7CiAKLSAgaWYgKHBhZ2VfaW5kZXggPCAwIHx8Ci0gICAgICBwYWdlX2luZGV4ID49IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50PihtX1hGQVBhZ2VMaXN0KSkgewotICAgIHJldHVybjsKLSAgfQotICBpZiAoQ1BERlhGQV9QYWdlKiBwUGFnZSA9IG1fWEZBUGFnZUxpc3RbcGFnZV9pbmRleF0pCi0gICAgcFBhZ2UtPlJlbGVhc2UoKTsKLX0KLQotdm9pZCBDUERGWEZBX0NvbnRleHQ6OlJlbW92ZVBhZ2UoQ1BERlhGQV9QYWdlKiBwYWdlKSB7Ci0gIGludCBwYWdlX2luZGV4ID0gcGFnZS0+R2V0UGFnZUluZGV4KCk7Ci0gIGlmIChwYWdlX2luZGV4ID49IDAgJiYKLSAgICAgIHBhZ2VfaW5kZXggPCBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludD4obV9YRkFQYWdlTGlzdCkpIHsKLSAgICBtX1hGQVBhZ2VMaXN0W3BhZ2VfaW5kZXhdID0gbnVsbHB0cjsKLSAgfQorICBpZiAocGRmaXVtOjpJbmRleEluQm91bmRzKG1fWEZBUGFnZUxpc3QsIHBhZ2VfaW5kZXgpKQorICAgIG1fWEZBUGFnZUxpc3RbcGFnZV9pbmRleF0uUmVzZXQoKTsKIH0KIAogdm9pZCBDUERGWEZBX0NvbnRleHQ6OkNsZWFyQ2hhbmdlTWFyaygpIHsKQEAgLTIzNCwxOSArMjA4LDE5IEBACiAgIHJldHVybiBydW50aW1lLT5HZXRJc29sYXRlKCk7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQREZYRkFfQ29udGV4dDo6R2V0QXBwVGl0bGUoKSBjb25zdCB7CitXaWRlU3RyaW5nIENQREZYRkFfQ29udGV4dDo6R2V0QXBwVGl0bGUoKSBjb25zdCB7CiAgIHJldHVybiBMIlBERml1bSI7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQREZYRkFfQ29udGV4dDo6R2V0QXBwTmFtZSgpIHsKK1dpZGVTdHJpbmcgQ1BERlhGQV9Db250ZXh0OjpHZXRBcHBOYW1lKCkgewogICByZXR1cm4gbV9wRm9ybUZpbGxFbnYgPyBtX3BGb3JtRmlsbEVudi0+RkZJX0dldEFwcE5hbWUoKSA6IEwiIjsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERlhGQV9Db250ZXh0OjpHZXRMYW5ndWFnZSgpIHsKK1dpZGVTdHJpbmcgQ1BERlhGQV9Db250ZXh0OjpHZXRMYW5ndWFnZSgpIHsKICAgcmV0dXJuIG1fcEZvcm1GaWxsRW52ID8gbV9wRm9ybUZpbGxFbnYtPkdldExhbmd1YWdlKCkgOiBMIiI7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENQREZYRkFfQ29udGV4dDo6R2V0UGxhdGZvcm0oKSB7CitXaWRlU3RyaW5nIENQREZYRkFfQ29udGV4dDo6R2V0UGxhdGZvcm0oKSB7CiAgIHJldHVybiBtX3BGb3JtRmlsbEVudiA/IG1fcEZvcm1GaWxsRW52LT5HZXRQbGF0Zm9ybSgpIDogTCIiOwogfQogCkBAIC0yNTUsOCArMjI5LDggQEAKICAgICBtX3BGb3JtRmlsbEVudi0+SlNfYXBwQmVlcChkd1R5cGUpOwogfQogCi1pbnQzMl90IENQREZYRkFfQ29udGV4dDo6TXNnQm94KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RpdGxlLAoraW50MzJfdCBDUERGWEZBX0NvbnRleHQ6Ok1zZ0JveChjb25zdCBXaWRlU3RyaW5nJiB3c01lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzVGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3SWNvblR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3QnV0dG9uVHlwZSkgewogICBpZiAoIW1fcEZvcm1GaWxsRW52KQpAQCAtMzA3LDQzICsyODEsNDAgQEAKICAgcmV0dXJuIFhGQV9JRFllczsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ1BERlhGQV9Db250ZXh0OjpSZXNwb25zZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NRdWVzdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGl0bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RlZmF1bHRBbnN3ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk1hcmspIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NBbnN3ZXI7CitXaWRlU3RyaW5nIENQREZYRkFfQ29udGV4dDo6UmVzcG9uc2UoY29uc3QgV2lkZVN0cmluZyYgd3NRdWVzdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c1RpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzRGVmYXVsdEFuc3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJNYXJrKSB7CiAgIGlmICghbV9wRm9ybUZpbGxFbnYpCi0gICAgcmV0dXJuIHdzQW5zd2VyOworICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CiAKICAgaW50IG5MZW5ndGggPSAyMDQ4OwotICBjaGFyKiBwQnVmZiA9IG5ldyBjaGFyW25MZW5ndGhdOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwQnVmZihuTGVuZ3RoKTsKICAgbkxlbmd0aCA9IG1fcEZvcm1GaWxsRW52LT5KU19hcHBSZXNwb25zZSh3c1F1ZXN0aW9uLmNfc3RyKCksIHdzVGl0bGUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0RlZmF1bHRBbnN3ZXIuY19zdHIoKSwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTWFyaywgcEJ1ZmYsIG5MZW5ndGgpOwotICBpZiAobkxlbmd0aCA+IDApIHsKLSAgICBuTGVuZ3RoID0gbkxlbmd0aCA+IDIwNDYgPyAyMDQ2IDogbkxlbmd0aDsKLSAgICBwQnVmZltuTGVuZ3RoXSA9IDA7Ci0gICAgcEJ1ZmZbbkxlbmd0aCArIDFdID0gMDsKLSAgICB3c0Fuc3dlciA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGMTZMRSgKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBzaG9ydCo+KHBCdWZmKSwKLSAgICAgICAgbkxlbmd0aCAvIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOwotICB9Ci0gIGRlbGV0ZVtdIHBCdWZmOwotICByZXR1cm4gd3NBbnN3ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYk1hcmssIHBCdWZmLmRhdGEoKSwgbkxlbmd0aCk7CisgIGlmIChuTGVuZ3RoIDw9IDApCisgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKKworICBuTGVuZ3RoID0gc3RkOjptaW4oMjA0Niwgbkxlbmd0aCk7CisgIHBCdWZmW25MZW5ndGhdID0gMDsKKyAgcEJ1ZmZbbkxlbmd0aCArIDFdID0gMDsKKyAgcmV0dXJuIFdpZGVTdHJpbmc6OkZyb21VVEYxNkxFKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QqPihwQnVmZi5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkxlbmd0aCAvIHNpemVvZih1aW50MTZfdCkpOwogfQogCi1DRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IENQREZYRkFfQ29udGV4dDo6RG93bmxvYWRVUkwoCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVVJMKSB7CitSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gQ1BERlhGQV9Db250ZXh0OjpEb3dubG9hZFVSTCgKKyAgICBjb25zdCBXaWRlU3RyaW5nJiB3c1VSTCkgewogICByZXR1cm4gbV9wRm9ybUZpbGxFbnYgPyBtX3BGb3JtRmlsbEVudi0+RG93bmxvYWRGcm9tVVJMKHdzVVJMLmNfc3RyKCkpCiAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHI7CiB9CiAKLWJvb2wgQ1BERlhGQV9Db250ZXh0OjpQb3N0UmVxdWVzdFVSTChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NVUkwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NFbmNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzSGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1Jlc3BvbnNlKSB7Citib29sIENQREZYRkFfQ29udGV4dDo6UG9zdFJlcXVlc3RVUkwoY29uc3QgV2lkZVN0cmluZyYgd3NVUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzQ29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NFbmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyYgd3NSZXNwb25zZSkgewogICBpZiAoIW1fcEZvcm1GaWxsRW52KQogICAgIHJldHVybiBmYWxzZTsKIApAQCAtMzUzLDkgKzMyNCw5IEBACiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENQREZYRkFfQ29udGV4dDo6UHV0UmVxdWVzdFVSTChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NVUkwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRW5jb2RlKSB7Citib29sIENQREZYRkFfQ29udGV4dDo6UHV0UmVxdWVzdFVSTChjb25zdCBXaWRlU3RyaW5nJiB3c1VSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzRW5jb2RlKSB7CiAgIHJldHVybiBtX3BGb3JtRmlsbEVudiAmJgogICAgICAgICAgbV9wRm9ybUZpbGxFbnYtPlB1dFJlcXVlc3RVUkwod3NVUkwuY19zdHIoKSwgd3NEYXRhLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0VuY29kZS5jX3N0cigpKTsKQEAgLTM2NCw2ICszMzUsNiBAQAogSUZXTF9BZGFwdGVyVGltZXJNZ3IqIENQREZYRkFfQ29udGV4dDo6R2V0VGltZXJNZ3IoKSB7CiAgIENYRkFfRldMQWRhcHRlclRpbWVyTWdyKiBwQWRhcHRlciA9IG51bGxwdHI7CiAgIGlmIChtX3BGb3JtRmlsbEVudikKLSAgICBwQWRhcHRlciA9IG5ldyBDWEZBX0ZXTEFkYXB0ZXJUaW1lck1ncihtX3BGb3JtRmlsbEVudik7CisgICAgcEFkYXB0ZXIgPSBuZXcgQ1hGQV9GV0xBZGFwdGVyVGltZXJNZ3IobV9wRm9ybUZpbGxFbnYuR2V0KCkpOwogICByZXR1cm4gcEFkYXB0ZXI7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZ4ZmEvY3BkZnhmYV9jb250ZXh0LmggYi9mcGRmc2RrL2ZwZGZ4ZmEvY3BkZnhmYV9jb250ZXh0LmgKaW5kZXggOWEyYTUxNy4uYWNlZjhmMiAxMDA2NDQKLS0tIGEvZnBkZnNkay9mcGRmeGZhL2NwZGZ4ZmFfY29udGV4dC5oCisrKyBiL2ZwZGZzZGsvZnBkZnhmYS9jcGRmeGZhX2NvbnRleHQuaApAQCAtMTAsMTIgKzEwLDE1IEBACiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9vYnNlcnZhYmxlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogI2luY2x1ZGUgImZwZGZzZGsvZnBkZnhmYS9jcGRmeGZhX2RvY2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jLmgiCisjaW5jbHVkZSAiZnBkZnNkay9mcGRmeGZhL2NwZGZ4ZmFfcGFnZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZkb2MuaCIKIAogY2xhc3MgQ0pTX1J1bnRpbWU7CiBjbGFzcyBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ7Ci1jbGFzcyBDUERGWEZBX1BhZ2U7CiBjbGFzcyBDWEZBX0ZGRG9jSGFuZGxlcjsKIGNsYXNzIElKU19FdmVudENvbnRleHQ7CiBjbGFzcyBJSlNfUnVudGltZTsKQEAgLTM2LDUwICszOSw1MiBAQAogICBib29sIExvYWRYRkFEb2MoKTsKICAgQ1BERl9Eb2N1bWVudCogR2V0UERGRG9jKCkgeyByZXR1cm4gbV9wUERGRG9jLmdldCgpOyB9CiAgIENYRkFfRkZEb2MqIEdldFhGQURvYygpIHsgcmV0dXJuIG1fcFhGQURvYy5nZXQoKTsgfQotICBDWEZBX0ZGRG9jVmlldyogR2V0WEZBRG9jVmlldygpIHsgcmV0dXJuIG1fcFhGQURvY1ZpZXc7IH0KLSAgaW50IEdldERvY1R5cGUoKSBjb25zdCB7IHJldHVybiBtX2lEb2NUeXBlOyB9CisgIENYRkFfRkZEb2NWaWV3KiBHZXRYRkFEb2NWaWV3KCkgeyByZXR1cm4gbV9wWEZBRG9jVmlldy5HZXQoKTsgfQorICBGb3JtVHlwZSBHZXRGb3JtVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fRm9ybVR5cGU7IH0KKyAgYm9vbCBDb250YWluc1hGQUZvcm0oKSBjb25zdCB7CisgICAgcmV0dXJuIG1fRm9ybVR5cGUgPT0gRm9ybVR5cGU6OmtYRkFGdWxsIHx8CisgICAgICAgICAgIG1fRm9ybVR5cGUgPT0gRm9ybVR5cGU6OmtYRkFGb3JlZ3JvdW5kOworICB9CiAgIHY4OjpJc29sYXRlKiBHZXRKU0VSdW50aW1lKCkgY29uc3Q7CiAgIENYRkFfRkZBcHAqIEdldFhGQUFwcCgpIHsgcmV0dXJuIG1fcFhGQUFwcC5nZXQoKTsgfQogCi0gIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogR2V0Rm9ybUZpbGxFbnYoKSBjb25zdCB7IHJldHVybiBtX3BGb3JtRmlsbEVudjsgfQorICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIEdldEZvcm1GaWxsRW52KCkgY29uc3QgeworICAgIHJldHVybiBtX3BGb3JtRmlsbEVudi5HZXQoKTsKKyAgfQogICB2b2lkIFNldEZvcm1GaWxsRW52KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KTsKIAotICB2b2lkIERlbGV0ZVBhZ2UoaW50IHBhZ2VfaW5kZXgpOwogICBpbnQgR2V0UGFnZUNvdW50KCkgY29uc3Q7Ci0KLSAgQ1BERlhGQV9QYWdlKiBHZXRYRkFQYWdlKGludCBwYWdlX2luZGV4KTsKLSAgQ1BERlhGQV9QYWdlKiBHZXRYRkFQYWdlKENYRkFfRkZQYWdlVmlldyogcFBhZ2UpIGNvbnN0OwotCi0gIHZvaWQgUmVtb3ZlUGFnZShDUERGWEZBX1BhZ2UqIHBhZ2UpOwotCisgIHZvaWQgRGVsZXRlUGFnZShpbnQgcGFnZV9pbmRleCk7CisgIFJldGFpblB0cjxDUERGWEZBX1BhZ2U+IEdldFhGQVBhZ2UoaW50IHBhZ2VfaW5kZXgpOworICBSZXRhaW5QdHI8Q1BERlhGQV9QYWdlPiBHZXRYRkFQYWdlKENYRkFfRkZQYWdlVmlldyogcFBhZ2UpIGNvbnN0OwogICB2b2lkIENsZWFyQ2hhbmdlTWFyaygpOwogCiAgIC8vIElGWEFfQXBwUHJvdmlkZXI6Ci0gIENGWF9XaWRlU3RyaW5nIEdldExhbmd1YWdlKCkgb3ZlcnJpZGU7Ci0gIENGWF9XaWRlU3RyaW5nIEdldFBsYXRmb3JtKCkgb3ZlcnJpZGU7Ci0gIENGWF9XaWRlU3RyaW5nIEdldEFwcE5hbWUoKSBvdmVycmlkZTsKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0QXBwVGl0bGUoKSBjb25zdCBvdmVycmlkZTsKKyAgV2lkZVN0cmluZyBHZXRMYW5ndWFnZSgpIG92ZXJyaWRlOworICBXaWRlU3RyaW5nIEdldFBsYXRmb3JtKCkgb3ZlcnJpZGU7CisgIFdpZGVTdHJpbmcgR2V0QXBwTmFtZSgpIG92ZXJyaWRlOworICBXaWRlU3RyaW5nIEdldEFwcFRpdGxlKCkgY29uc3Qgb3ZlcnJpZGU7CiAKICAgdm9pZCBCZWVwKHVpbnQzMl90IGR3VHlwZSkgb3ZlcnJpZGU7Ci0gIGludDMyX3QgTXNnQm94KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RpdGxlLAorICBpbnQzMl90IE1zZ0JveChjb25zdCBXaWRlU3RyaW5nJiB3c01lc3NhZ2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzVGl0bGUsCiAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3SWNvblR5cGUsCiAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3QnV0dG9uVHlwZSkgb3ZlcnJpZGU7Ci0gIENGWF9XaWRlU3RyaW5nIFJlc3BvbnNlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1F1ZXN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUaXRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGVmYXVsdEFuc3dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTWFyaykgb3ZlcnJpZGU7Ci0gIENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gRG93bmxvYWRVUkwoCi0gICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NVUkwpIG92ZXJyaWRlOwotICBib29sIFBvc3RSZXF1ZXN0VVJMKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1VSTCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRhLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0VuY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NIZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUmVzcG9uc2UpIG92ZXJyaWRlOwotICBib29sIFB1dFJlcXVlc3RVUkwoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVVJMLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0VuY29kZSkgb3ZlcnJpZGU7CisgIFdpZGVTdHJpbmcgUmVzcG9uc2UoY29uc3QgV2lkZVN0cmluZyYgd3NRdWVzdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c1RpdGxlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzRGVmYXVsdEFuc3dlciwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJNYXJrKSBvdmVycmlkZTsKKyAgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IERvd25sb2FkVVJMKAorICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NVUkwpIG92ZXJyaWRlOworICBib29sIFBvc3RSZXF1ZXN0VVJMKGNvbnN0IFdpZGVTdHJpbmcmIHdzVVJMLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c0NvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzRW5jb2RlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzSGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIHdzUmVzcG9uc2UpIG92ZXJyaWRlOworICBib29sIFB1dFJlcXVlc3RVUkwoY29uc3QgV2lkZVN0cmluZyYgd3NVUkwsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c0RhdGEsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c0VuY29kZSkgb3ZlcnJpZGU7CiAKICAgSUZXTF9BZGFwdGVyVGltZXJNZ3IqIEdldFRpbWVyTWdyKCkgb3ZlcnJpZGU7CiAKQEAgLTkzLDIyICs5OCwyMyBAQAogICB9CiAKICAgTG9hZFN0YXR1cyBHZXRMb2FkU3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbV9uTG9hZFN0YXR1czsgfQotICBzdGQ6OnZlY3RvcjxDUERGWEZBX1BhZ2UqPiogR2V0WEZBUGFnZUxpc3QoKSB7IHJldHVybiAmbV9YRkFQYWdlTGlzdDsgfQorICBzdGQ6OnZlY3RvcjxSZXRhaW5QdHI8Q1BERlhGQV9QYWdlPj4qIEdldFhGQVBhZ2VMaXN0KCkgeworICAgIHJldHVybiAmbV9YRkFQYWdlTGlzdDsKKyAgfQogCiAgcHJpdmF0ZToKICAgdm9pZCBDbG9zZVhGQURvYygpOwogCi0gIGludCBtX2lEb2NUeXBlOwotCisgIEZvcm1UeXBlIG1fRm9ybVR5cGUgPSBGb3JtVHlwZTo6a05vbmU7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX0RvY3VtZW50PiBtX3BQREZEb2M7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZGRG9jPiBtX3BYRkFEb2M7Ci0gIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogbV9wRm9ybUZpbGxFbnY7ICAvLyBub3Qgb3duZWQuCi0gIENYRkFfRkZEb2NWaWV3KiBtX3BYRkFEb2NWaWV3OyAgICAgICAgICAgICAgICAvLyBub3Qgb3duZWQuCisgIE9ic2VydmFibGU8Q1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50Pjo6T2JzZXJ2ZWRQdHIgbV9wRm9ybUZpbGxFbnY7CisgIFVub3duZWRQdHI8Q1hGQV9GRkRvY1ZpZXc+IG1fcFhGQURvY1ZpZXc7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZGQXBwPiBtX3BYRkFBcHA7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDSlNfUnVudGltZT4gbV9wUnVudGltZTsKLSAgc3RkOjp2ZWN0b3I8Q1BERlhGQV9QYWdlKj4gbV9YRkFQYWdlTGlzdDsKLSAgTG9hZFN0YXR1cyBtX25Mb2FkU3RhdHVzOwotICBpbnQgbV9uUGFnZUNvdW50OworICBzdGQ6OnZlY3RvcjxSZXRhaW5QdHI8Q1BERlhGQV9QYWdlPj4gbV9YRkFQYWdlTGlzdDsKKyAgTG9hZFN0YXR1cyBtX25Mb2FkU3RhdHVzID0gRlhGQV9MT0FEU1RBVFVTX1BSRUxPQUQ7CisgIGludCBtX25QYWdlQ291bnQgPSAwOwogCiAgIC8vIE11c3QgYmUgZGVzdHJveWVkIGJlZm9yZSB8bV9wRm9ybUZpbGxFbnZ8LgogICBDUERGWEZBX0RvY0Vudmlyb25tZW50IG1fRG9jRW52OwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9mcGRmeGZhL2NwZGZ4ZmFfZG9jZW52aXJvbm1lbnQuY3BwIGIvZnBkZnNkay9mcGRmeGZhL2NwZGZ4ZmFfZG9jZW52aXJvbm1lbnQuY3BwCmluZGV4IDczMWIwY2MuLjRlYmU4ZjkgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvZnBkZnhmYS9jcGRmeGZhX2RvY2Vudmlyb25tZW50LmNwcAorKysgYi9mcGRmc2RrL2ZwZGZ4ZmEvY3BkZnhmYV9kb2NlbnZpcm9ubWVudC5jcHAKQEAgLTExLDE2ICsxMSwxOCBAQAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW1fYWNjLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmluZy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKICNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfZm9ybWZpbGxlbnZpcm9ubWVudC5oIgogI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19pbnRlcmZvcm0uaCIKICNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfcGFnZXZpZXcuaCIKICNpbmNsdWRlICJmcGRmc2RrL2ZwZGZ4ZmEvY3BkZnhmYV9jb250ZXh0LmgiCiAjaW5jbHVkZSAiZnBkZnNkay9mcGRmeGZhL2NwZGZ4ZmFfcGFnZS5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9panNfcnVudGltZS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmRvY3ZpZXcuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZ3aWRnZXQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZ3aWRnZXRoYW5kbGVyLmgiCisjaW5jbHVkZSAiZnhqcy9panNfcnVudGltZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZkb2N2aWV3LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZndpZGdldC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZ3aWRnZXRoYW5kbGVyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV93aWRnZXRhY2NpdGVyYXRvci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3N1Ym1pdC5oIgogCiAjZGVmaW5lIElEU19YRkFfVmFsaWRhdGVfSW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICJBdCBsZWFzdCBvbmUgcmVxdWlyZWQgZmllbGQgd2FzIGVtcHR5LiBQbGVhc2UgZmlsbCBpbiB0aGUgcmVxdWlyZWQgIiBcCkBAIC0zOCwxNiArNDAsMTEgQEAKICNkZWZpbmUgRlhGQV9YRkFfQUxMIDB4MDExMTExMTEKIAogQ1BERlhGQV9Eb2NFbnZpcm9ubWVudDo6Q1BERlhGQV9Eb2NFbnZpcm9ubWVudChDUERGWEZBX0NvbnRleHQqIHBDb250ZXh0KQotICAgIDogbV9wQ29udGV4dChwQ29udGV4dCksIG1fcEpTRXZlbnRDb250ZXh0KG51bGxwdHIpIHsKKyAgICA6IG1fcENvbnRleHQocENvbnRleHQpIHsKICAgQVNTRVJUKG1fcENvbnRleHQpOwogfQogCi1DUERGWEZBX0RvY0Vudmlyb25tZW50Ojp+Q1BERlhGQV9Eb2NFbnZpcm9ubWVudCgpIHsKLSAgaWYgKG1fcEpTRXZlbnRDb250ZXh0ICYmIG1fcENvbnRleHQtPkdldEZvcm1GaWxsRW52KCkpIHsKLSAgICBtX3BDb250ZXh0LT5HZXRGb3JtRmlsbEVudigpLT5HZXRKU1J1bnRpbWUoKS0+UmVsZWFzZUV2ZW50Q29udGV4dCgKLSAgICAgICAgbV9wSlNFdmVudENvbnRleHQpOwotICB9Ci19CitDUERGWEZBX0RvY0Vudmlyb25tZW50Ojp+Q1BERlhGQV9Eb2NFbnZpcm9ubWVudCgpIHt9CiAKIHZvaWQgQ1BERlhGQV9Eb2NFbnZpcm9ubWVudDo6U2V0Q2hhbmdlTWFyayhDWEZBX0ZGRG9jKiBoRG9jKSB7CiAgIGlmIChoRG9jID09IG1fcENvbnRleHQtPkdldFhGQURvYygpICYmIG1fcENvbnRleHQtPkdldEZvcm1GaWxsRW52KCkpCkBAIC01NSwxNSArNTIsMTQgQEAKIH0KIAogdm9pZCBDUERGWEZBX0RvY0Vudmlyb25tZW50OjpJbnZhbGlkYXRlUmVjdChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFncyAvKiA9IDAgKi8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydCkgewogICBpZiAoIW1fcENvbnRleHQtPkdldFhGQURvYygpIHx8ICFtX3BDb250ZXh0LT5HZXRGb3JtRmlsbEVudigpKQogICAgIHJldHVybjsKIAotICBpZiAobV9wQ29udGV4dC0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfRFlOQU1JQ19YRkEpCisgIGlmIChtX3BDb250ZXh0LT5HZXRGb3JtVHlwZSgpICE9IEZvcm1UeXBlOjprWEZBRnVsbCkKICAgICByZXR1cm47CiAKLSAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9IG1fcENvbnRleHQtPkdldFhGQVBhZ2UocFBhZ2VWaWV3KTsKKyAgUmV0YWluUHRyPENQREZYRkFfUGFnZT4gcFBhZ2UgPSBtX3BDb250ZXh0LT5HZXRYRkFQYWdlKHBQYWdlVmlldyk7CiAgIGlmICghcFBhZ2UpCiAgICAgcmV0dXJuOwogCkBAIC03MSw4ICs2Nyw3IEBACiAgIGlmICghcEZvcm1GaWxsRW52KQogICAgIHJldHVybjsKIAotICBwRm9ybUZpbGxFbnYtPkludmFsaWRhdGUoc3RhdGljX2Nhc3Q8RlBERl9QQUdFPihwUGFnZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRmxvYXRSZWN0OjpGcm9tQ0ZYUmVjdEYocnQpLlRvRnhSZWN0KCkpOworICBwRm9ybUZpbGxFbnYtPkludmFsaWRhdGUocFBhZ2UuR2V0KCksIHJ0LlRvRmxvYXRSZWN0KCkuVG9GeFJlY3QoKSk7CiB9CiAKIHZvaWQgQ1BERlhGQV9Eb2NFbnZpcm9ubWVudDo6RGlzcGxheUNhcmV0KENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCkBAIC04Miw3ICs3Nyw3IEBACiAgICAgICAhbV9wQ29udGV4dC0+R2V0Rm9ybUZpbGxFbnYoKSB8fCAhbV9wQ29udGV4dC0+R2V0WEZBRG9jVmlldygpKQogICAgIHJldHVybjsKIAotICBpZiAobV9wQ29udGV4dC0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfRFlOQU1JQ19YRkEpCisgIGlmIChtX3BDb250ZXh0LT5HZXRGb3JtVHlwZSgpICE9IEZvcm1UeXBlOjprWEZBRnVsbCkKICAgICByZXR1cm47CiAKICAgQ1hGQV9GRldpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0KQEAgLTk0LDcgKzg5LDcgQEAKICAgaWYgKCFwUGFnZVZpZXcpCiAgICAgcmV0dXJuOwogCi0gIENQREZYRkFfUGFnZSogcFBhZ2UgPSBtX3BDb250ZXh0LT5HZXRYRkFQYWdlKHBQYWdlVmlldyk7CisgIFJldGFpblB0cjxDUERGWEZBX1BhZ2U+IHBQYWdlID0gbV9wQ29udGV4dC0+R2V0WEZBUGFnZShwUGFnZVZpZXcpOwogICBpZiAoIXBQYWdlKQogICAgIHJldHVybjsKIApAQCAtMTAyLDE0ICs5NywxNCBAQAogICBpZiAoIXBGb3JtRmlsbEVudikKICAgICByZXR1cm47CiAKLSAgQ0ZYX0Zsb2F0UmVjdCByY0NhcmV0ID0gQ0ZYX0Zsb2F0UmVjdDo6RnJvbUNGWFJlY3RGKCpwUnRBbmNob3IpOwotICBwRm9ybUZpbGxFbnYtPkRpc3BsYXlDYXJldCgoRlBERl9QQUdFKXBQYWdlLCBiVmlzaWJsZSwgcmNDYXJldC5sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NhcmV0LnRvcCwgcmNDYXJldC5yaWdodCwgcmNDYXJldC5ib3R0b20pOworICBDRlhfRmxvYXRSZWN0IHJjQ2FyZXQgPSBwUnRBbmNob3ItPlRvRmxvYXRSZWN0KCk7CisgIHBGb3JtRmlsbEVudi0+RGlzcGxheUNhcmV0KHBQYWdlLkdldCgpLCBiVmlzaWJsZSwgcmNDYXJldC5sZWZ0LCByY0NhcmV0LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDYXJldC5yaWdodCwgcmNDYXJldC5ib3R0b20pOwogfQogCiBib29sIENQREZYRkFfRG9jRW52aXJvbm1lbnQ6OkdldFBvcHVwUG9zKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNaW5Qb3B1cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1heFBvcHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmTWluUG9wdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZNYXhQb3B1cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydFBvcHVwKSB7CiAgIGlmICghaFdpZGdldCkKQEAgLTExOSwyMiArMTE0LDIxIEBACiAgIGlmICghcFhGQVBhZ2VWaWV3KQogICAgIHJldHVybiBmYWxzZTsKIAotICBDUERGWEZBX1BhZ2UqIHBQYWdlID0gbV9wQ29udGV4dC0+R2V0WEZBUGFnZShwWEZBUGFnZVZpZXcpOworICBSZXRhaW5QdHI8Q1BERlhGQV9QYWdlPiBwUGFnZSA9IG1fcENvbnRleHQtPkdldFhGQVBhZ2UocFhGQVBhZ2VWaWV3KTsKICAgaWYgKCFwUGFnZSkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBoV2lkZ2V0LT5HZXREYXRhQWNjKCk7Ci0gIGludCBuUm90YXRlID0gcFdpZGdldEFjYy0+R2V0Um90YXRlKCk7CiAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52ID0gbV9wQ29udGV4dC0+R2V0Rm9ybUZpbGxFbnYoKTsKICAgaWYgKCFwRm9ybUZpbGxFbnYpCiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIEZTX1JFQ1RGIHBhZ2VWaWV3UmVjdCA9IHswLjBmLCAwLjBmLCAwLjBmLCAwLjBmfTsKLSAgcEZvcm1GaWxsRW52LT5HZXRQYWdlVmlld1JlY3QocFBhZ2UsIHBhZ2VWaWV3UmVjdCk7CisgIHBGb3JtRmlsbEVudi0+R2V0UGFnZVZpZXdSZWN0KHBQYWdlLkdldCgpLCBwYWdlVmlld1JlY3QpOwogCiAgIGludCB0MTsKICAgaW50IHQyOwotICBDRlhfRmxvYXRSZWN0IHJjQW5jaG9yID0gQ0ZYX0Zsb2F0UmVjdDo6RnJvbUNGWFJlY3RGKHJ0QW5jaG9yKTsKKyAgQ0ZYX0Zsb2F0UmVjdCByY0FuY2hvciA9IHJ0QW5jaG9yLlRvRmxvYXRSZWN0KCk7CisgIGludCBuUm90YXRlID0gaFdpZGdldC0+R2V0Tm9kZSgpLT5HZXRSb3RhdGUoKTsKICAgc3dpdGNoIChuUm90YXRlKSB7CiAgICAgY2FzZSA5MDogewogICAgICAgdDEgPSAoaW50KShwYWdlVmlld1JlY3QucmlnaHQgLSByY0FuY2hvci5yaWdodCk7CkBAIC0xODUsMTMgKzE3OSwxMyBAQAogICAgIGR3UG9zID0gMTsKICAgfQogCi0gIEZYX0ZMT0FUIGZQb3B1cEhlaWdodDsKKyAgZmxvYXQgZlBvcHVwSGVpZ2h0OwogICBpZiAodCA8IGZNaW5Qb3B1cCkKICAgICBmUG9wdXBIZWlnaHQgPSBmTWluUG9wdXA7CiAgIGVsc2UgaWYgKHQgPiBmTWF4UG9wdXApCiAgICAgZlBvcHVwSGVpZ2h0ID0gZk1heFBvcHVwOwogICBlbHNlCi0gICAgZlBvcHVwSGVpZ2h0ID0gc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHQpOworICAgIGZQb3B1cEhlaWdodCA9IHN0YXRpY19jYXN0PGZsb2F0Pih0KTsKIAogICBzd2l0Y2ggKG5Sb3RhdGUpIHsKICAgICBjYXNlIDA6CkBAIC0yMzIsNyArMjI2LDcgQEAKICAgaWYgKCFwWEZBUGFnZVZpZXcpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIENQREZYRkFfUGFnZSogcFBhZ2UgPSBtX3BDb250ZXh0LT5HZXRYRkFQYWdlKHBYRkFQYWdlVmlldyk7CisgIFJldGFpblB0cjxDUERGWEZBX1BhZ2U+IHBQYWdlID0gbV9wQ29udGV4dC0+R2V0WEZBUGFnZShwWEZBUGFnZVZpZXcpOwogICBpZiAoIXBQYWdlKQogICAgIHJldHVybiBmYWxzZTsKIApAQCAtMjU0LDcgKzI0OCw3IEBACiAgIGlmIChoV2lkZ2V0LT5DYW5TZWxlY3RBbGwoKSkKICAgICBtZW51RmxhZyB8PSBGWEZBX01FTlVfU0VMRUNUQUxMOwogCi0gIHJldHVybiBwRm9ybUZpbGxFbnYtPlBvcHVwTWVudShwUGFnZSwgaFdpZGdldCwgbWVudUZsYWcsIHB0UG9wdXApOworICByZXR1cm4gcEZvcm1GaWxsRW52LT5Qb3B1cE1lbnUocFBhZ2UuR2V0KCksIGhXaWRnZXQsIG1lbnVGbGFnLCBwdFBvcHVwKTsKIH0KIAogdm9pZCBDUERGWEZBX0RvY0Vudmlyb25tZW50OjpQYWdlVmlld0V2ZW50KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LApAQCAtMjc4LDU0ICsyNzIsNTcgQEAKIAogICBmb3IgKGludCBpUGFnZUl0ZXIgPSAwOyBpUGFnZUl0ZXIgPCBtX3BDb250ZXh0LT5HZXRPcmlnaW5hbFBhZ2VDb3VudCgpOwogICAgICAgIGlQYWdlSXRlcisrKSB7Ci0gICAgQ1BERlhGQV9QYWdlKiBwUGFnZSA9ICgqbV9wQ29udGV4dC0+R2V0WEZBUGFnZUxpc3QoKSlbaVBhZ2VJdGVyXTsKKyAgICBSZXRhaW5QdHI8Q1BERlhGQV9QYWdlPiBwUGFnZSA9ICgqbV9wQ29udGV4dC0+R2V0WEZBUGFnZUxpc3QoKSlbaVBhZ2VJdGVyXTsKICAgICBpZiAoIXBQYWdlKQogICAgICAgY29udGludWU7CiAKLSAgICBtX3BDb250ZXh0LT5HZXRGb3JtRmlsbEVudigpLT5SZW1vdmVQYWdlVmlldyhwUGFnZSk7CisgICAgbV9wQ29udGV4dC0+R2V0Rm9ybUZpbGxFbnYoKS0+UmVtb3ZlUGFnZVZpZXcocFBhZ2UuR2V0KCkpOwogICAgIHBQYWdlLT5TZXRYRkFQYWdlVmlldyhwWEZBRG9jVmlldy0+R2V0UGFnZVZpZXcoaVBhZ2VJdGVyKSk7CiAgIH0KIAogICBpbnQgZmxhZyA9IChuTmV3Q291bnQgPCBtX3BDb250ZXh0LT5HZXRPcmlnaW5hbFBhZ2VDb3VudCgpKQogICAgICAgICAgICAgICAgICA/IEZYRkFfUEFHRVZJRVdFVkVOVF9QT1NUUkVNT1ZFRAogICAgICAgICAgICAgICAgICA6IEZYRkFfUEFHRVZJRVdFVkVOVF9QT1NUQURERUQ7Ci0gIGludCBjb3VudCA9IEZYU1lTX2FicyhuTmV3Q291bnQgLSBtX3BDb250ZXh0LT5HZXRPcmlnaW5hbFBhZ2VDb3VudCgpKTsKKyAgaW50IGNvdW50ID0gYWJzKG5OZXdDb3VudCAtIG1fcENvbnRleHQtPkdldE9yaWdpbmFsUGFnZUNvdW50KCkpOwogICBtX3BDb250ZXh0LT5TZXRPcmlnaW5hbFBhZ2VDb3VudChuTmV3Q291bnQpOwogICBwRm9ybUZpbGxFbnYtPlBhZ2VFdmVudChjb3VudCwgZmxhZyk7CiB9CiAKIHZvaWQgQ1BERlhGQV9Eb2NFbnZpcm9ubWVudDo6V2lkZ2V0UG9zdEFkZChDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0RGF0YSkgewotICBpZiAobV9wQ29udGV4dC0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfRFlOQU1JQ19YRkEgfHwgIWhXaWRnZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpIHsKKyAgaWYgKG1fcENvbnRleHQtPkdldEZvcm1UeXBlKCkgIT0gRm9ybVR5cGU6OmtYRkFGdWxsIHx8ICFoV2lkZ2V0KQogICAgIHJldHVybjsKIAogICBDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldyA9IGhXaWRnZXQtPkdldFBhZ2VWaWV3KCk7CiAgIGlmICghcFBhZ2VWaWV3KQogICAgIHJldHVybjsKIAotICBDUERGWEZBX1BhZ2UqIHBYRkFQYWdlID0gbV9wQ29udGV4dC0+R2V0WEZBUGFnZShwUGFnZVZpZXcpOworICBSZXRhaW5QdHI8Q1BERlhGQV9QYWdlPiBwWEZBUGFnZSA9IG1fcENvbnRleHQtPkdldFhGQVBhZ2UocFBhZ2VWaWV3KTsKICAgaWYgKCFwWEZBUGFnZSkKICAgICByZXR1cm47CiAKLSAgbV9wQ29udGV4dC0+R2V0Rm9ybUZpbGxFbnYoKS0+R2V0UGFnZVZpZXcocFhGQVBhZ2UsIHRydWUpLT5BZGRBbm5vdChoV2lkZ2V0KTsKKyAgbV9wQ29udGV4dC0+R2V0Rm9ybUZpbGxFbnYoKQorICAgICAgLT5HZXRQYWdlVmlldyhwWEZBUGFnZS5HZXQoKSwgdHJ1ZSkKKyAgICAgIC0+QWRkQW5ub3QoaFdpZGdldCk7CiB9CiAKIHZvaWQgQ1BERlhGQV9Eb2NFbnZpcm9ubWVudDo6V2lkZ2V0UHJlUmVtb3ZlKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcFdpZGdldERhdGEpIHsKLSAgaWYgKG1fcENvbnRleHQtPkdldERvY1R5cGUoKSAhPSBET0NUWVBFX0RZTkFNSUNfWEZBIHx8ICFoV2lkZ2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpIHsKKyAgaWYgKG1fcENvbnRleHQtPkdldEZvcm1UeXBlKCkgIT0gRm9ybVR5cGU6OmtYRkFGdWxsIHx8ICFoV2lkZ2V0KQogICAgIHJldHVybjsKIAogICBDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldyA9IGhXaWRnZXQtPkdldFBhZ2VWaWV3KCk7CiAgIGlmICghcFBhZ2VWaWV3KQogICAgIHJldHVybjsKIAotICBDUERGWEZBX1BhZ2UqIHBYRkFQYWdlID0gbV9wQ29udGV4dC0+R2V0WEZBUGFnZShwUGFnZVZpZXcpOworICBSZXRhaW5QdHI8Q1BERlhGQV9QYWdlPiBwWEZBUGFnZSA9IG1fcENvbnRleHQtPkdldFhGQVBhZ2UocFBhZ2VWaWV3KTsKICAgaWYgKCFwWEZBUGFnZSkKICAgICByZXR1cm47CiAKICAgQ1BERlNES19QYWdlVmlldyogcFNka1BhZ2VWaWV3ID0KLSAgICAgIG1fcENvbnRleHQtPkdldEZvcm1GaWxsRW52KCktPkdldFBhZ2VWaWV3KHBYRkFQYWdlLCB0cnVlKTsKLSAgaWYgKENQREZTREtfQW5ub3QqIHBBbm5vdCA9IHBTZGtQYWdlVmlldy0+R2V0QW5ub3RCeVhGQVdpZGdldChoV2lkZ2V0KSkKKyAgICAgIG1fcENvbnRleHQtPkdldEZvcm1GaWxsRW52KCktPkdldFBhZ2VWaWV3KHBYRkFQYWdlLkdldCgpLCB0cnVlKTsKKyAgQ1BERlNES19Bbm5vdCogcEFubm90ID0gcFNka1BhZ2VWaWV3LT5HZXRBbm5vdEJ5WEZBV2lkZ2V0KGhXaWRnZXQpOworICBpZiAocEFubm90KQogICAgIHBTZGtQYWdlVmlldy0+RGVsZXRlQW5ub3QocEFubm90KTsKIH0KIApAQCAtMzM4LDIwICszMzUsMjAgQEAKIGludDMyX3QgQ1BERlhGQV9Eb2NFbnZpcm9ubWVudDo6R2V0Q3VycmVudFBhZ2UoQ1hGQV9GRkRvYyogaERvYykgewogICBpZiAoaERvYyAhPSBtX3BDb250ZXh0LT5HZXRYRkFEb2MoKSB8fCAhbV9wQ29udGV4dC0+R2V0Rm9ybUZpbGxFbnYoKSkKICAgICByZXR1cm4gLTE7Ci0gIGlmIChtX3BDb250ZXh0LT5HZXREb2NUeXBlKCkgIT0gRE9DVFlQRV9EWU5BTUlDX1hGQSkKKyAgaWYgKG1fcENvbnRleHQtPkdldEZvcm1UeXBlKCkgIT0gRm9ybVR5cGU6OmtYRkFGdWxsKQogICAgIHJldHVybiAtMTsKIAogICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiA9IG1fcENvbnRleHQtPkdldEZvcm1GaWxsRW52KCk7CiAgIGlmICghcEZvcm1GaWxsRW52KQogICAgIHJldHVybiAtMTsKIAotICByZXR1cm4gcEZvcm1GaWxsRW52LT5HZXRDdXJyZW50UGFnZUluZGV4KHRoaXMpOworICByZXR1cm4gcEZvcm1GaWxsRW52LT5HZXRDdXJyZW50UGFnZUluZGV4KG1fcENvbnRleHQuR2V0KCkpOwogfQogCiB2b2lkIENQREZYRkFfRG9jRW52aXJvbm1lbnQ6OlNldEN1cnJlbnRQYWdlKENYRkFfRkZEb2MqIGhEb2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUN1clBhZ2UpIHsKICAgaWYgKGhEb2MgIT0gbV9wQ29udGV4dC0+R2V0WEZBRG9jKCkgfHwgIW1fcENvbnRleHQtPkdldEZvcm1GaWxsRW52KCkgfHwKLSAgICAgIG1fcENvbnRleHQtPkdldERvY1R5cGUoKSAhPSBET0NUWVBFX0RZTkFNSUNfWEZBIHx8IGlDdXJQYWdlIDwgMCB8fAorICAgICAgbV9wQ29udGV4dC0+R2V0Rm9ybVR5cGUoKSAhPSBGb3JtVHlwZTo6a1hGQUZ1bGwgfHwgaUN1clBhZ2UgPCAwIHx8CiAgICAgICBpQ3VyUGFnZSA+PSBtX3BDb250ZXh0LT5HZXRGb3JtRmlsbEVudigpLT5HZXRQYWdlQ291bnQoKSkgewogICAgIHJldHVybjsKICAgfQpAQCAtMzU5LDcgKzM1Niw3IEBACiAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52ID0gbV9wQ29udGV4dC0+R2V0Rm9ybUZpbGxFbnYoKTsKICAgaWYgKCFwRm9ybUZpbGxFbnYpCiAgICAgcmV0dXJuOwotICBwRm9ybUZpbGxFbnYtPlNldEN1cnJlbnRQYWdlKHRoaXMsIGlDdXJQYWdlKTsKKyAgcEZvcm1GaWxsRW52LT5TZXRDdXJyZW50UGFnZShtX3BDb250ZXh0LkdldCgpLCBpQ3VyUGFnZSk7CiB9CiAKIGJvb2wgQ1BERlhGQV9Eb2NFbnZpcm9ubWVudDo6SXNDYWxjdWxhdGlvbnNFbmFibGVkKENYRkFfRkZEb2MqIGhEb2MpIHsKQEAgLTM4Miw1MyArMzc5LDUxIEBACiAgIH0KIH0KIAotdm9pZCBDUERGWEZBX0RvY0Vudmlyb25tZW50OjpHZXRUaXRsZShDWEZBX0ZGRG9jKiBoRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NUaXRsZSkgewordm9pZCBDUERGWEZBX0RvY0Vudmlyb25tZW50OjpHZXRUaXRsZShDWEZBX0ZGRG9jKiBoRG9jLCBXaWRlU3RyaW5nJiB3c1RpdGxlKSB7CiAgIGlmIChoRG9jICE9IG1fcENvbnRleHQtPkdldFhGQURvYygpIHx8ICFtX3BDb250ZXh0LT5HZXRQREZEb2MoKSkKICAgICByZXR1cm47CiAKLSAgQ1BERl9EaWN0aW9uYXJ5KiBwSW5mb0RpY3QgPSBtX3BDb250ZXh0LT5HZXRQREZEb2MoKS0+R2V0SW5mbygpOworICBjb25zdCBDUERGX0RpY3Rpb25hcnkqIHBJbmZvRGljdCA9IG1fcENvbnRleHQtPkdldFBERkRvYygpLT5HZXRJbmZvKCk7CiAgIGlmICghcEluZm9EaWN0KQogICAgIHJldHVybjsKIAotICBDRlhfQnl0ZVN0cmluZyBjc1RpdGxlID0gcEluZm9EaWN0LT5HZXRTdHJpbmdGb3IoIlRpdGxlIik7CisgIEJ5dGVTdHJpbmcgY3NUaXRsZSA9IHBJbmZvRGljdC0+R2V0U3RyaW5nRm9yKCJUaXRsZSIpOwogICB3c1RpdGxlID0gd3NUaXRsZS5Gcm9tTG9jYWwoY3NUaXRsZS5HZXRCdWZmZXIoY3NUaXRsZS5HZXRMZW5ndGgoKSkpOwogICBjc1RpdGxlLlJlbGVhc2VCdWZmZXIoY3NUaXRsZS5HZXRMZW5ndGgoKSk7CiB9CiAKIHZvaWQgQ1BERlhGQV9Eb2NFbnZpcm9ubWVudDo6U2V0VGl0bGUoQ1hGQV9GRkRvYyogaERvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGl0bGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NUaXRsZSkgewogICBpZiAoaERvYyAhPSBtX3BDb250ZXh0LT5HZXRYRkFEb2MoKSB8fCAhbV9wQ29udGV4dC0+R2V0UERGRG9jKCkpCiAgICAgcmV0dXJuOwogCi0gIGlmIChDUERGX0RpY3Rpb25hcnkqIHBJbmZvRGljdCA9IG1fcENvbnRleHQtPkdldFBERkRvYygpLT5HZXRJbmZvKCkpCisgIENQREZfRGljdGlvbmFyeSogcEluZm9EaWN0ID0gbV9wQ29udGV4dC0+R2V0UERGRG9jKCktPkdldEluZm8oKTsKKyAgaWYgKHBJbmZvRGljdCkKICAgICBwSW5mb0RpY3QtPlNldE5ld0ZvcjxDUERGX1N0cmluZz4oIlRpdGxlIiwgd3NUaXRsZSk7CiB9CiAKIHZvaWQgQ1BERlhGQV9Eb2NFbnZpcm9ubWVudDo6RXhwb3J0RGF0YShDWEZBX0ZGRG9jKiBoRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0ZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzRmlsZVBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiWERQKSB7CiAgIGlmIChoRG9jICE9IG1fcENvbnRleHQtPkdldFhGQURvYygpKQogICAgIHJldHVybjsKIAotICBpZiAobV9wQ29udGV4dC0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfRFlOQU1JQ19YRkEgJiYKLSAgICAgIG1fcENvbnRleHQtPkdldERvY1R5cGUoKSAhPSBET0NUWVBFX1NUQVRJQ19YRkEpIHsKKyAgaWYgKCFtX3BDb250ZXh0LT5Db250YWluc1hGQUZvcm0oKSkKICAgICByZXR1cm47Ci0gIH0KIAogICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiA9IG1fcENvbnRleHQtPkdldEZvcm1GaWxsRW52KCk7CiAgIGlmICghcEZvcm1GaWxsRW52KQogICAgIHJldHVybjsKIAogICBpbnQgZmlsZVR5cGUgPSBiWERQID8gRlhGQV9TQVZFQVNfWERQIDogRlhGQV9TQVZFQVNfWE1MOwotICBDRlhfQnl0ZVN0cmluZyBicyA9IHdzRmlsZVBhdGguVVRGMTZMRV9FbmNvZGUoKTsKKyAgQnl0ZVN0cmluZyBicyA9IHdzRmlsZVBhdGguVVRGMTZMRV9FbmNvZGUoKTsKICAgaWYgKHdzRmlsZVBhdGguSXNFbXB0eSgpKSB7CiAgICAgaWYgKCFwRm9ybUZpbGxFbnYtPkdldEZvcm1GaWxsSW5mbygpIHx8CiAgICAgICAgICFwRm9ybUZpbGxFbnYtPkdldEZvcm1GaWxsSW5mbygpLT5tX3BKc1BsYXRmb3JtKSB7CiAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgQ0ZYX1dpZGVTdHJpbmcgZmlsZXBhdGggPSBwRm9ybUZpbGxFbnYtPkpTX2ZpZWxkQnJvd3NlKCk7CisgICAgV2lkZVN0cmluZyBmaWxlcGF0aCA9IHBGb3JtRmlsbEVudi0+SlNfZmllbGRCcm93c2UoKTsKICAgICBicyA9IGZpbGVwYXRoLlVURjE2TEVfRW5jb2RlKCk7CiAgIH0KICAgaW50IGxlbiA9IGJzLkdldExlbmd0aCgpOwpAQCAtNDM5LDIwICs0MzQsMjAgQEAKICAgaWYgKCFwRmlsZUhhbmRsZXIpCiAgICAgcmV0dXJuOwogCi0gIENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlU3RyZWFtPiBmaWxlV3JpdGUgPQotICAgICAgTWFrZVNlZWthYmxlU3RyZWFtKHBGaWxlSGFuZGxlcik7Ci0gIENGWF9CeXRlU3RyaW5nIGNvbnRlbnQ7CisgIFJldGFpblB0cjxJRlhfU2Vla2FibGVTdHJlYW0+IGZpbGVXcml0ZSA9IE1ha2VTZWVrYWJsZVN0cmVhbShwRmlsZUhhbmRsZXIpOwogICBpZiAoZmlsZVR5cGUgPT0gRlhGQV9TQVZFQVNfWE1MKSB7Ci0gICAgY29udGVudCA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cclxuIjsKKyAgICBCeXRlU3RyaW5nIGNvbnRlbnQgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XHJcbiI7CiAgICAgZmlsZVdyaXRlLT5Xcml0ZUJsb2NrKGNvbnRlbnQuY19zdHIoKSwgZmlsZVdyaXRlLT5HZXRTaXplKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuR2V0TGVuZ3RoKCkpOwotICAgIG1fcENvbnRleHQtPkdldFhGQURvY1ZpZXcoKS0+R2V0RG9jKCktPlNhdmVQYWNrYWdlKFhGQV9IQVNIQ09ERV9EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVXcml0ZSwgbnVsbHB0cik7CisgICAgQ1hGQV9GRkRvYyogZmZkb2MgPSBtX3BDb250ZXh0LT5HZXRYRkFEb2NWaWV3KCktPkdldERvYygpOworICAgIGZmZG9jLT5TYXZlUGFja2FnZSgKKyAgICAgICAgVG9Ob2RlKGZmZG9jLT5HZXRYRkFEb2MoKS0+R2V0WEZBT2JqZWN0KFhGQV9IQVNIQ09ERV9EYXRhKSksIGZpbGVXcml0ZSwKKyAgICAgICAgbnVsbHB0cik7CiAgIH0gZWxzZSBpZiAoZmlsZVR5cGUgPT0gRlhGQV9TQVZFQVNfWERQKSB7CiAgICAgaWYgKCFtX3BDb250ZXh0LT5HZXRQREZEb2MoKSkKICAgICAgIHJldHVybjsKIAotICAgIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BDb250ZXh0LT5HZXRQREZEb2MoKS0+R2V0Um9vdCgpOworICAgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BDb250ZXh0LT5HZXRQREZEb2MoKS0+R2V0Um9vdCgpOwogICAgIGlmICghcFJvb3QpCiAgICAgICByZXR1cm47CiAKQEAgLTQ3NywyOCArNDcyLDMyIEBACiAgICAgICBpZiAoIXBTdHJlYW0pCiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgaWYgKHBQcmVQREZPYmotPkdldFN0cmluZygpID09ICJmb3JtIikgewotICAgICAgICBtX3BDb250ZXh0LT5HZXRYRkFEb2NWaWV3KCktPkdldERvYygpLT5TYXZlUGFja2FnZShYRkFfSEFTSENPREVfRm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVdyaXRlLCBudWxscHRyKTsKKyAgICAgICAgQ1hGQV9GRkRvYyogZmZkb2MgPSBtX3BDb250ZXh0LT5HZXRYRkFEb2NWaWV3KCktPkdldERvYygpOworICAgICAgICBmZmRvYy0+U2F2ZVBhY2thZ2UoCisgICAgICAgICAgICBUb05vZGUoZmZkb2MtPkdldFhGQURvYygpLT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0Zvcm0pKSwKKyAgICAgICAgICAgIGZpbGVXcml0ZSwgbnVsbHB0cik7CiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQogICAgICAgaWYgKHBQcmVQREZPYmotPkdldFN0cmluZygpID09ICJkYXRhc2V0cyIpIHsKLSAgICAgICAgbV9wQ29udGV4dC0+R2V0WEZBRG9jVmlldygpLT5HZXREb2MoKS0+U2F2ZVBhY2thZ2UoCi0gICAgICAgICAgICBYRkFfSEFTSENPREVfRGF0YXNldHMsIGZpbGVXcml0ZSwgbnVsbHB0cik7CisgICAgICAgIENYRkFfRkZEb2MqIGZmZG9jID0gbV9wQ29udGV4dC0+R2V0WEZBRG9jVmlldygpLT5HZXREb2MoKTsKKyAgICAgICAgZmZkb2MtPlNhdmVQYWNrYWdlKAorICAgICAgICAgICAgVG9Ob2RlKGZmZG9jLT5HZXRYRkFEb2MoKS0+R2V0WEZBT2JqZWN0KFhGQV9IQVNIQ09ERV9EYXRhc2V0cykpLAorICAgICAgICAgICAgZmlsZVdyaXRlLCBudWxscHRyKTsKICAgICAgICAgY29udGludWU7CiAgICAgICB9CiAgICAgICBpZiAoaSA9PSBzaXplIC0gMSkgewotICAgICAgICBDRlhfV2lkZVN0cmluZyB3UGF0aCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGMTZMRSgKKyAgICAgICAgV2lkZVN0cmluZyB3UGF0aCA9IFdpZGVTdHJpbmc6OkZyb21VVEYxNkxFKAogICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBzaG9ydCo+KGJzLmNfc3RyKCkpLAogICAgICAgICAgICAgYnMuR2V0TGVuZ3RoKCkgLyBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgYlBhdGggPSB3UGF0aC5VVEY4RW5jb2RlKCk7CisgICAgICAgIEJ5dGVTdHJpbmcgYlBhdGggPSB3UGF0aC5VVEY4RW5jb2RlKCk7CiAgICAgICAgIGNvbnN0IGNoYXIqIHN6Rm9ybWF0ID0KICAgICAgICAgICAgICJcbjxwZGYgaHJlZj1cIiVzXCIgeG1sbnM9XCJodHRwOi8vbnMuYWRvYmUuY29tL3hkcC9wZGYvXCIvPiI7Ci0gICAgICAgIGNvbnRlbnQuRm9ybWF0KHN6Rm9ybWF0LCBiUGF0aC5jX3N0cigpKTsKKyAgICAgICAgQnl0ZVN0cmluZyBjb250ZW50ID0gQnl0ZVN0cmluZzo6Rm9ybWF0KHN6Rm9ybWF0LCBiUGF0aC5jX3N0cigpKTsKICAgICAgICAgZmlsZVdyaXRlLT5Xcml0ZUJsb2NrKGNvbnRlbnQuY19zdHIoKSwgZmlsZVdyaXRlLT5HZXRTaXplKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LkdldExlbmd0aCgpKTsKICAgICAgIH0KLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1N0cmVhbUFjYz4gcEFjYyhuZXcgQ1BERl9TdHJlYW1BY2MpOwotICAgICAgcEFjYy0+TG9hZEFsbERhdGEocFN0cmVhbSk7CisgICAgICBhdXRvIHBBY2MgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERl9TdHJlYW1BY2M+KHBTdHJlYW0pOworICAgICAgcEFjYy0+TG9hZEFsbERhdGFGaWx0ZXJlZCgpOwogICAgICAgZmlsZVdyaXRlLT5Xcml0ZUJsb2NrKHBBY2MtPkdldERhdGEoKSwgZmlsZVdyaXRlLT5HZXRTaXplKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEFjYy0+R2V0U2l6ZSgpKTsKICAgICB9CkBAIC01MDcsMTkgKzUwNiwxOSBAQAogfQogCiB2b2lkIENQREZYRkFfRG9jRW52aXJvbm1lbnQ6OkdvdG9VUkwoQ1hGQV9GRkRvYyogaERvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgYnNVUkwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBic1VSTCkgewogICBpZiAoaERvYyAhPSBtX3BDb250ZXh0LT5HZXRYRkFEb2MoKSkKICAgICByZXR1cm47CiAKLSAgaWYgKG1fcENvbnRleHQtPkdldERvY1R5cGUoKSAhPSBET0NUWVBFX0RZTkFNSUNfWEZBKQorICBpZiAobV9wQ29udGV4dC0+R2V0Rm9ybVR5cGUoKSAhPSBGb3JtVHlwZTo6a1hGQUZ1bGwpCiAgICAgcmV0dXJuOwogCiAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52ID0gbV9wQ29udGV4dC0+R2V0Rm9ybUZpbGxFbnYoKTsKICAgaWYgKCFwRm9ybUZpbGxFbnYpCiAgICAgcmV0dXJuOwogCi0gIENGWF9XaWRlU3RyaW5nQyBzdHIoYnNVUkwuY19zdHIoKSk7Ci0gIHBGb3JtRmlsbEVudi0+R290b1VSTCh0aGlzLCBzdHIpOworICBXaWRlU3RyaW5nVmlldyBzdHIoYnNVUkwuY19zdHIoKSk7CisgIHBGb3JtRmlsbEVudi0+R290b1VSTChtX3BDb250ZXh0LkdldCgpLCBzdHIpOwogfQogCiBib29sIENQREZYRkFfRG9jRW52aXJvbm1lbnQ6OklzVmFsaWRhdGlvbnNFbmFibGVkKENYRkFfRkZEb2MqIGhEb2MpIHsKQEAgLTU5OSw3ICs1OTgsNyBAQAogICAgIHJldHVybiAwOwogCiAgIHJldHVybiBBcmdiRW5jb2RlKHBJbnRlckZvcm0tPkdldEhpZ2hsaWdodEFscGhhKCksCi0gICAgICAgICAgICAgICAgICAgIHBJbnRlckZvcm0tPkdldEhpZ2hsaWdodENvbG9yKEZQREZfRk9STUZJRUxEX1hGQSkpOworICAgICAgICAgICAgICAgICAgICBwSW50ZXJGb3JtLT5HZXRIaWdobGlnaHRDb2xvcihGb3JtRmllbGRUeXBlOjprWEZBKSk7CiB9CiAKIGJvb2wgQ1BERlhGQV9Eb2NFbnZpcm9ubWVudDo6Tm90aWZ5U3VibWl0KGJvb2wgYlByZXZPclBvc3QpIHsKQEAgLTYxMSwyMSArNjEwLDE5IEBACiB9CiAKIGJvb2wgQ1BERlhGQV9Eb2NFbnZpcm9ubWVudDo6T25CZWZvcmVOb3RpZnlTdWJtaXQoKSB7Ci0gIGlmIChtX3BDb250ZXh0LT5HZXREb2NUeXBlKCkgIT0gRE9DVFlQRV9EWU5BTUlDX1hGQSAmJgotICAgICAgbV9wQ29udGV4dC0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfU1RBVElDX1hGQSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgaWYgKCFtX3BDb250ZXh0LT5HZXRYRkFEb2NWaWV3KCkpCisgIGlmICghbV9wQ29udGV4dC0+Q29udGFpbnNYRkFGb3JtKCkpCiAgICAgcmV0dXJuIHRydWU7CiAKLSAgQ1hGQV9GRldpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0KLSAgICAgIG1fcENvbnRleHQtPkdldFhGQURvY1ZpZXcoKS0+R2V0V2lkZ2V0SGFuZGxlcigpOworICBDWEZBX0ZGRG9jVmlldyogZG9jVmlldyA9IG1fcENvbnRleHQtPkdldFhGQURvY1ZpZXcoKTsKKyAgaWYgKCFkb2NWaWV3KQorICAgIHJldHVybiB0cnVlOworCisgIENYRkFfRkZXaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IGRvY1ZpZXctPkdldFdpZGdldEhhbmRsZXIoKTsKICAgaWYgKCFwV2lkZ2V0SGFuZGxlcikKICAgICByZXR1cm4gdHJ1ZTsKIAotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9XaWRnZXRBY2NJdGVyYXRvcj4gcFdpZGdldEFjY0l0ZXJhdG9yKAotICAgICAgbV9wQ29udGV4dC0+R2V0WEZBRG9jVmlldygpLT5DcmVhdGVXaWRnZXRBY2NJdGVyYXRvcigpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfV2lkZ2V0QWNjSXRlcmF0b3I+IHBXaWRnZXRBY2NJdGVyYXRvciA9CisgICAgICBkb2NWaWV3LT5DcmVhdGVXaWRnZXRBY2NJdGVyYXRvcigpOwogICBpZiAocFdpZGdldEFjY0l0ZXJhdG9yKSB7CiAgICAgQ1hGQV9FdmVudFBhcmFtIFBhcmFtOwogICAgIFBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfUHJlU3VibWl0OwpAQCAtNjMzLDIzICs2MzAsMjEgQEAKICAgICAgIHBXaWRnZXRIYW5kbGVyLT5Qcm9jZXNzRXZlbnQocFdpZGdldEFjYywgJlBhcmFtKTsKICAgfQogCi0gIHBXaWRnZXRBY2NJdGVyYXRvci5yZXNldCgKLSAgICAgIG1fcENvbnRleHQtPkdldFhGQURvY1ZpZXcoKS0+Q3JlYXRlV2lkZ2V0QWNjSXRlcmF0b3IoKSk7CisgIHBXaWRnZXRBY2NJdGVyYXRvciA9IGRvY1ZpZXctPkNyZWF0ZVdpZGdldEFjY0l0ZXJhdG9yKCk7CiAgIGlmICghcFdpZGdldEFjY0l0ZXJhdG9yKQogICAgIHJldHVybiB0cnVlOwogCiAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gcFdpZGdldEFjY0l0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7CiAgIHBXaWRnZXRBY2MgPSBwV2lkZ2V0QWNjSXRlcmF0b3ItPk1vdmVUb05leHQoKTsKICAgd2hpbGUgKHBXaWRnZXRBY2MpIHsKLSAgICBpbnQgZlJldCA9IHBXaWRnZXRBY2MtPlByb2Nlc3NWYWxpZGF0ZSgtMSk7CisgICAgaW50IGZSZXQgPSBwV2lkZ2V0QWNjLT5HZXROb2RlKCktPlByb2Nlc3NWYWxpZGF0ZShkb2NWaWV3LCAtMSk7CiAgICAgaWYgKGZSZXQgPT0gWEZBX0VWRU5URVJST1JfRXJyb3IpIHsKICAgICAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52ID0gbV9wQ29udGV4dC0+R2V0Rm9ybUZpbGxFbnYoKTsKICAgICAgIGlmICghcEZvcm1GaWxsRW52KQogICAgICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzOwotICAgICAgd3MuRnJvbUxvY2FsKElEU19YRkFfVmFsaWRhdGVfSW5wdXQpOwotICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnMgPSB3cy5VVEYxNkxFX0VuY29kZSgpOworICAgICAgV2lkZVN0cmluZyB3cyA9IFdpZGVTdHJpbmc6OkZyb21Mb2NhbChJRFNfWEZBX1ZhbGlkYXRlX0lucHV0KTsKKyAgICAgIEJ5dGVTdHJpbmcgYnMgPSB3cy5VVEYxNkxFX0VuY29kZSgpOwogICAgICAgaW50IGxlbiA9IGJzLkdldExlbmd0aCgpOwogICAgICAgcEZvcm1GaWxsRW52LT5BbGVydCgoRlBERl9XSURFU1RSSU5HKWJzLkdldEJ1ZmZlcihsZW4pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAoRlBERl9XSURFU1RSSU5HKUwiIiwgMCwgMSk7CkBAIC02NTgsMTQgKzY1MywxMyBAQAogICAgIH0KICAgICBwV2lkZ2V0QWNjID0gcFdpZGdldEFjY0l0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7CiAgIH0KLSAgbV9wQ29udGV4dC0+R2V0WEZBRG9jVmlldygpLT5VcGRhdGVEb2NWaWV3KCk7CisgIGRvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsKIAogICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBDUERGWEZBX0RvY0Vudmlyb25tZW50OjpPbkFmdGVyTm90aWZ5U3VibWl0KCkgewotICBpZiAobV9wQ29udGV4dC0+R2V0RG9jVHlwZSgpICE9IERPQ1RZUEVfRFlOQU1JQ19YRkEgJiYKLSAgICAgIG1fcENvbnRleHQtPkdldERvY1R5cGUoKSAhPSBET0NUWVBFX1NUQVRJQ19YRkEpCisgIGlmICghbV9wQ29udGV4dC0+Q29udGFpbnNYRkFGb3JtKCkpCiAgICAgcmV0dXJuOwogCiAgIGlmICghbV9wQ29udGV4dC0+R2V0WEZBRG9jVmlldygpKQpAQCAtNjc2LDggKzY3MCw4IEBACiAgIGlmICghcFdpZGdldEhhbmRsZXIpCiAgICAgcmV0dXJuOwogCi0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX1dpZGdldEFjY0l0ZXJhdG9yPiBwV2lkZ2V0QWNjSXRlcmF0b3IoCi0gICAgICBtX3BDb250ZXh0LT5HZXRYRkFEb2NWaWV3KCktPkNyZWF0ZVdpZGdldEFjY0l0ZXJhdG9yKCkpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9XaWRnZXRBY2NJdGVyYXRvcj4gcFdpZGdldEFjY0l0ZXJhdG9yID0KKyAgICAgIG1fcENvbnRleHQtPkdldFhGQURvY1ZpZXcoKS0+Q3JlYXRlV2lkZ2V0QWNjSXRlcmF0b3IoKTsKICAgaWYgKCFwV2lkZ2V0QWNjSXRlcmF0b3IpCiAgICAgcmV0dXJuOwogCkBAIC02OTEsMjQgKzY4NSwyNCBAQAogICBtX3BDb250ZXh0LT5HZXRYRkFEb2NWaWV3KCktPlVwZGF0ZURvY1ZpZXcoKTsKIH0KIAotYm9vbCBDUERGWEZBX0RvY0Vudmlyb25tZW50OjpTdWJtaXREYXRhKENYRkFfRkZEb2MqIGhEb2MsIENYRkFfU3VibWl0IHN1Ym1pdCkgeworYm9vbCBDUERGWEZBX0RvY0Vudmlyb25tZW50OjpTdWJtaXQoQ1hGQV9GRkRvYyogaERvYywgQ1hGQV9TdWJtaXQqIHN1Ym1pdCkgewogICBpZiAoIU5vdGlmeVN1Ym1pdCh0cnVlKSB8fCAhbV9wQ29udGV4dC0+R2V0WEZBRG9jVmlldygpKQogICAgIHJldHVybiBmYWxzZTsKIAogICBtX3BDb250ZXh0LT5HZXRYRkFEb2NWaWV3KCktPlVwZGF0ZURvY1ZpZXcoKTsKLSAgYm9vbCByZXQgPSBTdWJtaXREYXRhSW50ZXJuYWwoaERvYywgc3VibWl0KTsKKyAgYm9vbCByZXQgPSBTdWJtaXRJbnRlcm5hbChoRG9jLCBzdWJtaXQpOwogICBOb3RpZnlTdWJtaXQoZmFsc2UpOwogICByZXR1cm4gcmV0OwogfQogCi1DRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IENQREZYRkFfRG9jRW52aXJvbm1lbnQ6Ok9wZW5MaW5rZWRGaWxlKAorUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IENQREZYRkFfRG9jRW52aXJvbm1lbnQ6Ok9wZW5MaW5rZWRGaWxlKAogICAgIENYRkFfRkZEb2MqIGhEb2MsCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTGluaykgeworICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzTGluaykgewogICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiA9IG1fcENvbnRleHQtPkdldEZvcm1GaWxsRW52KCk7CiAgIGlmICghcEZvcm1GaWxsRW52KQogICAgIHJldHVybiBudWxscHRyOwogCi0gIENGWF9CeXRlU3RyaW5nIGJzID0gd3NMaW5rLlVURjE2TEVfRW5jb2RlKCk7CisgIEJ5dGVTdHJpbmcgYnMgPSB3c0xpbmsuVVRGMTZMRV9FbmNvZGUoKTsKICAgaW50IGxlbiA9IGJzLkdldExlbmd0aCgpOwogICBGUERGX0ZJTEVIQU5ETEVSKiBwRmlsZUhhbmRsZXIgPQogICAgICAgcEZvcm1GaWxsRW52LT5PcGVuRmlsZSgwLCAoRlBERl9XSURFU1RSSU5HKWJzLkdldEJ1ZmZlcihsZW4pLCAicmIiKTsKQEAgLTcyNiwxOSArNzIwLDIwIEBACiAgIGlmICghbV9wQ29udGV4dC0+R2V0WEZBRG9jVmlldygpKQogICAgIHJldHVybiBmYWxzZTsKIAotICBDRlhfQnl0ZVN0cmluZyBjb250ZW50OwogICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiA9IG1fcENvbnRleHQtPkdldEZvcm1GaWxsRW52KCk7CiAgIGlmICghcEZvcm1GaWxsRW52KQogICAgIHJldHVybiBmYWxzZTsKIAotICBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVN0cmVhbT4gZmlsZVN0cmVhbSA9Ci0gICAgICBNYWtlU2Vla2FibGVTdHJlYW0ocEZpbGVIYW5kbGVyKTsKLQorICBDWEZBX0ZGRG9jKiBmZmRvYyA9IG1fcENvbnRleHQtPkdldFhGQURvY1ZpZXcoKS0+R2V0RG9jKCk7CisgIFJldGFpblB0cjxJRlhfU2Vla2FibGVTdHJlYW0+IGZpbGVTdHJlYW0gPSBNYWtlU2Vla2FibGVTdHJlYW0ocEZpbGVIYW5kbGVyKTsKICAgaWYgKGZpbGVUeXBlID09IEZYRkFfU0FWRUFTX1hNTCkgewotICAgIGNvbnN0IGNoYXIga0NvbnRlbnRbXSA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cclxuIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0NvbnRlbnRbXSA9CisgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cclxuIjsKICAgICBmaWxlU3RyZWFtLT5Xcml0ZUJsb2NrKGtDb250ZW50LCAwLCBzdHJsZW4oa0NvbnRlbnQpKTsKLSAgICBtX3BDb250ZXh0LT5HZXRYRkFEb2MoKS0+U2F2ZVBhY2thZ2UoWEZBX0hBU0hDT0RFX0RhdGEsIGZpbGVTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworCisgICAgZmZkb2MtPlNhdmVQYWNrYWdlKAorICAgICAgICBUb05vZGUoZmZkb2MtPkdldFhGQURvYygpLT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0RhdGEpKSwgZmlsZVN0cmVhbSwKKyAgICAgICAgbnVsbHB0cik7CiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIApAQCAtNzU0LDcgKzc0OSw3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKLSAgQ1BERl9EaWN0aW9uYXJ5KiBwUm9vdCA9IG1fcENvbnRleHQtPkdldFBERkRvYygpLT5HZXRSb290KCk7CisgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BDb250ZXh0LT5HZXRQREZEb2MoKS0+R2V0Um9vdCgpOwogICBpZiAoIXBSb290KSB7CiAgICAgZmlsZVN0cmVhbS0+Rmx1c2goKTsKICAgICByZXR1cm4gZmFsc2U7CkBAIC03OTgsMzQgKzc5MywzNSBAQAogICAgICAgY29udGludWU7CiAgICAgaWYgKHBQcmVQREZPYmotPkdldFN0cmluZygpID09ICJmb3JtIiAmJiAhKGZsYWcgJiBGWEZBX0ZPUk0pKQogICAgICAgY29udGludWU7CisKICAgICBpZiAocFByZVBERk9iai0+R2V0U3RyaW5nKCkgPT0gImZvcm0iKSB7Ci0gICAgICBtX3BDb250ZXh0LT5HZXRYRkFEb2MoKS0+U2F2ZVBhY2thZ2UoWEZBX0hBU0hDT0RFX0Zvcm0sIGZpbGVTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgICBmZmRvYy0+U2F2ZVBhY2thZ2UoCisgICAgICAgICAgVG9Ob2RlKGZmZG9jLT5HZXRYRkFEb2MoKS0+R2V0WEZBT2JqZWN0KFhGQV9IQVNIQ09ERV9Gb3JtKSksCisgICAgICAgICAgZmlsZVN0cmVhbSwgbnVsbHB0cik7CiAgICAgfSBlbHNlIGlmIChwUHJlUERGT2JqLT5HZXRTdHJpbmcoKSA9PSAiZGF0YXNldHMiKSB7Ci0gICAgICBtX3BDb250ZXh0LT5HZXRYRkFEb2MoKS0+U2F2ZVBhY2thZ2UoWEZBX0hBU0hDT0RFX0RhdGFzZXRzLCBmaWxlU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBQREYsY3JlYXRvci4KKyAgICAgIGZmZG9jLT5TYXZlUGFja2FnZSgKKyAgICAgICAgICBUb05vZGUoZmZkb2MtPkdldFhGQURvYygpLT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0RhdGFzZXRzKSksCisgICAgICAgICAgZmlsZVN0cmVhbSwgbnVsbHB0cik7CiAgICAgfQogICB9CiAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIENQREZYRkFfRG9jRW52aXJvbm1lbnQ6OlRvWEZBQ29udGVudEZsYWdzKENGWF9XaWRlU3RyaW5nIGNzU3JjQ29udGVudCwKK3ZvaWQgQ1BERlhGQV9Eb2NFbnZpcm9ubWVudDo6VG9YRkFDb250ZW50RmxhZ3MoV2lkZVN0cmluZyBjc1NyY0NvbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQmIGZsYWcpIHsKLSAgaWYgKGNzU3JjQ29udGVudC5GaW5kKEwiIGNvbmZpZyAiLCAwKSAhPSAtMSkKKyAgaWYgKGNzU3JjQ29udGVudC5Db250YWlucyhMIiBjb25maWcgIikpCiAgICAgZmxhZyB8PSBGWEZBX0NPTkZJRzsKLSAgaWYgKGNzU3JjQ29udGVudC5GaW5kKEwiIHRlbXBsYXRlICIsIDApICE9IC0xKQorICBpZiAoY3NTcmNDb250ZW50LkNvbnRhaW5zKEwiIHRlbXBsYXRlICIpKQogICAgIGZsYWcgfD0gRlhGQV9URU1QTEFURTsKLSAgaWYgKGNzU3JjQ29udGVudC5GaW5kKEwiIGxvY2FsZVNldCAiLCAwKSAhPSAtMSkKKyAgaWYgKGNzU3JjQ29udGVudC5Db250YWlucyhMIiBsb2NhbGVTZXQgIikpCiAgICAgZmxhZyB8PSBGWEZBX0xPQ0FMRVNFVDsKLSAgaWYgKGNzU3JjQ29udGVudC5GaW5kKEwiIGRhdGFzZXRzICIsIDApICE9IC0xKQorICBpZiAoY3NTcmNDb250ZW50LkNvbnRhaW5zKEwiIGRhdGFzZXRzICIpKQogICAgIGZsYWcgfD0gRlhGQV9EQVRBU0VUUzsKLSAgaWYgKGNzU3JjQ29udGVudC5GaW5kKEwiIHhtcG1ldGEgIiwgMCkgIT0gLTEpCisgIGlmIChjc1NyY0NvbnRlbnQuQ29udGFpbnMoTCIgeG1wbWV0YSAiKSkKICAgICBmbGFnIHw9IEZYRkFfWE1QTUVUQTsKLSAgaWYgKGNzU3JjQ29udGVudC5GaW5kKEwiIHhmZGYgIiwgMCkgIT0gLTEpCisgIGlmIChjc1NyY0NvbnRlbnQuQ29udGFpbnMoTCIgeGZkZiAiKSkKICAgICBmbGFnIHw9IEZYRkFfWEZERjsKLSAgaWYgKGNzU3JjQ29udGVudC5GaW5kKEwiIGZvcm0gIiwgMCkgIT0gLTEpCisgIGlmIChjc1NyY0NvbnRlbnQuQ29udGFpbnMoTCIgZm9ybSAiKSkKICAgICBmbGFnIHw9IEZYRkFfRk9STTsKICAgaWYgKGZsYWcgPT0gMCkgewogICAgIGZsYWcgPSBGWEZBX0NPTkZJRyB8IEZYRkFfVEVNUExBVEUgfCBGWEZBX0xPQ0FMRVNFVCB8IEZYRkFfREFUQVNFVFMgfApAQCAtODMzLDQzICs4MjksNDAgQEAKICAgfQogfQogCi1ib29sIENQREZYRkFfRG9jRW52aXJvbm1lbnQ6Ok1haWxUb0luZm8oQ0ZYX1dpZGVTdHJpbmcmIGNzVVJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc1RvQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgY3NDQ0FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGNzQkNDQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgY3NTdWJqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc01zZykgewotICBDRlhfV2lkZVN0cmluZyBzcmNVUkwgPSBjc1VSTDsKK2Jvb2wgQ1BERlhGQV9Eb2NFbnZpcm9ubWVudDo6TWFpbFRvSW5mbyhXaWRlU3RyaW5nJiBjc1VSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiBjc1RvQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiBjc0NDQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiBjc0JDQ0FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyYgY3NTdWJqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIGNzTXNnKSB7CisgIFdpZGVTdHJpbmcgc3JjVVJMID0gY3NVUkw7CiAgIHNyY1VSTC5UcmltTGVmdCgpOwogICBpZiAoc3JjVVJMLkxlZnQoNykuQ29tcGFyZU5vQ2FzZShMIm1haWx0bzoiKSAhPSAwKQogICAgIHJldHVybiBmYWxzZTsKIAotICBpbnQgcG9zID0gc3JjVVJMLkZpbmQoTCc/JywgMCk7Ci0gIENGWF9XaWRlU3RyaW5nIHRtcDsKLSAgaWYgKHBvcyA9PSAtMSkgewotICAgIHBvcyA9IHNyY1VSTC5GaW5kKEwnQCcsIDApOwotICAgIGlmIChwb3MgPT0gLTEpCisgIGF1dG8gcG9zID0gc3JjVVJMLkZpbmQoTCc/Jyk7CisgIFdpZGVTdHJpbmcgdG1wOworICBpZiAoIXBvcy5oYXNfdmFsdWUoKSkgeworICAgIHBvcyA9IHNyY1VSTC5GaW5kKEwnQCcpOworICAgIGlmICghcG9zLmhhc192YWx1ZSgpKQogICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgdG1wID0gc3JjVVJMLlJpZ2h0KGNzVVJMLkdldExlbmd0aCgpIC0gNyk7CiAgIH0gZWxzZSB7Ci0gICAgdG1wID0gc3JjVVJMLkxlZnQocG9zKTsKKyAgICB0bXAgPSBzcmNVUkwuTGVmdChwb3MudmFsdWUoKSk7CiAgICAgdG1wID0gdG1wLlJpZ2h0KHRtcC5HZXRMZW5ndGgoKSAtIDcpOwogICB9Ci0gIHRtcC5UcmltTGVmdCgpOwotICB0bXAuVHJpbVJpZ2h0KCk7CisgIHRtcC5UcmltKCk7CiAKICAgY3NUb0FkZHJlc3MgPSB0bXA7CiAKLSAgc3JjVVJMID0gc3JjVVJMLlJpZ2h0KHNyY1VSTC5HZXRMZW5ndGgoKSAtIChwb3MgKyAxKSk7CisgIHNyY1VSTCA9IHNyY1VSTC5SaWdodChzcmNVUkwuR2V0TGVuZ3RoKCkgLSAocG9zLnZhbHVlKCkgKyAxKSk7CiAgIHdoaWxlICghc3JjVVJMLklzRW1wdHkoKSkgewotICAgIHNyY1VSTC5UcmltTGVmdCgpOwotICAgIHNyY1VSTC5UcmltUmlnaHQoKTsKLSAgICBwb3MgPSBzcmNVUkwuRmluZChMJyYnLCAwKTsKKyAgICBzcmNVUkwuVHJpbSgpOworICAgIHBvcyA9IHNyY1VSTC5GaW5kKEwnJicpOwogCi0gICAgdG1wID0gKHBvcyA9PSAtMSkgPyBzcmNVUkwgOiBzcmNVUkwuTGVmdChwb3MpOwotICAgIHRtcC5UcmltTGVmdCgpOwotICAgIHRtcC5UcmltUmlnaHQoKTsKKyAgICB0bXAgPSAoIXBvcy5oYXNfdmFsdWUoKSkgPyBzcmNVUkwgOiBzcmNVUkwuTGVmdChwb3MudmFsdWUoKSk7CisgICAgdG1wLlRyaW0oKTsKICAgICBpZiAodG1wLkdldExlbmd0aCgpID49IDMgJiYgdG1wLkxlZnQoMykuQ29tcGFyZU5vQ2FzZShMImNjPSIpID09IDApIHsKICAgICAgIHRtcCA9IHRtcC5SaWdodCh0bXAuR2V0TGVuZ3RoKCkgLSAzKTsKICAgICAgIGlmICghY3NDQ0FkZHJlc3MuSXNFbXB0eSgpKQpAQCAtODkwLDcgKzg4Myw5IEBACiAgICAgICB0bXAgPSB0bXAuUmlnaHQodG1wLkdldExlbmd0aCgpIC0gNSk7CiAgICAgICBjc01zZyArPSB0bXA7CiAgICAgfQotICAgIHNyY1VSTCA9IChwb3MgPT0gLTEpID8gTCIiIDogc3JjVVJMLlJpZ2h0KGNzVVJMLkdldExlbmd0aCgpIC0gKHBvcyArIDEpKTsKKyAgICBzcmNVUkwgPSAhcG9zLmhhc192YWx1ZSgpCisgICAgICAgICAgICAgICAgID8gTCIiCisgICAgICAgICAgICAgICAgIDogc3JjVVJMLlJpZ2h0KGNzVVJMLkdldExlbmd0aCgpIC0gKHBvcy52YWx1ZSgpICsgMSkpOwogICB9CiAgIGNzVG9BZGRyZXNzLlJlcGxhY2UoTCIsIiwgTCI7Iik7CiAgIGNzQ0NBZGRyZXNzLlJlcGxhY2UoTCIsIiwgTCI7Iik7CkBAIC04OTgsNDEgKzg5MywzNCBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDUERGWEZBX0RvY0Vudmlyb25tZW50OjpTdWJtaXREYXRhSW50ZXJuYWwoQ1hGQV9GRkRvYyogaERvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfU3VibWl0IHN1Ym1pdCkgeworYm9vbCBDUERGWEZBX0RvY0Vudmlyb25tZW50OjpTdWJtaXRJbnRlcm5hbChDWEZBX0ZGRG9jKiBoRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1N1Ym1pdCogc3VibWl0KSB7CiAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52ID0gbV9wQ29udGV4dC0+R2V0Rm9ybUZpbGxFbnYoKTsKICAgaWYgKCFwRm9ybUZpbGxFbnYpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIENGWF9XaWRlU3RyaW5nQyBjc1VSTEM7Ci0gIHN1Ym1pdC5HZXRTdWJtaXRUYXJnZXQoY3NVUkxDKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgY3NVUkwoY3NVUkxDKTsKKyAgV2lkZVN0cmluZyBjc1VSTCA9IHN1Ym1pdC0+R2V0U3VibWl0VGFyZ2V0KCk7CiAgIGlmIChjc1VSTC5Jc0VtcHR5KCkpIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3czsKLSAgICB3cy5Gcm9tTG9jYWwoIlN1Ym1pdCBjYW5jZWxsZWQuIik7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnMgPSB3cy5VVEYxNkxFX0VuY29kZSgpOworICAgIFdpZGVTdHJpbmcgd3MgPSBXaWRlU3RyaW5nOjpGcm9tTG9jYWwoIlN1Ym1pdCBjYW5jZWxsZWQuIik7CisgICAgQnl0ZVN0cmluZyBicyA9IHdzLlVURjE2TEVfRW5jb2RlKCk7CiAgICAgaW50IGxlbiA9IGJzLkdldExlbmd0aCgpOwotICAgIHBGb3JtRmlsbEVudi0+QWxlcnQoKEZQREZfV0lERVNUUklORylicy5HZXRCdWZmZXIobGVuKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChGUERGX1dJREVTVFJJTkcpTCIiLCAwLCA0KTsKKyAgICBwRm9ybUZpbGxFbnYtPkFsZXJ0KHJlaW50ZXJwcmV0X2Nhc3Q8RlBERl9XSURFU1RSSU5HPihicy5HZXRCdWZmZXIobGVuKSksCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEZQREZfV0lERVNUUklORz4oTCIiKSwgMCwgNCk7CiAgICAgYnMuUmVsZWFzZUJ1ZmZlcihsZW4pOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogCiAgIEZQREZfRklMRUhBTkRMRVIqIHBGaWxlSGFuZGxlciA9IG51bGxwdHI7CiAgIGludCBmaWxlRmxhZyA9IC0xOwotICBzd2l0Y2ggKHN1Ym1pdC5HZXRTdWJtaXRGb3JtYXQoKSkgewotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fWGRwOiB7Ci0gICAgICBDRlhfV2lkZVN0cmluZ0MgY3NDb250ZW50QzsKLSAgICAgIHN1Ym1pdC5HZXRTdWJtaXRYRFBDb250ZW50KGNzQ29udGVudEMpOwotICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NDb250ZW50OwotICAgICAgY3NDb250ZW50ID0gY3NDb250ZW50QzsKLSAgICAgIGNzQ29udGVudC5UcmltTGVmdCgpOwotICAgICAgY3NDb250ZW50LlRyaW1SaWdodCgpOwotICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3BhY2U7Ci0gICAgICBzcGFjZS5Gcm9tTG9jYWwoIiAiKTsKKyAgc3dpdGNoIChzdWJtaXQtPkdldFN1Ym1pdEZvcm1hdCgpKSB7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6WGRwOiB7CisgICAgICBXaWRlU3RyaW5nIGNzQ29udGVudCA9IHN1Ym1pdC0+R2V0U3VibWl0WERQQ29udGVudCgpOworICAgICAgY3NDb250ZW50LlRyaW0oKTsKKworICAgICAgV2lkZVN0cmluZyBzcGFjZSA9IFdpZGVTdHJpbmc6OkZyb21Mb2NhbCgiICIpOwogICAgICAgY3NDb250ZW50ID0gc3BhY2UgKyBjc0NvbnRlbnQgKyBzcGFjZTsKICAgICAgIEZQREZfRFdPUkQgZmxhZyA9IDA7Ci0gICAgICBpZiAoc3VibWl0LklzU3VibWl0RW1iZWRQREYoKSkKKyAgICAgIGlmIChzdWJtaXQtPklzU3VibWl0RW1iZWRQREYoKSkKICAgICAgICAgZmxhZyB8PSBGWEZBX1BERjsKIAogICAgICAgVG9YRkFDb250ZW50RmxhZ3MoY3NDb250ZW50LCBmbGFnKTsKQEAgLTk0MSwxNCArOTI5LDE0IEBACiAgICAgICBFeHBvcnRTdWJtaXRGaWxlKHBGaWxlSGFuZGxlciwgRlhGQV9TQVZFQVNfWERQLCAwLCBmbGFnKTsKICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1htbDoKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpYbWw6CiAgICAgICBwRmlsZUhhbmRsZXIgPSBwRm9ybUZpbGxFbnYtPk9wZW5GaWxlKEZYRkFfU0FWRUFTX1hNTCwgbnVsbHB0ciwgIndiIik7CiAgICAgICBmaWxlRmxhZyA9IEZYRkFfU0FWRUFTX1hNTDsKICAgICAgIEV4cG9ydFN1Ym1pdEZpbGUocEZpbGVIYW5kbGVyLCBGWEZBX1NBVkVBU19YTUwsIDAsIEZYRkFfWEZBX0FMTCk7CiAgICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1BkZjoKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpQZGY6CiAgICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1VybGVuY29kZWQ6CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6VXJsZW5jb2RlZDoKICAgICAgIHBGaWxlSGFuZGxlciA9IHBGb3JtRmlsbEVudi0+T3BlbkZpbGUoRlhGQV9TQVZFQVNfWE1MLCBudWxscHRyLCAid2IiKTsKICAgICAgIGZpbGVGbGFnID0gRlhGQV9TQVZFQVNfWE1MOwogICAgICAgRXhwb3J0U3VibWl0RmlsZShwRmlsZUhhbmRsZXIsIEZYRkFfU0FWRUFTX1hNTCwgMCwgRlhGQV9YRkFfQUxMKTsKQEAgLTk1OCwyMSArOTQ2LDIyIEBACiAgIH0KICAgaWYgKCFwRmlsZUhhbmRsZXIpCiAgICAgcmV0dXJuIGZhbHNlOworCiAgIGlmIChjc1VSTC5MZWZ0KDcpLkNvbXBhcmVOb0Nhc2UoTCJtYWlsdG86IikgPT0gMCkgewotICAgIENGWF9XaWRlU3RyaW5nIGNzVG9BZGRyZXNzOwotICAgIENGWF9XaWRlU3RyaW5nIGNzQ0NBZGRyZXNzOwotICAgIENGWF9XaWRlU3RyaW5nIGNzQkNDQWRkcmVzczsKLSAgICBDRlhfV2lkZVN0cmluZyBjc1N1YmplY3Q7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgY3NNc2c7CisgICAgV2lkZVN0cmluZyBjc1RvQWRkcmVzczsKKyAgICBXaWRlU3RyaW5nIGNzQ0NBZGRyZXNzOworICAgIFdpZGVTdHJpbmcgY3NCQ0NBZGRyZXNzOworICAgIFdpZGVTdHJpbmcgY3NTdWJqZWN0OworICAgIFdpZGVTdHJpbmcgY3NNc2c7CiAgICAgaWYgKCFNYWlsVG9JbmZvKGNzVVJMLCBjc1RvQWRkcmVzcywgY3NDQ0FkZHJlc3MsIGNzQkNDQWRkcmVzcywgY3NTdWJqZWN0LAogICAgICAgICAgICAgICAgICAgICBjc01zZykpIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNUbyA9IENGWF9XaWRlU3RyaW5nKGNzVG9BZGRyZXNzKS5VVEYxNkxFX0VuY29kZSgpOwotICAgIENGWF9CeXRlU3RyaW5nIGJzQ0MgPSBDRlhfV2lkZVN0cmluZyhjc0NDQWRkcmVzcykuVVRGMTZMRV9FbmNvZGUoKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBic0JjYyA9IENGWF9XaWRlU3RyaW5nKGNzQkNDQWRkcmVzcykuVVRGMTZMRV9FbmNvZGUoKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBic1N1YmplY3QgPSBDRlhfV2lkZVN0cmluZyhjc1N1YmplY3QpLlVURjE2TEVfRW5jb2RlKCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNNc2cgPSBDRlhfV2lkZVN0cmluZyhjc01zZykuVVRGMTZMRV9FbmNvZGUoKTsKKyAgICBCeXRlU3RyaW5nIGJzVG8gPSBXaWRlU3RyaW5nKGNzVG9BZGRyZXNzKS5VVEYxNkxFX0VuY29kZSgpOworICAgIEJ5dGVTdHJpbmcgYnNDQyA9IFdpZGVTdHJpbmcoY3NDQ0FkZHJlc3MpLlVURjE2TEVfRW5jb2RlKCk7CisgICAgQnl0ZVN0cmluZyBic0JjYyA9IFdpZGVTdHJpbmcoY3NCQ0NBZGRyZXNzKS5VVEYxNkxFX0VuY29kZSgpOworICAgIEJ5dGVTdHJpbmcgYnNTdWJqZWN0ID0gV2lkZVN0cmluZyhjc1N1YmplY3QpLlVURjE2TEVfRW5jb2RlKCk7CisgICAgQnl0ZVN0cmluZyBic01zZyA9IFdpZGVTdHJpbmcoY3NNc2cpLlVURjE2TEVfRW5jb2RlKCk7CiAgICAgRlBERl9XSURFU1RSSU5HIHBUbyA9IChGUERGX1dJREVTVFJJTkcpYnNUby5HZXRCdWZmZXIoYnNUby5HZXRMZW5ndGgoKSk7CiAgICAgRlBERl9XSURFU1RSSU5HIHBDQyA9IChGUERGX1dJREVTVFJJTkcpYnNDQy5HZXRCdWZmZXIoYnNDQy5HZXRMZW5ndGgoKSk7CiAgICAgRlBERl9XSURFU1RSSU5HIHBCY2MgPSAoRlBERl9XSURFU1RSSU5HKWJzQmNjLkdldEJ1ZmZlcihic0JjYy5HZXRMZW5ndGgoKSk7CkBAIC05ODAsMTUgKzk2OSwxNSBAQAogICAgICAgICAoRlBERl9XSURFU1RSSU5HKWJzU3ViamVjdC5HZXRCdWZmZXIoYnNTdWJqZWN0LkdldExlbmd0aCgpKTsKICAgICBGUERGX1dJREVTVFJJTkcgcE1zZyA9IChGUERGX1dJREVTVFJJTkcpYnNNc2cuR2V0QnVmZmVyKGJzTXNnLkdldExlbmd0aCgpKTsKICAgICBwRm9ybUZpbGxFbnYtPkVtYWlsVG8ocEZpbGVIYW5kbGVyLCBwVG8sIHBTdWJqZWN0LCBwQ0MsIHBCY2MsIHBNc2cpOwotICAgIGJzVG8uUmVsZWFzZUJ1ZmZlcigpOwotICAgIGJzQ0MuUmVsZWFzZUJ1ZmZlcigpOwotICAgIGJzQmNjLlJlbGVhc2VCdWZmZXIoKTsKLSAgICBic1N1YmplY3QuUmVsZWFzZUJ1ZmZlcigpOwotICAgIGJzTXNnLlJlbGVhc2VCdWZmZXIoKTsKKyAgICBic1RvLlJlbGVhc2VCdWZmZXIoYnNUby5HZXRTdHJpbmdMZW5ndGgoKSk7CisgICAgYnNDQy5SZWxlYXNlQnVmZmVyKGJzQ0MuR2V0U3RyaW5nTGVuZ3RoKCkpOworICAgIGJzQmNjLlJlbGVhc2VCdWZmZXIoYnNCY2MuR2V0U3RyaW5nTGVuZ3RoKCkpOworICAgIGJzU3ViamVjdC5SZWxlYXNlQnVmZmVyKGJzU3ViamVjdC5HZXRTdHJpbmdMZW5ndGgoKSk7CisgICAgYnNNc2cuUmVsZWFzZUJ1ZmZlcihic01zZy5HZXRTdHJpbmdMZW5ndGgoKSk7CiAgIH0gZWxzZSB7CiAgICAgLy8gSFRUUCBvciBGVFAKLSAgICBDRlhfV2lkZVN0cmluZyB3czsKLSAgICBDRlhfQnl0ZVN0cmluZyBicyA9IGNzVVJMLlVURjE2TEVfRW5jb2RlKCk7CisgICAgV2lkZVN0cmluZyB3czsKKyAgICBCeXRlU3RyaW5nIGJzID0gY3NVUkwuVVRGMTZMRV9FbmNvZGUoKTsKICAgICBpbnQgbGVuID0gYnMuR2V0TGVuZ3RoKCk7CiAgICAgcEZvcm1GaWxsRW52LT5VcGxvYWRUbyhwRmlsZUhhbmRsZXIsIGZpbGVGbGFnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZQREZfV0lERVNUUklORylicy5HZXRCdWZmZXIobGVuKSk7CkBAIC05OTcsMzUgKzk4NiwzNCBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDUERGWEZBX0RvY0Vudmlyb25tZW50OjpTZXRHbG9iYWxQcm9wZXJ0eSgKLSAgICBDWEZBX0ZGRG9jKiBoRG9jLAotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwKLSAgICBDRlhKU0VfVmFsdWUqIHBWYWx1ZSkgewotICBpZiAoaERvYyAhPSBtX3BDb250ZXh0LT5HZXRYRkFEb2MoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKG1fcENvbnRleHQtPkdldEZvcm1GaWxsRW52KCkgJiYKLSAgICAgIG1fcENvbnRleHQtPkdldEZvcm1GaWxsRW52KCktPkdldEpTUnVudGltZSgpKSB7Ci0gICAgcmV0dXJuIG1fcENvbnRleHQtPkdldEZvcm1GaWxsRW52KCktPkdldEpTUnVudGltZSgpLT5TZXRWYWx1ZUJ5TmFtZSgKLSAgICAgICAgc3pQcm9wTmFtZSwgcFZhbHVlKTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1BERlhGQV9Eb2NFbnZpcm9ubWVudDo6R2V0R2xvYmFsUHJvcGVydHkoCi0gICAgQ1hGQV9GRkRvYyogaERvYywKLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsCi0gICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpIHsKK2Jvb2wgQ1BERlhGQV9Eb2NFbnZpcm9ubWVudDo6U2V0R2xvYmFsUHJvcGVydHkoQ1hGQV9GRkRvYyogaERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6UHJvcE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFZhbHVlKSB7CiAgIGlmIChoRG9jICE9IG1fcENvbnRleHQtPkdldFhGQURvYygpKQogICAgIHJldHVybiBmYWxzZTsKICAgaWYgKCFtX3BDb250ZXh0LT5HZXRGb3JtRmlsbEVudigpIHx8CiAgICAgICAhbV9wQ29udGV4dC0+R2V0Rm9ybUZpbGxFbnYoKS0+R2V0SlNSdW50aW1lKCkpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLQogICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiA9IG1fcENvbnRleHQtPkdldEZvcm1GaWxsRW52KCk7Ci0gIGlmICghbV9wSlNFdmVudENvbnRleHQpCi0gICAgbV9wSlNFdmVudENvbnRleHQgPSBwRm9ybUZpbGxFbnYtPkdldEpTUnVudGltZSgpLT5OZXdFdmVudENvbnRleHQoKTsKKyAgSUpTX0V2ZW50Q29udGV4dCogcENvbnRleHQgPSBwRm9ybUZpbGxFbnYtPkdldEpTUnVudGltZSgpLT5OZXdFdmVudENvbnRleHQoKTsKKyAgYm9vbCBiUmV0ID0gcEZvcm1GaWxsRW52LT5HZXRKU1J1bnRpbWUoKS0+U2V0VmFsdWVCeU5hbWUoc3pQcm9wTmFtZSwgcFZhbHVlKTsKKyAgcEZvcm1GaWxsRW52LT5HZXRKU1J1bnRpbWUoKS0+UmVsZWFzZUV2ZW50Q29udGV4dChwQ29udGV4dCk7CisgIHJldHVybiBiUmV0OworfQogCi0gIHJldHVybiBwRm9ybUZpbGxFbnYtPkdldEpTUnVudGltZSgpLT5HZXRWYWx1ZUJ5TmFtZShzelByb3BOYW1lLCBwVmFsdWUpOworYm9vbCBDUERGWEZBX0RvY0Vudmlyb25tZW50OjpHZXRHbG9iYWxQcm9wZXJ0eShDWEZBX0ZGRG9jKiBoRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pQcm9wTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpIHsKKyAgaWYgKGhEb2MgIT0gbV9wQ29udGV4dC0+R2V0WEZBRG9jKCkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIW1fcENvbnRleHQtPkdldEZvcm1GaWxsRW52KCkgfHwKKyAgICAgICFtX3BDb250ZXh0LT5HZXRGb3JtRmlsbEVudigpLT5HZXRKU1J1bnRpbWUoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiA9IG1fcENvbnRleHQtPkdldEZvcm1GaWxsRW52KCk7CisgIElKU19FdmVudENvbnRleHQqIHBDb250ZXh0ID0gcEZvcm1GaWxsRW52LT5HZXRKU1J1bnRpbWUoKS0+TmV3RXZlbnRDb250ZXh0KCk7CisgIGJvb2wgYlJldCA9IHBGb3JtRmlsbEVudi0+R2V0SlNSdW50aW1lKCktPkdldFZhbHVlQnlOYW1lKHN6UHJvcE5hbWUsIHBWYWx1ZSk7CisgIHBGb3JtRmlsbEVudi0+R2V0SlNSdW50aW1lKCktPlJlbGVhc2VFdmVudENvbnRleHQocENvbnRleHQpOworICByZXR1cm4gYlJldDsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnBkZnhmYS9jcGRmeGZhX2RvY2Vudmlyb25tZW50LmggYi9mcGRmc2RrL2ZwZGZ4ZmEvY3BkZnhmYV9kb2NlbnZpcm9ubWVudC5oCmluZGV4IGRjMThkOWEuLjllYWJmOGQgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvZnBkZnhmYS9jcGRmeGZhX2RvY2Vudmlyb25tZW50LmgKKysrIGIvZnBkZnNkay9mcGRmeGZhL2NwZGZ4ZmFfZG9jZW52aXJvbm1lbnQuaApAQCAtNyw3ICs3LDggQEAKICNpZm5kZWYgRlBERlNES19GUERGWEZBX0NQREZYRkFfRE9DRU5WSVJPTk1FTlRfSF8KICNkZWZpbmUgRlBERlNES19GUERGWEZBX0NQREZYRkFfRE9DRU5WSVJPTk1FTlRfSF8KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvZnhmYS5oIgogCkBAIC0yMSwxOCArMjIsMTYgQEAKIAogICAvLyBJWEZBX0RvY0Vudmlyb25tZW50CiAgIHZvaWQgU2V0Q2hhbmdlTWFyayhDWEZBX0ZGRG9jKiBoRG9jKSBvdmVycmlkZTsKLSAgLy8gdXNlZCBpbiBkeW5hbWljIHhmYSwgZHdGbGFncyByZWZlciB0byBYRkFfSU5WQUxJREFURV9YWFggbWFjcm9zLgotICB2b2lkIEludmFsaWRhdGVSZWN0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnQsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFncykgb3ZlcnJpZGU7Ci0gIC8vIHNob3cgb3IgaGlkZSBjYXJldAorICAvLyBVc2VkIGluIGR5bmFtaWMgeGZhLgorICB2b2lkIEludmFsaWRhdGVSZWN0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LCBjb25zdCBDRlhfUmVjdEYmIHJ0KSBvdmVycmlkZTsKKyAgLy8gU2hvdyBvciBoaWRlIGNhcmV0LgogICB2b2lkIERpc3BsYXlDYXJldChDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0LAogICAgICAgICAgICAgICAgICAgICBib29sIGJWaXNpYmxlLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdEFuY2hvcikgb3ZlcnJpZGU7CiAgIC8vIGR3UG9zOiAoMDpib3R0b20gMTp0b3ApCiAgIGJvb2wgR2V0UG9wdXBQb3MoQ1hGQV9GRldpZGdldCogaFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWluUG9wdXAsCi0gICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1heFBvcHVwLAorICAgICAgICAgICAgICAgICAgIGZsb2F0IGZNaW5Qb3B1cCwKKyAgICAgICAgICAgICAgICAgICBmbG9hdCBmTWF4UG9wdXAsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvciwKICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0UG9wdXApIG92ZXJyaWRlOwogICBib29sIFBvcHVwTWVudShDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0LCBDRlhfUG9pbnRGIHB0UG9wdXApIG92ZXJyaWRlOwpAQCAtNDAsOSArMzksOSBAQAogICAvLyBkd0ZsYWdzIFhGQV9QQUdFVklFV0VWRU5UX0FkZGVkLCBYRkFfUEFHRVZJRVdFVkVOVF9SZW1vdmluZwogICB2b2lkIFBhZ2VWaWV3RXZlbnQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIHVpbnQzMl90IGR3RmxhZ3MpIG92ZXJyaWRlOwogICB2b2lkIFdpZGdldFBvc3RBZGQoQ1hGQV9GRldpZGdldCogaFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0RGF0YSkgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYykgb3ZlcnJpZGU7CiAgIHZvaWQgV2lkZ2V0UHJlUmVtb3ZlKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0RGF0YSkgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjKSBvdmVycmlkZTsKIAogICAvLyBIb3N0IG1ldGhvZAogICBpbnQzMl90IENvdW50UGFnZXMoQ1hGQV9GRkRvYyogaERvYykgb3ZlcnJpZGU7CkBAIC01MCwxMiArNDksMTIgQEAKICAgdm9pZCBTZXRDdXJyZW50UGFnZShDWEZBX0ZGRG9jKiBoRG9jLCBpbnQzMl90IGlDdXJQYWdlKSBvdmVycmlkZTsKICAgYm9vbCBJc0NhbGN1bGF0aW9uc0VuYWJsZWQoQ1hGQV9GRkRvYyogaERvYykgb3ZlcnJpZGU7CiAgIHZvaWQgU2V0Q2FsY3VsYXRpb25zRW5hYmxlZChDWEZBX0ZGRG9jKiBoRG9jLCBib29sIGJFbmFibGVkKSBvdmVycmlkZTsKLSAgdm9pZCBHZXRUaXRsZShDWEZBX0ZGRG9jKiBoRG9jLCBDRlhfV2lkZVN0cmluZyYgd3NUaXRsZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgU2V0VGl0bGUoQ1hGQV9GRkRvYyogaERvYywgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGl0bGUpIG92ZXJyaWRlOworICB2b2lkIEdldFRpdGxlKENYRkFfRkZEb2MqIGhEb2MsIFdpZGVTdHJpbmcmIHdzVGl0bGUpIG92ZXJyaWRlOworICB2b2lkIFNldFRpdGxlKENYRkFfRkZEb2MqIGhEb2MsIGNvbnN0IFdpZGVTdHJpbmcmIHdzVGl0bGUpIG92ZXJyaWRlOwogICB2b2lkIEV4cG9ydERhdGEoQ1hGQV9GRkRvYyogaERvYywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0ZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NGaWxlUGF0aCwKICAgICAgICAgICAgICAgICAgIGJvb2wgYlhEUCkgb3ZlcnJpZGU7Ci0gIHZvaWQgR290b1VSTChDWEZBX0ZGRG9jKiBoRG9jLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgYnNVUkwpIG92ZXJyaWRlOworICB2b2lkIEdvdG9VUkwoQ1hGQV9GRkRvYyogaERvYywgY29uc3QgV2lkZVN0cmluZyYgYnNVUkwpIG92ZXJyaWRlOwogICBib29sIElzVmFsaWRhdGlvbnNFbmFibGVkKENYRkFfRkZEb2MqIGhEb2MpIG92ZXJyaWRlOwogICB2b2lkIFNldFZhbGlkYXRpb25zRW5hYmxlZChDWEZBX0ZGRG9jKiBoRG9jLCBib29sIGJFbmFibGVkKSBvdmVycmlkZTsKICAgdm9pZCBTZXRGb2N1c1dpZGdldChDWEZBX0ZGRG9jKiBoRG9jLCBDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0KSBvdmVycmlkZTsKQEAgLTY1LDUwICs2NCwzNyBAQAogICAgICAgICAgICAgIHVpbnQzMl90IGR3T3B0aW9ucykgb3ZlcnJpZGU7CiAgIEZYX0FSR0IgR2V0SGlnaGxpZ2h0Q29sb3IoQ1hGQV9GRkRvYyogaERvYykgb3ZlcnJpZGU7CiAKLSAgLyoqCi0gICAqU3VibWl0IGRhdGEgdG8gZW1haWwsIGh0dHAsIGZ0cC4KLSAgICogQHBhcmFtW2luXSBoRG9jIFRoZSBkb2N1bWVudCBoYW5kbGVyLgotICAgKiBAcGFyYW1baW5dIGVGb3JtYXQgRGV0ZXJtaW5lcyB0aGUgZm9ybWF0IGluIHdoaWNoIHRoZSBkYXRhIHdpbGwgYmUKLSAgICpzdWJtaXR0ZWQuIFhGQV9BVFRSSUJVVEVFTlVNX1hkcCwgWEZBX0FUVFJJQlVURUVOVU1fWG1sLi4uCi0gICAqIEBwYXJhbVtpbl0gd3NUYXJnZXQgVGhlIFVSTCB0byB3aGljaCB0aGUgZGF0YSB3aWxsIGJlIHN1Ym1pdHRlZC4KLSAgICogQHBhcmFtW2luXSBlRW5jb2RpbmcgVGhlIGVuY29kaW5nIG9mIHRleHQgY29udGVudC4KLSAgICogQHBhcmFtW2luXSBwWERQQ29udGVudCBDb250cm9scyB3aGF0IHN1YnNldCBvZiB0aGUgZGF0YSBpcyBzdWJtaXR0ZWQsIHVzZWQKLSAgICpvbmx5IHdoZW4gdGhlIGZvcm1hdCBwcm9wZXJ0eSBpcyB4ZHAuCi0gICAqIEBwYXJhbVtpbl0gYkVtYmVkUERGLCBzcGVjaWZpZXMgd2hldGhlciBQREYgaXMgZW1iZWRkZWQgaW4gdGhlIHN1Ym1pdHRlZAotICAgKmNvbnRlbnQgb3Igbm90LgotICAgKi8KLSAgYm9vbCBTdWJtaXREYXRhKENYRkFfRkZEb2MqIGhEb2MsIENYRkFfU3VibWl0IHN1Ym1pdCkgb3ZlcnJpZGU7CisgIGJvb2wgU3VibWl0KENYRkFfRkZEb2MqIGhEb2MsIENYRkFfU3VibWl0KiBzdWJtaXQpIG92ZXJyaWRlOwogCiAgIGJvb2wgR2V0R2xvYmFsUHJvcGVydHkoQ1hGQV9GRkRvYyogaERvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6UHJvcE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpIG92ZXJyaWRlOwogICBib29sIFNldEdsb2JhbFByb3BlcnR5KENYRkFfRkZEb2MqIGhEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzelByb3BOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFZhbHVlKSBvdmVycmlkZTsKIAotICBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IE9wZW5MaW5rZWRGaWxlKAorICBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gT3BlbkxpbmtlZEZpbGUoCiAgICAgICBDWEZBX0ZGRG9jKiBoRG9jLAotICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTGluaykgb3ZlcnJpZGU7CisgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c0xpbmspIG92ZXJyaWRlOwogCiAgcHJpdmF0ZToKICAgYm9vbCBPbkJlZm9yZU5vdGlmeVN1Ym1pdCgpOwogICB2b2lkIE9uQWZ0ZXJOb3RpZnlTdWJtaXQoKTsKICAgYm9vbCBOb3RpZnlTdWJtaXQoYm9vbCBiUHJldk9yUG9zdCk7Ci0gIGJvb2wgU3VibWl0RGF0YUludGVybmFsKENYRkFfRkZEb2MqIGhEb2MsIENYRkFfU3VibWl0IHN1Ym1pdCk7Ci0gIGJvb2wgTWFpbFRvSW5mbyhDRlhfV2lkZVN0cmluZyYgY3NVUkwsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgY3NUb0FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgY3NDQ0FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgY3NCQ0NBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGNzU3ViamVjdCwKLSAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBjc01zZyk7CisgIGJvb2wgU3VibWl0SW50ZXJuYWwoQ1hGQV9GRkRvYyogaERvYywgQ1hGQV9TdWJtaXQqIHN1Ym1pdCk7CisgIGJvb2wgTWFpbFRvSW5mbyhXaWRlU3RyaW5nJiBjc1VSTCwKKyAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIGNzVG9BZGRyZXNzLAorICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyYgY3NDQ0FkZHJlc3MsCisgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiBjc0JDQ0FkZHJlc3MsCisgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiBjc1N1YmplY3QsCisgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiBjc01zZyk7CiAgIGJvb2wgRXhwb3J0U3VibWl0RmlsZShGUERGX0ZJTEVIQU5ETEVSKiBwcEZpbGVIYW5kbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBlbmNvZGVUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBmbGFnKTsKLSAgdm9pZCBUb1hGQUNvbnRlbnRGbGFncyhDRlhfV2lkZVN0cmluZyBjc1NyY0NvbnRlbnQsIEZQREZfRFdPUkQmIGZsYWcpOworICB2b2lkIFRvWEZBQ29udGVudEZsYWdzKFdpZGVTdHJpbmcgY3NTcmNDb250ZW50LCBGUERGX0RXT1JEJiBmbGFnKTsKIAotICBDUERGWEZBX0NvbnRleHQqIGNvbnN0IG1fcENvbnRleHQ7ICAgIC8vIE5vdCBvd25lZC4KLSAgSUpTX0V2ZW50Q29udGV4dCogbV9wSlNFdmVudENvbnRleHQ7ICAvLyBOb3Qgb3duZWQuCisgIFVub3duZWRQdHI8Q1BERlhGQV9Db250ZXh0PiBjb25zdCBtX3BDb250ZXh0OwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0ZQREZYRkFfQ1BERlhGQV9ET0NFTlZJUk9OTUVOVF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9mcGRmeGZhL2NwZGZ4ZmFfcGFnZS5jcHAgYi9mcGRmc2RrL2ZwZGZ4ZmEvY3BkZnhmYV9wYWdlLmNwcAppbmRleCA4YjViYjNkLi5mYmVhOTBkIDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZwZGZ4ZmEvY3BkZnhmYV9wYWdlLmNwcAorKysgYi9mcGRmc2RrL2ZwZGZ4ZmEvY3BkZnhmYV9wYWdlLmNwcApAQCAtMTMsMTkgKzEzLDEzIEBACiAjaW5jbHVkZSAiZnBkZnNkay9mc2RrX2RlZmluZS5oIgogI2luY2x1ZGUgInB1YmxpYy9mcGRmX2Zvcm1maWxsLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmRvY3ZpZXcuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZwYWdldmlldy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZkb2N2aWV3LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZnBhZ2V2aWV3LmgiCiAKIENQREZYRkFfUGFnZTo6Q1BERlhGQV9QYWdlKENQREZYRkFfQ29udGV4dCogcENvbnRleHQsIGludCBwYWdlX2luZGV4KQotICAgIDogbV9wWEZBUGFnZVZpZXcobnVsbHB0ciksCi0gICAgICBtX3BDb250ZXh0KHBDb250ZXh0KSwKLSAgICAgIG1faVBhZ2VJbmRleChwYWdlX2luZGV4KSwKLSAgICAgIG1faVJlZigxKSB7fQorICAgIDogbV9wWEZBUGFnZVZpZXcobnVsbHB0ciksIG1fcENvbnRleHQocENvbnRleHQpLCBtX2lQYWdlSW5kZXgocGFnZV9pbmRleCkge30KIAotQ1BERlhGQV9QYWdlOjp+Q1BERlhGQV9QYWdlKCkgewotICBpZiAobV9wQ29udGV4dCkKLSAgICBtX3BDb250ZXh0LT5SZW1vdmVQYWdlKHRoaXMpOwotfQorQ1BERlhGQV9QYWdlOjp+Q1BERlhGQV9QYWdlKCkge30KIAogYm9vbCBDUERGWEZBX1BhZ2U6OkxvYWRQREZQYWdlKCkgewogICBpZiAoIW1fcENvbnRleHQpCkBAIC03MCwxOCArNjQsMTUgQEAKICAgaWYgKCFtX3BDb250ZXh0IHx8IG1faVBhZ2VJbmRleCA8IDApCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIGludCBpRG9jVHlwZSA9IG1fcENvbnRleHQtPkdldERvY1R5cGUoKTsKLSAgc3dpdGNoIChpRG9jVHlwZSkgewotICAgIGNhc2UgRE9DVFlQRV9QREY6Ci0gICAgY2FzZSBET0NUWVBFX1NUQVRJQ19YRkE6IHsKKyAgc3dpdGNoIChtX3BDb250ZXh0LT5HZXRGb3JtVHlwZSgpKSB7CisgICAgY2FzZSBGb3JtVHlwZTo6a05vbmU6CisgICAgY2FzZSBGb3JtVHlwZTo6a0Fjcm9Gb3JtOgorICAgIGNhc2UgRm9ybVR5cGU6OmtYRkFGb3JlZ3JvdW5kOgogICAgICAgcmV0dXJuIExvYWRQREZQYWdlKCk7Ci0gICAgfQotICAgIGNhc2UgRE9DVFlQRV9EWU5BTUlDX1hGQTogeworICAgIGNhc2UgRm9ybVR5cGU6OmtYRkFGdWxsOgogICAgICAgcmV0dXJuIExvYWRYRkFQYWdlVmlldygpOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwogICB9CisgIHJldHVybiBmYWxzZTsKIH0KIAogYm9vbCBDUERGWEZBX1BhZ2U6OkxvYWRQREZQYWdlKENQREZfRGljdGlvbmFyeSogcGFnZURpY3QpIHsKQEAgLTk0LDQ5ICs4NSwzNyBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotRlhfRkxPQVQgQ1BERlhGQV9QYWdlOjpHZXRQYWdlV2lkdGgoKSBjb25zdCB7CitmbG9hdCBDUERGWEZBX1BhZ2U6OkdldFBhZ2VXaWR0aCgpIGNvbnN0IHsKICAgaWYgKCFtX3BQREZQYWdlICYmICFtX3BYRkFQYWdlVmlldykKICAgICByZXR1cm4gMC4wZjsKIAotICBpbnQgbkRvY1R5cGUgPSBtX3BDb250ZXh0LT5HZXREb2NUeXBlKCk7Ci0gIHN3aXRjaCAobkRvY1R5cGUpIHsKLSAgICBjYXNlIERPQ1RZUEVfRFlOQU1JQ19YRkE6IHsKLSAgICAgIGlmIChtX3BYRkFQYWdlVmlldykKLSAgICAgICAgcmV0dXJuIG1fcFhGQVBhZ2VWaWV3LT5HZXRQYWdlVmlld1JlY3QoKS53aWR0aDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIERPQ1RZUEVfU1RBVElDX1hGQToKLSAgICBjYXNlIERPQ1RZUEVfUERGOiB7CisgIHN3aXRjaCAobV9wQ29udGV4dC0+R2V0Rm9ybVR5cGUoKSkgeworICAgIGNhc2UgRm9ybVR5cGU6OmtOb25lOgorICAgIGNhc2UgRm9ybVR5cGU6OmtBY3JvRm9ybToKKyAgICBjYXNlIEZvcm1UeXBlOjprWEZBRm9yZWdyb3VuZDoKICAgICAgIGlmIChtX3BQREZQYWdlKQogICAgICAgICByZXR1cm4gbV9wUERGUGFnZS0+R2V0UGFnZVdpZHRoKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiAwLjBmOworICAgIGNhc2UgRm9ybVR5cGU6OmtYRkFGdWxsOgorICAgICAgaWYgKG1fcFhGQVBhZ2VWaWV3KQorICAgICAgICByZXR1cm4gbV9wWEZBUGFnZVZpZXctPkdldFBhZ2VWaWV3UmVjdCgpLndpZHRoOwogICB9CiAKICAgcmV0dXJuIDAuMGY7CiB9CiAKLUZYX0ZMT0FUIENQREZYRkFfUGFnZTo6R2V0UGFnZUhlaWdodCgpIGNvbnN0IHsKK2Zsb2F0IENQREZYRkFfUGFnZTo6R2V0UGFnZUhlaWdodCgpIGNvbnN0IHsKICAgaWYgKCFtX3BQREZQYWdlICYmICFtX3BYRkFQYWdlVmlldykKICAgICByZXR1cm4gMC4wZjsKIAotICBpbnQgbkRvY1R5cGUgPSBtX3BDb250ZXh0LT5HZXREb2NUeXBlKCk7Ci0gIHN3aXRjaCAobkRvY1R5cGUpIHsKLSAgICBjYXNlIERPQ1RZUEVfUERGOgotICAgIGNhc2UgRE9DVFlQRV9TVEFUSUNfWEZBOiB7CisgIHN3aXRjaCAobV9wQ29udGV4dC0+R2V0Rm9ybVR5cGUoKSkgeworICAgIGNhc2UgRm9ybVR5cGU6OmtOb25lOgorICAgIGNhc2UgRm9ybVR5cGU6OmtBY3JvRm9ybToKKyAgICBjYXNlIEZvcm1UeXBlOjprWEZBRm9yZWdyb3VuZDoKICAgICAgIGlmIChtX3BQREZQYWdlKQogICAgICAgICByZXR1cm4gbV9wUERGUGFnZS0+R2V0UGFnZUhlaWdodCgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRE9DVFlQRV9EWU5BTUlDX1hGQTogeworICAgIGNhc2UgRm9ybVR5cGU6OmtYRkFGdWxsOgogICAgICAgaWYgKG1fcFhGQVBhZ2VWaWV3KQogICAgICAgICByZXR1cm4gbV9wWEZBUGFnZVZpZXctPkdldFBhZ2VWaWV3UmVjdCgpLmhlaWdodDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDAuMGY7CiAgIH0KIAogICByZXR1cm4gMC4wZjsKQEAgLTE1NCwxMiArMTMzLDEwIEBACiAgIGlmICghbV9wUERGUGFnZSAmJiAhbV9wWEZBUGFnZVZpZXcpCiAgICAgcmV0dXJuOwogCi0gIENGWF9NYXRyaXggZGV2aWNlMnBhZ2U7Ci0gIGRldmljZTJwYWdlLlNldFJldmVyc2UoCi0gICAgICBHZXREaXNwbGF5TWF0cml4KHN0YXJ0X3gsIHN0YXJ0X3ksIHNpemVfeCwgc2l6ZV95LCByb3RhdGUpKTsKLQotICBDRlhfUG9pbnRGIHBvcyA9IGRldmljZTJwYWdlLlRyYW5zZm9ybShDRlhfUG9pbnRGKAotICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KGRldmljZV94KSwgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KGRldmljZV95KSkpOworICBDRlhfUG9pbnRGIHBvcyA9IEdldERpc3BsYXlNYXRyaXgoc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3ksIHJvdGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgLkdldEludmVyc2UoKQorICAgICAgICAgICAgICAgICAgICAgICAuVHJhbnNmb3JtKENGWF9Qb2ludEYoc3RhdGljX2Nhc3Q8ZmxvYXQ+KGRldmljZV94KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihkZXZpY2VfeSkpKTsKIAogICAqcGFnZV94ID0gcG9zLng7CiAgICpwYWdlX3kgPSBwb3MueTsKQEAgLTE4MSw3ICsxNTgsNyBAQAogICAgICAgR2V0RGlzcGxheU1hdHJpeChzdGFydF94LCBzdGFydF95LCBzaXplX3gsIHNpemVfeSwgcm90YXRlKTsKIAogICBDRlhfUG9pbnRGIHBvcyA9IHBhZ2UyZGV2aWNlLlRyYW5zZm9ybSgKLSAgICAgIENGWF9Qb2ludEYoc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHBhZ2VfeCksIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihwYWdlX3kpKSk7CisgICAgICBDRlhfUG9pbnRGKHN0YXRpY19jYXN0PGZsb2F0PihwYWdlX3gpLCBzdGF0aWNfY2FzdDxmbG9hdD4ocGFnZV95KSkpOwogCiAgICpkZXZpY2VfeCA9IEZYU1lTX3JvdW5kKHBvcy54KTsKICAgKmRldmljZV95ID0gRlhTWVNfcm91bmQocG9zLnkpOwpAQCAtMTk1LDIzICsxNzIsMTcgQEAKICAgaWYgKCFtX3BQREZQYWdlICYmICFtX3BYRkFQYWdlVmlldykKICAgICByZXR1cm4gQ0ZYX01hdHJpeCgpOwogCi0gIGludCBuRG9jVHlwZSA9IG1fcENvbnRleHQtPkdldERvY1R5cGUoKTsKLSAgc3dpdGNoIChuRG9jVHlwZSkgewotICAgIGNhc2UgRE9DVFlQRV9EWU5BTUlDX1hGQTogewotICAgICAgaWYgKG1fcFhGQVBhZ2VWaWV3KSB7Ci0gICAgICAgIHJldHVybiBtX3BYRkFQYWdlVmlldy0+R2V0RGlzcGxheU1hdHJpeCgKLSAgICAgICAgICAgIENGWF9SZWN0KHhQb3MsIHlQb3MsIHhTaXplLCB5U2l6ZSksIGlSb3RhdGUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRE9DVFlQRV9QREY6Ci0gICAgY2FzZSBET0NUWVBFX1NUQVRJQ19YRkE6IHsKKyAgc3dpdGNoIChtX3BDb250ZXh0LT5HZXRGb3JtVHlwZSgpKSB7CisgICAgY2FzZSBGb3JtVHlwZTo6a05vbmU6CisgICAgY2FzZSBGb3JtVHlwZTo6a0Fjcm9Gb3JtOgorICAgIGNhc2UgRm9ybVR5cGU6OmtYRkFGb3JlZ3JvdW5kOgogICAgICAgaWYgKG1fcFBERlBhZ2UpCiAgICAgICAgIHJldHVybiBtX3BQREZQYWdlLT5HZXREaXNwbGF5TWF0cml4KHhQb3MsIHlQb3MsIHhTaXplLCB5U2l6ZSwgaVJvdGF0ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBDRlhfTWF0cml4KCk7CisgICAgY2FzZSBGb3JtVHlwZTo6a1hGQUZ1bGw6CisgICAgICBpZiAobV9wWEZBUGFnZVZpZXcpCisgICAgICAgIHJldHVybiBtX3BYRkFQYWdlVmlldy0+R2V0RGlzcGxheU1hdHJpeCgKKyAgICAgICAgICAgIENGWF9SZWN0KHhQb3MsIHlQb3MsIHhTaXplLCB5U2l6ZSksIGlSb3RhdGUpOwogICB9CisKICAgcmV0dXJuIENGWF9NYXRyaXgoKTsKIH0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnBkZnhmYS9jcGRmeGZhX3BhZ2UuaCBiL2ZwZGZzZGsvZnBkZnhmYS9jcGRmeGZhX3BhZ2UuaAppbmRleCA5OTM4ODVkLi5mNjRkNjZiIDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZwZGZ4ZmEvY3BkZnhmYV9wYWdlLmgKKysrIGIvZnBkZnNkay9mcGRmeGZhL2NwZGZ4ZmFfcGFnZS5oCkBAIC0xMCw2ICsxMCw4IEBACiAjaW5jbHVkZSA8bWVtb3J5PgogCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAKIGNsYXNzIENGWF9NYXRyaXg7CiBjbGFzcyBDUERGWEZBX0NvbnRleHQ7CkBAIC0xNywxOSArMTksMTQgQEAKIGNsYXNzIENQREZfUGFnZTsKIGNsYXNzIENYRkFfRkZQYWdlVmlldzsKIAotY2xhc3MgQ1BERlhGQV9QYWdlIHsKK2NsYXNzIENQREZYRkFfUGFnZSA6IHB1YmxpYyBSZXRhaW5hYmxlIHsKICBwdWJsaWM6Ci0gIENQREZYRkFfUGFnZShDUERGWEZBX0NvbnRleHQqIHBDb250ZXh0LCBpbnQgcGFnZV9pbmRleCk7Ci0KLSAgdm9pZCBSZXRhaW4oKSB7IG1faVJlZisrOyB9Ci0gIHZvaWQgUmVsZWFzZSgpIHsKLSAgICBpZiAoLS1tX2lSZWYgPD0gMCkKLSAgICAgIGRlbGV0ZSB0aGlzOwotICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgorICBmcmllbmQgUmV0YWluUHRyPFQ+IHBkZml1bTo6TWFrZVJldGFpbihBcmdzJiYuLi4gYXJncyk7CiAKICAgYm9vbCBMb2FkUGFnZSgpOwogICBib29sIExvYWRQREZQYWdlKENQREZfRGljdGlvbmFyeSogcGFnZURpY3QpOwotICBDUERGWEZBX0NvbnRleHQqIEdldENvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX3BDb250ZXh0OyB9CisgIENQREZYRkFfQ29udGV4dCogR2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIG1fcENvbnRleHQuR2V0KCk7IH0KICAgaW50IEdldFBhZ2VJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faVBhZ2VJbmRleDsgfQogICBDUERGX1BhZ2UqIEdldFBERlBhZ2UoKSBjb25zdCB7IHJldHVybiBtX3BQREZQYWdlLmdldCgpOyB9CiAgIENYRkFfRkZQYWdlVmlldyogR2V0WEZBUGFnZVZpZXcoKSBjb25zdCB7IHJldHVybiBtX3BYRkFQYWdlVmlldzsgfQpAQCAtMzgsOCArMzUsOCBAQAogICAgIG1fcFhGQVBhZ2VWaWV3ID0gcFBhZ2VWaWV3OwogICB9CiAKLSAgRlhfRkxPQVQgR2V0UGFnZVdpZHRoKCkgY29uc3Q7Ci0gIEZYX0ZMT0FUIEdldFBhZ2VIZWlnaHQoKSBjb25zdDsKKyAgZmxvYXQgR2V0UGFnZVdpZHRoKCkgY29uc3Q7CisgIGZsb2F0IEdldFBhZ2VIZWlnaHQoKSBjb25zdDsKIAogICB2b2lkIERldmljZVRvUGFnZShpbnQgc3RhcnRfeCwKICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCkBAIC02OCw3ICs2NSw4IEBACiAKICBwcm90ZWN0ZWQ6CiAgIC8vIFJlZmNvdW50ZWQgY2xhc3MuCi0gIH5DUERGWEZBX1BhZ2UoKTsKKyAgQ1BERlhGQV9QYWdlKENQREZYRkFfQ29udGV4dCogcENvbnRleHQsIGludCBwYWdlX2luZGV4KTsKKyAgfkNQREZYRkFfUGFnZSgpIG92ZXJyaWRlOwogCiAgIGJvb2wgTG9hZFBERlBhZ2UoKTsKICAgYm9vbCBMb2FkWEZBUGFnZVZpZXcoKTsKQEAgLTc2LDkgKzc0LDggQEAKICBwcml2YXRlOgogICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9QYWdlPiBtX3BQREZQYWdlOwogICBDWEZBX0ZGUGFnZVZpZXcqIG1fcFhGQVBhZ2VWaWV3OwotICBDUERGWEZBX0NvbnRleHQqIGNvbnN0IG1fcENvbnRleHQ7CisgIFVub3duZWRQdHI8Q1BERlhGQV9Db250ZXh0PiBjb25zdCBtX3BDb250ZXh0OwogICBjb25zdCBpbnQgbV9pUGFnZUluZGV4OwotICBpbnQgbV9pUmVmOwogfTsKIAogI2VuZGlmICAvLyBGUERGU0RLX0ZQREZYRkFfQ1BERlhGQV9QQUdFX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZ4ZmEvY3hmYV9md2xhZGFwdGVydGltZXJtZ3IuY3BwIGIvZnBkZnNkay9mcGRmeGZhL2N4ZmFfZndsYWRhcHRlcnRpbWVybWdyLmNwcAppbmRleCAzOWFhNzJiLi5jNzIwMWMzIDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZwZGZ4ZmEvY3hmYV9md2xhZGFwdGVydGltZXJtZ3IuY3BwCisrKyBiL2ZwZGZzZGsvZnBkZnhmYS9jeGZhX2Z3bGFkYXB0ZXJ0aW1lcm1nci5jcHAKQEAgLTI5LDYgKzI5LDEyIEBACiAKIHN0ZDo6dmVjdG9yPENGV0xfVGltZXJJbmZvKj4qIENYRkFfRldMQWRhcHRlclRpbWVyTWdyOjpzX1RpbWVyQXJyYXkgPSBudWxscHRyOwogCitDWEZBX0ZXTEFkYXB0ZXJUaW1lck1ncjo6Q1hGQV9GV0xBZGFwdGVyVGltZXJNZ3IoCisgICAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpCisgICAgOiBtX3BGb3JtRmlsbEVudihwRm9ybUZpbGxFbnYpIHt9CisKK0NYRkFfRldMQWRhcHRlclRpbWVyTWdyOjp+Q1hGQV9GV0xBZGFwdGVyVGltZXJNZ3IoKSB7fQorCiB2b2lkIENYRkFfRldMQWRhcHRlclRpbWVyTWdyOjpTdGFydChDRldMX1RpbWVyKiBwVGltZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0VsYXBzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkltbWVkaWF0ZWx5LApAQCAtNjYsNyArNzIsNyBAQAogICBpZiAoIXNfVGltZXJBcnJheSkKICAgICByZXR1cm47CiAKLSAgZm9yIChjb25zdCBhdXRvIGluZm8gOiAqc19UaW1lckFycmF5KSB7CisgIGZvciAoYXV0byogaW5mbyA6ICpzX1RpbWVyQXJyYXkpIHsKICAgICBDRldMX0ZXTEFkYXB0ZXJUaW1lckluZm8qIHBJbmZvID0KICAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9GV0xBZGFwdGVyVGltZXJJbmZvKj4oaW5mbyk7CiAgICAgaWYgKHBJbmZvLT5pZEV2ZW50ID09IGlkRXZlbnQpIHsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnBkZnhmYS9jeGZhX2Z3bGFkYXB0ZXJ0aW1lcm1nci5oIGIvZnBkZnNkay9mcGRmeGZhL2N4ZmFfZndsYWRhcHRlcnRpbWVybWdyLmgKaW5kZXggZmRiNTYzNS4uZDc2M2YwMiAxMDA2NDQKLS0tIGEvZnBkZnNkay9mcGRmeGZhL2N4ZmFfZndsYWRhcHRlcnRpbWVybWdyLmgKKysrIGIvZnBkZnNkay9mcGRmeGZhL2N4ZmFfZndsYWRhcHRlcnRpbWVybWdyLmgKQEAgLTEwLDE0ICsxMCwxNSBAQAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAjaW5jbHVkZSAiZnBkZnNkay9mcGRmeGZhL2NwZGZ4ZmFfY29udGV4dC5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF90aW1lcmluZm8uaCIKICNpbmNsdWRlICJ4ZmEvZndsL2lmd2xfYWRhcHRlcnRpbWVybWdyLmgiCiAKIGNsYXNzIENYRkFfRldMQWRhcHRlclRpbWVyTWdyIDogcHVibGljIElGV0xfQWRhcHRlclRpbWVyTWdyIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfRldMQWRhcHRlclRpbWVyTWdyKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KQotICAgICAgOiBtX3BGb3JtRmlsbEVudihwRm9ybUZpbGxFbnYpIHt9CisgIGV4cGxpY2l0IENYRkFfRldMQWRhcHRlclRpbWVyTWdyKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KTsKKyAgfkNYRkFfRldMQWRhcHRlclRpbWVyTWdyKCk7CiAKICAgdm9pZCBTdGFydChDRldMX1RpbWVyKiBwVGltZXIsCiAgICAgICAgICAgICAgdWludDMyX3QgZHdFbGFwc2UsCkBAIC0yOSw3ICszMCw3IEBACiAgIHN0YXRpYyB2b2lkIFRpbWVyUHJvYyhpbnQzMl90IGlkRXZlbnQpOwogCiAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxDRldMX1RpbWVySW5mbyo+KiBzX1RpbWVyQXJyYXk7Ci0gIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogY29uc3QgbV9wRm9ybUZpbGxFbnY7CisgIFVub3duZWRQdHI8Q1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50PiBjb25zdCBtX3BGb3JtRmlsbEVudjsKIH07CiAKICNlbmRpZiAgLy8gRlBERlNES19GUERGWEZBX0NYRkFfRldMQURBUFRFUlRJTUVSTUdSX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZzZGtfYWN0aW9uaGFuZGxlci5jcHAgYi9mcGRmc2RrL2ZzZGtfYWN0aW9uaGFuZGxlci5jcHAKaW5kZXggZGM5OWYzMi4uZGU1YzkzMSAxMDA2NDQKLS0tIGEvZnBkZnNkay9mc2RrX2FjdGlvbmhhbmRsZXIuY3BwCisrKyBiL2ZwZGZzZGsvZnNka19hY3Rpb25oYW5kbGVyLmNwcApAQCAtNyw2ICs3LDcgQEAKICNpbmNsdWRlICJmcGRmc2RrL2ZzZGtfYWN0aW9uaGFuZGxlci5oIgogCiAjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgogI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2Zvcm1maWVsZC5oIgpAQCAtMTQsOCArMTUsOSBAQAogI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19mb3JtZmlsbGVudmlyb25tZW50LmgiCiAjaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX2ludGVyZm9ybS5oIgogI2luY2x1ZGUgImZwZGZzZGsvZnNka19kZWZpbmUuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvaWpzX2V2ZW50X2NvbnRleHQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvaWpzX3J1bnRpbWUuaCIKKyNpbmNsdWRlICJmeGpzL2lqc19ldmVudF9jb250ZXh0LmgiCisjaW5jbHVkZSAiZnhqcy9panNfcnVudGltZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKIAogYm9vbCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0RvY09wZW4oCkBAIC0yNywxMCArMjksMTAgQEAKIAogYm9vbCBDUERGU0RLX0FjdGlvbkhhbmRsZXI6OkRvQWN0aW9uX0phdmFTY3JpcHQoCiAgICAgY29uc3QgQ1BERl9BY3Rpb24mIEpzQWN0aW9uLAotICAgIENGWF9XaWRlU3RyaW5nIGNzSlNOYW1lLAorICAgIFdpZGVTdHJpbmcgY3NKU05hbWUsCiAgICAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIHsKICAgaWYgKEpzQWN0aW9uLkdldFR5cGUoKSA9PSBDUERGX0FjdGlvbjo6SmF2YVNjcmlwdCkgewotICAgIENGWF9XaWRlU3RyaW5nIHN3SlMgPSBKc0FjdGlvbi5HZXRKYXZhU2NyaXB0KCk7CisgICAgV2lkZVN0cmluZyBzd0pTID0gSnNBY3Rpb24uR2V0SmF2YVNjcmlwdCgpOwogICAgIGlmICghc3dKUy5Jc0VtcHR5KCkpIHsKICAgICAgIFJ1bkRvY3VtZW50T3BlbkphdmFTY3JpcHQocEZvcm1GaWxsRW52LCBjc0pTTmFtZSwgc3dKUyk7CiAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTQ5LDcgKzUxLDcgQEAKICAgQVNTRVJUKHBGb3JtRmlsbEVudik7CiAgIGlmIChwRm9ybUZpbGxFbnYtPklzSlNJbml0aWF0ZWQoKSAmJgogICAgICAgSnNBY3Rpb24uR2V0VHlwZSgpID09IENQREZfQWN0aW9uOjpKYXZhU2NyaXB0KSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3dKUyA9IEpzQWN0aW9uLkdldEphdmFTY3JpcHQoKTsKKyAgICBXaWRlU3RyaW5nIHN3SlMgPSBKc0FjdGlvbi5HZXRKYXZhU2NyaXB0KCk7CiAgICAgaWYgKCFzd0pTLklzRW1wdHkoKSkgewogICAgICAgUnVuRmllbGRKYXZhU2NyaXB0KHBGb3JtRmlsbEVudiwgcEZvcm1GaWVsZCwgdHlwZSwgZGF0YSwgc3dKUyk7CiAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTEyMyw3ICsxMjUsNyBAQAogICBBU1NFUlQocEZvcm1GaWxsRW52KTsKICAgaWYgKGFjdGlvbi5HZXRUeXBlKCkgPT0gQ1BERl9BY3Rpb246OkphdmFTY3JpcHQpIHsKICAgICBpZiAocEZvcm1GaWxsRW52LT5Jc0pTSW5pdGlhdGVkKCkpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHN3SlMgPSBhY3Rpb24uR2V0SmF2YVNjcmlwdCgpOworICAgICAgV2lkZVN0cmluZyBzd0pTID0gYWN0aW9uLkdldEphdmFTY3JpcHQoKTsKICAgICAgIGlmICghc3dKUy5Jc0VtcHR5KCkpIHsKICAgICAgICAgUnVuRG9jdW1lbnRPcGVuSmF2YVNjcmlwdChwRm9ybUZpbGxFbnYsIEwiIiwgc3dKUyk7CiAgICAgICB9CkBAIC0xNTQsMTMgKzE1NiwxMyBAQAogICBBU1NFUlQocEZvcm1GaWxsRW52KTsKICAgaWYgKGFjdGlvbi5HZXRUeXBlKCkgPT0gQ1BERl9BY3Rpb246OkphdmFTY3JpcHQpIHsKICAgICBpZiAocEZvcm1GaWxsRW52LT5Jc0pTSW5pdGlhdGVkKCkpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHN3SlMgPSBhY3Rpb24uR2V0SmF2YVNjcmlwdCgpOworICAgICAgV2lkZVN0cmluZyBzd0pTID0gYWN0aW9uLkdldEphdmFTY3JpcHQoKTsKICAgICAgIGlmICghc3dKUy5Jc0VtcHR5KCkpIHsKICAgICAgICAgSUpTX1J1bnRpbWUqIHBSdW50aW1lID0gcEZvcm1GaWxsRW52LT5HZXRKU1J1bnRpbWUoKTsKICAgICAgICAgSUpTX0V2ZW50Q29udGV4dCogcENvbnRleHQgPSBwUnVudGltZS0+TmV3RXZlbnRDb250ZXh0KCk7CiAgICAgICAgIHBDb250ZXh0LT5PbkxpbmtfTW91c2VVcChwRm9ybUZpbGxFbnYpOwogCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIGNzSW5mbzsKKyAgICAgICAgV2lkZVN0cmluZyBjc0luZm87CiAgICAgICAgIGJvb2wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc3dKUywgJmNzSW5mbyk7CiAgICAgICAgIHBSdW50aW1lLT5SZWxlYXNlRXZlbnRDb250ZXh0KHBDb250ZXh0KTsKICAgICAgICAgaWYgKCFiUmV0KSB7CkBAIC0xOTUsNyArMTk3LDcgQEAKICAgQVNTRVJUKHBGb3JtRmlsbEVudik7CiAgIGlmIChhY3Rpb24uR2V0VHlwZSgpID09IENQREZfQWN0aW9uOjpKYXZhU2NyaXB0KSB7CiAgICAgaWYgKHBGb3JtRmlsbEVudi0+SXNKU0luaXRpYXRlZCgpKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyBzd0pTID0gYWN0aW9uLkdldEphdmFTY3JpcHQoKTsKKyAgICAgIFdpZGVTdHJpbmcgc3dKUyA9IGFjdGlvbi5HZXRKYXZhU2NyaXB0KCk7CiAgICAgICBpZiAoIXN3SlMuSXNFbXB0eSgpKSB7CiAgICAgICAgIFJ1bkRvY3VtZW50UGFnZUphdmFTY3JpcHQocEZvcm1GaWxsRW52LCB0eXBlLCBzd0pTKTsKICAgICAgIH0KQEAgLTI0Miw3ICsyNDQsNyBAQAogICBBU1NFUlQocEZvcm1GaWxsRW52KTsKICAgaWYgKGFjdGlvbi5HZXRUeXBlKCkgPT0gQ1BERl9BY3Rpb246OkphdmFTY3JpcHQpIHsKICAgICBpZiAocEZvcm1GaWxsRW52LT5Jc0pTSW5pdGlhdGVkKCkpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHN3SlMgPSBhY3Rpb24uR2V0SmF2YVNjcmlwdCgpOworICAgICAgV2lkZVN0cmluZyBzd0pTID0gYWN0aW9uLkdldEphdmFTY3JpcHQoKTsKICAgICAgIGlmICghc3dKUy5Jc0VtcHR5KCkpIHsKICAgICAgICAgUnVuRmllbGRKYXZhU2NyaXB0KHBGb3JtRmlsbEVudiwgcEZvcm1GaWVsZCwgdHlwZSwgZGF0YSwgc3dKUyk7CiAgICAgICAgIGlmICghSXNWYWxpZEZpZWxkKHBGb3JtRmlsbEVudiwgcEZvcm1GaWVsZC0+R2V0RmllbGREaWN0KCkpKQpAQCAtMjc4LDExICsyODAsMTEgQEAKICAgQVNTRVJUKHBGb3JtRmlsbEVudik7CiAgIGlmIChhY3Rpb24uR2V0VHlwZSgpID09IENQREZfQWN0aW9uOjpKYXZhU2NyaXB0KSB7CiAgICAgaWYgKHBGb3JtRmlsbEVudi0+SXNKU0luaXRpYXRlZCgpKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyBzd0pTID0gYWN0aW9uLkdldEphdmFTY3JpcHQoKTsKKyAgICAgIFdpZGVTdHJpbmcgc3dKUyA9IGFjdGlvbi5HZXRKYXZhU2NyaXB0KCk7CiAgICAgICBpZiAoIXN3SlMuSXNFbXB0eSgpKSB7CiAgICAgICAgIElKU19SdW50aW1lKiBwUnVudGltZSA9IHBGb3JtRmlsbEVudi0+R2V0SlNSdW50aW1lKCk7CiAgICAgICAgIElKU19FdmVudENvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0V2ZW50Q29udGV4dCgpOwotICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0luZm87CisgICAgICAgIFdpZGVTdHJpbmcgY3NJbmZvOwogICAgICAgICBib29sIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHN3SlMsICZjc0luZm8pOwogICAgICAgICBwUnVudGltZS0+UmVsZWFzZUV2ZW50Q29udGV4dChwQ29udGV4dCk7CiAgICAgICAgIGlmICghYlJldCkgewpAQCAtMzE3LDEzICszMTksMTMgQEAKICAgQVNTRVJUKHBGb3JtRmlsbEVudik7CiAgIGlmIChhY3Rpb24uR2V0VHlwZSgpID09IENQREZfQWN0aW9uOjpKYXZhU2NyaXB0KSB7CiAgICAgaWYgKHBGb3JtRmlsbEVudi0+SXNKU0luaXRpYXRlZCgpKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyBzd0pTID0gYWN0aW9uLkdldEphdmFTY3JpcHQoKTsKKyAgICAgIFdpZGVTdHJpbmcgc3dKUyA9IGFjdGlvbi5HZXRKYXZhU2NyaXB0KCk7CiAgICAgICBpZiAoIXN3SlMuSXNFbXB0eSgpKSB7CiAgICAgICAgIElKU19SdW50aW1lKiBwUnVudGltZSA9IHBGb3JtRmlsbEVudi0+R2V0SlNSdW50aW1lKCk7CiAgICAgICAgIElKU19FdmVudENvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0V2ZW50Q29udGV4dCgpOwogICAgICAgICBwQ29udGV4dC0+T25Cb29rbWFya19Nb3VzZVVwKHBCb29rbWFyayk7CiAKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NJbmZvOworICAgICAgICBXaWRlU3RyaW5nIGNzSW5mbzsKICAgICAgICAgYm9vbCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChzd0pTLCAmY3NJbmZvKTsKICAgICAgICAgcFJ1bnRpbWUtPlJlbGVhc2VFdmVudENvbnRleHQocENvbnRleHQpOwogICAgICAgICBpZiAoIWJSZXQpIHsKQEAgLTM4Niw3ICszODgsNyBAQAogICAgICAgRG9BY3Rpb25fSW1wb3J0RGF0YShhY3Rpb24sIHBGb3JtRmlsbEVudik7CiAgICAgICBicmVhazsKICAgICBjYXNlIENQREZfQWN0aW9uOjpKYXZhU2NyaXB0OgotICAgICAgQVNTRVJUKGZhbHNlKTsKKyAgICAgIE5PVFJFQUNIRUQoKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgQ1BERl9BY3Rpb246OlNldE9DR1N0YXRlOgogICAgICAgRG9BY3Rpb25fU2V0T0NHU3RhdGUocEZvcm1GaWxsRW52LCBhY3Rpb24pOwpAQCAtNDIwLDE5ICs0MjIsMTMgQEAKICAgaW50IG5QYWdlSW5kZXggPSBNeURlc3QuR2V0UGFnZUluZGV4KHBQREZEb2N1bWVudCk7CiAgIGludCBuRml0VHlwZSA9IE15RGVzdC5HZXRab29tTW9kZSgpOwogICBjb25zdCBDUERGX0FycmF5KiBwTXlBcnJheSA9IFRvQXJyYXkoTXlEZXN0LkdldE9iamVjdCgpKTsKLSAgZmxvYXQqIHBQb3NBcnkgPSBudWxscHRyOwotICBpbnQgc2l6ZU9mQXJ5ID0gMDsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHBvc0FycmF5OwogICBpZiAocE15QXJyYXkpIHsKLSAgICBwUG9zQXJ5ID0gbmV3IGZsb2F0W3BNeUFycmF5LT5HZXRDb3VudCgpXTsKLSAgICBpbnQgaiA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDI7IGkgPCBwTXlBcnJheS0+R2V0Q291bnQoKTsgaSsrKSB7Ci0gICAgICBwUG9zQXJ5W2orK10gPSBwTXlBcnJheS0+R2V0RmxvYXRBdChpKTsKLSAgICB9Ci0gICAgc2l6ZU9mQXJ5ID0gajsKKyAgICBmb3IgKHNpemVfdCBpID0gMjsgaSA8IHBNeUFycmF5LT5HZXRDb3VudCgpOyBpKyspCisgICAgICBwb3NBcnJheS5wdXNoX2JhY2socE15QXJyYXktPkdldEZsb2F0QXQoaSkpOwogICB9Ci0KLSAgcEZvcm1GaWxsRW52LT5Eb0dvVG9BY3Rpb24oblBhZ2VJbmRleCwgbkZpdFR5cGUsIHBQb3NBcnksIHNpemVPZkFyeSk7Ci0gIGRlbGV0ZVtdIHBQb3NBcnk7CisgIHBGb3JtRmlsbEVudi0+RG9Hb1RvQWN0aW9uKG5QYWdlSW5kZXgsIG5GaXRUeXBlLCBwb3NBcnJheS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc0FycmF5LnNpemUoKSk7CiB9CiAKIHZvaWQgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpEb0FjdGlvbl9Hb1RvUigKQEAgLTQ0OCw3ICs0NDQsNyBAQAogICAgIGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24pIHsKICAgQVNTRVJUKGFjdGlvbi5HZXREaWN0KCkpOwogCi0gIENGWF9CeXRlU3RyaW5nIHNVUkkgPSBhY3Rpb24uR2V0VVJJKHBGb3JtRmlsbEVudi0+R2V0UERGRG9jdW1lbnQoKSk7CisgIEJ5dGVTdHJpbmcgc1VSSSA9IGFjdGlvbi5HZXRVUkkocEZvcm1GaWxsRW52LT5HZXRQREZEb2N1bWVudCgpKTsKICAgcEZvcm1GaWxsRW52LT5Eb1VSSUFjdGlvbihzVVJJLmNfc3RyKCkpOwogfQogCkBAIC00NTcsNyArNDUzLDcgQEAKICAgICBjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uKSB7CiAgIEFTU0VSVChhY3Rpb24uR2V0RGljdCgpKTsKIAotICBDRlhfQnl0ZVN0cmluZyBjc05hbWUgPSBhY3Rpb24uR2V0TmFtZWRBY3Rpb24oKTsKKyAgQnl0ZVN0cmluZyBjc05hbWUgPSBhY3Rpb24uR2V0TmFtZWRBY3Rpb24oKTsKICAgcEZvcm1GaWxsRW52LT5FeGVjdXRlTmFtZWRBY3Rpb24oY3NOYW1lLmNfc3RyKCkpOwogfQogCkBAIC00NzAsNyArNDY2LDcgQEAKICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKICAgICBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIHR5cGUsCiAgICAgUERGU0RLX0ZpZWxkQWN0aW9uJiBkYXRhLAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQpIHsKKyAgICBjb25zdCBXaWRlU3RyaW5nJiBzY3JpcHQpIHsKICAgQVNTRVJUKHR5cGUgIT0gQ1BERl9BQWN0aW9uOjpDYWxjdWxhdGUpOwogICBBU1NFUlQodHlwZSAhPSBDUERGX0FBY3Rpb246OkZvcm1hdCk7CiAKQEAgLTUwOSwxMSArNTA1LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnNWYWx1ZSwgZGF0YS5iUkMpOwogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgIEFTU0VSVChmYWxzZSk7CisgICAgICBOT1RSRUFDSEVEKCk7CiAgICAgICBicmVhazsKICAgfQogCi0gIENGWF9XaWRlU3RyaW5nIGNzSW5mbzsKKyAgV2lkZVN0cmluZyBjc0luZm87CiAgIGJvb2wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoc2NyaXB0LCAmY3NJbmZvKTsKICAgcFJ1bnRpbWUtPlJlbGVhc2VFdmVudENvbnRleHQocENvbnRleHQpOwogICBpZiAoIWJSZXQpIHsKQEAgLTUyMywxMyArNTE5LDEzIEBACiAKIHZvaWQgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpSdW5Eb2N1bWVudE9wZW5KYXZhU2NyaXB0KAogICAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzU2NyaXB0TmFtZSwKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0KSB7CisgICAgY29uc3QgV2lkZVN0cmluZyYgc1NjcmlwdE5hbWUsCisgICAgY29uc3QgV2lkZVN0cmluZyYgc2NyaXB0KSB7CiAgIElKU19SdW50aW1lKiBwUnVudGltZSA9IHBGb3JtRmlsbEVudi0+R2V0SlNSdW50aW1lKCk7CiAgIElKU19FdmVudENvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0V2ZW50Q29udGV4dCgpOwogICBwQ29udGV4dC0+T25Eb2NfT3BlbihwRm9ybUZpbGxFbnYsIHNTY3JpcHROYW1lKTsKIAotICBDRlhfV2lkZVN0cmluZyBjc0luZm87CisgIFdpZGVTdHJpbmcgY3NJbmZvOwogICBib29sIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHNjcmlwdCwgJmNzSW5mbyk7CiAgIHBSdW50aW1lLT5SZWxlYXNlRXZlbnRDb250ZXh0KHBDb250ZXh0KTsKICAgaWYgKCFiUmV0KSB7CkBAIC01NDAsNyArNTM2LDcgQEAKIHZvaWQgQ1BERlNES19BY3Rpb25IYW5kbGVyOjpSdW5Eb2N1bWVudFBhZ2VKYXZhU2NyaXB0KAogICAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAogICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0KSB7CisgICAgY29uc3QgV2lkZVN0cmluZyYgc2NyaXB0KSB7CiAgIElKU19SdW50aW1lKiBwUnVudGltZSA9IHBGb3JtRmlsbEVudi0+R2V0SlNSdW50aW1lKCk7CiAgIElKU19FdmVudENvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0V2ZW50Q29udGV4dCgpOwogICBzd2l0Y2ggKHR5cGUpIHsKQEAgLTU3MiwxMSArNTY4LDExIEBACiAgICAgICBwQ29udGV4dC0+T25QYWdlX091dFZpZXcocEZvcm1GaWxsRW52KTsKICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICBBU1NFUlQoZmFsc2UpOworICAgICAgTk9UUkVBQ0hFRCgpOwogICAgICAgYnJlYWs7CiAgIH0KIAotICBDRlhfV2lkZVN0cmluZyBjc0luZm87CisgIFdpZGVTdHJpbmcgY3NJbmZvOwogICBib29sIGJSZXQgPSBwQ29udGV4dC0+UnVuU2NyaXB0KHNjcmlwdCwgJmNzSW5mbyk7CiAgIHBSdW50aW1lLT5SZWxlYXNlRXZlbnRDb250ZXh0KHBDb250ZXh0KTsKICAgaWYgKCFiUmV0KSB7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZzZGtfYWN0aW9uaGFuZGxlci5oIGIvZnBkZnNkay9mc2RrX2FjdGlvbmhhbmRsZXIuaAppbmRleCAxYzhkZWRlLi43NDU3YjRlIDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZzZGtfYWN0aW9uaGFuZGxlci5oCisrKyBiL2ZwZGZzZGsvZnNka19hY3Rpb25oYW5kbGVyLmgKQEAgLTI2LDcgKzI2LDcgQEAKICAgYm9vbCBEb0FjdGlvbl9Eb2NPcGVuKGNvbnN0IENQREZfQWN0aW9uJiBhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudik7CiAgIGJvb2wgRG9BY3Rpb25fSmF2YVNjcmlwdChjb25zdCBDUERGX0FjdGlvbiYgSnNBY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBjc0pTTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcgY3NKU05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudik7CiAgIGJvb2wgRG9BY3Rpb25fUGFnZShjb25zdCBDUERGX0FjdGlvbiYgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgZW51bSBDUERGX0FBY3Rpb246OkFBY3Rpb25UeXBlIGVUeXBlLApAQCAtODYsMTUgKzg2LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudik7CiAgIHZvaWQgUnVuRG9jdW1lbnRQYWdlSmF2YVNjcmlwdChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfQUFjdGlvbjo6QUFjdGlvblR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgc2NyaXB0KTsKICAgdm9pZCBSdW5Eb2N1bWVudE9wZW5KYXZhU2NyaXB0KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNTY3JpcHROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzU2NyaXB0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHNjcmlwdCk7CiAgIHZvaWQgUnVuRmllbGRKYXZhU2NyaXB0KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAogICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9BQWN0aW9uOjpBQWN0aW9uVHlwZSB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBQREZTREtfRmllbGRBY3Rpb24mIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzY3JpcHQpOwogCiAgIGJvb2wgSXNWYWxpZEZpZWxkKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAogICAgICAgICAgICAgICAgICAgICBDUERGX0RpY3Rpb25hcnkqIHBGaWVsZERpY3QpOwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9mc2RrX2NvbW1vbi5oIGIvZnBkZnNkay9mc2RrX2NvbW1vbi5oCmluZGV4IGQ4MDMwMjYuLjc4ZWNkOTggMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvZnNka19jb21tb24uaAorKysgYi9mcGRmc2RrL2ZzZGtfY29tbW9uLmgKQEAgLTEwLDcgKzEwLDYgQEAKIC8vIGZvciBhbGwgZmllbGRzCiAjZGVmaW5lIEZJRUxERkxBR19SRUFET05MWSAxCiAjZGVmaW5lIEZJRUxERkxBR19SRVFVSVJFRCAyCi0jZGVmaW5lIEZJRUxERkxBR19OT0VYUE9SVCA0CiAvLyBmb3IgdGV4dCBmaWVsZHMKICNkZWZpbmUgRklFTERGTEFHX01VTFRJTElORSAoMSA8PCAxMikKICNkZWZpbmUgRklFTERGTEFHX1BBU1NXT1JEICgxIDw8IDEzKQpAQCAtMjAsMTQgKzE5LDkgQEAKICNkZWZpbmUgRklFTERGTEFHX0NPTUIgKDEgPDwgMjQpCiAjZGVmaW5lIEZJRUxERkxBR19SSUNIVEVYVCAoMSA8PCAyNSkKIC8vIGZvciBidXR0b24gZmlsZWRzCi0jZGVmaW5lIEZJRUxERkxBR19OT1RPR0dMRVRPT0ZGICgxIDw8IDE0KQotI2RlZmluZSBGSUVMREZMQUdfUkFESU8gKDEgPDwgMTUpCi0jZGVmaW5lIEZJRUxERkxBR19QVVNIQlVUVE9OICgxIDw8IDE2KQogI2RlZmluZSBGSUVMREZMQUdfUkFESU9TSU5VTklTT04gKDEgPDwgMjcpCiAvLyBmb3IgY2hvaWNlIGZpZWxkcwotI2RlZmluZSBGSUVMREZMQUdfQ09NQk8gKDEgPDwgMTcpCiAjZGVmaW5lIEZJRUxERkxBR19FRElUICgxIDw8IDE4KQotI2RlZmluZSBGSUVMREZMQUdfU09SVCAoMSA8PCAxOSkKICNkZWZpbmUgRklFTERGTEFHX01VTFRJU0VMRUNUICgxIDw8IDIxKQogI2RlZmluZSBGSUVMREZMQUdfQ09NTUlUT05TRUxDSEFOR0UgKDEgPDwgMjYpCiAKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnNka19kZWZpbmUuaCBiL2ZwZGZzZGsvZnNka19kZWZpbmUuaAppbmRleCA5YTExNTk2Li43N2MyMzE1IDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZzZGtfZGVmaW5lLmgKKysrIGIvZnBkZnNkay9mc2RrX2RlZmluZS5oCkBAIC04LDYgKzgsNyBAQAogI2RlZmluZSBGUERGU0RLX0ZTREtfREVGSU5FX0hfCiAKICNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfZGliaXRtYXAuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCiAjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCiAKQEAgLTIyLDE4ICsyMywyMiBAQAogCiBjbGFzcyBDUERGX0Fubm90OwogY2xhc3MgQ1BERl9QYWdlOworY2xhc3MgQ1BERl9QYWdlT2JqZWN0OwogY2xhc3MgQ1BERl9QYWdlUmVuZGVyQ29udGV4dDsKK2NsYXNzIENQREZfUGF0aE9iamVjdDsKK2NsYXNzIENQREZfU3RyZWFtOwogY2xhc3MgSUZTREtfUEFVU0VfQWRhcHRlcjsKK2NsYXNzIEZYX1BBVEhQT0lOVDsKIAogLy8gTGF5ZXJpbmcgcHJldmVudHMgZnhjcnQgZnJvbSBrbm93aW5nIGFib3V0IEZQREZfRklMRUFDQ0VTUywgc28gdGhpcyBjYW4ndAogLy8gYmUgYSBzdGF0aWMgbWV0aG9kIG9mIElGWF9TZWVrYWJsZVJlYWRTdHJlYW0uCi1DRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IE1ha2VTZWVrYWJsZVJlYWRTdHJlYW0oCitSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gTWFrZVNlZWthYmxlUmVhZFN0cmVhbSgKICAgICBGUERGX0ZJTEVBQ0NFU1MqIHBGaWxlQWNjZXNzKTsKIAogI2lmZGVmIFBERl9FTkFCTEVfWEZBCiAvLyBMYXllcmluZyBwcmV2ZW50cyBmeGNydCBmcm9tIGtub3dpbmcgYWJvdXQgRlBERl9GSUxFSEFORExFUiwgc28gdGhpcyBjYW4ndAogLy8gYmUgYSBzdGF0aWMgbWV0aG9kIG9mIElGWF9TZWVrYWJsZVN0cmVhbS4KLUNGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlU3RyZWFtPiBNYWtlU2Vla2FibGVTdHJlYW0oCitSZXRhaW5QdHI8SUZYX1NlZWthYmxlU3RyZWFtPiBNYWtlU2Vla2FibGVTdHJlYW0oCiAgICAgRlBERl9GSUxFSEFORExFUiogcEZpbGVIYW5kbGVyKTsKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIApAQCAtNjAsOCArNjUsMjkgQEAKIAogQ1BERl9QYWdlKiBDUERGUGFnZUZyb21GUERGUGFnZShGUERGX1BBR0UgcGFnZSk7CiAKK0NQREZfUGF0aE9iamVjdCogQ1BERlBhdGhPYmplY3RGcm9tRlBERlBhZ2VPYmplY3QoRlBERl9QQUdFT0JKRUNUIHBhZ2Vfb2JqZWN0KTsKKworQ1BERl9QYWdlT2JqZWN0KiBDUERGUGFnZU9iamVjdEZyb21GUERGUGFnZU9iamVjdChGUERGX1BBR0VPQkpFQ1QgcGFnZV9vYmplY3QpOworCitDUERGX09iamVjdCogQ1BERk9iamVjdEZyb21GUERGQXR0YWNobWVudChGUERGX0FUVEFDSE1FTlQgYXR0YWNobWVudCk7CisKK0J5dGVTdHJpbmcgQ0ZYQnl0ZVN0cmluZ0Zyb21GUERGV2lkZVN0cmluZyhGUERGX1dJREVTVFJJTkcgd2lkZV9zdHJpbmcpOworCiBDRlhfRElCaXRtYXAqIENGWEJpdG1hcEZyb21GUERGQml0bWFwKEZQREZfQklUTUFQIGJpdG1hcCk7CiAKK0NGWF9GbG9hdFJlY3QgQ0ZYRmxvYXRSZWN0RnJvbUZTUkVDVEYoY29uc3QgRlNfUkVDVEYmIHJlY3QpOwordm9pZCBGU1JFQ1RGRnJvbUNGWEZsb2F0UmVjdChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LCBGU19SRUNURiogb3V0X3JlY3QpOworCitjb25zdCBGWF9QQVRIUE9JTlQqIEZYUGF0aFBvaW50RnJvbUZQREZQYXRoU2VnbWVudChGUERGX1BBVEhTRUdNRU5UIHNlZ21lbnQpOworCit1bnNpZ25lZCBsb25nIFV0ZjE2RW5jb2RlTWF5YmVDb3B5QW5kUmV0dXJuTGVuZ3RoKGNvbnN0IFdpZGVTdHJpbmcmIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZsZW4pOworCit1bnNpZ25lZCBsb25nIERlY29kZVN0cmVhbU1heWJlQ29weUFuZFJldHVybkxlbmd0aChjb25zdCBDUERGX1N0cmVhbSogc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZsZW4pOworCiB2b2lkIEZTREtfU2V0U2FuZEJveFBvbGljeShGUERGX0RXT1JEIHBvbGljeSwgRlBERl9CT09MIGVuYWJsZSk7CiBGUERGX0JPT0wgRlNES19Jc1NhbmRCb3hQb2xpY3lFbmFibGVkKEZQREZfRFdPUkQgcG9saWN5KTsKIHZvaWQgRlBERl9SZW5kZXJQYWdlX1JldGFpbChDUERGX1BhZ2VSZW5kZXJDb250ZXh0KiBwQ29udGV4dCwKQEAgLTc4LDUgKzEwNCwxMCBAQAogdm9pZCBDaGVja1VuU3VwcG9ydEVycm9yKENQREZfRG9jdW1lbnQqIHBEb2MsIHVpbnQzMl90IGVycl9jb2RlKTsKIHZvaWQgQ2hlY2tVblN1cHBvcnRBbm5vdChDUERGX0RvY3VtZW50KiBwRG9jLCBjb25zdCBDUERGX0Fubm90KiBwUERGQW5ub3QpOwogdm9pZCBQcm9jZXNzUGFyc2VFcnJvcihDUERGX1BhcnNlcjo6RXJyb3IgZXJyKTsKK0ZQREZfQk9PTCBGUERGUGFnZU9ial9TZXRGaWxsQ29sb3IoRlBERl9QQUdFT0JKRUNUIHBhZ2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgQSk7CiAKICNlbmRpZiAgLy8gRlBERlNES19GU0RLX0RFRklORV9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9mc2RrX2ZpbGV3cml0ZWFkYXB0ZXIuY3BwIGIvZnBkZnNkay9mc2RrX2ZpbGV3cml0ZWFkYXB0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZDA1OGYKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL2ZzZGtfZmlsZXdyaXRlYWRhcHRlci5jcHAKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnBkZnNkay9mc2RrX2ZpbGV3cml0ZWFkYXB0ZXIuaCIKKworRlNES19GaWxlV3JpdGVBZGFwdGVyOjpGU0RLX0ZpbGVXcml0ZUFkYXB0ZXIoRlBERl9GSUxFV1JJVEUqIGZpbGVXcml0ZVN0cnVjdCkKKyAgICA6IGZpbGVXcml0ZVN0cnVjdF8oZmlsZVdyaXRlU3RydWN0KSB7CisgIEFTU0VSVChmaWxlV3JpdGVTdHJ1Y3RfKTsKK30KKworRlNES19GaWxlV3JpdGVBZGFwdGVyOjp+RlNES19GaWxlV3JpdGVBZGFwdGVyKCkge30KKworYm9vbCBGU0RLX0ZpbGVXcml0ZUFkYXB0ZXI6OldyaXRlQmxvY2soY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgcmV0dXJuIGZpbGVXcml0ZVN0cnVjdF8tPldyaXRlQmxvY2soZmlsZVdyaXRlU3RydWN0XywgZGF0YSwgc2l6ZSkgIT0gMDsKK30KKworYm9vbCBGU0RLX0ZpbGVXcml0ZUFkYXB0ZXI6OldyaXRlU3RyaW5nKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzdHIpIHsKKyAgcmV0dXJuIFdyaXRlQmxvY2soc3RyLnVudGVybWluYXRlZF9jX3N0cigpLCBzdHIuR2V0TGVuZ3RoKCkpOworfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9mc2RrX2ZpbGV3cml0ZWFkYXB0ZXIuaCBiL2ZwZGZzZGsvZnNka19maWxld3JpdGVhZGFwdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiYTFkYQotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvZnNka19maWxld3JpdGVhZGFwdGVyLmgKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZQREZTREtfRlNES19GSUxFV1JJVEVBREFQVEVSX0hfCisjZGVmaW5lIEZQREZTREtfRlNES19GSUxFV1JJVEVBREFQVEVSX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmVhbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX3NhdmUuaCIKKworY2xhc3MgRlNES19GaWxlV3JpdGVBZGFwdGVyIDogcHVibGljIElGWF9Xcml0ZVN0cmVhbSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KKyAgZnJpZW5kIFJldGFpblB0cjxUPiBwZGZpdW06Ok1ha2VSZXRhaW4oQXJncyYmLi4uIGFyZ3MpOworCisgIGJvb2wgV3JpdGVCbG9jayhjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgIGJvb2wgV3JpdGVTdHJpbmcoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN0cikgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBleHBsaWNpdCBGU0RLX0ZpbGVXcml0ZUFkYXB0ZXIoRlBERl9GSUxFV1JJVEUqIGZpbGVXcml0ZVN0cnVjdCk7CisgIH5GU0RLX0ZpbGVXcml0ZUFkYXB0ZXIoKSBvdmVycmlkZTsKKworICBGUERGX0ZJTEVXUklURSogZmlsZVdyaXRlU3RydWN0XzsKK307CisKKyNlbmRpZiAgLy8gRlBERlNES19GU0RLX0ZJTEVXUklURUFEQVBURVJfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnNka19wYXVzZWFkYXB0ZXIuY3BwIGIvZnBkZnNkay9mc2RrX3BhdXNlYWRhcHRlci5jcHAKaW5kZXggMjM3MjY2Yi4uY2Y5OTI1MyAxMDA2NDQKLS0tIGEvZnBkZnNkay9mc2RrX3BhdXNlYWRhcHRlci5jcHAKKysrIGIvZnBkZnNkay9mc2RrX3BhdXNlYWRhcHRlci5jcHAKQEAgLTEyLDUgKzEyLDUgQEAKIElGU0RLX1BBVVNFX0FkYXB0ZXI6On5JRlNES19QQVVTRV9BZGFwdGVyKCkge30KIAogYm9vbCBJRlNES19QQVVTRV9BZGFwdGVyOjpOZWVkVG9QYXVzZU5vdygpIHsKLSAgcmV0dXJuIG1fSVBhdXNlLT5OZWVkVG9QYXVzZU5vdyAmJiBtX0lQYXVzZS0+TmVlZFRvUGF1c2VOb3cobV9JUGF1c2UpOworICByZXR1cm4gbV9JUGF1c2UtPk5lZWRUb1BhdXNlTm93ICYmIG1fSVBhdXNlLT5OZWVkVG9QYXVzZU5vdyhtX0lQYXVzZS5HZXQoKSk7CiB9CmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZzZGtfcGF1c2VhZGFwdGVyLmggYi9mcGRmc2RrL2ZzZGtfcGF1c2VhZGFwdGVyLmgKaW5kZXggYmQzMDJmMi4uYTBkMDA5OCAxMDA2NDQKLS0tIGEvZnBkZnNkay9mc2RrX3BhdXNlYWRhcHRlci5oCisrKyBiL2ZwZGZzZGsvZnNka19wYXVzZWFkYXB0ZXIuaApAQCAtNywxMSArNywxMiBAQAogI2lmbmRlZiBGUERGU0RLX0ZTREtfUEFVU0VBREFQVEVSX0hfCiAjZGVmaW5lIEZQREZTREtfRlNES19QQVVTRUFEQVBURVJfSF8KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvaWZ4X3BhdXNlaW5kaWNhdG9yLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogI2luY2x1ZGUgInB1YmxpYy9mcGRmX3Byb2dyZXNzaXZlLmgiCiAKLWNsYXNzIElGU0RLX1BBVVNFX0FkYXB0ZXIgOiBwdWJsaWMgSUZYX1BhdXNlIHsKK2NsYXNzIElGU0RLX1BBVVNFX0FkYXB0ZXIgOiBwdWJsaWMgSUZYX1BhdXNlSW5kaWNhdG9yIHsKICBwdWJsaWM6CiAgIGV4cGxpY2l0IElGU0RLX1BBVVNFX0FkYXB0ZXIoSUZTREtfUEFVU0UqIElQYXVzZSk7CiAgIH5JRlNES19QQVVTRV9BZGFwdGVyKCkgb3ZlcnJpZGU7CkBAIC0xOSw3ICsyMCw3IEBACiAgIGJvb2wgTmVlZFRvUGF1c2VOb3coKSBvdmVycmlkZTsKIAogIHByaXZhdGU6Ci0gIElGU0RLX1BBVVNFKiBjb25zdCBtX0lQYXVzZTsKKyAgVW5vd25lZFB0cjxJRlNES19QQVVTRT4gY29uc3QgbV9JUGF1c2U7CiB9OwogCiAjZW5kaWYgIC8vIEZQREZTREtfRlNES19QQVVTRUFEQVBURVJfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnhlZGl0L2Z4X2VkaXQuaCBiL2ZwZGZzZGsvZnhlZGl0L2Z4X2VkaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM5MTY2Ny4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2Z4ZWRpdC9meF9lZGl0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19GWEVESVRfRlhfRURJVF9IXwotI2RlZmluZSBGUERGU0RLX0ZYRURJVF9GWF9FRElUX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0KLWNsYXNzIElQVlRfRm9udE1hcDsKLQotI2RlZmluZSBGWF9FRElUX0lTTEFUSU5XT1JEKHUpICAgICAgICAgICAgICAgICAgXAotICAodSA9PSAweDJEIHx8ICh1IDw9IDB4MDA1QSAmJiB1ID49IDB4MDA0MSkgfHwgXAotICAgKHUgPD0gMHgwMDdBICYmIHUgPj0gMHgwMDYxKSB8fCAodSA8PSAweDAyQUYgJiYgdSA+PSAweDAwQzApKQotCi1DRlhfQnl0ZVN0cmluZyBHZXRQREZXb3JkU3RyaW5nKElQVlRfRm9udE1hcCogcEZvbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZvbnRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgV29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgU3ViV29yZCk7Ci0KLSNlbmRpZiAgLy8gRlBERlNES19GWEVESVRfRlhfRURJVF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9meGVkaXQvZnhldF9hcC5jcHAgYi9mcGRmc2RrL2Z4ZWRpdC9meGV0X2FwLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4YTUzOS4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2Z4ZWRpdC9meGV0X2FwLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udC5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwdnRfd29yZC5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9pcHZ0X2ZvbnRtYXAuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2Z4ZWRpdC9meF9lZGl0LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9meGVkaXQvZnhldF9lZGl0LmgiCi0KLUNGWF9CeXRlU3RyaW5nIEdldFBERldvcmRTdHJpbmcoSVBWVF9Gb250TWFwKiBwRm9udE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRm9udEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBXb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBTdWJXb3JkKSB7Ci0gIENQREZfRm9udCogcFBERkZvbnQgPSBwRm9udE1hcC0+R2V0UERGRm9udChuRm9udEluZGV4KTsKLSAgaWYgKCFwUERGRm9udCkKLSAgICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKLQotICBDRlhfQnl0ZVN0cmluZyBzV29yZDsKLSAgaWYgKFN1YldvcmQgPiAwKSB7Ci0gICAgV29yZCA9IFN1YldvcmQ7Ci0gIH0gZWxzZSB7Ci0gICAgdWludDMyX3QgZHdDaGFyQ29kZSA9IHBQREZGb250LT5Jc1VuaWNvZGVDb21wYXRpYmxlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcFBERkZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUoV29yZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcEZvbnRNYXAtPkNoYXJDb2RlRnJvbVVuaWNvZGUobkZvbnRJbmRleCwgV29yZCk7Ci0KLSAgICBpZiAoZHdDaGFyQ29kZSA+IDApIHsKLSAgICAgIHBQREZGb250LT5BcHBlbmRDaGFyKHNXb3JkLCBkd0NoYXJDb2RlKTsKLSAgICAgIHJldHVybiBzV29yZDsKLSAgICB9Ci0gIH0KLQotICBwUERGRm9udC0+QXBwZW5kQ2hhcihzV29yZCwgV29yZCk7Ci0gIHJldHVybiBzV29yZDsKLX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnhlZGl0L2Z4ZXRfZWRpdC5jcHAgYi9mcGRmc2RrL2Z4ZWRpdC9meGV0X2VkaXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWNjNTc3Li4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvZnhlZGl0L2Z4ZXRfZWRpdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMzA3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImZwZGZzZGsvZnhlZGl0L2Z4ZXRfZWRpdC5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9mb250LmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlb2JqZWN0LmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYWdlb2JqZWN0aG9sZGVyLmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYXRob2JqZWN0LmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl90ZXh0b2JqZWN0LmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9mcGRmX3BhcnNlcl9kZWNvZGUuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfcmVuZGVyb3B0aW9ucy5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9yZW5kZXIvY3BkZl90ZXh0cmVuZGVyZXIuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3B2dF9zZWN0aW9uLmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwdnRfd29yZC5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9pcHZ0X2ZvbnRtYXAuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGVkYXRhLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9jZnhfc3lzdGVtaGFuZGxlci5oIgotI2luY2x1ZGUgImZwZGZzZGsvZnhlZGl0L2Z4X2VkaXQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfRWRpdC5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IGludCBrRWRpdFVuZG9NYXhJdGVtcyA9IDEwMDAwOwotCi1DRlhfQnl0ZVN0cmluZyBHZXRXb3JkUmVuZGVyU3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJXb3JkcykgewotICBpZiAoc3RyV29yZHMuR2V0TGVuZ3RoKCkgPiAwKQotICAgIHJldHVybiBQREZfRW5jb2RlU3RyaW5nKHN0cldvcmRzKSArICIgVGpcbiI7Ci0gIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotfQotCi1DRlhfQnl0ZVN0cmluZyBHZXRGb250U2V0U3RyaW5nKElQVlRfRm9udE1hcCogcEZvbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZvbnRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplKSB7Ci0gIGlmICghcEZvbnRNYXApCi0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnRBbGlhcyA9IHBGb250TWFwLT5HZXRQREZGb250QWxpYXMobkZvbnRJbmRleCk7Ci0gIGlmIChzRm9udEFsaWFzLkdldExlbmd0aCgpIDw9IDAgfHwgZkZvbnRTaXplIDw9IDApCi0gICAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci0KLSAgQ0ZYX0J5dGVUZXh0QnVmIHNSZXQ7Ci0gIHNSZXQgPDwgIi8iIDw8IHNGb250QWxpYXMgPDwgIiAiIDw8IGZGb250U2l6ZSA8PCAiIFRmXG4iOwotICByZXR1cm4gc1JldC5NYWtlU3RyaW5nKCk7Ci19Ci0KLXZvaWQgRHJhd1RleHRTdHJpbmcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQsCi0gICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyLAotICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGNyVGV4dEZpbGwsCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkhvcnpTY2FsZSkgewotICBDRlhfUG9pbnRGIHBvcyA9IHBVc2VyMkRldmljZS0+VHJhbnNmb3JtKHB0KTsKLQotICBpZiAocEZvbnQpIHsKLSAgICBpZiAobkhvcnpTY2FsZSAhPSAxMDApIHsKLSAgICAgIENGWF9NYXRyaXggbXQobkhvcnpTY2FsZSAvIDEwMC4wZiwgMCwgMCwgMSwgMCwgMCk7Ci0gICAgICBtdC5Db25jYXQoKnBVc2VyMkRldmljZSk7Ci0KLSAgICAgIENQREZfUmVuZGVyT3B0aW9ucyBybzsKLSAgICAgIHJvLm1fRmxhZ3MgPSBSRU5ERVJfQ0xFQVJUWVBFOwotICAgICAgcm8ubV9Db2xvck1vZGUgPSBSRU5ERVJfQ09MT1JfTk9STUFMOwotCi0gICAgICBDUERGX1RleHRSZW5kZXJlcjo6RHJhd1RleHRTdHJpbmcocERldmljZSwgcG9zLngsIHBvcy55LCBwRm9udCwgZkZvbnRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtdCwgc3RyLCBjclRleHRGaWxsLCBudWxscHRyLCAmcm8pOwotICAgIH0gZWxzZSB7Ci0gICAgICBDUERGX1JlbmRlck9wdGlvbnMgcm87Ci0gICAgICByby5tX0ZsYWdzID0gUkVOREVSX0NMRUFSVFlQRTsKLSAgICAgIHJvLm1fQ29sb3JNb2RlID0gUkVOREVSX0NPTE9SX05PUk1BTDsKLQotICAgICAgQ1BERl9UZXh0UmVuZGVyZXI6OkRyYXdUZXh0U3RyaW5nKHBEZXZpY2UsIHBvcy54LCBwb3MueSwgcEZvbnQsIGZGb250U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVXNlcjJEZXZpY2UsIHN0ciwgY3JUZXh0RmlsbCwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcm8pOwotICAgIH0KLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotQ0ZYX0VkaXRfSXRlcmF0b3I6OkNGWF9FZGl0X0l0ZXJhdG9yKENGWF9FZGl0KiBwRWRpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1ZhcmlhYmxlVGV4dDo6SXRlcmF0b3IqIHBWVEl0ZXJhdG9yKQotICAgIDogbV9wRWRpdChwRWRpdCksIG1fcFZUSXRlcmF0b3IocFZUSXRlcmF0b3IpIHt9Ci0KLUNGWF9FZGl0X0l0ZXJhdG9yOjp+Q0ZYX0VkaXRfSXRlcmF0b3IoKSB7fQotCi1ib29sIENGWF9FZGl0X0l0ZXJhdG9yOjpOZXh0V29yZCgpIHsKLSAgcmV0dXJuIG1fcFZUSXRlcmF0b3ItPk5leHRXb3JkKCk7Ci19Ci0KLWJvb2wgQ0ZYX0VkaXRfSXRlcmF0b3I6OlByZXZXb3JkKCkgewotICByZXR1cm4gbV9wVlRJdGVyYXRvci0+UHJldldvcmQoKTsKLX0KLQotYm9vbCBDRlhfRWRpdF9JdGVyYXRvcjo6R2V0V29yZChDUFZUX1dvcmQmIHdvcmQpIGNvbnN0IHsKLSAgQVNTRVJUKG1fcEVkaXQpOwotCi0gIGlmIChtX3BWVEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7Ci0gICAgd29yZC5wdFdvcmQgPSBtX3BFZGl0LT5WVFRvRWRpdCh3b3JkLnB0V29yZCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENGWF9FZGl0X0l0ZXJhdG9yOjpHZXRMaW5lKENQVlRfTGluZSYgbGluZSkgY29uc3QgewotICBBU1NFUlQobV9wRWRpdCk7Ci0KLSAgaWYgKG1fcFZUSXRlcmF0b3ItPkdldExpbmUobGluZSkpIHsKLSAgICBsaW5lLnB0TGluZSA9IG1fcEVkaXQtPlZUVG9FZGl0KGxpbmUucHRMaW5lKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ0ZYX0VkaXRfSXRlcmF0b3I6OkdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uJiBzZWN0aW9uKSBjb25zdCB7Ci0gIEFTU0VSVChtX3BFZGl0KTsKLQotICBpZiAobV9wVlRJdGVyYXRvci0+R2V0U2VjdGlvbihzZWN0aW9uKSkgewotICAgIHNlY3Rpb24ucmNTZWN0aW9uID0gbV9wRWRpdC0+VlRUb0VkaXQoc2VjdGlvbi5yY1NlY3Rpb24pOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBDRlhfRWRpdF9JdGVyYXRvcjo6U2V0QXQoaW50MzJfdCBuV29yZEluZGV4KSB7Ci0gIG1fcFZUSXRlcmF0b3ItPlNldEF0KG5Xb3JkSW5kZXgpOwotfQotCi12b2lkIENGWF9FZGl0X0l0ZXJhdG9yOjpTZXRBdChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIHsKLSAgbV9wVlRJdGVyYXRvci0+U2V0QXQocGxhY2UpOwotfQotCi1jb25zdCBDUFZUX1dvcmRQbGFjZSYgQ0ZYX0VkaXRfSXRlcmF0b3I6OkdldEF0KCkgY29uc3QgewotICByZXR1cm4gbV9wVlRJdGVyYXRvci0+R2V0QXQoKTsKLX0KLQotQ0ZYX0VkaXRfUHJvdmlkZXI6OkNGWF9FZGl0X1Byb3ZpZGVyKElQVlRfRm9udE1hcCogcEZvbnRNYXApCi0gICAgOiBDUERGX1ZhcmlhYmxlVGV4dDo6UHJvdmlkZXIocEZvbnRNYXApLCBtX3BGb250TWFwKHBGb250TWFwKSB7Ci0gIEFTU0VSVChtX3BGb250TWFwKTsKLX0KLQotQ0ZYX0VkaXRfUHJvdmlkZXI6On5DRlhfRWRpdF9Qcm92aWRlcigpIHt9Ci0KLUlQVlRfRm9udE1hcCogQ0ZYX0VkaXRfUHJvdmlkZXI6OkdldEZvbnRNYXAoKSB7Ci0gIHJldHVybiBtX3BGb250TWFwOwotfQotCi1pbnQzMl90IENGWF9FZGl0X1Byb3ZpZGVyOjpHZXRDaGFyV2lkdGgoaW50MzJfdCBuRm9udEluZGV4LCB1aW50MTZfdCB3b3JkKSB7Ci0gIGlmIChDUERGX0ZvbnQqIHBQREZGb250ID0gbV9wRm9udE1hcC0+R2V0UERGRm9udChuRm9udEluZGV4KSkgewotICAgIHVpbnQzMl90IGNoYXJjb2RlID0gd29yZDsKLQotICAgIGlmIChwUERGRm9udC0+SXNVbmljb2RlQ29tcGF0aWJsZSgpKQotICAgICAgY2hhcmNvZGUgPSBwUERGRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZSh3b3JkKTsKLSAgICBlbHNlCi0gICAgICBjaGFyY29kZSA9IG1fcEZvbnRNYXAtPkNoYXJDb2RlRnJvbVVuaWNvZGUobkZvbnRJbmRleCwgd29yZCk7Ci0KLSAgICBpZiAoY2hhcmNvZGUgIT0gQ1BERl9Gb250OjprSW52YWxpZENoYXJDb2RlKQotICAgICAgcmV0dXJuIHBQREZGb250LT5HZXRDaGFyV2lkdGhGKGNoYXJjb2RlKTsKLSAgfQotCi0gIHJldHVybiAwOwotfQotCi1pbnQzMl90IENGWF9FZGl0X1Byb3ZpZGVyOjpHZXRUeXBlQXNjZW50KGludDMyX3QgbkZvbnRJbmRleCkgewotICBpZiAoQ1BERl9Gb250KiBwUERGRm9udCA9IG1fcEZvbnRNYXAtPkdldFBERkZvbnQobkZvbnRJbmRleCkpCi0gICAgcmV0dXJuIHBQREZGb250LT5HZXRUeXBlQXNjZW50KCk7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludDMyX3QgQ0ZYX0VkaXRfUHJvdmlkZXI6OkdldFR5cGVEZXNjZW50KGludDMyX3QgbkZvbnRJbmRleCkgewotICBpZiAoQ1BERl9Gb250KiBwUERGRm9udCA9IG1fcEZvbnRNYXAtPkdldFBERkZvbnQobkZvbnRJbmRleCkpCi0gICAgcmV0dXJuIHBQREZGb250LT5HZXRUeXBlRGVzY2VudCgpOwotCi0gIHJldHVybiAwOwotfQotCi1pbnQzMl90IENGWF9FZGl0X1Byb3ZpZGVyOjpHZXRXb3JkRm9udEluZGV4KHVpbnQxNl90IHdvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRm9udEluZGV4KSB7Ci0gIHJldHVybiBtX3BGb250TWFwLT5HZXRXb3JkRm9udEluZGV4KHdvcmQsIGNoYXJzZXQsIG5Gb250SW5kZXgpOwotfQotCi1pbnQzMl90IENGWF9FZGl0X1Byb3ZpZGVyOjpHZXREZWZhdWx0Rm9udEluZGV4KCkgewotICByZXR1cm4gMDsKLX0KLQotYm9vbCBDRlhfRWRpdF9Qcm92aWRlcjo6SXNMYXRpbldvcmQodWludDE2X3Qgd29yZCkgewotICByZXR1cm4gRlhfRURJVF9JU0xBVElOV09SRCh3b3JkKTsKLX0KLQotQ0ZYX0VkaXRfUmVmcmVzaDo6Q0ZYX0VkaXRfUmVmcmVzaCgpIHt9Ci0KLUNGWF9FZGl0X1JlZnJlc2g6On5DRlhfRWRpdF9SZWZyZXNoKCkge30KLQotdm9pZCBDRlhfRWRpdF9SZWZyZXNoOjpCZWdpblJlZnJlc2goKSB7Ci0gIG1fUmVmcmVzaFJlY3RzLkNsZWFyKCk7Ci0gIG1fT2xkTGluZVJlY3RzID0gc3RkOjptb3ZlKG1fTmV3TGluZVJlY3RzKTsKLX0KLQotdm9pZCBDRlhfRWRpdF9SZWZyZXNoOjpQdXNoKGNvbnN0IENQVlRfV29yZFJhbmdlJiBsaW5lcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgewotICBtX05ld0xpbmVSZWN0cy5BZGQobGluZXJhbmdlLCByZWN0KTsKLX0KLQotdm9pZCBDRlhfRWRpdF9SZWZyZXNoOjpOb0FuYWx5c2UoKSB7Ci0gIHsKLSAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9PbGRMaW5lUmVjdHMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKLSAgICAgIGlmIChDRlhfRWRpdF9MaW5lUmVjdCogcE9sZFJlY3QgPSBtX09sZExpbmVSZWN0cy5HZXRBdChpKSkKLSAgICAgICAgbV9SZWZyZXNoUmVjdHMuQWRkKHBPbGRSZWN0LT5tX3JjTGluZSk7Ci0gIH0KLQotICB7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fTmV3TGluZVJlY3RzLkdldFNpemUoKTsgaSA8IHN6OyBpKyspCi0gICAgICBpZiAoQ0ZYX0VkaXRfTGluZVJlY3QqIHBOZXdSZWN0ID0gbV9OZXdMaW5lUmVjdHMuR2V0QXQoaSkpCi0gICAgICAgIG1fUmVmcmVzaFJlY3RzLkFkZChwTmV3UmVjdC0+bV9yY0xpbmUpOwotICB9Ci19Ci0KLXZvaWQgQ0ZYX0VkaXRfUmVmcmVzaDo6QWRkUmVmcmVzaChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KSB7Ci0gIG1fUmVmcmVzaFJlY3RzLkFkZChyZWN0KTsKLX0KLQotY29uc3QgQ0ZYX0VkaXRfUmVjdEFycmF5KiBDRlhfRWRpdF9SZWZyZXNoOjpHZXRSZWZyZXNoUmVjdHMoKSBjb25zdCB7Ci0gIHJldHVybiAmbV9SZWZyZXNoUmVjdHM7Ci19Ci0KLXZvaWQgQ0ZYX0VkaXRfUmVmcmVzaDo6RW5kUmVmcmVzaCgpIHsKLSAgbV9SZWZyZXNoUmVjdHMuQ2xlYXIoKTsKLX0KLQotQ0ZYX0VkaXRfVW5kbzo6Q0ZYX0VkaXRfVW5kbyhpbnQzMl90IG5CdWZzaXplKQotICAgIDogbV9uQ3VyVW5kb1BvcygwKSwKLSAgICAgIG1fbkJ1ZlNpemUobkJ1ZnNpemUpLAotICAgICAgbV9iTW9kaWZpZWQoZmFsc2UpLAotICAgICAgbV9iVmlyZ2luKHRydWUpLAotICAgICAgbV9iV29ya2luZyhmYWxzZSkge30KLQotQ0ZYX0VkaXRfVW5kbzo6fkNGWF9FZGl0X1VuZG8oKSB7Ci0gIFJlc2V0KCk7Ci19Ci0KLWJvb2wgQ0ZYX0VkaXRfVW5kbzo6Q2FuVW5kbygpIGNvbnN0IHsKLSAgcmV0dXJuIG1fbkN1clVuZG9Qb3MgPiAwOwotfQotCi12b2lkIENGWF9FZGl0X1VuZG86OlVuZG8oKSB7Ci0gIG1fYldvcmtpbmcgPSB0cnVlOwotICBpZiAobV9uQ3VyVW5kb1BvcyA+IDApIHsKLSAgICBtX1VuZG9JdGVtU3RhY2tbbV9uQ3VyVW5kb1BvcyAtIDFdLT5VbmRvKCk7Ci0gICAgbV9uQ3VyVW5kb1Bvcy0tOwotICAgIG1fYk1vZGlmaWVkID0gKG1fbkN1clVuZG9Qb3MgIT0gMCk7Ci0gIH0KLSAgbV9iV29ya2luZyA9IGZhbHNlOwotfQotCi1ib29sIENGWF9FZGl0X1VuZG86OkNhblJlZG8oKSBjb25zdCB7Ci0gIHJldHVybiBtX25DdXJVbmRvUG9zIDwgbV9VbmRvSXRlbVN0YWNrLnNpemUoKTsKLX0KLQotdm9pZCBDRlhfRWRpdF9VbmRvOjpSZWRvKCkgewotICBtX2JXb3JraW5nID0gdHJ1ZTsKLSAgaWYgKG1fbkN1clVuZG9Qb3MgPCBtX1VuZG9JdGVtU3RhY2suc2l6ZSgpKSB7Ci0gICAgbV9VbmRvSXRlbVN0YWNrW21fbkN1clVuZG9Qb3NdLT5SZWRvKCk7Ci0gICAgbV9uQ3VyVW5kb1BvcysrOwotICAgIG1fYk1vZGlmaWVkID0gdHJ1ZTsKLSAgfQotICBtX2JXb3JraW5nID0gZmFsc2U7Ci19Ci0KLXZvaWQgQ0ZYX0VkaXRfVW5kbzo6QWRkSXRlbShzdGQ6OnVuaXF1ZV9wdHI8SUZYX0VkaXRfVW5kb0l0ZW0+IHBJdGVtKSB7Ci0gIEFTU0VSVCghbV9iV29ya2luZyk7Ci0gIEFTU0VSVChwSXRlbSk7Ci0gIEFTU0VSVChtX25CdWZTaXplID4gMSk7Ci0gIGlmIChtX25DdXJVbmRvUG9zIDwgbV9VbmRvSXRlbVN0YWNrLnNpemUoKSkKLSAgICBSZW1vdmVUYWlscygpOwotCi0gIGlmIChtX1VuZG9JdGVtU3RhY2suc2l6ZSgpID49IG1fbkJ1ZlNpemUpIHsKLSAgICBSZW1vdmVIZWFkcygpOwotICAgIG1fYlZpcmdpbiA9IGZhbHNlOwotICB9Ci0KLSAgbV9VbmRvSXRlbVN0YWNrLnB1c2hfYmFjayhzdGQ6Om1vdmUocEl0ZW0pKTsKLSAgbV9uQ3VyVW5kb1BvcyA9IG1fVW5kb0l0ZW1TdGFjay5zaXplKCk7Ci0gIG1fYk1vZGlmaWVkID0gdHJ1ZTsKLX0KLQotYm9vbCBDRlhfRWRpdF9VbmRvOjpJc01vZGlmaWVkKCkgY29uc3QgewotICByZXR1cm4gbV9iVmlyZ2luID8gbV9iTW9kaWZpZWQgOiB0cnVlOwotfQotCi12b2lkIENGWF9FZGl0X1VuZG86OlJlbW92ZUhlYWRzKCkgewotICBBU1NFUlQobV9VbmRvSXRlbVN0YWNrLnNpemUoKSA+IDEpOwotICBtX1VuZG9JdGVtU3RhY2sucG9wX2Zyb250KCk7Ci19Ci0KLXZvaWQgQ0ZYX0VkaXRfVW5kbzo6UmVtb3ZlVGFpbHMoKSB7Ci0gIHdoaWxlIChtX1VuZG9JdGVtU3RhY2suc2l6ZSgpID4gbV9uQ3VyVW5kb1BvcykKLSAgICBtX1VuZG9JdGVtU3RhY2sucG9wX2JhY2soKTsKLX0KLQotdm9pZCBDRlhfRWRpdF9VbmRvOjpSZXNldCgpIHsKLSAgbV9VbmRvSXRlbVN0YWNrLmNsZWFyKCk7Ci0gIG1fbkN1clVuZG9Qb3MgPSAwOwotfQotCi1DRlhfRWRpdF9VbmRvSXRlbTo6Q0ZYX0VkaXRfVW5kb0l0ZW0oKSA6IG1fYkZpcnN0KHRydWUpLCBtX2JMYXN0KHRydWUpIHt9Ci0KLUNGWF9FZGl0X1VuZG9JdGVtOjp+Q0ZYX0VkaXRfVW5kb0l0ZW0oKSB7fQotCi1DRlhfV2lkZVN0cmluZyBDRlhfRWRpdF9VbmRvSXRlbTo6R2V0VW5kb1RpdGxlKCkgY29uc3QgewotICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLX0KLQotdm9pZCBDRlhfRWRpdF9VbmRvSXRlbTo6U2V0Rmlyc3QoYm9vbCBiRmlyc3QpIHsKLSAgbV9iRmlyc3QgPSBiRmlyc3Q7Ci19Ci0KLXZvaWQgQ0ZYX0VkaXRfVW5kb0l0ZW06OlNldExhc3QoYm9vbCBiTGFzdCkgewotICBtX2JMYXN0ID0gYkxhc3Q7Ci19Ci0KLWJvb2wgQ0ZYX0VkaXRfVW5kb0l0ZW06OklzTGFzdCgpIHsKLSAgcmV0dXJuIG1fYkxhc3Q7Ci19Ci0KLUNGWF9FZGl0X0dyb3VwVW5kb0l0ZW06OkNGWF9FZGl0X0dyb3VwVW5kb0l0ZW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNUaXRsZSkKLSAgICA6IG1fc1RpdGxlKHNUaXRsZSkge30KLQotQ0ZYX0VkaXRfR3JvdXBVbmRvSXRlbTo6fkNGWF9FZGl0X0dyb3VwVW5kb0l0ZW0oKSB7fQotCi12b2lkIENGWF9FZGl0X0dyb3VwVW5kb0l0ZW06OkFkZFVuZG9JdGVtKAotICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRWRpdF9VbmRvSXRlbT4gcFVuZG9JdGVtKSB7Ci0gIHBVbmRvSXRlbS0+U2V0Rmlyc3QoZmFsc2UpOwotICBwVW5kb0l0ZW0tPlNldExhc3QoZmFsc2UpOwotICBpZiAobV9zVGl0bGUuSXNFbXB0eSgpKQotICAgIG1fc1RpdGxlID0gcFVuZG9JdGVtLT5HZXRVbmRvVGl0bGUoKTsKLQotICBtX0l0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUocFVuZG9JdGVtKSk7Ci19Ci0KLXZvaWQgQ0ZYX0VkaXRfR3JvdXBVbmRvSXRlbTo6VXBkYXRlSXRlbXMoKSB7Ci0gIGlmICghbV9JdGVtcy5lbXB0eSgpKSB7Ci0gICAgbV9JdGVtcy5mcm9udCgpLT5TZXRGaXJzdCh0cnVlKTsKLSAgICBtX0l0ZW1zLmJhY2soKS0+U2V0TGFzdCh0cnVlKTsKLSAgfQotfQotCi12b2lkIENGWF9FZGl0X0dyb3VwVW5kb0l0ZW06OlVuZG8oKSB7Ci0gIGZvciAoYXV0byBpdGVyID0gbV9JdGVtcy5yYmVnaW4oKTsgaXRlciAhPSBtX0l0ZW1zLnJlbmQoKTsgKytpdGVyKQotICAgICgqaXRlciktPlVuZG8oKTsKLX0KLQotdm9pZCBDRlhfRWRpdF9Hcm91cFVuZG9JdGVtOjpSZWRvKCkgewotICBmb3IgKGF1dG8gaXRlciA9IG1fSXRlbXMuYmVnaW4oKTsgaXRlciAhPSBtX0l0ZW1zLmVuZCgpOyArK2l0ZXIpCi0gICAgKCppdGVyKS0+UmVkbygpOwotfQotCi1DRlhfV2lkZVN0cmluZyBDRlhfRWRpdF9Hcm91cFVuZG9JdGVtOjpHZXRVbmRvVGl0bGUoKSBjb25zdCB7Ci0gIHJldHVybiBtX3NUaXRsZTsKLX0KLQotQ0ZYRVVfSW5zZXJ0V29yZDo6Q0ZYRVVfSW5zZXJ0V29yZChDRlhfRWRpdCogcEVkaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE9sZFBsYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcykKLSAgICA6IG1fcEVkaXQocEVkaXQpLAotICAgICAgbV93cE9sZCh3cE9sZFBsYWNlKSwKLSAgICAgIG1fd3BOZXcod3BOZXdQbGFjZSksCi0gICAgICBtX1dvcmQod29yZCksCi0gICAgICBtX25DaGFyc2V0KGNoYXJzZXQpLAotICAgICAgbV9Xb3JkUHJvcHMoKSB7Ci0gIGlmIChwV29yZFByb3BzKQotICAgIG1fV29yZFByb3BzID0gKnBXb3JkUHJvcHM7Ci19Ci0KLUNGWEVVX0luc2VydFdvcmQ6On5DRlhFVV9JbnNlcnRXb3JkKCkge30KLQotdm9pZCBDRlhFVV9JbnNlcnRXb3JkOjpSZWRvKCkgewotICBpZiAobV9wRWRpdCkgewotICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKLSAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dwT2xkKTsKLSAgICBtX3BFZGl0LT5JbnNlcnRXb3JkKG1fV29yZCwgbV9uQ2hhcnNldCwgJm1fV29yZFByb3BzLCBmYWxzZSwgdHJ1ZSk7Ci0gIH0KLX0KLQotdm9pZCBDRlhFVV9JbnNlcnRXb3JkOjpVbmRvKCkgewotICBpZiAobV9wRWRpdCkgewotICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKLSAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dwTmV3KTsKLSAgICBtX3BFZGl0LT5CYWNrc3BhY2UoZmFsc2UsIHRydWUpOwotICB9Ci19Ci0KLUNGWEVVX0luc2VydFJldHVybjo6Q0ZYRVVfSW5zZXJ0UmV0dXJuKENGWF9FZGl0KiBwRWRpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE9sZFBsYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwTmV3UGxhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzKiBwU2VjUHJvcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcykKLSAgICA6IG1fcEVkaXQocEVkaXQpLAotICAgICAgbV93cE9sZCh3cE9sZFBsYWNlKSwKLSAgICAgIG1fd3BOZXcod3BOZXdQbGFjZSksCi0gICAgICBtX1NlY1Byb3BzKCksCi0gICAgICBtX1dvcmRQcm9wcygpIHsKLSAgaWYgKHBTZWNQcm9wcykKLSAgICBtX1NlY1Byb3BzID0gKnBTZWNQcm9wczsKLSAgaWYgKHBXb3JkUHJvcHMpCi0gICAgbV9Xb3JkUHJvcHMgPSAqcFdvcmRQcm9wczsKLX0KLQotQ0ZYRVVfSW5zZXJ0UmV0dXJuOjp+Q0ZYRVVfSW5zZXJ0UmV0dXJuKCkge30KLQotdm9pZCBDRlhFVV9JbnNlcnRSZXR1cm46OlJlZG8oKSB7Ci0gIGlmIChtX3BFZGl0KSB7Ci0gICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwotICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BPbGQpOwotICAgIG1fcEVkaXQtPkluc2VydFJldHVybigmbV9TZWNQcm9wcywgJm1fV29yZFByb3BzLCBmYWxzZSwgdHJ1ZSk7Ci0gIH0KLX0KLQotdm9pZCBDRlhFVV9JbnNlcnRSZXR1cm46OlVuZG8oKSB7Ci0gIGlmIChtX3BFZGl0KSB7Ci0gICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwotICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BOZXcpOwotICAgIG1fcEVkaXQtPkJhY2tzcGFjZShmYWxzZSwgdHJ1ZSk7Ci0gIH0KLX0KLQotQ0ZYRVVfQmFja3NwYWNlOjpDRlhFVV9CYWNrc3BhY2UoQ0ZYX0VkaXQqIHBFZGl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzJiBTZWNQcm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzJiBXb3JkUHJvcHMpCi0gICAgOiBtX3BFZGl0KHBFZGl0KSwKLSAgICAgIG1fd3BPbGQod3BPbGRQbGFjZSksCi0gICAgICBtX3dwTmV3KHdwTmV3UGxhY2UpLAotICAgICAgbV9Xb3JkKHdvcmQpLAotICAgICAgbV9uQ2hhcnNldChjaGFyc2V0KSwKLSAgICAgIG1fU2VjUHJvcHMoU2VjUHJvcHMpLAotICAgICAgbV9Xb3JkUHJvcHMoV29yZFByb3BzKSB7fQotCi1DRlhFVV9CYWNrc3BhY2U6On5DRlhFVV9CYWNrc3BhY2UoKSB7fQotCi12b2lkIENGWEVVX0JhY2tzcGFjZTo6UmVkbygpIHsKLSAgaWYgKG1fcEVkaXQpIHsKLSAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7Ci0gICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE9sZCk7Ci0gICAgbV9wRWRpdC0+QmFja3NwYWNlKGZhbHNlLCB0cnVlKTsKLSAgfQotfQotCi12b2lkIENGWEVVX0JhY2tzcGFjZTo6VW5kbygpIHsKLSAgaWYgKG1fcEVkaXQpIHsKLSAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7Ci0gICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE5ldyk7Ci0gICAgaWYgKG1fd3BOZXcuU2VjQ21wKG1fd3BPbGQpICE9IDApIHsKLSAgICAgIG1fcEVkaXQtPkluc2VydFJldHVybigmbV9TZWNQcm9wcywgJm1fV29yZFByb3BzLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1fcEVkaXQtPkluc2VydFdvcmQobV9Xb3JkLCBtX25DaGFyc2V0LCAmbV9Xb3JkUHJvcHMsIGZhbHNlLCB0cnVlKTsKLSAgICB9Ci0gIH0KLX0KLQotQ0ZYRVVfRGVsZXRlOjpDRlhFVV9EZWxldGUoQ0ZYX0VkaXQqIHBFZGl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1NlY1Byb3BzJiBTZWNQcm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzJiBXb3JkUHJvcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZWNFbmQpCi0gICAgOiBtX3BFZGl0KHBFZGl0KSwKLSAgICAgIG1fd3BPbGQod3BPbGRQbGFjZSksCi0gICAgICBtX3dwTmV3KHdwTmV3UGxhY2UpLAotICAgICAgbV9Xb3JkKHdvcmQpLAotICAgICAgbV9uQ2hhcnNldChjaGFyc2V0KSwKLSAgICAgIG1fU2VjUHJvcHMoU2VjUHJvcHMpLAotICAgICAgbV9Xb3JkUHJvcHMoV29yZFByb3BzKSwKLSAgICAgIG1fYlNlY0VuZChiU2VjRW5kKSB7fQotCi1DRlhFVV9EZWxldGU6On5DRlhFVV9EZWxldGUoKSB7fQotCi12b2lkIENGWEVVX0RlbGV0ZTo6UmVkbygpIHsKLSAgaWYgKG1fcEVkaXQpIHsKLSAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7Ci0gICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE9sZCk7Ci0gICAgbV9wRWRpdC0+RGVsZXRlKGZhbHNlLCB0cnVlKTsKLSAgfQotfQotCi12b2lkIENGWEVVX0RlbGV0ZTo6VW5kbygpIHsKLSAgaWYgKG1fcEVkaXQpIHsKLSAgICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7Ci0gICAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE5ldyk7Ci0gICAgaWYgKG1fYlNlY0VuZCkgewotICAgICAgbV9wRWRpdC0+SW5zZXJ0UmV0dXJuKCZtX1NlY1Byb3BzLCAmbV9Xb3JkUHJvcHMsIGZhbHNlLCB0cnVlKTsKLSAgICB9IGVsc2UgewotICAgICAgbV9wRWRpdC0+SW5zZXJ0V29yZChtX1dvcmQsIG1fbkNoYXJzZXQsICZtX1dvcmRQcm9wcywgZmFsc2UsIHRydWUpOwotICAgIH0KLSAgfQotfQotCi1DRlhFVV9DbGVhcjo6Q0ZYRVVfQ2xlYXIoQ0ZYX0VkaXQqIHBFZGl0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3clNlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dUZXh0KQotICAgIDogbV9wRWRpdChwRWRpdCksIG1fd3JTZWwod3JTZWwpLCBtX3N3VGV4dChzd1RleHQpIHt9Ci0KLUNGWEVVX0NsZWFyOjp+Q0ZYRVVfQ2xlYXIoKSB7fQotCi12b2lkIENGWEVVX0NsZWFyOjpSZWRvKCkgewotICBpZiAobV9wRWRpdCkgewotICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKLSAgICBtX3BFZGl0LT5TZXRTZWwobV93clNlbC5CZWdpblBvcywgbV93clNlbC5FbmRQb3MpOwotICAgIG1fcEVkaXQtPkNsZWFyKGZhbHNlLCB0cnVlKTsKLSAgfQotfQotCi12b2lkIENGWEVVX0NsZWFyOjpVbmRvKCkgewotICBpZiAobV9wRWRpdCkgewotICAgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKLSAgICBtX3BFZGl0LT5TZXRDYXJldChtX3dyU2VsLkJlZ2luUG9zKTsKLSAgICBtX3BFZGl0LT5JbnNlcnRUZXh0KG1fc3dUZXh0LCBGWEZPTlRfREVGQVVMVF9DSEFSU0VULCBmYWxzZSwgdHJ1ZSk7Ci0gICAgbV9wRWRpdC0+U2V0U2VsKG1fd3JTZWwuQmVnaW5Qb3MsIG1fd3JTZWwuRW5kUG9zKTsKLSAgfQotfQotCi1DRlhFVV9JbnNlcnRUZXh0OjpDRlhFVV9JbnNlcnRUZXh0KENGWF9FZGl0KiBwRWRpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE5ld1BsYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dUZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQpCi0gICAgOiBtX3BFZGl0KHBFZGl0KSwKLSAgICAgIG1fd3BPbGQod3BPbGRQbGFjZSksCi0gICAgICBtX3dwTmV3KHdwTmV3UGxhY2UpLAotICAgICAgbV9zd1RleHQoc3dUZXh0KSwKLSAgICAgIG1fbkNoYXJzZXQoY2hhcnNldCkge30KLQotQ0ZYRVVfSW5zZXJ0VGV4dDo6fkNGWEVVX0luc2VydFRleHQoKSB7fQotCi12b2lkIENGWEVVX0luc2VydFRleHQ6OlJlZG8oKSB7Ci0gIGlmIChtX3BFZGl0ICYmIElzTGFzdCgpKSB7Ci0gICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwotICAgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BPbGQpOwotICAgIG1fcEVkaXQtPkluc2VydFRleHQobV9zd1RleHQsIG1fbkNoYXJzZXQsIGZhbHNlLCB0cnVlKTsKLSAgfQotfQotCi12b2lkIENGWEVVX0luc2VydFRleHQ6OlVuZG8oKSB7Ci0gIGlmIChtX3BFZGl0KSB7Ci0gICAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwotICAgIG1fcEVkaXQtPlNldFNlbChtX3dwT2xkLCBtX3dwTmV3KTsKLSAgICBtX3BFZGl0LT5DbGVhcihmYWxzZSwgdHJ1ZSk7Ci0gIH0KLX0KLQotLy8gc3RhdGljCi1DRlhfQnl0ZVN0cmluZyBDRlhfRWRpdDo6R2V0RWRpdEFwcGVhcmFuY2VTdHJlYW0oQ0ZYX0VkaXQqIHBFZGl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ29udGludW91cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBTdWJXb3JkKSB7Ci0gIENGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKTsKLSAgaWYgKHBSYW5nZSkKLSAgICBwSXRlcmF0b3ItPlNldEF0KHBSYW5nZS0+QmVnaW5Qb3MpOwotICBlbHNlCi0gICAgcEl0ZXJhdG9yLT5TZXRBdCgwKTsKLQotICBDRlhfQnl0ZVRleHRCdWYgc0VkaXRTdHJlYW07Ci0gIENGWF9CeXRlVGV4dEJ1ZiBzV29yZHM7Ci0gIGludDMyX3QgbkN1ckZvbnRJbmRleCA9IC0xOwotICBDRlhfUG9pbnRGIHB0T2xkOwotICBDRlhfUG9pbnRGIHB0TmV3OwotICBDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZTsKLQotICB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKSB7Ci0gICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7Ci0gICAgaWYgKHBSYW5nZSAmJiBwbGFjZS5Xb3JkQ21wKHBSYW5nZS0+RW5kUG9zKSA+IDApCi0gICAgICBicmVhazsKLQotICAgIGlmIChiQ29udGludW91cykgewotICAgICAgaWYgKHBsYWNlLkxpbmVDbXAob2xkcGxhY2UpICE9IDApIHsKLSAgICAgICAgaWYgKHNXb3Jkcy5HZXRTaXplKCkgPiAwKSB7Ci0gICAgICAgICAgc0VkaXRTdHJlYW0gPDwgR2V0V29yZFJlbmRlclN0cmluZyhzV29yZHMuTWFrZVN0cmluZygpKTsKLSAgICAgICAgICBzV29yZHMuQ2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIENQVlRfV29yZCB3b3JkOwotICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7Ci0gICAgICAgICAgcHROZXcgPSBDRlhfUG9pbnRGKHdvcmQucHRXb3JkLnggKyBwdE9mZnNldC54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkLnB0V29yZC55ICsgcHRPZmZzZXQueSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgQ1BWVF9MaW5lIGxpbmU7Ci0gICAgICAgICAgcEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpOwotICAgICAgICAgIHB0TmV3ID0gQ0ZYX1BvaW50RihsaW5lLnB0TGluZS54ICsgcHRPZmZzZXQueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5wdExpbmUueSArIHB0T2Zmc2V0LnkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHB0TmV3LnggIT0gcHRPbGQueCB8fCBwdE5ldy55ICE9IHB0T2xkLnkpIHsKLSAgICAgICAgICBzRWRpdFN0cmVhbSA8PCBwdE5ldy54IC0gcHRPbGQueCA8PCAiICIgPDwgcHROZXcueSAtIHB0T2xkLnkKLSAgICAgICAgICAgICAgICAgICAgICA8PCAiIFRkXG4iOwotCi0gICAgICAgICAgcHRPbGQgPSBwdE5ldzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBDUFZUX1dvcmQgd29yZDsKLSAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKLSAgICAgICAgaWYgKHdvcmQubkZvbnRJbmRleCAhPSBuQ3VyRm9udEluZGV4KSB7Ci0gICAgICAgICAgaWYgKHNXb3Jkcy5HZXRTaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBzRWRpdFN0cmVhbSA8PCBHZXRXb3JkUmVuZGVyU3RyaW5nKHNXb3Jkcy5NYWtlU3RyaW5nKCkpOwotICAgICAgICAgICAgc1dvcmRzLkNsZWFyKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHNFZGl0U3RyZWFtIDw8IEdldEZvbnRTZXRTdHJpbmcocEVkaXQtPkdldEZvbnRNYXAoKSwgd29yZC5uRm9udEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZC5mRm9udFNpemUpOwotICAgICAgICAgIG5DdXJGb250SW5kZXggPSB3b3JkLm5Gb250SW5kZXg7Ci0gICAgICAgIH0KLQotICAgICAgICBzV29yZHMgPDwgR2V0UERGV29yZFN0cmluZyhwRWRpdC0+R2V0Rm9udE1hcCgpLCBuQ3VyRm9udEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkLldvcmQsIFN1YldvcmQpOwotICAgICAgfQotCi0gICAgICBvbGRwbGFjZSA9IHBsYWNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBDUFZUX1dvcmQgd29yZDsKLSAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKLSAgICAgICAgcHROZXcgPQotICAgICAgICAgICAgQ0ZYX1BvaW50Rih3b3JkLnB0V29yZC54ICsgcHRPZmZzZXQueCwgd29yZC5wdFdvcmQueSArIHB0T2Zmc2V0LnkpOwotCi0gICAgICAgIGlmIChwdE5ldy54ICE9IHB0T2xkLnggfHwgcHROZXcueSAhPSBwdE9sZC55KSB7Ci0gICAgICAgICAgc0VkaXRTdHJlYW0gPDwgcHROZXcueCAtIHB0T2xkLnggPDwgIiAiIDw8IHB0TmV3LnkgLSBwdE9sZC55Ci0gICAgICAgICAgICAgICAgICAgICAgPDwgIiBUZFxuIjsKLSAgICAgICAgICBwdE9sZCA9IHB0TmV3OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHdvcmQubkZvbnRJbmRleCAhPSBuQ3VyRm9udEluZGV4KSB7Ci0gICAgICAgICAgc0VkaXRTdHJlYW0gPDwgR2V0Rm9udFNldFN0cmluZyhwRWRpdC0+R2V0Rm9udE1hcCgpLCB3b3JkLm5Gb250SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkLmZGb250U2l6ZSk7Ci0gICAgICAgICAgbkN1ckZvbnRJbmRleCA9IHdvcmQubkZvbnRJbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIHNFZGl0U3RyZWFtIDw8IEdldFdvcmRSZW5kZXJTdHJpbmcoR2V0UERGV29yZFN0cmluZygKLSAgICAgICAgICAgIHBFZGl0LT5HZXRGb250TWFwKCksIG5DdXJGb250SW5kZXgsIHdvcmQuV29yZCwgU3ViV29yZCkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChzV29yZHMuR2V0U2l6ZSgpID4gMCkgewotICAgIHNFZGl0U3RyZWFtIDw8IEdldFdvcmRSZW5kZXJTdHJpbmcoc1dvcmRzLk1ha2VTdHJpbmcoKSk7Ci0gICAgc1dvcmRzLkNsZWFyKCk7Ci0gIH0KLQotICBDRlhfQnl0ZVRleHRCdWYgc0FwcFN0cmVhbTsKLSAgaWYgKHNFZGl0U3RyZWFtLkdldFNpemUoKSA+IDApIHsKLSAgICBpbnQzMl90IG5Ib3J6U2NhbGUgPSBwRWRpdC0+R2V0SG9yelNjYWxlKCk7Ci0gICAgaWYgKG5Ib3J6U2NhbGUgIT0gMTAwKSB7Ci0gICAgICBzQXBwU3RyZWFtIDw8IG5Ib3J6U2NhbGUgPDwgIiBUelxuIjsKLSAgICB9Ci0KLSAgICBGWF9GTE9BVCBmQ2hhclNwYWNlID0gcEVkaXQtPkdldENoYXJTcGFjZSgpOwotICAgIGlmICghSXNGbG9hdFplcm8oZkNoYXJTcGFjZSkpIHsKLSAgICAgIHNBcHBTdHJlYW0gPDwgZkNoYXJTcGFjZSA8PCAiIFRjXG4iOwotICAgIH0KLQotICAgIHNBcHBTdHJlYW0gPDwgc0VkaXRTdHJlYW07Ci0gIH0KLQotICByZXR1cm4gc0FwcFN0cmVhbS5NYWtlU3RyaW5nKCk7Ci19Ci0KLS8vIHN0YXRpYwotQ0ZYX0J5dGVTdHJpbmcgQ0ZYX0VkaXQ6OkdldFNlbGVjdEFwcGVhcmFuY2VTdHJlYW0oCi0gICAgQ0ZYX0VkaXQqIHBFZGl0LAotICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0T2Zmc2V0LAotICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UpIHsKLSAgaWYgKCFwUmFuZ2UgfHwgIXBSYW5nZS0+SXNFeGlzdCgpKQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotCi0gIENGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBwRWRpdC0+R2V0SXRlcmF0b3IoKTsKLSAgcEl0ZXJhdG9yLT5TZXRBdChwUmFuZ2UtPkJlZ2luUG9zKTsKLQotICBDRlhfQnl0ZVRleHRCdWYgc1JldDsKLSAgd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkgewotICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwotICAgIGlmIChwbGFjZS5Xb3JkQ21wKHBSYW5nZS0+RW5kUG9zKSA+IDApCi0gICAgICBicmVhazsKLQotICAgIENQVlRfV29yZCB3b3JkOwotICAgIENQVlRfTGluZSBsaW5lOwotICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkgJiYgcEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpKSB7Ci0gICAgICBzUmV0IDw8IHdvcmQucHRXb3JkLnggKyBwdE9mZnNldC54IDw8ICIgIgotICAgICAgICAgICA8PCBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZURlc2NlbnQgPDwgIiAiIDw8IHdvcmQuZldpZHRoIDw8ICIgIgotICAgICAgICAgICA8PCBsaW5lLmZMaW5lQXNjZW50IC0gbGluZS5mTGluZURlc2NlbnQgPDwgIiByZVxuZlxuIjsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gc1JldC5NYWtlU3RyaW5nKCk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDRlhfRWRpdDo6RHJhd0VkaXQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9FZGl0KiBwRWRpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPTE9SUkVGIGNyVGV4dEZpbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRmxvYXRSZWN0JiByY0NsaXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRkZMX0Zvcm1GaWxsZXIqIHBGRkxEYXRhKSB7Ci0gIGNvbnN0IGJvb2wgYkNvbnRpbnVvdXMgPQotICAgICAgcEVkaXQtPkdldENoYXJBcnJheSgpID09IDAgJiYgcEVkaXQtPkdldENoYXJTcGFjZSgpIDw9IDAuMGY7Ci0gIHVpbnQxNl90IFN1YldvcmQgPSBwRWRpdC0+R2V0UGFzc3dvcmRDaGFyKCk7Ci0gIEZYX0ZMT0FUIGZGb250U2l6ZSA9IHBFZGl0LT5HZXRGb250U2l6ZSgpOwotICBDUFZUX1dvcmRSYW5nZSB3clNlbGVjdCA9IHBFZGl0LT5HZXRTZWxlY3RXb3JkUmFuZ2UoKTsKLSAgaW50MzJfdCBuSG9yelNjYWxlID0gcEVkaXQtPkdldEhvcnpTY2FsZSgpOwotCi0gIEZYX0NPTE9SUkVGIGNyQ3VyRmlsbCA9IGNyVGV4dEZpbGw7Ci0gIEZYX0NPTE9SUkVGIGNyT2xkRmlsbCA9IGNyQ3VyRmlsbDsKLQotICBib29sIGJTZWxlY3QgPSBmYWxzZTsKLSAgY29uc3QgRlhfQ09MT1JSRUYgY3JXaGl0ZSA9IEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KTsKLSAgY29uc3QgRlhfQ09MT1JSRUYgY3JTZWxCSyA9IEFyZ2JFbmNvZGUoMjU1LCAwLCA1MSwgMTEzKTsKLQotICBDRlhfQnl0ZVRleHRCdWYgc1RleHRCdWY7Ci0gIGludDMyX3QgbkZvbnRJbmRleCA9IC0xOwotICBDRlhfUG9pbnRGIHB0QlQ7Ci0gIHBEZXZpY2UtPlNhdmVTdGF0ZSgpOwotICBpZiAoIXJjQ2xpcC5Jc0VtcHR5KCkpIHsKLSAgICBDRlhfRmxvYXRSZWN0IHJjVGVtcCA9IHJjQ2xpcDsKLSAgICBwVXNlcjJEZXZpY2UtPlRyYW5zZm9ybVJlY3QocmNUZW1wKTsKLSAgICBwRGV2aWNlLT5TZXRDbGlwX1JlY3QocmNUZW1wLlRvRnhSZWN0KCkpOwotICB9Ci0KLSAgQ0ZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IHBFZGl0LT5HZXRJdGVyYXRvcigpOwotICBpZiAoSVBWVF9Gb250TWFwKiBwRm9udE1hcCA9IHBFZGl0LT5HZXRGb250TWFwKCkpIHsKLSAgICBpZiAocFJhbmdlKQotICAgICAgcEl0ZXJhdG9yLT5TZXRBdChwUmFuZ2UtPkJlZ2luUG9zKTsKLSAgICBlbHNlCi0gICAgICBwSXRlcmF0b3ItPlNldEF0KDApOwotCi0gICAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2U7Ci0gICAgd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkgewotICAgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7Ci0gICAgICBpZiAocFJhbmdlICYmIHBsYWNlLldvcmRDbXAocFJhbmdlLT5FbmRQb3MpID4gMCkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmICh3clNlbGVjdC5Jc0V4aXN0KCkpIHsKLSAgICAgICAgYlNlbGVjdCA9IHBsYWNlLldvcmRDbXAod3JTZWxlY3QuQmVnaW5Qb3MpID4gMCAmJgotICAgICAgICAgICAgICAgICAgcGxhY2UuV29yZENtcCh3clNlbGVjdC5FbmRQb3MpIDw9IDA7Ci0gICAgICAgIGNyQ3VyRmlsbCA9IGJTZWxlY3QgPyBjcldoaXRlIDogY3JUZXh0RmlsbDsKLSAgICAgIH0KLSAgICAgIGlmIChwU3lzdGVtSGFuZGxlciAmJiBwU3lzdGVtSGFuZGxlci0+SXNTZWxlY3Rpb25JbXBsZW1lbnRlZCgpKSB7Ci0gICAgICAgIGNyQ3VyRmlsbCA9IGNyVGV4dEZpbGw7Ci0gICAgICAgIGNyT2xkRmlsbCA9IGNyQ3VyRmlsbDsKLSAgICAgIH0KLSAgICAgIENQVlRfV29yZCB3b3JkOwotICAgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgewotICAgICAgICBpZiAoYlNlbGVjdCkgewotICAgICAgICAgIENQVlRfTGluZSBsaW5lOwotICAgICAgICAgIHBJdGVyYXRvci0+R2V0TGluZShsaW5lKTsKLQotICAgICAgICAgIGlmIChwU3lzdGVtSGFuZGxlciAmJiBwU3lzdGVtSGFuZGxlci0+SXNTZWxlY3Rpb25JbXBsZW1lbnRlZCgpKSB7Ci0gICAgICAgICAgICBDRlhfRmxvYXRSZWN0IHJjKHdvcmQucHRXb3JkLngsIGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lRGVzY2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZUFzY2VudCk7Ci0gICAgICAgICAgICByYy5JbnRlcnNlY3QocmNDbGlwKTsKLSAgICAgICAgICAgIHBTeXN0ZW1IYW5kbGVyLT5PdXRwdXRTZWxlY3RlZFJlY3QocEZGTERhdGEsIHJjKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGhTZWxCSzsKLSAgICAgICAgICAgIHBhdGhTZWxCSy5BcHBlbmRSZWN0KAotICAgICAgICAgICAgICAgIHdvcmQucHRXb3JkLngsIGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lRGVzY2VudCwKLSAgICAgICAgICAgICAgICB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGgsIGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lQXNjZW50KTsKLQotICAgICAgICAgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGhTZWxCSywgcFVzZXIyRGV2aWNlLCBudWxscHRyLCBjclNlbEJLLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX1dJTkRJTkcpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiQ29udGludW91cykgewotICAgICAgICAgIGlmIChwbGFjZS5MaW5lQ21wKG9sZHBsYWNlKSAhPSAwIHx8IHdvcmQubkZvbnRJbmRleCAhPSBuRm9udEluZGV4IHx8Ci0gICAgICAgICAgICAgIGNyT2xkRmlsbCAhPSBjckN1ckZpbGwpIHsKLSAgICAgICAgICAgIGlmIChzVGV4dEJ1Zi5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICAgICAgRHJhd1RleHRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICBwRGV2aWNlLCBDRlhfUG9pbnRGKHB0QlQueCArIHB0T2Zmc2V0LngsIHB0QlQueSArIHB0T2Zmc2V0LnkpLAotICAgICAgICAgICAgICAgICAgcEZvbnRNYXAtPkdldFBERkZvbnQobkZvbnRJbmRleCksIGZGb250U2l6ZSwgcFVzZXIyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgc1RleHRCdWYuTWFrZVN0cmluZygpLCBjck9sZEZpbGwsIG5Ib3J6U2NhbGUpOwotCi0gICAgICAgICAgICAgIHNUZXh0QnVmLkNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuRm9udEluZGV4ID0gd29yZC5uRm9udEluZGV4OwotICAgICAgICAgICAgcHRCVCA9IHdvcmQucHRXb3JkOwotICAgICAgICAgICAgY3JPbGRGaWxsID0gY3JDdXJGaWxsOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHNUZXh0QnVmIDw8IEdldFBERldvcmRTdHJpbmcocEZvbnRNYXAsIHdvcmQubkZvbnRJbmRleCwgd29yZC5Xb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViV29yZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLkFzU3RyaW5nQygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIERyYXdUZXh0U3RyaW5nKAotICAgICAgICAgICAgICBwRGV2aWNlLCBDRlhfUG9pbnRGKHdvcmQucHRXb3JkLnggKyBwdE9mZnNldC54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmQucHRXb3JkLnkgKyBwdE9mZnNldC55KSwKLSAgICAgICAgICAgICAgcEZvbnRNYXAtPkdldFBERkZvbnQod29yZC5uRm9udEluZGV4KSwgZkZvbnRTaXplLCBwVXNlcjJEZXZpY2UsCi0gICAgICAgICAgICAgIEdldFBERldvcmRTdHJpbmcocEZvbnRNYXAsIHdvcmQubkZvbnRJbmRleCwgd29yZC5Xb3JkLCBTdWJXb3JkKSwKLSAgICAgICAgICAgICAgY3JDdXJGaWxsLCBuSG9yelNjYWxlKTsKLSAgICAgICAgfQotICAgICAgICBvbGRwbGFjZSA9IHBsYWNlOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChzVGV4dEJ1Zi5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgIERyYXdUZXh0U3RyaW5nKHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGKHB0QlQueCArIHB0T2Zmc2V0LngsIHB0QlQueSArIHB0T2Zmc2V0LnkpLAotICAgICAgICAgICAgICAgICAgICAgcEZvbnRNYXAtPkdldFBERkZvbnQobkZvbnRJbmRleCksIGZGb250U2l6ZSwgcFVzZXIyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgc1RleHRCdWYuTWFrZVN0cmluZygpLCBjck9sZEZpbGwsIG5Ib3J6U2NhbGUpOwotICAgIH0KLSAgfQotCi0gIHBEZXZpY2UtPlJlc3RvcmVTdGF0ZShmYWxzZSk7Ci19Ci0KLUNGWF9FZGl0OjpDRlhfRWRpdCgpCi0gICAgOiBtX3BWVChuZXcgQ1BERl9WYXJpYWJsZVRleHQpLAotICAgICAgbV9wTm90aWZ5KG51bGxwdHIpLAotICAgICAgbV9wT3ByTm90aWZ5KG51bGxwdHIpLAotICAgICAgbV93cENhcmV0KC0xLCAtMSwgLTEpLAotICAgICAgbV93cE9sZENhcmV0KC0xLCAtMSwgLTEpLAotICAgICAgbV9TZWxTdGF0ZSgpLAotICAgICAgbV9iRW5hYmxlU2Nyb2xsKGZhbHNlKSwKLSAgICAgIG1fVW5kbyhrRWRpdFVuZG9NYXhJdGVtcyksCi0gICAgICBtX25BbGlnbm1lbnQoMCksCi0gICAgICBtX2JOb3RpZnlGbGFnKGZhbHNlKSwKLSAgICAgIG1fYkVuYWJsZU92ZXJmbG93KGZhbHNlKSwKLSAgICAgIG1fYkVuYWJsZVJlZnJlc2godHJ1ZSksCi0gICAgICBtX3JjT2xkQ29udGVudCgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKSwKLSAgICAgIG1fYkVuYWJsZVVuZG8odHJ1ZSksCi0gICAgICBtX2JPcHJOb3RpZnkoZmFsc2UpLAotICAgICAgbV9wR3JvdXBVbmRvSXRlbShudWxscHRyKSB7fQotCi1DRlhfRWRpdDo6fkNGWF9FZGl0KCkgewotICBBU1NFUlQoIW1fcEdyb3VwVW5kb0l0ZW0pOwotfQotCi12b2lkIENGWF9FZGl0OjpJbml0aWFsaXplKCkgewotICBtX3BWVC0+SW5pdGlhbGl6ZSgpOwotICBTZXRDYXJldChtX3BWVC0+R2V0QmVnaW5Xb3JkUGxhY2UoKSk7Ci0gIFNldENhcmV0T3JpZ2luKCk7Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlNldEZvbnRNYXAoSVBWVF9Gb250TWFwKiBwRm9udE1hcCkgewotICBtX3BWVFByb3ZpZGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9FZGl0X1Byb3ZpZGVyPihwRm9udE1hcCk7Ci0gIG1fcFZULT5TZXRQcm92aWRlcihtX3BWVFByb3ZpZGVyLmdldCgpKTsKLX0KLQotdm9pZCBDRlhfRWRpdDo6U2V0Tm90aWZ5KENQV0xfRWRpdEN0cmwqIHBOb3RpZnkpIHsKLSAgbV9wTm90aWZ5ID0gcE5vdGlmeTsKLX0KLQotdm9pZCBDRlhfRWRpdDo6U2V0T3ByTm90aWZ5KENQV0xfRWRpdCogcE9wck5vdGlmeSkgewotICBtX3BPcHJOb3RpZnkgPSBwT3ByTm90aWZ5OwotfQotCi1DRlhfRWRpdF9JdGVyYXRvciogQ0ZYX0VkaXQ6OkdldEl0ZXJhdG9yKCkgewotICBpZiAoIW1fcEl0ZXJhdG9yKSB7Ci0gICAgbV9wSXRlcmF0b3IgPQotICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0VkaXRfSXRlcmF0b3I+KHRoaXMsIG1fcFZULT5HZXRJdGVyYXRvcigpKTsKLSAgfQotICByZXR1cm4gbV9wSXRlcmF0b3IuZ2V0KCk7Ci19Ci0KLUlQVlRfRm9udE1hcCogQ0ZYX0VkaXQ6OkdldEZvbnRNYXAoKSB7Ci0gIHJldHVybiBtX3BWVFByb3ZpZGVyID8gbV9wVlRQcm92aWRlci0+R2V0Rm9udE1hcCgpIDogbnVsbHB0cjsKLX0KLQotdm9pZCBDRlhfRWRpdDo6U2V0UGxhdGVSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIHsKLSAgbV9wVlQtPlNldFBsYXRlUmVjdChyZWN0KTsKLSAgbV9wdFNjcm9sbFBvcyA9IENGWF9Qb2ludEYocmVjdC5sZWZ0LCByZWN0LnRvcCk7Ci0gIFBhaW50KCk7Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlNldEFsaWdubWVudEgoaW50MzJfdCBuRm9ybWF0LCBib29sIGJQYWludCkgewotICBtX3BWVC0+U2V0QWxpZ25tZW50KG5Gb3JtYXQpOwotICBpZiAoYlBhaW50KQotICAgIFBhaW50KCk7Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlNldEFsaWdubWVudFYoaW50MzJfdCBuRm9ybWF0LCBib29sIGJQYWludCkgewotICBtX25BbGlnbm1lbnQgPSBuRm9ybWF0OwotICBpZiAoYlBhaW50KQotICAgIFBhaW50KCk7Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlNldFBhc3N3b3JkQ2hhcih1aW50MTZfdCB3U3ViV29yZCwgYm9vbCBiUGFpbnQpIHsKLSAgbV9wVlQtPlNldFBhc3N3b3JkQ2hhcih3U3ViV29yZCk7Ci0gIGlmIChiUGFpbnQpCi0gICAgUGFpbnQoKTsKLX0KLQotdm9pZCBDRlhfRWRpdDo6U2V0TGltaXRDaGFyKGludDMyX3QgbkxpbWl0Q2hhcikgewotICBtX3BWVC0+U2V0TGltaXRDaGFyKG5MaW1pdENoYXIpOwotICBQYWludCgpOwotfQotCi12b2lkIENGWF9FZGl0OjpTZXRDaGFyQXJyYXkoaW50MzJfdCBuQ2hhckFycmF5KSB7Ci0gIG1fcFZULT5TZXRDaGFyQXJyYXkobkNoYXJBcnJheSk7Ci0gIFBhaW50KCk7Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKSB7Ci0gIG1fcFZULT5TZXRDaGFyU3BhY2UoZkNoYXJTcGFjZSk7Ci0gIFBhaW50KCk7Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlNldE11bHRpTGluZShib29sIGJNdWx0aUxpbmUsIGJvb2wgYlBhaW50KSB7Ci0gIG1fcFZULT5TZXRNdWx0aUxpbmUoYk11bHRpTGluZSk7Ci0gIGlmIChiUGFpbnQpCi0gICAgUGFpbnQoKTsKLX0KLQotdm9pZCBDRlhfRWRpdDo6U2V0QXV0b1JldHVybihib29sIGJBdXRvLCBib29sIGJQYWludCkgewotICBtX3BWVC0+U2V0QXV0b1JldHVybihiQXV0byk7Ci0gIGlmIChiUGFpbnQpCi0gICAgUGFpbnQoKTsKLX0KLQotdm9pZCBDRlhfRWRpdDo6U2V0QXV0b0ZvbnRTaXplKGJvb2wgYkF1dG8sIGJvb2wgYlBhaW50KSB7Ci0gIG1fcFZULT5TZXRBdXRvRm9udFNpemUoYkF1dG8pOwotICBpZiAoYlBhaW50KQotICAgIFBhaW50KCk7Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgewotICBtX3BWVC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKLSAgUGFpbnQoKTsKLX0KLQotdm9pZCBDRlhfRWRpdDo6U2V0QXV0b1Njcm9sbChib29sIGJBdXRvLCBib29sIGJQYWludCkgewotICBtX2JFbmFibGVTY3JvbGwgPSBiQXV0bzsKLSAgaWYgKGJQYWludCkKLSAgICBQYWludCgpOwotfQotCi12b2lkIENGWF9FZGl0OjpTZXRUZXh0T3ZlcmZsb3coYm9vbCBiQWxsb3dlZCwgYm9vbCBiUGFpbnQpIHsKLSAgbV9iRW5hYmxlT3ZlcmZsb3cgPSBiQWxsb3dlZDsKLSAgaWYgKGJQYWludCkKLSAgICBQYWludCgpOwotfQotCi12b2lkIENGWF9FZGl0OjpTZXRTZWwoaW50MzJfdCBuU3RhcnRDaGFyLCBpbnQzMl90IG5FbmRDaGFyKSB7Ci0gIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7Ci0gICAgaWYgKG5TdGFydENoYXIgPT0gMCAmJiBuRW5kQ2hhciA8IDApIHsKLSAgICAgIFNlbGVjdEFsbCgpOwotICAgIH0gZWxzZSBpZiAoblN0YXJ0Q2hhciA8IDApIHsKLSAgICAgIFNlbGVjdE5vbmUoKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKG5TdGFydENoYXIgPCBuRW5kQ2hhcikgewotICAgICAgICBTZXRTZWwobV9wVlQtPldvcmRJbmRleFRvV29yZFBsYWNlKG5TdGFydENoYXIpLAotICAgICAgICAgICAgICAgbV9wVlQtPldvcmRJbmRleFRvV29yZFBsYWNlKG5FbmRDaGFyKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBTZXRTZWwobV9wVlQtPldvcmRJbmRleFRvV29yZFBsYWNlKG5FbmRDaGFyKSwKLSAgICAgICAgICAgICAgIG1fcFZULT5Xb3JkSW5kZXhUb1dvcmRQbGFjZShuU3RhcnRDaGFyKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlNldFNlbChjb25zdCBDUFZUX1dvcmRQbGFjZSYgYmVnaW4sIGNvbnN0IENQVlRfV29yZFBsYWNlJiBlbmQpIHsKLSAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKLSAgICBTZWxlY3ROb25lKCk7Ci0KLSAgICBtX1NlbFN0YXRlLlNldChiZWdpbiwgZW5kKTsKLQotICAgIFNldENhcmV0KG1fU2VsU3RhdGUuRW5kUG9zKTsKLQotICAgIGlmIChtX1NlbFN0YXRlLklzRXhpc3QoKSkgewotICAgICAgU2Nyb2xsVG9DYXJldCgpOwotICAgICAgUmVmcmVzaCgpOwotICAgICAgU2V0Q2FyZXRJbmZvKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKLSAgICAgIFNldENhcmV0SW5mbygpOwotICAgIH0KLSAgfQotfQotCi12b2lkIENGWF9FZGl0OjpHZXRTZWwoaW50MzJfdCYgblN0YXJ0Q2hhciwgaW50MzJfdCYgbkVuZENoYXIpIGNvbnN0IHsKLSAgblN0YXJ0Q2hhciA9IC0xOwotICBuRW5kQ2hhciA9IC0xOwotCi0gIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7Ci0gICAgaWYgKG1fU2VsU3RhdGUuSXNFeGlzdCgpKSB7Ci0gICAgICBpZiAobV9TZWxTdGF0ZS5CZWdpblBvcy5Xb3JkQ21wKG1fU2VsU3RhdGUuRW5kUG9zKSA8IDApIHsKLSAgICAgICAgblN0YXJ0Q2hhciA9IG1fcFZULT5Xb3JkUGxhY2VUb1dvcmRJbmRleChtX1NlbFN0YXRlLkJlZ2luUG9zKTsKLSAgICAgICAgbkVuZENoYXIgPSBtX3BWVC0+V29yZFBsYWNlVG9Xb3JkSW5kZXgobV9TZWxTdGF0ZS5FbmRQb3MpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgblN0YXJ0Q2hhciA9IG1fcFZULT5Xb3JkUGxhY2VUb1dvcmRJbmRleChtX1NlbFN0YXRlLkVuZFBvcyk7Ci0gICAgICAgIG5FbmRDaGFyID0gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fU2VsU3RhdGUuQmVnaW5Qb3MpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBuU3RhcnRDaGFyID0gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fd3BDYXJldCk7Ci0gICAgICBuRW5kQ2hhciA9IG1fcFZULT5Xb3JkUGxhY2VUb1dvcmRJbmRleChtX3dwQ2FyZXQpOwotICAgIH0KLSAgfQotfQotCi1pbnQzMl90IENGWF9FZGl0OjpHZXRDYXJldCgpIGNvbnN0IHsKLSAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0gICAgcmV0dXJuIG1fcFZULT5Xb3JkUGxhY2VUb1dvcmRJbmRleChtX3dwQ2FyZXQpOwotCi0gIHJldHVybiAtMTsKLX0KLQotQ1BWVF9Xb3JkUGxhY2UgQ0ZYX0VkaXQ6OkdldENhcmV0V29yZFBsYWNlKCkgY29uc3QgewotICByZXR1cm4gbV93cENhcmV0OwotfQotCi1DRlhfV2lkZVN0cmluZyBDRlhfRWRpdDo6R2V0VGV4dCgpIGNvbnN0IHsKLSAgQ0ZYX1dpZGVTdHJpbmcgc3dSZXQ7Ci0KLSAgaWYgKCFtX3BWVC0+SXNWYWxpZCgpKQotICAgIHJldHVybiBzd1JldDsKLQotICBDUERGX1ZhcmlhYmxlVGV4dDo6SXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpOwotICBwSXRlcmF0b3ItPlNldEF0KDApOwotCi0gIENQVlRfV29yZCB3b3JkaW5mbzsKLSAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7Ci0gIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKLSAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0QXQoKTsKLQotICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pKQotICAgICAgc3dSZXQgKz0gd29yZGluZm8uV29yZDsKLQotICAgIGlmIChvbGRwbGFjZS5TZWNDbXAocGxhY2UpICE9IDApCi0gICAgICBzd1JldCArPSBMIlxyXG4iOwotCi0gICAgb2xkcGxhY2UgPSBwbGFjZTsKLSAgfQotCi0gIHJldHVybiBzd1JldDsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ0ZYX0VkaXQ6OkdldFJhbmdlVGV4dChjb25zdCBDUFZUX1dvcmRSYW5nZSYgcmFuZ2UpIGNvbnN0IHsKLSAgQ0ZYX1dpZGVTdHJpbmcgc3dSZXQ7Ci0KLSAgaWYgKCFtX3BWVC0+SXNWYWxpZCgpKQotICAgIHJldHVybiBzd1JldDsKLQotICBDUERGX1ZhcmlhYmxlVGV4dDo6SXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpOwotICBDUFZUX1dvcmRSYW5nZSB3clRlbXAgPSByYW5nZTsKLSAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZSh3clRlbXAuQmVnaW5Qb3MpOwotICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKHdyVGVtcC5FbmRQb3MpOwotICBwSXRlcmF0b3ItPlNldEF0KHdyVGVtcC5CZWdpblBvcyk7Ci0KLSAgQ1BWVF9Xb3JkIHdvcmRpbmZvOwotICBDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZSA9IHdyVGVtcC5CZWdpblBvczsKLSAgd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkgewotICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwotICAgIGlmIChwbGFjZS5Xb3JkQ21wKHdyVGVtcC5FbmRQb3MpID4gMCkKLSAgICAgIGJyZWFrOwotCi0gICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkaW5mbykpCi0gICAgICBzd1JldCArPSB3b3JkaW5mby5Xb3JkOwotCi0gICAgaWYgKG9sZHBsYWNlLlNlY0NtcChwbGFjZSkgIT0gMCkKLSAgICAgIHN3UmV0ICs9IEwiXHJcbiI7Ci0KLSAgICBvbGRwbGFjZSA9IHBsYWNlOwotICB9Ci0KLSAgcmV0dXJuIHN3UmV0OwotfQotCi1DRlhfV2lkZVN0cmluZyBDRlhfRWRpdDo6R2V0U2VsVGV4dCgpIGNvbnN0IHsKLSAgcmV0dXJuIEdldFJhbmdlVGV4dChtX1NlbFN0YXRlLkNvbnZlcnRUb1dvcmRSYW5nZSgpKTsKLX0KLQotaW50MzJfdCBDRlhfRWRpdDo6R2V0VG90YWxXb3JkcygpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcFZULT5HZXRUb3RhbFdvcmRzKCk7Ci19Ci0KLWludDMyX3QgQ0ZYX0VkaXQ6OkdldFRvdGFsTGluZXMoKSBjb25zdCB7Ci0gIGludDMyX3QgbkxpbmVzID0gMTsKLQotICBDUERGX1ZhcmlhYmxlVGV4dDo6SXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpOwotICBwSXRlcmF0b3ItPlNldEF0KDApOwotICB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0TGluZSgpKQotICAgICsrbkxpbmVzOwotCi0gIHJldHVybiBuTGluZXM7Ci19Ci0KLUNQVlRfV29yZFJhbmdlIENGWF9FZGl0OjpHZXRTZWxlY3RXb3JkUmFuZ2UoKSBjb25zdCB7Ci0gIHJldHVybiBtX1NlbFN0YXRlLkNvbnZlcnRUb1dvcmRSYW5nZSgpOwotfQotCi12b2lkIENGWF9FZGl0OjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGV4dCkgewotICBFbXB0eSgpOwotICBEb0luc2VydFRleHQoQ1BWVF9Xb3JkUGxhY2UoMCwgMCwgLTEpLCBzVGV4dCwgRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCk7Ci0gIFBhaW50KCk7Ci19Ci0KLWJvb2wgQ0ZYX0VkaXQ6Okluc2VydFdvcmQodWludDE2X3Qgd29yZCwgaW50MzJfdCBjaGFyc2V0KSB7Ci0gIHJldHVybiBJbnNlcnRXb3JkKHdvcmQsIGNoYXJzZXQsIG51bGxwdHIsIHRydWUsIHRydWUpOwotfQotCi1ib29sIENGWF9FZGl0OjpJbnNlcnRSZXR1cm4oKSB7Ci0gIHJldHVybiBJbnNlcnRSZXR1cm4obnVsbHB0ciwgbnVsbHB0ciwgdHJ1ZSwgdHJ1ZSk7Ci19Ci0KLWJvb2wgQ0ZYX0VkaXQ6OkJhY2tzcGFjZSgpIHsKLSAgcmV0dXJuIEJhY2tzcGFjZSh0cnVlLCB0cnVlKTsKLX0KLQotYm9vbCBDRlhfRWRpdDo6RGVsZXRlKCkgewotICByZXR1cm4gRGVsZXRlKHRydWUsIHRydWUpOwotfQotCi1ib29sIENGWF9FZGl0OjpDbGVhcigpIHsKLSAgcmV0dXJuIENsZWFyKHRydWUsIHRydWUpOwotfQotCi1ib29sIENGWF9FZGl0OjpJbnNlcnRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGV4dCwgaW50MzJfdCBjaGFyc2V0KSB7Ci0gIHJldHVybiBJbnNlcnRUZXh0KHNUZXh0LCBjaGFyc2V0LCB0cnVlLCB0cnVlKTsKLX0KLQotRlhfRkxPQVQgQ0ZYX0VkaXQ6OkdldEZvbnRTaXplKCkgY29uc3QgewotICByZXR1cm4gbV9wVlQtPkdldEZvbnRTaXplKCk7Ci19Ci0KLXVpbnQxNl90IENGWF9FZGl0OjpHZXRQYXNzd29yZENoYXIoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BWVC0+R2V0UGFzc3dvcmRDaGFyKCk7Ci19Ci0KLWludDMyX3QgQ0ZYX0VkaXQ6OkdldENoYXJBcnJheSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcFZULT5HZXRDaGFyQXJyYXkoKTsKLX0KLQotQ0ZYX0Zsb2F0UmVjdCBDRlhfRWRpdDo6R2V0Q29udGVudFJlY3QoKSBjb25zdCB7Ci0gIHJldHVybiBWVFRvRWRpdChtX3BWVC0+R2V0Q29udGVudFJlY3QoKSk7Ci19Ci0KLWludDMyX3QgQ0ZYX0VkaXQ6OkdldEhvcnpTY2FsZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcFZULT5HZXRIb3J6U2NhbGUoKTsKLX0KLQotRlhfRkxPQVQgQ0ZYX0VkaXQ6OkdldENoYXJTcGFjZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcFZULT5HZXRDaGFyU3BhY2UoKTsKLX0KLQotQ1BWVF9Xb3JkUmFuZ2UgQ0ZYX0VkaXQ6OkdldFdob2xlV29yZFJhbmdlKCkgY29uc3QgewotICBpZiAobV9wVlQtPklzVmFsaWQoKSkKLSAgICByZXR1cm4gQ1BWVF9Xb3JkUmFuZ2UobV9wVlQtPkdldEJlZ2luV29yZFBsYWNlKCksIG1fcFZULT5HZXRFbmRXb3JkUGxhY2UoKSk7Ci0KLSAgcmV0dXJuIENQVlRfV29yZFJhbmdlKCk7Ci19Ci0KLUNQVlRfV29yZFJhbmdlIENGWF9FZGl0OjpHZXRWaXNpYmxlV29yZFJhbmdlKCkgY29uc3QgewotICBpZiAobV9iRW5hYmxlT3ZlcmZsb3cpCi0gICAgcmV0dXJuIEdldFdob2xlV29yZFJhbmdlKCk7Ci0KLSAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKLSAgICBDRlhfRmxvYXRSZWN0IHJjUGxhdGUgPSBtX3BWVC0+R2V0UGxhdGVSZWN0KCk7Ci0KLSAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZTEgPQotICAgICAgICBtX3BWVC0+U2VhcmNoV29yZFBsYWNlKEVkaXRUb1ZUKENGWF9Qb2ludEYocmNQbGF0ZS5sZWZ0LCByY1BsYXRlLnRvcCkpKTsKLSAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZTIgPSBtX3BWVC0+U2VhcmNoV29yZFBsYWNlKAotICAgICAgICBFZGl0VG9WVChDRlhfUG9pbnRGKHJjUGxhdGUucmlnaHQsIHJjUGxhdGUuYm90dG9tKSkpOwotCi0gICAgcmV0dXJuIENQVlRfV29yZFJhbmdlKHBsYWNlMSwgcGxhY2UyKTsKLSAgfQotCi0gIHJldHVybiBDUFZUX1dvcmRSYW5nZSgpOwotfQotCi1DUFZUX1dvcmRQbGFjZSBDRlhfRWRpdDo6U2VhcmNoV29yZFBsYWNlKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBjb25zdCB7Ci0gIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7Ci0gICAgcmV0dXJuIG1fcFZULT5TZWFyY2hXb3JkUGxhY2UoRWRpdFRvVlQocG9pbnQpKTsKLSAgfQotCi0gIHJldHVybiBDUFZUX1dvcmRQbGFjZSgpOwotfQotCi12b2lkIENGWF9FZGl0OjpQYWludCgpIHsKLSAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKLSAgICBSZWFycmFuZ2VBbGwoKTsKLSAgICBTY3JvbGxUb0NhcmV0KCk7Ci0gICAgUmVmcmVzaCgpOwotICAgIFNldENhcmV0T3JpZ2luKCk7Ci0gICAgU2V0Q2FyZXRJbmZvKCk7Ci0gIH0KLX0KLQotdm9pZCBDRlhfRWRpdDo6UmVhcnJhbmdlQWxsKCkgewotICBpZiAobV9wVlQtPklzVmFsaWQoKSkgewotICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2UobV93cENhcmV0KTsKLSAgICBtX3BWVC0+UmVhcnJhbmdlQWxsKCk7Ci0gICAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOwotICAgIFNldFNjcm9sbEluZm8oKTsKLSAgICBTZXRDb250ZW50Q2hhbmdlZCgpOwotICB9Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlJlYXJyYW5nZVBhcnQoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHJhbmdlKSB7Ci0gIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7Ci0gICAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOwotICAgIG1fcFZULT5SZWFycmFuZ2VQYXJ0KHJhbmdlKTsKLSAgICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKG1fd3BDYXJldCk7Ci0gICAgU2V0U2Nyb2xsSW5mbygpOwotICAgIFNldENvbnRlbnRDaGFuZ2VkKCk7Ci0gIH0KLX0KLQotdm9pZCBDRlhfRWRpdDo6U2V0Q29udGVudENoYW5nZWQoKSB7Ci0gIGlmIChtX3BOb3RpZnkpIHsKLSAgICBDRlhfRmxvYXRSZWN0IHJjQ29udGVudCA9IG1fcFZULT5HZXRDb250ZW50UmVjdCgpOwotICAgIGlmIChyY0NvbnRlbnQuV2lkdGgoKSAhPSBtX3JjT2xkQ29udGVudC5XaWR0aCgpIHx8Ci0gICAgICAgIHJjQ29udGVudC5IZWlnaHQoKSAhPSBtX3JjT2xkQ29udGVudC5IZWlnaHQoKSkgewotICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKSB7Ci0gICAgICAgIG1fYk5vdGlmeUZsYWcgPSB0cnVlOwotICAgICAgICBtX3BOb3RpZnktPklPbkNvbnRlbnRDaGFuZ2UocmNDb250ZW50KTsKLSAgICAgICAgbV9iTm90aWZ5RmxhZyA9IGZhbHNlOwotICAgICAgfQotICAgICAgbV9yY09sZENvbnRlbnQgPSByY0NvbnRlbnQ7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlNlbGVjdEFsbCgpIHsKLSAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKLSAgICBtX1NlbFN0YXRlID0gQ0ZYX0VkaXRfU2VsZWN0KEdldFdob2xlV29yZFJhbmdlKCkpOwotICAgIFNldENhcmV0KG1fU2VsU3RhdGUuRW5kUG9zKTsKLQotICAgIFNjcm9sbFRvQ2FyZXQoKTsKLSAgICBSZWZyZXNoKCk7Ci0gICAgU2V0Q2FyZXRJbmZvKCk7Ci0gIH0KLX0KLQotdm9pZCBDRlhfRWRpdDo6U2VsZWN0Tm9uZSgpIHsKLSAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKLSAgICBpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpIHsKLSAgICAgIG1fU2VsU3RhdGUuRGVmYXVsdCgpOwotICAgICAgUmVmcmVzaCgpOwotICAgIH0KLSAgfQotfQotCi1ib29sIENGWF9FZGl0OjpJc1NlbGVjdGVkKCkgY29uc3QgewotICByZXR1cm4gbV9TZWxTdGF0ZS5Jc0V4aXN0KCk7Ci19Ci0KLUNGWF9Qb2ludEYgQ0ZYX0VkaXQ6OlZUVG9FZGl0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBjb25zdCB7Ci0gIENGWF9GbG9hdFJlY3QgcmNDb250ZW50ID0gbV9wVlQtPkdldENvbnRlbnRSZWN0KCk7Ci0gIENGWF9GbG9hdFJlY3QgcmNQbGF0ZSA9IG1fcFZULT5HZXRQbGF0ZVJlY3QoKTsKLQotICBGWF9GTE9BVCBmUGFkZGluZyA9IDAuMGY7Ci0KLSAgc3dpdGNoIChtX25BbGlnbm1lbnQpIHsKLSAgICBjYXNlIDA6Ci0gICAgICBmUGFkZGluZyA9IDAuMGY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICBmUGFkZGluZyA9IChyY1BsYXRlLkhlaWdodCgpIC0gcmNDb250ZW50LkhlaWdodCgpKSAqIDAuNWY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBmUGFkZGluZyA9IHJjUGxhdGUuSGVpZ2h0KCkgLSByY0NvbnRlbnQuSGVpZ2h0KCk7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBDRlhfUG9pbnRGKHBvaW50LnggLSAobV9wdFNjcm9sbFBvcy54IC0gcmNQbGF0ZS5sZWZ0KSwKLSAgICAgICAgICAgICAgICAgICAgcG9pbnQueSAtIChtX3B0U2Nyb2xsUG9zLnkgKyBmUGFkZGluZyAtIHJjUGxhdGUudG9wKSk7Ci19Ci0KLUNGWF9Qb2ludEYgQ0ZYX0VkaXQ6OkVkaXRUb1ZUKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBjb25zdCB7Ci0gIENGWF9GbG9hdFJlY3QgcmNDb250ZW50ID0gbV9wVlQtPkdldENvbnRlbnRSZWN0KCk7Ci0gIENGWF9GbG9hdFJlY3QgcmNQbGF0ZSA9IG1fcFZULT5HZXRQbGF0ZVJlY3QoKTsKLQotICBGWF9GTE9BVCBmUGFkZGluZyA9IDAuMGY7Ci0KLSAgc3dpdGNoIChtX25BbGlnbm1lbnQpIHsKLSAgICBjYXNlIDA6Ci0gICAgICBmUGFkZGluZyA9IDAuMGY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICBmUGFkZGluZyA9IChyY1BsYXRlLkhlaWdodCgpIC0gcmNDb250ZW50LkhlaWdodCgpKSAqIDAuNWY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBmUGFkZGluZyA9IHJjUGxhdGUuSGVpZ2h0KCkgLSByY0NvbnRlbnQuSGVpZ2h0KCk7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBDRlhfUG9pbnRGKHBvaW50LnggKyAobV9wdFNjcm9sbFBvcy54IC0gcmNQbGF0ZS5sZWZ0KSwKLSAgICAgICAgICAgICAgICAgICAgcG9pbnQueSArIChtX3B0U2Nyb2xsUG9zLnkgKyBmUGFkZGluZyAtIHJjUGxhdGUudG9wKSk7Ci19Ci0KLUNGWF9GbG9hdFJlY3QgQ0ZYX0VkaXQ6OlZUVG9FZGl0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0IHsKLSAgQ0ZYX1BvaW50RiBwdExlZnRCb3R0b20gPSBWVFRvRWRpdChDRlhfUG9pbnRGKHJlY3QubGVmdCwgcmVjdC5ib3R0b20pKTsKLSAgQ0ZYX1BvaW50RiBwdFJpZ2h0VG9wID0gVlRUb0VkaXQoQ0ZYX1BvaW50RihyZWN0LnJpZ2h0LCByZWN0LnRvcCkpOwotCi0gIHJldHVybiBDRlhfRmxvYXRSZWN0KHB0TGVmdEJvdHRvbS54LCBwdExlZnRCb3R0b20ueSwgcHRSaWdodFRvcC54LAotICAgICAgICAgICAgICAgICAgICAgICBwdFJpZ2h0VG9wLnkpOwotfQotCi12b2lkIENGWF9FZGl0OjpTZXRTY3JvbGxJbmZvKCkgewotICBpZiAobV9wTm90aWZ5KSB7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByY1BsYXRlID0gbV9wVlQtPkdldFBsYXRlUmVjdCgpOwotICAgIENGWF9GbG9hdFJlY3QgcmNDb250ZW50ID0gbV9wVlQtPkdldENvbnRlbnRSZWN0KCk7Ci0KLSAgICBpZiAoIW1fYk5vdGlmeUZsYWcpIHsKLSAgICAgIG1fYk5vdGlmeUZsYWcgPSB0cnVlOwotICAgICAgbV9wTm90aWZ5LT5JT25TZXRTY3JvbGxJbmZvWShyY1BsYXRlLmJvdHRvbSwgcmNQbGF0ZS50b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ29udGVudC5ib3R0b20sIHJjQ29udGVudC50b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjUGxhdGUuSGVpZ2h0KCkgLyAzLCByY1BsYXRlLkhlaWdodCgpKTsKLSAgICAgIG1fYk5vdGlmeUZsYWcgPSBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDRlhfRWRpdDo6U2V0U2Nyb2xsUG9zWChGWF9GTE9BVCBmeCkgewotICBpZiAoIW1fYkVuYWJsZVNjcm9sbCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKLSAgICBpZiAoIUlzRmxvYXRFcXVhbChtX3B0U2Nyb2xsUG9zLngsIGZ4KSkgewotICAgICAgbV9wdFNjcm9sbFBvcy54ID0gZng7Ci0gICAgICBSZWZyZXNoKCk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpIHsKLSAgaWYgKCFtX2JFbmFibGVTY3JvbGwpCi0gICAgcmV0dXJuOwotCi0gIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7Ci0gICAgaWYgKCFJc0Zsb2F0RXF1YWwobV9wdFNjcm9sbFBvcy55LCBmeSkpIHsKLSAgICAgIG1fcHRTY3JvbGxQb3MueSA9IGZ5OwotICAgICAgUmVmcmVzaCgpOwotCi0gICAgICBpZiAobV9wTm90aWZ5KSB7Ci0gICAgICAgIGlmICghbV9iTm90aWZ5RmxhZykgewotICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSB0cnVlOwotICAgICAgICAgIG1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsUG9zWShmeSk7Ci0gICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlNldFNjcm9sbFBvcyhjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewotICBTZXRTY3JvbGxQb3NYKHBvaW50LngpOwotICBTZXRTY3JvbGxQb3NZKHBvaW50LnkpOwotICBTZXRTY3JvbGxMaW1pdCgpOwotICBTZXRDYXJldEluZm8oKTsKLX0KLQotQ0ZYX1BvaW50RiBDRlhfRWRpdDo6R2V0U2Nyb2xsUG9zKCkgY29uc3QgewotICByZXR1cm4gbV9wdFNjcm9sbFBvczsKLX0KLQotdm9pZCBDRlhfRWRpdDo6U2V0U2Nyb2xsTGltaXQoKSB7Ci0gIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByY0NvbnRlbnQgPSBtX3BWVC0+R2V0Q29udGVudFJlY3QoKTsKLSAgICBDRlhfRmxvYXRSZWN0IHJjUGxhdGUgPSBtX3BWVC0+R2V0UGxhdGVSZWN0KCk7Ci0KLSAgICBpZiAocmNQbGF0ZS5XaWR0aCgpID4gcmNDb250ZW50LldpZHRoKCkpIHsKLSAgICAgIFNldFNjcm9sbFBvc1gocmNQbGF0ZS5sZWZ0KTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKElzRmxvYXRTbWFsbGVyKG1fcHRTY3JvbGxQb3MueCwgcmNDb250ZW50LmxlZnQpKSB7Ci0gICAgICAgIFNldFNjcm9sbFBvc1gocmNDb250ZW50LmxlZnQpOwotICAgICAgfSBlbHNlIGlmIChJc0Zsb2F0QmlnZ2VyKG1fcHRTY3JvbGxQb3MueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NvbnRlbnQucmlnaHQgLSByY1BsYXRlLldpZHRoKCkpKSB7Ci0gICAgICAgIFNldFNjcm9sbFBvc1gocmNDb250ZW50LnJpZ2h0IC0gcmNQbGF0ZS5XaWR0aCgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmNQbGF0ZS5IZWlnaHQoKSA+IHJjQ29udGVudC5IZWlnaHQoKSkgewotICAgICAgU2V0U2Nyb2xsUG9zWShyY1BsYXRlLnRvcCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChJc0Zsb2F0U21hbGxlcihtX3B0U2Nyb2xsUG9zLnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmNDb250ZW50LmJvdHRvbSArIHJjUGxhdGUuSGVpZ2h0KCkpKSB7Ci0gICAgICAgIFNldFNjcm9sbFBvc1kocmNDb250ZW50LmJvdHRvbSArIHJjUGxhdGUuSGVpZ2h0KCkpOwotICAgICAgfSBlbHNlIGlmIChJc0Zsb2F0QmlnZ2VyKG1fcHRTY3JvbGxQb3MueSwgcmNDb250ZW50LnRvcCkpIHsKLSAgICAgICAgU2V0U2Nyb2xsUG9zWShyY0NvbnRlbnQudG9wKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDRlhfRWRpdDo6U2Nyb2xsVG9DYXJldCgpIHsKLSAgU2V0U2Nyb2xsTGltaXQoKTsKLQotICBpZiAoIW1fcFZULT5Jc1ZhbGlkKCkpCi0gICAgcmV0dXJuOwotCi0gIENQREZfVmFyaWFibGVUZXh0OjpJdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCk7Ci0gIHBJdGVyYXRvci0+U2V0QXQobV93cENhcmV0KTsKLQotICBDRlhfUG9pbnRGIHB0SGVhZDsKLSAgQ0ZYX1BvaW50RiBwdEZvb3Q7Ci0gIENQVlRfV29yZCB3b3JkOwotICBDUFZUX0xpbmUgbGluZTsKLSAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgewotICAgIHB0SGVhZC54ID0gd29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoOwotICAgIHB0SGVhZC55ID0gd29yZC5wdFdvcmQueSArIHdvcmQuZkFzY2VudDsKLSAgICBwdEZvb3QueCA9IHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aDsKLSAgICBwdEZvb3QueSA9IHdvcmQucHRXb3JkLnkgKyB3b3JkLmZEZXNjZW50OwotICB9IGVsc2UgaWYgKHBJdGVyYXRvci0+R2V0TGluZShsaW5lKSkgewotICAgIHB0SGVhZC54ID0gbGluZS5wdExpbmUueDsKLSAgICBwdEhlYWQueSA9IGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lQXNjZW50OwotICAgIHB0Rm9vdC54ID0gbGluZS5wdExpbmUueDsKLSAgICBwdEZvb3QueSA9IGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lRGVzY2VudDsKLSAgfQotCi0gIENGWF9Qb2ludEYgcHRIZWFkRWRpdCA9IFZUVG9FZGl0KHB0SGVhZCk7Ci0gIENGWF9Qb2ludEYgcHRGb290RWRpdCA9IFZUVG9FZGl0KHB0Rm9vdCk7Ci0gIENGWF9GbG9hdFJlY3QgcmNQbGF0ZSA9IG1fcFZULT5HZXRQbGF0ZVJlY3QoKTsKLSAgaWYgKCFJc0Zsb2F0RXF1YWwocmNQbGF0ZS5sZWZ0LCByY1BsYXRlLnJpZ2h0KSkgewotICAgIGlmIChJc0Zsb2F0U21hbGxlcihwdEhlYWRFZGl0LngsIHJjUGxhdGUubGVmdCkgfHwKLSAgICAgICAgSXNGbG9hdEVxdWFsKHB0SGVhZEVkaXQueCwgcmNQbGF0ZS5sZWZ0KSkgewotICAgICAgU2V0U2Nyb2xsUG9zWChwdEhlYWQueCk7Ci0gICAgfSBlbHNlIGlmIChJc0Zsb2F0QmlnZ2VyKHB0SGVhZEVkaXQueCwgcmNQbGF0ZS5yaWdodCkpIHsKLSAgICAgIFNldFNjcm9sbFBvc1gocHRIZWFkLnggLSByY1BsYXRlLldpZHRoKCkpOwotICAgIH0KLSAgfQotCi0gIGlmICghSXNGbG9hdEVxdWFsKHJjUGxhdGUudG9wLCByY1BsYXRlLmJvdHRvbSkpIHsKLSAgICBpZiAoSXNGbG9hdFNtYWxsZXIocHRGb290RWRpdC55LCByY1BsYXRlLmJvdHRvbSkgfHwKLSAgICAgICAgSXNGbG9hdEVxdWFsKHB0Rm9vdEVkaXQueSwgcmNQbGF0ZS5ib3R0b20pKSB7Ci0gICAgICBpZiAoSXNGbG9hdFNtYWxsZXIocHRIZWFkRWRpdC55LCByY1BsYXRlLnRvcCkpIHsKLSAgICAgICAgU2V0U2Nyb2xsUG9zWShwdEZvb3QueSArIHJjUGxhdGUuSGVpZ2h0KCkpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoSXNGbG9hdEJpZ2dlcihwdEhlYWRFZGl0LnksIHJjUGxhdGUudG9wKSkgewotICAgICAgaWYgKElzRmxvYXRCaWdnZXIocHRGb290RWRpdC55LCByY1BsYXRlLmJvdHRvbSkpIHsKLSAgICAgICAgU2V0U2Nyb2xsUG9zWShwdEhlYWQueSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlJlZnJlc2goKSB7Ci0gIGlmIChtX2JFbmFibGVSZWZyZXNoICYmIG1fcFZULT5Jc1ZhbGlkKCkpIHsKLSAgICBtX1JlZnJlc2guQmVnaW5SZWZyZXNoKCk7Ci0gICAgUmVmcmVzaFB1c2hMaW5lUmVjdHMoR2V0VmlzaWJsZVdvcmRSYW5nZSgpKTsKLQotICAgIG1fUmVmcmVzaC5Ob0FuYWx5c2UoKTsKLSAgICBtX3B0UmVmcmVzaFNjcm9sbFBvcyA9IG1fcHRTY3JvbGxQb3M7Ci0KLSAgICBpZiAobV9wTm90aWZ5KSB7Ci0gICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpIHsKLSAgICAgICAgbV9iTm90aWZ5RmxhZyA9IHRydWU7Ci0gICAgICAgIGlmIChjb25zdCBDRlhfRWRpdF9SZWN0QXJyYXkqIHBSZWN0cyA9IG1fUmVmcmVzaC5HZXRSZWZyZXNoUmVjdHMoKSkgewotICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBwUmVjdHMtPkdldFNpemUoKTsgaSA8IHN6OyBpKyspCi0gICAgICAgICAgICBtX3BOb3RpZnktPklPbkludmFsaWRhdGVSZWN0KHBSZWN0cy0+R2V0QXQoaSkpOwotICAgICAgICB9Ci0gICAgICAgIG1fYk5vdGlmeUZsYWcgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBtX1JlZnJlc2guRW5kUmVmcmVzaCgpOwotICB9Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlJlZnJlc2hQdXNoTGluZVJlY3RzKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cikgewotICBpZiAoIW1fcFZULT5Jc1ZhbGlkKCkpCi0gICAgcmV0dXJuOwotCi0gIENQREZfVmFyaWFibGVUZXh0OjpJdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCk7Ci0gIENQVlRfV29yZFBsYWNlIHdwQmVnaW4gPSB3ci5CZWdpblBvczsKLSAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZSh3cEJlZ2luKTsKLSAgQ1BWVF9Xb3JkUGxhY2Ugd3BFbmQgPSB3ci5FbmRQb3M7Ci0gIG1fcFZULT5VcGRhdGVXb3JkUGxhY2Uod3BFbmQpOwotICBwSXRlcmF0b3ItPlNldEF0KHdwQmVnaW4pOwotCi0gIENQVlRfTGluZSBsaW5laW5mbzsKLSAgZG8gewotICAgIGlmICghcEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmVpbmZvKSkKLSAgICAgIGJyZWFrOwotICAgIGlmIChsaW5laW5mby5saW5lcGxhY2UuTGluZUNtcCh3cEVuZCkgPiAwKQotICAgICAgYnJlYWs7Ci0KLSAgICBDRlhfRmxvYXRSZWN0IHJjTGluZShsaW5laW5mby5wdExpbmUueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsaW5laW5mby5wdExpbmUueSArIGxpbmVpbmZvLmZMaW5lRGVzY2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsaW5laW5mby5wdExpbmUueCArIGxpbmVpbmZvLmZMaW5lV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGluZWluZm8ucHRMaW5lLnkgKyBsaW5laW5mby5mTGluZUFzY2VudCk7Ci0KLSAgICBtX1JlZnJlc2guUHVzaChDUFZUX1dvcmRSYW5nZShsaW5laW5mby5saW5lcGxhY2UsIGxpbmVpbmZvLmxpbmVFbmQpLAotICAgICAgICAgICAgICAgICAgIFZUVG9FZGl0KHJjTGluZSkpOwotICB9IHdoaWxlIChwSXRlcmF0b3ItPk5leHRMaW5lKCkpOwotfQotCi12b2lkIENGWF9FZGl0OjpSZWZyZXNoV29yZFJhbmdlKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cikgewotICBDUERGX1ZhcmlhYmxlVGV4dDo6SXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpOwotICBDUFZUX1dvcmRSYW5nZSB3clRlbXAgPSB3cjsKLQotICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKHdyVGVtcC5CZWdpblBvcyk7Ci0gIG1fcFZULT5VcGRhdGVXb3JkUGxhY2Uod3JUZW1wLkVuZFBvcyk7Ci0gIHBJdGVyYXRvci0+U2V0QXQod3JUZW1wLkJlZ2luUG9zKTsKLQotICBDUFZUX1dvcmQgd29yZGluZm87Ci0gIENQVlRfTGluZSBsaW5laW5mbzsKLSAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2U7Ci0KLSAgd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkgewotICAgIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwotICAgIGlmIChwbGFjZS5Xb3JkQ21wKHdyVGVtcC5FbmRQb3MpID4gMCkKLSAgICAgIGJyZWFrOwotCi0gICAgcEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmRpbmZvKTsKLSAgICBwSXRlcmF0b3ItPkdldExpbmUobGluZWluZm8pOwotCi0gICAgaWYgKHBsYWNlLkxpbmVDbXAod3JUZW1wLkJlZ2luUG9zKSA9PSAwIHx8Ci0gICAgICAgIHBsYWNlLkxpbmVDbXAod3JUZW1wLkVuZFBvcykgPT0gMCkgewotICAgICAgQ0ZYX0Zsb2F0UmVjdCByY1dvcmQod29yZGluZm8ucHRXb3JkLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5laW5mby5wdExpbmUueSArIGxpbmVpbmZvLmZMaW5lRGVzY2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLnB0V29yZC54ICsgd29yZGluZm8uZldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWluZm8ucHRMaW5lLnkgKyBsaW5laW5mby5mTGluZUFzY2VudCk7Ci0KLSAgICAgIGlmIChtX3BOb3RpZnkpIHsKLSAgICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKSB7Ci0gICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IHRydWU7Ci0gICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByY1JlZnJlc2ggPSBWVFRvRWRpdChyY1dvcmQpOwotICAgICAgICAgIG1fcE5vdGlmeS0+SU9uSW52YWxpZGF0ZVJlY3QoJnJjUmVmcmVzaCk7Ci0gICAgICAgICAgbV9iTm90aWZ5RmxhZyA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIENGWF9GbG9hdFJlY3QgcmNMaW5lKGxpbmVpbmZvLnB0TGluZS54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWluZm8ucHRMaW5lLnkgKyBsaW5laW5mby5mTGluZURlc2NlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5laW5mby5wdExpbmUueCArIGxpbmVpbmZvLmZMaW5lV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5laW5mby5wdExpbmUueSArIGxpbmVpbmZvLmZMaW5lQXNjZW50KTsKLQotICAgICAgaWYgKG1fcE5vdGlmeSkgewotICAgICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpIHsKLSAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gdHJ1ZTsKLSAgICAgICAgICBDRlhfRmxvYXRSZWN0IHJjUmVmcmVzaCA9IFZUVG9FZGl0KHJjTGluZSk7Ci0gICAgICAgICAgbV9wTm90aWZ5LT5JT25JbnZhbGlkYXRlUmVjdCgmcmNSZWZyZXNoKTsKLSAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcEl0ZXJhdG9yLT5OZXh0TGluZSgpOwotICAgIH0KLSAgfQotfQotCi12b2lkIENGWF9FZGl0OjpTZXRDYXJldChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIHsKLSAgbV93cE9sZENhcmV0ID0gbV93cENhcmV0OwotICBtX3dwQ2FyZXQgPSBwbGFjZTsKLX0KLQotdm9pZCBDRlhfRWRpdDo6U2V0Q2FyZXRJbmZvKCkgewotICBpZiAobV9wTm90aWZ5KSB7Ci0gICAgaWYgKCFtX2JOb3RpZnlGbGFnKSB7Ci0gICAgICBDUERGX1ZhcmlhYmxlVGV4dDo6SXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpOwotICAgICAgcEl0ZXJhdG9yLT5TZXRBdChtX3dwQ2FyZXQpOwotCi0gICAgICBDRlhfUG9pbnRGIHB0SGVhZDsKLSAgICAgIENGWF9Qb2ludEYgcHRGb290OwotICAgICAgQ1BWVF9Xb3JkIHdvcmQ7Ci0gICAgICBDUFZUX0xpbmUgbGluZTsKLSAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKLSAgICAgICAgcHRIZWFkLnggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7Ci0gICAgICAgIHB0SGVhZC55ID0gd29yZC5wdFdvcmQueSArIHdvcmQuZkFzY2VudDsKLSAgICAgICAgcHRGb290LnggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7Ci0gICAgICAgIHB0Rm9vdC55ID0gd29yZC5wdFdvcmQueSArIHdvcmQuZkRlc2NlbnQ7Ci0gICAgICB9IGVsc2UgaWYgKHBJdGVyYXRvci0+R2V0TGluZShsaW5lKSkgewotICAgICAgICBwdEhlYWQueCA9IGxpbmUucHRMaW5lLng7Ci0gICAgICAgIHB0SGVhZC55ID0gbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVBc2NlbnQ7Ci0gICAgICAgIHB0Rm9vdC54ID0gbGluZS5wdExpbmUueDsKLSAgICAgICAgcHRGb290LnkgPSBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZURlc2NlbnQ7Ci0gICAgICB9Ci0KLSAgICAgIG1fYk5vdGlmeUZsYWcgPSB0cnVlOwotICAgICAgbV9wTm90aWZ5LT5JT25TZXRDYXJldCghbV9TZWxTdGF0ZS5Jc0V4aXN0KCksIFZUVG9FZGl0KHB0SGVhZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZUVG9FZGl0KHB0Rm9vdCksIG1fd3BDYXJldCk7Ci0gICAgICBtX2JOb3RpZnlGbGFnID0gZmFsc2U7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlNldENhcmV0KGludDMyX3QgblBvcykgewotICBpZiAobV9wVlQtPklzVmFsaWQoKSkgewotICAgIFNlbGVjdE5vbmUoKTsKLSAgICBTZXRDYXJldChtX3BWVC0+V29yZEluZGV4VG9Xb3JkUGxhY2UoblBvcykpOwotICAgIG1fU2VsU3RhdGUuU2V0KG1fd3BDYXJldCwgbV93cENhcmV0KTsKLQotICAgIFNjcm9sbFRvQ2FyZXQoKTsKLSAgICBTZXRDYXJldE9yaWdpbigpOwotICAgIFNldENhcmV0SW5mbygpOwotICB9Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6Ok9uTW91c2VEb3duKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCBib29sIGJTaGlmdCwgYm9vbCBiQ3RybCkgewotICBpZiAobV9wVlQtPklzVmFsaWQoKSkgewotICAgIFNlbGVjdE5vbmUoKTsKLSAgICBTZXRDYXJldChtX3BWVC0+U2VhcmNoV29yZFBsYWNlKEVkaXRUb1ZUKHBvaW50KSkpOwotICAgIG1fU2VsU3RhdGUuU2V0KG1fd3BDYXJldCwgbV93cENhcmV0KTsKLQotICAgIFNjcm9sbFRvQ2FyZXQoKTsKLSAgICBTZXRDYXJldE9yaWdpbigpOwotICAgIFNldENhcmV0SW5mbygpOwotICB9Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6Ok9uTW91c2VNb3ZlKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCBib29sIGJTaGlmdCwgYm9vbCBiQ3RybCkgewotICBpZiAobV9wVlQtPklzVmFsaWQoKSkgewotICAgIFNldENhcmV0KG1fcFZULT5TZWFyY2hXb3JkUGxhY2UoRWRpdFRvVlQocG9pbnQpKSk7Ci0KLSAgICBpZiAobV93cENhcmV0ICE9IG1fd3BPbGRDYXJldCkgewotICAgICAgbV9TZWxTdGF0ZS5TZXRFbmRQb3MobV93cENhcmV0KTsKLQotICAgICAgU2Nyb2xsVG9DYXJldCgpOwotICAgICAgUmVmcmVzaCgpOwotICAgICAgU2V0Q2FyZXRPcmlnaW4oKTsKLSAgICAgIFNldENhcmV0SW5mbygpOwotICAgIH0KLSAgfQotfQotCi12b2lkIENGWF9FZGl0OjpPblZLX1VQKGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKSB7Ci0gIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7Ci0gICAgU2V0Q2FyZXQobV9wVlQtPkdldFVwV29yZFBsYWNlKG1fd3BDYXJldCwgbV9wdENhcmV0KSk7Ci0KLSAgICBpZiAoYlNoaWZ0KSB7Ci0gICAgICBpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpCi0gICAgICAgIG1fU2VsU3RhdGUuU2V0RW5kUG9zKG1fd3BDYXJldCk7Ci0gICAgICBlbHNlCi0gICAgICAgIG1fU2VsU3RhdGUuU2V0KG1fd3BPbGRDYXJldCwgbV93cENhcmV0KTsKLQotICAgICAgaWYgKG1fd3BPbGRDYXJldCAhPSBtX3dwQ2FyZXQpIHsKLSAgICAgICAgU2Nyb2xsVG9DYXJldCgpOwotICAgICAgICBSZWZyZXNoKCk7Ci0gICAgICAgIFNldENhcmV0SW5mbygpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBTZWxlY3ROb25lKCk7Ci0KLSAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKLSAgICAgIFNldENhcmV0SW5mbygpOwotICAgIH0KLSAgfQotfQotCi12b2lkIENGWF9FZGl0OjpPblZLX0RPV04oYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpIHsKLSAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKLSAgICBTZXRDYXJldChtX3BWVC0+R2V0RG93bldvcmRQbGFjZShtX3dwQ2FyZXQsIG1fcHRDYXJldCkpOwotCi0gICAgaWYgKGJTaGlmdCkgewotICAgICAgaWYgKG1fU2VsU3RhdGUuSXNFeGlzdCgpKQotICAgICAgICBtX1NlbFN0YXRlLlNldEVuZFBvcyhtX3dwQ2FyZXQpOwotICAgICAgZWxzZQotICAgICAgICBtX1NlbFN0YXRlLlNldChtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCk7Ci0KLSAgICAgIGlmIChtX3dwT2xkQ2FyZXQgIT0gbV93cENhcmV0KSB7Ci0gICAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKLSAgICAgICAgUmVmcmVzaCgpOwotICAgICAgICBTZXRDYXJldEluZm8oKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgU2VsZWN0Tm9uZSgpOwotCi0gICAgICBTY3JvbGxUb0NhcmV0KCk7Ci0gICAgICBTZXRDYXJldEluZm8oKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDRlhfRWRpdDo6T25WS19MRUZUKGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKSB7Ci0gIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7Ci0gICAgaWYgKGJTaGlmdCkgewotICAgICAgaWYgKG1fd3BDYXJldCA9PSBtX3BWVC0+R2V0TGluZUJlZ2luUGxhY2UobV93cENhcmV0KSAmJgotICAgICAgICAgIG1fd3BDYXJldCAhPSBtX3BWVC0+R2V0U2VjdGlvbkJlZ2luUGxhY2UobV93cENhcmV0KSkKLSAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldFByZXZXb3JkUGxhY2UobV93cENhcmV0KSk7Ci0KLSAgICAgIFNldENhcmV0KG1fcFZULT5HZXRQcmV2V29yZFBsYWNlKG1fd3BDYXJldCkpOwotCi0gICAgICBpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpCi0gICAgICAgIG1fU2VsU3RhdGUuU2V0RW5kUG9zKG1fd3BDYXJldCk7Ci0gICAgICBlbHNlCi0gICAgICAgIG1fU2VsU3RhdGUuU2V0KG1fd3BPbGRDYXJldCwgbV93cENhcmV0KTsKLQotICAgICAgaWYgKG1fd3BPbGRDYXJldCAhPSBtX3dwQ2FyZXQpIHsKLSAgICAgICAgU2Nyb2xsVG9DYXJldCgpOwotICAgICAgICBSZWZyZXNoKCk7Ci0gICAgICAgIFNldENhcmV0SW5mbygpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpIHsKLSAgICAgICAgaWYgKG1fU2VsU3RhdGUuQmVnaW5Qb3MuV29yZENtcChtX1NlbFN0YXRlLkVuZFBvcykgPCAwKQotICAgICAgICAgIFNldENhcmV0KG1fU2VsU3RhdGUuQmVnaW5Qb3MpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgU2V0Q2FyZXQobV9TZWxTdGF0ZS5FbmRQb3MpOwotCi0gICAgICAgIFNlbGVjdE5vbmUoKTsKLSAgICAgICAgU2Nyb2xsVG9DYXJldCgpOwotICAgICAgICBTZXRDYXJldEluZm8oKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtX3dwQ2FyZXQgPT0gbV9wVlQtPkdldExpbmVCZWdpblBsYWNlKG1fd3BDYXJldCkgJiYKLSAgICAgICAgICAgIG1fd3BDYXJldCAhPSBtX3BWVC0+R2V0U2VjdGlvbkJlZ2luUGxhY2UobV93cENhcmV0KSkKLSAgICAgICAgICBTZXRDYXJldChtX3BWVC0+R2V0UHJldldvcmRQbGFjZShtX3dwQ2FyZXQpKTsKLQotICAgICAgICBTZXRDYXJldChtX3BWVC0+R2V0UHJldldvcmRQbGFjZShtX3dwQ2FyZXQpKTsKLQotICAgICAgICBTY3JvbGxUb0NhcmV0KCk7Ci0gICAgICAgIFNldENhcmV0T3JpZ2luKCk7Ci0gICAgICAgIFNldENhcmV0SW5mbygpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIENGWF9FZGl0OjpPblZLX1JJR0hUKGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKSB7Ci0gIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7Ci0gICAgaWYgKGJTaGlmdCkgewotICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldE5leHRXb3JkUGxhY2UobV93cENhcmV0KSk7Ci0KLSAgICAgIGlmIChtX3dwQ2FyZXQgPT0gbV9wVlQtPkdldExpbmVFbmRQbGFjZShtX3dwQ2FyZXQpICYmCi0gICAgICAgICAgbV93cENhcmV0ICE9IG1fcFZULT5HZXRTZWN0aW9uRW5kUGxhY2UobV93cENhcmV0KSkKLSAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldE5leHRXb3JkUGxhY2UobV93cENhcmV0KSk7Ci0KLSAgICAgIGlmIChtX1NlbFN0YXRlLklzRXhpc3QoKSkKLSAgICAgICAgbV9TZWxTdGF0ZS5TZXRFbmRQb3MobV93cENhcmV0KTsKLSAgICAgIGVsc2UKLSAgICAgICAgbV9TZWxTdGF0ZS5TZXQobV93cE9sZENhcmV0LCBtX3dwQ2FyZXQpOwotCi0gICAgICBpZiAobV93cE9sZENhcmV0ICE9IG1fd3BDYXJldCkgewotICAgICAgICBTY3JvbGxUb0NhcmV0KCk7Ci0gICAgICAgIFJlZnJlc2goKTsKLSAgICAgICAgU2V0Q2FyZXRJbmZvKCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChtX1NlbFN0YXRlLklzRXhpc3QoKSkgewotICAgICAgICBpZiAobV9TZWxTdGF0ZS5CZWdpblBvcy5Xb3JkQ21wKG1fU2VsU3RhdGUuRW5kUG9zKSA+IDApCi0gICAgICAgICAgU2V0Q2FyZXQobV9TZWxTdGF0ZS5CZWdpblBvcyk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBTZXRDYXJldChtX1NlbFN0YXRlLkVuZFBvcyk7Ci0KLSAgICAgICAgU2VsZWN0Tm9uZSgpOwotICAgICAgICBTY3JvbGxUb0NhcmV0KCk7Ci0gICAgICAgIFNldENhcmV0SW5mbygpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldE5leHRXb3JkUGxhY2UobV93cENhcmV0KSk7Ci0KLSAgICAgICAgaWYgKG1fd3BDYXJldCA9PSBtX3BWVC0+R2V0TGluZUVuZFBsYWNlKG1fd3BDYXJldCkgJiYKLSAgICAgICAgICAgIG1fd3BDYXJldCAhPSBtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKG1fd3BDYXJldCkpCi0gICAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldE5leHRXb3JkUGxhY2UobV93cENhcmV0KSk7Ci0KLSAgICAgICAgU2Nyb2xsVG9DYXJldCgpOwotICAgICAgICBTZXRDYXJldE9yaWdpbigpOwotICAgICAgICBTZXRDYXJldEluZm8oKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDRlhfRWRpdDo6T25WS19IT01FKGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKSB7Ci0gIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7Ci0gICAgaWYgKGJTaGlmdCkgewotICAgICAgaWYgKGJDdHJsKQotICAgICAgICBTZXRDYXJldChtX3BWVC0+R2V0QmVnaW5Xb3JkUGxhY2UoKSk7Ci0gICAgICBlbHNlCi0gICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRMaW5lQmVnaW5QbGFjZShtX3dwQ2FyZXQpKTsKLQotICAgICAgaWYgKG1fU2VsU3RhdGUuSXNFeGlzdCgpKQotICAgICAgICBtX1NlbFN0YXRlLlNldEVuZFBvcyhtX3dwQ2FyZXQpOwotICAgICAgZWxzZQotICAgICAgICBtX1NlbFN0YXRlLlNldChtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCk7Ci0KLSAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKLSAgICAgIFJlZnJlc2goKTsKLSAgICAgIFNldENhcmV0SW5mbygpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAobV9TZWxTdGF0ZS5Jc0V4aXN0KCkpIHsKLSAgICAgICAgaWYgKG1fU2VsU3RhdGUuQmVnaW5Qb3MuV29yZENtcChtX1NlbFN0YXRlLkVuZFBvcykgPCAwKQotICAgICAgICAgIFNldENhcmV0KG1fU2VsU3RhdGUuQmVnaW5Qb3MpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgU2V0Q2FyZXQobV9TZWxTdGF0ZS5FbmRQb3MpOwotCi0gICAgICAgIFNlbGVjdE5vbmUoKTsKLSAgICAgICAgU2Nyb2xsVG9DYXJldCgpOwotICAgICAgICBTZXRDYXJldEluZm8oKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChiQ3RybCkKLSAgICAgICAgICBTZXRDYXJldChtX3BWVC0+R2V0QmVnaW5Xb3JkUGxhY2UoKSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBTZXRDYXJldChtX3BWVC0+R2V0TGluZUJlZ2luUGxhY2UobV93cENhcmV0KSk7Ci0KLSAgICAgICAgU2Nyb2xsVG9DYXJldCgpOwotICAgICAgICBTZXRDYXJldE9yaWdpbigpOwotICAgICAgICBTZXRDYXJldEluZm8oKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDRlhfRWRpdDo6T25WS19FTkQoYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpIHsKLSAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKLSAgICBpZiAoYlNoaWZ0KSB7Ci0gICAgICBpZiAoYkN0cmwpCi0gICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRFbmRXb3JkUGxhY2UoKSk7Ci0gICAgICBlbHNlCi0gICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRMaW5lRW5kUGxhY2UobV93cENhcmV0KSk7Ci0KLSAgICAgIGlmIChtX1NlbFN0YXRlLklzRXhpc3QoKSkKLSAgICAgICAgbV9TZWxTdGF0ZS5TZXRFbmRQb3MobV93cENhcmV0KTsKLSAgICAgIGVsc2UKLSAgICAgICAgbV9TZWxTdGF0ZS5TZXQobV93cE9sZENhcmV0LCBtX3dwQ2FyZXQpOwotCi0gICAgICBTY3JvbGxUb0NhcmV0KCk7Ci0gICAgICBSZWZyZXNoKCk7Ci0gICAgICBTZXRDYXJldEluZm8oKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKG1fU2VsU3RhdGUuSXNFeGlzdCgpKSB7Ci0gICAgICAgIGlmIChtX1NlbFN0YXRlLkJlZ2luUG9zLldvcmRDbXAobV9TZWxTdGF0ZS5FbmRQb3MpID4gMCkKLSAgICAgICAgICBTZXRDYXJldChtX1NlbFN0YXRlLkJlZ2luUG9zKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIFNldENhcmV0KG1fU2VsU3RhdGUuRW5kUG9zKTsKLQotICAgICAgICBTZWxlY3ROb25lKCk7Ci0gICAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKLSAgICAgICAgU2V0Q2FyZXRJbmZvKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoYkN0cmwpCi0gICAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldEVuZFdvcmRQbGFjZSgpKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRMaW5lRW5kUGxhY2UobV93cENhcmV0KSk7Ci0KLSAgICAgICAgU2Nyb2xsVG9DYXJldCgpOwotICAgICAgICBTZXRDYXJldE9yaWdpbigpOwotICAgICAgICBTZXRDYXJldEluZm8oKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotYm9vbCBDRlhfRWRpdDo6SW5zZXJ0V29yZCh1aW50MTZfdCB3b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJBZGRVbmRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJQYWludCkgewotICBpZiAoSXNUZXh0T3ZlcmZsb3coKSB8fCAhbV9wVlQtPklzVmFsaWQoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOwotICBTZXRDYXJldChtX3BWVC0+SW5zZXJ0V29yZChtX3dwQ2FyZXQsIHdvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldENoYXJTZXRGcm9tVW5pY29kZSh3b3JkLCBjaGFyc2V0KSwgcFdvcmRQcm9wcykpOwotICBtX1NlbFN0YXRlLlNldChtX3dwQ2FyZXQsIG1fd3BDYXJldCk7Ci0gIGlmIChtX3dwQ2FyZXQgPT0gbV93cE9sZENhcmV0KQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYkFkZFVuZG8gJiYgbV9iRW5hYmxlVW5kbykgewotICAgIEFkZEVkaXRVbmRvSXRlbShwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYRVVfSW5zZXJ0V29yZD4oCi0gICAgICAgIHRoaXMsIG1fd3BPbGRDYXJldCwgbV93cENhcmV0LCB3b3JkLCBjaGFyc2V0LCBwV29yZFByb3BzKSk7Ci0gIH0KLSAgaWYgKGJQYWludCkKLSAgICBQYWludEluc2VydFRleHQobV93cE9sZENhcmV0LCBtX3dwQ2FyZXQpOwotCi0gIGlmIChtX2JPcHJOb3RpZnkgJiYgbV9wT3ByTm90aWZ5KQotICAgIG1fcE9wck5vdGlmeS0+T25JbnNlcnRXb3JkKG1fd3BDYXJldCwgbV93cE9sZENhcmV0KTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDRlhfRWRpdDo6SW5zZXJ0UmV0dXJuKGNvbnN0IENQVlRfU2VjUHJvcHMqIHBTZWNQcm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJBZGRVbmRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlBhaW50KSB7Ci0gIGlmIChJc1RleHRPdmVyZmxvdygpIHx8ICFtX3BWVC0+SXNWYWxpZCgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKG1fd3BDYXJldCk7Ci0gIFNldENhcmV0KG1fcFZULT5JbnNlcnRTZWN0aW9uKG1fd3BDYXJldCwgcFNlY1Byb3BzLCBwV29yZFByb3BzKSk7Ci0gIG1fU2VsU3RhdGUuU2V0KG1fd3BDYXJldCwgbV93cENhcmV0KTsKLSAgaWYgKG1fd3BDYXJldCA9PSBtX3dwT2xkQ2FyZXQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChiQWRkVW5kbyAmJiBtX2JFbmFibGVVbmRvKSB7Ci0gICAgQWRkRWRpdFVuZG9JdGVtKHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhFVV9JbnNlcnRSZXR1cm4+KAotICAgICAgICB0aGlzLCBtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCwgcFNlY1Byb3BzLCBwV29yZFByb3BzKSk7Ci0gIH0KLSAgaWYgKGJQYWludCkgewotICAgIFJlYXJyYW5nZVBhcnQoQ1BWVF9Xb3JkUmFuZ2UobV93cE9sZENhcmV0LCBtX3dwQ2FyZXQpKTsKLSAgICBTY3JvbGxUb0NhcmV0KCk7Ci0gICAgUmVmcmVzaCgpOwotICAgIFNldENhcmV0T3JpZ2luKCk7Ci0gICAgU2V0Q2FyZXRJbmZvKCk7Ci0gIH0KLSAgaWYgKG1fYk9wck5vdGlmeSAmJiBtX3BPcHJOb3RpZnkpCi0gICAgbV9wT3ByTm90aWZ5LT5Pbkluc2VydFJldHVybihtX3dwQ2FyZXQsIG1fd3BPbGRDYXJldCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0ZYX0VkaXQ6OkJhY2tzcGFjZShib29sIGJBZGRVbmRvLCBib29sIGJQYWludCkgewotICBpZiAoIW1fcFZULT5Jc1ZhbGlkKCkgfHwgbV93cENhcmV0ID09IG1fcFZULT5HZXRCZWdpbldvcmRQbGFjZSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDUFZUX1NlY3Rpb24gc2VjdGlvbjsKLSAgQ1BWVF9Xb3JkIHdvcmQ7Ci0gIGlmIChiQWRkVW5kbykgewotICAgIENQREZfVmFyaWFibGVUZXh0OjpJdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCk7Ci0gICAgcEl0ZXJhdG9yLT5TZXRBdChtX3dwQ2FyZXQpOwotICAgIHBJdGVyYXRvci0+R2V0U2VjdGlvbihzZWN0aW9uKTsKLSAgICBwSXRlcmF0b3ItPkdldFdvcmQod29yZCk7Ci0gIH0KLSAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOwotICBTZXRDYXJldChtX3BWVC0+QmFja1NwYWNlV29yZChtX3dwQ2FyZXQpKTsKLSAgbV9TZWxTdGF0ZS5TZXQobV93cENhcmV0LCBtX3dwQ2FyZXQpOwotICBpZiAobV93cENhcmV0ID09IG1fd3BPbGRDYXJldCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJBZGRVbmRvICYmIG1fYkVuYWJsZVVuZG8pIHsKLSAgICBpZiAobV93cENhcmV0LlNlY0NtcChtX3dwT2xkQ2FyZXQpICE9IDApIHsKLSAgICAgIEFkZEVkaXRVbmRvSXRlbShwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYRVVfQmFja3NwYWNlPigKLSAgICAgICAgICB0aGlzLCBtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCwgd29yZC5Xb3JkLCB3b3JkLm5DaGFyc2V0LAotICAgICAgICAgIHNlY3Rpb24uU2VjUHJvcHMsIHNlY3Rpb24uV29yZFByb3BzKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFkZEVkaXRVbmRvSXRlbShwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYRVVfQmFja3NwYWNlPigKLSAgICAgICAgICB0aGlzLCBtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCwgd29yZC5Xb3JkLCB3b3JkLm5DaGFyc2V0LAotICAgICAgICAgIHNlY3Rpb24uU2VjUHJvcHMsIHdvcmQuV29yZFByb3BzKSk7Ci0gICAgfQotICB9Ci0gIGlmIChiUGFpbnQpIHsKLSAgICBSZWFycmFuZ2VQYXJ0KENQVlRfV29yZFJhbmdlKG1fd3BDYXJldCwgbV93cE9sZENhcmV0KSk7Ci0gICAgU2Nyb2xsVG9DYXJldCgpOwotICAgIFJlZnJlc2goKTsKLSAgICBTZXRDYXJldE9yaWdpbigpOwotICAgIFNldENhcmV0SW5mbygpOwotICB9Ci0gIGlmIChtX2JPcHJOb3RpZnkgJiYgbV9wT3ByTm90aWZ5KQotICAgIG1fcE9wck5vdGlmeS0+T25CYWNrU3BhY2UobV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENGWF9FZGl0OjpEZWxldGUoYm9vbCBiQWRkVW5kbywgYm9vbCBiUGFpbnQpIHsKLSAgaWYgKCFtX3BWVC0+SXNWYWxpZCgpIHx8IG1fd3BDYXJldCA9PSBtX3BWVC0+R2V0RW5kV29yZFBsYWNlKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQVlRfU2VjdGlvbiBzZWN0aW9uOwotICBDUFZUX1dvcmQgd29yZDsKLSAgaWYgKGJBZGRVbmRvKSB7Ci0gICAgQ1BERl9WYXJpYWJsZVRleHQ6Okl0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKTsKLSAgICBwSXRlcmF0b3ItPlNldEF0KG1fcFZULT5HZXROZXh0V29yZFBsYWNlKG1fd3BDYXJldCkpOwotICAgIHBJdGVyYXRvci0+R2V0U2VjdGlvbihzZWN0aW9uKTsKLSAgICBwSXRlcmF0b3ItPkdldFdvcmQod29yZCk7Ci0gIH0KLSAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOwotICBib29sIGJTZWNFbmQgPSAobV93cENhcmV0ID09IG1fcFZULT5HZXRTZWN0aW9uRW5kUGxhY2UobV93cENhcmV0KSk7Ci0gIFNldENhcmV0KG1fcFZULT5EZWxldGVXb3JkKG1fd3BDYXJldCkpOwotICBtX1NlbFN0YXRlLlNldChtX3dwQ2FyZXQsIG1fd3BDYXJldCk7Ci0gIGlmIChiQWRkVW5kbyAmJiBtX2JFbmFibGVVbmRvKSB7Ci0gICAgaWYgKGJTZWNFbmQpIHsKLSAgICAgIEFkZEVkaXRVbmRvSXRlbShwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYRVVfRGVsZXRlPigKLSAgICAgICAgICB0aGlzLCBtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCwgd29yZC5Xb3JkLCB3b3JkLm5DaGFyc2V0LAotICAgICAgICAgIHNlY3Rpb24uU2VjUHJvcHMsIHNlY3Rpb24uV29yZFByb3BzLCBiU2VjRW5kKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFkZEVkaXRVbmRvSXRlbShwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYRVVfRGVsZXRlPigKLSAgICAgICAgICB0aGlzLCBtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCwgd29yZC5Xb3JkLCB3b3JkLm5DaGFyc2V0LAotICAgICAgICAgIHNlY3Rpb24uU2VjUHJvcHMsIHdvcmQuV29yZFByb3BzLCBiU2VjRW5kKSk7Ci0gICAgfQotICB9Ci0gIGlmIChiUGFpbnQpIHsKLSAgICBSZWFycmFuZ2VQYXJ0KENQVlRfV29yZFJhbmdlKG1fd3BPbGRDYXJldCwgbV93cENhcmV0KSk7Ci0gICAgU2Nyb2xsVG9DYXJldCgpOwotICAgIFJlZnJlc2goKTsKLSAgICBTZXRDYXJldE9yaWdpbigpOwotICAgIFNldENhcmV0SW5mbygpOwotICB9Ci0gIGlmIChtX2JPcHJOb3RpZnkgJiYgbV9wT3ByTm90aWZ5KQotICAgIG1fcE9wck5vdGlmeS0+T25EZWxldGUobV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENGWF9FZGl0OjpFbXB0eSgpIHsKLSAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKLSAgICBtX3BWVC0+RGVsZXRlV29yZHMoR2V0V2hvbGVXb3JkUmFuZ2UoKSk7Ci0gICAgU2V0Q2FyZXQobV9wVlQtPkdldEJlZ2luV29yZFBsYWNlKCkpOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ0ZYX0VkaXQ6OkNsZWFyKGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KSB7Ci0gIGlmICghbV9wVlQtPklzVmFsaWQoKSB8fCAhbV9TZWxTdGF0ZS5Jc0V4aXN0KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQVlRfV29yZFJhbmdlIHJhbmdlID0gbV9TZWxTdGF0ZS5Db252ZXJ0VG9Xb3JkUmFuZ2UoKTsKLSAgaWYgKGJBZGRVbmRvICYmIG1fYkVuYWJsZVVuZG8pCi0gICAgQWRkRWRpdFVuZG9JdGVtKHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhFVV9DbGVhcj4odGhpcywgcmFuZ2UsIEdldFNlbFRleHQoKSkpOwotCi0gIFNlbGVjdE5vbmUoKTsKLSAgU2V0Q2FyZXQobV9wVlQtPkRlbGV0ZVdvcmRzKHJhbmdlKSk7Ci0gIG1fU2VsU3RhdGUuU2V0KG1fd3BDYXJldCwgbV93cENhcmV0KTsKLSAgaWYgKGJQYWludCkgewotICAgIFJlYXJyYW5nZVBhcnQocmFuZ2UpOwotICAgIFNjcm9sbFRvQ2FyZXQoKTsKLSAgICBSZWZyZXNoKCk7Ci0gICAgU2V0Q2FyZXRPcmlnaW4oKTsKLSAgICBTZXRDYXJldEluZm8oKTsKLSAgfQotICBpZiAobV9iT3ByTm90aWZ5ICYmIG1fcE9wck5vdGlmeSkKLSAgICBtX3BPcHJOb3RpZnktPk9uQ2xlYXIobV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENGWF9FZGl0OjpJbnNlcnRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJBZGRVbmRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJQYWludCkgewotICBpZiAoSXNUZXh0T3ZlcmZsb3coKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOwotICBTZXRDYXJldChEb0luc2VydFRleHQobV93cENhcmV0LCBzVGV4dCwgY2hhcnNldCkpOwotICBtX1NlbFN0YXRlLlNldChtX3dwQ2FyZXQsIG1fd3BDYXJldCk7Ci0gIGlmIChtX3dwQ2FyZXQgPT0gbV93cE9sZENhcmV0KQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoYkFkZFVuZG8gJiYgbV9iRW5hYmxlVW5kbykgewotICAgIEFkZEVkaXRVbmRvSXRlbShwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYRVVfSW5zZXJ0VGV4dD4oCi0gICAgICAgIHRoaXMsIG1fd3BPbGRDYXJldCwgbV93cENhcmV0LCBzVGV4dCwgY2hhcnNldCkpOwotICB9Ci0gIGlmIChiUGFpbnQpCi0gICAgUGFpbnRJbnNlcnRUZXh0KG1fd3BPbGRDYXJldCwgbV93cENhcmV0KTsKLQotICBpZiAobV9iT3ByTm90aWZ5ICYmIG1fcE9wck5vdGlmeSkKLSAgICBtX3BPcHJOb3RpZnktPk9uSW5zZXJ0VGV4dChtX3dwQ2FyZXQsIG1fd3BPbGRDYXJldCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OlBhaW50SW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BPbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwTmV3KSB7Ci0gIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7Ci0gICAgUmVhcnJhbmdlUGFydChDUFZUX1dvcmRSYW5nZSh3cE9sZCwgd3BOZXcpKTsKLSAgICBTY3JvbGxUb0NhcmV0KCk7Ci0gICAgUmVmcmVzaCgpOwotICAgIFNldENhcmV0T3JpZ2luKCk7Ci0gICAgU2V0Q2FyZXRJbmZvKCk7Ci0gIH0KLX0KLQotYm9vbCBDRlhfRWRpdDo6UmVkbygpIHsKLSAgaWYgKG1fYkVuYWJsZVVuZG8pIHsKLSAgICBpZiAobV9VbmRvLkNhblJlZG8oKSkgewotICAgICAgbV9VbmRvLlJlZG8oKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDRlhfRWRpdDo6VW5kbygpIHsKLSAgaWYgKG1fYkVuYWJsZVVuZG8pIHsKLSAgICBpZiAobV9VbmRvLkNhblVuZG8oKSkgewotICAgICAgbV9VbmRvLlVuZG8oKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBDRlhfRWRpdDo6U2V0Q2FyZXRPcmlnaW4oKSB7Ci0gIGlmICghbV9wVlQtPklzVmFsaWQoKSkKLSAgICByZXR1cm47Ci0KLSAgQ1BERl9WYXJpYWJsZVRleHQ6Okl0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKTsKLSAgcEl0ZXJhdG9yLT5TZXRBdChtX3dwQ2FyZXQpOwotICBDUFZUX1dvcmQgd29yZDsKLSAgQ1BWVF9MaW5lIGxpbmU7Ci0gIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKLSAgICBtX3B0Q2FyZXQueCA9IHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aDsKLSAgICBtX3B0Q2FyZXQueSA9IHdvcmQucHRXb3JkLnk7Ci0gIH0gZWxzZSBpZiAocEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpKSB7Ci0gICAgbV9wdENhcmV0LnggPSBsaW5lLnB0TGluZS54OwotICAgIG1fcHRDYXJldC55ID0gbGluZS5wdExpbmUueTsKLSAgfQotfQotCi1pbnQzMl90IENGWF9FZGl0OjpXb3JkUGxhY2VUb1dvcmRJbmRleChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IHsKLSAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpCi0gICAgcmV0dXJuIG1fcFZULT5Xb3JkUGxhY2VUb1dvcmRJbmRleChwbGFjZSk7Ci0KLSAgcmV0dXJuIC0xOwotfQotCi1DUFZUX1dvcmRQbGFjZSBDRlhfRWRpdDo6V29yZEluZGV4VG9Xb3JkUGxhY2UoaW50MzJfdCBpbmRleCkgY29uc3QgewotICBpZiAobV9wVlQtPklzVmFsaWQoKSkKLSAgICByZXR1cm4gbV9wVlQtPldvcmRJbmRleFRvV29yZFBsYWNlKGluZGV4KTsKLQotICByZXR1cm4gQ1BWVF9Xb3JkUGxhY2UoKTsKLX0KLQotYm9vbCBDRlhfRWRpdDo6SXNUZXh0RnVsbCgpIGNvbnN0IHsKLSAgaW50MzJfdCBuVG90YWxXb3JkcyA9IG1fcFZULT5HZXRUb3RhbFdvcmRzKCk7Ci0gIGludDMyX3QgbkxpbWl0Q2hhciA9IG1fcFZULT5HZXRMaW1pdENoYXIoKTsKLSAgaW50MzJfdCBuQ2hhckFycmF5ID0gbV9wVlQtPkdldENoYXJBcnJheSgpOwotCi0gIHJldHVybiBJc1RleHRPdmVyZmxvdygpIHx8IChuTGltaXRDaGFyID4gMCAmJiBuVG90YWxXb3JkcyA+PSBuTGltaXRDaGFyKSB8fAotICAgICAgICAgKG5DaGFyQXJyYXkgPiAwICYmIG5Ub3RhbFdvcmRzID49IG5DaGFyQXJyYXkpOwotfQotCi1ib29sIENGWF9FZGl0OjpJc1RleHRPdmVyZmxvdygpIGNvbnN0IHsKLSAgaWYgKCFtX2JFbmFibGVTY3JvbGwgJiYgIW1fYkVuYWJsZU92ZXJmbG93KSB7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByY1BsYXRlID0gbV9wVlQtPkdldFBsYXRlUmVjdCgpOwotICAgIENGWF9GbG9hdFJlY3QgcmNDb250ZW50ID0gbV9wVlQtPkdldENvbnRlbnRSZWN0KCk7Ci0KLSAgICBpZiAobV9wVlQtPklzTXVsdGlMaW5lKCkgJiYgR2V0VG90YWxMaW5lcygpID4gMSAmJgotICAgICAgICBJc0Zsb2F0QmlnZ2VyKHJjQ29udGVudC5IZWlnaHQoKSwgcmNQbGF0ZS5IZWlnaHQoKSkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChJc0Zsb2F0QmlnZ2VyKHJjQ29udGVudC5XaWR0aCgpLCByY1BsYXRlLldpZHRoKCkpKQotICAgICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ0ZYX0VkaXQ6OkNhblVuZG8oKSBjb25zdCB7Ci0gIGlmIChtX2JFbmFibGVVbmRvKSB7Ci0gICAgcmV0dXJuIG1fVW5kby5DYW5VbmRvKCk7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ0ZYX0VkaXQ6OkNhblJlZG8oKSBjb25zdCB7Ci0gIGlmIChtX2JFbmFibGVVbmRvKSB7Ci0gICAgcmV0dXJuIG1fVW5kby5DYW5SZWRvKCk7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OkVuYWJsZVJlZnJlc2goYm9vbCBiUmVmcmVzaCkgewotICBtX2JFbmFibGVSZWZyZXNoID0gYlJlZnJlc2g7Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OkVuYWJsZVVuZG8oYm9vbCBiVW5kbykgewotICBtX2JFbmFibGVVbmRvID0gYlVuZG87Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OkVuYWJsZU9wck5vdGlmeShib29sIGJOb3RpZnkpIHsKLSAgbV9iT3ByTm90aWZ5ID0gYk5vdGlmeTsKLX0KLQotQ1BWVF9Xb3JkUGxhY2UgQ0ZYX0VkaXQ6OkRvSW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0KSB7Ci0gIENQVlRfV29yZFBsYWNlIHdwID0gcGxhY2U7Ci0KLSAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKLSAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gc1RleHQuR2V0TGVuZ3RoKCk7IGkgPCBzejsgaSsrKSB7Ci0gICAgICB1aW50MTZfdCB3b3JkID0gc1RleHRbaV07Ci0gICAgICBzd2l0Y2ggKHdvcmQpIHsKLSAgICAgICAgY2FzZSAweDBEOgotICAgICAgICAgIHdwID0gbV9wVlQtPkluc2VydFNlY3Rpb24od3AsIG51bGxwdHIsIG51bGxwdHIpOwotICAgICAgICAgIGlmIChzVGV4dFtpICsgMV0gPT0gMHgwQSkKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAweDBBOgotICAgICAgICAgIHdwID0gbV9wVlQtPkluc2VydFNlY3Rpb24od3AsIG51bGxwdHIsIG51bGxwdHIpOwotICAgICAgICAgIGlmIChzVGV4dFtpICsgMV0gPT0gMHgwRCkKLSAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAweDA5OgotICAgICAgICAgIHdvcmQgPSAweDIwOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHdwID0gbV9wVlQtPkluc2VydFdvcmQod3AsIHdvcmQsIEdldENoYXJTZXRGcm9tVW5pY29kZSh3b3JkLCBjaGFyc2V0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiB3cDsKLX0KLQotaW50MzJfdCBDRlhfRWRpdDo6R2V0Q2hhclNldEZyb21Vbmljb2RlKHVpbnQxNl90IHdvcmQsIGludDMyX3Qgbk9sZENoYXJzZXQpIHsKLSAgaWYgKElQVlRfRm9udE1hcCogcEZvbnRNYXAgPSBHZXRGb250TWFwKCkpCi0gICAgcmV0dXJuIHBGb250TWFwLT5DaGFyU2V0RnJvbVVuaWNvZGUod29yZCwgbk9sZENoYXJzZXQpOwotICByZXR1cm4gbk9sZENoYXJzZXQ7Ci19Ci0KLXZvaWQgQ0ZYX0VkaXQ6OkFkZEVkaXRVbmRvSXRlbSgKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0VkaXRfVW5kb0l0ZW0+IHBFZGl0VW5kb0l0ZW0pIHsKLSAgaWYgKG1fcEdyb3VwVW5kb0l0ZW0pCi0gICAgbV9wR3JvdXBVbmRvSXRlbS0+QWRkVW5kb0l0ZW0oc3RkOjptb3ZlKHBFZGl0VW5kb0l0ZW0pKTsKLSAgZWxzZQotICAgIG1fVW5kby5BZGRJdGVtKHN0ZDo6bW92ZShwRWRpdFVuZG9JdGVtKSk7Ci19Ci0KLUNGWF9FZGl0X0xpbmVSZWN0QXJyYXk6OkNGWF9FZGl0X0xpbmVSZWN0QXJyYXkoKSB7fQotCi1DRlhfRWRpdF9MaW5lUmVjdEFycmF5Ojp+Q0ZYX0VkaXRfTGluZVJlY3RBcnJheSgpIHt9Ci0KLXZvaWQgQ0ZYX0VkaXRfTGluZVJlY3RBcnJheTo6b3BlcmF0b3I9KENGWF9FZGl0X0xpbmVSZWN0QXJyYXkmJiB0aGF0KSB7Ci0gIG1fTGluZVJlY3RzID0gc3RkOjptb3ZlKHRoYXQubV9MaW5lUmVjdHMpOwotfQotCi12b2lkIENGWF9FZGl0X0xpbmVSZWN0QXJyYXk6OkFkZChjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3JMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNMaW5lKSB7Ci0gIG1fTGluZVJlY3RzLnB1c2hfYmFjayhwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0VkaXRfTGluZVJlY3Q+KHdyTGluZSwgcmNMaW5lKSk7Ci19Ci0KLWludDMyX3QgQ0ZYX0VkaXRfTGluZVJlY3RBcnJheTo6R2V0U2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9MaW5lUmVjdHMpOwotfQotCi1DRlhfRWRpdF9MaW5lUmVjdCogQ0ZYX0VkaXRfTGluZVJlY3RBcnJheTo6R2V0QXQoaW50MzJfdCBuSW5kZXgpIGNvbnN0IHsKLSAgaWYgKG5JbmRleCA8IDAgfHwgbkluZGV4ID49IEdldFNpemUoKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICByZXR1cm4gbV9MaW5lUmVjdHNbbkluZGV4XS5nZXQoKTsKLX0KLQotQ0ZYX0VkaXRfU2VsZWN0OjpDRlhfRWRpdF9TZWxlY3QoKSB7fQotCi1DRlhfRWRpdF9TZWxlY3Q6OkNGWF9FZGl0X1NlbGVjdChjb25zdCBDUFZUX1dvcmRQbGFjZSYgYmVnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgZW5kKSB7Ci0gIFNldChiZWdpbiwgZW5kKTsKLX0KLQotQ0ZYX0VkaXRfU2VsZWN0OjpDRlhfRWRpdF9TZWxlY3QoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHJhbmdlKSB7Ci0gIFNldChyYW5nZS5CZWdpblBvcywgcmFuZ2UuRW5kUG9zKTsKLX0KLQotQ1BWVF9Xb3JkUmFuZ2UgQ0ZYX0VkaXRfU2VsZWN0OjpDb252ZXJ0VG9Xb3JkUmFuZ2UoKSBjb25zdCB7Ci0gIHJldHVybiBDUFZUX1dvcmRSYW5nZShCZWdpblBvcywgRW5kUG9zKTsKLX0KLQotdm9pZCBDRlhfRWRpdF9TZWxlY3Q6OkRlZmF1bHQoKSB7Ci0gIEJlZ2luUG9zLkRlZmF1bHQoKTsKLSAgRW5kUG9zLkRlZmF1bHQoKTsKLX0KLQotdm9pZCBDRlhfRWRpdF9TZWxlY3Q6OlNldChjb25zdCBDUFZUX1dvcmRQbGFjZSYgYmVnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBlbmQpIHsKLSAgQmVnaW5Qb3MgPSBiZWdpbjsKLSAgRW5kUG9zID0gZW5kOwotfQotCi12b2lkIENGWF9FZGl0X1NlbGVjdDo6U2V0QmVnaW5Qb3MoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGJlZ2luKSB7Ci0gIEJlZ2luUG9zID0gYmVnaW47Ci19Ci0KLXZvaWQgQ0ZYX0VkaXRfU2VsZWN0OjpTZXRFbmRQb3MoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGVuZCkgewotICBFbmRQb3MgPSBlbmQ7Ci19Ci0KLWJvb2wgQ0ZYX0VkaXRfU2VsZWN0OjpJc0V4aXN0KCkgY29uc3QgewotICByZXR1cm4gQmVnaW5Qb3MgIT0gRW5kUG9zOwotfQotCi1DRlhfRWRpdF9SZWN0QXJyYXk6OkNGWF9FZGl0X1JlY3RBcnJheSgpIHt9Ci0KLUNGWF9FZGl0X1JlY3RBcnJheTo6fkNGWF9FZGl0X1JlY3RBcnJheSgpIHt9Ci0KLXZvaWQgQ0ZYX0VkaXRfUmVjdEFycmF5OjpDbGVhcigpIHsKLSAgbV9SZWN0cy5jbGVhcigpOwotfQotCi12b2lkIENGWF9FZGl0X1JlY3RBcnJheTo6QWRkKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIHsKLSAgLy8gY2hlY2sgZm9yIG92ZXJsYXBwZWQgYXJlYQotICBmb3IgKGNvbnN0IGF1dG8mIHBSZWN0IDogbV9SZWN0cykgewotICAgIGlmIChwUmVjdCAmJiBwUmVjdC0+Q29udGFpbnMocmVjdCkpCi0gICAgICByZXR1cm47Ci0gIH0KLSAgbV9SZWN0cy5wdXNoX2JhY2socGRmaXVtOjpNYWtlVW5pcXVlPENGWF9GbG9hdFJlY3Q+KHJlY3QpKTsKLX0KLQotaW50MzJfdCBDRlhfRWRpdF9SZWN0QXJyYXk6OkdldFNpemUoKSBjb25zdCB7Ci0gIHJldHVybiBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fUmVjdHMpOwotfQotCi1DRlhfRmxvYXRSZWN0KiBDRlhfRWRpdF9SZWN0QXJyYXk6OkdldEF0KGludDMyX3QgbkluZGV4KSBjb25zdCB7Ci0gIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBHZXRTaXplKCkpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgcmV0dXJuIG1fUmVjdHNbbkluZGV4XS5nZXQoKTsKLX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnhlZGl0L2Z4ZXRfZWRpdC5oIGIvZnBkZnNkay9meGVkaXQvZnhldF9lZGl0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiODNhZjIuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9meGVkaXQvZnhldF9lZGl0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NDUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZQREZTREtfRlhFRElUX0ZYRVRfRURJVF9IXwotI2RlZmluZSBGUERGU0RLX0ZYRURJVF9GWEVUX0VESVRfSF8KLQotI2luY2x1ZGUgPGRlcXVlPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3B2dF9zZWNwcm9wcy5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcHZ0X3dvcmRwcm9wcy5oIgotI2luY2x1ZGUgImZwZGZzZGsvZnhlZGl0L2Z4X2VkaXQuaCIKLQotY2xhc3MgQ0ZGTF9Gb3JtRmlsbGVyOwotY2xhc3MgQ0ZYX0VkaXQ7Ci1jbGFzcyBDRlhfRWRpdF9JdGVyYXRvcjsKLWNsYXNzIENGWF9FZGl0X1Byb3ZpZGVyOwotY2xhc3MgQ0ZYX1JlbmRlckRldmljZTsKLWNsYXNzIENGWF9TeXN0ZW1IYW5kbGVyOwotY2xhc3MgQ1BERl9QYWdlT2JqZWN0SG9sZGVyOwotY2xhc3MgQ1BERl9UZXh0T2JqZWN0OwotY2xhc3MgQ1BXTF9FZGl0OwotY2xhc3MgQ1BXTF9FZGl0Q3RybDsKLQotY2xhc3MgSUZYX0VkaXRfVW5kb0l0ZW07Ci0KLXN0cnVjdCBDRlhfRWRpdF9MaW5lUmVjdCB7Ci0gIENGWF9FZGl0X0xpbmVSZWN0KGNvbnN0IENQVlRfV29yZFJhbmdlJiB3ckxpbmUsIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjTGluZSkKLSAgICAgIDogbV93ckxpbmUod3JMaW5lKSwgbV9yY0xpbmUocmNMaW5lKSB7fQotCi0gIENQVlRfV29yZFJhbmdlIG1fd3JMaW5lOwotICBDRlhfRmxvYXRSZWN0IG1fcmNMaW5lOwotfTsKLQotY2xhc3MgQ0ZYX0VkaXRfTGluZVJlY3RBcnJheSB7Ci0gcHVibGljOgotICBDRlhfRWRpdF9MaW5lUmVjdEFycmF5KCk7Ci0gIHZpcnR1YWwgfkNGWF9FZGl0X0xpbmVSZWN0QXJyYXkoKTsKLQotICB2b2lkIG9wZXJhdG9yPShDRlhfRWRpdF9MaW5lUmVjdEFycmF5JiYgcmVjdHMpOwotICB2b2lkIEFkZChjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3JMaW5lLCBjb25zdCBDRlhfRmxvYXRSZWN0JiByY0xpbmUpOwotCi0gIGludDMyX3QgR2V0U2l6ZSgpIGNvbnN0OwotICBDRlhfRWRpdF9MaW5lUmVjdCogR2V0QXQoaW50MzJfdCBuSW5kZXgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWF9FZGl0X0xpbmVSZWN0Pj4gbV9MaW5lUmVjdHM7Ci19OwotCi1jbGFzcyBDRlhfRWRpdF9SZWN0QXJyYXkgewotIHB1YmxpYzoKLSAgQ0ZYX0VkaXRfUmVjdEFycmF5KCk7Ci0gIHZpcnR1YWwgfkNGWF9FZGl0X1JlY3RBcnJheSgpOwotCi0gIHZvaWQgQ2xlYXIoKTsKLSAgdm9pZCBBZGQoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCk7Ci0KLSAgaW50MzJfdCBHZXRTaXplKCkgY29uc3Q7Ci0gIENGWF9GbG9hdFJlY3QqIEdldEF0KGludDMyX3QgbkluZGV4KSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhfRmxvYXRSZWN0Pj4gbV9SZWN0czsKLX07Ci0KLWNsYXNzIENGWF9FZGl0X1JlZnJlc2ggewotIHB1YmxpYzoKLSAgQ0ZYX0VkaXRfUmVmcmVzaCgpOwotICB2aXJ0dWFsIH5DRlhfRWRpdF9SZWZyZXNoKCk7Ci0KLSAgdm9pZCBCZWdpblJlZnJlc2goKTsKLSAgdm9pZCBQdXNoKGNvbnN0IENQVlRfV29yZFJhbmdlJiBsaW5lcmFuZ2UsIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpOwotICB2b2lkIE5vQW5hbHlzZSgpOwotICB2b2lkIEFkZFJlZnJlc2goY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCk7Ci0gIGNvbnN0IENGWF9FZGl0X1JlY3RBcnJheSogR2V0UmVmcmVzaFJlY3RzKCkgY29uc3Q7Ci0gIHZvaWQgRW5kUmVmcmVzaCgpOwotCi0gcHJpdmF0ZToKLSAgQ0ZYX0VkaXRfTGluZVJlY3RBcnJheSBtX05ld0xpbmVSZWN0czsKLSAgQ0ZYX0VkaXRfTGluZVJlY3RBcnJheSBtX09sZExpbmVSZWN0czsKLSAgQ0ZYX0VkaXRfUmVjdEFycmF5IG1fUmVmcmVzaFJlY3RzOwotfTsKLQotY2xhc3MgQ0ZYX0VkaXRfU2VsZWN0IHsKLSBwdWJsaWM6Ci0gIENGWF9FZGl0X1NlbGVjdCgpOwotICBDRlhfRWRpdF9TZWxlY3QoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGJlZ2luLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgZW5kKTsKLSAgZXhwbGljaXQgQ0ZYX0VkaXRfU2VsZWN0KGNvbnN0IENQVlRfV29yZFJhbmdlJiByYW5nZSk7Ci0KLSAgdm9pZCBEZWZhdWx0KCk7Ci0gIHZvaWQgU2V0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBiZWdpbiwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGVuZCk7Ci0gIHZvaWQgU2V0QmVnaW5Qb3MoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGJlZ2luKTsKLSAgdm9pZCBTZXRFbmRQb3MoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGVuZCk7Ci0KLSAgQ1BWVF9Xb3JkUmFuZ2UgQ29udmVydFRvV29yZFJhbmdlKCkgY29uc3Q7Ci0gIGJvb2wgSXNFeGlzdCgpIGNvbnN0OwotCi0gIENQVlRfV29yZFBsYWNlIEJlZ2luUG9zOwotICBDUFZUX1dvcmRQbGFjZSBFbmRQb3M7Ci19OwotCi1jbGFzcyBDRlhfRWRpdF9VbmRvIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENGWF9FZGl0X1VuZG8oaW50MzJfdCBuQnVmc2l6ZSk7Ci0gIHZpcnR1YWwgfkNGWF9FZGl0X1VuZG8oKTsKLQotICB2b2lkIEFkZEl0ZW0oc3RkOjp1bmlxdWVfcHRyPElGWF9FZGl0X1VuZG9JdGVtPiBwSXRlbSk7Ci0gIHZvaWQgVW5kbygpOwotICB2b2lkIFJlZG8oKTsKLSAgYm9vbCBDYW5VbmRvKCkgY29uc3Q7Ci0gIGJvb2wgQ2FuUmVkbygpIGNvbnN0OwotICBib29sIElzTW9kaWZpZWQoKSBjb25zdDsKLSAgdm9pZCBSZXNldCgpOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBSZW1vdmVIZWFkcygpOwotICB2b2lkIFJlbW92ZVRhaWxzKCk7Ci0KLSAgc3RkOjpkZXF1ZTxzdGQ6OnVuaXF1ZV9wdHI8SUZYX0VkaXRfVW5kb0l0ZW0+PiBtX1VuZG9JdGVtU3RhY2s7Ci0gIHNpemVfdCBtX25DdXJVbmRvUG9zOwotICBzaXplX3QgbV9uQnVmU2l6ZTsKLSAgYm9vbCBtX2JNb2RpZmllZDsKLSAgYm9vbCBtX2JWaXJnaW47Ci0gIGJvb2wgbV9iV29ya2luZzsKLX07Ci0KLWNsYXNzIElGWF9FZGl0X1VuZG9JdGVtIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfklGWF9FZGl0X1VuZG9JdGVtKCkge30KLQotICB2aXJ0dWFsIHZvaWQgVW5kbygpID0gMDsKLSAgdmlydHVhbCB2b2lkIFJlZG8oKSA9IDA7Ci0gIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0VW5kb1RpdGxlKCkgY29uc3QgPSAwOwotfTsKLQotY2xhc3MgQ0ZYX0VkaXRfVW5kb0l0ZW0gOiBwdWJsaWMgSUZYX0VkaXRfVW5kb0l0ZW0gewotIHB1YmxpYzoKLSAgQ0ZYX0VkaXRfVW5kb0l0ZW0oKTsKLSAgfkNGWF9FZGl0X1VuZG9JdGVtKCkgb3ZlcnJpZGU7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0VW5kb1RpdGxlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTZXRGaXJzdChib29sIGJGaXJzdCk7Ci0gIHZvaWQgU2V0TGFzdChib29sIGJMYXN0KTsKLSAgYm9vbCBJc0xhc3QoKTsKLQotIHByaXZhdGU6Ci0gIGJvb2wgbV9iRmlyc3Q7Ci0gIGJvb2wgbV9iTGFzdDsKLX07Ci0KLWNsYXNzIENGWF9FZGl0X0dyb3VwVW5kb0l0ZW0gOiBwdWJsaWMgSUZYX0VkaXRfVW5kb0l0ZW0gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0ZYX0VkaXRfR3JvdXBVbmRvSXRlbShjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RpdGxlKTsKLSAgfkNGWF9FZGl0X0dyb3VwVW5kb0l0ZW0oKSBvdmVycmlkZTsKLQotICAvLyBJRlhfRWRpdF9VbmRvSXRlbQotICB2b2lkIFVuZG8oKSBvdmVycmlkZTsKLSAgdm9pZCBSZWRvKCkgb3ZlcnJpZGU7Ci0gIENGWF9XaWRlU3RyaW5nIEdldFVuZG9UaXRsZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZvaWQgQWRkVW5kb0l0ZW0oc3RkOjp1bmlxdWVfcHRyPENGWF9FZGl0X1VuZG9JdGVtPiBwVW5kb0l0ZW0pOwotICB2b2lkIFVwZGF0ZUl0ZW1zKCk7Ci0KLSBwcml2YXRlOgotICBDRlhfV2lkZVN0cmluZyBtX3NUaXRsZTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWF9FZGl0X1VuZG9JdGVtPj4gbV9JdGVtczsKLX07Ci0KLWNsYXNzIENGWEVVX0luc2VydFdvcmQgOiBwdWJsaWMgQ0ZYX0VkaXRfVW5kb0l0ZW0gewotIHB1YmxpYzoKLSAgQ0ZYRVVfSW5zZXJ0V29yZChDRlhfRWRpdCogcEVkaXQsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwTmV3UGxhY2UsCi0gICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd29yZCwKLSAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMqIHBXb3JkUHJvcHMpOwotICB+Q0ZYRVVfSW5zZXJ0V29yZCgpIG92ZXJyaWRlOwotCi0gIC8vIENGWF9FZGl0X1VuZG9JdGVtCi0gIHZvaWQgUmVkbygpIG92ZXJyaWRlOwotICB2b2lkIFVuZG8oKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIENGWF9FZGl0KiBtX3BFZGl0OwotCi0gIENQVlRfV29yZFBsYWNlIG1fd3BPbGQ7Ci0gIENQVlRfV29yZFBsYWNlIG1fd3BOZXc7Ci0gIHVpbnQxNl90IG1fV29yZDsKLSAgaW50MzJfdCBtX25DaGFyc2V0OwotICBDUFZUX1dvcmRQcm9wcyBtX1dvcmRQcm9wczsKLX07Ci0KLWNsYXNzIENGWEVVX0luc2VydFJldHVybiA6IHB1YmxpYyBDRlhfRWRpdF9VbmRvSXRlbSB7Ci0gcHVibGljOgotICBDRlhFVV9JbnNlcnRSZXR1cm4oQ0ZYX0VkaXQqIHBFZGl0LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMqIHBTZWNQcm9wcywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzKTsKLSAgfkNGWEVVX0luc2VydFJldHVybigpIG92ZXJyaWRlOwotCi0gIC8vIENGWF9FZGl0X1VuZG9JdGVtCi0gIHZvaWQgUmVkbygpIG92ZXJyaWRlOwotICB2b2lkIFVuZG8oKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIENGWF9FZGl0KiBtX3BFZGl0OwotCi0gIENQVlRfV29yZFBsYWNlIG1fd3BPbGQ7Ci0gIENQVlRfV29yZFBsYWNlIG1fd3BOZXc7Ci0gIENQVlRfU2VjUHJvcHMgbV9TZWNQcm9wczsKLSAgQ1BWVF9Xb3JkUHJvcHMgbV9Xb3JkUHJvcHM7Ci19OwotCi1jbGFzcyBDRlhFVV9CYWNrc3BhY2UgOiBwdWJsaWMgQ0ZYX0VkaXRfVW5kb0l0ZW0gewotIHB1YmxpYzoKLSAgQ0ZYRVVfQmFja3NwYWNlKENGWF9FZGl0KiBwRWRpdCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE9sZFBsYWNlLAotICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwTmV3UGxhY2UsCi0gICAgICAgICAgICAgICAgICB1aW50MTZfdCB3b3JkLAotICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9TZWNQcm9wcyYgU2VjUHJvcHMsCi0gICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyYgV29yZFByb3BzKTsKLSAgfkNGWEVVX0JhY2tzcGFjZSgpIG92ZXJyaWRlOwotCi0gIC8vIENGWF9FZGl0X1VuZG9JdGVtCi0gIHZvaWQgUmVkbygpIG92ZXJyaWRlOwotICB2b2lkIFVuZG8oKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIENGWF9FZGl0KiBtX3BFZGl0OwotCi0gIENQVlRfV29yZFBsYWNlIG1fd3BPbGQ7Ci0gIENQVlRfV29yZFBsYWNlIG1fd3BOZXc7Ci0gIHVpbnQxNl90IG1fV29yZDsKLSAgaW50MzJfdCBtX25DaGFyc2V0OwotICBDUFZUX1NlY1Byb3BzIG1fU2VjUHJvcHM7Ci0gIENQVlRfV29yZFByb3BzIG1fV29yZFByb3BzOwotfTsKLQotY2xhc3MgQ0ZYRVVfRGVsZXRlIDogcHVibGljIENGWF9FZGl0X1VuZG9JdGVtIHsKLSBwdWJsaWM6Ci0gIENGWEVVX0RlbGV0ZShDRlhfRWRpdCogcEVkaXQsCi0gICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BPbGRQbGFjZSwKLSAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE5ld1BsYWNlLAotICAgICAgICAgICAgICAgdWludDE2X3Qgd29yZCwKLSAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKLSAgICAgICAgICAgICAgIGNvbnN0IENQVlRfU2VjUHJvcHMmIFNlY1Byb3BzLAotICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMmIFdvcmRQcm9wcywKLSAgICAgICAgICAgICAgIGJvb2wgYlNlY0VuZCk7Ci0gIH5DRlhFVV9EZWxldGUoKSBvdmVycmlkZTsKLQotICAvLyBDRlhfRWRpdF9VbmRvSXRlbQotICB2b2lkIFJlZG8oKSBvdmVycmlkZTsKLSAgdm9pZCBVbmRvKCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBDRlhfRWRpdCogbV9wRWRpdDsKLQotICBDUFZUX1dvcmRQbGFjZSBtX3dwT2xkOwotICBDUFZUX1dvcmRQbGFjZSBtX3dwTmV3OwotICB1aW50MTZfdCBtX1dvcmQ7Ci0gIGludDMyX3QgbV9uQ2hhcnNldDsKLSAgQ1BWVF9TZWNQcm9wcyBtX1NlY1Byb3BzOwotICBDUFZUX1dvcmRQcm9wcyBtX1dvcmRQcm9wczsKLSAgYm9vbCBtX2JTZWNFbmQ7Ci19OwotCi1jbGFzcyBDRlhFVV9DbGVhciA6IHB1YmxpYyBDRlhfRWRpdF9VbmRvSXRlbSB7Ci0gcHVibGljOgotICBDRlhFVV9DbGVhcihDRlhfRWRpdCogcEVkaXQsCi0gICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3clNlbCwKLSAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3VGV4dCk7Ci0gIH5DRlhFVV9DbGVhcigpIG92ZXJyaWRlOwotCi0gIC8vIENGWF9FZGl0X1VuZG9JdGVtCi0gIHZvaWQgUmVkbygpIG92ZXJyaWRlOwotICB2b2lkIFVuZG8oKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIENGWF9FZGl0KiBtX3BFZGl0OwotCi0gIENQVlRfV29yZFJhbmdlIG1fd3JTZWw7Ci0gIENGWF9XaWRlU3RyaW5nIG1fc3dUZXh0OwotfTsKLQotY2xhc3MgQ0ZYRVVfSW5zZXJ0VGV4dCA6IHB1YmxpYyBDRlhfRWRpdF9VbmRvSXRlbSB7Ci0gcHVibGljOgotICBDRlhFVV9JbnNlcnRUZXh0KENGWF9FZGl0KiBwRWRpdCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BPbGRQbGFjZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dUZXh0LAotICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCk7Ci0gIH5DRlhFVV9JbnNlcnRUZXh0KCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ0ZYX0VkaXRfVW5kb0l0ZW0KLSAgdm9pZCBSZWRvKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgVW5kbygpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgQ0ZYX0VkaXQqIG1fcEVkaXQ7Ci0KLSAgQ1BWVF9Xb3JkUGxhY2UgbV93cE9sZDsKLSAgQ1BWVF9Xb3JkUGxhY2UgbV93cE5ldzsKLSAgQ0ZYX1dpZGVTdHJpbmcgbV9zd1RleHQ7Ci0gIGludDMyX3QgbV9uQ2hhcnNldDsKLX07Ci0KLWNsYXNzIENGWF9FZGl0IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRFZGl0QXBwZWFyYW5jZVN0cmVhbShDRlhfRWRpdCogcEVkaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJDb250aW51b3VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgU3ViV29yZCk7Ci0gIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRTZWxlY3RBcHBlYXJhbmNlU3RyZWFtKENGWF9FZGl0KiBwRWRpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UpOwotICBzdGF0aWMgdm9pZCBEcmF3RWRpdChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIENGWF9FZGl0KiBwRWRpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09MT1JSRUYgY3JUZXh0RmlsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNDbGlwLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICBDRkZMX0Zvcm1GaWxsZXIqIHBGRkxEYXRhKTsKLQotICBDRlhfRWRpdCgpOwotICB+Q0ZYX0VkaXQoKTsKLQotICB2b2lkIFNldEZvbnRNYXAoSVBWVF9Gb250TWFwKiBwRm9udE1hcCk7Ci0gIHZvaWQgU2V0Tm90aWZ5KENQV0xfRWRpdEN0cmwqIHBOb3RpZnkpOwotICB2b2lkIFNldE9wck5vdGlmeShDUFdMX0VkaXQqIHBPcHJOb3RpZnkpOwotCi0gIC8vIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIHRoZSBjb250ZW50cy4gU2hvdWxkIG5vdCBiZSByZWxlYXNlZC4KLSAgQ0ZYX0VkaXRfSXRlcmF0b3IqIEdldEl0ZXJhdG9yKCk7Ci0gIElQVlRfRm9udE1hcCogR2V0Rm9udE1hcCgpOwotICB2b2lkIEluaXRpYWxpemUoKTsKLQotICAvLyBTZXQgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGV4dCBhcmVhLgotICB2b2lkIFNldFBsYXRlUmVjdChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KTsKLSAgdm9pZCBTZXRTY3JvbGxQb3MoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOwotCi0gIC8vIFNldCB0aGUgaG9yaXpvbnRhbCB0ZXh0IGFsaWdubWVudC4gKG5Gb3JtYXQgWzA6bGVmdCwgMTptaWRkbGUsIDI6cmlnaHRdKQotICB2b2lkIFNldEFsaWdubWVudEgoaW50MzJfdCBuRm9ybWF0LCBib29sIGJQYWludCk7Ci0gIC8vIFNldCB0aGUgdmVydGljYWwgdGV4dCBhbGlnbm1lbnQuIChuRm9ybWF0IFswOmxlZnQsIDE6bWlkZGxlLCAyOnJpZ2h0XSkKLSAgdm9pZCBTZXRBbGlnbm1lbnRWKGludDMyX3QgbkZvcm1hdCwgYm9vbCBiUGFpbnQpOwotCi0gIC8vIFNldCB0aGUgc3Vic3RpdHV0aW9uIGNoYXJhY3RlciBmb3IgaGlkZGVuIHRleHQuCi0gIHZvaWQgU2V0UGFzc3dvcmRDaGFyKHVpbnQxNl90IHdTdWJXb3JkLCBib29sIGJQYWludCk7Ci0KLSAgLy8gU2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB3b3JkcyBpbiB0aGUgdGV4dC4KLSAgdm9pZCBTZXRMaW1pdENoYXIoaW50MzJfdCBuTGltaXRDaGFyKTsKLSAgdm9pZCBTZXRDaGFyQXJyYXkoaW50MzJfdCBuQ2hhckFycmF5KTsKLSAgdm9pZCBTZXRDaGFyU3BhY2UoRlhfRkxPQVQgZkNoYXJTcGFjZSk7Ci0gIHZvaWQgU2V0TXVsdGlMaW5lKGJvb2wgYk11bHRpTGluZSwgYm9vbCBiUGFpbnQpOwotICB2b2lkIFNldEF1dG9SZXR1cm4oYm9vbCBiQXV0bywgYm9vbCBiUGFpbnQpOwotICB2b2lkIFNldEF1dG9Gb250U2l6ZShib29sIGJBdXRvLCBib29sIGJQYWludCk7Ci0gIHZvaWQgU2V0QXV0b1Njcm9sbChib29sIGJBdXRvLCBib29sIGJQYWludCk7Ci0gIHZvaWQgU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKLSAgdm9pZCBTZXRUZXh0T3ZlcmZsb3coYm9vbCBiQWxsb3dlZCwgYm9vbCBiUGFpbnQpOwotICB2b2lkIE9uTW91c2VEb3duKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCBib29sIGJTaGlmdCwgYm9vbCBiQ3RybCk7Ci0gIHZvaWQgT25Nb3VzZU1vdmUoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKTsKLSAgdm9pZCBPblZLX1VQKGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKTsKLSAgdm9pZCBPblZLX0RPV04oYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpOwotICB2b2lkIE9uVktfTEVGVChib29sIGJTaGlmdCwgYm9vbCBiQ3RybCk7Ci0gIHZvaWQgT25WS19SSUdIVChib29sIGJTaGlmdCwgYm9vbCBiQ3RybCk7Ci0gIHZvaWQgT25WS19IT01FKGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKTsKLSAgdm9pZCBPblZLX0VORChib29sIGJTaGlmdCwgYm9vbCBiQ3RybCk7Ci0gIHZvaWQgU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RleHQpOwotICBib29sIEluc2VydFdvcmQodWludDE2X3Qgd29yZCwgaW50MzJfdCBjaGFyc2V0KTsKLSAgYm9vbCBJbnNlcnRSZXR1cm4oKTsKLSAgYm9vbCBCYWNrc3BhY2UoKTsKLSAgYm9vbCBEZWxldGUoKTsKLSAgYm9vbCBDbGVhcigpOwotICBib29sIEluc2VydFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNUZXh0LCBpbnQzMl90IGNoYXJzZXQpOwotICBib29sIFJlZG8oKTsKLSAgYm9vbCBVbmRvKCk7Ci0gIGludDMyX3QgV29yZFBsYWNlVG9Xb3JkSW5kZXgoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdDsKLSAgQ1BWVF9Xb3JkUGxhY2UgV29yZEluZGV4VG9Xb3JkUGxhY2UoaW50MzJfdCBpbmRleCkgY29uc3Q7Ci0gIENQVlRfV29yZFBsYWNlIFNlYXJjaFdvcmRQbGFjZShjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3Q7Ci0gIGludDMyX3QgR2V0Q2FyZXQoKSBjb25zdDsKLSAgQ1BWVF9Xb3JkUGxhY2UgR2V0Q2FyZXRXb3JkUGxhY2UoKSBjb25zdDsKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0U2VsVGV4dCgpIGNvbnN0OwotICBDRlhfV2lkZVN0cmluZyBHZXRUZXh0KCkgY29uc3Q7Ci0gIEZYX0ZMT0FUIEdldEZvbnRTaXplKCkgY29uc3Q7Ci0gIHVpbnQxNl90IEdldFBhc3N3b3JkQ2hhcigpIGNvbnN0OwotICBDRlhfUG9pbnRGIEdldFNjcm9sbFBvcygpIGNvbnN0OwotICBpbnQzMl90IEdldENoYXJBcnJheSgpIGNvbnN0OwotICBDRlhfRmxvYXRSZWN0IEdldENvbnRlbnRSZWN0KCkgY29uc3Q7Ci0gIENGWF9XaWRlU3RyaW5nIEdldFJhbmdlVGV4dChjb25zdCBDUFZUX1dvcmRSYW5nZSYgcmFuZ2UpIGNvbnN0OwotICBpbnQzMl90IEdldEhvcnpTY2FsZSgpIGNvbnN0OwotICBGWF9GTE9BVCBHZXRDaGFyU3BhY2UoKSBjb25zdDsKLSAgaW50MzJfdCBHZXRUb3RhbFdvcmRzKCkgY29uc3Q7Ci0gIHZvaWQgU2V0U2VsKGludDMyX3QgblN0YXJ0Q2hhciwgaW50MzJfdCBuRW5kQ2hhcik7Ci0gIHZvaWQgR2V0U2VsKGludDMyX3QmIG5TdGFydENoYXIsIGludDMyX3QmIG5FbmRDaGFyKSBjb25zdDsKLSAgdm9pZCBTZWxlY3RBbGwoKTsKLSAgdm9pZCBTZWxlY3ROb25lKCk7Ci0gIGJvb2wgSXNTZWxlY3RlZCgpIGNvbnN0OwotICB2b2lkIFBhaW50KCk7Ci0gIHZvaWQgRW5hYmxlUmVmcmVzaChib29sIGJSZWZyZXNoKTsKLSAgdm9pZCBSZWZyZXNoV29yZFJhbmdlKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cik7Ci0gIHZvaWQgU2V0Q2FyZXQoaW50MzJfdCBuUG9zKTsKLSAgQ1BWVF9Xb3JkUmFuZ2UgR2V0V2hvbGVXb3JkUmFuZ2UoKSBjb25zdDsKLSAgQ1BWVF9Xb3JkUmFuZ2UgR2V0U2VsZWN0V29yZFJhbmdlKCkgY29uc3Q7Ci0gIHZvaWQgRW5hYmxlVW5kbyhib29sIGJVbmRvKTsKLSAgdm9pZCBFbmFibGVPcHJOb3RpZnkoYm9vbCBiTm90aWZ5KTsKLSAgYm9vbCBJc1RleHRGdWxsKCkgY29uc3Q7Ci0gIGJvb2wgSXNUZXh0T3ZlcmZsb3coKSBjb25zdDsKLSAgYm9vbCBDYW5VbmRvKCkgY29uc3Q7Ci0gIGJvb2wgQ2FuUmVkbygpIGNvbnN0OwotICBDUFZUX1dvcmRSYW5nZSBHZXRWaXNpYmxlV29yZFJhbmdlKCkgY29uc3Q7Ci0KLSAgYm9vbCBFbXB0eSgpOwotCi0gIENQVlRfV29yZFBsYWNlIERvSW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQpOwotICBpbnQzMl90IEdldENoYXJTZXRGcm9tVW5pY29kZSh1aW50MTZfdCB3b3JkLCBpbnQzMl90IG5PbGRDaGFyc2V0KTsKLQotICBpbnQzMl90IEdldFRvdGFsTGluZXMoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBDRlhfRWRpdF9JdGVyYXRvcjsKLSAgZnJpZW5kIGNsYXNzIENGWEVVX0luc2VydFdvcmQ7Ci0gIGZyaWVuZCBjbGFzcyBDRlhFVV9JbnNlcnRSZXR1cm47Ci0gIGZyaWVuZCBjbGFzcyBDRlhFVV9CYWNrc3BhY2U7Ci0gIGZyaWVuZCBjbGFzcyBDRlhFVV9EZWxldGU7Ci0gIGZyaWVuZCBjbGFzcyBDRlhFVV9DbGVhcjsKLSAgZnJpZW5kIGNsYXNzIENGWEVVX0luc2VydFRleHQ7Ci0KLSAgdm9pZCBTZXRTZWwoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGJlZ2luLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgZW5kKTsKLQotICB2b2lkIFJlYXJyYW5nZUFsbCgpOwotICB2b2lkIFJlYXJyYW5nZVBhcnQoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHJhbmdlKTsKLSAgdm9pZCBTY3JvbGxUb0NhcmV0KCk7Ci0gIHZvaWQgU2V0U2Nyb2xsSW5mbygpOwotICB2b2lkIFNldFNjcm9sbFBvc1goRlhfRkxPQVQgZngpOwotICB2b2lkIFNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpOwotICB2b2lkIFNldFNjcm9sbExpbWl0KCk7Ci0gIHZvaWQgU2V0Q29udGVudENoYW5nZWQoKTsKLQotICBib29sIEluc2VydFdvcmQodWludDE2X3Qgd29yZCwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzKiBwV29yZFByb3BzLAotICAgICAgICAgICAgICAgICAgYm9vbCBiQWRkVW5kbywKLSAgICAgICAgICAgICAgICAgIGJvb2wgYlBhaW50KTsKLSAgYm9vbCBJbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9TZWNQcm9wcyogcFNlY1Byb3BzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQcm9wcyogcFdvcmRQcm9wcywKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWRkVW5kbywKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBiUGFpbnQpOwotICBib29sIEJhY2tzcGFjZShib29sIGJBZGRVbmRvLCBib29sIGJQYWludCk7Ci0gIGJvb2wgRGVsZXRlKGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KTsKLSAgYm9vbCBDbGVhcihib29sIGJBZGRVbmRvLCBib29sIGJQYWludCk7Ci0gIGJvb2wgSW5zZXJ0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgc1RleHQsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCi0gICAgICAgICAgICAgICAgICBib29sIGJBZGRVbmRvLAotICAgICAgICAgICAgICAgICAgYm9vbCBiUGFpbnQpOwotICB2b2lkIFBhaW50SW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BPbGQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE5ldyk7Ci0KLSAgaW5saW5lIENGWF9Qb2ludEYgVlRUb0VkaXQoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIGNvbnN0OwotICBpbmxpbmUgQ0ZYX1BvaW50RiBFZGl0VG9WVChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3Q7Ci0gIGlubGluZSBDRlhfRmxvYXRSZWN0IFZUVG9FZGl0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0OwotCi0gIHZvaWQgUmVmcmVzaCgpOwotICB2b2lkIFJlZnJlc2hQdXNoTGluZVJlY3RzKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cik7Ci0KLSAgdm9pZCBTZXRDYXJldChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpOwotICB2b2lkIFNldENhcmV0SW5mbygpOwotICB2b2lkIFNldENhcmV0T3JpZ2luKCk7Ci0KLSAgdm9pZCBBZGRFZGl0VW5kb0l0ZW0oc3RkOjp1bmlxdWVfcHRyPENGWF9FZGl0X1VuZG9JdGVtPiBwRWRpdFVuZG9JdGVtKTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1ZhcmlhYmxlVGV4dD4gbV9wVlQ7Ci0gIENQV0xfRWRpdEN0cmwqIG1fcE5vdGlmeTsKLSAgQ1BXTF9FZGl0KiBtX3BPcHJOb3RpZnk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRWRpdF9Qcm92aWRlcj4gbV9wVlRQcm92aWRlcjsKLSAgQ1BWVF9Xb3JkUGxhY2UgbV93cENhcmV0OwotICBDUFZUX1dvcmRQbGFjZSBtX3dwT2xkQ2FyZXQ7Ci0gIENGWF9FZGl0X1NlbGVjdCBtX1NlbFN0YXRlOwotICBDRlhfUG9pbnRGIG1fcHRTY3JvbGxQb3M7Ci0gIENGWF9Qb2ludEYgbV9wdFJlZnJlc2hTY3JvbGxQb3M7Ci0gIGJvb2wgbV9iRW5hYmxlU2Nyb2xsOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0VkaXRfSXRlcmF0b3I+IG1fcEl0ZXJhdG9yOwotICBDRlhfRWRpdF9SZWZyZXNoIG1fUmVmcmVzaDsKLSAgQ0ZYX1BvaW50RiBtX3B0Q2FyZXQ7Ci0gIENGWF9FZGl0X1VuZG8gbV9VbmRvOwotICBpbnQzMl90IG1fbkFsaWdubWVudDsKLSAgYm9vbCBtX2JOb3RpZnlGbGFnOwotICBib29sIG1fYkVuYWJsZU92ZXJmbG93OwotICBib29sIG1fYkVuYWJsZVJlZnJlc2g7Ci0gIENGWF9GbG9hdFJlY3QgbV9yY09sZENvbnRlbnQ7Ci0gIGJvb2wgbV9iRW5hYmxlVW5kbzsKLSAgYm9vbCBtX2JPcHJOb3RpZnk7Ci0gIENGWF9FZGl0X0dyb3VwVW5kb0l0ZW0qIG1fcEdyb3VwVW5kb0l0ZW07Ci19OwotCi1jbGFzcyBDRlhfRWRpdF9JdGVyYXRvciB7Ci0gcHVibGljOgotICBDRlhfRWRpdF9JdGVyYXRvcihDRlhfRWRpdCogcEVkaXQsIENQREZfVmFyaWFibGVUZXh0OjpJdGVyYXRvciogcFZUSXRlcmF0b3IpOwotICB+Q0ZYX0VkaXRfSXRlcmF0b3IoKTsKLQotICBib29sIE5leHRXb3JkKCk7Ci0gIGJvb2wgUHJldldvcmQoKTsKLSAgYm9vbCBHZXRXb3JkKENQVlRfV29yZCYgd29yZCkgY29uc3Q7Ci0gIGJvb2wgR2V0TGluZShDUFZUX0xpbmUmIGxpbmUpIGNvbnN0OwotICBib29sIEdldFNlY3Rpb24oQ1BWVF9TZWN0aW9uJiBzZWN0aW9uKSBjb25zdDsKLSAgdm9pZCBTZXRBdChpbnQzMl90IG5Xb3JkSW5kZXgpOwotICB2b2lkIFNldEF0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSk7Ci0gIGNvbnN0IENQVlRfV29yZFBsYWNlJiBHZXRBdCgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgQ0ZYX0VkaXQqIG1fcEVkaXQ7Ci0gIENQREZfVmFyaWFibGVUZXh0OjpJdGVyYXRvciogbV9wVlRJdGVyYXRvcjsKLX07Ci0KLWNsYXNzIENGWF9FZGl0X1Byb3ZpZGVyIDogcHVibGljIENQREZfVmFyaWFibGVUZXh0OjpQcm92aWRlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDRlhfRWRpdF9Qcm92aWRlcihJUFZUX0ZvbnRNYXAqIHBGb250TWFwKTsKLSAgfkNGWF9FZGl0X1Byb3ZpZGVyKCkgb3ZlcnJpZGU7Ci0KLSAgSVBWVF9Gb250TWFwKiBHZXRGb250TWFwKCk7Ci0KLSAgLy8gQ1BERl9WYXJpYWJsZVRleHQ6OlByb3ZpZGVyOgotICBpbnQzMl90IEdldENoYXJXaWR0aChpbnQzMl90IG5Gb250SW5kZXgsIHVpbnQxNl90IHdvcmQpIG92ZXJyaWRlOwotICBpbnQzMl90IEdldFR5cGVBc2NlbnQoaW50MzJfdCBuRm9udEluZGV4KSBvdmVycmlkZTsKLSAgaW50MzJfdCBHZXRUeXBlRGVzY2VudChpbnQzMl90IG5Gb250SW5kZXgpIG92ZXJyaWRlOwotICBpbnQzMl90IEdldFdvcmRGb250SW5kZXgodWludDE2X3Qgd29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZvbnRJbmRleCkgb3ZlcnJpZGU7Ci0gIGludDMyX3QgR2V0RGVmYXVsdEZvbnRJbmRleCgpIG92ZXJyaWRlOwotICBib29sIElzTGF0aW5Xb3JkKHVpbnQxNl90IHdvcmQpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgSVBWVF9Gb250TWFwKiBtX3BGb250TWFwOwotfTsKLQotI2VuZGlmICAvLyBGUERGU0RLX0ZYRURJVF9GWEVUX0VESVRfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnhlZGl0L2Z4ZXRfbGlzdC5jcHAgYi9mcGRmc2RrL2Z4ZWRpdC9meGV0X2xpc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTg3N2M5Li4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvZnhlZGl0L2Z4ZXRfbGlzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3ODQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiZnBkZnNkay9meGVkaXQvZnhldF9saXN0LmgiCi0KLSNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3B2dF93b3JkLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9meGVkaXQvZnhldF9lZGl0LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guaCIKLQotQ0ZYX0xpc3RJdGVtOjpDRlhfTGlzdEl0ZW0oKQotICAgIDogbV9wRWRpdChuZXcgQ0ZYX0VkaXQpLAotICAgICAgbV9iU2VsZWN0ZWQoZmFsc2UpLAotICAgICAgbV9yY0xpc3RJdGVtKDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpIHsKLSAgbV9wRWRpdC0+U2V0QWxpZ25tZW50VigxLCB0cnVlKTsKLSAgbV9wRWRpdC0+SW5pdGlhbGl6ZSgpOwotfQotCi1DRlhfTGlzdEl0ZW06On5DRlhfTGlzdEl0ZW0oKSB7Ci19Ci0KLXZvaWQgQ0ZYX0xpc3RJdGVtOjpTZXRGb250TWFwKElQVlRfRm9udE1hcCogcEZvbnRNYXApIHsKLSAgbV9wRWRpdC0+U2V0Rm9udE1hcChwRm9udE1hcCk7Ci19Ci0KLUNGWF9FZGl0KiBDRlhfTGlzdEl0ZW06OkdldEVkaXQoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BFZGl0LmdldCgpOwotfQotCi1DRlhfRWRpdF9JdGVyYXRvciogQ0ZYX0xpc3RJdGVtOjpHZXRJdGVyYXRvcigpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcEVkaXQtPkdldEl0ZXJhdG9yKCk7Ci19Ci0KLXZvaWQgQ0ZYX0xpc3RJdGVtOjpTZXRSZWN0KGNvbnN0IENMU1RfUmVjdCYgcmVjdCkgewotICBtX3JjTGlzdEl0ZW0gPSByZWN0OwotfQotCi1DTFNUX1JlY3QgQ0ZYX0xpc3RJdGVtOjpHZXRSZWN0KCkgY29uc3QgewotICByZXR1cm4gbV9yY0xpc3RJdGVtOwotfQotCi1ib29sIENGWF9MaXN0SXRlbTo6SXNTZWxlY3RlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fYlNlbGVjdGVkOwotfQotCi12b2lkIENGWF9MaXN0SXRlbTo6U2V0U2VsZWN0KGJvb2wgYlNlbGVjdGVkKSB7Ci0gIG1fYlNlbGVjdGVkID0gYlNlbGVjdGVkOwotfQotCi12b2lkIENGWF9MaXN0SXRlbTo6U2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgdGV4dCkgewotICBtX3BFZGl0LT5TZXRUZXh0KHRleHQpOwotfQotCi12b2lkIENGWF9MaXN0SXRlbTo6U2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSB7Ci0gIG1fcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7Ci19Ci0KLUZYX0ZMT0FUIENGWF9MaXN0SXRlbTo6R2V0SXRlbUhlaWdodCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcEVkaXQtPkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7Ci19Ci0KLXVpbnQxNl90IENGWF9MaXN0SXRlbTo6R2V0Rmlyc3RDaGFyKCkgY29uc3QgewotICBDUFZUX1dvcmQgd29yZDsKLSAgQ0ZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IEdldEl0ZXJhdG9yKCk7Ci0gIHBJdGVyYXRvci0+U2V0QXQoMSk7Ci0gIHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKTsKLSAgcmV0dXJuIHdvcmQuV29yZDsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ0ZYX0xpc3RJdGVtOjpHZXRUZXh0KCkgY29uc3QgewotICByZXR1cm4gbV9wRWRpdC0+R2V0VGV4dCgpOwotfQotCi1DRlhfTGlzdENvbnRhaW5lcjo6Q0ZYX0xpc3RDb250YWluZXIoKSB7fQotCi1DRlhfTGlzdENvbnRhaW5lcjo6fkNGWF9MaXN0Q29udGFpbmVyKCkge30KLQotdm9pZCBDRlhfTGlzdENvbnRhaW5lcjo6U2V0UGxhdGVSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIHsKLSAgbV9yY1BsYXRlID0gcmVjdDsKLX0KLQotQ1BMU1RfU2VsZWN0OjpDUExTVF9TZWxlY3QoKSB7fQotCi1DUExTVF9TZWxlY3Q6On5DUExTVF9TZWxlY3QoKSB7Ci0gIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FJdGVtcy5HZXRTaXplKCk7IGkgPCBzejsgaSsrKQotICAgIGRlbGV0ZSBtX2FJdGVtcy5HZXRBdChpKTsKLQotICBtX2FJdGVtcy5SZW1vdmVBbGwoKTsKLX0KLQotdm9pZCBDUExTVF9TZWxlY3Q6OkFkZChpbnQzMl90IG5JdGVtSW5kZXgpIHsKLSAgaW50MzJfdCBuSW5kZXggPSBGaW5kKG5JdGVtSW5kZXgpOwotCi0gIGlmIChuSW5kZXggPCAwKSB7Ci0gICAgbV9hSXRlbXMuQWRkKG5ldyBDUExTVF9TZWxlY3RfSXRlbShuSXRlbUluZGV4LCAxKSk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKENQTFNUX1NlbGVjdF9JdGVtKiBwSXRlbSA9IG1fYUl0ZW1zLkdldEF0KG5JbmRleCkpIHsKLSAgICAgIHBJdGVtLT5uU3RhdGUgPSAxOwotICAgIH0KLSAgfQotfQotCi12b2lkIENQTFNUX1NlbGVjdDo6QWRkKGludDMyX3QgbkJlZ2luSW5kZXgsIGludDMyX3QgbkVuZEluZGV4KSB7Ci0gIGlmIChuQmVnaW5JbmRleCA+IG5FbmRJbmRleCkgewotICAgIGludDMyX3QgblRlbXAgPSBuRW5kSW5kZXg7Ci0gICAgbkVuZEluZGV4ID0gbkJlZ2luSW5kZXg7Ci0gICAgbkJlZ2luSW5kZXggPSBuVGVtcDsKLSAgfQotCi0gIGZvciAoaW50MzJfdCBpID0gbkJlZ2luSW5kZXg7IGkgPD0gbkVuZEluZGV4OyBpKyspCi0gICAgQWRkKGkpOwotfQotCi12b2lkIENQTFNUX1NlbGVjdDo6U3ViKGludDMyX3Qgbkl0ZW1JbmRleCkgewotICBmb3IgKGludDMyX3QgaSA9IG1fYUl0ZW1zLkdldFNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgaWYgKENQTFNUX1NlbGVjdF9JdGVtKiBwSXRlbSA9IG1fYUl0ZW1zLkdldEF0KGkpKQotICAgICAgaWYgKHBJdGVtLT5uSXRlbUluZGV4ID09IG5JdGVtSW5kZXgpCi0gICAgICAgIHBJdGVtLT5uU3RhdGUgPSAtMTsKLSAgfQotfQotCi12b2lkIENQTFNUX1NlbGVjdDo6U3ViKGludDMyX3QgbkJlZ2luSW5kZXgsIGludDMyX3QgbkVuZEluZGV4KSB7Ci0gIGlmIChuQmVnaW5JbmRleCA+IG5FbmRJbmRleCkgewotICAgIGludDMyX3QgblRlbXAgPSBuRW5kSW5kZXg7Ci0gICAgbkVuZEluZGV4ID0gbkJlZ2luSW5kZXg7Ci0gICAgbkJlZ2luSW5kZXggPSBuVGVtcDsKLSAgfQotCi0gIGZvciAoaW50MzJfdCBpID0gbkJlZ2luSW5kZXg7IGkgPD0gbkVuZEluZGV4OyBpKyspCi0gICAgU3ViKGkpOwotfQotCi1pbnQzMl90IENQTFNUX1NlbGVjdDo6RmluZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0IHsKLSAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYUl0ZW1zLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKLSAgICBpZiAoQ1BMU1RfU2VsZWN0X0l0ZW0qIHBJdGVtID0gbV9hSXRlbXMuR2V0QXQoaSkpIHsKLSAgICAgIGlmIChwSXRlbS0+bkl0ZW1JbmRleCA9PSBuSXRlbUluZGV4KQotICAgICAgICByZXR1cm4gaTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gLTE7Ci19Ci0KLWJvb2wgQ1BMU1RfU2VsZWN0OjpJc0V4aXN0KGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3QgewotICByZXR1cm4gRmluZChuSXRlbUluZGV4KSA+PSAwOwotfQotCi1pbnQzMl90IENQTFNUX1NlbGVjdDo6R2V0Q291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBtX2FJdGVtcy5HZXRTaXplKCk7Ci19Ci0KLWludDMyX3QgQ1BMU1RfU2VsZWN0OjpHZXRJdGVtSW5kZXgoaW50MzJfdCBuSW5kZXgpIGNvbnN0IHsKLSAgaWYgKG5JbmRleCA+PSAwICYmIG5JbmRleCA8IG1fYUl0ZW1zLkdldFNpemUoKSkKLSAgICBpZiAoQ1BMU1RfU2VsZWN0X0l0ZW0qIHBJdGVtID0gbV9hSXRlbXMuR2V0QXQobkluZGV4KSkKLSAgICAgIHJldHVybiBwSXRlbS0+bkl0ZW1JbmRleDsKLQotICByZXR1cm4gLTE7Ci19Ci0KLWludDMyX3QgQ1BMU1RfU2VsZWN0OjpHZXRTdGF0ZShpbnQzMl90IG5JbmRleCkgY29uc3QgewotICBpZiAobkluZGV4ID49IDAgJiYgbkluZGV4IDwgbV9hSXRlbXMuR2V0U2l6ZSgpKQotICAgIGlmIChDUExTVF9TZWxlY3RfSXRlbSogcEl0ZW0gPSBtX2FJdGVtcy5HZXRBdChuSW5kZXgpKQotICAgICAgcmV0dXJuIHBJdGVtLT5uU3RhdGU7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQ1BMU1RfU2VsZWN0OjpEZXNlbGVjdEFsbCgpIHsKLSAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fYUl0ZW1zLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKLSAgICBpZiAoQ1BMU1RfU2VsZWN0X0l0ZW0qIHBJdGVtID0gbV9hSXRlbXMuR2V0QXQoaSkpIHsKLSAgICAgIHBJdGVtLT5uU3RhdGUgPSAtMTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDUExTVF9TZWxlY3Q6OkRvbmUoKSB7Ci0gIGZvciAoaW50MzJfdCBpID0gbV9hSXRlbXMuR2V0U2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICBpZiAoQ1BMU1RfU2VsZWN0X0l0ZW0qIHBJdGVtID0gbV9hSXRlbXMuR2V0QXQoaSkpIHsKLSAgICAgIGlmIChwSXRlbS0+blN0YXRlID09IC0xKSB7Ci0gICAgICAgIGRlbGV0ZSBwSXRlbTsKLSAgICAgICAgbV9hSXRlbXMuUmVtb3ZlQXQoaSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwSXRlbS0+blN0YXRlID0gMDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotQ0ZYX0xpc3RDdHJsOjpDRlhfTGlzdEN0cmwoKQotICAgIDogbV9wTm90aWZ5KG51bGxwdHIpLAotICAgICAgbV9iTm90aWZ5RmxhZyhmYWxzZSksCi0gICAgICBtX25TZWxJdGVtKC0xKSwKLSAgICAgIG1fbkZvb3RJbmRleCgtMSksCi0gICAgICBtX2JDdHJsU2VsKGZhbHNlKSwKLSAgICAgIG1fbkNhcmV0SW5kZXgoLTEpLAotICAgICAgbV9mRm9udFNpemUoMC4wZiksCi0gICAgICBtX3BGb250TWFwKG51bGxwdHIpLAotICAgICAgbV9iTXVsdGlwbGUoZmFsc2UpIHt9Ci0KLUNGWF9MaXN0Q3RybDo6fkNGWF9MaXN0Q3RybCgpIHsKLSAgRW1wdHkoKTsKLX0KLQotdm9pZCBDRlhfTGlzdEN0cmw6OlNldE5vdGlmeShDUFdMX0xpc3RfTm90aWZ5KiBwTm90aWZ5KSB7Ci0gIG1fcE5vdGlmeSA9IHBOb3RpZnk7Ci19Ci0KLUNGWF9Qb2ludEYgQ0ZYX0xpc3RDdHJsOjpJblRvT3V0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBjb25zdCB7Ci0gIENGWF9GbG9hdFJlY3QgcmNQbGF0ZSA9IEdldFBsYXRlUmVjdCgpOwotICByZXR1cm4gQ0ZYX1BvaW50Rihwb2ludC54IC0gKG1fcHRTY3JvbGxQb3MueCAtIHJjUGxhdGUubGVmdCksCi0gICAgICAgICAgICAgICAgICAgIHBvaW50LnkgLSAobV9wdFNjcm9sbFBvcy55IC0gcmNQbGF0ZS50b3ApKTsKLX0KLQotQ0ZYX1BvaW50RiBDRlhfTGlzdEN0cmw6Ok91dFRvSW4oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIGNvbnN0IHsKLSAgQ0ZYX0Zsb2F0UmVjdCByY1BsYXRlID0gR2V0UGxhdGVSZWN0KCk7Ci0gIHJldHVybiBDRlhfUG9pbnRGKHBvaW50LnggKyAobV9wdFNjcm9sbFBvcy54IC0gcmNQbGF0ZS5sZWZ0KSwKLSAgICAgICAgICAgICAgICAgICAgcG9pbnQueSArIChtX3B0U2Nyb2xsUG9zLnkgLSByY1BsYXRlLnRvcCkpOwotfQotCi1DRlhfRmxvYXRSZWN0IENGWF9MaXN0Q3RybDo6SW5Ub091dChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdCB7Ci0gIENGWF9Qb2ludEYgcHRMZWZ0Qm90dG9tID0gSW5Ub091dChDRlhfUG9pbnRGKHJlY3QubGVmdCwgcmVjdC5ib3R0b20pKTsKLSAgQ0ZYX1BvaW50RiBwdFJpZ2h0VG9wID0gSW5Ub091dChDRlhfUG9pbnRGKHJlY3QucmlnaHQsIHJlY3QudG9wKSk7Ci0gIHJldHVybiBDRlhfRmxvYXRSZWN0KHB0TGVmdEJvdHRvbS54LCBwdExlZnRCb3R0b20ueSwgcHRSaWdodFRvcC54LAotICAgICAgICAgICAgICAgICAgICAgICBwdFJpZ2h0VG9wLnkpOwotfQotCi1DRlhfRmxvYXRSZWN0IENGWF9MaXN0Q3RybDo6T3V0VG9Jbihjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdCB7Ci0gIENGWF9Qb2ludEYgcHRMZWZ0Qm90dG9tID0gT3V0VG9JbihDRlhfUG9pbnRGKHJlY3QubGVmdCwgcmVjdC5ib3R0b20pKTsKLSAgQ0ZYX1BvaW50RiBwdFJpZ2h0VG9wID0gT3V0VG9JbihDRlhfUG9pbnRGKHJlY3QucmlnaHQsIHJlY3QudG9wKSk7Ci0gIHJldHVybiBDRlhfRmxvYXRSZWN0KHB0TGVmdEJvdHRvbS54LCBwdExlZnRCb3R0b20ueSwgcHRSaWdodFRvcC54LAotICAgICAgICAgICAgICAgICAgICAgICBwdFJpZ2h0VG9wLnkpOwotfQotCi12b2lkIENGWF9MaXN0Q3RybDo6T25Nb3VzZURvd24oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ3RybCkgewotICBpbnQzMl90IG5IaXRJbmRleCA9IEdldEl0ZW1JbmRleChwb2ludCk7Ci0KLSAgaWYgKElzTXVsdGlwbGVTZWwoKSkgewotICAgIGlmIChiQ3RybCkgewotICAgICAgaWYgKElzSXRlbVNlbGVjdGVkKG5IaXRJbmRleCkpIHsKLSAgICAgICAgbV9hU2VsSXRlbXMuU3ViKG5IaXRJbmRleCk7Ci0gICAgICAgIFNlbGVjdEl0ZW1zKCk7Ci0gICAgICAgIG1fYkN0cmxTZWwgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fYVNlbEl0ZW1zLkFkZChuSGl0SW5kZXgpOwotICAgICAgICBTZWxlY3RJdGVtcygpOwotICAgICAgICBtX2JDdHJsU2VsID0gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgbV9uRm9vdEluZGV4ID0gbkhpdEluZGV4OwotICAgIH0gZWxzZSBpZiAoYlNoaWZ0KSB7Ci0gICAgICBtX2FTZWxJdGVtcy5EZXNlbGVjdEFsbCgpOwotICAgICAgbV9hU2VsSXRlbXMuQWRkKG1fbkZvb3RJbmRleCwgbkhpdEluZGV4KTsKLSAgICAgIFNlbGVjdEl0ZW1zKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1fYVNlbEl0ZW1zLkRlc2VsZWN0QWxsKCk7Ci0gICAgICBtX2FTZWxJdGVtcy5BZGQobkhpdEluZGV4KTsKLSAgICAgIFNlbGVjdEl0ZW1zKCk7Ci0KLSAgICAgIG1fbkZvb3RJbmRleCA9IG5IaXRJbmRleDsKLSAgICB9Ci0KLSAgICBTZXRDYXJldChuSGl0SW5kZXgpOwotICB9IGVsc2UgewotICAgIFNldFNpbmdsZVNlbGVjdChuSGl0SW5kZXgpOwotICB9Ci0KLSAgaWYgKCFJc0l0ZW1WaXNpYmxlKG5IaXRJbmRleCkpCi0gICAgU2Nyb2xsVG9MaXN0SXRlbShuSGl0SW5kZXgpOwotfQotCi12b2lkIENGWF9MaXN0Q3RybDo6T25Nb3VzZU1vdmUoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ3RybCkgewotICBpbnQzMl90IG5IaXRJbmRleCA9IEdldEl0ZW1JbmRleChwb2ludCk7Ci0KLSAgaWYgKElzTXVsdGlwbGVTZWwoKSkgewotICAgIGlmIChiQ3RybCkgewotICAgICAgaWYgKG1fYkN0cmxTZWwpCi0gICAgICAgIG1fYVNlbEl0ZW1zLkFkZChtX25Gb290SW5kZXgsIG5IaXRJbmRleCk7Ci0gICAgICBlbHNlCi0gICAgICAgIG1fYVNlbEl0ZW1zLlN1YihtX25Gb290SW5kZXgsIG5IaXRJbmRleCk7Ci0KLSAgICAgIFNlbGVjdEl0ZW1zKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1fYVNlbEl0ZW1zLkRlc2VsZWN0QWxsKCk7Ci0gICAgICBtX2FTZWxJdGVtcy5BZGQobV9uRm9vdEluZGV4LCBuSGl0SW5kZXgpOwotICAgICAgU2VsZWN0SXRlbXMoKTsKLSAgICB9Ci0KLSAgICBTZXRDYXJldChuSGl0SW5kZXgpOwotICB9IGVsc2UgewotICAgIFNldFNpbmdsZVNlbGVjdChuSGl0SW5kZXgpOwotICB9Ci0KLSAgaWYgKCFJc0l0ZW1WaXNpYmxlKG5IaXRJbmRleCkpCi0gICAgU2Nyb2xsVG9MaXN0SXRlbShuSGl0SW5kZXgpOwotfQotCi12b2lkIENGWF9MaXN0Q3RybDo6T25WSyhpbnQzMl90IG5JdGVtSW5kZXgsIGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKSB7Ci0gIGlmIChJc011bHRpcGxlU2VsKCkpIHsKLSAgICBpZiAobkl0ZW1JbmRleCA+PSAwICYmIG5JdGVtSW5kZXggPCBHZXRDb3VudCgpKSB7Ci0gICAgICBpZiAoYkN0cmwpIHsKLSAgICAgIH0gZWxzZSBpZiAoYlNoaWZ0KSB7Ci0gICAgICAgIG1fYVNlbEl0ZW1zLkRlc2VsZWN0QWxsKCk7Ci0gICAgICAgIG1fYVNlbEl0ZW1zLkFkZChtX25Gb290SW5kZXgsIG5JdGVtSW5kZXgpOwotICAgICAgICBTZWxlY3RJdGVtcygpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbV9hU2VsSXRlbXMuRGVzZWxlY3RBbGwoKTsKLSAgICAgICAgbV9hU2VsSXRlbXMuQWRkKG5JdGVtSW5kZXgpOwotICAgICAgICBTZWxlY3RJdGVtcygpOwotICAgICAgICBtX25Gb290SW5kZXggPSBuSXRlbUluZGV4OwotICAgICAgfQotCi0gICAgICBTZXRDYXJldChuSXRlbUluZGV4KTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgU2V0U2luZ2xlU2VsZWN0KG5JdGVtSW5kZXgpOwotICB9Ci0KLSAgaWYgKCFJc0l0ZW1WaXNpYmxlKG5JdGVtSW5kZXgpKQotICAgIFNjcm9sbFRvTGlzdEl0ZW0obkl0ZW1JbmRleCk7Ci19Ci0KLXZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLX1VQKGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKSB7Ci0gIE9uVksoSXNNdWx0aXBsZVNlbCgpID8gR2V0Q2FyZXQoKSAtIDEgOiBHZXRTZWxlY3QoKSAtIDEsIGJTaGlmdCwgYkN0cmwpOwotfQotCi12b2lkIENGWF9MaXN0Q3RybDo6T25WS19ET1dOKGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKSB7Ci0gIE9uVksoSXNNdWx0aXBsZVNlbCgpID8gR2V0Q2FyZXQoKSArIDEgOiBHZXRTZWxlY3QoKSArIDEsIGJTaGlmdCwgYkN0cmwpOwotfQotCi12b2lkIENGWF9MaXN0Q3RybDo6T25WS19MRUZUKGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKSB7Ci0gIE9uVksoMCwgYlNoaWZ0LCBiQ3RybCk7Ci19Ci0KLXZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLX1JJR0hUKGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKSB7Ci0gIE9uVksoR2V0Q291bnQoKSAtIDEsIGJTaGlmdCwgYkN0cmwpOwotfQotCi12b2lkIENGWF9MaXN0Q3RybDo6T25WS19IT01FKGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKSB7Ci0gIE9uVksoMCwgYlNoaWZ0LCBiQ3RybCk7Ci19Ci0KLXZvaWQgQ0ZYX0xpc3RDdHJsOjpPblZLX0VORChib29sIGJTaGlmdCwgYm9vbCBiQ3RybCkgewotICBPblZLKEdldENvdW50KCkgLSAxLCBiU2hpZnQsIGJDdHJsKTsKLX0KLQotYm9vbCBDRlhfTGlzdEN0cmw6Ok9uQ2hhcih1aW50MTZfdCBuQ2hhciwgYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpIHsKLSAgaW50MzJfdCBuSW5kZXggPSBHZXRMYXN0U2VsZWN0ZWQoKTsKLSAgaW50MzJfdCBuRmluZEluZGV4ID0gRmluZE5leHQobkluZGV4LCBuQ2hhcik7Ci0KLSAgaWYgKG5GaW5kSW5kZXggIT0gbkluZGV4KSB7Ci0gICAgT25WSyhuRmluZEluZGV4LCBiU2hpZnQsIGJDdHJsKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRQbGF0ZVJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgewotICBDRlhfTGlzdENvbnRhaW5lcjo6U2V0UGxhdGVSZWN0KHJlY3QpOwotICBtX3B0U2Nyb2xsUG9zLnggPSByZWN0LmxlZnQ7Ci0gIFNldFNjcm9sbFBvcyhDRlhfUG9pbnRGKHJlY3QubGVmdCwgcmVjdC50b3ApKTsKLSAgUmVBcnJhbmdlKDApOwotICBJbnZhbGlkYXRlSXRlbSgtMSk7Ci19Ci0KLUNGWF9GbG9hdFJlY3QgQ0ZYX0xpc3RDdHJsOjpHZXRJdGVtUmVjdChpbnQzMl90IG5JbmRleCkgY29uc3QgewotICByZXR1cm4gSW5Ub091dChHZXRJdGVtUmVjdEludGVybmFsKG5JbmRleCkpOwotfQotCi1DRlhfRmxvYXRSZWN0IENGWF9MaXN0Q3RybDo6R2V0SXRlbVJlY3RJbnRlcm5hbChpbnQzMl90IG5JbmRleCkgY29uc3QgewotICBpZiAoQ0ZYX0xpc3RJdGVtKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQobkluZGV4KSkgewotICAgIENGWF9GbG9hdFJlY3QgcmNJdGVtID0gcExpc3RJdGVtLT5HZXRSZWN0KCk7Ci0gICAgcmNJdGVtLmxlZnQgPSAwLjBmOwotICAgIHJjSXRlbS5yaWdodCA9IEdldFBsYXRlUmVjdCgpLldpZHRoKCk7Ci0gICAgcmV0dXJuIElubmVyVG9PdXRlcihDTFNUX1JlY3QocmNJdGVtKSk7Ci0gIH0KLQotICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdCgpOwotfQotCi1pbnQzMl90IENGWF9MaXN0Q3RybDo6R2V0Q2FyZXQoKSBjb25zdCB7Ci0gIHJldHVybiBtX25DYXJldEluZGV4OwotfQotCi1pbnQzMl90IENGWF9MaXN0Q3RybDo6R2V0U2VsZWN0KCkgY29uc3QgewotICByZXR1cm4gbV9uU2VsSXRlbTsKLX0KLQotdm9pZCBDRlhfTGlzdEN0cmw6OkFkZFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKSB7Ci0gIEFkZEl0ZW0oc3RyKTsKLSAgUmVBcnJhbmdlKEdldENvdW50KCkgLSAxKTsKLX0KLQotdm9pZCBDRlhfTGlzdEN0cmw6OlNldE11bHRpcGxlU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCwgYm9vbCBiU2VsZWN0ZWQpIHsKLSAgaWYgKCFJc1ZhbGlkKG5JdGVtSW5kZXgpKQotICAgIHJldHVybjsKLQotICBpZiAoYlNlbGVjdGVkICE9IElzSXRlbVNlbGVjdGVkKG5JdGVtSW5kZXgpKSB7Ci0gICAgaWYgKGJTZWxlY3RlZCkgewotICAgICAgU2V0SXRlbVNlbGVjdChuSXRlbUluZGV4LCB0cnVlKTsKLSAgICAgIEludmFsaWRhdGVJdGVtKG5JdGVtSW5kZXgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBTZXRJdGVtU2VsZWN0KG5JdGVtSW5kZXgsIGZhbHNlKTsKLSAgICAgIEludmFsaWRhdGVJdGVtKG5JdGVtSW5kZXgpOwotICAgIH0KLSAgfQotfQotCi12b2lkIENGWF9MaXN0Q3RybDo6U2V0U2luZ2xlU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCkgewotICBpZiAoIUlzVmFsaWQobkl0ZW1JbmRleCkpCi0gICAgcmV0dXJuOwotCi0gIGlmIChtX25TZWxJdGVtICE9IG5JdGVtSW5kZXgpIHsKLSAgICBpZiAobV9uU2VsSXRlbSA+PSAwKSB7Ci0gICAgICBTZXRJdGVtU2VsZWN0KG1fblNlbEl0ZW0sIGZhbHNlKTsKLSAgICAgIEludmFsaWRhdGVJdGVtKG1fblNlbEl0ZW0pOwotICAgIH0KLQotICAgIFNldEl0ZW1TZWxlY3Qobkl0ZW1JbmRleCwgdHJ1ZSk7Ci0gICAgSW52YWxpZGF0ZUl0ZW0obkl0ZW1JbmRleCk7Ci0gICAgbV9uU2VsSXRlbSA9IG5JdGVtSW5kZXg7Ci0gIH0KLX0KLQotdm9pZCBDRlhfTGlzdEN0cmw6OlNldENhcmV0KGludDMyX3Qgbkl0ZW1JbmRleCkgewotICBpZiAoIUlzVmFsaWQobkl0ZW1JbmRleCkpCi0gICAgcmV0dXJuOwotCi0gIGlmIChJc011bHRpcGxlU2VsKCkpIHsKLSAgICBpbnQzMl90IG5PbGRJbmRleCA9IG1fbkNhcmV0SW5kZXg7Ci0KLSAgICBpZiAobk9sZEluZGV4ICE9IG5JdGVtSW5kZXgpIHsKLSAgICAgIG1fbkNhcmV0SW5kZXggPSBuSXRlbUluZGV4OwotICAgICAgSW52YWxpZGF0ZUl0ZW0obk9sZEluZGV4KTsKLSAgICAgIEludmFsaWRhdGVJdGVtKG5JdGVtSW5kZXgpOwotICAgIH0KLSAgfQotfQotCi12b2lkIENGWF9MaXN0Q3RybDo6SW52YWxpZGF0ZUl0ZW0oaW50MzJfdCBuSXRlbUluZGV4KSB7Ci0gIGlmIChtX3BOb3RpZnkpIHsKLSAgICBpZiAobkl0ZW1JbmRleCA9PSAtMSkgewotICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKSB7Ci0gICAgICAgIG1fYk5vdGlmeUZsYWcgPSB0cnVlOwotICAgICAgICBDRlhfRmxvYXRSZWN0IHJjUmVmcmVzaCA9IEdldFBsYXRlUmVjdCgpOwotICAgICAgICBtX3BOb3RpZnktPklPbkludmFsaWRhdGVSZWN0KCZyY1JlZnJlc2gpOwotICAgICAgICBtX2JOb3RpZnlGbGFnID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghbV9iTm90aWZ5RmxhZykgewotICAgICAgICBtX2JOb3RpZnlGbGFnID0gdHJ1ZTsKLSAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByY1JlZnJlc2ggPSBHZXRJdGVtUmVjdChuSXRlbUluZGV4KTsKLSAgICAgICAgcmNSZWZyZXNoLmxlZnQgLT0gMS4wZjsKLSAgICAgICAgcmNSZWZyZXNoLnJpZ2h0ICs9IDEuMGY7Ci0gICAgICAgIHJjUmVmcmVzaC5ib3R0b20gLT0gMS4wZjsKLSAgICAgICAgcmNSZWZyZXNoLnRvcCArPSAxLjBmOwotCi0gICAgICAgIG1fcE5vdGlmeS0+SU9uSW52YWxpZGF0ZVJlY3QoJnJjUmVmcmVzaCk7Ci0gICAgICAgIG1fYk5vdGlmeUZsYWcgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDRlhfTGlzdEN0cmw6OlNlbGVjdEl0ZW1zKCkgewotICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9hU2VsSXRlbXMuR2V0Q291bnQoKTsgaSA8IHN6OyBpKyspIHsKLSAgICBpbnQzMl90IG5JdGVtSW5kZXggPSBtX2FTZWxJdGVtcy5HZXRJdGVtSW5kZXgoaSk7Ci0gICAgaW50MzJfdCBuU3RhdGUgPSBtX2FTZWxJdGVtcy5HZXRTdGF0ZShpKTsKLQotICAgIHN3aXRjaCAoblN0YXRlKSB7Ci0gICAgICBjYXNlIDE6Ci0gICAgICAgIFNldE11bHRpcGxlU2VsZWN0KG5JdGVtSW5kZXgsIHRydWUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgLTE6Ci0gICAgICAgIFNldE11bHRpcGxlU2VsZWN0KG5JdGVtSW5kZXgsIGZhbHNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgbV9hU2VsSXRlbXMuRG9uZSgpOwotfQotCi12b2lkIENGWF9MaXN0Q3RybDo6U2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCkgewotICBpZiAoIUlzVmFsaWQobkl0ZW1JbmRleCkpCi0gICAgcmV0dXJuOwotCi0gIGlmIChJc011bHRpcGxlU2VsKCkpIHsKLSAgICBtX2FTZWxJdGVtcy5BZGQobkl0ZW1JbmRleCk7Ci0gICAgU2VsZWN0SXRlbXMoKTsKLSAgfSBlbHNlIHsKLSAgICBTZXRTaW5nbGVTZWxlY3Qobkl0ZW1JbmRleCk7Ci0gIH0KLX0KLQotYm9vbCBDRlhfTGlzdEN0cmw6OklzSXRlbVZpc2libGUoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdCB7Ci0gIENGWF9GbG9hdFJlY3QgcmNQbGF0ZSA9IEdldFBsYXRlUmVjdCgpOwotICBDRlhfRmxvYXRSZWN0IHJjSXRlbSA9IEdldEl0ZW1SZWN0KG5JdGVtSW5kZXgpOwotCi0gIHJldHVybiByY0l0ZW0uYm90dG9tID49IHJjUGxhdGUuYm90dG9tICYmIHJjSXRlbS50b3AgPD0gcmNQbGF0ZS50b3A7Ci19Ci0KLXZvaWQgQ0ZYX0xpc3RDdHJsOjpTY3JvbGxUb0xpc3RJdGVtKGludDMyX3Qgbkl0ZW1JbmRleCkgewotICBpZiAoIUlzVmFsaWQobkl0ZW1JbmRleCkpCi0gICAgcmV0dXJuOwotCi0gIENGWF9GbG9hdFJlY3QgcmNQbGF0ZSA9IEdldFBsYXRlUmVjdCgpOwotICBDRlhfRmxvYXRSZWN0IHJjSXRlbSA9IEdldEl0ZW1SZWN0SW50ZXJuYWwobkl0ZW1JbmRleCk7Ci0gIENGWF9GbG9hdFJlY3QgcmNJdGVtQ3RybCA9IEdldEl0ZW1SZWN0KG5JdGVtSW5kZXgpOwotCi0gIGlmIChJc0Zsb2F0U21hbGxlcihyY0l0ZW1DdHJsLmJvdHRvbSwgcmNQbGF0ZS5ib3R0b20pKSB7Ci0gICAgaWYgKElzRmxvYXRTbWFsbGVyKHJjSXRlbUN0cmwudG9wLCByY1BsYXRlLnRvcCkpIHsKLSAgICAgIFNldFNjcm9sbFBvc1kocmNJdGVtLmJvdHRvbSArIHJjUGxhdGUuSGVpZ2h0KCkpOwotICAgIH0KLSAgfSBlbHNlIGlmIChJc0Zsb2F0QmlnZ2VyKHJjSXRlbUN0cmwudG9wLCByY1BsYXRlLnRvcCkpIHsKLSAgICBpZiAoSXNGbG9hdEJpZ2dlcihyY0l0ZW1DdHJsLmJvdHRvbSwgcmNQbGF0ZS5ib3R0b20pKSB7Ci0gICAgICBTZXRTY3JvbGxQb3NZKHJjSXRlbS50b3ApOwotICAgIH0KLSAgfQotfQotCi12b2lkIENGWF9MaXN0Q3RybDo6U2V0U2Nyb2xsSW5mbygpIHsKLSAgaWYgKG1fcE5vdGlmeSkgewotICAgIENGWF9GbG9hdFJlY3QgcmNQbGF0ZSA9IEdldFBsYXRlUmVjdCgpOwotICAgIENGWF9GbG9hdFJlY3QgcmNDb250ZW50ID0gR2V0Q29udGVudFJlY3RJbnRlcm5hbCgpOwotCi0gICAgaWYgKCFtX2JOb3RpZnlGbGFnKSB7Ci0gICAgICBtX2JOb3RpZnlGbGFnID0gdHJ1ZTsKLSAgICAgIG1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsSW5mb1kocmNQbGF0ZS5ib3R0b20sIHJjUGxhdGUudG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NvbnRlbnQuYm90dG9tLCByY0NvbnRlbnQudG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRGaXJzdEhlaWdodCgpLCByY1BsYXRlLkhlaWdodCgpKTsKLSAgICAgIG1fYk5vdGlmeUZsYWcgPSBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDRlhfTGlzdEN0cmw6OlNldFNjcm9sbFBvcyhjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewotICBTZXRTY3JvbGxQb3NZKHBvaW50LnkpOwotfQotCi12b2lkIENGWF9MaXN0Q3RybDo6U2V0U2Nyb2xsUG9zWShGWF9GTE9BVCBmeSkgewotICBpZiAoIUlzRmxvYXRFcXVhbChtX3B0U2Nyb2xsUG9zLnksIGZ5KSkgewotICAgIENGWF9GbG9hdFJlY3QgcmNQbGF0ZSA9IEdldFBsYXRlUmVjdCgpOwotICAgIENGWF9GbG9hdFJlY3QgcmNDb250ZW50ID0gR2V0Q29udGVudFJlY3RJbnRlcm5hbCgpOwotCi0gICAgaWYgKHJjUGxhdGUuSGVpZ2h0KCkgPiByY0NvbnRlbnQuSGVpZ2h0KCkpIHsKLSAgICAgIGZ5ID0gcmNQbGF0ZS50b3A7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChJc0Zsb2F0U21hbGxlcihmeSAtIHJjUGxhdGUuSGVpZ2h0KCksIHJjQ29udGVudC5ib3R0b20pKSB7Ci0gICAgICAgIGZ5ID0gcmNDb250ZW50LmJvdHRvbSArIHJjUGxhdGUuSGVpZ2h0KCk7Ci0gICAgICB9IGVsc2UgaWYgKElzRmxvYXRCaWdnZXIoZnksIHJjQ29udGVudC50b3ApKSB7Ci0gICAgICAgIGZ5ID0gcmNDb250ZW50LnRvcDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBtX3B0U2Nyb2xsUG9zLnkgPSBmeTsKLSAgICBJbnZhbGlkYXRlSXRlbSgtMSk7Ci0KLSAgICBpZiAobV9wTm90aWZ5KSB7Ci0gICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpIHsKLSAgICAgICAgbV9iTm90aWZ5RmxhZyA9IHRydWU7Ci0gICAgICAgIG1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsUG9zWShmeSk7Ci0gICAgICAgIG1fYk5vdGlmeUZsYWcgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotQ0ZYX0Zsb2F0UmVjdCBDRlhfTGlzdEN0cmw6OkdldENvbnRlbnRSZWN0SW50ZXJuYWwoKSBjb25zdCB7Ci0gIHJldHVybiBJbm5lclRvT3V0ZXIoQ0ZYX0xpc3RDb250YWluZXI6OkdldENvbnRlbnRSZWN0KCkpOwotfQotCi1DRlhfRmxvYXRSZWN0IENGWF9MaXN0Q3RybDo6R2V0Q29udGVudFJlY3QoKSBjb25zdCB7Ci0gIHJldHVybiBJblRvT3V0KEdldENvbnRlbnRSZWN0SW50ZXJuYWwoKSk7Ci19Ci0KLXZvaWQgQ0ZYX0xpc3RDdHJsOjpSZUFycmFuZ2UoaW50MzJfdCBuSXRlbUluZGV4KSB7Ci0gIEZYX0ZMT0FUIGZQb3NZID0gMC4wZjsKLQotICBpZiAoQ0ZYX0xpc3RJdGVtKiBwUHJldkl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQobkl0ZW1JbmRleCAtIDEpKQotICAgIGZQb3NZID0gcFByZXZJdGVtLT5HZXRSZWN0KCkuYm90dG9tOwotCi0gIGZvciAoaW50MzJfdCBpID0gbkl0ZW1JbmRleCwgc3ogPSBtX2FMaXN0SXRlbXMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgewotICAgIGlmIChDRlhfTGlzdEl0ZW0qIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChpKSkgewotICAgICAgRlhfRkxPQVQgZkxpc3RJdGVtSGVpZ2h0ID0gcExpc3RJdGVtLT5HZXRJdGVtSGVpZ2h0KCk7Ci0gICAgICBwTGlzdEl0ZW0tPlNldFJlY3QoQ0xTVF9SZWN0KDAuMGYsIGZQb3NZLCAwLjBmLCBmUG9zWSArIGZMaXN0SXRlbUhlaWdodCkpOwotICAgICAgZlBvc1kgKz0gZkxpc3RJdGVtSGVpZ2h0OwotICAgIH0KLSAgfQotCi0gIFNldENvbnRlbnRSZWN0KENMU1RfUmVjdCgwLjBmLCAwLjBmLCAwLjBmLCBmUG9zWSkpOwotICBTZXRTY3JvbGxJbmZvKCk7Ci19Ci0KLXZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRUb3BJdGVtKGludDMyX3QgbkluZGV4KSB7Ci0gIGlmIChJc1ZhbGlkKG5JbmRleCkpIHsKLSAgICBHZXRQbGF0ZVJlY3QoKTsKLSAgICBDRlhfRmxvYXRSZWN0IHJjSXRlbSA9IEdldEl0ZW1SZWN0SW50ZXJuYWwobkluZGV4KTsKLSAgICBTZXRTY3JvbGxQb3NZKHJjSXRlbS50b3ApOwotICB9Ci19Ci0KLWludDMyX3QgQ0ZYX0xpc3RDdHJsOjpHZXRUb3BJdGVtKCkgY29uc3QgewotICBpbnQzMl90IG5JdGVtSW5kZXggPSBHZXRJdGVtSW5kZXgoR2V0QlRQb2ludCgpKTsKLQotICBpZiAoIUlzSXRlbVZpc2libGUobkl0ZW1JbmRleCkgJiYgSXNJdGVtVmlzaWJsZShuSXRlbUluZGV4ICsgMSkpCi0gICAgbkl0ZW1JbmRleCArPSAxOwotCi0gIHJldHVybiBuSXRlbUluZGV4OwotfQotCi12b2lkIENGWF9MaXN0Q3RybDo6RW1wdHkoKSB7Ci0gIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBtX2FMaXN0SXRlbXMuR2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykKLSAgICBkZWxldGUgbV9hTGlzdEl0ZW1zLkdldEF0KGkpOwotCi0gIG1fYUxpc3RJdGVtcy5SZW1vdmVBbGwoKTsKLQotICBJbnZhbGlkYXRlSXRlbSgtMSk7Ci19Ci0KLXZvaWQgQ0ZYX0xpc3RDdHJsOjpDYW5jZWwoKSB7Ci0gIG1fYVNlbEl0ZW1zLkRlc2VsZWN0QWxsKCk7Ci19Ci0KLWludDMyX3QgQ0ZYX0xpc3RDdHJsOjpHZXRJdGVtSW5kZXgoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIGNvbnN0IHsKLSAgQ0ZYX1BvaW50RiBwdCA9IE91dGVyVG9Jbm5lcihPdXRUb0luKHBvaW50KSk7Ci0KLSAgYm9vbCBiRmlyc3QgPSB0cnVlOwotICBib29sIGJMYXN0ID0gdHJ1ZTsKLQotICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9hTGlzdEl0ZW1zLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKLSAgICBpZiAoQ0ZYX0xpc3RJdGVtKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQoaSkpIHsKLSAgICAgIENMU1RfUmVjdCByY0xpc3RJdGVtID0gcExpc3RJdGVtLT5HZXRSZWN0KCk7Ci0KLSAgICAgIGlmIChJc0Zsb2F0QmlnZ2VyKHB0LnksIHJjTGlzdEl0ZW0udG9wKSkgewotICAgICAgICBiRmlyc3QgPSBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgaWYgKElzRmxvYXRTbWFsbGVyKHB0LnksIHJjTGlzdEl0ZW0uYm90dG9tKSkgewotICAgICAgICBiTGFzdCA9IGZhbHNlOwotICAgICAgfQotCi0gICAgICBpZiAocHQueSA+PSByY0xpc3RJdGVtLnRvcCAmJiBwdC55IDwgcmNMaXN0SXRlbS5ib3R0b20pIHsKLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKGJGaXJzdCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGJMYXN0KQotICAgIHJldHVybiBtX2FMaXN0SXRlbXMuR2V0U2l6ZSgpIC0gMTsKLQotICByZXR1cm4gLTE7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENGWF9MaXN0Q3RybDo6R2V0VGV4dCgpIGNvbnN0IHsKLSAgaWYgKElzTXVsdGlwbGVTZWwoKSkKLSAgICByZXR1cm4gR2V0SXRlbVRleHQobV9uQ2FyZXRJbmRleCk7Ci0gIHJldHVybiBHZXRJdGVtVGV4dChtX25TZWxJdGVtKTsKLX0KLQotdm9pZCBDRlhfTGlzdEN0cmw6OlNldEZvbnRNYXAoSVBWVF9Gb250TWFwKiBwRm9udE1hcCkgewotICBtX3BGb250TWFwID0gcEZvbnRNYXA7Ci19Ci0KLXZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpIHsKLSAgbV9mRm9udFNpemUgPSBmRm9udFNpemU7Ci19Ci0KLXZvaWQgQ0ZYX0xpc3RDdHJsOjpBZGRJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKLSAgQ0ZYX0xpc3RJdGVtKiBwTGlzdEl0ZW0gPSBuZXcgQ0ZYX0xpc3RJdGVtKCk7Ci0gIHBMaXN0SXRlbS0+U2V0Rm9udE1hcChtX3BGb250TWFwKTsKLSAgcExpc3RJdGVtLT5TZXRGb250U2l6ZShtX2ZGb250U2l6ZSk7Ci0gIHBMaXN0SXRlbS0+U2V0VGV4dChzdHIpOwotICBtX2FMaXN0SXRlbXMuQWRkKHBMaXN0SXRlbSk7Ci19Ci0KLUNGWF9FZGl0KiBDRlhfTGlzdEN0cmw6OkdldEl0ZW1FZGl0KGludDMyX3QgbkluZGV4KSBjb25zdCB7Ci0gIGlmIChDRlhfTGlzdEl0ZW0qIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChuSW5kZXgpKSB7Ci0gICAgcmV0dXJuIHBMaXN0SXRlbS0+R2V0RWRpdCgpOwotICB9Ci0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLWludDMyX3QgQ0ZYX0xpc3RDdHJsOjpHZXRDb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fYUxpc3RJdGVtcy5HZXRTaXplKCk7Ci19Ci0KLUNGWF9GbG9hdFJlY3QgQ0ZYX0xpc3RDdHJsOjpHZXRQbGF0ZVJlY3QoKSBjb25zdCB7Ci0gIHJldHVybiBDRlhfTGlzdENvbnRhaW5lcjo6R2V0UGxhdGVSZWN0KCk7Ci19Ci0KLUZYX0ZMT0FUIENGWF9MaXN0Q3RybDo6R2V0Rm9udFNpemUoKSBjb25zdCB7Ci0gIHJldHVybiBtX2ZGb250U2l6ZTsKLX0KLQotRlhfRkxPQVQgQ0ZYX0xpc3RDdHJsOjpHZXRGaXJzdEhlaWdodCgpIGNvbnN0IHsKLSAgaWYgKENGWF9MaXN0SXRlbSogcExpc3RJdGVtID0gbV9hTGlzdEl0ZW1zLkdldEF0KDApKSB7Ci0gICAgcmV0dXJuIHBMaXN0SXRlbS0+R2V0SXRlbUhlaWdodCgpOwotICB9Ci0KLSAgcmV0dXJuIDEuMGY7Ci19Ci0KLWludDMyX3QgQ0ZYX0xpc3RDdHJsOjpHZXRGaXJzdFNlbGVjdGVkKCkgY29uc3QgewotICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9hTGlzdEl0ZW1zLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKLSAgICBpZiAoQ0ZYX0xpc3RJdGVtKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQoaSkpIHsKLSAgICAgIGlmIChwTGlzdEl0ZW0tPklzU2VsZWN0ZWQoKSkKLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICB9Ci0gIHJldHVybiAtMTsKLX0KLQotaW50MzJfdCBDRlhfTGlzdEN0cmw6OkdldExhc3RTZWxlY3RlZCgpIGNvbnN0IHsKLSAgZm9yIChpbnQzMl90IGkgPSBtX2FMaXN0SXRlbXMuR2V0U2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICBpZiAoQ0ZYX0xpc3RJdGVtKiBwTGlzdEl0ZW0gPSBtX2FMaXN0SXRlbXMuR2V0QXQoaSkpIHsKLSAgICAgIGlmIChwTGlzdEl0ZW0tPklzU2VsZWN0ZWQoKSkKLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICB9Ci0gIHJldHVybiAtMTsKLX0KLQotRlhfV0NIQVIgQ0ZYX0xpc3RDdHJsOjpUb3VwcGVyKEZYX1dDSEFSIGMpIGNvbnN0IHsKLSAgaWYgKChjID49ICdhJykgJiYgKGMgPD0gJ3onKSkKLSAgICBjID0gYyAtICgnYScgLSAnQScpOwotICByZXR1cm4gYzsKLX0KLQotaW50MzJfdCBDRlhfTGlzdEN0cmw6OkZpbmROZXh0KGludDMyX3QgbkluZGV4LCBGWF9XQ0hBUiBuQ2hhcikgY29uc3QgewotICBpbnQzMl90IG5DaXJjbGVJbmRleCA9IG5JbmRleDsKLQotICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9hTGlzdEl0ZW1zLkdldFNpemUoKTsgaSA8IHN6OyBpKyspIHsKLSAgICBuQ2lyY2xlSW5kZXgrKzsKLSAgICBpZiAobkNpcmNsZUluZGV4ID49IHN6KQotICAgICAgbkNpcmNsZUluZGV4ID0gMDsKLQotICAgIGlmIChDRlhfTGlzdEl0ZW0qIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChuQ2lyY2xlSW5kZXgpKSB7Ci0gICAgICBpZiAoVG91cHBlcihwTGlzdEl0ZW0tPkdldEZpcnN0Q2hhcigpKSA9PSBUb3VwcGVyKG5DaGFyKSkKLSAgICAgICAgcmV0dXJuIG5DaXJjbGVJbmRleDsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gbkNpcmNsZUluZGV4OwotfQotCi1ib29sIENGWF9MaXN0Q3RybDo6SXNJdGVtU2VsZWN0ZWQoaW50MzJfdCBuSW5kZXgpIGNvbnN0IHsKLSAgaWYgKENGWF9MaXN0SXRlbSogcExpc3RJdGVtID0gbV9hTGlzdEl0ZW1zLkdldEF0KG5JbmRleCkpCi0gICAgcmV0dXJuIHBMaXN0SXRlbS0+SXNTZWxlY3RlZCgpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQ0ZYX0xpc3RDdHJsOjpTZXRJdGVtU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCwgYm9vbCBiU2VsZWN0ZWQpIHsKLSAgaWYgKENGWF9MaXN0SXRlbSogcExpc3RJdGVtID0gbV9hTGlzdEl0ZW1zLkdldEF0KG5JdGVtSW5kZXgpKSB7Ci0gICAgcExpc3RJdGVtLT5TZXRTZWxlY3QoYlNlbGVjdGVkKTsKLSAgfQotfQotCi12b2lkIENGWF9MaXN0Q3RybDo6U2V0TXVsdGlwbGVTZWwoYm9vbCBiTXVsdGlwbGUpIHsKLSAgbV9iTXVsdGlwbGUgPSBiTXVsdGlwbGU7Ci19Ci0KLWJvb2wgQ0ZYX0xpc3RDdHJsOjpJc011bHRpcGxlU2VsKCkgY29uc3QgewotICByZXR1cm4gbV9iTXVsdGlwbGU7Ci19Ci0KLWJvb2wgQ0ZYX0xpc3RDdHJsOjpJc1ZhbGlkKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3QgewotICByZXR1cm4gbkl0ZW1JbmRleCA+PSAwICYmIG5JdGVtSW5kZXggPCBtX2FMaXN0SXRlbXMuR2V0U2l6ZSgpOwotfQotCi1DRlhfV2lkZVN0cmluZyBDRlhfTGlzdEN0cmw6OkdldEl0ZW1UZXh0KGludDMyX3QgbkluZGV4KSBjb25zdCB7Ci0gIGlmIChDRlhfTGlzdEl0ZW0qIHBMaXN0SXRlbSA9IG1fYUxpc3RJdGVtcy5HZXRBdChuSW5kZXgpKSB7Ci0gICAgcmV0dXJuIHBMaXN0SXRlbS0+R2V0VGV4dCgpOwotICB9Ci0KLSAgcmV0dXJuIEwiIjsKLX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnhlZGl0L2Z4ZXRfbGlzdC5oIGIvZnBkZnNkay9meGVkaXQvZnhldF9saXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZTE4YmMuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9meGVkaXQvZnhldF9saXN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZQREZTREtfRlhFRElUX0ZYRVRfTElTVF9IXwotI2RlZmluZSBGUERGU0RLX0ZYRURJVF9GWEVUX0xJU1RfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2Z4ZWRpdC9meF9lZGl0LmgiCi0KLWNsYXNzIENGWF9FZGl0OwotY2xhc3MgQ0ZYX0VkaXRfSXRlcmF0b3I7Ci1jbGFzcyBDUFdMX0xpc3RfTm90aWZ5OwotCi1jbGFzcyBDTFNUX1JlY3QgOiBwdWJsaWMgQ0ZYX0Zsb2F0UmVjdCB7Ci0gcHVibGljOgotICBDTFNUX1JlY3QoKSB7IGxlZnQgPSB0b3AgPSByaWdodCA9IGJvdHRvbSA9IDAuMGY7IH0KLQotICBDTFNUX1JlY3QoRlhfRkxPQVQgb3RoZXJfbGVmdCwKLSAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX3RvcCwKLSAgICAgICAgICAgIEZYX0ZMT0FUIG90aGVyX3JpZ2h0LAotICAgICAgICAgICAgRlhfRkxPQVQgb3RoZXJfYm90dG9tKSB7Ci0gICAgbGVmdCA9IG90aGVyX2xlZnQ7Ci0gICAgdG9wID0gb3RoZXJfdG9wOwotICAgIHJpZ2h0ID0gb3RoZXJfcmlnaHQ7Ci0gICAgYm90dG9tID0gb3RoZXJfYm90dG9tOwotICB9Ci0KLSAgZXhwbGljaXQgQ0xTVF9SZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIHsKLSAgICBsZWZ0ID0gcmVjdC5sZWZ0OwotICAgIHRvcCA9IHJlY3QudG9wOwotICAgIHJpZ2h0ID0gcmVjdC5yaWdodDsKLSAgICBib3R0b20gPSByZWN0LmJvdHRvbTsKLSAgfQotCi0gIH5DTFNUX1JlY3QoKSB7fQotCi0gIHZvaWQgRGVmYXVsdCgpIHsgbGVmdCA9IHRvcCA9IHJpZ2h0ID0gYm90dG9tID0gMC4wZjsgfQotCi0gIGNvbnN0IENMU1RfUmVjdCBvcGVyYXRvcj0oY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgewotICAgIGxlZnQgPSByZWN0LmxlZnQ7Ci0gICAgdG9wID0gcmVjdC50b3A7Ci0gICAgcmlnaHQgPSByZWN0LnJpZ2h0OwotICAgIGJvdHRvbSA9IHJlY3QuYm90dG9tOwotCi0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENMU1RfUmVjdCYgcmVjdCkgY29uc3QgewotICAgIHJldHVybiBGWFNZU19tZW1jbXAodGhpcywgJnJlY3QsIHNpemVvZihDTFNUX1JlY3QpKSA9PSAwOwotICB9Ci0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENMU1RfUmVjdCYgcmVjdCkgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSByZWN0KTsgfQotCi0gIEZYX0ZMT0FUIFdpZHRoKCkgY29uc3QgeyByZXR1cm4gcmlnaHQgLSBsZWZ0OyB9Ci0KLSAgRlhfRkxPQVQgSGVpZ2h0KCkgY29uc3QgewotICAgIGlmICh0b3AgPiBib3R0b20pCi0gICAgICByZXR1cm4gdG9wIC0gYm90dG9tOwotICAgIHJldHVybiBib3R0b20gLSB0b3A7Ci0gIH0KLQotICBDRlhfUG9pbnRGIExlZnRUb3AoKSBjb25zdCB7IHJldHVybiBDRlhfUG9pbnRGKGxlZnQsIHRvcCk7IH0KLQotICBDRlhfUG9pbnRGIFJpZ2h0Qm90dG9tKCkgY29uc3QgeyByZXR1cm4gQ0ZYX1BvaW50RihyaWdodCwgYm90dG9tKTsgfQotCi0gIGNvbnN0IENMU1RfUmVjdCBvcGVyYXRvcis9KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gICAgbGVmdCArPSBwb2ludC54OwotICAgIHJpZ2h0ICs9IHBvaW50Lng7Ci0gICAgdG9wICs9IHBvaW50Lnk7Ci0gICAgYm90dG9tICs9IHBvaW50Lnk7Ci0KLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBjb25zdCBDTFNUX1JlY3Qgb3BlcmF0b3ItPShjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewotICAgIGxlZnQgLT0gcG9pbnQueDsKLSAgICByaWdodCAtPSBwb2ludC54OwotICAgIHRvcCAtPSBwb2ludC55OwotICAgIGJvdHRvbSAtPSBwb2ludC55OwotCi0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgQ0xTVF9SZWN0IG9wZXJhdG9yKyhjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3QgewotICAgIHJldHVybiBDTFNUX1JlY3QobGVmdCArIHBvaW50LngsIHRvcCArIHBvaW50LnksIHJpZ2h0ICsgcG9pbnQueCwKLSAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSArIHBvaW50LnkpOwotICB9Ci0KLSAgQ0xTVF9SZWN0IG9wZXJhdG9yLShjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3QgewotICAgIHJldHVybiBDTFNUX1JlY3QobGVmdCAtIHBvaW50LngsIHRvcCAtIHBvaW50LnksIHJpZ2h0IC0gcG9pbnQueCwKLSAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSAtIHBvaW50LnkpOwotICB9Ci19OwotCi1jbGFzcyBDRlhfTGlzdEl0ZW0gZmluYWwgewotIHB1YmxpYzoKLSAgQ0ZYX0xpc3RJdGVtKCk7Ci0gIH5DRlhfTGlzdEl0ZW0oKTsKLQotICB2b2lkIFNldEZvbnRNYXAoSVBWVF9Gb250TWFwKiBwRm9udE1hcCk7Ci0gIENGWF9FZGl0KiBHZXRFZGl0KCkgY29uc3Q7Ci0KLSAgdm9pZCBTZXRSZWN0KGNvbnN0IENMU1RfUmVjdCYgcmVjdCk7Ci0gIHZvaWQgU2V0U2VsZWN0KGJvb2wgYlNlbGVjdGVkKTsKLSAgdm9pZCBTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB0ZXh0KTsKLSAgdm9pZCBTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOwotICBDRlhfV2lkZVN0cmluZyBHZXRUZXh0KCkgY29uc3Q7Ci0KLSAgQ0xTVF9SZWN0IEdldFJlY3QoKSBjb25zdDsKLSAgYm9vbCBJc1NlbGVjdGVkKCkgY29uc3Q7Ci0gIEZYX0ZMT0FUIEdldEl0ZW1IZWlnaHQoKSBjb25zdDsKLSAgdWludDE2X3QgR2V0Rmlyc3RDaGFyKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBDRlhfRWRpdF9JdGVyYXRvciogR2V0SXRlcmF0b3IoKSBjb25zdDsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0VkaXQ+IG1fcEVkaXQ7Ci0gIGJvb2wgbV9iU2VsZWN0ZWQ7Ci0gIENMU1RfUmVjdCBtX3JjTGlzdEl0ZW07Ci19OwotCi1jbGFzcyBDRlhfTGlzdENvbnRhaW5lciB7Ci0gcHVibGljOgotICBDRlhfTGlzdENvbnRhaW5lcigpOwotICB2aXJ0dWFsIH5DRlhfTGlzdENvbnRhaW5lcigpOwotCi0gIHZpcnR1YWwgdm9pZCBTZXRQbGF0ZVJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCk7Ci0KLSAgQ0ZYX0Zsb2F0UmVjdCBHZXRQbGF0ZVJlY3QoKSBjb25zdCB7IHJldHVybiBtX3JjUGxhdGU7IH0KLSAgdm9pZCBTZXRDb250ZW50UmVjdChjb25zdCBDTFNUX1JlY3QmIHJlY3QpIHsgbV9yY0NvbnRlbnQgPSByZWN0OyB9Ci0gIENMU1RfUmVjdCBHZXRDb250ZW50UmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fcmNDb250ZW50OyB9Ci0gIENGWF9Qb2ludEYgR2V0QlRQb2ludCgpIGNvbnN0IHsKLSAgICByZXR1cm4gQ0ZYX1BvaW50RihtX3JjUGxhdGUubGVmdCwgbV9yY1BsYXRlLnRvcCk7Ci0gIH0KLSAgQ0ZYX1BvaW50RiBHZXRFVFBvaW50KCkgY29uc3QgewotICAgIHJldHVybiBDRlhfUG9pbnRGKG1fcmNQbGF0ZS5yaWdodCwgbV9yY1BsYXRlLmJvdHRvbSk7Ci0gIH0KLQotIHB1YmxpYzoKLSAgQ0ZYX1BvaW50RiBJbm5lclRvT3V0ZXIoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIGNvbnN0IHsKLSAgICByZXR1cm4gQ0ZYX1BvaW50Rihwb2ludC54ICsgR2V0QlRQb2ludCgpLngsIEdldEJUUG9pbnQoKS55IC0gcG9pbnQueSk7Ci0gIH0KLSAgQ0ZYX1BvaW50RiBPdXRlclRvSW5uZXIoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIGNvbnN0IHsKLSAgICByZXR1cm4gQ0ZYX1BvaW50Rihwb2ludC54IC0gR2V0QlRQb2ludCgpLngsIEdldEJUUG9pbnQoKS55IC0gcG9pbnQueSk7Ci0gIH0KLSAgQ0ZYX0Zsb2F0UmVjdCBJbm5lclRvT3V0ZXIoY29uc3QgQ0xTVF9SZWN0JiByZWN0KSBjb25zdCB7Ci0gICAgQ0ZYX1BvaW50RiBwdExlZnRUb3AgPSBJbm5lclRvT3V0ZXIoQ0ZYX1BvaW50RihyZWN0LmxlZnQsIHJlY3QudG9wKSk7Ci0gICAgQ0ZYX1BvaW50RiBwdFJpZ2h0Qm90dG9tID0KLSAgICAgICAgSW5uZXJUb091dGVyKENGWF9Qb2ludEYocmVjdC5yaWdodCwgcmVjdC5ib3R0b20pKTsKLSAgICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdChwdExlZnRUb3AueCwgcHRSaWdodEJvdHRvbS55LCBwdFJpZ2h0Qm90dG9tLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHRMZWZ0VG9wLnkpOwotICB9Ci0gIENMU1RfUmVjdCBPdXRlclRvSW5uZXIoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3QgewotICAgIENGWF9Qb2ludEYgcHRMZWZ0VG9wID0gT3V0ZXJUb0lubmVyKENGWF9Qb2ludEYocmVjdC5sZWZ0LCByZWN0LnRvcCkpOwotICAgIENGWF9Qb2ludEYgcHRSaWdodEJvdHRvbSA9Ci0gICAgICAgIE91dGVyVG9Jbm5lcihDRlhfUG9pbnRGKHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKSk7Ci0gICAgcmV0dXJuIENMU1RfUmVjdChwdExlZnRUb3AueCwgcHRMZWZ0VG9wLnksIHB0UmlnaHRCb3R0b20ueCwKLSAgICAgICAgICAgICAgICAgICAgIHB0UmlnaHRCb3R0b20ueSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIENGWF9GbG9hdFJlY3QgbV9yY1BsYXRlOwotICBDTFNUX1JlY3QgbV9yY0NvbnRlbnQ7ICAvLyBwb3NpdGl2ZSBmb3JldmVyIQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFRZUEU+Ci1jbGFzcyBDTFNUX0FycmF5VGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT4gewotIHB1YmxpYzoKLSAgYm9vbCBJc0VtcHR5KCkgeyByZXR1cm4gQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OkdldFNpemUoKSA8PSAwOyB9Ci0gIFRZUEUgR2V0QXQoaW50MzJfdCBuSW5kZXgpIGNvbnN0IHsKLSAgICBpZiAobkluZGV4ID49IDAgJiYgbkluZGV4IDwgQ0ZYX0FycmF5VGVtcGxhdGU8VFlQRT46OkdldFNpemUoKSkKLSAgICAgIHJldHVybiBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6R2V0QXQobkluZGV4KTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICB2b2lkIFJlbW92ZUF0KGludDMyX3QgbkluZGV4KSB7Ci0gICAgaWYgKG5JbmRleCA+PSAwICYmIG5JbmRleCA8IENGWF9BcnJheVRlbXBsYXRlPFRZUEU+OjpHZXRTaXplKCkpCi0gICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxUWVBFPjo6UmVtb3ZlQXQobkluZGV4KTsKLSAgfQotfTsKLQotc3RydWN0IENQTFNUX1NlbGVjdF9JdGVtIHsKLSAgQ1BMU1RfU2VsZWN0X0l0ZW0oaW50MzJfdCBvdGhlcl9uSXRlbUluZGV4LCBpbnQzMl90IG90aGVyX25TdGF0ZSkgewotICAgIG5JdGVtSW5kZXggPSBvdGhlcl9uSXRlbUluZGV4OwotICAgIG5TdGF0ZSA9IG90aGVyX25TdGF0ZTsKLSAgfQotCi0gIGludDMyX3Qgbkl0ZW1JbmRleDsKLSAgaW50MzJfdCBuU3RhdGU7ICAvLyAwOm5vcm1hbCBzZWxlY3QgLTE6dG8gZGVzZWxlY3QgMTogdG8gc2VsZWN0Ci19OwotCi1jbGFzcyBDUExTVF9TZWxlY3QgewotIHB1YmxpYzoKLSAgQ1BMU1RfU2VsZWN0KCk7Ci0gIHZpcnR1YWwgfkNQTFNUX1NlbGVjdCgpOwotCi0gcHVibGljOgotICB2b2lkIEFkZChpbnQzMl90IG5JdGVtSW5kZXgpOwotICB2b2lkIEFkZChpbnQzMl90IG5CZWdpbkluZGV4LCBpbnQzMl90IG5FbmRJbmRleCk7Ci0gIHZvaWQgU3ViKGludDMyX3Qgbkl0ZW1JbmRleCk7Ci0gIHZvaWQgU3ViKGludDMyX3QgbkJlZ2luSW5kZXgsIGludDMyX3QgbkVuZEluZGV4KTsKLSAgYm9vbCBJc0V4aXN0KGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3Q7Ci0gIGludDMyX3QgRmluZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OwotICBpbnQzMl90IEdldENvdW50KCkgY29uc3Q7Ci0gIGludDMyX3QgR2V0SXRlbUluZGV4KGludDMyX3QgbkluZGV4KSBjb25zdDsKLSAgaW50MzJfdCBHZXRTdGF0ZShpbnQzMl90IG5JbmRleCkgY29uc3Q7Ci0gIHZvaWQgRG9uZSgpOwotICB2b2lkIERlc2VsZWN0QWxsKCk7Ci0KLSBwcml2YXRlOgotICBDRlhfQXJyYXlUZW1wbGF0ZTxDUExTVF9TZWxlY3RfSXRlbSo+IG1fYUl0ZW1zOwotfTsKLQotY2xhc3MgQ0ZYX0xpc3RDdHJsIDogcHJvdGVjdGVkIENGWF9MaXN0Q29udGFpbmVyIHsKLSBwdWJsaWM6Ci0gIENGWF9MaXN0Q3RybCgpOwotICB+Q0ZYX0xpc3RDdHJsKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ0ZYX0xpc3RDb250YWluZXIKLSAgdm9pZCBTZXRQbGF0ZVJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTZXROb3RpZnkoQ1BXTF9MaXN0X05vdGlmeSogcE5vdGlmeSk7Ci0gIHZvaWQgT25Nb3VzZURvd24oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKTsKLSAgdm9pZCBPbk1vdXNlTW92ZShjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpOwotICB2b2lkIE9uVktfVVAoYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpOwotICB2b2lkIE9uVktfRE9XTihib29sIGJTaGlmdCwgYm9vbCBiQ3RybCk7Ci0gIHZvaWQgT25WS19MRUZUKGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKTsKLSAgdm9pZCBPblZLX1JJR0hUKGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKTsKLSAgdm9pZCBPblZLX0hPTUUoYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpOwotICB2b2lkIE9uVktfRU5EKGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKTsKLSAgdm9pZCBPblZLKGludDMyX3Qgbkl0ZW1JbmRleCwgYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpOwotICBib29sIE9uQ2hhcih1aW50MTZfdCBuQ2hhciwgYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpOwotCi0gIHZvaWQgU2V0U2Nyb2xsUG9zKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKLSAgdm9pZCBTY3JvbGxUb0xpc3RJdGVtKGludDMyX3Qgbkl0ZW1JbmRleCk7Ci0gIENGWF9GbG9hdFJlY3QgR2V0SXRlbVJlY3QoaW50MzJfdCBuSW5kZXgpIGNvbnN0OwotICBpbnQzMl90IEdldENhcmV0KCkgY29uc3Q7Ci0gIGludDMyX3QgR2V0U2VsZWN0KCkgY29uc3Q7Ci0gIGludDMyX3QgR2V0VG9wSXRlbSgpIGNvbnN0OwotICBDRlhfRmxvYXRSZWN0IEdldENvbnRlbnRSZWN0KCkgY29uc3Q7Ci0gIGludDMyX3QgR2V0SXRlbUluZGV4KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBjb25zdDsKLSAgdm9pZCBBZGRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7Ci0gIHZvaWQgU2V0VG9wSXRlbShpbnQzMl90IG5JbmRleCk7Ci0gIHZvaWQgU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCk7Ci0gIHZvaWQgU2V0Q2FyZXQoaW50MzJfdCBuSXRlbUluZGV4KTsKLSAgdm9pZCBFbXB0eSgpOwotICB2b2lkIENhbmNlbCgpOwotICBDRlhfV2lkZVN0cmluZyBHZXRUZXh0KCkgY29uc3Q7Ci0KLSAgdm9pZCBTZXRGb250TWFwKElQVlRfRm9udE1hcCogcEZvbnRNYXApOwotICB2b2lkIFNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7Ci0gIENGWF9GbG9hdFJlY3QgR2V0UGxhdGVSZWN0KCkgY29uc3Q7Ci0gIEZYX0ZMT0FUIEdldEZvbnRTaXplKCkgY29uc3Q7Ci0gIENGWF9FZGl0KiBHZXRJdGVtRWRpdChpbnQzMl90IG5JbmRleCkgY29uc3Q7Ci0gIGludDMyX3QgR2V0Q291bnQoKSBjb25zdDsKLSAgYm9vbCBJc0l0ZW1TZWxlY3RlZChpbnQzMl90IG5JbmRleCkgY29uc3Q7Ci0gIEZYX0ZMT0FUIEdldEZpcnN0SGVpZ2h0KCkgY29uc3Q7Ci0gIHZvaWQgU2V0TXVsdGlwbGVTZWwoYm9vbCBiTXVsdGlwbGUpOwotICBib29sIElzTXVsdGlwbGVTZWwoKSBjb25zdDsKLSAgYm9vbCBJc1ZhbGlkKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3Q7Ci0gIGludDMyX3QgRmluZE5leHQoaW50MzJfdCBuSW5kZXgsIEZYX1dDSEFSIG5DaGFyKSBjb25zdDsKLSAgaW50MzJfdCBHZXRGaXJzdFNlbGVjdGVkKCkgY29uc3Q7Ci0KLSAgQ0ZYX1BvaW50RiBJblRvT3V0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBjb25zdDsKLSAgQ0ZYX1BvaW50RiBPdXRUb0luKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBjb25zdDsKLSAgQ0ZYX0Zsb2F0UmVjdCBJblRvT3V0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0OwotICBDRlhfRmxvYXRSZWN0IE91dFRvSW4oY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICB2b2lkIFJlQXJyYW5nZShpbnQzMl90IG5JdGVtSW5kZXgpOwotICBDRlhfRmxvYXRSZWN0IEdldEl0ZW1SZWN0SW50ZXJuYWwoaW50MzJfdCBuSW5kZXgpIGNvbnN0OwotICBDRlhfRmxvYXRSZWN0IEdldENvbnRlbnRSZWN0SW50ZXJuYWwoKSBjb25zdDsKLSAgdm9pZCBTZXRNdWx0aXBsZVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgsIGJvb2wgYlNlbGVjdGVkKTsKLSAgdm9pZCBTZXRTaW5nbGVTZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4KTsKLSAgdm9pZCBJbnZhbGlkYXRlSXRlbShpbnQzMl90IG5JdGVtSW5kZXgpOwotICB2b2lkIFNlbGVjdEl0ZW1zKCk7Ci0gIGJvb2wgSXNJdGVtVmlzaWJsZShpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OwotICB2b2lkIFNldFNjcm9sbEluZm8oKTsKLSAgdm9pZCBTZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KTsKLSAgdm9pZCBBZGRJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOwotICBDRlhfV2lkZVN0cmluZyBHZXRJdGVtVGV4dChpbnQzMl90IG5JbmRleCkgY29uc3Q7Ci0gIHZvaWQgU2V0SXRlbVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgsIGJvb2wgYlNlbGVjdGVkKTsKLSAgaW50MzJfdCBHZXRMYXN0U2VsZWN0ZWQoKSBjb25zdDsKLSAgRlhfV0NIQVIgVG91cHBlcihGWF9XQ0hBUiBjKSBjb25zdDsKLQotICBDUFdMX0xpc3RfTm90aWZ5KiBtX3BOb3RpZnk7Ci0gIGJvb2wgbV9iTm90aWZ5RmxhZzsKLSAgQ0ZYX1BvaW50RiBtX3B0U2Nyb2xsUG9zOwotICBDUExTVF9TZWxlY3QgbV9hU2VsSXRlbXM7ICAvLyBmb3IgbXVsdGlwbGUKLSAgaW50MzJfdCBtX25TZWxJdGVtOyAgICAgICAgLy8gZm9yIHNpbmdsZQotICBpbnQzMl90IG1fbkZvb3RJbmRleDsgICAgICAvLyBmb3IgbXVsdGlwbGUKLSAgYm9vbCBtX2JDdHJsU2VsOyAgICAgICAgICAgLy8gZm9yIG11bHRpcGxlCi0gIGludDMyX3QgbV9uQ2FyZXRJbmRleDsgICAgIC8vIGZvciBtdWx0aXBsZQotICBDTFNUX0FycmF5VGVtcGxhdGU8Q0ZYX0xpc3RJdGVtKj4gbV9hTGlzdEl0ZW1zOwotICBGWF9GTE9BVCBtX2ZGb250U2l6ZTsKLSAgSVBWVF9Gb250TWFwKiBtX3BGb250TWFwOwotICBib29sIG1fYk11bHRpcGxlOwotfTsKLQotI2VuZGlmICAvLyBGUERGU0RLX0ZYRURJVF9GWEVUX0xJU1RfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvaXBkZnNka19hbm5vdGhhbmRsZXIuaCBiL2ZwZGZzZGsvaXBkZnNka19hbm5vdGhhbmRsZXIuaAppbmRleCA2MzZkMTYxLi5iZmZlYWM2IDEwMDY0NAotLS0gYS9mcGRmc2RrL2lwZGZzZGtfYW5ub3RoYW5kbGVyLmgKKysrIGIvZnBkZnNkay9pcGRmc2RrX2Fubm90aGFuZGxlci5oCkBAIC03LDcgKzcsNiBAQAogI2lmbmRlZiBGUERGU0RLX0lQREZTREtfQU5OT1RIQU5ETEVSX0hfCiAjZGVmaW5lIEZQREZTREtfSVBERlNES19BTk5PVEhBTkRMRVJfSF8KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCiAjaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX2Fubm90LmgiCiAKQEAgLTM2LDYgKzM1LDkgQEAKICAgdmlydHVhbCB2b2lkIFJlbGVhc2VBbm5vdChDUERGU0RLX0Fubm90KiBwQW5ub3QpID0gMDsKICAgdmlydHVhbCBDRlhfRmxvYXRSZWN0IEdldFZpZXdCQm94KENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOworICB2aXJ0dWFsIFdpZGVTdHJpbmcgR2V0U2VsZWN0ZWRUZXh0KENQREZTREtfQW5ub3QqIHBBbm5vdCkgPSAwOworICB2aXJ0dWFsIHZvaWQgUmVwbGFjZVNlbGVjdGlvbihDUERGU0RLX0Fubm90KiBwQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHRleHQpID0gMDsKICAgdmlydHVhbCBib29sIEhpdFRlc3QoQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3LAogICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwQW5ub3QsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSA9IDA7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2phdmFzY3JpcHQvQW5ub3QuY3BwIGIvZnBkZnNkay9qYXZhc2NyaXB0L0Fubm90LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFjNzFlYy4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2phdmFzY3JpcHQvQW5ub3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9Bbm5vdC5oIgotCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19PYmplY3QuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfVmFsdWUuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvY2pzX2V2ZW50X2NvbnRleHQuaCIKLQotbmFtZXNwYWNlIHsKLQotQ1BERlNES19CQUFubm90KiBUb0JBQW5ub3QoQ1BERlNES19Bbm5vdCogYW5ub3QpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PENQREZTREtfQkFBbm5vdCo+KGFubm90KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLUpTQ29uc3RTcGVjIENKU19Bbm5vdDo6Q29uc3RTcGVjc1tdID0ge3swLCBKU0NvbnN0U3BlYzo6TnVtYmVyLCAwLCAwfX07Ci0KLUpTUHJvcGVydHlTcGVjIENKU19Bbm5vdDo6UHJvcGVydHlTcGVjc1tdID0gewotICAgIHsiaGlkZGVuIiwgZ2V0X2hpZGRlbl9zdGF0aWMsIHNldF9oaWRkZW5fc3RhdGljfSwKLSAgICB7Im5hbWUiLCBnZXRfbmFtZV9zdGF0aWMsIHNldF9uYW1lX3N0YXRpY30sCi0gICAgeyJ0eXBlIiwgZ2V0X3R5cGVfc3RhdGljLCBzZXRfdHlwZV9zdGF0aWN9LAotICAgIHswLCAwLCAwfX07Ci0KLUpTTWV0aG9kU3BlYyBDSlNfQW5ub3Q6Ok1ldGhvZFNwZWNzW10gPSB7ezAsIDB9fTsKLQotSU1QTEVNRU5UX0pTX0NMQVNTKENKU19Bbm5vdCwgQW5ub3QpCi0KLUFubm90OjpBbm5vdChDSlNfT2JqZWN0KiBwSlNPYmplY3QpIDogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCkge30KLQotQW5ub3Q6On5Bbm5vdCgpIHt9Ci0KLWJvb2wgQW5ub3Q6OmhpZGRlbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAodnAuSXNHZXR0aW5nKCkpIHsKLSAgICBpZiAoIW1fcEFubm90KSB7Ci0gICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTQkFET0JKRUNUKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgQ1BERl9Bbm5vdCogcFBERkFubm90ID0gVG9CQUFubm90KG1fcEFubm90LkdldCgpKS0+R2V0UERGQW5ub3QoKTsKLSAgICB2cCA8PCBDUERGX0Fubm90OjpJc0Fubm90YXRpb25IaWRkZW4ocFBERkFubm90LT5HZXRBbm5vdERpY3QoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBib29sIGJIaWRkZW47Ci0gIHZwID4+IGJIaWRkZW47ICAvLyBNYXkgaW52YWxpZGF0ZSBtX3BBbm5vdC4KLSAgaWYgKCFtX3BBbm5vdCkgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNCQURPQkpFQ1QpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHVpbnQzMl90IGZsYWdzID0gVG9CQUFubm90KG1fcEFubm90LkdldCgpKS0+R2V0RmxhZ3MoKTsKLSAgaWYgKGJIaWRkZW4pIHsKLSAgICBmbGFncyB8PSBBTk5PVEZMQUdfSElEREVOOwotICAgIGZsYWdzIHw9IEFOTk9URkxBR19JTlZJU0lCTEU7Ci0gICAgZmxhZ3MgfD0gQU5OT1RGTEFHX05PVklFVzsKLSAgICBmbGFncyAmPSB+QU5OT1RGTEFHX1BSSU5UOwotICB9IGVsc2UgewotICAgIGZsYWdzICY9IH5BTk5PVEZMQUdfSElEREVOOwotICAgIGZsYWdzICY9IH5BTk5PVEZMQUdfSU5WSVNJQkxFOwotICAgIGZsYWdzICY9IH5BTk5PVEZMQUdfTk9WSUVXOwotICAgIGZsYWdzIHw9IEFOTk9URkxBR19QUklOVDsKLSAgfQotICBUb0JBQW5ub3QobV9wQW5ub3QuR2V0KCkpLT5TZXRGbGFncyhmbGFncyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEFubm90OjpuYW1lKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHZwLklzR2V0dGluZygpKSB7Ci0gICAgaWYgKCFtX3BBbm5vdCkgewotICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU0JBRE9CSkVDVCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHZwIDw8IFRvQkFBbm5vdChtX3BBbm5vdC5HZXQoKSktPkdldEFubm90TmFtZSgpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgYW5ub3ROYW1lOwotICB2cCA+PiBhbm5vdE5hbWU7ICAvLyBNYXkgaW52YWxpZGF0ZSBtX3BBbm5vdC4KLSAgaWYgKCFtX3BBbm5vdCkgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNCQURPQkpFQ1QpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIFRvQkFBbm5vdChtX3BBbm5vdC5HZXQoKSktPlNldEFubm90TmFtZShhbm5vdE5hbWUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBBbm5vdDo6dHlwZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNSRUFET05MWSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghbV9wQW5ub3QpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTQkFET0JKRUNUKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgdnAgPDwgQ1BERl9Bbm5vdDo6QW5ub3RTdWJ0eXBlVG9TdHJpbmcoCi0gICAgICBUb0JBQW5ub3QobV9wQW5ub3QuR2V0KCkpLT5HZXRBbm5vdFN1YnR5cGUoKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEFubm90OjpTZXRTREtBbm5vdChDUERGU0RLX0JBQW5ub3QqIGFubm90KSB7Ci0gIG1fcEFubm90LlJlc2V0KGFubm90KTsKLX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvamF2YXNjcmlwdC9Bbm5vdC5oIGIvZnBkZnNkay9qYXZhc2NyaXB0L0Fubm90LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NzU3ZmEuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9qYXZhc2NyaXB0L0Fubm90LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19KQVZBU0NSSVBUX0FOTk9UX0hfCi0jZGVmaW5lIEZQREZTREtfSkFWQVNDUklQVF9BTk5PVF9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX2JhYW5ub3QuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgiCi0KLWNsYXNzIEFubm90IDogcHVibGljIENKU19FbWJlZE9iaiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBBbm5vdChDSlNfT2JqZWN0KiBwSlNPYmplY3QpOwotICB+QW5ub3QoKSBvdmVycmlkZTsKLQotICBib29sIGhpZGRlbihDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBuYW1lKENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHR5cGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0KLSAgdm9pZCBTZXRTREtBbm5vdChDUERGU0RLX0JBQW5ub3QqIGFubm90KTsKLQotIHByaXZhdGU6Ci0gIENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyIG1fcEFubm90OwotfTsKLQotY2xhc3MgQ0pTX0Fubm90IDogcHVibGljIENKU19PYmplY3QgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0pTX0Fubm90KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge30KLSAgfkNKU19Bbm5vdCgpIG92ZXJyaWRlIHt9Ci0KLSAgREVDTEFSRV9KU19DTEFTUygpOwotICBKU19TVEFUSUNfUFJPUChoaWRkZW4sIEFubm90KTsKLSAgSlNfU1RBVElDX1BST1AobmFtZSwgQW5ub3QpOwotICBKU19TVEFUSUNfUFJPUCh0eXBlLCBBbm5vdCk7Ci19OwotCi0jZW5kaWYgIC8vIEZQREZTREtfSkFWQVNDUklQVF9BTk5PVF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9qYXZhc2NyaXB0L0NvbnN0cy5jcHAgYi9mcGRmc2RrL2phdmFzY3JpcHQvQ29uc3RzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJmOWI0Yy4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2phdmFzY3JpcHQvQ29uc3RzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvQ29uc3RzLmgiCi0KLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX09iamVjdC5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19WYWx1ZS5oIgotCi1KU0NvbnN0U3BlYyBDSlNfQm9yZGVyOjpDb25zdFNwZWNzW10gPSB7Ci0gICAgeyJzIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgInNvbGlkIn0sCi0gICAgeyJiIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgImJldmVsZWQifSwKLSAgICB7ImQiLCBKU0NvbnN0U3BlYzo6U3RyaW5nLCAwLCAiZGFzaGVkIn0sCi0gICAgeyJpIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgImluc2V0In0sCi0gICAgeyJ1IiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgInVuZGVybGluZSJ9LAotICAgIHswLCBKU0NvbnN0U3BlYzo6TnVtYmVyLCAwLCAwfX07Ci1JTVBMRU1FTlRfSlNfQ0xBU1NfQ09OU1QoQ0pTX0JvcmRlciwgYm9yZGVyKQotCi1KU0NvbnN0U3BlYyBDSlNfRGlzcGxheTo6Q29uc3RTcGVjc1tdID0ge3sidmlzaWJsZSIsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDAsIDB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImhpZGRlbiIsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDEsIDB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im5vUHJpbnQiLCBKU0NvbnN0U3BlYzo6TnVtYmVyLCAyLCAwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJub1ZpZXciLCBKU0NvbnN0U3BlYzo6TnVtYmVyLCAzLCAwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDAsIDB9fTsKLUlNUExFTUVOVF9KU19DTEFTU19DT05TVChDSlNfRGlzcGxheSwgZGlzcGxheSkKLQotSlNDb25zdFNwZWMgQ0pTX0ZvbnQ6OkNvbnN0U3BlY3NbXSA9IHsKLSAgICB7IlRpbWVzIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgIlRpbWVzLVJvbWFuIn0sCi0gICAgeyJUaW1lc0IiLCBKU0NvbnN0U3BlYzo6U3RyaW5nLCAwLCAiVGltZXMtQm9sZCJ9LAotICAgIHsiVGltZXNJIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgIlRpbWVzLUl0YWxpYyJ9LAotICAgIHsiVGltZXNCSSIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJUaW1lcy1Cb2xkSXRhbGljIn0sCi0gICAgeyJIZWx2IiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgIkhlbHZldGljYSJ9LAotICAgIHsiSGVsdkIiLCBKU0NvbnN0U3BlYzo6U3RyaW5nLCAwLCAiSGVsdmV0aWNhLUJvbGQifSwKLSAgICB7IkhlbHZJIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgIkhlbHZldGljYS1PYmxpcXVlIn0sCi0gICAgeyJIZWx2QkkiLCBKU0NvbnN0U3BlYzo6U3RyaW5nLCAwLCAiSGVsdmV0aWNhLUJvbGRPYmxpcXVlIn0sCi0gICAgeyJDb3VyIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgIkNvdXJpZXIifSwKLSAgICB7IkNvdXJCIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgIkNvdXJpZXItQm9sZCJ9LAotICAgIHsiQ291ckkiLCBKU0NvbnN0U3BlYzo6U3RyaW5nLCAwLCAiQ291cmllci1PYmxpcXVlIn0sCi0gICAgeyJDb3VyQkkiLCBKU0NvbnN0U3BlYzo6U3RyaW5nLCAwLCAiQ291cmllci1Cb2xkT2JsaXF1ZSJ9LAotICAgIHsiU3ltYm9sIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgIlN5bWJvbCJ9LAotICAgIHsiWmFwZkQiLCBKU0NvbnN0U3BlYzo6U3RyaW5nLCAwLCAiWmFwZkRpbmdiYXRzIn0sCi0gICAgezAsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDAsIDB9fTsKLUlNUExFTUVOVF9KU19DTEFTU19DT05TVChDSlNfRm9udCwgZm9udCkKLQotSlNDb25zdFNwZWMgQ0pTX0hpZ2hsaWdodDo6Q29uc3RTcGVjc1tdID0gewotICAgIHsibiIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJub25lIn0sCi0gICAgeyJpIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgImludmVydCJ9LAotICAgIHsicCIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJwdXNoIn0sCi0gICAgeyJvIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgIm91dGxpbmUifSwKLSAgICB7MCwgSlNDb25zdFNwZWM6Ok51bWJlciwgMCwgMH19OwotSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUKENKU19IaWdobGlnaHQsIGhpZ2hsaWdodCkKLQotSlNDb25zdFNwZWMgQ0pTX1Bvc2l0aW9uOjpDb25zdFNwZWNzW10gPSB7Ci0gICAgeyJ0ZXh0T25seSIsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDAsIDB9LAotICAgIHsiaWNvbk9ubHkiLCBKU0NvbnN0U3BlYzo6TnVtYmVyLCAxLCAwfSwKLSAgICB7Imljb25UZXh0ViIsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDIsIDB9LAotICAgIHsidGV4dEljb25WIiwgSlNDb25zdFNwZWM6Ok51bWJlciwgMywgMH0sCi0gICAgeyJpY29uVGV4dEgiLCBKU0NvbnN0U3BlYzo6TnVtYmVyLCA0LCAwfSwKLSAgICB7InRleHRJY29uSCIsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDUsIDB9LAotICAgIHsib3ZlcmxheSIsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDYsIDB9LAotICAgIHswLCBKU0NvbnN0U3BlYzo6TnVtYmVyLCAwLCAwfX07Ci1JTVBMRU1FTlRfSlNfQ0xBU1NfQ09OU1QoQ0pTX1Bvc2l0aW9uLCBwb3NpdGlvbikKLQotSlNDb25zdFNwZWMgQ0pTX1NjYWxlSG93OjpDb25zdFNwZWNzW10gPSB7Ci0gICAgeyJwcm9wb3J0aW9uYWwiLCBKU0NvbnN0U3BlYzo6TnVtYmVyLCAwLCAwfSwKLSAgICB7ImFuYW1vcnBoaWMiLCBKU0NvbnN0U3BlYzo6TnVtYmVyLCAxLCAwfSwKLSAgICB7MCwgSlNDb25zdFNwZWM6Ok51bWJlciwgMCwgMH19OwotSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUKENKU19TY2FsZUhvdywgc2NhbGVIb3cpCi0KLUpTQ29uc3RTcGVjIENKU19TY2FsZVdoZW46OkNvbnN0U3BlY3NbXSA9IHsKLSAgICB7ImFsd2F5cyIsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDAsIDB9LAotICAgIHsibmV2ZXIiLCBKU0NvbnN0U3BlYzo6TnVtYmVyLCAxLCAwfSwKLSAgICB7InRvb0JpZyIsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDIsIDB9LAotICAgIHsidG9vU21hbGwiLCBKU0NvbnN0U3BlYzo6TnVtYmVyLCAzLCAwfSwKLSAgICB7MCwgSlNDb25zdFNwZWM6Ok51bWJlciwgMCwgMH19OwotSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUKENKU19TY2FsZVdoZW4sIHNjYWxlV2hlbikKLQotSlNDb25zdFNwZWMgQ0pTX1N0eWxlOjpDb25zdFNwZWNzW10gPSB7Ci0gICAgeyJjaCIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJjaGVjayJ9LAotICAgIHsiY3IiLCBKU0NvbnN0U3BlYzo6U3RyaW5nLCAwLCAiY3Jvc3MifSwKLSAgICB7ImRpIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgImRpYW1vbmQifSwKLSAgICB7ImNpIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgImNpcmNsZSJ9LAotICAgIHsic3QiLCBKU0NvbnN0U3BlYzo6U3RyaW5nLCAwLCAic3RhciJ9LAotICAgIHsic3EiLCBKU0NvbnN0U3BlYzo6U3RyaW5nLCAwLCAic3F1YXJlIn0sCi0gICAgezAsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDAsIDB9fTsKLUlNUExFTUVOVF9KU19DTEFTU19DT05TVChDSlNfU3R5bGUsIHN0eWxlKQotCi1KU0NvbnN0U3BlYyBDSlNfWm9vbXR5cGU6OkNvbnN0U3BlY3NbXSA9IHsKLSAgICB7Im5vbmUiLCBKU0NvbnN0U3BlYzo6U3RyaW5nLCAwLCAiTm9WYXJ5In0sCi0gICAgeyJmaXRQIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgIkZpdFBhZ2UifSwKLSAgICB7ImZpdFciLCBKU0NvbnN0U3BlYzo6U3RyaW5nLCAwLCAiRml0V2lkdGgifSwKLSAgICB7ImZpdEgiLCBKU0NvbnN0U3BlYzo6U3RyaW5nLCAwLCAiRml0SGVpZ2h0In0sCi0gICAgeyJmaXRWIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgIkZpdFZpc2libGVXaWR0aCJ9LAotICAgIHsicHJlZiIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJQcmVmZXJyZWQifSwKLSAgICB7InJlZlciLCBKU0NvbnN0U3BlYzo6U3RyaW5nLCAwLCAiUmVmbG93V2lkdGgifSwKLSAgICB7MCwgSlNDb25zdFNwZWM6Ok51bWJlciwgMCwgMH19OwotSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUKENKU19ab29tdHlwZSwgem9vbXR5cGUpCi0KLSNkZWZpbmUgR0xPQkFMX1NUUklORyhydCwgbmFtZSwgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIChydCktPkRlZmluZUdsb2JhbENvbnN0KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKG5hbWUpLCBbXShjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgeyAgIFwKLSAgICAgICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBDRlhKU19FbmdpbmU6OkN1cnJlbnRFbmdpbmVGcm9tSXNvbGF0ZShpbmZvLkdldElzb2xhdGUoKSkgXAotICAgICAgICAgICAgICAgIC0+TmV3U3RyaW5nKHZhbHVlKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIH0pCi0KLXZvaWQgQ0pTX0dsb2JhbENvbnN0czo6RGVmaW5lSlNPYmplY3RzKENKU19SdW50aW1lKiBwUnVudGltZSkgewotICBHTE9CQUxfU1RSSU5HKHBSdW50aW1lLCBMIklEU19HUkVBVEVSX1RIQU4iLAotICAgICAgICAgICAgICAgIEwiSW52YWxpZCB2YWx1ZTogbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJSBzLiIpOwotCi0gIEdMT0JBTF9TVFJJTkcocFJ1bnRpbWUsIEwiSURTX0dUX0FORF9MVCIsCi0gICAgICAgICAgICAgICAgTCJJbnZhbGlkIHZhbHVlOiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlIHMgIgotICAgICAgICAgICAgICAgIEwiYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlIHMuIik7Ci0KLSAgR0xPQkFMX1NUUklORyhwUnVudGltZSwgTCJJRFNfTEVTU19USEFOIiwKLSAgICAgICAgICAgICAgICBMIkludmFsaWQgdmFsdWU6IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICUgcy4iKTsKLQotICBHTE9CQUxfU1RSSU5HKHBSdW50aW1lLCBMIklEU19JTlZBTElEX01PTlRIIiwgTCIqKkludmFsaWQqKiIpOwotICBHTE9CQUxfU1RSSU5HKAotICAgICAgcFJ1bnRpbWUsIEwiSURTX0lOVkFMSURfREFURSIsCi0gICAgICBMIkludmFsaWQgZGF0ZSAvIHRpbWU6IHBsZWFzZSBlbnN1cmUgdGhhdCB0aGUgZGF0ZSAvIHRpbWUgZXhpc3RzLkZpZWxkIik7Ci0KLSAgR0xPQkFMX1NUUklORyhwUnVudGltZSwgTCJJRFNfSU5WQUxJRF9WQUxVRSIsCi0gICAgICAgICAgICAgICAgTCJUaGUgdmFsdWUgZW50ZXJlZCBkb2VzIG5vdCBtYXRjaCB0aGUgZm9ybWF0IG9mIHRoZSBmaWVsZCIpOwotCi0gIEdMT0JBTF9TVFJJTkcocFJ1bnRpbWUsIEwiSURTX0FNIiwgTCJhbSIpOwotICBHTE9CQUxfU1RSSU5HKHBSdW50aW1lLCBMIklEU19QTSIsIEwicG0iKTsKLSAgR0xPQkFMX1NUUklORyhwUnVudGltZSwgTCJJRFNfTU9OVEhfSU5GTyIsCi0gICAgICAgICAgICAgICAgTCJKYW51YXJ5WzFdIEZlYnJ1YXJ5WzJdIE1hcmNoWzNdIEFwcmlsWzRdIE1heVs1XSAiCi0gICAgICAgICAgICAgICAgTCJKdW5lWzZdIEp1bHlbN10gQXVndXN0WzhdIFNlcHRlbWJlcls5XSBPY3RvYmVyWzEwXSAiCi0gICAgICAgICAgICAgICAgTCJOb3ZlbWJlclsxMV0gRGVjZW1iZXJbMTJdIFNlcHRbOV0gSmFuWzFdIEZlYlsyXSBNYXJbM10gIgotICAgICAgICAgICAgICAgIEwiQXByWzRdIEp1bls2XSBKdWxbN10gQXVnWzhdIFNlcFs5XSBPY3RbMTBdIE5vdlsxMV0gIgotICAgICAgICAgICAgICAgIEwiRGVjWzEyXSIpOwotCi0gIEdMT0JBTF9TVFJJTkcocFJ1bnRpbWUsIEwiSURTX1NUQVJUVVBfQ09OU09MRV9NU0ciLCBMIioqIF4gXyBeICoqIik7Ci19Ci0KLSNkZWZpbmUgR0xPQkFMX0FSUkFZKHJ0LCBuYW1lLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgRlhfV0NIQVIqIHZhbHVlc1tdID0ge19fVkFfQVJHU19ffTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2ODo6TG9jYWw8djg6OkFycmF5PiBhcnJheSA9IChydCktPk5ld0FycmF5KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHZhbHVlcyk7ICsraSkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBhcnJheS0+U2V0KGksIChydCktPk5ld1N0cmluZyh2YWx1ZXNbaV0pKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAocnQpLT5TZXRDb25zdEFycmF5KChuYW1lKSwgYXJyYXkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIChydCktPkRlZmluZUdsb2JhbENvbnN0KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIChuYW1lKSwgW10oY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsgICAgICAgIFwKLSAgICAgICAgICBDSlNfUnVudGltZSogcEN1cnJlbnRSdW50aW1lID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICBDSlNfUnVudGltZTo6Q3VycmVudFJ1bnRpbWVGcm9tSXNvbGF0ZShpbmZvLkdldElzb2xhdGUoKSk7ICAgICBcCi0gICAgICAgICAgaWYgKHBDdXJyZW50UnVudGltZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQocEN1cnJlbnRSdW50aW1lLT5HZXRDb25zdEFycmF5KG5hbWUpKTsgXAotICAgICAgICB9KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotdm9pZCBDSlNfR2xvYmFsQXJyYXlzOjpEZWZpbmVKU09iamVjdHMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7Ci0gIEdMT0JBTF9BUlJBWShwUnVudGltZSwgTCJSRV9OVU1CRVJfRU5UUllfRE9UX1NFUCIsIEwiWystXT9cXGQqXFwuP1xcZCoiKTsKLSAgR0xPQkFMX0FSUkFZKHBSdW50aW1lLCBMIlJFX05VTUJFUl9DT01NSVRfRE9UX1NFUCIsCi0gICAgICAgICAgICAgICBMIlsrLV0/XFxkKyhcXC5cXGQrKT8iLCAgLy8gLTEuMCBvciAtMQotICAgICAgICAgICAgICAgTCJbKy1dP1xcLlxcZCsiLCAgICAgICAgIC8vIC0uMQotICAgICAgICAgICAgICAgTCJbKy1dP1xcZCtcXC4iKTsgICAgICAgIC8vIC0xLgotCi0gIEdMT0JBTF9BUlJBWShwUnVudGltZSwgTCJSRV9OVU1CRVJfRU5UUllfQ09NTUFfU0VQIiwgTCJbKy1dP1xcZCosP1xcZCoiKTsKLSAgR0xPQkFMX0FSUkFZKHBSdW50aW1lLCBMIlJFX05VTUJFUl9DT01NSVRfQ09NTUFfU0VQIiwKLSAgICAgICAgICAgICAgIEwiWystXT9cXGQrKFsuLF1cXGQrKT8iLCAgLy8gLTEsMCBvciAtMQotICAgICAgICAgICAgICAgTCJbKy1dP1suLF1cXGQrIiwgICAgICAgICAvLyAtLDEKLSAgICAgICAgICAgICAgIEwiWystXT9cXGQrWy4sXSIpOyAgICAgICAgLy8gLTEsCi0KLSAgR0xPQkFMX0FSUkFZKHBSdW50aW1lLCBMIlJFX1pJUF9FTlRSWSIsIEwiXFxkezAsNX0iKTsKLSAgR0xPQkFMX0FSUkFZKHBSdW50aW1lLCBMIlJFX1pJUF9DT01NSVQiLCBMIlxcZHs1fSIpOwotICBHTE9CQUxfQVJSQVkocFJ1bnRpbWUsIEwiUkVfWklQNF9FTlRSWSIsIEwiXFxkezAsNX0oXFwufFstIF0pP1xcZHswLDR9Iik7Ci0gIEdMT0JBTF9BUlJBWShwUnVudGltZSwgTCJSRV9aSVA0X0NPTU1JVCIsIEwiXFxkezV9KFxcLnxbLSBdKT9cXGR7NH0iKTsKLSAgR0xPQkFMX0FSUkFZKHBSdW50aW1lLCBMIlJFX1BIT05FX0VOVFJZIiwKLSAgICAgICAgICAgICAgIC8vIDU1NS0xMjM0IG9yIDQwOCA1NTUtMTIzNAotICAgICAgICAgICAgICAgTCJcXGR7MCwzfShcXC58Wy0gXSk/XFxkezAsM30oXFwufFstIF0pP1xcZHswLDR9IiwKLQotICAgICAgICAgICAgICAgLy8gKDQwOAotICAgICAgICAgICAgICAgTCJcXChcXGR7MCwzfSIsCi0KLSAgICAgICAgICAgICAgIC8vICg0MDgpIDU1NS0xMjM0Ci0gICAgICAgICAgICAgICAvLyAoYWxsb3cgdGhlIGFkZGl0aW9uIG9mIHBhcmVucyBhcyBhbiBhZnRlcnRob3VnaHQpCi0gICAgICAgICAgICAgICBMIlxcKFxcZHswLDN9XFwpKFxcLnxbLSBdKT9cXGR7MCwzfShcXC58Wy0gXSk/XFxkezAsNH0iLAotCi0gICAgICAgICAgICAgICAvLyAoNDA4IDU1NS0xMjM0Ci0gICAgICAgICAgICAgICBMIlxcKFxcZHswLDN9KFxcLnxbLSBdKT9cXGR7MCwzfShcXC58Wy0gXSk/XFxkezAsNH0iLAotCi0gICAgICAgICAgICAgICAvLyA0MDgpIDU1NS0xMjM0Ci0gICAgICAgICAgICAgICBMIlxcZHswLDN9XFwpKFxcLnxbLSBdKT9cXGR7MCwzfShcXC58Wy0gXSk/XFxkezAsNH0iLAotCi0gICAgICAgICAgICAgICAvLyBpbnRlcm5hdGlvbmFsCi0gICAgICAgICAgICAgICBMIjAxMShcXC58Wy0gXFxkXSkqIik7Ci0KLSAgR0xPQkFMX0FSUkFZKAotICAgICAgcFJ1bnRpbWUsIEwiUkVfUEhPTkVfQ09NTUlUIiwgTCJcXGR7M30oXFwufFstIF0pP1xcZHs0fSIsICAvLyA1NTUtMTIzNAotICAgICAgTCJcXGR7M30oXFwufFstIF0pP1xcZHszfShcXC58Wy0gXSk/XFxkezR9IiwgICAgICAgICAgICAgICAvLyA0MDggNTU1LTEyMzQKLSAgICAgIEwiXFwoXFxkezN9XFwpKFxcLnxbLSBdKT9cXGR7M30oXFwufFstIF0pP1xcZHs0fSIsICAvLyAoNDA4KSA1NTUtMTIzNAotICAgICAgTCIwMTEoXFwufFstIFxcZF0pKiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVybmF0aW9uYWwKLQotICBHTE9CQUxfQVJSQVkocFJ1bnRpbWUsIEwiUkVfU1NOX0VOVFJZIiwKLSAgICAgICAgICAgICAgIEwiXFxkezAsM30oXFwufFstIF0pP1xcZHswLDJ9KFxcLnxbLSBdKT9cXGR7MCw0fSIpOwotCi0gIEdMT0JBTF9BUlJBWShwUnVudGltZSwgTCJSRV9TU05fQ09NTUlUIiwKLSAgICAgICAgICAgICAgIEwiXFxkezN9KFxcLnxbLSBdKT9cXGR7Mn0oXFwufFstIF0pP1xcZHs0fSIpOwotfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9qYXZhc2NyaXB0L0NvbnN0cy5oIGIvZnBkZnNkay9qYXZhc2NyaXB0L0NvbnN0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzU4Y2I5Li4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvamF2YXNjcmlwdC9Db25zdHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGUERGU0RLX0pBVkFTQ1JJUFRfQ09OU1RTX0hfCi0jZGVmaW5lIEZQREZTREtfSkFWQVNDUklQVF9DT05TVFNfSF8KLQotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19EZWZpbmUuaCIKLQotY2xhc3MgQ0pTX0JvcmRlciA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENKU19Cb3JkZXIodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQotICB+Q0pTX0JvcmRlcigpIG92ZXJyaWRlIHt9Ci0KLSAgREVDTEFSRV9KU19DTEFTU19DT05TVCgpOwotfTsKLQotY2xhc3MgQ0pTX0Rpc3BsYXkgOiBwdWJsaWMgQ0pTX09iamVjdCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDSlNfRGlzcGxheSh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9Ci0gIH5DSlNfRGlzcGxheSgpIG92ZXJyaWRlIHt9Ci0KLSAgREVDTEFSRV9KU19DTEFTU19DT05TVCgpOwotfTsKLQotY2xhc3MgQ0pTX0ZvbnQgOiBwdWJsaWMgQ0pTX09iamVjdCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDSlNfRm9udCh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9Ci0gIH5DSlNfRm9udCgpIG92ZXJyaWRlIHt9Ci0KLSAgREVDTEFSRV9KU19DTEFTU19DT05TVCgpOwotfTsKLQotY2xhc3MgQ0pTX0hpZ2hsaWdodCA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENKU19IaWdobGlnaHQodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQotICB+Q0pTX0hpZ2hsaWdodCgpIG92ZXJyaWRlIHt9Ci0KLSAgREVDTEFSRV9KU19DTEFTU19DT05TVCgpOwotfTsKLQotY2xhc3MgQ0pTX1Bvc2l0aW9uIDogcHVibGljIENKU19PYmplY3QgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0pTX1Bvc2l0aW9uKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge30KLSAgfkNKU19Qb3NpdGlvbigpIG92ZXJyaWRlIHt9Ci0KLSAgREVDTEFSRV9KU19DTEFTU19DT05TVCgpOwotfTsKLQotY2xhc3MgQ0pTX1NjYWxlSG93IDogcHVibGljIENKU19PYmplY3QgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0pTX1NjYWxlSG93KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge30KLSAgfkNKU19TY2FsZUhvdygpIG92ZXJyaWRlIHt9Ci0KLSAgREVDTEFSRV9KU19DTEFTU19DT05TVCgpOwotfTsKLQotY2xhc3MgQ0pTX1NjYWxlV2hlbiA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENKU19TY2FsZVdoZW4odjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQotICB+Q0pTX1NjYWxlV2hlbigpIG92ZXJyaWRlIHt9Ci0KLSAgREVDTEFSRV9KU19DTEFTU19DT05TVCgpOwotfTsKLQotY2xhc3MgQ0pTX1N0eWxlIDogcHVibGljIENKU19PYmplY3QgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0pTX1N0eWxlKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge30KLSAgfkNKU19TdHlsZSgpIG92ZXJyaWRlIHt9Ci0KLSAgREVDTEFSRV9KU19DTEFTU19DT05TVCgpOwotfTsKLQotY2xhc3MgQ0pTX1pvb210eXBlIDogcHVibGljIENKU19PYmplY3QgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0pTX1pvb210eXBlKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge30KLSAgfkNKU19ab29tdHlwZSgpIG92ZXJyaWRlIHt9Ci0KLSAgREVDTEFSRV9KU19DTEFTU19DT05TVCgpOwotfTsKLQotY2xhc3MgQ0pTX0dsb2JhbENvbnN0cyA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIERlZmluZUpTT2JqZWN0cyhDSlNfUnVudGltZSogcFJ1bnRpbWUpOwotfTsKLQotY2xhc3MgQ0pTX0dsb2JhbEFycmF5cyA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyB2b2lkIERlZmluZUpTT2JqZWN0cyhDSlNfUnVudGltZSogcFJ1bnRtaWUpOwotfTsKLQotI2VuZGlmICAvLyBGUERGU0RLX0pBVkFTQ1JJUFRfQ09OU1RTX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2phdmFzY3JpcHQvREVQUyBiL2ZwZGZzZGsvamF2YXNjcmlwdC9ERVBTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmE1MWFhLi4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvamF2YXNjcmlwdC9ERVBTCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1pbmNsdWRlX3J1bGVzID0gWwotICAnK2Z4anMnCi1dCmRpZmYgLS1naXQgYS9mcGRmc2RrL2phdmFzY3JpcHQvRG9jdW1lbnQuY3BwIGIvZnBkZnNkay9qYXZhc2NyaXB0L0RvY3VtZW50LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ1YjhiOS4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2phdmFzY3JpcHQvRG9jdW1lbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTY1OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvRG9jdW1lbnQuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udC5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudC5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJpbmcuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2ludGVyZm9ybS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX25hbWV0cmVlLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX2Fubm90aXRlcmF0aW9uLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX2Zvcm1maWxsZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfaW50ZXJmb3JtLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX3BhZ2V2aWV3LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX3dpZGdldC5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9Bbm5vdC5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9GaWVsZC5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9JY29uLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L2FwcC5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9janNfZXZlbnRfY29udGV4dC5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9janNfcnVudGltZS5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9yZXNvdXJjZS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9tYXRoLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotCi1KU0NvbnN0U3BlYyBDSlNfUHJpbnRQYXJhbXNPYmo6OkNvbnN0U3BlY3NbXSA9IHt7MCwgSlNDb25zdFNwZWM6Ok51bWJlciwgMCwgMH19OwotCi1KU1Byb3BlcnR5U3BlYyBDSlNfUHJpbnRQYXJhbXNPYmo6OlByb3BlcnR5U3BlY3NbXSA9IHt7MCwgMCwgMH19OwotCi1KU01ldGhvZFNwZWMgQ0pTX1ByaW50UGFyYW1zT2JqOjpNZXRob2RTcGVjc1tdID0ge3swLCAwfX07Ci0KLUlNUExFTUVOVF9KU19DTEFTUyhDSlNfUHJpbnRQYXJhbXNPYmosIFByaW50UGFyYW1zT2JqKQotCi1QcmludFBhcmFtc09iajo6UHJpbnRQYXJhbXNPYmooQ0pTX09iamVjdCogcEpTT2JqZWN0KQotICAgIDogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCkgewotICBiVUkgPSB0cnVlOwotICBuU3RhcnQgPSAwOwotICBuRW5kID0gMDsKLSAgYlNpbGVudCA9IGZhbHNlOwotICBiU2hyaW5rVG9GaXQgPSBmYWxzZTsKLSAgYlByaW50QXNJbWFnZSA9IGZhbHNlOwotICBiUmV2ZXJzZSA9IGZhbHNlOwotICBiQW5ub3RhdGlvbnMgPSB0cnVlOwotfQotCi0jZGVmaW5lIE1JTldJRFRIIDUuMGYKLSNkZWZpbmUgTUlOSEVJR0hUIDUuMGYKLQotSlNDb25zdFNwZWMgQ0pTX0RvY3VtZW50OjpDb25zdFNwZWNzW10gPSB7ezAsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDAsIDB9fTsKLQotSlNQcm9wZXJ0eVNwZWMgQ0pTX0RvY3VtZW50OjpQcm9wZXJ0eVNwZWNzW10gPSB7Ci0gICAgeyJBREJFIiwgZ2V0X0FEQkVfc3RhdGljLCBzZXRfQURCRV9zdGF0aWN9LAotICAgIHsiYXV0aG9yIiwgZ2V0X2F1dGhvcl9zdGF0aWMsIHNldF9hdXRob3Jfc3RhdGljfSwKLSAgICB7ImJhc2VVUkwiLCBnZXRfYmFzZVVSTF9zdGF0aWMsIHNldF9iYXNlVVJMX3N0YXRpY30sCi0gICAgeyJib29rbWFya1Jvb3QiLCBnZXRfYm9va21hcmtSb290X3N0YXRpYywgc2V0X2Jvb2ttYXJrUm9vdF9zdGF0aWN9LAotICAgIHsiY2FsY3VsYXRlIiwgZ2V0X2NhbGN1bGF0ZV9zdGF0aWMsIHNldF9jYWxjdWxhdGVfc3RhdGljfSwKLSAgICB7IkNvbGxhYiIsIGdldF9Db2xsYWJfc3RhdGljLCBzZXRfQ29sbGFiX3N0YXRpY30sCi0gICAgeyJjcmVhdGlvbkRhdGUiLCBnZXRfY3JlYXRpb25EYXRlX3N0YXRpYywgc2V0X2NyZWF0aW9uRGF0ZV9zdGF0aWN9LAotICAgIHsiY3JlYXRvciIsIGdldF9jcmVhdG9yX3N0YXRpYywgc2V0X2NyZWF0b3Jfc3RhdGljfSwKLSAgICB7ImRlbGF5IiwgZ2V0X2RlbGF5X3N0YXRpYywgc2V0X2RlbGF5X3N0YXRpY30sCi0gICAgeyJkaXJ0eSIsIGdldF9kaXJ0eV9zdGF0aWMsIHNldF9kaXJ0eV9zdGF0aWN9LAotICAgIHsiZG9jdW1lbnRGaWxlTmFtZSIsIGdldF9kb2N1bWVudEZpbGVOYW1lX3N0YXRpYywKLSAgICAgc2V0X2RvY3VtZW50RmlsZU5hbWVfc3RhdGljfSwKLSAgICB7ImV4dGVybmFsIiwgZ2V0X2V4dGVybmFsX3N0YXRpYywgc2V0X2V4dGVybmFsX3N0YXRpY30sCi0gICAgeyJmaWxlc2l6ZSIsIGdldF9maWxlc2l6ZV9zdGF0aWMsIHNldF9maWxlc2l6ZV9zdGF0aWN9LAotICAgIHsiaWNvbnMiLCBnZXRfaWNvbnNfc3RhdGljLCBzZXRfaWNvbnNfc3RhdGljfSwKLSAgICB7ImluZm8iLCBnZXRfaW5mb19zdGF0aWMsIHNldF9pbmZvX3N0YXRpY30sCi0gICAgeyJrZXl3b3JkcyIsIGdldF9rZXl3b3Jkc19zdGF0aWMsIHNldF9rZXl3b3Jkc19zdGF0aWN9LAotICAgIHsibGF5b3V0IiwgZ2V0X2xheW91dF9zdGF0aWMsIHNldF9sYXlvdXRfc3RhdGljfSwKLSAgICB7Im1lZGlhIiwgZ2V0X21lZGlhX3N0YXRpYywgc2V0X21lZGlhX3N0YXRpY30sCi0gICAgeyJtb2REYXRlIiwgZ2V0X21vZERhdGVfc3RhdGljLCBzZXRfbW9kRGF0ZV9zdGF0aWN9LAotICAgIHsibW91c2VYIiwgZ2V0X21vdXNlWF9zdGF0aWMsIHNldF9tb3VzZVhfc3RhdGljfSwKLSAgICB7Im1vdXNlWSIsIGdldF9tb3VzZVlfc3RhdGljLCBzZXRfbW91c2VZX3N0YXRpY30sCi0gICAgeyJudW1GaWVsZHMiLCBnZXRfbnVtRmllbGRzX3N0YXRpYywgc2V0X251bUZpZWxkc19zdGF0aWN9LAotICAgIHsibnVtUGFnZXMiLCBnZXRfbnVtUGFnZXNfc3RhdGljLCBzZXRfbnVtUGFnZXNfc3RhdGljfSwKLSAgICB7InBhZ2VOdW0iLCBnZXRfcGFnZU51bV9zdGF0aWMsIHNldF9wYWdlTnVtX3N0YXRpY30sCi0gICAgeyJwYWdlV2luZG93UmVjdCIsIGdldF9wYWdlV2luZG93UmVjdF9zdGF0aWMsIHNldF9wYWdlV2luZG93UmVjdF9zdGF0aWN9LAotICAgIHsicGF0aCIsIGdldF9wYXRoX3N0YXRpYywgc2V0X3BhdGhfc3RhdGljfSwKLSAgICB7InByb2R1Y2VyIiwgZ2V0X3Byb2R1Y2VyX3N0YXRpYywgc2V0X3Byb2R1Y2VyX3N0YXRpY30sCi0gICAgeyJzdWJqZWN0IiwgZ2V0X3N1YmplY3Rfc3RhdGljLCBzZXRfc3ViamVjdF9zdGF0aWN9LAotICAgIHsidGl0bGUiLCBnZXRfdGl0bGVfc3RhdGljLCBzZXRfdGl0bGVfc3RhdGljfSwKLSAgICB7IlVSTCIsIGdldF9VUkxfc3RhdGljLCBzZXRfVVJMX3N0YXRpY30sCi0gICAgeyJ6b29tIiwgZ2V0X3pvb21fc3RhdGljLCBzZXRfem9vbV9zdGF0aWN9LAotICAgIHsiem9vbVR5cGUiLCBnZXRfem9vbVR5cGVfc3RhdGljLCBzZXRfem9vbVR5cGVfc3RhdGljfSwKLSAgICB7MCwgMCwgMH19OwotCi1KU01ldGhvZFNwZWMgQ0pTX0RvY3VtZW50OjpNZXRob2RTcGVjc1tdID0gewotICAgIHsiYWRkQW5ub3QiLCBhZGRBbm5vdF9zdGF0aWN9LAotICAgIHsiYWRkRmllbGQiLCBhZGRGaWVsZF9zdGF0aWN9LAotICAgIHsiYWRkTGluayIsIGFkZExpbmtfc3RhdGljfSwKLSAgICB7ImFkZEljb24iLCBhZGRJY29uX3N0YXRpY30sCi0gICAgeyJjYWxjdWxhdGVOb3ciLCBjYWxjdWxhdGVOb3dfc3RhdGljfSwKLSAgICB7ImNsb3NlRG9jIiwgY2xvc2VEb2Nfc3RhdGljfSwKLSAgICB7ImNyZWF0ZURhdGFPYmplY3QiLCBjcmVhdGVEYXRhT2JqZWN0X3N0YXRpY30sCi0gICAgeyJkZWxldGVQYWdlcyIsIGRlbGV0ZVBhZ2VzX3N0YXRpY30sCi0gICAgeyJleHBvcnRBc1RleHQiLCBleHBvcnRBc1RleHRfc3RhdGljfSwKLSAgICB7ImV4cG9ydEFzRkRGIiwgZXhwb3J0QXNGREZfc3RhdGljfSwKLSAgICB7ImV4cG9ydEFzWEZERiIsIGV4cG9ydEFzWEZERl9zdGF0aWN9LAotICAgIHsiZXh0cmFjdFBhZ2VzIiwgZXh0cmFjdFBhZ2VzX3N0YXRpY30sCi0gICAgeyJnZXRBbm5vdCIsIGdldEFubm90X3N0YXRpY30sCi0gICAgeyJnZXRBbm5vdHMiLCBnZXRBbm5vdHNfc3RhdGljfSwKLSAgICB7ImdldEFubm90M0QiLCBnZXRBbm5vdDNEX3N0YXRpY30sCi0gICAgeyJnZXRBbm5vdHMzRCIsIGdldEFubm90czNEX3N0YXRpY30sCi0gICAgeyJnZXRGaWVsZCIsIGdldEZpZWxkX3N0YXRpY30sCi0gICAgeyJnZXRJY29uIiwgZ2V0SWNvbl9zdGF0aWN9LAotICAgIHsiZ2V0TGlua3MiLCBnZXRMaW5rc19zdGF0aWN9LAotICAgIHsiZ2V0TnRoRmllbGROYW1lIiwgZ2V0TnRoRmllbGROYW1lX3N0YXRpY30sCi0gICAgeyJnZXRPQ0dzIiwgZ2V0T0NHc19zdGF0aWN9LAotICAgIHsiZ2V0UGFnZUJveCIsIGdldFBhZ2VCb3hfc3RhdGljfSwKLSAgICB7ImdldFBhZ2VOdGhXb3JkIiwgZ2V0UGFnZU50aFdvcmRfc3RhdGljfSwKLSAgICB7ImdldFBhZ2VOdGhXb3JkUXVhZHMiLCBnZXRQYWdlTnRoV29yZFF1YWRzX3N0YXRpY30sCi0gICAgeyJnZXRQYWdlTnVtV29yZHMiLCBnZXRQYWdlTnVtV29yZHNfc3RhdGljfSwKLSAgICB7ImdldFByaW50UGFyYW1zIiwgZ2V0UHJpbnRQYXJhbXNfc3RhdGljfSwKLSAgICB7ImdldFVSTCIsIGdldFVSTF9zdGF0aWN9LAotICAgIHsiZ290b05hbWVkRGVzdCIsIGdvdG9OYW1lZERlc3Rfc3RhdGljfSwKLSAgICB7ImltcG9ydEFuRkRGIiwgaW1wb3J0QW5GREZfc3RhdGljfSwKLSAgICB7ImltcG9ydEFuWEZERiIsIGltcG9ydEFuWEZERl9zdGF0aWN9LAotICAgIHsiaW1wb3J0VGV4dERhdGEiLCBpbXBvcnRUZXh0RGF0YV9zdGF0aWN9LAotICAgIHsiaW5zZXJ0UGFnZXMiLCBpbnNlcnRQYWdlc19zdGF0aWN9LAotICAgIHsibWFpbEZvcm0iLCBtYWlsRm9ybV9zdGF0aWN9LAotICAgIHsicHJpbnQiLCBwcmludF9zdGF0aWN9LAotICAgIHsicmVtb3ZlRmllbGQiLCByZW1vdmVGaWVsZF9zdGF0aWN9LAotICAgIHsicmVwbGFjZVBhZ2VzIiwgcmVwbGFjZVBhZ2VzX3N0YXRpY30sCi0gICAgeyJyZXNldEZvcm0iLCByZXNldEZvcm1fc3RhdGljfSwKLSAgICB7InJlbW92ZUljb24iLCByZW1vdmVJY29uX3N0YXRpY30sCi0gICAgeyJzYXZlQXMiLCBzYXZlQXNfc3RhdGljfSwKLSAgICB7InN1Ym1pdEZvcm0iLCBzdWJtaXRGb3JtX3N0YXRpY30sCi0gICAgeyJzeW5jQW5ub3RTY2FuIiwgc3luY0Fubm90U2Nhbl9zdGF0aWN9LAotICAgIHsibWFpbERvYyIsIG1haWxEb2Nfc3RhdGljfSwKLSAgICB7MCwgMH19OwotCi1JTVBMRU1FTlRfSlNfQ0xBU1MoQ0pTX0RvY3VtZW50LCBEb2N1bWVudCkKLQotdm9pZCBDSlNfRG9jdW1lbnQ6OkluaXRJbnN0YW5jZShJSlNfUnVudGltZSogcElSdW50aW1lKSB7Ci0gIENKU19SdW50aW1lKiBwUnVudGltZSA9IHN0YXRpY19jYXN0PENKU19SdW50aW1lKj4ocElSdW50aW1lKTsKLSAgRG9jdW1lbnQqIHBEb2MgPSBzdGF0aWNfY2FzdDxEb2N1bWVudCo+KEdldEVtYmVkT2JqZWN0KCkpOwotICBwRG9jLT5TZXRGb3JtRmlsbEVudihwUnVudGltZS0+R2V0Rm9ybUZpbGxFbnYoKSk7Ci19Ci0KLURvY3VtZW50OjpEb2N1bWVudChDSlNfT2JqZWN0KiBwSlNPYmplY3QpCi0gICAgOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KSwKLSAgICAgIG1fcEZvcm1GaWxsRW52KG51bGxwdHIpLAotICAgICAgbV9jd0Jhc2VVUkwoTCIiKSwKLSAgICAgIG1fYkRlbGF5KGZhbHNlKSB7fQotCi1Eb2N1bWVudDo6fkRvY3VtZW50KCkgewotfQotCi0vLyB0aGUgdG90YWwgbnVtYmVyIG9mIGZpbGVkcyBpbiBkb2N1bWVudC4KLWJvb2wgRG9jdW1lbnQ6Om51bUZpZWxkcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTUkVBRE9OTFkpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIW1fcEZvcm1GaWxsRW52KSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU0JBRE9CSkVDVCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gbV9wRm9ybUZpbGxFbnYtPkdldEludGVyRm9ybSgpOwotICBDUERGX0ludGVyRm9ybSogcFBERkZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKLSAgdnAgPDwgc3RhdGljX2Nhc3Q8aW50PihwUERGRm9ybS0+Q291bnRGaWVsZHMoQ0ZYX1dpZGVTdHJpbmcoKSkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6ZGlydHkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmICghbV9wRm9ybUZpbGxFbnYpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTQkFET0JKRUNUKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKHZwLklzR2V0dGluZygpKSB7Ci0gICAgdnAgPDwgISFtX3BGb3JtRmlsbEVudi0+R2V0Q2hhbmdlTWFyaygpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGJvb2wgYkNoYW5nZWQgPSBmYWxzZTsKLSAgdnAgPj4gYkNoYW5nZWQ7Ci0gIGlmIChiQ2hhbmdlZCkKLSAgICBtX3BGb3JtRmlsbEVudi0+U2V0Q2hhbmdlTWFyaygpOwotICBlbHNlCi0gICAgbV9wRm9ybUZpbGxFbnYtPkNsZWFyQ2hhbmdlTWFyaygpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50OjpBREJFKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHZwLklzR2V0dGluZygpKQotICAgIHZwLkdldEpTVmFsdWUoKS0+U2V0TnVsbChwUnVudGltZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OnBhZ2VOdW0oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAoIW1fcEZvcm1GaWxsRW52KSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU0JBRE9CSkVDVCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICh2cC5Jc0dldHRpbmcoKSkgewotICAgIGlmIChDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBtX3BGb3JtRmlsbEVudi0+R2V0Q3VycmVudFZpZXcoKSkKLSAgICAgIHZwIDw8IHBQYWdlVmlldy0+R2V0UGFnZUluZGV4KCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaW50IGlQYWdlQ291bnQgPSBtX3BGb3JtRmlsbEVudi0+R2V0UGFnZUNvdW50KCk7Ci0gIGludCBpUGFnZU51bSA9IDA7Ci0gIHZwID4+IGlQYWdlTnVtOwotICBpZiAoaVBhZ2VOdW0gPj0gMCAmJiBpUGFnZU51bSA8IGlQYWdlQ291bnQpCi0gICAgbV9wRm9ybUZpbGxFbnYtPkpTX2RvY2dvdG9QYWdlKGlQYWdlTnVtKTsKLSAgZWxzZSBpZiAoaVBhZ2VOdW0gPj0gaVBhZ2VDb3VudCkKLSAgICBtX3BGb3JtRmlsbEVudi0+SlNfZG9jZ290b1BhZ2UoaVBhZ2VDb3VudCAtIDEpOwotICBlbHNlIGlmIChpUGFnZU51bSA8IDApCi0gICAgbV9wRm9ybUZpbGxFbnYtPkpTX2RvY2dvdG9QYWdlKDApOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50OjphZGRBbm5vdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIC8vIE5vdCBzdXBwb3J0ZWQuCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50OjphZGRGaWVsZChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIC8vIE5vdCBzdXBwb3J0ZWQuCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50OjpleHBvcnRBc1RleHQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50OjpleHBvcnRBc0ZERihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OmV4cG9ydEFzWEZERihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIE1hcHMgYSBmaWVsZCBvYmplY3QgaW4gUERGIGRvY3VtZW50IHRvIGEgSmF2YVNjcmlwdCB2YXJpYWJsZQotLy8gY29tbWVudDoKLS8vIG5vdGU6IHRoZSBwYXJlbXRlciBjTmFtZSwgdGhpcyBpcyBjbHVlIGhvdyB0byB0cmVhdCBpZiB0aGUgY05hbWUgaXMgbm90IGEKLS8vIHZhbGlhYmxlIGZpbGVkIG5hbWUgaW4gdGhpcyBkb2N1bWVudAotCi1ib29sIERvY3VtZW50OjpnZXRGaWVsZChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmIChwYXJhbXMuc2l6ZSgpIDwgMSkgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFtX3BGb3JtRmlsbEVudikgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNCQURPQkpFQ1QpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBDRlhfV2lkZVN0cmluZyB3aWRlTmFtZSA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcocFJ1bnRpbWUpOwotICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IG1fcEZvcm1GaWxsRW52LT5HZXRJbnRlckZvcm0oKTsKLSAgQ1BERl9JbnRlckZvcm0qIHBQREZGb3JtID0gcEludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7Ci0gIGlmIChwUERGRm9ybS0+Q291bnRGaWVsZHMod2lkZU5hbWUpIDw9IDApIHsKLSAgICB2UmV0LlNldE51bGwocFJ1bnRpbWUpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBGaWVsZE9iaiA9Ci0gICAgICBwUnVudGltZS0+TmV3RnhEeW5hbWljT2JqKENKU19GaWVsZDo6Z19uT2JqRGVmbklEKTsKLSAgaWYgKHBGaWVsZE9iai5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENKU19GaWVsZCogcEpTRmllbGQgPQotICAgICAgc3RhdGljX2Nhc3Q8Q0pTX0ZpZWxkKj4ocFJ1bnRpbWUtPkdldE9iamVjdFByaXZhdGUocEZpZWxkT2JqKSk7Ci0gIEZpZWxkKiBwRmllbGQgPSBzdGF0aWNfY2FzdDxGaWVsZCo+KHBKU0ZpZWxkLT5HZXRFbWJlZE9iamVjdCgpKTsKLSAgcEZpZWxkLT5BdHRhY2hGaWVsZCh0aGlzLCB3aWRlTmFtZSk7Ci0gIHZSZXQgPSBDSlNfVmFsdWUocFJ1bnRpbWUsIHBKU0ZpZWxkKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIEdldHMgdGhlIG5hbWUgb2YgdGhlIG50aCBmaWVsZCBpbiB0aGUgZG9jdW1lbnQKLWJvb2wgRG9jdW1lbnQ6OmdldE50aEZpZWxkTmFtZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghbV9wRm9ybUZpbGxFbnYpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTQkFET0JKRUNUKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaW50IG5JbmRleCA9IHBhcmFtc1swXS5Ub0ludChwUnVudGltZSk7Ci0gIGlmIChuSW5kZXggPCAwKSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU1ZBTFVFRVJST1IpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IG1fcEZvcm1GaWxsRW52LT5HZXRJbnRlckZvcm0oKTsKLSAgQ1BERl9JbnRlckZvcm0qIHBQREZGb3JtID0gcEludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7Ci0gIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBwUERGRm9ybS0+R2V0RmllbGQobkluZGV4LCBDRlhfV2lkZVN0cmluZygpKTsKLSAgaWYgKCFwRmllbGQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHZSZXQgPSBDSlNfVmFsdWUocFJ1bnRpbWUsIHBGaWVsZC0+R2V0RnVsbE5hbWUoKS5jX3N0cigpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OmltcG9ydEFuRkRGKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6aW1wb3J0QW5YRkRGKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6aW1wb3J0VGV4dERhdGEoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCi0gIHJldHVybiB0cnVlOwotfQotCi0vLyBleHBvcnRzIHRoZSBmb3JtIGRhdGEgYW5kIG1haWxzIHRoZSByZXN1bHRpbmcgZmRmIGZpbGUgYXMgYW4gYXR0YWNobWVudCB0bwotLy8gYWxsIHJlY2lwaWVudHMuCi0vLyBjb21tZW50OiBuZWVkIHJlYWRlciBzdXBwb3J0cwotYm9vbCBEb2N1bWVudDo6bWFpbEZvcm0oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAoIW1fcEZvcm1GaWxsRW52KSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU0JBRE9CSkVDVCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghbV9wRm9ybUZpbGxFbnYtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0VYVFJBQ1RfQUNDRVNTKSkgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNOT1BFUk1JU1NJT04pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpbnQgaUxlbmd0aCA9IHBhcmFtcy5zaXplKCk7Ci0gIGJvb2wgYlVJID0gaUxlbmd0aCA+IDAgPyBwYXJhbXNbMF0uVG9Cb29sKHBSdW50aW1lKSA6IHRydWU7Ci0gIENGWF9XaWRlU3RyaW5nIGNUbyA9IGlMZW5ndGggPiAxID8gcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSkgOiBMIiI7Ci0gIENGWF9XaWRlU3RyaW5nIGNDYyA9IGlMZW5ndGggPiAyID8gcGFyYW1zWzJdLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSkgOiBMIiI7Ci0gIENGWF9XaWRlU3RyaW5nIGNCY2MgPSBpTGVuZ3RoID4gMyA/IHBhcmFtc1szXS5Ub0NGWFdpZGVTdHJpbmcocFJ1bnRpbWUpIDogTCIiOwotICBDRlhfV2lkZVN0cmluZyBjU3ViamVjdCA9Ci0gICAgICBpTGVuZ3RoID4gNCA/IHBhcmFtc1s0XS5Ub0NGWFdpZGVTdHJpbmcocFJ1bnRpbWUpIDogTCIiOwotICBDRlhfV2lkZVN0cmluZyBjTXNnID0gaUxlbmd0aCA+IDUgPyBwYXJhbXNbNV0uVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKSA6IEwiIjsKLSAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBtX3BGb3JtRmlsbEVudi0+R2V0SW50ZXJGb3JtKCk7Ci0gIENGWF9CeXRlVGV4dEJ1ZiB0ZXh0QnVmOwotICBpZiAoIXBJbnRlckZvcm0tPkV4cG9ydEZvcm1Ub0ZERlRleHRCdWYodGV4dEJ1ZikpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHBSdW50aW1lLT5CZWdpbkJsb2NrKCk7Ci0gIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52ID0gcFJ1bnRpbWUtPkdldEZvcm1GaWxsRW52KCk7Ci0gIHBGb3JtRmlsbEVudi0+SlNfZG9jbWFpbEZvcm0odGV4dEJ1Zi5HZXRCdWZmZXIoKSwgdGV4dEJ1Zi5HZXRMZW5ndGgoKSwgYlVJLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNUby5jX3N0cigpLCBjU3ViamVjdC5jX3N0cigpLCBjQ2MuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjQmNjLmNfc3RyKCksIGNNc2cuY19zdHIoKSk7Ci0gIHBSdW50aW1lLT5FbmRCbG9jaygpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6cHJpbnQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAoIW1fcEZvcm1GaWxsRW52KSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU0JBRE9CSkVDVCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGJvb2wgYlVJID0gdHJ1ZTsKLSAgaW50IG5TdGFydCA9IDA7Ci0gIGludCBuRW5kID0gMDsKLSAgYm9vbCBiU2lsZW50ID0gZmFsc2U7Ci0gIGJvb2wgYlNocmlua1RvRml0ID0gZmFsc2U7Ci0gIGJvb2wgYlByaW50QXNJbWFnZSA9IGZhbHNlOwotICBib29sIGJSZXZlcnNlID0gZmFsc2U7Ci0gIGJvb2wgYkFubm90YXRpb25zID0gZmFsc2U7Ci0gIGludCBubGVuZ3RoID0gcGFyYW1zLnNpemUoKTsKLSAgaWYgKG5sZW5ndGggPT0gOSkgewotICAgIGlmIChwYXJhbXNbOF0uR2V0VHlwZSgpID09IENKU19WYWx1ZTo6VlRfb2JqZWN0KSB7Ci0gICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiA9IHBhcmFtc1s4XS5Ub1Y4T2JqZWN0KHBSdW50aW1lKTsKLSAgICAgIGlmIChDRlhKU19FbmdpbmU6OkdldE9iakRlZm5JRChwT2JqKSA9PQotICAgICAgICAgIENKU19QcmludFBhcmFtc09iajo6Z19uT2JqRGVmbklEKSB7Ci0gICAgICAgIGlmIChDSlNfT2JqZWN0KiBwSlNPYmogPSBwYXJhbXNbOF0uVG9DSlNPYmplY3QocFJ1bnRpbWUpKSB7Ci0gICAgICAgICAgaWYgKFByaW50UGFyYW1zT2JqKiBwcHJpbnRwYXJhbXNPYmogPQotICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UHJpbnRQYXJhbXNPYmoqPihwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpKSB7Ci0gICAgICAgICAgICBiVUkgPSBwcHJpbnRwYXJhbXNPYmotPmJVSTsKLSAgICAgICAgICAgIG5TdGFydCA9IHBwcmludHBhcmFtc09iai0+blN0YXJ0OwotICAgICAgICAgICAgbkVuZCA9IHBwcmludHBhcmFtc09iai0+bkVuZDsKLSAgICAgICAgICAgIGJTaWxlbnQgPSBwcHJpbnRwYXJhbXNPYmotPmJTaWxlbnQ7Ci0gICAgICAgICAgICBiU2hyaW5rVG9GaXQgPSBwcHJpbnRwYXJhbXNPYmotPmJTaHJpbmtUb0ZpdDsKLSAgICAgICAgICAgIGJQcmludEFzSW1hZ2UgPSBwcHJpbnRwYXJhbXNPYmotPmJQcmludEFzSW1hZ2U7Ci0gICAgICAgICAgICBiUmV2ZXJzZSA9IHBwcmludHBhcmFtc09iai0+YlJldmVyc2U7Ci0gICAgICAgICAgICBiQW5ub3RhdGlvbnMgPSBwcHJpbnRwYXJhbXNPYmotPmJBbm5vdGF0aW9uczsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKG5sZW5ndGggPj0gMSkKLSAgICAgIGJVSSA9IHBhcmFtc1swXS5Ub0Jvb2wocFJ1bnRpbWUpOwotICAgIGlmIChubGVuZ3RoID49IDIpCi0gICAgICBuU3RhcnQgPSBwYXJhbXNbMV0uVG9JbnQocFJ1bnRpbWUpOwotICAgIGlmIChubGVuZ3RoID49IDMpCi0gICAgICBuRW5kID0gcGFyYW1zWzJdLlRvSW50KHBSdW50aW1lKTsKLSAgICBpZiAobmxlbmd0aCA+PSA0KQotICAgICAgYlNpbGVudCA9IHBhcmFtc1szXS5Ub0Jvb2wocFJ1bnRpbWUpOwotICAgIGlmIChubGVuZ3RoID49IDUpCi0gICAgICBiU2hyaW5rVG9GaXQgPSBwYXJhbXNbNF0uVG9Cb29sKHBSdW50aW1lKTsKLSAgICBpZiAobmxlbmd0aCA+PSA2KQotICAgICAgYlByaW50QXNJbWFnZSA9IHBhcmFtc1s1XS5Ub0Jvb2wocFJ1bnRpbWUpOwotICAgIGlmIChubGVuZ3RoID49IDcpCi0gICAgICBiUmV2ZXJzZSA9IHBhcmFtc1s2XS5Ub0Jvb2wocFJ1bnRpbWUpOwotICAgIGlmIChubGVuZ3RoID49IDgpCi0gICAgICBiQW5ub3RhdGlvbnMgPSBwYXJhbXNbN10uVG9Cb29sKHBSdW50aW1lKTsKLSAgfQotCi0gIGlmIChtX3BGb3JtRmlsbEVudikgewotICAgIG1fcEZvcm1GaWxsRW52LT5KU19kb2NwcmludChiVUksIG5TdGFydCwgbkVuZCwgYlNpbGVudCwgYlNocmlua1RvRml0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUHJpbnRBc0ltYWdlLCBiUmV2ZXJzZSwgYkFubm90YXRpb25zKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIHJlbW92ZXMgdGhlIHNwZWNpZmllZCBmaWVsZCBmcm9tIHRoZSBkb2N1bWVudC4KLS8vIGNvbW1lbnQ6Ci0vLyBub3RlOiBpZiB0aGUgZmlsZWQgbmFtZSBpcyBub3QgcmF0aW9uYWwsIGFkb2JlIGlzIGR1bWIgZm9yIGl0LgotCi1ib29sIERvY3VtZW50OjpyZW1vdmVGaWVsZChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghbV9wRm9ybUZpbGxFbnYpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTQkFET0JKRUNUKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCEobV9wRm9ybUZpbGxFbnYtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkgfHwKLSAgICAgICAgbV9wRm9ybUZpbGxFbnYtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0FOTk9UX0ZPUk0pKSkgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNOT1BFUk1JU1NJT04pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBDRlhfV2lkZVN0cmluZyBzRmllbGROYW1lID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSk7Ci0gIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gbV9wRm9ybUZpbGxFbnYtPkdldEludGVyRm9ybSgpOwotICBzdGQ6OnZlY3RvcjxDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0cj4gd2lkZ2V0czsKLSAgcEludGVyRm9ybS0+R2V0V2lkZ2V0cyhzRmllbGROYW1lLCAmd2lkZ2V0cyk7Ci0gIGlmICh3aWRnZXRzLmVtcHR5KCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBwQW5ub3QgOiB3aWRnZXRzKSB7Ci0gICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBzdGF0aWNfY2FzdDxDUERGU0RLX1dpZGdldCo+KHBBbm5vdC5HZXQoKSk7Ci0gICAgaWYgKCFwV2lkZ2V0KQotICAgICAgY29udGludWU7Ci0KLSAgICBDRlhfRmxvYXRSZWN0IHJjQW5ub3QgPSBwV2lkZ2V0LT5HZXRSZWN0KCk7Ci0gICAgLS1yY0Fubm90LmxlZnQ7Ci0gICAgLS1yY0Fubm90LmJvdHRvbTsKLSAgICArK3JjQW5ub3QucmlnaHQ7Ci0gICAgKytyY0Fubm90LnRvcDsKLQotICAgIHN0ZDo6dmVjdG9yPENGWF9GbG9hdFJlY3Q+IGFSZWZyZXNoKDEsIHJjQW5ub3QpOwotICAgIFVuZGVybHlpbmdQYWdlVHlwZSogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRVbmRlcmx5aW5nUGFnZSgpOwotICAgIEFTU0VSVChwUGFnZSk7Ci0KLSAgICAvLyBJZiB0aGVyZSBpcyBjdXJyZW50bHkgbm8gcGFnZXZpZXcgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWdlIGJlaW5nIHVzZWQKLSAgICAvLyBkbyBub3QgY3JlYXRlIG9uZS4gV2UgbWF5IGJlIGluIHRoZSBwcm9jZXNzIG9mIHRlYXJpbmcgZG93biB0aGUgZG9jdW1lbnQKLSAgICAvLyBhbmQgY3JlYXRpbmcgYSBuZXcgcGFnZXZpZXcgYXQgdGhpcyBwb2ludCB3aWxsIGNhdXNlIGJhZCB0aGluZ3MuCi0gICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gbV9wRm9ybUZpbGxFbnYtPkdldFBhZ2VWaWV3KHBQYWdlLCBmYWxzZSk7Ci0gICAgaWYgKHBQYWdlVmlldykgewotI2lmIFBERl9FTkFCTEVfWEZBCi0gICAgICBwUGFnZVZpZXctPkRlbGV0ZUFubm90KHBXaWRnZXQpOwotI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQotICAgICAgcFBhZ2VWaWV3LT5VcGRhdGVSZWN0cyhhUmVmcmVzaCk7Ci0gICAgfQotICB9Ci0gIG1fcEZvcm1GaWxsRW52LT5TZXRDaGFuZ2VNYXJrKCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIHJlc2V0IGZpbGVkIHZhbHVlcyB3aXRoaW4gYSBkb2N1bWVudC4KLS8vIGNvbW1lbnQ6Ci0vLyBub3RlOiBpZiB0aGUgZmllbGRzIG5hbWVzIHIgbm90IHJhdGlvbmFsLCBhb2RiZSBpcyBkdW1iIGZvciBpdC4KLQotYm9vbCBEb2N1bWVudDo6cmVzZXRGb3JtKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKCFtX3BGb3JtRmlsbEVudikgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNCQURPQkpFQ1QpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIShtX3BGb3JtRmlsbEVudi0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSB8fAotICAgICAgICBtX3BGb3JtRmlsbEVudi0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fQU5OT1RfRk9STSkgfHwKLSAgICAgICAgbV9wRm9ybUZpbGxFbnYtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0ZJTExfRk9STSkpKSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU05PUEVSTUlTU0lPTik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBtX3BGb3JtRmlsbEVudi0+R2V0SW50ZXJGb3JtKCk7Ci0gIENQREZfSW50ZXJGb3JtKiBwUERGRm9ybSA9IHBJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOwotICBDSlNfQXJyYXkgYU5hbWU7Ci0KLSAgaWYgKHBhcmFtcy5lbXB0eSgpKSB7Ci0gICAgcFBERkZvcm0tPlJlc2V0Rm9ybSh0cnVlKTsKLSAgICBtX3BGb3JtRmlsbEVudi0+U2V0Q2hhbmdlTWFyaygpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgc3dpdGNoIChwYXJhbXNbMF0uR2V0VHlwZSgpKSB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFOYW1lLkF0dGFjaChwYXJhbXNbMF0uVG9WOEFycmF5KHBSdW50aW1lKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENKU19WYWx1ZTo6VlRfc3RyaW5nOgotICAgICAgYU5hbWUuU2V0RWxlbWVudChwUnVudGltZSwgMCwgcGFyYW1zWzBdKTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBhRmllbGRzOwotICBmb3IgKGludCBpID0gMCwgaXN6ID0gYU5hbWUuR2V0TGVuZ3RoKHBSdW50aW1lKTsgaSA8IGlzejsgKytpKSB7Ci0gICAgQ0pTX1ZhbHVlIHZhbEVsZW1lbnQocFJ1bnRpbWUpOwotICAgIGFOYW1lLkdldEVsZW1lbnQocFJ1bnRpbWUsIGksIHZhbEVsZW1lbnQpOwotICAgIENGWF9XaWRlU3RyaW5nIHN3VmFsID0gdmFsRWxlbWVudC5Ub0NGWFdpZGVTdHJpbmcocFJ1bnRpbWUpOwotICAgIGZvciAoaW50IGogPSAwLCBqc3ogPSBwUERGRm9ybS0+Q291bnRGaWVsZHMoc3dWYWwpOyBqIDwganN6OyArK2opCi0gICAgICBhRmllbGRzLnB1c2hfYmFjayhwUERGRm9ybS0+R2V0RmllbGQoaiwgc3dWYWwpKTsKLSAgfQotCi0gIGlmICghYUZpZWxkcy5lbXB0eSgpKSB7Ci0gICAgcFBERkZvcm0tPlJlc2V0Rm9ybShhRmllbGRzLCB0cnVlLCB0cnVlKTsKLSAgICBtX3BGb3JtRmlsbEVudi0+U2V0Q2hhbmdlTWFyaygpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OnNhdmVBcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OnN5bmNBbm5vdFNjYW4oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6c3VibWl0Rm9ybShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGludCBuU2l6ZSA9IHBhcmFtcy5zaXplKCk7Ci0gIGlmIChuU2l6ZSA8IDEpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghbV9wRm9ybUZpbGxFbnYpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTQkFET0JKRUNUKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBDSlNfQXJyYXkgYUZpZWxkczsKLSAgQ0ZYX1dpZGVTdHJpbmcgc3RyVVJMOwotICBib29sIGJGREYgPSB0cnVlOwotICBib29sIGJFbXB0eSA9IGZhbHNlOwotICBDSlNfVmFsdWUgdiA9IHBhcmFtc1swXTsKLSAgaWYgKHYuR2V0VHlwZSgpID09IENKU19WYWx1ZTo6VlRfc3RyaW5nKSB7Ci0gICAgc3RyVVJMID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSk7Ci0gICAgaWYgKG5TaXplID4gMSkKLSAgICAgIGJGREYgPSBwYXJhbXNbMV0uVG9Cb29sKHBSdW50aW1lKTsKLSAgICBpZiAoblNpemUgPiAyKQotICAgICAgYkVtcHR5ID0gcGFyYW1zWzJdLlRvQm9vbChwUnVudGltZSk7Ci0gICAgaWYgKG5TaXplID4gMykKLSAgICAgIGFGaWVsZHMuQXR0YWNoKHBhcmFtc1szXS5Ub1Y4QXJyYXkocFJ1bnRpbWUpKTsKLSAgfSBlbHNlIGlmICh2LkdldFR5cGUoKSA9PSBDSlNfVmFsdWU6OlZUX29iamVjdCkgewotICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqID0gcGFyYW1zWzBdLlRvVjhPYmplY3QocFJ1bnRpbWUpOwotICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSA9IHBSdW50aW1lLT5HZXRPYmplY3RQcm9wZXJ0eShwT2JqLCBMImNVUkwiKTsKLSAgICBpZiAoIXBWYWx1ZS5Jc0VtcHR5KCkpCi0gICAgICBzdHJVUkwgPSBDSlNfVmFsdWUocFJ1bnRpbWUsIHBWYWx1ZSkuVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKTsKLQotICAgIHBWYWx1ZSA9IHBSdW50aW1lLT5HZXRPYmplY3RQcm9wZXJ0eShwT2JqLCBMImJGREYiKTsKLSAgICBiRkRGID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCBwVmFsdWUpLlRvQm9vbChwUnVudGltZSk7Ci0KLSAgICBwVmFsdWUgPSBwUnVudGltZS0+R2V0T2JqZWN0UHJvcGVydHkocE9iaiwgTCJiRW1wdHkiKTsKLSAgICBiRW1wdHkgPSBDSlNfVmFsdWUocFJ1bnRpbWUsIHBWYWx1ZSkuVG9Cb29sKHBSdW50aW1lKTsKLQotICAgIHBWYWx1ZSA9IHBSdW50aW1lLT5HZXRPYmplY3RQcm9wZXJ0eShwT2JqLCBMImFGaWVsZHMiKTsKLSAgICBhRmllbGRzLkF0dGFjaChDSlNfVmFsdWUocFJ1bnRpbWUsIHBWYWx1ZSkuVG9WOEFycmF5KHBSdW50aW1lKSk7Ci0gIH0KLQotICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IG1fcEZvcm1GaWxsRW52LT5HZXRJbnRlckZvcm0oKTsKLSAgQ1BERl9JbnRlckZvcm0qIHBQREZJbnRlckZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKLSAgaWYgKGFGaWVsZHMuR2V0TGVuZ3RoKHBSdW50aW1lKSA9PSAwICYmIGJFbXB0eSkgewotICAgIGlmIChwUERGSW50ZXJGb3JtLT5DaGVja1JlcXVpcmVkRmllbGRzKG51bGxwdHIsIHRydWUpKSB7Ci0gICAgICBwUnVudGltZS0+QmVnaW5CbG9jaygpOwotICAgICAgcEludGVyRm9ybS0+U3VibWl0Rm9ybShzdHJVUkwsIGZhbHNlKTsKLSAgICAgIHBSdW50aW1lLT5FbmRCbG9jaygpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gZmllbGRPYmplY3RzOwotICBmb3IgKGludCBpID0gMCwgc3ogPSBhRmllbGRzLkdldExlbmd0aChwUnVudGltZSk7IGkgPCBzejsgKytpKSB7Ci0gICAgQ0pTX1ZhbHVlIHZhbE5hbWUocFJ1bnRpbWUpOwotICAgIGFGaWVsZHMuR2V0RWxlbWVudChwUnVudGltZSwgaSwgdmFsTmFtZSk7Ci0KLSAgICBDRlhfV2lkZVN0cmluZyBzTmFtZSA9IHZhbE5hbWUuVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKTsKLSAgICBDUERGX0ludGVyRm9ybSogcFBERkZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKLSAgICBmb3IgKGludCBqID0gMCwganN6ID0gcFBERkZvcm0tPkNvdW50RmllbGRzKHNOYW1lKTsgaiA8IGpzejsgKytqKSB7Ci0gICAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gcFBERkZvcm0tPkdldEZpZWxkKGosIHNOYW1lKTsKLSAgICAgIGlmICghYkVtcHR5ICYmIHBGaWVsZC0+R2V0VmFsdWUoKS5Jc0VtcHR5KCkpCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBmaWVsZE9iamVjdHMucHVzaF9iYWNrKHBGaWVsZCk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHBQREZJbnRlckZvcm0tPkNoZWNrUmVxdWlyZWRGaWVsZHMoJmZpZWxkT2JqZWN0cywgdHJ1ZSkpIHsKLSAgICBwUnVudGltZS0+QmVnaW5CbG9jaygpOwotICAgIHBJbnRlckZvcm0tPlN1Ym1pdEZpZWxkcyhzdHJVUkwsIGZpZWxkT2JqZWN0cywgdHJ1ZSwgIWJGREYpOwotICAgIHBSdW50aW1lLT5FbmRCbG9jaygpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIERvY3VtZW50OjpTZXRGb3JtRmlsbEVudihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgewotICBtX3BGb3JtRmlsbEVudi5SZXNldChwRm9ybUZpbGxFbnYpOwotfQotCi1ib29sIERvY3VtZW50Ojpib29rbWFya1Jvb3QoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6Om1haWxEb2MoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICAvLyBUT0RPKHRzZXBleik6IENoZWNrIG1heGltdW0gbnVtYmVyIG9mIGFsbG93ZWQgcGFyYW1zLgotICBib29sIGJVSSA9IHRydWU7Ci0gIENGWF9XaWRlU3RyaW5nIGNUbyA9IEwiIjsKLSAgQ0ZYX1dpZGVTdHJpbmcgY0NjID0gTCIiOwotICBDRlhfV2lkZVN0cmluZyBjQmNjID0gTCIiOwotICBDRlhfV2lkZVN0cmluZyBjU3ViamVjdCA9IEwiIjsKLSAgQ0ZYX1dpZGVTdHJpbmcgY01zZyA9IEwiIjsKLQotICBpZiAocGFyYW1zLnNpemUoKSA+PSAxKQotICAgIGJVSSA9IHBhcmFtc1swXS5Ub0Jvb2wocFJ1bnRpbWUpOwotICBpZiAocGFyYW1zLnNpemUoKSA+PSAyKQotICAgIGNUbyA9IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcocFJ1bnRpbWUpOwotICBpZiAocGFyYW1zLnNpemUoKSA+PSAzKQotICAgIGNDYyA9IHBhcmFtc1syXS5Ub0NGWFdpZGVTdHJpbmcocFJ1bnRpbWUpOwotICBpZiAocGFyYW1zLnNpemUoKSA+PSA0KQotICAgIGNCY2MgPSBwYXJhbXNbM10uVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKTsKLSAgaWYgKHBhcmFtcy5zaXplKCkgPj0gNSkKLSAgICBjU3ViamVjdCA9IHBhcmFtc1s0XS5Ub0NGWFdpZGVTdHJpbmcocFJ1bnRpbWUpOwotICBpZiAocGFyYW1zLnNpemUoKSA+PSA2KQotICAgIGNNc2cgPSBwYXJhbXNbNV0uVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKTsKLQotICBpZiAocGFyYW1zLnNpemUoKSA+PSAxICYmIHBhcmFtc1swXS5HZXRUeXBlKCkgPT0gQ0pTX1ZhbHVlOjpWVF9vYmplY3QpIHsKLSAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiA9IHBhcmFtc1swXS5Ub1Y4T2JqZWN0KHBSdW50aW1lKTsKLQotICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSA9IHBSdW50aW1lLT5HZXRPYmplY3RQcm9wZXJ0eShwT2JqLCBMImJVSSIpOwotICAgIGJVSSA9IENKU19WYWx1ZShwUnVudGltZSwgcFZhbHVlKS5Ub0Jvb2wocFJ1bnRpbWUpOwotCi0gICAgcFZhbHVlID0gcFJ1bnRpbWUtPkdldE9iamVjdFByb3BlcnR5KHBPYmosIEwiY1RvIik7Ci0gICAgY1RvID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCBwVmFsdWUpLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSk7Ci0KLSAgICBwVmFsdWUgPSBwUnVudGltZS0+R2V0T2JqZWN0UHJvcGVydHkocE9iaiwgTCJjQ2MiKTsKLSAgICBjQ2MgPSBDSlNfVmFsdWUocFJ1bnRpbWUsIHBWYWx1ZSkuVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKTsKLQotICAgIHBWYWx1ZSA9IHBSdW50aW1lLT5HZXRPYmplY3RQcm9wZXJ0eShwT2JqLCBMImNCY2MiKTsKLSAgICBjQmNjID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCBwVmFsdWUpLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSk7Ci0KLSAgICBwVmFsdWUgPSBwUnVudGltZS0+R2V0T2JqZWN0UHJvcGVydHkocE9iaiwgTCJjU3ViamVjdCIpOwotICAgIGNTdWJqZWN0ID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCBwVmFsdWUpLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSk7Ci0KLSAgICBwVmFsdWUgPSBwUnVudGltZS0+R2V0T2JqZWN0UHJvcGVydHkocE9iaiwgTCJjTXNnIik7Ci0gICAgY01zZyA9IENKU19WYWx1ZShwUnVudGltZSwgcFZhbHVlKS5Ub0NGWFdpZGVTdHJpbmcocFJ1bnRpbWUpOwotICB9Ci0KLSAgcFJ1bnRpbWUtPkJlZ2luQmxvY2soKTsKLSAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYgPSBwUnVudGltZS0+R2V0Rm9ybUZpbGxFbnYoKTsKLSAgcEZvcm1GaWxsRW52LT5KU19kb2NtYWlsRm9ybShudWxscHRyLCAwLCBiVUksIGNUby5jX3N0cigpLCBjU3ViamVjdC5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNDYy5jX3N0cigpLCBjQmNjLmNfc3RyKCksIGNNc2cuY19zdHIoKSk7Ci0gIHBSdW50aW1lLT5FbmRCbG9jaygpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6YXV0aG9yKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiBnZXRQcm9wZXJ0eUludGVybmFsKHBSdW50aW1lLCB2cCwgIkF1dGhvciIsIHNFcnJvcik7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OmluZm8oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTUkVBRE9OTFkpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIW1fcEZvcm1GaWxsRW52KSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU0JBRE9CSkVDVCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIENQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BGb3JtRmlsbEVudi0+R2V0UERGRG9jdW1lbnQoKS0+R2V0SW5mbygpOwotICBpZiAoIXBEaWN0aW9uYXJ5KQotICAgIHJldHVybiBmYWxzZTsKLQotICBDRlhfV2lkZVN0cmluZyBjd0F1dGhvciA9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dEZvcigiQXV0aG9yIik7Ci0gIENGWF9XaWRlU3RyaW5nIGN3VGl0bGUgPSBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHRGb3IoIlRpdGxlIik7Ci0gIENGWF9XaWRlU3RyaW5nIGN3U3ViamVjdCA9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dEZvcigiU3ViamVjdCIpOwotICBDRlhfV2lkZVN0cmluZyBjd0tleXdvcmRzID0gcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0Rm9yKCJLZXl3b3JkcyIpOwotICBDRlhfV2lkZVN0cmluZyBjd0NyZWF0b3IgPSBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHRGb3IoIkNyZWF0b3IiKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgY3dQcm9kdWNlciA9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dEZvcigiUHJvZHVjZXIiKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgY3dDcmVhdGlvbkRhdGUgPQotICAgICAgcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0Rm9yKCJDcmVhdGlvbkRhdGUiKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgY3dNb2REYXRlID0gcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0Rm9yKCJNb2REYXRlIik7Ci0gIENGWF9XaWRlU3RyaW5nIGN3VHJhcHBlZCA9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dEZvcigiVHJhcHBlZCIpOwotCi0gIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqID0gcFJ1bnRpbWUtPk5ld0Z4RHluYW1pY09iaigtMSk7Ci0gIHBSdW50aW1lLT5QdXRPYmplY3RQcm9wZXJ0eShwT2JqLCBMIkF1dGhvciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnVudGltZS0+TmV3U3RyaW5nKGN3QXV0aG9yLkFzU3RyaW5nQygpKSk7Ci0gIHBSdW50aW1lLT5QdXRPYmplY3RQcm9wZXJ0eShwT2JqLCBMIlRpdGxlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW50aW1lLT5OZXdTdHJpbmcoY3dUaXRsZS5Bc1N0cmluZ0MoKSkpOwotICBwUnVudGltZS0+UHV0T2JqZWN0UHJvcGVydHkocE9iaiwgTCJTdWJqZWN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW50aW1lLT5OZXdTdHJpbmcoY3dTdWJqZWN0LkFzU3RyaW5nQygpKSk7Ci0gIHBSdW50aW1lLT5QdXRPYmplY3RQcm9wZXJ0eShwT2JqLCBMIktleXdvcmRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW50aW1lLT5OZXdTdHJpbmcoY3dLZXl3b3Jkcy5Bc1N0cmluZ0MoKSkpOwotICBwUnVudGltZS0+UHV0T2JqZWN0UHJvcGVydHkocE9iaiwgTCJDcmVhdG9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW50aW1lLT5OZXdTdHJpbmcoY3dDcmVhdG9yLkFzU3RyaW5nQygpKSk7Ci0gIHBSdW50aW1lLT5QdXRPYmplY3RQcm9wZXJ0eShwT2JqLCBMIlByb2R1Y2VyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW50aW1lLT5OZXdTdHJpbmcoY3dQcm9kdWNlci5Bc1N0cmluZ0MoKSkpOwotICBwUnVudGltZS0+UHV0T2JqZWN0UHJvcGVydHkocE9iaiwgTCJDcmVhdGlvbkRhdGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bnRpbWUtPk5ld1N0cmluZyhjd0NyZWF0aW9uRGF0ZS5Bc1N0cmluZ0MoKSkpOwotICBwUnVudGltZS0+UHV0T2JqZWN0UHJvcGVydHkocE9iaiwgTCJNb2REYXRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW50aW1lLT5OZXdTdHJpbmcoY3dNb2REYXRlLkFzU3RyaW5nQygpKSk7Ci0gIHBSdW50aW1lLT5QdXRPYmplY3RQcm9wZXJ0eShwT2JqLCBMIlRyYXBwZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bnRpbWUtPk5ld1N0cmluZyhjd1RyYXBwZWQuQXNTdHJpbmdDKCkpKTsKLQotICAvLyBJdCdzIHRvIGJlIGNvbXBhdGlibGUgdG8gbm9uLXN0YW5kYXJkIGluZm8gZGljdGlvbmFyeS4KLSAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICpwRGljdGlvbmFyeSkgewotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic0tleSA9IGl0LmZpcnN0OwotICAgIENQREZfT2JqZWN0KiBwVmFsdWVPYmogPSBpdC5zZWNvbmQuZ2V0KCk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NLZXkgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNLZXkuQXNTdHJpbmdDKCkpOwotICAgIGlmIChwVmFsdWVPYmotPklzU3RyaW5nKCkgfHwgcFZhbHVlT2JqLT5Jc05hbWUoKSkgewotICAgICAgcFJ1bnRpbWUtPlB1dE9iamVjdFByb3BlcnR5KAotICAgICAgICAgIHBPYmosIHdzS2V5LAotICAgICAgICAgIHBSdW50aW1lLT5OZXdTdHJpbmcocFZhbHVlT2JqLT5HZXRVbmljb2RlVGV4dCgpLkFzU3RyaW5nQygpKSk7Ci0gICAgfSBlbHNlIGlmIChwVmFsdWVPYmotPklzTnVtYmVyKCkpIHsKLSAgICAgIHBSdW50aW1lLT5QdXRPYmplY3RQcm9wZXJ0eShwT2JqLCB3c0tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnVudGltZS0+TmV3TnVtYmVyKHBWYWx1ZU9iai0+R2V0TnVtYmVyKCkpKTsKLSAgICB9IGVsc2UgaWYgKHBWYWx1ZU9iai0+SXNCb29sZWFuKCkpIHsKLSAgICAgIHBSdW50aW1lLT5QdXRPYmplY3RQcm9wZXJ0eSgKLSAgICAgICAgICBwT2JqLCB3c0tleSwgcFJ1bnRpbWUtPk5ld0Jvb2xlYW4oISFwVmFsdWVPYmotPkdldEludGVnZXIoKSkpOwotICAgIH0KLSAgfQotICB2cCA8PCBwT2JqOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6Z2V0UHJvcGVydHlJbnRlcm5hbChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgcHJvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKCFtX3BGb3JtRmlsbEVudikgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNCQURPQkpFQ1QpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0aW9uYXJ5ID0gbV9wRm9ybUZpbGxFbnYtPkdldFBERkRvY3VtZW50KCktPkdldEluZm8oKTsKLSAgaWYgKCFwRGljdGlvbmFyeSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHZwLklzR2V0dGluZygpKSB7Ci0gICAgdnAgPDwgcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0Rm9yKHByb3BOYW1lKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoIW1fcEZvcm1GaWxsRW52LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpKSB7Ci0gICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTTk9QRVJNSVNTSU9OKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgY3NQcm9wZXJ0eTsKLSAgICB2cCA+PiBjc1Byb3BlcnR5OwotICAgIHBEaWN0aW9uYXJ5LT5TZXROZXdGb3I8Q1BERl9TdHJpbmc+KHByb3BOYW1lLCBQREZfRW5jb2RlVGV4dChjc1Byb3BlcnR5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgbV9wRm9ybUZpbGxFbnYtPlNldENoYW5nZU1hcmsoKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6Y3JlYXRpb25EYXRlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiBnZXRQcm9wZXJ0eUludGVybmFsKHBSdW50aW1lLCB2cCwgIkNyZWF0aW9uRGF0ZSIsIHNFcnJvcik7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OmNyZWF0b3IoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gZ2V0UHJvcGVydHlJbnRlcm5hbChwUnVudGltZSwgdnAsICJDcmVhdG9yIiwgc0Vycm9yKTsKLX0KLQotYm9vbCBEb2N1bWVudDo6ZGVsYXkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmICghbV9wRm9ybUZpbGxFbnYpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTQkFET0JKRUNUKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKHZwLklzR2V0dGluZygpKSB7Ci0gICAgdnAgPDwgbV9iRGVsYXk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKCFtX3BGb3JtRmlsbEVudi0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNOT1BFUk1JU1NJT04pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB2cCA+PiBtX2JEZWxheTsKLSAgaWYgKG1fYkRlbGF5KSB7Ci0gICAgbV9EZWxheURhdGEuY2xlYXIoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPENKU19EZWxheURhdGE+PiBEZWxheURhdGFUb1Byb2Nlc3M7Ci0gIERlbGF5RGF0YVRvUHJvY2Vzcy5zd2FwKG1fRGVsYXlEYXRhKTsKLSAgZm9yIChjb25zdCBhdXRvJiBwRGF0YSA6IERlbGF5RGF0YVRvUHJvY2VzcykKLSAgICBGaWVsZDo6RG9EZWxheShtX3BGb3JtRmlsbEVudi5HZXQoKSwgcERhdGEuZ2V0KCkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50OjprZXl3b3JkcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgcmV0dXJuIGdldFByb3BlcnR5SW50ZXJuYWwocFJ1bnRpbWUsIHZwLCAiS2V5d29yZHMiLCBzRXJyb3IpOwotfQotCi1ib29sIERvY3VtZW50Ojptb2REYXRlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgcmV0dXJuIGdldFByb3BlcnR5SW50ZXJuYWwocFJ1bnRpbWUsIHZwLCAiTW9kRGF0ZSIsIHNFcnJvcik7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OnByb2R1Y2VyKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gZ2V0UHJvcGVydHlJbnRlcm5hbChwUnVudGltZSwgdnAsICJQcm9kdWNlciIsIHNFcnJvcik7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OnN1YmplY3QoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gZ2V0UHJvcGVydHlJbnRlcm5hbChwUnVudGltZSwgdnAsICJTdWJqZWN0Iiwgc0Vycm9yKTsKLX0KLQotYm9vbCBEb2N1bWVudDo6dGl0bGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmICghbV9wRm9ybUZpbGxFbnYgfHwgIW1fcEZvcm1GaWxsRW52LT5HZXRVbmRlcmx5aW5nRG9jdW1lbnQoKSkgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNCQURPQkpFQ1QpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gZ2V0UHJvcGVydHlJbnRlcm5hbChwUnVudGltZSwgdnAsICJUaXRsZSIsIHNFcnJvcik7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6Om51bVBhZ2VzKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTUkVBRE9OTFkpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIW1fcEZvcm1GaWxsRW52KSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU0JBRE9CSkVDVCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHZwIDw8IG1fcEZvcm1GaWxsRW52LT5HZXRQYWdlQ291bnQoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OmV4dGVybmFsKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICAvLyBJbiBDaHJvbWUgY2FzZSwgc2hvdWxkIGFsd2F5cyByZXR1cm4gdHJ1ZS4KLSAgaWYgKHZwLklzR2V0dGluZygpKSB7Ci0gICAgdnAgPDwgdHJ1ZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6ZmlsZXNpemUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNSRUFET05MWSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHZwIDw8IDA7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50Ojptb3VzZVgoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6Om1vdXNlWShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6VVJMKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNSRUFET05MWSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghbV9wRm9ybUZpbGxFbnYpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTQkFET0JKRUNUKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgdnAgPDwgbV9wRm9ybUZpbGxFbnYtPkpTX2RvY0dldEZpbGVQYXRoKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50OjpiYXNlVVJMKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHZwLklzR2V0dGluZygpKSB7Ci0gICAgdnAgPDwgbV9jd0Jhc2VVUkw7Ci0gIH0gZWxzZSB7Ci0gICAgdnAgPj4gbV9jd0Jhc2VVUkw7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OmNhbGN1bGF0ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAoIW1fcEZvcm1GaWxsRW52KSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU0JBRE9CSkVDVCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gbV9wRm9ybUZpbGxFbnYtPkdldEludGVyRm9ybSgpOwotICBpZiAodnAuSXNHZXR0aW5nKCkpIHsKLSAgICB2cCA8PCAhIXBJbnRlckZvcm0tPklzQ2FsY3VsYXRlRW5hYmxlZCgpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGJvb2wgYkNhbGN1bGF0ZTsKLSAgdnAgPj4gYkNhbGN1bGF0ZTsKLSAgcEludGVyRm9ybS0+RW5hYmxlQ2FsY3VsYXRlKGJDYWxjdWxhdGUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6ZG9jdW1lbnRGaWxlTmFtZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNSRUFET05MWSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghbV9wRm9ybUZpbGxFbnYpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTQkFET0JKRUNUKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWxlUGF0aCA9IG1fcEZvcm1GaWxsRW52LT5KU19kb2NHZXRGaWxlUGF0aCgpOwotICBpbnQzMl90IGkgPSB3c0ZpbGVQYXRoLkdldExlbmd0aCgpIC0gMTsKLSAgZm9yICg7IGkgPj0gMDsgaS0tKSB7Ci0gICAgaWYgKHdzRmlsZVBhdGguR2V0QXQoaSkgPT0gTCdcXCcgfHwgd3NGaWxlUGF0aC5HZXRBdChpKSA9PSBMJy8nKQotICAgICAgYnJlYWs7Ci0gIH0KLSAgaWYgKGkgPj0gMCAmJiBpIDwgd3NGaWxlUGF0aC5HZXRMZW5ndGgoKSAtIDEpIHsKLSAgICB2cCA8PCAod3NGaWxlUGF0aC5HZXRCdWZmZXIod3NGaWxlUGF0aC5HZXRMZW5ndGgoKSkgKyBpICsgMSk7Ci0gIH0gZWxzZSB7Ci0gICAgdnAgPDwgTCIiOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50OjpwYXRoKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHZwLklzU2V0dGluZygpKSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU1JFQURPTkxZKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFtX3BGb3JtRmlsbEVudikgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNCQURPQkpFQ1QpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB2cCA8PCBhcHA6OlN5c1BhdGhUb1BERlBhdGgobV9wRm9ybUZpbGxFbnYtPkpTX2RvY0dldEZpbGVQYXRoKCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6cGFnZVdpbmRvd1JlY3QoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50OjpsYXlvdXQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OmFkZExpbmsoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6Y2xvc2VEb2MoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6Z2V0UGFnZUJveChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50OjpnZXRBbm5vdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghbV9wRm9ybUZpbGxFbnYpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTQkFET0JKRUNUKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaW50IG5QYWdlTm8gPSBwYXJhbXNbMF0uVG9JbnQocFJ1bnRpbWUpOwotICBDRlhfV2lkZVN0cmluZyBzd0Fubm90TmFtZSA9IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcocFJ1bnRpbWUpOwotICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBtX3BGb3JtRmlsbEVudi0+R2V0UGFnZVZpZXcoblBhZ2VObyk7Ci0gIGlmICghcFBhZ2VWaWV3KQotICAgIHJldHVybiBmYWxzZTsKLQotICBDUERGU0RLX0Fubm90SXRlcmF0aW9uIGFubm90SXRlcmF0aW9uKHBQYWdlVmlldywgZmFsc2UpOwotICBDUERGU0RLX0JBQW5ub3QqIHBTREtCQUFubm90ID0gbnVsbHB0cjsKLSAgZm9yIChjb25zdCBhdXRvJiBwU0RLQW5ub3RDdXIgOiBhbm5vdEl0ZXJhdGlvbikgewotICAgIENQREZTREtfQkFBbm5vdCogcEJBQW5ub3QgPQotICAgICAgICBzdGF0aWNfY2FzdDxDUERGU0RLX0JBQW5ub3QqPihwU0RLQW5ub3RDdXIuR2V0KCkpOwotICAgIGlmIChwQkFBbm5vdCAmJiBwQkFBbm5vdC0+R2V0QW5ub3ROYW1lKCkgPT0gc3dBbm5vdE5hbWUpIHsKLSAgICAgIHBTREtCQUFubm90ID0gcEJBQW5ub3Q7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgaWYgKCFwU0RLQkFBbm5vdCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmogPQotICAgICAgcFJ1bnRpbWUtPk5ld0Z4RHluYW1pY09iaihDSlNfQW5ub3Q6Omdfbk9iakRlZm5JRCk7Ci0gIGlmIChwT2JqLklzRW1wdHkoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ0pTX0Fubm90KiBwSlNfQW5ub3QgPQotICAgICAgc3RhdGljX2Nhc3Q8Q0pTX0Fubm90Kj4ocFJ1bnRpbWUtPkdldE9iamVjdFByaXZhdGUocE9iaikpOwotICBBbm5vdCogcEFubm90ID0gc3RhdGljX2Nhc3Q8QW5ub3QqPihwSlNfQW5ub3QtPkdldEVtYmVkT2JqZWN0KCkpOwotICBwQW5ub3QtPlNldFNES0Fubm90KHBTREtCQUFubm90KTsKLSAgdlJldCA9IENKU19WYWx1ZShwUnVudGltZSwgcEpTX0Fubm90KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OmdldEFubm90cyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmICghbV9wRm9ybUZpbGxFbnYpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTQkFET0JKRUNUKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gVE9ETyh0b25pa2l0b28pOiBBZGQgc3VwcG9ydCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBhcyBwZXIKLSAgLy8gdGhlIFBERiBzcGVjLgotCi0gIGludCBuUGFnZU5vID0gbV9wRm9ybUZpbGxFbnYtPkdldFBhZ2VDb3VudCgpOwotICBDSlNfQXJyYXkgYW5ub3RzOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgblBhZ2VObzsgKytpKSB7Ci0gICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gbV9wRm9ybUZpbGxFbnYtPkdldFBhZ2VWaWV3KGkpOwotICAgIGlmICghcFBhZ2VWaWV3KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ1BERlNES19Bbm5vdEl0ZXJhdGlvbiBhbm5vdEl0ZXJhdGlvbihwUGFnZVZpZXcsIGZhbHNlKTsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHBTREtBbm5vdEN1ciA6IGFubm90SXRlcmF0aW9uKSB7Ci0gICAgICBpZiAoIXBTREtBbm5vdEN1cikgewotICAgICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTQkFET0JKRUNUKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmogPQotICAgICAgICAgIHBSdW50aW1lLT5OZXdGeER5bmFtaWNPYmooQ0pTX0Fubm90OjpnX25PYmpEZWZuSUQpOwotICAgICAgaWYgKHBPYmouSXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIENKU19Bbm5vdCogcEpTX0Fubm90ID0KLSAgICAgICAgICBzdGF0aWNfY2FzdDxDSlNfQW5ub3QqPihwUnVudGltZS0+R2V0T2JqZWN0UHJpdmF0ZShwT2JqKSk7Ci0gICAgICBBbm5vdCogcEFubm90ID0gc3RhdGljX2Nhc3Q8QW5ub3QqPihwSlNfQW5ub3QtPkdldEVtYmVkT2JqZWN0KCkpOwotICAgICAgcEFubm90LT5TZXRTREtBbm5vdChzdGF0aWNfY2FzdDxDUERGU0RLX0JBQW5ub3QqPihwU0RLQW5ub3RDdXIuR2V0KCkpKTsKLSAgICAgIGFubm90cy5TZXRFbGVtZW50KHBSdW50aW1lLCBpLCBDSlNfVmFsdWUocFJ1bnRpbWUsIHBKU19Bbm5vdCkpOwotICAgIH0KLSAgfQotICB2UmV0ID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCBhbm5vdHMpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6Z2V0QW5ub3QzRChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHZSZXQuU2V0TnVsbChwUnVudGltZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50OjpnZXRBbm5vdHMzRChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50OjpnZXRPQ0dzKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OmdldExpbmtzKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OklzRW5jbG9zZWRJblJlY3QoQ0ZYX0Zsb2F0UmVjdCByZWN0LCBDRlhfRmxvYXRSZWN0IExpbmtSZWN0KSB7Ci0gIHJldHVybiAocmVjdC5sZWZ0IDw9IExpbmtSZWN0LmxlZnQgJiYgcmVjdC50b3AgPD0gTGlua1JlY3QudG9wICYmCi0gICAgICAgICAgcmVjdC5yaWdodCA+PSBMaW5rUmVjdC5yaWdodCAmJiByZWN0LmJvdHRvbSA+PSBMaW5rUmVjdC5ib3R0b20pOwotfQotCi1ib29sIERvY3VtZW50OjphZGRJY29uKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBDRlhfV2lkZVN0cmluZyBzd0ljb25OYW1lID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSk7Ci0gIGlmIChwYXJhbXNbMV0uR2V0VHlwZSgpICE9IENKU19WYWx1ZTo6VlRfb2JqZWN0KSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU1RZUEVFUlJPUik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBKU0ljb24gPSBwYXJhbXNbMV0uVG9WOE9iamVjdChwUnVudGltZSk7Ci0gIGlmIChwUnVudGltZS0+R2V0T2JqRGVmbklEKHBKU0ljb24pICE9IENKU19JY29uOjpnX25PYmpEZWZuSUQpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTVFlQRUVSUk9SKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIXBhcmFtc1sxXS5Ub0NKU09iamVjdChwUnVudGltZSktPkdldEVtYmVkT2JqZWN0KCkpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTVFlQRUVSUk9SKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBtX0ljb25OYW1lcy5wdXNoX2JhY2soc3dJY29uTmFtZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50OjppY29ucyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHZwLklzU2V0dGluZygpKSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU1JFQURPTkxZKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKG1fSWNvbk5hbWVzLmVtcHR5KCkpIHsKLSAgICB2cC5HZXRKU1ZhbHVlKCktPlNldE51bGwocFJ1bnRpbWUpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgQ0pTX0FycmF5IEljb25zOwotICBpbnQgaSA9IDA7Ci0gIGZvciAoY29uc3QgYXV0byYgbmFtZSA6IG1fSWNvbk5hbWVzKSB7Ci0gICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmogPQotICAgICAgICBwUnVudGltZS0+TmV3RnhEeW5hbWljT2JqKENKU19JY29uOjpnX25PYmpEZWZuSUQpOwotICAgIGlmIChwT2JqLklzRW1wdHkoKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIENKU19JY29uKiBwSlNfSWNvbiA9Ci0gICAgICAgIHN0YXRpY19jYXN0PENKU19JY29uKj4ocFJ1bnRpbWUtPkdldE9iamVjdFByaXZhdGUocE9iaikpOwotICAgIEljb24qIHBJY29uID0gc3RhdGljX2Nhc3Q8SWNvbio+KHBKU19JY29uLT5HZXRFbWJlZE9iamVjdCgpKTsKLSAgICBwSWNvbi0+U2V0SWNvbk5hbWUobmFtZSk7Ci0gICAgSWNvbnMuU2V0RWxlbWVudChwUnVudGltZSwgaSsrLCBDSlNfVmFsdWUocFJ1bnRpbWUsIHBKU19JY29uKSk7Ci0gIH0KLQotICB2cCA8PCBJY29uczsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OmdldEljb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIENGWF9XaWRlU3RyaW5nIHN3SWNvbk5hbWUgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKTsKLSAgYXV0byBpdCA9IHN0ZDo6ZmluZChtX0ljb25OYW1lcy5iZWdpbigpLCBtX0ljb25OYW1lcy5lbmQoKSwgc3dJY29uTmFtZSk7Ci0gIGlmIChpdCA9PSBtX0ljb25OYW1lcy5lbmQoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmogPQotICAgICAgcFJ1bnRpbWUtPk5ld0Z4RHluYW1pY09iaihDSlNfSWNvbjo6Z19uT2JqRGVmbklEKTsKLSAgaWYgKHBPYmouSXNFbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDSlNfSWNvbiogcEpTX0ljb24gPSBzdGF0aWNfY2FzdDxDSlNfSWNvbio+KHBSdW50aW1lLT5HZXRPYmplY3RQcml2YXRlKHBPYmopKTsKLSAgSWNvbiogcEljb24gPSBzdGF0aWNfY2FzdDxJY29uKj4ocEpTX0ljb24tPkdldEVtYmVkT2JqZWN0KCkpOwotICBwSWNvbi0+U2V0SWNvbk5hbWUoKml0KTsKLSAgdlJldCA9IENKU19WYWx1ZShwUnVudGltZSwgcEpTX0ljb24pOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6cmVtb3ZlSWNvbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIC8vIFVuc2FmZSwgbm8gc3VwcG9ydGVkLgotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6Y3JlYXRlRGF0YU9iamVjdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIC8vIFVuc2FmZSwgbm90IGltcGxlbWVudGVkLgotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6bWVkaWEoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50OjpjYWxjdWxhdGVOb3coQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAoIW1fcEZvcm1GaWxsRW52KSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU0JBRE9CSkVDVCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghKG1fcEZvcm1GaWxsRW52LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpIHx8Ci0gICAgICAgIG1fcEZvcm1GaWxsRW52LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9BTk5PVF9GT1JNKSB8fAotICAgICAgICBtX3BGb3JtRmlsbEVudi0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRklMTF9GT1JNKSkpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTTk9QRVJNSVNTSU9OKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgbV9wRm9ybUZpbGxFbnYtPkdldEludGVyRm9ybSgpLT5PbkNhbGN1bGF0ZSgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6Q29sbGFiKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50OjpnZXRQYWdlTnRoV29yZChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmICghbV9wRm9ybUZpbGxFbnYpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTQkFET0JKRUNUKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFtX3BGb3JtRmlsbEVudi0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRVhUUkFDVF9BQ0NFU1MpKSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU05PUEVSTUlTU0lPTik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gVE9ETyh0c2VwZXopOiBjaGVjayBtYXhpbXVtIGFsbG93YWJsZSBwYXJhbXMuCi0KLSAgaW50IG5QYWdlTm8gPSBwYXJhbXMuc2l6ZSgpID4gMCA/IHBhcmFtc1swXS5Ub0ludChwUnVudGltZSkgOiAwOwotICBpbnQgbldvcmRObyA9IHBhcmFtcy5zaXplKCkgPiAxID8gcGFyYW1zWzFdLlRvSW50KHBSdW50aW1lKSA6IDA7Ci0gIGJvb2wgYlN0cmlwID0gcGFyYW1zLnNpemUoKSA+IDIgPyBwYXJhbXNbMl0uVG9Cb29sKHBSdW50aW1lKSA6IHRydWU7Ci0KLSAgQ1BERl9Eb2N1bWVudCogcERvY3VtZW50ID0gbV9wRm9ybUZpbGxFbnYtPkdldFBERkRvY3VtZW50KCk7Ci0gIGlmICghcERvY3VtZW50KQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoblBhZ2VObyA8IDAgfHwgblBhZ2VObyA+PSBwRG9jdW1lbnQtPkdldFBhZ2VDb3VudCgpKSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU1ZBTFVFRVJST1IpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIENQREZfRGljdGlvbmFyeSogcFBhZ2VEaWN0ID0gcERvY3VtZW50LT5HZXRQYWdlKG5QYWdlTm8pOwotICBpZiAoIXBQYWdlRGljdCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1BERl9QYWdlIHBhZ2UocERvY3VtZW50LCBwUGFnZURpY3QsIHRydWUpOwotICBwYWdlLlBhcnNlQ29udGVudCgpOwotCi0gIGludCBuV29yZHMgPSAwOwotICBDRlhfV2lkZVN0cmluZyBzd1JldDsKLSAgZm9yIChhdXRvJiBwUGFnZU9iaiA6ICpwYWdlLkdldFBhZ2VPYmplY3RMaXN0KCkpIHsKLSAgICBpZiAocFBhZ2VPYmotPklzVGV4dCgpKSB7Ci0gICAgICBDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqID0gcFBhZ2VPYmotPkFzVGV4dCgpOwotICAgICAgaW50IG5PYmpXb3JkcyA9IENvdW50V29yZHMocFRleHRPYmopOwotICAgICAgaWYgKG5Xb3JkcyArIG5PYmpXb3JkcyA+PSBuV29yZE5vKSB7Ci0gICAgICAgIHN3UmV0ID0gR2V0T2JqV29yZFN0cihwVGV4dE9iaiwgbldvcmRObyAtIG5Xb3Jkcyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgbldvcmRzICs9IG5PYmpXb3JkczsKLSAgICB9Ci0gIH0KLQotICBpZiAoYlN0cmlwKSB7Ci0gICAgc3dSZXQuVHJpbUxlZnQoKTsKLSAgICBzd1JldC5UcmltUmlnaHQoKTsKLSAgfQotCi0gIHZSZXQgPSBDSlNfVmFsdWUocFJ1bnRpbWUsIHN3UmV0LmNfc3RyKCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6Z2V0UGFnZU50aFdvcmRRdWFkcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmICghbV9wRm9ybUZpbGxFbnYpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTQkFET0JKRUNUKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFtX3BGb3JtRmlsbEVudi0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRVhUUkFDVF9BQ0NFU1MpKSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU0JBRE9CSkVDVCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBEb2N1bWVudDo6Z2V0UGFnZU51bVdvcmRzKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKCFtX3BGb3JtRmlsbEVudikgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNCQURPQkpFQ1QpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIW1fcEZvcm1GaWxsRW52LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9FWFRSQUNUX0FDQ0VTUykpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTTk9QRVJNSVNTSU9OKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaW50IG5QYWdlTm8gPSBwYXJhbXMuc2l6ZSgpID4gMCA/IHBhcmFtc1swXS5Ub0ludChwUnVudGltZSkgOiAwOwotICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBtX3BGb3JtRmlsbEVudi0+R2V0UERGRG9jdW1lbnQoKTsKLSAgaWYgKG5QYWdlTm8gPCAwIHx8IG5QYWdlTm8gPj0gcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKSkgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNWQUxVRUVSUk9SKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBDUERGX0RpY3Rpb25hcnkqIHBQYWdlRGljdCA9IHBEb2N1bWVudC0+R2V0UGFnZShuUGFnZU5vKTsKLSAgaWYgKCFwUGFnZURpY3QpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfUGFnZSBwYWdlKHBEb2N1bWVudCwgcFBhZ2VEaWN0LCB0cnVlKTsKLSAgcGFnZS5QYXJzZUNvbnRlbnQoKTsKLQotICBpbnQgbldvcmRzID0gMDsKLSAgZm9yIChhdXRvJiBwUGFnZU9iaiA6ICpwYWdlLkdldFBhZ2VPYmplY3RMaXN0KCkpIHsKLSAgICBpZiAocFBhZ2VPYmotPklzVGV4dCgpKQotICAgICAgbldvcmRzICs9IENvdW50V29yZHMocFBhZ2VPYmotPkFzVGV4dCgpKTsKLSAgfQotCi0gIHZSZXQgPSBDSlNfVmFsdWUocFJ1bnRpbWUsIG5Xb3Jkcyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50OjpnZXRQcmludFBhcmFtcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwUmV0T2JqID0KLSAgICAgIHBSdW50aW1lLT5OZXdGeER5bmFtaWNPYmooQ0pTX1ByaW50UGFyYW1zT2JqOjpnX25PYmpEZWZuSUQpOwotICBpZiAocFJldE9iai5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXQuCi0KLSAgdlJldCA9IENKU19WYWx1ZShwUnVudGltZSwgcFJldE9iaik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIElTTEFUSU5XT1JEKHUpICh1ICE9IDB4MjAgJiYgdSA8PSAweDI4RkYpCi0KLWludCBEb2N1bWVudDo6Q291bnRXb3JkcyhDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqKSB7Ci0gIGlmICghcFRleHRPYmopCi0gICAgcmV0dXJuIDA7Ci0KLSAgaW50IG5Xb3JkcyA9IDA7Ci0KLSAgQ1BERl9Gb250KiBwRm9udCA9IHBUZXh0T2JqLT5HZXRGb250KCk7Ci0gIGlmICghcEZvbnQpCi0gICAgcmV0dXJuIDA7Ci0KLSAgYm9vbCBiSXNMYXRpbiA9IGZhbHNlOwotCi0gIGZvciAoaW50IGkgPSAwLCBzeiA9IHBUZXh0T2JqLT5Db3VudENoYXJzKCk7IGkgPCBzejsgaSsrKSB7Ci0gICAgdWludDMyX3QgY2hhcmNvZGUgPSBDUERGX0ZvbnQ6OmtJbnZhbGlkQ2hhckNvZGU7Ci0gICAgRlhfRkxPQVQga2VybmluZzsKLQotICAgIHBUZXh0T2JqLT5HZXRDaGFySW5mbyhpLCAmY2hhcmNvZGUsICZrZXJuaW5nKTsKLSAgICBDRlhfV2lkZVN0cmluZyBzd1VuaWNvZGUgPSBwRm9udC0+VW5pY29kZUZyb21DaGFyQ29kZShjaGFyY29kZSk7Ci0KLSAgICB1aW50MTZfdCB1bmljb2RlID0gMDsKLSAgICBpZiAoc3dVbmljb2RlLkdldExlbmd0aCgpID4gMCkKLSAgICAgIHVuaWNvZGUgPSBzd1VuaWNvZGVbMF07Ci0KLSAgICBpZiAoSVNMQVRJTldPUkQodW5pY29kZSkgJiYgYklzTGF0aW4pCi0gICAgICBjb250aW51ZTsKLQotICAgIGJJc0xhdGluID0gSVNMQVRJTldPUkQodW5pY29kZSk7Ci0gICAgaWYgKHVuaWNvZGUgIT0gMHgyMCkKLSAgICAgIG5Xb3JkcysrOwotICB9Ci0KLSAgcmV0dXJuIG5Xb3JkczsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgRG9jdW1lbnQ6OkdldE9ialdvcmRTdHIoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuV29yZEluZGV4KSB7Ci0gIENGWF9XaWRlU3RyaW5nIHN3UmV0OwotCi0gIENQREZfRm9udCogcEZvbnQgPSBwVGV4dE9iai0+R2V0Rm9udCgpOwotICBpZiAoIXBGb250KQotICAgIHJldHVybiBMIiI7Ci0KLSAgaW50IG5Xb3JkcyA9IDA7Ci0gIGJvb2wgYklzTGF0aW4gPSBmYWxzZTsKLQotICBmb3IgKGludCBpID0gMCwgc3ogPSBwVGV4dE9iai0+Q291bnRDaGFycygpOyBpIDwgc3o7IGkrKykgewotICAgIHVpbnQzMl90IGNoYXJjb2RlID0gQ1BERl9Gb250OjprSW52YWxpZENoYXJDb2RlOwotICAgIEZYX0ZMT0FUIGtlcm5pbmc7Ci0KLSAgICBwVGV4dE9iai0+R2V0Q2hhckluZm8oaSwgJmNoYXJjb2RlLCAma2VybmluZyk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3dVbmljb2RlID0gcEZvbnQtPlVuaWNvZGVGcm9tQ2hhckNvZGUoY2hhcmNvZGUpOwotCi0gICAgdWludDE2X3QgdW5pY29kZSA9IDA7Ci0gICAgaWYgKHN3VW5pY29kZS5HZXRMZW5ndGgoKSA+IDApCi0gICAgICB1bmljb2RlID0gc3dVbmljb2RlWzBdOwotCi0gICAgaWYgKElTTEFUSU5XT1JEKHVuaWNvZGUpICYmIGJJc0xhdGluKSB7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJJc0xhdGluID0gSVNMQVRJTldPUkQodW5pY29kZSk7Ci0gICAgICBpZiAodW5pY29kZSAhPSAweDIwKQotICAgICAgICBuV29yZHMrKzsKLSAgICB9Ci0KLSAgICBpZiAobldvcmRzIC0gMSA9PSBuV29yZEluZGV4KQotICAgICAgc3dSZXQgKz0gdW5pY29kZTsKLSAgfQotCi0gIHJldHVybiBzd1JldDsKLX0KLQotYm9vbCBEb2N1bWVudDo6em9vbShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKioKLShub25lLCAgTm9WYXJ5KQotKGZpdFAsICBGaXRQYWdlKQotKGZpdFcsICBGaXRXaWR0aCkKLShmaXRILCAgRml0SGVpZ2h0KQotKGZpdFYsICBGaXRWaXNpYmxlV2lkdGgpCi0ocHJlZiwgIFByZWZlcnJlZCkKLShyZWZXLCAgUmVmbG93V2lkdGgpCi0qLwotCi1ib29sIERvY3VtZW50Ojp6b29tVHlwZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OmRlbGV0ZVBhZ2VzKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgLy8gVW5zYWZlLCBubyBzdXBwb3J0ZWQuCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50OjpleHRyYWN0UGFnZXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIERvY3VtZW50OjppbnNlcnRQYWdlcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OnJlcGxhY2VQYWdlcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OmdldFVSTChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRG9jdW1lbnQ6OmdvdG9OYW1lZERlc3QoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIW1fcEZvcm1GaWxsRW52KSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU0JBRE9CSkVDVCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIENGWF9XaWRlU3RyaW5nIHdpZGVOYW1lID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSk7Ci0gIENGWF9CeXRlU3RyaW5nIHV0ZjhOYW1lID0gd2lkZU5hbWUuVVRGOEVuY29kZSgpOwotICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBtX3BGb3JtRmlsbEVudi0+R2V0UERGRG9jdW1lbnQoKTsKLSAgaWYgKCFwRG9jdW1lbnQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfTmFtZVRyZWUgbmFtZVRyZWUocERvY3VtZW50LCAiRGVzdHMiKTsKLSAgQ1BERl9BcnJheSogZGVzdEFycmF5ID0gbmFtZVRyZWUuTG9va3VwTmFtZWREZXN0KHBEb2N1bWVudCwgdXRmOE5hbWUpOwotICBpZiAoIWRlc3RBcnJheSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1BERl9EZXN0IGRlc3QoZGVzdEFycmF5KTsKLSAgY29uc3QgQ1BERl9BcnJheSogYXJyYXlPYmplY3QgPSBUb0FycmF5KGRlc3QuR2V0T2JqZWN0KCkpOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxmbG9hdFtdPiBzY3JvbGxQb3NpdGlvbkFycmF5OwotICBpbnQgc2Nyb2xsUG9zaXRpb25BcnJheVNpemUgPSAwOwotCi0gIGlmIChhcnJheU9iamVjdCkgewotICAgIHNjcm9sbFBvc2l0aW9uQXJyYXkucmVzZXQobmV3IGZsb2F0W2FycmF5T2JqZWN0LT5HZXRDb3VudCgpXSk7Ci0gICAgaW50IGogPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAyOyBpIDwgYXJyYXlPYmplY3QtPkdldENvdW50KCk7IGkrKykKLSAgICAgIHNjcm9sbFBvc2l0aW9uQXJyYXlbaisrXSA9IGFycmF5T2JqZWN0LT5HZXRGbG9hdEF0KGkpOwotICAgIHNjcm9sbFBvc2l0aW9uQXJyYXlTaXplID0gajsKLSAgfQotCi0gIHBSdW50aW1lLT5CZWdpbkJsb2NrKCk7Ci0gIG1fcEZvcm1GaWxsRW52LT5Eb0dvVG9BY3Rpb24oZGVzdC5HZXRQYWdlSW5kZXgocERvY3VtZW50KSwgZGVzdC5HZXRab29tTW9kZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFBvc2l0aW9uQXJyYXkuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb25BcnJheVNpemUpOwotICBwUnVudGltZS0+RW5kQmxvY2soKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBEb2N1bWVudDo6QWRkRGVsYXlEYXRhKENKU19EZWxheURhdGEqIHBEYXRhKSB7Ci0gIG1fRGVsYXlEYXRhLnB1c2hfYmFjayhzdGQ6OnVuaXF1ZV9wdHI8Q0pTX0RlbGF5RGF0YT4ocERhdGEpKTsKLX0KLQotdm9pZCBEb2N1bWVudDo6RG9GaWVsZERlbGF5KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzRmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4KSB7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDSlNfRGVsYXlEYXRhPj4gRGVsYXlEYXRhRm9yRmllbGRBbmRDb250cm9sSW5kZXg7Ci0gIGF1dG8gaXRlciA9IG1fRGVsYXlEYXRhLmJlZ2luKCk7Ci0gIHdoaWxlIChpdGVyICE9IG1fRGVsYXlEYXRhLmVuZCgpKSB7Ci0gICAgYXV0byBvbGQgPSBpdGVyKys7Ci0gICAgaWYgKCgqb2xkKS0+c0ZpZWxkTmFtZSA9PSBzRmllbGROYW1lICYmCi0gICAgICAgICgqb2xkKS0+bkNvbnRyb2xJbmRleCA9PSBuQ29udHJvbEluZGV4KSB7Ci0gICAgICBEZWxheURhdGFGb3JGaWVsZEFuZENvbnRyb2xJbmRleC5wdXNoX2JhY2soc3RkOjptb3ZlKCpvbGQpKTsKLSAgICAgIG1fRGVsYXlEYXRhLmVyYXNlKG9sZCk7Ci0gICAgfQotICB9Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBwRGF0YSA6IERlbGF5RGF0YUZvckZpZWxkQW5kQ29udHJvbEluZGV4KQotICAgIEZpZWxkOjpEb0RlbGF5KG1fcEZvcm1GaWxsRW52LkdldCgpLCBwRGF0YS5nZXQoKSk7Ci19Ci0KLUNKU19Eb2N1bWVudCogRG9jdW1lbnQ6OkdldENKU0RvYygpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PENKU19Eb2N1bWVudCo+KG1fcEpTT2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvamF2YXNjcmlwdC9Eb2N1bWVudC5oIGIvZnBkZnNkay9qYXZhc2NyaXB0L0RvY3VtZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxY2E3NzguLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9qYXZhc2NyaXB0L0RvY3VtZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MDIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZQREZTREtfSkFWQVNDUklQVF9ET0NVTUVOVF9IXwotI2RlZmluZSBGUERGU0RLX0pBVkFTQ1JJUFRfRE9DVU1FTlRfSF8KLQotI2luY2x1ZGUgPGxpc3Q+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW9iamVjdC5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfdGV4dG9iamVjdC5oIgotI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19mb3JtZmlsbGVudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIgotCi1jbGFzcyBQcmludFBhcmFtc09iaiA6IHB1YmxpYyBDSlNfRW1iZWRPYmogewotIHB1YmxpYzoKLSAgZXhwbGljaXQgUHJpbnRQYXJhbXNPYmooQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKLSAgflByaW50UGFyYW1zT2JqKCkgb3ZlcnJpZGUge30KLQotIHB1YmxpYzoKLSAgYm9vbCBiVUk7Ci0gIGludCBuU3RhcnQ7Ci0gIGludCBuRW5kOwotICBib29sIGJTaWxlbnQ7Ci0gIGJvb2wgYlNocmlua1RvRml0OwotICBib29sIGJQcmludEFzSW1hZ2U7Ci0gIGJvb2wgYlJldmVyc2U7Ci0gIGJvb2wgYkFubm90YXRpb25zOwotfTsKLQotY2xhc3MgQ0pTX1ByaW50UGFyYW1zT2JqIDogcHVibGljIENKU19PYmplY3QgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0pTX1ByaW50UGFyYW1zT2JqKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqZWN0KQotICAgICAgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9Ci0gIH5DSlNfUHJpbnRQYXJhbXNPYmooKSBvdmVycmlkZSB7fQotCi0gIERFQ0xBUkVfSlNfQ0xBU1MoKTsKLX07Ci0KLXN0cnVjdCBDSlNfQW5ub3RPYmo7Ci1zdHJ1Y3QgQ0pTX0RlbGF5QW5ub3Q7Ci1zdHJ1Y3QgQ0pTX0RlbGF5RGF0YTsKLQotY2xhc3MgRG9jdW1lbnQgOiBwdWJsaWMgQ0pTX0VtYmVkT2JqIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IERvY3VtZW50KENKU19PYmplY3QqIHBKU09iamVjdCk7Ci0gIH5Eb2N1bWVudCgpIG92ZXJyaWRlOwotCi0gIGJvb2wgQURCRShDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBhdXRob3IoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgYmFzZVVSTChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGJvb2ttYXJrUm9vdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBjYWxjdWxhdGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgQ29sbGFiKENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGNyZWF0aW9uRGF0ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBjcmVhdG9yKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgZGVsYXkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgZGlydHkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgZG9jdW1lbnRGaWxlTmFtZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGV4dGVybmFsKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBmaWxlc2l6ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgaWNvbnMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgaW5mbyhDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBrZXl3b3JkcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgbGF5b3V0KENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIG1lZGlhKENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIG1vZERhdGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBtb3VzZVgoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgbW91c2VZKENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIG51bUZpZWxkcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBudW1QYWdlcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgcGFnZU51bShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHBhZ2VXaW5kb3dSZWN0KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBwYXRoKENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHByb2R1Y2VyKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBzdWJqZWN0KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgdGl0bGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgem9vbShDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCB6b29tVHlwZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0KLSAgYm9vbCBhZGRBbm5vdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBhZGRGaWVsZChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBhZGRMaW5rKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGFkZEljb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgY2FsY3VsYXRlTm93KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGNsb3NlRG9jKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGNyZWF0ZURhdGFPYmplY3QoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgZGVsZXRlUGFnZXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgZXhwb3J0QXNUZXh0KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGV4cG9ydEFzRkRGKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGV4cG9ydEFzWEZERihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBleHRyYWN0UGFnZXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgZ2V0QW5ub3QoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgZ2V0QW5ub3RzKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGdldEFubm90M0QoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgZ2V0QW5ub3RzM0QoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgZ2V0RmllbGQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgZ2V0SWNvbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBnZXRMaW5rcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBnZXROdGhGaWVsZE5hbWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgZ2V0T0NHcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBnZXRQYWdlQm94KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGdldFBhZ2VOdGhXb3JkKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGdldFBhZ2VOdGhXb3JkUXVhZHMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgZ2V0UGFnZU51bVdvcmRzKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGdldFByaW50UGFyYW1zKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGdldFVSTChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBnb3RvTmFtZWREZXN0KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGltcG9ydEFuRkRGKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGltcG9ydEFuWEZERihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBpbXBvcnRUZXh0RGF0YShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBpbnNlcnRQYWdlcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBtYWlsRm9ybShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBwcmludChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCByZW1vdmVGaWVsZChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCByZXBsYWNlUGFnZXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgcmVzZXRGb3JtKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHNhdmVBcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBzdWJtaXRGb3JtKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHN5bmNBbm5vdFNjYW4oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgbWFpbERvYyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCByZW1vdmVJY29uKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIFVSTChDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQotICB2b2lkIFNldEZvcm1GaWxsRW52KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KTsKLSAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBHZXRGb3JtRmlsbEVudigpIGNvbnN0IHsKLSAgICByZXR1cm4gbV9wRm9ybUZpbGxFbnYuR2V0KCk7Ci0gIH0KLSAgdm9pZCBBZGREZWxheURhdGEoQ0pTX0RlbGF5RGF0YSogcERhdGEpOwotICB2b2lkIERvRmllbGREZWxheShjb25zdCBDRlhfV2lkZVN0cmluZyYgc0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgpOwotICBDSlNfRG9jdW1lbnQqIEdldENKU0RvYygpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgYm9vbCBJc0VuY2xvc2VkSW5SZWN0KENGWF9GbG9hdFJlY3QgcmVjdCwgQ0ZYX0Zsb2F0UmVjdCBMaW5rUmVjdCk7Ci0gIGludCBDb3VudFdvcmRzKENQREZfVGV4dE9iamVjdCogcFRleHRPYmopOwotICBDRlhfV2lkZVN0cmluZyBHZXRPYmpXb3JkU3RyKENQREZfVGV4dE9iamVjdCogcFRleHRPYmosIGludCBuV29yZEluZGV4KTsKLQotICBib29sIGdldFByb3BlcnR5SW50ZXJuYWwoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgcHJvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQotICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6Ok9ic2VydmVkUHRyIG1fcEZvcm1GaWxsRW52OwotICBDRlhfV2lkZVN0cmluZyBtX2N3QmFzZVVSTDsKLSAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDSlNfRGVsYXlEYXRhPj4gbV9EZWxheURhdGE7Ci0gIC8vIE5lZWRzIHRvIGJlIGEgc3RkOjpsaXN0IGZvciBpdGVyYXRvciBzdGFiaWxpdHkuCi0gIHN0ZDo6bGlzdDxDRlhfV2lkZVN0cmluZz4gbV9JY29uTmFtZXM7Ci0gIGJvb2wgbV9iRGVsYXk7Ci19OwotCi1jbGFzcyBDSlNfRG9jdW1lbnQgOiBwdWJsaWMgQ0pTX09iamVjdCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDSlNfRG9jdW1lbnQodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQotICB+Q0pTX0RvY3VtZW50KCkgb3ZlcnJpZGUge30KLQotICAvLyBDSlNfT2JqZWN0Ci0gIHZvaWQgSW5pdEluc3RhbmNlKElKU19SdW50aW1lKiBwSVJ1bnRpbWUpIG92ZXJyaWRlOwotCi0gIERFQ0xBUkVfSlNfQ0xBU1MoKTsKLQotICBKU19TVEFUSUNfUFJPUChBREJFLCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19QUk9QKGF1dGhvciwgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfUFJPUChiYXNlVVJMLCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19QUk9QKGJvb2ttYXJrUm9vdCwgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfUFJPUChjYWxjdWxhdGUsIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX1BST1AoQ29sbGFiLCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19QUk9QKGNyZWF0aW9uRGF0ZSwgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfUFJPUChjcmVhdG9yLCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19QUk9QKGRlbGF5LCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19QUk9QKGRpcnR5LCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19QUk9QKGRvY3VtZW50RmlsZU5hbWUsIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX1BST1AoZXh0ZXJuYWwsIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX1BST1AoZmlsZXNpemUsIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX1BST1AoaWNvbnMsIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX1BST1AoaW5mbywgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfUFJPUChrZXl3b3JkcywgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfUFJPUChsYXlvdXQsIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX1BST1AobWVkaWEsIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX1BST1AobW9kRGF0ZSwgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfUFJPUChtb3VzZVgsIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX1BST1AobW91c2VZLCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19QUk9QKG51bUZpZWxkcywgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfUFJPUChudW1QYWdlcywgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfUFJPUChwYWdlTnVtLCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19QUk9QKHBhZ2VXaW5kb3dSZWN0LCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19QUk9QKHBhdGgsIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX1BST1AocHJvZHVjZXIsIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX1BST1Aoc3ViamVjdCwgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfUFJPUCh0aXRsZSwgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfUFJPUChVUkwsIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX1BST1Aoem9vbSwgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfUFJPUCh6b29tVHlwZSwgRG9jdW1lbnQpOwotCi0gIEpTX1NUQVRJQ19NRVRIT0QoYWRkQW5ub3QsIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX01FVEhPRChhZGRGaWVsZCwgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfTUVUSE9EKGFkZExpbmssIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX01FVEhPRChhZGRJY29uLCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QoY2FsY3VsYXRlTm93LCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QoY2xvc2VEb2MsIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX01FVEhPRChjcmVhdGVEYXRhT2JqZWN0LCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QoZGVsZXRlUGFnZXMsIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX01FVEhPRChleHBvcnRBc1RleHQsIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX01FVEhPRChleHBvcnRBc0ZERiwgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfTUVUSE9EKGV4cG9ydEFzWEZERiwgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfTUVUSE9EKGV4dHJhY3RQYWdlcywgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfTUVUSE9EKGdldEFubm90LCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QoZ2V0QW5ub3RzLCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QoZ2V0QW5ub3QzRCwgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfTUVUSE9EKGdldEFubm90czNELCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QoZ2V0RmllbGQsIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX01FVEhPRChnZXRJY29uLCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QoZ2V0TGlua3MsIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX01FVEhPRChnZXROdGhGaWVsZE5hbWUsIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX01FVEhPRChnZXRPQ0dzLCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QoZ2V0UGFnZUJveCwgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfTUVUSE9EKGdldFBhZ2VOdGhXb3JkLCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QoZ2V0UGFnZU50aFdvcmRRdWFkcywgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfTUVUSE9EKGdldFBhZ2VOdW1Xb3JkcywgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfTUVUSE9EKGdldFByaW50UGFyYW1zLCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QoZ2V0VVJMLCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QoZ290b05hbWVkRGVzdCwgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfTUVUSE9EKGltcG9ydEFuRkRGLCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QoaW1wb3J0QW5YRkRGLCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QoaW1wb3J0VGV4dERhdGEsIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX01FVEhPRChpbnNlcnRQYWdlcywgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfTUVUSE9EKG1haWxGb3JtLCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QocHJpbnQsIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX01FVEhPRChyZW1vdmVGaWVsZCwgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfTUVUSE9EKHJlcGxhY2VQYWdlcywgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfTUVUSE9EKHJlbW92ZUljb24sIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX01FVEhPRChyZXNldEZvcm0sIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX01FVEhPRChzYXZlQXMsIERvY3VtZW50KTsKLSAgSlNfU1RBVElDX01FVEhPRChzdWJtaXRGb3JtLCBEb2N1bWVudCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0Qoc3luY0Fubm90U2NhbiwgRG9jdW1lbnQpOwotICBKU19TVEFUSUNfTUVUSE9EKG1haWxEb2MsIERvY3VtZW50KTsKLX07Ci0KLSNlbmRpZiAgLy8gRlBERlNES19KQVZBU0NSSVBUX0RPQ1VNRU5UX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2phdmFzY3JpcHQvRmllbGQuY3BwIGIvZnBkZnNkay9qYXZhc2NyaXB0L0ZpZWxkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM3YjNkNC4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2phdmFzY3JpcHQvRmllbGQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzQwNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvRmllbGQuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udC5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudC5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2ludGVyZm9ybS5oIgotI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19mb3JtZmlsbGVudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX2ludGVyZm9ybS5oIgotI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19wYWdldmlldy5oIgotI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka193aWRnZXQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSWNvbi5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19EZWZpbmUuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX09iamVjdC5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19WYWx1ZS5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L2Nqc19ldmVudF9jb250ZXh0LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L2Nqc19ydW50aW1lLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L2NvbG9yLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLWJvb2wgU2V0V2lkZ2V0RGlzcGxheVN0YXR1cyhDUERGU0RLX1dpZGdldCogcFdpZGdldCwgaW50IHZhbHVlKSB7Ci0gIGlmICghcFdpZGdldCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdWludDMyX3QgZHdGbGFnID0gcFdpZGdldC0+R2V0RmxhZ3MoKTsKLSAgc3dpdGNoICh2YWx1ZSkgewotICAgIGNhc2UgMDoKLSAgICAgIGR3RmxhZyAmPSB+QU5OT1RGTEFHX0lOVklTSUJMRTsKLSAgICAgIGR3RmxhZyAmPSB+QU5OT1RGTEFHX0hJRERFTjsKLSAgICAgIGR3RmxhZyAmPSB+QU5OT1RGTEFHX05PVklFVzsKLSAgICAgIGR3RmxhZyB8PSBBTk5PVEZMQUdfUFJJTlQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICBkd0ZsYWcgJj0gfkFOTk9URkxBR19JTlZJU0lCTEU7Ci0gICAgICBkd0ZsYWcgJj0gfkFOTk9URkxBR19OT1ZJRVc7Ci0gICAgICBkd0ZsYWcgfD0gKEFOTk9URkxBR19ISURERU4gfCBBTk5PVEZMQUdfUFJJTlQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgZHdGbGFnICY9IH5BTk5PVEZMQUdfSU5WSVNJQkxFOwotICAgICAgZHdGbGFnICY9IH5BTk5PVEZMQUdfUFJJTlQ7Ci0gICAgICBkd0ZsYWcgJj0gfkFOTk9URkxBR19ISURERU47Ci0gICAgICBkd0ZsYWcgJj0gfkFOTk9URkxBR19OT1ZJRVc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBkd0ZsYWcgfD0gQU5OT1RGTEFHX05PVklFVzsKLSAgICAgIGR3RmxhZyB8PSBBTk5PVEZMQUdfUFJJTlQ7Ci0gICAgICBkd0ZsYWcgJj0gfkFOTk9URkxBR19ISURERU47Ci0gICAgICBicmVhazsKLSAgfQotCi0gIGlmIChkd0ZsYWcgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkgewotICAgIHBXaWRnZXQtPlNldEZsYWdzKGR3RmxhZyk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1KU0NvbnN0U3BlYyBDSlNfRmllbGQ6OkNvbnN0U3BlY3NbXSA9IHt7MCwgSlNDb25zdFNwZWM6Ok51bWJlciwgMCwgMH19OwotCi1KU1Byb3BlcnR5U3BlYyBDSlNfRmllbGQ6OlByb3BlcnR5U3BlY3NbXSA9IHsKLSAgICB7ImFsaWdubWVudCIsIGdldF9hbGlnbm1lbnRfc3RhdGljLCBzZXRfYWxpZ25tZW50X3N0YXRpY30sCi0gICAgeyJib3JkZXJTdHlsZSIsIGdldF9ib3JkZXJTdHlsZV9zdGF0aWMsIHNldF9ib3JkZXJTdHlsZV9zdGF0aWN9LAotICAgIHsiYnV0dG9uQWxpZ25YIiwgZ2V0X2J1dHRvbkFsaWduWF9zdGF0aWMsIHNldF9idXR0b25BbGlnblhfc3RhdGljfSwKLSAgICB7ImJ1dHRvbkFsaWduWSIsIGdldF9idXR0b25BbGlnbllfc3RhdGljLCBzZXRfYnV0dG9uQWxpZ25ZX3N0YXRpY30sCi0gICAgeyJidXR0b25GaXRCb3VuZHMiLCBnZXRfYnV0dG9uRml0Qm91bmRzX3N0YXRpYywgc2V0X2J1dHRvbkZpdEJvdW5kc19zdGF0aWN9LAotICAgIHsiYnV0dG9uUG9zaXRpb24iLCBnZXRfYnV0dG9uUG9zaXRpb25fc3RhdGljLCBzZXRfYnV0dG9uUG9zaXRpb25fc3RhdGljfSwKLSAgICB7ImJ1dHRvblNjYWxlSG93IiwgZ2V0X2J1dHRvblNjYWxlSG93X3N0YXRpYywgc2V0X2J1dHRvblNjYWxlSG93X3N0YXRpY30sCi0gICAgeyJidXR0b25TY2FsZVdoZW4iLCBnZXRfYnV0dG9uU2NhbGVXaGVuX3N0YXRpYywgc2V0X2J1dHRvblNjYWxlV2hlbl9zdGF0aWN9LAotICAgIHsiY2FsY09yZGVySW5kZXgiLCBnZXRfY2FsY09yZGVySW5kZXhfc3RhdGljLCBzZXRfY2FsY09yZGVySW5kZXhfc3RhdGljfSwKLSAgICB7ImNoYXJMaW1pdCIsIGdldF9jaGFyTGltaXRfc3RhdGljLCBzZXRfY2hhckxpbWl0X3N0YXRpY30sCi0gICAgeyJjb21iIiwgZ2V0X2NvbWJfc3RhdGljLCBzZXRfY29tYl9zdGF0aWN9LAotICAgIHsiY29tbWl0T25TZWxDaGFuZ2UiLCBnZXRfY29tbWl0T25TZWxDaGFuZ2Vfc3RhdGljLAotICAgICBzZXRfY29tbWl0T25TZWxDaGFuZ2Vfc3RhdGljfSwKLSAgICB7ImN1cnJlbnRWYWx1ZUluZGljZXMiLCBnZXRfY3VycmVudFZhbHVlSW5kaWNlc19zdGF0aWMsCi0gICAgIHNldF9jdXJyZW50VmFsdWVJbmRpY2VzX3N0YXRpY30sCi0gICAgeyJkZWZhdWx0U3R5bGUiLCBnZXRfZGVmYXVsdFN0eWxlX3N0YXRpYywgc2V0X2RlZmF1bHRTdHlsZV9zdGF0aWN9LAotICAgIHsiZGVmYXVsdFZhbHVlIiwgZ2V0X2RlZmF1bHRWYWx1ZV9zdGF0aWMsIHNldF9kZWZhdWx0VmFsdWVfc3RhdGljfSwKLSAgICB7ImRvTm90U2Nyb2xsIiwgZ2V0X2RvTm90U2Nyb2xsX3N0YXRpYywgc2V0X2RvTm90U2Nyb2xsX3N0YXRpY30sCi0gICAgeyJkb05vdFNwZWxsQ2hlY2siLCBnZXRfZG9Ob3RTcGVsbENoZWNrX3N0YXRpYywgc2V0X2RvTm90U3BlbGxDaGVja19zdGF0aWN9LAotICAgIHsiZGVsYXkiLCBnZXRfZGVsYXlfc3RhdGljLCBzZXRfZGVsYXlfc3RhdGljfSwKLSAgICB7ImRpc3BsYXkiLCBnZXRfZGlzcGxheV9zdGF0aWMsIHNldF9kaXNwbGF5X3N0YXRpY30sCi0gICAgeyJkb2MiLCBnZXRfZG9jX3N0YXRpYywgc2V0X2RvY19zdGF0aWN9LAotICAgIHsiZWRpdGFibGUiLCBnZXRfZWRpdGFibGVfc3RhdGljLCBzZXRfZWRpdGFibGVfc3RhdGljfSwKLSAgICB7ImV4cG9ydFZhbHVlcyIsIGdldF9leHBvcnRWYWx1ZXNfc3RhdGljLCBzZXRfZXhwb3J0VmFsdWVzX3N0YXRpY30sCi0gICAgeyJoaWRkZW4iLCBnZXRfaGlkZGVuX3N0YXRpYywgc2V0X2hpZGRlbl9zdGF0aWN9LAotICAgIHsiZmlsZVNlbGVjdCIsIGdldF9maWxlU2VsZWN0X3N0YXRpYywgc2V0X2ZpbGVTZWxlY3Rfc3RhdGljfSwKLSAgICB7ImZpbGxDb2xvciIsIGdldF9maWxsQ29sb3Jfc3RhdGljLCBzZXRfZmlsbENvbG9yX3N0YXRpY30sCi0gICAgeyJsaW5lV2lkdGgiLCBnZXRfbGluZVdpZHRoX3N0YXRpYywgc2V0X2xpbmVXaWR0aF9zdGF0aWN9LAotICAgIHsiaGlnaGxpZ2h0IiwgZ2V0X2hpZ2hsaWdodF9zdGF0aWMsIHNldF9oaWdobGlnaHRfc3RhdGljfSwKLSAgICB7Im11bHRpbGluZSIsIGdldF9tdWx0aWxpbmVfc3RhdGljLCBzZXRfbXVsdGlsaW5lX3N0YXRpY30sCi0gICAgeyJtdWx0aXBsZVNlbGVjdGlvbiIsIGdldF9tdWx0aXBsZVNlbGVjdGlvbl9zdGF0aWMsCi0gICAgIHNldF9tdWx0aXBsZVNlbGVjdGlvbl9zdGF0aWN9LAotICAgIHsibmFtZSIsIGdldF9uYW1lX3N0YXRpYywgc2V0X25hbWVfc3RhdGljfSwKLSAgICB7Im51bUl0ZW1zIiwgZ2V0X251bUl0ZW1zX3N0YXRpYywgc2V0X251bUl0ZW1zX3N0YXRpY30sCi0gICAgeyJwYWdlIiwgZ2V0X3BhZ2Vfc3RhdGljLCBzZXRfcGFnZV9zdGF0aWN9LAotICAgIHsicGFzc3dvcmQiLCBnZXRfcGFzc3dvcmRfc3RhdGljLCBzZXRfcGFzc3dvcmRfc3RhdGljfSwKLSAgICB7InByaW50IiwgZ2V0X3ByaW50X3N0YXRpYywgc2V0X3ByaW50X3N0YXRpY30sCi0gICAgeyJyYWRpb3NJblVuaXNvbiIsIGdldF9yYWRpb3NJblVuaXNvbl9zdGF0aWMsIHNldF9yYWRpb3NJblVuaXNvbl9zdGF0aWN9LAotICAgIHsicmVhZG9ubHkiLCBnZXRfcmVhZG9ubHlfc3RhdGljLCBzZXRfcmVhZG9ubHlfc3RhdGljfSwKLSAgICB7InJlY3QiLCBnZXRfcmVjdF9zdGF0aWMsIHNldF9yZWN0X3N0YXRpY30sCi0gICAgeyJyZXF1aXJlZCIsIGdldF9yZXF1aXJlZF9zdGF0aWMsIHNldF9yZXF1aXJlZF9zdGF0aWN9LAotICAgIHsicmljaFRleHQiLCBnZXRfcmljaFRleHRfc3RhdGljLCBzZXRfcmljaFRleHRfc3RhdGljfSwKLSAgICB7InJpY2hWYWx1ZSIsIGdldF9yaWNoVmFsdWVfc3RhdGljLCBzZXRfcmljaFZhbHVlX3N0YXRpY30sCi0gICAgeyJyb3RhdGlvbiIsIGdldF9yb3RhdGlvbl9zdGF0aWMsIHNldF9yb3RhdGlvbl9zdGF0aWN9LAotICAgIHsic3Ryb2tlQ29sb3IiLCBnZXRfc3Ryb2tlQ29sb3Jfc3RhdGljLCBzZXRfc3Ryb2tlQ29sb3Jfc3RhdGljfSwKLSAgICB7InN0eWxlIiwgZ2V0X3N0eWxlX3N0YXRpYywgc2V0X3N0eWxlX3N0YXRpY30sCi0gICAgeyJzdWJtaXROYW1lIiwgZ2V0X3N1Ym1pdE5hbWVfc3RhdGljLCBzZXRfc3VibWl0TmFtZV9zdGF0aWN9LAotICAgIHsidGV4dENvbG9yIiwgZ2V0X3RleHRDb2xvcl9zdGF0aWMsIHNldF90ZXh0Q29sb3Jfc3RhdGljfSwKLSAgICB7InRleHRGb250IiwgZ2V0X3RleHRGb250X3N0YXRpYywgc2V0X3RleHRGb250X3N0YXRpY30sCi0gICAgeyJ0ZXh0U2l6ZSIsIGdldF90ZXh0U2l6ZV9zdGF0aWMsIHNldF90ZXh0U2l6ZV9zdGF0aWN9LAotICAgIHsidHlwZSIsIGdldF90eXBlX3N0YXRpYywgc2V0X3R5cGVfc3RhdGljfSwKLSAgICB7InVzZXJOYW1lIiwgZ2V0X3VzZXJOYW1lX3N0YXRpYywgc2V0X3VzZXJOYW1lX3N0YXRpY30sCi0gICAgeyJ2YWx1ZSIsIGdldF92YWx1ZV9zdGF0aWMsIHNldF92YWx1ZV9zdGF0aWN9LAotICAgIHsidmFsdWVBc1N0cmluZyIsIGdldF92YWx1ZUFzU3RyaW5nX3N0YXRpYywgc2V0X3ZhbHVlQXNTdHJpbmdfc3RhdGljfSwKLSAgICB7InNvdXJjZSIsIGdldF9zb3VyY2Vfc3RhdGljLCBzZXRfc291cmNlX3N0YXRpY30sCi0gICAgezAsIDAsIDB9fTsKLQotSlNNZXRob2RTcGVjIENKU19GaWVsZDo6TWV0aG9kU3BlY3NbXSA9IHsKLSAgICB7ImJyb3dzZUZvckZpbGVUb1N1Ym1pdCIsIGJyb3dzZUZvckZpbGVUb1N1Ym1pdF9zdGF0aWN9LAotICAgIHsiYnV0dG9uR2V0Q2FwdGlvbiIsIGJ1dHRvbkdldENhcHRpb25fc3RhdGljfSwKLSAgICB7ImJ1dHRvbkdldEljb24iLCBidXR0b25HZXRJY29uX3N0YXRpY30sCi0gICAgeyJidXR0b25JbXBvcnRJY29uIiwgYnV0dG9uSW1wb3J0SWNvbl9zdGF0aWN9LAotICAgIHsiYnV0dG9uU2V0Q2FwdGlvbiIsIGJ1dHRvblNldENhcHRpb25fc3RhdGljfSwKLSAgICB7ImJ1dHRvblNldEljb24iLCBidXR0b25TZXRJY29uX3N0YXRpY30sCi0gICAgeyJjaGVja1RoaXNCb3giLCBjaGVja1RoaXNCb3hfc3RhdGljfSwKLSAgICB7ImNsZWFySXRlbXMiLCBjbGVhckl0ZW1zX3N0YXRpY30sCi0gICAgeyJkZWZhdWx0SXNDaGVja2VkIiwgZGVmYXVsdElzQ2hlY2tlZF9zdGF0aWN9LAotICAgIHsiZGVsZXRlSXRlbUF0IiwgZGVsZXRlSXRlbUF0X3N0YXRpY30sCi0gICAgeyJnZXRBcnJheSIsIGdldEFycmF5X3N0YXRpY30sCi0gICAgeyJnZXRJdGVtQXQiLCBnZXRJdGVtQXRfc3RhdGljfSwKLSAgICB7ImdldExvY2siLCBnZXRMb2NrX3N0YXRpY30sCi0gICAgeyJpbnNlcnRJdGVtQXQiLCBpbnNlcnRJdGVtQXRfc3RhdGljfSwKLSAgICB7ImlzQm94Q2hlY2tlZCIsIGlzQm94Q2hlY2tlZF9zdGF0aWN9LAotICAgIHsiaXNEZWZhdWx0Q2hlY2tlZCIsIGlzRGVmYXVsdENoZWNrZWRfc3RhdGljfSwKLSAgICB7InNldEFjdGlvbiIsIHNldEFjdGlvbl9zdGF0aWN9LAotICAgIHsic2V0Rm9jdXMiLCBzZXRGb2N1c19zdGF0aWN9LAotICAgIHsic2V0SXRlbXMiLCBzZXRJdGVtc19zdGF0aWN9LAotICAgIHsic2V0TG9jayIsIHNldExvY2tfc3RhdGljfSwKLSAgICB7InNpZ25hdHVyZUdldE1vZGlmaWNhdGlvbnMiLCBzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zX3N0YXRpY30sCi0gICAgeyJzaWduYXR1cmVHZXRTZWVkVmFsdWUiLCBzaWduYXR1cmVHZXRTZWVkVmFsdWVfc3RhdGljfSwKLSAgICB7InNpZ25hdHVyZUluZm8iLCBzaWduYXR1cmVJbmZvX3N0YXRpY30sCi0gICAgeyJzaWduYXR1cmVTZXRTZWVkVmFsdWUiLCBzaWduYXR1cmVTZXRTZWVkVmFsdWVfc3RhdGljfSwKLSAgICB7InNpZ25hdHVyZVNpZ24iLCBzaWduYXR1cmVTaWduX3N0YXRpY30sCi0gICAgeyJzaWduYXR1cmVWYWxpZGF0ZSIsIHNpZ25hdHVyZVZhbGlkYXRlX3N0YXRpY30sCi0gICAgezAsIDB9fTsKLQotSU1QTEVNRU5UX0pTX0NMQVNTKENKU19GaWVsZCwgRmllbGQpCi0KLUNKU19EZWxheURhdGE6OkNKU19EZWxheURhdGEoRklFTERfUFJPUCBwcm9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgbmFtZSkKLSAgICA6IGVQcm9wKHByb3ApLCBuQ29udHJvbEluZGV4KGlkeCksIHNGaWVsZE5hbWUobmFtZSkge30KLQotQ0pTX0RlbGF5RGF0YTo6fkNKU19EZWxheURhdGEoKSB7fQotCi12b2lkIENKU19GaWVsZDo6SW5pdEluc3RhbmNlKElKU19SdW50aW1lKiBwSVJ1bnRpbWUpIHsKLX0KLQotRmllbGQ6OkZpZWxkKENKU19PYmplY3QqIHBKU09iamVjdCkKLSAgICA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpLAotICAgICAgbV9wSlNEb2MobnVsbHB0ciksCi0gICAgICBtX3BGb3JtRmlsbEVudihudWxscHRyKSwKLSAgICAgIG1fbkZvcm1Db250cm9sSW5kZXgoLTEpLAotICAgICAgbV9iQ2FuU2V0KGZhbHNlKSwKLSAgICAgIG1fYkRlbGF5KGZhbHNlKSB7fQotCi1GaWVsZDo6fkZpZWxkKCkge30KLQotLy8gbm90ZTogaUNvbnRyb2xObyA9IC0xLCBtZWFucyBub3QgYSB3aWRnZXQuCi12b2lkIEZpZWxkOjpQYXJzZUZpZWxkTmFtZShjb25zdCBzdGQ6OndzdHJpbmcmIHN0ckZpZWxkTmFtZVBhcnNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6d3N0cmluZyYgc3RyRmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBpQ29udHJvbE5vKSB7Ci0gIGludCBpU3RhcnQgPSBzdHJGaWVsZE5hbWVQYXJzZWQuZmluZF9sYXN0X29mKEwnLicpOwotICBpZiAoaVN0YXJ0ID09IC0xKSB7Ci0gICAgc3RyRmllbGROYW1lID0gc3RyRmllbGROYW1lUGFyc2VkOwotICAgIGlDb250cm9sTm8gPSAtMTsKLSAgICByZXR1cm47Ci0gIH0KLSAgc3RkOjp3c3RyaW5nIHN1ZmZpeGFsID0gc3RyRmllbGROYW1lUGFyc2VkLnN1YnN0cihpU3RhcnQgKyAxKTsKLSAgaUNvbnRyb2xObyA9IEZYU1lTX3d0b2koc3VmZml4YWwuY19zdHIoKSk7Ci0gIGlmIChpQ29udHJvbE5vID09IDApIHsKLSAgICBpbnQgaVNwYWNlU3RhcnQ7Ci0gICAgd2hpbGUgKChpU3BhY2VTdGFydCA9IHN1ZmZpeGFsLmZpbmRfbGFzdF9vZihMIiAiKSkgIT0gLTEpIHsKLSAgICAgIHN1ZmZpeGFsLmVyYXNlKGlTcGFjZVN0YXJ0LCAxKTsKLSAgICB9Ci0KLSAgICBpZiAoc3VmZml4YWwuY29tcGFyZShMIjAiKSAhPSAwKSB7Ci0gICAgICBzdHJGaWVsZE5hbWUgPSBzdHJGaWVsZE5hbWVQYXJzZWQ7Ci0gICAgICBpQ29udHJvbE5vID0gLTE7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIHN0ckZpZWxkTmFtZSA9IHN0ckZpZWxkTmFtZVBhcnNlZC5zdWJzdHIoMCwgaVN0YXJ0KTsKLX0KLQotYm9vbCBGaWVsZDo6QXR0YWNoRmllbGQoRG9jdW1lbnQqIHBEb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSkgewotICBtX3BKU0RvYyA9IHBEb2N1bWVudDsKLSAgbV9wRm9ybUZpbGxFbnYuUmVzZXQocERvY3VtZW50LT5HZXRGb3JtRmlsbEVudigpKTsKLSAgbV9iQ2FuU2V0ID0gbV9wRm9ybUZpbGxFbnYtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0ZJTExfRk9STSkgfHwKLSAgICAgICAgICAgICAgbV9wRm9ybUZpbGxFbnYtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0FOTk9UX0ZPUk0pIHx8Ci0gICAgICAgICAgICAgIG1fcEZvcm1GaWxsRW52LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpOwotCi0gIENQREZTREtfSW50ZXJGb3JtKiBwUkRJbnRlckZvcm0gPSBtX3BGb3JtRmlsbEVudi0+R2V0SW50ZXJGb3JtKCk7Ci0gIENQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFJESW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgc3dGaWVsZE5hbWVUZW1wID0gY3NGaWVsZE5hbWU7Ci0gIHN3RmllbGROYW1lVGVtcC5SZXBsYWNlKEwiLi4iLCBMIi4iKTsKLQotICBpZiAocEludGVyRm9ybS0+Q291bnRGaWVsZHMoc3dGaWVsZE5hbWVUZW1wKSA8PSAwKSB7Ci0gICAgc3RkOjp3c3RyaW5nIHN0ckZpZWxkTmFtZTsKLSAgICBpbnQgaUNvbnRyb2xObyA9IC0xOwotICAgIFBhcnNlRmllbGROYW1lKHN3RmllbGROYW1lVGVtcC5jX3N0cigpLCBzdHJGaWVsZE5hbWUsIGlDb250cm9sTm8pOwotICAgIGlmIChpQ29udHJvbE5vID09IC0xKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgbV9GaWVsZE5hbWUgPSBzdHJGaWVsZE5hbWUuY19zdHIoKTsKLSAgICBtX25Gb3JtQ29udHJvbEluZGV4ID0gaUNvbnRyb2xObzsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIG1fRmllbGROYW1lID0gc3dGaWVsZE5hbWVUZW1wOwotICBtX25Gb3JtQ29udHJvbEluZGV4ID0gLTE7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGQ6OkdldEZvcm1GaWVsZHMoCi0gICAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKSB7Ci0gIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gZmllbGRzOwotICBDUERGU0RLX0ludGVyRm9ybSogcFJlYWRlckludGVyRm9ybSA9IHBGb3JtRmlsbEVudi0+R2V0SW50ZXJGb3JtKCk7Ci0gIENQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFJlYWRlckludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7Ci0gIGZvciAoaW50IGkgPSAwLCBzeiA9IHBJbnRlckZvcm0tPkNvdW50RmllbGRzKGNzRmllbGROYW1lKTsgaSA8IHN6OyArK2kpIHsKLSAgICBpZiAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBwSW50ZXJGb3JtLT5HZXRGaWVsZChpLCBjc0ZpZWxkTmFtZSkpCi0gICAgICBmaWVsZHMucHVzaF9iYWNrKHBGb3JtRmllbGQpOwotICB9Ci0gIHJldHVybiBmaWVsZHM7Ci19Ci0KLXN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGQ6OkdldEZvcm1GaWVsZHMoCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKSBjb25zdCB7Ci0gIHJldHVybiBGaWVsZDo6R2V0Rm9ybUZpZWxkcyhtX3BGb3JtRmlsbEVudi5HZXQoKSwgY3NGaWVsZE5hbWUpOwotfQotCi12b2lkIEZpZWxkOjpVcGRhdGVGb3JtRmllbGQoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ2hhbmdlTWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZXNldEFQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJlZnJlc2gpIHsKLSAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBwRm9ybUZpbGxFbnYtPkdldEludGVyRm9ybSgpOwotCi0gIGlmIChiUmVzZXRBUCkgewotICAgIHN0ZDo6dmVjdG9yPENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyPiB3aWRnZXRzOwotICAgIHBJbnRlckZvcm0tPkdldFdpZGdldHMocEZvcm1GaWVsZCwgJndpZGdldHMpOwotCi0gICAgaW50IG5GaWVsZFR5cGUgPSBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKLSAgICBpZiAobkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfQ09NQk9CT1ggfHwgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEKSB7Ci0gICAgICBmb3IgKGF1dG8mIHBPYnNlcnZlZCA6IHdpZGdldHMpIHsKLSAgICAgICAgaWYgKHBPYnNlcnZlZCkgewotICAgICAgICAgIGJvb2wgYkZvcm1hdHRlZCA9IGZhbHNlOwotICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZSA9IHN0YXRpY19jYXN0PENQREZTREtfV2lkZ2V0Kj4ocE9ic2VydmVkLkdldCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPk9uRm9ybWF0KGJGb3JtYXR0ZWQpOwotICAgICAgICAgIGlmIChwT2JzZXJ2ZWQpIHsgIC8vIE5vdCByZWR1bmRhbnQsIG1heSBiZSBjbG9iYmVyZWQgYnkgT25Gb3JtYXQuCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxDUERGU0RLX1dpZGdldCo+KHBPYnNlcnZlZC5HZXQoKSkKLSAgICAgICAgICAgICAgICAtPlJlc2V0QXBwZWFyYW5jZShiRm9ybWF0dGVkID8gJnNWYWx1ZSA6IG51bGxwdHIsIGZhbHNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZm9yIChhdXRvJiBwT2JzZXJ2ZWQgOiB3aWRnZXRzKSB7Ci0gICAgICAgIGlmIChwT2JzZXJ2ZWQpIHsKLSAgICAgICAgICBzdGF0aWNfY2FzdDxDUERGU0RLX1dpZGdldCo+KHBPYnNlcnZlZC5HZXQoKSkKLSAgICAgICAgICAgICAgLT5SZXNldEFwcGVhcmFuY2UobnVsbHB0ciwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKGJSZWZyZXNoKSB7Ci0gICAgLy8gUmVmcmVzaCB0aGUgd2lkZ2V0IGxpc3QuIFRoZSBjYWxscyBpbiB8YlJlc2V0QVB8IG1heSBoYXZlIGNhdXNlZCB3aWRnZXRzCi0gICAgLy8gdG8gYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LiBXZSBuZWVkIHRvIGNhbGwgfEdldFdpZGdldHN8IGFnYWluIHRvIGJlCi0gICAgLy8gc3VyZSBub25lIG9mIHRoZSB3aWRnZXRzIGhhdmUgYmVlbiBkZWxldGVkLgotICAgIHN0ZDo6dmVjdG9yPENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyPiB3aWRnZXRzOwotICAgIHBJbnRlckZvcm0tPkdldFdpZGdldHMocEZvcm1GaWVsZCwgJndpZGdldHMpOwotCi0gICAgLy8gVE9ETyhkc2luY2xhaXIpOiBEZXRlcm1pbmUgaWYgYWxsIHdpZGdldHMgc2hhcmUgdGhlIHNhbWUKLSAgICAvLyBDUERGU0RLX0ludGVyRm9ybS4gSWYgdGhhdCdzIHRoZSBjYXNlLCB3ZSBjYW4gbW92ZSB0aGUgY29kZSB0bwotICAgIC8vIHxHZXRGb3JtRmlsbEVudnwgb3V0IG9mIHRoZSBsb29wLgotICAgIGZvciAoYXV0byYgcE9ic2VydmVkIDogd2lkZ2V0cykgewotICAgICAgaWYgKHBPYnNlcnZlZCkgewotICAgICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHN0YXRpY19jYXN0PENQREZTREtfV2lkZ2V0Kj4ocE9ic2VydmVkLkdldCgpKTsKLSAgICAgICAgcFdpZGdldC0+R2V0SW50ZXJGb3JtKCktPkdldEZvcm1GaWxsRW52KCktPlVwZGF0ZUFsbFZpZXdzKG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV2lkZ2V0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoYkNoYW5nZU1hcmspCi0gICAgcEZvcm1GaWxsRW52LT5TZXRDaGFuZ2VNYXJrKCk7Ci19Ci0KLXZvaWQgRmllbGQ6OlVwZGF0ZUZvcm1Db250cm9sKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ2hhbmdlTWFyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJlc2V0QVAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZWZyZXNoKSB7Ci0gIEFTU0VSVChwRm9ybUNvbnRyb2wpOwotCi0gIENQREZTREtfSW50ZXJGb3JtKiBwRm9ybSA9IHBGb3JtRmlsbEVudi0+R2V0SW50ZXJGb3JtKCk7Ci0gIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpOwotCi0gIGlmIChwV2lkZ2V0KSB7Ci0gICAgaWYgKGJSZXNldEFQKSB7Ci0gICAgICBpbnQgbkZpZWxkVHlwZSA9IHBXaWRnZXQtPkdldEZpZWxkVHlwZSgpOwotICAgICAgaWYgKG5GaWVsZFR5cGUgPT0gRklFTERUWVBFX0NPTUJPQk9YIHx8Ci0gICAgICAgICAgbkZpZWxkVHlwZSA9PSBGSUVMRFRZUEVfVEVYVEZJRUxEKSB7Ci0gICAgICAgIGJvb2wgYkZvcm1hdHRlZCA9IGZhbHNlOwotICAgICAgICBDRlhfV2lkZVN0cmluZyBzVmFsdWUgPSBwV2lkZ2V0LT5PbkZvcm1hdChiRm9ybWF0dGVkKTsKLSAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKGJGb3JtYXR0ZWQgPyAmc1ZhbHVlIDogbnVsbHB0ciwgZmFsc2UpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcFdpZGdldC0+UmVzZXRBcHBlYXJhbmNlKG51bGxwdHIsIGZhbHNlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoYlJlZnJlc2gpIHsKLSAgICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFdpZGdldC0+R2V0SW50ZXJGb3JtKCk7Ci0gICAgICBwSW50ZXJGb3JtLT5HZXRGb3JtRmlsbEVudigpLT5VcGRhdGVBbGxWaWV3cyhudWxscHRyLCBwV2lkZ2V0KTsKLSAgICB9Ci0gIH0KLQotICBpZiAoYkNoYW5nZU1hcmspCi0gICAgcEZvcm1GaWxsRW52LT5TZXRDaGFuZ2VNYXJrKCk7Ci19Ci0KLUNQREZTREtfV2lkZ2V0KiBGaWVsZDo6R2V0V2lkZ2V0KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sKSB7Ci0gIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0KLSAgICAgIHN0YXRpY19jYXN0PENQREZTREtfSW50ZXJGb3JtKj4ocEZvcm1GaWxsRW52LT5HZXRJbnRlckZvcm0oKSk7Ci0gIHJldHVybiBwSW50ZXJGb3JtID8gcEludGVyRm9ybS0+R2V0V2lkZ2V0KHBGb3JtQ29udHJvbCkgOiBudWxscHRyOwotfQotCi1ib29sIEZpZWxkOjpWYWx1ZUlzT2NjdXIoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgY3NPcHRMYWJlbCkgewotICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKTsgaSA8IHN6OyBpKyspIHsKLSAgICBpZiAoY3NPcHRMYWJlbC5Db21wYXJlKHBGb3JtRmllbGQtPkdldE9wdGlvbkxhYmVsKGkpKSA9PSAwKQotICAgICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLUNQREZfRm9ybUNvbnRyb2wqIEZpZWxkOjpHZXRTbWFydEZpZWxkQ29udHJvbChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCkgewotICBpZiAoIXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSB8fAotICAgICAgbV9uRm9ybUNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgaWYgKG1fbkZvcm1Db250cm9sSW5kZXggPCAwKQotICAgIHJldHVybiBwRm9ybUZpZWxkLT5HZXRDb250cm9sKDApOwotCi0gIHJldHVybiBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG1fbkZvcm1Db250cm9sSW5kZXgpOwotfQotCi1ib29sIEZpZWxkOjphbGlnbm1lbnQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKLQotICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKLSAgICBpZiAoIW1fYkNhblNldCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIENGWF9CeXRlU3RyaW5nIGFsaWduU3RyOwotICAgIHZwID4+IGFsaWduU3RyOwotCi0gICAgaWYgKG1fYkRlbGF5KSB7Ci0gICAgICBBZGREZWxheV9TdHJpbmcoRlBfQUxJR05NRU5ULCBhbGlnblN0cik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEZpZWxkOjpTZXRBbGlnbm1lbnQobV9wRm9ybUZpbGxFbnYuR2V0KCksIG1fRmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtX25Gb3JtQ29udHJvbEluZGV4LCBhbGlnblN0cik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOwotICAgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07Ci0gICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICBpZiAoIXBGb3JtQ29udHJvbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHN3aXRjaCAocEZvcm1Db250cm9sLT5HZXRDb250cm9sQWxpZ25tZW50KCkpIHsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgdnAgPDwgTCJjZW50ZXIiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgdnAgPDwgTCJsZWZ0IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDI6Ci0gICAgICAgIHZwIDw8IEwicmlnaHQiOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHZwIDw8IEwiIjsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0QWxpZ25tZW50KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKSB7Ci0gIC8vIE5vdCBzdXBwb3J0ZWQuCi19Ci0KLWJvb2wgRmllbGQ6OmJvcmRlclN0eWxlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOwotCi0gIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgIGlmICghbV9iQ2FuU2V0KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyVHlwZSA9ICIiOwotICAgIHZwID4+IHN0clR5cGU7Ci0KLSAgICBpZiAobV9iRGVsYXkpIHsKLSAgICAgIEFkZERlbGF5X1N0cmluZyhGUF9CT1JERVJTVFlMRSwgc3RyVHlwZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEZpZWxkOjpTZXRCb3JkZXJTdHlsZShtX3BGb3JtRmlsbEVudi5HZXQoKSwgbV9GaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uRm9ybUNvbnRyb2xJbmRleCwgc3RyVHlwZSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOwotICAgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07Ci0gICAgaWYgKCFwRm9ybUZpZWxkKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPQotICAgICAgICBHZXRXaWRnZXQobV9wRm9ybUZpbGxFbnYuR2V0KCksIEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpKTsKLSAgICBpZiAoIXBXaWRnZXQpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBzd2l0Y2ggKHBXaWRnZXQtPkdldEJvcmRlclN0eWxlKCkpIHsKLSAgICAgIGNhc2UgQm9yZGVyU3R5bGU6OlNPTElEOgotICAgICAgICB2cCA8PCBMInNvbGlkIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJvcmRlclN0eWxlOjpEQVNIOgotICAgICAgICB2cCA8PCBMImRhc2hlZCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCb3JkZXJTdHlsZTo6QkVWRUxFRDoKLSAgICAgICAgdnAgPDwgTCJiZXZlbGVkIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJvcmRlclN0eWxlOjpJTlNFVDoKLSAgICAgICAgdnAgPDwgTCJpbnNldCI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCb3JkZXJTdHlsZTo6VU5ERVJMSU5FOgotICAgICAgICB2cCA8PCBMInVuZGVybGluZSI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdnAgPDwgTCIiOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0Qm9yZGVyU3R5bGUoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpIHsKLSAgQVNTRVJUKHBGb3JtRmlsbEVudik7Ci0KLSAgQm9yZGVyU3R5bGUgbkJvcmRlclN0eWxlID0gQm9yZGVyU3R5bGU6OlNPTElEOwotICBpZiAoc3RyaW5nID09ICJzb2xpZCIpCi0gICAgbkJvcmRlclN0eWxlID0gQm9yZGVyU3R5bGU6OlNPTElEOwotICBlbHNlIGlmIChzdHJpbmcgPT0gImJldmVsZWQiKQotICAgIG5Cb3JkZXJTdHlsZSA9IEJvcmRlclN0eWxlOjpCRVZFTEVEOwotICBlbHNlIGlmIChzdHJpbmcgPT0gImRhc2hlZCIpCi0gICAgbkJvcmRlclN0eWxlID0gQm9yZGVyU3R5bGU6OkRBU0g7Ci0gIGVsc2UgaWYgKHN0cmluZyA9PSAiaW5zZXQiKQotICAgIG5Cb3JkZXJTdHlsZSA9IEJvcmRlclN0eWxlOjpJTlNFVDsKLSAgZWxzZSBpZiAoc3RyaW5nID09ICJ1bmRlcmxpbmUiKQotICAgIG5Cb3JkZXJTdHlsZSA9IEJvcmRlclN0eWxlOjpVTkRFUkxJTkU7Ci0gIGVsc2UKLSAgICByZXR1cm47Ci0KLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0KLSAgICAgIEdldEZvcm1GaWVsZHMocEZvcm1GaWxsRW52LCBzd0ZpZWxkTmFtZSk7Ci0gIGZvciAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgOiBGaWVsZEFycmF5KSB7Ci0gICAgaWYgKG5Db250cm9sSW5kZXggPCAwKSB7Ci0gICAgICBib29sIGJTZXQgPSBmYWxzZTsKLSAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaSA8IHN6OyArK2kpIHsKLSAgICAgICAgaWYgKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0KLSAgICAgICAgICAgICAgICBHZXRXaWRnZXQocEZvcm1GaWxsRW52LCBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpKSkgewotICAgICAgICAgIGlmIChwV2lkZ2V0LT5HZXRCb3JkZXJTdHlsZSgpICE9IG5Cb3JkZXJTdHlsZSkgewotICAgICAgICAgICAgcFdpZGdldC0+U2V0Qm9yZGVyU3R5bGUobkJvcmRlclN0eWxlKTsKLSAgICAgICAgICAgIGJTZXQgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGJTZXQpCi0gICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRm9ybUZpbGxFbnYsIHBGb3JtRmllbGQsIHRydWUsIHRydWUsIHRydWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAobkNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAgIGlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPQotICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG5Db250cm9sSW5kZXgpKSB7Ci0gICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IEdldFdpZGdldChwRm9ybUZpbGxFbnYsIHBGb3JtQ29udHJvbCkpIHsKLSAgICAgICAgICBpZiAocFdpZGdldC0+R2V0Qm9yZGVyU3R5bGUoKSAhPSBuQm9yZGVyU3R5bGUpIHsKLSAgICAgICAgICAgIHBXaWRnZXQtPlNldEJvcmRlclN0eWxlKG5Cb3JkZXJTdHlsZSk7Ci0gICAgICAgICAgICBVcGRhdGVGb3JtQ29udHJvbChwRm9ybUZpbGxFbnYsIHBGb3JtQ29udHJvbCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLWJvb2wgRmllbGQ6OmJ1dHRvbkFsaWduWChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOwotCi0gIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgIGlmICghbV9iQ2FuU2V0KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaW50IG5WUDsKLSAgICB2cCA+PiBuVlA7Ci0KLSAgICBpZiAobV9iRGVsYXkpIHsKLSAgICAgIEFkZERlbGF5X0ludChGUF9CVVRUT05BTElHTlgsIG5WUCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEZpZWxkOjpTZXRCdXR0b25BbGlnblgobV9wRm9ybUZpbGxFbnYuR2V0KCksIG1fRmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25Gb3JtQ29udHJvbEluZGV4LCBuVlApOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKLSAgICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOwotICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgIGlmICghcEZvcm1Db250cm9sKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ1BERl9JY29uRml0IEljb25GaXQgPSBwRm9ybUNvbnRyb2wtPkdldEljb25GaXQoKTsKLQotICAgIEZYX0ZMT0FUIGZMZWZ0LCBmQm90dG9tOwotICAgIEljb25GaXQuR2V0SWNvblBvc2l0aW9uKGZMZWZ0LCBmQm90dG9tKTsKLQotICAgIHZwIDw8IChpbnQzMl90KWZMZWZ0OwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRmllbGQ6OlNldEJ1dHRvbkFsaWduWChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcikgewotICAvLyBOb3Qgc3VwcG9ydGVkLgotfQotCi1ib29sIEZpZWxkOjpidXR0b25BbGlnblkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKLQotICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKLSAgICBpZiAoIW1fYkNhblNldCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGludCBuVlA7Ci0gICAgdnAgPj4gblZQOwotCi0gICAgaWYgKG1fYkRlbGF5KSB7Ci0gICAgICBBZGREZWxheV9JbnQoRlBfQlVUVE9OQUxJR05ZLCBuVlApOwotICAgIH0gZWxzZSB7Ci0gICAgICBGaWVsZDo6U2V0QnV0dG9uQWxpZ25ZKG1fcEZvcm1GaWxsRW52LkdldCgpLCBtX0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uRm9ybUNvbnRyb2xJbmRleCwgblZQKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKLSAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1BVU0hCVVRUT04pCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICBpZiAoIXBGb3JtQ29udHJvbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIENQREZfSWNvbkZpdCBJY29uRml0ID0gcEZvcm1Db250cm9sLT5HZXRJY29uRml0KCk7Ci0KLSAgICBGWF9GTE9BVCBmTGVmdCwgZkJvdHRvbTsKLSAgICBJY29uRml0LkdldEljb25Qb3NpdGlvbihmTGVmdCwgZkJvdHRvbSk7Ci0KLSAgICB2cCA8PCAoaW50MzJfdClmQm90dG9tOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRmllbGQ6OlNldEJ1dHRvbkFsaWduWShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcikgewotICAvLyBOb3Qgc3VwcG9ydGVkLgotfQotCi1ib29sIEZpZWxkOjpidXR0b25GaXRCb3VuZHMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKLQotICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKLSAgICBpZiAoIW1fYkNhblNldCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJvb2wgYlZQOwotICAgIHZwID4+IGJWUDsKLQotICAgIGlmIChtX2JEZWxheSkgewotICAgICAgQWRkRGVsYXlfQm9vbChGUF9CVVRUT05GSVRCT1VORFMsIGJWUCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEZpZWxkOjpTZXRCdXR0b25GaXRCb3VuZHMobV9wRm9ybUZpbGxFbnYuR2V0KCksIG1fRmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25Gb3JtQ29udHJvbEluZGV4LCBiVlApOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKLSAgICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOwotICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgIGlmICghcEZvcm1Db250cm9sKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgdnAgPDwgcEZvcm1Db250cm9sLT5HZXRJY29uRml0KCkuR2V0Rml0dGluZ0JvdW5kcygpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRmllbGQ6OlNldEJ1dHRvbkZpdEJvdW5kcyhDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiKSB7Ci0gIC8vIE5vdCBzdXBwb3J0ZWQuCi19Ci0KLWJvb2wgRmllbGQ6OmJ1dHRvblBvc2l0aW9uKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOwotCi0gIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgIGlmICghbV9iQ2FuU2V0KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaW50IG5WUDsKLSAgICB2cCA+PiBuVlA7Ci0KLSAgICBpZiAobV9iRGVsYXkpIHsKLSAgICAgIEFkZERlbGF5X0ludChGUF9CVVRUT05QT1NJVElPTiwgblZQKTsKLSAgICB9IGVsc2UgewotICAgICAgRmllbGQ6OlNldEJ1dHRvblBvc2l0aW9uKG1fcEZvcm1GaWxsRW52LkdldCgpLCBtX0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25Gb3JtQ29udHJvbEluZGV4LCBuVlApOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKLSAgICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOwotICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICAgIGlmICghcEZvcm1Db250cm9sKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgdnAgPDwgcEZvcm1Db250cm9sLT5HZXRUZXh0UG9zaXRpb24oKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0QnV0dG9uUG9zaXRpb24oQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpIHsKLSAgLy8gTm90IHN1cHBvcnRlZC4KLX0KLQotYm9vbCBGaWVsZDo6YnV0dG9uU2NhbGVIb3coQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIEFTU0VSVChtX3BGb3JtRmlsbEVudik7Ci0KLSAgaWYgKHZwLklzU2V0dGluZygpKSB7Ci0gICAgaWYgKCFtX2JDYW5TZXQpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpbnQgblZQOwotICAgIHZwID4+IG5WUDsKLQotICAgIGlmIChtX2JEZWxheSkgewotICAgICAgQWRkRGVsYXlfSW50KEZQX0JVVFRPTlNDQUxFSE9XLCBuVlApOwotICAgIH0gZWxzZSB7Ci0gICAgICBGaWVsZDo6U2V0QnV0dG9uU2NhbGVIb3cobV9wRm9ybUZpbGxFbnYuR2V0KCksIG1fRmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbkZvcm1Db250cm9sSW5kZXgsIG5WUCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOwotICAgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07Ci0gICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gICAgaWYgKCFwRm9ybUNvbnRyb2wpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBDUERGX0ljb25GaXQgSWNvbkZpdCA9IHBGb3JtQ29udHJvbC0+R2V0SWNvbkZpdCgpOwotICAgIGlmIChJY29uRml0LklzUHJvcG9ydGlvbmFsU2NhbGUoKSkKLSAgICAgIHZwIDw8IChpbnQzMl90KTA7Ci0gICAgZWxzZQotICAgICAgdnAgPDwgKGludDMyX3QpMTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEZpZWxkOjpTZXRCdXR0b25TY2FsZUhvdyhDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcikgewotICAvLyBOb3Qgc3VwcG9ydGVkLgotfQotCi1ib29sIEZpZWxkOjpidXR0b25TY2FsZVdoZW4oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKLQotICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKLSAgICBpZiAoIW1fYkNhblNldCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGludCBuVlA7Ci0gICAgdnAgPj4gblZQOwotCi0gICAgaWYgKG1fYkRlbGF5KSB7Ci0gICAgICBBZGREZWxheV9JbnQoRlBfQlVUVE9OU0NBTEVXSEVOLCBuVlApOwotICAgIH0gZWxzZSB7Ci0gICAgICBGaWVsZDo6U2V0QnV0dG9uU2NhbGVXaGVuKG1fcEZvcm1GaWxsRW52LkdldCgpLCBtX0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uRm9ybUNvbnRyb2xJbmRleCwgblZQKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKLSAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1BVU0hCVVRUT04pCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgICBpZiAoIXBGb3JtQ29udHJvbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIENQREZfSWNvbkZpdCBJY29uRml0ID0gcEZvcm1Db250cm9sLT5HZXRJY29uRml0KCk7Ci0gICAgaW50IFNjYWxlTSA9IEljb25GaXQuR2V0U2NhbGVNZXRob2QoKTsKLSAgICBzd2l0Y2ggKFNjYWxlTSkgewotICAgICAgY2FzZSBDUERGX0ljb25GaXQ6OkFsd2F5czoKLSAgICAgICAgdnAgPDwgKGludDMyX3QpQ1BERl9JY29uRml0OjpBbHdheXM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBDUERGX0ljb25GaXQ6OkJpZ2dlcjoKLSAgICAgICAgdnAgPDwgKGludDMyX3QpQ1BERl9JY29uRml0OjpCaWdnZXI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBDUERGX0ljb25GaXQ6Ok5ldmVyOgotICAgICAgICB2cCA8PCAoaW50MzJfdClDUERGX0ljb25GaXQ6Ok5ldmVyOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQ1BERl9JY29uRml0OjpTbWFsbGVyOgotICAgICAgICB2cCA8PCAoaW50MzJfdClDUERGX0ljb25GaXQ6OlNtYWxsZXI7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEZpZWxkOjpTZXRCdXR0b25TY2FsZVdoZW4oQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpIHsKLSAgLy8gTm90IHN1cHBvcnRlZC4KLX0KLQotYm9vbCBGaWVsZDo6Y2FsY09yZGVySW5kZXgoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIEFTU0VSVChtX3BGb3JtRmlsbEVudik7Ci0KLSAgaWYgKHZwLklzU2V0dGluZygpKSB7Ci0gICAgaWYgKCFtX2JDYW5TZXQpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpbnQgblZQOwotICAgIHZwID4+IG5WUDsKLQotICAgIGlmIChtX2JEZWxheSkgewotICAgICAgQWRkRGVsYXlfSW50KEZQX0NBTENPUkRFUklOREVYLCBuVlApOwotICAgIH0gZWxzZSB7Ci0gICAgICBGaWVsZDo6U2V0Q2FsY09yZGVySW5kZXgobV9wRm9ybUZpbGxFbnYuR2V0KCksIG1fRmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbkZvcm1Db250cm9sSW5kZXgsIG5WUCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOwotICAgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07Ci0gICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9DT01CT0JPWCAmJgotICAgICAgICBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQ1BERlNES19JbnRlckZvcm0qIHBSREludGVyRm9ybSA9IG1fcEZvcm1GaWxsRW52LT5HZXRJbnRlckZvcm0oKTsKLSAgICBDUERGX0ludGVyRm9ybSogcEludGVyRm9ybSA9IHBSREludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7Ci0gICAgdnAgPDwgKGludDMyX3QpcEludGVyRm9ybS0+RmluZEZpZWxkSW5DYWxjdWxhdGlvbk9yZGVyKHBGb3JtRmllbGQpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRmllbGQ6OlNldENhbGNPcmRlckluZGV4KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKSB7Ci0gIC8vIE5vdCBzdXBwb3J0ZWQuCi19Ci0KLWJvb2wgRmllbGQ6OmNoYXJMaW1pdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOwotCi0gIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgIGlmICghbV9iQ2FuU2V0KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaW50IG5WUDsKLSAgICB2cCA+PiBuVlA7Ci0KLSAgICBpZiAobV9iRGVsYXkpIHsKLSAgICAgIEFkZERlbGF5X0ludChGUF9DSEFSTElNSVQsIG5WUCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEZpZWxkOjpTZXRDaGFyTGltaXQobV9wRm9ybUZpbGxFbnYuR2V0KCksIG1fRmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtX25Gb3JtQ29udHJvbEluZGV4LCBuVlApOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKLSAgICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOwotICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgdnAgPDwgKGludDMyX3QpcEZvcm1GaWVsZC0+R2V0TWF4TGVuKCk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRmllbGQ6OlNldENoYXJMaW1pdChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcikgewotICAvLyBOb3Qgc3VwcG9ydGVkLgotfQotCi1ib29sIEZpZWxkOjpjb21iKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKLQotICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKLSAgICBpZiAoIW1fYkNhblNldCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJvb2wgYlZQOwotICAgIHZwID4+IGJWUDsKLQotICAgIGlmIChtX2JEZWxheSkgewotICAgICAgQWRkRGVsYXlfQm9vbChGUF9DT01CLCBiVlApOwotICAgIH0gZWxzZSB7Ci0gICAgICBGaWVsZDo6U2V0Q29tYihtX3BGb3JtRmlsbEVudi5HZXQoKSwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICBiVlApOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKLSAgICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOwotICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19DT01CKQotICAgICAgdnAgPDwgdHJ1ZTsKLSAgICBlbHNlCi0gICAgICB2cCA8PCBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEZpZWxkOjpTZXRDb21iKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICBib29sIGIpIHsKLSAgLy8gTm90IHN1cHBvcnRlZC4KLX0KLQotYm9vbCBGaWVsZDo6Y29tbWl0T25TZWxDaGFuZ2UoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIEFTU0VSVChtX3BGb3JtRmlsbEVudik7Ci0KLSAgaWYgKHZwLklzU2V0dGluZygpKSB7Ci0gICAgaWYgKCFtX2JDYW5TZXQpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBib29sIGJWUDsKLSAgICB2cCA+PiBiVlA7Ci0KLSAgICBpZiAobV9iRGVsYXkpIHsKLSAgICAgIEFkZERlbGF5X0Jvb2woRlBfQ09NTUlUT05TRUxDSEFOR0UsIGJWUCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEZpZWxkOjpTZXRDb21taXRPblNlbENoYW5nZShtX3BGb3JtRmlsbEVudi5HZXQoKSwgbV9GaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uRm9ybUNvbnRyb2xJbmRleCwgYlZQKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7Ci0gICAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKLSAgICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0NPTUJPQk9YICYmCi0gICAgICAgIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9MSVNUQk9YKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19DT01NSVRPTlNFTENIQU5HRSkKLSAgICAgIHZwIDw8IHRydWU7Ci0gICAgZWxzZQotICAgICAgdnAgPDwgZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0Q29tbWl0T25TZWxDaGFuZ2UoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYikgewotICAvLyBOb3Qgc3VwcG9ydGVkLgotfQotCi1ib29sIEZpZWxkOjpjdXJyZW50VmFsdWVJbmRpY2VzKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHZwLklzU2V0dGluZygpKSB7Ci0gICAgaWYgKCFtX2JDYW5TZXQpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gYXJyYXk7Ci0gICAgaWYgKHZwLkdldEpTVmFsdWUoKS0+R2V0VHlwZSgpID09IENKU19WYWx1ZTo6VlRfbnVtYmVyKSB7Ci0gICAgICBpbnQgaVNlbGVjdGluZyA9IDA7Ci0gICAgICB2cCA+PiBpU2VsZWN0aW5nOwotICAgICAgYXJyYXkucHVzaF9iYWNrKGlTZWxlY3RpbmcpOwotICAgIH0gZWxzZSBpZiAodnAuR2V0SlNWYWx1ZSgpLT5Jc0FycmF5T2JqZWN0KCkpIHsKLSAgICAgIENKU19BcnJheSBTZWxBcnJheTsKLSAgICAgIENKU19WYWx1ZSBTZWxWYWx1ZShwUnVudGltZSk7Ci0gICAgICBpbnQgaVNlbGVjdGluZzsKLSAgICAgIHZwID4+IFNlbEFycmF5OwotICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gU2VsQXJyYXkuR2V0TGVuZ3RoKHBSdW50aW1lKTsgaSA8IHN6OyBpKyspIHsKLSAgICAgICAgU2VsQXJyYXkuR2V0RWxlbWVudChwUnVudGltZSwgaSwgU2VsVmFsdWUpOwotICAgICAgICBpU2VsZWN0aW5nID0gU2VsVmFsdWUuVG9JbnQocFJ1bnRpbWUpOwotICAgICAgICBhcnJheS5wdXNoX2JhY2soaVNlbGVjdGluZyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1fYkRlbGF5KSB7Ci0gICAgICBBZGREZWxheV9Xb3JkQXJyYXkoRlBfQ1VSUkVOVFZBTFVFSU5ESUNFUywgYXJyYXkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBGaWVsZDo6U2V0Q3VycmVudFZhbHVlSW5kaWNlcyhtX3BGb3JtRmlsbEVudi5HZXQoKSwgbV9GaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25Gb3JtQ29udHJvbEluZGV4LCBhcnJheSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOwotICAgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07Ci0gICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9DT01CT0JPWCAmJgotICAgICAgICBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfTElTVEJPWCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKSA9PSAxKSB7Ci0gICAgICB2cCA8PCBwRm9ybUZpZWxkLT5HZXRTZWxlY3RlZEluZGV4KDApOwotICAgIH0gZWxzZSBpZiAocEZvcm1GaWVsZC0+Q291bnRTZWxlY3RlZEl0ZW1zKCkgPiAxKSB7Ci0gICAgICBDSlNfQXJyYXkgU2VsQXJyYXk7Ci0gICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKTsgaSA8IHN6OyBpKyspIHsKLSAgICAgICAgU2VsQXJyYXkuU2V0RWxlbWVudCgKLSAgICAgICAgICAgIHBSdW50aW1lLCBpLCBDSlNfVmFsdWUocFJ1bnRpbWUsIHBGb3JtRmllbGQtPkdldFNlbGVjdGVkSW5kZXgoaSkpKTsKLSAgICAgIH0KLSAgICAgIHZwIDw8IFNlbEFycmF5OwotICAgIH0gZWxzZSB7Ci0gICAgICB2cCA8PCAtMTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0Q3VycmVudFZhbHVlSW5kaWNlcyhDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBhcnJheSkgewotICBBU1NFUlQocEZvcm1GaWxsRW52KTsKLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0KLSAgICAgIEdldEZvcm1GaWVsZHMocEZvcm1GaWxsRW52LCBzd0ZpZWxkTmFtZSk7Ci0KLSAgZm9yIChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA6IEZpZWxkQXJyYXkpIHsKLSAgICBpbnQgbkZpZWxkVHlwZSA9IHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpOwotICAgIGlmIChuRmllbGRUeXBlID09IEZJRUxEVFlQRV9DT01CT0JPWCB8fCBuRmllbGRUeXBlID09IEZJRUxEVFlQRV9MSVNUQk9YKSB7Ci0gICAgICB1aW50MzJfdCBkd0ZpZWxkRmxhZ3MgPSBwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCk7Ci0gICAgICBwRm9ybUZpZWxkLT5DbGVhclNlbGVjdGlvbih0cnVlKTsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXJyYXkuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgaWYgKGkgIT0gMCAmJiAhKGR3RmllbGRGbGFncyAmICgxIDw8IDIxKSkpCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmIChhcnJheVtpXSA8IHN0YXRpY19jYXN0PHVpbnQzMl90PihwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKSkgJiYKLSAgICAgICAgICAgICFwRm9ybUZpZWxkLT5Jc0l0ZW1TZWxlY3RlZChhcnJheVtpXSkpIHsKLSAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRJdGVtU2VsZWN0aW9uKGFycmF5W2ldLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgVXBkYXRlRm9ybUZpZWxkKHBGb3JtRmlsbEVudiwgcEZvcm1GaWVsZCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgfQotICB9Ci19Ci0KLWJvb2wgRmllbGQ6OmRlZmF1bHRTdHlsZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgRmllbGQ6OlNldERlZmF1bHRTdHlsZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgpIHsKLSAgLy8gTm90IHN1cHBvcnRlZC4KLX0KLQotYm9vbCBGaWVsZDo6ZGVmYXVsdFZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIEFTU0VSVChtX3BGb3JtRmlsbEVudik7Ci0KLSAgaWYgKHZwLklzU2V0dGluZygpKSB7Ci0gICAgaWYgKCFtX2JDYW5TZXQpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBDRlhfV2lkZVN0cmluZyBXaWRlU3RyOwotICAgIHZwID4+IFdpZGVTdHI7Ci0KLSAgICBpZiAobV9iRGVsYXkpIHsKLSAgICAgIEFkZERlbGF5X1dpZGVTdHJpbmcoRlBfREVGQVVMVFZBTFVFLCBXaWRlU3RyKTsKLSAgICB9IGVsc2UgewotICAgICAgRmllbGQ6OlNldERlZmF1bHRWYWx1ZShtX3BGb3JtRmlsbEVudi5HZXQoKSwgbV9GaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbkZvcm1Db250cm9sSW5kZXgsIFdpZGVTdHIpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKLSAgICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOwotICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUFVTSEJVVFRPTiB8fAotICAgICAgICBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfU0lHTkFUVVJFKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdnAgPDwgcEZvcm1GaWVsZC0+R2V0RGVmYXVsdFZhbHVlKCk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRmllbGQ6OlNldERlZmF1bHRWYWx1ZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZykgewotICAvLyBOb3Qgc3VwcG9ydGVkLgotfQotCi1ib29sIEZpZWxkOjpkb05vdFNjcm9sbChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKLQotICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKLSAgICBpZiAoIW1fYkNhblNldCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJvb2wgYlZQOwotICAgIHZwID4+IGJWUDsKLQotICAgIGlmIChtX2JEZWxheSkgewotICAgICAgQWRkRGVsYXlfQm9vbChGUF9ET05PVFNDUk9MTCwgYlZQKTsKLSAgICB9IGVsc2UgewotICAgICAgRmllbGQ6OlNldERvTm90U2Nyb2xsKG1fcEZvcm1GaWxsRW52LkdldCgpLCBtX0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25Gb3JtQ29udHJvbEluZGV4LCBiVlApOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKLSAgICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOwotICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19ET05PVFNDUk9MTCkKLSAgICAgIHZwIDw8IHRydWU7Ci0gICAgZWxzZQotICAgICAgdnAgPDwgZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0RG9Ob3RTY3JvbGwoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYikgewotICAvLyBOb3Qgc3VwcG9ydGVkLgotfQotCi1ib29sIEZpZWxkOjpkb05vdFNwZWxsQ2hlY2soQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKLQotICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKLSAgICBpZiAoIW1fYkNhblNldCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJvb2wgYlZQOwotICAgIHZwID4+IGJWUDsKLSAgfSBlbHNlIHsKLSAgICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKLSAgICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOwotICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEICYmCi0gICAgICAgIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9DT01CT0JPWCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfRE9OT1RTUEVMTENIRUNLKQotICAgICAgdnAgPDwgdHJ1ZTsKLSAgICBlbHNlCi0gICAgICB2cCA8PCBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEZpZWxkOjpTZXREZWxheShib29sIGJEZWxheSkgewotICBtX2JEZWxheSA9IGJEZWxheTsKLQotICBpZiAoIW1fYkRlbGF5KSB7Ci0gICAgaWYgKG1fcEpTRG9jKQotICAgICAgbV9wSlNEb2MtPkRvRmllbGREZWxheShtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCk7Ci0gIH0KLX0KLQotYm9vbCBGaWVsZDo6ZGVsYXkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmICghdnAuSXNTZXR0aW5nKCkpIHsKLSAgICB2cCA8PCBtX2JEZWxheTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoIW1fYkNhblNldCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYm9vbCBiVlA7Ci0gIHZwID4+IGJWUDsKLSAgU2V0RGVsYXkoYlZQKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRmllbGQ6OmRpc3BsYXkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKLSAgICBpZiAoIW1fYkNhblNldCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGludCBuVlA7Ci0gICAgdnAgPj4gblZQOwotICAgIGlmIChtX2JEZWxheSkgewotICAgICAgQWRkRGVsYXlfSW50KEZQX0RJU1BMQVksIG5WUCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEZpZWxkOjpTZXREaXNwbGF5KG1fcEZvcm1GaWxsRW52LkdldCgpLCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5WUCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOwotICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07Ci0gIEFTU0VSVChwRm9ybUZpZWxkKTsKLSAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBtX3BGb3JtRmlsbEVudi0+R2V0SW50ZXJGb3JtKCk7Ci0gIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0KLSAgICAgIHBJbnRlckZvcm0tPkdldFdpZGdldChHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKSk7Ci0gIGlmICghcFdpZGdldCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdWludDMyX3QgZHdGbGFnID0gcFdpZGdldC0+R2V0RmxhZ3MoKTsKLSAgaWYgKEFOTk9URkxBR19JTlZJU0lCTEUgJiBkd0ZsYWcgfHwgQU5OT1RGTEFHX0hJRERFTiAmIGR3RmxhZykgewotICAgIHZwIDw8IChpbnQzMl90KTE7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKEFOTk9URkxBR19QUklOVCAmIGR3RmxhZykgewotICAgICAgaWYgKEFOTk9URkxBR19OT1ZJRVcgJiBkd0ZsYWcpIHsKLSAgICAgICAgdnAgPDwgKGludDMyX3QpMzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHZwIDw8IChpbnQzMl90KTA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZwIDw8IChpbnQzMl90KTI7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEZpZWxkOjpTZXREaXNwbGF5KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKSB7Ci0gIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcEZvcm1GaWxsRW52LT5HZXRJbnRlckZvcm0oKTsKLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0KLSAgICAgIEdldEZvcm1GaWVsZHMocEZvcm1GaWxsRW52LCBzd0ZpZWxkTmFtZSk7Ci0gIGZvciAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgOiBGaWVsZEFycmF5KSB7Ci0gICAgaWYgKG5Db250cm9sSW5kZXggPCAwKSB7Ci0gICAgICBib29sIGJBbnlTZXQgPSBmYWxzZTsKLSAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaSA8IHN6OyArK2kpIHsKLSAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtQ29udHJvbCk7Ci0KLSAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1Db250cm9sKTsKLSAgICAgICAgaWYgKFNldFdpZGdldERpc3BsYXlTdGF0dXMocFdpZGdldCwgbnVtYmVyKSkKLSAgICAgICAgICBiQW55U2V0ID0gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKGJBbnlTZXQpCi0gICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRm9ybUZpbGxFbnYsIHBGb3JtRmllbGQsIHRydWUsIGZhbHNlLCB0cnVlKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKG5Db250cm9sSW5kZXggPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2wobkNvbnRyb2xJbmRleCk7Ci0gICAgICBpZiAoIXBGb3JtQ29udHJvbCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpOwotICAgICAgaWYgKFNldFdpZGdldERpc3BsYXlTdGF0dXMocFdpZGdldCwgbnVtYmVyKSkKLSAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocEZvcm1GaWxsRW52LCBwRm9ybUNvbnRyb2wsIHRydWUsIGZhbHNlLCB0cnVlKTsKLSAgICB9Ci0gIH0KLX0KLQotYm9vbCBGaWVsZDo6ZG9jKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmICghdnAuSXNHZXR0aW5nKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHZwIDw8IG1fcEpTRG9jLT5HZXRDSlNEb2MoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRmllbGQ6OmVkaXRhYmxlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKLSAgICBpZiAoIW1fYkNhblNldCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJvb2wgYlZQOwotICAgIHZwID4+IGJWUDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKLSAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOwotICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX0NPTUJPQk9YKQotICAgIHJldHVybiBmYWxzZTsKLQotICB2cCA8PCAhIShwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfRURJVCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEZpZWxkOjpleHBvcnRWYWx1ZXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7Ci0gIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKLSAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9DSEVDS0JPWCAmJgotICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1JBRElPQlVUVE9OKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICh2cC5Jc1NldHRpbmcoKSkKLSAgICByZXR1cm4gbV9iQ2FuU2V0ICYmIHZwLkdldEpTVmFsdWUoKS0+SXNBcnJheU9iamVjdCgpOwotCi0gIENKU19BcnJheSBFeHBvcnRWYWx1c0FycmF5OwotICBpZiAobV9uRm9ybUNvbnRyb2xJbmRleCA8IDApIHsKLSAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGkgPCBzejsgaSsrKSB7Ci0gICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpOwotICAgICAgRXhwb3J0VmFsdXNBcnJheS5TZXRFbGVtZW50KAotICAgICAgICAgIHBSdW50aW1lLCBpLAotICAgICAgICAgIENKU19WYWx1ZShwUnVudGltZSwgcEZvcm1Db250cm9sLT5HZXRFeHBvcnRWYWx1ZSgpLmNfc3RyKCkpKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKG1fbkZvcm1Db250cm9sSW5kZXggPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0KLSAgICAgICAgcEZvcm1GaWVsZC0+R2V0Q29udHJvbChtX25Gb3JtQ29udHJvbEluZGV4KTsKLSAgICBpZiAoIXBGb3JtQ29udHJvbCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIEV4cG9ydFZhbHVzQXJyYXkuU2V0RWxlbWVudCgKLSAgICAgICAgcFJ1bnRpbWUsIDAsCi0gICAgICAgIENKU19WYWx1ZShwUnVudGltZSwgcEZvcm1Db250cm9sLT5HZXRFeHBvcnRWYWx1ZSgpLmNfc3RyKCkpKTsKLSAgfQotICB2cCA8PCBFeHBvcnRWYWx1c0FycmF5OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBGaWVsZDo6ZmlsZVNlbGVjdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOwotICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07Ci0gIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKLSAgICBpZiAoIW1fYkNhblNldCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJvb2wgYlZQOwotICAgIHZwID4+IGJWUDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICB2cCA8PCAhIShwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfRklMRVNFTEVDVCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEZpZWxkOjpmaWxsQ29sb3IoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgQ0pTX0FycmF5IGNyQXJyYXk7Ci0gIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOwotICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKLSAgICBpZiAoIW1fYkNhblNldCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmICghdnAuR2V0SlNWYWx1ZSgpLT5Jc0FycmF5T2JqZWN0KCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICB2cCA+PiBjckFycmF5OwotCi0gICAgQ1BXTF9Db2xvciBjb2xvcjsKLSAgICBjb2xvcjo6Q29udmVydEFycmF5VG9QV0xDb2xvcihwUnVudGltZSwgY3JBcnJheSwgJmNvbG9yKTsKLSAgICBpZiAobV9iRGVsYXkpIHsKLSAgICAgIEFkZERlbGF5X0NvbG9yKEZQX0ZJTExDT0xPUiwgY29sb3IpOwotICAgIH0gZWxzZSB7Ci0gICAgICBGaWVsZDo6U2V0RmlsbENvbG9yKG1fcEZvcm1GaWxsRW52LkdldCgpLCBtX0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uRm9ybUNvbnRyb2xJbmRleCwgY29sb3IpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07Ci0gIEFTU0VSVChwRm9ybUZpZWxkKTsKLSAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gIGlmICghcEZvcm1Db250cm9sKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbnQgaUNvbG9yVHlwZTsKLSAgcEZvcm1Db250cm9sLT5HZXRCYWNrZ3JvdW5kQ29sb3IoaUNvbG9yVHlwZSk7Ci0KLSAgQ1BXTF9Db2xvciBjb2xvcjsKLSAgaWYgKGlDb2xvclR5cGUgPT0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UKSB7Ci0gICAgY29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9UUkFOU1BBUkVOVCk7Ci0gIH0gZWxzZSBpZiAoaUNvbG9yVHlwZSA9PSBDT0xPUlRZUEVfR1JBWSkgewotICAgIGNvbG9yID0KLSAgICAgICAgQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcigwKSk7Ci0gIH0gZWxzZSBpZiAoaUNvbG9yVHlwZSA9PSBDT0xPUlRZUEVfUkdCKSB7Ci0gICAgY29sb3IgPQotICAgICAgICBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoMCksCi0gICAgICAgICAgICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcigxKSwKLSAgICAgICAgICAgICAgICAgICBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKDIpKTsKLSAgfSBlbHNlIGlmIChpQ29sb3JUeXBlID09IENPTE9SVFlQRV9DTVlLKSB7Ci0gICAgY29sb3IgPQotICAgICAgICBDUFdMX0NvbG9yKENPTE9SVFlQRV9DTVlLLCBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKDApLAotICAgICAgICAgICAgICAgICAgIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoMSksCi0gICAgICAgICAgICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcigyKSwKLSAgICAgICAgICAgICAgICAgICBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKDMpKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgY29sb3I6OkNvbnZlcnRQV0xDb2xvclRvQXJyYXkocFJ1bnRpbWUsIGNvbG9yLCAmY3JBcnJheSk7Ci0gIHZwIDw8IGNyQXJyYXk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEZpZWxkOjpTZXRGaWxsQ29sb3IoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKSB7Ci0gIC8vIE5vdCBzdXBwb3J0ZWQuCi19Ci0KLWJvb2wgRmllbGQ6OmhpZGRlbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKLSAgICBpZiAoIW1fYkNhblNldCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJvb2wgYlZQOwotICAgIHZwID4+IGJWUDsKLSAgICBpZiAobV9iRGVsYXkpIHsKLSAgICAgIEFkZERlbGF5X0Jvb2woRlBfSElEREVOLCBiVlApOwotICAgIH0gZWxzZSB7Ci0gICAgICBGaWVsZDo6U2V0SGlkZGVuKG1fcEZvcm1GaWxsRW52LkdldCgpLCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgYlZQKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7Ci0gIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKLSAgQVNTRVJUKHBGb3JtRmllbGQpOwotICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IG1fcEZvcm1GaWxsRW52LT5HZXRJbnRlckZvcm0oKTsKLSAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPQotICAgICAgcEludGVyRm9ybS0+R2V0V2lkZ2V0KEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpKTsKLSAgaWYgKCFwV2lkZ2V0KQotICAgIHJldHVybiBmYWxzZTsKLQotICB1aW50MzJfdCBkd0ZsYWdzID0gcFdpZGdldC0+R2V0RmxhZ3MoKTsKLSAgaWYgKEFOTk9URkxBR19JTlZJU0lCTEUgJiBkd0ZsYWdzIHx8IEFOTk9URkxBR19ISURERU4gJiBkd0ZsYWdzKQotICAgIHZwIDw8IHRydWU7Ci0gIGVsc2UKLSAgICB2cCA8PCBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0SGlkZGVuKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBib29sIGIpIHsKLSAgaW50IGRpc3BsYXkgPSBiID8gMSAvKkhpZGRlbiovIDogMCAvKlZpc2libGUqLzsKLSAgU2V0RGlzcGxheShwRm9ybUZpbGxFbnYsIHN3RmllbGROYW1lLCBuQ29udHJvbEluZGV4LCBkaXNwbGF5KTsKLX0KLQotYm9vbCBGaWVsZDo6aGlnaGxpZ2h0KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIEFTU0VSVChtX3BGb3JtRmlsbEVudik7Ci0gIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgIGlmICghbV9iQ2FuU2V0KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ0ZYX0J5dGVTdHJpbmcgc3RyTW9kZTsKLSAgICB2cCA+PiBzdHJNb2RlOwotCi0gICAgaWYgKG1fYkRlbGF5KSB7Ci0gICAgICBBZGREZWxheV9TdHJpbmcoRlBfSElHSExJR0hULCBzdHJNb2RlKTsKLSAgICB9IGVsc2UgewotICAgICAgRmllbGQ6OlNldEhpZ2hsaWdodChtX3BGb3JtRmlsbEVudi5HZXQoKSwgbV9GaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1fbkZvcm1Db250cm9sSW5kZXgsIHN0ck1vZGUpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKLSAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOwotICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1BVU0hCVVRUT04pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICBpZiAoIXBGb3JtQ29udHJvbCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW50IGVITSA9IHBGb3JtQ29udHJvbC0+R2V0SGlnaGxpZ2h0aW5nTW9kZSgpOwotICBzd2l0Y2ggKGVITSkgewotICAgIGNhc2UgQ1BERl9Gb3JtQ29udHJvbDo6Tm9uZToKLSAgICAgIHZwIDw8IEwibm9uZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENQREZfRm9ybUNvbnRyb2w6OlB1c2g6Ci0gICAgICB2cCA8PCBMInB1c2giOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDUERGX0Zvcm1Db250cm9sOjpJbnZlcnQ6Ci0gICAgICB2cCA8PCBMImludmVydCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENQREZfRm9ybUNvbnRyb2w6Ok91dGxpbmU6Ci0gICAgICB2cCA8PCBMIm91dGxpbmUiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDUERGX0Zvcm1Db250cm9sOjpUb2dnbGU6Ci0gICAgICB2cCA8PCBMInRvZ2dsZSI7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0SGlnaGxpZ2h0KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKSB7Ci0gIC8vIE5vdCBzdXBwb3J0ZWQuCi19Ci0KLWJvb2wgRmllbGQ6OmxpbmVXaWR0aChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKLSAgICBpZiAoIW1fYkNhblNldCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGludCBpV2lkdGg7Ci0gICAgdnAgPj4gaVdpZHRoOwotCi0gICAgaWYgKG1fYkRlbGF5KSB7Ci0gICAgICBBZGREZWxheV9JbnQoRlBfTElORVdJRFRILCBpV2lkdGgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBGaWVsZDo6U2V0TGluZVdpZHRoKG1fcEZvcm1GaWxsRW52LkdldCgpLCBtX0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uRm9ybUNvbnRyb2xJbmRleCwgaVdpZHRoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7Ci0gIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKLSAgQVNTRVJUKHBGb3JtRmllbGQpOwotICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgaWYgKCFwRm9ybUNvbnRyb2wpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gbV9wRm9ybUZpbGxFbnYtPkdldEludGVyRm9ybSgpOwotICBpZiAoIXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1GaWVsZC0+R2V0Q29udHJvbCgwKSk7Ci0gIGlmICghcFdpZGdldCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdnAgPDwgKGludDMyX3QpcFdpZGdldC0+R2V0Qm9yZGVyV2lkdGgoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRmllbGQ6OlNldExpbmVXaWR0aChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcikgewotICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IHBGb3JtRmlsbEVudi0+R2V0SW50ZXJGb3JtKCk7Ci0gIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9Ci0gICAgICBHZXRGb3JtRmllbGRzKHBGb3JtRmlsbEVudiwgc3dGaWVsZE5hbWUpOwotICBmb3IgKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkIDogRmllbGRBcnJheSkgewotICAgIGlmIChuQ29udHJvbEluZGV4IDwgMCkgewotICAgICAgYm9vbCBiU2V0ID0gZmFsc2U7Ci0gICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGkgPCBzejsgKytpKSB7Ci0gICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woaSk7Ci0gICAgICAgIEFTU0VSVChwRm9ybUNvbnRyb2wpOwotCi0gICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKSB7Ci0gICAgICAgICAgaWYgKG51bWJlciAhPSBwV2lkZ2V0LT5HZXRCb3JkZXJXaWR0aCgpKSB7Ci0gICAgICAgICAgICBwV2lkZ2V0LT5TZXRCb3JkZXJXaWR0aChudW1iZXIpOwotICAgICAgICAgICAgYlNldCA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoYlNldCkKLSAgICAgICAgVXBkYXRlRm9ybUZpZWxkKHBGb3JtRmlsbEVudiwgcEZvcm1GaWVsZCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChuQ29udHJvbEluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKLSAgICAgICAgcmV0dXJuOwotICAgICAgaWYgKENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9Ci0gICAgICAgICAgICAgIHBGb3JtRmllbGQtPkdldENvbnRyb2wobkNvbnRyb2xJbmRleCkpIHsKLSAgICAgICAgaWYgKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KHBGb3JtQ29udHJvbCkpIHsKLSAgICAgICAgICBpZiAobnVtYmVyICE9IHBXaWRnZXQtPkdldEJvcmRlcldpZHRoKCkpIHsKLSAgICAgICAgICAgIHBXaWRnZXQtPlNldEJvcmRlcldpZHRoKG51bWJlcik7Ci0gICAgICAgICAgICBVcGRhdGVGb3JtQ29udHJvbChwRm9ybUZpbGxFbnYsIHBGb3JtQ29udHJvbCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLWJvb2wgRmllbGQ6Om11bHRpbGluZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOwotCi0gIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgIGlmICghbV9iQ2FuU2V0KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYm9vbCBiVlA7Ci0gICAgdnAgPj4gYlZQOwotCi0gICAgaWYgKG1fYkRlbGF5KSB7Ci0gICAgICBBZGREZWxheV9Cb29sKEZQX01VTFRJTElORSwgYlZQKTsKLSAgICB9IGVsc2UgewotICAgICAgRmllbGQ6OlNldE11bHRpbGluZShtX3BGb3JtRmlsbEVudi5HZXQoKSwgbV9GaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1fbkZvcm1Db250cm9sSW5kZXgsIGJWUCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOwotICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07Ci0gIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX01VTFRJTElORSkKLSAgICB2cCA8PCB0cnVlOwotICBlbHNlCi0gICAgdnAgPDwgZmFsc2U7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRmllbGQ6OlNldE11bHRpbGluZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiKSB7Ci0gIC8vIE5vdCBzdXBwb3J0ZWQuCi19Ci0KLWJvb2wgRmllbGQ6Om11bHRpcGxlU2VsZWN0aW9uKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOwotICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKLSAgICBpZiAoIW1fYkNhblNldCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJvb2wgYlZQOwotICAgIHZwID4+IGJWUDsKLSAgICBpZiAobV9iRGVsYXkpIHsKLSAgICAgIEFkZERlbGF5X0Jvb2woRlBfTVVMVElQTEVTRUxFQ1RJT04sIGJWUCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEZpZWxkOjpTZXRNdWx0aXBsZVNlbGVjdGlvbihtX3BGb3JtRmlsbEVudi5HZXQoKSwgbV9GaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uRm9ybUNvbnRyb2xJbmRleCwgYlZQKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7Ci0gIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKLSAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9MSVNUQk9YKQotICAgIHJldHVybiBmYWxzZTsKLQotICB2cCA8PCAhIShwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfTVVMVElTRUxFQ1QpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0TXVsdGlwbGVTZWxlY3Rpb24oQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYikgewotICAvLyBOb3Qgc3VwcG9ydGVkLgotfQotCi1ib29sIEZpZWxkOjpuYW1lKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7Ci0gIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHZwIDw8IG1fRmllbGROYW1lOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBGaWVsZDo6bnVtSXRlbXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmICghdnAuSXNHZXR0aW5nKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOwotICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07Ci0gIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ09NQk9CT1ggJiYKLSAgICAgIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9MSVNUQk9YKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdnAgPDwgKGludDMyX3QpcEZvcm1GaWVsZC0+Q291bnRPcHRpb25zKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEZpZWxkOjpwYWdlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKCF2cC5Jc0dldHRpbmcoKSkgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNSRUFET05MWSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7Ci0gIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKLSAgaWYgKCFwRm9ybUZpZWxkKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzdGQ6OnZlY3RvcjxDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0cj4gd2lkZ2V0czsKLSAgbV9wRm9ybUZpbGxFbnYtPkdldEludGVyRm9ybSgpLT5HZXRXaWRnZXRzKHBGb3JtRmllbGQsICZ3aWRnZXRzKTsKLSAgaWYgKHdpZGdldHMuZW1wdHkoKSkgewotICAgIHZwIDw8IChpbnQzMl90KS0xOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgQ0pTX0FycmF5IFBhZ2VBcnJheTsKLSAgaW50IGkgPSAwOwotICBmb3IgKGNvbnN0IGF1dG8mIHBPYnNlcnZlZCA6IHdpZGdldHMpIHsKLSAgICBpZiAoIXBPYnNlcnZlZCkgewotICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU0JBRE9CSkVDVCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYXV0byBwV2lkZ2V0ID0gc3RhdGljX2Nhc3Q8Q1BERlNES19XaWRnZXQqPihwT2JzZXJ2ZWQuR2V0KCkpOwotICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBXaWRnZXQtPkdldFBhZ2VWaWV3KCk7Ci0gICAgaWYgKCFwUGFnZVZpZXcpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBQYWdlQXJyYXkuU2V0RWxlbWVudCgKLSAgICAgICAgcFJ1bnRpbWUsIGksIENKU19WYWx1ZShwUnVudGltZSwgKGludDMyX3QpcFBhZ2VWaWV3LT5HZXRQYWdlSW5kZXgoKSkpOwotICAgICsraTsKLSAgfQotCi0gIHZwIDw8IFBhZ2VBcnJheTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRmllbGQ6OnBhc3N3b3JkKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOwotCi0gIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgIGlmICghbV9iQ2FuU2V0KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYm9vbCBiVlA7Ci0gICAgdnAgPj4gYlZQOwotICAgIGlmIChtX2JEZWxheSkgewotICAgICAgQWRkRGVsYXlfQm9vbChGUF9QQVNTV09SRCwgYlZQKTsKLSAgICB9IGVsc2UgewotICAgICAgRmllbGQ6OlNldFBhc3N3b3JkKG1fcEZvcm1GaWxsRW52LkdldCgpLCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBiVlApOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOwotICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07Ci0gIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEKQotICAgIHJldHVybiBmYWxzZTsKLQotICB2cCA8PCAhIShwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUEFTU1dPUkQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0UGFzc3dvcmQoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYikgewotICAvLyBOb3Qgc3VwcG9ydGVkLgotfQotCi1ib29sIEZpZWxkOjpwcmludChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBtX3BGb3JtRmlsbEVudi0+R2V0SW50ZXJGb3JtKCk7Ci0gIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOwotICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKLSAgICBpZiAoIW1fYkNhblNldCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJvb2wgYlZQOwotICAgIHZwID4+IGJWUDsKLQotICAgIGZvciAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgOiBGaWVsZEFycmF5KSB7Ci0gICAgICBpZiAobV9uRm9ybUNvbnRyb2xJbmRleCA8IDApIHsKLSAgICAgICAgYm9vbCBiU2V0ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaSA8IHN6OyArK2kpIHsKLSAgICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPQotICAgICAgICAgICAgICAgICAgcEludGVyRm9ybS0+R2V0V2lkZ2V0KHBGb3JtRmllbGQtPkdldENvbnRyb2woaSkpKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzID0gcFdpZGdldC0+R2V0RmxhZ3MoKTsKLSAgICAgICAgICAgIGlmIChiVlApCi0gICAgICAgICAgICAgIGR3RmxhZ3MgfD0gQU5OT1RGTEFHX1BSSU5UOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBkd0ZsYWdzICY9IH5BTk5PVEZMQUdfUFJJTlQ7Ci0KLSAgICAgICAgICAgIGlmIChkd0ZsYWdzICE9IHBXaWRnZXQtPkdldEZsYWdzKCkpIHsKLSAgICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFncyk7Ci0gICAgICAgICAgICAgIGJTZXQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChiU2V0KQotICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChtX3BGb3JtRmlsbEVudi5HZXQoKSwgcEZvcm1GaWVsZCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1fbkZvcm1Db250cm9sSW5kZXggPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9Ci0gICAgICAgICAgICAgICAgcEZvcm1GaWVsZC0+R2V0Q29udHJvbChtX25Gb3JtQ29udHJvbEluZGV4KSkgewotICAgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzID0gcFdpZGdldC0+R2V0RmxhZ3MoKTsKLSAgICAgICAgICAgIGlmIChiVlApCi0gICAgICAgICAgICAgIGR3RmxhZ3MgfD0gQU5OT1RGTEFHX1BSSU5UOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBkd0ZsYWdzICY9IH5BTk5PVEZMQUdfUFJJTlQ7Ci0KLSAgICAgICAgICAgIGlmIChkd0ZsYWdzICE9IHBXaWRnZXQtPkdldEZsYWdzKCkpIHsKLSAgICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFncyk7Ci0gICAgICAgICAgICAgIFVwZGF0ZUZvcm1Db250cm9sKG1fcEZvcm1GaWxsRW52LkdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG1fbkZvcm1Db250cm9sSW5kZXgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOwotICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9Ci0gICAgICBwSW50ZXJGb3JtLT5HZXRXaWRnZXQoR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCkpOwotICBpZiAoIXBXaWRnZXQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHZwIDw8ICEhKHBXaWRnZXQtPkdldEZsYWdzKCkgJiBBTk5PVEZMQUdfUFJJTlQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBGaWVsZDo6cmFkaW9zSW5Vbmlzb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOwotICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKLSAgICBpZiAoIW1fYkNhblNldCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGJvb2wgYlZQOwotICAgIHZwID4+IGJWUDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07Ci0gIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUkFESU9CVVRUT04pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHZwIDw8ICEhKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19SQURJT1NJTlVOSVNPTik7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEZpZWxkOjpyZWFkb25seShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7Ci0gIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgIGlmICghbV9iQ2FuU2V0KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYm9vbCBiVlA7Ci0gICAgdnAgPj4gYlZQOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHZwIDw8ICEhKEZpZWxkQXJyYXlbMF0tPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19SRUFET05MWSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEZpZWxkOjpyZWN0KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgQ0pTX1ZhbHVlIFVwcGVyX0xlZnR4KHBSdW50aW1lKTsKLSAgQ0pTX1ZhbHVlIFVwcGVyX0xlZnR5KHBSdW50aW1lKTsKLSAgQ0pTX1ZhbHVlIExvd2VyX1JpZ2h0eChwUnVudGltZSk7Ci0gIENKU19WYWx1ZSBMb3dlcl9SaWdodHkocFJ1bnRpbWUpOwotCi0gIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgIGlmICghbV9iQ2FuU2V0KQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGlmICghdnAuR2V0SlNWYWx1ZSgpLT5Jc0FycmF5T2JqZWN0KCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBDSlNfQXJyYXkgcmNBcnJheTsKLSAgICB2cCA+PiByY0FycmF5OwotICAgIHJjQXJyYXkuR2V0RWxlbWVudChwUnVudGltZSwgMCwgVXBwZXJfTGVmdHgpOwotICAgIHJjQXJyYXkuR2V0RWxlbWVudChwUnVudGltZSwgMSwgVXBwZXJfTGVmdHkpOwotICAgIHJjQXJyYXkuR2V0RWxlbWVudChwUnVudGltZSwgMiwgTG93ZXJfUmlnaHR4KTsKLSAgICByY0FycmF5LkdldEVsZW1lbnQocFJ1bnRpbWUsIDMsIExvd2VyX1JpZ2h0eSk7Ci0KLSAgICBGWF9GTE9BVCBwQXJyYXlbNF0gPSB7MC4wZiwgMC4wZiwgMC4wZiwgMC4wZn07Ci0gICAgcEFycmF5WzBdID0gc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KFVwcGVyX0xlZnR4LlRvSW50KHBSdW50aW1lKSk7Ci0gICAgcEFycmF5WzFdID0gc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KExvd2VyX1JpZ2h0eS5Ub0ludChwUnVudGltZSkpOwotICAgIHBBcnJheVsyXSA9IHN0YXRpY19jYXN0PEZYX0ZMT0FUPihMb3dlcl9SaWdodHguVG9JbnQocFJ1bnRpbWUpKTsKLSAgICBwQXJyYXlbM10gPSBzdGF0aWNfY2FzdDxGWF9GTE9BVD4oVXBwZXJfTGVmdHkuVG9JbnQocFJ1bnRpbWUpKTsKLQotICAgIENGWF9GbG9hdFJlY3QgY3JSZWN0KHBBcnJheSk7Ci0gICAgaWYgKG1fYkRlbGF5KSB7Ci0gICAgICBBZGREZWxheV9SZWN0KEZQX1JFQ1QsIGNyUmVjdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEZpZWxkOjpTZXRSZWN0KG1fcEZvcm1GaWxsRW52LkdldCgpLCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgIGNyUmVjdCk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOwotICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07Ci0gIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gbV9wRm9ybUZpbGxFbnYtPkdldEludGVyRm9ybSgpOwotICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9Ci0gICAgICBwSW50ZXJGb3JtLT5HZXRXaWRnZXQoR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCkpOwotICBpZiAoIXBXaWRnZXQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENGWF9GbG9hdFJlY3QgY3JSZWN0ID0gcFdpZGdldC0+R2V0UmVjdCgpOwotICBVcHBlcl9MZWZ0eCA9IENKU19WYWx1ZShwUnVudGltZSwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oY3JSZWN0LmxlZnQpKTsKLSAgVXBwZXJfTGVmdHkgPSBDSlNfVmFsdWUocFJ1bnRpbWUsIHN0YXRpY19jYXN0PGludDMyX3Q+KGNyUmVjdC50b3ApKTsKLSAgTG93ZXJfUmlnaHR4ID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCBzdGF0aWNfY2FzdDxpbnQzMl90PihjclJlY3QucmlnaHQpKTsKLSAgTG93ZXJfUmlnaHR5ID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCBzdGF0aWNfY2FzdDxpbnQzMl90PihjclJlY3QuYm90dG9tKSk7Ci0KLSAgQ0pTX0FycmF5IHJjQXJyYXk7Ci0gIHJjQXJyYXkuU2V0RWxlbWVudChwUnVudGltZSwgMCwgVXBwZXJfTGVmdHgpOwotICByY0FycmF5LlNldEVsZW1lbnQocFJ1bnRpbWUsIDEsIFVwcGVyX0xlZnR5KTsKLSAgcmNBcnJheS5TZXRFbGVtZW50KHBSdW50aW1lLCAyLCBMb3dlcl9SaWdodHgpOwotICByY0FycmF5LlNldEVsZW1lbnQocFJ1bnRpbWUsIDMsIExvd2VyX1JpZ2h0eSk7Ci0gIHZwIDw8IHJjQXJyYXk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEZpZWxkOjpTZXRSZWN0KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KSB7Ci0gIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcEZvcm1GaWxsRW52LT5HZXRJbnRlckZvcm0oKTsKLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0KLSAgICAgIEdldEZvcm1GaWVsZHMocEZvcm1GaWxsRW52LCBzd0ZpZWxkTmFtZSk7Ci0gIGZvciAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgOiBGaWVsZEFycmF5KSB7Ci0gICAgaWYgKG5Db250cm9sSW5kZXggPCAwKSB7Ci0gICAgICBib29sIGJTZXQgPSBmYWxzZTsKLSAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaSA8IHN6OyArK2kpIHsKLSAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKTsKLSAgICAgICAgQVNTRVJUKHBGb3JtQ29udHJvbCk7Ci0KLSAgICAgICAgaWYgKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KHBGb3JtQ29udHJvbCkpIHsKLSAgICAgICAgICBDRlhfRmxvYXRSZWN0IGNyUmVjdCA9IHJlY3Q7Ci0KLSAgICAgICAgICBDUERGX1BhZ2UqIHBQREZQYWdlID0gcFdpZGdldC0+R2V0UERGUGFnZSgpOwotICAgICAgICAgIGNyUmVjdC5JbnRlcnNlY3QocFBERlBhZ2UtPkdldFBhZ2VCQm94KCkpOwotCi0gICAgICAgICAgaWYgKCFjclJlY3QuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBDRlhfRmxvYXRSZWN0IHJjT2xkID0gcFdpZGdldC0+R2V0UmVjdCgpOwotICAgICAgICAgICAgaWYgKGNyUmVjdC5sZWZ0ICE9IHJjT2xkLmxlZnQgfHwgY3JSZWN0LnJpZ2h0ICE9IHJjT2xkLnJpZ2h0IHx8Ci0gICAgICAgICAgICAgICAgY3JSZWN0LnRvcCAhPSByY09sZC50b3AgfHwgY3JSZWN0LmJvdHRvbSAhPSByY09sZC5ib3R0b20pIHsKLSAgICAgICAgICAgICAgcFdpZGdldC0+U2V0UmVjdChjclJlY3QpOwotICAgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKGJTZXQpCi0gICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRm9ybUZpbGxFbnYsIHBGb3JtRmllbGQsIHRydWUsIHRydWUsIHRydWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAobkNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAgIGlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPQotICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG5Db250cm9sSW5kZXgpKSB7Ci0gICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKSB7Ci0gICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCBjclJlY3QgPSByZWN0OwotCi0gICAgICAgICAgQ1BERl9QYWdlKiBwUERGUGFnZSA9IHBXaWRnZXQtPkdldFBERlBhZ2UoKTsKLSAgICAgICAgICBjclJlY3QuSW50ZXJzZWN0KHBQREZQYWdlLT5HZXRQYWdlQkJveCgpKTsKLQotICAgICAgICAgIGlmICghY3JSZWN0LklzRW1wdHkoKSkgewotICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByY09sZCA9IHBXaWRnZXQtPkdldFJlY3QoKTsKLSAgICAgICAgICAgIGlmIChjclJlY3QubGVmdCAhPSByY09sZC5sZWZ0IHx8IGNyUmVjdC5yaWdodCAhPSByY09sZC5yaWdodCB8fAotICAgICAgICAgICAgICAgIGNyUmVjdC50b3AgIT0gcmNPbGQudG9wIHx8IGNyUmVjdC5ib3R0b20gIT0gcmNPbGQuYm90dG9tKSB7Ci0gICAgICAgICAgICAgIHBXaWRnZXQtPlNldFJlY3QoY3JSZWN0KTsKLSAgICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocEZvcm1GaWxsRW52LCBwRm9ybUNvbnRyb2wsIHRydWUsIHRydWUsIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1ib29sIEZpZWxkOjpyZXF1aXJlZChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7Ci0gIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgIGlmICghbV9iQ2FuU2V0KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgYm9vbCBiVlA7Ci0gICAgdnAgPj4gYlZQOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKLSAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgIHJldHVybiBmYWxzZTsKLQotICB2cCA8PCAhIShwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUkVRVUlSRUQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBGaWVsZDo6cmljaFRleHQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIEFTU0VSVChtX3BGb3JtRmlsbEVudik7Ci0KLSAgaWYgKHZwLklzU2V0dGluZygpKSB7Ci0gICAgaWYgKCFtX2JDYW5TZXQpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBib29sIGJWUDsKLSAgICB2cCA+PiBiVlA7Ci0gICAgaWYgKG1fYkRlbGF5KQotICAgICAgQWRkRGVsYXlfQm9vbChGUF9SSUNIVEVYVCwgYlZQKTsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7Ci0gIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKLSAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9URVhURklFTEQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHZwIDw8ICEhKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19SSUNIVEVYVCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEZpZWxkOjpyaWNoVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRmllbGQ6OnJvdGF0aW9uKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOwotCi0gIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgIGlmICghbV9iQ2FuU2V0KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaW50IG5WUDsKLSAgICB2cCA+PiBuVlA7Ci0gICAgaWYgKG1fYkRlbGF5KSB7Ci0gICAgICBBZGREZWxheV9JbnQoRlBfUk9UQVRJT04sIG5WUCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEZpZWxkOjpTZXRSb3RhdGlvbihtX3BGb3JtRmlsbEVudi5HZXQoKSwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgblZQKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7Ci0gIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKLSAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gIGlmICghcEZvcm1Db250cm9sKQotICAgIHJldHVybiBmYWxzZTsKLQotICB2cCA8PCAoaW50MzJfdClwRm9ybUNvbnRyb2wtPkdldFJvdGF0aW9uKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEZpZWxkOjpTZXRSb3RhdGlvbihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcikgewotICAvLyBOb3Qgc3VwcG9ydGVkLgotfQotCi1ib29sIEZpZWxkOjpzdHJva2VDb2xvcihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgQ0pTX0FycmF5IGNyQXJyYXk7Ci0KLSAgaWYgKHZwLklzU2V0dGluZygpKSB7Ci0gICAgaWYgKCFtX2JDYW5TZXQpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAoIXZwLkdldEpTVmFsdWUoKS0+SXNBcnJheU9iamVjdCgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgdnAgPj4gY3JBcnJheTsKLQotICAgIENQV0xfQ29sb3IgY29sb3I7Ci0gICAgY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IocFJ1bnRpbWUsIGNyQXJyYXksICZjb2xvcik7Ci0gICAgaWYgKG1fYkRlbGF5KSB7Ci0gICAgICBBZGREZWxheV9Db2xvcihGUF9TVFJPS0VDT0xPUiwgY29sb3IpOwotICAgIH0gZWxzZSB7Ci0gICAgICBGaWVsZDo6U2V0U3Ryb2tlQ29sb3IobV9wRm9ybUZpbGxFbnYuR2V0KCksIG1fRmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbkZvcm1Db250cm9sSW5kZXgsIGNvbG9yKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7Ci0gIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKLSAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gIGlmICghcEZvcm1Db250cm9sKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbnQgaUNvbG9yVHlwZTsKLSAgcEZvcm1Db250cm9sLT5HZXRCb3JkZXJDb2xvcihpQ29sb3JUeXBlKTsKLQotICBDUFdMX0NvbG9yIGNvbG9yOwotICBpZiAoaUNvbG9yVHlwZSA9PSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQpIHsKLSAgICBjb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1RSQU5TUEFSRU5UKTsKLSAgfSBlbHNlIGlmIChpQ29sb3JUeXBlID09IENPTE9SVFlQRV9HUkFZKSB7Ci0gICAgY29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoMCkpOwotICB9IGVsc2UgaWYgKGlDb2xvclR5cGUgPT0gQ09MT1JUWVBFX1JHQikgewotICAgIGNvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoMCksCi0gICAgICAgICAgICAgICAgICAgICAgIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcigxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJvcmRlckNvbG9yKDIpKTsKLSAgfSBlbHNlIGlmIChpQ29sb3JUeXBlID09IENPTE9SVFlQRV9DTVlLKSB7Ci0gICAgY29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9DTVlLLCBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoMCksCi0gICAgICAgICAgICAgICAgICAgICAgIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcigxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJvcmRlckNvbG9yKDIpLAotICAgICAgICAgICAgICAgICAgICAgICBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoMykpOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGNvbG9yOjpDb252ZXJ0UFdMQ29sb3JUb0FycmF5KHBSdW50aW1lLCBjb2xvciwgJmNyQXJyYXkpOwotICB2cCA8PCBjckFycmF5OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0U3Ryb2tlQ29sb3IoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKSB7Ci0gIC8vIE5vdCBzdXBwb3J0ZWQuCi19Ci0KLWJvb2wgRmllbGQ6OnN0eWxlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOwotCi0gIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgIGlmICghbV9iQ2FuU2V0KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ0ZYX0J5dGVTdHJpbmcgY3NCQ2FwdGlvbjsKLSAgICB2cCA+PiBjc0JDYXB0aW9uOwotCi0gICAgaWYgKG1fYkRlbGF5KSB7Ci0gICAgICBBZGREZWxheV9TdHJpbmcoRlBfU1RZTEUsIGNzQkNhcHRpb24pOwotICAgIH0gZWxzZSB7Ci0gICAgICBGaWVsZDo6U2V0U3R5bGUobV9wRm9ybUZpbGxFbnYuR2V0KCksIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgIGNzQkNhcHRpb24pOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKLSAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOwotICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1JBRElPQlVUVE9OICYmCi0gICAgICBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfQ0hFQ0tCT1gpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgaWYgKCFwRm9ybUNvbnRyb2wpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENGWF9XaWRlU3RyaW5nIGNzV0NhcHRpb24gPSBwRm9ybUNvbnRyb2wtPkdldE5vcm1hbENhcHRpb24oKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgY3NCQ2FwdGlvbjsKLQotICBzd2l0Y2ggKGNzV0NhcHRpb25bMF0pIHsKLSAgICBjYXNlIEwnbCc6Ci0gICAgICBjc0JDYXB0aW9uID0gImNpcmNsZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEwnOCc6Ci0gICAgICBjc0JDYXB0aW9uID0gImNyb3NzIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTCd1JzoKLSAgICAgIGNzQkNhcHRpb24gPSAiZGlhbW9uZCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEwnbic6Ci0gICAgICBjc0JDYXB0aW9uID0gInNxdWFyZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEwnSCc6Ci0gICAgICBjc0JDYXB0aW9uID0gInN0YXIiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDogIC8vIEwnNCcKLSAgICAgIGNzQkNhcHRpb24gPSAiY2hlY2siOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgdnAgPDwgY3NCQ2FwdGlvbjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRmllbGQ6OlNldFN0eWxlKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKSB7Ci0gIC8vIE5vdCBzdXBwb3J0ZWQuCi19Ci0KLWJvb2wgRmllbGQ6OnN1Ym1pdE5hbWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBGaWVsZDo6dGV4dENvbG9yKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIENKU19BcnJheSBjckFycmF5OwotCi0gIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgIGlmICghbV9iQ2FuU2V0KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKCF2cC5HZXRKU1ZhbHVlKCktPklzQXJyYXlPYmplY3QoKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHZwID4+IGNyQXJyYXk7Ci0KLSAgICBDUFdMX0NvbG9yIGNvbG9yOwotICAgIGNvbG9yOjpDb252ZXJ0QXJyYXlUb1BXTENvbG9yKHBSdW50aW1lLCBjckFycmF5LCAmY29sb3IpOwotICAgIGlmIChtX2JEZWxheSkgewotICAgICAgQWRkRGVsYXlfQ29sb3IoRlBfVEVYVENPTE9SLCBjb2xvcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEZpZWxkOjpTZXRUZXh0Q29sb3IobV9wRm9ybUZpbGxFbnYuR2V0KCksIG1fRmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtX25Gb3JtQ29udHJvbEluZGV4LCBjb2xvcik7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOwotICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07Ci0gIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICBpZiAoIXBGb3JtQ29udHJvbCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW50IGlDb2xvclR5cGU7Ci0gIEZYX0FSR0IgY29sb3I7Ci0gIENQREZfRGVmYXVsdEFwcGVhcmFuY2UgRmllbGRBcHBlYXJhbmNlID0gcEZvcm1Db250cm9sLT5HZXREZWZhdWx0QXBwZWFyYW5jZSgpOwotICBGaWVsZEFwcGVhcmFuY2UuR2V0Q29sb3IoY29sb3IsIGlDb2xvclR5cGUpOwotCi0gIGludDMyX3QgYTsKLSAgaW50MzJfdCByOwotICBpbnQzMl90IGc7Ci0gIGludDMyX3QgYjsKLSAgQXJnYkRlY29kZShjb2xvciwgYSwgciwgZywgYik7Ci0KLSAgQ1BXTF9Db2xvciBjclJldCA9Ci0gICAgICBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIHIgLyAyNTUuMGYsIGcgLyAyNTUuMGYsIGIgLyAyNTUuMGYpOwotCi0gIGlmIChpQ29sb3JUeXBlID09IENPTE9SVFlQRV9UUkFOU1BBUkVOVCkKLSAgICBjclJldCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1RSQU5TUEFSRU5UKTsKLQotICBjb2xvcjo6Q29udmVydFBXTENvbG9yVG9BcnJheShwUnVudGltZSwgY3JSZXQsICZjckFycmF5KTsKLSAgdnAgPDwgY3JBcnJheTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRmllbGQ6OlNldFRleHRDb2xvcihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpIHsKLSAgLy8gTm90IHN1cHBvcnRlZC4KLX0KLQotYm9vbCBGaWVsZDo6dGV4dEZvbnQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIEFTU0VSVChtX3BGb3JtRmlsbEVudik7Ci0KLSAgaWYgKHZwLklzU2V0dGluZygpKSB7Ci0gICAgaWYgKCFtX2JDYW5TZXQpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBDRlhfQnl0ZVN0cmluZyBjc0ZvbnROYW1lOwotICAgIHZwID4+IGNzRm9udE5hbWU7Ci0gICAgaWYgKGNzRm9udE5hbWUuSXNFbXB0eSgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKG1fYkRlbGF5KSB7Ci0gICAgICBBZGREZWxheV9TdHJpbmcoRlBfVEVYVEZPTlQsIGNzRm9udE5hbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBGaWVsZDo6U2V0VGV4dEZvbnQobV9wRm9ybUZpbGxFbnYuR2V0KCksIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNzRm9udE5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKLSAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOwotICBBU1NFUlQocEZvcm1GaWVsZCk7Ci0gIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOwotICBpZiAoIXBGb3JtQ29udHJvbCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW50IG5GaWVsZFR5cGUgPSBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKLSAgaWYgKG5GaWVsZFR5cGUgIT0gRklFTERUWVBFX1BVU0hCVVRUT04gJiYgbkZpZWxkVHlwZSAhPSBGSUVMRFRZUEVfQ09NQk9CT1ggJiYKLSAgICAgIG5GaWVsZFR5cGUgIT0gRklFTERUWVBFX0xJU1RCT1ggJiYgbkZpZWxkVHlwZSAhPSBGSUVMRFRZUEVfVEVYVEZJRUxEKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIENQREZfRm9udCogcEZvbnQgPSBwRm9ybUNvbnRyb2wtPkdldERlZmF1bHRDb250cm9sRm9udCgpOwotICBpZiAoIXBGb250KQotICAgIHJldHVybiBmYWxzZTsKLQotICB2cCA8PCBwRm9udC0+R2V0QmFzZUZvbnQoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRmllbGQ6OlNldFRleHRGb250KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKSB7Ci0gIC8vIE5vdCBzdXBwb3J0ZWQuCi19Ci0KLWJvb2wgRmllbGQ6OnRleHRTaXplKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOwotCi0gIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgIGlmICghbV9iQ2FuU2V0KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaW50IG5WUDsKLSAgICB2cCA+PiBuVlA7Ci0gICAgaWYgKG1fYkRlbGF5KSB7Ci0gICAgICBBZGREZWxheV9JbnQoRlBfVEVYVFNJWkUsIG5WUCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEZpZWxkOjpTZXRUZXh0U2l6ZShtX3BGb3JtRmlsbEVudi5HZXQoKSwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgblZQKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7Ci0gIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKLSAgQVNTRVJUKHBGb3JtRmllbGQpOwotICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgaWYgKCFwRm9ybUNvbnRyb2wpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfRGVmYXVsdEFwcGVhcmFuY2UgRmllbGRBcHBlYXJhbmNlID0gcEZvcm1Db250cm9sLT5HZXREZWZhdWx0QXBwZWFyYW5jZSgpOwotCi0gIENGWF9CeXRlU3RyaW5nIGNzRm9udE5hbWVUYWc7Ci0gIEZYX0ZMT0FUIGZGb250U2l6ZTsKLSAgRmllbGRBcHBlYXJhbmNlLkdldEZvbnQoY3NGb250TmFtZVRhZywgZkZvbnRTaXplKTsKLSAgdnAgPDwgKGludClmRm9udFNpemU7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEZpZWxkOjpTZXRUZXh0U2l6ZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcikgewotICAvLyBOb3Qgc3VwcG9ydGVkLgotfQotCi1ib29sIEZpZWxkOjp0eXBlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7Ci0gIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKLSAgc3dpdGNoIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSkgewotICAgIGNhc2UgRklFTERUWVBFX1VOS05PV046Ci0gICAgICB2cCA8PCBMInVua25vd24iOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGSUVMRFRZUEVfUFVTSEJVVFRPTjoKLSAgICAgIHZwIDw8IEwiYnV0dG9uIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgotICAgICAgdnAgPDwgTCJjaGVja2JveCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZJRUxEVFlQRV9SQURJT0JVVFRPTjoKLSAgICAgIHZwIDw8IEwicmFkaW9idXR0b24iOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6Ci0gICAgICB2cCA8PCBMImNvbWJvYm94IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRklFTERUWVBFX0xJU1RCT1g6Ci0gICAgICB2cCA8PCBMImxpc3Rib3giOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGSUVMRFRZUEVfVEVYVEZJRUxEOgotICAgICAgdnAgPDwgTCJ0ZXh0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRklFTERUWVBFX1NJR05BVFVSRToKLSAgICAgIHZwIDw8IEwic2lnbmF0dXJlIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB2cCA8PCBMInVua25vd24iOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRmllbGQ6OnVzZXJOYW1lKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOwotCi0gIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgIGlmICghbV9iQ2FuU2V0KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ0ZYX1dpZGVTdHJpbmcgc3dOYW1lOwotICAgIHZwID4+IHN3TmFtZTsKLQotICAgIGlmIChtX2JEZWxheSkgewotICAgICAgQWRkRGVsYXlfV2lkZVN0cmluZyhGUF9VU0VSTkFNRSwgc3dOYW1lKTsKLSAgICB9IGVsc2UgewotICAgICAgRmllbGQ6OlNldFVzZXJOYW1lKG1fcEZvcm1GaWxsRW52LkdldCgpLCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzd05hbWUpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKLSAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdnAgPDwgRmllbGRBcnJheVswXS0+R2V0QWx0ZXJuYXRlTmFtZSgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBGaWVsZDo6U2V0VXNlck5hbWUoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcpIHsKLSAgLy8gTm90IHN1cHBvcnRlZC4KLX0KLQotYm9vbCBGaWVsZDo6dmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmICh2cC5Jc1NldHRpbmcoKSkgewotICAgIGlmICghbV9iQ2FuU2V0KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+IHN0ckFycmF5OwotICAgIGlmICh2cC5HZXRKU1ZhbHVlKCktPklzQXJyYXlPYmplY3QoKSkgewotICAgICAgQ0pTX0FycmF5IFZhbHVlQXJyYXk7Ci0gICAgICB2cC5HZXRKU1ZhbHVlKCktPkNvbnZlcnRUb0FycmF5KHBSdW50aW1lLCBWYWx1ZUFycmF5KTsKLSAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IFZhbHVlQXJyYXkuR2V0TGVuZ3RoKHBSdW50aW1lKTsgaSA8IHN6OyBpKyspIHsKLSAgICAgICAgQ0pTX1ZhbHVlIEVsZW1lbnRWYWx1ZShwUnVudGltZSk7Ci0gICAgICAgIFZhbHVlQXJyYXkuR2V0RWxlbWVudChwUnVudGltZSwgaSwgRWxlbWVudFZhbHVlKTsKLSAgICAgICAgc3RyQXJyYXkucHVzaF9iYWNrKEVsZW1lbnRWYWx1ZS5Ub0NGWFdpZGVTdHJpbmcocFJ1bnRpbWUpKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dWYWx1ZTsKLSAgICAgIHZwID4+IHN3VmFsdWU7Ci0gICAgICBzdHJBcnJheS5wdXNoX2JhY2soc3dWYWx1ZSk7Ci0gICAgfQotCi0gICAgaWYgKG1fYkRlbGF5KSB7Ci0gICAgICBBZGREZWxheV9XaWRlU3RyaW5nQXJyYXkoRlBfVkFMVUUsIHN0ckFycmF5KTsKLSAgICB9IGVsc2UgewotICAgICAgRmllbGQ6OlNldFZhbHVlKG1fcEZvcm1GaWxsRW52LkdldCgpLCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBzdHJBcnJheSk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7Ci0gIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKLSAgc3dpdGNoIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSkgewotICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6Ci0gICAgY2FzZSBGSUVMRFRZUEVfVEVYVEZJRUxEOiB7Ci0gICAgICB2cCA8PCBwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBGSUVMRFRZUEVfTElTVEJPWDogewotICAgICAgaWYgKHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpID4gMSkgewotICAgICAgICBDSlNfQXJyYXkgVmFsdWVBcnJheTsKLSAgICAgICAgQ0pTX1ZhbHVlIEVsZW1lbnRWYWx1ZShwUnVudGltZSk7Ci0gICAgICAgIGludCBpSW5kZXg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBGb3JtRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpOyBpIDwgc3o7IGkrKykgewotICAgICAgICAgIGlJbmRleCA9IHBGb3JtRmllbGQtPkdldFNlbGVjdGVkSW5kZXgoaSk7Ci0gICAgICAgICAgRWxlbWVudFZhbHVlID0KLSAgICAgICAgICAgICAgQ0pTX1ZhbHVlKHBSdW50aW1lLCBwRm9ybUZpZWxkLT5HZXRPcHRpb25WYWx1ZShpSW5kZXgpLmNfc3RyKCkpOwotICAgICAgICAgIGlmIChGWFNZU193Y3NsZW4oRWxlbWVudFZhbHVlLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSkuY19zdHIoKSkgPT0KLSAgICAgICAgICAgICAgMCkgewotICAgICAgICAgICAgRWxlbWVudFZhbHVlID0KLSAgICAgICAgICAgICAgICBDSlNfVmFsdWUocFJ1bnRpbWUsIHBGb3JtRmllbGQtPkdldE9wdGlvbkxhYmVsKGlJbmRleCkuY19zdHIoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIFZhbHVlQXJyYXkuU2V0RWxlbWVudChwUnVudGltZSwgaSwgRWxlbWVudFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICB2cCA8PCBWYWx1ZUFycmF5OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdnAgPDwgcEZvcm1GaWVsZC0+R2V0VmFsdWUoKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgotICAgIGNhc2UgRklFTERUWVBFX1JBRElPQlVUVE9OOiB7Ci0gICAgICBib29sIGJGaW5kID0gZmFsc2U7Ci0gICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGkgPCBzejsgaSsrKSB7Ci0gICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpLT5Jc0NoZWNrZWQoKSkgewotICAgICAgICAgIHZwIDw8IHBGb3JtRmllbGQtPkdldENvbnRyb2woaSktPkdldEV4cG9ydFZhbHVlKCk7Ci0gICAgICAgICAgYkZpbmQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoIWJGaW5kKQotICAgICAgICB2cCA8PCBMIk9mZiI7Ci0gICAgfSBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgdnAgPDwgcEZvcm1GaWVsZC0+R2V0VmFsdWUoKTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHZwLkdldEpTVmFsdWUoKS0+TWF5YmVDb2VyY2VUb051bWJlcihwUnVudGltZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEZpZWxkOjpTZXRWYWx1ZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+JiBzdHJBcnJheSkgewotICBBU1NFUlQocEZvcm1GaWxsRW52KTsKLSAgaWYgKHN0ckFycmF5LmVtcHR5KCkpCi0gICAgcmV0dXJuOwotCi0gIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9Ci0gICAgICBHZXRGb3JtRmllbGRzKHBGb3JtRmlsbEVudiwgc3dGaWVsZE5hbWUpOwotCi0gIGZvciAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgOiBGaWVsZEFycmF5KSB7Ci0gICAgaWYgKHBGb3JtRmllbGQtPkdldEZ1bGxOYW1lKCkuQ29tcGFyZShzd0ZpZWxkTmFtZSkgIT0gMCkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgc3dpdGNoIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSkgewotICAgICAgY2FzZSBGSUVMRFRZUEVfVEVYVEZJRUxEOgotICAgICAgY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6Ci0gICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpICE9IHN0ckFycmF5WzBdKSB7Ci0gICAgICAgICAgcEZvcm1GaWVsZC0+U2V0VmFsdWUoc3RyQXJyYXlbMF0sIHRydWUpOwotICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRm9ybUZpbGxFbnYsIHBGb3JtRmllbGQsIHRydWUsIGZhbHNlLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRklFTERUWVBFX0NIRUNLQk9YOgotICAgICAgY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046IHsKLSAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldFZhbHVlKCkgIT0gc3RyQXJyYXlbMF0pIHsKLSAgICAgICAgICBwRm9ybUZpZWxkLT5TZXRWYWx1ZShzdHJBcnJheVswXSwgdHJ1ZSk7Ci0gICAgICAgICAgVXBkYXRlRm9ybUZpZWxkKHBGb3JtRmlsbEVudiwgcEZvcm1GaWVsZCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotICAgICAgICB9Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSBGSUVMRFRZUEVfTElTVEJPWDogewotICAgICAgICBib29sIGJNb2RpZmllZCA9IGZhbHNlOwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN0ciA6IHN0ckFycmF5KSB7Ci0gICAgICAgICAgaWYgKCFwRm9ybUZpZWxkLT5Jc0l0ZW1TZWxlY3RlZChwRm9ybUZpZWxkLT5GaW5kT3B0aW9uKHN0cikpKSB7Ci0gICAgICAgICAgICBiTW9kaWZpZWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChiTW9kaWZpZWQpIHsKLSAgICAgICAgICBwRm9ybUZpZWxkLT5DbGVhclNlbGVjdGlvbih0cnVlKTsKLSAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN0ciA6IHN0ckFycmF5KSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBwRm9ybUZpZWxkLT5GaW5kT3B0aW9uKHN0cik7Ci0gICAgICAgICAgICBpZiAoIXBGb3JtRmllbGQtPklzSXRlbVNlbGVjdGVkKGluZGV4KSkKLSAgICAgICAgICAgICAgcEZvcm1GaWVsZC0+U2V0SXRlbVNlbGVjdGlvbihpbmRleCwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRm9ybUZpbGxFbnYsIHBGb3JtRmllbGQsIHRydWUsIGZhbHNlLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi1ib29sIEZpZWxkOjp2YWx1ZUFzU3RyaW5nKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7Ci0gIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKLSAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0NIRUNLQk9YKSB7Ci0gICAgaWYgKCFwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAocEZvcm1GaWVsZC0+R2V0Q29udHJvbCgwKS0+SXNDaGVja2VkKCkpCi0gICAgICB2cCA8PCBMIlllcyI7Ci0gICAgZWxzZQotICAgICAgdnAgPDwgTCJPZmYiOwotICB9IGVsc2UgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTiAmJgotICAgICAgICAgICAgICEocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX1JBRElPU0lOVU5JU09OKSkgewotICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaSA8IHN6OyBpKyspIHsKLSAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpLT5Jc0NoZWNrZWQoKSkgewotICAgICAgICB2cCA8PCBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpLT5HZXRFeHBvcnRWYWx1ZSgpLmNfc3RyKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdnAgPDwgTCJPZmYiOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfTElTVEJPWCAmJgotICAgICAgICAgICAgIChwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKSA+IDEpKSB7Ci0gICAgdnAgPDwgTCIiOwotICB9IGVsc2UgewotICAgIHZwIDw8IHBGb3JtRmllbGQtPkdldFZhbHVlKCkuY19zdHIoKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEZpZWxkOjpicm93c2VGb3JGaWxlVG9TdWJtaXQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKLSAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOwotICBpZiAoKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19GSUxFU0VMRUNUKSAmJgotICAgICAgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9URVhURklFTEQpKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWxlTmFtZSA9IG1fcEZvcm1GaWxsRW52LT5KU19maWVsZEJyb3dzZSgpOwotICAgIGlmICghd3NGaWxlTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgIHBGb3JtRmllbGQtPlNldFZhbHVlKHdzRmlsZU5hbWUpOwotICAgICAgVXBkYXRlRm9ybUZpZWxkKG1fcEZvcm1GaWxsRW52LkdldCgpLCBwRm9ybUZpZWxkLCB0cnVlLCB0cnVlLCB0cnVlKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEZpZWxkOjpidXR0b25HZXRDYXB0aW9uKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaW50IG5mYWNlID0gMDsKLSAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKLSAgaWYgKGlTaXplID49IDEpCi0gICAgbmZhY2UgPSBwYXJhbXNbMF0uVG9JbnQocFJ1bnRpbWUpOwotCi0gIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOwotICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07Ci0gIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGSUVMRFRZUEVfUFVTSEJVVFRPTikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7Ci0gIGlmICghcEZvcm1Db250cm9sKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAobmZhY2UgPT0gMCkKLSAgICB2UmV0ID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCBwRm9ybUNvbnRyb2wtPkdldE5vcm1hbENhcHRpb24oKS5jX3N0cigpKTsKLSAgZWxzZSBpZiAobmZhY2UgPT0gMSkKLSAgICB2UmV0ID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCBwRm9ybUNvbnRyb2wtPkdldERvd25DYXB0aW9uKCkuY19zdHIoKSk7Ci0gIGVsc2UgaWYgKG5mYWNlID09IDIpCi0gICAgdlJldCA9IENKU19WYWx1ZShwUnVudGltZSwgcEZvcm1Db250cm9sLT5HZXRSb2xsb3ZlckNhcHRpb24oKS5jX3N0cigpKTsKLSAgZWxzZQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBGaWVsZDo6YnV0dG9uR2V0SWNvbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmIChwYXJhbXMuc2l6ZSgpID49IDEpIHsKLSAgICBpbnQgbkZhY2UgPSBwYXJhbXNbMF0uVG9JbnQocFJ1bnRpbWUpOwotICAgIGlmIChuRmFjZSA8IDAgfHwgbkZhY2UgPiAyKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7Ci0gIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKLSAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9QVVNIQlVUVE9OKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKLSAgaWYgKCFwRm9ybUNvbnRyb2wpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqID0KLSAgICAgIHBSdW50aW1lLT5OZXdGeER5bmFtaWNPYmooQ0pTX0ljb246Omdfbk9iakRlZm5JRCk7Ci0gIGlmIChwT2JqLklzRW1wdHkoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ0pTX0ljb24qIHBKU19JY29uID0gc3RhdGljX2Nhc3Q8Q0pTX0ljb24qPihwUnVudGltZS0+R2V0T2JqZWN0UHJpdmF0ZShwT2JqKSk7Ci0gIHZSZXQgPSBDSlNfVmFsdWUocFJ1bnRpbWUsIHBKU19JY29uKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRmllbGQ6OmJ1dHRvbkltcG9ydEljb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBGaWVsZDo6YnV0dG9uU2V0Q2FwdGlvbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBGaWVsZDo6YnV0dG9uU2V0SWNvbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBGaWVsZDo6Y2hlY2tUaGlzQm94KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKLSAgaWYgKGlTaXplIDwgMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFtX2JDYW5TZXQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGludCBuV2lkZ2V0ID0gcGFyYW1zWzBdLlRvSW50KHBSdW50aW1lKTsKLSAgYm9vbCBiQ2hlY2tpdCA9IHRydWU7Ci0gIGlmIChpU2l6ZSA+PSAyKQotICAgIGJDaGVja2l0ID0gcGFyYW1zWzFdLlRvQm9vbChwUnVudGltZSk7Ci0KLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7Ci0gIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKLSAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZJRUxEVFlQRV9DSEVDS0JPWCAmJgotICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRklFTERUWVBFX1JBRElPQlVUVE9OKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKG5XaWRnZXQgPCAwIHx8IG5XaWRnZXQgPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKQotICAgIHJldHVybiBmYWxzZTsKLSAgLy8gVE9ETyh3ZWlsaSk6IENoZWNrIHdoZXRoZXIgYW55dGhpbmcgc3BlY2lhbCBuZWVkZWQgZm9yIHJhZGlvIGJ1dHRvbiwKLSAgLy8gb3RoZXJ3aXNlIG1lcmdlIHRoZXNlIGJyYW5jaGVzLgotICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX1JBRElPQlVUVE9OKQotICAgIHBGb3JtRmllbGQtPkNoZWNrQ29udHJvbChuV2lkZ2V0LCBiQ2hlY2tpdCwgdHJ1ZSk7Ci0gIGVsc2UKLSAgICBwRm9ybUZpZWxkLT5DaGVja0NvbnRyb2wobldpZGdldCwgYkNoZWNraXQsIHRydWUpOwotCi0gIFVwZGF0ZUZvcm1GaWVsZChtX3BGb3JtRmlsbEVudi5HZXQoKSwgcEZvcm1GaWVsZCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEZpZWxkOjpjbGVhckl0ZW1zKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRmllbGQ6OmRlZmF1bHRJc0NoZWNrZWQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAoIW1fYkNhblNldCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKLSAgaWYgKGlTaXplIDwgMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW50IG5XaWRnZXQgPSBwYXJhbXNbMF0uVG9JbnQocFJ1bnRpbWUpOwotICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKLSAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOwotICBpZiAobldpZGdldCA8IDAgfHwgbldpZGdldCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHZSZXQgPSBDSlNfVmFsdWUocFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0NIRUNLQk9YIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRmllbGQ6OmRlbGV0ZUl0ZW1BdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEZpZWxkOjpnZXRBcnJheShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOwotICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1dpZGVTdHJpbmc+PiBzd1NvcnQ7Ci0gIGZvciAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgOiBGaWVsZEFycmF5KSB7Ci0gICAgc3dTb3J0LnB1c2hfYmFjayhzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1dpZGVTdHJpbmc+KAotICAgICAgICBuZXcgQ0ZYX1dpZGVTdHJpbmcocEZvcm1GaWVsZC0+R2V0RnVsbE5hbWUoKSkpKTsKLSAgfQotCi0gIHN0ZDo6c29ydCgKLSAgICAgIHN3U29ydC5iZWdpbigpLCBzd1NvcnQuZW5kKCksCi0gICAgICBbXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1dpZGVTdHJpbmc+JiBwMSwKLSAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDRlhfV2lkZVN0cmluZz4mIHAyKSB7IHJldHVybiAqcDEgPCAqcDI7IH0pOwotCi0gIENKU19BcnJheSBGb3JtRmllbGRBcnJheTsKLQotICBpbnQgaiA9IDA7Ci0gIGZvciAoY29uc3QgYXV0byYgcFN0ciA6IHN3U29ydCkgewotICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqID0KLSAgICAgICAgcFJ1bnRpbWUtPk5ld0Z4RHluYW1pY09iaihDSlNfRmllbGQ6Omdfbk9iakRlZm5JRCk7Ci0gICAgaWYgKHBPYmouSXNFbXB0eSgpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ0pTX0ZpZWxkKiBwSlNGaWVsZCA9Ci0gICAgICAgIHN0YXRpY19jYXN0PENKU19GaWVsZCo+KHBSdW50aW1lLT5HZXRPYmplY3RQcml2YXRlKHBPYmopKTsKLSAgICBGaWVsZCogcEZpZWxkID0gc3RhdGljX2Nhc3Q8RmllbGQqPihwSlNGaWVsZC0+R2V0RW1iZWRPYmplY3QoKSk7Ci0gICAgcEZpZWxkLT5BdHRhY2hGaWVsZChtX3BKU0RvYywgKnBTdHIpOwotICAgIEZvcm1GaWVsZEFycmF5LlNldEVsZW1lbnQocFJ1bnRpbWUsIGorKywgQ0pTX1ZhbHVlKHBSdW50aW1lLCBwSlNGaWVsZCkpOwotICB9Ci0KLSAgdlJldCA9IENKU19WYWx1ZShwUnVudGltZSwgRm9ybUZpZWxkQXJyYXkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBGaWVsZDo6Z2V0SXRlbUF0KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKLSAgaW50IG5JZHggPSAtMTsKLSAgaWYgKGlTaXplID49IDEpCi0gICAgbklkeCA9IHBhcmFtc1swXS5Ub0ludChwUnVudGltZSk7Ci0KLSAgYm9vbCBiRXhwb3J0ID0gdHJ1ZTsKLSAgaWYgKGlTaXplID49IDIpCi0gICAgYkV4cG9ydCA9IHBhcmFtc1sxXS5Ub0Jvb2wocFJ1bnRpbWUpOwotCi0gIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOwotICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07Ci0gIGlmICgocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0xJU1RCT1gpIHx8Ci0gICAgICAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0NPTUJPQk9YKSkgewotICAgIGlmIChuSWR4ID09IC0xIHx8IG5JZHggPiBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKSkKLSAgICAgIG5JZHggPSBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKSAtIDE7Ci0gICAgaWYgKGJFeHBvcnQpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHN0cnZhbCA9IHBGb3JtRmllbGQtPkdldE9wdGlvblZhbHVlKG5JZHgpOwotICAgICAgaWYgKHN0cnZhbC5Jc0VtcHR5KCkpCi0gICAgICAgIHZSZXQgPSBDSlNfVmFsdWUocFJ1bnRpbWUsIHBGb3JtRmllbGQtPkdldE9wdGlvbkxhYmVsKG5JZHgpLmNfc3RyKCkpOwotICAgICAgZWxzZQotICAgICAgICB2UmV0ID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCBzdHJ2YWwuY19zdHIoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZSZXQgPSBDSlNfVmFsdWUocFJ1bnRpbWUsIHBGb3JtRmllbGQtPkdldE9wdGlvbkxhYmVsKG5JZHgpLmNfc3RyKCkpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBGaWVsZDo6Z2V0TG9jayhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBGaWVsZDo6aW5zZXJ0SXRlbUF0KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRmllbGQ6OmlzQm94Q2hlY2tlZChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGludCBuSW5kZXggPSAtMTsKLSAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMSkKLSAgICBuSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQocFJ1bnRpbWUpOwotCi0gIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOwotICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07Ci0gIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB2UmV0ID0gQ0pTX1ZhbHVlKHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICgocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRklFTERUWVBFX0NIRUNLQk9YIHx8Ci0gICAgICAgICAgICAgICAgICAgICBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfUkFESU9CVVRUT04pICYmCi0gICAgICAgICAgICAgICAgICAgIHBGb3JtRmllbGQtPkdldENvbnRyb2wobkluZGV4KS0+SXNDaGVja2VkKCkgIT0gMCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBGaWVsZDo6aXNEZWZhdWx0Q2hlY2tlZChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGludCBuSW5kZXggPSAtMTsKLSAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMSkKLSAgICBuSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQocFJ1bnRpbWUpOwotCi0gIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOwotICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07Ci0gIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHZSZXQgPSBDSlNfVmFsdWUocFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgKChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGSUVMRFRZUEVfQ0hFQ0tCT1ggfHwKLSAgICAgICAgICAgICAgICAgICAgIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZJRUxEVFlQRV9SQURJT0JVVFRPTikgJiYKLSAgICAgICAgICAgICAgICAgICAgcEZvcm1GaWVsZC0+R2V0Q29udHJvbChuSW5kZXgpLT5Jc0RlZmF1bHRDaGVja2VkKCkgIT0gMCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBGaWVsZDo6c2V0QWN0aW9uKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRmllbGQ6OnNldEZvY3VzKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7Ci0gIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKLSAgaW50MzJfdCBuQ291bnQgPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7Ci0gIGlmIChuQ291bnQgPCAxKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IG1fcEZvcm1GaWxsRW52LT5HZXRJbnRlckZvcm0oKTsKLSAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBudWxscHRyOwotICBpZiAobkNvdW50ID09IDEpIHsKLSAgICBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KHBGb3JtRmllbGQtPkdldENvbnRyb2woMCkpOwotICB9IGVsc2UgewotICAgIFVuZGVybHlpbmdQYWdlVHlwZSogcFBhZ2UgPQotICAgICAgICBVbmRlcmx5aW5nRnJvbUZQREZQYWdlKG1fcEZvcm1GaWxsRW52LT5HZXRDdXJyZW50UGFnZSgKLSAgICAgICAgICAgIG1fcEZvcm1GaWxsRW52LT5HZXRVbmRlcmx5aW5nRG9jdW1lbnQoKSkpOwotICAgIGlmICghcFBhZ2UpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKENQREZTREtfUGFnZVZpZXcqIHBDdXJQYWdlVmlldyA9Ci0gICAgICAgICAgICBtX3BGb3JtRmlsbEVudi0+R2V0UGFnZVZpZXcocFBhZ2UsIHRydWUpKSB7Ci0gICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgewotICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBUZW1wV2lkZ2V0ID0KLSAgICAgICAgICAgICAgICBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKSkpIHsKLSAgICAgICAgICBpZiAocFRlbXBXaWRnZXQtPkdldFBERlBhZ2UoKSA9PSBwQ3VyUGFnZVZpZXctPkdldFBERlBhZ2UoKSkgewotICAgICAgICAgICAgcFdpZGdldCA9IHBUZW1wV2lkZ2V0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKHBXaWRnZXQpIHsKLSAgICBDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciBwT2JzZXJ2ZWQocFdpZGdldCk7Ci0gICAgbV9wRm9ybUZpbGxFbnYtPlNldEZvY3VzQW5ub3QoJnBPYnNlcnZlZCk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBGaWVsZDo6c2V0SXRlbXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBGaWVsZDo6c2V0TG9jayhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBGaWVsZDo6c2lnbmF0dXJlR2V0TW9kaWZpY2F0aW9ucyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBGaWVsZDo6c2lnbmF0dXJlR2V0U2VlZFZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEZpZWxkOjpzaWduYXR1cmVJbmZvKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEZpZWxkOjpzaWduYXR1cmVTZXRTZWVkVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgRmllbGQ6OnNpZ25hdHVyZVNpZ24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgRmllbGQ6OnNpZ25hdHVyZVZhbGlkYXRlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEZpZWxkOjpzb3VyY2UoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHZwLklzR2V0dGluZygpKSB7Ci0gICAgdnAgPDwgKENKU19PYmplY3QqKW51bGxwdHI7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBGaWVsZDo6QWRkRGVsYXlfSW50KEZJRUxEX1BST1AgcHJvcCwgaW50MzJfdCBuKSB7Ci0gIENKU19EZWxheURhdGEqIHBOZXdEYXRhID0KLSAgICAgIG5ldyBDSlNfRGVsYXlEYXRhKHByb3AsIG1fbkZvcm1Db250cm9sSW5kZXgsIG1fRmllbGROYW1lKTsKLSAgcE5ld0RhdGEtPm51bSA9IG47Ci0gIG1fcEpTRG9jLT5BZGREZWxheURhdGEocE5ld0RhdGEpOwotfQotCi12b2lkIEZpZWxkOjpBZGREZWxheV9Cb29sKEZJRUxEX1BST1AgcHJvcCwgYm9vbCBiKSB7Ci0gIENKU19EZWxheURhdGEqIHBOZXdEYXRhID0KLSAgICAgIG5ldyBDSlNfRGVsYXlEYXRhKHByb3AsIG1fbkZvcm1Db250cm9sSW5kZXgsIG1fRmllbGROYW1lKTsKLSAgcE5ld0RhdGEtPmIgPSBiOwotICBtX3BKU0RvYy0+QWRkRGVsYXlEYXRhKHBOZXdEYXRhKTsKLX0KLQotdm9pZCBGaWVsZDo6QWRkRGVsYXlfU3RyaW5nKEZJRUxEX1BST1AgcHJvcCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZykgewotICBDSlNfRGVsYXlEYXRhKiBwTmV3RGF0YSA9Ci0gICAgICBuZXcgQ0pTX0RlbGF5RGF0YShwcm9wLCBtX25Gb3JtQ29udHJvbEluZGV4LCBtX0ZpZWxkTmFtZSk7Ci0gIHBOZXdEYXRhLT5zdHJpbmcgPSBzdHJpbmc7Ci0gIG1fcEpTRG9jLT5BZGREZWxheURhdGEocE5ld0RhdGEpOwotfQotCi12b2lkIEZpZWxkOjpBZGREZWxheV9XaWRlU3RyaW5nKEZJRUxEX1BST1AgcHJvcCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZykgewotICBDSlNfRGVsYXlEYXRhKiBwTmV3RGF0YSA9Ci0gICAgICBuZXcgQ0pTX0RlbGF5RGF0YShwcm9wLCBtX25Gb3JtQ29udHJvbEluZGV4LCBtX0ZpZWxkTmFtZSk7Ci0gIHBOZXdEYXRhLT53aWRlc3RyaW5nID0gc3RyaW5nOwotICBtX3BKU0RvYy0+QWRkRGVsYXlEYXRhKHBOZXdEYXRhKTsKLX0KLQotdm9pZCBGaWVsZDo6QWRkRGVsYXlfUmVjdChGSUVMRF9QUk9QIHByb3AsIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIHsKLSAgQ0pTX0RlbGF5RGF0YSogcE5ld0RhdGEgPQotICAgICAgbmV3IENKU19EZWxheURhdGEocHJvcCwgbV9uRm9ybUNvbnRyb2xJbmRleCwgbV9GaWVsZE5hbWUpOwotICBwTmV3RGF0YS0+cmVjdCA9IHJlY3Q7Ci0gIG1fcEpTRG9jLT5BZGREZWxheURhdGEocE5ld0RhdGEpOwotfQotCi12b2lkIEZpZWxkOjpBZGREZWxheV9Db2xvcihGSUVMRF9QUk9QIHByb3AsIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKSB7Ci0gIENKU19EZWxheURhdGEqIHBOZXdEYXRhID0KLSAgICAgIG5ldyBDSlNfRGVsYXlEYXRhKHByb3AsIG1fbkZvcm1Db250cm9sSW5kZXgsIG1fRmllbGROYW1lKTsKLSAgcE5ld0RhdGEtPmNvbG9yID0gY29sb3I7Ci0gIG1fcEpTRG9jLT5BZGREZWxheURhdGEocE5ld0RhdGEpOwotfQotCi12b2lkIEZpZWxkOjpBZGREZWxheV9Xb3JkQXJyYXkoRklFTERfUFJPUCBwcm9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYXJyYXkpIHsKLSAgQ0pTX0RlbGF5RGF0YSogcE5ld0RhdGEgPQotICAgICAgbmV3IENKU19EZWxheURhdGEocHJvcCwgbV9uRm9ybUNvbnRyb2xJbmRleCwgbV9GaWVsZE5hbWUpOwotICBwTmV3RGF0YS0+d29yZGFycmF5ID0gYXJyYXk7Ci0gIG1fcEpTRG9jLT5BZGREZWxheURhdGEocE5ld0RhdGEpOwotfQotCi12b2lkIEZpZWxkOjpBZGREZWxheV9XaWRlU3RyaW5nQXJyYXkoRklFTERfUFJPUCBwcm9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nPiYgYXJyYXkpIHsKLSAgQ0pTX0RlbGF5RGF0YSogcE5ld0RhdGEgPQotICAgICAgbmV3IENKU19EZWxheURhdGEocHJvcCwgbV9uRm9ybUNvbnRyb2xJbmRleCwgbV9GaWVsZE5hbWUpOwotICBwTmV3RGF0YS0+d2lkZXN0cmluZ2FycmF5ID0gYXJyYXk7Ci0gIG1fcEpTRG9jLT5BZGREZWxheURhdGEocE5ld0RhdGEpOwotfQotCi12b2lkIEZpZWxkOjpEb0RlbGF5KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICBDSlNfRGVsYXlEYXRhKiBwRGF0YSkgewotICBBU1NFUlQocEZvcm1GaWxsRW52KTsKLSAgc3dpdGNoIChwRGF0YS0+ZVByb3ApIHsKLSAgICBjYXNlIEZQX0FMSUdOTUVOVDoKLSAgICAgIEZpZWxkOjpTZXRBbGlnbm1lbnQocEZvcm1GaWxsRW52LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5zdHJpbmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUF9CT1JERVJTVFlMRToKLSAgICAgIEZpZWxkOjpTZXRCb3JkZXJTdHlsZShwRm9ybUZpbGxFbnYsIHBEYXRhLT5zRmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+c3RyaW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlBfQlVUVE9OQUxJR05YOgotICAgICAgRmllbGQ6OlNldEJ1dHRvbkFsaWduWChwRm9ybUZpbGxFbnYsIHBEYXRhLT5zRmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPm51bSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZQX0JVVFRPTkFMSUdOWToKLSAgICAgIEZpZWxkOjpTZXRCdXR0b25BbGlnblkocEZvcm1GaWxsRW52LCBwRGF0YS0+c0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5udW0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUF9CVVRUT05GSVRCT1VORFM6Ci0gICAgICBGaWVsZDo6U2V0QnV0dG9uRml0Qm91bmRzKHBGb3JtRmlsbEVudiwgcERhdGEtPnNGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+Yik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZQX0JVVFRPTlBPU0lUSU9OOgotICAgICAgRmllbGQ6OlNldEJ1dHRvblBvc2l0aW9uKHBGb3JtRmlsbEVudiwgcERhdGEtPnNGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5udW0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUF9CVVRUT05TQ0FMRUhPVzoKLSAgICAgIEZpZWxkOjpTZXRCdXR0b25TY2FsZUhvdyhwRm9ybUZpbGxFbnYsIHBEYXRhLT5zRmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+bnVtKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlBfQlVUVE9OU0NBTEVXSEVOOgotICAgICAgRmllbGQ6OlNldEJ1dHRvblNjYWxlV2hlbihwRm9ybUZpbGxFbnYsIHBEYXRhLT5zRmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPm51bSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZQX0NBTENPUkRFUklOREVYOgotICAgICAgRmllbGQ6OlNldENhbGNPcmRlckluZGV4KHBGb3JtRmlsbEVudiwgcERhdGEtPnNGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5udW0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUF9DSEFSTElNSVQ6Ci0gICAgICBGaWVsZDo6U2V0Q2hhckxpbWl0KHBGb3JtRmlsbEVudiwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+bnVtKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlBfQ09NQjoKLSAgICAgIEZpZWxkOjpTZXRDb21iKHBGb3JtRmlsbEVudiwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUF9DT01NSVRPTlNFTENIQU5HRToKLSAgICAgIEZpZWxkOjpTZXRDb21taXRPblNlbENoYW5nZShwRm9ybUZpbGxFbnYsIHBEYXRhLT5zRmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+Yik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZQX0NVUlJFTlRWQUxVRUlORElDRVM6Ci0gICAgICBGaWVsZDo6U2V0Q3VycmVudFZhbHVlSW5kaWNlcyhwRm9ybUZpbGxFbnYsIHBEYXRhLT5zRmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT53b3JkYXJyYXkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUF9ERUZBVUxUVkFMVUU6Ci0gICAgICBGaWVsZDo6U2V0RGVmYXVsdFZhbHVlKHBGb3JtRmlsbEVudiwgcERhdGEtPnNGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+d2lkZXN0cmluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZQX0RPTk9UU0NST0xMOgotICAgICAgRmllbGQ6OlNldERvTm90U2Nyb2xsKHBGb3JtRmlsbEVudiwgcERhdGEtPnNGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlBfRElTUExBWToKLSAgICAgIEZpZWxkOjpTZXREaXNwbGF5KHBGb3JtRmlsbEVudiwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPm51bSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZQX0ZJTExDT0xPUjoKLSAgICAgIEZpZWxkOjpTZXRGaWxsQ29sb3IocEZvcm1GaWxsRW52LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5jb2xvcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZQX0hJRERFTjoKLSAgICAgIEZpZWxkOjpTZXRIaWRkZW4ocEZvcm1GaWxsRW52LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlBfSElHSExJR0hUOgotICAgICAgRmllbGQ6OlNldEhpZ2hsaWdodChwRm9ybUZpbGxFbnYsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPnN0cmluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZQX0xJTkVXSURUSDoKLSAgICAgIEZpZWxkOjpTZXRMaW5lV2lkdGgocEZvcm1GaWxsRW52LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5udW0pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUF9NVUxUSUxJTkU6Ci0gICAgICBGaWVsZDo6U2V0TXVsdGlsaW5lKHBGb3JtRmlsbEVudiwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+Yik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZQX01VTFRJUExFU0VMRUNUSU9OOgotICAgICAgRmllbGQ6OlNldE11bHRpcGxlU2VsZWN0aW9uKHBGb3JtRmlsbEVudiwgcERhdGEtPnNGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlBfUEFTU1dPUkQ6Ci0gICAgICBGaWVsZDo6U2V0UGFzc3dvcmQocEZvcm1GaWxsRW52LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUF9SRUNUOgotICAgICAgRmllbGQ6OlNldFJlY3QocEZvcm1GaWxsRW52LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICBwRGF0YS0+cmVjdCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZQX1JJQ0hURVhUOgotICAgICAgLy8gTm90IHN1cHBvcnRlZC4KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlBfUklDSFZBTFVFOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUF9ST1RBVElPTjoKLSAgICAgIEZpZWxkOjpTZXRSb3RhdGlvbihwRm9ybUZpbGxFbnYsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+bnVtKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlBfU1RST0tFQ09MT1I6Ci0gICAgICBGaWVsZDo6U2V0U3Ryb2tlQ29sb3IocEZvcm1GaWxsRW52LCBwRGF0YS0+c0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+bkNvbnRyb2xJbmRleCwgcERhdGEtPmNvbG9yKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlBfU1RZTEU6Ci0gICAgICBGaWVsZDo6U2V0U3R5bGUocEZvcm1GaWxsRW52LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgcERhdGEtPnN0cmluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZQX1RFWFRDT0xPUjoKLSAgICAgIEZpZWxkOjpTZXRUZXh0Q29sb3IocEZvcm1GaWxsRW52LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5jb2xvcik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZQX1RFWFRGT05UOgotICAgICAgRmllbGQ6OlNldFRleHRGb250KHBGb3JtRmlsbEVudiwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5zdHJpbmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUF9URVhUU0laRToKLSAgICAgIEZpZWxkOjpTZXRUZXh0U2l6ZShwRm9ybUZpbGxFbnYsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+bnVtKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlBfVVNFUk5BTUU6Ci0gICAgICBGaWVsZDo6U2V0VXNlck5hbWUocEZvcm1GaWxsRW52LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPndpZGVzdHJpbmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGUF9WQUxVRToKLSAgICAgIEZpZWxkOjpTZXRWYWx1ZShwRm9ybUZpbGxFbnYsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+d2lkZXN0cmluZ2FycmF5KTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgRmllbGQ6OkFkZEZpZWxkKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgaW50IG5QYWdlSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgbkZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjQ29vcmRzKSB7Ci0gIC8vIE5vdCBzdXBwb3J0ZWQuCi19CmRpZmYgLS1naXQgYS9mcGRmc2RrL2phdmFzY3JpcHQvRmllbGQuaCBiL2ZwZGZzZGsvamF2YXNjcmlwdC9GaWVsZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjJjMTI3Li4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvamF2YXNjcmlwdC9GaWVsZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTk4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGUERGU0RLX0pBVkFTQ1JJUFRfRklFTERfSF8KLSNkZWZpbmUgRlBERlNES19KQVZBU0NSSVBUX0ZJRUxEX0hfCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfb2JzZXJ2YWJsZS5oIgotI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19mb3JtZmlsbGVudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9XbmQuaCIgIC8vIEZvciBDUFdMX0NvbG9yLgotCi1jbGFzcyBDUERGU0RLX1dpZGdldDsKLWNsYXNzIERvY3VtZW50OwotCi1lbnVtIEZJRUxEX1BST1AgewotICBGUF9BTElHTk1FTlQsCi0gIEZQX0JPUkRFUlNUWUxFLAotICBGUF9CVVRUT05BTElHTlgsCi0gIEZQX0JVVFRPTkFMSUdOWSwKLSAgRlBfQlVUVE9ORklUQk9VTkRTLAotICBGUF9CVVRUT05QT1NJVElPTiwKLSAgRlBfQlVUVE9OU0NBTEVIT1csCi0gIEZQX0JVVFRPTlNDQUxFV0hFTiwKLSAgRlBfQ0FMQ09SREVSSU5ERVgsCi0gIEZQX0NIQVJMSU1JVCwKLSAgRlBfQ09NQiwKLSAgRlBfQ09NTUlUT05TRUxDSEFOR0UsCi0gIEZQX0NVUlJFTlRWQUxVRUlORElDRVMsCi0gIEZQX0RFRkFVTFRWQUxVRSwKLSAgRlBfRE9OT1RTQ1JPTEwsCi0gIEZQX0RJU1BMQVksCi0gIEZQX0ZJTExDT0xPUiwKLSAgRlBfSElEREVOLAotICBGUF9ISUdITElHSFQsCi0gIEZQX0xJTkVXSURUSCwKLSAgRlBfTVVMVElMSU5FLAotICBGUF9NVUxUSVBMRVNFTEVDVElPTiwKLSAgRlBfUEFTU1dPUkQsCi0gIEZQX1JFQ1QsCi0gIEZQX1JJQ0hURVhULAotICBGUF9SSUNIVkFMVUUsCi0gIEZQX1JPVEFUSU9OLAotICBGUF9TVFJPS0VDT0xPUiwKLSAgRlBfU1RZTEUsCi0gIEZQX1RFWFRDT0xPUiwKLSAgRlBfVEVYVEZPTlQsCi0gIEZQX1RFWFRTSVpFLAotICBGUF9VU0VSTkFNRSwKLSAgRlBfVkFMVUUKLX07Ci0KLXN0cnVjdCBDSlNfRGVsYXlEYXRhIHsKLSAgQ0pTX0RlbGF5RGF0YShGSUVMRF9QUk9QIHByb3AsIGludCBpZHgsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBuYW1lKTsKLSAgfkNKU19EZWxheURhdGEoKTsKLQotICBGSUVMRF9QUk9QIGVQcm9wOwotICBpbnQgbkNvbnRyb2xJbmRleDsKLSAgQ0ZYX1dpZGVTdHJpbmcgc0ZpZWxkTmFtZTsKLSAgaW50MzJfdCBudW07Ci0gIGJvb2wgYjsKLSAgQ0ZYX0J5dGVTdHJpbmcgc3RyaW5nOwotICBDRlhfV2lkZVN0cmluZyB3aWRlc3RyaW5nOwotICBDRlhfRmxvYXRSZWN0IHJlY3Q7Ci0gIENQV0xfQ29sb3IgY29sb3I7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiB3b3JkYXJyYXk7Ci0gIHN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nPiB3aWRlc3RyaW5nYXJyYXk7Ci19OwotCi1jbGFzcyBGaWVsZCA6IHB1YmxpYyBDSlNfRW1iZWRPYmogewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRmllbGQoQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKLSAgfkZpZWxkKCkgb3ZlcnJpZGU7Ci0KLSAgYm9vbCBhbGlnbm1lbnQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgYm9yZGVyU3R5bGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGJ1dHRvbkFsaWduWChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBidXR0b25BbGlnblkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgYnV0dG9uRml0Qm91bmRzKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGJ1dHRvblBvc2l0aW9uKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBidXR0b25TY2FsZUhvdyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgYnV0dG9uU2NhbGVXaGVuKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGNhbGNPcmRlckluZGV4KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBjaGFyTGltaXQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgY29tYihDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBjb21taXRPblNlbENoYW5nZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgY3VycmVudFZhbHVlSW5kaWNlcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGRlZmF1bHRTdHlsZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBkZWZhdWx0VmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgZG9Ob3RTY3JvbGwoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGRvTm90U3BlbGxDaGVjayhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBkZWxheShDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBkaXNwbGF5KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgZG9jKENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGVkaXRhYmxlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBleHBvcnRWYWx1ZXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgZmlsZVNlbGVjdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGZpbGxDb2xvcihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBoaWRkZW4oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgaGlnaGxpZ2h0KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGxpbmVXaWR0aChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBtdWx0aWxpbmUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgbXVsdGlwbGVTZWxlY3Rpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIG5hbWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgbnVtSXRlbXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHBhZ2UoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgcGFzc3dvcmQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHByaW50KENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHJhZGlvc0luVW5pc29uKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCByZWFkb25seShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgcmVjdChDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCByZXF1aXJlZChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgcmljaFRleHQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHJpY2hWYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCByb3RhdGlvbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgc3Ryb2tlQ29sb3IoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHN0eWxlKENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHN1Ym1pdE5hbWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCB0ZXh0Q29sb3IoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgdGV4dEZvbnQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHRleHRTaXplKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCB0eXBlKENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHVzZXJOYW1lKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCB2YWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCB2YWx1ZUFzU3RyaW5nKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgc291cmNlKENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCi0gIGJvb2wgYnJvd3NlRm9yRmlsZVRvU3VibWl0KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGJ1dHRvbkdldENhcHRpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgYnV0dG9uR2V0SWNvbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBidXR0b25JbXBvcnRJY29uKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGJ1dHRvblNldENhcHRpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgYnV0dG9uU2V0SWNvbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBjaGVja1RoaXNCb3goQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgY2xlYXJJdGVtcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBkZWZhdWx0SXNDaGVja2VkKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGRlbGV0ZUl0ZW1BdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBnZXRBcnJheShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBnZXRJdGVtQXQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgZ2V0TG9jayhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBpbnNlcnRJdGVtQXQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgaXNCb3hDaGVja2VkKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGlzRGVmYXVsdENoZWNrZWQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgc2V0QWN0aW9uKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHNldEZvY3VzKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHNldEl0ZW1zKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHNldExvY2soQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgc2lnbmF0dXJlR2V0TW9kaWZpY2F0aW9ucyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBzaWduYXR1cmVHZXRTZWVkVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgc2lnbmF0dXJlSW5mbyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBzaWduYXR1cmVTZXRTZWVkVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgc2lnbmF0dXJlU2lnbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBzaWduYXR1cmVWYWxpZGF0ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQotICBzdGF0aWMgdm9pZCBTZXRBbGlnbm1lbnQoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpOwotICBzdGF0aWMgdm9pZCBTZXRCb3JkZXJTdHlsZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cmluZyk7Ci0gIHN0YXRpYyB2b2lkIFNldEJ1dHRvbkFsaWduWChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcik7Ci0gIHN0YXRpYyB2b2lkIFNldEJ1dHRvbkFsaWduWShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcik7Ci0gIHN0YXRpYyB2b2lkIFNldEJ1dHRvbkZpdEJvdW5kcyhDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiKTsKLSAgc3RhdGljIHZvaWQgU2V0QnV0dG9uUG9zaXRpb24oQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpOwotICBzdGF0aWMgdm9pZCBTZXRCdXR0b25TY2FsZUhvdyhDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcik7Ci0gIHN0YXRpYyB2b2lkIFNldEJ1dHRvblNjYWxlV2hlbihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcik7Ci0gIHN0YXRpYyB2b2lkIFNldENhbGNPcmRlckluZGV4KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKTsKLSAgc3RhdGljIHZvaWQgU2V0Q2hhckxpbWl0KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKTsKLSAgc3RhdGljIHZvaWQgU2V0Q29tYihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCBiKTsKLSAgc3RhdGljIHZvaWQgU2V0Q29tbWl0T25TZWxDaGFuZ2UoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYik7Ci0gIHN0YXRpYyB2b2lkIFNldEN1cnJlbnRWYWx1ZUluZGljZXMoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYXJyYXkpOwotICBzdGF0aWMgdm9pZCBTZXREZWZhdWx0U3R5bGUoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCk7Ci0gIHN0YXRpYyB2b2lkIFNldERlZmF1bHRWYWx1ZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZyk7Ci0gIHN0YXRpYyB2b2lkIFNldERvTm90U2Nyb2xsKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGIpOwotICBzdGF0aWMgdm9pZCBTZXREaXNwbGF5KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKTsKLSAgc3RhdGljIHZvaWQgU2V0RmlsbENvbG9yKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7Ci0gIHN0YXRpYyB2b2lkIFNldEhpZGRlbihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiKTsKLSAgc3RhdGljIHZvaWQgU2V0SGlnaGxpZ2h0KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKTsKLSAgc3RhdGljIHZvaWQgU2V0TGluZVdpZHRoKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKTsKLSAgc3RhdGljIHZvaWQgU2V0TXVsdGlsaW5lKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGIpOwotICBzdGF0aWMgdm9pZCBTZXRNdWx0aXBsZVNlbGVjdGlvbihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiKTsKLSAgc3RhdGljIHZvaWQgU2V0UGFzc3dvcmQoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYik7Ci0gIHN0YXRpYyB2b2lkIFNldFJlY3QoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpOwotICBzdGF0aWMgdm9pZCBTZXRSb3RhdGlvbihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcik7Ci0gIHN0YXRpYyB2b2lkIFNldFN0cm9rZUNvbG9yKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7Ci0gIHN0YXRpYyB2b2lkIFNldFN0eWxlKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKTsKLSAgc3RhdGljIHZvaWQgU2V0VGV4dENvbG9yKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7Ci0gIHN0YXRpYyB2b2lkIFNldFRleHRGb250KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyaW5nKTsKLSAgc3RhdGljIHZvaWQgU2V0VGV4dFNpemUoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpOwotICBzdGF0aWMgdm9pZCBTZXRVc2VyTmFtZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN3RmllbGROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZyk7Ci0gIHN0YXRpYyB2b2lkIFNldFZhbHVlKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDRlhfV2lkZVN0cmluZz4mIHN0ckFycmF5KTsKLQotICBzdGF0aWMgdm9pZCBBZGRGaWVsZChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IG5QYWdlSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBuRmllbGRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjQ29vcmRzKTsKLQotICBzdGF0aWMgdm9pZCBVcGRhdGVGb3JtRmllbGQoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNoYW5nZU1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZXNldEFQLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmVmcmVzaCk7Ci0gIHN0YXRpYyB2b2lkIFVwZGF0ZUZvcm1Db250cm9sKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNoYW5nZU1hcmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJlc2V0QVAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJlZnJlc2gpOwotCi0gIHN0YXRpYyBDUERGU0RLX1dpZGdldCogR2V0V2lkZ2V0KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wpOwotICBzdGF0aWMgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBHZXRGb3JtRmllbGRzKAotICAgICAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NGaWVsZE5hbWUpOwotCi0gIHN0YXRpYyB2b2lkIERvRGVsYXkoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgQ0pTX0RlbGF5RGF0YSogcERhdGEpOwotCi0gIGJvb2wgQXR0YWNoRmllbGQoRG9jdW1lbnQqIHBEb2N1bWVudCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKTsKLSAgdm9pZCBTZXREZWxheShib29sIGJEZWxheSk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgUGFyc2VGaWVsZE5hbWUoY29uc3Qgc3RkOjp3c3RyaW5nJiBzdHJGaWVsZE5hbWVQYXJzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgc3RkOjp3c3RyaW5nJiBzdHJGaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgaW50JiBpQ29udHJvbE5vKTsKLSAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBHZXRGb3JtRmllbGRzKAotICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNzRmllbGROYW1lKSBjb25zdDsKLSAgQ1BERl9Gb3JtQ29udHJvbCogR2V0U21hcnRGaWVsZENvbnRyb2woQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQpOwotICBib29sIFZhbHVlSXNPY2N1cihDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwgQ0ZYX1dpZGVTdHJpbmcgY3NPcHRMYWJlbCk7Ci0KLSAgdm9pZCBBZGREZWxheV9JbnQoRklFTERfUFJPUCBwcm9wLCBpbnQzMl90IG4pOwotICB2b2lkIEFkZERlbGF5X0Jvb2woRklFTERfUFJPUCBwcm9wLCBib29sIGIpOwotICB2b2lkIEFkZERlbGF5X1N0cmluZyhGSUVMRF9QUk9QIHByb3AsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzdHJpbmcpOwotICB2b2lkIEFkZERlbGF5X1dpZGVTdHJpbmcoRklFTERfUFJPUCBwcm9wLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyaW5nKTsKLSAgdm9pZCBBZGREZWxheV9SZWN0KEZJRUxEX1BST1AgcHJvcCwgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCk7Ci0gIHZvaWQgQWRkRGVsYXlfQ29sb3IoRklFTERfUFJPUCBwcm9wLCBjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7Ci0gIHZvaWQgQWRkRGVsYXlfV29yZEFycmF5KEZJRUxEX1BST1AgcHJvcCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBhcnJheSk7Ci0gIHZvaWQgQWRkRGVsYXlfV2lkZVN0cmluZ0FycmF5KEZJRUxEX1BST1AgcHJvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+JiBhcnJheSk7Ci0KLSAgdm9pZCBEb0RlbGF5KCk7Ci0KLSBwdWJsaWM6Ci0gIERvY3VtZW50KiBtX3BKU0RvYzsKLSAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpPYnNlcnZlZFB0ciBtX3BGb3JtRmlsbEVudjsKLSAgQ0ZYX1dpZGVTdHJpbmcgbV9GaWVsZE5hbWU7Ci0gIGludCBtX25Gb3JtQ29udHJvbEluZGV4OwotICBib29sIG1fYkNhblNldDsKLSAgYm9vbCBtX2JEZWxheTsKLX07Ci0KLWNsYXNzIENKU19GaWVsZCA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENKU19GaWVsZCh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9Ci0gIH5DSlNfRmllbGQoKSBvdmVycmlkZSB7fQotCi0gIHZvaWQgSW5pdEluc3RhbmNlKElKU19SdW50aW1lKiBwSVJ1bnRpbWUpIG92ZXJyaWRlOwotCi0gIERFQ0xBUkVfSlNfQ0xBU1MoKTsKLSAgSlNfU1RBVElDX1BST1AoYWxpZ25tZW50LCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKGJvcmRlclN0eWxlLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKGJ1dHRvbkFsaWduWCwgRmllbGQpOwotICBKU19TVEFUSUNfUFJPUChidXR0b25BbGlnblksIEZpZWxkKTsKLSAgSlNfU1RBVElDX1BST1AoYnV0dG9uRml0Qm91bmRzLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKGJ1dHRvblBvc2l0aW9uLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKGJ1dHRvblNjYWxlSG93LCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKGJ1dHRvblNjYWxlV2hlbiwgRmllbGQpOwotICBKU19TVEFUSUNfUFJPUChjYWxjT3JkZXJJbmRleCwgRmllbGQpOwotICBKU19TVEFUSUNfUFJPUChjaGFyTGltaXQsIEZpZWxkKTsKLSAgSlNfU1RBVElDX1BST1AoY29tYiwgRmllbGQpOwotICBKU19TVEFUSUNfUFJPUChjb21taXRPblNlbENoYW5nZSwgRmllbGQpOwotICBKU19TVEFUSUNfUFJPUChjdXJyZW50VmFsdWVJbmRpY2VzLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKGRlZmF1bHRTdHlsZSwgRmllbGQpOwotICBKU19TVEFUSUNfUFJPUChkZWZhdWx0VmFsdWUsIEZpZWxkKTsKLSAgSlNfU1RBVElDX1BST1AoZG9Ob3RTY3JvbGwsIEZpZWxkKTsKLSAgSlNfU1RBVElDX1BST1AoZG9Ob3RTcGVsbENoZWNrLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKGRlbGF5LCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKGRpc3BsYXksIEZpZWxkKTsKLSAgSlNfU1RBVElDX1BST1AoZG9jLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKGVkaXRhYmxlLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKGV4cG9ydFZhbHVlcywgRmllbGQpOwotICBKU19TVEFUSUNfUFJPUChmaWxlU2VsZWN0LCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKGZpbGxDb2xvciwgRmllbGQpOwotICBKU19TVEFUSUNfUFJPUChoaWRkZW4sIEZpZWxkKTsKLSAgSlNfU1RBVElDX1BST1AoaGlnaGxpZ2h0LCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKGxpbmVXaWR0aCwgRmllbGQpOwotICBKU19TVEFUSUNfUFJPUChtdWx0aWxpbmUsIEZpZWxkKTsKLSAgSlNfU1RBVElDX1BST1AobXVsdGlwbGVTZWxlY3Rpb24sIEZpZWxkKTsKLSAgSlNfU1RBVElDX1BST1AobmFtZSwgRmllbGQpOwotICBKU19TVEFUSUNfUFJPUChudW1JdGVtcywgRmllbGQpOwotICBKU19TVEFUSUNfUFJPUChwYWdlLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKHBhc3N3b3JkLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKHByaW50LCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKHJhZGlvc0luVW5pc29uLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKHJlYWRvbmx5LCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKHJlY3QsIEZpZWxkKTsKLSAgSlNfU1RBVElDX1BST1AocmVxdWlyZWQsIEZpZWxkKTsKLSAgSlNfU1RBVElDX1BST1AocmljaFRleHQsIEZpZWxkKTsKLSAgSlNfU1RBVElDX1BST1AocmljaFZhbHVlLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKHJvdGF0aW9uLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKHN0cm9rZUNvbG9yLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKHN0eWxlLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKHN1Ym1pdE5hbWUsIEZpZWxkKTsKLSAgSlNfU1RBVElDX1BST1AodGV4dENvbG9yLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKHRleHRGb250LCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKHRleHRTaXplLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19QUk9QKHR5cGUsIEZpZWxkKTsKLSAgSlNfU1RBVElDX1BST1AodXNlck5hbWUsIEZpZWxkKTsKLSAgSlNfU1RBVElDX1BST1AodmFsdWUsIEZpZWxkKTsKLSAgSlNfU1RBVElDX1BST1AodmFsdWVBc1N0cmluZywgRmllbGQpOwotICBKU19TVEFUSUNfUFJPUChzb3VyY2UsIEZpZWxkKTsKLQotICBKU19TVEFUSUNfTUVUSE9EKGJyb3dzZUZvckZpbGVUb1N1Ym1pdCwgRmllbGQpOwotICBKU19TVEFUSUNfTUVUSE9EKGJ1dHRvbkdldENhcHRpb24sIEZpZWxkKTsKLSAgSlNfU1RBVElDX01FVEhPRChidXR0b25HZXRJY29uLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QoYnV0dG9uSW1wb3J0SWNvbiwgRmllbGQpOwotICBKU19TVEFUSUNfTUVUSE9EKGJ1dHRvblNldENhcHRpb24sIEZpZWxkKTsKLSAgSlNfU1RBVElDX01FVEhPRChidXR0b25TZXRJY29uLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QoY2hlY2tUaGlzQm94LCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QoY2xlYXJJdGVtcywgRmllbGQpOwotICBKU19TVEFUSUNfTUVUSE9EKGRlZmF1bHRJc0NoZWNrZWQsIEZpZWxkKTsKLSAgSlNfU1RBVElDX01FVEhPRChkZWxldGVJdGVtQXQsIEZpZWxkKTsKLSAgSlNfU1RBVElDX01FVEhPRChnZXRBcnJheSwgRmllbGQpOwotICBKU19TVEFUSUNfTUVUSE9EKGdldEl0ZW1BdCwgRmllbGQpOwotICBKU19TVEFUSUNfTUVUSE9EKGdldExvY2ssIEZpZWxkKTsKLSAgSlNfU1RBVElDX01FVEhPRChpbnNlcnRJdGVtQXQsIEZpZWxkKTsKLSAgSlNfU1RBVElDX01FVEhPRChpc0JveENoZWNrZWQsIEZpZWxkKTsKLSAgSlNfU1RBVElDX01FVEhPRChpc0RlZmF1bHRDaGVja2VkLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0Qoc2V0QWN0aW9uLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0Qoc2V0Rm9jdXMsIEZpZWxkKTsKLSAgSlNfU1RBVElDX01FVEhPRChzZXRJdGVtcywgRmllbGQpOwotICBKU19TVEFUSUNfTUVUSE9EKHNldExvY2ssIEZpZWxkKTsKLSAgSlNfU1RBVElDX01FVEhPRChzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0Qoc2lnbmF0dXJlR2V0U2VlZFZhbHVlLCBGaWVsZCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0Qoc2lnbmF0dXJlSW5mbywgRmllbGQpOwotICBKU19TVEFUSUNfTUVUSE9EKHNpZ25hdHVyZVNldFNlZWRWYWx1ZSwgRmllbGQpOwotICBKU19TVEFUSUNfTUVUSE9EKHNpZ25hdHVyZVNpZ24sIEZpZWxkKTsKLSAgSlNfU1RBVElDX01FVEhPRChzaWduYXR1cmVWYWxpZGF0ZSwgRmllbGQpOwotfTsKLQotI2VuZGlmICAvLyBGUERGU0RLX0pBVkFTQ1JJUFRfRklFTERfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvamF2YXNjcmlwdC9JY29uLmNwcCBiL2ZwZGZzZGsvamF2YXNjcmlwdC9JY29uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEyZjkyZi4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2phdmFzY3JpcHQvSWNvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSWNvbi5oIgotCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19PYmplY3QuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfVmFsdWUuaCIKLQotSlNDb25zdFNwZWMgQ0pTX0ljb246OkNvbnN0U3BlY3NbXSA9IHt7MCwgSlNDb25zdFNwZWM6Ok51bWJlciwgMCwgMH19OwotCi1KU1Byb3BlcnR5U3BlYyBDSlNfSWNvbjo6UHJvcGVydHlTcGVjc1tdID0gewotICAgIHsibmFtZSIsIGdldF9uYW1lX3N0YXRpYywgc2V0X25hbWVfc3RhdGljfSwKLSAgICB7MCwgMCwgMH19OwotCi1KU01ldGhvZFNwZWMgQ0pTX0ljb246Ok1ldGhvZFNwZWNzW10gPSB7ezAsIDB9fTsKLQotSU1QTEVNRU5UX0pTX0NMQVNTKENKU19JY29uLCBJY29uKQotCi1JY29uOjpJY29uKENKU19PYmplY3QqIHBKU09iamVjdCkKLSAgICA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpLCBtX3N3SWNvbk5hbWUoTCIiKSB7fQotCi1JY29uOjp+SWNvbigpIHt9Ci0KLWJvb2wgSWNvbjo6bmFtZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAoIXZwLklzR2V0dGluZygpKQotICAgIHJldHVybiBmYWxzZTsKLQotICB2cCA8PCBtX3N3SWNvbk5hbWU7Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9qYXZhc2NyaXB0L0ljb24uaCBiL2ZwZGZzZGsvamF2YXNjcmlwdC9JY29uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ODA2NzguLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9qYXZhc2NyaXB0L0ljb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGUERGU0RLX0pBVkFTQ1JJUFRfSUNPTl9IXwotI2RlZmluZSBGUERGU0RLX0pBVkFTQ1JJUFRfSUNPTl9IXwotCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIgotCi1jbGFzcyBDUERGX1N0cmVhbTsKLQotY2xhc3MgSWNvbiA6IHB1YmxpYyBDSlNfRW1iZWRPYmogewotIHB1YmxpYzoKLSAgZXhwbGljaXQgSWNvbihDSlNfT2JqZWN0KiBwSlNPYmplY3QpOwotICB+SWNvbigpIG92ZXJyaWRlOwotCi0gIGJvb2wgbmFtZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0SWNvbk5hbWUoKSBjb25zdCB7IHJldHVybiBtX3N3SWNvbk5hbWU7IH0KLSAgdm9pZCBTZXRJY29uTmFtZShDRlhfV2lkZVN0cmluZyBuYW1lKSB7IG1fc3dJY29uTmFtZSA9IG5hbWU7IH0KLQotIHByaXZhdGU6Ci0gIENGWF9XaWRlU3RyaW5nIG1fc3dJY29uTmFtZTsKLX07Ci0KLWNsYXNzIENKU19JY29uIDogcHVibGljIENKU19PYmplY3QgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0pTX0ljb24odjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQotICB+Q0pTX0ljb24oKSBvdmVycmlkZSB7fQotCi0gIERFQ0xBUkVfSlNfQ0xBU1MoKTsKLSAgSlNfU1RBVElDX1BST1AobmFtZSwgSWNvbik7Ci19OwotCi0jZW5kaWYgIC8vIEZQREZTREtfSkFWQVNDUklQVF9JQ09OX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2phdmFzY3JpcHQvSlNfRGVmaW5lLmggYi9mcGRmc2RrL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NWNhM2EuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9qYXZhc2NyaXB0L0pTX0RlZmluZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDU2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGUERGU0RLX0pBVkFTQ1JJUFRfSlNfREVGSU5FX0hfCi0jZGVmaW5lIEZQREZTREtfSkFWQVNDUklQVF9KU19ERUZJTkVfSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19PYmplY3QuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfVmFsdWUuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvcmVzb3VyY2UuaCIKLSNpbmNsdWRlICJmeGpzL2Z4anNfdjguaCIKLQotc3RydWN0IEpTQ29uc3RTcGVjIHsKLSAgZW51bSBUeXBlIHsgTnVtYmVyID0gMCwgU3RyaW5nID0gMSB9OwotCi0gIGNvbnN0IGNoYXIqIHBOYW1lOwotICBUeXBlIGVUeXBlOwotICBkb3VibGUgbnVtYmVyOwotICBjb25zdCBjaGFyKiBwU3RyOwotfTsKLQotc3RydWN0IEpTUHJvcGVydHlTcGVjIHsKLSAgY29uc3QgY2hhciogcE5hbWU7Ci0gIHY4OjpBY2Nlc3NvckdldHRlckNhbGxiYWNrIHBQcm9wR2V0OwotICB2ODo6QWNjZXNzb3JTZXR0ZXJDYWxsYmFjayBwUHJvcFB1dDsKLX07Ci0KLXN0cnVjdCBKU01ldGhvZFNwZWMgewotICBjb25zdCBjaGFyKiBwTmFtZTsKLSAgdjg6OkZ1bmN0aW9uQ2FsbGJhY2sgcE1ldGhvZENhbGw7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgQywgYm9vbCAoQzo6Kk0pKENKU19SdW50aW1lKiwgQ0pTX1Byb3BWYWx1ZSYsIENGWF9XaWRlU3RyaW5nJik+Ci12b2lkIEpTUHJvcEdldHRlcihjb25zdCBjaGFyKiBwcm9wX25hbWVfc3RyaW5nLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2xhc3NfbmFtZV9zdHJpbmcsCi0gICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgewotICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPQotICAgICAgQ0pTX1J1bnRpbWU6OkN1cnJlbnRSdW50aW1lRnJvbUlzb2xhdGUoaW5mby5HZXRJc29sYXRlKCkpOwotICBpZiAoIXBSdW50aW1lKQotICAgIHJldHVybjsKLSAgQ0pTX09iamVjdCogcEpTT2JqID0KLSAgICAgIHN0YXRpY19jYXN0PENKU19PYmplY3QqPihwUnVudGltZS0+R2V0T2JqZWN0UHJpdmF0ZShpbmZvLkhvbGRlcigpKSk7Ci0gIGlmICghcEpTT2JqKQotICAgIHJldHVybjsKLSAgQyogcE9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Qyo+KHBKU09iai0+R2V0RW1iZWRPYmplY3QoKSk7Ci0gIENGWF9XaWRlU3RyaW5nIHNFcnJvcjsKLSAgQ0pTX1Byb3BWYWx1ZSB2YWx1ZShwUnVudGltZSk7Ci0gIHZhbHVlLlN0YXJ0R2V0dGluZygpOwotICBpZiAoIShwT2JqLT4qTSkocFJ1bnRpbWUsIHZhbHVlLCBzRXJyb3IpKSB7Ci0gICAgcFJ1bnRpbWUtPkVycm9yKAotICAgICAgICBKU0Zvcm1hdEVycm9yU3RyaW5nKGNsYXNzX25hbWVfc3RyaW5nLCBwcm9wX25hbWVfc3RyaW5nLCBzRXJyb3IpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCh2YWx1ZS5HZXRKU1ZhbHVlKCktPlRvVjhWYWx1ZShwUnVudGltZSkpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgQywgYm9vbCAoQzo6Kk0pKENKU19SdW50aW1lKiwgQ0pTX1Byb3BWYWx1ZSYsIENGWF9XaWRlU3RyaW5nJik+Ci12b2lkIEpTUHJvcFNldHRlcihjb25zdCBjaGFyKiBwcm9wX25hbWVfc3RyaW5nLAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2xhc3NfbmFtZV9zdHJpbmcsCi0gICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2b2lkPiYgaW5mbykgewotICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPQotICAgICAgQ0pTX1J1bnRpbWU6OkN1cnJlbnRSdW50aW1lRnJvbUlzb2xhdGUoaW5mby5HZXRJc29sYXRlKCkpOwotICBpZiAoIXBSdW50aW1lKQotICAgIHJldHVybjsKLSAgQ0pTX09iamVjdCogcEpTT2JqID0KLSAgICAgIHN0YXRpY19jYXN0PENKU19PYmplY3QqPihwUnVudGltZS0+R2V0T2JqZWN0UHJpdmF0ZShpbmZvLkhvbGRlcigpKSk7Ci0gIGlmICghcEpTT2JqKQotICAgIHJldHVybjsKLSAgQyogcE9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Qyo+KHBKU09iai0+R2V0RW1iZWRPYmplY3QoKSk7Ci0gIENGWF9XaWRlU3RyaW5nIHNFcnJvcjsKLSAgQ0pTX1Byb3BWYWx1ZSBwcm9wVmFsdWUocFJ1bnRpbWUsIENKU19WYWx1ZShwUnVudGltZSwgdmFsdWUpKTsKLSAgcHJvcFZhbHVlLlN0YXJ0U2V0dGluZygpOwotICBpZiAoIShwT2JqLT4qTSkocFJ1bnRpbWUsIHByb3BWYWx1ZSwgc0Vycm9yKSkgewotICAgIHBSdW50aW1lLT5FcnJvcigKLSAgICAgICAgSlNGb3JtYXRFcnJvclN0cmluZyhjbGFzc19uYW1lX3N0cmluZywgcHJvcF9uYW1lX3N0cmluZywgc0Vycm9yKSk7Ci0gIH0KLX0KLQotI2RlZmluZSBKU19TVEFUSUNfUFJPUChwcm9wX25hbWUsIGNsYXNzX25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgdm9pZCBnZXRfIyNwcm9wX25hbWUjI19zdGF0aWMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEpTUHJvcEdldHRlcjxjbGFzc19uYW1lLCAmY2xhc3NfbmFtZTo6cHJvcF9uYW1lPigjcHJvcF9uYW1lLCAjY2xhc3NfbmFtZSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSwgaW5mbyk7ICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgdm9pZCBzZXRfIyNwcm9wX25hbWUjI19zdGF0aWMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSwgICAgICAgICAgICAgXAotICAgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHZvaWQ+JiBpbmZvKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEpTUHJvcFNldHRlcjxjbGFzc19uYW1lLCAmY2xhc3NfbmFtZTo6cHJvcF9uYW1lPigjcHJvcF9uYW1lLCAjY2xhc3NfbmFtZSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSwgdmFsdWUsIGluZm8pOyAgXAotICB9Ci0KLXRlbXBsYXRlIDxjbGFzcyBDLAotICAgICAgICAgIGJvb2wgKEM6OipNKShDSlNfUnVudGltZSosCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mLAotICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmLAotICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYpPgotdm9pZCBKU01ldGhvZChjb25zdCBjaGFyKiBtZXRob2RfbmFtZV9zdHJpbmcsCi0gICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNsYXNzX25hbWVfc3RyaW5nLAotICAgICAgICAgICAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgewotICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPQotICAgICAgQ0pTX1J1bnRpbWU6OkN1cnJlbnRSdW50aW1lRnJvbUlzb2xhdGUoaW5mby5HZXRJc29sYXRlKCkpOwotICBpZiAoIXBSdW50aW1lKQotICAgIHJldHVybjsKLSAgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiBwYXJhbWV0ZXJzOwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpaW5mby5MZW5ndGgoKTsgaSsrKSB7Ci0gICAgcGFyYW1ldGVycy5wdXNoX2JhY2soQ0pTX1ZhbHVlKHBSdW50aW1lLCBpbmZvW2ldKSk7Ci0gIH0KLSAgQ0pTX09iamVjdCogcEpTT2JqID0KLSAgICAgIHN0YXRpY19jYXN0PENKU19PYmplY3QqPihwUnVudGltZS0+R2V0T2JqZWN0UHJpdmF0ZShpbmZvLkhvbGRlcigpKSk7Ci0gIGlmICghcEpTT2JqKQotICAgIHJldHVybjsKLSAgQyogcE9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Qyo+KHBKU09iai0+R2V0RW1iZWRPYmplY3QoKSk7Ci0gIENGWF9XaWRlU3RyaW5nIHNFcnJvcjsKLSAgQ0pTX1ZhbHVlIHZhbHVlUmVzKHBSdW50aW1lKTsKLSAgaWYgKCEocE9iai0+Kk0pKHBSdW50aW1lLCBwYXJhbWV0ZXJzLCB2YWx1ZVJlcywgc0Vycm9yKSkgewotICAgIHBSdW50aW1lLT5FcnJvcigKLSAgICAgICAgSlNGb3JtYXRFcnJvclN0cmluZyhjbGFzc19uYW1lX3N0cmluZywgbWV0aG9kX25hbWVfc3RyaW5nLCBzRXJyb3IpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCh2YWx1ZVJlcy5Ub1Y4VmFsdWUocFJ1bnRpbWUpKTsKLX0KLQotI2RlZmluZSBKU19TVEFUSUNfTUVUSE9EKG1ldGhvZF9uYW1lLCBjbGFzc19uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgdm9pZCBtZXRob2RfbmFtZSMjX3N0YXRpYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEpTTWV0aG9kPGNsYXNzX25hbWUsICZjbGFzc19uYW1lOjptZXRob2RfbmFtZT4oI21ldGhvZF9uYW1lLCAjY2xhc3NfbmFtZSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyk7ICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNkZWZpbmUgSlNfU1BFQ0lBTF9TVEFUSUNfTUVUSE9EKG1ldGhvZF9uYW1lLCBjbGFzc19hbHRlcm5hdGUsIGNsYXNzX25hbWUpIFwKLSAgc3RhdGljIHZvaWQgbWV0aG9kX25hbWUjI19zdGF0aWMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7ICAgICAgICAgICAgICAgICAgIFwKLSAgICBKU01ldGhvZDxjbGFzc19hbHRlcm5hdGUsICZjbGFzc19hbHRlcm5hdGU6Om1ldGhvZF9uYW1lPiggICAgICAgICAgICAgIFwKLSAgICAgICAgI21ldGhvZF9uYW1lLCAjY2xhc3NfbmFtZSwgaW5mbyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0vLyBBbGwgSlMgY2xhc3NlcyBoYXZlIGEgbmFtZSwgYW4gb2JqZWN0IGRlZmludGlvbiBJRCwgYW5kIHRoZSBhYmlsaXR5IHRvCi0vLyByZWdpc3RlciB0aGVtc2VsdmVzIHdpdGggRlhKU19WOC4gV2UgbmV2ZXIgbWFrZSBhIEJBU0UgY2xhc3Mgb24gaXRzIG93bgotLy8gYmVjYXVzZSBpdCBjYW4ndCByZWFsbHkgZG8gYW55dGhpbmcuCi0jZGVmaW5lIERFQ0xBUkVfSlNfQ0xBU1NfQkFTRV9QQVJUKCkgXAotICBzdGF0aWMgY29uc3QgY2hhciogZ19wQ2xhc3NOYW1lOyAgIFwKLSAgc3RhdGljIGludCBnX25PYmpEZWZuSUQ7ICAgICAgICAgICBcCi0gIHN0YXRpYyB2b2lkIERlZmluZUpTT2JqZWN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUsIEZYSlNPQkpUWVBFIGVPYmpUeXBlKTsKLQotI2RlZmluZSBJTVBMRU1FTlRfSlNfQ0xBU1NfQkFTRV9QQVJUKGpzX2NsYXNzX25hbWUsIGNsYXNzX25hbWUpIFwKLSAgY29uc3QgY2hhcioganNfY2xhc3NfbmFtZTo6Z19wQ2xhc3NOYW1lID0gI2NsYXNzX25hbWU7ICAgICAgICBcCi0gIGludCBqc19jbGFzc19uYW1lOjpnX25PYmpEZWZuSUQgPSAtMTsKLQotLy8gQ09OU1QgY2xhc3NlcyBwcm92aWRlIGNvbnN0YW50cywgYnV0IG5vdCBjb25zdHJ1Y3RvcnMsIG1ldGhvZHMsIG9yIHByb3BzLgotI2RlZmluZSBERUNMQVJFX0pTX0NMQVNTX0NPTlNUKCkgXAotICBERUNMQVJFX0pTX0NMQVNTX0JBU0VfUEFSVCgpICAgXAotICBERUNMQVJFX0pTX0NMQVNTX0NPTlNUX1BBUlQoKQotCi0jZGVmaW5lIElNUExFTUVOVF9KU19DTEFTU19DT05TVChqc19jbGFzc19uYW1lLCBjbGFzc19uYW1lKSAgICAgICAgICAgICAgICAgIFwKLSAgSU1QTEVNRU5UX0pTX0NMQVNTX0JBU0VfUEFSVChqc19jbGFzc19uYW1lLCBjbGFzc19uYW1lKSAgICAgICAgICAgICAgICAgICAgXAotICBJTVBMRU1FTlRfSlNfQ0xBU1NfQ09OU1RfUEFSVChqc19jbGFzc19uYW1lLCBjbGFzc19uYW1lKSAgICAgICAgICAgICAgICAgICBcCi0gIHZvaWQganNfY2xhc3NfbmFtZTo6RGVmaW5lSlNPYmplY3RzKENGWEpTX0VuZ2luZSogcEVuZ2luZSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU09CSlRZUEUgZU9ialR5cGUpIHsgICAgICAgICAgICAgICAgXAotICAgIGdfbk9iakRlZm5JRCA9IHBFbmdpbmUtPkRlZmluZU9iaihqc19jbGFzc19uYW1lOjpnX3BDbGFzc05hbWUsIGVPYmpUeXBlLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIpOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBEZWZpbmVDb25zdHMocEVuZ2luZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNkZWZpbmUgREVDTEFSRV9KU19DTEFTU19DT05TVF9QQVJUKCkgXAotICBzdGF0aWMgSlNDb25zdFNwZWMgQ29uc3RTcGVjc1tdOyAgICBcCi0gIHN0YXRpYyB2b2lkIERlZmluZUNvbnN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUpOwotCi0jZGVmaW5lIElNUExFTUVOVF9KU19DTEFTU19DT05TVF9QQVJUKGpzX2NsYXNzX25hbWUsIGNsYXNzX25hbWUpICAgICAgICAgICAgIFwKLSAgdm9pZCBqc19jbGFzc19uYW1lOjpEZWZpbmVDb25zdHMoQ0ZYSlNfRW5naW5lKiBwRW5naW5lKSB7ICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKENvbnN0U3BlY3MpIC0gMTsgKytpKSB7ICAgICAgICAgICAgICBcCi0gICAgICBwRW5naW5lLT5EZWZpbmVPYmpDb25zdChnX25PYmpEZWZuSUQsIENvbnN0U3BlY3NbaV0ucE5hbWUsICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0U3BlY3NbaV0uZVR5cGUgPT0gSlNDb25zdFNwZWM6Ok51bWJlciAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcEVuZ2luZS0+TmV3TnVtYmVyKENvbnN0U3BlY3NbaV0ubnVtYmVyKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwRW5naW5lLT5OZXdTdHJpbmcoQ29uc3RTcGVjc1tpXS5wU3RyKSk7IFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLS8vIENvbnZlbmllbmNlIG1hY3JvcyBmb3IgZGVjbGFyaW5nIGNsYXNzZXMgd2l0aG91dCBhbiBhbHRlcm5hdGUuCi0jZGVmaW5lIERFQ0xBUkVfSlNfQ0xBU1MoKSBERUNMQVJFX0pTX0NMQVNTX1JJQ0goKQotI2RlZmluZSBJTVBMRU1FTlRfSlNfQ0xBU1MoanNfY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSkgXAotICBJTVBMRU1FTlRfSlNfQ0xBU1NfUklDSChqc19jbGFzc19uYW1lLCBjbGFzc19uYW1lLCBjbGFzc19uYW1lKQotCi0vLyBSaWNoIEpTIGNsYXNzZXMgcHJvdmlkZSBjb25zdGFudHMsIG1ldGhvZHMsIHByb3BlcnRpZXMsIGFuZCB0aGUgYWJpbGl0eQotLy8gdG8gY29uc3RydWN0IG5hdGl2ZSBvYmplY3Qgc3RhdGUuCi0jZGVmaW5lIERFQ0xBUkVfSlNfQ0xBU1NfUklDSCgpIFwKLSAgREVDTEFSRV9KU19DTEFTU19CQVNFX1BBUlQoKSAgXAotICBERUNMQVJFX0pTX0NMQVNTX0NPTlNUX1BBUlQoKSBcCi0gIERFQ0xBUkVfSlNfQ0xBU1NfUklDSF9QQVJUKCkKLQotI2RlZmluZSBJTVBMRU1FTlRfSlNfQ0xBU1NfUklDSChqc19jbGFzc19uYW1lLCBjbGFzc19hbHRlcm5hdGUsIGNsYXNzX25hbWUpICBcCi0gIElNUExFTUVOVF9KU19DTEFTU19CQVNFX1BBUlQoanNfY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSkgICAgICAgICAgICAgICAgICAgIFwKLSAgSU1QTEVNRU5UX0pTX0NMQVNTX0NPTlNUX1BBUlQoanNfY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSkgICAgICAgICAgICAgICAgICAgXAotICBJTVBMRU1FTlRfSlNfQ0xBU1NfUklDSF9QQVJUKGpzX2NsYXNzX25hbWUsIGNsYXNzX2FsdGVybmF0ZSwgY2xhc3NfbmFtZSkgICBcCi0gIHZvaWQganNfY2xhc3NfbmFtZTo6RGVmaW5lSlNPYmplY3RzKENGWEpTX0VuZ2luZSogcEVuZ2luZSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU09CSlRZUEUgZU9ialR5cGUpIHsgICAgICAgICAgICAgICAgXAotICAgIGdfbk9iakRlZm5JRCA9IHBFbmdpbmUtPkRlZmluZU9iaihqc19jbGFzc19uYW1lOjpnX3BDbGFzc05hbWUsIGVPYmpUeXBlLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQ29uc3RydWN0b3IsIEpTRGVzdHJ1Y3Rvcik7ICAgICAgICAgIFwKLSAgICBEZWZpbmVDb25zdHMocEVuZ2luZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIERlZmluZVByb3BzKHBFbmdpbmUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRGVmaW5lTWV0aG9kcyhwRW5naW5lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZGVmaW5lIERFQ0xBUkVfSlNfQ0xBU1NfUklDSF9QQVJUKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgdm9pZCBKU0NvbnN0cnVjdG9yKENGWEpTX0VuZ2luZSogcEVuZ2luZSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iaik7IFwKLSAgc3RhdGljIHZvaWQgSlNEZXN0cnVjdG9yKENGWEpTX0VuZ2luZSogcEVuZ2luZSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iaik7ICBcCi0gIHN0YXRpYyB2b2lkIERlZmluZVByb3BzKENGWEpTX0VuZ2luZSogcEVuZ2luZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgdm9pZCBEZWZpbmVNZXRob2RzKENGWEpTX0VuZ2luZSogcEVuZ2luZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIEpTUHJvcGVydHlTcGVjIFByb3BlcnR5U3BlY3NbXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBKU01ldGhvZFNwZWMgTWV0aG9kU3BlY3NbXTsKLQotI2RlZmluZSBJTVBMRU1FTlRfSlNfQ0xBU1NfUklDSF9QQVJUKGpzX2NsYXNzX25hbWUsIGNsYXNzX2FsdGVybmF0ZSwgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzX25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkIGpzX2NsYXNzX25hbWU6OkpTQ29uc3RydWN0b3IoQ0ZYSlNfRW5naW5lKiBwRW5naW5lLCAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iaikgeyAgICAgICAgXAotICAgIENKU19PYmplY3QqIHBPYmogPSBuZXcganNfY2xhc3NfbmFtZShvYmopOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHBPYmotPlNldEVtYmVkT2JqZWN0KG5ldyBjbGFzc19hbHRlcm5hdGUocE9iaikpOyAgICAgICAgICAgICAgICAgICAgXAotICAgIHBFbmdpbmUtPlNldE9iamVjdFByaXZhdGUob2JqLCAodm9pZCopcE9iaik7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHBPYmotPkluaXRJbnN0YW5jZShzdGF0aWNfY2FzdDxDSlNfUnVudGltZSo+KHBFbmdpbmUpKTsgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkIGpzX2NsYXNzX25hbWU6OkpTRGVzdHJ1Y3RvcihDRlhKU19FbmdpbmUqIHBFbmdpbmUsICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqKSB7ICAgICAgICAgXAotICAgIGRlbGV0ZSBzdGF0aWNfY2FzdDxqc19jbGFzc19uYW1lKj4ocEVuZ2luZS0+R2V0T2JqZWN0UHJpdmF0ZShvYmopKTsgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkIGpzX2NsYXNzX25hbWU6OkRlZmluZVByb3BzKENGWEpTX0VuZ2luZSogcEVuZ2luZSkgeyAgICAgICAgICAgICAgXAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKFByb3BlcnR5U3BlY3MpIC0gMTsgKytpKSB7ICAgICAgXAotICAgICAgcEVuZ2luZS0+RGVmaW5lT2JqUHJvcGVydHkoZ19uT2JqRGVmbklELCBQcm9wZXJ0eVNwZWNzW2ldLnBOYW1lLCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlTcGVjc1tpXS5wUHJvcEdldCwgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlTcGVjc1tpXS5wUHJvcFB1dCk7ICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkIGpzX2NsYXNzX25hbWU6OkRlZmluZU1ldGhvZHMoQ0ZYSlNfRW5naW5lKiBwRW5naW5lKSB7ICAgICAgICAgICAgXAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKE1ldGhvZFNwZWNzKSAtIDE7ICsraSkgeyAgICAgICAgXAotICAgICAgcEVuZ2luZS0+RGVmaW5lT2JqTWV0aG9kKGdfbk9iakRlZm5JRCwgTWV0aG9kU3BlY3NbaV0ucE5hbWUsICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFNwZWNzW2ldLnBNZXRob2RDYWxsKTsgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLS8vIFNwZWNpYWwgSlMgY2xhc3NlcyBpbXBsZW1lbnQgbWV0aG9kcywgcHJvcHMsIGFuZCBxdWVyaWVzLCBidXQgbm90IGNvbnN0cy4KLSNkZWZpbmUgREVDTEFSRV9TUEVDSUFMX0pTX0NMQVNTKCkgXAotICBERUNMQVJFX0pTX0NMQVNTX0JBU0VfUEFSVCgpICAgICBcCi0gIERFQ0xBUkVfSlNfQ0xBU1NfQ09OU1RfUEFSVCgpICAgIFwKLSAgREVDTEFSRV9KU19DTEFTU19SSUNIX1BBUlQoKSAgICAgXAotICBERUNMQVJFX1NQRUNJQUxfSlNfQ0xBU1NfUEFSVCgpCi0KLSNkZWZpbmUgSU1QTEVNRU5UX1NQRUNJQUxfSlNfQ0xBU1MoanNfY2xhc3NfbmFtZSwgY2xhc3NfYWx0ZXJuYXRlLCBjbGFzc19uYW1lKSBcCi0gIElNUExFTUVOVF9KU19DTEFTU19CQVNFX1BBUlQoanNfY2xhc3NfbmFtZSwgY2xhc3NfbmFtZSkgICAgICAgICAgICAgICAgICAgICAgXAotICBJTVBMRU1FTlRfSlNfQ0xBU1NfQ09OU1RfUEFSVChqc19jbGFzc19uYW1lLCBjbGFzc19uYW1lKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgSU1QTEVNRU5UX0pTX0NMQVNTX1JJQ0hfUEFSVChqc19jbGFzc19uYW1lLCBjbGFzc19hbHRlcm5hdGUsIGNsYXNzX25hbWUpICAgICBcCi0gIElNUExFTUVOVF9TUEVDSUFMX0pTX0NMQVNTX1BBUlQoanNfY2xhc3NfbmFtZSwgY2xhc3NfYWx0ZXJuYXRlLCBjbGFzc19uYW1lKSAgXAotICB2b2lkIGpzX2NsYXNzX25hbWU6OkRlZmluZUpTT2JqZWN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUsICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU09CSlRZUEUgZU9ialR5cGUpIHsgICAgICAgICAgICAgICAgICBcCi0gICAgZ19uT2JqRGVmbklEID0gcEVuZ2luZS0+RGVmaW5lT2JqKGpzX2NsYXNzX25hbWU6OmdfcENsYXNzTmFtZSwgZU9ialR5cGUsICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0NvbnN0cnVjdG9yLCBKU0Rlc3RydWN0b3IpOyAgICAgICAgICAgIFwKLSAgICBEZWZpbmVDb25zdHMocEVuZ2luZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRGVmaW5lUHJvcHMocEVuZ2luZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIERlZmluZU1ldGhvZHMocEVuZ2luZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBEZWZpbmVBbGxQcm9wZXJ0aWVzKHBFbmdpbmUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2RlZmluZSBERUNMQVJFX1NQRUNJQUxfSlNfQ0xBU1NfUEFSVCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIHZvaWQgcXVlcnlwcm9wX3N0YXRpYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpJbnRlZ2VyPiYgaW5mbyk7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIHZvaWQgZ2V0cHJvcF9zdGF0aWModjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LCAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKTsgXAotICBzdGF0aWMgdm9pZCBwdXRwcm9wX3N0YXRpYyh2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUsICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKTsgXAotICBzdGF0aWMgdm9pZCBkZWxwcm9wX3N0YXRpYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OkJvb2xlYW4+JiBpbmZvKTsgICAgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgdm9pZCBEZWZpbmVBbGxQcm9wZXJ0aWVzKENGWEpTX0VuZ2luZSogcEVuZ2luZSk7Ci0KLSNkZWZpbmUgSU1QTEVNRU5UX1NQRUNJQUxfSlNfQ0xBU1NfUEFSVChqc19jbGFzc19uYW1lLCBjbGFzc19hbHRlcm5hdGUsICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc19uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCBqc19jbGFzc19uYW1lOjpxdWVyeXByb3Bfc3RhdGljKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6SW50ZWdlcj4mIGluZm8pIHsgICAgICAgICAgICAgICAgIFwKLSAgICBKU1NwZWNpYWxQcm9wUXVlcnk8Y2xhc3NfYWx0ZXJuYXRlPigjY2xhc3NfbmFtZSwgcHJvcGVydHksIGluZm8pOyAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCBqc19jbGFzc19uYW1lOjpnZXRwcm9wX3N0YXRpYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7ICAgICAgICAgICAgICAgICAgIFwKLSAgICBKU1NwZWNpYWxQcm9wR2V0PGNsYXNzX2FsdGVybmF0ZT4oI2NsYXNzX25hbWUsIHByb3BlcnR5LCBpbmZvKTsgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCBqc19jbGFzc19uYW1lOjpwdXRwcm9wX3N0YXRpYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUsICAgICAgICAgIFwKLSAgICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7ICAgICAgICAgICAgICAgICAgIFwKLSAgICBKU1NwZWNpYWxQcm9wUHV0PGNsYXNzX2FsdGVybmF0ZT4oI2NsYXNzX25hbWUsIHByb3BlcnR5LCB2YWx1ZSwgaW5mbyk7IFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCBqc19jbGFzc19uYW1lOjpkZWxwcm9wX3N0YXRpYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6Qm9vbGVhbj4mIGluZm8pIHsgICAgICAgICAgICAgICAgIFwKLSAgICBKU1NwZWNpYWxQcm9wRGVsPGNsYXNzX2FsdGVybmF0ZT4oI2NsYXNzX25hbWUsIHByb3BlcnR5LCBpbmZvKTsgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCBqc19jbGFzc19uYW1lOjpEZWZpbmVBbGxQcm9wZXJ0aWVzKENGWEpTX0VuZ2luZSogcEVuZ2luZSkgeyAgICAgICAgIFwKLSAgICBwRW5naW5lLT5EZWZpbmVPYmpBbGxQcm9wZXJ0aWVzKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZ19uT2JqRGVmbklELCBqc19jbGFzc19uYW1lOjpxdWVyeXByb3Bfc3RhdGljLCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAganNfY2xhc3NfbmFtZTo6Z2V0cHJvcF9zdGF0aWMsIGpzX2NsYXNzX25hbWU6OnB1dHByb3Bfc3RhdGljLCAgICAgIFwKLSAgICAgICAganNfY2xhc3NfbmFtZTo6ZGVscHJvcF9zdGF0aWMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgQWx0Pgotdm9pZCBKU1NwZWNpYWxQcm9wUXVlcnkoY29uc3QgY2hhciosCi0gICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OkludGVnZXI+JiBpbmZvKSB7Ci0gIENKU19SdW50aW1lKiBwUnVudGltZSA9Ci0gICAgICBDSlNfUnVudGltZTo6Q3VycmVudFJ1bnRpbWVGcm9tSXNvbGF0ZShpbmZvLkdldElzb2xhdGUoKSk7Ci0gIGlmICghcFJ1bnRpbWUpCi0gICAgcmV0dXJuOwotCi0gIENKU19PYmplY3QqIHBKU09iaiA9Ci0gICAgICBzdGF0aWNfY2FzdDxDSlNfT2JqZWN0Kj4ocFJ1bnRpbWUtPkdldE9iamVjdFByaXZhdGUoaW5mby5Ib2xkZXIoKSkpOwotICBpZiAoIXBKU09iaikKLSAgICByZXR1cm47Ci0KLSAgQWx0KiBwT2JqID0gcmVpbnRlcnByZXRfY2FzdDxBbHQqPihwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpOwotICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgdXRmOF92YWx1ZShwcm9wZXJ0eSk7Ci0gIENGWF9XaWRlU3RyaW5nIHByb3BuYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KAotICAgICAgQ0ZYX0J5dGVTdHJpbmdDKCp1dGY4X3ZhbHVlLCB1dGY4X3ZhbHVlLmxlbmd0aCgpKSk7Ci0gIGJvb2wgYlJldCA9IHBPYmotPlF1ZXJ5UHJvcGVydHkocHJvcG5hbWUuY19zdHIoKSk7Ci0gIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQoYlJldCA/IDQgOiAwKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIEFsdD4KLXZvaWQgSlNTcGVjaWFsUHJvcEdldChjb25zdCBjaGFyKiBjbGFzc19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgewotICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPQotICAgICAgQ0pTX1J1bnRpbWU6OkN1cnJlbnRSdW50aW1lRnJvbUlzb2xhdGUoaW5mby5HZXRJc29sYXRlKCkpOwotICBpZiAoIXBSdW50aW1lKQotICAgIHJldHVybjsKLQotICBDSlNfT2JqZWN0KiBwSlNPYmogPQotICAgICAgc3RhdGljX2Nhc3Q8Q0pTX09iamVjdCo+KHBSdW50aW1lLT5HZXRPYmplY3RQcml2YXRlKGluZm8uSG9sZGVyKCkpKTsKLSAgaWYgKCFwSlNPYmopCi0gICAgcmV0dXJuOwotCi0gIEFsdCogcE9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8QWx0Kj4ocEpTT2JqLT5HZXRFbWJlZE9iamVjdCgpKTsKLSAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHV0ZjhfdmFsdWUocHJvcGVydHkpOwotICBDRlhfV2lkZVN0cmluZyBwcm9wbmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCgKLSAgICAgIENGWF9CeXRlU3RyaW5nQygqdXRmOF92YWx1ZSwgdXRmOF92YWx1ZS5sZW5ndGgoKSkpOwotICBDRlhfV2lkZVN0cmluZyBzRXJyb3I7Ci0gIENKU19Qcm9wVmFsdWUgdmFsdWUocFJ1bnRpbWUpOwotICB2YWx1ZS5TdGFydEdldHRpbmcoKTsKLSAgaWYgKCFwT2JqLT5Eb1Byb3BlcnR5KHBSdW50aW1lLCBwcm9wbmFtZS5jX3N0cigpLCB2YWx1ZSwgc0Vycm9yKSkgewotICAgIHBSdW50aW1lLT5FcnJvcihKU0Zvcm1hdEVycm9yU3RyaW5nKGNsYXNzX25hbWUsICJHZXRQcm9wZXJ0eSIsIHNFcnJvcikpOwotICAgIHJldHVybjsKLSAgfQotICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KHZhbHVlLkdldEpTVmFsdWUoKS0+VG9WOFZhbHVlKHBSdW50aW1lKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBBbHQ+Ci12b2lkIEpTU3BlY2lhbFByb3BQdXQoY29uc3QgY2hhciogY2xhc3NfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsKLSAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0KLSAgICAgIENKU19SdW50aW1lOjpDdXJyZW50UnVudGltZUZyb21Jc29sYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsKLSAgaWYgKCFwUnVudGltZSkKLSAgICByZXR1cm47Ci0KLSAgQ0pTX09iamVjdCogcEpTT2JqID0KLSAgICAgIHN0YXRpY19jYXN0PENKU19PYmplY3QqPihwUnVudGltZS0+R2V0T2JqZWN0UHJpdmF0ZShpbmZvLkhvbGRlcigpKSk7Ci0gIGlmICghcEpTT2JqKQotICAgIHJldHVybjsKLQotICBBbHQqIHBPYmogPSByZWludGVycHJldF9jYXN0PEFsdCo+KHBKU09iai0+R2V0RW1iZWRPYmplY3QoKSk7Ci0gIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSB1dGY4X3ZhbHVlKHByb3BlcnR5KTsKLSAgQ0ZYX1dpZGVTdHJpbmcgcHJvcG5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoCi0gICAgICBDRlhfQnl0ZVN0cmluZ0MoKnV0ZjhfdmFsdWUsIHV0ZjhfdmFsdWUubGVuZ3RoKCkpKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgc0Vycm9yOwotICBDSlNfUHJvcFZhbHVlIFByb3BWYWx1ZShwUnVudGltZSwgQ0pTX1ZhbHVlKHBSdW50aW1lLCB2YWx1ZSkpOwotICBQcm9wVmFsdWUuU3RhcnRTZXR0aW5nKCk7Ci0gIGlmICghcE9iai0+RG9Qcm9wZXJ0eShwUnVudGltZSwgcHJvcG5hbWUuY19zdHIoKSwgUHJvcFZhbHVlLCBzRXJyb3IpKSB7Ci0gICAgcFJ1bnRpbWUtPkVycm9yKEpTRm9ybWF0RXJyb3JTdHJpbmcoY2xhc3NfbmFtZSwgIlB1dFByb3BlcnR5Iiwgc0Vycm9yKSk7Ci0gIH0KLX0KLQotdGVtcGxhdGUgPGNsYXNzIEFsdD4KLXZvaWQgSlNTcGVjaWFsUHJvcERlbChjb25zdCBjaGFyKiBjbGFzc19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OkJvb2xlYW4+JiBpbmZvKSB7Ci0gIENKU19SdW50aW1lKiBwUnVudGltZSA9Ci0gICAgICBDSlNfUnVudGltZTo6Q3VycmVudFJ1bnRpbWVGcm9tSXNvbGF0ZShpbmZvLkdldElzb2xhdGUoKSk7Ci0gIGlmICghcFJ1bnRpbWUpCi0gICAgcmV0dXJuOwotCi0gIENKU19PYmplY3QqIHBKU09iaiA9Ci0gICAgICBzdGF0aWNfY2FzdDxDSlNfT2JqZWN0Kj4ocFJ1bnRpbWUtPkdldE9iamVjdFByaXZhdGUoaW5mby5Ib2xkZXIoKSkpOwotICBpZiAoIXBKU09iaikKLSAgICByZXR1cm47Ci0KLSAgQWx0KiBwT2JqID0gcmVpbnRlcnByZXRfY2FzdDxBbHQqPihwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpOwotICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgdXRmOF92YWx1ZShwcm9wZXJ0eSk7Ci0gIENGWF9XaWRlU3RyaW5nIHByb3BuYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KAotICAgICAgQ0ZYX0J5dGVTdHJpbmdDKCp1dGY4X3ZhbHVlLCB1dGY4X3ZhbHVlLmxlbmd0aCgpKSk7Ci0gIENGWF9XaWRlU3RyaW5nIHNFcnJvcjsKLSAgaWYgKCFwT2JqLT5EZWxQcm9wZXJ0eShwUnVudGltZSwgcHJvcG5hbWUuY19zdHIoKSwgc0Vycm9yKSkgewotICAgIENGWF9CeXRlU3RyaW5nIGNiTmFtZTsKLSAgICBjYk5hbWUuRm9ybWF0KCIlcy4lcyIsIGNsYXNzX25hbWUsICJEZWxQcm9wZXJ0eSIpOwotICAgIC8vIFByb2JhYmx5IGEgbWlzc2luZyBjYWxsIHRvIEpTRlhfRXJyb3IoKS4KLSAgfQotfQotCi10ZW1wbGF0ZSA8Ym9vbCAoKkYpKENKU19SdW50aW1lKiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYsCi0gICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYsCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJik+Ci12b2lkIEpTR2xvYmFsRnVuYyhjb25zdCBjaGFyKiBmdW5jX25hbWVfc3RyaW5nLAotICAgICAgICAgICAgICAgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsKLSAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0KLSAgICAgIENKU19SdW50aW1lOjpDdXJyZW50UnVudGltZUZyb21Jc29sYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsKLSAgaWYgKCFwUnVudGltZSkKLSAgICByZXR1cm47Ci0gIHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4gcGFyYW1ldGVyczsKLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCAodW5zaWduZWQgaW50KWluZm8uTGVuZ3RoKCk7IGkrKykgewotICAgIHBhcmFtZXRlcnMucHVzaF9iYWNrKENKU19WYWx1ZShwUnVudGltZSwgaW5mb1tpXSkpOwotICB9Ci0gIENKU19WYWx1ZSB2YWx1ZVJlcyhwUnVudGltZSk7Ci0gIENGWF9XaWRlU3RyaW5nIHNFcnJvcjsKLSAgaWYgKCEoKkYpKHBSdW50aW1lLCBwYXJhbWV0ZXJzLCB2YWx1ZVJlcywgc0Vycm9yKSkgewotICAgIHBSdW50aW1lLT5FcnJvcihKU0Zvcm1hdEVycm9yU3RyaW5nKGZ1bmNfbmFtZV9zdHJpbmcsIG51bGxwdHIsIHNFcnJvcikpOwotICAgIHJldHVybjsKLSAgfQotICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KHZhbHVlUmVzLlRvVjhWYWx1ZShwUnVudGltZSkpOwotfQotCi0jZGVmaW5lIEpTX1NUQVRJQ19HTE9CQUxfRlVOKGZ1bl9uYW1lKSAgICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyB2b2lkIGZ1bl9uYW1lIyNfc3RhdGljKCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgeyBcCi0gICAgSlNHbG9iYWxGdW5jPGZ1bl9uYW1lPigjZnVuX25hbWUsIGluZm8pOyAgICAgICAgICAgICBcCi0gIH0KLQotI2RlZmluZSBKU19TVEFUSUNfREVDTEFSRV9HTE9CQUxfRlVOKCkgICAgICAgXAotICBzdGF0aWMgSlNNZXRob2RTcGVjIEdsb2JhbEZ1bmN0aW9uU3BlY3NbXTsgXAotICBzdGF0aWMgdm9pZCBEZWZpbmVKU09iamVjdHMoQ0ZYSlNfRW5naW5lKiBwRW5naW5lKQotCi0jZGVmaW5lIElNUExFTUVOVF9KU19TVEFUSUNfR0xPQkFMX0ZVTihqc19jbGFzc19uYW1lKSAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkIGpzX2NsYXNzX25hbWU6OkRlZmluZUpTT2JqZWN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUpIHsgICAgICAgICAgIFwKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShHbG9iYWxGdW5jdGlvblNwZWNzKSAtIDE7ICsraSkgeyBcCi0gICAgICBwRW5naW5lLT5EZWZpbmVHbG9iYWxNZXRob2QoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGpzX2NsYXNzX25hbWU6Okdsb2JhbEZ1bmN0aW9uU3BlY3NbaV0ucE5hbWUsICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBqc19jbGFzc19uYW1lOjpHbG9iYWxGdW5jdGlvblNwZWNzW2ldLnBNZXRob2RDYWxsKTsgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAgLy8gRlBERlNES19KQVZBU0NSSVBUX0pTX0RFRklORV9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5jcHAgYi9mcGRmc2RrL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQxYzhlMi4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY1MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmgiCi0KLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvRmllbGQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX09iamVjdC5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19WYWx1ZS5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9janNfZXZlbnRfY29udGV4dC5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9janNfcnVudGltZS5oIgotCi1DSlNfRXZlbnRIYW5kbGVyOjpDSlNfRXZlbnRIYW5kbGVyKENKU19FdmVudENvbnRleHQqIHBDb250ZXh0KQotICAgIDogbV9wSlNFdmVudENvbnRleHQocENvbnRleHQpLAotICAgICAgbV9lRXZlbnRUeXBlKEpFVF9VTktOT1dOKSwKLSAgICAgIG1fYlZhbGlkKGZhbHNlKSwKLSAgICAgIG1fcFdpZGVTdHJDaGFuZ2UobnVsbHB0ciksCi0gICAgICBtX25Db21taXRLZXkoLTEpLAotICAgICAgbV9iS2V5RG93bihmYWxzZSksCi0gICAgICBtX2JNb2RpZmllcihmYWxzZSksCi0gICAgICBtX2JTaGlmdChmYWxzZSksCi0gICAgICBtX3BJU2VsRW5kKG51bGxwdHIpLAotICAgICAgbV9uU2VsRW5kRHUoMCksCi0gICAgICBtX3BJU2VsU3RhcnQobnVsbHB0ciksCi0gICAgICBtX25TZWxTdGFydER1KDApLAotICAgICAgbV9iV2lsbENvbW1pdChmYWxzZSksCi0gICAgICBtX3BWYWx1ZShudWxscHRyKSwKLSAgICAgIG1fYkZpZWxkRnVsbChmYWxzZSksCi0gICAgICBtX3BiUmMobnVsbHB0ciksCi0gICAgICBtX2JSY0R1KGZhbHNlKSwKLSAgICAgIG1fcFRhcmdldEJvb2tNYXJrKG51bGxwdHIpLAotICAgICAgbV9wVGFyZ2V0Rm9ybUZpbGxFbnYobnVsbHB0ciksCi0gICAgICBtX3BUYXJnZXRBbm5vdChudWxscHRyKSB7fQotCi1DSlNfRXZlbnRIYW5kbGVyOjp+Q0pTX0V2ZW50SGFuZGxlcigpIHt9Ci0KLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25BcHBfSW5pdCgpIHsKLSAgSW5pdGlhbChKRVRfQVBQX0lOSVQpOwotfQotCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRG9jX09wZW4oQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clRhcmdldE5hbWUpIHsKLSAgSW5pdGlhbChKRVRfRE9DX09QRU4pOwotICBtX3BUYXJnZXRGb3JtRmlsbEVudi5SZXNldChwRm9ybUZpbGxFbnYpOwotICBtX3N0clRhcmdldE5hbWUgPSBzdHJUYXJnZXROYW1lOwotfQotCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRG9jX1dpbGxQcmludCgKLSAgICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgewotICBJbml0aWFsKEpFVF9ET0NfV0lMTFBSSU5UKTsKLSAgbV9wVGFyZ2V0Rm9ybUZpbGxFbnYuUmVzZXQocEZvcm1GaWxsRW52KTsKLX0KLQotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkRvY19EaWRQcmludCgKLSAgICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgewotICBJbml0aWFsKEpFVF9ET0NfRElEUFJJTlQpOwotICBtX3BUYXJnZXRGb3JtRmlsbEVudi5SZXNldChwRm9ybUZpbGxFbnYpOwotfQotCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRG9jX1dpbGxTYXZlKAotICAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSB7Ci0gIEluaXRpYWwoSkVUX0RPQ19XSUxMU0FWRSk7Ci0gIG1fcFRhcmdldEZvcm1GaWxsRW52LlJlc2V0KHBGb3JtRmlsbEVudik7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25Eb2NfRGlkU2F2ZSgKLSAgICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgewotICBJbml0aWFsKEpFVF9ET0NfRElEU0FWRSk7Ci0gIG1fcFRhcmdldEZvcm1GaWxsRW52LlJlc2V0KHBGb3JtRmlsbEVudik7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25Eb2NfV2lsbENsb3NlKAotICAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSB7Ci0gIEluaXRpYWwoSkVUX0RPQ19XSUxMQ0xPU0UpOwotICBtX3BUYXJnZXRGb3JtRmlsbEVudi5SZXNldChwRm9ybUZpbGxFbnYpOwotfQotCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uUGFnZV9PcGVuKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSB7Ci0gIEluaXRpYWwoSkVUX1BBR0VfT1BFTik7Ci0gIG1fcFRhcmdldEZvcm1GaWxsRW52LlJlc2V0KHBGb3JtRmlsbEVudik7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25QYWdlX0Nsb3NlKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSB7Ci0gIEluaXRpYWwoSkVUX1BBR0VfQ0xPU0UpOwotICBtX3BUYXJnZXRGb3JtRmlsbEVudi5SZXNldChwRm9ybUZpbGxFbnYpOwotfQotCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uUGFnZV9JblZpZXcoCi0gICAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIHsKLSAgSW5pdGlhbChKRVRfUEFHRV9JTlZJRVcpOwotICBtX3BUYXJnZXRGb3JtRmlsbEVudi5SZXNldChwRm9ybUZpbGxFbnYpOwotfQotCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uUGFnZV9PdXRWaWV3KAotICAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSB7Ci0gIEluaXRpYWwoSkVUX1BBR0VfT1VUVklFVyk7Ci0gIG1fcFRhcmdldEZvcm1GaWxsRW52LlJlc2V0KHBGb3JtRmlsbEVudik7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9Nb3VzZUVudGVyKGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgewotICBJbml0aWFsKEpFVF9GSUVMRF9NT1VTRUVOVEVSKTsKLQotICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKLSAgbV9iU2hpZnQgPSBiU2hpZnQ7Ci0KLSAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKLX0KLQotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX01vdXNlRXhpdChib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSB7Ci0gIEluaXRpYWwoSkVUX0ZJRUxEX01PVVNFRVhJVCk7Ci0KLSAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7Ci0gIG1fYlNoaWZ0ID0gYlNoaWZ0OwotICBtX3N0clRhcmdldE5hbWUgPSBwVGFyZ2V0LT5HZXRGdWxsTmFtZSgpOwotfQotCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfTW91c2VEb3duKGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpIHsKLSAgSW5pdGlhbChKRVRfRklFTERfTU9VU0VET1dOKTsKLSAgbV9lRXZlbnRUeXBlID0gSkVUX0ZJRUxEX01PVVNFRE9XTjsKLQotICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKLSAgbV9iU2hpZnQgPSBiU2hpZnQ7Ci0gIG1fc3RyVGFyZ2V0TmFtZSA9IHBUYXJnZXQtPkdldEZ1bGxOYW1lKCk7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9Nb3VzZVVwKGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgewotICBJbml0aWFsKEpFVF9GSUVMRF9NT1VTRVVQKTsKLQotICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKLSAgbV9iU2hpZnQgPSBiU2hpZnQ7Ci0gIG1fc3RyVGFyZ2V0TmFtZSA9IHBUYXJnZXQtPkdldEZ1bGxOYW1lKCk7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9Gb2N1cyhib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpIHsKLSAgSW5pdGlhbChKRVRfRklFTERfRk9DVVMpOwotCi0gIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOwotICBtX2JTaGlmdCA9IGJTaGlmdDsKLSAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKLSAgbV9wVmFsdWUgPSAoQ0ZYX1dpZGVTdHJpbmcqKSZWYWx1ZTsKLX0KLQotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX0JsdXIoYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKSB7Ci0gIEluaXRpYWwoSkVUX0ZJRUxEX0JMVVIpOwotCi0gIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOwotICBtX2JTaGlmdCA9IGJTaGlmdDsKLSAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKLSAgbV9wVmFsdWUgPSAoQ0ZYX1dpZGVTdHJpbmcqKSZWYWx1ZTsKLX0KLQotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX0tleXN0cm9rZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgS2V5RG93biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgblNlbEVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2VsU3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJXaWxsQ29tbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGaWVsZEZ1bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJSYykgewotICBJbml0aWFsKEpFVF9GSUVMRF9LRVlTVFJPS0UpOwotCi0gIG1fbkNvbW1pdEtleSA9IDA7Ci0gIG1fcFdpZGVTdHJDaGFuZ2UgPSAmc3RyQ2hhbmdlOwotICBtX1dpZGVTdHJDaGFuZ2VFeCA9IHN0ckNoYW5nZUV4OwotICBtX2JLZXlEb3duID0gS2V5RG93bjsKLSAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7Ci0gIG1fcElTZWxFbmQgPSAmblNlbEVuZDsKLSAgbV9wSVNlbFN0YXJ0ID0gJm5TZWxTdGFydDsKLSAgbV9iU2hpZnQgPSBiU2hpZnQ7Ci0gIG1fc3RyVGFyZ2V0TmFtZSA9IHBUYXJnZXQtPkdldEZ1bGxOYW1lKCk7Ci0gIG1fcFZhbHVlID0gJlZhbHVlOwotICBtX2JXaWxsQ29tbWl0ID0gYldpbGxDb21taXQ7Ci0gIG1fcGJSYyA9ICZiUmM7Ci0gIG1fYkZpZWxkRnVsbCA9IGJGaWVsZEZ1bGw7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9WYWxpZGF0ZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJLZXlEb3duLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiUmMpIHsKLSAgSW5pdGlhbChKRVRfRklFTERfVkFMSURBVEUpOwotCi0gIG1fcFdpZGVTdHJDaGFuZ2UgPSAmc3RyQ2hhbmdlOwotICBtX1dpZGVTdHJDaGFuZ2VFeCA9IHN0ckNoYW5nZUV4OwotICBtX2JLZXlEb3duID0gYktleURvd247Ci0gIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOwotICBtX2JTaGlmdCA9IGJTaGlmdDsKLSAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKLSAgbV9wVmFsdWUgPSAmVmFsdWU7Ci0gIG1fcGJSYyA9ICZiUmM7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJSYykgewotICBJbml0aWFsKEpFVF9GSUVMRF9DQUxDVUxBVEUpOwotCi0gIGlmIChwU291cmNlKQotICAgIG1fc3RyU291cmNlTmFtZSA9IHBTb3VyY2UtPkdldEZ1bGxOYW1lKCk7Ci0gIG1fc3RyVGFyZ2V0TmFtZSA9IHBUYXJnZXQtPkdldEZ1bGxOYW1lKCk7Ci0gIG1fcFZhbHVlID0gJlZhbHVlOwotICBtX3BiUmMgPSAmYlJjOwotfQotCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYldpbGxDb21taXQpIHsKLSAgSW5pdGlhbChKRVRfRklFTERfRk9STUFUKTsKLQotICBtX25Db21taXRLZXkgPSAwOwotICBtX3N0clRhcmdldE5hbWUgPSBwVGFyZ2V0LT5HZXRGdWxsTmFtZSgpOwotICBtX3BWYWx1ZSA9ICZWYWx1ZTsKLSAgbV9iV2lsbENvbW1pdCA9IGJXaWxsQ29tbWl0OwotfQotCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX0ZvY3VzKGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgewotICBJbml0aWFsKEpFVF9TQ1JFRU5fRk9DVVMpOwotCi0gIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOwotICBtX2JTaGlmdCA9IGJTaGlmdDsKLSAgbV9wVGFyZ2V0QW5ub3QuUmVzZXQocFNjcmVlbik7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fQmx1cihib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7Ci0gIEluaXRpYWwoSkVUX1NDUkVFTl9CTFVSKTsKLQotICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKLSAgbV9iU2hpZnQgPSBiU2hpZnQ7Ci0gIG1fcFRhcmdldEFubm90LlJlc2V0KHBTY3JlZW4pOwotfQotCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX09wZW4oYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgewotICBJbml0aWFsKEpFVF9TQ1JFRU5fT1BFTik7Ci0KLSAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7Ci0gIG1fYlNoaWZ0ID0gYlNoaWZ0OwotICBtX3BUYXJnZXRBbm5vdC5SZXNldChwU2NyZWVuKTsKLX0KLQotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9DbG9zZShib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKLSAgSW5pdGlhbChKRVRfU0NSRUVOX0NMT1NFKTsKLQotICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKLSAgbV9iU2hpZnQgPSBiU2hpZnQ7Ci0gIG1fcFRhcmdldEFubm90LlJlc2V0KHBTY3JlZW4pOwotfQotCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX01vdXNlRG93bihib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgewotICBJbml0aWFsKEpFVF9TQ1JFRU5fTU9VU0VET1dOKTsKLQotICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKLSAgbV9iU2hpZnQgPSBiU2hpZnQ7Ci0gIG1fcFRhcmdldEFubm90LlJlc2V0KHBTY3JlZW4pOwotfQotCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX01vdXNlVXAoYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgewotICBJbml0aWFsKEpFVF9TQ1JFRU5fTU9VU0VVUCk7Ci0KLSAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7Ci0gIG1fYlNoaWZ0ID0gYlNoaWZ0OwotICBtX3BUYXJnZXRBbm5vdC5SZXNldChwU2NyZWVuKTsKLX0KLQotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Nb3VzZUVudGVyKGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKLSAgSW5pdGlhbChKRVRfU0NSRUVOX01PVVNFRU5URVIpOwotCi0gIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOwotICBtX2JTaGlmdCA9IGJTaGlmdDsKLSAgbV9wVGFyZ2V0QW5ub3QuUmVzZXQocFNjcmVlbik7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fTW91c2VFeGl0KGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7Ci0gIEluaXRpYWwoSkVUX1NDUkVFTl9NT1VTRUVYSVQpOwotCi0gIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOwotICBtX2JTaGlmdCA9IGJTaGlmdDsKLSAgbV9wVGFyZ2V0QW5ub3QuUmVzZXQocFNjcmVlbik7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fSW5WaWV3KGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7Ci0gIEluaXRpYWwoSkVUX1NDUkVFTl9JTlZJRVcpOwotICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKLSAgbV9iU2hpZnQgPSBiU2hpZnQ7Ci0gIG1fcFRhcmdldEFubm90LlJlc2V0KHBTY3JlZW4pOwotfQotCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX091dFZpZXcoYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgewotICBJbml0aWFsKEpFVF9TQ1JFRU5fT1VUVklFVyk7Ci0gIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOwotICBtX2JTaGlmdCA9IGJTaGlmdDsKLSAgbV9wVGFyZ2V0QW5ub3QuUmVzZXQocFNjcmVlbik7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25MaW5rX01vdXNlVXAoCi0gICAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwVGFyZ2V0Rm9ybUZpbGxFbnYpIHsKLSAgSW5pdGlhbChKRVRfTElOS19NT1VTRVVQKTsKLSAgbV9wVGFyZ2V0Rm9ybUZpbGxFbnYuUmVzZXQocFRhcmdldEZvcm1GaWxsRW52KTsKLX0KLQotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkJvb2ttYXJrX01vdXNlVXAoQ1BERl9Cb29rbWFyayogcEJvb2tNYXJrKSB7Ci0gIEluaXRpYWwoSkVUX0JPT0tNQVJLX01PVVNFVVApOwotICBtX3BUYXJnZXRCb29rTWFyayA9IHBCb29rTWFyazsKLX0KLQotdm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbk1lbnVfRXhlYygKLSAgICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBUYXJnZXRGb3JtRmlsbEVudiwKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVGFyZ2V0TmFtZSkgewotICBJbml0aWFsKEpFVF9NRU5VX0VYRUMpOwotICBtX3BUYXJnZXRGb3JtRmlsbEVudi5SZXNldChwVGFyZ2V0Rm9ybUZpbGxFbnYpOwotICBtX3N0clRhcmdldE5hbWUgPSBzdHJUYXJnZXROYW1lOwotfQotCi12b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRXh0ZXJuYWxfRXhlYygpIHsKLSAgSW5pdGlhbChKRVRfRVhURVJOQUxfRVhFQyk7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25CYXRjaEV4ZWMoCi0gICAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwVGFyZ2V0Rm9ybUZpbGxFbnYpIHsKLSAgSW5pdGlhbChKRVRfQkFUQ0hfRVhFQyk7Ci0gIG1fcFRhcmdldEZvcm1GaWxsRW52LlJlc2V0KHBUYXJnZXRGb3JtRmlsbEVudik7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25Db25zb2xlX0V4ZWMoKSB7Ci0gIEluaXRpYWwoSkVUX0NPTlNPTEVfRVhFQyk7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6SW5pdGlhbChKU19FVkVOVF9UIHR5cGUpIHsKLSAgbV9lRXZlbnRUeXBlID0gdHlwZTsKLQotICBtX3N0clRhcmdldE5hbWUgPSBMIiI7Ci0gIG1fc3RyU291cmNlTmFtZSA9IEwiIjsKLSAgbV9wV2lkZVN0ckNoYW5nZSA9IG51bGxwdHI7Ci0gIG1fV2lkZVN0ckNoYW5nZUR1ID0gTCIiOwotICBtX1dpZGVTdHJDaGFuZ2VFeCA9IEwiIjsKLSAgbV9uQ29tbWl0S2V5ID0gLTE7Ci0gIG1fYktleURvd24gPSBmYWxzZTsKLSAgbV9iTW9kaWZpZXIgPSBmYWxzZTsKLSAgbV9iU2hpZnQgPSBmYWxzZTsKLSAgbV9wSVNlbEVuZCA9IG51bGxwdHI7Ci0gIG1fblNlbEVuZER1ID0gMDsKLSAgbV9wSVNlbFN0YXJ0ID0gbnVsbHB0cjsKLSAgbV9uU2VsU3RhcnREdSA9IDA7Ci0gIG1fYldpbGxDb21taXQgPSBmYWxzZTsKLSAgbV9wVmFsdWUgPSBudWxscHRyOwotICBtX2JGaWVsZEZ1bGwgPSBmYWxzZTsKLSAgbV9wYlJjID0gbnVsbHB0cjsKLSAgbV9iUmNEdSA9IGZhbHNlOwotCi0gIG1fcFRhcmdldEJvb2tNYXJrID0gbnVsbHB0cjsKLSAgbV9wVGFyZ2V0Rm9ybUZpbGxFbnYuUmVzZXQoKTsKLSAgbV9wVGFyZ2V0QW5ub3QuUmVzZXQoKTsKLQotICBtX2JWYWxpZCA9IHRydWU7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6RGVzdHJveSgpIHsKLSAgbV9iVmFsaWQgPSBmYWxzZTsKLX0KLQotYm9vbCBDSlNfRXZlbnRIYW5kbGVyOjpJc1ZhbGlkKCkgewotICByZXR1cm4gbV9iVmFsaWQ7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nJiBDSlNfRXZlbnRIYW5kbGVyOjpDaGFuZ2UoKSB7Ci0gIGlmIChtX3BXaWRlU3RyQ2hhbmdlKSB7Ci0gICAgcmV0dXJuICptX3BXaWRlU3RyQ2hhbmdlOwotICB9Ci0gIHJldHVybiBtX1dpZGVTdHJDaGFuZ2VEdTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ0pTX0V2ZW50SGFuZGxlcjo6Q2hhbmdlRXgoKSB7Ci0gIHJldHVybiBtX1dpZGVTdHJDaGFuZ2VFeDsKLX0KLQotaW50IENKU19FdmVudEhhbmRsZXI6OkNvbW1pdEtleSgpIHsKLSAgcmV0dXJuIG1fbkNvbW1pdEtleTsKLX0KLQotYm9vbCBDSlNfRXZlbnRIYW5kbGVyOjpGaWVsZEZ1bGwoKSB7Ci0gIHJldHVybiBtX2JGaWVsZEZ1bGw7Ci19Ci0KLWJvb2wgQ0pTX0V2ZW50SGFuZGxlcjo6S2V5RG93bigpIHsKLSAgcmV0dXJuIG1fYktleURvd247Ci19Ci0KLWJvb2wgQ0pTX0V2ZW50SGFuZGxlcjo6TW9kaWZpZXIoKSB7Ci0gIHJldHVybiBtX2JNb2RpZmllcjsKLX0KLQotY29uc3QgRlhfV0NIQVIqIENKU19FdmVudEhhbmRsZXI6Ok5hbWUoKSB7Ci0gIHN3aXRjaCAobV9lRXZlbnRUeXBlKSB7Ci0gICAgY2FzZSBKRVRfQVBQX0lOSVQ6Ci0gICAgICByZXR1cm4gTCJJbml0IjsKLSAgICBjYXNlIEpFVF9CQVRDSF9FWEVDOgotICAgICAgcmV0dXJuIEwiRXhlYyI7Ci0gICAgY2FzZSBKRVRfQk9PS01BUktfTU9VU0VVUDoKLSAgICAgIHJldHVybiBMIk1vdXNlIFVwIjsKLSAgICBjYXNlIEpFVF9DT05TT0xFX0VYRUM6Ci0gICAgICByZXR1cm4gTCJFeGVjIjsKLSAgICBjYXNlIEpFVF9ET0NfRElEUFJJTlQ6Ci0gICAgICByZXR1cm4gTCJEaWRQcmludCI7Ci0gICAgY2FzZSBKRVRfRE9DX0RJRFNBVkU6Ci0gICAgICByZXR1cm4gTCJEaWRTYXZlIjsKLSAgICBjYXNlIEpFVF9ET0NfT1BFTjoKLSAgICAgIHJldHVybiBMIk9wZW4iOwotICAgIGNhc2UgSkVUX0RPQ19XSUxMQ0xPU0U6Ci0gICAgICByZXR1cm4gTCJXaWxsQ2xvc2UiOwotICAgIGNhc2UgSkVUX0RPQ19XSUxMUFJJTlQ6Ci0gICAgICByZXR1cm4gTCJXaWxsUHJpbnQiOwotICAgIGNhc2UgSkVUX0RPQ19XSUxMU0FWRToKLSAgICAgIHJldHVybiBMIldpbGxTYXZlIjsKLSAgICBjYXNlIEpFVF9FWFRFUk5BTF9FWEVDOgotICAgICAgcmV0dXJuIEwiRXhlYyI7Ci0gICAgY2FzZSBKRVRfRklFTERfRk9DVVM6Ci0gICAgY2FzZSBKRVRfU0NSRUVOX0ZPQ1VTOgotICAgICAgcmV0dXJuIEwiRm9jdXMiOwotICAgIGNhc2UgSkVUX0ZJRUxEX0JMVVI6Ci0gICAgY2FzZSBKRVRfU0NSRUVOX0JMVVI6Ci0gICAgICByZXR1cm4gTCJCbHVyIjsKLSAgICBjYXNlIEpFVF9GSUVMRF9NT1VTRURPV046Ci0gICAgY2FzZSBKRVRfU0NSRUVOX01PVVNFRE9XTjoKLSAgICAgIHJldHVybiBMIk1vdXNlIERvd24iOwotICAgIGNhc2UgSkVUX0ZJRUxEX01PVVNFVVA6Ci0gICAgY2FzZSBKRVRfU0NSRUVOX01PVVNFVVA6Ci0gICAgICByZXR1cm4gTCJNb3VzZSBVcCI7Ci0gICAgY2FzZSBKRVRfRklFTERfTU9VU0VFTlRFUjoKLSAgICBjYXNlIEpFVF9TQ1JFRU5fTU9VU0VFTlRFUjoKLSAgICAgIHJldHVybiBMIk1vdXNlIEVudGVyIjsKLSAgICBjYXNlIEpFVF9GSUVMRF9NT1VTRUVYSVQ6Ci0gICAgY2FzZSBKRVRfU0NSRUVOX01PVVNFRVhJVDoKLSAgICAgIHJldHVybiBMIk1vdXNlIEV4aXQiOwotICAgIGNhc2UgSkVUX0ZJRUxEX0NBTENVTEFURToKLSAgICAgIHJldHVybiBMIkNhbGN1bGF0ZSI7Ci0gICAgY2FzZSBKRVRfRklFTERfRk9STUFUOgotICAgICAgcmV0dXJuIEwiRm9ybWF0IjsKLSAgICBjYXNlIEpFVF9GSUVMRF9LRVlTVFJPS0U6Ci0gICAgICByZXR1cm4gTCJLZXlzdHJva2UiOwotICAgIGNhc2UgSkVUX0ZJRUxEX1ZBTElEQVRFOgotICAgICAgcmV0dXJuIEwiVmFsaWRhdGUiOwotICAgIGNhc2UgSkVUX0xJTktfTU9VU0VVUDoKLSAgICAgIHJldHVybiBMIk1vdXNlIFVwIjsKLSAgICBjYXNlIEpFVF9NRU5VX0VYRUM6Ci0gICAgICByZXR1cm4gTCJFeGVjIjsKLSAgICBjYXNlIEpFVF9QQUdFX09QRU46Ci0gICAgY2FzZSBKRVRfU0NSRUVOX09QRU46Ci0gICAgICByZXR1cm4gTCJPcGVuIjsKLSAgICBjYXNlIEpFVF9QQUdFX0NMT1NFOgotICAgIGNhc2UgSkVUX1NDUkVFTl9DTE9TRToKLSAgICAgIHJldHVybiBMIkNsb3NlIjsKLSAgICBjYXNlIEpFVF9TQ1JFRU5fSU5WSUVXOgotICAgIGNhc2UgSkVUX1BBR0VfSU5WSUVXOgotICAgICAgcmV0dXJuIEwiSW5WaWV3IjsKLSAgICBjYXNlIEpFVF9QQUdFX09VVFZJRVc6Ci0gICAgY2FzZSBKRVRfU0NSRUVOX09VVFZJRVc6Ci0gICAgICByZXR1cm4gTCJPdXRWaWV3IjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEwiIjsKLSAgfQotfQotCi1jb25zdCBGWF9XQ0hBUiogQ0pTX0V2ZW50SGFuZGxlcjo6VHlwZSgpIHsKLSAgc3dpdGNoIChtX2VFdmVudFR5cGUpIHsKLSAgICBjYXNlIEpFVF9BUFBfSU5JVDoKLSAgICAgIHJldHVybiBMIkFwcCI7Ci0gICAgY2FzZSBKRVRfQkFUQ0hfRVhFQzoKLSAgICAgIHJldHVybiBMIkJhdGNoIjsKLSAgICBjYXNlIEpFVF9CT09LTUFSS19NT1VTRVVQOgotICAgICAgcmV0dXJuIEwiQm9va01hcmsiOwotICAgIGNhc2UgSkVUX0NPTlNPTEVfRVhFQzoKLSAgICAgIHJldHVybiBMIkNvbnNvbGUiOwotICAgIGNhc2UgSkVUX0RPQ19ESURQUklOVDoKLSAgICBjYXNlIEpFVF9ET0NfRElEU0FWRToKLSAgICBjYXNlIEpFVF9ET0NfT1BFTjoKLSAgICBjYXNlIEpFVF9ET0NfV0lMTENMT1NFOgotICAgIGNhc2UgSkVUX0RPQ19XSUxMUFJJTlQ6Ci0gICAgY2FzZSBKRVRfRE9DX1dJTExTQVZFOgotICAgICAgcmV0dXJuIEwiRG9jIjsKLSAgICBjYXNlIEpFVF9FWFRFUk5BTF9FWEVDOgotICAgICAgcmV0dXJuIEwiRXh0ZXJuYWwiOwotICAgIGNhc2UgSkVUX0ZJRUxEX0JMVVI6Ci0gICAgY2FzZSBKRVRfRklFTERfRk9DVVM6Ci0gICAgY2FzZSBKRVRfRklFTERfTU9VU0VET1dOOgotICAgIGNhc2UgSkVUX0ZJRUxEX01PVVNFRU5URVI6Ci0gICAgY2FzZSBKRVRfRklFTERfTU9VU0VFWElUOgotICAgIGNhc2UgSkVUX0ZJRUxEX01PVVNFVVA6Ci0gICAgY2FzZSBKRVRfRklFTERfQ0FMQ1VMQVRFOgotICAgIGNhc2UgSkVUX0ZJRUxEX0ZPUk1BVDoKLSAgICBjYXNlIEpFVF9GSUVMRF9LRVlTVFJPS0U6Ci0gICAgY2FzZSBKRVRfRklFTERfVkFMSURBVEU6Ci0gICAgICByZXR1cm4gTCJGaWVsZCI7Ci0gICAgY2FzZSBKRVRfU0NSRUVOX0ZPQ1VTOgotICAgIGNhc2UgSkVUX1NDUkVFTl9CTFVSOgotICAgIGNhc2UgSkVUX1NDUkVFTl9PUEVOOgotICAgIGNhc2UgSkVUX1NDUkVFTl9DTE9TRToKLSAgICBjYXNlIEpFVF9TQ1JFRU5fTU9VU0VET1dOOgotICAgIGNhc2UgSkVUX1NDUkVFTl9NT1VTRVVQOgotICAgIGNhc2UgSkVUX1NDUkVFTl9NT1VTRUVOVEVSOgotICAgIGNhc2UgSkVUX1NDUkVFTl9NT1VTRUVYSVQ6Ci0gICAgY2FzZSBKRVRfU0NSRUVOX0lOVklFVzoKLSAgICBjYXNlIEpFVF9TQ1JFRU5fT1VUVklFVzoKLSAgICAgIHJldHVybiBMIlNjcmVlbiI7Ci0gICAgY2FzZSBKRVRfTElOS19NT1VTRVVQOgotICAgICAgcmV0dXJuIEwiTGluayI7Ci0gICAgY2FzZSBKRVRfTUVOVV9FWEVDOgotICAgICAgcmV0dXJuIEwiTWVudSI7Ci0gICAgY2FzZSBKRVRfUEFHRV9PUEVOOgotICAgIGNhc2UgSkVUX1BBR0VfQ0xPU0U6Ci0gICAgY2FzZSBKRVRfUEFHRV9JTlZJRVc6Ci0gICAgY2FzZSBKRVRfUEFHRV9PVVRWSUVXOgotICAgICAgcmV0dXJuIEwiUGFnZSI7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBMIiI7Ci0gIH0KLX0KLQotYm9vbCYgQ0pTX0V2ZW50SGFuZGxlcjo6UmMoKSB7Ci0gIGlmIChtX3BiUmMpIHsKLSAgICByZXR1cm4gKm1fcGJSYzsKLSAgfQotICByZXR1cm4gbV9iUmNEdTsKLX0KLQotaW50JiBDSlNfRXZlbnRIYW5kbGVyOjpTZWxFbmQoKSB7Ci0gIGlmIChtX3BJU2VsRW5kKSB7Ci0gICAgcmV0dXJuICptX3BJU2VsRW5kOwotICB9Ci0gIHJldHVybiBtX25TZWxFbmREdTsKLX0KLQotaW50JiBDSlNfRXZlbnRIYW5kbGVyOjpTZWxTdGFydCgpIHsKLSAgaWYgKG1fcElTZWxTdGFydCkgewotICAgIHJldHVybiAqbV9wSVNlbFN0YXJ0OwotICB9Ci0gIHJldHVybiBtX25TZWxTdGFydER1OwotfQotCi1ib29sIENKU19FdmVudEhhbmRsZXI6OlNoaWZ0KCkgewotICByZXR1cm4gbV9iU2hpZnQ7Ci19Ci0KLUZpZWxkKiBDSlNfRXZlbnRIYW5kbGVyOjpTb3VyY2UoKSB7Ci0gIENKU19SdW50aW1lKiBwUnVudGltZSA9IG1fcEpTRXZlbnRDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKLSAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBEb2NPYmogPQotICAgICAgcFJ1bnRpbWUtPk5ld0Z4RHluYW1pY09iaihDSlNfRG9jdW1lbnQ6Omdfbk9iakRlZm5JRCk7Ci0gIGlmIChwRG9jT2JqLklzRW1wdHkoKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcEZpZWxkT2JqID0KLSAgICAgIHBSdW50aW1lLT5OZXdGeER5bmFtaWNPYmooQ0pTX0ZpZWxkOjpnX25PYmpEZWZuSUQpOwotICBpZiAocEZpZWxkT2JqLklzRW1wdHkoKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBDSlNfRG9jdW1lbnQqIHBKU0RvY3VtZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PENKU19Eb2N1bWVudCo+KHBSdW50aW1lLT5HZXRPYmplY3RQcml2YXRlKHBEb2NPYmopKTsKLSAgQ0pTX0ZpZWxkKiBwSlNGaWVsZCA9Ci0gICAgICBzdGF0aWNfY2FzdDxDSlNfRmllbGQqPihwUnVudGltZS0+R2V0T2JqZWN0UHJpdmF0ZShwRmllbGRPYmopKTsKLQotICBEb2N1bWVudCogcERvY3VtZW50ID0gc3RhdGljX2Nhc3Q8RG9jdW1lbnQqPihwSlNEb2N1bWVudC0+R2V0RW1iZWRPYmplY3QoKSk7Ci0gIHBEb2N1bWVudC0+U2V0Rm9ybUZpbGxFbnYobV9wVGFyZ2V0Rm9ybUZpbGxFbnYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtX3BUYXJnZXRGb3JtRmlsbEVudi5HZXQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fcEpTRXZlbnRDb250ZXh0LT5HZXRGb3JtRmlsbEVudigpKTsKLQotICBGaWVsZCogcEZpZWxkID0gc3RhdGljX2Nhc3Q8RmllbGQqPihwSlNGaWVsZC0+R2V0RW1iZWRPYmplY3QoKSk7Ci0gIHBGaWVsZC0+QXR0YWNoRmllbGQocERvY3VtZW50LCBtX3N0clNvdXJjZU5hbWUpOwotICByZXR1cm4gcEZpZWxkOwotfQotCi1GaWVsZCogQ0pTX0V2ZW50SGFuZGxlcjo6VGFyZ2V0X0ZpZWxkKCkgewotICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBtX3BKU0V2ZW50Q29udGV4dC0+R2V0SlNSdW50aW1lKCk7Ci0gIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwRG9jT2JqID0KLSAgICAgIHBSdW50aW1lLT5OZXdGeER5bmFtaWNPYmooQ0pTX0RvY3VtZW50OjpnX25PYmpEZWZuSUQpOwotICBpZiAocERvY09iai5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBGaWVsZE9iaiA9Ci0gICAgICBwUnVudGltZS0+TmV3RnhEeW5hbWljT2JqKENKU19GaWVsZDo6Z19uT2JqRGVmbklEKTsKLSAgaWYgKHBGaWVsZE9iai5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgQ0pTX0RvY3VtZW50KiBwSlNEb2N1bWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxDSlNfRG9jdW1lbnQqPihwUnVudGltZS0+R2V0T2JqZWN0UHJpdmF0ZShwRG9jT2JqKSk7Ci0gIENKU19GaWVsZCogcEpTRmllbGQgPQotICAgICAgc3RhdGljX2Nhc3Q8Q0pTX0ZpZWxkKj4ocFJ1bnRpbWUtPkdldE9iamVjdFByaXZhdGUocEZpZWxkT2JqKSk7Ci0KLSAgRG9jdW1lbnQqIHBEb2N1bWVudCA9IHN0YXRpY19jYXN0PERvY3VtZW50Kj4ocEpTRG9jdW1lbnQtPkdldEVtYmVkT2JqZWN0KCkpOwotICBwRG9jdW1lbnQtPlNldEZvcm1GaWxsRW52KG1fcFRhcmdldEZvcm1GaWxsRW52Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbV9wVGFyZ2V0Rm9ybUZpbGxFbnYuR2V0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX3BKU0V2ZW50Q29udGV4dC0+R2V0Rm9ybUZpbGxFbnYoKSk7Ci0KLSAgRmllbGQqIHBGaWVsZCA9IHN0YXRpY19jYXN0PEZpZWxkKj4ocEpTRmllbGQtPkdldEVtYmVkT2JqZWN0KCkpOwotICBwRmllbGQtPkF0dGFjaEZpZWxkKHBEb2N1bWVudCwgbV9zdHJUYXJnZXROYW1lKTsKLSAgcmV0dXJuIHBGaWVsZDsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcmIENKU19FdmVudEhhbmRsZXI6OlZhbHVlKCkgewotICByZXR1cm4gKm1fcFZhbHVlOwotfQotCi1ib29sIENKU19FdmVudEhhbmRsZXI6OldpbGxDb21taXQoKSB7Ci0gIHJldHVybiBtX2JXaWxsQ29tbWl0OwotfQotCi1DRlhfV2lkZVN0cmluZyBDSlNfRXZlbnRIYW5kbGVyOjpUYXJnZXROYW1lKCkgewotICByZXR1cm4gbV9zdHJUYXJnZXROYW1lOwotfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oIGIvZnBkZnNkay9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTgzNmIwLi4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19KQVZBU0NSSVBUX0pTX0VWRU5USEFORExFUl9IXwotI2RlZmluZSBGUERGU0RLX0pBVkFTQ1JJUFRfSlNfRVZFTlRIQU5ETEVSX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX2Zvcm1maWxsZW52aXJvbm1lbnQuaCIKLQotY2xhc3MgQ0pTX0V2ZW50Q29udGV4dDsKLWNsYXNzIENQREZTREtfQW5ub3Q7Ci1jbGFzcyBDUERGX0Jvb2ttYXJrOwotY2xhc3MgQ1BERl9Gb3JtRmllbGQ7Ci1jbGFzcyBGaWVsZDsKLQotZW51bSBKU19FVkVOVF9UIHsKLSAgSkVUX1VOS05PV04sCi0gIEpFVF9BUFBfSU5JVCwKLSAgSkVUX0RPQ19PUEVOLAotICBKRVRfRE9DX1dJTExQUklOVCwKLSAgSkVUX0RPQ19ESURQUklOVCwKLSAgSkVUX0RPQ19XSUxMU0FWRSwKLSAgSkVUX0RPQ19ESURTQVZFLAotICBKRVRfRE9DX1dJTExDTE9TRSwKLSAgSkVUX1BBR0VfT1BFTiwKLSAgSkVUX1BBR0VfQ0xPU0UsCi0gIEpFVF9QQUdFX0lOVklFVywKLSAgSkVUX1BBR0VfT1VUVklFVywKLSAgSkVUX0ZJRUxEX01PVVNFRE9XTiwKLSAgSkVUX0ZJRUxEX01PVVNFVVAsCi0gIEpFVF9GSUVMRF9NT1VTRUVOVEVSLAotICBKRVRfRklFTERfTU9VU0VFWElULAotICBKRVRfRklFTERfRk9DVVMsCi0gIEpFVF9GSUVMRF9CTFVSLAotICBKRVRfRklFTERfS0VZU1RST0tFLAotICBKRVRfRklFTERfVkFMSURBVEUsCi0gIEpFVF9GSUVMRF9DQUxDVUxBVEUsCi0gIEpFVF9GSUVMRF9GT1JNQVQsCi0gIEpFVF9TQ1JFRU5fRk9DVVMsCi0gIEpFVF9TQ1JFRU5fQkxVUiwKLSAgSkVUX1NDUkVFTl9PUEVOLAotICBKRVRfU0NSRUVOX0NMT1NFLAotICBKRVRfU0NSRUVOX01PVVNFRE9XTiwKLSAgSkVUX1NDUkVFTl9NT1VTRVVQLAotICBKRVRfU0NSRUVOX01PVVNFRU5URVIsCi0gIEpFVF9TQ1JFRU5fTU9VU0VFWElULAotICBKRVRfU0NSRUVOX0lOVklFVywKLSAgSkVUX1NDUkVFTl9PVVRWSUVXLAotICBKRVRfQkFUQ0hfRVhFQywKLSAgSkVUX01FTlVfRVhFQywKLSAgSkVUX0NPTlNPTEVfRVhFQywKLSAgSkVUX0VYVEVSTkFMX0VYRUMsCi0gIEpFVF9CT09LTUFSS19NT1VTRVVQLAotICBKRVRfTElOS19NT1VTRVVQCi19OwotCi1jbGFzcyBDSlNfRXZlbnRIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENKU19FdmVudEhhbmRsZXIoQ0pTX0V2ZW50Q29udGV4dCogcENvbnRleHQpOwotICB2aXJ0dWFsIH5DSlNfRXZlbnRIYW5kbGVyKCk7Ci0KLSAgdm9pZCBPbkFwcF9Jbml0KCk7Ci0KLSAgdm9pZCBPbkRvY19PcGVuKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clRhcmdldE5hbWUpOwotICB2b2lkIE9uRG9jX1dpbGxQcmludChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudik7Ci0gIHZvaWQgT25Eb2NfRGlkUHJpbnQoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpOwotICB2b2lkIE9uRG9jX1dpbGxTYXZlKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KTsKLSAgdm9pZCBPbkRvY19EaWRTYXZlKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KTsKLSAgdm9pZCBPbkRvY19XaWxsQ2xvc2UoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpOwotCi0gIHZvaWQgT25QYWdlX09wZW4oQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpOwotICB2b2lkIE9uUGFnZV9DbG9zZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudik7Ci0gIHZvaWQgT25QYWdlX0luVmlldyhDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudik7Ci0gIHZvaWQgT25QYWdlX091dFZpZXcoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpOwotCi0gIHZvaWQgT25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJSYyk7Ci0gIHZvaWQgT25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYldpbGxDb21taXQpOwotICB2b2lkIE9uRmllbGRfS2V5c3Ryb2tlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgS2V5RG93biwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5TZWxFbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2VsU3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYldpbGxDb21taXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmllbGRGdWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJSYyk7Ci0gIHZvaWQgT25GaWVsZF9WYWxpZGF0ZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiS2V5RG93biwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJSYyk7Ci0KLSAgdm9pZCBPbkZpZWxkX01vdXNlRG93bihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KTsKLSAgdm9pZCBPbkZpZWxkX01vdXNlRW50ZXIoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCk7Ci0gIHZvaWQgT25GaWVsZF9Nb3VzZUV4aXQoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCk7Ci0gIHZvaWQgT25GaWVsZF9Nb3VzZVVwKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpOwotICB2b2lkIE9uRmllbGRfQmx1cihib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpOwotICB2b2lkIE9uRmllbGRfRm9jdXMoYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKTsKLQotICB2b2lkIE9uU2NyZWVuX0ZvY3VzKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0gIHZvaWQgT25TY3JlZW5fQmx1cihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotICB2b2lkIE9uU2NyZWVuX09wZW4oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLSAgdm9pZCBPblNjcmVlbl9DbG9zZShib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotICB2b2lkIE9uU2NyZWVuX01vdXNlRG93bihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotICB2b2lkIE9uU2NyZWVuX01vdXNlVXAoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKLSAgdm9pZCBPblNjcmVlbl9Nb3VzZUVudGVyKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0gIHZvaWQgT25TY3JlZW5fTW91c2VFeGl0KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0gIHZvaWQgT25TY3JlZW5fSW5WaWV3KGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7Ci0gIHZvaWQgT25TY3JlZW5fT3V0Vmlldyhib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOwotCi0gIHZvaWQgT25Cb29rbWFya19Nb3VzZVVwKENQREZfQm9va21hcmsqIHBCb29rTWFyayk7Ci0gIHZvaWQgT25MaW5rX01vdXNlVXAoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpOwotCi0gIHZvaWQgT25NZW51X0V4ZWMoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clRhcmdldE5hbWUpOwotICB2b2lkIE9uQmF0Y2hFeGVjKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KTsKLSAgdm9pZCBPbkNvbnNvbGVfRXhlYygpOwotICB2b2lkIE9uRXh0ZXJuYWxfRXhlYygpOwotCi0gcHVibGljOgotICB2b2lkIEluaXRpYWwoSlNfRVZFTlRfVCB0eXBlKTsKLSAgdm9pZCBEZXN0cm95KCk7Ci0gIGJvb2wgSXNWYWxpZCgpOwotCi0gIENGWF9XaWRlU3RyaW5nJiBDaGFuZ2UoKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgQ2hhbmdlRXgoKTsKLSAgaW50IENvbW1pdEtleSgpOwotICBib29sIEZpZWxkRnVsbCgpOwotICBib29sIEtleURvd24oKTsKLSAgYm9vbCBNb2RpZmllcigpOwotICBjb25zdCBGWF9XQ0hBUiogTmFtZSgpOwotICBjb25zdCBGWF9XQ0hBUiogVHlwZSgpOwotICBib29sJiBSYygpOwotICBpbnQmIFNlbEVuZCgpOwotICBpbnQmIFNlbFN0YXJ0KCk7Ci0gIGJvb2wgU2hpZnQoKTsKLSAgRmllbGQqIFNvdXJjZSgpOwotICBGaWVsZCogVGFyZ2V0X0ZpZWxkKCk7Ci0gIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSgpOwotICBib29sIFdpbGxDb21taXQoKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgVGFyZ2V0TmFtZSgpOwotCi0gIEpTX0VWRU5UX1QgRXZlbnRUeXBlKCkgeyByZXR1cm4gbV9lRXZlbnRUeXBlOyB9Ci0KLSBwdWJsaWM6Ci0gIENKU19FdmVudENvbnRleHQqIGNvbnN0IG1fcEpTRXZlbnRDb250ZXh0OyAgLy8gTm90IE93bmVkLgotICBKU19FVkVOVF9UIG1fZUV2ZW50VHlwZTsKLSAgYm9vbCBtX2JWYWxpZDsKLQotICBDRlhfV2lkZVN0cmluZyBtX3N0clRhcmdldE5hbWU7Ci0gIENGWF9XaWRlU3RyaW5nIG1fc3RyU291cmNlTmFtZTsKLSAgQ0ZYX1dpZGVTdHJpbmcqIG1fcFdpZGVTdHJDaGFuZ2U7Ci0gIENGWF9XaWRlU3RyaW5nIG1fV2lkZVN0ckNoYW5nZUR1OwotICBDRlhfV2lkZVN0cmluZyBtX1dpZGVTdHJDaGFuZ2VFeDsKLSAgaW50IG1fbkNvbW1pdEtleTsKLSAgYm9vbCBtX2JLZXlEb3duOwotICBib29sIG1fYk1vZGlmaWVyOwotICBib29sIG1fYlNoaWZ0OwotICBpbnQqIG1fcElTZWxFbmQ7Ci0gIGludCBtX25TZWxFbmREdTsKLSAgaW50KiBtX3BJU2VsU3RhcnQ7Ci0gIGludCBtX25TZWxTdGFydER1OwotICBib29sIG1fYldpbGxDb21taXQ7Ci0gIENGWF9XaWRlU3RyaW5nKiBtX3BWYWx1ZTsKLSAgYm9vbCBtX2JGaWVsZEZ1bGw7Ci0gIGJvb2wqIG1fcGJSYzsKLSAgYm9vbCBtX2JSY0R1OwotCi0gIENQREZfQm9va21hcmsqIG1fcFRhcmdldEJvb2tNYXJrOwotICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6Ok9ic2VydmVkUHRyIG1fcFRhcmdldEZvcm1GaWxsRW52OwotICBDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciBtX3BUYXJnZXRBbm5vdDsKLX07Ci0KLSNlbmRpZiAgLy8gRlBERlNES19KQVZBU0NSSVBUX0pTX0VWRU5USEFORExFUl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuY3BwIGIvZnBkZnNkay9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGQ5MjlmLi4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM5NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfR2xvYmFsRGF0YS5oIgotCi0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImNvcmUvZmRybS9jcnlwdG8vZnhfY3J5cHQuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCi0KLSNkZWZpbmUgSlNfTUFYR0xPQkFMREFUQSAoMTAyNCAqIDQgLSA4KQotCi0jZGVmaW5lIFJFQURFUl9KU19HTE9CQUxEQVRBX0ZJTEVOQU1FIEwiUmVhZGVyX0pzR2xvYmFsLkRhdGEiCi0jZGVmaW5lIFBIQU5UT01fSlNfR0xPQkFMREFUQV9GSUxFTkFNRSBMIlBoYW50b21fSnNHbG9iYWwuRGF0YSIKLSNkZWZpbmUgU0RLX0pTX0dMT0JBTERBVEFfRklMRU5BTUUgTCJTREtfSnNHbG9iYWwuRGF0YSIKLQotbmFtZXNwYWNlIHsKLQotY29uc3QgdWludDhfdCBKU19SQzRLRVlbXSA9IHsKLSAgICAweDE5LCAweGE4LCAweGU4LCAweDAxLCAweGY2LCAweGE4LCAweGI2LCAweDRkLCAweDgyLCAweDA0LCAweDQ1LCAweDZkLAotICAgIDB4YjQsIDB4Y2YsIDB4ZDcsIDB4NzcsIDB4NjcsIDB4ZjksIDB4NzUsIDB4OWYsIDB4ZjAsIDB4ZTAsIDB4MWUsIDB4NTEsCi0gICAgMHhlZSwgMHg0NiwgMHhmZCwgMHgwYiwgMHhjOSwgMHg5MywgMHgyNSwgMHg1NSwgMHg0YSwgMHhlZSwgMHhlMCwgMHgxNiwKLSAgICAweGQwLCAweGRmLCAweDhjLCAweGZhLCAweDJhLCAweGE5LCAweDQ5LCAweGZkLCAweDk3LCAweDFjLCAweDBlLCAweDIyLAotICAgIDB4MTMsIDB4MjgsIDB4N2MsIDB4YWYsIDB4YzQsIDB4ZmMsIDB4OWMsIDB4MTIsIDB4NjUsIDB4OGMsIDB4NGUsIDB4NWIsCi0gICAgMHgwNCwgMHg3NSwgMHg4OSwgMHhjOSwgMHhiMSwgMHhlZCwgMHg1MCwgMHhjYSwgMHg5NiwgMHg2ZiwgMHgxYSwgMHg3YSwKLSAgICAweGZlLCAweDU4LCAweDVkLCAweGVjLCAweDE5LCAweDRhLCAweGY2LCAweDM1LCAweDZhLCAweDk3LCAweDE0LCAweDAwLAotICAgIDB4MGUsIDB4ZDAsIDB4NmIsIDB4YmIsIDB4ZDUsIDB4NzUsIDB4NTUsIDB4OGIsIDB4NmUsIDB4NmIsIDB4MTksIDB4YTAsCi0gICAgMHhmOCwgMHg3NywgMHhkNSwgMHhhM307Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiBub24tZW1wdHksIHNldHRpbmcgc1Byb3BOYW1lCi1ib29sIFRyaW1Qcm9wTmFtZShDRlhfQnl0ZVN0cmluZyogc1Byb3BOYW1lKSB7Ci0gIHNQcm9wTmFtZS0+VHJpbUxlZnQoKTsKLSAgc1Byb3BOYW1lLT5UcmltUmlnaHQoKTsKLSAgcmV0dXJuIHNQcm9wTmFtZS0+R2V0TGVuZ3RoKCkgIT0gMDsKLX0KLQotQ0pTX0dsb2JhbERhdGEqIGdfcEluc3RhbmNlID0gbnVsbHB0cjsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotQ0pTX0dsb2JhbERhdGEqIENKU19HbG9iYWxEYXRhOjpHZXRSZXRhaW5lZEluc3RhbmNlKAotICAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEFwcCkgewotICBpZiAoIWdfcEluc3RhbmNlKSB7Ci0gICAgZ19wSW5zdGFuY2UgPSBuZXcgQ0pTX0dsb2JhbERhdGEoKTsKLSAgfQotICArK2dfcEluc3RhbmNlLT5tX1JlZkNvdW50OwotICByZXR1cm4gZ19wSW5zdGFuY2U7Ci19Ci0KLXZvaWQgQ0pTX0dsb2JhbERhdGE6OlJlbGVhc2UoKSB7Ci0gIGlmICghLS1tX1JlZkNvdW50KSB7Ci0gICAgZGVsZXRlIGdfcEluc3RhbmNlOwotICAgIGdfcEluc3RhbmNlID0gbnVsbHB0cjsKLSAgfQotfQotCi1DSlNfR2xvYmFsRGF0YTo6Q0pTX0dsb2JhbERhdGEoKQotICAgIDogbV9SZWZDb3VudCgwKSwgbV9zRmlsZVBhdGgoU0RLX0pTX0dMT0JBTERBVEFfRklMRU5BTUUpIHsKLSAgTG9hZEdsb2JhbFBlcnNpc3RlbnRWYXJpYWJsZXMoKTsKLX0KLQotQ0pTX0dsb2JhbERhdGE6On5DSlNfR2xvYmFsRGF0YSgpIHsKLSAgU2F2ZUdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKCk7Ci19Ci0KLUNKU19HbG9iYWxEYXRhOjppdGVyYXRvciBDSlNfR2xvYmFsRGF0YTo6RmluZEdsb2JhbFZhcmlhYmxlKAotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBwcm9wbmFtZSkgewotICBmb3IgKGF1dG8gaXQgPSBtX2FycmF5R2xvYmFsRGF0YS5iZWdpbigpOyBpdCAhPSBtX2FycmF5R2xvYmFsRGF0YS5lbmQoKTsKLSAgICAgICArK2l0KSB7Ci0gICAgaWYgKCgqaXQpLT5kYXRhLnNLZXkgPT0gcHJvcG5hbWUpCi0gICAgICByZXR1cm4gaXQ7Ci0gIH0KLSAgcmV0dXJuIG1fYXJyYXlHbG9iYWxEYXRhLmVuZCgpOwotfQotCi1DSlNfR2xvYmFsRGF0YTo6Y29uc3RfaXRlcmF0b3IgQ0pTX0dsb2JhbERhdGE6OkZpbmRHbG9iYWxWYXJpYWJsZSgKLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgcHJvcG5hbWUpIGNvbnN0IHsKLSAgZm9yIChhdXRvIGl0ID0gbV9hcnJheUdsb2JhbERhdGEuYmVnaW4oKTsgaXQgIT0gbV9hcnJheUdsb2JhbERhdGEuZW5kKCk7Ci0gICAgICAgKytpdCkgewotICAgIGlmICgoKml0KS0+ZGF0YS5zS2V5ID09IHByb3BuYW1lKQotICAgICAgcmV0dXJuIGl0OwotICB9Ci0gIHJldHVybiBtX2FycmF5R2xvYmFsRGF0YS5lbmQoKTsKLX0KLQotQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogQ0pTX0dsb2JhbERhdGE6OkdldEdsb2JhbFZhcmlhYmxlKAotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBwcm9wbmFtZSkgewotICBhdXRvIGl0ZXIgPSBGaW5kR2xvYmFsVmFyaWFibGUocHJvcG5hbWUpOwotICByZXR1cm4gaXRlciAhPSBtX2FycmF5R2xvYmFsRGF0YS5lbmQoKSA/IGl0ZXItPmdldCgpIDogbnVsbHB0cjsKLX0KLQotdm9pZCBDSlNfR2xvYmFsRGF0YTo6U2V0R2xvYmFsVmFyaWFibGVOdW1iZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHByb3BuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGREYXRhKSB7Ci0gIENGWF9CeXRlU3RyaW5nIHNQcm9wTmFtZShwcm9wbmFtZSk7Ci0gIGlmICghVHJpbVByb3BOYW1lKCZzUHJvcE5hbWUpKQotICAgIHJldHVybjsKLQotICBpZiAoQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcERhdGEgPSBHZXRHbG9iYWxWYXJpYWJsZShzUHJvcE5hbWUpKSB7Ci0gICAgcERhdGEtPmRhdGEublR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6TlVNQkVSOwotICAgIHBEYXRhLT5kYXRhLmREYXRhID0gZERhdGE7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSlNfR2xvYmFsRGF0YV9FbGVtZW50PiBwTmV3RGF0YShuZXcgQ0pTX0dsb2JhbERhdGFfRWxlbWVudCk7Ci0gIHBOZXdEYXRhLT5kYXRhLnNLZXkgPSBzUHJvcE5hbWU7Ci0gIHBOZXdEYXRhLT5kYXRhLm5UeXBlID0gSlNfR2xvYmFsRGF0YVR5cGU6Ok5VTUJFUjsKLSAgcE5ld0RhdGEtPmRhdGEuZERhdGEgPSBkRGF0YTsKLSAgbV9hcnJheUdsb2JhbERhdGEucHVzaF9iYWNrKHN0ZDo6bW92ZShwTmV3RGF0YSkpOwotfQotCi12b2lkIENKU19HbG9iYWxEYXRhOjpTZXRHbG9iYWxWYXJpYWJsZUJvb2xlYW4oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHByb3BuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkRhdGEpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lKHByb3BuYW1lKTsKLSAgaWYgKCFUcmltUHJvcE5hbWUoJnNQcm9wTmFtZSkpCi0gICAgcmV0dXJuOwotCi0gIGlmIChDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBwRGF0YSA9IEdldEdsb2JhbFZhcmlhYmxlKHNQcm9wTmFtZSkpIHsKLSAgICBwRGF0YS0+ZGF0YS5uVHlwZSA9IEpTX0dsb2JhbERhdGFUeXBlOjpCT09MRUFOOwotICAgIHBEYXRhLT5kYXRhLmJEYXRhID0gYkRhdGE7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSlNfR2xvYmFsRGF0YV9FbGVtZW50PiBwTmV3RGF0YShuZXcgQ0pTX0dsb2JhbERhdGFfRWxlbWVudCk7Ci0gIHBOZXdEYXRhLT5kYXRhLnNLZXkgPSBzUHJvcE5hbWU7Ci0gIHBOZXdEYXRhLT5kYXRhLm5UeXBlID0gSlNfR2xvYmFsRGF0YVR5cGU6OkJPT0xFQU47Ci0gIHBOZXdEYXRhLT5kYXRhLmJEYXRhID0gYkRhdGE7Ci0gIG1fYXJyYXlHbG9iYWxEYXRhLnB1c2hfYmFjayhzdGQ6Om1vdmUocE5ld0RhdGEpKTsKLX0KLQotdm9pZCBDSlNfR2xvYmFsRGF0YTo6U2V0R2xvYmFsVmFyaWFibGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHByb3BuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNEYXRhKSB7Ci0gIENGWF9CeXRlU3RyaW5nIHNQcm9wTmFtZShwcm9wbmFtZSk7Ci0gIGlmICghVHJpbVByb3BOYW1lKCZzUHJvcE5hbWUpKQotICAgIHJldHVybjsKLQotICBpZiAoQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcERhdGEgPSBHZXRHbG9iYWxWYXJpYWJsZShzUHJvcE5hbWUpKSB7Ci0gICAgcERhdGEtPmRhdGEublR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6U1RSSU5HOwotICAgIHBEYXRhLT5kYXRhLnNEYXRhID0gc0RhdGE7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSlNfR2xvYmFsRGF0YV9FbGVtZW50PiBwTmV3RGF0YShuZXcgQ0pTX0dsb2JhbERhdGFfRWxlbWVudCk7Ci0gIHBOZXdEYXRhLT5kYXRhLnNLZXkgPSBzUHJvcE5hbWU7Ci0gIHBOZXdEYXRhLT5kYXRhLm5UeXBlID0gSlNfR2xvYmFsRGF0YVR5cGU6OlNUUklORzsKLSAgcE5ld0RhdGEtPmRhdGEuc0RhdGEgPSBzRGF0YTsKLSAgbV9hcnJheUdsb2JhbERhdGEucHVzaF9iYWNrKHN0ZDo6bW92ZShwTmV3RGF0YSkpOwotfQotCi12b2lkIENKU19HbG9iYWxEYXRhOjpTZXRHbG9iYWxWYXJpYWJsZU9iamVjdCgKLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgcHJvcG5hbWUsCi0gICAgY29uc3QgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkmIGFycmF5KSB7Ci0gIENGWF9CeXRlU3RyaW5nIHNQcm9wTmFtZShwcm9wbmFtZSk7Ci0gIGlmICghVHJpbVByb3BOYW1lKCZzUHJvcE5hbWUpKQotICAgIHJldHVybjsKLQotICBpZiAoQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcERhdGEgPSBHZXRHbG9iYWxWYXJpYWJsZShzUHJvcE5hbWUpKSB7Ci0gICAgcERhdGEtPmRhdGEublR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6T0JKRUNUOwotICAgIHBEYXRhLT5kYXRhLm9iakRhdGEuQ29weShhcnJheSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDSlNfR2xvYmFsRGF0YV9FbGVtZW50PiBwTmV3RGF0YShuZXcgQ0pTX0dsb2JhbERhdGFfRWxlbWVudCk7Ci0gIHBOZXdEYXRhLT5kYXRhLnNLZXkgPSBzUHJvcE5hbWU7Ci0gIHBOZXdEYXRhLT5kYXRhLm5UeXBlID0gSlNfR2xvYmFsRGF0YVR5cGU6Ok9CSkVDVDsKLSAgcE5ld0RhdGEtPmRhdGEub2JqRGF0YS5Db3B5KGFycmF5KTsKLSAgbV9hcnJheUdsb2JhbERhdGEucHVzaF9iYWNrKHN0ZDo6bW92ZShwTmV3RGF0YSkpOwotfQotCi12b2lkIENKU19HbG9iYWxEYXRhOjpTZXRHbG9iYWxWYXJpYWJsZU51bGwoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHByb3BuYW1lKSB7Ci0gIENGWF9CeXRlU3RyaW5nIHNQcm9wTmFtZShwcm9wbmFtZSk7Ci0gIGlmICghVHJpbVByb3BOYW1lKCZzUHJvcE5hbWUpKQotICAgIHJldHVybjsKLQotICBpZiAoQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcERhdGEgPSBHZXRHbG9iYWxWYXJpYWJsZShzUHJvcE5hbWUpKSB7Ci0gICAgcERhdGEtPmRhdGEublR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6TlVMTE9CSjsKLSAgICByZXR1cm47Ci0gIH0KLSAgc3RkOjp1bmlxdWVfcHRyPENKU19HbG9iYWxEYXRhX0VsZW1lbnQ+IHBOZXdEYXRhKG5ldyBDSlNfR2xvYmFsRGF0YV9FbGVtZW50KTsKLSAgcE5ld0RhdGEtPmRhdGEuc0tleSA9IHNQcm9wTmFtZTsKLSAgcE5ld0RhdGEtPmRhdGEublR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6TlVMTE9CSjsKLSAgbV9hcnJheUdsb2JhbERhdGEucHVzaF9iYWNrKHN0ZDo6bW92ZShwTmV3RGF0YSkpOwotfQotCi1ib29sIENKU19HbG9iYWxEYXRhOjpTZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHByb3BuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlBlcnNpc3RlbnQpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lKHByb3BuYW1lKTsKLSAgaWYgKCFUcmltUHJvcE5hbWUoJnNQcm9wTmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBEYXRhID0gR2V0R2xvYmFsVmFyaWFibGUoc1Byb3BOYW1lKTsKLSAgaWYgKCFwRGF0YSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcERhdGEtPmJQZXJzaXN0ZW50ID0gYlBlcnNpc3RlbnQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENKU19HbG9iYWxEYXRhOjpEZWxldGVHbG9iYWxWYXJpYWJsZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgcHJvcG5hbWUpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgc1Byb3BOYW1lKHByb3BuYW1lKTsKLSAgaWYgKCFUcmltUHJvcE5hbWUoJnNQcm9wTmFtZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGF1dG8gaXRlciA9IEZpbmRHbG9iYWxWYXJpYWJsZShzUHJvcE5hbWUpOwotICBpZiAoaXRlciA9PSBtX2FycmF5R2xvYmFsRGF0YS5lbmQoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbV9hcnJheUdsb2JhbERhdGEuZXJhc2UoaXRlcik7Ci0gIHJldHVybiB0cnVlOwotfQotCi1pbnQzMl90IENKU19HbG9iYWxEYXRhOjpHZXRTaXplKCkgY29uc3QgewotICByZXR1cm4gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX2FycmF5R2xvYmFsRGF0YSk7Ci19Ci0KLUNKU19HbG9iYWxEYXRhX0VsZW1lbnQqIENKU19HbG9iYWxEYXRhOjpHZXRBdChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBHZXRTaXplKCkpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIHJldHVybiBtX2FycmF5R2xvYmFsRGF0YVtpbmRleF0uZ2V0KCk7Ci19Ci0KLXZvaWQgQ0pTX0dsb2JhbERhdGE6OkxvYWRHbG9iYWxQZXJzaXN0ZW50VmFyaWFibGVzKCkgewotICB1aW50OF90KiBwQnVmZmVyID0gbnVsbHB0cjsKLSAgaW50MzJfdCBuTGVuZ3RoID0gMDsKLQotICBMb2FkRmlsZUJ1ZmZlcihtX3NGaWxlUGF0aC5jX3N0cigpLCBwQnVmZmVyLCBuTGVuZ3RoKTsKLSAgQ1JZUFRfQXJjRm91ckNyeXB0QmxvY2socEJ1ZmZlciwgbkxlbmd0aCwgSlNfUkM0S0VZLCBzaXplb2YoSlNfUkM0S0VZKSk7Ci0KLSAgaWYgKHBCdWZmZXIpIHsKLSAgICB1aW50OF90KiBwID0gcEJ1ZmZlcjsKLSAgICB1aW50MTZfdCB3VHlwZSA9ICooKHVpbnQxNl90KilwKTsKLSAgICBwICs9IHNpemVvZih1aW50MTZfdCk7Ci0KLSAgICBpZiAod1R5cGUgPT0gKHVpbnQxNl90KSgoJ1gnIDw8IDgpIHwgJ0YnKSkgewotICAgICAgdWludDE2X3Qgd1ZlcnNpb24gPSAqKCh1aW50MTZfdCopcCk7Ci0gICAgICBwICs9IHNpemVvZih1aW50MTZfdCk7Ci0KLSAgICAgIEFTU0VSVCh3VmVyc2lvbiA8PSAyKTsKLQotICAgICAgdWludDMyX3QgZHdDb3VudCA9ICooKHVpbnQzMl90KilwKTsKLSAgICAgIHAgKz0gc2l6ZW9mKHVpbnQzMl90KTsKLQotICAgICAgdWludDMyX3QgZHdTaXplID0gKigodWludDMyX3QqKXApOwotICAgICAgcCArPSBzaXplb2YodWludDMyX3QpOwotCi0gICAgICBpZiAoZHdTaXplID09IG5MZW5ndGggLSBzaXplb2YodWludDE2X3QpICogMiAtIHNpemVvZih1aW50MzJfdCkgKiAyKSB7Ci0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBkd0NvdW50OyBpIDwgc3o7IGkrKykgewotICAgICAgICAgIGlmIChwID4gcEJ1ZmZlciArIG5MZW5ndGgpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIHVpbnQzMl90IGR3TmFtZUxlbiA9ICooKHVpbnQzMl90KilwKTsKLSAgICAgICAgICBwICs9IHNpemVvZih1aW50MzJfdCk7Ci0KLSAgICAgICAgICBpZiAocCArIGR3TmFtZUxlbiA+IHBCdWZmZXIgKyBuTGVuZ3RoKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBzRW50cnkgPSBDRlhfQnl0ZVN0cmluZyhwLCBkd05hbWVMZW4pOwotICAgICAgICAgIHAgKz0gc2l6ZW9mKGNoYXIpICogZHdOYW1lTGVuOwotCi0gICAgICAgICAgSlNfR2xvYmFsRGF0YVR5cGUgd0RhdGFUeXBlID0KLSAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SlNfR2xvYmFsRGF0YVR5cGU+KCooKHVpbnQxNl90KilwKSk7Ci0gICAgICAgICAgcCArPSBzaXplb2YodWludDE2X3QpOwotCi0gICAgICAgICAgc3dpdGNoICh3RGF0YVR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6Ok5VTUJFUjogewotICAgICAgICAgICAgICBkb3VibGUgZERhdGEgPSAwOwotICAgICAgICAgICAgICBzd2l0Y2ggKHdWZXJzaW9uKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB7Ci0gICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0RhdGEgPSAqKCh1aW50MzJfdCopcCk7Ci0gICAgICAgICAgICAgICAgICBwICs9IHNpemVvZih1aW50MzJfdCk7Ci0gICAgICAgICAgICAgICAgICBkRGF0YSA9IGR3RGF0YTsKLSAgICAgICAgICAgICAgICB9IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjogewotICAgICAgICAgICAgICAgICAgZERhdGEgPSAqKChkb3VibGUqKXApOwotICAgICAgICAgICAgICAgICAgcCArPSBzaXplb2YoZG91YmxlKTsKLSAgICAgICAgICAgICAgICB9IGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlTnVtYmVyKHNFbnRyeSwgZERhdGEpOwotICAgICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQoc0VudHJ5LCB0cnVlKTsKLSAgICAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpCT09MRUFOOiB7Ci0gICAgICAgICAgICAgIHVpbnQxNl90IHdEYXRhID0gKigodWludDE2X3QqKXApOwotICAgICAgICAgICAgICBwICs9IHNpemVvZih1aW50MTZfdCk7Ci0gICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlQm9vbGVhbihzRW50cnksIChib29sKSh3RGF0YSA9PSAxKSk7Ci0gICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChzRW50cnksIHRydWUpOwotICAgICAgICAgICAgfSBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6OlNUUklORzogewotICAgICAgICAgICAgICB1aW50MzJfdCBkd0xlbmd0aCA9ICooKHVpbnQzMl90KilwKTsKLSAgICAgICAgICAgICAgcCArPSBzaXplb2YodWludDMyX3QpOwotCi0gICAgICAgICAgICAgIGlmIChwICsgZHdMZW5ndGggPiBwQnVmZmVyICsgbkxlbmd0aCkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZVN0cmluZyhzRW50cnksIENGWF9CeXRlU3RyaW5nKHAsIGR3TGVuZ3RoKSk7Ci0gICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChzRW50cnksIHRydWUpOwotICAgICAgICAgICAgICBwICs9IHNpemVvZihjaGFyKSAqIGR3TGVuZ3RoOwotICAgICAgICAgICAgfSBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6Ok5VTExPQko6IHsKLSAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVOdWxsKHNFbnRyeSk7Ci0gICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChzRW50cnksIHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6T0JKRUNUOgotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgRlhfRnJlZShwQnVmZmVyKTsKLSAgfQotfQotCi12b2lkIENKU19HbG9iYWxEYXRhOjpTYXZlR2xvYmFsUGVyc2lzaXRlbnRWYXJpYWJsZXMoKSB7Ci0gIHVpbnQzMl90IG5Db3VudCA9IDA7Ci0gIENGWF9CaW5hcnlCdWYgc0RhdGE7Ci0gIGZvciAoY29uc3QgYXV0byYgcEVsZW1lbnQgOiBtX2FycmF5R2xvYmFsRGF0YSkgewotICAgIGlmIChwRWxlbWVudC0+YlBlcnNpc3RlbnQpIHsKLSAgICAgIENGWF9CaW5hcnlCdWYgc0VsZW1lbnQ7Ci0gICAgICBNYWtlQnl0ZVN0cmluZyhwRWxlbWVudC0+ZGF0YS5zS2V5LCAmcEVsZW1lbnQtPmRhdGEsIHNFbGVtZW50KTsKLSAgICAgIGlmIChzRGF0YS5HZXRTaXplKCkgKyBzRWxlbWVudC5HZXRTaXplKCkgPiBKU19NQVhHTE9CQUxEQVRBKQotICAgICAgICBicmVhazsKLQotICAgICAgc0RhdGEuQXBwZW5kQmxvY2soc0VsZW1lbnQuR2V0QnVmZmVyKCksIHNFbGVtZW50LkdldFNpemUoKSk7Ci0gICAgICBuQ291bnQrKzsKLSAgICB9Ci0gIH0KLQotICBDRlhfQmluYXJ5QnVmIHNGaWxlOwotICB1aW50MTZfdCB3VHlwZSA9ICh1aW50MTZfdCkoKCdYJyA8PCA4KSB8ICdGJyk7Ci0gIHNGaWxlLkFwcGVuZEJsb2NrKCZ3VHlwZSwgc2l6ZW9mKHVpbnQxNl90KSk7Ci0gIHVpbnQxNl90IHdWZXJzaW9uID0gMjsKLSAgc0ZpbGUuQXBwZW5kQmxvY2soJndWZXJzaW9uLCBzaXplb2YodWludDE2X3QpKTsKLSAgc0ZpbGUuQXBwZW5kQmxvY2soJm5Db3VudCwgc2l6ZW9mKHVpbnQzMl90KSk7Ci0gIHVpbnQzMl90IGR3U2l6ZSA9IHNEYXRhLkdldFNpemUoKTsKLSAgc0ZpbGUuQXBwZW5kQmxvY2soJmR3U2l6ZSwgc2l6ZW9mKHVpbnQzMl90KSk7Ci0KLSAgc0ZpbGUuQXBwZW5kQmxvY2soc0RhdGEuR2V0QnVmZmVyKCksIHNEYXRhLkdldFNpemUoKSk7Ci0KLSAgQ1JZUFRfQXJjRm91ckNyeXB0QmxvY2soc0ZpbGUuR2V0QnVmZmVyKCksIHNGaWxlLkdldFNpemUoKSwgSlNfUkM0S0VZLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSlNfUkM0S0VZKSk7Ci0gIFdyaXRlRmlsZUJ1ZmZlcihtX3NGaWxlUGF0aC5jX3N0cigpLCAoY29uc3QgRlhfQ0hBUiopc0ZpbGUuR2V0QnVmZmVyKCksCi0gICAgICAgICAgICAgICAgICBzRmlsZS5HZXRTaXplKCkpOwotfQotCi12b2lkIENKU19HbG9iYWxEYXRhOjpMb2FkRmlsZUJ1ZmZlcihjb25zdCBGWF9XQ0hBUiogc0ZpbGVQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIHBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuTGVuZ3RoKSB7Ci0gIC8vIFVuU3VwcG9ydC4KLX0KLQotdm9pZCBDSlNfR2xvYmFsRGF0YTo6V3JpdGVGaWxlQnVmZmVyKGNvbnN0IEZYX1dDSEFSKiBzRmlsZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW5ndGgpIHsKLSAgLy8gVW5TdXBwb3J0LgotfQotCi12b2lkIENKU19HbG9iYWxEYXRhOjpNYWtlQnl0ZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19LZXlWYWx1ZSogcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQmluYXJ5QnVmJiBzRGF0YSkgewotICBzd2l0Y2ggKHBEYXRhLT5uVHlwZSkgewotICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6Ok5VTUJFUjogewotICAgICAgdWludDMyX3QgZHdOYW1lTGVuID0gKHVpbnQzMl90KW5hbWUuR2V0TGVuZ3RoKCk7Ci0gICAgICBzRGF0YS5BcHBlbmRCbG9jaygmZHdOYW1lTGVuLCBzaXplb2YodWludDMyX3QpKTsKLSAgICAgIHNEYXRhLkFwcGVuZFN0cmluZyhuYW1lKTsKLSAgICAgIHNEYXRhLkFwcGVuZEJsb2NrKCZwRGF0YS0+blR5cGUsIHNpemVvZih1aW50MTZfdCkpOwotCi0gICAgICBkb3VibGUgZERhdGEgPSBwRGF0YS0+ZERhdGE7Ci0gICAgICBzRGF0YS5BcHBlbmRCbG9jaygmZERhdGEsIHNpemVvZihkb3VibGUpKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6OkJPT0xFQU46IHsKLSAgICAgIHVpbnQzMl90IGR3TmFtZUxlbiA9ICh1aW50MzJfdCluYW1lLkdldExlbmd0aCgpOwotICAgICAgc0RhdGEuQXBwZW5kQmxvY2soJmR3TmFtZUxlbiwgc2l6ZW9mKHVpbnQzMl90KSk7Ci0gICAgICBzRGF0YS5BcHBlbmRTdHJpbmcobmFtZSk7Ci0gICAgICBzRGF0YS5BcHBlbmRCbG9jaygmcERhdGEtPm5UeXBlLCBzaXplb2YodWludDE2X3QpKTsKLQotICAgICAgdWludDE2X3Qgd0RhdGEgPSAodWludDE2X3QpcERhdGEtPmJEYXRhOwotICAgICAgc0RhdGEuQXBwZW5kQmxvY2soJndEYXRhLCBzaXplb2YodWludDE2X3QpKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6OlNUUklORzogewotICAgICAgdWludDMyX3QgZHdOYW1lTGVuID0gKHVpbnQzMl90KW5hbWUuR2V0TGVuZ3RoKCk7Ci0gICAgICBzRGF0YS5BcHBlbmRCbG9jaygmZHdOYW1lTGVuLCBzaXplb2YodWludDMyX3QpKTsKLSAgICAgIHNEYXRhLkFwcGVuZFN0cmluZyhuYW1lKTsKLSAgICAgIHNEYXRhLkFwcGVuZEJsb2NrKCZwRGF0YS0+blR5cGUsIHNpemVvZih1aW50MTZfdCkpOwotCi0gICAgICB1aW50MzJfdCBkd0RhdGFMZW4gPSAodWludDMyX3QpcERhdGEtPnNEYXRhLkdldExlbmd0aCgpOwotICAgICAgc0RhdGEuQXBwZW5kQmxvY2soJmR3RGF0YUxlbiwgc2l6ZW9mKHVpbnQzMl90KSk7Ci0gICAgICBzRGF0YS5BcHBlbmRTdHJpbmcocERhdGEtPnNEYXRhKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6Ok5VTExPQko6IHsKLSAgICAgIHVpbnQzMl90IGR3TmFtZUxlbiA9ICh1aW50MzJfdCluYW1lLkdldExlbmd0aCgpOwotICAgICAgc0RhdGEuQXBwZW5kQmxvY2soJmR3TmFtZUxlbiwgc2l6ZW9mKHVpbnQzMl90KSk7Ci0gICAgICBzRGF0YS5BcHBlbmRTdHJpbmcobmFtZSk7Ci0gICAgICBzRGF0YS5BcHBlbmRCbG9jaygmcERhdGEtPm5UeXBlLCBzaXplb2YodWludDMyX3QpKTsKLSAgICB9IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuaCBiL2ZwZGZzZGsvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4OTQ3Y2QuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGUERGU0RLX0pBVkFTQ1JJUFRfSlNfR0xPQkFMREFUQV9IXwotI2RlZmluZSBGUERGU0RLX0pBVkFTQ1JJUFRfSlNfR0xPQkFMREFUQV9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfS2V5VmFsdWUuaCIKLQotY2xhc3MgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OwotCi1jbGFzcyBDSlNfR2xvYmFsRGF0YV9FbGVtZW50IHsKLSBwdWJsaWM6Ci0gIENKU19HbG9iYWxEYXRhX0VsZW1lbnQoKSB7fQotICB+Q0pTX0dsb2JhbERhdGFfRWxlbWVudCgpIHt9Ci0KLSAgQ0pTX0tleVZhbHVlIGRhdGE7Ci0gIGJvb2wgYlBlcnNpc3RlbnQ7Ci19OwotCi1jbGFzcyBDSlNfR2xvYmFsRGF0YSB7Ci0gcHVibGljOgotICBzdGF0aWMgQ0pTX0dsb2JhbERhdGEqIEdldFJldGFpbmVkSW5zdGFuY2UoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwQXBwKTsKLSAgdm9pZCBSZWxlYXNlKCk7Ci0KLSAgdm9pZCBTZXRHbG9iYWxWYXJpYWJsZU51bWJlcihjb25zdCBDRlhfQnl0ZVN0cmluZyYgcHJvcG5hbWUsIGRvdWJsZSBkRGF0YSk7Ci0gIHZvaWQgU2V0R2xvYmFsVmFyaWFibGVCb29sZWFuKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBwcm9wbmFtZSwgYm9vbCBiRGF0YSk7Ci0gIHZvaWQgU2V0R2xvYmFsVmFyaWFibGVTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHByb3BuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRGF0YSk7Ci0gIHZvaWQgU2V0R2xvYmFsVmFyaWFibGVPYmplY3QoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHByb3BuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19HbG9iYWxWYXJpYWJsZUFycmF5JiBhcnJheSk7Ci0gIHZvaWQgU2V0R2xvYmFsVmFyaWFibGVOdWxsKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBwcm9wbmFtZSk7Ci0gIGJvb2wgU2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBwcm9wbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUGVyc2lzdGVudCk7Ci0gIGJvb2wgRGVsZXRlR2xvYmFsVmFyaWFibGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHByb3BuYW1lKTsKLQotICBpbnQzMl90IEdldFNpemUoKSBjb25zdDsKLSAgQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogR2V0QXQoaW50IGluZGV4KSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIHVzaW5nIGl0ZXJhdG9yID0KLSAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDSlNfR2xvYmFsRGF0YV9FbGVtZW50Pj46Oml0ZXJhdG9yOwotICB1c2luZyBjb25zdF9pdGVyYXRvciA9Ci0gICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0pTX0dsb2JhbERhdGFfRWxlbWVudD4+Ojpjb25zdF9pdGVyYXRvcjsKLQotICBDSlNfR2xvYmFsRGF0YSgpOwotICB+Q0pTX0dsb2JhbERhdGEoKTsKLQotICB2b2lkIExvYWRHbG9iYWxQZXJzaXN0ZW50VmFyaWFibGVzKCk7Ci0gIHZvaWQgU2F2ZUdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKCk7Ci0KLSAgQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogR2V0R2xvYmFsVmFyaWFibGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNQcm9wbmFtZSk7Ci0gIGl0ZXJhdG9yIEZpbmRHbG9iYWxWYXJpYWJsZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgc1Byb3BuYW1lKTsKLSAgY29uc3RfaXRlcmF0b3IgRmluZEdsb2JhbFZhcmlhYmxlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzUHJvcG5hbWUpIGNvbnN0OwotCi0gIHZvaWQgTG9hZEZpbGVCdWZmZXIoY29uc3QgRlhfV0NIQVIqIHNGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiYgcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuTGVuZ3RoKTsKLSAgdm9pZCBXcml0ZUZpbGVCdWZmZXIoY29uc3QgRlhfV0NIQVIqIHNGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoKTsKLSAgdm9pZCBNYWtlQnl0ZVN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBDSlNfS2V5VmFsdWUqIHBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYmIHNEYXRhKTsKLQotICBzaXplX3QgbV9SZWZDb3VudDsKLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENKU19HbG9iYWxEYXRhX0VsZW1lbnQ+PiBtX2FycmF5R2xvYmFsRGF0YTsKLSAgQ0ZYX1dpZGVTdHJpbmcgbV9zRmlsZVBhdGg7Ci19OwotCi0jZW5kaWYgIC8vIEZQREZTREtfSkFWQVNDUklQVF9KU19HTE9CQUxEQVRBX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2phdmFzY3JpcHQvSlNfS2V5VmFsdWUuY3BwIGIvZnBkZnNkay9qYXZhc2NyaXB0L0pTX0tleVZhbHVlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QxZTU3NS4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2phdmFzY3JpcHQvSlNfS2V5VmFsdWUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX0tleVZhbHVlLmgiCi0KLUNKU19HbG9iYWxWYXJpYWJsZUFycmF5OjpDSlNfR2xvYmFsVmFyaWFibGVBcnJheSgpIHt9Ci0KLUNKU19HbG9iYWxWYXJpYWJsZUFycmF5Ojp+Q0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkoKSB7fQotCi12b2lkIENKU19HbG9iYWxWYXJpYWJsZUFycmF5OjpDb3B5KGNvbnN0IENKU19HbG9iYWxWYXJpYWJsZUFycmF5JiBhcnJheSkgewotICBtX0FycmF5LmNsZWFyKCk7Ci0gIGZvciAoaW50IGkgPSAwLCBzeiA9IGFycmF5LkNvdW50KCk7IGkgPCBzejsgaSsrKSB7Ci0gICAgQ0pTX0tleVZhbHVlKiBwT2xkT2JqRGF0YSA9IGFycmF5LkdldEF0KGkpOwotICAgIHN3aXRjaCAocE9sZE9iakRhdGEtPm5UeXBlKSB7Ci0gICAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpOVU1CRVI6IHsKLSAgICAgICAgQ0pTX0tleVZhbHVlKiBwTmV3T2JqRGF0YSA9IG5ldyBDSlNfS2V5VmFsdWU7Ci0gICAgICAgIHBOZXdPYmpEYXRhLT5zS2V5ID0gcE9sZE9iakRhdGEtPnNLZXk7Ci0gICAgICAgIHBOZXdPYmpEYXRhLT5uVHlwZSA9IHBPbGRPYmpEYXRhLT5uVHlwZTsKLSAgICAgICAgcE5ld09iakRhdGEtPmREYXRhID0gcE9sZE9iakRhdGEtPmREYXRhOwotICAgICAgICBBZGQocE5ld09iakRhdGEpOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6OkJPT0xFQU46IHsKLSAgICAgICAgQ0pTX0tleVZhbHVlKiBwTmV3T2JqRGF0YSA9IG5ldyBDSlNfS2V5VmFsdWU7Ci0gICAgICAgIHBOZXdPYmpEYXRhLT5zS2V5ID0gcE9sZE9iakRhdGEtPnNLZXk7Ci0gICAgICAgIHBOZXdPYmpEYXRhLT5uVHlwZSA9IHBPbGRPYmpEYXRhLT5uVHlwZTsKLSAgICAgICAgcE5ld09iakRhdGEtPmJEYXRhID0gcE9sZE9iakRhdGEtPmJEYXRhOwotICAgICAgICBBZGQocE5ld09iakRhdGEpOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6OlNUUklORzogewotICAgICAgICBDSlNfS2V5VmFsdWUqIHBOZXdPYmpEYXRhID0gbmV3IENKU19LZXlWYWx1ZTsKLSAgICAgICAgcE5ld09iakRhdGEtPnNLZXkgPSBwT2xkT2JqRGF0YS0+c0tleTsKLSAgICAgICAgcE5ld09iakRhdGEtPm5UeXBlID0gcE9sZE9iakRhdGEtPm5UeXBlOwotICAgICAgICBwTmV3T2JqRGF0YS0+c0RhdGEgPSBwT2xkT2JqRGF0YS0+c0RhdGE7Ci0gICAgICAgIEFkZChwTmV3T2JqRGF0YSk7Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6T0JKRUNUOiB7Ci0gICAgICAgIENKU19LZXlWYWx1ZSogcE5ld09iakRhdGEgPSBuZXcgQ0pTX0tleVZhbHVlOwotICAgICAgICBwTmV3T2JqRGF0YS0+c0tleSA9IHBPbGRPYmpEYXRhLT5zS2V5OwotICAgICAgICBwTmV3T2JqRGF0YS0+blR5cGUgPSBwT2xkT2JqRGF0YS0+blR5cGU7Ci0gICAgICAgIHBOZXdPYmpEYXRhLT5vYmpEYXRhLkNvcHkocE9sZE9iakRhdGEtPm9iakRhdGEpOwotICAgICAgICBBZGQocE5ld09iakRhdGEpOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6Ok5VTExPQko6IHsKLSAgICAgICAgQ0pTX0tleVZhbHVlKiBwTmV3T2JqRGF0YSA9IG5ldyBDSlNfS2V5VmFsdWU7Ci0gICAgICAgIHBOZXdPYmpEYXRhLT5zS2V5ID0gcE9sZE9iakRhdGEtPnNLZXk7Ci0gICAgICAgIHBOZXdPYmpEYXRhLT5uVHlwZSA9IHBPbGRPYmpEYXRhLT5uVHlwZTsKLSAgICAgICAgQWRkKHBOZXdPYmpEYXRhKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXk6OkFkZChDSlNfS2V5VmFsdWUqIHApIHsKLSAgbV9BcnJheS5wdXNoX2JhY2soc3RkOjp1bmlxdWVfcHRyPENKU19LZXlWYWx1ZT4ocCkpOwotfQotCi1pbnQgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXk6OkNvdW50KCkgY29uc3QgewotICByZXR1cm4gbV9BcnJheS5zaXplKCk7Ci19Ci0KLUNKU19LZXlWYWx1ZSogQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXk6OkdldEF0KGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gbV9BcnJheS5hdChpbmRleCkuZ2V0KCk7Ci19Ci0KLUNKU19LZXlWYWx1ZTo6Q0pTX0tleVZhbHVlKCkge30KLQotQ0pTX0tleVZhbHVlOjp+Q0pTX0tleVZhbHVlKCkge30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvamF2YXNjcmlwdC9KU19LZXlWYWx1ZS5oIGIvZnBkZnNkay9qYXZhc2NyaXB0L0pTX0tleVZhbHVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NzE1ODguLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9qYXZhc2NyaXB0L0pTX0tleVZhbHVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19KQVZBU0NSSVBUX0pTX0tFWVZBTFVFX0hfCi0jZGVmaW5lIEZQREZTREtfSkFWQVNDUklQVF9KU19LRVlWQUxVRV9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLQotZW51bSBjbGFzcyBKU19HbG9iYWxEYXRhVHlwZSB7IE5VTUJFUiA9IDAsIEJPT0xFQU4sIFNUUklORywgT0JKRUNULCBOVUxMT0JKIH07Ci0KLWNsYXNzIENKU19LZXlWYWx1ZTsKLQotY2xhc3MgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkgewotIHB1YmxpYzoKLSAgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkoKTsKLSAgfkNKU19HbG9iYWxWYXJpYWJsZUFycmF5KCk7Ci0KLSAgdm9pZCBBZGQoQ0pTX0tleVZhbHVlKiBwKTsKLSAgaW50IENvdW50KCkgY29uc3Q7Ci0gIENKU19LZXlWYWx1ZSogR2V0QXQoaW50IGluZGV4KSBjb25zdDsKLSAgdm9pZCBDb3B5KGNvbnN0IENKU19HbG9iYWxWYXJpYWJsZUFycmF5JiBhcnJheSk7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0pTX0tleVZhbHVlPj4gbV9BcnJheTsKLX07Ci0KLWNsYXNzIENKU19LZXlWYWx1ZSB7Ci0gcHVibGljOgotICBDSlNfS2V5VmFsdWUoKTsKLSAgfkNKU19LZXlWYWx1ZSgpOwotCi0gIENGWF9CeXRlU3RyaW5nIHNLZXk7Ci0gIEpTX0dsb2JhbERhdGFUeXBlIG5UeXBlOwotICBkb3VibGUgZERhdGE7Ci0gIGJvb2wgYkRhdGE7Ci0gIENGWF9CeXRlU3RyaW5nIHNEYXRhOwotICBDSlNfR2xvYmFsVmFyaWFibGVBcnJheSBvYmpEYXRhOwotfTsKLQotI2VuZGlmICAvLyBGUERGU0RLX0pBVkFTQ1JJUFRfSlNfS0VZVkFMVUVfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvamF2YXNjcmlwdC9KU19PYmplY3QuY3BwIGIvZnBkZnNkay9qYXZhc2NyaXB0L0pTX09iamVjdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkODY4ODkuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9qYXZhc2NyaXB0L0pTX09iamVjdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgiCi0KLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L2Nqc19ldmVudF9jb250ZXh0LmgiCi0KLUNKU19FbWJlZE9iajo6Q0pTX0VtYmVkT2JqKENKU19PYmplY3QqIHBKU09iamVjdCkgOiBtX3BKU09iamVjdChwSlNPYmplY3QpIHt9Ci0KLUNKU19FbWJlZE9iajo6fkNKU19FbWJlZE9iaigpIHsKLX0KLQotdm9pZCBGcmVlT2JqZWN0KGNvbnN0IHY4OjpXZWFrQ2FsbGJhY2tJbmZvPENKU19PYmplY3Q+JiBkYXRhKSB7Ci0gIENKU19PYmplY3QqIHBKU09iaiA9IGRhdGEuR2V0UGFyYW1ldGVyKCk7Ci0gIGRlbGV0ZSBwSlNPYmo7Ci0gIENGWEpTX0VuZ2luZTo6RnJlZU9iamVjdFByaXZhdGUoZGF0YS5HZXRJbnRlcm5hbEZpZWxkKDApKTsKLX0KLQotdm9pZCBEaXNwb3NlT2JqZWN0KGNvbnN0IHY4OjpXZWFrQ2FsbGJhY2tJbmZvPENKU19PYmplY3Q+JiBkYXRhKSB7Ci0gIENKU19PYmplY3QqIHBKU09iaiA9IGRhdGEuR2V0UGFyYW1ldGVyKCk7Ci0gIHBKU09iai0+RGlzcG9zZSgpOwotICBkYXRhLlNldFNlY29uZFBhc3NDYWxsYmFjayhGcmVlT2JqZWN0KTsKLX0KLQotQ0pTX09iamVjdDo6Q0pTX09iamVjdCh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgewotICBtX3BJc29sYXRlID0gcE9iamVjdC0+R2V0SXNvbGF0ZSgpOwotICBtX3BWOE9iamVjdC5SZXNldChtX3BJc29sYXRlLCBwT2JqZWN0KTsKLX0KLQotQ0pTX09iamVjdDo6fkNKU19PYmplY3QoKSB7fQotCi12b2lkIENKU19PYmplY3Q6Ok1ha2VXZWFrKCkgewotICBtX3BWOE9iamVjdC5TZXRXZWFrKHRoaXMsIERpc3Bvc2VPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgdjg6OldlYWtDYWxsYmFja1R5cGU6OmtJbnRlcm5hbEZpZWxkcyk7Ci19Ci0KLXZvaWQgQ0pTX09iamVjdDo6RGlzcG9zZSgpIHsKLSAgbV9wVjhPYmplY3QuUmVzZXQoKTsKLX0KLQotdm9pZCBDSlNfT2JqZWN0OjpJbml0SW5zdGFuY2UoSUpTX1J1bnRpbWUqIHBJUnVudGltZSkge30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvamF2YXNjcmlwdC9KU19PYmplY3QuaCBiL2ZwZGZzZGsvamF2YXNjcmlwdC9KU19PYmplY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU1Yzc1Yy4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19KQVZBU0NSSVBUX0pTX09CSkVDVF9IXwotI2RlZmluZSBGUERGU0RLX0pBVkFTQ1JJUFRfSlNfT0JKRUNUX0hfCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiZnBkZnNkay9mc2RrX2RlZmluZS5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9janNfcnVudGltZS5oIgotI2luY2x1ZGUgImZ4anMvZnhqc192OC5oIgotCi1jbGFzcyBDSlNfRXZlbnRDb250ZXh0OwotY2xhc3MgQ0pTX09iamVjdDsKLWNsYXNzIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDsKLQotY2xhc3MgQ0pTX0VtYmVkT2JqIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENKU19FbWJlZE9iaihDSlNfT2JqZWN0KiBwSlNPYmplY3QpOwotICB2aXJ0dWFsIH5DSlNfRW1iZWRPYmooKTsKLQotICBDSlNfT2JqZWN0KiBHZXRKU09iamVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fcEpTT2JqZWN0OyB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIENKU19PYmplY3QqIGNvbnN0IG1fcEpTT2JqZWN0OwotfTsKLQotY2xhc3MgQ0pTX09iamVjdCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDSlNfT2JqZWN0KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqZWN0KTsKLSAgdmlydHVhbCB+Q0pTX09iamVjdCgpOwotCi0gIHZvaWQgTWFrZVdlYWsoKTsKLSAgdm9pZCBEaXNwb3NlKCk7Ci0KLSAgdmlydHVhbCB2b2lkIEluaXRJbnN0YW5jZShJSlNfUnVudGltZSogcElSdW50aW1lKTsKLQotICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gVG9WOE9iamVjdCgpIHsgcmV0dXJuIG1fcFY4T2JqZWN0LkdldChtX3BJc29sYXRlKTsgfQotCi0gIC8vIFRha2VzIG93bmVyc2hpcCBvZiB8cE9ianwuCi0gIHZvaWQgU2V0RW1iZWRPYmplY3QoQ0pTX0VtYmVkT2JqKiBwT2JqKSB7IG1fcEVtYmVkT2JqLnJlc2V0KHBPYmopOyB9Ci0gIENKU19FbWJlZE9iaiogR2V0RW1iZWRPYmplY3QoKSBjb25zdCB7IHJldHVybiBtX3BFbWJlZE9iai5nZXQoKTsgfQotCi0gIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKCkgY29uc3QgeyByZXR1cm4gbV9wSXNvbGF0ZTsgfQotCi0gcHJvdGVjdGVkOgotICBzdGQ6OnVuaXF1ZV9wdHI8Q0pTX0VtYmVkT2JqPiBtX3BFbWJlZE9iajsKLSAgdjg6Okdsb2JhbDx2ODo6T2JqZWN0PiBtX3BWOE9iamVjdDsKLSAgdjg6Oklzb2xhdGUqIG1fcElzb2xhdGU7Ci19OwotCi0KLSNlbmRpZiAgLy8gRlBERlNES19KQVZBU0NSSVBUX0pTX09CSkVDVF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9qYXZhc2NyaXB0L0pTX1J1bnRpbWVfU3R1Yi5jcHAgYi9mcGRmc2RrL2phdmFzY3JpcHQvSlNfUnVudGltZV9TdHViLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNkOGNlYi4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2phdmFzY3JpcHQvSlNfUnVudGltZV9TdHViLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvaWpzX2V2ZW50X2NvbnRleHQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvaWpzX3J1bnRpbWUuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0KLWNsYXNzIENKU19FdmVudENvbnRleHRTdHViIGZpbmFsIDogcHVibGljIElKU19FdmVudENvbnRleHQgewotIHB1YmxpYzoKLSAgQ0pTX0V2ZW50Q29udGV4dFN0dWIoKSB7fQotICB+Q0pTX0V2ZW50Q29udGV4dFN0dWIoKSBvdmVycmlkZSB7fQotCi0gIC8vIElKU19FdmVudENvbnRleHQ6Ci0gIGJvb2wgUnVuU2NyaXB0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nKiBpbmZvKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdm9pZCBPbkFwcF9Jbml0KCkgb3ZlcnJpZGUge30KLSAgdm9pZCBPbkRvY19PcGVuKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clRhcmdldE5hbWUpIG92ZXJyaWRlIHt9Ci0gIHZvaWQgT25Eb2NfV2lsbFByaW50KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSBvdmVycmlkZSB7fQotICB2b2lkIE9uRG9jX0RpZFByaW50KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSBvdmVycmlkZSB7fQotICB2b2lkIE9uRG9jX1dpbGxTYXZlKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSBvdmVycmlkZSB7fQotICB2b2lkIE9uRG9jX0RpZFNhdmUoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIG92ZXJyaWRlIHt9Ci0gIHZvaWQgT25Eb2NfV2lsbENsb3NlKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSBvdmVycmlkZSB7fQotICB2b2lkIE9uUGFnZV9PcGVuKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSBvdmVycmlkZSB7fQotICB2b2lkIE9uUGFnZV9DbG9zZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgb3ZlcnJpZGUge30KLSAgdm9pZCBPblBhZ2VfSW5WaWV3KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSBvdmVycmlkZSB7fQotICB2b2lkIE9uUGFnZV9PdXRWaWV3KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSBvdmVycmlkZSB7fQotICB2b2lkIE9uRmllbGRfTW91c2VEb3duKGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSBvdmVycmlkZSB7fQotICB2b2lkIE9uRmllbGRfTW91c2VFbnRlcihib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSBvdmVycmlkZSB7fQotICB2b2lkIE9uRmllbGRfTW91c2VFeGl0KGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSBvdmVycmlkZSB7fQotICB2b2lkIE9uRmllbGRfTW91c2VVcChib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSBvdmVycmlkZSB7fQotICB2b2lkIE9uRmllbGRfRm9jdXMoYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKSBvdmVycmlkZSB7fQotICB2b2lkIE9uRmllbGRfQmx1cihib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpIG92ZXJyaWRlIHt9Ci0gIHZvaWQgT25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJSYykgb3ZlcnJpZGUge30KLSAgdm9pZCBPbkZpZWxkX0Zvcm1hdChDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCBiV2lsbENvbW1pdCkgb3ZlcnJpZGUge30KLSAgdm9pZCBPbkZpZWxkX0tleXN0cm9rZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEtleURvd24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2VsRW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgblNlbFN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJXaWxsQ29tbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZpZWxkRnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiUmMpIG92ZXJyaWRlIHt9Ci0gIHZvaWQgT25GaWVsZF9WYWxpZGF0ZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiS2V5RG93biwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJSYykgb3ZlcnJpZGUge30KLSAgdm9pZCBPblNjcmVlbl9Gb2N1cyhib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSBvdmVycmlkZSB7fQotICB2b2lkIE9uU2NyZWVuX0JsdXIoYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlIHt9Ci0gIHZvaWQgT25TY3JlZW5fT3Blbihib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgb3ZlcnJpZGUge30KLSAgdm9pZCBPblNjcmVlbl9DbG9zZShib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSBvdmVycmlkZSB7fQotICB2b2lkIE9uU2NyZWVuX01vdXNlRG93bihib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlIHt9Ci0gIHZvaWQgT25TY3JlZW5fTW91c2VVcChib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgb3ZlcnJpZGUge30KLSAgdm9pZCBPblNjcmVlbl9Nb3VzZUVudGVyKGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSBvdmVycmlkZSB7fQotICB2b2lkIE9uU2NyZWVuX01vdXNlRXhpdChib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlIHt9Ci0gIHZvaWQgT25TY3JlZW5fSW5WaWV3KGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgb3ZlcnJpZGUge30KLSAgdm9pZCBPblNjcmVlbl9PdXRWaWV3KGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSBvdmVycmlkZSB7fQotICB2b2lkIE9uQm9va21hcmtfTW91c2VVcChDUERGX0Jvb2ttYXJrKiBwQm9va01hcmspIG92ZXJyaWRlIHt9Ci0gIHZvaWQgT25MaW5rX01vdXNlVXAoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIG92ZXJyaWRlIHt9Ci0gIHZvaWQgT25NZW51X0V4ZWMoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmKSBvdmVycmlkZSB7fQotICB2b2lkIE9uQmF0Y2hFeGVjKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSBvdmVycmlkZSB7fQotICB2b2lkIE9uQ29uc29sZV9FeGVjKCkgb3ZlcnJpZGUge30KLSAgdm9pZCBPbkV4dGVybmFsX0V4ZWMoKSBvdmVycmlkZSB7fQotfTsKLQotY2xhc3MgQ0pTX1J1bnRpbWVTdHViIGZpbmFsIDogcHVibGljIElKU19SdW50aW1lIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENKU19SdW50aW1lU3R1YihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikKLSAgICAgIDogbV9wRm9ybUZpbGxFbnYocEZvcm1GaWxsRW52KSB7fQotICB+Q0pTX1J1bnRpbWVTdHViKCkgb3ZlcnJpZGUge30KLQotICBJSlNfRXZlbnRDb250ZXh0KiBOZXdFdmVudENvbnRleHQoKSBvdmVycmlkZSB7Ci0gICAgaWYgKCFtX3BDb250ZXh0KQotICAgICAgbV9wQ29udGV4dCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSlNfRXZlbnRDb250ZXh0U3R1Yj4oKTsKLSAgICByZXR1cm4gbV9wQ29udGV4dC5nZXQoKTsKLSAgfQotCi0gIHZvaWQgUmVsZWFzZUV2ZW50Q29udGV4dChJSlNfRXZlbnRDb250ZXh0KiBwQ29udGV4dCkgb3ZlcnJpZGUge30KLQotICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIEdldEZvcm1GaWxsRW52KCkgY29uc3Qgb3ZlcnJpZGUgewotICAgIHJldHVybiBtX3BGb3JtRmlsbEVudjsKLSAgfQotCi0jaWZkZWYgUERGX0VOQUJMRV9YRkEKLSAgYm9vbCBHZXRWYWx1ZUJ5TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmLCBDRlhKU0VfVmFsdWUqKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYm9vbCBTZXRWYWx1ZUJ5TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmLCBDRlhKU0VfVmFsdWUqKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0jZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCi0KLSAgaW50IEV4ZWN1dGVTY3JpcHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcqIGluZm8pIG92ZXJyaWRlIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIG1fcEZvcm1GaWxsRW52OwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0pTX0V2ZW50Q29udGV4dFN0dWI+IG1fcENvbnRleHQ7Ci19OwotCi0vLyBzdGF0aWMKLXZvaWQgSUpTX1J1bnRpbWU6OkluaXRpYWxpemUodW5zaWduZWQgaW50IHNsb3QsIHZvaWQqIGlzb2xhdGUpIHt9Ci0KLS8vIHN0YXRpYwotdm9pZCBJSlNfUnVudGltZTo6RGVzdHJveSgpIHt9Ci0KLS8vIHN0YXRpYwotSUpTX1J1bnRpbWUqIElKU19SdW50aW1lOjpDcmVhdGUoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIHsKLSAgcmV0dXJuIG5ldyBDSlNfUnVudGltZVN0dWIocEZvcm1GaWxsRW52KTsKLX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvamF2YXNjcmlwdC9KU19WYWx1ZS5jcHAgYi9mcGRmc2RrL2phdmFzY3JpcHQvSlNfVmFsdWUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDU4ODQ3Li4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvamF2YXNjcmlwdC9KU19WYWx1ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgiCi0KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y21hdGg+Ci0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9Eb2N1bWVudC5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19EZWZpbmUuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgiCi0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IHVpbnQzMl90IGdfbmFuWzJdID0gezAsIDB4N0ZGODAwMDB9OwotCi1kb3VibGUgR2V0TmFuKCkgewotICByZXR1cm4gKihkb3VibGUqKWdfbmFuOwotfQotCi1kb3VibGUKLU1ha2VEYXRlKGludCB5ZWFyLCBpbnQgbW9uLCBpbnQgZGF5LCBpbnQgaG91ciwgaW50IG1pbiwgaW50IHNlYywgaW50IG1zKSB7Ci0gIHJldHVybiBKU19NYWtlRGF0ZShKU19NYWtlRGF5KHllYXIsIG1vbiwgZGF5KSwKLSAgICAgICAgICAgICAgICAgICAgIEpTX01ha2VUaW1lKGhvdXIsIG1pbiwgc2VjLCBtcykpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotQ0pTX1ZhbHVlOjpDSlNfVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7fQotCi1DSlNfVmFsdWU6OkNKU19WYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSkKLSAgICA6IG1fcFZhbHVlKHBWYWx1ZSkge30KLQotQ0pTX1ZhbHVlOjpDSlNfVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBjb25zdCBpbnQmIGlWYWx1ZSkKLSAgICA6IG1fcFZhbHVlKHBSdW50aW1lLT5OZXdOdW1iZXIoaVZhbHVlKSkge30KLQotQ0pTX1ZhbHVlOjpDSlNfVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBjb25zdCBib29sJiBiVmFsdWUpCi0gICAgOiBtX3BWYWx1ZShwUnVudGltZS0+TmV3Qm9vbGVhbihiVmFsdWUpKSB7fQotCi1DSlNfVmFsdWU6OkNKU19WYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIGNvbnN0IGZsb2F0JiBmVmFsdWUpCi0gICAgOiBtX3BWYWx1ZShwUnVudGltZS0+TmV3TnVtYmVyKGZWYWx1ZSkpIHt9Ci0KLUNKU19WYWx1ZTo6Q0pTX1ZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSwgY29uc3QgZG91YmxlJiBkVmFsdWUpCi0gICAgOiBtX3BWYWx1ZShwUnVudGltZS0+TmV3TnVtYmVyKGRWYWx1ZSkpIHt9Ci0KLUNKU19WYWx1ZTo6Q0pTX1ZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX09iamVjdCogcE9iaikgewotICBpZiAocE9iaikKLSAgICBtX3BWYWx1ZSA9IHBPYmotPlRvVjhPYmplY3QoKTsKLX0KLQotQ0pTX1ZhbHVlOjpDSlNfVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBjb25zdCBGWF9XQ0hBUiogcFdzdHIpCi0gICAgOiBtX3BWYWx1ZShwUnVudGltZS0+TmV3U3RyaW5nKHBXc3RyKSkge30KLQotQ0pTX1ZhbHVlOjpDSlNfVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBjb25zdCBGWF9DSEFSKiBwU3RyKQotICAgIDogbV9wVmFsdWUocFJ1bnRpbWUtPk5ld1N0cmluZyhDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBTdHIpLmNfc3RyKCkpKSB7fQotCi1DSlNfVmFsdWU6OkNKU19WYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIGNvbnN0IENKU19BcnJheSYgYXJyYXkpCi0gICAgOiBtX3BWYWx1ZShhcnJheS5Ub1Y4QXJyYXkocFJ1bnRpbWUpKSB7fQotCi1DSlNfVmFsdWU6OkNKU19WYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIGNvbnN0IENKU19EYXRlJiBkYXRlKQotICAgIDogbV9wVmFsdWUoZGF0ZS5Ub1Y4RGF0ZShwUnVudGltZSkpIHt9Ci0KLUNKU19WYWx1ZTo6fkNKU19WYWx1ZSgpIHt9Ci0KLUNKU19WYWx1ZTo6Q0pTX1ZhbHVlKGNvbnN0IENKU19WYWx1ZSYgb3RoZXIpID0gZGVmYXVsdDsKLQotdm9pZCBDSlNfVmFsdWU6OkF0dGFjaCh2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpIHsKLSAgbV9wVmFsdWUgPSBwVmFsdWU7Ci19Ci0KLXZvaWQgQ0pTX1ZhbHVlOjpEZXRhY2goKSB7Ci0gIG1fcFZhbHVlID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKLX0KLQotaW50IENKU19WYWx1ZTo6VG9JbnQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSBjb25zdCB7Ci0gIHJldHVybiBwUnVudGltZS0+VG9JbnQzMihtX3BWYWx1ZSk7Ci19Ci0KLWJvb2wgQ0pTX1ZhbHVlOjpUb0Jvb2woQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSBjb25zdCB7Ci0gIHJldHVybiBwUnVudGltZS0+VG9Cb29sZWFuKG1fcFZhbHVlKTsKLX0KLQotZG91YmxlIENKU19WYWx1ZTo6VG9Eb3VibGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSBjb25zdCB7Ci0gIHJldHVybiBwUnVudGltZS0+VG9Eb3VibGUobV9wVmFsdWUpOwotfQotCi1mbG9hdCBDSlNfVmFsdWU6OlRvRmxvYXQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSBjb25zdCB7Ci0gIHJldHVybiAoZmxvYXQpVG9Eb3VibGUocFJ1bnRpbWUpOwotfQotCi1DSlNfT2JqZWN0KiBDSlNfVmFsdWU6OlRvQ0pTT2JqZWN0KENKU19SdW50aW1lKiBwUnVudGltZSkgY29uc3QgewotICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiA9IHBSdW50aW1lLT5Ub09iamVjdChtX3BWYWx1ZSk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxDSlNfT2JqZWN0Kj4ocFJ1bnRpbWUtPkdldE9iamVjdFByaXZhdGUocE9iaikpOwotfQotCi12ODo6TG9jYWw8djg6Ok9iamVjdD4gQ0pTX1ZhbHVlOjpUb1Y4T2JqZWN0KENKU19SdW50aW1lKiBwUnVudGltZSkgY29uc3QgewotICByZXR1cm4gcFJ1bnRpbWUtPlRvT2JqZWN0KG1fcFZhbHVlKTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ0pTX1ZhbHVlOjpUb0NGWFdpZGVTdHJpbmcoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSBjb25zdCB7Ci0gIHJldHVybiBwUnVudGltZS0+VG9XaWRlU3RyaW5nKG1fcFZhbHVlKTsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgQ0pTX1ZhbHVlOjpUb0NGWEJ5dGVTdHJpbmcoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSBjb25zdCB7Ci0gIHJldHVybiBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKSk7Ci19Ci0KLXY4OjpMb2NhbDx2ODo6VmFsdWU+IENKU19WYWx1ZTo6VG9WOFZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSkgY29uc3QgewotICByZXR1cm4gbV9wVmFsdWU7Ci19Ci0KLXY4OjpMb2NhbDx2ODo6QXJyYXk+IENKU19WYWx1ZTo6VG9WOEFycmF5KENKU19SdW50aW1lKiBwUnVudGltZSkgY29uc3QgewotICByZXR1cm4gcFJ1bnRpbWUtPlRvQXJyYXkobV9wVmFsdWUpOwotfQotCi12b2lkIENKU19WYWx1ZTo6U2V0TnVsbChDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKLSAgbV9wVmFsdWUgPSBwUnVudGltZS0+TmV3TnVsbCgpOwotfQotCi12b2lkIENKU19WYWx1ZTo6TWF5YmVDb2VyY2VUb051bWJlcihDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKLSAgYm9vbCBiQWxsb3dOYU4gPSBmYWxzZTsKLSAgaWYgKEdldFR5cGUoKSA9PSBWVF9zdHJpbmcpIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBic3RyID0gVG9DRlhCeXRlU3RyaW5nKHBSdW50aW1lKTsKLSAgICBpZiAoYnN0ci5HZXRMZW5ndGgoKSA9PSAwKQotICAgICAgcmV0dXJuOwotICAgIGlmIChic3RyID09ICJOYU4iKQotICAgICAgYkFsbG93TmFOID0gdHJ1ZTsKLSAgfQotICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBwUnVudGltZS0+R2V0SXNvbGF0ZSgpOwotICB2ODo6VHJ5Q2F0Y2ggdHJ5X2NhdGNoKHBJc29sYXRlKTsKLSAgdjg6Ok1heWJlTG9jYWw8djg6Ok51bWJlcj4gbWF5YmVOdW0gPQotICAgICAgbV9wVmFsdWUtPlRvTnVtYmVyKHBJc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpKTsKLSAgaWYgKG1heWJlTnVtLklzRW1wdHkoKSkKLSAgICByZXR1cm47Ci0gIHY4OjpMb2NhbDx2ODo6TnVtYmVyPiBudW0gPSBtYXliZU51bS5Ub0xvY2FsQ2hlY2tlZCgpOwotICBpZiAoc3RkOjppc25hbihudW0tPlZhbHVlKCkpICYmICFiQWxsb3dOYU4pCi0gICAgcmV0dXJuOwotICBtX3BWYWx1ZSA9IG51bTsKLX0KLQotLy8gc3RhdGljCi1DSlNfVmFsdWU6OlR5cGUgQ0pTX1ZhbHVlOjpHZXRWYWx1ZVR5cGUodjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUpIHsKLSAgaWYgKHZhbHVlLklzRW1wdHkoKSkKLSAgICByZXR1cm4gVlRfdW5rbm93bjsKLSAgaWYgKHZhbHVlLT5Jc1N0cmluZygpKQotICAgIHJldHVybiBWVF9zdHJpbmc7Ci0gIGlmICh2YWx1ZS0+SXNOdW1iZXIoKSkKLSAgICByZXR1cm4gVlRfbnVtYmVyOwotICBpZiAodmFsdWUtPklzQm9vbGVhbigpKQotICAgIHJldHVybiBWVF9ib29sZWFuOwotICBpZiAodmFsdWUtPklzRGF0ZSgpKQotICAgIHJldHVybiBWVF9kYXRlOwotICBpZiAodmFsdWUtPklzT2JqZWN0KCkpCi0gICAgcmV0dXJuIFZUX29iamVjdDsKLSAgaWYgKHZhbHVlLT5Jc051bGwoKSkKLSAgICByZXR1cm4gVlRfbnVsbDsKLSAgaWYgKHZhbHVlLT5Jc1VuZGVmaW5lZCgpKQotICAgIHJldHVybiBWVF91bmRlZmluZWQ7Ci0gIHJldHVybiBWVF91bmtub3duOwotfQotCi1ib29sIENKU19WYWx1ZTo6SXNBcnJheU9iamVjdCgpIGNvbnN0IHsKLSAgcmV0dXJuICFtX3BWYWx1ZS5Jc0VtcHR5KCkgJiYgbV9wVmFsdWUtPklzQXJyYXkoKTsKLX0KLQotYm9vbCBDSlNfVmFsdWU6OklzRGF0ZU9iamVjdCgpIGNvbnN0IHsKLSAgcmV0dXJuICFtX3BWYWx1ZS5Jc0VtcHR5KCkgJiYgbV9wVmFsdWUtPklzRGF0ZSgpOwotfQotCi1ib29sIENKU19WYWx1ZTo6Q29udmVydFRvQXJyYXkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBDSlNfQXJyYXkmIGFycmF5KSBjb25zdCB7Ci0gIGlmICghSXNBcnJheU9iamVjdCgpKQotICAgIHJldHVybiBmYWxzZTsKLSAgYXJyYXkuQXR0YWNoKHBSdW50aW1lLT5Ub0FycmF5KG1fcFZhbHVlKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENKU19WYWx1ZTo6Q29udmVydFRvRGF0ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19EYXRlJiBkYXRlKSBjb25zdCB7Ci0gIGlmICghSXNEYXRlT2JqZWN0KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICB2ODo6TG9jYWw8djg6OlZhbHVlPiBtdXRhYmxlX3ZhbHVlID0gbV9wVmFsdWU7Ci0gIGRhdGUuQXR0YWNoKG11dGFibGVfdmFsdWUuQXM8djg6OkRhdGU+KCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotQ0pTX1Byb3BWYWx1ZTo6Q0pTX1Byb3BWYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUpCi0gICAgOiBtX2JJc1NldHRpbmcoMCksIG1fVmFsdWUocFJ1bnRpbWUpLCBtX3BKU1J1bnRpbWUocFJ1bnRpbWUpIHt9Ci0KLUNKU19Qcm9wVmFsdWU6OkNKU19Qcm9wVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBjb25zdCBDSlNfVmFsdWUmIHZhbHVlKQotICAgIDogbV9iSXNTZXR0aW5nKDApLCBtX1ZhbHVlKHZhbHVlKSwgbV9wSlNSdW50aW1lKHBSdW50aW1lKSB7fQotCi1DSlNfUHJvcFZhbHVlOjp+Q0pTX1Byb3BWYWx1ZSgpIHt9Ci0KLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I8PChpbnQgaVZhbHVlKSB7Ci0gIEFTU0VSVCghbV9iSXNTZXR0aW5nKTsKLSAgbV9WYWx1ZSA9IENKU19WYWx1ZShtX3BKU1J1bnRpbWUsIGlWYWx1ZSk7Ci19Ci0KLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I+PihpbnQmIGlWYWx1ZSkgY29uc3QgewotICBBU1NFUlQobV9iSXNTZXR0aW5nKTsKLSAgaVZhbHVlID0gbV9WYWx1ZS5Ub0ludChtX3BKU1J1bnRpbWUpOwotfQotCi12b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yPDwoYm9vbCBiVmFsdWUpIHsKLSAgQVNTRVJUKCFtX2JJc1NldHRpbmcpOwotICBtX1ZhbHVlID0gQ0pTX1ZhbHVlKG1fcEpTUnVudGltZSwgYlZhbHVlKTsKLX0KLQotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvcj4+KGJvb2wmIGJWYWx1ZSkgY29uc3QgewotICBBU1NFUlQobV9iSXNTZXR0aW5nKTsKLSAgYlZhbHVlID0gbV9WYWx1ZS5Ub0Jvb2wobV9wSlNSdW50aW1lKTsKLX0KLQotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvcjw8KGRvdWJsZSBkVmFsdWUpIHsKLSAgQVNTRVJUKCFtX2JJc1NldHRpbmcpOwotICBtX1ZhbHVlID0gQ0pTX1ZhbHVlKG1fcEpTUnVudGltZSwgZFZhbHVlKTsKLX0KLQotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvcj4+KGRvdWJsZSYgZFZhbHVlKSBjb25zdCB7Ci0gIEFTU0VSVChtX2JJc1NldHRpbmcpOwotICBkVmFsdWUgPSBtX1ZhbHVlLlRvRG91YmxlKG1fcEpTUnVudGltZSk7Ci19Ci0KLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I8PChDSlNfT2JqZWN0KiBwT2JqKSB7Ci0gIEFTU0VSVCghbV9iSXNTZXR0aW5nKTsKLSAgbV9WYWx1ZSA9IENKU19WYWx1ZShtX3BKU1J1bnRpbWUsIHBPYmopOwotfQotCi12b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yPj4oQ0pTX09iamVjdComIHBwT2JqKSBjb25zdCB7Ci0gIEFTU0VSVChtX2JJc1NldHRpbmcpOwotICBwcE9iaiA9IG1fVmFsdWUuVG9DSlNPYmplY3QobV9wSlNSdW50aW1lKTsKLX0KLQotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvcjw8KENKU19Eb2N1bWVudCogcEpzRG9jKSB7Ci0gIEFTU0VSVCghbV9iSXNTZXR0aW5nKTsKLSAgbV9WYWx1ZSA9IENKU19WYWx1ZShtX3BKU1J1bnRpbWUsIHBKc0RvYyk7Ci19Ci0KLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I+PihDSlNfRG9jdW1lbnQqJiBwcEpzRG9jKSBjb25zdCB7Ci0gIEFTU0VSVChtX2JJc1NldHRpbmcpOwotICBwcEpzRG9jID0gc3RhdGljX2Nhc3Q8Q0pTX0RvY3VtZW50Kj4obV9WYWx1ZS5Ub0NKU09iamVjdChtX3BKU1J1bnRpbWUpKTsKLX0KLQotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvcjw8KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKSB7Ci0gIEFTU0VSVCghbV9iSXNTZXR0aW5nKTsKLSAgbV9WYWx1ZSA9IENKU19WYWx1ZShtX3BKU1J1bnRpbWUsIHBPYmopOwotfQotCi12b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yPj4odjg6OkxvY2FsPHY4OjpPYmplY3Q+JiBwcE9iaikgY29uc3QgewotICBBU1NFUlQobV9iSXNTZXR0aW5nKTsKLSAgcHBPYmogPSBtX1ZhbHVlLlRvVjhPYmplY3QobV9wSlNSdW50aW1lKTsKLX0KLQotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvcjw8KENGWF9CeXRlU3RyaW5nIHN0cikgewotICBBU1NFUlQoIW1fYklzU2V0dGluZyk7Ci0gIG1fVmFsdWUgPSBDSlNfVmFsdWUobV9wSlNSdW50aW1lLCBzdHIuY19zdHIoKSk7Ci19Ci0KLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I+PihDRlhfQnl0ZVN0cmluZyYgc3RyKSBjb25zdCB7Ci0gIEFTU0VSVChtX2JJc1NldHRpbmcpOwotICBzdHIgPSBtX1ZhbHVlLlRvQ0ZYQnl0ZVN0cmluZyhtX3BKU1J1bnRpbWUpOwotfQotCi12b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yPDwoY29uc3QgRlhfV0NIQVIqIHN0cikgewotICBBU1NFUlQoIW1fYklzU2V0dGluZyk7Ci0gIG1fVmFsdWUgPSBDSlNfVmFsdWUobV9wSlNSdW50aW1lLCBzdHIpOwotfQotCi12b2lkIENKU19Qcm9wVmFsdWU6Om9wZXJhdG9yPj4oQ0ZYX1dpZGVTdHJpbmcmIHdpZGVfc3RyaW5nKSBjb25zdCB7Ci0gIEFTU0VSVChtX2JJc1NldHRpbmcpOwotICB3aWRlX3N0cmluZyA9IG1fVmFsdWUuVG9DRlhXaWRlU3RyaW5nKG1fcEpTUnVudGltZSk7Ci19Ci0KLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I8PChDRlhfV2lkZVN0cmluZyB3aWRlX3N0cmluZykgewotICBBU1NFUlQoIW1fYklzU2V0dGluZyk7Ci0gIG1fVmFsdWUgPSBDSlNfVmFsdWUobV9wSlNSdW50aW1lLCB3aWRlX3N0cmluZy5jX3N0cigpKTsKLX0KLQotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvcj4+KENKU19BcnJheSYgYXJyYXkpIGNvbnN0IHsKLSAgQVNTRVJUKG1fYklzU2V0dGluZyk7Ci0gIG1fVmFsdWUuQ29udmVydFRvQXJyYXkobV9wSlNSdW50aW1lLCBhcnJheSk7Ci19Ci0KLXZvaWQgQ0pTX1Byb3BWYWx1ZTo6b3BlcmF0b3I8PChDSlNfQXJyYXkmIGFycmF5KSB7Ci0gIEFTU0VSVCghbV9iSXNTZXR0aW5nKTsKLSAgbV9WYWx1ZSA9IENKU19WYWx1ZShtX3BKU1J1bnRpbWUsIGFycmF5LlRvVjhBcnJheShtX3BKU1J1bnRpbWUpKTsKLX0KLQotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvcj4+KENKU19EYXRlJiBkYXRlKSBjb25zdCB7Ci0gIEFTU0VSVChtX2JJc1NldHRpbmcpOwotICBtX1ZhbHVlLkNvbnZlcnRUb0RhdGUobV9wSlNSdW50aW1lLCBkYXRlKTsKLX0KLQotdm9pZCBDSlNfUHJvcFZhbHVlOjpvcGVyYXRvcjw8KENKU19EYXRlJiBkYXRlKSB7Ci0gIEFTU0VSVCghbV9iSXNTZXR0aW5nKTsKLSAgbV9WYWx1ZSA9IENKU19WYWx1ZShtX3BKU1J1bnRpbWUsIGRhdGUpOwotfQotCi1DSlNfQXJyYXk6OkNKU19BcnJheSgpIHt9Ci0KLUNKU19BcnJheTo6Q0pTX0FycmF5KGNvbnN0IENKU19BcnJheSYgb3RoZXIpID0gZGVmYXVsdDsKLQotQ0pTX0FycmF5Ojp+Q0pTX0FycmF5KCkge30KLQotdm9pZCBDSlNfQXJyYXk6OkF0dGFjaCh2ODo6TG9jYWw8djg6OkFycmF5PiBwQXJyYXkpIHsKLSAgbV9wQXJyYXkgPSBwQXJyYXk7Ci19Ci0KLXZvaWQgQ0pTX0FycmF5OjpHZXRFbGVtZW50KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2YWx1ZSkgY29uc3QgewotICBpZiAoIW1fcEFycmF5LklzRW1wdHkoKSkKLSAgICB2YWx1ZS5BdHRhY2gocFJ1bnRpbWUtPkdldEFycmF5RWxlbWVudChtX3BBcnJheSwgaW5kZXgpKTsKLX0KLQotdm9pZCBDSlNfQXJyYXk6OlNldEVsZW1lbnQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfVmFsdWUmIHZhbHVlKSB7Ci0gIGlmIChtX3BBcnJheS5Jc0VtcHR5KCkpCi0gICAgbV9wQXJyYXkgPSBwUnVudGltZS0+TmV3QXJyYXkoKTsKLQotICBwUnVudGltZS0+UHV0QXJyYXlFbGVtZW50KG1fcEFycmF5LCBpbmRleCwgdmFsdWUuVG9WOFZhbHVlKHBSdW50aW1lKSk7Ci19Ci0KLWludCBDSlNfQXJyYXk6OkdldExlbmd0aChDSlNfUnVudGltZSogcFJ1bnRpbWUpIGNvbnN0IHsKLSAgaWYgKG1fcEFycmF5LklzRW1wdHkoKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIHBSdW50aW1lLT5HZXRBcnJheUxlbmd0aChtX3BBcnJheSk7Ci19Ci0KLXY4OjpMb2NhbDx2ODo6QXJyYXk+IENKU19BcnJheTo6VG9WOEFycmF5KENKU19SdW50aW1lKiBwUnVudGltZSkgY29uc3QgewotICBpZiAobV9wQXJyYXkuSXNFbXB0eSgpKQotICAgIG1fcEFycmF5ID0gcFJ1bnRpbWUtPk5ld0FycmF5KCk7Ci0KLSAgcmV0dXJuIG1fcEFycmF5OwotfQotCi1DSlNfRGF0ZTo6Q0pTX0RhdGUoKSB7fQotCi1DSlNfRGF0ZTo6Q0pTX0RhdGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBkb3VibGUgZE1zZWNUaW1lKQotICAgIDogbV9wRGF0ZShwUnVudGltZS0+TmV3RGF0ZShkTXNlY1RpbWUpKSB7fQotCi1DSlNfRGF0ZTo6Q0pTX0RhdGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgIGludCB5ZWFyLAotICAgICAgICAgICAgICAgICAgIGludCBtb24sCi0gICAgICAgICAgICAgICAgICAgaW50IGRheSwKLSAgICAgICAgICAgICAgICAgICBpbnQgaG91ciwKLSAgICAgICAgICAgICAgICAgICBpbnQgbWluLAotICAgICAgICAgICAgICAgICAgIGludCBzZWMpCi0gICAgOiBtX3BEYXRlKHBSdW50aW1lLT5OZXdEYXRlKE1ha2VEYXRlKHllYXIsIG1vbiwgZGF5LCBob3VyLCBtaW4sIHNlYywgMCkpKSB7fQotCi1DSlNfRGF0ZTo6fkNKU19EYXRlKCkge30KLQotYm9vbCBDSlNfRGF0ZTo6SXNWYWxpZERhdGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSBjb25zdCB7Ci0gIHJldHVybiAhbV9wRGF0ZS5Jc0VtcHR5KCkgJiYgIUpTX1BvcnRJc05hbihwUnVudGltZS0+VG9Eb3VibGUobV9wRGF0ZSkpOwotfQotCi12b2lkIENKU19EYXRlOjpBdHRhY2godjg6OkxvY2FsPHY4OjpEYXRlPiBwRGF0ZSkgewotICBtX3BEYXRlID0gcERhdGU7Ci19Ci0KLWludCBDSlNfRGF0ZTo6R2V0WWVhcihDSlNfUnVudGltZSogcFJ1bnRpbWUpIGNvbnN0IHsKLSAgaWYgKCFJc1ZhbGlkRGF0ZShwUnVudGltZSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIEpTX0dldFllYXJGcm9tVGltZShKU19Mb2NhbFRpbWUocFJ1bnRpbWUtPlRvRG91YmxlKG1fcERhdGUpKSk7Ci19Ci0KLXZvaWQgQ0pTX0RhdGU6OlNldFllYXIoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBpbnQgaVllYXIpIHsKLSAgbV9wRGF0ZSA9IHBSdW50aW1lLT5OZXdEYXRlKAotICAgICAgTWFrZURhdGUoaVllYXIsIEdldE1vbnRoKHBSdW50aW1lKSwgR2V0RGF5KHBSdW50aW1lKSwgR2V0SG91cnMocFJ1bnRpbWUpLAotICAgICAgICAgICAgICAgR2V0TWludXRlcyhwUnVudGltZSksIEdldFNlY29uZHMocFJ1bnRpbWUpLCAwKSk7Ci19Ci0KLWludCBDSlNfRGF0ZTo6R2V0TW9udGgoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSBjb25zdCB7Ci0gIGlmICghSXNWYWxpZERhdGUocFJ1bnRpbWUpKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiBKU19HZXRNb250aEZyb21UaW1lKEpTX0xvY2FsVGltZShwUnVudGltZS0+VG9Eb3VibGUobV9wRGF0ZSkpKTsKLX0KLQotdm9pZCBDSlNfRGF0ZTo6U2V0TW9udGgoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBpbnQgaU1vbnRoKSB7Ci0gIG1fcERhdGUgPSBwUnVudGltZS0+TmV3RGF0ZSgKLSAgICAgIE1ha2VEYXRlKEdldFllYXIocFJ1bnRpbWUpLCBpTW9udGgsIEdldERheShwUnVudGltZSksIEdldEhvdXJzKHBSdW50aW1lKSwKLSAgICAgICAgICAgICAgIEdldE1pbnV0ZXMocFJ1bnRpbWUpLCBHZXRTZWNvbmRzKHBSdW50aW1lKSwgMCkpOwotfQotCi1pbnQgQ0pTX0RhdGU6OkdldERheShDSlNfUnVudGltZSogcFJ1bnRpbWUpIGNvbnN0IHsKLSAgaWYgKCFJc1ZhbGlkRGF0ZShwUnVudGltZSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIEpTX0dldERheUZyb21UaW1lKEpTX0xvY2FsVGltZShwUnVudGltZS0+VG9Eb3VibGUobV9wRGF0ZSkpKTsKLX0KLQotdm9pZCBDSlNfRGF0ZTo6U2V0RGF5KENKU19SdW50aW1lKiBwUnVudGltZSwgaW50IGlEYXkpIHsKLSAgbV9wRGF0ZSA9IHBSdW50aW1lLT5OZXdEYXRlKAotICAgICAgTWFrZURhdGUoR2V0WWVhcihwUnVudGltZSksIEdldE1vbnRoKHBSdW50aW1lKSwgaURheSwgR2V0SG91cnMocFJ1bnRpbWUpLAotICAgICAgICAgICAgICAgR2V0TWludXRlcyhwUnVudGltZSksIEdldFNlY29uZHMocFJ1bnRpbWUpLCAwKSk7Ci19Ci0KLWludCBDSlNfRGF0ZTo6R2V0SG91cnMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSBjb25zdCB7Ci0gIGlmICghSXNWYWxpZERhdGUocFJ1bnRpbWUpKQotICAgIHJldHVybiAwOwotCi0gIHJldHVybiBKU19HZXRIb3VyRnJvbVRpbWUoSlNfTG9jYWxUaW1lKHBSdW50aW1lLT5Ub0RvdWJsZShtX3BEYXRlKSkpOwotfQotCi12b2lkIENKU19EYXRlOjpTZXRIb3VycyhDSlNfUnVudGltZSogcFJ1bnRpbWUsIGludCBpSG91cnMpIHsKLSAgbV9wRGF0ZSA9IHBSdW50aW1lLT5OZXdEYXRlKAotICAgICAgTWFrZURhdGUoR2V0WWVhcihwUnVudGltZSksIEdldE1vbnRoKHBSdW50aW1lKSwgR2V0RGF5KHBSdW50aW1lKSwgaUhvdXJzLAotICAgICAgICAgICAgICAgR2V0TWludXRlcyhwUnVudGltZSksIEdldFNlY29uZHMocFJ1bnRpbWUpLCAwKSk7Ci19Ci0KLWludCBDSlNfRGF0ZTo6R2V0TWludXRlcyhDSlNfUnVudGltZSogcFJ1bnRpbWUpIGNvbnN0IHsKLSAgaWYgKCFJc1ZhbGlkRGF0ZShwUnVudGltZSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIEpTX0dldE1pbkZyb21UaW1lKEpTX0xvY2FsVGltZShwUnVudGltZS0+VG9Eb3VibGUobV9wRGF0ZSkpKTsKLX0KLQotdm9pZCBDSlNfRGF0ZTo6U2V0TWludXRlcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsIGludCBtaW51dGVzKSB7Ci0gIG1fcERhdGUgPSBwUnVudGltZS0+TmV3RGF0ZShNYWtlRGF0ZShHZXRZZWFyKHBSdW50aW1lKSwgR2V0TW9udGgocFJ1bnRpbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RGF5KHBSdW50aW1lKSwgR2V0SG91cnMocFJ1bnRpbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWludXRlcywgR2V0U2Vjb25kcyhwUnVudGltZSksIDApKTsKLX0KLQotaW50IENKU19EYXRlOjpHZXRTZWNvbmRzKENKU19SdW50aW1lKiBwUnVudGltZSkgY29uc3QgewotICBpZiAoIUlzVmFsaWREYXRlKHBSdW50aW1lKSkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gSlNfR2V0U2VjRnJvbVRpbWUoSlNfTG9jYWxUaW1lKHBSdW50aW1lLT5Ub0RvdWJsZShtX3BEYXRlKSkpOwotfQotCi12b2lkIENKU19EYXRlOjpTZXRTZWNvbmRzKENKU19SdW50aW1lKiBwUnVudGltZSwgaW50IHNlY29uZHMpIHsKLSAgbV9wRGF0ZSA9IHBSdW50aW1lLT5OZXdEYXRlKE1ha2VEYXRlKEdldFllYXIocFJ1bnRpbWUpLCBHZXRNb250aChwUnVudGltZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXREYXkocFJ1bnRpbWUpLCBHZXRIb3VycyhwUnVudGltZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRNaW51dGVzKHBSdW50aW1lKSwgc2Vjb25kcywgMCkpOwotfQotCi1kb3VibGUgQ0pTX0RhdGU6OlRvRG91YmxlKENKU19SdW50aW1lKiBwUnVudGltZSkgY29uc3QgewotICByZXR1cm4gIW1fcERhdGUuSXNFbXB0eSgpID8gcFJ1bnRpbWUtPlRvRG91YmxlKG1fcERhdGUpIDogMC4wOwotfQotCi1DRlhfV2lkZVN0cmluZyBDSlNfRGF0ZTo6VG9TdHJpbmcoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSBjb25zdCB7Ci0gIHJldHVybiAhbV9wRGF0ZS5Jc0VtcHR5KCkgPyBwUnVudGltZS0+VG9XaWRlU3RyaW5nKG1fcERhdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDRlhfV2lkZVN0cmluZygpOwotfQotCi12ODo6TG9jYWw8djg6OkRhdGU+IENKU19EYXRlOjpUb1Y4RGF0ZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcERhdGU7Ci19Ci0KLWRvdWJsZSBfZ2V0TG9jYWxUWkEoKSB7Ci0gIGlmICghRlNES19Jc1NhbmRCb3hQb2xpY3lFbmFibGVkKEZQREZfUE9MSUNZX01BQ0hJTkVUSU1FX0FDQ0VTUykpCi0gICAgcmV0dXJuIDA7Ci0gIHRpbWVfdCB0ID0gMDsKLSAgdGltZSgmdCk7Ci0gIGxvY2FsdGltZSgmdCk7Ci0jaWYgX01TQ19WRVIgPj0gMTkwMAotICAvLyBJbiBnY2MgYW5kIGluIFZpc3VhbCBTdHVkaW8gcHJpb3IgdG8gVlMgMjAxNSAndGltZXpvbmUnIGlzIGEgZ2xvYmFsCi0gIC8vIHZhcmlhYmxlIGRlY2xhcmVkIGluIHRpbWUuaC4gVGhhdCB2YXJpYWJsZSB3YXMgZGVwcmVjYXRlZCBhbmQgaW4gVlMgMjAxNQotICAvLyBpcyByZW1vdmVkLCB3aXRoIF9nZXRfdGltZXpvbmUgcmVwbGFjaW5nIGl0LgotICBsb25nIHRpbWV6b25lID0gMDsKLSAgX2dldF90aW1lem9uZSgmdGltZXpvbmUpOwotI2VuZGlmCi0gIHJldHVybiAoZG91YmxlKSgtKHRpbWV6b25lICogMTAwMCkpOwotfQotCi1pbnQgX2dldERheWxpZ2h0U2F2aW5nVEEoZG91YmxlIGQpIHsKLSAgaWYgKCFGU0RLX0lzU2FuZEJveFBvbGljeUVuYWJsZWQoRlBERl9QT0xJQ1lfTUFDSElORVRJTUVfQUNDRVNTKSkKLSAgICByZXR1cm4gMDsKLSAgdGltZV90IHQgPSAodGltZV90KShkIC8gMTAwMCk7Ci0gIHN0cnVjdCB0bSogdG1wID0gbG9jYWx0aW1lKCZ0KTsKLSAgaWYgKCF0bXApCi0gICAgcmV0dXJuIDA7Ci0gIGlmICh0bXAtPnRtX2lzZHN0ID4gMCkKLSAgICAvLyBPbmUgaG91ci4KLSAgICByZXR1cm4gKGludCk2MCAqIDYwICogMTAwMDsKLSAgcmV0dXJuIDA7Ci19Ci0KLWRvdWJsZSBfTW9kKGRvdWJsZSB4LCBkb3VibGUgeSkgewotICBkb3VibGUgciA9IGZtb2QoeCwgeSk7Ci0gIGlmIChyIDwgMCkKLSAgICByICs9IHk7Ci0gIHJldHVybiByOwotfQotCi1pbnQgX2lzZmluaXRlKGRvdWJsZSB2KSB7Ci0jaWYgX01TQ19WRVIKLSAgcmV0dXJuIDo6X2Zpbml0ZSh2KTsKLSNlbHNlCi0gIHJldHVybiBzdGQ6OmZhYnModikgPCBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heCgpOwotI2VuZGlmCi19Ci0KLWRvdWJsZSBfdG9JbnRlZ2VyKGRvdWJsZSBuKSB7Ci0gIHJldHVybiAobiA+PSAwKSA/IEZYU1lTX2Zsb29yKG4pIDogLUZYU1lTX2Zsb29yKC1uKTsKLX0KLQotYm9vbCBfaXNMZWFwWWVhcihpbnQgeWVhcikgewotICByZXR1cm4gKHllYXIgJSA0ID09IDApICYmICgoeWVhciAlIDEwMCAhPSAwKSB8fCAoeWVhciAlIDQwMCAhPSAwKSk7Ci19Ci0KLWludCBfRGF5RnJvbVllYXIoaW50IHkpIHsKLSAgcmV0dXJuIChpbnQpKDM2NSAqICh5IC0gMTk3MC4wKSArIEZYU1lTX2Zsb29yKCh5IC0gMTk2OS4wKSAvIDQpIC0KLSAgICAgICAgICAgICAgIEZYU1lTX2Zsb29yKCh5IC0gMTkwMS4wKSAvIDEwMCkgKwotICAgICAgICAgICAgICAgRlhTWVNfZmxvb3IoKHkgLSAxNjAxLjApIC8gNDAwKSk7Ci19Ci0KLWRvdWJsZSBfVGltZUZyb21ZZWFyKGludCB5KSB7Ci0gIHJldHVybiA4NjQwMDAwMC4wICogX0RheUZyb21ZZWFyKHkpOwotfQotCi1zdGF0aWMgY29uc3QgdWludDE2X3QgZGF5c01vbnRoWzEyXSA9IHswLCAgIDMxLCAgNTksICA5MCwgIDEyMCwgMTUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgxLCAyMTIsIDI0MywgMjczLCAzMDQsIDMzNH07Ci1zdGF0aWMgY29uc3QgdWludDE2X3QgbGVhcERheXNNb250aFsxMl0gPSB7MCwgICAzMSwgIDYwLCAgOTEsICAxMjEsIDE1MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODIsIDIxMywgMjQ0LCAyNzQsIDMwNSwgMzM1fTsKLQotZG91YmxlIF9UaW1lRnJvbVllYXJNb250aChpbnQgeSwgaW50IG0pIHsKLSAgY29uc3QgdWludDE2X3QqIHBNb250aCA9IF9pc0xlYXBZZWFyKHkpID8gbGVhcERheXNNb250aCA6IGRheXNNb250aDsKLSAgcmV0dXJuIF9UaW1lRnJvbVllYXIoeSkgKyAoKGRvdWJsZSlwTW9udGhbbV0pICogODY0MDAwMDA7Ci19Ci0KLWludCBfRGF5KGRvdWJsZSB0KSB7Ci0gIHJldHVybiAoaW50KUZYU1lTX2Zsb29yKHQgLyA4NjQwMDAwMCk7Ci19Ci0KLWludCBfWWVhckZyb21UaW1lKGRvdWJsZSB0KSB7Ci0gIC8vIGVzdGltYXRlIHRoZSB0aW1lLgotICBpbnQgeSA9IDE5NzAgKyBzdGF0aWNfY2FzdDxpbnQ+KHQgLyAoMzY1LjI0MjUgKiA4NjQwMDAwMCkpOwotICBpZiAoX1RpbWVGcm9tWWVhcih5KSA8PSB0KSB7Ci0gICAgd2hpbGUgKF9UaW1lRnJvbVllYXIoeSArIDEpIDw9IHQpCi0gICAgICB5Kys7Ci0gIH0gZWxzZSB7Ci0gICAgd2hpbGUgKF9UaW1lRnJvbVllYXIoeSkgPiB0KQotICAgICAgeS0tOwotICB9Ci0gIHJldHVybiB5OwotfQotCi1pbnQgX0RheVdpdGhpblllYXIoZG91YmxlIHQpIHsKLSAgaW50IHllYXIgPSBfWWVhckZyb21UaW1lKHQpOwotICBpbnQgZGF5ID0gX0RheSh0KTsKLSAgcmV0dXJuIGRheSAtIF9EYXlGcm9tWWVhcih5ZWFyKTsKLX0KLQotaW50IF9Nb250aEZyb21UaW1lKGRvdWJsZSB0KSB7Ci0gIGludCBkYXkgPSBfRGF5V2l0aGluWWVhcih0KTsKLSAgaW50IHllYXIgPSBfWWVhckZyb21UaW1lKHQpOwotICBpZiAoMCA8PSBkYXkgJiYgZGF5IDwgMzEpCi0gICAgcmV0dXJuIDA7Ci0gIGlmICgzMSA8PSBkYXkgJiYgZGF5IDwgNTkgKyBfaXNMZWFwWWVhcih5ZWFyKSkKLSAgICByZXR1cm4gMTsKLSAgaWYgKCg1OSArIF9pc0xlYXBZZWFyKHllYXIpKSA8PSBkYXkgJiYgZGF5IDwgKDkwICsgX2lzTGVhcFllYXIoeWVhcikpKQotICAgIHJldHVybiAyOwotICBpZiAoKDkwICsgX2lzTGVhcFllYXIoeWVhcikpIDw9IGRheSAmJiBkYXkgPCAoMTIwICsgX2lzTGVhcFllYXIoeWVhcikpKQotICAgIHJldHVybiAzOwotICBpZiAoKDEyMCArIF9pc0xlYXBZZWFyKHllYXIpKSA8PSBkYXkgJiYgZGF5IDwgKDE1MSArIF9pc0xlYXBZZWFyKHllYXIpKSkKLSAgICByZXR1cm4gNDsKLSAgaWYgKCgxNTEgKyBfaXNMZWFwWWVhcih5ZWFyKSkgPD0gZGF5ICYmIGRheSA8ICgxODEgKyBfaXNMZWFwWWVhcih5ZWFyKSkpCi0gICAgcmV0dXJuIDU7Ci0gIGlmICgoMTgxICsgX2lzTGVhcFllYXIoeWVhcikpIDw9IGRheSAmJiBkYXkgPCAoMjEyICsgX2lzTGVhcFllYXIoeWVhcikpKQotICAgIHJldHVybiA2OwotICBpZiAoKDIxMiArIF9pc0xlYXBZZWFyKHllYXIpKSA8PSBkYXkgJiYgZGF5IDwgKDI0MyArIF9pc0xlYXBZZWFyKHllYXIpKSkKLSAgICByZXR1cm4gNzsKLSAgaWYgKCgyNDMgKyBfaXNMZWFwWWVhcih5ZWFyKSkgPD0gZGF5ICYmIGRheSA8ICgyNzMgKyBfaXNMZWFwWWVhcih5ZWFyKSkpCi0gICAgcmV0dXJuIDg7Ci0gIGlmICgoMjczICsgX2lzTGVhcFllYXIoeWVhcikpIDw9IGRheSAmJiBkYXkgPCAoMzA0ICsgX2lzTGVhcFllYXIoeWVhcikpKQotICAgIHJldHVybiA5OwotICBpZiAoKDMwNCArIF9pc0xlYXBZZWFyKHllYXIpKSA8PSBkYXkgJiYgZGF5IDwgKDMzNCArIF9pc0xlYXBZZWFyKHllYXIpKSkKLSAgICByZXR1cm4gMTA7Ci0gIGlmICgoMzM0ICsgX2lzTGVhcFllYXIoeWVhcikpIDw9IGRheSAmJiBkYXkgPCAoMzY1ICsgX2lzTGVhcFllYXIoeWVhcikpKQotICAgIHJldHVybiAxMTsKLQotICByZXR1cm4gLTE7Ci19Ci0KLWludCBfRGF0ZUZyb21UaW1lKGRvdWJsZSB0KSB7Ci0gIGludCBkYXkgPSBfRGF5V2l0aGluWWVhcih0KTsKLSAgaW50IHllYXIgPSBfWWVhckZyb21UaW1lKHQpOwotICBpbnQgbGVhcCA9IF9pc0xlYXBZZWFyKHllYXIpOwotICBpbnQgbW9udGggPSBfTW9udGhGcm9tVGltZSh0KTsKLSAgc3dpdGNoIChtb250aCkgewotICAgIGNhc2UgMDoKLSAgICAgIHJldHVybiBkYXkgKyAxOwotICAgIGNhc2UgMToKLSAgICAgIHJldHVybiBkYXkgLSAzMDsKLSAgICBjYXNlIDI6Ci0gICAgICByZXR1cm4gZGF5IC0gNTggLSBsZWFwOwotICAgIGNhc2UgMzoKLSAgICAgIHJldHVybiBkYXkgLSA4OSAtIGxlYXA7Ci0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuIGRheSAtIDExOSAtIGxlYXA7Ci0gICAgY2FzZSA1OgotICAgICAgcmV0dXJuIGRheSAtIDE1MCAtIGxlYXA7Ci0gICAgY2FzZSA2OgotICAgICAgcmV0dXJuIGRheSAtIDE4MCAtIGxlYXA7Ci0gICAgY2FzZSA3OgotICAgICAgcmV0dXJuIGRheSAtIDIxMSAtIGxlYXA7Ci0gICAgY2FzZSA4OgotICAgICAgcmV0dXJuIGRheSAtIDI0MiAtIGxlYXA7Ci0gICAgY2FzZSA5OgotICAgICAgcmV0dXJuIGRheSAtIDI3MiAtIGxlYXA7Ci0gICAgY2FzZSAxMDoKLSAgICAgIHJldHVybiBkYXkgLSAzMDMgLSBsZWFwOwotICAgIGNhc2UgMTE6Ci0gICAgICByZXR1cm4gZGF5IC0gMzMzIC0gbGVhcDsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotZG91YmxlIEpTX0dldERhdGVUaW1lKCkgewotICBpZiAoIUZTREtfSXNTYW5kQm94UG9saWN5RW5hYmxlZChGUERGX1BPTElDWV9NQUNISU5FVElNRV9BQ0NFU1MpKQotICAgIHJldHVybiAwOwotICB0aW1lX3QgdCA9IHRpbWUobnVsbHB0cik7Ci0gIHN0cnVjdCB0bSogcFRtID0gbG9jYWx0aW1lKCZ0KTsKLQotICBpbnQgeWVhciA9IHBUbS0+dG1feWVhciArIDE5MDA7Ci0gIGRvdWJsZSB0MSA9IF9UaW1lRnJvbVllYXIoeWVhcik7Ci0KLSAgcmV0dXJuIHQxICsgcFRtLT50bV95ZGF5ICogODY0MDAwMDAuMCArIHBUbS0+dG1faG91ciAqIDM2MDAwMDAuMCArCi0gICAgICAgICBwVG0tPnRtX21pbiAqIDYwMDAwLjAgKyBwVG0tPnRtX3NlYyAqIDEwMDAuMDsKLX0KLQotaW50IEpTX0dldFllYXJGcm9tVGltZShkb3VibGUgZHQpIHsKLSAgcmV0dXJuIF9ZZWFyRnJvbVRpbWUoZHQpOwotfQotCi1pbnQgSlNfR2V0TW9udGhGcm9tVGltZShkb3VibGUgZHQpIHsKLSAgcmV0dXJuIF9Nb250aEZyb21UaW1lKGR0KTsKLX0KLQotaW50IEpTX0dldERheUZyb21UaW1lKGRvdWJsZSBkdCkgewotICByZXR1cm4gX0RhdGVGcm9tVGltZShkdCk7Ci19Ci0KLWludCBKU19HZXRIb3VyRnJvbVRpbWUoZG91YmxlIGR0KSB7Ci0gIHJldHVybiAoaW50KV9Nb2QoZmxvb3IoZHQgLyAoNjAgKiA2MCAqIDEwMDApKSwgMjQpOwotfQotCi1pbnQgSlNfR2V0TWluRnJvbVRpbWUoZG91YmxlIGR0KSB7Ci0gIHJldHVybiAoaW50KV9Nb2QoZmxvb3IoZHQgLyAoNjAgKiAxMDAwKSksIDYwKTsKLX0KLQotaW50IEpTX0dldFNlY0Zyb21UaW1lKGRvdWJsZSBkdCkgewotICByZXR1cm4gKGludClfTW9kKGZsb29yKGR0IC8gMTAwMCksIDYwKTsKLX0KLQotZG91YmxlIEpTX0RhdGVQYXJzZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKSB7Ci0gIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IHY4OjpJc29sYXRlOjpHZXRDdXJyZW50KCk7Ci0gIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKHBJc29sYXRlKTsKLSAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlKHBJc29sYXRlKTsKLQotICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBwSXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKTsKLQotICAvLyBVc2UgdGhlIGJ1aWx0LWluIG9iamVjdCBtZXRob2QuCi0gIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHYgPQotICAgICAgY29udGV4dC0+R2xvYmFsKCkKLSAgICAgICAgICAtPkdldChjb250ZXh0LCB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgIkRhdGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpOZXdTdHJpbmdUeXBlOjprTm9ybWFsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9Mb2NhbENoZWNrZWQoKSkKLSAgICAgICAgICAuVG9Mb2NhbENoZWNrZWQoKTsKLSAgaWYgKHYtPklzT2JqZWN0KCkpIHsKLSAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gbyA9IHYtPlRvT2JqZWN0KGNvbnRleHQpLlRvTG9jYWxDaGVja2VkKCk7Ci0gICAgdiA9IG8tPkdldChjb250ZXh0LCB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgInBhcnNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpOZXdTdHJpbmdUeXBlOjprTm9ybWFsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0xvY2FsQ2hlY2tlZCgpKQotICAgICAgICAgICAgLlRvTG9jYWxDaGVja2VkKCk7Ci0gICAgaWYgKHYtPklzRnVuY3Rpb24oKSkgewotICAgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gZnVuQyA9IHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+OjpDYXN0KHYpOwotICAgICAgY29uc3QgaW50IGFyZ2MgPSAxOwotICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdGltZVN0ciA9Ci0gICAgICAgICAgQ0pTX1J1bnRpbWU6OkN1cnJlbnRSdW50aW1lRnJvbUlzb2xhdGUocElzb2xhdGUpLT5OZXdTdHJpbmcoCi0gICAgICAgICAgICAgIHN0ci5Bc1N0cmluZ0MoKSk7Ci0gICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBhcmd2W2FyZ2NdID0ge3RpbWVTdHJ9OwotICAgICAgdiA9IGZ1bkMtPkNhbGwoY29udGV4dCwgY29udGV4dC0+R2xvYmFsKCksIGFyZ2MsIGFyZ3YpLlRvTG9jYWxDaGVja2VkKCk7Ci0gICAgICBpZiAodi0+SXNOdW1iZXIoKSkgewotICAgICAgICBkb3VibGUgZGF0ZSA9IHYtPlRvTnVtYmVyKGNvbnRleHQpLlRvTG9jYWxDaGVja2VkKCktPlZhbHVlKCk7Ci0gICAgICAgIGlmICghX2lzZmluaXRlKGRhdGUpKQotICAgICAgICAgIHJldHVybiBkYXRlOwotICAgICAgICByZXR1cm4gSlNfTG9jYWxUaW1lKGRhdGUpOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotZG91YmxlIEpTX01ha2VEYXkoaW50IG5ZZWFyLCBpbnQgbk1vbnRoLCBpbnQgbkRhdGUpIHsKLSAgaWYgKCFfaXNmaW5pdGUoblllYXIpIHx8ICFfaXNmaW5pdGUobk1vbnRoKSB8fCAhX2lzZmluaXRlKG5EYXRlKSkKLSAgICByZXR1cm4gR2V0TmFuKCk7Ci0gIGRvdWJsZSB5ID0gX3RvSW50ZWdlcihuWWVhcik7Ci0gIGRvdWJsZSBtID0gX3RvSW50ZWdlcihuTW9udGgpOwotICBkb3VibGUgZHQgPSBfdG9JbnRlZ2VyKG5EYXRlKTsKLSAgZG91YmxlIHltID0geSArIEZYU1lTX2Zsb29yKChkb3VibGUpbSAvIDEyKTsKLSAgZG91YmxlIG1uID0gX01vZChtLCAxMik7Ci0KLSAgZG91YmxlIHQgPSBfVGltZUZyb21ZZWFyTW9udGgoKGludCl5bSwgKGludCltbik7Ci0KLSAgaWYgKF9ZZWFyRnJvbVRpbWUodCkgIT0geW0gfHwgX01vbnRoRnJvbVRpbWUodCkgIT0gbW4gfHwKLSAgICAgIF9EYXRlRnJvbVRpbWUodCkgIT0gMSkKLSAgICByZXR1cm4gR2V0TmFuKCk7Ci0gIHJldHVybiBfRGF5KHQpICsgZHQgLSAxOwotfQotCi1kb3VibGUgSlNfTWFrZVRpbWUoaW50IG5Ib3VyLCBpbnQgbk1pbiwgaW50IG5TZWMsIGludCBuTXMpIHsKLSAgaWYgKCFfaXNmaW5pdGUobkhvdXIpIHx8ICFfaXNmaW5pdGUobk1pbikgfHwgIV9pc2Zpbml0ZShuU2VjKSB8fAotICAgICAgIV9pc2Zpbml0ZShuTXMpKQotICAgIHJldHVybiBHZXROYW4oKTsKLQotICBkb3VibGUgaCA9IF90b0ludGVnZXIobkhvdXIpOwotICBkb3VibGUgbSA9IF90b0ludGVnZXIobk1pbik7Ci0gIGRvdWJsZSBzID0gX3RvSW50ZWdlcihuU2VjKTsKLSAgZG91YmxlIG1pbGxpID0gX3RvSW50ZWdlcihuTXMpOwotCi0gIHJldHVybiBoICogMzYwMDAwMCArIG0gKiA2MDAwMCArIHMgKiAxMDAwICsgbWlsbGk7Ci19Ci0KLWRvdWJsZSBKU19NYWtlRGF0ZShkb3VibGUgZGF5LCBkb3VibGUgdGltZSkgewotICBpZiAoIV9pc2Zpbml0ZShkYXkpIHx8ICFfaXNmaW5pdGUodGltZSkpCi0gICAgcmV0dXJuIEdldE5hbigpOwotCi0gIHJldHVybiBkYXkgKiA4NjQwMDAwMCArIHRpbWU7Ci19Ci0KLWJvb2wgSlNfUG9ydElzTmFuKGRvdWJsZSBkKSB7Ci0gIHJldHVybiBkICE9IGQ7Ci19Ci0KLWRvdWJsZSBKU19Mb2NhbFRpbWUoZG91YmxlIGQpIHsKLSAgcmV0dXJuIGQgKyBfZ2V0TG9jYWxUWkEoKSArIF9nZXREYXlsaWdodFNhdmluZ1RBKGQpOwotfQotCi1zdGQ6OnZlY3RvcjxDSlNfVmFsdWU+IEpTX0V4cGFuZEtleXdvcmRQYXJhbXMoCi0gICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIG9yaWdpbmFscywKLSAgICBzaXplX3QgbktleXdvcmRzLAotICAgIC4uLikgewotICBBU1NFUlQobktleXdvcmRzKTsKLQotICBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+IHJlc3VsdChuS2V5d29yZHMsIENKU19WYWx1ZShwUnVudGltZSkpOwotICBzaXplX3Qgc2l6ZSA9IHN0ZDo6bWluKG9yaWdpbmFscy5zaXplKCksIG5LZXl3b3Jkcyk7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKQotICAgIHJlc3VsdFtpXSA9IG9yaWdpbmFsc1tpXTsKLQotICBpZiAob3JpZ2luYWxzLnNpemUoKSAhPSAxIHx8IG9yaWdpbmFsc1swXS5HZXRUeXBlKCkgIT0gQ0pTX1ZhbHVlOjpWVF9vYmplY3QgfHwKLSAgICAgIG9yaWdpbmFsc1swXS5Jc0FycmF5T2JqZWN0KCkpIHsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqID0gb3JpZ2luYWxzWzBdLlRvVjhPYmplY3QocFJ1bnRpbWUpOwotICByZXN1bHRbMF0gPSBDSlNfVmFsdWUocFJ1bnRpbWUpOyAgLy8gTWFrZSB1bmtub3duLgotCi0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0KGFwLCBuS2V5d29yZHMpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5LZXl3b3JkczsgKytpKSB7Ci0gICAgY29uc3Qgd2NoYXJfdCogcHJvcGVydHkgPSB2YV9hcmcoYXAsIGNvbnN0IHdjaGFyX3QqKTsKLSAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2OFZhbHVlID0gcFJ1bnRpbWUtPkdldE9iamVjdFByb3BlcnR5KHBPYmosIHByb3BlcnR5KTsKLSAgICBpZiAoIXY4VmFsdWUtPklzVW5kZWZpbmVkKCkpCi0gICAgICByZXN1bHRbaV0gPSBDSlNfVmFsdWUocFJ1bnRpbWUsIHY4VmFsdWUpOwotICB9Ci0gIHZhX2VuZChhcCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19CmRpZmYgLS1naXQgYS9mcGRmc2RrL2phdmFzY3JpcHQvSlNfVmFsdWUuaCBiL2ZwZGZzZGsvamF2YXNjcmlwdC9KU19WYWx1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTNmMGMzLi4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvamF2YXNjcmlwdC9KU19WYWx1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGUERGU0RLX0pBVkFTQ1JJUFRfSlNfVkFMVUVfSF8KLSNkZWZpbmUgRlBERlNES19KQVZBU0NSSVBUX0pTX1ZBTFVFX0hfCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0jaW5jbHVkZSAiZnhqcy9meGpzX3Y4LmgiCi0KLWNsYXNzIENKU19BcnJheTsKLWNsYXNzIENKU19EYXRlOwotY2xhc3MgQ0pTX0RvY3VtZW50OwotY2xhc3MgQ0pTX09iamVjdDsKLWNsYXNzIENKU19SdW50aW1lOwotCi1jbGFzcyBDSlNfVmFsdWUgewotIHB1YmxpYzoKLSAgZW51bSBUeXBlIHsKLSAgICBWVF91bmtub3duLAotICAgIFZUX3N0cmluZywKLSAgICBWVF9udW1iZXIsCi0gICAgVlRfYm9vbGVhbiwKLSAgICBWVF9kYXRlLAotICAgIFZUX29iamVjdCwKLSAgICBWVF9udWxsLAotICAgIFZUX3VuZGVmaW5lZAotICB9OwotCi0gIGV4cGxpY2l0IENKU19WYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUpOwotICBDSlNfVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpOwotICBDSlNfVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBjb25zdCBpbnQmIGlWYWx1ZSk7Ci0gIENKU19WYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIGNvbnN0IGRvdWJsZSYgZFZhbHVlKTsKLSAgQ0pTX1ZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSwgY29uc3QgZmxvYXQmIGZWYWx1ZSk7Ci0gIENKU19WYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIGNvbnN0IGJvb2wmIGJWYWx1ZSk7Ci0gIENKU19WYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19PYmplY3QqIHBPYmopOwotICBDSlNfVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBjb25zdCBGWF9DSEFSKiBwU3RyKTsKLSAgQ0pTX1ZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSwgY29uc3QgRlhfV0NIQVIqIHBXc3RyKTsKLSAgQ0pTX1ZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSwgY29uc3QgQ0pTX0FycmF5JiBhcnJheSk7Ci0gIENKU19WYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIGNvbnN0IENKU19EYXRlJiBkYXRlKTsKLSAgQ0pTX1ZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSwgY29uc3QgQ0pTX09iamVjdCogb2JqZWN0KTsKLSAgQ0pTX1ZhbHVlKGNvbnN0IENKU19WYWx1ZSYgb3RoZXIpOwotCi0gIH5DSlNfVmFsdWUoKTsKLQotICB2b2lkIFNldE51bGwoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKLSAgdm9pZCBTZXRWYWx1ZShjb25zdCBDSlNfVmFsdWUmIG90aGVyKTsKLSAgdm9pZCBBdHRhY2godjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKTsKLSAgdm9pZCBEZXRhY2goKTsKLQotICBzdGF0aWMgVHlwZSBHZXRWYWx1ZVR5cGUodjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUpOwotICBUeXBlIEdldFR5cGUoKSBjb25zdCB7IHJldHVybiBHZXRWYWx1ZVR5cGUobV9wVmFsdWUpOyB9Ci0KLSAgaW50IFRvSW50KENKU19SdW50aW1lKiBwUnVudGltZSkgY29uc3Q7Ci0gIGJvb2wgVG9Cb29sKENKU19SdW50aW1lKiBwUnVudGltZSkgY29uc3Q7Ci0gIGRvdWJsZSBUb0RvdWJsZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIGNvbnN0OwotICBmbG9hdCBUb0Zsb2F0KENKU19SdW50aW1lKiBwUnVudGltZSkgY29uc3Q7Ci0gIENKU19PYmplY3QqIFRvQ0pTT2JqZWN0KENKU19SdW50aW1lKiBwUnVudGltZSkgY29uc3Q7Ci0gIENGWF9XaWRlU3RyaW5nIFRvQ0ZYV2lkZVN0cmluZyhDSlNfUnVudGltZSogcFJ1bnRpbWUpIGNvbnN0OwotICBDRlhfQnl0ZVN0cmluZyBUb0NGWEJ5dGVTdHJpbmcoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSBjb25zdDsKLSAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IFRvVjhPYmplY3QoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSBjb25zdDsKLSAgdjg6OkxvY2FsPHY4OjpBcnJheT4gVG9WOEFycmF5KENKU19SdW50aW1lKiBwUnVudGltZSkgY29uc3Q7Ci0gIHY4OjpMb2NhbDx2ODo6VmFsdWU+IFRvVjhWYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIGNvbnN0OwotCi0gIC8vIFJlcGxhY2UgdGhlIGN1cnJlbnQgfG1fcFZhbHVlfCB3aXRoIGEgdjg6Ok51bWJlciBpZiBwb3NzaWJsZQotICAvLyB0byBtYWtlIG9uZSBmcm9tIHRoZSBjdXJyZW50IHxtX3BWYWx1ZXwuCi0gIHZvaWQgTWF5YmVDb2VyY2VUb051bWJlcihDSlNfUnVudGltZSogcFJ1bnRpbWUpOwotCi0gIGJvb2wgSXNBcnJheU9iamVjdCgpIGNvbnN0OwotICBib29sIElzRGF0ZU9iamVjdCgpIGNvbnN0OwotICBib29sIENvbnZlcnRUb0FycmF5KENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX0FycmF5JikgY29uc3Q7Ci0gIGJvb2wgQ29udmVydFRvRGF0ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19EYXRlJikgY29uc3Q7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHY4OjpMb2NhbDx2ODo6VmFsdWU+IG1fcFZhbHVlOwotfTsKLQotY2xhc3MgQ0pTX1Byb3BWYWx1ZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDSlNfUHJvcFZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSk7Ci0gIENKU19Qcm9wVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBjb25zdCBDSlNfVmFsdWUmKTsKLSAgfkNKU19Qcm9wVmFsdWUoKTsKLQotICB2b2lkIFN0YXJ0U2V0dGluZygpIHsgbV9iSXNTZXR0aW5nID0gdHJ1ZTsgfQotICB2b2lkIFN0YXJ0R2V0dGluZygpIHsgbV9iSXNTZXR0aW5nID0gZmFsc2U7IH0KLSAgYm9vbCBJc1NldHRpbmcoKSBjb25zdCB7IHJldHVybiBtX2JJc1NldHRpbmc7IH0KLSAgYm9vbCBJc0dldHRpbmcoKSBjb25zdCB7IHJldHVybiAhbV9iSXNTZXR0aW5nOyB9Ci0gIENKU19SdW50aW1lKiBHZXRKU1J1bnRpbWUoKSBjb25zdCB7IHJldHVybiBtX3BKU1J1bnRpbWU7IH0KLSAgQ0pTX1ZhbHVlKiBHZXRKU1ZhbHVlKCkgeyByZXR1cm4gJm1fVmFsdWU7IH0KLQotICAvLyBUaGVzZSBjYWxscyBtYXkgcmUtZW50ZXIgSlMgKGFuZCBoZW5jZSBpbnZhbGlkYXRlIG9iamVjdHMpLgotICB2b2lkIG9wZXJhdG9yPDwoaW50IHZhbCk7Ci0gIHZvaWQgb3BlcmF0b3I+PihpbnQmKSBjb25zdDsKLSAgdm9pZCBvcGVyYXRvcjw8KGJvb2wgdmFsKTsKLSAgdm9pZCBvcGVyYXRvcj4+KGJvb2wmKSBjb25zdDsKLSAgdm9pZCBvcGVyYXRvcjw8KGRvdWJsZSB2YWwpOwotICB2b2lkIG9wZXJhdG9yPj4oZG91YmxlJikgY29uc3Q7Ci0gIHZvaWQgb3BlcmF0b3I8PChDSlNfT2JqZWN0KiBwT2JqKTsKLSAgdm9pZCBvcGVyYXRvcj4+KENKU19PYmplY3QqJiBwcE9iaikgY29uc3Q7Ci0gIHZvaWQgb3BlcmF0b3I8PChDSlNfRG9jdW1lbnQqIHBKc0RvYyk7Ci0gIHZvaWQgb3BlcmF0b3I+PihDSlNfRG9jdW1lbnQqJiBwcEpzRG9jKSBjb25zdDsKLSAgdm9pZCBvcGVyYXRvcjw8KENGWF9CeXRlU3RyaW5nKTsKLSAgdm9pZCBvcGVyYXRvcj4+KENGWF9CeXRlU3RyaW5nJikgY29uc3Q7Ci0gIHZvaWQgb3BlcmF0b3I8PChDRlhfV2lkZVN0cmluZyk7Ci0gIHZvaWQgb3BlcmF0b3I+PihDRlhfV2lkZVN0cmluZyYpIGNvbnN0OwotICB2b2lkIG9wZXJhdG9yPDwoY29uc3QgRlhfV0NIQVIqIGNfc3RyaW5nKTsKLSAgdm9pZCBvcGVyYXRvcjw8KHY4OjpMb2NhbDx2ODo6T2JqZWN0Pik7Ci0gIHZvaWQgb3BlcmF0b3I+Pih2ODo6TG9jYWw8djg6Ok9iamVjdD4mKSBjb25zdDsKLSAgdm9pZCBvcGVyYXRvcj4+KENKU19BcnJheSYgYXJyYXkpIGNvbnN0OwotICB2b2lkIG9wZXJhdG9yPDwoQ0pTX0FycmF5JiBhcnJheSk7Ci0gIHZvaWQgb3BlcmF0b3I8PChDSlNfRGF0ZSYgZGF0ZSk7Ci0gIHZvaWQgb3BlcmF0b3I+PihDSlNfRGF0ZSYgZGF0ZSkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBib29sIG1fYklzU2V0dGluZzsKLSAgQ0pTX1ZhbHVlIG1fVmFsdWU7Ci0gIENKU19SdW50aW1lKiBjb25zdCBtX3BKU1J1bnRpbWU7Ci19OwotCi1jbGFzcyBDSlNfQXJyYXkgewotIHB1YmxpYzoKLSAgQ0pTX0FycmF5KCk7Ci0gIENKU19BcnJheShjb25zdCBDSlNfQXJyYXkmIG90aGVyKTsKLSAgdmlydHVhbCB+Q0pTX0FycmF5KCk7Ci0KLSAgdm9pZCBBdHRhY2godjg6OkxvY2FsPHY4OjpBcnJheT4gcEFycmF5KTsKLSAgaW50IEdldExlbmd0aChDSlNfUnVudGltZSogcFJ1bnRpbWUpIGNvbnN0OwotCi0gIC8vIFRoZXNlIHR3byBjYWxscyBtYXkgcmUtZW50ZXIgSlMgKGFuZCBoZW5jZSBpbnZhbGlkYXRlIG9iamVjdHMpLgotICB2b2lkIEdldEVsZW1lbnQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZhbHVlKSBjb25zdDsKLSAgdm9pZCBTZXRFbGVtZW50KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluZGV4LAotICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX1ZhbHVlJiB2YWx1ZSk7Ci0KLSAgdjg6OkxvY2FsPHY4OjpBcnJheT4gVG9WOEFycmF5KENKU19SdW50aW1lKiBwUnVudGltZSkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBtdXRhYmxlIHY4OjpMb2NhbDx2ODo6QXJyYXk+IG1fcEFycmF5OwotfTsKLQotY2xhc3MgQ0pTX0RhdGUgewotIHB1YmxpYzoKLSAgQ0pTX0RhdGUoKTsKLSAgQ0pTX0RhdGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBkb3VibGUgZE1zZWNfdGltZSk7Ci0gIENKU19EYXRlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgaW50IHllYXIsCi0gICAgICAgICAgIGludCBtb24sCi0gICAgICAgICAgIGludCBkYXksCi0gICAgICAgICAgIGludCBob3VyLAotICAgICAgICAgICBpbnQgbWluLAotICAgICAgICAgICBpbnQgc2VjKTsKLSAgdmlydHVhbCB+Q0pTX0RhdGUoKTsKLQotICB2b2lkIEF0dGFjaCh2ODo6TG9jYWw8djg6OkRhdGU+IHBEYXRlKTsKLSAgYm9vbCBJc1ZhbGlkRGF0ZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIGNvbnN0OwotCi0gIGludCBHZXRZZWFyKENKU19SdW50aW1lKiBwUnVudGltZSkgY29uc3Q7Ci0gIHZvaWQgU2V0WWVhcihDSlNfUnVudGltZSogcFJ1bnRpbWUsIGludCBpWWVhcik7Ci0KLSAgaW50IEdldE1vbnRoKENKU19SdW50aW1lKiBwUnVudGltZSkgY29uc3Q7Ci0gIHZvaWQgU2V0TW9udGgoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBpbnQgaU1vbnRoKTsKLQotICBpbnQgR2V0RGF5KENKU19SdW50aW1lKiBwUnVudGltZSkgY29uc3Q7Ci0gIHZvaWQgU2V0RGF5KENKU19SdW50aW1lKiBwUnVudGltZSwgaW50IGlEYXkpOwotCi0gIGludCBHZXRIb3VycyhDSlNfUnVudGltZSogcFJ1bnRpbWUpIGNvbnN0OwotICB2b2lkIFNldEhvdXJzKENKU19SdW50aW1lKiBwUnVudGltZSwgaW50IGlIb3Vycyk7Ci0KLSAgaW50IEdldE1pbnV0ZXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSBjb25zdDsKLSAgdm9pZCBTZXRNaW51dGVzKENKU19SdW50aW1lKiBwUnVudGltZSwgaW50IG1pbnV0ZXMpOwotCi0gIGludCBHZXRTZWNvbmRzKENKU19SdW50aW1lKiBwUnVudGltZSkgY29uc3Q7Ci0gIHZvaWQgU2V0U2Vjb25kcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsIGludCBzZWNvbmRzKTsKLQotICB2ODo6TG9jYWw8djg6OkRhdGU+IFRvVjhEYXRlKENKU19SdW50aW1lKiBwUnVudGltZSkgY29uc3Q7Ci0gIGRvdWJsZSBUb0RvdWJsZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIGNvbnN0OwotICBDRlhfV2lkZVN0cmluZyBUb1N0cmluZyhDSlNfUnVudGltZSogcFJ1bnRpbWUpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgotICB2ODo6TG9jYWw8djg6OkRhdGU+IG1fcERhdGU7Ci19OwotCi1kb3VibGUgSlNfR2V0RGF0ZVRpbWUoKTsKLWludCBKU19HZXRZZWFyRnJvbVRpbWUoZG91YmxlIGR0KTsKLWludCBKU19HZXRNb250aEZyb21UaW1lKGRvdWJsZSBkdCk7Ci1pbnQgSlNfR2V0RGF5RnJvbVRpbWUoZG91YmxlIGR0KTsKLWludCBKU19HZXRIb3VyRnJvbVRpbWUoZG91YmxlIGR0KTsKLWludCBKU19HZXRNaW5Gcm9tVGltZShkb3VibGUgZHQpOwotaW50IEpTX0dldFNlY0Zyb21UaW1lKGRvdWJsZSBkdCk7Ci1kb3VibGUgSlNfRGF0ZVBhcnNlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOwotZG91YmxlIEpTX01ha2VEYXkoaW50IG5ZZWFyLCBpbnQgbk1vbnRoLCBpbnQgbkRheSk7Ci1kb3VibGUgSlNfTWFrZVRpbWUoaW50IG5Ib3VyLCBpbnQgbk1pbiwgaW50IG5TZWMsIGludCBuTXMpOwotZG91YmxlIEpTX01ha2VEYXRlKGRvdWJsZSBkYXksIGRvdWJsZSB0aW1lKTsKLWJvb2wgSlNfUG9ydElzTmFuKGRvdWJsZSBkKTsKLWRvdWJsZSBKU19Mb2NhbFRpbWUoZG91YmxlIGQpOwotCi0vLyBTb21lIEpTIG1ldGhvZHMgaGF2ZSB0aGUgYml6YXJyZSBjb252ZW50aW9uIHRoYXQgdGhleSBtYXkgYWxzbyBiZSBjYWxsZWQKLS8vIHdpdGggYSBzaW5nbGUgYXJndW1lbnQgd2hpY2ggaXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGFjdHVhbCBhcmd1bWVudHMKLS8vIGFzIGl0cyBwcm9wZXJ0aWVzLiBUaGUgdmFyeWluZyBhcmd1bWVudHMgdG8gdGhpcyBtZXRob2QgYXJlIHRoZSBwcm9wZXJ0eQotLy8gbmFtZXMgYXMgd2NoYXJfdCBzdHJpbmcgbGl0ZXJhbHMgY29ycmVzcG9uZGluZyB0byBlYWNoIHBvc2l0aW9uYWwgYXJndW1lbnQuCi0vLyBUaGUgcmVzdWx0IHdpbGwgYWx3YXlzIGNvbnRhaW4gfG5LZXl3b3Jkc3wgdmFsdWUsIHdpdGggdW5zcGVjaWZpZWQgb25lcwotLy8gYmVpbmcgc2V0IHRvIHR5cGUgVlRfdW5rbm93bi4KLXN0ZDo6dmVjdG9yPENKU19WYWx1ZT4gSlNfRXhwYW5kS2V5d29yZFBhcmFtcygKLSAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgb3JpZ2luYWxzLAotICAgIHNpemVfdCBuS2V5d29yZHMsCi0gICAgLi4uKTsKLQotI2VuZGlmICAvLyBGUERGU0RLX0pBVkFTQ1JJUFRfSlNfVkFMVUVfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmNwcCBiL2ZwZGZzZGsvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjYmMzNC4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODAxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8aW9tYW5pcD4KLSNpbmNsdWRlIDxsaW1pdHM+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwZGZfaW50ZXJmb3JtLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9leHQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfZm9ybWZpbGxlbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19pbnRlcmZvcm0uaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvRmllbGQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19PYmplY3QuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfVmFsdWUuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvY2pzX2V2ZW50X2NvbnRleHQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvY2pzX3J1bnRpbWUuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvY29sb3IuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvcmVzb3VyY2UuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvdXRpbC5oIgotCi0jZGVmaW5lIERPVUJMRV9DT1JSRUNUIDAuMDAwMDAwMDAwMDAwMDAxCi0KLUpTTWV0aG9kU3BlYyBDSlNfUHVibGljTWV0aG9kczo6R2xvYmFsRnVuY3Rpb25TcGVjc1tdID0gewotICAgIHsiQUZOdW1iZXJfRm9ybWF0IiwgQUZOdW1iZXJfRm9ybWF0X3N0YXRpY30sCi0gICAgeyJBRk51bWJlcl9LZXlzdHJva2UiLCBBRk51bWJlcl9LZXlzdHJva2Vfc3RhdGljfSwKLSAgICB7IkFGUGVyY2VudF9Gb3JtYXQiLCBBRlBlcmNlbnRfRm9ybWF0X3N0YXRpY30sCi0gICAgeyJBRlBlcmNlbnRfS2V5c3Ryb2tlIiwgQUZQZXJjZW50X0tleXN0cm9rZV9zdGF0aWN9LAotICAgIHsiQUZEYXRlX0Zvcm1hdEV4IiwgQUZEYXRlX0Zvcm1hdEV4X3N0YXRpY30sCi0gICAgeyJBRkRhdGVfS2V5c3Ryb2tlRXgiLCBBRkRhdGVfS2V5c3Ryb2tlRXhfc3RhdGljfSwKLSAgICB7IkFGRGF0ZV9Gb3JtYXQiLCBBRkRhdGVfRm9ybWF0X3N0YXRpY30sCi0gICAgeyJBRkRhdGVfS2V5c3Ryb2tlIiwgQUZEYXRlX0tleXN0cm9rZV9zdGF0aWN9LAotICAgIHsiQUZUaW1lX0Zvcm1hdEV4IiwgQUZUaW1lX0Zvcm1hdEV4X3N0YXRpY30sCi0gICAgeyJBRlRpbWVfS2V5c3Ryb2tlRXgiLCBBRlRpbWVfS2V5c3Ryb2tlRXhfc3RhdGljfSwKLSAgICB7IkFGVGltZV9Gb3JtYXQiLCBBRlRpbWVfRm9ybWF0X3N0YXRpY30sCi0gICAgeyJBRlRpbWVfS2V5c3Ryb2tlIiwgQUZUaW1lX0tleXN0cm9rZV9zdGF0aWN9LAotICAgIHsiQUZTcGVjaWFsX0Zvcm1hdCIsIEFGU3BlY2lhbF9Gb3JtYXRfc3RhdGljfSwKLSAgICB7IkFGU3BlY2lhbF9LZXlzdHJva2UiLCBBRlNwZWNpYWxfS2V5c3Ryb2tlX3N0YXRpY30sCi0gICAgeyJBRlNwZWNpYWxfS2V5c3Ryb2tlRXgiLCBBRlNwZWNpYWxfS2V5c3Ryb2tlRXhfc3RhdGljfSwKLSAgICB7IkFGU2ltcGxlIiwgQUZTaW1wbGVfc3RhdGljfSwKLSAgICB7IkFGTWFrZU51bWJlciIsIEFGTWFrZU51bWJlcl9zdGF0aWN9LAotICAgIHsiQUZTaW1wbGVfQ2FsY3VsYXRlIiwgQUZTaW1wbGVfQ2FsY3VsYXRlX3N0YXRpY30sCi0gICAgeyJBRlJhbmdlX1ZhbGlkYXRlIiwgQUZSYW5nZV9WYWxpZGF0ZV9zdGF0aWN9LAotICAgIHsiQUZNZXJnZUNoYW5nZSIsIEFGTWVyZ2VDaGFuZ2Vfc3RhdGljfSwKLSAgICB7IkFGUGFyc2VEYXRlRXgiLCBBRlBhcnNlRGF0ZUV4X3N0YXRpY30sCi0gICAgeyJBRkV4dHJhY3ROdW1zIiwgQUZFeHRyYWN0TnVtc19zdGF0aWN9LAotICAgIHswLCAwfX07Ci0KLUlNUExFTUVOVF9KU19TVEFUSUNfR0xPQkFMX0ZVTihDSlNfUHVibGljTWV0aG9kcykKLQotbmFtZXNwYWNlIHsKLQotY29uc3QgRlhfV0NIQVIqIGNvbnN0IG1vbnRoc1tdID0ge0wiSmFuIiwgTCJGZWIiLCBMIk1hciIsIEwiQXByIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIk1heSIsIEwiSnVuIiwgTCJKdWwiLCBMIkF1ZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJTZXAiLCBMIk9jdCIsIEwiTm92IiwgTCJEZWMifTsKLQotY29uc3QgRlhfV0NIQVIqIGNvbnN0IGZ1bGxtb250aHNbXSA9IHtMIkphbnVhcnkiLCBMIkZlYnJ1YXJ5IiwgTCJNYXJjaCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiQXByaWwiLCAgIEwiTWF5IiwgICAgICBMIkp1bmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkp1bHkiLCAgICBMIkF1Z3VzdCIsICAgTCJTZXB0ZW1iZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIk9jdG9iZXIiLCBMIk5vdmVtYmVyIiwgTCJEZWNlbWJlciJ9OwotCi1DRlhfQnl0ZVN0cmluZyBTdHJUcmltKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBwU3RyKSB7Ci0gIENGWF9CeXRlU3RyaW5nIHJlc3VsdChwU3RyKTsKLSAgcmVzdWx0LlRyaW1MZWZ0KCcgJyk7Ci0gIHJlc3VsdC5UcmltUmlnaHQoJyAnKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgU3RyVHJpbShjb25zdCBDRlhfV2lkZVN0cmluZyYgcFN0cikgewotICBDRlhfV2lkZVN0cmluZyByZXN1bHQocFN0cik7Ci0gIHJlc3VsdC5UcmltTGVmdCgnICcpOwotICByZXN1bHQuVHJpbVJpZ2h0KCcgJyk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgQWxlcnRJZlBvc3NpYmxlKENKU19FdmVudENvbnRleHQqIHBDb250ZXh0LCBjb25zdCBGWF9XQ0hBUiogc3dNc2cpIHsKLSAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYgPSBwQ29udGV4dC0+R2V0Rm9ybUZpbGxFbnYoKTsKLSAgaWYgKHBGb3JtRmlsbEVudikKLSAgICBwRm9ybUZpbGxFbnYtPkpTX2FwcEFsZXJ0KHN3TXNnLCBudWxscHRyLCAwLCAzKTsKLX0KLQotI2lmIF9GWF9PU18gIT0gX0ZYX0FORFJPSURfCi1DRlhfQnl0ZVN0cmluZyBDYWxjdWxhdGVTdHJpbmcoZG91YmxlIGRWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaURlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGlEZWMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGJOZWdhdGl2ZSkgewotICAqYk5lZ2F0aXZlID0gZFZhbHVlIDwgMDsKLSAgaWYgKCpiTmVnYXRpdmUpCi0gICAgZFZhbHVlID0gLWRWYWx1ZTsKLQotICAvLyBNYWtlIHN1cmUgdGhlIG51bWJlciBvZiBwcmVjaXNpb24gY2hhcmFjdGVycyB3aWxsIGZpdC4KLSAgaWYgKGlEZWMgPiBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRpZ2l0czEwKQotICAgIGlEZWMgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmRpZ2l0czEwOwotCi0gIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwotICBzcyA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKGlEZWMpIDw8IGRWYWx1ZTsKLSAgc3RkOjpzdHJpbmcgc3RyaW5nVmFsdWUgPSBzcy5zdHIoKTsKLSAgc2l6ZV90IGlEZWNpbWFsUG9zID0gc3RyaW5nVmFsdWUuZmluZCgiLiIpOwotICAqaURlYzIgPSBpRGVjaW1hbFBvcyA9PSBzdGQ6OnN0cmluZzo6bnBvcyA/IHN0cmluZ1ZhbHVlLnNpemUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHN0YXRpY19jYXN0PGludD4oaURlY2ltYWxQb3MpOwotICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoc3RyaW5nVmFsdWUuY19zdHIoKSk7Ci19Ci0jZW5kaWYKLQotfSAgLy8gbmFtZXNwYWNlCi0KLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OklzTnVtYmVyKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgc1RyaW0gPSBTdHJUcmltKHN0cik7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwVHJpbSA9IHNUcmltLmNfc3RyKCk7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwID0gcFRyaW07Ci0gIGJvb2wgYkRvdCA9IGZhbHNlOwotICBib29sIGJLWEpTID0gZmFsc2U7Ci0KLSAgd2NoYXJfdCBjOwotICB3aGlsZSAoKGMgPSAqcCkgIT0gTCdcMCcpIHsKLSAgICBpZiAoYyA9PSBMJy4nIHx8IGMgPT0gTCcsJykgewotICAgICAgaWYgKGJEb3QpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIGJEb3QgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoYyA9PSBMJy0nIHx8IGMgPT0gTCcrJykgewotICAgICAgaWYgKHAgIT0gcFRyaW0pCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKGMgPT0gTCdlJyB8fCBjID09IEwnRScpIHsKLSAgICAgIGlmIChiS1hKUykKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICBwKys7Ci0gICAgICBjID0gKnA7Ci0gICAgICBpZiAoYyA9PSBMJysnIHx8IGMgPT0gTCctJykgewotICAgICAgICBiS1hKUyA9IHRydWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICghRlhTWVNfaXN3ZGlnaXQoYykpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcCsrOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6Om1hc2tTYXRpc2ZpZWQod2NoYXJfdCBjX0NoYW5nZSwgd2NoYXJfdCBjX01hc2spIHsKLSAgc3dpdGNoIChjX01hc2spIHsKLSAgICBjYXNlIEwnOSc6Ci0gICAgICByZXR1cm4gRlhTWVNfaXN3ZGlnaXQoY19DaGFuZ2UpOwotICAgIGNhc2UgTCdBJzoKLSAgICAgIHJldHVybiBGWFNZU19pc3dhbHBoYShjX0NoYW5nZSk7Ci0gICAgY2FzZSBMJ08nOgotICAgICAgcmV0dXJuIEZYU1lTX2lzd2FsbnVtKGNfQ2hhbmdlKTsKLSAgICBjYXNlIEwnWCc6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIChjX0NoYW5nZSA9PSBjX01hc2spOwotICB9Ci19Ci0KLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OmlzUmVzZXJ2ZWRNYXNrQ2hhcih3Y2hhcl90IGNoKSB7Ci0gIHJldHVybiBjaCA9PSBMJzknIHx8IGNoID09IEwnQScgfHwgY2ggPT0gTCdPJyB8fCBjaCA9PSBMJ1gnOwotfQotCi1kb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OkFGX1NpbXBsZShjb25zdCBGWF9XQ0hBUiogc0Z1Y3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZFZhbHVlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkVmFsdWUyKSB7Ci0gIGlmIChGWFNZU193Y3NpY21wKHNGdWN0aW9uLCBMIkFWRyIpID09IDAgfHwKLSAgICAgIEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sIEwiU1VNIikgPT0gMCkgewotICAgIHJldHVybiBkVmFsdWUxICsgZFZhbHVlMjsKLSAgfQotICBpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbiwgTCJQUkQiKSA9PSAwKSB7Ci0gICAgcmV0dXJuIGRWYWx1ZTEgKiBkVmFsdWUyOwotICB9Ci0gIGlmIChGWFNZU193Y3NpY21wKHNGdWN0aW9uLCBMIk1JTiIpID09IDApIHsKLSAgICByZXR1cm4gc3RkOjptaW4oZFZhbHVlMSwgZFZhbHVlMik7Ci0gIH0KLSAgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sIEwiTUFYIikgPT0gMCkgewotICAgIHJldHVybiBzdGQ6Om1heChkVmFsdWUxLCBkVmFsdWUyKTsKLSAgfQotICByZXR1cm4gZFZhbHVlMTsKLX0KLQotQ0pTX0FycmF5IENKU19QdWJsaWNNZXRob2RzOjpBRl9NYWtlQXJyYXlGcm9tTGlzdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSB2YWwpIHsKLSAgQ0pTX0FycmF5IFN0ckFycmF5OwotICBpZiAodmFsLklzQXJyYXlPYmplY3QoKSkgewotICAgIHZhbC5Db252ZXJ0VG9BcnJheShwUnVudGltZSwgU3RyQXJyYXkpOwotICAgIHJldHVybiBTdHJBcnJheTsKLSAgfQotICBDRlhfV2lkZVN0cmluZyB3c1N0ciA9IHZhbC5Ub0NGWFdpZGVTdHJpbmcocFJ1bnRpbWUpOwotICBDRlhfQnl0ZVN0cmluZyB0ID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHdzU3RyKTsKLSAgY29uc3QgY2hhciogcCA9IHQuY19zdHIoKTsKLQotICBpbnQgY2ggPSAnLCc7Ci0gIGludCBuSW5kZXggPSAwOwotCi0gIHdoaWxlICgqcCkgewotICAgIGNvbnN0IGNoYXIqIHBUZW1wID0gc3RyY2hyKHAsIGNoKTsKLSAgICBpZiAoIXBUZW1wKSB7Ci0gICAgICBTdHJBcnJheS5TZXRFbGVtZW50KAotICAgICAgICAgIHBSdW50aW1lLCBuSW5kZXgsCi0gICAgICAgICAgQ0pTX1ZhbHVlKHBSdW50aW1lLCBTdHJUcmltKENGWF9CeXRlU3RyaW5nKHApKS5jX3N0cigpKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjaGFyKiBwU3ViID0gbmV3IGNoYXJbcFRlbXAgLSBwICsgMV07Ci0gICAgc3RybmNweShwU3ViLCBwLCBwVGVtcCAtIHApOwotICAgICoocFN1YiArIChwVGVtcCAtIHApKSA9ICdcMCc7Ci0KLSAgICBTdHJBcnJheS5TZXRFbGVtZW50KAotICAgICAgICBwUnVudGltZSwgbkluZGV4LAotICAgICAgICBDSlNfVmFsdWUocFJ1bnRpbWUsIFN0clRyaW0oQ0ZYX0J5dGVTdHJpbmcocFN1YikpLmNfc3RyKCkpKTsKLSAgICBkZWxldGVbXSBwU3ViOwotCi0gICAgbkluZGV4Kys7Ci0gICAgcCA9ICsrcFRlbXA7Ci0gIH0KLSAgcmV0dXJuIFN0ckFycmF5OwotfQotCi1pbnQgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlU3RyaW5nSW50ZWdlcihjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgblNraXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbk1heFN0ZXApIHsKLSAgaW50IG5SZXQgPSAwOwotICBuU2tpcCA9IDA7Ci0gIGZvciAoaW50IGkgPSBuU3RhcnQsIHN6ID0gc3RyLkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykgewotICAgIGlmIChpIC0gblN0YXJ0ID4gMTApCi0gICAgICBicmVhazsKLQotICAgIEZYX1dDSEFSIGMgPSBzdHIuR2V0QXQoaSk7Ci0gICAgaWYgKCFGWFNZU19pc3dkaWdpdChjKSkKLSAgICAgIGJyZWFrOwotCi0gICAgblJldCA9IG5SZXQgKiAxMCArIEZYU1lTX3RvRGVjaW1hbERpZ2l0KGMpOwotICAgIG5Ta2lwID0gaSAtIG5TdGFydCArIDE7Ci0gICAgaWYgKG5Ta2lwID49IG5NYXhTdGVwKQotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gblJldDsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlU3RyaW5nU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5Ta2lwKSB7Ci0gIENGWF9XaWRlU3RyaW5nIHN3UmV0OwotICBuU2tpcCA9IDA7Ci0gIGZvciAoaW50IGkgPSBuU3RhcnQsIHN6ID0gc3RyLkdldExlbmd0aCgpOyBpIDwgc3o7IGkrKykgewotICAgIEZYX1dDSEFSIGMgPSBzdHIuR2V0QXQoaSk7Ci0gICAgaWYgKCFGWFNZU19pc3dkaWdpdChjKSkKLSAgICAgIGJyZWFrOwotCi0gICAgc3dSZXQgKz0gYzsKLSAgICBuU2tpcCA9IGkgLSBuU3RhcnQgKyAxOwotICB9Ci0KLSAgcmV0dXJuIHN3UmV0OwotfQotCi1kb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlTm9ybWFsRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBiV3JvbmdGb3JtYXQpIHsKLSAgZG91YmxlIGR0ID0gSlNfR2V0RGF0ZVRpbWUoKTsKLQotICBpbnQgblllYXIgPSBKU19HZXRZZWFyRnJvbVRpbWUoZHQpOwotICBpbnQgbk1vbnRoID0gSlNfR2V0TW9udGhGcm9tVGltZShkdCkgKyAxOwotICBpbnQgbkRheSA9IEpTX0dldERheUZyb21UaW1lKGR0KTsKLSAgaW50IG5Ib3VyID0gSlNfR2V0SG91ckZyb21UaW1lKGR0KTsKLSAgaW50IG5NaW4gPSBKU19HZXRNaW5Gcm9tVGltZShkdCk7Ci0gIGludCBuU2VjID0gSlNfR2V0U2VjRnJvbVRpbWUoZHQpOwotCi0gIGludCBudW1iZXJbM107Ci0KLSAgaW50IG5Ta2lwID0gMDsKLSAgaW50IG5MZW4gPSB2YWx1ZS5HZXRMZW5ndGgoKTsKLSAgaW50IG5JbmRleCA9IDA7Ci0gIGludCBpID0gMDsKLSAgd2hpbGUgKGkgPCBuTGVuKSB7Ci0gICAgaWYgKG5JbmRleCA+IDIpCi0gICAgICBicmVhazsKLQotICAgIEZYX1dDSEFSIGMgPSB2YWx1ZS5HZXRBdChpKTsKLSAgICBpZiAoRlhTWVNfaXN3ZGlnaXQoYykpIHsKLSAgICAgIG51bWJlcltuSW5kZXgrK10gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGksIG5Ta2lwLCA0KTsKLSAgICAgIGkgKz0gblNraXA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGkrKzsKLSAgICB9Ci0gIH0KLQotICBpZiAobkluZGV4ID09IDIpIHsKLSAgICAvLyBjYXNlMjogbW9udGgvZGF5Ci0gICAgLy8gY2FzZTM6IGRheS9tb250aAotICAgIGlmICgobnVtYmVyWzBdID49IDEgJiYgbnVtYmVyWzBdIDw9IDEyKSAmJgotICAgICAgICAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDMxKSkgewotICAgICAgbk1vbnRoID0gbnVtYmVyWzBdOwotICAgICAgbkRheSA9IG51bWJlclsxXTsKLSAgICB9IGVsc2UgaWYgKChudW1iZXJbMF0gPj0gMSAmJiBudW1iZXJbMF0gPD0gMzEpICYmCi0gICAgICAgICAgICAgICAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDEyKSkgewotICAgICAgbkRheSA9IG51bWJlclswXTsKLSAgICAgIG5Nb250aCA9IG51bWJlclsxXTsKLSAgICB9Ci0KLSAgICBpZiAoYldyb25nRm9ybWF0KQotICAgICAgKmJXcm9uZ0Zvcm1hdCA9IGZhbHNlOwotICB9IGVsc2UgaWYgKG5JbmRleCA9PSAzKSB7Ci0gICAgLy8gY2FzZTE6IHllYXIvbW9udGgvZGF5Ci0gICAgLy8gY2FzZTI6IG1vbnRoL2RheS95ZWFyCi0gICAgLy8gY2FzZTM6IGRheS9tb250aC95ZWFyCi0KLSAgICBpZiAobnVtYmVyWzBdID4gMTIgJiYgKG51bWJlclsxXSA+PSAxICYmIG51bWJlclsxXSA8PSAxMikgJiYKLSAgICAgICAgKG51bWJlclsyXSA+PSAxICYmIG51bWJlclsyXSA8PSAzMSkpIHsKLSAgICAgIG5ZZWFyID0gbnVtYmVyWzBdOwotICAgICAgbk1vbnRoID0gbnVtYmVyWzFdOwotICAgICAgbkRheSA9IG51bWJlclsyXTsKLSAgICB9IGVsc2UgaWYgKChudW1iZXJbMF0gPj0gMSAmJiBudW1iZXJbMF0gPD0gMTIpICYmCi0gICAgICAgICAgICAgICAobnVtYmVyWzFdID49IDEgJiYgbnVtYmVyWzFdIDw9IDMxKSAmJiBudW1iZXJbMl0gPiAzMSkgewotICAgICAgbk1vbnRoID0gbnVtYmVyWzBdOwotICAgICAgbkRheSA9IG51bWJlclsxXTsKLSAgICAgIG5ZZWFyID0gbnVtYmVyWzJdOwotICAgIH0gZWxzZSBpZiAoKG51bWJlclswXSA+PSAxICYmIG51bWJlclswXSA8PSAzMSkgJiYKLSAgICAgICAgICAgICAgIChudW1iZXJbMV0gPj0gMSAmJiBudW1iZXJbMV0gPD0gMTIpICYmIG51bWJlclsyXSA+IDMxKSB7Ci0gICAgICBuRGF5ID0gbnVtYmVyWzBdOwotICAgICAgbk1vbnRoID0gbnVtYmVyWzFdOwotICAgICAgblllYXIgPSBudW1iZXJbMl07Ci0gICAgfQotCi0gICAgaWYgKGJXcm9uZ0Zvcm1hdCkKLSAgICAgICpiV3JvbmdGb3JtYXQgPSBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoYldyb25nRm9ybWF0KQotICAgICAgKmJXcm9uZ0Zvcm1hdCA9IHRydWU7Ci0gICAgcmV0dXJuIGR0OwotICB9Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgc3dUZW1wOwotICBzd1RlbXAuRm9ybWF0KEwiJWQvJWQvJWQgJWQ6JWQ6JWQiLCBuTW9udGgsIG5EYXksIG5ZZWFyLCBuSG91ciwgbk1pbiwgblNlYyk7Ci0gIHJldHVybiBKU19EYXRlUGFyc2Uoc3dUZW1wKTsKLX0KLQotZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpNYWtlUmVndWxhckRhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGJXcm9uZ0Zvcm1hdCkgewotICBkb3VibGUgZHQgPSBKU19HZXREYXRlVGltZSgpOwotCi0gIGlmIChmb3JtYXQuSXNFbXB0eSgpIHx8IHZhbHVlLklzRW1wdHkoKSkKLSAgICByZXR1cm4gZHQ7Ci0KLSAgaW50IG5ZZWFyID0gSlNfR2V0WWVhckZyb21UaW1lKGR0KTsKLSAgaW50IG5Nb250aCA9IEpTX0dldE1vbnRoRnJvbVRpbWUoZHQpICsgMTsKLSAgaW50IG5EYXkgPSBKU19HZXREYXlGcm9tVGltZShkdCk7Ci0gIGludCBuSG91ciA9IEpTX0dldEhvdXJGcm9tVGltZShkdCk7Ci0gIGludCBuTWluID0gSlNfR2V0TWluRnJvbVRpbWUoZHQpOwotICBpbnQgblNlYyA9IEpTX0dldFNlY0Zyb21UaW1lKGR0KTsKLQotICBpbnQgblllYXJTdWIgPSA5OTsgIC8vIG5ZZWFyIC0gMjAwMDsKLQotICBib29sIGJQbSA9IGZhbHNlOwotICBib29sIGJFeGl0ID0gZmFsc2U7Ci0gIGJvb2wgYkJhZEZvcm1hdCA9IGZhbHNlOwotCi0gIGludCBpID0gMDsKLSAgaW50IGogPSAwOwotCi0gIHdoaWxlIChpIDwgZm9ybWF0LkdldExlbmd0aCgpKSB7Ci0gICAgaWYgKGJFeGl0KQotICAgICAgYnJlYWs7Ci0KLSAgICBGWF9XQ0hBUiBjID0gZm9ybWF0LkdldEF0KGkpOwotICAgIHN3aXRjaCAoYykgewotICAgICAgY2FzZSAnOic6Ci0gICAgICBjYXNlICcuJzoKLSAgICAgIGNhc2UgJy0nOgotICAgICAgY2FzZSAnXFwnOgotICAgICAgY2FzZSAnLyc6Ci0gICAgICAgIGkrKzsKLSAgICAgICAgaisrOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAneSc6Ci0gICAgICBjYXNlICdtJzoKLSAgICAgIGNhc2UgJ2QnOgotICAgICAgY2FzZSAnSCc6Ci0gICAgICBjYXNlICdoJzoKLSAgICAgIGNhc2UgJ00nOgotICAgICAgY2FzZSAncyc6Ci0gICAgICBjYXNlICd0JzogewotICAgICAgICBpbnQgb2xkaiA9IGo7Ci0gICAgICAgIGludCBuU2tpcCA9IDA7Ci0gICAgICAgIGludCByZW1haW5pbmcgPSBmb3JtYXQuR2V0TGVuZ3RoKCkgLSBpIC0gMTsKLQotICAgICAgICBpZiAocmVtYWluaW5nID09IDAgfHwgZm9ybWF0LkdldEF0KGkgKyAxKSAhPSBjKSB7Ci0gICAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgICBjYXNlICd5JzoKLSAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnbSc6Ci0gICAgICAgICAgICAgIG5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwotICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgIGogKz0gblNraXA7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICAgIG5EYXkgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKLSAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICBqICs9IG5Ta2lwOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ0gnOgotICAgICAgICAgICAgICBuSG91ciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwotICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgIGogKz0gblNraXA7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnaCc6Ci0gICAgICAgICAgICAgIG5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7Ci0gICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgaiArPSBuU2tpcDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdNJzoKLSAgICAgICAgICAgICAgbk1pbiA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwotICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgIGogKz0gblNraXA7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICAgIG5TZWMgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKLSAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICBqICs9IG5Ta2lwOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgICAgICBiUG0gPSAoaiA8IHZhbHVlLkdldExlbmd0aCgpICYmIHZhbHVlLkdldEF0KGopID09ICdwJyk7Ci0gICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgaisrOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nID09IDEgfHwgZm9ybWF0LkdldEF0KGkgKyAyKSAhPSBjKSB7Ci0gICAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgICBjYXNlICd5JzoKLSAgICAgICAgICAgICAgblllYXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCA0KTsKLSAgICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgICBqICs9IG5Ta2lwOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ20nOgotICAgICAgICAgICAgICBuTW9udGggPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKLSAgICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgICBqICs9IG5Ta2lwOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ2QnOgotICAgICAgICAgICAgICBuRGF5ID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7Ci0gICAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgICAgICAgaiArPSBuU2tpcDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdIJzoKLSAgICAgICAgICAgICAgbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKLSAgICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgICBqICs9IG5Ta2lwOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ2gnOgotICAgICAgICAgICAgICBuSG91ciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDIpOwotICAgICAgICAgICAgICBpICs9IDI7Ci0gICAgICAgICAgICAgIGogKz0gblNraXA7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnTSc6Ci0gICAgICAgICAgICAgIG5NaW4gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCAyKTsKLSAgICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgICBqICs9IG5Ta2lwOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgICAgICBuU2VjID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCBuU2tpcCwgMik7Ci0gICAgICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgICAgICAgaiArPSBuU2tpcDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICAgICAgYlBtID0gKGogKyAxIDwgdmFsdWUuR2V0TGVuZ3RoKCkgJiYgdmFsdWUuR2V0QXQoaikgPT0gJ3AnICYmCi0gICAgICAgICAgICAgICAgICAgICB2YWx1ZS5HZXRBdChqICsgMSkgPT0gJ20nKTsKLSAgICAgICAgICAgICAgaSArPSAyOwotICAgICAgICAgICAgICBqICs9IDI7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChyZW1haW5pbmcgPT0gMiB8fCBmb3JtYXQuR2V0QXQoaSArIDMpICE9IGMpIHsKLSAgICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgICAgIGNhc2UgJ20nOiB7Ci0gICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNNb250aCA9IFBhcnNlU3RyaW5nU3RyaW5nKHZhbHVlLCBqLCBuU2tpcCk7Ci0gICAgICAgICAgICAgIGJvb2wgYkZpbmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCAxMjsgbSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNNb250aC5Db21wYXJlTm9DYXNlKG1vbnRoc1ttXSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgbk1vbnRoID0gbSArIDE7Ci0gICAgICAgICAgICAgICAgICBpICs9IDM7Ci0gICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwotICAgICAgICAgICAgICAgICAgYkZpbmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgaWYgKCFiRmluZCkgewotICAgICAgICAgICAgICAgIG5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDMpOwotICAgICAgICAgICAgICAgIGkgKz0gMzsKLSAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAneSc6Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgaSArPSAzOwotICAgICAgICAgICAgICBqICs9IDM7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChyZW1haW5pbmcgPT0gMyB8fCBmb3JtYXQuR2V0QXQoaSArIDQpICE9IGMpIHsKLSAgICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgICAgIGNhc2UgJ3knOgotICAgICAgICAgICAgICBuWWVhciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgblNraXAsIDQpOwotICAgICAgICAgICAgICBqICs9IG5Ta2lwOwotICAgICAgICAgICAgICBpICs9IDQ7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnbSc6IHsKLSAgICAgICAgICAgICAgYm9vbCBiRmluZCA9IGZhbHNlOwotCi0gICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHNNb250aCA9IFBhcnNlU3RyaW5nU3RyaW5nKHZhbHVlLCBqLCBuU2tpcCk7Ci0gICAgICAgICAgICAgIHNNb250aC5NYWtlTG93ZXIoKTsKLQotICAgICAgICAgICAgICBmb3IgKGludCBtID0gMDsgbSA8IDEyOyBtKyspIHsKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBzRnVsbE1vbnRocyA9IGZ1bGxtb250aHNbbV07Ci0gICAgICAgICAgICAgICAgc0Z1bGxNb250aHMuTWFrZUxvd2VyKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc0Z1bGxNb250aHMuRmluZChzTW9udGguY19zdHIoKSwgMCkgIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgIG5Nb250aCA9IG0gKyAxOwotICAgICAgICAgICAgICAgICAgaSArPSA0OwotICAgICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKLSAgICAgICAgICAgICAgICAgIGJGaW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIGlmICghYkZpbmQpIHsKLSAgICAgICAgICAgICAgICBuTW9udGggPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosIG5Ta2lwLCA0KTsKLSAgICAgICAgICAgICAgICBpICs9IDQ7Ci0gICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIGkgKz0gNDsKLSAgICAgICAgICAgICAgaiArPSA0OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKGogPj0gdmFsdWUuR2V0TGVuZ3RoKCkgfHwgZm9ybWF0LkdldEF0KGkpICE9IHZhbHVlLkdldEF0KGopKSB7Ci0gICAgICAgICAgICBiQmFkRm9ybWF0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGJFeGl0ID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaSsrOwotICAgICAgICAgIGorKzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvbGRqID09IGopIHsKLSAgICAgICAgICBiQmFkRm9ybWF0ID0gdHJ1ZTsKLSAgICAgICAgICBiRXhpdCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBpZiAodmFsdWUuR2V0TGVuZ3RoKCkgPD0gaikgewotICAgICAgICAgIGJFeGl0ID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQuR2V0QXQoaSkgIT0gdmFsdWUuR2V0QXQoaikpIHsKLSAgICAgICAgICBiQmFkRm9ybWF0ID0gdHJ1ZTsKLSAgICAgICAgICBiRXhpdCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpKys7Ci0gICAgICAgIGorKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGJQbSkKLSAgICBuSG91ciArPSAxMjsKLQotICBpZiAoblllYXIgPj0gMCAmJiBuWWVhciA8PSBuWWVhclN1YikKLSAgICBuWWVhciArPSAyMDAwOwotCi0gIGlmIChuTW9udGggPCAxIHx8IG5Nb250aCA+IDEyKQotICAgIGJCYWRGb3JtYXQgPSB0cnVlOwotCi0gIGlmIChuRGF5IDwgMSB8fCBuRGF5ID4gMzEpCi0gICAgYkJhZEZvcm1hdCA9IHRydWU7Ci0KLSAgaWYgKG5Ib3VyIDwgMCB8fCBuSG91ciA+IDI0KQotICAgIGJCYWRGb3JtYXQgPSB0cnVlOwotCi0gIGlmIChuTWluIDwgMCB8fCBuTWluID4gNjApCi0gICAgYkJhZEZvcm1hdCA9IHRydWU7Ci0KLSAgaWYgKG5TZWMgPCAwIHx8IG5TZWMgPiA2MCkKLSAgICBiQmFkRm9ybWF0ID0gdHJ1ZTsKLQotICBkb3VibGUgZFJldCA9IDA7Ci0gIGlmIChiQmFkRm9ybWF0KSB7Ci0gICAgZFJldCA9IFBhcnNlTm9ybWFsRGF0ZSh2YWx1ZSwgJmJCYWRGb3JtYXQpOwotICB9IGVsc2UgewotICAgIGRSZXQgPSBKU19NYWtlRGF0ZShKU19NYWtlRGF5KG5ZZWFyLCBuTW9udGggLSAxLCBuRGF5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgSlNfTWFrZVRpbWUobkhvdXIsIG5NaW4sIG5TZWMsIDApKTsKLSAgICBpZiAoSlNfUG9ydElzTmFuKGRSZXQpKQotICAgICAgZFJldCA9IEpTX0RhdGVQYXJzZSh2YWx1ZSk7Ci0gIH0KLQotICBpZiAoSlNfUG9ydElzTmFuKGRSZXQpKQotICAgIGRSZXQgPSBQYXJzZU5vcm1hbERhdGUodmFsdWUsICZiQmFkRm9ybWF0KTsKLQotICBpZiAoYldyb25nRm9ybWF0KQotICAgICpiV3JvbmdGb3JtYXQgPSBiQmFkRm9ybWF0OwotCi0gIHJldHVybiBkUmV0OwotfQotCi1DRlhfV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6TWFrZUZvcm1hdERhdGUoZG91YmxlIGREYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmb3JtYXQpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgc1JldCA9IEwiIiwgc1BhcnQgPSBMIiI7Ci0KLSAgaW50IG5ZZWFyID0gSlNfR2V0WWVhckZyb21UaW1lKGREYXRlKTsKLSAgaW50IG5Nb250aCA9IEpTX0dldE1vbnRoRnJvbVRpbWUoZERhdGUpICsgMTsKLSAgaW50IG5EYXkgPSBKU19HZXREYXlGcm9tVGltZShkRGF0ZSk7Ci0gIGludCBuSG91ciA9IEpTX0dldEhvdXJGcm9tVGltZShkRGF0ZSk7Ci0gIGludCBuTWluID0gSlNfR2V0TWluRnJvbVRpbWUoZERhdGUpOwotICBpbnQgblNlYyA9IEpTX0dldFNlY0Zyb21UaW1lKGREYXRlKTsKLQotICBpbnQgaSA9IDA7Ci0gIHdoaWxlIChpIDwgZm9ybWF0LkdldExlbmd0aCgpKSB7Ci0gICAgRlhfV0NIQVIgYyA9IGZvcm1hdC5HZXRBdChpKTsKLSAgICBpbnQgcmVtYWluaW5nID0gZm9ybWF0LkdldExlbmd0aCgpIC0gaSAtIDE7Ci0gICAgc1BhcnQgPSBMIiI7Ci0gICAgc3dpdGNoIChjKSB7Ci0gICAgICBjYXNlICd5JzoKLSAgICAgIGNhc2UgJ20nOgotICAgICAgY2FzZSAnZCc6Ci0gICAgICBjYXNlICdIJzoKLSAgICAgIGNhc2UgJ2gnOgotICAgICAgY2FzZSAnTSc6Ci0gICAgICBjYXNlICdzJzoKLSAgICAgIGNhc2UgJ3QnOgotICAgICAgICBpZiAocmVtYWluaW5nID09IDAgfHwgZm9ybWF0LkdldEF0KGkgKyAxKSAhPSBjKSB7Ci0gICAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgICBjYXNlICd5JzoKLSAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdtJzoKLSAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJWQiLCBuTW9udGgpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ2QnOgotICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlZCIsIG5EYXkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ0gnOgotICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlZCIsIG5Ib3VyKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdoJzoKLSAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJWQiLCBuSG91ciA+IDEyID8gbkhvdXIgLSAxMiA6IG5Ib3VyKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdNJzoKLSAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJWQiLCBuTWluKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdzJzoKLSAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJWQiLCBuU2VjKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICAgICAgc1BhcnQgKz0gbkhvdXIgPiAxMiA/ICdwJyA6ICdhJzsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGkrKzsKLSAgICAgICAgfSBlbHNlIGlmIChyZW1haW5pbmcgPT0gMSB8fCBmb3JtYXQuR2V0QXQoaSArIDIpICE9IGMpIHsKLSAgICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgICAgIGNhc2UgJ3knOgotICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIiwgblllYXIgLSAoblllYXIgLyAxMDApICogMTAwKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdtJzoKLSAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTAyZCIsIG5Nb250aCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnZCc6Ci0gICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiUwMmQiLCBuRGF5KTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdIJzoKLSAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTAyZCIsIG5Ib3VyKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdoJzoKLSAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTAyZCIsIG5Ib3VyID4gMTIgPyBuSG91ciAtIDEyIDogbkhvdXIpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ00nOgotICAgICAgICAgICAgICBzUGFydC5Gb3JtYXQoTCIlMDJkIiwgbk1pbik7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAncyc6Ci0gICAgICAgICAgICAgIHNQYXJ0LkZvcm1hdChMIiUwMmQiLCBuU2VjKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICd0JzoKLSAgICAgICAgICAgICAgc1BhcnQgPSBuSG91ciA+IDEyID8gTCJwbSIgOiBMImFtIjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGkgKz0gMjsKLSAgICAgICAgfSBlbHNlIGlmIChyZW1haW5pbmcgPT0gMiB8fCBmb3JtYXQuR2V0QXQoaSArIDMpICE9IGMpIHsKLSAgICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgICAgIGNhc2UgJ20nOgotICAgICAgICAgICAgICBpICs9IDM7Ci0gICAgICAgICAgICAgIGlmIChuTW9udGggPiAwICYmIG5Nb250aCA8PSAxMikKLSAgICAgICAgICAgICAgICBzUGFydCArPSBtb250aHNbbk1vbnRoIC0gMV07Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgaSArPSAzOwotICAgICAgICAgICAgICBzUGFydCArPSBjOwotICAgICAgICAgICAgICBzUGFydCArPSBjOwotICAgICAgICAgICAgICBzUGFydCArPSBjOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nID09IDMgfHwgZm9ybWF0LkdldEF0KGkgKyA0KSAhPSBjKSB7Ci0gICAgICAgICAgc3dpdGNoIChjKSB7Ci0gICAgICAgICAgICBjYXNlICd5JzoKLSAgICAgICAgICAgICAgc1BhcnQuRm9ybWF0KEwiJTA0ZCIsIG5ZZWFyKTsKLSAgICAgICAgICAgICAgaSArPSA0OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ20nOgotICAgICAgICAgICAgICBpICs9IDQ7Ci0gICAgICAgICAgICAgIGlmIChuTW9udGggPiAwICYmIG5Nb250aCA8PSAxMikKLSAgICAgICAgICAgICAgICBzUGFydCArPSBmdWxsbW9udGhzW25Nb250aCAtIDFdOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIGkgKz0gNDsKLSAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKLSAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKLSAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKLSAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGkrKzsKLSAgICAgICAgICBzUGFydCArPSBjOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgaSsrOwotICAgICAgICBzUGFydCArPSBjOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzUmV0ICs9IHNQYXJ0OwotICB9Ci0KLSAgcmV0dXJuIHNSZXQ7Ci19Ci0KLS8vIGZ1bmN0aW9uIEFGTnVtYmVyX0Zvcm1hdChuRGVjLCBzZXBTdHlsZSwgbmVnU3R5bGUsIGN1cnJTdHlsZSwgc3RyQ3VycmVuY3ksCi0vLyBiQ3VycmVuY3lQcmVwZW5kKQotYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZOdW1iZXJfRm9ybWF0KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSNpZiBfRlhfT1NfICE9IF9GWF9BTkRST0lEXwotICBpZiAocGFyYW1zLnNpemUoKSAhPSA2KSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9Ci0gICAgICBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpLT5HZXRFdmVudEhhbmRsZXIoKTsKLSAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDRlhfV2lkZVN0cmluZyYgVmFsdWUgPSBwRXZlbnQtPlZhbHVlKCk7Ci0gIENGWF9CeXRlU3RyaW5nIHN0clZhbHVlID0gU3RyVHJpbShDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpKTsKLSAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpbnQgaURlYyA9IHBhcmFtc1swXS5Ub0ludChwUnVudGltZSk7Ci0gIGludCBpU2VwU3R5bGUgPSBwYXJhbXNbMV0uVG9JbnQocFJ1bnRpbWUpOwotICBpbnQgaU5lZ1N0eWxlID0gcGFyYW1zWzJdLlRvSW50KHBSdW50aW1lKTsKLSAgLy8gcGFyYW1zWzNdIGlzIGlDdXJyU3R5bGUsIGl0J3Mgbm90IHVzZWQuCi0gIENGWF9XaWRlU3RyaW5nIHdzdHJDdXJyZW5jeSA9IHBhcmFtc1s0XS5Ub0NGWFdpZGVTdHJpbmcocFJ1bnRpbWUpOwotICBib29sIGJDdXJyZW5jeVByZXBlbmQgPSBwYXJhbXNbNV0uVG9Cb29sKHBSdW50aW1lKTsKLQotICBpZiAoaURlYyA8IDApCi0gICAgaURlYyA9IC1pRGVjOwotCi0gIGlmIChpU2VwU3R5bGUgPCAwIHx8IGlTZXBTdHlsZSA+IDMpCi0gICAgaVNlcFN0eWxlID0gMDsKLQotICBpZiAoaU5lZ1N0eWxlIDwgMCB8fCBpTmVnU3R5bGUgPiAzKQotICAgIGlOZWdTdHlsZSA9IDA7Ci0KLSAgLy8gUHJvY2Vzc2luZyBkZWNpbWFsIHBsYWNlcwotICBzdHJWYWx1ZS5SZXBsYWNlKCIsIiwgIi4iKTsKLSAgZG91YmxlIGRWYWx1ZSA9IGF0b2Yoc3RyVmFsdWUuY19zdHIoKSk7Ci0gIGlmIChpRGVjID4gMCkKLSAgICBkVmFsdWUgKz0gRE9VQkxFX0NPUlJFQ1Q7Ci0KLSAgLy8gQ2FsY3VsYXRpbmcgbnVtYmVyIHN0cmluZwotICBib29sIGJOZWdhdGl2ZTsKLSAgaW50IGlEZWMyOwotICBzdHJWYWx1ZSA9IENhbGN1bGF0ZVN0cmluZyhkVmFsdWUsIGlEZWMsICZpRGVjMiwgJmJOZWdhdGl2ZSk7Ci0gIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpIHsKLSAgICBkVmFsdWUgPSAwOwotICAgIHN0clZhbHVlID0gQ2FsY3VsYXRlU3RyaW5nKGRWYWx1ZSwgaURlYywgJmlEZWMyLCAmYk5lZ2F0aXZlKTsKLSAgICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKSB7Ci0gICAgICBzdHJWYWx1ZSA9ICIwIjsKLSAgICAgIGlEZWMyID0gMTsKLSAgICB9Ci0gIH0KLQotICAvLyBQcm9jZXNzaW5nIHNlcGFyYXRvciBzdHlsZQotICBpZiAoaURlYzIgPCBzdHJWYWx1ZS5HZXRMZW5ndGgoKSkgewotICAgIGlmIChpU2VwU3R5bGUgPT0gMiB8fCBpU2VwU3R5bGUgPT0gMykKLSAgICAgIHN0clZhbHVlLlJlcGxhY2UoIi4iLCAiLCIpOwotCi0gICAgaWYgKGlEZWMyID09IDApCi0gICAgICBzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcwJyk7Ci0gIH0KLSAgaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAyKSB7Ci0gICAgY2hhciBjU2VwYXJhdG9yOwotICAgIGlmIChpU2VwU3R5bGUgPT0gMCkKLSAgICAgIGNTZXBhcmF0b3IgPSAnLCc7Ci0gICAgZWxzZQotICAgICAgY1NlcGFyYXRvciA9ICcuJzsKLQotICAgIGZvciAoaW50IGlEZWNQb3NpdGl2ZSA9IGlEZWMyIC0gMzsgaURlY1Bvc2l0aXZlID4gMDsgaURlY1Bvc2l0aXZlIC09IDMpCi0gICAgICBzdHJWYWx1ZS5JbnNlcnQoaURlY1Bvc2l0aXZlLCBjU2VwYXJhdG9yKTsKLSAgfQotCi0gIC8vIFByb2Nlc3NpbmcgY3VycmVuY3kgc3RyaW5nCi0gIFZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChzdHJWYWx1ZS5Bc1N0cmluZ0MoKSk7Ci0KLSAgaWYgKGJDdXJyZW5jeVByZXBlbmQpCi0gICAgVmFsdWUgPSB3c3RyQ3VycmVuY3kgKyBWYWx1ZTsKLSAgZWxzZQotICAgIFZhbHVlID0gVmFsdWUgKyB3c3RyQ3VycmVuY3k7Ci0KLSAgLy8gUHJvY2Vzc2luZyBuZWdhdGl2ZSBzdHlsZQotICBpZiAoYk5lZ2F0aXZlKSB7Ci0gICAgaWYgKGlOZWdTdHlsZSA9PSAwKQotICAgICAgVmFsdWUgPSBMIi0iICsgVmFsdWU7Ci0gICAgZWxzZSBpZiAoaU5lZ1N0eWxlID09IDIgfHwgaU5lZ1N0eWxlID09IDMpCi0gICAgICBWYWx1ZSA9IEwiKCIgKyBWYWx1ZSArIEwiKSI7Ci0gICAgaWYgKGlOZWdTdHlsZSA9PSAxIHx8IGlOZWdTdHlsZSA9PSAzKSB7Ci0gICAgICBpZiAoRmllbGQqIGZUYXJnZXQgPSBwRXZlbnQtPlRhcmdldF9GaWVsZCgpKSB7Ci0gICAgICAgIENKU19BcnJheSBhckNvbG9yOwotICAgICAgICBDSlNfVmFsdWUgdkNvbEVsbShwUnVudGltZSk7Ci0gICAgICAgIHZDb2xFbG0gPSBDSlNfVmFsdWUocFJ1bnRpbWUsIEwiUkdCIik7Ci0gICAgICAgIGFyQ29sb3IuU2V0RWxlbWVudChwUnVudGltZSwgMCwgdkNvbEVsbSk7Ci0gICAgICAgIHZDb2xFbG0gPSBDSlNfVmFsdWUocFJ1bnRpbWUsIDEpOwotICAgICAgICBhckNvbG9yLlNldEVsZW1lbnQocFJ1bnRpbWUsIDEsIHZDb2xFbG0pOwotICAgICAgICB2Q29sRWxtID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCAwKTsKLSAgICAgICAgYXJDb2xvci5TZXRFbGVtZW50KHBSdW50aW1lLCAyLCB2Q29sRWxtKTsKLSAgICAgICAgYXJDb2xvci5TZXRFbGVtZW50KHBSdW50aW1lLCAzLCB2Q29sRWxtKTsKLQotICAgICAgICBDSlNfUHJvcFZhbHVlIHZQcm9wKHBSdW50aW1lKTsKLSAgICAgICAgdlByb3AuU3RhcnRHZXR0aW5nKCk7Ci0gICAgICAgIHZQcm9wIDw8IGFyQ29sb3I7Ci0gICAgICAgIHZQcm9wLlN0YXJ0U2V0dGluZygpOwotICAgICAgICBmVGFyZ2V0LT50ZXh0Q29sb3IocFJ1bnRpbWUsIHZQcm9wLCBzRXJyb3IpOyAgLy8gcmVkCi0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChpTmVnU3R5bGUgPT0gMSB8fCBpTmVnU3R5bGUgPT0gMykgewotICAgICAgaWYgKEZpZWxkKiBmVGFyZ2V0ID0gcEV2ZW50LT5UYXJnZXRfRmllbGQoKSkgewotICAgICAgICBDSlNfQXJyYXkgYXJDb2xvcjsKLSAgICAgICAgQ0pTX1ZhbHVlIHZDb2xFbG0ocFJ1bnRpbWUpOwotICAgICAgICB2Q29sRWxtID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCBMIlJHQiIpOwotICAgICAgICBhckNvbG9yLlNldEVsZW1lbnQocFJ1bnRpbWUsIDAsIHZDb2xFbG0pOwotICAgICAgICB2Q29sRWxtID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCAwKTsKLSAgICAgICAgYXJDb2xvci5TZXRFbGVtZW50KHBSdW50aW1lLCAxLCB2Q29sRWxtKTsKLSAgICAgICAgYXJDb2xvci5TZXRFbGVtZW50KHBSdW50aW1lLCAyLCB2Q29sRWxtKTsKLSAgICAgICAgYXJDb2xvci5TZXRFbGVtZW50KHBSdW50aW1lLCAzLCB2Q29sRWxtKTsKLQotICAgICAgICBDSlNfUHJvcFZhbHVlIHZQcm9wKHBSdW50aW1lKTsKLSAgICAgICAgdlByb3AuU3RhcnRHZXR0aW5nKCk7Ci0gICAgICAgIGZUYXJnZXQtPnRleHRDb2xvcihwUnVudGltZSwgdlByb3AsIHNFcnJvcik7Ci0KLSAgICAgICAgQ0pTX0FycmF5IGFQcm9wOwotICAgICAgICB2UHJvcC5HZXRKU1ZhbHVlKCktPkNvbnZlcnRUb0FycmF5KHBSdW50aW1lLCBhUHJvcCk7Ci0KLSAgICAgICAgQ1BXTF9Db2xvciBjclByb3A7Ci0gICAgICAgIENQV0xfQ29sb3IgY3JDb2xvcjsKLSAgICAgICAgY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IocFJ1bnRpbWUsIGFQcm9wLCAmY3JQcm9wKTsKLSAgICAgICAgY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IocFJ1bnRpbWUsIGFyQ29sb3IsICZjckNvbG9yKTsKLQotICAgICAgICBpZiAoY3JDb2xvciAhPSBjclByb3ApIHsKLSAgICAgICAgICBDSlNfUHJvcFZhbHVlIHZQcm9wMihwUnVudGltZSk7Ci0gICAgICAgICAgdlByb3AyLlN0YXJ0R2V0dGluZygpOwotICAgICAgICAgIHZQcm9wMiA8PCBhckNvbG9yOwotICAgICAgICAgIHZQcm9wMi5TdGFydFNldHRpbmcoKTsKLSAgICAgICAgICBmVGFyZ2V0LT50ZXh0Q29sb3IocFJ1bnRpbWUsIHZQcm9wMiwgc0Vycm9yKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotCi0vLyBmdW5jdGlvbiBBRk51bWJlcl9LZXlzdHJva2UobkRlYywgc2VwU3R5bGUsIG5lZ1N0eWxlLCBjdXJyU3R5bGUsIHN0ckN1cnJlbmN5LAotLy8gYkN1cnJlbmN5UHJlcGVuZCkKLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGTnVtYmVyX0tleXN0cm9rZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmIChwYXJhbXMuc2l6ZSgpIDwgMikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ0pTX0V2ZW50Q29udGV4dCogcENvbnRleHQgPSBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpOwotICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0gIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKLSAgQ0ZYX1dpZGVTdHJpbmcmIHdzdHJDaGFuZ2UgPSBwRXZlbnQtPkNoYW5nZSgpOwotICBDRlhfV2lkZVN0cmluZyB3c3RyVmFsdWUgPSB2YWw7Ci0KLSAgaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3dUZW1wID0gU3RyVHJpbSh3c3RyVmFsdWUpOwotICAgIGlmIChzd1RlbXAuSXNFbXB0eSgpKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBzd1RlbXAuUmVwbGFjZShMIiwiLCBMIi4iKTsKLSAgICBpZiAoIUlzTnVtYmVyKHN3VGVtcC5jX3N0cigpKSkgewotICAgICAgcEV2ZW50LT5SYygpID0gZmFsc2U7Ci0gICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKTsKLSAgICAgIEFsZXJ0SWZQb3NzaWJsZShwQ29udGV4dCwgc0Vycm9yLmNfc3RyKCkpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsgIC8vIGl0IGhhcHBlbnMgYWZ0ZXIgdGhlIGxhc3Qga2V5c3Ryb2tlIGFuZCBiZWZvcmUgdmFsaWRhdGluZywKLSAgfQotCi0gIENGWF9XaWRlU3RyaW5nIHdzdHJTZWxlY3RlZDsKLSAgaWYgKHBFdmVudC0+U2VsU3RhcnQoKSAhPSAtMSkgewotICAgIHdzdHJTZWxlY3RlZCA9IHdzdHJWYWx1ZS5NaWQocEV2ZW50LT5TZWxTdGFydCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV2ZW50LT5TZWxFbmQoKSAtIHBFdmVudC0+U2VsU3RhcnQoKSk7Ci0gIH0KLQotICBib29sIGJIYXNTaWduID0gd3N0clZhbHVlLkZpbmQoTCctJykgIT0gLTEgJiYgd3N0clNlbGVjdGVkLkZpbmQoTCctJykgPT0gLTE7Ci0gIGlmIChiSGFzU2lnbikgewotICAgIC8vIGNhbid0IGluc2VydCAiY2hhbmdlIiBpbiBmcm9udCB0byBzaWduIHBvc3Rpb24uCi0gICAgaWYgKHBFdmVudC0+U2VsU3RhcnQoKSA9PSAwKSB7Ci0gICAgICBib29sJiBiUmMgPSBwRXZlbnQtPlJjKCk7Ci0gICAgICBiUmMgPSBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIGludCBpU2VwU3R5bGUgPSBwYXJhbXNbMV0uVG9JbnQocFJ1bnRpbWUpOwotICBpZiAoaVNlcFN0eWxlIDwgMCB8fCBpU2VwU3R5bGUgPiAzKQotICAgIGlTZXBTdHlsZSA9IDA7Ci0gIGNvbnN0IEZYX1dDSEFSIGNTZXAgPSBpU2VwU3R5bGUgPCAyID8gTCcuJyA6IEwnLCc7Ci0KLSAgYm9vbCBiSGFzU2VwID0gd3N0clZhbHVlLkZpbmQoY1NlcCkgIT0gLTE7Ci0gIGZvciAoRlhfU1RSU0laRSBpID0gMDsgaSA8IHdzdHJDaGFuZ2UuR2V0TGVuZ3RoKCk7ICsraSkgewotICAgIGlmICh3c3RyQ2hhbmdlW2ldID09IGNTZXApIHsKLSAgICAgIGlmIChiSGFzU2VwKSB7Ci0gICAgICAgIGJvb2wmIGJSYyA9IHBFdmVudC0+UmMoKTsKLSAgICAgICAgYlJjID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYkhhc1NlcCA9IHRydWU7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKHdzdHJDaGFuZ2VbaV0gPT0gTCctJykgewotICAgICAgaWYgKGJIYXNTaWduKSB7Ci0gICAgICAgIGJvb2wmIGJSYyA9IHBFdmVudC0+UmMoKTsKLSAgICAgICAgYlJjID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgLy8gc2lnbidzIHBvc2l0aW9uIGlzIG5vdCBjb3JyZWN0Ci0gICAgICBpZiAoaSAhPSAwKSB7Ci0gICAgICAgIGJvb2wmIGJSYyA9IHBFdmVudC0+UmMoKTsKLSAgICAgICAgYlJjID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKHBFdmVudC0+U2VsU3RhcnQoKSAhPSAwKSB7Ci0gICAgICAgIGJvb2wmIGJSYyA9IHBFdmVudC0+UmMoKTsKLSAgICAgICAgYlJjID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgYkhhc1NpZ24gPSB0cnVlOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgaWYgKCFGWFNZU19pc3dkaWdpdCh3c3RyQ2hhbmdlW2ldKSkgewotICAgICAgYm9vbCYgYlJjID0gcEV2ZW50LT5SYygpOwotICAgICAgYlJjID0gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBDRlhfV2lkZVN0cmluZyB3cHJlZml4ID0gd3N0clZhbHVlLk1pZCgwLCBwRXZlbnQtPlNlbFN0YXJ0KCkpOwotICBDRlhfV2lkZVN0cmluZyB3cG9zdGZpeDsKLSAgaWYgKHBFdmVudC0+U2VsRW5kKCkgPCB3c3RyVmFsdWUuR2V0TGVuZ3RoKCkpCi0gICAgd3Bvc3RmaXggPSB3c3RyVmFsdWUuTWlkKHBFdmVudC0+U2VsRW5kKCkpOwotICB2YWwgPSB3cHJlZml4ICsgd3N0ckNoYW5nZSArIHdwb3N0Zml4OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gZnVuY3Rpb24gQUZQZXJjZW50X0Zvcm1hdChuRGVjLCBzZXBTdHlsZSkKLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUGVyY2VudF9Gb3JtYXQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotI2lmIF9GWF9PU18gIT0gX0ZYX0FORFJPSURfCi0gIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0KLSAgICAgIHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCktPkdldEV2ZW50SGFuZGxlcigpOwotICBpZiAoIXBFdmVudC0+bV9wVmFsdWUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSA9IHBFdmVudC0+VmFsdWUoKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgc3RyVmFsdWUgPSBTdHJUcmltKENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShWYWx1ZSkpOwotICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQotICAgIHJldHVybiB0cnVlOwotCi0gIGludCBpRGVjID0gcGFyYW1zWzBdLlRvSW50KHBSdW50aW1lKTsKLSAgaWYgKGlEZWMgPCAwKQotICAgIGlEZWMgPSAtaURlYzsKLQotICBpbnQgaVNlcFN0eWxlID0gcGFyYW1zWzFdLlRvSW50KHBSdW50aW1lKTsKLSAgaWYgKGlTZXBTdHlsZSA8IDAgfHwgaVNlcFN0eWxlID4gMykKLSAgICBpU2VwU3R5bGUgPSAwOwotCi0gIC8vIGZvciBwcm9jZXNzaW5nIGRlY2ltYWwgcGxhY2VzCi0gIGRvdWJsZSBkVmFsdWUgPSBhdG9mKHN0clZhbHVlLmNfc3RyKCkpOwotICBkVmFsdWUgKj0gMTAwOwotICBpZiAoaURlYyA+IDApCi0gICAgZFZhbHVlICs9IERPVUJMRV9DT1JSRUNUOwotCi0gIGludCBpRGVjMjsKLSAgaW50IGlOZWdhdGl2ZSA9IDA7Ci0gIHN0clZhbHVlID0gZmN2dChkVmFsdWUsIGlEZWMsICZpRGVjMiwgJmlOZWdhdGl2ZSk7Ci0gIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpIHsKLSAgICBkVmFsdWUgPSAwOwotICAgIHN0clZhbHVlID0gZmN2dChkVmFsdWUsIGlEZWMsICZpRGVjMiwgJmlOZWdhdGl2ZSk7Ci0gIH0KLQotICBpZiAoaURlYzIgPCAwKSB7Ci0gICAgZm9yIChpbnQgaU51bSA9IDA7IGlOdW0gPCBhYnMoaURlYzIpOyBpTnVtKyspIHsKLSAgICAgIHN0clZhbHVlID0gIjAiICsgc3RyVmFsdWU7Ci0gICAgfQotICAgIGlEZWMyID0gMDsKLSAgfQotICBpbnQgaU1heCA9IHN0clZhbHVlLkdldExlbmd0aCgpOwotICBpZiAoaURlYzIgPiBpTWF4KSB7Ci0gICAgZm9yIChpbnQgaU51bSA9IDA7IGlOdW0gPD0gaURlYzIgLSBpTWF4OyBpTnVtKyspIHsKLSAgICAgIHN0clZhbHVlICs9ICIwIjsKLSAgICB9Ci0gICAgaU1heCA9IGlEZWMyICsgMTsKLSAgfQotCi0gIC8vIGZvciBwcm9jZXNzaW5nIHNlcGVyYXRvciBzdHlsZQotICBpZiAoaURlYzIgPCBpTWF4KSB7Ci0gICAgaWYgKGlTZXBTdHlsZSA9PSAwIHx8IGlTZXBTdHlsZSA9PSAxKSB7Ci0gICAgICBzdHJWYWx1ZS5JbnNlcnQoaURlYzIsICcuJyk7Ci0gICAgICBpTWF4Kys7Ci0gICAgfSBlbHNlIGlmIChpU2VwU3R5bGUgPT0gMiB8fCBpU2VwU3R5bGUgPT0gMykgewotICAgICAgc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnLCcpOwotICAgICAgaU1heCsrOwotICAgIH0KLQotICAgIGlmIChpRGVjMiA9PSAwKQotICAgICAgc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCAnMCcpOwotICB9Ci0gIGlmIChpU2VwU3R5bGUgPT0gMCB8fCBpU2VwU3R5bGUgPT0gMikgewotICAgIGNoYXIgY1NlcGVyYXRvcjsKLSAgICBpZiAoaVNlcFN0eWxlID09IDApCi0gICAgICBjU2VwZXJhdG9yID0gJywnOwotICAgIGVsc2UKLSAgICAgIGNTZXBlcmF0b3IgPSAnLic7Ci0KLSAgICBmb3IgKGludCBpRGVjUG9zaXRpdmUgPSBpRGVjMiAtIDM7IGlEZWNQb3NpdGl2ZSA+IDA7IGlEZWNQb3NpdGl2ZSAtPSAzKSB7Ci0gICAgICBzdHJWYWx1ZS5JbnNlcnQoaURlY1Bvc2l0aXZlLCBjU2VwZXJhdG9yKTsKLSAgICAgIGlNYXgrKzsKLSAgICB9Ci0gIH0KLQotICAvLyBuZWdhdGl2ZSBtYXJrCi0gIGlmIChpTmVnYXRpdmUpCi0gICAgc3RyVmFsdWUgPSAiLSIgKyBzdHJWYWx1ZTsKLSAgc3RyVmFsdWUgKz0gIiUiOwotICBWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyVmFsdWUuQXNTdHJpbmdDKCkpOwotI2VuZGlmCi0gIHJldHVybiB0cnVlOwotfQotLy8gQUZQZXJjZW50X0tleXN0cm9rZShuRGVjLCBzZXBTdHlsZSkKLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGUGVyY2VudF9LZXlzdHJva2UoCi0gICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gQUZOdW1iZXJfS2V5c3Ryb2tlKHBSdW50aW1lLCBwYXJhbXMsIHZSZXQsIHNFcnJvcik7Ci19Ci0KLS8vIGZ1bmN0aW9uIEFGRGF0ZV9Gb3JtYXRFeChjRm9ybWF0KQotYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0Zvcm1hdEV4KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBDSlNfRXZlbnRDb250ZXh0KiBwQ29udGV4dCA9IHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCk7Ci0gIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKLSAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDRlhfV2lkZVN0cmluZyYgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOwotICBDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZSA9IHZhbDsKLSAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBDRlhfV2lkZVN0cmluZyBzRm9ybWF0ID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSk7Ci0gIGRvdWJsZSBkRGF0ZSA9IDAuMGY7Ci0KLSAgaWYgKHN0clZhbHVlLkZpbmQoTCJHTVQiKSAhPSAtMSkgewotICAgIC8vIGZvciBHTVQgZm9ybWF0IHRpbWUKLSAgICAvLyBzdWNoIGFzICJUdWUgQXVnIDExIDE0OjI0OjE2IEdNVCswODAwMjAwOSIKLSAgICBkRGF0ZSA9IE1ha2VJbnRlckRhdGUoc3RyVmFsdWUpOwotICB9IGVsc2UgewotICAgIGREYXRlID0gTWFrZVJlZ3VsYXJEYXRlKHN0clZhbHVlLCBzRm9ybWF0LCBudWxscHRyKTsKLSAgfQotCi0gIGlmIChKU19Qb3J0SXNOYW4oZERhdGUpKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7Ci0gICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNQQVJTRURBVEUpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgIHNGb3JtYXQuY19zdHIoKSk7Ci0gICAgQWxlcnRJZlBvc3NpYmxlKHBDb250ZXh0LCBzd01zZy5jX3N0cigpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB2YWwgPSBNYWtlRm9ybWF0RGF0ZShkRGF0ZSwgc0Zvcm1hdCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1kb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VJbnRlckRhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clZhbHVlKSB7Ci0gIHN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nPiB3c0FycmF5OwotICBDRlhfV2lkZVN0cmluZyBzVGVtcCA9IEwiIjsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJWYWx1ZS5HZXRMZW5ndGgoKTsgKytpKSB7Ci0gICAgRlhfV0NIQVIgYyA9IHN0clZhbHVlLkdldEF0KGkpOwotICAgIGlmIChjID09IEwnICcgfHwgYyA9PSBMJzonKSB7Ci0gICAgICB3c0FycmF5LnB1c2hfYmFjayhzVGVtcCk7Ci0gICAgICBzVGVtcCA9IEwiIjsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBzVGVtcCArPSBjOwotICB9Ci0gIHdzQXJyYXkucHVzaF9iYWNrKHNUZW1wKTsKLSAgaWYgKHdzQXJyYXkuc2l6ZSgpICE9IDgpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaW50IG5Nb250aCA9IDE7Ci0gIHNUZW1wID0gd3NBcnJheVsxXTsKLSAgaWYgKHNUZW1wLkNvbXBhcmUoTCJKYW4iKSA9PSAwKQotICAgIG5Nb250aCA9IDE7Ci0gIGVsc2UgaWYgKHNUZW1wLkNvbXBhcmUoTCJGZWIiKSA9PSAwKQotICAgIG5Nb250aCA9IDI7Ci0gIGVsc2UgaWYgKHNUZW1wLkNvbXBhcmUoTCJNYXIiKSA9PSAwKQotICAgIG5Nb250aCA9IDM7Ci0gIGVsc2UgaWYgKHNUZW1wLkNvbXBhcmUoTCJBcHIiKSA9PSAwKQotICAgIG5Nb250aCA9IDQ7Ci0gIGVsc2UgaWYgKHNUZW1wLkNvbXBhcmUoTCJNYXkiKSA9PSAwKQotICAgIG5Nb250aCA9IDU7Ci0gIGVsc2UgaWYgKHNUZW1wLkNvbXBhcmUoTCJKdW4iKSA9PSAwKQotICAgIG5Nb250aCA9IDY7Ci0gIGVsc2UgaWYgKHNUZW1wLkNvbXBhcmUoTCJKdWwiKSA9PSAwKQotICAgIG5Nb250aCA9IDc7Ci0gIGVsc2UgaWYgKHNUZW1wLkNvbXBhcmUoTCJBdWciKSA9PSAwKQotICAgIG5Nb250aCA9IDg7Ci0gIGVsc2UgaWYgKHNUZW1wLkNvbXBhcmUoTCJTZXAiKSA9PSAwKQotICAgIG5Nb250aCA9IDk7Ci0gIGVsc2UgaWYgKHNUZW1wLkNvbXBhcmUoTCJPY3QiKSA9PSAwKQotICAgIG5Nb250aCA9IDEwOwotICBlbHNlIGlmIChzVGVtcC5Db21wYXJlKEwiTm92IikgPT0gMCkKLSAgICBuTW9udGggPSAxMTsKLSAgZWxzZSBpZiAoc1RlbXAuQ29tcGFyZShMIkRlYyIpID09IDApCi0gICAgbk1vbnRoID0gMTI7Ci0KLSAgaW50IG5EYXkgPSBGWF9hdG9mKHdzQXJyYXlbMl0uQXNTdHJpbmdDKCkpOwotICBpbnQgbkhvdXIgPSBGWF9hdG9mKHdzQXJyYXlbM10uQXNTdHJpbmdDKCkpOwotICBpbnQgbk1pbiA9IEZYX2F0b2Yod3NBcnJheVs0XS5Bc1N0cmluZ0MoKSk7Ci0gIGludCBuU2VjID0gRlhfYXRvZih3c0FycmF5WzVdLkFzU3RyaW5nQygpKTsKLSAgaW50IG5ZZWFyID0gRlhfYXRvZih3c0FycmF5WzddLkFzU3RyaW5nQygpKTsKLSAgZG91YmxlIGRSZXQgPSBKU19NYWtlRGF0ZShKU19NYWtlRGF5KG5ZZWFyLCBuTW9udGggLSAxLCBuRGF5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU19NYWtlVGltZShuSG91ciwgbk1pbiwgblNlYywgMCkpOwotICBpZiAoSlNfUG9ydElzTmFuKGRSZXQpKQotICAgIGRSZXQgPSBKU19EYXRlUGFyc2Uoc3RyVmFsdWUpOwotCi0gIHJldHVybiBkUmV0OwotfQotCi0vLyBBRkRhdGVfS2V5c3Ryb2tlRXgoY0Zvcm1hdCkKLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9LZXlzdHJva2VFeChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKLSAgICBzRXJyb3IgPSBMIkFGRGF0ZV9LZXlzdHJva2VFeCdzIHBhcmFtZXRlcnMnIHNpemUgciBub3QgY29ycmVjdCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgQ0pTX0V2ZW50Q29udGV4dCogcENvbnRleHQgPSBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpOwotICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0gIGlmIChwRXZlbnQtPldpbGxDb21taXQoKSkgewotICAgIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIENGWF9XaWRlU3RyaW5nIHN0clZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOwotICAgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIENGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKTsKLSAgICBib29sIGJXcm9uZ0Zvcm1hdCA9IGZhbHNlOwotICAgIGRvdWJsZSBkUmV0ID0gTWFrZVJlZ3VsYXJEYXRlKHN0clZhbHVlLCBzRm9ybWF0LCAmYldyb25nRm9ybWF0KTsKLSAgICBpZiAoYldyb25nRm9ybWF0IHx8IEpTX1BvcnRJc05hbihkUmV0KSkgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7Ci0gICAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU1BBUlNFREFURSkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBzRm9ybWF0LmNfc3RyKCkpOwotICAgICAgQWxlcnRJZlBvc3NpYmxlKHBDb250ZXh0LCBzd01zZy5jX3N0cigpKTsKLSAgICAgIHBFdmVudC0+UmMoKSA9IGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfRm9ybWF0KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbnQgaUluZGV4ID0gcGFyYW1zWzBdLlRvSW50KHBSdW50aW1lKTsKLSAgY29uc3QgRlhfV0NIQVIqIGNGb3JtYXRzW10gPSB7TCJtL2QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm0vZC95eSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW0vZGQveXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tL3l5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJkLW1tbSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZC1tbW0teXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImRkLW1tbS15eSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwieXktbW0tZGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tbS15eSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tbS15eSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tIGQsIHl5eXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tbW0gZCwgeXl5eSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibS9kL3l5IGg6TU0gdHQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm0vZC95eSBISDpNTSJ9OwotCi0gIGlmIChpSW5kZXggPCAwIHx8IChzdGF0aWNfY2FzdDxzaXplX3Q+KGlJbmRleCkgPj0gRlhfQXJyYXlTaXplKGNGb3JtYXRzKSkpCi0gICAgaUluZGV4ID0gMDsKLQotICBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+IG5ld1BhcmFtczsKLSAgbmV3UGFyYW1zLnB1c2hfYmFjayhDSlNfVmFsdWUocFJ1bnRpbWUsIGNGb3JtYXRzW2lJbmRleF0pKTsKLSAgcmV0dXJuIEFGRGF0ZV9Gb3JtYXRFeChwUnVudGltZSwgbmV3UGFyYW1zLCB2UmV0LCBzRXJyb3IpOwotfQotCi0vLyBBRkRhdGVfS2V5c3Ryb2tlRXgoY0Zvcm1hdCkKLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9LZXlzdHJva2UoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQocFJ1bnRpbWUpOwotICBjb25zdCBGWF9XQ0hBUiogY0Zvcm1hdHNbXSA9IHtMIm0vZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibS9kL3l5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbS9kZC95eSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW0veXkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImQtbW1tIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJkLW1tbS15eSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZGQtbW1tLXl5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJ5eS1tbS1kZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tLXl5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbW1tLXl5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbW0gZCwgeXl5eSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tbSBkLCB5eXl5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtL2QveXkgaDpNTSB0dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibS9kL3l5IEhIOk1NIn07Ci0KLSAgaWYgKGlJbmRleCA8IDAgfHwgKHN0YXRpY19jYXN0PHNpemVfdD4oaUluZGV4KSA+PSBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKSkKLSAgICBpSW5kZXggPSAwOwotCi0gIHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4gbmV3UGFyYW1zOwotICBuZXdQYXJhbXMucHVzaF9iYWNrKENKU19WYWx1ZShwUnVudGltZSwgY0Zvcm1hdHNbaUluZGV4XSkpOwotICByZXR1cm4gQUZEYXRlX0tleXN0cm9rZUV4KHBSdW50aW1lLCBuZXdQYXJhbXMsIHZSZXQsIHNFcnJvcik7Ci19Ci0KLS8vIGZ1bmN0aW9uIEFGVGltZV9Gb3JtYXQocHRmKQotYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0Zvcm1hdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW50IGlJbmRleCA9IHBhcmFtc1swXS5Ub0ludChwUnVudGltZSk7Ci0gIGNvbnN0IEZYX1dDSEFSKiBjRm9ybWF0c1tdID0ge0wiSEg6TU0iLCBMImg6TU0gdHQiLCBMIkhIOk1NOnNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJoOk1NOnNzIHR0In07Ci0KLSAgaWYgKGlJbmRleCA8IDAgfHwgKHN0YXRpY19jYXN0PHNpemVfdD4oaUluZGV4KSA+PSBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKSkKLSAgICBpSW5kZXggPSAwOwotCi0gIHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4gbmV3UGFyYW1zOwotICBuZXdQYXJhbXMucHVzaF9iYWNrKENKU19WYWx1ZShwUnVudGltZSwgY0Zvcm1hdHNbaUluZGV4XSkpOwotICByZXR1cm4gQUZEYXRlX0Zvcm1hdEV4KHBSdW50aW1lLCBuZXdQYXJhbXMsIHZSZXQsIHNFcnJvcik7Ci19Ci0KLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9LZXlzdHJva2UoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGludCBpSW5kZXggPSBwYXJhbXNbMF0uVG9JbnQocFJ1bnRpbWUpOwotICBjb25zdCBGWF9XQ0hBUiogY0Zvcm1hdHNbXSA9IHtMIkhIOk1NIiwgTCJoOk1NIHR0IiwgTCJISDpNTTpzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiaDpNTTpzcyB0dCJ9OwotCi0gIGlmIChpSW5kZXggPCAwIHx8IChzdGF0aWNfY2FzdDxzaXplX3Q+KGlJbmRleCkgPj0gRlhfQXJyYXlTaXplKGNGb3JtYXRzKSkpCi0gICAgaUluZGV4ID0gMDsKLQotICBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+IG5ld1BhcmFtczsKLSAgbmV3UGFyYW1zLnB1c2hfYmFjayhDSlNfVmFsdWUocFJ1bnRpbWUsIGNGb3JtYXRzW2lJbmRleF0pKTsKLSAgcmV0dXJuIEFGRGF0ZV9LZXlzdHJva2VFeChwUnVudGltZSwgbmV3UGFyYW1zLCB2UmV0LCBzRXJyb3IpOwotfQotCi1ib29sIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfRm9ybWF0RXgoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gQUZEYXRlX0Zvcm1hdEV4KHBSdW50aW1lLCBwYXJhbXMsIHZSZXQsIHNFcnJvcik7Ci19Ci0KLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9LZXlzdHJva2VFeChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiBBRkRhdGVfS2V5c3Ryb2tlRXgocFJ1bnRpbWUsIHBhcmFtcywgdlJldCwgc0Vycm9yKTsKLX0KLQotLy8gZnVuY3Rpb24gQUZTcGVjaWFsX0Zvcm1hdChwc2YpCi1ib29sIENKU19QdWJsaWNNZXRob2RzOjpBRlNwZWNpYWxfRm9ybWF0KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPQotICAgICAgcFJ1bnRpbWUtPkdldEN1cnJlbnRFdmVudENvbnRleHQoKS0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0gIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NTb3VyY2UgPSBwRXZlbnQtPlZhbHVlKCk7Ci0gIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0OwotICBzd2l0Y2ggKHBhcmFtc1swXS5Ub0ludChwUnVudGltZSkpIHsKLSAgICBjYXNlIDA6Ci0gICAgICB3c0Zvcm1hdCA9IEwiOTk5OTkiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgd3NGb3JtYXQgPSBMIjk5OTk5LTk5OTkiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaWYgKHV0aWw6OnByaW50eChMIjk5OTk5OTk5OTkiLCB3c1NvdXJjZSkuR2V0TGVuZ3RoKCkgPj0gMTApCi0gICAgICAgIHdzRm9ybWF0ID0gTCIoOTk5KSA5OTktOTk5OSI7Ci0gICAgICBlbHNlCi0gICAgICAgIHdzRm9ybWF0ID0gTCI5OTktOTk5OSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICB3c0Zvcm1hdCA9IEwiOTk5LTk5LTk5OTkiOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBwRXZlbnQtPlZhbHVlKCkgPSB1dGlsOjpwcmludHgod3NGb3JtYXQsIHdzU291cmNlKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIGZ1bmN0aW9uIEFGU3BlY2lhbF9LZXlzdHJva2VFeChtYXNrKQotYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZTcGVjaWFsX0tleXN0cm9rZUV4KAotICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHBhcmFtcy5zaXplKCkgPCAxKSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIENKU19FdmVudENvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPkdldEN1cnJlbnRFdmVudENvbnRleHQoKTsKLSAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOwotICBpZiAoIXBFdmVudC0+bV9wVmFsdWUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENGWF9XaWRlU3RyaW5nJiB2YWxFdmVudCA9IHBFdmVudC0+VmFsdWUoKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3N0ck1hc2sgPSBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKTsKLSAgaWYgKHdzdHJNYXNrLklzRW1wdHkoKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAocEV2ZW50LT5XaWxsQ29tbWl0KCkpIHsKLSAgICBpZiAodmFsRXZlbnQuSXNFbXB0eSgpKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBGWF9TVFJTSVpFIGlJbmRleE1hc2sgPSAwOwotICAgIGZvciAoOyBpSW5kZXhNYXNrIDwgdmFsRXZlbnQuR2V0TGVuZ3RoKCk7ICsraUluZGV4TWFzaykgewotICAgICAgaWYgKCFtYXNrU2F0aXNmaWVkKHZhbEV2ZW50W2lJbmRleE1hc2tdLCB3c3RyTWFza1tpSW5kZXhNYXNrXSkpCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChpSW5kZXhNYXNrICE9IHdzdHJNYXNrLkdldExlbmd0aCgpIHx8Ci0gICAgICAgIChpSW5kZXhNYXNrICE9IHZhbEV2ZW50LkdldExlbmd0aCgpICYmIHdzdHJNYXNrLkdldExlbmd0aCgpICE9IDApKSB7Ci0gICAgICBBbGVydElmUG9zc2libGUoCi0gICAgICAgICAgcENvbnRleHQsIEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0UpLmNfc3RyKCkpOwotICAgICAgcEV2ZW50LT5SYygpID0gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcmIHdpZGVDaGFuZ2UgPSBwRXZlbnQtPkNoYW5nZSgpOwotICBpZiAod2lkZUNoYW5nZS5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgd0NoYW5nZSA9IHdpZGVDaGFuZ2U7Ci0gIEZYX1NUUlNJWkUgaUluZGV4TWFzayA9IHBFdmVudC0+U2VsU3RhcnQoKTsKLSAgRlhfU1RSU0laRSBjb21iaW5lZF9sZW4gPSB2YWxFdmVudC5HZXRMZW5ndGgoKSArIHdDaGFuZ2UuR2V0TGVuZ3RoKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFdmVudC0+U2VsU3RhcnQoKSAtIHBFdmVudC0+U2VsRW5kKCk7Ci0gIGlmIChjb21iaW5lZF9sZW4gPiB3c3RyTWFzay5HZXRMZW5ndGgoKSkgewotICAgIEFsZXJ0SWZQb3NzaWJsZShwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpLmNfc3RyKCkpOwotICAgIHBFdmVudC0+UmMoKSA9IGZhbHNlOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgaWYgKGlJbmRleE1hc2sgPj0gd3N0ck1hc2suR2V0TGVuZ3RoKCkgJiYgIXdDaGFuZ2UuSXNFbXB0eSgpKSB7Ci0gICAgQWxlcnRJZlBvc3NpYmxlKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTUEFSQU1fVE9PTE9ORykuY19zdHIoKSk7Ci0gICAgcEV2ZW50LT5SYygpID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBmb3IgKEZYX1NUUlNJWkUgaSA9IDA7IGkgPCB3Q2hhbmdlLkdldExlbmd0aCgpOyArK2kpIHsKLSAgICBpZiAoaUluZGV4TWFzayA+PSB3c3RyTWFzay5HZXRMZW5ndGgoKSkgewotICAgICAgQWxlcnRJZlBvc3NpYmxlKHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgIEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNQQVJBTV9UT09MT05HKS5jX3N0cigpKTsKLSAgICAgIHBFdmVudC0+UmMoKSA9IGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIEZYX1dDSEFSIHdNYXNrID0gd3N0ck1hc2tbaUluZGV4TWFza107Ci0gICAgaWYgKCFpc1Jlc2VydmVkTWFza0NoYXIod01hc2spKQotICAgICAgd0NoYW5nZS5TZXRBdChpLCB3TWFzayk7Ci0KLSAgICBpZiAoIW1hc2tTYXRpc2ZpZWQod0NoYW5nZVtpXSwgd01hc2spKSB7Ci0gICAgICBwRXZlbnQtPlJjKCkgPSBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpSW5kZXhNYXNrKys7Ci0gIH0KLSAgd2lkZUNoYW5nZSA9IHdDaGFuZ2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBmdW5jdGlvbiBBRlNwZWNpYWxfS2V5c3Ryb2tlKHBzZikKLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9LZXlzdHJva2UoCi0gICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9Ci0gICAgICBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpLT5HZXRFdmVudEhhbmRsZXIoKTsKLSAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjb25zdCBjaGFyKiBjRm9ybWF0ID0gIiI7Ci0gIHN3aXRjaCAocGFyYW1zWzBdLlRvSW50KHBSdW50aW1lKSkgewotICAgIGNhc2UgMDoKLSAgICAgIGNGb3JtYXQgPSAiOTk5OTkiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgY0Zvcm1hdCA9ICI5OTk5OTk5OTkiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaWYgKHBFdmVudC0+VmFsdWUoKS5HZXRMZW5ndGgoKSArIHBFdmVudC0+Q2hhbmdlKCkuR2V0TGVuZ3RoKCkgPiA3KQotICAgICAgICBjRm9ybWF0ID0gIjk5OTk5OTk5OTkiOwotICAgICAgZWxzZQotICAgICAgICBjRm9ybWF0ID0gIjk5OTk5OTkiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgY0Zvcm1hdCA9ICI5OTk5OTk5OTkiOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+IHBhcmFtczI7Ci0gIHBhcmFtczIucHVzaF9iYWNrKENKU19WYWx1ZShwUnVudGltZSwgY0Zvcm1hdCkpOwotICByZXR1cm4gQUZTcGVjaWFsX0tleXN0cm9rZUV4KHBSdW50aW1lLCBwYXJhbXMyLCB2UmV0LCBzRXJyb3IpOwotfQotCi1ib29sIENKU19QdWJsaWNNZXRob2RzOjpBRk1lcmdlQ2hhbmdlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnRIYW5kbGVyID0KLSAgICAgIHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCktPkdldEV2ZW50SGFuZGxlcigpOwotCi0gIENGWF9XaWRlU3RyaW5nIHN3VmFsdWU7Ci0gIGlmIChwRXZlbnRIYW5kbGVyLT5tX3BWYWx1ZSkKLSAgICBzd1ZhbHVlID0gcEV2ZW50SGFuZGxlci0+VmFsdWUoKTsKLQotICBpZiAocEV2ZW50SGFuZGxlci0+V2lsbENvbW1pdCgpKSB7Ci0gICAgdlJldCA9IENKU19WYWx1ZShwUnVudGltZSwgc3dWYWx1ZS5jX3N0cigpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIENGWF9XaWRlU3RyaW5nIHByZWZpeCwgcG9zdGZpeDsKLQotICBpZiAocEV2ZW50SGFuZGxlci0+U2VsU3RhcnQoKSA+PSAwKQotICAgIHByZWZpeCA9IHN3VmFsdWUuTWlkKDAsIHBFdmVudEhhbmRsZXItPlNlbFN0YXJ0KCkpOwotICBlbHNlCi0gICAgcHJlZml4ID0gTCIiOwotCi0gIGlmIChwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSA+PSAwICYmCi0gICAgICBwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSA8PSBzd1ZhbHVlLkdldExlbmd0aCgpKQotICAgIHBvc3RmaXggPSBzd1ZhbHVlLk1pZChwRXZlbnRIYW5kbGVyLT5TZWxFbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3dWYWx1ZS5HZXRMZW5ndGgoKSAtIHBFdmVudEhhbmRsZXItPlNlbEVuZCgpKTsKLSAgZWxzZQotICAgIHBvc3RmaXggPSBMIiI7Ci0KLSAgdlJldCA9Ci0gICAgICBDSlNfVmFsdWUocFJ1bnRpbWUsIChwcmVmaXggKyBwRXZlbnRIYW5kbGVyLT5DaGFuZ2UoKSArIHBvc3RmaXgpLmNfc3RyKCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZQYXJzZURhdGVFeChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgc1ZhbHVlID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSk7Ci0gIENGWF9XaWRlU3RyaW5nIHNGb3JtYXQgPSBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKTsKLSAgZG91YmxlIGREYXRlID0gTWFrZVJlZ3VsYXJEYXRlKHNWYWx1ZSwgc0Zvcm1hdCwgbnVsbHB0cik7Ci0gIGlmIChKU19Qb3J0SXNOYW4oZERhdGUpKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7Ci0gICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNQQVJTRURBVEUpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgIHNGb3JtYXQuY19zdHIoKSk7Ci0gICAgQWxlcnRJZlBvc3NpYmxlKHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCksIHN3TXNnLmNfc3RyKCkpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHZSZXQgPSBDSlNfVmFsdWUocFJ1bnRpbWUsIGREYXRlKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OkFGU2ltcGxlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMykgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB2UmV0ID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCBzdGF0aWNfY2FzdDxkb3VibGU+KEFGX1NpbXBsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcocFJ1bnRpbWUpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbMV0uVG9Eb3VibGUocFJ1bnRpbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zWzJdLlRvRG91YmxlKHBSdW50aW1lKSkpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZNYWtlTnVtYmVyKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBDRlhfV2lkZVN0cmluZyB3cyA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcocFJ1bnRpbWUpOwotICB3cy5SZXBsYWNlKEwiLCIsIEwiLiIpOwotICB2UmV0ID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCB3cy5jX3N0cigpKTsKLSAgdlJldC5NYXliZUNvZXJjZVRvTnVtYmVyKHBSdW50aW1lKTsKLSAgaWYgKHZSZXQuR2V0VHlwZSgpICE9IENKU19WYWx1ZTo6VlRfbnVtYmVyKQotICAgIHZSZXQgPSBDSlNfVmFsdWUocFJ1bnRpbWUsIDApOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZTaW1wbGVfQ2FsY3VsYXRlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBDSlNfVmFsdWUgcGFyYW1zMSA9IHBhcmFtc1sxXTsKLSAgaWYgKCFwYXJhbXMxLklzQXJyYXlPYmplY3QoKSAmJiBwYXJhbXMxLkdldFR5cGUoKSAhPSBDSlNfVmFsdWU6OlZUX3N0cmluZykgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBDUERGU0RLX0ludGVyRm9ybSogcFJlYWRlckludGVyRm9ybSA9Ci0gICAgICBwUnVudGltZS0+R2V0Rm9ybUZpbGxFbnYoKS0+R2V0SW50ZXJGb3JtKCk7Ci0gIENQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFJlYWRlckludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgc0Z1bmN0aW9uID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSk7Ci0gIGRvdWJsZSBkVmFsdWUgPSB3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiUFJEIikgPT0gMCA/IDEuMCA6IDAuMDsKLQotICBDSlNfQXJyYXkgRmllbGROYW1lQXJyYXkgPSBBRl9NYWtlQXJyYXlGcm9tTGlzdChwUnVudGltZSwgcGFyYW1zMSk7Ci0gIGludCBuRmllbGRzQ291bnQgPSAwOwotCi0gIGZvciAoaW50IGkgPSAwLCBpc3ogPSBGaWVsZE5hbWVBcnJheS5HZXRMZW5ndGgocFJ1bnRpbWUpOyBpIDwgaXN6OyBpKyspIHsKLSAgICBDSlNfVmFsdWUganNWYWx1ZShwUnVudGltZSk7Ci0gICAgRmllbGROYW1lQXJyYXkuR2V0RWxlbWVudChwUnVudGltZSwgaSwganNWYWx1ZSk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NGaWVsZE5hbWUgPSBqc1ZhbHVlLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSk7Ci0KLSAgICBmb3IgKGludCBqID0gMCwganN6ID0gcEludGVyRm9ybS0+Q291bnRGaWVsZHMod3NGaWVsZE5hbWUpOyBqIDwganN6OyBqKyspIHsKLSAgICAgIGlmIChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IHBJbnRlckZvcm0tPkdldEZpZWxkKGosIHdzRmllbGROYW1lKSkgewotICAgICAgICBkb3VibGUgZFRlbXAgPSAwLjA7Ci0gICAgICAgIHN3aXRjaCAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkpIHsKLSAgICAgICAgICBjYXNlIEZJRUxEVFlQRV9URVhURklFTEQ6Ci0gICAgICAgICAgY2FzZSBGSUVMRFRZUEVfQ09NQk9CT1g6IHsKLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHRyaW1tZWQgPSBwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpOwotICAgICAgICAgICAgdHJpbW1lZC5UcmltUmlnaHQoKTsKLSAgICAgICAgICAgIHRyaW1tZWQuVHJpbUxlZnQoKTsKLSAgICAgICAgICAgIGRUZW1wID0gRlhfYXRvZih0cmltbWVkLkFzU3RyaW5nQygpKTsKLSAgICAgICAgICB9IGJyZWFrOwotICAgICAgICAgIGNhc2UgRklFTERUWVBFX1BVU0hCVVRUT046IHsKLSAgICAgICAgICAgIGRUZW1wID0gMC4wOwotICAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgICAgY2FzZSBGSUVMRFRZUEVfQ0hFQ0tCT1g6Ci0gICAgICAgICAgY2FzZSBGSUVMRFRZUEVfUkFESU9CVVRUT046IHsKLSAgICAgICAgICAgIGRUZW1wID0gMC4wOwotICAgICAgICAgICAgZm9yIChpbnQgYyA9IDAsIGNzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgYyA8IGNzejsgYysrKSB7Ci0gICAgICAgICAgICAgIGlmIChDUERGX0Zvcm1Db250cm9sKiBwRm9ybUN0cmwgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGMpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBGb3JtQ3RybC0+SXNDaGVja2VkKCkpIHsKLSAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHRyaW1tZWQgPSBwRm9ybUN0cmwtPkdldEV4cG9ydFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICB0cmltbWVkLlRyaW1SaWdodCgpOwotICAgICAgICAgICAgICAgICAgdHJpbW1lZC5UcmltTGVmdCgpOwotICAgICAgICAgICAgICAgICAgZFRlbXAgPSBGWF9hdG9mKHRyaW1tZWQuQXNTdHJpbmdDKCkpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBicmVhazsKLSAgICAgICAgICBjYXNlIEZJRUxEVFlQRV9MSVNUQk9YOiB7Ci0gICAgICAgICAgICBpZiAocEZvcm1GaWVsZC0+Q291bnRTZWxlY3RlZEl0ZW1zKCkgPD0gMSkgewotICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB0cmltbWVkID0gcEZvcm1GaWVsZC0+R2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgdHJpbW1lZC5UcmltUmlnaHQoKTsKLSAgICAgICAgICAgICAgdHJpbW1lZC5UcmltTGVmdCgpOwotICAgICAgICAgICAgICBkVGVtcCA9IEZYX2F0b2YodHJpbW1lZC5Bc1N0cmluZ0MoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaSA9PSAwICYmIGogPT0gMCAmJiAod2NzY21wKHNGdW5jdGlvbi5jX3N0cigpLCBMIk1JTiIpID09IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjc2NtcChzRnVuY3Rpb24uY19zdHIoKSwgTCJNQVgiKSA9PSAwKSkKLSAgICAgICAgICBkVmFsdWUgPSBkVGVtcDsKLQotICAgICAgICBkVmFsdWUgPSBBRl9TaW1wbGUoc0Z1bmN0aW9uLmNfc3RyKCksIGRWYWx1ZSwgZFRlbXApOwotCi0gICAgICAgIG5GaWVsZHNDb3VudCsrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmICh3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiQVZHIikgPT0gMCAmJiBuRmllbGRzQ291bnQgPiAwKQotICAgIGRWYWx1ZSAvPSBuRmllbGRzQ291bnQ7Ci0KLSAgZFZhbHVlID0gKGRvdWJsZSlmbG9vcihkVmFsdWUgKiBGWFNZU19wb3coKGRvdWJsZSkxMCwgKGRvdWJsZSk2KSArIDAuNDkpIC8KLSAgICAgICAgICAgRlhTWVNfcG93KChkb3VibGUpMTAsIChkb3VibGUpNik7Ci0KLSAgQ0pTX1ZhbHVlIGpzVmFsdWUocFJ1bnRpbWUsIGRWYWx1ZSk7Ci0gIENKU19FdmVudENvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPkdldEN1cnJlbnRFdmVudENvbnRleHQoKTsKLSAgaWYgKHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKS0+bV9wVmFsdWUpCi0gICAgcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpLT5WYWx1ZSgpID0ganNWYWx1ZS5Ub0NGWFdpZGVTdHJpbmcocFJ1bnRpbWUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGlzIGZ1bmN0aW9uIHZhbGlkYXRlcyB0aGUgY3VycmVudCBldmVudCB0byBlbnN1cmUgdGhhdCBpdHMgdmFsdWUgaXMKLSoqIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLiAqLwotCi1ib29sIENKU19QdWJsaWNNZXRob2RzOjpBRlJhbmdlX1ZhbGlkYXRlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHBhcmFtcy5zaXplKCkgIT0gNCkgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQ0pTX0V2ZW50Q29udGV4dCogcENvbnRleHQgPSBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpOwotICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0gIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHBFdmVudC0+VmFsdWUoKS5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZG91YmxlIGRFZW50VmFsdWUgPQotICAgICAgYXRvZihDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocEV2ZW50LT5WYWx1ZSgpKS5jX3N0cigpKTsKLSAgYm9vbCBiR3JlYXRlclRoYW4gPSBwYXJhbXNbMF0uVG9Cb29sKHBSdW50aW1lKTsKLSAgZG91YmxlIGRHcmVhdGVyVGhhbiA9IHBhcmFtc1sxXS5Ub0RvdWJsZShwUnVudGltZSk7Ci0gIGJvb2wgYkxlc3NUaGFuID0gcGFyYW1zWzJdLlRvQm9vbChwUnVudGltZSk7Ci0gIGRvdWJsZSBkTGVzc1RoYW4gPSBwYXJhbXNbM10uVG9Eb3VibGUocFJ1bnRpbWUpOwotICBDRlhfV2lkZVN0cmluZyBzd01zZzsKLQotICBpZiAoYkdyZWF0ZXJUaGFuICYmIGJMZXNzVGhhbikgewotICAgIGlmIChkRWVudFZhbHVlIDwgZEdyZWF0ZXJUaGFuIHx8IGRFZW50VmFsdWUgPiBkTGVzc1RoYW4pCi0gICAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU1JBTkdFMSkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgIHBhcmFtc1szXS5Ub0NGWFdpZGVTdHJpbmcocFJ1bnRpbWUpLmNfc3RyKCkpOwotICB9IGVsc2UgaWYgKGJHcmVhdGVyVGhhbikgewotICAgIGlmIChkRWVudFZhbHVlIDwgZEdyZWF0ZXJUaGFuKQotICAgICAgc3dNc2cuRm9ybWF0KEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNSQU5HRTIpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgcGFyYW1zWzFdLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSkuY19zdHIoKSk7Ci0gIH0gZWxzZSBpZiAoYkxlc3NUaGFuKSB7Ci0gICAgaWYgKGRFZW50VmFsdWUgPiBkTGVzc1RoYW4pCi0gICAgICBzd01zZy5Gb3JtYXQoSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU1JBTkdFMykuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBwYXJhbXNbM10uVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKS5jX3N0cigpKTsKLSAgfQotCi0gIGlmICghc3dNc2cuSXNFbXB0eSgpKSB7Ci0gICAgQWxlcnRJZlBvc3NpYmxlKHBDb250ZXh0LCBzd01zZy5jX3N0cigpKTsKLSAgICBwRXZlbnQtPlJjKCkgPSBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDSlNfUHVibGljTWV0aG9kczo6QUZFeHRyYWN0TnVtcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgc3RyID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSk7Ci0gIGlmIChzdHIuR2V0QXQoMCkgPT0gTCcuJyB8fCBzdHIuR2V0QXQoMCkgPT0gTCcsJykKLSAgICBzdHIgPSBMIjAiICsgc3RyOwotCi0gIENGWF9XaWRlU3RyaW5nIHNQYXJ0OwotICBDSlNfQXJyYXkgbnVtczsKLSAgaW50IG5JbmRleCA9IDA7Ci0gIGZvciAoaW50IGkgPSAwLCBzeiA9IHN0ci5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspIHsKLSAgICBGWF9XQ0hBUiB3YyA9IHN0ci5HZXRBdChpKTsKLSAgICBpZiAoRlhTWVNfaXN3ZGlnaXQod2MpKSB7Ci0gICAgICBzUGFydCArPSB3YzsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKHNQYXJ0LkdldExlbmd0aCgpID4gMCkgewotICAgICAgICBudW1zLlNldEVsZW1lbnQocFJ1bnRpbWUsIG5JbmRleCwgQ0pTX1ZhbHVlKHBSdW50aW1lLCBzUGFydC5jX3N0cigpKSk7Ci0gICAgICAgIHNQYXJ0ID0gTCIiOwotICAgICAgICBuSW5kZXgrKzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoc1BhcnQuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgbnVtcy5TZXRFbGVtZW50KHBSdW50aW1lLCBuSW5kZXgsIENKU19WYWx1ZShwUnVudGltZSwgc1BhcnQuY19zdHIoKSkpOwotICB9Ci0KLSAgaWYgKG51bXMuR2V0TGVuZ3RoKHBSdW50aW1lKSA+IDApCi0gICAgdlJldCA9IENKU19WYWx1ZShwUnVudGltZSwgbnVtcyk7Ci0gIGVsc2UKLSAgICB2UmV0LlNldE51bGwocFJ1bnRpbWUpOwotCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuaCBiL2ZwZGZzZGsvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MGM3NDMuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19KQVZBU0NSSVBUX1BVQkxJQ01FVEhPRFNfSF8KLSNkZWZpbmUgRlBERlNES19KQVZBU0NSSVBUX1BVQkxJQ01FVEhPRFNfSF8KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgiCi0KLWNsYXNzIENKU19QdWJsaWNNZXRob2RzIDogcHVibGljIENKU19PYmplY3QgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0pTX1B1YmxpY01ldGhvZHModjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpCi0gICAgICA6IENKU19PYmplY3QocE9iamVjdCkge30KLSAgfkNKU19QdWJsaWNNZXRob2RzKCkgb3ZlcnJpZGUge30KLQotICBzdGF0aWMgYm9vbCBBRk51bWJlcl9Gb3JtYXQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIHN0YXRpYyBib29sIEFGTnVtYmVyX0tleXN0cm9rZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgc3RhdGljIGJvb2wgQUZQZXJjZW50X0Zvcm1hdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgc3RhdGljIGJvb2wgQUZQZXJjZW50X0tleXN0cm9rZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgc3RhdGljIGJvb2wgQUZEYXRlX0Zvcm1hdEV4KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBzdGF0aWMgYm9vbCBBRkRhdGVfS2V5c3Ryb2tlRXgoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIHN0YXRpYyBib29sIEFGRGF0ZV9Gb3JtYXQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIHN0YXRpYyBib29sIEFGRGF0ZV9LZXlzdHJva2UoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIHN0YXRpYyBib29sIEFGVGltZV9Gb3JtYXRFeChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsgIC8vCi0gIHN0YXRpYyBib29sIEFGVGltZV9LZXlzdHJva2VFeChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgc3RhdGljIGJvb2wgQUZUaW1lX0Zvcm1hdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgc3RhdGljIGJvb2wgQUZUaW1lX0tleXN0cm9rZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgc3RhdGljIGJvb2wgQUZTcGVjaWFsX0Zvcm1hdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgc3RhdGljIGJvb2wgQUZTcGVjaWFsX0tleXN0cm9rZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgc3RhdGljIGJvb2wgQUZTcGVjaWFsX0tleXN0cm9rZUV4KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOyAgLy8KLSAgc3RhdGljIGJvb2wgQUZTaW1wbGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIHN0YXRpYyBib29sIEFGTWFrZU51bWJlcihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgc3RhdGljIGJvb2wgQUZTaW1wbGVfQ2FsY3VsYXRlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBzdGF0aWMgYm9vbCBBRlJhbmdlX1ZhbGlkYXRlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBzdGF0aWMgYm9vbCBBRk1lcmdlQ2hhbmdlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBzdGF0aWMgYm9vbCBBRlBhcnNlRGF0ZUV4KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBzdGF0aWMgYm9vbCBBRkV4dHJhY3ROdW1zKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCi0gIEpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGTnVtYmVyX0Zvcm1hdCk7Ci0gIEpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGTnVtYmVyX0tleXN0cm9rZSk7Ci0gIEpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGUGVyY2VudF9Gb3JtYXQpOwotICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlBlcmNlbnRfS2V5c3Ryb2tlKTsKLSAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZEYXRlX0Zvcm1hdEV4KTsKLSAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZEYXRlX0tleXN0cm9rZUV4KTsKLSAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZEYXRlX0Zvcm1hdCk7Ci0gIEpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGRGF0ZV9LZXlzdHJva2UpOwotICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlRpbWVfRm9ybWF0RXgpOwotICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlRpbWVfS2V5c3Ryb2tlRXgpOwotICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlRpbWVfRm9ybWF0KTsKLSAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZUaW1lX0tleXN0cm9rZSk7Ci0gIEpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGU3BlY2lhbF9Gb3JtYXQpOwotICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlNwZWNpYWxfS2V5c3Ryb2tlKTsKLSAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZTcGVjaWFsX0tleXN0cm9rZUV4KTsKLSAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZTaW1wbGUpOwotICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRk1ha2VOdW1iZXIpOwotICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlNpbXBsZV9DYWxjdWxhdGUpOwotICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlJhbmdlX1ZhbGlkYXRlKTsKLSAgSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZNZXJnZUNoYW5nZSk7Ci0gIEpTX1NUQVRJQ19HTE9CQUxfRlVOKEFGUGFyc2VEYXRlRXgpOwotICBKU19TVEFUSUNfR0xPQkFMX0ZVTihBRkV4dHJhY3ROdW1zKTsKLQotICBKU19TVEFUSUNfREVDTEFSRV9HTE9CQUxfRlVOKCk7Ci0KLSAgc3RhdGljIGludCBQYXJzZVN0cmluZ0ludGVnZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5TdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2tpcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5NYXhTdGVwKTsKLSAgc3RhdGljIENGWF9XaWRlU3RyaW5nIFBhcnNlU3RyaW5nU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2tpcCk7Ci0gIHN0YXRpYyBkb3VibGUgTWFrZVJlZ3VsYXJEYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogYldyb25nRm9ybWF0KTsKLSAgc3RhdGljIENGWF9XaWRlU3RyaW5nIE1ha2VGb3JtYXREYXRlKGRvdWJsZSBkRGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBmb3JtYXQpOwotICBzdGF0aWMgZG91YmxlIFBhcnNlTm9ybWFsRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGJXcm9uZ0Zvcm1hdCk7Ci0gIHN0YXRpYyBkb3VibGUgTWFrZUludGVyRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUpOwotCi0gIHN0YXRpYyBib29sIElzTnVtYmVyKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpOwotCi0gIHN0YXRpYyBib29sIG1hc2tTYXRpc2ZpZWQod2NoYXJfdCBjX0NoYW5nZSwgd2NoYXJfdCBjX01hc2spOwotICBzdGF0aWMgYm9vbCBpc1Jlc2VydmVkTWFza0NoYXIod2NoYXJfdCBjaCk7Ci0KLSAgc3RhdGljIGRvdWJsZSBBRl9TaW1wbGUoY29uc3QgRlhfV0NIQVIqIHNGdWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZFZhbHVlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRWYWx1ZTIpOwotICBzdGF0aWMgQ0pTX0FycmF5IEFGX01ha2VBcnJheUZyb21MaXN0KENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX1ZhbHVlIHZhbCk7Ci19OwotCi0jZW5kaWYgIC8vIEZQREZTREtfSkFWQVNDUklQVF9QVUJMSUNNRVRIT0RTX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL2phdmFzY3JpcHQvYXBwLmNwcCBiL2ZwZGZzZGsvamF2YXNjcmlwdC9hcHAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYThiZjA4Li4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvamF2YXNjcmlwdC9hcHAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzkwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9hcHAuaCIKLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX2Zvcm1maWxsZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfaW50ZXJmb3JtLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0RvY3VtZW50LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19FdmVudEhhbmRsZXIuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L2Nqc19ldmVudF9jb250ZXh0LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L2Nqc19ydW50aW1lLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L3Jlc291cmNlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgotCi1jbGFzcyBHbG9iYWxUaW1lciB7Ci0gcHVibGljOgotICBHbG9iYWxUaW1lcihhcHAqIHBPYmosCi0gICAgICAgICAgICAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgIGludCBuVHlwZSwKLSAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwKLSAgICAgICAgICAgICAgdWludDMyX3QgZHdFbGFwc2UsCi0gICAgICAgICAgICAgIHVpbnQzMl90IGR3VGltZU91dCk7Ci0gIH5HbG9iYWxUaW1lcigpOwotCi0gIHN0YXRpYyB2b2lkIFRyaWdnZXIoaW50IG5UaW1lcklEKTsKLSAgc3RhdGljIHZvaWQgQ2FuY2VsKGludCBuVGltZXJJRCk7Ci0KLSAgYm9vbCBJc09uZVNob3QoKSBjb25zdCB7IHJldHVybiBtX25UeXBlID09IDE7IH0KLSAgdWludDMyX3QgR2V0VGltZU91dCgpIGNvbnN0IHsgcmV0dXJuIG1fZHdUaW1lT3V0OyB9Ci0gIGludCBHZXRUaW1lcklEKCkgY29uc3QgeyByZXR1cm4gbV9uVGltZXJJRDsgfQotICBDSlNfUnVudGltZSogR2V0UnVudGltZSgpIGNvbnN0IHsgcmV0dXJuIG1fcFJ1bnRpbWUuR2V0KCk7IH0KLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0SlNjcmlwdCgpIGNvbnN0IHsgcmV0dXJuIG1fc3dKU2NyaXB0OyB9Ci0KLSBwcml2YXRlOgotICB1c2luZyBUaW1lck1hcCA9IHN0ZDo6bWFwPHVpbnQzMl90LCBHbG9iYWxUaW1lcio+OwotICBzdGF0aWMgVGltZXJNYXAqIEdldEdsb2JhbFRpbWVyTWFwKCk7Ci0KLSAgdWludDMyX3QgbV9uVGltZXJJRDsKLSAgYXBwKiBjb25zdCBtX3BFbWJlZE9iajsKLSAgYm9vbCBtX2JQcm9jZXNzaW5nOwotCi0gIC8vIGRhdGEKLSAgY29uc3QgaW50IG1fblR5cGU7ICAvLyAwOkludGVydmFsOyAxOlRpbWVPdXQKLSAgY29uc3QgdWludDMyX3QgbV9kd1RpbWVPdXQ7Ci0gIGNvbnN0IENGWF9XaWRlU3RyaW5nIG1fc3dKU2NyaXB0OwotICBDSlNfUnVudGltZTo6T2JzZXJ2ZWRQdHIgbV9wUnVudGltZTsKLSAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpPYnNlcnZlZFB0ciBtX3BGb3JtRmlsbEVudjsKLX07Ci0KLUdsb2JhbFRpbWVyOjpHbG9iYWxUaW1lcihhcHAqIHBPYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RWxhcHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3VGltZU91dCkKLSAgICA6IG1fblRpbWVySUQoMCksCi0gICAgICBtX3BFbWJlZE9iaihwT2JqKSwKLSAgICAgIG1fYlByb2Nlc3NpbmcoZmFsc2UpLAotICAgICAgbV9uVHlwZShuVHlwZSksCi0gICAgICBtX2R3VGltZU91dChkd1RpbWVPdXQpLAotICAgICAgbV9zd0pTY3JpcHQoc2NyaXB0KSwKLSAgICAgIG1fcFJ1bnRpbWUocFJ1bnRpbWUpLAotICAgICAgbV9wRm9ybUZpbGxFbnYocEZvcm1GaWxsRW52KSB7Ci0gIENGWF9TeXN0ZW1IYW5kbGVyKiBwSGFuZGxlciA9IG1fcEZvcm1GaWxsRW52LT5HZXRTeXNIYW5kbGVyKCk7Ci0gIG1fblRpbWVySUQgPSBwSGFuZGxlci0+U2V0VGltZXIoZHdFbGFwc2UsIFRyaWdnZXIpOwotICBpZiAobV9uVGltZXJJRCkKLSAgICAoKkdldEdsb2JhbFRpbWVyTWFwKCkpW21fblRpbWVySURdID0gdGhpczsKLX0KLQotR2xvYmFsVGltZXI6On5HbG9iYWxUaW1lcigpIHsKLSAgaWYgKCFtX25UaW1lcklEKQotICAgIHJldHVybjsKLQotICBpZiAoR2V0UnVudGltZSgpKQotICAgIG1fcEZvcm1GaWxsRW52LT5HZXRTeXNIYW5kbGVyKCktPktpbGxUaW1lcihtX25UaW1lcklEKTsKLQotICBHZXRHbG9iYWxUaW1lck1hcCgpLT5lcmFzZShtX25UaW1lcklEKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEdsb2JhbFRpbWVyOjpUcmlnZ2VyKGludCBuVGltZXJJRCkgewotICBhdXRvIGl0ID0gR2V0R2xvYmFsVGltZXJNYXAoKS0+ZmluZChuVGltZXJJRCk7Ci0gIGlmIChpdCA9PSBHZXRHbG9iYWxUaW1lck1hcCgpLT5lbmQoKSkKLSAgICByZXR1cm47Ci0KLSAgR2xvYmFsVGltZXIqIHBUaW1lciA9IGl0LT5zZWNvbmQ7Ci0gIGlmIChwVGltZXItPm1fYlByb2Nlc3NpbmcpCi0gICAgcmV0dXJuOwotCi0gIHBUaW1lci0+bV9iUHJvY2Vzc2luZyA9IHRydWU7Ci0gIGlmIChwVGltZXItPm1fcEVtYmVkT2JqKQotICAgIHBUaW1lci0+bV9wRW1iZWRPYmotPlRpbWVyUHJvYyhwVGltZXIpOwotCi0gIC8vIFRpbWVyIHByb2MgbWF5IGhhdmUgZGVzdHJveWVkIHRpbWVyLCBmaW5kIGl0IGFnYWluLgotICBpdCA9IEdldEdsb2JhbFRpbWVyTWFwKCktPmZpbmQoblRpbWVySUQpOwotICBpZiAoaXQgPT0gR2V0R2xvYmFsVGltZXJNYXAoKS0+ZW5kKCkpCi0gICAgcmV0dXJuOwotCi0gIHBUaW1lciA9IGl0LT5zZWNvbmQ7Ci0gIHBUaW1lci0+bV9iUHJvY2Vzc2luZyA9IGZhbHNlOwotICBpZiAocFRpbWVyLT5Jc09uZVNob3QoKSkKLSAgICBwVGltZXItPm1fcEVtYmVkT2JqLT5DYW5jZWxQcm9jKHBUaW1lcik7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBHbG9iYWxUaW1lcjo6Q2FuY2VsKGludCBuVGltZXJJRCkgewotICBhdXRvIGl0ID0gR2V0R2xvYmFsVGltZXJNYXAoKS0+ZmluZChuVGltZXJJRCk7Ci0gIGlmIChpdCA9PSBHZXRHbG9iYWxUaW1lck1hcCgpLT5lbmQoKSkKLSAgICByZXR1cm47Ci0KLSAgR2xvYmFsVGltZXIqIHBUaW1lciA9IGl0LT5zZWNvbmQ7Ci0gIHBUaW1lci0+bV9wRW1iZWRPYmotPkNhbmNlbFByb2MocFRpbWVyKTsKLX0KLQotLy8gc3RhdGljCi1HbG9iYWxUaW1lcjo6VGltZXJNYXAqIEdsb2JhbFRpbWVyOjpHZXRHbG9iYWxUaW1lck1hcCgpIHsKLSAgLy8gTGVhayB0aGUgdGltZXIgYXJyYXkgYXQgc2h1dGRvd24uCi0gIHN0YXRpYyBhdXRvKiBzX1RpbWVyTWFwID0gbmV3IFRpbWVyTWFwOwotICByZXR1cm4gc19UaW1lck1hcDsKLX0KLQotSlNDb25zdFNwZWMgQ0pTX1RpbWVyT2JqOjpDb25zdFNwZWNzW10gPSB7ezAsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDAsIDB9fTsKLQotSlNQcm9wZXJ0eVNwZWMgQ0pTX1RpbWVyT2JqOjpQcm9wZXJ0eVNwZWNzW10gPSB7ezAsIDAsIDB9fTsKLQotSlNNZXRob2RTcGVjIENKU19UaW1lck9iajo6TWV0aG9kU3BlY3NbXSA9IHt7MCwgMH19OwotCi1JTVBMRU1FTlRfSlNfQ0xBU1MoQ0pTX1RpbWVyT2JqLCBUaW1lck9iaikKLQotVGltZXJPYmo6OlRpbWVyT2JqKENKU19PYmplY3QqIHBKU09iamVjdCkKLSAgICA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpLCBtX25UaW1lcklEKDApIHt9Ci0KLVRpbWVyT2JqOjp+VGltZXJPYmooKSB7fQotCi12b2lkIFRpbWVyT2JqOjpTZXRUaW1lcihHbG9iYWxUaW1lciogcFRpbWVyKSB7Ci0gIG1fblRpbWVySUQgPSBwVGltZXItPkdldFRpbWVySUQoKTsKLX0KLQotI2RlZmluZSBKU19TVFJfVklFV0VSVFlQRSBMInBkZml1bSIKLSNkZWZpbmUgSlNfU1RSX1ZJRVdFUlZBUklBVElPTiBMIkZ1bGwiCi0jZGVmaW5lIEpTX1NUUl9QTEFURk9STSBMIldJTiIKLSNkZWZpbmUgSlNfU1RSX0xBTkdVQUdFIEwiRU5VIgotI2RlZmluZSBKU19OVU1fVklFV0VSVkVSU0lPTiA4Ci0jaWZkZWYgUERGX0VOQUJMRV9YRkEKLSNkZWZpbmUgSlNfTlVNX1ZJRVdFUlZFUlNJT05fWEZBIDExCi0jZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCi0jZGVmaW5lIEpTX05VTV9GT1JNU1ZFUlNJT04gNwotCi1KU0NvbnN0U3BlYyBDSlNfQXBwOjpDb25zdFNwZWNzW10gPSB7ezAsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDAsIDB9fTsKLQotSlNQcm9wZXJ0eVNwZWMgQ0pTX0FwcDo6UHJvcGVydHlTcGVjc1tdID0gewotICAgIHsiYWN0aXZlRG9jcyIsIGdldF9hY3RpdmVEb2NzX3N0YXRpYywgc2V0X2FjdGl2ZURvY3Nfc3RhdGljfSwKLSAgICB7ImNhbGN1bGF0ZSIsIGdldF9jYWxjdWxhdGVfc3RhdGljLCBzZXRfY2FsY3VsYXRlX3N0YXRpY30sCi0gICAgeyJmb3Jtc1ZlcnNpb24iLCBnZXRfZm9ybXNWZXJzaW9uX3N0YXRpYywgc2V0X2Zvcm1zVmVyc2lvbl9zdGF0aWN9LAotICAgIHsiZnMiLCBnZXRfZnNfc3RhdGljLCBzZXRfZnNfc3RhdGljfSwKLSAgICB7ImZ1bGxzY3JlZW4iLCBnZXRfZnVsbHNjcmVlbl9zdGF0aWMsIHNldF9mdWxsc2NyZWVuX3N0YXRpY30sCi0gICAgeyJsYW5ndWFnZSIsIGdldF9sYW5ndWFnZV9zdGF0aWMsIHNldF9sYW5ndWFnZV9zdGF0aWN9LAotICAgIHsibWVkaWEiLCBnZXRfbWVkaWFfc3RhdGljLCBzZXRfbWVkaWFfc3RhdGljfSwKLSAgICB7InBsYXRmb3JtIiwgZ2V0X3BsYXRmb3JtX3N0YXRpYywgc2V0X3BsYXRmb3JtX3N0YXRpY30sCi0gICAgeyJydW50aW1lSGlnaGxpZ2h0IiwgZ2V0X3J1bnRpbWVIaWdobGlnaHRfc3RhdGljLAotICAgICBzZXRfcnVudGltZUhpZ2hsaWdodF9zdGF0aWN9LAotICAgIHsidmlld2VyVHlwZSIsIGdldF92aWV3ZXJUeXBlX3N0YXRpYywgc2V0X3ZpZXdlclR5cGVfc3RhdGljfSwKLSAgICB7InZpZXdlclZhcmlhdGlvbiIsIGdldF92aWV3ZXJWYXJpYXRpb25fc3RhdGljLCBzZXRfdmlld2VyVmFyaWF0aW9uX3N0YXRpY30sCi0gICAgeyJ2aWV3ZXJWZXJzaW9uIiwgZ2V0X3ZpZXdlclZlcnNpb25fc3RhdGljLCBzZXRfdmlld2VyVmVyc2lvbl9zdGF0aWN9LAotICAgIHswLCAwLCAwfX07Ci0KLUpTTWV0aG9kU3BlYyBDSlNfQXBwOjpNZXRob2RTcGVjc1tdID0ge3siYWxlcnQiLCBhbGVydF9zdGF0aWN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJiZWVwIiwgYmVlcF9zdGF0aWN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJicm93c2VGb3JEb2MiLCBicm93c2VGb3JEb2Nfc3RhdGljfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiY2xlYXJJbnRlcnZhbCIsIGNsZWFySW50ZXJ2YWxfc3RhdGljfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiY2xlYXJUaW1lT3V0IiwgY2xlYXJUaW1lT3V0X3N0YXRpY30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImV4ZWNEaWFsb2ciLCBleGVjRGlhbG9nX3N0YXRpY30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImV4ZWNNZW51SXRlbSIsIGV4ZWNNZW51SXRlbV9zdGF0aWN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJmaW5kQ29tcG9uZW50IiwgZmluZENvbXBvbmVudF9zdGF0aWN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJnb0JhY2siLCBnb0JhY2tfc3RhdGljfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZ29Gb3J3YXJkIiwgZ29Gb3J3YXJkX3N0YXRpY30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImxhdW5jaFVSTCIsIGxhdW5jaFVSTF9zdGF0aWN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJtYWlsTXNnIiwgbWFpbE1zZ19zdGF0aWN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuZXdGREYiLCBuZXdGREZfc3RhdGljfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmV3RG9jIiwgbmV3RG9jX3N0YXRpY30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im9wZW5Eb2MiLCBvcGVuRG9jX3N0YXRpY30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Im9wZW5GREYiLCBvcGVuRkRGX3N0YXRpY30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InBvcFVwTWVudUV4IiwgcG9wVXBNZW51RXhfc3RhdGljfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsicG9wVXBNZW51IiwgcG9wVXBNZW51X3N0YXRpY30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InJlc3BvbnNlIiwgcmVzcG9uc2Vfc3RhdGljfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsic2V0SW50ZXJ2YWwiLCBzZXRJbnRlcnZhbF9zdGF0aWN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJzZXRUaW1lT3V0Iiwgc2V0VGltZU91dF9zdGF0aWN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIDB9fTsKLQotSU1QTEVNRU5UX0pTX0NMQVNTKENKU19BcHAsIGFwcCkKLQotYXBwOjphcHAoQ0pTX09iamVjdCogcEpTT2JqZWN0KQotICAgIDogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCksIG1fYkNhbGN1bGF0ZSh0cnVlKSwgbV9iUnVudGltZUhpZ2hMaWdodChmYWxzZSkge30KLQotYXBwOjp+YXBwKCkgewotfQotCi1ib29sIGFwcDo6YWN0aXZlRG9jcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ0pTX0RvY3VtZW50KiBwSlNEb2N1bWVudCA9IG51bGxwdHI7Ci0gIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqID0gcFJ1bnRpbWUtPkdldFRoaXNPYmooKTsKLSAgaWYgKENGWEpTX0VuZ2luZTo6R2V0T2JqRGVmbklEKHBPYmopID09IENKU19Eb2N1bWVudDo6Z19uT2JqRGVmbklEKQotICAgIHBKU0RvY3VtZW50ID0gc3RhdGljX2Nhc3Q8Q0pTX0RvY3VtZW50Kj4ocFJ1bnRpbWUtPkdldE9iamVjdFByaXZhdGUocE9iaikpOwotCi0gIENKU19BcnJheSBhRG9jczsKLSAgYURvY3MuU2V0RWxlbWVudChwUnVudGltZSwgMCwgQ0pTX1ZhbHVlKHBSdW50aW1lLCBwSlNEb2N1bWVudCkpOwotICBpZiAoYURvY3MuR2V0TGVuZ3RoKHBSdW50aW1lKSA+IDApCi0gICAgdnAgPDwgYURvY3M7Ci0gIGVsc2UKLSAgICB2cC5HZXRKU1ZhbHVlKCktPlNldE51bGwocFJ1bnRpbWUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGFwcDo6Y2FsY3VsYXRlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHZwLklzU2V0dGluZygpKSB7Ci0gICAgYm9vbCBiVlA7Ci0gICAgdnAgPj4gYlZQOwotICAgIG1fYkNhbGN1bGF0ZSA9IChib29sKWJWUDsKLSAgICBwUnVudGltZS0+R2V0Rm9ybUZpbGxFbnYoKS0+R2V0SW50ZXJGb3JtKCktPkVuYWJsZUNhbGN1bGF0ZSgKLSAgICAgICAgKGJvb2wpbV9iQ2FsY3VsYXRlKTsKLSAgfSBlbHNlIHsKLSAgICB2cCA8PCAoYm9vbCltX2JDYWxjdWxhdGU7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgYXBwOjpmb3Jtc1ZlcnNpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAodnAuSXNHZXR0aW5nKCkpIHsKLSAgICB2cCA8PCBKU19OVU1fRk9STVNWRVJTSU9OOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGFwcDo6dmlld2VyVHlwZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHZwLklzR2V0dGluZygpKSB7Ci0gICAgdnAgPDwgSlNfU1RSX1ZJRVdFUlRZUEU7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgYXBwOjp2aWV3ZXJWYXJpYXRpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAodnAuSXNHZXR0aW5nKCkpIHsKLSAgICB2cCA8PCBKU19TVFJfVklFV0VSVkFSSUFUSU9OOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGFwcDo6dmlld2VyVmVyc2lvbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0jaWZkZWYgUERGX0VOQUJMRV9YRkEKLSAgQ1BERlhGQV9Db250ZXh0KiBwWEZBQ29udGV4dCA9IHBSdW50aW1lLT5HZXRGb3JtRmlsbEVudigpLT5HZXRYRkFDb250ZXh0KCk7Ci0gIGlmIChwWEZBQ29udGV4dC0+R2V0RG9jVHlwZSgpID09IDEgfHwgcFhGQUNvbnRleHQtPkdldERvY1R5cGUoKSA9PSAyKSB7Ci0gICAgdnAgPDwgSlNfTlVNX1ZJRVdFUlZFUlNJT05fWEZBOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0jZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCi0gIHZwIDw8IEpTX05VTV9WSUVXRVJWRVJTSU9OOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBhcHA6OnBsYXRmb3JtKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmICghdnAuSXNHZXR0aW5nKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotI2lmZGVmIFBERl9FTkFCTEVfWEZBCi0gIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52ID0gcFJ1bnRpbWUtPkdldEZvcm1GaWxsRW52KCk7Ci0gIGlmICghcEZvcm1GaWxsRW52KQotICAgIHJldHVybiBmYWxzZTsKLSAgQ0ZYX1dpZGVTdHJpbmcgcGxhdGZyb20gPSBwRm9ybUZpbGxFbnYtPkdldFBsYXRmb3JtKCk7Ci0gIGlmICghcGxhdGZyb20uSXNFbXB0eSgpKSB7Ci0gICAgdnAgPDwgcGxhdGZyb207Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSNlbmRpZgotICB2cCA8PCBKU19TVFJfUExBVEZPUk07Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGFwcDo6bGFuZ3VhZ2UoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0jaWZkZWYgUERGX0VOQUJMRV9YRkEKLSAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYgPSBwUnVudGltZS0+R2V0Rm9ybUZpbGxFbnYoKTsKLSAgaWYgKCFwRm9ybUZpbGxFbnYpCi0gICAgcmV0dXJuIGZhbHNlOwotICBDRlhfV2lkZVN0cmluZyBsYW5ndWFnZSA9IHBGb3JtRmlsbEVudi0+R2V0TGFuZ3VhZ2UoKTsKLSAgaWYgKCFsYW5ndWFnZS5Jc0VtcHR5KCkpIHsKLSAgICB2cCA8PCBsYW5ndWFnZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotI2VuZGlmCi0gIHZwIDw8IEpTX1NUUl9MQU5HVUFHRTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIGNyZWF0ZXMgYSBuZXcgZmRmIG9iamVjdCB0aGF0IGNvbnRhaW5zIG5vIGRhdGEKLS8vIGNvbW1lbnQ6IG5lZWQgcmVhZGVyIHN1cHBvcnQKLS8vIG5vdGU6Ci0vLyBDRkRGX0RvY3VtZW50ICogQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpOZXdGREYoKTsKLWJvb2wgYXBwOjpuZXdGREYoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gdHJ1ZTsKLX0KLS8vIG9wZW5zIGEgc3BlY2lmaWVkIHBkZiBkb2N1bWVudCBhbmQgcmV0dXJucyBpdHMgZG9jdW1lbnQgb2JqZWN0Ci0vLyBjb21tZW50Om5lZWQgcmVhZGVyIHN1cHBvcnQKLS8vIG5vdGU6IGFzIGRlZmluZWQgaW4ganMgcmVmZXJlbmNlLCB0aGUgcHJvdG8gb2YgdGhpcyBmdW5jdGlvbidzIGZvdXJ0aAotLy8gcGFybWV0ZXJzLCBob3cgb2xkIGFuIGZkZiBkb2N1bWVudCB3aGlsZSBkbyBub3Qgc2hvdyBpdC4KLS8vIENGREZfRG9jdW1lbnQgKiBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6Ok9wZW5GREYoc3RyaW5nIHN0clBhdGgsYm9vbAotLy8gYlVzZXJDb252KTsKLQotYm9vbCBhcHA6Om9wZW5GREYoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBhcHA6OmFsZXJ0KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiBuZXdQYXJhbXMgPSBKU19FeHBhbmRLZXl3b3JkUGFyYW1zKAotICAgICAgcFJ1bnRpbWUsIHBhcmFtcywgNCwgTCJjTXNnIiwgTCJuSWNvbiIsIEwiblR5cGUiLCBMImNUaXRsZSIpOwotCi0gIGlmIChuZXdQYXJhbXNbMF0uR2V0VHlwZSgpID09IENKU19WYWx1ZTo6VlRfdW5rbm93bikgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiA9IHBSdW50aW1lLT5HZXRGb3JtRmlsbEVudigpOwotICBpZiAoIXBGb3JtRmlsbEVudikgewotICAgIHZSZXQgPSBDSlNfVmFsdWUocFJ1bnRpbWUsIDApOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgc3dNc2c7Ci0gIGlmIChuZXdQYXJhbXNbMF0uR2V0VHlwZSgpID09IENKU19WYWx1ZTo6VlRfb2JqZWN0KSB7Ci0gICAgQ0pTX0FycmF5IGNhcnJheTsKLSAgICBpZiAobmV3UGFyYW1zWzBdLkNvbnZlcnRUb0FycmF5KHBSdW50aW1lLCBjYXJyYXkpKSB7Ci0gICAgICBzd01zZyA9IEwiWyI7Ci0gICAgICBDSlNfVmFsdWUgZWxlbWVudChwUnVudGltZSk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhcnJheS5HZXRMZW5ndGgocFJ1bnRpbWUpOyArK2kpIHsKLSAgICAgICAgaWYgKGkpCi0gICAgICAgICAgc3dNc2cgKz0gTCIsICI7Ci0gICAgICAgIGNhcnJheS5HZXRFbGVtZW50KHBSdW50aW1lLCBpLCBlbGVtZW50KTsKLSAgICAgICAgc3dNc2cgKz0gZWxlbWVudC5Ub0NGWFdpZGVTdHJpbmcocFJ1bnRpbWUpOwotICAgICAgfQotICAgICAgc3dNc2cgKz0gTCJdIjsKLSAgICB9IGVsc2UgewotICAgICAgc3dNc2cgPSBuZXdQYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgc3dNc2cgPSBuZXdQYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKTsKLSAgfQotCi0gIGludCBpSWNvbiA9IDA7Ci0gIGlmIChuZXdQYXJhbXNbMV0uR2V0VHlwZSgpICE9IENKU19WYWx1ZTo6VlRfdW5rbm93bikKLSAgICBpSWNvbiA9IG5ld1BhcmFtc1sxXS5Ub0ludChwUnVudGltZSk7Ci0KLSAgaW50IGlUeXBlID0gMDsKLSAgaWYgKG5ld1BhcmFtc1syXS5HZXRUeXBlKCkgIT0gQ0pTX1ZhbHVlOjpWVF91bmtub3duKQotICAgIGlUeXBlID0gbmV3UGFyYW1zWzJdLlRvSW50KHBSdW50aW1lKTsKLQotICBDRlhfV2lkZVN0cmluZyBzd1RpdGxlOwotICBpZiAobmV3UGFyYW1zWzNdLkdldFR5cGUoKSAhPSBDSlNfVmFsdWU6OlZUX3Vua25vd24pCi0gICAgc3dUaXRsZSA9IG5ld1BhcmFtc1szXS5Ub0NGWFdpZGVTdHJpbmcocFJ1bnRpbWUpOwotICBlbHNlCi0gICAgc3dUaXRsZSA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNBTEVSVCk7Ci0KLSAgcFJ1bnRpbWUtPkJlZ2luQmxvY2soKTsKLSAgcEZvcm1GaWxsRW52LT5LaWxsRm9jdXNBbm5vdCgwKTsKLQotICB2UmV0ID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCBwRm9ybUZpbGxFbnYtPkpTX2FwcEFsZXJ0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dNc2cuY19zdHIoKSwgc3dUaXRsZS5jX3N0cigpLCBpVHlwZSwgaUljb24pKTsKLSAgcFJ1bnRpbWUtPkVuZEJsb2NrKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGFwcDo6YmVlcChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmIChwYXJhbXMuc2l6ZSgpID09IDEpIHsKLSAgICBwUnVudGltZS0+R2V0Rm9ybUZpbGxFbnYoKS0+SlNfYXBwQmVlcChwYXJhbXNbMF0uVG9JbnQocFJ1bnRpbWUpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGFwcDo6ZmluZENvbXBvbmVudChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGFwcDo6cG9wVXBNZW51RXgoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgYXBwOjpmcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBhcHA6OnNldEludGVydmFsKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHBhcmFtcy5zaXplKCkgPiAyIHx8IHBhcmFtcy5zaXplKCkgPT0gMCkgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBDRlhfV2lkZVN0cmluZyBzY3JpcHQgPQotICAgICAgcGFyYW1zLnNpemUoKSA+IDAgPyBwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKSA6IEwiIjsKLSAgaWYgKHNjcmlwdC5Jc0VtcHR5KCkpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTQUZOVU1CRVJfS0VZU1RST0tFKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHVpbnQzMl90IGR3SW50ZXJ2YWwgPSBwYXJhbXMuc2l6ZSgpID4gMSA/IHBhcmFtc1sxXS5Ub0ludChwUnVudGltZSkgOiAxMDAwOwotCi0gIEdsb2JhbFRpbWVyKiB0aW1lclJlZiA9IG5ldyBHbG9iYWxUaW1lcih0aGlzLCBwUnVudGltZS0+R2V0Rm9ybUZpbGxFbnYoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW50aW1lLCAwLCBzY3JpcHQsIGR3SW50ZXJ2YWwsIDApOwotICBtX1RpbWVycy5pbnNlcnQoc3RkOjp1bmlxdWVfcHRyPEdsb2JhbFRpbWVyPih0aW1lclJlZikpOwotCi0gIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwUmV0T2JqID0KLSAgICAgIHBSdW50aW1lLT5OZXdGeER5bmFtaWNPYmooQ0pTX1RpbWVyT2JqOjpnX25PYmpEZWZuSUQpOwotICBpZiAocFJldE9iai5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENKU19UaW1lck9iaiogcEpTX1RpbWVyT2JqID0KLSAgICAgIHN0YXRpY19jYXN0PENKU19UaW1lck9iaio+KHBSdW50aW1lLT5HZXRPYmplY3RQcml2YXRlKHBSZXRPYmopKTsKLSAgVGltZXJPYmoqIHBUaW1lck9iaiA9IHN0YXRpY19jYXN0PFRpbWVyT2JqKj4ocEpTX1RpbWVyT2JqLT5HZXRFbWJlZE9iamVjdCgpKTsKLSAgcFRpbWVyT2JqLT5TZXRUaW1lcih0aW1lclJlZik7Ci0KLSAgdlJldCA9IENKU19WYWx1ZShwUnVudGltZSwgcFJldE9iaik7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGFwcDo6c2V0VGltZU91dChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmIChwYXJhbXMuc2l6ZSgpID4gMiB8fCBwYXJhbXMuc2l6ZSgpID09IDApIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgc2NyaXB0ID0gcGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSk7Ci0gIGlmIChzY3JpcHQuSXNFbXB0eSgpKSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU0FGTlVNQkVSX0tFWVNUUk9LRSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB1aW50MzJfdCBkd1RpbWVPdXQgPSBwYXJhbXMuc2l6ZSgpID4gMSA/IHBhcmFtc1sxXS5Ub0ludChwUnVudGltZSkgOiAxMDAwOwotICBHbG9iYWxUaW1lciogdGltZXJSZWYgPQotICAgICAgbmV3IEdsb2JhbFRpbWVyKHRoaXMsIHBSdW50aW1lLT5HZXRGb3JtRmlsbEVudigpLCBwUnVudGltZSwgMSwgc2NyaXB0LAotICAgICAgICAgICAgICAgICAgICAgIGR3VGltZU91dCwgZHdUaW1lT3V0KTsKLSAgbV9UaW1lcnMuaW5zZXJ0KHN0ZDo6dW5pcXVlX3B0cjxHbG9iYWxUaW1lcj4odGltZXJSZWYpKTsKLQotICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcFJldE9iaiA9Ci0gICAgICBwUnVudGltZS0+TmV3RnhEeW5hbWljT2JqKENKU19UaW1lck9iajo6Z19uT2JqRGVmbklEKTsKLSAgaWYgKHBSZXRPYmouSXNFbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDSlNfVGltZXJPYmoqIHBKU19UaW1lck9iaiA9Ci0gICAgICBzdGF0aWNfY2FzdDxDSlNfVGltZXJPYmoqPihwUnVudGltZS0+R2V0T2JqZWN0UHJpdmF0ZShwUmV0T2JqKSk7Ci0gIFRpbWVyT2JqKiBwVGltZXJPYmogPSBzdGF0aWNfY2FzdDxUaW1lck9iaio+KHBKU19UaW1lck9iai0+R2V0RW1iZWRPYmplY3QoKSk7Ci0gIHBUaW1lck9iai0+U2V0VGltZXIodGltZXJSZWYpOwotICB2UmV0ID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCBwUmV0T2JqKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgYXBwOjpjbGVhclRpbWVPdXQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGFwcDo6Q2xlYXJUaW1lckNvbW1vbihwUnVudGltZSwgcGFyYW1zWzBdKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgYXBwOjpjbGVhckludGVydmFsKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBhcHA6OkNsZWFyVGltZXJDb21tb24ocFJ1bnRpbWUsIHBhcmFtc1swXSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIGFwcDo6Q2xlYXJUaW1lckNvbW1vbihDSlNfUnVudGltZSogcFJ1bnRpbWUsIGNvbnN0IENKU19WYWx1ZSYgcGFyYW0pIHsKLSAgaWYgKHBhcmFtLkdldFR5cGUoKSAhPSBDSlNfVmFsdWU6OlZUX29iamVjdCkKLSAgICByZXR1cm47Ci0KLSAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmogPSBwYXJhbS5Ub1Y4T2JqZWN0KHBSdW50aW1lKTsKLSAgaWYgKENGWEpTX0VuZ2luZTo6R2V0T2JqRGVmbklEKHBPYmopICE9IENKU19UaW1lck9iajo6Z19uT2JqRGVmbklEKQotICAgIHJldHVybjsKLQotICBDSlNfT2JqZWN0KiBwSlNPYmogPSBwYXJhbS5Ub0NKU09iamVjdChwUnVudGltZSk7Ci0gIGlmICghcEpTT2JqKQotICAgIHJldHVybjsKLQotICBUaW1lck9iaiogcFRpbWVyT2JqID0gc3RhdGljX2Nhc3Q8VGltZXJPYmoqPihwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpOwotICBpZiAoIXBUaW1lck9iaikKLSAgICByZXR1cm47Ci0KLSAgR2xvYmFsVGltZXI6OkNhbmNlbChwVGltZXJPYmotPkdldFRpbWVySUQoKSk7Ci19Ci0KLWJvb2wgYXBwOjpleGVjTWVudUl0ZW0oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgYXBwOjpUaW1lclByb2MoR2xvYmFsVGltZXIqIHBUaW1lcikgewotICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBwVGltZXItPkdldFJ1bnRpbWUoKTsKLSAgaWYgKHBSdW50aW1lICYmICghcFRpbWVyLT5Jc09uZVNob3QoKSB8fCBwVGltZXItPkdldFRpbWVPdXQoKSA+IDApKQotICAgIFJ1bkpzU2NyaXB0KHBSdW50aW1lLCBwVGltZXItPkdldEpTY3JpcHQoKSk7Ci19Ci0KLXZvaWQgYXBwOjpDYW5jZWxQcm9jKEdsb2JhbFRpbWVyKiBwVGltZXIpIHsKLSAgbV9UaW1lcnMuZXJhc2UocGRmaXVtOjpGYWtlVW5pcXVlUHRyPEdsb2JhbFRpbWVyPihwVGltZXIpKTsKLX0KLQotdm9pZCBhcHA6OlJ1bkpzU2NyaXB0KENKU19SdW50aW1lKiBwUnVudGltZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU2NyaXB0KSB7Ci0gIGlmICghcFJ1bnRpbWUtPklzQmxvY2tpbmcoKSkgewotICAgIElKU19FdmVudENvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0V2ZW50Q29udGV4dCgpOwotICAgIHBDb250ZXh0LT5PbkV4dGVybmFsX0V4ZWMoKTsKLSAgICBDRlhfV2lkZVN0cmluZyB3dEluZm87Ci0gICAgcENvbnRleHQtPlJ1blNjcmlwdCh3c1NjcmlwdCwgJnd0SW5mbyk7Ci0gICAgcFJ1bnRpbWUtPlJlbGVhc2VFdmVudENvbnRleHQocENvbnRleHQpOwotICB9Ci19Ci0KLWJvb2wgYXBwOjpnb0JhY2soQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICAvLyBOb3Qgc3VwcG9ydGVkLgotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBhcHA6OmdvRm9yd2FyZChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIC8vIE5vdCBzdXBwb3J0ZWQuCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGFwcDo6bWFpbE1zZyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4gbmV3UGFyYW1zID0KLSAgICAgIEpTX0V4cGFuZEtleXdvcmRQYXJhbXMocFJ1bnRpbWUsIHBhcmFtcywgNiwgTCJiVUkiLCBMImNUbyIsIEwiY0NjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJjQmNjIiwgTCJjU3ViamVjdCIsIEwiY01zZyIpOwotCi0gIGlmIChuZXdQYXJhbXNbMF0uR2V0VHlwZSgpID09IENKU19WYWx1ZTo6VlRfdW5rbm93bikgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgYm9vbCBiVUkgPSBuZXdQYXJhbXNbMF0uVG9Cb29sKHBSdW50aW1lKTsKLQotICBDRlhfV2lkZVN0cmluZyBjVG87Ci0gIGlmIChuZXdQYXJhbXNbMV0uR2V0VHlwZSgpICE9IENKU19WYWx1ZTo6VlRfdW5rbm93bikgewotICAgIGNUbyA9IG5ld1BhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcocFJ1bnRpbWUpOwotICB9IGVsc2UgewotICAgIGlmICghYlVJKSB7Ci0gICAgICAvLyBjVG8gcGFyYW1ldGVyIHJlcXVpcmVkIHdoZW4gVUkgbm90IGludm9rZWQuCi0gICAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgY0NjOwotICBpZiAobmV3UGFyYW1zWzJdLkdldFR5cGUoKSAhPSBDSlNfVmFsdWU6OlZUX3Vua25vd24pCi0gICAgY0NjID0gbmV3UGFyYW1zWzJdLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgY0JjYzsKLSAgaWYgKG5ld1BhcmFtc1szXS5HZXRUeXBlKCkgIT0gQ0pTX1ZhbHVlOjpWVF91bmtub3duKQotICAgIGNCY2MgPSBuZXdQYXJhbXNbM10uVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKTsKLQotICBDRlhfV2lkZVN0cmluZyBjU3ViamVjdDsKLSAgaWYgKG5ld1BhcmFtc1s0XS5HZXRUeXBlKCkgIT0gQ0pTX1ZhbHVlOjpWVF91bmtub3duKQotICAgIGNTdWJqZWN0ID0gbmV3UGFyYW1zWzRdLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgY01zZzsKLSAgaWYgKG5ld1BhcmFtc1s1XS5HZXRUeXBlKCkgIT0gQ0pTX1ZhbHVlOjpWVF91bmtub3duKQotICAgIGNNc2cgPSBuZXdQYXJhbXNbNV0uVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKTsKLQotICBwUnVudGltZS0+QmVnaW5CbG9jaygpOwotICBwUnVudGltZS0+R2V0Rm9ybUZpbGxFbnYoKS0+SlNfZG9jbWFpbEZvcm0obnVsbHB0ciwgMCwgYlVJLCBjVG8uY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNTdWJqZWN0LmNfc3RyKCksIGNDYy5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY0JjYy5jX3N0cigpLCBjTXNnLmNfc3RyKCkpOwotICBwUnVudGltZS0+RW5kQmxvY2soKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgYXBwOjpsYXVuY2hVUkwoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGFwcDo6cnVudGltZUhpZ2hsaWdodChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHZwLklzU2V0dGluZygpKSB7Ci0gICAgdnAgPj4gbV9iUnVudGltZUhpZ2hMaWdodDsKLSAgfSBlbHNlIHsKLSAgICB2cCA8PCBtX2JSdW50aW1lSGlnaExpZ2h0OwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGFwcDo6ZnVsbHNjcmVlbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGFwcDo6cG9wVXBNZW51KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGFwcDo6YnJvd3NlRm9yRG9jKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICByZXR1cm4gdHJ1ZTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgYXBwOjpTeXNQYXRoVG9QREZQYXRoKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzT2xkUGF0aCkgewotICBDRlhfV2lkZVN0cmluZyBzUmV0ID0gTCIvIjsKLQotICBmb3IgKGludCBpID0gMCwgc3ogPSBzT2xkUGF0aC5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspIHsKLSAgICB3Y2hhcl90IGMgPSBzT2xkUGF0aC5HZXRBdChpKTsKLSAgICBpZiAoYyA9PSBMJzonKSB7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChjID09IEwnXFwnKSB7Ci0gICAgICAgIHNSZXQgKz0gTCIvIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNSZXQgKz0gYzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gc1JldDsKLX0KLQotYm9vbCBhcHA6Om5ld0RvYyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBhcHA6Om9wZW5Eb2MoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgYXBwOjpyZXNwb25zZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4gbmV3UGFyYW1zID0KLSAgICAgIEpTX0V4cGFuZEtleXdvcmRQYXJhbXMocFJ1bnRpbWUsIHBhcmFtcywgNSwgTCJjUXVlc3Rpb24iLCBMImNUaXRsZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiY0RlZmF1bHQiLCBMImJQYXNzd29yZCIsIEwiY0xhYmVsIik7Ci0KLSAgaWYgKG5ld1BhcmFtc1swXS5HZXRUeXBlKCkgPT0gQ0pTX1ZhbHVlOjpWVF91bmtub3duKSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBDRlhfV2lkZVN0cmluZyBzd1F1ZXN0aW9uID0gbmV3UGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgc3dUaXRsZSA9IEwiUERGIjsKLSAgaWYgKG5ld1BhcmFtc1sxXS5HZXRUeXBlKCkgIT0gQ0pTX1ZhbHVlOjpWVF91bmtub3duKQotICAgIHN3VGl0bGUgPSBuZXdQYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKTsKLQotICBDRlhfV2lkZVN0cmluZyBzd0RlZmF1bHQ7Ci0gIGlmIChuZXdQYXJhbXNbMl0uR2V0VHlwZSgpICE9IENKU19WYWx1ZTo6VlRfdW5rbm93bikKLSAgICBzd0RlZmF1bHQgPSBuZXdQYXJhbXNbMl0uVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKTsKLQotICBib29sIGJQYXNzd29yZCA9IGZhbHNlOwotICBpZiAobmV3UGFyYW1zWzNdLkdldFR5cGUoKSAhPSBDSlNfVmFsdWU6OlZUX3Vua25vd24pCi0gICAgYlBhc3N3b3JkID0gbmV3UGFyYW1zWzNdLlRvQm9vbChwUnVudGltZSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgc3dMYWJlbDsKLSAgaWYgKG5ld1BhcmFtc1s0XS5HZXRUeXBlKCkgIT0gQ0pTX1ZhbHVlOjpWVF91bmtub3duKQotICAgIHN3TGFiZWwgPSBuZXdQYXJhbXNbNF0uVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKTsKLQotICBjb25zdCBpbnQgTUFYX0lOUFVUX0JZVEVTID0gMjA0ODsKLSAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gcEJ1ZmYobmV3IGNoYXJbTUFYX0lOUFVUX0JZVEVTICsgMl0pOwotICBtZW1zZXQocEJ1ZmYuZ2V0KCksIDAsIE1BWF9JTlBVVF9CWVRFUyArIDIpOwotCi0gIGludCBuTGVuZ3RoQnl0ZXMgPSBwUnVudGltZS0+R2V0Rm9ybUZpbGxFbnYoKS0+SlNfYXBwUmVzcG9uc2UoCi0gICAgICBzd1F1ZXN0aW9uLmNfc3RyKCksIHN3VGl0bGUuY19zdHIoKSwgc3dEZWZhdWx0LmNfc3RyKCksIHN3TGFiZWwuY19zdHIoKSwKLSAgICAgIGJQYXNzd29yZCwgcEJ1ZmYuZ2V0KCksIE1BWF9JTlBVVF9CWVRFUyk7Ci0KLSAgaWYgKG5MZW5ndGhCeXRlcyA8IDAgfHwgbkxlbmd0aEJ5dGVzID4gTUFYX0lOUFVUX0JZVEVTKSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkcpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHZSZXQgPSBDSlNfVmFsdWUocFJ1bnRpbWUsIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGMTZMRSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QqPihwQnVmZi5nZXQoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuTGVuZ3RoQnl0ZXMgLyBzaXplb2YodWludDE2X3QpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNfc3RyKCkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGFwcDo6bWVkaWEoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIGFwcDo6ZXhlY0RpYWxvZyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9qYXZhc2NyaXB0L2FwcC5oIGIvZnBkZnNkay9qYXZhc2NyaXB0L2FwcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTExYjgyLi4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvamF2YXNjcmlwdC9hcHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19KQVZBU0NSSVBUX0FQUF9IXwotI2RlZmluZSBGUERGU0RLX0pBVkFTQ1JJUFRfQVBQX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgiCi0KLWNsYXNzIENKU19SdW50aW1lOwotY2xhc3MgR2xvYmFsVGltZXI7Ci0KLWNsYXNzIFRpbWVyT2JqIDogcHVibGljIENKU19FbWJlZE9iaiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBUaW1lck9iaihDSlNfT2JqZWN0KiBwSlNPYmplY3QpOwotICB+VGltZXJPYmooKSBvdmVycmlkZTsKLQotICB2b2lkIFNldFRpbWVyKEdsb2JhbFRpbWVyKiBwVGltZXIpOwotICBpbnQgR2V0VGltZXJJRCgpIGNvbnN0IHsgcmV0dXJuIG1fblRpbWVySUQ7IH0KLQotIHByaXZhdGU6Ci0gIGludCBtX25UaW1lcklEOyAgLy8gV2VhayByZWZlcmVuY2UgdG8gR2xvYmFsVGltZXIgdGhyb3VnaCBnbG9iYWwgbWFwLgotfTsKLQotY2xhc3MgQ0pTX1RpbWVyT2JqIDogcHVibGljIENKU19PYmplY3QgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0pTX1RpbWVyT2JqKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge30KLSAgfkNKU19UaW1lck9iaigpIG92ZXJyaWRlIHt9Ci0KLSAgREVDTEFSRV9KU19DTEFTUygpOwotfTsKLQotY2xhc3MgYXBwIDogcHVibGljIENKU19FbWJlZE9iaiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBhcHAoQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKLSAgfmFwcCgpIG92ZXJyaWRlOwotCi0gIGJvb2wgYWN0aXZlRG9jcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGNhbGN1bGF0ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBmb3Jtc1ZlcnNpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgZnMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgZnVsbHNjcmVlbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGxhbmd1YWdlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBtZWRpYShDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBwbGF0Zm9ybShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgcnVudGltZUhpZ2hsaWdodChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHZpZXdlclR5cGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCB2aWV3ZXJWYXJpYXRpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgdmlld2VyVmVyc2lvbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCi0gIGJvb2wgYWxlcnQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgYmVlcChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBicm93c2VGb3JEb2MoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgY2xlYXJJbnRlcnZhbChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBjbGVhclRpbWVPdXQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgZXhlY0RpYWxvZyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBleGVjTWVudUl0ZW0oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgZmluZENvbXBvbmVudChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBnb0JhY2soQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgZ29Gb3J3YXJkKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGxhdW5jaFVSTChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBtYWlsTXNnKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIG5ld0ZERihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBuZXdEb2MoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgb3BlbkRvYyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBvcGVuRkRGKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHBvcFVwTWVudUV4KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHBvcFVwTWVudShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCByZXNwb25zZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBzZXRJbnRlcnZhbChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBzZXRUaW1lT3V0KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCi0gIHZvaWQgVGltZXJQcm9jKEdsb2JhbFRpbWVyKiBwVGltZXIpOwotICB2b2lkIENhbmNlbFByb2MoR2xvYmFsVGltZXIqIHBUaW1lcik7Ci0KLSAgc3RhdGljIENGWF9XaWRlU3RyaW5nIFN5c1BhdGhUb1BERlBhdGgoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNPbGRQYXRoKTsKLQotIHByaXZhdGU6Ci0gIC8vIENKU19FbWJlZE9iagotICB2b2lkIFJ1bkpzU2NyaXB0KENKU19SdW50aW1lKiBwUnVudGltZSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU2NyaXB0KTsKLQotICB2b2lkIENsZWFyVGltZXJDb21tb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBjb25zdCBDSlNfVmFsdWUmIHBhcmFtKTsKLQotICBib29sIG1fYkNhbGN1bGF0ZTsKLSAgYm9vbCBtX2JSdW50aW1lSGlnaExpZ2h0OwotICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjp1bmlxdWVfcHRyPEdsb2JhbFRpbWVyPj4gbV9UaW1lcnM7Ci19OwotCi1jbGFzcyBDSlNfQXBwIDogcHVibGljIENKU19PYmplY3QgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0pTX0FwcCh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9Ci0gIH5DSlNfQXBwKCkgb3ZlcnJpZGUge30KLQotICBERUNMQVJFX0pTX0NMQVNTKCk7Ci0KLSAgSlNfU1RBVElDX1BST1AoYWN0aXZlRG9jcywgYXBwKTsKLSAgSlNfU1RBVElDX1BST1AoY2FsY3VsYXRlLCBhcHApOwotICBKU19TVEFUSUNfUFJPUChmb3Jtc1ZlcnNpb24sIGFwcCk7Ci0gIEpTX1NUQVRJQ19QUk9QKGZzLCBhcHApOwotICBKU19TVEFUSUNfUFJPUChmdWxsc2NyZWVuLCBhcHApOwotICBKU19TVEFUSUNfUFJPUChsYW5ndWFnZSwgYXBwKTsKLSAgSlNfU1RBVElDX1BST1AobWVkaWEsIGFwcCk7Ci0gIEpTX1NUQVRJQ19QUk9QKHBsYXRmb3JtLCBhcHApOwotICBKU19TVEFUSUNfUFJPUChydW50aW1lSGlnaGxpZ2h0LCBhcHApOwotICBKU19TVEFUSUNfUFJPUCh2aWV3ZXJUeXBlLCBhcHApOwotICBKU19TVEFUSUNfUFJPUCh2aWV3ZXJWYXJpYXRpb24sIGFwcCk7Ci0gIEpTX1NUQVRJQ19QUk9QKHZpZXdlclZlcnNpb24sIGFwcCk7Ci0KLSAgSlNfU1RBVElDX01FVEhPRChhbGVydCwgYXBwKTsKLSAgSlNfU1RBVElDX01FVEhPRChiZWVwLCBhcHApOwotICBKU19TVEFUSUNfTUVUSE9EKGJyb3dzZUZvckRvYywgYXBwKTsKLSAgSlNfU1RBVElDX01FVEhPRChjbGVhckludGVydmFsLCBhcHApOwotICBKU19TVEFUSUNfTUVUSE9EKGNsZWFyVGltZU91dCwgYXBwKTsKLSAgSlNfU1RBVElDX01FVEhPRChleGVjRGlhbG9nLCBhcHApOwotICBKU19TVEFUSUNfTUVUSE9EKGV4ZWNNZW51SXRlbSwgYXBwKTsKLSAgSlNfU1RBVElDX01FVEhPRChmaW5kQ29tcG9uZW50LCBhcHApOwotICBKU19TVEFUSUNfTUVUSE9EKGdvQmFjaywgYXBwKTsKLSAgSlNfU1RBVElDX01FVEhPRChnb0ZvcndhcmQsIGFwcCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QobGF1bmNoVVJMLCBhcHApOwotICBKU19TVEFUSUNfTUVUSE9EKG1haWxNc2csIGFwcCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QobmV3RkRGLCBhcHApOwotICBKU19TVEFUSUNfTUVUSE9EKG5ld0RvYywgYXBwKTsKLSAgSlNfU1RBVElDX01FVEhPRChvcGVuRG9jLCBhcHApOwotICBKU19TVEFUSUNfTUVUSE9EKG9wZW5GREYsIGFwcCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QocG9wVXBNZW51RXgsIGFwcCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QocG9wVXBNZW51LCBhcHApOwotICBKU19TVEFUSUNfTUVUSE9EKHJlc3BvbnNlLCBhcHApOwotICBKU19TVEFUSUNfTUVUSE9EKHNldEludGVydmFsLCBhcHApOwotICBKU19TVEFUSUNfTUVUSE9EKHNldFRpbWVPdXQsIGFwcCk7Ci19OwotCi0jZW5kaWYgIC8vIEZQREZTREtfSkFWQVNDUklQVF9BUFBfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvamF2YXNjcmlwdC9janNfZXZlbnRfY29udGV4dC5jcHAgYi9mcGRmc2RrL2phdmFzY3JpcHQvY2pzX2V2ZW50X2NvbnRleHQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmZiNmRhLi4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvamF2YXNjcmlwdC9janNfZXZlbnRfY29udGV4dC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyODAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L2Nqc19ldmVudF9jb250ZXh0LmgiCi0KLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L2Nqc19ydW50aW1lLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L3Jlc291cmNlLmgiCi0KLUNKU19FdmVudENvbnRleHQ6OkNKU19FdmVudENvbnRleHQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKQotICAgIDogbV9wUnVudGltZShwUnVudGltZSksCi0gICAgICBtX3BFdmVudEhhbmRsZXIobmV3IENKU19FdmVudEhhbmRsZXIodGhpcykpLAotICAgICAgbV9iQnVzeShmYWxzZSkgewotICBBU1NFUlQocFJ1bnRpbWUpOwotfQotCi1DSlNfRXZlbnRDb250ZXh0Ojp+Q0pTX0V2ZW50Q29udGV4dCgpIHt9Ci0KLUNQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogQ0pTX0V2ZW50Q29udGV4dDo6R2V0Rm9ybUZpbGxFbnYoKSB7Ci0gIHJldHVybiBtX3BSdW50aW1lLT5HZXRGb3JtRmlsbEVudigpOwotfQotCi1ib29sIENKU19FdmVudENvbnRleHQ6OlJ1blNjcmlwdChjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcqIGluZm8pIHsKLSAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUobV9wUnVudGltZS0+R2V0SXNvbGF0ZSgpKTsKLSAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShtX3BSdW50aW1lLT5HZXRJc29sYXRlKCkpOwotICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBtX3BSdW50aW1lLT5OZXdMb2NhbENvbnRleHQoKTsKLSAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRfc2NvcGUoY29udGV4dCk7Ci0KLSAgaWYgKG1fYkJ1c3kpIHsKLSAgICAqaW5mbyA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNCVVNZKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBDRlhfQXV0b1Jlc3RvcmVyPGJvb2w+IHJlc3RvcmVyKCZtX2JCdXN5KTsKLSAgbV9iQnVzeSA9IHRydWU7Ci0KLSAgQVNTRVJUKG1fcEV2ZW50SGFuZGxlci0+SXNWYWxpZCgpKTsKLSAgQ0pTX1J1bnRpbWU6OkZpZWxkRXZlbnQgZXZlbnQobV9wRXZlbnRIYW5kbGVyLT5UYXJnZXROYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEV2ZW50SGFuZGxlci0+RXZlbnRUeXBlKCkpOwotICBpZiAoIW1fcFJ1bnRpbWUtPkFkZEV2ZW50VG9TZXQoZXZlbnQpKSB7Ci0gICAgKmluZm8gPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTRVZFTlQpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIENGWF9XaWRlU3RyaW5nIHNFcnJvck1lc3NhZ2U7Ci0gIGludCBuUmV0ID0gMDsKLSAgaWYgKHNjcmlwdC5HZXRMZW5ndGgoKSA+IDApCi0gICAgblJldCA9IG1fcFJ1bnRpbWUtPkV4ZWN1dGVTY3JpcHQoc2NyaXB0LmNfc3RyKCksICZzRXJyb3JNZXNzYWdlKTsKLQotICBpZiAoblJldCA8IDApCi0gICAgKmluZm8gKz0gc0Vycm9yTWVzc2FnZTsKLSAgZWxzZQotICAgICppbmZvID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19SVU4pOwotCi0gIG1fcFJ1bnRpbWUtPlJlbW92ZUV2ZW50RnJvbVNldChldmVudCk7Ci0gIG1fcEV2ZW50SGFuZGxlci0+RGVzdHJveSgpOwotICByZXR1cm4gblJldCA+PSAwOwotfQotCi12b2lkIENKU19FdmVudENvbnRleHQ6Ok9uQXBwX0luaXQoKSB7Ci0gIG1fcEV2ZW50SGFuZGxlci0+T25BcHBfSW5pdCgpOwotfQotCi12b2lkIENKU19FdmVudENvbnRleHQ6Ok9uRG9jX09wZW4oQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0clRhcmdldE5hbWUpIHsKLSAgbV9wRXZlbnRIYW5kbGVyLT5PbkRvY19PcGVuKHBGb3JtRmlsbEVudiwgc3RyVGFyZ2V0TmFtZSk7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25Eb2NfV2lsbFByaW50KAotICAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSB7Ci0gIG1fcEV2ZW50SGFuZGxlci0+T25Eb2NfV2lsbFByaW50KHBGb3JtRmlsbEVudik7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25Eb2NfRGlkUHJpbnQoCi0gICAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIHsKLSAgbV9wRXZlbnRIYW5kbGVyLT5PbkRvY19EaWRQcmludChwRm9ybUZpbGxFbnYpOwotfQotCi12b2lkIENKU19FdmVudENvbnRleHQ6Ok9uRG9jX1dpbGxTYXZlKAotICAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSB7Ci0gIG1fcEV2ZW50SGFuZGxlci0+T25Eb2NfV2lsbFNhdmUocEZvcm1GaWxsRW52KTsKLX0KLQotdm9pZCBDSlNfRXZlbnRDb250ZXh0OjpPbkRvY19EaWRTYXZlKAotICAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSB7Ci0gIG1fcEV2ZW50SGFuZGxlci0+T25Eb2NfRGlkU2F2ZShwRm9ybUZpbGxFbnYpOwotfQotCi12b2lkIENKU19FdmVudENvbnRleHQ6Ok9uRG9jX1dpbGxDbG9zZSgKLSAgICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgewotICBtX3BFdmVudEhhbmRsZXItPk9uRG9jX1dpbGxDbG9zZShwRm9ybUZpbGxFbnYpOwotfQotCi12b2lkIENKU19FdmVudENvbnRleHQ6Ok9uUGFnZV9PcGVuKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSB7Ci0gIG1fcEV2ZW50SGFuZGxlci0+T25QYWdlX09wZW4ocEZvcm1GaWxsRW52KTsKLX0KLQotdm9pZCBDSlNfRXZlbnRDb250ZXh0OjpPblBhZ2VfQ2xvc2UoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIHsKLSAgbV9wRXZlbnRIYW5kbGVyLT5PblBhZ2VfQ2xvc2UocEZvcm1GaWxsRW52KTsKLX0KLQotdm9pZCBDSlNfRXZlbnRDb250ZXh0OjpPblBhZ2VfSW5WaWV3KAotICAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSB7Ci0gIG1fcEV2ZW50SGFuZGxlci0+T25QYWdlX0luVmlldyhwRm9ybUZpbGxFbnYpOwotfQotCi12b2lkIENKU19FdmVudENvbnRleHQ6Ok9uUGFnZV9PdXRWaWV3KAotICAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSB7Ci0gIG1fcEV2ZW50SGFuZGxlci0+T25QYWdlX091dFZpZXcocEZvcm1GaWxsRW52KTsKLX0KLQotdm9pZCBDSlNfRXZlbnRDb250ZXh0OjpPbkZpZWxkX01vdXNlRG93bihib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSB7Ci0gIG1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9Nb3VzZURvd24oYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQpOwotfQotCi12b2lkIENKU19FdmVudENvbnRleHQ6Ok9uRmllbGRfTW91c2VFbnRlcihib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpIHsKLSAgbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX01vdXNlRW50ZXIoYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQpOwotfQotCi12b2lkIENKU19FdmVudENvbnRleHQ6Ok9uRmllbGRfTW91c2VFeGl0KGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpIHsKLSAgbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX01vdXNlRXhpdChiTW9kaWZpZXIsIGJTaGlmdCwgcFRhcmdldCk7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25GaWVsZF9Nb3VzZVVwKGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgewotICBtX3BFdmVudEhhbmRsZXItPk9uRmllbGRfTW91c2VVcChiTW9kaWZpZXIsIGJTaGlmdCwgcFRhcmdldCk7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25GaWVsZF9Gb2N1cyhib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpIHsKLSAgbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX0ZvY3VzKGJNb2RpZmllciwgYlNoaWZ0LCBwVGFyZ2V0LCBWYWx1ZSk7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25GaWVsZF9CbHVyKGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBWYWx1ZSkgewotICBtX3BFdmVudEhhbmRsZXItPk9uRmllbGRfQmx1cihiTW9kaWZpZXIsIGJTaGlmdCwgcFRhcmdldCwgVmFsdWUpOwotfQotCi12b2lkIENKU19FdmVudENvbnRleHQ6Ok9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiUmMpIHsKLSAgbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX0NhbGN1bGF0ZShwU291cmNlLCBwVGFyZ2V0LCBWYWx1ZSwgYlJjKTsKLX0KLQotdm9pZCBDSlNfRXZlbnRDb250ZXh0OjpPbkZpZWxkX0Zvcm1hdChDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJXaWxsQ29tbWl0KSB7Ci0gIG1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9Gb3JtYXQocFRhcmdldCwgVmFsdWUsIGJXaWxsQ29tbWl0KTsKLX0KLQotdm9pZCBDSlNfRXZlbnRDb250ZXh0OjpPbkZpZWxkX0tleXN0cm9rZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYktleURvd24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5TZWxFbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgblNlbFN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiV2lsbENvbW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmllbGRGdWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiUmMpIHsKLSAgbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX0tleXN0cm9rZSgKLSAgICAgIHN0ckNoYW5nZSwgc3RyQ2hhbmdlRXgsIGJLZXlEb3duLCBiTW9kaWZpZXIsIG5TZWxFbmQsIG5TZWxTdGFydCwgYlNoaWZ0LAotICAgICAgcFRhcmdldCwgVmFsdWUsIGJXaWxsQ29tbWl0LCBiRmllbGRGdWxsLCBiUmMpOwotfQotCi12b2lkIENKU19FdmVudENvbnRleHQ6Ok9uRmllbGRfVmFsaWRhdGUoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiS2V5RG93biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYlJjKSB7Ci0gIG1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9WYWxpZGF0ZShzdHJDaGFuZ2UsIHN0ckNoYW5nZUV4LCBiS2V5RG93biwgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNoaWZ0LCBwVGFyZ2V0LCBWYWx1ZSwgYlJjKTsKLX0KLQotdm9pZCBDSlNfRXZlbnRDb250ZXh0OjpPblNjcmVlbl9Gb2N1cyhib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKLSAgbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9Gb2N1cyhiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25TY3JlZW5fQmx1cihib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7Ci0gIG1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fQmx1cihiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25TY3JlZW5fT3Blbihib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7Ci0gIG1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fT3BlbihiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25TY3JlZW5fQ2xvc2UoYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7Ci0gIG1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fQ2xvc2UoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwotfQotCi12b2lkIENKU19FdmVudENvbnRleHQ6Ok9uU2NyZWVuX01vdXNlRG93bihib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgewotICBtX3BFdmVudEhhbmRsZXItPk9uU2NyZWVuX01vdXNlRG93bihiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25TY3JlZW5fTW91c2VVcChib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7Ci0gIG1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fTW91c2VVcChiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25TY3JlZW5fTW91c2VFbnRlcihib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7Ci0gIG1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fTW91c2VFbnRlcihiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25TY3JlZW5fTW91c2VFeGl0KGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7Ci0gIG1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fTW91c2VFeGl0KGJNb2RpZmllciwgYlNoaWZ0LCBwU2NyZWVuKTsKLX0KLQotdm9pZCBDSlNfRXZlbnRDb250ZXh0OjpPblNjcmVlbl9JblZpZXcoYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKLSAgbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9JblZpZXcoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwotfQotCi12b2lkIENKU19FdmVudENvbnRleHQ6Ok9uU2NyZWVuX091dFZpZXcoYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgewotICBtX3BFdmVudEhhbmRsZXItPk9uU2NyZWVuX091dFZpZXcoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOwotfQotCi12b2lkIENKU19FdmVudENvbnRleHQ6Ok9uQm9va21hcmtfTW91c2VVcChDUERGX0Jvb2ttYXJrKiBwQm9va01hcmspIHsKLSAgbV9wRXZlbnRIYW5kbGVyLT5PbkJvb2ttYXJrX01vdXNlVXAocEJvb2tNYXJrKTsKLX0KLQotdm9pZCBDSlNfRXZlbnRDb250ZXh0OjpPbkxpbmtfTW91c2VVcCgKLSAgICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgewotICBtX3BFdmVudEhhbmRsZXItPk9uTGlua19Nb3VzZVVwKHBGb3JtRmlsbEVudik7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25Db25zb2xlX0V4ZWMoKSB7Ci0gIG1fcEV2ZW50SGFuZGxlci0+T25Db25zb2xlX0V4ZWMoKTsKLX0KLQotdm9pZCBDSlNfRXZlbnRDb250ZXh0OjpPbkV4dGVybmFsX0V4ZWMoKSB7Ci0gIG1fcEV2ZW50SGFuZGxlci0+T25FeHRlcm5hbF9FeGVjKCk7Ci19Ci0KLXZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25CYXRjaEV4ZWMoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIHsKLSAgbV9wRXZlbnRIYW5kbGVyLT5PbkJhdGNoRXhlYyhwRm9ybUZpbGxFbnYpOwotfQotCi12b2lkIENKU19FdmVudENvbnRleHQ6Ok9uTWVudV9FeGVjKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyVGFyZ2V0TmFtZSkgewotICBtX3BFdmVudEhhbmRsZXItPk9uTWVudV9FeGVjKHBGb3JtRmlsbEVudiwgc3RyVGFyZ2V0TmFtZSk7Ci19CmRpZmYgLS1naXQgYS9mcGRmc2RrL2phdmFzY3JpcHQvY2pzX2V2ZW50X2NvbnRleHQuaCBiL2ZwZGZzZGsvamF2YXNjcmlwdC9janNfZXZlbnRfY29udGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmZlNTI4Li4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvamF2YXNjcmlwdC9janNfZXZlbnRfY29udGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGUERGU0RLX0pBVkFTQ1JJUFRfQ0pTX0VWRU5UX0NPTlRFWFRfSF8KLSNkZWZpbmUgRlBERlNES19KQVZBU0NSSVBUX0NKU19FVkVOVF9DT05URVhUX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L2lqc19ldmVudF9jb250ZXh0LmgiCi0KLWNsYXNzIENKU19FdmVudEhhbmRsZXI7Ci1jbGFzcyBDSlNfUnVudGltZTsKLWNsYXNzIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDsKLQotY2xhc3MgQ0pTX0V2ZW50Q29udGV4dCA6IHB1YmxpYyBJSlNfRXZlbnRDb250ZXh0IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENKU19FdmVudENvbnRleHQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKLSAgfkNKU19FdmVudENvbnRleHQoKSBvdmVycmlkZTsKLQotICAvLyBJSlNfRXZlbnRDb250ZXh0Ci0gIGJvb2wgUnVuU2NyaXB0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIENGWF9XaWRlU3RyaW5nKiBpbmZvKSBvdmVycmlkZTsKLSAgdm9pZCBPbkFwcF9Jbml0KCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25Eb2NfT3BlbihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJUYXJnZXROYW1lKSBvdmVycmlkZTsKLSAgdm9pZCBPbkRvY19XaWxsUHJpbnQoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIG92ZXJyaWRlOwotICB2b2lkIE9uRG9jX0RpZFByaW50KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSBvdmVycmlkZTsKLSAgdm9pZCBPbkRvY19XaWxsU2F2ZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgb3ZlcnJpZGU7Ci0gIHZvaWQgT25Eb2NfRGlkU2F2ZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgb3ZlcnJpZGU7Ci0gIHZvaWQgT25Eb2NfV2lsbENsb3NlKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSBvdmVycmlkZTsKLSAgdm9pZCBPblBhZ2VfT3BlbihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgb3ZlcnJpZGU7Ci0gIHZvaWQgT25QYWdlX0Nsb3NlKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSBvdmVycmlkZTsKLSAgdm9pZCBPblBhZ2VfSW5WaWV3KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSBvdmVycmlkZTsKLSAgdm9pZCBPblBhZ2VfT3V0VmlldyhDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgb3ZlcnJpZGU7Ci0gIHZvaWQgT25GaWVsZF9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpIG92ZXJyaWRlOwotICB2b2lkIE9uRmllbGRfTW91c2VFbnRlcihib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSBvdmVycmlkZTsKLSAgdm9pZCBPbkZpZWxkX01vdXNlRXhpdChib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25GaWVsZF9Nb3VzZVVwKGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpIG92ZXJyaWRlOwotICB2b2lkIE9uRmllbGRfRm9jdXMoYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKSBvdmVycmlkZTsKLSAgdm9pZCBPbkZpZWxkX0JsdXIoYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlKSBvdmVycmlkZTsKLSAgdm9pZCBPbkZpZWxkX0NhbGN1bGF0ZShDUERGX0Zvcm1GaWVsZCogcFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYlJjKSBvdmVycmlkZTsKLSAgdm9pZCBPbkZpZWxkX0Zvcm1hdChDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCBiV2lsbENvbW1pdCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25GaWVsZF9LZXlzdHJva2UoQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiS2V5RG93biwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5TZWxFbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2VsU3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYldpbGxDb21taXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmllbGRGdWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJSYykgb3ZlcnJpZGU7Ci0gIHZvaWQgT25GaWVsZF9WYWxpZGF0ZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiS2V5RG93biwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJSYykgb3ZlcnJpZGU7Ci0gIHZvaWQgT25TY3JlZW5fRm9jdXMoYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgb3ZlcnJpZGU7Ci0gIHZvaWQgT25TY3JlZW5fQmx1cihib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgb3ZlcnJpZGU7Ci0gIHZvaWQgT25TY3JlZW5fT3Blbihib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgb3ZlcnJpZGU7Ci0gIHZvaWQgT25TY3JlZW5fQ2xvc2UoYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgb3ZlcnJpZGU7Ci0gIHZvaWQgT25TY3JlZW5fTW91c2VEb3duKGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgb3ZlcnJpZGU7Ci0gIHZvaWQgT25TY3JlZW5fTW91c2VVcChib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgb3ZlcnJpZGU7Ci0gIHZvaWQgT25TY3JlZW5fTW91c2VFbnRlcihib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgb3ZlcnJpZGU7Ci0gIHZvaWQgT25TY3JlZW5fTW91c2VFeGl0KGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgb3ZlcnJpZGU7Ci0gIHZvaWQgT25TY3JlZW5fSW5WaWV3KGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgb3ZlcnJpZGU7Ci0gIHZvaWQgT25TY3JlZW5fT3V0Vmlldyhib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgb3ZlcnJpZGU7Ci0gIHZvaWQgT25Cb29rbWFya19Nb3VzZVVwKENQREZfQm9va21hcmsqIHBCb29rTWFyaykgb3ZlcnJpZGU7Ci0gIHZvaWQgT25MaW5rX01vdXNlVXAoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIG92ZXJyaWRlOwotICB2b2lkIE9uTWVudV9FeGVjKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJUYXJnZXROYW1lKSBvdmVycmlkZTsKLSAgdm9pZCBPbkJhdGNoRXhlYyhDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgb3ZlcnJpZGU7Ci0gIHZvaWQgT25Db25zb2xlX0V4ZWMoKSBvdmVycmlkZTsKLSAgdm9pZCBPbkV4dGVybmFsX0V4ZWMoKSBvdmVycmlkZTsKLQotICBDSlNfUnVudGltZSogR2V0SlNSdW50aW1lKCkgY29uc3QgeyByZXR1cm4gbV9wUnVudGltZTsgfQotICBDSlNfRXZlbnRIYW5kbGVyKiBHZXRFdmVudEhhbmRsZXIoKSBjb25zdCB7IHJldHVybiBtX3BFdmVudEhhbmRsZXIuZ2V0KCk7IH0KLQotICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIEdldEZvcm1GaWxsRW52KCk7Ci0KLSBwcml2YXRlOgotICBDSlNfUnVudGltZSogY29uc3QgbV9wUnVudGltZTsKLSAgc3RkOjp1bmlxdWVfcHRyPENKU19FdmVudEhhbmRsZXI+IG1fcEV2ZW50SGFuZGxlcjsKLSAgYm9vbCBtX2JCdXN5OwotfTsKLQotI2VuZGlmICAvLyBGUERGU0RLX0pBVkFTQ1JJUFRfQ0pTX0VWRU5UX0NPTlRFWFRfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvamF2YXNjcmlwdC9janNfcnVudGltZS5jcHAgYi9mcGRmc2RrL2phdmFzY3JpcHQvY2pzX3J1bnRpbWUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWNlMGI2Li4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvamF2YXNjcmlwdC9janNfcnVudGltZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L2Nqc19ydW50aW1lLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfZm9ybWZpbGxlbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9Bbm5vdC5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9Db25zdHMuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvRmllbGQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSWNvbi5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19EZWZpbmUuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX0dsb2JhbERhdGEuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvYXBwLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L2Nqc19ldmVudF9jb250ZXh0LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L2NvbG9yLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L2NvbnNvbGUuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvZXZlbnQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvZ2xvYmFsLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L3JlcG9ydC5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC91dGlsLmgiCi0jaW5jbHVkZSAicHVibGljL2ZwZGZfZm9ybWZpbGwuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCi0KLSNpZmRlZiBQREZfRU5BQkxFX1hGQQotI2luY2x1ZGUgImZ4anMvY2Z4anNlX3ZhbHVlLmgiCi0jZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCi0KLS8vIHN0YXRpYwotdm9pZCBJSlNfUnVudGltZTo6SW5pdGlhbGl6ZSh1bnNpZ25lZCBpbnQgc2xvdCwgdm9pZCogaXNvbGF0ZSkgewotICBGWEpTX0luaXRpYWxpemUoc2xvdCwgcmVpbnRlcnByZXRfY2FzdDx2ODo6SXNvbGF0ZSo+KGlzb2xhdGUpKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIElKU19SdW50aW1lOjpEZXN0cm95KCkgewotICBGWEpTX1JlbGVhc2UoKTsKLX0KLQotLy8gc3RhdGljCi1JSlNfUnVudGltZSogSUpTX1J1bnRpbWU6OkNyZWF0ZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgewotICByZXR1cm4gbmV3IENKU19SdW50aW1lKHBGb3JtRmlsbEVudik7Ci19Ci0KLS8vIHN0YXRpYwotQ0pTX1J1bnRpbWUqIENKU19SdW50aW1lOjpDdXJyZW50UnVudGltZUZyb21Jc29sYXRlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0pTX1J1bnRpbWUqPigKLSAgICAgIENGWEpTX0VuZ2luZTo6Q3VycmVudEVuZ2luZUZyb21Jc29sYXRlKHBJc29sYXRlKSk7Ci19Ci0KLUNKU19SdW50aW1lOjpDSlNfUnVudGltZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikKLSAgICA6IG1fcEZvcm1GaWxsRW52KHBGb3JtRmlsbEVudiksCi0gICAgICBtX2JCbG9ja2luZyhmYWxzZSksCi0gICAgICBtX2lzb2xhdGVNYW5hZ2VkKGZhbHNlKSB7Ci0gIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IG51bGxwdHI7Ci0KLSAgSVBERl9KU1BMQVRGT1JNKiBwUGxhdGZvcm0gPSBtX3BGb3JtRmlsbEVudi0+R2V0Rm9ybUZpbGxJbmZvKCktPm1fcEpzUGxhdGZvcm07Ci0gIGlmIChwUGxhdGZvcm0tPnZlcnNpb24gPD0gMikgewotICAgIHVuc2lnbmVkIGludCBlbWJlZGRlckRhdGFTbG90ID0gMDsKLSAgICB2ODo6SXNvbGF0ZSogcEV4dGVybmFsSXNvbGF0ZSA9IG51bGxwdHI7Ci0gICAgaWYgKHBQbGF0Zm9ybS0+dmVyc2lvbiA9PSAyKSB7Ci0gICAgICBwRXh0ZXJuYWxJc29sYXRlID0gcmVpbnRlcnByZXRfY2FzdDx2ODo6SXNvbGF0ZSo+KHBQbGF0Zm9ybS0+bV9pc29sYXRlKTsKLSAgICAgIGVtYmVkZGVyRGF0YVNsb3QgPSBwUGxhdGZvcm0tPm1fdjhFbWJlZGRlclNsb3Q7Ci0gICAgfQotICAgIEZYSlNfSW5pdGlhbGl6ZShlbWJlZGRlckRhdGFTbG90LCBwRXh0ZXJuYWxJc29sYXRlKTsKLSAgfQotICBtX2lzb2xhdGVNYW5hZ2VkID0gRlhKU19HZXRJc29sYXRlKCZwSXNvbGF0ZSk7Ci0gIFNldElzb2xhdGUocElzb2xhdGUpOwotCi0jaWZkZWYgUERGX0VOQUJMRV9YRkEKLSAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUocElzb2xhdGUpOwotICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKHBJc29sYXRlKTsKLSNlbmRpZgotCi0gIGlmIChtX2lzb2xhdGVNYW5hZ2VkIHx8IEZYSlNfR2xvYmFsSXNvbGF0ZVJlZkNvdW50KCkgPT0gMCkKLSAgICBEZWZpbmVKU09iamVjdHMoKTsKLQotICBJSlNfRXZlbnRDb250ZXh0KiBwQ29udGV4dCA9IE5ld0V2ZW50Q29udGV4dCgpOwotICBJbml0aWFsaXplRW5naW5lKCk7Ci0gIFJlbGVhc2VFdmVudENvbnRleHQocENvbnRleHQpOwotICBTZXRGb3JtRmlsbEVudlRvRG9jdW1lbnQoKTsKLX0KLQotQ0pTX1J1bnRpbWU6On5DSlNfUnVudGltZSgpIHsKLSAgTm90aWZ5T2JzZXJ2ZWRQdHJzKCk7Ci0gIFJlbGVhc2VFbmdpbmUoKTsKLSAgaWYgKG1faXNvbGF0ZU1hbmFnZWQpIHsKLSAgICBHZXRJc29sYXRlKCktPkRpc3Bvc2UoKTsKLSAgICBTZXRJc29sYXRlKG51bGxwdHIpOwotICB9Ci19Ci0KLXZvaWQgQ0pTX1J1bnRpbWU6OkRlZmluZUpTT2JqZWN0cygpIHsKLSAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoR2V0SXNvbGF0ZSgpKTsKLSAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShHZXRJc29sYXRlKCkpOwotICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB2ODo6Q29udGV4dDo6TmV3KEdldElzb2xhdGUoKSk7Ci0gIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKGNvbnRleHQpOwotCi0gIC8vIFRoZSBjYWxsIG9yZGVyIGRldGVybWluZXMgdGhlICJPYmpEZWZJRCIgYXNzaWduZWQgdG8gZWFjaCBjbGFzcy4KLSAgLy8gT2JqRGVmSURzIDAgLSAyCi0gIENKU19Cb3JkZXI6OkRlZmluZUpTT2JqZWN0cyh0aGlzLCBGWEpTT0JKVFlQRV9TVEFUSUMpOwotICBDSlNfRGlzcGxheTo6RGVmaW5lSlNPYmplY3RzKHRoaXMsIEZYSlNPQkpUWVBFX1NUQVRJQyk7Ci0gIENKU19Gb250OjpEZWZpbmVKU09iamVjdHModGhpcywgRlhKU09CSlRZUEVfU1RBVElDKTsKLQotICAvLyBPYmpEZWZJRHMgMyAtIDUKLSAgQ0pTX0hpZ2hsaWdodDo6RGVmaW5lSlNPYmplY3RzKHRoaXMsIEZYSlNPQkpUWVBFX1NUQVRJQyk7Ci0gIENKU19Qb3NpdGlvbjo6RGVmaW5lSlNPYmplY3RzKHRoaXMsIEZYSlNPQkpUWVBFX1NUQVRJQyk7Ci0gIENKU19TY2FsZUhvdzo6RGVmaW5lSlNPYmplY3RzKHRoaXMsIEZYSlNPQkpUWVBFX1NUQVRJQyk7Ci0KLSAgLy8gT2JqRGVmSURzIDYgLSA4Ci0gIENKU19TY2FsZVdoZW46OkRlZmluZUpTT2JqZWN0cyh0aGlzLCBGWEpTT0JKVFlQRV9TVEFUSUMpOwotICBDSlNfU3R5bGU6OkRlZmluZUpTT2JqZWN0cyh0aGlzLCBGWEpTT0JKVFlQRV9TVEFUSUMpOwotICBDSlNfWm9vbXR5cGU6OkRlZmluZUpTT2JqZWN0cyh0aGlzLCBGWEpTT0JKVFlQRV9TVEFUSUMpOwotCi0gIC8vIE9iakRlZklEcyA5IC0gMTEKLSAgQ0pTX0FwcDo6RGVmaW5lSlNPYmplY3RzKHRoaXMsIEZYSlNPQkpUWVBFX1NUQVRJQyk7Ci0gIENKU19Db2xvcjo6RGVmaW5lSlNPYmplY3RzKHRoaXMsIEZYSlNPQkpUWVBFX1NUQVRJQyk7Ci0gIENKU19Db25zb2xlOjpEZWZpbmVKU09iamVjdHModGhpcywgRlhKU09CSlRZUEVfU1RBVElDKTsKLQotICAvLyBPYmpEZWZJRHMgMTIgLSAxNAotICBDSlNfRG9jdW1lbnQ6OkRlZmluZUpTT2JqZWN0cyh0aGlzLCBGWEpTT0JKVFlQRV9HTE9CQUwpOwotICBDSlNfRXZlbnQ6OkRlZmluZUpTT2JqZWN0cyh0aGlzLCBGWEpTT0JKVFlQRV9TVEFUSUMpOwotICBDSlNfRmllbGQ6OkRlZmluZUpTT2JqZWN0cyh0aGlzLCBGWEpTT0JKVFlQRV9EWU5BTUlDKTsKLQotICAvLyBPYmpEZWZJRHMgMTUgLSAxNwotICBDSlNfR2xvYmFsOjpEZWZpbmVKU09iamVjdHModGhpcywgRlhKU09CSlRZUEVfU1RBVElDKTsKLSAgQ0pTX0ljb246OkRlZmluZUpTT2JqZWN0cyh0aGlzLCBGWEpTT0JKVFlQRV9EWU5BTUlDKTsKLSAgQ0pTX1V0aWw6OkRlZmluZUpTT2JqZWN0cyh0aGlzLCBGWEpTT0JKVFlQRV9TVEFUSUMpOwotCi0gIC8vIE9iakRlZklEcyAxOCAtIDIwICh0aGVzZSBjYW4ndCBmYWlsLCByZXR1cm4gdm9pZCkuCi0gIENKU19QdWJsaWNNZXRob2RzOjpEZWZpbmVKU09iamVjdHModGhpcyk7Ci0gIENKU19HbG9iYWxDb25zdHM6OkRlZmluZUpTT2JqZWN0cyh0aGlzKTsKLSAgQ0pTX0dsb2JhbEFycmF5czo6RGVmaW5lSlNPYmplY3RzKHRoaXMpOwotCi0gIC8vIE9iakRlZklEcyAyMSAtIDIzLgotICBDSlNfVGltZXJPYmo6OkRlZmluZUpTT2JqZWN0cyh0aGlzLCBGWEpTT0JKVFlQRV9EWU5BTUlDKTsKLSAgQ0pTX1ByaW50UGFyYW1zT2JqOjpEZWZpbmVKU09iamVjdHModGhpcywgRlhKU09CSlRZUEVfRFlOQU1JQyk7Ci0gIENKU19Bbm5vdDo6RGVmaW5lSlNPYmplY3RzKHRoaXMsIEZYSlNPQkpUWVBFX0RZTkFNSUMpOwotfQotCi1JSlNfRXZlbnRDb250ZXh0KiBDSlNfUnVudGltZTo6TmV3RXZlbnRDb250ZXh0KCkgewotICBtX0V2ZW50Q29udGV4dEFycmF5LnB1c2hfYmFjaygKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSlNfRXZlbnRDb250ZXh0PihuZXcgQ0pTX0V2ZW50Q29udGV4dCh0aGlzKSkpOwotICByZXR1cm4gbV9FdmVudENvbnRleHRBcnJheS5iYWNrKCkuZ2V0KCk7Ci19Ci0KLXZvaWQgQ0pTX1J1bnRpbWU6OlJlbGVhc2VFdmVudENvbnRleHQoSUpTX0V2ZW50Q29udGV4dCogcENvbnRleHQpIHsKLSAgYXV0byBpdCA9IHN0ZDo6ZmluZChtX0V2ZW50Q29udGV4dEFycmF5LmJlZ2luKCksIG1fRXZlbnRDb250ZXh0QXJyYXkuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgcGRmaXVtOjpGYWtlVW5pcXVlUHRyPENKU19FdmVudENvbnRleHQ+KAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDSlNfRXZlbnRDb250ZXh0Kj4ocENvbnRleHQpKSk7Ci0gIGlmIChpdCAhPSBtX0V2ZW50Q29udGV4dEFycmF5LmVuZCgpKQotICAgIG1fRXZlbnRDb250ZXh0QXJyYXkuZXJhc2UoaXQpOwotfQotCi1DSlNfRXZlbnRDb250ZXh0KiBDSlNfUnVudGltZTo6R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fRXZlbnRDb250ZXh0QXJyYXkuZW1wdHkoKSA/IG51bGxwdHIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fRXZlbnRDb250ZXh0QXJyYXkuYmFjaygpLmdldCgpOwotfQotCi12b2lkIENKU19SdW50aW1lOjpTZXRGb3JtRmlsbEVudlRvRG9jdW1lbnQoKSB7Ci0gIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKEdldElzb2xhdGUoKSk7Ci0gIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoR2V0SXNvbGF0ZSgpKTsKLSAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gTmV3TG9jYWxDb250ZXh0KCk7Ci0gIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKGNvbnRleHQpOwotCi0gIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwVGhpcyA9IEdldFRoaXNPYmooKTsKLSAgaWYgKHBUaGlzLklzRW1wdHkoKSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKENGWEpTX0VuZ2luZTo6R2V0T2JqRGVmbklEKHBUaGlzKSAhPSBDSlNfRG9jdW1lbnQ6Omdfbk9iakRlZm5JRCkKLSAgICByZXR1cm47Ci0KLSAgQ0pTX0RvY3VtZW50KiBwSlNEb2N1bWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxDSlNfRG9jdW1lbnQqPihHZXRPYmplY3RQcml2YXRlKHBUaGlzKSk7Ci0gIGlmICghcEpTRG9jdW1lbnQpCi0gICAgcmV0dXJuOwotCi0gIERvY3VtZW50KiBwRG9jdW1lbnQgPSBzdGF0aWNfY2FzdDxEb2N1bWVudCo+KHBKU0RvY3VtZW50LT5HZXRFbWJlZE9iamVjdCgpKTsKLSAgaWYgKCFwRG9jdW1lbnQpCi0gICAgcmV0dXJuOwotCi0gIHBEb2N1bWVudC0+U2V0Rm9ybUZpbGxFbnYobV9wRm9ybUZpbGxFbnYuR2V0KCkpOwotfQotCi1DUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIENKU19SdW50aW1lOjpHZXRGb3JtRmlsbEVudigpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcEZvcm1GaWxsRW52LkdldCgpOwotfQotCi1pbnQgQ0pTX1J1bnRpbWU6OkV4ZWN1dGVTY3JpcHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNjcmlwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyogaW5mbykgewotICBGWEpTRXJyIGVycm9yID0ge307Ci0gIGludCBuUmV0ID0gRXhlY3V0ZShzY3JpcHQsICZlcnJvcik7Ci0gIGlmIChuUmV0IDwgMCkgewotICAgIGluZm8tPkZvcm1hdChMIlsgTGluZTogJTA1ZCB7ICVzIH0gXSA6ICVzIiwgZXJyb3IubGlubnVtIC0gMSwgZXJyb3Iuc3JjbGluZSwKLSAgICAgICAgICAgICAgICAgZXJyb3IubWVzc2FnZSk7Ci0gIH0KLSAgcmV0dXJuIG5SZXQ7Ci19Ci0KLWJvb2wgQ0pTX1J1bnRpbWU6OkFkZEV2ZW50VG9TZXQoY29uc3QgRmllbGRFdmVudCYgZXZlbnQpIHsKLSAgcmV0dXJuIG1fRmllbGRFdmVudFNldC5pbnNlcnQoZXZlbnQpLnNlY29uZDsKLX0KLQotdm9pZCBDSlNfUnVudGltZTo6UmVtb3ZlRXZlbnRGcm9tU2V0KGNvbnN0IEZpZWxkRXZlbnQmIGV2ZW50KSB7Ci0gIG1fRmllbGRFdmVudFNldC5lcmFzZShldmVudCk7Ci19Ci0KLSNpZmRlZiBQREZfRU5BQkxFX1hGQQotQ0ZYX1dpZGVTdHJpbmcgQ2hhbmdlT2JqTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKSB7Ci0gIENGWF9XaWRlU3RyaW5nIHNSZXQgPSBzdHI7Ci0gIHNSZXQuUmVwbGFjZShMIl8iLCBMIi4iKTsKLSAgcmV0dXJuIHNSZXQ7Ci19Ci1ib29sIENKU19SdW50aW1lOjpHZXRWYWx1ZUJ5TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHV0ZjhOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpIHsKLSAgY29uc3QgRlhfQ0hBUiogbmFtZSA9IHV0ZjhOYW1lLmNfc3RyKCk7Ci0KLSAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoR2V0SXNvbGF0ZSgpKTsKLSAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShHZXRJc29sYXRlKCkpOwotICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBOZXdMb2NhbENvbnRleHQoKTsKLSAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRfc2NvcGUoY29udGV4dCk7Ci0KLSAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcHJvcHZhbHVlID0KLSAgICAgIGNvbnRleHQtPkdsb2JhbCgpLT5HZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgoCi0gICAgICAgICAgR2V0SXNvbGF0ZSgpLCBuYW1lLCB2ODo6U3RyaW5nOjprTm9ybWFsU3RyaW5nLCB1dGY4TmFtZS5HZXRMZW5ndGgoKSkpOwotCi0gIGlmIChwcm9wdmFsdWUuSXNFbXB0eSgpKSB7Ci0gICAgcFZhbHVlLT5TZXRVbmRlZmluZWQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcFZhbHVlLT5Gb3JjZVNldFZhbHVlKHByb3B2YWx1ZSk7Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDSlNfUnVudGltZTo6U2V0VmFsdWVCeU5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB1dGY4TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFZhbHVlKSB7Ci0gIGlmICh1dGY4TmFtZS5Jc0VtcHR5KCkgfHwgIXBWYWx1ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGNvbnN0IEZYX0NIQVIqIG5hbWUgPSB1dGY4TmFtZS5jX3N0cigpOwotICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBHZXRJc29sYXRlKCk7Ci0gIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKHBJc29sYXRlKTsKLSAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShwSXNvbGF0ZSk7Ci0gIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IE5ld0xvY2FsQ29udGV4dCgpOwotICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZShjb250ZXh0KTsKLQotICAvLyB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IHRtcENvdGV4dCA9Ci0gIC8vIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhHZXRJc29sYXRlKCksIG1fY29udGV4dCk7Ci0gIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHByb3B2YWx1ZSA9Ci0gICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KEdldElzb2xhdGUoKSwgcFZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpKTsKLSAgY29udGV4dC0+R2xvYmFsKCktPlNldCgKLSAgICAgIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCBuYW1lLCB2ODo6U3RyaW5nOjprTm9ybWFsU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRmOE5hbWUuR2V0TGVuZ3RoKCkpLAotICAgICAgcHJvcHZhbHVlKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvamF2YXNjcmlwdC9janNfcnVudGltZS5oIGIvZnBkZnNkay9qYXZhc2NyaXB0L2Nqc19ydW50aW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZGU1MWYuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9qYXZhc2NyaXB0L2Nqc19ydW50aW1lLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19KQVZBU0NSSVBUX0NKU19SVU5USU1FX0hfCi0jZGVmaW5lIEZQREZTREtfSkFWQVNDUklQVF9DSlNfUlVOVElNRV9IXwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9vYnNlcnZhYmxlLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgotI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19mb3JtZmlsbGVudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9panNfcnVudGltZS5oIgotI2luY2x1ZGUgImZ4anMvZnhqc192OC5oIgotCi1jbGFzcyBDSlNfRXZlbnRDb250ZXh0OwotCi1jbGFzcyBDSlNfUnVudGltZSA6IHB1YmxpYyBJSlNfUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIENGWEpTX0VuZ2luZSwKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIENGWF9PYnNlcnZhYmxlPENKU19SdW50aW1lPiB7Ci0gcHVibGljOgotICB1c2luZyBGaWVsZEV2ZW50ID0gc3RkOjpwYWlyPENGWF9XaWRlU3RyaW5nLCBKU19FVkVOVF9UPjsKLQotICBzdGF0aWMgQ0pTX1J1bnRpbWUqIEN1cnJlbnRSdW50aW1lRnJvbUlzb2xhdGUodjg6Oklzb2xhdGUqIHBJc29sYXRlKTsKLQotICBleHBsaWNpdCBDSlNfUnVudGltZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudik7Ci0gIH5DSlNfUnVudGltZSgpIG92ZXJyaWRlOwotCi0gIC8vIElKU19SdW50aW1lCi0gIElKU19FdmVudENvbnRleHQqIE5ld0V2ZW50Q29udGV4dCgpIG92ZXJyaWRlOwotICB2b2lkIFJlbGVhc2VFdmVudENvbnRleHQoSUpTX0V2ZW50Q29udGV4dCogcENvbnRleHQpIG92ZXJyaWRlOwotICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIEdldEZvcm1GaWxsRW52KCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGludCBFeGVjdXRlU2NyaXB0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nKiBpbmZvKSBvdmVycmlkZTsKLQotICBDSlNfRXZlbnRDb250ZXh0KiBHZXRDdXJyZW50RXZlbnRDb250ZXh0KCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBpc24ndCBhbHJlYWR5IGZvdW5kIGluIHRoZSBzZXQuCi0gIGJvb2wgQWRkRXZlbnRUb1NldChjb25zdCBGaWVsZEV2ZW50JiBldmVudCk7Ci0gIHZvaWQgUmVtb3ZlRXZlbnRGcm9tU2V0KGNvbnN0IEZpZWxkRXZlbnQmIGV2ZW50KTsKLQotICB2b2lkIEJlZ2luQmxvY2soKSB7IG1fYkJsb2NraW5nID0gdHJ1ZTsgfQotICB2b2lkIEVuZEJsb2NrKCkgeyBtX2JCbG9ja2luZyA9IGZhbHNlOyB9Ci0gIGJvb2wgSXNCbG9ja2luZygpIGNvbnN0IHsgcmV0dXJuIG1fYkJsb2NraW5nOyB9Ci0KLSNpZmRlZiBQREZfRU5BQkxFX1hGQQotICBib29sIEdldFZhbHVlQnlOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdXRmOE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpIG92ZXJyaWRlOwotICBib29sIFNldFZhbHVlQnlOYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgdXRmOE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpIG92ZXJyaWRlOwotI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQotCi0gcHJpdmF0ZToKLSAgdm9pZCBEZWZpbmVKU09iamVjdHMoKTsKLSAgdm9pZCBTZXRGb3JtRmlsbEVudlRvRG9jdW1lbnQoKTsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0pTX0V2ZW50Q29udGV4dD4+IG1fRXZlbnRDb250ZXh0QXJyYXk7Ci0gIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6T2JzZXJ2ZWRQdHIgbV9wRm9ybUZpbGxFbnY7Ci0gIGJvb2wgbV9iQmxvY2tpbmc7Ci0gIGJvb2wgbV9pc29sYXRlTWFuYWdlZDsKLSAgc3RkOjpzZXQ8RmllbGRFdmVudD4gbV9GaWVsZEV2ZW50U2V0OwotfTsKLQotI2VuZGlmICAvLyBGUERGU0RLX0pBVkFTQ1JJUFRfQ0pTX1JVTlRJTUVfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvamF2YXNjcmlwdC9jb2xvci5jcHAgYi9mcGRmc2RrL2phdmFzY3JpcHQvY29sb3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWNjYmFkLi4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvamF2YXNjcmlwdC9jb2xvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L2NvbG9yLmgiCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19PYmplY3QuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfVmFsdWUuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvY2pzX2V2ZW50X2NvbnRleHQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvY2pzX3J1bnRpbWUuaCIKLQotSlNDb25zdFNwZWMgQ0pTX0NvbG9yOjpDb25zdFNwZWNzW10gPSB7ezAsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDAsIDB9fTsKLQotSlNQcm9wZXJ0eVNwZWMgQ0pTX0NvbG9yOjpQcm9wZXJ0eVNwZWNzW10gPSB7Ci0gICAgeyJibGFjayIsIGdldF9ibGFja19zdGF0aWMsIHNldF9ibGFja19zdGF0aWN9LAotICAgIHsiYmx1ZSIsIGdldF9ibHVlX3N0YXRpYywgc2V0X2JsdWVfc3RhdGljfSwKLSAgICB7ImN5YW4iLCBnZXRfY3lhbl9zdGF0aWMsIHNldF9jeWFuX3N0YXRpY30sCi0gICAgeyJka0dyYXkiLCBnZXRfZGtHcmF5X3N0YXRpYywgc2V0X2RrR3JheV9zdGF0aWN9LAotICAgIHsiZ3JheSIsIGdldF9ncmF5X3N0YXRpYywgc2V0X2dyYXlfc3RhdGljfSwKLSAgICB7ImdyZWVuIiwgZ2V0X2dyZWVuX3N0YXRpYywgc2V0X2dyZWVuX3N0YXRpY30sCi0gICAgeyJsdEdyYXkiLCBnZXRfbHRHcmF5X3N0YXRpYywgc2V0X2x0R3JheV9zdGF0aWN9LAotICAgIHsibWFnZW50YSIsIGdldF9tYWdlbnRhX3N0YXRpYywgc2V0X21hZ2VudGFfc3RhdGljfSwKLSAgICB7InJlZCIsIGdldF9yZWRfc3RhdGljLCBzZXRfcmVkX3N0YXRpY30sCi0gICAgeyJ0cmFuc3BhcmVudCIsIGdldF90cmFuc3BhcmVudF9zdGF0aWMsIHNldF90cmFuc3BhcmVudF9zdGF0aWN9LAotICAgIHsid2hpdGUiLCBnZXRfd2hpdGVfc3RhdGljLCBzZXRfd2hpdGVfc3RhdGljfSwKLSAgICB7InllbGxvdyIsIGdldF95ZWxsb3dfc3RhdGljLCBzZXRfeWVsbG93X3N0YXRpY30sCi0gICAgezAsIDAsIDB9fTsKLQotSlNNZXRob2RTcGVjIENKU19Db2xvcjo6TWV0aG9kU3BlY3NbXSA9IHt7ImNvbnZlcnQiLCBjb252ZXJ0X3N0YXRpY30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZXF1YWwiLCBlcXVhbF9zdGF0aWN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMH19OwotCi1JTVBMRU1FTlRfSlNfQ0xBU1MoQ0pTX0NvbG9yLCBjb2xvcikKLQotY29sb3I6OmNvbG9yKENKU19PYmplY3QqIHBKU09iamVjdCkgOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KSB7Ci0gIG1fY3JUcmFuc3BhcmVudCA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX1RSQU5TUEFSRU5UKTsKLSAgbV9jckJsYWNrID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMCk7Ci0gIG1fY3JXaGl0ZSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpOwotICBtX2NyUmVkID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCAxLCAwLCAwKTsKLSAgbV9jckdyZWVuID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCAwLCAxLCAwKTsKLSAgbV9jckJsdWUgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIDAsIDAsIDEpOwotICBtX2NyQ3lhbiA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0NNWUssIDEsIDAsIDAsIDApOwotICBtX2NyTWFnZW50YSA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0NNWUssIDAsIDEsIDAsIDApOwotICBtX2NyWWVsbG93ID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfQ01ZSywgMCwgMCwgMSwgMCk7Ci0gIG1fY3JES0dyYXkgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjI1KTsKLSAgbV9jckdyYXkgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjUpOwotICBtX2NyTFRHcmF5ID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMC43NSk7Ci19Ci0KLWNvbG9yOjp+Y29sb3IoKSB7fQotCi12b2lkIGNvbG9yOjpDb252ZXJ0UFdMQ29sb3JUb0FycmF5KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19BcnJheSogYXJyYXkpIHsKLSAgc3dpdGNoIChjb2xvci5uQ29sb3JUeXBlKSB7Ci0gICAgY2FzZSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ6Ci0gICAgICBhcnJheS0+U2V0RWxlbWVudChwUnVudGltZSwgMCwgQ0pTX1ZhbHVlKHBSdW50aW1lLCAiVCIpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ09MT1JUWVBFX0dSQVk6Ci0gICAgICBhcnJheS0+U2V0RWxlbWVudChwUnVudGltZSwgMCwgQ0pTX1ZhbHVlKHBSdW50aW1lLCAiRyIpKTsKLSAgICAgIGFycmF5LT5TZXRFbGVtZW50KHBSdW50aW1lLCAxLCBDSlNfVmFsdWUocFJ1bnRpbWUsIGNvbG9yLmZDb2xvcjEpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ09MT1JUWVBFX1JHQjoKLSAgICAgIGFycmF5LT5TZXRFbGVtZW50KHBSdW50aW1lLCAwLCBDSlNfVmFsdWUocFJ1bnRpbWUsICJSR0IiKSk7Ci0gICAgICBhcnJheS0+U2V0RWxlbWVudChwUnVudGltZSwgMSwgQ0pTX1ZhbHVlKHBSdW50aW1lLCBjb2xvci5mQ29sb3IxKSk7Ci0gICAgICBhcnJheS0+U2V0RWxlbWVudChwUnVudGltZSwgMiwgQ0pTX1ZhbHVlKHBSdW50aW1lLCBjb2xvci5mQ29sb3IyKSk7Ci0gICAgICBhcnJheS0+U2V0RWxlbWVudChwUnVudGltZSwgMywgQ0pTX1ZhbHVlKHBSdW50aW1lLCBjb2xvci5mQ29sb3IzKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENPTE9SVFlQRV9DTVlLOgotICAgICAgYXJyYXktPlNldEVsZW1lbnQocFJ1bnRpbWUsIDAsIENKU19WYWx1ZShwUnVudGltZSwgIkNNWUsiKSk7Ci0gICAgICBhcnJheS0+U2V0RWxlbWVudChwUnVudGltZSwgMSwgQ0pTX1ZhbHVlKHBSdW50aW1lLCBjb2xvci5mQ29sb3IxKSk7Ci0gICAgICBhcnJheS0+U2V0RWxlbWVudChwUnVudGltZSwgMiwgQ0pTX1ZhbHVlKHBSdW50aW1lLCBjb2xvci5mQ29sb3IyKSk7Ci0gICAgICBhcnJheS0+U2V0RWxlbWVudChwUnVudGltZSwgMywgQ0pTX1ZhbHVlKHBSdW50aW1lLCBjb2xvci5mQ29sb3IzKSk7Ci0gICAgICBhcnJheS0+U2V0RWxlbWVudChwUnVudGltZSwgNCwgQ0pTX1ZhbHVlKHBSdW50aW1lLCBjb2xvci5mQ29sb3I0KSk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIGNvbG9yOjpDb252ZXJ0QXJyYXlUb1BXTENvbG9yKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0pTX0FycmF5JiBhcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9Db2xvciogY29sb3IpIHsKLSAgaW50IG5BcnJheUxlbiA9IGFycmF5LkdldExlbmd0aChwUnVudGltZSk7Ci0gIGlmIChuQXJyYXlMZW4gPCAxKQotICAgIHJldHVybjsKLQotICBDSlNfVmFsdWUgdmFsdWUocFJ1bnRpbWUpOwotICBhcnJheS5HZXRFbGVtZW50KHBSdW50aW1lLCAwLCB2YWx1ZSk7Ci0gIENGWF9CeXRlU3RyaW5nIHNTcGFjZSA9IHZhbHVlLlRvQ0ZYQnl0ZVN0cmluZyhwUnVudGltZSk7Ci0KLSAgZG91YmxlIGQxID0gMDsKLSAgZG91YmxlIGQyID0gMDsKLSAgZG91YmxlIGQzID0gMDsKLSAgZG91YmxlIGQ0ID0gMDsKLQotICBpZiAobkFycmF5TGVuID4gMSkgewotICAgIGFycmF5LkdldEVsZW1lbnQocFJ1bnRpbWUsIDEsIHZhbHVlKTsKLSAgICBkMSA9IHZhbHVlLlRvRG91YmxlKHBSdW50aW1lKTsKLSAgfQotCi0gIGlmIChuQXJyYXlMZW4gPiAyKSB7Ci0gICAgYXJyYXkuR2V0RWxlbWVudChwUnVudGltZSwgMiwgdmFsdWUpOwotICAgIGQyID0gdmFsdWUuVG9Eb3VibGUocFJ1bnRpbWUpOwotICB9Ci0KLSAgaWYgKG5BcnJheUxlbiA+IDMpIHsKLSAgICBhcnJheS5HZXRFbGVtZW50KHBSdW50aW1lLCAzLCB2YWx1ZSk7Ci0gICAgZDMgPSB2YWx1ZS5Ub0RvdWJsZShwUnVudGltZSk7Ci0gIH0KLQotICBpZiAobkFycmF5TGVuID4gNCkgewotICAgIGFycmF5LkdldEVsZW1lbnQocFJ1bnRpbWUsIDQsIHZhbHVlKTsKLSAgICBkNCA9IHZhbHVlLlRvRG91YmxlKHBSdW50aW1lKTsKLSAgfQotCi0gIGlmIChzU3BhY2UgPT0gIlQiKSB7Ci0gICAgKmNvbG9yID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfVFJBTlNQQVJFTlQpOwotICB9IGVsc2UgaWYgKHNTcGFjZSA9PSAiRyIpIHsKLSAgICAqY29sb3IgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAoRlhfRkxPQVQpZDEpOwotICB9IGVsc2UgaWYgKHNTcGFjZSA9PSAiUkdCIikgewotICAgICpjb2xvciA9Ci0gICAgICAgIENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgKEZYX0ZMT0FUKWQxLCAoRlhfRkxPQVQpZDIsIChGWF9GTE9BVClkMyk7Ci0gIH0gZWxzZSBpZiAoc1NwYWNlID09ICJDTVlLIikgewotICAgICpjb2xvciA9IENQV0xfQ29sb3IoQ09MT1JUWVBFX0NNWUssIChGWF9GTE9BVClkMSwgKEZYX0ZMT0FUKWQyLAotICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWQzLCAoRlhfRkxPQVQpZDQpOwotICB9Ci19Ci0KLWJvb2wgY29sb3I6OnRyYW5zcGFyZW50KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gUHJvcGVydHlIZWxwZXIocFJ1bnRpbWUsIHZwLCAmbV9jclRyYW5zcGFyZW50KTsKLX0KLQotYm9vbCBjb2xvcjo6YmxhY2soQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiBQcm9wZXJ0eUhlbHBlcihwUnVudGltZSwgdnAsICZtX2NyQmxhY2spOwotfQotCi1ib29sIGNvbG9yOjp3aGl0ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgcmV0dXJuIFByb3BlcnR5SGVscGVyKHBSdW50aW1lLCB2cCwgJm1fY3JXaGl0ZSk7Ci19Ci0KLWJvb2wgY29sb3I6OnJlZChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gUHJvcGVydHlIZWxwZXIocFJ1bnRpbWUsIHZwLCAmbV9jclJlZCk7Ci19Ci0KLWJvb2wgY29sb3I6OmdyZWVuKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gUHJvcGVydHlIZWxwZXIocFJ1bnRpbWUsIHZwLCAmbV9jckdyZWVuKTsKLX0KLQotYm9vbCBjb2xvcjo6Ymx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiBQcm9wZXJ0eUhlbHBlcihwUnVudGltZSwgdnAsICZtX2NyQmx1ZSk7Ci19Ci0KLWJvb2wgY29sb3I6OmN5YW4oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gUHJvcGVydHlIZWxwZXIocFJ1bnRpbWUsIHZwLCAmbV9jckN5YW4pOwotfQotCi1ib29sIGNvbG9yOjptYWdlbnRhKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgcmV0dXJuIFByb3BlcnR5SGVscGVyKHBSdW50aW1lLCB2cCwgJm1fY3JNYWdlbnRhKTsKLX0KLQotYm9vbCBjb2xvcjo6eWVsbG93KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiBQcm9wZXJ0eUhlbHBlcihwUnVudGltZSwgdnAsICZtX2NyWWVsbG93KTsKLX0KLQotYm9vbCBjb2xvcjo6ZGtHcmF5KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiBQcm9wZXJ0eUhlbHBlcihwUnVudGltZSwgdnAsICZtX2NyREtHcmF5KTsKLX0KLQotYm9vbCBjb2xvcjo6Z3JheShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiBQcm9wZXJ0eUhlbHBlcihwUnVudGltZSwgdnAsICZtX2NyR3JheSk7Ci19Ci0KLWJvb2wgY29sb3I6Omx0R3JheShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gUHJvcGVydHlIZWxwZXIocFJ1bnRpbWUsIHZwLCAmbV9jckxUR3JheSk7Ci19Ci0KLWJvb2wgY29sb3I6OlByb3BlcnR5SGVscGVyKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9Db2xvciogdmFyKSB7Ci0gIENKU19BcnJheSBhcnJheTsKLSAgaWYgKHZwLklzR2V0dGluZygpKSB7Ci0gICAgQ29udmVydFBXTENvbG9yVG9BcnJheShwUnVudGltZSwgKnZhciwgJmFycmF5KTsKLSAgICB2cCA8PCBhcnJheTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoIXZwLkdldEpTVmFsdWUoKS0+Q29udmVydFRvQXJyYXkocFJ1bnRpbWUsIGFycmF5KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ29udmVydEFycmF5VG9QV0xDb2xvcihwUnVudGltZSwgYXJyYXksIHZhcik7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGNvbG9yOjpjb252ZXJ0KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKLSAgaWYgKGlTaXplIDwgMikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ0pTX0FycmF5IGFTb3VyY2U7Ci0gIGlmICghcGFyYW1zWzBdLkNvbnZlcnRUb0FycmF5KHBSdW50aW1lLCBhU291cmNlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1BXTF9Db2xvciBjclNvdXJjZTsKLSAgQ29udmVydEFycmF5VG9QV0xDb2xvcihwUnVudGltZSwgYVNvdXJjZSwgJmNyU291cmNlKTsKLQotICBDRlhfQnl0ZVN0cmluZyBzRGVzdFNwYWNlID0gcGFyYW1zWzFdLlRvQ0ZYQnl0ZVN0cmluZyhwUnVudGltZSk7Ci0gIGludCBuQ29sb3JUeXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOwotCi0gIGlmIChzRGVzdFNwYWNlID09ICJUIikgewotICAgIG5Db2xvclR5cGUgPSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ7Ci0gIH0gZWxzZSBpZiAoc0Rlc3RTcGFjZSA9PSAiRyIpIHsKLSAgICBuQ29sb3JUeXBlID0gQ09MT1JUWVBFX0dSQVk7Ci0gIH0gZWxzZSBpZiAoc0Rlc3RTcGFjZSA9PSAiUkdCIikgewotICAgIG5Db2xvclR5cGUgPSBDT0xPUlRZUEVfUkdCOwotICB9IGVsc2UgaWYgKHNEZXN0U3BhY2UgPT0gIkNNWUsiKSB7Ci0gICAgbkNvbG9yVHlwZSA9IENPTE9SVFlQRV9DTVlLOwotICB9Ci0KLSAgQ0pTX0FycmF5IGFEZXN0OwotICBDUFdMX0NvbG9yIGNyRGVzdCA9IGNyU291cmNlLkNvbnZlcnRDb2xvclR5cGUobkNvbG9yVHlwZSk7Ci0gIENvbnZlcnRQV0xDb2xvclRvQXJyYXkocFJ1bnRpbWUsIGNyRGVzdCwgJmFEZXN0KTsKLSAgdlJldCA9IENKU19WYWx1ZShwUnVudGltZSwgYURlc3QpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGNvbG9yOjplcXVhbChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmIChwYXJhbXMuc2l6ZSgpIDwgMikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ0pTX0FycmF5IGFycmF5MTsKLSAgQ0pTX0FycmF5IGFycmF5MjsKLSAgaWYgKCFwYXJhbXNbMF0uQ29udmVydFRvQXJyYXkocFJ1bnRpbWUsIGFycmF5MSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoIXBhcmFtc1sxXS5Db252ZXJ0VG9BcnJheShwUnVudGltZSwgYXJyYXkyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1BXTF9Db2xvciBjb2xvcjE7Ci0gIENQV0xfQ29sb3IgY29sb3IyOwotICBDb252ZXJ0QXJyYXlUb1BXTENvbG9yKHBSdW50aW1lLCBhcnJheTEsICZjb2xvcjEpOwotICBDb252ZXJ0QXJyYXlUb1BXTENvbG9yKHBSdW50aW1lLCBhcnJheTIsICZjb2xvcjIpOwotICBjb2xvcjEgPSBjb2xvcjEuQ29udmVydENvbG9yVHlwZShjb2xvcjIubkNvbG9yVHlwZSk7Ci0gIHZSZXQgPSBDSlNfVmFsdWUocFJ1bnRpbWUsIGNvbG9yMSA9PSBjb2xvcjIpOwotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvamF2YXNjcmlwdC9jb2xvci5oIGIvZnBkZnNkay9qYXZhc2NyaXB0L2NvbG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNjE4N2EuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9qYXZhc2NyaXB0L2NvbG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19KQVZBU0NSSVBUX0NPTE9SX0hfCi0jZGVmaW5lIEZQREZTREtfSkFWQVNDUklQVF9DT0xPUl9IXwotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX0RlZmluZS5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9XbmQuaCIKLQotY2xhc3MgY29sb3IgOiBwdWJsaWMgQ0pTX0VtYmVkT2JqIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IGNvbG9yKENKU19PYmplY3QqIHBKU09iamVjdCk7Ci0gIH5jb2xvcigpIG92ZXJyaWRlOwotCi0gIGJvb2wgYmxhY2soQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgYmx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBjeWFuKENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGRrR3JheShDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBncmF5KENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGdyZWVuKENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGx0R3JheShDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBtYWdlbnRhKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgcmVkKENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHRyYW5zcGFyZW50KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCB3aGl0ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCB5ZWxsb3coQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0KLSAgYm9vbCBjb252ZXJ0KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGVxdWFsKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotCi0gIHN0YXRpYyB2b2lkIENvbnZlcnRQV0xDb2xvclRvQXJyYXkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19BcnJheSogYXJyYXkpOwotICBzdGF0aWMgdm9pZCBDb252ZXJ0QXJyYXlUb1BXTENvbG9yKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDSlNfQXJyYXkmIGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfQ29sb3IqIGNvbG9yKTsKLQotIHByaXZhdGU6Ci0gIGJvb2wgUHJvcGVydHlIZWxwZXIoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgIENQV0xfQ29sb3IqIHZhbCk7Ci0KLSAgQ1BXTF9Db2xvciBtX2NyVHJhbnNwYXJlbnQ7Ci0gIENQV0xfQ29sb3IgbV9jckJsYWNrOwotICBDUFdMX0NvbG9yIG1fY3JXaGl0ZTsKLSAgQ1BXTF9Db2xvciBtX2NyUmVkOwotICBDUFdMX0NvbG9yIG1fY3JHcmVlbjsKLSAgQ1BXTF9Db2xvciBtX2NyQmx1ZTsKLSAgQ1BXTF9Db2xvciBtX2NyQ3lhbjsKLSAgQ1BXTF9Db2xvciBtX2NyTWFnZW50YTsKLSAgQ1BXTF9Db2xvciBtX2NyWWVsbG93OwotICBDUFdMX0NvbG9yIG1fY3JES0dyYXk7Ci0gIENQV0xfQ29sb3IgbV9jckdyYXk7Ci0gIENQV0xfQ29sb3IgbV9jckxUR3JheTsKLX07Ci0KLWNsYXNzIENKU19Db2xvciA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENKU19Db2xvcih2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9Ci0gIH5DSlNfQ29sb3IoKSBvdmVycmlkZSB7fQotCi0gIERFQ0xBUkVfSlNfQ0xBU1MoKTsKLQotICBKU19TVEFUSUNfUFJPUChibGFjaywgY29sb3IpOwotICBKU19TVEFUSUNfUFJPUChibHVlLCBjb2xvcik7Ci0gIEpTX1NUQVRJQ19QUk9QKGN5YW4sIGNvbG9yKTsKLSAgSlNfU1RBVElDX1BST1AoZGtHcmF5LCBjb2xvcik7Ci0gIEpTX1NUQVRJQ19QUk9QKGdyYXksIGNvbG9yKTsKLSAgSlNfU1RBVElDX1BST1AoZ3JlZW4sIGNvbG9yKTsKLSAgSlNfU1RBVElDX1BST1AobHRHcmF5LCBjb2xvcik7Ci0gIEpTX1NUQVRJQ19QUk9QKG1hZ2VudGEsIGNvbG9yKTsKLSAgSlNfU1RBVElDX1BST1AocmVkLCBjb2xvcik7Ci0gIEpTX1NUQVRJQ19QUk9QKHRyYW5zcGFyZW50LCBjb2xvcik7Ci0gIEpTX1NUQVRJQ19QUk9QKHdoaXRlLCBjb2xvcik7Ci0gIEpTX1NUQVRJQ19QUk9QKHllbGxvdywgY29sb3IpOwotCi0gIEpTX1NUQVRJQ19NRVRIT0QoY29udmVydCwgY29sb3IpOwotICBKU19TVEFUSUNfTUVUSE9EKGVxdWFsLCBjb2xvcik7Ci19OwotCi0jZW5kaWYgIC8vIEZQREZTREtfSkFWQVNDUklQVF9DT0xPUl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9qYXZhc2NyaXB0L2NvbnNvbGUuY3BwIGIvZnBkZnNkay9qYXZhc2NyaXB0L2NvbnNvbGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWQxMzA4Li4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvamF2YXNjcmlwdC9jb25zb2xlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9jb25zb2xlLmgiCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19PYmplY3QuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfVmFsdWUuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvY2pzX2V2ZW50X2NvbnRleHQuaCIKLQotSlNDb25zdFNwZWMgQ0pTX0NvbnNvbGU6OkNvbnN0U3BlY3NbXSA9IHt7MCwgSlNDb25zdFNwZWM6Ok51bWJlciwgMCwgMH19OwotCi1KU1Byb3BlcnR5U3BlYyBDSlNfQ29uc29sZTo6UHJvcGVydHlTcGVjc1tdID0ge3swLCAwLCAwfX07Ci0KLUpTTWV0aG9kU3BlYyBDSlNfQ29uc29sZTo6TWV0aG9kU3BlY3NbXSA9IHt7ImNsZWFyIiwgY2xlYXJfc3RhdGljfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImhpZGUiLCBoaWRlX3N0YXRpY30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJwcmludGxuIiwgcHJpbnRsbl9zdGF0aWN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsic2hvdyIsIHNob3dfc3RhdGljfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMH19OwotCi1JTVBMRU1FTlRfSlNfQ0xBU1MoQ0pTX0NvbnNvbGUsIGNvbnNvbGUpCi0KLWNvbnNvbGU6OmNvbnNvbGUoQ0pTX09iamVjdCogcEpTT2JqZWN0KSA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpIHt9Ci0KLWNvbnNvbGU6On5jb25zb2xlKCkge30KLQotYm9vbCBjb25zb2xlOjpjbGVhcihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGNvbnNvbGU6OmhpZGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBjb25zb2xlOjpwcmludGxuKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHBhcmFtcy5zaXplKCkgPCAxKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGNvbnNvbGU6OnNob3coQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvamF2YXNjcmlwdC9jb25zb2xlLmggYi9mcGRmc2RrL2phdmFzY3JpcHQvY29uc29sZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2U0ZDhlLi4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvamF2YXNjcmlwdC9jb25zb2xlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19KQVZBU0NSSVBUX0NPTlNPTEVfSF8KLSNkZWZpbmUgRlBERlNES19KQVZBU0NSSVBUX0NPTlNPTEVfSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19EZWZpbmUuaCIKLQotY2xhc3MgY29uc29sZSA6IHB1YmxpYyBDSlNfRW1iZWRPYmogewotIHB1YmxpYzoKLSAgZXhwbGljaXQgY29uc29sZShDSlNfT2JqZWN0KiBwSlNPYmplY3QpOwotICB+Y29uc29sZSgpIG92ZXJyaWRlOwotCi0gcHVibGljOgotICBib29sIGNsZWFyKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGhpZGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgcHJpbnRsbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBzaG93KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotfTsKLQotY2xhc3MgQ0pTX0NvbnNvbGUgOiBwdWJsaWMgQ0pTX09iamVjdCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDSlNfQ29uc29sZSh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9Ci0gIH5DSlNfQ29uc29sZSgpIG92ZXJyaWRlIHt9Ci0KLSAgREVDTEFSRV9KU19DTEFTUygpOwotCi0gIEpTX1NUQVRJQ19NRVRIT0QoY2xlYXIsIGNvbnNvbGUpOwotICBKU19TVEFUSUNfTUVUSE9EKGhpZGUsIGNvbnNvbGUpOwotICBKU19TVEFUSUNfTUVUSE9EKHByaW50bG4sIGNvbnNvbGUpOwotICBKU19TVEFUSUNfTUVUSE9EKHNob3csIGNvbnNvbGUpOwotfTsKLQotI2VuZGlmICAvLyBGUERGU0RLX0pBVkFTQ1JJUFRfQ09OU09MRV9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9qYXZhc2NyaXB0L2V2ZW50LmNwcCBiL2ZwZGZzZGsvamF2YXNjcmlwdC9ldmVudC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMDBjYmMuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9qYXZhc2NyaXB0L2V2ZW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvZXZlbnQuaCIKLQotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9GaWVsZC5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19EZWZpbmUuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfRXZlbnRIYW5kbGVyLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX09iamVjdC5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19WYWx1ZS5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9janNfZXZlbnRfY29udGV4dC5oIgotCi1KU0NvbnN0U3BlYyBDSlNfRXZlbnQ6OkNvbnN0U3BlY3NbXSA9IHt7MCwgSlNDb25zdFNwZWM6Ok51bWJlciwgMCwgMH19OwotCi1KU1Byb3BlcnR5U3BlYyBDSlNfRXZlbnQ6OlByb3BlcnR5U3BlY3NbXSA9IHsKLSAgICB7ImNoYW5nZSIsIGdldF9jaGFuZ2Vfc3RhdGljLCBzZXRfY2hhbmdlX3N0YXRpY30sCi0gICAgeyJjaGFuZ2VFeCIsIGdldF9jaGFuZ2VFeF9zdGF0aWMsIHNldF9jaGFuZ2VFeF9zdGF0aWN9LAotICAgIHsiY29tbWl0S2V5IiwgZ2V0X2NvbW1pdEtleV9zdGF0aWMsIHNldF9jb21taXRLZXlfc3RhdGljfSwKLSAgICB7ImZpZWxkRnVsbCIsIGdldF9maWVsZEZ1bGxfc3RhdGljLCBzZXRfZmllbGRGdWxsX3N0YXRpY30sCi0gICAgeyJrZXlEb3duIiwgZ2V0X2tleURvd25fc3RhdGljLCBzZXRfa2V5RG93bl9zdGF0aWN9LAotICAgIHsibW9kaWZpZXIiLCBnZXRfbW9kaWZpZXJfc3RhdGljLCBzZXRfbW9kaWZpZXJfc3RhdGljfSwKLSAgICB7Im5hbWUiLCBnZXRfbmFtZV9zdGF0aWMsIHNldF9uYW1lX3N0YXRpY30sCi0gICAgeyJyYyIsIGdldF9yY19zdGF0aWMsIHNldF9yY19zdGF0aWN9LAotICAgIHsicmljaENoYW5nZSIsIGdldF9yaWNoQ2hhbmdlX3N0YXRpYywgc2V0X3JpY2hDaGFuZ2Vfc3RhdGljfSwKLSAgICB7InJpY2hDaGFuZ2VFeCIsIGdldF9yaWNoQ2hhbmdlRXhfc3RhdGljLCBzZXRfcmljaENoYW5nZUV4X3N0YXRpY30sCi0gICAgeyJyaWNoVmFsdWUiLCBnZXRfcmljaFZhbHVlX3N0YXRpYywgc2V0X3JpY2hWYWx1ZV9zdGF0aWN9LAotICAgIHsic2VsRW5kIiwgZ2V0X3NlbEVuZF9zdGF0aWMsIHNldF9zZWxFbmRfc3RhdGljfSwKLSAgICB7InNlbFN0YXJ0IiwgZ2V0X3NlbFN0YXJ0X3N0YXRpYywgc2V0X3NlbFN0YXJ0X3N0YXRpY30sCi0gICAgeyJzaGlmdCIsIGdldF9zaGlmdF9zdGF0aWMsIHNldF9zaGlmdF9zdGF0aWN9LAotICAgIHsic291cmNlIiwgZ2V0X3NvdXJjZV9zdGF0aWMsIHNldF9zb3VyY2Vfc3RhdGljfSwKLSAgICB7InRhcmdldCIsIGdldF90YXJnZXRfc3RhdGljLCBzZXRfdGFyZ2V0X3N0YXRpY30sCi0gICAgeyJ0YXJnZXROYW1lIiwgZ2V0X3RhcmdldE5hbWVfc3RhdGljLCBzZXRfdGFyZ2V0TmFtZV9zdGF0aWN9LAotICAgIHsidHlwZSIsIGdldF90eXBlX3N0YXRpYywgc2V0X3R5cGVfc3RhdGljfSwKLSAgICB7InZhbHVlIiwgZ2V0X3ZhbHVlX3N0YXRpYywgc2V0X3ZhbHVlX3N0YXRpY30sCi0gICAgeyJ3aWxsQ29tbWl0IiwgZ2V0X3dpbGxDb21taXRfc3RhdGljLCBzZXRfd2lsbENvbW1pdF9zdGF0aWN9LAotICAgIHswLCAwLCAwfX07Ci0KLUpTTWV0aG9kU3BlYyBDSlNfRXZlbnQ6Ok1ldGhvZFNwZWNzW10gPSB7ezAsIDB9fTsKLQotSU1QTEVNRU5UX0pTX0NMQVNTKENKU19FdmVudCwgZXZlbnQpCi0KLWV2ZW50OjpldmVudChDSlNfT2JqZWN0KiBwSnNPYmplY3QpIDogQ0pTX0VtYmVkT2JqKHBKc09iamVjdCkge30KLQotZXZlbnQ6On5ldmVudCgpIHt9Ci0KLWJvb2wgZXZlbnQ6OmNoYW5nZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPQotICAgICAgcFJ1bnRpbWUtPkdldEN1cnJlbnRFdmVudENvbnRleHQoKS0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0gIENGWF9XaWRlU3RyaW5nJiB3Q2hhbmdlID0gcEV2ZW50LT5DaGFuZ2UoKTsKLSAgaWYgKHZwLklzU2V0dGluZygpKSB7Ci0gICAgaWYgKHZwLkdldEpTVmFsdWUoKS0+R2V0VHlwZSgpID09IENKU19WYWx1ZTo6VlRfc3RyaW5nKQotICAgICAgdnAgPj4gd0NoYW5nZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICB2cCA8PCB3Q2hhbmdlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBldmVudDo6Y2hhbmdlRXgoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmICghdnAuSXNHZXR0aW5nKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9Ci0gICAgICBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpLT5HZXRFdmVudEhhbmRsZXIoKTsKLQotICB2cCA8PCBwRXZlbnQtPkNoYW5nZUV4KCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGV2ZW50Ojpjb21taXRLZXkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0KLSAgICAgIHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCktPkdldEV2ZW50SGFuZGxlcigpOwotCi0gIHZwIDw8IHBFdmVudC0+Q29tbWl0S2V5KCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGV2ZW50OjpmaWVsZEZ1bGwoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0KLSAgICAgIHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCktPkdldEV2ZW50SGFuZGxlcigpOwotCi0gIGlmICghdnAuSXNHZXR0aW5nKCkgJiYKLSAgICAgIHdjc2NtcCgoY29uc3Qgd2NoYXJfdCopcEV2ZW50LT5OYW1lKCksIEwiS2V5c3Ryb2tlIikgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgdnAgPDwgcEV2ZW50LT5GaWVsZEZ1bGwoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgZXZlbnQ6OmtleURvd24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAoIXZwLklzR2V0dGluZygpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPQotICAgICAgcFJ1bnRpbWUtPkdldEN1cnJlbnRFdmVudENvbnRleHQoKS0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0KLSAgdnAgPDwgcEV2ZW50LT5LZXlEb3duKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGV2ZW50Ojptb2RpZmllcihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0KLSAgICAgIHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCktPkdldEV2ZW50SGFuZGxlcigpOwotCi0gIHZwIDw8IHBFdmVudC0+TW9kaWZpZXIoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgZXZlbnQ6Om5hbWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAoIXZwLklzR2V0dGluZygpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPQotICAgICAgcFJ1bnRpbWUtPkdldEN1cnJlbnRFdmVudENvbnRleHQoKS0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0KLSAgdnAgPDwgcEV2ZW50LT5OYW1lKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGV2ZW50OjpyYyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0KLSAgICAgIHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCktPkdldEV2ZW50SGFuZGxlcigpOwotCi0gIGJvb2wmIGJSYyA9IHBFdmVudC0+UmMoKTsKLSAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHZwID4+IGJSYzsKLSAgZWxzZQotICAgIHZwIDw8IGJSYzsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBldmVudDo6cmljaENoYW5nZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGV2ZW50OjpyaWNoQ2hhbmdlRXgoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgZXZlbnQ6OnJpY2hWYWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBldmVudDo6c2VsRW5kKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9Ci0gICAgICBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpLT5HZXRFdmVudEhhbmRsZXIoKTsKLQotICBpZiAod2NzY21wKChjb25zdCB3Y2hhcl90KilwRXZlbnQtPk5hbWUoKSwgTCJLZXlzdHJva2UiKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGludCYgaVNlbEVuZCA9IHBFdmVudC0+U2VsRW5kKCk7Ci0gIGlmICh2cC5Jc1NldHRpbmcoKSkKLSAgICB2cCA+PiBpU2VsRW5kOwotICBlbHNlCi0gICAgdnAgPDwgaVNlbEVuZDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBldmVudDo6c2VsU3RhcnQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9Ci0gICAgICBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpLT5HZXRFdmVudEhhbmRsZXIoKTsKLQotICBpZiAod2NzY21wKChjb25zdCB3Y2hhcl90KilwRXZlbnQtPk5hbWUoKSwgTCJLZXlzdHJva2UiKSAhPSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGludCYgaVNlbFN0YXJ0ID0gcEV2ZW50LT5TZWxTdGFydCgpOwotICBpZiAodnAuSXNTZXR0aW5nKCkpCi0gICAgdnAgPj4gaVNlbFN0YXJ0OwotICBlbHNlCi0gICAgdnAgPDwgaVNlbFN0YXJ0OwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGV2ZW50OjpzaGlmdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0KLSAgICAgIHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCktPkdldEV2ZW50SGFuZGxlcigpOwotCi0gIHZwIDw8IHBFdmVudC0+U2hpZnQoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgZXZlbnQ6OnNvdXJjZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAoIXZwLklzR2V0dGluZygpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPQotICAgICAgcFJ1bnRpbWUtPkdldEN1cnJlbnRFdmVudENvbnRleHQoKS0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0KLSAgdnAgPDwgcEV2ZW50LT5Tb3VyY2UoKS0+R2V0SlNPYmplY3QoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgZXZlbnQ6OnRhcmdldChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAoIXZwLklzR2V0dGluZygpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPQotICAgICAgcFJ1bnRpbWUtPkdldEN1cnJlbnRFdmVudENvbnRleHQoKS0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0KLSAgdnAgPDwgcEV2ZW50LT5UYXJnZXRfRmllbGQoKS0+R2V0SlNPYmplY3QoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgZXZlbnQ6OnRhcmdldE5hbWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAoIXZwLklzR2V0dGluZygpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPQotICAgICAgcFJ1bnRpbWUtPkdldEN1cnJlbnRFdmVudENvbnRleHQoKS0+R2V0RXZlbnRIYW5kbGVyKCk7Ci0KLSAgdnAgPDwgcEV2ZW50LT5UYXJnZXROYW1lKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIGV2ZW50Ojp0eXBlKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKCF2cC5Jc0dldHRpbmcoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0KLSAgICAgIHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCktPkdldEV2ZW50SGFuZGxlcigpOwotCi0gIHZwIDw8IHBFdmVudC0+VHlwZSgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBldmVudDo6dmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9Ci0gICAgICBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpLT5HZXRFdmVudEhhbmRsZXIoKTsKLQotICBpZiAod2NzY21wKChjb25zdCB3Y2hhcl90KilwRXZlbnQtPlR5cGUoKSwgTCJGaWVsZCIpICE9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcmIHZhbCA9IHBFdmVudC0+VmFsdWUoKTsKLSAgaWYgKHZwLklzU2V0dGluZygpKQotICAgIHZwID4+IHZhbDsKLSAgZWxzZQotICAgIHZwIDw8IHZhbDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBldmVudDo6d2lsbENvbW1pdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmICghdnAuSXNHZXR0aW5nKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9Ci0gICAgICBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpLT5HZXRFdmVudEhhbmRsZXIoKTsKLQotICB2cCA8PCBwRXZlbnQtPldpbGxDb21taXQoKTsKLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS9mcGRmc2RrL2phdmFzY3JpcHQvZXZlbnQuaCBiL2ZwZGZzZGsvamF2YXNjcmlwdC9ldmVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmU4YTBhLi4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvamF2YXNjcmlwdC9ldmVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZQREZTREtfSkFWQVNDUklQVF9FVkVOVF9IXwotI2RlZmluZSBGUERGU0RLX0pBVkFTQ1JJUFRfRVZFTlRfSF8KLQotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19EZWZpbmUuaCIKLQotY2xhc3MgZXZlbnQgOiBwdWJsaWMgQ0pTX0VtYmVkT2JqIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IGV2ZW50KENKU19PYmplY3QqIHBKU09iamVjdCk7Ci0gIH5ldmVudCgpIG92ZXJyaWRlOwotCi0gcHVibGljOgotICBib29sIGNoYW5nZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBjaGFuZ2VFeChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgY29tbWl0S2V5KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIGZpZWxkRnVsbChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBrZXlEb3duKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgbW9kaWZpZXIoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIG5hbWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgcmMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgcmljaENoYW5nZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHJpY2hDaGFuZ2VFeChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgIENKU19Qcm9wVmFsdWUmIHZwLAotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCByaWNoVmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgc2VsRW5kKENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHNlbFN0YXJ0KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBzaGlmdChDSlNfUnVudGltZSogcFJ1bnRpbWUsIENKU19Qcm9wVmFsdWUmIHZwLCBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBzb3VyY2UoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBDSlNfUHJvcFZhbHVlJiB2cCwgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgdGFyZ2V0KENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHRhcmdldE5hbWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCB0eXBlKENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSwgQ0pTX1Byb3BWYWx1ZSYgdnAsIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHdpbGxDb21taXQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgQ0pTX1Byb3BWYWx1ZSYgdnAsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLX07Ci0KLWNsYXNzIENKU19FdmVudCA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENKU19FdmVudCh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9Ci0gIH5DSlNfRXZlbnQoKSBvdmVycmlkZSB7fQotCi0gIERFQ0xBUkVfSlNfQ0xBU1MoKTsKLSAgSlNfU1RBVElDX1BST1AoY2hhbmdlLCBldmVudCk7Ci0gIEpTX1NUQVRJQ19QUk9QKGNoYW5nZUV4LCBldmVudCk7Ci0gIEpTX1NUQVRJQ19QUk9QKGNvbW1pdEtleSwgZXZlbnQpOwotICBKU19TVEFUSUNfUFJPUChmaWVsZEZ1bGwsIGV2ZW50KTsKLSAgSlNfU1RBVElDX1BST1Aoa2V5RG93biwgZXZlbnQpOwotICBKU19TVEFUSUNfUFJPUChtb2RpZmllciwgZXZlbnQpOwotICBKU19TVEFUSUNfUFJPUChuYW1lLCBldmVudCk7Ci0gIEpTX1NUQVRJQ19QUk9QKHJjLCBldmVudCk7Ci0gIEpTX1NUQVRJQ19QUk9QKHJpY2hDaGFuZ2UsIGV2ZW50KTsKLSAgSlNfU1RBVElDX1BST1AocmljaENoYW5nZUV4LCBldmVudCk7Ci0gIEpTX1NUQVRJQ19QUk9QKHJpY2hWYWx1ZSwgZXZlbnQpOwotICBKU19TVEFUSUNfUFJPUChzZWxFbmQsIGV2ZW50KTsKLSAgSlNfU1RBVElDX1BST1Aoc2VsU3RhcnQsIGV2ZW50KTsKLSAgSlNfU1RBVElDX1BST1Aoc2hpZnQsIGV2ZW50KTsKLSAgSlNfU1RBVElDX1BST1Aoc291cmNlLCBldmVudCk7Ci0gIEpTX1NUQVRJQ19QUk9QKHRhcmdldCwgZXZlbnQpOwotICBKU19TVEFUSUNfUFJPUCh0YXJnZXROYW1lLCBldmVudCk7Ci0gIEpTX1NUQVRJQ19QUk9QKHR5cGUsIGV2ZW50KTsKLSAgSlNfU1RBVElDX1BST1AodmFsdWUsIGV2ZW50KTsKLSAgSlNfU1RBVElDX1BST1Aod2lsbENvbW1pdCwgZXZlbnQpOwotfTsKLQotI2VuZGlmICAvLyBGUERGU0RLX0pBVkFTQ1JJUFRfRVZFTlRfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvamF2YXNjcmlwdC9nbG9iYWwuY3BwIGIvZnBkZnNkay9qYXZhc2NyaXB0L2dsb2JhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NTA2MDYuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9qYXZhc2NyaXB0L2dsb2JhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NDAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L2dsb2JhbC5oIgotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9leHQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19HbG9iYWxEYXRhLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX09iamVjdC5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19WYWx1ZS5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9janNfZXZlbnRfY29udGV4dC5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9yZXNvdXJjZS5oIgotCi1KU0NvbnN0U3BlYyBDSlNfR2xvYmFsOjpDb25zdFNwZWNzW10gPSB7ezAsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDAsIDB9fTsKLQotSlNQcm9wZXJ0eVNwZWMgQ0pTX0dsb2JhbDo6UHJvcGVydHlTcGVjc1tdID0ge3swLCAwLCAwfX07Ci0KLUpTTWV0aG9kU3BlYyBDSlNfR2xvYmFsOjpNZXRob2RTcGVjc1tdID0gewotICAgIHsic2V0UGVyc2lzdGVudCIsIHNldFBlcnNpc3RlbnRfc3RhdGljfSwKLSAgICB7MCwgMH19OwotCi1JTVBMRU1FTlRfU1BFQ0lBTF9KU19DTEFTUyhDSlNfR2xvYmFsLCBKU0dsb2JhbEFsdGVybmF0ZSwgZ2xvYmFsKTsKLQotdm9pZCBDSlNfR2xvYmFsOjpJbml0SW5zdGFuY2UoSUpTX1J1bnRpbWUqIHBJUnVudGltZSkgewotICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBzdGF0aWNfY2FzdDxDSlNfUnVudGltZSo+KHBJUnVudGltZSk7Ci0gIEpTR2xvYmFsQWx0ZXJuYXRlKiBwR2xvYmFsID0KLSAgICAgIHN0YXRpY19jYXN0PEpTR2xvYmFsQWx0ZXJuYXRlKj4oR2V0RW1iZWRPYmplY3QoKSk7Ci0gIHBHbG9iYWwtPkluaXRpYWwocFJ1bnRpbWUtPkdldEZvcm1GaWxsRW52KCkpOwotfQotCi1KU0dsb2JhbERhdGE6OkpTR2xvYmFsRGF0YSgpCi0gICAgOiBuVHlwZShKU19HbG9iYWxEYXRhVHlwZTo6TlVNQkVSKSwKLSAgICAgIGREYXRhKDApLAotICAgICAgYkRhdGEoZmFsc2UpLAotICAgICAgc0RhdGEoIiIpLAotICAgICAgYlBlcnNpc3RlbnQoZmFsc2UpLAotICAgICAgYkRlbGV0ZWQoZmFsc2UpIHt9Ci0KLUpTR2xvYmFsRGF0YTo6fkpTR2xvYmFsRGF0YSgpIHsKLSAgcERhdGEuUmVzZXQoKTsKLX0KLQotSlNHbG9iYWxBbHRlcm5hdGU6OkpTR2xvYmFsQWx0ZXJuYXRlKENKU19PYmplY3QqIHBKU09iamVjdCkKLSAgICA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpLCBtX3BGb3JtRmlsbEVudihudWxscHRyKSB7fQotCi1KU0dsb2JhbEFsdGVybmF0ZTo6fkpTR2xvYmFsQWx0ZXJuYXRlKCkgewotICBEZXN0cm95R2xvYmFsUGVyc2lzaXRlbnRWYXJpYWJsZXMoKTsKLSAgbV9wR2xvYmFsRGF0YS0+UmVsZWFzZSgpOwotfQotCi12b2lkIEpTR2xvYmFsQWx0ZXJuYXRlOjpJbml0aWFsKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSB7Ci0gIG1fcEZvcm1GaWxsRW52LlJlc2V0KHBGb3JtRmlsbEVudik7Ci0gIG1fcEdsb2JhbERhdGEgPSBDSlNfR2xvYmFsRGF0YTo6R2V0UmV0YWluZWRJbnN0YW5jZShwRm9ybUZpbGxFbnYpOwotICBVcGRhdGVHbG9iYWxQZXJzaXN0ZW50VmFyaWFibGVzKCk7Ci19Ci0KLWJvb2wgSlNHbG9iYWxBbHRlcm5hdGU6OlF1ZXJ5UHJvcGVydHkoY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lKSB7Ci0gIHJldHVybiBDRlhfV2lkZVN0cmluZyhwcm9wbmFtZSkgIT0gTCJzZXRQZXJzaXN0ZW50IjsKLX0KLQotYm9vbCBKU0dsb2JhbEFsdGVybmF0ZTo6RGVsUHJvcGVydHkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBhdXRvIGl0ID0gbV9tYXBHbG9iYWwuZmluZChDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocHJvcG5hbWUpKTsKLSAgaWYgKGl0ID09IG1fbWFwR2xvYmFsLmVuZCgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpdC0+c2Vjb25kLT5iRGVsZXRlZCA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEpTR2xvYmFsQWx0ZXJuYXRlOjpEb1Byb3BlcnR5KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHByb3BuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpZiAodnAuSXNTZXR0aW5nKCkpIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBzUHJvcE5hbWUgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocHJvcG5hbWUpOwotICAgIHN3aXRjaCAodnAuR2V0SlNWYWx1ZSgpLT5HZXRUeXBlKCkpIHsKLSAgICAgIGNhc2UgQ0pTX1ZhbHVlOjpWVF9udW1iZXI6IHsKLSAgICAgICAgZG91YmxlIGREYXRhOwotICAgICAgICB2cCA+PiBkRGF0YTsKLSAgICAgICAgcmV0dXJuIFNldEdsb2JhbFZhcmlhYmxlcyhzUHJvcE5hbWUsIEpTX0dsb2JhbERhdGFUeXBlOjpOVU1CRVIsIGREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ0pTX1ZhbHVlOjpWVF9ib29sZWFuOiB7Ci0gICAgICAgIGJvb2wgYkRhdGE7Ci0gICAgICAgIHZwID4+IGJEYXRhOwotICAgICAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR2xvYmFsRGF0YVR5cGU6OkJPT0xFQU4sIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkRhdGEsICIiLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgZmFsc2UpOwotICAgICAgfQotICAgICAgY2FzZSBDSlNfVmFsdWU6OlZUX3N0cmluZzogewotICAgICAgICBDRlhfQnl0ZVN0cmluZyBzRGF0YTsKLSAgICAgICAgdnAgPj4gc0RhdGE7Ci0gICAgICAgIHJldHVybiBTZXRHbG9iYWxWYXJpYWJsZXMoc1Byb3BOYW1lLCBKU19HbG9iYWxEYXRhVHlwZTo6U1RSSU5HLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBzRGF0YSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ0pTX1ZhbHVlOjpWVF9vYmplY3Q6IHsKLSAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBEYXRhOwotICAgICAgICB2cCA+PiBwRGF0YTsKLSAgICAgICAgcmV0dXJuIFNldEdsb2JhbFZhcmlhYmxlcyhzUHJvcE5hbWUsIEpTX0dsb2JhbERhdGFUeXBlOjpPQkpFQ1QsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICIiLCBwRGF0YSwgZmFsc2UpOwotICAgICAgfQotICAgICAgY2FzZSBDSlNfVmFsdWU6OlZUX251bGw6IHsKLSAgICAgICAgcmV0dXJuIFNldEdsb2JhbFZhcmlhYmxlcyhzUHJvcE5hbWUsIEpTX0dsb2JhbERhdGFUeXBlOjpOVUxMT0JKLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ0pTX1ZhbHVlOjpWVF91bmRlZmluZWQ6IHsKLSAgICAgICAgRGVsUHJvcGVydHkocFJ1bnRpbWUsIHByb3BuYW1lLCBzRXJyb3IpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBhdXRvIGl0ID0gbV9tYXBHbG9iYWwuZmluZChDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocHJvcG5hbWUpKTsKLSAgICBpZiAoaXQgPT0gbV9tYXBHbG9iYWwuZW5kKCkpIHsKLSAgICAgIHZwLkdldEpTVmFsdWUoKS0+U2V0TnVsbChwUnVudGltZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgSlNHbG9iYWxEYXRhKiBwRGF0YSA9IGl0LT5zZWNvbmQ7Ci0gICAgaWYgKHBEYXRhLT5iRGVsZXRlZCkgewotICAgICAgdnAuR2V0SlNWYWx1ZSgpLT5TZXROdWxsKHBSdW50aW1lKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBzd2l0Y2ggKHBEYXRhLT5uVHlwZSkgewotICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6TlVNQkVSOgotICAgICAgICB2cCA8PCBwRGF0YS0+ZERhdGE7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6Qk9PTEVBTjoKLSAgICAgICAgdnAgPDwgcERhdGEtPmJEYXRhOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6OlNUUklORzoKLSAgICAgICAgdnAgPDwgcERhdGEtPnNEYXRhOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6Ok9CSkVDVDogewotICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqID0gdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpOZXcoCi0gICAgICAgICAgICB2cC5HZXRKU1J1bnRpbWUoKS0+R2V0SXNvbGF0ZSgpLCBwRGF0YS0+cERhdGEpOwotICAgICAgICB2cCA8PCBvYmo7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6TlVMTE9CSjoKLSAgICAgICAgdnAuR2V0SlNWYWx1ZSgpLT5TZXROdWxsKHBSdW50aW1lKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEpTR2xvYmFsQWx0ZXJuYXRlOjpzZXRQZXJzaXN0ZW50KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBhdXRvIGl0ID0gbV9tYXBHbG9iYWwuZmluZChwYXJhbXNbMF0uVG9DRlhCeXRlU3RyaW5nKHBSdW50aW1lKSk7Ci0gIGlmIChpdCAhPSBtX21hcEdsb2JhbC5lbmQoKSkgewotICAgIEpTR2xvYmFsRGF0YSogcERhdGEgPSBpdC0+c2Vjb25kOwotICAgIGlmICghcERhdGEtPmJEZWxldGVkKSB7Ci0gICAgICBwRGF0YS0+YlBlcnNpc3RlbnQgPSBwYXJhbXNbMV0uVG9Cb29sKHBSdW50aW1lKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNOT0dMT0JBTCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBKU0dsb2JhbEFsdGVybmF0ZTo6VXBkYXRlR2xvYmFsUGVyc2lzdGVudFZhcmlhYmxlcygpIHsKLSAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0KLSAgICAgIHN0YXRpY19jYXN0PENKU19SdW50aW1lKj4oQ0ZYSlNfRW5naW5lOjpDdXJyZW50RW5naW5lRnJvbUlzb2xhdGUoCi0gICAgICAgICAgbV9wSlNPYmplY3QtPlRvVjhPYmplY3QoKS0+R2V0SXNvbGF0ZSgpKSk7Ci0KLSAgZm9yIChpbnQgaSA9IDAsIHN6ID0gbV9wR2xvYmFsRGF0YS0+R2V0U2l6ZSgpOyBpIDwgc3o7IGkrKykgewotICAgIENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBEYXRhID0gbV9wR2xvYmFsRGF0YS0+R2V0QXQoaSk7Ci0gICAgc3dpdGNoIChwRGF0YS0+ZGF0YS5uVHlwZSkgewotICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6TlVNQkVSOgotICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZXMocERhdGEtPmRhdGEuc0tleSwgSlNfR2xvYmFsRGF0YVR5cGU6Ok5VTUJFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5kYXRhLmREYXRhLCBmYWxzZSwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgcERhdGEtPmJQZXJzaXN0ZW50ID09IDEpOwotICAgICAgICBwUnVudGltZS0+UHV0T2JqZWN0UHJvcGVydHkobV9wSlNPYmplY3QtPlRvVjhPYmplY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5kYXRhLnNLZXkuVVRGOERlY29kZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bnRpbWUtPk5ld051bWJlcihwRGF0YS0+ZGF0YS5kRGF0YSkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6OkJPT0xFQU46Ci0gICAgICAgIFNldEdsb2JhbFZhcmlhYmxlcyhwRGF0YS0+ZGF0YS5zS2V5LCBKU19HbG9iYWxEYXRhVHlwZTo6Qk9PTEVBTiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5kYXRhLmJEYXRhID09IDEsICIiLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iUGVyc2lzdGVudCA9PSAxKTsKLSAgICAgICAgcFJ1bnRpbWUtPlB1dE9iamVjdFByb3BlcnR5KAotICAgICAgICAgICAgbV9wSlNPYmplY3QtPlRvVjhPYmplY3QoKSwgcERhdGEtPmRhdGEuc0tleS5VVEY4RGVjb2RlKCksCi0gICAgICAgICAgICBwUnVudGltZS0+TmV3Qm9vbGVhbihwRGF0YS0+ZGF0YS5iRGF0YSA9PSAxKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6U1RSSU5HOgotICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZXMocERhdGEtPmRhdGEuc0tleSwgSlNfR2xvYmFsRGF0YVR5cGU6OlNUUklORywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBwRGF0YS0+ZGF0YS5zRGF0YSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+YlBlcnNpc3RlbnQgPT0gMSk7Ci0gICAgICAgIHBSdW50aW1lLT5QdXRPYmplY3RQcm9wZXJ0eSgKLSAgICAgICAgICAgIG1fcEpTT2JqZWN0LT5Ub1Y4T2JqZWN0KCksIHBEYXRhLT5kYXRhLnNLZXkuVVRGOERlY29kZSgpLAotICAgICAgICAgICAgcFJ1bnRpbWUtPk5ld1N0cmluZyhwRGF0YS0+ZGF0YS5zRGF0YS5VVEY4RGVjb2RlKCkuQXNTdHJpbmdDKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpPQkpFQ1Q6IHsKLSAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmogPSBwUnVudGltZS0+TmV3RnhEeW5hbWljT2JqKC0xKTsKLSAgICAgICAgUHV0T2JqZWN0UHJvcGVydHkocE9iaiwgJnBEYXRhLT5kYXRhKTsKLSAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVzKHBEYXRhLT5kYXRhLnNLZXksIEpTX0dsb2JhbERhdGFUeXBlOjpPQkpFQ1QsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgIiIsIHBPYmosIHBEYXRhLT5iUGVyc2lzdGVudCA9PSAxKTsKLSAgICAgICAgcFJ1bnRpbWUtPlB1dE9iamVjdFByb3BlcnR5KG1fcEpTT2JqZWN0LT5Ub1Y4T2JqZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZGF0YS5zS2V5LlVURjhEZWNvZGUoKSwgcE9iaik7Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6TlVMTE9CSjoKLSAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVzKHBEYXRhLT5kYXRhLnNLZXksIEpTX0dsb2JhbERhdGFUeXBlOjpOVUxMT0JKLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICIiLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iUGVyc2lzdGVudCA9PSAxKTsKLSAgICAgICAgcFJ1bnRpbWUtPlB1dE9iamVjdFByb3BlcnR5KG1fcEpTT2JqZWN0LT5Ub1Y4T2JqZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+ZGF0YS5zS2V5LlVURjhEZWNvZGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW50aW1lLT5OZXdOdWxsKCkpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBKU0dsb2JhbEFsdGVybmF0ZTo6Q29tbWl0R2xvYmFsUGVyc2lzaXRlbnRWYXJpYWJsZXMoCi0gICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7Ci0gIGZvciAoYXV0byBpdCA9IG1fbWFwR2xvYmFsLmJlZ2luKCk7IGl0ICE9IG1fbWFwR2xvYmFsLmVuZCgpOyArK2l0KSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgbmFtZSA9IGl0LT5maXJzdDsKLSAgICBKU0dsb2JhbERhdGEqIHBEYXRhID0gaXQtPnNlY29uZDsKLSAgICBpZiAocERhdGEtPmJEZWxldGVkKSB7Ci0gICAgICBtX3BHbG9iYWxEYXRhLT5EZWxldGVHbG9iYWxWYXJpYWJsZShuYW1lKTsKLSAgICB9IGVsc2UgewotICAgICAgc3dpdGNoIChwRGF0YS0+blR5cGUpIHsKLSAgICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6TlVNQkVSOgotICAgICAgICAgIG1fcEdsb2JhbERhdGEtPlNldEdsb2JhbFZhcmlhYmxlTnVtYmVyKG5hbWUsIHBEYXRhLT5kRGF0YSk7Ci0gICAgICAgICAgbV9wR2xvYmFsRGF0YS0+U2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KG5hbWUsIHBEYXRhLT5iUGVyc2lzdGVudCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6OkJPT0xFQU46Ci0gICAgICAgICAgbV9wR2xvYmFsRGF0YS0+U2V0R2xvYmFsVmFyaWFibGVCb29sZWFuKG5hbWUsIHBEYXRhLT5iRGF0YSk7Ci0gICAgICAgICAgbV9wR2xvYmFsRGF0YS0+U2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KG5hbWUsIHBEYXRhLT5iUGVyc2lzdGVudCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6OlNUUklORzoKLSAgICAgICAgICBtX3BHbG9iYWxEYXRhLT5TZXRHbG9iYWxWYXJpYWJsZVN0cmluZyhuYW1lLCBwRGF0YS0+c0RhdGEpOwotICAgICAgICAgIG1fcEdsb2JhbERhdGEtPlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChuYW1lLCBwRGF0YS0+YlBlcnNpc3RlbnQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpPQkpFQ1Q6IHsKLSAgICAgICAgICBDSlNfR2xvYmFsVmFyaWFibGVBcnJheSBhcnJheTsKLSAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqID0gdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpOZXcoCi0gICAgICAgICAgICAgIEdldEpTT2JqZWN0KCktPkdldElzb2xhdGUoKSwgcERhdGEtPnBEYXRhKTsKLSAgICAgICAgICBPYmplY3RUb0FycmF5KHBSdW50aW1lLCBvYmosIGFycmF5KTsKLSAgICAgICAgICBtX3BHbG9iYWxEYXRhLT5TZXRHbG9iYWxWYXJpYWJsZU9iamVjdChuYW1lLCBhcnJheSk7Ci0gICAgICAgICAgbV9wR2xvYmFsRGF0YS0+U2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KG5hbWUsIHBEYXRhLT5iUGVyc2lzdGVudCk7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6Ok5VTExPQko6Ci0gICAgICAgICAgbV9wR2xvYmFsRGF0YS0+U2V0R2xvYmFsVmFyaWFibGVOdWxsKG5hbWUpOwotICAgICAgICAgIG1fcEdsb2JhbERhdGEtPlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChuYW1lLCBwRGF0YS0+YlBlcnNpc3RlbnQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIEpTR2xvYmFsQWx0ZXJuYXRlOjpPYmplY3RUb0FycmF5KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19HbG9iYWxWYXJpYWJsZUFycmF5JiBhcnJheSkgewotICBzdGQ6OnZlY3RvcjxDRlhfV2lkZVN0cmluZz4gcEtleUxpc3QgPSBwUnVudGltZS0+R2V0T2JqZWN0UHJvcGVydHlOYW1lcyhwT2JqKTsKLSAgZm9yIChjb25zdCBhdXRvJiB3cyA6IHBLZXlMaXN0KSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc0tleSA9IHdzLlVURjhFbmNvZGUoKTsKLSAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2ID0gcFJ1bnRpbWUtPkdldE9iamVjdFByb3BlcnR5KHBPYmosIHdzKTsKLSAgICBzd2l0Y2ggKENKU19WYWx1ZTo6R2V0VmFsdWVUeXBlKHYpKSB7Ci0gICAgICBjYXNlIENKU19WYWx1ZTo6VlRfbnVtYmVyOiB7Ci0gICAgICAgIENKU19LZXlWYWx1ZSogcE9iakVsZW1lbnQgPSBuZXcgQ0pTX0tleVZhbHVlOwotICAgICAgICBwT2JqRWxlbWVudC0+blR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6TlVNQkVSOwotICAgICAgICBwT2JqRWxlbWVudC0+c0tleSA9IHNLZXk7Ci0gICAgICAgIHBPYmpFbGVtZW50LT5kRGF0YSA9IHBSdW50aW1lLT5Ub0RvdWJsZSh2KTsKLSAgICAgICAgYXJyYXkuQWRkKHBPYmpFbGVtZW50KTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIENKU19WYWx1ZTo6VlRfYm9vbGVhbjogewotICAgICAgICBDSlNfS2V5VmFsdWUqIHBPYmpFbGVtZW50ID0gbmV3IENKU19LZXlWYWx1ZTsKLSAgICAgICAgcE9iakVsZW1lbnQtPm5UeXBlID0gSlNfR2xvYmFsRGF0YVR5cGU6OkJPT0xFQU47Ci0gICAgICAgIHBPYmpFbGVtZW50LT5zS2V5ID0gc0tleTsKLSAgICAgICAgcE9iakVsZW1lbnQtPmREYXRhID0gcFJ1bnRpbWUtPlRvQm9vbGVhbih2KTsKLSAgICAgICAgYXJyYXkuQWRkKHBPYmpFbGVtZW50KTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIENKU19WYWx1ZTo6VlRfc3RyaW5nOiB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIHNWYWx1ZSA9Ci0gICAgICAgICAgICBDSlNfVmFsdWUocFJ1bnRpbWUsIHYpLlRvQ0ZYQnl0ZVN0cmluZyhwUnVudGltZSk7Ci0gICAgICAgIENKU19LZXlWYWx1ZSogcE9iakVsZW1lbnQgPSBuZXcgQ0pTX0tleVZhbHVlOwotICAgICAgICBwT2JqRWxlbWVudC0+blR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6U1RSSU5HOwotICAgICAgICBwT2JqRWxlbWVudC0+c0tleSA9IHNLZXk7Ci0gICAgICAgIHBPYmpFbGVtZW50LT5zRGF0YSA9IHNWYWx1ZTsKLSAgICAgICAgYXJyYXkuQWRkKHBPYmpFbGVtZW50KTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIENKU19WYWx1ZTo6VlRfb2JqZWN0OiB7Ci0gICAgICAgIENKU19LZXlWYWx1ZSogcE9iakVsZW1lbnQgPSBuZXcgQ0pTX0tleVZhbHVlOwotICAgICAgICBwT2JqRWxlbWVudC0+blR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6T0JKRUNUOwotICAgICAgICBwT2JqRWxlbWVudC0+c0tleSA9IHNLZXk7Ci0gICAgICAgIE9iamVjdFRvQXJyYXkocFJ1bnRpbWUsIHBSdW50aW1lLT5Ub09iamVjdCh2KSwgcE9iakVsZW1lbnQtPm9iakRhdGEpOwotICAgICAgICBhcnJheS5BZGQocE9iakVsZW1lbnQpOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgQ0pTX1ZhbHVlOjpWVF9udWxsOiB7Ci0gICAgICAgIENKU19LZXlWYWx1ZSogcE9iakVsZW1lbnQgPSBuZXcgQ0pTX0tleVZhbHVlOwotICAgICAgICBwT2JqRWxlbWVudC0+blR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6TlVMTE9CSjsKLSAgICAgICAgcE9iakVsZW1lbnQtPnNLZXkgPSBzS2V5OwotICAgICAgICBhcnJheS5BZGQocE9iakVsZW1lbnQpOwotICAgICAgfSBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi12b2lkIEpTR2xvYmFsQWx0ZXJuYXRlOjpQdXRPYmplY3RQcm9wZXJ0eSh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENKU19LZXlWYWx1ZSogcERhdGEpIHsKLSAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gQ0pTX1J1bnRpbWU6OkN1cnJlbnRSdW50aW1lRnJvbUlzb2xhdGUoCi0gICAgICBtX3BKU09iamVjdC0+VG9WOE9iamVjdCgpLT5HZXRJc29sYXRlKCkpOwotCi0gIGZvciAoaW50IGkgPSAwLCBzeiA9IHBEYXRhLT5vYmpEYXRhLkNvdW50KCk7IGkgPCBzejsgaSsrKSB7Ci0gICAgQ0pTX0tleVZhbHVlKiBwT2JqRGF0YSA9IHBEYXRhLT5vYmpEYXRhLkdldEF0KGkpOwotICAgIHN3aXRjaCAocE9iakRhdGEtPm5UeXBlKSB7Ci0gICAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpOVU1CRVI6Ci0gICAgICAgIHBSdW50aW1lLT5QdXRPYmplY3RQcm9wZXJ0eShwT2JqLCBwT2JqRGF0YS0+c0tleS5VVEY4RGVjb2RlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnVudGltZS0+TmV3TnVtYmVyKHBPYmpEYXRhLT5kRGF0YSkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6OkJPT0xFQU46Ci0gICAgICAgIHBSdW50aW1lLT5QdXRPYmplY3RQcm9wZXJ0eShwT2JqLCBwT2JqRGF0YS0+c0tleS5VVEY4RGVjb2RlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnVudGltZS0+TmV3Qm9vbGVhbihwT2JqRGF0YS0+YkRhdGEgPT0gMSkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6OlNUUklORzoKLSAgICAgICAgcFJ1bnRpbWUtPlB1dE9iamVjdFByb3BlcnR5KAotICAgICAgICAgICAgcE9iaiwgcE9iakRhdGEtPnNLZXkuVVRGOERlY29kZSgpLAotICAgICAgICAgICAgcFJ1bnRpbWUtPk5ld1N0cmluZyhwT2JqRGF0YS0+c0RhdGEuVVRGOERlY29kZSgpLkFzU3RyaW5nQygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6T0JKRUNUOiB7Ci0gICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwTmV3T2JqID0gcFJ1bnRpbWUtPk5ld0Z4RHluYW1pY09iaigtMSk7Ci0gICAgICAgIFB1dE9iamVjdFByb3BlcnR5KHBOZXdPYmosIHBPYmpEYXRhKTsKLSAgICAgICAgcFJ1bnRpbWUtPlB1dE9iamVjdFByb3BlcnR5KHBPYmosIHBPYmpEYXRhLT5zS2V5LlVURjhEZWNvZGUoKSwgcE5ld09iaik7Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6TlVMTE9CSjoKLSAgICAgICAgcFJ1bnRpbWUtPlB1dE9iamVjdFByb3BlcnR5KHBPYmosIHBPYmpEYXRhLT5zS2V5LlVURjhEZWNvZGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW50aW1lLT5OZXdOdWxsKCkpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBKU0dsb2JhbEFsdGVybmF0ZTo6RGVzdHJveUdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKCkgewotICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtX21hcEdsb2JhbCkgewotICAgIGRlbGV0ZSBwYWlyLnNlY29uZDsKLSAgfQotICBtX21hcEdsb2JhbC5jbGVhcigpOwotfQotCi1ib29sIEpTR2xvYmFsQWx0ZXJuYXRlOjpTZXRHbG9iYWxWYXJpYWJsZXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHByb3BuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTX0dsb2JhbERhdGFUeXBlIG5UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRGVmYXVsdFBlcnNpc3RlbnQpIHsKLSAgaWYgKHByb3BuYW1lLklzRW1wdHkoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYXV0byBpdCA9IG1fbWFwR2xvYmFsLmZpbmQocHJvcG5hbWUpOwotICBpZiAoaXQgIT0gbV9tYXBHbG9iYWwuZW5kKCkpIHsKLSAgICBKU0dsb2JhbERhdGEqIHBUZW1wID0gaXQtPnNlY29uZDsKLSAgICBpZiAocFRlbXAtPmJEZWxldGVkIHx8IHBUZW1wLT5uVHlwZSAhPSBuVHlwZSkgewotICAgICAgcFRlbXAtPmREYXRhID0gMDsKLSAgICAgIHBUZW1wLT5iRGF0YSA9IDA7Ci0gICAgICBwVGVtcC0+c0RhdGEgPSAiIjsKLSAgICAgIHBUZW1wLT5uVHlwZSA9IG5UeXBlOwotICAgIH0KLQotICAgIHBUZW1wLT5iRGVsZXRlZCA9IGZhbHNlOwotICAgIHN3aXRjaCAoblR5cGUpIHsKLSAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6Ok5VTUJFUjogewotICAgICAgICBwVGVtcC0+ZERhdGEgPSBkRGF0YTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpCT09MRUFOOiB7Ci0gICAgICAgIHBUZW1wLT5iRGF0YSA9IGJEYXRhOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6OlNUUklORzogewotICAgICAgICBwVGVtcC0+c0RhdGEgPSBzRGF0YTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpPQkpFQ1Q6IHsKLSAgICAgICAgcFRlbXAtPnBEYXRhLlJlc2V0KHBEYXRhLT5HZXRJc29sYXRlKCksIHBEYXRhKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpOVUxMT0JKOgotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBKU0dsb2JhbERhdGEqIHBOZXdEYXRhID0gbnVsbHB0cjsKLQotICBzd2l0Y2ggKG5UeXBlKSB7Ci0gICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6TlVNQkVSOiB7Ci0gICAgICBwTmV3RGF0YSA9IG5ldyBKU0dsb2JhbERhdGE7Ci0gICAgICBwTmV3RGF0YS0+blR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6TlVNQkVSOwotICAgICAgcE5ld0RhdGEtPmREYXRhID0gZERhdGE7Ci0gICAgICBwTmV3RGF0YS0+YlBlcnNpc3RlbnQgPSBiRGVmYXVsdFBlcnNpc3RlbnQ7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpCT09MRUFOOiB7Ci0gICAgICBwTmV3RGF0YSA9IG5ldyBKU0dsb2JhbERhdGE7Ci0gICAgICBwTmV3RGF0YS0+blR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6Qk9PTEVBTjsKLSAgICAgIHBOZXdEYXRhLT5iRGF0YSA9IGJEYXRhOwotICAgICAgcE5ld0RhdGEtPmJQZXJzaXN0ZW50ID0gYkRlZmF1bHRQZXJzaXN0ZW50OwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6U1RSSU5HOiB7Ci0gICAgICBwTmV3RGF0YSA9IG5ldyBKU0dsb2JhbERhdGE7Ci0gICAgICBwTmV3RGF0YS0+blR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6U1RSSU5HOwotICAgICAgcE5ld0RhdGEtPnNEYXRhID0gc0RhdGE7Ci0gICAgICBwTmV3RGF0YS0+YlBlcnNpc3RlbnQgPSBiRGVmYXVsdFBlcnNpc3RlbnQ7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpPQkpFQ1Q6IHsKLSAgICAgIHBOZXdEYXRhID0gbmV3IEpTR2xvYmFsRGF0YTsKLSAgICAgIHBOZXdEYXRhLT5uVHlwZSA9IEpTX0dsb2JhbERhdGFUeXBlOjpPQkpFQ1Q7Ci0gICAgICBwTmV3RGF0YS0+cERhdGEuUmVzZXQocERhdGEtPkdldElzb2xhdGUoKSwgcERhdGEpOwotICAgICAgcE5ld0RhdGEtPmJQZXJzaXN0ZW50ID0gYkRlZmF1bHRQZXJzaXN0ZW50OwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6TlVMTE9CSjogewotICAgICAgcE5ld0RhdGEgPSBuZXcgSlNHbG9iYWxEYXRhOwotICAgICAgcE5ld0RhdGEtPm5UeXBlID0gSlNfR2xvYmFsRGF0YVR5cGU6Ok5VTExPQko7Ci0gICAgICBwTmV3RGF0YS0+YlBlcnNpc3RlbnQgPSBiRGVmYXVsdFBlcnNpc3RlbnQ7Ci0gICAgfSBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgbV9tYXBHbG9iYWxbcHJvcG5hbWVdID0gcE5ld0RhdGE7Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9qYXZhc2NyaXB0L2dsb2JhbC5oIGIvZnBkZnNkay9qYXZhc2NyaXB0L2dsb2JhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzEzOTI5Li4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvamF2YXNjcmlwdC9nbG9iYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGUERGU0RLX0pBVkFTQ1JJUFRfR0xPQkFMX0hfCi0jZGVmaW5lIEZQREZTREtfSkFWQVNDUklQVF9HTE9CQUxfSF8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX0tleVZhbHVlLmgiCi0KLWNsYXNzIENKU19HbG9iYWxEYXRhOwotY2xhc3MgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXk7Ci1jbGFzcyBDSlNfS2V5VmFsdWU7Ci0KLXN0cnVjdCBKU0dsb2JhbERhdGEgewotICBKU0dsb2JhbERhdGEoKTsKLSAgfkpTR2xvYmFsRGF0YSgpOwotCi0gIEpTX0dsb2JhbERhdGFUeXBlIG5UeXBlOwotICBkb3VibGUgZERhdGE7Ci0gIGJvb2wgYkRhdGE7Ci0gIENGWF9CeXRlU3RyaW5nIHNEYXRhOwotICB2ODo6R2xvYmFsPHY4OjpPYmplY3Q+IHBEYXRhOwotICBib29sIGJQZXJzaXN0ZW50OwotICBib29sIGJEZWxldGVkOwotfTsKLQotY2xhc3MgSlNHbG9iYWxBbHRlcm5hdGUgOiBwdWJsaWMgQ0pTX0VtYmVkT2JqIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEpTR2xvYmFsQWx0ZXJuYXRlKENKU19PYmplY3QqIHBKU09iamVjdCk7Ci0gIH5KU0dsb2JhbEFsdGVybmF0ZSgpIG92ZXJyaWRlOwotCi0gIGJvb2wgc2V0UGVyc2lzdGVudChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBRdWVyeVByb3BlcnR5KGNvbnN0IEZYX1dDSEFSKiBwcm9wbmFtZSk7Ci0gIGJvb2wgRG9Qcm9wZXJ0eShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHJvcG5hbWUsCi0gICAgICAgICAgICAgICAgICBDSlNfUHJvcFZhbHVlJiB2cCwKLSAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIERlbFByb3BlcnR5KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHJvcG5hbWUsCi0gICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIHZvaWQgSW5pdGlhbChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudik7Ci0KLSBwcml2YXRlOgotICB2b2lkIFVwZGF0ZUdsb2JhbFBlcnNpc3RlbnRWYXJpYWJsZXMoKTsKLSAgdm9pZCBDb21taXRHbG9iYWxQZXJzaXNpdGVudFZhcmlhYmxlcyhDSlNfUnVudGltZSogcFJ1bnRpbWUpOwotICB2b2lkIERlc3Ryb3lHbG9iYWxQZXJzaXNpdGVudFZhcmlhYmxlcygpOwotICBib29sIFNldEdsb2JhbFZhcmlhYmxlcyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgcHJvcG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEpTX0dsb2JhbERhdGFUeXBlIG5UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJEZWZhdWx0UGVyc2lzdGVudCk7Ci0gIHZvaWQgT2JqZWN0VG9BcnJheShDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwKLSAgICAgICAgICAgICAgICAgICAgIENKU19HbG9iYWxWYXJpYWJsZUFycmF5JiBhcnJheSk7Ci0gIHZvaWQgUHV0T2JqZWN0UHJvcGVydHkodjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iaiwgQ0pTX0tleVZhbHVlKiBwRGF0YSk7Ci0KLSAgc3RkOjptYXA8Q0ZYX0J5dGVTdHJpbmcsIEpTR2xvYmFsRGF0YSo+IG1fbWFwR2xvYmFsOwotICBDRlhfV2lkZVN0cmluZyBtX3NGaWxlUGF0aDsKLSAgQ0pTX0dsb2JhbERhdGEqIG1fcEdsb2JhbERhdGE7Ci0gIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6T2JzZXJ2ZWRQdHIgbV9wRm9ybUZpbGxFbnY7Ci19OwotCi1jbGFzcyBDSlNfR2xvYmFsIDogcHVibGljIENKU19PYmplY3QgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0pTX0dsb2JhbCh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9Ci0gIH5DSlNfR2xvYmFsKCkgb3ZlcnJpZGUge30KLQotICAvLyBDSlNfT2JqZWN0Ci0gIHZvaWQgSW5pdEluc3RhbmNlKElKU19SdW50aW1lKiBwSVJ1bnRpbWUpIG92ZXJyaWRlOwotCi0gIERFQ0xBUkVfU1BFQ0lBTF9KU19DTEFTUygpOwotICBKU19TUEVDSUFMX1NUQVRJQ19NRVRIT0Qoc2V0UGVyc2lzdGVudCwgSlNHbG9iYWxBbHRlcm5hdGUsIGdsb2JhbCk7Ci19OwotCi0jZW5kaWYgIC8vIEZQREZTREtfSkFWQVNDUklQVF9HTE9CQUxfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvamF2YXNjcmlwdC9panNfZXZlbnRfY29udGV4dC5oIGIvZnBkZnNkay9qYXZhc2NyaXB0L2lqc19ldmVudF9jb250ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MjgwNzIuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9qYXZhc2NyaXB0L2lqc19ldmVudF9jb250ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZQREZTREtfSkFWQVNDUklQVF9JSlNfRVZFTlRfQ09OVEVYVF9IXwotI2RlZmluZSBGUERGU0RLX0pBVkFTQ1JJUFRfSUpTX0VWRU5UX0NPTlRFWFRfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLQotY2xhc3MgQ1BERl9Cb29rbWFyazsKLWNsYXNzIENQREZfRm9ybUZpZWxkOwotY2xhc3MgQ1BERlNES19Bbm5vdDsKLWNsYXNzIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDsKLQotLy8gUmVjb3JkcyB0aGUgZGV0YWlscyBvZiBhbiBldmVudCBhbmQgdHJpZ2dlcnMgSlMgZXhlY3V0aW9uIGZvciBpdC4gVGhlcmUKLS8vIGNhbiBiZSBtb3JlIHRoYW4gb25lIG9mIHRoZXNlIGF0IGFueSBnaXZlbiB0aW1lLCBhcyBKUyBjYWxsYmFja3MgdG8gQysrCi0vLyBtYXkgdHJpZ2dlciBuZXcgZXZlbnRzIG9uIHRvcCBvZiBvbmUgYW5vdGhlci4KLWNsYXNzIElKU19FdmVudENvbnRleHQgewotIHB1YmxpYzoKLSAgdmlydHVhbCBib29sIFJ1blNjcmlwdChjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LAotICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nKiBpbmZvKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIE9uQXBwX0luaXQoKSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIE9uRG9jX09wZW4oQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJUYXJnZXROYW1lKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPbkRvY19XaWxsUHJpbnQoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uRG9jX0RpZFByaW50KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPbkRvY19XaWxsU2F2ZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25Eb2NfRGlkU2F2ZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25Eb2NfV2lsbENsb3NlKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIE9uUGFnZV9PcGVuKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPblBhZ2VfQ2xvc2UoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uUGFnZV9JblZpZXcoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uUGFnZV9PdXRWaWV3KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIE9uRmllbGRfTW91c2VEb3duKGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25GaWVsZF9Nb3VzZUVudGVyKGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPbkZpZWxkX01vdXNlRXhpdChib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uRmllbGRfTW91c2VVcChib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25GaWVsZF9Gb2N1cyhib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uRmllbGRfQmx1cihib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgVmFsdWUpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgT25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJSYykgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJXaWxsQ29tbWl0KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPbkZpZWxkX0tleXN0cm9rZShDRlhfV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBLZXlEb3duLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5TZWxFbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5TZWxTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJXaWxsQ29tbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmllbGRGdWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYlJjKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPbkZpZWxkX1ZhbGlkYXRlKENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiS2V5RG93biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiUmMpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgT25TY3JlZW5fRm9jdXMoYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uU2NyZWVuX0JsdXIoYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9PcGVuKGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25TY3JlZW5fQ2xvc2UoYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uU2NyZWVuX01vdXNlRG93bihib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9Nb3VzZVVwKGJvb2wgYk1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25TY3JlZW5fTW91c2VFbnRlcihib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uU2NyZWVuX01vdXNlRXhpdChib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9JblZpZXcoYm9vbCBiTW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25TY3JlZW5fT3V0Vmlldyhib29sIGJNb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgT25Cb29rbWFya19Nb3VzZVVwKENQREZfQm9va21hcmsqIHBCb29rTWFyaykgPSAwOwotICB2aXJ0dWFsIHZvaWQgT25MaW5rX01vdXNlVXAoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpID0gMDsKLQotICB2aXJ0dWFsIHZvaWQgT25NZW51X0V4ZWMoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uQmF0Y2hFeGVjKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPbkNvbnNvbGVfRXhlYygpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uRXh0ZXJuYWxfRXhlYygpID0gMDsKLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+SUpTX0V2ZW50Q29udGV4dCgpIHt9Ci19OwotCi0jZW5kaWYgIC8vIEZQREZTREtfSkFWQVNDUklQVF9JSlNfRVZFTlRfQ09OVEVYVF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9qYXZhc2NyaXB0L2lqc19ydW50aW1lLmggYi9mcGRmc2RrL2phdmFzY3JpcHQvaWpzX3J1bnRpbWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFiYzQxOC4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2phdmFzY3JpcHQvaWpzX3J1bnRpbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGUERGU0RLX0pBVkFTQ1JJUFRfSUpTX1JVTlRJTUVfSF8KLSNkZWZpbmUgRlBERlNES19KQVZBU0NSSVBUX0lKU19SVU5USU1FX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0KLSNpZmRlZiBQREZfRU5BQkxFX1hGQQotI2luY2x1ZGUgImZ4anMvZnhqc2UuaCIKLSNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKLQotY2xhc3MgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OwotY2xhc3MgSUpTX0V2ZW50Q29udGV4dDsKLQotLy8gT3ducyB0aGUgRkpYUyBvYmplY3RzIG5lZWRlZCB0byBhY3R1YWxseSBleGVjdXRlIEpTLgotY2xhc3MgSUpTX1J1bnRpbWUgewotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSh1bnNpZ25lZCBpbnQgc2xvdCwgdm9pZCogaXNvbGF0ZSk7Ci0gIHN0YXRpYyB2b2lkIERlc3Ryb3koKTsKLSAgc3RhdGljIElKU19SdW50aW1lKiBDcmVhdGUoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpOwotICB2aXJ0dWFsIH5JSlNfUnVudGltZSgpIHt9Ci0KLSAgdmlydHVhbCBJSlNfRXZlbnRDb250ZXh0KiBOZXdFdmVudENvbnRleHQoKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBSZWxlYXNlRXZlbnRDb250ZXh0KElKU19FdmVudENvbnRleHQqIHBDb250ZXh0KSA9IDA7Ci0gIHZpcnR1YWwgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBHZXRGb3JtRmlsbEVudigpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBpbnQgRXhlY3V0ZVNjcmlwdChjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nKiBpbmZvKSA9IDA7Ci0KLSNpZmRlZiBQREZfRU5BQkxFX1hGQQotICB2aXJ0dWFsIGJvb2wgR2V0VmFsdWVCeU5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB1dGY4TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFZhbHVlKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBTZXRWYWx1ZUJ5TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHV0ZjhOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpID0gMDsKLSNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKLQotIHByb3RlY3RlZDoKLSAgSUpTX1J1bnRpbWUoKSB7fQotfTsKLQotI2VuZGlmICAvLyBGUERGU0RLX0pBVkFTQ1JJUFRfSUpTX1JVTlRJTUVfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvamF2YXNjcmlwdC9wdWJsaWNfbWV0aG9kc19lbWJlZGRlcnRlc3QuY3BwIGIvZnBkZnNkay9qYXZhc2NyaXB0L3B1YmxpY19tZXRob2RzX2VtYmVkZGVydGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NzkzNjYuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9qYXZhc2NyaXB0L3B1YmxpY19tZXRob2RzX2VtYmVkZGVydGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSA8Y21hdGg+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9QdWJsaWNNZXRob2RzLmgiCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0jaW5jbHVkZSAidGVzdGluZy9qc19lbWJlZGRlcl90ZXN0LmgiCi0KLW5hbWVzcGFjZSB7Ci0KLWRvdWJsZSBSb3VuZERvd25EYXRlKGRvdWJsZSBkYXRlKSB7Ci0gIHJldHVybiBkYXRlIC0gZm1vZChkYXRlLCA4NjQwMDAwMCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1jbGFzcyBQdWJsaWNNZXRob2RzRW1iZWRkZXJUZXN0IDogcHVibGljIEpTRW1iZWRkZXJUZXN0IHt9OwotCi1URVNUX0YoUHVibGljTWV0aG9kc0VtYmVkZGVyVGVzdCwgTWFrZVJlZ3VsYXJEYXRlKSB7Ci0gIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUoKSk7Ci0gIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoaXNvbGF0ZSgpKTsKLSAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRfc2NvcGUoR2V0VjhDb250ZXh0KCkpOwotICBib29sIGJXcm9uZ0Zvcm1hdDsKLSAgZG91YmxlIGRhdGU7Ci0KLSAgLy8gMTk2OAotICBiV3JvbmdGb3JtYXQgPSBmYWxzZTsKLSAgZGF0ZSA9IENKU19QdWJsaWNNZXRob2RzOjpNYWtlUmVndWxhckRhdGUoTCIwNi8yNS8xOTY4IiwgTCJtbS9kZC95eXl5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJXcm9uZ0Zvcm1hdCk7Ci0gIGRhdGUgPSBSb3VuZERvd25EYXRlKGRhdGUpOwotICBFWFBFQ1RfRE9VQkxFX0VRKC00Nzg2NTYwMDAwMCwgZGF0ZSk7Ci0gIEVYUEVDVF9GQUxTRShiV3JvbmdGb3JtYXQpOwotCi0gIC8vIDE5NjgKLSAgYldyb25nRm9ybWF0ID0gZmFsc2U7Ci0gIGRhdGUgPSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKEwiMjUwNjE5NjgiLCBMImRkbW15eXl5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJXcm9uZ0Zvcm1hdCk7Ci0gIGRhdGUgPSBSb3VuZERvd25EYXRlKGRhdGUpOwotICBFWFBFQ1RfRE9VQkxFX0VRKC00Nzg2NTYwMDAwMCwgZGF0ZSk7Ci0gIEVYUEVDVF9GQUxTRShiV3JvbmdGb3JtYXQpOwotCi0gIC8vIDE5NjgKLSAgYldyb25nRm9ybWF0ID0gZmFsc2U7Ci0gIGRhdGUgPSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKEwiMTk2ODA2MjUiLCBMInl5eXltbWRkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJXcm9uZ0Zvcm1hdCk7Ci0gIGRhdGUgPSBSb3VuZERvd25EYXRlKGRhdGUpOwotICBFWFBFQ1RfRE9VQkxFX0VRKC00Nzg2NTYwMDAwMCwgZGF0ZSk7Ci0gIEVYUEVDVF9GQUxTRShiV3JvbmdGb3JtYXQpOwotCi0gIC8vIDE5ODUKLSAgYldyb25nRm9ybWF0ID0gZmFsc2U7Ci0gIGRhdGUgPSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKEwiMzExMjE5ODUiLCBMImRkbW15eXl5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJXcm9uZ0Zvcm1hdCk7Ci0gIGRhdGUgPSBSb3VuZERvd25EYXRlKGRhdGUpOwotICBFWFBFQ1RfRE9VQkxFX0VRKDUwNDgzNTIwMDAwMC4wLCBkYXRlKTsKLSAgRVhQRUNUX0ZBTFNFKGJXcm9uZ0Zvcm1hdCk7Ci0KLSAgLy8gMjA4NSwgdGhlIG90aGVyICc4NS4KLSAgYldyb25nRm9ybWF0ID0gZmFsc2U7Ci0gIGRhdGUgPQotICAgICAgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VSZWd1bGFyRGF0ZShMIjMxMTI4NSIsIEwiZGRtbXl5IiwgJmJXcm9uZ0Zvcm1hdCk7Ci0gIGRhdGUgPSBSb3VuZERvd25EYXRlKGRhdGUpOwotICBFWFBFQ1RfRE9VQkxFX0VRKDM2NjA1OTUyMDAwMDAuMCwgZGF0ZSk7Ci0gIEVYUEVDVF9GQUxTRShiV3JvbmdGb3JtYXQpOwotCi0gIC8vIDE5OTUKLSAgYldyb25nRm9ybWF0ID0gZmFsc2U7Ci0gIGRhdGUgPSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKEwiMDEwMjE5OTUiLCBMImRkbW15eXl5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJXcm9uZ0Zvcm1hdCk7Ci0gIGRhdGUgPSBSb3VuZERvd25EYXRlKGRhdGUpOwotICBFWFBFQ1RfRE9VQkxFX0VRKDc5MTU5NjgwMDAwMC4wLCBkYXRlKTsKLSAgRVhQRUNUX0ZBTFNFKGJXcm9uZ0Zvcm1hdCk7Ci0KLSAgLy8gMjA5NSwgdGhlIG90aGVyICc5NS4KLSAgYldyb25nRm9ybWF0ID0gZmFsc2U7Ci0gIGRhdGUgPQotICAgICAgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VSZWd1bGFyRGF0ZShMIjAxMDI5NSIsIEwiZGRtbXl5IiwgJmJXcm9uZ0Zvcm1hdCk7Ci0gIGRhdGUgPSBSb3VuZERvd25EYXRlKGRhdGUpOwotICBFWFBFQ1RfRE9VQkxFX0VRKDM5NDczNTY4MDAwMDAuMCwgZGF0ZSk7Ci0gIEVYUEVDVF9GQUxTRShiV3JvbmdGb3JtYXQpOwotCi0gIC8vIDIwMDUKLSAgYldyb25nRm9ybWF0ID0gZmFsc2U7Ci0gIGRhdGUgPSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKEwiMDEwMjIwMDUiLCBMImRkbW15eXl5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJXcm9uZ0Zvcm1hdCk7Ci0gIGRhdGUgPSBSb3VuZERvd25EYXRlKGRhdGUpOwotICBFWFBFQ1RfRE9VQkxFX0VRKDExMDcyMTYwMDAwMDAuMCwgZGF0ZSk7Ci0gIEVYUEVDVF9GQUxTRShiV3JvbmdGb3JtYXQpOwotCi0gIC8vIDIwMDUKLSAgYldyb25nRm9ybWF0ID0gZmFsc2U7Ci0gIGRhdGUgPQotICAgICAgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VSZWd1bGFyRGF0ZShMIjAxMDIwNSIsIEwiZGRtbXl5IiwgJmJXcm9uZ0Zvcm1hdCk7Ci0gIGRhdGUgPSBSb3VuZERvd25EYXRlKGRhdGUpOwotICBFWFBFQ1RfRE9VQkxFX0VRKDExMDcyMTYwMDAwMDAuMCwgZGF0ZSk7Ci0gIEVYUEVDVF9GQUxTRShiV3JvbmdGb3JtYXQpOwotfQotCi1URVNUX0YoUHVibGljTWV0aG9kc0VtYmVkZGVyVGVzdCwgTWFrZUZvcm1hdERhdGUpIHsKLSAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSgpKTsKLSAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKCkpOwotICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZShHZXRWOENvbnRleHQoKSk7Ci0gIENGWF9XaWRlU3RyaW5nIGZvcm1hdHRlZF9kYXRlOwotCi0gIC8vIDE5NjgtMDYtMjUKLSAgZm9ybWF0dGVkX2RhdGUgPSBDSlNfUHVibGljTWV0aG9kczo6TWFrZUZvcm1hdERhdGUoLTQ3OTUyMDAwMDAwLCBMImRkbW15eSIpOwotICBFWFBFQ1RfU1RSRVEoTCIyNTA2NjgiLCBmb3JtYXR0ZWRfZGF0ZS5jX3N0cigpKTsKLSAgZm9ybWF0dGVkX2RhdGUgPSBDSlNfUHVibGljTWV0aG9kczo6TWFrZUZvcm1hdERhdGUoLTQ3OTUyMDAwMDAwLCBMInl5L21tL2RkIik7Ci0gIEVYUEVDVF9TVFJFUShMIjY4LzA2LzI1IiwgZm9ybWF0dGVkX2RhdGUuY19zdHIoKSk7Ci0KLSAgLy8gMTk2OS0xMi0zMQotICBmb3JtYXR0ZWRfZGF0ZSA9IENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZSgtMC4wMDAxLCBMImRkbW15eSIpOwotICBFWFBFQ1RfU1RSRVEoTCIzMTEyNjkiLCBmb3JtYXR0ZWRfZGF0ZS5jX3N0cigpKTsKLSAgZm9ybWF0dGVkX2RhdGUgPSBDSlNfUHVibGljTWV0aG9kczo6TWFrZUZvcm1hdERhdGUoLTAuMDAwMSwgTCJ5eSFtbWRkIik7Ci0gIEVYUEVDVF9TVFJFUShMIjY5ITEyMzEiLCBmb3JtYXR0ZWRfZGF0ZS5jX3N0cigpKTsKLQotICAvLyAxOTcwLTAxLTAxCi0gIGZvcm1hdHRlZF9kYXRlID0gQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VGb3JtYXREYXRlKDAsIEwiZGRtbXl5Iik7Ci0gIEVYUEVDVF9TVFJFUShMIjAxMDE3MCIsIGZvcm1hdHRlZF9kYXRlLmNfc3RyKCkpOwotICBmb3JtYXR0ZWRfZGF0ZSA9IENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZSgwLCBMIm1tLXl5eXktZGQiKTsKLSAgRVhQRUNUX1NUUkVRKEwiMDEtMTk3MC0wMSIsIGZvcm1hdHRlZF9kYXRlLmNfc3RyKCkpOwotCi0gIC8vIDE5ODUtMTItMzEKLSAgZm9ybWF0dGVkX2RhdGUgPSBDSlNfUHVibGljTWV0aG9kczo6TWFrZUZvcm1hdERhdGUoNTA0ODM1MjAwMDAwLjAsIEwiZGRtbXl5Iik7Ci0gIEVYUEVDVF9TVFJFUShMIjMxMTI4NSIsIGZvcm1hdHRlZF9kYXRlLmNfc3RyKCkpOwotICBmb3JtYXR0ZWRfZGF0ZSA9IENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZSg1MDQ4MzUyMDAwMDAuMCwgTCJ5eW1tZGQiKTsKLSAgRVhQRUNUX1NUUkVRKEwiODUxMjMxIiwgZm9ybWF0dGVkX2RhdGUuY19zdHIoKSk7Ci0KLSAgLy8gMTk5NS0wMi0wMQotICBmb3JtYXR0ZWRfZGF0ZSA9IENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZSg3OTE1OTY4MDAwMDAuMCwgTCJkZG1teXkiKTsKLSAgRVhQRUNUX1NUUkVRKEwiMDEwMjk1IiwgZm9ybWF0dGVkX2RhdGUuY19zdHIoKSk7Ci0gIGZvcm1hdHRlZF9kYXRlID0KLSAgICAgIENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZSg3OTE1OTY4MDAwMDAuMCwgTCJ5eXl5bW1kZCIpOwotICBFWFBFQ1RfU1RSRVEoTCIxOTk1MDIwMSIsIGZvcm1hdHRlZF9kYXRlLmNfc3RyKCkpOwotCi0gIC8vIDIwMDUtMDItMDEKLSAgZm9ybWF0dGVkX2RhdGUgPQotICAgICAgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VGb3JtYXREYXRlKDExMDcyMTYwMDAwMDAuMCwgTCJkZG1teXkiKTsKLSAgRVhQRUNUX1NUUkVRKEwiMDEwMjA1IiwgZm9ybWF0dGVkX2RhdGUuY19zdHIoKSk7Ci0gIGZvcm1hdHRlZF9kYXRlID0KLSAgICAgIENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZSgxMTA3MjE2MDAwMDAwLjAsIEwieXl5eWRkbW0iKTsKLSAgRVhQRUNUX1NUUkVRKEwiMjAwNTAxMDIiLCBmb3JtYXR0ZWRfZGF0ZS5jX3N0cigpKTsKLQotICAvLyAyMDg1LTEyLTMxCi0gIGZvcm1hdHRlZF9kYXRlID0KLSAgICAgIENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZSgzNjYwNTk1MjAwMDAwLjAsIEwiZGRtbXl5Iik7Ci0gIEVYUEVDVF9TVFJFUShMIjMxMTI4NSIsIGZvcm1hdHRlZF9kYXRlLmNfc3RyKCkpOwotICBmb3JtYXR0ZWRfZGF0ZSA9Ci0gICAgICBDSlNfUHVibGljTWV0aG9kczo6TWFrZUZvcm1hdERhdGUoMzY2MDU5NTIwMDAwMC4wLCBMInl5eXlkZCIpOwotICBFWFBFQ1RfU1RSRVEoTCIyMDg1MzEiLCBmb3JtYXR0ZWRfZGF0ZS5jX3N0cigpKTsKLQotICAvLyAyMDk1LTAyLTAxCi0gIGZvcm1hdHRlZF9kYXRlID0KLSAgICAgIENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZSgzOTQ3MzU2ODAwMDAwLjAsIEwiZGRtbXl5Iik7Ci0gIEVYUEVDVF9TVFJFUShMIjAxMDI5NSIsIGZvcm1hdHRlZF9kYXRlLmNfc3RyKCkpOwotICBmb3JtYXR0ZWRfZGF0ZSA9Ci0gICAgICBDSlNfUHVibGljTWV0aG9kczo6TWFrZUZvcm1hdERhdGUoMzk0NzM1NjgwMDAwMC4wLCBMIm1tZGR5eXl5Iik7Ci0gIEVYUEVDVF9TVFJFUShMIjAyMDEyMDk1IiwgZm9ybWF0dGVkX2RhdGUuY19zdHIoKSk7Ci19CmRpZmYgLS1naXQgYS9mcGRmc2RrL2phdmFzY3JpcHQvcHVibGljX21ldGhvZHNfdW5pdHRlc3QuY3BwIGIvZnBkZnNkay9qYXZhc2NyaXB0L3B1YmxpY19tZXRob2RzX3VuaXR0ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNlMDkyMC4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2phdmFzY3JpcHQvcHVibGljX21ldGhvZHNfdW5pdHRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L1B1YmxpY01ldGhvZHMuaCIKLQotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgInRlc3RpbmcvdGVzdF9zdXBwb3J0LmgiCi0KLVRFU1QoQ0pTX1B1YmxpY01ldGhvZHMsIElzTnVtYmVyKSB7Ci0gIC8vIFRPRE8od2VpbGkpOiBDaGVjayB3aGV0aGVyIHJlc3VsdHMgZnJvbSBjYXNlIDAsIDEsIDEwLCAxNSBhcmUgaW50ZW5kZWQuCi0gIHN0cnVjdCB7Ci0gICAgY29uc3Qgd2NoYXJfdCogaW5wdXQ7Ci0gICAgYm9vbCBleHBlY3RlZDsKLSAgfSB0ZXN0X2RhdGFbXSA9IHsKLSAgICAgIC8vIEVtcHR5IHN0cmluZy4KLSAgICAgIHtMIiIsIHRydWV9LAotICAgICAgLy8gT25seSB3aGl0ZXNwYWNlcy4KLSAgICAgIHtMIiAgIiwgdHJ1ZX0sCi0gICAgICAvLyBDb250ZW50IHdpdGggaW52YWxpZCBjaGFyYWN0ZXJzLgotICAgICAge0wieHl6MDAiLCBmYWxzZX0sCi0gICAgICB7TCIxJSIsIGZhbHNlfSwKLSAgICAgIC8vIEhleCBzdHJpbmcuCi0gICAgICB7TCIweDIzNCIsIGZhbHNlfSwKLSAgICAgIC8vIFNpZ25lZCBudW1iZXJzLgotICAgICAge0wiKzEyMyIsIHRydWV9LAotICAgICAge0wiLTk4NzY1IiwgdHJ1ZX0sCi0gICAgICAvLyBOdW1iZXJzIHdpdGggd2hpdGVzcGFjZXMuCi0gICAgICB7TCIgIDM0NSAiLCB0cnVlfSwKLSAgICAgIC8vIEZsb2F0IG51bWJlcnMuCi0gICAgICB7TCItMWU1IiwgZmFsc2V9LAotICAgICAge0wiLTJlIiwgZmFsc2V9LAotICAgICAge0wiZS01IiwgdHJ1ZX0sCi0gICAgICB7TCIwLjAyMyIsIHRydWV9LAotICAgICAge0wiLjM1NjA4OSIsIHRydWV9LAotICAgICAge0wiMWUtOSIsIHRydWV9LAotICAgICAge0wiLTEuMjNlKzIzIiwgdHJ1ZX0sCi0gICAgICAvLyBOdW1iZXJzIHdpdGggY29tbWFzLgotICAgICAge0wiMSwwMDAsMDAwIiwgZmFsc2V9LAotICAgICAge0wiNTYwLDAyNCIsIHRydWV9LAotICAgICAgLy8gUmVndWxhciBudW1iZXJzLgotICAgICAge0wiMCIsIHRydWV9LAotICAgICAge0wiMDEyMyIsIHRydWV9LAotICAgICAge0wiOTg3NjEyMyIsIHRydWV9LAotICB9OwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0X2RhdGEpOyArK2kpIHsKLSAgICBFWFBFQ1RfRVEodGVzdF9kYXRhW2ldLmV4cGVjdGVkLAotICAgICAgICAgICAgICBDSlNfUHVibGljTWV0aG9kczo6SXNOdW1iZXIodGVzdF9kYXRhW2ldLmlucHV0KSkKLSAgICAgICAgPDwgImZvciBjYXNlICIgPDwgaTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9qYXZhc2NyaXB0L3JlcG9ydC5jcHAgYi9mcGRmc2RrL2phdmFzY3JpcHQvcmVwb3J0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzljOTg2ZC4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2phdmFzY3JpcHQvcmVwb3J0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9yZXBvcnQuaCIKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19EZWZpbmUuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfT2JqZWN0LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX1ZhbHVlLmgiCi0KLUpTQ29uc3RTcGVjIENKU19SZXBvcnQ6OkNvbnN0U3BlY3NbXSA9IHt7MCwgSlNDb25zdFNwZWM6Ok51bWJlciwgMCwgMH19OwotCi1KU1Byb3BlcnR5U3BlYyBDSlNfUmVwb3J0OjpQcm9wZXJ0eVNwZWNzW10gPSB7ezAsIDAsIDB9fTsKLQotSlNNZXRob2RTcGVjIENKU19SZXBvcnQ6Ok1ldGhvZFNwZWNzW10gPSB7eyJzYXZlIiwgc2F2ZV9zdGF0aWN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJ3cml0ZVRleHQiLCB3cml0ZVRleHRfc3RhdGljfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLCAwfX07Ci0KLUlNUExFTUVOVF9KU19DTEFTUyhDSlNfUmVwb3J0LCBSZXBvcnQpCi0KLVJlcG9ydDo6UmVwb3J0KENKU19PYmplY3QqIHBKU09iamVjdCkgOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KSB7fQotCi1SZXBvcnQ6On5SZXBvcnQoKSB7fQotCi1ib29sIFJlcG9ydDo6d3JpdGVUZXh0KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBSZXBvcnQ6OnNhdmUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCi0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9qYXZhc2NyaXB0L3JlcG9ydC5oIGIvZnBkZnNkay9qYXZhc2NyaXB0L3JlcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjZkYjgwLi4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvamF2YXNjcmlwdC9yZXBvcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGUERGU0RLX0pBVkFTQ1JJUFRfUkVQT1JUX0hfCi0jZGVmaW5lIEZQREZTREtfSkFWQVNDUklQVF9SRVBPUlRfSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19EZWZpbmUuaCIKLQotY2xhc3MgUmVwb3J0IDogcHVibGljIENKU19FbWJlZE9iaiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBSZXBvcnQoQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKLSAgflJlcG9ydCgpIG92ZXJyaWRlOwotCi0gcHVibGljOgotICBib29sIHNhdmUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgd3JpdGVUZXh0KENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotfTsKLQotY2xhc3MgQ0pTX1JlcG9ydCA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENKU19SZXBvcnQodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQotICB+Q0pTX1JlcG9ydCgpIG92ZXJyaWRlIHt9Ci0KLSAgREVDTEFSRV9KU19DTEFTUygpOwotCi0gIEpTX1NUQVRJQ19NRVRIT0Qoc2F2ZSwgUmVwb3J0KQotICBKU19TVEFUSUNfTUVUSE9EKHdyaXRlVGV4dCwgUmVwb3J0KTsKLX07Ci0KLSNlbmRpZiAgLy8gRlBERlNES19KQVZBU0NSSVBUX1JFUE9SVF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9qYXZhc2NyaXB0L3Jlc291cmNlLmNwcCBiL2ZwZGZzZGsvamF2YXNjcmlwdC9yZXNvdXJjZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMTNjNTQuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9qYXZhc2NyaXB0L3Jlc291cmNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9yZXNvdXJjZS5oIgotCi1DRlhfV2lkZVN0cmluZyBKU0dldFN0cmluZ0Zyb21JRCh1aW50MzJfdCBpZCkgewotICBzd2l0Y2ggKGlkKSB7Ci0gICAgY2FzZSBJRFNfU1RSSU5HX0pTQUxFUlQ6Ci0gICAgICByZXR1cm4gTCJBbGVydCI7Ci0gICAgY2FzZSBJRFNfU1RSSU5HX0pTUEFSQU1FUlJPUjoKLSAgICAgIHJldHVybiBMIkluY29ycmVjdCBudW1iZXIgb2YgcGFyYW1ldGVycyBwYXNzZWQgdG8gZnVuY3Rpb24uIjsKLSAgICBjYXNlIElEU19TVFJJTkdfSlNBRk5VTUJFUl9LRVlTVFJPS0U6Ci0gICAgICByZXR1cm4gTCJUaGUgaW5wdXQgdmFsdWUgaXMgaW52YWxpZC4iOwotICAgIGNhc2UgSURTX1NUUklOR19KU1BBUkFNX1RPT0xPTkc6Ci0gICAgICByZXR1cm4gTCJUaGUgaW5wdXQgdmFsdWUgaXMgdG9vIGxvbmcuIjsKLSAgICBjYXNlIElEU19TVFJJTkdfSlNQQVJTRURBVEU6Ci0gICAgICByZXR1cm4gTCJUaGUgaW5wdXQgdmFsdWUgY2FuJ3QgYmUgcGFyc2VkIGFzIGEgdmFsaWQgZGF0ZS90aW1lICglcykuIjsKLSAgICBjYXNlIElEU19TVFJJTkdfSlNSQU5HRTE6Ci0gICAgICByZXR1cm4gTCJUaGUgaW5wdXQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMiCi0gICAgICAgICAgICAgTCIgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcy4iOwotICAgIGNhc2UgSURTX1NUUklOR19KU1JBTkdFMjoKLSAgICAgIHJldHVybiBMIlRoZSBpbnB1dCB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcy4iOwotICAgIGNhc2UgSURTX1NUUklOR19KU1JBTkdFMzoKLSAgICAgIHJldHVybiBMIlRoZSBpbnB1dCB2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcy4iOwotICAgIGNhc2UgSURTX1NUUklOR19KU05PVFNVUFBPUlQ6Ci0gICAgICByZXR1cm4gTCJPcGVyYXRpb24gbm90IHN1cHBvcnRlZC4iOwotICAgIGNhc2UgSURTX1NUUklOR19KU0JVU1k6Ci0gICAgICByZXR1cm4gTCJTeXN0ZW0gaXMgYnVzeS4iOwotICAgIGNhc2UgSURTX1NUUklOR19KU0VWRU5UOgotICAgICAgcmV0dXJuIEwiRHVwbGljYXRlIGZvcm1maWVsZCBldmVudCBmb3VuZC4iOwotICAgIGNhc2UgSURTX1NUUklOR19SVU46Ci0gICAgICByZXR1cm4gTCJTY3JpcHQgcmFuIHN1Y2Nlc3NmdWxseS4iOwotICAgIGNhc2UgSURTX1NUUklOR19KU1BSSU5UMToKLSAgICAgIHJldHVybiBMIlRoZSBzZWNvbmQgcGFyYW1ldGVyIGNhbid0IGJlIGNvbnZlcnRlZCB0byBhIERhdGUuIjsKLSAgICBjYXNlIElEU19TVFJJTkdfSlNQUklOVDI6Ci0gICAgICByZXR1cm4gTCJUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhbiBpbnZhbGlkIERhdGUhIjsKLSAgICBjYXNlIElEU19TVFJJTkdfSlNOT0dMT0JBTDoKLSAgICAgIHJldHVybiBMIkdsb2JhbCB2YWx1ZSBub3QgZm91bmQuIjsKLSAgICBjYXNlIElEU19TVFJJTkdfSlNSRUFET05MWToKLSAgICAgIHJldHVybiBMIkNhbm5vdCBhc3NpZ24gdG8gcmVhZG9ubHkgcHJvcGVydHkuIjsKLSAgICBjYXNlIElEU19TVFJJTkdfSlNUWVBFRVJST1I6Ci0gICAgICByZXR1cm4gTCJJbmNvcnJlY3QgcGFyYW1ldGVyIHR5cGUuIjsKLSAgICBjYXNlIElEU19TVFJJTkdfSlNWQUxVRUVSUk9SOgotICAgICAgcmV0dXJuIEwiSW5jb3JyZWN0IHBhcmFtZXRlciB2YWx1ZS4iOwotICAgIGNhc2UgSURTX1NUUklOR19KU05PUEVSTUlTU0lPTjoKLSAgICAgIHJldHVybiBMIlBlcm1pc3Npb24gZGVuaWVkLiI7Ci0gICAgY2FzZSBJRFNfU1RSSU5HX0pTQkFET0JKRUNUOgotICAgICAgcmV0dXJuIEwiT2JqZWN0IG5vIGxvbmdlciBleGlzdHMuIjsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEwiIjsKLSAgfQotfQotCi1DRlhfV2lkZVN0cmluZyBKU0Zvcm1hdEVycm9yU3RyaW5nKGNvbnN0IGNoYXIqIGNsYXNzX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByb3BlcnR5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBkZXRhaWxzKSB7Ci0gIENGWF9XaWRlU3RyaW5nIHJlc3VsdCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoY2xhc3NfbmFtZSk7Ci0gIGlmIChwcm9wZXJ0eV9uYW1lKSB7Ci0gICAgcmVzdWx0ICs9IEwiLiI7Ci0gICAgcmVzdWx0ICs9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwocHJvcGVydHlfbmFtZSk7Ci0gIH0KLSAgcmVzdWx0ICs9IEwiOiAiOwotICByZXN1bHQgKz0gZGV0YWlsczsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvamF2YXNjcmlwdC9yZXNvdXJjZS5oIGIvZnBkZnNkay9qYXZhc2NyaXB0L3Jlc291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNzc4OGYuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9qYXZhc2NyaXB0L3Jlc291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19KQVZBU0NSSVBUX1JFU09VUkNFX0hfCi0jZGVmaW5lIEZQREZTREtfSkFWQVNDUklQVF9SRVNPVVJDRV9IXwotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLQotY2xhc3MgQ0pTX0V2ZW50Q29udGV4dDsKLQotI2RlZmluZSBJRFNfU1RSSU5HX0pTQUxFUlQgMjU2MTMKLSNkZWZpbmUgSURTX1NUUklOR19KU1BBUkFNRVJST1IgMjU2MTQKLSNkZWZpbmUgSURTX1NUUklOR19KU0FGTlVNQkVSX0tFWVNUUk9LRSAyNTYxNQotI2RlZmluZSBJRFNfU1RSSU5HX0pTUEFSQU1fVE9PTE9ORyAyNTYxNwotI2RlZmluZSBJRFNfU1RSSU5HX0pTUEFSU0VEQVRFIDI1NjE4Ci0jZGVmaW5lIElEU19TVFJJTkdfSlNSQU5HRTEgMjU2MTkKLSNkZWZpbmUgSURTX1NUUklOR19KU1JBTkdFMiAyNTYyMAotI2RlZmluZSBJRFNfU1RSSU5HX0pTUkFOR0UzIDI1NjIxCi0jZGVmaW5lIElEU19TVFJJTkdfSlNOT1RTVVBQT1JUIDI1NjI3Ci0jZGVmaW5lIElEU19TVFJJTkdfSlNCVVNZIDI1NjI4Ci0jZGVmaW5lIElEU19TVFJJTkdfSlNFVkVOVCAyNTYyOQotI2RlZmluZSBJRFNfU1RSSU5HX1JVTiAyNTYzMAotI2RlZmluZSBJRFNfU1RSSU5HX0pTUFJJTlQxIDI1NjMyCi0jZGVmaW5lIElEU19TVFJJTkdfSlNQUklOVDIgMjU2MzMKLSNkZWZpbmUgSURTX1NUUklOR19KU05PR0xPQkFMIDI1NjM1Ci0jZGVmaW5lIElEU19TVFJJTkdfSlNSRUFET05MWSAyNTYzNgotI2RlZmluZSBJRFNfU1RSSU5HX0pTVFlQRUVSUk9SIDI1NjM3Ci0jZGVmaW5lIElEU19TVFJJTkdfSlNWQUxVRUVSUk9SIDI1NjM4Ci0jZGVmaW5lIElEU19TVFJJTkdfSlNOT1BFUk1JU1NJT04gMjU2MzkKLSNkZWZpbmUgSURTX1NUUklOR19KU0JBRE9CSkVDVCAyNTY0MAotCi1DRlhfV2lkZVN0cmluZyBKU0dldFN0cmluZ0Zyb21JRCh1aW50MzJfdCBpZCk7Ci1DRlhfV2lkZVN0cmluZyBKU0Zvcm1hdEVycm9yU3RyaW5nKGNvbnN0IGNoYXIqIGNsYXNzX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByb3BlcnR5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBkZXRhaWxzKTsKLQotI2VuZGlmICAvLyBGUERGU0RLX0pBVkFTQ1JJUFRfUkVTT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvamF2YXNjcmlwdC91dGlsLmNwcCBiL2ZwZGZzZGsvamF2YXNjcmlwdC91dGlsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIyMWNmYi4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL2phdmFzY3JpcHQvdXRpbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NjIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L3V0aWwuaCIKLQotI2luY2x1ZGUgPHRpbWUuaD4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9leHQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfRGVmaW5lLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9qYXZhc2NyaXB0L0pTX0V2ZW50SGFuZGxlci5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19PYmplY3QuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvSlNfVmFsdWUuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2phdmFzY3JpcHQvUHVibGljTWV0aG9kcy5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9janNfZXZlbnRfY29udGV4dC5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9janNfcnVudGltZS5oIgotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9yZXNvdXJjZS5oIgotCi0jaWYgX0ZYX09TXyA9PSBfRlhfQU5EUk9JRF8KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2VuZGlmCi0KLUpTQ29uc3RTcGVjIENKU19VdGlsOjpDb25zdFNwZWNzW10gPSB7ezAsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDAsIDB9fTsKLQotSlNQcm9wZXJ0eVNwZWMgQ0pTX1V0aWw6OlByb3BlcnR5U3BlY3NbXSA9IHt7MCwgMCwgMH19OwotCi1KU01ldGhvZFNwZWMgQ0pTX1V0aWw6Ok1ldGhvZFNwZWNzW10gPSB7Ci0gICAgeyJwcmludGQiLCBwcmludGRfc3RhdGljfSwgICAgICAgICB7InByaW50ZiIsIHByaW50Zl9zdGF0aWN9LAotICAgIHsicHJpbnR4IiwgcHJpbnR4X3N0YXRpY30sICAgICAgICAgeyJzY2FuZCIsIHNjYW5kX3N0YXRpY30sCi0gICAgeyJieXRlVG9DaGFyIiwgYnl0ZVRvQ2hhcl9zdGF0aWN9LCB7MCwgMH19OwotCi1JTVBMRU1FTlRfSlNfQ0xBU1MoQ0pTX1V0aWwsIHV0aWwpCi0KLSNkZWZpbmUgVVRJTF9JTlQgMAotI2RlZmluZSBVVElMX0RPVUJMRSAxCi0jZGVmaW5lIFVUSUxfU1RSSU5HIDIKLQotbmFtZXNwYWNlIHsKLQotLy8gTWFwIFBERi1zdHlsZSBkaXJlY3RpdmVzIHRvIGVxdWl2YWxlbnQgd2NzZnRpbWUgZGlyZWN0aXZlcy4gTm90Ci0vLyBhbGwgaGF2ZSBkaXJlY3QgZXF1aXZhbGVudHMsIHRob3VnaC4KLXN0cnVjdCBUYkNvbnZlcnQgewotICBjb25zdCBGWF9XQ0hBUiogbHBzekpTTWFyazsKLSAgY29uc3QgRlhfV0NIQVIqIGxwc3pDcHBNYXJrOwotfTsKLQotLy8gTWFwIFBERi1zdHlsZSBkaXJlY3RpdmVzIGxhY2tpbmcgZGlyZWN0IHdjc2Z0aW1lIGRpcmVjdGl2ZXMgdG8KLS8vIHRoZSB2YWx1ZSB3aXRoIHdoaWNoIHRoZXkgd2lsbCBiZSByZXBsYWNlZC4KLXN0cnVjdCBUYkNvbnZlcnRBZGRpdGlvbmFsIHsKLSAgY29uc3QgRlhfV0NIQVIqIGxwc3pKU01hcms7Ci0gIGludCBpVmFsdWU7Ci19OwotCi1jb25zdCBUYkNvbnZlcnQgVGJDb252ZXJ0VGFibGVbXSA9IHsKLSAgICB7TCJtbW1tIiwgTCIlQiJ9LCB7TCJtbW0iLCBMIiViIn0sIHtMIm1tIiwgTCIlbSJ9LCAgIHtMImRkZGQiLCBMIiVBIn0sCi0gICAge0wiZGRkIiwgTCIlYSJ9LCAge0wiZGQiLCBMIiVkIn0sICB7TCJ5eXl5IiwgTCIlWSJ9LCB7TCJ5eSIsIEwiJXkifSwKLSAgICB7TCJISCIsIEwiJUgifSwgICB7TCJoaCIsIEwiJUkifSwgIHtMIk1NIiwgTCIlTSJ9LCAgIHtMInNzIiwgTCIlUyJ9LAotICAgIHtMIlRUIiwgTCIlcCJ9LAotI2lmIGRlZmluZWQoX1dJTjMyKQotICAgIHtMInR0IiwgTCIlcCJ9LCAgIHtMImgiLCBMIiUjSSJ9LAotI2Vsc2UKLSAgICB7TCJ0dCIsIEwiJVAifSwgICB7TCJoIiwgTCIlbCJ9LAotI2VuZGlmCi19OwotCi1pbnQgUGFyc2VEYXRhVHlwZShzdGQ6OndzdHJpbmcqIHNGb3JtYXQpIHsKLSAgYm9vbCBiUGVyY2VudCA9IGZhbHNlOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNGb3JtYXQtPmxlbmd0aCgpOyArK2kpIHsKLSAgICB3Y2hhcl90IGMgPSAoKnNGb3JtYXQpW2ldOwotICAgIGlmIChjID09IEwnJScpIHsKLSAgICAgIGJQZXJjZW50ID0gdHJ1ZTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGlmIChiUGVyY2VudCkgewotICAgICAgaWYgKGMgPT0gTCdjJyB8fCBjID09IEwnQycgfHwgYyA9PSBMJ2QnIHx8IGMgPT0gTCdpJyB8fCBjID09IEwnbycgfHwKLSAgICAgICAgICBjID09IEwndScgfHwgYyA9PSBMJ3gnIHx8IGMgPT0gTCdYJykgewotICAgICAgICByZXR1cm4gVVRJTF9JTlQ7Ci0gICAgICB9Ci0gICAgICBpZiAoYyA9PSBMJ2UnIHx8IGMgPT0gTCdFJyB8fCBjID09IEwnZicgfHwgYyA9PSBMJ2cnIHx8IGMgPT0gTCdHJykgewotICAgICAgICByZXR1cm4gVVRJTF9ET1VCTEU7Ci0gICAgICB9Ci0gICAgICBpZiAoYyA9PSBMJ3MnIHx8IGMgPT0gTCdTJykgewotICAgICAgICAvLyBNYXAgcyB0byBTIHNpbmNlIHdlIGFsd2F5cyBkZWFsIGludGVybmFsbHkKLSAgICAgICAgLy8gd2l0aCB3Y2hhcl90IHN0cmluZ3MuCi0gICAgICAgICgqc0Zvcm1hdClbaV0gPSBMJ1MnOwotICAgICAgICByZXR1cm4gVVRJTF9TVFJJTkc7Ci0gICAgICB9Ci0gICAgICBpZiAoYyA9PSBMJy4nIHx8IGMgPT0gTCcrJyB8fCBjID09IEwnLScgfHwgYyA9PSBMJyMnIHx8IGMgPT0gTCcgJyB8fAotICAgICAgICAgIEZYU1lTX2lzd2RpZ2l0KGMpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIC0xOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotdXRpbDo6dXRpbChDSlNfT2JqZWN0KiBwSlNPYmplY3QpIDogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCkge30KLQotdXRpbDo6fnV0aWwoKSB7fQotCi1ib29sIHV0aWw6OnByaW50ZihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7Ci0gIGlmIChpU2l6ZSA8IDEpCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdGQ6OndzdHJpbmcgY19Db252Q2hhcihwYXJhbXNbMF0uVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKS5jX3N0cigpKTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjp3c3RyaW5nPiBjX3N0ckNvbnZlcnM7Ci0gIGludCBpT2Zmc2V0ID0gMDsKLSAgaW50IGlPZmZlbmQgPSAwOwotICBjX0NvbnZDaGFyLmluc2VydChjX0NvbnZDaGFyLmJlZ2luKCksIEwnUycpOwotICB3aGlsZSAoaU9mZnNldCAhPSAtMSkgewotICAgIGlPZmZlbmQgPSBjX0NvbnZDaGFyLmZpbmQoTCIlIiwgaU9mZnNldCArIDEpOwotICAgIHN0ZDo6d3N0cmluZyBzdHJTdWI7Ci0gICAgaWYgKGlPZmZlbmQgPT0gLTEpCi0gICAgICBzdHJTdWIgPSBjX0NvbnZDaGFyLnN1YnN0cihpT2Zmc2V0KTsKLSAgICBlbHNlCi0gICAgICBzdHJTdWIgPSBjX0NvbnZDaGFyLnN1YnN0cihpT2Zmc2V0LCBpT2ZmZW5kIC0gaU9mZnNldCk7Ci0gICAgY19zdHJDb252ZXJzLnB1c2hfYmFjayhzdHJTdWIpOwotICAgIGlPZmZzZXQgPSBpT2ZmZW5kOwotICB9Ci0KLSAgc3RkOjp3c3RyaW5nIGNfc3RyUmVzdWx0OwotICBzdGQ6OndzdHJpbmcgY19zdHJGb3JtYXQ7Ci0gIGZvciAoaW50IGlJbmRleCA9IDA7IGlJbmRleCA8IChpbnQpY19zdHJDb252ZXJzLnNpemUoKTsgaUluZGV4KyspIHsKLSAgICBjX3N0ckZvcm1hdCA9IGNfc3RyQ29udmVyc1tpSW5kZXhdOwotICAgIGlmIChpSW5kZXggPT0gMCkgewotICAgICAgY19zdHJSZXN1bHQgPSBjX3N0ckZvcm1hdDsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIENGWF9XaWRlU3RyaW5nIHN0clNlZ21lbnQ7Ci0gICAgaWYgKGlJbmRleCA+PSBpU2l6ZSkgewotICAgICAgY19zdHJSZXN1bHQgKz0gY19zdHJGb3JtYXQ7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKFBhcnNlRGF0YVR5cGUoJmNfc3RyRm9ybWF0KSkgewotICAgICAgY2FzZSBVVElMX0lOVDoKLSAgICAgICAgc3RyU2VnbWVudC5Gb3JtYXQoY19zdHJGb3JtYXQuY19zdHIoKSwgcGFyYW1zW2lJbmRleF0uVG9JbnQocFJ1bnRpbWUpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVUSUxfRE9VQkxFOgotICAgICAgICBzdHJTZWdtZW50LkZvcm1hdChjX3N0ckZvcm1hdC5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbaUluZGV4XS5Ub0RvdWJsZShwUnVudGltZSkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVVRJTF9TVFJJTkc6Ci0gICAgICAgIHN0clNlZ21lbnQuRm9ybWF0KGNfc3RyRm9ybWF0LmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc1tpSW5kZXhdLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSkuY19zdHIoKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgc3RyU2VnbWVudC5Gb3JtYXQoTCIlUyIsIGNfc3RyRm9ybWF0LmNfc3RyKCkpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY19zdHJSZXN1bHQgKz0gc3RyU2VnbWVudC5HZXRCdWZmZXIoc3RyU2VnbWVudC5HZXRMZW5ndGgoKSArIDEpOwotICB9Ci0KLSAgY19zdHJSZXN1bHQuZXJhc2UoY19zdHJSZXN1bHQuYmVnaW4oKSk7Ci0gIHZSZXQgPSBDSlNfVmFsdWUocFJ1bnRpbWUsIGNfc3RyUmVzdWx0LmNfc3RyKCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB1dGlsOjpwcmludGQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcikgewotICBpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOwotICBpZiAoaVNpemUgPCAyKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDSlNfVmFsdWUgcDEgPSBwYXJhbXNbMF07Ci0gIENKU19WYWx1ZSBwMiA9IHBhcmFtc1sxXTsKLSAgQ0pTX0RhdGUganNEYXRlOwotICBpZiAoIXAyLkNvbnZlcnRUb0RhdGUocFJ1bnRpbWUsIGpzRGF0ZSkpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTUFJJTlQxKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIWpzRGF0ZS5Jc1ZhbGlkRGF0ZShwUnVudGltZSkpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTUFJJTlQyKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAocDEuR2V0VHlwZSgpID09IENKU19WYWx1ZTo6VlRfbnVtYmVyKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgc3dSZXN1bHQ7Ci0gICAgc3dpdGNoIChwMS5Ub0ludChwUnVudGltZSkpIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgc3dSZXN1bHQuRm9ybWF0KEwiRDolMDRkJTAyZCUwMmQlMDJkJTAyZCUwMmQiLCBqc0RhdGUuR2V0WWVhcihwUnVudGltZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBqc0RhdGUuR2V0TW9udGgocFJ1bnRpbWUpICsgMSwganNEYXRlLkdldERheShwUnVudGltZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBqc0RhdGUuR2V0SG91cnMocFJ1bnRpbWUpLCBqc0RhdGUuR2V0TWludXRlcyhwUnVudGltZSksCi0gICAgICAgICAgICAgICAgICAgICAgICBqc0RhdGUuR2V0U2Vjb25kcyhwUnVudGltZSkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgc3dSZXN1bHQuRm9ybWF0KEwiJTA0ZC4lMDJkLiUwMmQgJTAyZDolMDJkOiUwMmQiLAotICAgICAgICAgICAgICAgICAgICAgICAganNEYXRlLkdldFllYXIocFJ1bnRpbWUpLCBqc0RhdGUuR2V0TW9udGgocFJ1bnRpbWUpICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGpzRGF0ZS5HZXREYXkocFJ1bnRpbWUpLCBqc0RhdGUuR2V0SG91cnMocFJ1bnRpbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAganNEYXRlLkdldE1pbnV0ZXMocFJ1bnRpbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAganNEYXRlLkdldFNlY29uZHMocFJ1bnRpbWUpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDI6Ci0gICAgICAgIHN3UmVzdWx0LkZvcm1hdChMIiUwNGQvJTAyZC8lMDJkICUwMmQ6JTAyZDolMDJkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGpzRGF0ZS5HZXRZZWFyKHBSdW50aW1lKSwganNEYXRlLkdldE1vbnRoKHBSdW50aW1lKSArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICBqc0RhdGUuR2V0RGF5KHBSdW50aW1lKSwganNEYXRlLkdldEhvdXJzKHBSdW50aW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGpzRGF0ZS5HZXRNaW51dGVzKHBSdW50aW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGpzRGF0ZS5HZXRTZWNvbmRzKHBSdW50aW1lKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU1ZBTFVFRVJST1IpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdlJldCA9IENKU19WYWx1ZShwUnVudGltZSwgc3dSZXN1bHQuY19zdHIoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBpZiAocDEuR2V0VHlwZSgpID09IENKU19WYWx1ZTo6VlRfc3RyaW5nKSB7Ci0gICAgaWYgKGlTaXplID4gMiAmJiBwYXJhbXNbMl0uVG9Cb29sKHBSdW50aW1lKSkgewotICAgICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU05PVFNVUFBPUlQpOwotICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gY3VycmVudGx5LCBpdCBkb2Vzbid0IHN1cHBvcnQgWEZBUGljdHVyZS4KLSAgICB9Ci0KLSAgICAvLyBDb252ZXJ0IFBERi1zdHlsZSBmb3JtYXQgc3BlY2lmaWVycyB0byB3Y3NmdGltZSBzcGVjaWZpZXJzLiBSZW1vdmUgYW55Ci0gICAgLy8gcHJlLWV4aXN0aW5nICUtZGlyZWN0aXZlcyBiZWZvcmUgaW5zZXJ0aW5nIG91ciBvd24uCi0gICAgc3RkOjpiYXNpY19zdHJpbmc8d2NoYXJfdD4gY0Zvcm1hdCA9IHAxLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSkuY19zdHIoKTsKLSAgICBjRm9ybWF0LmVyYXNlKHN0ZDo6cmVtb3ZlKGNGb3JtYXQuYmVnaW4oKSwgY0Zvcm1hdC5lbmQoKSwgJyUnKSwKLSAgICAgICAgICAgICAgICAgIGNGb3JtYXQuZW5kKCkpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoVGJDb252ZXJ0VGFibGUpOyArK2kpIHsKLSAgICAgIGludCBpU3RhcnQgPSAwOwotICAgICAgaW50IGlFbmQ7Ci0gICAgICB3aGlsZSAoKGlFbmQgPSBjRm9ybWF0LmZpbmQoVGJDb252ZXJ0VGFibGVbaV0ubHBzekpTTWFyaywgaVN0YXJ0KSkgIT0KLSAgICAgICAgICAgICAtMSkgewotICAgICAgICBjRm9ybWF0LnJlcGxhY2UoaUVuZCwgRlhTWVNfd2NzbGVuKFRiQ29udmVydFRhYmxlW2ldLmxwc3pKU01hcmspLAotICAgICAgICAgICAgICAgICAgICAgICAgVGJDb252ZXJ0VGFibGVbaV0ubHBzekNwcE1hcmspOwotICAgICAgICBpU3RhcnQgPSBpRW5kOwotICAgICAgfQotICAgIH0KLQotICAgIGludCBpWWVhciA9IGpzRGF0ZS5HZXRZZWFyKHBSdW50aW1lKTsKLSAgICBpbnQgaU1vbnRoID0ganNEYXRlLkdldE1vbnRoKHBSdW50aW1lKTsKLSAgICBpbnQgaURheSA9IGpzRGF0ZS5HZXREYXkocFJ1bnRpbWUpOwotICAgIGludCBpSG91ciA9IGpzRGF0ZS5HZXRIb3VycyhwUnVudGltZSk7Ci0gICAgaW50IGlNaW4gPSBqc0RhdGUuR2V0TWludXRlcyhwUnVudGltZSk7Ci0gICAgaW50IGlTZWMgPSBqc0RhdGUuR2V0U2Vjb25kcyhwUnVudGltZSk7Ci0KLSAgICBUYkNvbnZlcnRBZGRpdGlvbmFsIGNUYWJsZUFkW10gPSB7Ci0gICAgICAgIHtMIm0iLCBpTW9udGggKyAxfSwge0wiZCIsIGlEYXl9LAotICAgICAgICB7TCJIIiwgaUhvdXJ9LCAgICAgIHtMImgiLCBpSG91ciA+IDEyID8gaUhvdXIgLSAxMiA6IGlIb3VyfSwKLSAgICAgICAge0wiTSIsIGlNaW59LCAgICAgICB7TCJzIiwgaVNlY30sCi0gICAgfTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGNUYWJsZUFkKTsgKytpKSB7Ci0gICAgICB3Y2hhcl90IHRzelZhbHVlWzE2XTsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHNWYWx1ZTsKLSAgICAgIHNWYWx1ZS5Gb3JtYXQoTCIlZCIsIGNUYWJsZUFkW2ldLmlWYWx1ZSk7Ci0gICAgICBtZW1jcHkodHN6VmFsdWUsICh3Y2hhcl90KilzVmFsdWUuR2V0QnVmZmVyKHNWYWx1ZS5HZXRMZW5ndGgoKSArIDEpLAotICAgICAgICAgICAgIChzVmFsdWUuR2V0TGVuZ3RoKCkgKyAxKSAqIHNpemVvZih3Y2hhcl90KSk7Ci0KLSAgICAgIGludCBpU3RhcnQgPSAwOwotICAgICAgaW50IGlFbmQ7Ci0gICAgICB3aGlsZSAoKGlFbmQgPSBjRm9ybWF0LmZpbmQoY1RhYmxlQWRbaV0ubHBzekpTTWFyaywgaVN0YXJ0KSkgIT0gLTEpIHsKLSAgICAgICAgaWYgKGlFbmQgPiAwKSB7Ci0gICAgICAgICAgaWYgKGNGb3JtYXRbaUVuZCAtIDFdID09IEwnJScpIHsKLSAgICAgICAgICAgIGlTdGFydCA9IGlFbmQgKyAxOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNGb3JtYXQucmVwbGFjZShpRW5kLCBGWFNZU193Y3NsZW4oY1RhYmxlQWRbaV0ubHBzekpTTWFyayksIHRzelZhbHVlKTsKLSAgICAgICAgaVN0YXJ0ID0gaUVuZDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzdHJ1Y3QgdG0gdGltZSA9IHt9OwotICAgIHRpbWUudG1feWVhciA9IGlZZWFyIC0gMTkwMDsKLSAgICB0aW1lLnRtX21vbiA9IGlNb250aDsKLSAgICB0aW1lLnRtX21kYXkgPSBpRGF5OwotICAgIHRpbWUudG1faG91ciA9IGlIb3VyOwotICAgIHRpbWUudG1fbWluID0gaU1pbjsKLSAgICB0aW1lLnRtX3NlYyA9IGlTZWM7Ci0KLSAgICB3Y2hhcl90IGJ1Zls2NF0gPSB7fTsKLSAgICB3Y3NmdGltZShidWYsIDY0LCBjRm9ybWF0LmNfc3RyKCksICZ0aW1lKTsKLSAgICBjRm9ybWF0ID0gYnVmOwotICAgIHZSZXQgPSBDSlNfVmFsdWUocFJ1bnRpbWUsIGNGb3JtYXQuY19zdHIoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTVFlQRUVSUk9SKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIHV0aWw6OnByaW50eChDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKSB7Ci0gIGlmIChwYXJhbXMuc2l6ZSgpIDwgMikgewotICAgIHNFcnJvciA9IEpTR2V0U3RyaW5nRnJvbUlEKElEU19TVFJJTkdfSlNQQVJBTUVSUk9SKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB2UmV0ID0gQ0pTX1ZhbHVlKHBSdW50aW1lLCBwcmludHgocGFyYW1zWzBdLlRvQ0ZYV2lkZVN0cmluZyhwUnVudGltZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNbMV0uVG9DRlhXaWRlU3RyaW5nKHBSdW50aW1lKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jX3N0cigpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotZW51bSBDYXNlTW9kZSB7IGtQcmVzZXJ2ZUNhc2UsIGtVcHBlckNhc2UsIGtMb3dlckNhc2UgfTsKLQotc3RhdGljIEZYX1dDSEFSIFRyYW5zbGF0ZUNhc2UoRlhfV0NIQVIgaW5wdXQsIENhc2VNb2RlIGVNb2RlKSB7Ci0gIGlmIChlTW9kZSA9PSBrTG93ZXJDYXNlICYmIGlucHV0ID49ICdBJyAmJiBpbnB1dCA8PSAnWicpCi0gICAgcmV0dXJuIGlucHV0IHwgMHgyMDsKLSAgaWYgKGVNb2RlID09IGtVcHBlckNhc2UgJiYgaW5wdXQgPj0gJ2EnICYmIGlucHV0IDw9ICd6JykKLSAgICByZXR1cm4gaW5wdXQgJiB+MHgyMDsKLSAgcmV0dXJuIGlucHV0OwotfQotCi1DRlhfV2lkZVN0cmluZyB1dGlsOjpwcmludHgoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NvdXJjZSkgewotICBDRlhfV2lkZVN0cmluZyB3c1Jlc3VsdDsKLSAgRlhfU1RSU0laRSBpU291cmNlSWR4ID0gMDsKLSAgRlhfU1RSU0laRSBpRm9ybWF0SWR4ID0gMDsKLSAgQ2FzZU1vZGUgZUNhc2VNb2RlID0ga1ByZXNlcnZlQ2FzZTsKLSAgYm9vbCBiRXNjYXBlZCA9IGZhbHNlOwotICB3aGlsZSAoaUZvcm1hdElkeCA8IHdzRm9ybWF0LkdldExlbmd0aCgpKSB7Ci0gICAgaWYgKGJFc2NhcGVkKSB7Ci0gICAgICBiRXNjYXBlZCA9IGZhbHNlOwotICAgICAgd3NSZXN1bHQgKz0gd3NGb3JtYXRbaUZvcm1hdElkeF07Ci0gICAgICArK2lGb3JtYXRJZHg7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgc3dpdGNoICh3c0Zvcm1hdFtpRm9ybWF0SWR4XSkgewotICAgICAgY2FzZSAnXFwnOiB7Ci0gICAgICAgIGJFc2NhcGVkID0gdHJ1ZTsKLSAgICAgICAgKytpRm9ybWF0SWR4OwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgJzwnOiB7Ci0gICAgICAgIGVDYXNlTW9kZSA9IGtMb3dlckNhc2U7Ci0gICAgICAgICsraUZvcm1hdElkeDsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlICc+JzogewotICAgICAgICBlQ2FzZU1vZGUgPSBrVXBwZXJDYXNlOwotICAgICAgICArK2lGb3JtYXRJZHg7Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSAnPSc6IHsKLSAgICAgICAgZUNhc2VNb2RlID0ga1ByZXNlcnZlQ2FzZTsKLSAgICAgICAgKytpRm9ybWF0SWR4OwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgJz8nOiB7Ci0gICAgICAgIGlmIChpU291cmNlSWR4IDwgd3NTb3VyY2UuR2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgICB3c1Jlc3VsdCArPSBUcmFuc2xhdGVDYXNlKHdzU291cmNlW2lTb3VyY2VJZHhdLCBlQ2FzZU1vZGUpOwotICAgICAgICAgICsraVNvdXJjZUlkeDsKLSAgICAgICAgfQotICAgICAgICArK2lGb3JtYXRJZHg7Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSAnWCc6IHsKLSAgICAgICAgaWYgKGlTb3VyY2VJZHggPCB3c1NvdXJjZS5HZXRMZW5ndGgoKSkgewotICAgICAgICAgIGlmICgod3NTb3VyY2VbaVNvdXJjZUlkeF0gPj0gJzAnICYmIHdzU291cmNlW2lTb3VyY2VJZHhdIDw9ICc5JykgfHwKLSAgICAgICAgICAgICAgKHdzU291cmNlW2lTb3VyY2VJZHhdID49ICdhJyAmJiB3c1NvdXJjZVtpU291cmNlSWR4XSA8PSAneicpIHx8Ci0gICAgICAgICAgICAgICh3c1NvdXJjZVtpU291cmNlSWR4XSA+PSAnQScgJiYgd3NTb3VyY2VbaVNvdXJjZUlkeF0gPD0gJ1onKSkgewotICAgICAgICAgICAgd3NSZXN1bHQgKz0gVHJhbnNsYXRlQ2FzZSh3c1NvdXJjZVtpU291cmNlSWR4XSwgZUNhc2VNb2RlKTsKLSAgICAgICAgICAgICsraUZvcm1hdElkeDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgKytpU291cmNlSWR4OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICsraUZvcm1hdElkeDsKLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgJ0EnOiB7Ci0gICAgICAgIGlmIChpU291cmNlSWR4IDwgd3NTb3VyY2UuR2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgICBpZiAoKHdzU291cmNlW2lTb3VyY2VJZHhdID49ICdhJyAmJiB3c1NvdXJjZVtpU291cmNlSWR4XSA8PSAneicpIHx8Ci0gICAgICAgICAgICAgICh3c1NvdXJjZVtpU291cmNlSWR4XSA+PSAnQScgJiYgd3NTb3VyY2VbaVNvdXJjZUlkeF0gPD0gJ1onKSkgewotICAgICAgICAgICAgd3NSZXN1bHQgKz0gVHJhbnNsYXRlQ2FzZSh3c1NvdXJjZVtpU291cmNlSWR4XSwgZUNhc2VNb2RlKTsKLSAgICAgICAgICAgICsraUZvcm1hdElkeDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgKytpU291cmNlSWR4OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICsraUZvcm1hdElkeDsKLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgJzknOiB7Ci0gICAgICAgIGlmIChpU291cmNlSWR4IDwgd3NTb3VyY2UuR2V0TGVuZ3RoKCkpIHsKLSAgICAgICAgICBpZiAod3NTb3VyY2VbaVNvdXJjZUlkeF0gPj0gJzAnICYmIHdzU291cmNlW2lTb3VyY2VJZHhdIDw9ICc5JykgewotICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NTb3VyY2VbaVNvdXJjZUlkeF07Ci0gICAgICAgICAgICArK2lGb3JtYXRJZHg7Ci0gICAgICAgICAgfQotICAgICAgICAgICsraVNvdXJjZUlkeDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICArK2lGb3JtYXRJZHg7Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlICcqJzogewotICAgICAgICBpZiAoaVNvdXJjZUlkeCA8IHdzU291cmNlLkdldExlbmd0aCgpKSB7Ci0gICAgICAgICAgd3NSZXN1bHQgKz0gVHJhbnNsYXRlQ2FzZSh3c1NvdXJjZVtpU291cmNlSWR4XSwgZUNhc2VNb2RlKTsKLSAgICAgICAgICArK2lTb3VyY2VJZHg7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgKytpRm9ybWF0SWR4OwotICAgICAgICB9Ci0gICAgICB9IGJyZWFrOwotICAgICAgZGVmYXVsdDogewotICAgICAgICB3c1Jlc3VsdCArPSB3c0Zvcm1hdFtpRm9ybWF0SWR4XTsKLSAgICAgICAgKytpRm9ybWF0SWR4OwotICAgICAgfSBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHdzUmVzdWx0OwotfQotCi1ib29sIHV0aWw6OnNjYW5kKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKLSAgaWYgKGlTaXplIDwgMikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgc0Zvcm1hdCA9IHBhcmFtc1swXS5Ub0NGWFdpZGVTdHJpbmcocFJ1bnRpbWUpOwotICBDRlhfV2lkZVN0cmluZyBzRGF0ZSA9IHBhcmFtc1sxXS5Ub0NGWFdpZGVTdHJpbmcocFJ1bnRpbWUpOwotICBkb3VibGUgZERhdGUgPSBKU19HZXREYXRlVGltZSgpOwotICBpZiAoc0RhdGUuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgZERhdGUgPSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKHNEYXRlLCBzRm9ybWF0LCBudWxscHRyKTsKLSAgfQotCi0gIGlmICghSlNfUG9ydElzTmFuKGREYXRlKSkgewotICAgIHZSZXQgPSBDSlNfVmFsdWUocFJ1bnRpbWUsIENKU19EYXRlKHBSdW50aW1lLCBkRGF0ZSkpOwotICB9IGVsc2UgewotICAgIHZSZXQuU2V0TnVsbChwUnVudGltZSk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB1dGlsOjpieXRlVG9DaGFyKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpIHsKLSAgaWYgKHBhcmFtcy5zaXplKCkgPCAxKSB7Ci0gICAgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSURTX1NUUklOR19KU1BBUkFNRVJST1IpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGludCBhcmcgPSBwYXJhbXNbMF0uVG9JbnQocFJ1bnRpbWUpOwotICBpZiAoYXJnIDwgMCB8fCBhcmcgPiAyNTUpIHsKLSAgICBzRXJyb3IgPSBKU0dldFN0cmluZ0Zyb21JRChJRFNfU1RSSU5HX0pTVkFMVUVFUlJPUik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgd1N0cihzdGF0aWNfY2FzdDxGWF9XQ0hBUj4oYXJnKSk7Ci0gIHZSZXQgPSBDSlNfVmFsdWUocFJ1bnRpbWUsIHdTdHIuY19zdHIoKSk7Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9qYXZhc2NyaXB0L3V0aWwuaCBiL2ZwZGZzZGsvamF2YXNjcmlwdC91dGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NzYxYjYuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9qYXZhc2NyaXB0L3V0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGUERGU0RLX0pBVkFTQ1JJUFRfVVRJTF9IXwotI2RlZmluZSBGUERGU0RLX0pBVkFTQ1JJUFRfVVRJTF9IXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImZwZGZzZGsvamF2YXNjcmlwdC9KU19EZWZpbmUuaCIKLQotY2xhc3MgdXRpbCA6IHB1YmxpYyBDSlNfRW1iZWRPYmogewotIHB1YmxpYzoKLSAgZXhwbGljaXQgdXRpbChDSlNfT2JqZWN0KiBwSlNPYmplY3QpOwotICB+dXRpbCgpIG92ZXJyaWRlOwotCi0gIGJvb2wgcHJpbnRkKENKU19SdW50aW1lKiBwUnVudGltZSwKLSAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0pTX1ZhbHVlPiYgcGFyYW1zLAotICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzRXJyb3IpOwotICBib29sIHByaW50ZihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICAgQ0pTX1ZhbHVlJiB2UmV0LAotICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLSAgYm9vbCBwcmludHgoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgIENKU19WYWx1ZSYgdlJldCwKLSAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgc2NhbmQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAotICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENKU19WYWx1ZT4mIHBhcmFtcywKLSAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNFcnJvcik7Ci0gIGJvb2wgYnl0ZVRvQ2hhcihDSlNfUnVudGltZSogcFJ1bnRpbWUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDSlNfVmFsdWU+JiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICBDSlNfVmFsdWUmIHZSZXQsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc0Vycm9yKTsKLQotICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgcHJpbnR4KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjU291cmNlKTsKLX07Ci0KLWNsYXNzIENKU19VdGlsIDogcHVibGljIENKU19PYmplY3QgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0pTX1V0aWwodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQotICB+Q0pTX1V0aWwoKSBvdmVycmlkZSB7fQotCi0gIERFQ0xBUkVfSlNfQ0xBU1MoKTsKLQotICBKU19TVEFUSUNfTUVUSE9EKHByaW50ZCwgdXRpbCk7Ci0gIEpTX1NUQVRJQ19NRVRIT0QocHJpbnRmLCB1dGlsKTsKLSAgSlNfU1RBVElDX01FVEhPRChwcmludHgsIHV0aWwpOwotICBKU19TVEFUSUNfTUVUSE9EKHNjYW5kLCB1dGlsKTsKLSAgSlNfU1RBVElDX01FVEhPRChieXRlVG9DaGFyLCB1dGlsKTsKLX07Ci0KLSNlbmRpZiAgLy8gRlBERlNES19KQVZBU0NSSVBUX1VUSUxfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcGRmc2RrX2ZpZWxkYWN0aW9uLmggYi9mcGRmc2RrL3BkZnNka19maWVsZGFjdGlvbi5oCmluZGV4IDRlZTU2YWMuLmFlYzVkY2EgMTAwNjQ0Ci0tLSBhL2ZwZGZzZGsvcGRmc2RrX2ZpZWxkYWN0aW9uLmgKKysrIGIvZnBkZnNkay9wZGZzZGtfZmllbGRhY3Rpb24uaApAQCAtMjUsMTIgKzI1LDEyIEBACiAgIGJvb2wgYk1vZGlmaWVyOwogICBib29sIGJTaGlmdDsKICAgaW50IG5Db21taXRLZXk7Ci0gIENGWF9XaWRlU3RyaW5nIHNDaGFuZ2U7Ci0gIENGWF9XaWRlU3RyaW5nIHNDaGFuZ2VFeDsKKyAgV2lkZVN0cmluZyBzQ2hhbmdlOworICBXaWRlU3RyaW5nIHNDaGFuZ2VFeDsKICAgYm9vbCBiS2V5RG93bjsKICAgaW50IG5TZWxFbmQ7CiAgIGludCBuU2VsU3RhcnQ7Ci0gIENGWF9XaWRlU3RyaW5nIHNWYWx1ZTsKKyAgV2lkZVN0cmluZyBzVmFsdWU7CiAgIGJvb2wgYldpbGxDb21taXQ7CiAgIGJvb2wgYkZpZWxkRnVsbDsKICAgYm9vbCBiUkM7CmRpZmYgLS1naXQgYS9mcGRmc2RrL3BkZndpbmRvdy9QV0xfQnV0dG9uLmNwcCBiL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9CdXR0b24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmJlNDY5Li4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9CdXR0b24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0J1dHRvbi5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9VdGlscy5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9XbmQuaCIKLQotQ1BXTF9CdXR0b246OkNQV0xfQnV0dG9uKCkgOiBtX2JNb3VzZURvd24oZmFsc2UpIHt9Ci0KLUNQV0xfQnV0dG9uOjp+Q1BXTF9CdXR0b24oKSB7fQotCi1DRlhfQnl0ZVN0cmluZyBDUFdMX0J1dHRvbjo6R2V0Q2xhc3NOYW1lKCkgY29uc3QgewotICByZXR1cm4gIkNQV0xfQnV0dG9uIjsKLX0KLQotdm9pZCBDUFdMX0J1dHRvbjo6T25DcmVhdGUoUFdMX0NSRUFURVBBUkFNJiBjcCkgewotICBjcC5lQ3Vyc29yVHlwZSA9IEZYQ1RfSEFORDsKLX0KLQotYm9vbCBDUFdMX0J1dHRvbjo6T25MQnV0dG9uRG93bihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIHsKLSAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsIG5GbGFnKTsKLQotICBtX2JNb3VzZURvd24gPSB0cnVlOwotICBTZXRDYXB0dXJlKCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1BXTF9CdXR0b246Ok9uTEJ1dHRvblVwKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgewotICBDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKLQotICBSZWxlYXNlQ2FwdHVyZSgpOwotICBtX2JNb3VzZURvd24gPSBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9CdXR0b24uaCBiL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9CdXR0b24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQxMTkzZi4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL3BkZndpbmRvdy9QV0xfQnV0dG9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19QREZXSU5ET1dfUFdMX0JVVFRPTl9IXwotI2RlZmluZSBGUERGU0RLX1BERldJTkRPV19QV0xfQlVUVE9OX0hfCi0KLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfV25kLmgiCi0KLWNsYXNzIENQV0xfQnV0dG9uIDogcHVibGljIENQV0xfV25kIHsKLSBwdWJsaWM6Ci0gIENQV0xfQnV0dG9uKCk7Ci0gIH5DUFdMX0J1dHRvbigpIG92ZXJyaWRlOwotCi0gIC8vIENQV0xfV25kCi0gIENGWF9CeXRlU3RyaW5nIEdldENsYXNzTmFtZSgpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIE9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSYgY3ApIG92ZXJyaWRlOwotICBib29sIE9uTEJ1dHRvbkRvd24oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKLSAgYm9vbCBPbkxCdXR0b25VcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICBib29sIG1fYk1vdXNlRG93bjsKLX07Ci0KLSNlbmRpZiAgLy8gRlBERlNES19QREZXSU5ET1dfUFdMX0JVVFRPTl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0NhcmV0LmNwcCBiL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9DYXJldC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNjBiYmYuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0NhcmV0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfQ2FyZXQuaCIKLQotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZ3JhcGhzdGF0ZWRhdGEuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3BhdGhkYXRhLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfVXRpbHMuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfV25kLmgiCi0KLSNkZWZpbmUgUFdMX0NBUkVUX0ZMQVNISU5URVJWQUwgNTAwCi0KLVBXTF9DQVJFVF9JTkZPOjpQV0xfQ0FSRVRfSU5GTygpIDogYlZpc2libGUoZmFsc2UpIHt9Ci0KLUNQV0xfQ2FyZXQ6OkNQV0xfQ2FyZXQoKSA6IG1fYkZsYXNoKGZhbHNlKSwgbV9mV2lkdGgoMC40ZiksIG1fbkRlbGF5KDApIHt9Ci0KLUNQV0xfQ2FyZXQ6On5DUFdMX0NhcmV0KCkge30KLQotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9DYXJldDo6R2V0Q2xhc3NOYW1lKCkgY29uc3QgewotICByZXR1cm4gIkNQV0xfQ2FyZXQiOwotfQotCi12b2lkIENQV0xfQ2FyZXQ6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSkgewotICBHZXRDYXJldEFwcChzQXBwU3RyZWFtLCBDRlhfUG9pbnRGKCkpOwotfQotCi12b2lkIENQV0xfQ2FyZXQ6OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKSB7Ci0gIGlmIChJc1Zpc2libGUoKSAmJiBtX2JGbGFzaCkgewotICAgIENGWF9GbG9hdFJlY3QgcmNSZWN0ID0gR2V0Q2FyZXRSZWN0KCk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByY0NsaXAgPSBHZXRDbGlwUmVjdCgpOwotICAgIENGWF9QYXRoRGF0YSBwYXRoOwotCi0gICAgRlhfRkxPQVQgZkNhcmV0WCA9IHJjUmVjdC5sZWZ0ICsgbV9mV2lkdGggKiAwLjVmOwotICAgIEZYX0ZMT0FUIGZDYXJldFRvcCA9IHJjUmVjdC50b3A7Ci0gICAgRlhfRkxPQVQgZkNhcmV0Qm90dG9tID0gcmNSZWN0LmJvdHRvbTsKLSAgICBpZiAoIXJjQ2xpcC5Jc0VtcHR5KCkpIHsKLSAgICAgIHJjUmVjdC5JbnRlcnNlY3QocmNDbGlwKTsKLSAgICAgIGlmIChyY1JlY3QuSXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIGZDYXJldFRvcCA9IHJjUmVjdC50b3A7Ci0gICAgICBmQ2FyZXRCb3R0b20gPSByY1JlY3QuYm90dG9tOwotICAgIH0KLQotICAgIHBhdGguQXBwZW5kUG9pbnQoQ0ZYX1BvaW50RihmQ2FyZXRYLCBmQ2FyZXRCb3R0b20pLCBGWFBUX1RZUEU6Ok1vdmVUbywKLSAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICBwYXRoLkFwcGVuZFBvaW50KENGWF9Qb2ludEYoZkNhcmV0WCwgZkNhcmV0VG9wKSwgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKLQotICAgIENGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7Ci0gICAgZ3NkLm1fTGluZVdpZHRoID0gbV9mV2lkdGg7Ci0gICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgJmdzZCwgMCwgQXJnYkVuY29kZSgyNTUsIDAsIDAsIDApLAotICAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9BTFRFUk5BVEUpOwotICB9Ci19Ci0KLXZvaWQgQ1BXTF9DYXJldDo6R2V0Q2FyZXRBcHAoQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdE9mZnNldCkgewotICBpZiAoSXNWaXNpYmxlKCkgJiYgbV9iRmxhc2gpIHsKLSAgICBDRlhfQnl0ZVRleHRCdWYgc0NhcmV0OwotCi0gICAgQ0ZYX0Zsb2F0UmVjdCByY1JlY3QgPSBHZXRDYXJldFJlY3QoKTsKLSAgICBDRlhfRmxvYXRSZWN0IHJjQ2xpcCA9IEdldENsaXBSZWN0KCk7Ci0KLSAgICByY1JlY3QgPSBDUFdMX1V0aWxzOjpPZmZzZXRSZWN0KHJjUmVjdCwgcHRPZmZzZXQueCwgcHRPZmZzZXQueSk7Ci0gICAgcmNDbGlwID0gQ1BXTF9VdGlsczo6T2Zmc2V0UmVjdChyY0NsaXAsIHB0T2Zmc2V0LngsIHB0T2Zmc2V0LnkpOwotCi0gICAgc0NhcmV0IDw8ICJxXG4iOwotICAgIGlmICghcmNDbGlwLklzRW1wdHkoKSkgewotICAgICAgc0NhcmV0IDw8IHJjQ2xpcC5sZWZ0IDw8ICIgIiA8PCByY0NsaXAuYm90dG9tICsgMi41ZiA8PCAiICIKLSAgICAgICAgICAgICA8PCByY0NsaXAucmlnaHQgLSByY0NsaXAubGVmdCA8PCAiICIKLSAgICAgICAgICAgICA8PCByY0NsaXAudG9wIC0gcmNDbGlwLmJvdHRvbSAtIDQuNWYgPDwgIiByZSBXIG5cbiI7Ci0gICAgfQotICAgIHNDYXJldCA8PCBtX2ZXaWR0aCA8PCAiIHdcbjAgR1xuIjsKLSAgICBzQ2FyZXQgPDwgcmNSZWN0LmxlZnQgKyBtX2ZXaWR0aCAvIDIgPDwgIiAiIDw8IHJjUmVjdC5ib3R0b20gPDwgIiBtXG4iOwotICAgIHNDYXJldCA8PCByY1JlY3QubGVmdCArIG1fZldpZHRoIC8gMiA8PCAiICIgPDwgcmNSZWN0LnRvcCA8PCAiIGwgU1xuUVxuIjsKLQotICAgIHNBcHBTdHJlYW0gPDwgc0NhcmV0OwotICB9Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfQ2FyZXQ6OkdldENhcmV0QXBwZWFyYW5jZVN0cmVhbSgKLSAgICBjb25zdCBDRlhfUG9pbnRGJiBwdE9mZnNldCkgewotICBDRlhfQnl0ZVRleHRCdWYgc0NhcmV0OwotICBHZXRDYXJldEFwcChzQ2FyZXQsIHB0T2Zmc2V0KTsKLSAgcmV0dXJuIHNDYXJldC5NYWtlU3RyaW5nKCk7Ci19Ci0KLXZvaWQgQ1BXTF9DYXJldDo6VGltZXJQcm9jKCkgewotICBpZiAobV9uRGVsYXkgPiAwKSB7Ci0gICAgbV9uRGVsYXktLTsKLSAgfSBlbHNlIHsKLSAgICBtX2JGbGFzaCA9ICFtX2JGbGFzaDsKLSAgICBJbnZhbGlkYXRlUmVjdCgpOwotICB9Ci19Ci0KLUNGWF9GbG9hdFJlY3QgQ1BXTF9DYXJldDo6R2V0Q2FyZXRSZWN0KCkgY29uc3QgewotICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdChtX3B0Rm9vdC54LCBtX3B0Rm9vdC55LCBtX3B0SGVhZC54ICsgbV9mV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgIG1fcHRIZWFkLnkpOwotfQotCi12b2lkIENQV0xfQ2FyZXQ6OlNldENhcmV0KGJvb2wgYlZpc2libGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0SGVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHRGb290KSB7Ci0gIGlmIChiVmlzaWJsZSkgewotICAgIGlmIChJc1Zpc2libGUoKSkgewotICAgICAgaWYgKG1fcHRIZWFkICE9IHB0SGVhZCB8fCBtX3B0Rm9vdCAhPSBwdEZvb3QpIHsKLSAgICAgICAgbV9wdEhlYWQgPSBwdEhlYWQ7Ci0gICAgICAgIG1fcHRGb290ID0gcHRGb290OwotICAgICAgICBtX2JGbGFzaCA9IHRydWU7Ci0gICAgICAgIE1vdmUobV9yY0ludmFsaWQsIGZhbHNlLCB0cnVlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgbV9wdEhlYWQgPSBwdEhlYWQ7Ci0gICAgICBtX3B0Rm9vdCA9IHB0Rm9vdDsKLSAgICAgIEVuZFRpbWVyKCk7Ci0gICAgICBCZWdpblRpbWVyKFBXTF9DQVJFVF9GTEFTSElOVEVSVkFMKTsKLSAgICAgIENQV0xfV25kOjpTZXRWaXNpYmxlKHRydWUpOwotICAgICAgbV9iRmxhc2ggPSB0cnVlOwotICAgICAgTW92ZShtX3JjSW52YWxpZCwgZmFsc2UsIHRydWUpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBtX3B0SGVhZCA9IENGWF9Qb2ludEYoKTsKLSAgICBtX3B0Rm9vdCA9IENGWF9Qb2ludEYoKTsKLSAgICBtX2JGbGFzaCA9IGZhbHNlOwotICAgIGlmIChJc1Zpc2libGUoKSkgewotICAgICAgRW5kVGltZXIoKTsKLSAgICAgIENQV0xfV25kOjpTZXRWaXNpYmxlKGZhbHNlKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDUFdMX0NhcmV0OjpJbnZhbGlkYXRlUmVjdChDRlhfRmxvYXRSZWN0KiBwUmVjdCkgewotICBpZiAocFJlY3QpIHsKLSAgICBDRlhfRmxvYXRSZWN0IHJjUmVmcmVzaCA9IENQV0xfVXRpbHM6OkluZmxhdGVSZWN0KCpwUmVjdCwgMC41Zik7Ci0gICAgcmNSZWZyZXNoLnRvcCArPSAxOwotICAgIHJjUmVmcmVzaC5ib3R0b20gLT0gMTsKLSAgICBDUFdMX1duZDo6SW52YWxpZGF0ZVJlY3QoJnJjUmVmcmVzaCk7Ci0gIH0gZWxzZSB7Ci0gICAgQ1BXTF9XbmQ6OkludmFsaWRhdGVSZWN0KHBSZWN0KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0NhcmV0LmggYi9mcGRmc2RrL3BkZndpbmRvdy9QV0xfQ2FyZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlYmJkYy4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL3BkZndpbmRvdy9QV0xfQ2FyZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGUERGU0RLX1BERldJTkRPV19QV0xfQ0FSRVRfSF8KLSNkZWZpbmUgRlBERlNES19QREZXSU5ET1dfUFdMX0NBUkVUX0hfCi0KLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfV25kLmgiCi0KLXN0cnVjdCBQV0xfQ0FSRVRfSU5GTyB7Ci0gcHVibGljOgotICBQV0xfQ0FSRVRfSU5GTygpOwotCi0gIGJvb2wgYlZpc2libGU7Ci0gIENGWF9Qb2ludEYgcHRIZWFkOwotICBDRlhfUG9pbnRGIHB0Rm9vdDsKLX07Ci0KLWNsYXNzIENQV0xfQ2FyZXQgOiBwdWJsaWMgQ1BXTF9XbmQgewotIHB1YmxpYzoKLSAgQ1BXTF9DYXJldCgpOwotICB+Q1BXTF9DYXJldCgpIG92ZXJyaWRlOwotCi0gIC8vIENQV0xfV25kCi0gIENGWF9CeXRlU3RyaW5nIEdldENsYXNzTmFtZSgpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIEdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSkgb3ZlcnJpZGU7Ci0gIHZvaWQgRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgSW52YWxpZGF0ZVJlY3QoQ0ZYX0Zsb2F0UmVjdCogcFJlY3QgPSBudWxscHRyKSBvdmVycmlkZTsKLSAgdm9pZCBTZXRWaXNpYmxlKGJvb2wgYlZpc2libGUpIG92ZXJyaWRlIHt9Ci0gIHZvaWQgVGltZXJQcm9jKCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBTZXRDYXJldChib29sIGJWaXNpYmxlLAotICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0SGVhZCwKLSAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdEZvb3QpOwotICBDRlhfQnl0ZVN0cmluZyBHZXRDYXJldEFwcGVhcmFuY2VTdHJlYW0oY29uc3QgQ0ZYX1BvaW50RiYgcHRPZmZzZXQpOwotICB2b2lkIFNldEludmFsaWRSZWN0KENGWF9GbG9hdFJlY3QgcmMpIHsgbV9yY0ludmFsaWQgPSByYzsgfQotCi0gcHJpdmF0ZToKLSAgdm9pZCBHZXRDYXJldEFwcChDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0sIGNvbnN0IENGWF9Qb2ludEYmIHB0T2Zmc2V0KTsKLSAgQ0ZYX0Zsb2F0UmVjdCBHZXRDYXJldFJlY3QoKSBjb25zdDsKLQotICBib29sIG1fYkZsYXNoOwotICBDRlhfUG9pbnRGIG1fcHRIZWFkOwotICBDRlhfUG9pbnRGIG1fcHRGb290OwotICBGWF9GTE9BVCBtX2ZXaWR0aDsKLSAgaW50MzJfdCBtX25EZWxheTsKLSAgQ0ZYX0Zsb2F0UmVjdCBtX3JjSW52YWxpZDsKLX07Ci0KLSNlbmRpZiAgLy8gRlBERlNES19QREZXSU5ET1dfUFdMX0NBUkVUX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guY3BwIGIvZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0NvbWJvQm94LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2OTA5YS4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjI2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9Db21ib0JveC5oIgotCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9meGVkaXQvZnhldF9saXN0LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0VkaXQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfRWRpdEN0cmwuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfTGlzdEJveC5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9VdGlscy5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9XbmQuaCIKLSNpbmNsdWRlICJwdWJsaWMvZnBkZl9md2xldmVudC5oIgotCi0jZGVmaW5lIFBXTENCX0RFRkFVTFRGT05UU0laRSAxMi4wZgotCi1ib29sIENQV0xfQ0JMaXN0Qm94OjpPbkxCdXR0b25VcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIHsKLSAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvblVwKHBvaW50LCBuRmxhZyk7Ci0KLSAgaWYgKCFtX2JNb3VzZURvd24pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgUmVsZWFzZUNhcHR1cmUoKTsKLSAgbV9iTW91c2VEb3duID0gZmFsc2U7Ci0KLSAgaWYgKCFDbGllbnRIaXRUZXN0KHBvaW50KSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKENQV0xfV25kKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpCi0gICAgcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX0xCVVRUT05VUCwgMCwgUFdMX01BS0VEV09SRChwb2ludC54LCBwb2ludC55KSk7Ci0KLSAgYm9vbCBiRXhpdCA9IGZhbHNlOwotICBPbk5vdGlmeVNlbENoYW5nZWQoZmFsc2UsIGJFeGl0LCBuRmxhZyk7Ci0KLSAgcmV0dXJuICFiRXhpdDsKLX0KLQotYm9vbCBDUFdMX0NCTGlzdEJveDo6T25LZXlEb3duV2l0aEV4aXQodWludDE2X3QgbkNoYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiRXhpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFnKSB7Ci0gIHN3aXRjaCAobkNoYXIpIHsKLSAgICBjYXNlIEZXTF9WS0VZX1VwOgotICAgIGNhc2UgRldMX1ZLRVlfRG93bjoKLSAgICBjYXNlIEZXTF9WS0VZX0hvbWU6Ci0gICAgY2FzZSBGV0xfVktFWV9MZWZ0OgotICAgIGNhc2UgRldMX1ZLRVlfRW5kOgotICAgIGNhc2UgRldMX1ZLRVlfUmlnaHQ6Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc3dpdGNoIChuQ2hhcikgewotICAgIGNhc2UgRldMX1ZLRVlfVXA6Ci0gICAgICBtX3BMaXN0LT5PblZLX1VQKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGV0xfVktFWV9Eb3duOgotICAgICAgbV9wTGlzdC0+T25WS19ET1dOKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGV0xfVktFWV9Ib21lOgotICAgICAgbV9wTGlzdC0+T25WS19IT01FKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGV0xfVktFWV9MZWZ0OgotICAgICAgbV9wTGlzdC0+T25WS19MRUZUKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGV0xfVktFWV9FbmQ6Ci0gICAgICBtX3BMaXN0LT5PblZLX0VORChJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRldMX1ZLRVlfUmlnaHQ6Ci0gICAgICBtX3BMaXN0LT5PblZLX1JJR0hUKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGV0xfVktFWV9EZWxldGU6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIE9uTm90aWZ5U2VsQ2hhbmdlZCh0cnVlLCBiRXhpdCwgbkZsYWcpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENQV0xfQ0JMaXN0Qm94OjpPbkNoYXJXaXRoRXhpdCh1aW50MTZfdCBuQ2hhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJFeGl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWcpIHsKLSAgaWYgKCFtX3BMaXN0LT5PbkNoYXIobkNoYXIsIElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKENQV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9IChDUFdMX0NvbWJvQm94KilHZXRQYXJlbnRXaW5kb3coKSkKLSAgICBwQ29tYm9Cb3gtPlNldFNlbGVjdFRleHQoKTsKLQotICBPbk5vdGlmeVNlbENoYW5nZWQodHJ1ZSwgYkV4aXQsIG5GbGFnKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDUFdMX0NCQnV0dG9uOjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pIHsKLSAgQ1BXTF9XbmQ6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKHNBcHBTdHJlYW0pOwotCi0gIENGWF9GbG9hdFJlY3QgcmVjdFduZCA9IENQV0xfV25kOjpHZXRXaW5kb3dSZWN0KCk7Ci0KLSAgaWYgKElzVmlzaWJsZSgpICYmICFyZWN0V25kLklzRW1wdHkoKSkgewotICAgIENGWF9CeXRlVGV4dEJ1ZiBzQnV0dG9uOwotCi0gICAgQ0ZYX1BvaW50RiBwdENlbnRlciA9IEdldENlbnRlclBvaW50KCk7Ci0KLSAgICBDRlhfUG9pbnRGIHB0MShwdENlbnRlci54IC0gUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4sCi0gICAgICAgICAgICAgICAgICAgcHRDZW50ZXIueSArIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7Ci0gICAgQ0ZYX1BvaW50RiBwdDIocHRDZW50ZXIueCArIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOLAotICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgKyBQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYpOwotICAgIENGWF9Qb2ludEYgcHQzKHB0Q2VudGVyLngsCi0gICAgICAgICAgICAgICAgICAgcHRDZW50ZXIueSAtIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7Ci0KLSAgICBpZiAoSXNGbG9hdEJpZ2dlcihyZWN0V25kLnJpZ2h0IC0gcmVjdFduZC5sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOICogMikgJiYKLSAgICAgICAgSXNGbG9hdEJpZ2dlcihyZWN0V25kLnRvcCAtIHJlY3RXbmQuYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOKSkgewotICAgICAgc0J1dHRvbiA8PCAiMCBnXG4iOwotICAgICAgc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBtXG4iOwotICAgICAgc0J1dHRvbiA8PCBwdDIueCA8PCAiICIgPDwgcHQyLnkgPDwgIiBsXG4iOwotICAgICAgc0J1dHRvbiA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiBsXG4iOwotICAgICAgc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBsIGZcbiI7Ci0KLSAgICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgc0J1dHRvbiA8PCAiUVxuIjsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDUFdMX0NCQnV0dG9uOjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgewotICBDUFdMX1duZDo6RHJhd1RoaXNBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSk7Ci0KLSAgQ0ZYX0Zsb2F0UmVjdCByZWN0V25kID0gQ1BXTF9XbmQ6OkdldFdpbmRvd1JlY3QoKTsKLQotICBpZiAoSXNWaXNpYmxlKCkgJiYgIXJlY3RXbmQuSXNFbXB0eSgpKSB7Ci0gICAgQ0ZYX1BvaW50RiBwdENlbnRlciA9IEdldENlbnRlclBvaW50KCk7Ci0KLSAgICBDRlhfUG9pbnRGIHB0MShwdENlbnRlci54IC0gUFdMX0NCQlVUVE9OX1RSSUFOR0xFX0hBTEZMRU4sCi0gICAgICAgICAgICAgICAgICAgcHRDZW50ZXIueSArIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7Ci0gICAgQ0ZYX1BvaW50RiBwdDIocHRDZW50ZXIueCArIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOLAotICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgKyBQV0xfQ0JCVVRUT05fVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYpOwotICAgIENGWF9Qb2ludEYgcHQzKHB0Q2VudGVyLngsCi0gICAgICAgICAgICAgICAgICAgcHRDZW50ZXIueSAtIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7Ci0KLSAgICBpZiAoSXNGbG9hdEJpZ2dlcihyZWN0V25kLnJpZ2h0IC0gcmVjdFduZC5sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOICogMikgJiYKLSAgICAgICAgSXNGbG9hdEJpZ2dlcihyZWN0V25kLnRvcCAtIHJlY3RXbmQuYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOKSkgewotICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7Ci0gICAgICBwYXRoLkFwcGVuZFBvaW50KHB0MSwgRlhQVF9UWVBFOjpNb3ZlVG8sIGZhbHNlKTsKLSAgICAgIHBhdGguQXBwZW5kUG9pbnQocHQyLCBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOwotICAgICAgcGF0aC5BcHBlbmRQb2ludChwdDMsIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7Ci0gICAgICBwYXRoLkFwcGVuZFBvaW50KHB0MSwgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKLQotICAgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9ERUZBVUxUX0JMQUNLQ09MT1IuVG9GWENvbG9yKEdldFRyYW5zcGFyZW5jeSgpKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9BTFRFUk5BVEUpOwotICAgIH0KLSAgfQotfQotCi1ib29sIENQV0xfQ0JCdXR0b246Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSB7Ci0gIENQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LCBuRmxhZyk7Ci0KLSAgU2V0Q2FwdHVyZSgpOwotCi0gIGlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKSB7Ci0gICAgcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX0xCVVRUT05ET1dOLCAwLAotICAgICAgICAgICAgICAgICAgICAgIFBXTF9NQUtFRFdPUkQocG9pbnQueCwgcG9pbnQueSkpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1BXTF9DQkJ1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSB7Ci0gIENQV0xfV25kOjpPbkxCdXR0b25VcChwb2ludCwgbkZsYWcpOwotCi0gIFJlbGVhc2VDYXB0dXJlKCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUNQV0xfQ29tYm9Cb3g6OkNQV0xfQ29tYm9Cb3goKQotICAgIDogbV9wRWRpdChudWxscHRyKSwKLSAgICAgIG1fcEJ1dHRvbihudWxscHRyKSwKLSAgICAgIG1fcExpc3QobnVsbHB0ciksCi0gICAgICBtX2JQb3B1cChmYWxzZSksCi0gICAgICBtX25Qb3B1cFdoZXJlKDApLAotICAgICAgbV9uU2VsZWN0SXRlbSgtMSksCi0gICAgICBtX3BGaWxsZXJOb3RpZnkobnVsbHB0cikge30KLQotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Db21ib0JveDo6R2V0Q2xhc3NOYW1lKCkgY29uc3QgewotICByZXR1cm4gIkNQV0xfQ29tYm9Cb3giOwotfQotCi12b2lkIENQV0xfQ29tYm9Cb3g6Ok9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSYgY3ApIHsKLSAgY3AuZHdGbGFncyAmPSB+UFdTX0hTQ1JPTEw7Ci0gIGNwLmR3RmxhZ3MgJj0gflBXU19WU0NST0xMOwotfQotCi12b2lkIENQV0xfQ29tYm9Cb3g6OlNldEZvY3VzKCkgewotICBpZiAobV9wRWRpdCkKLSAgICBtX3BFZGl0LT5TZXRGb2N1cygpOwotfQotCi12b2lkIENQV0xfQ29tYm9Cb3g6OktpbGxGb2N1cygpIHsKLSAgU2V0UG9wdXAoZmFsc2UpOwotICBDUFdMX1duZDo6S2lsbEZvY3VzKCk7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENQV0xfQ29tYm9Cb3g6OkdldFRleHQoKSBjb25zdCB7Ci0gIGlmIChtX3BFZGl0KSB7Ci0gICAgcmV0dXJuIG1fcEVkaXQtPkdldFRleHQoKTsKLSAgfQotICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLX0KLQotdm9pZCBDUFdMX0NvbWJvQm94OjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB0ZXh0KSB7Ci0gIGlmIChtX3BFZGl0KQotICAgIG1fcEVkaXQtPlNldFRleHQodGV4dCk7Ci19Ci0KLXZvaWQgQ1BXTF9Db21ib0JveDo6QWRkU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKLSAgaWYgKG1fcExpc3QpCi0gICAgbV9wTGlzdC0+QWRkU3RyaW5nKHN0cik7Ci19Ci0KLWludDMyX3QgQ1BXTF9Db21ib0JveDo6R2V0U2VsZWN0KCkgY29uc3QgewotICByZXR1cm4gbV9uU2VsZWN0SXRlbTsKLX0KLQotdm9pZCBDUFdMX0NvbWJvQm94OjpTZXRTZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4KSB7Ci0gIGlmIChtX3BMaXN0KQotICAgIG1fcExpc3QtPlNlbGVjdChuSXRlbUluZGV4KTsKLQotICBtX3BFZGl0LT5TZXRUZXh0KG1fcExpc3QtPkdldFRleHQoKSk7Ci0gIG1fblNlbGVjdEl0ZW0gPSBuSXRlbUluZGV4OwotfQotCi12b2lkIENQV0xfQ29tYm9Cb3g6OlNldEVkaXRTZWwoaW50MzJfdCBuU3RhcnRDaGFyLCBpbnQzMl90IG5FbmRDaGFyKSB7Ci0gIGlmIChtX3BFZGl0KQotICAgIG1fcEVkaXQtPlNldFNlbChuU3RhcnRDaGFyLCBuRW5kQ2hhcik7Ci19Ci0KLXZvaWQgQ1BXTF9Db21ib0JveDo6R2V0RWRpdFNlbChpbnQzMl90JiBuU3RhcnRDaGFyLCBpbnQzMl90JiBuRW5kQ2hhcikgY29uc3QgewotICBuU3RhcnRDaGFyID0gLTE7Ci0gIG5FbmRDaGFyID0gLTE7Ci0KLSAgaWYgKG1fcEVkaXQpCi0gICAgbV9wRWRpdC0+R2V0U2VsKG5TdGFydENoYXIsIG5FbmRDaGFyKTsKLX0KLQotdm9pZCBDUFdMX0NvbWJvQm94OjpDbGVhcigpIHsKLSAgaWYgKG1fcEVkaXQpCi0gICAgbV9wRWRpdC0+Q2xlYXIoKTsKLX0KLQotdm9pZCBDUFdMX0NvbWJvQm94OjpDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKSB7Ci0gIENyZWF0ZUVkaXQoY3ApOwotICBDcmVhdGVCdXR0b24oY3ApOwotICBDcmVhdGVMaXN0Qm94KGNwKTsKLX0KLQotdm9pZCBDUFdMX0NvbWJvQm94OjpDcmVhdGVFZGl0KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIHsKLSAgaWYgKCFtX3BFZGl0KSB7Ci0gICAgbV9wRWRpdCA9IG5ldyBDUFdMX0NCRWRpdDsKLSAgICBtX3BFZGl0LT5BdHRhY2hGRkxEYXRhKG1fcEZvcm1GaWxsZXIpOwotCi0gICAgUFdMX0NSRUFURVBBUkFNIGVjcCA9IGNwOwotICAgIGVjcC5wUGFyZW50V25kID0gdGhpczsKLSAgICBlY3AuZHdGbGFncyA9IFBXU19WSVNJQkxFIHwgUFdTX0NISUxEIHwgUFdTX0JPUkRFUiB8IFBFU19DRU5URVIgfAotICAgICAgICAgICAgICAgICAgUEVTX0FVVE9TQ1JPTEwgfCBQRVNfVU5ETzsKLQotICAgIGlmIChIYXNGbGFnKFBXU19BVVRPRk9OVFNJWkUpKQotICAgICAgZWNwLmR3RmxhZ3MgfD0gUFdTX0FVVE9GT05UU0laRTsKLQotICAgIGlmICghSGFzRmxhZyhQQ0JTX0FMTE9XQ1VTVE9NVEVYVCkpCi0gICAgICBlY3AuZHdGbGFncyB8PSBQV1NfUkVBRE9OTFk7Ci0KLSAgICBlY3AucmNSZWN0V25kID0gQ0ZYX0Zsb2F0UmVjdCgwLCAwLCAwLCAwKTsKLSAgICBlY3AuZHdCb3JkZXJXaWR0aCA9IDA7Ci0gICAgZWNwLm5Cb3JkZXJTdHlsZSA9IEJvcmRlclN0eWxlOjpTT0xJRDsKLQotICAgIG1fcEVkaXQtPkNyZWF0ZShlY3ApOwotICB9Ci19Ci0KLXZvaWQgQ1BXTF9Db21ib0JveDo6Q3JlYXRlQnV0dG9uKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIHsKLSAgaWYgKCFtX3BCdXR0b24pIHsKLSAgICBtX3BCdXR0b24gPSBuZXcgQ1BXTF9DQkJ1dHRvbjsKLQotICAgIFBXTF9DUkVBVEVQQVJBTSBiY3AgPSBjcDsKLSAgICBiY3AucFBhcmVudFduZCA9IHRoaXM7Ci0gICAgYmNwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRSB8IFBXU19DSElMRCB8IFBXU19CT1JERVIgfCBQV1NfQkFDS0dST1VORDsKLSAgICBiY3Auc0JhY2tncm91bmRDb2xvciA9IFBXTF9TQ1JPTExCQVJfQktDT0xPUjsKLSAgICBiY3Auc0JvcmRlckNvbG9yID0gUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUjsKLSAgICBiY3AuZHdCb3JkZXJXaWR0aCA9IDI7Ci0gICAgYmNwLm5Cb3JkZXJTdHlsZSA9IEJvcmRlclN0eWxlOjpCRVZFTEVEOwotICAgIGJjcC5lQ3Vyc29yVHlwZSA9IEZYQ1RfQVJST1c7Ci0KLSAgICBtX3BCdXR0b24tPkNyZWF0ZShiY3ApOwotICB9Ci19Ci0KLXZvaWQgQ1BXTF9Db21ib0JveDo6Q3JlYXRlTGlzdEJveChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKSB7Ci0gIGlmICghbV9wTGlzdCkgewotICAgIG1fcExpc3QgPSBuZXcgQ1BXTF9DQkxpc3RCb3g7Ci0gICAgbV9wTGlzdC0+QXR0YWNoRkZMRGF0YShtX3BGb3JtRmlsbGVyKTsKLSAgICBQV0xfQ1JFQVRFUEFSQU0gbGNwID0gY3A7Ci0gICAgbGNwLnBQYXJlbnRXbmQgPSB0aGlzOwotICAgIGxjcC5kd0ZsYWdzID0KLSAgICAgICAgUFdTX0NISUxEIHwgUFdTX0JPUkRFUiB8IFBXU19CQUNLR1JPVU5EIHwgUExCU19IT1ZFUlNFTCB8IFBXU19WU0NST0xMOwotICAgIGxjcC5uQm9yZGVyU3R5bGUgPSBCb3JkZXJTdHlsZTo6U09MSUQ7Ci0gICAgbGNwLmR3Qm9yZGVyV2lkdGggPSAxOwotICAgIGxjcC5lQ3Vyc29yVHlwZSA9IEZYQ1RfQVJST1c7Ci0gICAgbGNwLnJjUmVjdFduZCA9IENGWF9GbG9hdFJlY3QoMCwgMCwgMCwgMCk7Ci0KLSAgICBpZiAoY3AuZHdGbGFncyAmIFBXU19BVVRPRk9OVFNJWkUpCi0gICAgICBsY3AuZkZvbnRTaXplID0gUFdMQ0JfREVGQVVMVEZPTlRTSVpFOwotICAgIGVsc2UKLSAgICAgIGxjcC5mRm9udFNpemUgPSBjcC5mRm9udFNpemU7Ci0KLSAgICBpZiAoY3Auc0JvcmRlckNvbG9yLm5Db2xvclR5cGUgPT0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UKQotICAgICAgbGNwLnNCb3JkZXJDb2xvciA9IFBXTF9ERUZBVUxUX0JMQUNLQ09MT1I7Ci0KLSAgICBpZiAoY3Auc0JhY2tncm91bmRDb2xvci5uQ29sb3JUeXBlID09IENPTE9SVFlQRV9UUkFOU1BBUkVOVCkKLSAgICAgIGxjcC5zQmFja2dyb3VuZENvbG9yID0gUFdMX0RFRkFVTFRfV0hJVEVDT0xPUjsKLQotICAgIG1fcExpc3QtPkNyZWF0ZShsY3ApOwotICB9Ci19Ci0KLXZvaWQgQ1BXTF9Db21ib0JveDo6UmVQb3NDaGlsZFduZCgpIHsKLSAgQ0ZYX0Zsb2F0UmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKLQotICBpZiAobV9iUG9wdXApIHsKLSAgICBDRlhfRmxvYXRSZWN0IHJjbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByY0J1dHRvbiA9IHJjbGllbnQ7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByY0VkaXQgPSByY0NsaWVudDsKLSAgICBDRlhfRmxvYXRSZWN0IHJjTGlzdCA9IENQV0xfV25kOjpHZXRXaW5kb3dSZWN0KCk7Ci0KLSAgICBGWF9GTE9BVCBmT2xkV2luZG93SGVpZ2h0ID0gbV9yY09sZFdpbmRvdy5IZWlnaHQoKTsKLSAgICBGWF9GTE9BVCBmT2xkQ2xpZW50SGVpZ2h0ID0gZk9sZFdpbmRvd0hlaWdodCAtIEdldEJvcmRlcldpZHRoKCkgKiAyOwotCi0gICAgc3dpdGNoIChtX25Qb3B1cFdoZXJlKSB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgIHJjQnV0dG9uLmxlZnQgPSByY0J1dHRvbi5yaWdodCAtIFBXTF9DT01CT0JPWF9CVVRUT05fV0lEVEg7Ci0KLSAgICAgICAgaWYgKHJjQnV0dG9uLmxlZnQgPCByY2xpZW50LmxlZnQpCi0gICAgICAgICAgcmNCdXR0b24ubGVmdCA9IHJjbGllbnQubGVmdDsKLQotICAgICAgICByY0J1dHRvbi5ib3R0b20gPSByY0J1dHRvbi50b3AgLSBmT2xkQ2xpZW50SGVpZ2h0OwotCi0gICAgICAgIHJjRWRpdC5yaWdodCA9IHJjQnV0dG9uLmxlZnQgLSAxLjBmOwotCi0gICAgICAgIGlmIChyY0VkaXQubGVmdCA8IHJjbGllbnQubGVmdCkKLSAgICAgICAgICByY0VkaXQubGVmdCA9IHJjbGllbnQubGVmdDsKLQotICAgICAgICBpZiAocmNFZGl0LnJpZ2h0IDwgcmNFZGl0LmxlZnQpCi0gICAgICAgICAgcmNFZGl0LnJpZ2h0ID0gcmNFZGl0LmxlZnQ7Ci0KLSAgICAgICAgcmNFZGl0LmJvdHRvbSA9IHJjRWRpdC50b3AgLSBmT2xkQ2xpZW50SGVpZ2h0OwotCi0gICAgICAgIHJjTGlzdC50b3AgLT0gZk9sZFdpbmRvd0hlaWdodDsKLQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgcmNCdXR0b24ubGVmdCA9IHJjQnV0dG9uLnJpZ2h0IC0gUFdMX0NPTUJPQk9YX0JVVFRPTl9XSURUSDsKLQotICAgICAgICBpZiAocmNCdXR0b24ubGVmdCA8IHJjbGllbnQubGVmdCkKLSAgICAgICAgICByY0J1dHRvbi5sZWZ0ID0gcmNsaWVudC5sZWZ0OwotCi0gICAgICAgIHJjQnV0dG9uLnRvcCA9IHJjQnV0dG9uLmJvdHRvbSArIGZPbGRDbGllbnRIZWlnaHQ7Ci0KLSAgICAgICAgcmNFZGl0LnJpZ2h0ID0gcmNCdXR0b24ubGVmdCAtIDEuMGY7Ci0KLSAgICAgICAgaWYgKHJjRWRpdC5sZWZ0IDwgcmNsaWVudC5sZWZ0KQotICAgICAgICAgIHJjRWRpdC5sZWZ0ID0gcmNsaWVudC5sZWZ0OwotCi0gICAgICAgIGlmIChyY0VkaXQucmlnaHQgPCByY0VkaXQubGVmdCkKLSAgICAgICAgICByY0VkaXQucmlnaHQgPSByY0VkaXQubGVmdDsKLQotICAgICAgICByY0VkaXQudG9wID0gcmNFZGl0LmJvdHRvbSArIGZPbGRDbGllbnRIZWlnaHQ7Ci0KLSAgICAgICAgcmNMaXN0LmJvdHRvbSArPSBmT2xkV2luZG93SGVpZ2h0OwotCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChtX3BCdXR0b24pCi0gICAgICBtX3BCdXR0b24tPk1vdmUocmNCdXR0b24sIHRydWUsIGZhbHNlKTsKLQotICAgIGlmIChtX3BFZGl0KQotICAgICAgbV9wRWRpdC0+TW92ZShyY0VkaXQsIHRydWUsIGZhbHNlKTsKLQotICAgIGlmIChtX3BMaXN0KSB7Ci0gICAgICBtX3BMaXN0LT5TZXRWaXNpYmxlKHRydWUpOwotICAgICAgbV9wTGlzdC0+TW92ZShyY0xpc3QsIHRydWUsIGZhbHNlKTsKLSAgICAgIG1fcExpc3QtPlNjcm9sbFRvTGlzdEl0ZW0obV9uU2VsZWN0SXRlbSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIENGWF9GbG9hdFJlY3QgcmNCdXR0b24gPSByY0NsaWVudDsKLQotICAgIHJjQnV0dG9uLmxlZnQgPSByY0J1dHRvbi5yaWdodCAtIFBXTF9DT01CT0JPWF9CVVRUT05fV0lEVEg7Ci0KLSAgICBpZiAocmNCdXR0b24ubGVmdCA8IHJjQ2xpZW50LmxlZnQpCi0gICAgICByY0J1dHRvbi5sZWZ0ID0gcmNDbGllbnQubGVmdDsKLQotICAgIGlmIChtX3BCdXR0b24pCi0gICAgICBtX3BCdXR0b24tPk1vdmUocmNCdXR0b24sIHRydWUsIGZhbHNlKTsKLQotICAgIENGWF9GbG9hdFJlY3QgcmNFZGl0ID0gcmNDbGllbnQ7Ci0gICAgcmNFZGl0LnJpZ2h0ID0gcmNCdXR0b24ubGVmdCAtIDEuMGY7Ci0KLSAgICBpZiAocmNFZGl0LmxlZnQgPCByY0NsaWVudC5sZWZ0KQotICAgICAgcmNFZGl0LmxlZnQgPSByY0NsaWVudC5sZWZ0OwotCi0gICAgaWYgKHJjRWRpdC5yaWdodCA8IHJjRWRpdC5sZWZ0KQotICAgICAgcmNFZGl0LnJpZ2h0ID0gcmNFZGl0LmxlZnQ7Ci0KLSAgICBpZiAobV9wRWRpdCkKLSAgICAgIG1fcEVkaXQtPk1vdmUocmNFZGl0LCB0cnVlLCBmYWxzZSk7Ci0KLSAgICBpZiAobV9wTGlzdCkKLSAgICAgIG1fcExpc3QtPlNldFZpc2libGUoZmFsc2UpOwotICB9Ci19Ci0KLXZvaWQgQ1BXTF9Db21ib0JveDo6U2VsZWN0QWxsKCkgewotICBpZiAobV9wRWRpdCAmJiBIYXNGbGFnKFBDQlNfQUxMT1dDVVNUT01URVhUKSkKLSAgICBtX3BFZGl0LT5TZWxlY3RBbGwoKTsKLX0KLQotQ0ZYX0Zsb2F0UmVjdCBDUFdMX0NvbWJvQm94OjpHZXRGb2N1c1JlY3QoKSBjb25zdCB7Ci0gIHJldHVybiBDRlhfRmxvYXRSZWN0KCk7Ci19Ci0KLXZvaWQgQ1BXTF9Db21ib0JveDo6U2V0UG9wdXAoYm9vbCBiUG9wdXApIHsKLSAgaWYgKCFtX3BMaXN0KQotICAgIHJldHVybjsKLSAgaWYgKGJQb3B1cCA9PSBtX2JQb3B1cCkKLSAgICByZXR1cm47Ci0gIEZYX0ZMT0FUIGZMaXN0SGVpZ2h0ID0gbV9wTGlzdC0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKLSAgaWYgKCFJc0Zsb2F0QmlnZ2VyKGZMaXN0SGVpZ2h0LCAwLjBmKSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGJQb3B1cCkgewotICAgIGlmIChtX3BGaWxsZXJOb3RpZnkpIHsKLSNpZmRlZiBQREZfRU5BQkxFX1hGQQotICAgICAgYm9vbCBiRXhpdCA9IGZhbHNlOwotICAgICAgbV9wRmlsbGVyTm90aWZ5LT5PblBvcHVwUHJlT3BlbihHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsIDApOwotICAgICAgaWYgKGJFeGl0KQotICAgICAgICByZXR1cm47Ci0jZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCi0gICAgICBpbnQzMl90IG5XaGVyZSA9IDA7Ci0gICAgICBGWF9GTE9BVCBmUG9wdXBSZXQgPSAwLjBmOwotICAgICAgRlhfRkxPQVQgZlBvcHVwTWluID0gMC4wZjsKLSAgICAgIGlmIChtX3BMaXN0LT5HZXRDb3VudCgpID4gMykKLSAgICAgICAgZlBvcHVwTWluID0KLSAgICAgICAgICAgIG1fcExpc3QtPkdldEZpcnN0SGVpZ2h0KCkgKiAzICsgbV9wTGlzdC0+R2V0Qm9yZGVyV2lkdGgoKSAqIDI7Ci0gICAgICBGWF9GTE9BVCBmUG9wdXBNYXggPSBmTGlzdEhlaWdodCArIG1fcExpc3QtPkdldEJvcmRlcldpZHRoKCkgKiAyOwotICAgICAgbV9wRmlsbGVyTm90aWZ5LT5RdWVyeVdoZXJlUG9wdXAoR2V0QXR0YWNoZWREYXRhKCksIGZQb3B1cE1pbiwgZlBvcHVwTWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbldoZXJlLCBmUG9wdXBSZXQpOwotCi0gICAgICBpZiAoSXNGbG9hdEJpZ2dlcihmUG9wdXBSZXQsIDAuMGYpKSB7Ci0gICAgICAgIG1fYlBvcHVwID0gYlBvcHVwOwotCi0gICAgICAgIENGWF9GbG9hdFJlY3QgcmNXaW5kb3cgPSBDUFdMX1duZDo6R2V0V2luZG93UmVjdCgpOwotICAgICAgICBtX3JjT2xkV2luZG93ID0gcmNXaW5kb3c7Ci0gICAgICAgIHN3aXRjaCAobldoZXJlKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICByY1dpbmRvdy5ib3R0b20gLT0gZlBvcHVwUmV0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgcmNXaW5kb3cudG9wICs9IGZQb3B1cFJldDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgbV9uUG9wdXBXaGVyZSA9IG5XaGVyZTsKLSAgICAgICAgTW92ZShyY1dpbmRvdywgdHJ1ZSwgdHJ1ZSk7Ci0jaWZkZWYgUERGX0VOQUJMRV9YRkEKLSAgICAgICAgYkV4aXQgPSBmYWxzZTsKLSAgICAgICAgbV9wRmlsbGVyTm90aWZ5LT5PblBvcHVwUG9zdE9wZW4oR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LCAwKTsKLSAgICAgICAgaWYgKGJFeGl0KQotICAgICAgICAgIHJldHVybjsKLSNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgbV9iUG9wdXAgPSBiUG9wdXA7Ci0gICAgTW92ZShtX3JjT2xkV2luZG93LCB0cnVlLCB0cnVlKTsKLSAgfQotfQotCi1ib29sIENQV0xfQ29tYm9Cb3g6Ok9uS2V5RG93bih1aW50MTZfdCBuQ2hhciwgdWludDMyX3QgbkZsYWcpIHsKLSAgaWYgKCFtX3BMaXN0KQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCFtX3BFZGl0KQotICAgIHJldHVybiBmYWxzZTsKLQotICBtX25TZWxlY3RJdGVtID0gLTE7Ci0KLSAgc3dpdGNoIChuQ2hhcikgewotICAgIGNhc2UgRldMX1ZLRVlfVXA6Ci0gICAgICBpZiAobV9wTGlzdC0+R2V0Q3VyU2VsKCkgPiAwKSB7Ci0gICAgICAgIGJvb2wgYkV4aXQgPSBmYWxzZTsKLSNpZmRlZiBQREZfRU5BQkxFX1hGQQotICAgICAgICBpZiAobV9wRmlsbGVyTm90aWZ5KSB7Ci0gICAgICAgICAgbV9wRmlsbGVyTm90aWZ5LT5PblBvcHVwUHJlT3BlbihHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsIG5GbGFnKTsKLSAgICAgICAgICBpZiAoYkV4aXQpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgYkV4aXQgPSBmYWxzZTsKLSAgICAgICAgICBtX3BGaWxsZXJOb3RpZnktPk9uUG9wdXBQb3N0T3BlbihHZXRBdHRhY2hlZERhdGEoKSwgYkV4aXQsIG5GbGFnKTsKLSAgICAgICAgICBpZiAoYkV4aXQpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKLSAgICAgICAgaWYgKG1fcExpc3QtPk9uS2V5RG93bldpdGhFeGl0KG5DaGFyLCBiRXhpdCwgbkZsYWcpKSB7Ci0gICAgICAgICAgaWYgKGJFeGl0KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIFNldFNlbGVjdFRleHQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBGV0xfVktFWV9Eb3duOgotICAgICAgaWYgKG1fcExpc3QtPkdldEN1clNlbCgpIDwgbV9wTGlzdC0+R2V0Q291bnQoKSAtIDEpIHsKLSAgICAgICAgYm9vbCBiRXhpdCA9IGZhbHNlOwotI2lmZGVmIFBERl9FTkFCTEVfWEZBCi0gICAgICAgIGlmIChtX3BGaWxsZXJOb3RpZnkpIHsKLSAgICAgICAgICBtX3BGaWxsZXJOb3RpZnktPk9uUG9wdXBQcmVPcGVuKEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCwgbkZsYWcpOwotICAgICAgICAgIGlmIChiRXhpdCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBiRXhpdCA9IGZhbHNlOwotICAgICAgICAgIG1fcEZpbGxlck5vdGlmeS0+T25Qb3B1cFBvc3RPcGVuKEdldEF0dGFjaGVkRGF0YSgpLCBiRXhpdCwgbkZsYWcpOwotICAgICAgICAgIGlmIChiRXhpdCkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQotICAgICAgICBpZiAobV9wTGlzdC0+T25LZXlEb3duV2l0aEV4aXQobkNoYXIsIGJFeGl0LCBuRmxhZykpIHsKLSAgICAgICAgICBpZiAoYkV4aXQpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgU2V0U2VsZWN0VGV4dCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGlmIChIYXNGbGFnKFBDQlNfQUxMT1dDVVNUT01URVhUKSkKLSAgICByZXR1cm4gbV9wRWRpdC0+T25LZXlEb3duKG5DaGFyLCBuRmxhZyk7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENQV0xfQ29tYm9Cb3g6Ok9uQ2hhcih1aW50MTZfdCBuQ2hhciwgdWludDMyX3QgbkZsYWcpIHsKLSAgaWYgKCFtX3BMaXN0KQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoIW1fcEVkaXQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG1fblNlbGVjdEl0ZW0gPSAtMTsKLSAgaWYgKEhhc0ZsYWcoUENCU19BTExPV0NVU1RPTVRFWFQpKQotICAgIHJldHVybiBtX3BFZGl0LT5PbkNoYXIobkNoYXIsIG5GbGFnKTsKLQotICBib29sIGJFeGl0ID0gZmFsc2U7Ci0jaWZkZWYgUERGX0VOQUJMRV9YRkEKLSAgaWYgKG1fcEZpbGxlck5vdGlmeSkgewotICAgIG1fcEZpbGxlck5vdGlmeS0+T25Qb3B1cFByZU9wZW4oR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LCBuRmxhZyk7Ci0gICAgaWYgKGJFeGl0KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgbV9wRmlsbGVyTm90aWZ5LT5PblBvcHVwUG9zdE9wZW4oR2V0QXR0YWNoZWREYXRhKCksIGJFeGl0LCBuRmxhZyk7Ci0gICAgaWYgKGJFeGl0KQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0jZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCi0gIHJldHVybiBtX3BMaXN0LT5PbkNoYXJXaXRoRXhpdChuQ2hhciwgYkV4aXQsIG5GbGFnKSA/IGJFeGl0IDogZmFsc2U7Ci19Ci0KLXZvaWQgQ1BXTF9Db21ib0JveDo6T25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3Qgd1BhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCBsUGFyYW0pIHsKLSAgc3dpdGNoIChtc2cpIHsKLSAgICBjYXNlIFBOTV9MQlVUVE9ORE9XTjoKLSAgICAgIGlmIChwV25kID09IG1fcEJ1dHRvbikgewotICAgICAgICBTZXRQb3B1cCghbV9iUG9wdXApOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBOTV9MQlVUVE9OVVA6Ci0gICAgICBpZiAobV9wRWRpdCAmJiBtX3BMaXN0KSB7Ci0gICAgICAgIGlmIChwV25kID09IG1fcExpc3QpIHsKLSAgICAgICAgICBTZXRTZWxlY3RUZXh0KCk7Ci0gICAgICAgICAgU2VsZWN0QWxsKCk7Ci0gICAgICAgICAgbV9wRWRpdC0+U2V0Rm9jdXMoKTsKLSAgICAgICAgICBTZXRQb3B1cChmYWxzZSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gIH0KLQotICBDUFdMX1duZDo6T25Ob3RpZnkocFduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7Ci19Ci0KLWJvb2wgQ1BXTF9Db21ib0JveDo6SXNQb3B1cCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fYlBvcHVwOwotfQotCi12b2lkIENQV0xfQ29tYm9Cb3g6OlNldFNlbGVjdFRleHQoKSB7Ci0gIG1fcEVkaXQtPlNlbGVjdEFsbCgpOwotICBtX3BFZGl0LT5SZXBsYWNlU2VsKG1fcExpc3QtPkdldFRleHQoKSk7Ci0gIG1fcEVkaXQtPlNlbGVjdEFsbCgpOwotICBtX25TZWxlY3RJdGVtID0gbV9wTGlzdC0+R2V0Q3VyU2VsKCk7Ci19Ci0KLXZvaWQgQ1BXTF9Db21ib0JveDo6U2V0RmlsbGVyTm90aWZ5KElQV0xfRmlsbGVyX05vdGlmeSogcE5vdGlmeSkgewotICBtX3BGaWxsZXJOb3RpZnkgPSBwTm90aWZ5OwotCi0gIGlmIChtX3BFZGl0KQotICAgIG1fcEVkaXQtPlNldEZpbGxlck5vdGlmeShwTm90aWZ5KTsKLQotICBpZiAobV9wTGlzdCkKLSAgICBtX3BMaXN0LT5TZXRGaWxsZXJOb3RpZnkocE5vdGlmeSk7Ci19CmRpZmYgLS1naXQgYS9mcGRmc2RrL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guaCBiL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9Db21ib0JveC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWE4ZGY3Li4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9Db21ib0JveC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGUERGU0RLX1BERldJTkRPV19QV0xfQ09NQk9CT1hfSF8KLSNkZWZpbmUgRlBERlNES19QREZXSU5ET1dfUFdMX0NPTUJPQk9YX0hfCi0KLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfRWRpdC5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9MaXN0Qm94LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX1duZC5oIgotCi1jbGFzcyBDUFdMX0NCRWRpdCA6IHB1YmxpYyBDUFdMX0VkaXQgewotIHB1YmxpYzoKLSAgQ1BXTF9DQkVkaXQoKSB7fQotICB+Q1BXTF9DQkVkaXQoKSBvdmVycmlkZSB7fQotfTsKLQotY2xhc3MgQ1BXTF9DQkxpc3RCb3ggOiBwdWJsaWMgQ1BXTF9MaXN0Qm94IHsKLSBwdWJsaWM6Ci0gIENQV0xfQ0JMaXN0Qm94KCkge30KLSAgfkNQV0xfQ0JMaXN0Qm94KCkgb3ZlcnJpZGUge30KLQotICAvLyBDUFdMX0xpc3RCb3gKLSAgYm9vbCBPbkxCdXR0b25VcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOwotCi0gIGJvb2wgT25LZXlEb3duV2l0aEV4aXQodWludDE2X3QgbkNoYXIsIGJvb2wmIGJFeGl0LCB1aW50MzJfdCBuRmxhZyk7Ci0gIGJvb2wgT25DaGFyV2l0aEV4aXQodWludDE2X3QgbkNoYXIsIGJvb2wmIGJFeGl0LCB1aW50MzJfdCBuRmxhZyk7Ci19OwotCi0jZGVmaW5lIFBXTF9DT01CT0JPWF9CVVRUT05fV0lEVEggMTMKLQotY2xhc3MgQ1BXTF9DQkJ1dHRvbiA6IHB1YmxpYyBDUFdMX1duZCB7Ci0gcHVibGljOgotICBDUFdMX0NCQnV0dG9uKCkge30KLSAgfkNQV0xfQ0JCdXR0b24oKSBvdmVycmlkZSB7fQotCi0gIC8vIENQV0xfV25kCi0gIHZvaWQgR2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtKSBvdmVycmlkZTsKLSAgdm9pZCBEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKSBvdmVycmlkZTsKLSAgYm9vbCBPbkxCdXR0b25Eb3duKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgb3ZlcnJpZGU7Ci0gIGJvb2wgT25MQnV0dG9uVXAoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKLX07Ci0KLWNsYXNzIENQV0xfQ29tYm9Cb3ggOiBwdWJsaWMgQ1BXTF9XbmQgewotIHB1YmxpYzoKLSAgQ1BXTF9Db21ib0JveCgpOwotICB+Q1BXTF9Db21ib0JveCgpIG92ZXJyaWRlIHt9Ci0KLSAgQ1BXTF9FZGl0KiBHZXRFZGl0KCkgY29uc3QgeyByZXR1cm4gbV9wRWRpdDsgfQotCi0gIC8vIENQV0xfV25kOgotICBDRlhfQnl0ZVN0cmluZyBHZXRDbGFzc05hbWUoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0mIGNwKSBvdmVycmlkZTsKLSAgYm9vbCBPbktleURvd24odWludDE2X3QgbkNoYXIsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKLSAgYm9vbCBPbkNoYXIodWludDE2X3QgbkNoYXIsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKLSAgdm9pZCBPbk5vdGlmeShDUFdMX1duZCogcFduZCwKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBtc2csCi0gICAgICAgICAgICAgICAgaW50cHRyX3Qgd1BhcmFtID0gMCwKLSAgICAgICAgICAgICAgICBpbnRwdHJfdCBsUGFyYW0gPSAwKSBvdmVycmlkZTsKLSAgdm9pZCBDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKSBvdmVycmlkZTsKLSAgdm9pZCBSZVBvc0NoaWxkV25kKCkgb3ZlcnJpZGU7Ci0gIENGWF9GbG9hdFJlY3QgR2V0Rm9jdXNSZWN0KCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgU2V0Rm9jdXMoKSBvdmVycmlkZTsKLSAgdm9pZCBLaWxsRm9jdXMoKSBvdmVycmlkZTsKLQotICB2b2lkIFNldEZpbGxlck5vdGlmeShJUFdMX0ZpbGxlcl9Ob3RpZnkqIHBOb3RpZnkpOwotCi0gIENGWF9XaWRlU3RyaW5nIEdldFRleHQoKSBjb25zdDsKLSAgdm9pZCBTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB0ZXh0KTsKLSAgdm9pZCBBZGRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7Ci0gIGludDMyX3QgR2V0U2VsZWN0KCkgY29uc3Q7Ci0gIHZvaWQgU2V0U2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCk7Ci0KLSAgdm9pZCBTZXRFZGl0U2VsKGludDMyX3QgblN0YXJ0Q2hhciwgaW50MzJfdCBuRW5kQ2hhcik7Ci0gIHZvaWQgR2V0RWRpdFNlbChpbnQzMl90JiBuU3RhcnRDaGFyLCBpbnQzMl90JiBuRW5kQ2hhcikgY29uc3Q7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgdm9pZCBTZWxlY3RBbGwoKTsKLSAgYm9vbCBJc1BvcHVwKCkgY29uc3Q7Ci0KLSAgdm9pZCBTZXRTZWxlY3RUZXh0KCk7Ci0KLSAgdm9pZCBBdHRhY2hGRkxEYXRhKENGRkxfRm9ybUZpbGxlciogcERhdGEpIHsgbV9wRm9ybUZpbGxlciA9IHBEYXRhOyB9Ci0KLSBwcml2YXRlOgotICB2b2lkIENyZWF0ZUVkaXQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCk7Ci0gIHZvaWQgQ3JlYXRlQnV0dG9uKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApOwotICB2b2lkIENyZWF0ZUxpc3RCb3goY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCk7Ci0gIHZvaWQgU2V0UG9wdXAoYm9vbCBiUG9wdXApOwotCi0gIENQV0xfQ0JFZGl0KiBtX3BFZGl0OwotICBDUFdMX0NCQnV0dG9uKiBtX3BCdXR0b247Ci0gIENQV0xfQ0JMaXN0Qm94KiBtX3BMaXN0OwotICBib29sIG1fYlBvcHVwOwotICBDRlhfRmxvYXRSZWN0IG1fcmNPbGRXaW5kb3c7Ci0gIGludDMyX3QgbV9uUG9wdXBXaGVyZTsKLSAgaW50MzJfdCBtX25TZWxlY3RJdGVtOwotICBJUFdMX0ZpbGxlcl9Ob3RpZnkqIG1fcEZpbGxlck5vdGlmeTsKLSAgQ0ZGTF9Gb3JtRmlsbGVyKiBtX3BGb3JtRmlsbGVyOyAgLy8gTm90IG93bmVkLgotfTsKLQotI2VuZGlmICAvLyBGUERGU0RLX1BERldJTkRPV19QV0xfQ09NQk9CT1hfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9FZGl0LmNwcCBiL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9FZGl0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc3YWFkOS4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL3BkZndpbmRvdy9QV0xfRWRpdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NzggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0VkaXQuaCIKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2ZvbnQuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3B2dF93b3JkLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF94bWwuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGVkYXRhLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZvbnQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2Z4ZWRpdC9meGV0X2VkaXQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfQ2FyZXQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfRWRpdEN0cmwuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfRm9udE1hcC5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfVXRpbHMuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfV25kLmgiCi0jaW5jbHVkZSAicHVibGljL2ZwZGZfZndsZXZlbnQuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCi0KLUNQV0xfRWRpdDo6Q1BXTF9FZGl0KCkKLSAgICA6IG1fcEZpbGxlck5vdGlmeShudWxscHRyKSwgbV9iRm9jdXMoZmFsc2UpLCBtX3BGb3JtRmlsbGVyKG51bGxwdHIpIHt9Ci0KLUNQV0xfRWRpdDo6fkNQV0xfRWRpdCgpIHsKLSAgQVNTRVJUKG1fYkZvY3VzID09IGZhbHNlKTsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9FZGl0OjpHZXRDbGFzc05hbWUoKSBjb25zdCB7Ci0gIHJldHVybiBQV0xfQ0xBU1NOQU1FX0VESVQ7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0OjpPbkRlc3Ryb3koKSB7fQotCi12b2lkIENQV0xfRWRpdDo6U2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NUZXh0KSB7Ci0gIENGWF9XaWRlU3RyaW5nIHN3VGV4dCA9IGNzVGV4dDsKLSAgaWYgKCFIYXNGbGFnKFBFU19SSUNIKSkgewotICAgIG1fcEVkaXQtPlNldFRleHQoc3dUZXh0KTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDRlhfQnl0ZVN0cmluZyBzVmFsdWUgPSBDRlhfQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoc3dUZXh0KTsKLSAgc3RkOjp1bmlxdWVfcHRyPENYTUxfRWxlbWVudD4gcFhNTCgKLSAgICAgIENYTUxfRWxlbWVudDo6UGFyc2Uoc1ZhbHVlLmNfc3RyKCksIHNWYWx1ZS5HZXRMZW5ndGgoKSkpOwotICBpZiAoIXBYTUwpIHsKLSAgICBtX3BFZGl0LT5TZXRUZXh0KHN3VGV4dCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW50MzJfdCBuQ291bnQgPSBwWE1MLT5Db3VudENoaWxkcmVuKCk7Ci0gIGJvb2wgYkZpcnN0ID0gdHJ1ZTsKLQotICBzd1RleHQuY2xlYXIoKTsKLQotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgewotICAgIENYTUxfRWxlbWVudCogcFN1YkVsZW1lbnQgPSBwWE1MLT5HZXRFbGVtZW50KGkpOwotICAgIGlmICghcFN1YkVsZW1lbnQpCi0gICAgICBjb250aW51ZTsKLQotICAgIENGWF9CeXRlU3RyaW5nIHRhZyA9IHBTdWJFbGVtZW50LT5HZXRUYWdOYW1lKCk7Ci0gICAgaWYgKHRhZy5FcXVhbE5vQ2FzZSgicCIpKSB7Ci0gICAgICBpbnQgbkNoaWxkID0gcFN1YkVsZW1lbnQtPkNvdW50Q2hpbGRyZW4oKTsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHN3U2VjdGlvbjsKLSAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IG5DaGlsZDsgaisrKQotICAgICAgICBzd1NlY3Rpb24gKz0gcFN1YkVsZW1lbnQtPkdldENvbnRlbnQoaik7Ci0KLSAgICAgIGlmIChiRmlyc3QpCi0gICAgICAgIGJGaXJzdCA9IGZhbHNlOwotICAgICAgZWxzZQotICAgICAgICBzd1RleHQgKz0gRldMX1ZLRVlfUmV0dXJuOwotICAgICAgc3dUZXh0ICs9IHN3U2VjdGlvbjsKLSAgICB9Ci0gIH0KLQotICBtX3BFZGl0LT5TZXRUZXh0KHN3VGV4dCk7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0OjpSZVBvc0NoaWxkV25kKCkgewotICBpZiAoQ1BXTF9TY3JvbGxCYXIqIHBWU0IgPSBHZXRWU2Nyb2xsQmFyKCkpIHsKLSAgICBDRlhfRmxvYXRSZWN0IHJjV2luZG93ID0gbV9yY09sZFdpbmRvdzsKLSAgICBDRlhfRmxvYXRSZWN0IHJjVlNjcm9sbCA9Ci0gICAgICAgIENGWF9GbG9hdFJlY3QocmNXaW5kb3cucmlnaHQsIHJjV2luZG93LmJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICByY1dpbmRvdy5yaWdodCArIFBXTF9TQ1JPTExCQVJfV0lEVEgsIHJjV2luZG93LnRvcCk7Ci0gICAgcFZTQi0+TW92ZShyY1ZTY3JvbGwsIHRydWUsIGZhbHNlKTsKLSAgfQotCi0gIGlmIChtX3BFZGl0Q2FyZXQgJiYgIUhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykpCi0gICAgbV9wRWRpdENhcmV0LT5TZXRDbGlwUmVjdChDUFdMX1V0aWxzOjpJbmZsYXRlUmVjdCgKLSAgICAgICAgR2V0Q2xpZW50UmVjdCgpLCAxLjBmKSk7ICAvLyArMSBmb3IgY2FyZXQgYmVzaWRlIGJvcmRlcgotCi0gIENQV0xfRWRpdEN0cmw6OlJlUG9zQ2hpbGRXbmQoKTsKLX0KLQotQ0ZYX0Zsb2F0UmVjdCBDUFdMX0VkaXQ6OkdldENsaWVudFJlY3QoKSBjb25zdCB7Ci0gIENGWF9GbG9hdFJlY3QgcmNDbGllbnQgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdCgKLSAgICAgIEdldFdpbmRvd1JlY3QoKSwgKEZYX0ZMT0FUKShHZXRCb3JkZXJXaWR0aCgpICsgR2V0SW5uZXJCb3JkZXJXaWR0aCgpKSk7Ci0KLSAgaWYgKENQV0xfU2Nyb2xsQmFyKiBwVlNCID0gR2V0VlNjcm9sbEJhcigpKSB7Ci0gICAgaWYgKHBWU0ItPklzVmlzaWJsZSgpKSB7Ci0gICAgICByY0NsaWVudC5yaWdodCAtPSBQV0xfU0NST0xMQkFSX1dJRFRIOwotICAgIH0KLSAgfQotCi0gIHJldHVybiByY0NsaWVudDsKLX0KLQotdm9pZCBDUFdMX0VkaXQ6OlNldEFsaWduRm9ybWF0VihQV0xfRURJVF9BTElHTkZPUk1BVF9WIG5Gb3JtYXQsIGJvb2wgYlBhaW50KSB7Ci0gIG1fcEVkaXQtPlNldEFsaWdubWVudFYoKGludDMyX3QpbkZvcm1hdCwgYlBhaW50KTsKLX0KLQotYm9vbCBDUFdMX0VkaXQ6OkNhblNlbGVjdEFsbCgpIGNvbnN0IHsKLSAgcmV0dXJuIEdldFNlbGVjdFdvcmRSYW5nZSgpICE9IG1fcEVkaXQtPkdldFdob2xlV29yZFJhbmdlKCk7Ci19Ci0KLWJvb2wgQ1BXTF9FZGl0OjpDYW5DbGVhcigpIGNvbnN0IHsKLSAgcmV0dXJuICFJc1JlYWRPbmx5KCkgJiYgbV9wRWRpdC0+SXNTZWxlY3RlZCgpOwotfQotCi1ib29sIENQV0xfRWRpdDo6Q2FuQ29weSgpIGNvbnN0IHsKLSAgcmV0dXJuICFIYXNGbGFnKFBFU19QQVNTV09SRCkgJiYgIUhhc0ZsYWcoUEVTX05PUkVBRCkgJiYKLSAgICAgICAgIG1fcEVkaXQtPklzU2VsZWN0ZWQoKTsKLX0KLQotYm9vbCBDUFdMX0VkaXQ6OkNhbkN1dCgpIGNvbnN0IHsKLSAgcmV0dXJuIENhbkNvcHkoKSAmJiAhSXNSZWFkT25seSgpOwotfQotdm9pZCBDUFdMX0VkaXQ6OkN1dFRleHQoKSB7Ci0gIGlmICghQ2FuQ3V0KCkpCi0gICAgcmV0dXJuOwotICBtX3BFZGl0LT5DbGVhcigpOwotfQotCi12b2lkIENQV0xfRWRpdDo6T25DcmVhdGVkKCkgewotICBDUFdMX0VkaXRDdHJsOjpPbkNyZWF0ZWQoKTsKLQotICBpZiAoQ1BXTF9TY3JvbGxCYXIqIHBTY3JvbGwgPSBHZXRWU2Nyb2xsQmFyKCkpIHsKLSAgICBwU2Nyb2xsLT5SZW1vdmVGbGFnKFBXU19BVVRPVFJBTlNQQVJFTlQpOwotICAgIHBTY3JvbGwtPlNldFRyYW5zcGFyZW5jeSgyNTUpOwotICB9Ci0KLSAgU2V0UGFyYW1CeUZsYWcoKTsKLQotICBtX3JjT2xkV2luZG93ID0gR2V0V2luZG93UmVjdCgpOwotCi0gIG1fcEVkaXQtPlNldE9wck5vdGlmeSh0aGlzKTsKLSAgbV9wRWRpdC0+RW5hYmxlT3ByTm90aWZ5KHRydWUpOwotfQotCi12b2lkIENQV0xfRWRpdDo6U2V0UGFyYW1CeUZsYWcoKSB7Ci0gIGlmIChIYXNGbGFnKFBFU19SSUdIVCkpIHsKLSAgICBtX3BFZGl0LT5TZXRBbGlnbm1lbnRIKDIsIGZhbHNlKTsKLSAgfSBlbHNlIGlmIChIYXNGbGFnKFBFU19NSURETEUpKSB7Ci0gICAgbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgxLCBmYWxzZSk7Ci0gIH0gZWxzZSB7Ci0gICAgbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgwLCBmYWxzZSk7Ci0gIH0KLQotICBpZiAoSGFzRmxhZyhQRVNfQk9UVE9NKSkgewotICAgIG1fcEVkaXQtPlNldEFsaWdubWVudFYoMiwgZmFsc2UpOwotICB9IGVsc2UgaWYgKEhhc0ZsYWcoUEVTX0NFTlRFUikpIHsKLSAgICBtX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDEsIGZhbHNlKTsKLSAgfSBlbHNlIHsKLSAgICBtX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDAsIGZhbHNlKTsKLSAgfQotCi0gIGlmIChIYXNGbGFnKFBFU19QQVNTV09SRCkpIHsKLSAgICBtX3BFZGl0LT5TZXRQYXNzd29yZENoYXIoJyonLCBmYWxzZSk7Ci0gIH0KLQotICBtX3BFZGl0LT5TZXRNdWx0aUxpbmUoSGFzRmxhZyhQRVNfTVVMVElMSU5FKSwgZmFsc2UpOwotICBtX3BFZGl0LT5TZXRBdXRvUmV0dXJuKEhhc0ZsYWcoUEVTX0FVVE9SRVRVUk4pLCBmYWxzZSk7Ci0gIG1fcEVkaXQtPlNldEF1dG9Gb250U2l6ZShIYXNGbGFnKFBXU19BVVRPRk9OVFNJWkUpLCBmYWxzZSk7Ci0gIG1fcEVkaXQtPlNldEF1dG9TY3JvbGwoSGFzRmxhZyhQRVNfQVVUT1NDUk9MTCksIGZhbHNlKTsKLSAgbV9wRWRpdC0+RW5hYmxlVW5kbyhIYXNGbGFnKFBFU19VTkRPKSk7Ci0KLSAgaWYgKEhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykpIHsKLSAgICBTZXRDbGlwUmVjdChDRlhfRmxvYXRSZWN0KDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYpKTsKLSAgICBtX3BFZGl0LT5TZXRUZXh0T3ZlcmZsb3codHJ1ZSwgZmFsc2UpOwotICB9IGVsc2UgewotICAgIGlmIChtX3BFZGl0Q2FyZXQpIHsKLSAgICAgIG1fcEVkaXRDYXJldC0+U2V0Q2xpcFJlY3QoQ1BXTF9VdGlsczo6SW5mbGF0ZVJlY3QoCi0gICAgICAgICAgR2V0Q2xpZW50UmVjdCgpLCAxLjBmKSk7ICAvLyArMSBmb3IgY2FyZXQgYmVzaWRlIGJvcmRlcgotICAgIH0KLSAgfQotfQotCi12b2lkIENQV0xfRWRpdDo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtKSB7Ci0gIENQV0xfV25kOjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShzQXBwU3RyZWFtKTsKLQotICBDRlhfRmxvYXRSZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotICBDRlhfQnl0ZVRleHRCdWYgc0xpbmU7Ci0KLSAgaW50MzJfdCBuQ2hhckFycmF5ID0gbV9wRWRpdC0+R2V0Q2hhckFycmF5KCk7Ci0KLSAgaWYgKG5DaGFyQXJyYXkgPiAwKSB7Ci0gICAgc3dpdGNoIChHZXRCb3JkZXJTdHlsZSgpKSB7Ci0gICAgICBjYXNlIEJvcmRlclN0eWxlOjpTT0xJRDogewotICAgICAgICBzTGluZSA8PCAicVxuIgotICAgICAgICAgICAgICA8PCBHZXRCb3JkZXJXaWR0aCgpIDw8ICIgd1xuIgotICAgICAgICAgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCb3JkZXJDb2xvcigpLCBmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgIC5Bc1N0cmluZ0MoKQotICAgICAgICAgICAgICA8PCAiIDIgSiAwIGpcbiI7Ci0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgbkNoYXJBcnJheTsgaSsrKSB7Ci0gICAgICAgICAgc0xpbmUgPDwgcmNDbGllbnQubGVmdCArCi0gICAgICAgICAgICAgICAgICAgICAgICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KSAvIG5DaGFyQXJyYXkpICogaQotICAgICAgICAgICAgICAgIDw8ICIgIiA8PCByY0NsaWVudC5ib3R0b20gPDwgIiBtXG4iCi0gICAgICAgICAgICAgICAgPDwgcmNDbGllbnQubGVmdCArCi0gICAgICAgICAgICAgICAgICAgICAgICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KSAvIG5DaGFyQXJyYXkpICogaQotICAgICAgICAgICAgICAgIDw8ICIgIiA8PCByY0NsaWVudC50b3AgPDwgIiBsIFNcbiI7Ci0gICAgICAgIH0KLQotICAgICAgICBzTGluZSA8PCAiUVxuIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEJvcmRlclN0eWxlOjpEQVNIOiB7Ci0gICAgICAgIHNMaW5lIDw8ICJxXG4iCi0gICAgICAgICAgICAgIDw8IEdldEJvcmRlcldpZHRoKCkgPDwgIiB3XG4iCi0gICAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKEdldEJvcmRlckNvbG9yKCksIGZhbHNlKQotICAgICAgICAgICAgICAgICAgICAgLkFzU3RyaW5nQygpCi0gICAgICAgICAgICAgIDw8ICIgMiBKIDAgalxuIgotICAgICAgICAgICAgICA8PCAiWyIgPDwgR2V0Qm9yZGVyRGFzaCgpLm5EYXNoIDw8ICIgIiA8PCBHZXRCb3JkZXJEYXNoKCkubkdhcAotICAgICAgICAgICAgICA8PCAiXSAiIDw8IEdldEJvcmRlckRhc2goKS5uUGhhc2UgPDwgIiBkXG4iOwotCi0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IG5DaGFyQXJyYXk7IGkrKykgewotICAgICAgICAgIHNMaW5lIDw8IHJjQ2xpZW50LmxlZnQgKwotICAgICAgICAgICAgICAgICAgICAgICAoKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCkgLyBuQ2hhckFycmF5KSAqIGkKLSAgICAgICAgICAgICAgICA8PCAiICIgPDwgcmNDbGllbnQuYm90dG9tIDw8ICIgbVxuIgotICAgICAgICAgICAgICAgIDw8IHJjQ2xpZW50LmxlZnQgKwotICAgICAgICAgICAgICAgICAgICAgICAoKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCkgLyBuQ2hhckFycmF5KSAqIGkKLSAgICAgICAgICAgICAgICA8PCAiICIgPDwgcmNDbGllbnQudG9wIDw8ICIgbCBTXG4iOwotICAgICAgICB9Ci0KLSAgICAgICAgc0xpbmUgPDwgIlFcbiI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgc0FwcFN0cmVhbSA8PCBzTGluZTsKLQotICBDRlhfQnl0ZVRleHRCdWYgc1RleHQ7Ci0gIENGWF9Qb2ludEYgcHRPZmZzZXQ7Ci0gIENQVlRfV29yZFJhbmdlIHdyV2hvbGUgPSBtX3BFZGl0LT5HZXRXaG9sZVdvcmRSYW5nZSgpOwotICBDUFZUX1dvcmRSYW5nZSB3clNlbGVjdCA9IEdldFNlbGVjdFdvcmRSYW5nZSgpOwotICBDUFZUX1dvcmRSYW5nZSB3clZpc2libGUgPQotICAgICAgSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSA/IHdyV2hvbGUgOiBtX3BFZGl0LT5HZXRWaXNpYmxlV29yZFJhbmdlKCk7Ci0KLSAgQ1BWVF9Xb3JkUmFuZ2Ugd3JTZWxCZWZvcmUod3JXaG9sZS5CZWdpblBvcywgd3JTZWxlY3QuQmVnaW5Qb3MpOwotICBDUFZUX1dvcmRSYW5nZSB3clNlbEFmdGVyKHdyU2VsZWN0LkVuZFBvcywgd3JXaG9sZS5FbmRQb3MpOwotICBDUFZUX1dvcmRSYW5nZSB3clRlbXAgPQotICAgICAgQ1BXTF9VdGlsczo6T3ZlcmxhcFdvcmRSYW5nZShHZXRTZWxlY3RXb3JkUmFuZ2UoKSwgd3JWaXNpYmxlKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgc0VkaXRTZWwgPQotICAgICAgQ1BXTF9VdGlsczo6R2V0RWRpdFNlbEFwcFN0cmVhbShtX3BFZGl0LmdldCgpLCBwdE9mZnNldCwgJndyVGVtcCk7Ci0KLSAgaWYgKHNFZGl0U2VsLkdldExlbmd0aCgpID4gMCkKLSAgICBzVGV4dCA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShQV0xfREVGQVVMVF9TRUxCQUNLQ09MT1IpLkFzU3RyaW5nQygpCi0gICAgICAgICAgPDwgc0VkaXRTZWwuQXNTdHJpbmdDKCk7Ci0KLSAgd3JUZW1wID0gQ1BXTF9VdGlsczo6T3ZlcmxhcFdvcmRSYW5nZSh3clZpc2libGUsIHdyU2VsQmVmb3JlKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgc0VkaXRCZWZvcmUgPSBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKAotICAgICAgbV9wRWRpdC5nZXQoKSwgcHRPZmZzZXQsICZ3clRlbXAsICFIYXNGbGFnKFBFU19DSEFSQVJSQVkpLAotICAgICAgbV9wRWRpdC0+R2V0UGFzc3dvcmRDaGFyKCkpOwotCi0gIGlmIChzRWRpdEJlZm9yZS5HZXRMZW5ndGgoKSA+IDApCi0gICAgc1RleHQgPDwgIkJUXG4iCi0gICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0VGV4dENvbG9yKCkpLkFzU3RyaW5nQygpCi0gICAgICAgICAgPDwgc0VkaXRCZWZvcmUuQXNTdHJpbmdDKCkgPDwgIkVUXG4iOwotCi0gIHdyVGVtcCA9IENQV0xfVXRpbHM6Ok92ZXJsYXBXb3JkUmFuZ2Uod3JWaXNpYmxlLCB3clNlbGVjdCk7Ci0gIENGWF9CeXRlU3RyaW5nIHNFZGl0TWlkID0gQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbSgKLSAgICAgIG1fcEVkaXQuZ2V0KCksIHB0T2Zmc2V0LCAmd3JUZW1wLCAhSGFzRmxhZyhQRVNfQ0hBUkFSUkFZKSwKLSAgICAgIG1fcEVkaXQtPkdldFBhc3N3b3JkQ2hhcigpKTsKLQotICBpZiAoc0VkaXRNaWQuR2V0TGVuZ3RoKCkgPiAwKQotICAgIHNUZXh0IDw8ICJCVFxuIgotICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVksIDEpKQotICAgICAgICAgICAgICAgICAuQXNTdHJpbmdDKCkKLSAgICAgICAgICA8PCBzRWRpdE1pZC5Bc1N0cmluZ0MoKSA8PCAiRVRcbiI7Ci0KLSAgd3JUZW1wID0gQ1BXTF9VdGlsczo6T3ZlcmxhcFdvcmRSYW5nZSh3clZpc2libGUsIHdyU2VsQWZ0ZXIpOwotICBDRlhfQnl0ZVN0cmluZyBzRWRpdEFmdGVyID0gQ1BXTF9VdGlsczo6R2V0RWRpdEFwcFN0cmVhbSgKLSAgICAgIG1fcEVkaXQuZ2V0KCksIHB0T2Zmc2V0LCAmd3JUZW1wLCAhSGFzRmxhZyhQRVNfQ0hBUkFSUkFZKSwKLSAgICAgIG1fcEVkaXQtPkdldFBhc3N3b3JkQ2hhcigpKTsKLQotICBpZiAoc0VkaXRBZnRlci5HZXRMZW5ndGgoKSA+IDApCi0gICAgc1RleHQgPDwgIkJUXG4iCi0gICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oR2V0VGV4dENvbG9yKCkpLkFzU3RyaW5nQygpCi0gICAgICAgICAgPDwgc0VkaXRBZnRlci5Bc1N0cmluZ0MoKSA8PCAiRVRcbiI7Ci0KLSAgaWYgKHNUZXh0LkdldExlbmd0aCgpID4gMCkgewotICAgIENGWF9GbG9hdFJlY3QgcmVjdCA9IEdldENsaWVudFJlY3QoKTsKLSAgICBzQXBwU3RyZWFtIDw8ICJxXG4vVHggQk1DXG4iOwotCi0gICAgaWYgKCFIYXNGbGFnKFBFU19URVhUT1ZFUkZMT1cpKQotICAgICAgc0FwcFN0cmVhbSA8PCByZWN0LmxlZnQgPDwgIiAiIDw8IHJlY3QuYm90dG9tIDw8ICIgIgotICAgICAgICAgICAgICAgICA8PCByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0IDw8ICIgIiA8PCByZWN0LnRvcCAtIHJlY3QuYm90dG9tCi0gICAgICAgICAgICAgICAgIDw8ICIgcmUgVyBuXG4iOwotCi0gICAgc0FwcFN0cmVhbSA8PCBzVGV4dDsKLQotICAgIHNBcHBTdHJlYW0gPDwgIkVNQ1xuUVxuIjsKLSAgfQotfQotCi12b2lkIENQV0xfRWRpdDo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgewotICBDUFdMX1duZDo6RHJhd1RoaXNBcHBlYXJhbmNlKHBEZXZpY2UsIHBVc2VyMkRldmljZSk7Ci0KLSAgQ0ZYX0Zsb2F0UmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKLSAgQ0ZYX0J5dGVUZXh0QnVmIHNMaW5lOwotCi0gIGludDMyX3QgbkNoYXJBcnJheSA9IG1fcEVkaXQtPkdldENoYXJBcnJheSgpOwotICBGWF9TQUZFX0lOVDMyIG5DaGFyQXJyYXlTYWZlID0gbkNoYXJBcnJheTsKLSAgbkNoYXJBcnJheVNhZmUgLT0gMTsKLSAgbkNoYXJBcnJheVNhZmUgKj0gMjsKLQotICBpZiAobkNoYXJBcnJheSA+IDAgJiYgbkNoYXJBcnJheVNhZmUuSXNWYWxpZCgpKSB7Ci0gICAgc3dpdGNoIChHZXRCb3JkZXJTdHlsZSgpKSB7Ci0gICAgICBjYXNlIEJvcmRlclN0eWxlOjpTT0xJRDogewotICAgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOwotICAgICAgICBnc2QubV9MaW5lV2lkdGggPSAoRlhfRkxPQVQpR2V0Qm9yZGVyV2lkdGgoKTsKLQotICAgICAgICBDRlhfUGF0aERhdGEgcGF0aDsKLQotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ2hhckFycmF5IC0gMTsgaSsrKSB7Ci0gICAgICAgICAgcGF0aC5BcHBlbmRQb2ludCgKLSAgICAgICAgICAgICAgQ0ZYX1BvaW50RigKLSAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LmxlZnQgKwotICAgICAgICAgICAgICAgICAgICAgICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KSAvIG5DaGFyQXJyYXkpICogKGkgKyAxKSwKLSAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LmJvdHRvbSksCi0gICAgICAgICAgICAgIEZYUFRfVFlQRTo6TW92ZVRvLCBmYWxzZSk7Ci0gICAgICAgICAgcGF0aC5BcHBlbmRQb2ludCgKLSAgICAgICAgICAgICAgQ0ZYX1BvaW50RigKLSAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LmxlZnQgKwotICAgICAgICAgICAgICAgICAgICAgICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KSAvIG5DaGFyQXJyYXkpICogKGkgKyAxKSwKLSAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LnRvcCksCi0gICAgICAgICAgICAgIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwYXRoLkdldFBvaW50cygpLmVtcHR5KCkpIHsKLSAgICAgICAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3NkLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJvcmRlckNvbG9yKCkuVG9GWENvbG9yKDI1NSksIEZYRklMTF9BTFRFUk5BVEUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBCb3JkZXJTdHlsZTo6REFTSDogewotICAgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOwotICAgICAgICBnc2QubV9MaW5lV2lkdGggPSAoRlhfRkxPQVQpR2V0Qm9yZGVyV2lkdGgoKTsKLQotICAgICAgICBnc2QuU2V0RGFzaENvdW50KDIpOwotICAgICAgICBnc2QubV9EYXNoQXJyYXlbMF0gPSAoRlhfRkxPQVQpR2V0Qm9yZGVyRGFzaCgpLm5EYXNoOwotICAgICAgICBnc2QubV9EYXNoQXJyYXlbMV0gPSAoRlhfRkxPQVQpR2V0Qm9yZGVyRGFzaCgpLm5HYXA7Ci0gICAgICAgIGdzZC5tX0Rhc2hQaGFzZSA9IChGWF9GTE9BVClHZXRCb3JkZXJEYXNoKCkublBoYXNlOwotCi0gICAgICAgIENGWF9QYXRoRGF0YSBwYXRoOwotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ2hhckFycmF5IC0gMTsgaSsrKSB7Ci0gICAgICAgICAgcGF0aC5BcHBlbmRQb2ludCgKLSAgICAgICAgICAgICAgQ0ZYX1BvaW50RigKLSAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LmxlZnQgKwotICAgICAgICAgICAgICAgICAgICAgICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KSAvIG5DaGFyQXJyYXkpICogKGkgKyAxKSwKLSAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LmJvdHRvbSksCi0gICAgICAgICAgICAgIEZYUFRfVFlQRTo6TW92ZVRvLCBmYWxzZSk7Ci0gICAgICAgICAgcGF0aC5BcHBlbmRQb2ludCgKLSAgICAgICAgICAgICAgQ0ZYX1BvaW50RigKLSAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LmxlZnQgKwotICAgICAgICAgICAgICAgICAgICAgICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KSAvIG5DaGFyQXJyYXkpICogKGkgKyAxKSwKLSAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LnRvcCksCi0gICAgICAgICAgICAgIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwYXRoLkdldFBvaW50cygpLmVtcHR5KCkpIHsKLSAgICAgICAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3NkLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJvcmRlckNvbG9yKCkuVG9GWENvbG9yKDI1NSksIEZYRklMTF9BTFRFUk5BVEUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgQ0ZYX0Zsb2F0UmVjdCByY0NsaXA7Ci0gIENQVlRfV29yZFJhbmdlIHdyUmFuZ2UgPSBtX3BFZGl0LT5HZXRWaXNpYmxlV29yZFJhbmdlKCk7Ci0gIENQVlRfV29yZFJhbmdlKiBwUmFuZ2UgPSBudWxscHRyOwotICBpZiAoIUhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykpIHsKLSAgICByY0NsaXAgPSBHZXRDbGllbnRSZWN0KCk7Ci0gICAgcFJhbmdlID0gJndyUmFuZ2U7Ci0gIH0KLQotICBDRlhfU3lzdGVtSGFuZGxlciogcFN5c0hhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCk7Ci0gIENGWF9FZGl0OjpEcmF3RWRpdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIG1fcEVkaXQuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICBHZXRUZXh0Q29sb3IoKS5Ub0ZYQ29sb3IoR2V0VHJhbnNwYXJlbmN5KCkpLCByY0NsaXAsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGKCksIHBSYW5nZSwgcFN5c0hhbmRsZXIsIG1fcEZvcm1GaWxsZXIpOwotfQotCi1ib29sIENQV0xfRWRpdDo6T25MQnV0dG9uRG93bihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIHsKLSAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsIG5GbGFnKTsKLQotICBpZiAoSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSB8fCBDbGllbnRIaXRUZXN0KHBvaW50KSkgewotICAgIGlmIChtX2JNb3VzZURvd24pCi0gICAgICBJbnZhbGlkYXRlUmVjdCgpOwotCi0gICAgbV9iTW91c2VEb3duID0gdHJ1ZTsKLSAgICBTZXRDYXB0dXJlKCk7Ci0KLSAgICBtX3BFZGl0LT5Pbk1vdXNlRG93bihwb2ludCwgSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDUFdMX0VkaXQ6Ok9uTEJ1dHRvbkRibENsayhjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIHsKLSAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRibENsayhwb2ludCwgbkZsYWcpOwotCi0gIGlmIChIYXNGbGFnKFBFU19URVhUT1ZFUkZMT1cpIHx8IENsaWVudEhpdFRlc3QocG9pbnQpKSB7Ci0gICAgbV9wRWRpdC0+U2VsZWN0QWxsKCk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDUFdMX0VkaXQ6Ok9uUkJ1dHRvblVwKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgewotICBpZiAobV9iTW91c2VEb3duKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDUFdMX1duZDo6T25SQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKLQotICBpZiAoIUhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykgJiYgIUNsaWVudEhpdFRlc3QocG9pbnQpKQotICAgIHJldHVybiB0cnVlOwotCi0gIENGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCk7Ci0gIGlmICghcFNIKQotICAgIHJldHVybiBmYWxzZTsKLQotICBTZXRGb2N1cygpOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBDUFdMX0VkaXQ6Ok9uU2V0Rm9jdXMoKSB7Ci0gIFNldEVkaXRDYXJldCh0cnVlKTsKLSAgaWYgKCFJc1JlYWRPbmx5KCkpIHsKLSAgICBpZiAoSVBXTF9Gb2N1c0hhbmRsZXIqIHBGb2N1c0hhbmRsZXIgPSBHZXRGb2N1c0hhbmRsZXIoKSkKLSAgICAgIHBGb2N1c0hhbmRsZXItPk9uU2V0Rm9jdXModGhpcyk7Ci0gIH0KLSAgbV9iRm9jdXMgPSB0cnVlOwotfQotCi12b2lkIENQV0xfRWRpdDo6T25LaWxsRm9jdXMoKSB7Ci0gIFNob3dWU2Nyb2xsQmFyKGZhbHNlKTsKLSAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOwotICBTZXRDYXJldChmYWxzZSwgQ0ZYX1BvaW50RigpLCBDRlhfUG9pbnRGKCkpOwotICBTZXRDaGFyU2V0KEZYRk9OVF9BTlNJX0NIQVJTRVQpOwotICBtX2JGb2N1cyA9IGZhbHNlOwotfQotCi12b2lkIENQV0xfRWRpdDo6U2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpIHsKLSAgbV9wRWRpdC0+U2V0Q2hhclNwYWNlKGZDaGFyU3BhY2UpOwotfQotCi1DRlhfQnl0ZVN0cmluZyBDUFdMX0VkaXQ6OkdldFNlbGVjdEFwcGVhcmFuY2VTdHJlYW0oCi0gICAgY29uc3QgQ0ZYX1BvaW50RiYgcHRPZmZzZXQpIGNvbnN0IHsKLSAgQ1BWVF9Xb3JkUmFuZ2Ugd3IgPSBHZXRTZWxlY3RXb3JkUmFuZ2UoKTsKLSAgcmV0dXJuIENQV0xfVXRpbHM6OkdldEVkaXRTZWxBcHBTdHJlYW0obV9wRWRpdC5nZXQoKSwgcHRPZmZzZXQsICZ3cik7Ci19Ci0KLUNQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6R2V0U2VsZWN0V29yZFJhbmdlKCkgY29uc3QgewotICBpZiAobV9wRWRpdC0+SXNTZWxlY3RlZCgpKSB7Ci0gICAgaW50MzJfdCBuU3RhcnQgPSAtMTsKLSAgICBpbnQzMl90IG5FbmQgPSAtMTsKLQotICAgIG1fcEVkaXQtPkdldFNlbChuU3RhcnQsIG5FbmQpOwotCi0gICAgQ1BWVF9Xb3JkUGxhY2Ugd3BTdGFydCA9IG1fcEVkaXQtPldvcmRJbmRleFRvV29yZFBsYWNlKG5TdGFydCk7Ci0gICAgQ1BWVF9Xb3JkUGxhY2Ugd3BFbmQgPSBtX3BFZGl0LT5Xb3JkSW5kZXhUb1dvcmRQbGFjZShuRW5kKTsKLQotICAgIHJldHVybiBDUFZUX1dvcmRSYW5nZSh3cFN0YXJ0LCB3cEVuZCk7Ci0gIH0KLQotICByZXR1cm4gQ1BWVF9Xb3JkUmFuZ2UoKTsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9FZGl0OjpHZXRUZXh0QXBwZWFyYW5jZVN0cmVhbSgKLSAgICBjb25zdCBDRlhfUG9pbnRGJiBwdE9mZnNldCkgY29uc3QgewotICBDRlhfQnl0ZVRleHRCdWYgc1JldDsKLSAgQ0ZYX0J5dGVTdHJpbmcgc0VkaXQgPSBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKG1fcEVkaXQuZ2V0KCksIHB0T2Zmc2V0KTsKLSAgaWYgKHNFZGl0LkdldExlbmd0aCgpID4gMCkgewotICAgIHNSZXQgPDwgIkJUXG4iCi0gICAgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRUZXh0Q29sb3IoKSkuQXNTdHJpbmdDKCkKLSAgICAgICAgIDw8IHNFZGl0LkFzU3RyaW5nQygpIDw8ICJFVFxuIjsKLSAgfQotICByZXR1cm4gc1JldC5NYWtlU3RyaW5nKCk7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfRWRpdDo6R2V0Q2FyZXRBcHBlYXJhbmNlU3RyZWFtKAotICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0T2Zmc2V0KSBjb25zdCB7Ci0gIGlmIChtX3BFZGl0Q2FyZXQpCi0gICAgcmV0dXJuIG1fcEVkaXRDYXJldC0+R2V0Q2FyZXRBcHBlYXJhbmNlU3RyZWFtKHB0T2Zmc2V0KTsKLQotICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKLX0KLQotQ0ZYX1BvaW50RiBDUFdMX0VkaXQ6OkdldFdvcmRSaWdodEJvdHRvbVBvaW50KGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cFdvcmQpIHsKLSAgQ0ZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcEVkaXQtPkdldEl0ZXJhdG9yKCk7Ci0gIENQVlRfV29yZFBsYWNlIHdwT2xkID0gcEl0ZXJhdG9yLT5HZXRBdCgpOwotICBwSXRlcmF0b3ItPlNldEF0KHdwV29yZCk7Ci0KLSAgQ0ZYX1BvaW50RiBwdDsKLSAgQ1BWVF9Xb3JkIHdvcmQ7Ci0gIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKLSAgICBwdCA9IENGWF9Qb2ludEYod29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoLCB3b3JkLnB0V29yZC55ICsgd29yZC5mRGVzY2VudCk7Ci0gIH0KLSAgcEl0ZXJhdG9yLT5TZXRBdCh3cE9sZCk7Ci0gIHJldHVybiBwdDsKLX0KLQotYm9vbCBDUFdMX0VkaXQ6OklzVGV4dEZ1bGwoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BFZGl0LT5Jc1RleHRGdWxsKCk7Ci19Ci0KLUZYX0ZMT0FUIENQV0xfRWRpdDo6R2V0Q2hhckFycmF5QXV0b0ZvbnRTaXplKENQREZfRm9udCogcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRmxvYXRSZWN0JiByY1BsYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhckFycmF5KSB7Ci0gIGlmIChwRm9udCAmJiAhcEZvbnQtPklzU3RhbmRhcmRGb250KCkpIHsKLSAgICBGWF9SRUNUIHJjQkJveDsKLSAgICBwRm9udC0+R2V0Rm9udEJCb3gocmNCQm94KTsKLQotICAgIENGWF9GbG9hdFJlY3QgcmNDZWxsID0gcmNQbGF0ZTsKLSAgICBGWF9GTE9BVCB4ZGl2ID0gcmNDZWxsLldpZHRoKCkgLyBuQ2hhckFycmF5ICogMTAwMC4wZiAvIHJjQkJveC5XaWR0aCgpOwotICAgIEZYX0ZMT0FUIHlkaXYgPSAtcmNDZWxsLkhlaWdodCgpICogMTAwMC4wZiAvIHJjQkJveC5IZWlnaHQoKTsKLQotICAgIHJldHVybiB4ZGl2IDwgeWRpdiA/IHhkaXYgOiB5ZGl2OwotICB9Ci0KLSAgcmV0dXJuIDAuMGY7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0OjpTZXRDaGFyQXJyYXkoaW50MzJfdCBuQ2hhckFycmF5KSB7Ci0gIGlmIChIYXNGbGFnKFBFU19DSEFSQVJSQVkpICYmIG5DaGFyQXJyYXkgPiAwKSB7Ci0gICAgbV9wRWRpdC0+U2V0Q2hhckFycmF5KG5DaGFyQXJyYXkpOwotICAgIG1fcEVkaXQtPlNldFRleHRPdmVyZmxvdyh0cnVlLCB0cnVlKTsKLQotICAgIGlmIChIYXNGbGFnKFBXU19BVVRPRk9OVFNJWkUpKSB7Ci0gICAgICBpZiAoSVBWVF9Gb250TWFwKiBwRm9udE1hcCA9IEdldEZvbnRNYXAoKSkgewotICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUgPSBHZXRDaGFyQXJyYXlBdXRvRm9udFNpemUoCi0gICAgICAgICAgICBwRm9udE1hcC0+R2V0UERGRm9udCgwKSwgR2V0Q2xpZW50UmVjdCgpLCBuQ2hhckFycmF5KTsKLSAgICAgICAgaWYgKGZGb250U2l6ZSA+IDAuMGYpIHsKLSAgICAgICAgICBtX3BFZGl0LT5TZXRBdXRvRm9udFNpemUoZmFsc2UsIHRydWUpOwotICAgICAgICAgIG1fcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDUFdMX0VkaXQ6OlNldExpbWl0Q2hhcihpbnQzMl90IG5MaW1pdENoYXIpIHsKLSAgbV9wRWRpdC0+U2V0TGltaXRDaGFyKG5MaW1pdENoYXIpOwotfQotCi12b2lkIENQV0xfRWRpdDo6UmVwbGFjZVNlbChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7Ci0gIG1fcEVkaXQtPkNsZWFyKCk7Ci0gIG1fcEVkaXQtPkluc2VydFRleHQod3NUZXh0LCBGWEZPTlRfREVGQVVMVF9DSEFSU0VUKTsKLX0KLQotQ0ZYX0Zsb2F0UmVjdCBDUFdMX0VkaXQ6OkdldEZvY3VzUmVjdCgpIGNvbnN0IHsKLSAgcmV0dXJuIENGWF9GbG9hdFJlY3QoKTsKLX0KLQotdm9pZCBDUFdMX0VkaXQ6OlNob3dWU2Nyb2xsQmFyKGJvb2wgYlNob3cpIHsKLSAgaWYgKENQV0xfU2Nyb2xsQmFyKiBwU2Nyb2xsID0gR2V0VlNjcm9sbEJhcigpKSB7Ci0gICAgaWYgKGJTaG93KSB7Ci0gICAgICBpZiAoIXBTY3JvbGwtPklzVmlzaWJsZSgpKSB7Ci0gICAgICAgIHBTY3JvbGwtPlNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIENGWF9GbG9hdFJlY3QgcmNXaW5kb3cgPSBHZXRXaW5kb3dSZWN0KCk7Ci0gICAgICAgIG1fcmNPbGRXaW5kb3cgPSByY1dpbmRvdzsKLSAgICAgICAgcmNXaW5kb3cucmlnaHQgKz0gUFdMX1NDUk9MTEJBUl9XSURUSDsKLSAgICAgICAgTW92ZShyY1dpbmRvdywgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChwU2Nyb2xsLT5Jc1Zpc2libGUoKSkgewotICAgICAgICBwU2Nyb2xsLT5TZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgTW92ZShtX3JjT2xkV2luZG93LCB0cnVlLCB0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotYm9vbCBDUFdMX0VkaXQ6OklzVlNjcm9sbEJhclZpc2libGUoKSBjb25zdCB7Ci0gIGlmIChDUFdMX1Njcm9sbEJhciogcFNjcm9sbCA9IEdldFZTY3JvbGxCYXIoKSkgewotICAgIHJldHVybiBwU2Nyb2xsLT5Jc1Zpc2libGUoKTsKLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDUFdMX0VkaXQ6Ok9uS2V5RG93bih1aW50MTZfdCBuQ2hhciwgdWludDMyX3QgbkZsYWcpIHsKLSAgaWYgKG1fYk1vdXNlRG93bikKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAobkNoYXIgPT0gRldMX1ZLRVlfRGVsZXRlKSB7Ci0gICAgaWYgKG1fcEZpbGxlck5vdGlmeSkgewotICAgICAgYm9vbCBiUkMgPSB0cnVlOwotICAgICAgYm9vbCBiRXhpdCA9IGZhbHNlOwotICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyQ2hhbmdlOwotICAgICAgQ0ZYX1dpZGVTdHJpbmcgc3RyQ2hhbmdlRXg7Ci0KLSAgICAgIGludCBuU2VsU3RhcnQgPSAwOwotICAgICAgaW50IG5TZWxFbmQgPSAwOwotICAgICAgR2V0U2VsKG5TZWxTdGFydCwgblNlbEVuZCk7Ci0KLSAgICAgIGlmIChuU2VsU3RhcnQgPT0gblNlbEVuZCkKLSAgICAgICAgblNlbEVuZCA9IG5TZWxTdGFydCArIDE7Ci0gICAgICBtX3BGaWxsZXJOb3RpZnktPk9uQmVmb3JlS2V5U3Ryb2tlKEdldEF0dGFjaGVkRGF0YSgpLCBzdHJDaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ckNoYW5nZUV4LCBuU2VsU3RhcnQsIG5TZWxFbmQsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSQywgYkV4aXQsIG5GbGFnKTsKLSAgICAgIGlmICghYlJDKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoYkV4aXQpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBib29sIGJSZXQgPSBDUFdMX0VkaXRDdHJsOjpPbktleURvd24obkNoYXIsIG5GbGFnKTsKLQotICAvLyBJbiBjYXNlIG9mIGltcGxlbWVudGF0aW9uIHN3YWxsb3cgdGhlIE9uS2V5RG93biBldmVudC4KLSAgaWYgKElzUHJvY2VlZHRvT25DaGFyKG5DaGFyLCBuRmxhZykpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgcmV0dXJuIGJSZXQ7Ci19Ci0KLS8qKgotKkluIGNhc2Ugb2YgaW1wbGVtZW50YXRpb24gc3dhbGxvdyB0aGUgT25LZXlEb3duIGV2ZW50LgotKklmIHRoZSBldmVudCBpcyBzd2FsbG93ZWQsIGltcGxlbWVudGF0aW9uIG1heSBkbyBvdGhlciB1bmV4cGVjdGVkIHRoaW5ncywgd2hpY2gKLSppcyBub3QgdGhlIGNvbnRyb2wgbWVhbnMgdG8gZG8uCi0qLwotYm9vbCBDUFdMX0VkaXQ6OklzUHJvY2VlZHRvT25DaGFyKHVpbnQxNl90IG5LZXlDb2RlLCB1aW50MzJfdCBuRmxhZykgewotICBib29sIGJDdHJsID0gSXNDVFJMcHJlc3NlZChuRmxhZyk7Ci0gIGJvb2wgYkFsdCA9IElzQUxUcHJlc3NlZChuRmxhZyk7Ci0gIGlmIChiQ3RybCAmJiAhYkFsdCkgewotICAgIC8vIGhvdCBrZXlzIGZvciBlZGl0IGNvbnRyb2wuCi0gICAgc3dpdGNoIChuS2V5Q29kZSkgewotICAgICAgY2FzZSAnQyc6Ci0gICAgICBjYXNlICdWJzoKLSAgICAgIGNhc2UgJ1gnOgotICAgICAgY2FzZSAnQSc6Ci0gICAgICBjYXNlICdaJzoKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgLy8gY29udHJvbCBjaGFyYWN0ZXJzLgotICBzd2l0Y2ggKG5LZXlDb2RlKSB7Ci0gICAgY2FzZSBGV0xfVktFWV9Fc2NhcGU6Ci0gICAgY2FzZSBGV0xfVktFWV9CYWNrOgotICAgIGNhc2UgRldMX1ZLRVlfUmV0dXJuOgotICAgIGNhc2UgRldMX1ZLRVlfU3BhY2U6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWJvb2wgQ1BXTF9FZGl0OjpPbkNoYXIodWludDE2X3QgbkNoYXIsIHVpbnQzMl90IG5GbGFnKSB7Ci0gIGlmIChtX2JNb3VzZURvd24pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgYm9vbCBiUkMgPSB0cnVlOwotICBib29sIGJFeGl0ID0gZmFsc2U7Ci0KLSAgaWYgKCFJc0NUUkxwcmVzc2VkKG5GbGFnKSkgewotICAgIGlmIChtX3BGaWxsZXJOb3RpZnkpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHN3Q2hhbmdlOwotCi0gICAgICBpbnQgblNlbFN0YXJ0ID0gMDsKLSAgICAgIGludCBuU2VsRW5kID0gMDsKLSAgICAgIEdldFNlbChuU2VsU3RhcnQsIG5TZWxFbmQpOwotCi0gICAgICBzd2l0Y2ggKG5DaGFyKSB7Ci0gICAgICAgIGNhc2UgRldMX1ZLRVlfQmFjazoKLSAgICAgICAgICBpZiAoblNlbFN0YXJ0ID09IG5TZWxFbmQpCi0gICAgICAgICAgICBuU2VsU3RhcnQgPSBuU2VsRW5kIC0gMTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGV0xfVktFWV9SZXR1cm46Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgc3dDaGFuZ2UgKz0gbkNoYXI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIENGWF9XaWRlU3RyaW5nIHN0ckNoYW5nZUV4OwotICAgICAgbV9wRmlsbGVyTm90aWZ5LT5PbkJlZm9yZUtleVN0cm9rZShHZXRBdHRhY2hlZERhdGEoKSwgc3dDaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ckNoYW5nZUV4LCBuU2VsU3RhcnQsIG5TZWxFbmQsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSQywgYkV4aXQsIG5GbGFnKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIWJSQykKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGJFeGl0KQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoSVBWVF9Gb250TWFwKiBwRm9udE1hcCA9IEdldEZvbnRNYXAoKSkgewotICAgIGludDMyX3Qgbk9sZENoYXJTZXQgPSBHZXRDaGFyU2V0KCk7Ci0gICAgaW50MzJfdCBuTmV3Q2hhclNldCA9Ci0gICAgICAgIHBGb250TWFwLT5DaGFyU2V0RnJvbVVuaWNvZGUobkNoYXIsIEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQpOwotICAgIGlmIChuT2xkQ2hhclNldCAhPSBuTmV3Q2hhclNldCkgewotICAgICAgU2V0Q2hhclNldChuTmV3Q2hhclNldCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIENQV0xfRWRpdEN0cmw6Ok9uQ2hhcihuQ2hhciwgbkZsYWcpOwotfQotCi1ib29sIENQV0xfRWRpdDo6T25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFnKSB7Ci0gIGlmIChIYXNGbGFnKFBFU19NVUxUSUxJTkUpKSB7Ci0gICAgQ0ZYX1BvaW50RiBwdFNjcm9sbCA9IEdldFNjcm9sbFBvcygpOwotCi0gICAgaWYgKHpEZWx0YSA+IDApIHsKLSAgICAgIHB0U2Nyb2xsLnkgKz0gR2V0Rm9udFNpemUoKTsKLSAgICB9IGVsc2UgewotICAgICAgcHRTY3JvbGwueSAtPSBHZXRGb250U2l6ZSgpOwotICAgIH0KLSAgICBTZXRTY3JvbGxQb3MocHRTY3JvbGwpOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0OjpPbkluc2VydFJldHVybihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSB7Ci0gIGlmIChIYXNGbGFnKFBFU19TUEVMTENIRUNLKSkgewotICAgIG1fcEVkaXQtPlJlZnJlc2hXb3JkUmFuZ2UoQ29tYmluZVdvcmRSYW5nZShHZXRMYXRpbldvcmRzUmFuZ2Uob2xkcGxhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRMYXRpbldvcmRzUmFuZ2UocGxhY2UpKSk7Ci0gIH0KLX0KLQotdm9pZCBDUFdMX0VkaXQ6Ok9uQmFja1NwYWNlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpIHsKLSAgaWYgKEhhc0ZsYWcoUEVTX1NQRUxMQ0hFQ0spKSB7Ci0gICAgbV9wRWRpdC0+UmVmcmVzaFdvcmRSYW5nZShDb21iaW5lV29yZFJhbmdlKEdldExhdGluV29yZHNSYW5nZShvbGRwbGFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldExhdGluV29yZHNSYW5nZShwbGFjZSkpKTsKLSAgfQotfQotCi12b2lkIENQV0xfRWRpdDo6T25EZWxldGUoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkgewotICBpZiAoSGFzRmxhZyhQRVNfU1BFTExDSEVDSykpIHsKLSAgICBtX3BFZGl0LT5SZWZyZXNoV29yZFJhbmdlKENvbWJpbmVXb3JkUmFuZ2UoR2V0TGF0aW5Xb3Jkc1JhbmdlKG9sZHBsYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TGF0aW5Xb3Jkc1JhbmdlKHBsYWNlKSkpOwotICB9Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0OjpPbkNsZWFyKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkgewotICBpZiAoSGFzRmxhZyhQRVNfU1BFTExDSEVDSykpIHsKLSAgICBtX3BFZGl0LT5SZWZyZXNoV29yZFJhbmdlKENvbWJpbmVXb3JkUmFuZ2UoR2V0TGF0aW5Xb3Jkc1JhbmdlKG9sZHBsYWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TGF0aW5Xb3Jkc1JhbmdlKHBsYWNlKSkpOwotICB9Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0OjpPbkluc2VydFdvcmQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpIHsKLSAgaWYgKEhhc0ZsYWcoUEVTX1NQRUxMQ0hFQ0spKSB7Ci0gICAgbV9wRWRpdC0+UmVmcmVzaFdvcmRSYW5nZShDb21iaW5lV29yZFJhbmdlKEdldExhdGluV29yZHNSYW5nZShvbGRwbGFjZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldExhdGluV29yZHNSYW5nZShwbGFjZSkpKTsKLSAgfQotfQotCi12b2lkIENQV0xfRWRpdDo6T25JbnNlcnRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSB7Ci0gIGlmIChIYXNGbGFnKFBFU19TUEVMTENIRUNLKSkgewotICAgIG1fcEVkaXQtPlJlZnJlc2hXb3JkUmFuZ2UoQ29tYmluZVdvcmRSYW5nZShHZXRMYXRpbldvcmRzUmFuZ2Uob2xkcGxhY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRMYXRpbldvcmRzUmFuZ2UocGxhY2UpKSk7Ci0gIH0KLX0KLQotQ1BWVF9Xb3JkUmFuZ2UgQ1BXTF9FZGl0OjpDb21iaW5lV29yZFJhbmdlKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyMikgewotICBDUFZUX1dvcmRSYW5nZSB3clJldDsKLQotICBpZiAod3IxLkJlZ2luUG9zLldvcmRDbXAod3IyLkJlZ2luUG9zKSA8IDApIHsKLSAgICB3clJldC5CZWdpblBvcyA9IHdyMS5CZWdpblBvczsKLSAgfSBlbHNlIHsKLSAgICB3clJldC5CZWdpblBvcyA9IHdyMi5CZWdpblBvczsKLSAgfQotCi0gIGlmICh3cjEuRW5kUG9zLldvcmRDbXAod3IyLkVuZFBvcykgPCAwKSB7Ci0gICAgd3JSZXQuRW5kUG9zID0gd3IyLkVuZFBvczsKLSAgfSBlbHNlIHsKLSAgICB3clJldC5FbmRQb3MgPSB3cjEuRW5kUG9zOwotICB9Ci0KLSAgcmV0dXJuIHdyUmV0OwotfQotCi1DUFZUX1dvcmRSYW5nZSBDUFdMX0VkaXQ6OkdldExhdGluV29yZHNSYW5nZShjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3QgewotICByZXR1cm4gR2V0U2FtZVdvcmRzUmFuZ2UobV9wRWRpdC0+U2VhcmNoV29yZFBsYWNlKHBvaW50KSwgdHJ1ZSwgZmFsc2UpOwotfQotCi1DUFZUX1dvcmRSYW5nZSBDUFdMX0VkaXQ6OkdldExhdGluV29yZHNSYW5nZSgKLSAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IHsKLSAgcmV0dXJuIEdldFNhbWVXb3Jkc1JhbmdlKHBsYWNlLCB0cnVlLCBmYWxzZSk7Ci19Ci0KLUNQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6R2V0QXJhYmljV29yZHNSYW5nZSgKLSAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0IHsKLSAgcmV0dXJuIEdldFNhbWVXb3Jkc1JhbmdlKHBsYWNlLCBmYWxzZSwgdHJ1ZSk7Ci19Ci0KLSNkZWZpbmUgUFdMX0lTQVJBQklDV09SRCh3b3JkKSBcCi0gICgod29yZCA+PSAweDA2MDAgJiYgd29yZCA8PSAweDA2RkYpIHx8ICh3b3JkID49IDB4RkI1MCAmJiB3b3JkIDw9IDB4RkVGQykpCi0KLUNQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6R2V0U2FtZVdvcmRzUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJMYXRpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQXJhYmljKSBjb25zdCB7Ci0gIENQVlRfV29yZFJhbmdlIHJhbmdlOwotCi0gIENGWF9FZGl0X0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BFZGl0LT5HZXRJdGVyYXRvcigpOwotICBDUFZUX1dvcmQgd29yZGluZm87Ci0gIENQVlRfV29yZFBsYWNlIHdwU3RhcnQocGxhY2UpLCB3cEVuZChwbGFjZSk7Ci0gIHBJdGVyYXRvci0+U2V0QXQocGxhY2UpOwotCi0gIGlmIChiTGF0aW4pIHsKLSAgICB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKSB7Ci0gICAgICBpZiAoIXBJdGVyYXRvci0+R2V0V29yZCh3b3JkaW5mbykgfHwKLSAgICAgICAgICAhRlhfRURJVF9JU0xBVElOV09SRCh3b3JkaW5mby5Xb3JkKSkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgd3BFbmQgPSBwSXRlcmF0b3ItPkdldEF0KCk7Ci0gICAgfQotICB9IGVsc2UgaWYgKGJBcmFiaWMpIHsKLSAgICB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKSB7Ci0gICAgICBpZiAoIXBJdGVyYXRvci0+R2V0V29yZCh3b3JkaW5mbykgfHwgIVBXTF9JU0FSQUJJQ1dPUkQod29yZGluZm8uV29yZCkpCi0gICAgICAgIGJyZWFrOwotCi0gICAgICB3cEVuZCA9IHBJdGVyYXRvci0+R2V0QXQoKTsKLSAgICB9Ci0gIH0KLQotICBwSXRlcmF0b3ItPlNldEF0KHBsYWNlKTsKLQotICBpZiAoYkxhdGluKSB7Ci0gICAgZG8gewotICAgICAgaWYgKCFwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pIHx8Ci0gICAgICAgICAgIUZYX0VESVRfSVNMQVRJTldPUkQod29yZGluZm8uV29yZCkpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHdwU3RhcnQgPSBwSXRlcmF0b3ItPkdldEF0KCk7Ci0gICAgfSB3aGlsZSAocEl0ZXJhdG9yLT5QcmV2V29yZCgpKTsKLSAgfSBlbHNlIGlmIChiQXJhYmljKSB7Ci0gICAgZG8gewotICAgICAgaWYgKCFwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pIHx8ICFQV0xfSVNBUkFCSUNXT1JEKHdvcmRpbmZvLldvcmQpKQotICAgICAgICBicmVhazsKLQotICAgICAgd3BTdGFydCA9IHBJdGVyYXRvci0+R2V0QXQoKTsKLSAgICB9IHdoaWxlIChwSXRlcmF0b3ItPlByZXZXb3JkKCkpOwotICB9Ci0KLSAgcmFuZ2UuU2V0KHdwU3RhcnQsIHdwRW5kKTsKLSAgcmV0dXJuIHJhbmdlOwotfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0VkaXQuaCBiL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9FZGl0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZDAxMzAuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0VkaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19QREZXSU5ET1dfUFdMX0VESVRfSF8KLSNkZWZpbmUgRlBERlNES19QREZXSU5ET1dfUFdMX0VESVRfSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2Z4ZWRpdC9meF9lZGl0LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX1duZC5oIgotCi1jbGFzcyBDUERGX1BhZ2VPYmplY3RIb2xkZXI7Ci1jbGFzcyBDUERGX1RleHRPYmplY3Q7Ci1jbGFzcyBJRlhfRWRpdF9VbmRvSXRlbTsKLQotY2xhc3MgSVBXTF9GaWxsZXJfTm90aWZ5IHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfklQV0xfRmlsbGVyX05vdGlmeSgpIHt9Ci0gIHZpcnR1YWwgdm9pZCBRdWVyeVdoZXJlUG9wdXAoCi0gICAgICB2b2lkKiBwUHJpdmF0ZURhdGEsCi0gICAgICBGWF9GTE9BVCBmUG9wdXBNaW4sCi0gICAgICBGWF9GTE9BVCBmUG9wdXBNYXgsCi0gICAgICBpbnQzMl90JiBuUmV0LAotICAgICAgRlhfRkxPQVQmIGZQb3B1cFJldCkgPSAwOyAgLy8gblJldDogKDA6Ym90dG9tIDE6dG9wKQotICB2aXJ0dWFsIHZvaWQgT25CZWZvcmVLZXlTdHJva2Uodm9pZCogcFByaXZhdGVEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHN0ckNoYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuU2VsU3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgblNlbEVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYktleURvd24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiUkMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiRXhpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFnKSA9IDA7Ci0jaWZkZWYgUERGX0VOQUJMRV9YRkEKLSAgdmlydHVhbCB2b2lkIE9uUG9wdXBQcmVPcGVuKHZvaWQqIHBQcml2YXRlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJFeGl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWcpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uUG9wdXBQb3N0T3Blbih2b2lkKiBwUHJpdmF0ZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYkV4aXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWcpID0gMDsKLSNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKLX07Ci0KLWNsYXNzIENQV0xfRWRpdCA6IHB1YmxpYyBDUFdMX0VkaXRDdHJsIHsKLSBwdWJsaWM6Ci0gIENQV0xfRWRpdCgpOwotICB+Q1BXTF9FZGl0KCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ1BXTF9FZGl0Q3RybAotICBDRlhfQnl0ZVN0cmluZyBHZXRDbGFzc05hbWUoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBPbkRlc3Ryb3koKSBvdmVycmlkZTsKLSAgdm9pZCBPbkNyZWF0ZWQoKSBvdmVycmlkZTsKLSAgdm9pZCBSZVBvc0NoaWxkV25kKCkgb3ZlcnJpZGU7Ci0gIENGWF9GbG9hdFJlY3QgR2V0Q2xpZW50UmVjdCgpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIEdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSkgb3ZlcnJpZGU7Ci0gIHZvaWQgRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgT25MQnV0dG9uRG93bihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOwotICBib29sIE9uTEJ1dHRvbkRibENsayhjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOwotICBib29sIE9uUkJ1dHRvblVwKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgb3ZlcnJpZGU7Ci0gIGJvb2wgT25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKLSAgYm9vbCBPbktleURvd24odWludDE2X3QgbkNoYXIsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKLSAgYm9vbCBPbkNoYXIodWludDE2X3QgbkNoYXIsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKLSAgQ0ZYX0Zsb2F0UmVjdCBHZXRGb2N1c1JlY3QoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBPblNldEZvY3VzKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25LaWxsRm9jdXMoKSBvdmVycmlkZTsKLQotICB2b2lkIFNldEFsaWduRm9ybWF0VihQV0xfRURJVF9BTElHTkZPUk1BVF9WIG5Gb3JtYXQgPSBQRUFWX1RPUCwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUGFpbnQgPSB0cnVlKTsgIC8vIDA6dG9wIDE6Ym90dG9tIDI6Y2VudGVyCi0KLSAgdm9pZCBTZXRDaGFyQXJyYXkoaW50MzJfdCBuQ2hhckFycmF5KTsKLSAgdm9pZCBTZXRMaW1pdENoYXIoaW50MzJfdCBuTGltaXRDaGFyKTsKLQotICB2b2lkIFNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKTsKLQotICBib29sIENhblNlbGVjdEFsbCgpIGNvbnN0OwotICBib29sIENhbkNsZWFyKCkgY29uc3Q7Ci0gIGJvb2wgQ2FuQ29weSgpIGNvbnN0OwotICBib29sIENhbkN1dCgpIGNvbnN0OwotCi0gIHZvaWQgQ3V0VGV4dCgpOwotCi0gIHZvaWQgU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgY3NUZXh0KTsKLSAgdm9pZCBSZXBsYWNlU2VsKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjc1RleHQpOwotCi0gIENGWF9CeXRlU3RyaW5nIEdldFRleHRBcHBlYXJhbmNlU3RyZWFtKGNvbnN0IENGWF9Qb2ludEYmIHB0T2Zmc2V0KSBjb25zdDsKLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2FyZXRBcHBlYXJhbmNlU3RyZWFtKGNvbnN0IENGWF9Qb2ludEYmIHB0T2Zmc2V0KSBjb25zdDsKLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0U2VsZWN0QXBwZWFyYW5jZVN0cmVhbShjb25zdCBDRlhfUG9pbnRGJiBwdE9mZnNldCkgY29uc3Q7Ci0KLSAgYm9vbCBJc1RleHRGdWxsKCkgY29uc3Q7Ci0KLSAgc3RhdGljIEZYX0ZMT0FUIEdldENoYXJBcnJheUF1dG9Gb250U2l6ZShDUERGX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjUGxhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhckFycmF5KTsKLQotICB2b2lkIFNldEZpbGxlck5vdGlmeShJUFdMX0ZpbGxlcl9Ob3RpZnkqIHBOb3RpZnkpIHsKLSAgICBtX3BGaWxsZXJOb3RpZnkgPSBwTm90aWZ5OwotICB9Ci0KLSAgYm9vbCBJc1Byb2NlZWR0b09uQ2hhcih1aW50MTZfdCBuS2V5Q29kZSwgdWludDMyX3QgbkZsYWcpOwotICB2b2lkIEF0dGFjaEZGTERhdGEoQ0ZGTF9Gb3JtRmlsbGVyKiBwRGF0YSkgeyBtX3BGb3JtRmlsbGVyID0gcERhdGE7IH0KLQotICB2b2lkIE9uSW5zZXJ0V29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSk7Ci0gIHZvaWQgT25JbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSk7Ci0gIHZvaWQgT25CYWNrU3BhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpOwotICB2b2lkIE9uRGVsZXRlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKTsKLSAgdm9pZCBPbkNsZWFyKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKTsKLSAgdm9pZCBPbkluc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpOwotCi0gcHJpdmF0ZToKLSAgQ1BWVF9Xb3JkUmFuZ2UgR2V0U2VsZWN0V29yZFJhbmdlKCkgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBTaG93VlNjcm9sbEJhcihib29sIGJTaG93KTsKLSAgYm9vbCBJc1ZTY3JvbGxCYXJWaXNpYmxlKCkgY29uc3Q7Ci0gIHZvaWQgU2V0UGFyYW1CeUZsYWcoKTsKLQotICBGWF9GTE9BVCBHZXRDaGFyQXJyYXlBdXRvRm9udFNpemUoaW50MzJfdCBuQ2hhckFycmF5KTsKLSAgQ0ZYX1BvaW50RiBHZXRXb3JkUmlnaHRCb3R0b21Qb2ludChjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BXb3JkKTsKLQotICBDUFZUX1dvcmRSYW5nZSBDb21iaW5lV29yZFJhbmdlKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyMik7Ci0gIENQVlRfV29yZFJhbmdlIEdldExhdGluV29yZHNSYW5nZShjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3Q7Ci0gIENQVlRfV29yZFJhbmdlIEdldExhdGluV29yZHNSYW5nZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpIGNvbnN0OwotICBDUFZUX1dvcmRSYW5nZSBHZXRBcmFiaWNXb3Jkc1JhbmdlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3Q7Ci0gIENQVlRfV29yZFJhbmdlIEdldFNhbWVXb3Jkc1JhbmdlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTGF0aW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFyYWJpYykgY29uc3Q7Ci0gIElQV0xfRmlsbGVyX05vdGlmeSogbV9wRmlsbGVyTm90aWZ5OwotICBib29sIG1fYkZvY3VzOwotICBDRlhfRmxvYXRSZWN0IG1fcmNPbGRXaW5kb3c7Ci0gIENGRkxfRm9ybUZpbGxlciogbV9wRm9ybUZpbGxlcjsgIC8vIE5vdCBvd25lZC4KLX07Ci0KLSNlbmRpZiAgLy8gRlBERlNES19QREZXSU5ET1dfUFdMX0VESVRfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5jcHAgYi9mcGRmc2RrL3BkZndpbmRvdy9QV0xfRWRpdEN0cmwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTIxYWI3Li4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NzcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmgiCi0KLSNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3B2dF9zZWN0aW9uLmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwdnRfd29yZC5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mb250LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9meGVkaXQvZnhldF9lZGl0LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0NhcmV0LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX1V0aWxzLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX1duZC5oIgotI2luY2x1ZGUgInB1YmxpYy9mcGRmX2Z3bGV2ZW50LmgiCi0KLUNQV0xfRWRpdEN0cmw6OkNQV0xfRWRpdEN0cmwoKQotICAgIDogbV9wRWRpdChuZXcgQ0ZYX0VkaXQpLAotICAgICAgbV9wRWRpdENhcmV0KG51bGxwdHIpLAotICAgICAgbV9iTW91c2VEb3duKGZhbHNlKSwKLSAgICAgIG1fbkNoYXJTZXQoRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCksCi0gICAgICBtX25Db2RlUGFnZSgwKSB7fQotCi1DUFdMX0VkaXRDdHJsOjp+Q1BXTF9FZGl0Q3RybCgpIHt9Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6T25DcmVhdGUoUFdMX0NSRUFURVBBUkFNJiBjcCkgewotICBjcC5lQ3Vyc29yVHlwZSA9IEZYQ1RfVkJFQU07Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6T25DcmVhdGVkKCkgewotICBTZXRGb250U2l6ZShHZXRDcmVhdGlvblBhcmFtKCkuZkZvbnRTaXplKTsKLQotICBtX3BFZGl0LT5TZXRGb250TWFwKEdldEZvbnRNYXAoKSk7Ci0gIG1fcEVkaXQtPlNldE5vdGlmeSh0aGlzKTsKLSAgbV9wRWRpdC0+SW5pdGlhbGl6ZSgpOwotfQotCi1ib29sIENQV0xfRWRpdEN0cmw6OklzV25kSG9yVigpIHsKLSAgQ0ZYX01hdHJpeCBtdCA9IEdldFdpbmRvd01hdHJpeCgpOwotICByZXR1cm4gbXQuVHJhbnNmb3JtKENGWF9Qb2ludEYoMSwgMSkpLnkgPT0gbXQuVHJhbnNmb3JtKENGWF9Qb2ludEYoMCwgMSkpLnk7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0Q3Vyc29yKCkgewotICBpZiAoSXNWYWxpZCgpKSB7Ci0gICAgaWYgKENGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCkpIHsKLSAgICAgIGlmIChJc1duZEhvclYoKSkKLSAgICAgICAgcFNILT5TZXRDdXJzb3IoRlhDVF9WQkVBTSk7Ci0gICAgICBlbHNlCi0gICAgICAgIHBTSC0+U2V0Q3Vyc29yKEZYQ1RfSEJFQU0pOwotICAgIH0KLSAgfQotfQotCi12b2lkIENQV0xfRWRpdEN0cmw6OlJlUG9zQ2hpbGRXbmQoKSB7Ci0gIG1fcEVkaXQtPlNldFBsYXRlUmVjdChHZXRDbGllbnRSZWN0KCkpOwotfQotCi12b2lkIENQV0xfRWRpdEN0cmw6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHdQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtKSB7Ci0gIENQV0xfV25kOjpPbk5vdGlmeShwV25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKLQotICBzd2l0Y2ggKG1zZykgewotICAgIGNhc2UgUE5NX1NFVFNDUk9MTElORk86Ci0gICAgICBzd2l0Y2ggKHdQYXJhbSkgewotICAgICAgICBjYXNlIFNCVF9WU0NST0xMOgotICAgICAgICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gR2V0VlNjcm9sbEJhcigpKSB7Ci0gICAgICAgICAgICBwQ2hpbGQtPk9uTm90aWZ5KHBXbmQsIFBOTV9TRVRTQ1JPTExJTkZPLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQTk1fU0VUU0NST0xMUE9TOgotICAgICAgc3dpdGNoICh3UGFyYW0pIHsKLSAgICAgICAgY2FzZSBTQlRfVlNDUk9MTDoKLSAgICAgICAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IEdldFZTY3JvbGxCYXIoKSkgewotICAgICAgICAgICAgcENoaWxkLT5Pbk5vdGlmeShwV25kLCBQTk1fU0VUU0NST0xMUE9TLCB3UGFyYW0sIGxQYXJhbSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQTk1fU0NST0xMV0lORE9XOiB7Ci0gICAgICBGWF9GTE9BVCBmUG9zID0gKihGWF9GTE9BVCopbFBhcmFtOwotICAgICAgc3dpdGNoICh3UGFyYW0pIHsKLSAgICAgICAgY2FzZSBTQlRfVlNDUk9MTDoKLSAgICAgICAgICBtX3BFZGl0LT5TZXRTY3JvbGxQb3MoQ0ZYX1BvaW50RihtX3BFZGl0LT5HZXRTY3JvbGxQb3MoKS54LCBmUG9zKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIFBOTV9TRVRDQVJFVElORk86IHsKLSAgICAgIGlmIChQV0xfQ0FSRVRfSU5GTyogcENhcmV0SW5mbyA9IChQV0xfQ0FSRVRfSU5GTyopd1BhcmFtKSB7Ci0gICAgICAgIFNldENhcmV0KHBDYXJldEluZm8tPmJWaXNpYmxlLCBwQ2FyZXRJbmZvLT5wdEhlYWQsIHBDYXJldEluZm8tPnB0Rm9vdCk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLSAgfQotfQotCi12b2lkIENQV0xfRWRpdEN0cmw6OkNyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIHsKLSAgaWYgKCFJc1JlYWRPbmx5KCkpCi0gICAgQ3JlYXRlRWRpdENhcmV0KGNwKTsKLX0KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpDcmVhdGVFZGl0Q2FyZXQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgewotICBpZiAobV9wRWRpdENhcmV0KQotICAgIHJldHVybjsKLQotICBtX3BFZGl0Q2FyZXQgPSBuZXcgQ1BXTF9DYXJldDsKLSAgbV9wRWRpdENhcmV0LT5TZXRJbnZhbGlkUmVjdChHZXRDbGllbnRSZWN0KCkpOwotCi0gIFBXTF9DUkVBVEVQQVJBTSBlY3AgPSBjcDsKLSAgZWNwLnBQYXJlbnRXbmQgPSB0aGlzOwotICBlY3AuZHdGbGFncyA9IFBXU19DSElMRCB8IFBXU19OT1JFRlJFU0hDTElQOwotICBlY3AuZHdCb3JkZXJXaWR0aCA9IDA7Ci0gIGVjcC5uQm9yZGVyU3R5bGUgPSBCb3JkZXJTdHlsZTo6U09MSUQ7Ci0gIGVjcC5yY1JlY3RXbmQgPSBDRlhfRmxvYXRSZWN0KDAsIDAsIDAsIDApOwotCi0gIG1fcEVkaXRDYXJldC0+Q3JlYXRlKGVjcCk7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSB7Ci0gIG1fcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7Ci19Ci0KLUZYX0ZMT0FUIENQV0xfRWRpdEN0cmw6OkdldEZvbnRTaXplKCkgY29uc3QgewotICByZXR1cm4gbV9wRWRpdC0+R2V0Rm9udFNpemUoKTsKLX0KLQotYm9vbCBDUFdMX0VkaXRDdHJsOjpPbktleURvd24odWludDE2X3QgbkNoYXIsIHVpbnQzMl90IG5GbGFnKSB7Ci0gIGlmIChtX2JNb3VzZURvd24pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgYm9vbCBiUmV0ID0gQ1BXTF9XbmQ6Ok9uS2V5RG93bihuQ2hhciwgbkZsYWcpOwotCi0gIC8vIEZJTFRFUgotICBzd2l0Y2ggKG5DaGFyKSB7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBjYXNlIEZXTF9WS0VZX0RlbGV0ZToKLSAgICBjYXNlIEZXTF9WS0VZX1VwOgotICAgIGNhc2UgRldMX1ZLRVlfRG93bjoKLSAgICBjYXNlIEZXTF9WS0VZX0xlZnQ6Ci0gICAgY2FzZSBGV0xfVktFWV9SaWdodDoKLSAgICBjYXNlIEZXTF9WS0VZX0hvbWU6Ci0gICAgY2FzZSBGV0xfVktFWV9FbmQ6Ci0gICAgY2FzZSBGV0xfVktFWV9JbnNlcnQ6Ci0gICAgY2FzZSAnQyc6Ci0gICAgY2FzZSAnVic6Ci0gICAgY2FzZSAnWCc6Ci0gICAgY2FzZSAnQSc6Ci0gICAgY2FzZSAnWic6Ci0gICAgY2FzZSAnYyc6Ci0gICAgY2FzZSAndic6Ci0gICAgY2FzZSAneCc6Ci0gICAgY2FzZSAnYSc6Ci0gICAgY2FzZSAneic6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIGlmIChuQ2hhciA9PSBGV0xfVktFWV9EZWxldGUgJiYgbV9wRWRpdC0+SXNTZWxlY3RlZCgpKQotICAgIG5DaGFyID0gRldMX1ZLRVlfVW5rbm93bjsKLQotICBzd2l0Y2ggKG5DaGFyKSB7Ci0gICAgY2FzZSBGV0xfVktFWV9EZWxldGU6Ci0gICAgICBEZWxldGUoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgRldMX1ZLRVlfSW5zZXJ0OgotICAgICAgaWYgKElzU0hJRlRwcmVzc2VkKG5GbGFnKSkKLSAgICAgICAgUGFzdGVUZXh0KCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIEZXTF9WS0VZX1VwOgotICAgICAgbV9wRWRpdC0+T25WS19VUChJc1NISUZUcHJlc3NlZChuRmxhZyksIGZhbHNlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgRldMX1ZLRVlfRG93bjoKLSAgICAgIG1fcEVkaXQtPk9uVktfRE9XTihJc1NISUZUcHJlc3NlZChuRmxhZyksIGZhbHNlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgRldMX1ZLRVlfTGVmdDoKLSAgICAgIG1fcEVkaXQtPk9uVktfTEVGVChJc1NISUZUcHJlc3NlZChuRmxhZyksIGZhbHNlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgRldMX1ZLRVlfUmlnaHQ6Ci0gICAgICBtX3BFZGl0LT5PblZLX1JJR0hUKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgZmFsc2UpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBGV0xfVktFWV9Ib21lOgotICAgICAgbV9wRWRpdC0+T25WS19IT01FKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBGV0xfVktFWV9FbmQ6Ci0gICAgICBtX3BFZGl0LT5PblZLX0VORChJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgRldMX1ZLRVlfVW5rbm93bjoKLSAgICAgIGlmICghSXNTSElGVHByZXNzZWQobkZsYWcpKQotICAgICAgICBDbGVhcigpOwotICAgICAgZWxzZQotICAgICAgICBDdXRUZXh0KCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gYlJldDsKLX0KLQotYm9vbCBDUFdMX0VkaXRDdHJsOjpPbkNoYXIodWludDE2X3QgbkNoYXIsIHVpbnQzMl90IG5GbGFnKSB7Ci0gIGlmIChtX2JNb3VzZURvd24pCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQ1BXTF9XbmQ6Ok9uQ2hhcihuQ2hhciwgbkZsYWcpOwotCi0gIC8vIEZJTFRFUgotICBzd2l0Y2ggKG5DaGFyKSB7Ci0gICAgY2FzZSAweDBBOgotICAgIGNhc2UgMHgxQjoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICBib29sIGJDdHJsID0gSXNDVFJMcHJlc3NlZChuRmxhZyk7Ci0gIGJvb2wgYkFsdCA9IElzQUxUcHJlc3NlZChuRmxhZyk7Ci0gIGJvb2wgYlNoaWZ0ID0gSXNTSElGVHByZXNzZWQobkZsYWcpOwotCi0gIHVpbnQxNl90IHdvcmQgPSBuQ2hhcjsKLQotICBpZiAoYkN0cmwgJiYgIWJBbHQpIHsKLSAgICBzd2l0Y2ggKG5DaGFyKSB7Ci0gICAgICBjYXNlICdDJyAtICdBJyArIDE6Ci0gICAgICAgIENvcHlUZXh0KCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgY2FzZSAnVicgLSAnQScgKyAxOgotICAgICAgICBQYXN0ZVRleHQoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlICdYJyAtICdBJyArIDE6Ci0gICAgICAgIEN1dFRleHQoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlICdBJyAtICdBJyArIDE6Ci0gICAgICAgIFNlbGVjdEFsbCgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGNhc2UgJ1onIC0gJ0EnICsgMToKLSAgICAgICAgaWYgKGJTaGlmdCkKLSAgICAgICAgICBSZWRvKCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBVbmRvKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgaWYgKG5DaGFyIDwgMzIpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIGlmIChJc1JlYWRPbmx5KCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKG1fcEVkaXQtPklzU2VsZWN0ZWQoKSAmJiB3b3JkID09IEZXTF9WS0VZX0JhY2spCi0gICAgd29yZCA9IEZXTF9WS0VZX1Vua25vd247Ci0KLSAgQ2xlYXIoKTsKLQotICBzd2l0Y2ggKHdvcmQpIHsKLSAgICBjYXNlIEZXTF9WS0VZX0JhY2s6Ci0gICAgICBCYWNrc3BhY2UoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRldMX1ZLRVlfUmV0dXJuOgotICAgICAgSW5zZXJ0UmV0dXJuKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZXTF9WS0VZX1Vua25vd246Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgSW5zZXJ0V29yZCh3b3JkLCBHZXRDaGFyU2V0KCkpOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDUFdMX0VkaXRDdHJsOjpPbkxCdXR0b25Eb3duKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgewotICBDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCwgbkZsYWcpOwotCi0gIGlmIChDbGllbnRIaXRUZXN0KHBvaW50KSkgewotICAgIGlmIChtX2JNb3VzZURvd24pCi0gICAgICBJbnZhbGlkYXRlUmVjdCgpOwotCi0gICAgbV9iTW91c2VEb3duID0gdHJ1ZTsKLSAgICBTZXRDYXB0dXJlKCk7Ci0KLSAgICBtX3BFZGl0LT5Pbk1vdXNlRG93bihwb2ludCwgSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDUFdMX0VkaXRDdHJsOjpPbkxCdXR0b25VcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIHsKLSAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvblVwKHBvaW50LCBuRmxhZyk7Ci0KLSAgaWYgKG1fYk1vdXNlRG93bikgewotICAgIC8vIGNhbiByZWNlaXZlIGtleWJvcmQgbWVzc2FnZQotICAgIGlmIChDbGllbnRIaXRUZXN0KHBvaW50KSAmJiAhSXNGb2N1c2VkKCkpCi0gICAgICBTZXRGb2N1cygpOwotCi0gICAgUmVsZWFzZUNhcHR1cmUoKTsKLSAgICBtX2JNb3VzZURvd24gPSBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENQV0xfRWRpdEN0cmw6Ok9uTW91c2VNb3ZlKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgewotICBDUFdMX1duZDo6T25Nb3VzZU1vdmUocG9pbnQsIG5GbGFnKTsKLQotICBpZiAobV9iTW91c2VEb3duKQotICAgIG1fcEVkaXQtPk9uTW91c2VNb3ZlKHBvaW50LCBmYWxzZSwgZmFsc2UpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1DRlhfRmxvYXRSZWN0IENQV0xfRWRpdEN0cmw6OkdldENvbnRlbnRSZWN0KCkgY29uc3QgewotICByZXR1cm4gbV9wRWRpdC0+R2V0Q29udGVudFJlY3QoKTsKLX0KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpTZXRFZGl0Q2FyZXQoYm9vbCBiVmlzaWJsZSkgewotICBDRlhfUG9pbnRGIHB0SGVhZDsKLSAgQ0ZYX1BvaW50RiBwdEZvb3Q7Ci0gIGlmIChiVmlzaWJsZSkKLSAgICBHZXRDYXJldEluZm8oJnB0SGVhZCwgJnB0Rm9vdCk7Ci0KLSAgQ1BWVF9Xb3JkUGxhY2Ugd3BUZW1wID0gbV9wRWRpdC0+R2V0Q2FyZXRXb3JkUGxhY2UoKTsKLSAgSU9uU2V0Q2FyZXQoYlZpc2libGUsIHB0SGVhZCwgcHRGb290LCB3cFRlbXApOwotfQotCi12b2lkIENQV0xfRWRpdEN0cmw6OkdldENhcmV0SW5mbyhDRlhfUG9pbnRGKiBwdEhlYWQsIENGWF9Qb2ludEYqIHB0Rm9vdCkgY29uc3QgewotICBDRlhfRWRpdF9JdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wRWRpdC0+R2V0SXRlcmF0b3IoKTsKLSAgcEl0ZXJhdG9yLT5TZXRBdChtX3BFZGl0LT5HZXRDYXJldCgpKTsKLSAgQ1BWVF9Xb3JkIHdvcmQ7Ci0gIENQVlRfTGluZSBsaW5lOwotICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7Ci0gICAgcHRIZWFkLT54ID0gd29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoOwotICAgIHB0SGVhZC0+eSA9IHdvcmQucHRXb3JkLnkgKyB3b3JkLmZBc2NlbnQ7Ci0gICAgcHRGb290LT54ID0gd29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoOwotICAgIHB0Rm9vdC0+eSA9IHdvcmQucHRXb3JkLnkgKyB3b3JkLmZEZXNjZW50OwotICB9IGVsc2UgaWYgKHBJdGVyYXRvci0+R2V0TGluZShsaW5lKSkgewotICAgIHB0SGVhZC0+eCA9IGxpbmUucHRMaW5lLng7Ci0gICAgcHRIZWFkLT55ID0gbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVBc2NlbnQ7Ci0gICAgcHRGb290LT54ID0gbGluZS5wdExpbmUueDsKLSAgICBwdEZvb3QtPnkgPSBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZURlc2NlbnQ7Ci0gIH0KLX0KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpTZXRDYXJldChib29sIGJWaXNpYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdEhlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0Rm9vdCkgewotICBpZiAobV9wRWRpdENhcmV0KSB7Ci0gICAgaWYgKCFJc0ZvY3VzZWQoKSB8fCBtX3BFZGl0LT5Jc1NlbGVjdGVkKCkpCi0gICAgICBiVmlzaWJsZSA9IGZhbHNlOwotCi0gICAgbV9wRWRpdENhcmV0LT5TZXRDYXJldChiVmlzaWJsZSwgcHRIZWFkLCBwdEZvb3QpOwotICB9Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENQV0xfRWRpdEN0cmw6OkdldFRleHQoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BFZGl0LT5HZXRUZXh0KCk7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0U2VsKGludDMyX3QgblN0YXJ0Q2hhciwgaW50MzJfdCBuRW5kQ2hhcikgewotICBtX3BFZGl0LT5TZXRTZWwoblN0YXJ0Q2hhciwgbkVuZENoYXIpOwotfQotCi12b2lkIENQV0xfRWRpdEN0cmw6OkdldFNlbChpbnQzMl90JiBuU3RhcnRDaGFyLCBpbnQzMl90JiBuRW5kQ2hhcikgY29uc3QgewotICBtX3BFZGl0LT5HZXRTZWwoblN0YXJ0Q2hhciwgbkVuZENoYXIpOwotfQotCi12b2lkIENQV0xfRWRpdEN0cmw6OkNsZWFyKCkgewotICBpZiAoIUlzUmVhZE9ubHkoKSkKLSAgICBtX3BFZGl0LT5DbGVhcigpOwotfQotCi12b2lkIENQV0xfRWRpdEN0cmw6OlNlbGVjdEFsbCgpIHsKLSAgbV9wRWRpdC0+U2VsZWN0QWxsKCk7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6UGFpbnQoKSB7Ci0gIG1fcEVkaXQtPlBhaW50KCk7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6RW5hYmxlUmVmcmVzaChib29sIGJSZWZyZXNoKSB7Ci0gIG1fcEVkaXQtPkVuYWJsZVJlZnJlc2goYlJlZnJlc2gpOwotfQotCi1pbnQzMl90IENQV0xfRWRpdEN0cmw6OkdldENhcmV0KCkgY29uc3QgewotICByZXR1cm4gbV9wRWRpdC0+R2V0Q2FyZXQoKTsKLX0KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpTZXRDYXJldChpbnQzMl90IG5Qb3MpIHsKLSAgbV9wRWRpdC0+U2V0Q2FyZXQoblBvcyk7Ci19Ci0KLWludDMyX3QgQ1BXTF9FZGl0Q3RybDo6R2V0VG90YWxXb3JkcygpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcEVkaXQtPkdldFRvdGFsV29yZHMoKTsKLX0KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpTZXRTY3JvbGxQb3MoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgbV9wRWRpdC0+U2V0U2Nyb2xsUG9zKHBvaW50KTsKLX0KLQotQ0ZYX1BvaW50RiBDUFdMX0VkaXRDdHJsOjpHZXRTY3JvbGxQb3MoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BFZGl0LT5HZXRTY3JvbGxQb3MoKTsKLX0KLQotQ1BERl9Gb250KiBDUFdMX0VkaXRDdHJsOjpHZXRDYXJldEZvbnQoKSBjb25zdCB7Ci0gIGludDMyX3QgbkZvbnRJbmRleCA9IDA7Ci0KLSAgQ0ZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcEVkaXQtPkdldEl0ZXJhdG9yKCk7Ci0gIHBJdGVyYXRvci0+U2V0QXQobV9wRWRpdC0+R2V0Q2FyZXQoKSk7Ci0gIENQVlRfV29yZCB3b3JkOwotICBDUFZUX1NlY3Rpb24gc2VjdGlvbjsKLSAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgewotICAgIG5Gb250SW5kZXggPSB3b3JkLm5Gb250SW5kZXg7Ci0gIH0gZWxzZSBpZiAoSGFzRmxhZyhQRVNfUklDSCkpIHsKLSAgICBpZiAocEl0ZXJhdG9yLT5HZXRTZWN0aW9uKHNlY3Rpb24pKSB7Ci0gICAgICBuRm9udEluZGV4ID0gc2VjdGlvbi5Xb3JkUHJvcHMubkZvbnRJbmRleDsKLSAgICB9Ci0gIH0KLQotICBpZiAoSVBWVF9Gb250TWFwKiBwRm9udE1hcCA9IEdldEZvbnRNYXAoKSkKLSAgICByZXR1cm4gcEZvbnRNYXAtPkdldFBERkZvbnQobkZvbnRJbmRleCk7Ci0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLUZYX0ZMT0FUIENQV0xfRWRpdEN0cmw6OkdldENhcmV0Rm9udFNpemUoKSBjb25zdCB7Ci0gIEZYX0ZMT0FUIGZGb250U2l6ZSA9IEdldEZvbnRTaXplKCk7Ci0KLSAgQ0ZYX0VkaXRfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcEVkaXQtPkdldEl0ZXJhdG9yKCk7Ci0gIHBJdGVyYXRvci0+U2V0QXQobV9wRWRpdC0+R2V0Q2FyZXQoKSk7Ci0gIENQVlRfV29yZCB3b3JkOwotICBDUFZUX1NlY3Rpb24gc2VjdGlvbjsKLSAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgewotICAgIGZGb250U2l6ZSA9IHdvcmQuZkZvbnRTaXplOwotICB9IGVsc2UgaWYgKEhhc0ZsYWcoUEVTX1JJQ0gpKSB7Ci0gICAgaWYgKHBJdGVyYXRvci0+R2V0U2VjdGlvbihzZWN0aW9uKSkgewotICAgICAgZkZvbnRTaXplID0gc2VjdGlvbi5Xb3JkUHJvcHMuZkZvbnRTaXplOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBmRm9udFNpemU7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7Ci0gIG1fcEVkaXQtPlNldFRleHQod3NUZXh0KTsKLX0KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpDb3B5VGV4dCgpIHt9Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6UGFzdGVUZXh0KCkge30KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpDdXRUZXh0KCkge30KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpTaG93VlNjcm9sbEJhcihib29sIGJTaG93KSB7fQotCi12b2lkIENQV0xfRWRpdEN0cmw6Okluc2VydFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgewotICBpZiAoIUlzUmVhZE9ubHkoKSkKLSAgICBtX3BFZGl0LT5JbnNlcnRUZXh0KHdzVGV4dCwgRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCk7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6SW5zZXJ0V29yZCh1aW50MTZfdCB3b3JkLCBpbnQzMl90IG5DaGFyc2V0KSB7Ci0gIGlmICghSXNSZWFkT25seSgpKQotICAgIG1fcEVkaXQtPkluc2VydFdvcmQod29yZCwgbkNoYXJzZXQpOwotfQotCi12b2lkIENQV0xfRWRpdEN0cmw6Okluc2VydFJldHVybigpIHsKLSAgaWYgKCFJc1JlYWRPbmx5KCkpCi0gICAgbV9wRWRpdC0+SW5zZXJ0UmV0dXJuKCk7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6RGVsZXRlKCkgewotICBpZiAoIUlzUmVhZE9ubHkoKSkKLSAgICBtX3BFZGl0LT5EZWxldGUoKTsKLX0KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpCYWNrc3BhY2UoKSB7Ci0gIGlmICghSXNSZWFkT25seSgpKQotICAgIG1fcEVkaXQtPkJhY2tzcGFjZSgpOwotfQotCi1ib29sIENQV0xfRWRpdEN0cmw6OkNhblVuZG8oKSBjb25zdCB7Ci0gIHJldHVybiAhSXNSZWFkT25seSgpICYmIG1fcEVkaXQtPkNhblVuZG8oKTsKLX0KLQotYm9vbCBDUFdMX0VkaXRDdHJsOjpDYW5SZWRvKCkgY29uc3QgewotICByZXR1cm4gIUlzUmVhZE9ubHkoKSAmJiBtX3BFZGl0LT5DYW5SZWRvKCk7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6UmVkbygpIHsKLSAgaWYgKENhblJlZG8oKSkKLSAgICBtX3BFZGl0LT5SZWRvKCk7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6VW5kbygpIHsKLSAgaWYgKENhblVuZG8oKSkKLSAgICBtX3BFZGl0LT5VbmRvKCk7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6SU9uU2V0U2Nyb2xsSW5mb1koRlhfRkxPQVQgZlBsYXRlTWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGxhdGVNYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29udGVudE1heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNtYWxsU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkJpZ1N0ZXApIHsKLSAgUFdMX1NDUk9MTF9JTkZPIEluZm87Ci0KLSAgSW5mby5mUGxhdGVXaWR0aCA9IGZQbGF0ZU1heCAtIGZQbGF0ZU1pbjsKLSAgSW5mby5mQ29udGVudE1pbiA9IGZDb250ZW50TWluOwotICBJbmZvLmZDb250ZW50TWF4ID0gZkNvbnRlbnRNYXg7Ci0gIEluZm8uZlNtYWxsU3RlcCA9IGZTbWFsbFN0ZXA7Ci0gIEluZm8uZkJpZ1N0ZXAgPSBmQmlnU3RlcDsKLQotICBPbk5vdGlmeSh0aGlzLCBQTk1fU0VUU0NST0xMSU5GTywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmSW5mbyk7Ci0KLSAgaWYgKElzRmxvYXRCaWdnZXIoSW5mby5mUGxhdGVXaWR0aCwgSW5mby5mQ29udGVudE1heCAtIEluZm8uZkNvbnRlbnRNaW4pIHx8Ci0gICAgICBJc0Zsb2F0RXF1YWwoSW5mby5mUGxhdGVXaWR0aCwgSW5mby5mQ29udGVudE1heCAtIEluZm8uZkNvbnRlbnRNaW4pKSB7Ci0gICAgU2hvd1ZTY3JvbGxCYXIoZmFsc2UpOwotICB9IGVsc2UgewotICAgIFNob3dWU2Nyb2xsQmFyKHRydWUpOwotICB9Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6SU9uU2V0U2Nyb2xsUG9zWShGWF9GTE9BVCBmeSkgewotICBPbk5vdGlmeSh0aGlzLCBQTk1fU0VUU0NST0xMUE9TLCBTQlRfVlNDUk9MTCwgKGludHB0cl90KSZmeSk7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6SU9uU2V0Q2FyZXQoYm9vbCBiVmlzaWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHRIZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdEZvb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgewotICBQV0xfQ0FSRVRfSU5GTyBjSW5mbzsKLSAgY0luZm8uYlZpc2libGUgPSBiVmlzaWJsZTsKLSAgY0luZm8ucHRIZWFkID0gcHRIZWFkOwotICBjSW5mby5wdEZvb3QgPSBwdEZvb3Q7Ci0KLSAgT25Ob3RpZnkodGhpcywgUE5NX1NFVENBUkVUSU5GTywgKGludHB0cl90KSZjSW5mbywgKGludHB0cl90KSBudWxscHRyKTsKLX0KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpJT25DYXJldENoYW5nZShjb25zdCBDUFZUX1NlY1Byb3BzJiBzZWNQcm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUHJvcHMmIHdvcmRQcm9wcykge30KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpJT25Db250ZW50Q2hhbmdlKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjQ29udGVudCkge30KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpJT25JbnZhbGlkYXRlUmVjdChDRlhfRmxvYXRSZWN0KiBwUmVjdCkgewotICBJbnZhbGlkYXRlUmVjdChwUmVjdCk7Ci19Ci0KLWludDMyX3QgQ1BXTF9FZGl0Q3RybDo6R2V0Q2hhclNldCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fbkNoYXJTZXQgPCAwID8gRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCA6IG1fbkNoYXJTZXQ7Ci19Ci0KLXZvaWQgQ1BXTF9FZGl0Q3RybDo6R2V0VGV4dFJhbmdlKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuU3RhcnRDaGFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbkVuZENoYXIpIGNvbnN0IHsKLSAgblN0YXJ0Q2hhciA9IG1fcEVkaXQtPldvcmRQbGFjZVRvV29yZEluZGV4KAotICAgICAgbV9wRWRpdC0+U2VhcmNoV29yZFBsYWNlKENGWF9Qb2ludEYocmVjdC5sZWZ0LCByZWN0LnRvcCkpKTsKLSAgbkVuZENoYXIgPSBtX3BFZGl0LT5Xb3JkUGxhY2VUb1dvcmRJbmRleCgKLSAgICAgIG1fcEVkaXQtPlNlYXJjaFdvcmRQbGFjZShDRlhfUG9pbnRGKHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKSkpOwotfQotCi1DRlhfV2lkZVN0cmluZyBDUFdMX0VkaXRDdHJsOjpHZXRUZXh0KGludDMyX3QmIG5TdGFydENoYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5FbmRDaGFyKSBjb25zdCB7Ci0gIENQVlRfV29yZFBsYWNlIHdwU3RhcnQgPSBtX3BFZGl0LT5Xb3JkSW5kZXhUb1dvcmRQbGFjZShuU3RhcnRDaGFyKTsKLSAgQ1BWVF9Xb3JkUGxhY2Ugd3BFbmQgPSBtX3BFZGl0LT5Xb3JkSW5kZXhUb1dvcmRQbGFjZShuRW5kQ2hhcik7Ci0gIHJldHVybiBtX3BFZGl0LT5HZXRSYW5nZVRleHQoQ1BWVF9Xb3JkUmFuZ2Uod3BTdGFydCwgd3BFbmQpKTsKLX0KLQotdm9pZCBDUFdMX0VkaXRDdHJsOjpTZXRSZWFkeVRvSW5wdXQoKSB7Ci0gIGlmIChtX2JNb3VzZURvd24pIHsKLSAgICBSZWxlYXNlQ2FwdHVyZSgpOwotICAgIG1fYk1vdXNlRG93biA9IGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9mcGRmc2RrL3BkZndpbmRvdy9QV0xfRWRpdEN0cmwuaCBiL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTg1NzBiLi4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9FZGl0Q3RybC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGUERGU0RLX1BERldJTkRPV19QV0xfRURJVENUUkxfSF8KLSNkZWZpbmUgRlBERlNES19QREZXSU5ET1dfUFdMX0VESVRDVFJMX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgImZwZGZzZGsvZnhlZGl0L2Z4X2VkaXQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfV25kLmgiCi0KLWNsYXNzIENGWF9FZGl0OwotY2xhc3MgQ1BXTF9DYXJldDsKLWNsYXNzIENQV0xfRWRpdDsKLWNsYXNzIENQV0xfRWRpdEN0cmw7Ci1zdHJ1Y3QgQ1BWVF9TZWNQcm9wczsKLXN0cnVjdCBDUFZUX1dvcmRQbGFjZTsKLXN0cnVjdCBDUFZUX1dvcmRQcm9wczsKLXN0cnVjdCBDUFZUX1dvcmRSYW5nZTsKLQotZW51bSBQV0xfRURJVF9BTElHTkZPUk1BVF9IIHsgUEVBSF9MRUZUID0gMCwgUEVBSF9NSURETEUsIFBFQUhfUklHSFQgfTsKLQotZW51bSBQV0xfRURJVF9BTElHTkZPUk1BVF9WIHsgUEVBVl9UT1AgPSAwLCBQRUFWX0NFTlRFUiwgUEVBVl9CT1RUT00gfTsKLQotY2xhc3MgQ1BXTF9FZGl0Q3RybCA6IHB1YmxpYyBDUFdMX1duZCB7Ci0gIGZyaWVuZCBjbGFzcyBDUFdMX0VkaXRfTm90aWZ5OwotCi0gcHVibGljOgotICBDUFdMX0VkaXRDdHJsKCk7Ci0gIH5DUFdMX0VkaXRDdHJsKCkgb3ZlcnJpZGU7Ci0KLSAgQ0ZYX0Zsb2F0UmVjdCBHZXRDb250ZW50UmVjdCgpIGNvbnN0OwotCi0gIENGWF9XaWRlU3RyaW5nIEdldFRleHQoKSBjb25zdDsKLSAgdm9pZCBTZXRTZWwoaW50MzJfdCBuU3RhcnRDaGFyLCBpbnQzMl90IG5FbmRDaGFyKTsKLSAgdm9pZCBHZXRTZWwoaW50MzJfdCYgblN0YXJ0Q2hhciwgaW50MzJfdCYgbkVuZENoYXIpIGNvbnN0OwotICB2b2lkIEdldFRleHRSYW5nZShjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LAotICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuU3RhcnRDaGFyLAotICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuRW5kQ2hhcikgY29uc3Q7Ci0gIENGWF9XaWRlU3RyaW5nIEdldFRleHQoaW50MzJfdCYgblN0YXJ0Q2hhciwgaW50MzJfdCYgbkVuZENoYXIpIGNvbnN0OwotICB2b2lkIENsZWFyKCk7Ci0gIHZvaWQgU2VsZWN0QWxsKCk7Ci0KLSAgaW50MzJfdCBHZXRDYXJldCgpIGNvbnN0OwotICB2b2lkIFNldENhcmV0KGludDMyX3QgblBvcyk7Ci0gIGludDMyX3QgR2V0VG90YWxXb3JkcygpIGNvbnN0OwotCi0gIHZvaWQgUGFpbnQoKTsKLQotICB2b2lkIEVuYWJsZVJlZnJlc2goYm9vbCBiUmVmcmVzaCk7Ci0gIENGWF9Qb2ludEYgR2V0U2Nyb2xsUG9zKCkgY29uc3Q7Ci0gIHZvaWQgU2V0U2Nyb2xsUG9zKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKLQotICB2b2lkIFNldENoYXJTZXQodWludDhfdCBuQ2hhclNldCkgeyBtX25DaGFyU2V0ID0gbkNoYXJTZXQ7IH0KLSAgaW50MzJfdCBHZXRDaGFyU2V0KCkgY29uc3Q7Ci0KLSAgdm9pZCBTZXRDb2RlUGFnZShpbnQzMl90IG5Db2RlUGFnZSkgeyBtX25Db2RlUGFnZSA9IG5Db2RlUGFnZTsgfQotICBpbnQzMl90IEdldENvZGVQYWdlKCkgY29uc3QgeyByZXR1cm4gbV9uQ29kZVBhZ2U7IH0KLQotICBDUERGX0ZvbnQqIEdldENhcmV0Rm9udCgpIGNvbnN0OwotICBGWF9GTE9BVCBHZXRDYXJldEZvbnRTaXplKCkgY29uc3Q7Ci0KLSAgYm9vbCBDYW5VbmRvKCkgY29uc3Q7Ci0gIGJvb2wgQ2FuUmVkbygpIGNvbnN0OwotICB2b2lkIFJlZG8oKTsKLSAgdm9pZCBVbmRvKCk7Ci0KLSAgdm9pZCBTZXRSZWFkeVRvSW5wdXQoKTsKLQotICAvLyBDUFdMX1duZAotICB2b2lkIE9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSYgY3ApIG92ZXJyaWRlOwotICB2b2lkIE9uQ3JlYXRlZCgpIG92ZXJyaWRlOwotICBib29sIE9uS2V5RG93bih1aW50MTZfdCBuQ2hhciwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOwotICBib29sIE9uQ2hhcih1aW50MTZfdCBuQ2hhciwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOwotICBib29sIE9uTEJ1dHRvbkRvd24oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKLSAgYm9vbCBPbkxCdXR0b25VcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOwotICBib29sIE9uTW91c2VNb3ZlKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgb3ZlcnJpZGU7Ci0gIHZvaWQgT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsCi0gICAgICAgICAgICAgICAgdWludDMyX3QgbXNnLAotICAgICAgICAgICAgICAgIGludHB0cl90IHdQYXJhbSA9IDAsCi0gICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtID0gMCkgb3ZlcnJpZGU7Ci0gIHZvaWQgQ3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgb3ZlcnJpZGU7Ci0gIHZvaWQgUmVQb3NDaGlsZFduZCgpIG92ZXJyaWRlOwotICB2b2lkIFNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgb3ZlcnJpZGU7Ci0gIEZYX0ZMT0FUIEdldEZvbnRTaXplKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgU2V0Q3Vyc29yKCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBJT25TZXRTY3JvbGxJbmZvWShGWF9GTE9BVCBmUGxhdGVNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBsYXRlTWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50TWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTbWFsbFN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkJpZ1N0ZXApOwotICB2b2lkIElPblNldFNjcm9sbFBvc1koRlhfRkxPQVQgZnkpOwotICB2b2lkIElPblNldENhcmV0KGJvb2wgYlZpc2libGUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHRIZWFkLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0Rm9vdCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpOwotICB2b2lkIElPbkNhcmV0Q2hhbmdlKGNvbnN0IENQVlRfU2VjUHJvcHMmIHNlY1Byb3BzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFByb3BzJiB3b3JkUHJvcHMpOwotICB2b2lkIElPbkNvbnRlbnRDaGFuZ2UoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNDb250ZW50KTsKLSAgdm9pZCBJT25JbnZhbGlkYXRlUmVjdChDRlhfRmxvYXRSZWN0KiBwUmVjdCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgSW5zZXJ0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsKLSAgdm9pZCBTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOwotICB2b2lkIENvcHlUZXh0KCk7Ci0gIHZvaWQgUGFzdGVUZXh0KCk7Ci0gIHZvaWQgQ3V0VGV4dCgpOwotICB2b2lkIFNob3dWU2Nyb2xsQmFyKGJvb2wgYlNob3cpOwotICB2b2lkIEluc2VydFdvcmQodWludDE2X3Qgd29yZCwgaW50MzJfdCBuQ2hhcnNldCk7Ci0gIHZvaWQgSW5zZXJ0UmV0dXJuKCk7Ci0KLSAgYm9vbCBJc1duZEhvclYoKTsKLQotICB2b2lkIERlbGV0ZSgpOwotICB2b2lkIEJhY2tzcGFjZSgpOwotCi0gIHZvaWQgR2V0Q2FyZXRJbmZvKENGWF9Qb2ludEYqIHB0SGVhZCwgQ0ZYX1BvaW50RiogcHRGb290KSBjb25zdDsKLSAgdm9pZCBTZXRDYXJldChib29sIGJWaXNpYmxlLAotICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0SGVhZCwKLSAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdEZvb3QpOwotCi0gIHZvaWQgU2V0RWRpdENhcmV0KGJvb2wgYlZpc2libGUpOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRWRpdD4gbV9wRWRpdDsKLSAgQ1BXTF9DYXJldCogbV9wRWRpdENhcmV0OwotICBib29sIG1fYk1vdXNlRG93bjsKLQotIHByaXZhdGU6Ci0gIHZvaWQgQ3JlYXRlRWRpdENhcmV0KGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApOwotCi0gIGludDMyX3QgbV9uQ2hhclNldDsKLSAgaW50MzJfdCBtX25Db2RlUGFnZTsKLX07Ci0KLSNlbmRpZiAgLy8gRlBERlNES19QREZXSU5ET1dfUFdMX0VESVRDVFJMX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3BkZndpbmRvdy9QV0xfRm9udE1hcC5jcHAgYi9mcGRmc2RrL3BkZndpbmRvdy9QV0xfRm9udE1hcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMjk2MmMuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDI2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9Gb250TWFwLmgiCi0KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL2NwZGZfbW9kdWxlbWdyLmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9mb250LmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9mb250ZW5jb2RpbmcuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFyc2VyLmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmZG9jL2lwdnRfZm9udG1hcC5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9XbmQuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgotCi1uYW1lc3BhY2UgewotCi1jb25zdCBjaGFyIGtEZWZhdWx0Rm9udE5hbWVbXSA9ICJIZWx2ZXRpY2EiOwotCi1jb25zdCBjaGFyKiBjb25zdCBnX3NERVN0YW5kYXJkRm9udE5hbWVbXSA9IHsiQ291cmllciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291cmllci1Cb2xkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VyaWVyLUJvbGRPYmxpcXVlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VyaWVyLU9ibGlxdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHZldGljYSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsdmV0aWNhLUJvbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsdmV0aWNhLU9ibGlxdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbWVzLVJvbWFuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaW1lcy1Cb2xkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaW1lcy1JdGFsaWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbWVzLUJvbGRJdGFsaWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN5bWJvbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWmFwZkRpbmdiYXRzIn07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1DUFdMX0ZvbnRNYXA6OkNQV0xfRm9udE1hcChDRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpCi0gICAgOiBtX3BTeXN0ZW1IYW5kbGVyKHBTeXN0ZW1IYW5kbGVyKSB7Ci0gIEFTU0VSVChtX3BTeXN0ZW1IYW5kbGVyKTsKLX0KLQotQ1BXTF9Gb250TWFwOjp+Q1BXTF9Gb250TWFwKCkgewotICBFbXB0eSgpOwotfQotCi1DUERGX0RvY3VtZW50KiBDUFdMX0ZvbnRNYXA6OkdldERvY3VtZW50KCkgewotICBpZiAoIW1fcFBERkRvYykgewotICAgIGlmIChDUERGX01vZHVsZU1ncjo6R2V0KCkpIHsKLSAgICAgIG1fcFBERkRvYyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RvY3VtZW50PihudWxscHRyKTsKLSAgICAgIG1fcFBERkRvYy0+Q3JlYXRlTmV3RG9jKCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIG1fcFBERkRvYy5nZXQoKTsKLX0KLQotQ1BERl9Gb250KiBDUFdMX0ZvbnRNYXA6OkdldFBERkZvbnQoaW50MzJfdCBuRm9udEluZGV4KSB7Ci0gIGlmIChuRm9udEluZGV4ID49IDAgJiYgbkZvbnRJbmRleCA8IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9EYXRhKSkgewotICAgIGlmIChtX0RhdGFbbkZvbnRJbmRleF0pCi0gICAgICByZXR1cm4gbV9EYXRhW25Gb250SW5kZXhdLT5wRm9udDsKLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpHZXRQREZGb250QWxpYXMoaW50MzJfdCBuRm9udEluZGV4KSB7Ci0gIGlmIChuRm9udEluZGV4ID49IDAgJiYgbkZvbnRJbmRleCA8IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9EYXRhKSkgewotICAgIGlmIChtX0RhdGFbbkZvbnRJbmRleF0pCi0gICAgICByZXR1cm4gbV9EYXRhW25Gb250SW5kZXhdLT5zRm9udE5hbWU7Ci0gIH0KLSAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCk7Ci19Ci0KLWJvb2wgQ1BXTF9Gb250TWFwOjpLbm93V29yZChpbnQzMl90IG5Gb250SW5kZXgsIHVpbnQxNl90IHdvcmQpIHsKLSAgaWYgKG5Gb250SW5kZXggPj0gMCAmJiBuRm9udEluZGV4IDwgcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX0RhdGEpKSB7Ci0gICAgaWYgKG1fRGF0YVtuRm9udEluZGV4XSkKLSAgICAgIHJldHVybiBDaGFyQ29kZUZyb21Vbmljb2RlKG5Gb250SW5kZXgsIHdvcmQpID49IDA7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1pbnQzMl90IENQV0xfRm9udE1hcDo6R2V0V29yZEZvbnRJbmRleCh1aW50MTZfdCB3b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZvbnRJbmRleCkgewotICBpZiAobkZvbnRJbmRleCA+IDApIHsKLSAgICBpZiAoS25vd1dvcmQobkZvbnRJbmRleCwgd29yZCkpCi0gICAgICByZXR1cm4gbkZvbnRJbmRleDsKLSAgfSBlbHNlIHsKLSAgICBpZiAoY29uc3QgQ1BXTF9Gb250TWFwX0RhdGEqIHBEYXRhID0gR2V0Rm9udE1hcERhdGEoMCkpIHsKLSAgICAgIGlmIChuQ2hhcnNldCA9PSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUIHx8Ci0gICAgICAgICAgcERhdGEtPm5DaGFyc2V0ID09IEZYRk9OVF9TWU1CT0xfQ0hBUlNFVCB8fAotICAgICAgICAgIG5DaGFyc2V0ID09IHBEYXRhLT5uQ2hhcnNldCkgewotICAgICAgICBpZiAoS25vd1dvcmQoMCwgd29yZCkpCi0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaW50MzJfdCBuTmV3Rm9udEluZGV4ID0KLSAgICAgIEdldEZvbnRJbmRleChHZXROYXRpdmVGb250TmFtZShuQ2hhcnNldCksIG5DaGFyc2V0LCB0cnVlKTsKLSAgaWYgKG5OZXdGb250SW5kZXggPj0gMCkgewotICAgIGlmIChLbm93V29yZChuTmV3Rm9udEluZGV4LCB3b3JkKSkKLSAgICAgIHJldHVybiBuTmV3Rm9udEluZGV4OwotICB9Ci0gIG5OZXdGb250SW5kZXggPQotICAgICAgR2V0Rm9udEluZGV4KCJBcmlhbCBVbmljb2RlIE1TIiwgRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCwgZmFsc2UpOwotICBpZiAobk5ld0ZvbnRJbmRleCA+PSAwKSB7Ci0gICAgaWYgKEtub3dXb3JkKG5OZXdGb250SW5kZXgsIHdvcmQpKQotICAgICAgcmV0dXJuIG5OZXdGb250SW5kZXg7Ci0gIH0KLSAgcmV0dXJuIC0xOwotfQotCi1pbnQzMl90IENQV0xfRm9udE1hcDo6Q2hhckNvZGVGcm9tVW5pY29kZShpbnQzMl90IG5Gb250SW5kZXgsIHVpbnQxNl90IHdvcmQpIHsKLSAgaWYgKG5Gb250SW5kZXggPCAwIHx8IG5Gb250SW5kZXggPj0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX0RhdGEpKQotICAgIHJldHVybiAtMTsKLQotICBDUFdMX0ZvbnRNYXBfRGF0YSogcERhdGEgPSBtX0RhdGFbbkZvbnRJbmRleF0uZ2V0KCk7Ci0gIGlmICghcERhdGEgfHwgIXBEYXRhLT5wRm9udCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKHBEYXRhLT5wRm9udC0+SXNVbmljb2RlQ29tcGF0aWJsZSgpKQotICAgIHJldHVybiBwRGF0YS0+cEZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUod29yZCk7Ci0KLSAgcmV0dXJuIHdvcmQgPCAweEZGID8gd29yZCA6IC0xOwotfQotCi1DRlhfQnl0ZVN0cmluZyBDUFdMX0ZvbnRNYXA6OkdldE5hdGl2ZUZvbnROYW1lKGludDMyX3QgbkNoYXJzZXQpIHsKLSAgZm9yIChjb25zdCBhdXRvJiBwRGF0YSA6IG1fTmF0aXZlRm9udCkgewotICAgIGlmIChwRGF0YSAmJiBwRGF0YS0+bkNoYXJzZXQgPT0gbkNoYXJzZXQpCi0gICAgICByZXR1cm4gcERhdGEtPnNGb250TmFtZTsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIHNOZXcgPSBHZXROYXRpdmVGb250KG5DaGFyc2V0KTsKLSAgaWYgKHNOZXcuSXNFbXB0eSgpKQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotCi0gIGF1dG8gcE5ld0RhdGEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BXTF9Gb250TWFwX05hdGl2ZT4oKTsKLSAgcE5ld0RhdGEtPm5DaGFyc2V0ID0gbkNoYXJzZXQ7Ci0gIHBOZXdEYXRhLT5zRm9udE5hbWUgPSBzTmV3OwotICBtX05hdGl2ZUZvbnQucHVzaF9iYWNrKHN0ZDo6bW92ZShwTmV3RGF0YSkpOwotICByZXR1cm4gc05ldzsKLX0KLQotdm9pZCBDUFdMX0ZvbnRNYXA6OkVtcHR5KCkgewotICBtX0RhdGEuY2xlYXIoKTsKLSAgbV9OYXRpdmVGb250LmNsZWFyKCk7Ci19Ci0KLXZvaWQgQ1BXTF9Gb250TWFwOjpJbml0aWFsaXplKCkgewotICBHZXRGb250SW5kZXgoa0RlZmF1bHRGb250TmFtZSwgRlhGT05UX0FOU0lfQ0hBUlNFVCwgZmFsc2UpOwotfQotCi1ib29sIENQV0xfRm9udE1hcDo6SXNTdGFuZGFyZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSkgewotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShnX3NERVN0YW5kYXJkRm9udE5hbWUpOyArK2kpIHsKLSAgICBpZiAoc0ZvbnROYW1lID09IGdfc0RFU3RhbmRhcmRGb250TmFtZVtpXSkKLSAgICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1pbnQzMl90IENQV0xfRm9udE1hcDo6RmluZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFyc2V0KSB7Ci0gIGludDMyX3QgaSA9IDA7Ci0gIGZvciAoY29uc3QgYXV0byYgcERhdGEgOiBtX0RhdGEpIHsKLSAgICBpZiAocERhdGEgJiYKLSAgICAgICAgKG5DaGFyc2V0ID09IEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQgfHwgbkNoYXJzZXQgPT0gcERhdGEtPm5DaGFyc2V0KSAmJgotICAgICAgICAoc0ZvbnROYW1lLklzRW1wdHkoKSB8fCBwRGF0YS0+c0ZvbnROYW1lID09IHNGb250TmFtZSkpIHsKLSAgICAgIHJldHVybiBpOwotICAgIH0KLSAgICArK2k7Ci0gIH0KLSAgcmV0dXJuIC0xOwotfQotCi1pbnQzMl90IENQV0xfRm9udE1hcDo6R2V0Rm9udEluZGV4KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZpbmQpIHsKLSAgaW50MzJfdCBuRm9udEluZGV4ID0gRmluZEZvbnQoRW5jb2RlRm9udEFsaWFzKHNGb250TmFtZSwgbkNoYXJzZXQpLCBuQ2hhcnNldCk7Ci0gIGlmIChuRm9udEluZGV4ID49IDApCi0gICAgcmV0dXJuIG5Gb250SW5kZXg7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgc0FsaWFzOwotICBDUERGX0ZvbnQqIHBGb250ID0gbnVsbHB0cjsKLSAgaWYgKGJGaW5kKQotICAgIHBGb250ID0gRmluZEZvbnRTYW1lQ2hhcnNldChzQWxpYXMsIG5DaGFyc2V0KTsKLQotICBpZiAoIXBGb250KSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc1RlbXAgPSBzRm9udE5hbWU7Ci0gICAgcEZvbnQgPSBBZGRGb250VG9Eb2N1bWVudChHZXREb2N1bWVudCgpLCBzVGVtcCwgbkNoYXJzZXQpOwotICAgIHNBbGlhcyA9IEVuY29kZUZvbnRBbGlhcyhzVGVtcCwgbkNoYXJzZXQpOwotICB9Ci0gIEFkZGVkRm9udChwRm9udCwgc0FsaWFzKTsKLSAgcmV0dXJuIEFkZEZvbnREYXRhKHBGb250LCBzQWxpYXMsIG5DaGFyc2V0KTsKLX0KLQotQ1BERl9Gb250KiBDUFdMX0ZvbnRNYXA6OkZpbmRGb250U2FtZUNoYXJzZXQoQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFyc2V0KSB7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1pbnQzMl90IENQV0xfRm9udE1hcDo6QWRkRm9udERhdGEoQ1BERl9Gb250KiBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFyc2V0KSB7Ci0gIGF1dG8gcE5ld0RhdGEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BXTF9Gb250TWFwX0RhdGE+KCk7Ci0gIHBOZXdEYXRhLT5wRm9udCA9IHBGb250OwotICBwTmV3RGF0YS0+c0ZvbnROYW1lID0gc0ZvbnRBbGlhczsKLSAgcE5ld0RhdGEtPm5DaGFyc2V0ID0gbkNoYXJzZXQ7Ci0gIG1fRGF0YS5wdXNoX2JhY2soc3RkOjptb3ZlKHBOZXdEYXRhKSk7Ci0gIHJldHVybiBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fRGF0YSkgLSAxOwotfQotCi12b2lkIENQV0xfRm9udE1hcDo6QWRkZWRGb250KENQREZfRm9udCogcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzKSB7fQotCi1DRlhfQnl0ZVN0cmluZyBDUFdMX0ZvbnRNYXA6OkdldE5hdGl2ZUZvbnQoaW50MzJfdCBuQ2hhcnNldCkgewotICBpZiAobkNoYXJzZXQgPT0gRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCkKLSAgICBuQ2hhcnNldCA9IEdldE5hdGl2ZUNoYXJzZXQoKTsKLQotICBDRlhfQnl0ZVN0cmluZyBzRm9udE5hbWUgPSBHZXREZWZhdWx0Rm9udEJ5Q2hhcnNldChuQ2hhcnNldCk7Ci0gIGlmICghbV9wU3lzdGVtSGFuZGxlci0+RmluZE5hdGl2ZVRydWVUeXBlRm9udChzRm9udE5hbWUpKQotICAgIHJldHVybiBDRlhfQnl0ZVN0cmluZygpOwotCi0gIHJldHVybiBzRm9udE5hbWU7Ci19Ci0KLUNQREZfRm9udCogQ1BXTF9Gb250TWFwOjpBZGRGb250VG9Eb2N1bWVudChDUERGX0RvY3VtZW50KiBwRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBuQ2hhcnNldCkgewotICBpZiAoSXNTdGFuZGFyZEZvbnQoc0ZvbnROYW1lKSkKLSAgICByZXR1cm4gQWRkU3RhbmRhcmRGb250KHBEb2MsIHNGb250TmFtZSk7Ci0KLSAgcmV0dXJuIEFkZFN5c3RlbUZvbnQocERvYywgc0ZvbnROYW1lLCBuQ2hhcnNldCk7Ci19Ci0KLUNQREZfRm9udCogQ1BXTF9Gb250TWFwOjpBZGRTdGFuZGFyZEZvbnQoQ1BERl9Eb2N1bWVudCogcERvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSkgewotICBpZiAoIXBEb2MpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgQ1BERl9Gb250KiBwRm9udCA9IG51bGxwdHI7Ci0KLSAgaWYgKHNGb250TmFtZSA9PSAiWmFwZkRpbmdiYXRzIikgewotICAgIHBGb250ID0gcERvYy0+QWRkU3RhbmRhcmRGb250KHNGb250TmFtZS5jX3N0cigpLCBudWxscHRyKTsKLSAgfSBlbHNlIHsKLSAgICBDUERGX0ZvbnRFbmNvZGluZyBmZShQREZGT05UX0VOQ09ESU5HX1dJTkFOU0kpOwotICAgIHBGb250ID0gcERvYy0+QWRkU3RhbmRhcmRGb250KHNGb250TmFtZS5jX3N0cigpLCAmZmUpOwotICB9Ci0KLSAgcmV0dXJuIHBGb250OwotfQotCi1DUERGX0ZvbnQqIENQV0xfRm9udE1hcDo6QWRkU3lzdGVtRm9udChDUERGX0RvY3VtZW50KiBwRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbkNoYXJzZXQpIHsKLSAgaWYgKCFwRG9jKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIGlmIChzRm9udE5hbWUuSXNFbXB0eSgpKQotICAgIHNGb250TmFtZSA9IEdldE5hdGl2ZUZvbnQobkNoYXJzZXQpOwotICBpZiAobkNoYXJzZXQgPT0gRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCkKLSAgICBuQ2hhcnNldCA9IEdldE5hdGl2ZUNoYXJzZXQoKTsKLQotICByZXR1cm4gbV9wU3lzdGVtSGFuZGxlci0+QWRkTmF0aXZlVHJ1ZVR5cGVGb250VG9QREYocERvYywgc0ZvbnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYXJzZXQpOwotfQotCi1DRlhfQnl0ZVN0cmluZyBDUFdMX0ZvbnRNYXA6OkVuY29kZUZvbnRBbGlhcyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhcnNldCkgewotICBDRlhfQnl0ZVN0cmluZyBzUG9zdGZpeDsKLSAgc1Bvc3RmaXguRm9ybWF0KCJfJTAyWCIsIG5DaGFyc2V0KTsKLSAgcmV0dXJuIEVuY29kZUZvbnRBbGlhcyhzRm9udE5hbWUpICsgc1Bvc3RmaXg7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfRm9udE1hcDo6RW5jb2RlRm9udEFsaWFzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUpIHsKLSAgQ0ZYX0J5dGVTdHJpbmcgc1JldCA9IHNGb250TmFtZTsKLSAgc1JldC5SZW1vdmUoJyAnKTsKLSAgcmV0dXJuIHNSZXQ7Ci19Ci0KLWNvbnN0IENQV0xfRm9udE1hcF9EYXRhKiBDUFdMX0ZvbnRNYXA6OkdldEZvbnRNYXBEYXRhKGludDMyX3QgbkluZGV4KSBjb25zdCB7Ci0gIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fRGF0YSkpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgcmV0dXJuIG1fRGF0YVtuSW5kZXhdLmdldCgpOwotfQotCi1pbnQzMl90IENQV0xfRm9udE1hcDo6R2V0TmF0aXZlQ2hhcnNldCgpIHsKLSAgdWludDhfdCBuQ2hhcnNldCA9IEZYRk9OVF9BTlNJX0NIQVJTRVQ7Ci0gIGludDMyX3QgaUNvZGVQYWdlID0gRlhTWVNfR2V0QUNQKCk7Ci0gIHN3aXRjaCAoaUNvZGVQYWdlKSB7Ci0gICAgY2FzZSA5MzI6ICAvLyBKYXBhbgotICAgICAgbkNoYXJzZXQgPSBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgOTM2OiAgLy8gQ2hpbmVzZSAoUFJDLCBTaW5nYXBvcmUpCi0gICAgICBuQ2hhcnNldCA9IEZYRk9OVF9HQjIzMTJfQ0hBUlNFVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgOTUwOiAgLy8gQ2hpbmVzZSAoVGFpd2FuOyBIb25nIEtvbmcgU0FSLCBQUkMpCi0gICAgICBuQ2hhcnNldCA9IEZYRk9OVF9HQjIzMTJfQ0hBUlNFVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI1MjogIC8vIFdpbmRvd3MgMy4xIExhdGluIDEgKFVTLCBXZXN0ZXJuIEV1cm9wZSkKLSAgICAgIG5DaGFyc2V0ID0gRlhGT05UX0FOU0lfQ0hBUlNFVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgODc0OiAgLy8gVGhhaQotICAgICAgbkNoYXJzZXQgPSBGWEZPTlRfVEhBSV9DSEFSU0VUOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA5NDk6ICAvLyBLb3JlYW4KLSAgICAgIG5DaGFyc2V0ID0gRlhGT05UX0hBTkdVTF9DSEFSU0VUOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjAwOiAgLy8gVW5pY29kZSAoQk1QIG9mIElTTyAxMDY0NikKLSAgICAgIG5DaGFyc2V0ID0gRlhGT05UX0FOU0lfQ0hBUlNFVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI1MDogIC8vIFdpbmRvd3MgMy4xIEVhc3Rlcm4gRXVyb3BlYW4KLSAgICAgIG5DaGFyc2V0ID0gRlhGT05UX0VBU1RFVVJPUEVfQ0hBUlNFVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI1MTogIC8vIFdpbmRvd3MgMy4xIEN5cmlsbGljCi0gICAgICBuQ2hhcnNldCA9IEZYRk9OVF9SVVNTSUFOX0NIQVJTRVQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEyNTM6ICAvLyBXaW5kb3dzIDMuMSBHcmVlawotICAgICAgbkNoYXJzZXQgPSBGWEZPTlRfR1JFRUtfQ0hBUlNFVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI1NDogIC8vIFdpbmRvd3MgMy4xIFR1cmtpc2gKLSAgICAgIG5DaGFyc2V0ID0gRlhGT05UX1RVUktJU0hfQ0hBUlNFVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI1NTogIC8vIEhlYnJldwotICAgICAgbkNoYXJzZXQgPSBGWEZPTlRfSEVCUkVXX0NIQVJTRVQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDEyNTY6ICAvLyBBcmFiaWMKLSAgICAgIG5DaGFyc2V0ID0gRlhGT05UX0FSQUJJQ19DSEFSU0VUOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxMjU3OiAgLy8gQmFsdGljCi0gICAgICBuQ2hhcnNldCA9IEZYRk9OVF9CQUxUSUNfQ0hBUlNFVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI1ODogIC8vIFZpZXRuYW1lc2UKLSAgICAgIG5DaGFyc2V0ID0gRlhGT05UX1ZJRVROQU1FU0VfQ0hBUlNFVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTM2MTogIC8vIEtvcmVhbihKb2hhYikKLSAgICAgIG5DaGFyc2V0ID0gRlhGT05UX0pPSEFCX0NIQVJTRVQ7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gbkNoYXJzZXQ7Ci19Ci0KLWNvbnN0IEZQREZfQ2hhcnNldEZvbnRNYXAgQ1BXTF9Gb250TWFwOjpkZWZhdWx0VFRGTWFwW10gPSB7Ci0gICAge0ZYRk9OVF9BTlNJX0NIQVJTRVQsICJIZWx2ZXRpY2EifSwKLSAgICB7RlhGT05UX0dCMjMxMl9DSEFSU0VULCAiU2ltU3VuIn0sCi0gICAge0ZYRk9OVF9DSElORVNFQklHNV9DSEFSU0VULCAiTWluZ0xpVSJ9LAotICAgIHtGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVCwgIk1TIEdvdGhpYyJ9LAotICAgIHtGWEZPTlRfSEFOR1VMX0NIQVJTRVQsICJCYXRhbmcifSwKLSAgICB7RlhGT05UX1JVU1NJQU5fQ0hBUlNFVCwgIkFyaWFsIn0sCi0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9MSU5VWF8gfHwgXAotICAgIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAge0ZYRk9OVF9FQVNURVVST1BFX0NIQVJTRVQsICJBcmlhbCJ9LAotI2Vsc2UKLSAgICB7RlhGT05UX0VBU1RFVVJPUEVfQ0hBUlNFVCwgIlRhaG9tYSJ9LAotI2VuZGlmCi0gICAge0ZYRk9OVF9BUkFCSUNfQ0hBUlNFVCwgIkFyaWFsIn0sCi0gICAgey0xLCBudWxscHRyfX07Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfRm9udE1hcDo6R2V0RGVmYXVsdEZvbnRCeUNoYXJzZXQoaW50MzJfdCBuQ2hhcnNldCkgewotICBpbnQgaSA9IDA7Ci0gIHdoaWxlIChkZWZhdWx0VFRGTWFwW2ldLmNoYXJzZXQgIT0gLTEpIHsKLSAgICBpZiAobkNoYXJzZXQgPT0gZGVmYXVsdFRURk1hcFtpXS5jaGFyc2V0KQotICAgICAgcmV0dXJuIGRlZmF1bHRUVEZNYXBbaV0uZm9udG5hbWU7Ci0gICAgKytpOwotICB9Ci0gIHJldHVybiAiIjsKLX0KLQotaW50MzJfdCBDUFdMX0ZvbnRNYXA6OkNoYXJTZXRGcm9tVW5pY29kZSh1aW50MTZfdCB3b3JkLCBpbnQzMl90IG5PbGRDaGFyc2V0KSB7Ci0gIC8vIHRvIGF2b2lkIENKSyBGb250IHRvIHNob3cgQVNDSUkKLSAgaWYgKHdvcmQgPCAweDdGKQotICAgIHJldHVybiBGWEZPTlRfQU5TSV9DSEFSU0VUOwotICAvLyBmb2xsb3cgdGhlIG9sZCBjaGFyc2V0Ci0gIGlmIChuT2xkQ2hhcnNldCAhPSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUKQotICAgIHJldHVybiBuT2xkQ2hhcnNldDsKLQotICAvLyBmaW5kIG5ldyBjaGFyc2V0Ci0gIGlmICgod29yZCA+PSAweDRFMDAgJiYgd29yZCA8PSAweDlGQTUpIHx8Ci0gICAgICAod29yZCA+PSAweEU3QzcgJiYgd29yZCA8PSAweEU3RjMpIHx8Ci0gICAgICAod29yZCA+PSAweDMwMDAgJiYgd29yZCA8PSAweDMwM0YpIHx8Ci0gICAgICAod29yZCA+PSAweDIwMDAgJiYgd29yZCA8PSAweDIwNkYpKSB7Ci0gICAgcmV0dXJuIEZYRk9OVF9HQjIzMTJfQ0hBUlNFVDsKLSAgfQotCi0gIGlmICgoKHdvcmQgPj0gMHgzMDQwKSAmJiAod29yZCA8PSAweDMwOUYpKSB8fAotICAgICAgKCh3b3JkID49IDB4MzBBMCkgJiYgKHdvcmQgPD0gMHgzMEZGKSkgfHwKLSAgICAgICgod29yZCA+PSAweDMxRjApICYmICh3b3JkIDw9IDB4MzFGRikpIHx8Ci0gICAgICAoKHdvcmQgPj0gMHhGRjAwKSAmJiAod29yZCA8PSAweEZGRUYpKSkgewotICAgIHJldHVybiBGWEZPTlRfU0hJRlRKSVNfQ0hBUlNFVDsKLSAgfQotCi0gIGlmICgoKHdvcmQgPj0gMHhBQzAwKSAmJiAod29yZCA8PSAweEQ3QUYpKSB8fAotICAgICAgKCh3b3JkID49IDB4MTEwMCkgJiYgKHdvcmQgPD0gMHgxMUZGKSkgfHwKLSAgICAgICgod29yZCA+PSAweDMxMzApICYmICh3b3JkIDw9IDB4MzE4RikpKSB7Ci0gICAgcmV0dXJuIEZYRk9OVF9IQU5HVUxfQ0hBUlNFVDsKLSAgfQotCi0gIGlmICh3b3JkID49IDB4MEUwMCAmJiB3b3JkIDw9IDB4MEU3RikKLSAgICByZXR1cm4gRlhGT05UX1RIQUlfQ0hBUlNFVDsKLQotICBpZiAoKHdvcmQgPj0gMHgwMzcwICYmIHdvcmQgPD0gMHgwM0ZGKSB8fCAod29yZCA+PSAweDFGMDAgJiYgd29yZCA8PSAweDFGRkYpKQotICAgIHJldHVybiBGWEZPTlRfR1JFRUtfQ0hBUlNFVDsKLQotICBpZiAoKHdvcmQgPj0gMHgwNjAwICYmIHdvcmQgPD0gMHgwNkZGKSB8fCAod29yZCA+PSAweEZCNTAgJiYgd29yZCA8PSAweEZFRkMpKQotICAgIHJldHVybiBGWEZPTlRfQVJBQklDX0NIQVJTRVQ7Ci0KLSAgaWYgKHdvcmQgPj0gMHgwNTkwICYmIHdvcmQgPD0gMHgwNUZGKQotICAgIHJldHVybiBGWEZPTlRfSEVCUkVXX0NIQVJTRVQ7Ci0KLSAgaWYgKHdvcmQgPj0gMHgwNDAwICYmIHdvcmQgPD0gMHgwNEZGKQotICAgIHJldHVybiBGWEZPTlRfUlVTU0lBTl9DSEFSU0VUOwotCi0gIGlmICh3b3JkID49IDB4MDEwMCAmJiB3b3JkIDw9IDB4MDI0RikKLSAgICByZXR1cm4gRlhGT05UX0VBU1RFVVJPUEVfQ0hBUlNFVDsKLQotICBpZiAod29yZCA+PSAweDFFMDAgJiYgd29yZCA8PSAweDFFRkYpCi0gICAgcmV0dXJuIEZYRk9OVF9WSUVUTkFNRVNFX0NIQVJTRVQ7Ci0KLSAgcmV0dXJuIEZYRk9OVF9BTlNJX0NIQVJTRVQ7Ci19CmRpZmYgLS1naXQgYS9mcGRmc2RrL3BkZndpbmRvdy9QV0xfRm9udE1hcC5oIGIvZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0ZvbnRNYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0ZmNkNy4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL3BkZndpbmRvdy9QV0xfRm9udE1hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZQREZTREtfUERGV0lORE9XX1BXTF9GT05UTUFQX0hfCi0jZGVmaW5lIEZQREZTREtfUERGV0lORE9XX1BXTF9GT05UTUFQX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiY29yZS9mcGRmZG9jL2lwdnRfZm9udG1hcC5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mb250LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9meGVkaXQvZnhfZWRpdC5oIgotI2luY2x1ZGUgInB1YmxpYy9mcGRmX3N5c2ZvbnRpbmZvLmgiCi0KLWNsYXNzIENQREZfRG9jdW1lbnQ7Ci1jbGFzcyBDRlhfU3lzdGVtSGFuZGxlcjsKLQotc3RydWN0IENQV0xfRm9udE1hcF9EYXRhIHsKLSAgQ1BERl9Gb250KiBwRm9udDsKLSAgaW50MzJfdCBuQ2hhcnNldDsKLSAgQ0ZYX0J5dGVTdHJpbmcgc0ZvbnROYW1lOwotfTsKLQotc3RydWN0IENQV0xfRm9udE1hcF9OYXRpdmUgewotICBpbnQzMl90IG5DaGFyc2V0OwotICBDRlhfQnl0ZVN0cmluZyBzRm9udE5hbWU7Ci19OwotCi1jbGFzcyBDUFdMX0ZvbnRNYXAgOiBwdWJsaWMgSVBWVF9Gb250TWFwIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENQV0xfRm9udE1hcChDRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpOwotICB+Q1BXTF9Gb250TWFwKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gSVBWVF9Gb250TWFwCi0gIENQREZfRm9udCogR2V0UERGRm9udChpbnQzMl90IG5Gb250SW5kZXgpIG92ZXJyaWRlOwotICBDRlhfQnl0ZVN0cmluZyBHZXRQREZGb250QWxpYXMoaW50MzJfdCBuRm9udEluZGV4KSBvdmVycmlkZTsKLSAgaW50MzJfdCBHZXRXb3JkRm9udEluZGV4KHVpbnQxNl90IHdvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRm9udEluZGV4KSBvdmVycmlkZTsKLSAgaW50MzJfdCBDaGFyQ29kZUZyb21Vbmljb2RlKGludDMyX3QgbkZvbnRJbmRleCwgdWludDE2X3Qgd29yZCkgb3ZlcnJpZGU7Ci0gIGludDMyX3QgQ2hhclNldEZyb21Vbmljb2RlKHVpbnQxNl90IHdvcmQsIGludDMyX3Qgbk9sZENoYXJzZXQpIG92ZXJyaWRlOwotCi0gIGNvbnN0IENQV0xfRm9udE1hcF9EYXRhKiBHZXRGb250TWFwRGF0YShpbnQzMl90IG5JbmRleCkgY29uc3Q7Ci0gIHN0YXRpYyBpbnQzMl90IEdldE5hdGl2ZUNoYXJzZXQoKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0TmF0aXZlRm9udE5hbWUoaW50MzJfdCBuQ2hhcnNldCk7Ci0KLSAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldERlZmF1bHRGb250QnlDaGFyc2V0KGludDMyX3QgbkNoYXJzZXQpOwotICBzdGF0aWMgY29uc3QgRlBERl9DaGFyc2V0Rm9udE1hcCBkZWZhdWx0VFRGTWFwW107Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKCk7Ci0gIHZpcnR1YWwgQ1BERl9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKTsKLSAgdmlydHVhbCBDUERGX0ZvbnQqIEZpbmRGb250U2FtZUNoYXJzZXQoQ0ZYX0J5dGVTdHJpbmcmIHNGb250QWxpYXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJzZXQpOwotICB2aXJ0dWFsIHZvaWQgQWRkZWRGb250KENQREZfRm9udCogcEZvbnQsIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzKTsKLQotICBib29sIEtub3dXb3JkKGludDMyX3QgbkZvbnRJbmRleCwgdWludDE2X3Qgd29yZCk7Ci0KLSAgdm9pZCBFbXB0eSgpOwotICBpbnQzMl90IEdldEZvbnRJbmRleChjb25zdCBDRlhfQnl0ZVN0cmluZyYgc0ZvbnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGaW5kKTsKLSAgaW50MzJfdCBBZGRGb250RGF0YShDUERGX0ZvbnQqIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzRm9udEFsaWFzLAotICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJzZXQgPSBGWEZPTlRfREVGQVVMVF9DSEFSU0VUKTsKLQotICBDRlhfQnl0ZVN0cmluZyBFbmNvZGVGb250QWxpYXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJzZXQpOwotICBDRlhfQnl0ZVN0cmluZyBFbmNvZGVGb250QWxpYXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSk7Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENQV0xfRm9udE1hcF9EYXRhPj4gbV9EYXRhOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1BXTF9Gb250TWFwX05hdGl2ZT4+IG1fTmF0aXZlRm9udDsKLQotIHByaXZhdGU6Ci0gIGludDMyX3QgRmluZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSwKLSAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFyc2V0ID0gRlhGT05UX0RFRkFVTFRfQ0hBUlNFVCk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0TmF0aXZlRm9udChpbnQzMl90IG5DaGFyc2V0KTsKLSAgQ1BERl9Gb250KiBBZGRGb250VG9Eb2N1bWVudChDUERGX0RvY3VtZW50KiBwRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBuQ2hhcnNldCk7Ci0gIGJvb2wgSXNTdGFuZGFyZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNGb250TmFtZSk7Ci0gIENQREZfRm9udCogQWRkU3RhbmRhcmRGb250KENQREZfRG9jdW1lbnQqIHBEb2MsIENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUpOwotICBDUERGX0ZvbnQqIEFkZFN5c3RlbUZvbnQoQ1BERl9Eb2N1bWVudCogcERvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzRm9udE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG5DaGFyc2V0KTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Eb2N1bWVudD4gbV9wUERGRG9jOwotICBDRlhfU3lzdGVtSGFuZGxlciogY29uc3QgbV9wU3lzdGVtSGFuZGxlcjsKLX07Ci0KLSNlbmRpZiAgLy8gRlBERlNES19QREZXSU5ET1dfUFdMX0ZPTlRNQVBfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9JY29uLmNwcCBiL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9JY29uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBkMGM3Ni4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL3BkZndpbmRvdy9QV0xfSWNvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0ljb24uaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfVXRpbHMuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfV25kLmgiCi0KLUNQV0xfSW1hZ2U6OkNQV0xfSW1hZ2UoKSA6IG1fcFBERlN0cmVhbShudWxscHRyKSB7fQotCi1DUFdMX0ltYWdlOjp+Q1BXTF9JbWFnZSgpIHt9Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfSW1hZ2U6OkdldEltYWdlQXBwU3RyZWFtKCkgewotICBDRlhfQnl0ZVRleHRCdWYgc0FwcFN0cmVhbTsKLQotICBDRlhfQnl0ZVN0cmluZyBzQWxpYXMgPSBHZXRJbWFnZUFsaWFzKCk7Ci0gIENGWF9GbG9hdFJlY3QgcmNQbGF0ZSA9IEdldENsaWVudFJlY3QoKTsKLSAgQ0ZYX01hdHJpeCBtdDsKLSAgbXQuU2V0UmV2ZXJzZShHZXRJbWFnZU1hdHJpeCgpKTsKLQotICBGWF9GTE9BVCBmSFNjYWxlID0gMS4wZjsKLSAgRlhfRkxPQVQgZlZTY2FsZSA9IDEuMGY7Ci0gIEdldFNjYWxlKGZIU2NhbGUsIGZWU2NhbGUpOwotCi0gIEZYX0ZMT0FUIGZ4ID0gMC4wZjsKLSAgRlhfRkxPQVQgZnkgPSAwLjBmOwotICBHZXRJbWFnZU9mZnNldChmeCwgZnkpOwotCi0gIGlmIChtX3BQREZTdHJlYW0gJiYgc0FsaWFzLkdldExlbmd0aCgpID4gMCkgewotICAgIHNBcHBTdHJlYW0gPDwgInFcbiI7Ci0gICAgc0FwcFN0cmVhbSA8PCByY1BsYXRlLmxlZnQgPDwgIiAiIDw8IHJjUGxhdGUuYm90dG9tIDw8ICIgIgotICAgICAgICAgICAgICAgPDwgcmNQbGF0ZS5yaWdodCAtIHJjUGxhdGUubGVmdCA8PCAiICIKLSAgICAgICAgICAgICAgIDw8IHJjUGxhdGUudG9wIC0gcmNQbGF0ZS5ib3R0b20gPDwgIiByZSBXIG5cbiI7Ci0KLSAgICBzQXBwU3RyZWFtIDw8IGZIU2NhbGUgPDwgIiAwIDAgIiA8PCBmVlNjYWxlIDw8ICIgIiA8PCByY1BsYXRlLmxlZnQgKyBmeAotICAgICAgICAgICAgICAgPDwgIiAiIDw8IHJjUGxhdGUuYm90dG9tICsgZnkgPDwgIiBjbVxuIjsKLSAgICBzQXBwU3RyZWFtIDw8IG10LmEgPDwgIiAiIDw8IG10LmIgPDwgIiAiIDw8IG10LmMgPDwgIiAiIDw8IG10LmQgPDwgIiAiCi0gICAgICAgICAgICAgICA8PCBtdC5lIDw8ICIgIiA8PCBtdC5mIDw8ICIgY21cbiI7Ci0KLSAgICBzQXBwU3RyZWFtIDw8ICIwIGcgMCBHIDEgdyAvIiA8PCBzQWxpYXMuQXNTdHJpbmdDKCkgPDwgIiBEb1xuIgotICAgICAgICAgICAgICAgPDwgIlFcbiI7Ci0gIH0KLQotICByZXR1cm4gc0FwcFN0cmVhbS5NYWtlU3RyaW5nKCk7Ci19Ci0KLXZvaWQgQ1BXTF9JbWFnZTo6U2V0UERGU3RyZWFtKENQREZfU3RyZWFtKiBwU3RyZWFtKSB7Ci0gIG1fcFBERlN0cmVhbSA9IHBTdHJlYW07Ci19Ci0KLUNQREZfU3RyZWFtKiBDUFdMX0ltYWdlOjpHZXRQREZTdHJlYW0oKSB7Ci0gIHJldHVybiBtX3BQREZTdHJlYW07Ci19Ci0KLXZvaWQgQ1BXTF9JbWFnZTo6R2V0SW1hZ2VTaXplKEZYX0ZMT0FUJiBmV2lkdGgsIEZYX0ZMT0FUJiBmSGVpZ2h0KSB7Ci0gIGZXaWR0aCA9IDAuMGY7Ci0gIGZIZWlnaHQgPSAwLjBmOwotCi0gIGlmIChtX3BQREZTdHJlYW0pIHsKLSAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcFBERlN0cmVhbS0+R2V0RGljdCgpKSB7Ci0gICAgICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBwRGljdC0+R2V0UmVjdEZvcigiQkJveCIpOwotCi0gICAgICBmV2lkdGggPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0OwotICAgICAgZkhlaWdodCA9IHJlY3QudG9wIC0gcmVjdC5ib3R0b207Ci0gICAgfQotICB9Ci19Ci0KLUNGWF9NYXRyaXggQ1BXTF9JbWFnZTo6R2V0SW1hZ2VNYXRyaXgoKSB7Ci0gIGlmIChtX3BQREZTdHJlYW0pIHsKLSAgICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcFBERlN0cmVhbS0+R2V0RGljdCgpKSB7Ci0gICAgICByZXR1cm4gcERpY3QtPkdldE1hdHJpeEZvcigiTWF0cml4Iik7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIENGWF9NYXRyaXgoKTsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9JbWFnZTo6R2V0SW1hZ2VBbGlhcygpIHsKLSAgaWYgKCFtX3NJbWFnZUFsaWFzLklzRW1wdHkoKSkKLSAgICByZXR1cm4gbV9zSW1hZ2VBbGlhczsKLQotICBpZiAobV9wUERGU3RyZWFtKSB7Ci0gICAgaWYgKENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BQREZTdHJlYW0tPkdldERpY3QoKSkgewotICAgICAgcmV0dXJuIHBEaWN0LT5HZXRTdHJpbmdGb3IoIk5hbWUiKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gQ0ZYX0J5dGVTdHJpbmcoKTsKLX0KLQotdm9pZCBDUFdMX0ltYWdlOjpTZXRJbWFnZUFsaWFzKGNvbnN0IEZYX0NIQVIqIHNJbWFnZUFsaWFzKSB7Ci0gIG1fc0ltYWdlQWxpYXMgPSBzSW1hZ2VBbGlhczsKLX0KLQotdm9pZCBDUFdMX0ltYWdlOjpHZXRTY2FsZShGWF9GTE9BVCYgZkhTY2FsZSwgRlhfRkxPQVQmIGZWU2NhbGUpIHsKLSAgZkhTY2FsZSA9IDEuMGY7Ci0gIGZWU2NhbGUgPSAxLjBmOwotfQotCi12b2lkIENQV0xfSW1hZ2U6OkdldEltYWdlT2Zmc2V0KEZYX0ZMT0FUJiB4LCBGWF9GTE9BVCYgeSkgewotICB4ID0gMC4wZjsKLSAgeSA9IDAuMGY7Ci19Ci0KLUNQV0xfSWNvbjo6Q1BXTF9JY29uKCkgOiBtX3BJY29uRml0KG51bGxwdHIpIHt9Ci0KLUNQV0xfSWNvbjo6fkNQV0xfSWNvbigpIHt9Ci0KLUNQREZfSWNvbkZpdCogQ1BXTF9JY29uOjpHZXRJY29uRml0KCkgewotICByZXR1cm4gbV9wSWNvbkZpdDsKLX0KLQotaW50MzJfdCBDUFdMX0ljb246OkdldFNjYWxlTWV0aG9kKCkgewotICBpZiAobV9wSWNvbkZpdCkKLSAgICByZXR1cm4gbV9wSWNvbkZpdC0+R2V0U2NhbGVNZXRob2QoKTsKLQotICByZXR1cm4gMDsKLX0KLQotYm9vbCBDUFdMX0ljb246OklzUHJvcG9ydGlvbmFsU2NhbGUoKSB7Ci0gIGlmIChtX3BJY29uRml0KQotICAgIHJldHVybiBtX3BJY29uRml0LT5Jc1Byb3BvcnRpb25hbFNjYWxlKCk7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIENQV0xfSWNvbjo6R2V0SWNvblBvc2l0aW9uKEZYX0ZMT0FUJiBmTGVmdCwgRlhfRkxPQVQmIGZCb3R0b20pIHsKLSAgaWYgKG1fcEljb25GaXQpIHsKLSAgICBmTGVmdCA9IDAuMGY7Ci0gICAgZkJvdHRvbSA9IDAuMGY7Ci0gICAgQ1BERl9BcnJheSogcEEgPSBtX3BJY29uRml0LT5HZXREaWN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICA/IG1fcEljb25GaXQtPkdldERpY3QoKS0+R2V0QXJyYXlGb3IoIkEiKQotICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cjsKLSAgICBpZiAocEEpIHsKLSAgICAgIHNpemVfdCBkd0NvdW50ID0gcEEtPkdldENvdW50KCk7Ci0gICAgICBpZiAoZHdDb3VudCA+IDApCi0gICAgICAgIGZMZWZ0ID0gcEEtPkdldE51bWJlckF0KDApOwotICAgICAgaWYgKGR3Q291bnQgPiAxKQotICAgICAgICBmQm90dG9tID0gcEEtPkdldE51bWJlckF0KDEpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmTGVmdCA9IDAuMGY7Ci0gICAgZkJvdHRvbSA9IDAuMGY7Ci0gIH0KLX0KLQotdm9pZCBDUFdMX0ljb246OkdldFNjYWxlKEZYX0ZMT0FUJiBmSFNjYWxlLCBGWF9GTE9BVCYgZlZTY2FsZSkgewotICBmSFNjYWxlID0gMS4wZjsKLSAgZlZTY2FsZSA9IDEuMGY7Ci0KLSAgaWYgKG1fcFBERlN0cmVhbSkgewotICAgIEZYX0ZMT0FUIGZJbWFnZVdpZHRoLCBmSW1hZ2VIZWlnaHQ7Ci0gICAgRlhfRkxPQVQgZlBsYXRlV2lkdGgsIGZQbGF0ZUhlaWdodDsKLQotICAgIENGWF9GbG9hdFJlY3QgcmNQbGF0ZSA9IEdldENsaWVudFJlY3QoKTsKLSAgICBmUGxhdGVXaWR0aCA9IHJjUGxhdGUucmlnaHQgLSByY1BsYXRlLmxlZnQ7Ci0gICAgZlBsYXRlSGVpZ2h0ID0gcmNQbGF0ZS50b3AgLSByY1BsYXRlLmJvdHRvbTsKLQotICAgIEdldEltYWdlU2l6ZShmSW1hZ2VXaWR0aCwgZkltYWdlSGVpZ2h0KTsKLQotICAgIGludDMyX3QgblNjYWxlTWV0aG9kID0gR2V0U2NhbGVNZXRob2QoKTsKLQotICAgIHN3aXRjaCAoblNjYWxlTWV0aG9kKSB7Ci0gICAgICBkZWZhdWx0OgotICAgICAgY2FzZSAwOgotICAgICAgICBmSFNjYWxlID0gZlBsYXRlV2lkdGggLyBzdGQ6Om1heChmSW1hZ2VXaWR0aCwgMS4wZik7Ci0gICAgICAgIGZWU2NhbGUgPSBmUGxhdGVIZWlnaHQgLyBzdGQ6Om1heChmSW1hZ2VIZWlnaHQsIDEuMGYpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgaWYgKGZQbGF0ZVdpZHRoIDwgZkltYWdlV2lkdGgpCi0gICAgICAgICAgZkhTY2FsZSA9IGZQbGF0ZVdpZHRoIC8gc3RkOjptYXgoZkltYWdlV2lkdGgsIDEuMGYpOwotICAgICAgICBpZiAoZlBsYXRlSGVpZ2h0IDwgZkltYWdlSGVpZ2h0KQotICAgICAgICAgIGZWU2NhbGUgPSBmUGxhdGVIZWlnaHQgLyBzdGQ6Om1heChmSW1hZ2VIZWlnaHQsIDEuMGYpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgaWYgKGZQbGF0ZVdpZHRoID4gZkltYWdlV2lkdGgpCi0gICAgICAgICAgZkhTY2FsZSA9IGZQbGF0ZVdpZHRoIC8gc3RkOjptYXgoZkltYWdlV2lkdGgsIDEuMGYpOwotICAgICAgICBpZiAoZlBsYXRlSGVpZ2h0ID4gZkltYWdlSGVpZ2h0KQotICAgICAgICAgIGZWU2NhbGUgPSBmUGxhdGVIZWlnaHQgLyBzdGQ6Om1heChmSW1hZ2VIZWlnaHQsIDEuMGYpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMzoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgRlhfRkxPQVQgZk1pblNjYWxlOwotICAgIGlmIChJc1Byb3BvcnRpb25hbFNjYWxlKCkpIHsKLSAgICAgIGZNaW5TY2FsZSA9IHN0ZDo6bWluKGZIU2NhbGUsIGZWU2NhbGUpOwotICAgICAgZkhTY2FsZSA9IGZNaW5TY2FsZTsKLSAgICAgIGZWU2NhbGUgPSBmTWluU2NhbGU7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ1BXTF9JY29uOjpHZXRJbWFnZU9mZnNldChGWF9GTE9BVCYgeCwgRlhfRkxPQVQmIHkpIHsKLSAgRlhfRkxPQVQgZkxlZnQsIGZCb3R0b207Ci0KLSAgR2V0SWNvblBvc2l0aW9uKGZMZWZ0LCBmQm90dG9tKTsKLSAgeCA9IDAuMGY7Ci0gIHkgPSAwLjBmOwotCi0gIEZYX0ZMT0FUIGZJbWFnZVdpZHRoLCBmSW1hZ2VIZWlnaHQ7Ci0gIEdldEltYWdlU2l6ZShmSW1hZ2VXaWR0aCwgZkltYWdlSGVpZ2h0KTsKLQotICBGWF9GTE9BVCBmSFNjYWxlLCBmVlNjYWxlOwotICBHZXRTY2FsZShmSFNjYWxlLCBmVlNjYWxlKTsKLQotICBGWF9GTE9BVCBmSW1hZ2VGYWN0V2lkdGggPSBmSW1hZ2VXaWR0aCAqIGZIU2NhbGU7Ci0gIEZYX0ZMT0FUIGZJbWFnZUZhY3RIZWlnaHQgPSBmSW1hZ2VIZWlnaHQgKiBmVlNjYWxlOwotCi0gIEZYX0ZMT0FUIGZQbGF0ZVdpZHRoLCBmUGxhdGVIZWlnaHQ7Ci0gIENGWF9GbG9hdFJlY3QgcmNQbGF0ZSA9IEdldENsaWVudFJlY3QoKTsKLSAgZlBsYXRlV2lkdGggPSByY1BsYXRlLnJpZ2h0IC0gcmNQbGF0ZS5sZWZ0OwotICBmUGxhdGVIZWlnaHQgPSByY1BsYXRlLnRvcCAtIHJjUGxhdGUuYm90dG9tOwotCi0gIHggPSAoZlBsYXRlV2lkdGggLSBmSW1hZ2VGYWN0V2lkdGgpICogZkxlZnQ7Ci0gIHkgPSAoZlBsYXRlSGVpZ2h0IC0gZkltYWdlRmFjdEhlaWdodCkgKiBmQm90dG9tOwotfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0ljb24uaCBiL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9JY29uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNjJkYjQuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0ljb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBGUERGU0RLX1BERldJTkRPV19QV0xfSUNPTl9IXwotI2RlZmluZSBGUERGU0RLX1BERldJTkRPV19QV0xfSUNPTl9IXwotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfV25kLmgiCi0KLWNsYXNzIENQV0xfSW1hZ2UgOiBwdWJsaWMgQ1BXTF9XbmQgewotIHB1YmxpYzoKLSAgQ1BXTF9JbWFnZSgpOwotICB+Q1BXTF9JbWFnZSgpIG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgQ0ZYX0J5dGVTdHJpbmcgR2V0SW1hZ2VBcHBTdHJlYW0oKTsKLQotICB2aXJ0dWFsIHZvaWQgR2V0U2NhbGUoRlhfRkxPQVQmIGZIU2NhbGUsIEZYX0ZMT0FUJiBmVlNjYWxlKTsKLSAgdmlydHVhbCB2b2lkIEdldEltYWdlT2Zmc2V0KEZYX0ZMT0FUJiB4LCBGWF9GTE9BVCYgeSk7Ci0gIHZpcnR1YWwgQ1BERl9TdHJlYW0qIEdldFBERlN0cmVhbSgpOwotCi0gcHVibGljOgotICB2b2lkIFNldFBERlN0cmVhbShDUERGX1N0cmVhbSogcFN0cmVhbSk7Ci0gIHZvaWQgR2V0SW1hZ2VTaXplKEZYX0ZMT0FUJiBmV2lkdGgsIEZYX0ZMT0FUJiBmSGVpZ2h0KTsKLSAgQ0ZYX01hdHJpeCBHZXRJbWFnZU1hdHJpeCgpOwotICBDRlhfQnl0ZVN0cmluZyBHZXRJbWFnZUFsaWFzKCk7Ci0gIHZvaWQgU2V0SW1hZ2VBbGlhcyhjb25zdCBGWF9DSEFSKiBzSW1hZ2VBbGlhcyk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIENQREZfU3RyZWFtKiBtX3BQREZTdHJlYW07Ci0gIENGWF9CeXRlU3RyaW5nIG1fc0ltYWdlQWxpYXM7Ci19OwotCi1jbGFzcyBDUFdMX0ljb24gOiBwdWJsaWMgQ1BXTF9JbWFnZSB7Ci0gcHVibGljOgotICBDUFdMX0ljb24oKTsKLSAgfkNQV0xfSWNvbigpIG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgQ1BERl9JY29uRml0KiBHZXRJY29uRml0KCk7Ci0KLSAgLy8gQ1BXTF9JbWFnZQotICB2b2lkIEdldFNjYWxlKEZYX0ZMT0FUJiBmSFNjYWxlLCBGWF9GTE9BVCYgZlZTY2FsZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgR2V0SW1hZ2VPZmZzZXQoRlhfRkxPQVQmIHgsIEZYX0ZMT0FUJiB5KSBvdmVycmlkZTsKLQotICBpbnQzMl90IEdldFNjYWxlTWV0aG9kKCk7Ci0gIGJvb2wgSXNQcm9wb3J0aW9uYWxTY2FsZSgpOwotICB2b2lkIEdldEljb25Qb3NpdGlvbihGWF9GTE9BVCYgZkxlZnQsIEZYX0ZMT0FUJiBmQm90dG9tKTsKLQotICB2b2lkIFNldEljb25GaXQoQ1BERl9JY29uRml0KiBwSWNvbkZpdCkgeyBtX3BJY29uRml0ID0gcEljb25GaXQ7IH0KLQotIHByaXZhdGU6Ci0gIENQREZfSWNvbkZpdCogbV9wSWNvbkZpdDsKLX07Ci0KLSNlbmRpZiAgLy8gRlBERlNES19QREZXSU5ET1dfUFdMX0lDT05fSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9MaXN0Qm94LmNwcCBiL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9MaXN0Qm94LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ5NmUyMC4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL3BkZndpbmRvdy9QV0xfTGlzdEJveC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guaCIKLQotI2luY2x1ZGUgImZwZGZzZGsvZnhlZGl0L2Z4ZXRfZWRpdC5oIgotI2luY2x1ZGUgImZwZGZzZGsvZnhlZGl0L2Z4ZXRfbGlzdC5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9FZGl0LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0VkaXRDdHJsLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX1Njcm9sbEJhci5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9VdGlscy5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9XbmQuaCIKLSNpbmNsdWRlICJwdWJsaWMvZnBkZl9md2xldmVudC5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLQotQ1BXTF9MaXN0X05vdGlmeTo6Q1BXTF9MaXN0X05vdGlmeShDUFdMX0xpc3RCb3gqIHBMaXN0KSA6IG1fcExpc3QocExpc3QpIHsKLSAgQVNTRVJUKG1fcExpc3QpOwotfQotCi1DUFdMX0xpc3RfTm90aWZ5Ojp+Q1BXTF9MaXN0X05vdGlmeSgpIHt9Ci0KLXZvaWQgQ1BXTF9MaXN0X05vdGlmeTo6SU9uU2V0U2Nyb2xsSW5mb1koRlhfRkxPQVQgZlBsYXRlTWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGxhdGVNYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZDb250ZW50TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29udGVudE1heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNtYWxsU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkJpZ1N0ZXApIHsKLSAgUFdMX1NDUk9MTF9JTkZPIEluZm87Ci0KLSAgSW5mby5mUGxhdGVXaWR0aCA9IGZQbGF0ZU1heCAtIGZQbGF0ZU1pbjsKLSAgSW5mby5mQ29udGVudE1pbiA9IGZDb250ZW50TWluOwotICBJbmZvLmZDb250ZW50TWF4ID0gZkNvbnRlbnRNYXg7Ci0gIEluZm8uZlNtYWxsU3RlcCA9IGZTbWFsbFN0ZXA7Ci0gIEluZm8uZkJpZ1N0ZXAgPSBmQmlnU3RlcDsKLQotICBtX3BMaXN0LT5Pbk5vdGlmeShtX3BMaXN0LCBQTk1fU0VUU0NST0xMSU5GTywgU0JUX1ZTQ1JPTEwsIChpbnRwdHJfdCkmSW5mbyk7Ci0KLSAgaWYgKENQV0xfU2Nyb2xsQmFyKiBwU2Nyb2xsID0gbV9wTGlzdC0+R2V0VlNjcm9sbEJhcigpKSB7Ci0gICAgaWYgKElzRmxvYXRCaWdnZXIoSW5mby5mUGxhdGVXaWR0aCwgSW5mby5mQ29udGVudE1heCAtIEluZm8uZkNvbnRlbnRNaW4pIHx8Ci0gICAgICAgIElzRmxvYXRFcXVhbChJbmZvLmZQbGF0ZVdpZHRoLCBJbmZvLmZDb250ZW50TWF4IC0gSW5mby5mQ29udGVudE1pbikpIHsKLSAgICAgIGlmIChwU2Nyb2xsLT5Jc1Zpc2libGUoKSkgewotICAgICAgICBwU2Nyb2xsLT5TZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgbV9wTGlzdC0+UmVQb3NDaGlsZFduZCgpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoIXBTY3JvbGwtPklzVmlzaWJsZSgpKSB7Ci0gICAgICAgIHBTY3JvbGwtPlNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIG1fcExpc3QtPlJlUG9zQ2hpbGRXbmQoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDUFdMX0xpc3RfTm90aWZ5OjpJT25TZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KSB7Ci0gIG1fcExpc3QtPk9uTm90aWZ5KG1fcExpc3QsIFBOTV9TRVRTQ1JPTExQT1MsIFNCVF9WU0NST0xMLCAoaW50cHRyX3QpJmZ5KTsKLX0KLQotdm9pZCBDUFdMX0xpc3RfTm90aWZ5OjpJT25JbnZhbGlkYXRlUmVjdChDRlhfRmxvYXRSZWN0KiBwUmVjdCkgewotICBtX3BMaXN0LT5JbnZhbGlkYXRlUmVjdChwUmVjdCk7Ci19Ci0KLUNQV0xfTGlzdEJveDo6Q1BXTF9MaXN0Qm94KCkKLSAgICA6IG1fcExpc3QobmV3IENGWF9MaXN0Q3RybCksCi0gICAgICBtX2JNb3VzZURvd24oZmFsc2UpLAotICAgICAgbV9iSG92ZXJTZWwoZmFsc2UpLAotICAgICAgbV9wRmlsbGVyTm90aWZ5KG51bGxwdHIpIHt9Ci0KLUNQV0xfTGlzdEJveDo6fkNQV0xfTGlzdEJveCgpIHsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9MaXN0Qm94OjpHZXRDbGFzc05hbWUoKSBjb25zdCB7Ci0gIHJldHVybiAiQ1BXTF9MaXN0Qm94IjsKLX0KLQotdm9pZCBDUFdMX0xpc3RCb3g6Ok9uQ3JlYXRlZCgpIHsKLSAgbV9wTGlzdC0+U2V0Rm9udE1hcChHZXRGb250TWFwKCkpOwotICBtX3BMaXN0Tm90aWZ5ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQV0xfTGlzdF9Ob3RpZnk+KHRoaXMpOwotICBtX3BMaXN0LT5TZXROb3RpZnkobV9wTGlzdE5vdGlmeS5nZXQoKSk7Ci0KLSAgU2V0SG92ZXJTZWwoSGFzRmxhZyhQTEJTX0hPVkVSU0VMKSk7Ci0gIG1fcExpc3QtPlNldE11bHRpcGxlU2VsKEhhc0ZsYWcoUExCU19NVUxUSVBMRVNFTCkpOwotICBtX3BMaXN0LT5TZXRGb250U2l6ZShHZXRDcmVhdGlvblBhcmFtKCkuZkZvbnRTaXplKTsKLQotICBtX2JIb3ZlclNlbCA9IEhhc0ZsYWcoUExCU19IT1ZFUlNFTCk7Ci19Ci0KLXZvaWQgQ1BXTF9MaXN0Qm94OjpPbkRlc3Ryb3koKSB7Ci0gIC8vIE1ha2Ugc3VyZSB0aGUgbm90aWZpZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IGFzIHdlIGFyZSBhYm91dCB0bwotICAvLyBkZXN0cm95IHRoZSBub3RpZmllciBhbmQgZG9uJ3Qgd2FudCB0byBsZWF2ZSBhIGRhbmdsaW5nIHBvaW50ZXIuCi0gIG1fcExpc3QtPlNldE5vdGlmeShudWxscHRyKTsKLSAgbV9wTGlzdE5vdGlmeS5yZXNldCgpOwotfQotCi12b2lkIENQV0xfTGlzdEJveDo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtKSB7Ci0gIENQV0xfV25kOjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShzQXBwU3RyZWFtKTsKLQotICBDRlhfQnl0ZVRleHRCdWYgc0xpc3RJdGVtczsKLQotICBDRlhfRmxvYXRSZWN0IHJjUGxhdGUgPSBtX3BMaXN0LT5HZXRQbGF0ZVJlY3QoKTsKLSAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fcExpc3QtPkdldENvdW50KCk7IGkgPCBzejsgaSsrKSB7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByY0l0ZW0gPSBtX3BMaXN0LT5HZXRJdGVtUmVjdChpKTsKLQotICAgIGlmIChyY0l0ZW0uYm90dG9tID4gcmNQbGF0ZS50b3AgfHwgcmNJdGVtLnRvcCA8IHJjUGxhdGUuYm90dG9tKQotICAgICAgY29udGludWU7Ci0KLSAgICBDRlhfUG9pbnRGIHB0T2Zmc2V0KHJjSXRlbS5sZWZ0LCAocmNJdGVtLnRvcCArIHJjSXRlbS5ib3R0b20pICogMC41Zik7Ci0gICAgaWYgKG1fcExpc3QtPklzSXRlbVNlbGVjdGVkKGkpKSB7Ci0gICAgICBzTGlzdEl0ZW1zIDw8IENQV0xfVXRpbHM6OkdldFJlY3RGaWxsQXBwU3RyZWFtKHJjSXRlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0RFRkFVTFRfU0VMQkFDS0NPTE9SKQotICAgICAgICAgICAgICAgICAgICAgICAgLkFzU3RyaW5nQygpOwotICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0l0ZW0gPQotICAgICAgICAgIENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0obV9wTGlzdC0+R2V0SXRlbUVkaXQoaSksIHB0T2Zmc2V0KTsKLSAgICAgIGlmIChzSXRlbS5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgc0xpc3RJdGVtcyA8PCAiQlRcbiIKLSAgICAgICAgICAgICAgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShQV0xfREVGQVVMVF9TRUxURVhUQ09MT1IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5Bc1N0cmluZ0MoKQotICAgICAgICAgICAgICAgICAgIDw8IHNJdGVtLkFzU3RyaW5nQygpIDw8ICJFVFxuIjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgQ0ZYX0J5dGVTdHJpbmcgc0l0ZW0gPQotICAgICAgICAgIENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0obV9wTGlzdC0+R2V0SXRlbUVkaXQoaSksIHB0T2Zmc2V0KTsKLSAgICAgIGlmIChzSXRlbS5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgc0xpc3RJdGVtcyA8PCAiQlRcbiIKLSAgICAgICAgICAgICAgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRUZXh0Q29sb3IoKSkuQXNTdHJpbmdDKCkKLSAgICAgICAgICAgICAgICAgICA8PCBzSXRlbS5Bc1N0cmluZ0MoKSA8PCAiRVRcbiI7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKHNMaXN0SXRlbXMuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgQ0ZYX0J5dGVUZXh0QnVmIHNDbGlwOwotICAgIENGWF9GbG9hdFJlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7Ci0KLSAgICBzQ2xpcCA8PCAicVxuIjsKLSAgICBzQ2xpcCA8PCByY0NsaWVudC5sZWZ0IDw8ICIgIiA8PCByY0NsaWVudC5ib3R0b20gPDwgIiAiCi0gICAgICAgICAgPDwgcmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0IDw8ICIgIgotICAgICAgICAgIDw8IHJjQ2xpZW50LnRvcCAtIHJjQ2xpZW50LmJvdHRvbSA8PCAiIHJlIFcgblxuIjsKLQotICAgIHNDbGlwIDw8IHNMaXN0SXRlbXMgPDwgIlFcbiI7Ci0KLSAgICBzQXBwU3RyZWFtIDw8ICIvVHggQk1DXG4iIDw8IHNDbGlwIDw8ICJFTUNcbiI7Ci0gIH0KLX0KLQotdm9pZCBDUFdMX0xpc3RCb3g6OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UpIHsKLSAgQ1BXTF9XbmQ6OkRyYXdUaGlzQXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UpOwotCi0gIENGWF9GbG9hdFJlY3QgcmNQbGF0ZSA9IG1fcExpc3QtPkdldFBsYXRlUmVjdCgpOwotICBDRlhfRmxvYXRSZWN0IHJjTGlzdCA9IEdldExpc3RSZWN0KCk7Ci0gIENGWF9GbG9hdFJlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7Ci0KLSAgZm9yIChpbnQzMl90IGkgPSAwLCBzeiA9IG1fcExpc3QtPkdldENvdW50KCk7IGkgPCBzejsgaSsrKSB7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByY0l0ZW0gPSBtX3BMaXN0LT5HZXRJdGVtUmVjdChpKTsKLSAgICBpZiAocmNJdGVtLmJvdHRvbSA+IHJjUGxhdGUudG9wIHx8IHJjSXRlbS50b3AgPCByY1BsYXRlLmJvdHRvbSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgQ0ZYX1BvaW50RiBwdE9mZnNldChyY0l0ZW0ubGVmdCwgKHJjSXRlbS50b3AgKyByY0l0ZW0uYm90dG9tKSAqIDAuNWYpOwotICAgIGlmIChDRlhfRWRpdCogcEVkaXQgPSBtX3BMaXN0LT5HZXRJdGVtRWRpdChpKSkgewotICAgICAgQ0ZYX0Zsb2F0UmVjdCByY0NvbnRlbnQgPSBwRWRpdC0+R2V0Q29udGVudFJlY3QoKTsKLSAgICAgIGlmIChyY0NvbnRlbnQuV2lkdGgoKSA+IHJjQ2xpZW50LldpZHRoKCkpCi0gICAgICAgIHJjSXRlbS5JbnRlcnNlY3QocmNMaXN0KTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmNJdGVtLkludGVyc2VjdChyY0NsaWVudCk7Ci0gICAgfQotCi0gICAgaWYgKG1fcExpc3QtPklzSXRlbVNlbGVjdGVkKGkpKSB7Ci0gICAgICBDRlhfU3lzdGVtSGFuZGxlciogcFN5c0hhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCk7Ci0gICAgICBpZiAocFN5c0hhbmRsZXIgJiYgcFN5c0hhbmRsZXItPklzU2VsZWN0aW9uSW1wbGVtZW50ZWQoKSkgewotICAgICAgICBDRlhfRWRpdDo6RHJhd0VkaXQocERldmljZSwgcFVzZXIyRGV2aWNlLCBtX3BMaXN0LT5HZXRJdGVtRWRpdChpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFRleHRDb2xvcigpLlRvRlhDb2xvcigyNTUpLCByY0xpc3QsIHB0T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgcFN5c0hhbmRsZXIsIG1fcEZvcm1GaWxsZXIpOwotICAgICAgICBwU3lzSGFuZGxlci0+T3V0cHV0U2VsZWN0ZWRSZWN0KG1fcEZvcm1GaWxsZXIsIHJjSXRlbSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0l0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKDI1NSwgMCwgNTEsIDExMykpOwotICAgICAgICBDRlhfRWRpdDo6RHJhd0VkaXQocERldmljZSwgcFVzZXIyRGV2aWNlLCBtX3BMaXN0LT5HZXRJdGVtRWRpdChpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwgcmNMaXN0LCBwdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIHBTeXNIYW5kbGVyLCBtX3BGb3JtRmlsbGVyKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgQ0ZYX1N5c3RlbUhhbmRsZXIqIHBTeXNIYW5kbGVyID0gR2V0U3lzdGVtSGFuZGxlcigpOwotICAgICAgQ0ZYX0VkaXQ6OkRyYXdFZGl0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgbV9wTGlzdC0+R2V0SXRlbUVkaXQoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgR2V0VGV4dENvbG9yKCkuVG9GWENvbG9yKDI1NSksIHJjTGlzdCwgcHRPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgcFN5c0hhbmRsZXIsIG51bGxwdHIpOwotICAgIH0KLSAgfQotfQotCi1ib29sIENQV0xfTGlzdEJveDo6T25LZXlEb3duKHVpbnQxNl90IG5DaGFyLCB1aW50MzJfdCBuRmxhZykgewotICBDUFdMX1duZDo6T25LZXlEb3duKG5DaGFyLCBuRmxhZyk7Ci0KLSAgc3dpdGNoIChuQ2hhcikgewotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgY2FzZSBGV0xfVktFWV9VcDoKLSAgICBjYXNlIEZXTF9WS0VZX0Rvd246Ci0gICAgY2FzZSBGV0xfVktFWV9Ib21lOgotICAgIGNhc2UgRldMX1ZLRVlfTGVmdDoKLSAgICBjYXNlIEZXTF9WS0VZX0VuZDoKLSAgICBjYXNlIEZXTF9WS0VZX1JpZ2h0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICBzd2l0Y2ggKG5DaGFyKSB7Ci0gICAgY2FzZSBGV0xfVktFWV9VcDoKLSAgICAgIG1fcExpc3QtPk9uVktfVVAoSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZXTF9WS0VZX0Rvd246Ci0gICAgICBtX3BMaXN0LT5PblZLX0RPV04oSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZXTF9WS0VZX0hvbWU6Ci0gICAgICBtX3BMaXN0LT5PblZLX0hPTUUoSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZXTF9WS0VZX0xlZnQ6Ci0gICAgICBtX3BMaXN0LT5PblZLX0xFRlQoSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZXTF9WS0VZX0VuZDoKLSAgICAgIG1fcExpc3QtPk9uVktfRU5EKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGV0xfVktFWV9SaWdodDoKLSAgICAgIG1fcExpc3QtPk9uVktfUklHSFQoSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZXTF9WS0VZX0RlbGV0ZToKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgYm9vbCBiRXhpdCA9IGZhbHNlOwotICBPbk5vdGlmeVNlbENoYW5nZWQodHJ1ZSwgYkV4aXQsIG5GbGFnKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDUFdMX0xpc3RCb3g6Ok9uQ2hhcih1aW50MTZfdCBuQ2hhciwgdWludDMyX3QgbkZsYWcpIHsKLSAgQ1BXTF9XbmQ6Ok9uQ2hhcihuQ2hhciwgbkZsYWcpOwotCi0gIGlmICghbV9wTGlzdC0+T25DaGFyKG5DaGFyLCBJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYm9vbCBiRXhpdCA9IGZhbHNlOwotICBPbk5vdGlmeVNlbENoYW5nZWQodHJ1ZSwgYkV4aXQsIG5GbGFnKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDUFdMX0xpc3RCb3g6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSB7Ci0gIENQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LCBuRmxhZyk7Ci0KLSAgaWYgKENsaWVudEhpdFRlc3QocG9pbnQpKSB7Ci0gICAgbV9iTW91c2VEb3duID0gdHJ1ZTsKLSAgICBTZXRGb2N1cygpOwotICAgIFNldENhcHR1cmUoKTsKLQotICAgIG1fcExpc3QtPk9uTW91c2VEb3duKHBvaW50LCBJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENQV0xfTGlzdEJveDo6T25MQnV0dG9uVXAoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSB7Ci0gIENQV0xfV25kOjpPbkxCdXR0b25VcChwb2ludCwgbkZsYWcpOwotCi0gIGlmIChtX2JNb3VzZURvd24pIHsKLSAgICBSZWxlYXNlQ2FwdHVyZSgpOwotICAgIG1fYk1vdXNlRG93biA9IGZhbHNlOwotICB9Ci0KLSAgYm9vbCBiRXhpdCA9IGZhbHNlOwotICBPbk5vdGlmeVNlbENoYW5nZWQoZmFsc2UsIGJFeGl0LCBuRmxhZyk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ1BXTF9MaXN0Qm94OjpTZXRIb3ZlclNlbChib29sIGJIb3ZlclNlbCkgewotICBtX2JIb3ZlclNlbCA9IGJIb3ZlclNlbDsKLX0KLQotYm9vbCBDUFdMX0xpc3RCb3g6Ok9uTW91c2VNb3ZlKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgewotICBDUFdMX1duZDo6T25Nb3VzZU1vdmUocG9pbnQsIG5GbGFnKTsKLQotICBpZiAobV9iSG92ZXJTZWwgJiYgIUlzQ2FwdHVyZU1vdXNlKCkgJiYgQ2xpZW50SGl0VGVzdChwb2ludCkpCi0gICAgbV9wTGlzdC0+U2VsZWN0KG1fcExpc3QtPkdldEl0ZW1JbmRleChwb2ludCkpOwotICBpZiAobV9iTW91c2VEb3duKQotICAgIG1fcExpc3QtPk9uTW91c2VNb3ZlKHBvaW50LCBJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDUFdMX0xpc3RCb3g6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB3UGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtKSB7Ci0gIENQV0xfV25kOjpPbk5vdGlmeShwV25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKLQotICBGWF9GTE9BVCBmUG9zOwotCi0gIHN3aXRjaCAobXNnKSB7Ci0gICAgY2FzZSBQTk1fU0VUU0NST0xMSU5GTzoKLSAgICAgIHN3aXRjaCAod1BhcmFtKSB7Ci0gICAgICAgIGNhc2UgU0JUX1ZTQ1JPTEw6Ci0gICAgICAgICAgaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBHZXRWU2Nyb2xsQmFyKCkpIHsKLSAgICAgICAgICAgIHBDaGlsZC0+T25Ob3RpZnkocFduZCwgUE5NX1NFVFNDUk9MTElORk8sIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBOTV9TRVRTQ1JPTExQT1M6Ci0gICAgICBzd2l0Y2ggKHdQYXJhbSkgewotICAgICAgICBjYXNlIFNCVF9WU0NST0xMOgotICAgICAgICAgIGlmIChDUFdMX1duZCogcENoaWxkID0gR2V0VlNjcm9sbEJhcigpKSB7Ci0gICAgICAgICAgICBwQ2hpbGQtPk9uTm90aWZ5KHBXbmQsIFBOTV9TRVRTQ1JPTExQT1MsIHdQYXJhbSwgbFBhcmFtKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBOTV9TQ1JPTExXSU5ET1c6Ci0gICAgICBmUG9zID0gKihGWF9GTE9BVCopbFBhcmFtOwotICAgICAgc3dpdGNoICh3UGFyYW0pIHsKLSAgICAgICAgY2FzZSBTQlRfVlNDUk9MTDoKLSAgICAgICAgICBtX3BMaXN0LT5TZXRTY3JvbGxQb3MoQ0ZYX1BvaW50RigwLCBmUG9zKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIENQV0xfTGlzdEJveDo6S2lsbEZvY3VzKCkgewotICBDUFdMX1duZDo6S2lsbEZvY3VzKCk7Ci19Ci0KLXZvaWQgQ1BXTF9MaXN0Qm94OjpSZVBvc0NoaWxkV25kKCkgewotICBDUFdMX1duZDo6UmVQb3NDaGlsZFduZCgpOwotCi0gIG1fcExpc3QtPlNldFBsYXRlUmVjdChHZXRMaXN0UmVjdCgpKTsKLX0KLQotdm9pZCBDUFdMX0xpc3RCb3g6Ok9uTm90aWZ5U2VsQ2hhbmdlZChib29sIGJLZXlEb3duLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiRXhpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWcpIHsKLSAgaWYgKCFtX3BGaWxsZXJOb3RpZnkpCi0gICAgcmV0dXJuOwotCi0gIGJvb2wgYlJDID0gdHJ1ZTsKLSAgQ0ZYX1dpZGVTdHJpbmcgc3dDaGFuZ2UgPSBHZXRUZXh0KCk7Ci0gIENGWF9XaWRlU3RyaW5nIHN0ckNoYW5nZUV4OwotICBpbnQgblNlbFN0YXJ0ID0gMDsKLSAgaW50IG5TZWxFbmQgPSBzd0NoYW5nZS5HZXRMZW5ndGgoKTsKLSAgbV9wRmlsbGVyTm90aWZ5LT5PbkJlZm9yZUtleVN0cm9rZShHZXRBdHRhY2hlZERhdGEoKSwgc3dDaGFuZ2UsIHN0ckNoYW5nZUV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5TZWxTdGFydCwgblNlbEVuZCwgYktleURvd24sIGJSQywgYkV4aXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkZsYWcpOwotfQotCi1DRlhfRmxvYXRSZWN0IENQV0xfTGlzdEJveDo6R2V0Rm9jdXNSZWN0KCkgY29uc3QgewotICBpZiAobV9wTGlzdC0+SXNNdWx0aXBsZVNlbCgpKSB7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByY0NhcmV0ID0gbV9wTGlzdC0+R2V0SXRlbVJlY3QobV9wTGlzdC0+R2V0Q2FyZXQoKSk7Ci0gICAgcmNDYXJldC5JbnRlcnNlY3QoR2V0Q2xpZW50UmVjdCgpKTsKLSAgICByZXR1cm4gcmNDYXJldDsKLSAgfQotCi0gIHJldHVybiBDUFdMX1duZDo6R2V0Rm9jdXNSZWN0KCk7Ci19Ci0KLXZvaWQgQ1BXTF9MaXN0Qm94OjpBZGRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cikgewotICBtX3BMaXN0LT5BZGRTdHJpbmcoc3RyKTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ1BXTF9MaXN0Qm94OjpHZXRUZXh0KCkgY29uc3QgewotICByZXR1cm4gbV9wTGlzdC0+R2V0VGV4dCgpOwotfQotCi12b2lkIENQV0xfTGlzdEJveDo6U2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSB7Ci0gIG1fcExpc3QtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7Ci19Ci0KLUZYX0ZMT0FUIENQV0xfTGlzdEJveDo6R2V0Rm9udFNpemUoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BMaXN0LT5HZXRGb250U2l6ZSgpOwotfQotCi12b2lkIENQV0xfTGlzdEJveDo6U2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCkgewotICBtX3BMaXN0LT5TZWxlY3Qobkl0ZW1JbmRleCk7Ci19Ci0KLXZvaWQgQ1BXTF9MaXN0Qm94OjpTZXRDYXJldChpbnQzMl90IG5JdGVtSW5kZXgpIHsKLSAgbV9wTGlzdC0+U2V0Q2FyZXQobkl0ZW1JbmRleCk7Ci19Ci0KLXZvaWQgQ1BXTF9MaXN0Qm94OjpTZXRUb3BWaXNpYmxlSW5kZXgoaW50MzJfdCBuSXRlbUluZGV4KSB7Ci0gIG1fcExpc3QtPlNldFRvcEl0ZW0obkl0ZW1JbmRleCk7Ci19Ci0KLXZvaWQgQ1BXTF9MaXN0Qm94OjpTY3JvbGxUb0xpc3RJdGVtKGludDMyX3Qgbkl0ZW1JbmRleCkgewotICBtX3BMaXN0LT5TY3JvbGxUb0xpc3RJdGVtKG5JdGVtSW5kZXgpOwotfQotCi12b2lkIENQV0xfTGlzdEJveDo6UmVzZXRDb250ZW50KCkgewotICBtX3BMaXN0LT5FbXB0eSgpOwotfQotCi12b2lkIENQV0xfTGlzdEJveDo6UmVzZXQoKSB7Ci0gIG1fcExpc3QtPkNhbmNlbCgpOwotfQotCi1ib29sIENQV0xfTGlzdEJveDo6SXNNdWx0aXBsZVNlbCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcExpc3QtPklzTXVsdGlwbGVTZWwoKTsKLX0KLQotaW50MzJfdCBDUFdMX0xpc3RCb3g6OkdldENhcmV0SW5kZXgoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BMaXN0LT5HZXRDYXJldCgpOwotfQotCi1pbnQzMl90IENQV0xfTGlzdEJveDo6R2V0Q3VyU2VsKCkgY29uc3QgewotICByZXR1cm4gbV9wTGlzdC0+R2V0U2VsZWN0KCk7Ci19Ci0KLWJvb2wgQ1BXTF9MaXN0Qm94OjpJc0l0ZW1TZWxlY3RlZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcExpc3QtPklzSXRlbVNlbGVjdGVkKG5JdGVtSW5kZXgpOwotfQotCi1pbnQzMl90IENQV0xfTGlzdEJveDo6R2V0VG9wVmlzaWJsZUluZGV4KCkgY29uc3QgewotICBtX3BMaXN0LT5TY3JvbGxUb0xpc3RJdGVtKG1fcExpc3QtPkdldEZpcnN0U2VsZWN0ZWQoKSk7Ci0gIHJldHVybiBtX3BMaXN0LT5HZXRUb3BJdGVtKCk7Ci19Ci0KLWludDMyX3QgQ1BXTF9MaXN0Qm94OjpHZXRDb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcExpc3QtPkdldENvdW50KCk7Ci19Ci0KLWludDMyX3QgQ1BXTF9MaXN0Qm94OjpGaW5kTmV4dChpbnQzMl90IG5JbmRleCwgRlhfV0NIQVIgbkNoYXIpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcExpc3QtPkZpbmROZXh0KG5JbmRleCwgbkNoYXIpOwotfQotCi1DRlhfRmxvYXRSZWN0IENQV0xfTGlzdEJveDo6R2V0Q29udGVudFJlY3QoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BMaXN0LT5HZXRDb250ZW50UmVjdCgpOwotfQotCi1GWF9GTE9BVCBDUFdMX0xpc3RCb3g6OkdldEZpcnN0SGVpZ2h0KCkgY29uc3QgewotICByZXR1cm4gbV9wTGlzdC0+R2V0Rmlyc3RIZWlnaHQoKTsKLX0KLQotQ0ZYX0Zsb2F0UmVjdCBDUFdMX0xpc3RCb3g6OkdldExpc3RSZWN0KCkgY29uc3QgewotICByZXR1cm4gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoCi0gICAgICBHZXRXaW5kb3dSZWN0KCksIChGWF9GTE9BVCkoR2V0Qm9yZGVyV2lkdGgoKSArIEdldElubmVyQm9yZGVyV2lkdGgoKSkpOwotfQotCi1ib29sIENQV0xfTGlzdEJveDo6T25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFnKSB7Ci0gIGlmICh6RGVsdGEgPCAwKQotICAgIG1fcExpc3QtPk9uVktfRE9XTihJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKLSAgZWxzZQotICAgIG1fcExpc3QtPk9uVktfVVAoSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSk7Ci0KLSAgYm9vbCBiRXhpdCA9IGZhbHNlOwotICBPbk5vdGlmeVNlbENoYW5nZWQoZmFsc2UsIGJFeGl0LCBuRmxhZyk7Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guaCBiL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9MaXN0Qm94LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MTA4YTEuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guaAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19QREZXSU5ET1dfUFdMX0xJU1RCT1hfSF8KLSNkZWZpbmUgRlBERlNES19QREZXSU5ET1dfUFdMX0xJU1RCT1hfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImZwZGZzZGsvZnhlZGl0L2Z4X2VkaXQuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfV25kLmgiCi0KLWNsYXNzIENGWF9MaXN0Q3RybDsKLWNsYXNzIENQV0xfTGlzdF9Ob3RpZnk7Ci1jbGFzcyBDUFdMX0xpc3RCb3g7Ci1jbGFzcyBJUFdMX0ZpbGxlcl9Ob3RpZnk7Ci1zdHJ1Y3QgQ1BWVF9TZWNQcm9wczsKLXN0cnVjdCBDUFZUX1dvcmRQbGFjZTsKLXN0cnVjdCBDUFZUX1dvcmRQcm9wczsKLQotY2xhc3MgQ1BXTF9MaXN0X05vdGlmeSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDUFdMX0xpc3RfTm90aWZ5KENQV0xfTGlzdEJveCogcExpc3QpOwotICB+Q1BXTF9MaXN0X05vdGlmeSgpOwotCi0gIHZvaWQgSU9uU2V0U2Nyb2xsSW5mb1koRlhfRkxPQVQgZlBsYXRlTWluLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQbGF0ZU1heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29udGVudE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29udGVudE1heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU21hbGxTdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZCaWdTdGVwKTsKLSAgdm9pZCBJT25TZXRTY3JvbGxQb3NZKEZYX0ZMT0FUIGZ5KTsKLSAgdm9pZCBJT25JbnZhbGlkYXRlUmVjdChDRlhfRmxvYXRSZWN0KiBwUmVjdCk7Ci0KLSAgdm9pZCBJT25TZXRDYXJldChib29sIGJWaXNpYmxlLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0SGVhZCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdEZvb3QsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKLQotIHByaXZhdGU6Ci0gIENQV0xfTGlzdEJveCogbV9wTGlzdDsKLX07Ci0KLWNsYXNzIENQV0xfTGlzdEJveCA6IHB1YmxpYyBDUFdMX1duZCB7Ci0gcHVibGljOgotICBDUFdMX0xpc3RCb3goKTsKLSAgfkNQV0xfTGlzdEJveCgpIG92ZXJyaWRlOwotCi0gIC8vIENQV0xfV25kCi0gIENGWF9CeXRlU3RyaW5nIEdldENsYXNzTmFtZSgpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIE9uQ3JlYXRlZCgpIG92ZXJyaWRlOwotICB2b2lkIE9uRGVzdHJveSgpIG92ZXJyaWRlOwotICB2b2lkIEdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSkgb3ZlcnJpZGU7Ci0gIHZvaWQgRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgT25LZXlEb3duKHVpbnQxNl90IG5DaGFyLCB1aW50MzJfdCBuRmxhZykgb3ZlcnJpZGU7Ci0gIGJvb2wgT25DaGFyKHVpbnQxNl90IG5DaGFyLCB1aW50MzJfdCBuRmxhZykgb3ZlcnJpZGU7Ci0gIGJvb2wgT25MQnV0dG9uRG93bihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOwotICBib29sIE9uTEJ1dHRvblVwKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgb3ZlcnJpZGU7Ci0gIGJvb2wgT25Nb3VzZU1vdmUoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKLSAgYm9vbCBPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOwotICB2b2lkIEtpbGxGb2N1cygpIG92ZXJyaWRlOwotICB2b2lkIE9uTm90aWZ5KENQV0xfV25kKiBwV25kLAotICAgICAgICAgICAgICAgIHVpbnQzMl90IG1zZywKLSAgICAgICAgICAgICAgICBpbnRwdHJfdCB3UGFyYW0gPSAwLAotICAgICAgICAgICAgICAgIGludHB0cl90IGxQYXJhbSA9IDApIG92ZXJyaWRlOwotICB2b2lkIFJlUG9zQ2hpbGRXbmQoKSBvdmVycmlkZTsKLSAgQ0ZYX0Zsb2F0UmVjdCBHZXRGb2N1c1JlY3QoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpIG92ZXJyaWRlOwotICBGWF9GTE9BVCBHZXRGb250U2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0VGV4dCgpIGNvbnN0OwotCi0gIHZvaWQgT25Ob3RpZnlTZWxDaGFuZ2VkKGJvb2wgYktleURvd24sIGJvb2wmIGJFeGl0LCB1aW50MzJfdCBuRmxhZyk7Ci0KLSAgdm9pZCBBZGRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0cik7Ci0gIHZvaWQgU2V0VG9wVmlzaWJsZUluZGV4KGludDMyX3Qgbkl0ZW1JbmRleCk7Ci0gIHZvaWQgU2Nyb2xsVG9MaXN0SXRlbShpbnQzMl90IG5JdGVtSW5kZXgpOwotICB2b2lkIFJlc2V0Q29udGVudCgpOwotICB2b2lkIFJlc2V0KCk7Ci0gIHZvaWQgU2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCk7Ci0gIHZvaWQgU2V0Q2FyZXQoaW50MzJfdCBuSXRlbUluZGV4KTsKLSAgdm9pZCBTZXRIb3ZlclNlbChib29sIGJIb3ZlclNlbCk7Ci0KLSAgaW50MzJfdCBHZXRDb3VudCgpIGNvbnN0OwotICBib29sIElzTXVsdGlwbGVTZWwoKSBjb25zdDsKLSAgaW50MzJfdCBHZXRDYXJldEluZGV4KCkgY29uc3Q7Ci0gIGludDMyX3QgR2V0Q3VyU2VsKCkgY29uc3Q7Ci0gIGJvb2wgSXNJdGVtU2VsZWN0ZWQoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKLSAgaW50MzJfdCBHZXRUb3BWaXNpYmxlSW5kZXgoKSBjb25zdDsKLSAgaW50MzJfdCBGaW5kTmV4dChpbnQzMl90IG5JbmRleCwgRlhfV0NIQVIgbkNoYXIpIGNvbnN0OwotICBDRlhfRmxvYXRSZWN0IEdldENvbnRlbnRSZWN0KCkgY29uc3Q7Ci0gIEZYX0ZMT0FUIEdldEZpcnN0SGVpZ2h0KCkgY29uc3Q7Ci0gIENGWF9GbG9hdFJlY3QgR2V0TGlzdFJlY3QoKSBjb25zdDsKLQotICB2b2lkIFNldEZpbGxlck5vdGlmeShJUFdMX0ZpbGxlcl9Ob3RpZnkqIHBOb3RpZnkpIHsKLSAgICBtX3BGaWxsZXJOb3RpZnkgPSBwTm90aWZ5OwotICB9Ci0KLSAgdm9pZCBBdHRhY2hGRkxEYXRhKENGRkxfRm9ybUZpbGxlciogcERhdGEpIHsgbV9wRm9ybUZpbGxlciA9IHBEYXRhOyB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfTGlzdEN0cmw+IG1fcExpc3Q7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDUFdMX0xpc3RfTm90aWZ5PiBtX3BMaXN0Tm90aWZ5OwotICBib29sIG1fYk1vdXNlRG93bjsKLSAgYm9vbCBtX2JIb3ZlclNlbDsKLSAgSVBXTF9GaWxsZXJfTm90aWZ5KiBtX3BGaWxsZXJOb3RpZnk7Ci0KLSBwcml2YXRlOgotICBDRkZMX0Zvcm1GaWxsZXIqIG1fcEZvcm1GaWxsZXI7ICAvLyBOb3Qgb3duZWQuCi19OwotCi0jZW5kaWYgIC8vIEZQREZTREtfUERGV0lORE9XX1BXTF9MSVNUQk9YX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmNwcCBiL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzc5OTM2Li4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE3NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmgiCi0KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3BhdGhkYXRhLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfVXRpbHMuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfV25kLmgiCi0KLVBXTF9GTE9BVFJBTkdFOjpQV0xfRkxPQVRSQU5HRSgpIHsKLSAgRGVmYXVsdCgpOwotfQotCi1QV0xfRkxPQVRSQU5HRTo6UFdMX0ZMT0FUUkFOR0UoRlhfRkxPQVQgbWluLCBGWF9GTE9BVCBtYXgpIHsKLSAgU2V0KG1pbiwgbWF4KTsKLX0KLQotdm9pZCBQV0xfRkxPQVRSQU5HRTo6RGVmYXVsdCgpIHsKLSAgZk1pbiA9IDA7Ci0gIGZNYXggPSAwOwotfQotCi12b2lkIFBXTF9GTE9BVFJBTkdFOjpTZXQoRlhfRkxPQVQgbWluLCBGWF9GTE9BVCBtYXgpIHsKLSAgaWYgKG1pbiA+IG1heCkgewotICAgIGZNaW4gPSBtYXg7Ci0gICAgZk1heCA9IG1pbjsKLSAgfSBlbHNlIHsKLSAgICBmTWluID0gbWluOwotICAgIGZNYXggPSBtYXg7Ci0gIH0KLX0KLQotYm9vbCBQV0xfRkxPQVRSQU5HRTo6SW4oRlhfRkxPQVQgeCkgY29uc3QgewotICByZXR1cm4gKElzRmxvYXRCaWdnZXIoeCwgZk1pbikgfHwgSXNGbG9hdEVxdWFsKHgsIGZNaW4pKSAmJgotICAgICAgICAgKElzRmxvYXRTbWFsbGVyKHgsIGZNYXgpIHx8IElzRmxvYXRFcXVhbCh4LCBmTWF4KSk7Ci19Ci0KLUZYX0ZMT0FUIFBXTF9GTE9BVFJBTkdFOjpHZXRXaWR0aCgpIGNvbnN0IHsKLSAgcmV0dXJuIGZNYXggLSBmTWluOwotfQotCi1QV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpQV0xfU0NST0xMX1BSSVZBVEVEQVRBKCkgewotICBEZWZhdWx0KCk7Ci19Ci0KLXZvaWQgUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6RGVmYXVsdCgpIHsKLSAgU2Nyb2xsUmFuZ2UuRGVmYXVsdCgpOwotICBmU2Nyb2xsUG9zID0gU2Nyb2xsUmFuZ2UuZk1pbjsKLSAgZkNsaWVudFdpZHRoID0gMDsKLSAgZkJpZ1N0ZXAgPSAxMDsKLSAgZlNtYWxsU3RlcCA9IDE7Ci19Ci0KLXZvaWQgUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6U2V0U2Nyb2xsUmFuZ2UoRlhfRkxPQVQgbWluLCBGWF9GTE9BVCBtYXgpIHsKLSAgU2Nyb2xsUmFuZ2UuU2V0KG1pbiwgbWF4KTsKLQotICBpZiAoSXNGbG9hdFNtYWxsZXIoZlNjcm9sbFBvcywgU2Nyb2xsUmFuZ2UuZk1pbikpCi0gICAgZlNjcm9sbFBvcyA9IFNjcm9sbFJhbmdlLmZNaW47Ci0gIGlmIChJc0Zsb2F0QmlnZ2VyKGZTY3JvbGxQb3MsIFNjcm9sbFJhbmdlLmZNYXgpKQotICAgIGZTY3JvbGxQb3MgPSBTY3JvbGxSYW5nZS5mTWF4OwotfQotCi12b2lkIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlNldENsaWVudFdpZHRoKEZYX0ZMT0FUIHdpZHRoKSB7Ci0gIGZDbGllbnRXaWR0aCA9IHdpZHRoOwotfQotCi12b2lkIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlNldFNtYWxsU3RlcChGWF9GTE9BVCBzdGVwKSB7Ci0gIGZTbWFsbFN0ZXAgPSBzdGVwOwotfQotCi12b2lkIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlNldEJpZ1N0ZXAoRlhfRkxPQVQgc3RlcCkgewotICBmQmlnU3RlcCA9IHN0ZXA7Ci19Ci0KLWJvb2wgUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6U2V0UG9zKEZYX0ZMT0FUIHBvcykgewotICBpZiAoU2Nyb2xsUmFuZ2UuSW4ocG9zKSkgewotICAgIGZTY3JvbGxQb3MgPSBwb3M7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OkFkZFNtYWxsKCkgewotICBpZiAoIVNldFBvcyhmU2Nyb2xsUG9zICsgZlNtYWxsU3RlcCkpCi0gICAgU2V0UG9zKFNjcm9sbFJhbmdlLmZNYXgpOwotfQotCi12b2lkIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OlN1YlNtYWxsKCkgewotICBpZiAoIVNldFBvcyhmU2Nyb2xsUG9zIC0gZlNtYWxsU3RlcCkpCi0gICAgU2V0UG9zKFNjcm9sbFJhbmdlLmZNaW4pOwotfQotCi12b2lkIFBXTF9TQ1JPTExfUFJJVkFURURBVEE6OkFkZEJpZygpIHsKLSAgaWYgKCFTZXRQb3MoZlNjcm9sbFBvcyArIGZCaWdTdGVwKSkKLSAgICBTZXRQb3MoU2Nyb2xsUmFuZ2UuZk1heCk7Ci19Ci0KLXZvaWQgUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6U3ViQmlnKCkgewotICBpZiAoIVNldFBvcyhmU2Nyb2xsUG9zIC0gZkJpZ1N0ZXApKQotICAgIFNldFBvcyhTY3JvbGxSYW5nZS5mTWluKTsKLX0KLQotQ1BXTF9TQkJ1dHRvbjo6Q1BXTF9TQkJ1dHRvbihQV0xfU0NST0xMQkFSX1RZUEUgZVNjcm9sbEJhclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBXTF9TQkJVVFRPTl9UWVBFIGVCdXR0b25UeXBlKSB7Ci0gIG1fZVNjcm9sbEJhclR5cGUgPSBlU2Nyb2xsQmFyVHlwZTsKLSAgbV9lU0JCdXR0b25UeXBlID0gZUJ1dHRvblR5cGU7Ci0KLSAgbV9iTW91c2VEb3duID0gZmFsc2U7Ci19Ci0KLUNQV0xfU0JCdXR0b246On5DUFdMX1NCQnV0dG9uKCkge30KLQotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9TQkJ1dHRvbjo6R2V0Q2xhc3NOYW1lKCkgY29uc3QgewotICByZXR1cm4gIkNQV0xfU0JCdXR0b24iOwotfQotCi12b2lkIENQV0xfU0JCdXR0b246Ok9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSYgY3ApIHsKLSAgY3AuZUN1cnNvclR5cGUgPSBGWENUX0FSUk9XOwotfQotCi12b2lkIENQV0xfU0JCdXR0b246OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSkgewotICBDUFdMX1duZDo6R2V0VGhpc0FwcGVhcmFuY2VTdHJlYW0oc0FwcFN0cmVhbSk7Ci0KLSAgaWYgKCFJc1Zpc2libGUoKSkKLSAgICByZXR1cm47Ci0KLSAgQ0ZYX0J5dGVUZXh0QnVmIHNCdXR0b247Ci0KLSAgQ0ZYX0Zsb2F0UmVjdCByZWN0V25kID0gR2V0V2luZG93UmVjdCgpOwotCi0gIGlmIChyZWN0V25kLklzRW1wdHkoKSkKLSAgICByZXR1cm47Ci0KLSAgc0FwcFN0cmVhbSA8PCAicVxuIjsKLQotICBDRlhfUG9pbnRGIHB0Q2VudGVyID0gR2V0Q2VudGVyUG9pbnQoKTsKLQotICBzd2l0Y2ggKG1fZVNjcm9sbEJhclR5cGUpIHsKLSAgICBjYXNlIFNCVF9IU0NST0xMOgotICAgICAgc3dpdGNoIChtX2VTQkJ1dHRvblR5cGUpIHsKLSAgICAgICAgY2FzZSBQU0JUX01JTjogewotICAgICAgICAgIENGWF9Qb2ludEYgcHQxKHB0Q2VudGVyLnggLSBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYsIHB0Q2VudGVyLnkpOwotICAgICAgICAgIENGWF9Qb2ludEYgcHQyKHB0Q2VudGVyLnggKyBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHRDZW50ZXIueSArIFBXTF9UUklBTkdMRV9IQUxGTEVOKTsKLSAgICAgICAgICBDRlhfUG9pbnRGIHB0MyhwdENlbnRlci54ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLAotICAgICAgICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgLSBQV0xfVFJJQU5HTEVfSEFMRkxFTik7Ci0KLSAgICAgICAgICBpZiAocmVjdFduZC5yaWdodCAtIHJlY3RXbmQubGVmdCA+IFBXTF9UUklBTkdMRV9IQUxGTEVOICogMiAmJgotICAgICAgICAgICAgICByZWN0V25kLnRvcCAtIHJlY3RXbmQuYm90dG9tID4gUFdMX1RSSUFOR0xFX0hBTEZMRU4pIHsKLSAgICAgICAgICAgIHNCdXR0b24gPDwgIjAgZ1xuIjsKLSAgICAgICAgICAgIHNCdXR0b24gPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbVxuIjsKLSAgICAgICAgICAgIHNCdXR0b24gPDwgcHQyLnggPDwgIiAiIDw8IHB0Mi55IDw8ICIgbFxuIjsKLSAgICAgICAgICAgIHNCdXR0b24gPDwgcHQzLnggPDwgIiAiIDw8IHB0My55IDw8ICIgbFxuIjsKLSAgICAgICAgICAgIHNCdXR0b24gPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbCBmXG4iOwotCi0gICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNCdXR0b247Ci0gICAgICAgICAgfQotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFBTQlRfTUFYOiB7Ci0gICAgICAgICAgQ0ZYX1BvaW50RiBwdDEocHRDZW50ZXIueCArIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41ZiwgcHRDZW50ZXIueSk7Ci0gICAgICAgICAgQ0ZYX1BvaW50RiBwdDIocHRDZW50ZXIueCAtIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwdENlbnRlci55ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4pOwotICAgICAgICAgIENGWF9Qb2ludEYgcHQzKHB0Q2VudGVyLnggLSBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHRDZW50ZXIueSAtIFBXTF9UUklBTkdMRV9IQUxGTEVOKTsKLQotICAgICAgICAgIGlmIChyZWN0V25kLnJpZ2h0IC0gcmVjdFduZC5sZWZ0ID4gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAyICYmCi0gICAgICAgICAgICAgIHJlY3RXbmQudG9wIC0gcmVjdFduZC5ib3R0b20gPiBQV0xfVFJJQU5HTEVfSEFMRkxFTikgewotICAgICAgICAgICAgc0J1dHRvbiA8PCAiMCBnXG4iOwotICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBtXG4iOwotICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDIueCA8PCAiICIgPDwgcHQyLnkgPDwgIiBsXG4iOwotICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiBsXG4iOwotICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBsIGZcbiI7Ci0KLSAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0J1dHRvbjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNCVF9WU0NST0xMOgotICAgICAgc3dpdGNoIChtX2VTQkJ1dHRvblR5cGUpIHsKLSAgICAgICAgY2FzZSBQU0JUX01JTjogewotICAgICAgICAgIENGWF9Qb2ludEYgcHQxKHB0Q2VudGVyLnggLSBQV0xfVFJJQU5HTEVfSEFMRkxFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwdENlbnRlci55IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKLSAgICAgICAgICBDRlhfUG9pbnRGIHB0MihwdENlbnRlci54ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHRDZW50ZXIueSAtIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7Ci0gICAgICAgICAgQ0ZYX1BvaW50RiBwdDMocHRDZW50ZXIueCwgcHRDZW50ZXIueSArIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41Zik7Ci0KLSAgICAgICAgICBpZiAocmVjdFduZC5yaWdodCAtIHJlY3RXbmQubGVmdCA+IFBXTF9UUklBTkdMRV9IQUxGTEVOICogMiAmJgotICAgICAgICAgICAgICByZWN0V25kLnRvcCAtIHJlY3RXbmQuYm90dG9tID4gUFdMX1RSSUFOR0xFX0hBTEZMRU4pIHsKLSAgICAgICAgICAgIHNCdXR0b24gPDwgIjAgZ1xuIjsKLSAgICAgICAgICAgIHNCdXR0b24gPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbVxuIjsKLSAgICAgICAgICAgIHNCdXR0b24gPDwgcHQyLnggPDwgIiAiIDw8IHB0Mi55IDw8ICIgbFxuIjsKLSAgICAgICAgICAgIHNCdXR0b24gPDwgcHQzLnggPDwgIiAiIDw8IHB0My55IDw8ICIgbFxuIjsKLSAgICAgICAgICAgIHNCdXR0b24gPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbCBmXG4iOwotCi0gICAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNCdXR0b247Ci0gICAgICAgICAgfQotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlIFBTQlRfTUFYOiB7Ci0gICAgICAgICAgQ0ZYX1BvaW50RiBwdDEocHRDZW50ZXIueCAtIFBXTF9UUklBTkdMRV9IQUxGTEVOLAotICAgICAgICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgKyBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDAuNWYpOwotICAgICAgICAgIENGWF9Qb2ludEYgcHQyKHB0Q2VudGVyLnggKyBQV0xfVFJJQU5HTEVfSEFMRkxFTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwdENlbnRlci55ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKLSAgICAgICAgICBDRlhfUG9pbnRGIHB0MyhwdENlbnRlci54LCBwdENlbnRlci55IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmKTsKLQotICAgICAgICAgIGlmIChyZWN0V25kLnJpZ2h0IC0gcmVjdFduZC5sZWZ0ID4gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAyICYmCi0gICAgICAgICAgICAgIHJlY3RXbmQudG9wIC0gcmVjdFduZC5ib3R0b20gPiBQV0xfVFJJQU5HTEVfSEFMRkxFTikgewotICAgICAgICAgICAgc0J1dHRvbiA8PCAiMCBnXG4iOwotICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBtXG4iOwotICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDIueCA8PCAiICIgPDwgcHQyLnkgPDwgIiBsXG4iOwotICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiBsXG4iOwotICAgICAgICAgICAgc0J1dHRvbiA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgPDwgIiBsIGZcbiI7Ci0KLSAgICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0J1dHRvbjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICBzQXBwU3RyZWFtIDw8ICJRXG4iOwotfQotCi12b2lkIENQV0xfU0JCdXR0b246OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKSB7Ci0gIGlmICghSXNWaXNpYmxlKCkpCi0gICAgcmV0dXJuOwotCi0gIENGWF9GbG9hdFJlY3QgcmVjdFduZCA9IEdldFdpbmRvd1JlY3QoKTsKLSAgaWYgKHJlY3RXbmQuSXNFbXB0eSgpKQotICAgIHJldHVybjsKLQotICBDRlhfUG9pbnRGIHB0Q2VudGVyID0gR2V0Q2VudGVyUG9pbnQoKTsKLSAgaW50MzJfdCBuVHJhbnNwYXJlbmN5ID0gR2V0VHJhbnNwYXJlbmN5KCk7Ci0KLSAgc3dpdGNoIChtX2VTY3JvbGxCYXJUeXBlKSB7Ci0gICAgY2FzZSBTQlRfSFNDUk9MTDoKLSAgICAgIENQV0xfV25kOjpEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlKTsKLSAgICAgIHN3aXRjaCAobV9lU0JCdXR0b25UeXBlKSB7Ci0gICAgICAgIGNhc2UgUFNCVF9NSU46IHsKLSAgICAgICAgICBDRlhfUG9pbnRGIHB0MShwdENlbnRlci54IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLCBwdENlbnRlci55KTsKLSAgICAgICAgICBDRlhfUG9pbnRGIHB0MihwdENlbnRlci54ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLAotICAgICAgICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgKyBQV0xfVFJJQU5HTEVfSEFMRkxFTik7Ci0gICAgICAgICAgQ0ZYX1BvaW50RiBwdDMocHRDZW50ZXIueCArIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwdENlbnRlci55IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4pOwotCi0gICAgICAgICAgaWYgKHJlY3RXbmQucmlnaHQgLSByZWN0V25kLmxlZnQgPiBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDIgJiYKLSAgICAgICAgICAgICAgcmVjdFduZC50b3AgLSByZWN0V25kLmJvdHRvbSA+IFBXTF9UUklBTkdMRV9IQUxGTEVOKSB7Ci0gICAgICAgICAgICBDRlhfUGF0aERhdGEgcGF0aDsKLSAgICAgICAgICAgIHBhdGguQXBwZW5kUG9pbnQocHQxLCBGWFBUX1RZUEU6Ok1vdmVUbywgZmFsc2UpOwotICAgICAgICAgICAgcGF0aC5BcHBlbmRQb2ludChwdDIsIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7Ci0gICAgICAgICAgICBwYXRoLkFwcGVuZFBvaW50KHB0MywgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKLSAgICAgICAgICAgIHBhdGguQXBwZW5kUG9pbnQocHQxLCBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOwotCi0gICAgICAgICAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUi5Ub0ZYQ29sb3IoblRyYW5zcGFyZW5jeSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBGWEZJTExfQUxURVJOQVRFKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNCVF9NQVg6IHsKLSAgICAgICAgICBDRlhfUG9pbnRGIHB0MShwdENlbnRlci54ICsgUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLCBwdENlbnRlci55KTsKLSAgICAgICAgICBDRlhfUG9pbnRGIHB0MihwdENlbnRlci54IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4gKiAwLjVmLAotICAgICAgICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgKyBQV0xfVFJJQU5HTEVfSEFMRkxFTik7Ci0gICAgICAgICAgQ0ZYX1BvaW50RiBwdDMocHRDZW50ZXIueCAtIFBXTF9UUklBTkdMRV9IQUxGTEVOICogMC41ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwdENlbnRlci55IC0gUFdMX1RSSUFOR0xFX0hBTEZMRU4pOwotCi0gICAgICAgICAgaWYgKHJlY3RXbmQucmlnaHQgLSByZWN0V25kLmxlZnQgPiBQV0xfVFJJQU5HTEVfSEFMRkxFTiAqIDIgJiYKLSAgICAgICAgICAgICAgcmVjdFduZC50b3AgLSByZWN0V25kLmJvdHRvbSA+IFBXTF9UUklBTkdMRV9IQUxGTEVOKSB7Ci0gICAgICAgICAgICBDRlhfUGF0aERhdGEgcGF0aDsKLSAgICAgICAgICAgIHBhdGguQXBwZW5kUG9pbnQocHQxLCBGWFBUX1RZUEU6Ok1vdmVUbywgZmFsc2UpOwotICAgICAgICAgICAgcGF0aC5BcHBlbmRQb2ludChwdDIsIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7Ci0gICAgICAgICAgICBwYXRoLkFwcGVuZFBvaW50KHB0MywgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKLSAgICAgICAgICAgIHBhdGguQXBwZW5kUG9pbnQocHQxLCBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOwotCi0gICAgICAgICAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUi5Ub0ZYQ29sb3IoblRyYW5zcGFyZW5jeSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBGWEZJTExfQUxURVJOQVRFKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNCVF9WU0NST0xMOgotICAgICAgc3dpdGNoIChtX2VTQkJ1dHRvblR5cGUpIHsKLSAgICAgICAgY2FzZSBQU0JUX01JTjogewotICAgICAgICAgIC8vIGRyYXcgYm9yZGVyCi0gICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByY0RyYXcgPSByZWN0V25kOwotICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyZW5jeSwgMTAwLCAxMDAsIDEwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wZik7Ci0KLSAgICAgICAgICAvLyBkcmF3IGlubmVyIGJvcmRlcgotICAgICAgICAgIHJjRHJhdyA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3RXbmQsIDAuNWYpOwotICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyZW5jeSwgMjU1LCAyNTUsIDI1NSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZik7Ci0KLSAgICAgICAgICAvLyBkcmF3IGJhY2tncm91bmQKLQotICAgICAgICAgIHJjRHJhdyA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3RXbmQsIDEuMGYpOwotCi0gICAgICAgICAgaWYgKElzRW5hYmxlZCgpKQotICAgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd1NoYWRvdyhwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHRydWUsIGZhbHNlLCByY0RyYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5UcmFuc3BhcmVuY3ksIDgwLCAyMjApOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSkpOwotCi0gICAgICAgICAgLy8gZHJhdyBhcnJvdwotCi0gICAgICAgICAgaWYgKHJlY3RXbmQudG9wIC0gcmVjdFduZC5ib3R0b20gPiA2LjBmKSB7Ci0gICAgICAgICAgICBGWF9GTE9BVCBmWCA9IHJlY3RXbmQubGVmdCArIDEuNWY7Ci0gICAgICAgICAgICBGWF9GTE9BVCBmWSA9IHJlY3RXbmQuYm90dG9tOwotICAgICAgICAgICAgQ0ZYX1BvaW50RiBwdHNbN10gPSB7Q0ZYX1BvaW50RihmWCArIDIuNWYsIGZZICsgNC4wZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGKGZYICsgMi41ZiwgZlkgKyAzLjBmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYoZlggKyA0LjVmLCBmWSArIDUuMGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RihmWCArIDYuNWYsIGZZICsgMy4wZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGKGZYICsgNi41ZiwgZlkgKyA0LjBmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYoZlggKyA0LjVmLCBmWSArIDYuMGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RihmWCArIDIuNWYsIGZZICsgNC4wZil9OwotCi0gICAgICAgICAgICBpZiAoSXNFbmFibGVkKCkpCi0gICAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdGaWxsQXJlYSgKLSAgICAgICAgICAgICAgICAgIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRzLCA3LAotICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJlbmN5LCAyNTUsIDI1NSwgMjU1KSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdGaWxsQXJlYSgKLSAgICAgICAgICAgICAgICAgIHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRzLCA3LAotICAgICAgICAgICAgICAgICAgUFdMX0RFRkFVTFRfSEVBVllHUkFZQ09MT1IuVG9GWENvbG9yKDI1NSkpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBQU0JUX01BWDogewotICAgICAgICAgIC8vIGRyYXcgYm9yZGVyCi0gICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByY0RyYXcgPSByZWN0V25kOwotICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyZW5jeSwgMTAwLCAxMDAsIDEwMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wZik7Ci0KLSAgICAgICAgICAvLyBkcmF3IGlubmVyIGJvcmRlcgotICAgICAgICAgIHJjRHJhdyA9IENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3RXbmQsIDAuNWYpOwotICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyZW5jeSwgMjU1LCAyNTUsIDI1NSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZik7Ci0KLSAgICAgICAgICAvLyBkcmF3IGJhY2tncm91bmQKLSAgICAgICAgICByY0RyYXcgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0V25kLCAxLjBmKTsKLSAgICAgICAgICBpZiAoSXNFbmFibGVkKCkpCi0gICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3U2hhZG93KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgdHJ1ZSwgZmFsc2UsIHJjRHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblRyYW5zcGFyZW5jeSwgODAsIDIyMCk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmNEcmF3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSk7Ci0KLSAgICAgICAgICAvLyBkcmF3IGFycm93Ci0KLSAgICAgICAgICBpZiAocmVjdFduZC50b3AgLSByZWN0V25kLmJvdHRvbSA+IDYuMGYpIHsKLSAgICAgICAgICAgIEZYX0ZMT0FUIGZYID0gcmVjdFduZC5sZWZ0ICsgMS41ZjsKLSAgICAgICAgICAgIEZYX0ZMT0FUIGZZID0gcmVjdFduZC5ib3R0b207Ci0KLSAgICAgICAgICAgIENGWF9Qb2ludEYgcHRzWzddID0ge0NGWF9Qb2ludEYoZlggKyAyLjVmLCBmWSArIDUuMGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RihmWCArIDIuNWYsIGZZICsgNi4wZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGKGZYICsgNC41ZiwgZlkgKyA0LjBmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYoZlggKyA2LjVmLCBmWSArIDYuMGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RihmWCArIDYuNWYsIGZZICsgNS4wZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGKGZYICsgNC41ZiwgZlkgKyAzLjBmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYoZlggKyAyLjVmLCBmWSArIDUuMGYpfTsKLQotICAgICAgICAgICAgaWYgKElzRW5hYmxlZCgpKQotICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3RmlsbEFyZWEoCi0gICAgICAgICAgICAgICAgICBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0cywgNywKLSAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyZW5jeSwgMjU1LCAyNTUsIDI1NSkpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3RmlsbEFyZWEoCi0gICAgICAgICAgICAgICAgICBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHB0cywgNywKLSAgICAgICAgICAgICAgICAgIFBXTF9ERUZBVUxUX0hFQVZZR1JBWUNPTE9SLlRvRlhDb2xvcigyNTUpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgUFNCVF9QT1M6IHsKLSAgICAgICAgICAvLyBkcmF3IGJvcmRlcgotICAgICAgICAgIENGWF9GbG9hdFJlY3QgcmNEcmF3ID0gcmVjdFduZDsKLSAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKG5UcmFuc3BhcmVuY3ksIDEwMCwgMTAwLCAxMDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMGYpOwotCi0gICAgICAgICAgLy8gZHJhdyBpbm5lciBib3JkZXIKLSAgICAgICAgICByY0RyYXcgPSBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0V25kLCAwLjVmKTsKLSAgICAgICAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKG5UcmFuc3BhcmVuY3ksIDI1NSwgMjU1LCAyNTUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYpOwotCi0gICAgICAgICAgaWYgKElzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAvLyBkcmF3IHNoYWRvdyBlZmZlY3QKLQotICAgICAgICAgICAgQ0ZYX1BvaW50RiBwdFRvcCA9IENGWF9Qb2ludEYocmVjdFduZC5sZWZ0LCByZWN0V25kLnRvcCAtIDEuMGYpOwotICAgICAgICAgICAgQ0ZYX1BvaW50RiBwdEJvdHRvbSA9Ci0gICAgICAgICAgICAgICAgQ0ZYX1BvaW50RihyZWN0V25kLmxlZnQsIHJlY3RXbmQuYm90dG9tICsgMS4wZik7Ci0KLSAgICAgICAgICAgIHB0VG9wLnggKz0gMS41ZjsKLSAgICAgICAgICAgIHB0Qm90dG9tLnggKz0gMS41ZjsKLQotICAgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKG5UcmFuc3BhcmVuY3ksIDIxMCwgMjEwLCAyMTApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZik7Ci0KLSAgICAgICAgICAgIHB0VG9wLnggKz0gMS4wZjsKLSAgICAgICAgICAgIHB0Qm90dG9tLnggKz0gMS4wZjsKLQotICAgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKG5UcmFuc3BhcmVuY3ksIDIyMCwgMjIwLCAyMjApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZik7Ci0KLSAgICAgICAgICAgIHB0VG9wLnggKz0gMS4wZjsKLSAgICAgICAgICAgIHB0Qm90dG9tLnggKz0gMS4wZjsKLQotICAgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKG5UcmFuc3BhcmVuY3ksIDI0MCwgMjQwLCAyNDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZik7Ci0KLSAgICAgICAgICAgIHB0VG9wLnggKz0gMS4wZjsKLSAgICAgICAgICAgIHB0Qm90dG9tLnggKz0gMS4wZjsKLQotICAgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKG5UcmFuc3BhcmVuY3ksIDI0MCwgMjQwLCAyNDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZik7Ci0KLSAgICAgICAgICAgIHB0VG9wLnggKz0gMS4wZjsKLSAgICAgICAgICAgIHB0Qm90dG9tLnggKz0gMS4wZjsKLQotICAgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKG5UcmFuc3BhcmVuY3ksIDIxMCwgMjEwLCAyMTApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZik7Ci0KLSAgICAgICAgICAgIHB0VG9wLnggKz0gMS4wZjsKLSAgICAgICAgICAgIHB0Qm90dG9tLnggKz0gMS4wZjsKLQotICAgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKG5UcmFuc3BhcmVuY3ksIDE4MCwgMTgwLCAxODApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZik7Ci0KLSAgICAgICAgICAgIHB0VG9wLnggKz0gMS4wZjsKLSAgICAgICAgICAgIHB0Qm90dG9tLnggKz0gMS4wZjsKLQotICAgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKG5UcmFuc3BhcmVuY3ksIDE1MCwgMTUwLCAxNTApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZik7Ci0KLSAgICAgICAgICAgIHB0VG9wLnggKz0gMS4wZjsKLSAgICAgICAgICAgIHB0Qm90dG9tLnggKz0gMS4wZjsKLQotICAgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKG5UcmFuc3BhcmVuY3ksIDE1MCwgMTUwLCAxNTApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZik7Ci0KLSAgICAgICAgICAgIHB0VG9wLnggKz0gMS4wZjsKLSAgICAgICAgICAgIHB0Qm90dG9tLnggKz0gMS4wZjsKLQotICAgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKG5UcmFuc3BhcmVuY3ksIDE4MCwgMTgwLCAxODApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZik7Ci0KLSAgICAgICAgICAgIHB0VG9wLnggKz0gMS4wZjsKLSAgICAgICAgICAgIHB0Qm90dG9tLnggKz0gMS4wZjsKLQotICAgICAgICAgICAgQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUocERldmljZSwgcFVzZXIyRGV2aWNlLCBwdFRvcCwgcHRCb3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKG5UcmFuc3BhcmVuY3ksIDIxMCwgMjEwLCAyMTApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4wZik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJjRHJhdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdiRW5jb2RlKDI1NSwgMjU1LCAyNTUsIDI1NSkpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIGRyYXcgZnJpY3Rpb24KLQotICAgICAgICAgIGlmIChyZWN0V25kLkhlaWdodCgpID4gOC4wZikgewotICAgICAgICAgICAgRlhfQ09MT1JSRUYgY3JTdHJva2UgPSBBcmdiRW5jb2RlKG5UcmFuc3BhcmVuY3ksIDEyMCwgMTIwLCAxMjApOwotICAgICAgICAgICAgaWYgKCFJc0VuYWJsZWQoKSkKLSAgICAgICAgICAgICAgY3JTdHJva2UgPSBQV0xfREVGQVVMVF9IRUFWWUdSQVlDT0xPUi5Ub0ZYQ29sb3IoMjU1KTsKLQotICAgICAgICAgICAgRlhfRkxPQVQgbkZyaWN0aW9uV2lkdGggPSA1LjBmOwotICAgICAgICAgICAgRlhfRkxPQVQgbkZyaWN0aW9uSGVpZ2h0ID0gNS41ZjsKLQotICAgICAgICAgICAgQ0ZYX1BvaW50RiBwdExlZnQgPQotICAgICAgICAgICAgICAgIENGWF9Qb2ludEYocHRDZW50ZXIueCAtIG5GcmljdGlvbldpZHRoIC8gMi4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgLSBuRnJpY3Rpb25IZWlnaHQgLyAyLjBmICsgMC41Zik7Ci0gICAgICAgICAgICBDRlhfUG9pbnRGIHB0UmlnaHQgPQotICAgICAgICAgICAgICAgIENGWF9Qb2ludEYocHRDZW50ZXIueCArIG5GcmljdGlvbldpZHRoIC8gMi4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgLSBuRnJpY3Rpb25IZWlnaHQgLyAyLjBmICsgMC41Zik7Ci0KLSAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRMZWZ0LCBwdFJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JTdHJva2UsIDEuMGYpOwotCi0gICAgICAgICAgICBwdExlZnQueSArPSAyLjBmOwotICAgICAgICAgICAgcHRSaWdodC55ICs9IDIuMGY7Ci0KLSAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRMZWZ0LCBwdFJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JTdHJva2UsIDEuMGYpOwotCi0gICAgICAgICAgICBwdExlZnQueSArPSAyLjBmOwotICAgICAgICAgICAgcHRSaWdodC55ICs9IDIuMGY7Ci0KLSAgICAgICAgICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcHRMZWZ0LCBwdFJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JTdHJva2UsIDEuMGYpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotfQotCi1ib29sIENQV0xfU0JCdXR0b246Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSB7Ci0gIENQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LCBuRmxhZyk7Ci0KLSAgaWYgKENQV0xfV25kKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpCi0gICAgcFBhcmVudC0+T25Ob3RpZnkodGhpcywgUE5NX0xCVVRUT05ET1dOLCAwLCAoaW50cHRyX3QpJnBvaW50KTsKLQotICBtX2JNb3VzZURvd24gPSB0cnVlOwotICBTZXRDYXB0dXJlKCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1BXTF9TQkJ1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSB7Ci0gIENQV0xfV25kOjpPbkxCdXR0b25VcChwb2ludCwgbkZsYWcpOwotCi0gIGlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQotICAgIHBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsIFBOTV9MQlVUVE9OVVAsIDAsIChpbnRwdHJfdCkmcG9pbnQpOwotCi0gIG1fYk1vdXNlRG93biA9IGZhbHNlOwotICBSZWxlYXNlQ2FwdHVyZSgpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENQV0xfU0JCdXR0b246Ok9uTW91c2VNb3ZlKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgewotICBDUFdMX1duZDo6T25Nb3VzZU1vdmUocG9pbnQsIG5GbGFnKTsKLQotICBpZiAoQ1BXTF9XbmQqIHBQYXJlbnQgPSBHZXRQYXJlbnRXaW5kb3coKSkgewotICAgIHBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsIFBOTV9NT1VTRU1PVkUsIDAsIChpbnRwdHJfdCkmcG9pbnQpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUNQV0xfU2Nyb2xsQmFyOjpDUFdMX1Njcm9sbEJhcihQV0xfU0NST0xMQkFSX1RZUEUgc2JUeXBlKQotICAgIDogbV9zYlR5cGUoc2JUeXBlKSwKLSAgICAgIG1fcE1pbkJ1dHRvbihudWxscHRyKSwKLSAgICAgIG1fcE1heEJ1dHRvbihudWxscHRyKSwKLSAgICAgIG1fcFBvc0J1dHRvbihudWxscHRyKSwKLSAgICAgIG1fYk1vdXNlRG93bihmYWxzZSksCi0gICAgICBtX2JNaW5Pck1heChmYWxzZSksCi0gICAgICBtX2JOb3RpZnlGb3JldmVyKHRydWUpIHt9Ci0KLUNQV0xfU2Nyb2xsQmFyOjp+Q1BXTF9TY3JvbGxCYXIoKSB7fQotCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1Njcm9sbEJhcjo6R2V0Q2xhc3NOYW1lKCkgY29uc3QgewotICByZXR1cm4gIkNQV0xfU2Nyb2xsQmFyIjsKLX0KLQotdm9pZCBDUFdMX1Njcm9sbEJhcjo6T25DcmVhdGUoUFdMX0NSRUFURVBBUkFNJiBjcCkgewotICBjcC5lQ3Vyc29yVHlwZSA9IEZYQ1RfQVJST1c7Ci19Ci0KLXZvaWQgQ1BXTF9TY3JvbGxCYXI6OlJlUG9zQ2hpbGRXbmQoKSB7Ci0gIENGWF9GbG9hdFJlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7Ci0gIENGWF9GbG9hdFJlY3QgcmNNaW5CdXR0b24sIHJjTWF4QnV0dG9uOwotICBGWF9GTE9BVCBmQldpZHRoID0gMDsKLQotICBzd2l0Y2ggKG1fc2JUeXBlKSB7Ci0gICAgY2FzZSBTQlRfSFNDUk9MTDoKLSAgICAgIGlmIChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQgPgotICAgICAgICAgIFBXTF9TQ1JPTExCQVJfQlVUVE9OX1dJRFRIICogMiArIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIICsKLSAgICAgICAgICAgICAgMikgewotICAgICAgICByY01pbkJ1dHRvbiA9IENGWF9GbG9hdFJlY3QocmNDbGllbnQubGVmdCwgcmNDbGllbnQuYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQubGVmdCArIFBXTF9TQ1JPTExCQVJfQlVUVE9OX1dJRFRILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQudG9wKTsKLSAgICAgICAgcmNNYXhCdXR0b24gPQotICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdChyY0NsaWVudC5yaWdodCAtIFBXTF9TQ1JPTExCQVJfQlVUVE9OX1dJRFRILAotICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5ib3R0b20sIHJjQ2xpZW50LnJpZ2h0LCByY0NsaWVudC50b3ApOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZkJXaWR0aCA9IChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQgLQotICAgICAgICAgICAgICAgICAgIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIIC0gMikgLwotICAgICAgICAgICAgICAgICAgMjsKLQotICAgICAgICBpZiAoZkJXaWR0aCA+IDApIHsKLSAgICAgICAgICByY01pbkJ1dHRvbiA9IENGWF9GbG9hdFJlY3QocmNDbGllbnQubGVmdCwgcmNDbGllbnQuYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5sZWZ0ICsgZkJXaWR0aCwgcmNDbGllbnQudG9wKTsKLSAgICAgICAgICByY01heEJ1dHRvbiA9IENGWF9GbG9hdFJlY3QocmNDbGllbnQucmlnaHQgLSBmQldpZHRoLCByY0NsaWVudC5ib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LnJpZ2h0LCByY0NsaWVudC50b3ApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFNldFZpc2libGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNCVF9WU0NST0xMOgotICAgICAgaWYgKElzRmxvYXRCaWdnZXIocmNDbGllbnQudG9wIC0gcmNDbGllbnQuYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgUFdMX1NDUk9MTEJBUl9CVVRUT05fV0lEVEggKiAyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQV0xfU0NST0xMQkFSX1BPU0JVVFRPTl9NSU5XSURUSCArIDIpKSB7Ci0gICAgICAgIHJjTWluQnV0dG9uID0gQ0ZYX0Zsb2F0UmVjdChyY0NsaWVudC5sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQudG9wIC0gUFdMX1NDUk9MTEJBUl9CVVRUT05fV0lEVEgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5yaWdodCwgcmNDbGllbnQudG9wKTsKLSAgICAgICAgcmNNYXhCdXR0b24gPQotICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdChyY0NsaWVudC5sZWZ0LCByY0NsaWVudC5ib3R0b20sIHJjQ2xpZW50LnJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5ib3R0b20gKyBQV0xfU0NST0xMQkFSX0JVVFRPTl9XSURUSCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmQldpZHRoID0gKHJjQ2xpZW50LnRvcCAtIHJjQ2xpZW50LmJvdHRvbSAtCi0gICAgICAgICAgICAgICAgICAgUFdMX1NDUk9MTEJBUl9QT1NCVVRUT05fTUlOV0lEVEggLSAyKSAvCi0gICAgICAgICAgICAgICAgICAyOwotCi0gICAgICAgIGlmIChJc0Zsb2F0QmlnZ2VyKGZCV2lkdGgsIDApKSB7Ci0gICAgICAgICAgcmNNaW5CdXR0b24gPSBDRlhfRmxvYXRSZWN0KHJjQ2xpZW50LmxlZnQsIHJjQ2xpZW50LnRvcCAtIGZCV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LnJpZ2h0LCByY0NsaWVudC50b3ApOwotICAgICAgICAgIHJjTWF4QnV0dG9uID0KLSAgICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdChyY0NsaWVudC5sZWZ0LCByY0NsaWVudC5ib3R0b20sIHJjQ2xpZW50LnJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LmJvdHRvbSArIGZCV2lkdGgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFNldFZpc2libGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgfQotCi0gIGlmIChtX3BNaW5CdXR0b24pCi0gICAgbV9wTWluQnV0dG9uLT5Nb3ZlKHJjTWluQnV0dG9uLCB0cnVlLCBmYWxzZSk7Ci0gIGlmIChtX3BNYXhCdXR0b24pCi0gICAgbV9wTWF4QnV0dG9uLT5Nb3ZlKHJjTWF4QnV0dG9uLCB0cnVlLCBmYWxzZSk7Ci0gIE1vdmVQb3NCdXR0b24oZmFsc2UpOwotfQotCi12b2lkIENQV0xfU2Nyb2xsQmFyOjpHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pIHsKLSAgQ0ZYX0Zsb2F0UmVjdCByZWN0V25kID0gR2V0V2luZG93UmVjdCgpOwotCi0gIGlmIChJc1Zpc2libGUoKSAmJiAhcmVjdFduZC5Jc0VtcHR5KCkpIHsKLSAgICBDRlhfQnl0ZVRleHRCdWYgc0J1dHRvbjsKLQotICAgIHNCdXR0b24gPDwgInFcbiI7Ci0gICAgc0J1dHRvbiA8PCAiMCB3XG4iCi0gICAgICAgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShHZXRCYWNrZ3JvdW5kQ29sb3IoKSwgdHJ1ZSkKLSAgICAgICAgICAgICAgICAgICAuQXNTdHJpbmdDKCk7Ci0gICAgc0J1dHRvbiA8PCByZWN0V25kLmxlZnQgPDwgIiAiIDw8IHJlY3RXbmQuYm90dG9tIDw8ICIgIgotICAgICAgICAgICAgPDwgcmVjdFduZC5yaWdodCAtIHJlY3RXbmQubGVmdCA8PCAiICIKLSAgICAgICAgICAgIDw8IHJlY3RXbmQudG9wIC0gcmVjdFduZC5ib3R0b20gPDwgIiByZSBiIFFcbiI7Ci0KLSAgICBzQXBwU3RyZWFtIDw8IHNCdXR0b247Ci0gIH0KLX0KLQotdm9pZCBDUFdMX1Njcm9sbEJhcjo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKSB7Ci0gIENGWF9GbG9hdFJlY3QgcmVjdFduZCA9IEdldFdpbmRvd1JlY3QoKTsKLQotICBpZiAoSXNWaXNpYmxlKCkgJiYgIXJlY3RXbmQuSXNFbXB0eSgpKSB7Ci0gICAgQ1BXTF9VdGlsczo6RHJhd0ZpbGxSZWN0KHBEZXZpY2UsIHBVc2VyMkRldmljZSwgcmVjdFduZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0QmFja2dyb3VuZENvbG9yKCksIEdldFRyYW5zcGFyZW5jeSgpKTsKLQotICAgIENQV0xfVXRpbHM6OkRyYXdTdHJva2VMaW5lKAotICAgICAgICBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsCi0gICAgICAgIENGWF9Qb2ludEYocmVjdFduZC5sZWZ0ICsgMi4wZiwgcmVjdFduZC50b3AgLSAyLjBmKSwKLSAgICAgICAgQ0ZYX1BvaW50RihyZWN0V25kLmxlZnQgKyAyLjBmLCByZWN0V25kLmJvdHRvbSArIDIuMGYpLAotICAgICAgICBBcmdiRW5jb2RlKEdldFRyYW5zcGFyZW5jeSgpLCAxMDAsIDEwMCwgMTAwKSwgMS4wZik7Ci0KLSAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZSgKLSAgICAgICAgcERldmljZSwgcFVzZXIyRGV2aWNlLAotICAgICAgICBDRlhfUG9pbnRGKHJlY3RXbmQucmlnaHQgLSAyLjBmLCByZWN0V25kLnRvcCAtIDIuMGYpLAotICAgICAgICBDRlhfUG9pbnRGKHJlY3RXbmQucmlnaHQgLSAyLjBmLCByZWN0V25kLmJvdHRvbSArIDIuMGYpLAotICAgICAgICBBcmdiRW5jb2RlKEdldFRyYW5zcGFyZW5jeSgpLCAxMDAsIDEwMCwgMTAwKSwgMS4wZik7Ci0gIH0KLX0KLQotYm9vbCBDUFdMX1Njcm9sbEJhcjo6T25MQnV0dG9uRG93bihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIHsKLSAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsIG5GbGFnKTsKLQotICBpZiAoSGFzRmxhZyhQV1NfQVVUT1RSQU5TUEFSRU5UKSkgewotICAgIGlmIChHZXRUcmFuc3BhcmVuY3koKSAhPSAyNTUpIHsKLSAgICAgIFNldFRyYW5zcGFyZW5jeSgyNTUpOwotICAgICAgSW52YWxpZGF0ZVJlY3QoKTsKLSAgICB9Ci0gIH0KLQotICBDRlhfRmxvYXRSZWN0IHJjTWluQXJlYSwgcmNNYXhBcmVhOwotCi0gIGlmIChtX3BQb3NCdXR0b24gJiYgbV9wUG9zQnV0dG9uLT5Jc1Zpc2libGUoKSkgewotICAgIENGWF9GbG9hdFJlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByY1Bvc0J1dHRvbiA9IG1fcFBvc0J1dHRvbi0+R2V0V2luZG93UmVjdCgpOwotCi0gICAgc3dpdGNoIChtX3NiVHlwZSkgewotICAgICAgY2FzZSBTQlRfSFNDUk9MTDoKLSAgICAgICAgcmNNaW5BcmVhID0KLSAgICAgICAgICAgIENGWF9GbG9hdFJlY3QocmNDbGllbnQubGVmdCArIFBXTF9TQ1JPTExCQVJfQlVUVE9OX1dJRFRILAotICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5ib3R0b20sIHJjUG9zQnV0dG9uLmxlZnQsIHJjQ2xpZW50LnRvcCk7Ci0gICAgICAgIHJjTWF4QXJlYSA9IENGWF9GbG9hdFJlY3QocmNQb3NCdXR0b24ucmlnaHQsIHJjQ2xpZW50LmJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5yaWdodCAtIFBXTF9TQ1JPTExCQVJfQlVUVE9OX1dJRFRILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LnRvcCk7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNCVF9WU0NST0xMOgotICAgICAgICByY01pbkFyZWEgPQotICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdChyY0NsaWVudC5sZWZ0LCByY1Bvc0J1dHRvbi50b3AsIHJjQ2xpZW50LnJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC50b3AgLSBQV0xfU0NST0xMQkFSX0JVVFRPTl9XSURUSCk7Ci0gICAgICAgIHJjTWF4QXJlYSA9IENGWF9GbG9hdFJlY3QocmNDbGllbnQubGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5ib3R0b20gKyBQV0xfU0NST0xMQkFSX0JVVFRPTl9XSURUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5yaWdodCwgcmNQb3NCdXR0b24uYm90dG9tKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmNNaW5BcmVhLk5vcm1hbGl6ZSgpOwotICAgIHJjTWF4QXJlYS5Ob3JtYWxpemUoKTsKLQotICAgIGlmIChyY01pbkFyZWEuQ29udGFpbnMocG9pbnQpKSB7Ci0gICAgICBtX3NEYXRhLlN1YkJpZygpOwotICAgICAgTW92ZVBvc0J1dHRvbih0cnVlKTsKLSAgICAgIE5vdGlmeVNjcm9sbFdpbmRvdygpOwotICAgIH0KLQotICAgIGlmIChyY01heEFyZWEuQ29udGFpbnMocG9pbnQpKSB7Ci0gICAgICBtX3NEYXRhLkFkZEJpZygpOwotICAgICAgTW92ZVBvc0J1dHRvbih0cnVlKTsKLSAgICAgIE5vdGlmeVNjcm9sbFdpbmRvdygpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENQV0xfU2Nyb2xsQmFyOjpPbkxCdXR0b25VcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIHsKLSAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvblVwKHBvaW50LCBuRmxhZyk7Ci0KLSAgaWYgKEhhc0ZsYWcoUFdTX0FVVE9UUkFOU1BBUkVOVCkpIHsKLSAgICBpZiAoR2V0VHJhbnNwYXJlbmN5KCkgIT0gUFdMX1NDUk9MTEJBUl9UUkFOU1BBUkVOQ1kpIHsKLSAgICAgIFNldFRyYW5zcGFyZW5jeShQV0xfU0NST0xMQkFSX1RSQU5TUEFSRU5DWSk7Ci0gICAgICBJbnZhbGlkYXRlUmVjdCgpOwotICAgIH0KLSAgfQotCi0gIEVuZFRpbWVyKCk7Ci0gIG1fYk1vdXNlRG93biA9IGZhbHNlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIENQV0xfU2Nyb2xsQmFyOjpPbk5vdGlmeShDUFdMX1duZCogcFduZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IHdQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHB0cl90IGxQYXJhbSkgewotICBDUFdMX1duZDo6T25Ob3RpZnkocFduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7Ci0KLSAgc3dpdGNoIChtc2cpIHsKLSAgICBjYXNlIFBOTV9MQlVUVE9ORE9XTjoKLSAgICAgIGlmIChwV25kID09IG1fcE1pbkJ1dHRvbikgewotICAgICAgICBPbk1pbkJ1dHRvbkxCRG93bigqKENGWF9Qb2ludEYqKWxQYXJhbSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwV25kID09IG1fcE1heEJ1dHRvbikgewotICAgICAgICBPbk1heEJ1dHRvbkxCRG93bigqKENGWF9Qb2ludEYqKWxQYXJhbSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwV25kID09IG1fcFBvc0J1dHRvbikgewotICAgICAgICBPblBvc0J1dHRvbkxCRG93bigqKENGWF9Qb2ludEYqKWxQYXJhbSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFBOTV9MQlVUVE9OVVA6Ci0gICAgICBpZiAocFduZCA9PSBtX3BNaW5CdXR0b24pIHsKLSAgICAgICAgT25NaW5CdXR0b25MQlVwKCooQ0ZYX1BvaW50RiopbFBhcmFtKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHBXbmQgPT0gbV9wTWF4QnV0dG9uKSB7Ci0gICAgICAgIE9uTWF4QnV0dG9uTEJVcCgqKENGWF9Qb2ludEYqKWxQYXJhbSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwV25kID09IG1fcFBvc0J1dHRvbikgewotICAgICAgICBPblBvc0J1dHRvbkxCVXAoKihDRlhfUG9pbnRGKilsUGFyYW0pOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQTk1fTU9VU0VNT1ZFOgotICAgICAgaWYgKHBXbmQgPT0gbV9wTWluQnV0dG9uKSB7Ci0gICAgICAgIE9uTWluQnV0dG9uTW91c2VNb3ZlKCooQ0ZYX1BvaW50RiopbFBhcmFtKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHBXbmQgPT0gbV9wTWF4QnV0dG9uKSB7Ci0gICAgICAgIE9uTWF4QnV0dG9uTW91c2VNb3ZlKCooQ0ZYX1BvaW50RiopbFBhcmFtKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHBXbmQgPT0gbV9wUG9zQnV0dG9uKSB7Ci0gICAgICAgIE9uUG9zQnV0dG9uTW91c2VNb3ZlKCooQ0ZYX1BvaW50RiopbFBhcmFtKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUE5NX1NFVFNDUk9MTElORk86IHsKLSAgICAgIFBXTF9TQ1JPTExfSU5GTyogcEluZm8gPSByZWludGVycHJldF9jYXN0PFBXTF9TQ1JPTExfSU5GTyo+KGxQYXJhbSk7Ci0gICAgICBpZiAocEluZm8gJiYgKnBJbmZvICE9IG1fT3JpZ2luSW5mbykgewotICAgICAgICBtX09yaWdpbkluZm8gPSAqcEluZm87Ci0gICAgICAgIEZYX0ZMT0FUIGZNYXggPQotICAgICAgICAgICAgcEluZm8tPmZDb250ZW50TWF4IC0gcEluZm8tPmZDb250ZW50TWluIC0gcEluZm8tPmZQbGF0ZVdpZHRoOwotICAgICAgICBmTWF4ID0gZk1heCA+IDAuMGYgPyBmTWF4IDogMC4wZjsKLSAgICAgICAgU2V0U2Nyb2xsUmFuZ2UoMCwgZk1heCwgcEluZm8tPmZQbGF0ZVdpZHRoKTsKLSAgICAgICAgU2V0U2Nyb2xsU3RlcChwSW5mby0+ZkJpZ1N0ZXAsIHBJbmZvLT5mU21hbGxTdGVwKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotICAgIGNhc2UgUE5NX1NFVFNDUk9MTFBPUzogewotICAgICAgRlhfRkxPQVQgZlBvcyA9ICooRlhfRkxPQVQqKWxQYXJhbTsKLSAgICAgIHN3aXRjaCAobV9zYlR5cGUpIHsKLSAgICAgICAgY2FzZSBTQlRfSFNDUk9MTDoKLSAgICAgICAgICBmUG9zID0gZlBvcyAtIG1fT3JpZ2luSW5mby5mQ29udGVudE1pbjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTQlRfVlNDUk9MTDoKLSAgICAgICAgICBmUG9zID0gbV9PcmlnaW5JbmZvLmZDb250ZW50TWF4IC0gZlBvczsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIFNldFNjcm9sbFBvcyhmUG9zKTsKLSAgICB9IGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgQ1BXTF9TY3JvbGxCYXI6OkNyZWF0ZUJ1dHRvbnMoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgewotICBQV0xfQ1JFQVRFUEFSQU0gc2NwID0gY3A7Ci0gIHNjcC5wUGFyZW50V25kID0gdGhpczsKLSAgc2NwLmR3Qm9yZGVyV2lkdGggPSAyOwotICBzY3AubkJvcmRlclN0eWxlID0gQm9yZGVyU3R5bGU6OkJFVkVMRUQ7Ci0KLSAgc2NwLmR3RmxhZ3MgPQotICAgICAgUFdTX1ZJU0lCTEUgfCBQV1NfQ0hJTEQgfCBQV1NfQk9SREVSIHwgUFdTX0JBQ0tHUk9VTkQgfCBQV1NfTk9SRUZSRVNIQ0xJUDsKLQotICBpZiAoIW1fcE1pbkJ1dHRvbikgewotICAgIG1fcE1pbkJ1dHRvbiA9IG5ldyBDUFdMX1NCQnV0dG9uKG1fc2JUeXBlLCBQU0JUX01JTik7Ci0gICAgbV9wTWluQnV0dG9uLT5DcmVhdGUoc2NwKTsKLSAgfQotCi0gIGlmICghbV9wTWF4QnV0dG9uKSB7Ci0gICAgbV9wTWF4QnV0dG9uID0gbmV3IENQV0xfU0JCdXR0b24obV9zYlR5cGUsIFBTQlRfTUFYKTsKLSAgICBtX3BNYXhCdXR0b24tPkNyZWF0ZShzY3ApOwotICB9Ci0KLSAgaWYgKCFtX3BQb3NCdXR0b24pIHsKLSAgICBtX3BQb3NCdXR0b24gPSBuZXcgQ1BXTF9TQkJ1dHRvbihtX3NiVHlwZSwgUFNCVF9QT1MpOwotICAgIG1fcFBvc0J1dHRvbi0+U2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgbV9wUG9zQnV0dG9uLT5DcmVhdGUoc2NwKTsKLSAgfQotfQotCi1GWF9GTE9BVCBDUFdMX1Njcm9sbEJhcjo6R2V0U2Nyb2xsQmFyV2lkdGgoKSBjb25zdCB7Ci0gIGlmICghSXNWaXNpYmxlKCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIFBXTF9TQ1JPTExCQVJfV0lEVEg7Ci19Ci0KLXZvaWQgQ1BXTF9TY3JvbGxCYXI6OlNldFNjcm9sbFJhbmdlKEZYX0ZMT0FUIGZNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNsaWVudFdpZHRoKSB7Ci0gIGlmIChtX3BQb3NCdXR0b24pIHsKLSAgICBtX3NEYXRhLlNldFNjcm9sbFJhbmdlKGZNaW4sIGZNYXgpOwotICAgIG1fc0RhdGEuU2V0Q2xpZW50V2lkdGgoZkNsaWVudFdpZHRoKTsKLQotICAgIGlmIChJc0Zsb2F0U21hbGxlcihtX3NEYXRhLlNjcm9sbFJhbmdlLkdldFdpZHRoKCksIDAuMGYpKSB7Ci0gICAgICBtX3BQb3NCdXR0b24tPlNldFZpc2libGUoZmFsc2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICBtX3BQb3NCdXR0b24tPlNldFZpc2libGUodHJ1ZSk7Ci0gICAgICBNb3ZlUG9zQnV0dG9uKHRydWUpOwotICAgIH0KLSAgfQotfQotCi12b2lkIENQV0xfU2Nyb2xsQmFyOjpTZXRTY3JvbGxQb3MoRlhfRkxPQVQgZlBvcykgewotICBGWF9GTE9BVCBmT2xkUG9zID0gbV9zRGF0YS5mU2Nyb2xsUG9zOwotCi0gIG1fc0RhdGEuU2V0UG9zKGZQb3MpOwotCi0gIGlmICghSXNGbG9hdEVxdWFsKG1fc0RhdGEuZlNjcm9sbFBvcywgZk9sZFBvcykpCi0gICAgTW92ZVBvc0J1dHRvbih0cnVlKTsKLX0KLQotdm9pZCBDUFdMX1Njcm9sbEJhcjo6U2V0U2Nyb2xsU3RlcChGWF9GTE9BVCBmQmlnU3RlcCwgRlhfRkxPQVQgZlNtYWxsU3RlcCkgewotICBtX3NEYXRhLlNldEJpZ1N0ZXAoZkJpZ1N0ZXApOwotICBtX3NEYXRhLlNldFNtYWxsU3RlcChmU21hbGxTdGVwKTsKLX0KLQotdm9pZCBDUFdMX1Njcm9sbEJhcjo6TW92ZVBvc0J1dHRvbihib29sIGJSZWZyZXNoKSB7Ci0gIEFTU0VSVChtX3BNaW5CdXR0b24pOwotICBBU1NFUlQobV9wTWF4QnV0dG9uKTsKLQotICBpZiAobV9wUG9zQnV0dG9uLT5Jc1Zpc2libGUoKSkgewotICAgIENGWF9GbG9hdFJlY3QgcmNDbGllbnQ7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByY1Bvc0FyZWEsIHJjUG9zQnV0dG9uOwotCi0gICAgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7Ci0gICAgcmNQb3NBcmVhID0gR2V0U2Nyb2xsQXJlYSgpOwotCi0gICAgRlhfRkxPQVQgZkxlZnQsIGZSaWdodCwgZlRvcCwgZkJvdHRvbTsKLQotICAgIHN3aXRjaCAobV9zYlR5cGUpIHsKLSAgICAgIGNhc2UgU0JUX0hTQ1JPTEw6Ci0gICAgICAgIGZMZWZ0ID0gVHJ1ZVRvRmFjZShtX3NEYXRhLmZTY3JvbGxQb3MpOwotICAgICAgICBmUmlnaHQgPSBUcnVlVG9GYWNlKG1fc0RhdGEuZlNjcm9sbFBvcyArIG1fc0RhdGEuZkNsaWVudFdpZHRoKTsKLQotICAgICAgICBpZiAoZlJpZ2h0IC0gZkxlZnQgPCBQV0xfU0NST0xMQkFSX1BPU0JVVFRPTl9NSU5XSURUSCkKLSAgICAgICAgICBmUmlnaHQgPSBmTGVmdCArIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIOwotCi0gICAgICAgIGlmIChmUmlnaHQgPiByY1Bvc0FyZWEucmlnaHQpIHsKLSAgICAgICAgICBmUmlnaHQgPSByY1Bvc0FyZWEucmlnaHQ7Ci0gICAgICAgICAgZkxlZnQgPSBmUmlnaHQgLSBQV0xfU0NST0xMQkFSX1BPU0JVVFRPTl9NSU5XSURUSDsKLSAgICAgICAgfQotCi0gICAgICAgIHJjUG9zQnV0dG9uID0KLSAgICAgICAgICAgIENGWF9GbG9hdFJlY3QoZkxlZnQsIHJjUG9zQXJlYS5ib3R0b20sIGZSaWdodCwgcmNQb3NBcmVhLnRvcCk7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNCVF9WU0NST0xMOgotICAgICAgICBmQm90dG9tID0gVHJ1ZVRvRmFjZShtX3NEYXRhLmZTY3JvbGxQb3MgKyBtX3NEYXRhLmZDbGllbnRXaWR0aCk7Ci0gICAgICAgIGZUb3AgPSBUcnVlVG9GYWNlKG1fc0RhdGEuZlNjcm9sbFBvcyk7Ci0KLSAgICAgICAgaWYgKElzRmxvYXRTbWFsbGVyKGZUb3AgLSBmQm90dG9tLCBQV0xfU0NST0xMQkFSX1BPU0JVVFRPTl9NSU5XSURUSCkpCi0gICAgICAgICAgZkJvdHRvbSA9IGZUb3AgLSBQV0xfU0NST0xMQkFSX1BPU0JVVFRPTl9NSU5XSURUSDsKLQotICAgICAgICBpZiAoSXNGbG9hdFNtYWxsZXIoZkJvdHRvbSwgcmNQb3NBcmVhLmJvdHRvbSkpIHsKLSAgICAgICAgICBmQm90dG9tID0gcmNQb3NBcmVhLmJvdHRvbTsKLSAgICAgICAgICBmVG9wID0gZkJvdHRvbSArIFBXTF9TQ1JPTExCQVJfUE9TQlVUVE9OX01JTldJRFRIOwotICAgICAgICB9Ci0KLSAgICAgICAgcmNQb3NCdXR0b24gPQotICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdChyY1Bvc0FyZWEubGVmdCwgZkJvdHRvbSwgcmNQb3NBcmVhLnJpZ2h0LCBmVG9wKTsKLQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBtX3BQb3NCdXR0b24tPk1vdmUocmNQb3NCdXR0b24sIHRydWUsIGJSZWZyZXNoKTsKLSAgfQotfQotCi12b2lkIENQV0xfU2Nyb2xsQmFyOjpPbk1pbkJ1dHRvbkxCRG93bihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewotICBtX3NEYXRhLlN1YlNtYWxsKCk7Ci0gIE1vdmVQb3NCdXR0b24odHJ1ZSk7Ci0gIE5vdGlmeVNjcm9sbFdpbmRvdygpOwotCi0gIG1fYk1pbk9yTWF4ID0gdHJ1ZTsKLQotICBFbmRUaW1lcigpOwotICBCZWdpblRpbWVyKDEwMCk7Ci19Ci0KLXZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uTWluQnV0dG9uTEJVcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkge30KLQotdm9pZCBDUFdMX1Njcm9sbEJhcjo6T25NaW5CdXR0b25Nb3VzZU1vdmUoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHt9Ci0KLXZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uTWF4QnV0dG9uTEJEb3duKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIG1fc0RhdGEuQWRkU21hbGwoKTsKLSAgTW92ZVBvc0J1dHRvbih0cnVlKTsKLSAgTm90aWZ5U2Nyb2xsV2luZG93KCk7Ci0KLSAgbV9iTWluT3JNYXggPSBmYWxzZTsKLQotICBFbmRUaW1lcigpOwotICBCZWdpblRpbWVyKDEwMCk7Ci19Ci0KLXZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uTWF4QnV0dG9uTEJVcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkge30KLQotdm9pZCBDUFdMX1Njcm9sbEJhcjo6T25NYXhCdXR0b25Nb3VzZU1vdmUoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHt9Ci0KLXZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uUG9zQnV0dG9uTEJEb3duKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIG1fYk1vdXNlRG93biA9IHRydWU7Ci0KLSAgaWYgKG1fcFBvc0J1dHRvbikgewotICAgIENGWF9GbG9hdFJlY3QgcmNQb3NCdXR0b24gPSBtX3BQb3NCdXR0b24tPkdldFdpbmRvd1JlY3QoKTsKLQotICAgIHN3aXRjaCAobV9zYlR5cGUpIHsKLSAgICAgIGNhc2UgU0JUX0hTQ1JPTEw6Ci0gICAgICAgIG1fbk9sZFBvcyA9IHBvaW50Lng7Ci0gICAgICAgIG1fZk9sZFBvc0J1dHRvbiA9IHJjUG9zQnV0dG9uLmxlZnQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTQlRfVlNDUk9MTDoKLSAgICAgICAgbV9uT2xkUG9zID0gcG9pbnQueTsKLSAgICAgICAgbV9mT2xkUG9zQnV0dG9uID0gcmNQb3NCdXR0b24udG9wOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDUFdMX1Njcm9sbEJhcjo6T25Qb3NCdXR0b25MQlVwKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIGlmIChtX2JNb3VzZURvd24pIHsKLSAgICBpZiAoIW1fYk5vdGlmeUZvcmV2ZXIpCi0gICAgICBOb3RpZnlTY3JvbGxXaW5kb3coKTsKLSAgfQotICBtX2JNb3VzZURvd24gPSBmYWxzZTsKLX0KLQotdm9pZCBDUFdMX1Njcm9sbEJhcjo6T25Qb3NCdXR0b25Nb3VzZU1vdmUoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgRlhfRkxPQVQgZk9sZFNjcm9sbFBvcyA9IG1fc0RhdGEuZlNjcm9sbFBvczsKLQotICBGWF9GTE9BVCBmTmV3UG9zID0gMDsKLQotICBzd2l0Y2ggKG1fc2JUeXBlKSB7Ci0gICAgY2FzZSBTQlRfSFNDUk9MTDoKLSAgICAgIGlmIChGWFNZU19mYWJzKHBvaW50LnggLSBtX25PbGRQb3MpIDwgMSkKLSAgICAgICAgcmV0dXJuOwotICAgICAgZk5ld1BvcyA9IEZhY2VUb1RydWUobV9mT2xkUG9zQnV0dG9uICsgcG9pbnQueCAtIG1fbk9sZFBvcyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFNCVF9WU0NST0xMOgotICAgICAgaWYgKEZYU1lTX2ZhYnMocG9pbnQueSAtIG1fbk9sZFBvcykgPCAxKQotICAgICAgICByZXR1cm47Ci0gICAgICBmTmV3UG9zID0gRmFjZVRvVHJ1ZShtX2ZPbGRQb3NCdXR0b24gKyBwb2ludC55IC0gbV9uT2xkUG9zKTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKG1fYk1vdXNlRG93bikgewotICAgIHN3aXRjaCAobV9zYlR5cGUpIHsKLSAgICAgIGNhc2UgU0JUX0hTQ1JPTEw6Ci0KLSAgICAgICAgaWYgKElzRmxvYXRTbWFsbGVyKGZOZXdQb3MsIG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1pbikpIHsKLSAgICAgICAgICBmTmV3UG9zID0gbV9zRGF0YS5TY3JvbGxSYW5nZS5mTWluOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKElzRmxvYXRCaWdnZXIoZk5ld1BvcywgbV9zRGF0YS5TY3JvbGxSYW5nZS5mTWF4KSkgewotICAgICAgICAgIGZOZXdQb3MgPSBtX3NEYXRhLlNjcm9sbFJhbmdlLmZNYXg7Ci0gICAgICAgIH0KLQotICAgICAgICBtX3NEYXRhLlNldFBvcyhmTmV3UG9zKTsKLQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0JUX1ZTQ1JPTEw6Ci0KLSAgICAgICAgaWYgKElzRmxvYXRTbWFsbGVyKGZOZXdQb3MsIG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1pbikpIHsKLSAgICAgICAgICBmTmV3UG9zID0gbV9zRGF0YS5TY3JvbGxSYW5nZS5mTWluOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKElzRmxvYXRCaWdnZXIoZk5ld1BvcywgbV9zRGF0YS5TY3JvbGxSYW5nZS5mTWF4KSkgewotICAgICAgICAgIGZOZXdQb3MgPSBtX3NEYXRhLlNjcm9sbFJhbmdlLmZNYXg7Ci0gICAgICAgIH0KLQotICAgICAgICBtX3NEYXRhLlNldFBvcyhmTmV3UG9zKTsKLQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoIUlzRmxvYXRFcXVhbChmT2xkU2Nyb2xsUG9zLCBtX3NEYXRhLmZTY3JvbGxQb3MpKSB7Ci0gICAgICBNb3ZlUG9zQnV0dG9uKHRydWUpOwotCi0gICAgICBpZiAobV9iTm90aWZ5Rm9yZXZlcikKLSAgICAgICAgTm90aWZ5U2Nyb2xsV2luZG93KCk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok5vdGlmeVNjcm9sbFdpbmRvdygpIHsKLSAgaWYgKENQV0xfV25kKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpIHsKLSAgICBGWF9GTE9BVCBmUG9zOwotICAgIHN3aXRjaCAobV9zYlR5cGUpIHsKLSAgICAgIGNhc2UgU0JUX0hTQ1JPTEw6Ci0gICAgICAgIGZQb3MgPSBtX09yaWdpbkluZm8uZkNvbnRlbnRNaW4gKyBtX3NEYXRhLmZTY3JvbGxQb3M7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTQlRfVlNDUk9MTDoKLSAgICAgICAgZlBvcyA9IG1fT3JpZ2luSW5mby5mQ29udGVudE1heCAtIG1fc0RhdGEuZlNjcm9sbFBvczsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHBQYXJlbnQtPk9uTm90aWZ5KHRoaXMsIFBOTV9TQ1JPTExXSU5ET1csIChpbnRwdHJfdCltX3NiVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAoaW50cHRyX3QpJmZQb3MpOwotICB9Ci19Ci0KLUNGWF9GbG9hdFJlY3QgQ1BXTF9TY3JvbGxCYXI6OkdldFNjcm9sbEFyZWEoKSBjb25zdCB7Ci0gIENGWF9GbG9hdFJlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7Ci0gIENGWF9GbG9hdFJlY3QgcmNBcmVhOwotCi0gIGlmICghbV9wTWluQnV0dG9uIHx8ICFtX3BNYXhCdXR0b24pCi0gICAgcmV0dXJuIHJjQ2xpZW50OwotCi0gIENGWF9GbG9hdFJlY3QgcmNNaW4gPSBtX3BNaW5CdXR0b24tPkdldFdpbmRvd1JlY3QoKTsKLSAgQ0ZYX0Zsb2F0UmVjdCByY01heCA9IG1fcE1heEJ1dHRvbi0+R2V0V2luZG93UmVjdCgpOwotCi0gIEZYX0ZMT0FUIGZNaW5XaWR0aCA9IHJjTWluLnJpZ2h0IC0gcmNNaW4ubGVmdDsKLSAgRlhfRkxPQVQgZk1pbkhlaWdodCA9IHJjTWluLnRvcCAtIHJjTWluLmJvdHRvbTsKLSAgRlhfRkxPQVQgZk1heFdpZHRoID0gcmNNYXgucmlnaHQgLSByY01heC5sZWZ0OwotICBGWF9GTE9BVCBmTWF4SGVpZ2h0ID0gcmNNYXgudG9wIC0gcmNNYXguYm90dG9tOwotCi0gIHN3aXRjaCAobV9zYlR5cGUpIHsKLSAgICBjYXNlIFNCVF9IU0NST0xMOgotICAgICAgaWYgKHJjQ2xpZW50LnJpZ2h0IC0gcmNDbGllbnQubGVmdCA+IGZNaW5XaWR0aCArIGZNYXhXaWR0aCArIDIpIHsKLSAgICAgICAgcmNBcmVhID0gQ0ZYX0Zsb2F0UmVjdChyY0NsaWVudC5sZWZ0ICsgZk1pbldpZHRoICsgMSwgcmNDbGllbnQuYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LnJpZ2h0IC0gZk1heFdpZHRoIC0gMSwgcmNDbGllbnQudG9wKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJjQXJlYSA9IENGWF9GbG9hdFJlY3QocmNDbGllbnQubGVmdCArIGZNaW5XaWR0aCArIDEsIHJjQ2xpZW50LmJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5sZWZ0ICsgZk1pbldpZHRoICsgMSwgcmNDbGllbnQudG9wKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0JUX1ZTQ1JPTEw6Ci0gICAgICBpZiAocmNDbGllbnQudG9wIC0gcmNDbGllbnQuYm90dG9tID4gZk1pbkhlaWdodCArIGZNYXhIZWlnaHQgKyAyKSB7Ci0gICAgICAgIHJjQXJlYSA9IENGWF9GbG9hdFJlY3QocmNDbGllbnQubGVmdCwgcmNDbGllbnQuYm90dG9tICsgZk1pbkhlaWdodCArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQucmlnaHQsIHJjQ2xpZW50LnRvcCAtIGZNYXhIZWlnaHQgLSAxKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJjQXJlYSA9Ci0gICAgICAgICAgICBDRlhfRmxvYXRSZWN0KHJjQ2xpZW50LmxlZnQsIHJjQ2xpZW50LmJvdHRvbSArIGZNaW5IZWlnaHQgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5yaWdodCwgcmNDbGllbnQuYm90dG9tICsgZk1pbkhlaWdodCArIDEpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gIH0KLQotICByY0FyZWEuTm9ybWFsaXplKCk7Ci0KLSAgcmV0dXJuIHJjQXJlYTsKLX0KLQotRlhfRkxPQVQgQ1BXTF9TY3JvbGxCYXI6OlRydWVUb0ZhY2UoRlhfRkxPQVQgZlRydWUpIHsKLSAgQ0ZYX0Zsb2F0UmVjdCByY1Bvc0FyZWE7Ci0gIHJjUG9zQXJlYSA9IEdldFNjcm9sbEFyZWEoKTsKLQotICBGWF9GTE9BVCBmRmFjdFdpZHRoID0gbV9zRGF0YS5TY3JvbGxSYW5nZS5HZXRXaWR0aCgpICsgbV9zRGF0YS5mQ2xpZW50V2lkdGg7Ci0gIGZGYWN0V2lkdGggPSBmRmFjdFdpZHRoID09IDAgPyAxIDogZkZhY3RXaWR0aDsKLQotICBGWF9GTE9BVCBmRmFjZSA9IDA7Ci0KLSAgc3dpdGNoIChtX3NiVHlwZSkgewotICAgIGNhc2UgU0JUX0hTQ1JPTEw6Ci0gICAgICBmRmFjZSA9IHJjUG9zQXJlYS5sZWZ0ICsKLSAgICAgICAgICAgICAgZlRydWUgKiAocmNQb3NBcmVhLnJpZ2h0IC0gcmNQb3NBcmVhLmxlZnQpIC8gZkZhY3RXaWR0aDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0JUX1ZTQ1JPTEw6Ci0gICAgICBmRmFjZSA9IHJjUG9zQXJlYS50b3AgLQotICAgICAgICAgICAgICBmVHJ1ZSAqIChyY1Bvc0FyZWEudG9wIC0gcmNQb3NBcmVhLmJvdHRvbSkgLyBmRmFjdFdpZHRoOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gZkZhY2U7Ci19Ci0KLUZYX0ZMT0FUIENQV0xfU2Nyb2xsQmFyOjpGYWNlVG9UcnVlKEZYX0ZMT0FUIGZGYWNlKSB7Ci0gIENGWF9GbG9hdFJlY3QgcmNQb3NBcmVhOwotICByY1Bvc0FyZWEgPSBHZXRTY3JvbGxBcmVhKCk7Ci0KLSAgRlhfRkxPQVQgZkZhY3RXaWR0aCA9IG1fc0RhdGEuU2Nyb2xsUmFuZ2UuR2V0V2lkdGgoKSArIG1fc0RhdGEuZkNsaWVudFdpZHRoOwotICBmRmFjdFdpZHRoID0gZkZhY3RXaWR0aCA9PSAwID8gMSA6IGZGYWN0V2lkdGg7Ci0KLSAgRlhfRkxPQVQgZlRydWUgPSAwOwotCi0gIHN3aXRjaCAobV9zYlR5cGUpIHsKLSAgICBjYXNlIFNCVF9IU0NST0xMOgotICAgICAgZlRydWUgPSAoZkZhY2UgLSByY1Bvc0FyZWEubGVmdCkgKiBmRmFjdFdpZHRoIC8KLSAgICAgICAgICAgICAgKHJjUG9zQXJlYS5yaWdodCAtIHJjUG9zQXJlYS5sZWZ0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgU0JUX1ZTQ1JPTEw6Ci0gICAgICBmVHJ1ZSA9IChyY1Bvc0FyZWEudG9wIC0gZkZhY2UpICogZkZhY3RXaWR0aCAvCi0gICAgICAgICAgICAgIChyY1Bvc0FyZWEudG9wIC0gcmNQb3NBcmVhLmJvdHRvbSk7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiBmVHJ1ZTsKLX0KLQotdm9pZCBDUFdMX1Njcm9sbEJhcjo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgewotICBDcmVhdGVCdXR0b25zKGNwKTsKLX0KLQotdm9pZCBDUFdMX1Njcm9sbEJhcjo6VGltZXJQcm9jKCkgewotICBQV0xfU0NST0xMX1BSSVZBVEVEQVRBIHNUZW1wID0gbV9zRGF0YTsKLSAgaWYgKG1fYk1pbk9yTWF4KQotICAgIG1fc0RhdGEuU3ViU21hbGwoKTsKLSAgZWxzZQotICAgIG1fc0RhdGEuQWRkU21hbGwoKTsKLQotICBpZiAoc1RlbXAgIT0gbV9zRGF0YSkgewotICAgIE1vdmVQb3NCdXR0b24odHJ1ZSk7Ci0gICAgTm90aWZ5U2Nyb2xsV2luZG93KCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuaCBiL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU0NmE5ZS4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL3BkZndpbmRvdy9QV0xfU2Nyb2xsQmFyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZQREZTREtfUERGV0lORE9XX1BXTF9TQ1JPTExCQVJfSF8KLSNkZWZpbmUgRlBERlNES19QREZXSU5ET1dfUFdMX1NDUk9MTEJBUl9IXwotCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX1duZC5oIgotCi1jbGFzcyBDUFdMX1NCQnV0dG9uOwotY2xhc3MgQ1BXTF9TY3JvbGxCYXI7Ci0KLXN0cnVjdCBQV0xfU0NST0xMX0lORk8gewotIHB1YmxpYzoKLSAgUFdMX1NDUk9MTF9JTkZPKCkKLSAgICAgIDogZkNvbnRlbnRNaW4oMC4wZiksCi0gICAgICAgIGZDb250ZW50TWF4KDAuMGYpLAotICAgICAgICBmUGxhdGVXaWR0aCgwLjBmKSwKLSAgICAgICAgZkJpZ1N0ZXAoMC4wZiksCi0gICAgICAgIGZTbWFsbFN0ZXAoMC4wZikge30KLQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgUFdMX1NDUk9MTF9JTkZPJiB0aGF0KSBjb25zdCB7Ci0gICAgcmV0dXJuIGZDb250ZW50TWluID09IHRoYXQuZkNvbnRlbnRNaW4gJiYgZkNvbnRlbnRNYXggPT0gdGhhdC5mQ29udGVudE1heCAmJgotICAgICAgICAgICBmUGxhdGVXaWR0aCA9PSB0aGF0LmZQbGF0ZVdpZHRoICYmIGZCaWdTdGVwID09IHRoYXQuZkJpZ1N0ZXAgJiYKLSAgICAgICAgICAgZlNtYWxsU3RlcCA9PSB0aGF0LmZTbWFsbFN0ZXA7Ci0gIH0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFBXTF9TQ1JPTExfSU5GTyYgdGhhdCkgY29uc3QgewotICAgIHJldHVybiAhKCp0aGlzID09IHRoYXQpOwotICB9Ci0KLSAgRlhfRkxPQVQgZkNvbnRlbnRNaW47Ci0gIEZYX0ZMT0FUIGZDb250ZW50TWF4OwotICBGWF9GTE9BVCBmUGxhdGVXaWR0aDsKLSAgRlhfRkxPQVQgZkJpZ1N0ZXA7Ci0gIEZYX0ZMT0FUIGZTbWFsbFN0ZXA7Ci19OwotCi1lbnVtIFBXTF9TQ1JPTExCQVJfVFlQRSB7IFNCVF9IU0NST0xMLCBTQlRfVlNDUk9MTCB9OwotCi1lbnVtIFBXTF9TQkJVVFRPTl9UWVBFIHsgUFNCVF9NSU4sIFBTQlRfTUFYLCBQU0JUX1BPUyB9OwotCi1jbGFzcyBDUFdMX1NCQnV0dG9uIDogcHVibGljIENQV0xfV25kIHsKLSBwdWJsaWM6Ci0gIENQV0xfU0JCdXR0b24oUFdMX1NDUk9MTEJBUl9UWVBFIGVTY3JvbGxCYXJUeXBlLAotICAgICAgICAgICAgICAgIFBXTF9TQkJVVFRPTl9UWVBFIGVCdXR0b25UeXBlKTsKLSAgfkNQV0xfU0JCdXR0b24oKSBvdmVycmlkZTsKLQotICAvLyBDUFdMX1duZAotICBDRlhfQnl0ZVN0cmluZyBHZXRDbGFzc05hbWUoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0mIGNwKSBvdmVycmlkZTsKLSAgdm9pZCBHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pIG92ZXJyaWRlOwotICB2b2lkIERyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UpIG92ZXJyaWRlOwotICBib29sIE9uTEJ1dHRvbkRvd24oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKLSAgYm9vbCBPbkxCdXR0b25VcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOwotICBib29sIE9uTW91c2VNb3ZlKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgb3ZlcnJpZGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIFBXTF9TQ1JPTExCQVJfVFlQRSBtX2VTY3JvbGxCYXJUeXBlOwotICBQV0xfU0JCVVRUT05fVFlQRSBtX2VTQkJ1dHRvblR5cGU7Ci0KLSAgYm9vbCBtX2JNb3VzZURvd247Ci19OwotCi1zdHJ1Y3QgUFdMX0ZMT0FUUkFOR0UgewotIHB1YmxpYzoKLSAgUFdMX0ZMT0FUUkFOR0UoKTsKLSAgUFdMX0ZMT0FUUkFOR0UoRlhfRkxPQVQgbWluLCBGWF9GTE9BVCBtYXgpOwotCi0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQV0xfRkxPQVRSQU5HRSYgdGhhdCkgY29uc3QgewotICAgIHJldHVybiBmTWluID09IHRoYXQuZk1pbiAmJiBmTWF4ID09IHRoYXQuZk1heDsKLSAgfQotICBib29sIG9wZXJhdG9yIT0oY29uc3QgUFdMX0ZMT0FUUkFOR0UmIHRoYXQpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gdGhhdCk7IH0KLQotICB2b2lkIERlZmF1bHQoKTsKLSAgdm9pZCBTZXQoRlhfRkxPQVQgbWluLCBGWF9GTE9BVCBtYXgpOwotICBib29sIEluKEZYX0ZMT0FUIHgpIGNvbnN0OwotICBGWF9GTE9BVCBHZXRXaWR0aCgpIGNvbnN0OwotCi0gIEZYX0ZMT0FUIGZNaW47Ci0gIEZYX0ZMT0FUIGZNYXg7Ci19OwotCi1zdHJ1Y3QgUFdMX1NDUk9MTF9QUklWQVRFREFUQSB7Ci0gcHVibGljOgotICBQV0xfU0NST0xMX1BSSVZBVEVEQVRBKCk7Ci0KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFBXTF9TQ1JPTExfUFJJVkFURURBVEEmIHRoYXQpIGNvbnN0IHsKLSAgICByZXR1cm4gU2Nyb2xsUmFuZ2UgPT0gdGhhdC5TY3JvbGxSYW5nZSAmJgotICAgICAgICAgICBmQ2xpZW50V2lkdGggPT0gdGhhdC5mQ2xpZW50V2lkdGggJiYgZlNjcm9sbFBvcyA9PSB0aGF0LmZTY3JvbGxQb3MgJiYKLSAgICAgICAgICAgZkJpZ1N0ZXAgPT0gdGhhdC5mQmlnU3RlcCAmJiBmU21hbGxTdGVwID09IHRoYXQuZlNtYWxsU3RlcDsKLSAgfQotICBib29sIG9wZXJhdG9yIT0oY29uc3QgUFdMX1NDUk9MTF9QUklWQVRFREFUQSYgdGhhdCkgY29uc3QgewotICAgIHJldHVybiAhKCp0aGlzID09IHRoYXQpOwotICB9Ci0KLSAgdm9pZCBEZWZhdWx0KCk7Ci0gIHZvaWQgU2V0U2Nyb2xsUmFuZ2UoRlhfRkxPQVQgbWluLCBGWF9GTE9BVCBtYXgpOwotICB2b2lkIFNldENsaWVudFdpZHRoKEZYX0ZMT0FUIHdpZHRoKTsKLSAgdm9pZCBTZXRTbWFsbFN0ZXAoRlhfRkxPQVQgc3RlcCk7Ci0gIHZvaWQgU2V0QmlnU3RlcChGWF9GTE9BVCBzdGVwKTsKLSAgYm9vbCBTZXRQb3MoRlhfRkxPQVQgcG9zKTsKLQotICB2b2lkIEFkZFNtYWxsKCk7Ci0gIHZvaWQgU3ViU21hbGwoKTsKLSAgdm9pZCBBZGRCaWcoKTsKLSAgdm9pZCBTdWJCaWcoKTsKLQotICBQV0xfRkxPQVRSQU5HRSBTY3JvbGxSYW5nZTsKLSAgRlhfRkxPQVQgZkNsaWVudFdpZHRoOwotICBGWF9GTE9BVCBmU2Nyb2xsUG9zOwotICBGWF9GTE9BVCBmQmlnU3RlcDsKLSAgRlhfRkxPQVQgZlNtYWxsU3RlcDsKLX07Ci0KLWNsYXNzIENQV0xfU2Nyb2xsQmFyIDogcHVibGljIENQV0xfV25kIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENQV0xfU2Nyb2xsQmFyKFBXTF9TQ1JPTExCQVJfVFlQRSBzYlR5cGUgPSBTQlRfSFNDUk9MTCk7Ci0gIH5DUFdMX1Njcm9sbEJhcigpIG92ZXJyaWRlOwotCi0gIC8vIENQV0xfV25kCi0gIENGWF9CeXRlU3RyaW5nIEdldENsYXNzTmFtZSgpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIE9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSYgY3ApIG92ZXJyaWRlOwotICB2b2lkIFJlUG9zQ2hpbGRXbmQoKSBvdmVycmlkZTsKLSAgdm9pZCBHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShDRlhfQnl0ZVRleHRCdWYmIHNBcHBTdHJlYW0pIG92ZXJyaWRlOwotICB2b2lkIERyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UpIG92ZXJyaWRlOwotICBib29sIE9uTEJ1dHRvbkRvd24oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKLSAgYm9vbCBPbkxCdXR0b25VcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOwotICB2b2lkIE9uTm90aWZ5KENQV0xfV25kKiBwV25kLAotICAgICAgICAgICAgICAgIHVpbnQzMl90IG1zZywKLSAgICAgICAgICAgICAgICBpbnRwdHJfdCB3UGFyYW0gPSAwLAotICAgICAgICAgICAgICAgIGludHB0cl90IGxQYXJhbSA9IDApIG92ZXJyaWRlOwotICB2b2lkIENyZWF0ZUNoaWxkV25kKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIG92ZXJyaWRlOwotICB2b2lkIFRpbWVyUHJvYygpIG92ZXJyaWRlOwotCi0gIEZYX0ZMT0FUIEdldFNjcm9sbEJhcldpZHRoKCkgY29uc3Q7Ci0gIFBXTF9TQ1JPTExCQVJfVFlQRSBHZXRTY3JvbGxCYXJUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9zYlR5cGU7IH0KLQotICB2b2lkIFNldE5vdGlmeUZvcmV2ZXIoYm9vbCBiRm9yZXZlcikgeyBtX2JOb3RpZnlGb3JldmVyID0gYkZvcmV2ZXI7IH0KLQotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRTY3JvbGxSYW5nZShGWF9GTE9BVCBmTWluLCBGWF9GTE9BVCBmTWF4LCBGWF9GTE9BVCBmQ2xpZW50V2lkdGgpOwotICB2b2lkIFNldFNjcm9sbFBvcyhGWF9GTE9BVCBmUG9zKTsKLSAgdm9pZCBNb3ZlUG9zQnV0dG9uKGJvb2wgYlJlZnJlc2gpOwotICB2b2lkIFNldFNjcm9sbFN0ZXAoRlhfRkxPQVQgZkJpZ1N0ZXAsIEZYX0ZMT0FUIGZTbWFsbFN0ZXApOwotICB2b2lkIE5vdGlmeVNjcm9sbFdpbmRvdygpOwotICBDRlhfRmxvYXRSZWN0IEdldFNjcm9sbEFyZWEoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIHZvaWQgQ3JlYXRlQnV0dG9ucyhjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKTsKLQotICB2b2lkIE9uTWluQnV0dG9uTEJEb3duKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKLSAgdm9pZCBPbk1pbkJ1dHRvbkxCVXAoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOwotICB2b2lkIE9uTWluQnV0dG9uTW91c2VNb3ZlKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKLQotICB2b2lkIE9uTWF4QnV0dG9uTEJEb3duKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKLSAgdm9pZCBPbk1heEJ1dHRvbkxCVXAoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOwotICB2b2lkIE9uTWF4QnV0dG9uTW91c2VNb3ZlKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKLQotICB2b2lkIE9uUG9zQnV0dG9uTEJEb3duKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKLSAgdm9pZCBPblBvc0J1dHRvbkxCVXAoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOwotICB2b2lkIE9uUG9zQnV0dG9uTW91c2VNb3ZlKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKLQotICBGWF9GTE9BVCBUcnVlVG9GYWNlKEZYX0ZMT0FUKTsKLSAgRlhfRkxPQVQgRmFjZVRvVHJ1ZShGWF9GTE9BVCk7Ci0KLSAgUFdMX1NDUk9MTEJBUl9UWVBFIG1fc2JUeXBlOwotICBQV0xfU0NST0xMX0lORk8gbV9PcmlnaW5JbmZvOwotICBDUFdMX1NCQnV0dG9uKiBtX3BNaW5CdXR0b247Ci0gIENQV0xfU0JCdXR0b24qIG1fcE1heEJ1dHRvbjsKLSAgQ1BXTF9TQkJ1dHRvbiogbV9wUG9zQnV0dG9uOwotICBQV0xfU0NST0xMX1BSSVZBVEVEQVRBIG1fc0RhdGE7Ci0gIGJvb2wgbV9iTW91c2VEb3duOwotICBib29sIG1fYk1pbk9yTWF4OwotICBib29sIG1fYk5vdGlmeUZvcmV2ZXI7Ci0gIEZYX0ZMT0FUIG1fbk9sZFBvczsKLSAgRlhfRkxPQVQgbV9mT2xkUG9zQnV0dG9uOwotfTsKLQotI2VuZGlmICAvLyBGUERGU0RLX1BERldJTkRPV19QV0xfU0NST0xMQkFSX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5jcHAgYi9mcGRmc2RrL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNDZjMzcuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9wZGZ3aW5kb3cvUFdMX1NwZWNpYWxCdXR0b24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0J1dHRvbi5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX1V0aWxzLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX1duZC5oIgotCi1DUFdMX1B1c2hCdXR0b246OkNQV0xfUHVzaEJ1dHRvbigpIHt9Ci0KLUNQV0xfUHVzaEJ1dHRvbjo6fkNQV0xfUHVzaEJ1dHRvbigpIHt9Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfUHVzaEJ1dHRvbjo6R2V0Q2xhc3NOYW1lKCkgY29uc3QgewotICByZXR1cm4gIkNQV0xfUHVzaEJ1dHRvbiI7Ci19Ci0KLUNGWF9GbG9hdFJlY3QgQ1BXTF9QdXNoQnV0dG9uOjpHZXRGb2N1c1JlY3QoKSBjb25zdCB7Ci0gIHJldHVybiBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChHZXRXaW5kb3dSZWN0KCksIChGWF9GTE9BVClHZXRCb3JkZXJXaWR0aCgpKTsKLX0KLQotQ1BXTF9DaGVja0JveDo6Q1BXTF9DaGVja0JveCgpIDogbV9iQ2hlY2tlZChmYWxzZSkge30KLQotQ1BXTF9DaGVja0JveDo6fkNQV0xfQ2hlY2tCb3goKSB7fQotCi1DRlhfQnl0ZVN0cmluZyBDUFdMX0NoZWNrQm94OjpHZXRDbGFzc05hbWUoKSBjb25zdCB7Ci0gIHJldHVybiAiQ1BXTF9DaGVja0JveCI7Ci19Ci0KLXZvaWQgQ1BXTF9DaGVja0JveDo6U2V0Q2hlY2soYm9vbCBiQ2hlY2spIHsKLSAgbV9iQ2hlY2tlZCA9IGJDaGVjazsKLX0KLQotYm9vbCBDUFdMX0NoZWNrQm94OjpJc0NoZWNrZWQoKSBjb25zdCB7Ci0gIHJldHVybiBtX2JDaGVja2VkOwotfQotCi1ib29sIENQV0xfQ2hlY2tCb3g6Ok9uTEJ1dHRvblVwKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgewotICBpZiAoSXNSZWFkT25seSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBTZXRDaGVjayghSXNDaGVja2VkKCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDUFdMX0NoZWNrQm94OjpPbkNoYXIodWludDE2X3QgbkNoYXIsIHVpbnQzMl90IG5GbGFnKSB7Ci0gIFNldENoZWNrKCFJc0NoZWNrZWQoKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1DUFdMX1JhZGlvQnV0dG9uOjpDUFdMX1JhZGlvQnV0dG9uKCkgOiBtX2JDaGVja2VkKGZhbHNlKSB7fQotCi1DUFdMX1JhZGlvQnV0dG9uOjp+Q1BXTF9SYWRpb0J1dHRvbigpIHt9Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfUmFkaW9CdXR0b246OkdldENsYXNzTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuICJDUFdMX1JhZGlvQnV0dG9uIjsKLX0KLQotYm9vbCBDUFdMX1JhZGlvQnV0dG9uOjpPbkxCdXR0b25VcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIHsKLSAgaWYgKElzUmVhZE9ubHkoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgU2V0Q2hlY2sodHJ1ZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIENQV0xfUmFkaW9CdXR0b246OlNldENoZWNrKGJvb2wgYkNoZWNrKSB7Ci0gIG1fYkNoZWNrZWQgPSBiQ2hlY2s7Ci19Ci0KLWJvb2wgQ1BXTF9SYWRpb0J1dHRvbjo6SXNDaGVja2VkKCkgY29uc3QgewotICByZXR1cm4gbV9iQ2hlY2tlZDsKLX0KLQotYm9vbCBDUFdMX1JhZGlvQnV0dG9uOjpPbkNoYXIodWludDE2X3QgbkNoYXIsIHVpbnQzMl90IG5GbGFnKSB7Ci0gIFNldENoZWNrKHRydWUpOwotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmggYi9mcGRmc2RrL3BkZndpbmRvdy9QV0xfU3BlY2lhbEJ1dHRvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2Y2MTFiLi4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19QREZXSU5ET1dfUFdMX1NQRUNJQUxCVVRUT05fSF8KLSNkZWZpbmUgRlBERlNES19QREZXSU5ET1dfUFdMX1NQRUNJQUxCVVRUT05fSF8KLQotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9CdXR0b24uaCIKLQotY2xhc3MgQ1BXTF9QdXNoQnV0dG9uIDogcHVibGljIENQV0xfQnV0dG9uIHsKLSBwdWJsaWM6Ci0gIENQV0xfUHVzaEJ1dHRvbigpOwotICB+Q1BXTF9QdXNoQnV0dG9uKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ1BXTF9CdXR0b24KLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2xhc3NOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIENGWF9GbG9hdFJlY3QgR2V0Rm9jdXNSZWN0KCkgY29uc3Qgb3ZlcnJpZGU7Ci19OwotCi1jbGFzcyBDUFdMX0NoZWNrQm94IDogcHVibGljIENQV0xfQnV0dG9uIHsKLSBwdWJsaWM6Ci0gIENQV0xfQ2hlY2tCb3goKTsKLSAgfkNQV0xfQ2hlY2tCb3goKSBvdmVycmlkZTsKLQotICAvLyBDUFdMX0J1dHRvbgotICBDRlhfQnl0ZVN0cmluZyBHZXRDbGFzc05hbWUoKSBjb25zdCBvdmVycmlkZTsKLSAgYm9vbCBPbkxCdXR0b25VcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOwotICBib29sIE9uQ2hhcih1aW50MTZfdCBuQ2hhciwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOwotCi0gIHZvaWQgU2V0Q2hlY2soYm9vbCBiQ2hlY2spOwotICBib29sIElzQ2hlY2tlZCgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgYm9vbCBtX2JDaGVja2VkOwotfTsKLQotY2xhc3MgQ1BXTF9SYWRpb0J1dHRvbiA6IHB1YmxpYyBDUFdMX0J1dHRvbiB7Ci0gcHVibGljOgotICBDUFdMX1JhZGlvQnV0dG9uKCk7Ci0gIH5DUFdMX1JhZGlvQnV0dG9uKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ1BXTF9CdXR0b24KLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2xhc3NOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGJvb2wgT25MQnV0dG9uVXAoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKLSAgYm9vbCBPbkNoYXIodWludDE2X3QgbkNoYXIsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKLQotICB2b2lkIFNldENoZWNrKGJvb2wgYkNoZWNrKTsKLSAgYm9vbCBJc0NoZWNrZWQoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGJvb2wgbV9iQ2hlY2tlZDsKLX07Ci0KLSNlbmRpZiAgLy8gRlBERlNES19QREZXSU5ET1dfUFdMX1NQRUNJQUxCVVRUT05fSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9VdGlscy5jcHAgYi9mcGRmc2RrL3BkZndpbmRvdy9QV0xfVXRpbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTY2OGI2Li4wMDAwMDAwCi0tLSBhL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9VdGlscy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9VdGlscy5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcHZ0X3dvcmQuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGVkYXRhLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9meGVkaXQvZnhldF9lZGl0LmgiCi0jaW5jbHVkZSAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0ljb24uaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfV25kLmgiCi0KLUNGWF9GbG9hdFJlY3QgQ1BXTF9VdGlsczo6T2Zmc2V0UmVjdChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSkgewotICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdChyZWN0LmxlZnQgKyB4LCByZWN0LmJvdHRvbSArIHksIHJlY3QucmlnaHQgKyB4LAotICAgICAgICAgICAgICAgICAgICAgICByZWN0LnRvcCArIHkpOwotfQotCi1DUFZUX1dvcmRSYW5nZSBDUFdMX1V0aWxzOjpPdmVybGFwV29yZFJhbmdlKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cjIpIHsKLSAgQ1BWVF9Xb3JkUmFuZ2Ugd3JSZXQ7Ci0KLSAgaWYgKHdyMi5FbmRQb3MuV29yZENtcCh3cjEuQmVnaW5Qb3MpIDwgMCB8fAotICAgICAgd3IyLkJlZ2luUG9zLldvcmRDbXAod3IxLkVuZFBvcykgPiAwKQotICAgIHJldHVybiB3clJldDsKLSAgaWYgKHdyMS5FbmRQb3MuV29yZENtcCh3cjIuQmVnaW5Qb3MpIDwgMCB8fAotICAgICAgd3IxLkJlZ2luUG9zLldvcmRDbXAod3IyLkVuZFBvcykgPiAwKQotICAgIHJldHVybiB3clJldDsKLQotICBpZiAod3IxLkJlZ2luUG9zLldvcmRDbXAod3IyLkJlZ2luUG9zKSA8IDApIHsKLSAgICB3clJldC5CZWdpblBvcyA9IHdyMi5CZWdpblBvczsKLSAgfSBlbHNlIHsKLSAgICB3clJldC5CZWdpblBvcyA9IHdyMS5CZWdpblBvczsKLSAgfQotCi0gIGlmICh3cjEuRW5kUG9zLldvcmRDbXAod3IyLkVuZFBvcykgPCAwKSB7Ci0gICAgd3JSZXQuRW5kUG9zID0gd3IxLkVuZFBvczsKLSAgfSBlbHNlIHsKLSAgICB3clJldC5FbmRQb3MgPSB3cjIuRW5kUG9zOwotICB9Ci0KLSAgcmV0dXJuIHdyUmV0OwotfQotCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBUF9DaGVjayhjb25zdCBDRlhfRmxvYXRSZWN0JiBjckJCb3gpIHsKLSAgY29uc3QgRlhfRkxPQVQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7Ci0gIGNvbnN0IEZYX0ZMT0FUIGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKLQotICBDRlhfUG9pbnRGIHB0c1s4XVszXSA9IHt7Q0ZYX1BvaW50RigwLjI4ZiwgMC41MmYpLCBDRlhfUG9pbnRGKDAuMjdmLCAwLjQ4ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGKDAuMjlmLCAwLjQwZil9LAotICAgICAgICAgICAgICAgICAgICAgICAgICB7Q0ZYX1BvaW50RigwLjMwZiwgMC4zM2YpLCBDRlhfUG9pbnRGKDAuMzFmLCAwLjI5ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGKDAuMzFmLCAwLjI4Zil9LAotICAgICAgICAgICAgICAgICAgICAgICAgICB7Q0ZYX1BvaW50RigwLjM5ZiwgMC4yOGYpLCBDRlhfUG9pbnRGKDAuNDlmLCAwLjI5ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGKDAuNzdmLCAwLjY3Zil9LAotICAgICAgICAgICAgICAgICAgICAgICAgICB7Q0ZYX1BvaW50RigwLjc2ZiwgMC42OGYpLCBDRlhfUG9pbnRGKDAuNzhmLCAwLjY5ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGKDAuNzZmLCAwLjc1Zil9LAotICAgICAgICAgICAgICAgICAgICAgICAgICB7Q0ZYX1BvaW50RigwLjc2ZiwgMC43NWYpLCBDRlhfUG9pbnRGKDAuNzNmLCAwLjgwZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGKDAuNjhmLCAwLjc1Zil9LAotICAgICAgICAgICAgICAgICAgICAgICAgICB7Q0ZYX1BvaW50RigwLjY4ZiwgMC43NGYpLCBDRlhfUG9pbnRGKDAuNjhmLCAwLjc0ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGKDAuNDRmLCAwLjQ3Zil9LAotICAgICAgICAgICAgICAgICAgICAgICAgICB7Q0ZYX1BvaW50RigwLjQzZiwgMC40N2YpLCBDRlhfUG9pbnRGKDAuNDBmLCAwLjQ3ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGKDAuNDFmLCAwLjU4Zil9LAotICAgICAgICAgICAgICAgICAgICAgICAgICB7Q0ZYX1BvaW50RigwLjQwZiwgMC42MGYpLCBDRlhfUG9pbnRGKDAuMjhmLCAwLjY2ZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUG9pbnRGKDAuMzBmLCAwLjU2Zil9fTsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShwdHMpOyArK2kpIHsKLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IEZYX0FycmF5U2l6ZShwdHNbMF0pOyArK2opIHsKLSAgICAgIHB0c1tpXVtqXS54ID0gcHRzW2ldW2pdLnggKiBmV2lkdGggKyBjckJCb3gubGVmdDsKLSAgICAgIHB0c1tpXVtqXS55ICo9IHB0c1tpXVtqXS55ICogZkhlaWdodCArIGNyQkJveC5ib3R0b207Ci0gICAgfQotICB9Ci0KLSAgQ0ZYX0J5dGVUZXh0QnVmIGNzQVA7Ci0gIGNzQVAgPDwgcHRzWzBdWzBdLnggPDwgIiAiIDw8IHB0c1swXVswXS55IDw8ICIgbVxuIjsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShwdHMpOyArK2kpIHsKLSAgICBzaXplX3Qgbk5leHQgPSBpIDwgRlhfQXJyYXlTaXplKHB0cykgLSAxID8gaSArIDEgOiAwOwotCi0gICAgRlhfRkxPQVQgcHgxID0gcHRzW2ldWzFdLnggLSBwdHNbaV1bMF0ueDsKLSAgICBGWF9GTE9BVCBweTEgPSBwdHNbaV1bMV0ueSAtIHB0c1tpXVswXS55OwotICAgIEZYX0ZMT0FUIHB4MiA9IHB0c1tpXVsyXS54IC0gcHRzW25OZXh0XVswXS54OwotICAgIEZYX0ZMT0FUIHB5MiA9IHB0c1tpXVsyXS55IC0gcHRzW25OZXh0XVswXS55OwotCi0gICAgY3NBUCA8PCBwdHNbaV1bMF0ueCArIHB4MSAqIEZYX0JFWklFUiA8PCAiICIKLSAgICAgICAgIDw8IHB0c1tpXVswXS55ICsgcHkxICogRlhfQkVaSUVSIDw8ICIgIgotICAgICAgICAgPDwgcHRzW25OZXh0XVswXS54ICsgcHgyICogRlhfQkVaSUVSIDw8ICIgIgotICAgICAgICAgPDwgcHRzW25OZXh0XVswXS55ICsgcHkyICogRlhfQkVaSUVSIDw8ICIgIiA8PCBwdHNbbk5leHRdWzBdLnggPDwgIiAiCi0gICAgICAgICA8PCBwdHNbbk5leHRdWzBdLnkgPDwgIiBjXG4iOwotICB9Ci0KLSAgcmV0dXJuIGNzQVAuTWFrZVN0cmluZygpOwotfQotCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBUF9DaXJjbGUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgY3JCQm94KSB7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBjc0FQOwotCi0gIEZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OwotICBGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207Ci0KLSAgQ0ZYX1BvaW50RiBwdDEoY3JCQm94LmxlZnQsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMik7Ci0gIENGWF9Qb2ludEYgcHQyKGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMiwgY3JCQm94LnRvcCk7Ci0gIENGWF9Qb2ludEYgcHQzKGNyQkJveC5yaWdodCwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyKTsKLSAgQ0ZYX1BvaW50RiBwdDQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLCBjckJCb3guYm90dG9tKTsKLQotICBjc0FQIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIG1cbiI7Ci0KLSAgRlhfRkxPQVQgcHggPSBwdDIueCAtIHB0MS54OwotICBGWF9GTE9BVCBweSA9IHB0Mi55IC0gcHQxLnk7Ci0KLSAgY3NBUCA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgKyBweSAqIEZYX0JFWklFUiA8PCAiICIKLSAgICAgICA8PCBwdDIueCAtIHB4ICogRlhfQkVaSUVSIDw8ICIgIiA8PCBwdDIueSA8PCAiICIgPDwgcHQyLnggPDwgIiAiIDw8IHB0Mi55Ci0gICAgICAgPDwgIiBjXG4iOwotCi0gIHB4ID0gcHQzLnggLSBwdDIueDsKLSAgcHkgPSBwdDIueSAtIHB0My55OwotCi0gIGNzQVAgPDwgcHQyLnggKyBweCAqIEZYX0JFWklFUiA8PCAiICIgPDwgcHQyLnkgPDwgIiAiIDw8IHB0My54IDw8ICIgIgotICAgICAgIDw8IHB0My55ICsgcHkgKiBGWF9CRVpJRVIgPDwgIiAiIDw8IHB0My54IDw8ICIgIiA8PCBwdDMueSA8PCAiIGNcbiI7Ci0KLSAgcHggPSBwdDMueCAtIHB0NC54OwotICBweSA9IHB0My55IC0gcHQ0Lnk7Ci0KLSAgY3NBUCA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgLSBweSAqIEZYX0JFWklFUiA8PCAiICIKLSAgICAgICA8PCBwdDQueCArIHB4ICogRlhfQkVaSUVSIDw8ICIgIiA8PCBwdDQueSA8PCAiICIgPDwgcHQ0LnggPDwgIiAiIDw8IHB0NC55Ci0gICAgICAgPDwgIiBjXG4iOwotCi0gIHB4ID0gcHQ0LnggLSBwdDEueDsKLSAgcHkgPSBwdDEueSAtIHB0NC55OwotCi0gIGNzQVAgPDwgcHQ0LnggLSBweCAqIEZYX0JFWklFUiA8PCAiICIgPDwgcHQ0LnkgPDwgIiAiIDw8IHB0MS54IDw8ICIgIgotICAgICAgIDw8IHB0MS55IC0gcHkgKiBGWF9CRVpJRVIgPDwgIiAiIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIGNcbiI7Ci0KLSAgcmV0dXJuIGNzQVAuTWFrZVN0cmluZygpOwotfQotCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBUF9Dcm9zcyhjb25zdCBDRlhfRmxvYXRSZWN0JiBjckJCb3gpIHsKLSAgQ0ZYX0J5dGVUZXh0QnVmIGNzQVA7Ci0KLSAgY3NBUCA8PCBjckJCb3gubGVmdCA8PCAiICIgPDwgY3JCQm94LnRvcCA8PCAiIG1cbiI7Ci0gIGNzQVAgPDwgY3JCQm94LnJpZ2h0IDw8ICIgIiA8PCBjckJCb3guYm90dG9tIDw8ICIgbFxuIjsKLSAgY3NBUCA8PCBjckJCb3gubGVmdCA8PCAiICIgPDwgY3JCQm94LmJvdHRvbSA8PCAiIG1cbiI7Ci0gIGNzQVAgPDwgY3JCQm94LnJpZ2h0IDw8ICIgIiA8PCBjckJCb3gudG9wIDw8ICIgbFxuIjsKLQotICByZXR1cm4gY3NBUC5NYWtlU3RyaW5nKCk7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFQX0RpYW1vbmQoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgY3JCQm94KSB7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBjc0FQOwotCi0gIEZYX0ZMT0FUIGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OwotICBGWF9GTE9BVCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207Ci0KLSAgQ0ZYX1BvaW50RiBwdDEoY3JCQm94LmxlZnQsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMik7Ci0gIENGWF9Qb2ludEYgcHQyKGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMiwgY3JCQm94LnRvcCk7Ci0gIENGWF9Qb2ludEYgcHQzKGNyQkJveC5yaWdodCwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyKTsKLSAgQ0ZYX1BvaW50RiBwdDQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLCBjckJCb3guYm90dG9tKTsKLQotICBjc0FQIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIG1cbiI7Ci0gIGNzQVAgPDwgcHQyLnggPDwgIiAiIDw8IHB0Mi55IDw8ICIgbFxuIjsKLSAgY3NBUCA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiBsXG4iOwotICBjc0FQIDw8IHB0NC54IDw8ICIgIiA8PCBwdDQueSA8PCAiIGxcbiI7Ci0gIGNzQVAgPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgbFxuIjsKLQotICByZXR1cm4gY3NBUC5NYWtlU3RyaW5nKCk7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFQX1NxdWFyZShjb25zdCBDRlhfRmxvYXRSZWN0JiBjckJCb3gpIHsKLSAgQ0ZYX0J5dGVUZXh0QnVmIGNzQVA7Ci0KLSAgY3NBUCA8PCBjckJCb3gubGVmdCA8PCAiICIgPDwgY3JCQm94LnRvcCA8PCAiIG1cbiI7Ci0gIGNzQVAgPDwgY3JCQm94LnJpZ2h0IDw8ICIgIiA8PCBjckJCb3gudG9wIDw8ICIgbFxuIjsKLSAgY3NBUCA8PCBjckJCb3gucmlnaHQgPDwgIiAiIDw8IGNyQkJveC5ib3R0b20gPDwgIiBsXG4iOwotICBjc0FQIDw8IGNyQkJveC5sZWZ0IDw8ICIgIiA8PCBjckJCb3guYm90dG9tIDw8ICIgbFxuIjsKLSAgY3NBUCA8PCBjckJCb3gubGVmdCA8PCAiICIgPDwgY3JCQm94LnRvcCA8PCAiIGxcbiI7Ci0KLSAgcmV0dXJuIGNzQVAuTWFrZVN0cmluZygpOwotfQotCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBUF9TdGFyKGNvbnN0IENGWF9GbG9hdFJlY3QmIGNyQkJveCkgewotICBDRlhfQnl0ZVRleHRCdWYgY3NBUDsKLQotICBGWF9GTE9BVCBmUmFkaXVzID0KLSAgICAgIChjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbSkgLyAoMSArIChGWF9GTE9BVCljb3MoRlhfUEkgLyA1LjBmKSk7Ci0gIENGWF9Qb2ludEYgcHRDZW50ZXIgPSBDRlhfUG9pbnRGKChjckJCb3gubGVmdCArIGNyQkJveC5yaWdodCkgLyAyLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3JCQm94LnRvcCArIGNyQkJveC5ib3R0b20pIC8gMi4wZik7Ci0KLSAgRlhfRkxPQVQgcHhbNV0sIHB5WzVdOwotCi0gIEZYX0ZMT0FUIGZBbmdlbCA9IEZYX1BJIC8gMTAuMGY7Ci0KLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0gICAgcHhbaV0gPSBwdENlbnRlci54ICsgZlJhZGl1cyAqIChGWF9GTE9BVCljb3MoZkFuZ2VsKTsKLSAgICBweVtpXSA9IHB0Q2VudGVyLnkgKyBmUmFkaXVzICogKEZYX0ZMT0FUKXNpbihmQW5nZWwpOwotCi0gICAgZkFuZ2VsICs9IEZYX1BJICogMiAvIDUuMGY7Ci0gIH0KLQotICBjc0FQIDw8IHB4WzBdIDw8ICIgIiA8PCBweVswXSA8PCAiIG1cbiI7Ci0KLSAgaW50MzJfdCBuTmV4dCA9IDA7Ci0gIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IDU7IGorKykgewotICAgIG5OZXh0ICs9IDI7Ci0gICAgaWYgKG5OZXh0ID49IDUpCi0gICAgICBuTmV4dCAtPSA1OwotICAgIGNzQVAgPDwgcHhbbk5leHRdIDw8ICIgIiA8PCBweVtuTmV4dF0gPDwgIiBsXG4iOwotICB9Ci0KLSAgcmV0dXJuIGNzQVAuTWFrZVN0cmluZygpOwotfQotCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBUF9IYWxmQ2lyY2xlKGNvbnN0IENGWF9GbG9hdFJlY3QmIGNyQkJveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlJvdGF0ZSkgewotICBDRlhfQnl0ZVRleHRCdWYgY3NBUDsKLQotICBGWF9GTE9BVCBmV2lkdGggPSBjckJCb3gucmlnaHQgLSBjckJCb3gubGVmdDsKLSAgRlhfRkxPQVQgZkhlaWdodCA9IGNyQkJveC50b3AgLSBjckJCb3guYm90dG9tOwotCi0gIENGWF9Qb2ludEYgcHQxKC1mV2lkdGggLyAyLCAwKTsKLSAgQ0ZYX1BvaW50RiBwdDIoMCwgZkhlaWdodCAvIDIpOwotICBDRlhfUG9pbnRGIHB0MyhmV2lkdGggLyAyLCAwKTsKLQotICBGWF9GTE9BVCBweCwgcHk7Ci0KLSAgY3NBUCA8PCBjb3MoZlJvdGF0ZSkgPDwgIiAiIDw8IHNpbihmUm90YXRlKSA8PCAiICIgPDwgLXNpbihmUm90YXRlKSA8PCAiICIKLSAgICAgICA8PCBjb3MoZlJvdGF0ZSkgPDwgIiAiIDw8IGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMiA8PCAiICIKLSAgICAgICA8PCBjckJCb3guYm90dG9tICsgZkhlaWdodCAvIDIgPDwgIiBjbVxuIjsKLQotICBjc0FQIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiIG1cbiI7Ci0KLSAgcHggPSBwdDIueCAtIHB0MS54OwotICBweSA9IHB0Mi55IC0gcHQxLnk7Ci0KLSAgY3NBUCA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgKyBweSAqIEZYX0JFWklFUiA8PCAiICIKLSAgICAgICA8PCBwdDIueCAtIHB4ICogRlhfQkVaSUVSIDw8ICIgIiA8PCBwdDIueSA8PCAiICIgPDwgcHQyLnggPDwgIiAiIDw8IHB0Mi55Ci0gICAgICAgPDwgIiBjXG4iOwotCi0gIHB4ID0gcHQzLnggLSBwdDIueDsKLSAgcHkgPSBwdDIueSAtIHB0My55OwotCi0gIGNzQVAgPDwgcHQyLnggKyBweCAqIEZYX0JFWklFUiA8PCAiICIgPDwgcHQyLnkgPDwgIiAiIDw8IHB0My54IDw8ICIgIgotICAgICAgIDw8IHB0My55ICsgcHkgKiBGWF9CRVpJRVIgPDwgIiAiIDw8IHB0My54IDw8ICIgIiA8PCBwdDMueSA8PCAiIGNcbiI7Ci0KLSAgcmV0dXJuIGNzQVAuTWFrZVN0cmluZygpOwotfQotCi1DRlhfRmxvYXRSZWN0IENQV0xfVXRpbHM6OkluZmxhdGVSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNpemUpIHsKLSAgaWYgKHJjUmVjdC5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIHJjUmVjdDsKLQotICBDRlhfRmxvYXRSZWN0IHJjTmV3KHJjUmVjdC5sZWZ0IC0gZlNpemUsIHJjUmVjdC5ib3R0b20gLSBmU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICByY1JlY3QucmlnaHQgKyBmU2l6ZSwgcmNSZWN0LnRvcCArIGZTaXplKTsKLSAgcmNOZXcuTm9ybWFsaXplKCk7Ci0gIHJldHVybiByY05ldzsKLX0KLQotQ0ZYX0Zsb2F0UmVjdCBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChjb25zdCBDRlhfRmxvYXRSZWN0JiByY1JlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTaXplKSB7Ci0gIGlmIChyY1JlY3QuSXNFbXB0eSgpKQotICAgIHJldHVybiByY1JlY3Q7Ci0KLSAgQ0ZYX0Zsb2F0UmVjdCByY05ldyhyY1JlY3QubGVmdCArIGZTaXplLCByY1JlY3QuYm90dG9tICsgZlNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgcmNSZWN0LnJpZ2h0IC0gZlNpemUsIHJjUmVjdC50b3AgLSBmU2l6ZSk7Ci0gIHJjTmV3Lk5vcm1hbGl6ZSgpOwotICByZXR1cm4gcmNOZXc7Ci19Ci0KLUNGWF9GbG9hdFJlY3QgQ1BXTF9VdGlsczo6U2NhbGVSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjUmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTY2FsZSkgewotICBGWF9GTE9BVCBmSGFsZldpZHRoID0gKHJjUmVjdC5yaWdodCAtIHJjUmVjdC5sZWZ0KSAvIDIuMGY7Ci0gIEZYX0ZMT0FUIGZIYWxmSGVpZ2h0ID0gKHJjUmVjdC50b3AgLSByY1JlY3QuYm90dG9tKSAvIDIuMGY7Ci0KLSAgQ0ZYX1BvaW50RiBwdENlbnRlciA9IENGWF9Qb2ludEYoKHJjUmVjdC5sZWZ0ICsgcmNSZWN0LnJpZ2h0KSAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyY1JlY3QudG9wICsgcmNSZWN0LmJvdHRvbSkgLyAyKTsKLQotICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdCgKLSAgICAgIHB0Q2VudGVyLnggLSBmSGFsZldpZHRoICogZlNjYWxlLCBwdENlbnRlci55IC0gZkhhbGZIZWlnaHQgKiBmU2NhbGUsCi0gICAgICBwdENlbnRlci54ICsgZkhhbGZXaWR0aCAqIGZTY2FsZSwgcHRDZW50ZXIueSArIGZIYWxmSGVpZ2h0ICogZlNjYWxlKTsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0UmVjdEZpbGxBcHBTdHJlYW0oY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKSB7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtOwotICBDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjb2xvciwgdHJ1ZSk7Ci0gIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQ29sb3I7Ci0gICAgc0FwcFN0cmVhbSA8PCByZWN0LmxlZnQgPDwgIiAiIDw8IHJlY3QuYm90dG9tIDw8ICIgIgotICAgICAgICAgICAgICAgPDwgcmVjdC5yaWdodCAtIHJlY3QubGVmdCA8PCAiICIgPDwgcmVjdC50b3AgLSByZWN0LmJvdHRvbQotICAgICAgICAgICAgICAgPDwgIiByZSBmXG5RXG4iOwotICB9Ci0KLSAgcmV0dXJuIHNBcHBTdHJlYW0uTWFrZVN0cmluZygpOwotfQotCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRDaXJjbGVGaWxsQXBwU3RyZWFtKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yKSB7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtOwotICBDRlhfQnl0ZVN0cmluZyBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjb2xvciwgdHJ1ZSk7Ci0gIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBzQ29sb3IgPDwgQ1BXTF9VdGlsczo6R2V0QVBfQ2lyY2xlKHJlY3QpIDw8ICJmXG5RXG4iOwotICB9Ci0gIHJldHVybiBzQXBwU3RyZWFtLk1ha2VTdHJpbmcoKTsKLX0KLQotQ0ZYX0Zsb2F0UmVjdCBDUFdMX1V0aWxzOjpHZXRDZW50ZXJTcXVhcmUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgewotICBGWF9GTE9BVCBmV2lkdGggPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0OwotICBGWF9GTE9BVCBmSGVpZ2h0ID0gcmVjdC50b3AgLSByZWN0LmJvdHRvbTsKLQotICBGWF9GTE9BVCBmQ2VudGVyWCA9IChyZWN0LmxlZnQgKyByZWN0LnJpZ2h0KSAvIDIuMGY7Ci0gIEZYX0ZMT0FUIGZDZW50ZXJZID0gKHJlY3QudG9wICsgcmVjdC5ib3R0b20pIC8gMi4wZjsKLQotICBGWF9GTE9BVCBmUmFkaXVzID0gKGZXaWR0aCA+IGZIZWlnaHQpID8gZkhlaWdodCAvIDIgOiBmV2lkdGggLyAyOwotCi0gIHJldHVybiBDRlhfRmxvYXRSZWN0KGZDZW50ZXJYIC0gZlJhZGl1cywgZkNlbnRlclkgLSBmUmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICBmQ2VudGVyWCArIGZSYWRpdXMsIGZDZW50ZXJZICsgZlJhZGl1cyk7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEVkaXRBcHBTdHJlYW0oQ0ZYX0VkaXQqIHBFZGl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UqIHBSYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ29udGludW91cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgU3ViV29yZCkgewotICByZXR1cm4gQ0ZYX0VkaXQ6OkdldEVkaXRBcHBlYXJhbmNlU3RyZWFtKHBFZGl0LCBwdE9mZnNldCwgcFJhbmdlLCBiQ29udGludW91cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJXb3JkKTsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0RWRpdFNlbEFwcFN0cmVhbShDRlhfRWRpdCogcEVkaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlKSB7Ci0gIHJldHVybiBDRlhfRWRpdDo6R2V0U2VsZWN0QXBwZWFyYW5jZVN0cmVhbShwRWRpdCwgcHRPZmZzZXQsIHBSYW5nZSk7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldFB1c2hCdXR0b25BcHBTdHJlYW0oY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNCQm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUFZUX0ZvbnRNYXAqIHBGb250TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1N0cmVhbSogcEljb25TdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfSWNvbkZpdCYgSWNvbkZpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHNMYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkxheU91dCkgewotICBjb25zdCBGWF9GTE9BVCBmQXV0b0ZvbnRTY2FsZSA9IDEuMGYgLyAzLjBmOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRWRpdD4gcEVkaXQobmV3IENGWF9FZGl0KTsKLSAgcEVkaXQtPlNldEZvbnRNYXAocEZvbnRNYXApOwotICBwRWRpdC0+U2V0QWxpZ25tZW50SCgxLCB0cnVlKTsKLSAgcEVkaXQtPlNldEFsaWdubWVudFYoMSwgdHJ1ZSk7Ci0gIHBFZGl0LT5TZXRNdWx0aUxpbmUoZmFsc2UsIHRydWUpOwotICBwRWRpdC0+U2V0QXV0b1JldHVybihmYWxzZSwgdHJ1ZSk7Ci0gIGlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKQotICAgIHBFZGl0LT5TZXRBdXRvRm9udFNpemUodHJ1ZSwgdHJ1ZSk7Ci0gIGVsc2UKLSAgICBwRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKLQotICBwRWRpdC0+SW5pdGlhbGl6ZSgpOwotICBwRWRpdC0+U2V0VGV4dChzTGFiZWwpOwotCi0gIENGWF9GbG9hdFJlY3QgcmNMYWJlbENvbnRlbnQgPSBwRWRpdC0+R2V0Q29udGVudFJlY3QoKTsKLSAgQ1BXTF9JY29uIEljb247Ci0gIFBXTF9DUkVBVEVQQVJBTSBjcDsKLSAgY3AuZHdGbGFncyA9IFBXU19WSVNJQkxFOwotICBJY29uLkNyZWF0ZShjcCk7Ci0gIEljb24uU2V0SWNvbkZpdCgmSWNvbkZpdCk7Ci0gIEljb24uU2V0UERGU3RyZWFtKHBJY29uU3RyZWFtKTsKLQotICBDRlhfRmxvYXRSZWN0IHJjTGFiZWwgPSBDRlhfRmxvYXRSZWN0KDAsIDAsIDAsIDApOwotICBDRlhfRmxvYXRSZWN0IHJjSWNvbiA9IENGWF9GbG9hdFJlY3QoMCwgMCwgMCwgMCk7Ci0gIEZYX0ZMT0FUIGZXaWR0aCA9IDAuMGY7Ci0gIEZYX0ZMT0FUIGZIZWlnaHQgPSAwLjBmOwotCi0gIHN3aXRjaCAobkxheU91dCkgewotICAgIGNhc2UgUFBCTF9MQUJFTDoKLSAgICAgIHJjTGFiZWwgPSByY0JCb3g7Ci0gICAgICByY0ljb24gPSBDRlhfRmxvYXRSZWN0KDAsIDAsIDAsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBQUEJMX0lDT046Ci0gICAgICByY0ljb24gPSByY0JCb3g7Ci0gICAgICByY0xhYmVsID0gQ0ZYX0Zsb2F0UmVjdCgwLCAwLCAwLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFBCTF9JQ09OVE9QTEFCRUxCT1RUT006Ci0KLSAgICAgIGlmIChwSWNvblN0cmVhbSkgewotICAgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkgewotICAgICAgICAgIGZIZWlnaHQgPSByY0JCb3gudG9wIC0gcmNCQm94LmJvdHRvbTsKLSAgICAgICAgICByY0xhYmVsID0gQ0ZYX0Zsb2F0UmVjdChyY0JCb3gubGVmdCwgcmNCQm94LmJvdHRvbSwgcmNCQm94LnJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC5ib3R0b20gKyBmSGVpZ2h0ICogZkF1dG9Gb250U2NhbGUpOwotICAgICAgICAgIHJjSWNvbiA9Ci0gICAgICAgICAgICAgIENGWF9GbG9hdFJlY3QocmNCQm94LmxlZnQsIHJjTGFiZWwudG9wLCByY0JCb3gucmlnaHQsIHJjQkJveC50b3ApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZIZWlnaHQgPSByY0xhYmVsQ29udGVudC5IZWlnaHQoKTsKLQotICAgICAgICAgIGlmIChyY0JCb3guYm90dG9tICsgZkhlaWdodCA+IHJjQkJveC50b3ApIHsKLSAgICAgICAgICAgIHJjSWNvbiA9IENGWF9GbG9hdFJlY3QoMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICByY0xhYmVsID0gcmNCQm94OwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByY0xhYmVsID0gQ0ZYX0Zsb2F0UmVjdChyY0JCb3gubGVmdCwgcmNCQm94LmJvdHRvbSwgcmNCQm94LnJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LmJvdHRvbSArIGZIZWlnaHQpOwotICAgICAgICAgICAgcmNJY29uID0gQ0ZYX0Zsb2F0UmVjdChyY0JCb3gubGVmdCwgcmNMYWJlbC50b3AsIHJjQkJveC5yaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LnRvcCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICByY0xhYmVsID0gcmNCQm94OwotICAgICAgICByY0ljb24gPSBDRlhfRmxvYXRSZWN0KDAsIDAsIDAsIDApOwotICAgICAgfQotCi0gICAgICBicmVhazsKLSAgICBjYXNlIFBQQkxfTEFCRUxUT1BJQ09OQk9UVE9NOgotCi0gICAgICBpZiAocEljb25TdHJlYW0pIHsKLSAgICAgICAgaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpIHsKLSAgICAgICAgICBmSGVpZ2h0ID0gcmNCQm94LnRvcCAtIHJjQkJveC5ib3R0b207Ci0gICAgICAgICAgcmNMYWJlbCA9Ci0gICAgICAgICAgICAgIENGWF9GbG9hdFJlY3QocmNCQm94LmxlZnQsIHJjQkJveC50b3AgLSBmSGVpZ2h0ICogZkF1dG9Gb250U2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LnJpZ2h0LCByY0JCb3gudG9wKTsKLSAgICAgICAgICByY0ljb24gPSBDRlhfRmxvYXRSZWN0KHJjQkJveC5sZWZ0LCByY0JCb3guYm90dG9tLCByY0JCb3gucmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0xhYmVsLmJvdHRvbSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZkhlaWdodCA9IHJjTGFiZWxDb250ZW50LkhlaWdodCgpOwotCi0gICAgICAgICAgaWYgKHJjQkJveC5ib3R0b20gKyBmSGVpZ2h0ID4gcmNCQm94LnRvcCkgewotICAgICAgICAgICAgcmNJY29uID0gQ0ZYX0Zsb2F0UmVjdCgwLCAwLCAwLCAwKTsKLSAgICAgICAgICAgIHJjTGFiZWwgPSByY0JCb3g7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJjTGFiZWwgPSBDRlhfRmxvYXRSZWN0KHJjQkJveC5sZWZ0LCByY0JCb3gudG9wIC0gZkhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC5yaWdodCwgcmNCQm94LnRvcCk7Ci0gICAgICAgICAgICByY0ljb24gPSBDRlhfRmxvYXRSZWN0KHJjQkJveC5sZWZ0LCByY0JCb3guYm90dG9tLCByY0JCb3gucmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjTGFiZWwuYm90dG9tKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJjTGFiZWwgPSByY0JCb3g7Ci0gICAgICAgIHJjSWNvbiA9IENGWF9GbG9hdFJlY3QoMCwgMCwgMCwgMCk7Ci0gICAgICB9Ci0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFBCTF9JQ09OTEVGVExBQkVMUklHSFQ6Ci0KLSAgICAgIGlmIChwSWNvblN0cmVhbSkgewotICAgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkgewotICAgICAgICAgIGZXaWR0aCA9IHJjQkJveC5yaWdodCAtIHJjQkJveC5sZWZ0OwotICAgICAgICAgIHJjTGFiZWwgPSBDRlhfRmxvYXRSZWN0KHJjQkJveC5yaWdodCAtIGZXaWR0aCAqIGZBdXRvRm9udFNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC5ib3R0b20sIHJjQkJveC5yaWdodCwgcmNCQm94LnRvcCk7Ci0gICAgICAgICAgcmNJY29uID0gQ0ZYX0Zsb2F0UmVjdChyY0JCb3gubGVmdCwgcmNCQm94LmJvdHRvbSwgcmNMYWJlbC5sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LnRvcCk7Ci0KLSAgICAgICAgICBpZiAocmNMYWJlbENvbnRlbnQuV2lkdGgoKSA8IGZXaWR0aCAqIGZBdXRvRm9udFNjYWxlKSB7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChyY0xhYmVsQ29udGVudC5XaWR0aCgpIDwgZldpZHRoKSB7Ci0gICAgICAgICAgICAgIHJjTGFiZWwgPSBDRlhfRmxvYXRSZWN0KHJjQkJveC5yaWdodCAtIHJjTGFiZWxDb250ZW50LldpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC5ib3R0b20sIHJjQkJveC5yaWdodCwgcmNCQm94LnRvcCk7Ci0gICAgICAgICAgICAgIHJjSWNvbiA9IENGWF9GbG9hdFJlY3QocmNCQm94LmxlZnQsIHJjQkJveC5ib3R0b20sIHJjTGFiZWwubGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0JCb3gudG9wKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHJjTGFiZWwgPSByY0JCb3g7Ci0gICAgICAgICAgICAgIHJjSWNvbiA9IENGWF9GbG9hdFJlY3QoMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZXaWR0aCA9IHJjTGFiZWxDb250ZW50LldpZHRoKCk7Ci0KLSAgICAgICAgICBpZiAocmNCQm94LmxlZnQgKyBmV2lkdGggPiByY0JCb3gucmlnaHQpIHsKLSAgICAgICAgICAgIHJjTGFiZWwgPSByY0JCb3g7Ci0gICAgICAgICAgICByY0ljb24gPSBDRlhfRmxvYXRSZWN0KDAsIDAsIDAsIDApOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByY0xhYmVsID0gQ0ZYX0Zsb2F0UmVjdChyY0JCb3gucmlnaHQgLSBmV2lkdGgsIHJjQkJveC5ib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0JCb3gucmlnaHQsIHJjQkJveC50b3ApOwotICAgICAgICAgICAgcmNJY29uID0gQ0ZYX0Zsb2F0UmVjdChyY0JCb3gubGVmdCwgcmNCQm94LmJvdHRvbSwgcmNMYWJlbC5sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0JCb3gudG9wKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJjTGFiZWwgPSByY0JCb3g7Ci0gICAgICAgIHJjSWNvbiA9IENGWF9GbG9hdFJlY3QoMCwgMCwgMCwgMCk7Ci0gICAgICB9Ci0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFBCTF9MQUJFTExFRlRJQ09OUklHSFQ6Ci0KLSAgICAgIGlmIChwSWNvblN0cmVhbSkgewotICAgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkgewotICAgICAgICAgIGZXaWR0aCA9IHJjQkJveC5yaWdodCAtIHJjQkJveC5sZWZ0OwotICAgICAgICAgIHJjTGFiZWwgPQotICAgICAgICAgICAgICBDRlhfRmxvYXRSZWN0KHJjQkJveC5sZWZ0LCByY0JCb3guYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC5sZWZ0ICsgZldpZHRoICogZkF1dG9Gb250U2NhbGUsIHJjQkJveC50b3ApOwotICAgICAgICAgIHJjSWNvbiA9IENGWF9GbG9hdFJlY3QocmNMYWJlbC5yaWdodCwgcmNCQm94LmJvdHRvbSwgcmNCQm94LnJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LnRvcCk7Ci0KLSAgICAgICAgICBpZiAocmNMYWJlbENvbnRlbnQuV2lkdGgoKSA8IGZXaWR0aCAqIGZBdXRvRm9udFNjYWxlKSB7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChyY0xhYmVsQ29udGVudC5XaWR0aCgpIDwgZldpZHRoKSB7Ci0gICAgICAgICAgICAgIHJjTGFiZWwgPSBDRlhfRmxvYXRSZWN0KHJjQkJveC5sZWZ0LCByY0JCb3guYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0JCb3gubGVmdCArIHJjTGFiZWxDb250ZW50LldpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC50b3ApOwotICAgICAgICAgICAgICByY0ljb24gPSBDRlhfRmxvYXRSZWN0KHJjTGFiZWwucmlnaHQsIHJjQkJveC5ib3R0b20sIHJjQkJveC5yaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0JCb3gudG9wKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHJjTGFiZWwgPSByY0JCb3g7Ci0gICAgICAgICAgICAgIHJjSWNvbiA9IENGWF9GbG9hdFJlY3QoMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZXaWR0aCA9IHJjTGFiZWxDb250ZW50LldpZHRoKCk7Ci0KLSAgICAgICAgICBpZiAocmNCQm94LmxlZnQgKyBmV2lkdGggPiByY0JCb3gucmlnaHQpIHsKLSAgICAgICAgICAgIHJjTGFiZWwgPSByY0JCb3g7Ci0gICAgICAgICAgICByY0ljb24gPSBDRlhfRmxvYXRSZWN0KDAsIDAsIDAsIDApOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByY0xhYmVsID0gQ0ZYX0Zsb2F0UmVjdChyY0JCb3gubGVmdCwgcmNCQm94LmJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC5sZWZ0ICsgZldpZHRoLCByY0JCb3gudG9wKTsKLSAgICAgICAgICAgIHJjSWNvbiA9IENGWF9GbG9hdFJlY3QocmNMYWJlbC5yaWdodCwgcmNCQm94LmJvdHRvbSwgcmNCQm94LnJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0JCb3gudG9wKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJjTGFiZWwgPSByY0JCb3g7Ci0gICAgICAgIHJjSWNvbiA9IENGWF9GbG9hdFJlY3QoMCwgMCwgMCwgMCk7Ci0gICAgICB9Ci0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFBCTF9MQUJFTE9WRVJJQ09OOgotICAgICAgcmNMYWJlbCA9IHJjQkJveDsKLSAgICAgIHJjSWNvbiA9IHJjQkJveDsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW0sIHNUZW1wOwotCi0gIGlmICghcmNJY29uLklzRW1wdHkoKSkgewotICAgIEljb24uTW92ZShyY0ljb24sIGZhbHNlLCBmYWxzZSk7Ci0gICAgc1RlbXAgPDwgSWNvbi5HZXRJbWFnZUFwcFN0cmVhbSgpOwotICB9Ci0KLSAgSWNvbi5EZXN0cm95KCk7Ci0KLSAgaWYgKCFyY0xhYmVsLklzRW1wdHkoKSkgewotICAgIHBFZGl0LT5TZXRQbGF0ZVJlY3QocmNMYWJlbCk7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgc0VkaXQgPQotICAgICAgICBDUFdMX1V0aWxzOjpHZXRFZGl0QXBwU3RyZWFtKHBFZGl0LmdldCgpLCBDRlhfUG9pbnRGKDAuMGYsIDAuMGYpKTsKLSAgICBpZiAoc0VkaXQuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICBzVGVtcCA8PCAiQlRcbiIKLSAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCkgPDwgc0VkaXQgPDwgIkVUXG4iOwotICAgIH0KLSAgfQotCi0gIGlmIChzVGVtcC5HZXRTaXplKCkgPiAwKSB7Ci0gICAgc0FwcFN0cmVhbSA8PCAicVxuIgotICAgICAgICAgICAgICAgPDwgcmNCQm94LmxlZnQgPDwgIiAiIDw8IHJjQkJveC5ib3R0b20gPDwgIiAiCi0gICAgICAgICAgICAgICA8PCByY0JCb3gucmlnaHQgLSByY0JCb3gubGVmdCA8PCAiICIKLSAgICAgICAgICAgICAgIDw8IHJjQkJveC50b3AgLSByY0JCb3guYm90dG9tIDw8ICIgcmUgVyBuXG4iOwotICAgIHNBcHBTdHJlYW0gPDwgc1RlbXAgPDwgIlFcbiI7Ci0gIH0KLSAgcmV0dXJuIHNBcHBTdHJlYW0uTWFrZVN0cmluZygpOwotfQotCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb25zdCBDUFdMX0NvbG9yJiBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wmIGJGaWxsT3JTdHJva2UpIHsKLSAgQ0ZYX0J5dGVUZXh0QnVmIHNDb2xvclN0cmVhbTsKLQotICBzd2l0Y2ggKGNvbG9yLm5Db2xvclR5cGUpIHsKLSAgICBjYXNlIENPTE9SVFlQRV9SR0I6Ci0gICAgICBzQ29sb3JTdHJlYW0gPDwgY29sb3IuZkNvbG9yMSA8PCAiICIgPDwgY29sb3IuZkNvbG9yMiA8PCAiICIKLSAgICAgICAgICAgICAgICAgICA8PCBjb2xvci5mQ29sb3IzIDw8ICIgIiA8PCAoYkZpbGxPclN0cm9rZSA/ICJyZyIgOiAiUkciKQotICAgICAgICAgICAgICAgICAgIDw8ICJcbiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENPTE9SVFlQRV9HUkFZOgotICAgICAgc0NvbG9yU3RyZWFtIDw8IGNvbG9yLmZDb2xvcjEgPDwgIiAiIDw8IChiRmlsbE9yU3Ryb2tlID8gImciIDogIkciKQotICAgICAgICAgICAgICAgICAgIDw8ICJcbiI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENPTE9SVFlQRV9DTVlLOgotICAgICAgc0NvbG9yU3RyZWFtIDw8IGNvbG9yLmZDb2xvcjEgPDwgIiAiIDw8IGNvbG9yLmZDb2xvcjIgPDwgIiAiCi0gICAgICAgICAgICAgICAgICAgPDwgY29sb3IuZkNvbG9yMyA8PCAiICIgPDwgY29sb3IuZkNvbG9yNCA8PCAiICIKLSAgICAgICAgICAgICAgICAgICA8PCAoYkZpbGxPclN0cm9rZSA/ICJrIiA6ICJLIikgPDwgIlxuIjsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIHNDb2xvclN0cmVhbS5NYWtlU3RyaW5nKCk7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEJvcmRlckFwcFN0cmVhbShjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjckxlZnRUb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JSaWdodEJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3JkZXJTdHlsZSBuU3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9EYXNoJiBkYXNoKSB7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtOwotICBDRlhfQnl0ZVN0cmluZyBzQ29sb3I7Ci0KLSAgRlhfRkxPQVQgZkxlZnQgPSByZWN0LmxlZnQ7Ci0gIEZYX0ZMT0FUIGZSaWdodCA9IHJlY3QucmlnaHQ7Ci0gIEZYX0ZMT0FUIGZUb3AgPSByZWN0LnRvcDsKLSAgRlhfRkxPQVQgZkJvdHRvbSA9IHJlY3QuYm90dG9tOwotCi0gIGlmIChmV2lkdGggPiAwLjBmKSB7Ci0gICAgRlhfRkxPQVQgZkhhbGZXaWR0aCA9IGZXaWR0aCAvIDIuMGY7Ci0KLSAgICBzQXBwU3RyZWFtIDw8ICJxXG4iOwotCi0gICAgc3dpdGNoIChuU3R5bGUpIHsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICBjYXNlIEJvcmRlclN0eWxlOjpTT0xJRDoKLSAgICAgICAgc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsIHRydWUpOwotICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgewotICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOwotICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgPDwgIiAiIDw8IGZCb3R0b20gPDwgIiAiIDw8IGZSaWdodCAtIGZMZWZ0IDw8ICIgIgotICAgICAgICAgICAgICAgICAgICAgPDwgZlRvcCAtIGZCb3R0b20gPDwgIiByZVxuIjsKLSAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZldpZHRoIDw8ICIgIiA8PCBmQm90dG9tICsgZldpZHRoIDw8ICIgIgotICAgICAgICAgICAgICAgICAgICAgPDwgZlJpZ2h0IC0gZkxlZnQgLSBmV2lkdGggKiAyIDw8ICIgIgotICAgICAgICAgICAgICAgICAgICAgPDwgZlRvcCAtIGZCb3R0b20gLSBmV2lkdGggKiAyIDw8ICIgcmVcbiI7Ci0gICAgICAgICAgc0FwcFN0cmVhbSA8PCAiZipcbiI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJvcmRlclN0eWxlOjpEQVNIOgotICAgICAgICBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvciwgZmFsc2UpOwotICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgewotICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOwotICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZldpZHRoIDw8ICIgdyIKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIgWyIgPDwgZGFzaC5uRGFzaCA8PCAiICIgPDwgZGFzaC5uR2FwIDw8ICJdICIKLSAgICAgICAgICAgICAgICAgICAgIDw8IGRhc2gublBoYXNlIDw8ICIgZFxuIjsKLSAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZldpZHRoIC8gMiA8PCAiICIgPDwgZkJvdHRvbSArIGZXaWR0aCAvIDIKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIgbVxuIjsKLSAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZldpZHRoIC8gMiA8PCAiICIgPDwgZlRvcCAtIGZXaWR0aCAvIDIKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIgbFxuIjsKLSAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZXaWR0aCAvIDIgPDwgIiAiIDw8IGZUb3AgLSBmV2lkdGggLyAyCi0gICAgICAgICAgICAgICAgICAgICA8PCAiIGxcbiI7Ci0gICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmV2lkdGggLyAyIDw8ICIgIiA8PCBmQm90dG9tICsgZldpZHRoIC8gMgotICAgICAgICAgICAgICAgICAgICAgPDwgIiBsXG4iOwotICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmV2lkdGggLyAyIDw8ICIgIiA8PCBmQm90dG9tICsgZldpZHRoIC8gMgotICAgICAgICAgICAgICAgICAgICAgPDwgIiBsIFNcbiI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJvcmRlclN0eWxlOjpCRVZFTEVEOgotICAgICAgY2FzZSBCb3JkZXJTdHlsZTo6SU5TRVQ6Ci0gICAgICAgIHNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyTGVmdFRvcCwgdHJ1ZSk7Ci0gICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7Ci0gICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggPDwgIiAiIDw8IGZCb3R0b20gKyBmSGFsZldpZHRoCi0gICAgICAgICAgICAgICAgICAgICA8PCAiIG1cbiI7Ci0gICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoCi0gICAgICAgICAgICAgICAgICAgICA8PCAiIGxcbiI7Ci0gICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmSGFsZldpZHRoIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aAotICAgICAgICAgICAgICAgICAgICAgPDwgIiBsXG4iOwotICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoICogMgotICAgICAgICAgICAgICAgICAgICAgPDwgIiBsXG4iOwotICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZlRvcCAtIGZIYWxmV2lkdGggKiAyCi0gICAgICAgICAgICAgICAgICAgICA8PCAiIGxcbiI7Ci0gICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggKiAyIDw8ICIgIgotICAgICAgICAgICAgICAgICAgICAgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGggKiAyIDw8ICIgbCBmXG4iOwotICAgICAgICB9Ci0KLSAgICAgICAgc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JSaWdodEJvdHRvbSwgdHJ1ZSk7Ci0gICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7Ci0gICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmSGFsZldpZHRoIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aAotICAgICAgICAgICAgICAgICAgICAgPDwgIiBtXG4iOwotICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGgKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIgbFxuIjsKLSAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCA8PCAiICIgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGgKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIgbFxuIjsKLSAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZkhhbGZXaWR0aCAqIDIgPDwgIiAiCi0gICAgICAgICAgICAgICAgICAgICA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIgPDwgIiBsXG4iOwotICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiCi0gICAgICAgICAgICAgICAgICAgICA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIgPDwgIiBsXG4iOwotICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoICogMgotICAgICAgICAgICAgICAgICAgICAgPDwgIiBsIGZcbiI7Ci0gICAgICAgIH0KLQotICAgICAgICBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvciwgdHJ1ZSk7Ci0gICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7Ci0gICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCA8PCAiICIgPDwgZkJvdHRvbSA8PCAiICIgPDwgZlJpZ2h0IC0gZkxlZnQgPDwgIiAiCi0gICAgICAgICAgICAgICAgICAgICA8PCBmVG9wIC0gZkJvdHRvbSA8PCAiIHJlXG4iOwotICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoIDw8ICIgIiA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCA8PCAiICIKLSAgICAgICAgICAgICAgICAgICAgIDw8IGZSaWdodCAtIGZMZWZ0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiCi0gICAgICAgICAgICAgICAgICAgICA8PCBmVG9wIC0gZkJvdHRvbSAtIGZIYWxmV2lkdGggKiAyIDw8ICIgcmUgZipcbiI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJvcmRlclN0eWxlOjpVTkRFUkxJTkU6Ci0gICAgICAgIHNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLCBmYWxzZSk7Ci0gICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7Ci0gICAgICAgICAgc0FwcFN0cmVhbSA8PCBmV2lkdGggPDwgIiB3XG4iOwotICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgPDwgIiAiIDw8IGZCb3R0b20gKyBmV2lkdGggLyAyIDw8ICIgbVxuIjsKLSAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCA8PCAiICIgPDwgZkJvdHRvbSArIGZXaWR0aCAvIDIgPDwgIiBsIFNcbiI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgc0FwcFN0cmVhbSA8PCAiUVxuIjsKLSAgfQotCi0gIHJldHVybiBzQXBwU3RyZWFtLk1ha2VTdHJpbmcoKTsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9VdGlsczo6R2V0Q2lyY2xlQm9yZGVyQXBwU3RyZWFtKAotICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsCi0gICAgRlhfRkxPQVQgZldpZHRoLAotICAgIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yLAotICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyTGVmdFRvcCwKLSAgICBjb25zdCBDUFdMX0NvbG9yJiBjclJpZ2h0Qm90dG9tLAotICAgIEJvcmRlclN0eWxlIG5TdHlsZSwKLSAgICBjb25zdCBDUFdMX0Rhc2gmIGRhc2gpIHsKLSAgQ0ZYX0J5dGVUZXh0QnVmIHNBcHBTdHJlYW07Ci0gIENGWF9CeXRlU3RyaW5nIHNDb2xvcjsKLQotICBpZiAoZldpZHRoID4gMC4wZikgewotICAgIHNBcHBTdHJlYW0gPDwgInFcbiI7Ci0KLSAgICBzd2l0Y2ggKG5TdHlsZSkgewotICAgICAgZGVmYXVsdDoKLSAgICAgIGNhc2UgQm9yZGVyU3R5bGU6OlNPTElEOgotICAgICAgY2FzZSBCb3JkZXJTdHlsZTo6VU5ERVJMSU5FOiB7Ci0gICAgICAgIHNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLCBmYWxzZSk7Ci0gICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmV2lkdGggPDwgIiB3XG4iIDw8IHNDb2xvcgotICAgICAgICAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0QVBfQ2lyY2xlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQV0xfVXRpbHM6OkRlZmxhdGVSZWN0KHJlY3QsIGZXaWR0aCAvIDIuMGYpKQotICAgICAgICAgICAgICAgICAgICAgPDwgIiBTXG5RXG4iOwotICAgICAgICB9Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSBCb3JkZXJTdHlsZTo6REFTSDogewotICAgICAgICBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvciwgZmFsc2UpOwotICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgewotICAgICAgICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgZldpZHRoIDw8ICIgd1xuIgotICAgICAgICAgICAgICAgICAgICAgPDwgIlsiIDw8IGRhc2gubkRhc2ggPDwgIiAiIDw8IGRhc2gubkdhcCA8PCAiXSAiCi0gICAgICAgICAgICAgICAgICAgICA8PCBkYXNoLm5QaGFzZSA8PCAiIGRcbiIgPDwgc0NvbG9yCi0gICAgICAgICAgICAgICAgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRBUF9DaXJjbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmVjdCwgZldpZHRoIC8gMi4wZikpCi0gICAgICAgICAgICAgICAgICAgICA8PCAiIFNcblFcbiI7Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIEJvcmRlclN0eWxlOjpCRVZFTEVEOiB7Ci0gICAgICAgIEZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmV2lkdGggLyAyLjBmOwotCi0gICAgICAgIHNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNvbG9yLCBmYWxzZSk7Ci0gICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmSGFsZldpZHRoIDw8ICIgd1xuIiA8PCBzQ29sb3IKLSAgICAgICAgICAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldEFQX0NpcmNsZShyZWN0KSA8PCAiIFNcblFcbiI7Ci0gICAgICAgIH0KLQotICAgICAgICBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjckxlZnRUb3AsIGZhbHNlKTsKLSAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICBzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IGZIYWxmV2lkdGggPDwgIiB3XG4iIDw8IHNDb2xvcgotICAgICAgICAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0QVBfSGFsZkNpcmNsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0LCBmSGFsZldpZHRoICogMC43NWYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1BJIC8gNC4wZikKLSAgICAgICAgICAgICAgICAgICAgIDw8ICIgU1xuUVxuIjsKLSAgICAgICAgfQotCi0gICAgICAgIHNDb2xvciA9IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyUmlnaHRCb3R0b20sIGZhbHNlKTsKLSAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICBzQXBwU3RyZWFtIDw8ICJxXG4iIDw8IGZIYWxmV2lkdGggPDwgIiB3XG4iIDw8IHNDb2xvcgotICAgICAgICAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0QVBfSGFsZkNpcmNsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUFdMX1V0aWxzOjpEZWZsYXRlUmVjdChyZWN0LCBmSGFsZldpZHRoICogMC43NWYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1BJICogNSAvIDQuMGYpCi0gICAgICAgICAgICAgICAgICAgICA8PCAiIFNcblFcbiI7Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIEJvcmRlclN0eWxlOjpJTlNFVDogewotICAgICAgICBGWF9GTE9BVCBmSGFsZldpZHRoID0gZldpZHRoIC8gMi4wZjsKLQotICAgICAgICBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjb2xvciwgZmFsc2UpOwotICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgewotICAgICAgICAgIHNBcHBTdHJlYW0gPDwgInFcbiIgPDwgZkhhbGZXaWR0aCA8PCAiIHdcbiIgPDwgc0NvbG9yCi0gICAgICAgICAgICAgICAgICAgICA8PCBDUFdMX1V0aWxzOjpHZXRBUF9DaXJjbGUocmVjdCkgPDwgIiBTXG5RXG4iOwotICAgICAgICB9Ci0KLSAgICAgICAgc0NvbG9yID0gQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JMZWZ0VG9wLCBmYWxzZSk7Ci0gICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmSGFsZldpZHRoIDw8ICIgd1xuIiA8PCBzQ29sb3IKLSAgICAgICAgICAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldEFQX0hhbGZDaXJjbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmVjdCwgZkhhbGZXaWR0aCAqIDAuNzVmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9QSSAvIDQuMGYpCi0gICAgICAgICAgICAgICAgICAgICA8PCAiIFNcblFcbiI7Ci0gICAgICAgIH0KLQotICAgICAgICBzQ29sb3IgPSBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclJpZ2h0Qm90dG9tLCBmYWxzZSk7Ci0gICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgc0FwcFN0cmVhbSA8PCAicVxuIiA8PCBmSGFsZldpZHRoIDw8ICIgd1xuIiA8PCBzQ29sb3IKLSAgICAgICAgICAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldEFQX0hhbGZDaXJjbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QocmVjdCwgZkhhbGZXaWR0aCAqIDAuNzVmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9QSSAqIDUgLyA0LjBmKQotICAgICAgICAgICAgICAgICAgICAgPDwgIiBTXG5RXG4iOwotICAgICAgICB9Ci0gICAgICB9IGJyZWFrOwotICAgIH0KLQotICAgIHNBcHBTdHJlYW0gPDwgIlFcbiI7Ci0gIH0KLQotICByZXR1cm4gc0FwcFN0cmVhbS5NYWtlU3RyaW5nKCk7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFwcFN0cmVhbV9DaGVjayhjb25zdCBDRlhfRmxvYXRSZWN0JiByY0JCb3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KSB7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBzQVA7Ci0gIHNBUCA8PCAicVxuIgotICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LCB0cnVlKQotICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0QVBfQ2hlY2socmNCQm94KSA8PCAiZlxuUVxuIjsKLSAgcmV0dXJuIHNBUC5NYWtlU3RyaW5nKCk7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFwcFN0cmVhbV9DaXJjbGUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNCQm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclRleHQpIHsKLSAgQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKLSAgc0FQIDw8ICJxXG4iCi0gICAgICA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsIHRydWUpCi0gICAgICA8PCBDUFdMX1V0aWxzOjpHZXRBUF9DaXJjbGUocmNCQm94KSA8PCAiZlxuUVxuIjsKLSAgcmV0dXJuIHNBUC5NYWtlU3RyaW5nKCk7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFwcFN0cmVhbV9Dcm9zcyhjb25zdCBDRlhfRmxvYXRSZWN0JiByY0JCb3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KSB7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBzQVA7Ci0gIHNBUCA8PCAicVxuIgotICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LCBmYWxzZSkKLSAgICAgIDw8IENQV0xfVXRpbHM6OkdldEFQX0Nyb3NzKHJjQkJveCkgPDwgIlNcblFcbiI7Ci0gIHJldHVybiBzQVAuTWFrZVN0cmluZygpOwotfQotCi1DRlhfQnl0ZVN0cmluZyBDUFdMX1V0aWxzOjpHZXRBcHBTdHJlYW1fRGlhbW9uZChjb25zdCBDRlhfRmxvYXRSZWN0JiByY0JCb3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclRleHQpIHsKLSAgQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKLSAgc0FQIDw8ICJxXG4xIHdcbiIKLSAgICAgIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCwgdHJ1ZSkKLSAgICAgIDw8IENQV0xfVXRpbHM6OkdldEFQX0RpYW1vbmQocmNCQm94KSA8PCAiZlxuUVxuIjsKLSAgcmV0dXJuIHNBUC5NYWtlU3RyaW5nKCk7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFwcFN0cmVhbV9TcXVhcmUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNCQm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclRleHQpIHsKLSAgQ0ZYX0J5dGVUZXh0QnVmIHNBUDsKLSAgc0FQIDw8ICJxXG4iCi0gICAgICA8PCBDUFdMX1V0aWxzOjpHZXRDb2xvckFwcFN0cmVhbShjclRleHQsIHRydWUpCi0gICAgICA8PCBDUFdMX1V0aWxzOjpHZXRBUF9TcXVhcmUocmNCQm94KSA8PCAiZlxuUVxuIjsKLSAgcmV0dXJuIHNBUC5NYWtlU3RyaW5nKCk7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldEFwcFN0cmVhbV9TdGFyKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjQkJveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyVGV4dCkgewotICBDRlhfQnl0ZVRleHRCdWYgc0FQOwotICBzQVAgPDwgInFcbiIKLSAgICAgIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCwgdHJ1ZSkKLSAgICAgIDw8IENQV0xfVXRpbHM6OkdldEFQX1N0YXIocmNCQm94KSA8PCAiZlxuUVxuIjsKLSAgcmV0dXJuIHNBUC5NYWtlU3RyaW5nKCk7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldENoZWNrQm94QXBwU3RyZWFtKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjQkJveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KSB7Ci0gIENGWF9GbG9hdFJlY3QgcmNDZW50ZXIgPSBHZXRDZW50ZXJTcXVhcmUocmNCQm94KTsKLSAgc3dpdGNoIChuU3R5bGUpIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgUENTX0NIRUNLOgotICAgICAgcmV0dXJuIEdldEFwcFN0cmVhbV9DaGVjayhyY0NlbnRlciwgY3JUZXh0KTsKLSAgICBjYXNlIFBDU19DSVJDTEU6Ci0gICAgICByZXR1cm4gR2V0QXBwU3RyZWFtX0NpcmNsZShTY2FsZVJlY3QocmNDZW50ZXIsIDIuMGYgLyAzLjBmKSwgY3JUZXh0KTsKLSAgICBjYXNlIFBDU19DUk9TUzoKLSAgICAgIHJldHVybiBHZXRBcHBTdHJlYW1fQ3Jvc3MocmNDZW50ZXIsIGNyVGV4dCk7Ci0gICAgY2FzZSBQQ1NfRElBTU9ORDoKLSAgICAgIHJldHVybiBHZXRBcHBTdHJlYW1fRGlhbW9uZChTY2FsZVJlY3QocmNDZW50ZXIsIDIuMGYgLyAzLjBmKSwgY3JUZXh0KTsKLSAgICBjYXNlIFBDU19TUVVBUkU6Ci0gICAgICByZXR1cm4gR2V0QXBwU3RyZWFtX1NxdWFyZShTY2FsZVJlY3QocmNDZW50ZXIsIDIuMGYgLyAzLjBmKSwgY3JUZXh0KTsKLSAgICBjYXNlIFBDU19TVEFSOgotICAgICAgcmV0dXJuIEdldEFwcFN0cmVhbV9TdGFyKFNjYWxlUmVjdChyY0NlbnRlciwgMi4wZiAvIDMuMGYpLCBjclRleHQpOwotICB9Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldFJhZGlvQnV0dG9uQXBwU3RyZWFtKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjQkJveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KSB7Ci0gIENGWF9GbG9hdFJlY3QgcmNDZW50ZXIgPSBHZXRDZW50ZXJTcXVhcmUocmNCQm94KTsKLSAgc3dpdGNoIChuU3R5bGUpIHsKLSAgICBkZWZhdWx0OgotICAgIGNhc2UgUENTX0NIRUNLOgotICAgICAgcmV0dXJuIEdldEFwcFN0cmVhbV9DaGVjayhyY0NlbnRlciwgY3JUZXh0KTsKLSAgICBjYXNlIFBDU19DSVJDTEU6Ci0gICAgICByZXR1cm4gR2V0QXBwU3RyZWFtX0NpcmNsZShTY2FsZVJlY3QocmNDZW50ZXIsIDEuMGYgLyAyLjBmKSwgY3JUZXh0KTsKLSAgICBjYXNlIFBDU19DUk9TUzoKLSAgICAgIHJldHVybiBHZXRBcHBTdHJlYW1fQ3Jvc3MocmNDZW50ZXIsIGNyVGV4dCk7Ci0gICAgY2FzZSBQQ1NfRElBTU9ORDoKLSAgICAgIHJldHVybiBHZXRBcHBTdHJlYW1fRGlhbW9uZChTY2FsZVJlY3QocmNDZW50ZXIsIDIuMGYgLyAzLjBmKSwgY3JUZXh0KTsKLSAgICBjYXNlIFBDU19TUVVBUkU6Ci0gICAgICByZXR1cm4gR2V0QXBwU3RyZWFtX1NxdWFyZShTY2FsZVJlY3QocmNDZW50ZXIsIDIuMGYgLyAzLjBmKSwgY3JUZXh0KTsKLSAgICBjYXNlIFBDU19TVEFSOgotICAgICAgcmV0dXJuIEdldEFwcFN0cmVhbV9TdGFyKFNjYWxlUmVjdChyY0NlbnRlciwgMi4wZiAvIDMuMGYpLCBjclRleHQpOwotICB9Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENQV0xfVXRpbHM6OkdldERyb3BCdXR0b25BcHBTdHJlYW0oY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNCQm94KSB7Ci0gIENGWF9CeXRlVGV4dEJ1ZiBzQXBwU3RyZWFtOwotCi0gIGlmICghcmNCQm94LklzRW1wdHkoKSkgewotICAgIHNBcHBTdHJlYW0gPDwgInFcbiIKLSAgICAgICAgICAgICAgIDw8IENQV0xfVXRpbHM6OkdldENvbG9yQXBwU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgIENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgMjIwLjBmIC8gMjU1LjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwLjBmIC8gMjU1LjBmLCAyMjAuMGYgLyAyNTUuMGYpLAotICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgIHNBcHBTdHJlYW0gPDwgcmNCQm94LmxlZnQgPDwgIiAiIDw8IHJjQkJveC5ib3R0b20gPDwgIiAiCi0gICAgICAgICAgICAgICA8PCByY0JCb3gucmlnaHQgLSByY0JCb3gubGVmdCA8PCAiICIKLSAgICAgICAgICAgICAgIDw8IHJjQkJveC50b3AgLSByY0JCb3guYm90dG9tIDw8ICIgcmUgZlxuIjsKLSAgICBzQXBwU3RyZWFtIDw8ICJRXG4iOwotCi0gICAgc0FwcFN0cmVhbSA8PCAicVxuIgotICAgICAgICAgICAgICAgPDwgQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgIHJjQkJveCwgMiwgQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMSksCi0gICAgICAgICAgICAgICAgICAgICAgQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMC41KSwgQm9yZGVyU3R5bGU6OkJFVkVMRUQsCi0gICAgICAgICAgICAgICAgICAgICAgQ1BXTF9EYXNoKDMsIDAsIDApKQotICAgICAgICAgICAgICAgPDwgIlFcbiI7Ci0KLSAgICBDRlhfUG9pbnRGIHB0Q2VudGVyID0gQ0ZYX1BvaW50RigocmNCQm94LmxlZnQgKyByY0JCb3gucmlnaHQpIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmNCQm94LnRvcCArIHJjQkJveC5ib3R0b20pIC8gMik7Ci0gICAgaWYgKElzRmxvYXRCaWdnZXIocmNCQm94LnJpZ2h0IC0gcmNCQm94LmxlZnQsIDYpICYmCi0gICAgICAgIElzRmxvYXRCaWdnZXIocmNCQm94LnRvcCAtIHJjQkJveC5ib3R0b20sIDYpKSB7Ci0gICAgICBzQXBwU3RyZWFtIDw8ICJxXG4iCi0gICAgICAgICAgICAgICAgIDw8ICIgMCBnXG4iOwotICAgICAgc0FwcFN0cmVhbSA8PCBwdENlbnRlci54IC0gMyA8PCAiICIgPDwgcHRDZW50ZXIueSArIDEuNWYgPDwgIiBtXG4iOwotICAgICAgc0FwcFN0cmVhbSA8PCBwdENlbnRlci54ICsgMyA8PCAiICIgPDwgcHRDZW50ZXIueSArIDEuNWYgPDwgIiBsXG4iOwotICAgICAgc0FwcFN0cmVhbSA8PCBwdENlbnRlci54IDw8ICIgIiA8PCBwdENlbnRlci55IC0gMS41ZiA8PCAiIGxcbiI7Ci0gICAgICBzQXBwU3RyZWFtIDw8IHB0Q2VudGVyLnggLSAzIDw8ICIgIiA8PCBwdENlbnRlci55ICsgMS41ZiA8PCAiIGwgZlxuIjsKLSAgICAgIHNBcHBTdHJlYW0gPDwgIlFcbiI7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHNBcHBTdHJlYW0uTWFrZVN0cmluZygpOwotfQotCi12b2lkIENQV0xfVXRpbHM6OkRyYXdGaWxsUmVjdChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NPTE9SUkVGJiBjb2xvcikgewotICBDRlhfUGF0aERhdGEgcGF0aDsKLSAgQ0ZYX0Zsb2F0UmVjdCByY1RlbXAocmVjdCk7Ci0gIHBhdGguQXBwZW5kUmVjdChyY1RlbXAubGVmdCwgcmNUZW1wLmJvdHRvbSwgcmNUZW1wLnJpZ2h0LCByY1RlbXAudG9wKTsKLSAgcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgbnVsbHB0ciwgY29sb3IsIDAsIEZYRklMTF9XSU5ESU5HKTsKLX0KLQotdm9pZCBDUFdMX1V0aWxzOjpEcmF3RmlsbEFyZWEoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYqIHBQdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NPTE9SUkVGJiBjb2xvcikgewotICBDRlhfUGF0aERhdGEgcGF0aDsKLSAgcGF0aC5BcHBlbmRQb2ludChwUHRzWzBdLCBGWFBUX1RZUEU6Ok1vdmVUbywgZmFsc2UpOwotICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBuQ291bnQ7IGkrKykKLSAgICBwYXRoLkFwcGVuZFBvaW50KHBQdHNbaV0sIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7Ci0KLSAgcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgbnVsbHB0ciwgY29sb3IsIDAsIEZYRklMTF9BTFRFUk5BVEUpOwotfQotCi12b2lkIENQV0xfVXRpbHM6OkRyYXdTdHJva2VSZWN0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ09MT1JSRUYmIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgpIHsKLSAgQ0ZYX1BhdGhEYXRhIHBhdGg7Ci0gIENGWF9GbG9hdFJlY3QgcmNUZW1wKHJlY3QpOwotICBwYXRoLkFwcGVuZFJlY3QocmNUZW1wLmxlZnQsIHJjVGVtcC5ib3R0b20sIHJjVGVtcC5yaWdodCwgcmNUZW1wLnRvcCk7Ci0KLSAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKLSAgZ3NkLm1fTGluZVdpZHRoID0gZldpZHRoOwotCi0gIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsICZnc2QsIDAsIGNvbG9yLCBGWEZJTExfQUxURVJOQVRFKTsKLX0KLQotdm9pZCBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0TW92ZVRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdExpbmVUbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ09MT1JSRUYmIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgpIHsKLSAgQ0ZYX1BhdGhEYXRhIHBhdGg7Ci0gIHBhdGguQXBwZW5kUG9pbnQocHRNb3ZlVG8sIEZYUFRfVFlQRTo6TW92ZVRvLCBmYWxzZSk7Ci0gIHBhdGguQXBwZW5kUG9pbnQocHRMaW5lVG8sIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7Ci0KLSAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKLSAgZ3NkLm1fTGluZVdpZHRoID0gZldpZHRoOwotCi0gIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsICZnc2QsIDAsIGNvbG9yLCBGWEZJTExfQUxURVJOQVRFKTsKLX0KLQotdm9pZCBDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblRyYW5zcGFyZW5jeSkgewotICBDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IuVG9GWENvbG9yKG5UcmFuc3BhcmVuY3kpKTsKLX0KLQotdm9pZCBDUFdMX1V0aWxzOjpEcmF3U2hhZG93KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlZlcnRpY2FsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkhvcml6b250YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblRyYW5zcGFyZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdGFydEdyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRW5kR3JheSkgewotICBGWF9GTE9BVCBmU3RlcEdyYXkgPSAxLjBmOwotCi0gIGlmIChiVmVydGljYWwpIHsKLSAgICBmU3RlcEdyYXkgPSAobkVuZEdyYXkgLSBuU3RhcnRHcmF5KSAvIHJlY3QuSGVpZ2h0KCk7Ci0KLSAgICBmb3IgKEZYX0ZMT0FUIGZ5ID0gcmVjdC5ib3R0b20gKyAwLjVmOyBmeSA8PSByZWN0LnRvcCAtIDAuNWY7IGZ5ICs9IDEuMGYpIHsKLSAgICAgIGludDMyX3QgbkdyYXkgPSBuU3RhcnRHcmF5ICsgKGludDMyX3QpKGZTdGVwR3JheSAqIChmeSAtIHJlY3QuYm90dG9tKSk7Ci0gICAgICBDUFdMX1V0aWxzOjpEcmF3U3Ryb2tlTGluZSgKLSAgICAgICAgICBwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIENGWF9Qb2ludEYocmVjdC5sZWZ0LCBmeSksCi0gICAgICAgICAgQ0ZYX1BvaW50RihyZWN0LnJpZ2h0LCBmeSksCi0gICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJlbmN5LCBuR3JheSwgbkdyYXksIG5HcmF5KSwgMS41Zik7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGJIb3Jpem9udGFsKSB7Ci0gICAgZlN0ZXBHcmF5ID0gKG5FbmRHcmF5IC0gblN0YXJ0R3JheSkgLyByZWN0LldpZHRoKCk7Ci0KLSAgICBmb3IgKEZYX0ZMT0FUIGZ4ID0gcmVjdC5sZWZ0ICsgMC41ZjsgZnggPD0gcmVjdC5yaWdodCAtIDAuNWY7IGZ4ICs9IDEuMGYpIHsKLSAgICAgIGludDMyX3QgbkdyYXkgPSBuU3RhcnRHcmF5ICsgKGludDMyX3QpKGZTdGVwR3JheSAqIChmeCAtIHJlY3QubGVmdCkpOwotICAgICAgQ1BXTF9VdGlsczo6RHJhd1N0cm9rZUxpbmUoCi0gICAgICAgICAgcERldmljZSwgcFVzZXIyRGV2aWNlLCBDRlhfUG9pbnRGKGZ4LCByZWN0LmJvdHRvbSksCi0gICAgICAgICAgQ0ZYX1BvaW50RihmeCwgcmVjdC50b3ApLAotICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyZW5jeSwgbkdyYXksIG5HcmF5LCBuR3JheSksIDEuNWYpOwotICAgIH0KLSAgfQotfQotCi12b2lkIENQV0xfVXRpbHM6OkRyYXdCb3JkZXIoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JMZWZ0VG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyUmlnaHRCb3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9yZGVyU3R5bGUgblN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblRyYW5zcGFyZW5jeSkgewotICBGWF9GTE9BVCBmTGVmdCA9IHJlY3QubGVmdDsKLSAgRlhfRkxPQVQgZlJpZ2h0ID0gcmVjdC5yaWdodDsKLSAgRlhfRkxPQVQgZlRvcCA9IHJlY3QudG9wOwotICBGWF9GTE9BVCBmQm90dG9tID0gcmVjdC5ib3R0b207Ci0KLSAgaWYgKGZXaWR0aCA+IDAuMGYpIHsKLSAgICBGWF9GTE9BVCBmSGFsZldpZHRoID0gZldpZHRoIC8gMi4wZjsKLQotICAgIHN3aXRjaCAoblN0eWxlKSB7Ci0gICAgICBkZWZhdWx0OgotICAgICAgY2FzZSBCb3JkZXJTdHlsZTo6U09MSUQ6IHsKLSAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7Ci0gICAgICAgIHBhdGguQXBwZW5kUmVjdChmTGVmdCwgZkJvdHRvbSwgZlJpZ2h0LCBmVG9wKTsKLSAgICAgICAgcGF0aC5BcHBlbmRSZWN0KGZMZWZ0ICsgZldpZHRoLCBmQm90dG9tICsgZldpZHRoLCBmUmlnaHQgLSBmV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBmVG9wIC0gZldpZHRoKTsKLSAgICAgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IuVG9GWENvbG9yKG5UcmFuc3BhcmVuY3kpLCAwLCBGWEZJTExfQUxURVJOQVRFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEJvcmRlclN0eWxlOjpEQVNIOiB7Ci0gICAgICAgIENGWF9QYXRoRGF0YSBwYXRoOwotICAgICAgICBwYXRoLkFwcGVuZFBvaW50KAotICAgICAgICAgICAgQ0ZYX1BvaW50RihmTGVmdCArIGZXaWR0aCAvIDIuMGYsIGZCb3R0b20gKyBmV2lkdGggLyAyLjBmKSwKLSAgICAgICAgICAgIEZYUFRfVFlQRTo6TW92ZVRvLCBmYWxzZSk7Ci0gICAgICAgIHBhdGguQXBwZW5kUG9pbnQoCi0gICAgICAgICAgICBDRlhfUG9pbnRGKGZMZWZ0ICsgZldpZHRoIC8gMi4wZiwgZlRvcCAtIGZXaWR0aCAvIDIuMGYpLAotICAgICAgICAgICAgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKLSAgICAgICAgcGF0aC5BcHBlbmRQb2ludCgKLSAgICAgICAgICAgIENGWF9Qb2ludEYoZlJpZ2h0IC0gZldpZHRoIC8gMi4wZiwgZlRvcCAtIGZXaWR0aCAvIDIuMGYpLAotICAgICAgICAgICAgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKLSAgICAgICAgcGF0aC5BcHBlbmRQb2ludCgKLSAgICAgICAgICAgIENGWF9Qb2ludEYoZlJpZ2h0IC0gZldpZHRoIC8gMi4wZiwgZkJvdHRvbSArIGZXaWR0aCAvIDIuMGYpLAotICAgICAgICAgICAgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKLSAgICAgICAgcGF0aC5BcHBlbmRQb2ludCgKLSAgICAgICAgICAgIENGWF9Qb2ludEYoZkxlZnQgKyBmV2lkdGggLyAyLjBmLCBmQm90dG9tICsgZldpZHRoIC8gMi4wZiksCi0gICAgICAgICAgICBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOwotCi0gICAgICAgIENGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7Ci0gICAgICAgIGdzZC5TZXREYXNoQ291bnQoMik7Ci0gICAgICAgIGdzZC5tX0Rhc2hBcnJheVswXSA9IDMuMGY7Ci0gICAgICAgIGdzZC5tX0Rhc2hBcnJheVsxXSA9IDMuMGY7Ci0gICAgICAgIGdzZC5tX0Rhc2hQaGFzZSA9IDA7Ci0KLSAgICAgICAgZ3NkLm1fTGluZVdpZHRoID0gZldpZHRoOwotICAgICAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgcFVzZXIyRGV2aWNlLCAmZ3NkLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvci5Ub0ZYQ29sb3IoblRyYW5zcGFyZW5jeSksIEZYRklMTF9XSU5ESU5HKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEJvcmRlclN0eWxlOjpCRVZFTEVEOgotICAgICAgY2FzZSBCb3JkZXJTdHlsZTo6SU5TRVQ6IHsKLSAgICAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdzZDsKLSAgICAgICAgZ3NkLm1fTGluZVdpZHRoID0gZkhhbGZXaWR0aDsKLQotICAgICAgICBDRlhfUGF0aERhdGEgcGF0aExUOwotCi0gICAgICAgIHBhdGhMVC5BcHBlbmRQb2ludChDRlhfUG9pbnRGKGZMZWZ0ICsgZkhhbGZXaWR0aCwgZkJvdHRvbSArIGZIYWxmV2lkdGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9UWVBFOjpNb3ZlVG8sIGZhbHNlKTsKLSAgICAgICAgcGF0aExULkFwcGVuZFBvaW50KENGWF9Qb2ludEYoZkxlZnQgKyBmSGFsZldpZHRoLCBmVG9wIC0gZkhhbGZXaWR0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOwotICAgICAgICBwYXRoTFQuQXBwZW5kUG9pbnQoQ0ZYX1BvaW50RihmUmlnaHQgLSBmSGFsZldpZHRoLCBmVG9wIC0gZkhhbGZXaWR0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOwotICAgICAgICBwYXRoTFQuQXBwZW5kUG9pbnQoCi0gICAgICAgICAgICBDRlhfUG9pbnRGKGZSaWdodCAtIGZIYWxmV2lkdGggKiAyLCBmVG9wIC0gZkhhbGZXaWR0aCAqIDIpLAotICAgICAgICAgICAgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKLSAgICAgICAgcGF0aExULkFwcGVuZFBvaW50KAotICAgICAgICAgICAgQ0ZYX1BvaW50RihmTGVmdCArIGZIYWxmV2lkdGggKiAyLCBmVG9wIC0gZkhhbGZXaWR0aCAqIDIpLAotICAgICAgICAgICAgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKLSAgICAgICAgcGF0aExULkFwcGVuZFBvaW50KAotICAgICAgICAgICAgQ0ZYX1BvaW50RihmTGVmdCArIGZIYWxmV2lkdGggKiAyLCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIpLAotICAgICAgICAgICAgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKLSAgICAgICAgcGF0aExULkFwcGVuZFBvaW50KENGWF9Qb2ludEYoZkxlZnQgKyBmSGFsZldpZHRoLCBmQm90dG9tICsgZkhhbGZXaWR0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOwotCi0gICAgICAgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoTFQsIHBVc2VyMkRldmljZSwgJmdzZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY3JMZWZ0VG9wLlRvRlhDb2xvcihuVHJhbnNwYXJlbmN5KSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX0FMVEVSTkFURSk7Ci0KLSAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGhSQjsKLSAgICAgICAgcGF0aFJCLkFwcGVuZFBvaW50KENGWF9Qb2ludEYoZlJpZ2h0IC0gZkhhbGZXaWR0aCwgZlRvcCAtIGZIYWxmV2lkdGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9UWVBFOjpNb3ZlVG8sIGZhbHNlKTsKLSAgICAgICAgcGF0aFJCLkFwcGVuZFBvaW50KAotICAgICAgICAgICAgQ0ZYX1BvaW50RihmUmlnaHQgLSBmSGFsZldpZHRoLCBmQm90dG9tICsgZkhhbGZXaWR0aCksCi0gICAgICAgICAgICBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOwotICAgICAgICBwYXRoUkIuQXBwZW5kUG9pbnQoQ0ZYX1BvaW50RihmTGVmdCArIGZIYWxmV2lkdGgsIGZCb3R0b20gKyBmSGFsZldpZHRoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7Ci0gICAgICAgIHBhdGhSQi5BcHBlbmRQb2ludCgKLSAgICAgICAgICAgIENGWF9Qb2ludEYoZkxlZnQgKyBmSGFsZldpZHRoICogMiwgZkJvdHRvbSArIGZIYWxmV2lkdGggKiAyKSwKLSAgICAgICAgICAgIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7Ci0gICAgICAgIHBhdGhSQi5BcHBlbmRQb2ludCgKLSAgICAgICAgICAgIENGWF9Qb2ludEYoZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIsIGZCb3R0b20gKyBmSGFsZldpZHRoICogMiksCi0gICAgICAgICAgICBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOwotICAgICAgICBwYXRoUkIuQXBwZW5kUG9pbnQoCi0gICAgICAgICAgICBDRlhfUG9pbnRGKGZSaWdodCAtIGZIYWxmV2lkdGggKiAyLCBmVG9wIC0gZkhhbGZXaWR0aCAqIDIpLAotICAgICAgICAgICAgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKLSAgICAgICAgcGF0aFJCLkFwcGVuZFBvaW50KENGWF9Qb2ludEYoZlJpZ2h0IC0gZkhhbGZXaWR0aCwgZlRvcCAtIGZIYWxmV2lkdGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKLQotICAgICAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aFJCLCBwVXNlcjJEZXZpY2UsICZnc2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNyUmlnaHRCb3R0b20uVG9GWENvbG9yKG5UcmFuc3BhcmVuY3kpLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfQUxURVJOQVRFKTsKLQotICAgICAgICBDRlhfUGF0aERhdGEgcGF0aDsKLQotICAgICAgICBwYXRoLkFwcGVuZFJlY3QoZkxlZnQsIGZCb3R0b20sIGZSaWdodCwgZlRvcCk7Ci0gICAgICAgIHBhdGguQXBwZW5kUmVjdChmTGVmdCArIGZIYWxmV2lkdGgsIGZCb3R0b20gKyBmSGFsZldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgZlJpZ2h0IC0gZkhhbGZXaWR0aCwgZlRvcCAtIGZIYWxmV2lkdGgpOwotCi0gICAgICAgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBwVXNlcjJEZXZpY2UsICZnc2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yLlRvRlhDb2xvcihuVHJhbnNwYXJlbmN5KSwgMCwgRlhGSUxMX0FMVEVSTkFURSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBCb3JkZXJTdHlsZTo6VU5ERVJMSU5FOiB7Ci0gICAgICAgIENGWF9QYXRoRGF0YSBwYXRoOwotICAgICAgICBwYXRoLkFwcGVuZFBvaW50KENGWF9Qb2ludEYoZkxlZnQsIGZCb3R0b20gKyBmV2lkdGggLyAyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGWFBUX1RZUEU6Ok1vdmVUbywgZmFsc2UpOwotICAgICAgICBwYXRoLkFwcGVuZFBvaW50KENGWF9Qb2ludEYoZlJpZ2h0LCBmQm90dG9tICsgZldpZHRoIC8gMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKLQotICAgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOwotICAgICAgICBnc2QubV9MaW5lV2lkdGggPSBmV2lkdGg7Ci0KLSAgICAgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGgsIHBVc2VyMkRldmljZSwgJmdzZCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IuVG9GWENvbG9yKG5UcmFuc3BhcmVuY3kpLCBGWEZJTExfQUxURVJOQVRFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9VdGlscy5oIGIvZnBkZnNkay9wZGZ3aW5kb3cvUFdMX1V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZWNjMTkuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9wZGZ3aW5kb3cvUFdMX1V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZQREZTREtfUERGV0lORE9XX1BXTF9VVElMU19IXwotI2RlZmluZSBGUERGU0RLX1BERldJTkRPV19QV0xfVVRJTFNfSF8KLQotI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcHZ0X3dvcmRyYW5nZS5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9XbmQuaCIKLQotY2xhc3MgQ0ZYX0VkaXQ7Ci1zdHJ1Y3QgQ1BXTF9Db2xvcjsKLQotI2RlZmluZSBQV0xfTUFLRURXT1JEKGxvdywgaGlnaCkgXAotICAoKHVpbnQzMl90KSgodWludDE2X3QpKGxvdykgfCAodWludDMyX3QpKCgodWludDE2X3QpKGhpZ2gpKSA8PCAxNikpKQotCi0vLyBjaGVja2JveCAmIHJhZGlvYnV0dG9uIHN0eWxlCi0jZGVmaW5lIFBDU19DSEVDSyAwCi0jZGVmaW5lIFBDU19DSVJDTEUgMQotI2RlZmluZSBQQ1NfQ1JPU1MgMgotI2RlZmluZSBQQ1NfRElBTU9ORCAzCi0jZGVmaW5lIFBDU19TUVVBUkUgNAotI2RlZmluZSBQQ1NfU1RBUiA1Ci0KLS8vIHB1c2hidXR0b24gbGF5b3V0IHN0eWxlCi0jZGVmaW5lIFBQQkxfTEFCRUwgMAotI2RlZmluZSBQUEJMX0lDT04gMQotI2RlZmluZSBQUEJMX0lDT05UT1BMQUJFTEJPVFRPTSAyCi0jZGVmaW5lIFBQQkxfTEFCRUxUT1BJQ09OQk9UVE9NIDMKLSNkZWZpbmUgUFBCTF9JQ09OTEVGVExBQkVMUklHSFQgNAotI2RlZmluZSBQUEJMX0xBQkVMTEVGVElDT05SSUdIVCA1Ci0jZGVmaW5lIFBQQkxfTEFCRUxPVkVSSUNPTiA2Ci0KLWNsYXNzIENQV0xfVXRpbHMgewotIHB1YmxpYzoKLSAgc3RhdGljIENGWF9GbG9hdFJlY3QgSW5mbGF0ZVJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNSZWN0LCBGWF9GTE9BVCBmU2l6ZSk7Ci0gIHN0YXRpYyBDRlhfRmxvYXRSZWN0IERlZmxhdGVSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjUmVjdCwgRlhfRkxPQVQgZlNpemUpOwotCi0gIHN0YXRpYyBDUFZUX1dvcmRSYW5nZSBPdmVybGFwV29yZFJhbmdlKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cjIpOwotICBzdGF0aWMgQ0ZYX0Zsb2F0UmVjdCBHZXRDZW50ZXJTcXVhcmUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCk7Ci0KLSAgc3RhdGljIENGWF9GbG9hdFJlY3QgT2Zmc2V0UmVjdChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSk7Ci0KLSAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldENvbG9yQXBwU3RyZWFtKGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9vbCYgYkZpbGxPclN0cm9rZSA9IHRydWUpOwotICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0Qm9yZGVyQXBwU3RyZWFtKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyTGVmdFRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclJpZ2h0Qm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvcmRlclN0eWxlIG5TdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0Rhc2gmIGRhc2gpOwotICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2lyY2xlQm9yZGVyQXBwU3RyZWFtKAotICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwKLSAgICAgIEZYX0ZMT0FUIGZXaWR0aCwKLSAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yLAotICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JMZWZ0VG9wLAotICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JSaWdodEJvdHRvbSwKLSAgICAgIEJvcmRlclN0eWxlIG5TdHlsZSwKLSAgICAgIGNvbnN0IENQV0xfRGFzaCYgZGFzaCk7Ci0gIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRSZWN0RmlsbEFwcFN0cmVhbShjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOwotICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2lyY2xlRmlsbEFwcFN0cmVhbShjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7Ci0gIHN0YXRpYyBDRlhfQnl0ZVN0cmluZyBHZXRQdXNoQnV0dG9uQXBwU3RyZWFtKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjQkJveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBWVF9Gb250TWFwKiBwRm9udE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9TdHJlYW0qIHBJY29uU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ljb25GaXQmIEljb25GaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzTGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MYXlPdXQpOwotICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2hlY2tCb3hBcHBTdHJlYW0oY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNCQm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclRleHQpOwotICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0UmFkaW9CdXR0b25BcHBTdHJlYW0oY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNCQm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclRleHQpOwotICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0RWRpdEFwcFN0cmVhbShDRlhfRWRpdCogcEVkaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSogcFJhbmdlID0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ29udGludW91cyA9IHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFN1YldvcmQgPSAwKTsKLSAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEVkaXRTZWxBcHBTdHJlYW0oCi0gICAgICBDRlhfRWRpdCogcEVkaXQsCi0gICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdE9mZnNldCwKLSAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UgPSBudWxscHRyKTsKLSAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldERyb3BCdXR0b25BcHBTdHJlYW0oY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNCQm94KTsKLQotICBzdGF0aWMgdm9pZCBEcmF3RmlsbFJlY3QoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblRyYW5zcGFyZW5jeSk7Ci0gIHN0YXRpYyB2b2lkIERyYXdGaWxsUmVjdChDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NPTE9SUkVGJiBjb2xvcik7Ci0gIHN0YXRpYyB2b2lkIERyYXdTdHJva2VSZWN0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ09MT1JSRUYmIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgpOwotICBzdGF0aWMgdm9pZCBEcmF3U3Ryb2tlTGluZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0TW92ZVRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdExpbmVUbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ09MT1JSRUYmIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgpOwotICBzdGF0aWMgdm9pZCBEcmF3Qm9yZGVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfQ29sb3ImIGNyTGVmdFRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclJpZ2h0Qm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJvcmRlclN0eWxlIG5TdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5UcmFuc3BhcmVuY3kpOwotICBzdGF0aWMgdm9pZCBEcmF3RmlsbEFyZWEoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYqIHBQdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NPTE9SUkVGJiBjb2xvcik7Ci0gIHN0YXRpYyB2b2lkIERyYXdTaGFkb3coQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVmVydGljYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSG9yaXpvbnRhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRmxvYXRSZWN0IHJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuVHJhbnNwYXJlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0R3JheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5FbmRHcmF5KTsKLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBDRlhfRmxvYXRSZWN0IFNjYWxlUmVjdChjb25zdCBDRlhfRmxvYXRSZWN0JiByY1JlY3QsIEZYX0ZMT0FUIGZTY2FsZSk7Ci0KLSAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEFwcFN0cmVhbV9DaGVjayhjb25zdCBDRlhfRmxvYXRSZWN0JiByY0JCb3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KTsKLSAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEFwcFN0cmVhbV9DaXJjbGUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNCQm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclRleHQpOwotICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0QXBwU3RyZWFtX0Nyb3NzKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjQkJveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclRleHQpOwotICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0QXBwU3RyZWFtX0RpYW1vbmQoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNCQm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KTsKLSAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEFwcFN0cmVhbV9TcXVhcmUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNCQm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFdMX0NvbG9yJiBjclRleHQpOwotICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0QXBwU3RyZWFtX1N0YXIoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNCQm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9Db2xvciYgY3JUZXh0KTsKLQotICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0QVBfQ2hlY2soY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgY3JCQm94KTsKLSAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEFQX0NpcmNsZShjb25zdCBDRlhfRmxvYXRSZWN0JiBjckJCb3gpOwotICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0QVBfQ3Jvc3MoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgY3JCQm94KTsKLSAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEFQX0RpYW1vbmQoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgY3JCQm94KTsKLSAgc3RhdGljIENGWF9CeXRlU3RyaW5nIEdldEFQX1NxdWFyZShjb25zdCBDRlhfRmxvYXRSZWN0JiBjckJCb3gpOwotICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0QVBfU3Rhcihjb25zdCBDRlhfRmxvYXRSZWN0JiBjckJCb3gpOwotICBzdGF0aWMgQ0ZYX0J5dGVTdHJpbmcgR2V0QVBfSGFsZkNpcmNsZShjb25zdCBDRlhfRmxvYXRSZWN0JiBjckJCb3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZSb3RhdGUpOwotfTsKLQotI2VuZGlmICAvLyBGUERGU0RLX1BERldJTkRPV19QV0xfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9XbmQuY3BwIGIvZnBkZnNkay9wZGZ3aW5kb3cvUFdMX1duZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MDI0ZGQuLjAwMDAwMDAKLS0tIGEvZnBkZnNkay9wZGZ3aW5kb3cvUFdMX1duZC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfVXRpbHMuaCIKLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfV25kLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKLQotc3RhdGljIHN0ZDo6bWFwPGludDMyX3QsIENQV0xfVGltZXIqPiYgR2V0UFdMVGltZU1hcCgpIHsKLSAgLy8gTGVhayB0aGUgb2JqZWN0IGF0IHNodXRkb3duLgotICBzdGF0aWMgYXV0byB0aW1lTWFwID0gbmV3IHN0ZDo6bWFwPGludDMyX3QsIENQV0xfVGltZXIqPjsKLSAgcmV0dXJuICp0aW1lTWFwOwotfQotCi1QV0xfQ1JFQVRFUEFSQU06OlBXTF9DUkVBVEVQQVJBTSgpCi0gICAgOiByY1JlY3RXbmQoMCwgMCwgMCwgMCksCi0gICAgICBwU3lzdGVtSGFuZGxlcihudWxscHRyKSwKLSAgICAgIHBGb250TWFwKG51bGxwdHIpLAotICAgICAgcFByb3ZpZGVyKG51bGxwdHIpLAotICAgICAgcEZvY3VzSGFuZGxlcihudWxscHRyKSwKLSAgICAgIGR3RmxhZ3MoMCksCi0gICAgICBzQmFja2dyb3VuZENvbG9yKCksCi0gICAgICBwQXR0YWNoZWRXaWRnZXQobnVsbHB0ciksCi0gICAgICBuQm9yZGVyU3R5bGUoQm9yZGVyU3R5bGU6OlNPTElEKSwKLSAgICAgIGR3Qm9yZGVyV2lkdGgoMSksCi0gICAgICBzQm9yZGVyQ29sb3IoKSwKLSAgICAgIHNUZXh0Q29sb3IoKSwKLSAgICAgIG5UcmFuc3BhcmVuY3koMjU1KSwKLSAgICAgIGZGb250U2l6ZShQV0xfREVGQVVMVF9GT05UU0laRSksCi0gICAgICBzRGFzaCgzLCAwLCAwKSwKLSAgICAgIHBBdHRhY2hlZERhdGEobnVsbHB0ciksCi0gICAgICBwUGFyZW50V25kKG51bGxwdHIpLAotICAgICAgcE1zZ0NvbnRyb2wobnVsbHB0ciksCi0gICAgICBlQ3Vyc29yVHlwZShGWENUX0FSUk9XKSwKLSAgICAgIG10Q2hpbGQoMSwgMCwgMCwgMSwgMCwgMCkge30KLQotUFdMX0NSRUFURVBBUkFNOjpQV0xfQ1JFQVRFUEFSQU0oY29uc3QgUFdMX0NSRUFURVBBUkFNJiBvdGhlcikgPSBkZWZhdWx0OwotCi1DUFdMX1RpbWVyOjpDUFdMX1RpbWVyKENQV0xfVGltZXJIYW5kbGVyKiBwQXR0YWNoZWQsCi0gICAgICAgICAgICAgICAgICAgICAgIENGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlcikKLSAgICA6IG1fblRpbWVySUQoMCksIG1fcEF0dGFjaGVkKHBBdHRhY2hlZCksIG1fcFN5c3RlbUhhbmRsZXIocFN5c3RlbUhhbmRsZXIpIHsKLSAgQVNTRVJUKG1fcEF0dGFjaGVkKTsKLSAgQVNTRVJUKG1fcFN5c3RlbUhhbmRsZXIpOwotfQotCi1DUFdMX1RpbWVyOjp+Q1BXTF9UaW1lcigpIHsKLSAgS2lsbFBXTFRpbWVyKCk7Ci19Ci0KLWludDMyX3QgQ1BXTF9UaW1lcjo6U2V0UFdMVGltZXIoaW50MzJfdCBuRWxhcHNlKSB7Ci0gIGlmIChtX25UaW1lcklEICE9IDApCi0gICAgS2lsbFBXTFRpbWVyKCk7Ci0gIG1fblRpbWVySUQgPSBtX3BTeXN0ZW1IYW5kbGVyLT5TZXRUaW1lcihuRWxhcHNlLCBUaW1lclByb2MpOwotCi0gIEdldFBXTFRpbWVNYXAoKVttX25UaW1lcklEXSA9IHRoaXM7Ci0gIHJldHVybiBtX25UaW1lcklEOwotfQotCi12b2lkIENQV0xfVGltZXI6OktpbGxQV0xUaW1lcigpIHsKLSAgaWYgKG1fblRpbWVySUQgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgbV9wU3lzdGVtSGFuZGxlci0+S2lsbFRpbWVyKG1fblRpbWVySUQpOwotICBHZXRQV0xUaW1lTWFwKCkuZXJhc2UobV9uVGltZXJJRCk7Ci0gIG1fblRpbWVySUQgPSAwOwotfQotCi12b2lkIENQV0xfVGltZXI6OlRpbWVyUHJvYyhpbnQzMl90IGlkRXZlbnQpIHsKLSAgYXV0byBpdCA9IEdldFBXTFRpbWVNYXAoKS5maW5kKGlkRXZlbnQpOwotICBpZiAoaXQgPT0gR2V0UFdMVGltZU1hcCgpLmVuZCgpKQotICAgIHJldHVybjsKLQotICBDUFdMX1RpbWVyKiBwVGltZXIgPSBpdC0+c2Vjb25kOwotICBpZiAocFRpbWVyLT5tX3BBdHRhY2hlZCkKLSAgICBwVGltZXItPm1fcEF0dGFjaGVkLT5UaW1lclByb2MoKTsKLX0KLQotQ1BXTF9UaW1lckhhbmRsZXI6OkNQV0xfVGltZXJIYW5kbGVyKCkge30KLQotQ1BXTF9UaW1lckhhbmRsZXI6On5DUFdMX1RpbWVySGFuZGxlcigpIHt9Ci0KLXZvaWQgQ1BXTF9UaW1lckhhbmRsZXI6OkJlZ2luVGltZXIoaW50MzJfdCBuRWxhcHNlKSB7Ci0gIGlmICghbV9wVGltZXIpCi0gICAgbV9wVGltZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BXTF9UaW1lcj4odGhpcywgR2V0U3lzdGVtSGFuZGxlcigpKTsKLQotICBtX3BUaW1lci0+U2V0UFdMVGltZXIobkVsYXBzZSk7Ci19Ci0KLXZvaWQgQ1BXTF9UaW1lckhhbmRsZXI6OkVuZFRpbWVyKCkgewotICBpZiAobV9wVGltZXIpCi0gICAgbV9wVGltZXItPktpbGxQV0xUaW1lcigpOwotfQotCi12b2lkIENQV0xfVGltZXJIYW5kbGVyOjpUaW1lclByb2MoKSB7fQotCi1jbGFzcyBDUFdMX01zZ0NvbnRyb2wgewotICBmcmllbmQgY2xhc3MgQ1BXTF9XbmQ7Ci0KLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENQV0xfTXNnQ29udHJvbChDUFdMX1duZCogcFduZCkgewotICAgIG1fcENyZWF0ZWRXbmQgPSBwV25kOwotICAgIERlZmF1bHQoKTsKLSAgfQotCi0gIH5DUFdMX01zZ0NvbnRyb2woKSB7IERlZmF1bHQoKTsgfQotCi0gIHZvaWQgRGVmYXVsdCgpIHsKLSAgICBtX2FNb3VzZVBhdGguY2xlYXIoKTsKLSAgICBtX2FLZXlib2FyZFBhdGguY2xlYXIoKTsKLSAgICBtX3BNYWluTW91c2VXbmQgPSBudWxscHRyOwotICAgIG1fcE1haW5LZXlib2FyZFduZCA9IG51bGxwdHI7Ci0gIH0KLQotICBib29sIElzV25kQ3JlYXRlZChjb25zdCBDUFdMX1duZCogcFduZCkgY29uc3QgewotICAgIHJldHVybiBtX3BDcmVhdGVkV25kID09IHBXbmQ7Ci0gIH0KLQotICBib29sIElzTWFpbkNhcHR1cmVNb3VzZShjb25zdCBDUFdMX1duZCogcFduZCkgY29uc3QgewotICAgIHJldHVybiBwV25kID09IG1fcE1haW5Nb3VzZVduZDsKLSAgfQotCi0gIGJvb2wgSXNXbmRDYXB0dXJlTW91c2UoY29uc3QgQ1BXTF9XbmQqIHBXbmQpIGNvbnN0IHsKLSAgICByZXR1cm4gcFduZCAmJiBwZGZpdW06OkNvbnRhaW5zVmFsdWUobV9hTW91c2VQYXRoLCBwV25kKTsKLSAgfQotCi0gIGJvb2wgSXNNYWluQ2FwdHVyZUtleWJvYXJkKGNvbnN0IENQV0xfV25kKiBwV25kKSBjb25zdCB7Ci0gICAgcmV0dXJuIHBXbmQgPT0gbV9wTWFpbktleWJvYXJkV25kOwotICB9Ci0KLSAgYm9vbCBJc1duZENhcHR1cmVLZXlib2FyZChjb25zdCBDUFdMX1duZCogcFduZCkgY29uc3QgewotICAgIHJldHVybiBwV25kICYmIHBkZml1bTo6Q29udGFpbnNWYWx1ZShtX2FLZXlib2FyZFBhdGgsIHBXbmQpOwotICB9Ci0KLSAgdm9pZCBTZXRGb2N1cyhDUFdMX1duZCogcFduZCkgewotICAgIG1fYUtleWJvYXJkUGF0aC5jbGVhcigpOwotICAgIGlmIChwV25kKSB7Ci0gICAgICBtX3BNYWluS2V5Ym9hcmRXbmQgPSBwV25kOwotICAgICAgQ1BXTF9XbmQqIHBQYXJlbnQgPSBwV25kOwotICAgICAgd2hpbGUgKHBQYXJlbnQpIHsKLSAgICAgICAgbV9hS2V5Ym9hcmRQYXRoLnB1c2hfYmFjayhwUGFyZW50KTsKLSAgICAgICAgcFBhcmVudCA9IHBQYXJlbnQtPkdldFBhcmVudFdpbmRvdygpOwotICAgICAgfQotICAgICAgcFduZC0+T25TZXRGb2N1cygpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgS2lsbEZvY3VzKCkgewotICAgIGlmICghbV9hS2V5Ym9hcmRQYXRoLmVtcHR5KCkpCi0gICAgICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBtX2FLZXlib2FyZFBhdGhbMF0pCi0gICAgICAgIHBXbmQtPk9uS2lsbEZvY3VzKCk7Ci0KLSAgICBtX3BNYWluS2V5Ym9hcmRXbmQgPSBudWxscHRyOwotICAgIG1fYUtleWJvYXJkUGF0aC5jbGVhcigpOwotICB9Ci0KLSAgdm9pZCBTZXRDYXB0dXJlKENQV0xfV25kKiBwV25kKSB7Ci0gICAgbV9hTW91c2VQYXRoLmNsZWFyKCk7Ci0gICAgaWYgKHBXbmQpIHsKLSAgICAgIG1fcE1haW5Nb3VzZVduZCA9IHBXbmQ7Ci0gICAgICBDUFdMX1duZCogcFBhcmVudCA9IHBXbmQ7Ci0gICAgICB3aGlsZSAocFBhcmVudCkgewotICAgICAgICBtX2FNb3VzZVBhdGgucHVzaF9iYWNrKHBQYXJlbnQpOwotICAgICAgICBwUGFyZW50ID0gcFBhcmVudC0+R2V0UGFyZW50V2luZG93KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBSZWxlYXNlQ2FwdHVyZSgpIHsKLSAgICBtX3BNYWluTW91c2VXbmQgPSBudWxscHRyOwotICAgIG1fYU1vdXNlUGF0aC5jbGVhcigpOwotICB9Ci0KLSBwcml2YXRlOgotICBzdGQ6OnZlY3RvcjxDUFdMX1duZCo+IG1fYU1vdXNlUGF0aDsKLSAgc3RkOjp2ZWN0b3I8Q1BXTF9XbmQqPiBtX2FLZXlib2FyZFBhdGg7Ci0gIENQV0xfV25kKiBtX3BDcmVhdGVkV25kOwotICBDUFdMX1duZCogbV9wTWFpbk1vdXNlV25kOwotICBDUFdMX1duZCogbV9wTWFpbktleWJvYXJkV25kOwotfTsKLQotQ1BXTF9XbmQ6OkNQV0xfV25kKCkKLSAgICA6IG1fcFZTY3JvbGxCYXIobnVsbHB0ciksCi0gICAgICBtX3JjV2luZG93KCksCi0gICAgICBtX3JjQ2xpcCgpLAotICAgICAgbV9iQ3JlYXRlZChmYWxzZSksCi0gICAgICBtX2JWaXNpYmxlKGZhbHNlKSwKLSAgICAgIG1fYk5vdGlmeWluZyhmYWxzZSksCi0gICAgICBtX2JFbmFibGVkKHRydWUpIHt9Ci0KLUNQV0xfV25kOjp+Q1BXTF9XbmQoKSB7Ci0gIEFTU0VSVChtX2JDcmVhdGVkID09IGZhbHNlKTsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgQ1BXTF9XbmQ6OkdldENsYXNzTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuICJDUFdMX1duZCI7Ci19Ci0KLXZvaWQgQ1BXTF9XbmQ6OkNyZWF0ZShjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKSB7Ci0gIGlmICghSXNWYWxpZCgpKSB7Ci0gICAgbV9zUHJpdmF0ZVBhcmFtID0gY3A7Ci0KLSAgICBPbkNyZWF0ZShtX3NQcml2YXRlUGFyYW0pOwotCi0gICAgbV9zUHJpdmF0ZVBhcmFtLnJjUmVjdFduZC5Ob3JtYWxpemUoKTsKLSAgICBtX3JjV2luZG93ID0gbV9zUHJpdmF0ZVBhcmFtLnJjUmVjdFduZDsKLSAgICBtX3JjQ2xpcCA9IENQV0xfVXRpbHM6OkluZmxhdGVSZWN0KG1fcmNXaW5kb3csIDEuMGYpOwotCi0gICAgQ3JlYXRlTXNnQ29udHJvbCgpOwotCi0gICAgaWYgKG1fc1ByaXZhdGVQYXJhbS5wUGFyZW50V25kKQotICAgICAgbV9zUHJpdmF0ZVBhcmFtLnBQYXJlbnRXbmQtPk9uTm90aWZ5KHRoaXMsIFBOTV9BRERDSElMRCk7Ci0KLSAgICBQV0xfQ1JFQVRFUEFSQU0gY2NwID0gbV9zUHJpdmF0ZVBhcmFtOwotCi0gICAgY2NwLmR3RmxhZ3MgJj0gMHhGRkZGMDAwMEw7ICAvLyByZW1vdmUgc3ViIHN0eWxlcwotICAgIGNjcC5tdENoaWxkID0gQ0ZYX01hdHJpeCgxLCAwLCAwLCAxLCAwLCAwKTsKLQotICAgIENyZWF0ZVNjcm9sbEJhcihjY3ApOwotICAgIENyZWF0ZUNoaWxkV25kKGNjcCk7Ci0KLSAgICBtX2JWaXNpYmxlID0gSGFzRmxhZyhQV1NfVklTSUJMRSk7Ci0KLSAgICBPbkNyZWF0ZWQoKTsKLQotICAgIFJlUG9zQ2hpbGRXbmQoKTsKLSAgICBtX2JDcmVhdGVkID0gdHJ1ZTsKLSAgfQotfQotCi12b2lkIENQV0xfV25kOjpPbkNyZWF0ZShQV0xfQ1JFQVRFUEFSQU0mIGNwKSB7fQotCi12b2lkIENQV0xfV25kOjpPbkNyZWF0ZWQoKSB7fQotCi12b2lkIENQV0xfV25kOjpPbkRlc3Ryb3koKSB7fQotCi12b2lkIENQV0xfV25kOjpJbnZhbGlkYXRlRm9jdXNIYW5kbGVyKElQV0xfRm9jdXNIYW5kbGVyKiBoYW5kbGVyKSB7Ci0gIGlmIChtX3NQcml2YXRlUGFyYW0ucEZvY3VzSGFuZGxlciA9PSBoYW5kbGVyKQotICAgIG1fc1ByaXZhdGVQYXJhbS5wRm9jdXNIYW5kbGVyID0gbnVsbHB0cjsKLX0KLQotdm9pZCBDUFdMX1duZDo6SW52YWxpZGF0ZVByb3ZpZGVyKElQV0xfUHJvdmlkZXIqIHByb3ZpZGVyKSB7Ci0gIGlmIChtX3NQcml2YXRlUGFyYW0ucFByb3ZpZGVyLkdldCgpID09IHByb3ZpZGVyKQotICAgIG1fc1ByaXZhdGVQYXJhbS5wUHJvdmlkZXIuUmVzZXQoKTsKLX0KLQotdm9pZCBDUFdMX1duZDo6RGVzdHJveSgpIHsKLSAgS2lsbEZvY3VzKCk7Ci0gIE9uRGVzdHJveSgpOwotICBpZiAobV9iQ3JlYXRlZCkgewotICAgIGZvciAoYXV0byBpdCA9IG1fQ2hpbGRyZW4ucmJlZ2luKCk7IGl0ICE9IG1fQ2hpbGRyZW4ucmVuZCgpOyArK2l0KSB7Ci0gICAgICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9ICppdCkgewotICAgICAgICAqaXQgPSBudWxscHRyOwotICAgICAgICBwQ2hpbGQtPkRlc3Ryb3koKTsKLSAgICAgICAgZGVsZXRlIHBDaGlsZDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fc1ByaXZhdGVQYXJhbS5wUGFyZW50V25kKQotICAgICAgbV9zUHJpdmF0ZVBhcmFtLnBQYXJlbnRXbmQtPk9uTm90aWZ5KHRoaXMsIFBOTV9SRU1PVkVDSElMRCk7Ci0KLSAgICBtX2JDcmVhdGVkID0gZmFsc2U7Ci0gIH0KLSAgRGVzdHJveU1zZ0NvbnRyb2woKTsKLSAgbV9zUHJpdmF0ZVBhcmFtLlJlc2V0KCk7Ci0gIG1fQ2hpbGRyZW4uY2xlYXIoKTsKLSAgbV9wVlNjcm9sbEJhciA9IG51bGxwdHI7Ci19Ci0KLXZvaWQgQ1BXTF9XbmQ6Ok1vdmUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNOZXcsIGJvb2wgYlJlc2V0LCBib29sIGJSZWZyZXNoKSB7Ci0gIGlmIChJc1ZhbGlkKCkpIHsKLSAgICBDRlhfRmxvYXRSZWN0IHJjT2xkID0gR2V0V2luZG93UmVjdCgpOwotCi0gICAgbV9yY1dpbmRvdyA9IHJjTmV3OwotICAgIG1fcmNXaW5kb3cuTm9ybWFsaXplKCk7Ci0KLSAgICBpZiAocmNPbGQubGVmdCAhPSByY05ldy5sZWZ0IHx8IHJjT2xkLnJpZ2h0ICE9IHJjTmV3LnJpZ2h0IHx8Ci0gICAgICAgIHJjT2xkLnRvcCAhPSByY05ldy50b3AgfHwgcmNPbGQuYm90dG9tICE9IHJjTmV3LmJvdHRvbSkgewotICAgICAgaWYgKGJSZXNldCkgewotICAgICAgICBSZVBvc0NoaWxkV25kKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChiUmVmcmVzaCkgewotICAgICAgSW52YWxpZGF0ZVJlY3RNb3ZlKHJjT2xkLCByY05ldyk7Ci0gICAgfQotCi0gICAgbV9zUHJpdmF0ZVBhcmFtLnJjUmVjdFduZCA9IG1fcmNXaW5kb3c7Ci0gIH0KLX0KLQotdm9pZCBDUFdMX1duZDo6SW52YWxpZGF0ZVJlY3RNb3ZlKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjT2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjTmV3KSB7Ci0gIENGWF9GbG9hdFJlY3QgcmNVbmlvbiA9IHJjT2xkOwotICByY1VuaW9uLlVuaW9uKHJjTmV3KTsKLQotICBJbnZhbGlkYXRlUmVjdCgmcmNVbmlvbik7Ci19Ci0KLXZvaWQgQ1BXTF9XbmQ6OkdldEFwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtKSB7Ci0gIGlmIChJc1ZhbGlkKCkgJiYgSXNWaXNpYmxlKCkpIHsKLSAgICBHZXRUaGlzQXBwZWFyYW5jZVN0cmVhbShzQXBwU3RyZWFtKTsKLSAgICBHZXRDaGlsZEFwcGVhcmFuY2VTdHJlYW0oc0FwcFN0cmVhbSk7Ci0gIH0KLX0KLQotLy8gaWYgZG9uJ3Qgc2V0LEdldCBkZWZhdWx0IGFwcGVyYW5jZSBzdHJlYW0KLXZvaWQgQ1BXTF9XbmQ6OkdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSkgewotICBDRlhfRmxvYXRSZWN0IHJlY3RXbmQgPSBHZXRXaW5kb3dSZWN0KCk7Ci0gIGlmICghcmVjdFduZC5Jc0VtcHR5KCkpIHsKLSAgICBDRlhfQnl0ZVRleHRCdWYgc1RoaXM7Ci0KLSAgICBpZiAoSGFzRmxhZyhQV1NfQkFDS0dST1VORCkpCi0gICAgICBzVGhpcyA8PCBDUFdMX1V0aWxzOjpHZXRSZWN0RmlsbEFwcFN0cmVhbShyZWN0V25kLCBHZXRCYWNrZ3JvdW5kQ29sb3IoKSk7Ci0KLSAgICBpZiAoSGFzRmxhZyhQV1NfQk9SREVSKSkgewotICAgICAgc1RoaXMgPDwgQ1BXTF9VdGlsczo6R2V0Qm9yZGVyQXBwU3RyZWFtKAotICAgICAgICAgIHJlY3RXbmQsIChGWF9GTE9BVClHZXRCb3JkZXJXaWR0aCgpLCBHZXRCb3JkZXJDb2xvcigpLAotICAgICAgICAgIEdldEJvcmRlckxlZnRUb3BDb2xvcihHZXRCb3JkZXJTdHlsZSgpKSwKLSAgICAgICAgICBHZXRCb3JkZXJSaWdodEJvdHRvbUNvbG9yKEdldEJvcmRlclN0eWxlKCkpLCBHZXRCb3JkZXJTdHlsZSgpLAotICAgICAgICAgIEdldEJvcmRlckRhc2goKSk7Ci0gICAgfQotCi0gICAgc0FwcFN0cmVhbSA8PCBzVGhpczsKLSAgfQotfQotCi12b2lkIENQV0xfV25kOjpHZXRDaGlsZEFwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtKSB7Ci0gIGZvciAoQ1BXTF9XbmQqIHBDaGlsZCA6IG1fQ2hpbGRyZW4pIHsKLSAgICBpZiAocENoaWxkKQotICAgICAgcENoaWxkLT5HZXRBcHBlYXJhbmNlU3RyZWFtKHNBcHBTdHJlYW0pOwotICB9Ci19Ci0KLXZvaWQgQ1BXTF9XbmQ6OkRyYXdBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UpIHsKLSAgaWYgKElzVmFsaWQoKSAmJiBJc1Zpc2libGUoKSkgewotICAgIERyYXdUaGlzQXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UpOwotICAgIERyYXdDaGlsZEFwcGVhcmFuY2UocERldmljZSwgcFVzZXIyRGV2aWNlKTsKLSAgfQotfQotCi12b2lkIENQV0xfV25kOjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwVXNlcjJEZXZpY2UpIHsKLSAgQ0ZYX0Zsb2F0UmVjdCByZWN0V25kID0gR2V0V2luZG93UmVjdCgpOwotICBpZiAoIXJlY3RXbmQuSXNFbXB0eSgpKSB7Ci0gICAgaWYgKEhhc0ZsYWcoUFdTX0JBQ0tHUk9VTkQpKSB7Ci0gICAgICBDRlhfRmxvYXRSZWN0IHJjQ2xpZW50ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoCi0gICAgICAgICAgcmVjdFduZCwgKEZYX0ZMT0FUKShHZXRCb3JkZXJXaWR0aCgpICsgR2V0SW5uZXJCb3JkZXJXaWR0aCgpKSk7Ci0gICAgICBDUFdMX1V0aWxzOjpEcmF3RmlsbFJlY3QocERldmljZSwgcFVzZXIyRGV2aWNlLCByY0NsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCYWNrZ3JvdW5kQ29sb3IoKSwgR2V0VHJhbnNwYXJlbmN5KCkpOwotICAgIH0KLQotICAgIGlmIChIYXNGbGFnKFBXU19CT1JERVIpKQotICAgICAgQ1BXTF9VdGlsczo6RHJhd0JvcmRlcihwRGV2aWNlLCBwVXNlcjJEZXZpY2UsIHJlY3RXbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVClHZXRCb3JkZXJXaWR0aCgpLCBHZXRCb3JkZXJDb2xvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCb3JkZXJMZWZ0VG9wQ29sb3IoR2V0Qm9yZGVyU3R5bGUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJvcmRlclJpZ2h0Qm90dG9tQ29sb3IoR2V0Qm9yZGVyU3R5bGUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJvcmRlclN0eWxlKCksIEdldFRyYW5zcGFyZW5jeSgpKTsKLSAgfQotfQotCi12b2lkIENQV0xfV25kOjpEcmF3Q2hpbGRBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSkgewotICBmb3IgKENQV0xfV25kKiBwQ2hpbGQgOiBtX0NoaWxkcmVuKSB7Ci0gICAgaWYgKCFwQ2hpbGQpCi0gICAgICBjb250aW51ZTsKLQotICAgIENGWF9NYXRyaXggbXQgPSBwQ2hpbGQtPkdldENoaWxkTWF0cml4KCk7Ci0gICAgaWYgKG10LklzSWRlbnRpdHkoKSkgewotICAgICAgcENoaWxkLT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBwVXNlcjJEZXZpY2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICBtdC5Db25jYXQoKnBVc2VyMkRldmljZSk7Ci0gICAgICBwQ2hpbGQtPkRyYXdBcHBlYXJhbmNlKHBEZXZpY2UsICZtdCk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ1BXTF9XbmQ6OkludmFsaWRhdGVSZWN0KENGWF9GbG9hdFJlY3QqIHBSZWN0KSB7Ci0gIGlmIChJc1ZhbGlkKCkpIHsKLSAgICBDRlhfRmxvYXRSZWN0IHJjUmVmcmVzaCA9IHBSZWN0ID8gKnBSZWN0IDogR2V0V2luZG93UmVjdCgpOwotCi0gICAgaWYgKCFIYXNGbGFnKFBXU19OT1JFRlJFU0hDTElQKSkgewotICAgICAgQ0ZYX0Zsb2F0UmVjdCByY0NsaXAgPSBHZXRDbGlwUmVjdCgpOwotICAgICAgaWYgKCFyY0NsaXAuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHJjUmVmcmVzaC5JbnRlcnNlY3QocmNDbGlwKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBGWF9SRUNUIHJjV2luID0gUFdMdG9XbmQocmNSZWZyZXNoKTsKLSAgICByY1dpbi5sZWZ0IC09IFBXTF9JTlZBTElEQVRFX0lORkxBVEU7Ci0gICAgcmNXaW4udG9wIC09IFBXTF9JTlZBTElEQVRFX0lORkxBVEU7Ci0gICAgcmNXaW4ucmlnaHQgKz0gUFdMX0lOVkFMSURBVEVfSU5GTEFURTsKLSAgICByY1dpbi5ib3R0b20gKz0gUFdMX0lOVkFMSURBVEVfSU5GTEFURTsKLQotICAgIGlmIChDRlhfU3lzdGVtSGFuZGxlciogcFNIID0gR2V0U3lzdGVtSGFuZGxlcigpKSB7Ci0gICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHdpZGdldCA9IHN0YXRpY19jYXN0PENQREZTREtfV2lkZ2V0Kj4oCi0gICAgICAgICAgICAgIG1fc1ByaXZhdGVQYXJhbS5wQXR0YWNoZWRXaWRnZXQuR2V0KCkpKSB7Ci0gICAgICAgIHBTSC0+SW52YWxpZGF0ZVJlY3Qod2lkZ2V0LCByY1dpbik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLSNkZWZpbmUgUFdMX0lNUExFTUVOVF9LRVlfTUVUSE9EKGtleV9tZXRob2RfbmFtZSkgICAgICAgICAgICAgICAgICBcCi0gIGJvb2wgQ1BXTF9XbmQ6OmtleV9tZXRob2RfbmFtZSh1aW50MTZfdCBuQ2hhciwgdWludDMyX3QgbkZsYWcpIHsgXAotICAgIGlmICghSXNWYWxpZCgpIHx8ICFJc1Zpc2libGUoKSB8fCAhSXNFbmFibGVkKCkpICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFJc1duZENhcHR1cmVLZXlib2FyZCh0aGlzKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHBDaGlsZCA6IG1fQ2hpbGRyZW4pIHsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAocENoaWxkICYmIElzV25kQ2FwdHVyZUtleWJvYXJkKHBDaGlsZCkpICAgICAgICAgICAgICAgICAgXAotICAgICAgICByZXR1cm4gcENoaWxkLT5rZXlfbWV0aG9kX25hbWUobkNoYXIsIG5GbGFnKTsgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLVBXTF9JTVBMRU1FTlRfS0VZX01FVEhPRChPbktleURvd24pCi1QV0xfSU1QTEVNRU5UX0tFWV9NRVRIT0QoT25DaGFyKQotI3VuZGVmIFBXTF9JTVBMRU1FTlRfS0VZX01FVEhPRAotCi0jZGVmaW5lIFBXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9EKG1vdXNlX21ldGhvZF9uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBib29sIENQV0xfV25kOjptb3VzZV9tZXRob2RfbmFtZShjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIHsgIFwKLSAgICBpZiAoIUlzVmFsaWQoKSB8fCAhSXNWaXNpYmxlKCkgfHwgIUlzRW5hYmxlZCgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChJc1duZENhcHR1cmVNb3VzZSh0aGlzKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGZvciAoY29uc3QgYXV0byYgcENoaWxkIDogbV9DaGlsZHJlbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChwQ2hpbGQgJiYgSXNXbmRDYXB0dXJlTW91c2UocENoaWxkKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJldHVybiBwQ2hpbGQtPm1vdXNlX21ldGhvZF9uYW1lKHBDaGlsZC0+UGFyZW50VG9DaGlsZChwb2ludCksICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuRmxhZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIFNldEN1cnNvcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHBDaGlsZCA6IG1fQ2hpbGRyZW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAocENoaWxkICYmIHBDaGlsZC0+V25kSGl0VGVzdChwQ2hpbGQtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkgeyAgICAgICAgXAotICAgICAgICByZXR1cm4gcENoaWxkLT5tb3VzZV9tZXRob2RfbmFtZShwQ2hpbGQtPlBhcmVudFRvQ2hpbGQocG9pbnQpLCBuRmxhZyk7IFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmIChXbmRIaXRUZXN0KHBvaW50KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIFNldEN1cnNvcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLVBXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9EKE9uTEJ1dHRvbkRibENsaykKLVBXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9EKE9uTEJ1dHRvbkRvd24pCi1QV0xfSU1QTEVNRU5UX01PVVNFX01FVEhPRChPbkxCdXR0b25VcCkKLVBXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9EKE9uUkJ1dHRvbkRvd24pCi1QV0xfSU1QTEVNRU5UX01PVVNFX01FVEhPRChPblJCdXR0b25VcCkKLVBXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9EKE9uTW91c2VNb3ZlKQotI3VuZGVmIFBXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9ECi0KLWJvb2wgQ1BXTF9XbmQ6Ok9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWcpIHsKLSAgaWYgKCFJc1ZhbGlkKCkgfHwgIUlzVmlzaWJsZSgpIHx8ICFJc0VuYWJsZWQoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgU2V0Q3Vyc29yKCk7Ci0gIGlmICghSXNXbmRDYXB0dXJlS2V5Ym9hcmQodGhpcykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGZvciAoY29uc3QgYXV0byYgcENoaWxkIDogbV9DaGlsZHJlbikgewotICAgIGlmIChwQ2hpbGQgJiYgSXNXbmRDYXB0dXJlS2V5Ym9hcmQocENoaWxkKSkKLSAgICAgIHJldHVybiBwQ2hpbGQtPk9uTW91c2VXaGVlbCh6RGVsdGEsIHBDaGlsZC0+UGFyZW50VG9DaGlsZChwb2ludCksIG5GbGFnKTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQ1BXTF9XbmQ6OkFkZENoaWxkKENQV0xfV25kKiBwV25kKSB7Ci0gIG1fQ2hpbGRyZW4ucHVzaF9iYWNrKHBXbmQpOwotfQotCi12b2lkIENQV0xfV25kOjpSZW1vdmVDaGlsZChDUFdMX1duZCogcFduZCkgewotICBmb3IgKGF1dG8gaXQgPSBtX0NoaWxkcmVuLnJiZWdpbigpOyBpdCAhPSBtX0NoaWxkcmVuLnJlbmQoKTsgKytpdCkgewotICAgIGlmICgqaXQgJiYgKml0ID09IHBXbmQpIHsKLSAgICAgIG1fQ2hpbGRyZW4uZXJhc2Uoc3RkOjpuZXh0KGl0KS5iYXNlKCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ1BXTF9XbmQ6Ok9uTm90aWZ5KENQV0xfV25kKiBwV25kLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3Qgd1BhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtKSB7Ci0gIHN3aXRjaCAobXNnKSB7Ci0gICAgY2FzZSBQTk1fQUREQ0hJTEQ6Ci0gICAgICBBZGRDaGlsZChwV25kKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUE5NX1JFTU9WRUNISUxEOgotICAgICAgUmVtb3ZlQ2hpbGQocFduZCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotYm9vbCBDUFdMX1duZDo6SXNWYWxpZCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fYkNyZWF0ZWQ7Ci19Ci0KLWNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgQ1BXTF9XbmQ6OkdldENyZWF0aW9uUGFyYW0oKSBjb25zdCB7Ci0gIHJldHVybiBtX3NQcml2YXRlUGFyYW07Ci19Ci0KLUNQV0xfV25kKiBDUFdMX1duZDo6R2V0UGFyZW50V2luZG93KCkgY29uc3QgewotICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnBQYXJlbnRXbmQ7Ci19Ci0KLUNGWF9GbG9hdFJlY3QgQ1BXTF9XbmQ6OkdldFdpbmRvd1JlY3QoKSBjb25zdCB7Ci0gIHJldHVybiBtX3JjV2luZG93OwotfQotCi1DRlhfRmxvYXRSZWN0IENQV0xfV25kOjpHZXRDbGllbnRSZWN0KCkgY29uc3QgewotICBDRlhfRmxvYXRSZWN0IHJjV2luZG93ID0gR2V0V2luZG93UmVjdCgpOwotICBDRlhfRmxvYXRSZWN0IHJjQ2xpZW50ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoCi0gICAgICByY1dpbmRvdywgKEZYX0ZMT0FUKShHZXRCb3JkZXJXaWR0aCgpICsgR2V0SW5uZXJCb3JkZXJXaWR0aCgpKSk7Ci0gIGlmIChDUFdMX1Njcm9sbEJhciogcFZTQiA9IEdldFZTY3JvbGxCYXIoKSkKLSAgICByY0NsaWVudC5yaWdodCAtPSBwVlNCLT5HZXRTY3JvbGxCYXJXaWR0aCgpOwotCi0gIHJjQ2xpZW50Lk5vcm1hbGl6ZSgpOwotICByZXR1cm4gcmNXaW5kb3cuQ29udGFpbnMocmNDbGllbnQpID8gcmNDbGllbnQgOiBDRlhfRmxvYXRSZWN0KCk7Ci19Ci0KLUNGWF9Qb2ludEYgQ1BXTF9XbmQ6OkdldENlbnRlclBvaW50KCkgY29uc3QgewotICBDRlhfRmxvYXRSZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotICByZXR1cm4gQ0ZYX1BvaW50RigocmNDbGllbnQubGVmdCArIHJjQ2xpZW50LnJpZ2h0KSAqIDAuNWYsCi0gICAgICAgICAgICAgICAgICAgIChyY0NsaWVudC50b3AgKyByY0NsaWVudC5ib3R0b20pICogMC41Zik7Ci19Ci0KLWJvb2wgQ1BXTF9XbmQ6Okhhc0ZsYWcodWludDMyX3QgZHdGbGFncykgY29uc3QgewotICByZXR1cm4gKG1fc1ByaXZhdGVQYXJhbS5kd0ZsYWdzICYgZHdGbGFncykgIT0gMDsKLX0KLQotdm9pZCBDUFdMX1duZDo6UmVtb3ZlRmxhZyh1aW50MzJfdCBkd0ZsYWdzKSB7Ci0gIG1fc1ByaXZhdGVQYXJhbS5kd0ZsYWdzICY9IH5kd0ZsYWdzOwotfQotCi12b2lkIENQV0xfV25kOjpBZGRGbGFnKHVpbnQzMl90IGR3RmxhZ3MpIHsKLSAgbV9zUHJpdmF0ZVBhcmFtLmR3RmxhZ3MgfD0gZHdGbGFnczsKLX0KLQotQ1BXTF9Db2xvciBDUFdMX1duZDo6R2V0QmFja2dyb3VuZENvbG9yKCkgY29uc3QgewotICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnNCYWNrZ3JvdW5kQ29sb3I7Ci19Ci0KLXZvaWQgQ1BXTF9XbmQ6OlNldEJhY2tncm91bmRDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcikgewotICBtX3NQcml2YXRlUGFyYW0uc0JhY2tncm91bmRDb2xvciA9IGNvbG9yOwotfQotCi1DUFdMX0NvbG9yIENQV0xfV25kOjpHZXRUZXh0Q29sb3IoKSBjb25zdCB7Ci0gIHJldHVybiBtX3NQcml2YXRlUGFyYW0uc1RleHRDb2xvcjsKLX0KLQotQm9yZGVyU3R5bGUgQ1BXTF9XbmQ6OkdldEJvcmRlclN0eWxlKCkgY29uc3QgewotICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLm5Cb3JkZXJTdHlsZTsKLX0KLQotdm9pZCBDUFdMX1duZDo6U2V0Qm9yZGVyU3R5bGUoQm9yZGVyU3R5bGUgbkJvcmRlclN0eWxlKSB7Ci0gIGlmIChIYXNGbGFnKFBXU19CT1JERVIpKQotICAgIG1fc1ByaXZhdGVQYXJhbS5uQm9yZGVyU3R5bGUgPSBuQm9yZGVyU3R5bGU7Ci19Ci0KLWludDMyX3QgQ1BXTF9XbmQ6OkdldEJvcmRlcldpZHRoKCkgY29uc3QgewotICBpZiAoSGFzRmxhZyhQV1NfQk9SREVSKSkKLSAgICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLmR3Qm9yZGVyV2lkdGg7Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludDMyX3QgQ1BXTF9XbmQ6OkdldElubmVyQm9yZGVyV2lkdGgoKSBjb25zdCB7Ci0gIHJldHVybiAwOwotfQotCi1DUFdMX0NvbG9yIENQV0xfV25kOjpHZXRCb3JkZXJDb2xvcigpIGNvbnN0IHsKLSAgaWYgKEhhc0ZsYWcoUFdTX0JPUkRFUikpCi0gICAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5zQm9yZGVyQ29sb3I7Ci0KLSAgcmV0dXJuIENQV0xfQ29sb3IoKTsKLX0KLQotY29uc3QgQ1BXTF9EYXNoJiBDUFdMX1duZDo6R2V0Qm9yZGVyRGFzaCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5zRGFzaDsKLX0KLQotdm9pZCogQ1BXTF9XbmQ6OkdldEF0dGFjaGVkRGF0YSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5wQXR0YWNoZWREYXRhOwotfQotCi1DUFdMX1Njcm9sbEJhciogQ1BXTF9XbmQ6OkdldFZTY3JvbGxCYXIoKSBjb25zdCB7Ci0gIGlmIChIYXNGbGFnKFBXU19WU0NST0xMKSkKLSAgICByZXR1cm4gbV9wVlNjcm9sbEJhcjsKLQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotdm9pZCBDUFdMX1duZDo6Q3JlYXRlU2Nyb2xsQmFyKGNvbnN0IFBXTF9DUkVBVEVQQVJBTSYgY3ApIHsKLSAgQ3JlYXRlVlNjcm9sbEJhcihjcCk7Ci19Ci0KLXZvaWQgQ1BXTF9XbmQ6OkNyZWF0ZVZTY3JvbGxCYXIoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkgewotICBpZiAoIW1fcFZTY3JvbGxCYXIgJiYgSGFzRmxhZyhQV1NfVlNDUk9MTCkpIHsKLSAgICBQV0xfQ1JFQVRFUEFSQU0gc2NwID0gY3A7Ci0KLSAgICAvLyBmbGFncwotICAgIHNjcC5kd0ZsYWdzID0KLSAgICAgICAgUFdTX0NISUxEIHwgUFdTX0JBQ0tHUk9VTkQgfCBQV1NfQVVUT1RSQU5TUEFSRU5UIHwgUFdTX05PUkVGUkVTSENMSVA7Ci0KLSAgICBzY3AucFBhcmVudFduZCA9IHRoaXM7Ci0gICAgc2NwLnNCYWNrZ3JvdW5kQ29sb3IgPSBQV0xfREVGQVVMVF9XSElURUNPTE9SOwotICAgIHNjcC5lQ3Vyc29yVHlwZSA9IEZYQ1RfQVJST1c7Ci0gICAgc2NwLm5UcmFuc3BhcmVuY3kgPSBQV0xfU0NST0xMQkFSX1RSQU5TUEFSRU5DWTsKLQotICAgIG1fcFZTY3JvbGxCYXIgPSBuZXcgQ1BXTF9TY3JvbGxCYXIoU0JUX1ZTQ1JPTEwpOwotICAgIG1fcFZTY3JvbGxCYXItPkNyZWF0ZShzY3ApOwotICB9Ci19Ci0KLXZvaWQgQ1BXTF9XbmQ6OlNldENhcHR1cmUoKSB7Ci0gIGlmIChDUFdMX01zZ0NvbnRyb2wqIHBNc2dDdHJsID0gR2V0TXNnQ29udHJvbCgpKQotICAgIHBNc2dDdHJsLT5TZXRDYXB0dXJlKHRoaXMpOwotfQotCi12b2lkIENQV0xfV25kOjpSZWxlYXNlQ2FwdHVyZSgpIHsKLSAgZm9yIChjb25zdCBhdXRvJiBwQ2hpbGQgOiBtX0NoaWxkcmVuKSB7Ci0gICAgaWYgKHBDaGlsZCkKLSAgICAgIHBDaGlsZC0+UmVsZWFzZUNhcHR1cmUoKTsKLSAgfQotICBpZiAoQ1BXTF9Nc2dDb250cm9sKiBwTXNnQ3RybCA9IEdldE1zZ0NvbnRyb2woKSkKLSAgICBwTXNnQ3RybC0+UmVsZWFzZUNhcHR1cmUoKTsKLX0KLQotdm9pZCBDUFdMX1duZDo6U2V0Rm9jdXMoKSB7Ci0gIGlmIChDUFdMX01zZ0NvbnRyb2wqIHBNc2dDdHJsID0gR2V0TXNnQ29udHJvbCgpKSB7Ci0gICAgaWYgKCFwTXNnQ3RybC0+SXNNYWluQ2FwdHVyZUtleWJvYXJkKHRoaXMpKQotICAgICAgcE1zZ0N0cmwtPktpbGxGb2N1cygpOwotICAgIHBNc2dDdHJsLT5TZXRGb2N1cyh0aGlzKTsKLSAgfQotfQotCi12b2lkIENQV0xfV25kOjpLaWxsRm9jdXMoKSB7Ci0gIGlmIChDUFdMX01zZ0NvbnRyb2wqIHBNc2dDdHJsID0gR2V0TXNnQ29udHJvbCgpKSB7Ci0gICAgaWYgKHBNc2dDdHJsLT5Jc1duZENhcHR1cmVLZXlib2FyZCh0aGlzKSkKLSAgICAgIHBNc2dDdHJsLT5LaWxsRm9jdXMoKTsKLSAgfQotfQotCi12b2lkIENQV0xfV25kOjpPblNldEZvY3VzKCkge30KLQotdm9pZCBDUFdMX1duZDo6T25LaWxsRm9jdXMoKSB7fQotCi1ib29sIENQV0xfV25kOjpXbmRIaXRUZXN0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBjb25zdCB7Ci0gIHJldHVybiBJc1ZhbGlkKCkgJiYgSXNWaXNpYmxlKCkgJiYgR2V0V2luZG93UmVjdCgpLkNvbnRhaW5zKHBvaW50KTsKLX0KLQotYm9vbCBDUFdMX1duZDo6Q2xpZW50SGl0VGVzdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3QgewotICByZXR1cm4gSXNWYWxpZCgpICYmIElzVmlzaWJsZSgpICYmIEdldENsaWVudFJlY3QoKS5Db250YWlucyhwb2ludCk7Ci19Ci0KLWNvbnN0IENQV0xfV25kKiBDUFdMX1duZDo6R2V0Um9vdFduZCgpIGNvbnN0IHsKLSAgaWYgKG1fc1ByaXZhdGVQYXJhbS5wUGFyZW50V25kKQotICAgIHJldHVybiBtX3NQcml2YXRlUGFyYW0ucFBhcmVudFduZC0+R2V0Um9vdFduZCgpOwotCi0gIHJldHVybiB0aGlzOwotfQotCi12b2lkIENQV0xfV25kOjpTZXRWaXNpYmxlKGJvb2wgYlZpc2libGUpIHsKLSAgaWYgKCFJc1ZhbGlkKCkpCi0gICAgcmV0dXJuOwotCi0gIGZvciAoY29uc3QgYXV0byYgcENoaWxkIDogbV9DaGlsZHJlbikgewotICAgIGlmIChwQ2hpbGQpCi0gICAgICBwQ2hpbGQtPlNldFZpc2libGUoYlZpc2libGUpOwotICB9Ci0gIGlmIChiVmlzaWJsZSAhPSBtX2JWaXNpYmxlKSB7Ci0gICAgbV9iVmlzaWJsZSA9IGJWaXNpYmxlOwotICAgIFJlUG9zQ2hpbGRXbmQoKTsKLSAgICBJbnZhbGlkYXRlUmVjdCgpOwotICB9Ci19Ci0KLXZvaWQgQ1BXTF9XbmQ6OlNldENsaXBSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIHsKLSAgbV9yY0NsaXAgPSByZWN0OwotICBtX3JjQ2xpcC5Ob3JtYWxpemUoKTsKLX0KLQotY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgQ1BXTF9XbmQ6OkdldENsaXBSZWN0KCkgY29uc3QgewotICByZXR1cm4gbV9yY0NsaXA7Ci19Ci0KLWJvb2wgQ1BXTF9XbmQ6OklzUmVhZE9ubHkoKSBjb25zdCB7Ci0gIHJldHVybiBIYXNGbGFnKFBXU19SRUFET05MWSk7Ci19Ci0KLXZvaWQgQ1BXTF9XbmQ6OlJlUG9zQ2hpbGRXbmQoKSB7Ci0gIENGWF9GbG9hdFJlY3QgcmNDb250ZW50ID0gQ1BXTF9VdGlsczo6RGVmbGF0ZVJlY3QoCi0gICAgICBHZXRXaW5kb3dSZWN0KCksIChGWF9GTE9BVCkoR2V0Qm9yZGVyV2lkdGgoKSArIEdldElubmVyQm9yZGVyV2lkdGgoKSkpOwotCi0gIENQV0xfU2Nyb2xsQmFyKiBwVlNCID0gR2V0VlNjcm9sbEJhcigpOwotCi0gIENGWF9GbG9hdFJlY3QgcmNWU2Nyb2xsID0KLSAgICAgIENGWF9GbG9hdFJlY3QocmNDb250ZW50LnJpZ2h0IC0gUFdMX1NDUk9MTEJBUl9XSURUSCwgcmNDb250ZW50LmJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgcmNDb250ZW50LnJpZ2h0IC0gMS4wZiwgcmNDb250ZW50LnRvcCk7Ci0KLSAgaWYgKHBWU0IpCi0gICAgcFZTQi0+TW92ZShyY1ZTY3JvbGwsIHRydWUsIGZhbHNlKTsKLX0KLQotdm9pZCBDUFdMX1duZDo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCkge30KLQotdm9pZCBDUFdMX1duZDo6U2V0Q3Vyc29yKCkgewotICBpZiAoSXNWYWxpZCgpKSB7Ci0gICAgaWYgKENGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCkpIHsKLSAgICAgIGludDMyX3QgbkN1cnNvclR5cGUgPSBHZXRDcmVhdGlvblBhcmFtKCkuZUN1cnNvclR5cGU7Ci0gICAgICBwU0gtPlNldEN1cnNvcihuQ3Vyc29yVHlwZSk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ1BXTF9XbmQ6OkNyZWF0ZU1zZ0NvbnRyb2woKSB7Ci0gIGlmICghbV9zUHJpdmF0ZVBhcmFtLnBNc2dDb250cm9sKQotICAgIG1fc1ByaXZhdGVQYXJhbS5wTXNnQ29udHJvbCA9IG5ldyBDUFdMX01zZ0NvbnRyb2wodGhpcyk7Ci19Ci0KLXZvaWQgQ1BXTF9XbmQ6OkRlc3Ryb3lNc2dDb250cm9sKCkgewotICBpZiAoQ1BXTF9Nc2dDb250cm9sKiBwTXNnQ29udHJvbCA9IEdldE1zZ0NvbnRyb2woKSkKLSAgICBpZiAocE1zZ0NvbnRyb2wtPklzV25kQ3JlYXRlZCh0aGlzKSkKLSAgICAgIGRlbGV0ZSBwTXNnQ29udHJvbDsKLX0KLQotQ1BXTF9Nc2dDb250cm9sKiBDUFdMX1duZDo6R2V0TXNnQ29udHJvbCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5wTXNnQ29udHJvbDsKLX0KLQotYm9vbCBDUFdMX1duZDo6SXNDYXB0dXJlTW91c2UoKSBjb25zdCB7Ci0gIHJldHVybiBJc1duZENhcHR1cmVNb3VzZSh0aGlzKTsKLX0KLQotYm9vbCBDUFdMX1duZDo6SXNXbmRDYXB0dXJlTW91c2UoY29uc3QgQ1BXTF9XbmQqIHBXbmQpIGNvbnN0IHsKLSAgaWYgKENQV0xfTXNnQ29udHJvbCogcEN0cmwgPSBHZXRNc2dDb250cm9sKCkpCi0gICAgcmV0dXJuIHBDdHJsLT5Jc1duZENhcHR1cmVNb3VzZShwV25kKTsKLQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1BXTF9XbmQ6OklzV25kQ2FwdHVyZUtleWJvYXJkKGNvbnN0IENQV0xfV25kKiBwV25kKSBjb25zdCB7Ci0gIGlmIChDUFdMX01zZ0NvbnRyb2wqIHBDdHJsID0gR2V0TXNnQ29udHJvbCgpKQotICAgIHJldHVybiBwQ3RybC0+SXNXbmRDYXB0dXJlS2V5Ym9hcmQocFduZCk7Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENQV0xfV25kOjpJc0ZvY3VzZWQoKSBjb25zdCB7Ci0gIGlmIChDUFdMX01zZ0NvbnRyb2wqIHBDdHJsID0gR2V0TXNnQ29udHJvbCgpKQotICAgIHJldHVybiBwQ3RybC0+SXNNYWluQ2FwdHVyZUtleWJvYXJkKHRoaXMpOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotQ0ZYX0Zsb2F0UmVjdCBDUFdMX1duZDo6R2V0Rm9jdXNSZWN0KCkgY29uc3QgewotICByZXR1cm4gQ1BXTF9VdGlsczo6SW5mbGF0ZVJlY3QoR2V0V2luZG93UmVjdCgpLCAxKTsKLX0KLQotRlhfRkxPQVQgQ1BXTF9XbmQ6OkdldEZvbnRTaXplKCkgY29uc3QgewotICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLmZGb250U2l6ZTsKLX0KLQotdm9pZCBDUFdMX1duZDo6U2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSB7Ci0gIG1fc1ByaXZhdGVQYXJhbS5mRm9udFNpemUgPSBmRm9udFNpemU7Ci19Ci0KLUNGWF9TeXN0ZW1IYW5kbGVyKiBDUFdMX1duZDo6R2V0U3lzdGVtSGFuZGxlcigpIGNvbnN0IHsKLSAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5wU3lzdGVtSGFuZGxlcjsKLX0KLQotSVBXTF9Gb2N1c0hhbmRsZXIqIENQV0xfV25kOjpHZXRGb2N1c0hhbmRsZXIoKSBjb25zdCB7Ci0gIHJldHVybiBtX3NQcml2YXRlUGFyYW0ucEZvY3VzSGFuZGxlcjsKLX0KLQotSVBXTF9Qcm92aWRlciogQ1BXTF9XbmQ6OkdldFByb3ZpZGVyKCkgY29uc3QgewotICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLnBQcm92aWRlci5HZXQoKTsKLX0KLQotSVBWVF9Gb250TWFwKiBDUFdMX1duZDo6R2V0Rm9udE1hcCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5wRm9udE1hcDsKLX0KLQotQ1BXTF9Db2xvciBDUFdMX1duZDo6R2V0Qm9yZGVyTGVmdFRvcENvbG9yKEJvcmRlclN0eWxlIG5Cb3JkZXJTdHlsZSkgY29uc3QgewotICBzd2l0Y2ggKG5Cb3JkZXJTdHlsZSkgewotICAgIGNhc2UgQm9yZGVyU3R5bGU6OkJFVkVMRUQ6Ci0gICAgICByZXR1cm4gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMSk7Ci0gICAgY2FzZSBCb3JkZXJTdHlsZTo6SU5TRVQ6Ci0gICAgICByZXR1cm4gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMC41Zik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBDUFdMX0NvbG9yKCk7Ci0gIH0KLX0KLQotQ1BXTF9Db2xvciBDUFdMX1duZDo6R2V0Qm9yZGVyUmlnaHRCb3R0b21Db2xvcihCb3JkZXJTdHlsZSBuQm9yZGVyU3R5bGUpIGNvbnN0IHsKLSAgc3dpdGNoIChuQm9yZGVyU3R5bGUpIHsKLSAgICBjYXNlIEJvcmRlclN0eWxlOjpCRVZFTEVEOgotICAgICAgcmV0dXJuIEdldEJhY2tncm91bmRDb2xvcigpIC8gMi4wZjsKLSAgICBjYXNlIEJvcmRlclN0eWxlOjpJTlNFVDoKLSAgICAgIHJldHVybiBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjc1Zik7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBDUFdMX0NvbG9yKCk7Ci0gIH0KLX0KLQotaW50MzJfdCBDUFdMX1duZDo6R2V0VHJhbnNwYXJlbmN5KCkgewotICByZXR1cm4gbV9zUHJpdmF0ZVBhcmFtLm5UcmFuc3BhcmVuY3k7Ci19Ci0KLXZvaWQgQ1BXTF9XbmQ6OlNldFRyYW5zcGFyZW5jeShpbnQzMl90IG5UcmFuc3BhcmVuY3kpIHsKLSAgZm9yIChjb25zdCBhdXRvJiBwQ2hpbGQgOiBtX0NoaWxkcmVuKSB7Ci0gICAgaWYgKHBDaGlsZCkKLSAgICAgIHBDaGlsZC0+U2V0VHJhbnNwYXJlbmN5KG5UcmFuc3BhcmVuY3kpOwotICB9Ci0gIG1fc1ByaXZhdGVQYXJhbS5uVHJhbnNwYXJlbmN5ID0gblRyYW5zcGFyZW5jeTsKLX0KLQotQ0ZYX01hdHJpeCBDUFdMX1duZDo6R2V0V2luZG93TWF0cml4KCkgY29uc3QgewotICBDRlhfTWF0cml4IG10ID0gR2V0Q2hpbGRUb1Jvb3QoKTsKLSAgaWYgKElQV0xfUHJvdmlkZXIqIHBQcm92aWRlciA9IEdldFByb3ZpZGVyKCkpCi0gICAgbXQuQ29uY2F0KHBQcm92aWRlci0+R2V0V2luZG93TWF0cml4KEdldEF0dGFjaGVkRGF0YSgpKSk7Ci0gIHJldHVybiBtdDsKLX0KLQotRlhfUkVDVCBDUFdMX1duZDo6UFdMdG9XbmQoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3QgewotICBDRlhfRmxvYXRSZWN0IHJjVGVtcCA9IHJlY3Q7Ci0gIENGWF9NYXRyaXggbXQgPSBHZXRXaW5kb3dNYXRyaXgoKTsKLSAgbXQuVHJhbnNmb3JtUmVjdChyY1RlbXApOwotICByZXR1cm4gRlhfUkVDVCgoaW50MzJfdCkocmNUZW1wLmxlZnQgKyAwLjUpLCAoaW50MzJfdCkocmNUZW1wLmJvdHRvbSArIDAuNSksCi0gICAgICAgICAgICAgICAgIChpbnQzMl90KShyY1RlbXAucmlnaHQgKyAwLjUpLCAoaW50MzJfdCkocmNUZW1wLnRvcCArIDAuNSkpOwotfQotCi1DRlhfUG9pbnRGIENQV0xfV25kOjpQYXJlbnRUb0NoaWxkKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBjb25zdCB7Ci0gIENGWF9NYXRyaXggbXQgPSBHZXRDaGlsZE1hdHJpeCgpOwotICBpZiAobXQuSXNJZGVudGl0eSgpKQotICAgIHJldHVybiBwb2ludDsKLQotICBtdC5TZXRSZXZlcnNlKG10KTsKLSAgcmV0dXJuIG10LlRyYW5zZm9ybShwb2ludCk7Ci19Ci0KLUNGWF9GbG9hdFJlY3QgQ1BXTF9XbmQ6OlBhcmVudFRvQ2hpbGQoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3QgewotICBDRlhfTWF0cml4IG10ID0gR2V0Q2hpbGRNYXRyaXgoKTsKLSAgaWYgKG10LklzSWRlbnRpdHkoKSkKLSAgICByZXR1cm4gcmVjdDsKLQotICBtdC5TZXRSZXZlcnNlKG10KTsKLSAgQ0ZYX0Zsb2F0UmVjdCByYyA9IHJlY3Q7Ci0gIG10LlRyYW5zZm9ybVJlY3QocmMpOwotICByZXR1cm4gcmM7Ci19Ci0KLUNGWF9NYXRyaXggQ1BXTF9XbmQ6OkdldENoaWxkVG9Sb290KCkgY29uc3QgewotICBDRlhfTWF0cml4IG10KDEsIDAsIDAsIDEsIDAsIDApOwotICBpZiAoSGFzRmxhZyhQV1NfQ0hJTEQpKSB7Ci0gICAgY29uc3QgQ1BXTF9XbmQqIHBQYXJlbnQgPSB0aGlzOwotICAgIHdoaWxlIChwUGFyZW50KSB7Ci0gICAgICBtdC5Db25jYXQocFBhcmVudC0+R2V0Q2hpbGRNYXRyaXgoKSk7Ci0gICAgICBwUGFyZW50ID0gcFBhcmVudC0+R2V0UGFyZW50V2luZG93KCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBtdDsKLX0KLQotQ0ZYX01hdHJpeCBDUFdMX1duZDo6R2V0Q2hpbGRNYXRyaXgoKSBjb25zdCB7Ci0gIGlmIChIYXNGbGFnKFBXU19DSElMRCkpCi0gICAgcmV0dXJuIG1fc1ByaXZhdGVQYXJhbS5tdENoaWxkOwotCi0gIHJldHVybiBDRlhfTWF0cml4KDEsIDAsIDAsIDEsIDAsIDApOwotfQotCi12b2lkIENQV0xfV25kOjpTZXRDaGlsZE1hdHJpeChjb25zdCBDRlhfTWF0cml4JiBtdCkgewotICBtX3NQcml2YXRlUGFyYW0ubXRDaGlsZCA9IG10OwotfQotCi1jb25zdCBDUFdMX1duZCogQ1BXTF9XbmQ6OkdldEZvY3VzZWQoKSBjb25zdCB7Ci0gIENQV0xfTXNnQ29udHJvbCogcE1zZ0N0cmwgPSBHZXRNc2dDb250cm9sKCk7Ci0gIHJldHVybiBwTXNnQ3RybCA/IHBNc2dDdHJsLT5tX3BNYWluS2V5Ym9hcmRXbmQgOiBudWxscHRyOwotfQotCi12b2lkIENQV0xfV25kOjpFbmFibGVXaW5kb3coYm9vbCBiRW5hYmxlKSB7Ci0gIGlmIChtX2JFbmFibGVkID09IGJFbmFibGUpCi0gICAgcmV0dXJuOwotCi0gIGZvciAoY29uc3QgYXV0byYgcENoaWxkIDogbV9DaGlsZHJlbikgewotICAgIGlmIChwQ2hpbGQpCi0gICAgICBwQ2hpbGQtPkVuYWJsZVdpbmRvdyhiRW5hYmxlKTsKLSAgfQotICBtX2JFbmFibGVkID0gYkVuYWJsZTsKLX0KLQotYm9vbCBDUFdMX1duZDo6SXNDVFJMcHJlc3NlZCh1aW50MzJfdCBuRmxhZykgY29uc3QgewotICBDRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCk7Ci0gIHJldHVybiBwU3lzdGVtSGFuZGxlciAmJiBwU3lzdGVtSGFuZGxlci0+SXNDVFJMS2V5RG93bihuRmxhZyk7Ci19Ci0KLWJvb2wgQ1BXTF9XbmQ6OklzU0hJRlRwcmVzc2VkKHVpbnQzMl90IG5GbGFnKSBjb25zdCB7Ci0gIENGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlciA9IEdldFN5c3RlbUhhbmRsZXIoKTsKLSAgcmV0dXJuIHBTeXN0ZW1IYW5kbGVyICYmIHBTeXN0ZW1IYW5kbGVyLT5Jc1NISUZUS2V5RG93bihuRmxhZyk7Ci19Ci0KLWJvb2wgQ1BXTF9XbmQ6OklzQUxUcHJlc3NlZCh1aW50MzJfdCBuRmxhZykgY29uc3QgewotICBDRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCk7Ci0gIHJldHVybiBwU3lzdGVtSGFuZGxlciAmJiBwU3lzdGVtSGFuZGxlci0+SXNBTFRLZXlEb3duKG5GbGFnKTsKLX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9XbmQuaCBiL2ZwZGZzZGsvcGRmd2luZG93L1BXTF9XbmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU4MzZkNC4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL3BkZndpbmRvdy9QV0xfV25kLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIEZQREZTREtfUERGV0lORE9XX1BXTF9XTkRfSF8KLSNkZWZpbmUgRlBERlNES19QREZXSU5ET1dfUFdMX1dORF9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2Zvcm1jb250cm9sLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfb2JzZXJ2YWJsZS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLSNpbmNsdWRlICJmcGRmc2RrL2NmeF9zeXN0ZW1oYW5kbGVyLmgiCi0jaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX3dpZGdldC5oIgotI2luY2x1ZGUgImZwZGZzZGsvcGRmd2luZG93L2Nwd2xfY29sb3IuaCIKLQotY2xhc3MgQ1BXTF9Nc2dDb250cm9sOwotY2xhc3MgQ1BXTF9TY3JvbGxCYXI7Ci1jbGFzcyBDUFdMX1RpbWVyOwotY2xhc3MgQ1BXTF9UaW1lckhhbmRsZXI7Ci1jbGFzcyBDUFdMX1duZDsKLWNsYXNzIENGWF9TeXN0ZW1IYW5kbGVyOwotY2xhc3MgSVBWVF9Gb250TWFwOwotY2xhc3MgSVBXTF9Qcm92aWRlcjsKLQotLy8gd2luZG93IHN0eWxlcwotI2RlZmluZSBQV1NfQ0hJTEQgMHg4MDAwMDAwMEwKLSNkZWZpbmUgUFdTX0JPUkRFUiAweDQwMDAwMDAwTAotI2RlZmluZSBQV1NfQkFDS0dST1VORCAweDIwMDAwMDAwTAotI2RlZmluZSBQV1NfSFNDUk9MTCAweDEwMDAwMDAwTAotI2RlZmluZSBQV1NfVlNDUk9MTCAweDA4MDAwMDAwTAotI2RlZmluZSBQV1NfVklTSUJMRSAweDA0MDAwMDAwTAotI2RlZmluZSBQV1NfRElTQUJMRSAweDAyMDAwMDAwTAotI2RlZmluZSBQV1NfUkVBRE9OTFkgMHgwMTAwMDAwMEwKLSNkZWZpbmUgUFdTX0FVVE9GT05UU0laRSAweDAwODAwMDAwTAotI2RlZmluZSBQV1NfQVVUT1RSQU5TUEFSRU5UIDB4MDA0MDAwMDBMCi0jZGVmaW5lIFBXU19OT1JFRlJFU0hDTElQIDB4MDAyMDAwMDBMCi0KLS8vIGVkaXQgYW5kIGxhYmVsIHN0eWxlcwotI2RlZmluZSBQRVNfTVVMVElMSU5FIDB4MDAwMUwKLSNkZWZpbmUgUEVTX1BBU1NXT1JEIDB4MDAwMkwKLSNkZWZpbmUgUEVTX0xFRlQgMHgwMDA0TAotI2RlZmluZSBQRVNfUklHSFQgMHgwMDA4TAotI2RlZmluZSBQRVNfTUlERExFIDB4MDAxMEwKLSNkZWZpbmUgUEVTX1RPUCAweDAwMjBMCi0jZGVmaW5lIFBFU19CT1RUT00gMHgwMDQwTAotI2RlZmluZSBQRVNfQ0VOVEVSIDB4MDA4MEwKLSNkZWZpbmUgUEVTX0NIQVJBUlJBWSAweDAxMDBMCi0jZGVmaW5lIFBFU19BVVRPU0NST0xMIDB4MDIwMEwKLSNkZWZpbmUgUEVTX0FVVE9SRVRVUk4gMHgwNDAwTAotI2RlZmluZSBQRVNfVU5ETyAweDA4MDBMCi0jZGVmaW5lIFBFU19SSUNIIDB4MTAwMEwKLSNkZWZpbmUgUEVTX1NQRUxMQ0hFQ0sgMHgyMDAwTAotI2RlZmluZSBQRVNfVEVYVE9WRVJGTE9XIDB4NDAwMEwKLSNkZWZpbmUgUEVTX05PUkVBRCAweDgwMDBMCi0KLS8vIGxpc3Rib3ggc3R5bGVzCi0jZGVmaW5lIFBMQlNfTVVMVElQTEVTRUwgMHgwMDAxTAotI2RlZmluZSBQTEJTX0hPVkVSU0VMIDB4MDAwOEwKLQotLy8gY29tYm9ib3ggc3R5bGVzCi0jZGVmaW5lIFBDQlNfQUxMT1dDVVNUT01URVhUIDB4MDAwMUwKLQotLy8gcmljaGVkaXQgc3R5bGVzCi0jZGVmaW5lIFBSRVNfTVVMVElMSU5FIDB4MDAwMUwKLSNkZWZpbmUgUFJFU19BVVRPUkVUVVJOIDB4MDAwMkwKLSNkZWZpbmUgUFJFU19BVVRPU0NST0xMIDB4MDAwNEwKLSNkZWZpbmUgUFJFU19VTkRPIDB4MDEwMEwKLSNkZWZpbmUgUFJFU19NVUxUSVBBR0VTIDB4MDIwMEwKLSNkZWZpbmUgUFJFU19URVhUT1ZFUkZMT1cgMHgwNDAwTAotCi0vLyBub3RpZmljYXRpb24gbWVzc2FnZXMKLSNkZWZpbmUgUE5NX0FERENISUxEIDB4MDAwMDAwMDBMCi0jZGVmaW5lIFBOTV9SRU1PVkVDSElMRCAweDAwMDAwMDAxTAotI2RlZmluZSBQTk1fU0VUU0NST0xMSU5GTyAweDAwMDAwMDAyTAotI2RlZmluZSBQTk1fU0VUU0NST0xMUE9TIDB4MDAwMDAwMDNMCi0jZGVmaW5lIFBOTV9TQ1JPTExXSU5ET1cgMHgwMDAwMDAwNEwKLSNkZWZpbmUgUE5NX0xCVVRUT05ET1dOIDB4MDAwMDAwMDVMCi0jZGVmaW5lIFBOTV9MQlVUVE9OVVAgMHgwMDAwMDAwNkwKLSNkZWZpbmUgUE5NX01PVVNFTU9WRSAweDAwMDAwMDA3TAotI2RlZmluZSBQTk1fTk9URVJFU0VUIDB4MDAwMDAwMDhMCi0jZGVmaW5lIFBOTV9TRVRDQVJFVElORk8gMHgwMDAwMDAwOUwKLSNkZWZpbmUgUE5NX1NFTENIQU5HRUQgMHgwMDAwMDAwQUwKLSNkZWZpbmUgUE5NX05PVEVFRElUQ0hBTkdFRCAweDAwMDAwMDBCTAotCi0jZGVmaW5lIFBXTF9DTEFTU05BTUVfRURJVCAiQ1BXTF9FZGl0IgotCi1zdHJ1Y3QgQ1BXTF9EYXNoIHsKLSAgQ1BXTF9EYXNoKCkgOiBuRGFzaCgwKSwgbkdhcCgwKSwgblBoYXNlKDApIHt9Ci0gIENQV0xfRGFzaChpbnQzMl90IGRhc2gsIGludDMyX3QgZ2FwLCBpbnQzMl90IHBoYXNlKQotICAgICAgOiBuRGFzaChkYXNoKSwgbkdhcChnYXApLCBuUGhhc2UocGhhc2UpIHt9Ci0KLSAgdm9pZCBSZXNldCgpIHsKLSAgICBuRGFzaCA9IDA7Ci0gICAgbkdhcCA9IDA7Ci0gICAgblBoYXNlID0gMDsKLSAgfQotCi0gIGludDMyX3QgbkRhc2g7Ci0gIGludDMyX3QgbkdhcDsKLSAgaW50MzJfdCBuUGhhc2U7Ci19OwotCi1pbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENQV0xfQ29sb3ImIGMxLCBjb25zdCBDUFdMX0NvbG9yJiBjMikgewotICByZXR1cm4gYzEubkNvbG9yVHlwZSA9PSBjMi5uQ29sb3JUeXBlICYmIGMxLmZDb2xvcjEgLSBjMi5mQ29sb3IxIDwgMC4wMDAxICYmCi0gICAgICAgICBjMS5mQ29sb3IxIC0gYzIuZkNvbG9yMSA+IC0wLjAwMDEgJiYKLSAgICAgICAgIGMxLmZDb2xvcjIgLSBjMi5mQ29sb3IyIDwgMC4wMDAxICYmCi0gICAgICAgICBjMS5mQ29sb3IyIC0gYzIuZkNvbG9yMiA+IC0wLjAwMDEgJiYKLSAgICAgICAgIGMxLmZDb2xvcjMgLSBjMi5mQ29sb3IzIDwgMC4wMDAxICYmCi0gICAgICAgICBjMS5mQ29sb3IzIC0gYzIuZkNvbG9yMyA+IC0wLjAwMDEgJiYKLSAgICAgICAgIGMxLmZDb2xvcjQgLSBjMi5mQ29sb3I0IDwgMC4wMDAxICYmIGMxLmZDb2xvcjQgLSBjMi5mQ29sb3I0ID4gLTAuMDAwMTsKLX0KLQotaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDUFdMX0NvbG9yJiBjMSwgY29uc3QgQ1BXTF9Db2xvciYgYzIpIHsKLSAgcmV0dXJuICEoYzEgPT0gYzIpOwotfQotCi0jZGVmaW5lIFBXTF9TQ1JPTExCQVJfV0lEVEggMTIuMGYKLSNkZWZpbmUgUFdMX1NDUk9MTEJBUl9CVVRUT05fV0lEVEggOS4wZgotI2RlZmluZSBQV0xfU0NST0xMQkFSX1BPU0JVVFRPTl9NSU5XSURUSCAyLjBmCi0jZGVmaW5lIFBXTF9TQ1JPTExCQVJfVFJBTlNQQVJFTkNZIDE1MAotI2RlZmluZSBQV0xfU0NST0xMQkFSX0JLQ09MT1IgXAotICBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIDIyMC4wZiAvIDI1NS4wZiwgMjIwLjBmIC8gMjU1LjBmLCAyMjAuMGYgLyAyNTUuMGYpCi0jZGVmaW5lIFBXTF9ERUZBVUxUX1NFTFRFWFRDT0xPUiBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IsIDEsIDEsIDEpCi0jZGVmaW5lIFBXTF9ERUZBVUxUX1NFTEJBQ0tDT0xPUiBcCi0gIENQV0xfQ29sb3IoQ09MT1JUWVBFX1JHQiwgMCwgNTEuMGYgLyAyNTUuMGYsIDExMy4wZiAvIDI1NS4wZikKLSNkZWZpbmUgUFdMX0RFRkFVTFRfQkFDS0NPTE9SIFBXTF9ERUZBVUxUX1NFTFRFWFRDT0xPUgotI2RlZmluZSBQV0xfREVGQVVMVF9URVhUQ09MT1IgQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCAwLCAwLCAwKQotI2RlZmluZSBQV0xfREVGQVVMVF9GT05UU0laRSA5LjBmCi0jZGVmaW5lIFBXTF9ERUZBVUxUX0JMQUNLQ09MT1IgQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMCkKLSNkZWZpbmUgUFdMX0RFRkFVTFRfV0hJVEVDT0xPUiBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAxKQotI2RlZmluZSBQV0xfREVGQVVMVF9IRUFWWUdSQVlDT0xPUiBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjUwKQotI2RlZmluZSBQV0xfREVGQVVMVF9MSUdIVEdSQVlDT0xPUiBDUFdMX0NvbG9yKENPTE9SVFlQRV9HUkFZLCAwLjc1KQotI2RlZmluZSBQV0xfVFJJQU5HTEVfSEFMRkxFTiAyLjBmCi0jZGVmaW5lIFBXTF9DQkJVVFRPTl9UUklBTkdMRV9IQUxGTEVOIDMuMGYKLSNkZWZpbmUgUFdMX0lOVkFMSURBVEVfSU5GTEFURSAyCi0KLWNsYXNzIElQV0xfUHJvdmlkZXIgOiBwdWJsaWMgQ0ZYX09ic2VydmFibGU8SVBXTF9Qcm92aWRlcj4gewotIHB1YmxpYzoKLSAgdmlydHVhbCB+SVBXTF9Qcm92aWRlcigpIHt9Ci0KLSAgLy8gZ2V0IGEgbWF0cml4IHdoaWNoIG1hcCB1c2VyIHNwYWNlIHRvIENXbmQgY2xpZW50IHNwYWNlCi0gIHZpcnR1YWwgQ0ZYX01hdHJpeCBHZXRXaW5kb3dNYXRyaXgodm9pZCogcEF0dGFjaGVkRGF0YSkgPSAwOwotCi0gIC8qCi0gIDAgTCImVW5kb1x0Q3RybCtaIgotICAxIEwiJlJlZG9cdEN0cmwrU2hpZnQrWiIKLSAgMiBMIkN1JnRcdEN0cmwrWCIKLSAgMyBMIiZDb3B5XHRDdHJsK0MiCi0gIDQgTCImUGFzdGVcdEN0cmwrViIKLSAgNSBMIiZEZWxldGUiCi0gIDYgIEwiJlNlbGVjdCBBbGxcdEN0cmwrQSIKLSAgKi8KLSAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBMb2FkUG9wdXBNZW51U3RyaW5nKGludDMyX3QgbkluZGV4KSA9IDA7Ci19OwotCi1jbGFzcyBJUFdMX0ZvY3VzSGFuZGxlciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5JUFdMX0ZvY3VzSGFuZGxlcigpIHt9Ci0gIHZpcnR1YWwgdm9pZCBPblNldEZvY3VzKENQV0xfV25kKiBwV25kKSA9IDA7Ci19OwotCi1zdHJ1Y3QgUFdMX0NSRUFURVBBUkFNIHsKLSBwdWJsaWM6Ci0gIFBXTF9DUkVBVEVQQVJBTSgpOwotICBQV0xfQ1JFQVRFUEFSQU0oY29uc3QgUFdMX0NSRUFURVBBUkFNJiBvdGhlcik7Ci0KLSAgdm9pZCBSZXNldCgpIHsKLSAgICByY1JlY3RXbmQuUmVzZXQoKTsKLSAgICBwU3lzdGVtSGFuZGxlciA9IG51bGxwdHI7Ci0gICAgcEZvbnRNYXAgPSBudWxscHRyOwotICAgIHBQcm92aWRlci5SZXNldCgpOwotICAgIHBGb2N1c0hhbmRsZXIgPSBudWxscHRyOwotICAgIGR3RmxhZ3MgPSAwOwotICAgIHNCYWNrZ3JvdW5kQ29sb3IuUmVzZXQoKTsKLSAgICBwQXR0YWNoZWRXaWRnZXQuUmVzZXQoKTsKLSAgICBuQm9yZGVyU3R5bGUgPSBCb3JkZXJTdHlsZTo6U09MSUQ7Ci0gICAgZHdCb3JkZXJXaWR0aCA9IDA7Ci0gICAgc0JvcmRlckNvbG9yLlJlc2V0KCk7Ci0gICAgc1RleHRDb2xvci5SZXNldCgpOwotICAgIG5UcmFuc3BhcmVuY3kgPSAwOwotICAgIGZGb250U2l6ZSA9IDAuMGY7Ci0gICAgc0Rhc2guUmVzZXQoKTsKLSAgICBwQXR0YWNoZWREYXRhID0gbnVsbHB0cjsKLSAgICBwUGFyZW50V25kID0gbnVsbHB0cjsKLSAgICBwTXNnQ29udHJvbCA9IG51bGxwdHI7Ci0gICAgZUN1cnNvclR5cGUgPSAwOwotICAgIG10Q2hpbGQuU2V0SWRlbnRpdHkoKTsKLSAgfQotCi0gIENGWF9GbG9hdFJlY3QgcmNSZWN0V25kOyAgICAgICAgICAgIC8vIHJlcXVpcmVkCi0gIENGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlcjsgIC8vIHJlcXVpcmVkCi0gIElQVlRfRm9udE1hcCogcEZvbnRNYXA7ICAgICAgICAgICAgIC8vIHJlcXVpcmVkCi0gIElQV0xfUHJvdmlkZXI6Ok9ic2VydmVkUHRyIHBQcm92aWRlcjsgIC8vIHJlcXVpcmVkCi0gIElQV0xfRm9jdXNIYW5kbGVyKiBwRm9jdXNIYW5kbGVyOyAgIC8vIG9wdGlvbmFsCi0gIHVpbnQzMl90IGR3RmxhZ3M7ICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsCi0gIENQV0xfQ29sb3Igc0JhY2tncm91bmRDb2xvcjsgICAgICAgIC8vIG9wdGlvbmFsCi0gIENQREZTREtfV2lkZ2V0OjpPYnNlcnZlZFB0ciBwQXR0YWNoZWRXaWRnZXQ7ICAvLyByZXF1aXJlZAotICBCb3JkZXJTdHlsZSBuQm9yZGVyU3R5bGU7ICAgICAgICAgICAvLyBvcHRpb25hbAotICBpbnQzMl90IGR3Qm9yZGVyV2lkdGg7ICAgICAgICAgICAgICAvLyBvcHRpb25hbAotICBDUFdMX0NvbG9yIHNCb3JkZXJDb2xvcjsgICAgICAgICAgICAvLyBvcHRpb25hbAotICBDUFdMX0NvbG9yIHNUZXh0Q29sb3I7ICAgICAgICAgICAgICAvLyBvcHRpb25hbAotICBpbnQzMl90IG5UcmFuc3BhcmVuY3k7ICAgICAgICAgICAgICAvLyBvcHRpb25hbAotICBGWF9GTE9BVCBmRm9udFNpemU7ICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbAotICBDUFdMX0Rhc2ggc0Rhc2g7ICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbAotICB2b2lkKiBwQXR0YWNoZWREYXRhOyAgICAgICAgICAgICAgICAvLyBvcHRpb25hbAotICBDUFdMX1duZCogcFBhcmVudFduZDsgICAgICAgICAgICAgICAvLyBpZ25vcmUKLSAgQ1BXTF9Nc2dDb250cm9sKiBwTXNnQ29udHJvbDsgICAgICAgLy8gaWdub3JlCi0gIGludDMyX3QgZUN1cnNvclR5cGU7ICAgICAgICAgICAgICAgIC8vIGlnbm9yZQotICBDRlhfTWF0cml4IG10Q2hpbGQ7ICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKLX07Ci0KLWNsYXNzIENQV0xfVGltZXIgewotIHB1YmxpYzoKLSAgQ1BXTF9UaW1lcihDUFdMX1RpbWVySGFuZGxlciogcEF0dGFjaGVkLCBDRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpOwotICB2aXJ0dWFsIH5DUFdMX1RpbWVyKCk7Ci0KLSAgaW50MzJfdCBTZXRQV0xUaW1lcihpbnQzMl90IG5FbGFwc2UpOwotICB2b2lkIEtpbGxQV0xUaW1lcigpOwotICBzdGF0aWMgdm9pZCBUaW1lclByb2MoaW50MzJfdCBpZEV2ZW50KTsKLQotIHByaXZhdGU6Ci0gIGludDMyX3QgbV9uVGltZXJJRDsKLSAgQ1BXTF9UaW1lckhhbmRsZXIqIG1fcEF0dGFjaGVkOwotICBDRlhfU3lzdGVtSGFuZGxlciogbV9wU3lzdGVtSGFuZGxlcjsKLX07Ci0KLWNsYXNzIENQV0xfVGltZXJIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIENQV0xfVGltZXJIYW5kbGVyKCk7Ci0gIHZpcnR1YWwgfkNQV0xfVGltZXJIYW5kbGVyKCk7Ci0KLSAgdm9pZCBCZWdpblRpbWVyKGludDMyX3QgbkVsYXBzZSk7Ci0gIHZvaWQgRW5kVGltZXIoKTsKLSAgdmlydHVhbCB2b2lkIFRpbWVyUHJvYygpOwotICB2aXJ0dWFsIENGWF9TeXN0ZW1IYW5kbGVyKiBHZXRTeXN0ZW1IYW5kbGVyKCkgY29uc3QgPSAwOwotCi0gcHJpdmF0ZToKLSAgc3RkOjp1bmlxdWVfcHRyPENQV0xfVGltZXI+IG1fcFRpbWVyOwotfTsKLQotY2xhc3MgQ1BXTF9XbmQgOiBwdWJsaWMgQ1BXTF9UaW1lckhhbmRsZXIgewotIHB1YmxpYzoKLSAgQ1BXTF9XbmQoKTsKLSAgfkNQV0xfV25kKCkgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBDRlhfQnl0ZVN0cmluZyBHZXRDbGFzc05hbWUoKSBjb25zdDsKLSAgdmlydHVhbCB2b2lkIEludmFsaWRhdGVSZWN0KENGWF9GbG9hdFJlY3QqIHBSZWN0ID0gbnVsbHB0cik7Ci0KLSAgdmlydHVhbCBib29sIE9uS2V5RG93bih1aW50MTZfdCBuQ2hhciwgdWludDMyX3QgbkZsYWcpOwotICB2aXJ0dWFsIGJvb2wgT25DaGFyKHVpbnQxNl90IG5DaGFyLCB1aW50MzJfdCBuRmxhZyk7Ci0gIHZpcnR1YWwgYm9vbCBPbkxCdXR0b25EYmxDbGsoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKTsKLSAgdmlydHVhbCBib29sIE9uTEJ1dHRvbkRvd24oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKTsKLSAgdmlydHVhbCBib29sIE9uTEJ1dHRvblVwKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZyk7Ci0gIHZpcnR1YWwgYm9vbCBPblJCdXR0b25Eb3duKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZyk7Ci0gIHZpcnR1YWwgYm9vbCBPblJCdXR0b25VcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpOwotICB2aXJ0dWFsIGJvb2wgT25Nb3VzZU1vdmUoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKTsKLSAgdmlydHVhbCBib29sIE9uTW91c2VXaGVlbChzaG9ydCB6RGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWcpOwotICB2aXJ0dWFsIHZvaWQgT25Ob3RpZnkoQ1BXTF9XbmQqIHBXbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRwdHJfdCB3UGFyYW0gPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50cHRyX3QgbFBhcmFtID0gMCk7Ci0gIHZpcnR1YWwgdm9pZCBTZXRGb2N1cygpOwotICB2aXJ0dWFsIHZvaWQgS2lsbEZvY3VzKCk7Ci0gIHZpcnR1YWwgdm9pZCBTZXRDdXJzb3IoKTsKLSAgdmlydHVhbCB2b2lkIFNldFZpc2libGUoYm9vbCBiVmlzaWJsZSk7Ci0gIHZpcnR1YWwgdm9pZCBTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOwotICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEZvbnRTaXplKCkgY29uc3Q7Ci0KLSAgdmlydHVhbCBDRlhfRmxvYXRSZWN0IEdldEZvY3VzUmVjdCgpIGNvbnN0OwotICB2aXJ0dWFsIENGWF9GbG9hdFJlY3QgR2V0Q2xpZW50UmVjdCgpIGNvbnN0OwotCi0gIHZvaWQgSW52YWxpZGF0ZUZvY3VzSGFuZGxlcihJUFdMX0ZvY3VzSGFuZGxlciogaGFuZGxlcik7Ci0gIHZvaWQgSW52YWxpZGF0ZVByb3ZpZGVyKElQV0xfUHJvdmlkZXIqIHByb3ZpZGVyKTsKLSAgdm9pZCBDcmVhdGUoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCk7Ci0gIHZvaWQgRGVzdHJveSgpOwotICB2b2lkIE1vdmUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNOZXcsIGJvb2wgYlJlc2V0LCBib29sIGJSZWZyZXNoKTsKLQotICB2b2lkIFNldENhcHR1cmUoKTsKLSAgdm9pZCBSZWxlYXNlQ2FwdHVyZSgpOwotCi0gIHZvaWQgRHJhd0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgQ0ZYX01hdHJpeCogcFVzZXIyRGV2aWNlKTsKLQotICBDUFdMX0NvbG9yIEdldEJhY2tncm91bmRDb2xvcigpIGNvbnN0OwotICB2b2lkIFNldEJhY2tncm91bmRDb2xvcihjb25zdCBDUFdMX0NvbG9yJiBjb2xvcik7Ci0gIENQV0xfQ29sb3IgR2V0Qm9yZGVyQ29sb3IoKSBjb25zdDsKLSAgQ1BXTF9Db2xvciBHZXRUZXh0Q29sb3IoKSBjb25zdDsKLSAgdm9pZCBTZXRUZXh0Q29sb3IoY29uc3QgQ1BXTF9Db2xvciYgY29sb3IpOwotICBDUFdMX0NvbG9yIEdldEJvcmRlckxlZnRUb3BDb2xvcihCb3JkZXJTdHlsZSBuQm9yZGVyU3R5bGUpIGNvbnN0OwotICBDUFdMX0NvbG9yIEdldEJvcmRlclJpZ2h0Qm90dG9tQ29sb3IoQm9yZGVyU3R5bGUgbkJvcmRlclN0eWxlKSBjb25zdDsKLQotICB2b2lkIFNldEJvcmRlclN0eWxlKEJvcmRlclN0eWxlIGVCb3JkZXJTdHlsZSk7Ci0gIEJvcmRlclN0eWxlIEdldEJvcmRlclN0eWxlKCkgY29uc3Q7Ci0gIGNvbnN0IENQV0xfRGFzaCYgR2V0Qm9yZGVyRGFzaCgpIGNvbnN0OwotCi0gIGludDMyX3QgR2V0Qm9yZGVyV2lkdGgoKSBjb25zdDsKLSAgaW50MzJfdCBHZXRJbm5lckJvcmRlcldpZHRoKCkgY29uc3Q7Ci0gIENGWF9GbG9hdFJlY3QgR2V0V2luZG93UmVjdCgpIGNvbnN0OwotICBDRlhfUG9pbnRGIEdldENlbnRlclBvaW50KCkgY29uc3Q7Ci0KLSAgYm9vbCBJc1Zpc2libGUoKSBjb25zdCB7IHJldHVybiBtX2JWaXNpYmxlOyB9Ci0gIGJvb2wgSGFzRmxhZyh1aW50MzJfdCBkd0ZsYWdzKSBjb25zdDsKLSAgdm9pZCBBZGRGbGFnKHVpbnQzMl90IGR3RmxhZ3MpOwotICB2b2lkIFJlbW92ZUZsYWcodWludDMyX3QgZHdGbGFncyk7Ci0KLSAgdm9pZCBTZXRDbGlwUmVjdChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KTsKLSAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgR2V0Q2xpcFJlY3QoKSBjb25zdDsKLQotICBDUFdMX1duZCogR2V0UGFyZW50V2luZG93KCkgY29uc3Q7Ci0gIHZvaWQqIEdldEF0dGFjaGVkRGF0YSgpIGNvbnN0OwotCi0gIGJvb2wgV25kSGl0VGVzdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3Q7Ci0gIGJvb2wgQ2xpZW50SGl0VGVzdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3Q7Ci0gIGJvb2wgSXNDYXB0dXJlTW91c2UoKSBjb25zdDsKLQotICB2b2lkIEVuYWJsZVdpbmRvdyhib29sIGJFbmFibGUpOwotICBib29sIElzRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIG1fYkVuYWJsZWQ7IH0KLSAgY29uc3QgQ1BXTF9XbmQqIEdldEZvY3VzZWQoKSBjb25zdDsKLSAgYm9vbCBJc0ZvY3VzZWQoKSBjb25zdDsKLSAgYm9vbCBJc1JlYWRPbmx5KCkgY29uc3Q7Ci0gIENQV0xfU2Nyb2xsQmFyKiBHZXRWU2Nyb2xsQmFyKCkgY29uc3Q7Ci0KLSAgSVBWVF9Gb250TWFwKiBHZXRGb250TWFwKCkgY29uc3Q7Ci0gIElQV0xfUHJvdmlkZXIqIEdldFByb3ZpZGVyKCkgY29uc3Q7Ci0gIElQV0xfRm9jdXNIYW5kbGVyKiBHZXRGb2N1c0hhbmRsZXIoKSBjb25zdDsKLQotICBpbnQzMl90IEdldFRyYW5zcGFyZW5jeSgpOwotICB2b2lkIFNldFRyYW5zcGFyZW5jeShpbnQzMl90IG5UcmFuc3BhcmVuY3kpOwotCi0gIENGWF9NYXRyaXggR2V0Q2hpbGRUb1Jvb3QoKSBjb25zdDsKLSAgQ0ZYX01hdHJpeCBHZXRDaGlsZE1hdHJpeCgpIGNvbnN0OwotICB2b2lkIFNldENoaWxkTWF0cml4KGNvbnN0IENGWF9NYXRyaXgmIG10KTsKLSAgQ0ZYX01hdHJpeCBHZXRXaW5kb3dNYXRyaXgoKSBjb25zdDsKLQotIHByb3RlY3RlZDoKLSAgZnJpZW5kIGNsYXNzIENQV0xfTXNnQ29udHJvbDsKLQotICAvLyBDUFdMX1RpbWVySGFuZGxlcgotICBDRlhfU3lzdGVtSGFuZGxlciogR2V0U3lzdGVtSGFuZGxlcigpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBDcmVhdGVDaGlsZFduZChjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKTsKLSAgdmlydHVhbCB2b2lkIFJlUG9zQ2hpbGRXbmQoKTsKLSAgdmlydHVhbCB2b2lkIEdldFRoaXNBcHBlYXJhbmNlU3RyZWFtKENGWF9CeXRlVGV4dEJ1ZiYgc0FwcFN0cmVhbSk7Ci0KLSAgdmlydHVhbCB2b2lkIERyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSk7Ci0KLSAgdmlydHVhbCB2b2lkIE9uQ3JlYXRlKFBXTF9DUkVBVEVQQVJBTSYgY3ApOwotICB2aXJ0dWFsIHZvaWQgT25DcmVhdGVkKCk7Ci0gIHZpcnR1YWwgdm9pZCBPbkRlc3Ryb3koKTsKLQotICB2aXJ0dWFsIHZvaWQgT25TZXRGb2N1cygpOwotICB2aXJ0dWFsIHZvaWQgT25LaWxsRm9jdXMoKTsKLQotICB2b2lkIEdldEFwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtKTsKLSAgdm9pZCBTZXROb3RpZnlGbGFnKGJvb2wgYk5vdGlmeWluZyA9IHRydWUpIHsgbV9iTm90aWZ5aW5nID0gYk5vdGlmeWluZzsgfQotCi0gIGJvb2wgSXNWYWxpZCgpIGNvbnN0OwotICBjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIEdldENyZWF0aW9uUGFyYW0oKSBjb25zdDsKLSAgYm9vbCBJc05vdGlmeWluZygpIGNvbnN0IHsgcmV0dXJuIG1fYk5vdGlmeWluZzsgfQotCi0gIHZvaWQgSW52YWxpZGF0ZVJlY3RNb3ZlKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjT2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRmxvYXRSZWN0JiByY05ldyk7Ci0KLSAgYm9vbCBJc1duZENhcHR1cmVNb3VzZShjb25zdCBDUFdMX1duZCogcFduZCkgY29uc3Q7Ci0gIGJvb2wgSXNXbmRDYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQqIHBXbmQpIGNvbnN0OwotICBjb25zdCBDUFdMX1duZCogR2V0Um9vdFduZCgpIGNvbnN0OwotCi0gIGJvb2wgSXNDVFJMcHJlc3NlZCh1aW50MzJfdCBuRmxhZykgY29uc3Q7Ci0gIGJvb2wgSXNTSElGVHByZXNzZWQodWludDMyX3QgbkZsYWcpIGNvbnN0OwotICBib29sIElzQUxUcHJlc3NlZCh1aW50MzJfdCBuRmxhZykgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBDRlhfUG9pbnRGIFBhcmVudFRvQ2hpbGQoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIGNvbnN0OwotICBDRlhfRmxvYXRSZWN0IFBhcmVudFRvQ2hpbGQoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3Q7Ci0KLSAgdm9pZCBHZXRDaGlsZEFwcGVhcmFuY2VTdHJlYW0oQ0ZYX0J5dGVUZXh0QnVmJiBzQXBwU3RyZWFtKTsKLSAgdm9pZCBEcmF3Q2hpbGRBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsIENGWF9NYXRyaXgqIHBVc2VyMkRldmljZSk7Ci0KLSAgRlhfUkVDVCBQV0x0b1duZChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdDsKLQotICB2b2lkIEFkZENoaWxkKENQV0xfV25kKiBwV25kKTsKLSAgdm9pZCBSZW1vdmVDaGlsZChDUFdMX1duZCogcFduZCk7Ci0KLSAgdm9pZCBDcmVhdGVTY3JvbGxCYXIoY29uc3QgUFdMX0NSRUFURVBBUkFNJiBjcCk7Ci0gIHZvaWQgQ3JlYXRlVlNjcm9sbEJhcihjb25zdCBQV0xfQ1JFQVRFUEFSQU0mIGNwKTsKLQotICB2b2lkIEFkanVzdFN0eWxlKCk7Ci0gIHZvaWQgQ3JlYXRlTXNnQ29udHJvbCgpOwotICB2b2lkIERlc3Ryb3lNc2dDb250cm9sKCk7Ci0KLSAgQ1BXTF9Nc2dDb250cm9sKiBHZXRNc2dDb250cm9sKCkgY29uc3Q7Ci0KLSAgc3RkOjp2ZWN0b3I8Q1BXTF9XbmQqPiBtX0NoaWxkcmVuOwotICBQV0xfQ1JFQVRFUEFSQU0gbV9zUHJpdmF0ZVBhcmFtOwotICBDUFdMX1Njcm9sbEJhciogbV9wVlNjcm9sbEJhcjsKLSAgQ0ZYX0Zsb2F0UmVjdCBtX3JjV2luZG93OwotICBDRlhfRmxvYXRSZWN0IG1fcmNDbGlwOwotICBib29sIG1fYkNyZWF0ZWQ7Ci0gIGJvb2wgbV9iVmlzaWJsZTsKLSAgYm9vbCBtX2JOb3RpZnlpbmc7Ci0gIGJvb2wgbV9iRW5hYmxlZDsKLX07Ci0KLSNlbmRpZiAgLy8gRlBERlNES19QREZXSU5ET1dfUFdMX1dORF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9wZGZ3aW5kb3cvY3B3bF9jb2xvci5jcHAgYi9mcGRmc2RrL3BkZndpbmRvdy9jcHdsX2NvbG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM5Y2EzZS4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL3BkZndpbmRvdy9jcHdsX2NvbG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJmcGRmc2RrL3BkZndpbmRvdy9jcHdsX2NvbG9yLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLW5hbWVzcGFjZSB7Ci0KLWJvb2wgSW5SYW5nZShGWF9GTE9BVCBjb21wKSB7Ci0gIHJldHVybiBjb21wID49IDAuMGYgJiYgY29tcCA8PSAxLjBmOwotfQotCi1DUFdMX0NvbG9yIENvbnZlcnRDTVlLMkdSQVkoRlhfRkxPQVQgZEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZE0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZEspIHsKLSAgaWYgKCFJblJhbmdlKGRDKSB8fCAhSW5SYW5nZShkTSkgfHwgIUluUmFuZ2UoZFkpIHx8ICFJblJhbmdlKGRLKSkKLSAgICByZXR1cm4gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSk7Ci0gIHJldHVybiBDUFdMX0NvbG9yKAotICAgICAgQ09MT1JUWVBFX0dSQVksCi0gICAgICAxLjBmIC0gc3RkOjptaW4oMS4wZiwgMC4zZiAqIGRDICsgMC41OWYgKiBkTSArIDAuMTFmICogZFkgKyBkSykpOwotfQotCi1DUFdMX0NvbG9yIENvbnZlcnRHUkFZMkNNWUsoRlhfRkxPQVQgZEdyYXkpIHsKLSAgaWYgKCFJblJhbmdlKGRHcmF5KSkKLSAgICByZXR1cm4gQ1BXTF9Db2xvcihDT0xPUlRZUEVfQ01ZSyk7Ci0gIHJldHVybiBDUFdMX0NvbG9yKENPTE9SVFlQRV9DTVlLLCAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmIC0gZEdyYXkpOwotfQotCi1DUFdMX0NvbG9yIENvbnZlcnRHUkFZMlJHQihGWF9GTE9BVCBkR3JheSkgewotICBpZiAoIUluUmFuZ2UoZEdyYXkpKQotICAgIHJldHVybiBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IpOwotICByZXR1cm4gQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCBkR3JheSwgZEdyYXksIGRHcmF5KTsKLX0KLQotQ1BXTF9Db2xvciBDb252ZXJ0UkdCMkdSQVkoRlhfRkxPQVQgZFIsIEZYX0ZMT0FUIGRHLCBGWF9GTE9BVCBkQikgewotICBpZiAoIUluUmFuZ2UoZFIpIHx8ICFJblJhbmdlKGRHKSB8fCAhSW5SYW5nZShkQikpCi0gICAgcmV0dXJuIENQV0xfQ29sb3IoQ09MT1JUWVBFX0dSQVkpOwotICByZXR1cm4gQ1BXTF9Db2xvcihDT0xPUlRZUEVfR1JBWSwgMC4zZiAqIGRSICsgMC41OWYgKiBkRyArIDAuMTFmICogZEIpOwotfQotCi1DUFdMX0NvbG9yIENvbnZlcnRDTVlLMlJHQihGWF9GTE9BVCBkQywgRlhfRkxPQVQgZE0sIEZYX0ZMT0FUIGRZLCBGWF9GTE9BVCBkSykgewotICBpZiAoIUluUmFuZ2UoZEMpIHx8ICFJblJhbmdlKGRNKSB8fCAhSW5SYW5nZShkWSkgfHwgIUluUmFuZ2UoZEspKQotICAgIHJldHVybiBDUFdMX0NvbG9yKENPTE9SVFlQRV9SR0IpOwotICByZXR1cm4gQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCAxLjBmIC0gc3RkOjptaW4oMS4wZiwgZEMgKyBkSyksCi0gICAgICAgICAgICAgICAgICAgIDEuMGYgLSBzdGQ6Om1pbigxLjBmLCBkTSArIGRLKSwKLSAgICAgICAgICAgICAgICAgICAgMS4wZiAtIHN0ZDo6bWluKDEuMGYsIGRZICsgZEspKTsKLX0KLQotQ1BXTF9Db2xvciBDb252ZXJ0UkdCMkNNWUsoRlhfRkxPQVQgZFIsIEZYX0ZMT0FUIGRHLCBGWF9GTE9BVCBkQikgewotICBpZiAoIUluUmFuZ2UoZFIpIHx8ICFJblJhbmdlKGRHKSB8fCAhSW5SYW5nZShkQikpCi0gICAgcmV0dXJuIENQV0xfQ29sb3IoQ09MT1JUWVBFX0NNWUspOwotCi0gIEZYX0ZMT0FUIGMgPSAxLjBmIC0gZFI7Ci0gIEZYX0ZMT0FUIG0gPSAxLjBmIC0gZEc7Ci0gIEZYX0ZMT0FUIHkgPSAxLjBmIC0gZEI7Ci0gIHJldHVybiBDUFdMX0NvbG9yKENPTE9SVFlQRV9DTVlLLCBjLCBtLCB5LCBzdGQ6Om1pbihjLCBzdGQ6Om1pbihtLCB5KSkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotQ1BXTF9Db2xvciBDUFdMX0NvbG9yOjpDb252ZXJ0Q29sb3JUeXBlKGludDMyX3QgbkNvbnZlcnRDb2xvclR5cGUpIGNvbnN0IHsKLSAgaWYgKG5Db2xvclR5cGUgPT0gbkNvbnZlcnRDb2xvclR5cGUpCi0gICAgcmV0dXJuICp0aGlzOwotCi0gIENQV0xfQ29sb3IgcmV0OwotICBzd2l0Y2ggKG5Db2xvclR5cGUpIHsKLSAgICBjYXNlIENPTE9SVFlQRV9UUkFOU1BBUkVOVDoKLSAgICAgIHJldCA9ICp0aGlzOwotICAgICAgcmV0Lm5Db2xvclR5cGUgPSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENPTE9SVFlQRV9HUkFZOgotICAgICAgc3dpdGNoIChuQ29udmVydENvbG9yVHlwZSkgewotICAgICAgICBjYXNlIENPTE9SVFlQRV9SR0I6Ci0gICAgICAgICAgcmV0ID0gQ29udmVydEdSQVkyUkdCKGZDb2xvcjEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENPTE9SVFlQRV9DTVlLOgotICAgICAgICAgIHJldCA9IENvbnZlcnRHUkFZMkNNWUsoZkNvbG9yMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENPTE9SVFlQRV9SR0I6Ci0gICAgICBzd2l0Y2ggKG5Db252ZXJ0Q29sb3JUeXBlKSB7Ci0gICAgICAgIGNhc2UgQ09MT1JUWVBFX0dSQVk6Ci0gICAgICAgICAgcmV0ID0gQ29udmVydFJHQjJHUkFZKGZDb2xvcjEsIGZDb2xvcjIsIGZDb2xvcjMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENPTE9SVFlQRV9DTVlLOgotICAgICAgICAgIHJldCA9IENvbnZlcnRSR0IyQ01ZSyhmQ29sb3IxLCBmQ29sb3IyLCBmQ29sb3IzKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ09MT1JUWVBFX0NNWUs6Ci0gICAgICBzd2l0Y2ggKG5Db252ZXJ0Q29sb3JUeXBlKSB7Ci0gICAgICAgIGNhc2UgQ09MT1JUWVBFX0dSQVk6Ci0gICAgICAgICAgcmV0ID0gQ29udmVydENNWUsyR1JBWShmQ29sb3IxLCBmQ29sb3IyLCBmQ29sb3IzLCBmQ29sb3I0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDT0xPUlRZUEVfUkdCOgotICAgICAgICAgIHJldCA9IENvbnZlcnRDTVlLMlJHQihmQ29sb3IxLCBmQ29sb3IyLCBmQ29sb3IzLCBmQ29sb3I0KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLUZYX0NPTE9SUkVGIENQV0xfQ29sb3I6OlRvRlhDb2xvcihpbnQzMl90IG5UcmFuc3BhcmVuY3kpIGNvbnN0IHsKLSAgQ1BXTF9Db2xvciByZXQ7Ci0gIHN3aXRjaCAobkNvbG9yVHlwZSkgewotICAgIGNhc2UgQ09MT1JUWVBFX1RSQU5TUEFSRU5UOiB7Ci0gICAgICByZXQgPSBDUFdMX0NvbG9yKENPTE9SVFlQRV9UUkFOU1BBUkVOVCwgMCwgMCwgMCwgMCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBDT0xPUlRZUEVfR1JBWTogewotICAgICAgcmV0ID0gQ29udmVydEdSQVkyUkdCKGZDb2xvcjEpOwotICAgICAgcmV0LmZDb2xvcjQgPSBuVHJhbnNwYXJlbmN5OwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQ09MT1JUWVBFX1JHQjogewotICAgICAgcmV0ID0gQ1BXTF9Db2xvcihDT0xPUlRZUEVfUkdCLCBmQ29sb3IxLCBmQ29sb3IyLCBmQ29sb3IzKTsKLSAgICAgIHJldC5mQ29sb3I0ID0gblRyYW5zcGFyZW5jeTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIENPTE9SVFlQRV9DTVlLOiB7Ci0gICAgICByZXQgPSBDb252ZXJ0Q01ZSzJSR0IoZkNvbG9yMSwgZkNvbG9yMiwgZkNvbG9yMywgZkNvbG9yNCk7Ci0gICAgICByZXQuZkNvbG9yNCA9IG5UcmFuc3BhcmVuY3k7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIEFyZ2JFbmNvZGUocmV0LmZDb2xvcjQsIHN0YXRpY19jYXN0PGludDMyX3Q+KHJldC5mQ29sb3IxICogMjU1KSwKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmV0LmZDb2xvcjIgKiAyNTUpLAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihyZXQuZkNvbG9yMyAqIDI1NSkpOwotfQotCi1DUFdMX0NvbG9yIENQV0xfQ29sb3I6Om9wZXJhdG9yLShGWF9GTE9BVCBmQ29sb3JTdWIpIGNvbnN0IHsKLSAgQ1BXTF9Db2xvciBzUmV0KG5Db2xvclR5cGUpOwotICBzd2l0Y2ggKG5Db2xvclR5cGUpIHsKLSAgICBjYXNlIENPTE9SVFlQRV9UUkFOU1BBUkVOVDoKLSAgICAgIHNSZXQubkNvbG9yVHlwZSA9IENPTE9SVFlQRV9SR0I7Ci0gICAgICBzUmV0LmZDb2xvcjEgPSBzdGQ6Om1heCgxLjBmIC0gZkNvbG9yU3ViLCAwLjBmKTsKLSAgICAgIHNSZXQuZkNvbG9yMiA9IHN0ZDo6bWF4KDEuMGYgLSBmQ29sb3JTdWIsIDAuMGYpOwotICAgICAgc1JldC5mQ29sb3IzID0gc3RkOjptYXgoMS4wZiAtIGZDb2xvclN1YiwgMC4wZik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENPTE9SVFlQRV9SR0I6Ci0gICAgY2FzZSBDT0xPUlRZUEVfR1JBWToKLSAgICBjYXNlIENPTE9SVFlQRV9DTVlLOgotICAgICAgc1JldC5mQ29sb3IxID0gc3RkOjptYXgoZkNvbG9yMSAtIGZDb2xvclN1YiwgMC4wZik7Ci0gICAgICBzUmV0LmZDb2xvcjIgPSBzdGQ6Om1heChmQ29sb3IyIC0gZkNvbG9yU3ViLCAwLjBmKTsKLSAgICAgIHNSZXQuZkNvbG9yMyA9IHN0ZDo6bWF4KGZDb2xvcjMgLSBmQ29sb3JTdWIsIDAuMGYpOwotICAgICAgc1JldC5mQ29sb3I0ID0gc3RkOjptYXgoZkNvbG9yNCAtIGZDb2xvclN1YiwgMC4wZik7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gc1JldDsKLX0KLQotQ1BXTF9Db2xvciBDUFdMX0NvbG9yOjpvcGVyYXRvci8oRlhfRkxPQVQgZkNvbG9yRGl2aWRlKSBjb25zdCB7Ci0gIENQV0xfQ29sb3Igc1JldChuQ29sb3JUeXBlKTsKLSAgc3dpdGNoIChuQ29sb3JUeXBlKSB7Ci0gICAgY2FzZSBDT0xPUlRZUEVfVFJBTlNQQVJFTlQ6Ci0gICAgICBzUmV0Lm5Db2xvclR5cGUgPSBDT0xPUlRZUEVfUkdCOwotICAgICAgc1JldC5mQ29sb3IxID0gMS4wZiAvIGZDb2xvckRpdmlkZTsKLSAgICAgIHNSZXQuZkNvbG9yMiA9IDEuMGYgLyBmQ29sb3JEaXZpZGU7Ci0gICAgICBzUmV0LmZDb2xvcjMgPSAxLjBmIC8gZkNvbG9yRGl2aWRlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDT0xPUlRZUEVfUkdCOgotICAgIGNhc2UgQ09MT1JUWVBFX0dSQVk6Ci0gICAgY2FzZSBDT0xPUlRZUEVfQ01ZSzoKLSAgICAgIHNSZXQgPSAqdGhpczsKLSAgICAgIHNSZXQuZkNvbG9yMSAvPSBmQ29sb3JEaXZpZGU7Ci0gICAgICBzUmV0LmZDb2xvcjIgLz0gZkNvbG9yRGl2aWRlOwotICAgICAgc1JldC5mQ29sb3IzIC89IGZDb2xvckRpdmlkZTsKLSAgICAgIHNSZXQuZkNvbG9yNCAvPSBmQ29sb3JEaXZpZGU7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gc1JldDsKLX0KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcGRmd2luZG93L2Nwd2xfY29sb3IuaCBiL2ZwZGZzZGsvcGRmd2luZG93L2Nwd2xfY29sb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFiMzRjNy4uMDAwMDAwMAotLS0gYS9mcGRmc2RrL3BkZndpbmRvdy9jcHdsX2NvbG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgRlBERlNES19QREZXSU5ET1dfQ1BXTF9DT0xPUl9IXwotI2RlZmluZSBGUERGU0RLX1BERldJTkRPV19DUFdMX0NPTE9SX0hfCi0KLSNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9mb3JtY29udHJvbC5oIgotCi1zdHJ1Y3QgQ1BXTF9Db2xvciB7Ci0gIENQV0xfQ29sb3IoaW50MzJfdCB0eXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5ULAotICAgICAgICAgICAgIEZYX0ZMT0FUIGNvbG9yMSA9IDAuMGYsCi0gICAgICAgICAgICAgRlhfRkxPQVQgY29sb3IyID0gMC4wZiwKLSAgICAgICAgICAgICBGWF9GTE9BVCBjb2xvcjMgPSAwLjBmLAotICAgICAgICAgICAgIEZYX0ZMT0FUIGNvbG9yNCA9IDAuMGYpCi0gICAgICA6IG5Db2xvclR5cGUodHlwZSksCi0gICAgICAgIGZDb2xvcjEoY29sb3IxKSwKLSAgICAgICAgZkNvbG9yMihjb2xvcjIpLAotICAgICAgICBmQ29sb3IzKGNvbG9yMyksCi0gICAgICAgIGZDb2xvcjQoY29sb3I0KSB7fQotCi0gIENQV0xfQ29sb3IoaW50MzJfdCByLCBpbnQzMl90IGcsIGludDMyX3QgYikKLSAgICAgIDogbkNvbG9yVHlwZShDT0xPUlRZUEVfUkdCKSwKLSAgICAgICAgZkNvbG9yMShyIC8gMjU1LjBmKSwKLSAgICAgICAgZkNvbG9yMihnIC8gMjU1LjBmKSwKLSAgICAgICAgZkNvbG9yMyhiIC8gMjU1LjBmKSwKLSAgICAgICAgZkNvbG9yNCgwKSB7fQotCi0gIENQV0xfQ29sb3Igb3BlcmF0b3IvKEZYX0ZMT0FUIGZDb2xvckRpdmlkZSkgY29uc3Q7Ci0gIENQV0xfQ29sb3Igb3BlcmF0b3ItKEZYX0ZMT0FUIGZDb2xvclN1YikgY29uc3Q7Ci0KLSAgQ1BXTF9Db2xvciBDb252ZXJ0Q29sb3JUeXBlKGludDMyX3Qgb3RoZXJfbkNvbG9yVHlwZSkgY29uc3Q7Ci0KLSAgRlhfQ09MT1JSRUYgVG9GWENvbG9yKGludDMyX3QgblRyYW5zcGFyZW5jeSkgY29uc3Q7Ci0KLSAgdm9pZCBSZXNldCgpIHsKLSAgICBuQ29sb3JUeXBlID0gQ09MT1JUWVBFX1RSQU5TUEFSRU5UOwotICAgIGZDb2xvcjEgPSAwLjBmOwotICAgIGZDb2xvcjIgPSAwLjBmOwotICAgIGZDb2xvcjMgPSAwLjBmOwotICAgIGZDb2xvcjQgPSAwLjBmOwotICB9Ci0KLSAgaW50MzJfdCBuQ29sb3JUeXBlOwotICBGWF9GTE9BVCBmQ29sb3IxOwotICBGWF9GTE9BVCBmQ29sb3IyOwotICBGWF9GTE9BVCBmQ29sb3IzOwotICBGWF9GTE9BVCBmQ29sb3I0OwotfTsKLQotI2VuZGlmICAvLyBGUERGU0RLX1BERldJTkRPV19DUFdMX0NPTE9SX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3B3bC9SRUFETUUubWQgYi9mcGRmc2RrL3B3bC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE3MzI1MAotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvcHdsL1JFQURNRS5tZApAQCAtMCwwICsxLDIxIEBACitmcGRmc2RrL3B3bCBpcyBhIFdpZGdldCBMaWJyYXJ5IGZvciBBY3JvRm9ybXMuCisKK0NQV0xfV25kIGlzIHRoZSBiYXNlIGNsYXNzIHRoYXQgd2lkZ2V0IGNsYXNzZXMgZXh0ZW5kLiBUaGUgZGVyaXZlZCB3aWRnZXQKK2NsYXNzZXMgYXJlIGNvbnRyb2xsZXJzIGZvciBlYWNoIHdpZGdldC4gVGhlIGhpZXJhcmNoeSBpczoKKworKiBDUFdMX1duZAorICAgICogQ1BXTF9CdXR0b24KKyAgICAgICAgKiBDUFdMX0NoZWNrQm94CisgICAgICAgICogQ1BXTF9QdXNoQnV0dG9uCisgICAgICAgICogQ1BXTF9SYWRpb0J1dHRvbgorICAgICogQ1BXTF9DYXJldAorICAgICogQ1BXTF9FZGl0Q3RybAorICAgICAgICAqIENQV0xfRWRpdAorICAgICogQ1BXTF9JY29uCisgICAgKiBDUFdMX0xpc3RCb3gKKyAgICAgICAgKiBDUFdMX0NCTGlzdEJveCAoY29tYm8gYm94KQorICAgICogQ1BXTF9TY3JvbGxCYXIKKworV2lkZ2V0cyBhcmUgcmVuZGVyZWQgdG8gQXBwZWFyYW5jZSBTdHJlYW1zLCB3aXRoIHRoZSBjYXNlIGFsbCBjZW50cmFsaXplZCBpbgorQ1BXTF9BcHBTdHJlYW0uCisKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcHdsL2Nwd2xfYXBwc3RyZWFtLmNwcCBiL2ZwZGZzZGsvcHdsL2Nwd2xfYXBwc3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDNhNjM0Ci0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9wd2wvY3B3bF9hcHBzdHJlYW0uY3BwCkBAIC0wLDAgKzEsMTk5MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF9hcHBzdHJlYW0uaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudC5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9uYW1lLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bWJlci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9yZWZlcmVuY2UuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwdnRfd29yZC5oIgorI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19mb3JtZmlsbGVudmlyb25tZW50LmgiCisjaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX2ludGVyZm9ybS5oIgorI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19wYWdldmlldy5oIgorI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka193aWRnZXQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2Zvcm1maWxsZXIvY2JhX2ZvbnRtYXAuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX2VkaXQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX2VkaXRfaW1wbC5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfaWNvbi5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfd25kLmgiCisKK25hbWVzcGFjZSB7CisKKy8vIENoZWNrYm94ICYgcmFkaW9idXR0b24gc3R5bGVzLgorZW51bSBjbGFzcyBDaGVja1N0eWxlIHsga0NoZWNrID0gMCwga0NpcmNsZSwga0Nyb3NzLCBrRGlhbW9uZCwga1NxdWFyZSwga1N0YXIgfTsKKworLy8gUHVzaGJ1dHRvbiBsYXlvdXQgc3R5bGVzLgorZW51bSBjbGFzcyBCdXR0b25TdHlsZSB7CisgIGtMYWJlbCA9IDAsCisgIGtJY29uLAorICBrSWNvblRvcExhYmVsQm90dG9tLAorICBrSWNvbkJvdHRvbUxhYmVsVG9wLAorICBrSWNvbkxlZnRMYWJlbFJpZ2h0LAorICBrSWNvblJpZ2h0TGFiZWxMZWZ0LAorICBrTGFiZWxPdmVySWNvbgorfTsKKworY29uc3QgY2hhciBrQXBwZW5kUmVjdE9wZXJhdG9yW10gPSAicmUiOworY29uc3QgY2hhciBrQ29uY2F0TWF0cml4T3BlcmF0b3JbXSA9ICJjbSI7Citjb25zdCBjaGFyIGtDdXJ2ZVRvT3BlcmF0b3JbXSA9ICJjIjsKK2NvbnN0IGNoYXIga0VuZFBhdGhOb0ZpbGxPclN0cm9rZU9wZXJhdG9yW10gPSAibiI7Citjb25zdCBjaGFyIGtGaWxsT3BlcmF0b3JbXSA9ICJmIjsKK2NvbnN0IGNoYXIga0ZpbGxFdmVuT2RkT3BlcmF0b3JbXSA9ICJmKiI7Citjb25zdCBjaGFyIGtJbnZva2VOYW1lZFhPYmplY3RPcGVyYXRvcltdID0gIkRvIjsKK2NvbnN0IGNoYXIga0xpbmVUb09wZXJhdG9yW10gPSAibCI7Citjb25zdCBjaGFyIGtNYXJrZWRTZXF1ZW5jZUJlZ2luT3BlcmF0b3JbXSA9ICJCTUMiOworY29uc3QgY2hhciBrTWFya2VkU2VxdWVuY2VFbmRPcGVyYXRvcltdID0gIkVNQyI7Citjb25zdCBjaGFyIGtNb3ZlVGV4dFBvc2l0aW9uT3BlcmF0b3JbXSA9ICJUZCI7Citjb25zdCBjaGFyIGtNb3ZlVG9PcGVyYXRvcltdID0gIm0iOworY29uc3QgY2hhciBrU2V0Q2hhcmFjdGVyU3BhY2luZ09wZXJhdG9yW10gPSAiVGMiOworY29uc3QgY2hhciBrU2V0Q01ZS09wZXJhdG9yW10gPSAiayI7Citjb25zdCBjaGFyIGtTZXRDTUtZU3Ryb2tlZE9wZXJhdG9yW10gPSAiSyI7Citjb25zdCBjaGFyIGtTZXREYXNoT3BlcmF0b3JbXSA9ICJkIjsKK2NvbnN0IGNoYXIga1NldEdyYXlPcGVyYXRvcltdID0gImciOworY29uc3QgY2hhciBrU2V0R3JheVN0cm9rZWRPcGVyYXRvcltdID0gIkciOworY29uc3QgY2hhciBrU2V0TGluZUNhcFN0eWxlT3BlcmF0b3JbXSA9ICJKIjsKK2NvbnN0IGNoYXIga1NldExpbmVKb2luU3R5bGVPcGVyYXRvcltdID0gImoiOworY29uc3QgY2hhciBrU2V0TGluZVdpZHRoT3BlcmF0b3JbXSA9ICJ3IjsKK2NvbnN0IGNoYXIga1NldE5vblplcm9XaW5kaW5nQ2xpcE9wZXJhdG9yW10gPSAiVyI7Citjb25zdCBjaGFyIGtTZXRSR0JPcGVyYXRvcltdID0gInJnIjsKK2NvbnN0IGNoYXIga1NldFJHQlN0cm9rZWRPcGVyYXRvcltdID0gIlJHIjsKK2NvbnN0IGNoYXIga1NldFRleHRGb250QW5kU2l6ZU9wZXJhdG9yW10gPSAiVGYiOworY29uc3QgY2hhciBrU2V0VGV4dFNjYWxlSG9yaXpvbnRhbE9wZXJhdG9yW10gPSAiVHoiOworY29uc3QgY2hhciBrU2hvd1RleHRPcGVyYXRvcltdID0gIlRqIjsKK2NvbnN0IGNoYXIga1N0YXRlUmVzdG9yZU9wZXJhdG9yW10gPSAiUSI7Citjb25zdCBjaGFyIGtTdGF0ZVNhdmVPcGVyYXRvcltdID0gInEiOworY29uc3QgY2hhciBrU3Ryb2tlT3BlcmF0b3JbXSA9ICJTIjsKK2NvbnN0IGNoYXIga1RleHRCZWdpbk9wZXJhdG9yW10gPSAiQlQiOworY29uc3QgY2hhciBrVGV4dEVuZE9wZXJhdG9yW10gPSAiRVQiOworCitjbGFzcyBBdXRvQ2xvc2VkQ29tbWFuZCB7CisgcHVibGljOgorICBBdXRvQ2xvc2VkQ29tbWFuZChzdGQ6Om9zdHJpbmdzdHJlYW0qIHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgQnl0ZVN0cmluZyBvcGVuLAorICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nIGNsb3NlKQorICAgICAgOiBzdHJlYW1fKHN0cmVhbSksIGNsb3NlXyhjbG9zZSkgeworICAgICpzdHJlYW1fIDw8IG9wZW4gPDwgIlxuIjsKKyAgfQorCisgIHZpcnR1YWwgfkF1dG9DbG9zZWRDb21tYW5kKCkgeyAqc3RyZWFtXyA8PCBjbG9zZV8gPDwgIlxuIjsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjpvc3RyaW5nc3RyZWFtKiBzdHJlYW1fOworICBCeXRlU3RyaW5nIGNsb3NlXzsKK307CisKK2NsYXNzIEF1dG9DbG9zZWRRQ29tbWFuZCA6IHB1YmxpYyBBdXRvQ2xvc2VkQ29tbWFuZCB7CisgcHVibGljOgorICBleHBsaWNpdCBBdXRvQ2xvc2VkUUNvbW1hbmQoc3RkOjpvc3RyaW5nc3RyZWFtKiBzdHJlYW0pCisgICAgICA6IEF1dG9DbG9zZWRDb21tYW5kKHN0cmVhbSwga1N0YXRlU2F2ZU9wZXJhdG9yLCBrU3RhdGVSZXN0b3JlT3BlcmF0b3IpIHt9CisgIH5BdXRvQ2xvc2VkUUNvbW1hbmQoKSBvdmVycmlkZSB7fQorfTsKKworQnl0ZVN0cmluZyBHZXRDb2xvckFwcFN0cmVhbShjb25zdCBDRlhfQ29sb3ImIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib29sJiBiRmlsbE9yU3Ryb2tlKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzQ29sb3JTdHJlYW07CisKKyAgc3dpdGNoIChjb2xvci5uQ29sb3JUeXBlKSB7CisgICAgY2FzZSBDRlhfQ29sb3I6OmtSR0I6CisgICAgICBzQ29sb3JTdHJlYW0gPDwgY29sb3IuZkNvbG9yMSA8PCAiICIgPDwgY29sb3IuZkNvbG9yMiA8PCAiICIKKyAgICAgICAgICAgICAgICAgICA8PCBjb2xvci5mQ29sb3IzIDw8ICIgIgorICAgICAgICAgICAgICAgICAgIDw8IChiRmlsbE9yU3Ryb2tlID8ga1NldFJHQk9wZXJhdG9yIDoga1NldFJHQlN0cm9rZWRPcGVyYXRvcikKKyAgICAgICAgICAgICAgICAgICA8PCAiXG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDRlhfQ29sb3I6OmtHcmF5OgorICAgICAgc0NvbG9yU3RyZWFtIDw8IGNvbG9yLmZDb2xvcjEgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgPDwgKGJGaWxsT3JTdHJva2UgPyBrU2V0R3JheU9wZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBrU2V0R3JheVN0cm9rZWRPcGVyYXRvcikKKyAgICAgICAgICAgICAgICAgICA8PCAiXG4iOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDRlhfQ29sb3I6OmtDTVlLOgorICAgICAgc0NvbG9yU3RyZWFtIDw8IGNvbG9yLmZDb2xvcjEgPDwgIiAiIDw8IGNvbG9yLmZDb2xvcjIgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgPDwgY29sb3IuZkNvbG9yMyA8PCAiICIgPDwgY29sb3IuZkNvbG9yNCA8PCAiICIKKyAgICAgICAgICAgICAgICAgICA8PCAoYkZpbGxPclN0cm9rZSA/IGtTZXRDTVlLT3BlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtTZXRDTUtZU3Ryb2tlZE9wZXJhdG9yKQorICAgICAgICAgICAgICAgICAgIDw8ICJcbiI7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBCeXRlU3RyaW5nKHNDb2xvclN0cmVhbSk7Cit9CisKK0J5dGVTdHJpbmcgR2V0QVBfQ2hlY2soY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgY3JCQm94KSB7CisgIGNvbnN0IGZsb2F0IGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OworICBjb25zdCBmbG9hdCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207CisKKyAgQ0ZYX1BvaW50RiBwdHNbOF1bM10gPSB7e0NGWF9Qb2ludEYoMC4yOGYsIDAuNTJmKSwgQ0ZYX1BvaW50RigwLjI3ZiwgMC40OGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RigwLjI5ZiwgMC40MGYpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAge0NGWF9Qb2ludEYoMC4zMGYsIDAuMzNmKSwgQ0ZYX1BvaW50RigwLjMxZiwgMC4yOWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RigwLjMxZiwgMC4yOGYpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAge0NGWF9Qb2ludEYoMC4zOWYsIDAuMjhmKSwgQ0ZYX1BvaW50RigwLjQ5ZiwgMC4yOWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RigwLjc3ZiwgMC42N2YpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAge0NGWF9Qb2ludEYoMC43NmYsIDAuNjhmKSwgQ0ZYX1BvaW50RigwLjc4ZiwgMC42OWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RigwLjc2ZiwgMC43NWYpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAge0NGWF9Qb2ludEYoMC43NmYsIDAuNzVmKSwgQ0ZYX1BvaW50RigwLjczZiwgMC44MGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RigwLjY4ZiwgMC43NWYpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAge0NGWF9Qb2ludEYoMC42OGYsIDAuNzRmKSwgQ0ZYX1BvaW50RigwLjY4ZiwgMC43NGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RigwLjQ0ZiwgMC40N2YpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAge0NGWF9Qb2ludEYoMC40M2YsIDAuNDdmKSwgQ0ZYX1BvaW50RigwLjQwZiwgMC40N2YpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RigwLjQxZiwgMC41OGYpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAge0NGWF9Qb2ludEYoMC40MGYsIDAuNjBmKSwgQ0ZYX1BvaW50RigwLjI4ZiwgMC42NmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BvaW50RigwLjMwZiwgMC41NmYpfX07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUocHRzKTsgKytpKSB7CisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBGWF9BcnJheVNpemUocHRzWzBdKTsgKytqKSB7CisgICAgICBwdHNbaV1bal0ueCA9IHB0c1tpXVtqXS54ICogZldpZHRoICsgY3JCQm94LmxlZnQ7CisgICAgICBwdHNbaV1bal0ueSAqPSBwdHNbaV1bal0ueSAqIGZIZWlnaHQgKyBjckJCb3guYm90dG9tOworICAgIH0KKyAgfQorCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjc0FQOworICBjc0FQIDw8IHB0c1swXVswXS54IDw8ICIgIiA8PCBwdHNbMF1bMF0ueSA8PCAiICIgPDwga01vdmVUb09wZXJhdG9yIDw8ICJcbiI7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUocHRzKTsgKytpKSB7CisgICAgc2l6ZV90IG5OZXh0ID0gaSA8IEZYX0FycmF5U2l6ZShwdHMpIC0gMSA/IGkgKyAxIDogMDsKKworICAgIGZsb2F0IHB4MSA9IHB0c1tpXVsxXS54IC0gcHRzW2ldWzBdLng7CisgICAgZmxvYXQgcHkxID0gcHRzW2ldWzFdLnkgLSBwdHNbaV1bMF0ueTsKKyAgICBmbG9hdCBweDIgPSBwdHNbaV1bMl0ueCAtIHB0c1tuTmV4dF1bMF0ueDsKKyAgICBmbG9hdCBweTIgPSBwdHNbaV1bMl0ueSAtIHB0c1tuTmV4dF1bMF0ueTsKKworICAgIGNzQVAgPDwgcHRzW2ldWzBdLnggKyBweDEgKiBGWF9CRVpJRVIgPDwgIiAiCisgICAgICAgICA8PCBwdHNbaV1bMF0ueSArIHB5MSAqIEZYX0JFWklFUiA8PCAiICIKKyAgICAgICAgIDw8IHB0c1tuTmV4dF1bMF0ueCArIHB4MiAqIEZYX0JFWklFUiA8PCAiICIKKyAgICAgICAgIDw8IHB0c1tuTmV4dF1bMF0ueSArIHB5MiAqIEZYX0JFWklFUiA8PCAiICIgPDwgcHRzW25OZXh0XVswXS54IDw8ICIgIgorICAgICAgICAgPDwgcHRzW25OZXh0XVswXS55IDw8ICIgIiA8PCBrQ3VydmVUb09wZXJhdG9yIDw8ICJcbiI7CisgIH0KKworICByZXR1cm4gQnl0ZVN0cmluZyhjc0FQKTsKK30KKworQnl0ZVN0cmluZyBHZXRBUF9DaXJjbGUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgY3JCQm94KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjc0FQOworCisgIGZsb2F0IGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OworICBmbG9hdCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207CisKKyAgQ0ZYX1BvaW50RiBwdDEoY3JCQm94LmxlZnQsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMik7CisgIENGWF9Qb2ludEYgcHQyKGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMiwgY3JCQm94LnRvcCk7CisgIENGWF9Qb2ludEYgcHQzKGNyQkJveC5yaWdodCwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyKTsKKyAgQ0ZYX1BvaW50RiBwdDQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLCBjckJCb3guYm90dG9tKTsKKworICBjc0FQIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiICIgPDwga01vdmVUb09wZXJhdG9yIDw8ICJcbiI7CisKKyAgZmxvYXQgcHggPSBwdDIueCAtIHB0MS54OworICBmbG9hdCBweSA9IHB0Mi55IC0gcHQxLnk7CisKKyAgY3NBUCA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgKyBweSAqIEZYX0JFWklFUiA8PCAiICIKKyAgICAgICA8PCBwdDIueCAtIHB4ICogRlhfQkVaSUVSIDw8ICIgIiA8PCBwdDIueSA8PCAiICIgPDwgcHQyLnggPDwgIiAiIDw8IHB0Mi55CisgICAgICAgPDwgIiAiIDw8IGtDdXJ2ZVRvT3BlcmF0b3IgPDwgIlxuIjsKKworICBweCA9IHB0My54IC0gcHQyLng7CisgIHB5ID0gcHQyLnkgLSBwdDMueTsKKworICBjc0FQIDw8IHB0Mi54ICsgcHggKiBGWF9CRVpJRVIgPDwgIiAiIDw8IHB0Mi55IDw8ICIgIiA8PCBwdDMueCA8PCAiICIKKyAgICAgICA8PCBwdDMueSArIHB5ICogRlhfQkVaSUVSIDw8ICIgIiA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiAiCisgICAgICAgPDwga0N1cnZlVG9PcGVyYXRvciA8PCAiXG4iOworCisgIHB4ID0gcHQzLnggLSBwdDQueDsKKyAgcHkgPSBwdDMueSAtIHB0NC55OworCisgIGNzQVAgPDwgcHQzLnggPDwgIiAiIDw8IHB0My55IC0gcHkgKiBGWF9CRVpJRVIgPDwgIiAiCisgICAgICAgPDwgcHQ0LnggKyBweCAqIEZYX0JFWklFUiA8PCAiICIgPDwgcHQ0LnkgPDwgIiAiIDw8IHB0NC54IDw8ICIgIiA8PCBwdDQueQorICAgICAgIDw8ICIgIiA8PCBrQ3VydmVUb09wZXJhdG9yIDw8ICJcbiI7CisKKyAgcHggPSBwdDQueCAtIHB0MS54OworICBweSA9IHB0MS55IC0gcHQ0Lnk7CisKKyAgY3NBUCA8PCBwdDQueCAtIHB4ICogRlhfQkVaSUVSIDw8ICIgIiA8PCBwdDQueSA8PCAiICIgPDwgcHQxLnggPDwgIiAiCisgICAgICAgPDwgcHQxLnkgLSBweSAqIEZYX0JFWklFUiA8PCAiICIgPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgIgorICAgICAgIDw8IGtDdXJ2ZVRvT3BlcmF0b3IgPDwgIlxuIjsKKworICByZXR1cm4gQnl0ZVN0cmluZyhjc0FQKTsKK30KKworQnl0ZVN0cmluZyBHZXRBUF9Dcm9zcyhjb25zdCBDRlhfRmxvYXRSZWN0JiBjckJCb3gpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGNzQVA7CisKKyAgY3NBUCA8PCBjckJCb3gubGVmdCA8PCAiICIgPDwgY3JCQm94LnRvcCA8PCAiICIgPDwga01vdmVUb09wZXJhdG9yIDw8ICJcbiI7CisgIGNzQVAgPDwgY3JCQm94LnJpZ2h0IDw8ICIgIiA8PCBjckJCb3guYm90dG9tIDw8ICIgIiA8PCBrTGluZVRvT3BlcmF0b3IKKyAgICAgICA8PCAiXG4iOworICBjc0FQIDw8IGNyQkJveC5sZWZ0IDw8ICIgIiA8PCBjckJCb3guYm90dG9tIDw8ICIgIiA8PCBrTW92ZVRvT3BlcmF0b3IgPDwgIlxuIjsKKyAgY3NBUCA8PCBjckJCb3gucmlnaHQgPDwgIiAiIDw8IGNyQkJveC50b3AgPDwgIiAiIDw8IGtMaW5lVG9PcGVyYXRvciA8PCAiXG4iOworCisgIHJldHVybiBCeXRlU3RyaW5nKGNzQVApOworfQorCitCeXRlU3RyaW5nIEdldEFQX0RpYW1vbmQoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgY3JCQm94KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjc0FQOworCisgIGZsb2F0IGZXaWR0aCA9IGNyQkJveC5yaWdodCAtIGNyQkJveC5sZWZ0OworICBmbG9hdCBmSGVpZ2h0ID0gY3JCQm94LnRvcCAtIGNyQkJveC5ib3R0b207CisKKyAgQ0ZYX1BvaW50RiBwdDEoY3JCQm94LmxlZnQsIGNyQkJveC5ib3R0b20gKyBmSGVpZ2h0IC8gMik7CisgIENGWF9Qb2ludEYgcHQyKGNyQkJveC5sZWZ0ICsgZldpZHRoIC8gMiwgY3JCQm94LnRvcCk7CisgIENGWF9Qb2ludEYgcHQzKGNyQkJveC5yaWdodCwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyKTsKKyAgQ0ZYX1BvaW50RiBwdDQoY3JCQm94LmxlZnQgKyBmV2lkdGggLyAyLCBjckJCb3guYm90dG9tKTsKKworICBjc0FQIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiICIgPDwga01vdmVUb09wZXJhdG9yIDw8ICJcbiI7CisgIGNzQVAgPDwgcHQyLnggPDwgIiAiIDw8IHB0Mi55IDw8ICIgIiA8PCBrTGluZVRvT3BlcmF0b3IgPDwgIlxuIjsKKyAgY3NBUCA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiAiIDw8IGtMaW5lVG9PcGVyYXRvciA8PCAiXG4iOworICBjc0FQIDw8IHB0NC54IDw8ICIgIiA8PCBwdDQueSA8PCAiICIgPDwga0xpbmVUb09wZXJhdG9yIDw8ICJcbiI7CisgIGNzQVAgPDwgcHQxLnggPDwgIiAiIDw8IHB0MS55IDw8ICIgIiA8PCBrTGluZVRvT3BlcmF0b3IgPDwgIlxuIjsKKworICByZXR1cm4gQnl0ZVN0cmluZyhjc0FQKTsKK30KKworQnl0ZVN0cmluZyBHZXRBUF9TcXVhcmUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgY3JCQm94KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBjc0FQOworCisgIGNzQVAgPDwgY3JCQm94LmxlZnQgPDwgIiAiIDw8IGNyQkJveC50b3AgPDwgIiAiIDw8IGtNb3ZlVG9PcGVyYXRvciA8PCAiXG4iOworICBjc0FQIDw8IGNyQkJveC5yaWdodCA8PCAiICIgPDwgY3JCQm94LnRvcCA8PCAiICIgPDwga0xpbmVUb09wZXJhdG9yIDw8ICJcbiI7CisgIGNzQVAgPDwgY3JCQm94LnJpZ2h0IDw8ICIgIiA8PCBjckJCb3guYm90dG9tIDw8ICIgIiA8PCBrTGluZVRvT3BlcmF0b3IKKyAgICAgICA8PCAiXG4iOworICBjc0FQIDw8IGNyQkJveC5sZWZ0IDw8ICIgIiA8PCBjckJCb3guYm90dG9tIDw8ICIgIiA8PCBrTGluZVRvT3BlcmF0b3IgPDwgIlxuIjsKKyAgY3NBUCA8PCBjckJCb3gubGVmdCA8PCAiICIgPDwgY3JCQm94LnRvcCA8PCAiICIgPDwga0xpbmVUb09wZXJhdG9yIDw8ICJcbiI7CisKKyAgcmV0dXJuIEJ5dGVTdHJpbmcoY3NBUCk7Cit9CisKK0J5dGVTdHJpbmcgR2V0QVBfU3Rhcihjb25zdCBDRlhfRmxvYXRSZWN0JiBjckJCb3gpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGNzQVA7CisKKyAgZmxvYXQgZlJhZGl1cyA9IChjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbSkgLyAoMSArIChmbG9hdCljb3MoRlhfUEkgLyA1LjBmKSk7CisgIENGWF9Qb2ludEYgcHRDZW50ZXIgPSBDRlhfUG9pbnRGKChjckJCb3gubGVmdCArIGNyQkJveC5yaWdodCkgLyAyLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3JCQm94LnRvcCArIGNyQkJveC5ib3R0b20pIC8gMi4wZik7CisKKyAgZmxvYXQgcHhbNV07CisgIGZsb2F0IHB5WzVdOworICBmbG9hdCBmQW5nZWwgPSBGWF9QSSAvIDEwLjBmOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICBweFtpXSA9IHB0Q2VudGVyLnggKyBmUmFkaXVzICogKGZsb2F0KWNvcyhmQW5nZWwpOworICAgIHB5W2ldID0gcHRDZW50ZXIueSArIGZSYWRpdXMgKiAoZmxvYXQpc2luKGZBbmdlbCk7CisgICAgZkFuZ2VsICs9IEZYX1BJICogMiAvIDUuMGY7CisgIH0KKworICBjc0FQIDw8IHB4WzBdIDw8ICIgIiA8PCBweVswXSA8PCAiICIgPDwga01vdmVUb09wZXJhdG9yIDw8ICJcbiI7CisKKyAgaW50MzJfdCBuTmV4dCA9IDA7CisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IDU7IGorKykgeworICAgIG5OZXh0ICs9IDI7CisgICAgaWYgKG5OZXh0ID49IDUpCisgICAgICBuTmV4dCAtPSA1OworICAgIGNzQVAgPDwgcHhbbk5leHRdIDw8ICIgIiA8PCBweVtuTmV4dF0gPDwgIiAiIDw8IGtMaW5lVG9PcGVyYXRvciA8PCAiXG4iOworICB9CisKKyAgcmV0dXJuIEJ5dGVTdHJpbmcoY3NBUCk7Cit9CisKK0J5dGVTdHJpbmcgR2V0QVBfSGFsZkNpcmNsZShjb25zdCBDRlhfRmxvYXRSZWN0JiBjckJCb3gsIGZsb2F0IGZSb3RhdGUpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIGNzQVA7CisKKyAgZmxvYXQgZldpZHRoID0gY3JCQm94LnJpZ2h0IC0gY3JCQm94LmxlZnQ7CisgIGZsb2F0IGZIZWlnaHQgPSBjckJCb3gudG9wIC0gY3JCQm94LmJvdHRvbTsKKworICBDRlhfUG9pbnRGIHB0MSgtZldpZHRoIC8gMiwgMCk7CisgIENGWF9Qb2ludEYgcHQyKDAsIGZIZWlnaHQgLyAyKTsKKyAgQ0ZYX1BvaW50RiBwdDMoZldpZHRoIC8gMiwgMCk7CisKKyAgZmxvYXQgcHg7CisgIGZsb2F0IHB5OworCisgIGNzQVAgPDwgY29zKGZSb3RhdGUpIDw8ICIgIiA8PCBzaW4oZlJvdGF0ZSkgPDwgIiAiIDw8IC1zaW4oZlJvdGF0ZSkgPDwgIiAiCisgICAgICAgPDwgY29zKGZSb3RhdGUpIDw8ICIgIiA8PCBjckJCb3gubGVmdCArIGZXaWR0aCAvIDIgPDwgIiAiCisgICAgICAgPDwgY3JCQm94LmJvdHRvbSArIGZIZWlnaHQgLyAyIDw8ICIgIiA8PCBrQ29uY2F0TWF0cml4T3BlcmF0b3IgPDwgIlxuIjsKKworICBjc0FQIDw8IHB0MS54IDw8ICIgIiA8PCBwdDEueSA8PCAiICIgPDwga01vdmVUb09wZXJhdG9yIDw8ICJcbiI7CisKKyAgcHggPSBwdDIueCAtIHB0MS54OworICBweSA9IHB0Mi55IC0gcHQxLnk7CisKKyAgY3NBUCA8PCBwdDEueCA8PCAiICIgPDwgcHQxLnkgKyBweSAqIEZYX0JFWklFUiA8PCAiICIKKyAgICAgICA8PCBwdDIueCAtIHB4ICogRlhfQkVaSUVSIDw8ICIgIiA8PCBwdDIueSA8PCAiICIgPDwgcHQyLnggPDwgIiAiIDw8IHB0Mi55CisgICAgICAgPDwgIiAiIDw8IGtDdXJ2ZVRvT3BlcmF0b3IgPDwgIlxuIjsKKworICBweCA9IHB0My54IC0gcHQyLng7CisgIHB5ID0gcHQyLnkgLSBwdDMueTsKKworICBjc0FQIDw8IHB0Mi54ICsgcHggKiBGWF9CRVpJRVIgPDwgIiAiIDw8IHB0Mi55IDw8ICIgIiA8PCBwdDMueCA8PCAiICIKKyAgICAgICA8PCBwdDMueSArIHB5ICogRlhfQkVaSUVSIDw8ICIgIiA8PCBwdDMueCA8PCAiICIgPDwgcHQzLnkgPDwgIiAiCisgICAgICAgPDwga0N1cnZlVG9PcGVyYXRvciA8PCAiXG4iOworCisgIHJldHVybiBCeXRlU3RyaW5nKGNzQVApOworfQorCitCeXRlU3RyaW5nIEdldEFwcFN0cmVhbV9DaGVjayhjb25zdCBDRlhfRmxvYXRSZWN0JiByY0JCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ29sb3ImIGNyVGV4dCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc0FQOworICB7CisgICAgQXV0b0Nsb3NlZFFDb21tYW5kIHEoJnNBUCk7CisgICAgc0FQIDw8IEdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCwgdHJ1ZSkgPDwgR2V0QVBfQ2hlY2socmNCQm94KQorICAgICAgICA8PCBrRmlsbE9wZXJhdG9yIDw8ICJcbiI7CisgIH0KKyAgcmV0dXJuIEJ5dGVTdHJpbmcoc0FQKTsKK30KKworQnl0ZVN0cmluZyBHZXRBcHBTdHJlYW1fQ2lyY2xlKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ29sb3ImIGNyVGV4dCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc0FQOworICB7CisgICAgQXV0b0Nsb3NlZFFDb21tYW5kIHEoJnNBUCk7CisgICAgc0FQIDw8IEdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCwgdHJ1ZSkgPDwgR2V0QVBfQ2lyY2xlKHJjQkJveCkKKyAgICAgICAgPDwga0ZpbGxPcGVyYXRvciA8PCAiXG4iOworICB9CisgIHJldHVybiBCeXRlU3RyaW5nKHNBUCk7Cit9CisKK0J5dGVTdHJpbmcgR2V0QXBwU3RyZWFtX0Nyb3NzKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Db2xvciYgY3JUZXh0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzQVA7CisgIHsKKyAgICBBdXRvQ2xvc2VkUUNvbW1hbmQgcSgmc0FQKTsKKyAgICBzQVAgPDwgR2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LCBmYWxzZSkgPDwgR2V0QVBfQ3Jvc3MocmNCQm94KQorICAgICAgICA8PCBrU3Ryb2tlT3BlcmF0b3IgPDwgIlxuIjsKKyAgfQorICByZXR1cm4gQnl0ZVN0cmluZyhzQVApOworfQorCitCeXRlU3RyaW5nIEdldEFwcFN0cmVhbV9EaWFtb25kKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NvbG9yJiBjclRleHQpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNBUDsKKyAgeworICAgIEF1dG9DbG9zZWRRQ29tbWFuZCBxKCZzQVApOworICAgIHNBUCA8PCAiMSAiIDw8IGtTZXRMaW5lV2lkdGhPcGVyYXRvciA8PCAiXG4iCisgICAgICAgIDw8IEdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCwgdHJ1ZSkgPDwgR2V0QVBfRGlhbW9uZChyY0JCb3gpCisgICAgICAgIDw8IGtGaWxsT3BlcmF0b3IgPDwgIlxuIjsKKyAgfQorICByZXR1cm4gQnl0ZVN0cmluZyhzQVApOworfQorCitCeXRlU3RyaW5nIEdldEFwcFN0cmVhbV9TcXVhcmUoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Db2xvciYgY3JUZXh0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzQVA7CisgIHsKKyAgICBBdXRvQ2xvc2VkUUNvbW1hbmQgcSgmc0FQKTsKKyAgICBzQVAgPDwgR2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LCB0cnVlKSA8PCBHZXRBUF9TcXVhcmUocmNCQm94KQorICAgICAgICA8PCBrRmlsbE9wZXJhdG9yIDw8ICJcbiI7CisgIH0KKyAgcmV0dXJuIEJ5dGVTdHJpbmcoc0FQKTsKK30KKworQnl0ZVN0cmluZyBHZXRBcHBTdHJlYW1fU3Rhcihjb25zdCBDRlhfRmxvYXRSZWN0JiByY0JCb3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Db2xvciYgY3JUZXh0KSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzQVA7CisgIHsKKyAgICBBdXRvQ2xvc2VkUUNvbW1hbmQgcSgmc0FQKTsKKyAgICBzQVAgPDwgR2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LCB0cnVlKSA8PCBHZXRBUF9TdGFyKHJjQkJveCkKKyAgICAgICAgPDwga0ZpbGxPcGVyYXRvciA8PCAiXG4iOworICB9CisgIHJldHVybiBCeXRlU3RyaW5nKHNBUCk7Cit9CisKK0J5dGVTdHJpbmcgR2V0Q2lyY2xlRmlsbEFwcFN0cmVhbShjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Db2xvciYgY29sb3IpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNBcHBTdHJlYW07CisgIEJ5dGVTdHJpbmcgc0NvbG9yID0gR2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsIHRydWUpOworICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgIEF1dG9DbG9zZWRRQ29tbWFuZCBxKCZzQXBwU3RyZWFtKTsKKyAgICBzQXBwU3RyZWFtIDw8IHNDb2xvciA8PCBHZXRBUF9DaXJjbGUocmVjdCkgPDwga0ZpbGxPcGVyYXRvciA8PCAiXG4iOworICB9CisgIHJldHVybiBCeXRlU3RyaW5nKHNBcHBTdHJlYW0pOworfQorCitCeXRlU3RyaW5nIEdldENpcmNsZUJvcmRlckFwcFN0cmVhbShjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NvbG9yJiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Db2xvciYgY3JMZWZ0VG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NvbG9yJiBjclJpZ2h0Qm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9yZGVyU3R5bGUgblN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BXTF9EYXNoJiBkYXNoKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzQXBwU3RyZWFtOworICBCeXRlU3RyaW5nIHNDb2xvcjsKKworICBpZiAoZldpZHRoID4gMC4wZikgeworICAgIEF1dG9DbG9zZWRRQ29tbWFuZCBxKCZzQXBwU3RyZWFtKTsKKworICAgIGZsb2F0IGZIYWxmV2lkdGggPSBmV2lkdGggLyAyLjBmOworICAgIENGWF9GbG9hdFJlY3QgcmVjdF9ieV8yID0gcmVjdC5HZXREZWZsYXRlZChmSGFsZldpZHRoLCBmSGFsZldpZHRoKTsKKworICAgIGZsb2F0IGRpdiA9IGZIYWxmV2lkdGggKiAwLjc1ZjsKKyAgICBDRlhfRmxvYXRSZWN0IHJlY3RfYnlfNzUgPSByZWN0LkdldERlZmxhdGVkKGRpdiwgZGl2KTsKKyAgICBzd2l0Y2ggKG5TdHlsZSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgIGNhc2UgQm9yZGVyU3R5bGU6OlNPTElEOgorICAgICAgY2FzZSBCb3JkZXJTdHlsZTo6VU5ERVJMSU5FOiB7CisgICAgICAgIHNDb2xvciA9IEdldENvbG9yQXBwU3RyZWFtKGNvbG9yLCBmYWxzZSk7CisgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgQXV0b0Nsb3NlZFFDb21tYW5kIHEyKCZzQXBwU3RyZWFtKTsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZXaWR0aCA8PCAiICIgPDwga1NldExpbmVXaWR0aE9wZXJhdG9yIDw8ICJcbiIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHNDb2xvciA8PCBHZXRBUF9DaXJjbGUocmVjdF9ieV8yKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGtTdHJva2VPcGVyYXRvciA8PCAiXG4iOworICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBCb3JkZXJTdHlsZTo6REFTSDogeworICAgICAgICBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjb2xvciwgZmFsc2UpOworICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIEF1dG9DbG9zZWRRQ29tbWFuZCBxMigmc0FwcFN0cmVhbSk7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmV2lkdGggPDwgIiAiIDw8IGtTZXRMaW5lV2lkdGhPcGVyYXRvciA8PCAiXG4iCisgICAgICAgICAgICAgICAgICAgICA8PCAiWyIgPDwgZGFzaC5uRGFzaCA8PCAiICIgPDwgZGFzaC5uR2FwIDw8ICJdICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGRhc2gublBoYXNlIDw8ICIgIiA8PCBrU2V0RGFzaE9wZXJhdG9yIDw8ICJcbiIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHNDb2xvciA8PCBHZXRBUF9DaXJjbGUocmVjdF9ieV8yKSA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGtTdHJva2VPcGVyYXRvciA8PCAiXG4iOworICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBCb3JkZXJTdHlsZTo6QkVWRUxFRDogeworICAgICAgICBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjb2xvciwgZmFsc2UpOworICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIEF1dG9DbG9zZWRRQ29tbWFuZCBxMigmc0FwcFN0cmVhbSk7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmSGFsZldpZHRoIDw8ICIgIiA8PCBrU2V0TGluZVdpZHRoT3BlcmF0b3IgPDwgIlxuIgorICAgICAgICAgICAgICAgICAgICAgPDwgc0NvbG9yIDw8IEdldEFQX0NpcmNsZShyZWN0KSA8PCAiICIgPDwga1N0cm9rZU9wZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iOworICAgICAgICB9CisKKyAgICAgICAgc0NvbG9yID0gR2V0Q29sb3JBcHBTdHJlYW0oY3JMZWZ0VG9wLCBmYWxzZSk7CisgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgQXV0b0Nsb3NlZFFDb21tYW5kIHEyKCZzQXBwU3RyZWFtKTsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZIYWxmV2lkdGggPDwgIiAiIDw8IGtTZXRMaW5lV2lkdGhPcGVyYXRvciA8PCAiXG4iCisgICAgICAgICAgICAgICAgICAgICA8PCBzQ29sb3IgPDwgR2V0QVBfSGFsZkNpcmNsZShyZWN0X2J5Xzc1LCBGWF9QSSAvIDQuMGYpCisgICAgICAgICAgICAgICAgICAgICA8PCAiICIgPDwga1N0cm9rZU9wZXJhdG9yIDw8ICJcbiI7CisgICAgICAgIH0KKworICAgICAgICBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjclJpZ2h0Qm90dG9tLCBmYWxzZSk7CisgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgQXV0b0Nsb3NlZFFDb21tYW5kIHEyKCZzQXBwU3RyZWFtKTsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZIYWxmV2lkdGggPDwgIiAiIDw8IGtTZXRMaW5lV2lkdGhPcGVyYXRvciA8PCAiXG4iCisgICAgICAgICAgICAgICAgICAgICA8PCBzQ29sb3IgPDwgR2V0QVBfSGFsZkNpcmNsZShyZWN0X2J5Xzc1LCBGWF9QSSAqIDUgLyA0LjBmKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IGtTdHJva2VPcGVyYXRvciA8PCAiXG4iOworICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBCb3JkZXJTdHlsZTo6SU5TRVQ6IHsKKyAgICAgICAgc0NvbG9yID0gR2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsIGZhbHNlKTsKKyAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBBdXRvQ2xvc2VkUUNvbW1hbmQgcTIoJnNBcHBTdHJlYW0pOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkhhbGZXaWR0aCA8PCAiICIgPDwga1NldExpbmVXaWR0aE9wZXJhdG9yIDw8ICJcbiIKKyAgICAgICAgICAgICAgICAgICAgIDw8IHNDb2xvciA8PCBHZXRBUF9DaXJjbGUocmVjdCkgPDwgIiAiIDw8IGtTdHJva2VPcGVyYXRvcgorICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIjsKKyAgICAgICAgfQorCisgICAgICAgIHNDb2xvciA9IEdldENvbG9yQXBwU3RyZWFtKGNyTGVmdFRvcCwgZmFsc2UpOworICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIEF1dG9DbG9zZWRRQ29tbWFuZCBxMigmc0FwcFN0cmVhbSk7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmSGFsZldpZHRoIDw8ICIgIiA8PCBrU2V0TGluZVdpZHRoT3BlcmF0b3IgPDwgIlxuIgorICAgICAgICAgICAgICAgICAgICAgPDwgc0NvbG9yIDw8IEdldEFQX0hhbGZDaXJjbGUocmVjdF9ieV83NSwgRlhfUEkgLyA0LjBmKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IGtTdHJva2VPcGVyYXRvciA8PCAiXG4iOworICAgICAgICB9CisKKyAgICAgICAgc0NvbG9yID0gR2V0Q29sb3JBcHBTdHJlYW0oY3JSaWdodEJvdHRvbSwgZmFsc2UpOworICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIEF1dG9DbG9zZWRRQ29tbWFuZCBxMigmc0FwcFN0cmVhbSk7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmSGFsZldpZHRoIDw8ICIgIiA8PCBrU2V0TGluZVdpZHRoT3BlcmF0b3IgPDwgIlxuIgorICAgICAgICAgICAgICAgICAgICAgPDwgc0NvbG9yIDw8IEdldEFQX0hhbGZDaXJjbGUocmVjdF9ieV83NSwgRlhfUEkgKiA1IC8gNC4wZikKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgIiA8PCBrU3Ryb2tlT3BlcmF0b3IgPDwgIlxuIjsKKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEJ5dGVTdHJpbmcoc0FwcFN0cmVhbSk7Cit9CisKK0J5dGVTdHJpbmcgR2V0Q2hlY2tCb3hBcHBTdHJlYW0oY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1N0eWxlIG5TdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NvbG9yJiBjclRleHQpIHsKKyAgQ0ZYX0Zsb2F0UmVjdCByY0NlbnRlciA9IHJjQkJveC5HZXRDZW50ZXJTcXVhcmUoKTsKKyAgc3dpdGNoIChuU3R5bGUpIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgQ2hlY2tTdHlsZTo6a0NoZWNrOgorICAgICAgcmV0dXJuIEdldEFwcFN0cmVhbV9DaGVjayhyY0NlbnRlciwgY3JUZXh0KTsKKyAgICBjYXNlIENoZWNrU3R5bGU6OmtDaXJjbGU6CisgICAgICByY0NlbnRlci5TY2FsZUZyb21DZW50ZXJQb2ludCgyLjBmIC8gMy4wZik7CisgICAgICByZXR1cm4gR2V0QXBwU3RyZWFtX0NpcmNsZShyY0NlbnRlciwgY3JUZXh0KTsKKyAgICBjYXNlIENoZWNrU3R5bGU6OmtDcm9zczoKKyAgICAgIHJldHVybiBHZXRBcHBTdHJlYW1fQ3Jvc3MocmNDZW50ZXIsIGNyVGV4dCk7CisgICAgY2FzZSBDaGVja1N0eWxlOjprRGlhbW9uZDoKKyAgICAgIHJjQ2VudGVyLlNjYWxlRnJvbUNlbnRlclBvaW50KDIuMGYgLyAzLjBmKTsKKyAgICAgIHJldHVybiBHZXRBcHBTdHJlYW1fRGlhbW9uZChyY0NlbnRlciwgY3JUZXh0KTsKKyAgICBjYXNlIENoZWNrU3R5bGU6OmtTcXVhcmU6CisgICAgICByY0NlbnRlci5TY2FsZUZyb21DZW50ZXJQb2ludCgyLjBmIC8gMy4wZik7CisgICAgICByZXR1cm4gR2V0QXBwU3RyZWFtX1NxdWFyZShyY0NlbnRlciwgY3JUZXh0KTsKKyAgICBjYXNlIENoZWNrU3R5bGU6OmtTdGFyOgorICAgICAgcmNDZW50ZXIuU2NhbGVGcm9tQ2VudGVyUG9pbnQoMi4wZiAvIDMuMGYpOworICAgICAgcmV0dXJuIEdldEFwcFN0cmVhbV9TdGFyKHJjQ2VudGVyLCBjclRleHQpOworICB9Cit9CisKK0J5dGVTdHJpbmcgR2V0UmFkaW9CdXR0b25BcHBTdHJlYW0oY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNCQm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja1N0eWxlIG5TdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NvbG9yJiBjclRleHQpIHsKKyAgQ0ZYX0Zsb2F0UmVjdCByY0NlbnRlciA9IHJjQkJveC5HZXRDZW50ZXJTcXVhcmUoKTsKKyAgc3dpdGNoIChuU3R5bGUpIHsKKyAgICBkZWZhdWx0OgorICAgIGNhc2UgQ2hlY2tTdHlsZTo6a0NoZWNrOgorICAgICAgcmV0dXJuIEdldEFwcFN0cmVhbV9DaGVjayhyY0NlbnRlciwgY3JUZXh0KTsKKyAgICBjYXNlIENoZWNrU3R5bGU6OmtDaXJjbGU6CisgICAgICByY0NlbnRlci5TY2FsZUZyb21DZW50ZXJQb2ludCgxLjBmIC8gMi4wZik7CisgICAgICByZXR1cm4gR2V0QXBwU3RyZWFtX0NpcmNsZShyY0NlbnRlciwgY3JUZXh0KTsKKyAgICBjYXNlIENoZWNrU3R5bGU6OmtDcm9zczoKKyAgICAgIHJldHVybiBHZXRBcHBTdHJlYW1fQ3Jvc3MocmNDZW50ZXIsIGNyVGV4dCk7CisgICAgY2FzZSBDaGVja1N0eWxlOjprRGlhbW9uZDoKKyAgICAgIHJjQ2VudGVyLlNjYWxlRnJvbUNlbnRlclBvaW50KDIuMGYgLyAzLjBmKTsKKyAgICAgIHJldHVybiBHZXRBcHBTdHJlYW1fRGlhbW9uZChyY0NlbnRlciwgY3JUZXh0KTsKKyAgICBjYXNlIENoZWNrU3R5bGU6OmtTcXVhcmU6CisgICAgICByY0NlbnRlci5TY2FsZUZyb21DZW50ZXJQb2ludCgyLjBmIC8gMy4wZik7CisgICAgICByZXR1cm4gR2V0QXBwU3RyZWFtX1NxdWFyZShyY0NlbnRlciwgY3JUZXh0KTsKKyAgICBjYXNlIENoZWNrU3R5bGU6OmtTdGFyOgorICAgICAgcmNDZW50ZXIuU2NhbGVGcm9tQ2VudGVyUG9pbnQoMi4wZiAvIDMuMGYpOworICAgICAgcmV0dXJuIEdldEFwcFN0cmVhbV9TdGFyKHJjQ2VudGVyLCBjclRleHQpOworICB9Cit9CisKK0J5dGVTdHJpbmcgR2V0Rm9udFNldFN0cmluZyhJUFZUX0ZvbnRNYXAqIHBGb250TWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZvbnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmRm9udFNpemUpIHsKKyAgaWYgKCFwRm9udE1hcCkKKyAgICByZXR1cm4gQnl0ZVN0cmluZygpOworCisgIEJ5dGVTdHJpbmcgc0ZvbnRBbGlhcyA9IHBGb250TWFwLT5HZXRQREZGb250QWxpYXMobkZvbnRJbmRleCk7CisgIGlmIChzRm9udEFsaWFzLkdldExlbmd0aCgpIDw9IDAgfHwgZkZvbnRTaXplIDw9IDApCisgICAgcmV0dXJuIEJ5dGVTdHJpbmcoKTsKKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc1JldDsKKyAgc1JldCA8PCAiLyIgPDwgc0ZvbnRBbGlhcyA8PCAiICIgPDwgZkZvbnRTaXplIDw8ICIgIgorICAgICAgIDw8IGtTZXRUZXh0Rm9udEFuZFNpemVPcGVyYXRvciA8PCAiXG4iOworICByZXR1cm4gQnl0ZVN0cmluZyhzUmV0KTsKK30KKworQnl0ZVN0cmluZyBHZXRXb3JkUmVuZGVyU3RyaW5nKGNvbnN0IEJ5dGVTdHJpbmcmIHN0cldvcmRzKSB7CisgIGlmIChzdHJXb3Jkcy5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICByZXR1cm4gUERGX0VuY29kZVN0cmluZyhzdHJXb3JkcywgZmFsc2UpICsgIiAiICsga1Nob3dUZXh0T3BlcmF0b3IgKyAiXG4iOworICB9CisgIHJldHVybiBCeXRlU3RyaW5nKCk7Cit9CisKK0J5dGVTdHJpbmcgR2V0RWRpdEFwcFN0cmVhbShDUFdMX0VkaXRJbXBsKiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJDb250aW51b3VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFN1YldvcmQpIHsKKyAgQ1BXTF9FZGl0SW1wbF9JdGVyYXRvciogcEl0ZXJhdG9yID0gcEVkaXQtPkdldEl0ZXJhdG9yKCk7CisgIHBJdGVyYXRvci0+U2V0QXQoMCk7CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNFZGl0U3RyZWFtOworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc1dvcmRzOworICBpbnQzMl90IG5DdXJGb250SW5kZXggPSAtMTsKKyAgQ0ZYX1BvaW50RiBwdE9sZDsKKyAgQ0ZYX1BvaW50RiBwdE5ldzsKKyAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2U7CisKKyAgd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkgeworICAgIENQVlRfV29yZFBsYWNlIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRBdCgpOworICAgIGlmIChiQ29udGludW91cykgeworICAgICAgaWYgKHBsYWNlLkxpbmVDbXAob2xkcGxhY2UpICE9IDApIHsKKyAgICAgICAgaWYgKHNXb3Jkcy50ZWxscCgpID4gMCkgeworICAgICAgICAgIHNFZGl0U3RyZWFtIDw8IEdldFdvcmRSZW5kZXJTdHJpbmcoQnl0ZVN0cmluZyhzV29yZHMpKTsKKyAgICAgICAgICBzV29yZHMuc3RyKCIiKTsKKyAgICAgICAgfQorCisgICAgICAgIENQVlRfV29yZCB3b3JkOworICAgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7CisgICAgICAgICAgcHROZXcgPSBDRlhfUG9pbnRGKHdvcmQucHRXb3JkLnggKyBwdE9mZnNldC54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkLnB0V29yZC55ICsgcHRPZmZzZXQueSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQ1BWVF9MaW5lIGxpbmU7CisgICAgICAgICAgcEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpOworICAgICAgICAgIHB0TmV3ID0gQ0ZYX1BvaW50RihsaW5lLnB0TGluZS54ICsgcHRPZmZzZXQueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5wdExpbmUueSArIHB0T2Zmc2V0LnkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHB0TmV3LnggIT0gcHRPbGQueCB8fCBwdE5ldy55ICE9IHB0T2xkLnkpIHsKKyAgICAgICAgICBzRWRpdFN0cmVhbSA8PCBwdE5ldy54IC0gcHRPbGQueCA8PCAiICIgPDwgcHROZXcueSAtIHB0T2xkLnkgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICAgPDwga01vdmVUZXh0UG9zaXRpb25PcGVyYXRvciA8PCAiXG4iOworCisgICAgICAgICAgcHRPbGQgPSBwdE5ldzsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBDUFZUX1dvcmQgd29yZDsKKyAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKKyAgICAgICAgaWYgKHdvcmQubkZvbnRJbmRleCAhPSBuQ3VyRm9udEluZGV4KSB7CisgICAgICAgICAgaWYgKHNXb3Jkcy50ZWxscCgpID4gMCkgeworICAgICAgICAgICAgc0VkaXRTdHJlYW0gPDwgR2V0V29yZFJlbmRlclN0cmluZyhCeXRlU3RyaW5nKHNXb3JkcykpOworICAgICAgICAgICAgc1dvcmRzLnN0cigiIik7CisgICAgICAgICAgfQorICAgICAgICAgIHNFZGl0U3RyZWFtIDw8IEdldEZvbnRTZXRTdHJpbmcocEVkaXQtPkdldEZvbnRNYXAoKSwgd29yZC5uRm9udEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZC5mRm9udFNpemUpOworICAgICAgICAgIG5DdXJGb250SW5kZXggPSB3b3JkLm5Gb250SW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBzV29yZHMgPDwgcEVkaXQtPkdldFBERldvcmRTdHJpbmcobkN1ckZvbnRJbmRleCwgd29yZC5Xb3JkLCBTdWJXb3JkKTsKKyAgICAgIH0KKworICAgICAgb2xkcGxhY2UgPSBwbGFjZTsKKyAgICB9IGVsc2UgeworICAgICAgQ1BWVF9Xb3JkIHdvcmQ7CisgICAgICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7CisgICAgICAgIHB0TmV3ID0KKyAgICAgICAgICAgIENGWF9Qb2ludEYod29yZC5wdFdvcmQueCArIHB0T2Zmc2V0LngsIHdvcmQucHRXb3JkLnkgKyBwdE9mZnNldC55KTsKKworICAgICAgICBpZiAocHROZXcueCAhPSBwdE9sZC54IHx8IHB0TmV3LnkgIT0gcHRPbGQueSkgeworICAgICAgICAgIHNFZGl0U3RyZWFtIDw8IHB0TmV3LnggLSBwdE9sZC54IDw8ICIgIiA8PCBwdE5ldy55IC0gcHRPbGQueSA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBrTW92ZVRleHRQb3NpdGlvbk9wZXJhdG9yIDw8ICJcbiI7CisgICAgICAgICAgcHRPbGQgPSBwdE5ldzsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3b3JkLm5Gb250SW5kZXggIT0gbkN1ckZvbnRJbmRleCkgeworICAgICAgICAgIHNFZGl0U3RyZWFtIDw8IEdldEZvbnRTZXRTdHJpbmcocEVkaXQtPkdldEZvbnRNYXAoKSwgd29yZC5uRm9udEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZC5mRm9udFNpemUpOworICAgICAgICAgIG5DdXJGb250SW5kZXggPSB3b3JkLm5Gb250SW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBzRWRpdFN0cmVhbSA8PCBHZXRXb3JkUmVuZGVyU3RyaW5nKAorICAgICAgICAgICAgcEVkaXQtPkdldFBERldvcmRTdHJpbmcobkN1ckZvbnRJbmRleCwgd29yZC5Xb3JkLCBTdWJXb3JkKSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKHNXb3Jkcy50ZWxscCgpID4gMCkgeworICAgIHNFZGl0U3RyZWFtIDw8IEdldFdvcmRSZW5kZXJTdHJpbmcoQnl0ZVN0cmluZyhzV29yZHMpKTsKKyAgICBzV29yZHMuc3RyKCIiKTsKKyAgfQorCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzQXBwU3RyZWFtOworICBpZiAoc0VkaXRTdHJlYW0udGVsbHAoKSA+IDApIHsKKyAgICBpbnQzMl90IG5Ib3J6U2NhbGUgPSBwRWRpdC0+R2V0SG9yelNjYWxlKCk7CisgICAgaWYgKG5Ib3J6U2NhbGUgIT0gMTAwKSB7CisgICAgICBzQXBwU3RyZWFtIDw8IG5Ib3J6U2NhbGUgPDwgIiAiIDw8IGtTZXRUZXh0U2NhbGVIb3Jpem9udGFsT3BlcmF0b3IKKyAgICAgICAgICAgICAgICAgPDwgIlxuIjsKKyAgICB9CisKKyAgICBmbG9hdCBmQ2hhclNwYWNlID0gcEVkaXQtPkdldENoYXJTcGFjZSgpOworICAgIGlmICghSXNGbG9hdFplcm8oZkNoYXJTcGFjZSkpIHsKKyAgICAgIHNBcHBTdHJlYW0gPDwgZkNoYXJTcGFjZSA8PCAiICIgPDwga1NldENoYXJhY3RlclNwYWNpbmdPcGVyYXRvciA8PCAiXG4iOworICAgIH0KKworICAgIHNBcHBTdHJlYW0gPDwgc0VkaXRTdHJlYW0uc3RyKCk7CisgIH0KKworICByZXR1cm4gQnl0ZVN0cmluZyhzQXBwU3RyZWFtKTsKK30KKworQnl0ZVN0cmluZyBHZW5lcmF0ZUljb25BcHBTdHJlYW0oQ1BERl9JY29uRml0JiBmaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX1N0cmVhbSogcEljb25TdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRmxvYXRSZWN0JiByY0ljb24pIHsKKyAgaWYgKHJjSWNvbi5Jc0VtcHR5KCkgfHwgIXBJY29uU3RyZWFtKQorICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisKKyAgQ1BXTF9JY29uIGljb247CisgIENQV0xfV25kOjpDcmVhdGVQYXJhbXMgY3A7CisgIGNwLmR3RmxhZ3MgPSBQV1NfVklTSUJMRTsKKyAgaWNvbi5DcmVhdGUoY3ApOworICBpY29uLlNldEljb25GaXQoJmZpdCk7CisgIGljb24uU2V0UERGU3RyZWFtKHBJY29uU3RyZWFtKTsKKyAgaWYgKCFpY29uLk1vdmUocmNJY29uLCBmYWxzZSwgZmFsc2UpKQorICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisKKyAgQnl0ZVN0cmluZyBzQWxpYXMgPSBpY29uLkdldEltYWdlQWxpYXMoKTsKKyAgaWYgKHNBbGlhcy5HZXRMZW5ndGgoKSA8PSAwKQorICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisKKyAgQ0ZYX0Zsb2F0UmVjdCByY1BsYXRlID0gaWNvbi5HZXRDbGllbnRSZWN0KCk7CisgIENGWF9NYXRyaXggbXQgPSBpY29uLkdldEltYWdlTWF0cml4KCkuR2V0SW52ZXJzZSgpOworCisgIGZsb2F0IGZIU2NhbGU7CisgIGZsb2F0IGZWU2NhbGU7CisgIHN0ZDo6dGllKGZIU2NhbGUsIGZWU2NhbGUpID0gaWNvbi5HZXRTY2FsZSgpOworCisgIGZsb2F0IGZ4OworICBmbG9hdCBmeTsKKyAgc3RkOjp0aWUoZngsIGZ5KSA9IGljb24uR2V0SW1hZ2VPZmZzZXQoKTsKKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RyOworICB7CisgICAgQXV0b0Nsb3NlZFFDb21tYW5kIHEoJnN0cik7CisgICAgc3RyIDw8IHJjUGxhdGUubGVmdCA8PCAiICIgPDwgcmNQbGF0ZS5ib3R0b20gPDwgIiAiCisgICAgICAgIDw8IHJjUGxhdGUucmlnaHQgLSByY1BsYXRlLmxlZnQgPDwgIiAiIDw8IHJjUGxhdGUudG9wIC0gcmNQbGF0ZS5ib3R0b20KKyAgICAgICAgPDwgIiAiIDw8IGtBcHBlbmRSZWN0T3BlcmF0b3IgPDwgIiAiIDw8IGtTZXROb25aZXJvV2luZGluZ0NsaXBPcGVyYXRvcgorICAgICAgICA8PCAiICIgPDwga0VuZFBhdGhOb0ZpbGxPclN0cm9rZU9wZXJhdG9yIDw8ICJcbiI7CisKKyAgICBzdHIgPDwgZkhTY2FsZSA8PCAiIDAgMCAiIDw8IGZWU2NhbGUgPDwgIiAiIDw8IHJjUGxhdGUubGVmdCArIGZ4IDw8ICIgIgorICAgICAgICA8PCByY1BsYXRlLmJvdHRvbSArIGZ5IDw8ICIgIiA8PCBrQ29uY2F0TWF0cml4T3BlcmF0b3IgPDwgIlxuIjsKKyAgICBzdHIgPDwgbXQuYSA8PCAiICIgPDwgbXQuYiA8PCAiICIgPDwgbXQuYyA8PCAiICIgPDwgbXQuZCA8PCAiICIgPDwgbXQuZQorICAgICAgICA8PCAiICIgPDwgbXQuZiA8PCAiICIgPDwga0NvbmNhdE1hdHJpeE9wZXJhdG9yIDw8ICJcbiI7CisKKyAgICBzdHIgPDwgIjAgIiA8PCBrU2V0R3JheU9wZXJhdG9yIDw8ICIgMCAiIDw8IGtTZXRHcmF5U3Ryb2tlZE9wZXJhdG9yIDw8ICIgMSAiCisgICAgICAgIDw8IGtTZXRMaW5lV2lkdGhPcGVyYXRvciA8PCAiIC8iIDw8IHNBbGlhcyA8PCAiICIKKyAgICAgICAgPDwga0ludm9rZU5hbWVkWE9iamVjdE9wZXJhdG9yIDw8ICJcbiI7CisgIH0KKyAgaWNvbi5EZXN0cm95KCk7CisKKyAgcmV0dXJuIEJ5dGVTdHJpbmcoc3RyKTsKK30KKworQnl0ZVN0cmluZyBHZXRQdXNoQnV0dG9uQXBwU3RyZWFtKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjQkJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUFZUX0ZvbnRNYXAqIHBGb250TWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfU3RyZWFtKiBwSWNvblN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ljb25GaXQmIEljb25GaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgc0xhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Db2xvciYgY3JUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZGb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdXR0b25TdHlsZSBuTGF5T3V0KSB7CisgIGNvbnN0IGZsb2F0IGZBdXRvRm9udFNjYWxlID0gMS4wZiAvIDMuMGY7CisKKyAgYXV0byBwRWRpdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUFdMX0VkaXRJbXBsPigpOworICBwRWRpdC0+U2V0Rm9udE1hcChwRm9udE1hcCk7CisgIHBFZGl0LT5TZXRBbGlnbm1lbnRIKDEsIHRydWUpOworICBwRWRpdC0+U2V0QWxpZ25tZW50VigxLCB0cnVlKTsKKyAgcEVkaXQtPlNldE11bHRpTGluZShmYWxzZSwgdHJ1ZSk7CisgIHBFZGl0LT5TZXRBdXRvUmV0dXJuKGZhbHNlLCB0cnVlKTsKKyAgaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpCisgICAgcEVkaXQtPlNldEF1dG9Gb250U2l6ZSh0cnVlLCB0cnVlKTsKKyAgZWxzZQorICAgIHBFZGl0LT5TZXRGb250U2l6ZShmRm9udFNpemUpOworCisgIHBFZGl0LT5Jbml0aWFsaXplKCk7CisgIHBFZGl0LT5TZXRUZXh0KHNMYWJlbCk7CisKKyAgQ0ZYX0Zsb2F0UmVjdCByY0xhYmVsQ29udGVudCA9IHBFZGl0LT5HZXRDb250ZW50UmVjdCgpOworICBDRlhfRmxvYXRSZWN0IHJjTGFiZWw7CisgIENGWF9GbG9hdFJlY3QgcmNJY29uOworICBmbG9hdCBmV2lkdGggPSAwLjBmOworICBmbG9hdCBmSGVpZ2h0ID0gMC4wZjsKKworICBzd2l0Y2ggKG5MYXlPdXQpIHsKKyAgICBjYXNlIEJ1dHRvblN0eWxlOjprTGFiZWw6CisgICAgICByY0xhYmVsID0gcmNCQm94OworICAgICAgYnJlYWs7CisgICAgY2FzZSBCdXR0b25TdHlsZTo6a0ljb246CisgICAgICByY0ljb24gPSByY0JCb3g7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJ1dHRvblN0eWxlOjprSWNvblRvcExhYmVsQm90dG9tOgorICAgICAgaWYgKHBJY29uU3RyZWFtKSB7CisgICAgICAgIGlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKSB7CisgICAgICAgICAgZkhlaWdodCA9IHJjQkJveC50b3AgLSByY0JCb3guYm90dG9tOworICAgICAgICAgIHJjTGFiZWwgPSBDRlhfRmxvYXRSZWN0KHJjQkJveC5sZWZ0LCByY0JCb3guYm90dG9tLCByY0JCb3gucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LmJvdHRvbSArIGZIZWlnaHQgKiBmQXV0b0ZvbnRTY2FsZSk7CisgICAgICAgICAgcmNJY29uID0KKyAgICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdChyY0JCb3gubGVmdCwgcmNMYWJlbC50b3AsIHJjQkJveC5yaWdodCwgcmNCQm94LnRvcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZkhlaWdodCA9IHJjTGFiZWxDb250ZW50LkhlaWdodCgpOworCisgICAgICAgICAgaWYgKHJjQkJveC5ib3R0b20gKyBmSGVpZ2h0ID4gcmNCQm94LnRvcCkgeworICAgICAgICAgICAgcmNMYWJlbCA9IHJjQkJveDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmNMYWJlbCA9IENGWF9GbG9hdFJlY3QocmNCQm94LmxlZnQsIHJjQkJveC5ib3R0b20sIHJjQkJveC5yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC5ib3R0b20gKyBmSGVpZ2h0KTsKKyAgICAgICAgICAgIHJjSWNvbiA9IENGWF9GbG9hdFJlY3QocmNCQm94LmxlZnQsIHJjTGFiZWwudG9wLCByY0JCb3gucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC50b3ApOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmNMYWJlbCA9IHJjQkJveDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQnV0dG9uU3R5bGU6OmtJY29uQm90dG9tTGFiZWxUb3A6CisgICAgICBpZiAocEljb25TdHJlYW0pIHsKKyAgICAgICAgaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpIHsKKyAgICAgICAgICBmSGVpZ2h0ID0gcmNCQm94LnRvcCAtIHJjQkJveC5ib3R0b207CisgICAgICAgICAgcmNMYWJlbCA9CisgICAgICAgICAgICAgIENGWF9GbG9hdFJlY3QocmNCQm94LmxlZnQsIHJjQkJveC50b3AgLSBmSGVpZ2h0ICogZkF1dG9Gb250U2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LnJpZ2h0LCByY0JCb3gudG9wKTsKKyAgICAgICAgICByY0ljb24gPSBDRlhfRmxvYXRSZWN0KHJjQkJveC5sZWZ0LCByY0JCb3guYm90dG9tLCByY0JCb3gucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0xhYmVsLmJvdHRvbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZkhlaWdodCA9IHJjTGFiZWxDb250ZW50LkhlaWdodCgpOworCisgICAgICAgICAgaWYgKHJjQkJveC5ib3R0b20gKyBmSGVpZ2h0ID4gcmNCQm94LnRvcCkgeworICAgICAgICAgICAgcmNMYWJlbCA9IHJjQkJveDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmNMYWJlbCA9IENGWF9GbG9hdFJlY3QocmNCQm94LmxlZnQsIHJjQkJveC50b3AgLSBmSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LnJpZ2h0LCByY0JCb3gudG9wKTsKKyAgICAgICAgICAgIHJjSWNvbiA9IENGWF9GbG9hdFJlY3QocmNCQm94LmxlZnQsIHJjQkJveC5ib3R0b20sIHJjQkJveC5yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNMYWJlbC5ib3R0b20pOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmNMYWJlbCA9IHJjQkJveDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgQnV0dG9uU3R5bGU6OmtJY29uTGVmdExhYmVsUmlnaHQ6CisgICAgICBpZiAocEljb25TdHJlYW0pIHsKKyAgICAgICAgaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpIHsKKyAgICAgICAgICBmV2lkdGggPSByY0JCb3gucmlnaHQgLSByY0JCb3gubGVmdDsKKyAgICAgICAgICBpZiAocmNMYWJlbENvbnRlbnQuV2lkdGgoKSA8IGZXaWR0aCAqIGZBdXRvRm9udFNjYWxlKSB7CisgICAgICAgICAgICByY0xhYmVsID0gQ0ZYX0Zsb2F0UmVjdChyY0JCb3gucmlnaHQgLSBmV2lkdGggKiBmQXV0b0ZvbnRTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC5ib3R0b20sIHJjQkJveC5yaWdodCwgcmNCQm94LnRvcCk7CisgICAgICAgICAgICByY0ljb24gPSBDRlhfRmxvYXRSZWN0KHJjQkJveC5sZWZ0LCByY0JCb3guYm90dG9tLCByY0xhYmVsLmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC50b3ApOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocmNMYWJlbENvbnRlbnQuV2lkdGgoKSA8IGZXaWR0aCkgeworICAgICAgICAgICAgICByY0xhYmVsID0gQ0ZYX0Zsb2F0UmVjdChyY0JCb3gucmlnaHQgLSByY0xhYmVsQ29udGVudC5XaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0JCb3guYm90dG9tLCByY0JCb3gucmlnaHQsIHJjQkJveC50b3ApOworICAgICAgICAgICAgICByY0ljb24gPSBDRlhfRmxvYXRSZWN0KHJjQkJveC5sZWZ0LCByY0JCb3guYm90dG9tLCByY0xhYmVsLmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LnRvcCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByY0xhYmVsID0gcmNCQm94OworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmV2lkdGggPSByY0xhYmVsQ29udGVudC5XaWR0aCgpOworICAgICAgICAgIGlmIChyY0JCb3gubGVmdCArIGZXaWR0aCA+IHJjQkJveC5yaWdodCkgeworICAgICAgICAgICAgcmNMYWJlbCA9IHJjQkJveDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmNMYWJlbCA9IENGWF9GbG9hdFJlY3QocmNCQm94LnJpZ2h0IC0gZldpZHRoLCByY0JCb3guYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LnJpZ2h0LCByY0JCb3gudG9wKTsKKyAgICAgICAgICAgIHJjSWNvbiA9IENGWF9GbG9hdFJlY3QocmNCQm94LmxlZnQsIHJjQkJveC5ib3R0b20sIHJjTGFiZWwubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LnRvcCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByY0xhYmVsID0gcmNCQm94OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBCdXR0b25TdHlsZTo6a0ljb25SaWdodExhYmVsTGVmdDoKKyAgICAgIGlmIChwSWNvblN0cmVhbSkgeworICAgICAgICBpZiAoSXNGbG9hdFplcm8oZkZvbnRTaXplKSkgeworICAgICAgICAgIGZXaWR0aCA9IHJjQkJveC5yaWdodCAtIHJjQkJveC5sZWZ0OworICAgICAgICAgIGlmIChyY0xhYmVsQ29udGVudC5XaWR0aCgpIDwgZldpZHRoICogZkF1dG9Gb250U2NhbGUpIHsKKyAgICAgICAgICAgIHJjTGFiZWwgPSBDRlhfRmxvYXRSZWN0KHJjQkJveC5sZWZ0LCByY0JCb3guYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LmxlZnQgKyBmV2lkdGggKiBmQXV0b0ZvbnRTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC50b3ApOworICAgICAgICAgICAgcmNJY29uID0gQ0ZYX0Zsb2F0UmVjdChyY0xhYmVsLnJpZ2h0LCByY0JCb3guYm90dG9tLCByY0JCb3gucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQkJveC50b3ApOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocmNMYWJlbENvbnRlbnQuV2lkdGgoKSA8IGZXaWR0aCkgeworICAgICAgICAgICAgICByY0xhYmVsID0gQ0ZYX0Zsb2F0UmVjdChyY0JCb3gubGVmdCwgcmNCQm94LmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LmxlZnQgKyByY0xhYmVsQ29udGVudC5XaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0JCb3gudG9wKTsKKyAgICAgICAgICAgICAgcmNJY29uID0gQ0ZYX0Zsb2F0UmVjdChyY0xhYmVsLnJpZ2h0LCByY0JCb3guYm90dG9tLCByY0JCb3gucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LnRvcCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICByY0xhYmVsID0gcmNCQm94OworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmV2lkdGggPSByY0xhYmVsQ29udGVudC5XaWR0aCgpOworICAgICAgICAgIGlmIChyY0JCb3gubGVmdCArIGZXaWR0aCA+IHJjQkJveC5yaWdodCkgeworICAgICAgICAgICAgcmNMYWJlbCA9IHJjQkJveDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmNMYWJlbCA9IENGWF9GbG9hdFJlY3QocmNCQm94LmxlZnQsIHJjQkJveC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0JCb3gubGVmdCArIGZXaWR0aCwgcmNCQm94LnRvcCk7CisgICAgICAgICAgICByY0ljb24gPSBDRlhfRmxvYXRSZWN0KHJjTGFiZWwucmlnaHQsIHJjQkJveC5ib3R0b20sIHJjQkJveC5yaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNCQm94LnRvcCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByY0xhYmVsID0gcmNCQm94OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBCdXR0b25TdHlsZTo6a0xhYmVsT3Zlckljb246CisgICAgICByY0xhYmVsID0gcmNCQm94OworICAgICAgcmNJY29uID0gcmNCQm94OworICAgICAgYnJlYWs7CisgIH0KKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc1RlbXA7CisgIHNUZW1wIDw8IEdlbmVyYXRlSWNvbkFwcFN0cmVhbShJY29uRml0LCBwSWNvblN0cmVhbSwgcmNJY29uKTsKKworICBpZiAoIXJjTGFiZWwuSXNFbXB0eSgpKSB7CisgICAgcEVkaXQtPlNldFBsYXRlUmVjdChyY0xhYmVsKTsKKyAgICBCeXRlU3RyaW5nIHNFZGl0ID0KKyAgICAgICAgR2V0RWRpdEFwcFN0cmVhbShwRWRpdC5nZXQoKSwgQ0ZYX1BvaW50RigwLjBmLCAwLjBmKSwgdHJ1ZSwgMCk7CisgICAgaWYgKHNFZGl0LkdldExlbmd0aCgpID4gMCkgeworICAgICAgQXV0b0Nsb3NlZENvbW1hbmQgYnQoJnNUZW1wLCBrVGV4dEJlZ2luT3BlcmF0b3IsIGtUZXh0RW5kT3BlcmF0b3IpOworICAgICAgc1RlbXAgPDwgR2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LCB0cnVlKSA8PCBzRWRpdDsKKyAgICB9CisgIH0KKworICBpZiAoc1RlbXAudGVsbHAoKSA8PSAwKQorICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNBcHBTdHJlYW07CisgIHsKKyAgICBBdXRvQ2xvc2VkUUNvbW1hbmQgcSgmc0FwcFN0cmVhbSk7CisgICAgc0FwcFN0cmVhbSA8PCByY0JCb3gubGVmdCA8PCAiICIgPDwgcmNCQm94LmJvdHRvbSA8PCAiICIKKyAgICAgICAgICAgICAgIDw8IHJjQkJveC5yaWdodCAtIHJjQkJveC5sZWZ0IDw8ICIgIgorICAgICAgICAgICAgICAgPDwgcmNCQm94LnRvcCAtIHJjQkJveC5ib3R0b20gPDwgIiAiIDw8IGtBcHBlbmRSZWN0T3BlcmF0b3IKKyAgICAgICAgICAgICAgIDw8ICIgIiA8PCBrU2V0Tm9uWmVyb1dpbmRpbmdDbGlwT3BlcmF0b3IgPDwgIiAiCisgICAgICAgICAgICAgICA8PCBrRW5kUGF0aE5vRmlsbE9yU3Ryb2tlT3BlcmF0b3IgPDwgIlxuIjsKKyAgICBzQXBwU3RyZWFtIDw8IHNUZW1wLnN0cigpLmNfc3RyKCk7CisgIH0KKyAgcmV0dXJuIEJ5dGVTdHJpbmcoc0FwcFN0cmVhbSk7Cit9CisKK0J5dGVTdHJpbmcgR2V0Qm9yZGVyQXBwU3RyZWFtSW50ZXJuYWwoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ29sb3ImIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ29sb3ImIGNyTGVmdFRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0NvbG9yJiBjclJpZ2h0Qm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3JkZXJTdHlsZSBuU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQV0xfRGFzaCYgZGFzaCkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc0FwcFN0cmVhbTsKKyAgQnl0ZVN0cmluZyBzQ29sb3I7CisKKyAgZmxvYXQgZkxlZnQgPSByZWN0LmxlZnQ7CisgIGZsb2F0IGZSaWdodCA9IHJlY3QucmlnaHQ7CisgIGZsb2F0IGZUb3AgPSByZWN0LnRvcDsKKyAgZmxvYXQgZkJvdHRvbSA9IHJlY3QuYm90dG9tOworCisgIGlmIChmV2lkdGggPiAwLjBmKSB7CisgICAgZmxvYXQgZkhhbGZXaWR0aCA9IGZXaWR0aCAvIDIuMGY7CisgICAgQXV0b0Nsb3NlZFFDb21tYW5kIHEoJnNBcHBTdHJlYW0pOworCisgICAgc3dpdGNoIChuU3R5bGUpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICBjYXNlIEJvcmRlclN0eWxlOjpTT0xJRDoKKyAgICAgICAgc0NvbG9yID0gR2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsIHRydWUpOworICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgc0NvbG9yOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgPDwgIiAiIDw8IGZCb3R0b20gPDwgIiAiIDw8IGZSaWdodCAtIGZMZWZ0IDw8ICIgIgorICAgICAgICAgICAgICAgICAgICAgPDwgZlRvcCAtIGZCb3R0b20gPDwgIiAiIDw8IGtBcHBlbmRSZWN0T3BlcmF0b3IgPDwgIlxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZldpZHRoIDw8ICIgIiA8PCBmQm90dG9tICsgZldpZHRoIDw8ICIgIgorICAgICAgICAgICAgICAgICAgICAgPDwgZlJpZ2h0IC0gZkxlZnQgLSBmV2lkdGggKiAyIDw8ICIgIgorICAgICAgICAgICAgICAgICAgICAgPDwgZlRvcCAtIGZCb3R0b20gLSBmV2lkdGggKiAyIDw8ICIgIgorICAgICAgICAgICAgICAgICAgICAgPDwga0FwcGVuZFJlY3RPcGVyYXRvciA8PCAiXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwga0ZpbGxFdmVuT2RkT3BlcmF0b3IgPDwgIlxuIjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQm9yZGVyU3R5bGU6OkRBU0g6CisgICAgICAgIHNDb2xvciA9IEdldENvbG9yQXBwU3RyZWFtKGNvbG9yLCBmYWxzZSk7CisgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmV2lkdGggPDwgIiAiIDw8IGtTZXRMaW5lV2lkdGhPcGVyYXRvciA8PCAiIFsiCisgICAgICAgICAgICAgICAgICAgICA8PCBkYXNoLm5EYXNoIDw8ICIgIiA8PCBkYXNoLm5HYXAgPDwgIl0gIiA8PCBkYXNoLm5QaGFzZQorICAgICAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IGtTZXREYXNoT3BlcmF0b3IgPDwgIlxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZldpZHRoIC8gMiA8PCAiICIgPDwgZkJvdHRvbSArIGZXaWR0aCAvIDIgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBrTW92ZVRvT3BlcmF0b3IgPDwgIlxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0ICsgZldpZHRoIC8gMiA8PCAiICIgPDwgZlRvcCAtIGZXaWR0aCAvIDIgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBrTGluZVRvT3BlcmF0b3IgPDwgIlxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZXaWR0aCAvIDIgPDwgIiAiIDw8IGZUb3AgLSBmV2lkdGggLyAyIDw8ICIgIgorICAgICAgICAgICAgICAgICAgICAgPDwga0xpbmVUb09wZXJhdG9yIDw8ICJcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmV2lkdGggLyAyIDw8ICIgIiA8PCBmQm90dG9tICsgZldpZHRoIC8gMgorICAgICAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IGtMaW5lVG9PcGVyYXRvciA8PCAiXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmV2lkdGggLyAyIDw8ICIgIiA8PCBmQm90dG9tICsgZldpZHRoIC8gMiA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGtMaW5lVG9PcGVyYXRvciA8PCAiICIgPDwga1N0cm9rZU9wZXJhdG9yIDw8ICJcbiI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEJvcmRlclN0eWxlOjpCRVZFTEVEOgorICAgICAgY2FzZSBCb3JkZXJTdHlsZTo6SU5TRVQ6CisgICAgICAgIHNDb2xvciA9IEdldENvbG9yQXBwU3RyZWFtKGNyTGVmdFRvcCwgdHJ1ZSk7CisgICAgICAgIGlmIChzQ29sb3IuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBzQ29sb3I7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggPDwgIiAiIDw8IGZCb3R0b20gKyBmSGFsZldpZHRoIDw8ICIgIgorICAgICAgICAgICAgICAgICAgICAgPDwga01vdmVUb09wZXJhdG9yIDw8ICJcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoIDw8ICIgIgorICAgICAgICAgICAgICAgICAgICAgPDwga0xpbmVUb09wZXJhdG9yIDw8ICJcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmSGFsZldpZHRoIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aCA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGtMaW5lVG9PcGVyYXRvciA8PCAiXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoICogMgorICAgICAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IGtMaW5lVG9PcGVyYXRvciA8PCAiXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoICogMiA8PCAiICIgPDwgZlRvcCAtIGZIYWxmV2lkdGggKiAyCisgICAgICAgICAgICAgICAgICAgICA8PCAiICIgPDwga0xpbmVUb09wZXJhdG9yIDw8ICJcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggKiAyIDw8ICIgIgorICAgICAgICAgICAgICAgICAgICAgPDwgZkJvdHRvbSArIGZIYWxmV2lkdGggKiAyIDw8ICIgIiA8PCBrTGluZVRvT3BlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgIiA8PCBrRmlsbE9wZXJhdG9yIDw8ICJcbiI7CisgICAgICAgIH0KKworICAgICAgICBzQ29sb3IgPSBHZXRDb2xvckFwcFN0cmVhbShjclJpZ2h0Qm90dG9tLCB0cnVlKTsKKyAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNDb2xvcjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggPDwgIiAiIDw8IGZUb3AgLSBmSGFsZldpZHRoIDw8ICIgIgorICAgICAgICAgICAgICAgICAgICAgPDwga01vdmVUb09wZXJhdG9yIDw8ICJcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmUmlnaHQgLSBmSGFsZldpZHRoIDw8ICIgIiA8PCBmQm90dG9tICsgZkhhbGZXaWR0aAorICAgICAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IGtMaW5lVG9PcGVyYXRvciA8PCAiXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoIDw8ICIgIiA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGtMaW5lVG9PcGVyYXRvciA8PCAiXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZkxlZnQgKyBmSGFsZldpZHRoICogMiA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGZCb3R0b20gKyBmSGFsZldpZHRoICogMiA8PCAiICIgPDwga0xpbmVUb09wZXJhdG9yCisgICAgICAgICAgICAgICAgICAgICA8PCAiXG4iOworICAgICAgICAgIHNBcHBTdHJlYW0gPDwgZlJpZ2h0IC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBmQm90dG9tICsgZkhhbGZXaWR0aCAqIDIgPDwgIiAiIDw8IGtMaW5lVG9PcGVyYXRvcgorICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCAtIGZIYWxmV2lkdGggKiAyIDw8ICIgIiA8PCBmVG9wIC0gZkhhbGZXaWR0aCAqIDIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgIiA8PCBrTGluZVRvT3BlcmF0b3IgPDwgIiAiIDw8IGtGaWxsT3BlcmF0b3IgPDwgIlxuIjsKKyAgICAgICAgfQorCisgICAgICAgIHNDb2xvciA9IEdldENvbG9yQXBwU3RyZWFtKGNvbG9yLCB0cnVlKTsKKyAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNDb2xvcjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZMZWZ0IDw8ICIgIiA8PCBmQm90dG9tIDw8ICIgIiA8PCBmUmlnaHQgLSBmTGVmdCA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGZUb3AgLSBmQm90dG9tIDw8ICIgIiA8PCBrQXBwZW5kUmVjdE9wZXJhdG9yIDw8ICJcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCArIGZIYWxmV2lkdGggPDwgIiAiIDw8IGZCb3R0b20gKyBmSGFsZldpZHRoIDw8ICIgIgorICAgICAgICAgICAgICAgICAgICAgPDwgZlJpZ2h0IC0gZkxlZnQgLSBmSGFsZldpZHRoICogMiA8PCAiICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGZUb3AgLSBmQm90dG9tIC0gZkhhbGZXaWR0aCAqIDIgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBrQXBwZW5kUmVjdE9wZXJhdG9yIDw8ICIgIiA8PCBrRmlsbEV2ZW5PZGRPcGVyYXRvcgorICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQm9yZGVyU3R5bGU6OlVOREVSTElORToKKyAgICAgICAgc0NvbG9yID0gR2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsIGZhbHNlKTsKKyAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IHNDb2xvcjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZXaWR0aCA8PCAiICIgPDwga1NldExpbmVXaWR0aE9wZXJhdG9yIDw8ICJcbiI7CisgICAgICAgICAgc0FwcFN0cmVhbSA8PCBmTGVmdCA8PCAiICIgPDwgZkJvdHRvbSArIGZXaWR0aCAvIDIgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBrTW92ZVRvT3BlcmF0b3IgPDwgIlxuIjsKKyAgICAgICAgICBzQXBwU3RyZWFtIDw8IGZSaWdodCA8PCAiICIgPDwgZkJvdHRvbSArIGZXaWR0aCAvIDIgPDwgIiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBrTGluZVRvT3BlcmF0b3IgPDwgIiAiIDw8IGtTdHJva2VPcGVyYXRvciA8PCAiXG4iOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBCeXRlU3RyaW5nKHNBcHBTdHJlYW0pOworfQorCitCeXRlU3RyaW5nIEdldERyb3BCdXR0b25BcHBTdHJlYW0oY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNCQm94KSB7CisgIGlmIChyY0JCb3guSXNFbXB0eSgpKQorICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNBcHBTdHJlYW07CisgIHsKKyAgICBBdXRvQ2xvc2VkUUNvbW1hbmQgcSgmc0FwcFN0cmVhbSk7CisgICAgc0FwcFN0cmVhbSA8PCBHZXRDb2xvckFwcFN0cmVhbShDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprUkdCLCAyMjAuMGYgLyAyNTUuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwLjBmIC8gMjU1LjBmLCAyMjAuMGYgLyAyNTUuMGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkKKyAgICAgICAgICAgICAgIDw8IHJjQkJveC5sZWZ0IDw8ICIgIiA8PCByY0JCb3guYm90dG9tIDw8ICIgIgorICAgICAgICAgICAgICAgPDwgcmNCQm94LnJpZ2h0IC0gcmNCQm94LmxlZnQgPDwgIiAiCisgICAgICAgICAgICAgICA8PCByY0JCb3gudG9wIC0gcmNCQm94LmJvdHRvbSA8PCAiICIgPDwga0FwcGVuZFJlY3RPcGVyYXRvcgorICAgICAgICAgICAgICAgPDwgIiAiIDw8IGtGaWxsT3BlcmF0b3IgPDwgIlxuIjsKKyAgfQorCisgIHsKKyAgICBBdXRvQ2xvc2VkUUNvbW1hbmQgcSgmc0FwcFN0cmVhbSk7CisgICAgc0FwcFN0cmVhbSA8PCBHZXRCb3JkZXJBcHBTdHJlYW1JbnRlcm5hbCgKKyAgICAgICAgcmNCQm94LCAyLCBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprR3JheSwgMCksCisgICAgICAgIENGWF9Db2xvcihDRlhfQ29sb3I6OmtHcmF5LCAxKSwgQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIDAuNSksCisgICAgICAgIEJvcmRlclN0eWxlOjpCRVZFTEVELCBDUFdMX0Rhc2goMywgMCwgMCkpOworICB9CisKKyAgQ0ZYX1BvaW50RiBwdENlbnRlciA9IENGWF9Qb2ludEYoKHJjQkJveC5sZWZ0ICsgcmNCQm94LnJpZ2h0KSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyY0JCb3gudG9wICsgcmNCQm94LmJvdHRvbSkgLyAyKTsKKyAgaWYgKElzRmxvYXRCaWdnZXIocmNCQm94LnJpZ2h0IC0gcmNCQm94LmxlZnQsIDYpICYmCisgICAgICBJc0Zsb2F0QmlnZ2VyKHJjQkJveC50b3AgLSByY0JCb3guYm90dG9tLCA2KSkgeworICAgIEF1dG9DbG9zZWRRQ29tbWFuZCBxKCZzQXBwU3RyZWFtKTsKKyAgICBzQXBwU3RyZWFtIDw8ICIgMCAiIDw8IGtTZXRHcmF5T3BlcmF0b3IgPDwgIlxuIgorICAgICAgICAgICAgICAgPDwgcHRDZW50ZXIueCAtIDMgPDwgIiAiIDw8IHB0Q2VudGVyLnkgKyAxLjVmIDw8ICIgIgorICAgICAgICAgICAgICAgPDwga01vdmVUb09wZXJhdG9yIDw8ICJcbiIKKyAgICAgICAgICAgICAgIDw8IHB0Q2VudGVyLnggKyAzIDw8ICIgIiA8PCBwdENlbnRlci55ICsgMS41ZiA8PCAiICIKKyAgICAgICAgICAgICAgIDw8IGtMaW5lVG9PcGVyYXRvciA8PCAiXG4iCisgICAgICAgICAgICAgICA8PCBwdENlbnRlci54IDw8ICIgIiA8PCBwdENlbnRlci55IC0gMS41ZiA8PCAiICIKKyAgICAgICAgICAgICAgIDw8IGtMaW5lVG9PcGVyYXRvciA8PCAiXG4iCisgICAgICAgICAgICAgICA8PCBwdENlbnRlci54IC0gMyA8PCAiICIgPDwgcHRDZW50ZXIueSArIDEuNWYgPDwgIiAiCisgICAgICAgICAgICAgICA8PCBrTGluZVRvT3BlcmF0b3IgPDwgIiAiIDw8IGtGaWxsT3BlcmF0b3IgPDwgIlxuIjsKKyAgfQorCisgIHJldHVybiBCeXRlU3RyaW5nKHNBcHBTdHJlYW0pOworfQorCitCeXRlU3RyaW5nIEdldFJlY3RGaWxsQXBwU3RyZWFtKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Db2xvciYgY29sb3IpIHsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNBcHBTdHJlYW07CisgIEJ5dGVTdHJpbmcgc0NvbG9yID0gR2V0Q29sb3JBcHBTdHJlYW0oY29sb3IsIHRydWUpOworICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgIEF1dG9DbG9zZWRRQ29tbWFuZCBxKCZzQXBwU3RyZWFtKTsKKyAgICBzQXBwU3RyZWFtIDw8IHNDb2xvciA8PCByZWN0LmxlZnQgPDwgIiAiIDw8IHJlY3QuYm90dG9tIDw8ICIgIgorICAgICAgICAgICAgICAgPDwgcmVjdC5yaWdodCAtIHJlY3QubGVmdCA8PCAiICIgPDwgcmVjdC50b3AgLSByZWN0LmJvdHRvbSA8PCAiICIKKyAgICAgICAgICAgICAgIDw8IGtBcHBlbmRSZWN0T3BlcmF0b3IgPDwgIiAiIDw8IGtGaWxsT3BlcmF0b3IgPDwgIlxuIjsKKyAgfQorCisgIHJldHVybiBCeXRlU3RyaW5nKHNBcHBTdHJlYW0pOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQ1BXTF9BcHBTdHJlYW06OkNQV0xfQXBwU3RyZWFtKENQREZTREtfV2lkZ2V0KiB3aWRnZXQsIENQREZfRGljdGlvbmFyeSogZGljdCkKKyAgICA6IHdpZGdldF8od2lkZ2V0KSwgZGljdF8oZGljdCkge30KKworQ1BXTF9BcHBTdHJlYW06On5DUFdMX0FwcFN0cmVhbSgpIHt9CisKK3ZvaWQgQ1BXTF9BcHBTdHJlYW06OlNldEFzUHVzaEJ1dHRvbigpIHsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSB3aWRnZXRfLT5HZXRGb3JtQ29udHJvbCgpOworICBDRlhfRmxvYXRSZWN0IHJjV2luZG93ID0gd2lkZ2V0Xy0+R2V0Um90YXRlZFJlY3QoKTsKKyAgQnV0dG9uU3R5bGUgbkxheW91dCA9IEJ1dHRvblN0eWxlOjprTGFiZWw7CisgIHN3aXRjaCAocENvbnRyb2wtPkdldFRleHRQb3NpdGlvbigpKSB7CisgICAgY2FzZSBURVhUUE9TX0lDT046CisgICAgICBuTGF5b3V0ID0gQnV0dG9uU3R5bGU6OmtJY29uOworICAgICAgYnJlYWs7CisgICAgY2FzZSBURVhUUE9TX0JFTE9XOgorICAgICAgbkxheW91dCA9IEJ1dHRvblN0eWxlOjprSWNvblRvcExhYmVsQm90dG9tOworICAgICAgYnJlYWs7CisgICAgY2FzZSBURVhUUE9TX0FCT1ZFOgorICAgICAgbkxheW91dCA9IEJ1dHRvblN0eWxlOjprSWNvbkJvdHRvbUxhYmVsVG9wOworICAgICAgYnJlYWs7CisgICAgY2FzZSBURVhUUE9TX1JJR0hUOgorICAgICAgbkxheW91dCA9IEJ1dHRvblN0eWxlOjprSWNvbkxlZnRMYWJlbFJpZ2h0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBURVhUUE9TX0xFRlQ6CisgICAgICBuTGF5b3V0ID0gQnV0dG9uU3R5bGU6OmtJY29uUmlnaHRMYWJlbExlZnQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRFWFRQT1NfT1ZFUkxBSUQ6CisgICAgICBuTGF5b3V0ID0gQnV0dG9uU3R5bGU6OmtMYWJlbE92ZXJJY29uOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG5MYXlvdXQgPSBCdXR0b25TdHlsZTo6a0xhYmVsOworICAgICAgYnJlYWs7CisgIH0KKworICBDRlhfQ29sb3IgY3JCYWNrZ3JvdW5kOworICBDRlhfQ29sb3IgY3JCb3JkZXI7CisgIGludCBpQ29sb3JUeXBlOworICBmbG9hdCBmY1s0XTsKKyAgcENvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKGlDb2xvclR5cGUsIGZjKTsKKyAgaWYgKGlDb2xvclR5cGUgPiAwKQorICAgIGNyQmFja2dyb3VuZCA9IENGWF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7CisKKyAgcENvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoaUNvbG9yVHlwZSwgZmMpOworICBpZiAoaUNvbG9yVHlwZSA+IDApCisgICAgY3JCb3JkZXIgPSBDRlhfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOworCisgIGZsb2F0IGZCb3JkZXJXaWR0aCA9IHN0YXRpY19jYXN0PGZsb2F0Pih3aWRnZXRfLT5HZXRCb3JkZXJXaWR0aCgpKTsKKyAgQ1BXTF9EYXNoIGRzQm9yZGVyKDMsIDAsIDApOworICBDRlhfQ29sb3IgY3JMZWZ0VG9wOworICBDRlhfQ29sb3IgY3JSaWdodEJvdHRvbTsKKworICBCb3JkZXJTdHlsZSBuQm9yZGVyU3R5bGUgPSB3aWRnZXRfLT5HZXRCb3JkZXJTdHlsZSgpOworICBzd2l0Y2ggKG5Cb3JkZXJTdHlsZSkgeworICAgIGNhc2UgQm9yZGVyU3R5bGU6OkRBU0g6CisgICAgICBkc0JvcmRlciA9IENQV0xfRGFzaCgzLCAzLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQm9yZGVyU3R5bGU6OkJFVkVMRUQ6CisgICAgICBmQm9yZGVyV2lkdGggKj0gMjsKKyAgICAgIGNyTGVmdFRvcCA9IENGWF9Db2xvcihDRlhfQ29sb3I6OmtHcmF5LCAxKTsKKyAgICAgIGNyUmlnaHRCb3R0b20gPSBjckJhY2tncm91bmQgLyAyLjBmOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCb3JkZXJTdHlsZTo6SU5TRVQ6CisgICAgICBmQm9yZGVyV2lkdGggKj0gMjsKKyAgICAgIGNyTGVmdFRvcCA9IENGWF9Db2xvcihDRlhfQ29sb3I6OmtHcmF5LCAwLjUpOworICAgICAgY3JSaWdodEJvdHRvbSA9IENGWF9Db2xvcihDRlhfQ29sb3I6OmtHcmF5LCAwLjc1KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIENGWF9GbG9hdFJlY3QgcmNDbGllbnQgPSByY1dpbmRvdy5HZXREZWZsYXRlZChmQm9yZGVyV2lkdGgsIGZCb3JkZXJXaWR0aCk7CisgIENGWF9Db2xvciBjclRleHQoQ0ZYX0NvbG9yOjprR3JheSwgMCk7CisgIEJ5dGVTdHJpbmcgY3NOYW1lVGFnOworICBDUERGX0RlZmF1bHRBcHBlYXJhbmNlIGRhID0gcENvbnRyb2wtPkdldERlZmF1bHRBcHBlYXJhbmNlKCk7CisgIGlmIChkYS5IYXNDb2xvcigpKSB7CisgICAgZGEuR2V0Q29sb3IoaUNvbG9yVHlwZSwgZmMpOworICAgIGNyVGV4dCA9IENGWF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7CisgIH0KKyAgZmxvYXQgZkZvbnRTaXplID0gMTIuMGY7CisgIGlmIChkYS5IYXNGb250KCkpCisgICAgY3NOYW1lVGFnID0gZGEuR2V0Rm9udCgmZkZvbnRTaXplKTsKKworICBXaWRlU3RyaW5nIGNzV0NhcHRpb247CisgIFdpZGVTdHJpbmcgY3NOb3JtYWxDYXB0aW9uOworICBXaWRlU3RyaW5nIGNzUm9sbG92ZXJDYXB0aW9uOworICBXaWRlU3RyaW5nIGNzRG93bkNhcHRpb247CisgIGlmIChwQ29udHJvbC0+SGFzTUtFbnRyeSgiQ0EiKSkKKyAgICBjc05vcm1hbENhcHRpb24gPSBwQ29udHJvbC0+R2V0Tm9ybWFsQ2FwdGlvbigpOworCisgIGlmIChwQ29udHJvbC0+SGFzTUtFbnRyeSgiUkMiKSkKKyAgICBjc1JvbGxvdmVyQ2FwdGlvbiA9IHBDb250cm9sLT5HZXRSb2xsb3ZlckNhcHRpb24oKTsKKworICBpZiAocENvbnRyb2wtPkhhc01LRW50cnkoIkFDIikpCisgICAgY3NEb3duQ2FwdGlvbiA9IHBDb250cm9sLT5HZXREb3duQ2FwdGlvbigpOworCisgIENQREZfU3RyZWFtKiBwTm9ybWFsSWNvbiA9IG51bGxwdHI7CisgIENQREZfU3RyZWFtKiBwUm9sbG92ZXJJY29uID0gbnVsbHB0cjsKKyAgQ1BERl9TdHJlYW0qIHBEb3duSWNvbiA9IG51bGxwdHI7CisgIGlmIChwQ29udHJvbC0+SGFzTUtFbnRyeSgiSSIpKQorICAgIHBOb3JtYWxJY29uID0gcENvbnRyb2wtPkdldE5vcm1hbEljb24oKTsKKworICBpZiAocENvbnRyb2wtPkhhc01LRW50cnkoIlJJIikpCisgICAgcFJvbGxvdmVySWNvbiA9IHBDb250cm9sLT5HZXRSb2xsb3Zlckljb24oKTsKKworICBpZiAocENvbnRyb2wtPkhhc01LRW50cnkoIklYIikpCisgICAgcERvd25JY29uID0gcENvbnRyb2wtPkdldERvd25JY29uKCk7CisKKyAgaWYgKHBOb3JtYWxJY29uKSB7CisgICAgaWYgKENQREZfRGljdGlvbmFyeSogcEltYWdlRGljdCA9IHBOb3JtYWxJY29uLT5HZXREaWN0KCkpIHsKKyAgICAgIGlmIChwSW1hZ2VEaWN0LT5HZXRTdHJpbmdGb3IoIk5hbWUiKS5Jc0VtcHR5KCkpCisgICAgICAgIHBJbWFnZURpY3QtPlNldE5ld0ZvcjxDUERGX1N0cmluZz4oIk5hbWUiLCAiSW1nQSIsIGZhbHNlKTsKKyAgICB9CisgIH0KKworICBpZiAocFJvbGxvdmVySWNvbikgeworICAgIGlmIChDUERGX0RpY3Rpb25hcnkqIHBJbWFnZURpY3QgPSBwUm9sbG92ZXJJY29uLT5HZXREaWN0KCkpIHsKKyAgICAgIGlmIChwSW1hZ2VEaWN0LT5HZXRTdHJpbmdGb3IoIk5hbWUiKS5Jc0VtcHR5KCkpCisgICAgICAgIHBJbWFnZURpY3QtPlNldE5ld0ZvcjxDUERGX1N0cmluZz4oIk5hbWUiLCAiSW1nQiIsIGZhbHNlKTsKKyAgICB9CisgIH0KKworICBpZiAocERvd25JY29uKSB7CisgICAgaWYgKENQREZfRGljdGlvbmFyeSogcEltYWdlRGljdCA9IHBEb3duSWNvbi0+R2V0RGljdCgpKSB7CisgICAgICBpZiAocEltYWdlRGljdC0+R2V0U3RyaW5nRm9yKCJOYW1lIikuSXNFbXB0eSgpKQorICAgICAgICBwSW1hZ2VEaWN0LT5TZXROZXdGb3I8Q1BERl9TdHJpbmc+KCJOYW1lIiwgIkltZ0MiLCBmYWxzZSk7CisgICAgfQorICB9CisKKyAgQ1BERl9JY29uRml0IGljb25GaXQgPSBwQ29udHJvbC0+R2V0SWNvbkZpdCgpOworCisgIENCQV9Gb250TWFwIGZvbnRfbWFwKAorICAgICAgd2lkZ2V0Xy5HZXQoKSwKKyAgICAgIHdpZGdldF8tPkdldEludGVyRm9ybSgpLT5HZXRGb3JtRmlsbEVudigpLT5HZXRTeXNIYW5kbGVyKCkpOworICBmb250X21hcC5TZXRBUFR5cGUoIk4iKTsKKworICBCeXRlU3RyaW5nIGNzQVAgPQorICAgICAgR2V0UmVjdEZpbGxBcHBTdHJlYW0ocmNXaW5kb3csIGNyQmFja2dyb3VuZCkgKworICAgICAgR2V0Qm9yZGVyQXBwU3RyZWFtSW50ZXJuYWwocmNXaW5kb3csIGZCb3JkZXJXaWR0aCwgY3JCb3JkZXIsIGNyTGVmdFRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyUmlnaHRCb3R0b20sIG5Cb3JkZXJTdHlsZSwgZHNCb3JkZXIpICsKKyAgICAgIEdldFB1c2hCdXR0b25BcHBTdHJlYW0oaWNvbkZpdC5HZXRGaXR0aW5nQm91bmRzKCkgPyByY1dpbmRvdyA6IHJjQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9udF9tYXAsIHBOb3JtYWxJY29uLCBpY29uRml0LCBjc05vcm1hbENhcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyVGV4dCwgZkZvbnRTaXplLCBuTGF5b3V0KTsKKworICBXcml0ZSgiTiIsIGNzQVAsICIiKTsKKyAgaWYgKHBOb3JtYWxJY29uKQorICAgIEFkZEltYWdlKCJOIiwgcE5vcm1hbEljb24pOworCisgIENQREZfRm9ybUNvbnRyb2w6OkhpZ2hsaWdodGluZ01vZGUgZUhMTSA9IHBDb250cm9sLT5HZXRIaWdobGlnaHRpbmdNb2RlKCk7CisgIGlmIChlSExNID09IENQREZfRm9ybUNvbnRyb2w6OlB1c2ggfHwgZUhMTSA9PSBDUERGX0Zvcm1Db250cm9sOjpUb2dnbGUpIHsKKyAgICBpZiAoY3NSb2xsb3ZlckNhcHRpb24uSXNFbXB0eSgpICYmICFwUm9sbG92ZXJJY29uKSB7CisgICAgICBjc1JvbGxvdmVyQ2FwdGlvbiA9IGNzTm9ybWFsQ2FwdGlvbjsKKyAgICAgIHBSb2xsb3Zlckljb24gPSBwTm9ybWFsSWNvbjsKKyAgICB9CisKKyAgICBmb250X21hcC5TZXRBUFR5cGUoIlIiKTsKKworICAgIGNzQVAgPQorICAgICAgICBHZXRSZWN0RmlsbEFwcFN0cmVhbShyY1dpbmRvdywgY3JCYWNrZ3JvdW5kKSArCisgICAgICAgIEdldEJvcmRlckFwcFN0cmVhbUludGVybmFsKHJjV2luZG93LCBmQm9yZGVyV2lkdGgsIGNyQm9yZGVyLCBjckxlZnRUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyUmlnaHRCb3R0b20sIG5Cb3JkZXJTdHlsZSwgZHNCb3JkZXIpICsKKyAgICAgICAgR2V0UHVzaEJ1dHRvbkFwcFN0cmVhbShpY29uRml0LkdldEZpdHRpbmdCb3VuZHMoKSA/IHJjV2luZG93IDogcmNDbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvbnRfbWFwLCBwUm9sbG92ZXJJY29uLCBpY29uRml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzUm9sbG92ZXJDYXB0aW9uLCBjclRleHQsIGZGb250U2l6ZSwgbkxheW91dCk7CisKKyAgICBXcml0ZSgiUiIsIGNzQVAsICIiKTsKKyAgICBpZiAocFJvbGxvdmVySWNvbikKKyAgICAgIEFkZEltYWdlKCJSIiwgcFJvbGxvdmVySWNvbik7CisKKyAgICBpZiAoY3NEb3duQ2FwdGlvbi5Jc0VtcHR5KCkgJiYgIXBEb3duSWNvbikgeworICAgICAgY3NEb3duQ2FwdGlvbiA9IGNzTm9ybWFsQ2FwdGlvbjsKKyAgICAgIHBEb3duSWNvbiA9IHBOb3JtYWxJY29uOworICAgIH0KKworICAgIHN3aXRjaCAobkJvcmRlclN0eWxlKSB7CisgICAgICBjYXNlIEJvcmRlclN0eWxlOjpCRVZFTEVEOiB7CisgICAgICAgIENGWF9Db2xvciBjclRlbXAgPSBjckxlZnRUb3A7CisgICAgICAgIGNyTGVmdFRvcCA9IGNyUmlnaHRCb3R0b207CisgICAgICAgIGNyUmlnaHRCb3R0b20gPSBjclRlbXA7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBCb3JkZXJTdHlsZTo6SU5TRVQ6IHsKKyAgICAgICAgY3JMZWZ0VG9wID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIDApOworICAgICAgICBjclJpZ2h0Qm90dG9tID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIDEpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGZvbnRfbWFwLlNldEFQVHlwZSgiRCIpOworCisgICAgY3NBUCA9CisgICAgICAgIEdldFJlY3RGaWxsQXBwU3RyZWFtKHJjV2luZG93LCBjckJhY2tncm91bmQgLSAwLjI1ZikgKworICAgICAgICBHZXRCb3JkZXJBcHBTdHJlYW1JbnRlcm5hbChyY1dpbmRvdywgZkJvcmRlcldpZHRoLCBjckJvcmRlciwgY3JMZWZ0VG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjclJpZ2h0Qm90dG9tLCBuQm9yZGVyU3R5bGUsIGRzQm9yZGVyKSArCisgICAgICAgIEdldFB1c2hCdXR0b25BcHBTdHJlYW0oaWNvbkZpdC5HZXRGaXR0aW5nQm91bmRzKCkgPyByY1dpbmRvdyA6IHJjQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb250X21hcCwgcERvd25JY29uLCBpY29uRml0LCBjc0Rvd25DYXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyVGV4dCwgZkZvbnRTaXplLCBuTGF5b3V0KTsKKworICAgIFdyaXRlKCJEIiwgY3NBUCwgIiIpOworICAgIGlmIChwRG93bkljb24pCisgICAgICBBZGRJbWFnZSgiRCIsIHBEb3duSWNvbik7CisgIH0gZWxzZSB7CisgICAgUmVtb3ZlKCJEIik7CisgICAgUmVtb3ZlKCJSIik7CisgIH0KK30KKwordm9pZCBDUFdMX0FwcFN0cmVhbTo6U2V0QXNDaGVja0JveCgpIHsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSB3aWRnZXRfLT5HZXRGb3JtQ29udHJvbCgpOworICBDRlhfQ29sb3IgY3JCYWNrZ3JvdW5kLCBjckJvcmRlciwgY3JUZXh0OworICBpbnQgaUNvbG9yVHlwZTsKKyAgZmxvYXQgZmNbNF07CisKKyAgcENvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKGlDb2xvclR5cGUsIGZjKTsKKyAgaWYgKGlDb2xvclR5cGUgPiAwKQorICAgIGNyQmFja2dyb3VuZCA9IENGWF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7CisKKyAgcENvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoaUNvbG9yVHlwZSwgZmMpOworICBpZiAoaUNvbG9yVHlwZSA+IDApCisgICAgY3JCb3JkZXIgPSBDRlhfQ29sb3IoaUNvbG9yVHlwZSwgZmNbMF0sIGZjWzFdLCBmY1syXSwgZmNbM10pOworCisgIGZsb2F0IGZCb3JkZXJXaWR0aCA9IHN0YXRpY19jYXN0PGZsb2F0Pih3aWRnZXRfLT5HZXRCb3JkZXJXaWR0aCgpKTsKKyAgQ1BXTF9EYXNoIGRzQm9yZGVyKDMsIDAsIDApOworICBDRlhfQ29sb3IgY3JMZWZ0VG9wLCBjclJpZ2h0Qm90dG9tOworCisgIEJvcmRlclN0eWxlIG5Cb3JkZXJTdHlsZSA9IHdpZGdldF8tPkdldEJvcmRlclN0eWxlKCk7CisgIHN3aXRjaCAobkJvcmRlclN0eWxlKSB7CisgICAgY2FzZSBCb3JkZXJTdHlsZTo6REFTSDoKKyAgICAgIGRzQm9yZGVyID0gQ1BXTF9EYXNoKDMsIDMsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCb3JkZXJTdHlsZTo6QkVWRUxFRDoKKyAgICAgIGZCb3JkZXJXaWR0aCAqPSAyOworICAgICAgY3JMZWZ0VG9wID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIDEpOworICAgICAgY3JSaWdodEJvdHRvbSA9IGNyQmFja2dyb3VuZCAvIDIuMGY7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJvcmRlclN0eWxlOjpJTlNFVDoKKyAgICAgIGZCb3JkZXJXaWR0aCAqPSAyOworICAgICAgY3JMZWZ0VG9wID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIDAuNSk7CisgICAgICBjclJpZ2h0Qm90dG9tID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIDAuNzUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgQ0ZYX0Zsb2F0UmVjdCByY1dpbmRvdyA9IHdpZGdldF8tPkdldFJvdGF0ZWRSZWN0KCk7CisgIENGWF9GbG9hdFJlY3QgcmNDbGllbnQgPSByY1dpbmRvdy5HZXREZWZsYXRlZChmQm9yZGVyV2lkdGgsIGZCb3JkZXJXaWR0aCk7CisgIENQREZfRGVmYXVsdEFwcGVhcmFuY2UgZGEgPSBwQ29udHJvbC0+R2V0RGVmYXVsdEFwcGVhcmFuY2UoKTsKKyAgaWYgKGRhLkhhc0NvbG9yKCkpIHsKKyAgICBkYS5HZXRDb2xvcihpQ29sb3JUeXBlLCBmYyk7CisgICAgY3JUZXh0ID0gQ0ZYX0NvbG9yKGlDb2xvclR5cGUsIGZjWzBdLCBmY1sxXSwgZmNbMl0sIGZjWzNdKTsKKyAgfQorCisgIENoZWNrU3R5bGUgblN0eWxlID0gQ2hlY2tTdHlsZTo6a0NoZWNrOworICBXaWRlU3RyaW5nIGNzV0NhcHRpb24gPSBwQ29udHJvbC0+R2V0Tm9ybWFsQ2FwdGlvbigpOworICBpZiAoY3NXQ2FwdGlvbi5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICBzd2l0Y2ggKGNzV0NhcHRpb25bMF0pIHsKKyAgICAgIGNhc2UgTCdsJzoKKyAgICAgICAgblN0eWxlID0gQ2hlY2tTdHlsZTo6a0NpcmNsZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEwnOCc6CisgICAgICAgIG5TdHlsZSA9IENoZWNrU3R5bGU6OmtDcm9zczsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEwndSc6CisgICAgICAgIG5TdHlsZSA9IENoZWNrU3R5bGU6OmtEaWFtb25kOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTCduJzoKKyAgICAgICAgblN0eWxlID0gQ2hlY2tTdHlsZTo6a1NxdWFyZTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEwnSCc6CisgICAgICAgIG5TdHlsZSA9IENoZWNrU3R5bGU6OmtTdGFyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTCc0JzoKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIG5TdHlsZSA9IENoZWNrU3R5bGU6OmtDaGVjazsKKyAgICB9CisgIH0KKworICBCeXRlU3RyaW5nIGNzQVBfTl9PTiA9CisgICAgICBHZXRSZWN0RmlsbEFwcFN0cmVhbShyY1dpbmRvdywgY3JCYWNrZ3JvdW5kKSArCisgICAgICBHZXRCb3JkZXJBcHBTdHJlYW1JbnRlcm5hbChyY1dpbmRvdywgZkJvcmRlcldpZHRoLCBjckJvcmRlciwgY3JMZWZ0VG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JSaWdodEJvdHRvbSwgbkJvcmRlclN0eWxlLCBkc0JvcmRlcik7CisKKyAgQnl0ZVN0cmluZyBjc0FQX05fT0ZGID0gY3NBUF9OX09OOworCisgIHN3aXRjaCAobkJvcmRlclN0eWxlKSB7CisgICAgY2FzZSBCb3JkZXJTdHlsZTo6QkVWRUxFRDogeworICAgICAgQ0ZYX0NvbG9yIGNyVGVtcCA9IGNyTGVmdFRvcDsKKyAgICAgIGNyTGVmdFRvcCA9IGNyUmlnaHRCb3R0b207CisgICAgICBjclJpZ2h0Qm90dG9tID0gY3JUZW1wOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQm9yZGVyU3R5bGU6OklOU0VUOiB7CisgICAgICBjckxlZnRUb3AgPSBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprR3JheSwgMCk7CisgICAgICBjclJpZ2h0Qm90dG9tID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIDEpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIEJ5dGVTdHJpbmcgY3NBUF9EX09OID0KKyAgICAgIEdldFJlY3RGaWxsQXBwU3RyZWFtKHJjV2luZG93LCBjckJhY2tncm91bmQgLSAwLjI1ZikgKworICAgICAgR2V0Qm9yZGVyQXBwU3RyZWFtSW50ZXJuYWwocmNXaW5kb3csIGZCb3JkZXJXaWR0aCwgY3JCb3JkZXIsIGNyTGVmdFRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyUmlnaHRCb3R0b20sIG5Cb3JkZXJTdHlsZSwgZHNCb3JkZXIpOworCisgIEJ5dGVTdHJpbmcgY3NBUF9EX09GRiA9IGNzQVBfRF9PTjsKKworICBjc0FQX05fT04gKz0gR2V0Q2hlY2tCb3hBcHBTdHJlYW0ocmNDbGllbnQsIG5TdHlsZSwgY3JUZXh0KTsKKyAgY3NBUF9EX09OICs9IEdldENoZWNrQm94QXBwU3RyZWFtKHJjQ2xpZW50LCBuU3R5bGUsIGNyVGV4dCk7CisKKyAgV3JpdGUoIk4iLCBjc0FQX05fT04sIHBDb250cm9sLT5HZXRDaGVja2VkQVBTdGF0ZSgpKTsKKyAgV3JpdGUoIk4iLCBjc0FQX05fT0ZGLCAiT2ZmIik7CisKKyAgV3JpdGUoIkQiLCBjc0FQX0RfT04sIHBDb250cm9sLT5HZXRDaGVja2VkQVBTdGF0ZSgpKTsKKyAgV3JpdGUoIkQiLCBjc0FQX0RfT0ZGLCAiT2ZmIik7CisKKyAgQnl0ZVN0cmluZyBjc0FTID0gd2lkZ2V0Xy0+R2V0QXBwU3RhdGUoKTsKKyAgaWYgKGNzQVMuSXNFbXB0eSgpKQorICAgIHdpZGdldF8tPlNldEFwcFN0YXRlKCJPZmYiKTsKK30KKwordm9pZCBDUFdMX0FwcFN0cmVhbTo6U2V0QXNSYWRpb0J1dHRvbigpIHsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSB3aWRnZXRfLT5HZXRGb3JtQ29udHJvbCgpOworICBDRlhfQ29sb3IgY3JCYWNrZ3JvdW5kOworICBDRlhfQ29sb3IgY3JCb3JkZXI7CisgIENGWF9Db2xvciBjclRleHQ7CisgIGludCBpQ29sb3JUeXBlOworICBmbG9hdCBmY1s0XTsKKworICBwQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoaUNvbG9yVHlwZSwgZmMpOworICBpZiAoaUNvbG9yVHlwZSA+IDApCisgICAgY3JCYWNrZ3JvdW5kID0gQ0ZYX0NvbG9yKGlDb2xvclR5cGUsIGZjWzBdLCBmY1sxXSwgZmNbMl0sIGZjWzNdKTsKKworICBwQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcihpQ29sb3JUeXBlLCBmYyk7CisgIGlmIChpQ29sb3JUeXBlID4gMCkKKyAgICBjckJvcmRlciA9IENGWF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7CisKKyAgZmxvYXQgZkJvcmRlcldpZHRoID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHdpZGdldF8tPkdldEJvcmRlcldpZHRoKCkpOworICBDUFdMX0Rhc2ggZHNCb3JkZXIoMywgMCwgMCk7CisgIENGWF9Db2xvciBjckxlZnRUb3A7CisgIENGWF9Db2xvciBjclJpZ2h0Qm90dG9tOworICBCb3JkZXJTdHlsZSBuQm9yZGVyU3R5bGUgPSB3aWRnZXRfLT5HZXRCb3JkZXJTdHlsZSgpOworICBzd2l0Y2ggKG5Cb3JkZXJTdHlsZSkgeworICAgIGNhc2UgQm9yZGVyU3R5bGU6OkRBU0g6CisgICAgICBkc0JvcmRlciA9IENQV0xfRGFzaCgzLCAzLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQm9yZGVyU3R5bGU6OkJFVkVMRUQ6CisgICAgICBmQm9yZGVyV2lkdGggKj0gMjsKKyAgICAgIGNyTGVmdFRvcCA9IENGWF9Db2xvcihDRlhfQ29sb3I6OmtHcmF5LCAxKTsKKyAgICAgIGNyUmlnaHRCb3R0b20gPSBjckJhY2tncm91bmQgLyAyLjBmOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCb3JkZXJTdHlsZTo6SU5TRVQ6CisgICAgICBmQm9yZGVyV2lkdGggKj0gMjsKKyAgICAgIGNyTGVmdFRvcCA9IENGWF9Db2xvcihDRlhfQ29sb3I6OmtHcmF5LCAwLjUpOworICAgICAgY3JSaWdodEJvdHRvbSA9IENGWF9Db2xvcihDRlhfQ29sb3I6OmtHcmF5LCAwLjc1KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIENGWF9GbG9hdFJlY3QgcmNXaW5kb3cgPSB3aWRnZXRfLT5HZXRSb3RhdGVkUmVjdCgpOworICBDRlhfRmxvYXRSZWN0IHJjQ2xpZW50ID0gcmNXaW5kb3cuR2V0RGVmbGF0ZWQoZkJvcmRlcldpZHRoLCBmQm9yZGVyV2lkdGgpOworICBDUERGX0RlZmF1bHRBcHBlYXJhbmNlIGRhID0gcENvbnRyb2wtPkdldERlZmF1bHRBcHBlYXJhbmNlKCk7CisgIGlmIChkYS5IYXNDb2xvcigpKSB7CisgICAgZGEuR2V0Q29sb3IoaUNvbG9yVHlwZSwgZmMpOworICAgIGNyVGV4dCA9IENGWF9Db2xvcihpQ29sb3JUeXBlLCBmY1swXSwgZmNbMV0sIGZjWzJdLCBmY1szXSk7CisgIH0KKworICBDaGVja1N0eWxlIG5TdHlsZSA9IENoZWNrU3R5bGU6OmtDaXJjbGU7CisgIFdpZGVTdHJpbmcgY3NXQ2FwdGlvbiA9IHBDb250cm9sLT5HZXROb3JtYWxDYXB0aW9uKCk7CisgIGlmIChjc1dDYXB0aW9uLkdldExlbmd0aCgpID4gMCkgeworICAgIHN3aXRjaCAoY3NXQ2FwdGlvblswXSkgeworICAgICAgY2FzZSBMJzgnOgorICAgICAgICBuU3R5bGUgPSBDaGVja1N0eWxlOjprQ3Jvc3M7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBMJ3UnOgorICAgICAgICBuU3R5bGUgPSBDaGVja1N0eWxlOjprRGlhbW9uZDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEwnbic6CisgICAgICAgIG5TdHlsZSA9IENoZWNrU3R5bGU6OmtTcXVhcmU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBMJ0gnOgorICAgICAgICBuU3R5bGUgPSBDaGVja1N0eWxlOjprU3RhcjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEwnNCc6CisgICAgICAgIG5TdHlsZSA9IENoZWNrU3R5bGU6OmtDaGVjazsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEwnbCc6CisgICAgICBkZWZhdWx0OgorICAgICAgICBuU3R5bGUgPSBDaGVja1N0eWxlOjprQ2lyY2xlOworICAgIH0KKyAgfQorCisgIEJ5dGVTdHJpbmcgY3NBUF9OX09OOworICBDRlhfRmxvYXRSZWN0IHJjQ2VudGVyID0gcmNXaW5kb3cuR2V0Q2VudGVyU3F1YXJlKCkuR2V0RGVmbGF0ZWQoMS4wZiwgMS4wZik7CisgIGlmIChuU3R5bGUgPT0gQ2hlY2tTdHlsZTo6a0NpcmNsZSkgeworICAgIGlmIChuQm9yZGVyU3R5bGUgPT0gQm9yZGVyU3R5bGU6OkJFVkVMRUQpIHsKKyAgICAgIGNyTGVmdFRvcCA9IENGWF9Db2xvcihDRlhfQ29sb3I6OmtHcmF5LCAxKTsKKyAgICAgIGNyUmlnaHRCb3R0b20gPSBjckJhY2tncm91bmQgLSAwLjI1ZjsKKyAgICB9IGVsc2UgaWYgKG5Cb3JkZXJTdHlsZSA9PSBCb3JkZXJTdHlsZTo6SU5TRVQpIHsKKyAgICAgIGNyTGVmdFRvcCA9IENGWF9Db2xvcihDRlhfQ29sb3I6OmtHcmF5LCAwLjVmKTsKKyAgICAgIGNyUmlnaHRCb3R0b20gPSBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprR3JheSwgMC43NWYpOworICAgIH0KKworICAgIGNzQVBfTl9PTiA9CisgICAgICAgIEdldENpcmNsZUZpbGxBcHBTdHJlYW0ocmNDZW50ZXIsIGNyQmFja2dyb3VuZCkgKworICAgICAgICBHZXRDaXJjbGVCb3JkZXJBcHBTdHJlYW0ocmNDZW50ZXIsIGZCb3JkZXJXaWR0aCwgY3JCb3JkZXIsIGNyTGVmdFRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyUmlnaHRCb3R0b20sIG5Cb3JkZXJTdHlsZSwgZHNCb3JkZXIpOworICB9IGVsc2UgeworICAgIGNzQVBfTl9PTiA9CisgICAgICAgIEdldFJlY3RGaWxsQXBwU3RyZWFtKHJjV2luZG93LCBjckJhY2tncm91bmQpICsKKyAgICAgICAgR2V0Qm9yZGVyQXBwU3RyZWFtSW50ZXJuYWwocmNXaW5kb3csIGZCb3JkZXJXaWR0aCwgY3JCb3JkZXIsIGNyTGVmdFRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JSaWdodEJvdHRvbSwgbkJvcmRlclN0eWxlLCBkc0JvcmRlcik7CisgIH0KKworICBCeXRlU3RyaW5nIGNzQVBfTl9PRkYgPSBjc0FQX05fT047CisKKyAgc3dpdGNoIChuQm9yZGVyU3R5bGUpIHsKKyAgICBjYXNlIEJvcmRlclN0eWxlOjpCRVZFTEVEOiB7CisgICAgICBDRlhfQ29sb3IgY3JUZW1wID0gY3JMZWZ0VG9wOworICAgICAgY3JMZWZ0VG9wID0gY3JSaWdodEJvdHRvbTsKKyAgICAgIGNyUmlnaHRCb3R0b20gPSBjclRlbXA7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCb3JkZXJTdHlsZTo6SU5TRVQ6IHsKKyAgICAgIGNyTGVmdFRvcCA9IENGWF9Db2xvcihDRlhfQ29sb3I6OmtHcmF5LCAwKTsKKyAgICAgIGNyUmlnaHRCb3R0b20gPSBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprR3JheSwgMSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgQnl0ZVN0cmluZyBjc0FQX0RfT047CisKKyAgaWYgKG5TdHlsZSA9PSBDaGVja1N0eWxlOjprQ2lyY2xlKSB7CisgICAgQ0ZYX0NvbG9yIGNyQksgPSBjckJhY2tncm91bmQgLSAwLjI1ZjsKKyAgICBpZiAobkJvcmRlclN0eWxlID09IEJvcmRlclN0eWxlOjpCRVZFTEVEKSB7CisgICAgICBjckxlZnRUb3AgPSBjckJhY2tncm91bmQgLSAwLjI1ZjsKKyAgICAgIGNyUmlnaHRCb3R0b20gPSBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprR3JheSwgMSk7CisgICAgICBjckJLID0gY3JCYWNrZ3JvdW5kOworICAgIH0gZWxzZSBpZiAobkJvcmRlclN0eWxlID09IEJvcmRlclN0eWxlOjpJTlNFVCkgeworICAgICAgY3JMZWZ0VG9wID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIDApOworICAgICAgY3JSaWdodEJvdHRvbSA9IENGWF9Db2xvcihDRlhfQ29sb3I6OmtHcmF5LCAxKTsKKyAgICB9CisKKyAgICBjc0FQX0RfT04gPQorICAgICAgICBHZXRDaXJjbGVGaWxsQXBwU3RyZWFtKHJjQ2VudGVyLCBjckJLKSArCisgICAgICAgIEdldENpcmNsZUJvcmRlckFwcFN0cmVhbShyY0NlbnRlciwgZkJvcmRlcldpZHRoLCBjckJvcmRlciwgY3JMZWZ0VG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JSaWdodEJvdHRvbSwgbkJvcmRlclN0eWxlLCBkc0JvcmRlcik7CisgIH0gZWxzZSB7CisgICAgY3NBUF9EX09OID0KKyAgICAgICAgR2V0UmVjdEZpbGxBcHBTdHJlYW0ocmNXaW5kb3csIGNyQmFja2dyb3VuZCAtIDAuMjVmKSArCisgICAgICAgIEdldEJvcmRlckFwcFN0cmVhbUludGVybmFsKHJjV2luZG93LCBmQm9yZGVyV2lkdGgsIGNyQm9yZGVyLCBjckxlZnRUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyUmlnaHRCb3R0b20sIG5Cb3JkZXJTdHlsZSwgZHNCb3JkZXIpOworICB9CisKKyAgQnl0ZVN0cmluZyBjc0FQX0RfT0ZGID0gY3NBUF9EX09OOworCisgIGNzQVBfTl9PTiArPSBHZXRSYWRpb0J1dHRvbkFwcFN0cmVhbShyY0NsaWVudCwgblN0eWxlLCBjclRleHQpOworICBjc0FQX0RfT04gKz0gR2V0UmFkaW9CdXR0b25BcHBTdHJlYW0ocmNDbGllbnQsIG5TdHlsZSwgY3JUZXh0KTsKKworICBXcml0ZSgiTiIsIGNzQVBfTl9PTiwgcENvbnRyb2wtPkdldENoZWNrZWRBUFN0YXRlKCkpOworICBXcml0ZSgiTiIsIGNzQVBfTl9PRkYsICJPZmYiKTsKKworICBXcml0ZSgiRCIsIGNzQVBfRF9PTiwgcENvbnRyb2wtPkdldENoZWNrZWRBUFN0YXRlKCkpOworICBXcml0ZSgiRCIsIGNzQVBfRF9PRkYsICJPZmYiKTsKKworICBCeXRlU3RyaW5nIGNzQVMgPSB3aWRnZXRfLT5HZXRBcHBTdGF0ZSgpOworICBpZiAoY3NBUy5Jc0VtcHR5KCkpCisgICAgd2lkZ2V0Xy0+U2V0QXBwU3RhdGUoIk9mZiIpOworfQorCit2b2lkIENQV0xfQXBwU3RyZWFtOjpTZXRBc0NvbWJvQm94KGNvbnN0IFdpZGVTdHJpbmcqIHNWYWx1ZSkgeworICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IHdpZGdldF8tPkdldEZvcm1Db250cm9sKCk7CisgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBwQ29udHJvbC0+R2V0RmllbGQoKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNCb2R5OworCisgIENGWF9GbG9hdFJlY3QgcmNDbGllbnQgPSB3aWRnZXRfLT5HZXRDbGllbnRSZWN0KCk7CisgIENGWF9GbG9hdFJlY3QgcmNCdXR0b24gPSByY0NsaWVudDsKKyAgcmNCdXR0b24ubGVmdCA9IHJjQnV0dG9uLnJpZ2h0IC0gMTM7CisgIHJjQnV0dG9uLk5vcm1hbGl6ZSgpOworCisgIGF1dG8gcEVkaXQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BXTF9FZGl0SW1wbD4oKTsKKyAgcEVkaXQtPkVuYWJsZVJlZnJlc2goZmFsc2UpOworCisgIENCQV9Gb250TWFwIGZvbnRfbWFwKAorICAgICAgd2lkZ2V0Xy5HZXQoKSwKKyAgICAgIHdpZGdldF8tPkdldEludGVyRm9ybSgpLT5HZXRGb3JtRmlsbEVudigpLT5HZXRTeXNIYW5kbGVyKCkpOworICBwRWRpdC0+U2V0Rm9udE1hcCgmZm9udF9tYXApOworCisgIENGWF9GbG9hdFJlY3QgcmNFZGl0ID0gcmNDbGllbnQ7CisgIHJjRWRpdC5yaWdodCA9IHJjQnV0dG9uLmxlZnQ7CisgIHJjRWRpdC5Ob3JtYWxpemUoKTsKKworICBwRWRpdC0+U2V0UGxhdGVSZWN0KHJjRWRpdCk7CisgIHBFZGl0LT5TZXRBbGlnbm1lbnRWKDEsIHRydWUpOworCisgIGZsb2F0IGZGb250U2l6ZSA9IHdpZGdldF8tPkdldEZvbnRTaXplKCk7CisgIGlmIChJc0Zsb2F0WmVybyhmRm9udFNpemUpKQorICAgIHBFZGl0LT5TZXRBdXRvRm9udFNpemUodHJ1ZSwgdHJ1ZSk7CisgIGVsc2UKKyAgICBwRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKKworICBwRWRpdC0+SW5pdGlhbGl6ZSgpOworCisgIGlmIChzVmFsdWUpIHsKKyAgICBwRWRpdC0+U2V0VGV4dCgqc1ZhbHVlKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQzMl90IG5DdXJTZWwgPSBwRmllbGQtPkdldFNlbGVjdGVkSW5kZXgoMCk7CisgICAgaWYgKG5DdXJTZWwgPCAwKQorICAgICAgcEVkaXQtPlNldFRleHQocEZpZWxkLT5HZXRWYWx1ZSgpKTsKKyAgICBlbHNlCisgICAgICBwRWRpdC0+U2V0VGV4dChwRmllbGQtPkdldE9wdGlvbkxhYmVsKG5DdXJTZWwpKTsKKyAgfQorCisgIENGWF9GbG9hdFJlY3QgcmNDb250ZW50ID0gcEVkaXQtPkdldENvbnRlbnRSZWN0KCk7CisgIEJ5dGVTdHJpbmcgc0VkaXQgPSBHZXRFZGl0QXBwU3RyZWFtKHBFZGl0LmdldCgpLCBDRlhfUG9pbnRGKCksIHRydWUsIDApOworICBpZiAoc0VkaXQuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgc0JvZHkgPDwgIi9UeCAiOworICAgIEF1dG9DbG9zZWRDb21tYW5kIGJtYygmc0JvZHksIGtNYXJrZWRTZXF1ZW5jZUJlZ2luT3BlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGtNYXJrZWRTZXF1ZW5jZUVuZE9wZXJhdG9yKTsKKyAgICBBdXRvQ2xvc2VkUUNvbW1hbmQgcSgmc0JvZHkpOworCisgICAgaWYgKHJjQ29udGVudC5XaWR0aCgpID4gcmNFZGl0LldpZHRoKCkgfHwKKyAgICAgICAgcmNDb250ZW50LkhlaWdodCgpID4gcmNFZGl0LkhlaWdodCgpKSB7CisgICAgICBzQm9keSA8PCByY0VkaXQubGVmdCA8PCAiICIgPDwgcmNFZGl0LmJvdHRvbSA8PCAiICIgPDwgcmNFZGl0LldpZHRoKCkKKyAgICAgICAgICAgIDw8ICIgIiA8PCByY0VkaXQuSGVpZ2h0KCkgPDwgIiAiIDw8IGtBcHBlbmRSZWN0T3BlcmF0b3IgPDwgIlxuIgorICAgICAgICAgICAgPDwga1NldE5vblplcm9XaW5kaW5nQ2xpcE9wZXJhdG9yIDw8ICJcbiIKKyAgICAgICAgICAgIDw8IGtFbmRQYXRoTm9GaWxsT3JTdHJva2VPcGVyYXRvciA8PCAiXG4iOworICAgIH0KKworICAgIENGWF9Db2xvciBjclRleHQgPSB3aWRnZXRfLT5HZXRUZXh0UFdMQ29sb3IoKTsKKyAgICBBdXRvQ2xvc2VkQ29tbWFuZCBidCgmc0JvZHksIGtUZXh0QmVnaW5PcGVyYXRvciwga1RleHRFbmRPcGVyYXRvcik7CisgICAgc0JvZHkgPDwgR2V0Q29sb3JBcHBTdHJlYW0oY3JUZXh0LCB0cnVlKSA8PCBzRWRpdDsKKyAgfQorCisgIHNCb2R5IDw8IEdldERyb3BCdXR0b25BcHBTdHJlYW0ocmNCdXR0b24pOworICBXcml0ZSgiTiIsCisgICAgICAgIEdldEJhY2tncm91bmRBcHBTdHJlYW0oKSArIEdldEJvcmRlckFwcFN0cmVhbSgpICsgQnl0ZVN0cmluZyhzQm9keSksCisgICAgICAgICIiKTsKK30KKwordm9pZCBDUFdMX0FwcFN0cmVhbTo6U2V0QXNMaXN0Qm94KCkgeworICBDUERGX0Zvcm1Db250cm9sKiBwQ29udHJvbCA9IHdpZGdldF8tPkdldEZvcm1Db250cm9sKCk7CisgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBwQ29udHJvbC0+R2V0RmllbGQoKTsKKyAgQ0ZYX0Zsb2F0UmVjdCByY0NsaWVudCA9IHdpZGdldF8tPkdldENsaWVudFJlY3QoKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNCb2R5OworCisgIGF1dG8gcEVkaXQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BXTF9FZGl0SW1wbD4oKTsKKyAgcEVkaXQtPkVuYWJsZVJlZnJlc2goZmFsc2UpOworCisgIENCQV9Gb250TWFwIGZvbnRfbWFwKAorICAgICAgd2lkZ2V0Xy5HZXQoKSwKKyAgICAgIHdpZGdldF8tPkdldEludGVyRm9ybSgpLT5HZXRGb3JtRmlsbEVudigpLT5HZXRTeXNIYW5kbGVyKCkpOworICBwRWRpdC0+U2V0Rm9udE1hcCgmZm9udF9tYXApOworICBwRWRpdC0+U2V0UGxhdGVSZWN0KENGWF9GbG9hdFJlY3QocmNDbGllbnQubGVmdCwgMC4wZiwgcmNDbGllbnQucmlnaHQsIDAuMGYpKTsKKworICBmbG9hdCBmRm9udFNpemUgPSB3aWRnZXRfLT5HZXRGb250U2l6ZSgpOworICBwRWRpdC0+U2V0Rm9udFNpemUoSXNGbG9hdFplcm8oZkZvbnRTaXplKSA/IDEyLjBmIDogZkZvbnRTaXplKTsKKyAgcEVkaXQtPkluaXRpYWxpemUoKTsKKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc0xpc3Q7CisgIGZsb2F0IGZ5ID0gcmNDbGllbnQudG9wOworCisgIGludDMyX3QgblRvcCA9IHBGaWVsZC0+R2V0VG9wVmlzaWJsZUluZGV4KCk7CisgIGludDMyX3QgbkNvdW50ID0gcEZpZWxkLT5Db3VudE9wdGlvbnMoKTsKKyAgaW50MzJfdCBuU2VsQ291bnQgPSBwRmllbGQtPkNvdW50U2VsZWN0ZWRJdGVtcygpOworCisgIGZvciAoaW50MzJfdCBpID0gblRvcDsgaSA8IG5Db3VudDsgKytpKSB7CisgICAgYm9vbCBiU2VsZWN0ZWQgPSBmYWxzZTsKKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBuU2VsQ291bnQ7ICsraikgeworICAgICAgaWYgKHBGaWVsZC0+R2V0U2VsZWN0ZWRJbmRleChqKSA9PSBpKSB7CisgICAgICAgIGJTZWxlY3RlZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIHBFZGl0LT5TZXRUZXh0KHBGaWVsZC0+R2V0T3B0aW9uTGFiZWwoaSkpOworCisgICAgQ0ZYX0Zsb2F0UmVjdCByY0NvbnRlbnQgPSBwRWRpdC0+R2V0Q29udGVudFJlY3QoKTsKKyAgICBmbG9hdCBmSXRlbUhlaWdodCA9IHJjQ29udGVudC5IZWlnaHQoKTsKKworICAgIGlmIChiU2VsZWN0ZWQpIHsKKyAgICAgIENGWF9GbG9hdFJlY3QgcmNJdGVtID0KKyAgICAgICAgICBDRlhfRmxvYXRSZWN0KHJjQ2xpZW50LmxlZnQsIGZ5IC0gZkl0ZW1IZWlnaHQsIHJjQ2xpZW50LnJpZ2h0LCBmeSk7CisgICAgICB7CisgICAgICAgIEF1dG9DbG9zZWRRQ29tbWFuZCBxKCZzTGlzdCk7CisgICAgICAgIHNMaXN0IDw8IEdldENvbG9yQXBwU3RyZWFtKENGWF9Db2xvcihDRlhfQ29sb3I6OmtSR0IsIDAsIDUxLjBmIC8gMjU1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEzLjBmIC8gMjU1LjBmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkKKyAgICAgICAgICAgICAgPDwgcmNJdGVtLmxlZnQgPDwgIiAiIDw8IHJjSXRlbS5ib3R0b20gPDwgIiAiIDw8IHJjSXRlbS5XaWR0aCgpCisgICAgICAgICAgICAgIDw8ICIgIiA8PCByY0l0ZW0uSGVpZ2h0KCkgPDwgIiAiIDw8IGtBcHBlbmRSZWN0T3BlcmF0b3IgPDwgIiAiCisgICAgICAgICAgICAgIDw8IGtGaWxsT3BlcmF0b3IgPDwgIlxuIjsKKyAgICAgIH0KKworICAgICAgQXV0b0Nsb3NlZENvbW1hbmQgYnQoJnNMaXN0LCBrVGV4dEJlZ2luT3BlcmF0b3IsIGtUZXh0RW5kT3BlcmF0b3IpOworICAgICAgc0xpc3QgPDwgR2V0Q29sb3JBcHBTdHJlYW0oQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIDEpLCB0cnVlKQorICAgICAgICAgICAgPDwgR2V0RWRpdEFwcFN0cmVhbShwRWRpdC5nZXQoKSwgQ0ZYX1BvaW50RigwLjBmLCBmeSksIHRydWUsIDApOworICAgIH0gZWxzZSB7CisgICAgICBDRlhfQ29sb3IgY3JUZXh0ID0gd2lkZ2V0Xy0+R2V0VGV4dFBXTENvbG9yKCk7CisKKyAgICAgIEF1dG9DbG9zZWRDb21tYW5kIGJ0KCZzTGlzdCwga1RleHRCZWdpbk9wZXJhdG9yLCBrVGV4dEVuZE9wZXJhdG9yKTsKKyAgICAgIHNMaXN0IDw8IEdldENvbG9yQXBwU3RyZWFtKGNyVGV4dCwgdHJ1ZSkKKyAgICAgICAgICAgIDw8IEdldEVkaXRBcHBTdHJlYW0ocEVkaXQuZ2V0KCksIENGWF9Qb2ludEYoMC4wZiwgZnkpLCB0cnVlLCAwKTsKKyAgICB9CisKKyAgICBmeSAtPSBmSXRlbUhlaWdodDsKKyAgfQorCisgIGlmIChzTGlzdC50ZWxscCgpID4gMCkgeworICAgIHNCb2R5IDw8ICIvVHggIjsKKyAgICBBdXRvQ2xvc2VkQ29tbWFuZCBibWMoJnNCb2R5LCBrTWFya2VkU2VxdWVuY2VCZWdpbk9wZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBrTWFya2VkU2VxdWVuY2VFbmRPcGVyYXRvcik7CisgICAgQXV0b0Nsb3NlZFFDb21tYW5kIHEoJnNCb2R5KTsKKworICAgIHNCb2R5IDw8IHJjQ2xpZW50LmxlZnQgPDwgIiAiIDw8IHJjQ2xpZW50LmJvdHRvbSA8PCAiICIgPDwgcmNDbGllbnQuV2lkdGgoKQorICAgICAgICAgIDw8ICIgIiA8PCByY0NsaWVudC5IZWlnaHQoKSA8PCAiICIgPDwga0FwcGVuZFJlY3RPcGVyYXRvciA8PCAiXG4iCisgICAgICAgICAgPDwga1NldE5vblplcm9XaW5kaW5nQ2xpcE9wZXJhdG9yIDw8ICJcbiIKKyAgICAgICAgICA8PCBrRW5kUGF0aE5vRmlsbE9yU3Ryb2tlT3BlcmF0b3IgPDwgIlxuIgorICAgICAgICAgIDw8IHNMaXN0LnN0cigpOworICB9CisgIFdyaXRlKCJOIiwKKyAgICAgICAgR2V0QmFja2dyb3VuZEFwcFN0cmVhbSgpICsgR2V0Qm9yZGVyQXBwU3RyZWFtKCkgKyBCeXRlU3RyaW5nKHNCb2R5KSwKKyAgICAgICAgIiIpOworfQorCit2b2lkIENQV0xfQXBwU3RyZWFtOjpTZXRBc1RleHRGaWVsZChjb25zdCBXaWRlU3RyaW5nKiBzVmFsdWUpIHsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcENvbnRyb2wgPSB3aWRnZXRfLT5HZXRGb3JtQ29udHJvbCgpOworICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gcENvbnRyb2wtPkdldEZpZWxkKCk7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzQm9keTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNMaW5lczsKKworICBhdXRvIHBFZGl0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQV0xfRWRpdEltcGw+KCk7CisgIHBFZGl0LT5FbmFibGVSZWZyZXNoKGZhbHNlKTsKKworICBDQkFfRm9udE1hcCBmb250X21hcCgKKyAgICAgIHdpZGdldF8uR2V0KCksCisgICAgICB3aWRnZXRfLT5HZXRJbnRlckZvcm0oKS0+R2V0Rm9ybUZpbGxFbnYoKS0+R2V0U3lzSGFuZGxlcigpKTsKKyAgcEVkaXQtPlNldEZvbnRNYXAoJmZvbnRfbWFwKTsKKworICBDRlhfRmxvYXRSZWN0IHJjQ2xpZW50ID0gd2lkZ2V0Xy0+R2V0Q2xpZW50UmVjdCgpOworICBwRWRpdC0+U2V0UGxhdGVSZWN0KHJjQ2xpZW50KTsKKyAgcEVkaXQtPlNldEFsaWdubWVudEgocENvbnRyb2wtPkdldENvbnRyb2xBbGlnbm1lbnQoKSwgdHJ1ZSk7CisKKyAgdWludDMyX3QgZHdGaWVsZEZsYWdzID0gcEZpZWxkLT5HZXRGaWVsZEZsYWdzKCk7CisgIGJvb2wgYk11bHRpTGluZSA9IChkd0ZpZWxkRmxhZ3MgPj4gMTIpICYgMTsKKyAgaWYgKGJNdWx0aUxpbmUpIHsKKyAgICBwRWRpdC0+U2V0TXVsdGlMaW5lKHRydWUsIHRydWUpOworICAgIHBFZGl0LT5TZXRBdXRvUmV0dXJuKHRydWUsIHRydWUpOworICB9IGVsc2UgeworICAgIHBFZGl0LT5TZXRBbGlnbm1lbnRWKDEsIHRydWUpOworICB9CisKKyAgdWludDE2X3Qgc3ViV29yZCA9IDA7CisgIGlmICgoZHdGaWVsZEZsYWdzID4+IDEzKSAmIDEpIHsKKyAgICBzdWJXb3JkID0gJyonOworICAgIHBFZGl0LT5TZXRQYXNzd29yZENoYXIoc3ViV29yZCwgdHJ1ZSk7CisgIH0KKworICBpbnQgbk1heExlbiA9IHBGaWVsZC0+R2V0TWF4TGVuKCk7CisgIGJvb2wgYkNoYXJBcnJheSA9IChkd0ZpZWxkRmxhZ3MgPj4gMjQpICYgMTsKKyAgZmxvYXQgZkZvbnRTaXplID0gd2lkZ2V0Xy0+R2V0Rm9udFNpemUoKTsKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIFdpZGVTdHJpbmcgc1ZhbHVlVG1wOworICBpZiAoIXNWYWx1ZSAmJiB3aWRnZXRfLT5HZXRNaXhYRkFXaWRnZXQoKSkgeworICAgIHNWYWx1ZVRtcCA9IHdpZGdldF8tPkdldFZhbHVlKHRydWUpOworICAgIHNWYWx1ZSA9ICZzVmFsdWVUbXA7CisgIH0KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworICBpZiAobk1heExlbiA+IDApIHsKKyAgICBpZiAoYkNoYXJBcnJheSkgeworICAgICAgcEVkaXQtPlNldENoYXJBcnJheShuTWF4TGVuKTsKKworICAgICAgaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpIHsKKyAgICAgICAgZkZvbnRTaXplID0gQ1BXTF9FZGl0OjpHZXRDaGFyQXJyYXlBdXRvRm9udFNpemUoZm9udF9tYXAuR2V0UERGRm9udCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQsIG5NYXhMZW4pOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoc1ZhbHVlKQorICAgICAgICBuTWF4TGVuID0gc1ZhbHVlLT5HZXRMZW5ndGgoKTsKKyAgICAgIHBFZGl0LT5TZXRMaW1pdENoYXIobk1heExlbik7CisgICAgfQorICB9CisKKyAgaWYgKElzRmxvYXRaZXJvKGZGb250U2l6ZSkpCisgICAgcEVkaXQtPlNldEF1dG9Gb250U2l6ZSh0cnVlLCB0cnVlKTsKKyAgZWxzZQorICAgIHBFZGl0LT5TZXRGb250U2l6ZShmRm9udFNpemUpOworCisgIHBFZGl0LT5Jbml0aWFsaXplKCk7CisgIHBFZGl0LT5TZXRUZXh0KHNWYWx1ZSA/ICpzVmFsdWUgOiBwRmllbGQtPkdldFZhbHVlKCkpOworCisgIENGWF9GbG9hdFJlY3QgcmNDb250ZW50ID0gcEVkaXQtPkdldENvbnRlbnRSZWN0KCk7CisgIEJ5dGVTdHJpbmcgc0VkaXQgPQorICAgICAgR2V0RWRpdEFwcFN0cmVhbShwRWRpdC5nZXQoKSwgQ0ZYX1BvaW50RigpLCAhYkNoYXJBcnJheSwgc3ViV29yZCk7CisKKyAgaWYgKHNFZGl0LkdldExlbmd0aCgpID4gMCkgeworICAgIHNCb2R5IDw8ICIvVHggIjsKKyAgICBBdXRvQ2xvc2VkQ29tbWFuZCBibWMoJnNCb2R5LCBrTWFya2VkU2VxdWVuY2VCZWdpbk9wZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBrTWFya2VkU2VxdWVuY2VFbmRPcGVyYXRvcik7CisgICAgQXV0b0Nsb3NlZFFDb21tYW5kIHEoJnNCb2R5KTsKKworICAgIGlmIChyY0NvbnRlbnQuV2lkdGgoKSA+IHJjQ2xpZW50LldpZHRoKCkgfHwKKyAgICAgICAgcmNDb250ZW50LkhlaWdodCgpID4gcmNDbGllbnQuSGVpZ2h0KCkpIHsKKyAgICAgIHNCb2R5IDw8IHJjQ2xpZW50LmxlZnQgPDwgIiAiIDw8IHJjQ2xpZW50LmJvdHRvbSA8PCAiICIKKyAgICAgICAgICAgIDw8IHJjQ2xpZW50LldpZHRoKCkgPDwgIiAiIDw8IHJjQ2xpZW50LkhlaWdodCgpIDw8ICIgIgorICAgICAgICAgICAgPDwga0FwcGVuZFJlY3RPcGVyYXRvciA8PCAiXG4iCisgICAgICAgICAgICA8PCBrU2V0Tm9uWmVyb1dpbmRpbmdDbGlwT3BlcmF0b3IgPDwgIlxuIgorICAgICAgICAgICAgPDwga0VuZFBhdGhOb0ZpbGxPclN0cm9rZU9wZXJhdG9yIDw8ICJcbiI7CisgICAgfQorICAgIENGWF9Db2xvciBjclRleHQgPSB3aWRnZXRfLT5HZXRUZXh0UFdMQ29sb3IoKTsKKworICAgIEF1dG9DbG9zZWRDb21tYW5kIGJ0KCZzQm9keSwga1RleHRCZWdpbk9wZXJhdG9yLCBrVGV4dEVuZE9wZXJhdG9yKTsKKyAgICBzQm9keSA8PCBHZXRDb2xvckFwcFN0cmVhbShjclRleHQsIHRydWUpIDw8IHNFZGl0OworICB9CisKKyAgaWYgKGJDaGFyQXJyYXkpIHsKKyAgICBzd2l0Y2ggKHdpZGdldF8tPkdldEJvcmRlclN0eWxlKCkpIHsKKyAgICAgIGNhc2UgQm9yZGVyU3R5bGU6OlNPTElEOiB7CisgICAgICAgIEJ5dGVTdHJpbmcgc0NvbG9yID0KKyAgICAgICAgICAgIEdldENvbG9yQXBwU3RyZWFtKHdpZGdldF8tPkdldEJvcmRlclBXTENvbG9yKCksIGZhbHNlKTsKKyAgICAgICAgaWYgKHNDb2xvci5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICBBdXRvQ2xvc2VkUUNvbW1hbmQgcSgmc0xpbmVzKTsKKyAgICAgICAgICBzTGluZXMgPDwgd2lkZ2V0Xy0+R2V0Qm9yZGVyV2lkdGgoKSA8PCAiICIgPDwga1NldExpbmVXaWR0aE9wZXJhdG9yCisgICAgICAgICAgICAgICAgIDw8ICJcbiIKKyAgICAgICAgICAgICAgICAgPDwgR2V0Q29sb3JBcHBTdHJlYW0od2lkZ2V0Xy0+R2V0Qm9yZGVyUFdMQ29sb3IoKSwgZmFsc2UpCisgICAgICAgICAgICAgICAgIDw8ICIgMiAiIDw8IGtTZXRMaW5lQ2FwU3R5bGVPcGVyYXRvciA8PCAiIDAgIgorICAgICAgICAgICAgICAgICA8PCBrU2V0TGluZUpvaW5TdHlsZU9wZXJhdG9yIDw8ICJcbiI7CisKKyAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBuTWF4TGVuOyArK2kpIHsKKyAgICAgICAgICAgIHNMaW5lcyA8PCByY0NsaWVudC5sZWZ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpIC8gbk1heExlbikgKiBpCisgICAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IHJjQ2xpZW50LmJvdHRvbSA8PCAiICIgPDwga01vdmVUb09wZXJhdG9yIDw8ICJcbiIKKyAgICAgICAgICAgICAgICAgICA8PCByY0NsaWVudC5sZWZ0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpIC8gbk1heExlbikgKiBpCisgICAgICAgICAgICAgICAgICAgPDwgIiAiIDw8IHJjQ2xpZW50LnRvcCA8PCAiICIgPDwga0xpbmVUb09wZXJhdG9yIDw8ICIgIgorICAgICAgICAgICAgICAgICAgIDw8IGtTdHJva2VPcGVyYXRvciA8PCAiXG4iOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgQm9yZGVyU3R5bGU6OkRBU0g6IHsKKyAgICAgICAgQnl0ZVN0cmluZyBzQ29sb3IgPQorICAgICAgICAgICAgR2V0Q29sb3JBcHBTdHJlYW0od2lkZ2V0Xy0+R2V0Qm9yZGVyUFdMQ29sb3IoKSwgZmFsc2UpOworICAgICAgICBpZiAoc0NvbG9yLkdldExlbmd0aCgpID4gMCkgeworICAgICAgICAgIENQV0xfRGFzaCBkc0JvcmRlciA9IENQV0xfRGFzaCgzLCAzLCAwKTsKKyAgICAgICAgICBBdXRvQ2xvc2VkUUNvbW1hbmQgcSgmc0xpbmVzKTsKKyAgICAgICAgICBzTGluZXMgPDwgd2lkZ2V0Xy0+R2V0Qm9yZGVyV2lkdGgoKSA8PCAiICIgPDwga1NldExpbmVXaWR0aE9wZXJhdG9yCisgICAgICAgICAgICAgICAgIDw8ICJcbiIKKyAgICAgICAgICAgICAgICAgPDwgR2V0Q29sb3JBcHBTdHJlYW0od2lkZ2V0Xy0+R2V0Qm9yZGVyUFdMQ29sb3IoKSwgZmFsc2UpCisgICAgICAgICAgICAgICAgIDw8ICJbIiA8PCBkc0JvcmRlci5uRGFzaCA8PCAiICIgPDwgZHNCb3JkZXIubkdhcCA8PCAiXSAiCisgICAgICAgICAgICAgICAgIDw8IGRzQm9yZGVyLm5QaGFzZSA8PCAiICIgPDwga1NldERhc2hPcGVyYXRvciA8PCAiXG4iOworCisgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgbk1heExlbjsgKytpKSB7CisgICAgICAgICAgICBzTGluZXMgPDwgcmNDbGllbnQubGVmdCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KSAvIG5NYXhMZW4pICogaQorICAgICAgICAgICAgICAgICAgIDw8ICIgIiA8PCByY0NsaWVudC5ib3R0b20gPDwgIiAiIDw8IGtNb3ZlVG9PcGVyYXRvciA8PCAiXG4iCisgICAgICAgICAgICAgICAgICAgPDwgcmNDbGllbnQubGVmdCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KSAvIG5NYXhMZW4pICogaQorICAgICAgICAgICAgICAgICAgIDw8ICIgIiA8PCByY0NsaWVudC50b3AgPDwgIiAiIDw8IGtMaW5lVG9PcGVyYXRvciA8PCAiICIKKyAgICAgICAgICAgICAgICAgICA8PCBrU3Ryb2tlT3BlcmF0b3IgPDwgIlxuIjsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBXcml0ZSgiTiIsCisgICAgICAgIEdldEJhY2tncm91bmRBcHBTdHJlYW0oKSArIEdldEJvcmRlckFwcFN0cmVhbSgpICsgQnl0ZVN0cmluZyhzTGluZXMpICsKKyAgICAgICAgICAgIEJ5dGVTdHJpbmcoc0JvZHkpLAorICAgICAgICAiIik7Cit9CisKK3ZvaWQgQ1BXTF9BcHBTdHJlYW06OkFkZEltYWdlKGNvbnN0IEJ5dGVTdHJpbmcmIHNBUFR5cGUsIENQREZfU3RyZWFtKiBwSW1hZ2UpIHsKKyAgQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBkaWN0Xy0+R2V0U3RyZWFtRm9yKHNBUFR5cGUpOworICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1EaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOworICBCeXRlU3RyaW5nIHNJbWFnZUFsaWFzID0gIklNRyI7CisKKyAgaWYgKENQREZfRGljdGlvbmFyeSogcEltYWdlRGljdCA9IHBJbWFnZS0+R2V0RGljdCgpKSB7CisgICAgc0ltYWdlQWxpYXMgPSBwSW1hZ2VEaWN0LT5HZXRTdHJpbmdGb3IoIk5hbWUiKTsKKyAgICBpZiAoc0ltYWdlQWxpYXMuSXNFbXB0eSgpKQorICAgICAgc0ltYWdlQWxpYXMgPSAiSU1HIjsKKyAgfQorCisgIENQREZfRGljdGlvbmFyeSogcFN0cmVhbVJlc0xpc3QgPSBwU3RyZWFtRGljdC0+R2V0RGljdEZvcigiUmVzb3VyY2VzIik7CisgIGlmICghcFN0cmVhbVJlc0xpc3QpCisgICAgcFN0cmVhbVJlc0xpc3QgPSBwU3RyZWFtRGljdC0+U2V0TmV3Rm9yPENQREZfRGljdGlvbmFyeT4oIlJlc291cmNlcyIpOworCisgIENQREZfRGljdGlvbmFyeSogcFhPYmplY3QgPQorICAgICAgcFN0cmVhbVJlc0xpc3QtPlNldE5ld0ZvcjxDUERGX0RpY3Rpb25hcnk+KCJYT2JqZWN0Iik7CisgIHBYT2JqZWN0LT5TZXROZXdGb3I8Q1BERl9SZWZlcmVuY2U+KHNJbWFnZUFsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXRfLT5HZXRQYWdlVmlldygpLT5HZXRQREZEb2N1bWVudCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW1hZ2UtPkdldE9iak51bSgpKTsKK30KKwordm9pZCBDUFdMX0FwcFN0cmVhbTo6V3JpdGUoY29uc3QgQnl0ZVN0cmluZyYgc0FQVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIHNDb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIHNBUFN0YXRlKSB7CisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gbnVsbHB0cjsKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFyZW50RGljdCA9IG51bGxwdHI7CisgIGlmIChzQVBTdGF0ZS5Jc0VtcHR5KCkpIHsKKyAgICBwUGFyZW50RGljdCA9IGRpY3RfLkdldCgpOworICAgIHBTdHJlYW0gPSBkaWN0Xy0+R2V0U3RyZWFtRm9yKHNBUFR5cGUpOworICB9IGVsc2UgeworICAgIENQREZfRGljdGlvbmFyeSogcEFQVHlwZURpY3QgPSBkaWN0Xy0+R2V0RGljdEZvcihzQVBUeXBlKTsKKyAgICBpZiAoIXBBUFR5cGVEaWN0KQorICAgICAgcEFQVHlwZURpY3QgPSBkaWN0Xy0+U2V0TmV3Rm9yPENQREZfRGljdGlvbmFyeT4oc0FQVHlwZSk7CisKKyAgICBwUGFyZW50RGljdCA9IHBBUFR5cGVEaWN0OworICAgIHBTdHJlYW0gPSBwQVBUeXBlRGljdC0+R2V0U3RyZWFtRm9yKHNBUFN0YXRlKTsKKyAgfQorCisgIGlmICghcFN0cmVhbSkgeworICAgIENQREZfRG9jdW1lbnQqIGRvYyA9IHdpZGdldF8tPkdldFBhZ2VWaWV3KCktPkdldFBERkRvY3VtZW50KCk7CisgICAgcFN0cmVhbSA9IGRvYy0+TmV3SW5kaXJlY3Q8Q1BERl9TdHJlYW0+KCk7CisgICAgcFBhcmVudERpY3QtPlNldE5ld0ZvcjxDUERGX1JlZmVyZW5jZT4oc0FQVHlwZSwgZG9jLCBwU3RyZWFtLT5HZXRPYmpOdW0oKSk7CisgIH0KKworICBDUERGX0RpY3Rpb25hcnkqIHBTdHJlYW1EaWN0ID0gcFN0cmVhbS0+R2V0RGljdCgpOworICBpZiAoIXBTdHJlYW1EaWN0KSB7CisgICAgYXV0byBwTmV3RGljdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KAorICAgICAgICB3aWRnZXRfLT5HZXRQREZBbm5vdCgpLT5HZXREb2N1bWVudCgpLT5HZXRCeXRlU3RyaW5nUG9vbCgpKTsKKyAgICBwU3RyZWFtRGljdCA9IHBOZXdEaWN0LmdldCgpOworICAgIHBTdHJlYW1EaWN0LT5TZXROZXdGb3I8Q1BERl9OYW1lPigiVHlwZSIsICJYT2JqZWN0Iik7CisgICAgcFN0cmVhbURpY3QtPlNldE5ld0ZvcjxDUERGX05hbWU+KCJTdWJ0eXBlIiwgIkZvcm0iKTsKKyAgICBwU3RyZWFtRGljdC0+U2V0TmV3Rm9yPENQREZfTnVtYmVyPigiRm9ybVR5cGUiLCAxKTsKKyAgICBwU3RyZWFtLT5Jbml0U3RyZWFtKG51bGxwdHIsIDAsIHN0ZDo6bW92ZShwTmV3RGljdCkpOworICB9CisgIHBTdHJlYW1EaWN0LT5TZXRNYXRyaXhGb3IoIk1hdHJpeCIsIHdpZGdldF8tPkdldE1hdHJpeCgpKTsKKyAgcFN0cmVhbURpY3QtPlNldFJlY3RGb3IoIkJCb3giLCB3aWRnZXRfLT5HZXRSb3RhdGVkUmVjdCgpKTsKKyAgcFN0cmVhbS0+U2V0RGF0YUFuZFJlbW92ZUZpbHRlcigodWludDhfdCopKHNDb250ZW50cy5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQ29udGVudHMuR2V0TGVuZ3RoKCkpOworfQorCit2b2lkIENQV0xfQXBwU3RyZWFtOjpSZW1vdmUoY29uc3QgQnl0ZVN0cmluZyYgc0FQVHlwZSkgeworICBkaWN0Xy0+UmVtb3ZlRm9yKHNBUFR5cGUpOworfQorCitCeXRlU3RyaW5nIENQV0xfQXBwU3RyZWFtOjpHZXRCYWNrZ3JvdW5kQXBwU3RyZWFtKCkgY29uc3QgeworICBDRlhfQ29sb3IgY3JCYWNrZ3JvdW5kID0gd2lkZ2V0Xy0+R2V0RmlsbFBXTENvbG9yKCk7CisgIGlmIChjckJhY2tncm91bmQubkNvbG9yVHlwZSAhPSBDRlhfQ29sb3I6OmtUcmFuc3BhcmVudCkKKyAgICByZXR1cm4gR2V0UmVjdEZpbGxBcHBTdHJlYW0od2lkZ2V0Xy0+R2V0Um90YXRlZFJlY3QoKSwgY3JCYWNrZ3JvdW5kKTsKKworICByZXR1cm4gQnl0ZVN0cmluZygpOworfQorCitCeXRlU3RyaW5nIENQV0xfQXBwU3RyZWFtOjpHZXRCb3JkZXJBcHBTdHJlYW0oKSBjb25zdCB7CisgIENGWF9GbG9hdFJlY3QgcmNXaW5kb3cgPSB3aWRnZXRfLT5HZXRSb3RhdGVkUmVjdCgpOworICBDRlhfQ29sb3IgY3JCb3JkZXIgPSB3aWRnZXRfLT5HZXRCb3JkZXJQV0xDb2xvcigpOworICBDRlhfQ29sb3IgY3JCYWNrZ3JvdW5kID0gd2lkZ2V0Xy0+R2V0RmlsbFBXTENvbG9yKCk7CisgIENGWF9Db2xvciBjckxlZnRUb3A7CisgIENGWF9Db2xvciBjclJpZ2h0Qm90dG9tOworCisgIGZsb2F0IGZCb3JkZXJXaWR0aCA9IHN0YXRpY19jYXN0PGZsb2F0Pih3aWRnZXRfLT5HZXRCb3JkZXJXaWR0aCgpKTsKKyAgQ1BXTF9EYXNoIGRzQm9yZGVyKDMsIDAsIDApOworCisgIEJvcmRlclN0eWxlIG5Cb3JkZXJTdHlsZSA9IHdpZGdldF8tPkdldEJvcmRlclN0eWxlKCk7CisgIHN3aXRjaCAobkJvcmRlclN0eWxlKSB7CisgICAgY2FzZSBCb3JkZXJTdHlsZTo6REFTSDoKKyAgICAgIGRzQm9yZGVyID0gQ1BXTF9EYXNoKDMsIDMsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCb3JkZXJTdHlsZTo6QkVWRUxFRDoKKyAgICAgIGZCb3JkZXJXaWR0aCAqPSAyOworICAgICAgY3JMZWZ0VG9wID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIDEpOworICAgICAgY3JSaWdodEJvdHRvbSA9IGNyQmFja2dyb3VuZCAvIDIuMGY7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJvcmRlclN0eWxlOjpJTlNFVDoKKyAgICAgIGZCb3JkZXJXaWR0aCAqPSAyOworICAgICAgY3JMZWZ0VG9wID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIDAuNSk7CisgICAgICBjclJpZ2h0Qm90dG9tID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIDAuNzUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIEdldEJvcmRlckFwcFN0cmVhbUludGVybmFsKHJjV2luZG93LCBmQm9yZGVyV2lkdGgsIGNyQm9yZGVyLCBjckxlZnRUb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjclJpZ2h0Qm90dG9tLCBuQm9yZGVyU3R5bGUsIGRzQm9yZGVyKTsKK30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcHdsL2Nwd2xfYXBwc3RyZWFtLmggYi9mcGRmc2RrL3B3bC9jcHdsX2FwcHN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMGU3OWMKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL3B3bC9jcHdsX2FwcHN0cmVhbS5oCkBAIC0wLDAgKzEsNDMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGUERGU0RLX1BXTF9DUFdMX0FQUFNUUkVBTV9IXworI2RlZmluZSBGUERGU0RLX1BXTF9DUFdMX0FQUFNUUkVBTV9IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisKK2NsYXNzIENQREZTREtfV2lkZ2V0OworY2xhc3MgQ1BERl9EaWN0aW9uYXJ5OworY2xhc3MgQ1BERl9TdHJlYW07CisKK2NsYXNzIENQV0xfQXBwU3RyZWFtIHsKKyBwdWJsaWM6CisgIENQV0xfQXBwU3RyZWFtKENQREZTREtfV2lkZ2V0KiB3aWRnZXQsIENQREZfRGljdGlvbmFyeSogZGljdCk7CisgIH5DUFdMX0FwcFN0cmVhbSgpOworCisgIHZvaWQgU2V0QXNQdXNoQnV0dG9uKCk7CisgIHZvaWQgU2V0QXNDaGVja0JveCgpOworICB2b2lkIFNldEFzUmFkaW9CdXR0b24oKTsKKyAgdm9pZCBTZXRBc0NvbWJvQm94KGNvbnN0IFdpZGVTdHJpbmcqIHNWYWx1ZSk7CisgIHZvaWQgU2V0QXNMaXN0Qm94KCk7CisgIHZvaWQgU2V0QXNUZXh0RmllbGQoY29uc3QgV2lkZVN0cmluZyogc1ZhbHVlKTsKKworIHByaXZhdGU6CisgIHZvaWQgQWRkSW1hZ2UoY29uc3QgQnl0ZVN0cmluZyYgc0FQVHlwZSwgQ1BERl9TdHJlYW0qIHBJbWFnZSk7CisgIHZvaWQgV3JpdGUoY29uc3QgQnl0ZVN0cmluZyYgc0FQVHlwZSwKKyAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBzQ29udGVudHMsCisgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgc0FQU3RhdGUpOworICB2b2lkIFJlbW92ZShjb25zdCBCeXRlU3RyaW5nJiBzQVBUeXBlKTsKKworICBCeXRlU3RyaW5nIEdldEJhY2tncm91bmRBcHBTdHJlYW0oKSBjb25zdDsKKyAgQnl0ZVN0cmluZyBHZXRCb3JkZXJBcHBTdHJlYW0oKSBjb25zdDsKKworICBVbm93bmVkUHRyPENQREZTREtfV2lkZ2V0PiB3aWRnZXRfOworICBVbm93bmVkUHRyPENQREZfRGljdGlvbmFyeT4gZGljdF87Cit9OworCisjZW5kaWYgIC8vIEZQREZTREtfUFdMX0NQV0xfQVBQU1RSRUFNX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3B3bC9jcHdsX2J1dHRvbi5jcHAgYi9mcGRmc2RrL3B3bC9jcHdsX2J1dHRvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMwNmE5OAotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvcHdsL2Nwd2xfYnV0dG9uLmNwcApAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX2J1dHRvbi5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfd25kLmgiCisKK0NQV0xfQnV0dG9uOjpDUFdMX0J1dHRvbigpIDogbV9iTW91c2VEb3duKGZhbHNlKSB7fQorCitDUFdMX0J1dHRvbjo6fkNQV0xfQnV0dG9uKCkge30KKworQnl0ZVN0cmluZyBDUFdMX0J1dHRvbjo6R2V0Q2xhc3NOYW1lKCkgY29uc3QgeworICByZXR1cm4gIkNQV0xfQnV0dG9uIjsKK30KKwordm9pZCBDUFdMX0J1dHRvbjo6T25DcmVhdGUoQ3JlYXRlUGFyYW1zKiBwUGFyYW1zVG9BZGp1c3QpIHsKKyAgcFBhcmFtc1RvQWRqdXN0LT5lQ3Vyc29yVHlwZSA9IEZYQ1RfSEFORDsKK30KKworYm9vbCBDUFdMX0J1dHRvbjo6T25MQnV0dG9uRG93bihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIHsKKyAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvbkRvd24ocG9pbnQsIG5GbGFnKTsKKyAgbV9iTW91c2VEb3duID0gdHJ1ZTsKKyAgU2V0Q2FwdHVyZSgpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDUFdMX0J1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSB7CisgIENQV0xfV25kOjpPbkxCdXR0b25VcChwb2ludCwgbkZsYWcpOworICBSZWxlYXNlQ2FwdHVyZSgpOworICBtX2JNb3VzZURvd24gPSBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3B3bC9jcHdsX2J1dHRvbi5oIGIvZnBkZnNkay9wd2wvY3B3bF9idXR0b24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGY1ZWYxCi0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9wd2wvY3B3bF9idXR0b24uaApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlBERlNES19QV0xfQ1BXTF9CVVRUT05fSF8KKyNkZWZpbmUgRlBERlNES19QV0xfQ1BXTF9CVVRUT05fSF8KKworI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfd25kLmgiCisKK2NsYXNzIENQV0xfQnV0dG9uIDogcHVibGljIENQV0xfV25kIHsKKyBwdWJsaWM6CisgIENQV0xfQnV0dG9uKCk7CisgIH5DUFdMX0J1dHRvbigpIG92ZXJyaWRlOworCisgIC8vIENQV0xfV25kCisgIEJ5dGVTdHJpbmcgR2V0Q2xhc3NOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgT25DcmVhdGUoQ3JlYXRlUGFyYW1zKiBwUGFyYW1zVG9BZGp1c3QpIG92ZXJyaWRlOworICBib29sIE9uTEJ1dHRvbkRvd24oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKKyAgYm9vbCBPbkxCdXR0b25VcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICBib29sIG1fYk1vdXNlRG93bjsKK307CisKKyNlbmRpZiAgLy8gRlBERlNES19QV0xfQ1BXTF9CVVRUT05fSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcHdsL2Nwd2xfY2FyZXQuY3BwIGIvZnBkZnNkay9wd2wvY3B3bF9jYXJldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdhNzY4YQotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvcHdsL2Nwd2xfY2FyZXQuY3BwCkBAIC0wLDAgKzEsMTM0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX2NhcmV0LmgiCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9ncmFwaHN0YXRlZGF0YS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcGF0aGRhdGEuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfd25kLmgiCisKKyNkZWZpbmUgUFdMX0NBUkVUX0ZMQVNISU5URVJWQUwgNTAwCisKK0NQV0xfQ2FyZXQ6OkNQV0xfQ2FyZXQoKSA6IG1fYkZsYXNoKGZhbHNlKSwgbV9mV2lkdGgoMC40ZiksIG1fbkRlbGF5KDApIHt9CisKK0NQV0xfQ2FyZXQ6On5DUFdMX0NhcmV0KCkge30KKworQnl0ZVN0cmluZyBDUFdMX0NhcmV0OjpHZXRDbGFzc05hbWUoKSBjb25zdCB7CisgIHJldHVybiAiQ1BXTF9DYXJldCI7Cit9CisKK3ZvaWQgQ1BXTF9DYXJldDo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtdFVzZXIyRGV2aWNlKSB7CisgIGlmICghSXNWaXNpYmxlKCkgfHwgIW1fYkZsYXNoKQorICAgIHJldHVybjsKKworICBDRlhfRmxvYXRSZWN0IHJjUmVjdCA9IEdldENhcmV0UmVjdCgpOworICBDRlhfRmxvYXRSZWN0IHJjQ2xpcCA9IEdldENsaXBSZWN0KCk7CisgIENGWF9QYXRoRGF0YSBwYXRoOworCisgIGZsb2F0IGZDYXJldFggPSByY1JlY3QubGVmdCArIG1fZldpZHRoICogMC41ZjsKKyAgZmxvYXQgZkNhcmV0VG9wID0gcmNSZWN0LnRvcDsKKyAgZmxvYXQgZkNhcmV0Qm90dG9tID0gcmNSZWN0LmJvdHRvbTsKKyAgaWYgKCFyY0NsaXAuSXNFbXB0eSgpKSB7CisgICAgcmNSZWN0LkludGVyc2VjdChyY0NsaXApOworICAgIGlmIChyY1JlY3QuSXNFbXB0eSgpKQorICAgICAgcmV0dXJuOworCisgICAgZkNhcmV0VG9wID0gcmNSZWN0LnRvcDsKKyAgICBmQ2FyZXRCb3R0b20gPSByY1JlY3QuYm90dG9tOworICB9CisKKyAgcGF0aC5BcHBlbmRQb2ludChDRlhfUG9pbnRGKGZDYXJldFgsIGZDYXJldEJvdHRvbSksIEZYUFRfVFlQRTo6TW92ZVRvLCBmYWxzZSk7CisgIHBhdGguQXBwZW5kUG9pbnQoQ0ZYX1BvaW50RihmQ2FyZXRYLCBmQ2FyZXRUb3ApLCBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOworCisgIENGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7CisgIGdzZC5tX0xpbmVXaWR0aCA9IG1fZldpZHRoOworICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgJm10VXNlcjJEZXZpY2UsICZnc2QsIDAsIEFyZ2JFbmNvZGUoMjU1LCAwLCAwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgRlhGSUxMX0FMVEVSTkFURSk7Cit9CisKK3ZvaWQgQ1BXTF9DYXJldDo6VGltZXJQcm9jKCkgeworICBpZiAobV9uRGVsYXkgPiAwKSB7CisgICAgLS1tX25EZWxheTsKKyAgICByZXR1cm47CisgIH0KKworICBtX2JGbGFzaCA9ICFtX2JGbGFzaDsKKyAgSW52YWxpZGF0ZVJlY3QobnVsbHB0cik7CisgIC8vIE5vdGUsIHx0aGlzfCBtYXkgbm8gbG9uZ2VyIGJlIHZpYWJsZSBhdCB0aGlzIHBvaW50LiBJZiBtb3JlIHdvcmsgbmVlZHMKKyAgLy8gdG8gYmUgZG9uZSwgYWRkIGFuIG9ic2VydmVyLgorfQorCitDRlhfRmxvYXRSZWN0IENQV0xfQ2FyZXQ6OkdldENhcmV0UmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIENGWF9GbG9hdFJlY3QobV9wdEZvb3QueCwgbV9wdEZvb3QueSwgbV9wdEhlYWQueCArIG1fZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBtX3B0SGVhZC55KTsKK30KKwordm9pZCBDUFdMX0NhcmV0OjpTZXRDYXJldChib29sIGJWaXNpYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdEhlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0Rm9vdCkgeworICBpZiAoIWJWaXNpYmxlKSB7CisgICAgbV9wdEhlYWQgPSBDRlhfUG9pbnRGKCk7CisgICAgbV9wdEZvb3QgPSBDRlhfUG9pbnRGKCk7CisgICAgbV9iRmxhc2ggPSBmYWxzZTsKKyAgICBpZiAoIUlzVmlzaWJsZSgpKQorICAgICAgcmV0dXJuOworCisgICAgRW5kVGltZXIoKTsKKyAgICBDUFdMX1duZDo6U2V0VmlzaWJsZShmYWxzZSk7CisgICAgLy8gTm90ZSwgfHRoaXN8IG1heSBubyBsb25nZXIgYmUgdmlhYmxlIGF0IHRoaXMgcG9pbnQuIElmIG1vcmUgd29yayBuZWVkcworICAgIC8vIHRvIGJlIGRvbmUsIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgU2V0VmlzaWJsZSgpLgorICAgIHJldHVybjsKKyAgfQorCisgIGlmICghSXNWaXNpYmxlKCkpIHsKKyAgICBtX3B0SGVhZCA9IHB0SGVhZDsKKyAgICBtX3B0Rm9vdCA9IHB0Rm9vdDsKKyAgICBFbmRUaW1lcigpOworICAgIEJlZ2luVGltZXIoUFdMX0NBUkVUX0ZMQVNISU5URVJWQUwpOworCisgICAgaWYgKCFDUFdMX1duZDo6U2V0VmlzaWJsZSh0cnVlKSkKKyAgICAgIHJldHVybjsKKworICAgIG1fYkZsYXNoID0gdHJ1ZTsKKyAgICBNb3ZlKG1fcmNJbnZhbGlkLCBmYWxzZSwgdHJ1ZSk7CisgICAgLy8gTm90ZSwgfHRoaXN8IG1heSBubyBsb25nZXIgYmUgdmlhYmxlIGF0IHRoaXMgcG9pbnQuIElmIG1vcmUgd29yayBuZWVkcworICAgIC8vIHRvIGJlIGRvbmUsIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgTW92ZSgpLgorICAgIHJldHVybjsKKyAgfQorCisgIGlmIChtX3B0SGVhZCA9PSBwdEhlYWQgJiYgbV9wdEZvb3QgPT0gcHRGb290KQorICAgIHJldHVybjsKKworICBtX3B0SGVhZCA9IHB0SGVhZDsKKyAgbV9wdEZvb3QgPSBwdEZvb3Q7CisgIG1fYkZsYXNoID0gdHJ1ZTsKKyAgTW92ZShtX3JjSW52YWxpZCwgZmFsc2UsIHRydWUpOworICAvLyBOb3RlLCB8dGhpc3wgbWF5IG5vIGxvbmdlciBiZSB2aWFibGUgYXQgdGhpcyBwb2ludC4gSWYgbW9yZSB3b3JrCisgIC8vIG5lZWRzIHRvIGJlIGRvbmUsIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgTW92ZSgpLgorfQorCitib29sIENQV0xfQ2FyZXQ6OkludmFsaWRhdGVSZWN0KENGWF9GbG9hdFJlY3QqIHBSZWN0KSB7CisgIGlmICghcFJlY3QpIHsKKyAgICByZXR1cm4gQ1BXTF9XbmQ6OkludmFsaWRhdGVSZWN0KG51bGxwdHIpOworICB9CisKKyAgQ0ZYX0Zsb2F0UmVjdCByY1JlZnJlc2ggPSAqcFJlY3Q7CisgIGlmICghcmNSZWZyZXNoLklzRW1wdHkoKSkgeworICAgIHJjUmVmcmVzaC5JbmZsYXRlKDAuNWYsIDAuNWYpOworICAgIHJjUmVmcmVzaC5Ob3JtYWxpemUoKTsKKyAgfQorICByY1JlZnJlc2gudG9wICs9IDE7CisgIHJjUmVmcmVzaC5ib3R0b20gLT0gMTsKKyAgcmV0dXJuIENQV0xfV25kOjpJbnZhbGlkYXRlUmVjdCgmcmNSZWZyZXNoKTsKK30KKworYm9vbCBDUFdMX0NhcmV0OjpTZXRWaXNpYmxlKGJvb2wgYlZpc2libGUpIHsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3B3bC9jcHdsX2NhcmV0LmggYi9mcGRmc2RrL3B3bC9jcHdsX2NhcmV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwYTk2NAotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvcHdsL2Nwd2xfY2FyZXQuaApAQCAtMCwwICsxLDQxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlBERlNES19QV0xfQ1BXTF9DQVJFVF9IXworI2RlZmluZSBGUERGU0RLX1BXTF9DUFdMX0NBUkVUX0hfCisKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX3duZC5oIgorCitjbGFzcyBDUFdMX0NhcmV0IDogcHVibGljIENQV0xfV25kIHsKKyBwdWJsaWM6CisgIENQV0xfQ2FyZXQoKTsKKyAgfkNQV0xfQ2FyZXQoKSBvdmVycmlkZTsKKworICAvLyBDUFdMX1duZAorICBCeXRlU3RyaW5nIEdldENsYXNzTmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIERyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtdFVzZXIyRGV2aWNlKSBvdmVycmlkZTsKKyAgYm9vbCBJbnZhbGlkYXRlUmVjdChDRlhfRmxvYXRSZWN0KiBwUmVjdCkgb3ZlcnJpZGU7CisgIGJvb2wgU2V0VmlzaWJsZShib29sIGJWaXNpYmxlKSBvdmVycmlkZTsKKyAgdm9pZCBUaW1lclByb2MoKSBvdmVycmlkZTsKKworICB2b2lkIFNldENhcmV0KGJvb2wgYlZpc2libGUsCisgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHRIZWFkLAorICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0Rm9vdCk7CisgIHZvaWQgU2V0SW52YWxpZFJlY3QoQ0ZYX0Zsb2F0UmVjdCByYykgeyBtX3JjSW52YWxpZCA9IHJjOyB9CisKKyBwcml2YXRlOgorICBDRlhfRmxvYXRSZWN0IEdldENhcmV0UmVjdCgpIGNvbnN0OworCisgIGJvb2wgbV9iRmxhc2g7CisgIENGWF9Qb2ludEYgbV9wdEhlYWQ7CisgIENGWF9Qb2ludEYgbV9wdEZvb3Q7CisgIGZsb2F0IG1fZldpZHRoOworICBpbnQzMl90IG1fbkRlbGF5OworICBDRlhfRmxvYXRSZWN0IG1fcmNJbnZhbGlkOworfTsKKworI2VuZGlmICAvLyBGUERGU0RLX1BXTF9DUFdMX0NBUkVUX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3B3bC9jcHdsX2NvbWJvX2JveC5jcHAgYi9mcGRmc2RrL3B3bC9jcHdsX2NvbWJvX2JveC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkYmViYwotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvcHdsL2Nwd2xfY29tYm9fYm94LmNwcApAQCAtMCwwICsxLDU4NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF9jb21ib19ib3guaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmgiCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF9lZGl0LmgiCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF9lZGl0X2N0cmwuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX2xpc3RfYm94LmgiCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF9saXN0X2ltcGwuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX3duZC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2Z3bGV2ZW50LmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBmbG9hdCBrQ29tYm9Cb3hEZWZhdWx0Rm9udFNpemUgPSAxMi4wZjsKK2NvbnN0ZXhwciBmbG9hdCBrQ29tYm9Cb3hUcmlhbmdsZUhhbGZMZW5ndGggPSAzLjBmOworY29uc3RleHByIGludCBrRGVmYXVsdEJ1dHRvbldpZHRoID0gMTM7CisKK30gIC8vIG5hbWVzcGFjZQorCitib29sIENQV0xfQ0JMaXN0Qm94OjpPbkxCdXR0b25VcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIHsKKyAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvblVwKHBvaW50LCBuRmxhZyk7CisKKyAgaWYgKCFtX2JNb3VzZURvd24pCisgICAgcmV0dXJuIHRydWU7CisKKyAgUmVsZWFzZUNhcHR1cmUoKTsKKyAgbV9iTW91c2VEb3duID0gZmFsc2U7CisKKyAgaWYgKCFDbGllbnRIaXRUZXN0KHBvaW50KSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKENQV0xfV25kKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpCisgICAgcFBhcmVudC0+Tm90aWZ5TEJ1dHRvblVwKHRoaXMsIHBvaW50KTsKKworICByZXR1cm4gIU9uTm90aWZ5U2VsZWN0aW9uQ2hhbmdlZChmYWxzZSwgbkZsYWcpOworfQorCitib29sIENQV0xfQ0JMaXN0Qm94OjpJc01vdmVtZW50S2V5KHVpbnQxNl90IG5DaGFyKSBjb25zdCB7CisgIHN3aXRjaCAobkNoYXIpIHsKKyAgICBjYXNlIEZXTF9WS0VZX1VwOgorICAgIGNhc2UgRldMX1ZLRVlfRG93bjoKKyAgICBjYXNlIEZXTF9WS0VZX0hvbWU6CisgICAgY2FzZSBGV0xfVktFWV9MZWZ0OgorICAgIGNhc2UgRldMX1ZLRVlfRW5kOgorICAgIGNhc2UgRldMX1ZLRVlfUmlnaHQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgQ1BXTF9DQkxpc3RCb3g6Ok9uTW92ZW1lbnRLZXlEb3duKHVpbnQxNl90IG5DaGFyLCB1aW50MzJfdCBuRmxhZykgeworICBBU1NFUlQoSXNNb3ZlbWVudEtleShuQ2hhcikpOworCisgIHN3aXRjaCAobkNoYXIpIHsKKyAgICBjYXNlIEZXTF9WS0VZX1VwOgorICAgICAgbV9wTGlzdC0+T25WS19VUChJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRldMX1ZLRVlfRG93bjoKKyAgICAgIG1fcExpc3QtPk9uVktfRE9XTihJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRldMX1ZLRVlfSG9tZToKKyAgICAgIG1fcExpc3QtPk9uVktfSE9NRShJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRldMX1ZLRVlfTGVmdDoKKyAgICAgIG1fcExpc3QtPk9uVktfTEVGVChJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRldMX1ZLRVlfRW5kOgorICAgICAgbV9wTGlzdC0+T25WS19FTkQoSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZXTF9WS0VZX1JpZ2h0OgorICAgICAgbV9wTGlzdC0+T25WS19SSUdIVChJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBPbk5vdGlmeVNlbGVjdGlvbkNoYW5nZWQodHJ1ZSwgbkZsYWcpOworfQorCitib29sIENQV0xfQ0JMaXN0Qm94OjpJc0NoYXIodWludDE2X3QgbkNoYXIsIHVpbnQzMl90IG5GbGFnKSBjb25zdCB7CisgIHJldHVybiBtX3BMaXN0LT5PbkNoYXIobkNoYXIsIElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworfQorCitib29sIENQV0xfQ0JMaXN0Qm94OjpPbkNoYXJOb3RpZnkodWludDE2X3QgbkNoYXIsIHVpbnQzMl90IG5GbGFnKSB7CisgIGlmIChDUFdMX0NvbWJvQm94KiBwQ29tYm9Cb3ggPSAoQ1BXTF9Db21ib0JveCopR2V0UGFyZW50V2luZG93KCkpCisgICAgcENvbWJvQm94LT5TZXRTZWxlY3RUZXh0KCk7CisKKyAgcmV0dXJuIE9uTm90aWZ5U2VsZWN0aW9uQ2hhbmdlZCh0cnVlLCBuRmxhZyk7Cit9CisKK3ZvaWQgQ1BXTF9DQkJ1dHRvbjo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtdFVzZXIyRGV2aWNlKSB7CisgIENQV0xfV25kOjpEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSwgbXRVc2VyMkRldmljZSk7CisKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0V25kID0gQ1BXTF9XbmQ6OkdldFdpbmRvd1JlY3QoKTsKKworICBpZiAoIUlzVmlzaWJsZSgpIHx8IHJlY3RXbmQuSXNFbXB0eSgpKQorICAgIHJldHVybjsKKworICBDRlhfUG9pbnRGIHB0Q2VudGVyID0gR2V0Q2VudGVyUG9pbnQoKTsKKworICBzdGF0aWMgY29uc3RleHByIGZsb2F0IGtDb21ib0JveFRyaWFuZ2xlUXVhcnRlckxlbmd0aCA9CisgICAgICBrQ29tYm9Cb3hUcmlhbmdsZUhhbGZMZW5ndGggKiAwLjU7CisgIENGWF9Qb2ludEYgcHQxKHB0Q2VudGVyLnggLSBrQ29tYm9Cb3hUcmlhbmdsZUhhbGZMZW5ndGgsCisgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgKyBrQ29tYm9Cb3hUcmlhbmdsZVF1YXJ0ZXJMZW5ndGgpOworICBDRlhfUG9pbnRGIHB0MihwdENlbnRlci54ICsga0NvbWJvQm94VHJpYW5nbGVIYWxmTGVuZ3RoLAorICAgICAgICAgICAgICAgICBwdENlbnRlci55ICsga0NvbWJvQm94VHJpYW5nbGVRdWFydGVyTGVuZ3RoKTsKKyAgQ0ZYX1BvaW50RiBwdDMocHRDZW50ZXIueCwgcHRDZW50ZXIueSAtIGtDb21ib0JveFRyaWFuZ2xlUXVhcnRlckxlbmd0aCk7CisKKyAgaWYgKElzRmxvYXRCaWdnZXIocmVjdFduZC5yaWdodCAtIHJlY3RXbmQubGVmdCwKKyAgICAgICAgICAgICAgICAgICAga0NvbWJvQm94VHJpYW5nbGVIYWxmTGVuZ3RoICogMikgJiYKKyAgICAgIElzRmxvYXRCaWdnZXIocmVjdFduZC50b3AgLSByZWN0V25kLmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAga0NvbWJvQm94VHJpYW5nbGVIYWxmTGVuZ3RoKSkgeworICAgIENGWF9QYXRoRGF0YSBwYXRoOworICAgIHBhdGguQXBwZW5kUG9pbnQocHQxLCBGWFBUX1RZUEU6Ok1vdmVUbywgZmFsc2UpOworICAgIHBhdGguQXBwZW5kUG9pbnQocHQyLCBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOworICAgIHBhdGguQXBwZW5kUG9pbnQocHQzLCBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOworICAgIHBhdGguQXBwZW5kUG9pbnQocHQxLCBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOworCisgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGgsICZtdFVzZXIyRGV2aWNlLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgIFBXTF9ERUZBVUxUX0JMQUNLQ09MT1IuVG9GWENvbG9yKEdldFRyYW5zcGFyZW5jeSgpKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfQUxURVJOQVRFKTsKKyAgfQorfQorCitib29sIENQV0xfQ0JCdXR0b246Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSB7CisgIENQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LCBuRmxhZyk7CisKKyAgU2V0Q2FwdHVyZSgpOworCisgIGlmIChDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpKQorICAgIHBQYXJlbnQtPk5vdGlmeUxCdXR0b25Eb3duKHRoaXMsIHBvaW50KTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDUFdMX0NCQnV0dG9uOjpPbkxCdXR0b25VcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIHsKKyAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvblVwKHBvaW50LCBuRmxhZyk7CisKKyAgUmVsZWFzZUNhcHR1cmUoKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworQ1BXTF9Db21ib0JveDo6Q1BXTF9Db21ib0JveCgpIHt9CisKK0NQV0xfQ29tYm9Cb3g6On5DUFdMX0NvbWJvQm94KCkge30KKworQnl0ZVN0cmluZyBDUFdMX0NvbWJvQm94OjpHZXRDbGFzc05hbWUoKSBjb25zdCB7CisgIHJldHVybiAiQ1BXTF9Db21ib0JveCI7Cit9CisKK3ZvaWQgQ1BXTF9Db21ib0JveDo6T25DcmVhdGUoQ3JlYXRlUGFyYW1zKiBwUGFyYW1zVG9BZGp1c3QpIHsKKyAgcFBhcmFtc1RvQWRqdXN0LT5kd0ZsYWdzICY9IH5QV1NfSFNDUk9MTDsKKyAgcFBhcmFtc1RvQWRqdXN0LT5kd0ZsYWdzICY9IH5QV1NfVlNDUk9MTDsKK30KKwordm9pZCBDUFdMX0NvbWJvQm94OjpPbkRlc3Ryb3koKSB7CisgIC8vIFVudGlsIGNsZWFudXAgdGFrZXMgcGxhY2UgaW4gdGhlIHZpcnR1YWwgZGVzdHJ1Y3RvciBmb3IgQ1BXTF9XbmQKKyAgLy8gc3ViY2xhc3NlcywgaW1wbGVtZW50IHRoZSB2aXJ0dWFsIE9uRGVzdHJveSBtZXRob2QgdGhhdCBkb2VzIHRoZQorICAvLyBjbGVhbnVwIGZpcnN0LCB0aGVuIGludm9rZXMgdGhlIHN1cGVyY2xhc3MgT25EZXN0cm95IC4uLiBnZWUsCisgIC8vIGxpa2UgYSBkdG9yIHdvdWxkLgorICBtX3BMaXN0LlJlbGVhc2UoKTsKKyAgbV9wQnV0dG9uLlJlbGVhc2UoKTsKKyAgbV9wRWRpdC5SZWxlYXNlKCk7CisgIENQV0xfV25kOjpPbkRlc3Ryb3koKTsKK30KKwordm9pZCBDUFdMX0NvbWJvQm94OjpTZXRGb2N1cygpIHsKKyAgaWYgKG1fcEVkaXQpCisgICAgbV9wRWRpdC0+U2V0Rm9jdXMoKTsKK30KKwordm9pZCBDUFdMX0NvbWJvQm94OjpLaWxsRm9jdXMoKSB7CisgIGlmICghU2V0UG9wdXAoZmFsc2UpKQorICAgIHJldHVybjsKKworICBDUFdMX1duZDo6S2lsbEZvY3VzKCk7Cit9CisKK1dpZGVTdHJpbmcgQ1BXTF9Db21ib0JveDo6R2V0U2VsZWN0ZWRUZXh0KCkgeworICBpZiAobV9wRWRpdCkKKyAgICByZXR1cm4gbV9wRWRpdC0+R2V0U2VsZWN0ZWRUZXh0KCk7CisKKyAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKK30KKwordm9pZCBDUFdMX0NvbWJvQm94OjpSZXBsYWNlU2VsZWN0aW9uKGNvbnN0IFdpZGVTdHJpbmcmIHRleHQpIHsKKyAgaWYgKG1fcEVkaXQpCisgICAgbV9wRWRpdC0+UmVwbGFjZVNlbGVjdGlvbih0ZXh0KTsKK30KKworV2lkZVN0cmluZyBDUFdMX0NvbWJvQm94OjpHZXRUZXh0KCkgY29uc3QgeworICBpZiAobV9wRWRpdCkgeworICAgIHJldHVybiBtX3BFZGl0LT5HZXRUZXh0KCk7CisgIH0KKyAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKK30KKwordm9pZCBDUFdMX0NvbWJvQm94OjpTZXRUZXh0KGNvbnN0IFdpZGVTdHJpbmcmIHRleHQpIHsKKyAgaWYgKG1fcEVkaXQpCisgICAgbV9wRWRpdC0+U2V0VGV4dCh0ZXh0KTsKK30KKwordm9pZCBDUFdMX0NvbWJvQm94OjpBZGRTdHJpbmcoY29uc3QgV2lkZVN0cmluZyYgc3RyKSB7CisgIGlmIChtX3BMaXN0KQorICAgIG1fcExpc3QtPkFkZFN0cmluZyhzdHIpOworfQorCitpbnQzMl90IENQV0xfQ29tYm9Cb3g6OkdldFNlbGVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fblNlbGVjdEl0ZW07Cit9CisKK3ZvaWQgQ1BXTF9Db21ib0JveDo6U2V0U2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCkgeworICBpZiAobV9wTGlzdCkKKyAgICBtX3BMaXN0LT5TZWxlY3Qobkl0ZW1JbmRleCk7CisKKyAgbV9wRWRpdC0+U2V0VGV4dChtX3BMaXN0LT5HZXRUZXh0KCkpOworICBtX25TZWxlY3RJdGVtID0gbkl0ZW1JbmRleDsKK30KKwordm9pZCBDUFdMX0NvbWJvQm94OjpTZXRFZGl0U2VsZWN0aW9uKGludDMyX3QgblN0YXJ0Q2hhciwgaW50MzJfdCBuRW5kQ2hhcikgeworICBpZiAobV9wRWRpdCkKKyAgICBtX3BFZGl0LT5TZXRTZWxlY3Rpb24oblN0YXJ0Q2hhciwgbkVuZENoYXIpOworfQorCit2b2lkIENQV0xfQ29tYm9Cb3g6OkdldEVkaXRTZWxlY3Rpb24oaW50MzJfdCYgblN0YXJ0Q2hhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuRW5kQ2hhcikgY29uc3QgeworICBuU3RhcnRDaGFyID0gLTE7CisgIG5FbmRDaGFyID0gLTE7CisKKyAgaWYgKG1fcEVkaXQpCisgICAgbV9wRWRpdC0+R2V0U2VsZWN0aW9uKG5TdGFydENoYXIsIG5FbmRDaGFyKTsKK30KKwordm9pZCBDUFdMX0NvbWJvQm94OjpDbGVhclNlbGVjdGlvbigpIHsKKyAgaWYgKG1fcEVkaXQpCisgICAgbV9wRWRpdC0+Q2xlYXJTZWxlY3Rpb24oKTsKK30KKwordm9pZCBDUFdMX0NvbWJvQm94OjpDcmVhdGVDaGlsZFduZChjb25zdCBDcmVhdGVQYXJhbXMmIGNwKSB7CisgIENyZWF0ZUVkaXQoY3ApOworICBDcmVhdGVCdXR0b24oY3ApOworICBDcmVhdGVMaXN0Qm94KGNwKTsKK30KKwordm9pZCBDUFdMX0NvbWJvQm94OjpDcmVhdGVFZGl0KGNvbnN0IENyZWF0ZVBhcmFtcyYgY3ApIHsKKyAgaWYgKG1fcEVkaXQpCisgICAgcmV0dXJuOworCisgIG1fcEVkaXQgPSBuZXcgQ1BXTF9FZGl0KCk7CisgIG1fcEVkaXQtPkF0dGFjaEZGTERhdGEobV9wRm9ybUZpbGxlci5HZXQoKSk7CisKKyAgQ3JlYXRlUGFyYW1zIGVjcCA9IGNwOworICBlY3AucFBhcmVudFduZCA9IHRoaXM7CisgIGVjcC5kd0ZsYWdzID0gUFdTX1ZJU0lCTEUgfCBQV1NfQ0hJTEQgfCBQV1NfQk9SREVSIHwgUEVTX0NFTlRFUiB8CisgICAgICAgICAgICAgICAgUEVTX0FVVE9TQ1JPTEwgfCBQRVNfVU5ETzsKKworICBpZiAoSGFzRmxhZyhQV1NfQVVUT0ZPTlRTSVpFKSkKKyAgICBlY3AuZHdGbGFncyB8PSBQV1NfQVVUT0ZPTlRTSVpFOworCisgIGlmICghSGFzRmxhZyhQQ0JTX0FMTE9XQ1VTVE9NVEVYVCkpCisgICAgZWNwLmR3RmxhZ3MgfD0gUFdTX1JFQURPTkxZOworCisgIGVjcC5yY1JlY3RXbmQgPSBDRlhfRmxvYXRSZWN0KCk7CisgIGVjcC5kd0JvcmRlcldpZHRoID0gMDsKKyAgZWNwLm5Cb3JkZXJTdHlsZSA9IEJvcmRlclN0eWxlOjpTT0xJRDsKKyAgbV9wRWRpdC0+Q3JlYXRlKGVjcCk7Cit9CisKK3ZvaWQgQ1BXTF9Db21ib0JveDo6Q3JlYXRlQnV0dG9uKGNvbnN0IENyZWF0ZVBhcmFtcyYgY3ApIHsKKyAgaWYgKG1fcEJ1dHRvbikKKyAgICByZXR1cm47CisKKyAgbV9wQnV0dG9uID0gbmV3IENQV0xfQ0JCdXR0b247CisKKyAgQ3JlYXRlUGFyYW1zIGJjcCA9IGNwOworICBiY3AucFBhcmVudFduZCA9IHRoaXM7CisgIGJjcC5kd0ZsYWdzID0gUFdTX1ZJU0lCTEUgfCBQV1NfQ0hJTEQgfCBQV1NfQk9SREVSIHwgUFdTX0JBQ0tHUk9VTkQ7CisgIGJjcC5zQmFja2dyb3VuZENvbG9yID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a1JHQiwgMjIwLjBmIC8gMjU1LjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjAuMGYgLyAyNTUuMGYsIDIyMC4wZiAvIDI1NS4wZik7CisgIGJjcC5zQm9yZGVyQ29sb3IgPSBQV0xfREVGQVVMVF9CTEFDS0NPTE9SOworICBiY3AuZHdCb3JkZXJXaWR0aCA9IDI7CisgIGJjcC5uQm9yZGVyU3R5bGUgPSBCb3JkZXJTdHlsZTo6QkVWRUxFRDsKKyAgYmNwLmVDdXJzb3JUeXBlID0gRlhDVF9BUlJPVzsKKyAgbV9wQnV0dG9uLT5DcmVhdGUoYmNwKTsKK30KKwordm9pZCBDUFdMX0NvbWJvQm94OjpDcmVhdGVMaXN0Qm94KGNvbnN0IENyZWF0ZVBhcmFtcyYgY3ApIHsKKyAgaWYgKG1fcExpc3QpCisgICAgcmV0dXJuOworCisgIG1fcExpc3QgPSBuZXcgQ1BXTF9DQkxpc3RCb3goKTsKKyAgbV9wTGlzdC0+QXR0YWNoRkZMRGF0YShtX3BGb3JtRmlsbGVyLkdldCgpKTsKKworICBDcmVhdGVQYXJhbXMgbGNwID0gY3A7CisgIGxjcC5wUGFyZW50V25kID0gdGhpczsKKyAgbGNwLmR3RmxhZ3MgPQorICAgICAgUFdTX0NISUxEIHwgUFdTX0JPUkRFUiB8IFBXU19CQUNLR1JPVU5EIHwgUExCU19IT1ZFUlNFTCB8IFBXU19WU0NST0xMOworICBsY3AubkJvcmRlclN0eWxlID0gQm9yZGVyU3R5bGU6OlNPTElEOworICBsY3AuZHdCb3JkZXJXaWR0aCA9IDE7CisgIGxjcC5lQ3Vyc29yVHlwZSA9IEZYQ1RfQVJST1c7CisgIGxjcC5yY1JlY3RXbmQgPSBDRlhfRmxvYXRSZWN0KCk7CisKKyAgbGNwLmZGb250U2l6ZSA9CisgICAgICAoY3AuZHdGbGFncyAmIFBXU19BVVRPRk9OVFNJWkUpID8ga0NvbWJvQm94RGVmYXVsdEZvbnRTaXplIDogY3AuZkZvbnRTaXplOworCisgIGlmIChjcC5zQm9yZGVyQ29sb3IubkNvbG9yVHlwZSA9PSBDRlhfQ29sb3I6OmtUcmFuc3BhcmVudCkKKyAgICBsY3Auc0JvcmRlckNvbG9yID0gUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUjsKKworICBpZiAoY3Auc0JhY2tncm91bmRDb2xvci5uQ29sb3JUeXBlID09IENGWF9Db2xvcjo6a1RyYW5zcGFyZW50KQorICAgIGxjcC5zQmFja2dyb3VuZENvbG9yID0gUFdMX0RFRkFVTFRfV0hJVEVDT0xPUjsKKworICBtX3BMaXN0LT5DcmVhdGUobGNwKTsKK30KKworYm9vbCBDUFdMX0NvbWJvQm94OjpSZVBvc0NoaWxkV25kKCkgeworICBPYnNlcnZlZFB0ciB0aGlzT2JzZXJ2ZWQodGhpcyk7CisKKyAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKKyAgaWYgKG1fYlBvcHVwKSB7CisgICAgY29uc3QgZmxvYXQgZk9sZFdpbmRvd0hlaWdodCA9IG1fcmNPbGRXaW5kb3cuSGVpZ2h0KCk7CisgICAgY29uc3QgZmxvYXQgZk9sZENsaWVudEhlaWdodCA9IGZPbGRXaW5kb3dIZWlnaHQgLSBHZXRCb3JkZXJXaWR0aCgpICogMjsKKworICAgIENGWF9GbG9hdFJlY3QgcmNMaXN0ID0gQ1BXTF9XbmQ6OkdldFdpbmRvd1JlY3QoKTsKKyAgICBDRlhfRmxvYXRSZWN0IHJjQnV0dG9uID0gcmNDbGllbnQ7CisgICAgcmNCdXR0b24ubGVmdCA9CisgICAgICAgIHN0ZDo6bWF4KHJjQnV0dG9uLnJpZ2h0IC0ga0RlZmF1bHRCdXR0b25XaWR0aCwgcmNDbGllbnQubGVmdCk7CisgICAgQ0ZYX0Zsb2F0UmVjdCByY0VkaXQgPSByY0NsaWVudDsKKyAgICByY0VkaXQucmlnaHQgPSBzdGQ6Om1heChyY0J1dHRvbi5sZWZ0IC0gMS4wZiwgcmNFZGl0LmxlZnQpOworICAgIGlmIChtX2JCb3R0b20pIHsKKyAgICAgIHJjQnV0dG9uLmJvdHRvbSA9IHJjQnV0dG9uLnRvcCAtIGZPbGRDbGllbnRIZWlnaHQ7CisgICAgICByY0VkaXQuYm90dG9tID0gcmNFZGl0LnRvcCAtIGZPbGRDbGllbnRIZWlnaHQ7CisgICAgICByY0xpc3QudG9wIC09IGZPbGRXaW5kb3dIZWlnaHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHJjQnV0dG9uLnRvcCA9IHJjQnV0dG9uLmJvdHRvbSArIGZPbGRDbGllbnRIZWlnaHQ7CisgICAgICByY0VkaXQudG9wID0gcmNFZGl0LmJvdHRvbSArIGZPbGRDbGllbnRIZWlnaHQ7CisgICAgICByY0xpc3QuYm90dG9tICs9IGZPbGRXaW5kb3dIZWlnaHQ7CisgICAgfQorCisgICAgaWYgKG1fcEJ1dHRvbikgeworICAgICAgbV9wQnV0dG9uLT5Nb3ZlKHJjQnV0dG9uLCB0cnVlLCBmYWxzZSk7CisgICAgICBpZiAoIXRoaXNPYnNlcnZlZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChtX3BFZGl0KSB7CisgICAgICBtX3BFZGl0LT5Nb3ZlKHJjRWRpdCwgdHJ1ZSwgZmFsc2UpOworICAgICAgaWYgKCF0aGlzT2JzZXJ2ZWQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobV9wTGlzdCkgeworICAgICAgaWYgKCFtX3BMaXN0LT5TZXRWaXNpYmxlKHRydWUpIHx8ICF0aGlzT2JzZXJ2ZWQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgaWYgKCFtX3BMaXN0LT5Nb3ZlKHJjTGlzdCwgdHJ1ZSwgZmFsc2UpIHx8ICF0aGlzT2JzZXJ2ZWQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgbV9wTGlzdC0+U2Nyb2xsVG9MaXN0SXRlbShtX25TZWxlY3RJdGVtKTsKKyAgICAgIGlmICghdGhpc09ic2VydmVkKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgQ0ZYX0Zsb2F0UmVjdCByY0J1dHRvbiA9IHJjQ2xpZW50OworICByY0J1dHRvbi5sZWZ0ID0gc3RkOjptYXgocmNCdXR0b24ucmlnaHQgLSBrRGVmYXVsdEJ1dHRvbldpZHRoLCByY0NsaWVudC5sZWZ0KTsKKworICBpZiAobV9wQnV0dG9uKSB7CisgICAgbV9wQnV0dG9uLT5Nb3ZlKHJjQnV0dG9uLCB0cnVlLCBmYWxzZSk7CisgICAgaWYgKCF0aGlzT2JzZXJ2ZWQpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBDRlhfRmxvYXRSZWN0IHJjRWRpdCA9IHJjQ2xpZW50OworICByY0VkaXQucmlnaHQgPSBzdGQ6Om1heChyY0J1dHRvbi5sZWZ0IC0gMS4wZiwgcmNFZGl0LmxlZnQpOworCisgIGlmIChtX3BFZGl0KSB7CisgICAgbV9wRWRpdC0+TW92ZShyY0VkaXQsIHRydWUsIGZhbHNlKTsKKyAgICBpZiAoIXRoaXNPYnNlcnZlZCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChtX3BMaXN0KSB7CisgICAgbV9wTGlzdC0+U2V0VmlzaWJsZShmYWxzZSk7CisgICAgaWYgKCF0aGlzT2JzZXJ2ZWQpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDUFdMX0NvbWJvQm94OjpTZWxlY3RBbGwoKSB7CisgIGlmIChtX3BFZGl0ICYmIEhhc0ZsYWcoUENCU19BTExPV0NVU1RPTVRFWFQpKQorICAgIG1fcEVkaXQtPlNlbGVjdEFsbCgpOworfQorCitDRlhfRmxvYXRSZWN0IENQV0xfQ29tYm9Cb3g6OkdldEZvY3VzUmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIENGWF9GbG9hdFJlY3QoKTsKK30KKworYm9vbCBDUFdMX0NvbWJvQm94OjpTZXRQb3B1cChib29sIGJQb3B1cCkgeworICBpZiAoIW1fcExpc3QpCisgICAgcmV0dXJuIHRydWU7CisgIGlmIChiUG9wdXAgPT0gbV9iUG9wdXApCisgICAgcmV0dXJuIHRydWU7CisgIGZsb2F0IGZMaXN0SGVpZ2h0ID0gbV9wTGlzdC0+R2V0Q29udGVudFJlY3QoKS5IZWlnaHQoKTsKKyAgaWYgKCFJc0Zsb2F0QmlnZ2VyKGZMaXN0SGVpZ2h0LCAwLjBmKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoIWJQb3B1cCkgeworICAgIG1fYlBvcHVwID0gYlBvcHVwOworICAgIHJldHVybiBNb3ZlKG1fcmNPbGRXaW5kb3csIHRydWUsIHRydWUpOworICB9CisKKyAgaWYgKCFtX3BGaWxsZXJOb3RpZnkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgT2JzZXJ2ZWRQdHIgdGhpc09ic2VydmVkKHRoaXMpOworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgaWYgKG1fcEZpbGxlck5vdGlmeS0+T25Qb3B1cFByZU9wZW4oR2V0QXR0YWNoZWREYXRhKCksIDApKQorICAgIHJldHVybiAhIXRoaXNPYnNlcnZlZDsKKyAgaWYgKCF0aGlzT2JzZXJ2ZWQpCisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCisgIGZsb2F0IGZCb3JkZXJXaWR0aCA9IG1fcExpc3QtPkdldEJvcmRlcldpZHRoKCkgKiAyOworICBmbG9hdCBmUG9wdXBNaW4gPSAwLjBmOworICBpZiAobV9wTGlzdC0+R2V0Q291bnQoKSA+IDMpCisgICAgZlBvcHVwTWluID0gbV9wTGlzdC0+R2V0Rmlyc3RIZWlnaHQoKSAqIDMgKyBmQm9yZGVyV2lkdGg7CisgIGZsb2F0IGZQb3B1cE1heCA9IGZMaXN0SGVpZ2h0ICsgZkJvcmRlcldpZHRoOworCisgIGJvb2wgYkJvdHRvbTsKKyAgZmxvYXQgZlBvcHVwUmV0OworICBtX3BGaWxsZXJOb3RpZnktPlF1ZXJ5V2hlcmVQb3B1cChHZXRBdHRhY2hlZERhdGEoKSwgZlBvcHVwTWluLCBmUG9wdXBNYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiQm90dG9tLCAmZlBvcHVwUmV0KTsKKyAgaWYgKCFJc0Zsb2F0QmlnZ2VyKGZQb3B1cFJldCwgMC4wZikpCisgICAgcmV0dXJuIHRydWU7CisKKyAgbV9yY09sZFdpbmRvdyA9IENQV0xfV25kOjpHZXRXaW5kb3dSZWN0KCk7CisgIG1fYlBvcHVwID0gYlBvcHVwOworICBtX2JCb3R0b20gPSBiQm90dG9tOworCisgIENGWF9GbG9hdFJlY3QgcmNXaW5kb3cgPSBtX3JjT2xkV2luZG93OworICBpZiAoYkJvdHRvbSkKKyAgICByY1dpbmRvdy5ib3R0b20gLT0gZlBvcHVwUmV0OworICBlbHNlCisgICAgcmNXaW5kb3cudG9wICs9IGZQb3B1cFJldDsKKworICBpZiAoIU1vdmUocmNXaW5kb3csIHRydWUsIHRydWUpKQorICAgIHJldHVybiBmYWxzZTsKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIG1fcEZpbGxlck5vdGlmeS0+T25Qb3B1cFBvc3RPcGVuKEdldEF0dGFjaGVkRGF0YSgpLCAwKTsKKyAgaWYgKCF0aGlzT2JzZXJ2ZWQpCisgICAgcmV0dXJuIGZhbHNlOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCisgIHJldHVybiAhIXRoaXNPYnNlcnZlZDsKK30KKworYm9vbCBDUFdMX0NvbWJvQm94OjpPbktleURvd24odWludDE2X3QgbkNoYXIsIHVpbnQzMl90IG5GbGFnKSB7CisgIGlmICghbV9wTGlzdCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghbV9wRWRpdCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbV9uU2VsZWN0SXRlbSA9IC0xOworCisgIHN3aXRjaCAobkNoYXIpIHsKKyAgICBjYXNlIEZXTF9WS0VZX1VwOgorICAgICAgaWYgKG1fcExpc3QtPkdldEN1clNlbCgpID4gMCkgeworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgICAgICAgIGlmIChtX3BGaWxsZXJOb3RpZnkpIHsKKyAgICAgICAgICBpZiAobV9wRmlsbGVyTm90aWZ5LT5PblBvcHVwUHJlT3BlbihHZXRBdHRhY2hlZERhdGEoKSwgbkZsYWcpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIGlmIChtX3BGaWxsZXJOb3RpZnktPk9uUG9wdXBQb3N0T3BlbihHZXRBdHRhY2hlZERhdGEoKSwgbkZsYWcpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisgICAgICAgIGlmIChtX3BMaXN0LT5Jc01vdmVtZW50S2V5KG5DaGFyKSkgeworICAgICAgICAgIGlmIChtX3BMaXN0LT5Pbk1vdmVtZW50S2V5RG93bihuQ2hhciwgbkZsYWcpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIFNldFNlbGVjdFRleHQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBGV0xfVktFWV9Eb3duOgorICAgICAgaWYgKG1fcExpc3QtPkdldEN1clNlbCgpIDwgbV9wTGlzdC0+R2V0Q291bnQoKSAtIDEpIHsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICAgICAgICBpZiAobV9wRmlsbGVyTm90aWZ5KSB7CisgICAgICAgICAgaWYgKG1fcEZpbGxlck5vdGlmeS0+T25Qb3B1cFByZU9wZW4oR2V0QXR0YWNoZWREYXRhKCksIG5GbGFnKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICBpZiAobV9wRmlsbGVyTm90aWZ5LT5PblBvcHVwUG9zdE9wZW4oR2V0QXR0YWNoZWREYXRhKCksIG5GbGFnKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICAgICAgICBpZiAobV9wTGlzdC0+SXNNb3ZlbWVudEtleShuQ2hhcikpIHsKKyAgICAgICAgICBpZiAobV9wTGlzdC0+T25Nb3ZlbWVudEtleURvd24obkNoYXIsIG5GbGFnKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICBTZXRTZWxlY3RUZXh0KCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaWYgKEhhc0ZsYWcoUENCU19BTExPV0NVU1RPTVRFWFQpKQorICAgIHJldHVybiBtX3BFZGl0LT5PbktleURvd24obkNoYXIsIG5GbGFnKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1BXTF9Db21ib0JveDo6T25DaGFyKHVpbnQxNl90IG5DaGFyLCB1aW50MzJfdCBuRmxhZykgeworICBpZiAoIW1fcExpc3QpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghbV9wRWRpdCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbV9uU2VsZWN0SXRlbSA9IC0xOworICBpZiAoSGFzRmxhZyhQQ0JTX0FMTE9XQ1VTVE9NVEVYVCkpCisgICAgcmV0dXJuIG1fcEVkaXQtPk9uQ2hhcihuQ2hhciwgbkZsYWcpOworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgaWYgKG1fcEZpbGxlck5vdGlmeSkgeworICAgIGlmIChtX3BGaWxsZXJOb3RpZnktPk9uUG9wdXBQcmVPcGVuKEdldEF0dGFjaGVkRGF0YSgpLCBuRmxhZykpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKG1fcEZpbGxlck5vdGlmeS0+T25Qb3B1cFBvc3RPcGVuKEdldEF0dGFjaGVkRGF0YSgpLCBuRmxhZykpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKyAgaWYgKCFtX3BMaXN0LT5Jc0NoYXIobkNoYXIsIG5GbGFnKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBtX3BMaXN0LT5PbkNoYXJOb3RpZnkobkNoYXIsIG5GbGFnKTsKK30KKwordm9pZCBDUFdMX0NvbWJvQm94OjpOb3RpZnlMQnV0dG9uRG93bihDUFdMX1duZCogY2hpbGQsIGNvbnN0IENGWF9Qb2ludEYmIHBvcykgeworICBpZiAoY2hpbGQgPT0gbV9wQnV0dG9uKSB7CisgICAgU2V0UG9wdXAoIW1fYlBvcHVwKTsKKyAgICAvLyBOb3RlLCB8dGhpc3wgbWF5IG5vIGxvbmdlciBiZSB2aWFibGUgYXQgdGhpcyBwb2ludC4gSWYgbW9yZSB3b3JrIG5lZWRzIHRvCisgICAgLy8gYmUgZG9uZSwgY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvZiBTZXRQb3B1cCgpLgorICB9Cit9CisKK3ZvaWQgQ1BXTF9Db21ib0JveDo6Tm90aWZ5TEJ1dHRvblVwKENQV0xfV25kKiBjaGlsZCwgY29uc3QgQ0ZYX1BvaW50RiYgcG9zKSB7CisgIGlmICghbV9wRWRpdCB8fCAhbV9wTGlzdCB8fCBjaGlsZCAhPSBtX3BMaXN0KQorICAgIHJldHVybjsKKworICBTZXRTZWxlY3RUZXh0KCk7CisgIFNlbGVjdEFsbCgpOworICBtX3BFZGl0LT5TZXRGb2N1cygpOworICBTZXRQb3B1cChmYWxzZSk7CisgIC8vIE5vdGUsIHx0aGlzfCBtYXkgbm8gbG9uZ2VyIGJlIHZpYWJsZSBhdCB0aGlzIHBvaW50LiBJZiBtb3JlIHdvcmsgbmVlZHMgdG8KKyAgLy8gYmUgZG9uZSwgY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvZiBTZXRQb3B1cCgpLgorfQorCitib29sIENQV0xfQ29tYm9Cb3g6OklzUG9wdXAoKSBjb25zdCB7CisgIHJldHVybiBtX2JQb3B1cDsKK30KKwordm9pZCBDUFdMX0NvbWJvQm94OjpTZXRTZWxlY3RUZXh0KCkgeworICBtX3BFZGl0LT5TZWxlY3RBbGwoKTsKKyAgbV9wRWRpdC0+UmVwbGFjZVNlbChtX3BMaXN0LT5HZXRUZXh0KCkpOworICBtX3BFZGl0LT5TZWxlY3RBbGwoKTsKKyAgbV9uU2VsZWN0SXRlbSA9IG1fcExpc3QtPkdldEN1clNlbCgpOworfQorCit2b2lkIENQV0xfQ29tYm9Cb3g6OlNldEZpbGxlck5vdGlmeShJUFdMX0ZpbGxlcl9Ob3RpZnkqIHBOb3RpZnkpIHsKKyAgbV9wRmlsbGVyTm90aWZ5ID0gcE5vdGlmeTsKKworICBpZiAobV9wRWRpdCkKKyAgICBtX3BFZGl0LT5TZXRGaWxsZXJOb3RpZnkocE5vdGlmeSk7CisKKyAgaWYgKG1fcExpc3QpCisgICAgbV9wTGlzdC0+U2V0RmlsbGVyTm90aWZ5KHBOb3RpZnkpOworfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9wd2wvY3B3bF9jb21ib19ib3guaCBiL2ZwZGZzZGsvcHdsL2Nwd2xfY29tYm9fYm94LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRiNzIxMwotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvcHdsL2Nwd2xfY29tYm9fYm94LmgKQEAgLTAsMCArMSwxMDMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGUERGU0RLX1BXTF9DUFdMX0NPTUJPX0JPWF9IXworI2RlZmluZSBGUERGU0RLX1BXTF9DUFdMX0NPTUJPX0JPWF9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfZWRpdC5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfbGlzdF9ib3guaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX3duZC5oIgorCitjbGFzcyBDUFdMX0NCTGlzdEJveCA6IHB1YmxpYyBDUFdMX0xpc3RCb3ggeworIHB1YmxpYzoKKyAgQ1BXTF9DQkxpc3RCb3goKSB7fQorICB+Q1BXTF9DQkxpc3RCb3goKSBvdmVycmlkZSB7fQorCisgIC8vIENQV0xfTGlzdEJveAorICBib29sIE9uTEJ1dHRvblVwKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgb3ZlcnJpZGU7CisKKyAgYm9vbCBJc01vdmVtZW50S2V5KHVpbnQxNl90IG5DaGFyKSBjb25zdDsKKyAgYm9vbCBPbk1vdmVtZW50S2V5RG93bih1aW50MTZfdCBuQ2hhciwgdWludDMyX3QgbkZsYWcpOworICBib29sIElzQ2hhcih1aW50MTZfdCBuQ2hhciwgdWludDMyX3QgbkZsYWcpIGNvbnN0OworICBib29sIE9uQ2hhck5vdGlmeSh1aW50MTZfdCBuQ2hhciwgdWludDMyX3QgbkZsYWcpOworfTsKKworY2xhc3MgQ1BXTF9DQkJ1dHRvbiA6IHB1YmxpYyBDUFdMX1duZCB7CisgcHVibGljOgorICBDUFdMX0NCQnV0dG9uKCkge30KKyAgfkNQV0xfQ0JCdXR0b24oKSBvdmVycmlkZSB7fQorCisgIC8vIENQV0xfV25kCisgIHZvaWQgRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG10VXNlcjJEZXZpY2UpIG92ZXJyaWRlOworICBib29sIE9uTEJ1dHRvbkRvd24oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKKyAgYm9vbCBPbkxCdXR0b25VcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOworfTsKKworY2xhc3MgQ1BXTF9Db21ib0JveCA6IHB1YmxpYyBDUFdMX1duZCB7CisgcHVibGljOgorICBDUFdMX0NvbWJvQm94KCk7CisgIH5DUFdMX0NvbWJvQm94KCkgb3ZlcnJpZGU7CisKKyAgQ1BXTF9FZGl0KiBHZXRFZGl0KCkgY29uc3QgeyByZXR1cm4gbV9wRWRpdC5HZXQoKTsgfQorCisgIC8vIENQV0xfV25kOgorICBCeXRlU3RyaW5nIEdldENsYXNzTmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIE9uQ3JlYXRlKENyZWF0ZVBhcmFtcyogcFBhcmFtc1RvQWRqdXN0KSBvdmVycmlkZTsKKyAgdm9pZCBPbkRlc3Ryb3koKSBvdmVycmlkZTsKKyAgYm9vbCBPbktleURvd24odWludDE2X3QgbkNoYXIsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKKyAgYm9vbCBPbkNoYXIodWludDE2X3QgbkNoYXIsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKKyAgdm9pZCBOb3RpZnlMQnV0dG9uRG93bihDUFdMX1duZCogY2hpbGQsIGNvbnN0IENGWF9Qb2ludEYmIHBvcykgb3ZlcnJpZGU7CisgIHZvaWQgTm90aWZ5TEJ1dHRvblVwKENQV0xfV25kKiBjaGlsZCwgY29uc3QgQ0ZYX1BvaW50RiYgcG9zKSBvdmVycmlkZTsKKyAgdm9pZCBDcmVhdGVDaGlsZFduZChjb25zdCBDcmVhdGVQYXJhbXMmIGNwKSBvdmVycmlkZTsKKyAgYm9vbCBSZVBvc0NoaWxkV25kKCkgb3ZlcnJpZGU7CisgIENGWF9GbG9hdFJlY3QgR2V0Rm9jdXNSZWN0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2V0Rm9jdXMoKSBvdmVycmlkZTsKKyAgdm9pZCBLaWxsRm9jdXMoKSBvdmVycmlkZTsKKyAgV2lkZVN0cmluZyBHZXRTZWxlY3RlZFRleHQoKSBvdmVycmlkZTsKKyAgdm9pZCBSZXBsYWNlU2VsZWN0aW9uKGNvbnN0IFdpZGVTdHJpbmcmIHRleHQpIG92ZXJyaWRlOworCisgIHZvaWQgU2V0RmlsbGVyTm90aWZ5KElQV0xfRmlsbGVyX05vdGlmeSogcE5vdGlmeSk7CisKKyAgV2lkZVN0cmluZyBHZXRUZXh0KCkgY29uc3Q7CisgIHZvaWQgU2V0VGV4dChjb25zdCBXaWRlU3RyaW5nJiB0ZXh0KTsKKyAgdm9pZCBBZGRTdHJpbmcoY29uc3QgV2lkZVN0cmluZyYgc3RyKTsKKyAgaW50MzJfdCBHZXRTZWxlY3QoKSBjb25zdDsKKyAgdm9pZCBTZXRTZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4KTsKKworICB2b2lkIFNldEVkaXRTZWxlY3Rpb24oaW50MzJfdCBuU3RhcnRDaGFyLCBpbnQzMl90IG5FbmRDaGFyKTsKKyAgdm9pZCBHZXRFZGl0U2VsZWN0aW9uKGludDMyX3QmIG5TdGFydENoYXIsIGludDMyX3QmIG5FbmRDaGFyKSBjb25zdDsKKyAgdm9pZCBDbGVhclNlbGVjdGlvbigpOworICB2b2lkIFNlbGVjdEFsbCgpOworICBib29sIElzUG9wdXAoKSBjb25zdDsKKworICB2b2lkIFNldFNlbGVjdFRleHQoKTsKKworICB2b2lkIEF0dGFjaEZGTERhdGEoQ0ZGTF9Gb3JtRmlsbGVyKiBwRGF0YSkgeyBtX3BGb3JtRmlsbGVyID0gcERhdGE7IH0KKworIHByaXZhdGU6CisgIHZvaWQgQ3JlYXRlRWRpdChjb25zdCBDcmVhdGVQYXJhbXMmIGNwKTsKKyAgdm9pZCBDcmVhdGVCdXR0b24oY29uc3QgQ3JlYXRlUGFyYW1zJiBjcCk7CisgIHZvaWQgQ3JlYXRlTGlzdEJveChjb25zdCBDcmVhdGVQYXJhbXMmIGNwKTsKKworICAvLyBSZXR1cm5zIHx0cnVlfCBpZmYgdGhpcyBpbnN0YW5jZSBpcyBzdGlsbCBhbGxvY2F0ZWQuCisgIGJvb2wgU2V0UG9wdXAoYm9vbCBiUG9wdXApOworCisgIFVub3duZWRQdHI8Q1BXTF9FZGl0PiBtX3BFZGl0OworICBVbm93bmVkUHRyPENQV0xfQ0JCdXR0b24+IG1fcEJ1dHRvbjsKKyAgVW5vd25lZFB0cjxDUFdMX0NCTGlzdEJveD4gbV9wTGlzdDsKKyAgQ0ZYX0Zsb2F0UmVjdCBtX3JjT2xkV2luZG93OworICBib29sIG1fYlBvcHVwID0gZmFsc2U7CisgIGJvb2wgbV9iQm90dG9tID0gdHJ1ZTsKKyAgaW50MzJfdCBtX25TZWxlY3RJdGVtID0gLTE7CisgIFVub3duZWRQdHI8SVBXTF9GaWxsZXJfTm90aWZ5PiBtX3BGaWxsZXJOb3RpZnk7CisgIFVub3duZWRQdHI8Q0ZGTF9Gb3JtRmlsbGVyPiBtX3BGb3JtRmlsbGVyOworfTsKKworI2VuZGlmICAvLyBGUERGU0RLX1BXTF9DUFdMX0NPTUJPX0JPWF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9wd2wvY3B3bF9jb21ib19ib3hfZW1iZWRkZXJ0ZXN0LmNwcCBiL2ZwZGZzZGsvcHdsL2Nwd2xfY29tYm9fYm94X2VtYmVkZGVydGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZkOGVlYwotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvcHdsL2Nwd2xfY29tYm9fYm94X2VtYmVkZGVydGVzdC5jcHAKQEAgLTAsMCArMSwzNDggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImZwZGZzZGsvY2JhX2Fubm90aXRlcmF0b3IuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfYW5ub3QuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfZm9ybWZpbGxlbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2Zvcm1maWxsZXIuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9pbnRlcmFjdGl2ZWZvcm1maWxsZXIuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX2NvbWJvX2JveC5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfd25kLmgiCisjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK2NsYXNzIENQV0xDb21ib0JveEVkaXRFbWJlZGRlcnRlc3QgOiBwdWJsaWMgRW1iZWRkZXJUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgRW1iZWRkZXJUZXN0OjpTZXRVcCgpOworICAgIENyZWF0ZUFuZEluaXRpYWxpemVGb3JtQ29tYm9ib3hQREYoKTsKKyAgfQorCisgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgVW5sb2FkUGFnZShHZXRQYWdlKCkpOworICAgIEVtYmVkZGVyVGVzdDo6VGVhckRvd24oKTsKKyAgfQorCisgIHZvaWQgQ3JlYXRlQW5kSW5pdGlhbGl6ZUZvcm1Db21ib2JveFBERigpIHsKKyAgICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoImNvbWJvYm94X2Zvcm0ucGRmIikpOworICAgIG1fcGFnZSA9IExvYWRQYWdlKDApOworICAgIEFTU0VSVF9UUlVFKG1fcGFnZSk7CisKKyAgICBtX3BGb3JtRmlsbEVudiA9IHN0YXRpY19jYXN0PENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCo+KGZvcm1faGFuZGxlKCkpOworICAgIENCQV9Bbm5vdEl0ZXJhdG9yIGl0ZXIobV9wRm9ybUZpbGxFbnYtPkdldFBhZ2VWaWV3KDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Bbm5vdDo6U3VidHlwZTo6V0lER0VUKTsKKworICAgIC8vIFVzZXIgZWRpdGFibGUgY29tYm9ib3guCisgICAgbV9wQW5ub3RFZGl0YWJsZSA9IGl0ZXIuR2V0Rmlyc3RBbm5vdCgpOworICAgIEFTU0VSVF9UUlVFKG1fcEFubm90RWRpdGFibGUpOworICAgIEFTU0VSVF9FUShDUERGX0Fubm90OjpTdWJ0eXBlOjpXSURHRVQsIG1fcEFubm90RWRpdGFibGUtPkdldEFubm90U3VidHlwZSgpKTsKKworICAgIC8vIE5vcm1hbCBjb21ib2JveCB3aXRoIHByZS1zZWxlY3RlZCB2YWx1ZS4KKyAgICBtX3BBbm5vdE5vcm1hbCA9IGl0ZXIuR2V0TmV4dEFubm90KG1fcEFubm90RWRpdGFibGUpOworICAgIEFTU0VSVF9UUlVFKG1fcEFubm90Tm9ybWFsKTsKKyAgICBBU1NFUlRfRVEoQ1BERl9Bbm5vdDo6U3VidHlwZTo6V0lER0VULCBtX3BBbm5vdE5vcm1hbC0+R2V0QW5ub3RTdWJ0eXBlKCkpOworCisgICAgLy8gUmVhZC1vbmx5IGNvbWJvYm94LgorICAgIENQREZTREtfQW5ub3QqIHBBbm5vdFJlYWRPbmx5ID0gaXRlci5HZXROZXh0QW5ub3QobV9wQW5ub3ROb3JtYWwpOworICAgIENQREZTREtfQW5ub3QqIHBMYXN0QW5ub3QgPSBpdGVyLkdldExhc3RBbm5vdCgpOworICAgIEFTU0VSVF9FUShwQW5ub3RSZWFkT25seSwgcExhc3RBbm5vdCk7CisgIH0KKworICB2b2lkIEZvcm1GaWxsZXJBbmRXaW5kb3dTZXR1cChDUERGU0RLX0Fubm90KiBwQW5ub3RDb21ib2JveCkgeworICAgIENGRkxfSW50ZXJhY3RpdmVGb3JtRmlsbGVyKiBwSW50ZXJhY3RpdmVGb3JtRmlsbGVyID0KKyAgICAgICAgbV9wRm9ybUZpbGxFbnYtPkdldEludGVyYWN0aXZlRm9ybUZpbGxlcigpOworICAgIHsKKyAgICAgIENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyIHBPYnNlcnZlZChwQW5ub3RDb21ib2JveCk7CisgICAgICBFWFBFQ1RfVFJVRShwSW50ZXJhY3RpdmVGb3JtRmlsbGVyLT5PblNldEZvY3VzKCZwT2JzZXJ2ZWQsIDApKTsKKyAgICB9CisKKyAgICBtX3BGb3JtRmlsbGVyID0KKyAgICAgICAgcEludGVyYWN0aXZlRm9ybUZpbGxlci0+R2V0Rm9ybUZpbGxlcihwQW5ub3RDb21ib2JveCwgZmFsc2UpOworICAgIEFTU0VSVF9UUlVFKG1fcEZvcm1GaWxsZXIpOworCisgICAgQ1BXTF9XbmQqIHBXaW5kb3cgPQorICAgICAgICBtX3BGb3JtRmlsbGVyLT5HZXRQREZXaW5kb3cobV9wRm9ybUZpbGxFbnYtPkdldFBhZ2VWaWV3KDApLCBmYWxzZSk7CisgICAgQVNTRVJUX1RSVUUocFdpbmRvdyk7CisgICAgQVNTRVJUX0VRKCJDUFdMX0NvbWJvQm94IiwgcFdpbmRvdy0+R2V0Q2xhc3NOYW1lKCkpOworICAgIG1fcENvbWJvQm94ID0gc3RhdGljX2Nhc3Q8Q1BXTF9Db21ib0JveCo+KHBXaW5kb3cpOworICB9CisKKyAgdm9pZCBUeXBlVGV4dEludG9UZXh0RmllbGQoaW50IG51bV9jaGFycykgeworICAgIC8vIFR5cGUgdGV4dCBzdGFydGluZyB3aXRoICdBJyB0byBhcyBtYW55IGNoYXJzIGFzIHNwZWNpZmllZCBieSB8bnVtX2NoYXJzfC4KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9jaGFyczsgKytpKSB7CisgICAgICBFWFBFQ1RfVFJVRShHZXRDRkZMRm9ybUZpbGxlcigpLT5PbkNoYXIoR2V0Q1BERlNES0Fubm90VXNlckVkaXRhYmxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSArICdBJywgMCkpOworICAgIH0KKyAgfQorCisgIEZQREZfUEFHRSBHZXRQYWdlKCkgY29uc3QgeyByZXR1cm4gbV9wYWdlOyB9CisgIENQV0xfQ29tYm9Cb3gqIEdldENQV0xDb21ib0JveCgpIGNvbnN0IHsgcmV0dXJuIG1fcENvbWJvQm94OyB9CisgIENGRkxfRm9ybUZpbGxlciogR2V0Q0ZGTEZvcm1GaWxsZXIoKSBjb25zdCB7IHJldHVybiBtX3BGb3JtRmlsbGVyOyB9CisgIENQREZTREtfQW5ub3QqIEdldENQREZTREtBbm5vdE5vcm1hbCgpIGNvbnN0IHsgcmV0dXJuIG1fcEFubm90Tm9ybWFsOyB9CisgIENQREZTREtfQW5ub3QqIEdldENQREZTREtBbm5vdFVzZXJFZGl0YWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9wQW5ub3RFZGl0YWJsZTsKKyAgfQorICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIEdldENQREZTREtGb3JtRmlsbEVudigpIGNvbnN0IHsKKyAgICByZXR1cm4gbV9wRm9ybUZpbGxFbnY7CisgIH0KKworIHByaXZhdGU6CisgIEZQREZfUEFHRSBtX3BhZ2U7CisgIENQV0xfQ29tYm9Cb3gqIG1fcENvbWJvQm94OworICBDRkZMX0Zvcm1GaWxsZXIqIG1fcEZvcm1GaWxsZXI7CisgIENQREZTREtfQW5ub3QqIG1fcEFubm90Tm9ybWFsOworICBDUERGU0RLX0Fubm90KiBtX3BBbm5vdEVkaXRhYmxlOworICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIG1fcEZvcm1GaWxsRW52OworfTsKKworVEVTVF9GKENQV0xDb21ib0JveEVkaXRFbWJlZGRlcnRlc3QsIEdldFNlbGVjdGVkVGV4dEVtcHR5QW5kQmFzaWNOb3JtYWwpIHsKKyAgRm9ybUZpbGxlckFuZFdpbmRvd1NldHVwKEdldENQREZTREtBbm5vdE5vcm1hbCgpKTsKKworICAvLyBBdXRvbWF0aWNhbGx5IHByZS1maWxsZWQgd2l0aCAiQmFuYW5hIi4KKyAgRVhQRUNUX0ZBTFNFKEdldENQV0xDb21ib0JveCgpLT5HZXRUZXh0KCkuSXNFbXB0eSgpKTsKKyAgRVhQRUNUX1NUUkVRKEwiQmFuYW5hIiwgR2V0Q1BXTENvbWJvQm94KCktPkdldFRleHQoKS5jX3N0cigpKTsKKworICAvLyBDaGVjayB0aGF0IHNlbGVjdGlvbiBpcyBpbnRpYWxseSBlbXB0eSwgdGhlbiBzZWxlY3QgZW50aXJlIHdvcmQuCisgIEVYUEVDVF9UUlVFKEdldENQV0xDb21ib0JveCgpLT5HZXRTZWxlY3RlZFRleHQoKS5Jc0VtcHR5KCkpOworICBHZXRDUFdMQ29tYm9Cb3goKS0+U2V0U2VsZWN0VGV4dCgpOworICBFWFBFQ1RfU1RSRVEoTCJCYW5hbmEiLCBHZXRDUFdMQ29tYm9Cb3goKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgLy8gU2VsZWN0IG90aGVyIG9wdGlvbnMuCisgIEdldENQV0xDb21ib0JveCgpLT5TZXRTZWxlY3QoMCk7CisgIEVYUEVDVF9TVFJFUShMIkFwcGxlIiwgR2V0Q1BXTENvbWJvQm94KCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworICBHZXRDUFdMQ29tYm9Cb3goKS0+U2V0U2VsZWN0KDIpOworICBFWFBFQ1RfU1RSRVEoTCJDaGVycnkiLCBHZXRDUFdMQ29tYm9Cb3goKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgLy8gVmVyaWZ5IHRoYXQgY29tYm9ib3ggdGV4dCBjYW5ub3QgYmUgZWRpdGVkLgorICBFWFBFQ1RfRkFMU0UoR2V0Q0ZGTEZvcm1GaWxsZXIoKS0+T25DaGFyKEdldENQREZTREtBbm5vdE5vcm1hbCgpLCAnYScsIDApKTsKK30KKworVEVTVF9GKENQV0xDb21ib0JveEVkaXRFbWJlZGRlcnRlc3QsIEdldFNlbGVjdGVkVGV4dEZyYWdtZW50c05vcm1hbCkgeworICBGb3JtRmlsbGVyQW5kV2luZG93U2V0dXAoR2V0Q1BERlNES0Fubm90Tm9ybWFsKCkpOworICBFWFBFQ1RfU1RSRVEoTCJCYW5hbmEiLCBHZXRDUFdMQ29tYm9Cb3goKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworCisgIEdldENQV0xDb21ib0JveCgpLT5TZXRFZGl0U2VsZWN0aW9uKDAsIDApOworICBFWFBFQ1RfVFJVRShHZXRDUFdMQ29tYm9Cb3goKS0+R2V0U2VsZWN0ZWRUZXh0KCkuSXNFbXB0eSgpKTsKKworICBHZXRDUFdMQ29tYm9Cb3goKS0+U2V0RWRpdFNlbGVjdGlvbigwLCAxKTsKKyAgRVhQRUNUX1NUUkVRKEwiQiIsIEdldENQV0xDb21ib0JveCgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKworICBHZXRDUFdMQ29tYm9Cb3goKS0+U2V0RWRpdFNlbGVjdGlvbigwLCAtMSk7CisgIEVYUEVDVF9TVFJFUShMIkJhbmFuYSIsIEdldENQV0xDb21ib0JveCgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKworICBHZXRDUFdMQ29tYm9Cb3goKS0+U2V0RWRpdFNlbGVjdGlvbigtOCwgLTEpOworICBFWFBFQ1RfVFJVRShHZXRDUFdMQ29tYm9Cb3goKS0+R2V0U2VsZWN0ZWRUZXh0KCkuSXNFbXB0eSgpKTsKKworICBHZXRDUFdMQ29tYm9Cb3goKS0+U2V0RWRpdFNlbGVjdGlvbig0LCAxKTsKKyAgRVhQRUNUX1NUUkVRKEwiYW5hIiwgR2V0Q1BXTENvbWJvQm94KCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIEdldENQV0xDb21ib0JveCgpLT5TZXRFZGl0U2VsZWN0aW9uKDEsIDQpOworICBFWFBFQ1RfU1RSRVEoTCJhbmEiLCBHZXRDUFdMQ29tYm9Cb3goKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgR2V0Q1BXTENvbWJvQm94KCktPlNldEVkaXRTZWxlY3Rpb24oNSwgNik7CisgIEVYUEVDVF9TVFJFUShMImEiLCBHZXRDUFdMQ29tYm9Cb3goKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7Cit9CisKK1RFU1RfRihDUFdMQ29tYm9Cb3hFZGl0RW1iZWRkZXJ0ZXN0LCBHZXRTZWxlY3RlZFRleHRFbXB0eUFuZEJhc2ljRWRpdGFibGUpIHsKKyAgRm9ybUZpbGxlckFuZFdpbmRvd1NldHVwKEdldENQREZTREtBbm5vdFVzZXJFZGl0YWJsZSgpKTsKKyAgRVhQRUNUX1RSVUUoR2V0Q1BXTENvbWJvQm94KCktPkdldFRleHQoKS5Jc0VtcHR5KCkpOworCisgIC8vIENoZWNrIHNlbGVjdGlvbiBpcyBpbnRpYWxseSBlbXB0eSwgdGhlbiBzZWxlY3QgYSBwcm92aWRlZCBvcHRpb24uCisgIEVYUEVDVF9UUlVFKEdldENQV0xDb21ib0JveCgpLT5HZXRTZWxlY3RlZFRleHQoKS5Jc0VtcHR5KCkpOworICBHZXRDUFdMQ29tYm9Cb3goKS0+U2V0U2VsZWN0KDApOworICBHZXRDUFdMQ29tYm9Cb3goKS0+U2V0U2VsZWN0VGV4dCgpOworICBFWFBFQ1RfU1RSRVEoTCJGb28iLCBHZXRDUFdMQ29tYm9Cb3goKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgLy8gU2VsZWN0IGFub3RoZXIgb3B0aW9uIGFuZCB0aGVuIHNlbGVjdCBsYXN0IGNoYXIgb2YgdGhhdCBvcHRpb24uCisgIEdldENQV0xDb21ib0JveCgpLT5TZXRTZWxlY3QoMSk7CisgIEVYUEVDVF9TVFJFUShMIkJhciIsIEdldENQV0xDb21ib0JveCgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKyAgR2V0Q1BXTENvbWJvQm94KCktPlNldEVkaXRTZWxlY3Rpb24oMiwgMyk7CisgIEVYUEVDVF9TVFJFUShMInIiLCBHZXRDUFdMQ29tYm9Cb3goKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgLy8gVHlwZSBpbnRvIGVkaXRhYmxlIGNvbWJvYm94IHRleHQgZmllbGQgYW5kIHNlbGVjdCBuZXcgdGV4dC4KKyAgRVhQRUNUX1RSVUUoCisgICAgICBHZXRDRkZMRm9ybUZpbGxlcigpLT5PbkNoYXIoR2V0Q1BERlNES0Fubm90VXNlckVkaXRhYmxlKCksICdhJywgMCkpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIEdldENGRkxGb3JtRmlsbGVyKCktPk9uQ2hhcihHZXRDUERGU0RLQW5ub3RVc2VyRWRpdGFibGUoKSwgJ2InLCAwKSk7CisgIEVYUEVDVF9UUlVFKAorICAgICAgR2V0Q0ZGTEZvcm1GaWxsZXIoKS0+T25DaGFyKEdldENQREZTREtBbm5vdFVzZXJFZGl0YWJsZSgpLCAnYycsIDApKTsKKworICBFWFBFQ1RfVFJVRShHZXRDUFdMQ29tYm9Cb3goKS0+R2V0U2VsZWN0ZWRUZXh0KCkuSXNFbXB0eSgpKTsKKyAgR2V0Q1BXTENvbWJvQm94KCktPlNldEVkaXRTZWxlY3Rpb24oMCwgNSk7CisgIEVYUEVDVF9TVFJFUShMIkJhYWJjIiwgR2V0Q1BXTENvbWJvQm94KCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworfQorCitURVNUX0YoQ1BXTENvbWJvQm94RWRpdEVtYmVkZGVydGVzdCwgR2V0U2VsZWN0ZWRUZXh0RnJhZ21lbnRzRWRpdGFibGUpIHsKKyAgRm9ybUZpbGxlckFuZFdpbmRvd1NldHVwKEdldENQREZTREtBbm5vdFVzZXJFZGl0YWJsZSgpKTsKKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDUwKTsKKworICBHZXRDUFdMQ29tYm9Cb3goKS0+U2V0RWRpdFNlbGVjdGlvbigwLCAwKTsKKyAgRVhQRUNUX1RSVUUoR2V0Q1BXTENvbWJvQm94KCktPkdldFNlbGVjdGVkVGV4dCgpLklzRW1wdHkoKSk7CisKKyAgR2V0Q1BXTENvbWJvQm94KCktPlNldEVkaXRTZWxlY3Rpb24oMCwgMSk7CisgIEVYUEVDVF9TVFJFUShMIkEiLCBHZXRDUFdMQ29tYm9Cb3goKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgR2V0Q1BXTENvbWJvQm94KCktPlNldEVkaXRTZWxlY3Rpb24oMCwgLTEpOworICBFWFBFQ1RfU1RSRVEoTCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXIiLAorICAgICAgICAgICAgICAgR2V0Q1BXTENvbWJvQm94KCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIEdldENQV0xDb21ib0JveCgpLT5TZXRFZGl0U2VsZWN0aW9uKC04LCAtMSk7CisgIEVYUEVDVF9UUlVFKEdldENQV0xDb21ib0JveCgpLT5HZXRTZWxlY3RlZFRleHQoKS5Jc0VtcHR5KCkpOworCisgIEdldENQV0xDb21ib0JveCgpLT5TZXRFZGl0U2VsZWN0aW9uKDIzLCAxMik7CisgIEVYUEVDVF9TVFJFUShMIk1OT1BRUlNUVVZXIiwgR2V0Q1BXTENvbWJvQm94KCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIEdldENQV0xDb21ib0JveCgpLT5TZXRFZGl0U2VsZWN0aW9uKDEyLCAyMyk7CisgIEVYUEVDVF9TVFJFUShMIk1OT1BRUlNUVVZXIiwgR2V0Q1BXTENvbWJvQm94KCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIEdldENQV0xDb21ib0JveCgpLT5TZXRFZGl0U2VsZWN0aW9uKDQ5LCA1MCk7CisgIEVYUEVDVF9TVFJFUShMInIiLCBHZXRDUFdMQ29tYm9Cb3goKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgR2V0Q1BXTENvbWJvQm94KCktPlNldEVkaXRTZWxlY3Rpb24oNDksIDU1KTsKKyAgRVhQRUNUX1NUUkVRKEwiciIsIEdldENQV0xDb21ib0JveCgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKK30KKworVEVTVF9GKENQV0xDb21ib0JveEVkaXRFbWJlZGRlcnRlc3QsIERlbGV0ZUVudGlyZVRleHRTZWxlY3Rpb24pIHsKKyAgRm9ybUZpbGxlckFuZFdpbmRvd1NldHVwKEdldENQREZTREtBbm5vdFVzZXJFZGl0YWJsZSgpKTsKKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDUwKTsKKworICBHZXRDUFdMQ29tYm9Cb3goKS0+U2V0RWRpdFNlbGVjdGlvbigwLCAtMSk7CisgIEVYUEVDVF9TVFJFUShMIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXV5fYGFiY2RlZmdoaWprbG1ub3BxciIsCisgICAgICAgICAgICAgICBHZXRDUFdMQ29tYm9Cb3goKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgR2V0Q1BXTENvbWJvQm94KCktPlJlcGxhY2VTZWxlY3Rpb24oTCIiKTsKKyAgRVhQRUNUX1RSVUUoR2V0Q1BXTENvbWJvQm94KCktPkdldFRleHQoKS5Jc0VtcHR5KCkpOworfQorCitURVNUX0YoQ1BXTENvbWJvQm94RWRpdEVtYmVkZGVydGVzdCwgRGVsZXRlVGV4dFNlbGVjdGlvbk1pZGRsZSkgeworICBGb3JtRmlsbGVyQW5kV2luZG93U2V0dXAoR2V0Q1BERlNES0Fubm90VXNlckVkaXRhYmxlKCkpOworICBUeXBlVGV4dEludG9UZXh0RmllbGQoNTApOworCisgIEdldENQV0xDb21ib0JveCgpLT5TZXRFZGl0U2VsZWN0aW9uKDEyLCAyMyk7CisgIEVYUEVDVF9TVFJFUShMIk1OT1BRUlNUVVZXIiwgR2V0Q1BXTENvbWJvQm94KCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIEdldENQV0xDb21ib0JveCgpLT5SZXBsYWNlU2VsZWN0aW9uKEwiIik7CisgIEVYUEVDVF9TVFJFUShMIkFCQ0RFRkdISUpLTFhZWltcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXIiLAorICAgICAgICAgICAgICAgR2V0Q1BXTENvbWJvQm94KCktPkdldFRleHQoKS5jX3N0cigpKTsKK30KKworVEVTVF9GKENQV0xDb21ib0JveEVkaXRFbWJlZGRlcnRlc3QsIERlbGV0ZVRleHRTZWxlY3Rpb25MZWZ0KSB7CisgIEZvcm1GaWxsZXJBbmRXaW5kb3dTZXR1cChHZXRDUERGU0RLQW5ub3RVc2VyRWRpdGFibGUoKSk7CisgIFR5cGVUZXh0SW50b1RleHRGaWVsZCg1MCk7CisKKyAgR2V0Q1BXTENvbWJvQm94KCktPlNldEVkaXRTZWxlY3Rpb24oMCwgNSk7CisgIEVYUEVDVF9TVFJFUShMIkFCQ0RFIiwgR2V0Q1BXTENvbWJvQm94KCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIEdldENQV0xDb21ib0JveCgpLT5SZXBsYWNlU2VsZWN0aW9uKEwiIik7CisgIEVYUEVDVF9TVFJFUShMIkZHSElKS0xNTk9QUVJTVFVWV1hZWltcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXIiLAorICAgICAgICAgICAgICAgR2V0Q1BXTENvbWJvQm94KCktPkdldFRleHQoKS5jX3N0cigpKTsKK30KKworVEVTVF9GKENQV0xDb21ib0JveEVkaXRFbWJlZGRlcnRlc3QsIERlbGV0ZVRleHRTZWxlY3Rpb25SaWdodCkgeworICBGb3JtRmlsbGVyQW5kV2luZG93U2V0dXAoR2V0Q1BERlNES0Fubm90VXNlckVkaXRhYmxlKCkpOworICBUeXBlVGV4dEludG9UZXh0RmllbGQoNTApOworCisgIEdldENQV0xDb21ib0JveCgpLT5TZXRFZGl0U2VsZWN0aW9uKDQ1LCA1MCk7CisgIEVYUEVDVF9TVFJFUShMIm5vcHFyIiwgR2V0Q1BXTENvbWJvQm94KCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIEdldENQV0xDb21ib0JveCgpLT5SZXBsYWNlU2VsZWN0aW9uKEwiIik7CisgIEVYUEVDVF9TVFJFUShMIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXV5fYGFiY2RlZmdoaWprbG0iLAorICAgICAgICAgICAgICAgR2V0Q1BXTENvbWJvQm94KCktPkdldFRleHQoKS5jX3N0cigpKTsKK30KKworVEVTVF9GKENQV0xDb21ib0JveEVkaXRFbWJlZGRlcnRlc3QsIERlbGV0ZUVtcHR5VGV4dFNlbGVjdGlvbikgeworICBGb3JtRmlsbGVyQW5kV2luZG93U2V0dXAoR2V0Q1BERlNES0Fubm90VXNlckVkaXRhYmxlKCkpOworICBUeXBlVGV4dEludG9UZXh0RmllbGQoNTApOworCisgIEdldENQV0xDb21ib0JveCgpLT5SZXBsYWNlU2VsZWN0aW9uKEwiIik7CisgIEVYUEVDVF9TVFJFUShMIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXV5fYGFiY2RlZmdoaWprbG1ub3BxciIsCisgICAgICAgICAgICAgICBHZXRDUFdMQ29tYm9Cb3goKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworfQorCitURVNUX0YoQ1BXTENvbWJvQm94RWRpdEVtYmVkZGVydGVzdCwgSW5zZXJ0VGV4dEluRW1wdHlFZGl0YWJsZUNvbWJvQm94KSB7CisgIEZvcm1GaWxsZXJBbmRXaW5kb3dTZXR1cChHZXRDUERGU0RLQW5ub3RVc2VyRWRpdGFibGUoKSk7CisgIEdldENQV0xDb21ib0JveCgpLT5SZXBsYWNlU2VsZWN0aW9uKEwiSGVsbG8iKTsKKyAgRVhQRUNUX1NUUkVRKEwiSGVsbG8iLCBHZXRDUFdMQ29tYm9Cb3goKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworfQorCitURVNUX0YoQ1BXTENvbWJvQm94RWRpdEVtYmVkZGVydGVzdCwKKyAgICAgICBJbnNlcnRUZXh0SW5Qb3B1bGF0ZWRFZGl0YWJsZUNvbWJvQm94TGVmdCkgeworICBGb3JtRmlsbGVyQW5kV2luZG93U2V0dXAoR2V0Q1BERlNES0Fubm90VXNlckVkaXRhYmxlKCkpOworICBUeXBlVGV4dEludG9UZXh0RmllbGQoMTApOworCisgIC8vIE1vdmUgY3Vyc29yIHRvIGJlZ2lubmluZyBvZiB1c2VyLWVkaXRhYmxlIGNvbWJvYm94IHRleHQgZmllbGQuCisgIEVYUEVDVF9UUlVFKEdldENGRkxGb3JtRmlsbGVyKCktPk9uS2V5RG93bihHZXRDUERGU0RLQW5ub3RVc2VyRWRpdGFibGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9WS0VZX0hvbWUsIDApKTsKKworICBHZXRDUFdMQ29tYm9Cb3goKS0+UmVwbGFjZVNlbGVjdGlvbihMIkhlbGxvIik7CisgIEVYUEVDVF9TVFJFUShMIkhlbGxvQUJDREVGR0hJSiIsIEdldENQV0xDb21ib0JveCgpLT5HZXRUZXh0KCkuY19zdHIoKSk7Cit9CisKK1RFU1RfRihDUFdMQ29tYm9Cb3hFZGl0RW1iZWRkZXJ0ZXN0LAorICAgICAgIEluc2VydFRleHRJblBvcHVsYXRlZEVkaXRhYmxlQ29tYm9Cb3hNaWRkbGUpIHsKKyAgRm9ybUZpbGxlckFuZFdpbmRvd1NldHVwKEdldENQREZTREtBbm5vdFVzZXJFZGl0YWJsZSgpKTsKKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDEwKTsKKworICAvLyBNb3ZlIGN1cnNvciB0byBtaWRkbGUgb2YgdXNlci1lZGl0YWJsZSBjb21ib2JveCB0ZXh0IGZpZWxkLgorICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEdldENGRkxGb3JtRmlsbGVyKCktPk9uS2V5RG93bihHZXRDUERGU0RLQW5ub3RVc2VyRWRpdGFibGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1ZLRVlfTGVmdCwgMCkpOworICB9CisKKyAgR2V0Q1BXTENvbWJvQm94KCktPlJlcGxhY2VTZWxlY3Rpb24oTCJIZWxsbyIpOworICBFWFBFQ1RfU1RSRVEoTCJBQkNERUhlbGxvRkdISUoiLCBHZXRDUFdMQ29tYm9Cb3goKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworfQorCitURVNUX0YoQ1BXTENvbWJvQm94RWRpdEVtYmVkZGVydGVzdCwKKyAgICAgICBJbnNlcnRUZXh0SW5Qb3B1bGF0ZWRFZGl0YWJsZUNvbWJvQm94UmlnaHQpIHsKKyAgRm9ybUZpbGxlckFuZFdpbmRvd1NldHVwKEdldENQREZTREtBbm5vdFVzZXJFZGl0YWJsZSgpKTsKKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDEwKTsKKworICBHZXRDUFdMQ29tYm9Cb3goKS0+UmVwbGFjZVNlbGVjdGlvbihMIkhlbGxvIik7CisgIEVYUEVDVF9TVFJFUShMIkFCQ0RFRkdISUpIZWxsbyIsIEdldENQV0xDb21ib0JveCgpLT5HZXRUZXh0KCkuY19zdHIoKSk7Cit9CisKK1RFU1RfRihDUFdMQ29tYm9Cb3hFZGl0RW1iZWRkZXJ0ZXN0LAorICAgICAgIEluc2VydFRleHRBbmRSZXBsYWNlU2VsZWN0aW9uSW5Qb3B1bGF0ZWRFZGl0YWJsZUNvbWJvQm94V2hvbGUpIHsKKyAgRm9ybUZpbGxlckFuZFdpbmRvd1NldHVwKEdldENQREZTREtBbm5vdFVzZXJFZGl0YWJsZSgpKTsKKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDEwKTsKKworICBHZXRDUFdMQ29tYm9Cb3goKS0+U2V0RWRpdFNlbGVjdGlvbigwLCAtMSk7CisgIEVYUEVDVF9TVFJFUShMIkFCQ0RFRkdISUoiLCBHZXRDUFdMQ29tYm9Cb3goKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisgIEdldENQV0xDb21ib0JveCgpLT5SZXBsYWNlU2VsZWN0aW9uKEwiSGVsbG8iKTsKKyAgRVhQRUNUX1NUUkVRKEwiSGVsbG8iLCBHZXRDUFdMQ29tYm9Cb3goKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworfQorCitURVNUX0YoQ1BXTENvbWJvQm94RWRpdEVtYmVkZGVydGVzdCwKKyAgICAgICBJbnNlcnRUZXh0QW5kUmVwbGFjZVNlbGVjdGlvbkluUG9wdWxhdGVkRWRpdGFibGVDb21ib0JveExlZnQpIHsKKyAgRm9ybUZpbGxlckFuZFdpbmRvd1NldHVwKEdldENQREZTREtBbm5vdFVzZXJFZGl0YWJsZSgpKTsKKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDEwKTsKKworICBHZXRDUFdMQ29tYm9Cb3goKS0+U2V0RWRpdFNlbGVjdGlvbigwLCA1KTsKKyAgRVhQRUNUX1NUUkVRKEwiQUJDREUiLCBHZXRDUFdMQ29tYm9Cb3goKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisgIEdldENQV0xDb21ib0JveCgpLT5SZXBsYWNlU2VsZWN0aW9uKEwiSGVsbG8iKTsKKyAgRVhQRUNUX1NUUkVRKEwiSGVsbG9GR0hJSiIsIEdldENQV0xDb21ib0JveCgpLT5HZXRUZXh0KCkuY19zdHIoKSk7Cit9CisKK1RFU1RfRihDUFdMQ29tYm9Cb3hFZGl0RW1iZWRkZXJ0ZXN0LAorICAgICAgIEluc2VydFRleHRBbmRSZXBsYWNlU2VsZWN0aW9uSW5Qb3B1bGF0ZWRFZGl0YWJsZUNvbWJvQm94TWlkZGxlKSB7CisgIEZvcm1GaWxsZXJBbmRXaW5kb3dTZXR1cChHZXRDUERGU0RLQW5ub3RVc2VyRWRpdGFibGUoKSk7CisgIFR5cGVUZXh0SW50b1RleHRGaWVsZCgxMCk7CisKKyAgR2V0Q1BXTENvbWJvQm94KCktPlNldEVkaXRTZWxlY3Rpb24oMiwgNyk7CisgIEVYUEVDVF9TVFJFUShMIkNERUZHIiwgR2V0Q1BXTENvbWJvQm94KCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworICBHZXRDUFdMQ29tYm9Cb3goKS0+UmVwbGFjZVNlbGVjdGlvbihMIkhlbGxvIik7CisgIEVYUEVDVF9TVFJFUShMIkFCSGVsbG9ISUoiLCBHZXRDUFdMQ29tYm9Cb3goKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworfQorCitURVNUX0YoQ1BXTENvbWJvQm94RWRpdEVtYmVkZGVydGVzdCwKKyAgICAgICBJbnNlcnRUZXh0QW5kUmVwbGFjZVNlbGVjdGlvbkluUG9wdWxhdGVkRWRpdGFibGVDb21ib0JveFJpZ2h0KSB7CisgIEZvcm1GaWxsZXJBbmRXaW5kb3dTZXR1cChHZXRDUERGU0RLQW5ub3RVc2VyRWRpdGFibGUoKSk7CisgIFR5cGVUZXh0SW50b1RleHRGaWVsZCgxMCk7CisKKyAgR2V0Q1BXTENvbWJvQm94KCktPlNldEVkaXRTZWxlY3Rpb24oNSwgMTApOworICBFWFBFQ1RfU1RSRVEoTCJGR0hJSiIsIEdldENQV0xDb21ib0JveCgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKyAgR2V0Q1BXTENvbWJvQm94KCktPlJlcGxhY2VTZWxlY3Rpb24oTCJIZWxsbyIpOworICBFWFBFQ1RfU1RSRVEoTCJBQkNERUhlbGxvIiwgR2V0Q1BXTENvbWJvQm94KCktPkdldFRleHQoKS5jX3N0cigpKTsKK30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcHdsL2Nwd2xfZWRpdC5jcHAgYi9mcGRmc2RrL3B3bC9jcHdsX2VkaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjODY3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL3B3bC9jcHdsX2VkaXQuY3BwCkBAIC0wLDAgKzEsNzI2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX2VkaXQuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2ZvbnQuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3B2dF93b3JkLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY3htbF9jb250ZW50LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY3htbF9lbGVtZW50LmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9ncmFwaHN0YXRlZGF0YS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcGF0aGRhdGEuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mb250LmgiCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF9jYXJldC5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfZWRpdF9jdHJsLmgiCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF9lZGl0X2ltcGwuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX2ZvbnRfbWFwLmgiCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF9zY3JvbGxfYmFyLmgiCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF93bmQuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9md2xldmVudC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKKworQ1BXTF9FZGl0OjpDUFdMX0VkaXQoKSA6IG1fYkZvY3VzKGZhbHNlKSB7fQorCitDUFdMX0VkaXQ6On5DUFdMX0VkaXQoKSB7CisgIEFTU0VSVCghbV9iRm9jdXMpOworfQorCitCeXRlU3RyaW5nIENQV0xfRWRpdDo6R2V0Q2xhc3NOYW1lKCkgY29uc3QgeworICByZXR1cm4gUFdMX0NMQVNTTkFNRV9FRElUOworfQorCit2b2lkIENQV0xfRWRpdDo6U2V0VGV4dChjb25zdCBXaWRlU3RyaW5nJiBjc1RleHQpIHsKKyAgV2lkZVN0cmluZyBzd1RleHQgPSBjc1RleHQ7CisgIGlmICghSGFzRmxhZyhQRVNfUklDSCkpIHsKKyAgICBtX3BFZGl0LT5TZXRUZXh0KHN3VGV4dCk7CisgICAgcmV0dXJuOworICB9CisKKyAgQnl0ZVN0cmluZyBzVmFsdWUgPSBCeXRlU3RyaW5nOjpGcm9tVW5pY29kZShzd1RleHQpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hNTF9FbGVtZW50PiBwWE1MKAorICAgICAgQ1hNTF9FbGVtZW50OjpQYXJzZShzVmFsdWUuY19zdHIoKSwgc1ZhbHVlLkdldExlbmd0aCgpKSk7CisgIGlmICghcFhNTCkgeworICAgIG1fcEVkaXQtPlNldFRleHQoc3dUZXh0KTsKKyAgICByZXR1cm47CisgIH0KKyAgc3dUZXh0LmNsZWFyKCk7CisKKyAgYm9vbCBiRmlyc3QgPSB0cnVlOworICBzaXplX3QgbkNvdW50ID0gcFhNTC0+Q291bnRDaGlsZHJlbigpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5Db3VudDsgKytpKSB7CisgICAgQ1hNTF9FbGVtZW50KiBwU3ViRWxlbWVudCA9IFRvRWxlbWVudChwWE1MLT5HZXRDaGlsZChpKSk7CisgICAgaWYgKCFwU3ViRWxlbWVudCB8fCAhcFN1YkVsZW1lbnQtPkdldFRhZ05hbWUoKS5FcXVhbE5vQ2FzZSgicCIpKQorICAgICAgY29udGludWU7CisKKyAgICBXaWRlU3RyaW5nIHN3U2VjdGlvbjsKKyAgICBzaXplX3QgblN1YkNoaWxkID0gcFN1YkVsZW1lbnQtPkNvdW50Q2hpbGRyZW4oKTsKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG5TdWJDaGlsZDsgKytqKSB7CisgICAgICBDWE1MX0NvbnRlbnQqIHBTdWJDb250ZW50ID0gVG9Db250ZW50KHBTdWJFbGVtZW50LT5HZXRDaGlsZChqKSk7CisgICAgICBpZiAocFN1YkNvbnRlbnQpCisgICAgICAgIHN3U2VjdGlvbiArPSBwU3ViQ29udGVudC0+bV9Db250ZW50OworICAgIH0KKyAgICBpZiAoYkZpcnN0KQorICAgICAgYkZpcnN0ID0gZmFsc2U7CisgICAgZWxzZQorICAgICAgc3dUZXh0ICs9IEZXTF9WS0VZX1JldHVybjsKKyAgICBzd1RleHQgKz0gc3dTZWN0aW9uOworICB9CisKKyAgbV9wRWRpdC0+U2V0VGV4dChzd1RleHQpOworfQorCitib29sIENQV0xfRWRpdDo6UmVQb3NDaGlsZFduZCgpIHsKKyAgaWYgKENQV0xfU2Nyb2xsQmFyKiBwVlNCID0gR2V0VlNjcm9sbEJhcigpKSB7CisgICAgQ0ZYX0Zsb2F0UmVjdCByY1dpbmRvdyA9IG1fcmNPbGRXaW5kb3c7CisgICAgQ0ZYX0Zsb2F0UmVjdCByY1ZTY3JvbGwgPQorICAgICAgICBDRlhfRmxvYXRSZWN0KHJjV2luZG93LnJpZ2h0LCByY1dpbmRvdy5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgcmNXaW5kb3cucmlnaHQgKyBQV0xfU0NST0xMQkFSX1dJRFRILCByY1dpbmRvdy50b3ApOworCisgICAgT2JzZXJ2ZWRQdHIgdGhpc09ic2VydmVkKHRoaXMpOworCisgICAgcFZTQi0+TW92ZShyY1ZTY3JvbGwsIHRydWUsIGZhbHNlKTsKKyAgICBpZiAoIXRoaXNPYnNlcnZlZCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChtX3BFZGl0Q2FyZXQgJiYgIUhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykpIHsKKyAgICBDRlhfRmxvYXRSZWN0IHJlY3QgPSBHZXRDbGllbnRSZWN0KCk7CisgICAgaWYgKCFyZWN0LklzRW1wdHkoKSkgeworICAgICAgLy8gKzEgZm9yIGNhcmV0IGJlc2lkZSBib3JkZXIKKyAgICAgIHJlY3QuSW5mbGF0ZSgxLjBmLCAxLjBmKTsKKyAgICAgIHJlY3QuTm9ybWFsaXplKCk7CisgICAgfQorICAgIG1fcEVkaXRDYXJldC0+U2V0Q2xpcFJlY3QocmVjdCk7CisgIH0KKworICByZXR1cm4gQ1BXTF9FZGl0Q3RybDo6UmVQb3NDaGlsZFduZCgpOworfQorCitDRlhfRmxvYXRSZWN0IENQV0xfRWRpdDo6R2V0Q2xpZW50UmVjdCgpIGNvbnN0IHsKKyAgZmxvYXQgd2lkdGggPSBzdGF0aWNfY2FzdDxmbG9hdD4oR2V0Qm9yZGVyV2lkdGgoKSArIEdldElubmVyQm9yZGVyV2lkdGgoKSk7CisgIENGWF9GbG9hdFJlY3QgcmNDbGllbnQgPSBHZXRXaW5kb3dSZWN0KCkuR2V0RGVmbGF0ZWQod2lkdGgsIHdpZHRoKTsKKyAgaWYgKENQV0xfU2Nyb2xsQmFyKiBwVlNCID0gR2V0VlNjcm9sbEJhcigpKSB7CisgICAgaWYgKHBWU0ItPklzVmlzaWJsZSgpKSB7CisgICAgICByY0NsaWVudC5yaWdodCAtPSBQV0xfU0NST0xMQkFSX1dJRFRIOworICAgIH0KKyAgfQorCisgIHJldHVybiByY0NsaWVudDsKK30KKwordm9pZCBDUFdMX0VkaXQ6OlNldEFsaWduRm9ybWF0VihQV0xfRURJVF9BTElHTkZPUk1BVF9WIG5Gb3JtYXQsIGJvb2wgYlBhaW50KSB7CisgIG1fcEVkaXQtPlNldEFsaWdubWVudFYoKGludDMyX3QpbkZvcm1hdCwgYlBhaW50KTsKK30KKworYm9vbCBDUFdMX0VkaXQ6OkNhblNlbGVjdEFsbCgpIGNvbnN0IHsKKyAgcmV0dXJuIEdldFNlbGVjdFdvcmRSYW5nZSgpICE9IG1fcEVkaXQtPkdldFdob2xlV29yZFJhbmdlKCk7Cit9CisKK2Jvb2wgQ1BXTF9FZGl0OjpDYW5Db3B5KCkgY29uc3QgeworICByZXR1cm4gIUhhc0ZsYWcoUEVTX1BBU1NXT1JEKSAmJiAhSGFzRmxhZyhQRVNfTk9SRUFEKSAmJgorICAgICAgICAgbV9wRWRpdC0+SXNTZWxlY3RlZCgpOworfQorCitib29sIENQV0xfRWRpdDo6Q2FuQ3V0KCkgY29uc3QgeworICByZXR1cm4gQ2FuQ29weSgpICYmICFJc1JlYWRPbmx5KCk7Cit9Cit2b2lkIENQV0xfRWRpdDo6Q3V0VGV4dCgpIHsKKyAgaWYgKCFDYW5DdXQoKSkKKyAgICByZXR1cm47CisgIG1fcEVkaXQtPkNsZWFyU2VsZWN0aW9uKCk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0OjpPbkNyZWF0ZWQoKSB7CisgIENQV0xfRWRpdEN0cmw6Ok9uQ3JlYXRlZCgpOworCisgIGlmIChDUFdMX1Njcm9sbEJhciogcFNjcm9sbCA9IEdldFZTY3JvbGxCYXIoKSkgeworICAgIHBTY3JvbGwtPlJlbW92ZUZsYWcoUFdTX0FVVE9UUkFOU1BBUkVOVCk7CisgICAgcFNjcm9sbC0+U2V0VHJhbnNwYXJlbmN5KDI1NSk7CisgIH0KKworICBTZXRQYXJhbUJ5RmxhZygpOworCisgIG1fcmNPbGRXaW5kb3cgPSBHZXRXaW5kb3dSZWN0KCk7CisKKyAgbV9wRWRpdC0+U2V0T3BlcmF0aW9uTm90aWZ5KHRoaXMpOworfQorCit2b2lkIENQV0xfRWRpdDo6U2V0UGFyYW1CeUZsYWcoKSB7CisgIGlmIChIYXNGbGFnKFBFU19SSUdIVCkpIHsKKyAgICBtX3BFZGl0LT5TZXRBbGlnbm1lbnRIKDIsIGZhbHNlKTsKKyAgfSBlbHNlIGlmIChIYXNGbGFnKFBFU19NSURETEUpKSB7CisgICAgbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgxLCBmYWxzZSk7CisgIH0gZWxzZSB7CisgICAgbV9wRWRpdC0+U2V0QWxpZ25tZW50SCgwLCBmYWxzZSk7CisgIH0KKworICBpZiAoSGFzRmxhZyhQRVNfQk9UVE9NKSkgeworICAgIG1fcEVkaXQtPlNldEFsaWdubWVudFYoMiwgZmFsc2UpOworICB9IGVsc2UgaWYgKEhhc0ZsYWcoUEVTX0NFTlRFUikpIHsKKyAgICBtX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDEsIGZhbHNlKTsKKyAgfSBlbHNlIHsKKyAgICBtX3BFZGl0LT5TZXRBbGlnbm1lbnRWKDAsIGZhbHNlKTsKKyAgfQorCisgIGlmIChIYXNGbGFnKFBFU19QQVNTV09SRCkpIHsKKyAgICBtX3BFZGl0LT5TZXRQYXNzd29yZENoYXIoJyonLCBmYWxzZSk7CisgIH0KKworICBtX3BFZGl0LT5TZXRNdWx0aUxpbmUoSGFzRmxhZyhQRVNfTVVMVElMSU5FKSwgZmFsc2UpOworICBtX3BFZGl0LT5TZXRBdXRvUmV0dXJuKEhhc0ZsYWcoUEVTX0FVVE9SRVRVUk4pLCBmYWxzZSk7CisgIG1fcEVkaXQtPlNldEF1dG9Gb250U2l6ZShIYXNGbGFnKFBXU19BVVRPRk9OVFNJWkUpLCBmYWxzZSk7CisgIG1fcEVkaXQtPlNldEF1dG9TY3JvbGwoSGFzRmxhZyhQRVNfQVVUT1NDUk9MTCksIGZhbHNlKTsKKyAgbV9wRWRpdC0+RW5hYmxlVW5kbyhIYXNGbGFnKFBFU19VTkRPKSk7CisKKyAgaWYgKEhhc0ZsYWcoUEVTX1RFWFRPVkVSRkxPVykpIHsKKyAgICBTZXRDbGlwUmVjdChDRlhfRmxvYXRSZWN0KCkpOworICAgIG1fcEVkaXQtPlNldFRleHRPdmVyZmxvdyh0cnVlLCBmYWxzZSk7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fcEVkaXRDYXJldCkgeworICAgICAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gR2V0Q2xpZW50UmVjdCgpOworICAgICAgaWYgKCFyZWN0LklzRW1wdHkoKSkgeworICAgICAgICAvLyArMSBmb3IgY2FyZXQgYmVzaWRlIGJvcmRlcgorICAgICAgICByZWN0LkluZmxhdGUoMS4wZiwgMS4wZik7CisgICAgICAgIHJlY3QuTm9ybWFsaXplKCk7CisgICAgICB9CisgICAgICBtX3BFZGl0Q2FyZXQtPlNldENsaXBSZWN0KHJlY3QpOworICAgIH0KKyAgfQorfQorCit2b2lkIENQV0xfRWRpdDo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG10VXNlcjJEZXZpY2UpIHsKKyAgQ1BXTF9XbmQ6OkRyYXdUaGlzQXBwZWFyYW5jZShwRGV2aWNlLCBtdFVzZXIyRGV2aWNlKTsKKworICBDRlhfRmxvYXRSZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworCisgIGludDMyX3QgbkNoYXJBcnJheSA9IG1fcEVkaXQtPkdldENoYXJBcnJheSgpOworICBGWF9TQUZFX0lOVDMyIG5DaGFyQXJyYXlTYWZlID0gbkNoYXJBcnJheTsKKyAgbkNoYXJBcnJheVNhZmUgLT0gMTsKKyAgbkNoYXJBcnJheVNhZmUgKj0gMjsKKworICBpZiAobkNoYXJBcnJheSA+IDAgJiYgbkNoYXJBcnJheVNhZmUuSXNWYWxpZCgpKSB7CisgICAgc3dpdGNoIChHZXRCb3JkZXJTdHlsZSgpKSB7CisgICAgICBjYXNlIEJvcmRlclN0eWxlOjpTT0xJRDogeworICAgICAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3NkOworICAgICAgICBnc2QubV9MaW5lV2lkdGggPSAoZmxvYXQpR2V0Qm9yZGVyV2lkdGgoKTsKKworICAgICAgICBDRlhfUGF0aERhdGEgcGF0aDsKKworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ2hhckFycmF5IC0gMTsgaSsrKSB7CisgICAgICAgICAgcGF0aC5BcHBlbmRQb2ludCgKKyAgICAgICAgICAgICAgQ0ZYX1BvaW50RigKKyAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LmxlZnQgKworICAgICAgICAgICAgICAgICAgICAgICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KSAvIG5DaGFyQXJyYXkpICogKGkgKyAxKSwKKyAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LmJvdHRvbSksCisgICAgICAgICAgICAgIEZYUFRfVFlQRTo6TW92ZVRvLCBmYWxzZSk7CisgICAgICAgICAgcGF0aC5BcHBlbmRQb2ludCgKKyAgICAgICAgICAgICAgQ0ZYX1BvaW50RigKKyAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LmxlZnQgKworICAgICAgICAgICAgICAgICAgICAgICgocmNDbGllbnQucmlnaHQgLSByY0NsaWVudC5sZWZ0KSAvIG5DaGFyQXJyYXkpICogKGkgKyAxKSwKKyAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LnRvcCksCisgICAgICAgICAgICAgIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwYXRoLkdldFBvaW50cygpLmVtcHR5KCkpIHsKKyAgICAgICAgICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgJm10VXNlcjJEZXZpY2UsICZnc2QsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qm9yZGVyQ29sb3IoKS5Ub0ZYQ29sb3IoMjU1KSwgRlhGSUxMX0FMVEVSTkFURSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEJvcmRlclN0eWxlOjpEQVNIOiB7CisgICAgICAgIENGWF9HcmFwaFN0YXRlRGF0YSBnc2Q7CisgICAgICAgIGdzZC5tX0xpbmVXaWR0aCA9IChmbG9hdClHZXRCb3JkZXJXaWR0aCgpOworCisgICAgICAgIGdzZC5TZXREYXNoQ291bnQoMik7CisgICAgICAgIGdzZC5tX0Rhc2hBcnJheVswXSA9IChmbG9hdClHZXRCb3JkZXJEYXNoKCkubkRhc2g7CisgICAgICAgIGdzZC5tX0Rhc2hBcnJheVsxXSA9IChmbG9hdClHZXRCb3JkZXJEYXNoKCkubkdhcDsKKyAgICAgICAgZ3NkLm1fRGFzaFBoYXNlID0gKGZsb2F0KUdldEJvcmRlckRhc2goKS5uUGhhc2U7CisKKyAgICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5DaGFyQXJyYXkgLSAxOyBpKyspIHsKKyAgICAgICAgICBwYXRoLkFwcGVuZFBvaW50KAorICAgICAgICAgICAgICBDRlhfUG9pbnRGKAorICAgICAgICAgICAgICAgICAgcmNDbGllbnQubGVmdCArCisgICAgICAgICAgICAgICAgICAgICAgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpIC8gbkNoYXJBcnJheSkgKiAoaSArIDEpLAorICAgICAgICAgICAgICAgICAgcmNDbGllbnQuYm90dG9tKSwKKyAgICAgICAgICAgICAgRlhQVF9UWVBFOjpNb3ZlVG8sIGZhbHNlKTsKKyAgICAgICAgICBwYXRoLkFwcGVuZFBvaW50KAorICAgICAgICAgICAgICBDRlhfUG9pbnRGKAorICAgICAgICAgICAgICAgICAgcmNDbGllbnQubGVmdCArCisgICAgICAgICAgICAgICAgICAgICAgKChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQpIC8gbkNoYXJBcnJheSkgKiAoaSArIDEpLAorICAgICAgICAgICAgICAgICAgcmNDbGllbnQudG9wKSwKKyAgICAgICAgICAgICAgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXBhdGguR2V0UG9pbnRzKCkuZW1wdHkoKSkgeworICAgICAgICAgIHBEZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCAmbXRVc2VyMkRldmljZSwgJmdzZCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRCb3JkZXJDb2xvcigpLlRvRlhDb2xvcigyNTUpLCBGWEZJTExfQUxURVJOQVRFKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIENGWF9GbG9hdFJlY3QgcmNDbGlwOworICBDUFZUX1dvcmRSYW5nZSB3clJhbmdlID0gbV9wRWRpdC0+R2V0VmlzaWJsZVdvcmRSYW5nZSgpOworICBDUFZUX1dvcmRSYW5nZSogcFJhbmdlID0gbnVsbHB0cjsKKyAgaWYgKCFIYXNGbGFnKFBFU19URVhUT1ZFUkZMT1cpKSB7CisgICAgcmNDbGlwID0gR2V0Q2xpZW50UmVjdCgpOworICAgIHBSYW5nZSA9ICZ3clJhbmdlOworICB9CisKKyAgQ0ZYX1N5c3RlbUhhbmRsZXIqIHBTeXNIYW5kbGVyID0gR2V0U3lzdGVtSGFuZGxlcigpOworICBDUFdMX0VkaXRJbXBsOjpEcmF3RWRpdChwRGV2aWNlLCBtdFVzZXIyRGV2aWNlLCBtX3BFZGl0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRUZXh0Q29sb3IoKS5Ub0ZYQ29sb3IoR2V0VHJhbnNwYXJlbmN5KCkpLCByY0NsaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYoKSwgcFJhbmdlLCBwU3lzSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRm9ybUZpbGxlci5HZXQoKSk7Cit9CisKK2Jvb2wgQ1BXTF9FZGl0OjpPbkxCdXR0b25Eb3duKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgeworICBDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCwgbkZsYWcpOworCisgIGlmIChIYXNGbGFnKFBFU19URVhUT1ZFUkZMT1cpIHx8IENsaWVudEhpdFRlc3QocG9pbnQpKSB7CisgICAgaWYgKG1fYk1vdXNlRG93biAmJiAhSW52YWxpZGF0ZVJlY3QobnVsbHB0cikpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIG1fYk1vdXNlRG93biA9IHRydWU7CisgICAgU2V0Q2FwdHVyZSgpOworCisgICAgbV9wRWRpdC0+T25Nb3VzZURvd24ocG9pbnQsIElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1BXTF9FZGl0OjpPbkxCdXR0b25EYmxDbGsoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSB7CisgIENQV0xfV25kOjpPbkxCdXR0b25EYmxDbGsocG9pbnQsIG5GbGFnKTsKKworICBpZiAoSGFzRmxhZyhQRVNfVEVYVE9WRVJGTE9XKSB8fCBDbGllbnRIaXRUZXN0KHBvaW50KSkgeworICAgIG1fcEVkaXQtPlNlbGVjdEFsbCgpOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1BXTF9FZGl0OjpPblJCdXR0b25VcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIHsKKyAgaWYgKG1fYk1vdXNlRG93bikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQ1BXTF9XbmQ6Ok9uUkJ1dHRvblVwKHBvaW50LCBuRmxhZyk7CisKKyAgaWYgKCFIYXNGbGFnKFBFU19URVhUT1ZFUkZMT1cpICYmICFDbGllbnRIaXRUZXN0KHBvaW50KSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBDRlhfU3lzdGVtSGFuZGxlciogcFNIID0gR2V0U3lzdGVtSGFuZGxlcigpOworICBpZiAoIXBTSCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgU2V0Rm9jdXMoKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0OjpPblNldEZvY3VzKCkgeworICBPYnNlcnZlZFB0ciBvYnNlcnZlZF9wdHIodGhpcyk7CisgIFNldEVkaXRDYXJldCh0cnVlKTsKKyAgaWYgKCFvYnNlcnZlZF9wdHIpCisgICAgcmV0dXJuOworCisgIGlmICghSXNSZWFkT25seSgpKSB7CisgICAgaWYgKENQV0xfV25kOjpGb2N1c0hhbmRsZXJJZmFjZSogcEZvY3VzSGFuZGxlciA9IEdldEZvY3VzSGFuZGxlcigpKSB7CisgICAgICBwRm9jdXNIYW5kbGVyLT5PblNldEZvY3VzKHRoaXMpOworICAgICAgaWYgKCFvYnNlcnZlZF9wdHIpCisgICAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgbV9iRm9jdXMgPSB0cnVlOworfQorCit2b2lkIENQV0xfRWRpdDo6T25LaWxsRm9jdXMoKSB7CisgIE9ic2VydmVkUHRyIG9ic2VydmVkX3B0cih0aGlzKTsKKworICBDUFdMX1Njcm9sbEJhciogcFNjcm9sbCA9IEdldFZTY3JvbGxCYXIoKTsKKyAgaWYgKHBTY3JvbGwgJiYgcFNjcm9sbC0+SXNWaXNpYmxlKCkpIHsKKyAgICBwU2Nyb2xsLT5TZXRWaXNpYmxlKGZhbHNlKTsKKyAgICBpZiAoIW9ic2VydmVkX3B0cikKKyAgICAgIHJldHVybjsKKworICAgIGlmICghTW92ZShtX3JjT2xkV2luZG93LCB0cnVlLCB0cnVlKSkKKyAgICAgIHJldHVybjsKKyAgfQorCisgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKKyAgaWYgKCFvYnNlcnZlZF9wdHIpCisgICAgcmV0dXJuOworCisgIGlmICghU2V0Q2FyZXQoZmFsc2UsIENGWF9Qb2ludEYoKSwgQ0ZYX1BvaW50RigpKSkKKyAgICByZXR1cm47CisKKyAgU2V0Q2hhclNldChGWF9DSEFSU0VUX0FOU0kpOworICBtX2JGb2N1cyA9IGZhbHNlOworfQorCit2b2lkIENQV0xfRWRpdDo6U2V0Q2hhclNwYWNlKGZsb2F0IGZDaGFyU3BhY2UpIHsKKyAgbV9wRWRpdC0+U2V0Q2hhclNwYWNlKGZDaGFyU3BhY2UpOworfQorCitDUFZUX1dvcmRSYW5nZSBDUFdMX0VkaXQ6OkdldFNlbGVjdFdvcmRSYW5nZSgpIGNvbnN0IHsKKyAgaWYgKCFtX3BFZGl0LT5Jc1NlbGVjdGVkKCkpCisgICAgcmV0dXJuIENQVlRfV29yZFJhbmdlKCk7CisKKyAgaW50MzJfdCBuU3RhcnQgPSAtMTsKKyAgaW50MzJfdCBuRW5kID0gLTE7CisKKyAgbV9wRWRpdC0+R2V0U2VsZWN0aW9uKG5TdGFydCwgbkVuZCk7CisKKyAgQ1BWVF9Xb3JkUGxhY2Ugd3BTdGFydCA9IG1fcEVkaXQtPldvcmRJbmRleFRvV29yZFBsYWNlKG5TdGFydCk7CisgIENQVlRfV29yZFBsYWNlIHdwRW5kID0gbV9wRWRpdC0+V29yZEluZGV4VG9Xb3JkUGxhY2UobkVuZCk7CisKKyAgcmV0dXJuIENQVlRfV29yZFJhbmdlKHdwU3RhcnQsIHdwRW5kKTsKK30KKworQ0ZYX1BvaW50RiBDUFdMX0VkaXQ6OkdldFdvcmRSaWdodEJvdHRvbVBvaW50KGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cFdvcmQpIHsKKyAgQ1BXTF9FZGl0SW1wbF9JdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wRWRpdC0+R2V0SXRlcmF0b3IoKTsKKyAgQ1BWVF9Xb3JkUGxhY2Ugd3BPbGQgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgIHBJdGVyYXRvci0+U2V0QXQod3BXb3JkKTsKKworICBDRlhfUG9pbnRGIHB0OworICBDUFZUX1dvcmQgd29yZDsKKyAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkKKyAgICBwdCA9IENGWF9Qb2ludEYod29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoLCB3b3JkLnB0V29yZC55ICsgd29yZC5mRGVzY2VudCk7CisgIHBJdGVyYXRvci0+U2V0QXQod3BPbGQpOworICByZXR1cm4gcHQ7Cit9CisKK2Jvb2wgQ1BXTF9FZGl0OjpJc1RleHRGdWxsKCkgY29uc3QgeworICByZXR1cm4gbV9wRWRpdC0+SXNUZXh0RnVsbCgpOworfQorCitmbG9hdCBDUFdMX0VkaXQ6OkdldENoYXJBcnJheUF1dG9Gb250U2l6ZShDUERGX0ZvbnQqIHBGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNQbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJBcnJheSkgeworICBpZiAoIXBGb250IHx8IHBGb250LT5Jc1N0YW5kYXJkRm9udCgpKQorICAgIHJldHVybiAwLjBmOworCisgIEZYX1JFQ1QgcmNCQm94OworICBwRm9udC0+R2V0Rm9udEJCb3gocmNCQm94KTsKKworICBDRlhfRmxvYXRSZWN0IHJjQ2VsbCA9IHJjUGxhdGU7CisgIGZsb2F0IHhkaXYgPSByY0NlbGwuV2lkdGgoKSAvIG5DaGFyQXJyYXkgKiAxMDAwLjBmIC8gcmNCQm94LldpZHRoKCk7CisgIGZsb2F0IHlkaXYgPSAtcmNDZWxsLkhlaWdodCgpICogMTAwMC4wZiAvIHJjQkJveC5IZWlnaHQoKTsKKworICByZXR1cm4geGRpdiA8IHlkaXYgPyB4ZGl2IDogeWRpdjsKK30KKwordm9pZCBDUFdMX0VkaXQ6OlNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXkpIHsKKyAgaWYgKCFIYXNGbGFnKFBFU19DSEFSQVJSQVkpIHx8IG5DaGFyQXJyYXkgPD0gMCkKKyAgICByZXR1cm47CisKKyAgbV9wRWRpdC0+U2V0Q2hhckFycmF5KG5DaGFyQXJyYXkpOworICBtX3BFZGl0LT5TZXRUZXh0T3ZlcmZsb3codHJ1ZSwgdHJ1ZSk7CisKKyAgaWYgKCFIYXNGbGFnKFBXU19BVVRPRk9OVFNJWkUpKQorICAgIHJldHVybjsKKworICBJUFZUX0ZvbnRNYXAqIHBGb250TWFwID0gR2V0Rm9udE1hcCgpOworICBpZiAoIXBGb250TWFwKQorICAgIHJldHVybjsKKworICBmbG9hdCBmRm9udFNpemUgPSBHZXRDaGFyQXJyYXlBdXRvRm9udFNpemUocEZvbnRNYXAtPkdldFBERkZvbnQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDbGllbnRSZWN0KCksIG5DaGFyQXJyYXkpOworICBpZiAoZkZvbnRTaXplIDw9IDAuMGYpCisgICAgcmV0dXJuOworCisgIG1fcEVkaXQtPlNldEF1dG9Gb250U2l6ZShmYWxzZSwgdHJ1ZSk7CisgIG1fcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0OjpTZXRMaW1pdENoYXIoaW50MzJfdCBuTGltaXRDaGFyKSB7CisgIG1fcEVkaXQtPlNldExpbWl0Q2hhcihuTGltaXRDaGFyKTsKK30KKwordm9pZCBDUFdMX0VkaXQ6OlJlcGxhY2VTZWwoY29uc3QgV2lkZVN0cmluZyYgd3NUZXh0KSB7CisgIG1fcEVkaXQtPkNsZWFyU2VsZWN0aW9uKCk7CisgIG1fcEVkaXQtPkluc2VydFRleHQod3NUZXh0LCBGWF9DSEFSU0VUX0RlZmF1bHQpOworfQorCitDRlhfRmxvYXRSZWN0IENQV0xfRWRpdDo6R2V0Rm9jdXNSZWN0KCkgY29uc3QgeworICByZXR1cm4gQ0ZYX0Zsb2F0UmVjdCgpOworfQorCitib29sIENQV0xfRWRpdDo6SXNWU2Nyb2xsQmFyVmlzaWJsZSgpIGNvbnN0IHsKKyAgQ1BXTF9TY3JvbGxCYXIqIHBTY3JvbGwgPSBHZXRWU2Nyb2xsQmFyKCk7CisgIHJldHVybiBwU2Nyb2xsICYmIHBTY3JvbGwtPklzVmlzaWJsZSgpOworfQorCitib29sIENQV0xfRWRpdDo6T25LZXlEb3duKHVpbnQxNl90IG5DaGFyLCB1aW50MzJfdCBuRmxhZykgeworICBpZiAobV9iTW91c2VEb3duKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChuQ2hhciA9PSBGV0xfVktFWV9EZWxldGUpIHsKKyAgICBpZiAobV9wRmlsbGVyTm90aWZ5KSB7CisgICAgICBXaWRlU3RyaW5nIHN0ckNoYW5nZTsKKyAgICAgIFdpZGVTdHJpbmcgc3RyQ2hhbmdlRXg7CisKKyAgICAgIGludCBuU2VsU3RhcnQgPSAwOworICAgICAgaW50IG5TZWxFbmQgPSAwOworICAgICAgR2V0U2VsZWN0aW9uKG5TZWxTdGFydCwgblNlbEVuZCk7CisKKyAgICAgIGlmIChuU2VsU3RhcnQgPT0gblNlbEVuZCkKKyAgICAgICAgblNlbEVuZCA9IG5TZWxTdGFydCArIDE7CisKKyAgICAgIENQV0xfV25kOjpPYnNlcnZlZFB0ciB0aGlzT2JzZXJ2ZWQodGhpcyk7CisKKyAgICAgIGJvb2wgYlJDOworICAgICAgYm9vbCBiRXhpdDsKKyAgICAgIHN0ZDo6dGllKGJSQywgYkV4aXQpID0gbV9wRmlsbGVyTm90aWZ5LT5PbkJlZm9yZUtleVN0cm9rZSgKKyAgICAgICAgICBHZXRBdHRhY2hlZERhdGEoKSwgc3RyQ2hhbmdlLCBzdHJDaGFuZ2VFeCwgblNlbFN0YXJ0LCBuU2VsRW5kLCB0cnVlLAorICAgICAgICAgIG5GbGFnKTsKKworICAgICAgaWYgKCF0aGlzT2JzZXJ2ZWQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgaWYgKCFiUkMpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmIChiRXhpdCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIGJvb2wgYlJldCA9IENQV0xfRWRpdEN0cmw6Ok9uS2V5RG93bihuQ2hhciwgbkZsYWcpOworCisgIC8vIEluIGNhc2Ugb2YgaW1wbGVtZW50YXRpb24gc3dhbGxvdyB0aGUgT25LZXlEb3duIGV2ZW50LgorICBpZiAoSXNQcm9jZWVkdG9PbkNoYXIobkNoYXIsIG5GbGFnKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gYlJldDsKK30KKworLy8gc3RhdGljCitib29sIENQV0xfRWRpdDo6SXNQcm9jZWVkdG9PbkNoYXIodWludDE2X3QgbktleUNvZGUsIHVpbnQzMl90IG5GbGFnKSB7CisgIGJvb2wgYkN0cmwgPSBJc0NUUkxwcmVzc2VkKG5GbGFnKTsKKyAgYm9vbCBiQWx0ID0gSXNBTFRwcmVzc2VkKG5GbGFnKTsKKyAgaWYgKGJDdHJsICYmICFiQWx0KSB7CisgICAgLy8gaG90IGtleXMgZm9yIGVkaXQgY29udHJvbC4KKyAgICBzd2l0Y2ggKG5LZXlDb2RlKSB7CisgICAgICBjYXNlICdDJzoKKyAgICAgIGNhc2UgJ1YnOgorICAgICAgY2FzZSAnWCc6CisgICAgICBjYXNlICdBJzoKKyAgICAgIGNhc2UgJ1onOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAvLyBjb250cm9sIGNoYXJhY3RlcnMuCisgIHN3aXRjaCAobktleUNvZGUpIHsKKyAgICBjYXNlIEZXTF9WS0VZX0VzY2FwZToKKyAgICBjYXNlIEZXTF9WS0VZX0JhY2s6CisgICAgY2FzZSBGV0xfVktFWV9SZXR1cm46CisgICAgY2FzZSBGV0xfVktFWV9TcGFjZToKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBDUFdMX0VkaXQ6Ok9uQ2hhcih1aW50MTZfdCBuQ2hhciwgdWludDMyX3QgbkZsYWcpIHsKKyAgaWYgKG1fYk1vdXNlRG93bikKKyAgICByZXR1cm4gdHJ1ZTsKKworICBib29sIGJSQyA9IHRydWU7CisgIGJvb2wgYkV4aXQgPSBmYWxzZTsKKworICBpZiAoIUlzQ1RSTHByZXNzZWQobkZsYWcpKSB7CisgICAgaWYgKG1fcEZpbGxlck5vdGlmeSkgeworICAgICAgV2lkZVN0cmluZyBzd0NoYW5nZTsKKworICAgICAgaW50IG5TZWxTdGFydCA9IDA7CisgICAgICBpbnQgblNlbEVuZCA9IDA7CisgICAgICBHZXRTZWxlY3Rpb24oblNlbFN0YXJ0LCBuU2VsRW5kKTsKKworICAgICAgc3dpdGNoIChuQ2hhcikgeworICAgICAgICBjYXNlIEZXTF9WS0VZX0JhY2s6CisgICAgICAgICAgaWYgKG5TZWxTdGFydCA9PSBuU2VsRW5kKQorICAgICAgICAgICAgblNlbFN0YXJ0ID0gblNlbEVuZCAtIDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRldMX1ZLRVlfUmV0dXJuOgorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHN3Q2hhbmdlICs9IG5DaGFyOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBDUFdMX1duZDo6T2JzZXJ2ZWRQdHIgdGhpc09ic2VydmVkKHRoaXMpOworCisgICAgICBXaWRlU3RyaW5nIHN0ckNoYW5nZUV4OworICAgICAgc3RkOjp0aWUoYlJDLCBiRXhpdCkgPSBtX3BGaWxsZXJOb3RpZnktPk9uQmVmb3JlS2V5U3Ryb2tlKAorICAgICAgICAgIEdldEF0dGFjaGVkRGF0YSgpLCBzd0NoYW5nZSwgc3RyQ2hhbmdlRXgsIG5TZWxTdGFydCwgblNlbEVuZCwgdHJ1ZSwKKyAgICAgICAgICBuRmxhZyk7CisKKyAgICAgIGlmICghdGhpc09ic2VydmVkKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgaWYgKCFiUkMpCisgICAgcmV0dXJuIHRydWU7CisgIGlmIChiRXhpdCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKElQVlRfRm9udE1hcCogcEZvbnRNYXAgPSBHZXRGb250TWFwKCkpIHsKKyAgICBpbnQzMl90IG5PbGRDaGFyU2V0ID0gR2V0Q2hhclNldCgpOworICAgIGludDMyX3Qgbk5ld0NoYXJTZXQgPQorICAgICAgICBwRm9udE1hcC0+Q2hhclNldEZyb21Vbmljb2RlKG5DaGFyLCBGWF9DSEFSU0VUX0RlZmF1bHQpOworICAgIGlmIChuT2xkQ2hhclNldCAhPSBuTmV3Q2hhclNldCkgeworICAgICAgU2V0Q2hhclNldChuTmV3Q2hhclNldCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIENQV0xfRWRpdEN0cmw6Ok9uQ2hhcihuQ2hhciwgbkZsYWcpOworfQorCitib29sIENQV0xfRWRpdDo6T25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFnKSB7CisgIGlmICghSGFzRmxhZyhQRVNfTVVMVElMSU5FKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQ0ZYX1BvaW50RiBwdFNjcm9sbCA9IEdldFNjcm9sbFBvcygpOworICBpZiAoekRlbHRhID4gMCkKKyAgICBwdFNjcm9sbC55ICs9IEdldEZvbnRTaXplKCk7CisgIGVsc2UKKyAgICBwdFNjcm9sbC55IC09IEdldEZvbnRTaXplKCk7CisgIFNldFNjcm9sbFBvcyhwdFNjcm9sbCk7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENQV0xfRWRpdDo6T25JbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkgeworICBpZiAoSGFzRmxhZyhQRVNfU1BFTExDSEVDSykpIHsKKyAgICBtX3BFZGl0LT5SZWZyZXNoV29yZFJhbmdlKENvbWJpbmVXb3JkUmFuZ2UoR2V0TGF0aW5Xb3Jkc1JhbmdlKG9sZHBsYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TGF0aW5Xb3Jkc1JhbmdlKHBsYWNlKSkpOworICB9Cit9CisKK3ZvaWQgQ1BXTF9FZGl0OjpPbkJhY2tTcGFjZShjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSB7CisgIGlmIChIYXNGbGFnKFBFU19TUEVMTENIRUNLKSkgeworICAgIG1fcEVkaXQtPlJlZnJlc2hXb3JkUmFuZ2UoQ29tYmluZVdvcmRSYW5nZShHZXRMYXRpbldvcmRzUmFuZ2Uob2xkcGxhY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRMYXRpbldvcmRzUmFuZ2UocGxhY2UpKSk7CisgIH0KK30KKwordm9pZCBDUFdMX0VkaXQ6Ok9uRGVsZXRlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpIHsKKyAgaWYgKEhhc0ZsYWcoUEVTX1NQRUxMQ0hFQ0spKSB7CisgICAgbV9wRWRpdC0+UmVmcmVzaFdvcmRSYW5nZShDb21iaW5lV29yZFJhbmdlKEdldExhdGluV29yZHNSYW5nZShvbGRwbGFjZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldExhdGluV29yZHNSYW5nZShwbGFjZSkpKTsKKyAgfQorfQorCit2b2lkIENQV0xfRWRpdDo6T25DbGVhcihjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpIHsKKyAgaWYgKEhhc0ZsYWcoUEVTX1NQRUxMQ0hFQ0spKSB7CisgICAgbV9wRWRpdC0+UmVmcmVzaFdvcmRSYW5nZShDb21iaW5lV29yZFJhbmdlKEdldExhdGluV29yZHNSYW5nZShvbGRwbGFjZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldExhdGluV29yZHNSYW5nZShwbGFjZSkpKTsKKyAgfQorfQorCit2b2lkIENQV0xfRWRpdDo6T25JbnNlcnRXb3JkKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKSB7CisgIGlmIChIYXNGbGFnKFBFU19TUEVMTENIRUNLKSkgeworICAgIG1fcEVkaXQtPlJlZnJlc2hXb3JkUmFuZ2UoQ29tYmluZVdvcmRSYW5nZShHZXRMYXRpbldvcmRzUmFuZ2Uob2xkcGxhY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRMYXRpbldvcmRzUmFuZ2UocGxhY2UpKSk7CisgIH0KK30KKwordm9pZCBDUFdMX0VkaXQ6Ok9uSW5zZXJ0VGV4dChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSkgeworICBpZiAoSGFzRmxhZyhQRVNfU1BFTExDSEVDSykpIHsKKyAgICBtX3BFZGl0LT5SZWZyZXNoV29yZFJhbmdlKENvbWJpbmVXb3JkUmFuZ2UoR2V0TGF0aW5Xb3Jkc1JhbmdlKG9sZHBsYWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0TGF0aW5Xb3Jkc1JhbmdlKHBsYWNlKSkpOworICB9Cit9CisKK0NQVlRfV29yZFJhbmdlIENQV0xfRWRpdDo6Q29tYmluZVdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cjIpIHsKKyAgcmV0dXJuIENQVlRfV29yZFJhbmdlKHN0ZDo6bWluKHdyMS5CZWdpblBvcywgd3IyLkJlZ2luUG9zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWF4KHdyMS5FbmRQb3MsIHdyMi5FbmRQb3MpKTsKK30KKworQ1BWVF9Xb3JkUmFuZ2UgQ1BXTF9FZGl0OjpHZXRMYXRpbldvcmRzUmFuZ2UoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIGNvbnN0IHsKKyAgcmV0dXJuIEdldFNhbWVXb3Jkc1JhbmdlKG1fcEVkaXQtPlNlYXJjaFdvcmRQbGFjZShwb2ludCksIHRydWUsIGZhbHNlKTsKK30KKworQ1BWVF9Xb3JkUmFuZ2UgQ1BXTF9FZGl0OjpHZXRMYXRpbldvcmRzUmFuZ2UoCisgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSBjb25zdCB7CisgIHJldHVybiBHZXRTYW1lV29yZHNSYW5nZShwbGFjZSwgdHJ1ZSwgZmFsc2UpOworfQorCisjZGVmaW5lIFBXTF9JU0FSQUJJQ1dPUkQod29yZCkgXAorICAoKHdvcmQgPj0gMHgwNjAwICYmIHdvcmQgPD0gMHgwNkZGKSB8fCAod29yZCA+PSAweEZCNTAgJiYgd29yZCA8PSAweEZFRkMpKQorCitDUFZUX1dvcmRSYW5nZSBDUFdMX0VkaXQ6OkdldFNhbWVXb3Jkc1JhbmdlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTGF0aW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFyYWJpYykgY29uc3QgeworICBDUFZUX1dvcmRSYW5nZSByYW5nZTsKKworICBDUFdMX0VkaXRJbXBsX0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BFZGl0LT5HZXRJdGVyYXRvcigpOworICBDUFZUX1dvcmQgd29yZGluZm87CisgIENQVlRfV29yZFBsYWNlIHdwU3RhcnQocGxhY2UpLCB3cEVuZChwbGFjZSk7CisgIHBJdGVyYXRvci0+U2V0QXQocGxhY2UpOworCisgIGlmIChiTGF0aW4pIHsKKyAgICB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKSB7CisgICAgICBpZiAoIXBJdGVyYXRvci0+R2V0V29yZCh3b3JkaW5mbykgfHwKKyAgICAgICAgICAhRlhfRURJVF9JU0xBVElOV09SRCh3b3JkaW5mby5Xb3JkKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgd3BFbmQgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgICAgfQorICB9IGVsc2UgaWYgKGJBcmFiaWMpIHsKKyAgICB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKSB7CisgICAgICBpZiAoIXBJdGVyYXRvci0+R2V0V29yZCh3b3JkaW5mbykgfHwgIVBXTF9JU0FSQUJJQ1dPUkQod29yZGluZm8uV29yZCkpCisgICAgICAgIGJyZWFrOworCisgICAgICB3cEVuZCA9IHBJdGVyYXRvci0+R2V0QXQoKTsKKyAgICB9CisgIH0KKworICBwSXRlcmF0b3ItPlNldEF0KHBsYWNlKTsKKworICBpZiAoYkxhdGluKSB7CisgICAgZG8geworICAgICAgaWYgKCFwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pIHx8CisgICAgICAgICAgIUZYX0VESVRfSVNMQVRJTldPUkQod29yZGluZm8uV29yZCkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIHdwU3RhcnQgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgICAgfSB3aGlsZSAocEl0ZXJhdG9yLT5QcmV2V29yZCgpKTsKKyAgfSBlbHNlIGlmIChiQXJhYmljKSB7CisgICAgZG8geworICAgICAgaWYgKCFwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pIHx8ICFQV0xfSVNBUkFCSUNXT1JEKHdvcmRpbmZvLldvcmQpKQorICAgICAgICBicmVhazsKKworICAgICAgd3BTdGFydCA9IHBJdGVyYXRvci0+R2V0QXQoKTsKKyAgICB9IHdoaWxlIChwSXRlcmF0b3ItPlByZXZXb3JkKCkpOworICB9CisKKyAgcmFuZ2UuU2V0KHdwU3RhcnQsIHdwRW5kKTsKKyAgcmV0dXJuIHJhbmdlOworfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9wd2wvY3B3bF9lZGl0LmggYi9mcGRmc2RrL3B3bC9jcHdsX2VkaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjljZDQzCi0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9wd2wvY3B3bF9lZGl0LmgKQEAgLTAsMCArMSwxMzQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGUERGU0RLX1BXTF9DUFdMX0VESVRfSF8KKyNkZWZpbmUgRlBERlNES19QV0xfQ1BXTF9FRElUX0hfCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwdnRfd29yZHJhbmdlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfZWRpdF9jdHJsLmgiCisKKyNkZWZpbmUgUFdMX0NMQVNTTkFNRV9FRElUICJDUFdMX0VkaXQiCisKK2NsYXNzIElQV0xfRmlsbGVyX05vdGlmeSB7CisgcHVibGljOgorICB2aXJ0dWFsIH5JUFdMX0ZpbGxlcl9Ob3RpZnkoKSB7fQorCisgIC8vIE11c3Qgd3JpdGUgdG8gfGJCb3R0b218IGFuZCB8ZlBvcHVwUmV0fC4KKyAgdmlydHVhbCB2b2lkIFF1ZXJ5V2hlcmVQb3B1cChDUFdMX1duZDo6UHJpdmF0ZURhdGEqIHBBdHRhY2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmUG9wdXBNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZlBvcHVwTWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGJCb3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZQb3B1cFJldCkgPSAwOworICB2aXJ0dWFsIHN0ZDo6cGFpcjxib29sLCBib29sPiBPbkJlZm9yZUtleVN0cm9rZSgKKyAgICAgIENQV0xfV25kOjpQcml2YXRlRGF0YSogcEF0dGFjaGVkLAorICAgICAgV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAorICAgICAgY29uc3QgV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCisgICAgICBpbnQgblNlbFN0YXJ0LAorICAgICAgaW50IG5TZWxFbmQsCisgICAgICBib29sIGJLZXlEb3duLAorICAgICAgdWludDMyX3QgbkZsYWcpID0gMDsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICB2aXJ0dWFsIGJvb2wgT25Qb3B1cFByZU9wZW4oQ1BXTF9XbmQ6OlByaXZhdGVEYXRhKiBwQXR0YWNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuRmxhZykgPSAwOworICB2aXJ0dWFsIGJvb2wgT25Qb3B1cFBvc3RPcGVuKENQV0xfV25kOjpQcml2YXRlRGF0YSogcEF0dGFjaGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFnKSA9IDA7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCit9OworCitjbGFzcyBDUFdMX0VkaXQgOiBwdWJsaWMgQ1BXTF9FZGl0Q3RybCB7CisgcHVibGljOgorICBDUFdMX0VkaXQoKTsKKyAgfkNQV0xfRWRpdCgpIG92ZXJyaWRlOworCisgIC8vIENQV0xfRWRpdEN0cmwKKyAgQnl0ZVN0cmluZyBHZXRDbGFzc05hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBPbkNyZWF0ZWQoKSBvdmVycmlkZTsKKyAgYm9vbCBSZVBvc0NoaWxkV25kKCkgb3ZlcnJpZGU7CisgIENGWF9GbG9hdFJlY3QgR2V0Q2xpZW50UmVjdCgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIERyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtdFVzZXIyRGV2aWNlKSBvdmVycmlkZTsKKyAgYm9vbCBPbkxCdXR0b25Eb3duKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgb3ZlcnJpZGU7CisgIGJvb2wgT25MQnV0dG9uRGJsQ2xrKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgb3ZlcnJpZGU7CisgIGJvb2wgT25SQnV0dG9uVXAoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKKyAgYm9vbCBPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOworICBib29sIE9uS2V5RG93bih1aW50MTZfdCBuQ2hhciwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOworICBib29sIE9uQ2hhcih1aW50MTZfdCBuQ2hhciwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOworICBDRlhfRmxvYXRSZWN0IEdldEZvY3VzUmVjdCgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIE9uU2V0Rm9jdXMoKSBvdmVycmlkZTsKKyAgdm9pZCBPbktpbGxGb2N1cygpIG92ZXJyaWRlOworCisgIHZvaWQgU2V0QWxpZ25Gb3JtYXRWKFBXTF9FRElUX0FMSUdORk9STUFUX1YgbkZvcm1hdCA9IFBFQVZfVE9QLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJQYWludCA9IHRydWUpOyAgLy8gMDp0b3AgMTpib3R0b20gMjpjZW50ZXIKKworICB2b2lkIFNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXkpOworICB2b2lkIFNldExpbWl0Q2hhcihpbnQzMl90IG5MaW1pdENoYXIpOworCisgIHZvaWQgU2V0Q2hhclNwYWNlKGZsb2F0IGZDaGFyU3BhY2UpOworCisgIGJvb2wgQ2FuU2VsZWN0QWxsKCkgY29uc3Q7CisgIGJvb2wgQ2FuQ29weSgpIGNvbnN0OworICBib29sIENhbkN1dCgpIGNvbnN0OworCisgIHZvaWQgQ3V0VGV4dCgpOworCisgIHZvaWQgU2V0VGV4dChjb25zdCBXaWRlU3RyaW5nJiBjc1RleHQpOworICB2b2lkIFJlcGxhY2VTZWwoY29uc3QgV2lkZVN0cmluZyYgY3NUZXh0KTsKKworICBib29sIElzVGV4dEZ1bGwoKSBjb25zdDsKKworICBzdGF0aWMgZmxvYXQgR2V0Q2hhckFycmF5QXV0b0ZvbnRTaXplKENQREZfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNQbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFyQXJyYXkpOworCisgIHZvaWQgU2V0RmlsbGVyTm90aWZ5KElQV0xfRmlsbGVyX05vdGlmeSogcE5vdGlmeSkgeworICAgIG1fcEZpbGxlck5vdGlmeSA9IHBOb3RpZnk7CisgIH0KKworICB2b2lkIEF0dGFjaEZGTERhdGEoQ0ZGTF9Gb3JtRmlsbGVyKiBwRGF0YSkgeyBtX3BGb3JtRmlsbGVyID0gcERhdGE7IH0KKworICB2b2lkIE9uSW5zZXJ0V29yZChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSk7CisgIHZvaWQgT25JbnNlcnRSZXR1cm4oY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBvbGRwbGFjZSk7CisgIHZvaWQgT25CYWNrU3BhY2UoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLCBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpOworICB2b2lkIE9uRGVsZXRlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKTsKKyAgdm9pZCBPbkNsZWFyKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIG9sZHBsYWNlKTsKKyAgdm9pZCBPbkluc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgb2xkcGxhY2UpOworCisgcHJpdmF0ZToKKyAgLy8gSW4gY2FzZSBvZiBpbXBsZW1lbnRhdGlvbiBzd2FsbG93IHRoZSBPbktleURvd24gZXZlbnQuIElmIHRoZSBldmVudCBpcworICAvLyBzd2FsbG93ZWQsIGltcGxlbWVudGF0aW9uIG1heSBkbyBvdGhlciB1bmV4cGVjdGVkIHRoaW5ncywgd2hpY2ggaXMgbm90IHRoZQorICAvLyBjb250cm9sIG1lYW5zIHRvIGRvLgorICBzdGF0aWMgYm9vbCBJc1Byb2NlZWR0b09uQ2hhcih1aW50MTZfdCBuS2V5Q29kZSwgdWludDMyX3QgbkZsYWcpOworCisgIENQVlRfV29yZFJhbmdlIEdldFNlbGVjdFdvcmRSYW5nZSgpIGNvbnN0OworICBib29sIElzVlNjcm9sbEJhclZpc2libGUoKSBjb25zdDsKKyAgdm9pZCBTZXRQYXJhbUJ5RmxhZygpOworCisgIGZsb2F0IEdldENoYXJBcnJheUF1dG9Gb250U2l6ZShpbnQzMl90IG5DaGFyQXJyYXkpOworICBDRlhfUG9pbnRGIEdldFdvcmRSaWdodEJvdHRvbVBvaW50KGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cFdvcmQpOworCisgIENQVlRfV29yZFJhbmdlIENvbWJpbmVXb3JkUmFuZ2UoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IyKTsKKyAgQ1BWVF9Xb3JkUmFuZ2UgR2V0TGF0aW5Xb3Jkc1JhbmdlKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBjb25zdDsKKyAgQ1BWVF9Xb3JkUmFuZ2UgR2V0TGF0aW5Xb3Jkc1JhbmdlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSkgY29uc3Q7CisgIENQVlRfV29yZFJhbmdlIEdldFNhbWVXb3Jkc1JhbmdlKGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTGF0aW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFyYWJpYykgY29uc3Q7CisKKyAgYm9vbCBtX2JGb2N1czsKKyAgQ0ZYX0Zsb2F0UmVjdCBtX3JjT2xkV2luZG93OworICBVbm93bmVkUHRyPElQV0xfRmlsbGVyX05vdGlmeT4gbV9wRmlsbGVyTm90aWZ5OworICBVbm93bmVkUHRyPENGRkxfRm9ybUZpbGxlcj4gbV9wRm9ybUZpbGxlcjsKK307CisKKyNlbmRpZiAgLy8gRlBERlNES19QV0xfQ1BXTF9FRElUX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3B3bC9jcHdsX2VkaXRfY3RybC5jcHAgYi9mcGRmc2RrL3B3bC9jcHdsX2VkaXRfY3RybC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZiNWRlZAotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvcHdsL2Nwd2xfZWRpdF9jdHJsLmNwcApAQCAtMCwwICsxLDQzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF9lZGl0X2N0cmwuaCIKKworI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcHZ0X3dvcmQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZm9udC5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfY2FyZXQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX2VkaXRfaW1wbC5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfZm9udF9tYXAuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX3Njcm9sbF9iYXIuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX3duZC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2Z3bGV2ZW50LmgiCisKK0NQV0xfRWRpdEN0cmw6OkNQV0xfRWRpdEN0cmwoKQorICAgIDogbV9wRWRpdChuZXcgQ1BXTF9FZGl0SW1wbCksCisgICAgICBtX3BFZGl0Q2FyZXQobnVsbHB0ciksCisgICAgICBtX2JNb3VzZURvd24oZmFsc2UpLAorICAgICAgbV9uQ2hhclNldChGWF9DSEFSU0VUX0RlZmF1bHQpIHt9CisKK0NQV0xfRWRpdEN0cmw6On5DUFdMX0VkaXRDdHJsKCkge30KKwordm9pZCBDUFdMX0VkaXRDdHJsOjpPbkNyZWF0ZShDcmVhdGVQYXJhbXMqIHBQYXJhbXNUb0FkanVzdCkgeworICBwUGFyYW1zVG9BZGp1c3QtPmVDdXJzb3JUeXBlID0gRlhDVF9WQkVBTTsKK30KKwordm9pZCBDUFdMX0VkaXRDdHJsOjpPbkNyZWF0ZWQoKSB7CisgIFNldEZvbnRTaXplKEdldENyZWF0aW9uUGFyYW1zKCkuZkZvbnRTaXplKTsKKworICBtX3BFZGl0LT5TZXRGb250TWFwKEdldEZvbnRNYXAoKSk7CisgIG1fcEVkaXQtPlNldE5vdGlmeSh0aGlzKTsKKyAgbV9wRWRpdC0+SW5pdGlhbGl6ZSgpOworfQorCitib29sIENQV0xfRWRpdEN0cmw6OklzV25kSG9yVigpIHsKKyAgQ0ZYX01hdHJpeCBtdCA9IEdldFdpbmRvd01hdHJpeCgpOworICByZXR1cm4gbXQuVHJhbnNmb3JtKENGWF9Qb2ludEYoMSwgMSkpLnkgPT0gbXQuVHJhbnNmb3JtKENGWF9Qb2ludEYoMCwgMSkpLnk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0Q3Vyc29yKCkgeworICBpZiAoSXNWYWxpZCgpKSB7CisgICAgaWYgKENGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCkpIHsKKyAgICAgIGlmIChJc1duZEhvclYoKSkKKyAgICAgICAgcFNILT5TZXRDdXJzb3IoRlhDVF9WQkVBTSk7CisgICAgICBlbHNlCisgICAgICAgIHBTSC0+U2V0Q3Vyc29yKEZYQ1RfSEJFQU0pOworICAgIH0KKyAgfQorfQorCitXaWRlU3RyaW5nIENQV0xfRWRpdEN0cmw6OkdldFNlbGVjdGVkVGV4dCgpIHsKKyAgaWYgKG1fcEVkaXQpCisgICAgcmV0dXJuIG1fcEVkaXQtPkdldFNlbGVjdGVkVGV4dCgpOworCisgIHJldHVybiBXaWRlU3RyaW5nKCk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6UmVwbGFjZVNlbGVjdGlvbihjb25zdCBXaWRlU3RyaW5nJiB0ZXh0KSB7CisgIGlmICghbV9wRWRpdCkKKyAgICByZXR1cm47CisKKyAgbV9wRWRpdC0+Q2xlYXJTZWxlY3Rpb24oKTsKKyAgbV9wRWRpdC0+SW5zZXJ0VGV4dCh0ZXh0LCBGWF9DSEFSU0VUX0RlZmF1bHQpOworfQorCitib29sIENQV0xfRWRpdEN0cmw6OlJlUG9zQ2hpbGRXbmQoKSB7CisgIG1fcEVkaXQtPlNldFBsYXRlUmVjdChHZXRDbGllbnRSZWN0KCkpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDUFdMX0VkaXRDdHJsOjpTZXRTY3JvbGxJbmZvKGNvbnN0IFBXTF9TQ1JPTExfSU5GTyYgaW5mbykgeworICBpZiAoQ1BXTF9XbmQqIHBDaGlsZCA9IEdldFZTY3JvbGxCYXIoKSkKKyAgICBwQ2hpbGQtPlNldFNjcm9sbEluZm8oaW5mbyk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0U2Nyb2xsUG9zaXRpb24oZmxvYXQgcG9zKSB7CisgIGlmIChDUFdMX1duZCogcENoaWxkID0gR2V0VlNjcm9sbEJhcigpKQorICAgIHBDaGlsZC0+U2V0U2Nyb2xsUG9zaXRpb24ocG9zKTsKK30KKwordm9pZCBDUFdMX0VkaXRDdHJsOjpTY3JvbGxXaW5kb3dWZXJ0aWNhbGx5KGZsb2F0IHBvcykgeworICBtX3BFZGl0LT5TZXRTY3JvbGxQb3MoQ0ZYX1BvaW50RihtX3BFZGl0LT5HZXRTY3JvbGxQb3MoKS54LCBwb3MpKTsKK30KKwordm9pZCBDUFdMX0VkaXRDdHJsOjpDcmVhdGVDaGlsZFduZChjb25zdCBDcmVhdGVQYXJhbXMmIGNwKSB7CisgIGlmICghSXNSZWFkT25seSgpKQorICAgIENyZWF0ZUVkaXRDYXJldChjcCk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6Q3JlYXRlRWRpdENhcmV0KGNvbnN0IENyZWF0ZVBhcmFtcyYgY3ApIHsKKyAgaWYgKG1fcEVkaXRDYXJldCkKKyAgICByZXR1cm47CisKKyAgbV9wRWRpdENhcmV0ID0gbmV3IENQV0xfQ2FyZXQ7CisgIG1fcEVkaXRDYXJldC0+U2V0SW52YWxpZFJlY3QoR2V0Q2xpZW50UmVjdCgpKTsKKworICBDcmVhdGVQYXJhbXMgZWNwID0gY3A7CisgIGVjcC5wUGFyZW50V25kID0gdGhpczsKKyAgZWNwLmR3RmxhZ3MgPSBQV1NfQ0hJTEQgfCBQV1NfTk9SRUZSRVNIQ0xJUDsKKyAgZWNwLmR3Qm9yZGVyV2lkdGggPSAwOworICBlY3AubkJvcmRlclN0eWxlID0gQm9yZGVyU3R5bGU6OlNPTElEOworICBlY3AucmNSZWN0V25kID0gQ0ZYX0Zsb2F0UmVjdCgpOworCisgIG1fcEVkaXRDYXJldC0+Q3JlYXRlKGVjcCk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0Rm9udFNpemUoZmxvYXQgZkZvbnRTaXplKSB7CisgIG1fcEVkaXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7Cit9CisKK2Zsb2F0IENQV0xfRWRpdEN0cmw6OkdldEZvbnRTaXplKCkgY29uc3QgeworICByZXR1cm4gbV9wRWRpdC0+R2V0Rm9udFNpemUoKTsKK30KKworYm9vbCBDUFdMX0VkaXRDdHJsOjpPbktleURvd24odWludDE2X3QgbkNoYXIsIHVpbnQzMl90IG5GbGFnKSB7CisgIGlmIChtX2JNb3VzZURvd24pCisgICAgcmV0dXJuIHRydWU7CisKKyAgYm9vbCBiUmV0ID0gQ1BXTF9XbmQ6Ok9uS2V5RG93bihuQ2hhciwgbkZsYWcpOworCisgIC8vIEZJTFRFUgorICBzd2l0Y2ggKG5DaGFyKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIEZXTF9WS0VZX0RlbGV0ZToKKyAgICBjYXNlIEZXTF9WS0VZX1VwOgorICAgIGNhc2UgRldMX1ZLRVlfRG93bjoKKyAgICBjYXNlIEZXTF9WS0VZX0xlZnQ6CisgICAgY2FzZSBGV0xfVktFWV9SaWdodDoKKyAgICBjYXNlIEZXTF9WS0VZX0hvbWU6CisgICAgY2FzZSBGV0xfVktFWV9FbmQ6CisgICAgY2FzZSBGV0xfVktFWV9JbnNlcnQ6CisgICAgY2FzZSAnQyc6CisgICAgY2FzZSAnVic6CisgICAgY2FzZSAnWCc6CisgICAgY2FzZSAnQSc6CisgICAgY2FzZSAnWic6CisgICAgY2FzZSAnYyc6CisgICAgY2FzZSAndic6CisgICAgY2FzZSAneCc6CisgICAgY2FzZSAnYSc6CisgICAgY2FzZSAneic6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChuQ2hhciA9PSBGV0xfVktFWV9EZWxldGUgJiYgbV9wRWRpdC0+SXNTZWxlY3RlZCgpKQorICAgIG5DaGFyID0gRldMX1ZLRVlfVW5rbm93bjsKKworICBzd2l0Y2ggKG5DaGFyKSB7CisgICAgY2FzZSBGV0xfVktFWV9EZWxldGU6CisgICAgICBEZWxldGUoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgRldMX1ZLRVlfSW5zZXJ0OgorICAgICAgaWYgKElzU0hJRlRwcmVzc2VkKG5GbGFnKSkKKyAgICAgICAgUGFzdGVUZXh0KCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIEZXTF9WS0VZX1VwOgorICAgICAgbV9wRWRpdC0+T25WS19VUChJc1NISUZUcHJlc3NlZChuRmxhZyksIGZhbHNlKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgRldMX1ZLRVlfRG93bjoKKyAgICAgIG1fcEVkaXQtPk9uVktfRE9XTihJc1NISUZUcHJlc3NlZChuRmxhZyksIGZhbHNlKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgRldMX1ZLRVlfTGVmdDoKKyAgICAgIG1fcEVkaXQtPk9uVktfTEVGVChJc1NISUZUcHJlc3NlZChuRmxhZyksIGZhbHNlKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgRldMX1ZLRVlfUmlnaHQ6CisgICAgICBtX3BFZGl0LT5PblZLX1JJR0hUKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgZmFsc2UpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBGV0xfVktFWV9Ib21lOgorICAgICAgbV9wRWRpdC0+T25WS19IT01FKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBGV0xfVktFWV9FbmQ6CisgICAgICBtX3BFZGl0LT5PblZLX0VORChJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgRldMX1ZLRVlfVW5rbm93bjoKKyAgICAgIGlmICghSXNTSElGVHByZXNzZWQobkZsYWcpKQorICAgICAgICBDbGVhclNlbGVjdGlvbigpOworICAgICAgZWxzZQorICAgICAgICBDdXRUZXh0KCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gYlJldDsKK30KKworYm9vbCBDUFdMX0VkaXRDdHJsOjpPbkNoYXIodWludDE2X3QgbkNoYXIsIHVpbnQzMl90IG5GbGFnKSB7CisgIGlmIChtX2JNb3VzZURvd24pCisgICAgcmV0dXJuIHRydWU7CisKKyAgQ1BXTF9XbmQ6Ok9uQ2hhcihuQ2hhciwgbkZsYWcpOworCisgIC8vIEZJTFRFUgorICBzd2l0Y2ggKG5DaGFyKSB7CisgICAgY2FzZSAweDBBOgorICAgIGNhc2UgMHgxQjoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBib29sIGJDdHJsID0gSXNDVFJMcHJlc3NlZChuRmxhZyk7CisgIGJvb2wgYkFsdCA9IElzQUxUcHJlc3NlZChuRmxhZyk7CisgIGJvb2wgYlNoaWZ0ID0gSXNTSElGVHByZXNzZWQobkZsYWcpOworCisgIHVpbnQxNl90IHdvcmQgPSBuQ2hhcjsKKworICBpZiAoYkN0cmwgJiYgIWJBbHQpIHsKKyAgICBzd2l0Y2ggKG5DaGFyKSB7CisgICAgICBjYXNlICdDJyAtICdBJyArIDE6CisgICAgICAgIENvcHlUZXh0KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgY2FzZSAnVicgLSAnQScgKyAxOgorICAgICAgICBQYXN0ZVRleHQoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBjYXNlICdYJyAtICdBJyArIDE6CisgICAgICAgIEN1dFRleHQoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBjYXNlICdBJyAtICdBJyArIDE6CisgICAgICAgIFNlbGVjdEFsbCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGNhc2UgJ1onIC0gJ0EnICsgMToKKyAgICAgICAgaWYgKGJTaGlmdCkKKyAgICAgICAgICBSZWRvKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBVbmRvKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKG5DaGFyIDwgMzIpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIGlmIChJc1JlYWRPbmx5KCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKG1fcEVkaXQtPklzU2VsZWN0ZWQoKSAmJiB3b3JkID09IEZXTF9WS0VZX0JhY2spCisgICAgd29yZCA9IEZXTF9WS0VZX1Vua25vd247CisKKyAgQ2xlYXJTZWxlY3Rpb24oKTsKKworICBzd2l0Y2ggKHdvcmQpIHsKKyAgICBjYXNlIEZXTF9WS0VZX0JhY2s6CisgICAgICBCYWNrc3BhY2UoKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRldMX1ZLRVlfUmV0dXJuOgorICAgICAgSW5zZXJ0UmV0dXJuKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZXTF9WS0VZX1Vua25vd246CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgSW5zZXJ0V29yZCh3b3JkLCBHZXRDaGFyU2V0KCkpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDUFdMX0VkaXRDdHJsOjpPbkxCdXR0b25Eb3duKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgeworICBDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCwgbkZsYWcpOworCisgIGlmIChDbGllbnRIaXRUZXN0KHBvaW50KSkgeworICAgIGlmIChtX2JNb3VzZURvd24gJiYgIUludmFsaWRhdGVSZWN0KG51bGxwdHIpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBtX2JNb3VzZURvd24gPSB0cnVlOworICAgIFNldENhcHR1cmUoKTsKKworICAgIG1fcEVkaXQtPk9uTW91c2VEb3duKHBvaW50LCBJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIENQV0xfRWRpdEN0cmw6Ok9uTEJ1dHRvblVwKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgeworICBDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKKworICBpZiAobV9iTW91c2VEb3duKSB7CisgICAgLy8gY2FuIHJlY2VpdmUga2V5Ym9yZCBtZXNzYWdlCisgICAgaWYgKENsaWVudEhpdFRlc3QocG9pbnQpICYmICFJc0ZvY3VzZWQoKSkKKyAgICAgIFNldEZvY3VzKCk7CisKKyAgICBSZWxlYXNlQ2FwdHVyZSgpOworICAgIG1fYk1vdXNlRG93biA9IGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1BXTF9FZGl0Q3RybDo6T25Nb3VzZU1vdmUoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSB7CisgIENQV0xfV25kOjpPbk1vdXNlTW92ZShwb2ludCwgbkZsYWcpOworCisgIGlmIChtX2JNb3VzZURvd24pCisgICAgbV9wRWRpdC0+T25Nb3VzZU1vdmUocG9pbnQsIGZhbHNlLCBmYWxzZSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0RWRpdENhcmV0KGJvb2wgYlZpc2libGUpIHsKKyAgQ0ZYX1BvaW50RiBwdEhlYWQ7CisgIENGWF9Qb2ludEYgcHRGb290OworICBpZiAoYlZpc2libGUpCisgICAgR2V0Q2FyZXRJbmZvKCZwdEhlYWQsICZwdEZvb3QpOworCisgIFNldENhcmV0KGJWaXNpYmxlLCBwdEhlYWQsIHB0Rm9vdCk7CisgIC8vIE5vdGUsIHx0aGlzfCBtYXkgbm8gbG9uZ2VyIGJlIHZpYWJsZSBhdCB0aGlzIHBvaW50LiBJZiBtb3JlIHdvcmsgbmVlZHMgdG8KKyAgLy8gYmUgZG9uZSwgY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvZiBTZXRDYXJldCgpLgorfQorCit2b2lkIENQV0xfRWRpdEN0cmw6OkdldENhcmV0SW5mbyhDRlhfUG9pbnRGKiBwdEhlYWQsIENGWF9Qb2ludEYqIHB0Rm9vdCkgY29uc3QgeworICBDUFdMX0VkaXRJbXBsX0l0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BFZGl0LT5HZXRJdGVyYXRvcigpOworICBwSXRlcmF0b3ItPlNldEF0KG1fcEVkaXQtPkdldENhcmV0KCkpOworICBDUFZUX1dvcmQgd29yZDsKKyAgQ1BWVF9MaW5lIGxpbmU7CisgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKKyAgICBwdEhlYWQtPnggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7CisgICAgcHRIZWFkLT55ID0gd29yZC5wdFdvcmQueSArIHdvcmQuZkFzY2VudDsKKyAgICBwdEZvb3QtPnggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7CisgICAgcHRGb290LT55ID0gd29yZC5wdFdvcmQueSArIHdvcmQuZkRlc2NlbnQ7CisgIH0gZWxzZSBpZiAocEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpKSB7CisgICAgcHRIZWFkLT54ID0gbGluZS5wdExpbmUueDsKKyAgICBwdEhlYWQtPnkgPSBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZUFzY2VudDsKKyAgICBwdEZvb3QtPnggPSBsaW5lLnB0TGluZS54OworICAgIHB0Rm9vdC0+eSA9IGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lRGVzY2VudDsKKyAgfQorfQorCitib29sIENQV0xfRWRpdEN0cmw6OlNldENhcmV0KGJvb2wgYlZpc2libGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0SGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHRGb290KSB7CisgIGlmICghbV9wRWRpdENhcmV0KQorICAgIHJldHVybiB0cnVlOworCisgIGlmICghSXNGb2N1c2VkKCkgfHwgbV9wRWRpdC0+SXNTZWxlY3RlZCgpKQorICAgIGJWaXNpYmxlID0gZmFsc2U7CisKKyAgT2JzZXJ2ZWRQdHIgdGhpc09ic2VydmVkKHRoaXMpOworICBtX3BFZGl0Q2FyZXQtPlNldENhcmV0KGJWaXNpYmxlLCBwdEhlYWQsIHB0Rm9vdCk7CisgIGlmICghdGhpc09ic2VydmVkKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworV2lkZVN0cmluZyBDUFdMX0VkaXRDdHJsOjpHZXRUZXh0KCkgY29uc3QgeworICByZXR1cm4gbV9wRWRpdC0+R2V0VGV4dCgpOworfQorCit2b2lkIENQV0xfRWRpdEN0cmw6OlNldFNlbGVjdGlvbihpbnQzMl90IG5TdGFydENoYXIsIGludDMyX3QgbkVuZENoYXIpIHsKKyAgbV9wRWRpdC0+U2V0U2VsZWN0aW9uKG5TdGFydENoYXIsIG5FbmRDaGFyKTsKK30KKwordm9pZCBDUFdMX0VkaXRDdHJsOjpHZXRTZWxlY3Rpb24oaW50MzJfdCYgblN0YXJ0Q2hhciwgaW50MzJfdCYgbkVuZENoYXIpIGNvbnN0IHsKKyAgbV9wRWRpdC0+R2V0U2VsZWN0aW9uKG5TdGFydENoYXIsIG5FbmRDaGFyKTsKK30KKwordm9pZCBDUFdMX0VkaXRDdHJsOjpDbGVhclNlbGVjdGlvbigpIHsKKyAgaWYgKCFJc1JlYWRPbmx5KCkpCisgICAgbV9wRWRpdC0+Q2xlYXJTZWxlY3Rpb24oKTsKK30KKwordm9pZCBDUFdMX0VkaXRDdHJsOjpTZWxlY3RBbGwoKSB7CisgIG1fcEVkaXQtPlNlbGVjdEFsbCgpOworfQorCit2b2lkIENQV0xfRWRpdEN0cmw6OlNldFNjcm9sbFBvcyhjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICBtX3BFZGl0LT5TZXRTY3JvbGxQb3MocG9pbnQpOworfQorCitDRlhfUG9pbnRGIENQV0xfRWRpdEN0cmw6OkdldFNjcm9sbFBvcygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEVkaXQtPkdldFNjcm9sbFBvcygpOworfQorCit2b2lkIENQV0xfRWRpdEN0cmw6OkNvcHlUZXh0KCkge30KKwordm9pZCBDUFdMX0VkaXRDdHJsOjpQYXN0ZVRleHQoKSB7fQorCit2b2lkIENQV0xfRWRpdEN0cmw6OkN1dFRleHQoKSB7fQorCit2b2lkIENQV0xfRWRpdEN0cmw6Okluc2VydFdvcmQodWludDE2X3Qgd29yZCwgaW50MzJfdCBuQ2hhcnNldCkgeworICBpZiAoIUlzUmVhZE9ubHkoKSkKKyAgICBtX3BFZGl0LT5JbnNlcnRXb3JkKHdvcmQsIG5DaGFyc2V0KTsKK30KKwordm9pZCBDUFdMX0VkaXRDdHJsOjpJbnNlcnRSZXR1cm4oKSB7CisgIGlmICghSXNSZWFkT25seSgpKQorICAgIG1fcEVkaXQtPkluc2VydFJldHVybigpOworfQorCit2b2lkIENQV0xfRWRpdEN0cmw6OkRlbGV0ZSgpIHsKKyAgaWYgKCFJc1JlYWRPbmx5KCkpCisgICAgbV9wRWRpdC0+RGVsZXRlKCk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6QmFja3NwYWNlKCkgeworICBpZiAoIUlzUmVhZE9ubHkoKSkKKyAgICBtX3BFZGl0LT5CYWNrc3BhY2UoKTsKK30KKworYm9vbCBDUFdMX0VkaXRDdHJsOjpDYW5VbmRvKCkgY29uc3QgeworICByZXR1cm4gIUlzUmVhZE9ubHkoKSAmJiBtX3BFZGl0LT5DYW5VbmRvKCk7Cit9CisKK2Jvb2wgQ1BXTF9FZGl0Q3RybDo6Q2FuUmVkbygpIGNvbnN0IHsKKyAgcmV0dXJuICFJc1JlYWRPbmx5KCkgJiYgbV9wRWRpdC0+Q2FuUmVkbygpOworfQorCit2b2lkIENQV0xfRWRpdEN0cmw6OlJlZG8oKSB7CisgIGlmIChDYW5SZWRvKCkpCisgICAgbV9wRWRpdC0+UmVkbygpOworfQorCit2b2lkIENQV0xfRWRpdEN0cmw6OlVuZG8oKSB7CisgIGlmIChDYW5VbmRvKCkpCisgICAgbV9wRWRpdC0+VW5kbygpOworfQorCitpbnQzMl90IENQV0xfRWRpdEN0cmw6OkdldENoYXJTZXQoKSBjb25zdCB7CisgIHJldHVybiBtX25DaGFyU2V0IDwgMCA/IEZYX0NIQVJTRVRfRGVmYXVsdCA6IG1fbkNoYXJTZXQ7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0Q3RybDo6U2V0UmVhZHlUb0lucHV0KCkgeworICBpZiAobV9iTW91c2VEb3duKSB7CisgICAgUmVsZWFzZUNhcHR1cmUoKTsKKyAgICBtX2JNb3VzZURvd24gPSBmYWxzZTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9wd2wvY3B3bF9lZGl0X2N0cmwuaCBiL2ZwZGZzZGsvcHdsL2Nwd2xfZWRpdF9jdHJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzExNDBlMwotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvcHdsL2Nwd2xfZWRpdF9jdHJsLmgKQEAgLTAsMCArMSw5NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZQREZTREtfUFdMX0NQV0xfRURJVF9DVFJMX0hfCisjZGVmaW5lIEZQREZTREtfUFdMX0NQV0xfRURJVF9DVFJMX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfd25kLmgiCisKK2NsYXNzIENQV0xfRWRpdEltcGw7CitjbGFzcyBDUFdMX0NhcmV0Oworc3RydWN0IENQVlRfV29yZFBsYWNlOworCitlbnVtIFBXTF9FRElUX0FMSUdORk9STUFUX0ggeyBQRUFIX0xFRlQgPSAwLCBQRUFIX01JRERMRSwgUEVBSF9SSUdIVCB9OworCitlbnVtIFBXTF9FRElUX0FMSUdORk9STUFUX1YgeyBQRUFWX1RPUCA9IDAsIFBFQVZfQ0VOVEVSLCBQRUFWX0JPVFRPTSB9OworCitjbGFzcyBDUFdMX0VkaXRDdHJsIDogcHVibGljIENQV0xfV25kIHsKKyBwdWJsaWM6CisgIENQV0xfRWRpdEN0cmwoKTsKKyAgfkNQV0xfRWRpdEN0cmwoKSBvdmVycmlkZTsKKworICBXaWRlU3RyaW5nIEdldFRleHQoKSBjb25zdDsKKyAgdm9pZCBTZXRTZWxlY3Rpb24oaW50MzJfdCBuU3RhcnRDaGFyLCBpbnQzMl90IG5FbmRDaGFyKTsKKyAgdm9pZCBHZXRTZWxlY3Rpb24oaW50MzJfdCYgblN0YXJ0Q2hhciwgaW50MzJfdCYgbkVuZENoYXIpIGNvbnN0OworICB2b2lkIENsZWFyU2VsZWN0aW9uKCk7CisgIHZvaWQgU2VsZWN0QWxsKCk7CisKKyAgQ0ZYX1BvaW50RiBHZXRTY3JvbGxQb3MoKSBjb25zdDsKKyAgdm9pZCBTZXRTY3JvbGxQb3MoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOworCisgIHZvaWQgU2V0Q2hhclNldCh1aW50OF90IG5DaGFyU2V0KSB7IG1fbkNoYXJTZXQgPSBuQ2hhclNldDsgfQorICBpbnQzMl90IEdldENoYXJTZXQoKSBjb25zdDsKKworICBib29sIENhblVuZG8oKSBjb25zdDsKKyAgYm9vbCBDYW5SZWRvKCkgY29uc3Q7CisgIHZvaWQgUmVkbygpOworICB2b2lkIFVuZG8oKTsKKworICB2b2lkIFNldFJlYWR5VG9JbnB1dCgpOworCisgIC8vIENQV0xfV25kOgorICB2b2lkIE9uQ3JlYXRlKENyZWF0ZVBhcmFtcyogcFBhcmFtc1RvQWRqdXN0KSBvdmVycmlkZTsKKyAgdm9pZCBPbkNyZWF0ZWQoKSBvdmVycmlkZTsKKyAgYm9vbCBPbktleURvd24odWludDE2X3QgbkNoYXIsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKKyAgYm9vbCBPbkNoYXIodWludDE2X3QgbkNoYXIsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKKyAgYm9vbCBPbkxCdXR0b25Eb3duKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgb3ZlcnJpZGU7CisgIGJvb2wgT25MQnV0dG9uVXAoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKKyAgYm9vbCBPbk1vdXNlTW92ZShjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOworICB2b2lkIFNldFNjcm9sbEluZm8oY29uc3QgUFdMX1NDUk9MTF9JTkZPJiBpbmZvKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRTY3JvbGxQb3NpdGlvbihmbG9hdCBwb3MpIG92ZXJyaWRlOworICB2b2lkIFNjcm9sbFdpbmRvd1ZlcnRpY2FsbHkoZmxvYXQgcG9zKSBvdmVycmlkZTsKKyAgdm9pZCBDcmVhdGVDaGlsZFduZChjb25zdCBDcmVhdGVQYXJhbXMmIGNwKSBvdmVycmlkZTsKKyAgYm9vbCBSZVBvc0NoaWxkV25kKCkgb3ZlcnJpZGU7CisgIHZvaWQgU2V0Rm9udFNpemUoZmxvYXQgZkZvbnRTaXplKSBvdmVycmlkZTsKKyAgZmxvYXQgR2V0Rm9udFNpemUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBTZXRDdXJzb3IoKSBvdmVycmlkZTsKKyAgV2lkZVN0cmluZyBHZXRTZWxlY3RlZFRleHQoKSBvdmVycmlkZTsKKyAgdm9pZCBSZXBsYWNlU2VsZWN0aW9uKGNvbnN0IFdpZGVTdHJpbmcmIHRleHQpIG92ZXJyaWRlOworCisgIGJvb2wgU2V0Q2FyZXQoYm9vbCBiVmlzaWJsZSwKKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdEhlYWQsCisgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHRGb290KTsKKworIHByb3RlY3RlZDoKKyAgdm9pZCBDb3B5VGV4dCgpOworICB2b2lkIFBhc3RlVGV4dCgpOworICB2b2lkIEN1dFRleHQoKTsKKyAgdm9pZCBJbnNlcnRXb3JkKHVpbnQxNl90IHdvcmQsIGludDMyX3QgbkNoYXJzZXQpOworICB2b2lkIEluc2VydFJldHVybigpOworCisgIGJvb2wgSXNXbmRIb3JWKCk7CisKKyAgdm9pZCBEZWxldGUoKTsKKyAgdm9pZCBCYWNrc3BhY2UoKTsKKworICB2b2lkIEdldENhcmV0SW5mbyhDRlhfUG9pbnRGKiBwdEhlYWQsIENGWF9Qb2ludEYqIHB0Rm9vdCkgY29uc3Q7CisKKyAgdm9pZCBTZXRFZGl0Q2FyZXQoYm9vbCBiVmlzaWJsZSk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPENQV0xfRWRpdEltcGw+IG1fcEVkaXQ7CisgIENQV0xfQ2FyZXQqIG1fcEVkaXRDYXJldDsKKyAgYm9vbCBtX2JNb3VzZURvd247CisKKyBwcml2YXRlOgorICB2b2lkIENyZWF0ZUVkaXRDYXJldChjb25zdCBDcmVhdGVQYXJhbXMmIGNwKTsKKworICBpbnQzMl90IG1fbkNoYXJTZXQ7Cit9OworCisjZW5kaWYgIC8vIEZQREZTREtfUFdMX0NQV0xfRURJVF9DVFJMX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3B3bC9jcHdsX2VkaXRfZW1iZWRkZXJ0ZXN0LmNwcCBiL2ZwZGZzZGsvcHdsL2Nwd2xfZWRpdF9lbWJlZGRlcnRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZjBkNWQKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL3B3bC9jcHdsX2VkaXRfZW1iZWRkZXJ0ZXN0LmNwcApAQCAtMCwwICsxLDQyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiZnBkZnNkay9jYmFfYW5ub3RpdGVyYXRvci5oIgorI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19hbm5vdC5oIgorI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19mb3JtZmlsbGVudmlyb25tZW50LmgiCisjaW5jbHVkZSAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfZm9ybWZpbGxlci5oIgorI2luY2x1ZGUgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2ludGVyYWN0aXZlZm9ybWZpbGxlci5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfd25kLmgiCisjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK2NsYXNzIENQV0xFZGl0RW1iZWRkZXJ0ZXN0IDogcHVibGljIEVtYmVkZGVyVGVzdCB7CisgcHJvdGVjdGVkOgorICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIEVtYmVkZGVyVGVzdDo6U2V0VXAoKTsKKyAgICBDcmVhdGVBbmRJbml0aWFsaXplRm9ybVBERigpOworICB9CisKKyAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICBVbmxvYWRQYWdlKEdldFBhZ2UoKSk7CisgICAgRW1iZWRkZXJUZXN0OjpUZWFyRG93bigpOworICB9CisKKyAgdm9pZCBDcmVhdGVBbmRJbml0aWFsaXplRm9ybVBERigpIHsKKyAgICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoInRleHRfZm9ybV9tdWx0aXBsZS5wZGYiKSk7CisgICAgbV9wYWdlID0gTG9hZFBhZ2UoMCk7CisgICAgQVNTRVJUX1RSVUUobV9wYWdlKTsKKworICAgIG1fcEZvcm1GaWxsRW52ID0gc3RhdGljX2Nhc3Q8Q1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50Kj4oZm9ybV9oYW5kbGUoKSk7CisgICAgQ0JBX0Fubm90SXRlcmF0b3IgaXRlcihtX3BGb3JtRmlsbEVudi0+R2V0UGFnZVZpZXcoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Fubm90OjpTdWJ0eXBlOjpXSURHRVQpOworICAgIC8vIE5vcm1hbCB0ZXh0IGZpZWxkLgorICAgIG1fcEFubm90ID0gaXRlci5HZXRGaXJzdEFubm90KCk7CisgICAgQVNTRVJUX1RSVUUobV9wQW5ub3QpOworICAgIEFTU0VSVF9FUShDUERGX0Fubm90OjpTdWJ0eXBlOjpXSURHRVQsIG1fcEFubm90LT5HZXRBbm5vdFN1YnR5cGUoKSk7CisKKyAgICAvLyBSZWFkLW9ubHkgdGV4dCBmaWVsZC4KKyAgICBDUERGU0RLX0Fubm90KiBwQW5ub3RSZWFkT25seSA9IGl0ZXIuR2V0TmV4dEFubm90KG1fcEFubm90KTsKKworICAgIC8vIFByZS1maWxsZWQgdGV4dCBmaWVsZCB3aXRoIGNoYXIgbGltaXQgb2YgMTAuCisgICAgbV9wQW5ub3RDaGFyTGltaXQgPSBpdGVyLkdldE5leHRBbm5vdChwQW5ub3RSZWFkT25seSk7CisgICAgQVNTRVJUX1RSVUUobV9wQW5ub3RDaGFyTGltaXQpOworICAgIEFTU0VSVF9FUShDUERGX0Fubm90OjpTdWJ0eXBlOjpXSURHRVQsCisgICAgICAgICAgICAgIG1fcEFubm90Q2hhckxpbWl0LT5HZXRBbm5vdFN1YnR5cGUoKSk7CisgICAgQ1BERlNES19Bbm5vdCogcExhc3RBbm5vdCA9IGl0ZXIuR2V0TGFzdEFubm90KCk7CisgICAgQVNTRVJUX0VRKG1fcEFubm90Q2hhckxpbWl0LCBwTGFzdEFubm90KTsKKyAgfQorCisgIHZvaWQgRm9ybUZpbGxlckFuZFdpbmRvd1NldHVwKENQREZTREtfQW5ub3QqIHBBbm5vdFRleHRGaWVsZCkgeworICAgIENGRkxfSW50ZXJhY3RpdmVGb3JtRmlsbGVyKiBwSW50ZXJhY3RpdmVGb3JtRmlsbGVyID0KKyAgICAgICAgbV9wRm9ybUZpbGxFbnYtPkdldEludGVyYWN0aXZlRm9ybUZpbGxlcigpOworICAgIHsKKyAgICAgIENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyIHBPYnNlcnZlZChwQW5ub3RUZXh0RmllbGQpOworICAgICAgRVhQRUNUX1RSVUUocEludGVyYWN0aXZlRm9ybUZpbGxlci0+T25TZXRGb2N1cygmcE9ic2VydmVkLCAwKSk7CisgICAgfQorCisgICAgbV9wRm9ybUZpbGxlciA9CisgICAgICAgIHBJbnRlcmFjdGl2ZUZvcm1GaWxsZXItPkdldEZvcm1GaWxsZXIocEFubm90VGV4dEZpZWxkLCBmYWxzZSk7CisgICAgQVNTRVJUX1RSVUUobV9wRm9ybUZpbGxlcik7CisKKyAgICBDUFdMX1duZCogcFdpbmRvdyA9CisgICAgICAgIG1fcEZvcm1GaWxsZXItPkdldFBERldpbmRvdyhtX3BGb3JtRmlsbEVudi0+R2V0UGFnZVZpZXcoMCksIGZhbHNlKTsKKyAgICBBU1NFUlRfVFJVRShwV2luZG93KTsKKyAgICBBU1NFUlRfRVEoUFdMX0NMQVNTTkFNRV9FRElULCBwV2luZG93LT5HZXRDbGFzc05hbWUoKSk7CisKKyAgICBtX3BFZGl0ID0gc3RhdGljX2Nhc3Q8Q1BXTF9FZGl0Kj4ocFdpbmRvdyk7CisgIH0KKworICB2b2lkIFR5cGVUZXh0SW50b1RleHRGaWVsZChpbnQgbnVtX2NoYXJzKSB7CisgICAgLy8gVHlwZSB0ZXh0IHN0YXJ0aW5nIHdpdGggJ0EnIHRvIGFzIG1hbnkgY2hhcnMgYXMgc3BlY2lmaWVkIGJ5IHxudW1fY2hhcnN8LgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2NoYXJzOyArK2kpIHsKKyAgICAgIEVYUEVDVF9UUlVFKEdldENGRkxGb3JtRmlsbGVyKCktPk9uQ2hhcihHZXRDUERGU0RLQW5ub3QoKSwgaSArICdBJywgMCkpOworICAgIH0KKyAgfQorCisgIEZQREZfUEFHRSBHZXRQYWdlKCkgeyByZXR1cm4gbV9wYWdlOyB9CisgIENQV0xfRWRpdCogR2V0Q1BXTEVkaXQoKSB7IHJldHVybiBtX3BFZGl0OyB9CisgIENGRkxfRm9ybUZpbGxlciogR2V0Q0ZGTEZvcm1GaWxsZXIoKSB7IHJldHVybiBtX3BGb3JtRmlsbGVyOyB9CisgIENQREZTREtfQW5ub3QqIEdldENQREZTREtBbm5vdCgpIHsgcmV0dXJuIG1fcEFubm90OyB9CisgIENQREZTREtfQW5ub3QqIEdldENQREZTREtBbm5vdENoYXJMaW1pdCgpIHsgcmV0dXJuIG1fcEFubm90Q2hhckxpbWl0OyB9CisKKyBwcml2YXRlOgorICBGUERGX1BBR0UgbV9wYWdlOworICBDUFdMX0VkaXQqIG1fcEVkaXQ7CisgIENGRkxfRm9ybUZpbGxlciogbV9wRm9ybUZpbGxlcjsKKyAgQ1BERlNES19Bbm5vdCogbV9wQW5ub3Q7CisgIENQREZTREtfQW5ub3QqIG1fcEFubm90Q2hhckxpbWl0OworICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIG1fcEZvcm1GaWxsRW52OworfTsKKworVEVTVF9GKENQV0xFZGl0RW1iZWRkZXJ0ZXN0LCBUeXBlVGV4dCkgeworICBGb3JtRmlsbGVyQW5kV2luZG93U2V0dXAoR2V0Q1BERlNES0Fubm90KCkpOworICBFWFBFQ1RfVFJVRShHZXRDUFdMRWRpdCgpLT5HZXRUZXh0KCkuSXNFbXB0eSgpKTsKKyAgRVhQRUNUX1RSVUUoR2V0Q0ZGTEZvcm1GaWxsZXIoKS0+T25DaGFyKEdldENQREZTREtBbm5vdCgpLCAnYScsIDApKTsKKyAgRVhQRUNUX1RSVUUoR2V0Q0ZGTEZvcm1GaWxsZXIoKS0+T25DaGFyKEdldENQREZTREtBbm5vdCgpLCAnYicsIDApKTsKKyAgRVhQRUNUX1RSVUUoR2V0Q0ZGTEZvcm1GaWxsZXIoKS0+T25DaGFyKEdldENQREZTREtBbm5vdCgpLCAnYycsIDApKTsKKworICBFWFBFQ1RfU1RSRVEoTCJhYmMiLCBHZXRDUFdMRWRpdCgpLT5HZXRUZXh0KCkuY19zdHIoKSk7Cit9CisKK1RFU1RfRihDUFdMRWRpdEVtYmVkZGVydGVzdCwgR2V0U2VsZWN0ZWRUZXh0RW1wdHlBbmRCYXNpYykgeworICBGb3JtRmlsbGVyQW5kV2luZG93U2V0dXAoR2V0Q1BERlNES0Fubm90KCkpOworICAvLyBBdHRlbXB0IHRvIHNldCBzZWxlY3Rpb24gYmVmb3JlIHRleHQgaGFzIGJlZW4gdHlwZWQgdG8gdGVzdCB0aGF0CisgIC8vIHNlbGVjdGlvbiBpcyBpZGVudGlmaWVkIGFzIGVtcHR5LgorICAvLworICAvLyBTZWxlY3QgZnJvbSBjaGFyYWN0ZXIgaW5kZXggWzAsIDMpIHdpdGhpbiBmb3JtIHRleHQgZmllbGQuCisgIEdldENQV0xFZGl0KCktPlNldFNlbGVjdGlvbigwLCAzKTsKKyAgRVhQRUNUX1RSVUUoR2V0Q1BXTEVkaXQoKS0+R2V0U2VsZWN0ZWRUZXh0KCkuSXNFbXB0eSgpKTsKKworICBFWFBFQ1RfVFJVRShHZXRDRkZMRm9ybUZpbGxlcigpLT5PbkNoYXIoR2V0Q1BERlNES0Fubm90KCksICdhJywgMCkpOworICBFWFBFQ1RfVFJVRShHZXRDRkZMRm9ybUZpbGxlcigpLT5PbkNoYXIoR2V0Q1BERlNES0Fubm90KCksICdiJywgMCkpOworICBFWFBFQ1RfVFJVRShHZXRDRkZMRm9ybUZpbGxlcigpLT5PbkNoYXIoR2V0Q1BERlNES0Fubm90KCksICdjJywgMCkpOworICBHZXRDUFdMRWRpdCgpLT5TZXRTZWxlY3Rpb24oMCwgMik7CisKKyAgRVhQRUNUX1NUUkVRKEwiYWIiLCBHZXRDUFdMRWRpdCgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKK30KKworVEVTVF9GKENQV0xFZGl0RW1iZWRkZXJ0ZXN0LCBHZXRTZWxlY3RlZFRleHRGcmFnbWVudHMpIHsKKyAgRm9ybUZpbGxlckFuZFdpbmRvd1NldHVwKEdldENQREZTREtBbm5vdCgpKTsKKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDUwKTsKKworICBHZXRDUFdMRWRpdCgpLT5TZXRTZWxlY3Rpb24oMCwgMCk7CisgIEVYUEVDVF9UUlVFKEdldENQV0xFZGl0KCktPkdldFNlbGVjdGVkVGV4dCgpLklzRW1wdHkoKSk7CisKKyAgR2V0Q1BXTEVkaXQoKS0+U2V0U2VsZWN0aW9uKDAsIDEpOworICBFWFBFQ1RfU1RSRVEoTCJBIiwgR2V0Q1BXTEVkaXQoKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgR2V0Q1BXTEVkaXQoKS0+U2V0U2VsZWN0aW9uKDAsIC0xKTsKKyAgRVhQRUNUX1NUUkVRKEwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyIiwKKyAgICAgICAgICAgICAgIEdldENQV0xFZGl0KCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIEdldENQV0xFZGl0KCktPlNldFNlbGVjdGlvbigtOCwgLTEpOworICBFWFBFQ1RfVFJVRShHZXRDUFdMRWRpdCgpLT5HZXRTZWxlY3RlZFRleHQoKS5Jc0VtcHR5KCkpOworCisgIEdldENQV0xFZGl0KCktPlNldFNlbGVjdGlvbigyMywgMTIpOworICBFWFBFQ1RfU1RSRVEoTCJNTk9QUVJTVFVWVyIsIEdldENQV0xFZGl0KCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIEdldENQV0xFZGl0KCktPlNldFNlbGVjdGlvbigxMiwgMjMpOworICBFWFBFQ1RfU1RSRVEoTCJNTk9QUVJTVFVWVyIsIEdldENQV0xFZGl0KCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIEdldENQV0xFZGl0KCktPlNldFNlbGVjdGlvbig0OSwgNTApOworICBFWFBFQ1RfU1RSRVEoTCJyIiwgR2V0Q1BXTEVkaXQoKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgR2V0Q1BXTEVkaXQoKS0+U2V0U2VsZWN0aW9uKDQ5LCA1NSk7CisgIEVYUEVDVF9TVFJFUShMInIiLCBHZXRDUFdMRWRpdCgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKK30KKworVEVTVF9GKENQV0xFZGl0RW1iZWRkZXJ0ZXN0LCBEZWxldGVFbnRpcmVUZXh0U2VsZWN0aW9uKSB7CisgIEZvcm1GaWxsZXJBbmRXaW5kb3dTZXR1cChHZXRDUERGU0RLQW5ub3QoKSk7CisgIFR5cGVUZXh0SW50b1RleHRGaWVsZCg1MCk7CisKKyAgR2V0Q1BXTEVkaXQoKS0+U2V0U2VsZWN0aW9uKDAsIC0xKTsKKyAgRVhQRUNUX1NUUkVRKEwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyIiwKKyAgICAgICAgICAgICAgIEdldENQV0xFZGl0KCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIEdldENQV0xFZGl0KCktPlJlcGxhY2VTZWxlY3Rpb24oTCIiKTsKKyAgRVhQRUNUX1RSVUUoR2V0Q1BXTEVkaXQoKS0+R2V0VGV4dCgpLklzRW1wdHkoKSk7Cit9CisKK1RFU1RfRihDUFdMRWRpdEVtYmVkZGVydGVzdCwgRGVsZXRlVGV4dFNlbGVjdGlvbk1pZGRsZSkgeworICBGb3JtRmlsbGVyQW5kV2luZG93U2V0dXAoR2V0Q1BERlNES0Fubm90KCkpOworICBUeXBlVGV4dEludG9UZXh0RmllbGQoNTApOworCisgIEdldENQV0xFZGl0KCktPlNldFNlbGVjdGlvbigxMiwgMjMpOworICBFWFBFQ1RfU1RSRVEoTCJNTk9QUVJTVFVWVyIsIEdldENQV0xFZGl0KCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIEdldENQV0xFZGl0KCktPlJlcGxhY2VTZWxlY3Rpb24oTCIiKTsKKyAgRVhQRUNUX1NUUkVRKEwiQUJDREVGR0hJSktMWFlaW1xcXV5fYGFiY2RlZmdoaWprbG1ub3BxciIsCisgICAgICAgICAgICAgICBHZXRDUFdMRWRpdCgpLT5HZXRUZXh0KCkuY19zdHIoKSk7Cit9CisKK1RFU1RfRihDUFdMRWRpdEVtYmVkZGVydGVzdCwgRGVsZXRlVGV4dFNlbGVjdGlvbkxlZnQpIHsKKyAgRm9ybUZpbGxlckFuZFdpbmRvd1NldHVwKEdldENQREZTREtBbm5vdCgpKTsKKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDUwKTsKKworICBHZXRDUFdMRWRpdCgpLT5TZXRTZWxlY3Rpb24oMCwgNSk7CisgIEVYUEVDVF9TVFJFUShMIkFCQ0RFIiwgR2V0Q1BXTEVkaXQoKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgR2V0Q1BXTEVkaXQoKS0+UmVwbGFjZVNlbGVjdGlvbihMIiIpOworICBFWFBFQ1RfU1RSRVEoTCJGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyIiwKKyAgICAgICAgICAgICAgIEdldENQV0xFZGl0KCktPkdldFRleHQoKS5jX3N0cigpKTsKK30KKworVEVTVF9GKENQV0xFZGl0RW1iZWRkZXJ0ZXN0LCBEZWxldGVUZXh0U2VsZWN0aW9uUmlnaHQpIHsKKyAgRm9ybUZpbGxlckFuZFdpbmRvd1NldHVwKEdldENQREZTREtBbm5vdCgpKTsKKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDUwKTsKKworICBHZXRDUFdMRWRpdCgpLT5TZXRTZWxlY3Rpb24oNDUsIDUwKTsKKyAgRVhQRUNUX1NUUkVRKEwibm9wcXIiLCBHZXRDUFdMRWRpdCgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKworICBHZXRDUFdMRWRpdCgpLT5SZXBsYWNlU2VsZWN0aW9uKEwiIik7CisgIEVYUEVDVF9TVFJFUShMIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXV5fYGFiY2RlZmdoaWprbG0iLAorICAgICAgICAgICAgICAgR2V0Q1BXTEVkaXQoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworfQorCitURVNUX0YoQ1BXTEVkaXRFbWJlZGRlcnRlc3QsIERlbGV0ZUVtcHR5VGV4dFNlbGVjdGlvbikgeworICBGb3JtRmlsbGVyQW5kV2luZG93U2V0dXAoR2V0Q1BERlNES0Fubm90KCkpOworICBUeXBlVGV4dEludG9UZXh0RmllbGQoNTApOworCisgIEdldENQV0xFZGl0KCktPlJlcGxhY2VTZWxlY3Rpb24oTCIiKTsKKyAgRVhQRUNUX1NUUkVRKEwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxdXl9gYWJjZGVmZ2hpamtsbW5vcHFyIiwKKyAgICAgICAgICAgICAgIEdldENQV0xFZGl0KCktPkdldFRleHQoKS5jX3N0cigpKTsKK30KKworVEVTVF9GKENQV0xFZGl0RW1iZWRkZXJ0ZXN0LCBJbnNlcnRUZXh0SW5FbXB0eVRleHRGaWVsZCkgeworICBGb3JtRmlsbGVyQW5kV2luZG93U2V0dXAoR2V0Q1BERlNES0Fubm90KCkpOworICBHZXRDUFdMRWRpdCgpLT5SZXBsYWNlU2VsZWN0aW9uKEwiSGVsbG8iKTsKKyAgRVhQRUNUX1NUUkVRKEwiSGVsbG8iLCBHZXRDUFdMRWRpdCgpLT5HZXRUZXh0KCkuY19zdHIoKSk7Cit9CisKK1RFU1RfRihDUFdMRWRpdEVtYmVkZGVydGVzdCwgSW5zZXJ0VGV4dEluUG9wdWxhdGVkVGV4dEZpZWxkTGVmdCkgeworICBGb3JtRmlsbGVyQW5kV2luZG93U2V0dXAoR2V0Q1BERlNES0Fubm90KCkpOworICBUeXBlVGV4dEludG9UZXh0RmllbGQoMTApOworCisgIC8vIE1vdmUgY3Vyc29yIHRvIGJlZ2lubmluZyBvZiB0ZXh0IGZpZWxkLgorICBFWFBFQ1RfVFJVRSgKKyAgICAgIEdldENGRkxGb3JtRmlsbGVyKCktPk9uS2V5RG93bihHZXRDUERGU0RLQW5ub3QoKSwgRldMX1ZLRVlfSG9tZSwgMCkpOworCisgIEdldENQV0xFZGl0KCktPlJlcGxhY2VTZWxlY3Rpb24oTCJIZWxsbyIpOworICBFWFBFQ1RfU1RSRVEoTCJIZWxsb0FCQ0RFRkdISUoiLCBHZXRDUFdMRWRpdCgpLT5HZXRUZXh0KCkuY19zdHIoKSk7Cit9CisKK1RFU1RfRihDUFdMRWRpdEVtYmVkZGVydGVzdCwgSW5zZXJ0VGV4dEluUG9wdWxhdGVkVGV4dEZpZWxkTWlkZGxlKSB7CisgIEZvcm1GaWxsZXJBbmRXaW5kb3dTZXR1cChHZXRDUERGU0RLQW5ub3QoKSk7CisgIFR5cGVUZXh0SW50b1RleHRGaWVsZCgxMCk7CisKKyAgLy8gTW92ZSBjdXJzb3IgdG8gbWlkZGxlIG9mIHRleHQgZmllbGQuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoCisgICAgICAgIEdldENGRkxGb3JtRmlsbGVyKCktPk9uS2V5RG93bihHZXRDUERGU0RLQW5ub3QoKSwgRldMX1ZLRVlfTGVmdCwgMCkpOworICB9CisKKyAgR2V0Q1BXTEVkaXQoKS0+UmVwbGFjZVNlbGVjdGlvbihMIkhlbGxvIik7CisgIEVYUEVDVF9TVFJFUShMIkFCQ0RFSGVsbG9GR0hJSiIsIEdldENQV0xFZGl0KCktPkdldFRleHQoKS5jX3N0cigpKTsKK30KKworVEVTVF9GKENQV0xFZGl0RW1iZWRkZXJ0ZXN0LCBJbnNlcnRUZXh0SW5Qb3B1bGF0ZWRUZXh0RmllbGRSaWdodCkgeworICBGb3JtRmlsbGVyQW5kV2luZG93U2V0dXAoR2V0Q1BERlNES0Fubm90KCkpOworICBUeXBlVGV4dEludG9UZXh0RmllbGQoMTApOworCisgIEdldENQV0xFZGl0KCktPlJlcGxhY2VTZWxlY3Rpb24oTCJIZWxsbyIpOworICBFWFBFQ1RfU1RSRVEoTCJBQkNERUZHSElKSGVsbG8iLCBHZXRDUFdMRWRpdCgpLT5HZXRUZXh0KCkuY19zdHIoKSk7Cit9CisKK1RFU1RfRihDUFdMRWRpdEVtYmVkZGVydGVzdCwKKyAgICAgICBJbnNlcnRUZXh0QW5kUmVwbGFjZVNlbGVjdGlvbkluUG9wdWxhdGVkVGV4dEZpZWxkV2hvbGUpIHsKKyAgRm9ybUZpbGxlckFuZFdpbmRvd1NldHVwKEdldENQREZTREtBbm5vdCgpKTsKKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDEwKTsKKworICBHZXRDUFdMRWRpdCgpLT5TZXRTZWxlY3Rpb24oMCwgLTEpOworICBFWFBFQ1RfU1RSRVEoTCJBQkNERUZHSElKIiwgR2V0Q1BXTEVkaXQoKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisgIEdldENQV0xFZGl0KCktPlJlcGxhY2VTZWxlY3Rpb24oTCJIZWxsbyIpOworICBFWFBFQ1RfU1RSRVEoTCJIZWxsbyIsIEdldENQV0xFZGl0KCktPkdldFRleHQoKS5jX3N0cigpKTsKK30KKworVEVTVF9GKENQV0xFZGl0RW1iZWRkZXJ0ZXN0LAorICAgICAgIEluc2VydFRleHRBbmRSZXBsYWNlU2VsZWN0aW9uSW5Qb3B1bGF0ZWRUZXh0RmllbGRMZWZ0KSB7CisgIEZvcm1GaWxsZXJBbmRXaW5kb3dTZXR1cChHZXRDUERGU0RLQW5ub3QoKSk7CisgIFR5cGVUZXh0SW50b1RleHRGaWVsZCgxMCk7CisKKyAgR2V0Q1BXTEVkaXQoKS0+U2V0U2VsZWN0aW9uKDAsIDUpOworICBFWFBFQ1RfU1RSRVEoTCJBQkNERSIsIEdldENQV0xFZGl0KCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworICBHZXRDUFdMRWRpdCgpLT5SZXBsYWNlU2VsZWN0aW9uKEwiSGVsbG8iKTsKKyAgRVhQRUNUX1NUUkVRKEwiSGVsbG9GR0hJSiIsIEdldENQV0xFZGl0KCktPkdldFRleHQoKS5jX3N0cigpKTsKK30KKworVEVTVF9GKENQV0xFZGl0RW1iZWRkZXJ0ZXN0LAorICAgICAgIEluc2VydFRleHRBbmRSZXBsYWNlU2VsZWN0aW9uSW5Qb3B1bGF0ZWRUZXh0RmllbGRNaWRkbGUpIHsKKyAgRm9ybUZpbGxlckFuZFdpbmRvd1NldHVwKEdldENQREZTREtBbm5vdCgpKTsKKyAgVHlwZVRleHRJbnRvVGV4dEZpZWxkKDEwKTsKKworICBHZXRDUFdMRWRpdCgpLT5TZXRTZWxlY3Rpb24oMiwgNyk7CisgIEVYUEVDVF9TVFJFUShMIkNERUZHIiwgR2V0Q1BXTEVkaXQoKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisgIEdldENQV0xFZGl0KCktPlJlcGxhY2VTZWxlY3Rpb24oTCJIZWxsbyIpOworICBFWFBFQ1RfU1RSRVEoTCJBQkhlbGxvSElKIiwgR2V0Q1BXTEVkaXQoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworfQorCitURVNUX0YoQ1BXTEVkaXRFbWJlZGRlcnRlc3QsCisgICAgICAgSW5zZXJ0VGV4dEFuZFJlcGxhY2VTZWxlY3Rpb25JblBvcHVsYXRlZFRleHRGaWVsZFJpZ2h0KSB7CisgIEZvcm1GaWxsZXJBbmRXaW5kb3dTZXR1cChHZXRDUERGU0RLQW5ub3QoKSk7CisgIFR5cGVUZXh0SW50b1RleHRGaWVsZCgxMCk7CisKKyAgR2V0Q1BXTEVkaXQoKS0+U2V0U2VsZWN0aW9uKDUsIDEwKTsKKyAgRVhQRUNUX1NUUkVRKEwiRkdISUoiLCBHZXRDUFdMRWRpdCgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKyAgR2V0Q1BXTEVkaXQoKS0+UmVwbGFjZVNlbGVjdGlvbihMIkhlbGxvIik7CisgIEVYUEVDVF9TVFJFUShMIkFCQ0RFSGVsbG8iLCBHZXRDUFdMRWRpdCgpLT5HZXRUZXh0KCkuY19zdHIoKSk7Cit9CisKK1RFU1RfRihDUFdMRWRpdEVtYmVkZGVydGVzdCwgSW5zZXJ0VGV4dEluRW1wdHlDaGFyTGltaXRUZXh0RmllbGRPdmVyZmxvdykgeworICBGb3JtRmlsbGVyQW5kV2luZG93U2V0dXAoR2V0Q1BERlNES0Fubm90Q2hhckxpbWl0KCkpOworICBHZXRDUFdMRWRpdCgpLT5TZXRTZWxlY3Rpb24oMCwgLTEpOworICBFWFBFQ1RfU1RSRVEoTCJFbGVwaGFudCIsIEdldENQV0xFZGl0KCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworICBHZXRDUFdMRWRpdCgpLT5SZXBsYWNlU2VsZWN0aW9uKEwiIik7CisKKyAgR2V0Q1BXTEVkaXQoKS0+UmVwbGFjZVNlbGVjdGlvbihMIkhpcHBvcG90YW11cyIpOworICBFWFBFQ1RfU1RSRVEoTCJIaXBwb3BvdGFtIiwgR2V0Q1BXTEVkaXQoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworfQorCitURVNUX0YoQ1BXTEVkaXRFbWJlZGRlcnRlc3QsIEluc2VydFRleHRJbkVtcHR5Q2hhckxpbWl0VGV4dEZpZWxkRml0KSB7CisgIEZvcm1GaWxsZXJBbmRXaW5kb3dTZXR1cChHZXRDUERGU0RLQW5ub3RDaGFyTGltaXQoKSk7CisgIEdldENQV0xFZGl0KCktPlNldFNlbGVjdGlvbigwLCAtMSk7CisgIEVYUEVDVF9TVFJFUShMIkVsZXBoYW50IiwgR2V0Q1BXTEVkaXQoKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisgIEdldENQV0xFZGl0KCktPlJlcGxhY2VTZWxlY3Rpb24oTCIiKTsKKworICBHZXRDUFdMRWRpdCgpLT5SZXBsYWNlU2VsZWN0aW9uKEwiWmVicmEiKTsKKyAgRVhQRUNUX1NUUkVRKEwiWmVicmEiLCBHZXRDUFdMRWRpdCgpLT5HZXRUZXh0KCkuY19zdHIoKSk7Cit9CisKK1RFU1RfRihDUFdMRWRpdEVtYmVkZGVydGVzdCwgSW5zZXJ0VGV4dEluUG9wdWxhdGVkQ2hhckxpbWl0VGV4dEZpZWxkTGVmdCkgeworICBGb3JtRmlsbGVyQW5kV2luZG93U2V0dXAoR2V0Q1BERlNES0Fubm90Q2hhckxpbWl0KCkpOworICBHZXRDUFdMRWRpdCgpLT5SZXBsYWNlU2VsZWN0aW9uKEwiSGlwcG9wb3RhbXVzIik7CisgIEVYUEVDVF9TVFJFUShMIkhpRWxlcGhhbnQiLCBHZXRDUFdMRWRpdCgpLT5HZXRUZXh0KCkuY19zdHIoKSk7Cit9CisKK1RFU1RfRihDUFdMRWRpdEVtYmVkZGVydGVzdCwgSW5zZXJ0VGV4dEluUG9wdWxhdGVkQ2hhckxpbWl0VGV4dEZpZWxkTWlkZGxlKSB7CisgIEZvcm1GaWxsZXJBbmRXaW5kb3dTZXR1cChHZXRDUERGU0RLQW5ub3RDaGFyTGltaXQoKSk7CisgIC8vIE1vdmUgY3Vyc29yIHRvIG1pZGRsZSBvZiB0ZXh0IGZpZWxkLgorICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEdldENGRkxGb3JtRmlsbGVyKCktPk9uS2V5RG93bihHZXRDUERGU0RLQW5ub3RDaGFyTGltaXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1ZLRVlfUmlnaHQsIDApKTsKKyAgfQorCisgIEdldENQV0xFZGl0KCktPlJlcGxhY2VTZWxlY3Rpb24oTCJIaXBwb3BvdGFtdXMiKTsKKyAgRVhQRUNUX1NUUkVRKEwiRWxlcGhIaWFudCIsIEdldENQV0xFZGl0KCktPkdldFRleHQoKS5jX3N0cigpKTsKK30KKworVEVTVF9GKENQV0xFZGl0RW1iZWRkZXJ0ZXN0LCBJbnNlcnRUZXh0SW5Qb3B1bGF0ZWRDaGFyTGltaXRUZXh0RmllbGRSaWdodCkgeworICBGb3JtRmlsbGVyQW5kV2luZG93U2V0dXAoR2V0Q1BERlNES0Fubm90Q2hhckxpbWl0KCkpOworICAvLyBNb3ZlIGN1cnNvciB0byBlbmQgb2YgdGV4dCBmaWVsZC4KKyAgRVhQRUNUX1RSVUUoR2V0Q0ZGTEZvcm1GaWxsZXIoKS0+T25LZXlEb3duKEdldENQREZTREtBbm5vdENoYXJMaW1pdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1ZLRVlfRW5kLCAwKSk7CisKKyAgR2V0Q1BXTEVkaXQoKS0+UmVwbGFjZVNlbGVjdGlvbihMIkhpcHBvcG90YW11cyIpOworICBFWFBFQ1RfU1RSRVEoTCJFbGVwaGFudEhpIiwgR2V0Q1BXTEVkaXQoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworfQorCitURVNUX0YoQ1BXTEVkaXRFbWJlZGRlcnRlc3QsCisgICAgICAgSW5zZXJ0VGV4dEFuZFJlcGxhY2VTZWxlY3Rpb25JblBvcHVsYXRlZENoYXJMaW1pdFRleHRGaWVsZFdob2xlKSB7CisgIEZvcm1GaWxsZXJBbmRXaW5kb3dTZXR1cChHZXRDUERGU0RLQW5ub3RDaGFyTGltaXQoKSk7CisgIEdldENQV0xFZGl0KCktPlNldFNlbGVjdGlvbigwLCAtMSk7CisgIEVYUEVDVF9TVFJFUShMIkVsZXBoYW50IiwgR2V0Q1BXTEVkaXQoKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisgIEdldENQV0xFZGl0KCktPlJlcGxhY2VTZWxlY3Rpb24oTCJIaXBwb3BvdGFtdXMiKTsKKyAgRVhQRUNUX1NUUkVRKEwiSGlwcG9wb3RhbSIsIEdldENQV0xFZGl0KCktPkdldFRleHQoKS5jX3N0cigpKTsKK30KKworVEVTVF9GKENQV0xFZGl0RW1iZWRkZXJ0ZXN0LAorICAgICAgIEluc2VydFRleHRBbmRSZXBsYWNlU2VsZWN0aW9uSW5Qb3B1bGF0ZWRDaGFyTGltaXRUZXh0RmllbGRMZWZ0KSB7CisgIEZvcm1GaWxsZXJBbmRXaW5kb3dTZXR1cChHZXRDUERGU0RLQW5ub3RDaGFyTGltaXQoKSk7CisgIEdldENQV0xFZGl0KCktPlNldFNlbGVjdGlvbigwLCA0KTsKKyAgRVhQRUNUX1NUUkVRKEwiRWxlcCIsIEdldENQV0xFZGl0KCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworICBHZXRDUFdMRWRpdCgpLT5SZXBsYWNlU2VsZWN0aW9uKEwiSGlwcG9wb3RhbXVzIik7CisgIEVYUEVDVF9TVFJFUShMIkhpcHBvcGhhbnQiLCBHZXRDUFdMRWRpdCgpLT5HZXRUZXh0KCkuY19zdHIoKSk7Cit9CisKK1RFU1RfRihDUFdMRWRpdEVtYmVkZGVydGVzdCwKKyAgICAgICBJbnNlcnRUZXh0QW5kUmVwbGFjZVNlbGVjdGlvbkluUG9wdWxhdGVkQ2hhckxpbWl0VGV4dEZpZWxkTWlkZGxlKSB7CisgIEZvcm1GaWxsZXJBbmRXaW5kb3dTZXR1cChHZXRDUERGU0RLQW5ub3RDaGFyTGltaXQoKSk7CisgIEdldENQV0xFZGl0KCktPlNldFNlbGVjdGlvbigyLCA2KTsKKyAgRVhQRUNUX1NUUkVRKEwiZXBoYSIsIEdldENQV0xFZGl0KCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworICBHZXRDUFdMRWRpdCgpLT5SZXBsYWNlU2VsZWN0aW9uKEwiSGlwcG9wb3RhbXVzIik7CisgIEVYUEVDVF9TVFJFUShMIkVsSGlwcG9wbnQiLCBHZXRDUFdMRWRpdCgpLT5HZXRUZXh0KCkuY19zdHIoKSk7Cit9CisKK1RFU1RfRihDUFdMRWRpdEVtYmVkZGVydGVzdCwKKyAgICAgICBJbnNlcnRUZXh0QW5kUmVwbGFjZVNlbGVjdGlvbkluUG9wdWxhdGVkQ2hhckxpbWl0VGV4dEZpZWxkUmlnaHQpIHsKKyAgRm9ybUZpbGxlckFuZFdpbmRvd1NldHVwKEdldENQREZTREtBbm5vdENoYXJMaW1pdCgpKTsKKyAgR2V0Q1BXTEVkaXQoKS0+U2V0U2VsZWN0aW9uKDQsIDgpOworICBFWFBFQ1RfU1RSRVEoTCJoYW50IiwgR2V0Q1BXTEVkaXQoKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisgIEdldENQV0xFZGl0KCktPlJlcGxhY2VTZWxlY3Rpb24oTCJIaXBwb3BvdGFtdXMiKTsKKyAgRVhQRUNUX1NUUkVRKEwiRWxlcEhpcHBvcCIsIEdldENQV0xFZGl0KCktPkdldFRleHQoKS5jX3N0cigpKTsKK30KKworVEVTVF9GKENQV0xFZGl0RW1iZWRkZXJ0ZXN0LCBTZXRUZXh0V2l0aEVuZENhcnJpYWdlRmVlZCkgeworICBGb3JtRmlsbGVyQW5kV2luZG93U2V0dXAoR2V0Q1BERlNES0Fubm90KCkpOworICBHZXRDUFdMRWRpdCgpLT5TZXRUZXh0KEwiRm9vXHIiKTsKKyAgRVhQRUNUX1NUUkVRKEwiRm9vIiwgR2V0Q1BXTEVkaXQoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworfQorCitURVNUX0YoQ1BXTEVkaXRFbWJlZGRlcnRlc3QsIFNldFRleHRXaXRoRW5kTmV3bGluZSkgeworICBGb3JtRmlsbGVyQW5kV2luZG93U2V0dXAoR2V0Q1BERlNES0Fubm90KCkpOworICBHZXRDUFdMRWRpdCgpLT5TZXRUZXh0KEwiRm9vXG4iKTsKKyAgRVhQRUNUX1NUUkVRKEwiRm9vIiwgR2V0Q1BXTEVkaXQoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworfQorCitURVNUX0YoQ1BXTEVkaXRFbWJlZGRlcnRlc3QsIFNldFRleHRXaXRoRW5kQ2FycmlhZ2VGZWVkQW5kTmV3TGluZSkgeworICBGb3JtRmlsbGVyQW5kV2luZG93U2V0dXAoR2V0Q1BERlNES0Fubm90KCkpOworICBHZXRDUFdMRWRpdCgpLT5TZXRUZXh0KEwiRm9vXHJcbiIpOworICBFWFBFQ1RfU1RSRVEoTCJGb28iLCBHZXRDUFdMRWRpdCgpLT5HZXRUZXh0KCkuY19zdHIoKSk7Cit9CisKK1RFU1RfRihDUFdMRWRpdEVtYmVkZGVydGVzdCwgU2V0VGV4dFdpdGhFbmROZXdMaW5lQW5kQ2FycmlhZ2VGZWVkKSB7CisgIEZvcm1GaWxsZXJBbmRXaW5kb3dTZXR1cChHZXRDUERGU0RLQW5ub3QoKSk7CisgIEdldENQV0xFZGl0KCktPlNldFRleHQoTCJGb29cblxyIik7CisgIEVYUEVDVF9TVFJFUShMIkZvbyIsIEdldENQV0xFZGl0KCktPkdldFRleHQoKS5jX3N0cigpKTsKK30KKworVEVTVF9GKENQV0xFZGl0RW1iZWRkZXJ0ZXN0LCBTZXRUZXh0V2l0aEJvZHlDYXJyaWFnZUZlZWQpIHsKKyAgRm9ybUZpbGxlckFuZFdpbmRvd1NldHVwKEdldENQREZTREtBbm5vdCgpKTsKKyAgR2V0Q1BXTEVkaXQoKS0+U2V0VGV4dChMIkZvb1xyQmFyIik7CisgIEVYUEVDVF9TVFJFUShMIkZvb0JhciIsIEdldENQV0xFZGl0KCktPkdldFRleHQoKS5jX3N0cigpKTsKK30KKworVEVTVF9GKENQV0xFZGl0RW1iZWRkZXJ0ZXN0LCBTZXRUZXh0V2l0aEJvZHlOZXdsaW5lKSB7CisgIEZvcm1GaWxsZXJBbmRXaW5kb3dTZXR1cChHZXRDUERGU0RLQW5ub3QoKSk7CisgIEdldENQV0xFZGl0KCktPlNldFRleHQoTCJGb29cbkJhciIpOworICBFWFBFQ1RfU1RSRVEoTCJGb29CYXIiLCBHZXRDUFdMRWRpdCgpLT5HZXRUZXh0KCkuY19zdHIoKSk7Cit9CisKK1RFU1RfRihDUFdMRWRpdEVtYmVkZGVydGVzdCwgU2V0VGV4dFdpdGhCb2R5Q2FycmlhZ2VGZWVkQW5kTmV3TGluZSkgeworICBGb3JtRmlsbGVyQW5kV2luZG93U2V0dXAoR2V0Q1BERlNES0Fubm90KCkpOworICBHZXRDUFdMRWRpdCgpLT5TZXRUZXh0KEwiRm9vXHJcbkJhciIpOworICBFWFBFQ1RfU1RSRVEoTCJGb29CYXIiLCBHZXRDUFdMRWRpdCgpLT5HZXRUZXh0KCkuY19zdHIoKSk7Cit9CisKK1RFU1RfRihDUFdMRWRpdEVtYmVkZGVydGVzdCwgU2V0VGV4dFdpdGhCb2R5TmV3TGluZUFuZENhcnJpYWdlRmVlZCkgeworICBGb3JtRmlsbGVyQW5kV2luZG93U2V0dXAoR2V0Q1BERlNES0Fubm90KCkpOworICBHZXRDUFdMRWRpdCgpLT5TZXRUZXh0KEwiRm9vXG5cckJhciIpOworICBFWFBFQ1RfU1RSRVEoTCJGb29CYXIiLCBHZXRDUFdMRWRpdCgpLT5HZXRUZXh0KCkuY19zdHIoKSk7Cit9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3B3bC9jcHdsX2VkaXRfaW1wbC5jcHAgYi9mcGRmc2RrL3B3bC9jcHdsX2VkaXRfaW1wbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJhN2IxZAotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvcHdsL2Nwd2xfZWRpdF9pbXBsLmNwcApAQCAtMCwwICsxLDE4OTkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfZWRpdF9pbXBsLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udC5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW9iamVjdC5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW9iamVjdGhvbGRlci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0aG9iamVjdC5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfdGV4dG9iamVjdC5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvZnBkZl9wYXJzZXJfZGVjb2RlLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3JlbmRlci9jcGRmX3JlbmRlcm9wdGlvbnMuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcmVuZGVyL2NwZGZfdGV4dHJlbmRlcmVyLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2NwdnRfd29yZC5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9pcHZ0X2ZvbnRtYXAuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2F1dG9yZXN0b3Jlci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29kZXBhZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGVkYXRhLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmgiCisjaW5jbHVkZSAiZnBkZnNkay9jZnhfc3lzdGVtaGFuZGxlci5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfZWRpdC5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfZWRpdF9jdHJsLmgiCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF9zY3JvbGxfYmFyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgaW50IGtFZGl0VW5kb01heEl0ZW1zID0gMTAwMDA7CisKK3ZvaWQgRHJhd1RleHRTdHJpbmcoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQsCisgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZGb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbXRVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGNyVGV4dEZpbGwsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkhvcnpTY2FsZSkgeworICBpZiAoIXBGb250KQorICAgIHJldHVybjsKKworICBDRlhfUG9pbnRGIHBvcyA9IG10VXNlcjJEZXZpY2UuVHJhbnNmb3JtKHB0KTsKKyAgQ0ZYX01hdHJpeCBtdDsKKyAgaWYgKG5Ib3J6U2NhbGUgPT0gMTAwKSB7CisgICAgbXQgPSBtdFVzZXIyRGV2aWNlOworICB9IGVsc2UgeworICAgIG10ID0gQ0ZYX01hdHJpeChuSG9yelNjYWxlIC8gMTAwLjBmLCAwLCAwLCAxLCAwLCAwKTsKKyAgICBtdC5Db25jYXQobXRVc2VyMkRldmljZSk7CisgIH0KKworICBDUERGX1JlbmRlck9wdGlvbnMgcm87CisgIHJvLlNldEZsYWdzKFJFTkRFUl9DTEVBUlRZUEUpOworCisgIHJvLlNldENvbG9yTW9kZShDUERGX1JlbmRlck9wdGlvbnM6OmtOb3JtYWwpOworICBDUERGX1RleHRSZW5kZXJlcjo6RHJhd1RleHRTdHJpbmcocERldmljZSwgcG9zLngsIHBvcy55LCBwRm9udCwgZkZvbnRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm10LCBzdHIsIGNyVGV4dEZpbGwsIG51bGxwdHIsICZybyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitDUFdMX0VkaXRJbXBsX0l0ZXJhdG9yOjpDUFdMX0VkaXRJbXBsX0l0ZXJhdG9yKAorICAgIENQV0xfRWRpdEltcGwqIHBFZGl0LAorICAgIENQREZfVmFyaWFibGVUZXh0OjpJdGVyYXRvciogcFZUSXRlcmF0b3IpCisgICAgOiBtX3BFZGl0KHBFZGl0KSwgbV9wVlRJdGVyYXRvcihwVlRJdGVyYXRvcikge30KKworQ1BXTF9FZGl0SW1wbF9JdGVyYXRvcjo6fkNQV0xfRWRpdEltcGxfSXRlcmF0b3IoKSB7fQorCitib29sIENQV0xfRWRpdEltcGxfSXRlcmF0b3I6Ok5leHRXb3JkKCkgeworICByZXR1cm4gbV9wVlRJdGVyYXRvci0+TmV4dFdvcmQoKTsKK30KKworYm9vbCBDUFdMX0VkaXRJbXBsX0l0ZXJhdG9yOjpQcmV2V29yZCgpIHsKKyAgcmV0dXJuIG1fcFZUSXRlcmF0b3ItPlByZXZXb3JkKCk7Cit9CisKK2Jvb2wgQ1BXTF9FZGl0SW1wbF9JdGVyYXRvcjo6R2V0V29yZChDUFZUX1dvcmQmIHdvcmQpIGNvbnN0IHsKKyAgQVNTRVJUKG1fcEVkaXQpOworCisgIGlmIChtX3BWVEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7CisgICAgd29yZC5wdFdvcmQgPSBtX3BFZGl0LT5WVFRvRWRpdCh3b3JkLnB0V29yZCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENQV0xfRWRpdEltcGxfSXRlcmF0b3I6OkdldExpbmUoQ1BWVF9MaW5lJiBsaW5lKSBjb25zdCB7CisgIEFTU0VSVChtX3BFZGl0KTsKKworICBpZiAobV9wVlRJdGVyYXRvci0+R2V0TGluZShsaW5lKSkgeworICAgIGxpbmUucHRMaW5lID0gbV9wRWRpdC0+VlRUb0VkaXQobGluZS5wdExpbmUpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBDUFdMX0VkaXRJbXBsX0l0ZXJhdG9yOjpTZXRBdChpbnQzMl90IG5Xb3JkSW5kZXgpIHsKKyAgbV9wVlRJdGVyYXRvci0+U2V0QXQobldvcmRJbmRleCk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbF9JdGVyYXRvcjo6U2V0QXQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSB7CisgIG1fcFZUSXRlcmF0b3ItPlNldEF0KHBsYWNlKTsKK30KKworY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIENQV0xfRWRpdEltcGxfSXRlcmF0b3I6OkdldEF0KCkgY29uc3QgeworICByZXR1cm4gbV9wVlRJdGVyYXRvci0+R2V0V29yZFBsYWNlKCk7Cit9CisKK0NQV0xfRWRpdEltcGxfUHJvdmlkZXI6OkNQV0xfRWRpdEltcGxfUHJvdmlkZXIoSVBWVF9Gb250TWFwKiBwRm9udE1hcCkKKyAgICA6IENQREZfVmFyaWFibGVUZXh0OjpQcm92aWRlcihwRm9udE1hcCksIG1fcEZvbnRNYXAocEZvbnRNYXApIHsKKyAgQVNTRVJUKG1fcEZvbnRNYXApOworfQorCitDUFdMX0VkaXRJbXBsX1Byb3ZpZGVyOjp+Q1BXTF9FZGl0SW1wbF9Qcm92aWRlcigpIHt9CisKK0lQVlRfRm9udE1hcCogQ1BXTF9FZGl0SW1wbF9Qcm92aWRlcjo6R2V0Rm9udE1hcCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEZvbnRNYXA7Cit9CisKK2ludDMyX3QgQ1BXTF9FZGl0SW1wbF9Qcm92aWRlcjo6R2V0Q2hhcldpZHRoKGludDMyX3QgbkZvbnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdvcmQpIHsKKyAgaWYgKENQREZfRm9udCogcFBERkZvbnQgPSBtX3BGb250TWFwLT5HZXRQREZGb250KG5Gb250SW5kZXgpKSB7CisgICAgdWludDMyX3QgY2hhcmNvZGUgPSB3b3JkOworCisgICAgaWYgKHBQREZGb250LT5Jc1VuaWNvZGVDb21wYXRpYmxlKCkpCisgICAgICBjaGFyY29kZSA9IHBQREZGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKHdvcmQpOworICAgIGVsc2UKKyAgICAgIGNoYXJjb2RlID0gbV9wRm9udE1hcC0+Q2hhckNvZGVGcm9tVW5pY29kZShuRm9udEluZGV4LCB3b3JkKTsKKworICAgIGlmIChjaGFyY29kZSAhPSBDUERGX0ZvbnQ6OmtJbnZhbGlkQ2hhckNvZGUpCisgICAgICByZXR1cm4gcFBERkZvbnQtPkdldENoYXJXaWR0aEYoY2hhcmNvZGUpOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgQ1BXTF9FZGl0SW1wbF9Qcm92aWRlcjo6R2V0VHlwZUFzY2VudChpbnQzMl90IG5Gb250SW5kZXgpIHsKKyAgaWYgKENQREZfRm9udCogcFBERkZvbnQgPSBtX3BGb250TWFwLT5HZXRQREZGb250KG5Gb250SW5kZXgpKQorICAgIHJldHVybiBwUERGRm9udC0+R2V0VHlwZUFzY2VudCgpOworCisgIHJldHVybiAwOworfQorCitpbnQzMl90IENQV0xfRWRpdEltcGxfUHJvdmlkZXI6OkdldFR5cGVEZXNjZW50KGludDMyX3QgbkZvbnRJbmRleCkgeworICBpZiAoQ1BERl9Gb250KiBwUERGRm9udCA9IG1fcEZvbnRNYXAtPkdldFBERkZvbnQobkZvbnRJbmRleCkpCisgICAgcmV0dXJuIHBQREZGb250LT5HZXRUeXBlRGVzY2VudCgpOworCisgIHJldHVybiAwOworfQorCitpbnQzMl90IENQV0xfRWRpdEltcGxfUHJvdmlkZXI6OkdldFdvcmRGb250SW5kZXgodWludDE2X3Qgd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRm9udEluZGV4KSB7CisgIHJldHVybiBtX3BGb250TWFwLT5HZXRXb3JkRm9udEluZGV4KHdvcmQsIGNoYXJzZXQsIG5Gb250SW5kZXgpOworfQorCitpbnQzMl90IENQV0xfRWRpdEltcGxfUHJvdmlkZXI6OkdldERlZmF1bHRGb250SW5kZXgoKSB7CisgIHJldHVybiAwOworfQorCitib29sIENQV0xfRWRpdEltcGxfUHJvdmlkZXI6OklzTGF0aW5Xb3JkKHVpbnQxNl90IHdvcmQpIHsKKyAgcmV0dXJuIEZYX0VESVRfSVNMQVRJTldPUkQod29yZCk7Cit9CisKK0NQV0xfRWRpdEltcGxfUmVmcmVzaDo6Q1BXTF9FZGl0SW1wbF9SZWZyZXNoKCkge30KKworQ1BXTF9FZGl0SW1wbF9SZWZyZXNoOjp+Q1BXTF9FZGl0SW1wbF9SZWZyZXNoKCkge30KKwordm9pZCBDUFdMX0VkaXRJbXBsX1JlZnJlc2g6OkJlZ2luUmVmcmVzaCgpIHsKKyAgbV9SZWZyZXNoUmVjdHMuY2xlYXIoKTsKKyAgbV9PbGRMaW5lUmVjdHMgPSBzdGQ6Om1vdmUobV9OZXdMaW5lUmVjdHMpOworfQorCit2b2lkIENQV0xfRWRpdEltcGxfUmVmcmVzaDo6UHVzaChjb25zdCBDUFZUX1dvcmRSYW5nZSYgbGluZXJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgeworICBtX05ld0xpbmVSZWN0cy5lbXBsYWNlX2JhY2soQ1BXTF9FZGl0SW1wbF9MaW5lUmVjdChsaW5lcmFuZ2UsIHJlY3QpKTsKK30KKwordm9pZCBDUFdMX0VkaXRJbXBsX1JlZnJlc2g6Ok5vQW5hbHlzZSgpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBsaW5lUmVjdCA6IG1fT2xkTGluZVJlY3RzKQorICAgIEFkZChsaW5lUmVjdC5tX3JjTGluZSk7CisKKyAgZm9yIChjb25zdCBhdXRvJiBsaW5lUmVjdCA6IG1fTmV3TGluZVJlY3RzKQorICAgIEFkZChsaW5lUmVjdC5tX3JjTGluZSk7Cit9CisKK3N0ZDo6dmVjdG9yPENGWF9GbG9hdFJlY3Q+KiBDUFdMX0VkaXRJbXBsX1JlZnJlc2g6OkdldFJlZnJlc2hSZWN0cygpIHsKKyAgcmV0dXJuICZtX1JlZnJlc2hSZWN0czsKK30KKwordm9pZCBDUFdMX0VkaXRJbXBsX1JlZnJlc2g6OkVuZFJlZnJlc2goKSB7CisgIG1fUmVmcmVzaFJlY3RzLmNsZWFyKCk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbF9SZWZyZXNoOjpBZGQoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgbmV3X3JlY3QpIHsKKyAgLy8gQ2hlY2sgZm9yIG92ZXJsYXBwZWQgYXJlYS4KKyAgZm9yIChjb25zdCBhdXRvJiByZWN0IDogbV9SZWZyZXNoUmVjdHMpIHsKKyAgICBpZiAocmVjdC5Db250YWlucyhuZXdfcmVjdCkpCisgICAgICByZXR1cm47CisgIH0KKyAgbV9SZWZyZXNoUmVjdHMuZW1wbGFjZV9iYWNrKENGWF9GbG9hdFJlY3QobmV3X3JlY3QpKTsKK30KKworQ1BXTF9FZGl0SW1wbF9VbmRvOjpDUFdMX0VkaXRJbXBsX1VuZG8oKQorICAgIDogbV9uQ3VyVW5kb1BvcygwKSwgbV9iV29ya2luZyhmYWxzZSkge30KKworQ1BXTF9FZGl0SW1wbF9VbmRvOjp+Q1BXTF9FZGl0SW1wbF9VbmRvKCkge30KKworYm9vbCBDUFdMX0VkaXRJbXBsX1VuZG86OkNhblVuZG8oKSBjb25zdCB7CisgIHJldHVybiBtX25DdXJVbmRvUG9zID4gMDsKK30KKwordm9pZCBDUFdMX0VkaXRJbXBsX1VuZG86OlVuZG8oKSB7CisgIG1fYldvcmtpbmcgPSB0cnVlOworICBpZiAoQ2FuVW5kbygpKSB7CisgICAgbV9VbmRvSXRlbVN0YWNrW21fbkN1clVuZG9Qb3MgLSAxXS0+VW5kbygpOworICAgIG1fbkN1clVuZG9Qb3MtLTsKKyAgfQorICBtX2JXb3JraW5nID0gZmFsc2U7Cit9CisKK2Jvb2wgQ1BXTF9FZGl0SW1wbF9VbmRvOjpDYW5SZWRvKCkgY29uc3QgeworICByZXR1cm4gbV9uQ3VyVW5kb1BvcyA8IG1fVW5kb0l0ZW1TdGFjay5zaXplKCk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbF9VbmRvOjpSZWRvKCkgeworICBtX2JXb3JraW5nID0gdHJ1ZTsKKyAgaWYgKENhblJlZG8oKSkgeworICAgIG1fVW5kb0l0ZW1TdGFja1ttX25DdXJVbmRvUG9zXS0+UmVkbygpOworICAgIG1fbkN1clVuZG9Qb3MrKzsKKyAgfQorICBtX2JXb3JraW5nID0gZmFsc2U7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbF9VbmRvOjpBZGRJdGVtKHN0ZDo6dW5pcXVlX3B0cjxJRlhfRWRpdF9VbmRvSXRlbT4gcEl0ZW0pIHsKKyAgQVNTRVJUKCFtX2JXb3JraW5nKTsKKyAgQVNTRVJUKHBJdGVtKTsKKyAgaWYgKENhblJlZG8oKSkKKyAgICBSZW1vdmVUYWlscygpOworCisgIGlmIChtX1VuZG9JdGVtU3RhY2suc2l6ZSgpID49IGtFZGl0VW5kb01heEl0ZW1zKQorICAgIFJlbW92ZUhlYWRzKCk7CisKKyAgbV9VbmRvSXRlbVN0YWNrLnB1c2hfYmFjayhzdGQ6Om1vdmUocEl0ZW0pKTsKKyAgbV9uQ3VyVW5kb1BvcyA9IG1fVW5kb0l0ZW1TdGFjay5zaXplKCk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbF9VbmRvOjpSZW1vdmVIZWFkcygpIHsKKyAgQVNTRVJUKG1fVW5kb0l0ZW1TdGFjay5zaXplKCkgPiAxKTsKKyAgbV9VbmRvSXRlbVN0YWNrLnBvcF9mcm9udCgpOworfQorCit2b2lkIENQV0xfRWRpdEltcGxfVW5kbzo6UmVtb3ZlVGFpbHMoKSB7CisgIHdoaWxlIChDYW5SZWRvKCkpCisgICAgbV9VbmRvSXRlbVN0YWNrLnBvcF9iYWNrKCk7Cit9CisKK0NGWEVVX0luc2VydFdvcmQ6OkNGWEVVX0luc2VydFdvcmQoQ1BXTF9FZGl0SW1wbCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE9sZFBsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0KQorICAgIDogbV9wRWRpdChwRWRpdCksCisgICAgICBtX3dwT2xkKHdwT2xkUGxhY2UpLAorICAgICAgbV93cE5ldyh3cE5ld1BsYWNlKSwKKyAgICAgIG1fV29yZCh3b3JkKSwKKyAgICAgIG1fbkNoYXJzZXQoY2hhcnNldCkgeworICBBU1NFUlQobV9wRWRpdCk7Cit9CisKK0NGWEVVX0luc2VydFdvcmQ6On5DRlhFVV9JbnNlcnRXb3JkKCkge30KKwordm9pZCBDRlhFVV9JbnNlcnRXb3JkOjpSZWRvKCkgeworICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CisgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BPbGQpOworICBtX3BFZGl0LT5JbnNlcnRXb3JkKG1fV29yZCwgbV9uQ2hhcnNldCwgZmFsc2UsIHRydWUpOworfQorCit2b2lkIENGWEVVX0luc2VydFdvcmQ6OlVuZG8oKSB7CisgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKKyAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE5ldyk7CisgIG1fcEVkaXQtPkJhY2tzcGFjZShmYWxzZSwgdHJ1ZSk7Cit9CisKK0NGWEVVX0luc2VydFJldHVybjo6Q0ZYRVVfSW5zZXJ0UmV0dXJuKENQV0xfRWRpdEltcGwqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSkKKyAgICA6IG1fcEVkaXQocEVkaXQpLCBtX3dwT2xkKHdwT2xkUGxhY2UpLCBtX3dwTmV3KHdwTmV3UGxhY2UpIHsKKyAgQVNTRVJUKG1fcEVkaXQpOworfQorCitDRlhFVV9JbnNlcnRSZXR1cm46On5DRlhFVV9JbnNlcnRSZXR1cm4oKSB7fQorCit2b2lkIENGWEVVX0luc2VydFJldHVybjo6UmVkbygpIHsKKyAgbV9wRWRpdC0+U2VsZWN0Tm9uZSgpOworICBtX3BFZGl0LT5TZXRDYXJldChtX3dwT2xkKTsKKyAgbV9wRWRpdC0+SW5zZXJ0UmV0dXJuKGZhbHNlLCB0cnVlKTsKK30KKwordm9pZCBDRlhFVV9JbnNlcnRSZXR1cm46OlVuZG8oKSB7CisgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKKyAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE5ldyk7CisgIG1fcEVkaXQtPkJhY2tzcGFjZShmYWxzZSwgdHJ1ZSk7Cit9CisKK0NGWEVVX0JhY2tzcGFjZTo6Q0ZYRVVfQmFja3NwYWNlKENQV0xfRWRpdEltcGwqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQpCisgICAgOiBtX3BFZGl0KHBFZGl0KSwKKyAgICAgIG1fd3BPbGQod3BPbGRQbGFjZSksCisgICAgICBtX3dwTmV3KHdwTmV3UGxhY2UpLAorICAgICAgbV9Xb3JkKHdvcmQpLAorICAgICAgbV9uQ2hhcnNldChjaGFyc2V0KSB7CisgIEFTU0VSVChtX3BFZGl0KTsKK30KKworQ0ZYRVVfQmFja3NwYWNlOjp+Q0ZYRVVfQmFja3NwYWNlKCkge30KKwordm9pZCBDRlhFVV9CYWNrc3BhY2U6OlJlZG8oKSB7CisgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKKyAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE9sZCk7CisgIG1fcEVkaXQtPkJhY2tzcGFjZShmYWxzZSwgdHJ1ZSk7Cit9CisKK3ZvaWQgQ0ZYRVVfQmFja3NwYWNlOjpVbmRvKCkgeworICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CisgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BOZXcpOworICBpZiAobV93cE5ldy5uU2VjSW5kZXggIT0gbV93cE9sZC5uU2VjSW5kZXgpCisgICAgbV9wRWRpdC0+SW5zZXJ0UmV0dXJuKGZhbHNlLCB0cnVlKTsKKyAgZWxzZQorICAgIG1fcEVkaXQtPkluc2VydFdvcmQobV9Xb3JkLCBtX25DaGFyc2V0LCBmYWxzZSwgdHJ1ZSk7Cit9CisKK0NGWEVVX0RlbGV0ZTo6Q0ZYRVVfRGVsZXRlKENQV0xfRWRpdEltcGwqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZWNFbmQpCisgICAgOiBtX3BFZGl0KHBFZGl0KSwKKyAgICAgIG1fd3BPbGQod3BPbGRQbGFjZSksCisgICAgICBtX3dwTmV3KHdwTmV3UGxhY2UpLAorICAgICAgbV9Xb3JkKHdvcmQpLAorICAgICAgbV9uQ2hhcnNldChjaGFyc2V0KSwKKyAgICAgIG1fYlNlY0VuZChiU2VjRW5kKSB7CisgIEFTU0VSVChtX3BFZGl0KTsKK30KKworQ0ZYRVVfRGVsZXRlOjp+Q0ZYRVVfRGVsZXRlKCkge30KKwordm9pZCBDRlhFVV9EZWxldGU6OlJlZG8oKSB7CisgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKKyAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE9sZCk7CisgIG1fcEVkaXQtPkRlbGV0ZShmYWxzZSwgdHJ1ZSk7Cit9CisKK3ZvaWQgQ0ZYRVVfRGVsZXRlOjpVbmRvKCkgeworICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CisgIG1fcEVkaXQtPlNldENhcmV0KG1fd3BOZXcpOworICBpZiAobV9iU2VjRW5kKQorICAgIG1fcEVkaXQtPkluc2VydFJldHVybihmYWxzZSwgdHJ1ZSk7CisgIGVsc2UKKyAgICBtX3BFZGl0LT5JbnNlcnRXb3JkKG1fV29yZCwgbV9uQ2hhcnNldCwgZmFsc2UsIHRydWUpOworfQorCitDRlhFVV9DbGVhcjo6Q0ZYRVVfQ2xlYXIoQ1BXTF9FZGl0SW1wbCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHdyU2VsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHN3VGV4dCkKKyAgICA6IG1fcEVkaXQocEVkaXQpLCBtX3dyU2VsKHdyU2VsKSwgbV9zd1RleHQoc3dUZXh0KSB7CisgIEFTU0VSVChtX3BFZGl0KTsKK30KKworQ0ZYRVVfQ2xlYXI6On5DRlhFVV9DbGVhcigpIHt9CisKK3ZvaWQgQ0ZYRVVfQ2xlYXI6OlJlZG8oKSB7CisgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKKyAgbV9wRWRpdC0+U2V0U2VsZWN0aW9uKG1fd3JTZWwuQmVnaW5Qb3MsIG1fd3JTZWwuRW5kUG9zKTsKKyAgbV9wRWRpdC0+Q2xlYXIoZmFsc2UsIHRydWUpOworfQorCit2b2lkIENGWEVVX0NsZWFyOjpVbmRvKCkgeworICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CisgIG1fcEVkaXQtPlNldENhcmV0KG1fd3JTZWwuQmVnaW5Qb3MpOworICBtX3BFZGl0LT5JbnNlcnRUZXh0KG1fc3dUZXh0LCBGWF9DSEFSU0VUX0RlZmF1bHQsIGZhbHNlLCB0cnVlKTsKKyAgbV9wRWRpdC0+U2V0U2VsZWN0aW9uKG1fd3JTZWwuQmVnaW5Qb3MsIG1fd3JTZWwuRW5kUG9zKTsKK30KKworQ0ZYRVVfSW5zZXJ0VGV4dDo6Q0ZYRVVfSW5zZXJ0VGV4dChDUFdMX0VkaXRJbXBsKiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE5ld1BsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzd1RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCkKKyAgICA6IG1fcEVkaXQocEVkaXQpLAorICAgICAgbV93cE9sZCh3cE9sZFBsYWNlKSwKKyAgICAgIG1fd3BOZXcod3BOZXdQbGFjZSksCisgICAgICBtX3N3VGV4dChzd1RleHQpLAorICAgICAgbV9uQ2hhcnNldChjaGFyc2V0KSB7CisgIEFTU0VSVChtX3BFZGl0KTsKK30KKworQ0ZYRVVfSW5zZXJ0VGV4dDo6fkNGWEVVX0luc2VydFRleHQoKSB7fQorCit2b2lkIENGWEVVX0luc2VydFRleHQ6OlJlZG8oKSB7CisgIG1fcEVkaXQtPlNlbGVjdE5vbmUoKTsKKyAgbV9wRWRpdC0+U2V0Q2FyZXQobV93cE9sZCk7CisgIG1fcEVkaXQtPkluc2VydFRleHQobV9zd1RleHQsIG1fbkNoYXJzZXQsIGZhbHNlLCB0cnVlKTsKK30KKwordm9pZCBDRlhFVV9JbnNlcnRUZXh0OjpVbmRvKCkgeworICBtX3BFZGl0LT5TZWxlY3ROb25lKCk7CisgIG1fcEVkaXQtPlNldFNlbGVjdGlvbihtX3dwT2xkLCBtX3dwTmV3KTsKKyAgbV9wRWRpdC0+Q2xlYXIoZmFsc2UsIHRydWUpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ1BXTF9FZGl0SW1wbDo6RHJhd0VkaXQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbXRVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9FZGl0SW1wbCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPTE9SUkVGIGNyVGV4dEZpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjQ2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRkZMRGF0YSkgeworICBjb25zdCBib29sIGJDb250aW51b3VzID0KKyAgICAgIHBFZGl0LT5HZXRDaGFyQXJyYXkoKSA9PSAwICYmIHBFZGl0LT5HZXRDaGFyU3BhY2UoKSA8PSAwLjBmOworICB1aW50MTZfdCBTdWJXb3JkID0gcEVkaXQtPkdldFBhc3N3b3JkQ2hhcigpOworICBmbG9hdCBmRm9udFNpemUgPSBwRWRpdC0+R2V0Rm9udFNpemUoKTsKKyAgQ1BWVF9Xb3JkUmFuZ2Ugd3JTZWxlY3QgPSBwRWRpdC0+R2V0U2VsZWN0V29yZFJhbmdlKCk7CisgIGludDMyX3QgbkhvcnpTY2FsZSA9IHBFZGl0LT5HZXRIb3J6U2NhbGUoKTsKKworICBGWF9DT0xPUlJFRiBjckN1ckZpbGwgPSBjclRleHRGaWxsOworICBGWF9DT0xPUlJFRiBjck9sZEZpbGwgPSBjckN1ckZpbGw7CisKKyAgYm9vbCBiU2VsZWN0ID0gZmFsc2U7CisgIHN0YXRpYyBjb25zdCBGWF9DT0xPUlJFRiBjcldoaXRlID0gQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpOworICBzdGF0aWMgY29uc3QgRlhfQ09MT1JSRUYgY3JTZWxCSyA9IEFyZ2JFbmNvZGUoMjU1LCAwLCA1MSwgMTEzKTsKKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc1RleHRCdWY7CisgIGludDMyX3QgbkZvbnRJbmRleCA9IC0xOworICBDRlhfUG9pbnRGIHB0QlQ7CisgIENGWF9SZW5kZXJEZXZpY2U6OlN0YXRlUmVzdG9yZXIgcmVzdG9yZXIocERldmljZSk7CisgIGlmICghcmNDbGlwLklzRW1wdHkoKSkKKyAgICBwRGV2aWNlLT5TZXRDbGlwX1JlY3QobXRVc2VyMkRldmljZS5UcmFuc2Zvcm1SZWN0KHJjQ2xpcCkuVG9GeFJlY3QoKSk7CisKKyAgQ1BXTF9FZGl0SW1wbF9JdGVyYXRvciogcEl0ZXJhdG9yID0gcEVkaXQtPkdldEl0ZXJhdG9yKCk7CisgIElQVlRfRm9udE1hcCogcEZvbnRNYXAgPSBwRWRpdC0+R2V0Rm9udE1hcCgpOworICBpZiAoIXBGb250TWFwKQorICAgIHJldHVybjsKKworICBpZiAocFJhbmdlKQorICAgIHBJdGVyYXRvci0+U2V0QXQocFJhbmdlLT5CZWdpblBvcyk7CisgIGVsc2UKKyAgICBwSXRlcmF0b3ItPlNldEF0KDApOworCisgIENQVlRfV29yZFBsYWNlIG9sZHBsYWNlOworICB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0V29yZCgpKSB7CisgICAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2UgPSBwSXRlcmF0b3ItPkdldEF0KCk7CisgICAgaWYgKHBSYW5nZSAmJiBwbGFjZSA+IHBSYW5nZS0+RW5kUG9zKQorICAgICAgYnJlYWs7CisKKyAgICBpZiAoIXdyU2VsZWN0LklzRW1wdHkoKSkgeworICAgICAgYlNlbGVjdCA9IHBsYWNlID4gd3JTZWxlY3QuQmVnaW5Qb3MgJiYgcGxhY2UgPD0gd3JTZWxlY3QuRW5kUG9zOworICAgICAgY3JDdXJGaWxsID0gYlNlbGVjdCA/IGNyV2hpdGUgOiBjclRleHRGaWxsOworICAgIH0KKyAgICBpZiAocFN5c3RlbUhhbmRsZXIgJiYgcFN5c3RlbUhhbmRsZXItPklzU2VsZWN0aW9uSW1wbGVtZW50ZWQoKSkgeworICAgICAgY3JDdXJGaWxsID0gY3JUZXh0RmlsbDsKKyAgICAgIGNyT2xkRmlsbCA9IGNyQ3VyRmlsbDsKKyAgICB9CisgICAgQ1BWVF9Xb3JkIHdvcmQ7CisgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKSkgeworICAgICAgaWYgKGJTZWxlY3QpIHsKKyAgICAgICAgQ1BWVF9MaW5lIGxpbmU7CisgICAgICAgIHBJdGVyYXRvci0+R2V0TGluZShsaW5lKTsKKworICAgICAgICBpZiAocFN5c3RlbUhhbmRsZXIgJiYgcFN5c3RlbUhhbmRsZXItPklzU2VsZWN0aW9uSW1wbGVtZW50ZWQoKSkgeworICAgICAgICAgIENGWF9GbG9hdFJlY3QgcmMod29yZC5wdFdvcmQueCwgbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVEZXNjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVBc2NlbnQpOworICAgICAgICAgIHJjLkludGVyc2VjdChyY0NsaXApOworICAgICAgICAgIHBTeXN0ZW1IYW5kbGVyLT5PdXRwdXRTZWxlY3RlZFJlY3QocEZGTERhdGEsIHJjKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDRlhfUGF0aERhdGEgcGF0aFNlbEJLOworICAgICAgICAgIHBhdGhTZWxCSy5BcHBlbmRSZWN0KHdvcmQucHRXb3JkLngsIGxpbmUucHRMaW5lLnkgKyBsaW5lLmZMaW5lRGVzY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVBc2NlbnQpOworCisgICAgICAgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGhTZWxCSywgJm10VXNlcjJEZXZpY2UsIG51bGxwdHIsIGNyU2VsQkssIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhGSUxMX1dJTkRJTkcpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmIChiQ29udGludW91cykgeworICAgICAgICBpZiAocGxhY2UuTGluZUNtcChvbGRwbGFjZSkgIT0gMCB8fCB3b3JkLm5Gb250SW5kZXggIT0gbkZvbnRJbmRleCB8fAorICAgICAgICAgICAgY3JPbGRGaWxsICE9IGNyQ3VyRmlsbCkgeworICAgICAgICAgIGlmIChzVGV4dEJ1Zi50ZWxscCgpID4gMCkgeworICAgICAgICAgICAgRHJhd1RleHRTdHJpbmcoCisgICAgICAgICAgICAgICAgcERldmljZSwgQ0ZYX1BvaW50RihwdEJULnggKyBwdE9mZnNldC54LCBwdEJULnkgKyBwdE9mZnNldC55KSwKKyAgICAgICAgICAgICAgICBwRm9udE1hcC0+R2V0UERGRm9udChuRm9udEluZGV4KSwgZkZvbnRTaXplLCBtdFVzZXIyRGV2aWNlLAorICAgICAgICAgICAgICAgIEJ5dGVTdHJpbmcoc1RleHRCdWYpLCBjck9sZEZpbGwsIG5Ib3J6U2NhbGUpOworCisgICAgICAgICAgICBzVGV4dEJ1Zi5zdHIoIiIpOworICAgICAgICAgIH0KKyAgICAgICAgICBuRm9udEluZGV4ID0gd29yZC5uRm9udEluZGV4OworICAgICAgICAgIHB0QlQgPSB3b3JkLnB0V29yZDsKKyAgICAgICAgICBjck9sZEZpbGwgPSBjckN1ckZpbGw7CisgICAgICAgIH0KKworICAgICAgICBzVGV4dEJ1ZiA8PCBwRWRpdC0+R2V0UERGV29yZFN0cmluZyh3b3JkLm5Gb250SW5kZXgsIHdvcmQuV29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViV29yZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBEcmF3VGV4dFN0cmluZygKKyAgICAgICAgICAgIHBEZXZpY2UsCisgICAgICAgICAgICBDRlhfUG9pbnRGKHdvcmQucHRXb3JkLnggKyBwdE9mZnNldC54LCB3b3JkLnB0V29yZC55ICsgcHRPZmZzZXQueSksCisgICAgICAgICAgICBwRm9udE1hcC0+R2V0UERGRm9udCh3b3JkLm5Gb250SW5kZXgpLCBmRm9udFNpemUsIG10VXNlcjJEZXZpY2UsCisgICAgICAgICAgICBwRWRpdC0+R2V0UERGV29yZFN0cmluZyh3b3JkLm5Gb250SW5kZXgsIHdvcmQuV29yZCwgU3ViV29yZCksCisgICAgICAgICAgICBjckN1ckZpbGwsIG5Ib3J6U2NhbGUpOworICAgICAgfQorICAgICAgb2xkcGxhY2UgPSBwbGFjZTsKKyAgICB9CisgIH0KKworICBpZiAoc1RleHRCdWYudGVsbHAoKSA+IDApIHsKKyAgICBEcmF3VGV4dFN0cmluZyhwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgIENGWF9Qb2ludEYocHRCVC54ICsgcHRPZmZzZXQueCwgcHRCVC55ICsgcHRPZmZzZXQueSksCisgICAgICAgICAgICAgICAgICAgcEZvbnRNYXAtPkdldFBERkZvbnQobkZvbnRJbmRleCksIGZGb250U2l6ZSwgbXRVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nKHNUZXh0QnVmKSwgY3JPbGRGaWxsLCBuSG9yelNjYWxlKTsKKyAgfQorfQorCitDUFdMX0VkaXRJbXBsOjpDUFdMX0VkaXRJbXBsKCkKKyAgICA6IG1fcFZUKHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1ZhcmlhYmxlVGV4dD4oKSksCisgICAgICBtX2JFbmFibGVTY3JvbGwoZmFsc2UpLAorICAgICAgbV9uQWxpZ25tZW50KDApLAorICAgICAgbV9iTm90aWZ5RmxhZyhmYWxzZSksCisgICAgICBtX2JFbmFibGVPdmVyZmxvdyhmYWxzZSksCisgICAgICBtX2JFbmFibGVSZWZyZXNoKHRydWUpLAorICAgICAgbV9iRW5hYmxlVW5kbyh0cnVlKSB7fQorCitDUFdMX0VkaXRJbXBsOjp+Q1BXTF9FZGl0SW1wbCgpIHt9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbDo6SW5pdGlhbGl6ZSgpIHsKKyAgbV9wVlQtPkluaXRpYWxpemUoKTsKKyAgU2V0Q2FyZXQobV9wVlQtPkdldEJlZ2luV29yZFBsYWNlKCkpOworICBTZXRDYXJldE9yaWdpbigpOworfQorCit2b2lkIENQV0xfRWRpdEltcGw6OlNldEZvbnRNYXAoSVBWVF9Gb250TWFwKiBwRm9udE1hcCkgeworICBtX3BWVFByb3ZpZGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQV0xfRWRpdEltcGxfUHJvdmlkZXI+KHBGb250TWFwKTsKKyAgbV9wVlQtPlNldFByb3ZpZGVyKG1fcFZUUHJvdmlkZXIuZ2V0KCkpOworfQorCit2b2lkIENQV0xfRWRpdEltcGw6OlNldE5vdGlmeShDUFdMX0VkaXRDdHJsKiBwTm90aWZ5KSB7CisgIG1fcE5vdGlmeSA9IHBOb3RpZnk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbDo6U2V0T3BlcmF0aW9uTm90aWZ5KENQV0xfRWRpdCogcE9wZXJhdGlvbk5vdGlmeSkgeworICBtX3BPcGVyYXRpb25Ob3RpZnkgPSBwT3BlcmF0aW9uTm90aWZ5OworfQorCitDUFdMX0VkaXRJbXBsX0l0ZXJhdG9yKiBDUFdMX0VkaXRJbXBsOjpHZXRJdGVyYXRvcigpIHsKKyAgaWYgKCFtX3BJdGVyYXRvcikgeworICAgIG1fcEl0ZXJhdG9yID0KKyAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENQV0xfRWRpdEltcGxfSXRlcmF0b3I+KHRoaXMsIG1fcFZULT5HZXRJdGVyYXRvcigpKTsKKyAgfQorICByZXR1cm4gbV9wSXRlcmF0b3IuZ2V0KCk7Cit9CisKK0lQVlRfRm9udE1hcCogQ1BXTF9FZGl0SW1wbDo6R2V0Rm9udE1hcCgpIHsKKyAgcmV0dXJuIG1fcFZUUHJvdmlkZXIgPyBtX3BWVFByb3ZpZGVyLT5HZXRGb250TWFwKCkgOiBudWxscHRyOworfQorCit2b2lkIENQV0xfRWRpdEltcGw6OlNldFBsYXRlUmVjdChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KSB7CisgIG1fcFZULT5TZXRQbGF0ZVJlY3QocmVjdCk7CisgIG1fcHRTY3JvbGxQb3MgPSBDRlhfUG9pbnRGKHJlY3QubGVmdCwgcmVjdC50b3ApOworICBQYWludCgpOworfQorCit2b2lkIENQV0xfRWRpdEltcGw6OlNldEFsaWdubWVudEgoaW50MzJfdCBuRm9ybWF0LCBib29sIGJQYWludCkgeworICBtX3BWVC0+U2V0QWxpZ25tZW50KG5Gb3JtYXQpOworICBpZiAoYlBhaW50KQorICAgIFBhaW50KCk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbDo6U2V0QWxpZ25tZW50VihpbnQzMl90IG5Gb3JtYXQsIGJvb2wgYlBhaW50KSB7CisgIG1fbkFsaWdubWVudCA9IG5Gb3JtYXQ7CisgIGlmIChiUGFpbnQpCisgICAgUGFpbnQoKTsKK30KKwordm9pZCBDUFdMX0VkaXRJbXBsOjpTZXRQYXNzd29yZENoYXIodWludDE2X3Qgd1N1YldvcmQsIGJvb2wgYlBhaW50KSB7CisgIG1fcFZULT5TZXRQYXNzd29yZENoYXIod1N1YldvcmQpOworICBpZiAoYlBhaW50KQorICAgIFBhaW50KCk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbDo6U2V0TGltaXRDaGFyKGludDMyX3QgbkxpbWl0Q2hhcikgeworICBtX3BWVC0+U2V0TGltaXRDaGFyKG5MaW1pdENoYXIpOworICBQYWludCgpOworfQorCit2b2lkIENQV0xfRWRpdEltcGw6OlNldENoYXJBcnJheShpbnQzMl90IG5DaGFyQXJyYXkpIHsKKyAgbV9wVlQtPlNldENoYXJBcnJheShuQ2hhckFycmF5KTsKKyAgUGFpbnQoKTsKK30KKwordm9pZCBDUFdMX0VkaXRJbXBsOjpTZXRDaGFyU3BhY2UoZmxvYXQgZkNoYXJTcGFjZSkgeworICBtX3BWVC0+U2V0Q2hhclNwYWNlKGZDaGFyU3BhY2UpOworICBQYWludCgpOworfQorCit2b2lkIENQV0xfRWRpdEltcGw6OlNldE11bHRpTGluZShib29sIGJNdWx0aUxpbmUsIGJvb2wgYlBhaW50KSB7CisgIG1fcFZULT5TZXRNdWx0aUxpbmUoYk11bHRpTGluZSk7CisgIGlmIChiUGFpbnQpCisgICAgUGFpbnQoKTsKK30KKwordm9pZCBDUFdMX0VkaXRJbXBsOjpTZXRBdXRvUmV0dXJuKGJvb2wgYkF1dG8sIGJvb2wgYlBhaW50KSB7CisgIG1fcFZULT5TZXRBdXRvUmV0dXJuKGJBdXRvKTsKKyAgaWYgKGJQYWludCkKKyAgICBQYWludCgpOworfQorCit2b2lkIENQV0xfRWRpdEltcGw6OlNldEF1dG9Gb250U2l6ZShib29sIGJBdXRvLCBib29sIGJQYWludCkgeworICBtX3BWVC0+U2V0QXV0b0ZvbnRTaXplKGJBdXRvKTsKKyAgaWYgKGJQYWludCkKKyAgICBQYWludCgpOworfQorCit2b2lkIENQV0xfRWRpdEltcGw6OlNldEZvbnRTaXplKGZsb2F0IGZGb250U2l6ZSkgeworICBtX3BWVC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKKyAgUGFpbnQoKTsKK30KKwordm9pZCBDUFdMX0VkaXRJbXBsOjpTZXRBdXRvU2Nyb2xsKGJvb2wgYkF1dG8sIGJvb2wgYlBhaW50KSB7CisgIG1fYkVuYWJsZVNjcm9sbCA9IGJBdXRvOworICBpZiAoYlBhaW50KQorICAgIFBhaW50KCk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbDo6U2V0VGV4dE92ZXJmbG93KGJvb2wgYkFsbG93ZWQsIGJvb2wgYlBhaW50KSB7CisgIG1fYkVuYWJsZU92ZXJmbG93ID0gYkFsbG93ZWQ7CisgIGlmIChiUGFpbnQpCisgICAgUGFpbnQoKTsKK30KKwordm9pZCBDUFdMX0VkaXRJbXBsOjpTZXRTZWxlY3Rpb24oaW50MzJfdCBuU3RhcnRDaGFyLCBpbnQzMl90IG5FbmRDaGFyKSB7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgaWYgKG5TdGFydENoYXIgPT0gMCAmJiBuRW5kQ2hhciA8IDApIHsKKyAgICAgIFNlbGVjdEFsbCgpOworICAgIH0gZWxzZSBpZiAoblN0YXJ0Q2hhciA8IDApIHsKKyAgICAgIFNlbGVjdE5vbmUoKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKG5TdGFydENoYXIgPCBuRW5kQ2hhcikgeworICAgICAgICBTZXRTZWxlY3Rpb24obV9wVlQtPldvcmRJbmRleFRvV29yZFBsYWNlKG5TdGFydENoYXIpLAorICAgICAgICAgICAgICAgICAgICAgbV9wVlQtPldvcmRJbmRleFRvV29yZFBsYWNlKG5FbmRDaGFyKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBTZXRTZWxlY3Rpb24obV9wVlQtPldvcmRJbmRleFRvV29yZFBsYWNlKG5FbmRDaGFyKSwKKyAgICAgICAgICAgICAgICAgICAgIG1fcFZULT5Xb3JkSW5kZXhUb1dvcmRQbGFjZShuU3RhcnRDaGFyKSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbDo6U2V0U2VsZWN0aW9uKGNvbnN0IENQVlRfV29yZFBsYWNlJiBiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiBlbmQpIHsKKyAgaWYgKCFtX3BWVC0+SXNWYWxpZCgpKQorICAgIHJldHVybjsKKworICBTZWxlY3ROb25lKCk7CisgIG1fU2VsU3RhdGUuU2V0KGJlZ2luLCBlbmQpOworICBTZXRDYXJldChtX1NlbFN0YXRlLkVuZFBvcyk7CisgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgaWYgKCFtX1NlbFN0YXRlLklzRW1wdHkoKSkKKyAgICBSZWZyZXNoKCk7CisgIFNldENhcmV0SW5mbygpOworfQorCit2b2lkIENQV0xfRWRpdEltcGw6OkdldFNlbGVjdGlvbihpbnQzMl90JiBuU3RhcnRDaGFyLCBpbnQzMl90JiBuRW5kQ2hhcikgY29uc3QgeworICBuU3RhcnRDaGFyID0gLTE7CisgIG5FbmRDaGFyID0gLTE7CisgIGlmICghbV9wVlQtPklzVmFsaWQoKSkKKyAgICByZXR1cm47CisKKyAgaWYgKG1fU2VsU3RhdGUuSXNFbXB0eSgpKSB7CisgICAgblN0YXJ0Q2hhciA9IG1fcFZULT5Xb3JkUGxhY2VUb1dvcmRJbmRleChtX3dwQ2FyZXQpOworICAgIG5FbmRDaGFyID0gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fd3BDYXJldCk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChtX1NlbFN0YXRlLkJlZ2luUG9zIDwgbV9TZWxTdGF0ZS5FbmRQb3MpIHsKKyAgICBuU3RhcnRDaGFyID0gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fU2VsU3RhdGUuQmVnaW5Qb3MpOworICAgIG5FbmRDaGFyID0gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fU2VsU3RhdGUuRW5kUG9zKTsKKyAgICByZXR1cm47CisgIH0KKyAgblN0YXJ0Q2hhciA9IG1fcFZULT5Xb3JkUGxhY2VUb1dvcmRJbmRleChtX1NlbFN0YXRlLkVuZFBvcyk7CisgIG5FbmRDaGFyID0gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fU2VsU3RhdGUuQmVnaW5Qb3MpOworfQorCitpbnQzMl90IENQV0xfRWRpdEltcGw6OkdldENhcmV0KCkgY29uc3QgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkKKyAgICByZXR1cm4gbV9wVlQtPldvcmRQbGFjZVRvV29yZEluZGV4KG1fd3BDYXJldCk7CisKKyAgcmV0dXJuIC0xOworfQorCitDUFZUX1dvcmRQbGFjZSBDUFdMX0VkaXRJbXBsOjpHZXRDYXJldFdvcmRQbGFjZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fd3BDYXJldDsKK30KKworV2lkZVN0cmluZyBDUFdMX0VkaXRJbXBsOjpHZXRUZXh0KCkgY29uc3QgeworICBXaWRlU3RyaW5nIHN3UmV0OworICBpZiAoIW1fcFZULT5Jc1ZhbGlkKCkpCisgICAgcmV0dXJuIHN3UmV0OworCisgIENQREZfVmFyaWFibGVUZXh0OjpJdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCk7CisgIHBJdGVyYXRvci0+U2V0QXQoMCk7CisKKyAgQ1BWVF9Xb3JkIHdvcmRpbmZvOworICBDUFZUX1dvcmRQbGFjZSBvbGRwbGFjZSA9IHBJdGVyYXRvci0+R2V0V29yZFBsYWNlKCk7CisgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKKyAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0V29yZFBsYWNlKCk7CisgICAgaWYgKHBJdGVyYXRvci0+R2V0V29yZCh3b3JkaW5mbykpCisgICAgICBzd1JldCArPSB3b3JkaW5mby5Xb3JkOworICAgIGlmIChvbGRwbGFjZS5uU2VjSW5kZXggIT0gcGxhY2UublNlY0luZGV4KQorICAgICAgc3dSZXQgKz0gTCJcclxuIjsKKyAgICBvbGRwbGFjZSA9IHBsYWNlOworICB9CisgIHJldHVybiBzd1JldDsKK30KKworV2lkZVN0cmluZyBDUFdMX0VkaXRJbXBsOjpHZXRSYW5nZVRleHQoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHJhbmdlKSBjb25zdCB7CisgIFdpZGVTdHJpbmcgc3dSZXQ7CisgIGlmICghbV9wVlQtPklzVmFsaWQoKSkKKyAgICByZXR1cm4gc3dSZXQ7CisKKyAgQ1BERl9WYXJpYWJsZVRleHQ6Okl0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKTsKKyAgQ1BWVF9Xb3JkUmFuZ2Ugd3JUZW1wID0gcmFuZ2U7CisgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2Uod3JUZW1wLkJlZ2luUG9zKTsKKyAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZSh3clRlbXAuRW5kUG9zKTsKKyAgcEl0ZXJhdG9yLT5TZXRBdCh3clRlbXAuQmVnaW5Qb3MpOworCisgIENQVlRfV29yZCB3b3JkaW5mbzsKKyAgQ1BWVF9Xb3JkUGxhY2Ugb2xkcGxhY2UgPSB3clRlbXAuQmVnaW5Qb3M7CisgIHdoaWxlIChwSXRlcmF0b3ItPk5leHRXb3JkKCkpIHsKKyAgICBDUFZUX1dvcmRQbGFjZSBwbGFjZSA9IHBJdGVyYXRvci0+R2V0V29yZFBsYWNlKCk7CisgICAgaWYgKHBsYWNlID4gd3JUZW1wLkVuZFBvcykKKyAgICAgIGJyZWFrOworICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pKQorICAgICAgc3dSZXQgKz0gd29yZGluZm8uV29yZDsKKyAgICBpZiAob2xkcGxhY2UublNlY0luZGV4ICE9IHBsYWNlLm5TZWNJbmRleCkKKyAgICAgIHN3UmV0ICs9IEwiXHJcbiI7CisgICAgb2xkcGxhY2UgPSBwbGFjZTsKKyAgfQorICByZXR1cm4gc3dSZXQ7Cit9CisKK1dpZGVTdHJpbmcgQ1BXTF9FZGl0SW1wbDo6R2V0U2VsZWN0ZWRUZXh0KCkgY29uc3QgeworICByZXR1cm4gR2V0UmFuZ2VUZXh0KG1fU2VsU3RhdGUuQ29udmVydFRvV29yZFJhbmdlKCkpOworfQorCitpbnQzMl90IENQV0xfRWRpdEltcGw6OkdldFRvdGFsTGluZXMoKSBjb25zdCB7CisgIGludDMyX3QgbkxpbmVzID0gMTsKKworICBDUERGX1ZhcmlhYmxlVGV4dDo6SXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpOworICBwSXRlcmF0b3ItPlNldEF0KDApOworICB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0TGluZSgpKQorICAgICsrbkxpbmVzOworCisgIHJldHVybiBuTGluZXM7Cit9CisKK0NQVlRfV29yZFJhbmdlIENQV0xfRWRpdEltcGw6OkdldFNlbGVjdFdvcmRSYW5nZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fU2VsU3RhdGUuQ29udmVydFRvV29yZFJhbmdlKCk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbDo6U2V0VGV4dChjb25zdCBXaWRlU3RyaW5nJiBzVGV4dCkgeworICBFbXB0eSgpOworICBEb0luc2VydFRleHQoQ1BWVF9Xb3JkUGxhY2UoMCwgMCwgLTEpLCBzVGV4dCwgRlhfQ0hBUlNFVF9EZWZhdWx0KTsKKyAgUGFpbnQoKTsKK30KKworYm9vbCBDUFdMX0VkaXRJbXBsOjpJbnNlcnRXb3JkKHVpbnQxNl90IHdvcmQsIGludDMyX3QgY2hhcnNldCkgeworICByZXR1cm4gSW5zZXJ0V29yZCh3b3JkLCBjaGFyc2V0LCB0cnVlLCB0cnVlKTsKK30KKworYm9vbCBDUFdMX0VkaXRJbXBsOjpJbnNlcnRSZXR1cm4oKSB7CisgIHJldHVybiBJbnNlcnRSZXR1cm4odHJ1ZSwgdHJ1ZSk7Cit9CisKK2Jvb2wgQ1BXTF9FZGl0SW1wbDo6QmFja3NwYWNlKCkgeworICByZXR1cm4gQmFja3NwYWNlKHRydWUsIHRydWUpOworfQorCitib29sIENQV0xfRWRpdEltcGw6OkRlbGV0ZSgpIHsKKyAgcmV0dXJuIERlbGV0ZSh0cnVlLCB0cnVlKTsKK30KKworYm9vbCBDUFdMX0VkaXRJbXBsOjpDbGVhclNlbGVjdGlvbigpIHsKKyAgcmV0dXJuIENsZWFyKHRydWUsIHRydWUpOworfQorCitib29sIENQV0xfRWRpdEltcGw6Okluc2VydFRleHQoY29uc3QgV2lkZVN0cmluZyYgc1RleHQsIGludDMyX3QgY2hhcnNldCkgeworICByZXR1cm4gSW5zZXJ0VGV4dChzVGV4dCwgY2hhcnNldCwgdHJ1ZSwgdHJ1ZSk7Cit9CisKK2Zsb2F0IENQV0xfRWRpdEltcGw6OkdldEZvbnRTaXplKCkgY29uc3QgeworICByZXR1cm4gbV9wVlQtPkdldEZvbnRTaXplKCk7Cit9CisKK3VpbnQxNl90IENQV0xfRWRpdEltcGw6OkdldFBhc3N3b3JkQ2hhcigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcFZULT5HZXRQYXNzd29yZENoYXIoKTsKK30KKworaW50MzJfdCBDUFdMX0VkaXRJbXBsOjpHZXRDaGFyQXJyYXkoKSBjb25zdCB7CisgIHJldHVybiBtX3BWVC0+R2V0Q2hhckFycmF5KCk7Cit9CisKK0NGWF9GbG9hdFJlY3QgQ1BXTF9FZGl0SW1wbDo6R2V0Q29udGVudFJlY3QoKSBjb25zdCB7CisgIHJldHVybiBWVFRvRWRpdChtX3BWVC0+R2V0Q29udGVudFJlY3QoKSk7Cit9CisKK2ludDMyX3QgQ1BXTF9FZGl0SW1wbDo6R2V0SG9yelNjYWxlKCkgY29uc3QgeworICByZXR1cm4gbV9wVlQtPkdldEhvcnpTY2FsZSgpOworfQorCitmbG9hdCBDUFdMX0VkaXRJbXBsOjpHZXRDaGFyU3BhY2UoKSBjb25zdCB7CisgIHJldHVybiBtX3BWVC0+R2V0Q2hhclNwYWNlKCk7Cit9CisKK0NQVlRfV29yZFJhbmdlIENQV0xfRWRpdEltcGw6OkdldFdob2xlV29yZFJhbmdlKCkgY29uc3QgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkKKyAgICByZXR1cm4gQ1BWVF9Xb3JkUmFuZ2UobV9wVlQtPkdldEJlZ2luV29yZFBsYWNlKCksIG1fcFZULT5HZXRFbmRXb3JkUGxhY2UoKSk7CisKKyAgcmV0dXJuIENQVlRfV29yZFJhbmdlKCk7Cit9CisKK0NQVlRfV29yZFJhbmdlIENQV0xfRWRpdEltcGw6OkdldFZpc2libGVXb3JkUmFuZ2UoKSBjb25zdCB7CisgIGlmIChtX2JFbmFibGVPdmVyZmxvdykKKyAgICByZXR1cm4gR2V0V2hvbGVXb3JkUmFuZ2UoKTsKKworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIENGWF9GbG9hdFJlY3QgcmNQbGF0ZSA9IG1fcFZULT5HZXRQbGF0ZVJlY3QoKTsKKworICAgIENQVlRfV29yZFBsYWNlIHBsYWNlMSA9CisgICAgICAgIG1fcFZULT5TZWFyY2hXb3JkUGxhY2UoRWRpdFRvVlQoQ0ZYX1BvaW50RihyY1BsYXRlLmxlZnQsIHJjUGxhdGUudG9wKSkpOworICAgIENQVlRfV29yZFBsYWNlIHBsYWNlMiA9IG1fcFZULT5TZWFyY2hXb3JkUGxhY2UoCisgICAgICAgIEVkaXRUb1ZUKENGWF9Qb2ludEYocmNQbGF0ZS5yaWdodCwgcmNQbGF0ZS5ib3R0b20pKSk7CisKKyAgICByZXR1cm4gQ1BWVF9Xb3JkUmFuZ2UocGxhY2UxLCBwbGFjZTIpOworICB9CisKKyAgcmV0dXJuIENQVlRfV29yZFJhbmdlKCk7Cit9CisKK0NQVlRfV29yZFBsYWNlIENQV0xfRWRpdEltcGw6OlNlYXJjaFdvcmRQbGFjZShjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3QgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIHJldHVybiBtX3BWVC0+U2VhcmNoV29yZFBsYWNlKEVkaXRUb1ZUKHBvaW50KSk7CisgIH0KKworICByZXR1cm4gQ1BWVF9Xb3JkUGxhY2UoKTsKK30KKwordm9pZCBDUFdMX0VkaXRJbXBsOjpQYWludCgpIHsKKyAgaWYgKG1fcFZULT5Jc1ZhbGlkKCkpIHsKKyAgICBSZWFycmFuZ2VBbGwoKTsKKyAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgUmVmcmVzaCgpOworICAgIFNldENhcmV0T3JpZ2luKCk7CisgICAgU2V0Q2FyZXRJbmZvKCk7CisgIH0KK30KKwordm9pZCBDUFdMX0VkaXRJbXBsOjpSZWFycmFuZ2VBbGwoKSB7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOworICAgIG1fcFZULT5SZWFycmFuZ2VBbGwoKTsKKyAgICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKG1fd3BDYXJldCk7CisgICAgU2V0U2Nyb2xsSW5mbygpOworICAgIFNldENvbnRlbnRDaGFuZ2VkKCk7CisgIH0KK30KKwordm9pZCBDUFdMX0VkaXRJbXBsOjpSZWFycmFuZ2VQYXJ0KGNvbnN0IENQVlRfV29yZFJhbmdlJiByYW5nZSkgeworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2UobV93cENhcmV0KTsKKyAgICBtX3BWVC0+UmVhcnJhbmdlUGFydChyYW5nZSk7CisgICAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOworICAgIFNldFNjcm9sbEluZm8oKTsKKyAgICBTZXRDb250ZW50Q2hhbmdlZCgpOworICB9Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbDo6U2V0Q29udGVudENoYW5nZWQoKSB7CisgIGlmIChtX3BOb3RpZnkpIHsKKyAgICBDRlhfRmxvYXRSZWN0IHJjQ29udGVudCA9IG1fcFZULT5HZXRDb250ZW50UmVjdCgpOworICAgIGlmIChyY0NvbnRlbnQuV2lkdGgoKSAhPSBtX3JjT2xkQ29udGVudC5XaWR0aCgpIHx8CisgICAgICAgIHJjQ29udGVudC5IZWlnaHQoKSAhPSBtX3JjT2xkQ29udGVudC5IZWlnaHQoKSkgeworICAgICAgbV9yY09sZENvbnRlbnQgPSByY0NvbnRlbnQ7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbDo6U2VsZWN0QWxsKCkgeworICBpZiAoIW1fcFZULT5Jc1ZhbGlkKCkpCisgICAgcmV0dXJuOworICBtX1NlbFN0YXRlID0gQ1BXTF9FZGl0SW1wbF9TZWxlY3QoR2V0V2hvbGVXb3JkUmFuZ2UoKSk7CisgIFNldENhcmV0KG1fU2VsU3RhdGUuRW5kUG9zKTsKKyAgU2Nyb2xsVG9DYXJldCgpOworICBSZWZyZXNoKCk7CisgIFNldENhcmV0SW5mbygpOworfQorCit2b2lkIENQV0xfRWRpdEltcGw6OlNlbGVjdE5vbmUoKSB7CisgIGlmICghbV9wVlQtPklzVmFsaWQoKSB8fCBtX1NlbFN0YXRlLklzRW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgbV9TZWxTdGF0ZS5SZXNldCgpOworICBSZWZyZXNoKCk7Cit9CisKK2Jvb2wgQ1BXTF9FZGl0SW1wbDo6SXNTZWxlY3RlZCgpIGNvbnN0IHsKKyAgcmV0dXJuICFtX1NlbFN0YXRlLklzRW1wdHkoKTsKK30KKworQ0ZYX1BvaW50RiBDUFdMX0VkaXRJbXBsOjpWVFRvRWRpdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3QgeworICBDRlhfRmxvYXRSZWN0IHJjQ29udGVudCA9IG1fcFZULT5HZXRDb250ZW50UmVjdCgpOworICBDRlhfRmxvYXRSZWN0IHJjUGxhdGUgPSBtX3BWVC0+R2V0UGxhdGVSZWN0KCk7CisKKyAgZmxvYXQgZlBhZGRpbmcgPSAwLjBmOworCisgIHN3aXRjaCAobV9uQWxpZ25tZW50KSB7CisgICAgY2FzZSAwOgorICAgICAgZlBhZGRpbmcgPSAwLjBmOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgZlBhZGRpbmcgPSAocmNQbGF0ZS5IZWlnaHQoKSAtIHJjQ29udGVudC5IZWlnaHQoKSkgKiAwLjVmOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgZlBhZGRpbmcgPSByY1BsYXRlLkhlaWdodCgpIC0gcmNDb250ZW50LkhlaWdodCgpOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gQ0ZYX1BvaW50Rihwb2ludC54IC0gKG1fcHRTY3JvbGxQb3MueCAtIHJjUGxhdGUubGVmdCksCisgICAgICAgICAgICAgICAgICAgIHBvaW50LnkgLSAobV9wdFNjcm9sbFBvcy55ICsgZlBhZGRpbmcgLSByY1BsYXRlLnRvcCkpOworfQorCitDRlhfUG9pbnRGIENQV0xfRWRpdEltcGw6OkVkaXRUb1ZUKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBjb25zdCB7CisgIENGWF9GbG9hdFJlY3QgcmNDb250ZW50ID0gbV9wVlQtPkdldENvbnRlbnRSZWN0KCk7CisgIENGWF9GbG9hdFJlY3QgcmNQbGF0ZSA9IG1fcFZULT5HZXRQbGF0ZVJlY3QoKTsKKworICBmbG9hdCBmUGFkZGluZyA9IDAuMGY7CisKKyAgc3dpdGNoIChtX25BbGlnbm1lbnQpIHsKKyAgICBjYXNlIDA6CisgICAgICBmUGFkZGluZyA9IDAuMGY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBmUGFkZGluZyA9IChyY1BsYXRlLkhlaWdodCgpIC0gcmNDb250ZW50LkhlaWdodCgpKSAqIDAuNWY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBmUGFkZGluZyA9IHJjUGxhdGUuSGVpZ2h0KCkgLSByY0NvbnRlbnQuSGVpZ2h0KCk7CisgICAgICBicmVhazsKKyAgfQorCisgIHJldHVybiBDRlhfUG9pbnRGKHBvaW50LnggKyAobV9wdFNjcm9sbFBvcy54IC0gcmNQbGF0ZS5sZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgcG9pbnQueSArIChtX3B0U2Nyb2xsUG9zLnkgKyBmUGFkZGluZyAtIHJjUGxhdGUudG9wKSk7Cit9CisKK0NGWF9GbG9hdFJlY3QgQ1BXTF9FZGl0SW1wbDo6VlRUb0VkaXQoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3QgeworICBDRlhfUG9pbnRGIHB0TGVmdEJvdHRvbSA9IFZUVG9FZGl0KENGWF9Qb2ludEYocmVjdC5sZWZ0LCByZWN0LmJvdHRvbSkpOworICBDRlhfUG9pbnRGIHB0UmlnaHRUb3AgPSBWVFRvRWRpdChDRlhfUG9pbnRGKHJlY3QucmlnaHQsIHJlY3QudG9wKSk7CisKKyAgcmV0dXJuIENGWF9GbG9hdFJlY3QocHRMZWZ0Qm90dG9tLngsIHB0TGVmdEJvdHRvbS55LCBwdFJpZ2h0VG9wLngsCisgICAgICAgICAgICAgICAgICAgICAgIHB0UmlnaHRUb3AueSk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbDo6U2V0U2Nyb2xsSW5mbygpIHsKKyAgaWYgKCFtX3BOb3RpZnkpCisgICAgcmV0dXJuOworCisgIENGWF9GbG9hdFJlY3QgcmNQbGF0ZSA9IG1fcFZULT5HZXRQbGF0ZVJlY3QoKTsKKyAgQ0ZYX0Zsb2F0UmVjdCByY0NvbnRlbnQgPSBtX3BWVC0+R2V0Q29udGVudFJlY3QoKTsKKyAgaWYgKG1fYk5vdGlmeUZsYWcpCisgICAgcmV0dXJuOworCisgIEF1dG9SZXN0b3Jlcjxib29sPiByZXN0b3JlcigmbV9iTm90aWZ5RmxhZyk7CisgIG1fYk5vdGlmeUZsYWcgPSB0cnVlOworCisgIFBXTF9TQ1JPTExfSU5GTyBJbmZvOworICBJbmZvLmZQbGF0ZVdpZHRoID0gcmNQbGF0ZS50b3AgLSByY1BsYXRlLmJvdHRvbTsKKyAgSW5mby5mQ29udGVudE1pbiA9IHJjQ29udGVudC5ib3R0b207CisgIEluZm8uZkNvbnRlbnRNYXggPSByY0NvbnRlbnQudG9wOworICBJbmZvLmZTbWFsbFN0ZXAgPSByY1BsYXRlLkhlaWdodCgpIC8gMzsKKyAgSW5mby5mQmlnU3RlcCA9IHJjUGxhdGUuSGVpZ2h0KCk7CisgIG1fcE5vdGlmeS0+U2V0U2Nyb2xsSW5mbyhJbmZvKTsKK30KKwordm9pZCBDUFdMX0VkaXRJbXBsOjpTZXRTY3JvbGxQb3NYKGZsb2F0IGZ4KSB7CisgIGlmICghbV9iRW5hYmxlU2Nyb2xsKQorICAgIHJldHVybjsKKworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIGlmICghSXNGbG9hdEVxdWFsKG1fcHRTY3JvbGxQb3MueCwgZngpKSB7CisgICAgICBtX3B0U2Nyb2xsUG9zLnggPSBmeDsKKyAgICAgIFJlZnJlc2goKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBDUFdMX0VkaXRJbXBsOjpTZXRTY3JvbGxQb3NZKGZsb2F0IGZ5KSB7CisgIGlmICghbV9iRW5hYmxlU2Nyb2xsKQorICAgIHJldHVybjsKKworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIGlmICghSXNGbG9hdEVxdWFsKG1fcHRTY3JvbGxQb3MueSwgZnkpKSB7CisgICAgICBtX3B0U2Nyb2xsUG9zLnkgPSBmeTsKKyAgICAgIFJlZnJlc2goKTsKKworICAgICAgaWYgKG1fcE5vdGlmeSkgeworICAgICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpIHsKKyAgICAgICAgICBBdXRvUmVzdG9yZXI8Ym9vbD4gcmVzdG9yZXIoJm1fYk5vdGlmeUZsYWcpOworICAgICAgICAgIG1fYk5vdGlmeUZsYWcgPSB0cnVlOworICAgICAgICAgIG1fcE5vdGlmeS0+U2V0U2Nyb2xsUG9zaXRpb24oZnkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbDo6U2V0U2Nyb2xsUG9zKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIFNldFNjcm9sbFBvc1gocG9pbnQueCk7CisgIFNldFNjcm9sbFBvc1kocG9pbnQueSk7CisgIFNldFNjcm9sbExpbWl0KCk7CisgIFNldENhcmV0SW5mbygpOworfQorCitDRlhfUG9pbnRGIENQV0xfRWRpdEltcGw6OkdldFNjcm9sbFBvcygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcHRTY3JvbGxQb3M7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbDo6U2V0U2Nyb2xsTGltaXQoKSB7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgQ0ZYX0Zsb2F0UmVjdCByY0NvbnRlbnQgPSBtX3BWVC0+R2V0Q29udGVudFJlY3QoKTsKKyAgICBDRlhfRmxvYXRSZWN0IHJjUGxhdGUgPSBtX3BWVC0+R2V0UGxhdGVSZWN0KCk7CisKKyAgICBpZiAocmNQbGF0ZS5XaWR0aCgpID4gcmNDb250ZW50LldpZHRoKCkpIHsKKyAgICAgIFNldFNjcm9sbFBvc1gocmNQbGF0ZS5sZWZ0KTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKElzRmxvYXRTbWFsbGVyKG1fcHRTY3JvbGxQb3MueCwgcmNDb250ZW50LmxlZnQpKSB7CisgICAgICAgIFNldFNjcm9sbFBvc1gocmNDb250ZW50LmxlZnQpOworICAgICAgfSBlbHNlIGlmIChJc0Zsb2F0QmlnZ2VyKG1fcHRTY3JvbGxQb3MueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NvbnRlbnQucmlnaHQgLSByY1BsYXRlLldpZHRoKCkpKSB7CisgICAgICAgIFNldFNjcm9sbFBvc1gocmNDb250ZW50LnJpZ2h0IC0gcmNQbGF0ZS5XaWR0aCgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmNQbGF0ZS5IZWlnaHQoKSA+IHJjQ29udGVudC5IZWlnaHQoKSkgeworICAgICAgU2V0U2Nyb2xsUG9zWShyY1BsYXRlLnRvcCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChJc0Zsb2F0U21hbGxlcihtX3B0U2Nyb2xsUG9zLnksCisgICAgICAgICAgICAgICAgICAgICAgICAgcmNDb250ZW50LmJvdHRvbSArIHJjUGxhdGUuSGVpZ2h0KCkpKSB7CisgICAgICAgIFNldFNjcm9sbFBvc1kocmNDb250ZW50LmJvdHRvbSArIHJjUGxhdGUuSGVpZ2h0KCkpOworICAgICAgfSBlbHNlIGlmIChJc0Zsb2F0QmlnZ2VyKG1fcHRTY3JvbGxQb3MueSwgcmNDb250ZW50LnRvcCkpIHsKKyAgICAgICAgU2V0U2Nyb2xsUG9zWShyY0NvbnRlbnQudG9wKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBDUFdMX0VkaXRJbXBsOjpTY3JvbGxUb0NhcmV0KCkgeworICBTZXRTY3JvbGxMaW1pdCgpOworCisgIGlmICghbV9wVlQtPklzVmFsaWQoKSkKKyAgICByZXR1cm47CisKKyAgQ1BERl9WYXJpYWJsZVRleHQ6Okl0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKTsKKyAgcEl0ZXJhdG9yLT5TZXRBdChtX3dwQ2FyZXQpOworCisgIENGWF9Qb2ludEYgcHRIZWFkOworICBDRlhfUG9pbnRGIHB0Rm9vdDsKKyAgQ1BWVF9Xb3JkIHdvcmQ7CisgIENQVlRfTGluZSBsaW5lOworICBpZiAocEl0ZXJhdG9yLT5HZXRXb3JkKHdvcmQpKSB7CisgICAgcHRIZWFkLnggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7CisgICAgcHRIZWFkLnkgPSB3b3JkLnB0V29yZC55ICsgd29yZC5mQXNjZW50OworICAgIHB0Rm9vdC54ID0gd29yZC5wdFdvcmQueCArIHdvcmQuZldpZHRoOworICAgIHB0Rm9vdC55ID0gd29yZC5wdFdvcmQueSArIHdvcmQuZkRlc2NlbnQ7CisgIH0gZWxzZSBpZiAocEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpKSB7CisgICAgcHRIZWFkLnggPSBsaW5lLnB0TGluZS54OworICAgIHB0SGVhZC55ID0gbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVBc2NlbnQ7CisgICAgcHRGb290LnggPSBsaW5lLnB0TGluZS54OworICAgIHB0Rm9vdC55ID0gbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVEZXNjZW50OworICB9CisKKyAgQ0ZYX1BvaW50RiBwdEhlYWRFZGl0ID0gVlRUb0VkaXQocHRIZWFkKTsKKyAgQ0ZYX1BvaW50RiBwdEZvb3RFZGl0ID0gVlRUb0VkaXQocHRGb290KTsKKyAgQ0ZYX0Zsb2F0UmVjdCByY1BsYXRlID0gbV9wVlQtPkdldFBsYXRlUmVjdCgpOworICBpZiAoIUlzRmxvYXRFcXVhbChyY1BsYXRlLmxlZnQsIHJjUGxhdGUucmlnaHQpKSB7CisgICAgaWYgKElzRmxvYXRTbWFsbGVyKHB0SGVhZEVkaXQueCwgcmNQbGF0ZS5sZWZ0KSB8fAorICAgICAgICBJc0Zsb2F0RXF1YWwocHRIZWFkRWRpdC54LCByY1BsYXRlLmxlZnQpKSB7CisgICAgICBTZXRTY3JvbGxQb3NYKHB0SGVhZC54KTsKKyAgICB9IGVsc2UgaWYgKElzRmxvYXRCaWdnZXIocHRIZWFkRWRpdC54LCByY1BsYXRlLnJpZ2h0KSkgeworICAgICAgU2V0U2Nyb2xsUG9zWChwdEhlYWQueCAtIHJjUGxhdGUuV2lkdGgoKSk7CisgICAgfQorICB9CisKKyAgaWYgKCFJc0Zsb2F0RXF1YWwocmNQbGF0ZS50b3AsIHJjUGxhdGUuYm90dG9tKSkgeworICAgIGlmIChJc0Zsb2F0U21hbGxlcihwdEZvb3RFZGl0LnksIHJjUGxhdGUuYm90dG9tKSB8fAorICAgICAgICBJc0Zsb2F0RXF1YWwocHRGb290RWRpdC55LCByY1BsYXRlLmJvdHRvbSkpIHsKKyAgICAgIGlmIChJc0Zsb2F0U21hbGxlcihwdEhlYWRFZGl0LnksIHJjUGxhdGUudG9wKSkgeworICAgICAgICBTZXRTY3JvbGxQb3NZKHB0Rm9vdC55ICsgcmNQbGF0ZS5IZWlnaHQoKSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChJc0Zsb2F0QmlnZ2VyKHB0SGVhZEVkaXQueSwgcmNQbGF0ZS50b3ApKSB7CisgICAgICBpZiAoSXNGbG9hdEJpZ2dlcihwdEZvb3RFZGl0LnksIHJjUGxhdGUuYm90dG9tKSkgeworICAgICAgICBTZXRTY3JvbGxQb3NZKHB0SGVhZC55KTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBDUFdMX0VkaXRJbXBsOjpSZWZyZXNoKCkgeworICBpZiAobV9iRW5hYmxlUmVmcmVzaCAmJiBtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgbV9SZWZyZXNoLkJlZ2luUmVmcmVzaCgpOworICAgIFJlZnJlc2hQdXNoTGluZVJlY3RzKEdldFZpc2libGVXb3JkUmFuZ2UoKSk7CisKKyAgICBtX1JlZnJlc2guTm9BbmFseXNlKCk7CisgICAgbV9wdFJlZnJlc2hTY3JvbGxQb3MgPSBtX3B0U2Nyb2xsUG9zOworCisgICAgaWYgKG1fcE5vdGlmeSkgeworICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKSB7CisgICAgICAgIEF1dG9SZXN0b3Jlcjxib29sPiByZXN0b3JlcigmbV9iTm90aWZ5RmxhZyk7CisgICAgICAgIG1fYk5vdGlmeUZsYWcgPSB0cnVlOworICAgICAgICBpZiAoc3RkOjp2ZWN0b3I8Q0ZYX0Zsb2F0UmVjdD4qIHBSZWN0cyA9IG1fUmVmcmVzaC5HZXRSZWZyZXNoUmVjdHMoKSkgeworICAgICAgICAgIGZvciAoYXV0byYgcmVjdCA6ICpwUmVjdHMpCisgICAgICAgICAgICBtX3BOb3RpZnktPkludmFsaWRhdGVSZWN0KCZyZWN0KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIG1fUmVmcmVzaC5FbmRSZWZyZXNoKCk7CisgIH0KK30KKwordm9pZCBDUFdMX0VkaXRJbXBsOjpSZWZyZXNoUHVzaExpbmVSZWN0cyhjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IpIHsKKyAgaWYgKCFtX3BWVC0+SXNWYWxpZCgpKQorICAgIHJldHVybjsKKworICBDUERGX1ZhcmlhYmxlVGV4dDo6SXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpOworICBDUFZUX1dvcmRQbGFjZSB3cEJlZ2luID0gd3IuQmVnaW5Qb3M7CisgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2Uod3BCZWdpbik7CisgIENQVlRfV29yZFBsYWNlIHdwRW5kID0gd3IuRW5kUG9zOworICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKHdwRW5kKTsKKyAgcEl0ZXJhdG9yLT5TZXRBdCh3cEJlZ2luKTsKKworICBDUFZUX0xpbmUgbGluZWluZm87CisgIGRvIHsKKyAgICBpZiAoIXBJdGVyYXRvci0+R2V0TGluZShsaW5laW5mbykpCisgICAgICBicmVhazsKKyAgICBpZiAobGluZWluZm8ubGluZXBsYWNlLkxpbmVDbXAod3BFbmQpID4gMCkKKyAgICAgIGJyZWFrOworCisgICAgQ0ZYX0Zsb2F0UmVjdCByY0xpbmUobGluZWluZm8ucHRMaW5lLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWluZm8ucHRMaW5lLnkgKyBsaW5laW5mby5mTGluZURlc2NlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWluZm8ucHRMaW5lLnggKyBsaW5laW5mby5mTGluZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVpbmZvLnB0TGluZS55ICsgbGluZWluZm8uZkxpbmVBc2NlbnQpOworCisgICAgbV9SZWZyZXNoLlB1c2goQ1BWVF9Xb3JkUmFuZ2UobGluZWluZm8ubGluZXBsYWNlLCBsaW5laW5mby5saW5lRW5kKSwKKyAgICAgICAgICAgICAgICAgICBWVFRvRWRpdChyY0xpbmUpKTsKKyAgfSB3aGlsZSAocEl0ZXJhdG9yLT5OZXh0TGluZSgpKTsKK30KKwordm9pZCBDUFdMX0VkaXRJbXBsOjpSZWZyZXNoV29yZFJhbmdlKGNvbnN0IENQVlRfV29yZFJhbmdlJiB3cikgeworICBDUERGX1ZhcmlhYmxlVGV4dDo6SXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpOworICBDUFZUX1dvcmRSYW5nZSB3clRlbXAgPSB3cjsKKworICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKHdyVGVtcC5CZWdpblBvcyk7CisgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2Uod3JUZW1wLkVuZFBvcyk7CisgIHBJdGVyYXRvci0+U2V0QXQod3JUZW1wLkJlZ2luUG9zKTsKKworICBDUFZUX1dvcmQgd29yZGluZm87CisgIENQVlRfTGluZSBsaW5laW5mbzsKKyAgQ1BWVF9Xb3JkUGxhY2UgcGxhY2U7CisKKyAgd2hpbGUgKHBJdGVyYXRvci0+TmV4dFdvcmQoKSkgeworICAgIHBsYWNlID0gcEl0ZXJhdG9yLT5HZXRXb3JkUGxhY2UoKTsKKyAgICBpZiAocGxhY2UgPiB3clRlbXAuRW5kUG9zKQorICAgICAgYnJlYWs7CisKKyAgICBwSXRlcmF0b3ItPkdldFdvcmQod29yZGluZm8pOworICAgIHBJdGVyYXRvci0+R2V0TGluZShsaW5laW5mbyk7CisgICAgaWYgKHBsYWNlLkxpbmVDbXAod3JUZW1wLkJlZ2luUG9zKSA9PSAwIHx8CisgICAgICAgIHBsYWNlLkxpbmVDbXAod3JUZW1wLkVuZFBvcykgPT0gMCkgeworICAgICAgQ0ZYX0Zsb2F0UmVjdCByY1dvcmQod29yZGluZm8ucHRXb3JkLngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5laW5mby5wdExpbmUueSArIGxpbmVpbmZvLmZMaW5lRGVzY2VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRpbmZvLnB0V29yZC54ICsgd29yZGluZm8uZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWluZm8ucHRMaW5lLnkgKyBsaW5laW5mby5mTGluZUFzY2VudCk7CisKKyAgICAgIGlmIChtX3BOb3RpZnkpIHsKKyAgICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKSB7CisgICAgICAgICAgQXV0b1Jlc3RvcmVyPGJvb2w+IHJlc3RvcmVyKCZtX2JOb3RpZnlGbGFnKTsKKyAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gdHJ1ZTsKKyAgICAgICAgICBDRlhfRmxvYXRSZWN0IHJjUmVmcmVzaCA9IFZUVG9FZGl0KHJjV29yZCk7CisgICAgICAgICAgbV9wTm90aWZ5LT5JbnZhbGlkYXRlUmVjdCgmcmNSZWZyZXNoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBDRlhfRmxvYXRSZWN0IHJjTGluZShsaW5laW5mby5wdExpbmUueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVpbmZvLnB0TGluZS55ICsgbGluZWluZm8uZkxpbmVEZXNjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWluZm8ucHRMaW5lLnggKyBsaW5laW5mby5mTGluZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWluZm8ucHRMaW5lLnkgKyBsaW5laW5mby5mTGluZUFzY2VudCk7CisKKyAgICAgIGlmIChtX3BOb3RpZnkpIHsKKyAgICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKSB7CisgICAgICAgICAgQXV0b1Jlc3RvcmVyPGJvb2w+IHJlc3RvcmVyKCZtX2JOb3RpZnlGbGFnKTsKKyAgICAgICAgICBtX2JOb3RpZnlGbGFnID0gdHJ1ZTsKKyAgICAgICAgICBDRlhfRmxvYXRSZWN0IHJjUmVmcmVzaCA9IFZUVG9FZGl0KHJjTGluZSk7CisgICAgICAgICAgbV9wTm90aWZ5LT5JbnZhbGlkYXRlUmVjdCgmcmNSZWZyZXNoKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBwSXRlcmF0b3ItPk5leHRMaW5lKCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbDo6U2V0Q2FyZXQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKSB7CisgIG1fd3BPbGRDYXJldCA9IG1fd3BDYXJldDsKKyAgbV93cENhcmV0ID0gcGxhY2U7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbDo6U2V0Q2FyZXRJbmZvKCkgeworICBpZiAobV9wTm90aWZ5KSB7CisgICAgaWYgKCFtX2JOb3RpZnlGbGFnKSB7CisgICAgICBDUERGX1ZhcmlhYmxlVGV4dDo6SXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpOworICAgICAgcEl0ZXJhdG9yLT5TZXRBdChtX3dwQ2FyZXQpOworCisgICAgICBDRlhfUG9pbnRGIHB0SGVhZDsKKyAgICAgIENGWF9Qb2ludEYgcHRGb290OworICAgICAgQ1BWVF9Xb3JkIHdvcmQ7CisgICAgICBDUFZUX0xpbmUgbGluZTsKKyAgICAgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKKyAgICAgICAgcHRIZWFkLnggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7CisgICAgICAgIHB0SGVhZC55ID0gd29yZC5wdFdvcmQueSArIHdvcmQuZkFzY2VudDsKKyAgICAgICAgcHRGb290LnggPSB3b3JkLnB0V29yZC54ICsgd29yZC5mV2lkdGg7CisgICAgICAgIHB0Rm9vdC55ID0gd29yZC5wdFdvcmQueSArIHdvcmQuZkRlc2NlbnQ7CisgICAgICB9IGVsc2UgaWYgKHBJdGVyYXRvci0+R2V0TGluZShsaW5lKSkgeworICAgICAgICBwdEhlYWQueCA9IGxpbmUucHRMaW5lLng7CisgICAgICAgIHB0SGVhZC55ID0gbGluZS5wdExpbmUueSArIGxpbmUuZkxpbmVBc2NlbnQ7CisgICAgICAgIHB0Rm9vdC54ID0gbGluZS5wdExpbmUueDsKKyAgICAgICAgcHRGb290LnkgPSBsaW5lLnB0TGluZS55ICsgbGluZS5mTGluZURlc2NlbnQ7CisgICAgICB9CisKKyAgICAgIEF1dG9SZXN0b3Jlcjxib29sPiByZXN0b3JlcigmbV9iTm90aWZ5RmxhZyk7CisgICAgICBtX2JOb3RpZnlGbGFnID0gdHJ1ZTsKKyAgICAgIG1fcE5vdGlmeS0+U2V0Q2FyZXQobV9TZWxTdGF0ZS5Jc0VtcHR5KCksIFZUVG9FZGl0KHB0SGVhZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZUVG9FZGl0KHB0Rm9vdCkpOworICAgIH0KKyAgfQorfQorCit2b2lkIENQV0xfRWRpdEltcGw6Ok9uTW91c2VEb3duKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ3RybCkgeworICBpZiAoIW1fcFZULT5Jc1ZhbGlkKCkpCisgICAgcmV0dXJuOworCisgIFNlbGVjdE5vbmUoKTsKKyAgU2V0Q2FyZXQobV9wVlQtPlNlYXJjaFdvcmRQbGFjZShFZGl0VG9WVChwb2ludCkpKTsKKyAgbV9TZWxTdGF0ZS5TZXQobV93cENhcmV0LCBtX3dwQ2FyZXQpOworICBTY3JvbGxUb0NhcmV0KCk7CisgIFNldENhcmV0T3JpZ2luKCk7CisgIFNldENhcmV0SW5mbygpOworfQorCit2b2lkIENQV0xfRWRpdEltcGw6Ok9uTW91c2VNb3ZlKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ3RybCkgeworICBpZiAoIW1fcFZULT5Jc1ZhbGlkKCkpCisgICAgcmV0dXJuOworCisgIFNldENhcmV0KG1fcFZULT5TZWFyY2hXb3JkUGxhY2UoRWRpdFRvVlQocG9pbnQpKSk7CisgIGlmIChtX3dwQ2FyZXQgPT0gbV93cE9sZENhcmV0KQorICAgIHJldHVybjsKKworICBtX1NlbFN0YXRlLlNldEVuZFBvcyhtX3dwQ2FyZXQpOworICBTY3JvbGxUb0NhcmV0KCk7CisgIFJlZnJlc2goKTsKKyAgU2V0Q2FyZXRPcmlnaW4oKTsKKyAgU2V0Q2FyZXRJbmZvKCk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbDo6T25WS19VUChib29sIGJTaGlmdCwgYm9vbCBiQ3RybCkgeworICBpZiAoIW1fcFZULT5Jc1ZhbGlkKCkpCisgICAgcmV0dXJuOworCisgIFNldENhcmV0KG1fcFZULT5HZXRVcFdvcmRQbGFjZShtX3dwQ2FyZXQsIG1fcHRDYXJldCkpOworICBpZiAoYlNoaWZ0KSB7CisgICAgaWYgKG1fU2VsU3RhdGUuSXNFbXB0eSgpKQorICAgICAgbV9TZWxTdGF0ZS5TZXQobV93cE9sZENhcmV0LCBtX3dwQ2FyZXQpOworICAgIGVsc2UKKyAgICAgIG1fU2VsU3RhdGUuU2V0RW5kUG9zKG1fd3BDYXJldCk7CisKKyAgICBpZiAobV93cE9sZENhcmV0ICE9IG1fd3BDYXJldCkgeworICAgICAgU2Nyb2xsVG9DYXJldCgpOworICAgICAgUmVmcmVzaCgpOworICAgICAgU2V0Q2FyZXRJbmZvKCk7CisgICAgfQorICB9IGVsc2UgeworICAgIFNlbGVjdE5vbmUoKTsKKyAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgU2V0Q2FyZXRJbmZvKCk7CisgIH0KK30KKwordm9pZCBDUFdMX0VkaXRJbXBsOjpPblZLX0RPV04oYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpIHsKKyAgaWYgKCFtX3BWVC0+SXNWYWxpZCgpKQorICAgIHJldHVybjsKKworICBTZXRDYXJldChtX3BWVC0+R2V0RG93bldvcmRQbGFjZShtX3dwQ2FyZXQsIG1fcHRDYXJldCkpOworICBpZiAoYlNoaWZ0KSB7CisgICAgaWYgKG1fU2VsU3RhdGUuSXNFbXB0eSgpKQorICAgICAgbV9TZWxTdGF0ZS5TZXQobV93cE9sZENhcmV0LCBtX3dwQ2FyZXQpOworICAgIGVsc2UKKyAgICAgIG1fU2VsU3RhdGUuU2V0RW5kUG9zKG1fd3BDYXJldCk7CisKKyAgICBpZiAobV93cE9sZENhcmV0ICE9IG1fd3BDYXJldCkgeworICAgICAgU2Nyb2xsVG9DYXJldCgpOworICAgICAgUmVmcmVzaCgpOworICAgICAgU2V0Q2FyZXRJbmZvKCk7CisgICAgfQorICB9IGVsc2UgeworICAgIFNlbGVjdE5vbmUoKTsKKyAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgU2V0Q2FyZXRJbmZvKCk7CisgIH0KK30KKwordm9pZCBDUFdMX0VkaXRJbXBsOjpPblZLX0xFRlQoYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpIHsKKyAgaWYgKCFtX3BWVC0+SXNWYWxpZCgpKQorICAgIHJldHVybjsKKworICBpZiAoYlNoaWZ0KSB7CisgICAgaWYgKG1fd3BDYXJldCA9PSBtX3BWVC0+R2V0TGluZUJlZ2luUGxhY2UobV93cENhcmV0KSAmJgorICAgICAgICBtX3dwQ2FyZXQgIT0gbV9wVlQtPkdldFNlY3Rpb25CZWdpblBsYWNlKG1fd3BDYXJldCkpIHsKKyAgICAgIFNldENhcmV0KG1fcFZULT5HZXRQcmV2V29yZFBsYWNlKG1fd3BDYXJldCkpOworICAgIH0KKyAgICBTZXRDYXJldChtX3BWVC0+R2V0UHJldldvcmRQbGFjZShtX3dwQ2FyZXQpKTsKKyAgICBpZiAobV9TZWxTdGF0ZS5Jc0VtcHR5KCkpCisgICAgICBtX1NlbFN0YXRlLlNldChtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCk7CisgICAgZWxzZQorICAgICAgbV9TZWxTdGF0ZS5TZXRFbmRQb3MobV93cENhcmV0KTsKKworICAgIGlmIChtX3dwT2xkQ2FyZXQgIT0gbV93cENhcmV0KSB7CisgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICBSZWZyZXNoKCk7CisgICAgICBTZXRDYXJldEluZm8oKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCFtX1NlbFN0YXRlLklzRW1wdHkoKSkgeworICAgICAgaWYgKG1fU2VsU3RhdGUuQmVnaW5Qb3MgPCBtX1NlbFN0YXRlLkVuZFBvcykKKyAgICAgICAgU2V0Q2FyZXQobV9TZWxTdGF0ZS5CZWdpblBvcyk7CisgICAgICBlbHNlCisgICAgICAgIFNldENhcmV0KG1fU2VsU3RhdGUuRW5kUG9zKTsKKworICAgICAgU2VsZWN0Tm9uZSgpOworICAgICAgU2Nyb2xsVG9DYXJldCgpOworICAgICAgU2V0Q2FyZXRJbmZvKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChtX3dwQ2FyZXQgPT0gbV9wVlQtPkdldExpbmVCZWdpblBsYWNlKG1fd3BDYXJldCkgJiYKKyAgICAgICAgICBtX3dwQ2FyZXQgIT0gbV9wVlQtPkdldFNlY3Rpb25CZWdpblBsYWNlKG1fd3BDYXJldCkpIHsKKyAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldFByZXZXb3JkUGxhY2UobV93cENhcmV0KSk7CisgICAgICB9CisgICAgICBTZXRDYXJldChtX3BWVC0+R2V0UHJldldvcmRQbGFjZShtX3dwQ2FyZXQpKTsKKyAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgICAgIFNldENhcmV0T3JpZ2luKCk7CisgICAgICBTZXRDYXJldEluZm8oKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBDUFdMX0VkaXRJbXBsOjpPblZLX1JJR0hUKGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKSB7CisgIGlmICghbV9wVlQtPklzVmFsaWQoKSkKKyAgICByZXR1cm47CisKKyAgaWYgKGJTaGlmdCkgeworICAgIFNldENhcmV0KG1fcFZULT5HZXROZXh0V29yZFBsYWNlKG1fd3BDYXJldCkpOworICAgIGlmIChtX3dwQ2FyZXQgPT0gbV9wVlQtPkdldExpbmVFbmRQbGFjZShtX3dwQ2FyZXQpICYmCisgICAgICAgIG1fd3BDYXJldCAhPSBtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKG1fd3BDYXJldCkpCisgICAgICBTZXRDYXJldChtX3BWVC0+R2V0TmV4dFdvcmRQbGFjZShtX3dwQ2FyZXQpKTsKKworICAgIGlmIChtX1NlbFN0YXRlLklzRW1wdHkoKSkKKyAgICAgIG1fU2VsU3RhdGUuU2V0KG1fd3BPbGRDYXJldCwgbV93cENhcmV0KTsKKyAgICBlbHNlCisgICAgICBtX1NlbFN0YXRlLlNldEVuZFBvcyhtX3dwQ2FyZXQpOworCisgICAgaWYgKG1fd3BPbGRDYXJldCAhPSBtX3dwQ2FyZXQpIHsKKyAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgICAgIFJlZnJlc2goKTsKKyAgICAgIFNldENhcmV0SW5mbygpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIW1fU2VsU3RhdGUuSXNFbXB0eSgpKSB7CisgICAgICBpZiAobV9TZWxTdGF0ZS5CZWdpblBvcyA+IG1fU2VsU3RhdGUuRW5kUG9zKQorICAgICAgICBTZXRDYXJldChtX1NlbFN0YXRlLkJlZ2luUG9zKTsKKyAgICAgIGVsc2UKKyAgICAgICAgU2V0Q2FyZXQobV9TZWxTdGF0ZS5FbmRQb3MpOworCisgICAgICBTZWxlY3ROb25lKCk7CisgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICBTZXRDYXJldEluZm8oKTsKKyAgICB9IGVsc2UgeworICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldE5leHRXb3JkUGxhY2UobV93cENhcmV0KSk7CisgICAgICBpZiAobV93cENhcmV0ID09IG1fcFZULT5HZXRMaW5lRW5kUGxhY2UobV93cENhcmV0KSAmJgorICAgICAgICAgIG1fd3BDYXJldCAhPSBtX3BWVC0+R2V0U2VjdGlvbkVuZFBsYWNlKG1fd3BDYXJldCkpIHsKKyAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldE5leHRXb3JkUGxhY2UobV93cENhcmV0KSk7CisgICAgICB9CisgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICBTZXRDYXJldE9yaWdpbigpOworICAgICAgU2V0Q2FyZXRJbmZvKCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbDo6T25WS19IT01FKGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKSB7CisgIGlmICghbV9wVlQtPklzVmFsaWQoKSkKKyAgICByZXR1cm47CisKKyAgaWYgKGJTaGlmdCkgeworICAgIGlmIChiQ3RybCkKKyAgICAgIFNldENhcmV0KG1fcFZULT5HZXRCZWdpbldvcmRQbGFjZSgpKTsKKyAgICBlbHNlCisgICAgICBTZXRDYXJldChtX3BWVC0+R2V0TGluZUJlZ2luUGxhY2UobV93cENhcmV0KSk7CisKKyAgICBpZiAobV9TZWxTdGF0ZS5Jc0VtcHR5KCkpCisgICAgICBtX1NlbFN0YXRlLlNldChtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCk7CisgICAgZWxzZQorICAgICAgbV9TZWxTdGF0ZS5TZXRFbmRQb3MobV93cENhcmV0KTsKKworICAgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgICBSZWZyZXNoKCk7CisgICAgU2V0Q2FyZXRJbmZvKCk7CisgIH0gZWxzZSB7CisgICAgaWYgKCFtX1NlbFN0YXRlLklzRW1wdHkoKSkgeworICAgICAgU2V0Q2FyZXQoc3RkOjptaW4obV9TZWxTdGF0ZS5CZWdpblBvcywgbV9TZWxTdGF0ZS5FbmRQb3MpKTsKKyAgICAgIFNlbGVjdE5vbmUoKTsKKyAgICAgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgICAgIFNldENhcmV0SW5mbygpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoYkN0cmwpCisgICAgICAgIFNldENhcmV0KG1fcFZULT5HZXRCZWdpbldvcmRQbGFjZSgpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldExpbmVCZWdpblBsYWNlKG1fd3BDYXJldCkpOworCisgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICBTZXRDYXJldE9yaWdpbigpOworICAgICAgU2V0Q2FyZXRJbmZvKCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbDo6T25WS19FTkQoYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpIHsKKyAgaWYgKCFtX3BWVC0+SXNWYWxpZCgpKQorICAgIHJldHVybjsKKworICBpZiAoYlNoaWZ0KSB7CisgICAgaWYgKGJDdHJsKQorICAgICAgU2V0Q2FyZXQobV9wVlQtPkdldEVuZFdvcmRQbGFjZSgpKTsKKyAgICBlbHNlCisgICAgICBTZXRDYXJldChtX3BWVC0+R2V0TGluZUVuZFBsYWNlKG1fd3BDYXJldCkpOworCisgICAgaWYgKG1fU2VsU3RhdGUuSXNFbXB0eSgpKQorICAgICAgbV9TZWxTdGF0ZS5TZXQobV93cE9sZENhcmV0LCBtX3dwQ2FyZXQpOworICAgIGVsc2UKKyAgICAgIG1fU2VsU3RhdGUuU2V0RW5kUG9zKG1fd3BDYXJldCk7CisKKyAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgUmVmcmVzaCgpOworICAgIFNldENhcmV0SW5mbygpOworICB9IGVsc2UgeworICAgIGlmICghbV9TZWxTdGF0ZS5Jc0VtcHR5KCkpIHsKKyAgICAgIFNldENhcmV0KHN0ZDo6bWF4KG1fU2VsU3RhdGUuQmVnaW5Qb3MsIG1fU2VsU3RhdGUuRW5kUG9zKSk7CisgICAgICBTZWxlY3ROb25lKCk7CisgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICBTZXRDYXJldEluZm8oKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGJDdHJsKQorICAgICAgICBTZXRDYXJldChtX3BWVC0+R2V0RW5kV29yZFBsYWNlKCkpOworICAgICAgZWxzZQorICAgICAgICBTZXRDYXJldChtX3BWVC0+R2V0TGluZUVuZFBsYWNlKG1fd3BDYXJldCkpOworCisgICAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgICBTZXRDYXJldE9yaWdpbigpOworICAgICAgU2V0Q2FyZXRJbmZvKCk7CisgICAgfQorICB9Cit9CisKK2Jvb2wgQ1BXTF9FZGl0SW1wbDo6SW5zZXJ0V29yZCh1aW50MTZfdCB3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJBZGRVbmRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlBhaW50KSB7CisgIGlmIChJc1RleHRPdmVyZmxvdygpIHx8ICFtX3BWVC0+SXNWYWxpZCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBtX3BWVC0+VXBkYXRlV29yZFBsYWNlKG1fd3BDYXJldCk7CisgIFNldENhcmV0KAorICAgICAgbV9wVlQtPkluc2VydFdvcmQobV93cENhcmV0LCB3b3JkLCBHZXRDaGFyU2V0RnJvbVVuaWNvZGUod29yZCwgY2hhcnNldCkpKTsKKyAgbV9TZWxTdGF0ZS5TZXQobV93cENhcmV0LCBtX3dwQ2FyZXQpOworICBpZiAobV93cENhcmV0ID09IG1fd3BPbGRDYXJldCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGJBZGRVbmRvICYmIG1fYkVuYWJsZVVuZG8pIHsKKyAgICBBZGRFZGl0VW5kb0l0ZW0ocGRmaXVtOjpNYWtlVW5pcXVlPENGWEVVX0luc2VydFdvcmQ+KAorICAgICAgICB0aGlzLCBtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCwgd29yZCwgY2hhcnNldCkpOworICB9CisgIGlmIChiUGFpbnQpCisgICAgUGFpbnRJbnNlcnRUZXh0KG1fd3BPbGRDYXJldCwgbV93cENhcmV0KTsKKworICBpZiAobV9wT3BlcmF0aW9uTm90aWZ5KQorICAgIG1fcE9wZXJhdGlvbk5vdGlmeS0+T25JbnNlcnRXb3JkKG1fd3BDYXJldCwgbV93cE9sZENhcmV0KTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDUFdMX0VkaXRJbXBsOjpJbnNlcnRSZXR1cm4oYm9vbCBiQWRkVW5kbywgYm9vbCBiUGFpbnQpIHsKKyAgaWYgKElzVGV4dE92ZXJmbG93KCkgfHwgIW1fcFZULT5Jc1ZhbGlkKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG1fcFZULT5VcGRhdGVXb3JkUGxhY2UobV93cENhcmV0KTsKKyAgU2V0Q2FyZXQobV9wVlQtPkluc2VydFNlY3Rpb24obV93cENhcmV0KSk7CisgIG1fU2VsU3RhdGUuU2V0KG1fd3BDYXJldCwgbV93cENhcmV0KTsKKyAgaWYgKG1fd3BDYXJldCA9PSBtX3dwT2xkQ2FyZXQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChiQWRkVW5kbyAmJiBtX2JFbmFibGVVbmRvKSB7CisgICAgQWRkRWRpdFVuZG9JdGVtKAorICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYRVVfSW5zZXJ0UmV0dXJuPih0aGlzLCBtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCkpOworICB9CisgIGlmIChiUGFpbnQpIHsKKyAgICBSZWFycmFuZ2VQYXJ0KENQVlRfV29yZFJhbmdlKG1fd3BPbGRDYXJldCwgbV93cENhcmV0KSk7CisgICAgU2Nyb2xsVG9DYXJldCgpOworICAgIFJlZnJlc2goKTsKKyAgICBTZXRDYXJldE9yaWdpbigpOworICAgIFNldENhcmV0SW5mbygpOworICB9CisgIGlmIChtX3BPcGVyYXRpb25Ob3RpZnkpCisgICAgbV9wT3BlcmF0aW9uTm90aWZ5LT5Pbkluc2VydFJldHVybihtX3dwQ2FyZXQsIG1fd3BPbGRDYXJldCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1BXTF9FZGl0SW1wbDo6QmFja3NwYWNlKGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KSB7CisgIGlmICghbV9wVlQtPklzVmFsaWQoKSB8fCBtX3dwQ2FyZXQgPT0gbV9wVlQtPkdldEJlZ2luV29yZFBsYWNlKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENQVlRfV29yZCB3b3JkOworICBpZiAoYkFkZFVuZG8pIHsKKyAgICBDUERGX1ZhcmlhYmxlVGV4dDo6SXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcFZULT5HZXRJdGVyYXRvcigpOworICAgIHBJdGVyYXRvci0+U2V0QXQobV93cENhcmV0KTsKKyAgICBwSXRlcmF0b3ItPkdldFdvcmQod29yZCk7CisgIH0KKyAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOworICBTZXRDYXJldChtX3BWVC0+QmFja1NwYWNlV29yZChtX3dwQ2FyZXQpKTsKKyAgbV9TZWxTdGF0ZS5TZXQobV93cENhcmV0LCBtX3dwQ2FyZXQpOworICBpZiAobV93cENhcmV0ID09IG1fd3BPbGRDYXJldCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGJBZGRVbmRvICYmIG1fYkVuYWJsZVVuZG8pIHsKKyAgICBpZiAobV93cENhcmV0Lm5TZWNJbmRleCAhPSBtX3dwT2xkQ2FyZXQublNlY0luZGV4KSB7CisgICAgICBBZGRFZGl0VW5kb0l0ZW0ocGRmaXVtOjpNYWtlVW5pcXVlPENGWEVVX0JhY2tzcGFjZT4oCisgICAgICAgICAgdGhpcywgbV93cE9sZENhcmV0LCBtX3dwQ2FyZXQsIHdvcmQuV29yZCwgd29yZC5uQ2hhcnNldCkpOworICAgIH0gZWxzZSB7CisgICAgICBBZGRFZGl0VW5kb0l0ZW0ocGRmaXVtOjpNYWtlVW5pcXVlPENGWEVVX0JhY2tzcGFjZT4oCisgICAgICAgICAgdGhpcywgbV93cE9sZENhcmV0LCBtX3dwQ2FyZXQsIHdvcmQuV29yZCwgd29yZC5uQ2hhcnNldCkpOworICAgIH0KKyAgfQorICBpZiAoYlBhaW50KSB7CisgICAgUmVhcnJhbmdlUGFydChDUFZUX1dvcmRSYW5nZShtX3dwQ2FyZXQsIG1fd3BPbGRDYXJldCkpOworICAgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgICBSZWZyZXNoKCk7CisgICAgU2V0Q2FyZXRPcmlnaW4oKTsKKyAgICBTZXRDYXJldEluZm8oKTsKKyAgfQorICBpZiAobV9wT3BlcmF0aW9uTm90aWZ5KQorICAgIG1fcE9wZXJhdGlvbk5vdGlmeS0+T25CYWNrU3BhY2UobV93cENhcmV0LCBtX3dwT2xkQ2FyZXQpOworCisgIHJldHVybiB0cnVlOworfQorCitib29sIENQV0xfRWRpdEltcGw6OkRlbGV0ZShib29sIGJBZGRVbmRvLCBib29sIGJQYWludCkgeworICBpZiAoIW1fcFZULT5Jc1ZhbGlkKCkgfHwgbV93cENhcmV0ID09IG1fcFZULT5HZXRFbmRXb3JkUGxhY2UoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQ1BWVF9Xb3JkIHdvcmQ7CisgIGlmIChiQWRkVW5kbykgeworICAgIENQREZfVmFyaWFibGVUZXh0OjpJdGVyYXRvciogcEl0ZXJhdG9yID0gbV9wVlQtPkdldEl0ZXJhdG9yKCk7CisgICAgcEl0ZXJhdG9yLT5TZXRBdChtX3BWVC0+R2V0TmV4dFdvcmRQbGFjZShtX3dwQ2FyZXQpKTsKKyAgICBwSXRlcmF0b3ItPkdldFdvcmQod29yZCk7CisgIH0KKyAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOworICBib29sIGJTZWNFbmQgPSAobV93cENhcmV0ID09IG1fcFZULT5HZXRTZWN0aW9uRW5kUGxhY2UobV93cENhcmV0KSk7CisgIFNldENhcmV0KG1fcFZULT5EZWxldGVXb3JkKG1fd3BDYXJldCkpOworICBtX1NlbFN0YXRlLlNldChtX3dwQ2FyZXQsIG1fd3BDYXJldCk7CisgIGlmIChiQWRkVW5kbyAmJiBtX2JFbmFibGVVbmRvKSB7CisgICAgaWYgKGJTZWNFbmQpIHsKKyAgICAgIEFkZEVkaXRVbmRvSXRlbShwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYRVVfRGVsZXRlPigKKyAgICAgICAgICB0aGlzLCBtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCwgd29yZC5Xb3JkLCB3b3JkLm5DaGFyc2V0LCBiU2VjRW5kKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFkZEVkaXRVbmRvSXRlbShwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYRVVfRGVsZXRlPigKKyAgICAgICAgICB0aGlzLCBtX3dwT2xkQ2FyZXQsIG1fd3BDYXJldCwgd29yZC5Xb3JkLCB3b3JkLm5DaGFyc2V0LCBiU2VjRW5kKSk7CisgICAgfQorICB9CisgIGlmIChiUGFpbnQpIHsKKyAgICBSZWFycmFuZ2VQYXJ0KENQVlRfV29yZFJhbmdlKG1fd3BPbGRDYXJldCwgbV93cENhcmV0KSk7CisgICAgU2Nyb2xsVG9DYXJldCgpOworICAgIFJlZnJlc2goKTsKKyAgICBTZXRDYXJldE9yaWdpbigpOworICAgIFNldENhcmV0SW5mbygpOworICB9CisgIGlmIChtX3BPcGVyYXRpb25Ob3RpZnkpCisgICAgbV9wT3BlcmF0aW9uTm90aWZ5LT5PbkRlbGV0ZShtX3dwQ2FyZXQsIG1fd3BPbGRDYXJldCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1BXTF9FZGl0SW1wbDo6RW1wdHkoKSB7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgbV9wVlQtPkRlbGV0ZVdvcmRzKEdldFdob2xlV29yZFJhbmdlKCkpOworICAgIFNldENhcmV0KG1fcFZULT5HZXRCZWdpbldvcmRQbGFjZSgpKTsKKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENQV0xfRWRpdEltcGw6OkNsZWFyKGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KSB7CisgIGlmICghbV9wVlQtPklzVmFsaWQoKSB8fCBtX1NlbFN0YXRlLklzRW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQ1BWVF9Xb3JkUmFuZ2UgcmFuZ2UgPSBtX1NlbFN0YXRlLkNvbnZlcnRUb1dvcmRSYW5nZSgpOworICBpZiAoYkFkZFVuZG8gJiYgbV9iRW5hYmxlVW5kbykgeworICAgIEFkZEVkaXRVbmRvSXRlbSgKKyAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENGWEVVX0NsZWFyPih0aGlzLCByYW5nZSwgR2V0U2VsZWN0ZWRUZXh0KCkpKTsKKyAgfQorCisgIFNlbGVjdE5vbmUoKTsKKyAgU2V0Q2FyZXQobV9wVlQtPkRlbGV0ZVdvcmRzKHJhbmdlKSk7CisgIG1fU2VsU3RhdGUuU2V0KG1fd3BDYXJldCwgbV93cENhcmV0KTsKKyAgaWYgKGJQYWludCkgeworICAgIFJlYXJyYW5nZVBhcnQocmFuZ2UpOworICAgIFNjcm9sbFRvQ2FyZXQoKTsKKyAgICBSZWZyZXNoKCk7CisgICAgU2V0Q2FyZXRPcmlnaW4oKTsKKyAgICBTZXRDYXJldEluZm8oKTsKKyAgfQorICBpZiAobV9wT3BlcmF0aW9uTm90aWZ5KQorICAgIG1fcE9wZXJhdGlvbk5vdGlmeS0+T25DbGVhcihtX3dwQ2FyZXQsIG1fd3BPbGRDYXJldCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1BXTF9FZGl0SW1wbDo6SW5zZXJ0VGV4dChjb25zdCBXaWRlU3RyaW5nJiBzVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWRkVW5kbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJQYWludCkgeworICBpZiAoSXNUZXh0T3ZlcmZsb3coKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbV9wVlQtPlVwZGF0ZVdvcmRQbGFjZShtX3dwQ2FyZXQpOworICBTZXRDYXJldChEb0luc2VydFRleHQobV93cENhcmV0LCBzVGV4dCwgY2hhcnNldCkpOworICBtX1NlbFN0YXRlLlNldChtX3dwQ2FyZXQsIG1fd3BDYXJldCk7CisgIGlmIChtX3dwQ2FyZXQgPT0gbV93cE9sZENhcmV0KQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoYkFkZFVuZG8gJiYgbV9iRW5hYmxlVW5kbykgeworICAgIEFkZEVkaXRVbmRvSXRlbShwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYRVVfSW5zZXJ0VGV4dD4oCisgICAgICAgIHRoaXMsIG1fd3BPbGRDYXJldCwgbV93cENhcmV0LCBzVGV4dCwgY2hhcnNldCkpOworICB9CisgIGlmIChiUGFpbnQpCisgICAgUGFpbnRJbnNlcnRUZXh0KG1fd3BPbGRDYXJldCwgbV93cENhcmV0KTsKKworICBpZiAobV9wT3BlcmF0aW9uTm90aWZ5KQorICAgIG1fcE9wZXJhdGlvbk5vdGlmeS0+T25JbnNlcnRUZXh0KG1fd3BDYXJldCwgbV93cE9sZENhcmV0KTsKKworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDUFdMX0VkaXRJbXBsOjpQYWludEluc2VydFRleHQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwTmV3KSB7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKSB7CisgICAgUmVhcnJhbmdlUGFydChDUFZUX1dvcmRSYW5nZSh3cE9sZCwgd3BOZXcpKTsKKyAgICBTY3JvbGxUb0NhcmV0KCk7CisgICAgUmVmcmVzaCgpOworICAgIFNldENhcmV0T3JpZ2luKCk7CisgICAgU2V0Q2FyZXRJbmZvKCk7CisgIH0KK30KKworYm9vbCBDUFdMX0VkaXRJbXBsOjpSZWRvKCkgeworICBpZiAobV9iRW5hYmxlVW5kbykgeworICAgIGlmIChtX1VuZG8uQ2FuUmVkbygpKSB7CisgICAgICBtX1VuZG8uUmVkbygpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENQV0xfRWRpdEltcGw6OlVuZG8oKSB7CisgIGlmIChtX2JFbmFibGVVbmRvKSB7CisgICAgaWYgKG1fVW5kby5DYW5VbmRvKCkpIHsKKyAgICAgIG1fVW5kby5VbmRvKCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbDo6U2V0Q2FyZXRPcmlnaW4oKSB7CisgIGlmICghbV9wVlQtPklzVmFsaWQoKSkKKyAgICByZXR1cm47CisKKyAgQ1BERl9WYXJpYWJsZVRleHQ6Okl0ZXJhdG9yKiBwSXRlcmF0b3IgPSBtX3BWVC0+R2V0SXRlcmF0b3IoKTsKKyAgcEl0ZXJhdG9yLT5TZXRBdChtX3dwQ2FyZXQpOworICBDUFZUX1dvcmQgd29yZDsKKyAgQ1BWVF9MaW5lIGxpbmU7CisgIGlmIChwSXRlcmF0b3ItPkdldFdvcmQod29yZCkpIHsKKyAgICBtX3B0Q2FyZXQueCA9IHdvcmQucHRXb3JkLnggKyB3b3JkLmZXaWR0aDsKKyAgICBtX3B0Q2FyZXQueSA9IHdvcmQucHRXb3JkLnk7CisgIH0gZWxzZSBpZiAocEl0ZXJhdG9yLT5HZXRMaW5lKGxpbmUpKSB7CisgICAgbV9wdENhcmV0LnggPSBsaW5lLnB0TGluZS54OworICAgIG1fcHRDYXJldC55ID0gbGluZS5wdExpbmUueTsKKyAgfQorfQorCitDUFZUX1dvcmRQbGFjZSBDUFdMX0VkaXRJbXBsOjpXb3JkSW5kZXhUb1dvcmRQbGFjZShpbnQzMl90IGluZGV4KSBjb25zdCB7CisgIGlmIChtX3BWVC0+SXNWYWxpZCgpKQorICAgIHJldHVybiBtX3BWVC0+V29yZEluZGV4VG9Xb3JkUGxhY2UoaW5kZXgpOworCisgIHJldHVybiBDUFZUX1dvcmRQbGFjZSgpOworfQorCitib29sIENQV0xfRWRpdEltcGw6OklzVGV4dEZ1bGwoKSBjb25zdCB7CisgIGludDMyX3QgblRvdGFsV29yZHMgPSBtX3BWVC0+R2V0VG90YWxXb3JkcygpOworICBpbnQzMl90IG5MaW1pdENoYXIgPSBtX3BWVC0+R2V0TGltaXRDaGFyKCk7CisgIGludDMyX3QgbkNoYXJBcnJheSA9IG1fcFZULT5HZXRDaGFyQXJyYXkoKTsKKworICByZXR1cm4gSXNUZXh0T3ZlcmZsb3coKSB8fCAobkxpbWl0Q2hhciA+IDAgJiYgblRvdGFsV29yZHMgPj0gbkxpbWl0Q2hhcikgfHwKKyAgICAgICAgIChuQ2hhckFycmF5ID4gMCAmJiBuVG90YWxXb3JkcyA+PSBuQ2hhckFycmF5KTsKK30KKworYm9vbCBDUFdMX0VkaXRJbXBsOjpJc1RleHRPdmVyZmxvdygpIGNvbnN0IHsKKyAgaWYgKCFtX2JFbmFibGVTY3JvbGwgJiYgIW1fYkVuYWJsZU92ZXJmbG93KSB7CisgICAgQ0ZYX0Zsb2F0UmVjdCByY1BsYXRlID0gbV9wVlQtPkdldFBsYXRlUmVjdCgpOworICAgIENGWF9GbG9hdFJlY3QgcmNDb250ZW50ID0gbV9wVlQtPkdldENvbnRlbnRSZWN0KCk7CisKKyAgICBpZiAobV9wVlQtPklzTXVsdGlMaW5lKCkgJiYgR2V0VG90YWxMaW5lcygpID4gMSAmJgorICAgICAgICBJc0Zsb2F0QmlnZ2VyKHJjQ29udGVudC5IZWlnaHQoKSwgcmNQbGF0ZS5IZWlnaHQoKSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChJc0Zsb2F0QmlnZ2VyKHJjQ29udGVudC5XaWR0aCgpLCByY1BsYXRlLldpZHRoKCkpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1BXTF9FZGl0SW1wbDo6Q2FuVW5kbygpIGNvbnN0IHsKKyAgaWYgKG1fYkVuYWJsZVVuZG8pIHsKKyAgICByZXR1cm4gbV9VbmRvLkNhblVuZG8oKTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDUFdMX0VkaXRJbXBsOjpDYW5SZWRvKCkgY29uc3QgeworICBpZiAobV9iRW5hYmxlVW5kbykgeworICAgIHJldHVybiBtX1VuZG8uQ2FuUmVkbygpOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIENQV0xfRWRpdEltcGw6OkVuYWJsZVJlZnJlc2goYm9vbCBiUmVmcmVzaCkgeworICBtX2JFbmFibGVSZWZyZXNoID0gYlJlZnJlc2g7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbDo6RW5hYmxlVW5kbyhib29sIGJVbmRvKSB7CisgIG1fYkVuYWJsZVVuZG8gPSBiVW5kbzsKK30KKworQ1BWVF9Xb3JkUGxhY2UgQ1BXTF9FZGl0SW1wbDo6RG9JbnNlcnRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQpIHsKKyAgQ1BWVF9Xb3JkUGxhY2Ugd3AgPSBwbGFjZTsKKworICBpZiAobV9wVlQtPklzVmFsaWQoKSkgeworICAgIGZvciAoaW50MzJfdCBpID0gMCwgc3ogPSBzVGV4dC5HZXRMZW5ndGgoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgIHVpbnQxNl90IHdvcmQgPSBzVGV4dFtpXTsKKyAgICAgIHN3aXRjaCAod29yZCkgeworICAgICAgICBjYXNlIDB4MEQ6CisgICAgICAgICAgd3AgPSBtX3BWVC0+SW5zZXJ0U2VjdGlvbih3cCk7CisgICAgICAgICAgaWYgKGkgKyAxIDwgc3ogJiYgc1RleHRbaSArIDFdID09IDB4MEEpCisgICAgICAgICAgICBpKys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMHgwQToKKyAgICAgICAgICB3cCA9IG1fcFZULT5JbnNlcnRTZWN0aW9uKHdwKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAweDA5OgorICAgICAgICAgIHdvcmQgPSAweDIwOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHdwID0KKyAgICAgICAgICAgICAgbV9wVlQtPkluc2VydFdvcmQod3AsIHdvcmQsIEdldENoYXJTZXRGcm9tVW5pY29kZSh3b3JkLCBjaGFyc2V0KSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHdwOworfQorCitpbnQzMl90IENQV0xfRWRpdEltcGw6OkdldENoYXJTZXRGcm9tVW5pY29kZSh1aW50MTZfdCB3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuT2xkQ2hhcnNldCkgeworICBpZiAoSVBWVF9Gb250TWFwKiBwRm9udE1hcCA9IEdldEZvbnRNYXAoKSkKKyAgICByZXR1cm4gcEZvbnRNYXAtPkNoYXJTZXRGcm9tVW5pY29kZSh3b3JkLCBuT2xkQ2hhcnNldCk7CisgIHJldHVybiBuT2xkQ2hhcnNldDsKK30KKwordm9pZCBDUFdMX0VkaXRJbXBsOjpBZGRFZGl0VW5kb0l0ZW0oCisgICAgc3RkOjp1bmlxdWVfcHRyPElGWF9FZGl0X1VuZG9JdGVtPiBwRWRpdFVuZG9JdGVtKSB7CisgIG1fVW5kby5BZGRJdGVtKHN0ZDo6bW92ZShwRWRpdFVuZG9JdGVtKSk7Cit9CisKK0J5dGVTdHJpbmcgQ1BXTF9FZGl0SW1wbDo6R2V0UERGV29yZFN0cmluZyhpbnQzMl90IG5Gb250SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgV29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBTdWJXb3JkKSB7CisgIElQVlRfRm9udE1hcCogcEZvbnRNYXAgPSBHZXRGb250TWFwKCk7CisgIENQREZfRm9udCogcFBERkZvbnQgPSBwRm9udE1hcC0+R2V0UERGRm9udChuRm9udEluZGV4KTsKKyAgaWYgKCFwUERGRm9udCkKKyAgICByZXR1cm4gQnl0ZVN0cmluZygpOworCisgIEJ5dGVTdHJpbmcgc1dvcmQ7CisgIGlmIChTdWJXb3JkID4gMCkgeworICAgIFdvcmQgPSBTdWJXb3JkOworICB9IGVsc2UgeworICAgIHVpbnQzMl90IGR3Q2hhckNvZGUgPSBwUERGRm9udC0+SXNVbmljb2RlQ29tcGF0aWJsZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBQREZGb250LT5DaGFyQ29kZUZyb21Vbmljb2RlKFdvcmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBGb250TWFwLT5DaGFyQ29kZUZyb21Vbmljb2RlKG5Gb250SW5kZXgsIFdvcmQpOworICAgIGlmIChkd0NoYXJDb2RlID4gMCkgeworICAgICAgcFBERkZvbnQtPkFwcGVuZENoYXIoJnNXb3JkLCBkd0NoYXJDb2RlKTsKKyAgICAgIHJldHVybiBzV29yZDsKKyAgICB9CisgIH0KKyAgcFBERkZvbnQtPkFwcGVuZENoYXIoJnNXb3JkLCBXb3JkKTsKKyAgcmV0dXJuIHNXb3JkOworfQorCitDUFdMX0VkaXRJbXBsX1NlbGVjdDo6Q1BXTF9FZGl0SW1wbF9TZWxlY3QoKSB7fQorCitDUFdMX0VkaXRJbXBsX1NlbGVjdDo6Q1BXTF9FZGl0SW1wbF9TZWxlY3QoY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIHJhbmdlKSB7CisgIFNldChyYW5nZS5CZWdpblBvcywgcmFuZ2UuRW5kUG9zKTsKK30KKworQ1BWVF9Xb3JkUmFuZ2UgQ1BXTF9FZGl0SW1wbF9TZWxlY3Q6OkNvbnZlcnRUb1dvcmRSYW5nZSgpIGNvbnN0IHsKKyAgcmV0dXJuIENQVlRfV29yZFJhbmdlKEJlZ2luUG9zLCBFbmRQb3MpOworfQorCit2b2lkIENQV0xfRWRpdEltcGxfU2VsZWN0OjpSZXNldCgpIHsKKyAgQmVnaW5Qb3MuUmVzZXQoKTsKKyAgRW5kUG9zLlJlc2V0KCk7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbF9TZWxlY3Q6OlNldChjb25zdCBDUFZUX1dvcmRQbGFjZSYgYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIGVuZCkgeworICBCZWdpblBvcyA9IGJlZ2luOworICBFbmRQb3MgPSBlbmQ7Cit9CisKK3ZvaWQgQ1BXTF9FZGl0SW1wbF9TZWxlY3Q6OlNldEVuZFBvcyhjb25zdCBDUFZUX1dvcmRQbGFjZSYgZW5kKSB7CisgIEVuZFBvcyA9IGVuZDsKK30KKworYm9vbCBDUFdMX0VkaXRJbXBsX1NlbGVjdDo6SXNFbXB0eSgpIGNvbnN0IHsKKyAgcmV0dXJuIEJlZ2luUG9zID09IEVuZFBvczsKK30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcHdsL2Nwd2xfZWRpdF9pbXBsLmggYi9mcGRmc2RrL3B3bC9jcHdsX2VkaXRfaW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NDc3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL3B3bC9jcHdsX2VkaXRfaW1wbC5oCkBAIC0wLDAgKzEsNDM5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlBERlNES19QV0xfQ1BXTF9FRElUX0lNUExfSF8KKyNkZWZpbmUgRlBERlNES19QV0xfQ1BXTF9FRElUX0lNUExfSF8KKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl92YXJpYWJsZXRleHQuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3B2dF93b3JkcmFuZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorCisjZGVmaW5lIEZYX0VESVRfSVNMQVRJTldPUkQodSkgICAgICAgICAgICAgICAgICBcCisgICh1ID09IDB4MkQgfHwgKHUgPD0gMHgwMDVBICYmIHUgPj0gMHgwMDQxKSB8fCBcCisgICAodSA8PSAweDAwN0EgJiYgdSA+PSAweDAwNjEpIHx8ICh1IDw9IDB4MDJBRiAmJiB1ID49IDB4MDBDMCkpCisKK2NsYXNzIENGRkxfRm9ybUZpbGxlcjsKK2NsYXNzIENQV0xfRWRpdEltcGw7CitjbGFzcyBDUFdMX0VkaXRJbXBsX0l0ZXJhdG9yOworY2xhc3MgQ1BXTF9FZGl0SW1wbF9Qcm92aWRlcjsKK2NsYXNzIENGWF9SZW5kZXJEZXZpY2U7CitjbGFzcyBDRlhfU3lzdGVtSGFuZGxlcjsKK2NsYXNzIENQV0xfRWRpdDsKK2NsYXNzIENQV0xfRWRpdEN0cmw7CitjbGFzcyBJRlhfRWRpdF9VbmRvSXRlbTsKKworc3RydWN0IENQV0xfRWRpdEltcGxfTGluZVJlY3QgeworICBDUFdMX0VkaXRJbXBsX0xpbmVSZWN0KGNvbnN0IENQVlRfV29yZFJhbmdlJiB3ckxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmNMaW5lKQorICAgICAgOiBtX3dyTGluZSh3ckxpbmUpLCBtX3JjTGluZShyY0xpbmUpIHt9CisKKyAgQ1BWVF9Xb3JkUmFuZ2UgbV93ckxpbmU7CisgIENGWF9GbG9hdFJlY3QgbV9yY0xpbmU7Cit9OworCitjbGFzcyBDUFdMX0VkaXRJbXBsX1JlZnJlc2ggeworIHB1YmxpYzoKKyAgQ1BXTF9FZGl0SW1wbF9SZWZyZXNoKCk7CisgIH5DUFdMX0VkaXRJbXBsX1JlZnJlc2goKTsKKworICB2b2lkIEJlZ2luUmVmcmVzaCgpOworICB2b2lkIFB1c2goY29uc3QgQ1BWVF9Xb3JkUmFuZ2UmIGxpbmVyYW5nZSwgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCk7CisgIHZvaWQgTm9BbmFseXNlKCk7CisgIHN0ZDo6dmVjdG9yPENGWF9GbG9hdFJlY3Q+KiBHZXRSZWZyZXNoUmVjdHMoKTsKKyAgdm9pZCBFbmRSZWZyZXNoKCk7CisKKyBwcml2YXRlOgorICB2b2lkIEFkZChjb25zdCBDRlhfRmxvYXRSZWN0JiBuZXdfcmVjdCk7CisKKyAgc3RkOjp2ZWN0b3I8Q1BXTF9FZGl0SW1wbF9MaW5lUmVjdD4gbV9OZXdMaW5lUmVjdHM7CisgIHN0ZDo6dmVjdG9yPENQV0xfRWRpdEltcGxfTGluZVJlY3Q+IG1fT2xkTGluZVJlY3RzOworICBzdGQ6OnZlY3RvcjxDRlhfRmxvYXRSZWN0PiBtX1JlZnJlc2hSZWN0czsKK307CisKK2NsYXNzIENQV0xfRWRpdEltcGxfU2VsZWN0IHsKKyBwdWJsaWM6CisgIENQV0xfRWRpdEltcGxfU2VsZWN0KCk7CisgIGV4cGxpY2l0IENQV0xfRWRpdEltcGxfU2VsZWN0KGNvbnN0IENQVlRfV29yZFJhbmdlJiByYW5nZSk7CisKKyAgdm9pZCBSZXNldCgpOworICB2b2lkIFNldChjb25zdCBDUFZUX1dvcmRQbGFjZSYgYmVnaW4sIGNvbnN0IENQVlRfV29yZFBsYWNlJiBlbmQpOworICB2b2lkIFNldEVuZFBvcyhjb25zdCBDUFZUX1dvcmRQbGFjZSYgZW5kKTsKKworICBDUFZUX1dvcmRSYW5nZSBDb252ZXJ0VG9Xb3JkUmFuZ2UoKSBjb25zdDsKKyAgYm9vbCBJc0VtcHR5KCkgY29uc3Q7CisKKyAgQ1BWVF9Xb3JkUGxhY2UgQmVnaW5Qb3M7CisgIENQVlRfV29yZFBsYWNlIEVuZFBvczsKK307CisKK2NsYXNzIENQV0xfRWRpdEltcGxfVW5kbyB7CisgcHVibGljOgorICBDUFdMX0VkaXRJbXBsX1VuZG8oKTsKKyAgfkNQV0xfRWRpdEltcGxfVW5kbygpOworCisgIHZvaWQgQWRkSXRlbShzdGQ6OnVuaXF1ZV9wdHI8SUZYX0VkaXRfVW5kb0l0ZW0+IHBJdGVtKTsKKyAgdm9pZCBVbmRvKCk7CisgIHZvaWQgUmVkbygpOworICBib29sIENhblVuZG8oKSBjb25zdDsKKyAgYm9vbCBDYW5SZWRvKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICB2b2lkIFJlbW92ZUhlYWRzKCk7CisgIHZvaWQgUmVtb3ZlVGFpbHMoKTsKKworICBzdGQ6OmRlcXVlPHN0ZDo6dW5pcXVlX3B0cjxJRlhfRWRpdF9VbmRvSXRlbT4+IG1fVW5kb0l0ZW1TdGFjazsKKyAgc2l6ZV90IG1fbkN1clVuZG9Qb3M7CisgIGJvb2wgbV9iV29ya2luZzsKK307CisKK2NsYXNzIElGWF9FZGl0X1VuZG9JdGVtIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfklGWF9FZGl0X1VuZG9JdGVtKCkge30KKworICB2aXJ0dWFsIHZvaWQgVW5kbygpID0gMDsKKyAgdmlydHVhbCB2b2lkIFJlZG8oKSA9IDA7Cit9OworCitjbGFzcyBDRlhFVV9JbnNlcnRXb3JkIDogcHVibGljIElGWF9FZGl0X1VuZG9JdGVtIHsKKyBwdWJsaWM6CisgIENGWEVVX0luc2VydFdvcmQoQ1BXTF9FZGl0SW1wbCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwTmV3UGxhY2UsCisgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd29yZCwKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQpOworICB+Q0ZYRVVfSW5zZXJ0V29yZCgpIG92ZXJyaWRlOworCisgIC8vIElGWF9FZGl0X1VuZG9JdGVtOgorICB2b2lkIFJlZG8oKSBvdmVycmlkZTsKKyAgdm9pZCBVbmRvKCkgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBVbm93bmVkUHRyPENQV0xfRWRpdEltcGw+IG1fcEVkaXQ7CisKKyAgQ1BWVF9Xb3JkUGxhY2UgbV93cE9sZDsKKyAgQ1BWVF9Xb3JkUGxhY2UgbV93cE5ldzsKKyAgdWludDE2X3QgbV9Xb3JkOworICBpbnQzMl90IG1fbkNoYXJzZXQ7Cit9OworCitjbGFzcyBDRlhFVV9JbnNlcnRSZXR1cm4gOiBwdWJsaWMgSUZYX0VkaXRfVW5kb0l0ZW0geworIHB1YmxpYzoKKyAgQ0ZYRVVfSW5zZXJ0UmV0dXJuKENQV0xfRWRpdEltcGwqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSk7CisgIH5DRlhFVV9JbnNlcnRSZXR1cm4oKSBvdmVycmlkZTsKKworICAvLyBJRlhfRWRpdF9VbmRvSXRlbToKKyAgdm9pZCBSZWRvKCkgb3ZlcnJpZGU7CisgIHZvaWQgVW5kbygpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgVW5vd25lZFB0cjxDUFdMX0VkaXRJbXBsPiBtX3BFZGl0OworCisgIENQVlRfV29yZFBsYWNlIG1fd3BPbGQ7CisgIENQVlRfV29yZFBsYWNlIG1fd3BOZXc7Cit9OworCitjbGFzcyBDRlhFVV9CYWNrc3BhY2UgOiBwdWJsaWMgSUZYX0VkaXRfVW5kb0l0ZW0geworIHB1YmxpYzoKKyAgQ0ZYRVVfQmFja3NwYWNlKENQV0xfRWRpdEltcGwqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwT2xkUGxhY2UsCisgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKKyAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdvcmQsCisgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYXJzZXQpOworICB+Q0ZYRVVfQmFja3NwYWNlKCkgb3ZlcnJpZGU7CisKKyAgLy8gSUZYX0VkaXRfVW5kb0l0ZW06CisgIHZvaWQgUmVkbygpIG92ZXJyaWRlOworICB2b2lkIFVuZG8oKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIFVub3duZWRQdHI8Q1BXTF9FZGl0SW1wbD4gbV9wRWRpdDsKKworICBDUFZUX1dvcmRQbGFjZSBtX3dwT2xkOworICBDUFZUX1dvcmRQbGFjZSBtX3dwTmV3OworICB1aW50MTZfdCBtX1dvcmQ7CisgIGludDMyX3QgbV9uQ2hhcnNldDsKK307CisKK2NsYXNzIENGWEVVX0RlbGV0ZSA6IHB1YmxpYyBJRlhfRWRpdF9VbmRvSXRlbSB7CisgcHVibGljOgorICBDRlhFVV9EZWxldGUoQ1BXTF9FZGl0SW1wbCogcEVkaXQsCisgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BPbGRQbGFjZSwKKyAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE5ld1BsYWNlLAorICAgICAgICAgICAgICAgdWludDE2X3Qgd29yZCwKKyAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgIGJvb2wgYlNlY0VuZCk7CisgIH5DRlhFVV9EZWxldGUoKSBvdmVycmlkZTsKKworICAvLyBJRlhfRWRpdF9VbmRvSXRlbToKKyAgdm9pZCBSZWRvKCkgb3ZlcnJpZGU7CisgIHZvaWQgVW5kbygpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgVW5vd25lZFB0cjxDUFdMX0VkaXRJbXBsPiBtX3BFZGl0OworCisgIENQVlRfV29yZFBsYWNlIG1fd3BPbGQ7CisgIENQVlRfV29yZFBsYWNlIG1fd3BOZXc7CisgIHVpbnQxNl90IG1fV29yZDsKKyAgaW50MzJfdCBtX25DaGFyc2V0OworICBib29sIG1fYlNlY0VuZDsKK307CisKK2NsYXNzIENGWEVVX0NsZWFyIDogcHVibGljIElGWF9FZGl0X1VuZG9JdGVtIHsKKyBwdWJsaWM6CisgIENGWEVVX0NsZWFyKENQV0xfRWRpdEltcGwqIHBFZGl0LAorICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3JTZWwsCisgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHN3VGV4dCk7CisgIH5DRlhFVV9DbGVhcigpIG92ZXJyaWRlOworCisgIC8vIElGWF9FZGl0X1VuZG9JdGVtOgorICB2b2lkIFJlZG8oKSBvdmVycmlkZTsKKyAgdm9pZCBVbmRvKCkgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBVbm93bmVkUHRyPENQV0xfRWRpdEltcGw+IG1fcEVkaXQ7CisKKyAgQ1BWVF9Xb3JkUmFuZ2UgbV93clNlbDsKKyAgV2lkZVN0cmluZyBtX3N3VGV4dDsKK307CisKK2NsYXNzIENGWEVVX0luc2VydFRleHQgOiBwdWJsaWMgSUZYX0VkaXRfVW5kb0l0ZW0geworIHB1YmxpYzoKKyAgQ0ZYRVVfSW5zZXJ0VGV4dChDUFdMX0VkaXRJbXBsKiBwRWRpdCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BPbGRQbGFjZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgd3BOZXdQbGFjZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzd1RleHQsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0KTsKKyAgfkNGWEVVX0luc2VydFRleHQoKSBvdmVycmlkZTsKKworICAvLyBJRlhfRWRpdF9VbmRvSXRlbToKKyAgdm9pZCBSZWRvKCkgb3ZlcnJpZGU7CisgIHZvaWQgVW5kbygpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgVW5vd25lZFB0cjxDUFdMX0VkaXRJbXBsPiBtX3BFZGl0OworCisgIENQVlRfV29yZFBsYWNlIG1fd3BPbGQ7CisgIENQVlRfV29yZFBsYWNlIG1fd3BOZXc7CisgIFdpZGVTdHJpbmcgbV9zd1RleHQ7CisgIGludDMyX3QgbV9uQ2hhcnNldDsKK307CisKK2NsYXNzIENQV0xfRWRpdEltcGwgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgRHJhd0VkaXQoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbXRVc2VyMkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ1BXTF9FZGl0SW1wbCogcEVkaXQsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPTE9SUkVGIGNyVGV4dEZpbGwsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjQ2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHRPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENQVlRfV29yZFJhbmdlKiBwUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIENGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZGTF9Gb3JtRmlsbGVyKiBwRkZMRGF0YSk7CisKKyAgQ1BXTF9FZGl0SW1wbCgpOworICB+Q1BXTF9FZGl0SW1wbCgpOworCisgIHZvaWQgU2V0Rm9udE1hcChJUFZUX0ZvbnRNYXAqIHBGb250TWFwKTsKKyAgdm9pZCBTZXROb3RpZnkoQ1BXTF9FZGl0Q3RybCogcE5vdGlmeSk7CisgIHZvaWQgU2V0T3BlcmF0aW9uTm90aWZ5KENQV0xfRWRpdCogcE9wZXJhdGlvbk5vdGlmeSk7CisKKyAgLy8gUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgdGhlIGNvbnRlbnRzLiBTaG91bGQgbm90IGJlIHJlbGVhc2VkLgorICBDUFdMX0VkaXRJbXBsX0l0ZXJhdG9yKiBHZXRJdGVyYXRvcigpOworICBJUFZUX0ZvbnRNYXAqIEdldEZvbnRNYXAoKTsKKyAgdm9pZCBJbml0aWFsaXplKCk7CisKKyAgLy8gU2V0IHRoZSBib3VuZGluZyBib3ggb2YgdGhlIHRleHQgYXJlYS4KKyAgdm9pZCBTZXRQbGF0ZVJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCk7CisgIHZvaWQgU2V0U2Nyb2xsUG9zKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKKworICAvLyBTZXQgdGhlIGhvcml6b250YWwgdGV4dCBhbGlnbm1lbnQuIChuRm9ybWF0IFswOmxlZnQsIDE6bWlkZGxlLCAyOnJpZ2h0XSkKKyAgdm9pZCBTZXRBbGlnbm1lbnRIKGludDMyX3QgbkZvcm1hdCwgYm9vbCBiUGFpbnQpOworICAvLyBTZXQgdGhlIHZlcnRpY2FsIHRleHQgYWxpZ25tZW50LiAobkZvcm1hdCBbMDpsZWZ0LCAxOm1pZGRsZSwgMjpyaWdodF0pCisgIHZvaWQgU2V0QWxpZ25tZW50VihpbnQzMl90IG5Gb3JtYXQsIGJvb2wgYlBhaW50KTsKKworICAvLyBTZXQgdGhlIHN1YnN0aXR1dGlvbiBjaGFyYWN0ZXIgZm9yIGhpZGRlbiB0ZXh0LgorICB2b2lkIFNldFBhc3N3b3JkQ2hhcih1aW50MTZfdCB3U3ViV29yZCwgYm9vbCBiUGFpbnQpOworCisgIC8vIFNldCB0aGUgbWF4aW11bSBudW1iZXIgb2Ygd29yZHMgaW4gdGhlIHRleHQuCisgIHZvaWQgU2V0TGltaXRDaGFyKGludDMyX3QgbkxpbWl0Q2hhcik7CisgIHZvaWQgU2V0Q2hhckFycmF5KGludDMyX3QgbkNoYXJBcnJheSk7CisgIHZvaWQgU2V0Q2hhclNwYWNlKGZsb2F0IGZDaGFyU3BhY2UpOworICB2b2lkIFNldE11bHRpTGluZShib29sIGJNdWx0aUxpbmUsIGJvb2wgYlBhaW50KTsKKyAgdm9pZCBTZXRBdXRvUmV0dXJuKGJvb2wgYkF1dG8sIGJvb2wgYlBhaW50KTsKKyAgdm9pZCBTZXRBdXRvRm9udFNpemUoYm9vbCBiQXV0bywgYm9vbCBiUGFpbnQpOworICB2b2lkIFNldEF1dG9TY3JvbGwoYm9vbCBiQXV0bywgYm9vbCBiUGFpbnQpOworICB2b2lkIFNldEZvbnRTaXplKGZsb2F0IGZGb250U2l6ZSk7CisgIHZvaWQgU2V0VGV4dE92ZXJmbG93KGJvb2wgYkFsbG93ZWQsIGJvb2wgYlBhaW50KTsKKyAgdm9pZCBPbk1vdXNlRG93bihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpOworICB2b2lkIE9uTW91c2VNb3ZlKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCBib29sIGJTaGlmdCwgYm9vbCBiQ3RybCk7CisgIHZvaWQgT25WS19VUChib29sIGJTaGlmdCwgYm9vbCBiQ3RybCk7CisgIHZvaWQgT25WS19ET1dOKGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKTsKKyAgdm9pZCBPblZLX0xFRlQoYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpOworICB2b2lkIE9uVktfUklHSFQoYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpOworICB2b2lkIE9uVktfSE9NRShib29sIGJTaGlmdCwgYm9vbCBiQ3RybCk7CisgIHZvaWQgT25WS19FTkQoYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpOworICB2b2lkIFNldFRleHQoY29uc3QgV2lkZVN0cmluZyYgc1RleHQpOworICBib29sIEluc2VydFdvcmQodWludDE2X3Qgd29yZCwgaW50MzJfdCBjaGFyc2V0KTsKKyAgYm9vbCBJbnNlcnRSZXR1cm4oKTsKKyAgYm9vbCBCYWNrc3BhY2UoKTsKKyAgYm9vbCBEZWxldGUoKTsKKyAgYm9vbCBDbGVhclNlbGVjdGlvbigpOworICBib29sIEluc2VydFRleHQoY29uc3QgV2lkZVN0cmluZyYgc1RleHQsIGludDMyX3QgY2hhcnNldCk7CisgIGJvb2wgUmVkbygpOworICBib29sIFVuZG8oKTsKKyAgQ1BWVF9Xb3JkUGxhY2UgV29yZEluZGV4VG9Xb3JkUGxhY2UoaW50MzJfdCBpbmRleCkgY29uc3Q7CisgIENQVlRfV29yZFBsYWNlIFNlYXJjaFdvcmRQbGFjZShjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3Q7CisgIGludDMyX3QgR2V0Q2FyZXQoKSBjb25zdDsKKyAgQ1BWVF9Xb3JkUGxhY2UgR2V0Q2FyZXRXb3JkUGxhY2UoKSBjb25zdDsKKyAgV2lkZVN0cmluZyBHZXRTZWxlY3RlZFRleHQoKSBjb25zdDsKKyAgV2lkZVN0cmluZyBHZXRUZXh0KCkgY29uc3Q7CisgIGZsb2F0IEdldEZvbnRTaXplKCkgY29uc3Q7CisgIHVpbnQxNl90IEdldFBhc3N3b3JkQ2hhcigpIGNvbnN0OworICBDRlhfUG9pbnRGIEdldFNjcm9sbFBvcygpIGNvbnN0OworICBpbnQzMl90IEdldENoYXJBcnJheSgpIGNvbnN0OworICBDRlhfRmxvYXRSZWN0IEdldENvbnRlbnRSZWN0KCkgY29uc3Q7CisgIFdpZGVTdHJpbmcgR2V0UmFuZ2VUZXh0KGNvbnN0IENQVlRfV29yZFJhbmdlJiByYW5nZSkgY29uc3Q7CisgIGludDMyX3QgR2V0SG9yelNjYWxlKCkgY29uc3Q7CisgIGZsb2F0IEdldENoYXJTcGFjZSgpIGNvbnN0OworICB2b2lkIFNldFNlbGVjdGlvbihpbnQzMl90IG5TdGFydENoYXIsIGludDMyX3QgbkVuZENoYXIpOworICB2b2lkIEdldFNlbGVjdGlvbihpbnQzMl90JiBuU3RhcnRDaGFyLCBpbnQzMl90JiBuRW5kQ2hhcikgY29uc3Q7CisgIHZvaWQgU2VsZWN0QWxsKCk7CisgIHZvaWQgU2VsZWN0Tm9uZSgpOworICBib29sIElzU2VsZWN0ZWQoKSBjb25zdDsKKyAgdm9pZCBQYWludCgpOworICB2b2lkIEVuYWJsZVJlZnJlc2goYm9vbCBiUmVmcmVzaCk7CisgIHZvaWQgUmVmcmVzaFdvcmRSYW5nZShjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IpOworICBDUFZUX1dvcmRSYW5nZSBHZXRXaG9sZVdvcmRSYW5nZSgpIGNvbnN0OworICBDUFZUX1dvcmRSYW5nZSBHZXRTZWxlY3RXb3JkUmFuZ2UoKSBjb25zdDsKKyAgdm9pZCBFbmFibGVVbmRvKGJvb2wgYlVuZG8pOworICBib29sIElzVGV4dEZ1bGwoKSBjb25zdDsKKyAgYm9vbCBJc1RleHRPdmVyZmxvdygpIGNvbnN0OworICBib29sIENhblVuZG8oKSBjb25zdDsKKyAgYm9vbCBDYW5SZWRvKCkgY29uc3Q7CisgIENQVlRfV29yZFJhbmdlIEdldFZpc2libGVXb3JkUmFuZ2UoKSBjb25zdDsKKworICBib29sIEVtcHR5KCk7CisKKyAgQ1BWVF9Xb3JkUGxhY2UgRG9JbnNlcnRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlJiBwbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHNUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0KTsKKyAgaW50MzJfdCBHZXRDaGFyU2V0RnJvbVVuaWNvZGUodWludDE2X3Qgd29yZCwgaW50MzJfdCBuT2xkQ2hhcnNldCk7CisKKyAgaW50MzJfdCBHZXRUb3RhbExpbmVzKCkgY29uc3Q7CisKKyAgQnl0ZVN0cmluZyBHZXRQREZXb3JkU3RyaW5nKGludDMyX3QgbkZvbnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IFdvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBTdWJXb3JkKTsKKworICB2b2lkIFNldFNlbGVjdGlvbihjb25zdCBDUFZUX1dvcmRQbGFjZSYgYmVnaW4sIGNvbnN0IENQVlRfV29yZFBsYWNlJiBlbmQpOworCisgIGJvb2wgRGVsZXRlKGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KTsKKyAgYm9vbCBDbGVhcihib29sIGJBZGRVbmRvLCBib29sIGJQYWludCk7CisgIGJvb2wgSW5zZXJ0VGV4dChjb25zdCBXaWRlU3RyaW5nJiBzVGV4dCwKKyAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgIGJvb2wgYkFkZFVuZG8sCisgICAgICAgICAgICAgICAgICBib29sIGJQYWludCk7CisgIGJvb2wgSW5zZXJ0V29yZCh1aW50MTZfdCB3b3JkLCBpbnQzMl90IGNoYXJzZXQsIGJvb2wgYkFkZFVuZG8sIGJvb2wgYlBhaW50KTsKKyAgYm9vbCBJbnNlcnRSZXR1cm4oYm9vbCBiQWRkVW5kbywgYm9vbCBiUGFpbnQpOworICBib29sIEJhY2tzcGFjZShib29sIGJBZGRVbmRvLCBib29sIGJQYWludCk7CisgIHZvaWQgU2V0Q2FyZXQoY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHBsYWNlKTsKKworICBDRlhfUG9pbnRGIFZUVG9FZGl0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBjb25zdDsKKworIHByaXZhdGU6CisgIHZvaWQgUmVhcnJhbmdlQWxsKCk7CisgIHZvaWQgUmVhcnJhbmdlUGFydChjb25zdCBDUFZUX1dvcmRSYW5nZSYgcmFuZ2UpOworICB2b2lkIFNjcm9sbFRvQ2FyZXQoKTsKKyAgdm9pZCBTZXRTY3JvbGxJbmZvKCk7CisgIHZvaWQgU2V0U2Nyb2xsUG9zWChmbG9hdCBmeCk7CisgIHZvaWQgU2V0U2Nyb2xsUG9zWShmbG9hdCBmeSk7CisgIHZvaWQgU2V0U2Nyb2xsTGltaXQoKTsKKyAgdm9pZCBTZXRDb250ZW50Q2hhbmdlZCgpOworCisgIHZvaWQgUGFpbnRJbnNlcnRUZXh0KGNvbnN0IENQVlRfV29yZFBsYWNlJiB3cE9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1BWVF9Xb3JkUGxhY2UmIHdwTmV3KTsKKworICBDRlhfUG9pbnRGIEVkaXRUb1ZUKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBjb25zdDsKKyAgQ0ZYX0Zsb2F0UmVjdCBWVFRvRWRpdChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdDsKKworICB2b2lkIFJlZnJlc2goKTsKKyAgdm9pZCBSZWZyZXNoUHVzaExpbmVSZWN0cyhjb25zdCBDUFZUX1dvcmRSYW5nZSYgd3IpOworCisgIHZvaWQgU2V0Q2FyZXRJbmZvKCk7CisgIHZvaWQgU2V0Q2FyZXRPcmlnaW4oKTsKKworICB2b2lkIEFkZEVkaXRVbmRvSXRlbShzdGQ6OnVuaXF1ZV9wdHI8SUZYX0VkaXRfVW5kb0l0ZW0+IHBFZGl0VW5kb0l0ZW0pOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDUERGX1ZhcmlhYmxlVGV4dD4gbV9wVlQ7CisgIFVub3duZWRQdHI8Q1BXTF9FZGl0Q3RybD4gbV9wTm90aWZ5OworICBVbm93bmVkUHRyPENQV0xfRWRpdD4gbV9wT3BlcmF0aW9uTm90aWZ5OworICBzdGQ6OnVuaXF1ZV9wdHI8Q1BXTF9FZGl0SW1wbF9Qcm92aWRlcj4gbV9wVlRQcm92aWRlcjsKKyAgQ1BWVF9Xb3JkUGxhY2UgbV93cENhcmV0OworICBDUFZUX1dvcmRQbGFjZSBtX3dwT2xkQ2FyZXQ7CisgIENQV0xfRWRpdEltcGxfU2VsZWN0IG1fU2VsU3RhdGU7CisgIENGWF9Qb2ludEYgbV9wdFNjcm9sbFBvczsKKyAgQ0ZYX1BvaW50RiBtX3B0UmVmcmVzaFNjcm9sbFBvczsKKyAgYm9vbCBtX2JFbmFibGVTY3JvbGw7CisgIHN0ZDo6dW5pcXVlX3B0cjxDUFdMX0VkaXRJbXBsX0l0ZXJhdG9yPiBtX3BJdGVyYXRvcjsKKyAgQ1BXTF9FZGl0SW1wbF9SZWZyZXNoIG1fUmVmcmVzaDsKKyAgQ0ZYX1BvaW50RiBtX3B0Q2FyZXQ7CisgIENQV0xfRWRpdEltcGxfVW5kbyBtX1VuZG87CisgIGludDMyX3QgbV9uQWxpZ25tZW50OworICBib29sIG1fYk5vdGlmeUZsYWc7CisgIGJvb2wgbV9iRW5hYmxlT3ZlcmZsb3c7CisgIGJvb2wgbV9iRW5hYmxlUmVmcmVzaDsKKyAgQ0ZYX0Zsb2F0UmVjdCBtX3JjT2xkQ29udGVudDsKKyAgYm9vbCBtX2JFbmFibGVVbmRvOworfTsKKworY2xhc3MgQ1BXTF9FZGl0SW1wbF9JdGVyYXRvciB7CisgcHVibGljOgorICBDUFdMX0VkaXRJbXBsX0l0ZXJhdG9yKENQV0xfRWRpdEltcGwqIHBFZGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfVmFyaWFibGVUZXh0OjpJdGVyYXRvciogcFZUSXRlcmF0b3IpOworICB+Q1BXTF9FZGl0SW1wbF9JdGVyYXRvcigpOworCisgIGJvb2wgTmV4dFdvcmQoKTsKKyAgYm9vbCBQcmV2V29yZCgpOworICBib29sIEdldFdvcmQoQ1BWVF9Xb3JkJiB3b3JkKSBjb25zdDsKKyAgYm9vbCBHZXRMaW5lKENQVlRfTGluZSYgbGluZSkgY29uc3Q7CisgIHZvaWQgU2V0QXQoaW50MzJfdCBuV29yZEluZGV4KTsKKyAgdm9pZCBTZXRBdChjb25zdCBDUFZUX1dvcmRQbGFjZSYgcGxhY2UpOworICBjb25zdCBDUFZUX1dvcmRQbGFjZSYgR2V0QXQoKSBjb25zdDsKKworIHByaXZhdGU6CisgIFVub3duZWRQdHI8Q1BXTF9FZGl0SW1wbD4gbV9wRWRpdDsKKyAgQ1BERl9WYXJpYWJsZVRleHQ6Okl0ZXJhdG9yKiBtX3BWVEl0ZXJhdG9yOworfTsKKworY2xhc3MgQ1BXTF9FZGl0SW1wbF9Qcm92aWRlciA6IHB1YmxpYyBDUERGX1ZhcmlhYmxlVGV4dDo6UHJvdmlkZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1BXTF9FZGl0SW1wbF9Qcm92aWRlcihJUFZUX0ZvbnRNYXAqIHBGb250TWFwKTsKKyAgfkNQV0xfRWRpdEltcGxfUHJvdmlkZXIoKSBvdmVycmlkZTsKKworICBJUFZUX0ZvbnRNYXAqIEdldEZvbnRNYXAoKSBjb25zdDsKKworICAvLyBDUERGX1ZhcmlhYmxlVGV4dDo6UHJvdmlkZXI6CisgIGludDMyX3QgR2V0Q2hhcldpZHRoKGludDMyX3QgbkZvbnRJbmRleCwgdWludDE2X3Qgd29yZCkgb3ZlcnJpZGU7CisgIGludDMyX3QgR2V0VHlwZUFzY2VudChpbnQzMl90IG5Gb250SW5kZXgpIG92ZXJyaWRlOworICBpbnQzMl90IEdldFR5cGVEZXNjZW50KGludDMyX3QgbkZvbnRJbmRleCkgb3ZlcnJpZGU7CisgIGludDMyX3QgR2V0V29yZEZvbnRJbmRleCh1aW50MTZfdCB3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRm9udEluZGV4KSBvdmVycmlkZTsKKyAgaW50MzJfdCBHZXREZWZhdWx0Rm9udEluZGV4KCkgb3ZlcnJpZGU7CisgIGJvb2wgSXNMYXRpbldvcmQodWludDE2X3Qgd29yZCkgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBJUFZUX0ZvbnRNYXAqIG1fcEZvbnRNYXA7Cit9OworCisjZW5kaWYgIC8vIEZQREZTREtfUFdMX0NQV0xfRURJVF9JTVBMX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3B3bC9jcHdsX2ZvbnRfbWFwLmNwcCBiL2ZwZGZzZGsvcHdsL2Nwd2xfZm9udF9tYXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNTU1NmUKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL3B3bC9jcHdsX2ZvbnRfbWFwLmNwcApAQCAtMCwwICsxLDQwOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF9mb250X21hcC5oIgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9jcGRmX21vZHVsZW1nci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udC5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udGVuY29kaW5nLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RvY3VtZW50LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3BhcnNlci5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9pcHZ0X2ZvbnRtYXAuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2NvZGVwYWdlLmgiCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF93bmQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBjaGFyIGtEZWZhdWx0Rm9udE5hbWVbXSA9ICJIZWx2ZXRpY2EiOworCitjb25zdCBjaGFyKiBjb25zdCBnX3NERVN0YW5kYXJkRm9udE5hbWVbXSA9IHsiQ291cmllciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291cmllci1Cb2xkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VyaWVyLUJvbGRPYmxpcXVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VyaWVyLU9ibGlxdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHZldGljYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsdmV0aWNhLUJvbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsdmV0aWNhLU9ibGlxdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbWVzLVJvbWFuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaW1lcy1Cb2xkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaW1lcy1JdGFsaWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbWVzLUJvbGRJdGFsaWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN5bWJvbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWmFwZkRpbmdiYXRzIn07CisKK30gIC8vIG5hbWVzcGFjZQorCitDUFdMX0ZvbnRNYXA6OkNQV0xfRm9udE1hcChDRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpCisgICAgOiBtX3BTeXN0ZW1IYW5kbGVyKHBTeXN0ZW1IYW5kbGVyKSB7CisgIEFTU0VSVChtX3BTeXN0ZW1IYW5kbGVyKTsKK30KKworQ1BXTF9Gb250TWFwOjp+Q1BXTF9Gb250TWFwKCkgeworICBFbXB0eSgpOworfQorCitDUERGX0RvY3VtZW50KiBDUFdMX0ZvbnRNYXA6OkdldERvY3VtZW50KCkgeworICBpZiAoIW1fcFBERkRvYykgeworICAgIGlmIChDUERGX01vZHVsZU1ncjo6R2V0KCkpIHsKKyAgICAgIG1fcFBERkRvYyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RvY3VtZW50PihudWxscHRyKTsKKyAgICAgIG1fcFBERkRvYy0+Q3JlYXRlTmV3RG9jKCk7CisgICAgfQorICB9CisgIHJldHVybiBtX3BQREZEb2MuZ2V0KCk7Cit9CisKK0NQREZfRm9udCogQ1BXTF9Gb250TWFwOjpHZXRQREZGb250KGludDMyX3QgbkZvbnRJbmRleCkgeworICBpZiAocGRmaXVtOjpJbmRleEluQm91bmRzKG1fRGF0YSwgbkZvbnRJbmRleCkgJiYgbV9EYXRhW25Gb250SW5kZXhdKQorICAgIHJldHVybiBtX0RhdGFbbkZvbnRJbmRleF0tPnBGb250OworCisgIHJldHVybiBudWxscHRyOworfQorCitCeXRlU3RyaW5nIENQV0xfRm9udE1hcDo6R2V0UERGRm9udEFsaWFzKGludDMyX3QgbkZvbnRJbmRleCkgeworICBpZiAocGRmaXVtOjpJbmRleEluQm91bmRzKG1fRGF0YSwgbkZvbnRJbmRleCkgJiYgbV9EYXRhW25Gb250SW5kZXhdKQorICAgIHJldHVybiBtX0RhdGFbbkZvbnRJbmRleF0tPnNGb250TmFtZTsKKworICByZXR1cm4gQnl0ZVN0cmluZygpOworfQorCitib29sIENQV0xfRm9udE1hcDo6S25vd1dvcmQoaW50MzJfdCBuRm9udEluZGV4LCB1aW50MTZfdCB3b3JkKSB7CisgIHJldHVybiBwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9EYXRhLCBuRm9udEluZGV4KSAmJiBtX0RhdGFbbkZvbnRJbmRleF0gJiYKKyAgICAgICAgIENoYXJDb2RlRnJvbVVuaWNvZGUobkZvbnRJbmRleCwgd29yZCkgPj0gMDsKK30KKworaW50MzJfdCBDUFdMX0ZvbnRNYXA6OkdldFdvcmRGb250SW5kZXgodWludDE2X3Qgd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Gb250SW5kZXgpIHsKKyAgaWYgKG5Gb250SW5kZXggPiAwKSB7CisgICAgaWYgKEtub3dXb3JkKG5Gb250SW5kZXgsIHdvcmQpKQorICAgICAgcmV0dXJuIG5Gb250SW5kZXg7CisgIH0gZWxzZSB7CisgICAgaWYgKGNvbnN0IENQV0xfRm9udE1hcF9EYXRhKiBwRGF0YSA9IEdldEZvbnRNYXBEYXRhKDApKSB7CisgICAgICBpZiAobkNoYXJzZXQgPT0gRlhfQ0hBUlNFVF9EZWZhdWx0IHx8CisgICAgICAgICAgcERhdGEtPm5DaGFyc2V0ID09IEZYX0NIQVJTRVRfU3ltYm9sIHx8IG5DaGFyc2V0ID09IHBEYXRhLT5uQ2hhcnNldCkgeworICAgICAgICBpZiAoS25vd1dvcmQoMCwgd29yZCkpCisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaW50MzJfdCBuTmV3Rm9udEluZGV4ID0KKyAgICAgIEdldEZvbnRJbmRleChHZXROYXRpdmVGb250TmFtZShuQ2hhcnNldCksIG5DaGFyc2V0LCB0cnVlKTsKKyAgaWYgKG5OZXdGb250SW5kZXggPj0gMCkgeworICAgIGlmIChLbm93V29yZChuTmV3Rm9udEluZGV4LCB3b3JkKSkKKyAgICAgIHJldHVybiBuTmV3Rm9udEluZGV4OworICB9CisgIG5OZXdGb250SW5kZXggPSBHZXRGb250SW5kZXgoIkFyaWFsIFVuaWNvZGUgTVMiLCBGWF9DSEFSU0VUX0RlZmF1bHQsIGZhbHNlKTsKKyAgaWYgKG5OZXdGb250SW5kZXggPj0gMCkgeworICAgIGlmIChLbm93V29yZChuTmV3Rm9udEluZGV4LCB3b3JkKSkKKyAgICAgIHJldHVybiBuTmV3Rm9udEluZGV4OworICB9CisgIHJldHVybiAtMTsKK30KKworaW50MzJfdCBDUFdMX0ZvbnRNYXA6OkNoYXJDb2RlRnJvbVVuaWNvZGUoaW50MzJfdCBuRm9udEluZGV4LCB1aW50MTZfdCB3b3JkKSB7CisgIGlmICghcGRmaXVtOjpJbmRleEluQm91bmRzKG1fRGF0YSwgbkZvbnRJbmRleCkpCisgICAgcmV0dXJuIC0xOworCisgIENQV0xfRm9udE1hcF9EYXRhKiBwRGF0YSA9IG1fRGF0YVtuRm9udEluZGV4XS5nZXQoKTsKKyAgaWYgKCFwRGF0YSB8fCAhcERhdGEtPnBGb250KQorICAgIHJldHVybiAtMTsKKworICBpZiAocERhdGEtPnBGb250LT5Jc1VuaWNvZGVDb21wYXRpYmxlKCkpCisgICAgcmV0dXJuIHBEYXRhLT5wRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZSh3b3JkKTsKKworICByZXR1cm4gd29yZCA8IDB4RkYgPyB3b3JkIDogLTE7Cit9CisKK0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpHZXROYXRpdmVGb250TmFtZShpbnQzMl90IG5DaGFyc2V0KSB7CisgIGZvciAoY29uc3QgYXV0byYgcERhdGEgOiBtX05hdGl2ZUZvbnQpIHsKKyAgICBpZiAocERhdGEgJiYgcERhdGEtPm5DaGFyc2V0ID09IG5DaGFyc2V0KQorICAgICAgcmV0dXJuIHBEYXRhLT5zRm9udE5hbWU7CisgIH0KKworICBCeXRlU3RyaW5nIHNOZXcgPSBHZXROYXRpdmVGb250KG5DaGFyc2V0KTsKKyAgaWYgKHNOZXcuSXNFbXB0eSgpKQorICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisKKyAgYXV0byBwTmV3RGF0YSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUFdMX0ZvbnRNYXBfTmF0aXZlPigpOworICBwTmV3RGF0YS0+bkNoYXJzZXQgPSBuQ2hhcnNldDsKKyAgcE5ld0RhdGEtPnNGb250TmFtZSA9IHNOZXc7CisgIG1fTmF0aXZlRm9udC5wdXNoX2JhY2soc3RkOjptb3ZlKHBOZXdEYXRhKSk7CisgIHJldHVybiBzTmV3OworfQorCit2b2lkIENQV0xfRm9udE1hcDo6RW1wdHkoKSB7CisgIG1fRGF0YS5jbGVhcigpOworICBtX05hdGl2ZUZvbnQuY2xlYXIoKTsKK30KKwordm9pZCBDUFdMX0ZvbnRNYXA6OkluaXRpYWxpemUoKSB7CisgIEdldEZvbnRJbmRleChrRGVmYXVsdEZvbnROYW1lLCBGWF9DSEFSU0VUX0FOU0ksIGZhbHNlKTsKK30KKworYm9vbCBDUFdMX0ZvbnRNYXA6OklzU3RhbmRhcmRGb250KGNvbnN0IEJ5dGVTdHJpbmcmIHNGb250TmFtZSkgeworICBmb3IgKGNvbnN0IGNoYXIqIG5hbWUgOiBnX3NERVN0YW5kYXJkRm9udE5hbWUpIHsKKyAgICBpZiAoc0ZvbnROYW1lID09IG5hbWUpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworaW50MzJfdCBDUFdMX0ZvbnRNYXA6OkZpbmRGb250KGNvbnN0IEJ5dGVTdHJpbmcmIHNGb250TmFtZSwgaW50MzJfdCBuQ2hhcnNldCkgeworICBpbnQzMl90IGkgPSAwOworICBmb3IgKGNvbnN0IGF1dG8mIHBEYXRhIDogbV9EYXRhKSB7CisgICAgaWYgKHBEYXRhICYmCisgICAgICAgIChuQ2hhcnNldCA9PSBGWF9DSEFSU0VUX0RlZmF1bHQgfHwgbkNoYXJzZXQgPT0gcERhdGEtPm5DaGFyc2V0KSAmJgorICAgICAgICAoc0ZvbnROYW1lLklzRW1wdHkoKSB8fCBwRGF0YS0+c0ZvbnROYW1lID09IHNGb250TmFtZSkpIHsKKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgICArK2k7CisgIH0KKyAgcmV0dXJuIC0xOworfQorCitpbnQzMl90IENQV0xfRm9udE1hcDo6R2V0Rm9udEluZGV4KGNvbnN0IEJ5dGVTdHJpbmcmIHNGb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmluZCkgeworICBpbnQzMl90IG5Gb250SW5kZXggPSBGaW5kRm9udChFbmNvZGVGb250QWxpYXMoc0ZvbnROYW1lLCBuQ2hhcnNldCksIG5DaGFyc2V0KTsKKyAgaWYgKG5Gb250SW5kZXggPj0gMCkKKyAgICByZXR1cm4gbkZvbnRJbmRleDsKKworICBCeXRlU3RyaW5nIHNBbGlhczsKKyAgQ1BERl9Gb250KiBwRm9udCA9IGJGaW5kID8gRmluZEZvbnRTYW1lQ2hhcnNldCgmc0FsaWFzLCBuQ2hhcnNldCkgOiBudWxscHRyOworICBpZiAoIXBGb250KSB7CisgICAgQnl0ZVN0cmluZyBzVGVtcCA9IHNGb250TmFtZTsKKyAgICBwRm9udCA9IEFkZEZvbnRUb0RvY3VtZW50KEdldERvY3VtZW50KCksIHNUZW1wLCBuQ2hhcnNldCk7CisgICAgc0FsaWFzID0gRW5jb2RlRm9udEFsaWFzKHNUZW1wLCBuQ2hhcnNldCk7CisgIH0KKyAgQWRkZWRGb250KHBGb250LCBzQWxpYXMpOworICByZXR1cm4gQWRkRm9udERhdGEocEZvbnQsIHNBbGlhcywgbkNoYXJzZXQpOworfQorCitDUERGX0ZvbnQqIENQV0xfRm9udE1hcDo6RmluZEZvbnRTYW1lQ2hhcnNldChCeXRlU3RyaW5nKiBzRm9udEFsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhcnNldCkgeworICByZXR1cm4gbnVsbHB0cjsKK30KKworaW50MzJfdCBDUFdMX0ZvbnRNYXA6OkFkZEZvbnREYXRhKENQREZfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFyc2V0KSB7CisgIGF1dG8gcE5ld0RhdGEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BXTF9Gb250TWFwX0RhdGE+KCk7CisgIHBOZXdEYXRhLT5wRm9udCA9IHBGb250OworICBwTmV3RGF0YS0+c0ZvbnROYW1lID0gc0ZvbnRBbGlhczsKKyAgcE5ld0RhdGEtPm5DaGFyc2V0ID0gbkNoYXJzZXQ7CisgIG1fRGF0YS5wdXNoX2JhY2soc3RkOjptb3ZlKHBOZXdEYXRhKSk7CisgIHJldHVybiBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fRGF0YSkgLSAxOworfQorCit2b2lkIENQV0xfRm9udE1hcDo6QWRkZWRGb250KENQREZfRm9udCogcEZvbnQsIGNvbnN0IEJ5dGVTdHJpbmcmIHNGb250QWxpYXMpIHt9CisKK0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpHZXROYXRpdmVGb250KGludDMyX3QgbkNoYXJzZXQpIHsKKyAgaWYgKG5DaGFyc2V0ID09IEZYX0NIQVJTRVRfRGVmYXVsdCkKKyAgICBuQ2hhcnNldCA9IEdldE5hdGl2ZUNoYXJzZXQoKTsKKworICBCeXRlU3RyaW5nIHNGb250TmFtZSA9IEdldERlZmF1bHRGb250QnlDaGFyc2V0KG5DaGFyc2V0KTsKKyAgaWYgKCFtX3BTeXN0ZW1IYW5kbGVyLT5GaW5kTmF0aXZlVHJ1ZVR5cGVGb250KHNGb250TmFtZSkpCisgICAgcmV0dXJuIEJ5dGVTdHJpbmcoKTsKKworICByZXR1cm4gc0ZvbnROYW1lOworfQorCitDUERGX0ZvbnQqIENQV0xfRm9udE1hcDo6QWRkRm9udFRvRG9jdW1lbnQoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nJiBzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBuQ2hhcnNldCkgeworICBpZiAoSXNTdGFuZGFyZEZvbnQoc0ZvbnROYW1lKSkKKyAgICByZXR1cm4gQWRkU3RhbmRhcmRGb250KHBEb2MsIHNGb250TmFtZSk7CisKKyAgcmV0dXJuIEFkZFN5c3RlbUZvbnQocERvYywgc0ZvbnROYW1lLCBuQ2hhcnNldCk7Cit9CisKK0NQREZfRm9udCogQ1BXTF9Gb250TWFwOjpBZGRTdGFuZGFyZEZvbnQoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0cmluZyYgc0ZvbnROYW1lKSB7CisgIGlmICghcERvYykKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBDUERGX0ZvbnQqIHBGb250ID0gbnVsbHB0cjsKKworICBpZiAoc0ZvbnROYW1lID09ICJaYXBmRGluZ2JhdHMiKSB7CisgICAgcEZvbnQgPSBwRG9jLT5BZGRTdGFuZGFyZEZvbnQoc0ZvbnROYW1lLmNfc3RyKCksIG51bGxwdHIpOworICB9IGVsc2UgeworICAgIENQREZfRm9udEVuY29kaW5nIGZlKFBERkZPTlRfRU5DT0RJTkdfV0lOQU5TSSk7CisgICAgcEZvbnQgPSBwRG9jLT5BZGRTdGFuZGFyZEZvbnQoc0ZvbnROYW1lLmNfc3RyKCksICZmZSk7CisgIH0KKworICByZXR1cm4gcEZvbnQ7Cit9CisKK0NQREZfRm9udCogQ1BXTF9Gb250TWFwOjpBZGRTeXN0ZW1Gb250KENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nJiBzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG5DaGFyc2V0KSB7CisgIGlmICghcERvYykKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBpZiAoc0ZvbnROYW1lLklzRW1wdHkoKSkKKyAgICBzRm9udE5hbWUgPSBHZXROYXRpdmVGb250KG5DaGFyc2V0KTsKKyAgaWYgKG5DaGFyc2V0ID09IEZYX0NIQVJTRVRfRGVmYXVsdCkKKyAgICBuQ2hhcnNldCA9IEdldE5hdGl2ZUNoYXJzZXQoKTsKKworICByZXR1cm4gbV9wU3lzdGVtSGFuZGxlci0+QWRkTmF0aXZlVHJ1ZVR5cGVGb250VG9QREYocERvYywgc0ZvbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYXJzZXQpOworfQorCitCeXRlU3RyaW5nIENQV0xfRm9udE1hcDo6RW5jb2RlRm9udEFsaWFzKGNvbnN0IEJ5dGVTdHJpbmcmIHNGb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhcnNldCkgeworICByZXR1cm4gRW5jb2RlRm9udEFsaWFzKHNGb250TmFtZSkgKyBCeXRlU3RyaW5nOjpGb3JtYXQoIl8lMDJYIiwgbkNoYXJzZXQpOworfQorCitCeXRlU3RyaW5nIENQV0xfRm9udE1hcDo6RW5jb2RlRm9udEFsaWFzKGNvbnN0IEJ5dGVTdHJpbmcmIHNGb250TmFtZSkgeworICBCeXRlU3RyaW5nIHNSZXQgPSBzRm9udE5hbWU7CisgIHNSZXQuUmVtb3ZlKCcgJyk7CisgIHJldHVybiBzUmV0OworfQorCitjb25zdCBDUFdMX0ZvbnRNYXBfRGF0YSogQ1BXTF9Gb250TWFwOjpHZXRGb250TWFwRGF0YShpbnQzMl90IG5JbmRleCkgY29uc3QgeworICByZXR1cm4gcGRmaXVtOjpJbmRleEluQm91bmRzKG1fRGF0YSwgbkluZGV4KSA/IG1fRGF0YVtuSW5kZXhdLmdldCgpIDogbnVsbHB0cjsKK30KKworaW50MzJfdCBDUFdMX0ZvbnRNYXA6OkdldE5hdGl2ZUNoYXJzZXQoKSB7CisgIHVpbnQ4X3QgbkNoYXJzZXQgPSBGWF9DSEFSU0VUX0FOU0k7CisgIGludDMyX3QgaUNvZGVQYWdlID0gRlhTWVNfR2V0QUNQKCk7CisgIHN3aXRjaCAoaUNvZGVQYWdlKSB7CisgICAgY2FzZSBGWF9DT0RFUEFHRV9TaGlmdEpJUzoKKyAgICAgIG5DaGFyc2V0ID0gRlhfQ0hBUlNFVF9TaGlmdEpJUzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhfQ09ERVBBR0VfQ2hpbmVzZVNpbXBsaWZpZWQ6CisgICAgICBuQ2hhcnNldCA9IEZYX0NIQVJTRVRfQ2hpbmVzZVNpbXBsaWZpZWQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYX0NPREVQQUdFX0NoaW5lc2VUcmFkaXRpb25hbDoKKyAgICAgIG5DaGFyc2V0ID0gRlhfQ0hBUlNFVF9DaGluZXNlVHJhZGl0aW9uYWw7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbjoKKyAgICAgIG5DaGFyc2V0ID0gRlhfQ0hBUlNFVF9BTlNJOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWF9DT0RFUEFHRV9NU0RPU19UaGFpOgorICAgICAgbkNoYXJzZXQgPSBGWF9DSEFSU0VUX1RoYWk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYX0NPREVQQUdFX0hhbmd1bDoKKyAgICAgIG5DaGFyc2V0ID0gRlhfQ0hBUlNFVF9IYW5ndWw7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYX0NPREVQQUdFX1VURjE2TEU6CisgICAgICBuQ2hhcnNldCA9IEZYX0NIQVJTRVRfQU5TSTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhfQ09ERVBBR0VfTVNXaW5fRWFzdGVybkV1cm9wZWFuOgorICAgICAgbkNoYXJzZXQgPSBGWF9DSEFSU0VUX01TV2luX0Vhc3Rlcm5FdXJvcGVhbjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWM6CisgICAgICBuQ2hhcnNldCA9IEZYX0NIQVJTRVRfTVNXaW5fQ3lyaWxsaWM7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYX0NPREVQQUdFX01TV2luX0dyZWVrOgorICAgICAgbkNoYXJzZXQgPSBGWF9DSEFSU0VUX01TV2luX0dyZWVrOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWF9DT0RFUEFHRV9NU1dpbl9UdXJraXNoOgorICAgICAgbkNoYXJzZXQgPSBGWF9DSEFSU0VUX01TV2luX1R1cmtpc2g7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYX0NPREVQQUdFX01TV2luX0hlYnJldzoKKyAgICAgIG5DaGFyc2V0ID0gRlhfQ0hBUlNFVF9NU1dpbl9IZWJyZXc7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYX0NPREVQQUdFX01TV2luX0FyYWJpYzoKKyAgICAgIG5DaGFyc2V0ID0gRlhfQ0hBUlNFVF9NU1dpbl9BcmFiaWM7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYX0NPREVQQUdFX01TV2luX0JhbHRpYzoKKyAgICAgIG5DaGFyc2V0ID0gRlhfQ0hBUlNFVF9NU1dpbl9CYWx0aWM7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYX0NPREVQQUdFX01TV2luX1ZpZXRuYW1lc2U6CisgICAgICBuQ2hhcnNldCA9IEZYX0NIQVJTRVRfTVNXaW5fVmlldG5hbWVzZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhfQ09ERVBBR0VfSm9oYWI6CisgICAgICBuQ2hhcnNldCA9IEZYX0NIQVJTRVRfSm9oYWI7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gbkNoYXJzZXQ7Cit9CisKK2NvbnN0IEZQREZfQ2hhcnNldEZvbnRNYXAgQ1BXTF9Gb250TWFwOjpkZWZhdWx0VFRGTWFwW10gPSB7CisgICAge0ZYX0NIQVJTRVRfQU5TSSwgIkhlbHZldGljYSJ9LAorICAgIHtGWF9DSEFSU0VUX0NoaW5lc2VTaW1wbGlmaWVkLCAiU2ltU3VuIn0sCisgICAge0ZYX0NIQVJTRVRfQ2hpbmVzZVRyYWRpdGlvbmFsLCAiTWluZ0xpVSJ9LAorICAgIHtGWF9DSEFSU0VUX1NoaWZ0SklTLCAiTVMgR290aGljIn0sCisgICAge0ZYX0NIQVJTRVRfSGFuZ3VsLCAiQmF0YW5nIn0sCisgICAge0ZYX0NIQVJTRVRfTVNXaW5fQ3lyaWxsaWMsICJBcmlhbCJ9LAorI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0xJTlVYXyB8fCBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9BUFBMRV8KKyAgICB7RlhfQ0hBUlNFVF9NU1dpbl9FYXN0ZXJuRXVyb3BlYW4sICJBcmlhbCJ9LAorI2Vsc2UKKyAgICB7RlhfQ0hBUlNFVF9NU1dpbl9FYXN0ZXJuRXVyb3BlYW4sICJUYWhvbWEifSwKKyNlbmRpZgorICAgIHtGWF9DSEFSU0VUX01TV2luX0FyYWJpYywgIkFyaWFsIn0sCisgICAgey0xLCBudWxscHRyfX07CisKK0J5dGVTdHJpbmcgQ1BXTF9Gb250TWFwOjpHZXREZWZhdWx0Rm9udEJ5Q2hhcnNldChpbnQzMl90IG5DaGFyc2V0KSB7CisgIGludCBpID0gMDsKKyAgd2hpbGUgKGRlZmF1bHRUVEZNYXBbaV0uY2hhcnNldCAhPSAtMSkgeworICAgIGlmIChuQ2hhcnNldCA9PSBkZWZhdWx0VFRGTWFwW2ldLmNoYXJzZXQpCisgICAgICByZXR1cm4gZGVmYXVsdFRURk1hcFtpXS5mb250bmFtZTsKKyAgICArK2k7CisgIH0KKyAgcmV0dXJuICIiOworfQorCitpbnQzMl90IENQV0xfRm9udE1hcDo6Q2hhclNldEZyb21Vbmljb2RlKHVpbnQxNl90IHdvcmQsIGludDMyX3Qgbk9sZENoYXJzZXQpIHsKKyAgLy8gdG8gYXZvaWQgQ0pLIEZvbnQgdG8gc2hvdyBBU0NJSQorICBpZiAod29yZCA8IDB4N0YpCisgICAgcmV0dXJuIEZYX0NIQVJTRVRfQU5TSTsKKyAgLy8gZm9sbG93IHRoZSBvbGQgY2hhcnNldAorICBpZiAobk9sZENoYXJzZXQgIT0gRlhfQ0hBUlNFVF9EZWZhdWx0KQorICAgIHJldHVybiBuT2xkQ2hhcnNldDsKKworICAvLyBmaW5kIG5ldyBjaGFyc2V0CisgIGlmICgod29yZCA+PSAweDRFMDAgJiYgd29yZCA8PSAweDlGQTUpIHx8CisgICAgICAod29yZCA+PSAweEU3QzcgJiYgd29yZCA8PSAweEU3RjMpIHx8CisgICAgICAod29yZCA+PSAweDMwMDAgJiYgd29yZCA8PSAweDMwM0YpIHx8CisgICAgICAod29yZCA+PSAweDIwMDAgJiYgd29yZCA8PSAweDIwNkYpKSB7CisgICAgcmV0dXJuIEZYX0NIQVJTRVRfQ2hpbmVzZVNpbXBsaWZpZWQ7CisgIH0KKworICBpZiAoKCh3b3JkID49IDB4MzA0MCkgJiYgKHdvcmQgPD0gMHgzMDlGKSkgfHwKKyAgICAgICgod29yZCA+PSAweDMwQTApICYmICh3b3JkIDw9IDB4MzBGRikpIHx8CisgICAgICAoKHdvcmQgPj0gMHgzMUYwKSAmJiAod29yZCA8PSAweDMxRkYpKSB8fAorICAgICAgKCh3b3JkID49IDB4RkYwMCkgJiYgKHdvcmQgPD0gMHhGRkVGKSkpIHsKKyAgICByZXR1cm4gRlhfQ0hBUlNFVF9TaGlmdEpJUzsKKyAgfQorCisgIGlmICgoKHdvcmQgPj0gMHhBQzAwKSAmJiAod29yZCA8PSAweEQ3QUYpKSB8fAorICAgICAgKCh3b3JkID49IDB4MTEwMCkgJiYgKHdvcmQgPD0gMHgxMUZGKSkgfHwKKyAgICAgICgod29yZCA+PSAweDMxMzApICYmICh3b3JkIDw9IDB4MzE4RikpKSB7CisgICAgcmV0dXJuIEZYX0NIQVJTRVRfSGFuZ3VsOworICB9CisKKyAgaWYgKHdvcmQgPj0gMHgwRTAwICYmIHdvcmQgPD0gMHgwRTdGKQorICAgIHJldHVybiBGWF9DSEFSU0VUX1RoYWk7CisKKyAgaWYgKCh3b3JkID49IDB4MDM3MCAmJiB3b3JkIDw9IDB4MDNGRikgfHwgKHdvcmQgPj0gMHgxRjAwICYmIHdvcmQgPD0gMHgxRkZGKSkKKyAgICByZXR1cm4gRlhfQ0hBUlNFVF9NU1dpbl9HcmVlazsKKworICBpZiAoKHdvcmQgPj0gMHgwNjAwICYmIHdvcmQgPD0gMHgwNkZGKSB8fCAod29yZCA+PSAweEZCNTAgJiYgd29yZCA8PSAweEZFRkMpKQorICAgIHJldHVybiBGWF9DSEFSU0VUX01TV2luX0FyYWJpYzsKKworICBpZiAod29yZCA+PSAweDA1OTAgJiYgd29yZCA8PSAweDA1RkYpCisgICAgcmV0dXJuIEZYX0NIQVJTRVRfTVNXaW5fSGVicmV3OworCisgIGlmICh3b3JkID49IDB4MDQwMCAmJiB3b3JkIDw9IDB4MDRGRikKKyAgICByZXR1cm4gRlhfQ0hBUlNFVF9NU1dpbl9DeXJpbGxpYzsKKworICBpZiAod29yZCA+PSAweDAxMDAgJiYgd29yZCA8PSAweDAyNEYpCisgICAgcmV0dXJuIEZYX0NIQVJTRVRfTVNXaW5fRWFzdGVybkV1cm9wZWFuOworCisgIGlmICh3b3JkID49IDB4MUUwMCAmJiB3b3JkIDw9IDB4MUVGRikKKyAgICByZXR1cm4gRlhfQ0hBUlNFVF9NU1dpbl9WaWV0bmFtZXNlOworCisgIHJldHVybiBGWF9DSEFSU0VUX0FOU0k7Cit9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3B3bC9jcHdsX2ZvbnRfbWFwLmggYi9mcGRmc2RrL3B3bC9jcHdsX2ZvbnRfbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyYzNmYQotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvcHdsL2Nwd2xfZm9udF9tYXAuaApAQCAtMCwwICsxLDkzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlBERlNES19QV0xfQ1BXTF9GT05UX01BUF9IXworI2RlZmluZSBGUERGU0RLX1BXTF9DUFdMX0ZPTlRfTUFQX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9mcGRmZG9jL2lwdnRfZm9udG1hcC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29kZXBhZ2UuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9zeXNmb250aW5mby5oIgorCitjbGFzcyBDUERGX0RvY3VtZW50OworY2xhc3MgQ0ZYX1N5c3RlbUhhbmRsZXI7CisKK3N0cnVjdCBDUFdMX0ZvbnRNYXBfRGF0YSB7CisgIENQREZfRm9udCogcEZvbnQ7CisgIGludDMyX3QgbkNoYXJzZXQ7CisgIEJ5dGVTdHJpbmcgc0ZvbnROYW1lOworfTsKKworc3RydWN0IENQV0xfRm9udE1hcF9OYXRpdmUgeworICBpbnQzMl90IG5DaGFyc2V0OworICBCeXRlU3RyaW5nIHNGb250TmFtZTsKK307CisKK2NsYXNzIENQV0xfRm9udE1hcCA6IHB1YmxpYyBJUFZUX0ZvbnRNYXAgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1BXTF9Gb250TWFwKENGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlcik7CisgIH5DUFdMX0ZvbnRNYXAoKSBvdmVycmlkZTsKKworICAvLyBJUFZUX0ZvbnRNYXAKKyAgQ1BERl9Gb250KiBHZXRQREZGb250KGludDMyX3QgbkZvbnRJbmRleCkgb3ZlcnJpZGU7CisgIEJ5dGVTdHJpbmcgR2V0UERGRm9udEFsaWFzKGludDMyX3QgbkZvbnRJbmRleCkgb3ZlcnJpZGU7CisgIGludDMyX3QgR2V0V29yZEZvbnRJbmRleCh1aW50MTZfdCB3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkZvbnRJbmRleCkgb3ZlcnJpZGU7CisgIGludDMyX3QgQ2hhckNvZGVGcm9tVW5pY29kZShpbnQzMl90IG5Gb250SW5kZXgsIHVpbnQxNl90IHdvcmQpIG92ZXJyaWRlOworICBpbnQzMl90IENoYXJTZXRGcm9tVW5pY29kZSh1aW50MTZfdCB3b3JkLCBpbnQzMl90IG5PbGRDaGFyc2V0KSBvdmVycmlkZTsKKworICBjb25zdCBDUFdMX0ZvbnRNYXBfRGF0YSogR2V0Rm9udE1hcERhdGEoaW50MzJfdCBuSW5kZXgpIGNvbnN0OworICBzdGF0aWMgaW50MzJfdCBHZXROYXRpdmVDaGFyc2V0KCk7CisgIEJ5dGVTdHJpbmcgR2V0TmF0aXZlRm9udE5hbWUoaW50MzJfdCBuQ2hhcnNldCk7CisKKyAgc3RhdGljIEJ5dGVTdHJpbmcgR2V0RGVmYXVsdEZvbnRCeUNoYXJzZXQoaW50MzJfdCBuQ2hhcnNldCk7CisgIHN0YXRpYyBjb25zdCBGUERGX0NoYXJzZXRGb250TWFwIGRlZmF1bHRUVEZNYXBbXTsKKworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoKTsKKyAgdmlydHVhbCBDUERGX0RvY3VtZW50KiBHZXREb2N1bWVudCgpOworICB2aXJ0dWFsIENQREZfRm9udCogRmluZEZvbnRTYW1lQ2hhcnNldChCeXRlU3RyaW5nKiBzRm9udEFsaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFyc2V0KTsKKyAgdmlydHVhbCB2b2lkIEFkZGVkRm9udChDUERGX0ZvbnQqIHBGb250LCBjb25zdCBCeXRlU3RyaW5nJiBzRm9udEFsaWFzKTsKKworICBib29sIEtub3dXb3JkKGludDMyX3QgbkZvbnRJbmRleCwgdWludDE2X3Qgd29yZCk7CisKKyAgdm9pZCBFbXB0eSgpOworICBpbnQzMl90IEdldEZvbnRJbmRleChjb25zdCBCeXRlU3RyaW5nJiBzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZpbmQpOworICBpbnQzMl90IEFkZEZvbnREYXRhKENQREZfRm9udCogcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgc0ZvbnRBbGlhcywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFyc2V0ID0gRlhfQ0hBUlNFVF9EZWZhdWx0KTsKKworICBCeXRlU3RyaW5nIEVuY29kZUZvbnRBbGlhcyhjb25zdCBCeXRlU3RyaW5nJiBzRm9udE5hbWUsIGludDMyX3QgbkNoYXJzZXQpOworICBCeXRlU3RyaW5nIEVuY29kZUZvbnRBbGlhcyhjb25zdCBCeXRlU3RyaW5nJiBzRm9udE5hbWUpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDUFdMX0ZvbnRNYXBfRGF0YT4+IG1fRGF0YTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENQV0xfRm9udE1hcF9OYXRpdmU+PiBtX05hdGl2ZUZvbnQ7CisKKyBwcml2YXRlOgorICBpbnQzMl90IEZpbmRGb250KGNvbnN0IEJ5dGVTdHJpbmcmIHNGb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DaGFyc2V0ID0gRlhfQ0hBUlNFVF9EZWZhdWx0KTsKKworICBCeXRlU3RyaW5nIEdldE5hdGl2ZUZvbnQoaW50MzJfdCBuQ2hhcnNldCk7CisgIENQREZfRm9udCogQWRkRm9udFRvRG9jdW1lbnQoQ1BERl9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nJiBzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBuQ2hhcnNldCk7CisgIGJvb2wgSXNTdGFuZGFyZEZvbnQoY29uc3QgQnl0ZVN0cmluZyYgc0ZvbnROYW1lKTsKKyAgQ1BERl9Gb250KiBBZGRTdGFuZGFyZEZvbnQoQ1BERl9Eb2N1bWVudCogcERvYywgQnl0ZVN0cmluZyYgc0ZvbnROYW1lKTsKKyAgQ1BERl9Gb250KiBBZGRTeXN0ZW1Gb250KENQREZfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nJiBzRm9udE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IG5DaGFyc2V0KTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9Eb2N1bWVudD4gbV9wUERGRG9jOworICBVbm93bmVkUHRyPENGWF9TeXN0ZW1IYW5kbGVyPiBjb25zdCBtX3BTeXN0ZW1IYW5kbGVyOworfTsKKworI2VuZGlmICAvLyBGUERGU0RLX1BXTF9DUFdMX0ZPTlRfTUFQX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3B3bC9jcHdsX2ljb24uY3BwIGIvZnBkZnNkay9wd2wvY3B3bF9pY29uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzY2OWIzCi0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9wd2wvY3B3bF9pY29uLmNwcApAQCAtMCwwICsxLDEzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF9pY29uLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9hcnJheS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX3duZC5oIgorCitDUFdMX0ljb246OkNQV0xfSWNvbigpIDogbV9wUERGU3RyZWFtKG51bGxwdHIpLCBtX3BJY29uRml0KG51bGxwdHIpIHt9CisKK0NQV0xfSWNvbjo6fkNQV0xfSWNvbigpIHt9CisKK3N0ZDo6cGFpcjxmbG9hdCwgZmxvYXQ+IENQV0xfSWNvbjo6R2V0SW1hZ2VTaXplKCkgeworICBpZiAoIW1fcFBERlN0cmVhbSkKKyAgICByZXR1cm4gezAuMGYsIDAuMGZ9OworCisgIENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BQREZTdHJlYW0tPkdldERpY3QoKTsKKyAgaWYgKCFwRGljdCkKKyAgICByZXR1cm4gezAuMGYsIDAuMGZ9OworCisgIENGWF9GbG9hdFJlY3QgcmVjdCA9IHBEaWN0LT5HZXRSZWN0Rm9yKCJCQm94Iik7CisgIHJldHVybiB7cmVjdC5yaWdodCAtIHJlY3QubGVmdCwgcmVjdC50b3AgLSByZWN0LmJvdHRvbX07Cit9CisKK0NGWF9NYXRyaXggQ1BXTF9JY29uOjpHZXRJbWFnZU1hdHJpeCgpIHsKKyAgaWYgKCFtX3BQREZTdHJlYW0pCisgICAgcmV0dXJuIENGWF9NYXRyaXgoKTsKKyAgaWYgKENQREZfRGljdGlvbmFyeSogcERpY3QgPSBtX3BQREZTdHJlYW0tPkdldERpY3QoKSkKKyAgICByZXR1cm4gcERpY3QtPkdldE1hdHJpeEZvcigiTWF0cml4Iik7CisgIHJldHVybiBDRlhfTWF0cml4KCk7Cit9CisKK0J5dGVTdHJpbmcgQ1BXTF9JY29uOjpHZXRJbWFnZUFsaWFzKCkgeworICBpZiAoIW1fcFBERlN0cmVhbSkKKyAgICByZXR1cm4gQnl0ZVN0cmluZygpOworICBpZiAoQ1BERl9EaWN0aW9uYXJ5KiBwRGljdCA9IG1fcFBERlN0cmVhbS0+R2V0RGljdCgpKQorICAgIHJldHVybiBwRGljdC0+R2V0U3RyaW5nRm9yKCJOYW1lIik7CisgIHJldHVybiBCeXRlU3RyaW5nKCk7Cit9CisKK3N0ZDo6cGFpcjxmbG9hdCwgZmxvYXQ+IENQV0xfSWNvbjo6R2V0SWNvblBvc2l0aW9uKCkgeworICBpZiAoIW1fcEljb25GaXQpCisgICAgcmV0dXJuIHswLjBmLCAwLjBmfTsKKworICBDUERGX0FycmF5KiBwQSA9CisgICAgICBtX3BJY29uRml0LT5HZXREaWN0KCkgPyBtX3BJY29uRml0LT5HZXREaWN0KCktPkdldEFycmF5Rm9yKCJBIikgOiBudWxscHRyOworICBpZiAoIXBBKQorICAgIHJldHVybiB7MC4wZiwgMC4wZn07CisKKyAgc2l6ZV90IGR3Q291bnQgPSBwQS0+R2V0Q291bnQoKTsKKyAgcmV0dXJuIHtkd0NvdW50ID4gMCA/IHBBLT5HZXROdW1iZXJBdCgwKSA6IDAuMGYsCisgICAgICAgICAgZHdDb3VudCA+IDEgPyBwQS0+R2V0TnVtYmVyQXQoMSkgOiAwLjBmfTsKK30KKworc3RkOjpwYWlyPGZsb2F0LCBmbG9hdD4gQ1BXTF9JY29uOjpHZXRTY2FsZSgpIHsKKyAgZmxvYXQgZkhTY2FsZSA9IDEuMGY7CisgIGZsb2F0IGZWU2NhbGUgPSAxLjBmOworCisgIGlmICghbV9wUERGU3RyZWFtKQorICAgIHJldHVybiB7ZkhTY2FsZSwgZlZTY2FsZX07CisKKyAgQ0ZYX0Zsb2F0UmVjdCByY1BsYXRlID0gR2V0Q2xpZW50UmVjdCgpOworICBmbG9hdCBmUGxhdGVXaWR0aCA9IHJjUGxhdGUucmlnaHQgLSByY1BsYXRlLmxlZnQ7CisgIGZsb2F0IGZQbGF0ZUhlaWdodCA9IHJjUGxhdGUudG9wIC0gcmNQbGF0ZS5ib3R0b207CisKKyAgZmxvYXQgZkltYWdlV2lkdGg7CisgIGZsb2F0IGZJbWFnZUhlaWdodDsKKyAgc3RkOjp0aWUoZkltYWdlV2lkdGgsIGZJbWFnZUhlaWdodCkgPSBHZXRJbWFnZVNpemUoKTsKKworICBpbnQzMl90IG5TY2FsZU1ldGhvZCA9IG1fcEljb25GaXQgPyBtX3BJY29uRml0LT5HZXRTY2FsZU1ldGhvZCgpIDogMDsKKworICBzd2l0Y2ggKG5TY2FsZU1ldGhvZCkgeworICAgIGRlZmF1bHQ6CisgICAgY2FzZSAwOgorICAgICAgZkhTY2FsZSA9IGZQbGF0ZVdpZHRoIC8gc3RkOjptYXgoZkltYWdlV2lkdGgsIDEuMGYpOworICAgICAgZlZTY2FsZSA9IGZQbGF0ZUhlaWdodCAvIHN0ZDo6bWF4KGZJbWFnZUhlaWdodCwgMS4wZik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBpZiAoZlBsYXRlV2lkdGggPCBmSW1hZ2VXaWR0aCkKKyAgICAgICAgZkhTY2FsZSA9IGZQbGF0ZVdpZHRoIC8gc3RkOjptYXgoZkltYWdlV2lkdGgsIDEuMGYpOworICAgICAgaWYgKGZQbGF0ZUhlaWdodCA8IGZJbWFnZUhlaWdodCkKKyAgICAgICAgZlZTY2FsZSA9IGZQbGF0ZUhlaWdodCAvIHN0ZDo6bWF4KGZJbWFnZUhlaWdodCwgMS4wZik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBpZiAoZlBsYXRlV2lkdGggPiBmSW1hZ2VXaWR0aCkKKyAgICAgICAgZkhTY2FsZSA9IGZQbGF0ZVdpZHRoIC8gc3RkOjptYXgoZkltYWdlV2lkdGgsIDEuMGYpOworICAgICAgaWYgKGZQbGF0ZUhlaWdodCA+IGZJbWFnZUhlaWdodCkKKyAgICAgICAgZlZTY2FsZSA9IGZQbGF0ZUhlaWdodCAvIHN0ZDo6bWF4KGZJbWFnZUhlaWdodCwgMS4wZik7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBicmVhazsKKyAgfQorCisgIGZsb2F0IGZNaW5TY2FsZTsKKyAgaWYgKG1fcEljb25GaXQgJiYgbV9wSWNvbkZpdC0+SXNQcm9wb3J0aW9uYWxTY2FsZSgpKSB7CisgICAgZk1pblNjYWxlID0gc3RkOjptaW4oZkhTY2FsZSwgZlZTY2FsZSk7CisgICAgZkhTY2FsZSA9IGZNaW5TY2FsZTsKKyAgICBmVlNjYWxlID0gZk1pblNjYWxlOworICB9CisgIHJldHVybiB7ZkhTY2FsZSwgZlZTY2FsZX07Cit9CisKK3N0ZDo6cGFpcjxmbG9hdCwgZmxvYXQ+IENQV0xfSWNvbjo6R2V0SW1hZ2VPZmZzZXQoKSB7CisgIGZsb2F0IGZMZWZ0OworICBmbG9hdCBmQm90dG9tOworICBzdGQ6OnRpZShmTGVmdCwgZkJvdHRvbSkgPSBHZXRJY29uUG9zaXRpb24oKTsKKworICBmbG9hdCBmSW1hZ2VXaWR0aDsKKyAgZmxvYXQgZkltYWdlSGVpZ2h0OworICBzdGQ6OnRpZShmSW1hZ2VXaWR0aCwgZkltYWdlSGVpZ2h0KSA9IEdldEltYWdlU2l6ZSgpOworCisgIGZsb2F0IGZIU2NhbGUsIGZWU2NhbGU7CisgIHN0ZDo6dGllKGZIU2NhbGUsIGZWU2NhbGUpID0gR2V0U2NhbGUoKTsKKworICBmbG9hdCBmSW1hZ2VGYWN0V2lkdGggPSBmSW1hZ2VXaWR0aCAqIGZIU2NhbGU7CisgIGZsb2F0IGZJbWFnZUZhY3RIZWlnaHQgPSBmSW1hZ2VIZWlnaHQgKiBmVlNjYWxlOworCisgIENGWF9GbG9hdFJlY3QgcmNQbGF0ZSA9IEdldENsaWVudFJlY3QoKTsKKyAgZmxvYXQgZlBsYXRlV2lkdGggPSByY1BsYXRlLnJpZ2h0IC0gcmNQbGF0ZS5sZWZ0OworICBmbG9hdCBmUGxhdGVIZWlnaHQgPSByY1BsYXRlLnRvcCAtIHJjUGxhdGUuYm90dG9tOworCisgIHJldHVybiB7KGZQbGF0ZVdpZHRoIC0gZkltYWdlRmFjdFdpZHRoKSAqIGZMZWZ0LAorICAgICAgICAgIChmUGxhdGVIZWlnaHQgLSBmSW1hZ2VGYWN0SGVpZ2h0KSAqIGZCb3R0b219OworfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9wd2wvY3B3bF9pY29uLmggYi9mcGRmc2RrL3B3bC9jcHdsX2ljb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjg4NDY1Ci0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9wd2wvY3B3bF9pY29uLmgKQEAgLTAsMCArMSw0NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZQREZTREtfUFdMX0NQV0xfSUNPTl9IXworI2RlZmluZSBGUERGU0RLX1BXTF9DUFdMX0lDT05fSF8KKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX3duZC5oIgorCitjbGFzcyBDUFdMX0ljb24gOiBwdWJsaWMgQ1BXTF9XbmQgeworIHB1YmxpYzoKKyAgQ1BXTF9JY29uKCk7CisgIH5DUFdMX0ljb24oKSBvdmVycmlkZTsKKworICB2b2lkIFNldEljb25GaXQoQ1BERl9JY29uRml0KiBwSWNvbkZpdCkgeyBtX3BJY29uRml0ID0gcEljb25GaXQ7IH0KKyAgdm9pZCBTZXRQREZTdHJlYW0oQ1BERl9TdHJlYW0qIHBTdHJlYW0pIHsgbV9wUERGU3RyZWFtID0gcFN0cmVhbTsgfQorCisgIC8vIGhvcml6b250YWwgc2NhbGUsIHZlcnRpY2FsIHNjYWxlCisgIHN0ZDo6cGFpcjxmbG9hdCwgZmxvYXQ+IEdldFNjYWxlKCk7CisKKyAgLy8geCwgeQorICBzdGQ6OnBhaXI8ZmxvYXQsIGZsb2F0PiBHZXRJbWFnZU9mZnNldCgpOworCisgIENGWF9NYXRyaXggR2V0SW1hZ2VNYXRyaXgoKTsKKyAgQnl0ZVN0cmluZyBHZXRJbWFnZUFsaWFzKCk7CisKKyBwcml2YXRlOgorICAvLyBsZWZ0LCBib3R0b20KKyAgc3RkOjpwYWlyPGZsb2F0LCBmbG9hdD4gR2V0SWNvblBvc2l0aW9uKCk7CisKKyAgLy8gd2lkdGgsIGhlaWdodAorICBzdGQ6OnBhaXI8ZmxvYXQsIGZsb2F0PiBHZXRJbWFnZVNpemUoKTsKKworICBVbm93bmVkUHRyPENQREZfU3RyZWFtPiBtX3BQREZTdHJlYW07CisgIFVub3duZWRQdHI8Q1BERl9JY29uRml0PiBtX3BJY29uRml0OworfTsKKworI2VuZGlmICAvLyBGUERGU0RLX1BXTF9DUFdMX0lDT05fSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcHdsL2Nwd2xfbGlzdF9ib3guY3BwIGIvZnBkZnNkay9wd2wvY3B3bF9saXN0X2JveC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjMDJlNAotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvcHdsL2Nwd2xfbGlzdF9ib3guY3BwCkBAIC0wLDAgKzEsMzg1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX2xpc3RfYm94LmgiCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX2VkaXQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX2VkaXRfY3RybC5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfZWRpdF9pbXBsLmgiCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF9saXN0X2ltcGwuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX3Njcm9sbF9iYXIuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX3duZC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2Z3bGV2ZW50LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCitDUFdMX0xpc3RfTm90aWZ5OjpDUFdMX0xpc3RfTm90aWZ5KENQV0xfTGlzdEJveCogcExpc3QpIDogbV9wTGlzdChwTGlzdCkgeworICBBU1NFUlQobV9wTGlzdCk7Cit9CisKK0NQV0xfTGlzdF9Ob3RpZnk6On5DUFdMX0xpc3RfTm90aWZ5KCkge30KKwordm9pZCBDUFdMX0xpc3RfTm90aWZ5OjpJT25TZXRTY3JvbGxJbmZvWShmbG9hdCBmUGxhdGVNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZQbGF0ZU1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZkNvbnRlbnRNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZDb250ZW50TWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmU21hbGxTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmQmlnU3RlcCkgeworICBQV0xfU0NST0xMX0lORk8gSW5mbzsKKyAgSW5mby5mUGxhdGVXaWR0aCA9IGZQbGF0ZU1heCAtIGZQbGF0ZU1pbjsKKyAgSW5mby5mQ29udGVudE1pbiA9IGZDb250ZW50TWluOworICBJbmZvLmZDb250ZW50TWF4ID0gZkNvbnRlbnRNYXg7CisgIEluZm8uZlNtYWxsU3RlcCA9IGZTbWFsbFN0ZXA7CisgIEluZm8uZkJpZ1N0ZXAgPSBmQmlnU3RlcDsKKyAgbV9wTGlzdC0+U2V0U2Nyb2xsSW5mbyhJbmZvKTsKKworICBDUFdMX1Njcm9sbEJhciogcFNjcm9sbCA9IG1fcExpc3QtPkdldFZTY3JvbGxCYXIoKTsKKyAgaWYgKCFwU2Nyb2xsKQorICAgIHJldHVybjsKKworICBpZiAoSXNGbG9hdEJpZ2dlcihJbmZvLmZQbGF0ZVdpZHRoLCBJbmZvLmZDb250ZW50TWF4IC0gSW5mby5mQ29udGVudE1pbikgfHwKKyAgICAgIElzRmxvYXRFcXVhbChJbmZvLmZQbGF0ZVdpZHRoLCBJbmZvLmZDb250ZW50TWF4IC0gSW5mby5mQ29udGVudE1pbikpIHsKKyAgICBpZiAocFNjcm9sbC0+SXNWaXNpYmxlKCkpIHsKKyAgICAgIHBTY3JvbGwtPlNldFZpc2libGUoZmFsc2UpOworICAgICAgbV9wTGlzdC0+UmVQb3NDaGlsZFduZCgpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIXBTY3JvbGwtPklzVmlzaWJsZSgpKSB7CisgICAgICBwU2Nyb2xsLT5TZXRWaXNpYmxlKHRydWUpOworICAgICAgbV9wTGlzdC0+UmVQb3NDaGlsZFduZCgpOworICAgIH0KKyAgfQorfQorCit2b2lkIENQV0xfTGlzdF9Ob3RpZnk6OklPblNldFNjcm9sbFBvc1koZmxvYXQgZnkpIHsKKyAgbV9wTGlzdC0+U2V0U2Nyb2xsUG9zaXRpb24oZnkpOworfQorCit2b2lkIENQV0xfTGlzdF9Ob3RpZnk6OklPbkludmFsaWRhdGVSZWN0KENGWF9GbG9hdFJlY3QqIHBSZWN0KSB7CisgIG1fcExpc3QtPkludmFsaWRhdGVSZWN0KHBSZWN0KTsKK30KKworQ1BXTF9MaXN0Qm94OjpDUFdMX0xpc3RCb3goKQorICAgIDogbV9wTGlzdChuZXcgQ1BXTF9MaXN0Q3RybCksCisgICAgICBtX2JNb3VzZURvd24oZmFsc2UpLAorICAgICAgbV9iSG92ZXJTZWwoZmFsc2UpLAorICAgICAgbV9wRmlsbGVyTm90aWZ5KG51bGxwdHIpIHt9CisKK0NQV0xfTGlzdEJveDo6fkNQV0xfTGlzdEJveCgpIHt9CisKK0J5dGVTdHJpbmcgQ1BXTF9MaXN0Qm94OjpHZXRDbGFzc05hbWUoKSBjb25zdCB7CisgIHJldHVybiAiQ1BXTF9MaXN0Qm94IjsKK30KKwordm9pZCBDUFdMX0xpc3RCb3g6Ok9uQ3JlYXRlZCgpIHsKKyAgbV9wTGlzdC0+U2V0Rm9udE1hcChHZXRGb250TWFwKCkpOworICBtX3BMaXN0Tm90aWZ5ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQV0xfTGlzdF9Ob3RpZnk+KHRoaXMpOworICBtX3BMaXN0LT5TZXROb3RpZnkobV9wTGlzdE5vdGlmeS5nZXQoKSk7CisKKyAgU2V0SG92ZXJTZWwoSGFzRmxhZyhQTEJTX0hPVkVSU0VMKSk7CisgIG1fcExpc3QtPlNldE11bHRpcGxlU2VsKEhhc0ZsYWcoUExCU19NVUxUSVBMRVNFTCkpOworICBtX3BMaXN0LT5TZXRGb250U2l6ZShHZXRDcmVhdGlvblBhcmFtcygpLmZGb250U2l6ZSk7CisKKyAgbV9iSG92ZXJTZWwgPSBIYXNGbGFnKFBMQlNfSE9WRVJTRUwpOworfQorCit2b2lkIENQV0xfTGlzdEJveDo6T25EZXN0cm95KCkgeworICAvLyBNYWtlIHN1cmUgdGhlIG5vdGlmaWVyIGlzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBhcyB3ZSBhcmUgYWJvdXQgdG8KKyAgLy8gZGVzdHJveSB0aGUgbm90aWZpZXIgYW5kIGRvbid0IHdhbnQgdG8gbGVhdmUgYSBkYW5nbGluZyBwb2ludGVyLgorICBtX3BMaXN0LT5TZXROb3RpZnkobnVsbHB0cik7CisgIG1fcExpc3ROb3RpZnkucmVzZXQoKTsKK30KKwordm9pZCBDUFdMX0xpc3RCb3g6OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtdFVzZXIyRGV2aWNlKSB7CisgIENQV0xfV25kOjpEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSwgbXRVc2VyMkRldmljZSk7CisKKyAgQ0ZYX0Zsb2F0UmVjdCByY1BsYXRlID0gbV9wTGlzdC0+R2V0UGxhdGVSZWN0KCk7CisgIENGWF9GbG9hdFJlY3QgcmNMaXN0ID0gR2V0TGlzdFJlY3QoKTsKKyAgQ0ZYX0Zsb2F0UmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKKworICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gbV9wTGlzdC0+R2V0Q291bnQoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBDRlhfRmxvYXRSZWN0IHJjSXRlbSA9IG1fcExpc3QtPkdldEl0ZW1SZWN0KGkpOworICAgIGlmIChyY0l0ZW0uYm90dG9tID4gcmNQbGF0ZS50b3AgfHwgcmNJdGVtLnRvcCA8IHJjUGxhdGUuYm90dG9tKQorICAgICAgY29udGludWU7CisKKyAgICBDRlhfUG9pbnRGIHB0T2Zmc2V0KHJjSXRlbS5sZWZ0LCAocmNJdGVtLnRvcCArIHJjSXRlbS5ib3R0b20pICogMC41Zik7CisgICAgaWYgKENQV0xfRWRpdEltcGwqIHBFZGl0ID0gbV9wTGlzdC0+R2V0SXRlbUVkaXQoaSkpIHsKKyAgICAgIENGWF9GbG9hdFJlY3QgcmNDb250ZW50ID0gcEVkaXQtPkdldENvbnRlbnRSZWN0KCk7CisgICAgICBpZiAocmNDb250ZW50LldpZHRoKCkgPiByY0NsaWVudC5XaWR0aCgpKQorICAgICAgICByY0l0ZW0uSW50ZXJzZWN0KHJjTGlzdCk7CisgICAgICBlbHNlCisgICAgICAgIHJjSXRlbS5JbnRlcnNlY3QocmNDbGllbnQpOworICAgIH0KKworICAgIGlmIChtX3BMaXN0LT5Jc0l0ZW1TZWxlY3RlZChpKSkgeworICAgICAgQ0ZYX1N5c3RlbUhhbmRsZXIqIHBTeXNIYW5kbGVyID0gR2V0U3lzdGVtSGFuZGxlcigpOworICAgICAgaWYgKHBTeXNIYW5kbGVyICYmIHBTeXNIYW5kbGVyLT5Jc1NlbGVjdGlvbkltcGxlbWVudGVkKCkpIHsKKyAgICAgICAgQ1BXTF9FZGl0SW1wbDo6RHJhd0VkaXQocERldmljZSwgbXRVc2VyMkRldmljZSwgbV9wTGlzdC0+R2V0SXRlbUVkaXQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFRleHRDb2xvcigpLlRvRlhDb2xvcigyNTUpLCByY0xpc3QsIHB0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBwU3lzSGFuZGxlciwgbV9wRm9ybUZpbGxlci5HZXQoKSk7CisgICAgICAgIHBTeXNIYW5kbGVyLT5PdXRwdXRTZWxlY3RlZFJlY3QobV9wRm9ybUZpbGxlci5HZXQoKSwgcmNJdGVtKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBEZXZpY2UtPkRyYXdGaWxsUmVjdCgmbXRVc2VyMkRldmljZSwgcmNJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZSgyNTUsIDAsIDUxLCAxMTMpKTsKKyAgICAgICAgQ1BXTF9FZGl0SW1wbDo6RHJhd0VkaXQocERldmljZSwgbXRVc2VyMkRldmljZSwgbV9wTGlzdC0+R2V0SXRlbUVkaXQoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoMjU1LCAyNTUsIDI1NSwgMjU1KSwgcmNMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdE9mZnNldCwgbnVsbHB0ciwgcFN5c0hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZvcm1GaWxsZXIuR2V0KCkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBDRlhfU3lzdGVtSGFuZGxlciogcFN5c0hhbmRsZXIgPSBHZXRTeXN0ZW1IYW5kbGVyKCk7CisgICAgICBDUFdMX0VkaXRJbXBsOjpEcmF3RWRpdChwRGV2aWNlLCBtdFVzZXIyRGV2aWNlLCBtX3BMaXN0LT5HZXRJdGVtRWRpdChpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFRleHRDb2xvcigpLlRvRlhDb2xvcigyNTUpLCByY0xpc3QsIHB0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgcFN5c0hhbmRsZXIsIG51bGxwdHIpOworICAgIH0KKyAgfQorfQorCitib29sIENQV0xfTGlzdEJveDo6T25LZXlEb3duKHVpbnQxNl90IG5DaGFyLCB1aW50MzJfdCBuRmxhZykgeworICBDUFdMX1duZDo6T25LZXlEb3duKG5DaGFyLCBuRmxhZyk7CisKKyAgc3dpdGNoIChuQ2hhcikgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgY2FzZSBGV0xfVktFWV9VcDoKKyAgICBjYXNlIEZXTF9WS0VZX0Rvd246CisgICAgY2FzZSBGV0xfVktFWV9Ib21lOgorICAgIGNhc2UgRldMX1ZLRVlfTGVmdDoKKyAgICBjYXNlIEZXTF9WS0VZX0VuZDoKKyAgICBjYXNlIEZXTF9WS0VZX1JpZ2h0OgorICAgICAgYnJlYWs7CisgIH0KKworICBzd2l0Y2ggKG5DaGFyKSB7CisgICAgY2FzZSBGV0xfVktFWV9VcDoKKyAgICAgIG1fcExpc3QtPk9uVktfVVAoSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZXTF9WS0VZX0Rvd246CisgICAgICBtX3BMaXN0LT5PblZLX0RPV04oSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZXTF9WS0VZX0hvbWU6CisgICAgICBtX3BMaXN0LT5PblZLX0hPTUUoSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZXTF9WS0VZX0xlZnQ6CisgICAgICBtX3BMaXN0LT5PblZLX0xFRlQoSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZXTF9WS0VZX0VuZDoKKyAgICAgIG1fcExpc3QtPk9uVktfRU5EKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGV0xfVktFWV9SaWdodDoKKyAgICAgIG1fcExpc3QtPk9uVktfUklHSFQoSXNTSElGVHByZXNzZWQobkZsYWcpLCBJc0NUUkxwcmVzc2VkKG5GbGFnKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZXTF9WS0VZX0RlbGV0ZToKKyAgICAgIGJyZWFrOworICB9CisgIE9uTm90aWZ5U2VsZWN0aW9uQ2hhbmdlZCh0cnVlLCBuRmxhZyk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENQV0xfTGlzdEJveDo6T25DaGFyKHVpbnQxNl90IG5DaGFyLCB1aW50MzJfdCBuRmxhZykgeworICBDUFdMX1duZDo6T25DaGFyKG5DaGFyLCBuRmxhZyk7CisKKyAgaWYgKCFtX3BMaXN0LT5PbkNoYXIobkNoYXIsIElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpKQorICAgIHJldHVybiBmYWxzZTsKKworICBPbk5vdGlmeVNlbGVjdGlvbkNoYW5nZWQodHJ1ZSwgbkZsYWcpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDUFdMX0xpc3RCb3g6Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSB7CisgIENQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LCBuRmxhZyk7CisKKyAgaWYgKENsaWVudEhpdFRlc3QocG9pbnQpKSB7CisgICAgbV9iTW91c2VEb3duID0gdHJ1ZTsKKyAgICBTZXRGb2N1cygpOworICAgIFNldENhcHR1cmUoKTsKKworICAgIG1fcExpc3QtPk9uTW91c2VEb3duKHBvaW50LCBJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIENQV0xfTGlzdEJveDo6T25MQnV0dG9uVXAoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSB7CisgIENQV0xfV25kOjpPbkxCdXR0b25VcChwb2ludCwgbkZsYWcpOworCisgIGlmIChtX2JNb3VzZURvd24pIHsKKyAgICBSZWxlYXNlQ2FwdHVyZSgpOworICAgIG1fYk1vdXNlRG93biA9IGZhbHNlOworICB9CisgIE9uTm90aWZ5U2VsZWN0aW9uQ2hhbmdlZChmYWxzZSwgbkZsYWcpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDUFdMX0xpc3RCb3g6OlNldEhvdmVyU2VsKGJvb2wgYkhvdmVyU2VsKSB7CisgIG1fYkhvdmVyU2VsID0gYkhvdmVyU2VsOworfQorCitib29sIENQV0xfTGlzdEJveDo6T25Nb3VzZU1vdmUoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSB7CisgIENQV0xfV25kOjpPbk1vdXNlTW92ZShwb2ludCwgbkZsYWcpOworCisgIGlmIChtX2JIb3ZlclNlbCAmJiAhSXNDYXB0dXJlTW91c2UoKSAmJiBDbGllbnRIaXRUZXN0KHBvaW50KSkKKyAgICBtX3BMaXN0LT5TZWxlY3QobV9wTGlzdC0+R2V0SXRlbUluZGV4KHBvaW50KSk7CisgIGlmIChtX2JNb3VzZURvd24pCisgICAgbV9wTGlzdC0+T25Nb3VzZU1vdmUocG9pbnQsIElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENQV0xfTGlzdEJveDo6U2V0U2Nyb2xsSW5mbyhjb25zdCBQV0xfU0NST0xMX0lORk8mIGluZm8pIHsKKyAgaWYgKENQV0xfV25kKiBwQ2hpbGQgPSBHZXRWU2Nyb2xsQmFyKCkpCisgICAgcENoaWxkLT5TZXRTY3JvbGxJbmZvKGluZm8pOworfQorCit2b2lkIENQV0xfTGlzdEJveDo6U2V0U2Nyb2xsUG9zaXRpb24oZmxvYXQgcG9zKSB7CisgIGlmIChDUFdMX1duZCogcENoaWxkID0gR2V0VlNjcm9sbEJhcigpKQorICAgIHBDaGlsZC0+U2V0U2Nyb2xsUG9zaXRpb24ocG9zKTsKK30KKwordm9pZCBDUFdMX0xpc3RCb3g6OlNjcm9sbFdpbmRvd1ZlcnRpY2FsbHkoZmxvYXQgcG9zKSB7CisgIG1fcExpc3QtPlNldFNjcm9sbFBvcyhDRlhfUG9pbnRGKDAsIHBvcykpOworfQorCit2b2lkIENQV0xfTGlzdEJveDo6S2lsbEZvY3VzKCkgeworICBDUFdMX1duZDo6S2lsbEZvY3VzKCk7Cit9CisKK2Jvb2wgQ1BXTF9MaXN0Qm94OjpSZVBvc0NoaWxkV25kKCkgeworICBpZiAoIUNQV0xfV25kOjpSZVBvc0NoaWxkV25kKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG1fcExpc3QtPlNldFBsYXRlUmVjdChHZXRMaXN0UmVjdCgpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1BXTF9MaXN0Qm94OjpPbk5vdGlmeVNlbGVjdGlvbkNoYW5nZWQoYm9vbCBiS2V5RG93biwgdWludDMyX3QgbkZsYWcpIHsKKyAgaWYgKCFtX3BGaWxsZXJOb3RpZnkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENQV0xfV25kOjpPYnNlcnZlZFB0ciB0aGlzT2JzZXJ2ZWQodGhpcyk7CisKKyAgV2lkZVN0cmluZyBzd0NoYW5nZSA9IEdldFRleHQoKTsKKyAgV2lkZVN0cmluZyBzdHJDaGFuZ2VFeDsKKyAgaW50IG5TZWxTdGFydCA9IDA7CisgIGludCBuU2VsRW5kID0gc3dDaGFuZ2UuR2V0TGVuZ3RoKCk7CisgIGJvb2wgYlJDOworICBib29sIGJFeGl0OworICBzdGQ6OnRpZShiUkMsIGJFeGl0KSA9IG1fcEZpbGxlck5vdGlmeS0+T25CZWZvcmVLZXlTdHJva2UoCisgICAgICBHZXRBdHRhY2hlZERhdGEoKSwgc3dDaGFuZ2UsIHN0ckNoYW5nZUV4LCBuU2VsU3RhcnQsIG5TZWxFbmQsIGJLZXlEb3duLAorICAgICAgbkZsYWcpOworCisgIGlmICghdGhpc09ic2VydmVkKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gYkV4aXQ7Cit9CisKK0NGWF9GbG9hdFJlY3QgQ1BXTF9MaXN0Qm94OjpHZXRGb2N1c1JlY3QoKSBjb25zdCB7CisgIGlmIChtX3BMaXN0LT5Jc011bHRpcGxlU2VsKCkpIHsKKyAgICBDRlhfRmxvYXRSZWN0IHJjQ2FyZXQgPSBtX3BMaXN0LT5HZXRJdGVtUmVjdChtX3BMaXN0LT5HZXRDYXJldCgpKTsKKyAgICByY0NhcmV0LkludGVyc2VjdChHZXRDbGllbnRSZWN0KCkpOworICAgIHJldHVybiByY0NhcmV0OworICB9CisKKyAgcmV0dXJuIENQV0xfV25kOjpHZXRGb2N1c1JlY3QoKTsKK30KKwordm9pZCBDUFdMX0xpc3RCb3g6OkFkZFN0cmluZyhjb25zdCBXaWRlU3RyaW5nJiBzdHIpIHsKKyAgbV9wTGlzdC0+QWRkU3RyaW5nKHN0cik7Cit9CisKK1dpZGVTdHJpbmcgQ1BXTF9MaXN0Qm94OjpHZXRUZXh0KCkgY29uc3QgeworICByZXR1cm4gbV9wTGlzdC0+R2V0VGV4dCgpOworfQorCit2b2lkIENQV0xfTGlzdEJveDo6U2V0Rm9udFNpemUoZmxvYXQgZkZvbnRTaXplKSB7CisgIG1fcExpc3QtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7Cit9CisKK2Zsb2F0IENQV0xfTGlzdEJveDo6R2V0Rm9udFNpemUoKSBjb25zdCB7CisgIHJldHVybiBtX3BMaXN0LT5HZXRGb250U2l6ZSgpOworfQorCit2b2lkIENQV0xfTGlzdEJveDo6U2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCkgeworICBtX3BMaXN0LT5TZWxlY3Qobkl0ZW1JbmRleCk7Cit9CisKK3ZvaWQgQ1BXTF9MaXN0Qm94OjpTZXRDYXJldChpbnQzMl90IG5JdGVtSW5kZXgpIHsKKyAgbV9wTGlzdC0+U2V0Q2FyZXQobkl0ZW1JbmRleCk7Cit9CisKK3ZvaWQgQ1BXTF9MaXN0Qm94OjpTZXRUb3BWaXNpYmxlSW5kZXgoaW50MzJfdCBuSXRlbUluZGV4KSB7CisgIG1fcExpc3QtPlNldFRvcEl0ZW0obkl0ZW1JbmRleCk7Cit9CisKK3ZvaWQgQ1BXTF9MaXN0Qm94OjpTY3JvbGxUb0xpc3RJdGVtKGludDMyX3Qgbkl0ZW1JbmRleCkgeworICBtX3BMaXN0LT5TY3JvbGxUb0xpc3RJdGVtKG5JdGVtSW5kZXgpOworfQorCit2b2lkIENQV0xfTGlzdEJveDo6UmVzZXRDb250ZW50KCkgeworICBtX3BMaXN0LT5FbXB0eSgpOworfQorCit2b2lkIENQV0xfTGlzdEJveDo6UmVzZXQoKSB7CisgIG1fcExpc3QtPkNhbmNlbCgpOworfQorCitib29sIENQV0xfTGlzdEJveDo6SXNNdWx0aXBsZVNlbCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcExpc3QtPklzTXVsdGlwbGVTZWwoKTsKK30KKworaW50MzJfdCBDUFdMX0xpc3RCb3g6OkdldENhcmV0SW5kZXgoKSBjb25zdCB7CisgIHJldHVybiBtX3BMaXN0LT5HZXRDYXJldCgpOworfQorCitpbnQzMl90IENQV0xfTGlzdEJveDo6R2V0Q3VyU2VsKCkgY29uc3QgeworICByZXR1cm4gbV9wTGlzdC0+R2V0U2VsZWN0KCk7Cit9CisKK2Jvb2wgQ1BXTF9MaXN0Qm94OjpJc0l0ZW1TZWxlY3RlZChpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcExpc3QtPklzSXRlbVNlbGVjdGVkKG5JdGVtSW5kZXgpOworfQorCitpbnQzMl90IENQV0xfTGlzdEJveDo6R2V0VG9wVmlzaWJsZUluZGV4KCkgY29uc3QgeworICBtX3BMaXN0LT5TY3JvbGxUb0xpc3RJdGVtKG1fcExpc3QtPkdldEZpcnN0U2VsZWN0ZWQoKSk7CisgIHJldHVybiBtX3BMaXN0LT5HZXRUb3BJdGVtKCk7Cit9CisKK2ludDMyX3QgQ1BXTF9MaXN0Qm94OjpHZXRDb3VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcExpc3QtPkdldENvdW50KCk7Cit9CisKK2ludDMyX3QgQ1BXTF9MaXN0Qm94OjpGaW5kTmV4dChpbnQzMl90IG5JbmRleCwgd2NoYXJfdCBuQ2hhcikgY29uc3QgeworICByZXR1cm4gbV9wTGlzdC0+RmluZE5leHQobkluZGV4LCBuQ2hhcik7Cit9CisKK0NGWF9GbG9hdFJlY3QgQ1BXTF9MaXN0Qm94OjpHZXRDb250ZW50UmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcExpc3QtPkdldENvbnRlbnRSZWN0KCk7Cit9CisKK2Zsb2F0IENQV0xfTGlzdEJveDo6R2V0Rmlyc3RIZWlnaHQoKSBjb25zdCB7CisgIHJldHVybiBtX3BMaXN0LT5HZXRGaXJzdEhlaWdodCgpOworfQorCitDRlhfRmxvYXRSZWN0IENQV0xfTGlzdEJveDo6R2V0TGlzdFJlY3QoKSBjb25zdCB7CisgIGZsb2F0IHdpZHRoID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KEdldEJvcmRlcldpZHRoKCkgKyBHZXRJbm5lckJvcmRlcldpZHRoKCkpOworICByZXR1cm4gR2V0V2luZG93UmVjdCgpLkdldERlZmxhdGVkKHdpZHRoLCB3aWR0aCk7Cit9CisKK2Jvb2wgQ1BXTF9MaXN0Qm94OjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWcpIHsKKyAgaWYgKHpEZWx0YSA8IDApCisgICAgbV9wTGlzdC0+T25WS19ET1dOKElzU0hJRlRwcmVzc2VkKG5GbGFnKSwgSXNDVFJMcHJlc3NlZChuRmxhZykpOworICBlbHNlCisgICAgbV9wTGlzdC0+T25WS19VUChJc1NISUZUcHJlc3NlZChuRmxhZyksIElzQ1RSTHByZXNzZWQobkZsYWcpKTsKKworICBPbk5vdGlmeVNlbGVjdGlvbkNoYW5nZWQoZmFsc2UsIG5GbGFnKTsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3B3bC9jcHdsX2xpc3RfYm94LmggYi9mcGRmc2RrL3B3bC9jcHdsX2xpc3RfYm94LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE3MjVkMQotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvcHdsL2Nwd2xfbGlzdF9ib3guaApAQCAtMCwwICsxLDEwOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZQREZTREtfUFdMX0NQV0xfTElTVF9CT1hfSF8KKyNkZWZpbmUgRlBERlNES19QV0xfQ1BXTF9MSVNUX0JPWF9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfd25kLmgiCisKK2NsYXNzIENQV0xfTGlzdEN0cmw7CitjbGFzcyBDUFdMX0xpc3RfTm90aWZ5OworY2xhc3MgQ1BXTF9MaXN0Qm94OworY2xhc3MgSVBXTF9GaWxsZXJfTm90aWZ5Oworc3RydWN0IENQVlRfV29yZFBsYWNlOworCitjbGFzcyBDUFdMX0xpc3RfTm90aWZ5IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENQV0xfTGlzdF9Ob3RpZnkoQ1BXTF9MaXN0Qm94KiBwTGlzdCk7CisgIH5DUFdMX0xpc3RfTm90aWZ5KCk7CisKKyAgdm9pZCBJT25TZXRTY3JvbGxJbmZvWShmbG9hdCBmUGxhdGVNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZlBsYXRlTWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZDb250ZW50TWluLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZDb250ZW50TWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZTbWFsbFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZkJpZ1N0ZXApOworICB2b2lkIElPblNldFNjcm9sbFBvc1koZmxvYXQgZnkpOworICB2b2lkIElPbkludmFsaWRhdGVSZWN0KENGWF9GbG9hdFJlY3QqIHBSZWN0KTsKKworIHByaXZhdGU6CisgIFVub3duZWRQdHI8Q1BXTF9MaXN0Qm94PiBtX3BMaXN0OworfTsKKworY2xhc3MgQ1BXTF9MaXN0Qm94IDogcHVibGljIENQV0xfV25kIHsKKyBwdWJsaWM6CisgIENQV0xfTGlzdEJveCgpOworICB+Q1BXTF9MaXN0Qm94KCkgb3ZlcnJpZGU7CisKKyAgLy8gQ1BXTF9XbmQKKyAgQnl0ZVN0cmluZyBHZXRDbGFzc05hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBPbkNyZWF0ZWQoKSBvdmVycmlkZTsKKyAgdm9pZCBPbkRlc3Ryb3koKSBvdmVycmlkZTsKKyAgdm9pZCBEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbXRVc2VyMkRldmljZSkgb3ZlcnJpZGU7CisgIGJvb2wgT25LZXlEb3duKHVpbnQxNl90IG5DaGFyLCB1aW50MzJfdCBuRmxhZykgb3ZlcnJpZGU7CisgIGJvb2wgT25DaGFyKHVpbnQxNl90IG5DaGFyLCB1aW50MzJfdCBuRmxhZykgb3ZlcnJpZGU7CisgIGJvb2wgT25MQnV0dG9uRG93bihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOworICBib29sIE9uTEJ1dHRvblVwKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgb3ZlcnJpZGU7CisgIGJvb2wgT25Nb3VzZU1vdmUoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKKyAgYm9vbCBPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOworICB2b2lkIEtpbGxGb2N1cygpIG92ZXJyaWRlOworICB2b2lkIFNldFNjcm9sbEluZm8oY29uc3QgUFdMX1NDUk9MTF9JTkZPJiBpbmZvKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRTY3JvbGxQb3NpdGlvbihmbG9hdCBwb3MpIG92ZXJyaWRlOworICB2b2lkIFNjcm9sbFdpbmRvd1ZlcnRpY2FsbHkoZmxvYXQgcG9zKSBvdmVycmlkZTsKKyAgYm9vbCBSZVBvc0NoaWxkV25kKCkgb3ZlcnJpZGU7CisgIENGWF9GbG9hdFJlY3QgR2V0Rm9jdXNSZWN0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgU2V0Rm9udFNpemUoZmxvYXQgZkZvbnRTaXplKSBvdmVycmlkZTsKKyAgZmxvYXQgR2V0Rm9udFNpemUoKSBjb25zdCBvdmVycmlkZTsKKworICB2aXJ0dWFsIFdpZGVTdHJpbmcgR2V0VGV4dCgpIGNvbnN0OworCisgIGJvb2wgT25Ob3RpZnlTZWxlY3Rpb25DaGFuZ2VkKGJvb2wgYktleURvd24sIHVpbnQzMl90IG5GbGFnKTsKKworICB2b2lkIEFkZFN0cmluZyhjb25zdCBXaWRlU3RyaW5nJiBzdHIpOworICB2b2lkIFNldFRvcFZpc2libGVJbmRleChpbnQzMl90IG5JdGVtSW5kZXgpOworICB2b2lkIFNjcm9sbFRvTGlzdEl0ZW0oaW50MzJfdCBuSXRlbUluZGV4KTsKKyAgdm9pZCBSZXNldENvbnRlbnQoKTsKKyAgdm9pZCBSZXNldCgpOworICB2b2lkIFNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgpOworICB2b2lkIFNldENhcmV0KGludDMyX3Qgbkl0ZW1JbmRleCk7CisgIHZvaWQgU2V0SG92ZXJTZWwoYm9vbCBiSG92ZXJTZWwpOworCisgIGludDMyX3QgR2V0Q291bnQoKSBjb25zdDsKKyAgYm9vbCBJc011bHRpcGxlU2VsKCkgY29uc3Q7CisgIGludDMyX3QgR2V0Q2FyZXRJbmRleCgpIGNvbnN0OworICBpbnQzMl90IEdldEN1clNlbCgpIGNvbnN0OworICBib29sIElzSXRlbVNlbGVjdGVkKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3Q7CisgIGludDMyX3QgR2V0VG9wVmlzaWJsZUluZGV4KCkgY29uc3Q7CisgIGludDMyX3QgRmluZE5leHQoaW50MzJfdCBuSW5kZXgsIHdjaGFyX3QgbkNoYXIpIGNvbnN0OworICBDRlhfRmxvYXRSZWN0IEdldENvbnRlbnRSZWN0KCkgY29uc3Q7CisgIGZsb2F0IEdldEZpcnN0SGVpZ2h0KCkgY29uc3Q7CisgIENGWF9GbG9hdFJlY3QgR2V0TGlzdFJlY3QoKSBjb25zdDsKKworICB2b2lkIFNldEZpbGxlck5vdGlmeShJUFdMX0ZpbGxlcl9Ob3RpZnkqIHBOb3RpZnkpIHsKKyAgICBtX3BGaWxsZXJOb3RpZnkgPSBwTm90aWZ5OworICB9CisKKyAgdm9pZCBBdHRhY2hGRkxEYXRhKENGRkxfRm9ybUZpbGxlciogcERhdGEpIHsgbV9wRm9ybUZpbGxlciA9IHBEYXRhOyB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0ZDo6dW5pcXVlX3B0cjxDUFdMX0xpc3RDdHJsPiBtX3BMaXN0OworICBzdGQ6OnVuaXF1ZV9wdHI8Q1BXTF9MaXN0X05vdGlmeT4gbV9wTGlzdE5vdGlmeTsKKyAgYm9vbCBtX2JNb3VzZURvd247CisgIGJvb2wgbV9iSG92ZXJTZWw7CisgIFVub3duZWRQdHI8SVBXTF9GaWxsZXJfTm90aWZ5PiBtX3BGaWxsZXJOb3RpZnk7CisKKyBwcml2YXRlOgorICBVbm93bmVkUHRyPENGRkxfRm9ybUZpbGxlcj4gbV9wRm9ybUZpbGxlcjsKK307CisKKyNlbmRpZiAgLy8gRlBERlNES19QV0xfQ1BXTF9MSVNUX0JPWF9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9wd2wvY3B3bF9saXN0X2ltcGwuY3BwIGIvZnBkZnNkay9wd2wvY3B3bF9saXN0X2ltcGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNDU1ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL3B3bC9jcHdsX2xpc3RfaW1wbC5jcHAKQEAgLTAsMCArMSw2MzcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfbGlzdF9pbXBsLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcHZ0X3dvcmQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfZWRpdF9pbXBsLmgiCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF9saXN0X2JveC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKKworQ1BXTF9MaXN0Q3RybDo6SXRlbTo6SXRlbSgpCisgICAgOiBtX3BFZGl0KG5ldyBDUFdMX0VkaXRJbXBsKSwKKyAgICAgIG1fYlNlbGVjdGVkKGZhbHNlKSwKKyAgICAgIG1fcmNMaXN0SXRlbSgwLjBmLCAwLjBmLCAwLjBmLCAwLjBmKSB7CisgIG1fcEVkaXQtPlNldEFsaWdubWVudFYoMSwgdHJ1ZSk7CisgIG1fcEVkaXQtPkluaXRpYWxpemUoKTsKK30KKworQ1BXTF9MaXN0Q3RybDo6SXRlbTo6fkl0ZW0oKSB7fQorCit2b2lkIENQV0xfTGlzdEN0cmw6Okl0ZW06OlNldEZvbnRNYXAoSVBWVF9Gb250TWFwKiBwRm9udE1hcCkgeworICBtX3BFZGl0LT5TZXRGb250TWFwKHBGb250TWFwKTsKK30KKwordm9pZCBDUFdMX0xpc3RDdHJsOjpJdGVtOjpTZXRUZXh0KGNvbnN0IFdpZGVTdHJpbmcmIHRleHQpIHsKKyAgbV9wRWRpdC0+U2V0VGV4dCh0ZXh0KTsKK30KKwordm9pZCBDUFdMX0xpc3RDdHJsOjpJdGVtOjpTZXRGb250U2l6ZShmbG9hdCBmRm9udFNpemUpIHsKKyAgbV9wRWRpdC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKK30KKworZmxvYXQgQ1BXTF9MaXN0Q3RybDo6SXRlbTo6R2V0SXRlbUhlaWdodCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEVkaXQtPkdldENvbnRlbnRSZWN0KCkuSGVpZ2h0KCk7Cit9CisKK3VpbnQxNl90IENQV0xfTGlzdEN0cmw6Okl0ZW06OkdldEZpcnN0Q2hhcigpIGNvbnN0IHsKKyAgQ1BWVF9Xb3JkIHdvcmQ7CisgIENQV0xfRWRpdEltcGxfSXRlcmF0b3IqIHBJdGVyYXRvciA9IG1fcEVkaXQtPkdldEl0ZXJhdG9yKCk7CisgIHBJdGVyYXRvci0+U2V0QXQoMSk7CisgIHBJdGVyYXRvci0+R2V0V29yZCh3b3JkKTsKKyAgcmV0dXJuIHdvcmQuV29yZDsKK30KKworV2lkZVN0cmluZyBDUFdMX0xpc3RDdHJsOjpJdGVtOjpHZXRUZXh0KCkgY29uc3QgeworICByZXR1cm4gbV9wRWRpdC0+R2V0VGV4dCgpOworfQorCitDUExTVF9TZWxlY3Q6OkNQTFNUX1NlbGVjdCgpIHt9CisKK0NQTFNUX1NlbGVjdDo6fkNQTFNUX1NlbGVjdCgpIHt9CisKK3ZvaWQgQ1BMU1RfU2VsZWN0OjpBZGQoaW50MzJfdCBuSXRlbUluZGV4KSB7CisgIG1fSXRlbXNbbkl0ZW1JbmRleF0gPSBTRUxFQ1RJTkc7Cit9CisKK3ZvaWQgQ1BMU1RfU2VsZWN0OjpBZGQoaW50MzJfdCBuQmVnaW5JbmRleCwgaW50MzJfdCBuRW5kSW5kZXgpIHsKKyAgaWYgKG5CZWdpbkluZGV4ID4gbkVuZEluZGV4KQorICAgIHN0ZDo6c3dhcChuQmVnaW5JbmRleCwgbkVuZEluZGV4KTsKKworICBmb3IgKGludDMyX3QgaSA9IG5CZWdpbkluZGV4OyBpIDw9IG5FbmRJbmRleDsgKytpKQorICAgIEFkZChpKTsKK30KKwordm9pZCBDUExTVF9TZWxlY3Q6OlN1YihpbnQzMl90IG5JdGVtSW5kZXgpIHsKKyAgYXV0byBpdCA9IG1fSXRlbXMuZmluZChuSXRlbUluZGV4KTsKKyAgaWYgKGl0ICE9IG1fSXRlbXMuZW5kKCkpCisgICAgaXQtPnNlY29uZCA9IERFU0VMRUNUSU5HOworfQorCit2b2lkIENQTFNUX1NlbGVjdDo6U3ViKGludDMyX3QgbkJlZ2luSW5kZXgsIGludDMyX3QgbkVuZEluZGV4KSB7CisgIGlmIChuQmVnaW5JbmRleCA+IG5FbmRJbmRleCkKKyAgICBzdGQ6OnN3YXAobkJlZ2luSW5kZXgsIG5FbmRJbmRleCk7CisKKyAgZm9yIChpbnQzMl90IGkgPSBuQmVnaW5JbmRleDsgaSA8PSBuRW5kSW5kZXg7ICsraSkKKyAgICBTdWIoaSk7Cit9CisKK3ZvaWQgQ1BMU1RfU2VsZWN0OjpEZXNlbGVjdEFsbCgpIHsKKyAgZm9yIChhdXRvJiBpdGVtIDogbV9JdGVtcykKKyAgICBpdGVtLnNlY29uZCA9IERFU0VMRUNUSU5HOworfQorCit2b2lkIENQTFNUX1NlbGVjdDo6RG9uZSgpIHsKKyAgYXV0byBpdCA9IG1fSXRlbXMuYmVnaW4oKTsKKyAgd2hpbGUgKGl0ICE9IG1fSXRlbXMuZW5kKCkpIHsKKyAgICBpZiAoaXQtPnNlY29uZCA9PSBERVNFTEVDVElORykKKyAgICAgIGl0ID0gbV9JdGVtcy5lcmFzZShpdCk7CisgICAgZWxzZQorICAgICAgKGl0KyspLT5zZWNvbmQgPSBOT1JNQUw7CisgIH0KK30KKworQ1BXTF9MaXN0Q3RybDo6Q1BXTF9MaXN0Q3RybCgpCisgICAgOiBtX3BOb3RpZnkobnVsbHB0ciksCisgICAgICBtX2JOb3RpZnlGbGFnKGZhbHNlKSwKKyAgICAgIG1fblNlbEl0ZW0oLTEpLAorICAgICAgbV9uRm9vdEluZGV4KC0xKSwKKyAgICAgIG1fYkN0cmxTZWwoZmFsc2UpLAorICAgICAgbV9uQ2FyZXRJbmRleCgtMSksCisgICAgICBtX2ZGb250U2l6ZSgwLjBmKSwKKyAgICAgIG1fcEZvbnRNYXAobnVsbHB0ciksCisgICAgICBtX2JNdWx0aXBsZShmYWxzZSkge30KKworQ1BXTF9MaXN0Q3RybDo6fkNQV0xfTGlzdEN0cmwoKSB7CisgIEVtcHR5KCk7Cit9CisKK0NGWF9Qb2ludEYgQ1BXTF9MaXN0Q3RybDo6SW5Ub091dChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3QgeworICBDRlhfRmxvYXRSZWN0IHJjUGxhdGUgPSBtX3JjUGxhdGU7CisgIHJldHVybiBDRlhfUG9pbnRGKHBvaW50LnggLSAobV9wdFNjcm9sbFBvcy54IC0gcmNQbGF0ZS5sZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgcG9pbnQueSAtIChtX3B0U2Nyb2xsUG9zLnkgLSByY1BsYXRlLnRvcCkpOworfQorCitDRlhfUG9pbnRGIENQV0xfTGlzdEN0cmw6Ok91dFRvSW4oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIGNvbnN0IHsKKyAgQ0ZYX0Zsb2F0UmVjdCByY1BsYXRlID0gbV9yY1BsYXRlOworICByZXR1cm4gQ0ZYX1BvaW50Rihwb2ludC54ICsgKG1fcHRTY3JvbGxQb3MueCAtIHJjUGxhdGUubGVmdCksCisgICAgICAgICAgICAgICAgICAgIHBvaW50LnkgKyAobV9wdFNjcm9sbFBvcy55IC0gcmNQbGF0ZS50b3ApKTsKK30KKworQ0ZYX0Zsb2F0UmVjdCBDUFdMX0xpc3RDdHJsOjpJblRvT3V0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0IHsKKyAgQ0ZYX1BvaW50RiBwdExlZnRCb3R0b20gPSBJblRvT3V0KENGWF9Qb2ludEYocmVjdC5sZWZ0LCByZWN0LmJvdHRvbSkpOworICBDRlhfUG9pbnRGIHB0UmlnaHRUb3AgPSBJblRvT3V0KENGWF9Qb2ludEYocmVjdC5yaWdodCwgcmVjdC50b3ApKTsKKyAgcmV0dXJuIENGWF9GbG9hdFJlY3QocHRMZWZ0Qm90dG9tLngsIHB0TGVmdEJvdHRvbS55LCBwdFJpZ2h0VG9wLngsCisgICAgICAgICAgICAgICAgICAgICAgIHB0UmlnaHRUb3AueSk7Cit9CisKK0NGWF9GbG9hdFJlY3QgQ1BXTF9MaXN0Q3RybDo6T3V0VG9Jbihjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdCB7CisgIENGWF9Qb2ludEYgcHRMZWZ0Qm90dG9tID0gT3V0VG9JbihDRlhfUG9pbnRGKHJlY3QubGVmdCwgcmVjdC5ib3R0b20pKTsKKyAgQ0ZYX1BvaW50RiBwdFJpZ2h0VG9wID0gT3V0VG9JbihDRlhfUG9pbnRGKHJlY3QucmlnaHQsIHJlY3QudG9wKSk7CisgIHJldHVybiBDRlhfRmxvYXRSZWN0KHB0TGVmdEJvdHRvbS54LCBwdExlZnRCb3R0b20ueSwgcHRSaWdodFRvcC54LAorICAgICAgICAgICAgICAgICAgICAgICBwdFJpZ2h0VG9wLnkpOworfQorCitDRlhfUG9pbnRGIENQV0xfTGlzdEN0cmw6OklubmVyVG9PdXRlcihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3QgeworICByZXR1cm4gQ0ZYX1BvaW50Rihwb2ludC54ICsgR2V0QlRQb2ludCgpLngsIEdldEJUUG9pbnQoKS55IC0gcG9pbnQueSk7Cit9CisKK0NGWF9Qb2ludEYgQ1BXTF9MaXN0Q3RybDo6T3V0ZXJUb0lubmVyKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBjb25zdCB7CisgIHJldHVybiBDRlhfUG9pbnRGKHBvaW50LnggLSBHZXRCVFBvaW50KCkueCwgR2V0QlRQb2ludCgpLnkgLSBwb2ludC55KTsKK30KKworQ0ZYX0Zsb2F0UmVjdCBDUFdMX0xpc3RDdHJsOjpJbm5lclRvT3V0ZXIoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3QgeworICBDRlhfUG9pbnRGIHB0TGVmdFRvcCA9IElubmVyVG9PdXRlcihDRlhfUG9pbnRGKHJlY3QubGVmdCwgcmVjdC50b3ApKTsKKyAgQ0ZYX1BvaW50RiBwdFJpZ2h0Qm90dG9tID0gSW5uZXJUb091dGVyKENGWF9Qb2ludEYocmVjdC5yaWdodCwgcmVjdC5ib3R0b20pKTsKKyAgcmV0dXJuIENGWF9GbG9hdFJlY3QocHRMZWZ0VG9wLngsIHB0UmlnaHRCb3R0b20ueSwgcHRSaWdodEJvdHRvbS54LAorICAgICAgICAgICAgICAgICAgICAgICBwdExlZnRUb3AueSk7Cit9CisKK0NGWF9GbG9hdFJlY3QgQ1BXTF9MaXN0Q3RybDo6T3V0ZXJUb0lubmVyKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0IHsKKyAgQ0ZYX1BvaW50RiBwdExlZnRUb3AgPSBPdXRlclRvSW5uZXIoQ0ZYX1BvaW50RihyZWN0LmxlZnQsIHJlY3QudG9wKSk7CisgIENGWF9Qb2ludEYgcHRSaWdodEJvdHRvbSA9IE91dGVyVG9Jbm5lcihDRlhfUG9pbnRGKHJlY3QucmlnaHQsIHJlY3QuYm90dG9tKSk7CisgIHJldHVybiBDRlhfRmxvYXRSZWN0KHB0TGVmdFRvcC54LCBwdFJpZ2h0Qm90dG9tLnksIHB0UmlnaHRCb3R0b20ueCwKKyAgICAgICAgICAgICAgICAgICAgICAgcHRMZWZ0VG9wLnkpOworfQorCit2b2lkIENQV0xfTGlzdEN0cmw6Ok9uTW91c2VEb3duKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ3RybCkgeworICBpbnQzMl90IG5IaXRJbmRleCA9IEdldEl0ZW1JbmRleChwb2ludCk7CisKKyAgaWYgKElzTXVsdGlwbGVTZWwoKSkgeworICAgIGlmIChiQ3RybCkgeworICAgICAgaWYgKElzSXRlbVNlbGVjdGVkKG5IaXRJbmRleCkpIHsKKyAgICAgICAgbV9hU2VsSXRlbXMuU3ViKG5IaXRJbmRleCk7CisgICAgICAgIFNlbGVjdEl0ZW1zKCk7CisgICAgICAgIG1fYkN0cmxTZWwgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fYVNlbEl0ZW1zLkFkZChuSGl0SW5kZXgpOworICAgICAgICBTZWxlY3RJdGVtcygpOworICAgICAgICBtX2JDdHJsU2VsID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgbV9uRm9vdEluZGV4ID0gbkhpdEluZGV4OworICAgIH0gZWxzZSBpZiAoYlNoaWZ0KSB7CisgICAgICBtX2FTZWxJdGVtcy5EZXNlbGVjdEFsbCgpOworICAgICAgbV9hU2VsSXRlbXMuQWRkKG1fbkZvb3RJbmRleCwgbkhpdEluZGV4KTsKKyAgICAgIFNlbGVjdEl0ZW1zKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fYVNlbEl0ZW1zLkRlc2VsZWN0QWxsKCk7CisgICAgICBtX2FTZWxJdGVtcy5BZGQobkhpdEluZGV4KTsKKyAgICAgIFNlbGVjdEl0ZW1zKCk7CisKKyAgICAgIG1fbkZvb3RJbmRleCA9IG5IaXRJbmRleDsKKyAgICB9CisKKyAgICBTZXRDYXJldChuSGl0SW5kZXgpOworICB9IGVsc2UgeworICAgIFNldFNpbmdsZVNlbGVjdChuSGl0SW5kZXgpOworICB9CisKKyAgaWYgKCFJc0l0ZW1WaXNpYmxlKG5IaXRJbmRleCkpCisgICAgU2Nyb2xsVG9MaXN0SXRlbShuSGl0SW5kZXgpOworfQorCit2b2lkIENQV0xfTGlzdEN0cmw6Ok9uTW91c2VNb3ZlKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ3RybCkgeworICBpbnQzMl90IG5IaXRJbmRleCA9IEdldEl0ZW1JbmRleChwb2ludCk7CisKKyAgaWYgKElzTXVsdGlwbGVTZWwoKSkgeworICAgIGlmIChiQ3RybCkgeworICAgICAgaWYgKG1fYkN0cmxTZWwpCisgICAgICAgIG1fYVNlbEl0ZW1zLkFkZChtX25Gb290SW5kZXgsIG5IaXRJbmRleCk7CisgICAgICBlbHNlCisgICAgICAgIG1fYVNlbEl0ZW1zLlN1YihtX25Gb290SW5kZXgsIG5IaXRJbmRleCk7CisKKyAgICAgIFNlbGVjdEl0ZW1zKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1fYVNlbEl0ZW1zLkRlc2VsZWN0QWxsKCk7CisgICAgICBtX2FTZWxJdGVtcy5BZGQobV9uRm9vdEluZGV4LCBuSGl0SW5kZXgpOworICAgICAgU2VsZWN0SXRlbXMoKTsKKyAgICB9CisKKyAgICBTZXRDYXJldChuSGl0SW5kZXgpOworICB9IGVsc2UgeworICAgIFNldFNpbmdsZVNlbGVjdChuSGl0SW5kZXgpOworICB9CisKKyAgaWYgKCFJc0l0ZW1WaXNpYmxlKG5IaXRJbmRleCkpCisgICAgU2Nyb2xsVG9MaXN0SXRlbShuSGl0SW5kZXgpOworfQorCit2b2lkIENQV0xfTGlzdEN0cmw6Ok9uVksoaW50MzJfdCBuSXRlbUluZGV4LCBib29sIGJTaGlmdCwgYm9vbCBiQ3RybCkgeworICBpZiAoSXNNdWx0aXBsZVNlbCgpKSB7CisgICAgaWYgKG5JdGVtSW5kZXggPj0gMCAmJiBuSXRlbUluZGV4IDwgR2V0Q291bnQoKSkgeworICAgICAgaWYgKGJDdHJsKSB7CisgICAgICB9IGVsc2UgaWYgKGJTaGlmdCkgeworICAgICAgICBtX2FTZWxJdGVtcy5EZXNlbGVjdEFsbCgpOworICAgICAgICBtX2FTZWxJdGVtcy5BZGQobV9uRm9vdEluZGV4LCBuSXRlbUluZGV4KTsKKyAgICAgICAgU2VsZWN0SXRlbXMoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fYVNlbEl0ZW1zLkRlc2VsZWN0QWxsKCk7CisgICAgICAgIG1fYVNlbEl0ZW1zLkFkZChuSXRlbUluZGV4KTsKKyAgICAgICAgU2VsZWN0SXRlbXMoKTsKKyAgICAgICAgbV9uRm9vdEluZGV4ID0gbkl0ZW1JbmRleDsKKyAgICAgIH0KKworICAgICAgU2V0Q2FyZXQobkl0ZW1JbmRleCk7CisgICAgfQorICB9IGVsc2UgeworICAgIFNldFNpbmdsZVNlbGVjdChuSXRlbUluZGV4KTsKKyAgfQorCisgIGlmICghSXNJdGVtVmlzaWJsZShuSXRlbUluZGV4KSkKKyAgICBTY3JvbGxUb0xpc3RJdGVtKG5JdGVtSW5kZXgpOworfQorCit2b2lkIENQV0xfTGlzdEN0cmw6Ok9uVktfVVAoYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpIHsKKyAgT25WSyhJc011bHRpcGxlU2VsKCkgPyBHZXRDYXJldCgpIC0gMSA6IEdldFNlbGVjdCgpIC0gMSwgYlNoaWZ0LCBiQ3RybCk7Cit9CisKK3ZvaWQgQ1BXTF9MaXN0Q3RybDo6T25WS19ET1dOKGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKSB7CisgIE9uVksoSXNNdWx0aXBsZVNlbCgpID8gR2V0Q2FyZXQoKSArIDEgOiBHZXRTZWxlY3QoKSArIDEsIGJTaGlmdCwgYkN0cmwpOworfQorCit2b2lkIENQV0xfTGlzdEN0cmw6Ok9uVktfTEVGVChib29sIGJTaGlmdCwgYm9vbCBiQ3RybCkgeworICBPblZLKDAsIGJTaGlmdCwgYkN0cmwpOworfQorCit2b2lkIENQV0xfTGlzdEN0cmw6Ok9uVktfUklHSFQoYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpIHsKKyAgT25WSyhHZXRDb3VudCgpIC0gMSwgYlNoaWZ0LCBiQ3RybCk7Cit9CisKK3ZvaWQgQ1BXTF9MaXN0Q3RybDo6T25WS19IT01FKGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKSB7CisgIE9uVksoMCwgYlNoaWZ0LCBiQ3RybCk7Cit9CisKK3ZvaWQgQ1BXTF9MaXN0Q3RybDo6T25WS19FTkQoYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpIHsKKyAgT25WSyhHZXRDb3VudCgpIC0gMSwgYlNoaWZ0LCBiQ3RybCk7Cit9CisKK2Jvb2wgQ1BXTF9MaXN0Q3RybDo6T25DaGFyKHVpbnQxNl90IG5DaGFyLCBib29sIGJTaGlmdCwgYm9vbCBiQ3RybCkgeworICBpbnQzMl90IG5JbmRleCA9IEdldExhc3RTZWxlY3RlZCgpOworICBpbnQzMl90IG5GaW5kSW5kZXggPSBGaW5kTmV4dChuSW5kZXgsIG5DaGFyKTsKKworICBpZiAobkZpbmRJbmRleCAhPSBuSW5kZXgpIHsKKyAgICBPblZLKG5GaW5kSW5kZXgsIGJTaGlmdCwgYkN0cmwpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBDUFdMX0xpc3RDdHJsOjpTZXRQbGF0ZVJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgeworICBtX3JjUGxhdGUgPSByZWN0OworICBtX3B0U2Nyb2xsUG9zLnggPSByZWN0LmxlZnQ7CisgIFNldFNjcm9sbFBvcyhDRlhfUG9pbnRGKHJlY3QubGVmdCwgcmVjdC50b3ApKTsKKyAgUmVBcnJhbmdlKDApOworICBJbnZhbGlkYXRlSXRlbSgtMSk7Cit9CisKK0NGWF9GbG9hdFJlY3QgQ1BXTF9MaXN0Q3RybDo6R2V0SXRlbVJlY3QoaW50MzJfdCBuSW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIEluVG9PdXQoR2V0SXRlbVJlY3RJbnRlcm5hbChuSW5kZXgpKTsKK30KKworQ0ZYX0Zsb2F0UmVjdCBDUFdMX0xpc3RDdHJsOjpHZXRJdGVtUmVjdEludGVybmFsKGludDMyX3QgbkluZGV4KSBjb25zdCB7CisgIGlmICghcGRmaXVtOjpJbmRleEluQm91bmRzKG1fTGlzdEl0ZW1zLCBuSW5kZXgpIHx8ICFtX0xpc3RJdGVtc1tuSW5kZXhdKQorICAgIHJldHVybiBDRlhfRmxvYXRSZWN0KCk7CisKKyAgQ0ZYX0Zsb2F0UmVjdCByY0l0ZW0gPSBtX0xpc3RJdGVtc1tuSW5kZXhdLT5HZXRSZWN0KCk7CisgIHJjSXRlbS5sZWZ0ID0gMC4wZjsKKyAgcmNJdGVtLnJpZ2h0ID0gbV9yY1BsYXRlLldpZHRoKCk7CisgIHJldHVybiBJbm5lclRvT3V0ZXIocmNJdGVtKTsKK30KKwordm9pZCBDUFdMX0xpc3RDdHJsOjpBZGRTdHJpbmcoY29uc3QgV2lkZVN0cmluZyYgc3RyKSB7CisgIEFkZEl0ZW0oc3RyKTsKKyAgUmVBcnJhbmdlKEdldENvdW50KCkgLSAxKTsKK30KKwordm9pZCBDUFdMX0xpc3RDdHJsOjpTZXRNdWx0aXBsZVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgsIGJvb2wgYlNlbGVjdGVkKSB7CisgIGlmICghSXNWYWxpZChuSXRlbUluZGV4KSkKKyAgICByZXR1cm47CisKKyAgaWYgKGJTZWxlY3RlZCAhPSBJc0l0ZW1TZWxlY3RlZChuSXRlbUluZGV4KSkgeworICAgIGlmIChiU2VsZWN0ZWQpIHsKKyAgICAgIFNldEl0ZW1TZWxlY3Qobkl0ZW1JbmRleCwgdHJ1ZSk7CisgICAgICBJbnZhbGlkYXRlSXRlbShuSXRlbUluZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgU2V0SXRlbVNlbGVjdChuSXRlbUluZGV4LCBmYWxzZSk7CisgICAgICBJbnZhbGlkYXRlSXRlbShuSXRlbUluZGV4KTsKKyAgICB9CisgIH0KK30KKwordm9pZCBDUFdMX0xpc3RDdHJsOjpTZXRTaW5nbGVTZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4KSB7CisgIGlmICghSXNWYWxpZChuSXRlbUluZGV4KSkKKyAgICByZXR1cm47CisKKyAgaWYgKG1fblNlbEl0ZW0gIT0gbkl0ZW1JbmRleCkgeworICAgIGlmIChtX25TZWxJdGVtID49IDApIHsKKyAgICAgIFNldEl0ZW1TZWxlY3QobV9uU2VsSXRlbSwgZmFsc2UpOworICAgICAgSW52YWxpZGF0ZUl0ZW0obV9uU2VsSXRlbSk7CisgICAgfQorCisgICAgU2V0SXRlbVNlbGVjdChuSXRlbUluZGV4LCB0cnVlKTsKKyAgICBJbnZhbGlkYXRlSXRlbShuSXRlbUluZGV4KTsKKyAgICBtX25TZWxJdGVtID0gbkl0ZW1JbmRleDsKKyAgfQorfQorCit2b2lkIENQV0xfTGlzdEN0cmw6OlNldENhcmV0KGludDMyX3Qgbkl0ZW1JbmRleCkgeworICBpZiAoIUlzVmFsaWQobkl0ZW1JbmRleCkpCisgICAgcmV0dXJuOworCisgIGlmIChJc011bHRpcGxlU2VsKCkpIHsKKyAgICBpbnQzMl90IG5PbGRJbmRleCA9IG1fbkNhcmV0SW5kZXg7CisKKyAgICBpZiAobk9sZEluZGV4ICE9IG5JdGVtSW5kZXgpIHsKKyAgICAgIG1fbkNhcmV0SW5kZXggPSBuSXRlbUluZGV4OworICAgICAgSW52YWxpZGF0ZUl0ZW0obk9sZEluZGV4KTsKKyAgICAgIEludmFsaWRhdGVJdGVtKG5JdGVtSW5kZXgpOworICAgIH0KKyAgfQorfQorCit2b2lkIENQV0xfTGlzdEN0cmw6OkludmFsaWRhdGVJdGVtKGludDMyX3Qgbkl0ZW1JbmRleCkgeworICBpZiAobV9wTm90aWZ5KSB7CisgICAgaWYgKG5JdGVtSW5kZXggPT0gLTEpIHsKKyAgICAgIGlmICghbV9iTm90aWZ5RmxhZykgeworICAgICAgICBtX2JOb3RpZnlGbGFnID0gdHJ1ZTsKKyAgICAgICAgQ0ZYX0Zsb2F0UmVjdCByY1JlZnJlc2ggPSBtX3JjUGxhdGU7CisgICAgICAgIG1fcE5vdGlmeS0+SU9uSW52YWxpZGF0ZVJlY3QoJnJjUmVmcmVzaCk7CisgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFtX2JOb3RpZnlGbGFnKSB7CisgICAgICAgIG1fYk5vdGlmeUZsYWcgPSB0cnVlOworICAgICAgICBDRlhfRmxvYXRSZWN0IHJjUmVmcmVzaCA9IEdldEl0ZW1SZWN0KG5JdGVtSW5kZXgpOworICAgICAgICByY1JlZnJlc2gubGVmdCAtPSAxLjBmOworICAgICAgICByY1JlZnJlc2gucmlnaHQgKz0gMS4wZjsKKyAgICAgICAgcmNSZWZyZXNoLmJvdHRvbSAtPSAxLjBmOworICAgICAgICByY1JlZnJlc2gudG9wICs9IDEuMGY7CisKKyAgICAgICAgbV9wTm90aWZ5LT5JT25JbnZhbGlkYXRlUmVjdCgmcmNSZWZyZXNoKTsKKyAgICAgICAgbV9iTm90aWZ5RmxhZyA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIENQV0xfTGlzdEN0cmw6OlNlbGVjdEl0ZW1zKCkgeworICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiBtX2FTZWxJdGVtcykgeworICAgIGlmIChpdGVtLnNlY29uZCAhPSBDUExTVF9TZWxlY3Q6Ok5PUk1BTCkKKyAgICAgIFNldE11bHRpcGxlU2VsZWN0KGl0ZW0uZmlyc3QsIGl0ZW0uc2Vjb25kID09IENQTFNUX1NlbGVjdDo6U0VMRUNUSU5HKTsKKyAgfQorICBtX2FTZWxJdGVtcy5Eb25lKCk7Cit9CisKK3ZvaWQgQ1BXTF9MaXN0Q3RybDo6U2VsZWN0KGludDMyX3Qgbkl0ZW1JbmRleCkgeworICBpZiAoIUlzVmFsaWQobkl0ZW1JbmRleCkpCisgICAgcmV0dXJuOworCisgIGlmIChJc011bHRpcGxlU2VsKCkpIHsKKyAgICBtX2FTZWxJdGVtcy5BZGQobkl0ZW1JbmRleCk7CisgICAgU2VsZWN0SXRlbXMoKTsKKyAgfSBlbHNlIHsKKyAgICBTZXRTaW5nbGVTZWxlY3Qobkl0ZW1JbmRleCk7CisgIH0KK30KKworYm9vbCBDUFdMX0xpc3RDdHJsOjpJc0l0ZW1WaXNpYmxlKGludDMyX3Qgbkl0ZW1JbmRleCkgY29uc3QgeworICBDRlhfRmxvYXRSZWN0IHJjUGxhdGUgPSBtX3JjUGxhdGU7CisgIENGWF9GbG9hdFJlY3QgcmNJdGVtID0gR2V0SXRlbVJlY3Qobkl0ZW1JbmRleCk7CisKKyAgcmV0dXJuIHJjSXRlbS5ib3R0b20gPj0gcmNQbGF0ZS5ib3R0b20gJiYgcmNJdGVtLnRvcCA8PSByY1BsYXRlLnRvcDsKK30KKwordm9pZCBDUFdMX0xpc3RDdHJsOjpTY3JvbGxUb0xpc3RJdGVtKGludDMyX3Qgbkl0ZW1JbmRleCkgeworICBpZiAoIUlzVmFsaWQobkl0ZW1JbmRleCkpCisgICAgcmV0dXJuOworCisgIENGWF9GbG9hdFJlY3QgcmNQbGF0ZSA9IG1fcmNQbGF0ZTsKKyAgQ0ZYX0Zsb2F0UmVjdCByY0l0ZW0gPSBHZXRJdGVtUmVjdEludGVybmFsKG5JdGVtSW5kZXgpOworICBDRlhfRmxvYXRSZWN0IHJjSXRlbUN0cmwgPSBHZXRJdGVtUmVjdChuSXRlbUluZGV4KTsKKworICBpZiAoSXNGbG9hdFNtYWxsZXIocmNJdGVtQ3RybC5ib3R0b20sIHJjUGxhdGUuYm90dG9tKSkgeworICAgIGlmIChJc0Zsb2F0U21hbGxlcihyY0l0ZW1DdHJsLnRvcCwgcmNQbGF0ZS50b3ApKSB7CisgICAgICBTZXRTY3JvbGxQb3NZKHJjSXRlbS5ib3R0b20gKyByY1BsYXRlLkhlaWdodCgpKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoSXNGbG9hdEJpZ2dlcihyY0l0ZW1DdHJsLnRvcCwgcmNQbGF0ZS50b3ApKSB7CisgICAgaWYgKElzRmxvYXRCaWdnZXIocmNJdGVtQ3RybC5ib3R0b20sIHJjUGxhdGUuYm90dG9tKSkgeworICAgICAgU2V0U2Nyb2xsUG9zWShyY0l0ZW0udG9wKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBDUFdMX0xpc3RDdHJsOjpTZXRTY3JvbGxJbmZvKCkgeworICBpZiAobV9wTm90aWZ5KSB7CisgICAgQ0ZYX0Zsb2F0UmVjdCByY1BsYXRlID0gbV9yY1BsYXRlOworICAgIENGWF9GbG9hdFJlY3QgcmNDb250ZW50ID0gR2V0Q29udGVudFJlY3RJbnRlcm5hbCgpOworCisgICAgaWYgKCFtX2JOb3RpZnlGbGFnKSB7CisgICAgICBtX2JOb3RpZnlGbGFnID0gdHJ1ZTsKKyAgICAgIG1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsSW5mb1kocmNQbGF0ZS5ib3R0b20sIHJjUGxhdGUudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NvbnRlbnQuYm90dG9tLCByY0NvbnRlbnQudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRGaXJzdEhlaWdodCgpLCByY1BsYXRlLkhlaWdodCgpKTsKKyAgICAgIG1fYk5vdGlmeUZsYWcgPSBmYWxzZTsKKyAgICB9CisgIH0KK30KKwordm9pZCBDUFdMX0xpc3RDdHJsOjpTZXRTY3JvbGxQb3MoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKKyAgU2V0U2Nyb2xsUG9zWShwb2ludC55KTsKK30KKwordm9pZCBDUFdMX0xpc3RDdHJsOjpTZXRTY3JvbGxQb3NZKGZsb2F0IGZ5KSB7CisgIGlmICghSXNGbG9hdEVxdWFsKG1fcHRTY3JvbGxQb3MueSwgZnkpKSB7CisgICAgQ0ZYX0Zsb2F0UmVjdCByY1BsYXRlID0gbV9yY1BsYXRlOworICAgIENGWF9GbG9hdFJlY3QgcmNDb250ZW50ID0gR2V0Q29udGVudFJlY3RJbnRlcm5hbCgpOworCisgICAgaWYgKHJjUGxhdGUuSGVpZ2h0KCkgPiByY0NvbnRlbnQuSGVpZ2h0KCkpIHsKKyAgICAgIGZ5ID0gcmNQbGF0ZS50b3A7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChJc0Zsb2F0U21hbGxlcihmeSAtIHJjUGxhdGUuSGVpZ2h0KCksIHJjQ29udGVudC5ib3R0b20pKSB7CisgICAgICAgIGZ5ID0gcmNDb250ZW50LmJvdHRvbSArIHJjUGxhdGUuSGVpZ2h0KCk7CisgICAgICB9IGVsc2UgaWYgKElzRmxvYXRCaWdnZXIoZnksIHJjQ29udGVudC50b3ApKSB7CisgICAgICAgIGZ5ID0gcmNDb250ZW50LnRvcDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBtX3B0U2Nyb2xsUG9zLnkgPSBmeTsKKyAgICBJbnZhbGlkYXRlSXRlbSgtMSk7CisKKyAgICBpZiAobV9wTm90aWZ5KSB7CisgICAgICBpZiAoIW1fYk5vdGlmeUZsYWcpIHsKKyAgICAgICAgbV9iTm90aWZ5RmxhZyA9IHRydWU7CisgICAgICAgIG1fcE5vdGlmeS0+SU9uU2V0U2Nyb2xsUG9zWShmeSk7CisgICAgICAgIG1fYk5vdGlmeUZsYWcgPSBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworQ0ZYX0Zsb2F0UmVjdCBDUFdMX0xpc3RDdHJsOjpHZXRDb250ZW50UmVjdEludGVybmFsKCkgY29uc3QgeworICByZXR1cm4gSW5uZXJUb091dGVyKG1fcmNDb250ZW50KTsKK30KKworQ0ZYX0Zsb2F0UmVjdCBDUFdMX0xpc3RDdHJsOjpHZXRDb250ZW50UmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIEluVG9PdXQoR2V0Q29udGVudFJlY3RJbnRlcm5hbCgpKTsKK30KKwordm9pZCBDUFdMX0xpc3RDdHJsOjpSZUFycmFuZ2UoaW50MzJfdCBuSXRlbUluZGV4KSB7CisgIGZsb2F0IGZQb3NZID0gMC4wZjsKKyAgaWYgKHBkZml1bTo6SW5kZXhJbkJvdW5kcyhtX0xpc3RJdGVtcywgbkl0ZW1JbmRleCAtIDEpICYmCisgICAgICBtX0xpc3RJdGVtc1tuSXRlbUluZGV4IC0gMV0pIHsKKyAgICBmUG9zWSA9IG1fTGlzdEl0ZW1zW25JdGVtSW5kZXggLSAxXS0+R2V0UmVjdCgpLmJvdHRvbTsKKyAgfQorICBmb3IgKGNvbnN0IGF1dG8mIHBMaXN0SXRlbSA6IG1fTGlzdEl0ZW1zKSB7CisgICAgaWYgKHBMaXN0SXRlbSkgeworICAgICAgZmxvYXQgZkxpc3RJdGVtSGVpZ2h0ID0gcExpc3RJdGVtLT5HZXRJdGVtSGVpZ2h0KCk7CisgICAgICBwTGlzdEl0ZW0tPlNldFJlY3QoCisgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdCgwLjBmLCBmUG9zWSArIGZMaXN0SXRlbUhlaWdodCwgMC4wZiwgZlBvc1kpKTsKKyAgICAgIGZQb3NZICs9IGZMaXN0SXRlbUhlaWdodDsKKyAgICB9CisgIH0KKyAgU2V0Q29udGVudFJlY3QoQ0ZYX0Zsb2F0UmVjdCgwLjBmLCBmUG9zWSwgMC4wZiwgMC4wZikpOworICBTZXRTY3JvbGxJbmZvKCk7Cit9CisKK3ZvaWQgQ1BXTF9MaXN0Q3RybDo6U2V0VG9wSXRlbShpbnQzMl90IG5JbmRleCkgeworICBpZiAoSXNWYWxpZChuSW5kZXgpKSB7CisgICAgQ0ZYX0Zsb2F0UmVjdCByY0l0ZW0gPSBHZXRJdGVtUmVjdEludGVybmFsKG5JbmRleCk7CisgICAgU2V0U2Nyb2xsUG9zWShyY0l0ZW0udG9wKTsKKyAgfQorfQorCitpbnQzMl90IENQV0xfTGlzdEN0cmw6OkdldFRvcEl0ZW0oKSBjb25zdCB7CisgIGludDMyX3Qgbkl0ZW1JbmRleCA9IEdldEl0ZW1JbmRleChHZXRCVFBvaW50KCkpOworICBpZiAoIUlzSXRlbVZpc2libGUobkl0ZW1JbmRleCkgJiYgSXNJdGVtVmlzaWJsZShuSXRlbUluZGV4ICsgMSkpCisgICAgbkl0ZW1JbmRleCArPSAxOworCisgIHJldHVybiBuSXRlbUluZGV4OworfQorCit2b2lkIENQV0xfTGlzdEN0cmw6OkVtcHR5KCkgeworICBtX0xpc3RJdGVtcy5jbGVhcigpOworICBJbnZhbGlkYXRlSXRlbSgtMSk7Cit9CisKK3ZvaWQgQ1BXTF9MaXN0Q3RybDo6Q2FuY2VsKCkgeworICBtX2FTZWxJdGVtcy5EZXNlbGVjdEFsbCgpOworfQorCitpbnQzMl90IENQV0xfTGlzdEN0cmw6OkdldEl0ZW1JbmRleChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3QgeworICBDRlhfUG9pbnRGIHB0ID0gT3V0ZXJUb0lubmVyKE91dFRvSW4ocG9pbnQpKTsKKyAgYm9vbCBiRmlyc3QgPSB0cnVlOworICBib29sIGJMYXN0ID0gdHJ1ZTsKKyAgZm9yIChjb25zdCBhdXRvJiBwTGlzdEl0ZW0gOiBtX0xpc3RJdGVtcykgeworICAgIGlmICghcExpc3RJdGVtKQorICAgICAgY29udGludWU7CisgICAgQ0ZYX0Zsb2F0UmVjdCByY0xpc3RJdGVtID0gcExpc3RJdGVtLT5HZXRSZWN0KCk7CisgICAgaWYgKElzRmxvYXRCaWdnZXIocHQueSwgcmNMaXN0SXRlbS50b3ApKQorICAgICAgYkZpcnN0ID0gZmFsc2U7CisgICAgaWYgKElzRmxvYXRTbWFsbGVyKHB0LnksIHJjTGlzdEl0ZW0uYm90dG9tKSkKKyAgICAgIGJMYXN0ID0gZmFsc2U7CisgICAgaWYgKHB0LnkgPj0gcmNMaXN0SXRlbS50b3AgJiYgcHQueSA8IHJjTGlzdEl0ZW0uYm90dG9tKQorICAgICAgcmV0dXJuICZwTGlzdEl0ZW0gLSAmbV9MaXN0SXRlbXMuZnJvbnQoKTsKKyAgfQorICBpZiAoYkZpcnN0KQorICAgIHJldHVybiAwOworICBpZiAoYkxhc3QpCisgICAgcmV0dXJuIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9MaXN0SXRlbXMpIC0gMTsKKyAgcmV0dXJuIC0xOworfQorCitXaWRlU3RyaW5nIENQV0xfTGlzdEN0cmw6OkdldFRleHQoKSBjb25zdCB7CisgIGlmIChJc011bHRpcGxlU2VsKCkpCisgICAgcmV0dXJuIEdldEl0ZW1UZXh0KG1fbkNhcmV0SW5kZXgpOworICByZXR1cm4gR2V0SXRlbVRleHQobV9uU2VsSXRlbSk7Cit9CisKK3ZvaWQgQ1BXTF9MaXN0Q3RybDo6QWRkSXRlbShjb25zdCBXaWRlU3RyaW5nJiBzdHIpIHsKKyAgYXV0byBwTGlzdEl0ZW0gPSBwZGZpdW06Ok1ha2VVbmlxdWU8SXRlbT4oKTsKKyAgcExpc3RJdGVtLT5TZXRGb250TWFwKG1fcEZvbnRNYXAuR2V0KCkpOworICBwTGlzdEl0ZW0tPlNldEZvbnRTaXplKG1fZkZvbnRTaXplKTsKKyAgcExpc3RJdGVtLT5TZXRUZXh0KHN0cik7CisgIG1fTGlzdEl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUocExpc3RJdGVtKSk7Cit9CisKK0NQV0xfRWRpdEltcGwqIENQV0xfTGlzdEN0cmw6OkdldEl0ZW1FZGl0KGludDMyX3QgbkluZGV4KSBjb25zdCB7CisgIGlmICghcGRmaXVtOjpJbmRleEluQm91bmRzKG1fTGlzdEl0ZW1zLCBuSW5kZXgpIHx8ICFtX0xpc3RJdGVtc1tuSW5kZXhdKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gbV9MaXN0SXRlbXNbbkluZGV4XS0+R2V0RWRpdCgpOworfQorCitpbnQzMl90IENQV0xfTGlzdEN0cmw6OkdldENvdW50KCkgY29uc3QgeworICByZXR1cm4gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX0xpc3RJdGVtcyk7Cit9CisKK2Zsb2F0IENQV0xfTGlzdEN0cmw6OkdldEZpcnN0SGVpZ2h0KCkgY29uc3QgeworICBpZiAobV9MaXN0SXRlbXMuZW1wdHkoKSB8fCAhbV9MaXN0SXRlbXMuZnJvbnQoKSkKKyAgICByZXR1cm4gMS4wZjsKKyAgcmV0dXJuIG1fTGlzdEl0ZW1zLmZyb250KCktPkdldEl0ZW1IZWlnaHQoKTsKK30KKworaW50MzJfdCBDUFdMX0xpc3RDdHJsOjpHZXRGaXJzdFNlbGVjdGVkKCkgY29uc3QgeworICBpbnQzMl90IGkgPSAwOworICBmb3IgKGNvbnN0IGF1dG8mIHBMaXN0SXRlbSA6IG1fTGlzdEl0ZW1zKSB7CisgICAgaWYgKHBMaXN0SXRlbSAmJiBwTGlzdEl0ZW0tPklzU2VsZWN0ZWQoKSkKKyAgICAgIHJldHVybiBpOworICAgICsraTsKKyAgfQorICByZXR1cm4gLTE7Cit9CisKK2ludDMyX3QgQ1BXTF9MaXN0Q3RybDo6R2V0TGFzdFNlbGVjdGVkKCkgY29uc3QgeworICBmb3IgKGF1dG8gaXRlciA9IG1fTGlzdEl0ZW1zLnJiZWdpbigpOyBpdGVyICE9IG1fTGlzdEl0ZW1zLnJlbmQoKTsgKytpdGVyKSB7CisgICAgaWYgKCppdGVyICYmICgqaXRlciktPklzU2VsZWN0ZWQoKSkKKyAgICAgIHJldHVybiAmKml0ZXIgLSAmbV9MaXN0SXRlbXMuZnJvbnQoKTsKKyAgfQorICByZXR1cm4gLTE7Cit9CisKK2ludDMyX3QgQ1BXTF9MaXN0Q3RybDo6RmluZE5leHQoaW50MzJfdCBuSW5kZXgsIHdjaGFyX3QgbkNoYXIpIGNvbnN0IHsKKyAgaW50MzJfdCBuQ2lyY2xlSW5kZXggPSBuSW5kZXg7CisgIGludDMyX3Qgc3ogPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fTGlzdEl0ZW1zKTsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc3o7IGkrKykgeworICAgIG5DaXJjbGVJbmRleCsrOworICAgIGlmIChuQ2lyY2xlSW5kZXggPj0gc3opCisgICAgICBuQ2lyY2xlSW5kZXggPSAwOworCisgICAgaWYgKEl0ZW0qIHBMaXN0SXRlbSA9IG1fTGlzdEl0ZW1zW25DaXJjbGVJbmRleF0uZ2V0KCkpIHsKKyAgICAgIGlmIChGWFNZU190b3VwcGVyKHBMaXN0SXRlbS0+R2V0Rmlyc3RDaGFyKCkpID09IEZYU1lTX3RvdXBwZXIobkNoYXIpKQorICAgICAgICByZXR1cm4gbkNpcmNsZUluZGV4OworICAgIH0KKyAgfQorCisgIHJldHVybiBuQ2lyY2xlSW5kZXg7Cit9CisKK2Jvb2wgQ1BXTF9MaXN0Q3RybDo6SXNJdGVtU2VsZWN0ZWQoaW50MzJfdCBuSW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIHBkZml1bTo6SW5kZXhJbkJvdW5kcyhtX0xpc3RJdGVtcywgbkluZGV4KSAmJiBtX0xpc3RJdGVtc1tuSW5kZXhdICYmCisgICAgICAgICBtX0xpc3RJdGVtc1tuSW5kZXhdLT5Jc1NlbGVjdGVkKCk7Cit9CisKK3ZvaWQgQ1BXTF9MaXN0Q3RybDo6U2V0SXRlbVNlbGVjdChpbnQzMl90IG5JbmRleCwgYm9vbCBiU2VsZWN0ZWQpIHsKKyAgaWYgKHBkZml1bTo6SW5kZXhJbkJvdW5kcyhtX0xpc3RJdGVtcywgbkluZGV4KSAmJiBtX0xpc3RJdGVtc1tuSW5kZXhdKQorICAgIG1fTGlzdEl0ZW1zW25JbmRleF0tPlNldFNlbGVjdChiU2VsZWN0ZWQpOworfQorCitib29sIENQV0xfTGlzdEN0cmw6OklzVmFsaWQoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdCB7CisgIHJldHVybiBwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9MaXN0SXRlbXMsIG5JdGVtSW5kZXgpOworfQorCitXaWRlU3RyaW5nIENQV0xfTGlzdEN0cmw6OkdldEl0ZW1UZXh0KGludDMyX3QgbkluZGV4KSBjb25zdCB7CisgIGlmIChwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9MaXN0SXRlbXMsIG5JbmRleCkgJiYgbV9MaXN0SXRlbXNbbkluZGV4XSkKKyAgICByZXR1cm4gbV9MaXN0SXRlbXNbbkluZGV4XS0+R2V0VGV4dCgpOworICByZXR1cm4gTCIiOworfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9wd2wvY3B3bF9saXN0X2ltcGwuaCBiL2ZwZGZzZGsvcHdsL2Nwd2xfbGlzdF9pbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM5YTljOAotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvcHdsL2Nwd2xfbGlzdF9pbXBsLmgKQEAgLTAsMCArMSwxNjkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGUERGU0RLX1BXTF9DUFdMX0xJU1RfSU1QTF9IXworI2RlZmluZSBGUERGU0RLX1BXTF9DUFdMX0xJU1RfSU1QTF9IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisKK2NsYXNzIENQV0xfRWRpdEltcGw7CitjbGFzcyBDUFdMX0VkaXRJbXBsX0l0ZXJhdG9yOworY2xhc3MgQ1BXTF9MaXN0X05vdGlmeTsKK2NsYXNzIElQVlRfRm9udE1hcDsKKworY2xhc3MgQ1BMU1RfU2VsZWN0IHsKKyBwdWJsaWM6CisgIGVudW0gU3RhdGUgeyBERVNFTEVDVElORyA9IC0xLCBOT1JNQUwgPSAwLCBTRUxFQ1RJTkcgPSAxIH07CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gc3RkOjptYXA8aW50MzJfdCwgU3RhdGU+Ojpjb25zdF9pdGVyYXRvcjsKKworICBDUExTVF9TZWxlY3QoKTsKKyAgdmlydHVhbCB+Q1BMU1RfU2VsZWN0KCk7CisKKyAgdm9pZCBBZGQoaW50MzJfdCBuSXRlbUluZGV4KTsKKyAgdm9pZCBBZGQoaW50MzJfdCBuQmVnaW5JbmRleCwgaW50MzJfdCBuRW5kSW5kZXgpOworICB2b2lkIFN1YihpbnQzMl90IG5JdGVtSW5kZXgpOworICB2b2lkIFN1YihpbnQzMl90IG5CZWdpbkluZGV4LCBpbnQzMl90IG5FbmRJbmRleCk7CisgIHZvaWQgRGVzZWxlY3RBbGwoKTsKKyAgdm9pZCBEb25lKCk7CisKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBtX0l0ZW1zLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gbV9JdGVtcy5lbmQoKTsgfQorCisgcHJpdmF0ZToKKyAgc3RkOjptYXA8aW50MzJfdCwgU3RhdGU+IG1fSXRlbXM7Cit9OworCitjbGFzcyBDUFdMX0xpc3RDdHJsIHsKKyBwdWJsaWM6CisgIENQV0xfTGlzdEN0cmwoKTsKKyAgfkNQV0xfTGlzdEN0cmwoKTsKKworICB2b2lkIFNldE5vdGlmeShDUFdMX0xpc3RfTm90aWZ5KiBwTm90aWZ5KSB7IG1fcE5vdGlmeSA9IHBOb3RpZnk7IH0KKyAgdm9pZCBPbk1vdXNlRG93bihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpOworICB2b2lkIE9uTW91c2VNb3ZlKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCBib29sIGJTaGlmdCwgYm9vbCBiQ3RybCk7CisgIHZvaWQgT25WS19VUChib29sIGJTaGlmdCwgYm9vbCBiQ3RybCk7CisgIHZvaWQgT25WS19ET1dOKGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKTsKKyAgdm9pZCBPblZLX0xFRlQoYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpOworICB2b2lkIE9uVktfUklHSFQoYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpOworICB2b2lkIE9uVktfSE9NRShib29sIGJTaGlmdCwgYm9vbCBiQ3RybCk7CisgIHZvaWQgT25WS19FTkQoYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpOworICBib29sIE9uQ2hhcih1aW50MTZfdCBuQ2hhciwgYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpOworCisgIHZvaWQgU2V0U2Nyb2xsUG9zKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKKyAgdm9pZCBTY3JvbGxUb0xpc3RJdGVtKGludDMyX3Qgbkl0ZW1JbmRleCk7CisgIENGWF9GbG9hdFJlY3QgR2V0SXRlbVJlY3QoaW50MzJfdCBuSW5kZXgpIGNvbnN0OworICBpbnQzMl90IEdldENhcmV0KCkgY29uc3QgeyByZXR1cm4gbV9uQ2FyZXRJbmRleDsgfQorICBpbnQzMl90IEdldFNlbGVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fblNlbEl0ZW07IH0KKyAgaW50MzJfdCBHZXRUb3BJdGVtKCkgY29uc3Q7CisgIHZvaWQgU2V0Q29udGVudFJlY3QoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgeyBtX3JjQ29udGVudCA9IHJlY3Q7IH0KKyAgQ0ZYX0Zsb2F0UmVjdCBHZXRDb250ZW50UmVjdCgpIGNvbnN0OworCisgIGludDMyX3QgR2V0SXRlbUluZGV4KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBjb25zdDsKKyAgdm9pZCBBZGRTdHJpbmcoY29uc3QgV2lkZVN0cmluZyYgc3RyKTsKKyAgdm9pZCBTZXRUb3BJdGVtKGludDMyX3QgbkluZGV4KTsKKyAgdm9pZCBTZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4KTsKKyAgdm9pZCBTZXRDYXJldChpbnQzMl90IG5JdGVtSW5kZXgpOworICB2b2lkIEVtcHR5KCk7CisgIHZvaWQgQ2FuY2VsKCk7CisgIFdpZGVTdHJpbmcgR2V0VGV4dCgpIGNvbnN0OworCisgIHZvaWQgU2V0Rm9udE1hcChJUFZUX0ZvbnRNYXAqIHBGb250TWFwKSB7IG1fcEZvbnRNYXAgPSBwRm9udE1hcDsgfQorICB2b2lkIFNldEZvbnRTaXplKGZsb2F0IGZGb250U2l6ZSkgeyBtX2ZGb250U2l6ZSA9IGZGb250U2l6ZTsgfQorICBDRlhfRmxvYXRSZWN0IEdldFBsYXRlUmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fcmNQbGF0ZTsgfQorICB2b2lkIFNldFBsYXRlUmVjdChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KTsKKworICBmbG9hdCBHZXRGb250U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZkZvbnRTaXplOyB9CisgIENQV0xfRWRpdEltcGwqIEdldEl0ZW1FZGl0KGludDMyX3QgbkluZGV4KSBjb25zdDsKKyAgaW50MzJfdCBHZXRDb3VudCgpIGNvbnN0OworICBib29sIElzSXRlbVNlbGVjdGVkKGludDMyX3QgbkluZGV4KSBjb25zdDsKKyAgZmxvYXQgR2V0Rmlyc3RIZWlnaHQoKSBjb25zdDsKKyAgdm9pZCBTZXRNdWx0aXBsZVNlbChib29sIGJNdWx0aXBsZSkgeyBtX2JNdWx0aXBsZSA9IGJNdWx0aXBsZTsgfQorICBib29sIElzTXVsdGlwbGVTZWwoKSBjb25zdCB7IHJldHVybiBtX2JNdWx0aXBsZTsgfQorICBpbnQzMl90IEZpbmROZXh0KGludDMyX3QgbkluZGV4LCB3Y2hhcl90IG5DaGFyKSBjb25zdDsKKyAgaW50MzJfdCBHZXRGaXJzdFNlbGVjdGVkKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICBjbGFzcyBJdGVtIHsKKyAgIHB1YmxpYzoKKyAgICBJdGVtKCk7CisgICAgfkl0ZW0oKTsKKworICAgIHZvaWQgU2V0Rm9udE1hcChJUFZUX0ZvbnRNYXAqIHBGb250TWFwKTsKKyAgICBDUFdMX0VkaXRJbXBsKiBHZXRFZGl0KCkgY29uc3QgeyByZXR1cm4gbV9wRWRpdC5nZXQoKTsgfQorCisgICAgdm9pZCBTZXRSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIHsgbV9yY0xpc3RJdGVtID0gcmVjdDsgfQorICAgIHZvaWQgU2V0U2VsZWN0KGJvb2wgYlNlbGVjdGVkKSB7IG1fYlNlbGVjdGVkID0gYlNlbGVjdGVkOyB9CisgICAgdm9pZCBTZXRUZXh0KGNvbnN0IFdpZGVTdHJpbmcmIHRleHQpOworICAgIHZvaWQgU2V0Rm9udFNpemUoZmxvYXQgZkZvbnRTaXplKTsKKyAgICBXaWRlU3RyaW5nIEdldFRleHQoKSBjb25zdDsKKworICAgIENGWF9GbG9hdFJlY3QgR2V0UmVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fcmNMaXN0SXRlbTsgfQorICAgIGJvb2wgSXNTZWxlY3RlZCgpIGNvbnN0IHsgcmV0dXJuIG1fYlNlbGVjdGVkOyB9CisgICAgZmxvYXQgR2V0SXRlbUhlaWdodCgpIGNvbnN0OworICAgIHVpbnQxNl90IEdldEZpcnN0Q2hhcigpIGNvbnN0OworCisgICBwcml2YXRlOgorICAgIENQV0xfRWRpdEltcGxfSXRlcmF0b3IqIEdldEl0ZXJhdG9yKCkgY29uc3Q7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1BXTF9FZGl0SW1wbD4gbV9wRWRpdDsKKyAgICBib29sIG1fYlNlbGVjdGVkOworICAgIENGWF9GbG9hdFJlY3QgbV9yY0xpc3RJdGVtOworICB9OworCisgIENGWF9Qb2ludEYgSW5Ub091dChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3Q7CisgIENGWF9Qb2ludEYgT3V0VG9Jbihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3Q7CisgIENGWF9GbG9hdFJlY3QgSW5Ub091dChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdDsKKyAgQ0ZYX0Zsb2F0UmVjdCBPdXRUb0luKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0OworCisgIENGWF9Qb2ludEYgSW5uZXJUb091dGVyKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBjb25zdDsKKyAgQ0ZYX1BvaW50RiBPdXRlclRvSW5uZXIoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIGNvbnN0OworICBDRlhfRmxvYXRSZWN0IElubmVyVG9PdXRlcihjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdDsKKyAgQ0ZYX0Zsb2F0UmVjdCBPdXRlclRvSW5uZXIoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3Q7CisKKyAgdm9pZCBPblZLKGludDMyX3Qgbkl0ZW1JbmRleCwgYm9vbCBiU2hpZnQsIGJvb2wgYkN0cmwpOworICBib29sIElzVmFsaWQoaW50MzJfdCBuSXRlbUluZGV4KSBjb25zdDsKKworICB2b2lkIFJlQXJyYW5nZShpbnQzMl90IG5JdGVtSW5kZXgpOworICBDRlhfRmxvYXRSZWN0IEdldEl0ZW1SZWN0SW50ZXJuYWwoaW50MzJfdCBuSW5kZXgpIGNvbnN0OworICBDRlhfRmxvYXRSZWN0IEdldENvbnRlbnRSZWN0SW50ZXJuYWwoKSBjb25zdDsKKyAgdm9pZCBTZXRNdWx0aXBsZVNlbGVjdChpbnQzMl90IG5JdGVtSW5kZXgsIGJvb2wgYlNlbGVjdGVkKTsKKyAgdm9pZCBTZXRTaW5nbGVTZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4KTsKKyAgdm9pZCBJbnZhbGlkYXRlSXRlbShpbnQzMl90IG5JdGVtSW5kZXgpOworICB2b2lkIFNlbGVjdEl0ZW1zKCk7CisgIGJvb2wgSXNJdGVtVmlzaWJsZShpbnQzMl90IG5JdGVtSW5kZXgpIGNvbnN0OworICB2b2lkIFNldFNjcm9sbEluZm8oKTsKKyAgdm9pZCBTZXRTY3JvbGxQb3NZKGZsb2F0IGZ5KTsKKyAgdm9pZCBBZGRJdGVtKGNvbnN0IFdpZGVTdHJpbmcmIHN0cik7CisgIFdpZGVTdHJpbmcgR2V0SXRlbVRleHQoaW50MzJfdCBuSW5kZXgpIGNvbnN0OworICB2b2lkIFNldEl0ZW1TZWxlY3QoaW50MzJfdCBuSXRlbUluZGV4LCBib29sIGJTZWxlY3RlZCk7CisgIGludDMyX3QgR2V0TGFzdFNlbGVjdGVkKCkgY29uc3Q7CisgIENGWF9Qb2ludEYgR2V0QlRQb2ludCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ0ZYX1BvaW50RihtX3JjUGxhdGUubGVmdCwgbV9yY1BsYXRlLnRvcCk7CisgIH0KKworICBDRlhfRmxvYXRSZWN0IG1fcmNQbGF0ZTsKKyAgQ0ZYX0Zsb2F0UmVjdCBtX3JjQ29udGVudDsKKyAgVW5vd25lZFB0cjxDUFdMX0xpc3RfTm90aWZ5PiBtX3BOb3RpZnk7CisgIGJvb2wgbV9iTm90aWZ5RmxhZzsKKyAgQ0ZYX1BvaW50RiBtX3B0U2Nyb2xsUG9zOworICBDUExTVF9TZWxlY3QgbV9hU2VsSXRlbXM7ICAvLyBmb3IgbXVsdGlwbGUKKyAgaW50MzJfdCBtX25TZWxJdGVtOyAgICAgICAgLy8gZm9yIHNpbmdsZQorICBpbnQzMl90IG1fbkZvb3RJbmRleDsgICAgICAvLyBmb3IgbXVsdGlwbGUKKyAgYm9vbCBtX2JDdHJsU2VsOyAgICAgICAgICAgLy8gZm9yIG11bHRpcGxlCisgIGludDMyX3QgbV9uQ2FyZXRJbmRleDsgICAgIC8vIGZvciBtdWx0aXBsZQorICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8SXRlbT4+IG1fTGlzdEl0ZW1zOworICBmbG9hdCBtX2ZGb250U2l6ZTsKKyAgVW5vd25lZFB0cjxJUFZUX0ZvbnRNYXA+IG1fcEZvbnRNYXA7CisgIGJvb2wgbV9iTXVsdGlwbGU7Cit9OworCisjZW5kaWYgIC8vIEZQREZTREtfUFdMX0NQV0xfTElTVF9JTVBMX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3B3bC9jcHdsX3Njcm9sbF9iYXIuY3BwIGIvZnBkZnNkay9wd2wvY3B3bF9zY3JvbGxfYmFyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWE1MWUzCi0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9wd2wvY3B3bF9zY3JvbGxfYmFyLmNwcApAQCAtMCwwICsxLDkzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF9zY3JvbGxfYmFyLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3BhdGhkYXRhLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX3duZC5oIgorCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgZmxvYXQga0J1dHRvbldpZHRoID0gOS4wZjsKK2NvbnN0ZXhwciBmbG9hdCBrUG9zQnV0dG9uTWluV2lkdGggPSAyLjBmOworY29uc3RleHByIGZsb2F0IGtTY3JvbGxCYXJUcmlhbmdsZUhhbGZMZW5ndGggPSAyLjBmOworCit9ICAvLyBuYW1lc3BhY2UKKworI2RlZmluZSBQV0xfREVGQVVMVF9IRUFWWUdSQVlDT0xPUiBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprR3JheSwgMC41MCkKKworUFdMX0ZMT0FUUkFOR0U6OlBXTF9GTE9BVFJBTkdFKCkgeworICBEZWZhdWx0KCk7Cit9CisKK1BXTF9GTE9BVFJBTkdFOjpQV0xfRkxPQVRSQU5HRShmbG9hdCBtaW4sIGZsb2F0IG1heCkgeworICBTZXQobWluLCBtYXgpOworfQorCit2b2lkIFBXTF9GTE9BVFJBTkdFOjpEZWZhdWx0KCkgeworICBmTWluID0gMDsKKyAgZk1heCA9IDA7Cit9CisKK3ZvaWQgUFdMX0ZMT0FUUkFOR0U6OlNldChmbG9hdCBtaW4sIGZsb2F0IG1heCkgeworICBpZiAobWluID4gbWF4KSB7CisgICAgZk1pbiA9IG1heDsKKyAgICBmTWF4ID0gbWluOworICB9IGVsc2UgeworICAgIGZNaW4gPSBtaW47CisgICAgZk1heCA9IG1heDsKKyAgfQorfQorCitib29sIFBXTF9GTE9BVFJBTkdFOjpJbihmbG9hdCB4KSBjb25zdCB7CisgIHJldHVybiAoSXNGbG9hdEJpZ2dlcih4LCBmTWluKSB8fCBJc0Zsb2F0RXF1YWwoeCwgZk1pbikpICYmCisgICAgICAgICAoSXNGbG9hdFNtYWxsZXIoeCwgZk1heCkgfHwgSXNGbG9hdEVxdWFsKHgsIGZNYXgpKTsKK30KKworZmxvYXQgUFdMX0ZMT0FUUkFOR0U6OkdldFdpZHRoKCkgY29uc3QgeworICByZXR1cm4gZk1heCAtIGZNaW47Cit9CisKK1BXTF9TQ1JPTExfUFJJVkFURURBVEE6OlBXTF9TQ1JPTExfUFJJVkFURURBVEEoKSB7CisgIERlZmF1bHQoKTsKK30KKwordm9pZCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpEZWZhdWx0KCkgeworICBTY3JvbGxSYW5nZS5EZWZhdWx0KCk7CisgIGZTY3JvbGxQb3MgPSBTY3JvbGxSYW5nZS5mTWluOworICBmQ2xpZW50V2lkdGggPSAwOworICBmQmlnU3RlcCA9IDEwOworICBmU21hbGxTdGVwID0gMTsKK30KKwordm9pZCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpTZXRTY3JvbGxSYW5nZShmbG9hdCBtaW4sIGZsb2F0IG1heCkgeworICBTY3JvbGxSYW5nZS5TZXQobWluLCBtYXgpOworCisgIGlmIChJc0Zsb2F0U21hbGxlcihmU2Nyb2xsUG9zLCBTY3JvbGxSYW5nZS5mTWluKSkKKyAgICBmU2Nyb2xsUG9zID0gU2Nyb2xsUmFuZ2UuZk1pbjsKKyAgaWYgKElzRmxvYXRCaWdnZXIoZlNjcm9sbFBvcywgU2Nyb2xsUmFuZ2UuZk1heCkpCisgICAgZlNjcm9sbFBvcyA9IFNjcm9sbFJhbmdlLmZNYXg7Cit9CisKK3ZvaWQgUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6U2V0Q2xpZW50V2lkdGgoZmxvYXQgd2lkdGgpIHsKKyAgZkNsaWVudFdpZHRoID0gd2lkdGg7Cit9CisKK3ZvaWQgUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6U2V0U21hbGxTdGVwKGZsb2F0IHN0ZXApIHsKKyAgZlNtYWxsU3RlcCA9IHN0ZXA7Cit9CisKK3ZvaWQgUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6U2V0QmlnU3RlcChmbG9hdCBzdGVwKSB7CisgIGZCaWdTdGVwID0gc3RlcDsKK30KKworYm9vbCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpTZXRQb3MoZmxvYXQgcG9zKSB7CisgIGlmIChTY3JvbGxSYW5nZS5Jbihwb3MpKSB7CisgICAgZlNjcm9sbFBvcyA9IHBvczsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6QWRkU21hbGwoKSB7CisgIGlmICghU2V0UG9zKGZTY3JvbGxQb3MgKyBmU21hbGxTdGVwKSkKKyAgICBTZXRQb3MoU2Nyb2xsUmFuZ2UuZk1heCk7Cit9CisKK3ZvaWQgUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6U3ViU21hbGwoKSB7CisgIGlmICghU2V0UG9zKGZTY3JvbGxQb3MgLSBmU21hbGxTdGVwKSkKKyAgICBTZXRQb3MoU2Nyb2xsUmFuZ2UuZk1pbik7Cit9CisKK3ZvaWQgUFdMX1NDUk9MTF9QUklWQVRFREFUQTo6QWRkQmlnKCkgeworICBpZiAoIVNldFBvcyhmU2Nyb2xsUG9zICsgZkJpZ1N0ZXApKQorICAgIFNldFBvcyhTY3JvbGxSYW5nZS5mTWF4KTsKK30KKwordm9pZCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBOjpTdWJCaWcoKSB7CisgIGlmICghU2V0UG9zKGZTY3JvbGxQb3MgLSBmQmlnU3RlcCkpCisgICAgU2V0UG9zKFNjcm9sbFJhbmdlLmZNaW4pOworfQorCitDUFdMX1NCQnV0dG9uOjpDUFdMX1NCQnV0dG9uKFBXTF9TQ1JPTExCQVJfVFlQRSBlU2Nyb2xsQmFyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFdMX1NCQlVUVE9OX1RZUEUgZUJ1dHRvblR5cGUpIHsKKyAgbV9lU2Nyb2xsQmFyVHlwZSA9IGVTY3JvbGxCYXJUeXBlOworICBtX2VTQkJ1dHRvblR5cGUgPSBlQnV0dG9uVHlwZTsKKworICBtX2JNb3VzZURvd24gPSBmYWxzZTsKK30KKworQ1BXTF9TQkJ1dHRvbjo6fkNQV0xfU0JCdXR0b24oKSB7fQorCitCeXRlU3RyaW5nIENQV0xfU0JCdXR0b246OkdldENsYXNzTmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuICJDUFdMX1NCQnV0dG9uIjsKK30KKwordm9pZCBDUFdMX1NCQnV0dG9uOjpPbkNyZWF0ZShDcmVhdGVQYXJhbXMqIHBQYXJhbXNUb0FkanVzdCkgeworICBwUGFyYW1zVG9BZGp1c3QtPmVDdXJzb3JUeXBlID0gRlhDVF9BUlJPVzsKK30KKwordm9pZCBDUFdMX1NCQnV0dG9uOjpEcmF3VGhpc0FwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG10VXNlcjJEZXZpY2UpIHsKKyAgaWYgKCFJc1Zpc2libGUoKSkKKyAgICByZXR1cm47CisKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0V25kID0gR2V0V2luZG93UmVjdCgpOworICBpZiAocmVjdFduZC5Jc0VtcHR5KCkpCisgICAgcmV0dXJuOworCisgIENGWF9Qb2ludEYgcHRDZW50ZXIgPSBHZXRDZW50ZXJQb2ludCgpOworICBpbnQzMl90IG5UcmFuc3BhcmVuY3kgPSBHZXRUcmFuc3BhcmVuY3koKTsKKworICBpZiAobV9lU2Nyb2xsQmFyVHlwZSA9PSBTQlRfSFNDUk9MTCkgeworICAgIENQV0xfV25kOjpEcmF3VGhpc0FwcGVhcmFuY2UocERldmljZSwgbXRVc2VyMkRldmljZSk7CisKKyAgICBDRlhfUG9pbnRGIHB0MTsKKyAgICBDRlhfUG9pbnRGIHB0MjsKKyAgICBDRlhfUG9pbnRGIHB0MzsKKyAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IGtTY3JvbGxCYXJUcmlhbmdsZVF1YXJ0ZXJMZW5ndGggPQorICAgICAgICBrU2Nyb2xsQmFyVHJpYW5nbGVIYWxmTGVuZ3RoICogMC41OworICAgIGlmIChtX2VTQkJ1dHRvblR5cGUgPT0gUFNCVF9NSU4pIHsKKyAgICAgIHB0MSA9CisgICAgICAgICAgQ0ZYX1BvaW50RihwdENlbnRlci54IC0ga1Njcm9sbEJhclRyaWFuZ2xlUXVhcnRlckxlbmd0aCwgcHRDZW50ZXIueSk7CisgICAgICBwdDIgPSBDRlhfUG9pbnRGKHB0Q2VudGVyLnggKyBrU2Nyb2xsQmFyVHJpYW5nbGVRdWFydGVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICBwdENlbnRlci55ICsga1Njcm9sbEJhclRyaWFuZ2xlSGFsZkxlbmd0aCk7CisgICAgICBwdDMgPSBDRlhfUG9pbnRGKHB0Q2VudGVyLnggKyBrU2Nyb2xsQmFyVHJpYW5nbGVRdWFydGVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICBwdENlbnRlci55IC0ga1Njcm9sbEJhclRyaWFuZ2xlSGFsZkxlbmd0aCk7CisgICAgfSBlbHNlIGlmIChtX2VTQkJ1dHRvblR5cGUgPT0gUFNCVF9NQVgpIHsKKyAgICAgIHB0MSA9CisgICAgICAgICAgQ0ZYX1BvaW50RihwdENlbnRlci54ICsga1Njcm9sbEJhclRyaWFuZ2xlUXVhcnRlckxlbmd0aCwgcHRDZW50ZXIueSk7CisgICAgICBwdDIgPSBDRlhfUG9pbnRGKHB0Q2VudGVyLnggLSBrU2Nyb2xsQmFyVHJpYW5nbGVRdWFydGVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICBwdENlbnRlci55ICsga1Njcm9sbEJhclRyaWFuZ2xlSGFsZkxlbmd0aCk7CisgICAgICBwdDMgPSBDRlhfUG9pbnRGKHB0Q2VudGVyLnggLSBrU2Nyb2xsQmFyVHJpYW5nbGVRdWFydGVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICBwdENlbnRlci55IC0ga1Njcm9sbEJhclRyaWFuZ2xlSGFsZkxlbmd0aCk7CisgICAgfQorCisgICAgaWYgKHJlY3RXbmQucmlnaHQgLSByZWN0V25kLmxlZnQgPiBrU2Nyb2xsQmFyVHJpYW5nbGVIYWxmTGVuZ3RoICogMiAmJgorICAgICAgICByZWN0V25kLnRvcCAtIHJlY3RXbmQuYm90dG9tID4ga1Njcm9sbEJhclRyaWFuZ2xlSGFsZkxlbmd0aCkgeworICAgICAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisgICAgICBwYXRoLkFwcGVuZFBvaW50KHB0MSwgRlhQVF9UWVBFOjpNb3ZlVG8sIGZhbHNlKTsKKyAgICAgIHBhdGguQXBwZW5kUG9pbnQocHQyLCBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOworICAgICAgcGF0aC5BcHBlbmRQb2ludChwdDMsIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7CisgICAgICBwYXRoLkFwcGVuZFBvaW50KHB0MSwgRlhQVF9UWVBFOjpMaW5lVG8sIGZhbHNlKTsKKworICAgICAgcERldmljZS0+RHJhd1BhdGgoJnBhdGgsICZtdFVzZXIyRGV2aWNlLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUi5Ub0ZYQ29sb3IoblRyYW5zcGFyZW5jeSksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICBGWEZJTExfQUxURVJOQVRFKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gZHJhdyBib3JkZXIKKyAgcERldmljZS0+RHJhd1N0cm9rZVJlY3QoJm10VXNlcjJEZXZpY2UsIHJlY3RXbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ2JFbmNvZGUoblRyYW5zcGFyZW5jeSwgMTAwLCAxMDAsIDEwMCksIDAuMGYpOworICBwRGV2aWNlLT5EcmF3U3Ryb2tlUmVjdCgmbXRVc2VyMkRldmljZSwgcmVjdFduZC5HZXREZWZsYXRlZCgwLjVmLCAwLjVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJlbmN5LCAyNTUsIDI1NSwgMjU1KSwgMS4wZik7CisKKyAgaWYgKG1fZVNCQnV0dG9uVHlwZSAhPSBQU0JUX1BPUykgeworICAgIC8vIGRyYXcgYmFja2dyb3VuZAorICAgIGlmIChJc0VuYWJsZWQoKSkgeworICAgICAgcERldmljZS0+RHJhd1NoYWRvdygmbXRVc2VyMkRldmljZSwgdHJ1ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3RXbmQuR2V0RGVmbGF0ZWQoMS4wZiwgMS4wZiksIG5UcmFuc3BhcmVuY3ksIDgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAyMjApOworICAgIH0gZWxzZSB7CisgICAgICBwRGV2aWNlLT5EcmF3RmlsbFJlY3QoJm10VXNlcjJEZXZpY2UsIHJlY3RXbmQuR2V0RGVmbGF0ZWQoMS4wZiwgMS4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpKTsKKyAgICB9CisKKyAgICAvLyBkcmF3IGFycm93CisgICAgaWYgKHJlY3RXbmQudG9wIC0gcmVjdFduZC5ib3R0b20gPiA2LjBmKSB7CisgICAgICBmbG9hdCBmWCA9IHJlY3RXbmQubGVmdCArIDEuNWY7CisgICAgICBmbG9hdCBmWSA9IHJlY3RXbmQuYm90dG9tOworICAgICAgc3RkOjp2ZWN0b3I8Q0ZYX1BvaW50Rj4gcHRzOworICAgICAgaWYgKG1fZVNCQnV0dG9uVHlwZSA9PSBQU0JUX01JTikgeworICAgICAgICBwdHMucHVzaF9iYWNrKENGWF9Qb2ludEYoZlggKyAyLjVmLCBmWSArIDQuMGYpKTsKKyAgICAgICAgcHRzLnB1c2hfYmFjayhDRlhfUG9pbnRGKGZYICsgMi41ZiwgZlkgKyAzLjBmKSk7CisgICAgICAgIHB0cy5wdXNoX2JhY2soQ0ZYX1BvaW50RihmWCArIDQuNWYsIGZZICsgNS4wZikpOworICAgICAgICBwdHMucHVzaF9iYWNrKENGWF9Qb2ludEYoZlggKyA2LjVmLCBmWSArIDMuMGYpKTsKKyAgICAgICAgcHRzLnB1c2hfYmFjayhDRlhfUG9pbnRGKGZYICsgNi41ZiwgZlkgKyA0LjBmKSk7CisgICAgICAgIHB0cy5wdXNoX2JhY2soQ0ZYX1BvaW50RihmWCArIDQuNWYsIGZZICsgNi4wZikpOworICAgICAgICBwdHMucHVzaF9iYWNrKENGWF9Qb2ludEYoZlggKyAyLjVmLCBmWSArIDQuMGYpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHB0cy5wdXNoX2JhY2soQ0ZYX1BvaW50RihmWCArIDIuNWYsIGZZICsgNS4wZikpOworICAgICAgICBwdHMucHVzaF9iYWNrKENGWF9Qb2ludEYoZlggKyAyLjVmLCBmWSArIDYuMGYpKTsKKyAgICAgICAgcHRzLnB1c2hfYmFjayhDRlhfUG9pbnRGKGZYICsgNC41ZiwgZlkgKyA0LjBmKSk7CisgICAgICAgIHB0cy5wdXNoX2JhY2soQ0ZYX1BvaW50RihmWCArIDYuNWYsIGZZICsgNi4wZikpOworICAgICAgICBwdHMucHVzaF9iYWNrKENGWF9Qb2ludEYoZlggKyA2LjVmLCBmWSArIDUuMGYpKTsKKyAgICAgICAgcHRzLnB1c2hfYmFjayhDRlhfUG9pbnRGKGZYICsgNC41ZiwgZlkgKyAzLjBmKSk7CisgICAgICAgIHB0cy5wdXNoX2JhY2soQ0ZYX1BvaW50RihmWCArIDIuNWYsIGZZICsgNS4wZikpOworICAgICAgfQorICAgICAgcERldmljZS0+RHJhd0ZpbGxBcmVhKCZtdFVzZXIyRGV2aWNlLCBwdHMuZGF0YSgpLCA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzRW5hYmxlZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQXJnYkVuY29kZShuVHJhbnNwYXJlbmN5LCAyNTUsIDI1NSwgMjU1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFBXTF9ERUZBVUxUX0hFQVZZR1JBWUNPTE9SLlRvRlhDb2xvcigyNTUpKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKElzRW5hYmxlZCgpKSB7CisgICAgLy8gZHJhdyBzaGFkb3cgZWZmZWN0CisgICAgQ0ZYX1BvaW50RiBwdFRvcCA9IENGWF9Qb2ludEYocmVjdFduZC5sZWZ0LCByZWN0V25kLnRvcCAtIDEuMGYpOworICAgIENGWF9Qb2ludEYgcHRCb3R0b20gPSBDRlhfUG9pbnRGKHJlY3RXbmQubGVmdCwgcmVjdFduZC5ib3R0b20gKyAxLjBmKTsKKworICAgIHB0VG9wLnggKz0gMS41ZjsKKyAgICBwdEJvdHRvbS54ICs9IDEuNWY7CisKKyAgICBjb25zdCBGWF9DT0xPUlJFRiByZWZzW10gPSB7QXJnYkVuY29kZShuVHJhbnNwYXJlbmN5LCAyMTAsIDIxMCwgMjEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJlbmN5LCAyMjAsIDIyMCwgMjIwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJlbmN5LCAyNDAsIDI0MCwgMjQwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJlbmN5LCAyNDAsIDI0MCwgMjQwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJlbmN5LCAyMTAsIDIxMCwgMjEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJlbmN5LCAxODAsIDE4MCwgMTgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJlbmN5LCAxNTAsIDE1MCwgMTUwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJlbmN5LCAxNTAsIDE1MCwgMTUwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJlbmN5LCAxODAsIDE4MCwgMTgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZShuVHJhbnNwYXJlbmN5LCAyMTAsIDIxMCwgMjEwKX07CisgICAgZm9yIChGWF9DT0xPUlJFRiByZWYgOiByZWZzKSB7CisgICAgICBwRGV2aWNlLT5EcmF3U3Ryb2tlTGluZSgmbXRVc2VyMkRldmljZSwgcHRUb3AsIHB0Qm90dG9tLCByZWYsIDEuMGYpOworCisgICAgICBwdFRvcC54ICs9IDEuMGY7CisgICAgICBwdEJvdHRvbS54ICs9IDEuMGY7CisgICAgfQorICB9IGVsc2UgeworICAgIHBEZXZpY2UtPkRyYXdGaWxsUmVjdCgmbXRVc2VyMkRldmljZSwgcmVjdFduZC5HZXREZWZsYXRlZCgwLjVmLCAwLjVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnYkVuY29kZSgyNTUsIDI1NSwgMjU1LCAyNTUpKTsKKyAgfQorCisgIC8vIGRyYXcgZnJpY3Rpb24KKyAgaWYgKHJlY3RXbmQuSGVpZ2h0KCkgPD0gOC4wZikKKyAgICByZXR1cm47CisKKyAgRlhfQ09MT1JSRUYgY3JTdHJva2UgPSBBcmdiRW5jb2RlKG5UcmFuc3BhcmVuY3ksIDEyMCwgMTIwLCAxMjApOworICBpZiAoIUlzRW5hYmxlZCgpKQorICAgIGNyU3Ryb2tlID0gUFdMX0RFRkFVTFRfSEVBVllHUkFZQ09MT1IuVG9GWENvbG9yKDI1NSk7CisKKyAgZmxvYXQgbkZyaWN0aW9uV2lkdGggPSA1LjBmOworICBmbG9hdCBuRnJpY3Rpb25IZWlnaHQgPSA1LjVmOworCisgIENGWF9Qb2ludEYgcHRMZWZ0ID0gQ0ZYX1BvaW50RihwdENlbnRlci54IC0gbkZyaWN0aW9uV2lkdGggLyAyLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRDZW50ZXIueSAtIG5GcmljdGlvbkhlaWdodCAvIDIuMGYgKyAwLjVmKTsKKyAgQ0ZYX1BvaW50RiBwdFJpZ2h0ID0gQ0ZYX1BvaW50RihwdENlbnRlci54ICsgbkZyaWN0aW9uV2lkdGggLyAyLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0Q2VudGVyLnkgLSBuRnJpY3Rpb25IZWlnaHQgLyAyLjBmICsgMC41Zik7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICBwRGV2aWNlLT5EcmF3U3Ryb2tlTGluZSgmbXRVc2VyMkRldmljZSwgcHRMZWZ0LCBwdFJpZ2h0LCBjclN0cm9rZSwgMS4wZik7CisgICAgcHRMZWZ0LnkgKz0gMi4wZjsKKyAgICBwdFJpZ2h0LnkgKz0gMi4wZjsKKyAgfQorfQorCitib29sIENQV0xfU0JCdXR0b246Ok9uTEJ1dHRvbkRvd24oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSB7CisgIENQV0xfV25kOjpPbkxCdXR0b25Eb3duKHBvaW50LCBuRmxhZyk7CisKKyAgaWYgKENQV0xfV25kKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpCisgICAgcFBhcmVudC0+Tm90aWZ5TEJ1dHRvbkRvd24odGhpcywgcG9pbnQpOworCisgIG1fYk1vdXNlRG93biA9IHRydWU7CisgIFNldENhcHR1cmUoKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDUFdMX1NCQnV0dG9uOjpPbkxCdXR0b25VcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIHsKKyAgQ1BXTF9XbmQ6Ok9uTEJ1dHRvblVwKHBvaW50LCBuRmxhZyk7CisKKyAgaWYgKENQV0xfV25kKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpCisgICAgcFBhcmVudC0+Tm90aWZ5TEJ1dHRvblVwKHRoaXMsIHBvaW50KTsKKworICBtX2JNb3VzZURvd24gPSBmYWxzZTsKKyAgUmVsZWFzZUNhcHR1cmUoKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDUFdMX1NCQnV0dG9uOjpPbk1vdXNlTW92ZShjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIHsKKyAgQ1BXTF9XbmQ6Ok9uTW91c2VNb3ZlKHBvaW50LCBuRmxhZyk7CisKKyAgaWYgKENQV0xfV25kKiBwUGFyZW50ID0gR2V0UGFyZW50V2luZG93KCkpCisgICAgcFBhcmVudC0+Tm90aWZ5TW91c2VNb3ZlKHRoaXMsIHBvaW50KTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworQ1BXTF9TY3JvbGxCYXI6OkNQV0xfU2Nyb2xsQmFyKFBXTF9TQ1JPTExCQVJfVFlQRSBzYlR5cGUpCisgICAgOiBtX3NiVHlwZShzYlR5cGUpLAorICAgICAgbV9wTWluQnV0dG9uKG51bGxwdHIpLAorICAgICAgbV9wTWF4QnV0dG9uKG51bGxwdHIpLAorICAgICAgbV9wUG9zQnV0dG9uKG51bGxwdHIpLAorICAgICAgbV9iTW91c2VEb3duKGZhbHNlKSwKKyAgICAgIG1fYk1pbk9yTWF4KGZhbHNlKSwKKyAgICAgIG1fYk5vdGlmeUZvcmV2ZXIodHJ1ZSkge30KKworQ1BXTF9TY3JvbGxCYXI6On5DUFdMX1Njcm9sbEJhcigpIHt9CisKK0J5dGVTdHJpbmcgQ1BXTF9TY3JvbGxCYXI6OkdldENsYXNzTmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuICJDUFdMX1Njcm9sbEJhciI7Cit9CisKK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uQ3JlYXRlKENyZWF0ZVBhcmFtcyogcFBhcmFtc1RvQWRqdXN0KSB7CisgIHBQYXJhbXNUb0FkanVzdC0+ZUN1cnNvclR5cGUgPSBGWENUX0FSUk9XOworfQorCit2b2lkIENQV0xfU2Nyb2xsQmFyOjpPbkRlc3Ryb3koKSB7CisgIC8vIFVudGlsIGNsZWFudXAgdGFrZXMgcGxhY2UgaW4gdGhlIHZpcnR1YWwgZGVzdHJ1Y3RvciBmb3IgQ1BXTF9XbmQKKyAgLy8gc3ViY2xhc3NlcywgaW1wbGVtZW50IHRoZSB2aXJ0dWFsIE9uRGVzdHJveSBtZXRob2QgdGhhdCBkb2VzIHRoZQorICAvLyBjbGVhbnVwIGZpcnN0LCB0aGVuIGludm9rZXMgdGhlIHN1cGVyY2xhc3MgT25EZXN0cm95IC4uLiBnZWUsCisgIC8vIGxpa2UgYSBkdG9yIHdvdWxkLgorICBtX3BNaW5CdXR0b24uUmVsZWFzZSgpOworICBtX3BNYXhCdXR0b24uUmVsZWFzZSgpOworICBtX3BQb3NCdXR0b24uUmVsZWFzZSgpOworICBDUFdMX1duZDo6T25EZXN0cm95KCk7Cit9CisKK2Jvb2wgQ1BXTF9TY3JvbGxCYXI6OlJlUG9zQ2hpbGRXbmQoKSB7CisgIENGWF9GbG9hdFJlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CisgIENGWF9GbG9hdFJlY3QgcmNNaW5CdXR0b24sIHJjTWF4QnV0dG9uOworICBmbG9hdCBmQldpZHRoID0gMDsKKworICBzd2l0Y2ggKG1fc2JUeXBlKSB7CisgICAgY2FzZSBTQlRfSFNDUk9MTDoKKyAgICAgIGlmIChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQgPgorICAgICAgICAgIGtCdXR0b25XaWR0aCAqIDIgKyBrUG9zQnV0dG9uTWluV2lkdGggKyAyKSB7CisgICAgICAgIHJjTWluQnV0dG9uID0gQ0ZYX0Zsb2F0UmVjdChyY0NsaWVudC5sZWZ0LCByY0NsaWVudC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5sZWZ0ICsga0J1dHRvbldpZHRoLCByY0NsaWVudC50b3ApOworICAgICAgICByY01heEJ1dHRvbiA9CisgICAgICAgICAgICBDRlhfRmxvYXRSZWN0KHJjQ2xpZW50LnJpZ2h0IC0ga0J1dHRvbldpZHRoLCByY0NsaWVudC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LnJpZ2h0LCByY0NsaWVudC50b3ApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZkJXaWR0aCA9IChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQgLSBrUG9zQnV0dG9uTWluV2lkdGggLSAyKSAvIDI7CisKKyAgICAgICAgaWYgKGZCV2lkdGggPiAwKSB7CisgICAgICAgICAgcmNNaW5CdXR0b24gPSBDRlhfRmxvYXRSZWN0KHJjQ2xpZW50LmxlZnQsIHJjQ2xpZW50LmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQubGVmdCArIGZCV2lkdGgsIHJjQ2xpZW50LnRvcCk7CisgICAgICAgICAgcmNNYXhCdXR0b24gPSBDRlhfRmxvYXRSZWN0KHJjQ2xpZW50LnJpZ2h0IC0gZkJXaWR0aCwgcmNDbGllbnQuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5yaWdodCwgcmNDbGllbnQudG9wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAoIVNldFZpc2libGUoZmFsc2UpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFNCVF9WU0NST0xMOgorICAgICAgaWYgKElzRmxvYXRCaWdnZXIocmNDbGllbnQudG9wIC0gcmNDbGllbnQuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAga0J1dHRvbldpZHRoICogMiArIGtQb3NCdXR0b25NaW5XaWR0aCArIDIpKSB7CisgICAgICAgIHJjTWluQnV0dG9uID0gQ0ZYX0Zsb2F0UmVjdChyY0NsaWVudC5sZWZ0LCByY0NsaWVudC50b3AgLSBrQnV0dG9uV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5yaWdodCwgcmNDbGllbnQudG9wKTsKKyAgICAgICAgcmNNYXhCdXR0b24gPQorICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdChyY0NsaWVudC5sZWZ0LCByY0NsaWVudC5ib3R0b20sIHJjQ2xpZW50LnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5ib3R0b20gKyBrQnV0dG9uV2lkdGgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZkJXaWR0aCA9IChyY0NsaWVudC50b3AgLSByY0NsaWVudC5ib3R0b20gLSBrUG9zQnV0dG9uTWluV2lkdGggLSAyKSAvIDI7CisKKyAgICAgICAgaWYgKElzRmxvYXRCaWdnZXIoZkJXaWR0aCwgMCkpIHsKKyAgICAgICAgICByY01pbkJ1dHRvbiA9IENGWF9GbG9hdFJlY3QocmNDbGllbnQubGVmdCwgcmNDbGllbnQudG9wIC0gZkJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQucmlnaHQsIHJjQ2xpZW50LnRvcCk7CisgICAgICAgICAgcmNNYXhCdXR0b24gPQorICAgICAgICAgICAgICBDRlhfRmxvYXRSZWN0KHJjQ2xpZW50LmxlZnQsIHJjQ2xpZW50LmJvdHRvbSwgcmNDbGllbnQucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQuYm90dG9tICsgZkJXaWR0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKCFTZXRWaXNpYmxlKGZhbHNlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKworICBPYnNlcnZlZFB0ciB0aGlzT2JzZXJ2ZWQodGhpcyk7CisKKyAgaWYgKG1fcE1pbkJ1dHRvbikgeworICAgIG1fcE1pbkJ1dHRvbi0+TW92ZShyY01pbkJ1dHRvbiwgdHJ1ZSwgZmFsc2UpOworICAgIGlmICghdGhpc09ic2VydmVkKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKG1fcE1heEJ1dHRvbikgeworICAgIG1fcE1heEJ1dHRvbi0+TW92ZShyY01heEJ1dHRvbiwgdHJ1ZSwgZmFsc2UpOworICAgIGlmICghdGhpc09ic2VydmVkKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFNb3ZlUG9zQnV0dG9uKGZhbHNlKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6OkRyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG10VXNlcjJEZXZpY2UpIHsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0V25kID0gR2V0V2luZG93UmVjdCgpOworCisgIGlmIChJc1Zpc2libGUoKSAmJiAhcmVjdFduZC5Jc0VtcHR5KCkpIHsKKyAgICBwRGV2aWNlLT5EcmF3RmlsbFJlY3QoJm10VXNlcjJEZXZpY2UsIHJlY3RXbmQsIEdldEJhY2tncm91bmRDb2xvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRUcmFuc3BhcmVuY3koKSk7CisKKyAgICBwRGV2aWNlLT5EcmF3U3Ryb2tlTGluZSgKKyAgICAgICAgJm10VXNlcjJEZXZpY2UsIENGWF9Qb2ludEYocmVjdFduZC5sZWZ0ICsgMi4wZiwgcmVjdFduZC50b3AgLSAyLjBmKSwKKyAgICAgICAgQ0ZYX1BvaW50RihyZWN0V25kLmxlZnQgKyAyLjBmLCByZWN0V25kLmJvdHRvbSArIDIuMGYpLAorICAgICAgICBBcmdiRW5jb2RlKEdldFRyYW5zcGFyZW5jeSgpLCAxMDAsIDEwMCwgMTAwKSwgMS4wZik7CisKKyAgICBwRGV2aWNlLT5EcmF3U3Ryb2tlTGluZSgKKyAgICAgICAgJm10VXNlcjJEZXZpY2UsIENGWF9Qb2ludEYocmVjdFduZC5yaWdodCAtIDIuMGYsIHJlY3RXbmQudG9wIC0gMi4wZiksCisgICAgICAgIENGWF9Qb2ludEYocmVjdFduZC5yaWdodCAtIDIuMGYsIHJlY3RXbmQuYm90dG9tICsgMi4wZiksCisgICAgICAgIEFyZ2JFbmNvZGUoR2V0VHJhbnNwYXJlbmN5KCksIDEwMCwgMTAwLCAxMDApLCAxLjBmKTsKKyAgfQorfQorCitib29sIENQV0xfU2Nyb2xsQmFyOjpPbkxCdXR0b25Eb3duKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgeworICBDUFdMX1duZDo6T25MQnV0dG9uRG93bihwb2ludCwgbkZsYWcpOworCisgIGlmIChIYXNGbGFnKFBXU19BVVRPVFJBTlNQQVJFTlQpKSB7CisgICAgaWYgKEdldFRyYW5zcGFyZW5jeSgpICE9IDI1NSkgeworICAgICAgU2V0VHJhbnNwYXJlbmN5KDI1NSk7CisgICAgICBpZiAoIUludmFsaWRhdGVSZWN0KG51bGxwdHIpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICBDRlhfRmxvYXRSZWN0IHJjTWluQXJlYSwgcmNNYXhBcmVhOworCisgIGlmIChtX3BQb3NCdXR0b24gJiYgbV9wUG9zQnV0dG9uLT5Jc1Zpc2libGUoKSkgeworICAgIENGWF9GbG9hdFJlY3QgcmNDbGllbnQgPSBHZXRDbGllbnRSZWN0KCk7CisgICAgQ0ZYX0Zsb2F0UmVjdCByY1Bvc0J1dHRvbiA9IG1fcFBvc0J1dHRvbi0+R2V0V2luZG93UmVjdCgpOworCisgICAgc3dpdGNoIChtX3NiVHlwZSkgeworICAgICAgY2FzZSBTQlRfSFNDUk9MTDoKKyAgICAgICAgcmNNaW5BcmVhID0gQ0ZYX0Zsb2F0UmVjdChyY0NsaWVudC5sZWZ0ICsga0J1dHRvbldpZHRoLCByY0NsaWVudC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNQb3NCdXR0b24ubGVmdCwgcmNDbGllbnQudG9wKTsKKyAgICAgICAgcmNNYXhBcmVhID0gQ0ZYX0Zsb2F0UmVjdChyY1Bvc0J1dHRvbi5yaWdodCwgcmNDbGllbnQuYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LnJpZ2h0IC0ga0J1dHRvbldpZHRoLCByY0NsaWVudC50b3ApOworCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTQlRfVlNDUk9MTDoKKyAgICAgICAgcmNNaW5BcmVhID0gQ0ZYX0Zsb2F0UmVjdChyY0NsaWVudC5sZWZ0LCByY1Bvc0J1dHRvbi50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQucmlnaHQsIHJjQ2xpZW50LnRvcCAtIGtCdXR0b25XaWR0aCk7CisgICAgICAgIHJjTWF4QXJlYSA9IENGWF9GbG9hdFJlY3QocmNDbGllbnQubGVmdCwgcmNDbGllbnQuYm90dG9tICsga0J1dHRvbldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LnJpZ2h0LCByY1Bvc0J1dHRvbi5ib3R0b20pOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByY01pbkFyZWEuTm9ybWFsaXplKCk7CisgICAgcmNNYXhBcmVhLk5vcm1hbGl6ZSgpOworCisgICAgaWYgKHJjTWluQXJlYS5Db250YWlucyhwb2ludCkpIHsKKyAgICAgIG1fc0RhdGEuU3ViQmlnKCk7CisgICAgICBpZiAoIU1vdmVQb3NCdXR0b24odHJ1ZSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgTm90aWZ5U2Nyb2xsV2luZG93KCk7CisgICAgfQorCisgICAgaWYgKHJjTWF4QXJlYS5Db250YWlucyhwb2ludCkpIHsKKyAgICAgIG1fc0RhdGEuQWRkQmlnKCk7CisgICAgICBpZiAoIU1vdmVQb3NCdXR0b24odHJ1ZSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgTm90aWZ5U2Nyb2xsV2luZG93KCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1BXTF9TY3JvbGxCYXI6Ok9uTEJ1dHRvblVwKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgeworICBDUFdMX1duZDo6T25MQnV0dG9uVXAocG9pbnQsIG5GbGFnKTsKKworICBpZiAoSGFzRmxhZyhQV1NfQVVUT1RSQU5TUEFSRU5UKSkgeworICAgIGlmIChHZXRUcmFuc3BhcmVuY3koKSAhPSBQV0xfU0NST0xMQkFSX1RSQU5TUEFSRU5DWSkgeworICAgICAgU2V0VHJhbnNwYXJlbmN5KFBXTF9TQ1JPTExCQVJfVFJBTlNQQVJFTkNZKTsKKyAgICAgIGlmICghSW52YWxpZGF0ZVJlY3QobnVsbHB0cikpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIEVuZFRpbWVyKCk7CisgIG1fYk1vdXNlRG93biA9IGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENQV0xfU2Nyb2xsQmFyOjpTZXRTY3JvbGxJbmZvKGNvbnN0IFBXTF9TQ1JPTExfSU5GTyYgaW5mbykgeworICBpZiAoaW5mbyA9PSBtX09yaWdpbkluZm8pCisgICAgcmV0dXJuOworCisgIG1fT3JpZ2luSW5mbyA9IGluZm87CisgIGZsb2F0IGZNYXggPQorICAgICAgc3RkOjptYXgoMC4wZiwgaW5mby5mQ29udGVudE1heCAtIGluZm8uZkNvbnRlbnRNaW4gLSBpbmZvLmZQbGF0ZVdpZHRoKTsKKyAgU2V0U2Nyb2xsUmFuZ2UoMCwgZk1heCwgaW5mby5mUGxhdGVXaWR0aCk7CisgIFNldFNjcm9sbFN0ZXAoaW5mby5mQmlnU3RlcCwgaW5mby5mU21hbGxTdGVwKTsKK30KKwordm9pZCBDUFdMX1Njcm9sbEJhcjo6U2V0U2Nyb2xsUG9zaXRpb24oZmxvYXQgcG9zKSB7CisgIHN3aXRjaCAobV9zYlR5cGUpIHsKKyAgICBjYXNlIFNCVF9IU0NST0xMOgorICAgICAgcG9zID0gcG9zIC0gbV9PcmlnaW5JbmZvLmZDb250ZW50TWluOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTQlRfVlNDUk9MTDoKKyAgICAgIHBvcyA9IG1fT3JpZ2luSW5mby5mQ29udGVudE1heCAtIHBvczsKKyAgICAgIGJyZWFrOworICB9CisgIFNldFNjcm9sbFBvcyhwb3MpOworfQorCit2b2lkIENQV0xfU2Nyb2xsQmFyOjpOb3RpZnlMQnV0dG9uRG93bihDUFdMX1duZCogY2hpbGQsIGNvbnN0IENGWF9Qb2ludEYmIHBvcykgeworICBpZiAoY2hpbGQgPT0gbV9wTWluQnV0dG9uKQorICAgIE9uTWluQnV0dG9uTEJEb3duKHBvcyk7CisgIGVsc2UgaWYgKGNoaWxkID09IG1fcE1heEJ1dHRvbikKKyAgICBPbk1heEJ1dHRvbkxCRG93bihwb3MpOworICBlbHNlIGlmIChjaGlsZCA9PSBtX3BQb3NCdXR0b24pCisgICAgT25Qb3NCdXR0b25MQkRvd24ocG9zKTsKK30KKwordm9pZCBDUFdMX1Njcm9sbEJhcjo6Tm90aWZ5TEJ1dHRvblVwKENQV0xfV25kKiBjaGlsZCwgY29uc3QgQ0ZYX1BvaW50RiYgcG9zKSB7CisgIGlmIChjaGlsZCA9PSBtX3BNaW5CdXR0b24pCisgICAgT25NaW5CdXR0b25MQlVwKHBvcyk7CisgIGVsc2UgaWYgKGNoaWxkID09IG1fcE1heEJ1dHRvbikKKyAgICBPbk1heEJ1dHRvbkxCVXAocG9zKTsKKyAgZWxzZSBpZiAoY2hpbGQgPT0gbV9wUG9zQnV0dG9uKQorICAgIE9uUG9zQnV0dG9uTEJVcChwb3MpOworfQorCit2b2lkIENQV0xfU2Nyb2xsQmFyOjpOb3RpZnlNb3VzZU1vdmUoQ1BXTF9XbmQqIGNoaWxkLCBjb25zdCBDRlhfUG9pbnRGJiBwb3MpIHsKKyAgaWYgKGNoaWxkID09IG1fcE1pbkJ1dHRvbikKKyAgICBPbk1pbkJ1dHRvbk1vdXNlTW92ZShwb3MpOworICBlbHNlIGlmIChjaGlsZCA9PSBtX3BNYXhCdXR0b24pCisgICAgT25NYXhCdXR0b25Nb3VzZU1vdmUocG9zKTsKKyAgZWxzZSBpZiAoY2hpbGQgPT0gbV9wUG9zQnV0dG9uKQorICAgIE9uUG9zQnV0dG9uTW91c2VNb3ZlKHBvcyk7Cit9CisKK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6OkNyZWF0ZUJ1dHRvbnMoY29uc3QgQ3JlYXRlUGFyYW1zJiBjcCkgeworICBDcmVhdGVQYXJhbXMgc2NwID0gY3A7CisgIHNjcC5wUGFyZW50V25kID0gdGhpczsKKyAgc2NwLmR3Qm9yZGVyV2lkdGggPSAyOworICBzY3AubkJvcmRlclN0eWxlID0gQm9yZGVyU3R5bGU6OkJFVkVMRUQ7CisKKyAgc2NwLmR3RmxhZ3MgPQorICAgICAgUFdTX1ZJU0lCTEUgfCBQV1NfQ0hJTEQgfCBQV1NfQk9SREVSIHwgUFdTX0JBQ0tHUk9VTkQgfCBQV1NfTk9SRUZSRVNIQ0xJUDsKKworICBpZiAoIW1fcE1pbkJ1dHRvbikgeworICAgIG1fcE1pbkJ1dHRvbiA9IG5ldyBDUFdMX1NCQnV0dG9uKG1fc2JUeXBlLCBQU0JUX01JTik7CisgICAgbV9wTWluQnV0dG9uLT5DcmVhdGUoc2NwKTsKKyAgfQorCisgIGlmICghbV9wTWF4QnV0dG9uKSB7CisgICAgbV9wTWF4QnV0dG9uID0gbmV3IENQV0xfU0JCdXR0b24obV9zYlR5cGUsIFBTQlRfTUFYKTsKKyAgICBtX3BNYXhCdXR0b24tPkNyZWF0ZShzY3ApOworICB9CisKKyAgaWYgKCFtX3BQb3NCdXR0b24pIHsKKyAgICBtX3BQb3NCdXR0b24gPSBuZXcgQ1BXTF9TQkJ1dHRvbihtX3NiVHlwZSwgUFNCVF9QT1MpOworCisgICAgT2JzZXJ2ZWRQdHIgdGhpc09ic2VydmVkKHRoaXMpOworICAgIGlmICghbV9wUG9zQnV0dG9uLT5TZXRWaXNpYmxlKGZhbHNlKSB8fCAhdGhpc09ic2VydmVkKQorICAgICAgcmV0dXJuOworICAgIG1fcFBvc0J1dHRvbi0+Q3JlYXRlKHNjcCk7CisgIH0KK30KKworZmxvYXQgQ1BXTF9TY3JvbGxCYXI6OkdldFNjcm9sbEJhcldpZHRoKCkgY29uc3QgeworICBpZiAoIUlzVmlzaWJsZSgpKQorICAgIHJldHVybiAwOworCisgIHJldHVybiBQV0xfU0NST0xMQkFSX1dJRFRIOworfQorCit2b2lkIENQV0xfU2Nyb2xsQmFyOjpTZXRTY3JvbGxSYW5nZShmbG9hdCBmTWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZk1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZDbGllbnRXaWR0aCkgeworICBpZiAoIW1fcFBvc0J1dHRvbikKKyAgICByZXR1cm47CisKKyAgbV9zRGF0YS5TZXRTY3JvbGxSYW5nZShmTWluLCBmTWF4KTsKKyAgbV9zRGF0YS5TZXRDbGllbnRXaWR0aChmQ2xpZW50V2lkdGgpOworCisgIE9ic2VydmVkUHRyIHRoaXNPYnNlcnZlZCh0aGlzKTsKKworICBpZiAoSXNGbG9hdFNtYWxsZXIobV9zRGF0YS5TY3JvbGxSYW5nZS5HZXRXaWR0aCgpLCAwLjBmKSkgeworICAgIG1fcFBvc0J1dHRvbi0+U2V0VmlzaWJsZShmYWxzZSk7CisgICAgLy8gTm90ZSwgfHRoaXN8IG1heSBubyBsb25nZXIgYmUgdmlhYmxlIGF0IHRoaXMgcG9pbnQuIElmIG1vcmUgd29yayBuZWVkcworICAgIC8vIHRvIGJlIGRvbmUsIGNoZWNrIHRoaXNPYnNlcnZlZC4KKyAgICByZXR1cm47CisgIH0KKworICBpZiAoIW1fcFBvc0J1dHRvbi0+U2V0VmlzaWJsZSh0cnVlKSB8fCAhdGhpc09ic2VydmVkKQorICAgIHJldHVybjsKKworICBNb3ZlUG9zQnV0dG9uKHRydWUpOworICAvLyBOb3RlLCB8dGhpc3wgbWF5IG5vIGxvbmdlciBiZSB2aWFibGUgYXQgdGhpcyBwb2ludC4gSWYgbW9yZSB3b3JrIG5lZWRzCisgIC8vIHRvIGJlIGRvbmUsIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgTW92ZVBvc0J1dHRvbigpLgorfQorCit2b2lkIENQV0xfU2Nyb2xsQmFyOjpTZXRTY3JvbGxQb3MoZmxvYXQgZlBvcykgeworICBmbG9hdCBmT2xkUG9zID0gbV9zRGF0YS5mU2Nyb2xsUG9zOworICBtX3NEYXRhLlNldFBvcyhmUG9zKTsKKyAgaWYgKCFJc0Zsb2F0RXF1YWwobV9zRGF0YS5mU2Nyb2xsUG9zLCBmT2xkUG9zKSkgeworICAgIE1vdmVQb3NCdXR0b24odHJ1ZSk7CisgICAgLy8gTm90ZSwgfHRoaXN8IG1heSBubyBsb25nZXIgYmUgdmlhYmxlIGF0IHRoaXMgcG9pbnQuIElmIG1vcmUgd29yayBuZWVkcworICAgIC8vIHRvIGJlIGRvbmUsIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgTW92ZVBvc0J1dHRvbigpLgorICB9Cit9CisKK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6OlNldFNjcm9sbFN0ZXAoZmxvYXQgZkJpZ1N0ZXAsIGZsb2F0IGZTbWFsbFN0ZXApIHsKKyAgbV9zRGF0YS5TZXRCaWdTdGVwKGZCaWdTdGVwKTsKKyAgbV9zRGF0YS5TZXRTbWFsbFN0ZXAoZlNtYWxsU3RlcCk7Cit9CisKK2Jvb2wgQ1BXTF9TY3JvbGxCYXI6Ok1vdmVQb3NCdXR0b24oYm9vbCBiUmVmcmVzaCkgeworICBBU1NFUlQobV9wTWluQnV0dG9uKTsKKyAgQVNTRVJUKG1fcE1heEJ1dHRvbik7CisKKyAgaWYgKG1fcFBvc0J1dHRvbi0+SXNWaXNpYmxlKCkpIHsKKyAgICBDRlhfRmxvYXRSZWN0IHJjQ2xpZW50OworICAgIENGWF9GbG9hdFJlY3QgcmNQb3NBcmVhLCByY1Bvc0J1dHRvbjsKKworICAgIHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworICAgIHJjUG9zQXJlYSA9IEdldFNjcm9sbEFyZWEoKTsKKworICAgIGZsb2F0IGZMZWZ0LCBmUmlnaHQsIGZUb3AsIGZCb3R0b207CisKKyAgICBzd2l0Y2ggKG1fc2JUeXBlKSB7CisgICAgICBjYXNlIFNCVF9IU0NST0xMOgorICAgICAgICBmTGVmdCA9IFRydWVUb0ZhY2UobV9zRGF0YS5mU2Nyb2xsUG9zKTsKKyAgICAgICAgZlJpZ2h0ID0gVHJ1ZVRvRmFjZShtX3NEYXRhLmZTY3JvbGxQb3MgKyBtX3NEYXRhLmZDbGllbnRXaWR0aCk7CisKKyAgICAgICAgaWYgKGZSaWdodCAtIGZMZWZ0IDwga1Bvc0J1dHRvbk1pbldpZHRoKQorICAgICAgICAgIGZSaWdodCA9IGZMZWZ0ICsga1Bvc0J1dHRvbk1pbldpZHRoOworCisgICAgICAgIGlmIChmUmlnaHQgPiByY1Bvc0FyZWEucmlnaHQpIHsKKyAgICAgICAgICBmUmlnaHQgPSByY1Bvc0FyZWEucmlnaHQ7CisgICAgICAgICAgZkxlZnQgPSBmUmlnaHQgLSBrUG9zQnV0dG9uTWluV2lkdGg7CisgICAgICAgIH0KKworICAgICAgICByY1Bvc0J1dHRvbiA9CisgICAgICAgICAgICBDRlhfRmxvYXRSZWN0KGZMZWZ0LCByY1Bvc0FyZWEuYm90dG9tLCBmUmlnaHQsIHJjUG9zQXJlYS50b3ApOworCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTQlRfVlNDUk9MTDoKKyAgICAgICAgZkJvdHRvbSA9IFRydWVUb0ZhY2UobV9zRGF0YS5mU2Nyb2xsUG9zICsgbV9zRGF0YS5mQ2xpZW50V2lkdGgpOworICAgICAgICBmVG9wID0gVHJ1ZVRvRmFjZShtX3NEYXRhLmZTY3JvbGxQb3MpOworCisgICAgICAgIGlmIChJc0Zsb2F0U21hbGxlcihmVG9wIC0gZkJvdHRvbSwga1Bvc0J1dHRvbk1pbldpZHRoKSkKKyAgICAgICAgICBmQm90dG9tID0gZlRvcCAtIGtQb3NCdXR0b25NaW5XaWR0aDsKKworICAgICAgICBpZiAoSXNGbG9hdFNtYWxsZXIoZkJvdHRvbSwgcmNQb3NBcmVhLmJvdHRvbSkpIHsKKyAgICAgICAgICBmQm90dG9tID0gcmNQb3NBcmVhLmJvdHRvbTsKKyAgICAgICAgICBmVG9wID0gZkJvdHRvbSArIGtQb3NCdXR0b25NaW5XaWR0aDsKKyAgICAgICAgfQorCisgICAgICAgIHJjUG9zQnV0dG9uID0KKyAgICAgICAgICAgIENGWF9GbG9hdFJlY3QocmNQb3NBcmVhLmxlZnQsIGZCb3R0b20sIHJjUG9zQXJlYS5yaWdodCwgZlRvcCk7CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgT2JzZXJ2ZWRQdHIgdGhpc09ic2VydmVkKHRoaXMpOworCisgICAgbV9wUG9zQnV0dG9uLT5Nb3ZlKHJjUG9zQnV0dG9uLCB0cnVlLCBiUmVmcmVzaCk7CisgICAgaWYgKCF0aGlzT2JzZXJ2ZWQpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDUFdMX1Njcm9sbEJhcjo6T25NaW5CdXR0b25MQkRvd24oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKKyAgbV9zRGF0YS5TdWJTbWFsbCgpOworICBpZiAoIU1vdmVQb3NCdXR0b24odHJ1ZSkpCisgICAgcmV0dXJuOworICBOb3RpZnlTY3JvbGxXaW5kb3coKTsKKworICBtX2JNaW5Pck1heCA9IHRydWU7CisKKyAgRW5kVGltZXIoKTsKKyAgQmVnaW5UaW1lcigxMDApOworfQorCit2b2lkIENQV0xfU2Nyb2xsQmFyOjpPbk1pbkJ1dHRvbkxCVXAoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHt9CisKK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uTWluQnV0dG9uTW91c2VNb3ZlKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7fQorCit2b2lkIENQV0xfU2Nyb2xsQmFyOjpPbk1heEJ1dHRvbkxCRG93bihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICBtX3NEYXRhLkFkZFNtYWxsKCk7CisgIGlmICghTW92ZVBvc0J1dHRvbih0cnVlKSkKKyAgICByZXR1cm47CisgIE5vdGlmeVNjcm9sbFdpbmRvdygpOworCisgIG1fYk1pbk9yTWF4ID0gZmFsc2U7CisKKyAgRW5kVGltZXIoKTsKKyAgQmVnaW5UaW1lcigxMDApOworfQorCit2b2lkIENQV0xfU2Nyb2xsQmFyOjpPbk1heEJ1dHRvbkxCVXAoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHt9CisKK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uTWF4QnV0dG9uTW91c2VNb3ZlKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7fQorCit2b2lkIENQV0xfU2Nyb2xsQmFyOjpPblBvc0J1dHRvbkxCRG93bihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICBtX2JNb3VzZURvd24gPSB0cnVlOworCisgIGlmIChtX3BQb3NCdXR0b24pIHsKKyAgICBDRlhfRmxvYXRSZWN0IHJjUG9zQnV0dG9uID0gbV9wUG9zQnV0dG9uLT5HZXRXaW5kb3dSZWN0KCk7CisKKyAgICBzd2l0Y2ggKG1fc2JUeXBlKSB7CisgICAgICBjYXNlIFNCVF9IU0NST0xMOgorICAgICAgICBtX25PbGRQb3MgPSBwb2ludC54OworICAgICAgICBtX2ZPbGRQb3NCdXR0b24gPSByY1Bvc0J1dHRvbi5sZWZ0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0JUX1ZTQ1JPTEw6CisgICAgICAgIG1fbk9sZFBvcyA9IHBvaW50Lnk7CisgICAgICAgIG1fZk9sZFBvc0J1dHRvbiA9IHJjUG9zQnV0dG9uLnRvcDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uUG9zQnV0dG9uTEJVcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICBpZiAobV9iTW91c2VEb3duKSB7CisgICAgaWYgKCFtX2JOb3RpZnlGb3JldmVyKQorICAgICAgTm90aWZ5U2Nyb2xsV2luZG93KCk7CisgIH0KKyAgbV9iTW91c2VEb3duID0gZmFsc2U7Cit9CisKK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6Ok9uUG9zQnV0dG9uTW91c2VNb3ZlKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIGZsb2F0IGZPbGRTY3JvbGxQb3MgPSBtX3NEYXRhLmZTY3JvbGxQb3M7CisKKyAgZmxvYXQgZk5ld1BvcyA9IDA7CisKKyAgc3dpdGNoIChtX3NiVHlwZSkgeworICAgIGNhc2UgU0JUX0hTQ1JPTEw6CisgICAgICBpZiAoZmFicyhwb2ludC54IC0gbV9uT2xkUG9zKSA8IDEpCisgICAgICAgIHJldHVybjsKKyAgICAgIGZOZXdQb3MgPSBGYWNlVG9UcnVlKG1fZk9sZFBvc0J1dHRvbiArIHBvaW50LnggLSBtX25PbGRQb3MpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTQlRfVlNDUk9MTDoKKyAgICAgIGlmIChmYWJzKHBvaW50LnkgLSBtX25PbGRQb3MpIDwgMSkKKyAgICAgICAgcmV0dXJuOworICAgICAgZk5ld1BvcyA9IEZhY2VUb1RydWUobV9mT2xkUG9zQnV0dG9uICsgcG9pbnQueSAtIG1fbk9sZFBvcyk7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChtX2JNb3VzZURvd24pIHsKKyAgICBzd2l0Y2ggKG1fc2JUeXBlKSB7CisgICAgICBjYXNlIFNCVF9IU0NST0xMOgorCisgICAgICAgIGlmIChJc0Zsb2F0U21hbGxlcihmTmV3UG9zLCBtX3NEYXRhLlNjcm9sbFJhbmdlLmZNaW4pKSB7CisgICAgICAgICAgZk5ld1BvcyA9IG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1pbjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChJc0Zsb2F0QmlnZ2VyKGZOZXdQb3MsIG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1heCkpIHsKKyAgICAgICAgICBmTmV3UG9zID0gbV9zRGF0YS5TY3JvbGxSYW5nZS5mTWF4OworICAgICAgICB9CisKKyAgICAgICAgbV9zRGF0YS5TZXRQb3MoZk5ld1Bvcyk7CisKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNCVF9WU0NST0xMOgorCisgICAgICAgIGlmIChJc0Zsb2F0U21hbGxlcihmTmV3UG9zLCBtX3NEYXRhLlNjcm9sbFJhbmdlLmZNaW4pKSB7CisgICAgICAgICAgZk5ld1BvcyA9IG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1pbjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChJc0Zsb2F0QmlnZ2VyKGZOZXdQb3MsIG1fc0RhdGEuU2Nyb2xsUmFuZ2UuZk1heCkpIHsKKyAgICAgICAgICBmTmV3UG9zID0gbV9zRGF0YS5TY3JvbGxSYW5nZS5mTWF4OworICAgICAgICB9CisKKyAgICAgICAgbV9zRGF0YS5TZXRQb3MoZk5ld1Bvcyk7CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKCFJc0Zsb2F0RXF1YWwoZk9sZFNjcm9sbFBvcywgbV9zRGF0YS5mU2Nyb2xsUG9zKSkgeworICAgICAgaWYgKCFNb3ZlUG9zQnV0dG9uKHRydWUpKQorICAgICAgICByZXR1cm47CisKKyAgICAgIGlmIChtX2JOb3RpZnlGb3JldmVyKQorICAgICAgICBOb3RpZnlTY3JvbGxXaW5kb3coKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBDUFdMX1Njcm9sbEJhcjo6Tm90aWZ5U2Nyb2xsV2luZG93KCkgeworICBDUFdMX1duZCogcFBhcmVudCA9IEdldFBhcmVudFdpbmRvdygpOworICBpZiAoIXBQYXJlbnQgfHwgbV9zYlR5cGUgIT0gU0JUX1ZTQ1JPTEwpCisgICAgcmV0dXJuOworCisgIHBQYXJlbnQtPlNjcm9sbFdpbmRvd1ZlcnRpY2FsbHkobV9PcmlnaW5JbmZvLmZDb250ZW50TWF4IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3NEYXRhLmZTY3JvbGxQb3MpOworfQorCitDRlhfRmxvYXRSZWN0IENQV0xfU2Nyb2xsQmFyOjpHZXRTY3JvbGxBcmVhKCkgY29uc3QgeworICBDRlhfRmxvYXRSZWN0IHJjQ2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOworICBDRlhfRmxvYXRSZWN0IHJjQXJlYTsKKworICBpZiAoIW1fcE1pbkJ1dHRvbiB8fCAhbV9wTWF4QnV0dG9uKQorICAgIHJldHVybiByY0NsaWVudDsKKworICBDRlhfRmxvYXRSZWN0IHJjTWluID0gbV9wTWluQnV0dG9uLT5HZXRXaW5kb3dSZWN0KCk7CisgIENGWF9GbG9hdFJlY3QgcmNNYXggPSBtX3BNYXhCdXR0b24tPkdldFdpbmRvd1JlY3QoKTsKKworICBmbG9hdCBmTWluV2lkdGggPSByY01pbi5yaWdodCAtIHJjTWluLmxlZnQ7CisgIGZsb2F0IGZNaW5IZWlnaHQgPSByY01pbi50b3AgLSByY01pbi5ib3R0b207CisgIGZsb2F0IGZNYXhXaWR0aCA9IHJjTWF4LnJpZ2h0IC0gcmNNYXgubGVmdDsKKyAgZmxvYXQgZk1heEhlaWdodCA9IHJjTWF4LnRvcCAtIHJjTWF4LmJvdHRvbTsKKworICBzd2l0Y2ggKG1fc2JUeXBlKSB7CisgICAgY2FzZSBTQlRfSFNDUk9MTDoKKyAgICAgIGlmIChyY0NsaWVudC5yaWdodCAtIHJjQ2xpZW50LmxlZnQgPiBmTWluV2lkdGggKyBmTWF4V2lkdGggKyAyKSB7CisgICAgICAgIHJjQXJlYSA9IENGWF9GbG9hdFJlY3QocmNDbGllbnQubGVmdCArIGZNaW5XaWR0aCArIDEsIHJjQ2xpZW50LmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY0NsaWVudC5yaWdodCAtIGZNYXhXaWR0aCAtIDEsIHJjQ2xpZW50LnRvcCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByY0FyZWEgPSBDRlhfRmxvYXRSZWN0KHJjQ2xpZW50LmxlZnQgKyBmTWluV2lkdGggKyAxLCByY0NsaWVudC5ib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQubGVmdCArIGZNaW5XaWR0aCArIDEsIHJjQ2xpZW50LnRvcCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIFNCVF9WU0NST0xMOgorICAgICAgaWYgKHJjQ2xpZW50LnRvcCAtIHJjQ2xpZW50LmJvdHRvbSA+IGZNaW5IZWlnaHQgKyBmTWF4SGVpZ2h0ICsgMikgeworICAgICAgICByY0FyZWEgPSBDRlhfRmxvYXRSZWN0KHJjQ2xpZW50LmxlZnQsIHJjQ2xpZW50LmJvdHRvbSArIGZNaW5IZWlnaHQgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjQ2xpZW50LnJpZ2h0LCByY0NsaWVudC50b3AgLSBmTWF4SGVpZ2h0IC0gMSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByY0FyZWEgPQorICAgICAgICAgICAgQ0ZYX0Zsb2F0UmVjdChyY0NsaWVudC5sZWZ0LCByY0NsaWVudC5ib3R0b20gKyBmTWluSGVpZ2h0ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmNDbGllbnQucmlnaHQsIHJjQ2xpZW50LmJvdHRvbSArIGZNaW5IZWlnaHQgKyAxKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9CisKKyAgcmNBcmVhLk5vcm1hbGl6ZSgpOworCisgIHJldHVybiByY0FyZWE7Cit9CisKK2Zsb2F0IENQV0xfU2Nyb2xsQmFyOjpUcnVlVG9GYWNlKGZsb2F0IGZUcnVlKSB7CisgIENGWF9GbG9hdFJlY3QgcmNQb3NBcmVhOworICByY1Bvc0FyZWEgPSBHZXRTY3JvbGxBcmVhKCk7CisKKyAgZmxvYXQgZkZhY3RXaWR0aCA9IG1fc0RhdGEuU2Nyb2xsUmFuZ2UuR2V0V2lkdGgoKSArIG1fc0RhdGEuZkNsaWVudFdpZHRoOworICBmRmFjdFdpZHRoID0gZkZhY3RXaWR0aCA9PSAwID8gMSA6IGZGYWN0V2lkdGg7CisKKyAgZmxvYXQgZkZhY2UgPSAwOworCisgIHN3aXRjaCAobV9zYlR5cGUpIHsKKyAgICBjYXNlIFNCVF9IU0NST0xMOgorICAgICAgZkZhY2UgPSByY1Bvc0FyZWEubGVmdCArCisgICAgICAgICAgICAgIGZUcnVlICogKHJjUG9zQXJlYS5yaWdodCAtIHJjUG9zQXJlYS5sZWZ0KSAvIGZGYWN0V2lkdGg7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNCVF9WU0NST0xMOgorICAgICAgZkZhY2UgPSByY1Bvc0FyZWEudG9wIC0KKyAgICAgICAgICAgICAgZlRydWUgKiAocmNQb3NBcmVhLnRvcCAtIHJjUG9zQXJlYS5ib3R0b20pIC8gZkZhY3RXaWR0aDsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGZGYWNlOworfQorCitmbG9hdCBDUFdMX1Njcm9sbEJhcjo6RmFjZVRvVHJ1ZShmbG9hdCBmRmFjZSkgeworICBDRlhfRmxvYXRSZWN0IHJjUG9zQXJlYTsKKyAgcmNQb3NBcmVhID0gR2V0U2Nyb2xsQXJlYSgpOworCisgIGZsb2F0IGZGYWN0V2lkdGggPSBtX3NEYXRhLlNjcm9sbFJhbmdlLkdldFdpZHRoKCkgKyBtX3NEYXRhLmZDbGllbnRXaWR0aDsKKyAgZkZhY3RXaWR0aCA9IGZGYWN0V2lkdGggPT0gMCA/IDEgOiBmRmFjdFdpZHRoOworCisgIGZsb2F0IGZUcnVlID0gMDsKKworICBzd2l0Y2ggKG1fc2JUeXBlKSB7CisgICAgY2FzZSBTQlRfSFNDUk9MTDoKKyAgICAgIGZUcnVlID0gKGZGYWNlIC0gcmNQb3NBcmVhLmxlZnQpICogZkZhY3RXaWR0aCAvCisgICAgICAgICAgICAgIChyY1Bvc0FyZWEucmlnaHQgLSByY1Bvc0FyZWEubGVmdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFNCVF9WU0NST0xMOgorICAgICAgZlRydWUgPSAocmNQb3NBcmVhLnRvcCAtIGZGYWNlKSAqIGZGYWN0V2lkdGggLworICAgICAgICAgICAgICAocmNQb3NBcmVhLnRvcCAtIHJjUG9zQXJlYS5ib3R0b20pOworICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gZlRydWU7Cit9CisKK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6OkNyZWF0ZUNoaWxkV25kKGNvbnN0IENyZWF0ZVBhcmFtcyYgY3ApIHsKKyAgQ3JlYXRlQnV0dG9ucyhjcCk7Cit9CisKK3ZvaWQgQ1BXTF9TY3JvbGxCYXI6OlRpbWVyUHJvYygpIHsKKyAgUFdMX1NDUk9MTF9QUklWQVRFREFUQSBzVGVtcCA9IG1fc0RhdGE7CisgIGlmIChtX2JNaW5Pck1heCkKKyAgICBtX3NEYXRhLlN1YlNtYWxsKCk7CisgIGVsc2UKKyAgICBtX3NEYXRhLkFkZFNtYWxsKCk7CisKKyAgaWYgKHNUZW1wICE9IG1fc0RhdGEpIHsKKyAgICBpZiAoIU1vdmVQb3NCdXR0b24odHJ1ZSkpCisgICAgICByZXR1cm47CisgICAgTm90aWZ5U2Nyb2xsV2luZG93KCk7CisgIH0KK30KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcHdsL2Nwd2xfc2Nyb2xsX2Jhci5oIGIvZnBkZnNkay9wd2wvY3B3bF9zY3JvbGxfYmFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkyMTczMgotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvcHdsL2Nwd2xfc2Nyb2xsX2Jhci5oCkBAIC0wLDAgKzEsMTg2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlBERlNES19QV0xfQ1BXTF9TQ1JPTExfQkFSX0hfCisjZGVmaW5lIEZQREZTREtfUFdMX0NQV0xfU0NST0xMX0JBUl9IXworCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgorI2luY2x1ZGUgImZwZGZzZGsvcHdsL2Nwd2xfd25kLmgiCisKK2NsYXNzIENQV0xfU0JCdXR0b247CitjbGFzcyBDUFdMX1Njcm9sbEJhcjsKKworc3RydWN0IFBXTF9TQ1JPTExfSU5GTyB7CisgcHVibGljOgorICBQV0xfU0NST0xMX0lORk8oKQorICAgICAgOiBmQ29udGVudE1pbigwLjBmKSwKKyAgICAgICAgZkNvbnRlbnRNYXgoMC4wZiksCisgICAgICAgIGZQbGF0ZVdpZHRoKDAuMGYpLAorICAgICAgICBmQmlnU3RlcCgwLjBmKSwKKyAgICAgICAgZlNtYWxsU3RlcCgwLjBmKSB7fQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQV0xfU0NST0xMX0lORk8mIHRoYXQpIGNvbnN0IHsKKyAgICByZXR1cm4gZkNvbnRlbnRNaW4gPT0gdGhhdC5mQ29udGVudE1pbiAmJiBmQ29udGVudE1heCA9PSB0aGF0LmZDb250ZW50TWF4ICYmCisgICAgICAgICAgIGZQbGF0ZVdpZHRoID09IHRoYXQuZlBsYXRlV2lkdGggJiYgZkJpZ1N0ZXAgPT0gdGhhdC5mQmlnU3RlcCAmJgorICAgICAgICAgICBmU21hbGxTdGVwID09IHRoYXQuZlNtYWxsU3RlcDsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgUFdMX1NDUk9MTF9JTkZPJiB0aGF0KSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gdGhhdCk7CisgIH0KKworICBmbG9hdCBmQ29udGVudE1pbjsKKyAgZmxvYXQgZkNvbnRlbnRNYXg7CisgIGZsb2F0IGZQbGF0ZVdpZHRoOworICBmbG9hdCBmQmlnU3RlcDsKKyAgZmxvYXQgZlNtYWxsU3RlcDsKK307CisKK2VudW0gUFdMX1NDUk9MTEJBUl9UWVBFIHsgU0JUX0hTQ1JPTEwsIFNCVF9WU0NST0xMIH07CisKK2VudW0gUFdMX1NCQlVUVE9OX1RZUEUgeyBQU0JUX01JTiwgUFNCVF9NQVgsIFBTQlRfUE9TIH07CisKK2NsYXNzIENQV0xfU0JCdXR0b24gOiBwdWJsaWMgQ1BXTF9XbmQgeworIHB1YmxpYzoKKyAgQ1BXTF9TQkJ1dHRvbihQV0xfU0NST0xMQkFSX1RZUEUgZVNjcm9sbEJhclR5cGUsCisgICAgICAgICAgICAgICAgUFdMX1NCQlVUVE9OX1RZUEUgZUJ1dHRvblR5cGUpOworICB+Q1BXTF9TQkJ1dHRvbigpIG92ZXJyaWRlOworCisgIC8vIENQV0xfV25kCisgIEJ5dGVTdHJpbmcgR2V0Q2xhc3NOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgT25DcmVhdGUoQ3JlYXRlUGFyYW1zKiBwUGFyYW1zVG9BZGp1c3QpIG92ZXJyaWRlOworICB2b2lkIERyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtdFVzZXIyRGV2aWNlKSBvdmVycmlkZTsKKyAgYm9vbCBPbkxCdXR0b25Eb3duKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgb3ZlcnJpZGU7CisgIGJvb2wgT25MQnV0dG9uVXAoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKKyAgYm9vbCBPbk1vdXNlTW92ZShjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICBQV0xfU0NST0xMQkFSX1RZUEUgbV9lU2Nyb2xsQmFyVHlwZTsKKyAgUFdMX1NCQlVUVE9OX1RZUEUgbV9lU0JCdXR0b25UeXBlOworCisgIGJvb2wgbV9iTW91c2VEb3duOworfTsKKworc3RydWN0IFBXTF9GTE9BVFJBTkdFIHsKKyBwdWJsaWM6CisgIFBXTF9GTE9BVFJBTkdFKCk7CisgIFBXTF9GTE9BVFJBTkdFKGZsb2F0IG1pbiwgZmxvYXQgbWF4KTsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgUFdMX0ZMT0FUUkFOR0UmIHRoYXQpIGNvbnN0IHsKKyAgICByZXR1cm4gZk1pbiA9PSB0aGF0LmZNaW4gJiYgZk1heCA9PSB0aGF0LmZNYXg7CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFBXTF9GTE9BVFJBTkdFJiB0aGF0KSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IHRoYXQpOyB9CisKKyAgdm9pZCBEZWZhdWx0KCk7CisgIHZvaWQgU2V0KGZsb2F0IG1pbiwgZmxvYXQgbWF4KTsKKyAgYm9vbCBJbihmbG9hdCB4KSBjb25zdDsKKyAgZmxvYXQgR2V0V2lkdGgoKSBjb25zdDsKKworICBmbG9hdCBmTWluOworICBmbG9hdCBmTWF4OworfTsKKworc3RydWN0IFBXTF9TQ1JPTExfUFJJVkFURURBVEEgeworIHB1YmxpYzoKKyAgUFdMX1NDUk9MTF9QUklWQVRFREFUQSgpOworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQV0xfU0NST0xMX1BSSVZBVEVEQVRBJiB0aGF0KSBjb25zdCB7CisgICAgcmV0dXJuIFNjcm9sbFJhbmdlID09IHRoYXQuU2Nyb2xsUmFuZ2UgJiYKKyAgICAgICAgICAgZkNsaWVudFdpZHRoID09IHRoYXQuZkNsaWVudFdpZHRoICYmIGZTY3JvbGxQb3MgPT0gdGhhdC5mU2Nyb2xsUG9zICYmCisgICAgICAgICAgIGZCaWdTdGVwID09IHRoYXQuZkJpZ1N0ZXAgJiYgZlNtYWxsU3RlcCA9PSB0aGF0LmZTbWFsbFN0ZXA7CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFBXTF9TQ1JPTExfUFJJVkFURURBVEEmIHRoYXQpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSB0aGF0KTsKKyAgfQorCisgIHZvaWQgRGVmYXVsdCgpOworICB2b2lkIFNldFNjcm9sbFJhbmdlKGZsb2F0IG1pbiwgZmxvYXQgbWF4KTsKKyAgdm9pZCBTZXRDbGllbnRXaWR0aChmbG9hdCB3aWR0aCk7CisgIHZvaWQgU2V0U21hbGxTdGVwKGZsb2F0IHN0ZXApOworICB2b2lkIFNldEJpZ1N0ZXAoZmxvYXQgc3RlcCk7CisgIGJvb2wgU2V0UG9zKGZsb2F0IHBvcyk7CisKKyAgdm9pZCBBZGRTbWFsbCgpOworICB2b2lkIFN1YlNtYWxsKCk7CisgIHZvaWQgQWRkQmlnKCk7CisgIHZvaWQgU3ViQmlnKCk7CisKKyAgUFdMX0ZMT0FUUkFOR0UgU2Nyb2xsUmFuZ2U7CisgIGZsb2F0IGZDbGllbnRXaWR0aDsKKyAgZmxvYXQgZlNjcm9sbFBvczsKKyAgZmxvYXQgZkJpZ1N0ZXA7CisgIGZsb2F0IGZTbWFsbFN0ZXA7Cit9OworCitjbGFzcyBDUFdMX1Njcm9sbEJhciA6IHB1YmxpYyBDUFdMX1duZCB7CisgcHVibGljOgorICBleHBsaWNpdCBDUFdMX1Njcm9sbEJhcihQV0xfU0NST0xMQkFSX1RZUEUgc2JUeXBlID0gU0JUX0hTQ1JPTEwpOworICB+Q1BXTF9TY3JvbGxCYXIoKSBvdmVycmlkZTsKKworICAvLyBDUFdMX1duZDoKKyAgQnl0ZVN0cmluZyBHZXRDbGFzc05hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBPbkNyZWF0ZShDcmVhdGVQYXJhbXMqIHBQYXJhbXNUb0FkanVzdCkgb3ZlcnJpZGU7CisgIHZvaWQgT25EZXN0cm95KCkgb3ZlcnJpZGU7CisgIGJvb2wgUmVQb3NDaGlsZFduZCgpIG92ZXJyaWRlOworICB2b2lkIERyYXdUaGlzQXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtdFVzZXIyRGV2aWNlKSBvdmVycmlkZTsKKyAgYm9vbCBPbkxCdXR0b25Eb3duKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZykgb3ZlcnJpZGU7CisgIGJvb2wgT25MQnV0dG9uVXAoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSBvdmVycmlkZTsKKyAgdm9pZCBTZXRTY3JvbGxJbmZvKGNvbnN0IFBXTF9TQ1JPTExfSU5GTyYgaW5mbykgb3ZlcnJpZGU7CisgIHZvaWQgU2V0U2Nyb2xsUG9zaXRpb24oZmxvYXQgcG9zKSBvdmVycmlkZTsKKyAgdm9pZCBOb3RpZnlMQnV0dG9uRG93bihDUFdMX1duZCogY2hpbGQsIGNvbnN0IENGWF9Qb2ludEYmIHBvcykgb3ZlcnJpZGU7CisgIHZvaWQgTm90aWZ5TEJ1dHRvblVwKENQV0xfV25kKiBjaGlsZCwgY29uc3QgQ0ZYX1BvaW50RiYgcG9zKSBvdmVycmlkZTsKKyAgdm9pZCBOb3RpZnlNb3VzZU1vdmUoQ1BXTF9XbmQqIGNoaWxkLCBjb25zdCBDRlhfUG9pbnRGJiBwb3MpIG92ZXJyaWRlOworICB2b2lkIENyZWF0ZUNoaWxkV25kKGNvbnN0IENyZWF0ZVBhcmFtcyYgY3ApIG92ZXJyaWRlOworICB2b2lkIFRpbWVyUHJvYygpIG92ZXJyaWRlOworCisgIGZsb2F0IEdldFNjcm9sbEJhcldpZHRoKCkgY29uc3Q7CisgIFBXTF9TQ1JPTExCQVJfVFlQRSBHZXRTY3JvbGxCYXJUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9zYlR5cGU7IH0KKworICB2b2lkIFNldE5vdGlmeUZvcmV2ZXIoYm9vbCBiRm9yZXZlcikgeyBtX2JOb3RpZnlGb3JldmVyID0gYkZvcmV2ZXI7IH0KKworIHByb3RlY3RlZDoKKyAgdm9pZCBTZXRTY3JvbGxSYW5nZShmbG9hdCBmTWluLCBmbG9hdCBmTWF4LCBmbG9hdCBmQ2xpZW50V2lkdGgpOworICB2b2lkIFNldFNjcm9sbFBvcyhmbG9hdCBmUG9zKTsKKworICAvLyBSZXR1cm5zIHx0cnVlfCBpZmYgdGhpcyBpbnN0YW5jZSBpcyBzdGlsbCBhbGxvY2F0ZWQuCisgIGJvb2wgTW92ZVBvc0J1dHRvbihib29sIGJSZWZyZXNoKTsKKyAgdm9pZCBTZXRTY3JvbGxTdGVwKGZsb2F0IGZCaWdTdGVwLCBmbG9hdCBmU21hbGxTdGVwKTsKKyAgdm9pZCBOb3RpZnlTY3JvbGxXaW5kb3coKTsKKyAgQ0ZYX0Zsb2F0UmVjdCBHZXRTY3JvbGxBcmVhKCkgY29uc3Q7CisKKyBwcml2YXRlOgorICB2b2lkIENyZWF0ZUJ1dHRvbnMoY29uc3QgQ3JlYXRlUGFyYW1zJiBjcCk7CisKKyAgdm9pZCBPbk1pbkJ1dHRvbkxCRG93bihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7CisgIHZvaWQgT25NaW5CdXR0b25MQlVwKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKKyAgdm9pZCBPbk1pbkJ1dHRvbk1vdXNlTW92ZShjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7CisKKyAgdm9pZCBPbk1heEJ1dHRvbkxCRG93bihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7CisgIHZvaWQgT25NYXhCdXR0b25MQlVwKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKKyAgdm9pZCBPbk1heEJ1dHRvbk1vdXNlTW92ZShjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7CisKKyAgdm9pZCBPblBvc0J1dHRvbkxCRG93bihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7CisgIHZvaWQgT25Qb3NCdXR0b25MQlVwKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKKyAgdm9pZCBPblBvc0J1dHRvbk1vdXNlTW92ZShjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7CisKKyAgZmxvYXQgVHJ1ZVRvRmFjZShmbG9hdCk7CisgIGZsb2F0IEZhY2VUb1RydWUoZmxvYXQpOworCisgIFBXTF9TQ1JPTExCQVJfVFlQRSBtX3NiVHlwZTsKKyAgUFdMX1NDUk9MTF9JTkZPIG1fT3JpZ2luSW5mbzsKKyAgVW5vd25lZFB0cjxDUFdMX1NCQnV0dG9uPiBtX3BNaW5CdXR0b247CisgIFVub3duZWRQdHI8Q1BXTF9TQkJ1dHRvbj4gbV9wTWF4QnV0dG9uOworICBVbm93bmVkUHRyPENQV0xfU0JCdXR0b24+IG1fcFBvc0J1dHRvbjsKKyAgUFdMX1NDUk9MTF9QUklWQVRFREFUQSBtX3NEYXRhOworICBib29sIG1fYk1vdXNlRG93bjsKKyAgYm9vbCBtX2JNaW5Pck1heDsKKyAgYm9vbCBtX2JOb3RpZnlGb3JldmVyOworICBmbG9hdCBtX25PbGRQb3M7CisgIGZsb2F0IG1fZk9sZFBvc0J1dHRvbjsKK307CisKKyNlbmRpZiAgLy8gRlBERlNES19QV0xfQ1BXTF9TQ1JPTExfQkFSX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3B3bC9jcHdsX3NwZWNpYWxfYnV0dG9uLmNwcCBiL2ZwZGZzZGsvcHdsL2Nwd2xfc3BlY2lhbF9idXR0b24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkY2E2N2UKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL3B3bC9jcHdsX3NwZWNpYWxfYnV0dG9uLmNwcApAQCAtMCwwICsxLDgwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX3NwZWNpYWxfYnV0dG9uLmgiCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF9idXR0b24uaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX3duZC5oIgorCitDUFdMX1B1c2hCdXR0b246OkNQV0xfUHVzaEJ1dHRvbigpIHt9CisKK0NQV0xfUHVzaEJ1dHRvbjo6fkNQV0xfUHVzaEJ1dHRvbigpIHt9CisKK0J5dGVTdHJpbmcgQ1BXTF9QdXNoQnV0dG9uOjpHZXRDbGFzc05hbWUoKSBjb25zdCB7CisgIHJldHVybiAiQ1BXTF9QdXNoQnV0dG9uIjsKK30KKworQ0ZYX0Zsb2F0UmVjdCBDUFdMX1B1c2hCdXR0b246OkdldEZvY3VzUmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIEdldFdpbmRvd1JlY3QoKS5HZXREZWZsYXRlZChzdGF0aWNfY2FzdDxmbG9hdD4oR2V0Qm9yZGVyV2lkdGgoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KEdldEJvcmRlcldpZHRoKCkpKTsKK30KKworQ1BXTF9DaGVja0JveDo6Q1BXTF9DaGVja0JveCgpIDogbV9iQ2hlY2tlZChmYWxzZSkge30KKworQ1BXTF9DaGVja0JveDo6fkNQV0xfQ2hlY2tCb3goKSB7fQorCitCeXRlU3RyaW5nIENQV0xfQ2hlY2tCb3g6OkdldENsYXNzTmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuICJDUFdMX0NoZWNrQm94IjsKK30KKwordm9pZCBDUFdMX0NoZWNrQm94OjpTZXRDaGVjayhib29sIGJDaGVjaykgeworICBtX2JDaGVja2VkID0gYkNoZWNrOworfQorCitib29sIENQV0xfQ2hlY2tCb3g6OklzQ2hlY2tlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYkNoZWNrZWQ7Cit9CisKK2Jvb2wgQ1BXTF9DaGVja0JveDo6T25MQnV0dG9uVXAoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSB7CisgIGlmIChJc1JlYWRPbmx5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIFNldENoZWNrKCFJc0NoZWNrZWQoKSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENQV0xfQ2hlY2tCb3g6Ok9uQ2hhcih1aW50MTZfdCBuQ2hhciwgdWludDMyX3QgbkZsYWcpIHsKKyAgU2V0Q2hlY2soIUlzQ2hlY2tlZCgpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0NQV0xfUmFkaW9CdXR0b246OkNQV0xfUmFkaW9CdXR0b24oKSA6IG1fYkNoZWNrZWQoZmFsc2UpIHt9CisKK0NQV0xfUmFkaW9CdXR0b246On5DUFdMX1JhZGlvQnV0dG9uKCkge30KKworQnl0ZVN0cmluZyBDUFdMX1JhZGlvQnV0dG9uOjpHZXRDbGFzc05hbWUoKSBjb25zdCB7CisgIHJldHVybiAiQ1BXTF9SYWRpb0J1dHRvbiI7Cit9CisKK2Jvb2wgQ1BXTF9SYWRpb0J1dHRvbjo6T25MQnV0dG9uVXAoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKSB7CisgIGlmIChJc1JlYWRPbmx5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIFNldENoZWNrKHRydWUpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDUFdMX1JhZGlvQnV0dG9uOjpTZXRDaGVjayhib29sIGJDaGVjaykgeworICBtX2JDaGVja2VkID0gYkNoZWNrOworfQorCitib29sIENQV0xfUmFkaW9CdXR0b246OklzQ2hlY2tlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYkNoZWNrZWQ7Cit9CisKK2Jvb2wgQ1BXTF9SYWRpb0J1dHRvbjo6T25DaGFyKHVpbnQxNl90IG5DaGFyLCB1aW50MzJfdCBuRmxhZykgeworICBTZXRDaGVjayh0cnVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3B3bC9jcHdsX3NwZWNpYWxfYnV0dG9uLmggYi9mcGRmc2RrL3B3bC9jcHdsX3NwZWNpYWxfYnV0dG9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc2YjUyOQotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvcHdsL2Nwd2xfc3BlY2lhbF9idXR0b24uaApAQCAtMCwwICsxLDU2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlBERlNES19QV0xfQ1BXTF9TUEVDSUFMX0JVVFRPTl9IXworI2RlZmluZSBGUERGU0RLX1BXTF9DUFdMX1NQRUNJQUxfQlVUVE9OX0hfCisKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX2J1dHRvbi5oIgorCitjbGFzcyBDUFdMX1B1c2hCdXR0b24gOiBwdWJsaWMgQ1BXTF9CdXR0b24geworIHB1YmxpYzoKKyAgQ1BXTF9QdXNoQnV0dG9uKCk7CisgIH5DUFdMX1B1c2hCdXR0b24oKSBvdmVycmlkZTsKKworICAvLyBDUFdMX0J1dHRvbgorICBCeXRlU3RyaW5nIEdldENsYXNzTmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICBDRlhfRmxvYXRSZWN0IEdldEZvY3VzUmVjdCgpIGNvbnN0IG92ZXJyaWRlOworfTsKKworY2xhc3MgQ1BXTF9DaGVja0JveCA6IHB1YmxpYyBDUFdMX0J1dHRvbiB7CisgcHVibGljOgorICBDUFdMX0NoZWNrQm94KCk7CisgIH5DUFdMX0NoZWNrQm94KCkgb3ZlcnJpZGU7CisKKyAgLy8gQ1BXTF9CdXR0b24KKyAgQnl0ZVN0cmluZyBHZXRDbGFzc05hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBPbkxCdXR0b25VcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOworICBib29sIE9uQ2hhcih1aW50MTZfdCBuQ2hhciwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOworCisgIHZvaWQgU2V0Q2hlY2soYm9vbCBiQ2hlY2spOworICBib29sIElzQ2hlY2tlZCgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgYm9vbCBtX2JDaGVja2VkOworfTsKKworY2xhc3MgQ1BXTF9SYWRpb0J1dHRvbiA6IHB1YmxpYyBDUFdMX0J1dHRvbiB7CisgcHVibGljOgorICBDUFdMX1JhZGlvQnV0dG9uKCk7CisgIH5DUFdMX1JhZGlvQnV0dG9uKCkgb3ZlcnJpZGU7CisKKyAgLy8gQ1BXTF9CdXR0b24KKyAgQnl0ZVN0cmluZyBHZXRDbGFzc05hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBPbkxCdXR0b25VcChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOworICBib29sIE9uQ2hhcih1aW50MTZfdCBuQ2hhciwgdWludDMyX3QgbkZsYWcpIG92ZXJyaWRlOworCisgIHZvaWQgU2V0Q2hlY2soYm9vbCBiQ2hlY2spOworICBib29sIElzQ2hlY2tlZCgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgYm9vbCBtX2JDaGVja2VkOworfTsKKworI2VuZGlmICAvLyBGUERGU0RLX1BXTF9DUFdMX1NQRUNJQUxfQlVUVE9OX0hfCmRpZmYgLS1naXQgYS9mcGRmc2RrL3B3bC9jcHdsX3RpbWVyLmNwcCBiL2ZwZGZzZGsvcHdsL2Nwd2xfdGltZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZjgxZmMKLS0tIC9kZXYvbnVsbAorKysgYi9mcGRmc2RrL3B3bC9jcHdsX3RpbWVyLmNwcApAQCAtMCwwICsxLDYyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX3RpbWVyLmgiCisKKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlICJmcGRmc2RrL2NmeF9zeXN0ZW1oYW5kbGVyLmgiCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF90aW1lcl9oYW5kbGVyLmgiCisKK25hbWVzcGFjZSB7CisKK3N0ZDo6bWFwPGludDMyX3QsIENQV0xfVGltZXIqPiYgR2V0UFdMVGltZU1hcCgpIHsKKyAgLy8gTGVhayB0aGUgb2JqZWN0IGF0IHNodXRkb3duLgorICBzdGF0aWMgYXV0byogdGltZU1hcCA9IG5ldyBzdGQ6Om1hcDxpbnQzMl90LCBDUFdMX1RpbWVyKj47CisgIHJldHVybiAqdGltZU1hcDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0NQV0xfVGltZXI6OkNQV0xfVGltZXIoQ1BXTF9UaW1lckhhbmRsZXIqIHBBdHRhY2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1N5c3RlbUhhbmRsZXIqIHBTeXN0ZW1IYW5kbGVyKQorICAgIDogbV9uVGltZXJJRCgwKSwgbV9wQXR0YWNoZWQocEF0dGFjaGVkKSwgbV9wU3lzdGVtSGFuZGxlcihwU3lzdGVtSGFuZGxlcikgeworICBBU1NFUlQobV9wQXR0YWNoZWQpOworICBBU1NFUlQobV9wU3lzdGVtSGFuZGxlcik7Cit9CisKK0NQV0xfVGltZXI6On5DUFdMX1RpbWVyKCkgeworICBLaWxsUFdMVGltZXIoKTsKK30KKworaW50MzJfdCBDUFdMX1RpbWVyOjpTZXRQV0xUaW1lcihpbnQzMl90IG5FbGFwc2UpIHsKKyAgaWYgKG1fblRpbWVySUQgIT0gMCkKKyAgICBLaWxsUFdMVGltZXIoKTsKKyAgbV9uVGltZXJJRCA9IG1fcFN5c3RlbUhhbmRsZXItPlNldFRpbWVyKG5FbGFwc2UsIFRpbWVyUHJvYyk7CisKKyAgR2V0UFdMVGltZU1hcCgpW21fblRpbWVySURdID0gdGhpczsKKyAgcmV0dXJuIG1fblRpbWVySUQ7Cit9CisKK3ZvaWQgQ1BXTF9UaW1lcjo6S2lsbFBXTFRpbWVyKCkgeworICBpZiAobV9uVGltZXJJRCA9PSAwKQorICAgIHJldHVybjsKKworICBtX3BTeXN0ZW1IYW5kbGVyLT5LaWxsVGltZXIobV9uVGltZXJJRCk7CisgIEdldFBXTFRpbWVNYXAoKS5lcmFzZShtX25UaW1lcklEKTsKKyAgbV9uVGltZXJJRCA9IDA7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDUFdMX1RpbWVyOjpUaW1lclByb2MoaW50MzJfdCBpZEV2ZW50KSB7CisgIGF1dG8gaXQgPSBHZXRQV0xUaW1lTWFwKCkuZmluZChpZEV2ZW50KTsKKyAgaWYgKGl0ID09IEdldFBXTFRpbWVNYXAoKS5lbmQoKSkKKyAgICByZXR1cm47CisKKyAgQ1BXTF9UaW1lciogcFRpbWVyID0gaXQtPnNlY29uZDsKKyAgaWYgKHBUaW1lci0+bV9wQXR0YWNoZWQpCisgICAgcFRpbWVyLT5tX3BBdHRhY2hlZC0+VGltZXJQcm9jKCk7Cit9CmRpZmYgLS1naXQgYS9mcGRmc2RrL3B3bC9jcHdsX3RpbWVyLmggYi9mcGRmc2RrL3B3bC9jcHdsX3RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUwODJhYgotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvcHdsL2Nwd2xfdGltZXIuaApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlBERlNES19QV0xfQ1BXTF9USU1FUl9IXworI2RlZmluZSBGUERGU0RLX1BXTF9DUFdMX1RJTUVSX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisKK2NsYXNzIENGWF9TeXN0ZW1IYW5kbGVyOworY2xhc3MgQ1BXTF9UaW1lckhhbmRsZXI7CisKK2NsYXNzIENQV0xfVGltZXIgeworIHB1YmxpYzoKKyAgQ1BXTF9UaW1lcihDUFdMX1RpbWVySGFuZGxlciogcEF0dGFjaGVkLCBDRlhfU3lzdGVtSGFuZGxlciogcFN5c3RlbUhhbmRsZXIpOworICB2aXJ0dWFsIH5DUFdMX1RpbWVyKCk7CisKKyAgc3RhdGljIHZvaWQgVGltZXJQcm9jKGludDMyX3QgaWRFdmVudCk7CisKKyAgaW50MzJfdCBTZXRQV0xUaW1lcihpbnQzMl90IG5FbGFwc2UpOworICB2b2lkIEtpbGxQV0xUaW1lcigpOworCisgcHJpdmF0ZToKKyAgaW50MzJfdCBtX25UaW1lcklEOworICBVbm93bmVkUHRyPENQV0xfVGltZXJIYW5kbGVyPiBtX3BBdHRhY2hlZDsKKyAgVW5vd25lZFB0cjxDRlhfU3lzdGVtSGFuZGxlcj4gbV9wU3lzdGVtSGFuZGxlcjsKK307CisKKyNlbmRpZiAgLy8gRlBERlNES19QV0xfQ1BXTF9USU1FUl9IXwpkaWZmIC0tZ2l0IGEvZnBkZnNkay9wd2wvY3B3bF90aW1lcl9oYW5kbGVyLmNwcCBiL2ZwZGZzZGsvcHdsL2Nwd2xfdGltZXJfaGFuZGxlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhZjMwNgotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvcHdsL2Nwd2xfdGltZXJfaGFuZGxlci5jcHAKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF90aW1lcl9oYW5kbGVyLmgiCisKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX3RpbWVyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCitDUFdMX1RpbWVySGFuZGxlcjo6Q1BXTF9UaW1lckhhbmRsZXIoKSB7fQorCitDUFdMX1RpbWVySGFuZGxlcjo6fkNQV0xfVGltZXJIYW5kbGVyKCkge30KKwordm9pZCBDUFdMX1RpbWVySGFuZGxlcjo6QmVnaW5UaW1lcihpbnQzMl90IG5FbGFwc2UpIHsKKyAgaWYgKCFtX3BUaW1lcikKKyAgICBtX3BUaW1lciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUFdMX1RpbWVyPih0aGlzLCBHZXRTeXN0ZW1IYW5kbGVyKCkpOworICBtX3BUaW1lci0+U2V0UFdMVGltZXIobkVsYXBzZSk7Cit9CisKK3ZvaWQgQ1BXTF9UaW1lckhhbmRsZXI6OkVuZFRpbWVyKCkgeworICBpZiAobV9wVGltZXIpCisgICAgbV9wVGltZXItPktpbGxQV0xUaW1lcigpOworfQorCit2b2lkIENQV0xfVGltZXJIYW5kbGVyOjpUaW1lclByb2MoKSB7fQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9wd2wvY3B3bF90aW1lcl9oYW5kbGVyLmggYi9mcGRmc2RrL3B3bC9jcHdsX3RpbWVyX2hhbmRsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjA4ZTFjCi0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9wd2wvY3B3bF90aW1lcl9oYW5kbGVyLmgKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZQREZTREtfUFdMX0NQV0xfVElNRVJfSEFORExFUl9IXworI2RlZmluZSBGUERGU0RLX1BXTF9DUFdMX1RJTUVSX0hBTkRMRVJfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworY2xhc3MgQ0ZYX1N5c3RlbUhhbmRsZXI7CitjbGFzcyBDUFdMX1RpbWVyOworCitjbGFzcyBDUFdMX1RpbWVySGFuZGxlciB7CisgcHVibGljOgorICBDUFdMX1RpbWVySGFuZGxlcigpOworICB2aXJ0dWFsIH5DUFdMX1RpbWVySGFuZGxlcigpOworCisgIHZpcnR1YWwgdm9pZCBUaW1lclByb2MoKTsKKyAgdmlydHVhbCBDRlhfU3lzdGVtSGFuZGxlciogR2V0U3lzdGVtSGFuZGxlcigpIGNvbnN0ID0gMDsKKworICB2b2lkIEJlZ2luVGltZXIoaW50MzJfdCBuRWxhcHNlKTsKKyAgdm9pZCBFbmRUaW1lcigpOworCisgcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPENQV0xfVGltZXI+IG1fcFRpbWVyOworfTsKKworI2VuZGlmICAvLyBGUERGU0RLX1BXTF9DUFdMX1RJTUVSX0hBTkRMRVJfSF8KZGlmZiAtLWdpdCBhL2ZwZGZzZGsvcHdsL2Nwd2xfd25kLmNwcCBiL2ZwZGZzZGsvcHdsL2Nwd2xfd25kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjhkYjc0Ci0tLSAvZGV2L251bGwKKysrIGIvZnBkZnNkay9wd2wvY3B3bF93bmQuY3BwCkBAIC0wLDAgKzEsODAxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX3duZC5oIgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX3Njcm9sbF9iYXIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRGb250U2l6ZSA9IDkuMGY7CisKK30gIC8vIG5hbWVzcGFjZQorCitDUFdMX1duZDo6Q3JlYXRlUGFyYW1zOjpDcmVhdGVQYXJhbXMoKQorICAgIDogcmNSZWN0V25kKDAsIDAsIDAsIDApLAorICAgICAgcFN5c3RlbUhhbmRsZXIobnVsbHB0ciksCisgICAgICBwRm9udE1hcChudWxscHRyKSwKKyAgICAgIHBQcm92aWRlcihudWxscHRyKSwKKyAgICAgIHBGb2N1c0hhbmRsZXIobnVsbHB0ciksCisgICAgICBkd0ZsYWdzKDApLAorICAgICAgc0JhY2tncm91bmRDb2xvcigpLAorICAgICAgcEF0dGFjaGVkV2lkZ2V0KG51bGxwdHIpLAorICAgICAgbkJvcmRlclN0eWxlKEJvcmRlclN0eWxlOjpTT0xJRCksCisgICAgICBkd0JvcmRlcldpZHRoKDEpLAorICAgICAgc0JvcmRlckNvbG9yKCksCisgICAgICBzVGV4dENvbG9yKCksCisgICAgICBuVHJhbnNwYXJlbmN5KDI1NSksCisgICAgICBmRm9udFNpemUoa0RlZmF1bHRGb250U2l6ZSksCisgICAgICBzRGFzaCgzLCAwLCAwKSwKKyAgICAgIHBBdHRhY2hlZERhdGEobnVsbHB0ciksCisgICAgICBwUGFyZW50V25kKG51bGxwdHIpLAorICAgICAgcE1zZ0NvbnRyb2wobnVsbHB0ciksCisgICAgICBlQ3Vyc29yVHlwZShGWENUX0FSUk9XKSB7fQorCitDUFdMX1duZDo6Q3JlYXRlUGFyYW1zOjpDcmVhdGVQYXJhbXMoY29uc3QgQ3JlYXRlUGFyYW1zJiBvdGhlcikgPSBkZWZhdWx0OworCitDUFdMX1duZDo6Q3JlYXRlUGFyYW1zOjp+Q3JlYXRlUGFyYW1zKCkgPSBkZWZhdWx0OworCitjbGFzcyBDUFdMX01zZ0NvbnRyb2wgOiBwdWJsaWMgT2JzZXJ2YWJsZTxDUFdMX01zZ0NvbnRyb2w+IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENQV0xfTXNnQ29udHJvbChDUFdMX1duZCogcFduZCkgOiBtX3BDcmVhdGVkV25kKHBXbmQpIHt9CisgIH5DUFdMX01zZ0NvbnRyb2woKSB7fQorCisgIGJvb2wgSXNXbmRDcmVhdGVkKGNvbnN0IENQV0xfV25kKiBwV25kKSBjb25zdCB7CisgICAgcmV0dXJuIG1fcENyZWF0ZWRXbmQgPT0gcFduZDsKKyAgfQorCisgIGJvb2wgSXNXbmRDYXB0dXJlTW91c2UoY29uc3QgQ1BXTF9XbmQqIHBXbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gcFduZCAmJiBwZGZpdW06OkNvbnRhaW5zVmFsdWUobV9hTW91c2VQYXRoLCBwV25kKTsKKyAgfQorCisgIGJvb2wgSXNNYWluQ2FwdHVyZUtleWJvYXJkKGNvbnN0IENQV0xfV25kKiBwV25kKSBjb25zdCB7CisgICAgcmV0dXJuIHBXbmQgPT0gbV9wTWFpbktleWJvYXJkV25kOworICB9CisKKyAgYm9vbCBJc1duZENhcHR1cmVLZXlib2FyZChjb25zdCBDUFdMX1duZCogcFduZCkgY29uc3QgeworICAgIHJldHVybiBwV25kICYmIHBkZml1bTo6Q29udGFpbnNWYWx1ZShtX2FLZXlib2FyZFBhdGgsIHBXbmQpOworICB9CisKKyAgdm9pZCBTZXRGb2N1cyhDUFdMX1duZCogcFduZCkgeworICAgIG1fYUtleWJvYXJkUGF0aC5jbGVhcigpOworICAgIGlmICghcFduZCkKKyAgICAgIHJldHVybjsKKworICAgIG1fcE1haW5LZXlib2FyZFduZCA9IHBXbmQ7CisgICAgQ1BXTF9XbmQqIHBQYXJlbnQgPSBwV25kOworICAgIHdoaWxlIChwUGFyZW50KSB7CisgICAgICBtX2FLZXlib2FyZFBhdGgucHVzaF9iYWNrKHBQYXJlbnQpOworICAgICAgcFBhcmVudCA9IHBQYXJlbnQtPkdldFBhcmVudFdpbmRvdygpOworICAgIH0KKyAgICAvLyBOb3RlLCBwV25kIG1heSBnZXQgZGVzdHJveWVkIGluIHRoZSBPblNldEZvY3VzIGNhbGwuCisgICAgcFduZC0+T25TZXRGb2N1cygpOworICB9CisKKyAgdm9pZCBLaWxsRm9jdXMoKSB7CisgICAgT2JzZXJ2ZWRQdHIgb2JzZXJ2ZWRfcHRyKHRoaXMpOworICAgIGlmICghbV9hS2V5Ym9hcmRQYXRoLmVtcHR5KCkpCisgICAgICBpZiAoQ1BXTF9XbmQqIHBXbmQgPSBtX2FLZXlib2FyZFBhdGhbMF0pCisgICAgICAgIHBXbmQtPk9uS2lsbEZvY3VzKCk7CisgICAgaWYgKCFvYnNlcnZlZF9wdHIpCisgICAgICByZXR1cm47CisKKyAgICBtX3BNYWluS2V5Ym9hcmRXbmQgPSBudWxscHRyOworICAgIG1fYUtleWJvYXJkUGF0aC5jbGVhcigpOworICB9CisKKyAgdm9pZCBTZXRDYXB0dXJlKENQV0xfV25kKiBwV25kKSB7CisgICAgbV9hTW91c2VQYXRoLmNsZWFyKCk7CisgICAgaWYgKHBXbmQpIHsKKyAgICAgIENQV0xfV25kKiBwUGFyZW50ID0gcFduZDsKKyAgICAgIHdoaWxlIChwUGFyZW50KSB7CisgICAgICAgIG1fYU1vdXNlUGF0aC5wdXNoX2JhY2socFBhcmVudCk7CisgICAgICAgIHBQYXJlbnQgPSBwUGFyZW50LT5HZXRQYXJlbnRXaW5kb3coKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICB2b2lkIFJlbGVhc2VDYXB0dXJlKCkgeworICAgIG1fYU1vdXNlUGF0aC5jbGVhcigpOworICB9CisKKyAgQ1BXTF9XbmQqIEdldEZvY3VzZWRXaW5kb3coKSBjb25zdCB7IHJldHVybiBtX3BNYWluS2V5Ym9hcmRXbmQuR2V0KCk7IH0KKworIHByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPENQV0xfV25kKj4gbV9hTW91c2VQYXRoOworICBzdGQ6OnZlY3RvcjxDUFdMX1duZCo+IG1fYUtleWJvYXJkUGF0aDsKKyAgVW5vd25lZFB0cjxDUFdMX1duZD4gbV9wQ3JlYXRlZFduZDsKKyAgVW5vd25lZFB0cjxDUFdMX1duZD4gbV9wTWFpbktleWJvYXJkV25kOworfTsKKworQ1BXTF9XbmQ6OkNQV0xfV25kKCkKKyAgICA6IG1fcmNXaW5kb3coKSwKKyAgICAgIG1fcmNDbGlwKCksCisgICAgICBtX2JDcmVhdGVkKGZhbHNlKSwKKyAgICAgIG1fYlZpc2libGUoZmFsc2UpLAorICAgICAgbV9iTm90aWZ5aW5nKGZhbHNlKSwKKyAgICAgIG1fYkVuYWJsZWQodHJ1ZSkge30KKworQ1BXTF9XbmQ6On5DUFdMX1duZCgpIHsKKyAgQVNTRVJUKCFtX2JDcmVhdGVkKTsKK30KKworQnl0ZVN0cmluZyBDUFdMX1duZDo6R2V0Q2xhc3NOYW1lKCkgY29uc3QgeworICByZXR1cm4gIkNQV0xfV25kIjsKK30KKwordm9pZCBDUFdMX1duZDo6Q3JlYXRlKGNvbnN0IENyZWF0ZVBhcmFtcyYgY3ApIHsKKyAgaWYgKElzVmFsaWQoKSkKKyAgICByZXR1cm47CisKKyAgbV9DcmVhdGlvblBhcmFtcyA9IGNwOworICBPbkNyZWF0ZSgmbV9DcmVhdGlvblBhcmFtcyk7CisgIG1fQ3JlYXRpb25QYXJhbXMucmNSZWN0V25kLk5vcm1hbGl6ZSgpOworICBtX3JjV2luZG93ID0gbV9DcmVhdGlvblBhcmFtcy5yY1JlY3RXbmQ7CisgIG1fcmNDbGlwID0gbV9yY1dpbmRvdzsKKyAgaWYgKCFtX3JjQ2xpcC5Jc0VtcHR5KCkpIHsKKyAgICBtX3JjQ2xpcC5JbmZsYXRlKDEuMGYsIDEuMGYpOworICAgIG1fcmNDbGlwLk5vcm1hbGl6ZSgpOworICB9CisgIENyZWF0ZU1zZ0NvbnRyb2woKTsKKyAgaWYgKG1fQ3JlYXRpb25QYXJhbXMucFBhcmVudFduZCkKKyAgICBtX0NyZWF0aW9uUGFyYW1zLnBQYXJlbnRXbmQtPkFkZENoaWxkKHRoaXMpOworCisgIENyZWF0ZVBhcmFtcyBjY3AgPSBtX0NyZWF0aW9uUGFyYW1zOworICBjY3AuZHdGbGFncyAmPSAweEZGRkYwMDAwTDsgIC8vIHJlbW92ZSBzdWIgc3R5bGVzCisgIENyZWF0ZVNjcm9sbEJhcihjY3ApOworICBDcmVhdGVDaGlsZFduZChjY3ApOworICBtX2JWaXNpYmxlID0gSGFzRmxhZyhQV1NfVklTSUJMRSk7CisgIE9uQ3JlYXRlZCgpOworICBpZiAoIVJlUG9zQ2hpbGRXbmQoKSkKKyAgICByZXR1cm47CisKKyAgbV9iQ3JlYXRlZCA9IHRydWU7Cit9CisKK3ZvaWQgQ1BXTF9XbmQ6Ok9uQ3JlYXRlKENyZWF0ZVBhcmFtcyogcFBhcmFtc1RvQWRqdXN0KSB7fQorCit2b2lkIENQV0xfV25kOjpPbkNyZWF0ZWQoKSB7fQorCit2b2lkIENQV0xfV25kOjpPbkRlc3Ryb3koKSB7fQorCit2b2lkIENQV0xfV25kOjpJbnZhbGlkYXRlRm9jdXNIYW5kbGVyKEZvY3VzSGFuZGxlcklmYWNlKiBoYW5kbGVyKSB7CisgIGlmIChtX0NyZWF0aW9uUGFyYW1zLnBGb2N1c0hhbmRsZXIgPT0gaGFuZGxlcikKKyAgICBtX0NyZWF0aW9uUGFyYW1zLnBGb2N1c0hhbmRsZXIgPSBudWxscHRyOworfQorCit2b2lkIENQV0xfV25kOjpJbnZhbGlkYXRlUHJvdmlkZXIoUHJvdmlkZXJJZmFjZSogcHJvdmlkZXIpIHsKKyAgaWYgKG1fQ3JlYXRpb25QYXJhbXMucFByb3ZpZGVyLkdldCgpID09IHByb3ZpZGVyKQorICAgIG1fQ3JlYXRpb25QYXJhbXMucFByb3ZpZGVyLlJlc2V0KCk7Cit9CisKK3ZvaWQgQ1BXTF9XbmQ6OkRlc3Ryb3koKSB7CisgIEtpbGxGb2N1cygpOworICBPbkRlc3Ryb3koKTsKKyAgaWYgKG1fYkNyZWF0ZWQpIHsKKyAgICBtX3BWU2Nyb2xsQmFyID0gbnVsbHB0cjsKKyAgICBmb3IgKGF1dG8gaXQgPSBtX0NoaWxkcmVuLnJiZWdpbigpOyBpdCAhPSBtX0NoaWxkcmVuLnJlbmQoKTsgKytpdCkgeworICAgICAgQ1BXTF9XbmQqIHBDaGlsZCA9ICppdDsKKyAgICAgIGlmIChwQ2hpbGQpIHsKKyAgICAgICAgKml0ID0gbnVsbHB0cjsKKyAgICAgICAgcENoaWxkLT5EZXN0cm95KCk7CisgICAgICAgIGRlbGV0ZSBwQ2hpbGQ7CisgICAgICB9CisgICAgfQorICAgIGlmIChtX0NyZWF0aW9uUGFyYW1zLnBQYXJlbnRXbmQpCisgICAgICBtX0NyZWF0aW9uUGFyYW1zLnBQYXJlbnRXbmQtPlJlbW92ZUNoaWxkKHRoaXMpOworCisgICAgbV9iQ3JlYXRlZCA9IGZhbHNlOworICB9CisgIERlc3Ryb3lNc2dDb250cm9sKCk7CisgIG1fQ2hpbGRyZW4uY2xlYXIoKTsKK30KKworYm9vbCBDUFdMX1duZDo6TW92ZShjb25zdCBDRlhfRmxvYXRSZWN0JiByY05ldywgYm9vbCBiUmVzZXQsIGJvb2wgYlJlZnJlc2gpIHsKKyAgaWYgKCFJc1ZhbGlkKCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgQ0ZYX0Zsb2F0UmVjdCByY09sZCA9IEdldFdpbmRvd1JlY3QoKTsKKyAgbV9yY1dpbmRvdyA9IHJjTmV3OworICBtX3JjV2luZG93Lk5vcm1hbGl6ZSgpOworCisgIGlmIChiUmVzZXQpIHsKKyAgICBpZiAocmNPbGQubGVmdCAhPSByY05ldy5sZWZ0IHx8IHJjT2xkLnJpZ2h0ICE9IHJjTmV3LnJpZ2h0IHx8CisgICAgICAgIHJjT2xkLnRvcCAhPSByY05ldy50b3AgfHwgcmNPbGQuYm90dG9tICE9IHJjTmV3LmJvdHRvbSkgeworICAgICAgaWYgKCFSZVBvc0NoaWxkV25kKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgaWYgKGJSZWZyZXNoICYmICFJbnZhbGlkYXRlUmVjdE1vdmUocmNPbGQsIHJjTmV3KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbV9DcmVhdGlvblBhcmFtcy5yY1JlY3RXbmQgPSBtX3JjV2luZG93OworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDUFdMX1duZDo6SW52YWxpZGF0ZVJlY3RNb3ZlKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjTmV3KSB7CisgIENGWF9GbG9hdFJlY3QgcmNVbmlvbiA9IHJjT2xkOworICByY1VuaW9uLlVuaW9uKHJjTmV3KTsKKworICByZXR1cm4gSW52YWxpZGF0ZVJlY3QoJnJjVW5pb24pOworfQorCit2b2lkIENQV0xfV25kOjpEcmF3QXBwZWFyYW5jZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbXRVc2VyMkRldmljZSkgeworICBpZiAoSXNWYWxpZCgpICYmIElzVmlzaWJsZSgpKSB7CisgICAgRHJhd1RoaXNBcHBlYXJhbmNlKHBEZXZpY2UsIG10VXNlcjJEZXZpY2UpOworICAgIERyYXdDaGlsZEFwcGVhcmFuY2UocERldmljZSwgbXRVc2VyMkRldmljZSk7CisgIH0KK30KKwordm9pZCBDUFdMX1duZDo6RHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbXRVc2VyMkRldmljZSkgeworICBDRlhfRmxvYXRSZWN0IHJlY3RXbmQgPSBHZXRXaW5kb3dSZWN0KCk7CisgIGlmIChyZWN0V25kLklzRW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgaWYgKEhhc0ZsYWcoUFdTX0JBQ0tHUk9VTkQpKSB7CisgICAgZmxvYXQgd2lkdGggPSBzdGF0aWNfY2FzdDxmbG9hdD4oR2V0Qm9yZGVyV2lkdGgoKSArIEdldElubmVyQm9yZGVyV2lkdGgoKSk7CisgICAgcERldmljZS0+RHJhd0ZpbGxSZWN0KCZtdFVzZXIyRGV2aWNlLCByZWN0V25kLkdldERlZmxhdGVkKHdpZHRoLCB3aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEJhY2tncm91bmRDb2xvcigpLCBHZXRUcmFuc3BhcmVuY3koKSk7CisgIH0KKworICBpZiAoSGFzRmxhZyhQV1NfQk9SREVSKSkgeworICAgIHBEZXZpY2UtPkRyYXdCb3JkZXIoJm10VXNlcjJEZXZpY2UsIHJlY3RXbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oR2V0Qm9yZGVyV2lkdGgoKSksIEdldEJvcmRlckNvbG9yKCksCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRCb3JkZXJMZWZ0VG9wQ29sb3IoR2V0Qm9yZGVyU3R5bGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRCb3JkZXJSaWdodEJvdHRvbUNvbG9yKEdldEJvcmRlclN0eWxlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgR2V0Qm9yZGVyU3R5bGUoKSwgR2V0VHJhbnNwYXJlbmN5KCkpOworICB9Cit9CisKK3ZvaWQgQ1BXTF9XbmQ6OkRyYXdDaGlsZEFwcGVhcmFuY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbXRVc2VyMkRldmljZSkgeworICBmb3IgKENQV0xfV25kKiBwQ2hpbGQgOiBtX0NoaWxkcmVuKSB7CisgICAgaWYgKCFwQ2hpbGQpCisgICAgICBjb250aW51ZTsKKworICAgIENGWF9NYXRyaXggbXQgPSBwQ2hpbGQtPkdldENoaWxkTWF0cml4KCk7CisgICAgaWYgKG10LklzSWRlbnRpdHkoKSkgeworICAgICAgcENoaWxkLT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBtdFVzZXIyRGV2aWNlKTsKKyAgICB9IGVsc2UgeworICAgICAgbXQuQ29uY2F0KG10VXNlcjJEZXZpY2UpOworICAgICAgcENoaWxkLT5EcmF3QXBwZWFyYW5jZShwRGV2aWNlLCBtdCk7CisgICAgfQorICB9Cit9CisKK2Jvb2wgQ1BXTF9XbmQ6OkludmFsaWRhdGVSZWN0KENGWF9GbG9hdFJlY3QqIHBSZWN0KSB7CisgIE9ic2VydmVkUHRyIHRoaXNPYnNlcnZlZCh0aGlzKTsKKyAgaWYgKCFJc1ZhbGlkKCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgQ0ZYX0Zsb2F0UmVjdCByY1JlZnJlc2ggPSBwUmVjdCA/ICpwUmVjdCA6IEdldFdpbmRvd1JlY3QoKTsKKworICBpZiAoIUhhc0ZsYWcoUFdTX05PUkVGUkVTSENMSVApKSB7CisgICAgQ0ZYX0Zsb2F0UmVjdCByY0NsaXAgPSBHZXRDbGlwUmVjdCgpOworICAgIGlmICghcmNDbGlwLklzRW1wdHkoKSkgeworICAgICAgcmNSZWZyZXNoLkludGVyc2VjdChyY0NsaXApOworICAgIH0KKyAgfQorCisgIENGWF9GbG9hdFJlY3QgcmNXaW4gPSBQV0x0b1duZChyY1JlZnJlc2gpOworICByY1dpbi5JbmZsYXRlKDEsIDEpOworICByY1dpbi5Ob3JtYWxpemUoKTsKKworICBpZiAoQ0ZYX1N5c3RlbUhhbmRsZXIqIHBTSCA9IEdldFN5c3RlbUhhbmRsZXIoKSkgeworICAgIGlmIChDUERGU0RLX1dpZGdldCogd2lkZ2V0ID0gc3RhdGljX2Nhc3Q8Q1BERlNES19XaWRnZXQqPigKKyAgICAgICAgICAgIG1fQ3JlYXRpb25QYXJhbXMucEF0dGFjaGVkV2lkZ2V0LkdldCgpKSkgeworICAgICAgcFNILT5JbnZhbGlkYXRlUmVjdCh3aWRnZXQsIHJjV2luKTsKKyAgICAgIGlmICghdGhpc09ic2VydmVkKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKyNkZWZpbmUgUFdMX0lNUExFTUVOVF9LRVlfTUVUSE9EKGtleV9tZXRob2RfbmFtZSkgICAgICAgICAgICAgICAgICBcCisgIGJvb2wgQ1BXTF9XbmQ6OmtleV9tZXRob2RfbmFtZSh1aW50MTZfdCBuQ2hhciwgdWludDMyX3QgbkZsYWcpIHsgXAorICAgIGlmICghSXNWYWxpZCgpIHx8ICFJc1Zpc2libGUoKSB8fCAhSXNFbmFibGVkKCkpICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFJc1duZENhcHR1cmVLZXlib2FyZCh0aGlzKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGF1dG8qIHBDaGlsZCA6IG1fQ2hpbGRyZW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAocENoaWxkICYmIElzV25kQ2FwdHVyZUtleWJvYXJkKHBDaGlsZCkpICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gcENoaWxkLT5rZXlfbWV0aG9kX25hbWUobkNoYXIsIG5GbGFnKTsgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK1BXTF9JTVBMRU1FTlRfS0VZX01FVEhPRChPbktleURvd24pCitQV0xfSU1QTEVNRU5UX0tFWV9NRVRIT0QoT25DaGFyKQorI3VuZGVmIFBXTF9JTVBMRU1FTlRfS0VZX01FVEhPRAorCisjZGVmaW5lIFBXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9EKG1vdXNlX21ldGhvZF9uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBib29sIENQV0xfV25kOjptb3VzZV9tZXRob2RfbmFtZShjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpIHsgIFwKKyAgICBpZiAoIUlzVmFsaWQoKSB8fCAhSXNWaXNpYmxlKCkgfHwgIUlzRW5hYmxlZCgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChJc1duZENhcHR1cmVNb3VzZSh0aGlzKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZvciAoYXV0byogcENoaWxkIDogbV9DaGlsZHJlbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChwQ2hpbGQgJiYgSXNXbmRDYXB0dXJlTW91c2UocENoaWxkKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHJldHVybiBwQ2hpbGQtPm1vdXNlX21ldGhvZF9uYW1lKHBDaGlsZC0+UGFyZW50VG9DaGlsZChwb2ludCksICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuRmxhZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFNldEN1cnNvcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGF1dG8qIHBDaGlsZCA6IG1fQ2hpbGRyZW4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAocENoaWxkICYmIHBDaGlsZC0+V25kSGl0VGVzdChwQ2hpbGQtPlBhcmVudFRvQ2hpbGQocG9pbnQpKSkgeyAgICAgICAgXAorICAgICAgICByZXR1cm4gcENoaWxkLT5tb3VzZV9tZXRob2RfbmFtZShwQ2hpbGQtPlBhcmVudFRvQ2hpbGQocG9pbnQpLCBuRmxhZyk7IFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChXbmRIaXRUZXN0KHBvaW50KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFNldEN1cnNvcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK1BXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9EKE9uTEJ1dHRvbkRibENsaykKK1BXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9EKE9uTEJ1dHRvbkRvd24pCitQV0xfSU1QTEVNRU5UX01PVVNFX01FVEhPRChPbkxCdXR0b25VcCkKK1BXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9EKE9uUkJ1dHRvbkRvd24pCitQV0xfSU1QTEVNRU5UX01PVVNFX01FVEhPRChPblJCdXR0b25VcCkKK1BXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9EKE9uTW91c2VNb3ZlKQorI3VuZGVmIFBXTF9JTVBMRU1FTlRfTU9VU0VfTUVUSE9ECisKK1dpZGVTdHJpbmcgQ1BXTF9XbmQ6OkdldFNlbGVjdGVkVGV4dCgpIHsKKyAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKK30KKwordm9pZCBDUFdMX1duZDo6UmVwbGFjZVNlbGVjdGlvbihjb25zdCBXaWRlU3RyaW5nJiB0ZXh0KSB7fQorCitib29sIENQV0xfV25kOjpPbk1vdXNlV2hlZWwoc2hvcnQgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5GbGFnKSB7CisgIGlmICghSXNWYWxpZCgpIHx8ICFJc1Zpc2libGUoKSB8fCAhSXNFbmFibGVkKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIFNldEN1cnNvcigpOworICBpZiAoIUlzV25kQ2FwdHVyZUtleWJvYXJkKHRoaXMpKQorICAgIHJldHVybiBmYWxzZTsKKworICBmb3IgKGF1dG8qIHBDaGlsZCA6IG1fQ2hpbGRyZW4pIHsKKyAgICBpZiAocENoaWxkICYmIElzV25kQ2FwdHVyZUtleWJvYXJkKHBDaGlsZCkpCisgICAgICByZXR1cm4gcENoaWxkLT5Pbk1vdXNlV2hlZWwoekRlbHRhLCBwQ2hpbGQtPlBhcmVudFRvQ2hpbGQocG9pbnQpLCBuRmxhZyk7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIENQV0xfV25kOjpBZGRDaGlsZChDUFdMX1duZCogcFduZCkgeworICBtX0NoaWxkcmVuLnB1c2hfYmFjayhwV25kKTsKK30KKwordm9pZCBDUFdMX1duZDo6UmVtb3ZlQ2hpbGQoQ1BXTF9XbmQqIHBXbmQpIHsKKyAgZm9yIChhdXRvIGl0ID0gbV9DaGlsZHJlbi5yYmVnaW4oKTsgaXQgIT0gbV9DaGlsZHJlbi5yZW5kKCk7ICsraXQpIHsKKyAgICBpZiAoKml0ICYmICppdCA9PSBwV25kKSB7CisgICAgICBtX0NoaWxkcmVuLmVyYXNlKHN0ZDo6bmV4dChpdCkuYmFzZSgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCit2b2lkIENQV0xfV25kOjpTZXRTY3JvbGxJbmZvKGNvbnN0IFBXTF9TQ1JPTExfSU5GTyYgaW5mbykge30KKwordm9pZCBDUFdMX1duZDo6U2V0U2Nyb2xsUG9zaXRpb24oZmxvYXQgcG9zKSB7fQorCit2b2lkIENQV0xfV25kOjpTY3JvbGxXaW5kb3dWZXJ0aWNhbGx5KGZsb2F0IHBvcykge30KKwordm9pZCBDUFdMX1duZDo6Tm90aWZ5TEJ1dHRvbkRvd24oQ1BXTF9XbmQqIGNoaWxkLCBjb25zdCBDRlhfUG9pbnRGJiBwb3MpIHt9CisKK3ZvaWQgQ1BXTF9XbmQ6Ok5vdGlmeUxCdXR0b25VcChDUFdMX1duZCogY2hpbGQsIGNvbnN0IENGWF9Qb2ludEYmIHBvcykge30KKwordm9pZCBDUFdMX1duZDo6Tm90aWZ5TW91c2VNb3ZlKENQV0xfV25kKiBjaGlsZCwgY29uc3QgQ0ZYX1BvaW50RiYgcG9zKSB7fQorCitDUFdMX1duZCogQ1BXTF9XbmQ6OkdldFBhcmVudFdpbmRvdygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fQ3JlYXRpb25QYXJhbXMucFBhcmVudFduZDsKK30KKworQ0ZYX0Zsb2F0UmVjdCBDUFdMX1duZDo6R2V0V2luZG93UmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcmNXaW5kb3c7Cit9CisKK0NGWF9GbG9hdFJlY3QgQ1BXTF9XbmQ6OkdldENsaWVudFJlY3QoKSBjb25zdCB7CisgIENGWF9GbG9hdFJlY3QgcmNXaW5kb3cgPSBHZXRXaW5kb3dSZWN0KCk7CisKKyAgZmxvYXQgd2lkdGggPSBzdGF0aWNfY2FzdDxmbG9hdD4oR2V0Qm9yZGVyV2lkdGgoKSArIEdldElubmVyQm9yZGVyV2lkdGgoKSk7CisgIENGWF9GbG9hdFJlY3QgcmNDbGllbnQgPSByY1dpbmRvdy5HZXREZWZsYXRlZCh3aWR0aCwgd2lkdGgpOworICBpZiAoQ1BXTF9TY3JvbGxCYXIqIHBWU0IgPSBHZXRWU2Nyb2xsQmFyKCkpCisgICAgcmNDbGllbnQucmlnaHQgLT0gcFZTQi0+R2V0U2Nyb2xsQmFyV2lkdGgoKTsKKworICByY0NsaWVudC5Ob3JtYWxpemUoKTsKKyAgcmV0dXJuIHJjV2luZG93LkNvbnRhaW5zKHJjQ2xpZW50KSA/IHJjQ2xpZW50IDogQ0ZYX0Zsb2F0UmVjdCgpOworfQorCitDRlhfUG9pbnRGIENQV0xfV25kOjpHZXRDZW50ZXJQb2ludCgpIGNvbnN0IHsKKyAgQ0ZYX0Zsb2F0UmVjdCByY0NsaWVudCA9IEdldENsaWVudFJlY3QoKTsKKyAgcmV0dXJuIENGWF9Qb2ludEYoKHJjQ2xpZW50LmxlZnQgKyByY0NsaWVudC5yaWdodCkgKiAwLjVmLAorICAgICAgICAgICAgICAgICAgICAocmNDbGllbnQudG9wICsgcmNDbGllbnQuYm90dG9tKSAqIDAuNWYpOworfQorCitib29sIENQV0xfV25kOjpIYXNGbGFnKHVpbnQzMl90IGR3RmxhZ3MpIGNvbnN0IHsKKyAgcmV0dXJuIChtX0NyZWF0aW9uUGFyYW1zLmR3RmxhZ3MgJiBkd0ZsYWdzKSAhPSAwOworfQorCit2b2lkIENQV0xfV25kOjpSZW1vdmVGbGFnKHVpbnQzMl90IGR3RmxhZ3MpIHsKKyAgbV9DcmVhdGlvblBhcmFtcy5kd0ZsYWdzICY9IH5kd0ZsYWdzOworfQorCit2b2lkIENQV0xfV25kOjpBZGRGbGFnKHVpbnQzMl90IGR3RmxhZ3MpIHsKKyAgbV9DcmVhdGlvblBhcmFtcy5kd0ZsYWdzIHw9IGR3RmxhZ3M7Cit9CisKK0NGWF9Db2xvciBDUFdMX1duZDo6R2V0QmFja2dyb3VuZENvbG9yKCkgY29uc3QgeworICByZXR1cm4gbV9DcmVhdGlvblBhcmFtcy5zQmFja2dyb3VuZENvbG9yOworfQorCit2b2lkIENQV0xfV25kOjpTZXRCYWNrZ3JvdW5kQ29sb3IoY29uc3QgQ0ZYX0NvbG9yJiBjb2xvcikgeworICBtX0NyZWF0aW9uUGFyYW1zLnNCYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjsKK30KKworQ0ZYX0NvbG9yIENQV0xfV25kOjpHZXRUZXh0Q29sb3IoKSBjb25zdCB7CisgIHJldHVybiBtX0NyZWF0aW9uUGFyYW1zLnNUZXh0Q29sb3I7Cit9CisKK0JvcmRlclN0eWxlIENQV0xfV25kOjpHZXRCb3JkZXJTdHlsZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fQ3JlYXRpb25QYXJhbXMubkJvcmRlclN0eWxlOworfQorCit2b2lkIENQV0xfV25kOjpTZXRCb3JkZXJTdHlsZShCb3JkZXJTdHlsZSBuQm9yZGVyU3R5bGUpIHsKKyAgaWYgKEhhc0ZsYWcoUFdTX0JPUkRFUikpCisgICAgbV9DcmVhdGlvblBhcmFtcy5uQm9yZGVyU3R5bGUgPSBuQm9yZGVyU3R5bGU7Cit9CisKK2ludDMyX3QgQ1BXTF9XbmQ6OkdldEJvcmRlcldpZHRoKCkgY29uc3QgeworICByZXR1cm4gSGFzRmxhZyhQV1NfQk9SREVSKSA/IG1fQ3JlYXRpb25QYXJhbXMuZHdCb3JkZXJXaWR0aCA6IDA7Cit9CisKK2ludDMyX3QgQ1BXTF9XbmQ6OkdldElubmVyQm9yZGVyV2lkdGgoKSBjb25zdCB7CisgIHJldHVybiAwOworfQorCitDRlhfQ29sb3IgQ1BXTF9XbmQ6OkdldEJvcmRlckNvbG9yKCkgY29uc3QgeworICByZXR1cm4gSGFzRmxhZyhQV1NfQk9SREVSKSA/IG1fQ3JlYXRpb25QYXJhbXMuc0JvcmRlckNvbG9yIDogQ0ZYX0NvbG9yKCk7Cit9CisKK2NvbnN0IENQV0xfRGFzaCYgQ1BXTF9XbmQ6OkdldEJvcmRlckRhc2goKSBjb25zdCB7CisgIHJldHVybiBtX0NyZWF0aW9uUGFyYW1zLnNEYXNoOworfQorCitDUFdMX1duZDo6UHJpdmF0ZURhdGEqIENQV0xfV25kOjpHZXRBdHRhY2hlZERhdGEoKSBjb25zdCB7CisgIHJldHVybiBtX0NyZWF0aW9uUGFyYW1zLnBBdHRhY2hlZERhdGEuR2V0KCk7Cit9CisKK0NQV0xfU2Nyb2xsQmFyKiBDUFdMX1duZDo6R2V0VlNjcm9sbEJhcigpIGNvbnN0IHsKKyAgcmV0dXJuIEhhc0ZsYWcoUFdTX1ZTQ1JPTEwpID8gbV9wVlNjcm9sbEJhci5HZXQoKSA6IG51bGxwdHI7Cit9CisKK3ZvaWQgQ1BXTF9XbmQ6OkNyZWF0ZVNjcm9sbEJhcihjb25zdCBDcmVhdGVQYXJhbXMmIGNwKSB7CisgIENyZWF0ZVZTY3JvbGxCYXIoY3ApOworfQorCit2b2lkIENQV0xfV25kOjpDcmVhdGVWU2Nyb2xsQmFyKGNvbnN0IENyZWF0ZVBhcmFtcyYgY3ApIHsKKyAgaWYgKG1fcFZTY3JvbGxCYXIgfHwgIUhhc0ZsYWcoUFdTX1ZTQ1JPTEwpKQorICAgIHJldHVybjsKKworICBDcmVhdGVQYXJhbXMgc2NwID0gY3A7CisKKyAgLy8gZmxhZ3MKKyAgc2NwLmR3RmxhZ3MgPQorICAgICAgUFdTX0NISUxEIHwgUFdTX0JBQ0tHUk9VTkQgfCBQV1NfQVVUT1RSQU5TUEFSRU5UIHwgUFdTX05PUkVGUkVTSENMSVA7CisKKyAgc2NwLnBQYXJlbnRXbmQgPSB0aGlzOworICBzY3Auc0JhY2tncm91bmRDb2xvciA9IFBXTF9ERUZBVUxUX1dISVRFQ09MT1I7CisgIHNjcC5lQ3Vyc29yVHlwZSA9IEZYQ1RfQVJST1c7CisgIHNjcC5uVHJhbnNwYXJlbmN5ID0gUFdMX1NDUk9MTEJBUl9UUkFOU1BBUkVOQ1k7CisKKyAgbV9wVlNjcm9sbEJhciA9IG5ldyBDUFdMX1Njcm9sbEJhcihTQlRfVlNDUk9MTCk7CisgIG1fcFZTY3JvbGxCYXItPkNyZWF0ZShzY3ApOworfQorCit2b2lkIENQV0xfV25kOjpTZXRDYXB0dXJlKCkgeworICBpZiAoQ1BXTF9Nc2dDb250cm9sKiBwTXNnQ3RybCA9IEdldE1zZ0NvbnRyb2woKSkKKyAgICBwTXNnQ3RybC0+U2V0Q2FwdHVyZSh0aGlzKTsKK30KKwordm9pZCBDUFdMX1duZDo6UmVsZWFzZUNhcHR1cmUoKSB7CisgIGZvciAoYXV0byogcENoaWxkIDogbV9DaGlsZHJlbikgeworICAgIGlmIChwQ2hpbGQpCisgICAgICBwQ2hpbGQtPlJlbGVhc2VDYXB0dXJlKCk7CisgIH0KKyAgaWYgKENQV0xfTXNnQ29udHJvbCogcE1zZ0N0cmwgPSBHZXRNc2dDb250cm9sKCkpCisgICAgcE1zZ0N0cmwtPlJlbGVhc2VDYXB0dXJlKCk7Cit9CisKK3ZvaWQgQ1BXTF9XbmQ6OlNldEZvY3VzKCkgeworICBpZiAoQ1BXTF9Nc2dDb250cm9sKiBwTXNnQ3RybCA9IEdldE1zZ0NvbnRyb2woKSkgeworICAgIGlmICghcE1zZ0N0cmwtPklzTWFpbkNhcHR1cmVLZXlib2FyZCh0aGlzKSkKKyAgICAgIHBNc2dDdHJsLT5LaWxsRm9jdXMoKTsKKyAgICBwTXNnQ3RybC0+U2V0Rm9jdXModGhpcyk7CisgIH0KK30KKwordm9pZCBDUFdMX1duZDo6S2lsbEZvY3VzKCkgeworICBpZiAoQ1BXTF9Nc2dDb250cm9sKiBwTXNnQ3RybCA9IEdldE1zZ0NvbnRyb2woKSkgeworICAgIGlmIChwTXNnQ3RybC0+SXNXbmRDYXB0dXJlS2V5Ym9hcmQodGhpcykpCisgICAgICBwTXNnQ3RybC0+S2lsbEZvY3VzKCk7CisgIH0KK30KKwordm9pZCBDUFdMX1duZDo6T25TZXRGb2N1cygpIHt9CisKK3ZvaWQgQ1BXTF9XbmQ6Ok9uS2lsbEZvY3VzKCkge30KKworYm9vbCBDUFdMX1duZDo6V25kSGl0VGVzdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3QgeworICByZXR1cm4gSXNWYWxpZCgpICYmIElzVmlzaWJsZSgpICYmIEdldFdpbmRvd1JlY3QoKS5Db250YWlucyhwb2ludCk7Cit9CisKK2Jvb2wgQ1BXTF9XbmQ6OkNsaWVudEhpdFRlc3QoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIGNvbnN0IHsKKyAgcmV0dXJuIElzVmFsaWQoKSAmJiBJc1Zpc2libGUoKSAmJiBHZXRDbGllbnRSZWN0KCkuQ29udGFpbnMocG9pbnQpOworfQorCitjb25zdCBDUFdMX1duZCogQ1BXTF9XbmQ6OkdldFJvb3RXbmQoKSBjb25zdCB7CisgIGF1dG8qIHBQYXJlbnQgPSBtX0NyZWF0aW9uUGFyYW1zLnBQYXJlbnRXbmQ7CisgIHJldHVybiBwUGFyZW50ID8gcFBhcmVudC0+R2V0Um9vdFduZCgpIDogdGhpczsKK30KKworYm9vbCBDUFdMX1duZDo6U2V0VmlzaWJsZShib29sIGJWaXNpYmxlKSB7CisgIGlmICghSXNWYWxpZCgpKQorICAgIHJldHVybiB0cnVlOworCisgIE9ic2VydmVkUHRyIHRoaXNPYnNlcnZlZCh0aGlzKTsKKworICBmb3IgKGF1dG8qIHBDaGlsZCA6IG1fQ2hpbGRyZW4pIHsKKyAgICBpZiAocENoaWxkKSB7CisgICAgICBwQ2hpbGQtPlNldFZpc2libGUoYlZpc2libGUpOworICAgICAgaWYgKCF0aGlzT2JzZXJ2ZWQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBpZiAoYlZpc2libGUgIT0gbV9iVmlzaWJsZSkgeworICAgIG1fYlZpc2libGUgPSBiVmlzaWJsZTsKKyAgICBpZiAoIVJlUG9zQ2hpbGRXbmQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmICghSW52YWxpZGF0ZVJlY3QobnVsbHB0cikpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ1BXTF9XbmQ6OlNldENsaXBSZWN0KGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIHsKKyAgbV9yY0NsaXAgPSByZWN0OworICBtX3JjQ2xpcC5Ob3JtYWxpemUoKTsKK30KKworY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgQ1BXTF9XbmQ6OkdldENsaXBSZWN0KCkgY29uc3QgeworICByZXR1cm4gbV9yY0NsaXA7Cit9CisKK2Jvb2wgQ1BXTF9XbmQ6OklzUmVhZE9ubHkoKSBjb25zdCB7CisgIHJldHVybiBIYXNGbGFnKFBXU19SRUFET05MWSk7Cit9CisKK2Jvb2wgQ1BXTF9XbmQ6OlJlUG9zQ2hpbGRXbmQoKSB7CisgIENQV0xfU2Nyb2xsQmFyKiBwVlNCID0gR2V0VlNjcm9sbEJhcigpOworICBpZiAoIXBWU0IpCisgICAgcmV0dXJuIHRydWU7CisKKyAgQ0ZYX0Zsb2F0UmVjdCByY0NvbnRlbnQgPSBHZXRXaW5kb3dSZWN0KCk7CisgIGlmICghcmNDb250ZW50LklzRW1wdHkoKSkgeworICAgIGZsb2F0IHdpZHRoID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KEdldEJvcmRlcldpZHRoKCkgKyBHZXRJbm5lckJvcmRlcldpZHRoKCkpOworICAgIHJjQ29udGVudC5EZWZsYXRlKHdpZHRoLCB3aWR0aCk7CisgICAgcmNDb250ZW50Lk5vcm1hbGl6ZSgpOworICB9CisgIENGWF9GbG9hdFJlY3QgcmNWU2Nyb2xsID0KKyAgICAgIENGWF9GbG9hdFJlY3QocmNDb250ZW50LnJpZ2h0IC0gUFdMX1NDUk9MTEJBUl9XSURUSCwgcmNDb250ZW50LmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgcmNDb250ZW50LnJpZ2h0IC0gMS4wZiwgcmNDb250ZW50LnRvcCk7CisKKyAgT2JzZXJ2ZWRQdHIgdGhpc09ic2VydmVkKHRoaXMpOworCisgIHBWU0ItPk1vdmUocmNWU2Nyb2xsLCB0cnVlLCBmYWxzZSk7CisgIGlmICghdGhpc09ic2VydmVkKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDUFdMX1duZDo6Q3JlYXRlQ2hpbGRXbmQoY29uc3QgQ3JlYXRlUGFyYW1zJiBjcCkge30KKwordm9pZCBDUFdMX1duZDo6U2V0Q3Vyc29yKCkgeworICBpZiAoSXNWYWxpZCgpKSB7CisgICAgaWYgKENGWF9TeXN0ZW1IYW5kbGVyKiBwU0ggPSBHZXRTeXN0ZW1IYW5kbGVyKCkpIHsKKyAgICAgIGludDMyX3QgbkN1cnNvclR5cGUgPSBHZXRDcmVhdGlvblBhcmFtcygpLmVDdXJzb3JUeXBlOworICAgICAgcFNILT5TZXRDdXJzb3IobkN1cnNvclR5cGUpOworICAgIH0KKyAgfQorfQorCit2b2lkIENQV0xfV25kOjpDcmVhdGVNc2dDb250cm9sKCkgeworICBpZiAoIW1fQ3JlYXRpb25QYXJhbXMucE1zZ0NvbnRyb2wpCisgICAgbV9DcmVhdGlvblBhcmFtcy5wTXNnQ29udHJvbCA9IG5ldyBDUFdMX01zZ0NvbnRyb2wodGhpcyk7Cit9CisKK3ZvaWQgQ1BXTF9XbmQ6OkRlc3Ryb3lNc2dDb250cm9sKCkgeworICBDUFdMX01zZ0NvbnRyb2wqIHBNc2dDb250cm9sID0gR2V0TXNnQ29udHJvbCgpOworICBpZiAocE1zZ0NvbnRyb2wgJiYgcE1zZ0NvbnRyb2wtPklzV25kQ3JlYXRlZCh0aGlzKSkKKyAgICBkZWxldGUgcE1zZ0NvbnRyb2w7Cit9CisKK0NQV0xfTXNnQ29udHJvbCogQ1BXTF9XbmQ6OkdldE1zZ0NvbnRyb2woKSBjb25zdCB7CisgIHJldHVybiBtX0NyZWF0aW9uUGFyYW1zLnBNc2dDb250cm9sOworfQorCitib29sIENQV0xfV25kOjpJc0NhcHR1cmVNb3VzZSgpIGNvbnN0IHsKKyAgcmV0dXJuIElzV25kQ2FwdHVyZU1vdXNlKHRoaXMpOworfQorCitib29sIENQV0xfV25kOjpJc1duZENhcHR1cmVNb3VzZShjb25zdCBDUFdMX1duZCogcFduZCkgY29uc3QgeworICBDUFdMX01zZ0NvbnRyb2wqIHBDdHJsID0gR2V0TXNnQ29udHJvbCgpOworICByZXR1cm4gcEN0cmwgPyBwQ3RybC0+SXNXbmRDYXB0dXJlTW91c2UocFduZCkgOiBmYWxzZTsKK30KKworYm9vbCBDUFdMX1duZDo6SXNXbmRDYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQqIHBXbmQpIGNvbnN0IHsKKyAgQ1BXTF9Nc2dDb250cm9sKiBwQ3RybCA9IEdldE1zZ0NvbnRyb2woKTsKKyAgcmV0dXJuIHBDdHJsID8gcEN0cmwtPklzV25kQ2FwdHVyZUtleWJvYXJkKHBXbmQpIDogZmFsc2U7Cit9CisKK2Jvb2wgQ1BXTF9XbmQ6OklzRm9jdXNlZCgpIGNvbnN0IHsKKyAgQ1BXTF9Nc2dDb250cm9sKiBwQ3RybCA9IEdldE1zZ0NvbnRyb2woKTsKKyAgcmV0dXJuIHBDdHJsID8gcEN0cmwtPklzTWFpbkNhcHR1cmVLZXlib2FyZCh0aGlzKSA6IGZhbHNlOworfQorCitDRlhfRmxvYXRSZWN0IENQV0xfV25kOjpHZXRGb2N1c1JlY3QoKSBjb25zdCB7CisgIENGWF9GbG9hdFJlY3QgcmVjdCA9IEdldFdpbmRvd1JlY3QoKTsKKyAgaWYgKCFyZWN0LklzRW1wdHkoKSkgeworICAgIHJlY3QuSW5mbGF0ZSgxLjBmLCAxLjBmKTsKKyAgICByZWN0Lk5vcm1hbGl6ZSgpOworICB9CisgIHJldHVybiByZWN0OworfQorCitmbG9hdCBDUFdMX1duZDo6R2V0Rm9udFNpemUoKSBjb25zdCB7CisgIHJldHVybiBtX0NyZWF0aW9uUGFyYW1zLmZGb250U2l6ZTsKK30KKwordm9pZCBDUFdMX1duZDo6U2V0Rm9udFNpemUoZmxvYXQgZkZvbnRTaXplKSB7CisgIG1fQ3JlYXRpb25QYXJhbXMuZkZvbnRTaXplID0gZkZvbnRTaXplOworfQorCitDRlhfU3lzdGVtSGFuZGxlciogQ1BXTF9XbmQ6OkdldFN5c3RlbUhhbmRsZXIoKSBjb25zdCB7CisgIHJldHVybiBtX0NyZWF0aW9uUGFyYW1zLnBTeXN0ZW1IYW5kbGVyOworfQorCitDUFdMX1duZDo6Rm9jdXNIYW5kbGVySWZhY2UqIENQV0xfV25kOjpHZXRGb2N1c0hhbmRsZXIoKSBjb25zdCB7CisgIHJldHVybiBtX0NyZWF0aW9uUGFyYW1zLnBGb2N1c0hhbmRsZXIuR2V0KCk7Cit9CisKK0NQV0xfV25kOjpQcm92aWRlcklmYWNlKiBDUFdMX1duZDo6R2V0UHJvdmlkZXIoKSBjb25zdCB7CisgIHJldHVybiBtX0NyZWF0aW9uUGFyYW1zLnBQcm92aWRlci5HZXQoKTsKK30KKworSVBWVF9Gb250TWFwKiBDUFdMX1duZDo6R2V0Rm9udE1hcCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fQ3JlYXRpb25QYXJhbXMucEZvbnRNYXA7Cit9CisKK0NGWF9Db2xvciBDUFdMX1duZDo6R2V0Qm9yZGVyTGVmdFRvcENvbG9yKEJvcmRlclN0eWxlIG5Cb3JkZXJTdHlsZSkgY29uc3QgeworICBzd2l0Y2ggKG5Cb3JkZXJTdHlsZSkgeworICAgIGNhc2UgQm9yZGVyU3R5bGU6OkJFVkVMRUQ6CisgICAgICByZXR1cm4gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIDEpOworICAgIGNhc2UgQm9yZGVyU3R5bGU6OklOU0VUOgorICAgICAgcmV0dXJuIENGWF9Db2xvcihDRlhfQ29sb3I6OmtHcmF5LCAwLjVmKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIENGWF9Db2xvcigpOworICB9Cit9CisKK0NGWF9Db2xvciBDUFdMX1duZDo6R2V0Qm9yZGVyUmlnaHRCb3R0b21Db2xvcihCb3JkZXJTdHlsZSBuQm9yZGVyU3R5bGUpIGNvbnN0IHsKKyAgc3dpdGNoIChuQm9yZGVyU3R5bGUpIHsKKyAgICBjYXNlIEJvcmRlclN0eWxlOjpCRVZFTEVEOgorICAgICAgcmV0dXJuIEdldEJhY2tncm91bmRDb2xvcigpIC8gMi4wZjsKKyAgICBjYXNlIEJvcmRlclN0eWxlOjpJTlNFVDoKKyAgICAgIHJldHVybiBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprR3JheSwgMC43NWYpOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQ0ZYX0NvbG9yKCk7CisgIH0KK30KKworaW50MzJfdCBDUFdMX1duZDo6R2V0VHJhbnNwYXJlbmN5KCkgeworICByZXR1cm4gbV9DcmVhdGlvblBhcmFtcy5uVHJhbnNwYXJlbmN5OworfQorCit2b2lkIENQV0xfV25kOjpTZXRUcmFuc3BhcmVuY3koaW50MzJfdCBuVHJhbnNwYXJlbmN5KSB7CisgIGZvciAoYXV0byogcENoaWxkIDogbV9DaGlsZHJlbikgeworICAgIGlmIChwQ2hpbGQpCisgICAgICBwQ2hpbGQtPlNldFRyYW5zcGFyZW5jeShuVHJhbnNwYXJlbmN5KTsKKyAgfQorICBtX0NyZWF0aW9uUGFyYW1zLm5UcmFuc3BhcmVuY3kgPSBuVHJhbnNwYXJlbmN5OworfQorCitDRlhfTWF0cml4IENQV0xfV25kOjpHZXRXaW5kb3dNYXRyaXgoKSBjb25zdCB7CisgIENGWF9NYXRyaXggbXQgPSBHZXRDaGlsZFRvUm9vdCgpOworICBpZiAoUHJvdmlkZXJJZmFjZSogcFByb3ZpZGVyID0gR2V0UHJvdmlkZXIoKSkKKyAgICBtdC5Db25jYXQocFByb3ZpZGVyLT5HZXRXaW5kb3dNYXRyaXgoR2V0QXR0YWNoZWREYXRhKCkpKTsKKyAgcmV0dXJuIG10OworfQorCitDRlhfRmxvYXRSZWN0IENQV0xfV25kOjpQV0x0b1duZChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KSBjb25zdCB7CisgIENGWF9NYXRyaXggbXQgPSBHZXRXaW5kb3dNYXRyaXgoKTsKKyAgcmV0dXJuIG10LlRyYW5zZm9ybVJlY3QocmVjdCk7Cit9CisKK0NGWF9Qb2ludEYgQ1BXTF9XbmQ6OlBhcmVudFRvQ2hpbGQoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIGNvbnN0IHsKKyAgQ0ZYX01hdHJpeCBtdCA9IEdldENoaWxkTWF0cml4KCk7CisgIGlmIChtdC5Jc0lkZW50aXR5KCkpCisgICAgcmV0dXJuIHBvaW50OworCisgIENGWF9NYXRyaXggaW52ZXJzZSA9IG10LkdldEludmVyc2UoKTsKKyAgaWYgKCFpbnZlcnNlLklzSWRlbnRpdHkoKSkKKyAgICBtdCA9IGludmVyc2U7CisgIHJldHVybiBtdC5UcmFuc2Zvcm0ocG9pbnQpOworfQorCitDRlhfRmxvYXRSZWN0IENQV0xfV25kOjpQYXJlbnRUb0NoaWxkKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0IHsKKyAgQ0ZYX01hdHJpeCBtdCA9IEdldENoaWxkTWF0cml4KCk7CisgIGlmIChtdC5Jc0lkZW50aXR5KCkpCisgICAgcmV0dXJuIHJlY3Q7CisKKyAgQ0ZYX01hdHJpeCBpbnZlcnNlID0gbXQuR2V0SW52ZXJzZSgpOworICBpZiAoIWludmVyc2UuSXNJZGVudGl0eSgpKQorICAgIG10ID0gaW52ZXJzZTsKKworICByZXR1cm4gbXQuVHJhbnNmb3JtUmVjdChyZWN0KTsKK30KKworQ0ZYX01hdHJpeCBDUFdMX1duZDo6R2V0Q2hpbGRUb1Jvb3QoKSBjb25zdCB7CisgIENGWF9NYXRyaXggbXQ7CisgIGlmIChIYXNGbGFnKFBXU19DSElMRCkpIHsKKyAgICBjb25zdCBDUFdMX1duZCogcFBhcmVudCA9IHRoaXM7CisgICAgd2hpbGUgKHBQYXJlbnQpIHsKKyAgICAgIG10LkNvbmNhdChwUGFyZW50LT5HZXRDaGlsZE1hdHJpeCgpKTsKKyAgICAgIHBQYXJlbnQgPSBwUGFyZW50LT5HZXRQYXJlbnRXaW5kb3coKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG10OworfQorCitDRlhfTWF0cml4IENQV0xfV25kOjpHZXRDaGlsZE1hdHJpeCgpIGNvbnN0IHsKKyAgcmV0dXJuIEhhc0ZsYWcoUFdTX0NISUxEKSA/IG1fQ3JlYXRpb25QYXJhbXMubXRDaGlsZCA6IENGWF9NYXRyaXgoKTsKK30KKwordm9pZCBDUFdMX1duZDo6U2V0Q2hpbGRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCYgbXQpIHsKKyAgbV9DcmVhdGlvblBhcmFtcy5tdENoaWxkID0gbXQ7Cit9CisKK2NvbnN0IENQV0xfV25kKiBDUFdMX1duZDo6R2V0Rm9jdXNlZCgpIGNvbnN0IHsKKyAgQ1BXTF9Nc2dDb250cm9sKiBwTXNnQ3RybCA9IEdldE1zZ0NvbnRyb2woKTsKKyAgcmV0dXJuIHBNc2dDdHJsID8gcE1zZ0N0cmwtPkdldEZvY3VzZWRXaW5kb3coKSA6IG51bGxwdHI7Cit9CisKK3ZvaWQgQ1BXTF9XbmQ6OkVuYWJsZVdpbmRvdyhib29sIGJFbmFibGUpIHsKKyAgaWYgKG1fYkVuYWJsZWQgPT0gYkVuYWJsZSkKKyAgICByZXR1cm47CisKKyAgZm9yIChhdXRvKiBwQ2hpbGQgOiBtX0NoaWxkcmVuKSB7CisgICAgaWYgKHBDaGlsZCkKKyAgICAgIHBDaGlsZC0+RW5hYmxlV2luZG93KGJFbmFibGUpOworICB9CisgIG1fYkVuYWJsZWQgPSBiRW5hYmxlOworfQpkaWZmIC0tZ2l0IGEvZnBkZnNkay9wd2wvY3B3bF93bmQuaCBiL2ZwZGZzZGsvcHdsL2Nwd2xfd25kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1MjQyMAotLS0gL2Rldi9udWxsCisrKyBiL2ZwZGZzZGsvcHdsL2Nwd2xfd25kLmgKQEAgLTAsMCArMSwzMjYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGUERGU0RLX1BXTF9DUFdMX1dORF9IXworI2RlZmluZSBGUERGU0RLX1BXTF9DUFdMX1dORF9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2Zvcm1jb250cm9sLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9vYnNlcnZhYmxlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfY29sb3IuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfZm9ybWZpbGxlbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka193aWRnZXQuaCIKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX3RpbWVyLmgiCisjaW5jbHVkZSAiZnBkZnNkay9wd2wvY3B3bF90aW1lcl9oYW5kbGVyLmgiCisKK2NsYXNzIENQV0xfRWRpdDsKK2NsYXNzIENQV0xfTXNnQ29udHJvbDsKK2NsYXNzIENQV0xfU2Nyb2xsQmFyOworY2xhc3MgQ0ZYX1N5c3RlbUhhbmRsZXI7CitjbGFzcyBJUFZUX0ZvbnRNYXA7CitzdHJ1Y3QgUFdMX1NDUk9MTF9JTkZPOworCisvLyB3aW5kb3cgc3R5bGVzCisjZGVmaW5lIFBXU19DSElMRCAweDgwMDAwMDAwTAorI2RlZmluZSBQV1NfQk9SREVSIDB4NDAwMDAwMDBMCisjZGVmaW5lIFBXU19CQUNLR1JPVU5EIDB4MjAwMDAwMDBMCisjZGVmaW5lIFBXU19IU0NST0xMIDB4MTAwMDAwMDBMCisjZGVmaW5lIFBXU19WU0NST0xMIDB4MDgwMDAwMDBMCisjZGVmaW5lIFBXU19WSVNJQkxFIDB4MDQwMDAwMDBMCisjZGVmaW5lIFBXU19SRUFET05MWSAweDAxMDAwMDAwTAorI2RlZmluZSBQV1NfQVVUT0ZPTlRTSVpFIDB4MDA4MDAwMDBMCisjZGVmaW5lIFBXU19BVVRPVFJBTlNQQVJFTlQgMHgwMDQwMDAwMEwKKyNkZWZpbmUgUFdTX05PUkVGUkVTSENMSVAgMHgwMDIwMDAwMEwKKworLy8gZWRpdCBhbmQgbGFiZWwgc3R5bGVzCisjZGVmaW5lIFBFU19NVUxUSUxJTkUgMHgwMDAxTAorI2RlZmluZSBQRVNfUEFTU1dPUkQgMHgwMDAyTAorI2RlZmluZSBQRVNfTEVGVCAweDAwMDRMCisjZGVmaW5lIFBFU19SSUdIVCAweDAwMDhMCisjZGVmaW5lIFBFU19NSURETEUgMHgwMDEwTAorI2RlZmluZSBQRVNfVE9QIDB4MDAyMEwKKyNkZWZpbmUgUEVTX0JPVFRPTSAweDAwNDBMCisjZGVmaW5lIFBFU19DRU5URVIgMHgwMDgwTAorI2RlZmluZSBQRVNfQ0hBUkFSUkFZIDB4MDEwMEwKKyNkZWZpbmUgUEVTX0FVVE9TQ1JPTEwgMHgwMjAwTAorI2RlZmluZSBQRVNfQVVUT1JFVFVSTiAweDA0MDBMCisjZGVmaW5lIFBFU19VTkRPIDB4MDgwMEwKKyNkZWZpbmUgUEVTX1JJQ0ggMHgxMDAwTAorI2RlZmluZSBQRVNfU1BFTExDSEVDSyAweDIwMDBMCisjZGVmaW5lIFBFU19URVhUT1ZFUkZMT1cgMHg0MDAwTAorI2RlZmluZSBQRVNfTk9SRUFEIDB4ODAwMEwKKworLy8gbGlzdGJveCBzdHlsZXMKKyNkZWZpbmUgUExCU19NVUxUSVBMRVNFTCAweDAwMDFMCisjZGVmaW5lIFBMQlNfSE9WRVJTRUwgMHgwMDA4TAorCisvLyBjb21ib2JveCBzdHlsZXMKKyNkZWZpbmUgUENCU19BTExPV0NVU1RPTVRFWFQgMHgwMDAxTAorCitzdHJ1Y3QgQ1BXTF9EYXNoIHsKKyAgQ1BXTF9EYXNoKCkgOiBuRGFzaCgwKSwgbkdhcCgwKSwgblBoYXNlKDApIHt9CisgIENQV0xfRGFzaChpbnQzMl90IGRhc2gsIGludDMyX3QgZ2FwLCBpbnQzMl90IHBoYXNlKQorICAgICAgOiBuRGFzaChkYXNoKSwgbkdhcChnYXApLCBuUGhhc2UocGhhc2UpIHt9CisKKyAgdm9pZCBSZXNldCgpIHsKKyAgICBuRGFzaCA9IDA7CisgICAgbkdhcCA9IDA7CisgICAgblBoYXNlID0gMDsKKyAgfQorCisgIGludDMyX3QgbkRhc2g7CisgIGludDMyX3QgbkdhcDsKKyAgaW50MzJfdCBuUGhhc2U7Cit9OworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENGWF9Db2xvciYgYzEsIGNvbnN0IENGWF9Db2xvciYgYzIpIHsKKyAgcmV0dXJuIGMxLm5Db2xvclR5cGUgPT0gYzIubkNvbG9yVHlwZSAmJiBjMS5mQ29sb3IxIC0gYzIuZkNvbG9yMSA8IDAuMDAwMSAmJgorICAgICAgICAgYzEuZkNvbG9yMSAtIGMyLmZDb2xvcjEgPiAtMC4wMDAxICYmCisgICAgICAgICBjMS5mQ29sb3IyIC0gYzIuZkNvbG9yMiA8IDAuMDAwMSAmJgorICAgICAgICAgYzEuZkNvbG9yMiAtIGMyLmZDb2xvcjIgPiAtMC4wMDAxICYmCisgICAgICAgICBjMS5mQ29sb3IzIC0gYzIuZkNvbG9yMyA8IDAuMDAwMSAmJgorICAgICAgICAgYzEuZkNvbG9yMyAtIGMyLmZDb2xvcjMgPiAtMC4wMDAxICYmCisgICAgICAgICBjMS5mQ29sb3I0IC0gYzIuZkNvbG9yNCA8IDAuMDAwMSAmJiBjMS5mQ29sb3I0IC0gYzIuZkNvbG9yNCA+IC0wLjAwMDE7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQ0ZYX0NvbG9yJiBjMSwgY29uc3QgQ0ZYX0NvbG9yJiBjMikgeworICByZXR1cm4gIShjMSA9PSBjMik7Cit9CisKKyNkZWZpbmUgUFdMX1NDUk9MTEJBUl9XSURUSCAxMi4wZgorI2RlZmluZSBQV0xfU0NST0xMQkFSX1RSQU5TUEFSRU5DWSAxNTAKKyNkZWZpbmUgUFdMX0RFRkFVTFRfQkxBQ0tDT0xPUiBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprR3JheSwgMCkKKyNkZWZpbmUgUFdMX0RFRkFVTFRfV0hJVEVDT0xPUiBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprR3JheSwgMSkKKworY2xhc3MgQ1BXTF9XbmQgOiBwdWJsaWMgQ1BXTF9UaW1lckhhbmRsZXIsIHB1YmxpYyBPYnNlcnZhYmxlPENQV0xfV25kPiB7CisgcHVibGljOgorICBjbGFzcyBQcml2YXRlRGF0YSB7CisgICBwcm90ZWN0ZWQ6CisgICAgflByaXZhdGVEYXRhKCkge30KKyAgfTsKKworICBjbGFzcyBQcm92aWRlcklmYWNlIDogcHVibGljIE9ic2VydmFibGU8UHJvdmlkZXJJZmFjZT4geworICAgcHVibGljOgorICAgIHZpcnR1YWwgflByb3ZpZGVySWZhY2UoKSB7fQorCisgICAgLy8gZ2V0IGEgbWF0cml4IHdoaWNoIG1hcCB1c2VyIHNwYWNlIHRvIENXbmQgY2xpZW50IHNwYWNlCisgICAgdmlydHVhbCBDRlhfTWF0cml4IEdldFdpbmRvd01hdHJpeChQcml2YXRlRGF0YSogcEF0dGFjaGVkKSA9IDA7CisgIH07CisKKyAgY2xhc3MgRm9jdXNIYW5kbGVySWZhY2UgeworICAgcHVibGljOgorICAgIHZpcnR1YWwgfkZvY3VzSGFuZGxlcklmYWNlKCkge30KKyAgICB2aXJ0dWFsIHZvaWQgT25TZXRGb2N1cyhDUFdMX0VkaXQqIHBFZGl0KSA9IDA7CisgIH07CisKKyAgY2xhc3MgQ3JlYXRlUGFyYW1zIHsKKyAgIHB1YmxpYzoKKyAgICBDcmVhdGVQYXJhbXMoKTsKKyAgICBDcmVhdGVQYXJhbXMoY29uc3QgQ3JlYXRlUGFyYW1zJiBvdGhlcik7CisgICAgfkNyZWF0ZVBhcmFtcygpOworCisgICAgQ0ZYX0Zsb2F0UmVjdCByY1JlY3RXbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlZAorICAgIENGWF9TeXN0ZW1IYW5kbGVyKiBwU3lzdGVtSGFuZGxlcjsgICAgICAgICAgICAgICAgLy8gcmVxdWlyZWQKKyAgICBJUFZUX0ZvbnRNYXAqIHBGb250TWFwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVpcmVkCisgICAgUHJvdmlkZXJJZmFjZTo6T2JzZXJ2ZWRQdHIgcFByb3ZpZGVyOyAgICAgICAgICAgICAvLyByZXF1aXJlZAorICAgIFVub3duZWRQdHI8Rm9jdXNIYW5kbGVySWZhY2U+IHBGb2N1c0hhbmRsZXI7ICAgICAgLy8gb3B0aW9uYWwKKyAgICB1aW50MzJfdCBkd0ZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsCisgICAgQ0ZYX0NvbG9yIHNCYWNrZ3JvdW5kQ29sb3I7ICAgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbAorICAgIENQREZTREtfV2lkZ2V0OjpPYnNlcnZlZFB0ciBwQXR0YWNoZWRXaWRnZXQ7ICAgICAgLy8gcmVxdWlyZWQKKyAgICBCb3JkZXJTdHlsZSBuQm9yZGVyU3R5bGU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsCisgICAgaW50MzJfdCBkd0JvcmRlcldpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbAorICAgIENGWF9Db2xvciBzQm9yZGVyQ29sb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwKKyAgICBDRlhfQ29sb3Igc1RleHRDb2xvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsCisgICAgaW50MzJfdCBuVHJhbnNwYXJlbmN5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25hbAorICAgIGZsb2F0IGZGb250U2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwKKyAgICBDUFdMX0Rhc2ggc0Rhc2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsCisgICAgVW5vd25lZFB0cjxQcml2YXRlRGF0YT4gcEF0dGFjaGVkRGF0YTsgICAgICAgICAgICAvLyBvcHRpb25hbAorICAgIENQV0xfV25kKiBwUGFyZW50V25kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgQ1BXTF9Nc2dDb250cm9sKiBwTXNnQ29udHJvbDsgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICBpbnQzMl90IGVDdXJzb3JUeXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgIENGWF9NYXRyaXggbXRDaGlsZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgIH07CisKKyAgQ1BXTF9XbmQoKTsKKyAgfkNQV0xfV25kKCkgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCBCeXRlU3RyaW5nIEdldENsYXNzTmFtZSgpIGNvbnN0OworCisgIC8vIFJldHVybnMgfHRydWV8IGlmZiB0aGlzIGluc3RhbmNlIGlzIHN0aWxsIGFsbG9jYXRlZC4KKyAgdmlydHVhbCBib29sIEludmFsaWRhdGVSZWN0KENGWF9GbG9hdFJlY3QqIHBSZWN0KTsKKworICB2aXJ0dWFsIGJvb2wgT25LZXlEb3duKHVpbnQxNl90IG5DaGFyLCB1aW50MzJfdCBuRmxhZyk7CisgIHZpcnR1YWwgYm9vbCBPbkNoYXIodWludDE2X3QgbkNoYXIsIHVpbnQzMl90IG5GbGFnKTsKKyAgdmlydHVhbCBib29sIE9uTEJ1dHRvbkRibENsayhjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpOworICB2aXJ0dWFsIGJvb2wgT25MQnV0dG9uRG93bihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpOworICB2aXJ0dWFsIGJvb2wgT25MQnV0dG9uVXAoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKTsKKyAgdmlydHVhbCBib29sIE9uUkJ1dHRvbkRvd24oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQsIHVpbnQzMl90IG5GbGFnKTsKKyAgdmlydHVhbCBib29sIE9uUkJ1dHRvblVwKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50LCB1aW50MzJfdCBuRmxhZyk7CisgIHZpcnR1YWwgYm9vbCBPbk1vdXNlTW92ZShjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwgdWludDMyX3QgbkZsYWcpOworICB2aXJ0dWFsIGJvb2wgT25Nb3VzZVdoZWVsKHNob3J0IHpEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBuRmxhZyk7CisgIHZpcnR1YWwgdm9pZCBTZXRTY3JvbGxJbmZvKGNvbnN0IFBXTF9TQ1JPTExfSU5GTyYgaW5mbyk7CisgIHZpcnR1YWwgdm9pZCBTZXRTY3JvbGxQb3NpdGlvbihmbG9hdCBwb3MpOworICB2aXJ0dWFsIHZvaWQgU2Nyb2xsV2luZG93VmVydGljYWxseShmbG9hdCBwb3MpOworICB2aXJ0dWFsIHZvaWQgTm90aWZ5TEJ1dHRvbkRvd24oQ1BXTF9XbmQqIGNoaWxkLCBjb25zdCBDRlhfUG9pbnRGJiBwb3MpOworICB2aXJ0dWFsIHZvaWQgTm90aWZ5TEJ1dHRvblVwKENQV0xfV25kKiBjaGlsZCwgY29uc3QgQ0ZYX1BvaW50RiYgcG9zKTsKKyAgdmlydHVhbCB2b2lkIE5vdGlmeU1vdXNlTW92ZShDUFdMX1duZCogY2hpbGQsIGNvbnN0IENGWF9Qb2ludEYmIHBvcyk7CisgIHZpcnR1YWwgdm9pZCBTZXRGb2N1cygpOworICB2aXJ0dWFsIHZvaWQgS2lsbEZvY3VzKCk7CisgIHZpcnR1YWwgdm9pZCBTZXRDdXJzb3IoKTsKKworICAvLyBSZXR1cm5zIHx0cnVlfCBpZmYgdGhpcyBpbnN0YW5jZSBpcyBzdGlsbCBhbGxvY2F0ZWQuCisgIHZpcnR1YWwgYm9vbCBTZXRWaXNpYmxlKGJvb2wgYlZpc2libGUpOworICB2aXJ0dWFsIHZvaWQgU2V0Rm9udFNpemUoZmxvYXQgZkZvbnRTaXplKTsKKyAgdmlydHVhbCBmbG9hdCBHZXRGb250U2l6ZSgpIGNvbnN0OworCisgIHZpcnR1YWwgV2lkZVN0cmluZyBHZXRTZWxlY3RlZFRleHQoKTsKKyAgdmlydHVhbCB2b2lkIFJlcGxhY2VTZWxlY3Rpb24oY29uc3QgV2lkZVN0cmluZyYgdGV4dCk7CisgIHZpcnR1YWwgQ0ZYX0Zsb2F0UmVjdCBHZXRGb2N1c1JlY3QoKSBjb25zdDsKKyAgdmlydHVhbCBDRlhfRmxvYXRSZWN0IEdldENsaWVudFJlY3QoKSBjb25zdDsKKworICB2b2lkIEludmFsaWRhdGVGb2N1c0hhbmRsZXIoRm9jdXNIYW5kbGVySWZhY2UqIGhhbmRsZXIpOworICB2b2lkIEludmFsaWRhdGVQcm92aWRlcihQcm92aWRlcklmYWNlKiBwcm92aWRlcik7CisgIHZvaWQgQ3JlYXRlKGNvbnN0IENyZWF0ZVBhcmFtcyYgY3ApOworICB2b2lkIERlc3Ryb3koKTsKKyAgYm9vbCBNb3ZlKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjTmV3LCBib29sIGJSZXNldCwgYm9vbCBiUmVmcmVzaCk7CisKKyAgdm9pZCBTZXRDYXB0dXJlKCk7CisgIHZvaWQgUmVsZWFzZUNhcHR1cmUoKTsKKworICB2b2lkIERyYXdBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbXRVc2VyMkRldmljZSk7CisKKyAgQ0ZYX0NvbG9yIEdldEJhY2tncm91bmRDb2xvcigpIGNvbnN0OworICB2b2lkIFNldEJhY2tncm91bmRDb2xvcihjb25zdCBDRlhfQ29sb3ImIGNvbG9yKTsKKyAgQ0ZYX0NvbG9yIEdldEJvcmRlckNvbG9yKCkgY29uc3Q7CisgIENGWF9Db2xvciBHZXRUZXh0Q29sb3IoKSBjb25zdDsKKyAgdm9pZCBTZXRUZXh0Q29sb3IoY29uc3QgQ0ZYX0NvbG9yJiBjb2xvcik7CisgIENGWF9Db2xvciBHZXRCb3JkZXJMZWZ0VG9wQ29sb3IoQm9yZGVyU3R5bGUgbkJvcmRlclN0eWxlKSBjb25zdDsKKyAgQ0ZYX0NvbG9yIEdldEJvcmRlclJpZ2h0Qm90dG9tQ29sb3IoQm9yZGVyU3R5bGUgbkJvcmRlclN0eWxlKSBjb25zdDsKKworICB2b2lkIFNldEJvcmRlclN0eWxlKEJvcmRlclN0eWxlIGVCb3JkZXJTdHlsZSk7CisgIEJvcmRlclN0eWxlIEdldEJvcmRlclN0eWxlKCkgY29uc3Q7CisgIGNvbnN0IENQV0xfRGFzaCYgR2V0Qm9yZGVyRGFzaCgpIGNvbnN0OworCisgIGludDMyX3QgR2V0Qm9yZGVyV2lkdGgoKSBjb25zdDsKKyAgaW50MzJfdCBHZXRJbm5lckJvcmRlcldpZHRoKCkgY29uc3Q7CisgIENGWF9GbG9hdFJlY3QgR2V0V2luZG93UmVjdCgpIGNvbnN0OworICBDRlhfUG9pbnRGIEdldENlbnRlclBvaW50KCkgY29uc3Q7CisKKyAgYm9vbCBJc1Zpc2libGUoKSBjb25zdCB7IHJldHVybiBtX2JWaXNpYmxlOyB9CisgIGJvb2wgSGFzRmxhZyh1aW50MzJfdCBkd0ZsYWdzKSBjb25zdDsKKyAgdm9pZCBBZGRGbGFnKHVpbnQzMl90IGR3RmxhZ3MpOworICB2b2lkIFJlbW92ZUZsYWcodWludDMyX3QgZHdGbGFncyk7CisKKyAgdm9pZCBTZXRDbGlwUmVjdChjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KTsKKyAgY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgR2V0Q2xpcFJlY3QoKSBjb25zdDsKKworICBDUFdMX1duZCogR2V0UGFyZW50V2luZG93KCkgY29uc3Q7CisgIFByaXZhdGVEYXRhKiBHZXRBdHRhY2hlZERhdGEoKSBjb25zdDsKKworICBib29sIFduZEhpdFRlc3QoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIGNvbnN0OworICBib29sIENsaWVudEhpdFRlc3QoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIGNvbnN0OworICBib29sIElzQ2FwdHVyZU1vdXNlKCkgY29uc3Q7CisKKyAgdm9pZCBFbmFibGVXaW5kb3coYm9vbCBiRW5hYmxlKTsKKyAgYm9vbCBJc0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBtX2JFbmFibGVkOyB9CisgIGNvbnN0IENQV0xfV25kKiBHZXRGb2N1c2VkKCkgY29uc3Q7CisgIGJvb2wgSXNGb2N1c2VkKCkgY29uc3Q7CisgIGJvb2wgSXNSZWFkT25seSgpIGNvbnN0OworICBDUFdMX1Njcm9sbEJhciogR2V0VlNjcm9sbEJhcigpIGNvbnN0OworCisgIElQVlRfRm9udE1hcCogR2V0Rm9udE1hcCgpIGNvbnN0OworICBQcm92aWRlcklmYWNlKiBHZXRQcm92aWRlcigpIGNvbnN0OworICBGb2N1c0hhbmRsZXJJZmFjZSogR2V0Rm9jdXNIYW5kbGVyKCkgY29uc3Q7CisKKyAgaW50MzJfdCBHZXRUcmFuc3BhcmVuY3koKTsKKyAgdm9pZCBTZXRUcmFuc3BhcmVuY3koaW50MzJfdCBuVHJhbnNwYXJlbmN5KTsKKworICBDRlhfTWF0cml4IEdldENoaWxkVG9Sb290KCkgY29uc3Q7CisgIENGWF9NYXRyaXggR2V0Q2hpbGRNYXRyaXgoKSBjb25zdDsKKyAgdm9pZCBTZXRDaGlsZE1hdHJpeChjb25zdCBDRlhfTWF0cml4JiBtdCk7CisgIENGWF9NYXRyaXggR2V0V2luZG93TWF0cml4KCkgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIE9uU2V0Rm9jdXMoKTsKKyAgdmlydHVhbCB2b2lkIE9uS2lsbEZvY3VzKCk7CisKKyBwcm90ZWN0ZWQ6CisgIC8vIENQV0xfVGltZXJIYW5kbGVyCisgIENGWF9TeXN0ZW1IYW5kbGVyKiBHZXRTeXN0ZW1IYW5kbGVyKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCB2b2lkIENyZWF0ZUNoaWxkV25kKGNvbnN0IENyZWF0ZVBhcmFtcyYgY3ApOworCisgIC8vIFJldHVybnMgfHRydWV8IGlmZiB0aGlzIGluc3RhbmNlIGlzIHN0aWxsIGFsbG9jYXRlZC4KKyAgdmlydHVhbCBib29sIFJlUG9zQ2hpbGRXbmQoKTsKKworICB2aXJ0dWFsIHZvaWQgRHJhd1RoaXNBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbXRVc2VyMkRldmljZSk7CisKKyAgdmlydHVhbCB2b2lkIE9uQ3JlYXRlKENyZWF0ZVBhcmFtcyogcFBhcmFtc1RvQWRqdXN0KTsKKyAgdmlydHVhbCB2b2lkIE9uQ3JlYXRlZCgpOworICB2aXJ0dWFsIHZvaWQgT25EZXN0cm95KCk7CisKKyAgdm9pZCBTZXROb3RpZnlGbGFnKGJvb2wgYk5vdGlmeWluZyA9IHRydWUpIHsgbV9iTm90aWZ5aW5nID0gYk5vdGlmeWluZzsgfQorICBib29sIElzTm90aWZ5aW5nKCkgY29uc3QgeyByZXR1cm4gbV9iTm90aWZ5aW5nOyB9CisgIGJvb2wgSXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1fYkNyZWF0ZWQ7IH0KKyAgY29uc3QgQ3JlYXRlUGFyYW1zJiBHZXRDcmVhdGlvblBhcmFtcygpIGNvbnN0IHsgcmV0dXJuIG1fQ3JlYXRpb25QYXJhbXM7IH0KKworICAvLyBSZXR1cm5zIHx0cnVlfCBpZmYgdGhpcyBpbnN0YW5jZSBpcyBzdGlsbCBhbGxvY2F0ZWQuCisgIGJvb2wgSW52YWxpZGF0ZVJlY3RNb3ZlKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJjT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRmxvYXRSZWN0JiByY05ldyk7CisKKyAgYm9vbCBJc1duZENhcHR1cmVNb3VzZShjb25zdCBDUFdMX1duZCogcFduZCkgY29uc3Q7CisgIGJvb2wgSXNXbmRDYXB0dXJlS2V5Ym9hcmQoY29uc3QgQ1BXTF9XbmQqIHBXbmQpIGNvbnN0OworICBjb25zdCBDUFdMX1duZCogR2V0Um9vdFduZCgpIGNvbnN0OworCisgIHN0YXRpYyBib29sIElzQ1RSTHByZXNzZWQodWludDMyX3QgbkZsYWcpIHsKKyAgICByZXR1cm4gQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpJc0NUUkxLZXlEb3duKG5GbGFnKTsKKyAgfQorICBzdGF0aWMgYm9vbCBJc1NISUZUcHJlc3NlZCh1aW50MzJfdCBuRmxhZykgeworICAgIHJldHVybiBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6OklzU0hJRlRLZXlEb3duKG5GbGFnKTsKKyAgfQorICBzdGF0aWMgYm9vbCBJc0FMVHByZXNzZWQodWludDMyX3QgbkZsYWcpIHsKKyAgICByZXR1cm4gQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpJc0FMVEtleURvd24obkZsYWcpOworICB9CisKKyBwcml2YXRlOgorICBDRlhfUG9pbnRGIFBhcmVudFRvQ2hpbGQoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIGNvbnN0OworICBDRlhfRmxvYXRSZWN0IFBhcmVudFRvQ2hpbGQoY29uc3QgQ0ZYX0Zsb2F0UmVjdCYgcmVjdCkgY29uc3Q7CisKKyAgdm9pZCBEcmF3Q2hpbGRBcHBlYXJhbmNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtdFVzZXIyRGV2aWNlKTsKKworICBDRlhfRmxvYXRSZWN0IFBXTHRvV25kKGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIGNvbnN0OworCisgIHZvaWQgQWRkQ2hpbGQoQ1BXTF9XbmQqIHBXbmQpOworICB2b2lkIFJlbW92ZUNoaWxkKENQV0xfV25kKiBwV25kKTsKKworICB2b2lkIENyZWF0ZVNjcm9sbEJhcihjb25zdCBDcmVhdGVQYXJhbXMmIGNwKTsKKyAgdm9pZCBDcmVhdGVWU2Nyb2xsQmFyKGNvbnN0IENyZWF0ZVBhcmFtcyYgY3ApOworCisgIHZvaWQgQWRqdXN0U3R5bGUoKTsKKyAgdm9pZCBDcmVhdGVNc2dDb250cm9sKCk7CisgIHZvaWQgRGVzdHJveU1zZ0NvbnRyb2woKTsKKworICBDUFdMX01zZ0NvbnRyb2wqIEdldE1zZ0NvbnRyb2woKSBjb25zdDsKKworICBDcmVhdGVQYXJhbXMgbV9DcmVhdGlvblBhcmFtczsKKyAgc3RkOjp2ZWN0b3I8Q1BXTF9XbmQqPiBtX0NoaWxkcmVuOworICBVbm93bmVkUHRyPENQV0xfU2Nyb2xsQmFyPiBtX3BWU2Nyb2xsQmFyOworICBDRlhfRmxvYXRSZWN0IG1fcmNXaW5kb3c7CisgIENGWF9GbG9hdFJlY3QgbV9yY0NsaXA7CisgIGJvb2wgbV9iQ3JlYXRlZDsKKyAgYm9vbCBtX2JWaXNpYmxlOworICBib29sIG1fYk5vdGlmeWluZzsKKyAgYm9vbCBtX2JFbmFibGVkOworfTsKKworI2VuZGlmICAvLyBGUERGU0RLX1BXTF9DUFdMX1dORF9IXwpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL0JDX0xpYnJhcnkuY3BwIGIvZnhiYXJjb2RlL0JDX0xpYnJhcnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNjU4ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvQkNfTGlicmFyeS5jcHAKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhiYXJjb2RlL0JDX0xpYnJhcnkuaCIKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRXJyb3JDb3JyZWN0aW9uLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sSW5mby5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTW9kZS5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlclZlcnNpb24uaCIKKwordm9pZCBCQ19MaWJyYXJ5X0luaXQoKSB7CisgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OkluaXRpYWxpemUoKTsKKyAgQ0JDX1FSQ29kZXJNb2RlOjpJbml0aWFsaXplKCk7CisgIENCQ19RUkNvZGVyVmVyc2lvbjo6SW5pdGlhbGl6ZSgpOworICBDQkNfUmVlZFNvbG9tb25HRjI1Njo6SW5pdGlhbGl6ZSgpOworICBDQkNfU3ltYm9sSW5mbzo6SW5pdGlhbGl6ZSgpOworICBDQkNfRXJyb3JDb3JyZWN0aW9uOjpJbml0aWFsaXplKCk7CisgIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpJbml0aWFsaXplKCk7Cit9CisKK3ZvaWQgQkNfTGlicmFyeV9EZXN0cm95KCkgeworICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpGaW5hbGl6ZSgpOworICBDQkNfUVJDb2Rlck1vZGU6OkZpbmFsaXplKCk7CisgIENCQ19RUkNvZGVyVmVyc2lvbjo6RmluYWxpemUoKTsKKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkZpbmFsaXplKCk7CisgIENCQ19TeW1ib2xJbmZvOjpGaW5hbGl6ZSgpOworICBDQkNfRXJyb3JDb3JyZWN0aW9uOjpGaW5hbGl6ZSgpOworICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6RmluYWxpemUoKTsKK30KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9CQ19MaWJyYXJ5LmggYi9meGJhcmNvZGUvQkNfTGlicmFyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOTg3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvQkNfTGlicmFyeS5oCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEJBUkNPREVfQkNfTElCUkFSWV9IXworI2RlZmluZSBGWEJBUkNPREVfQkNfTElCUkFSWV9IXworCitlbnVtIEJDX1RFWFRfTE9DIHsKKyAgQkNfVEVYVF9MT0NfTk9ORSA9IDAsCisgIEJDX1RFWFRfTE9DX0FCT1ZFLAorICBCQ19URVhUX0xPQ19CRUxPVywKKyAgQkNfVEVYVF9MT0NfQUJPVkVFTUJFRCwKKyAgQkNfVEVYVF9MT0NfQkVMT1dFTUJFRAorfTsKKworZW51bSBCQ19DSEFSX0VOQ09ESU5HIHsgQ0hBUl9FTkNPRElOR19VVEY4ID0gMCwgQ0hBUl9FTkNPRElOR19VTklDT0RFIH07CisKK2VudW0gQkNfVFlQRSB7CisgIEJDX1VOS05PV04gPSAtMSwKKyAgQkNfQ09ERTM5ID0gMCwKKyAgQkNfQ09EQUJBUiwKKyAgQkNfQ09ERTEyOCwKKyAgQkNfQ09ERTEyOF9CLAorICBCQ19DT0RFMTI4X0MsCisgIEJDX0VBTjgsCisgIEJDX1VQQ0EsCisgIEJDX0VBTjEzLAorICBCQ19RUl9DT0RFLAorICBCQ19QREY0MTcsCisgIEJDX0RBVEFNQVRSSVgKK307CisKK3ZvaWQgQkNfTGlicmFyeV9Jbml0KCk7Cit2b2lkIEJDX0xpYnJhcnlfRGVzdHJveSgpOworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9CQ19MSUJSQVJZX0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvQkNfVHdvRGltV3JpdGVyLmNwcCBiL2Z4YmFyY29kZS9CQ19Ud29EaW1Xcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NTJmZWUKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvQkNfVHdvRGltV3JpdGVyLmNwcApAQCAtMCwwICsxLDExMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9ncmFwaHN0YXRlZGF0YS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcGF0aGRhdGEuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9CQ19Ud29EaW1Xcml0ZXIuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvQkNfV3JpdGVyLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfbWF0aC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworQ0JDX1R3b0RpbVdyaXRlcjo6Q0JDX1R3b0RpbVdyaXRlcigpIDogbV9pQ29ycmVjdExldmVsKDEpLCBtX2JGaXhlZFNpemUodHJ1ZSkge30KKworQ0JDX1R3b0RpbVdyaXRlcjo6fkNCQ19Ud29EaW1Xcml0ZXIoKSB7fQorCit2b2lkIENCQ19Ud29EaW1Xcml0ZXI6OlJlbmRlckRldmljZVJlc3VsdChDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgpIHsKKyAgQ0ZYX0dyYXBoU3RhdGVEYXRhIHN0YXRlRGF0YTsKKyAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisgIHBhdGguQXBwZW5kUmVjdCgwLCAwLCAoZmxvYXQpbV9XaWR0aCwgKGZsb2F0KW1fSGVpZ2h0KTsKKyAgZGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgbWF0cml4LCAmc3RhdGVEYXRhLCBtX2JhY2tncm91bmRDb2xvciwKKyAgICAgICAgICAgICAgICAgICBtX2JhY2tncm91bmRDb2xvciwgRlhGSUxMX0FMVEVSTkFURSk7CisgIGludDMyX3QgbGVmdFBvcyA9IDA7CisgIGludDMyX3QgdG9wUG9zID0gMDsKKyAgaWYgKG1fYkZpeGVkU2l6ZSkgeworICAgIGxlZnRQb3MgPSAobV9XaWR0aCAtIG1fb3V0cHV0LT5HZXRXaWR0aCgpKSAvIDI7CisgICAgdG9wUG9zID0gKG1fSGVpZ2h0IC0gbV9vdXRwdXQtPkdldEhlaWdodCgpKSAvIDI7CisgIH0KKyAgQ0ZYX01hdHJpeCBtYXRyaSA9ICptYXRyaXg7CisgIGlmIChtX1dpZHRoIDwgbV9vdXRwdXQtPkdldFdpZHRoKCkgJiYgbV9IZWlnaHQgPCBtX291dHB1dC0+R2V0SGVpZ2h0KCkpIHsKKyAgICBDRlhfTWF0cml4IG1hdHJpU2NhbGUoKGZsb2F0KW1fV2lkdGggLyAoZmxvYXQpbV9vdXRwdXQtPkdldFdpZHRoKCksIDAuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wLCAoZmxvYXQpbV9IZWlnaHQgLyAoZmxvYXQpbV9vdXRwdXQtPkdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAsIDAuMCk7CisgICAgbWF0cmlTY2FsZS5Db25jYXQoKm1hdHJpeCk7CisgICAgbWF0cmkgPSBtYXRyaVNjYWxlOworICB9CisgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IG1fb3V0cHV0LT5HZXRXaWR0aCgpOyB4KyspIHsKKyAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBtX291dHB1dC0+R2V0SGVpZ2h0KCk7IHkrKykgeworICAgICAgQ0ZYX1BhdGhEYXRhIHJlY3Q7CisgICAgICByZWN0LkFwcGVuZFJlY3QoKGZsb2F0KWxlZnRQb3MgKyB4LCAoZmxvYXQpdG9wUG9zICsgeSwKKyAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpKGxlZnRQb3MgKyB4ICsgMSksIChmbG9hdCkodG9wUG9zICsgeSArIDEpKTsKKyAgICAgIGlmIChtX291dHB1dC0+R2V0KHgsIHkpKSB7CisgICAgICAgIENGWF9HcmFwaFN0YXRlRGF0YSBkYXRhOworICAgICAgICBkZXZpY2UtPkRyYXdQYXRoKCZyZWN0LCAmbWF0cmksICZkYXRhLCBtX2JhckNvbG9yLCAwLCBGWEZJTExfV0lORElORyk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK2ludDMyX3QgQ0JDX1R3b0RpbVdyaXRlcjo6R2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoKSBjb25zdCB7CisgIHJldHVybiBtX2lDb3JyZWN0TGV2ZWw7Cit9CisKK2Jvb2wgQ0JDX1R3b0RpbVdyaXRlcjo6UmVuZGVyUmVzdWx0KHVpbnQ4X3QqIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZUhlaWdodCkgeworICBpbnQzMl90IGlucHV0V2lkdGggPSBjb2RlV2lkdGg7CisgIGludDMyX3QgaW5wdXRIZWlnaHQgPSBjb2RlSGVpZ2h0OworICBpbnQzMl90IHRlbXBXaWR0aCA9IGlucHV0V2lkdGggKyAyOworICBpbnQzMl90IHRlbXBIZWlnaHQgPSBpbnB1dEhlaWdodCArIDI7CisgIGZsb2F0IG1vZHVsZUhTaXplID0gc3RkOjptaW4obV9Nb2R1bGVXaWR0aCwgbV9Nb2R1bGVIZWlnaHQpOworICBtb2R1bGVIU2l6ZSA9IHN0ZDo6bWluKG1vZHVsZUhTaXplLCA4LjBmKTsKKyAgbW9kdWxlSFNpemUgPSBzdGQ6Om1heChtb2R1bGVIU2l6ZSwgMS4wZik7CisgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8aW50MzJfdD4gc2NhbGVkV2lkdGggPSB0ZW1wV2lkdGg7CisgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8aW50MzJfdD4gc2NhbGVkSGVpZ2h0ID0gdGVtcEhlaWdodDsKKyAgc2NhbGVkV2lkdGggKj0gbW9kdWxlSFNpemU7CisgIHNjYWxlZEhlaWdodCAqPSBtb2R1bGVIU2l6ZTsKKworICBpbnQzMl90IG91dHB1dFdpZHRoID0gc2NhbGVkV2lkdGguVmFsdWVPckRpZSgpOworICBpbnQzMl90IG91dHB1dEhlaWdodCA9IHNjYWxlZEhlaWdodC5WYWx1ZU9yRGllKCk7CisgIGlmIChtX2JGaXhlZFNpemUpIHsKKyAgICBpZiAobV9XaWR0aCA8IG91dHB1dFdpZHRoIHx8IG1fSGVpZ2h0IDwgb3V0cHV0SGVpZ2h0KSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChtX1dpZHRoID4gb3V0cHV0V2lkdGggfHwgbV9IZWlnaHQgPiBvdXRwdXRIZWlnaHQpIHsKKyAgICAgIG91dHB1dFdpZHRoID0KKyAgICAgICAgICAoaW50MzJfdCkob3V0cHV0V2lkdGggKiBjZWlsKChmbG9hdCltX1dpZHRoIC8gKGZsb2F0KW91dHB1dFdpZHRoKSk7CisgICAgICBvdXRwdXRIZWlnaHQgPQorICAgICAgICAgIChpbnQzMl90KShvdXRwdXRIZWlnaHQgKiBjZWlsKChmbG9hdCltX0hlaWdodCAvIChmbG9hdClvdXRwdXRIZWlnaHQpKTsKKyAgICB9CisgIH0KKyAgaW50MzJfdCBtdWx0aVggPSAoaW50MzJfdCljZWlsKChmbG9hdClvdXRwdXRXaWR0aCAvIChmbG9hdCl0ZW1wV2lkdGgpOworICBpbnQzMl90IG11bHRpWSA9IChpbnQzMl90KWNlaWwoKGZsb2F0KW91dHB1dEhlaWdodCAvIChmbG9hdCl0ZW1wSGVpZ2h0KTsKKyAgaWYgKG1fYkZpeGVkU2l6ZSkgeworICAgIG11bHRpWCA9IHN0ZDo6bWluKG11bHRpWCwgbXVsdGlZKTsKKyAgICBtdWx0aVkgPSBtdWx0aVg7CisgIH0KKyAgaW50MzJfdCBsZWZ0UGFkZGluZyA9IHN0ZDo6bWF4KChvdXRwdXRXaWR0aCAtIChpbnB1dFdpZHRoICogbXVsdGlYKSkgLyAyLCAwKTsKKyAgaW50MzJfdCB0b3BQYWRkaW5nID0gc3RkOjptYXgoKG91dHB1dEhlaWdodCAtIChpbnB1dEhlaWdodCAqIG11bHRpWSkpIC8gMiwgMCk7CisgIG1fb3V0cHV0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENCQ19Db21tb25CaXRNYXRyaXg+KCk7CisgIG1fb3V0cHV0LT5Jbml0KG91dHB1dFdpZHRoLCBvdXRwdXRIZWlnaHQpOworICBmb3IgKGludDMyX3QgaW5wdXRZID0gMCwgb3V0cHV0WSA9IHRvcFBhZGRpbmc7CisgICAgICAgKGlucHV0WSA8IGlucHV0SGVpZ2h0KSAmJiAob3V0cHV0WSA8IG91dHB1dEhlaWdodCAtIG11bHRpWSk7CisgICAgICAgaW5wdXRZKyssIG91dHB1dFkgKz0gbXVsdGlZKSB7CisgICAgZm9yIChpbnQzMl90IGlucHV0WCA9IDAsIG91dHB1dFggPSBsZWZ0UGFkZGluZzsKKyAgICAgICAgIChpbnB1dFggPCBpbnB1dFdpZHRoKSAmJiAob3V0cHV0WCA8IG91dHB1dFdpZHRoIC0gbXVsdGlYKTsKKyAgICAgICAgIGlucHV0WCsrLCBvdXRwdXRYICs9IG11bHRpWCkgeworICAgICAgaWYgKGNvZGVbaW5wdXRYICsgaW5wdXRZICogaW5wdXRXaWR0aF0gPT0gMSAmJgorICAgICAgICAgICFtX291dHB1dC0+U2V0UmVnaW9uKG91dHB1dFgsIG91dHB1dFksIG11bHRpWCwgbXVsdGlZKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL0JDX1R3b0RpbVdyaXRlci5oIGIvZnhiYXJjb2RlL0JDX1R3b0RpbVdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NTQ4MDUKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvQkNfVHdvRGltV3JpdGVyLmgKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9CQ19UV09ESU1XUklURVJfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX0JDX1RXT0RJTVdSSVRFUl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9CQ19Xcml0ZXIuaCIKKworY2xhc3MgQ0JDX0NvbW1vbkJpdE1hdHJpeDsKK2NsYXNzIENGWF9SZW5kZXJEZXZpY2U7CisKK2NsYXNzIENCQ19Ud29EaW1Xcml0ZXIgOiBwdWJsaWMgQ0JDX1dyaXRlciB7CisgcHVibGljOgorICBDQkNfVHdvRGltV3JpdGVyKCk7CisgIH5DQkNfVHdvRGltV3JpdGVyKCkgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCBib29sIFJlbmRlclJlc3VsdCh1aW50OF90KiBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZUhlaWdodCk7CisgIHZpcnR1YWwgdm9pZCBSZW5kZXJEZXZpY2VSZXN1bHQoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCk7CisgIHZpcnR1YWwgYm9vbCBTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGxldmVsKSA9IDA7CisgIGludDMyX3QgR2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoKSBjb25zdDsKKworIHByb3RlY3RlZDoKKyAgaW50MzJfdCBtX2lDb3JyZWN0TGV2ZWw7CisgIGJvb2wgbV9iRml4ZWRTaXplOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0JDX0NvbW1vbkJpdE1hdHJpeD4gbV9vdXRwdXQ7Cit9OworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9CQ19UV09ESU1XUklURVJfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9CQ19VdGlsQ29kaW5nQ29udmVydC5jcHAgYi9meGJhcmNvZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YzUyZjIKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuY3BwCkBAIC0wLDAgKzEsNTEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4YmFyY29kZS9CQ19VdGlsQ29kaW5nQ29udmVydC5oIgorCitDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OkNCQ19VdGlsQ29kaW5nQ29udmVydCgpIHt9CisKK0NCQ19VdGlsQ29kaW5nQ29udmVydDo6fkNCQ19VdGlsQ29kaW5nQ29udmVydCgpIHt9CisKK3ZvaWQgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpVbmljb2RlVG9Mb2NhbGUoY29uc3QgV2lkZVN0cmluZyYgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nJiBkc3QpIHsKKyAgZHN0ID0gQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoc3JjKTsKK30KKwordm9pZCBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OkxvY2FsZVRvVXRmOChjb25zdCBCeXRlU3RyaW5nJiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHJpbmcmIGRzdCkgeworICBXaWRlU3RyaW5nIHVuaWNvZGUgPSBXaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3JjLkFzU3RyaW5nVmlldygpKTsKKyAgZHN0ID0gdW5pY29kZS5VVEY4RW5jb2RlKCk7Cit9CisKK3ZvaWQgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpMb2NhbGVUb1V0ZjgoY29uc3QgQnl0ZVN0cmluZyYgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZHN0KSB7CisgIFdpZGVTdHJpbmcgdW5pY29kZSA9IFdpZGVTdHJpbmc6OkZyb21Mb2NhbChzcmMuQXNTdHJpbmdWaWV3KCkpOworICBCeXRlU3RyaW5nIHV0ZjggPSB1bmljb2RlLlVURjhFbmNvZGUoKTsKKyAgZHN0ID0gc3RkOjp2ZWN0b3I8dWludDhfdD4odXRmOC5iZWdpbigpLCB1dGY4LmVuZCgpKTsKK30KKwordm9pZCBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OlV0ZjhUb0xvY2FsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nJiBkc3QpIHsKKyAgQnl0ZVN0cmluZyB1dGY4OworICBmb3IgKHVpbnQ4X3QgdmFsdWUgOiBzcmMpCisgICAgdXRmOCArPSB2YWx1ZTsKKworICBXaWRlU3RyaW5nIHVuaWNvZGUgPSBXaWRlU3RyaW5nOjpGcm9tVVRGOCh1dGY4LkFzU3RyaW5nVmlldygpKTsKKyAgZHN0ID0gQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUodW5pY29kZSk7Cit9CisKK3ZvaWQgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpVdGY4VG9Mb2NhbGUoY29uc3QgdWludDhfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlU3RyaW5nJiBkc3QpIHsKKyAgV2lkZVN0cmluZyB1bmljb2RlID0gV2lkZVN0cmluZzo6RnJvbVVURjgoQnl0ZVN0cmluZ1ZpZXcoc3JjLCBjb3VudCkpOworICBkc3QgPSBCeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh1bmljb2RlKTsKK30KKwordm9pZCBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OlVuaWNvZGVUb1VURjgoY29uc3QgV2lkZVN0cmluZyYgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0cmluZyYgZHN0KSB7CisgIGRzdCA9IHNyYy5VVEY4RW5jb2RlKCk7Cit9CmRpZmYgLS1naXQgYS9meGJhcmNvZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuaCBiL2Z4YmFyY29kZS9CQ19VdGlsQ29kaW5nQ29udmVydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MDBjZDEKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuaApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhCQVJDT0RFX0JDX1VUSUxDT0RJTkdDT05WRVJUX0hfCisjZGVmaW5lIEZYQkFSQ09ERV9CQ19VVElMQ09ESU5HQ09OVkVSVF9IXworCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKworY2xhc3MgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0IHsKKyBwdWJsaWM6CisgIENCQ19VdGlsQ29kaW5nQ29udmVydCgpOworICB2aXJ0dWFsIH5DQkNfVXRpbENvZGluZ0NvbnZlcnQoKTsKKyAgc3RhdGljIHZvaWQgVW5pY29kZVRvTG9jYWxlKGNvbnN0IFdpZGVTdHJpbmcmIHNvdXJjZSwgQnl0ZVN0cmluZyYgcmVzdWx0KTsKKyAgc3RhdGljIHZvaWQgTG9jYWxlVG9VdGY4KGNvbnN0IEJ5dGVTdHJpbmcmIHNvdXJjZSwgQnl0ZVN0cmluZyYgcmVzdWx0KTsKKyAgc3RhdGljIHZvaWQgTG9jYWxlVG9VdGY4KGNvbnN0IEJ5dGVTdHJpbmcmIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiByZXN1bHQpOworICBzdGF0aWMgdm9pZCBVdGY4VG9Mb2NhbGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHJpbmcmIHJlc3VsdCk7CisgIHN0YXRpYyB2b2lkIFV0ZjhUb0xvY2FsZShjb25zdCB1aW50OF90KiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZVN0cmluZyYgcmVzdWx0KTsKKyAgc3RhdGljIHZvaWQgVW5pY29kZVRvVVRGOChjb25zdCBXaWRlU3RyaW5nJiBzb3VyY2UsIEJ5dGVTdHJpbmcmIHJlc3VsdCk7Cit9OworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9CQ19VVElMQ09ESU5HQ09OVkVSVF9IXwpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL0JDX1V0aWxzLmNwcCBiL2Z4YmFyY29kZS9CQ19VdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQwOWUyNAotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9CQ19VdGlscy5jcHAKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL3V0aWxzLmgiCisKK2Jvb2wgQkNfRlhfQnl0ZVN0cmluZ19SZXBsYWNlKEJ5dGVTdHJpbmcmIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGMpIHsKKyAgaWYgKGZpcnN0ID4gbGFzdCB8fCBjb3VudCA8PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGRzdC5EZWxldGUoZmlyc3QsIGxhc3QgLSBmaXJzdCk7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBkc3QuSW5zZXJ0QXRGcm9udChjKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChCeXRlU3RyaW5nJiBkc3QsIGludDMyX3QgY291bnQsIGNoYXIgYykgeworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIGRzdCArPSBjOworfQordm9pZCBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChCeXRlU3RyaW5nJiBkc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBiYSkgeworICBmb3IgKHVpbnQ4X3QgdmFsdWUgOiBiYSkKKyAgICBkc3QgKz0gdmFsdWU7Cit9CmRpZmYgLS1naXQgYS9meGJhcmNvZGUvQkNfV3JpdGVyLmNwcCBiL2Z4YmFyY29kZS9CQ19Xcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjOGUwY2YKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvQkNfV3JpdGVyLmNwcApAQCAtMCwwICsxLDU4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvQkNfV3JpdGVyLmgiCisKK0NCQ19Xcml0ZXI6OkNCQ19Xcml0ZXIoKSB7CisgIG1fQ2hhckVuY29kaW5nID0gMDsKKyAgbV9Nb2R1bGVIZWlnaHQgPSAxOworICBtX01vZHVsZVdpZHRoID0gMTsKKyAgbV9IZWlnaHQgPSAzMjA7CisgIG1fV2lkdGggPSA2NDA7CisgIG1fY29sb3JTcGFjZSA9IEZYRElCX0FyZ2I7CisgIG1fYmFyQ29sb3IgPSAweGZmMDAwMDAwOworICBtX2JhY2tncm91bmRDb2xvciA9IDB4ZmZmZmZmZmY7Cit9CitDQkNfV3JpdGVyOjp+Q0JDX1dyaXRlcigpIHt9Citib29sIENCQ19Xcml0ZXI6OlNldENoYXJFbmNvZGluZyhpbnQzMl90IGVuY29kaW5nKSB7CisgIG1fQ2hhckVuY29kaW5nID0gZW5jb2Rpbmc7CisgIHJldHVybiB0cnVlOworfQorYm9vbCBDQkNfV3JpdGVyOjpTZXRNb2R1bGVIZWlnaHQoaW50MzJfdCBtb2R1bGVIZWlnaHQpIHsKKyAgaWYgKG1vZHVsZUhlaWdodCA+IDEwIHx8IG1vZHVsZUhlaWdodCA8IDEpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbV9Nb2R1bGVIZWlnaHQgPSBtb2R1bGVIZWlnaHQ7CisgIHJldHVybiB0cnVlOworfQorYm9vbCBDQkNfV3JpdGVyOjpTZXRNb2R1bGVXaWR0aChpbnQzMl90IG1vZHVsZVdpZHRoKSB7CisgIGlmIChtb2R1bGVXaWR0aCA+IDEwIHx8IG1vZHVsZVdpZHRoIDwgMSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBtX01vZHVsZVdpZHRoID0gbW9kdWxlV2lkdGg7CisgIHJldHVybiB0cnVlOworfQorYm9vbCBDQkNfV3JpdGVyOjpTZXRIZWlnaHQoaW50MzJfdCBoZWlnaHQpIHsKKyAgbV9IZWlnaHQgPSBoZWlnaHQ7CisgIHJldHVybiB0cnVlOworfQorYm9vbCBDQkNfV3JpdGVyOjpTZXRXaWR0aChpbnQzMl90IHdpZHRoKSB7CisgIG1fV2lkdGggPSB3aWR0aDsKKyAgcmV0dXJuIHRydWU7Cit9Cit2b2lkIENCQ19Xcml0ZXI6OlNldEJhY2tncm91bmRDb2xvcihGWF9BUkdCIGJhY2tncm91bmRDb2xvcikgeworICBtX2JhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsKK30KK3ZvaWQgQ0JDX1dyaXRlcjo6U2V0QmFyY29kZUNvbG9yKEZYX0FSR0IgZm9yZWdyb3VuZENvbG9yKSB7CisgIG1fYmFyQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3I7Cit9CisKK1JldGFpblB0cjxDRlhfRElCaXRtYXA+IENCQ19Xcml0ZXI6OkNyZWF0ZURJQml0bWFwKGludDMyX3Qgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCkgeworICBhdXRvIHBESUJpdG1hcCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfRElCaXRtYXA+KCk7CisgIHBESUJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIG1fY29sb3JTcGFjZSk7CisgIHJldHVybiBwRElCaXRtYXA7Cit9CmRpZmYgLS1naXQgYS9meGJhcmNvZGUvQkNfV3JpdGVyLmggYi9meGJhcmNvZGUvQkNfV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1YzAzZgotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9CQ19Xcml0ZXIuaApAQCAtMCwwICsxLDM5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhCQVJDT0RFX0JDX1dSSVRFUl9IXworI2RlZmluZSBGWEJBUkNPREVfQkNfV1JJVEVSX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2RpYml0bWFwLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS91dGlscy5oIgorCitjbGFzcyBDQkNfV3JpdGVyIHsKKyBwdWJsaWM6CisgIENCQ19Xcml0ZXIoKTsKKyAgdmlydHVhbCB+Q0JDX1dyaXRlcigpOworICB2aXJ0dWFsIGJvb2wgU2V0Q2hhckVuY29kaW5nKGludDMyX3QgZW5jb2RpbmcpOworICB2aXJ0dWFsIGJvb2wgU2V0TW9kdWxlSGVpZ2h0KGludDMyX3QgbW9kdWxlSGVpZ2h0KTsKKyAgdmlydHVhbCBib29sIFNldE1vZHVsZVdpZHRoKGludDMyX3QgbW9kdWxlV2lkdGgpOworICB2aXJ0dWFsIGJvb2wgU2V0SGVpZ2h0KGludDMyX3QgaGVpZ2h0KTsKKyAgdmlydHVhbCBib29sIFNldFdpZHRoKGludDMyX3Qgd2lkdGgpOworICB2aXJ0dWFsIHZvaWQgU2V0QmFja2dyb3VuZENvbG9yKEZYX0FSR0IgYmFja2dyb3VuZENvbG9yKTsKKyAgdmlydHVhbCB2b2lkIFNldEJhcmNvZGVDb2xvcihGWF9BUkdCIGZvcmVncm91bmRDb2xvcik7CisKKyBwcm90ZWN0ZWQ6CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IENyZWF0ZURJQml0bWFwKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKyAgaW50MzJfdCBtX0NoYXJFbmNvZGluZzsKKyAgaW50MzJfdCBtX01vZHVsZUhlaWdodDsKKyAgaW50MzJfdCBtX01vZHVsZVdpZHRoOworICBpbnQzMl90IG1fSGVpZ2h0OworICBpbnQzMl90IG1fV2lkdGg7CisgIEZYRElCX0Zvcm1hdCBtX2NvbG9yU3BhY2U7CisgIEZYX0FSR0IgbV9iYXJDb2xvcjsKKyAgRlhfQVJHQiBtX2JhY2tncm91bmRDb2xvcjsKK307CisKKyNlbmRpZiAgLy8gRlhCQVJDT0RFX0JDX1dSSVRFUl9IXwpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL0RFUFMgYi9meGJhcmNvZGUvREVQUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWEyNjVhCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL0RFUFMKQEAgLTAsMCArMSw2IEBACitpbmNsdWRlX3J1bGVzID0gWworICAnK2NvcmUvZnhjb2RlYycsCisgICcrY29yZS9meGNydCcsCisgICcrY29yZS9meGdlJywKKyAgJyt0aGlyZF9wYXJ0eS9iaWdpbnQnLAorXQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2NiY19jb2RhYmFyLmNwcCBiL2Z4YmFyY29kZS9jYmNfY29kYWJhci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5NWZmMgotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9jYmNfY29kYWJhci5jcHAKQEAgLTAsMCArMSw4NCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorLyoKKyAqIENvcHlyaWdodCAyMDExIFpYaW5nIGF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImZ4YmFyY29kZS9jYmNfY29kYWJhci5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJXcml0ZXIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK0NCQ19Db2RhYmFyOjpDQkNfQ29kYWJhcigpCisgICAgOiBDQkNfT25lQ29kZShwZGZpdW06Ok1ha2VVbmlxdWU8Q0JDX09uZWRDb2RhQmFyV3JpdGVyPigpKSB7fQorCitDQkNfQ29kYWJhcjo6fkNCQ19Db2RhYmFyKCkge30KKworYm9vbCBDQkNfQ29kYWJhcjo6U2V0U3RhcnRDaGFyKGNoYXIgc3RhcnQpIHsKKyAgcmV0dXJuIEdldE9uZWRDb2RhQmFyV3JpdGVyKCktPlNldFN0YXJ0Q2hhcihzdGFydCk7Cit9CisKK2Jvb2wgQ0JDX0NvZGFiYXI6OlNldEVuZENoYXIoY2hhciBlbmQpIHsKKyAgcmV0dXJuIEdldE9uZWRDb2RhQmFyV3JpdGVyKCktPlNldEVuZENoYXIoZW5kKTsKK30KKworYm9vbCBDQkNfQ29kYWJhcjo6U2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKSB7CisgIHJldHVybiBHZXRPbmVkQ29kYUJhcldyaXRlcigpLT5TZXRUZXh0TG9jYXRpb24obG9jYXRpb24pOworfQorCitib29sIENCQ19Db2RhYmFyOjpTZXRXaWRlTmFycm93UmF0aW8oaW50OF90IHJhdGlvKSB7CisgIHJldHVybiBHZXRPbmVkQ29kYUJhcldyaXRlcigpLT5TZXRXaWRlTmFycm93UmF0aW8ocmF0aW8pOworfQorCitib29sIENCQ19Db2RhYmFyOjpFbmNvZGUoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzKSB7CisgIGlmIChjb250ZW50cy5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIEJDRk9STUFUIGZvcm1hdCA9IEJDRk9STUFUX0NPREFCQVI7CisgIGludDMyX3Qgb3V0V2lkdGggPSAwOworICBpbnQzMl90IG91dEhlaWdodCA9IDA7CisgIFdpZGVTdHJpbmcgZmlsdGVyY29udGVudHMgPSBHZXRPbmVkQ29kYUJhcldyaXRlcigpLT5GaWx0ZXJDb250ZW50cyhjb250ZW50cyk7CisgIEJ5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IGZpbHRlcmNvbnRlbnRzLlVURjhFbmNvZGUoKTsKKyAgbV9yZW5kZXJDb250ZW50cyA9IGZpbHRlcmNvbnRlbnRzOworICBhdXRvKiBwV3JpdGVyID0gR2V0T25lZENvZGFCYXJXcml0ZXIoKTsKKyAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IGRhdGEoCisgICAgICBwV3JpdGVyLT5FbmNvZGUoYnl0ZVN0cmluZywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0KSk7CisgIGlmICghZGF0YSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIHBXcml0ZXItPlJlbmRlclJlc3VsdChmaWx0ZXJjb250ZW50cy5Bc1N0cmluZ1ZpZXcoKSwgZGF0YS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRXaWR0aCk7Cit9CisKK2Jvb2wgQ0JDX0NvZGFiYXI6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4KSB7CisgIGF1dG8qIHBXcml0ZXIgPSBHZXRPbmVkQ29kYUJhcldyaXRlcigpOworICBXaWRlU3RyaW5nIHJlbmRlckNvbiA9CisgICAgICBwV3JpdGVyLT5lbmNvZGVkQ29udGVudHMobV9yZW5kZXJDb250ZW50cy5Bc1N0cmluZ1ZpZXcoKSk7CisgIHJldHVybiBwV3JpdGVyLT5SZW5kZXJEZXZpY2VSZXN1bHQoZGV2aWNlLCBtYXRyaXgsIHJlbmRlckNvbi5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKK0JDX1RZUEUgQ0JDX0NvZGFiYXI6OkdldFR5cGUoKSB7CisgIHJldHVybiBCQ19DT0RBQkFSOworfQorCitDQkNfT25lZENvZGFCYXJXcml0ZXIqIENCQ19Db2RhYmFyOjpHZXRPbmVkQ29kYUJhcldyaXRlcigpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PENCQ19PbmVkQ29kYUJhcldyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKTsKK30KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9jYmNfY29kYWJhci5oIGIvZnhiYXJjb2RlL2NiY19jb2RhYmFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3ZmMyOAotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9jYmNfY29kYWJhci5oCkBAIC0wLDAgKzEsMzkgQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEJBUkNPREVfQ0JDX0NPREFCQVJfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX0NCQ19DT0RBQkFSX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NiY19vbmVjb2RlLmgiCisKK2NsYXNzIENCQ19PbmVkQ29kYUJhcldyaXRlcjsKKworY2xhc3MgQ0JDX0NvZGFiYXIgOiBwdWJsaWMgQ0JDX09uZUNvZGUgeworIHB1YmxpYzoKKyAgQ0JDX0NvZGFiYXIoKTsKKyAgfkNCQ19Db2RhYmFyKCkgb3ZlcnJpZGU7CisKKyAgLy8gQ0JDX09uZUNvZGU6CisgIGJvb2wgRW5jb2RlKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cykgb3ZlcnJpZGU7CisgIGJvb2wgUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4KSBvdmVycmlkZTsKKyAgQkNfVFlQRSBHZXRUeXBlKCkgb3ZlcnJpZGU7CisKKyAgYm9vbCBTZXRTdGFydENoYXIoY2hhciBzdGFydCk7CisgIGJvb2wgU2V0RW5kQ2hhcihjaGFyIGVuZCk7CisgIGJvb2wgU2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKTsKKyAgYm9vbCBTZXRXaWRlTmFycm93UmF0aW8oaW50OF90IHJhdGlvKTsKKworIHByaXZhdGU6CisgIENCQ19PbmVkQ29kYUJhcldyaXRlciogR2V0T25lZENvZGFCYXJXcml0ZXIoKTsKKworICBXaWRlU3RyaW5nIG1fcmVuZGVyQ29udGVudHM7Cit9OworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9DQkNfQ09EQUJBUl9IXwpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2NiY19jb2RlMTI4LmNwcCBiL2Z4YmFyY29kZS9jYmNfY29kZTEyOC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhNjIzNQotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9jYmNfY29kZTEyOC5jcHAKQEAgLTAsMCArMSw3MyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorLyoKKyAqIENvcHlyaWdodCAyMDExIFpYaW5nIGF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImZ4YmFyY29kZS9jYmNfY29kZTEyOC5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhXcml0ZXIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK0NCQ19Db2RlMTI4OjpDQkNfQ29kZTEyOChCQ19UWVBFIHR5cGUpCisgICAgOiBDQkNfT25lQ29kZShwZGZpdW06Ok1ha2VVbmlxdWU8Q0JDX09uZWRDb2RlMTI4V3JpdGVyPih0eXBlKSkge30KKworQ0JDX0NvZGUxMjg6On5DQkNfQ29kZTEyOCgpIHt9CisKK2Jvb2wgQ0JDX0NvZGUxMjg6OlNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbikgeworICByZXR1cm4gR2V0T25lZENvZGUxMjhXcml0ZXIoKS0+U2V0VGV4dExvY2F0aW9uKGxvY2F0aW9uKTsKK30KKworYm9vbCBDQkNfQ29kZTEyODo6RW5jb2RlKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cykgeworICBpZiAoY29udGVudHMuSXNFbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBCQ0ZPUk1BVCBmb3JtYXQgPSBCQ0ZPUk1BVF9DT0RFXzEyODsKKyAgaW50MzJfdCBvdXRXaWR0aCA9IDA7CisgIGludDMyX3Qgb3V0SGVpZ2h0ID0gMDsKKyAgYXV0byogcFdyaXRlciA9IEdldE9uZWRDb2RlMTI4V3JpdGVyKCk7CisgIFdpZGVTdHJpbmcgY29udGVudChjb250ZW50cyk7CisgIGlmIChjb250ZW50cy5HZXRMZW5ndGgoKSAlIDIgJiYgcFdyaXRlci0+R2V0VHlwZSgpID09IEJDX0NPREUxMjhfQykKKyAgICBjb250ZW50ICs9ICcwJzsKKworICBXaWRlU3RyaW5nIGVuY29kZUNvbnRlbnRzID0gcFdyaXRlci0+RmlsdGVyQ29udGVudHMoY29udGVudC5Bc1N0cmluZ1ZpZXcoKSk7CisgIG1fcmVuZGVyQ29udGVudHMgPSBlbmNvZGVDb250ZW50czsKKyAgQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gZW5jb2RlQ29udGVudHMuVVRGOEVuY29kZSgpOworICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4gZGF0YSgKKyAgICAgIHBXcml0ZXItPkVuY29kZShieXRlU3RyaW5nLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQpKTsKKyAgaWYgKCFkYXRhKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHBXcml0ZXItPlJlbmRlclJlc3VsdChlbmNvZGVDb250ZW50cy5Bc1N0cmluZ1ZpZXcoKSwgZGF0YS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRXaWR0aCk7Cit9CisKK2Jvb2wgQ0JDX0NvZGUxMjg6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4KSB7CisgIHJldHVybiBHZXRPbmVkQ29kZTEyOFdyaXRlcigpLT5SZW5kZXJEZXZpY2VSZXN1bHQoCisgICAgICBkZXZpY2UsIG1hdHJpeCwgbV9yZW5kZXJDb250ZW50cy5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKK0JDX1RZUEUgQ0JDX0NvZGUxMjg6OkdldFR5cGUoKSB7CisgIHJldHVybiBCQ19DT0RFMTI4OworfQorCitDQkNfT25lZENvZGUxMjhXcml0ZXIqIENCQ19Db2RlMTI4OjpHZXRPbmVkQ29kZTEyOFdyaXRlcigpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PENCQ19PbmVkQ29kZTEyOFdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKTsKK30KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9jYmNfY29kZTEyOC5oIGIvZnhiYXJjb2RlL2NiY19jb2RlMTI4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1N2FmZgotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9jYmNfY29kZTEyOC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEJBUkNPREVfQ0JDX0NPREUxMjhfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX0NCQ19DT0RFMTI4X0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NiY19vbmVjb2RlLmgiCisKK2NsYXNzIENCQ19PbmVkQ29kZTEyOFdyaXRlcjsKKworY2xhc3MgQ0JDX0NvZGUxMjggOiBwdWJsaWMgQ0JDX09uZUNvZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0JDX0NvZGUxMjgoQkNfVFlQRSB0eXBlKTsKKyAgfkNCQ19Db2RlMTI4KCkgb3ZlcnJpZGU7CisKKyAgLy8gQ0JDX09uZUNvZGU6CisgIGJvb2wgRW5jb2RlKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cykgb3ZlcnJpZGU7CisgIGJvb2wgUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4KSBvdmVycmlkZTsKKyAgQkNfVFlQRSBHZXRUeXBlKCkgb3ZlcnJpZGU7CisKKyAgYm9vbCBTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jdGlvbik7CisKKyBwcml2YXRlOgorICBDQkNfT25lZENvZGUxMjhXcml0ZXIqIEdldE9uZWRDb2RlMTI4V3JpdGVyKCk7CisKKyAgV2lkZVN0cmluZyBtX3JlbmRlckNvbnRlbnRzOworfTsKKworI2VuZGlmICAvLyBGWEJBUkNPREVfQ0JDX0NPREUxMjhfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9jYmNfY29kZTM5LmNwcCBiL2Z4YmFyY29kZS9jYmNfY29kZTM5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzE1YzI1Ci0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL2NiY19jb2RlMzkuY3BwCkBAIC0wLDAgKzEsNzcgQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBaWGluZyBhdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvY2JjX2NvZGUzOS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVdyaXRlci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworQ0JDX0NvZGUzOTo6Q0JDX0NvZGUzOSgpCisgICAgOiBDQkNfT25lQ29kZShwZGZpdW06Ok1ha2VVbmlxdWU8Q0JDX09uZWRDb2RlMzlXcml0ZXI+KCkpIHt9CisKK0NCQ19Db2RlMzk6On5DQkNfQ29kZTM5KCkge30KKworYm9vbCBDQkNfQ29kZTM5OjpFbmNvZGUoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzKSB7CisgIGlmIChjb250ZW50cy5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIEJDRk9STUFUIGZvcm1hdCA9IEJDRk9STUFUX0NPREVfMzk7CisgIGludDMyX3Qgb3V0V2lkdGggPSAwOworICBpbnQzMl90IG91dEhlaWdodCA9IDA7CisgIGF1dG8qIHBXcml0ZXIgPSBHZXRPbmVkQ29kZTM5V3JpdGVyKCk7CisgIFdpZGVTdHJpbmcgZmlsdGVyY29udGVudHMgPSBwV3JpdGVyLT5GaWx0ZXJDb250ZW50cyhjb250ZW50cyk7CisgIFdpZGVTdHJpbmcgcmVuZGVyQ29udGVudHMgPSBwV3JpdGVyLT5SZW5kZXJUZXh0Q29udGVudHMoY29udGVudHMpOworICBtX3JlbmRlckNvbnRlbnRzID0gcmVuZGVyQ29udGVudHM7CisgIEJ5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IGZpbHRlcmNvbnRlbnRzLlVURjhFbmNvZGUoKTsKKyAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IGRhdGEoCisgICAgICBwV3JpdGVyLT5FbmNvZGUoYnl0ZVN0cmluZywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0KSk7CisgIGlmICghZGF0YSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBwV3JpdGVyLT5SZW5kZXJSZXN1bHQocmVuZGVyQ29udGVudHMuQXNTdHJpbmdWaWV3KCksIGRhdGEuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0V2lkdGgpOworfQorCitib29sIENCQ19Db2RlMzk6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgpIHsKKyAgYXV0byogcFdyaXRlciA9IEdldE9uZWRDb2RlMzlXcml0ZXIoKTsKKyAgV2lkZVN0cmluZyByZW5kZXJDb247CisgIGlmICghcFdyaXRlci0+ZW5jb2RlZENvbnRlbnRzKG1fcmVuZGVyQ29udGVudHMuQXNTdHJpbmdWaWV3KCksICZyZW5kZXJDb24pKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHBXcml0ZXItPlJlbmRlckRldmljZVJlc3VsdChkZXZpY2UsIG1hdHJpeCwgcmVuZGVyQ29uLkFzU3RyaW5nVmlldygpKTsKK30KKworQkNfVFlQRSBDQkNfQ29kZTM5OjpHZXRUeXBlKCkgeworICByZXR1cm4gQkNfQ09ERTM5OworfQorCitib29sIENCQ19Db2RlMzk6OlNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbikgeworICByZXR1cm4gR2V0T25lZENvZGUzOVdyaXRlcigpLT5TZXRUZXh0TG9jYXRpb24obG9jYXRpb24pOworfQorCitib29sIENCQ19Db2RlMzk6OlNldFdpZGVOYXJyb3dSYXRpbyhpbnQ4X3QgcmF0aW8pIHsKKyAgcmV0dXJuIEdldE9uZWRDb2RlMzlXcml0ZXIoKS0+U2V0V2lkZU5hcnJvd1JhdGlvKHJhdGlvKTsKK30KKworQ0JDX09uZWRDb2RlMzlXcml0ZXIqIENCQ19Db2RlMzk6OkdldE9uZWRDb2RlMzlXcml0ZXIoKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxDQkNfT25lZENvZGUzOVdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKTsKK30KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9jYmNfY29kZTM5LmggYi9meGJhcmNvZGUvY2JjX2NvZGUzOS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNzY3M2MKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvY2JjX2NvZGUzOS5oCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEJBUkNPREVfQ0JDX0NPREUzOV9IXworI2RlZmluZSBGWEJBUkNPREVfQ0JDX0NPREUzOV9IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NiY19vbmVjb2RlLmgiCisKK2NsYXNzIENCQ19PbmVkQ29kZTM5V3JpdGVyOworCitjbGFzcyBDQkNfQ29kZTM5IDogcHVibGljIENCQ19PbmVDb2RlIHsKKyBwdWJsaWM6CisgIENCQ19Db2RlMzkoKTsKKyAgfkNCQ19Db2RlMzkoKSBvdmVycmlkZTsKKworICAvLyBDQkNfT25lQ29kZToKKyAgYm9vbCBFbmNvZGUoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzKSBvdmVycmlkZTsKKyAgYm9vbCBSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgpIG92ZXJyaWRlOworICBCQ19UWVBFIEdldFR5cGUoKSBvdmVycmlkZTsKKworICBib29sIFNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbik7CisgIGJvb2wgU2V0V2lkZU5hcnJvd1JhdGlvKGludDhfdCByYXRpbyk7CisKKyBwcml2YXRlOgorICBDQkNfT25lZENvZGUzOVdyaXRlciogR2V0T25lZENvZGUzOVdyaXRlcigpOworCisgIFdpZGVTdHJpbmcgbV9yZW5kZXJDb250ZW50czsKK307CisKKyNlbmRpZiAgLy8gRlhCQVJDT0RFX0NCQ19DT0RFMzlfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9jYmNfY29kZWJhc2UuY3BwIGIvZnhiYXJjb2RlL2NiY19jb2RlYmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3OGY5MwotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9jYmNfY29kZWJhc2UuY3BwCkBAIC0wLDAgKzEsNTkgQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBaWGluZyBhdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvY2JjX2NvZGViYXNlLmgiCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL0JDX1dyaXRlci5oIgorCitDQkNfQ29kZUJhc2U6OkNCQ19Db2RlQmFzZShzdGQ6OnVuaXF1ZV9wdHI8Q0JDX1dyaXRlcj4gcFdyaXRlcikKKyAgICA6IG1fcEJDV3JpdGVyKHN0ZDo6bW92ZShwV3JpdGVyKSkge30KKworQ0JDX0NvZGVCYXNlOjp+Q0JDX0NvZGVCYXNlKCkge30KKworYm9vbCBDQkNfQ29kZUJhc2U6OlNldENoYXJFbmNvZGluZyhpbnQzMl90IGVuY29kaW5nKSB7CisgIHJldHVybiBtX3BCQ1dyaXRlci0+U2V0Q2hhckVuY29kaW5nKGVuY29kaW5nKTsKK30KKworYm9vbCBDQkNfQ29kZUJhc2U6OlNldE1vZHVsZUhlaWdodChpbnQzMl90IG1vZHVsZUhlaWdodCkgeworICByZXR1cm4gbV9wQkNXcml0ZXItPlNldE1vZHVsZUhlaWdodChtb2R1bGVIZWlnaHQpOworfQorCitib29sIENCQ19Db2RlQmFzZTo6U2V0TW9kdWxlV2lkdGgoaW50MzJfdCBtb2R1bGVXaWR0aCkgeworICByZXR1cm4gbV9wQkNXcml0ZXItPlNldE1vZHVsZVdpZHRoKG1vZHVsZVdpZHRoKTsKK30KKworYm9vbCBDQkNfQ29kZUJhc2U6OlNldEhlaWdodChpbnQzMl90IGhlaWdodCkgeworICByZXR1cm4gbV9wQkNXcml0ZXItPlNldEhlaWdodChoZWlnaHQpOworfQorCitib29sIENCQ19Db2RlQmFzZTo6U2V0V2lkdGgoaW50MzJfdCB3aWR0aCkgeworICByZXR1cm4gbV9wQkNXcml0ZXItPlNldFdpZHRoKHdpZHRoKTsKK30KKwordm9pZCBDQkNfQ29kZUJhc2U6OlNldEJhY2tncm91bmRDb2xvcihGWF9BUkdCIGJhY2tncm91bmRDb2xvcikgeworICBtX3BCQ1dyaXRlci0+U2V0QmFja2dyb3VuZENvbG9yKGJhY2tncm91bmRDb2xvcik7Cit9CisKK3ZvaWQgQ0JDX0NvZGVCYXNlOjpTZXRCYXJjb2RlQ29sb3IoRlhfQVJHQiBmb3JlZ3JvdW5kQ29sb3IpIHsKKyAgbV9wQkNXcml0ZXItPlNldEJhcmNvZGVDb2xvcihmb3JlZ3JvdW5kQ29sb3IpOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2NiY19jb2RlYmFzZS5oIGIvZnhiYXJjb2RlL2NiY19jb2RlYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYjk4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvY2JjX2NvZGViYXNlLmgKQEAgLTAsMCArMSw0NSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9DQkNfQ09ERUJBU0VfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX0NCQ19DT0RFQkFTRV9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9meF9kaWIuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvQkNfTGlicmFyeS5oIgorCitjbGFzcyBDQkNfUmVhZGVyOworY2xhc3MgQ0JDX1dyaXRlcjsKK2NsYXNzIENGWF9ESUJpdG1hcDsKK2NsYXNzIENGWF9NYXRyaXg7CitjbGFzcyBDRlhfUmVuZGVyRGV2aWNlOworCitjbGFzcyBDQkNfQ29kZUJhc2UgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0JDX0NvZGVCYXNlKHN0ZDo6dW5pcXVlX3B0cjxDQkNfV3JpdGVyPiBwV3JpdGVyKTsKKyAgdmlydHVhbCB+Q0JDX0NvZGVCYXNlKCk7CisKKyAgdmlydHVhbCBCQ19UWVBFIEdldFR5cGUoKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBFbmNvZGUoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCkgPSAwOworCisgIGJvb2wgU2V0Q2hhckVuY29kaW5nKGludDMyX3QgZW5jb2RpbmcpOworICBib29sIFNldE1vZHVsZUhlaWdodChpbnQzMl90IG1vZHVsZUhlaWdodCk7CisgIGJvb2wgU2V0TW9kdWxlV2lkdGgoaW50MzJfdCBtb2R1bGVXaWR0aCk7CisgIGJvb2wgU2V0SGVpZ2h0KGludDMyX3QgaGVpZ2h0KTsKKyAgYm9vbCBTZXRXaWR0aChpbnQzMl90IHdpZHRoKTsKKyAgdm9pZCBTZXRCYWNrZ3JvdW5kQ29sb3IoRlhfQVJHQiBiYWNrZ3JvdW5kQ29sb3IpOworICB2b2lkIFNldEJhcmNvZGVDb2xvcihGWF9BUkdCIGZvcmVncm91bmRDb2xvcik7CisKKyBwcm90ZWN0ZWQ6CisgIHN0ZDo6dW5pcXVlX3B0cjxDQkNfV3JpdGVyPiBtX3BCQ1dyaXRlcjsKK307CisKKyNlbmRpZiAgLy8gRlhCQVJDT0RFX0NCQ19DT0RFQkFTRV9IXwpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2NiY19kYXRhbWF0cml4LmNwcCBiL2Z4YmFyY29kZS9jYmNfZGF0YW1hdHJpeC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllMjNmYQotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9jYmNfZGF0YW1hdHJpeC5jcHAKQEAgLTAsMCArMSw1NyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorLyoKKyAqIENvcHlyaWdodCAyMDExIFpYaW5nIGF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImZ4YmFyY29kZS9jYmNfZGF0YW1hdHJpeC5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFdyaXRlci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworQ0JDX0RhdGFNYXRyaXg6OkNCQ19EYXRhTWF0cml4KCkKKyAgICA6IENCQ19Db2RlQmFzZShwZGZpdW06Ok1ha2VVbmlxdWU8Q0JDX0RhdGFNYXRyaXhXcml0ZXI+KCkpIHt9CisKK0NCQ19EYXRhTWF0cml4Ojp+Q0JDX0RhdGFNYXRyaXgoKSB7fQorCitib29sIENCQ19EYXRhTWF0cml4OjpFbmNvZGUoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzKSB7CisgIGludDMyX3Qgb3V0V2lkdGggPSAwOworICBpbnQzMl90IG91dEhlaWdodCA9IDA7CisgIGF1dG8qIHBXcml0ZXIgPSBHZXREYXRhTWF0cml4V3JpdGVyKCk7CisgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90LCBGeEZyZWVEZWxldGVyPiBkYXRhKAorICAgICAgcFdyaXRlci0+RW5jb2RlKFdpZGVTdHJpbmcoY29udGVudHMpLCBvdXRXaWR0aCwgb3V0SGVpZ2h0KSk7CisgIGlmICghZGF0YSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBwV3JpdGVyLT5SZW5kZXJSZXN1bHQoZGF0YS5nZXQoKSwgb3V0V2lkdGgsIG91dEhlaWdodCk7Cit9CisKK2Jvb2wgQ0JDX0RhdGFNYXRyaXg6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4KSB7CisgIEdldERhdGFNYXRyaXhXcml0ZXIoKS0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0cml4KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0JDX1RZUEUgQ0JDX0RhdGFNYXRyaXg6OkdldFR5cGUoKSB7CisgIHJldHVybiBCQ19EQVRBTUFUUklYOworfQorCitDQkNfRGF0YU1hdHJpeFdyaXRlciogQ0JDX0RhdGFNYXRyaXg6OkdldERhdGFNYXRyaXhXcml0ZXIoKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxDQkNfRGF0YU1hdHJpeFdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKTsKK30KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9jYmNfZGF0YW1hdHJpeC5oIGIvZnhiYXJjb2RlL2NiY19kYXRhbWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZlMWMwOQotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9jYmNfZGF0YW1hdHJpeC5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEJBUkNPREVfQ0JDX0RBVEFNQVRSSVhfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX0NCQ19EQVRBTUFUUklYX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9jYmNfY29kZWJhc2UuaCIKKworY2xhc3MgQ0JDX0RhdGFNYXRyaXhXcml0ZXI7CisKK2NsYXNzIENCQ19EYXRhTWF0cml4IDogcHVibGljIENCQ19Db2RlQmFzZSB7CisgcHVibGljOgorICBDQkNfRGF0YU1hdHJpeCgpOworICB+Q0JDX0RhdGFNYXRyaXgoKSBvdmVycmlkZTsKKworICAvLyBDQkNfT25lQ29kZToKKyAgYm9vbCBFbmNvZGUoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzKSBvdmVycmlkZTsKKyAgYm9vbCBSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgpIG92ZXJyaWRlOworICBCQ19UWVBFIEdldFR5cGUoKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIENCQ19EYXRhTWF0cml4V3JpdGVyKiBHZXREYXRhTWF0cml4V3JpdGVyKCk7Cit9OworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9DQkNfREFUQU1BVFJJWF9IXwpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2NiY19lYW4xMy5jcHAgYi9meGJhcmNvZGUvY2JjX2VhbjEzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjcyNTMyCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL2NiY19lYW4xMy5jcHAKQEAgLTAsMCArMSw4NCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorLyoKKyAqIENvcHlyaWdodCAyMDExIFpYaW5nIGF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImZ4YmFyY29kZS9jYmNfZWFuMTMuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImZ4YmFyY29kZS9vbmVkL0JDX09uZWRFQU4xM1dyaXRlci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworQ0JDX0VBTjEzOjpDQkNfRUFOMTMoKQorICAgIDogQ0JDX09uZUNvZGUocGRmaXVtOjpNYWtlVW5pcXVlPENCQ19PbmVkRUFOMTNXcml0ZXI+KCkpIHt9CisKK0NCQ19FQU4xMzo6fkNCQ19FQU4xMygpIHt9CisKK1dpZGVTdHJpbmcgQ0JDX0VBTjEzOjpQcmVwcm9jZXNzKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cykgeworICBhdXRvKiBwV3JpdGVyID0gR2V0T25lZEVBTjEzV3JpdGVyKCk7CisgIFdpZGVTdHJpbmcgZW5jb2RlQ29udGVudHMgPSBwV3JpdGVyLT5GaWx0ZXJDb250ZW50cyhjb250ZW50cyk7CisgIGludDMyX3QgbGVuZ3RoID0gZW5jb2RlQ29udGVudHMuR2V0TGVuZ3RoKCk7CisgIGlmIChsZW5ndGggPD0gMTIpIHsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAxMiAtIGxlbmd0aDsgaSsrKQorICAgICAgZW5jb2RlQ29udGVudHMgPSB3Y2hhcl90KCcwJykgKyBlbmNvZGVDb250ZW50czsKKworICAgIEJ5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IGVuY29kZUNvbnRlbnRzLlVURjhFbmNvZGUoKTsKKyAgICBpbnQzMl90IGNoZWNrc3VtID0gcFdyaXRlci0+Q2FsY0NoZWNrc3VtKGJ5dGVTdHJpbmcpOworICAgIGJ5dGVTdHJpbmcgKz0gY2hlY2tzdW0gLSAwICsgJzAnOworICAgIGVuY29kZUNvbnRlbnRzID0gYnl0ZVN0cmluZy5VVEY4RGVjb2RlKCk7CisgIH0KKyAgaWYgKGxlbmd0aCA+IDEzKQorICAgIGVuY29kZUNvbnRlbnRzID0gZW5jb2RlQ29udGVudHMuTGVmdCgxMyk7CisKKyAgcmV0dXJuIGVuY29kZUNvbnRlbnRzOworfQorCitib29sIENCQ19FQU4xMzo6RW5jb2RlKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cykgeworICBpZiAoY29udGVudHMuSXNFbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBCQ0ZPUk1BVCBmb3JtYXQgPSBCQ0ZPUk1BVF9FQU5fMTM7CisgIGludDMyX3Qgb3V0V2lkdGggPSAwOworICBpbnQzMl90IG91dEhlaWdodCA9IDA7CisgIFdpZGVTdHJpbmcgZW5jb2RlQ29udGVudHMgPSBQcmVwcm9jZXNzKGNvbnRlbnRzKTsKKyAgQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gZW5jb2RlQ29udGVudHMuVVRGOEVuY29kZSgpOworICBtX3JlbmRlckNvbnRlbnRzID0gZW5jb2RlQ29udGVudHM7CisgIGF1dG8qIHBXcml0ZXIgPSBHZXRPbmVkRUFOMTNXcml0ZXIoKTsKKyAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IGRhdGEoCisgICAgICBwV3JpdGVyLT5FbmNvZGUoYnl0ZVN0cmluZywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0KSk7CisgIGlmICghZGF0YSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBwV3JpdGVyLT5SZW5kZXJSZXN1bHQoZW5jb2RlQ29udGVudHMuQXNTdHJpbmdWaWV3KCksIGRhdGEuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0V2lkdGgpOworfQorCitib29sIENCQ19FQU4xMzo6UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4KSB7CisgIHJldHVybiBHZXRPbmVkRUFOMTNXcml0ZXIoKS0+UmVuZGVyRGV2aWNlUmVzdWx0KAorICAgICAgZGV2aWNlLCBtYXRyaXgsIG1fcmVuZGVyQ29udGVudHMuQXNTdHJpbmdWaWV3KCkpOworfQorCitCQ19UWVBFIENCQ19FQU4xMzo6R2V0VHlwZSgpIHsKKyAgcmV0dXJuIEJDX0VBTjEzOworfQorCitDQkNfT25lZEVBTjEzV3JpdGVyKiBDQkNfRUFOMTM6OkdldE9uZWRFQU4xM1dyaXRlcigpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PENCQ19PbmVkRUFOMTNXcml0ZXIqPihtX3BCQ1dyaXRlci5nZXQoKSk7Cit9CmRpZmYgLS1naXQgYS9meGJhcmNvZGUvY2JjX2VhbjEzLmggYi9meGJhcmNvZGUvY2JjX2VhbjEzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA5ZjhiMAotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9jYmNfZWFuMTMuaApAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhCQVJDT0RFX0NCQ19FQU4xM19IXworI2RlZmluZSBGWEJBUkNPREVfQ0JDX0VBTjEzX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9meF9kaWIuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvY2JjX29uZWNvZGUuaCIKKworY2xhc3MgQ0JDX09uZWRFQU4xM1dyaXRlcjsKKworY2xhc3MgQ0JDX0VBTjEzIDogcHVibGljIENCQ19PbmVDb2RlIHsKKyBwdWJsaWM6CisgIENCQ19FQU4xMygpOworICB+Q0JDX0VBTjEzKCkgb3ZlcnJpZGU7CisKKyAgLy8gQ0JDX09uZUNvZGU6CisgIGJvb2wgRW5jb2RlKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cykgb3ZlcnJpZGU7CisgIGJvb2wgUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4KSBvdmVycmlkZTsKKyAgQkNfVFlQRSBHZXRUeXBlKCkgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBDQkNfT25lZEVBTjEzV3JpdGVyKiBHZXRPbmVkRUFOMTNXcml0ZXIoKTsKKyAgV2lkZVN0cmluZyBQcmVwcm9jZXNzKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cyk7CisKKyAgV2lkZVN0cmluZyBtX3JlbmRlckNvbnRlbnRzOworfTsKKworI2VuZGlmICAvLyBGWEJBUkNPREVfQ0JDX0VBTjEzX0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvY2JjX2VhbjguY3BwIGIvZnhiYXJjb2RlL2NiY19lYW44LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTZmM2E1Ci0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL2NiY19lYW44LmNwcApAQCAtMCwwICsxLDgyIEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisvKgorICogQ29weXJpZ2h0IDIwMTEgWlhpbmcgYXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NiY19lYW44LmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJmeGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFdyaXRlci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworQ0JDX0VBTjg6OkNCQ19FQU44KCkgOiBDQkNfT25lQ29kZShwZGZpdW06Ok1ha2VVbmlxdWU8Q0JDX09uZWRFQU44V3JpdGVyPigpKSB7fQorCitDQkNfRUFOODo6fkNCQ19FQU44KCkge30KKworV2lkZVN0cmluZyBDQkNfRUFOODo6UHJlcHJvY2Vzcyhjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIHsKKyAgYXV0byogcFdyaXRlciA9IEdldE9uZWRFQU44V3JpdGVyKCk7CisgIFdpZGVTdHJpbmcgZW5jb2RlQ29udGVudHMgPSBwV3JpdGVyLT5GaWx0ZXJDb250ZW50cyhjb250ZW50cyk7CisgIGludDMyX3QgbGVuZ3RoID0gZW5jb2RlQ29udGVudHMuR2V0TGVuZ3RoKCk7CisgIGlmIChsZW5ndGggPD0gNykgeworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDcgLSBsZW5ndGg7IGkrKykKKyAgICAgIGVuY29kZUNvbnRlbnRzID0gd2NoYXJfdCgnMCcpICsgZW5jb2RlQ29udGVudHM7CisKKyAgICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBlbmNvZGVDb250ZW50cy5VVEY4RW5jb2RlKCk7CisgICAgaW50MzJfdCBjaGVja3N1bSA9IHBXcml0ZXItPkNhbGNDaGVja3N1bShieXRlU3RyaW5nKTsKKyAgICBlbmNvZGVDb250ZW50cyArPSB3Y2hhcl90KGNoZWNrc3VtIC0gMCArICcwJyk7CisgIH0KKyAgaWYgKGxlbmd0aCA+IDgpCisgICAgZW5jb2RlQ29udGVudHMgPSBlbmNvZGVDb250ZW50cy5MZWZ0KDgpOworCisgIHJldHVybiBlbmNvZGVDb250ZW50czsKK30KKworYm9vbCBDQkNfRUFOODo6RW5jb2RlKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cykgeworICBpZiAoY29udGVudHMuSXNFbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBCQ0ZPUk1BVCBmb3JtYXQgPSBCQ0ZPUk1BVF9FQU5fODsKKyAgaW50MzJfdCBvdXRXaWR0aCA9IDA7CisgIGludDMyX3Qgb3V0SGVpZ2h0ID0gMDsKKyAgV2lkZVN0cmluZyBlbmNvZGVDb250ZW50cyA9IFByZXByb2Nlc3MoY29udGVudHMpOworICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBlbmNvZGVDb250ZW50cy5VVEY4RW5jb2RlKCk7CisgIG1fcmVuZGVyQ29udGVudHMgPSBlbmNvZGVDb250ZW50czsKKyAgYXV0byogcFdyaXRlciA9IEdldE9uZWRFQU44V3JpdGVyKCk7CisgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90LCBGeEZyZWVEZWxldGVyPiBkYXRhKAorICAgICAgcFdyaXRlci0+RW5jb2RlKGJ5dGVTdHJpbmcsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCkpOworICBpZiAoIWRhdGEpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gcFdyaXRlci0+UmVuZGVyUmVzdWx0KGVuY29kZUNvbnRlbnRzLkFzU3RyaW5nVmlldygpLCBkYXRhLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFdpZHRoKTsKK30KKworYm9vbCBDQkNfRUFOODo6UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgpIHsKKyAgcmV0dXJuIEdldE9uZWRFQU44V3JpdGVyKCktPlJlbmRlckRldmljZVJlc3VsdCgKKyAgICAgIGRldmljZSwgbWF0cml4LCBtX3JlbmRlckNvbnRlbnRzLkFzU3RyaW5nVmlldygpKTsKK30KKworQkNfVFlQRSBDQkNfRUFOODo6R2V0VHlwZSgpIHsKKyAgcmV0dXJuIEJDX0VBTjg7Cit9CisKK0NCQ19PbmVkRUFOOFdyaXRlciogQ0JDX0VBTjg6OkdldE9uZWRFQU44V3JpdGVyKCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0JDX09uZWRFQU44V3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2NiY19lYW44LmggYi9meGJhcmNvZGUvY2JjX2VhbjguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTI3NjUwCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL2NiY19lYW44LmgKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9DQkNfRUFOOF9IXworI2RlZmluZSBGWEJBUkNPREVfQ0JDX0VBTjhfSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NiY19vbmVjb2RlLmgiCisKK2NsYXNzIENCQ19PbmVkRUFOOFdyaXRlcjsKKworY2xhc3MgQ0JDX0VBTjggOiBwdWJsaWMgQ0JDX09uZUNvZGUgeworIHB1YmxpYzoKKyAgQ0JDX0VBTjgoKTsKKyAgfkNCQ19FQU44KCkgb3ZlcnJpZGU7CisKKyAgLy8gQ0JDX09uZUNvZGU6CisgIGJvb2wgRW5jb2RlKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cykgb3ZlcnJpZGU7CisgIGJvb2wgUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4KSBvdmVycmlkZTsKKyAgQkNfVFlQRSBHZXRUeXBlKCkgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBDQkNfT25lZEVBTjhXcml0ZXIqIEdldE9uZWRFQU44V3JpdGVyKCk7CisgIFdpZGVTdHJpbmcgUHJlcHJvY2Vzcyhjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpOworICBXaWRlU3RyaW5nIG1fcmVuZGVyQ29udGVudHM7Cit9OworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9DQkNfRUFOOF9IXwpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2NiY19vbmVjb2RlLmNwcCBiL2Z4YmFyY29kZS9jYmNfb25lY29kZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI4Y2IwNQotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9jYmNfb25lY29kZS5jcHAKQEAgLTAsMCArMSw3MSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorLyoKKyAqIENvcHlyaWdodCAyMDExIFpYaW5nIGF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImZ4YmFyY29kZS9jYmNfb25lY29kZS5oIgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImZ4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5oIgorCitDQkNfT25lQ29kZTo6Q0JDX09uZUNvZGUoc3RkOjp1bmlxdWVfcHRyPENCQ19Xcml0ZXI+IHBXcml0ZXIpCisgICAgOiBDQkNfQ29kZUJhc2Uoc3RkOjptb3ZlKHBXcml0ZXIpKSB7fQorCitDQkNfT25lQ29kZTo6fkNCQ19PbmVDb2RlKCkge30KKworYm9vbCBDQkNfT25lQ29kZTo6Q2hlY2tDb250ZW50VmFsaWRpdHkoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzKSB7CisgIHJldHVybiBHZXRPbmVEaW1Xcml0ZXIoKS0+Q2hlY2tDb250ZW50VmFsaWRpdHkoY29udGVudHMpOworfQorCitXaWRlU3RyaW5nIENCQ19PbmVDb2RlOjpGaWx0ZXJDb250ZW50cyhjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIHsKKyAgcmV0dXJuIEdldE9uZURpbVdyaXRlcigpLT5GaWx0ZXJDb250ZW50cyhjb250ZW50cyk7Cit9CisKK3ZvaWQgQ0JDX09uZUNvZGU6OlNldFByaW50Q2hlY2tzdW0oYm9vbCBjaGVja3N1bSkgeworICBHZXRPbmVEaW1Xcml0ZXIoKS0+U2V0UHJpbnRDaGVja3N1bShjaGVja3N1bSk7Cit9CisKK3ZvaWQgQ0JDX09uZUNvZGU6OlNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpIHsKKyAgR2V0T25lRGltV3JpdGVyKCktPlNldERhdGFMZW5ndGgobGVuZ3RoKTsKK30KKwordm9pZCBDQkNfT25lQ29kZTo6U2V0Q2FsQ2hlY2tzdW0oYm9vbCBjYWxjKSB7CisgIEdldE9uZURpbVdyaXRlcigpLT5TZXRDYWxjQ2hlY2tzdW0oY2FsYyk7Cit9CisKK2Jvb2wgQ0JDX09uZUNvZGU6OlNldEZvbnQoQ0ZYX0ZvbnQqIGNGb250KSB7CisgIHJldHVybiBHZXRPbmVEaW1Xcml0ZXIoKS0+U2V0Rm9udChjRm9udCk7Cit9CisKK3ZvaWQgQ0JDX09uZUNvZGU6OlNldEZvbnRTaXplKGZsb2F0IHNpemUpIHsKKyAgR2V0T25lRGltV3JpdGVyKCktPlNldEZvbnRTaXplKHNpemUpOworfQorCit2b2lkIENCQ19PbmVDb2RlOjpTZXRGb250U3R5bGUoaW50MzJfdCBzdHlsZSkgeworICBHZXRPbmVEaW1Xcml0ZXIoKS0+U2V0Rm9udFN0eWxlKHN0eWxlKTsKK30KKwordm9pZCBDQkNfT25lQ29kZTo6U2V0Rm9udENvbG9yKEZYX0FSR0IgY29sb3IpIHsKKyAgR2V0T25lRGltV3JpdGVyKCktPlNldEZvbnRDb2xvcihjb2xvcik7Cit9CisKK0NCQ19PbmVEaW1Xcml0ZXIqIENCQ19PbmVDb2RlOjpHZXRPbmVEaW1Xcml0ZXIoKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxDQkNfT25lRGltV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2NiY19vbmVjb2RlLmggYi9meGJhcmNvZGUvY2JjX29uZWNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWU2MThlCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL2NiY19vbmVjb2RlLmgKQEAgLTAsMCArMSwzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9DQkNfT05FQ09ERV9IXworI2RlZmluZSBGWEJBUkNPREVfQ0JDX09ORUNPREVfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvY2JjX2NvZGViYXNlLmgiCisKK2NsYXNzIENCQ19PbmVEaW1Xcml0ZXI7CitjbGFzcyBDRlhfRm9udDsKKworY2xhc3MgQ0JDX09uZUNvZGUgOiBwdWJsaWMgQ0JDX0NvZGVCYXNlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENCQ19PbmVDb2RlKHN0ZDo6dW5pcXVlX3B0cjxDQkNfV3JpdGVyPiBwV3JpdGVyKTsKKyAgfkNCQ19PbmVDb2RlKCkgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCBib29sIENoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cyk7CisgIHZpcnR1YWwgV2lkZVN0cmluZyBGaWx0ZXJDb250ZW50cyhjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpOworCisgIHZpcnR1YWwgdm9pZCBTZXRQcmludENoZWNrc3VtKGJvb2wgY2hlY2tzdW0pOworICB2aXJ0dWFsIHZvaWQgU2V0RGF0YUxlbmd0aChpbnQzMl90IGxlbmd0aCk7CisgIHZpcnR1YWwgdm9pZCBTZXRDYWxDaGVja3N1bShib29sIGNhbGMpOworICB2aXJ0dWFsIGJvb2wgU2V0Rm9udChDRlhfRm9udCogY0ZvbnQpOworICB2aXJ0dWFsIHZvaWQgU2V0Rm9udFNpemUoZmxvYXQgc2l6ZSk7CisgIHZpcnR1YWwgdm9pZCBTZXRGb250U3R5bGUoaW50MzJfdCBzdHlsZSk7CisgIHZpcnR1YWwgdm9pZCBTZXRGb250Q29sb3IoRlhfQVJHQiBjb2xvcik7CisKKyBwcml2YXRlOgorICBDQkNfT25lRGltV3JpdGVyKiBHZXRPbmVEaW1Xcml0ZXIoKTsKK307CisKKyNlbmRpZiAgLy8gRlhCQVJDT0RFX0NCQ19PTkVDT0RFX0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvY2JjX3BkZjQxN2kuY3BwIGIvZnhiYXJjb2RlL2NiY19wZGY0MTdpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTdlMDYzCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL2NiY19wZGY0MTdpLmNwcApAQCAtMCwwICsxLDY2IEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisvKgorICogQ29weXJpZ2h0IDIwMTEgWlhpbmcgYXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NiY19wZGY0MTdpLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJmeGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1dyaXRlci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworQ0JDX1BERjQxN0k6OkNCQ19QREY0MTdJKCkKKyAgICA6IENCQ19Db2RlQmFzZShwZGZpdW06Ok1ha2VVbmlxdWU8Q0JDX1BERjQxN1dyaXRlcj4oKSkge30KKworQ0JDX1BERjQxN0k6On5DQkNfUERGNDE3SSgpIHt9CisKK2Jvb2wgQ0JDX1BERjQxN0k6OlNldEVycm9yQ29ycmVjdGlvbkxldmVsKGludDMyX3QgbGV2ZWwpIHsKKyAgR2V0UERGNDE3V3JpdGVyKCktPlNldEVycm9yQ29ycmVjdGlvbkxldmVsKGxldmVsKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ0JDX1BERjQxN0k6OlNldFRydW5jYXRlZChib29sIHRydW5jYXRlZCkgeworICBHZXRQREY0MTdXcml0ZXIoKS0+U2V0VHJ1bmNhdGVkKHRydW5jYXRlZCk7Cit9CisKK2Jvb2wgQ0JDX1BERjQxN0k6OkVuY29kZShjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIHsKKyAgaW50MzJfdCBvdXRXaWR0aCA9IDA7CisgIGludDMyX3Qgb3V0SGVpZ2h0ID0gMDsKKyAgYXV0byogcFdyaXRlciA9IEdldFBERjQxN1dyaXRlcigpOworICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4gZGF0YSgKKyAgICAgIHBXcml0ZXItPkVuY29kZShXaWRlU3RyaW5nKGNvbnRlbnRzKSwgb3V0V2lkdGgsIG91dEhlaWdodCkpOworICBpZiAoIWRhdGEpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gcFdyaXRlci0+UmVuZGVyUmVzdWx0KGRhdGEuZ2V0KCksIG91dFdpZHRoLCBvdXRIZWlnaHQpOworfQorCitib29sIENCQ19QREY0MTdJOjpSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCkgeworICBHZXRQREY0MTdXcml0ZXIoKS0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0cml4KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0JDX1RZUEUgQ0JDX1BERjQxN0k6OkdldFR5cGUoKSB7CisgIHJldHVybiBCQ19QREY0MTc7Cit9CisKK0NCQ19QREY0MTdXcml0ZXIqIENCQ19QREY0MTdJOjpHZXRQREY0MTdXcml0ZXIoKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxDQkNfUERGNDE3V3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2NiY19wZGY0MTdpLmggYi9meGJhcmNvZGUvY2JjX3BkZjQxN2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmQ3YTI2Ci0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL2NiY19wZGY0MTdpLmgKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9DQkNfUERGNDE3SV9IXworI2RlZmluZSBGWEJBUkNPREVfQ0JDX1BERjQxN0lfSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NiY19jb2RlYmFzZS5oIgorCitjbGFzcyBDQkNfUERGNDE3V3JpdGVyOworCitjbGFzcyBDQkNfUERGNDE3SSA6IHB1YmxpYyBDQkNfQ29kZUJhc2UgeworIHB1YmxpYzoKKyAgQ0JDX1BERjQxN0koKTsKKyAgfkNCQ19QREY0MTdJKCkgb3ZlcnJpZGU7CisKKyAgLy8gQ0JDX0NvZGVCYXNlOgorICBib29sIEVuY29kZShjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIG92ZXJyaWRlOworICBib29sIFJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCkgb3ZlcnJpZGU7CisgIEJDX1RZUEUgR2V0VHlwZSgpIG92ZXJyaWRlOworCisgIGJvb2wgU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBsZXZlbCk7CisgIHZvaWQgU2V0VHJ1bmNhdGVkKGJvb2wgdHJ1bmNhdGVkKTsKKworIHByaXZhdGU6CisgIENCQ19QREY0MTdXcml0ZXIqIEdldFBERjQxN1dyaXRlcigpOworfTsKKworI2VuZGlmICAvLyBGWEJBUkNPREVfQ0JDX1BERjQxN0lfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9jYmNfcXJjb2RlLmNwcCBiL2Z4YmFyY29kZS9jYmNfcXJjb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjNhNjVlCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL2NiY19xcmNvZGUuY3BwCkBAIC0wLDAgKzEsNjQgQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBaWGluZyBhdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvY2JjX3FyY29kZS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVXcml0ZXIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK0NCQ19RUkNvZGU6OkNCQ19RUkNvZGUoKQorICAgIDogQ0JDX0NvZGVCYXNlKHBkZml1bTo6TWFrZVVuaXF1ZTxDQkNfUVJDb2RlV3JpdGVyPigpKSB7fQorCitDQkNfUVJDb2RlOjp+Q0JDX1FSQ29kZSgpIHt9CisKK2Jvb2wgQ0JDX1FSQ29kZTo6U2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBsZXZlbCkgeworICBpZiAobGV2ZWwgPCAwIHx8IGxldmVsID4gMykKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBHZXRRUkNvZGVXcml0ZXIoKS0+U2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwobGV2ZWwpOworfQorCitib29sIENCQ19RUkNvZGU6OkVuY29kZShjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIHsKKyAgaW50MzJfdCBvdXRXaWR0aCA9IDA7CisgIGludDMyX3Qgb3V0SGVpZ2h0ID0gMDsKKyAgQ0JDX1FSQ29kZVdyaXRlciogcFdyaXRlciA9IEdldFFSQ29kZVdyaXRlcigpOworICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4gZGF0YSgKKyAgICAgIHBXcml0ZXItPkVuY29kZShXaWRlU3RyaW5nKGNvbnRlbnRzKSwgcFdyaXRlci0+R2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRXaWR0aCwgb3V0SGVpZ2h0KSk7CisgIGlmICghZGF0YSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBwV3JpdGVyLT5SZW5kZXJSZXN1bHQoZGF0YS5nZXQoKSwgb3V0V2lkdGgsIG91dEhlaWdodCk7Cit9CisKK2Jvb2wgQ0JDX1FSQ29kZTo6UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCkgeworICBHZXRRUkNvZGVXcml0ZXIoKS0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0cml4KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0JDX1RZUEUgQ0JDX1FSQ29kZTo6R2V0VHlwZSgpIHsKKyAgcmV0dXJuIEJDX1FSX0NPREU7Cit9CisKK0NCQ19RUkNvZGVXcml0ZXIqIENCQ19RUkNvZGU6OkdldFFSQ29kZVdyaXRlcigpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PENCQ19RUkNvZGVXcml0ZXIqPihtX3BCQ1dyaXRlci5nZXQoKSk7Cit9CmRpZmYgLS1naXQgYS9meGJhcmNvZGUvY2JjX3FyY29kZS5oIGIvZnhiYXJjb2RlL2NiY19xcmNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDlkZThhCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL2NiY19xcmNvZGUuaApAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhCQVJDT0RFX0NCQ19RUkNPREVfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX0NCQ19RUkNPREVfSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NiY19jb2RlYmFzZS5oIgorCitjbGFzcyBDQkNfUVJDb2RlV3JpdGVyOworCitjbGFzcyBDQkNfUVJDb2RlIDogcHVibGljIENCQ19Db2RlQmFzZSB7CisgcHVibGljOgorICBDQkNfUVJDb2RlKCk7CisgIH5DQkNfUVJDb2RlKCkgb3ZlcnJpZGU7CisKKyAgLy8gQ0JDX0NvZGVCYXNlOgorICBib29sIEVuY29kZShjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIG92ZXJyaWRlOworICBib29sIFJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCkgb3ZlcnJpZGU7CisgIEJDX1RZUEUgR2V0VHlwZSgpIG92ZXJyaWRlOworCisgIGJvb2wgU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBsZXZlbCk7CisKKyBwcml2YXRlOgorICBDQkNfUVJDb2RlV3JpdGVyKiBHZXRRUkNvZGVXcml0ZXIoKTsKK307CisKKyNlbmRpZiAgLy8gRlhCQVJDT0RFX0NCQ19RUkNPREVfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9jYmNfdXBjYS5jcHAgYi9meGJhcmNvZGUvY2JjX3VwY2EuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5Y2VkY2UKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvY2JjX3VwY2EuY3BwCkBAIC0wLDAgKzEsODUgQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBaWGluZyBhdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvY2JjX3VwY2EuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImZ4YmFyY29kZS9vbmVkL0JDX09uZWRVUENBV3JpdGVyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCitDQkNfVVBDQTo6Q0JDX1VQQ0EoKSA6IENCQ19PbmVDb2RlKHBkZml1bTo6TWFrZVVuaXF1ZTxDQkNfT25lZFVQQ0FXcml0ZXI+KCkpIHt9CisKK0NCQ19VUENBOjp+Q0JDX1VQQ0EoKSB7fQorCitXaWRlU3RyaW5nIENCQ19VUENBOjpQcmVwcm9jZXNzKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cykgeworICBDQkNfT25lZFVQQ0FXcml0ZXIqIHBXcml0ZXIgPSBHZXRPbmVkVVBDQVdyaXRlcigpOworICBXaWRlU3RyaW5nIGVuY29kZUNvbnRlbnRzID0gcFdyaXRlci0+RmlsdGVyQ29udGVudHMoY29udGVudHMpOworICBpbnQzMl90IGxlbmd0aCA9IGVuY29kZUNvbnRlbnRzLkdldExlbmd0aCgpOworICBpZiAobGVuZ3RoIDw9IDExKSB7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMTEgLSBsZW5ndGg7IGkrKykKKyAgICAgIGVuY29kZUNvbnRlbnRzID0gd2NoYXJfdCgnMCcpICsgZW5jb2RlQ29udGVudHM7CisKKyAgICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBlbmNvZGVDb250ZW50cy5VVEY4RW5jb2RlKCk7CisgICAgaW50MzJfdCBjaGVja3N1bSA9IHBXcml0ZXItPkNhbGNDaGVja3N1bShieXRlU3RyaW5nKTsKKyAgICBieXRlU3RyaW5nICs9IGNoZWNrc3VtIC0gMCArICcwJzsKKyAgICBlbmNvZGVDb250ZW50cyA9IGJ5dGVTdHJpbmcuVVRGOERlY29kZSgpOworICB9CisgIGlmIChsZW5ndGggPiAxMikKKyAgICBlbmNvZGVDb250ZW50cyA9IGVuY29kZUNvbnRlbnRzLkxlZnQoMTIpOworCisgIHJldHVybiBlbmNvZGVDb250ZW50czsKK30KKworYm9vbCBDQkNfVVBDQTo6RW5jb2RlKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cykgeworICBpZiAoY29udGVudHMuSXNFbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBCQ0ZPUk1BVCBmb3JtYXQgPSBCQ0ZPUk1BVF9VUENfQTsKKyAgaW50MzJfdCBvdXRXaWR0aCA9IDA7CisgIGludDMyX3Qgb3V0SGVpZ2h0ID0gMDsKKyAgV2lkZVN0cmluZyBlbmNvZGVDb250ZW50cyA9IFByZXByb2Nlc3MoY29udGVudHMpOworICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBlbmNvZGVDb250ZW50cy5VVEY4RW5jb2RlKCk7CisgIG1fcmVuZGVyQ29udGVudHMgPSBlbmNvZGVDb250ZW50czsKKworICBDQkNfT25lZFVQQ0FXcml0ZXIqIHBXcml0ZXIgPSBHZXRPbmVkVVBDQVdyaXRlcigpOworICBwV3JpdGVyLT5Jbml0KCk7CisgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90LCBGeEZyZWVEZWxldGVyPiBkYXRhKAorICAgICAgcFdyaXRlci0+RW5jb2RlKGJ5dGVTdHJpbmcsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCkpOworICBpZiAoIWRhdGEpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gcFdyaXRlci0+UmVuZGVyUmVzdWx0KGVuY29kZUNvbnRlbnRzLkFzU3RyaW5nVmlldygpLCBkYXRhLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFdpZHRoKTsKK30KKworYm9vbCBDQkNfVVBDQTo6UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgpIHsKKyAgcmV0dXJuIEdldE9uZWRVUENBV3JpdGVyKCktPlJlbmRlckRldmljZVJlc3VsdCgKKyAgICAgIGRldmljZSwgbWF0cml4LCBtX3JlbmRlckNvbnRlbnRzLkFzU3RyaW5nVmlldygpKTsKK30KKworQkNfVFlQRSBDQkNfVVBDQTo6R2V0VHlwZSgpIHsKKyAgcmV0dXJuIEJDX1VQQ0E7Cit9CisKK0NCQ19PbmVkVVBDQVdyaXRlciogQ0JDX1VQQ0E6OkdldE9uZWRVUENBV3JpdGVyKCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0JDX09uZWRVUENBV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2NiY191cGNhLmggYi9meGJhcmNvZGUvY2JjX3VwY2EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWM0ZDdkCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL2NiY191cGNhLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9DQkNfVVBDQV9IXworI2RlZmluZSBGWEJBUkNPREVfQ0JDX1VQQ0FfSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NiY19vbmVjb2RlLmgiCisKK2NsYXNzIENCQ19PbmVkVVBDQVdyaXRlcjsKKworY2xhc3MgQ0JDX1VQQ0EgOiBwdWJsaWMgQ0JDX09uZUNvZGUgeworIHB1YmxpYzoKKyAgQ0JDX1VQQ0EoKTsKKyAgfkNCQ19VUENBKCkgb3ZlcnJpZGU7CisKKyAgLy8gQ0JDX0NvZGVCYXNlOgorICBib29sIEVuY29kZShjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIG92ZXJyaWRlOworICBib29sIFJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCkgb3ZlcnJpZGU7CisgIEJDX1RZUEUgR2V0VHlwZSgpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgQ0JDX09uZWRVUENBV3JpdGVyKiBHZXRPbmVkVVBDQVdyaXRlcigpOworICBXaWRlU3RyaW5nIFByZXByb2Nlc3MoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzKTsKKyAgV2lkZVN0cmluZyBtX3JlbmRlckNvbnRlbnRzOworfTsKKworI2VuZGlmICAvLyBGWEJBUkNPREVfQ0JDX1VQQ0FfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0QXJyYXkuY3BwIGIvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRBcnJheS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBkYTliZQotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0QXJyYXkuY3BwCkBAIC0wLDAgKzEsOTAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKKy8qCisgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmgiCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL3V0aWxzLmgiCisKK0NCQ19Db21tb25CaXRBcnJheTo6Q0JDX0NvbW1vbkJpdEFycmF5KENCQ19Db21tb25CaXRBcnJheSogYXJyYXkpIHsKKyAgbV9zaXplID0gYXJyYXktPkdldFNpemUoKTsKKyAgbV9iaXRzID0gYXJyYXktPkdldEJpdHMoKTsKK30KKworQ0JDX0NvbW1vbkJpdEFycmF5OjpDQkNfQ29tbW9uQml0QXJyYXkoKSB7CisgIG1fYml0cy5yZXNpemUoMSk7CisgIG1fc2l6ZSA9IDA7Cit9CisKK0NCQ19Db21tb25CaXRBcnJheTo6Q0JDX0NvbW1vbkJpdEFycmF5KGludDMyX3Qgc2l6ZSkgeworICBtX2JpdHMucmVzaXplKChzaXplICsgMzEpID4+IDUpOworICBtX3NpemUgPSBzaXplOworfQorCitDQkNfQ29tbW9uQml0QXJyYXk6On5DQkNfQ29tbW9uQml0QXJyYXkoKSB7fQorCitzaXplX3QgQ0JDX0NvbW1vbkJpdEFycmF5OjpHZXRTaXplKCkgeworICByZXR1cm4gbV9zaXplOworfQorCitzdGQ6OnZlY3RvcjxpbnQzMl90PiYgQ0JDX0NvbW1vbkJpdEFycmF5OjpHZXRCaXRzKCkgeworICByZXR1cm4gbV9iaXRzOworfQorCitzaXplX3QgQ0JDX0NvbW1vbkJpdEFycmF5OjpHZXRTaXplSW5CeXRlcygpIHsKKyAgcmV0dXJuIChtX3NpemUgKyA3KSA+PiAzOworfQorCitib29sIENCQ19Db21tb25CaXRBcnJheTo6R2V0KHNpemVfdCBpKSB7CisgIHJldHVybiAobV9iaXRzW2kgPj4gNV0gJiAoMSA8PCAoaSAmIDB4MWYpKSkgIT0gMDsKK30KKwordm9pZCBDQkNfQ29tbW9uQml0QXJyYXk6OlNldChzaXplX3QgaSkgeworICBtX2JpdHNbaSA+PiA1XSB8PSAxIDw8IChpICYgMHgxRik7Cit9CisKK3ZvaWQgQ0JDX0NvbW1vbkJpdEFycmF5OjpGbGlwKHNpemVfdCBpKSB7CisgIG1fYml0c1tpID4+IDVdIF49IDEgPDwgKGkgJiAweDFGKTsKK30KKwordm9pZCBDQkNfQ29tbW9uQml0QXJyYXk6OlNldEJ1bGsoc2l6ZV90IGksIGludDMyX3QgbmV3Qml0cykgeworICBtX2JpdHNbaSA+PiA1XSA9IG5ld0JpdHM7Cit9CisKK3ZvaWQgQ0JDX0NvbW1vbkJpdEFycmF5OjpDbGVhcigpIHsKKyAgZm9yIChhdXRvJiB2YWx1ZSA6IG1fYml0cykKKyAgICB2YWx1ZSA9IDA7Cit9CisKK2ludDMyX3QqIENCQ19Db21tb25CaXRBcnJheTo6R2V0Qml0QXJyYXkoKSB7CisgIHJldHVybiBtX2JpdHMuZGF0YSgpOworfQorCit2b2lkIENCQ19Db21tb25CaXRBcnJheTo6UmV2ZXJzZSgpIHsKKyAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gbmV3Qml0cyhtX2JpdHMuc2l6ZSgpKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX3NpemU7IGkrKykgeworICAgIGlmIChHZXQobV9zaXplIC0gaSAtIDEpKQorICAgICAgbmV3Qml0c1tpID4+IDVdIHw9IDEgPDwgKGkgJiAweDFGKTsKKyAgfQorICBtX2JpdHMgPSBzdGQ6Om1vdmUobmV3Qml0cyk7Cit9CmRpZmYgLS1naXQgYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmggYi9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzZGI4NgotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0QXJyYXkuaApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhCQVJDT0RFX0NPTU1PTl9CQ19DT01NT05CSVRBUlJBWV9IXworI2RlZmluZSBGWEJBUkNPREVfQ09NTU9OX0JDX0NPTU1PTkJJVEFSUkFZX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworY2xhc3MgQ0JDX0NvbW1vbkJpdEFycmF5IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENCQ19Db21tb25CaXRBcnJheShDQkNfQ29tbW9uQml0QXJyYXkqIGFycmF5KTsKKyAgZXhwbGljaXQgQ0JDX0NvbW1vbkJpdEFycmF5KGludDMyX3Qgc2l6ZSk7CisgIENCQ19Db21tb25CaXRBcnJheSgpOworICB2aXJ0dWFsIH5DQkNfQ29tbW9uQml0QXJyYXkoKTsKKworICBzaXplX3QgR2V0U2l6ZSgpOworICBzaXplX3QgR2V0U2l6ZUluQnl0ZXMoKTsKKyAgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIEdldEJpdHMoKTsKKyAgaW50MzJfdCogR2V0Qml0QXJyYXkoKTsKKyAgYm9vbCBHZXQoc2l6ZV90IGkpOworICB2b2lkIFNldChzaXplX3QgaSk7CisgIHZvaWQgRmxpcChzaXplX3QgaSk7CisgIHZvaWQgU2V0QnVsayhzaXplX3QgaSwgaW50MzJfdCBuZXdCaXRzKTsKKyAgdm9pZCBSZXZlcnNlKCk7CisgIHZvaWQgQ2xlYXIoKTsKKworIHByaXZhdGU6CisgIHNpemVfdCBtX3NpemU7CisgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IG1fYml0czsKK307CisKKyNlbmRpZiAgLy8gRlhCQVJDT0RFX0NPTU1PTl9CQ19DT01NT05CSVRBUlJBWV9IXwpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguY3BwIGIvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZTQ0N2QKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5jcHAKQEAgLTAsMCArMSwxMDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKKy8qCisgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRBcnJheS5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS91dGlscy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworQ0JDX0NvbW1vbkJpdE1hdHJpeDo6Q0JDX0NvbW1vbkJpdE1hdHJpeCgpIHt9CisKK3ZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6SW5pdChpbnQzMl90IGRpbWVuc2lvbikgeworICBtX3dpZHRoID0gZGltZW5zaW9uOworICBtX2hlaWdodCA9IGRpbWVuc2lvbjsKKyAgaW50MzJfdCByb3dTaXplID0gKG1faGVpZ2h0ICsgMzEpID4+IDU7CisgIG1fcm93U2l6ZSA9IHJvd1NpemU7CisgIG1fYml0cyA9IEZYX0FsbG9jMkQoaW50MzJfdCwgbV9yb3dTaXplLCBtX2hlaWdodCk7CisgIG1lbXNldChtX2JpdHMsIDAsIG1fcm93U2l6ZSAqIG1faGVpZ2h0ICogc2l6ZW9mKGludDMyX3QpKTsKK30KKwordm9pZCBDQkNfQ29tbW9uQml0TWF0cml4OjpJbml0KGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgIG1fd2lkdGggPSB3aWR0aDsKKyAgbV9oZWlnaHQgPSBoZWlnaHQ7CisgIGludDMyX3Qgcm93U2l6ZSA9ICh3aWR0aCArIDMxKSA+PiA1OworICBtX3Jvd1NpemUgPSByb3dTaXplOworICBtX2JpdHMgPSBGWF9BbGxvYzJEKGludDMyX3QsIG1fcm93U2l6ZSwgbV9oZWlnaHQpOworICBtZW1zZXQobV9iaXRzLCAwLCBtX3Jvd1NpemUgKiBtX2hlaWdodCAqIHNpemVvZihpbnQzMl90KSk7Cit9CisKK0NCQ19Db21tb25CaXRNYXRyaXg6On5DQkNfQ29tbW9uQml0TWF0cml4KCkgeworICBGWF9GcmVlKG1fYml0cyk7Cit9CisKK2Jvb2wgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6R2V0KGludDMyX3QgeCwgaW50MzJfdCB5KSBjb25zdCB7CisgIGludDMyX3Qgb2Zmc2V0ID0geSAqIG1fcm93U2l6ZSArICh4ID4+IDUpOworICBpZiAob2Zmc2V0ID49IG1fcm93U2l6ZSAqIG1faGVpZ2h0IHx8IG9mZnNldCA8IDApCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gKCgoKHVpbnQzMl90KW1fYml0c1tvZmZzZXRdKSA+PiAoeCAmIDB4MWYpKSAmIDEpICE9IDA7Cit9CisKK3ZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6U2V0KGludDMyX3QgeCwgaW50MzJfdCB5KSB7CisgIGludDMyX3Qgb2Zmc2V0ID0geSAqIG1fcm93U2l6ZSArICh4ID4+IDUpOworICBpZiAob2Zmc2V0ID49IG1fcm93U2l6ZSAqIG1faGVpZ2h0IHx8IG9mZnNldCA8IDApCisgICAgcmV0dXJuOworICBtX2JpdHNbb2Zmc2V0XSB8PSAxIDw8ICh4ICYgMHgxZik7Cit9CisKK3ZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6RmxpcChpbnQzMl90IHgsIGludDMyX3QgeSkgeworICBpbnQzMl90IG9mZnNldCA9IHkgKiBtX3Jvd1NpemUgKyAoeCA+PiA1KTsKKyAgbV9iaXRzW29mZnNldF0gXj0gMSA8PCAoeCAmIDB4MWYpOworfQorCit2b2lkIENCQ19Db21tb25CaXRNYXRyaXg6OkNsZWFyKCkgeworICBtZW1zZXQobV9iaXRzLCAwLCBtX3Jvd1NpemUgKiBtX2hlaWdodCAqIHNpemVvZihpbnQzMl90KSk7Cit9CisKK2Jvb2wgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6U2V0UmVnaW9uKGludDMyX3QgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KSB7CisgIGlmICh0b3AgPCAwIHx8IGxlZnQgPCAwIHx8IGhlaWdodCA8IDEgfHwgd2lkdGggPCAxKQorICAgIHJldHVybiBmYWxzZTsKKworICBpbnQzMl90IHJpZ2h0ID0gbGVmdCArIHdpZHRoOworICBpbnQzMl90IGJvdHRvbSA9IHRvcCArIGhlaWdodDsKKyAgaWYgKG1faGVpZ2h0IDwgYm90dG9tIHx8IG1fd2lkdGggPCByaWdodCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yIChpbnQzMl90IHkgPSB0b3A7IHkgPCBib3R0b207IHkrKykgeworICAgIGludDMyX3Qgb2Zmc2V0ID0geSAqIG1fcm93U2l6ZTsKKyAgICBmb3IgKGludDMyX3QgeCA9IGxlZnQ7IHggPCByaWdodDsgeCsrKQorICAgICAgbV9iaXRzW29mZnNldCArICh4ID4+IDUpXSB8PSAxIDw8ICh4ICYgMHgxZik7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6U2V0Um93KGludDMyX3QgeSwgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3cpIHsKKyAgaW50MzJfdCBsID0geSAqIG1fcm93U2l6ZTsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9yb3dTaXplOyBpKyspIHsKKyAgICBtX2JpdHNbbF0gPSByb3ctPkdldEJpdEFycmF5KClbaV07CisgICAgbCsrOworICB9Cit9CisKK3ZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6U2V0Q29sKGludDMyX3QgeSwgQ0JDX0NvbW1vbkJpdEFycmF5KiBjb2wpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb2wtPkdldEJpdHMoKS5zaXplKCk7ICsraSkKKyAgICBtX2JpdHNbaSAqIG1fcm93U2l6ZSArIHldID0gY29sLT5HZXRCaXRBcnJheSgpW2ldOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCBiL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdjMGY4OAotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9DT01NT05fQkNfQ09NTU9OQklUTUFUUklYX0hfCisjZGVmaW5lIEZYQkFSQ09ERV9DT01NT05fQkNfQ09NTU9OQklUTUFUUklYX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorCitjbGFzcyBDQkNfQ29tbW9uQml0QXJyYXk7CisKK2NsYXNzIENCQ19Db21tb25CaXRNYXRyaXggeworIHB1YmxpYzoKKyAgQ0JDX0NvbW1vbkJpdE1hdHJpeCgpOworICB+Q0JDX0NvbW1vbkJpdE1hdHJpeCgpOworCisgIHZvaWQgSW5pdChpbnQzMl90IGRpbWVuc2lvbik7CisgIHZvaWQgSW5pdChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7CisKKyAgYm9vbCBHZXQoaW50MzJfdCB4LCBpbnQzMl90IHkpIGNvbnN0OworICB2b2lkIFNldChpbnQzMl90IHgsIGludDMyX3QgeSk7CisgIHZvaWQgRmxpcChpbnQzMl90IHgsIGludDMyX3QgeSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgYm9vbCBTZXRSZWdpb24oaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworICB2b2lkIFNldFJvdyhpbnQzMl90IHksIENCQ19Db21tb25CaXRBcnJheSogcm93KTsKKyAgQ0JDX0NvbW1vbkJpdEFycmF5KiBHZXRDb2woaW50MzJfdCB5LCBDQkNfQ29tbW9uQml0QXJyYXkqIHJvdyk7CisgIHZvaWQgU2V0Q29sKGludDMyX3QgeSwgQ0JDX0NvbW1vbkJpdEFycmF5KiBjb2wpOworICBpbnQzMl90IEdldFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbV93aWR0aDsgfQorICBpbnQzMl90IEdldEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1faGVpZ2h0OyB9CisgIGludDMyX3QqIEdldEJpdHMoKSBjb25zdCB7IHJldHVybiBtX2JpdHM7IH0KKworIHByaXZhdGU6CisgIGludDMyX3QgbV93aWR0aCA9IDA7CisgIGludDMyX3QgbV9oZWlnaHQgPSAwOworICBpbnQzMl90IG1fcm93U2l6ZSA9IDA7CisgIGludDMyX3QqIG1fYml0cyA9IG51bGxwdHI7Cit9OworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9DT01NT05fQkNfQ09NTU9OQklUTUFUUklYX0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVBcnJheS5jcHAgYi9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVBcnJheS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY2NTY4YwotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZUFycmF5LmNwcApAQCAtMCwwICsxLDEwMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgorLyoKKyAqIENvcHlyaWdodCAyMDA4IFpYaW5nIGF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJmeGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVBcnJheS5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9tZW1vcnkuaCIKKworQ0JDX0NvbW1vbkJ5dGVBcnJheTo6Q0JDX0NvbW1vbkJ5dGVBcnJheSgpIHsKKyAgbV9ieXRlcyA9IG51bGxwdHI7CisgIG1fc2l6ZSA9IDA7CisgIG1faW5kZXggPSAwOworfQorQ0JDX0NvbW1vbkJ5dGVBcnJheTo6Q0JDX0NvbW1vbkJ5dGVBcnJheShpbnQzMl90IHNpemUpIHsKKyAgbV9zaXplID0gc2l6ZTsKKyAgbV9ieXRlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIHNpemUpOworICBtZW1zZXQobV9ieXRlcywgMCwgc2l6ZSk7CisgIG1faW5kZXggPSAwOworfQorQ0JDX0NvbW1vbkJ5dGVBcnJheTo6Q0JDX0NvbW1vbkJ5dGVBcnJheSh1aW50OF90KiBieXRlQXJyYXksIGludDMyX3Qgc2l6ZSkgeworICBtX3NpemUgPSBzaXplOworICBtX2J5dGVzID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7CisgIG1lbWNweShtX2J5dGVzLCBieXRlQXJyYXksIHNpemUpOworICBtX2luZGV4ID0gc2l6ZTsKK30KK0NCQ19Db21tb25CeXRlQXJyYXk6On5DQkNfQ29tbW9uQnl0ZUFycmF5KCkgeworICBGWF9GcmVlKG1fYnl0ZXMpOworfQoraW50MzJfdCBDQkNfQ29tbW9uQnl0ZUFycmF5OjpBdChpbnQzMl90IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBtX2J5dGVzW2luZGV4XSAmIDB4ZmY7Cit9Cit2b2lkIENCQ19Db21tb25CeXRlQXJyYXk6OlNldChpbnQzMl90IGluZGV4LCBpbnQzMl90IHZhbHVlKSB7CisgIG1fYnl0ZXNbaW5kZXhdID0gKHVpbnQ4X3QpdmFsdWU7Cit9CitpbnQzMl90IENCQ19Db21tb25CeXRlQXJyYXk6OlNpemUoKSBjb25zdCB7CisgIHJldHVybiBtX3NpemU7Cit9Citib29sIENCQ19Db21tb25CeXRlQXJyYXk6OklzRW1wdHkoKSBjb25zdCB7CisgIHJldHVybiBtX3NpemUgPT0gMDsKK30KK3ZvaWQgQ0JDX0NvbW1vbkJ5dGVBcnJheTo6QXBwZW5kQnl0ZShpbnQzMl90IHZhbHVlKSB7CisgIGlmIChtX3NpemUgPT0gMCB8fCBtX2luZGV4ID49IG1fc2l6ZSkgeworICAgIGludDMyX3QgbmV3U2l6ZSA9IHN0ZDo6bWF4KDMyLCBtX3NpemUgPDwgMSk7CisgICAgUmVzZXJ2ZShuZXdTaXplKTsKKyAgfQorICBtX2J5dGVzW21faW5kZXhdID0gKHVpbnQ4X3QpdmFsdWU7CisgIG1faW5kZXgrKzsKK30KK3ZvaWQgQ0JDX0NvbW1vbkJ5dGVBcnJheTo6UmVzZXJ2ZShpbnQzMl90IGNhcGFjaXR5KSB7CisgIGlmICghbV9ieXRlcyB8fCBtX3NpemUgPCBjYXBhY2l0eSkgeworICAgIHVpbnQ4X3QqIG5ld0FycmF5ID0gRlhfQWxsb2ModWludDhfdCwgY2FwYWNpdHkpOworICAgIGlmIChtX2J5dGVzKSB7CisgICAgICBtZW1jcHkobmV3QXJyYXksIG1fYnl0ZXMsIG1fc2l6ZSk7CisgICAgICBtZW1zZXQobmV3QXJyYXkgKyBtX3NpemUsIDAsIGNhcGFjaXR5IC0gbV9zaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVtc2V0KG5ld0FycmF5LCAwLCBjYXBhY2l0eSk7CisgICAgfQorICAgIEZYX0ZyZWUobV9ieXRlcyk7CisgICAgbV9ieXRlcyA9IG5ld0FycmF5OworICAgIG1fc2l6ZSA9IGNhcGFjaXR5OworICB9Cit9Cit2b2lkIENCQ19Db21tb25CeXRlQXJyYXk6OlNldChjb25zdCB1aW50OF90KiBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQpIHsKKyAgRlhfRnJlZShtX2J5dGVzKTsKKyAgbV9ieXRlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIGNvdW50KTsKKyAgbV9zaXplID0gY291bnQ7CisgIG1lbWNweShtX2J5dGVzLCBzb3VyY2UgKyBvZmZzZXQsIGNvdW50KTsKKyAgbV9pbmRleCA9IGNvdW50OworfQordm9pZCBDQkNfQ29tbW9uQnl0ZUFycmF5OjpTZXQoc3RkOjp2ZWN0b3I8dWludDhfdD4qIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCkgeworICBGWF9GcmVlKG1fYnl0ZXMpOworICBtX2J5dGVzID0gRlhfQWxsb2ModWludDhfdCwgY291bnQpOworICBtX3NpemUgPSBjb3VudDsKKyAgaW50MzJfdCBpOworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgIG1fYnl0ZXNbaV0gPSBzb3VyY2UtPm9wZXJhdG9yW10oaSArIG9mZnNldCk7CisgIH0KKyAgbV9pbmRleCA9IG1fc2l6ZTsKK30KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZUFycmF5LmggYi9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVBcnJheS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NWE1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVBcnJheS5oCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEJBUkNPREVfQ09NTU9OX0JDX0NPTU1PTkJZVEVBUlJBWV9IXworI2RlZmluZSBGWEJBUkNPREVfQ09NTU9OX0JDX0NPTU1PTkJZVEVBUlJBWV9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIFRPRE8od2VpbGkpOiBUaGUgdXNhZ2Ugb2YgdGhpcyBjbGFzcyBzaG91bGQgYmUgcmVwbGFjZWQgYnkKKy8vIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LgorY2xhc3MgQ0JDX0NvbW1vbkJ5dGVBcnJheSB7CisgcHVibGljOgorICBDQkNfQ29tbW9uQnl0ZUFycmF5KCk7CisgIGV4cGxpY2l0IENCQ19Db21tb25CeXRlQXJyYXkoaW50MzJfdCBzaXplKTsKKyAgQ0JDX0NvbW1vbkJ5dGVBcnJheSh1aW50OF90KiBieXRlQXJyYXksIGludDMyX3Qgc2l6ZSk7CisgIHZpcnR1YWwgfkNCQ19Db21tb25CeXRlQXJyYXkoKTsKKworICBpbnQzMl90IEF0KGludDMyX3QgaW5kZXgpIGNvbnN0OworICBpbnQzMl90IFNpemUoKSBjb25zdDsKKyAgYm9vbCBJc0VtcHR5KCkgY29uc3Q7CisgIHZvaWQgU2V0KGludDMyX3QgaW5kZXgsIGludDMyX3QgdmFsdWUpOworICB2b2lkIEFwcGVuZEJ5dGUoaW50MzJfdCB2YWx1ZSk7CisgIHZvaWQgUmVzZXJ2ZShpbnQzMl90IGNhcGFjaXR5KTsKKyAgdm9pZCBTZXQoY29uc3QgdWludDhfdCogc291cmNlLCBpbnQzMl90IG9mZnNldCwgaW50MzJfdCBjb3VudCk7CisgIHZvaWQgU2V0KHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBzb3VyY2UsIGludDMyX3Qgb2Zmc2V0LCBpbnQzMl90IGNvdW50KTsKKworIHByaXZhdGU6CisgIGludDMyX3QgbV9zaXplOworICBpbnQzMl90IG1faW5kZXg7CisgIHVpbnQ4X3QqIG1fYnl0ZXM7Cit9OworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9DT01NT05fQkNfQ09NTU9OQllURUFSUkFZX0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVNYXRyaXguY3BwIGIvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlTWF0cml4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWIxZTlhCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlTWF0cml4LmNwcApAQCAtMCwwICsxLDY0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6CisvKgorICogQ29weXJpZ2h0IDIwMDggWlhpbmcgYXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9tZW1vcnkuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVNYXRyaXguaCIKKworQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6OkNCQ19Db21tb25CeXRlTWF0cml4KGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgIG1faGVpZ2h0ID0gaGVpZ2h0OworICBtX3dpZHRoID0gd2lkdGg7CisgIG1fYnl0ZXMgPSBudWxscHRyOworfQordm9pZCBDQkNfQ29tbW9uQnl0ZU1hdHJpeDo6SW5pdCgpIHsKKyAgbV9ieXRlcyA9IEZYX0FsbG9jMkQodWludDhfdCwgbV9oZWlnaHQsIG1fd2lkdGgpOworICBtZW1zZXQobV9ieXRlcywgMHhmZiwgbV9oZWlnaHQgKiBtX3dpZHRoKTsKK30KK0NCQ19Db21tb25CeXRlTWF0cml4Ojp+Q0JDX0NvbW1vbkJ5dGVNYXRyaXgoKSB7CisgIEZYX0ZyZWUobV9ieXRlcyk7Cit9CitpbnQzMl90IENCQ19Db21tb25CeXRlTWF0cml4OjpHZXRIZWlnaHQoKSB7CisgIHJldHVybiBtX2hlaWdodDsKK30KK2ludDMyX3QgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6OkdldFdpZHRoKCkgeworICByZXR1cm4gbV93aWR0aDsKK30KK3VpbnQ4X3QgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6OkdldChpbnQzMl90IHgsIGludDMyX3QgeSkgeworICByZXR1cm4gbV9ieXRlc1t5ICogbV93aWR0aCArIHhdOworfQordm9pZCBDQkNfQ29tbW9uQnl0ZU1hdHJpeDo6U2V0KGludDMyX3QgeCwgaW50MzJfdCB5LCBpbnQzMl90IHZhbHVlKSB7CisgIG1fYnl0ZXNbeSAqIG1fd2lkdGggKyB4XSA9ICh1aW50OF90KXZhbHVlOworfQordm9pZCBDQkNfQ29tbW9uQnl0ZU1hdHJpeDo6U2V0KGludDMyX3QgeCwgaW50MzJfdCB5LCB1aW50OF90IHZhbHVlKSB7CisgIG1fYnl0ZXNbeSAqIG1fd2lkdGggKyB4XSA9IHZhbHVlOworfQordm9pZCBDQkNfQ29tbW9uQnl0ZU1hdHJpeDo6Y2xlYXIodWludDhfdCB2YWx1ZSkgeworICBpbnQzMl90IHk7CisgIGZvciAoeSA9IDA7IHkgPCBtX2hlaWdodDsgeSsrKSB7CisgICAgaW50MzJfdCB4OworICAgIGZvciAoeCA9IDA7IHggPCBtX3dpZHRoOyB4KyspIHsKKyAgICAgIG1fYnl0ZXNbeSAqIG1fd2lkdGggKyB4XSA9IHZhbHVlOworICAgIH0KKyAgfQorfQordWludDhfdCogQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6OkdldEFycmF5KCkgeworICByZXR1cm4gbV9ieXRlczsKK30KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5oIGIvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlTWF0cml4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYxM2EzNwotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEJBUkNPREVfQ09NTU9OX0JDX0NPTU1PTkJZVEVNQVRSSVhfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX0NPTU1PTl9CQ19DT01NT05CWVRFTUFUUklYX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisKK2NsYXNzIENCQ19Db21tb25CeXRlTWF0cml4IHsKKyBwdWJsaWM6CisgIENCQ19Db21tb25CeXRlTWF0cml4KGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKKyAgdmlydHVhbCB+Q0JDX0NvbW1vbkJ5dGVNYXRyaXgoKTsKKworICBpbnQzMl90IEdldEhlaWdodCgpOworICBpbnQzMl90IEdldFdpZHRoKCk7CisgIHVpbnQ4X3QgR2V0KGludDMyX3QgeCwgaW50MzJfdCB5KTsKKyAgdWludDhfdCogR2V0QXJyYXkoKTsKKworICB2b2lkIFNldChpbnQzMl90IHgsIGludDMyX3QgeSwgaW50MzJfdCB2YWx1ZSk7CisgIHZvaWQgU2V0KGludDMyX3QgeCwgaW50MzJfdCB5LCB1aW50OF90IHZhbHVlKTsKKyAgdm9pZCBjbGVhcih1aW50OF90IHZhbHVlKTsKKyAgdmlydHVhbCB2b2lkIEluaXQoKTsKKworIHByaXZhdGU6CisgIHVpbnQ4X3QqIG1fYnl0ZXM7CisgIGludDMyX3QgbV93aWR0aDsKKyAgaW50MzJfdCBtX2hlaWdodDsKK307CisKKyNlbmRpZiAgLy8gRlhCQVJDT0RFX0NPTU1PTl9CQ19DT01NT05CWVRFTUFUUklYX0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uLmNwcCBiL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZTc0YzcKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uLmNwcApAQCAtMCwwICsxLDEwMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgorLyoKKyAqIENvcHlyaWdodCAyMDA3IFpYaW5nIGF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImZ4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb24uaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2UG9seS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworQ0JDX1JlZWRTb2xvbW9uRW5jb2Rlcjo6Q0JDX1JlZWRTb2xvbW9uRW5jb2RlcihDQkNfUmVlZFNvbG9tb25HRjI1NiogZmllbGQpCisgICAgOiBtX2ZpZWxkKGZpZWxkKSB7fQorCitDQkNfUmVlZFNvbG9tb25FbmNvZGVyOjp+Q0JDX1JlZWRTb2xvbW9uRW5jb2RlcigpIHt9CisKK3ZvaWQgQ0JDX1JlZWRTb2xvbW9uRW5jb2Rlcjo6SW5pdCgpIHsKKyAgbV9jYWNoZWRHZW5lcmF0b3JzLnB1c2hfYmFjaygKKyAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+KG1fZmllbGQuR2V0KCksIDEpKTsKK30KKworQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBDQkNfUmVlZFNvbG9tb25FbmNvZGVyOjpCdWlsZEdlbmVyYXRvcigKKyAgICBzaXplX3QgZGVncmVlKSB7CisgIGlmIChkZWdyZWUgPj0gbV9jYWNoZWRHZW5lcmF0b3JzLnNpemUoKSkgeworICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogbGFzdEdlbmVyYXRvciA9IG1fY2FjaGVkR2VuZXJhdG9ycy5iYWNrKCkuZ2V0KCk7CisgICAgZm9yIChzaXplX3QgZCA9IG1fY2FjaGVkR2VuZXJhdG9ycy5zaXplKCk7IGQgPD0gZGVncmVlOyArK2QpIHsKKyAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHRlbXAgPSB7MSwgbV9maWVsZC0+RXhwKGQgLSAxKX07CisgICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkgdGVtcF9wb2x5OworICAgICAgaWYgKCF0ZW1wX3BvbHkuSW5pdChtX2ZpZWxkLkdldCgpLCAmdGVtcCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICBhdXRvIG5leHRHZW5lcmF0b3IgPSBsYXN0R2VuZXJhdG9yLT5NdWx0aXBseSgmdGVtcF9wb2x5KTsKKyAgICAgIGlmICghbmV4dEdlbmVyYXRvcikKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgIGxhc3RHZW5lcmF0b3IgPSBuZXh0R2VuZXJhdG9yLmdldCgpOworICAgICAgbV9jYWNoZWRHZW5lcmF0b3JzLnB1c2hfYmFjayhzdGQ6Om1vdmUobmV4dEdlbmVyYXRvcikpOworICAgIH0KKyAgfQorICByZXR1cm4gbV9jYWNoZWRHZW5lcmF0b3JzW2RlZ3JlZV0uZ2V0KCk7Cit9CisKK2Jvb2wgQ0JDX1JlZWRTb2xvbW9uRW5jb2Rlcjo6RW5jb2RlKHN0ZDo6dmVjdG9yPGludDMyX3Q+KiB0b0VuY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBlY0J5dGVzKSB7CisgIGlmIChlY0J5dGVzID09IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICh0b0VuY29kZS0+c2l6ZSgpIDw9IGVjQnl0ZXMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogZ2VuZXJhdG9yID0gQnVpbGRHZW5lcmF0b3IoZWNCeXRlcyk7CisgIGlmICghZ2VuZXJhdG9yKQorICAgIHJldHVybiBmYWxzZTsKKworICBzaXplX3QgZGF0YUJ5dGVzID0gdG9FbmNvZGUtPnNpemUoKSAtIGVjQnl0ZXM7CisgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGluZm9Db2VmZmljaWVudHMoZGF0YUJ5dGVzKTsKKyAgZm9yIChzaXplX3QgeCA9IDA7IHggPCBkYXRhQnl0ZXM7IHgrKykKKyAgICBpbmZvQ29lZmZpY2llbnRzW3hdID0gKCp0b0VuY29kZSlbeF07CisKKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5IGluZm87CisgIGlmICghaW5mby5Jbml0KG1fZmllbGQuR2V0KCksICZpbmZvQ29lZmZpY2llbnRzKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYXV0byBpbmZvVGVtcCA9IGluZm8uTXVsdGlwbHlCeU1vbm9taWFsKGVjQnl0ZXMsIDEpOworICBpZiAoIWluZm9UZW1wKQorICAgIHJldHVybiBmYWxzZTsKKworICBhdXRvIHJlbWFpbmRlciA9IGluZm9UZW1wLT5EaXZpZGUoZ2VuZXJhdG9yKTsKKyAgaWYgKCFyZW1haW5kZXIpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGNvbnN0IGF1dG8mIGNvZWZmaWNpZW50cyA9IHJlbWFpbmRlci0+R2V0Q29lZmZpY2llbnRzKCk7CisgIHNpemVfdCBudW1aZXJvQ29lZmZpY2llbnRzID0KKyAgICAgIGVjQnl0ZXMgPiBjb2VmZmljaWVudHMuc2l6ZSgpID8gZWNCeXRlcyAtIGNvZWZmaWNpZW50cy5zaXplKCkgOiAwOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVplcm9Db2VmZmljaWVudHM7IGkrKykKKyAgICAoKnRvRW5jb2RlKVtkYXRhQnl0ZXMgKyBpXSA9IDA7CisgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgY29lZmZpY2llbnRzLnNpemUoKTsgeSsrKQorICAgICgqdG9FbmNvZGUpW2RhdGFCeXRlcyArIG51bVplcm9Db2VmZmljaWVudHMgKyB5XSA9IGNvZWZmaWNpZW50c1t5XTsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uLmggYi9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1YzhhNAotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb24uaApAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhCQVJDT0RFX0NPTU1PTl9SRUVEU09MT01PTl9CQ19SRUVEU09MT01PTl9IXworI2RlZmluZSBGWEJBUkNPREVfQ09NTU9OX1JFRURTT0xPTU9OX0JDX1JFRURTT0xPTU9OX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgorCitjbGFzcyBDQkNfUmVlZFNvbG9tb25HRjI1NjsKK2NsYXNzIENCQ19SZWVkU29sb21vbkdGMjU2UG9seTsKKworY2xhc3MgQ0JDX1JlZWRTb2xvbW9uRW5jb2RlciB7CisgcHVibGljOgorICBleHBsaWNpdCBDQkNfUmVlZFNvbG9tb25FbmNvZGVyKENCQ19SZWVkU29sb21vbkdGMjU2KiBmaWVsZCk7CisgIH5DQkNfUmVlZFNvbG9tb25FbmNvZGVyKCk7CisKKyAgdm9pZCBJbml0KCk7CisgIGJvb2wgRW5jb2RlKHN0ZDo6dmVjdG9yPGludDMyX3Q+KiB0b0VuY29kZSwgc2l6ZV90IGVjQnl0ZXMpOworCisgcHJpdmF0ZToKKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBCdWlsZEdlbmVyYXRvcihzaXplX3QgZGVncmVlKTsKKworICBVbm93bmVkUHRyPENCQ19SZWVkU29sb21vbkdGMjU2PiBjb25zdCBtX2ZpZWxkOworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5Pj4gbV9jYWNoZWRHZW5lcmF0b3JzOworfTsKKworI2VuZGlmICAvLyBGWEJBUkNPREVfQ09NTU9OX1JFRURTT0xPTU9OX0JDX1JFRURTT0xPTU9OX0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTYuY3BwIGIvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjc2MTA1Ci0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2LmNwcApAQCAtMCwwICsxLDEzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgorLyoKKyAqIENvcHlyaWdodCAyMDA3IFpYaW5nIGF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImZ4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1Ni5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2UG9seS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIENCQ19SZWVkU29sb21vbkdGMjU2OjpRUkNvZGVGaWVsZCA9IG51bGxwdHI7CitDQkNfUmVlZFNvbG9tb25HRjI1NiogQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkRhdGFNYXRyaXhGaWVsZCA9IG51bGxwdHI7CisKK3ZvaWQgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkluaXRpYWxpemUoKSB7CisgIFFSQ29kZUZpZWxkID0gbmV3IENCQ19SZWVkU29sb21vbkdGMjU2KDB4MDExRCk7CisgIFFSQ29kZUZpZWxkLT5Jbml0KCk7CisgIERhdGFNYXRyaXhGaWVsZCA9IG5ldyBDQkNfUmVlZFNvbG9tb25HRjI1NigweDAxMkQpOworICBEYXRhTWF0cml4RmllbGQtPkluaXQoKTsKK30KKwordm9pZCBDQkNfUmVlZFNvbG9tb25HRjI1Njo6RmluYWxpemUoKSB7CisgIGRlbGV0ZSBRUkNvZGVGaWVsZDsKKyAgUVJDb2RlRmllbGQgPSBudWxscHRyOworICBkZWxldGUgRGF0YU1hdHJpeEZpZWxkOworICBEYXRhTWF0cml4RmllbGQgPSBudWxscHRyOworfQorCitDQkNfUmVlZFNvbG9tb25HRjI1Njo6Q0JDX1JlZWRTb2xvbW9uR0YyNTYoaW50MzJfdCBwcmltaXRpdmUpIHsKKyAgaW50MzJfdCB4ID0gMTsKKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgMjU2OyBqKyspIHsKKyAgICBtX2V4cFRhYmxlW2pdID0geDsKKyAgICB4IDw8PSAxOworICAgIGlmICh4ID49IDB4MTAwKSB7CisgICAgICB4IF49IHByaW1pdGl2ZTsKKyAgICB9CisgIH0KKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMjU1OyBpKyspIHsKKyAgICBtX2xvZ1RhYmxlW21fZXhwVGFibGVbaV1dID0gaTsKKyAgfQorICBtX2xvZ1RhYmxlWzBdID0gMDsKK30KKwordm9pZCBDQkNfUmVlZFNvbG9tb25HRjI1Njo6SW5pdCgpIHsKKyAgbV96ZXJvID0gcGRmaXVtOjpNYWtlVW5pcXVlPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4odGhpcywgMCk7CisgIG1fb25lID0gcGRmaXVtOjpNYWtlVW5pcXVlPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4odGhpcywgMSk7Cit9CisKK0NCQ19SZWVkU29sb21vbkdGMjU2Ojp+Q0JDX1JlZWRTb2xvbW9uR0YyNTYoKSB7fQorCitDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIENCQ19SZWVkU29sb21vbkdGMjU2OjpHZXRaZXJvKCkgY29uc3QgeworICByZXR1cm4gbV96ZXJvLmdldCgpOworfQorCitDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIENCQ19SZWVkU29sb21vbkdGMjU2OjpHZXRPbmUoKSBjb25zdCB7CisgIHJldHVybiBtX29uZS5nZXQoKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkJ1aWxkTW9ub21pYWwoCisgICAgaW50MzJfdCBkZWdyZWUsCisgICAgaW50MzJfdCBjb2VmZmljaWVudCwKKyAgICBpbnQzMl90JiBlKSB7CisgIGlmIChkZWdyZWUgPCAwKSB7CisgICAgZSA9IEJDRXhjZXB0aW9uRGVncmVlSXNOZWdhdGl2ZTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAoY29lZmZpY2llbnQgPT0gMCkgeworICAgIGF1dG8gdGVtcCA9IG1femVyby0+Q2xvbmUoKTsKKyAgICBpZiAoIXRlbXApCisgICAgICBlID0gQkNFeGNlcHRpb25HZW5lcmljOworICAgIHJldHVybiB0ZW1wOworICB9CisgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGNvZWZmaWNpZW50cyhkZWdyZWUgKyAxKTsKKyAgY29lZmZpY2llbnRzWzBdID0gY29lZmZpY2llbnQ7CisgIGF1dG8gdGVtcCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+KCk7CisgIGlmICghdGVtcC0+SW5pdCh0aGlzLCAmY29lZmZpY2llbnRzKSkgeworICAgIGUgPSBCQ0V4Y2VwdGlvbkdlbmVyaWM7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuIHRlbXA7Cit9CisKK2ludDMyX3QgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkFkZE9yU3VidHJhY3QoaW50MzJfdCBhLCBpbnQzMl90IGIpIHsKKyAgcmV0dXJuIGEgXiBiOworfQorCitpbnQzMl90IENCQ19SZWVkU29sb21vbkdGMjU2OjpFeHAoaW50MzJfdCBhKSB7CisgIHJldHVybiBtX2V4cFRhYmxlW2FdOworfQorCitpbnQzMl90IENCQ19SZWVkU29sb21vbkdGMjU2OjpMb2coaW50MzJfdCBhLCBpbnQzMl90JiBlKSB7CisgIGlmIChhID09IDApIHsKKyAgICBlID0gQkNFeGNlcHRpb25BSXNaZXJvOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBtX2xvZ1RhYmxlW2FdOworfQorCitpbnQzMl90IENCQ19SZWVkU29sb21vbkdGMjU2OjpJbnZlcnNlKGludDMyX3QgYSwgaW50MzJfdCYgZSkgeworICBpZiAoYSA9PSAwKSB7CisgICAgZSA9IEJDRXhjZXB0aW9uQUlzWmVybzsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gbV9leHBUYWJsZVsyNTUgLSBtX2xvZ1RhYmxlW2FdXTsKK30KKworaW50MzJfdCBDQkNfUmVlZFNvbG9tb25HRjI1Njo6TXVsdGlwbHkoaW50MzJfdCBhLCBpbnQzMl90IGIpIHsKKyAgaWYgKGEgPT0gMCB8fCBiID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoYSA9PSAxKSB7CisgICAgcmV0dXJuIGI7CisgIH0KKyAgaWYgKGIgPT0gMSkgeworICAgIHJldHVybiBhOworICB9CisgIHJldHVybiBtX2V4cFRhYmxlWyhtX2xvZ1RhYmxlW2FdICsgbV9sb2dUYWJsZVtiXSkgJSAyNTVdOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2LmggYi9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTNkOTQzCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2LmgKQEAgLTAsMCArMSw0NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9DT01NT05fUkVFRFNPTE9NT05fQkNfUkVFRFNPTE9NT05HRjI1Nl9IXworI2RlZmluZSBGWEJBUkNPREVfQ09NTU9OX1JFRURTT0xPTU9OX0JDX1JFRURTT0xPTU9OR0YyNTZfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImZ4YmFyY29kZS91dGlscy5oIgorCitjbGFzcyBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk7CisKK2NsYXNzIENCQ19SZWVkU29sb21vbkdGMjU2IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENCQ19SZWVkU29sb21vbkdGMjU2KGludDMyX3QgcHJpbWl0aXZlKTsKKyAgfkNCQ19SZWVkU29sb21vbkdGMjU2KCk7CisKKyAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOworICBzdGF0aWMgdm9pZCBGaW5hbGl6ZSgpOworCisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogR2V0WmVybygpIGNvbnN0OworICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIEdldE9uZSgpIGNvbnN0OworICBzdGQ6OnVuaXF1ZV9wdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBCdWlsZE1vbm9taWFsKGludDMyX3QgZGVncmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29lZmZpY2llbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7CisgIHN0YXRpYyBpbnQzMl90IEFkZE9yU3VidHJhY3QoaW50MzJfdCBhLCBpbnQzMl90IGIpOworICBpbnQzMl90IEV4cChpbnQzMl90IGEpOworICBpbnQzMl90IExvZyhpbnQzMl90IGEsIGludDMyX3QmIGUpOworICBpbnQzMl90IEludmVyc2UoaW50MzJfdCBhLCBpbnQzMl90JiBlKTsKKyAgaW50MzJfdCBNdWx0aXBseShpbnQzMl90IGEsIGludDMyX3QgYik7CisgIHZvaWQgSW5pdCgpOworCisgIHN0YXRpYyBDQkNfUmVlZFNvbG9tb25HRjI1NiogUVJDb2RlRmllbGQ7CisgIHN0YXRpYyBDQkNfUmVlZFNvbG9tb25HRjI1NiogRGF0YU1hdHJpeEZpZWxkOworCisgcHJpdmF0ZToKKyAgaW50MzJfdCBtX2V4cFRhYmxlWzI1Nl07CisgIGludDMyX3QgbV9sb2dUYWJsZVsyNTZdOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBtX3plcm87CisgIHN0ZDo6dW5pcXVlX3B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IG1fb25lOworfTsKKworI2VuZGlmICAvLyBGWEJBUkNPREVfQ09NTU9OX1JFRURTT0xPTU9OX0JDX1JFRURTT0xPTU9OR0YyNTZfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuY3BwIGIvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2UG9seS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY4MzY5MQotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuY3BwCkBAIC0wLDAgKzEsMjQwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6CisvKgorICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2UG9seS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJmeGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTYuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorCitDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkNCQ19SZWVkU29sb21vbkdGMjU2UG9seShDQkNfUmVlZFNvbG9tb25HRjI1NiogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZWZmaWNpZW50cykgeworICBpZiAoIWZpZWxkKQorICAgIHJldHVybjsKKworICBtX2ZpZWxkID0gZmllbGQ7CisgIG1fY29lZmZpY2llbnRzLnB1c2hfYmFjayhjb2VmZmljaWVudHMpOworfQorCitDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkNCQ19SZWVkU29sb21vbkdGMjU2UG9seSgpIHsKKyAgbV9maWVsZCA9IG51bGxwdHI7Cit9CisKK2Jvb2wgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpJbml0KENCQ19SZWVkU29sb21vbkdGMjU2KiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBjb2VmZmljaWVudHMpIHsKKyAgaWYgKCFjb2VmZmljaWVudHMgfHwgY29lZmZpY2llbnRzLT5lbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBtX2ZpZWxkID0gZmllbGQ7CisgIHNpemVfdCBjb2VmZmljaWVudHNMZW5ndGggPSBjb2VmZmljaWVudHMtPnNpemUoKTsKKyAgaWYgKGNvZWZmaWNpZW50c0xlbmd0aCA+IDEgJiYgY29lZmZpY2llbnRzLT5mcm9udCgpID09IDApIHsKKyAgICBzaXplX3QgZmlyc3ROb25aZXJvID0gMTsKKyAgICB3aGlsZSAoZmlyc3ROb25aZXJvIDwgY29lZmZpY2llbnRzTGVuZ3RoICYmCisgICAgICAgICAgICgqY29lZmZpY2llbnRzKVtmaXJzdE5vblplcm9dID09IDApIHsKKyAgICAgIGZpcnN0Tm9uWmVybysrOworICAgIH0KKyAgICBpZiAoZmlyc3ROb25aZXJvID09IGNvZWZmaWNpZW50c0xlbmd0aCkgeworICAgICAgbV9jb2VmZmljaWVudHMgPSBtX2ZpZWxkLT5HZXRaZXJvKCktPkdldENvZWZmaWNpZW50cygpOworICAgIH0gZWxzZSB7CisgICAgICBtX2NvZWZmaWNpZW50cy5yZXNpemUoY29lZmZpY2llbnRzTGVuZ3RoIC0gZmlyc3ROb25aZXJvKTsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSBmaXJzdE5vblplcm8sIGogPSAwOyBpIDwgY29lZmZpY2llbnRzTGVuZ3RoOyBpKyssIGorKykKKyAgICAgICAgbV9jb2VmZmljaWVudHNbal0gPSAoKmNvZWZmaWNpZW50cylbaV07CisgICAgfQorICB9IGVsc2UgeworICAgIG1fY29lZmZpY2llbnRzID0gKmNvZWZmaWNpZW50czsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIENCQ19SZWVkU29sb21vbkdGMjU2UG9seTo6R2V0Q29lZmZpY2llbnRzKCkgY29uc3QgeworICByZXR1cm4gbV9jb2VmZmljaWVudHM7Cit9CisKK2ludDMyX3QgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpHZXREZWdyZWUoKSBjb25zdCB7CisgIHJldHVybiBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fY29lZmZpY2llbnRzKSAtIDE7Cit9CisKK2Jvb2wgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpJc1plcm8oKSBjb25zdCB7CisgIHJldHVybiBtX2NvZWZmaWNpZW50cy5mcm9udCgpID09IDA7Cit9CisKK2ludDMyX3QgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpHZXRDb2VmZmljaWVudHMoaW50MzJfdCBkZWdyZWUpIGNvbnN0IHsKKyAgcmV0dXJuIG1fY29lZmZpY2llbnRzW21fY29lZmZpY2llbnRzLnNpemUoKSAtIDEgLSBkZWdyZWVdOworfQorCitpbnQzMl90IENCQ19SZWVkU29sb21vbkdGMjU2UG9seTo6RXZhbHVhdGVBdChpbnQzMl90IGEpIHsKKyAgaWYgKGEgPT0gMCkKKyAgICByZXR1cm4gR2V0Q29lZmZpY2llbnRzKDApOworCisgIHNpemVfdCBzaXplID0gbV9jb2VmZmljaWVudHMuc2l6ZSgpOworICBpZiAoYSA9PSAxKSB7CisgICAgaW50MzJfdCByZXN1bHQgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgICAgcmVzdWx0ID0gQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkFkZE9yU3VidHJhY3QocmVzdWx0LCBtX2NvZWZmaWNpZW50c1tpXSk7CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorICBpbnQzMl90IHJlc3VsdCA9IG1fY29lZmZpY2llbnRzWzBdOworICBmb3IgKHNpemVfdCBqID0gMTsgaiA8IHNpemU7IGorKykgeworICAgIHJlc3VsdCA9IENCQ19SZWVkU29sb21vbkdGMjU2OjpBZGRPclN1YnRyYWN0KG1fZmllbGQtPk11bHRpcGx5KGEsIHJlc3VsdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb2VmZmljaWVudHNbal0pOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IENCQ19SZWVkU29sb21vbkdGMjU2UG9seTo6Q2xvbmUoKQorICAgIGNvbnN0IHsKKyAgYXV0byB0ZW1wID0gcGRmaXVtOjpNYWtlVW5pcXVlPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4oKTsKKyAgaWYgKCF0ZW1wLT5Jbml0KG1fZmllbGQuR2V0KCksICZtX2NvZWZmaWNpZW50cykpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiB0ZW1wOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PgorQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpBZGRPclN1YnRyYWN0KGNvbnN0IENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogb3RoZXIpIHsKKyAgaWYgKElzWmVybygpKQorICAgIHJldHVybiBvdGhlci0+Q2xvbmUoKTsKKyAgaWYgKG90aGVyLT5Jc1plcm8oKSkKKyAgICByZXR1cm4gQ2xvbmUoKTsKKworICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBzbWFsbGVyQ29lZmZpY2llbnRzID0gbV9jb2VmZmljaWVudHM7CisgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGxhcmdlckNvZWZmaWNpZW50cyA9IG90aGVyLT5HZXRDb2VmZmljaWVudHMoKTsKKyAgaWYgKHNtYWxsZXJDb2VmZmljaWVudHMuc2l6ZSgpID4gbGFyZ2VyQ29lZmZpY2llbnRzLnNpemUoKSkKKyAgICBzdGQ6OnN3YXAoc21hbGxlckNvZWZmaWNpZW50cywgbGFyZ2VyQ29lZmZpY2llbnRzKTsKKworICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBzdW1EaWZmKGxhcmdlckNvZWZmaWNpZW50cy5zaXplKCkpOworICBzaXplX3QgbGVuZ3RoRGlmZiA9IGxhcmdlckNvZWZmaWNpZW50cy5zaXplKCkgLSBzbWFsbGVyQ29lZmZpY2llbnRzLnNpemUoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGhEaWZmOyBpKyspCisgICAgc3VtRGlmZltpXSA9IGxhcmdlckNvZWZmaWNpZW50c1tpXTsKKworICBmb3IgKHNpemVfdCBqID0gbGVuZ3RoRGlmZjsgaiA8IGxhcmdlckNvZWZmaWNpZW50cy5zaXplKCk7IGorKykgeworICAgIHN1bURpZmZbal0gPSBDQkNfUmVlZFNvbG9tb25HRjI1Njo6QWRkT3JTdWJ0cmFjdCgKKyAgICAgICAgc21hbGxlckNvZWZmaWNpZW50c1tqIC0gbGVuZ3RoRGlmZl0sIGxhcmdlckNvZWZmaWNpZW50c1tqXSk7CisgIH0KKyAgYXV0byB0ZW1wID0gcGRmaXVtOjpNYWtlVW5pcXVlPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4oKTsKKyAgaWYgKCF0ZW1wLT5Jbml0KG1fZmllbGQuR2V0KCksICZzdW1EaWZmKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIHRlbXA7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IENCQ19SZWVkU29sb21vbkdGMjU2UG9seTo6TXVsdGlwbHkoCisgICAgY29uc3QgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBvdGhlcikgeworICBpZiAoSXNaZXJvKCkgfHwgb3RoZXItPklzWmVybygpKQorICAgIHJldHVybiBtX2ZpZWxkLT5HZXRaZXJvKCktPkNsb25lKCk7CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGFDb2VmZmljaWVudHMgPSBtX2NvZWZmaWNpZW50czsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGJDb2VmZmljaWVudHMgPSBvdGhlci0+R2V0Q29lZmZpY2llbnRzKCk7CisgIHNpemVfdCBhTGVuZ3RoID0gYUNvZWZmaWNpZW50cy5zaXplKCk7CisgIHNpemVfdCBiTGVuZ3RoID0gYkNvZWZmaWNpZW50cy5zaXplKCk7CisgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHByb2R1Y3QoYUxlbmd0aCArIGJMZW5ndGggLSAxKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhTGVuZ3RoOyBpKyspIHsKKyAgICBpbnQzMl90IGFDb2VmZiA9IGFDb2VmZmljaWVudHNbaV07CisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBiTGVuZ3RoOyBqKyspIHsKKyAgICAgIHByb2R1Y3RbaSArIGpdID0gQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkFkZE9yU3VidHJhY3QoCisgICAgICAgICAgcHJvZHVjdFtpICsgal0sIG1fZmllbGQtPk11bHRpcGx5KGFDb2VmZiwgYkNvZWZmaWNpZW50c1tqXSkpOworICAgIH0KKyAgfQorICBhdXRvIHRlbXAgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PigpOworICBpZiAoIXRlbXAtPkluaXQobV9maWVsZC5HZXQoKSwgJnByb2R1Y3QpKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gdGVtcDsKK30KKworc3RkOjp1bmlxdWVfcHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpNdWx0aXBseSgKKyAgICBpbnQzMl90IHNjYWxhcikgeworICBpZiAoc2NhbGFyID09IDApCisgICAgcmV0dXJuIG1fZmllbGQtPkdldFplcm8oKS0+Q2xvbmUoKTsKKyAgaWYgKHNjYWxhciA9PSAxKQorICAgIHJldHVybiBDbG9uZSgpOworCisgIHNpemVfdCBzaXplID0gbV9jb2VmZmljaWVudHMuc2l6ZSgpOworICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBwcm9kdWN0KHNpemUpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICBwcm9kdWN0W2ldID0gbV9maWVsZC0+TXVsdGlwbHkobV9jb2VmZmljaWVudHNbaV0sIHNjYWxhcik7CisKKyAgYXV0byB0ZW1wID0gcGRmaXVtOjpNYWtlVW5pcXVlPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4oKTsKKyAgaWYgKCF0ZW1wLT5Jbml0KG1fZmllbGQuR2V0KCksICZwcm9kdWN0KSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIHRlbXA7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+CitDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6Ok11bHRpcGx5QnlNb25vbWlhbChpbnQzMl90IGRlZ3JlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29lZmZpY2llbnQpIGNvbnN0IHsKKyAgaWYgKGRlZ3JlZSA8IDApCisgICAgcmV0dXJuIG51bGxwdHI7CisgIGlmIChjb2VmZmljaWVudCA9PSAwKQorICAgIHJldHVybiBtX2ZpZWxkLT5HZXRaZXJvKCktPkNsb25lKCk7CisKKyAgc2l6ZV90IHNpemUgPSBtX2NvZWZmaWNpZW50cy5zaXplKCk7CisgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHByb2R1Y3Qoc2l6ZSArIGRlZ3JlZSk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorICAgIHByb2R1Y3RbaV0gPSBtX2ZpZWxkLT5NdWx0aXBseShtX2NvZWZmaWNpZW50c1tpXSwgY29lZmZpY2llbnQpOworCisgIGF1dG8gdGVtcCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+KCk7CisgIGlmICghdGVtcC0+SW5pdChtX2ZpZWxkLkdldCgpLCAmcHJvZHVjdCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiB0ZW1wOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkRpdmlkZSgKKyAgICBjb25zdCBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIG90aGVyKSB7CisgIGlmIChvdGhlci0+SXNaZXJvKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgYXV0byBxdW90aWVudCA9IG1fZmllbGQtPkdldFplcm8oKS0+Q2xvbmUoKTsKKyAgaWYgKCFxdW90aWVudCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgYXV0byByZW1haW5kZXIgPSBDbG9uZSgpOworICBpZiAoIXJlbWFpbmRlcikKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBpbnQgZSA9IEJDRXhjZXB0aW9uTk87CisgIGludDMyX3QgZGVub21pbmF0b3JMZWFkaW5nVGVybSA9IG90aGVyLT5HZXRDb2VmZmljaWVudHMob3RoZXItPkdldERlZ3JlZSgpKTsKKyAgaW50MzJfdCBpbnZlcnNlRGVub21pbmF0b3JMZWFkaW5nVGVhbSA9CisgICAgICBtX2ZpZWxkLT5JbnZlcnNlKGRlbm9taW5hdG9yTGVhZGluZ1Rlcm0sIGUpOworICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgIHJldHVybiBudWxscHRyOworICB3aGlsZSAocmVtYWluZGVyLT5HZXREZWdyZWUoKSA+PSBvdGhlci0+R2V0RGVncmVlKCkgJiYgIXJlbWFpbmRlci0+SXNaZXJvKCkpIHsKKyAgICBpbnQzMl90IGRlZ3JlZURpZmZlcmVuY2UgPSByZW1haW5kZXItPkdldERlZ3JlZSgpIC0gb3RoZXItPkdldERlZ3JlZSgpOworICAgIGludDMyX3Qgc2NhbGUgPQorICAgICAgICBtX2ZpZWxkLT5NdWx0aXBseShyZW1haW5kZXItPkdldENvZWZmaWNpZW50cygocmVtYWluZGVyLT5HZXREZWdyZWUoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnNlRGVub21pbmF0b3JMZWFkaW5nVGVhbSk7CisgICAgYXV0byB0ZXJtID0gb3RoZXItPk11bHRpcGx5QnlNb25vbWlhbChkZWdyZWVEaWZmZXJlbmNlLCBzY2FsZSk7CisgICAgaWYgKCF0ZXJtKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgYXV0byBpdGVyYXRvclF1b3RpZW50ID0gbV9maWVsZC0+QnVpbGRNb25vbWlhbChkZWdyZWVEaWZmZXJlbmNlLCBzY2FsZSwgZSk7CisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHF1b3RpZW50ID0gcXVvdGllbnQtPkFkZE9yU3VidHJhY3QoaXRlcmF0b3JRdW90aWVudC5nZXQoKSk7CisgICAgaWYgKCFxdW90aWVudCkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJlbWFpbmRlciA9IHJlbWFpbmRlci0+QWRkT3JTdWJ0cmFjdCh0ZXJtLmdldCgpKTsKKyAgICBpZiAoIXJlbWFpbmRlcikKKyAgICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiByZW1haW5kZXI7Cit9CisKK0NCQ19SZWVkU29sb21vbkdGMjU2UG9seTo6fkNCQ19SZWVkU29sb21vbkdGMjU2UG9seSgpIHt9CmRpZmYgLS1naXQgYS9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5LmggYi9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEwYjQ3OAotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuaApAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhCQVJDT0RFX0NPTU1PTl9SRUVEU09MT01PTl9CQ19SRUVEU09MT01PTkdGMjU2UE9MWV9IXworI2RlZmluZSBGWEJBUkNPREVfQ09NTU9OX1JFRURTT0xPTU9OX0JDX1JFRURTT0xPTU9OR0YyNTZQT0xZX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgorCitjbGFzcyBDQkNfUmVlZFNvbG9tb25HRjI1NjsKKworY2xhc3MgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5IGZpbmFsIHsKKyBwdWJsaWM6CisgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seShDQkNfUmVlZFNvbG9tb25HRjI1NiogZmllbGQsIGludDMyX3QgY29lZmZpY2llbnRzKTsKKyAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KCk7CisgIH5DQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKTsKKyAgYm9vbCBJbml0KENCQ19SZWVkU29sb21vbkdGMjU2KiBmaWVsZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBjb2VmZmljaWVudHMpOworCisgIGludDMyX3QgR2V0Q29lZmZpY2llbnRzKGludDMyX3QgZGVncmVlKSBjb25zdDsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIEdldENvZWZmaWNpZW50cygpIGNvbnN0OworICBpbnQzMl90IEdldERlZ3JlZSgpIGNvbnN0OworICBib29sIElzWmVybygpIGNvbnN0OworICBpbnQzMl90IEV2YWx1YXRlQXQoaW50MzJfdCBhKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gQWRkT3JTdWJ0cmFjdCgKKyAgICAgIGNvbnN0IENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogb3RoZXIpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBNdWx0aXBseSgKKyAgICAgIGNvbnN0IENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogb3RoZXIpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBNdWx0aXBseShpbnQzMl90IHNjYWxhcik7CisgIHN0ZDo6dW5pcXVlX3B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IE11bHRpcGx5QnlNb25vbWlhbCgKKyAgICAgIGludDMyX3QgZGVncmVlLAorICAgICAgaW50MzJfdCBjb2VmZmljaWVudCkgY29uc3Q7CisgIHN0ZDo6dW5pcXVlX3B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IERpdmlkZSgKKyAgICAgIGNvbnN0IENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogb3RoZXIpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBDbG9uZSgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgVW5vd25lZFB0cjxDQkNfUmVlZFNvbG9tb25HRjI1Nj4gbV9maWVsZDsKKyAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gbV9jb2VmZmljaWVudHM7Cit9OworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9DT01NT05fUkVFRFNPTE9NT05fQkNfUkVFRFNPTE9NT05HRjI1NlBPTFlfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0FTQ0lJRW5jb2Rlci5jcHAgYi9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19BU0NJSUVuY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YjdhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19BU0NJSUVuY29kZXIuY3BwCkBAIC0wLDAgKzEsOTcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKKy8qCisgKiBDb3B5cmlnaHQgMjAwNi0yMDA3IEplcmVtaWFzIE1hZXJraS4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0FTQ0lJRW5jb2Rlci5oIgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2Rlci5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXJDb250ZXh0LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfSGlnaExldmVsRW5jb2Rlci5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvdXRpbHMuaCIKKworQ0JDX0FTQ0lJRW5jb2Rlcjo6Q0JDX0FTQ0lJRW5jb2RlcigpIHt9CitDQkNfQVNDSUlFbmNvZGVyOjp+Q0JDX0FTQ0lJRW5jb2RlcigpIHt9CitpbnQzMl90IENCQ19BU0NJSUVuY29kZXI6OmdldEVuY29kaW5nTW9kZSgpIHsKKyAgcmV0dXJuIEFTQ0lJX0VOQ09EQVRJT047Cit9Cit2b2lkIENCQ19BU0NJSUVuY29kZXI6OkVuY29kZShDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsIGludDMyX3QmIGUpIHsKKyAgaW50MzJfdCBuID0gQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmRldGVybWluZUNvbnNlY3V0aXZlRGlnaXRDb3VudCgKKyAgICAgIGNvbnRleHQubV9tc2csIGNvbnRleHQubV9wb3MpOworICBpZiAobiA+PSAyKSB7CisgICAgd2NoYXJfdCBjb2RlID0gZW5jb2RlQVNDSUlEaWdpdHMoY29udGV4dC5tX21zZ1tjb250ZXh0Lm1fcG9zXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lm1fbXNnW2NvbnRleHQubV9wb3MgKyAxXSwgZSk7CisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoY29kZSk7CisgICAgY29udGV4dC5tX3BvcyArPSAyOworICB9IGVsc2UgeworICAgIHdjaGFyX3QgYyA9IGNvbnRleHQuZ2V0Q3VycmVudENoYXIoKTsKKyAgICBpbnQzMl90IG5ld01vZGUgPSBDQkNfSGlnaExldmVsRW5jb2Rlcjo6bG9va0FoZWFkVGVzdCgKKyAgICAgICAgY29udGV4dC5tX21zZywgY29udGV4dC5tX3BvcywgZ2V0RW5jb2RpbmdNb2RlKCkpOworICAgIGlmIChuZXdNb2RlICE9IGdldEVuY29kaW5nTW9kZSgpKSB7CisgICAgICBzd2l0Y2ggKG5ld01vZGUpIHsKKyAgICAgICAgY2FzZSBCQVNFMjU2X0VOQ09EQVRJT046CisgICAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpMQVRDSF9UT19CQVNFMjU2KTsKKyAgICAgICAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoQkFTRTI1Nl9FTkNPREFUSU9OKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgQzQwX0VOQ09EQVRJT046CisgICAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpMQVRDSF9UT19DNDApOworICAgICAgICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShDNDBfRU5DT0RBVElPTik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIFgxMl9FTkNPREFUSU9OOgorICAgICAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fQU5TSVgxMik7CisgICAgICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKFgxMl9FTkNPREFUSU9OKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBURVhUX0VOQ09EQVRJT046CisgICAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpMQVRDSF9UT19URVhUKTsKKyAgICAgICAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoVEVYVF9FTkNPREFUSU9OKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFRElGQUNUX0VOQ09EQVRJT046CisgICAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpMQVRDSF9UT19FRElGQUNUKTsKKyAgICAgICAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoRURJRkFDVF9FTkNPREFUSU9OKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsU3RhdGVJbGxlZ2FsTW9kZTsKKyAgICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfSBlbHNlIGlmIChDQkNfSGlnaExldmVsRW5jb2Rlcjo6aXNFeHRlbmRlZEFTQ0lJKGMpKSB7CisgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OlVQUEVSX1NISUZUKTsKKyAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZCgod2NoYXJfdCkoYyAtIDEyOCArIDEpKTsKKyAgICAgIGNvbnRleHQubV9wb3MrKzsKKyAgICB9IGVsc2UgeworICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKCh3Y2hhcl90KShjICsgMSkpOworICAgICAgY29udGV4dC5tX3BvcysrOworICAgIH0KKyAgfQorfQord2NoYXJfdCBDQkNfQVNDSUlFbmNvZGVyOjplbmNvZGVBU0NJSURpZ2l0cyh3Y2hhcl90IGRpZ2l0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCBkaWdpdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKKyAgaWYgKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc0RpZ2l0KGRpZ2l0MSkgJiYKKyAgICAgIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc0RpZ2l0KGRpZ2l0MikpIHsKKyAgICBpbnQzMl90IG51bSA9IChkaWdpdDEgLSA0OCkgKiAxMCArIChkaWdpdDIgLSA0OCk7CisgICAgcmV0dXJuICh3Y2hhcl90KShudW0gKyAxMzApOworICB9CisgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudE5vdEdpZ2l0czsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19BU0NJSUVuY29kZXIuaCBiL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0FTQ0lJRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYjNhNTAKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19BU0NJSUVuY29kZXIuaApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfQVNDSUlFTkNPREVSX0hfCisjZGVmaW5lIEZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX0FTQ0lJRU5DT0RFUl9IXworCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2Rlci5oIgorCitjbGFzcyBDQkNfRW5jb2RlckNvbnRleHQ7CisKK2NsYXNzIENCQ19BU0NJSUVuY29kZXIgOiBwdWJsaWMgQ0JDX0VuY29kZXIgeworIHB1YmxpYzoKKyAgQ0JDX0FTQ0lJRW5jb2RlcigpOworICB+Q0JDX0FTQ0lJRW5jb2RlcigpIG92ZXJyaWRlOworCisgIC8vIENCQ19FbmNvZGVyCisgIGludDMyX3QgZ2V0RW5jb2RpbmdNb2RlKCkgb3ZlcnJpZGU7CisgIHZvaWQgRW5jb2RlKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwgaW50MzJfdCYgZSkgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBzdGF0aWMgd2NoYXJfdCBlbmNvZGVBU0NJSURpZ2l0cyh3Y2hhcl90IGRpZ2l0MSwgd2NoYXJfdCBkaWdpdDIsIGludDMyX3QmIGUpOworfTsKKworI2VuZGlmICAvLyBGWEJBUkNPREVfREFUQU1BVFJJWF9CQ19BU0NJSUVOQ09ERVJfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Jhc2UyNTZFbmNvZGVyLmNwcCBiL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Jhc2UyNTZFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2RkNjljCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQmFzZTI1NkVuY29kZXIuY3BwCkBAIC0wLDAgKzEsODYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKKy8qCisgKiBDb3B5cmlnaHQgMjAwNi0yMDA3IEplcmVtaWFzIE1hZXJraS4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Jhc2UyNTZFbmNvZGVyLmgiCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2RlckNvbnRleHQuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19IaWdoTGV2ZWxFbmNvZGVyLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sSW5mby5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS91dGlscy5oIgorCitDQkNfQmFzZTI1NkVuY29kZXI6OkNCQ19CYXNlMjU2RW5jb2RlcigpIHt9CitDQkNfQmFzZTI1NkVuY29kZXI6On5DQkNfQmFzZTI1NkVuY29kZXIoKSB7fQoraW50MzJfdCBDQkNfQmFzZTI1NkVuY29kZXI6OmdldEVuY29kaW5nTW9kZSgpIHsKKyAgcmV0dXJuIEJBU0UyNTZfRU5DT0RBVElPTjsKK30KK3ZvaWQgQ0JDX0Jhc2UyNTZFbmNvZGVyOjpFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LCBpbnQzMl90JiBlKSB7CisgIFdpZGVTdHJpbmcgYnVmZmVyOworICBidWZmZXIgKz0gTCdcMCc7CisgIHdoaWxlIChjb250ZXh0Lmhhc01vcmVDaGFyYWN0ZXJzKCkpIHsKKyAgICB3Y2hhcl90IGMgPSBjb250ZXh0LmdldEN1cnJlbnRDaGFyKCk7CisgICAgYnVmZmVyICs9IGM7CisgICAgY29udGV4dC5tX3BvcysrOworICAgIGludDMyX3QgbmV3TW9kZSA9IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpsb29rQWhlYWRUZXN0KAorICAgICAgICBjb250ZXh0Lm1fbXNnLCBjb250ZXh0Lm1fcG9zLCBnZXRFbmNvZGluZ01vZGUoKSk7CisgICAgaWYgKG5ld01vZGUgIT0gZ2V0RW5jb2RpbmdNb2RlKCkpIHsKKyAgICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShuZXdNb2RlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpbnQzMl90IGRhdGFDb3VudCA9IGJ1ZmZlci5HZXRMZW5ndGgoKSAtIDE7CisgIGNoYXIgYnVmWzEyOF07CisgIEZYU1lTX2l0b2EoZGF0YUNvdW50LCBidWYsIDEwKTsKKyAgYnVmZmVyLlNldEF0KDAsIHN0YXRpY19jYXN0PHdjaGFyX3Q+KCpidWYpIC0gJzAnKTsKKyAgaW50MzJfdCBsZW5ndGhGaWVsZFNpemUgPSAxOworICBpbnQzMl90IGN1cnJlbnRTaXplID0KKyAgICAgIGNvbnRleHQuZ2V0Q29kZXdvcmRDb3VudCgpICsgZGF0YUNvdW50ICsgbGVuZ3RoRmllbGRTaXplOworICBjb250ZXh0LnVwZGF0ZVN5bWJvbEluZm8oY3VycmVudFNpemUsIGUpOworICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7CisgICAgcmV0dXJuOworICB9CisgIGJvb2wgbXVzdFBhZCA9IChjb250ZXh0Lm1fc3ltYm9sSW5mby0+ZGF0YUNhcGFjaXR5KCkgLSBjdXJyZW50U2l6ZSkgPiAwOworICBpZiAoY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpIHx8IG11c3RQYWQpIHsKKyAgICBpZiAoZGF0YUNvdW50IDw9IDI0OSkgeworICAgICAgYnVmZmVyLlNldEF0KDAsIHN0YXRpY19jYXN0PHdjaGFyX3Q+KGRhdGFDb3VudCkpOworICAgIH0gZWxzZSBpZiAoZGF0YUNvdW50ID4gMjQ5ICYmIGRhdGFDb3VudCA8PSAxNTU1KSB7CisgICAgICBidWZmZXIuU2V0QXQoMCwgc3RhdGljX2Nhc3Q8d2NoYXJfdD4oKGRhdGFDb3VudCAvIDI1MCkgKyAyNDkpKTsKKyAgICAgIGJ1ZmZlci5JbnNlcnQoMSwgc3RhdGljX2Nhc3Q8d2NoYXJfdD4oZGF0YUNvdW50ICUgMjUwKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxTdGF0ZU1lc3NhZ2VMZW5ndGhJbnZhbGlkOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBmb3IgKGNvbnN0IGF1dG8mIGMgOiBidWZmZXIpIHsKKyAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQocmFuZG9taXplMjU1U3RhdGUoYywgY29udGV4dC5nZXRDb2Rld29yZENvdW50KCkgKyAxKSk7CisgIH0KK30KK3djaGFyX3QgQ0JDX0Jhc2UyNTZFbmNvZGVyOjpyYW5kb21pemUyNTVTdGF0ZSh3Y2hhcl90IGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZXdvcmRQb3NpdGlvbikgeworICBpbnQzMl90IHBzZXVkb1JhbmRvbSA9ICgoMTQ5ICogY29kZXdvcmRQb3NpdGlvbikgJSAyNTUpICsgMTsKKyAgaW50MzJfdCB0ZW1wVmFyaWFibGUgPSBjaCArIHBzZXVkb1JhbmRvbTsKKyAgaWYgKHRlbXBWYXJpYWJsZSA8PSAyNTUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8d2NoYXJfdD4odGVtcFZhcmlhYmxlKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8d2NoYXJfdD4odGVtcFZhcmlhYmxlIC0gMjU2KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQmFzZTI1NkVuY29kZXIuaCBiL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Jhc2UyNTZFbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVhYmY1OQotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Jhc2UyNTZFbmNvZGVyLmgKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX0JBU0UyNTZFTkNPREVSX0hfCisjZGVmaW5lIEZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX0JBU0UyNTZFTkNPREVSX0hfCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmgiCisKK2NsYXNzIENCQ19CYXNlMjU2RW5jb2RlciA6IHB1YmxpYyBDQkNfRW5jb2RlciB7CisgcHVibGljOgorICBDQkNfQmFzZTI1NkVuY29kZXIoKTsKKyAgfkNCQ19CYXNlMjU2RW5jb2RlcigpIG92ZXJyaWRlOworCisgIC8vIENCQ19FbmNvZGVyCisgIGludDMyX3QgZ2V0RW5jb2RpbmdNb2RlKCkgb3ZlcnJpZGU7CisgIHZvaWQgRW5jb2RlKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwgaW50MzJfdCYgZSkgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBzdGF0aWMgd2NoYXJfdCByYW5kb21pemUyNTVTdGF0ZSh3Y2hhcl90IGNoLCBpbnQzMl90IGNvZGV3b3JkUG9zaXRpb24pOworfTsKKworI2VuZGlmICAvLyBGWEJBUkNPREVfREFUQU1BVFJJWF9CQ19CQVNFMjU2RU5DT0RFUl9IXwpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQzQwRW5jb2Rlci5jcHAgYi9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19DNDBFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjhiMTFjCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQzQwRW5jb2Rlci5jcHAKQEAgLTAsMCArMSwyMTEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKKy8qCisgKiBDb3B5cmlnaHQgMjAwNi0yMDA3IEplcmVtaWFzIE1hZXJraS4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0M0MEVuY29kZXIuaCIKKworI2luY2x1ZGUgImZ4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2Rlci5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXJDb250ZXh0LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfSGlnaExldmVsRW5jb2Rlci5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvdXRpbHMuaCIKKworbmFtZXNwYWNlIHsKKworV2lkZVN0cmluZyBFbmNvZGVUb0M0MENvZGV3b3Jkcyhjb25zdCBXaWRlU3RyaW5nJiBzYiwgaW50MzJfdCBzdGFydFBvcykgeworICB3Y2hhcl90IGMxID0gc2Jbc3RhcnRQb3NdOworICB3Y2hhcl90IGMyID0gc2Jbc3RhcnRQb3MgKyAxXTsKKyAgd2NoYXJfdCBjMyA9IHNiW3N0YXJ0UG9zICsgMl07CisgIGludDMyX3QgdiA9ICgxNjAwICogYzEpICsgKDQwICogYzIpICsgYzMgKyAxOworICB3Y2hhcl90IGN3WzJdOworICBjd1swXSA9IHN0YXRpY19jYXN0PHdjaGFyX3Q+KHYgLyAyNTYpOworICBjd1sxXSA9IHN0YXRpY19jYXN0PHdjaGFyX3Q+KHYgJSAyNTYpOworICByZXR1cm4gV2lkZVN0cmluZyhjdywgRlhfQXJyYXlTaXplKGN3KSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitDQkNfQzQwRW5jb2Rlcjo6Q0JDX0M0MEVuY29kZXIoKSB7fQorQ0JDX0M0MEVuY29kZXI6On5DQkNfQzQwRW5jb2RlcigpIHt9CitpbnQzMl90IENCQ19DNDBFbmNvZGVyOjpnZXRFbmNvZGluZ01vZGUoKSB7CisgIHJldHVybiBDNDBfRU5DT0RBVElPTjsKK30KK3ZvaWQgQ0JDX0M0MEVuY29kZXI6OkVuY29kZShDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsIGludDMyX3QmIGUpIHsKKyAgV2lkZVN0cmluZyBidWZmZXI7CisgIHdoaWxlIChjb250ZXh0Lmhhc01vcmVDaGFyYWN0ZXJzKCkpIHsKKyAgICB3Y2hhcl90IGMgPSBjb250ZXh0LmdldEN1cnJlbnRDaGFyKCk7CisgICAgY29udGV4dC5tX3BvcysrOworICAgIGludDMyX3QgbGFzdENoYXJTaXplID0gZW5jb2RlQ2hhcihjLCBidWZmZXIsIGUpOworICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50MzJfdCB1bndyaXR0ZW4gPSAoYnVmZmVyLkdldExlbmd0aCgpIC8gMykgKiAyOworICAgIGludDMyX3QgY3VyQ29kZXdvcmRDb3VudCA9IGNvbnRleHQuZ2V0Q29kZXdvcmRDb3VudCgpICsgdW53cml0dGVuOworICAgIGNvbnRleHQudXBkYXRlU3ltYm9sSW5mbyhjdXJDb2Rld29yZENvdW50LCBlKTsKKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGludDMyX3QgYXZhaWxhYmxlID0gY29udGV4dC5tX3N5bWJvbEluZm8tPmRhdGFDYXBhY2l0eSgpIC0gY3VyQ29kZXdvcmRDb3VudDsKKyAgICBpZiAoIWNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSkgeworICAgICAgaWYgKChidWZmZXIuR2V0TGVuZ3RoKCkgJSAzKSA9PSAyKSB7CisgICAgICAgIGlmIChhdmFpbGFibGUgPCAyIHx8IGF2YWlsYWJsZSA+IDIpIHsKKyAgICAgICAgICBsYXN0Q2hhclNpemUgPSBCYWNrdHJhY2tPbmVDaGFyYWN0ZXIoJmNvbnRleHQsICZidWZmZXIsIGxhc3RDaGFyU2l6ZSk7CisgICAgICAgICAgaWYgKGxhc3RDaGFyU2l6ZSA8IDApIHsKKyAgICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkdlbmVyaWM7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICB3aGlsZSAoKGJ1ZmZlci5HZXRMZW5ndGgoKSAlIDMpID09IDEgJiYKKyAgICAgICAgICAgICAoKGxhc3RDaGFyU2l6ZSA8PSAzICYmIGF2YWlsYWJsZSAhPSAxKSB8fCBsYXN0Q2hhclNpemUgPiAzKSkgeworICAgICAgICBsYXN0Q2hhclNpemUgPSBCYWNrdHJhY2tPbmVDaGFyYWN0ZXIoJmNvbnRleHQsICZidWZmZXIsIGxhc3RDaGFyU2l6ZSk7CisgICAgICAgIGlmIChsYXN0Q2hhclNpemUgPCAwKSB7CisgICAgICAgICAgZSA9IEJDRXhjZXB0aW9uR2VuZXJpYzsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpbnQzMl90IGNvdW50ID0gYnVmZmVyLkdldExlbmd0aCgpOworICAgIGlmICgoY291bnQgJSAzKSA9PSAwKSB7CisgICAgICBpbnQzMl90IG5ld01vZGUgPSBDQkNfSGlnaExldmVsRW5jb2Rlcjo6bG9va0FoZWFkVGVzdCgKKyAgICAgICAgICBjb250ZXh0Lm1fbXNnLCBjb250ZXh0Lm1fcG9zLCBnZXRFbmNvZGluZ01vZGUoKSk7CisgICAgICBpZiAobmV3TW9kZSAhPSBnZXRFbmNvZGluZ01vZGUoKSkgeworICAgICAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UobmV3TW9kZSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICBoYW5kbGVFT0QoY29udGV4dCwgYnVmZmVyLCBlKTsKK30KK3ZvaWQgQ0JDX0M0MEVuY29kZXI6OndyaXRlTmV4dFRyaXBsZXQoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiBidWZmZXIpIHsKKyAgY29udGV4dC53cml0ZUNvZGV3b3JkcyhFbmNvZGVUb0M0MENvZGV3b3JkcyhidWZmZXIsIDApKTsKKyAgYnVmZmVyLkRlbGV0ZSgwLCAzKTsKK30KK3ZvaWQgQ0JDX0M0MEVuY29kZXI6OmhhbmRsZUVPRChDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKKyAgaW50MzJfdCB1bndyaXR0ZW4gPSAoYnVmZmVyLkdldExlbmd0aCgpIC8gMykgKiAyOworICBpbnQzMl90IHJlc3QgPSBidWZmZXIuR2V0TGVuZ3RoKCkgJSAzOworICBpbnQzMl90IGN1ckNvZGV3b3JkQ291bnQgPSBjb250ZXh0LmdldENvZGV3b3JkQ291bnQoKSArIHVud3JpdHRlbjsKKyAgY29udGV4dC51cGRhdGVTeW1ib2xJbmZvKGN1ckNvZGV3b3JkQ291bnQsIGUpOworICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7CisgICAgcmV0dXJuOworICB9CisgIGludDMyX3QgYXZhaWxhYmxlID0gY29udGV4dC5tX3N5bWJvbEluZm8tPmRhdGFDYXBhY2l0eSgpIC0gY3VyQ29kZXdvcmRDb3VudDsKKyAgaWYgKHJlc3QgPT0gMikgeworICAgIGJ1ZmZlciArPSAod2NoYXJfdCknXDAnOworICAgIHdoaWxlIChidWZmZXIuR2V0TGVuZ3RoKCkgPj0gMykgeworICAgICAgd3JpdGVOZXh0VHJpcGxldChjb250ZXh0LCBidWZmZXIpOworICAgIH0KKyAgICBpZiAoY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpKSB7CisgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OkM0MF9VTkxBVENIKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoYXZhaWxhYmxlID09IDEgJiYgcmVzdCA9PSAxKSB7CisgICAgd2hpbGUgKGJ1ZmZlci5HZXRMZW5ndGgoKSA+PSAzKSB7CisgICAgICB3cml0ZU5leHRUcmlwbGV0KGNvbnRleHQsIGJ1ZmZlcik7CisgICAgfQorICAgIGlmIChjb250ZXh0Lmhhc01vcmVDaGFyYWN0ZXJzKCkpIHsKKyAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6QzQwX1VOTEFUQ0gpOworICAgIH0KKyAgICBjb250ZXh0Lm1fcG9zLS07CisgIH0gZWxzZSBpZiAocmVzdCA9PSAwKSB7CisgICAgd2hpbGUgKGJ1ZmZlci5HZXRMZW5ndGgoKSA+PSAzKSB7CisgICAgICB3cml0ZU5leHRUcmlwbGV0KGNvbnRleHQsIGJ1ZmZlcik7CisgICAgfQorICAgIGlmIChhdmFpbGFibGUgPiAwIHx8IGNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSkgeworICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpDNDBfVU5MQVRDSCk7CisgICAgfQorICB9IGVsc2UgeworICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxTdGF0ZVVuZXhwZWN0ZWRDYXNlOworICAgIHJldHVybjsKKyAgfQorICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoQVNDSUlfRU5DT0RBVElPTik7Cit9CitpbnQzMl90IENCQ19DNDBFbmNvZGVyOjplbmNvZGVDaGFyKHdjaGFyX3QgYywgV2lkZVN0cmluZyYgc2IsIGludDMyX3QmIGUpIHsKKyAgaWYgKGMgPT0gJyAnKSB7CisgICAgc2IgKz0gKHdjaGFyX3QpJ1wzJzsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIGlmICgoYyA+PSAnMCcpICYmIChjIDw9ICc5JykpIHsKKyAgICBzYiArPSAod2NoYXJfdCkoYyAtIDQ4ICsgNCk7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSBpZiAoKGMgPj0gJ0EnKSAmJiAoYyA8PSAnWicpKSB7CisgICAgc2IgKz0gKHdjaGFyX3QpKGMgLSA2NSArIDE0KTsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIGlmIChjIDw9IDB4MWYpIHsKKyAgICBzYiArPSAod2NoYXJfdCknXDAnOworICAgIHNiICs9IGM7CisgICAgcmV0dXJuIDI7CisgIH0gZWxzZSBpZiAoKGMgPj0gJyEnKSAmJiAoYyA8PSAnLycpKSB7CisgICAgc2IgKz0gKHdjaGFyX3QpJ1wxJzsKKyAgICBzYiArPSAod2NoYXJfdCkoYyAtIDMzKTsKKyAgICByZXR1cm4gMjsKKyAgfSBlbHNlIGlmICgoYyA+PSAnOicpICYmIChjIDw9ICdAJykpIHsKKyAgICBzYiArPSAod2NoYXJfdCknXDEnOworICAgIHNiICs9ICh3Y2hhcl90KShjIC0gNTggKyAxNSk7CisgICAgcmV0dXJuIDI7CisgIH0gZWxzZSBpZiAoKGMgPj0gJ1snKSAmJiAoYyA8PSAnXycpKSB7CisgICAgc2IgKz0gKHdjaGFyX3QpJ1wxJzsKKyAgICBzYiArPSAod2NoYXJfdCkoYyAtIDkxICsgMjIpOworICAgIHJldHVybiAyOworICB9IGVsc2UgaWYgKChjID49IDYwKSAmJiAoYyA8PSAweDdmKSkgeworICAgIHNiICs9ICh3Y2hhcl90KSdcMic7CisgICAgc2IgKz0gKHdjaGFyX3QpKGMgLSA5Nik7CisgICAgcmV0dXJuIDI7CisgIH0gZWxzZSBpZiAoYyA+PSA4MCkgeworICAgIHNiICs9ICh3Y2hhcl90KSdcMSc7CisgICAgc2IgKz0gKHdjaGFyX3QpMHgwMDFlOworICAgIGludDMyX3QgbGVuID0gMjsKKyAgICBsZW4gKz0gZW5jb2RlQ2hhcigoYyAtIDEyOCksIHNiLCBlKTsKKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgICAgcmV0dXJuIDA7CisgICAgcmV0dXJuIGxlbjsKKyAgfSBlbHNlIHsKKyAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworaW50MzJfdCBDQkNfQzQwRW5jb2Rlcjo6QmFja3RyYWNrT25lQ2hhcmFjdGVyKENCQ19FbmNvZGVyQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsYXN0Q2hhclNpemUpIHsKKyAgaWYgKGNvbnRleHQtPm1fcG9zIDwgMSkKKyAgICByZXR1cm4gLTE7CisKKyAgaW50MzJfdCBjb3VudCA9IGJ1ZmZlci0+R2V0TGVuZ3RoKCk7CisgIGlmIChjb3VudCA8IGxhc3RDaGFyU2l6ZSkKKyAgICByZXR1cm4gLTE7CisKKyAgYnVmZmVyLT5EZWxldGUoY291bnQgLSBsYXN0Q2hhclNpemUsIGxhc3RDaGFyU2l6ZSk7CisgIGNvbnRleHQtPm1fcG9zLS07CisgIHdjaGFyX3QgYyA9IGNvbnRleHQtPmdldEN1cnJlbnRDaGFyKCk7CisgIGludDMyX3QgZSA9IEJDRXhjZXB0aW9uTk87CisgIFdpZGVTdHJpbmcgcmVtb3ZlZDsKKyAgaW50MzJfdCBsZW4gPSBlbmNvZGVDaGFyKGMsIHJlbW92ZWQsIGUpOworICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgIHJldHVybiAtMTsKKworICBBU1NFUlQobGVuID4gMCk7CisgIGNvbnRleHQtPnJlc2V0U3ltYm9sSW5mbygpOworICByZXR1cm4gbGVuOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQzQwRW5jb2Rlci5oIGIvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQzQwRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZGFkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19DNDBFbmNvZGVyLmgKQEAgLTAsMCArMSwzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX0M0MEVOQ09ERVJfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfQzQwRU5DT0RFUl9IXworCisjaW5jbHVkZSAiY29yZS9meGNydC93aWRlc3RyaW5nLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2Rlci5oIgorCitjbGFzcyBDQkNfQzQwRW5jb2RlciA6IHB1YmxpYyBDQkNfRW5jb2RlciB7CisgcHVibGljOgorICBDQkNfQzQwRW5jb2RlcigpOworICB+Q0JDX0M0MEVuY29kZXIoKSBvdmVycmlkZTsKKworICAvLyBDQkNfRW5jb2RlcgorICBpbnQzMl90IGdldEVuY29kaW5nTW9kZSgpIG92ZXJyaWRlOworICB2b2lkIEVuY29kZShDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsIGludDMyX3QmIGUpIG92ZXJyaWRlOworCisgIHN0YXRpYyB2b2lkIHdyaXRlTmV4dFRyaXBsZXQoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LCBXaWRlU3RyaW5nJiBidWZmZXIpOworCisgIHZpcnR1YWwgdm9pZCBoYW5kbGVFT0QoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKKyAgdmlydHVhbCBpbnQzMl90IGVuY29kZUNoYXIod2NoYXJfdCBjLCBXaWRlU3RyaW5nJiBzYiwgaW50MzJfdCYgZSk7CisKKyBwcml2YXRlOgorICAvLyBNb3ZlcyBiYWNrIGJ5IDEgcG9zaXRpb24gaW4gfGNvbnRleHR8IGFuZCBhZGp1c3RzIHxidWZmZXJ8IGFjY29yZGluZ2x5CisgIC8vIHVzaW5nIHxsYXN0Q2hhclNpemV8LiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGluCisgIC8vIHxjb250ZXh0fCBhZnRlciBhZGp1c3RpbmcgdGhlIHBvc2l0aW9uLiBJZiB0aGUgY2hhcmFjdGVyIGNhbm5vdCBiZSBlbmNvZGVkLAorICAvLyByZXR1cm4gLTEuCisgIGludDMyX3QgQmFja3RyYWNrT25lQ2hhcmFjdGVyKENCQ19FbmNvZGVyQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxhc3RDaGFyU2l6ZSk7Cit9OworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX0M0MEVOQ09ERVJfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0LmNwcCBiL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTE4ZDAzCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQuY3BwCkBAIC0wLDAgKzEsMzkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKKy8qCisgKiBDb3B5cmlnaHQgMjAwNiBKZXJlbWlhcyBNYWVya2kKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2Rlci5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uaCIKKworQ0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0OjpDQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQoKQorICAgIDogQ0JDX1N5bWJvbEluZm8oMTU1OCwgNjIwLCAyMiwgMjIsIDM2LCAtMSwgNjIpIHt9CisKK0NCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NDo6fkNCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NCgpIHt9CisKK2ludDMyX3QgQ0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0OjpnZXRJbnRlcmxlYXZlZEJsb2NrQ291bnQoKSBjb25zdCB7CisgIHJldHVybiAxMDsKK30KKworaW50MzJfdCBDQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDRnZXREYXRhTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jaygKKyAgICBpbnQzMl90IGluZGV4KSB7CisgIHJldHVybiBpbmRleCA8PSA4ID8gMTU2IDogMTU1OworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQuaCBiL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGExYzUyOQotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0LmgKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX0RBVEFNQVRSSVhTWU1CT0xJTkZPMTQ0X0hfCisjZGVmaW5lIEZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX0RBVEFNQVRSSVhTWU1CT0xJTkZPMTQ0X0hfCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmgiCisKK2NsYXNzIENCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NCA6IHB1YmxpYyBDQkNfU3ltYm9sSW5mbyB7CisgcHVibGljOgorICBDQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQoKTsKKyAgfkNCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NCgpIG92ZXJyaWRlOworCisgIGludDMyX3QgZ2V0SW50ZXJsZWF2ZWRCbG9ja0NvdW50KCkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX0RBVEFNQVRSSVhTWU1CT0xJTkZPMTQ0X0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4V3JpdGVyLmNwcCBiL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhXcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZjlhZDMKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4V3JpdGVyLmNwcApAQCAtMCwwICsxLDE0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgorLyoKKyAqIENvcHlyaWdodCAyMDA4IFpYaW5nIGF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhXcml0ZXIuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImZ4YmFyY29kZS9CQ19Ud29EaW1Xcml0ZXIuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvQkNfV3JpdGVyLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVNYXRyaXguaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19BU0NJSUVuY29kZXIuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19CYXNlMjU2RW5jb2Rlci5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0M0MEVuY29kZXIuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NC5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RlZmF1bHRQbGFjZW1lbnQuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FZGlmYWN0RW5jb2Rlci5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyQ29udGV4dC5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Vycm9yQ29ycmVjdGlvbi5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0hpZ2hMZXZlbEVuY29kZXIuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfVGV4dEVuY29kZXIuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19YMTJFbmNvZGVyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitzdGQ6OnVuaXF1ZV9wdHI8Q0JDX0NvbW1vbkJ5dGVNYXRyaXg+IGVuY29kZUxvd0xldmVsKAorICAgIENCQ19EZWZhdWx0UGxhY2VtZW50KiBwbGFjZW1lbnQsCisgICAgQ0JDX1N5bWJvbEluZm8qIHN5bWJvbEluZm8pIHsKKyAgaW50MzJfdCBzeW1ib2xXaWR0aCA9IHN5bWJvbEluZm8tPmdldFN5bWJvbERhdGFXaWR0aCgpOworICBBU1NFUlQoc3ltYm9sV2lkdGgpOworICBpbnQzMl90IHN5bWJvbEhlaWdodCA9IHN5bWJvbEluZm8tPmdldFN5bWJvbERhdGFIZWlnaHQoKTsKKyAgQVNTRVJUKHN5bWJvbEhlaWdodCk7CisgIGludDMyX3Qgd2lkdGggPSBzeW1ib2xJbmZvLT5nZXRTeW1ib2xXaWR0aCgpOworICBBU1NFUlQod2lkdGgpOworICBpbnQzMl90IGhlaWdodCA9IHN5bWJvbEluZm8tPmdldFN5bWJvbEhlaWdodCgpOworICBBU1NFUlQoaGVpZ2h0KTsKKworICBhdXRvIG1hdHJpeCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDQkNfQ29tbW9uQnl0ZU1hdHJpeD4od2lkdGgsIGhlaWdodCk7CisgIG1hdHJpeC0+SW5pdCgpOworICBpbnQzMl90IG1hdHJpeFkgPSAwOworICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBzeW1ib2xIZWlnaHQ7IHkrKykgeworICAgIGludDMyX3QgbWF0cml4WDsKKyAgICBpZiAoKHkgJSBzeW1ib2xJbmZvLT5tYXRyaXhIZWlnaHQoKSkgPT0gMCkgeworICAgICAgbWF0cml4WCA9IDA7CisgICAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgIG1hdHJpeC0+U2V0KG1hdHJpeFgsIG1hdHJpeFksIHggJSAyID09IDApOworICAgICAgICBtYXRyaXhYKys7CisgICAgICB9CisgICAgICBtYXRyaXhZKys7CisgICAgfQorICAgIG1hdHJpeFggPSAwOworICAgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IHN5bWJvbFdpZHRoOyB4KyspIHsKKyAgICAgIGlmICh4ICUgc3ltYm9sSW5mby0+bWF0cml4V2lkdGgoKSA9PSAwKSB7CisgICAgICAgIG1hdHJpeC0+U2V0KG1hdHJpeFgsIG1hdHJpeFksIHRydWUpOworICAgICAgICBtYXRyaXhYKys7CisgICAgICB9CisgICAgICBtYXRyaXgtPlNldChtYXRyaXhYLCBtYXRyaXhZLCBwbGFjZW1lbnQtPmdldEJpdCh4LCB5KSk7CisgICAgICBtYXRyaXhYKys7CisgICAgICBpZiAoeCAlIHN5bWJvbEluZm8tPm1hdHJpeFdpZHRoKCkgPT0gc3ltYm9sSW5mby0+bWF0cml4V2lkdGgoKSAtIDEpIHsKKyAgICAgICAgbWF0cml4LT5TZXQobWF0cml4WCwgbWF0cml4WSwgeSAlIDIgPT0gMCk7CisgICAgICAgIG1hdHJpeFgrKzsKKyAgICAgIH0KKyAgICB9CisgICAgbWF0cml4WSsrOworICAgIGlmICh5ICUgc3ltYm9sSW5mby0+bWF0cml4SGVpZ2h0KCkgPT0gc3ltYm9sSW5mby0+bWF0cml4SGVpZ2h0KCkgLSAxKSB7CisgICAgICBtYXRyaXhYID0gMDsKKyAgICAgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgbWF0cml4LT5TZXQobWF0cml4WCwgbWF0cml4WSwgdHJ1ZSk7CisgICAgICAgIG1hdHJpeFgrKzsKKyAgICAgIH0KKyAgICAgIG1hdHJpeFkrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG1hdHJpeDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0NCQ19EYXRhTWF0cml4V3JpdGVyOjpDQkNfRGF0YU1hdHJpeFdyaXRlcigpIHt9CisKK0NCQ19EYXRhTWF0cml4V3JpdGVyOjp+Q0JDX0RhdGFNYXRyaXhXcml0ZXIoKSB7fQorCitib29sIENCQ19EYXRhTWF0cml4V3JpdGVyOjpTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGxldmVsKSB7CisgIG1faUNvcnJlY3RMZXZlbCA9IGxldmVsOworICByZXR1cm4gdHJ1ZTsKK30KKwordWludDhfdCogQ0JDX0RhdGFNYXRyaXhXcml0ZXI6OkVuY29kZShjb25zdCBXaWRlU3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCkgeworICBpZiAob3V0V2lkdGggPCAwIHx8IG91dEhlaWdodCA8IDApCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgV2lkZVN0cmluZyBlY0xldmVsOworICBpbnQzMl90IGUgPSBCQ0V4Y2VwdGlvbk5POworICBXaWRlU3RyaW5nIGVuY29kZWQgPQorICAgICAgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmVuY29kZUhpZ2hMZXZlbChjb250ZW50cywgZWNMZXZlbCwgZmFsc2UsIGUpOworICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgIHJldHVybiBudWxscHRyOworICBDQkNfU3ltYm9sSW5mbyogc3ltYm9sSW5mbyA9CisgICAgICBDQkNfU3ltYm9sSW5mbzo6bG9va3VwKGVuY29kZWQuR2V0TGVuZ3RoKCksIGZhbHNlLCBlKTsKKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgV2lkZVN0cmluZyBjb2Rld29yZHMgPQorICAgICAgQ0JDX0Vycm9yQ29ycmVjdGlvbjo6ZW5jb2RlRUNDMjAwKGVuY29kZWQsIHN5bWJvbEluZm8sIGUpOworICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgIHJldHVybiBudWxscHRyOworCisgIGludDMyX3Qgd2lkdGggPSBzeW1ib2xJbmZvLT5nZXRTeW1ib2xEYXRhV2lkdGgoKTsKKyAgQVNTRVJUKHdpZHRoKTsKKyAgaW50MzJfdCBoZWlnaHQgPSBzeW1ib2xJbmZvLT5nZXRTeW1ib2xEYXRhSGVpZ2h0KCk7CisgIEFTU0VSVChoZWlnaHQpOworCisgIGF1dG8gcGxhY2VtZW50ID0KKyAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDQkNfRGVmYXVsdFBsYWNlbWVudD4oY29kZXdvcmRzLCB3aWR0aCwgaGVpZ2h0KTsKKyAgcGxhY2VtZW50LT5wbGFjZSgpOworICBhdXRvIGJ5dGVtYXRyaXggPSBlbmNvZGVMb3dMZXZlbChwbGFjZW1lbnQuZ2V0KCksIHN5bWJvbEluZm8pOworICBpZiAoIWJ5dGVtYXRyaXgpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgb3V0V2lkdGggPSBieXRlbWF0cml4LT5HZXRXaWR0aCgpOworICBvdXRIZWlnaHQgPSBieXRlbWF0cml4LT5HZXRIZWlnaHQoKTsKKyAgdWludDhfdCogcmVzdWx0ID0gRlhfQWxsb2MyRCh1aW50OF90LCBvdXRXaWR0aCwgb3V0SGVpZ2h0KTsKKyAgbWVtY3B5KHJlc3VsdCwgYnl0ZW1hdHJpeC0+R2V0QXJyYXkoKSwgb3V0V2lkdGggKiBvdXRIZWlnaHQpOworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFdyaXRlci5oIGIvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMmM1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4V3JpdGVyLmgKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX0RBVEFNQVRSSVhXUklURVJfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfREFUQU1BVFJJWFdSSVRFUl9IXworCisjaW5jbHVkZSAiZnhiYXJjb2RlL0JDX1R3b0RpbVdyaXRlci5oIgorCitjbGFzcyBDQkNfQ29tbW9uQnl0ZU1hdHJpeDsKK2NsYXNzIENCQ19EZWZhdWx0UGxhY2VtZW50OworY2xhc3MgQ0JDX1N5bWJvbEluZm87CisKK2NsYXNzIENCQ19EYXRhTWF0cml4V3JpdGVyIDogcHVibGljIENCQ19Ud29EaW1Xcml0ZXIgeworIHB1YmxpYzoKKyAgQ0JDX0RhdGFNYXRyaXhXcml0ZXIoKTsKKyAgfkNCQ19EYXRhTWF0cml4V3JpdGVyKCkgb3ZlcnJpZGU7CisKKyAgdWludDhfdCogRW5jb2RlKGNvbnN0IFdpZGVTdHJpbmcmIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQpOworCisgIC8vIENCQ19Ud29EaW1Xcml0ZXIKKyAgYm9vbCBTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGxldmVsKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIGludDMyX3QgbV9pQ29ycmVjdExldmVsOworfTsKKworI2VuZGlmICAvLyBGWEJBUkNPREVfREFUQU1BVFJJWF9CQ19EQVRBTUFUUklYV1JJVEVSX0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EZWZhdWx0UGxhY2VtZW50LmNwcCBiL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RlZmF1bHRQbGFjZW1lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMWIzNTgKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EZWZhdWx0UGxhY2VtZW50LmNwcApAQCAtMCwwICsxLDE2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgorLyoKKyAqIENvcHlyaWdodCAyMDA2IEplcmVtaWFzIE1hZXJraS4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RlZmF1bHRQbGFjZW1lbnQuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmgiCisKK0NCQ19EZWZhdWx0UGxhY2VtZW50OjpDQkNfRGVmYXVsdFBsYWNlbWVudChXaWRlU3RyaW5nIGNvZGV3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bWNvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1yb3dzKSB7CisgIG1fY29kZXdvcmRzID0gY29kZXdvcmRzOworICBtX251bWNvbHMgPSBudW1jb2xzOworICBtX251bXJvd3MgPSBudW1yb3dzOworICBtX2JpdHMucmVzaXplKG51bWNvbHMgKiBudW1yb3dzKTsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtY29scyAqIG51bXJvd3M7IGkrKykgeworICAgIG1fYml0c1tpXSA9ICh1aW50OF90KTI7CisgIH0KK30KK0NCQ19EZWZhdWx0UGxhY2VtZW50Ojp+Q0JDX0RlZmF1bHRQbGFjZW1lbnQoKSB7fQorCitpbnQzMl90IENCQ19EZWZhdWx0UGxhY2VtZW50OjpnZXROdW1yb3dzKCkgeworICByZXR1cm4gbV9udW1yb3dzOworfQoraW50MzJfdCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6Z2V0TnVtY29scygpIHsKKyAgcmV0dXJuIG1fbnVtY29sczsKK30KK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBDQkNfRGVmYXVsdFBsYWNlbWVudDo6Z2V0Qml0cygpIHsKKyAgcmV0dXJuIG1fYml0czsKK30KK2Jvb2wgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OmdldEJpdChpbnQzMl90IGNvbCwgaW50MzJfdCByb3cpIHsKKyAgcmV0dXJuIG1fYml0c1tyb3cgKiBtX251bWNvbHMgKyBjb2xdID09IDE7Cit9Cit2b2lkIENCQ19EZWZhdWx0UGxhY2VtZW50OjpzZXRCaXQoaW50MzJfdCBjb2wsIGludDMyX3Qgcm93LCBib29sIGJpdCkgeworICBtX2JpdHNbcm93ICogbV9udW1jb2xzICsgY29sXSA9IGJpdCA/ICh1aW50OF90KTEgOiAodWludDhfdCkwOworfQorYm9vbCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6aGFzQml0KGludDMyX3QgY29sLCBpbnQzMl90IHJvdykgeworICByZXR1cm4gbV9iaXRzW3JvdyAqIG1fbnVtY29scyArIGNvbF0gIT0gMjsKK30KK3ZvaWQgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OnBsYWNlKCkgeworICBpbnQzMl90IHBvcyA9IDA7CisgIGludDMyX3Qgcm93ID0gNDsKKyAgaW50MzJfdCBjb2wgPSAwOworICBkbyB7CisgICAgaWYgKChyb3cgPT0gbV9udW1yb3dzKSAmJiAoY29sID09IDApKSB7CisgICAgICBjb3JuZXIxKHBvcysrKTsKKyAgICB9CisgICAgaWYgKChyb3cgPT0gbV9udW1yb3dzIC0gMikgJiYgKGNvbCA9PSAwKSAmJiAoKG1fbnVtY29scyAlIDQpICE9IDApKSB7CisgICAgICBjb3JuZXIyKHBvcysrKTsKKyAgICB9CisgICAgaWYgKChyb3cgPT0gbV9udW1yb3dzIC0gMikgJiYgKGNvbCA9PSAwKSAmJiAobV9udW1jb2xzICUgOCA9PSA0KSkgeworICAgICAgY29ybmVyMyhwb3MrKyk7CisgICAgfQorICAgIGlmICgocm93ID09IG1fbnVtcm93cyArIDQpICYmIChjb2wgPT0gMikgJiYgKChtX251bWNvbHMgJSA4KSA9PSAwKSkgeworICAgICAgY29ybmVyNChwb3MrKyk7CisgICAgfQorICAgIGRvIHsKKyAgICAgIGlmICgocm93IDwgbV9udW1yb3dzKSAmJiAoY29sID49IDApICYmICFoYXNCaXQoY29sLCByb3cpKSB7CisgICAgICAgIHV0YWgocm93LCBjb2wsIHBvcysrKTsKKyAgICAgIH0KKyAgICAgIHJvdyAtPSAyOworICAgICAgY29sICs9IDI7CisgICAgfSB3aGlsZSAocm93ID49IDAgJiYgKGNvbCA8IG1fbnVtY29scykpOworICAgIHJvdysrOworICAgIGNvbCArPSAzOworICAgIGRvIHsKKyAgICAgIGlmICgocm93ID49IDApICYmIChjb2wgPCBtX251bWNvbHMpICYmICFoYXNCaXQoY29sLCByb3cpKSB7CisgICAgICAgIHV0YWgocm93LCBjb2wsIHBvcysrKTsKKyAgICAgIH0KKyAgICAgIHJvdyArPSAyOworICAgICAgY29sIC09IDI7CisgICAgfSB3aGlsZSAoKHJvdyA8IG1fbnVtcm93cykgJiYgKGNvbCA+PSAwKSk7CisgICAgcm93ICs9IDM7CisgICAgY29sKys7CisgIH0gd2hpbGUgKChyb3cgPCBtX251bXJvd3MpIHx8IChjb2wgPCBtX251bWNvbHMpKTsKKyAgaWYgKCFoYXNCaXQobV9udW1jb2xzIC0gMSwgbV9udW1yb3dzIC0gMSkpIHsKKyAgICBzZXRCaXQobV9udW1jb2xzIC0gMSwgbV9udW1yb3dzIC0gMSwgdHJ1ZSk7CisgICAgc2V0Qml0KG1fbnVtY29scyAtIDIsIG1fbnVtcm93cyAtIDIsIHRydWUpOworICB9Cit9Cit2b2lkIENCQ19EZWZhdWx0UGxhY2VtZW50Ojptb2R1bGUoaW50MzJfdCByb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiaXQpIHsKKyAgaWYgKHJvdyA8IDApIHsKKyAgICByb3cgKz0gbV9udW1yb3dzOworICAgIGNvbCArPSA0IC0gKChtX251bXJvd3MgKyA0KSAlIDgpOworICB9CisgIGlmIChjb2wgPCAwKSB7CisgICAgY29sICs9IG1fbnVtY29sczsKKyAgICByb3cgKz0gNCAtICgobV9udW1jb2xzICsgNCkgJSA4KTsKKyAgfQorICBpbnQzMl90IHYgPSBtX2NvZGV3b3Jkc1twb3NdOworICB2ICY9IDEgPDwgKDggLSBiaXQpOworICBzZXRCaXQoY29sLCByb3csIHYgIT0gMCk7Cit9Cit2b2lkIENCQ19EZWZhdWx0UGxhY2VtZW50Ojp1dGFoKGludDMyX3Qgcm93LCBpbnQzMl90IGNvbCwgaW50MzJfdCBwb3MpIHsKKyAgbW9kdWxlKHJvdyAtIDIsIGNvbCAtIDIsIHBvcywgMSk7CisgIG1vZHVsZShyb3cgLSAyLCBjb2wgLSAxLCBwb3MsIDIpOworICBtb2R1bGUocm93IC0gMSwgY29sIC0gMiwgcG9zLCAzKTsKKyAgbW9kdWxlKHJvdyAtIDEsIGNvbCAtIDEsIHBvcywgNCk7CisgIG1vZHVsZShyb3cgLSAxLCBjb2wsIHBvcywgNSk7CisgIG1vZHVsZShyb3csIGNvbCAtIDIsIHBvcywgNik7CisgIG1vZHVsZShyb3csIGNvbCAtIDEsIHBvcywgNyk7CisgIG1vZHVsZShyb3csIGNvbCwgcG9zLCA4KTsKK30KK3ZvaWQgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OmNvcm5lcjEoaW50MzJfdCBwb3MpIHsKKyAgbW9kdWxlKG1fbnVtcm93cyAtIDEsIDAsIHBvcywgMSk7CisgIG1vZHVsZShtX251bXJvd3MgLSAxLCAxLCBwb3MsIDIpOworICBtb2R1bGUobV9udW1yb3dzIC0gMSwgMiwgcG9zLCAzKTsKKyAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDIsIHBvcywgNCk7CisgIG1vZHVsZSgwLCBtX251bWNvbHMgLSAxLCBwb3MsIDUpOworICBtb2R1bGUoMSwgbV9udW1jb2xzIC0gMSwgcG9zLCA2KTsKKyAgbW9kdWxlKDIsIG1fbnVtY29scyAtIDEsIHBvcywgNyk7CisgIG1vZHVsZSgzLCBtX251bWNvbHMgLSAxLCBwb3MsIDgpOworfQordm9pZCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6Y29ybmVyMihpbnQzMl90IHBvcykgeworICBtb2R1bGUobV9udW1yb3dzIC0gMywgMCwgcG9zLCAxKTsKKyAgbW9kdWxlKG1fbnVtcm93cyAtIDIsIDAsIHBvcywgMik7CisgIG1vZHVsZShtX251bXJvd3MgLSAxLCAwLCBwb3MsIDMpOworICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gNCwgcG9zLCA0KTsKKyAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDMsIHBvcywgNSk7CisgIG1vZHVsZSgwLCBtX251bWNvbHMgLSAyLCBwb3MsIDYpOworICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMSwgcG9zLCA3KTsKKyAgbW9kdWxlKDEsIG1fbnVtY29scyAtIDEsIHBvcywgOCk7Cit9Cit2b2lkIENCQ19EZWZhdWx0UGxhY2VtZW50Ojpjb3JuZXIzKGludDMyX3QgcG9zKSB7CisgIG1vZHVsZShtX251bXJvd3MgLSAzLCAwLCBwb3MsIDEpOworICBtb2R1bGUobV9udW1yb3dzIC0gMiwgMCwgcG9zLCAyKTsKKyAgbW9kdWxlKG1fbnVtcm93cyAtIDEsIDAsIHBvcywgMyk7CisgIG1vZHVsZSgwLCBtX251bWNvbHMgLSAyLCBwb3MsIDQpOworICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMSwgcG9zLCA1KTsKKyAgbW9kdWxlKDEsIG1fbnVtY29scyAtIDEsIHBvcywgNik7CisgIG1vZHVsZSgyLCBtX251bWNvbHMgLSAxLCBwb3MsIDcpOworICBtb2R1bGUoMywgbV9udW1jb2xzIC0gMSwgcG9zLCA4KTsKK30KK3ZvaWQgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OmNvcm5lcjQoaW50MzJfdCBwb3MpIHsKKyAgbW9kdWxlKG1fbnVtcm93cyAtIDEsIDAsIHBvcywgMSk7CisgIG1vZHVsZShtX251bXJvd3MgLSAxLCBtX251bWNvbHMgLSAxLCBwb3MsIDIpOworICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMywgcG9zLCAzKTsKKyAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDIsIHBvcywgNCk7CisgIG1vZHVsZSgwLCBtX251bWNvbHMgLSAxLCBwb3MsIDUpOworICBtb2R1bGUoMSwgbV9udW1jb2xzIC0gMywgcG9zLCA2KTsKKyAgbW9kdWxlKDEsIG1fbnVtY29scyAtIDIsIHBvcywgNyk7CisgIG1vZHVsZSgxLCBtX251bWNvbHMgLSAxLCBwb3MsIDgpOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGVmYXVsdFBsYWNlbWVudC5oIGIvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGVmYXVsdFBsYWNlbWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZWE4NTIKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EZWZhdWx0UGxhY2VtZW50LmgKQEAgLTAsMCArMSw0MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX0RFRkFVTFRQTEFDRU1FTlRfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfREVGQVVMVFBMQUNFTUVOVF9IXworCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKworY2xhc3MgQ0JDX0RlZmF1bHRQbGFjZW1lbnQgeworIHB1YmxpYzoKKyAgQ0JDX0RlZmF1bHRQbGFjZW1lbnQoV2lkZVN0cmluZyBjb2Rld29yZHMsIGludDMyX3QgbnVtY29scywgaW50MzJfdCBudW1yb3dzKTsKKyAgdmlydHVhbCB+Q0JDX0RlZmF1bHRQbGFjZW1lbnQoKTsKKworICBpbnQzMl90IGdldE51bXJvd3MoKTsKKyAgaW50MzJfdCBnZXROdW1jb2xzKCk7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBnZXRCaXRzKCk7CisgIGJvb2wgZ2V0Qml0KGludDMyX3QgY29sLCBpbnQzMl90IHJvdyk7CisgIHZvaWQgc2V0Qml0KGludDMyX3QgY29sLCBpbnQzMl90IHJvdywgYm9vbCBiaXQpOworICBib29sIGhhc0JpdChpbnQzMl90IGNvbCwgaW50MzJfdCByb3cpOworICB2b2lkIHBsYWNlKCk7CisKKyBwcml2YXRlOgorICBXaWRlU3RyaW5nIG1fY29kZXdvcmRzOworICBpbnQzMl90IG1fbnVtcm93czsKKyAgaW50MzJfdCBtX251bWNvbHM7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1fYml0czsKKyAgdm9pZCBtb2R1bGUoaW50MzJfdCByb3csIGludDMyX3QgY29sLCBpbnQzMl90IHBvcywgaW50MzJfdCBiaXQpOworICB2b2lkIHV0YWgoaW50MzJfdCByb3csIGludDMyX3QgY29sLCBpbnQzMl90IHBvcyk7CisgIHZvaWQgY29ybmVyMShpbnQzMl90IHBvcyk7CisgIHZvaWQgY29ybmVyMihpbnQzMl90IHBvcyk7CisgIHZvaWQgY29ybmVyMyhpbnQzMl90IHBvcyk7CisgIHZvaWQgY29ybmVyNChpbnQzMl90IHBvcyk7Cit9OworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX0RFRkFVTFRQTEFDRU1FTlRfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VkaWZhY3RFbmNvZGVyLmNwcCBiL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VkaWZhY3RFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTE4MGRjCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRWRpZmFjdEVuY29kZXIuY3BwCkBAIC0wLDAgKzEsMTU3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6CisvKgorICogQ29weXJpZ2h0IDIwMDYtMjAwNyBKZXJlbWlhcyBNYWVya2kuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FZGlmYWN0RW5jb2Rlci5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2RlckNvbnRleHQuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19IaWdoTGV2ZWxFbmNvZGVyLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sSW5mby5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS91dGlscy5oIgorCituYW1lc3BhY2UgeworCitXaWRlU3RyaW5nIEVuY29kZVRvRWRpZmFjdENvZGV3b3Jkcyhjb25zdCBXaWRlU3RyaW5nJiBzYiwgaW50MzJfdCBzdGFydFBvcykgeworICBpbnQzMl90IGxlbiA9IHNiLkdldExlbmd0aCgpIC0gc3RhcnRQb3M7CisgIGlmIChsZW4gPT0gMCkKKyAgICByZXR1cm4gV2lkZVN0cmluZygpOworCisgIHdjaGFyX3QgYzEgPSBzYltzdGFydFBvc107CisgIHdjaGFyX3QgYzIgPSBsZW4gPj0gMiA/IHNiW3N0YXJ0UG9zICsgMV0gOiAwOworICB3Y2hhcl90IGMzID0gbGVuID49IDMgPyBzYltzdGFydFBvcyArIDJdIDogMDsKKyAgd2NoYXJfdCBjNCA9IGxlbiA+PSA0ID8gc2Jbc3RhcnRQb3MgKyAzXSA6IDA7CisgIGludDMyX3QgdiA9IChjMSA8PCAxOCkgKyAoYzIgPDwgMTIpICsgKGMzIDw8IDYpICsgYzQ7CisgIGNvbnN0ZXhwciBpbnQzMl90IGtCdWZsZW4gPSAzOworICB3Y2hhcl90IGN3W2tCdWZsZW5dOworICBjd1swXSA9IHN0YXRpY19jYXN0PHdjaGFyX3Q+KCh2ID4+IDE2KSAmIDI1NSk7CisgIGN3WzFdID0gc3RhdGljX2Nhc3Q8d2NoYXJfdD4oKHYgPj4gOCkgJiAyNTUpOworICBjd1syXSA9IHN0YXRpY19jYXN0PHdjaGFyX3Q+KHYgJiAyNTUpOworICByZXR1cm4gV2lkZVN0cmluZyhjdywgc3RkOjptaW4obGVuLCBrQnVmbGVuKSk7Cit9CisKK2Jvb2wgSGFuZGxlRU9EKENCQ19FbmNvZGVyQ29udGV4dCogY29udGV4dCwgY29uc3QgV2lkZVN0cmluZyYgYnVmZmVyKSB7CisgIGludDMyX3QgY291bnQgPSBidWZmZXIuR2V0TGVuZ3RoKCk7CisgIGlmIChjb3VudCA9PSAwKQorICAgIHJldHVybiB0cnVlOworICBpZiAoY291bnQgPiA0KQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoY291bnQgPT0gMSkgeworICAgIGludDMyX3QgZSA9IEJDRXhjZXB0aW9uTk87CisgICAgY29udGV4dC0+dXBkYXRlU3ltYm9sSW5mbyhlKTsKKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaW50MzJfdCBhdmFpbGFibGUgPQorICAgICAgICBjb250ZXh0LT5tX3N5bWJvbEluZm8tPmRhdGFDYXBhY2l0eSgpIC0gY29udGV4dC0+Z2V0Q29kZXdvcmRDb3VudCgpOworICAgIGludDMyX3QgcmVtYWluaW5nID0gY29udGV4dC0+Z2V0UmVtYWluaW5nQ2hhcmFjdGVycygpOworICAgIGlmIChyZW1haW5pbmcgPT0gMCAmJiBhdmFpbGFibGUgPD0gMikKKyAgICAgIHJldHVybiB0cnVlOworICB9CisKKyAgaW50MzJfdCByZXN0Q2hhcnMgPSBjb3VudCAtIDE7CisgIFdpZGVTdHJpbmcgZW5jb2RlZCA9IEVuY29kZVRvRWRpZmFjdENvZGV3b3JkcyhidWZmZXIsIDApOworICBpZiAoZW5jb2RlZC5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGJvb2wgZW5kT2ZTeW1ib2xSZWFjaGVkID0gIWNvbnRleHQtPmhhc01vcmVDaGFyYWN0ZXJzKCk7CisgIGJvb2wgcmVzdEluQXNjaWkgPSBlbmRPZlN5bWJvbFJlYWNoZWQgJiYgcmVzdENoYXJzIDw9IDI7CisgIGlmIChyZXN0Q2hhcnMgPD0gMikgeworICAgIGludDMyX3QgZSA9IEJDRXhjZXB0aW9uTk87CisgICAgY29udGV4dC0+dXBkYXRlU3ltYm9sSW5mbyhjb250ZXh0LT5nZXRDb2Rld29yZENvdW50KCkgKyByZXN0Q2hhcnMsIGUpOworICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpbnQzMl90IGF2YWlsYWJsZSA9CisgICAgICAgIGNvbnRleHQtPm1fc3ltYm9sSW5mby0+ZGF0YUNhcGFjaXR5KCkgLSBjb250ZXh0LT5nZXRDb2Rld29yZENvdW50KCk7CisgICAgaWYgKGF2YWlsYWJsZSA+PSAzKSB7CisgICAgICByZXN0SW5Bc2NpaSA9IGZhbHNlOworICAgICAgY29udGV4dC0+dXBkYXRlU3ltYm9sSW5mbygKKyAgICAgICAgICBjb250ZXh0LT5nZXRDb2Rld29yZENvdW50KCkgKyBlbmNvZGVkLkdldExlbmd0aCgpLCBlKTsKKyAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBpZiAocmVzdEluQXNjaWkpIHsKKyAgICBjb250ZXh0LT5yZXNldFN5bWJvbEluZm8oKTsKKyAgICBjb250ZXh0LT5tX3BvcyAtPSByZXN0Q2hhcnM7CisgIH0gZWxzZSB7CisgICAgY29udGV4dC0+d3JpdGVDb2Rld29yZHMoZW5jb2RlZCk7CisgIH0KKyAgY29udGV4dC0+c2lnbmFsRW5jb2RlckNoYW5nZShBU0NJSV9FTkNPREFUSU9OKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgZW5jb2RlQ2hhcih3Y2hhcl90IGMsIFdpZGVTdHJpbmcqIHNiLCBpbnQzMl90JiBlKSB7CisgIGlmIChjID49ICcgJyAmJiBjIDw9ICc/JykgeworICAgICpzYiArPSBjOworICB9IGVsc2UgaWYgKGMgPj0gJ0AnICYmIGMgPD0gJ14nKSB7CisgICAgKnNiICs9ICh3Y2hhcl90KShjIC0gNjQpOworICB9IGVsc2UgeworICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKKworQ0JDX0VkaWZhY3RFbmNvZGVyOjpDQkNfRWRpZmFjdEVuY29kZXIoKSB7fQorCitDQkNfRWRpZmFjdEVuY29kZXI6On5DQkNfRWRpZmFjdEVuY29kZXIoKSB7fQorCitpbnQzMl90IENCQ19FZGlmYWN0RW5jb2Rlcjo6Z2V0RW5jb2RpbmdNb2RlKCkgeworICByZXR1cm4gRURJRkFDVF9FTkNPREFUSU9OOworfQorCit2b2lkIENCQ19FZGlmYWN0RW5jb2Rlcjo6RW5jb2RlKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwgaW50MzJfdCYgZSkgeworICBXaWRlU3RyaW5nIGJ1ZmZlcjsKKyAgd2hpbGUgKGNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSkgeworICAgIHdjaGFyX3QgYyA9IGNvbnRleHQuZ2V0Q3VycmVudENoYXIoKTsKKyAgICBlbmNvZGVDaGFyKGMsICZidWZmZXIsIGUpOworICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29udGV4dC5tX3BvcysrOworICAgIGludDMyX3QgY291bnQgPSBidWZmZXIuR2V0TGVuZ3RoKCk7CisgICAgaWYgKGNvdW50ID49IDQpIHsKKyAgICAgIFdpZGVTdHJpbmcgZW5jb2RlZCA9IEVuY29kZVRvRWRpZmFjdENvZGV3b3JkcyhidWZmZXIsIDApOworICAgICAgaWYgKGVuY29kZWQuSXNFbXB0eSgpKSB7CisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkdlbmVyaWM7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZHMoZW5jb2RlZCk7CisgICAgICBidWZmZXIuRGVsZXRlKDAsIDQpOworICAgICAgaW50MzJfdCBuZXdNb2RlID0gQ0JDX0hpZ2hMZXZlbEVuY29kZXI6Omxvb2tBaGVhZFRlc3QoCisgICAgICAgICAgY29udGV4dC5tX21zZywgY29udGV4dC5tX3BvcywgZ2V0RW5jb2RpbmdNb2RlKCkpOworICAgICAgaWYgKG5ld01vZGUgIT0gZ2V0RW5jb2RpbmdNb2RlKCkpIHsKKyAgICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKEFTQ0lJX0VOQ09EQVRJT04pOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgYnVmZmVyICs9IHN0YXRpY19jYXN0PHdjaGFyX3Q+KDMxKTsKKyAgaWYgKCFIYW5kbGVFT0QoJmNvbnRleHQsIGJ1ZmZlcikpCisgICAgZSA9IEJDRXhjZXB0aW9uR2VuZXJpYzsKK30KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VkaWZhY3RFbmNvZGVyLmggYi9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FZGlmYWN0RW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNTkyMjIKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FZGlmYWN0RW5jb2Rlci5oCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEJBUkNPREVfREFUQU1BVFJJWF9CQ19FRElGQUNURU5DT0RFUl9IXworI2RlZmluZSBGWEJBUkNPREVfREFUQU1BVFJJWF9CQ19FRElGQUNURU5DT0RFUl9IXworCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2Rlci5oIgorCitjbGFzcyBDQkNfRWRpZmFjdEVuY29kZXIgOiBwdWJsaWMgQ0JDX0VuY29kZXIgeworIHB1YmxpYzoKKyAgQ0JDX0VkaWZhY3RFbmNvZGVyKCk7CisgIH5DQkNfRWRpZmFjdEVuY29kZXIoKSBvdmVycmlkZTsKKworICAvLyBDQkNfRW5jb2RlcgorICBpbnQzMl90IGdldEVuY29kaW5nTW9kZSgpIG92ZXJyaWRlOworICB2b2lkIEVuY29kZShDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsIGludDMyX3QmIGUpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBGWEJBUkNPREVfREFUQU1BVFJJWF9CQ19FRElGQUNURU5DT0RFUl9IXwpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2Rlci5jcHAgYi9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDAzOTA0Ci0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2Rlci5jcHAKQEAgLTAsMCArMSwxMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2Rlci5oIgorCitDQkNfRW5jb2Rlcjo6Q0JDX0VuY29kZXIoKSB7fQorQ0JDX0VuY29kZXI6On5DQkNfRW5jb2RlcigpIHt9CmRpZmYgLS1naXQgYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmggYi9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxNzMwZgotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfRU5DT0RFUl9IXworI2RlZmluZSBGWEJBUkNPREVfREFUQU1BVFJJWF9CQ19FTkNPREVSX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworY2xhc3MgQ0JDX0VuY29kZXJDb250ZXh0OworCitjbGFzcyBDQkNfRW5jb2RlciB7CisgcHVibGljOgorICBDQkNfRW5jb2RlcigpOworICB2aXJ0dWFsIH5DQkNfRW5jb2RlcigpOworCisgIHZpcnR1YWwgaW50MzJfdCBnZXRFbmNvZGluZ01vZGUoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LCBpbnQzMl90JiBlKSA9IDA7Cit9OworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX0VOQ09ERVJfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXJDb250ZXh0LmNwcCBiL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXJDb250ZXh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTBhNDk3Ci0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2RlckNvbnRleHQuY3BwCkBAIC0wLDAgKzEsMTA4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6CisvKgorICogQ29weXJpZ2h0IDIwMDYtMjAwNyBKZXJlbWlhcyBNYWVya2kuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyQ29udGV4dC5oIgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL0JDX1V0aWxDb2RpbmdDb252ZXJ0LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sSW5mby5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS91dGlscy5oIgorCitDQkNfRW5jb2RlckNvbnRleHQ6OkNCQ19FbmNvZGVyQ29udGV4dChjb25zdCBXaWRlU3RyaW5nJiBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBlY0xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgeworICBCeXRlU3RyaW5nIGRzdHN0cjsKKyAgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpVbmljb2RlVG9VVEY4KG1zZywgZHN0c3RyKTsKKyAgV2lkZVN0cmluZyBzYjsKKyAgc2l6ZV90IGMgPSBkc3RzdHIuR2V0TGVuZ3RoKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYzsgaSsrKSB7CisgICAgd2NoYXJfdCBjaCA9IHN0YXRpY19jYXN0PHdjaGFyX3Q+KGRzdHN0cltpXSAmIDB4ZmYpOworICAgIGlmIChjaCA9PSAnPycgJiYgZHN0c3RyW2ldICE9ICc/JykgeworICAgICAgZSA9IEJDRXhjZXB0aW9uQ2hhcmFjdGVyc091dHNpZGVJU084ODU5MUVuY29kaW5nOworICAgIH0KKyAgICBzYiArPSBjaDsKKyAgfQorICBtX21zZyA9IHNiOworICBtX2FsbG93UmVjdGFuZ3VsYXIgPSB0cnVlOworICBtX25ld0VuY29kaW5nID0gLTE7CisgIG1fcG9zID0gMDsKKyAgbV9zeW1ib2xJbmZvID0gbnVsbHB0cjsKKyAgbV9za2lwQXRFbmQgPSAwOworfQorCitDQkNfRW5jb2RlckNvbnRleHQ6On5DQkNfRW5jb2RlckNvbnRleHQoKSB7fQorCit2b2lkIENCQ19FbmNvZGVyQ29udGV4dDo6c2V0QWxsb3dSZWN0YW5ndWxhcihib29sIGFsbG93KSB7CisgIG1fYWxsb3dSZWN0YW5ndWxhciA9IGFsbG93OworfQorCit2b2lkIENCQ19FbmNvZGVyQ29udGV4dDo6c2V0U2tpcEF0RW5kKGludDMyX3QgY291bnQpIHsKKyAgbV9za2lwQXRFbmQgPSBjb3VudDsKK30KK3djaGFyX3QgQ0JDX0VuY29kZXJDb250ZXh0OjpnZXRDdXJyZW50Q2hhcigpIHsKKyAgcmV0dXJuIG1fbXNnW21fcG9zXTsKK30KK3djaGFyX3QgQ0JDX0VuY29kZXJDb250ZXh0OjpnZXRDdXJyZW50KCkgeworICByZXR1cm4gbV9tc2dbbV9wb3NdOworfQorCit2b2lkIENCQ19FbmNvZGVyQ29udGV4dDo6d3JpdGVDb2Rld29yZHMoY29uc3QgV2lkZVN0cmluZyYgY29kZXdvcmRzKSB7CisgIG1fY29kZXdvcmRzICs9IGNvZGV3b3JkczsKK30KKwordm9pZCBDQkNfRW5jb2RlckNvbnRleHQ6OndyaXRlQ29kZXdvcmQod2NoYXJfdCBjb2Rld29yZCkgeworICBtX2NvZGV3b3JkcyArPSBjb2Rld29yZDsKK30KK3NpemVfdCBDQkNfRW5jb2RlckNvbnRleHQ6OmdldENvZGV3b3JkQ291bnQoKSB7CisgIHJldHVybiBtX2NvZGV3b3Jkcy5HZXRMZW5ndGgoKTsKK30KK3ZvaWQgQ0JDX0VuY29kZXJDb250ZXh0OjpzaWduYWxFbmNvZGVyQ2hhbmdlKGludDMyX3QgZW5jb2RpbmcpIHsKKyAgbV9uZXdFbmNvZGluZyA9IGVuY29kaW5nOworfQordm9pZCBDQkNfRW5jb2RlckNvbnRleHQ6OnJlc2V0RW5jb2RlclNpZ25hbCgpIHsKKyAgbV9uZXdFbmNvZGluZyA9IC0xOworfQorYm9vbCBDQkNfRW5jb2RlckNvbnRleHQ6Omhhc01vcmVDaGFyYWN0ZXJzKCkgeworICByZXR1cm4gbV9wb3MgPCBnZXRUb3RhbE1lc3NhZ2VDaGFyQ291bnQoKTsKK30KK3NpemVfdCBDQkNfRW5jb2RlckNvbnRleHQ6OmdldFJlbWFpbmluZ0NoYXJhY3RlcnMoKSB7CisgIHJldHVybiBnZXRUb3RhbE1lc3NhZ2VDaGFyQ291bnQoKSAtIG1fcG9zOworfQordm9pZCBDQkNfRW5jb2RlckNvbnRleHQ6OnVwZGF0ZVN5bWJvbEluZm8oaW50MzJfdCYgZSkgeworICB1cGRhdGVTeW1ib2xJbmZvKGdldENvZGV3b3JkQ291bnQoKSwgZSk7Cit9Cit2b2lkIENCQ19FbmNvZGVyQ29udGV4dDo6dXBkYXRlU3ltYm9sSW5mbyhpbnQzMl90IGxlbiwgaW50MzJfdCYgZSkgeworICBpZiAoIW1fc3ltYm9sSW5mbyB8fCBsZW4gPiBtX3N5bWJvbEluZm8tPmRhdGFDYXBhY2l0eSgpKSB7CisgICAgbV9zeW1ib2xJbmZvID0gQ0JDX1N5bWJvbEluZm86Omxvb2t1cChsZW4sIG1fYWxsb3dSZWN0YW5ndWxhciwgZSk7CisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKKyAgICAgIHJldHVybjsKKyAgfQorfQorCit2b2lkIENCQ19FbmNvZGVyQ29udGV4dDo6cmVzZXRTeW1ib2xJbmZvKCkgeworICBtX2FsbG93UmVjdGFuZ3VsYXIgPSB0cnVlOworfQorCitzaXplX3QgQ0JDX0VuY29kZXJDb250ZXh0OjpnZXRUb3RhbE1lc3NhZ2VDaGFyQ291bnQoKSB7CisgIHJldHVybiBtX21zZy5HZXRMZW5ndGgoKSAtIG1fc2tpcEF0RW5kOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2RlckNvbnRleHQuaCBiL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXJDb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkZGIyMAotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXJDb250ZXh0LmgKQEAgLTAsMCArMSw1MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX0VOQ09ERVJDT05URVhUX0hfCisjZGVmaW5lIEZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX0VOQ09ERVJDT05URVhUX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC93aWRlc3RyaW5nLmgiCisKK2NsYXNzIENCQ19TeW1ib2xJbmZvOworCitjbGFzcyBDQkNfRW5jb2RlckNvbnRleHQgeworIHB1YmxpYzoKKyAgQ0JDX0VuY29kZXJDb250ZXh0KGNvbnN0IFdpZGVTdHJpbmcmIG1zZywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIGVjTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKKyAgfkNCQ19FbmNvZGVyQ29udGV4dCgpOworCisgIHZvaWQgc2V0QWxsb3dSZWN0YW5ndWxhcihib29sIGFsbG93KTsKKyAgdm9pZCBzZXRTa2lwQXRFbmQoaW50MzJfdCBjb3VudCk7CisgIHdjaGFyX3QgZ2V0Q3VycmVudENoYXIoKTsKKyAgd2NoYXJfdCBnZXRDdXJyZW50KCk7CisgIHZvaWQgd3JpdGVDb2Rld29yZHMoY29uc3QgV2lkZVN0cmluZyYgY29kZXdvcmRzKTsKKyAgdm9pZCB3cml0ZUNvZGV3b3JkKHdjaGFyX3QgY29kZXdvcmQpOworICBzaXplX3QgZ2V0Q29kZXdvcmRDb3VudCgpOworICB2b2lkIHNpZ25hbEVuY29kZXJDaGFuZ2UoaW50MzJfdCBlbmNvZGluZyk7CisgIHZvaWQgcmVzZXRFbmNvZGVyU2lnbmFsKCk7CisgIGJvb2wgaGFzTW9yZUNoYXJhY3RlcnMoKTsKKyAgc2l6ZV90IGdldFJlbWFpbmluZ0NoYXJhY3RlcnMoKTsKKyAgdm9pZCB1cGRhdGVTeW1ib2xJbmZvKGludDMyX3QmIGUpOworICB2b2lkIHVwZGF0ZVN5bWJvbEluZm8oaW50MzJfdCBsZW4sIGludDMyX3QmIGUpOworICB2b2lkIHJlc2V0U3ltYm9sSW5mbygpOworCisgIFdpZGVTdHJpbmcgbV9tc2c7CisgIFdpZGVTdHJpbmcgbV9jb2Rld29yZHM7CisgIHNpemVfdCBtX3BvczsKKyAgaW50MzJfdCBtX25ld0VuY29kaW5nOworICBVbm93bmVkUHRyPENCQ19TeW1ib2xJbmZvPiBtX3N5bWJvbEluZm87CisKKyBwcml2YXRlOgorICBzaXplX3QgZ2V0VG90YWxNZXNzYWdlQ2hhckNvdW50KCk7CisKKyAgYm9vbCBtX2FsbG93UmVjdGFuZ3VsYXI7ICAvLyBGb3JjZSBzcXVhcmUgd2hlbiBmYWxzZS4KKyAgc2l6ZV90IG1fc2tpcEF0RW5kOworfTsKKworI2VuZGlmICAvLyBGWEJBUkNPREVfREFUQU1BVFJJWF9CQ19FTkNPREVSQ09OVEVYVF9IXwpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRXJyb3JDb3JyZWN0aW9uLmNwcCBiL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Vycm9yQ29ycmVjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUwNzdlZQotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Vycm9yQ29ycmVjdGlvbi5jcHAKQEAgLTAsMCArMSwyMTAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKKy8qCisgKiBDb3B5cmlnaHQgMjAwNiBKZXJlbWlhcyBNYWVya2kuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FcnJvckNvcnJlY3Rpb24uaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL3V0aWxzLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IHVpbnQ4X3QgRkFDVE9SX1NFVFNbXSA9IHs1LCAgNywgIDEwLCAxMSwgMTIsIDE0LCAxOCwgMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQsIDI4LCAzNiwgNDIsIDQ4LCA1NiwgNjIsIDY4fTsKKworY29uc3QgdWludDhfdCBGQUNUT1JTXzBbNV0gPSB7MjI4LCA0OCwgMTUsIDExMSwgNjJ9OworY29uc3QgdWludDhfdCBGQUNUT1JTXzFbN10gPSB7MjMsIDY4LCAxNDQsIDEzNCwgMjQwLCA5MiwgMjU0fTsKK2NvbnN0IHVpbnQ4X3QgRkFDVE9SU18yWzEwXSA9IHsyOCwgMjQsIDE4NSwgMTY2LCAyMjMsIDI0OCwgMTE2LCAyNTUsIDExMCwgNjF9OworY29uc3QgdWludDhfdCBGQUNUT1JTXzNbMTFdID0gezE3NSwgMTM4LCAyMDUsIDEyLCAxOTQsIDE2OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwgIDI0NSwgNjAsICA5NywgMTIwfTsKKworY29uc3QgdWludDhfdCBGQUNUT1JTXzRbMTJdID0gezQxLCAgMTUzLCAxNTgsIDkxLCAgNjEsICA0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDIsIDIxMywgOTcsICAxNzgsIDEwMCwgMjQyfTsKKworY29uc3QgdWludDhfdCBGQUNUT1JTXzVbMTRdID0gezE1NiwgOTcsICAxOTIsIDI1MiwgOTUsICA5LCAgMTU3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOSwgMTM4LCA0NSwgIDE4LCAgMTg2LCA4MywgMTg1fTsKKworY29uc3QgdWludDhfdCBGQUNUT1JTXzZbMThdID0gezgzLCAgMTk1LCAxMDAsIDM5LCAxODgsIDc1LCAgNjYsIDYxLCAyNDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEzLCAxMDksIDEyOSwgOTQsIDI1NCwgMjI1LCA0OCwgOTAsIDE4OH07CisKK2NvbnN0IHVpbnQ4X3QgRkFDVE9SU183WzIwXSA9IHsxNSwgIDE5NSwgMjQ0LCA5LCAgMjMzLCA3MSwgMTY4LCAyLCAgIDE4OCwgMTYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1MywgMTQ1LCAyNTMsIDc5LCAxMDgsIDgyLCAyNywgIDE3NCwgMTg2LCAxNzJ9OworCitjb25zdCB1aW50OF90IEZBQ1RPUlNfOFsyNF0gPSB7NTIsICAxOTAsIDg4LCAgMjA1LCAxMDksIDM5LCAxNzYsIDIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1NSwgMTk3LCAyNTEsIDIyMywgMTU1LCAyMSwgNSwgICAxNzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU0LCAxMjQsIDEyLCAgMTgxLCAxODQsIDk2LCA1MCwgIDE5M307CisKK2NvbnN0IHVpbnQ4X3QgRkFDVE9SU185WzI4XSA9IHsyMTEsIDIzMSwgNDMsICA5NywgIDcxLCAgOTYsICAxMDMsIDE3NCwgMzcsICAxNTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcwLCA1MywgIDc1LCAgMzQsICAyNDksIDEyMSwgMTcsICAxMzgsIDExMCwgMjEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0MSwgMTM2LCAxMjAsIDE1MSwgMjMzLCAxNjgsIDkzLCAgMjU1fTsKKworY29uc3QgdWludDhfdCBGQUNUT1JTXzEwWzM2XSA9IHsyNDUsIDEyNywgMjQyLCAyMTgsIDEzMCwgMjUwLCAxNjIsIDE4MSwgMTAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAsIDg0LCAgMTc5LCAyMjAsIDI1MSwgODAsICAxODIsIDIyOSwgMTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsICAgNCwgICA2OCwgIDMzLCAgMTAxLCAxMzcsIDk1LCAgMTE5LCAxMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LCAgMTc1LCAxODQsIDU5LCAgMjUsICAyMjUsIDk4LCAgODEsICAxMTJ9OworCitjb25zdCB1aW50OF90IEZBQ1RPUlNfMTFbNDJdID0geworICAgIDc3LCAgMTkzLCAxMzcsIDMxLCAgMTksICAzOCwgIDIyLCAgMTUzLCAyNDcsIDEwNSwgMTIyLCAyLCAgIDI0NSwgMTMzLAorICAgIDI0MiwgOCwgICAxNzUsIDk1LCAgMTAwLCA5LCAgIDE2NywgMTA1LCAyMTQsIDExMSwgNTcsICAxMjEsIDIxLCAgMSwKKyAgICAyNTMsIDU3LCAgNTQsICAxMDEsIDI0OCwgMjAyLCA2OSwgIDUwLCAgMTUwLCAxNzcsIDIyNiwgNSwgICA5LCAgIDV9OworCitjb25zdCB1aW50OF90IEZBQ1RPUlNfMTJbNDhdID0geworICAgIDI0NSwgMTMyLCAxNzIsIDIyMywgOTYsICAzMiwgIDExNywgMjIsICAyMzgsIDEzMywgMjM4LCAyMzEsCisgICAgMjA1LCAxODgsIDIzNywgODcsICAxOTEsIDEwNiwgMTYsICAxNDcsIDExOCwgMjMsICAzNywgIDkwLAorICAgIDE3MCwgMjA1LCAxMzEsIDg4LCAgMTIwLCAxMDAsIDY2LCAgMTM4LCAxODYsIDI0MCwgODIsICA0NCwKKyAgICAxNzYsIDg3LCAgMTg3LCAxNDcsIDE2MCwgMTc1LCA2OSwgIDIxMywgOTIsICAyNTMsIDIyNSwgMTl9OworCitjb25zdCB1aW50OF90IEZBQ1RPUlNfMTNbNTZdID0geworICAgIDE3NSwgOSwgICAyMjMsIDIzOCwgMTIsICAxNywgIDIyMCwgMjA4LCAxMDAsIDI5LCAgMTc1LCAxNzAsIDIzMCwgMTkyLAorICAgIDIxNSwgMjM1LCAxNTAsIDE1OSwgMzYsICAyMjMsIDM4LCAgMjAwLCAxMzIsIDU0LCAgMjI4LCAxNDYsIDIxOCwgMjM0LAorICAgIDExNywgMjAzLCAyOSwgIDIzMiwgMTQ0LCAyMzgsIDIyLCAgMTUwLCAyMDEsIDExNywgNjIsICAyMDcsIDE2NCwgMTMsCisgICAgMTM3LCAyNDUsIDEyNywgNjcsICAyNDcsIDI4LCAgMTU1LCA0MywgIDIwMywgMTA3LCAyMzMsIDUzLCAgMTQzLCA0Nn07CisKK2NvbnN0IHVpbnQ4X3QgRkFDVE9SU18xNFs2Ml0gPSB7CisgICAgMjQyLCA5MywgIDE2OSwgNTAsICAxNDQsIDIxMCwgMzksICAxMTgsIDIwMiwgMTg4LCAyMDEsIDE4OSwgMTQzLAorICAgIDEwOCwgMTk2LCAzNywgIDE4NSwgMTEyLCAxMzQsIDIzMCwgMjQ1LCA2MywgIDE5NywgMTkwLCAyNTAsIDEwNiwKKyAgICAxODUsIDIyMSwgMTc1LCA2NCwgIDExNCwgNzEsICAxNjEsIDQ0LCAgMTQ3LCA2LCAgIDI3LCAgMjE4LCA1MSwKKyAgICA2MywgIDg3LCAgMTAsICA0MCwgIDEzMCwgMTg4LCAxNywgIDE2MywgMzEsICAxNzYsIDE3MCwgNCwgICAxMDcsCisgICAgMjMyLCA3LCAgIDk0LCAgMTY2LCAyMjQsIDEyNCwgODYsICA0NywgIDExLCAgMjA0fTsKKworY29uc3QgdWludDhfdCBGQUNUT1JTXzE1WzY4XSA9IHsKKyAgICAyMjAsIDIyOCwgMTczLCA4OSwgIDI1MSwgMTQ5LCAxNTksIDU2LCAgODksICAzMywgIDE0NywgMjQ0LCAxNTQsIDM2LAorICAgIDczLCAgMTI3LCAyMTMsIDEzNiwgMjQ4LCAxODAsIDIzNCwgMTk3LCAxNTgsIDE3NywgNjgsICAxMjIsIDkzLCAgMjEzLAorICAgIDE1LCAgMTYwLCAyMjcsIDIzNiwgNjYsICAxMzksIDE1MywgMTg1LCAyMDIsIDE2NywgMTc5LCAyNSwgIDIyMCwgMjMyLAorICAgIDk2LCAgMjEwLCAyMzEsIDEzNiwgMjIzLCAyMzksIDE4MSwgMjQxLCA1OSwgIDUyLCAgMTcyLCAyNSwgIDQ5LCAgMjMyLAorICAgIDIxMSwgMTg5LCA2NCwgIDU0LCAgMTA4LCAxNTMsIDEzMiwgNjMsICA5NiwgIDEwMywgODIsICAxODZ9OworCitjb25zdCB1aW50OF90KiBjb25zdCBGQUNUT1JTWzE2XSA9IHsKKyAgICBGQUNUT1JTXzAsICBGQUNUT1JTXzEsICBGQUNUT1JTXzIsICBGQUNUT1JTXzMsIEZBQ1RPUlNfNCwgIEZBQ1RPUlNfNSwKKyAgICBGQUNUT1JTXzYsICBGQUNUT1JTXzcsICBGQUNUT1JTXzgsICBGQUNUT1JTXzksIEZBQ1RPUlNfMTAsIEZBQ1RPUlNfMTEsCisgICAgRkFDVE9SU18xMiwgRkFDVE9SU18xMywgRkFDVE9SU18xNCwgRkFDVE9SU18xNX07CisKK30gIC8vIG5hbWVzcGFjZQorCitpbnQzMl90IENCQ19FcnJvckNvcnJlY3Rpb246Ok1PRFVMT19WQUxVRSA9IDB4MTJEOworaW50MzJfdCBDQkNfRXJyb3JDb3JyZWN0aW9uOjpMT0dbMjU2XSA9IHswfTsKK2ludDMyX3QgQ0JDX0Vycm9yQ29ycmVjdGlvbjo6QUxPR1syNTZdID0gezB9Owordm9pZCBDQkNfRXJyb3JDb3JyZWN0aW9uOjpJbml0aWFsaXplKCkgeworICBpbnQzMl90IHAgPSAxOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAyNTU7IGkrKykgeworICAgIEFMT0dbaV0gPSBwOworICAgIExPR1twXSA9IGk7CisgICAgcCA8PD0gMTsKKyAgICBpZiAocCA+PSAyNTYpIHsKKyAgICAgIHAgXj0gTU9EVUxPX1ZBTFVFOworICAgIH0KKyAgfQorfQordm9pZCBDQkNfRXJyb3JDb3JyZWN0aW9uOjpGaW5hbGl6ZSgpIHt9CitDQkNfRXJyb3JDb3JyZWN0aW9uOjpDQkNfRXJyb3JDb3JyZWN0aW9uKCkge30KK0NCQ19FcnJvckNvcnJlY3Rpb246On5DQkNfRXJyb3JDb3JyZWN0aW9uKCkge30KK1dpZGVTdHJpbmcgQ0JDX0Vycm9yQ29ycmVjdGlvbjo6ZW5jb2RlRUNDMjAwKFdpZGVTdHJpbmcgY29kZXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1N5bWJvbEluZm8qIHN5bWJvbEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7CisgIGlmIChwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxpbnQzMl90Pihjb2Rld29yZHMuR2V0TGVuZ3RoKCkpICE9CisgICAgICBzeW1ib2xJbmZvLT5kYXRhQ2FwYWNpdHkoKSkgeworICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsKKyAgICByZXR1cm4gV2lkZVN0cmluZygpOworICB9CisgIFdpZGVTdHJpbmcgc2I7CisgIHNiICs9IGNvZGV3b3JkczsKKyAgaW50MzJfdCBibG9ja0NvdW50ID0gc3ltYm9sSW5mby0+Z2V0SW50ZXJsZWF2ZWRCbG9ja0NvdW50KCk7CisgIGlmIChibG9ja0NvdW50ID09IDEpIHsKKyAgICBXaWRlU3RyaW5nIGVjYyA9IGNyZWF0ZUVDQ0Jsb2NrKGNvZGV3b3Jkcywgc3ltYm9sSW5mby0+ZXJyb3JDb2Rld29yZHMoKSwgZSk7CisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKKyAgICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CisgICAgc2IgKz0gZWNjOworICB9IGVsc2UgeworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGRhdGFTaXplcyhibG9ja0NvdW50KTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBlcnJvclNpemVzKGJsb2NrQ291bnQpOworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHN0YXJ0UG9zKGJsb2NrQ291bnQpOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGJsb2NrQ291bnQ7IGkrKykgeworICAgICAgZGF0YVNpemVzW2ldID0gc3ltYm9sSW5mby0+Z2V0RGF0YUxlbmd0aEZvckludGVybGVhdmVkQmxvY2soaSArIDEpOworICAgICAgZXJyb3JTaXplc1tpXSA9IHN5bWJvbEluZm8tPmdldEVycm9yTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jayhpICsgMSk7CisgICAgICBzdGFydFBvc1tpXSA9IDA7CisgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgc3RhcnRQb3NbaV0gPSBzdGFydFBvc1tpIC0gMV0gKyBkYXRhU2l6ZXNbaV07CisgICAgICB9CisgICAgfQorICAgIGZvciAoaW50MzJfdCBibG9jayA9IDA7IGJsb2NrIDwgYmxvY2tDb3VudDsgYmxvY2srKykgeworICAgICAgV2lkZVN0cmluZyB0ZW1wOworICAgICAgZm9yIChpbnQzMl90IGQgPSBibG9jazsgZCA8IHN5bWJvbEluZm8tPmRhdGFDYXBhY2l0eSgpOyBkICs9IGJsb2NrQ291bnQpIHsKKyAgICAgICAgdGVtcCArPSAod2NoYXJfdCljb2Rld29yZHNbZF07CisgICAgICB9CisgICAgICBXaWRlU3RyaW5nIGVjYyA9IGNyZWF0ZUVDQ0Jsb2NrKHRlbXAsIGVycm9yU2l6ZXNbYmxvY2tdLCBlKTsKKyAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CisgICAgICBpbnQzMl90IHBvcyA9IDA7CisgICAgICBmb3IgKGludDMyX3QgbCA9IGJsb2NrOyBsIDwgZXJyb3JTaXplc1tibG9ja10gKiBibG9ja0NvdW50OworICAgICAgICAgICBsICs9IGJsb2NrQ291bnQpIHsKKyAgICAgICAgc2IuU2V0QXQoc3ltYm9sSW5mby0+ZGF0YUNhcGFjaXR5KCkgKyBsLCBlY2NbcG9zKytdKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHNiOworfQorV2lkZVN0cmluZyBDQkNfRXJyb3JDb3JyZWN0aW9uOjpjcmVhdGVFQ0NCbG9jayhXaWRlU3RyaW5nIGNvZGV3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1FQ1dvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7CisgIHJldHVybiBjcmVhdGVFQ0NCbG9jayhjb2Rld29yZHMsIDAsIGNvZGV3b3Jkcy5HZXRMZW5ndGgoKSwgbnVtRUNXb3JkcywgZSk7Cit9CitXaWRlU3RyaW5nIENCQ19FcnJvckNvcnJlY3Rpb246OmNyZWF0ZUVDQ0Jsb2NrKFdpZGVTdHJpbmcgY29kZXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1FQ1dvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7CisgIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZhY3RvclRhYmxlTnVtID0gc2l6ZW9mKEZBQ1RPUl9TRVRTKSAvIHNpemVvZihpbnQzMl90KTsKKyAgc2l6ZV90IHRhYmxlID0gMDsKKyAgd2hpbGUgKHRhYmxlIDwga0ZhY3RvclRhYmxlTnVtICYmIEZBQ1RPUl9TRVRTW3RhYmxlXSAhPSBudW1FQ1dvcmRzKQorICAgIHRhYmxlKys7CisKKyAgaWYgKHRhYmxlID49IGtGYWN0b3JUYWJsZU51bSkgeworICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsKKyAgICByZXR1cm4gV2lkZVN0cmluZygpOworICB9CisgIHVpbnQxNl90KiBlY2MgPSBGWF9BbGxvYyh1aW50MTZfdCwgbnVtRUNXb3Jkcyk7CisgIG1lbXNldChlY2MsIDAsIG51bUVDV29yZHMgKiBzaXplb2YodWludDE2X3QpKTsKKyAgZm9yIChpbnQzMl90IGwgPSBzdGFydDsgbCA8IHN0YXJ0ICsgbGVuOyBsKyspIHsKKyAgICB1aW50MTZfdCBtID0gZWNjW251bUVDV29yZHMgLSAxXSBeIGNvZGV3b3Jkc1tsXTsKKyAgICBmb3IgKGludDMyX3QgayA9IG51bUVDV29yZHMgLSAxOyBrID4gMDsgay0tKSB7CisgICAgICBpZiAobSAhPSAwICYmIEZBQ1RPUlNbdGFibGVdW2tdICE9IDApIHsKKyAgICAgICAgZWNjW2tdID0gKHVpbnQxNl90KShlY2NbayAtIDFdIF4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HWyhMT0dbbV0gKyBMT0dbRkFDVE9SU1t0YWJsZV1ba11dKSAlIDI1NV0pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZWNjW2tdID0gZWNjW2sgLSAxXTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG0gIT0gMCAmJiBGQUNUT1JTW3RhYmxlXVswXSAhPSAwKSB7CisgICAgICBlY2NbMF0gPSAodWludDE2X3QpQUxPR1soTE9HW21dICsgTE9HW0ZBQ1RPUlNbdGFibGVdWzBdXSkgJSAyNTVdOworICAgIH0gZWxzZSB7CisgICAgICBlY2NbMF0gPSAwOworICAgIH0KKyAgfQorICBXaWRlU3RyaW5nIHN0cmVjYzsKKyAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbnVtRUNXb3JkczsgaisrKSB7CisgICAgc3RyZWNjICs9ICh3Y2hhcl90KWVjY1tudW1FQ1dvcmRzIC0gaiAtIDFdOworICB9CisgIEZYX0ZyZWUoZWNjKTsKKyAgcmV0dXJuIHN0cmVjYzsKK30KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Vycm9yQ29ycmVjdGlvbi5oIGIvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRXJyb3JDb3JyZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYxYjIwNQotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Vycm9yQ29ycmVjdGlvbi5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEJBUkNPREVfREFUQU1BVFJJWF9CQ19FUlJPUkNPUlJFQ1RJT05fSF8KKyNkZWZpbmUgRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfRVJST1JDT1JSRUNUSU9OX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3dpZGVzdHJpbmcuaCIKKworY2xhc3MgQ0JDX1N5bWJvbEluZm87CisKK2NsYXNzIENCQ19FcnJvckNvcnJlY3Rpb24geworIHB1YmxpYzoKKyAgQ0JDX0Vycm9yQ29ycmVjdGlvbigpOworICB2aXJ0dWFsIH5DQkNfRXJyb3JDb3JyZWN0aW9uKCk7CisKKyAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOworICBzdGF0aWMgdm9pZCBGaW5hbGl6ZSgpOworICBzdGF0aWMgV2lkZVN0cmluZyBlbmNvZGVFQ0MyMDAoV2lkZVN0cmluZyBjb2Rld29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfU3ltYm9sSW5mbyogc3ltYm9sSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOworCisgcHJpdmF0ZToKKyAgc3RhdGljIGludDMyX3QgTU9EVUxPX1ZBTFVFOworICBzdGF0aWMgaW50MzJfdCBMT0dbMjU2XTsKKyAgc3RhdGljIGludDMyX3QgQUxPR1syNTZdOworCisgcHJpdmF0ZToKKyAgc3RhdGljIFdpZGVTdHJpbmcgY3JlYXRlRUNDQmxvY2soV2lkZVN0cmluZyBjb2Rld29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRUNXb3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7CisgIHN0YXRpYyBXaWRlU3RyaW5nIGNyZWF0ZUVDQ0Jsb2NrKFdpZGVTdHJpbmcgY29kZXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1FQ1dvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKK307CisKKyNlbmRpZiAgLy8gRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfRVJST1JDT1JSRUNUSU9OX0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19IaWdoTGV2ZWxFbmNvZGVyLmNwcCBiL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0hpZ2hMZXZlbEVuY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YTg4NDcKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19IaWdoTGV2ZWxFbmNvZGVyLmNwcApAQCAtMCwwICsxLDM0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgorLyoKKyAqIENvcHlyaWdodCAyMDA2LTIwMDcgSmVyZW1pYXMgTWFlcmtpLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfSGlnaExldmVsRW5jb2Rlci5oIgorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmeGJhcmNvZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0FTQ0lJRW5jb2Rlci5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Jhc2UyNTZFbmNvZGVyLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQzQwRW5jb2Rlci5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VkaWZhY3RFbmNvZGVyLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2Rlci5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXJDb250ZXh0LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sSW5mby5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX1RleHRFbmNvZGVyLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfWDEyRW5jb2Rlci5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS91dGlscy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworY29uc3Qgd2NoYXJfdCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fQzQwID0gMjMwOworY29uc3Qgd2NoYXJfdCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fQkFTRTI1NiA9IDIzMTsKK2NvbnN0IHdjaGFyX3QgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OlVQUEVSX1NISUZUID0gMjM1OworY29uc3Qgd2NoYXJfdCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fQU5TSVgxMiA9IDIzODsKK2NvbnN0IHdjaGFyX3QgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OkxBVENIX1RPX1RFWFQgPSAyMzk7Citjb25zdCB3Y2hhcl90IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpMQVRDSF9UT19FRElGQUNUID0gMjQwOworY29uc3Qgd2NoYXJfdCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6QzQwX1VOTEFUQ0ggPSAyNTQ7Citjb25zdCB3Y2hhcl90IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpYMTJfVU5MQVRDSCA9IDI1NDsKK2NvbnN0IHdjaGFyX3QgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OlBBRCA9IDEyOTsKK2NvbnN0IHdjaGFyX3QgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6Ok1BQ1JPXzA1ID0gMjM2OworY29uc3Qgd2NoYXJfdCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6TUFDUk9fMDYgPSAyMzc7Citjb25zdCB3Y2hhcl90IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpNQUNST18wNV9IRUFERVJbXSA9IEwiWyk+HjA1IjsKK2NvbnN0IHdjaGFyX3QgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6Ok1BQ1JPXzA2X0hFQURFUltdID0gTCJbKT4eMDYiOworY29uc3Qgd2NoYXJfdCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6TUFDUk9fVFJBSUxFUiA9IDB4MDAwNDsKKworQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OkNCQ19IaWdoTGV2ZWxFbmNvZGVyKCkge30KK0NCQ19IaWdoTGV2ZWxFbmNvZGVyOjp+Q0JDX0hpZ2hMZXZlbEVuY29kZXIoKSB7fQorCitzdGQ6OnZlY3Rvcjx1aW50OF90PiYgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmdldEJ5dGVzRm9yTWVzc2FnZShXaWRlU3RyaW5nIG1zZykgeworICBCeXRlU3RyaW5nIGJ5dGVzdHI7CisgIENCQ19VdGlsQ29kaW5nQ29udmVydDo6VW5pY29kZVRvVVRGOChtc2csIGJ5dGVzdHIpOworICBtX2J5dGVhcnJheS5pbnNlcnQobV9ieXRlYXJyYXkuZW5kKCksIGJ5dGVzdHIuYmVnaW4oKSwgYnl0ZXN0ci5lbmQoKSk7CisgIHJldHVybiBtX2J5dGVhcnJheTsKK30KKworLy8gc3RhdGljCitXaWRlU3RyaW5nIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVIaWdoTGV2ZWwoV2lkZVN0cmluZyBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyBlY0xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb3dSZWN0YW5ndWxhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7CisgIENCQ19FbmNvZGVyQ29udGV4dCBjb250ZXh0KG1zZywgZWNMZXZlbCwgZSk7CisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKKworICBjb250ZXh0LnNldEFsbG93UmVjdGFuZ3VsYXIoYWxsb3dSZWN0YW5ndWxhcik7CisgIGlmICgobXNnLkxlZnQoNikgPT0gTUFDUk9fMDVfSEVBREVSKSAmJiAobXNnLkxhc3QoKSA9PSBNQUNST19UUkFJTEVSKSkgeworICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChNQUNST18wNSk7CisgICAgY29udGV4dC5zZXRTa2lwQXRFbmQoMik7CisgICAgY29udGV4dC5tX3BvcyArPSA2OworICB9IGVsc2UgaWYgKChtc2cuTGVmdCg2KSA9PSBNQUNST18wNl9IRUFERVIpICYmCisgICAgICAgICAgICAgKG1zZy5MYXN0KCkgPT0gTUFDUk9fVFJBSUxFUikpIHsKKyAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoTUFDUk9fMDYpOworICAgIGNvbnRleHQuc2V0U2tpcEF0RW5kKDIpOworICAgIGNvbnRleHQubV9wb3MgKz0gNjsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDQkNfRW5jb2Rlcj4+IGVuY29kZXJzOworICBlbmNvZGVycy5wdXNoX2JhY2socGRmaXVtOjpNYWtlVW5pcXVlPENCQ19BU0NJSUVuY29kZXI+KCkpOworICBlbmNvZGVycy5wdXNoX2JhY2socGRmaXVtOjpNYWtlVW5pcXVlPENCQ19DNDBFbmNvZGVyPigpKTsKKyAgZW5jb2RlcnMucHVzaF9iYWNrKHBkZml1bTo6TWFrZVVuaXF1ZTxDQkNfVGV4dEVuY29kZXI+KCkpOworICBlbmNvZGVycy5wdXNoX2JhY2socGRmaXVtOjpNYWtlVW5pcXVlPENCQ19YMTJFbmNvZGVyPigpKTsKKyAgZW5jb2RlcnMucHVzaF9iYWNrKHBkZml1bTo6TWFrZVVuaXF1ZTxDQkNfRWRpZmFjdEVuY29kZXI+KCkpOworICBlbmNvZGVycy5wdXNoX2JhY2socGRmaXVtOjpNYWtlVW5pcXVlPENCQ19CYXNlMjU2RW5jb2Rlcj4oKSk7CisgIGludDMyX3QgZW5jb2RpbmdNb2RlID0gQVNDSUlfRU5DT0RBVElPTjsKKyAgd2hpbGUgKGNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSkgeworICAgIGVuY29kZXJzW2VuY29kaW5nTW9kZV0tPkVuY29kZShjb250ZXh0LCBlKTsKKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgICAgcmV0dXJuIEwiIjsKKworICAgIGlmIChjb250ZXh0Lm1fbmV3RW5jb2RpbmcgPj0gMCkgeworICAgICAgZW5jb2RpbmdNb2RlID0gY29udGV4dC5tX25ld0VuY29kaW5nOworICAgICAgY29udGV4dC5yZXNldEVuY29kZXJTaWduYWwoKTsKKyAgICB9CisgIH0KKyAgaW50MzJfdCBsZW4gPSBjb250ZXh0Lm1fY29kZXdvcmRzLkdldExlbmd0aCgpOworICBjb250ZXh0LnVwZGF0ZVN5bWJvbEluZm8oZSk7CisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgcmV0dXJuIEwiIjsKKworICBpbnQzMl90IGNhcGFjaXR5ID0gY29udGV4dC5tX3N5bWJvbEluZm8tPmRhdGFDYXBhY2l0eSgpOworICBpZiAobGVuIDwgY2FwYWNpdHkpIHsKKyAgICBpZiAoZW5jb2RpbmdNb2RlICE9IEFTQ0lJX0VOQ09EQVRJT04gJiYKKyAgICAgICAgZW5jb2RpbmdNb2RlICE9IEJBU0UyNTZfRU5DT0RBVElPTikgeworICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKDB4MDBmZSk7CisgICAgfQorICB9CisgIFdpZGVTdHJpbmcgY29kZXdvcmRzID0gY29udGV4dC5tX2NvZGV3b3JkczsKKyAgaWYgKHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PGludDMyX3Q+KGNvZGV3b3Jkcy5HZXRMZW5ndGgoKSkgPCBjYXBhY2l0eSkgeworICAgIGNvZGV3b3JkcyArPSBQQUQ7CisgIH0KKyAgd2hpbGUgKHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PGludDMyX3Q+KGNvZGV3b3Jkcy5HZXRMZW5ndGgoKSkgPAorICAgICAgICAgY2FwYWNpdHkpIHsKKyAgICBjb2Rld29yZHMgKz0gKHJhbmRvbWl6ZTI1M1N0YXRlKAorICAgICAgICBQQUQsIHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PGludDMyX3Q+KGNvZGV3b3Jkcy5HZXRMZW5ndGgoKSkgKyAxKSk7CisgIH0KKyAgcmV0dXJuIGNvZGV3b3JkczsKK30KK2ludDMyX3QgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6Omxvb2tBaGVhZFRlc3QoV2lkZVN0cmluZyBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY3VycmVudE1vZGUpIHsKKyAgaWYgKHN0YXJ0cG9zID49IHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PGludDMyX3Q+KG1zZy5HZXRMZW5ndGgoKSkpIHsKKyAgICByZXR1cm4gY3VycmVudE1vZGU7CisgIH0KKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGNoYXJDb3VudHM7CisgIGlmIChjdXJyZW50TW9kZSA9PSBBU0NJSV9FTkNPREFUSU9OKSB7CisgICAgY2hhckNvdW50cy5wdXNoX2JhY2soMCk7CisgICAgY2hhckNvdW50cy5wdXNoX2JhY2soMSk7CisgICAgY2hhckNvdW50cy5wdXNoX2JhY2soMSk7CisgICAgY2hhckNvdW50cy5wdXNoX2JhY2soMSk7CisgICAgY2hhckNvdW50cy5wdXNoX2JhY2soMSk7CisgICAgY2hhckNvdW50cy5wdXNoX2JhY2soMS4yNWYpOworICB9IGVsc2UgeworICAgIGNoYXJDb3VudHMucHVzaF9iYWNrKDEpOworICAgIGNoYXJDb3VudHMucHVzaF9iYWNrKDIpOworICAgIGNoYXJDb3VudHMucHVzaF9iYWNrKDIpOworICAgIGNoYXJDb3VudHMucHVzaF9iYWNrKDIpOworICAgIGNoYXJDb3VudHMucHVzaF9iYWNrKDIpOworICAgIGNoYXJDb3VudHMucHVzaF9iYWNrKDIuMjVmKTsKKyAgICBjaGFyQ291bnRzW2N1cnJlbnRNb2RlXSA9IDA7CisgIH0KKyAgaW50MzJfdCBjaGFyc1Byb2Nlc3NlZCA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgaWYgKChzdGFydHBvcyArIGNoYXJzUHJvY2Vzc2VkKSA9PQorICAgICAgICBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxpbnQzMl90Pihtc2cuR2V0TGVuZ3RoKCkpKSB7CisgICAgICBpbnQzMl90IG1pbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpOworICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbWlucyg2KTsKKyAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGludENoYXJDb3VudHMoNik7CisgICAgICBtaW4gPSBmaW5kTWluaW11bXMoY2hhckNvdW50cywgaW50Q2hhckNvdW50cywgbWluLCBtaW5zKTsKKyAgICAgIGludDMyX3QgbWluQ291bnQgPSBnZXRNaW5pbXVtQ291bnQobWlucyk7CisgICAgICBpZiAoaW50Q2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSA9PSBtaW4pIHsKKyAgICAgICAgcmV0dXJuIEFTQ0lJX0VOQ09EQVRJT047CisgICAgICB9CisgICAgICBpZiAobWluQ291bnQgPT0gMSAmJiBtaW5zW0JBU0UyNTZfRU5DT0RBVElPTl0gPiAwKSB7CisgICAgICAgIHJldHVybiBCQVNFMjU2X0VOQ09EQVRJT047CisgICAgICB9CisgICAgICBpZiAobWluQ291bnQgPT0gMSAmJiBtaW5zW0VESUZBQ1RfRU5DT0RBVElPTl0gPiAwKSB7CisgICAgICAgIHJldHVybiBFRElGQUNUX0VOQ09EQVRJT047CisgICAgICB9CisgICAgICBpZiAobWluQ291bnQgPT0gMSAmJiBtaW5zW1RFWFRfRU5DT0RBVElPTl0gPiAwKSB7CisgICAgICAgIHJldHVybiBURVhUX0VOQ09EQVRJT047CisgICAgICB9CisgICAgICBpZiAobWluQ291bnQgPT0gMSAmJiBtaW5zW1gxMl9FTkNPREFUSU9OXSA+IDApIHsKKyAgICAgICAgcmV0dXJuIFgxMl9FTkNPREFUSU9OOworICAgICAgfQorICAgICAgcmV0dXJuIEM0MF9FTkNPREFUSU9OOworICAgIH0KKyAgICB3Y2hhcl90IGMgPSBtc2dbc3RhcnRwb3MgKyBjaGFyc1Byb2Nlc3NlZF07CisgICAgY2hhcnNQcm9jZXNzZWQrKzsKKyAgICBpZiAoaXNEaWdpdChjKSkgeworICAgICAgY2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSArPSAwLjU7CisgICAgfSBlbHNlIGlmIChpc0V4dGVuZGVkQVNDSUkoYykpIHsKKyAgICAgIGNoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gPSAoZmxvYXQpY2VpbChjaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dKTsKKyAgICAgIGNoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gKz0gMjsKKyAgICB9IGVsc2UgeworICAgICAgY2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSA9IChmbG9hdCljZWlsKGNoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0pOworICAgICAgY2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSsrOworICAgIH0KKyAgICBpZiAoaXNOYXRpdmVDNDAoYykpIHsKKyAgICAgIGNoYXJDb3VudHNbQzQwX0VOQ09EQVRJT05dICs9IDIuMGYgLyAzLjBmOworICAgIH0gZWxzZSBpZiAoaXNFeHRlbmRlZEFTQ0lJKGMpKSB7CisgICAgICBjaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSArPSA4LjBmIC8gMy4wZjsKKyAgICB9IGVsc2UgeworICAgICAgY2hhckNvdW50c1tDNDBfRU5DT0RBVElPTl0gKz0gNC4wZiAvIDMuMGY7CisgICAgfQorICAgIGlmIChpc05hdGl2ZVRleHQoYykpIHsKKyAgICAgIGNoYXJDb3VudHNbVEVYVF9FTkNPREFUSU9OXSArPSAyLjBmIC8gMy4wZjsKKyAgICB9IGVsc2UgaWYgKGlzRXh0ZW5kZWRBU0NJSShjKSkgeworICAgICAgY2hhckNvdW50c1tURVhUX0VOQ09EQVRJT05dICs9IDguMGYgLyAzLjBmOworICAgIH0gZWxzZSB7CisgICAgICBjaGFyQ291bnRzW1RFWFRfRU5DT0RBVElPTl0gKz0gNC4wZiAvIDMuMGY7CisgICAgfQorICAgIGlmIChpc05hdGl2ZVgxMihjKSkgeworICAgICAgY2hhckNvdW50c1tYMTJfRU5DT0RBVElPTl0gKz0gMi4wZiAvIDMuMGY7CisgICAgfSBlbHNlIGlmIChpc0V4dGVuZGVkQVNDSUkoYykpIHsKKyAgICAgIGNoYXJDb3VudHNbWDEyX0VOQ09EQVRJT05dICs9IDEzLjBmIC8gMy4wZjsKKyAgICB9IGVsc2UgeworICAgICAgY2hhckNvdW50c1tYMTJfRU5DT0RBVElPTl0gKz0gMTAuMGYgLyAzLjBmOworICAgIH0KKyAgICBpZiAoaXNOYXRpdmVFRElGQUNUKGMpKSB7CisgICAgICBjaGFyQ291bnRzW0VESUZBQ1RfRU5DT0RBVElPTl0gKz0gMy4wZiAvIDQuMGY7CisgICAgfSBlbHNlIGlmIChpc0V4dGVuZGVkQVNDSUkoYykpIHsKKyAgICAgIGNoYXJDb3VudHNbRURJRkFDVF9FTkNPREFUSU9OXSArPSAxNy4wZiAvIDQuMGY7CisgICAgfSBlbHNlIHsKKyAgICAgIGNoYXJDb3VudHNbRURJRkFDVF9FTkNPREFUSU9OXSArPSAxMy4wZiAvIDQuMGY7CisgICAgfQorICAgIGNoYXJDb3VudHNbQkFTRTI1Nl9FTkNPREFUSU9OXSsrOworICAgIGlmIChjaGFyc1Byb2Nlc3NlZCA+PSA0KSB7CisgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBpbnRDaGFyQ291bnRzKDYpOworICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbWlucyg2KTsKKyAgICAgIGZpbmRNaW5pbXVtcyhjaGFyQ291bnRzLCBpbnRDaGFyQ291bnRzLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpLCBtaW5zKTsKKyAgICAgIGludDMyX3QgbWluQ291bnQgPSBnZXRNaW5pbXVtQ291bnQobWlucyk7CisgICAgICBpZiAoaW50Q2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSA8IGludENoYXJDb3VudHNbQkFTRTI1Nl9FTkNPREFUSU9OXSAmJgorICAgICAgICAgIGludENoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gPCBpbnRDaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSAmJgorICAgICAgICAgIGludENoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gPCBpbnRDaGFyQ291bnRzW1RFWFRfRU5DT0RBVElPTl0gJiYKKyAgICAgICAgICBpbnRDaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dIDwgaW50Q2hhckNvdW50c1tYMTJfRU5DT0RBVElPTl0gJiYKKyAgICAgICAgICBpbnRDaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dIDwgaW50Q2hhckNvdW50c1tFRElGQUNUX0VOQ09EQVRJT05dKSB7CisgICAgICAgIHJldHVybiBBU0NJSV9FTkNPREFUSU9OOworICAgICAgfQorICAgICAgaWYgKGludENoYXJDb3VudHNbQkFTRTI1Nl9FTkNPREFUSU9OXSA8IGludENoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gfHwKKyAgICAgICAgICAobWluc1tDNDBfRU5DT0RBVElPTl0gKyBtaW5zW1RFWFRfRU5DT0RBVElPTl0gKyBtaW5zW1gxMl9FTkNPREFUSU9OXSArCisgICAgICAgICAgIG1pbnNbRURJRkFDVF9FTkNPREFUSU9OXSkgPT0gMCkgeworICAgICAgICByZXR1cm4gQkFTRTI1Nl9FTkNPREFUSU9OOworICAgICAgfQorICAgICAgaWYgKG1pbkNvdW50ID09IDEgJiYgbWluc1tFRElGQUNUX0VOQ09EQVRJT05dID4gMCkgeworICAgICAgICByZXR1cm4gRURJRkFDVF9FTkNPREFUSU9OOworICAgICAgfQorICAgICAgaWYgKG1pbkNvdW50ID09IDEgJiYgbWluc1tURVhUX0VOQ09EQVRJT05dID4gMCkgeworICAgICAgICByZXR1cm4gVEVYVF9FTkNPREFUSU9OOworICAgICAgfQorICAgICAgaWYgKG1pbkNvdW50ID09IDEgJiYgbWluc1tYMTJfRU5DT0RBVElPTl0gPiAwKSB7CisgICAgICAgIHJldHVybiBYMTJfRU5DT0RBVElPTjsKKyAgICAgIH0KKyAgICAgIGlmIChpbnRDaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSArIDEgPCBpbnRDaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dICYmCisgICAgICAgICAgaW50Q2hhckNvdW50c1tDNDBfRU5DT0RBVElPTl0gKyAxIDwKKyAgICAgICAgICAgICAgaW50Q2hhckNvdW50c1tCQVNFMjU2X0VOQ09EQVRJT05dICYmCisgICAgICAgICAgaW50Q2hhckNvdW50c1tDNDBfRU5DT0RBVElPTl0gKyAxIDwKKyAgICAgICAgICAgICAgaW50Q2hhckNvdW50c1tFRElGQUNUX0VOQ09EQVRJT05dICYmCisgICAgICAgICAgaW50Q2hhckNvdW50c1tDNDBfRU5DT0RBVElPTl0gKyAxIDwgaW50Q2hhckNvdW50c1tURVhUX0VOQ09EQVRJT05dKSB7CisgICAgICAgIGlmIChpbnRDaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSA8IGludENoYXJDb3VudHNbWDEyX0VOQ09EQVRJT05dKSB7CisgICAgICAgICAgcmV0dXJuIEM0MF9FTkNPREFUSU9OOworICAgICAgICB9CisgICAgICAgIGlmIChpbnRDaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSA9PSBpbnRDaGFyQ291bnRzW1gxMl9FTkNPREFUSU9OXSkgeworICAgICAgICAgIGludDMyX3QgcCA9IHN0YXJ0cG9zICsgY2hhcnNQcm9jZXNzZWQgKyAxOworICAgICAgICAgIGludDMyX3QgY2hlY2tlZF9sZW5ndGggPQorICAgICAgICAgICAgICBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxpbnQzMl90Pihtc2cuR2V0TGVuZ3RoKCkpOworICAgICAgICAgIHdoaWxlIChwIDwgY2hlY2tlZF9sZW5ndGgpIHsKKyAgICAgICAgICAgIHdjaGFyX3QgdGMgPSBtc2dbcF07CisgICAgICAgICAgICBpZiAoaXNYMTJUZXJtU2VwKHRjKSkgeworICAgICAgICAgICAgICByZXR1cm4gWDEyX0VOQ09EQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWlzTmF0aXZlWDEyKHRjKSkgeworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHArKzsKKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIEM0MF9FTkNPREFUSU9OOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9Citib29sIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc0RpZ2l0KHdjaGFyX3QgY2gpIHsKKyAgcmV0dXJuIGNoID49ICcwJyAmJiBjaCA8PSAnOSc7Cit9Citib29sIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc0V4dGVuZGVkQVNDSUkod2NoYXJfdCBjaCkgeworICByZXR1cm4gY2ggPj0gMTI4ICYmIGNoIDw9IDI1NTsKK30KK2ludDMyX3QgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmRldGVybWluZUNvbnNlY3V0aXZlRGlnaXRDb3VudChXaWRlU3RyaW5nIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0cG9zKSB7CisgIGludDMyX3QgY291bnQgPSAwOworICBpbnQzMl90IGxlbiA9IG1zZy5HZXRMZW5ndGgoKTsKKyAgaW50MzJfdCBpZHggPSBzdGFydHBvczsKKyAgaWYgKGlkeCA8IGxlbikgeworICAgIHdjaGFyX3QgY2ggPSBtc2dbaWR4XTsKKyAgICB3aGlsZSAoaXNEaWdpdChjaCkgJiYgaWR4IDwgbGVuKSB7CisgICAgICBjb3VudCsrOworICAgICAgaWR4Kys7CisgICAgICBpZiAoaWR4IDwgbGVuKSB7CisgICAgICAgIGNoID0gbXNnW2lkeF07CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBjb3VudDsKK30KKword2NoYXJfdCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6cmFuZG9taXplMjUzU3RhdGUod2NoYXJfdCBjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZXdvcmRQb3NpdGlvbikgeworICBpbnQzMl90IHBzZXVkb1JhbmRvbSA9ICgoMTQ5ICogY29kZXdvcmRQb3NpdGlvbikgJSAyNTMpICsgMTsKKyAgaW50MzJfdCB0ZW1wVmFyaWFibGUgPSBjaCArIHBzZXVkb1JhbmRvbTsKKyAgcmV0dXJuIHRlbXBWYXJpYWJsZSA8PSAyNTQgPyAod2NoYXJfdCl0ZW1wVmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAod2NoYXJfdCkodGVtcFZhcmlhYmxlIC0gMjU0KTsKK30KK2ludDMyX3QgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmZpbmRNaW5pbXVtcyhzdGQ6OnZlY3RvcjxmbG9hdD4mIGNoYXJDb3VudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGludENoYXJDb3VudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4mIG1pbnMpIHsKKyAgZm9yIChzaXplX3QgbCA9IDA7IGwgPCBtaW5zLnNpemUoKTsgbCsrKQorICAgIG1pbnNbbF0gPSAwOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgaW50Q2hhckNvdW50c1tpXSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGNlaWwoY2hhckNvdW50c1tpXSkpOworICAgIGludDMyX3QgY3VycmVudCA9IGludENoYXJDb3VudHNbaV07CisgICAgaWYgKG1pbiA+IGN1cnJlbnQpIHsKKyAgICAgIG1pbiA9IGN1cnJlbnQ7CisgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1pbnMuc2l6ZSgpOyBqKyspCisgICAgICAgIG1pbnNbal0gPSAwOworICAgIH0KKyAgICBpZiAobWluID09IGN1cnJlbnQpCisgICAgICBtaW5zW2ldKys7CisgIH0KKyAgcmV0dXJuIG1pbjsKK30KK2ludDMyX3QgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmdldE1pbmltdW1Db3VudChzdGQ6OnZlY3Rvcjx1aW50OF90PiYgbWlucykgeworICBpbnQzMl90IG1pbkNvdW50ID0gMDsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgbWluQ291bnQgKz0gbWluc1tpXTsKKyAgfQorICByZXR1cm4gbWluQ291bnQ7Cit9Citib29sIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc05hdGl2ZUM0MCh3Y2hhcl90IGNoKSB7CisgIHJldHVybiAoY2ggPT0gJyAnKSB8fCAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgfHwgKGNoID49ICdBJyAmJiBjaCA8PSAnWicpOworfQorYm9vbCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aXNOYXRpdmVUZXh0KHdjaGFyX3QgY2gpIHsKKyAgcmV0dXJuIChjaCA9PSAnICcpIHx8IChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB8fCAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6Jyk7Cit9Citib29sIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc05hdGl2ZVgxMih3Y2hhcl90IGNoKSB7CisgIHJldHVybiBpc1gxMlRlcm1TZXAoY2gpIHx8IChjaCA9PSAnICcpIHx8IChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB8fAorICAgICAgICAgKGNoID49ICdBJyAmJiBjaCA8PSAnWicpOworfQorYm9vbCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aXNYMTJUZXJtU2VwKHdjaGFyX3QgY2gpIHsKKyAgcmV0dXJuIChjaCA9PSAnXHInKSB8fCAoY2ggPT0gJyonKSB8fCAoY2ggPT0gJz4nKTsKK30KK2Jvb2wgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlzTmF0aXZlRURJRkFDVCh3Y2hhcl90IGNoKSB7CisgIHJldHVybiBjaCA+PSAnICcgJiYgY2ggPD0gJ14nOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfSGlnaExldmVsRW5jb2Rlci5oIGIvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfSGlnaExldmVsRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwY2ZjOGMKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19IaWdoTGV2ZWxFbmNvZGVyLmgKQEAgLTAsMCArMSw3MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX0hJR0hMRVZFTEVOQ09ERVJfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfSElHSExFVkVMRU5DT0RFUl9IXworCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC93aWRlc3RyaW5nLmgiCisKKyNkZWZpbmUgQVNDSUlfRU5DT0RBVElPTiAwCisjZGVmaW5lIEM0MF9FTkNPREFUSU9OIDEKKyNkZWZpbmUgVEVYVF9FTkNPREFUSU9OIDIKKyNkZWZpbmUgWDEyX0VOQ09EQVRJT04gMworI2RlZmluZSBFRElGQUNUX0VOQ09EQVRJT04gNAorI2RlZmluZSBCQVNFMjU2X0VOQ09EQVRJT04gNQorCitjbGFzcyBDQkNfSGlnaExldmVsRW5jb2RlciB7CisgcHVibGljOgorICBDQkNfSGlnaExldmVsRW5jb2RlcigpOworICB+Q0JDX0hpZ2hMZXZlbEVuY29kZXIoKTsKKworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZ2V0Qnl0ZXNGb3JNZXNzYWdlKFdpZGVTdHJpbmcgbXNnKTsKKworICBzdGF0aWMgV2lkZVN0cmluZyBlbmNvZGVIaWdoTGV2ZWwoV2lkZVN0cmluZyBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nIGVjTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG93UmVjdGFuZ3VsYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKKyAgc3RhdGljIGludDMyX3QgbG9va0FoZWFkVGVzdChXaWRlU3RyaW5nIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0cG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY3VycmVudE1vZGUpOworICBzdGF0aWMgYm9vbCBpc0RpZ2l0KHdjaGFyX3QgY2gpOworICBzdGF0aWMgYm9vbCBpc0V4dGVuZGVkQVNDSUkod2NoYXJfdCBjaCk7CisgIHN0YXRpYyBpbnQzMl90IGRldGVybWluZUNvbnNlY3V0aXZlRGlnaXRDb3VudChXaWRlU3RyaW5nIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MpOworCisgIHN0YXRpYyBjb25zdCB3Y2hhcl90IExBVENIX1RPX0M0MDsKKyAgc3RhdGljIGNvbnN0IHdjaGFyX3QgTEFUQ0hfVE9fQkFTRTI1NjsKKyAgc3RhdGljIGNvbnN0IHdjaGFyX3QgVVBQRVJfU0hJRlQ7CisgIHN0YXRpYyBjb25zdCB3Y2hhcl90IExBVENIX1RPX0FOU0lYMTI7CisgIHN0YXRpYyBjb25zdCB3Y2hhcl90IExBVENIX1RPX1RFWFQ7CisgIHN0YXRpYyBjb25zdCB3Y2hhcl90IExBVENIX1RPX0VESUZBQ1Q7CisgIHN0YXRpYyBjb25zdCB3Y2hhcl90IEM0MF9VTkxBVENIOworICBzdGF0aWMgY29uc3Qgd2NoYXJfdCBYMTJfVU5MQVRDSDsKKworIHByaXZhdGU6CisgIHN0YXRpYyB3Y2hhcl90IHJhbmRvbWl6ZTI1M1N0YXRlKHdjaGFyX3QgY2gsIGludDMyX3QgY29kZXdvcmRQb3NpdGlvbik7CisgIHN0YXRpYyBpbnQzMl90IGZpbmRNaW5pbXVtcyhzdGQ6OnZlY3RvcjxmbG9hdD4mIGNoYXJDb3VudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgaW50Q2hhckNvdW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4mIG1pbnMpOworICBzdGF0aWMgaW50MzJfdCBnZXRNaW5pbXVtQ291bnQoc3RkOjp2ZWN0b3I8dWludDhfdD4mIG1pbnMpOworICBzdGF0aWMgYm9vbCBpc05hdGl2ZUM0MCh3Y2hhcl90IGNoKTsKKyAgc3RhdGljIGJvb2wgaXNOYXRpdmVUZXh0KHdjaGFyX3QgY2gpOworICBzdGF0aWMgYm9vbCBpc05hdGl2ZVgxMih3Y2hhcl90IGNoKTsKKyAgc3RhdGljIGJvb2wgaXNYMTJUZXJtU2VwKHdjaGFyX3QgY2gpOworICBzdGF0aWMgYm9vbCBpc05hdGl2ZUVESUZBQ1Qod2NoYXJfdCBjaCk7CisKKyAgc3RhdGljIGNvbnN0IHdjaGFyX3QgUEFEOworICBzdGF0aWMgY29uc3Qgd2NoYXJfdCBNQUNST18wNTsKKyAgc3RhdGljIGNvbnN0IHdjaGFyX3QgTUFDUk9fMDY7CisgIHN0YXRpYyBjb25zdCB3Y2hhcl90IE1BQ1JPXzA1X0hFQURFUltdOworICBzdGF0aWMgY29uc3Qgd2NoYXJfdCBNQUNST18wNl9IRUFERVJbXTsKKyAgc3RhdGljIGNvbnN0IHdjaGFyX3QgTUFDUk9fVFJBSUxFUjsKKworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtX2J5dGVhcnJheTsKK307CisKKyNlbmRpZiAgLy8gRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfSElHSExFVkVMRU5DT0RFUl9IXwpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sSW5mby5jcHAgYi9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGQ5OWQyCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sSW5mby5jcHAKQEAgLTAsMCArMSwxOTQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKKy8qCisgKiBDb3B5cmlnaHQgMjAwNiBKZXJlbWlhcyBNYWVya2kKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uaCIKKworI2luY2x1ZGUgImZ4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL3V0aWxzLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IHNpemVfdCBrU3ltYm9sc0NvdW50ID0gMzA7CisKK0NCQ19TeW1ib2xJbmZvKiBnX3N5bWJvbHNba1N5bWJvbHNDb3VudF0gPSB7CisgICAgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwKKyAgICBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLAorICAgIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsCisgICAgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cn07CisKK30gIC8vIG5hbWVzcGFjZQorCit2b2lkIENCQ19TeW1ib2xJbmZvOjpJbml0aWFsaXplKCkgeworICBnX3N5bWJvbHNbMF0gPSBuZXcgQ0JDX1N5bWJvbEluZm8oMywgNSwgOCwgOCwgMSk7CisgIGdfc3ltYm9sc1sxXSA9IG5ldyBDQkNfU3ltYm9sSW5mbyg1LCA3LCAxMCwgMTAsIDEpOworICBnX3N5bWJvbHNbMl0gPSBuZXcgQ0JDX1N5bWJvbEluZm8oNSwgNywgMTYsIDYsIDEpOworICBnX3N5bWJvbHNbM10gPSBuZXcgQ0JDX1N5bWJvbEluZm8oOCwgMTAsIDEyLCAxMiwgMSk7CisgIGdfc3ltYm9sc1s0XSA9IG5ldyBDQkNfU3ltYm9sSW5mbygxMCwgMTEsIDE0LCA2LCAyKTsKKyAgZ19zeW1ib2xzWzVdID0gbmV3IENCQ19TeW1ib2xJbmZvKDEyLCAxMiwgMTQsIDE0LCAxKTsKKyAgZ19zeW1ib2xzWzZdID0gbmV3IENCQ19TeW1ib2xJbmZvKDE2LCAxNCwgMjQsIDEwLCAxKTsKKyAgZ19zeW1ib2xzWzddID0gbmV3IENCQ19TeW1ib2xJbmZvKDE4LCAxNCwgMTYsIDE2LCAxKTsKKyAgZ19zeW1ib2xzWzhdID0gbmV3IENCQ19TeW1ib2xJbmZvKDIyLCAxOCwgMTgsIDE4LCAxKTsKKyAgZ19zeW1ib2xzWzldID0gbmV3IENCQ19TeW1ib2xJbmZvKDIyLCAxOCwgMTYsIDEwLCAyKTsKKyAgZ19zeW1ib2xzWzEwXSA9IG5ldyBDQkNfU3ltYm9sSW5mbygzMCwgMjAsIDIwLCAyMCwgMSk7CisgIGdfc3ltYm9sc1sxMV0gPSBuZXcgQ0JDX1N5bWJvbEluZm8oMzIsIDI0LCAxNiwgMTQsIDIpOworICBnX3N5bWJvbHNbMTJdID0gbmV3IENCQ19TeW1ib2xJbmZvKDM2LCAyNCwgMjIsIDIyLCAxKTsKKyAgZ19zeW1ib2xzWzEzXSA9IG5ldyBDQkNfU3ltYm9sSW5mbyg0NCwgMjgsIDI0LCAyNCwgMSk7CisgIGdfc3ltYm9sc1sxNF0gPSBuZXcgQ0JDX1N5bWJvbEluZm8oNDksIDI4LCAyMiwgMTQsIDIpOworICBnX3N5bWJvbHNbMTVdID0gbmV3IENCQ19TeW1ib2xJbmZvKDYyLCAzNiwgMTQsIDE0LCA0KTsKKyAgZ19zeW1ib2xzWzE2XSA9IG5ldyBDQkNfU3ltYm9sSW5mbyg4NiwgNDIsIDE2LCAxNiwgNCk7CisgIGdfc3ltYm9sc1sxN10gPSBuZXcgQ0JDX1N5bWJvbEluZm8oMTE0LCA0OCwgMTgsIDE4LCA0KTsKKyAgZ19zeW1ib2xzWzE4XSA9IG5ldyBDQkNfU3ltYm9sSW5mbygxNDQsIDU2LCAyMCwgMjAsIDQpOworICBnX3N5bWJvbHNbMTldID0gbmV3IENCQ19TeW1ib2xJbmZvKDE3NCwgNjgsIDIyLCAyMiwgNCk7CisgIGdfc3ltYm9sc1syMF0gPSBuZXcgQ0JDX1N5bWJvbEluZm8oMjA0LCA4NCwgMjQsIDI0LCA0LCAxMDIsIDQyKTsKKyAgZ19zeW1ib2xzWzIxXSA9IG5ldyBDQkNfU3ltYm9sSW5mbygyODAsIDExMiwgMTQsIDE0LCAxNiwgMTQwLCA1Nik7CisgIGdfc3ltYm9sc1syMl0gPSBuZXcgQ0JDX1N5bWJvbEluZm8oMzY4LCAxNDQsIDE2LCAxNiwgMTYsIDkyLCAzNik7CisgIGdfc3ltYm9sc1syM10gPSBuZXcgQ0JDX1N5bWJvbEluZm8oNDU2LCAxOTIsIDE4LCAxOCwgMTYsIDExNCwgNDgpOworICBnX3N5bWJvbHNbMjRdID0gbmV3IENCQ19TeW1ib2xJbmZvKDU3NiwgMjI0LCAyMCwgMjAsIDE2LCAxNDQsIDU2KTsKKyAgZ19zeW1ib2xzWzI1XSA9IG5ldyBDQkNfU3ltYm9sSW5mbyg2OTYsIDI3MiwgMjIsIDIyLCAxNiwgMTc0LCA2OCk7CisgIGdfc3ltYm9sc1syNl0gPSBuZXcgQ0JDX1N5bWJvbEluZm8oODE2LCAzMzYsIDI0LCAyNCwgMTYsIDEzNiwgNTYpOworICBnX3N5bWJvbHNbMjddID0gbmV3IENCQ19TeW1ib2xJbmZvKDEwNTAsIDQwOCwgMTgsIDE4LCAzNiwgMTc1LCA2OCk7CisgIGdfc3ltYm9sc1syOF0gPSBuZXcgQ0JDX1N5bWJvbEluZm8oMTMwNCwgNDk2LCAyMCwgMjAsIDM2LCAxNjMsIDYyKTsKKyAgZ19zeW1ib2xzWzI5XSA9IG5ldyBDQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQoKTsKK30KKwordm9pZCBDQkNfU3ltYm9sSW5mbzo6RmluYWxpemUoKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga1N5bWJvbHNDb3VudDsgaSsrKSB7CisgICAgZGVsZXRlIGdfc3ltYm9sc1tpXTsKKyAgICBnX3N5bWJvbHNbaV0gPSBudWxscHRyOworICB9Cit9CisKK0NCQ19TeW1ib2xJbmZvOjpDQkNfU3ltYm9sSW5mbyhpbnQzMl90IGRhdGFDYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVycm9yQ29kZXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF0cml4V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXRyaXhIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXRhUmVnaW9ucykKKyAgICA6IENCQ19TeW1ib2xJbmZvKGRhdGFDYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZXdvcmRzLAorICAgICAgICAgICAgICAgICAgICAgbWF0cml4V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICBtYXRyaXhIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICBkYXRhUmVnaW9ucywKKyAgICAgICAgICAgICAgICAgICAgIGRhdGFDYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZXdvcmRzKSB7fQorCitDQkNfU3ltYm9sSW5mbzo6Q0JDX1N5bWJvbEluZm8oaW50MzJfdCBkYXRhQ2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlcnJvckNvZGV3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1hdHJpeFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF0cml4SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGF0YVJlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByc0Jsb2NrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJzQmxvY2tFcnJvcikKKyAgICA6IG1fcmVjdGFuZ3VsYXIobWF0cml4V2lkdGggIT0gbWF0cml4SGVpZ2h0KSwKKyAgICAgIG1fZGF0YUNhcGFjaXR5KGRhdGFDYXBhY2l0eSksCisgICAgICBtX2Vycm9yQ29kZXdvcmRzKGVycm9yQ29kZXdvcmRzKSwKKyAgICAgIG1fbWF0cml4V2lkdGgobWF0cml4V2lkdGgpLAorICAgICAgbV9tYXRyaXhIZWlnaHQobWF0cml4SGVpZ2h0KSwKKyAgICAgIG1fZGF0YVJlZ2lvbnMoZGF0YVJlZ2lvbnMpLAorICAgICAgbV9yc0Jsb2NrRGF0YShyc0Jsb2NrRGF0YSksCisgICAgICBtX3JzQmxvY2tFcnJvcihyc0Jsb2NrRXJyb3IpIHt9CisKK0NCQ19TeW1ib2xJbmZvOjp+Q0JDX1N5bWJvbEluZm8oKSB7fQorCitDQkNfU3ltYm9sSW5mbyogQ0JDX1N5bWJvbEluZm86Omxvb2t1cChpbnQzMl90IGRhdGFDb2Rld29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG93UmVjdGFuZ3VsYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga1N5bWJvbHNDb3VudDsgaSsrKSB7CisgICAgQ0JDX1N5bWJvbEluZm8qIHN5bWJvbCA9IGdfc3ltYm9sc1tpXTsKKyAgICBpZiAoc3ltYm9sLT5tX3JlY3Rhbmd1bGFyICYmICFhbGxvd1JlY3Rhbmd1bGFyKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoZGF0YUNvZGV3b3JkcyA8PSBzeW1ib2wtPmRhdGFDYXBhY2l0eSgpKQorICAgICAgcmV0dXJuIHN5bWJvbDsKKyAgfQorICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsRGF0YUNvZGV3b3JkczsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2ludDMyX3QgQ0JDX1N5bWJvbEluZm86OmdldEhvcml6b250YWxEYXRhUmVnaW9ucygpIGNvbnN0IHsKKyAgc3dpdGNoIChtX2RhdGFSZWdpb25zKSB7CisgICAgY2FzZSAxOgorICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSAyOgorICAgICAgcmV0dXJuIDI7CisgICAgY2FzZSA0OgorICAgICAgcmV0dXJuIDI7CisgICAgY2FzZSAxNjoKKyAgICAgIHJldHVybiA0OworICAgIGNhc2UgMzY6CisgICAgICByZXR1cm4gNjsKKyAgICBkZWZhdWx0OgorICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgcmV0dXJuIDA7CisgIH0KK30KKworaW50MzJfdCBDQkNfU3ltYm9sSW5mbzo6Z2V0VmVydGljYWxEYXRhUmVnaW9ucygpIGNvbnN0IHsKKyAgc3dpdGNoIChtX2RhdGFSZWdpb25zKSB7CisgICAgY2FzZSAxOgorICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSAyOgorICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSA0OgorICAgICAgcmV0dXJuIDI7CisgICAgY2FzZSAxNjoKKyAgICAgIHJldHVybiA0OworICAgIGNhc2UgMzY6CisgICAgICByZXR1cm4gNjsKKyAgICBkZWZhdWx0OgorICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgcmV0dXJuIDA7CisgIH0KK30KKworaW50MzJfdCBDQkNfU3ltYm9sSW5mbzo6Z2V0U3ltYm9sRGF0YVdpZHRoKCkgY29uc3QgeworICByZXR1cm4gZ2V0SG9yaXpvbnRhbERhdGFSZWdpb25zKCkgKiBtX21hdHJpeFdpZHRoOworfQorCitpbnQzMl90IENCQ19TeW1ib2xJbmZvOjpnZXRTeW1ib2xEYXRhSGVpZ2h0KCkgY29uc3QgeworICByZXR1cm4gZ2V0VmVydGljYWxEYXRhUmVnaW9ucygpICogbV9tYXRyaXhIZWlnaHQ7Cit9CisKK2ludDMyX3QgQ0JDX1N5bWJvbEluZm86OmdldFN5bWJvbFdpZHRoKCkgY29uc3QgeworICByZXR1cm4gZ2V0U3ltYm9sRGF0YVdpZHRoKCkgKyAoZ2V0SG9yaXpvbnRhbERhdGFSZWdpb25zKCkgKiAyKTsKK30KKworaW50MzJfdCBDQkNfU3ltYm9sSW5mbzo6Z2V0U3ltYm9sSGVpZ2h0KCkgY29uc3QgeworICByZXR1cm4gZ2V0U3ltYm9sRGF0YUhlaWdodCgpICsgKGdldFZlcnRpY2FsRGF0YVJlZ2lvbnMoKSAqIDIpOworfQorCitpbnQzMl90IENCQ19TeW1ib2xJbmZvOjpnZXRDb2Rld29yZENvdW50KCkgY29uc3QgeworICByZXR1cm4gbV9kYXRhQ2FwYWNpdHkgKyBtX2Vycm9yQ29kZXdvcmRzOworfQorCitpbnQzMl90IENCQ19TeW1ib2xJbmZvOjpnZXRJbnRlcmxlYXZlZEJsb2NrQ291bnQoKSBjb25zdCB7CisgIHJldHVybiBtX2RhdGFDYXBhY2l0eSAvIG1fcnNCbG9ja0RhdGE7Cit9CisKK2ludDMyX3QgQ0JDX1N5bWJvbEluZm86OmdldERhdGFMZW5ndGhGb3JJbnRlcmxlYXZlZEJsb2NrKGludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcnNCbG9ja0RhdGE7Cit9CisKK2ludDMyX3QgQ0JDX1N5bWJvbEluZm86OmdldEVycm9yTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jayhpbnQzMl90IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBtX3JzQmxvY2tFcnJvcjsKK30KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uaCBiL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTNlMjRjCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sSW5mby5oCkBAIC0wLDAgKzEsNjYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEJBUkNPREVfREFUQU1BVFJJWF9CQ19TWU1CT0xJTkZPX0hfCisjZGVmaW5lIEZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX1NZTUJPTElORk9fSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKworY2xhc3MgQ0JDX1N5bWJvbEluZm8geworIHB1YmxpYzoKKyAgQ0JDX1N5bWJvbEluZm8oaW50MzJfdCBkYXRhQ2FwYWNpdHksCisgICAgICAgICAgICAgICAgIGludDMyX3QgZXJyb3JDb2Rld29yZHMsCisgICAgICAgICAgICAgICAgIGludDMyX3QgbWF0cml4V2lkdGgsCisgICAgICAgICAgICAgICAgIGludDMyX3QgbWF0cml4SGVpZ2h0LAorICAgICAgICAgICAgICAgICBpbnQzMl90IGRhdGFSZWdpb25zKTsKKyAgdmlydHVhbCB+Q0JDX1N5bWJvbEluZm8oKTsKKworICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKCk7CisgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7CisgIHN0YXRpYyB2b2lkIG92ZXJyaWRlU3ltYm9sU2V0KENCQ19TeW1ib2xJbmZvKiBvdmVycmlkZSk7CisgIHN0YXRpYyBDQkNfU3ltYm9sSW5mbyogbG9va3VwKGludDMyX3QgZGF0YUNvZGV3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd1JlY3Rhbmd1bGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKKworICBpbnQzMl90IGdldFN5bWJvbERhdGFXaWR0aCgpIGNvbnN0OworICBpbnQzMl90IGdldFN5bWJvbERhdGFIZWlnaHQoKSBjb25zdDsKKyAgaW50MzJfdCBnZXRTeW1ib2xXaWR0aCgpIGNvbnN0OworICBpbnQzMl90IGdldFN5bWJvbEhlaWdodCgpIGNvbnN0OworICBpbnQzMl90IGdldENvZGV3b3JkQ291bnQoKSBjb25zdDsKKyAgdmlydHVhbCBpbnQzMl90IGdldEludGVybGVhdmVkQmxvY2tDb3VudCgpIGNvbnN0OworICBpbnQzMl90IGdldERhdGFMZW5ndGhGb3JJbnRlcmxlYXZlZEJsb2NrKGludDMyX3QgaW5kZXgpIGNvbnN0OworICBpbnQzMl90IGdldEVycm9yTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jayhpbnQzMl90IGluZGV4KSBjb25zdDsKKworICBpbnQzMl90IGRhdGFDYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YUNhcGFjaXR5OyB9CisgIGludDMyX3QgZXJyb3JDb2Rld29yZHMoKSBjb25zdCB7IHJldHVybiBtX2Vycm9yQ29kZXdvcmRzOyB9CisgIGludDMyX3QgbWF0cml4V2lkdGgoKSBjb25zdCB7IHJldHVybiBtX21hdHJpeFdpZHRoOyB9CisgIGludDMyX3QgbWF0cml4SGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9tYXRyaXhIZWlnaHQ7IH0KKworIHByb3RlY3RlZDoKKyAgQ0JDX1N5bWJvbEluZm8oaW50MzJfdCBkYXRhQ2FwYWNpdHksCisgICAgICAgICAgICAgICAgIGludDMyX3QgZXJyb3JDb2Rld29yZHMsCisgICAgICAgICAgICAgICAgIGludDMyX3QgbWF0cml4V2lkdGgsCisgICAgICAgICAgICAgICAgIGludDMyX3QgbWF0cml4SGVpZ2h0LAorICAgICAgICAgICAgICAgICBpbnQzMl90IGRhdGFSZWdpb25zLAorICAgICAgICAgICAgICAgICBpbnQzMl90IHJzQmxvY2tEYXRhLAorICAgICAgICAgICAgICAgICBpbnQzMl90IHJzQmxvY2tFcnJvcik7CisKKyBwcml2YXRlOgorICBpbnQzMl90IGdldEhvcml6b250YWxEYXRhUmVnaW9ucygpIGNvbnN0OworICBpbnQzMl90IGdldFZlcnRpY2FsRGF0YVJlZ2lvbnMoKSBjb25zdDsKKworICBjb25zdCBib29sIG1fcmVjdGFuZ3VsYXI7CisgIGNvbnN0IGludDMyX3QgbV9kYXRhQ2FwYWNpdHk7CisgIGNvbnN0IGludDMyX3QgbV9lcnJvckNvZGV3b3JkczsKKyAgY29uc3QgaW50MzJfdCBtX21hdHJpeFdpZHRoOworICBjb25zdCBpbnQzMl90IG1fbWF0cml4SGVpZ2h0OworICBjb25zdCBpbnQzMl90IG1fZGF0YVJlZ2lvbnM7CisgIGNvbnN0IGludDMyX3QgbV9yc0Jsb2NrRGF0YTsKKyAgY29uc3QgaW50MzJfdCBtX3JzQmxvY2tFcnJvcjsKK307CisKKyNlbmRpZiAgLy8gRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfU1lNQk9MSU5GT19IXwpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfVGV4dEVuY29kZXIuY3BwIGIvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfVGV4dEVuY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ODMxMGUKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19UZXh0RW5jb2Rlci5jcHAKQEAgLTAsMCArMSw5NSBAQAorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKKy8qCisgKiBDb3B5cmlnaHQgMjAwNi0yMDA3IEplcmVtaWFzIE1hZXJraS4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX1RleHRFbmNvZGVyLmgiCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0M0MEVuY29kZXIuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2RlckNvbnRleHQuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19IaWdoTGV2ZWxFbmNvZGVyLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sSW5mby5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS91dGlscy5oIgorCitDQkNfVGV4dEVuY29kZXI6OkNCQ19UZXh0RW5jb2RlcigpIHt9CitDQkNfVGV4dEVuY29kZXI6On5DQkNfVGV4dEVuY29kZXIoKSB7fQoraW50MzJfdCBDQkNfVGV4dEVuY29kZXI6OmdldEVuY29kaW5nTW9kZSgpIHsKKyAgcmV0dXJuIFRFWFRfRU5DT0RBVElPTjsKK30KK2ludDMyX3QgQ0JDX1RleHRFbmNvZGVyOjplbmNvZGVDaGFyKHdjaGFyX3QgYywgV2lkZVN0cmluZyYgc2IsIGludDMyX3QmIGUpIHsKKyAgaWYgKGMgPT0gJyAnKSB7CisgICAgc2IgKz0gKHdjaGFyX3QpJ1wzJzsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHsKKyAgICBzYiArPSAod2NoYXJfdCkoYyAtIDQ4ICsgNCk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7CisgICAgc2IgKz0gKHdjaGFyX3QpKGMgLSA5NyArIDE0KTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoYyA8PSAweDFmKSB7CisgICAgc2IgKz0gKHdjaGFyX3QpJ1wwJzsKKyAgICBzYiArPSBjOworICAgIHJldHVybiAyOworICB9CisgIGlmIChjID49ICchJyAmJiBjIDw9ICcvJykgeworICAgIHNiICs9ICh3Y2hhcl90KSdcMSc7CisgICAgc2IgKz0gKHdjaGFyX3QpKGMgLSAzMyk7CisgICAgcmV0dXJuIDI7CisgIH0KKyAgaWYgKGMgPj0gJzonICYmIGMgPD0gJ0AnKSB7CisgICAgc2IgKz0gKHdjaGFyX3QpJ1wxJzsKKyAgICBzYiArPSAod2NoYXJfdCkoYyAtIDU4ICsgMTUpOworICAgIHJldHVybiAyOworICB9CisgIGlmIChjID49ICdbJyAmJiBjIDw9ICdfJykgeworICAgIHNiICs9ICh3Y2hhcl90KSdcMSc7CisgICAgc2IgKz0gKHdjaGFyX3QpKGMgLSA5MSArIDIyKTsKKyAgICByZXR1cm4gMjsKKyAgfQorICBpZiAoYyA9PSAweDAwNjApIHsKKyAgICBzYiArPSAod2NoYXJfdCknXDInOworICAgIHNiICs9ICh3Y2hhcl90KShjIC0gOTYpOworICAgIHJldHVybiAyOworICB9CisgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgeworICAgIHNiICs9ICh3Y2hhcl90KSdcMic7CisgICAgc2IgKz0gKHdjaGFyX3QpKGMgLSA2NSArIDEpOworICAgIHJldHVybiAyOworICB9CisgIGlmIChjID49ICd7JyAmJiBjIDw9IDB4MDA3ZikgeworICAgIHNiICs9ICh3Y2hhcl90KSdcMic7CisgICAgc2IgKz0gKHdjaGFyX3QpKGMgLSAxMjMgKyAyNyk7CisgICAgcmV0dXJuIDI7CisgIH0KKyAgaWYgKGMgPj0gMHgwMDgwKSB7CisgICAgc2IgKz0gKHdjaGFyX3QpJ1wxJzsKKyAgICBzYiArPSAod2NoYXJfdCkweDAwMWU7CisgICAgaW50MzJfdCBsZW4gPSAyOworICAgIGxlbiArPSBlbmNvZGVDaGFyKCh3Y2hhcl90KShjIC0gMTI4KSwgc2IsIGUpOworICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIGxlbjsKKyAgfQorICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7CisgIHJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1RleHRFbmNvZGVyLmggYi9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19UZXh0RW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNGNkYWYKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19UZXh0RW5jb2Rlci5oCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEJBUkNPREVfREFUQU1BVFJJWF9CQ19URVhURU5DT0RFUl9IXworI2RlZmluZSBGWEJBUkNPREVfREFUQU1BVFJJWF9CQ19URVhURU5DT0RFUl9IXworCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQzQwRW5jb2Rlci5oIgorCitjbGFzcyBDQkNfVGV4dEVuY29kZXIgOiBwdWJsaWMgQ0JDX0M0MEVuY29kZXIgeworIHB1YmxpYzoKKyAgQ0JDX1RleHRFbmNvZGVyKCk7CisgIH5DQkNfVGV4dEVuY29kZXIoKSBvdmVycmlkZTsKKworICAvLyBDQkNfQzQwRW5jb2RlcgorICBpbnQzMl90IGdldEVuY29kaW5nTW9kZSgpIG92ZXJyaWRlOworICBpbnQzMl90IGVuY29kZUNoYXIod2NoYXJfdCBjLCBXaWRlU3RyaW5nJiBzYiwgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX1RFWFRFTkNPREVSX0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19YMTJFbmNvZGVyLmNwcCBiL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1gxMkVuY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwODBhNzEKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19YMTJFbmNvZGVyLmNwcApAQCAtMCwwICsxLDEwMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgorLyoKKyAqIENvcHlyaWdodCAyMDA2LTIwMDcgSmVyZW1pYXMgTWFlcmtpLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfWDEyRW5jb2Rlci5oIgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19DNDBFbmNvZGVyLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2Rlci5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXJDb250ZXh0LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfSGlnaExldmVsRW5jb2Rlci5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvdXRpbHMuaCIKKworQ0JDX1gxMkVuY29kZXI6OkNCQ19YMTJFbmNvZGVyKCkge30KK0NCQ19YMTJFbmNvZGVyOjp+Q0JDX1gxMkVuY29kZXIoKSB7fQoraW50MzJfdCBDQkNfWDEyRW5jb2Rlcjo6Z2V0RW5jb2RpbmdNb2RlKCkgeworICByZXR1cm4gWDEyX0VOQ09EQVRJT047Cit9Cit2b2lkIENCQ19YMTJFbmNvZGVyOjpFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LCBpbnQzMl90JiBlKSB7CisgIFdpZGVTdHJpbmcgYnVmZmVyOworICB3aGlsZSAoY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpKSB7CisgICAgd2NoYXJfdCBjID0gY29udGV4dC5nZXRDdXJyZW50Q2hhcigpOworICAgIGNvbnRleHQubV9wb3MrKzsKKyAgICBlbmNvZGVDaGFyKGMsIGJ1ZmZlciwgZSk7CisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQzMl90IGNvdW50ID0gYnVmZmVyLkdldExlbmd0aCgpOworICAgIGlmICgoY291bnQgJSAzKSA9PSAwKSB7CisgICAgICB3cml0ZU5leHRUcmlwbGV0KGNvbnRleHQsIGJ1ZmZlcik7CisgICAgICBpbnQzMl90IG5ld01vZGUgPSBDQkNfSGlnaExldmVsRW5jb2Rlcjo6bG9va0FoZWFkVGVzdCgKKyAgICAgICAgICBjb250ZXh0Lm1fbXNnLCBjb250ZXh0Lm1fcG9zLCBnZXRFbmNvZGluZ01vZGUoKSk7CisgICAgICBpZiAobmV3TW9kZSAhPSBnZXRFbmNvZGluZ01vZGUoKSkgeworICAgICAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UobmV3TW9kZSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICBoYW5kbGVFT0QoY29udGV4dCwgYnVmZmVyLCBlKTsKK30KK3ZvaWQgQ0JDX1gxMkVuY29kZXI6OmhhbmRsZUVPRChDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKKyAgY29udGV4dC51cGRhdGVTeW1ib2xJbmZvKGUpOworICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7CisgICAgcmV0dXJuOworICB9CisgIGludDMyX3QgYXZhaWxhYmxlID0KKyAgICAgIGNvbnRleHQubV9zeW1ib2xJbmZvLT5kYXRhQ2FwYWNpdHkoKSAtIGNvbnRleHQuZ2V0Q29kZXdvcmRDb3VudCgpOworICBpbnQzMl90IGNvdW50ID0gYnVmZmVyLkdldExlbmd0aCgpOworICBpZiAoY291bnQgPT0gMikgeworICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6WDEyX1VOTEFUQ0gpOworICAgIGNvbnRleHQubV9wb3MgLT0gMjsKKyAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoQVNDSUlfRU5DT0RBVElPTik7CisgIH0gZWxzZSBpZiAoY291bnQgPT0gMSkgeworICAgIGNvbnRleHQubV9wb3MtLTsKKyAgICBpZiAoYXZhaWxhYmxlID4gMSkgeworICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpYMTJfVU5MQVRDSCk7CisgICAgfQorICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShBU0NJSV9FTkNPREFUSU9OKTsKKyAgfQorfQoraW50MzJfdCBDQkNfWDEyRW5jb2Rlcjo6ZW5jb2RlQ2hhcih3Y2hhcl90IGMsIFdpZGVTdHJpbmcmIHNiLCBpbnQzMl90JiBlKSB7CisgIGlmIChjID09ICdccicpIHsKKyAgICBzYiArPSAod2NoYXJfdCknXDAnOworICB9IGVsc2UgaWYgKGMgPT0gJyonKSB7CisgICAgc2IgKz0gKHdjaGFyX3QpJ1wxJzsKKyAgfSBlbHNlIGlmIChjID09ICc+JykgeworICAgIHNiICs9ICh3Y2hhcl90KSdcMic7CisgIH0gZWxzZSBpZiAoYyA9PSAnICcpIHsKKyAgICBzYiArPSAod2NoYXJfdCknXDMnOworICB9IGVsc2UgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7CisgICAgc2IgKz0gKHdjaGFyX3QpKGMgLSA0OCArIDQpOworICB9IGVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7CisgICAgc2IgKz0gKHdjaGFyX3QpKGMgLSA2NSArIDE0KTsKKyAgfSBlbHNlIHsKKyAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfWDEyRW5jb2Rlci5oIGIvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfWDEyRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNGI3OGIKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19YMTJFbmNvZGVyLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX1gxMkVOQ09ERVJfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfWDEyRU5DT0RFUl9IXworCisjaW5jbHVkZSAiZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQzQwRW5jb2Rlci5oIgorCitjbGFzcyBDQkNfWDEyRW5jb2RlciA6IHB1YmxpYyBDQkNfQzQwRW5jb2RlciB7CisgcHVibGljOgorICBDQkNfWDEyRW5jb2RlcigpOworICB+Q0JDX1gxMkVuY29kZXIoKSBvdmVycmlkZTsKKworICAvLyBDQkNfQzQwRW5jb2RlcgorICBpbnQzMl90IGdldEVuY29kaW5nTW9kZSgpIG92ZXJyaWRlOworICB2b2lkIEVuY29kZShDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsIGludDMyX3QmIGUpIG92ZXJyaWRlOworICB2b2lkIGhhbmRsZUVPRChDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsCisgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgb3ZlcnJpZGU7CisgIGludDMyX3QgZW5jb2RlQ2hhcih3Y2hhcl90IGMsIFdpZGVTdHJpbmcmIHNiLCBpbnQzMl90JiBlKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfWDEyRU5DT0RFUl9IXwpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL29uZWQvQkNfT25lRGltV3JpdGVyLmNwcCBiL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZhMjNiYgotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5jcHAKQEAgLTAsMCArMSwzNDAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBaWGluZyBhdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9kZWZhdWx0cmVuZGVyZGV2aWNlLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mb250LmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9ncmFwaHN0YXRlZGF0YS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcGF0aGRhdGEuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfdW5pY29kZWVuY29kaW5nZXguaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvQkNfV3JpdGVyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCitDQkNfT25lRGltV3JpdGVyOjpDQkNfT25lRGltV3JpdGVyKCkgeworICBtX2xvY1RleHRMb2MgPSBCQ19URVhUX0xPQ19CRUxPV0VNQkVEOworICBtX2JQcmludENoZWNrc3VtID0gdHJ1ZTsKKyAgbV9pRGF0YUxlbnRoID0gMDsKKyAgbV9iQ2FsY0NoZWNrc3VtID0gZmFsc2U7CisgIG1fcEZvbnQgPSBudWxscHRyOworICBtX2ZGb250U2l6ZSA9IDEwOworICBtX2lGb250U3R5bGUgPSAwOworICBtX2ZvbnRDb2xvciA9IDB4ZmYwMDAwMDA7CisgIG1faUNvbnRlbnRMZW4gPSAwOworICBtX2JMZWZ0UGFkZGluZyA9IGZhbHNlOworICBtX2JSaWdodFBhZGRpbmcgPSBmYWxzZTsKK30KKworQ0JDX09uZURpbVdyaXRlcjo6fkNCQ19PbmVEaW1Xcml0ZXIoKSB7fQorCit2b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlNldFByaW50Q2hlY2tzdW0oYm9vbCBjaGVja3N1bSkgeworICBtX2JQcmludENoZWNrc3VtID0gY2hlY2tzdW07Cit9CisKK3ZvaWQgQ0JDX09uZURpbVdyaXRlcjo6U2V0RGF0YUxlbmd0aChpbnQzMl90IGxlbmd0aCkgeworICBtX2lEYXRhTGVudGggPSBsZW5ndGg7Cit9CisKK3ZvaWQgQ0JDX09uZURpbVdyaXRlcjo6U2V0Q2FsY0NoZWNrc3VtKGJvb2wgc3RhdGUpIHsKKyAgbV9iQ2FsY0NoZWNrc3VtID0gc3RhdGU7Cit9CisKK2Jvb2wgQ0JDX09uZURpbVdyaXRlcjo6U2V0Rm9udChDRlhfRm9udCogY0ZvbnQpIHsKKyAgaWYgKCFjRm9udCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbV9wRm9udCA9IGNGb250OworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDQkNfT25lRGltV3JpdGVyOjpTZXRGb250U2l6ZShmbG9hdCBzaXplKSB7CisgIG1fZkZvbnRTaXplID0gc2l6ZTsKK30KKwordm9pZCBDQkNfT25lRGltV3JpdGVyOjpTZXRGb250U3R5bGUoaW50MzJfdCBzdHlsZSkgeworICBtX2lGb250U3R5bGUgPSBzdHlsZTsKK30KKwordm9pZCBDQkNfT25lRGltV3JpdGVyOjpTZXRGb250Q29sb3IoRlhfQVJHQiBjb2xvcikgeworICBtX2ZvbnRDb2xvciA9IGNvbG9yOworfQorCit3Y2hhcl90IENCQ19PbmVEaW1Xcml0ZXI6OlVwcGVyKHdjaGFyX3QgY2gpIHsKKyAgaWYgKGNoID49ICdhJyAmJiBjaCA8PSAneicpIHsKKyAgICBjaCA9IGNoIC0gKCdhJyAtICdBJyk7CisgIH0KKyAgcmV0dXJuIGNoOworfQorCit1aW50OF90KiBDQkNfT25lRGltV3JpdGVyOjpFbmNvZGVXaXRoSGludChjb25zdCBCeXRlU3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cykgeworICBvdXRIZWlnaHQgPSAxOworICByZXR1cm4gRW5jb2RlSW1wbChjb250ZW50cywgb3V0V2lkdGgpOworfQorCit1aW50OF90KiBDQkNfT25lRGltV3JpdGVyOjpFbmNvZGUoY29uc3QgQnl0ZVN0cmluZyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCkgeworICByZXR1cm4gRW5jb2RlV2l0aEhpbnQoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgMCk7Cit9CisKK2ludDMyX3QgQ0JDX09uZURpbVdyaXRlcjo6QXBwZW5kUGF0dGVybih1aW50OF90KiB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90KiBwYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGF0dGVybkxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgeworICBpZiAoc3RhcnRDb2xvciAhPSAwICYmIHN0YXJ0Q29sb3IgIT0gMSkgeworICAgIGUgPSBCQ0V4Y2VwdGlvblZhbHVlTXVzdEJlRWl0aGVyMG9yMTsKKyAgICByZXR1cm4gMDsKKyAgfQorICB1aW50OF90IGNvbG9yID0gKHVpbnQ4X3Qpc3RhcnRDb2xvcjsKKyAgaW50MzJfdCBudW1BZGRlZCA9IDA7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHBhdHRlcm5MZW5ndGg7IGkrKykgeworICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHBhdHRlcm5baV07IGorKykgeworICAgICAgdGFyZ2V0W3BvcysrXSA9IGNvbG9yOworICAgICAgbnVtQWRkZWQgKz0gMTsKKyAgICB9CisgICAgY29sb3IgXj0gMTsKKyAgfQorICByZXR1cm4gbnVtQWRkZWQ7Cit9CisKK3ZvaWQgQ0JDX09uZURpbVdyaXRlcjo6Q2FsY1RleHRJbmZvKGNvbnN0IEJ5dGVTdHJpbmcmIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyogY2hhclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBjRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGdlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZvbnRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQmIGNoYXJzTGVuKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfVW5pY29kZUVuY29kaW5nRXg+IGVuY29kaW5nID0KKyAgICAgIEZYX0NyZWF0ZUZvbnRFbmNvZGluZ0V4KGNGb250LCBGWEZNX0VOQ09ESU5HX05PTkUpOworCisgIHNpemVfdCBsZW5ndGggPSB0ZXh0LkdldExlbmd0aCgpOworICB1aW50MzJfdCogcENoYXJDb2RlID0gRlhfQWxsb2ModWludDMyX3QsIHRleHQuR2V0TGVuZ3RoKCkpOworICBmbG9hdCBjaGFyV2lkdGggPSAwOworICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGxlbmd0aDsgaisrKSB7CisgICAgcENoYXJDb2RlW2pdID0gZW5jb2RpbmctPkNoYXJDb2RlRnJvbVVuaWNvZGUodGV4dFtqXSk7CisgICAgaW50MzJfdCBnbHlwX2NvZGUgPSBlbmNvZGluZy0+R2x5cGhGcm9tQ2hhckNvZGUocENoYXJDb2RlW2pdKTsKKyAgICBpbnQzMl90IGdseXBfdmFsdWUgPSBjRm9udC0+R2V0R2x5cGhXaWR0aChnbHlwX2NvZGUpOworICAgIGZsb2F0IHRlbXAgPSAoZmxvYXQpKChnbHlwX3ZhbHVlKSpmb250U2l6ZSAvIDEwMDAuMCk7CisgICAgY2hhcldpZHRoICs9IHRlbXA7CisgIH0KKyAgY2hhcnNMZW4gPSBjaGFyV2lkdGg7CisgIGZsb2F0IGxlZnRQb3NpdG9uID0gKGZsb2F0KShnZVdpZHRoIC0gY2hhcnNMZW4pIC8gMi4wZjsKKyAgaWYgKGxlZnRQb3NpdG9uIDwgMCAmJiBnZVdpZHRoID09IDApIHsKKyAgICBsZWZ0UG9zaXRvbiA9IDA7CisgIH0KKyAgZmxvYXQgcGVuWCA9IDAuMDsKKyAgZmxvYXQgcGVuWSA9IChmbG9hdClhYnMoY0ZvbnQtPkdldERlc2NlbnQoKSkgKiAoZmxvYXQpZm9udFNpemUgLyAxMDAwLjBmOworICBmbG9hdCBsZWZ0ID0gbGVmdFBvc2l0b247CisgIGZsb2F0IHRvcCA9IDAuMDsKKyAgY2hhclBvc1swXS5tX09yaWdpbiA9IENGWF9Qb2ludEYocGVuWCArIGxlZnQsIHBlblkgKyB0b3ApOworICBjaGFyUG9zWzBdLm1fR2x5cGhJbmRleCA9IGVuY29kaW5nLT5HbHlwaEZyb21DaGFyQ29kZShwQ2hhckNvZGVbMF0pOworICBjaGFyUG9zWzBdLm1fRm9udENoYXJXaWR0aCA9IGNGb250LT5HZXRHbHlwaFdpZHRoKGNoYXJQb3NbMF0ubV9HbHlwaEluZGV4KTsKKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9BUFBMRV8KKyAgY2hhclBvc1swXS5tX0V4dEdJRCA9IGNoYXJQb3NbMF0ubV9HbHlwaEluZGV4OworI2VuZGlmCisgIHBlblggKz0gKGZsb2F0KShjaGFyUG9zWzBdLm1fRm9udENoYXJXaWR0aCkgKiAoZmxvYXQpZm9udFNpemUgLyAxMDAwLjBmOworICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgY2hhclBvc1tpXS5tX09yaWdpbiA9IENGWF9Qb2ludEYocGVuWCArIGxlZnQsIHBlblkgKyB0b3ApOworICAgIGNoYXJQb3NbaV0ubV9HbHlwaEluZGV4ID0gZW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKHBDaGFyQ29kZVtpXSk7CisgICAgY2hhclBvc1tpXS5tX0ZvbnRDaGFyV2lkdGggPSBjRm9udC0+R2V0R2x5cGhXaWR0aChjaGFyUG9zW2ldLm1fR2x5cGhJbmRleCk7CisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCisgICAgY2hhclBvc1tpXS5tX0V4dEdJRCA9IGNoYXJQb3NbaV0ubV9HbHlwaEluZGV4OworI2VuZGlmCisgICAgcGVuWCArPSAoZmxvYXQpKGNoYXJQb3NbaV0ubV9Gb250Q2hhcldpZHRoKSAqIChmbG9hdClmb250U2l6ZSAvIDEwMDAuMGY7CisgIH0KKyAgRlhfRnJlZShwQ2hhckNvZGUpOworfQorCit2b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlNob3dEZXZpY2VDaGFycyhDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGdlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsb2NYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbG9jWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYmFyV2lkdGgpIHsKKyAgaW50MzJfdCBpRm9udFNpemUgPSAoaW50MzJfdClmYWJzKG1fZkZvbnRTaXplKTsKKyAgaW50MzJfdCBpVGV4dEhlaWdodCA9IGlGb250U2l6ZSArIDE7CisgIENGWF9GbG9hdFJlY3QgcmVjdCgoZmxvYXQpbG9jWCwgKGZsb2F0KWxvY1ksIChmbG9hdCkobG9jWCArIGdlV2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KShsb2NZICsgaVRleHRIZWlnaHQpKTsKKyAgaWYgKGdlV2lkdGggIT0gbV9XaWR0aCkgeworICAgIHJlY3QucmlnaHQgLT0gMTsKKyAgfQorICBGWF9SRUNUIHJlID0gbWF0cml4LT5UcmFuc2Zvcm1SZWN0KHJlY3QpLkdldE91dGVyUmVjdCgpOworICBkZXZpY2UtPkZpbGxSZWN0KCZyZSwgbV9iYWNrZ3JvdW5kQ29sb3IpOworICBDRlhfTWF0cml4IGFmZmluZV9tYXRyaXgoMS4wLCAwLjAsIDAuMCwgLTEuMCwgKGZsb2F0KWxvY1gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpKGxvY1kgKyBpRm9udFNpemUpKTsKKyAgaWYgKG1hdHJpeCkgeworICAgIGFmZmluZV9tYXRyaXguQ29uY2F0KCptYXRyaXgpOworICB9CisgIGRldmljZS0+RHJhd05vcm1hbFRleHQoc3RyLkdldExlbmd0aCgpLCBwQ2hhclBvcywgbV9wRm9udC5HZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oaUZvbnRTaXplKSwgJmFmZmluZV9tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOworfQorCitib29sIENCQ19PbmVEaW1Xcml0ZXI6OlNob3dDaGFycyhjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJhcldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtdWx0aXBsZSkgeworICBpZiAoIWRldmljZSB8fCAhbV9wRm9udCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQnl0ZVN0cmluZyBzdHIgPSBGWF9VVEY4RW5jb2RlKGNvbnRlbnRzKTsKKyAgaW50MzJfdCBpTGVuID0gc3RyLkdldExlbmd0aCgpOworICBzdGQ6OnZlY3RvcjxGWFRFWFRfQ0hBUlBPUz4gY2hhcnBvcyhpTGVuKTsKKyAgZmxvYXQgY2hhcnNMZW4gPSAwOworICBmbG9hdCBnZVdpZHRoID0gMDsKKyAgaWYgKG1fbG9jVGV4dExvYyA9PSBCQ19URVhUX0xPQ19BQk9WRUVNQkVEIHx8CisgICAgICBtX2xvY1RleHRMb2MgPT0gQkNfVEVYVF9MT0NfQkVMT1dFTUJFRCkgeworICAgIGdlV2lkdGggPSAwOworICB9IGVsc2UgaWYgKG1fbG9jVGV4dExvYyA9PSBCQ19URVhUX0xPQ19BQk9WRSB8fAorICAgICAgICAgICAgIG1fbG9jVGV4dExvYyA9PSBCQ19URVhUX0xPQ19CRUxPVykgeworICAgIGdlV2lkdGggPSAoZmxvYXQpYmFyV2lkdGg7CisgIH0KKyAgaW50MzJfdCBpRm9udFNpemUgPSAoaW50MzJfdClmYWJzKG1fZkZvbnRTaXplKTsKKyAgaW50MzJfdCBpVGV4dEhlaWdodCA9IGlGb250U2l6ZSArIDE7CisgIENhbGNUZXh0SW5mbyhzdHIsIGNoYXJwb3MuZGF0YSgpLCBtX3BGb250LkdldCgpLCBnZVdpZHRoLCBpRm9udFNpemUsCisgICAgICAgICAgICAgICBjaGFyc0xlbik7CisgIGlmIChjaGFyc0xlbiA8IDEpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaW50MzJfdCBsb2NYID0gMDsKKyAgaW50MzJfdCBsb2NZID0gMDsKKyAgc3dpdGNoIChtX2xvY1RleHRMb2MpIHsKKyAgICBjYXNlIEJDX1RFWFRfTE9DX0FCT1ZFRU1CRUQ6CisgICAgICBsb2NYID0gKGludDMyX3QpKGJhcldpZHRoIC0gY2hhcnNMZW4pIC8gMjsKKyAgICAgIGxvY1kgPSAwOworICAgICAgZ2VXaWR0aCA9IGNoYXJzTGVuOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ19URVhUX0xPQ19BQk9WRToKKyAgICAgIGxvY1ggPSAwOworICAgICAgbG9jWSA9IDA7CisgICAgICBnZVdpZHRoID0gKGZsb2F0KWJhcldpZHRoOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCQ19URVhUX0xPQ19CRUxPV0VNQkVEOgorICAgICAgbG9jWCA9IChpbnQzMl90KShiYXJXaWR0aCAtIGNoYXJzTGVuKSAvIDI7CisgICAgICBsb2NZID0gbV9IZWlnaHQgLSBpVGV4dEhlaWdodDsKKyAgICAgIGdlV2lkdGggPSBjaGFyc0xlbjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQkNfVEVYVF9MT0NfQkVMT1c6CisgICAgZGVmYXVsdDoKKyAgICAgIGxvY1ggPSAwOworICAgICAgbG9jWSA9IG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQ7CisgICAgICBnZVdpZHRoID0gKGZsb2F0KWJhcldpZHRoOworICAgICAgYnJlYWs7CisgIH0KKyAgU2hvd0RldmljZUNoYXJzKGRldmljZSwgbWF0cml4LCBzdHIsIGdlV2lkdGgsIGNoYXJwb3MuZGF0YSgpLCAoZmxvYXQpbG9jWCwKKyAgICAgICAgICAgICAgICAgIChmbG9hdClsb2NZLCBiYXJXaWR0aCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENCQ19PbmVEaW1Xcml0ZXI6OlJlbmRlckRldmljZVJlc3VsdChDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIHsKKyAgaWYgKG1fb3V0cHV0LmVtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENGWF9HcmFwaFN0YXRlRGF0YSBzdGF0ZURhdGE7CisgIENGWF9QYXRoRGF0YSBwYXRoOworICBwYXRoLkFwcGVuZFJlY3QoMCwgMCwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1fV2lkdGgpLAorICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KG1fSGVpZ2h0KSk7CisgIGRldmljZS0+RHJhd1BhdGgoJnBhdGgsIG1hdHJpeCwgJnN0YXRlRGF0YSwgbV9iYWNrZ3JvdW5kQ29sb3IsCisgICAgICAgICAgICAgICAgICAgbV9iYWNrZ3JvdW5kQ29sb3IsIEZYRklMTF9BTFRFUk5BVEUpOworICBDRlhfTWF0cml4IHNjYWxlZE1hdHJpeChtX291dHB1dEhTY2FsZSwgMC4wLCAwLjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihtX0hlaWdodCksIDAuMCwgMC4wKTsKKyAgc2NhbGVkTWF0cml4LkNvbmNhdCgqbWF0cml4KTsKKyAgZm9yIChhdXRvJiByZWN0IDogbV9vdXRwdXQpIHsKKyAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZGF0YTsKKyAgICBkZXZpY2UtPkRyYXdQYXRoKCZyZWN0LCAmc2NhbGVkTWF0cml4LCAmZGF0YSwgbV9iYXJDb2xvciwgMCwKKyAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9XSU5ESU5HKTsKKyAgfQorCisgIHJldHVybiBtX2xvY1RleHRMb2MgPT0gQkNfVEVYVF9MT0NfTk9ORSB8fCAhY29udGVudHMuQ29udGFpbnMoJyAnKSB8fAorICAgICAgICAgU2hvd0NoYXJzKGNvbnRlbnRzLCBkZXZpY2UsIG1hdHJpeCwgbV9iYXJXaWR0aCwgbV9tdWx0aXBsZSk7Cit9CisKK2Jvb2wgQ0JDX09uZURpbVdyaXRlcjo6UmVuZGVyUmVzdWx0KGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVMZW5ndGgpIHsKKyAgaWYgKGNvZGVMZW5ndGggPCAxKQorICAgIHJldHVybiBmYWxzZTsKKworICBtX01vZHVsZUhlaWdodCA9IHN0ZDo6bWF4KG1fTW9kdWxlSGVpZ2h0LCAyMCk7CisgIGNvbnN0IGludDMyX3QgY29kZU9sZExlbmd0aCA9IGNvZGVMZW5ndGg7CisgIGNvbnN0IGludDMyX3QgbGVmdFBhZGRpbmcgPSBtX2JMZWZ0UGFkZGluZyA/IDcgOiAwOworICBjb25zdCBpbnQzMl90IHJpZ2h0UGFkZGluZyA9IG1fYlJpZ2h0UGFkZGluZyA/IDcgOiAwOworICBjb2RlTGVuZ3RoICs9IGxlZnRQYWRkaW5nOworICBjb2RlTGVuZ3RoICs9IHJpZ2h0UGFkZGluZzsKKyAgbV9vdXRwdXRIU2NhbGUgPQorICAgICAgbV9XaWR0aCA+IDAgPyBzdGF0aWNfY2FzdDxmbG9hdD4obV9XaWR0aCkgLyBzdGF0aWNfY2FzdDxmbG9hdD4oY29kZUxlbmd0aCkKKyAgICAgICAgICAgICAgICAgIDogMS4wOworICBtX211bHRpcGxlID0gMTsKKyAgY29uc3QgaW50MzJfdCBvdXRwdXRIZWlnaHQgPSAxOworICBjb25zdCBpbnQzMl90IG91dHB1dFdpZHRoID0gY29kZUxlbmd0aDsKKyAgbV9iYXJXaWR0aCA9IG1fV2lkdGg7CisKKyAgbV9vdXRwdXQuY2xlYXIoKTsKKyAgZm9yIChpbnQzMl90IGlucHV0WCA9IDAsIG91dHB1dFggPSBsZWZ0UGFkZGluZyAqIG1fbXVsdGlwbGU7CisgICAgICAgaW5wdXRYIDwgY29kZU9sZExlbmd0aDsgKytpbnB1dFgsIG91dHB1dFggKz0gbV9tdWx0aXBsZSkgeworICAgIGlmIChjb2RlW2lucHV0WF0gIT0gMSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKG91dHB1dFggPj0gb3V0cHV0V2lkdGgpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmIChvdXRwdXRYICsgbV9tdWx0aXBsZSA+IG91dHB1dFdpZHRoICYmIG91dHB1dFdpZHRoIC0gb3V0cHV0WCA+IDApIHsKKyAgICAgIFJlbmRlclZlcnRpY2FsQmFycyhvdXRwdXRYLCBvdXRwdXRXaWR0aCAtIG91dHB1dFgsIG91dHB1dEhlaWdodCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBSZW5kZXJWZXJ0aWNhbEJhcnMob3V0cHV0WCwgbV9tdWx0aXBsZSwgb3V0cHV0SGVpZ2h0KTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDQkNfT25lRGltV3JpdGVyOjpSZW5kZXJWZXJ0aWNhbEJhcnMoaW50MzJfdCBvdXRwdXRYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgeworICAgIGZsb2F0IHggPSBvdXRwdXRYICsgaTsKKyAgICBDRlhfUGF0aERhdGEgcmVjdDsKKyAgICByZWN0LkFwcGVuZFJlY3QoeCwgMC4wZiwgeCArIDEsIHN0YXRpY19jYXN0PGZsb2F0PihoZWlnaHQpKTsKKyAgICBtX291dHB1dC5wdXNoX2JhY2socmVjdCk7CisgIH0KK30KKworV2lkZVN0cmluZyBDQkNfT25lRGltV3JpdGVyOjpSZW5kZXJUZXh0Q29udGVudHMoCisgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzKSB7CisgIHJldHVybiBXaWRlU3RyaW5nKCk7Cit9CmRpZmYgLS1naXQgYS9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuaCBiL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OTdkODYKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuaApAQCAtMCwwICsxLDEwMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9PTkVEX0JDX09ORURJTVdSSVRFUl9IXworI2RlZmluZSBGWEJBUkNPREVfT05FRF9CQ19PTkVESU1XUklURVJfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvQkNfTGlicmFyeS5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9CQ19Xcml0ZXIuaCIKKworY2xhc3MgQ0ZYX0ZvbnQ7CitjbGFzcyBDRlhfUGF0aERhdGE7CitjbGFzcyBDRlhfUmVuZGVyRGV2aWNlOworCitjbGFzcyBDQkNfT25lRGltV3JpdGVyIDogcHVibGljIENCQ19Xcml0ZXIgeworIHB1YmxpYzoKKyAgQ0JDX09uZURpbVdyaXRlcigpOworICB+Q0JDX09uZURpbVdyaXRlcigpIG92ZXJyaWRlOworCisgIHZpcnR1YWwgYm9vbCBSZW5kZXJSZXN1bHQoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2RlTGVuZ3RoKTsKKyAgdmlydHVhbCBib29sIENoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cykgPSAwOworICB2aXJ0dWFsIFdpZGVTdHJpbmcgRmlsdGVyQ29udGVudHMoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzKSA9IDA7CisgIHZpcnR1YWwgV2lkZVN0cmluZyBSZW5kZXJUZXh0Q29udGVudHMoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzKTsKKyAgdmlydHVhbCB2b2lkIFNldFByaW50Q2hlY2tzdW0oYm9vbCBjaGVja3N1bSk7CisgIHZpcnR1YWwgdm9pZCBTZXREYXRhTGVuZ3RoKGludDMyX3QgbGVuZ3RoKTsKKyAgdmlydHVhbCB2b2lkIFNldENhbGNDaGVja3N1bShib29sIHN0YXRlKTsKKyAgdmlydHVhbCB2b2lkIFNldEZvbnRTaXplKGZsb2F0IHNpemUpOworICB2aXJ0dWFsIHZvaWQgU2V0Rm9udFN0eWxlKGludDMyX3Qgc3R5bGUpOworICB2aXJ0dWFsIHZvaWQgU2V0Rm9udENvbG9yKEZYX0FSR0IgY29sb3IpOworCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBCeXRlU3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLAorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0KTsKKyAgYm9vbCBSZW5kZXJEZXZpY2VSZXN1bHQoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cyk7CisgIGJvb2wgU2V0Rm9udChDRlhfRm9udCogY0ZvbnQpOworCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHVpbnQ4X3QqIEVuY29kZVdpdGhIaW50KGNvbnN0IEJ5dGVTdHJpbmcmIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cyk7CisgIHZpcnR1YWwgdWludDhfdCogRW5jb2RlSW1wbChjb25zdCBCeXRlU3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dExlbmd0aCkgPSAwOworICB2aXJ0dWFsIHZvaWQgQ2FsY1RleHRJbmZvKGNvbnN0IEJ5dGVTdHJpbmcmIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIGNoYXJQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0ZvbnQqIGNGb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGdlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCYgY2hhcnNMZW4pOworICB2aXJ0dWFsIGJvb2wgU2hvd0NoYXJzKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYmFyV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtdWx0aXBsZSk7CisgIHZpcnR1YWwgdm9pZCBTaG93RGV2aWNlQ2hhcnMoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBnZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsb2NYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxvY1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiYXJXaWR0aCk7CisgIHZpcnR1YWwgaW50MzJfdCBBcHBlbmRQYXR0ZXJuKHVpbnQ4X3QqIHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCogcGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwYXR0ZXJuTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOworCisgIHdjaGFyX3QgVXBwZXIod2NoYXJfdCBjaCk7CisgIHZvaWQgUmVuZGVyVmVydGljYWxCYXJzKGludDMyX3Qgb3V0cHV0WCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpOworCisgIGJvb2wgbV9iUHJpbnRDaGVja3N1bTsKKyAgaW50MzJfdCBtX2lEYXRhTGVudGg7CisgIGJvb2wgbV9iQ2FsY0NoZWNrc3VtOworICBVbm93bmVkUHRyPENGWF9Gb250PiBtX3BGb250OworICBmbG9hdCBtX2ZGb250U2l6ZTsKKyAgaW50MzJfdCBtX2lGb250U3R5bGU7CisgIHVpbnQzMl90IG1fZm9udENvbG9yOworICBCQ19URVhUX0xPQyBtX2xvY1RleHRMb2M7CisgIHNpemVfdCBtX2lDb250ZW50TGVuOworICBib29sIG1fYkxlZnRQYWRkaW5nOworICBib29sIG1fYlJpZ2h0UGFkZGluZzsKKyAgc3RkOjp2ZWN0b3I8Q0ZYX1BhdGhEYXRhPiBtX291dHB1dDsKKyAgaW50MzJfdCBtX2JhcldpZHRoOworICBpbnQzMl90IG1fbXVsdGlwbGU7CisgIGZsb2F0IG1fb3V0cHV0SFNjYWxlOworfTsKKworI2VuZGlmICAvLyBGWEJBUkNPREVfT05FRF9CQ19PTkVESU1XUklURVJfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyV3JpdGVyLmNwcCBiL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mjk5MGY3Ci0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJXcml0ZXIuY3BwCkBAIC0wLDAgKzEsMjA3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6CisvKgorICogQ29weXJpZ2h0IDIwMTEgWlhpbmcgYXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJXcml0ZXIuaCIKKworI2luY2x1ZGUgImZ4YmFyY29kZS9CQ19Xcml0ZXIuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IGNoYXIga09uZWRDb2RhQWxwaGFiZXRbXSA9IHsnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOCcsICc5JywgJy0nLCAnJCcsICc6JywgJy8nLCAnLicsICcrJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQScsICdCJywgJ0MnLCAnRCcsICdUJywgJ04nfTsKKworY29uc3QgaW50OF90IGtPbmVkQ29kYUNoYXJhY3RlckVuY29kaW5nW10gPSB7CisgICAgMHgwMywgMHgwNiwgMHgwOSwgMHg2MCwgMHgxMiwgMHg0MiwgMHgyMSwgMHgyNCwgMHgzMCwgMHg0OCwgMHgwYywKKyAgICAweDE4LCAweDQ1LCAweDUxLCAweDU0LCAweDE1LCAweDFBLCAweDI5LCAweDBCLCAweDBFLCAweDFBLCAweDI5fTsKK3N0YXRpY19hc3NlcnQoRlhfQXJyYXlTaXplKGtPbmVkQ29kYUNoYXJhY3RlckVuY29kaW5nKSA9PSAyMiwgIldyb25nIHNpemUiKTsKK3N0YXRpY19hc3NlcnQoRlhfQXJyYXlTaXplKGtPbmVkQ29kYUNoYXJhY3RlckVuY29kaW5nKSA9PQorICAgICAgICAgICAgICAgICAgRlhfQXJyYXlTaXplKGtPbmVkQ29kYUFscGhhYmV0KSwKKyAgICAgICAgICAgICAgIldyb25nIHNpemUiKTsKKworY29uc3QgY2hhciBrU3RhcnRFbmRDaGFyc1tdID0geydBJywgJ0InLCAnQycsICdEJywgJ1QnLCAnTicsICcqJywgJ0UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJywgJ2InLCAnYycsICdkJywgJ3QnLCAnbicsICdlJ307Citjb25zdCBjaGFyIGtDT250ZW50Q2hhcnNbXSA9IHsnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc4JywgJzknLCAnLScsICckJywgJy8nLCAnOicsICcrJywgJy4nfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NCQ19PbmVkQ29kYUJhcldyaXRlcjo6Q0JDX09uZWRDb2RhQmFyV3JpdGVyKCkKKyAgICA6IG1fY2hTdGFydCgnQScpLCBtX2NoRW5kKCdCJyksIG1faVdpZGVOYXJyUmF0aW8oMikge30KKworQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjp+Q0JDX09uZWRDb2RhQmFyV3JpdGVyKCkge30KKworYm9vbCBDQkNfT25lZENvZGFCYXJXcml0ZXI6OlNldFN0YXJ0Q2hhcihjaGFyIHN0YXJ0KSB7CisgIGlmICghcGRmaXVtOjpDb250YWluc1ZhbHVlKGtTdGFydEVuZENoYXJzLCBzdGFydCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG1fY2hTdGFydCA9IHN0YXJ0OworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDQkNfT25lZENvZGFCYXJXcml0ZXI6OlNldEVuZENoYXIoY2hhciBlbmQpIHsKKyAgaWYgKCFwZGZpdW06OkNvbnRhaW5zVmFsdWUoa1N0YXJ0RW5kQ2hhcnMsIGVuZCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG1fY2hFbmQgPSBlbmQ7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6U2V0RGF0YUxlbmd0aChpbnQzMl90IGxlbmd0aCkgeworICBtX2lEYXRhTGVudGggPSBsZW5ndGggKyAyOworfQorCitib29sIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6U2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKSB7CisgIGlmIChsb2NhdGlvbiA8IEJDX1RFWFRfTE9DX05PTkUgfHwgbG9jYXRpb24gPiBCQ19URVhUX0xPQ19CRUxPV0VNQkVEKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1fbG9jVGV4dExvYyA9IGxvY2F0aW9uOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDQkNfT25lZENvZGFCYXJXcml0ZXI6OlNldFdpZGVOYXJyb3dSYXRpbyhpbnQ4X3QgcmF0aW8pIHsKKyAgaWYgKHJhdGlvIDwgMiB8fCByYXRpbyA+IDMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG1faVdpZGVOYXJyUmF0aW8gPSByYXRpbzsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpGaW5kQ2hhcih3Y2hhcl90IGNoLCBib29sIGlzQ29udGVudCkgeworICBpZiAoY2ggPiAweDdGKQorICAgIHJldHVybiBmYWxzZTsKKworICBjaGFyIG5hcnJvd19jaCA9IHN0YXRpY19jYXN0PGNoYXI+KGNoKTsKKyAgcmV0dXJuIHBkZml1bTo6Q29udGFpbnNWYWx1ZShrQ09udGVudENoYXJzLCBuYXJyb3dfY2gpIHx8CisgICAgICAgICAoaXNDb250ZW50ICYmIHBkZml1bTo6Q29udGFpbnNWYWx1ZShrU3RhcnRFbmRDaGFycywgbmFycm93X2NoKSk7Cit9CisKK2Jvb2wgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpDaGVja0NvbnRlbnRWYWxpZGl0eSgKKyAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIHsKKyAgcmV0dXJuIHN0ZDo6YWxsX29mKAorICAgICAgY29udGVudHMuYmVnaW4oKSwgY29udGVudHMuZW5kKCksCisgICAgICBbdGhpc10oY29uc3Qgd2NoYXJfdCYgY2gpIHsgcmV0dXJuIHRoaXMtPkZpbmRDaGFyKGNoLCBmYWxzZSk7IH0pOworfQorCitXaWRlU3RyaW5nIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6RmlsdGVyQ29udGVudHMoCisgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzKSB7CisgIFdpZGVTdHJpbmcgZmlsdGVyY29udGVudHM7CisgIHdjaGFyX3QgY2g7CisgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaW5kZXgrKykgeworICAgIGNoID0gY29udGVudHNbaW5kZXhdOworICAgIGlmIChjaCA+IDE3NSkgeworICAgICAgaW5kZXgrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoIUZpbmRDaGFyKGNoLCB0cnVlKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOworICB9CisgIHJldHVybiBmaWx0ZXJjb250ZW50czsKK30KKwordWludDhfdCogQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpFbmNvZGVXaXRoSGludChjb25zdCBCeXRlU3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzKSB7CisgIGlmIChmb3JtYXQgIT0gQkNGT1JNQVRfQ09EQUJBUikKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIENCQ19PbmVEaW1Xcml0ZXI6OkVuY29kZVdpdGhIaW50KGNvbnRlbnRzLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50cyk7Cit9CisKK3VpbnQ4X3QqIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6RW5jb2RlSW1wbChjb25zdCBCeXRlU3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRMZW5ndGgpIHsKKyAgQnl0ZVN0cmluZyBkYXRhID0gbV9jaFN0YXJ0ICsgY29udGVudHMgKyBtX2NoRW5kOworICBtX2lDb250ZW50TGVuID0gZGF0YS5HZXRMZW5ndGgoKTsKKyAgdWludDhfdCogcmVzdWx0ID0gRlhfQWxsb2MyRCh1aW50OF90LCBtX2lXaWRlTmFyclJhdGlvICogNywgZGF0YS5HZXRMZW5ndGgoKSk7CisgIGNoYXIgY2g7CisgIGludDMyX3QgcG9zaXRpb24gPSAwOworICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgZGF0YS5HZXRMZW5ndGgoKTsgaW5kZXgrKykgeworICAgIGNoID0gZGF0YVtpbmRleF07CisgICAgaWYgKCgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ3onKSkpIHsKKyAgICAgIGNoID0gY2ggLSAzMjsKKyAgICB9CisgICAgc3dpdGNoIChjaCkgeworICAgICAgY2FzZSAnVCc6CisgICAgICAgIGNoID0gJ0EnOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ04nOgorICAgICAgICBjaCA9ICdCJzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcqJzoKKyAgICAgICAgY2ggPSAnQyc7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnRSc6CisgICAgICAgIGNoID0gJ0QnOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpbnQ4X3QgY29kZSA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoa09uZWRDb2RhQWxwaGFiZXQpOyBpKyspIHsKKyAgICAgIGlmIChjaCA9PSBrT25lZENvZGFBbHBoYWJldFtpXSkgeworICAgICAgICBjb2RlID0ga09uZWRDb2RhQ2hhcmFjdGVyRW5jb2RpbmdbaV07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICB1aW50OF90IGNvbG9yID0gMTsKKyAgICBpbnQzMl90IGNvdW50ZXIgPSAwOworICAgIGludDMyX3QgYml0ID0gMDsKKyAgICB3aGlsZSAoYml0IDwgNykgeworICAgICAgcmVzdWx0W3Bvc2l0aW9uXSA9IGNvbG9yOworICAgICAgcG9zaXRpb24rKzsKKyAgICAgIGlmICgoKGNvZGUgPj4gKDYgLSBiaXQpKSAmIDEpID09IDAgfHwgY291bnRlciA9PSBtX2lXaWRlTmFyclJhdGlvIC0gMSkgeworICAgICAgICBjb2xvciA9ICFjb2xvcjsKKyAgICAgICAgYml0Kys7CisgICAgICAgIGNvdW50ZXIgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY291bnRlcisrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5kZXggPCBkYXRhLkdldExlbmd0aCgpIC0gMSkgeworICAgICAgcmVzdWx0W3Bvc2l0aW9uXSA9IDA7CisgICAgICBwb3NpdGlvbisrOworICAgIH0KKyAgfQorICBvdXRMZW5ndGggPSBwb3NpdGlvbjsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworV2lkZVN0cmluZyBDQkNfT25lZENvZGFCYXJXcml0ZXI6OmVuY29kZWRDb250ZW50cygKKyAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIHsKKyAgV2lkZVN0cmluZyBzdHJTdGFydChzdGF0aWNfY2FzdDx3Y2hhcl90PihtX2NoU3RhcnQpKTsKKyAgV2lkZVN0cmluZyBzdHJFbmQoc3RhdGljX2Nhc3Q8d2NoYXJfdD4obV9jaEVuZCkpOworICByZXR1cm4gc3RyU3RhcnQgKyBjb250ZW50cyArIHN0ckVuZDsKK30KKworYm9vbCBDQkNfT25lZENvZGFCYXJXcml0ZXI6OlJlbmRlclJlc3VsdChjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZUxlbmd0aCkgeworICByZXR1cm4gQ0JDX09uZURpbVdyaXRlcjo6UmVuZGVyUmVzdWx0KAorICAgICAgZW5jb2RlZENvbnRlbnRzKGNvbnRlbnRzKS5Bc1N0cmluZ1ZpZXcoKSwgY29kZSwgY29kZUxlbmd0aCk7Cit9CmRpZmYgLS1naXQgYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kYUJhcldyaXRlci5oIGIvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjM1NGVmCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJXcml0ZXIuaApAQCAtMCwwICsxLDQ4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhCQVJDT0RFX09ORURfQkNfT05FRENPREFCQVJXUklURVJfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX09ORURfQkNfT05FRENPREFCQVJXUklURVJfSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvQkNfTGlicmFyeS5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5oIgorCitjbGFzcyBDQkNfT25lZENvZGFCYXJXcml0ZXIgOiBwdWJsaWMgQ0JDX09uZURpbVdyaXRlciB7CisgcHVibGljOgorICBDQkNfT25lZENvZGFCYXJXcml0ZXIoKTsKKyAgfkNCQ19PbmVkQ29kYUJhcldyaXRlcigpIG92ZXJyaWRlOworCisgIC8vIENCQ19PbmVEaW1Xcml0ZXIKKyAgdWludDhfdCogRW5jb2RlSW1wbChjb25zdCBCeXRlU3RyaW5nJiBjb250ZW50cywgaW50MzJfdCYgb3V0TGVuZ3RoKSBvdmVycmlkZTsKKyAgdWludDhfdCogRW5jb2RlV2l0aEhpbnQoY29uc3QgQnl0ZVN0cmluZyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cykgb3ZlcnJpZGU7CisgIGJvb2wgUmVuZGVyUmVzdWx0KGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29kZSwKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2RlTGVuZ3RoKSBvdmVycmlkZTsKKyAgYm9vbCBDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIG92ZXJyaWRlOworICBXaWRlU3RyaW5nIEZpbHRlckNvbnRlbnRzKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cykgb3ZlcnJpZGU7CisgIHZvaWQgU2V0RGF0YUxlbmd0aChpbnQzMl90IGxlbmd0aCkgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCBib29sIFNldFN0YXJ0Q2hhcihjaGFyIHN0YXJ0KTsKKyAgdmlydHVhbCBib29sIFNldEVuZENoYXIoY2hhciBlbmQpOworICB2aXJ0dWFsIGJvb2wgU2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKTsKKyAgdmlydHVhbCBib29sIFNldFdpZGVOYXJyb3dSYXRpbyhpbnQ4X3QgcmF0aW8pOworICB2aXJ0dWFsIGJvb2wgRmluZENoYXIod2NoYXJfdCBjaCwgYm9vbCBpc0NvbnRlbnQpOworCisgIFdpZGVTdHJpbmcgZW5jb2RlZENvbnRlbnRzKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cyk7CisKKyBwcml2YXRlOgorICBjaGFyIG1fY2hTdGFydDsKKyAgY2hhciBtX2NoRW5kOworICBpbnQ4X3QgbV9pV2lkZU5hcnJSYXRpbzsKK307CisKKyNlbmRpZiAgLy8gRlhCQVJDT0RFX09ORURfQkNfT05FRENPREFCQVJXUklURVJfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyV3JpdGVyX3VuaXR0ZXN0LmNwcCBiL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyV3JpdGVyX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDk4NDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJXcml0ZXJfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMTQ4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kYUJhcldyaXRlci5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworCisvLyAzIHdpZGUgYW5kIDQgbmFycm93IG1vZHVsZXMgcGVyIGRlbGltaXRlci4gT25lIHNwYWNlIGJldHdlZW4gdGhlbS4KK2NvbnN0IGludCBrTW9kdWxlc0ZvckRlbGltaXRlcnMgPSAoMyAqIDIgKyA0ICogMSkgKiAyICsgMTsKKworLy8gMiB3aWRlIGFuZCA1IG5hcnJvdyBtb2R1bGVzIHBlciBudW1iZXIsICdfJyBvciAnJCcuIDEgc3BhY2UgYmV0d2VlbiBjaGFycy4KK2NvbnN0IGludCBrTW9kdWxlc1Blck51bWJlciA9IDIgKiAyICsgNSAqIDEgKyAxOworCisvLyAzIHdpZGUgYW5kIDQgbmFycm93IG1vZHVsZXMgcGVyIG51bWJlciwgJ18nIG9yICckJy4gMSBzcGFjZSBiZXR3ZWVuIGNoYXJzLgorY29uc3QgaW50IGtNb2R1bGVzUGVyUHVuY3R1YXRpb24gPSAzICogMiArIDQgKiAxICsgMTsKKworVEVTVChPbmVkQ29kYUJhcldyaXRlclRlc3QsIEVuY29kZSkgeworICBDQkNfT25lZENvZGFCYXJXcml0ZXIgd3JpdGVyOworICBpbnQzMl90IHdpZHRoOworICBpbnQzMl90IGhlaWdodDsKKworICB1aW50OF90KiBlbmNvZGVkID0gd3JpdGVyLkVuY29kZSgiIiwgQkNGT1JNQVRfQ09EQUJBUiwgd2lkdGgsIGhlaWdodCk7CisgIEVYUEVDVF9FUSgxLCBoZWlnaHQpOworICBFWFBFQ1RfRVEoa01vZHVsZXNGb3JEZWxpbWl0ZXJzLCB3aWR0aCk7CisgIGNvbnN0IGNoYXIqIGV4cGVjdGVkID0KKyAgICAgICIjICMjICAjICAjICIgIC8vIEEgU3RhcnQKKyAgICAgICIjICAjICAjICMjIjsgIC8vIEIgRW5kCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RybGVuKGV4cGVjdGVkKTsgaSsrKSB7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkW2ldICE9ICcgJywgISFlbmNvZGVkW2ldKSA8PCBpOworICB9CisgIEZYX0ZyZWUoZW5jb2RlZCk7CisKKyAgZW5jb2RlZCA9IHdyaXRlci5FbmNvZGUoIjEyMyIsIEJDRk9STUFUX0NPREFCQVIsIHdpZHRoLCBoZWlnaHQpOworICBFWFBFQ1RfRVEoMSwgaGVpZ2h0KTsKKyAgRVhQRUNUX0VRKGtNb2R1bGVzRm9yRGVsaW1pdGVycyArIDMgKiBrTW9kdWxlc1Blck51bWJlciwgd2lkdGgpOworICBleHBlY3RlZCA9CisgICAgICAiIyAjIyAgIyAgIyAiICAvLyBBIFN0YXJ0CisgICAgICAiIyAjICMjICAjICIgICAvLyAxCisgICAgICAiIyAjICAjICMjICIgICAvLyAyCisgICAgICAiIyMgICMgIyAjICIgICAvLyAzCisgICAgICAiIyAgIyAgIyAjIyI7ICAvLyBCIEVuZAorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0cmxlbihleHBlY3RlZCk7IGkrKykgeworICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSAhPSAnICcsICEhZW5jb2RlZFtpXSkgPDwgaTsKKyAgfQorICBGWF9GcmVlKGVuY29kZWQpOworCisgIGVuY29kZWQgPSB3cml0ZXIuRW5jb2RlKCItJC4vOisiLCBCQ0ZPUk1BVF9DT0RBQkFSLCB3aWR0aCwgaGVpZ2h0KTsKKyAgRVhQRUNUX0VRKDEsIGhlaWdodCk7CisgIEVYUEVDVF9FUShrTW9kdWxlc0ZvckRlbGltaXRlcnMgKyAyICoga01vZHVsZXNQZXJOdW1iZXIgKworICAgICAgICAgICAgICAgIDQgKiBrTW9kdWxlc1BlclB1bmN0dWF0aW9uLAorICAgICAgICAgICAgd2lkdGgpOworICBleHBlY3RlZCA9CisgICAgICAiIyAjIyAgIyAgIyAiICAvLyBBIFN0YXJ0CisgICAgICAiIyAjICAjIyAjICIgICAvLyAtCisgICAgICAiIyAjIyAgIyAjICIgICAvLyAkCisgICAgICAiIyMgIyMgIyMgIyAiICAvLyAuCisgICAgICAiIyMgIyMgIyAjIyAiICAvLyAvCisgICAgICAiIyMgIyAjIyAjIyAiICAvLyA6CisgICAgICAiIyAjIyAjIyAjIyAiICAvLyArCisgICAgICAiIyAgIyAgIyAjIyI7ICAvLyBCIEVuZAorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0cmxlbihleHBlY3RlZCk7IGkrKykgeworICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSAhPSAnICcsICEhZW5jb2RlZFtpXSkgPDwgaTsKKyAgfQorICBGWF9GcmVlKGVuY29kZWQpOworCisgIGVuY29kZWQgPSB3cml0ZXIuRW5jb2RlKCI0NTYuOTg3OTg3OTg3LzAwMSIsIEJDRk9STUFUX0NPREFCQVIsIHdpZHRoLCBoZWlnaHQpOworICBFWFBFQ1RfRVEoMSwgaGVpZ2h0KTsKKyAgRVhQRUNUX0VRKGtNb2R1bGVzRm9yRGVsaW1pdGVycyArIDE1ICoga01vZHVsZXNQZXJOdW1iZXIgKworICAgICAgICAgICAgICAgIDIgKiBrTW9kdWxlc1BlclB1bmN0dWF0aW9uLAorICAgICAgICAgICAgd2lkdGgpOworICBleHBlY3RlZCA9CisgICAgICAiIyAjIyAgIyAgIyAiICAvLyBBIFN0YXJ0CisgICAgICAiIyAjIyAjICAjICIgICAvLyA0CisgICAgICAiIyMgIyAjICAjICIgICAvLyA1CisgICAgICAiIyAgIyAjICMjICIgICAvLyA2CisgICAgICAiIyMgIyMgIyMgIyAiICAvLyAuCisgICAgICAiIyMgIyAgIyAjICIgICAvLyA5CisgICAgICAiIyAgIyMgIyAjICIgICAvLyA4CisgICAgICAiIyAgIyAjIyAjICIgICAvLyA3CisgICAgICAiIyMgIyAgIyAjICIgICAvLyA5CisgICAgICAiIyAgIyMgIyAjICIgICAvLyA4CisgICAgICAiIyAgIyAjIyAjICIgICAvLyA3CisgICAgICAiIyMgIyAgIyAjICIgICAvLyA5CisgICAgICAiIyAgIyMgIyAjICIgICAvLyA4CisgICAgICAiIyAgIyAjIyAjICIgICAvLyA3CisgICAgICAiIyMgIyMgIyAjIyAiICAvLyAvCisgICAgICAiIyAjICMgICMjICIgICAvLyAwCisgICAgICAiIyAjICMgICMjICIgICAvLyAwCisgICAgICAiIyAjICMjICAjICIgICAvLyAxCisgICAgICAiIyAgIyAgIyAjIyI7ICAvLyBCIEVuZAorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0cmxlbihleHBlY3RlZCk7IGkrKykgeworICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSAhPSAnICcsICEhZW5jb2RlZFtpXSkgPDwgaTsKKyAgfQorICBGWF9GcmVlKGVuY29kZWQpOworfQorCitURVNUKE9uZWRDb2RhQmFyV3JpdGVyVGVzdCwgU2V0RGVsaW1pdGVycykgeworICBDQkNfT25lZENvZGFCYXJXcml0ZXIgd3JpdGVyOworICBpbnQzMl90IHdpZHRoOworICBpbnQzMl90IGhlaWdodDsKKworICBFWFBFQ1RfVFJVRSh3cml0ZXIuU2V0U3RhcnRDaGFyKCdBJykpOworICBFWFBFQ1RfVFJVRSh3cml0ZXIuU2V0U3RhcnRDaGFyKCdCJykpOworICBFWFBFQ1RfVFJVRSh3cml0ZXIuU2V0U3RhcnRDaGFyKCdDJykpOworICBFWFBFQ1RfVFJVRSh3cml0ZXIuU2V0U3RhcnRDaGFyKCdEJykpOworICBFWFBFQ1RfVFJVRSh3cml0ZXIuU2V0U3RhcnRDaGFyKCdFJykpOworICBFWFBFQ1RfVFJVRSh3cml0ZXIuU2V0U3RhcnRDaGFyKCdOJykpOworICBFWFBFQ1RfVFJVRSh3cml0ZXIuU2V0U3RhcnRDaGFyKCdUJykpOworICBFWFBFQ1RfVFJVRSh3cml0ZXIuU2V0U3RhcnRDaGFyKCcqJykpOworICBFWFBFQ1RfRkFMU0Uod3JpdGVyLlNldFN0YXJ0Q2hhcignVicpKTsKKyAgRVhQRUNUX0ZBTFNFKHdyaXRlci5TZXRTdGFydENoYXIoJzAnKSk7CisgIEVYUEVDVF9GQUxTRSh3cml0ZXIuU2V0U3RhcnRDaGFyKCdcMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKHdyaXRlci5TZXRTdGFydENoYXIoJ0AnKSk7CisKKyAgRVhQRUNUX1RSVUUod3JpdGVyLlNldEVuZENoYXIoJ0EnKSk7CisgIEVYUEVDVF9UUlVFKHdyaXRlci5TZXRFbmRDaGFyKCdCJykpOworICBFWFBFQ1RfVFJVRSh3cml0ZXIuU2V0RW5kQ2hhcignQycpKTsKKyAgRVhQRUNUX1RSVUUod3JpdGVyLlNldEVuZENoYXIoJ0QnKSk7CisgIEVYUEVDVF9UUlVFKHdyaXRlci5TZXRFbmRDaGFyKCdFJykpOworICBFWFBFQ1RfVFJVRSh3cml0ZXIuU2V0RW5kQ2hhcignTicpKTsKKyAgRVhQRUNUX1RSVUUod3JpdGVyLlNldEVuZENoYXIoJ1QnKSk7CisgIEVYUEVDVF9UUlVFKHdyaXRlci5TZXRFbmRDaGFyKCcqJykpOworICBFWFBFQ1RfRkFMU0Uod3JpdGVyLlNldEVuZENoYXIoJ1YnKSk7CisgIEVYUEVDVF9GQUxTRSh3cml0ZXIuU2V0RW5kQ2hhcignMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKHdyaXRlci5TZXRFbmRDaGFyKCdcMCcpKTsKKyAgRVhQRUNUX0ZBTFNFKHdyaXRlci5TZXRFbmRDaGFyKCdAJykpOworCisgIHdyaXRlci5TZXRTdGFydENoYXIoJ04nKTsKKyAgd3JpdGVyLlNldEVuZENoYXIoJyonKTsKKworICB1aW50OF90KiBlbmNvZGVkID0gd3JpdGVyLkVuY29kZSgiOTg3IiwgQkNGT1JNQVRfQ09EQUJBUiwgd2lkdGgsIGhlaWdodCk7CisgIEVYUEVDVF9FUSgxLCBoZWlnaHQpOworICBFWFBFQ1RfRVEoa01vZHVsZXNGb3JEZWxpbWl0ZXJzICsgMyAqIGtNb2R1bGVzUGVyTnVtYmVyLCB3aWR0aCk7CisgIGNvbnN0IGNoYXIqIGV4cGVjdGVkID0KKyAgICAgICIjICAjICAjICMjICIgIC8vIE4gKHNhbWUgYXMgQikgU3RhcnQKKyAgICAgICIjIyAjICAjICMgIiAgIC8vIDkKKyAgICAgICIjICAjIyAjICMgIiAgIC8vIDgKKyAgICAgICIjICAjICMjICMgIiAgIC8vIDcKKyAgICAgICIjICMgICMgICMjIjsgIC8vICogKHNhbWUgYXMgQykgRW5kCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RybGVuKGV4cGVjdGVkKTsgaSsrKSB7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkW2ldICE9ICcgJywgISFlbmNvZGVkW2ldKSA8PCBpOworICB9CisgIEZYX0ZyZWUoZW5jb2RlZCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhXcml0ZXIuY3BwIGIvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhXcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZDNmYjYKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTEyOFdyaXRlci5jcHAKQEAgLTAsMCArMSwyMDkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBaWGluZyBhdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTEyOFdyaXRlci5oIgorCisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImZ4YmFyY29kZS9CQ19Xcml0ZXIuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIHNpemVfdCBrUGF0dGVyblNpemUgPSA3OworCitjb25zdCBpbnQ4X3QgQ09ERV9QQVRURVJOU1sxMDddW2tQYXR0ZXJuU2l6ZV0gPSB7CisgICAgezIsIDEsIDIsIDIsIDIsIDIsIDB9LCB7MiwgMiwgMiwgMSwgMiwgMiwgMH0sIHsyLCAyLCAyLCAyLCAyLCAxLCAwfSwKKyAgICB7MSwgMiwgMSwgMiwgMiwgMywgMH0sIHsxLCAyLCAxLCAzLCAyLCAyLCAwfSwgezEsIDMsIDEsIDIsIDIsIDIsIDB9LAorICAgIHsxLCAyLCAyLCAyLCAxLCAzLCAwfSwgezEsIDIsIDIsIDMsIDEsIDIsIDB9LCB7MSwgMywgMiwgMiwgMSwgMiwgMH0sCisgICAgezIsIDIsIDEsIDIsIDEsIDMsIDB9LCB7MiwgMiwgMSwgMywgMSwgMiwgMH0sIHsyLCAzLCAxLCAyLCAxLCAyLCAwfSwKKyAgICB7MSwgMSwgMiwgMiwgMywgMiwgMH0sIHsxLCAyLCAyLCAxLCAzLCAyLCAwfSwgezEsIDIsIDIsIDIsIDMsIDEsIDB9LAorICAgIHsxLCAxLCAzLCAyLCAyLCAyLCAwfSwgezEsIDIsIDMsIDEsIDIsIDIsIDB9LCB7MSwgMiwgMywgMiwgMiwgMSwgMH0sCisgICAgezIsIDIsIDMsIDIsIDEsIDEsIDB9LCB7MiwgMiwgMSwgMSwgMywgMiwgMH0sIHsyLCAyLCAxLCAyLCAzLCAxLCAwfSwKKyAgICB7MiwgMSwgMywgMiwgMSwgMiwgMH0sIHsyLCAyLCAzLCAxLCAxLCAyLCAwfSwgezMsIDEsIDIsIDEsIDMsIDEsIDB9LAorICAgIHszLCAxLCAxLCAyLCAyLCAyLCAwfSwgezMsIDIsIDEsIDEsIDIsIDIsIDB9LCB7MywgMiwgMSwgMiwgMiwgMSwgMH0sCisgICAgezMsIDEsIDIsIDIsIDEsIDIsIDB9LCB7MywgMiwgMiwgMSwgMSwgMiwgMH0sIHszLCAyLCAyLCAyLCAxLCAxLCAwfSwKKyAgICB7MiwgMSwgMiwgMSwgMiwgMywgMH0sIHsyLCAxLCAyLCAzLCAyLCAxLCAwfSwgezIsIDMsIDIsIDEsIDIsIDEsIDB9LAorICAgIHsxLCAxLCAxLCAzLCAyLCAzLCAwfSwgezEsIDMsIDEsIDEsIDIsIDMsIDB9LCB7MSwgMywgMSwgMywgMiwgMSwgMH0sCisgICAgezEsIDEsIDIsIDMsIDEsIDMsIDB9LCB7MSwgMywgMiwgMSwgMSwgMywgMH0sIHsxLCAzLCAyLCAzLCAxLCAxLCAwfSwKKyAgICB7MiwgMSwgMSwgMywgMSwgMywgMH0sIHsyLCAzLCAxLCAxLCAxLCAzLCAwfSwgezIsIDMsIDEsIDMsIDEsIDEsIDB9LAorICAgIHsxLCAxLCAyLCAxLCAzLCAzLCAwfSwgezEsIDEsIDIsIDMsIDMsIDEsIDB9LCB7MSwgMywgMiwgMSwgMywgMSwgMH0sCisgICAgezEsIDEsIDMsIDEsIDIsIDMsIDB9LCB7MSwgMSwgMywgMywgMiwgMSwgMH0sIHsxLCAzLCAzLCAxLCAyLCAxLCAwfSwKKyAgICB7MywgMSwgMywgMSwgMiwgMSwgMH0sIHsyLCAxLCAxLCAzLCAzLCAxLCAwfSwgezIsIDMsIDEsIDEsIDMsIDEsIDB9LAorICAgIHsyLCAxLCAzLCAxLCAxLCAzLCAwfSwgezIsIDEsIDMsIDMsIDEsIDEsIDB9LCB7MiwgMSwgMywgMSwgMywgMSwgMH0sCisgICAgezMsIDEsIDEsIDEsIDIsIDMsIDB9LCB7MywgMSwgMSwgMywgMiwgMSwgMH0sIHszLCAzLCAxLCAxLCAyLCAxLCAwfSwKKyAgICB7MywgMSwgMiwgMSwgMSwgMywgMH0sIHszLCAxLCAyLCAzLCAxLCAxLCAwfSwgezMsIDMsIDIsIDEsIDEsIDEsIDB9LAorICAgIHszLCAxLCA0LCAxLCAxLCAxLCAwfSwgezIsIDIsIDEsIDQsIDEsIDEsIDB9LCB7NCwgMywgMSwgMSwgMSwgMSwgMH0sCisgICAgezEsIDEsIDEsIDIsIDIsIDQsIDB9LCB7MSwgMSwgMSwgNCwgMiwgMiwgMH0sIHsxLCAyLCAxLCAxLCAyLCA0LCAwfSwKKyAgICB7MSwgMiwgMSwgNCwgMiwgMSwgMH0sIHsxLCA0LCAxLCAxLCAyLCAyLCAwfSwgezEsIDQsIDEsIDIsIDIsIDEsIDB9LAorICAgIHsxLCAxLCAyLCAyLCAxLCA0LCAwfSwgezEsIDEsIDIsIDQsIDEsIDIsIDB9LCB7MSwgMiwgMiwgMSwgMSwgNCwgMH0sCisgICAgezEsIDIsIDIsIDQsIDEsIDEsIDB9LCB7MSwgNCwgMiwgMSwgMSwgMiwgMH0sIHsxLCA0LCAyLCAyLCAxLCAxLCAwfSwKKyAgICB7MiwgNCwgMSwgMiwgMSwgMSwgMH0sIHsyLCAyLCAxLCAxLCAxLCA0LCAwfSwgezQsIDEsIDMsIDEsIDEsIDEsIDB9LAorICAgIHsyLCA0LCAxLCAxLCAxLCAyLCAwfSwgezEsIDMsIDQsIDEsIDEsIDEsIDB9LCB7MSwgMSwgMSwgMiwgNCwgMiwgMH0sCisgICAgezEsIDIsIDEsIDEsIDQsIDIsIDB9LCB7MSwgMiwgMSwgMiwgNCwgMSwgMH0sIHsxLCAxLCA0LCAyLCAxLCAyLCAwfSwKKyAgICB7MSwgMiwgNCwgMSwgMSwgMiwgMH0sIHsxLCAyLCA0LCAyLCAxLCAxLCAwfSwgezQsIDEsIDEsIDIsIDEsIDIsIDB9LAorICAgIHs0LCAyLCAxLCAxLCAxLCAyLCAwfSwgezQsIDIsIDEsIDIsIDEsIDEsIDB9LCB7MiwgMSwgMiwgMSwgNCwgMSwgMH0sCisgICAgezIsIDEsIDQsIDEsIDIsIDEsIDB9LCB7NCwgMSwgMiwgMSwgMiwgMSwgMH0sIHsxLCAxLCAxLCAxLCA0LCAzLCAwfSwKKyAgICB7MSwgMSwgMSwgMywgNCwgMSwgMH0sIHsxLCAzLCAxLCAxLCA0LCAxLCAwfSwgezEsIDEsIDQsIDEsIDEsIDMsIDB9LAorICAgIHsxLCAxLCA0LCAzLCAxLCAxLCAwfSwgezQsIDEsIDEsIDEsIDEsIDMsIDB9LCB7NCwgMSwgMSwgMywgMSwgMSwgMH0sCisgICAgezEsIDEsIDMsIDEsIDQsIDEsIDB9LCB7MSwgMSwgNCwgMSwgMywgMSwgMH0sIHszLCAxLCAxLCAxLCA0LCAxLCAwfSwKKyAgICB7NCwgMSwgMSwgMSwgMywgMSwgMH0sIHsyLCAxLCAxLCA0LCAxLCAyLCAwfSwgezIsIDEsIDEsIDIsIDEsIDQsIDB9LAorICAgIHsyLCAxLCAxLCAyLCAzLCAyLCAwfSwgezIsIDMsIDMsIDEsIDEsIDEsIDJ9fTsKKworY29uc3QgaW50MzJfdCBDT0RFX1NUQVJUX0IgPSAxMDQ7Citjb25zdCBpbnQzMl90IENPREVfU1RBUlRfQyA9IDEwNTsKK2NvbnN0IGludDMyX3QgQ09ERV9TVE9QID0gMTA2OworCit9ICAvLyBuYW1lc3BhY2UKKworQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpDQkNfT25lZENvZGUxMjhXcml0ZXIoQkNfVFlQRSB0eXBlKQorICAgIDogbV9jb2RlRm9ybWF0KHR5cGUpIHsKKyAgYXNzZXJ0KG1fY29kZUZvcm1hdCA9PSBCQ19DT0RFMTI4X0IgfHwgbV9jb2RlRm9ybWF0ID09IEJDX0NPREUxMjhfQyk7Cit9CisKK0NCQ19PbmVkQ29kZTEyOFdyaXRlcjo6fkNCQ19PbmVkQ29kZTEyOFdyaXRlcigpIHt9CisKK2Jvb2wgQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpDaGVja0NvbnRlbnRWYWxpZGl0eSgKKyAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBjaCA6IGNvbnRlbnRzKSB7CisgICAgaW50MzJfdCBwYXR0ZXJuSW5kZXggPSBzdGF0aWNfY2FzdDxpbnQzMl90PihjaCk7CisgICAgaWYgKHBhdHRlcm5JbmRleCA8IDMyIHx8IHBhdHRlcm5JbmRleCA+IDEyNiB8fCBwYXR0ZXJuSW5kZXggPT0gMzQpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK1dpZGVTdHJpbmcgQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpGaWx0ZXJDb250ZW50cygKKyAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIHsKKyAgV2lkZVN0cmluZyBmaWx0ZXJDaGluZXNlQ2hhcjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgd2NoYXJfdCBjaCA9IGNvbnRlbnRzW2ldOworICAgIGlmIChjaCA+IDE3NSkgeworICAgICAgaSsrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGZpbHRlckNoaW5lc2VDaGFyICs9IGNoOworICB9CisgIGNvbnN0IHdjaGFyX3QgbGltaXQgPSBtX2NvZGVGb3JtYXQgPT0gQkNfQ09ERTEyOF9CID8gMTI2IDogMTA2OworICBXaWRlU3RyaW5nIGZpbHRlcmNvbnRlbnRzOworICBmb3IgKGNvbnN0IGF1dG8mIGNoIDogZmlsdGVyQ2hpbmVzZUNoYXIpIHsKKyAgICBpZiAoY2ggPj0gMzIgJiYgY2ggPD0gbGltaXQpCisgICAgICBmaWx0ZXJjb250ZW50cyArPSBjaDsKKyAgfQorICByZXR1cm4gZmlsdGVyY29udGVudHM7Cit9CisKK2Jvb2wgQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pIHsKKyAgaWYgKGxvY2F0aW9uIDwgQkNfVEVYVF9MT0NfTk9ORSB8fCBsb2NhdGlvbiA+IEJDX1RFWFRfTE9DX0JFTE9XRU1CRUQpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbV9sb2NUZXh0TG9jID0gbG9jYXRpb247CisgIHJldHVybiB0cnVlOworfQorCit1aW50OF90KiBDQkNfT25lZENvZGUxMjhXcml0ZXI6OkVuY29kZVdpdGhIaW50KGNvbnN0IEJ5dGVTdHJpbmcmIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMpIHsKKyAgaWYgKGZvcm1hdCAhPSBCQ0ZPUk1BVF9DT0RFXzEyOCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIENCQ19PbmVEaW1Xcml0ZXI6OkVuY29kZVdpdGhIaW50KGNvbnRlbnRzLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50cyk7Cit9CisKK3VpbnQ4X3QqIENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6RW5jb2RlSW1wbChjb25zdCBCeXRlU3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRMZW5ndGgpIHsKKyAgaWYgKGNvbnRlbnRzLkdldExlbmd0aCgpIDwgMSB8fCBjb250ZW50cy5HZXRMZW5ndGgoKSA+IDgwKQorICAgIHJldHVybiBudWxscHRyOworCisgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHBhdHRlcm5zOworICBpbnQzMl90IGNoZWNrU3VtID0gMDsKKyAgaWYgKG1fY29kZUZvcm1hdCA9PSBCQ19DT0RFMTI4X0IpCisgICAgY2hlY2tTdW0gPSBFbmNvZGUxMjhCKGNvbnRlbnRzLCAmcGF0dGVybnMpOworICBlbHNlCisgICAgY2hlY2tTdW0gPSBFbmNvZGUxMjhDKGNvbnRlbnRzLCAmcGF0dGVybnMpOworCisgIGNoZWNrU3VtICU9IDEwMzsKKyAgcGF0dGVybnMucHVzaF9iYWNrKGNoZWNrU3VtKTsKKyAgcGF0dGVybnMucHVzaF9iYWNrKENPREVfU1RPUCk7CisgIG1faUNvbnRlbnRMZW4gPSBjb250ZW50cy5HZXRMZW5ndGgoKSArIDM7CisgIGludDMyX3QgY29kZVdpZHRoID0gMDsKKyAgZm9yIChjb25zdCBhdXRvJiBwYXR0ZXJuSW5kZXggOiBwYXR0ZXJucykgeworICAgIGNvbnN0IGludDhfdCogcGF0dGVybiA9IENPREVfUEFUVEVSTlNbcGF0dGVybkluZGV4XTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtQYXR0ZXJuU2l6ZTsgKytpKQorICAgICAgY29kZVdpZHRoICs9IHBhdHRlcm5baV07CisgIH0KKyAgb3V0TGVuZ3RoID0gY29kZVdpZHRoOworICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4gcmVzdWx0KEZYX0FsbG9jKHVpbnQ4X3QsIG91dExlbmd0aCkpOworICBpbnQzMl90IHBvcyA9IDA7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF0dGVybnMuc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBpbnQ4X3QqIHBhdHRlcm4gPSBDT0RFX1BBVFRFUk5TW3BhdHRlcm5zW2ldXTsKKyAgICBpbnQzMl90IGUgPSBCQ0V4Y2VwdGlvbk5POworICAgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdC5nZXQoKSwgcG9zLCBwYXR0ZXJuLCBrUGF0dGVyblNpemUsIDEsIGUpOworICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gcmVzdWx0LnJlbGVhc2UoKTsKK30KKworLy8gc3RhdGljCitpbnQzMl90IENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6RW5jb2RlMTI4Qihjb25zdCBCeXRlU3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBwYXR0ZXJucykgeworICBpbnQzMl90IGNoZWNrV2VpZ2h0ID0gMTsKKyAgcGF0dGVybnMtPnB1c2hfYmFjayhDT0RFX1NUQVJUX0IpOworICBpbnQzMl90IGNoZWNrU3VtID0gQ09ERV9TVEFSVF9CICogY2hlY2tXZWlnaHQ7CisgIGZvciAoc2l6ZV90IHBvc2l0aW9uID0gMDsgcG9zaXRpb24gPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgcG9zaXRpb24rKykgeworICAgIGludDMyX3QgcGF0dGVybkluZGV4ID0gY29udGVudHNbcG9zaXRpb25dIC0gJyAnOworICAgIHBhdHRlcm5zLT5wdXNoX2JhY2socGF0dGVybkluZGV4KTsKKyAgICBjaGVja1N1bSArPSBwYXR0ZXJuSW5kZXggKiBjaGVja1dlaWdodCsrOworICB9CisgIHJldHVybiBjaGVja1N1bTsKK30KKworLy8gc3RhdGljCitpbnQzMl90IENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6RW5jb2RlMTI4Qyhjb25zdCBCeXRlU3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBwYXR0ZXJucykgeworICBpbnQzMl90IGNoZWNrV2VpZ2h0ID0gMTsKKyAgcGF0dGVybnMtPnB1c2hfYmFjayhDT0RFX1NUQVJUX0MpOworICBpbnQzMl90IGNoZWNrU3VtID0gQ09ERV9TVEFSVF9DICogY2hlY2tXZWlnaHQ7CisgIHNpemVfdCBwb3NpdGlvbiA9IDA7CisgIHdoaWxlIChwb3NpdGlvbiA8IGNvbnRlbnRzLkdldExlbmd0aCgpKSB7CisgICAgaW50MzJfdCBwYXR0ZXJuSW5kZXg7CisgICAgY2hhciBjaCA9IGNvbnRlbnRzW3Bvc2l0aW9uXTsKKyAgICBpZiAoc3RkOjppc2RpZ2l0KGNoKSkgeworICAgICAgcGF0dGVybkluZGV4ID0gRlhTWVNfYXRvaSgKKyAgICAgICAgICBjb250ZW50cy5NaWQocG9zaXRpb24sIGNvbnRlbnRzLklzVmFsaWRJbmRleChwb3NpdGlvbiArIDEpID8gMiA6IDEpCisgICAgICAgICAgICAgIC5jX3N0cigpKTsKKyAgICAgICsrcG9zaXRpb247CisgICAgICBpZiAocG9zaXRpb24gPCBjb250ZW50cy5HZXRMZW5ndGgoKSAmJiBzdGQ6OmlzZGlnaXQoY29udGVudHNbcG9zaXRpb25dKSkKKyAgICAgICAgKytwb3NpdGlvbjsKKyAgICB9IGVsc2UgeworICAgICAgcGF0dGVybkluZGV4ID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oY2gpOworICAgICAgKytwb3NpdGlvbjsKKyAgICB9CisgICAgcGF0dGVybnMtPnB1c2hfYmFjayhwYXR0ZXJuSW5kZXgpOworICAgIGNoZWNrU3VtICs9IHBhdHRlcm5JbmRleCAqIGNoZWNrV2VpZ2h0Kys7CisgIH0KKyAgcmV0dXJuIGNoZWNrU3VtOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhXcml0ZXIuaCBiL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMTI4V3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkYjY1YQotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMTI4V3JpdGVyLmgKQEAgLTAsMCArMSw0NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9PTkVEX0JDX09ORURDT0RFMTI4V1JJVEVSX0hfCisjZGVmaW5lIEZYQkFSQ09ERV9PTkVEX0JDX09ORURDT0RFMTI4V1JJVEVSX0hfCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL29uZWQvQkNfT25lRGltV3JpdGVyLmgiCisKK2NsYXNzIENCQ19PbmVkQ29kZTEyOFdyaXRlciA6IHB1YmxpYyBDQkNfT25lRGltV3JpdGVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENCQ19PbmVkQ29kZTEyOFdyaXRlcihCQ19UWVBFIHR5cGUpOworICB+Q0JDX09uZWRDb2RlMTI4V3JpdGVyKCkgb3ZlcnJpZGU7CisKKyAgLy8gRXhwb3NlZCBmb3IgdGVzdGluZy4KKyAgc3RhdGljIGludDMyX3QgRW5jb2RlMTI4Qihjb25zdCBCeXRlU3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiogcGF0dGVybnMpOworICBzdGF0aWMgaW50MzJfdCBFbmNvZGUxMjhDKGNvbnN0IEJ5dGVTdHJpbmcmIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBwYXR0ZXJucyk7CisKKyAgLy8gQ0JDX09uZURpbVdyaXRlcgorICB1aW50OF90KiBFbmNvZGVXaXRoSGludChjb25zdCBCeXRlU3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzKSBvdmVycmlkZTsKKyAgdWludDhfdCogRW5jb2RlSW1wbChjb25zdCBCeXRlU3RyaW5nJiBjb250ZW50cywgaW50MzJfdCYgb3V0TGVuZ3RoKSBvdmVycmlkZTsKKyAgYm9vbCBDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIG92ZXJyaWRlOworICBXaWRlU3RyaW5nIEZpbHRlckNvbnRlbnRzKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cykgb3ZlcnJpZGU7CisKKyAgYm9vbCBTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pOworCisgIEJDX1RZUEUgR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fY29kZUZvcm1hdDsgfQorCisgcHJpdmF0ZToKKyAgY29uc3QgQkNfVFlQRSBtX2NvZGVGb3JtYXQ7Cit9OworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9PTkVEX0JDX09ORURDT0RFMTI4V1JJVEVSX0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTEyOFdyaXRlcl91bml0dGVzdC5jcHAgYi9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTEyOFdyaXRlcl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmZjgwNAotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMTI4V3JpdGVyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDEyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhXcml0ZXIuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHsKKworc3RydWN0IFRlc3RDYXNlIHsKKyAgY29uc3QgY2hhciogaW5wdXQ7CisgIGludDMyX3QgY2hlY2tzdW07CisgIGludDMyX3QgcGF0dGVybnNbN107CisgIHNpemVfdCBudW1fcGF0dGVybnM7Cit9OworCitURVNUKE9uZWRDb2RlMTI4V3JpdGVyVGVzdCwgRW5jb2RlMTI4QikgeworICBjaGFyIGJ1ZlsxMDBdOworICBUZXN0Q2FzZSBrVGVzdENhc2VzW10gPSB7CisgICAgICB7IiIsIDEwNCwgezEwNH0sIDF9LAorICAgICAgeyJhIiwgMTY5LCB7MTA0LCA2NX0sIDJ9LAorICAgICAgeyIxIiwgMTIxLCB7MTA0LCAxN30sIDJ9LAorICAgICAgeyJhMSIsIDIwMywgezEwNCwgNjUsIDE3fSwgM30sCisgICAgICB7ImFiIiwgMzAxLCB7MTA0LCA2NSwgNjZ9LCAzfSwKKyAgICAgIHsiMTIiLCAxNTcsIHsxMDQsIDE3LCAxOH0sIDN9LAorICAgICAgeyJhYmMiLCA1MDIsIHsxMDQsIDY1LCA2NiwgNjd9LCA0fSwKKyAgICAgIHsiMTIzIiwgMjE0LCB7MTA0LCAxNywgMTgsIDE5fSwgNH0sCisgICAgICB7ImFiYzEyMyIsIDc3NCwgezEwNCwgNjUsIDY2LCA2NywgMTcsIDE4LCAxOX0sIDd9LAorICAgICAgeyJBQkMxMjMiLCA1ODIsIHsxMDQsIDMzLCAzNCwgMzUsIDE3LCAxOCwgMTl9LCA3fSwKKyAgICAgIHsiMzIxQUJDIiwgNzIyLCB7MTA0LCAxOSwgMTgsIDE3LCAzMywgMzQsIDM1fSwgN30sCisgICAgICB7IlhZWiIsIDQ0OCwgezEwNCwgNTYsIDU3LCA1OH0sIDR9LAorICB9OworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShrVGVzdENhc2VzKTsgKytpKSB7CisgICAgRlhTWVNfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSAtIDEsICJUZXN0IGNhc2UgJXp1IiwgaSk7CisgICAgU0NPUEVEX1RSQUNFKGJ1Zik7CisgICAgY29uc3QgVGVzdENhc2UmIHRlc3RfY2FzZSA9IGtUZXN0Q2FzZXNbaV07CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gcGF0dGVybnM7CisgICAgaW50MzJfdCBjaGVja3N1bSA9CisgICAgICAgIENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6RW5jb2RlMTI4Qih0ZXN0X2Nhc2UuaW5wdXQsICZwYXR0ZXJucyk7CisgICAgRVhQRUNUX0VRKHRlc3RfY2FzZS5jaGVja3N1bSwgY2hlY2tzdW0pOworICAgIEFTU0VSVF9FUSh0ZXN0X2Nhc2UubnVtX3BhdHRlcm5zLCBwYXR0ZXJucy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcGF0dGVybnMuc2l6ZSgpOyArK2opIHsKKyAgICAgIEZYU1lTX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxLCAiQ29tcGFyaXNvbiAlenUiLCBqKTsKKyAgICAgIFNDT1BFRF9UUkFDRShidWYpOworICAgICAgRVhQRUNUX0VRKHRlc3RfY2FzZS5wYXR0ZXJuc1tqXSwgcGF0dGVybnNbal0pOworICAgIH0KKyAgfQorfQorCitURVNUKE9uZWRDb2RlMTI4V3JpdGVyVGVzdCwgRW5jb2RlMTI4QykgeworICBjaGFyIGJ1ZlsxMDBdOworICBUZXN0Q2FzZSBrVGVzdENhc2VzW10gPSB7CisgICAgICB7IiIsIDEwNSwgezEwNX0sIDF9LAorICAgICAgeyJhIiwgMjAyLCB7MTA1LCA5N30sIDJ9LAorICAgICAgeyIxIiwgMTA2LCB7MTA1LCAxfSwgMn0sCisgICAgICB7ImExIiwgMjA0LCB7MTA1LCA5NywgMX0sIDN9LAorICAgICAgeyJhYiIsIDM5OCwgezEwNSwgOTcsIDk4fSwgM30sCisgICAgICB7IjEyIiwgMTE3LCB7MTA1LCAxMn0sIDJ9LAorICAgICAgeyJhYmMiLCA2OTUsIHsxMDUsIDk3LCA5OCwgOTl9LCA0fSwKKyAgICAgIHsiMTIzIiwgMTIzLCB7MTA1LCAxMiwgM30sIDN9LAorICAgICAgeyJhYmMxMjMiLCA3NTgsIHsxMDUsIDk3LCA5OCwgOTksIDEyLCAzfSwgNn0sCisgICAgICB7IkFCQzEyMyIsIDU2NiwgezEwNSwgNjUsIDY2LCA2NywgMTIsIDN9LCA2fSwKKyAgICAgIHsiMzIxQUJDIiwgOTMzLCB7MTA1LCAzMiwgMSwgNjUsIDY2LCA2N30sIDZ9LAorICAgICAgeyJYWVoiLCA2NDEsIHsxMDUsIDg4LCA4OSwgOTB9LCA0fSwKKyAgfTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoa1Rlc3RDYXNlcyk7ICsraSkgeworICAgIEZYU1lTX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxLCAiVGVzdCBjYXNlICV6dSIsIGkpOworICAgIFNDT1BFRF9UUkFDRShidWYpOworICAgIGNvbnN0IFRlc3RDYXNlJiB0ZXN0X2Nhc2UgPSBrVGVzdENhc2VzW2ldOworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHBhdHRlcm5zOworICAgIGludDMyX3QgY2hlY2tzdW0gPQorICAgICAgICBDQkNfT25lZENvZGUxMjhXcml0ZXI6OkVuY29kZTEyOEModGVzdF9jYXNlLmlucHV0LCAmcGF0dGVybnMpOworICAgIEVYUEVDVF9FUSh0ZXN0X2Nhc2UuY2hlY2tzdW0sIGNoZWNrc3VtKTsKKyAgICBBU1NFUlRfRVEodGVzdF9jYXNlLm51bV9wYXR0ZXJucywgcGF0dGVybnMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHBhdHRlcm5zLnNpemUoKTsgKytqKSB7CisgICAgICBGWFNZU19zbnByaW50ZihidWYsIHNpemVvZihidWYpIC0gMSwgIkNvbXBhcmlzb24gJXp1Iiwgaik7CisgICAgICBTQ09QRURfVFJBQ0UoYnVmKTsKKyAgICAgIEVYUEVDVF9FUSh0ZXN0X2Nhc2UucGF0dGVybnNbal0sIHBhdHRlcm5zW2pdKTsKKyAgICB9CisgIH0KK30KKworVEVTVChPbmVkQ29kZTEyOFdyaXRlclRlc3QsIENoZWNrQ29udGVudFZhbGlkaXR5KSB7CisgIHsKKyAgICBDQkNfT25lZENvZGUxMjhXcml0ZXIgd3JpdGVyKEJDX0NPREUxMjhfQik7CisgICAgRVhQRUNUX1RSVUUod3JpdGVyLkNoZWNrQ29udGVudFZhbGlkaXR5KEwiIikpOworICAgIEVYUEVDVF9UUlVFKHdyaXRlci5DaGVja0NvbnRlbnRWYWxpZGl0eShMImZvbyIpKTsKKyAgICBFWFBFQ1RfVFJVRSh3cml0ZXIuQ2hlY2tDb250ZW50VmFsaWRpdHkoTCJ4eXoiKSk7CisgICAgRVhQRUNUX0ZBTFNFKHdyaXRlci5DaGVja0NvbnRlbnRWYWxpZGl0eShMIlwiIikpOworICAgIEVYUEVDVF9GQUxTRSh3cml0ZXIuQ2hlY2tDb250ZW50VmFsaWRpdHkoTCJmXHgxMG9vIikpOworICAgIEVYUEVDVF9GQUxTRSh3cml0ZXIuQ2hlY2tDb250ZW50VmFsaWRpdHkoTCJiYXJceDdGIikpOworICAgIEVYUEVDVF9GQUxTRSh3cml0ZXIuQ2hlY2tDb250ZW50VmFsaWRpdHkoTCJxdXhceDg4IikpOworICB9CisgIHsKKyAgICBDQkNfT25lZENvZGUxMjhXcml0ZXIgd3JpdGVyKEJDX0NPREUxMjhfQyk7CisgICAgRVhQRUNUX1RSVUUod3JpdGVyLkNoZWNrQ29udGVudFZhbGlkaXR5KEwiIikpOworICAgIEVYUEVDVF9UUlVFKHdyaXRlci5DaGVja0NvbnRlbnRWYWxpZGl0eShMImZvbyIpKTsKKyAgICBFWFBFQ1RfVFJVRSh3cml0ZXIuQ2hlY2tDb250ZW50VmFsaWRpdHkoTCJ4eXoiKSk7CisgICAgRVhQRUNUX0ZBTFNFKHdyaXRlci5DaGVja0NvbnRlbnRWYWxpZGl0eShMIlwiIikpOworICAgIEVYUEVDVF9GQUxTRSh3cml0ZXIuQ2hlY2tDb250ZW50VmFsaWRpdHkoTCJmXHgxMG9vIikpOworICAgIEVYUEVDVF9GQUxTRSh3cml0ZXIuQ2hlY2tDb250ZW50VmFsaWRpdHkoTCJiYXJceDdGIikpOworICAgIEVYUEVDVF9GQUxTRSh3cml0ZXIuQ2hlY2tDb250ZW50VmFsaWRpdHkoTCJxdXhceDg4IikpOworICB9Cit9CisKK1RFU1QoT25lZENvZGUxMjhXcml0ZXJUZXN0LCBGaWx0ZXJDb250ZW50cykgeworICB7CisgICAgQ0JDX09uZWRDb2RlMTI4V3JpdGVyIHdyaXRlcihCQ19DT0RFMTI4X0IpOworICAgIEVYUEVDVF9TVFJFUShMIiIsIHdyaXRlci5GaWx0ZXJDb250ZW50cyhMIiIpLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUShMImZvbyIsIHdyaXRlci5GaWx0ZXJDb250ZW50cyhMImZvb1x4MTAiKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoTCJmb29sIiwgd3JpdGVyLkZpbHRlckNvbnRlbnRzKEwiZm9vXHgxMGwiKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoTCJmb28iLCB3cml0ZXIuRmlsdGVyQ29udGVudHMoTCJmb29ceDEwXHg3RiIpLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUShMImZvbyIsIHdyaXRlci5GaWx0ZXJDb250ZW50cyhMImZvb1x4MTBceDdGXHg4OCIpLmNfc3RyKCkpOworICAgIEVYUEVDVF9TVFJFUShMImJhciIsIHdyaXRlci5GaWx0ZXJDb250ZW50cyhMImJhclx4MTBceDdGXHg4OCIpLmNfc3RyKCkpOworICB9CisgIHsKKyAgICBDQkNfT25lZENvZGUxMjhXcml0ZXIgd3JpdGVyKEJDX0NPREUxMjhfQyk7CisgICAgRVhQRUNUX1NUUkVRKEwiIiwgd3JpdGVyLkZpbHRlckNvbnRlbnRzKEwiIikuY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKEwiZiIsIHdyaXRlci5GaWx0ZXJDb250ZW50cyhMImZvb1x4MTAiKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoTCJmIiwgd3JpdGVyLkZpbHRlckNvbnRlbnRzKEwiZm9vXHgxMGwiKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoTCJmIiwgd3JpdGVyLkZpbHRlckNvbnRlbnRzKEwiZm9vXHgxMFx4N0YiKS5jX3N0cigpKTsKKyAgICBFWFBFQ1RfU1RSRVEoTCJmIiwgd3JpdGVyLkZpbHRlckNvbnRlbnRzKEwiZm9vXHgxMFx4N0ZceDg4IikuY19zdHIoKSk7CisgICAgRVhQRUNUX1NUUkVRKEwiYmEiLCB3cml0ZXIuRmlsdGVyQ29udGVudHMoTCJiYXJceDEwXHg3Rlx4ODgiKS5jX3N0cigpKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlXcml0ZXIuY3BwIGIvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVdyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA0ZGMxOQotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlXcml0ZXIuY3BwCkBAIC0wLDAgKzEsMjU4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6CisvKgorICogQ29weXJpZ2h0IDIwMTAgWlhpbmcgYXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVdyaXRlci5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL0JDX1dyaXRlci5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL29uZWQvQkNfT25lRGltV3JpdGVyLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IGNoYXIga09uZWRDb2RlMzlBbHBoYWJldFtdID0geworICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsCisgICAgJ0YnLCAnRycsICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywgJ08nLCAnUCcsICdRJywgJ1InLCAnUycsICdUJywKKyAgICAnVScsICdWJywgJ1cnLCAnWCcsICdZJywgJ1onLCAnLScsICcuJywgJyAnLCAnKicsICckJywgJy8nLCAnKycsICclJ307Citjb25zdGV4cHIgc2l6ZV90IGtPbmVkQ29kZTM5QWxwaGFiZXRMZW4gPSBGWF9BcnJheVNpemUoa09uZWRDb2RlMzlBbHBoYWJldCk7CisKK2NvbnN0IGNoYXIga09uZWRDb2RlMzlDaGVja3N1bVtdID0geworICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsCisgICAgJ0YnLCAnRycsICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywgJ08nLCAnUCcsICdRJywgJ1InLCAnUycsICdUJywKKyAgICAnVScsICdWJywgJ1cnLCAnWCcsICdZJywgJ1onLCAnLScsICcuJywgJyAnLCAnJCcsICcvJywgJysnLCAnJSd9Oworc3RhdGljX2Fzc2VydChGWF9BcnJheVNpemUoa09uZWRDb2RlMzlDaGVja3N1bSkgPT0gNDMsICJXcm9uZyBzaXplIik7CisKK2NvbnN0IGludDE2X3Qga09uZWRDb2RlMzlDaGFyYWN0ZXJFbmNvZGluZ1tdID0geworICAgIDB4MDAzNCwgMHgwMTIxLCAweDAwNjEsIDB4MDE2MCwgMHgwMDMxLCAweDAxMzAsIDB4MDA3MCwgMHgwMDI1LCAweDAxMjQsCisgICAgMHgwMDY0LCAweDAxMDksIDB4MDA0OSwgMHgwMTQ4LCAweDAwMTksIDB4MDExOCwgMHgwMDU4LCAweDAwMEQsIDB4MDEwQywKKyAgICAweDAwNEMsIDB4MDAxQywgMHgwMTAzLCAweDAwNDMsIDB4MDE0MiwgMHgwMDEzLCAweDAxMTIsIDB4MDA1MiwgMHgwMDA3LAorICAgIDB4MDEwNiwgMHgwMDQ2LCAweDAwMTYsIDB4MDE4MSwgMHgwMEMxLCAweDAxQzAsIDB4MDA5MSwgMHgwMTkwLCAweDAwRDAsCisgICAgMHgwMDg1LCAweDAxODQsIDB4MDBDNCwgMHgwMDk0LCAweDAwQTgsIDB4MDBBMiwgMHgwMDhBLCAweDAwMkF9Oworc3RhdGljX2Fzc2VydChGWF9BcnJheVNpemUoa09uZWRDb2RlMzlDaGFyYWN0ZXJFbmNvZGluZykgPT0gNDQsICJXcm9uZyBzaXplIik7CisKK30gIC8vIG5hbWVzcGFjZQorCitDQkNfT25lZENvZGUzOVdyaXRlcjo6Q0JDX09uZWRDb2RlMzlXcml0ZXIoKSA6IG1faVdpZGVOYXJyUmF0aW8oMykge30KKworQ0JDX09uZWRDb2RlMzlXcml0ZXI6On5DQkNfT25lZENvZGUzOVdyaXRlcigpIHt9CisKK2Jvb2wgQ0JDX09uZWRDb2RlMzlXcml0ZXI6OkNoZWNrQ29udGVudFZhbGlkaXR5KAorICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cykgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspIHsKKyAgICB3Y2hhcl90IGNoID0gY29udGVudHNbaV07CisgICAgaWYgKChjaCA+PSBMJzAnICYmIGNoIDw9IEwnOScpIHx8IChjaCA+PSBMJ0EnICYmIGNoIDw9IEwnWicpIHx8CisgICAgICAgIGNoID09IEwnLScgfHwgY2ggPT0gTCcuJyB8fCBjaCA9PSBMJyAnIHx8IGNoID09IEwnKicgfHwgY2ggPT0gTCckJyB8fAorICAgICAgICBjaCA9PSBMJy8nIHx8IGNoID09IEwnKycgfHwgY2ggPT0gTCclJykgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworV2lkZVN0cmluZyBDQkNfT25lZENvZGUzOVdyaXRlcjo6RmlsdGVyQ29udGVudHMoCisgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzKSB7CisgIFdpZGVTdHJpbmcgZmlsdGVyY29udGVudHM7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgeworICAgIHdjaGFyX3QgY2ggPSBjb250ZW50c1tpXTsKKyAgICBpZiAoY2ggPT0gTCcqJyAmJiAoaSA9PSAwIHx8IGkgPT0gY29udGVudHMuR2V0TGVuZ3RoKCkgLSAxKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChjaCA+IDE3NSkgeworICAgICAgaSsrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGNoID0gVXBwZXIoY2gpOworICAgIGlmICgoY2ggPj0gTCcwJyAmJiBjaCA8PSBMJzknKSB8fCAoY2ggPj0gTCdBJyAmJiBjaCA8PSBMJ1onKSB8fAorICAgICAgICBjaCA9PSBMJy0nIHx8IGNoID09IEwnLicgfHwgY2ggPT0gTCcgJyB8fCBjaCA9PSBMJyonIHx8IGNoID09IEwnJCcgfHwKKyAgICAgICAgY2ggPT0gTCcvJyB8fCBjaCA9PSBMJysnIHx8IGNoID09IEwnJScpIHsKKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOworICAgIH0KKyAgfQorICByZXR1cm4gZmlsdGVyY29udGVudHM7Cit9CisKK1dpZGVTdHJpbmcgQ0JDX09uZWRDb2RlMzlXcml0ZXI6OlJlbmRlclRleHRDb250ZW50cygKKyAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIHsKKyAgV2lkZVN0cmluZyByZW5kZXJDb250ZW50czsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgd2NoYXJfdCBjaCA9IGNvbnRlbnRzW2ldOworICAgIGlmIChjaCA9PSBMJyonICYmIChpID09IDAgfHwgaSA9PSBjb250ZW50cy5HZXRMZW5ndGgoKSAtIDEpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGNoID4gMTc1KSB7CisgICAgICBpKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKChjaCA+PSBMJzAnICYmIGNoIDw9IEwnOScpIHx8IChjaCA+PSBMJ0EnICYmIGNoIDw9IEwnWicpIHx8CisgICAgICAgIChjaCA+PSBMJ2EnICYmIGNoIDw9IEwneicpIHx8IGNoID09IEwnLScgfHwgY2ggPT0gTCcuJyB8fCBjaCA9PSBMJyAnIHx8CisgICAgICAgIGNoID09IEwnKicgfHwgY2ggPT0gTCckJyB8fCBjaCA9PSBMJy8nIHx8IGNoID09IEwnKycgfHwgY2ggPT0gTCclJykgeworICAgICAgcmVuZGVyQ29udGVudHMgKz0gY2g7CisgICAgfQorICB9CisgIHJldHVybiByZW5kZXJDb250ZW50czsKK30KKworYm9vbCBDQkNfT25lZENvZGUzOVdyaXRlcjo6U2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKSB7CisgIGlmIChsb2NhdGlvbiA8IEJDX1RFWFRfTE9DX05PTkUgfHwgbG9jYXRpb24gPiBCQ19URVhUX0xPQ19CRUxPV0VNQkVEKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1fbG9jVGV4dExvYyA9IGxvY2F0aW9uOworICByZXR1cm4gdHJ1ZTsKK30KK2Jvb2wgQ0JDX09uZWRDb2RlMzlXcml0ZXI6OlNldFdpZGVOYXJyb3dSYXRpbyhpbnQ4X3QgcmF0aW8pIHsKKyAgaWYgKHJhdGlvIDwgMiB8fCByYXRpbyA+IDMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG1faVdpZGVOYXJyUmF0aW8gPSByYXRpbzsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3VpbnQ4X3QqIENCQ19PbmVkQ29kZTM5V3JpdGVyOjpFbmNvZGVXaXRoSGludChjb25zdCBCeXRlU3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMpIHsKKyAgaWYgKGZvcm1hdCAhPSBCQ0ZPUk1BVF9DT0RFXzM5KQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gQ0JDX09uZURpbVdyaXRlcjo6RW5jb2RlV2l0aEhpbnQoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRzKTsKK30KKwordm9pZCBDQkNfT25lZENvZGUzOVdyaXRlcjo6VG9JbnRBcnJheShpbnQxNl90IGEsIGludDhfdCogdG9SZXR1cm4pIHsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgOTsgaSsrKSB7CisgICAgdG9SZXR1cm5baV0gPSAoYSAmICgxIDw8IGkpKSA9PSAwID8gMSA6IG1faVdpZGVOYXJyUmF0aW87CisgIH0KK30KKworY2hhciBDQkNfT25lZENvZGUzOVdyaXRlcjo6Q2FsY0NoZWNrU3VtKGNvbnN0IEJ5dGVTdHJpbmcmIGNvbnRlbnRzKSB7CisgIGlmIChjb250ZW50cy5HZXRMZW5ndGgoKSA+IDgwKQorICAgIHJldHVybiAnKic7CisKKyAgaW50MzJfdCBjaGVja3N1bSA9IDA7CisgIGZvciAoY29uc3QgYXV0byYgYyA6IGNvbnRlbnRzKSB7CisgICAgc2l6ZV90IGogPSAwOworICAgIGZvciAoOyBqIDwga09uZWRDb2RlMzlBbHBoYWJldExlbjsgaisrKSB7CisgICAgICBpZiAoa09uZWRDb2RlMzlBbHBoYWJldFtqXSA9PSBjKSB7CisgICAgICAgIGlmIChjICE9ICcqJykKKyAgICAgICAgICBjaGVja3N1bSArPSBqOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGogPj0ga09uZWRDb2RlMzlBbHBoYWJldExlbikKKyAgICAgIHJldHVybiAnKic7CisgIH0KKyAgcmV0dXJuIGtPbmVkQ29kZTM5Q2hlY2tzdW1bY2hlY2tzdW0gJSBGWF9BcnJheVNpemUoa09uZWRDb2RlMzlDaGVja3N1bSldOworfQorCit1aW50OF90KiBDQkNfT25lZENvZGUzOVdyaXRlcjo6RW5jb2RlSW1wbChjb25zdCBCeXRlU3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dGxlbmd0aCkgeworICBjaGFyIGNoZWNrc3VtID0gQ2FsY0NoZWNrU3VtKGNvbnRlbnRzKTsKKyAgaWYgKGNoZWNrc3VtID09ICcqJykKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBpbnQ4X3Qgd2lkdGhzWzldID0gezB9OworICBpbnQzMl90IHdpZGVTdHJpZGVOdW0gPSAzOworICBpbnQzMl90IG5hcnJTdHJpZGVOdW0gPSA5IC0gd2lkZVN0cmlkZU51bTsKKyAgQnl0ZVN0cmluZyBlbmNvZGVkQ29udGVudHMgPSBjb250ZW50czsKKyAgaWYgKG1fYkNhbGNDaGVja3N1bSkKKyAgICBlbmNvZGVkQ29udGVudHMgKz0gY2hlY2tzdW07CisgIG1faUNvbnRlbnRMZW4gPSBlbmNvZGVkQ29udGVudHMuR2V0TGVuZ3RoKCk7CisgIGludDMyX3QgY29kZVdpZHRoID0gKHdpZGVTdHJpZGVOdW0gKiBtX2lXaWRlTmFyclJhdGlvICsgbmFyclN0cmlkZU51bSkgKiAyICsKKyAgICAgICAgICAgICAgICAgICAgICAxICsgbV9pQ29udGVudExlbjsKKyAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtX2lDb250ZW50TGVuOyBqKyspIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtPbmVkQ29kZTM5QWxwaGFiZXRMZW47IGkrKykgeworICAgICAgaWYgKGtPbmVkQ29kZTM5QWxwaGFiZXRbaV0gIT0gZW5jb2RlZENvbnRlbnRzW2pdKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgVG9JbnRBcnJheShrT25lZENvZGUzOUNoYXJhY3RlckVuY29kaW5nW2ldLCB3aWR0aHMpOworICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCA5OyBrKyspCisgICAgICAgIGNvZGVXaWR0aCArPSB3aWR0aHNba107CisgICAgfQorICB9CisgIG91dGxlbmd0aCA9IGNvZGVXaWR0aDsKKyAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IHJlc3VsdChGWF9BbGxvYyh1aW50OF90LCBjb2RlV2lkdGgpKTsKKyAgVG9JbnRBcnJheShrT25lZENvZGUzOUNoYXJhY3RlckVuY29kaW5nWzM5XSwgd2lkdGhzKTsKKyAgaW50MzJfdCBlID0gQkNFeGNlcHRpb25OTzsKKyAgaW50MzJfdCBwb3MgPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdC5nZXQoKSwgMCwgd2lkdGhzLCA5LCAxLCBlKTsKKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBpbnQ4X3QgbmFycm93V2hpdGVbXSA9IHsxfTsKKyAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LmdldCgpLCBwb3MsIG5hcnJvd1doaXRlLCAxLCAwLCBlKTsKKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBmb3IgKGludDMyX3QgbCA9IG1faUNvbnRlbnRMZW4gLSAxOyBsID49IDA7IGwtLSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga09uZWRDb2RlMzlBbHBoYWJldExlbjsgaSsrKSB7CisgICAgICBpZiAoa09uZWRDb2RlMzlBbHBoYWJldFtpXSAhPSBlbmNvZGVkQ29udGVudHNbbF0pCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBUb0ludEFycmF5KGtPbmVkQ29kZTM5Q2hhcmFjdGVyRW5jb2RpbmdbaV0sIHdpZHRocyk7CisgICAgICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQuZ2V0KCksIHBvcywgd2lkdGhzLCA5LCAxLCBlKTsKKyAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQuZ2V0KCksIHBvcywgbmFycm93V2hpdGUsIDEsIDAsIGUpOworICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBUb0ludEFycmF5KGtPbmVkQ29kZTM5Q2hhcmFjdGVyRW5jb2RpbmdbMzldLCB3aWR0aHMpOworICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQuZ2V0KCksIHBvcywgd2lkdGhzLCA5LCAxLCBlKTsKKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBhdXRvKiByZXN1bHRfcHRyID0gcmVzdWx0LmdldCgpOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb2RlV2lkdGggLyAyOyBpKyspIHsKKyAgICByZXN1bHRfcHRyW2ldIF49IHJlc3VsdF9wdHJbY29kZVdpZHRoIC0gMSAtIGldOworICAgIHJlc3VsdF9wdHJbY29kZVdpZHRoIC0gMSAtIGldIF49IHJlc3VsdF9wdHJbaV07CisgICAgcmVzdWx0X3B0cltpXSBePSByZXN1bHRfcHRyW2NvZGVXaWR0aCAtIDEgLSBpXTsKKyAgfQorICByZXR1cm4gcmVzdWx0LnJlbGVhc2UoKTsKK30KKworYm9vbCBDQkNfT25lZENvZGUzOVdyaXRlcjo6ZW5jb2RlZENvbnRlbnRzKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nKiByZXN1bHQpIHsKKyAgKnJlc3VsdCA9IFdpZGVTdHJpbmcoY29udGVudHMpOworICBpZiAobV9iQ2FsY0NoZWNrc3VtICYmIG1fYlByaW50Q2hlY2tzdW0pIHsKKyAgICBXaWRlU3RyaW5nIGNoZWNrc3VtQ29udGVudCA9IEZpbHRlckNvbnRlbnRzKGNvbnRlbnRzKTsKKyAgICBCeXRlU3RyaW5nIHN0ciA9IGNoZWNrc3VtQ29udGVudC5VVEY4RW5jb2RlKCk7CisgICAgY2hhciBjaGVja3N1bTsKKyAgICBjaGVja3N1bSA9IENhbGNDaGVja1N1bShzdHIpOworICAgIGlmIChjaGVja3N1bSA9PSAnKicpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgc3RyICs9IGNoZWNrc3VtOworICAgICpyZXN1bHQgKz0gY2hlY2tzdW07CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ0JDX09uZWRDb2RlMzlXcml0ZXI6OlJlbmRlclJlc3VsdChjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVMZW5ndGgpIHsKKyAgV2lkZVN0cmluZyBlbmNvZGVkQ29uOworICBpZiAoIWVuY29kZWRDb250ZW50cyhjb250ZW50cywgJmVuY29kZWRDb24pKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIENCQ19PbmVEaW1Xcml0ZXI6OlJlbmRlclJlc3VsdChlbmNvZGVkQ29uLkFzU3RyaW5nVmlldygpLCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVMZW5ndGgpOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVdyaXRlci5oIGIvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNjExYzAKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTM5V3JpdGVyLmgKQEAgLTAsMCArMSw0NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9PTkVEX0JDX09ORURDT0RFMzlXUklURVJfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX09ORURfQkNfT05FRENPREUzOVdSSVRFUl9IXworCisjaW5jbHVkZSAiZnhiYXJjb2RlL0JDX0xpYnJhcnkuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuaCIKKworY2xhc3MgQ0JDX09uZWRDb2RlMzlXcml0ZXIgOiBwdWJsaWMgQ0JDX09uZURpbVdyaXRlciB7CisgcHVibGljOgorICBDQkNfT25lZENvZGUzOVdyaXRlcigpOworICB+Q0JDX09uZWRDb2RlMzlXcml0ZXIoKSBvdmVycmlkZTsKKworICAvLyBDQkNfT25lRGltV3JpdGVyCisgIHVpbnQ4X3QqIEVuY29kZVdpdGhIaW50KGNvbnN0IEJ5dGVTdHJpbmcmIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMpIG92ZXJyaWRlOworICB1aW50OF90KiBFbmNvZGVJbXBsKGNvbnN0IEJ5dGVTdHJpbmcmIGNvbnRlbnRzLCBpbnQzMl90JiBvdXRMZW5ndGgpIG92ZXJyaWRlOworICBib29sIFJlbmRlclJlc3VsdChjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvZGUsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZUxlbmd0aCkgb3ZlcnJpZGU7CisgIGJvb2wgQ2hlY2tDb250ZW50VmFsaWRpdHkoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzKSBvdmVycmlkZTsKKyAgV2lkZVN0cmluZyBGaWx0ZXJDb250ZW50cyhjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIG92ZXJyaWRlOworICBXaWRlU3RyaW5nIFJlbmRlclRleHRDb250ZW50cyhjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIG92ZXJyaWRlOworCisgIHZpcnR1YWwgYm9vbCBTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jdGlvbik7CisgIHZpcnR1YWwgYm9vbCBTZXRXaWRlTmFycm93UmF0aW8oaW50OF90IHJhdGlvKTsKKworICBib29sIGVuY29kZWRDb250ZW50cyhjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMsIFdpZGVTdHJpbmcqIHJlc3VsdCk7CisKKyBwcml2YXRlOgorICB2b2lkIFRvSW50QXJyYXkoaW50MTZfdCBhLCBpbnQ4X3QqIHRvUmV0dXJuKTsKKyAgY2hhciBDYWxjQ2hlY2tTdW0oY29uc3QgQnl0ZVN0cmluZyYgY29udGVudHMpOworCisgIGludDhfdCBtX2lXaWRlTmFyclJhdGlvOworfTsKKworI2VuZGlmICAvLyBGWEJBUkNPREVfT05FRF9CQ19PTkVEQ09ERTM5V1JJVEVSX0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTM5V3JpdGVyX3VuaXR0ZXN0LmNwcCBiL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlXcml0ZXJfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YTA0MTAKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTM5V3JpdGVyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDE4NCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSA8Y3N0cmluZz4KKworI2luY2x1ZGUgImZ4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlXcml0ZXIuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworbmFtZXNwYWNlIHsKKworLy8gMyB3aWRlIGFuZCA2IG5hcnJvdyBtb2R1bGVzIHBlciBjaGFyLiAxIHNwYWNlIGJldHdlZW4gY2hhcnMuCitjb25zdCBpbnQgTU9EVUxFU19QRVJfQ0hBUiA9IDMgKiAzICsgNiAqIDEgKyAxOworCisvLyAnKicgaXMgYWRkZWQgYXMgdGhlIGZpcnN0IGFuZCBsYXN0IGNoYXIuCitjb25zdCBpbnQgREVMSU1JVEVSX0NIQVJTID0gMjsKKworLy8gTGFzdCBjaGFyIG1heSBzZXJ2ZSBhcyBjaGVja3N1bS4KK2NvbnN0IGludCBDSEVDS1NVTV9DSEFSUyA9IDE7CisKK1RFU1QoT25lZENvZGUzOVdyaXRlclRlc3QsIFNldFdpZGVOYXJyb3dSYXRpbykgeworICAvLyBDb2RlIDM5IGJhcmNvZGVzIGVuY29kZSBzdHJpbmdzIG9mIGFueSBzaXplIGludG8gbW9kdWxlcyBpbiBhCisgIC8vIHVuaWRpbWVuc2lvbmFsIGRpc3Bvc2l0aW9uLgorICAvLyBFYWNoIG1vZHVsZSBpcyBlaXRoZXI6IGEgbmFycm93IGJhciwgYSBuYXJyb3cgc3BhY2UsIGEgd2lkZQorICAvLyBiYXIsIG9yIGEgd2lkZSBzcGFjZS4gQWNjZXB0ZWQgd2lkZS10by1uYXJyb3cgcmF0aW9zIGFyZSBiZXR3ZWVuIDIgYW5kIDMuCisgIC8vIFRoaXMgd3JpdGVyIGluIHBhcnRpY3VsYXIgb25seSB0YWtlcyBpbnRlZ2VyIHJhdGlvcywgc28gaXQncyBlaXRoZXIgMiBvciAzLgorICBDQkNfT25lZENvZGUzOVdyaXRlciB3cml0ZXI7CisgIEVYUEVDVF9GQUxTRSh3cml0ZXIuU2V0V2lkZU5hcnJvd1JhdGlvKDApKTsKKyAgRVhQRUNUX0ZBTFNFKHdyaXRlci5TZXRXaWRlTmFycm93UmF0aW8oMSkpOworICBFWFBFQ1RfVFJVRSh3cml0ZXIuU2V0V2lkZU5hcnJvd1JhdGlvKDIpKTsKKyAgRVhQRUNUX1RSVUUod3JpdGVyLlNldFdpZGVOYXJyb3dSYXRpbygzKSk7CisgIEVYUEVDVF9GQUxTRSh3cml0ZXIuU2V0V2lkZU5hcnJvd1JhdGlvKDQpKTsKKyAgRVhQRUNUX0ZBTFNFKHdyaXRlci5TZXRXaWRlTmFycm93UmF0aW8oMTAwKSk7CisKKyAgd3JpdGVyLlNldFdpZGVOYXJyb3dSYXRpbygzKTsKKworICBpbnQzMl90IHdpZHRoOworICBpbnQzMl90IGhlaWdodDsKKyAgdWludDhfdCogZW5jb2RlZDsKKyAgY29uc3QgY2hhciogZXhwZWN0ZWQ7CisKKyAgZW5jb2RlZCA9IHdyaXRlci5FbmNvZGUoIlBERklVTSIsIEJDRk9STUFUX0NPREVfMzksIHdpZHRoLCBoZWlnaHQpOworICBleHBlY3RlZCA9CisgICAgICAiIyAgICMgIyMjICMjIyAjICIgIC8vICogU3RhcnQKKyAgICAgICIjICMjIyAjIyMgIyAgICMgIiAgLy8gUAorICAgICAgIiMgIyAjIyMgICAjICMjIyAiICAvLyBECisgICAgICAiIyAjIyMgIyMjICAgIyAjICIgIC8vIEYKKyAgICAgICIjICMjIyAjICAgIyMjICMgIiAgLy8gSQorICAgICAgIiMjIyAgICMgIyAjICMjIyAiICAvLyBVCisgICAgICAiIyMjICMjIyAjICMgICAjICIgIC8vIE0KKyAgICAgICIjICAgIyAjIyMgIyMjICMiOyAgLy8gKiBFbmQKKyAgRlhfRnJlZShlbmNvZGVkKTsKKworICB3cml0ZXIuU2V0V2lkZU5hcnJvd1JhdGlvKDIpOworCisgIGVuY29kZWQgPSB3cml0ZXIuRW5jb2RlKCJQREZJVU0iLCBCQ0ZPUk1BVF9DT0RFXzM5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgZXhwZWN0ZWQgPQorICAgICAgIiMgICMgIyMgIyMgIyAiICAvLyAqIFN0YXJ0CisgICAgICAiIyAjIyAjIyAjICAjICIgIC8vIFAKKyAgICAgICIjICMgIyMgICMgIyMgIiAgLy8gRAorICAgICAgIiMgIyMgIyMgICMgIyAiICAvLyBGCisgICAgICAiIyAjIyAjICAjIyAjICIgIC8vIEkKKyAgICAgICIjIyAgIyAjICMgIyMgIiAgLy8gVQorICAgICAgIiMjICMjICMgIyAgIyAiICAvLyBNCisgICAgICAiIyAgIyAjIyAjIyAjIjsgIC8vICogRW5kCisgIEZYX0ZyZWUoZW5jb2RlZCk7Cit9CisKK1RFU1QoT25lZENvZGUzOVdyaXRlclRlc3QsIEVuY29kZSkgeworICBDQkNfT25lZENvZGUzOVdyaXRlciB3cml0ZXI7CisgIGludDMyX3Qgd2lkdGg7CisgIGludDMyX3QgaGVpZ2h0OworICB1aW50OF90KiBlbmNvZGVkOworICBjb25zdCBjaGFyKiBleHBlY3RlZDsKKworICBlbmNvZGVkID0gd3JpdGVyLkVuY29kZSgiIiwgQkNGT1JNQVRfQ09ERV8zOSwgd2lkdGgsIGhlaWdodCk7CisgIEVYUEVDVF9FUSgxLCBoZWlnaHQpOworICBFWFBFQ1RfRVEoKDAgKyBERUxJTUlURVJfQ0hBUlMpICogTU9EVUxFU19QRVJfQ0hBUiAtIDEsIHdpZHRoKTsKKyAgZXhwZWN0ZWQgPQorICAgICAgIiMgICAjICMjIyAjIyMgIyAiICAvLyAqIFN0YXJ0CisgICAgICAiIyAgICMgIyMjICMjIyAjIjsgIC8vICogRW5kCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RybGVuKGV4cGVjdGVkKTsgaSsrKSB7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkW2ldICE9ICcgJywgISFlbmNvZGVkW2ldKSA8PCBpOworICB9CisgIEZYX0ZyZWUoZW5jb2RlZCk7CisKKyAgZW5jb2RlZCA9IHdyaXRlci5FbmNvZGUoIjEyMyIsIEJDRk9STUFUX0NPREVfMzksIHdpZHRoLCBoZWlnaHQpOworICBFWFBFQ1RfRVEoMSwgaGVpZ2h0KTsKKyAgRVhQRUNUX0VRKCgzICsgREVMSU1JVEVSX0NIQVJTKSAqIE1PRFVMRVNfUEVSX0NIQVIgLSAxLCB3aWR0aCk7CisgIGV4cGVjdGVkID0KKyAgICAgICIjICAgIyAjIyMgIyMjICMgIiAgLy8gKiBTdGFydAorICAgICAgIiMjIyAjICAgIyAjICMjIyAiICAvLyAxCisgICAgICAiIyAjIyMgICAjICMgIyMjICIgIC8vIDIKKyAgICAgICIjIyMgIyMjICAgIyAjICMgIiAgLy8gMworICAgICAgIiMgICAjICMjIyAjIyMgIyI7ICAvLyAqIEVuZAorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0cmxlbihleHBlY3RlZCk7IGkrKykgeworICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSAhPSAnICcsICEhZW5jb2RlZFtpXSkgPDwgaTsKKyAgfQorICBGWF9GcmVlKGVuY29kZWQpOworCisgIGVuY29kZWQgPSB3cml0ZXIuRW5jb2RlKCJQREZJVU0iLCBCQ0ZPUk1BVF9DT0RFXzM5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgRVhQRUNUX0VRKDEsIGhlaWdodCk7CisgIEVYUEVDVF9FUSgoNiArIERFTElNSVRFUl9DSEFSUykgKiBNT0RVTEVTX1BFUl9DSEFSIC0gMSwgd2lkdGgpOworICBleHBlY3RlZCA9CisgICAgICAiIyAgICMgIyMjICMjIyAjICIgIC8vICogU3RhcnQKKyAgICAgICIjICMjIyAjIyMgIyAgICMgIiAgLy8gUAorICAgICAgIiMgIyAjIyMgICAjICMjIyAiICAvLyBECisgICAgICAiIyAjIyMgIyMjICAgIyAjICIgIC8vIEYKKyAgICAgICIjICMjIyAjICAgIyMjICMgIiAgLy8gSQorICAgICAgIiMjIyAgICMgIyAjICMjIyAiICAvLyBVCisgICAgICAiIyMjICMjIyAjICMgICAjICIgIC8vIE0KKyAgICAgICIjICAgIyAjIyMgIyMjICMiOyAgLy8gKiBFbmQKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJsZW4oZXhwZWN0ZWQpOyBpKyspIHsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0gIT0gJyAnLCAhIWVuY29kZWRbaV0pIDw8IGk7CisgIH0KKyAgRlhfRnJlZShlbmNvZGVkKTsKKworICBlbmNvZGVkID0gd3JpdGVyLkVuY29kZSgiQSAtJCUuLytaIiwgQkNGT1JNQVRfQ09ERV8zOSwgd2lkdGgsIGhlaWdodCk7CisgIEVYUEVDVF9FUSgxLCBoZWlnaHQpOworICBFWFBFQ1RfRVEoKDkgKyBERUxJTUlURVJfQ0hBUlMpICogTU9EVUxFU19QRVJfQ0hBUiAtIDEsIHdpZHRoKTsKKyAgZXhwZWN0ZWQgPQorICAgICAgIiMgICAjICMjIyAjIyMgIyAiICAvLyAqIFN0YXJ0CisgICAgICAiIyMjICMgIyAgICMgIyMjICIgIC8vIEEKKyAgICAgICIjICAgIyMjICMgIyMjICMgIiAgLy8gU3BhY2UKKyAgICAgICIjICAgIyAjICMjIyAjIyMgIiAgLy8gLQorICAgICAgIiMgICAjICAgIyAgICMgIyAiICAvLyAkCisgICAgICAiIyAjICAgIyAgICMgICAjICIgIC8vICUKKyAgICAgICIjIyMgICAjICMgIyMjICMgIiAgLy8gLgorICAgICAgIiMgICAjICAgIyAjICAgIyAiICAvLyAvCisgICAgICAiIyAgICMgIyAgICMgICAjICIgIC8vICsKKyAgICAgICIjICAgIyMjICMjIyAjICMgIiAgLy8gWgorICAgICAgIiMgICAjICMjIyAjIyMgIyI7ICAvLyAqIEVuZAorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0cmxlbihleHBlY3RlZCk7IGkrKykgeworICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSAhPSAnICcsICEhZW5jb2RlZFtpXSkgPDwgaTsKKyAgfQorICBGWF9GcmVlKGVuY29kZWQpOworfQorCitURVNUKE9uZWRDb2RlMzlXcml0ZXJUZXN0LCBDaGVja3N1bSkgeworICBDQkNfT25lZENvZGUzOVdyaXRlciB3cml0ZXI7CisgIGludDMyX3Qgd2lkdGg7CisgIGludDMyX3QgaGVpZ2h0OworICB1aW50OF90KiBlbmNvZGVkOworICBjb25zdCBjaGFyKiBleHBlY3RlZDsKKworICB3cml0ZXIuU2V0Q2FsY0NoZWNrc3VtKHRydWUpOworCisgIGVuY29kZWQgPSB3cml0ZXIuRW5jb2RlKCIxMjMiLCBCQ0ZPUk1BVF9DT0RFXzM5LCB3aWR0aCwgaGVpZ2h0KTsKKyAgRVhQRUNUX0VRKDEsIGhlaWdodCk7CisgIEVYUEVDVF9FUSgoMyArIENIRUNLU1VNX0NIQVJTICsgREVMSU1JVEVSX0NIQVJTKSAqIE1PRFVMRVNfUEVSX0NIQVIgLSAxLAorICAgICAgICAgICAgd2lkdGgpOworICBleHBlY3RlZCA9CisgICAgICAiIyAgICMgIyMjICMjIyAjICIgIC8vICogU3RhcnQKKyAgICAgICIjIyMgIyAgICMgIyAjIyMgIiAgLy8gMSAoMSkKKyAgICAgICIjICMjIyAgICMgIyAjIyMgIiAgLy8gMiAoMikKKyAgICAgICIjIyMgIyMjICAgIyAjICMgIiAgLy8gMyAoMykKKyAgICAgICIjICMjIyAgICMjIyAjICMgIiAgLy8gNiAoNiA9ICgxICsgMiArIDMpICUgNDMpCisgICAgICAiIyAgICMgIyMjICMjIyAjIjsgIC8vICogRW5kCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RybGVuKGV4cGVjdGVkKTsgaSsrKSB7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkW2ldICE9ICcgJywgISFlbmNvZGVkW2ldKSA8PCBpOworICB9CisgIEZYX0ZyZWUoZW5jb2RlZCk7CisKKyAgZW5jb2RlZCA9IHdyaXRlci5FbmNvZGUoIlBERklVTSIsIEJDRk9STUFUX0NPREVfMzksIHdpZHRoLCBoZWlnaHQpOworICBFWFBFQ1RfRVEoMSwgaGVpZ2h0KTsKKyAgRVhQRUNUX0VRKCg2ICsgQ0hFQ0tTVU1fQ0hBUlMgKyBERUxJTUlURVJfQ0hBUlMpICogTU9EVUxFU19QRVJfQ0hBUiAtIDEsCisgICAgICAgICAgICB3aWR0aCk7CisgIGV4cGVjdGVkID0KKyAgICAgICIjICAgIyAjIyMgIyMjICMgIiAgLy8gKiBTdGFydAorICAgICAgIiMgIyMjICMjIyAjICAgIyAiICAvLyBQICgyNSkKKyAgICAgICIjICMgIyMjICAgIyAjIyMgIiAgLy8gRCAoMTMpCisgICAgICAiIyAjIyMgIyMjICAgIyAjICIgIC8vIEYgKDE1KQorICAgICAgIiMgIyMjICMgICAjIyMgIyAiICAvLyBJICgxOCkKKyAgICAgICIjIyMgICAjICMgIyAjIyMgIiAgLy8gVSAoMzApCisgICAgICAiIyMjICMjIyAjICMgICAjICIgIC8vIE0gKDIyKQorICAgICAgIiMjIyAgICMgIyAjIyMgIyAiICAvLyAuICgzNyA9ICgyNSArIDEzICsgMTUgKyAxOCArIDMwICsgMjIpICUgNDMpCisgICAgICAiIyAgICMgIyMjICMjIyAjIjsgIC8vICogRW5kCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RybGVuKGV4cGVjdGVkKTsgaSsrKSB7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkW2ldICE9ICcgJywgISFlbmNvZGVkW2ldKSA8PCBpOworICB9CisgIEZYX0ZyZWUoZW5jb2RlZCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzV3JpdGVyLmNwcCBiL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU4xM1dyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYzMTViYwotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU4xM1dyaXRlci5jcHAKQEAgLTAsMCArMSwyMjQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKKy8qCisgKiBDb3B5cmlnaHQgMjAwOSBaWGluZyBhdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNXcml0ZXIuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjd2N0eXBlPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZGVmYXVsdHJlbmRlcmRldmljZS5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9CQ19Xcml0ZXIuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOQ2hlY2tzdW0uaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgaW50OF90IGtGaXJzdERpZ2l0RW5jb2RpbmdzWzEwXSA9IHsweDAwLCAweDBCLCAweDBELCAweEUsICAweDEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE5LCAweDFDLCAweDE1LCAweDE2LCAweDFBfTsKK2NvbnN0IGludDhfdCBrT25lZEVBTjEzU3RhcnRQYXR0ZXJuWzNdID0gezEsIDEsIDF9OworY29uc3QgaW50OF90IGtPbmVkRUFOMTNNaWRkbGVQYXR0ZXJuWzVdID0gezEsIDEsIDEsIDEsIDF9OworY29uc3QgaW50OF90IGtPbmVkRUFOMTNMUGF0dGVyblsxMF1bNF0gPSB7CisgICAgezMsIDIsIDEsIDF9LCB7MiwgMiwgMiwgMX0sIHsyLCAxLCAyLCAyfSwgezEsIDQsIDEsIDF9LCB7MSwgMSwgMywgMn0sCisgICAgezEsIDIsIDMsIDF9LCB7MSwgMSwgMSwgNH0sIHsxLCAzLCAxLCAyfSwgezEsIDIsIDEsIDN9LCB7MywgMSwgMSwgMn19OworY29uc3QgaW50OF90IExfQU5EX0dfUEFUVEVSTlNbMjBdWzRdID0geworICAgIHszLCAyLCAxLCAxfSwgezIsIDIsIDIsIDF9LCB7MiwgMSwgMiwgMn0sIHsxLCA0LCAxLCAxfSwgezEsIDEsIDMsIDJ9LAorICAgIHsxLCAyLCAzLCAxfSwgezEsIDEsIDEsIDR9LCB7MSwgMywgMSwgMn0sIHsxLCAyLCAxLCAzfSwgezMsIDEsIDEsIDJ9LAorICAgIHsxLCAxLCAyLCAzfSwgezEsIDIsIDIsIDJ9LCB7MiwgMiwgMSwgMn0sIHsxLCAxLCA0LCAxfSwgezIsIDMsIDEsIDF9LAorICAgIHsxLCAzLCAyLCAxfSwgezQsIDEsIDEsIDF9LCB7MiwgMSwgMywgMX0sIHszLCAxLCAyLCAxfSwgezIsIDEsIDEsIDN9fTsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NCQ19PbmVkRUFOMTNXcml0ZXI6OkNCQ19PbmVkRUFOMTNXcml0ZXIoKSB7CisgIG1fYkxlZnRQYWRkaW5nID0gdHJ1ZTsKKyAgbV9jb2RlV2lkdGggPSAzICsgKDcgKiA2KSArIDUgKyAoNyAqIDYpICsgMzsKK30KK0NCQ19PbmVkRUFOMTNXcml0ZXI6On5DQkNfT25lZEVBTjEzV3JpdGVyKCkge30KKworYm9vbCBDQkNfT25lZEVBTjEzV3JpdGVyOjpDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIHsKKyAgcmV0dXJuIHN0ZDo6YWxsX29mKGNvbnRlbnRzLmJlZ2luKCksIGNvbnRlbnRzLmVuZCgpLCBzdGQ6Omlzd2RpZ2l0KTsKK30KKworV2lkZVN0cmluZyBDQkNfT25lZEVBTjEzV3JpdGVyOjpGaWx0ZXJDb250ZW50cyhjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIHsKKyAgV2lkZVN0cmluZyBmaWx0ZXJjb250ZW50czsKKyAgd2NoYXJfdCBjaDsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgY2ggPSBjb250ZW50c1tpXTsKKyAgICBpZiAoY2ggPiAxNzUpIHsKKyAgICAgIGkrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgeworICAgICAgZmlsdGVyY29udGVudHMgKz0gY2g7CisgICAgfQorICB9CisgIHJldHVybiBmaWx0ZXJjb250ZW50czsKK30KKworaW50MzJfdCBDQkNfT25lZEVBTjEzV3JpdGVyOjpDYWxjQ2hlY2tzdW0oY29uc3QgQnl0ZVN0cmluZyYgY29udGVudHMpIHsKKyAgcmV0dXJuIEVBTkNhbGNDaGVja3N1bShjb250ZW50cyk7Cit9CisKK3VpbnQ4X3QqIENCQ19PbmVkRUFOMTNXcml0ZXI6OkVuY29kZVdpdGhIaW50KGNvbnN0IEJ5dGVTdHJpbmcmIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzKSB7CisgIGlmIChmb3JtYXQgIT0gQkNGT1JNQVRfRUFOXzEzKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gQ0JDX09uZURpbVdyaXRlcjo6RW5jb2RlV2l0aEhpbnQoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRzKTsKK30KKwordWludDhfdCogQ0JDX09uZWRFQU4xM1dyaXRlcjo6RW5jb2RlSW1wbChjb25zdCBCeXRlU3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0TGVuZ3RoKSB7CisgIGlmIChjb250ZW50cy5HZXRMZW5ndGgoKSAhPSAxMykKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBtX2lEYXRhTGVudGggPSAxMzsKKyAgaW50MzJfdCBmaXJzdERpZ2l0ID0gRlhTWVNfRGVjaW1hbENoYXJUb0ludChjb250ZW50cy5GaXJzdCgpKTsKKyAgaW50MzJfdCBwYXJpdGllcyA9IGtGaXJzdERpZ2l0RW5jb2RpbmdzW2ZpcnN0RGlnaXRdOworICBvdXRMZW5ndGggPSBtX2NvZGVXaWR0aDsKKyAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IHJlc3VsdCgKKyAgICAgIEZYX0FsbG9jKHVpbnQ4X3QsIG1fY29kZVdpZHRoKSk7CisgIGludDMyX3QgcG9zID0gMDsKKyAgaW50MzJfdCBlID0gQkNFeGNlcHRpb25OTzsKKyAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LmdldCgpLCBwb3MsIGtPbmVkRUFOMTNTdGFydFBhdHRlcm4sIDMsIDEsIGUpOworICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgIHJldHVybiBudWxscHRyOworCisgIGludDMyX3QgaSA9IDA7CisgIGZvciAoaSA9IDE7IGkgPD0gNjsgaSsrKSB7CisgICAgaW50MzJfdCBkaWdpdCA9IEZYU1lTX0RlY2ltYWxDaGFyVG9JbnQoY29udGVudHNbaV0pOworICAgIGlmICgocGFyaXRpZXMgPj4gKDYgLSBpKSAmIDEpID09IDEpIHsKKyAgICAgIGRpZ2l0ICs9IDEwOworICAgIH0KKyAgICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQuZ2V0KCksIHBvcywgTF9BTkRfR19QQVRURVJOU1tkaWdpdF0sIDQsIDAsIGUpOworICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQuZ2V0KCksIHBvcywga09uZWRFQU4xM01pZGRsZVBhdHRlcm4sIDUsIDAsIGUpOworICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgIHJldHVybiBudWxscHRyOworCisgIGZvciAoaSA9IDc7IGkgPD0gMTI7IGkrKykgeworICAgIGludDMyX3QgZGlnaXQgPSBGWFNZU19EZWNpbWFsQ2hhclRvSW50KGNvbnRlbnRzW2ldKTsKKyAgICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQuZ2V0KCksIHBvcywga09uZWRFQU4xM0xQYXR0ZXJuW2RpZ2l0XSwgNCwgMSwgZSk7CisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKKyAgICAgIHJldHVybiBudWxscHRyOworICB9CisgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdC5nZXQoKSwgcG9zLCBrT25lZEVBTjEzU3RhcnRQYXR0ZXJuLCAzLCAxLCBlKTsKKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7Cit9CisKK2Jvb2wgQ0JDX09uZWRFQU4xM1dyaXRlcjo6U2hvd0NoYXJzKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYmFyV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG11bHRpcGxlKSB7CisgIGlmICghZGV2aWNlKQorICAgIHJldHVybiBmYWxzZTsKKworICBpbnQzMl90IGxlZnRQYWRkaW5nID0gNyAqIG11bHRpcGxlOworICBpbnQzMl90IGxlZnRQb3NpdGlvbiA9IDMgKiBtdWx0aXBsZSArIGxlZnRQYWRkaW5nOworICBCeXRlU3RyaW5nIHN0ciA9IEZYX1VURjhFbmNvZGUoY29udGVudHMpOworICBpbnQzMl90IGlMZW4gPSBzdHIuR2V0TGVuZ3RoKCk7CisgIHN0ZDo6dmVjdG9yPEZYVEVYVF9DSEFSUE9TPiBjaGFycG9zKGlMZW4pOworICBpbnQzMl90IGlGb250U2l6ZSA9IChpbnQzMl90KWZhYnMobV9mRm9udFNpemUpOworICBpbnQzMl90IGlUZXh0SGVpZ2h0ID0gaUZvbnRTaXplICsgMTsKKyAgQnl0ZVN0cmluZyB0ZW1wU3RyID0gc3RyLk1pZCgxLCA2KTsKKyAgaW50MzJfdCBzdHJXaWR0aCA9IG11bHRpcGxlICogNDI7CisKKyAgQ0ZYX01hdHJpeCBtYXRyKG1fb3V0cHV0SFNjYWxlLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCk7CisgIENGWF9GbG9hdFJlY3QgcmVjdCgoZmxvYXQpbGVmdFBvc2l0aW9uLCAoZmxvYXQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KShsZWZ0UG9zaXRpb24gKyBzdHJXaWR0aCAtIDAuNSksIChmbG9hdCltX0hlaWdodCk7CisgIG1hdHIuQ29uY2F0KCptYXRyaXgpOworICBGWF9SRUNUIHJlID0gbWF0ci5UcmFuc2Zvcm1SZWN0KHJlY3QpLkdldE91dGVyUmVjdCgpOworICBkZXZpY2UtPkZpbGxSZWN0KCZyZSwgbV9iYWNrZ3JvdW5kQ29sb3IpOworICBDRlhfRmxvYXRSZWN0IHJlY3QxKAorICAgICAgKGZsb2F0KShsZWZ0UG9zaXRpb24gKyA0NyAqIG11bHRpcGxlKSwgKGZsb2F0KShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KSwKKyAgICAgIChmbG9hdCkobGVmdFBvc2l0aW9uICsgNDcgKiBtdWx0aXBsZSArIHN0cldpZHRoIC0gMC41KSwgKGZsb2F0KW1fSGVpZ2h0KTsKKyAgQ0ZYX01hdHJpeCBtYXRyMShtX291dHB1dEhTY2FsZSwgMC4wLCAwLjAsIDEuMCwgMC4wLCAwLjApOworICBtYXRyMS5Db25jYXQoKm1hdHJpeCk7CisgIHJlID0gbWF0cjEuVHJhbnNmb3JtUmVjdChyZWN0MSkuR2V0T3V0ZXJSZWN0KCk7CisgIGRldmljZS0+RmlsbFJlY3QoJnJlLCBtX2JhY2tncm91bmRDb2xvcik7CisgIGludDMyX3Qgc3RyV2lkdGgxID0gbXVsdGlwbGUgKiA3OworICBDRlhfTWF0cml4IG1hdHIyKG1fb3V0cHV0SFNjYWxlLCAwLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAwLjBmKTsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0MigwLjBmLCAoZmxvYXQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgIChmbG9hdClzdHJXaWR0aDEgLSAwLjVmLCAoZmxvYXQpbV9IZWlnaHQpOworICBtYXRyMi5Db25jYXQoKm1hdHJpeCk7CisgIHJlID0gbWF0cjIuVHJhbnNmb3JtUmVjdChyZWN0MikuR2V0T3V0ZXJSZWN0KCk7CisgIGRldmljZS0+RmlsbFJlY3QoJnJlLCBtX2JhY2tncm91bmRDb2xvcik7CisKKyAgZmxvYXQgYmxhbmsgPSAwLjA7CisgIGlMZW4gPSB0ZW1wU3RyLkdldExlbmd0aCgpOworICBzdHJXaWR0aCA9IChpbnQzMl90KShzdHJXaWR0aCAqIG1fb3V0cHV0SFNjYWxlKTsKKworICBDYWxjVGV4dEluZm8odGVtcFN0ciwgJmNoYXJwb3NbMV0sIG1fcEZvbnQuR2V0KCksIChmbG9hdClzdHJXaWR0aCwgaUZvbnRTaXplLAorICAgICAgICAgICAgICAgYmxhbmspOworICB7CisgICAgQ0ZYX01hdHJpeCBhZmZpbmVfbWF0cml4MSgxLjAsIDAuMCwgMC4wLCAtMS4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KWxlZnRQb3NpdGlvbiAqIG1fb3V0cHV0SFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KSArIGlGb250U2l6ZSk7CisgICAgaWYgKG1hdHJpeCkKKyAgICAgIGFmZmluZV9tYXRyaXgxLkNvbmNhdCgqbWF0cml4KTsKKyAgICBkZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlMZW4sICZjaGFycG9zWzFdLCBtX3BGb250LkdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGlGb250U2l6ZSksICZhZmZpbmVfbWF0cml4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsKKyAgfQorICB0ZW1wU3RyID0gc3RyLk1pZCg3LCA2KTsKKyAgaUxlbiA9IHRlbXBTdHIuR2V0TGVuZ3RoKCk7CisgIENhbGNUZXh0SW5mbyh0ZW1wU3RyLCAmY2hhcnBvc1s3XSwgbV9wRm9udC5HZXQoKSwgKGZsb2F0KXN0cldpZHRoLCBpRm9udFNpemUsCisgICAgICAgICAgICAgICBibGFuayk7CisgIHsKKyAgICBDRlhfTWF0cml4IGFmZmluZV9tYXRyaXgxKAorICAgICAgICAxLjAsIDAuMCwgMC4wLCAtMS4wLAorICAgICAgICAoZmxvYXQpKGxlZnRQb3NpdGlvbiArIDQ3ICogbXVsdGlwbGUpICogbV9vdXRwdXRIU2NhbGUsCisgICAgICAgIChmbG9hdCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCArIGlGb250U2l6ZSkpOworICAgIGlmIChtYXRyaXgpCisgICAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7CisgICAgZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChpTGVuLCAmY2hhcnBvc1s3XSwgbV9wRm9udC5HZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihpRm9udFNpemUpLCAmYWZmaW5lX21hdHJpeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7CisgIH0KKyAgdGVtcFN0ciA9IHN0ci5MZWZ0KDEpOworICBpTGVuID0gdGVtcFN0ci5HZXRMZW5ndGgoKTsKKyAgc3RyV2lkdGggPSBtdWx0aXBsZSAqIDc7CisgIHN0cldpZHRoID0gKGludDMyX3QpKHN0cldpZHRoICogbV9vdXRwdXRIU2NhbGUpOworCisgIENhbGNUZXh0SW5mbyh0ZW1wU3RyLCBjaGFycG9zLmRhdGEoKSwgbV9wRm9udC5HZXQoKSwgKGZsb2F0KXN0cldpZHRoLAorICAgICAgICAgICAgICAgaUZvbnRTaXplLCBibGFuayk7CisgIHsKKyAgICBDRlhfTWF0cml4IGFmZmluZV9tYXRyaXgxKDEuMCwgMC4wLCAwLjAsIC0xLjAsIDAuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCArIGlGb250U2l6ZSkpOworICAgIGlmIChtYXRyaXgpCisgICAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7CisgICAgZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChpTGVuLCBjaGFycG9zLmRhdGEoKSwgbV9wRm9udC5HZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihpRm9udFNpemUpLCAmYWZmaW5lX21hdHJpeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNXcml0ZXIuaCBiL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU4xM1dyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NzQ2MTAKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNXcml0ZXIuaApAQCAtMCwwICsxLDQ1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhCQVJDT0RFX09ORURfQkNfT05FREVBTjEzV1JJVEVSX0hfCisjZGVmaW5lIEZYQkFSQ09ERV9PTkVEX0JDX09ORURFQU4xM1dSSVRFUl9IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5oIgorCitjbGFzcyBDRlhfRElCaXRtYXA7CitjbGFzcyBDRlhfUmVuZGVyRGV2aWNlOworCitjbGFzcyBDQkNfT25lZEVBTjEzV3JpdGVyIDogcHVibGljIENCQ19PbmVEaW1Xcml0ZXIgeworIHB1YmxpYzoKKyAgQ0JDX09uZWRFQU4xM1dyaXRlcigpOworICB+Q0JDX09uZWRFQU4xM1dyaXRlcigpIG92ZXJyaWRlOworCisgIC8vIENCQ19PbmVEaW1Xcml0ZXIKKyAgdWludDhfdCogRW5jb2RlV2l0aEhpbnQoY29uc3QgQnl0ZVN0cmluZyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cykgb3ZlcnJpZGU7CisgIHVpbnQ4X3QqIEVuY29kZUltcGwoY29uc3QgQnl0ZVN0cmluZyYgY29udGVudHMsIGludDMyX3QmIG91dExlbmd0aCkgb3ZlcnJpZGU7CisgIGJvb2wgQ2hlY2tDb250ZW50VmFsaWRpdHkoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzKSBvdmVycmlkZTsKKyAgV2lkZVN0cmluZyBGaWx0ZXJDb250ZW50cyhjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIG92ZXJyaWRlOworCisgIGludDMyX3QgQ2FsY0NoZWNrc3VtKGNvbnN0IEJ5dGVTdHJpbmcmIGNvbnRlbnRzKTsKKworIHByb3RlY3RlZDoKKyAgYm9vbCBTaG93Q2hhcnMoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCisgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgaW50MzJfdCBiYXJXaWR0aCwKKyAgICAgICAgICAgICAgICAgaW50MzJfdCBtdWx0aXBsZSkgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBpbnQzMl90IG1fY29kZVdpZHRoOworfTsKKworI2VuZGlmICAvLyBGWEJBUkNPREVfT05FRF9CQ19PTkVERUFOMTNXUklURVJfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU4xM1dyaXRlcl91bml0dGVzdC5jcHAgYi9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNXcml0ZXJfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMmUxZjQKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNXcml0ZXJfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsOTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImZ4YmFyY29kZS9vbmVkL0JDX09uZWRFQU4xM1dyaXRlci5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworCitURVNUKE9uZWRFQU4xM1dyaXRlclRlc3QsIEVuY29kZSkgeworICBDQkNfT25lZEVBTjEzV3JpdGVyIHdyaXRlcjsKKyAgaW50MzJfdCB3aWR0aDsKKyAgaW50MzJfdCBoZWlnaHQ7CisgIHVpbnQ4X3QqIGVuY29kZWQ7CisgIGNvbnN0IGNoYXIqIGV4cGVjdGVkOworCisgIC8vIEVBTi0xMyBiYXJjb2RlcyBlbmNvZGUgMTMtZGlnaXQgbnVtYmVycyBpbnRvIDk1IG1vZHVsZXMgaW4gYSB1bmlkaW1lbnNpb25hbAorICAvLyBkaXNwb3NpdGlvbi4KKyAgZW5jb2RlZCA9IHdyaXRlci5FbmNvZGUoIiIsIEJDRk9STUFUX0VBTl8xMywgd2lkdGgsIGhlaWdodCk7CisgIEVYUEVDVF9FUShudWxscHRyLCBlbmNvZGVkKTsKKyAgRlhfRnJlZShlbmNvZGVkKTsKKworICBlbmNvZGVkID0gd3JpdGVyLkVuY29kZSgiMTIzIiwgQkNGT1JNQVRfRUFOXzEzLCB3aWR0aCwgaGVpZ2h0KTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIGVuY29kZWQpOworICBGWF9GcmVlKGVuY29kZWQpOworCisgIGVuY29kZWQgPSB3cml0ZXIuRW5jb2RlKCIxMjM0NTY3ODkwMTIiLCBCQ0ZPUk1BVF9FQU5fMTMsIHdpZHRoLCBoZWlnaHQpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgZW5jb2RlZCk7CisgIEZYX0ZyZWUoZW5jb2RlZCk7CisKKyAgZW5jb2RlZCA9IHdyaXRlci5FbmNvZGUoIjEyMzQ1Njc4OTAxMjM0IiwgQkNGT1JNQVRfRUFOXzEzLCB3aWR0aCwgaGVpZ2h0KTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIGVuY29kZWQpOworICBGWF9GcmVlKGVuY29kZWQpOworCisgIGVuY29kZWQgPSB3cml0ZXIuRW5jb2RlKCIxMjM0NTY3ODkwMTI4IiwgQkNGT1JNQVRfRUFOXzEzLCB3aWR0aCwgaGVpZ2h0KTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIGVuY29kZWQpOworICBFWFBFQ1RfRVEoMSwgaGVpZ2h0KTsKKyAgRVhQRUNUX0VRKDk1LCB3aWR0aCk7CisKKyAgZXhwZWN0ZWQgPQorICAgICAgIiMgIyIgIC8vIFN0YXJ0CisgICAgICAvLyAxIGltcGxpY2l0IGJ5IExMR0xHRyBpbiBuZXh0IDYgZGlnaXRzCisgICAgICAiICAjICAjIyIgIC8vIDIgTAorICAgICAgIiAjIyMjICMiICAvLyAzIEwKKyAgICAgICIgICMjIyAjIiAgLy8gNCBHCisgICAgICAiICMjICAgIyIgIC8vIDUgTAorICAgICAgIiAgICAjICMiICAvLyA2IEcKKyAgICAgICIgICMgICAjIiAgLy8gNyBHCisgICAgICAiICMgIyAiICAgIC8vIE1pZGRsZQorICAgICAgIiMgICMgICAiICAvLyA4IFIKKyAgICAgICIjIyMgIyAgIiAgLy8gOSBSCisgICAgICAiIyMjICAjICIgIC8vIDAgUgorICAgICAgIiMjICAjIyAiICAvLyAxIFIKKyAgICAgICIjIyAjIyAgIiAgLy8gMiBSCisgICAgICAiIyAgIyAgICIgIC8vIDggUgorICAgICAgIiMgIyI7ICAgICAvLyBFbmQKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA5NTsgaSsrKSB7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkW2ldICE9ICcgJywgISFlbmNvZGVkW2ldKSA8PCBpOworICB9CisgIEZYX0ZyZWUoZW5jb2RlZCk7CisKKyAgZW5jb2RlZCA9IHdyaXRlci5FbmNvZGUoIjc3NzY2NjU1NTQ0NDAiLCBCQ0ZPUk1BVF9FQU5fMTMsIHdpZHRoLCBoZWlnaHQpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgZW5jb2RlZCk7CisgIEVYUEVDVF9FUSgxLCBoZWlnaHQpOworICBFWFBFQ1RfRVEoOTUsIHdpZHRoKTsKKworICBleHBlY3RlZCA9CisgICAgICAiIyAjIiAgLy8gU3RhcnQKKyAgICAgIC8vIDcgaW1wbGljaXQgYnkgTEdMR0xHIGluIG5leHQgNiBkaWdpdHMKKyAgICAgICIgIyMjICMjIiAgLy8gNyBMCisgICAgICAiICAjICAgIyIgIC8vIDcgRworICAgICAgIiAjICMjIyMiICAvLyA2IEwKKyAgICAgICIgICAgIyAjIiAgLy8gNiBHCisgICAgICAiICMgIyMjIyIgIC8vIDYgTAorICAgICAgIiAjIyMgICMiICAvLyA1IEcKKyAgICAgICIgIyAjICIgICAgLy8gTWlkZGxlCisgICAgICAiIyAgIyMjICIgIC8vIDUgUgorICAgICAgIiMgICMjIyAiICAvLyA1IFIKKyAgICAgICIjICMjIyAgIiAgLy8gNCBSCisgICAgICAiIyAjIyMgICIgIC8vIDQgUgorICAgICAgIiMgIyMjICAiICAvLyA0IFIKKyAgICAgICIjIyMgICMgIiAgLy8gMCBSCisgICAgICAiIyAjIjsgICAgIC8vIEVuZAorICBmb3IgKGludCBpID0gMDsgaSA8IDk1OyBpKyspIHsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0gIT0gJyAnLCAhIWVuY29kZWRbaV0pIDw8IGk7CisgIH0KKyAgRlhfRnJlZShlbmNvZGVkKTsKK30KKworVEVTVChPbmVkRUFOMTNXcml0ZXJUZXN0LCBDaGVja3N1bSkgeworICBDQkNfT25lZEVBTjEzV3JpdGVyIHdyaXRlcjsKKyAgRVhQRUNUX0VRKDAsIHdyaXRlci5DYWxjQ2hlY2tzdW0oIiIpKTsKKyAgRVhQRUNUX0VRKDYsIHdyaXRlci5DYWxjQ2hlY2tzdW0oIjEyMyIpKTsKKyAgRVhQRUNUX0VRKDgsIHdyaXRlci5DYWxjQ2hlY2tzdW0oIjEyMzQ1Njc4OTAxMiIpKTsKKyAgRVhQRUNUX0VRKDAsIHdyaXRlci5DYWxjQ2hlY2tzdW0oIjc3NzY2NjU1NTQ0NCIpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFdyaXRlci5jcHAgYi9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFdyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg4NTI4ZQotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU44V3JpdGVyLmNwcApAQCAtMCwwICsxLDIwMCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgorLyoKKyAqIENvcHlyaWdodCAyMDA5IFpYaW5nIGF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImZ4YmFyY29kZS9vbmVkL0JDX09uZWRFQU44V3JpdGVyLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3djdHlwZT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9leHRlbnNpb24uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2RlZmF1bHRyZW5kZXJkZXZpY2UuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvQkNfV3JpdGVyLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOQ2hlY2tzdW0uaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgaW50OF90IGtPbmVkRUFOOFN0YXJ0UGF0dGVyblszXSA9IHsxLCAxLCAxfTsKK2NvbnN0IGludDhfdCBrT25lZEVBTjhNaWRkbGVQYXR0ZXJuWzVdID0gezEsIDEsIDEsIDEsIDF9OworY29uc3QgaW50OF90IGtPbmVkRUFOOExQYXR0ZXJuWzEwXVs0XSA9IHsKKyAgICB7MywgMiwgMSwgMX0sIHsyLCAyLCAyLCAxfSwgezIsIDEsIDIsIDJ9LCB7MSwgNCwgMSwgMX0sIHsxLCAxLCAzLCAyfSwKKyAgICB7MSwgMiwgMywgMX0sIHsxLCAxLCAxLCA0fSwgezEsIDMsIDEsIDJ9LCB7MSwgMiwgMSwgM30sIHszLCAxLCAxLCAyfX07CisKK30gIC8vIG5hbWVzcGFjZQorCitDQkNfT25lZEVBTjhXcml0ZXI6OkNCQ19PbmVkRUFOOFdyaXRlcigpIHsKKyAgbV9pRGF0YUxlbnRoID0gODsKKyAgbV9jb2RlV2lkdGggPSAzICsgKDcgKiA0KSArIDUgKyAoNyAqIDQpICsgMzsKK30KKworQ0JDX09uZWRFQU44V3JpdGVyOjp+Q0JDX09uZWRFQU44V3JpdGVyKCkge30KKwordm9pZCBDQkNfT25lZEVBTjhXcml0ZXI6OlNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpIHsKKyAgbV9pRGF0YUxlbnRoID0gODsKK30KKworYm9vbCBDQkNfT25lZEVBTjhXcml0ZXI6OlNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbikgeworICBpZiAobG9jYXRpb24gPT0gQkNfVEVYVF9MT0NfQkVMT1dFTUJFRCkgeworICAgIG1fbG9jVGV4dExvYyA9IGxvY2F0aW9uOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDQkNfT25lZEVBTjhXcml0ZXI6OkNoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cykgeworICByZXR1cm4gc3RkOjphbGxfb2YoY29udGVudHMuYmVnaW4oKSwgY29udGVudHMuZW5kKCksIHN0ZDo6aXN3ZGlnaXQpOworfQorCitXaWRlU3RyaW5nIENCQ19PbmVkRUFOOFdyaXRlcjo6RmlsdGVyQ29udGVudHMoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzKSB7CisgIFdpZGVTdHJpbmcgZmlsdGVyY29udGVudHM7CisgIHdjaGFyX3QgY2g7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgeworICAgIGNoID0gY29udGVudHNbaV07CisgICAgaWYgKGNoID4gMTc1KSB7CisgICAgICBpKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOworICAgIH0KKyAgfQorICByZXR1cm4gZmlsdGVyY29udGVudHM7Cit9CisKK2ludDMyX3QgQ0JDX09uZWRFQU44V3JpdGVyOjpDYWxjQ2hlY2tzdW0oY29uc3QgQnl0ZVN0cmluZyYgY29udGVudHMpIHsKKyAgcmV0dXJuIEVBTkNhbGNDaGVja3N1bShjb250ZW50cyk7Cit9CisKK3VpbnQ4X3QqIENCQ19PbmVkRUFOOFdyaXRlcjo6RW5jb2RlV2l0aEhpbnQoY29uc3QgQnl0ZVN0cmluZyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cykgeworICBpZiAoZm9ybWF0ICE9IEJDRk9STUFUX0VBTl84KQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gQ0JDX09uZURpbVdyaXRlcjo6RW5jb2RlV2l0aEhpbnQoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRzKTsKK30KKwordWludDhfdCogQ0JDX09uZWRFQU44V3JpdGVyOjpFbmNvZGVJbXBsKGNvbnN0IEJ5dGVTdHJpbmcmIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dExlbmd0aCkgeworICBpZiAoY29udGVudHMuR2V0TGVuZ3RoKCkgIT0gOCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBvdXRMZW5ndGggPSBtX2NvZGVXaWR0aDsKKyAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3QsIEZ4RnJlZURlbGV0ZXI+IHJlc3VsdCgKKyAgICAgIEZYX0FsbG9jKHVpbnQ4X3QsIG1fY29kZVdpZHRoKSk7CisgIGludDMyX3QgcG9zID0gMDsKKyAgaW50MzJfdCBlID0gQkNFeGNlcHRpb25OTzsKKyAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LmdldCgpLCBwb3MsIGtPbmVkRUFOOFN0YXJ0UGF0dGVybiwgMywgMSwgZSk7CisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgaW50MzJfdCBpID0gMDsKKyAgZm9yIChpID0gMDsgaSA8PSAzOyBpKyspIHsKKyAgICBpbnQzMl90IGRpZ2l0ID0gRlhTWVNfRGVjaW1hbENoYXJUb0ludChjb250ZW50c1tpXSk7CisgICAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LmdldCgpLCBwb3MsIGtPbmVkRUFOOExQYXR0ZXJuW2RpZ2l0XSwgNCwgMCwgZSk7CisgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKKyAgICAgIHJldHVybiBudWxscHRyOworICB9CisgIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdC5nZXQoKSwgcG9zLCBrT25lZEVBTjhNaWRkbGVQYXR0ZXJuLCA1LCAwLCBlKTsKKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBmb3IgKGkgPSA0OyBpIDw9IDc7IGkrKykgeworICAgIGludDMyX3QgZGlnaXQgPSBGWFNZU19EZWNpbWFsQ2hhclRvSW50KGNvbnRlbnRzW2ldKTsKKyAgICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQuZ2V0KCksIHBvcywga09uZWRFQU44TFBhdHRlcm5bZGlnaXRdLCA0LCAxLCBlKTsKKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LmdldCgpLCBwb3MsIGtPbmVkRUFOOFN0YXJ0UGF0dGVybiwgMywgMSwgZSk7CisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiByZXN1bHQucmVsZWFzZSgpOworfQorCitib29sIENCQ19PbmVkRUFOOFdyaXRlcjo6U2hvd0NoYXJzKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYmFyV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbXVsdGlwbGUpIHsKKyAgaWYgKCFkZXZpY2UpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGludDMyX3QgbGVmdFBvc2l0aW9uID0gMyAqIG11bHRpcGxlOworICBCeXRlU3RyaW5nIHN0ciA9IEZYX1VURjhFbmNvZGUoY29udGVudHMpOworICBzaXplX3QgaUxlbmd0aCA9IHN0ci5HZXRMZW5ndGgoKTsKKyAgc3RkOjp2ZWN0b3I8RlhURVhUX0NIQVJQT1M+IGNoYXJwb3MoaUxlbmd0aCk7CisgIEJ5dGVTdHJpbmcgdGVtcFN0ciA9IHN0ci5MZWZ0KDQpOworICBzaXplX3QgaUxlbiA9IHRlbXBTdHIuR2V0TGVuZ3RoKCk7CisgIGludDMyX3Qgc3RyV2lkdGggPSA3ICogbXVsdGlwbGUgKiA0OworICBmbG9hdCBibGFuayA9IDAuMDsKKworICBpbnQzMl90IGlGb250U2l6ZSA9IChpbnQzMl90KWZhYnMobV9mRm9udFNpemUpOworICBpbnQzMl90IGlUZXh0SGVpZ2h0ID0gaUZvbnRTaXplICsgMTsKKworICBDRlhfTWF0cml4IG1hdHIobV9vdXRwdXRIU2NhbGUsIDAuMCwgMC4wLCAxLjAsIDAuMCwgMC4wKTsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0KChmbG9hdClsZWZ0UG9zaXRpb24sIChmbG9hdCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCksCisgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpKGxlZnRQb3NpdGlvbiArIHN0cldpZHRoIC0gMC41KSwgKGZsb2F0KW1fSGVpZ2h0KTsKKyAgbWF0ci5Db25jYXQoKm1hdHJpeCk7CisgIEZYX1JFQ1QgcmUgPSBtYXRyLlRyYW5zZm9ybVJlY3QocmVjdCkuR2V0T3V0ZXJSZWN0KCk7CisgIGRldmljZS0+RmlsbFJlY3QoJnJlLCBtX2JhY2tncm91bmRDb2xvcik7CisgIENGWF9NYXRyaXggbWF0cjEobV9vdXRwdXRIU2NhbGUsIDAuMCwgMC4wLCAxLjAsIDAuMCwgMC4wKTsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0MSgKKyAgICAgIChmbG9hdCkobGVmdFBvc2l0aW9uICsgMzMgKiBtdWx0aXBsZSksIChmbG9hdCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCksCisgICAgICAoZmxvYXQpKGxlZnRQb3NpdGlvbiArIDMzICogbXVsdGlwbGUgKyBzdHJXaWR0aCAtIDAuNSksIChmbG9hdCltX0hlaWdodCk7CisgIG1hdHIxLkNvbmNhdCgqbWF0cml4KTsKKyAgcmUgPSBtYXRyMS5UcmFuc2Zvcm1SZWN0KHJlY3QxKS5HZXRPdXRlclJlY3QoKTsKKyAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsKKyAgc3RyV2lkdGggPSAoaW50MzJfdCkoc3RyV2lkdGggKiBtX291dHB1dEhTY2FsZSk7CisKKyAgQ2FsY1RleHRJbmZvKHRlbXBTdHIsIGNoYXJwb3MuZGF0YSgpLCBtX3BGb250LkdldCgpLCAoZmxvYXQpc3RyV2lkdGgsCisgICAgICAgICAgICAgICBpRm9udFNpemUsIGJsYW5rKTsKKyAgeworICAgIENGWF9NYXRyaXggYWZmaW5lX21hdHJpeDEoMS4wLCAwLjAsIDAuMCwgLTEuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdClsZWZ0UG9zaXRpb24gKiBtX291dHB1dEhTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCArIGlGb250U2l6ZSkpOworICAgIGFmZmluZV9tYXRyaXgxLkNvbmNhdCgqbWF0cml4KTsKKyAgICBkZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlMZW4sIGNoYXJwb3MuZGF0YSgpLCBtX3BGb250LkdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGlGb250U2l6ZSksICZhZmZpbmVfbWF0cml4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsKKyAgfQorICB0ZW1wU3RyID0gc3RyLk1pZCg0LCA0KTsKKyAgaUxlbiA9IHRlbXBTdHIuR2V0TGVuZ3RoKCk7CisgIENhbGNUZXh0SW5mbyh0ZW1wU3RyLCAmY2hhcnBvc1s0XSwgbV9wRm9udC5HZXQoKSwgKGZsb2F0KXN0cldpZHRoLCBpRm9udFNpemUsCisgICAgICAgICAgICAgICBibGFuayk7CisgIHsKKyAgICBDRlhfTWF0cml4IGFmZmluZV9tYXRyaXgxKAorICAgICAgICAxLjAsIDAuMCwgMC4wLCAtMS4wLAorICAgICAgICAoZmxvYXQpKGxlZnRQb3NpdGlvbiArIDMzICogbXVsdGlwbGUpICogbV9vdXRwdXRIU2NhbGUsCisgICAgICAgIChmbG9hdCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCArIGlGb250U2l6ZSkpOworICAgIGlmIChtYXRyaXgpCisgICAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7CisgICAgZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChpTGVuLCAmY2hhcnBvc1s0XSwgbV9wRm9udC5HZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihpRm9udFNpemUpLCAmYWZmaW5lX21hdHJpeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFdyaXRlci5oIGIvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjhXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2EzNjAyCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjhXcml0ZXIuaApAQCAtMCwwICsxLDQ4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhCQVJDT0RFX09ORURfQkNfT05FREVBTjhXUklURVJfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX09ORURfQkNfT05FREVBTjhXUklURVJfSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvQkNfTGlicmFyeS5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5oIgorCitjbGFzcyBDRlhfRElCaXRtYXA7CitjbGFzcyBDRlhfUmVuZGVyRGV2aWNlOworCitjbGFzcyBDQkNfT25lZEVBTjhXcml0ZXIgOiBwdWJsaWMgQ0JDX09uZURpbVdyaXRlciB7CisgcHVibGljOgorICBDQkNfT25lZEVBTjhXcml0ZXIoKTsKKyAgfkNCQ19PbmVkRUFOOFdyaXRlcigpIG92ZXJyaWRlOworCisgIC8vIENCQ19PbmVEaW1Xcml0ZXIKKyAgdWludDhfdCogRW5jb2RlV2l0aEhpbnQoY29uc3QgQnl0ZVN0cmluZyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cykgb3ZlcnJpZGU7CisgIHVpbnQ4X3QqIEVuY29kZUltcGwoY29uc3QgQnl0ZVN0cmluZyYgY29udGVudHMsIGludDMyX3QmIG91dExlbmd0aCkgb3ZlcnJpZGU7CisgIGJvb2wgQ2hlY2tDb250ZW50VmFsaWRpdHkoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzKSBvdmVycmlkZTsKKyAgV2lkZVN0cmluZyBGaWx0ZXJDb250ZW50cyhjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIG92ZXJyaWRlOworICB2b2lkIFNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpIG92ZXJyaWRlOworCisgIGJvb2wgU2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKTsKKyAgaW50MzJfdCBDYWxjQ2hlY2tzdW0oY29uc3QgQnl0ZVN0cmluZyYgY29udGVudHMpOworCisgcHJvdGVjdGVkOgorICBib29sIFNob3dDaGFycyhjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LAorICAgICAgICAgICAgICAgICBpbnQzMl90IGJhcldpZHRoLAorICAgICAgICAgICAgICAgICBpbnQzMl90IG11bHRpcGxlKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIGludDMyX3QgbV9jb2RlV2lkdGg7Cit9OworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9PTkVEX0JDX09ORURFQU44V1JJVEVSX0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFdyaXRlcl91bml0dGVzdC5jcHAgYi9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFdyaXRlcl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZhMWRmNgotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU44V3JpdGVyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDg4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFdyaXRlci5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgeworCitURVNUKE9uZWRFQU44V3JpdGVyVGVzdCwgRW5jb2RlKSB7CisgIENCQ19PbmVkRUFOOFdyaXRlciB3cml0ZXI7CisgIGludDMyX3Qgd2lkdGg7CisgIGludDMyX3QgaGVpZ2h0OworICB1aW50OF90KiBlbmNvZGVkOworICBjb25zdCBjaGFyKiBleHBlY3RlZDsKKworICAvLyBFQU4tOCBiYXJjb2RlcyBlbmNvZGUgOC1kaWdpdCBudW1iZXJzIGludG8gNjcgbW9kdWxlcyBpbiBhIHVuaWRpbWVuc2lvbmFsCisgIC8vIGRpc3Bvc2l0aW9uLgorICBlbmNvZGVkID0gd3JpdGVyLkVuY29kZSgiIiwgQkNGT1JNQVRfRUFOXzgsIHdpZHRoLCBoZWlnaHQpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgZW5jb2RlZCk7CisgIEZYX0ZyZWUoZW5jb2RlZCk7CisKKyAgZW5jb2RlZCA9IHdyaXRlci5FbmNvZGUoIjEyMyIsIEJDRk9STUFUX0VBTl84LCB3aWR0aCwgaGVpZ2h0KTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIGVuY29kZWQpOworICBGWF9GcmVlKGVuY29kZWQpOworCisgIGVuY29kZWQgPSB3cml0ZXIuRW5jb2RlKCIxMjM0NTY3IiwgQkNGT1JNQVRfRUFOXzgsIHdpZHRoLCBoZWlnaHQpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgZW5jb2RlZCk7CisgIEZYX0ZyZWUoZW5jb2RlZCk7CisKKyAgZW5jb2RlZCA9IHdyaXRlci5FbmNvZGUoIjEyMzQ1Njc4OSIsIEJDRk9STUFUX0VBTl84LCB3aWR0aCwgaGVpZ2h0KTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIGVuY29kZWQpOworICBGWF9GcmVlKGVuY29kZWQpOworCisgIGVuY29kZWQgPSB3cml0ZXIuRW5jb2RlKCIxMjM0NTY3MCIsIEJDRk9STUFUX0VBTl84LCB3aWR0aCwgaGVpZ2h0KTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIGVuY29kZWQpOworICBFWFBFQ1RfRVEoMSwgaGVpZ2h0KTsKKyAgRVhQRUNUX0VRKDY3LCB3aWR0aCk7CisKKyAgZXhwZWN0ZWQgPQorICAgICAgIiMgIyIgICAgICAvLyBTdGFydAorICAgICAgIiAgIyMgICMiICAvLyAxIEwKKyAgICAgICIgICMgICMjIiAgLy8gMiBMCisgICAgICAiICMjIyMgIyIgIC8vIDMgTAorICAgICAgIiAjICAgIyMiICAvLyA0IEwKKyAgICAgICIgIyAjICIgICAgLy8gTWlkZGxlCisgICAgICAiIyAgIyMjICIgIC8vIDUgUgorICAgICAgIiMgIyAgICAiICAvLyA2IFIKKyAgICAgICIjICAgIyAgIiAgLy8gNyBSCisgICAgICAiIyMjICAjICIgIC8vIDAgUgorICAgICAgIiMgIyI7ICAgICAvLyBFbmQKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA2NzsgaSsrKSB7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkW2ldICE9ICcgJywgISFlbmNvZGVkW2ldKSA8PCBpOworICB9CisgIEZYX0ZyZWUoZW5jb2RlZCk7CisKKyAgZW5jb2RlZCA9IHdyaXRlci5FbmNvZGUoIjk5NDQxMTA0IiwgQkNGT1JNQVRfRUFOXzgsIHdpZHRoLCBoZWlnaHQpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgZW5jb2RlZCk7CisgIEVYUEVDVF9FUSgxLCBoZWlnaHQpOworICBFWFBFQ1RfRVEoNjcsIHdpZHRoKTsKKworICBleHBlY3RlZCA9CisgICAgICAiIyAjIiAgICAgIC8vIFN0YXJ0CisgICAgICAiICAgIyAjIyIgIC8vIDkgTAorICAgICAgIiAgICMgIyMiICAvLyA5IEwKKyAgICAgICIgIyAgICMjIiAgLy8gNCBMCisgICAgICAiICMgICAjIyIgIC8vIDQgTAorICAgICAgIiAjICMgIiAgICAvLyBNaWRkbGUKKyAgICAgICIjIyAgIyMgIiAgLy8gMSBSCisgICAgICAiIyMgICMjICIgIC8vIDEgUgorICAgICAgIiMjIyAgIyAiICAvLyAwIFIKKyAgICAgICIjICMjIyAgIiAgLy8gNCBSCisgICAgICAiIyAjIjsgICAgIC8vIEVuZAorICBmb3IgKGludCBpID0gMDsgaSA8IDY3OyBpKyspIHsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0gIT0gJyAnLCAhIWVuY29kZWRbaV0pIDw8IGk7CisgIH0KKyAgRlhfRnJlZShlbmNvZGVkKTsKK30KKworVEVTVChPbmVkRUFOOFdyaXRlclRlc3QsIENoZWNrc3VtKSB7CisgIENCQ19PbmVkRUFOOFdyaXRlciB3cml0ZXI7CisgIEVYUEVDVF9FUSgwLCB3cml0ZXIuQ2FsY0NoZWNrc3VtKCIiKSk7CisgIEVYUEVDVF9FUSg2LCB3cml0ZXIuQ2FsY0NoZWNrc3VtKCIxMjMiKSk7CisgIEVYUEVDVF9FUSgwLCB3cml0ZXIuQ2FsY0NoZWNrc3VtKCIxMjM0NTY3IikpOworICBFWFBFQ1RfRVEoNCwgd3JpdGVyLkNhbGNDaGVja3N1bSgiOTk0NDExMCIpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOQ2hlY2tzdW0uY3BwIGIvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTkNoZWNrc3VtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjkwYzYyCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTkNoZWNrc3VtLmNwcApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOQ2hlY2tzdW0uaCIKKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisKK2ludDMyX3QgRUFOQ2FsY0NoZWNrc3VtKGNvbnN0IEJ5dGVTdHJpbmcmIGNvbnRlbnRzKSB7CisgIGludDMyX3Qgb2RkID0gMDsKKyAgaW50MzJfdCBldmVuID0gMDsKKyAgc2l6ZV90IHBhcml0eSA9IDE7CisgIGZvciAoc2l6ZV90IGkgPSBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSA+IDA7IGktLSkgeworICAgIGlmIChwYXJpdHkgJSAyKQorICAgICAgb2RkICs9IEZYU1lTX0RlY2ltYWxDaGFyVG9JbnQoY29udGVudHNbaSAtIDFdKTsKKyAgICBlbHNlCisgICAgICBldmVuICs9IEZYU1lTX0RlY2ltYWxDaGFyVG9JbnQoY29udGVudHNbaSAtIDFdKTsKKyAgICBwYXJpdHkrKzsKKyAgfQorICByZXR1cm4gKDEwIC0gKG9kZCAqIDMgKyBldmVuKSAlIDEwKSAlIDEwOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTkNoZWNrc3VtLmggYi9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOQ2hlY2tzdW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGQyNGJjCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTkNoZWNrc3VtLmgKQEAgLTAsMCArMSwxMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIEZYQkFSQ09ERV9PTkVEX0JDX09ORURFQU5DSEVDS1NVTV9IXworI2RlZmluZSBGWEJBUkNPREVfT05FRF9CQ19PTkVERUFOQ0hFQ0tTVU1fSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisKK2ludDMyX3QgRUFOQ2FsY0NoZWNrc3VtKGNvbnN0IEJ5dGVTdHJpbmcmIGNvbnRlbnRzKTsKKworI2VuZGlmICAvLyBGWEJBUkNPREVfT05FRF9CQ19PTkVERUFOQ0hFQ0tTVU1fSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRVUENBV3JpdGVyLmNwcCBiL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRVUENBV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjVmODUxCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FXcml0ZXIuY3BwCkBAIC0wLDAgKzEsMjE0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6CisvKgorICogQ29weXJpZ2h0IDIwMTAgWlhpbmcgYXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FXcml0ZXIuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9kZWZhdWx0cmVuZGVyZGV2aWNlLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL0JDX1dyaXRlci5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9vbmVkL0JDX09uZWRFQU4xM1dyaXRlci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworQ0JDX09uZWRVUENBV3JpdGVyOjpDQkNfT25lZFVQQ0FXcml0ZXIoKSB7CisgIG1fYkxlZnRQYWRkaW5nID0gdHJ1ZTsKKyAgbV9iUmlnaHRQYWRkaW5nID0gdHJ1ZTsKK30KKwordm9pZCBDQkNfT25lZFVQQ0FXcml0ZXI6OkluaXQoKSB7CisgIG1fc3ViV3JpdGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENCQ19PbmVkRUFOMTNXcml0ZXI+KCk7Cit9CisKK0NCQ19PbmVkVVBDQVdyaXRlcjo6fkNCQ19PbmVkVVBDQVdyaXRlcigpIHt9CisKK2Jvb2wgQ0JDX09uZWRVUENBV3JpdGVyOjpDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgKytpKSB7CisgICAgaWYgKGNvbnRlbnRzW2ldIDwgJzAnIHx8IGNvbnRlbnRzW2ldID4gJzknKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitXaWRlU3RyaW5nIENCQ19PbmVkVVBDQVdyaXRlcjo6RmlsdGVyQ29udGVudHMoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzKSB7CisgIFdpZGVTdHJpbmcgZmlsdGVyY29udGVudHM7CisgIHdjaGFyX3QgY2g7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgeworICAgIGNoID0gY29udGVudHNbaV07CisgICAgaWYgKGNoID4gMTc1KSB7CisgICAgICBpKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKKyAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOworICAgIH0KKyAgfQorICByZXR1cm4gZmlsdGVyY29udGVudHM7Cit9CisKK2ludDMyX3QgQ0JDX09uZWRVUENBV3JpdGVyOjpDYWxjQ2hlY2tzdW0oY29uc3QgQnl0ZVN0cmluZyYgY29udGVudHMpIHsKKyAgaW50MzJfdCBvZGQgPSAwOworICBpbnQzMl90IGV2ZW4gPSAwOworICBzaXplX3QgaiA9IDE7CisgIGZvciAoc2l6ZV90IGkgPSBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSA+IDA7IGktLSkgeworICAgIGlmIChqICUgMikgeworICAgICAgb2RkICs9IEZYU1lTX0RlY2ltYWxDaGFyVG9JbnQoY29udGVudHNbaSAtIDFdKTsKKyAgICB9IGVsc2UgeworICAgICAgZXZlbiArPSBGWFNZU19EZWNpbWFsQ2hhclRvSW50KGNvbnRlbnRzW2kgLSAxXSk7CisgICAgfQorICAgIGorKzsKKyAgfQorICBpbnQzMl90IGNoZWNrc3VtID0gKG9kZCAqIDMgKyBldmVuKSAlIDEwOworICBjaGVja3N1bSA9ICgxMCAtIGNoZWNrc3VtKSAlIDEwOworICByZXR1cm4gY2hlY2tzdW07Cit9CisKK3VpbnQ4X3QqIENCQ19PbmVkVVBDQVdyaXRlcjo6RW5jb2RlV2l0aEhpbnQoY29uc3QgQnl0ZVN0cmluZyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cykgeworICBpZiAoZm9ybWF0ICE9IEJDRk9STUFUX1VQQ19BKQorICAgIHJldHVybiBudWxscHRyOworCisgIEJ5dGVTdHJpbmcgdG9FQU4xM1N0cmluZyA9ICcwJyArIGNvbnRlbnRzOworICBtX2lEYXRhTGVudGggPSAxMzsKKyAgcmV0dXJuIG1fc3ViV3JpdGVyLT5FbmNvZGVXaXRoSGludCh0b0VBTjEzU3RyaW5nLCBCQ0ZPUk1BVF9FQU5fMTMsIG91dFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEhlaWdodCwgaGludHMpOworfQorCit1aW50OF90KiBDQkNfT25lZFVQQ0FXcml0ZXI6OkVuY29kZUltcGwoY29uc3QgQnl0ZVN0cmluZyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0TGVuZ3RoKSB7CisgIHJldHVybiBudWxscHRyOworfQorCitib29sIENCQ19PbmVkVVBDQVdyaXRlcjo6U2hvd0NoYXJzKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYmFyV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbXVsdGlwbGUpIHsKKyAgaWYgKCFkZXZpY2UpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGludDMyX3QgbGVmdFBhZGRpbmcgPSA3ICogbXVsdGlwbGU7CisgIGludDMyX3QgbGVmdFBvc2l0aW9uID0gMTAgKiBtdWx0aXBsZSArIGxlZnRQYWRkaW5nOworICBCeXRlU3RyaW5nIHN0ciA9IEZYX1VURjhFbmNvZGUoY29udGVudHMpOworICBpbnQzMl90IGlMZW4gPSBzdHIuR2V0TGVuZ3RoKCk7CisgIHN0ZDo6dmVjdG9yPEZYVEVYVF9DSEFSUE9TPiBjaGFycG9zKGlMZW4pOworICBCeXRlU3RyaW5nIHRlbXBTdHIgPSBzdHIuTWlkKDEsIDUpOworICBmbG9hdCBzdHJXaWR0aCA9IChmbG9hdCkzNSAqIG11bHRpcGxlOworICBmbG9hdCBibGFuayA9IDAuMDsKKworICBpTGVuID0gdGVtcFN0ci5HZXRMZW5ndGgoKTsKKyAgaW50MzJfdCBpRm9udFNpemUgPSAoaW50MzJfdClmYWJzKG1fZkZvbnRTaXplKTsKKyAgaW50MzJfdCBpVGV4dEhlaWdodCA9IGlGb250U2l6ZSArIDE7CisKKyAgQ0ZYX01hdHJpeCBtYXRyKG1fb3V0cHV0SFNjYWxlLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCk7CisgIENGWF9GbG9hdFJlY3QgcmVjdCgoZmxvYXQpbGVmdFBvc2l0aW9uLCAoZmxvYXQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KShsZWZ0UG9zaXRpb24gKyBzdHJXaWR0aCAtIDAuNSksIChmbG9hdCltX0hlaWdodCk7CisgIG1hdHIuQ29uY2F0KCptYXRyaXgpOworICBGWF9SRUNUIHJlID0gbWF0ci5UcmFuc2Zvcm1SZWN0KHJlY3QpLkdldE91dGVyUmVjdCgpOworICBkZXZpY2UtPkZpbGxSZWN0KCZyZSwgbV9iYWNrZ3JvdW5kQ29sb3IpOworICBDRlhfTWF0cml4IG1hdHIxKG1fb3V0cHV0SFNjYWxlLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCk7CisgIENGWF9GbG9hdFJlY3QgcmVjdDEoKGZsb2F0KShsZWZ0UG9zaXRpb24gKyA0MCAqIG11bHRpcGxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkoKGxlZnRQb3NpdGlvbiArIDQwICogbXVsdGlwbGUpICsgc3RyV2lkdGggLSAwLjUpLAorICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCltX0hlaWdodCk7CisgIG1hdHIxLkNvbmNhdCgqbWF0cml4KTsKKyAgcmUgPSBtYXRyMS5UcmFuc2Zvcm1SZWN0KHJlY3QxKS5HZXRPdXRlclJlY3QoKTsKKyAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsKKyAgZmxvYXQgc3RyV2lkdGgxID0gKGZsb2F0KW11bHRpcGxlICogNzsKKyAgQ0ZYX01hdHJpeCBtYXRyMihtX291dHB1dEhTY2FsZSwgMC4wLCAwLjAsIDEuMCwgMC4wLCAwLjApOworICBDRlhfRmxvYXRSZWN0IHJlY3QyKDAuMCwgKGZsb2F0KShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpc3RyV2lkdGgxIC0gMSwgKGZsb2F0KW1fSGVpZ2h0KTsKKyAgbWF0cjIuQ29uY2F0KCptYXRyaXgpOworICByZSA9IG1hdHIyLlRyYW5zZm9ybVJlY3QocmVjdDIpLkdldE91dGVyUmVjdCgpOworICBkZXZpY2UtPkZpbGxSZWN0KCZyZSwgbV9iYWNrZ3JvdW5kQ29sb3IpOworICBDRlhfTWF0cml4IG1hdHIzKG1fb3V0cHV0SFNjYWxlLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCk7CisgIENGWF9GbG9hdFJlY3QgcmVjdDMoKGZsb2F0KShsZWZ0UG9zaXRpb24gKyA4NSAqIG11bHRpcGxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkoKGxlZnRQb3NpdGlvbiArIDg1ICogbXVsdGlwbGUpICsgc3RyV2lkdGgxIC0gMC41KSwKKyAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpbV9IZWlnaHQpOworICBtYXRyMy5Db25jYXQoKm1hdHJpeCk7CisgIHJlID0gbWF0cjMuVHJhbnNmb3JtUmVjdChyZWN0MykuR2V0T3V0ZXJSZWN0KCk7CisgIGRldmljZS0+RmlsbFJlY3QoJnJlLCBtX2JhY2tncm91bmRDb2xvcik7CisgIHN0cldpZHRoID0gc3RyV2lkdGggKiBtX291dHB1dEhTY2FsZTsKKworICBDYWxjVGV4dEluZm8odGVtcFN0ciwgJmNoYXJwb3NbMV0sIG1fcEZvbnQuR2V0KCksIHN0cldpZHRoLCBpRm9udFNpemUsIGJsYW5rKTsKKyAgeworICAgIENGWF9NYXRyaXggYWZmaW5lX21hdHJpeDEoMS4wLCAwLjAsIDAuMCwgLTEuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdClsZWZ0UG9zaXRpb24gKiBtX291dHB1dEhTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCArIGlGb250U2l6ZSkpOworICAgIGlmIChtYXRyaXgpCisgICAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7CisgICAgZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChpTGVuLCAmY2hhcnBvc1sxXSwgbV9wRm9udC5HZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihpRm9udFNpemUpLCAmYWZmaW5lX21hdHJpeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7CisgIH0KKyAgdGVtcFN0ciA9IHN0ci5NaWQoNiwgNSk7CisgIGlMZW4gPSB0ZW1wU3RyLkdldExlbmd0aCgpOworICBDYWxjVGV4dEluZm8odGVtcFN0ciwgJmNoYXJwb3NbNl0sIG1fcEZvbnQuR2V0KCksIHN0cldpZHRoLCBpRm9udFNpemUsIGJsYW5rKTsKKyAgeworICAgIENGWF9NYXRyaXggYWZmaW5lX21hdHJpeDEoCisgICAgICAgIDEuMCwgMC4wLCAwLjAsIC0xLjAsCisgICAgICAgIChmbG9hdCkobGVmdFBvc2l0aW9uICsgNDAgKiBtdWx0aXBsZSkgKiBtX291dHB1dEhTY2FsZSwKKyAgICAgICAgKGZsb2F0KShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0ICsgaUZvbnRTaXplKSk7CisgICAgaWYgKG1hdHJpeCkKKyAgICAgIGFmZmluZV9tYXRyaXgxLkNvbmNhdCgqbWF0cml4KTsKKyAgICBkZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlMZW4sICZjaGFycG9zWzZdLCBtX3BGb250LkdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGlGb250U2l6ZSksICZhZmZpbmVfbWF0cml4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsKKyAgfQorICB0ZW1wU3RyID0gc3RyLkxlZnQoMSk7CisgIGlMZW4gPSB0ZW1wU3RyLkdldExlbmd0aCgpOworICBzdHJXaWR0aCA9IChmbG9hdCltdWx0aXBsZSAqIDc7CisgIHN0cldpZHRoID0gc3RyV2lkdGggKiBtX291dHB1dEhTY2FsZTsKKworICBDYWxjVGV4dEluZm8odGVtcFN0ciwgY2hhcnBvcy5kYXRhKCksIG1fcEZvbnQuR2V0KCksIHN0cldpZHRoLCBpRm9udFNpemUsCisgICAgICAgICAgICAgICBibGFuayk7CisgIHsKKyAgICBDRlhfTWF0cml4IGFmZmluZV9tYXRyaXgxKDEuMCwgMC4wLCAwLjAsIC0xLjAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQgKyBpRm9udFNpemUpKTsKKyAgICBpZiAobWF0cml4KQorICAgICAgYWZmaW5lX21hdHJpeDEuQ29uY2F0KCptYXRyaXgpOworICAgIGRldmljZS0+RHJhd05vcm1hbFRleHQoaUxlbiwgY2hhcnBvcy5kYXRhKCksIG1fcEZvbnQuR2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oaUZvbnRTaXplKSwgJmFmZmluZV9tYXRyaXgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOworICB9CisgIHRlbXBTdHIgPSBzdHIuTWlkKDExLCAxKTsKKyAgaUxlbiA9IHRlbXBTdHIuR2V0TGVuZ3RoKCk7CisgIENhbGNUZXh0SW5mbyh0ZW1wU3RyLCAmY2hhcnBvc1sxMV0sIG1fcEZvbnQuR2V0KCksIHN0cldpZHRoLCBpRm9udFNpemUsCisgICAgICAgICAgICAgICBibGFuayk7CisgIHsKKyAgICBDRlhfTWF0cml4IGFmZmluZV9tYXRyaXgxKAorICAgICAgICAxLjAsIDAuMCwgMC4wLCAtMS4wLAorICAgICAgICAoZmxvYXQpKGxlZnRQb3NpdGlvbiArIDg1ICogbXVsdGlwbGUpICogbV9vdXRwdXRIU2NhbGUsCisgICAgICAgIChmbG9hdCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCArIGlGb250U2l6ZSkpOworICAgIGlmIChtYXRyaXgpCisgICAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7CisgICAgZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChpTGVuLCAmY2hhcnBvc1sxMV0sIG1fcEZvbnQuR2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oaUZvbnRTaXplKSwgJmFmZmluZV9tYXRyaXgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOworICB9CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FXcml0ZXIuaCBiL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRVUENBV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1NGVmNAotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRVUENBV3JpdGVyLmgKQEAgLTAsMCArMSw1MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9PTkVEX0JDX09ORURVUENBV1JJVEVSX0hfCisjZGVmaW5lIEZYQkFSQ09ERV9PTkVEX0JDX09ORURVUENBV1JJVEVSX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL29uZWQvQkNfT25lRGltV3JpdGVyLmgiCisKK2NsYXNzIENCQ19PbmVkRUFOMTNXcml0ZXI7CitjbGFzcyBDRlhfRElCaXRtYXA7CitjbGFzcyBDRlhfTWF0cml4OworY2xhc3MgQ0ZYX1JlbmRlckRldmljZTsKKworY2xhc3MgQ0JDX09uZWRVUENBV3JpdGVyIDogcHVibGljIENCQ19PbmVEaW1Xcml0ZXIgeworIHB1YmxpYzoKKyAgQ0JDX09uZWRVUENBV3JpdGVyKCk7CisgIH5DQkNfT25lZFVQQ0FXcml0ZXIoKSBvdmVycmlkZTsKKworICAvLyBDQkNfT25lRGltV3JpdGVyCisgIHVpbnQ4X3QqIEVuY29kZVdpdGhIaW50KGNvbnN0IEJ5dGVTdHJpbmcmIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMpIG92ZXJyaWRlOworICB1aW50OF90KiBFbmNvZGVJbXBsKGNvbnN0IEJ5dGVTdHJpbmcmIGNvbnRlbnRzLCBpbnQzMl90JiBvdXRMZW5ndGgpIG92ZXJyaWRlOworICBib29sIENoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cykgb3ZlcnJpZGU7CisgIFdpZGVTdHJpbmcgRmlsdGVyQ29udGVudHMoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzKSBvdmVycmlkZTsKKworICB2b2lkIEluaXQoKTsKKyAgaW50MzJfdCBDYWxjQ2hlY2tzdW0oY29uc3QgQnl0ZVN0cmluZyYgY29udGVudHMpOworCisgcHJvdGVjdGVkOgorICBib29sIFNob3dDaGFycyhjb25zdCBXaWRlU3RyaW5nVmlldyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LAorICAgICAgICAgICAgICAgICBpbnQzMl90IGJhcldpZHRoLAorICAgICAgICAgICAgICAgICBpbnQzMl90IG11bHRpcGxlKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxDQkNfT25lZEVBTjEzV3JpdGVyPiBtX3N1YldyaXRlcjsKK307CisKKyNlbmRpZiAgLy8gRlhCQVJDT0RFX09ORURfQkNfT05FRFVQQ0FXUklURVJfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRVUENBV3JpdGVyX3VuaXR0ZXN0LmNwcCBiL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRVUENBV3JpdGVyX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDlmNmM1Ci0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FXcml0ZXJfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsOTYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImZ4YmFyY29kZS9vbmVkL0JDX09uZWRVUENBV3JpdGVyLmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSB7CisKK1RFU1QoT25lZFVQQ0FXcml0ZXJUZXN0LCBFbmNvZGUpIHsKKyAgQ0JDX09uZWRVUENBV3JpdGVyIHdyaXRlcjsKKyAgaW50MzJfdCB3aWR0aDsKKyAgaW50MzJfdCBoZWlnaHQ7CisKKyAgLy8gVE9ETyhobmFrYXNoaW1hKTogQ0JDX09uZWRVUENBV3JpdGVyIGlzIHVuaXF1ZSBpbiB0aGF0IGl0IG5lZWRzIHRvIGJlCisgIC8vIEluaXQoKSdkLiBHZXQgcmlkIG9mIHRoaXMgY2FsbC4KKyAgd3JpdGVyLkluaXQoKTsKKworICAvLyBVUENBIGJhcmNvZGVzIGVuY29kZSAxMi1kaWdpdCBudW1iZXJzIGludG8gOTUgbW9kdWxlcyBpbiBhIHVuaWRpbWVuc2lvbmFsCisgIC8vIGRpc3Bvc2l0aW9uLgorICB1aW50OF90KiBlbmNvZGVkID0gd3JpdGVyLkVuY29kZSgiIiwgQkNGT1JNQVRfVVBDX0EsIHdpZHRoLCBoZWlnaHQpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgZW5jb2RlZCk7CisgIEZYX0ZyZWUoZW5jb2RlZCk7CisKKyAgZW5jb2RlZCA9IHdyaXRlci5FbmNvZGUoIjEyMyIsIEJDRk9STUFUX1VQQ19BLCB3aWR0aCwgaGVpZ2h0KTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIGVuY29kZWQpOworICBGWF9GcmVlKGVuY29kZWQpOworCisgIGVuY29kZWQgPSB3cml0ZXIuRW5jb2RlKCIxMjM0NTY3ODkwMSIsIEJDRk9STUFUX1VQQ19BLCB3aWR0aCwgaGVpZ2h0KTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIGVuY29kZWQpOworICBGWF9GcmVlKGVuY29kZWQpOworCisgIGVuY29kZWQgPSB3cml0ZXIuRW5jb2RlKCIxMjM0NTY3ODkwMTIzIiwgQkNGT1JNQVRfVVBDX0EsIHdpZHRoLCBoZWlnaHQpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgZW5jb2RlZCk7CisgIEZYX0ZyZWUoZW5jb2RlZCk7CisKKyAgZW5jb2RlZCA9IHdyaXRlci5FbmNvZGUoIjEyMzQ1Njc4OTAxMiIsIEJDRk9STUFUX1VQQ19BLCB3aWR0aCwgaGVpZ2h0KTsKKyAgY29uc3QgY2hhciogZXhwZWN0ZWQgPQorICAgICAgIiMgIyIgICAgICAvLyBTdGFydAorICAgICAgIiAgIyMgICMiICAvLyAxIEwKKyAgICAgICIgICMgICMjIiAgLy8gMiBMCisgICAgICAiICMjIyMgIyIgIC8vIDMgTAorICAgICAgIiAjICAgIyMiICAvLyA0IEwKKyAgICAgICIgIyMgICAjIiAgLy8gNSBMCisgICAgICAiICMgIyMjIyIgIC8vIDYgTAorICAgICAgIiAjICMgIiAgICAvLyBNaWRkbGUKKyAgICAgICIjICAgIyAgIiAgLy8gNyBSCisgICAgICAiIyAgIyAgICIgIC8vIDggUgorICAgICAgIiMjIyAjICAiICAvLyA5IFIKKyAgICAgICIjIyMgICMgIiAgLy8gMCBSCisgICAgICAiIyMgICMjICIgIC8vIDEgUgorICAgICAgIiMjICMjICAiICAvLyAyIFIKKyAgICAgICIjICMiOyAgICAgLy8gRW5kCisgIEVYUEVDVF9ORShudWxscHRyLCBlbmNvZGVkKTsKKyAgRVhQRUNUX0VRKDEsIGhlaWdodCk7CisgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxpbnQzMl90PihzdHJsZW4oZXhwZWN0ZWQpKSwgd2lkdGgpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0cmxlbihleHBlY3RlZCk7IGkrKykgeworICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSAhPSAnICcsICEhZW5jb2RlZFtpXSkgPDwgaTsKKyAgfQorICBGWF9GcmVlKGVuY29kZWQpOworCisgIGVuY29kZWQgPSB3cml0ZXIuRW5jb2RlKCI3Nzc2NjY1NTU0NDAiLCBCQ0ZPUk1BVF9VUENfQSwgd2lkdGgsIGhlaWdodCk7CisgIGV4cGVjdGVkID0KKyAgICAgICIjICMiICAgICAgLy8gU3RhcnQKKyAgICAgICIgIyMjICMjIiAgLy8gNyBMCisgICAgICAiICMjIyAjIyIgIC8vIDcgTAorICAgICAgIiAjIyMgIyMiICAvLyA3IEwKKyAgICAgICIgIyAjIyMjIiAgLy8gNiBMCisgICAgICAiICMgIyMjIyIgIC8vIDYgTAorICAgICAgIiAjICMjIyMiICAvLyA2IEwKKyAgICAgICIgIyAjICIgICAgLy8gTWlkZGxlCisgICAgICAiIyAgIyMjICIgIC8vIDUgUgorICAgICAgIiMgICMjIyAiICAvLyA1IFIKKyAgICAgICIjICAjIyMgIiAgLy8gNSBSCisgICAgICAiIyAjIyMgICIgIC8vIDQgUgorICAgICAgIiMgIyMjICAiICAvLyA0IFIKKyAgICAgICIjIyMgICMgIiAgLy8gMCBSCisgICAgICAiIyAjIjsgICAgIC8vIEVuZAorICBFWFBFQ1RfTkUobnVsbHB0ciwgZW5jb2RlZCk7CisgIEVYUEVDVF9FUSgxLCBoZWlnaHQpOworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RybGVuKGV4cGVjdGVkKSksIHdpZHRoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHJsZW4oZXhwZWN0ZWQpOyBpKyspIHsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0gIT0gJyAnLCAhIWVuY29kZWRbaV0pIDw8IGk7CisgIH0KKyAgRlhfRnJlZShlbmNvZGVkKTsKK30KKworVEVTVChPbmVkVVBDQVdyaXRlclRlc3QsIENoZWNrc3VtKSB7CisgIENCQ19PbmVkVVBDQVdyaXRlciB3cml0ZXI7CisgIEVYUEVDVF9FUSgwLCB3cml0ZXIuQ2FsY0NoZWNrc3VtKCIiKSk7CisgIEVYUEVDVF9FUSg2LCB3cml0ZXIuQ2FsY0NoZWNrc3VtKCIxMjMiKSk7CisgIEVYUEVDVF9FUSgyLCB3cml0ZXIuQ2FsY0NoZWNrc3VtKCIxMjM0NTY3ODkwMSIpKTsKKyAgRVhQRUNUX0VRKDAsIHdyaXRlci5DYWxjQ2hlY2tzdW0oIjc3NzY2NjU1NTQ0IikpOworfQorCit9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3LmNwcCBiL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjczYjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTcuY3BwCkBAIC0wLDAgKzEsNTc3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6CisvKgorICogQ29weXJpZ2h0IDIwMDYgSmVyZW1pYXMgTWFlcmtpIGluIHBhcnQsIGFuZCBaWGluZyBBdXRob3JzIGluIHBhcnQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxNy5oIgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWF0cml4LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlUm93LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21wYWN0aW9uLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFcnJvckNvcnJlY3Rpb24uaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXIuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvdXRpbHMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK2NvbnN0IGludDMyX3QgQ0JDX1BERjQxNzo6Q09ERVdPUkRfVEFCTEVbXVs5MjldID0geworICAgIHsweDFkNWMwLCAweDFlYWYwLCAweDFmNTdjLCAweDFkNGUwLCAweDFlYTc4LCAweDFmNTNlLCAweDFhOGMwLCAweDFkNDcwLAorICAgICAweDFhODYwLCAweDE1MDQwLCAweDFhODMwLCAweDE1MDIwLCAweDFhZGMwLCAweDFkNmYwLCAweDFlYjdjLCAweDFhY2UwLAorICAgICAweDFkNjc4LCAweDFlYjNlLCAweDE1OGMwLCAweDFhYzcwLCAweDE1ODYwLCAweDE1ZGMwLCAweDFhZWYwLCAweDFkNzdjLAorICAgICAweDE1Y2UwLCAweDFhZTc4LCAweDFkNzNlLCAweDE1YzcwLCAweDFhZTNjLCAweDE1ZWYwLCAweDFhZjdjLCAweDE1ZTc4LAorICAgICAweDFhZjNlLCAweDE1ZjdjLCAweDFmNWZhLCAweDFkMmUwLCAweDFlOTc4LCAweDFmNGJlLCAweDFhNGMwLCAweDFkMjcwLAorICAgICAweDFlOTNjLCAweDFhNDYwLCAweDFkMjM4LCAweDE0ODQwLCAweDFhNDMwLCAweDFkMjFjLCAweDE0ODIwLCAweDFhNDE4LAorICAgICAweDE0ODEwLCAweDFhNmUwLCAweDFkMzc4LCAweDFlOWJlLCAweDE0Y2MwLCAweDFhNjcwLCAweDFkMzNjLCAweDE0YzYwLAorICAgICAweDFhNjM4LCAweDFkMzFlLCAweDE0YzMwLCAweDFhNjFjLCAweDE0ZWUwLCAweDFhNzc4LCAweDFkM2JlLCAweDE0ZTcwLAorICAgICAweDFhNzNjLCAweDE0ZTM4LCAweDFhNzFlLCAweDE0Zjc4LCAweDFhN2JlLCAweDE0ZjNjLCAweDE0ZjFlLCAweDFhMmMwLAorICAgICAweDFkMTcwLCAweDFlOGJjLCAweDFhMjYwLCAweDFkMTM4LCAweDFlODllLCAweDE0NDQwLCAweDFhMjMwLCAweDFkMTFjLAorICAgICAweDE0NDIwLCAweDFhMjE4LCAweDE0NDEwLCAweDE0NDA4LCAweDE0NmMwLCAweDFhMzcwLCAweDFkMWJjLCAweDE0NjYwLAorICAgICAweDFhMzM4LCAweDFkMTllLCAweDE0NjMwLCAweDFhMzFjLCAweDE0NjE4LCAweDE0NjBjLCAweDE0NzcwLCAweDFhM2JjLAorICAgICAweDE0NzM4LCAweDFhMzllLCAweDE0NzFjLCAweDE0N2JjLCAweDFhMTYwLCAweDFkMGI4LCAweDFlODVlLCAweDE0MjQwLAorICAgICAweDFhMTMwLCAweDFkMDljLCAweDE0MjIwLCAweDFhMTE4LCAweDFkMDhlLCAweDE0MjEwLCAweDFhMTBjLCAweDE0MjA4LAorICAgICAweDFhMTA2LCAweDE0MzYwLCAweDFhMWI4LCAweDFkMGRlLCAweDE0MzMwLCAweDFhMTljLCAweDE0MzE4LCAweDFhMThlLAorICAgICAweDE0MzBjLCAweDE0MzA2LCAweDFhMWRlLCAweDE0MzhlLCAweDE0MTQwLCAweDFhMGIwLCAweDFkMDVjLCAweDE0MTIwLAorICAgICAweDFhMDk4LCAweDFkMDRlLCAweDE0MTEwLCAweDFhMDhjLCAweDE0MTA4LCAweDFhMDg2LCAweDE0MTA0LCAweDE0MWIwLAorICAgICAweDE0MTk4LCAweDE0MThjLCAweDE0MGEwLCAweDFkMDJlLCAweDFhMDRjLCAweDFhMDQ2LCAweDE0MDgyLCAweDFjYWUwLAorICAgICAweDFlNTc4LCAweDFmMmJlLCAweDE5NGMwLCAweDFjYTcwLCAweDFlNTNjLCAweDE5NDYwLCAweDFjYTM4LCAweDFlNTFlLAorICAgICAweDEyODQwLCAweDE5NDMwLCAweDEyODIwLCAweDE5NmUwLCAweDFjYjc4LCAweDFlNWJlLCAweDEyY2MwLCAweDE5NjcwLAorICAgICAweDFjYjNjLCAweDEyYzYwLCAweDE5NjM4LCAweDEyYzMwLCAweDEyYzE4LCAweDEyZWUwLCAweDE5Nzc4LCAweDFjYmJlLAorICAgICAweDEyZTcwLCAweDE5NzNjLCAweDEyZTM4LCAweDEyZTFjLCAweDEyZjc4LCAweDE5N2JlLCAweDEyZjNjLCAweDEyZmJlLAorICAgICAweDFkYWMwLCAweDFlZDcwLCAweDFmNmJjLCAweDFkYTYwLCAweDFlZDM4LCAweDFmNjllLCAweDFiNDQwLCAweDFkYTMwLAorICAgICAweDFlZDFjLCAweDFiNDIwLCAweDFkYTE4LCAweDFlZDBlLCAweDFiNDEwLCAweDFkYTBjLCAweDE5MmMwLCAweDFjOTcwLAorICAgICAweDFlNGJjLCAweDFiNmMwLCAweDE5MjYwLCAweDFjOTM4LCAweDFlNDllLCAweDFiNjYwLCAweDFkYjM4LCAweDFlZDllLAorICAgICAweDE2YzQwLCAweDEyNDIwLCAweDE5MjE4LCAweDFjOTBlLCAweDE2YzIwLCAweDFiNjE4LCAweDE2YzEwLCAweDEyNmMwLAorICAgICAweDE5MzcwLCAweDFjOWJjLCAweDE2ZWMwLCAweDEyNjYwLCAweDE5MzM4LCAweDFjOTllLCAweDE2ZTYwLCAweDFiNzM4LAorICAgICAweDFkYjllLCAweDE2ZTMwLCAweDEyNjE4LCAweDE2ZTE4LCAweDEyNzcwLCAweDE5M2JjLCAweDE2ZjcwLCAweDEyNzM4LAorICAgICAweDE5MzllLCAweDE2ZjM4LCAweDFiNzllLCAweDE2ZjFjLCAweDEyN2JjLCAweDE2ZmJjLCAweDEyNzllLCAweDE2ZjllLAorICAgICAweDFkOTYwLCAweDFlY2I4LCAweDFmNjVlLCAweDFiMjQwLCAweDFkOTMwLCAweDFlYzljLCAweDFiMjIwLCAweDFkOTE4LAorICAgICAweDFlYzhlLCAweDFiMjEwLCAweDFkOTBjLCAweDFiMjA4LCAweDFiMjA0LCAweDE5MTYwLCAweDFjOGI4LCAweDFlNDVlLAorICAgICAweDFiMzYwLCAweDE5MTMwLCAweDFjODljLCAweDE2NjQwLCAweDEyMjIwLCAweDFkOTljLCAweDFjODhlLCAweDE2NjIwLAorICAgICAweDEyMjEwLCAweDE5MTBjLCAweDE2NjEwLCAweDFiMzBjLCAweDE5MTA2LCAweDEyMjA0LCAweDEyMzYwLCAweDE5MWI4LAorICAgICAweDFjOGRlLCAweDE2NzYwLCAweDEyMzMwLCAweDE5MTljLCAweDE2NzMwLCAweDFiMzljLCAweDE5MThlLCAweDE2NzE4LAorICAgICAweDEyMzBjLCAweDEyMzA2LCAweDEyM2I4LCAweDE5MWRlLCAweDE2N2I4LCAweDEyMzljLCAweDE2NzljLCAweDEyMzhlLAorICAgICAweDE2NzhlLCAweDE2N2RlLCAweDFiMTQwLCAweDFkOGIwLCAweDFlYzVjLCAweDFiMTIwLCAweDFkODk4LCAweDFlYzRlLAorICAgICAweDFiMTEwLCAweDFkODhjLCAweDFiMTA4LCAweDFkODg2LCAweDFiMTA0LCAweDFiMTAyLCAweDEyMTQwLCAweDE5MGIwLAorICAgICAweDFjODVjLCAweDE2MzQwLCAweDEyMTIwLCAweDE5MDk4LCAweDFjODRlLCAweDE2MzIwLCAweDFiMTk4LCAweDFkOGNlLAorICAgICAweDE2MzEwLCAweDEyMTA4LCAweDE5MDg2LCAweDE2MzA4LCAweDFiMTg2LCAweDE2MzA0LCAweDEyMWIwLCAweDE5MGRjLAorICAgICAweDE2M2IwLCAweDEyMTk4LCAweDE5MGNlLCAweDE2Mzk4LCAweDFiMWNlLCAweDE2MzhjLCAweDEyMTg2LCAweDE2Mzg2LAorICAgICAweDE2M2RjLCAweDE2M2NlLCAweDFiMGEwLCAweDFkODU4LCAweDFlYzJlLCAweDFiMDkwLCAweDFkODRjLCAweDFiMDg4LAorICAgICAweDFkODQ2LCAweDFiMDg0LCAweDFiMDgyLCAweDEyMGEwLCAweDE5MDU4LCAweDFjODJlLCAweDE2MWEwLCAweDEyMDkwLAorICAgICAweDE5MDRjLCAweDE2MTkwLCAweDFiMGNjLCAweDE5MDQ2LCAweDE2MTg4LCAweDEyMDg0LCAweDE2MTg0LCAweDEyMDgyLAorICAgICAweDEyMGQ4LCAweDE2MWQ4LCAweDE2MWNjLCAweDE2MWM2LCAweDFkODJjLCAweDFkODI2LCAweDFiMDQyLCAweDE5MDJjLAorICAgICAweDEyMDQ4LCAweDE2MGM4LCAweDE2MGM0LCAweDE2MGMyLCAweDE4YWMwLCAweDFjNTcwLCAweDFlMmJjLCAweDE4YTYwLAorICAgICAweDFjNTM4LCAweDExNDQwLCAweDE4YTMwLCAweDFjNTFjLCAweDExNDIwLCAweDE4YTE4LCAweDExNDEwLCAweDExNDA4LAorICAgICAweDExNmMwLCAweDE4YjcwLCAweDFjNWJjLCAweDExNjYwLCAweDE4YjM4LCAweDFjNTllLCAweDExNjMwLCAweDE4YjFjLAorICAgICAweDExNjE4LCAweDExNjBjLCAweDExNzcwLCAweDE4YmJjLCAweDExNzM4LCAweDE4YjllLCAweDExNzFjLCAweDExN2JjLAorICAgICAweDExNzllLCAweDFjZDYwLCAweDFlNmI4LCAweDFmMzVlLCAweDE5YTQwLCAweDFjZDMwLCAweDFlNjljLCAweDE5YTIwLAorICAgICAweDFjZDE4LCAweDFlNjhlLCAweDE5YTEwLCAweDFjZDBjLCAweDE5YTA4LCAweDFjZDA2LCAweDE4OTYwLCAweDFjNGI4LAorICAgICAweDFlMjVlLCAweDE5YjYwLCAweDE4OTMwLCAweDFjNDljLCAweDEzNjQwLCAweDExMjIwLCAweDFjZDljLCAweDFjNDhlLAorICAgICAweDEzNjIwLCAweDE5YjE4LCAweDE4OTBjLCAweDEzNjEwLCAweDExMjA4LCAweDEzNjA4LCAweDExMzYwLCAweDE4OWI4LAorICAgICAweDFjNGRlLCAweDEzNzYwLCAweDExMzMwLCAweDFjZGRlLCAweDEzNzMwLCAweDE5YjljLCAweDE4OThlLCAweDEzNzE4LAorICAgICAweDExMzBjLCAweDEzNzBjLCAweDExM2I4LCAweDE4OWRlLCAweDEzN2I4LCAweDExMzljLCAweDEzNzljLCAweDExMzhlLAorICAgICAweDExM2RlLCAweDEzN2RlLCAweDFkZDQwLCAweDFlZWIwLCAweDFmNzVjLCAweDFkZDIwLCAweDFlZTk4LCAweDFmNzRlLAorICAgICAweDFkZDEwLCAweDFlZThjLCAweDFkZDA4LCAweDFlZTg2LCAweDFkZDA0LCAweDE5OTQwLCAweDFjY2IwLCAweDFlNjVjLAorICAgICAweDFiYjQwLCAweDE5OTIwLCAweDFlZWRjLCAweDFlNjRlLCAweDFiYjIwLCAweDFkZDk4LCAweDFlZWNlLCAweDFiYjEwLAorICAgICAweDE5OTA4LCAweDFjYzg2LCAweDFiYjA4LCAweDFkZDg2LCAweDE5OTAyLCAweDExMTQwLCAweDE4OGIwLCAweDFjNDVjLAorICAgICAweDEzMzQwLCAweDExMTIwLCAweDE4ODk4LCAweDFjNDRlLCAweDE3NzQwLCAweDEzMzIwLCAweDE5OTk4LCAweDFjY2NlLAorICAgICAweDE3NzIwLCAweDFiYjk4LCAweDFkZGNlLCAweDE4ODg2LCAweDE3NzEwLCAweDEzMzA4LCAweDE5OTg2LCAweDE3NzA4LAorICAgICAweDExMTAyLCAweDExMWIwLCAweDE4OGRjLCAweDEzM2IwLCAweDExMTk4LCAweDE4OGNlLCAweDE3N2IwLCAweDEzMzk4LAorICAgICAweDE5OWNlLCAweDE3Nzk4LCAweDFiYmNlLCAweDExMTg2LCAweDEzMzg2LCAweDExMWRjLCAweDEzM2RjLCAweDExMWNlLAorICAgICAweDE3N2RjLCAweDEzM2NlLCAweDFkY2EwLCAweDFlZTU4LCAweDFmNzJlLCAweDFkYzkwLCAweDFlZTRjLCAweDFkYzg4LAorICAgICAweDFlZTQ2LCAweDFkYzg0LCAweDFkYzgyLCAweDE5OGEwLCAweDFjYzU4LCAweDFlNjJlLCAweDFiOWEwLCAweDE5ODkwLAorICAgICAweDFlZTZlLCAweDFiOTkwLCAweDFkY2NjLCAweDFjYzQ2LCAweDFiOTg4LCAweDE5ODg0LCAweDFiOTg0LCAweDE5ODgyLAorICAgICAweDFiOTgyLCAweDExMGEwLCAweDE4ODU4LCAweDFjNDJlLCAweDEzMWEwLCAweDExMDkwLCAweDE4ODRjLCAweDE3M2EwLAorICAgICAweDEzMTkwLCAweDE5OGNjLCAweDE4ODQ2LCAweDE3MzkwLCAweDFiOWNjLCAweDExMDg0LCAweDE3Mzg4LCAweDEzMTg0LAorICAgICAweDExMDgyLCAweDEzMTgyLCAweDExMGQ4LCAweDE4ODZlLCAweDEzMWQ4LCAweDExMGNjLCAweDE3M2Q4LCAweDEzMWNjLAorICAgICAweDExMGM2LCAweDE3M2NjLCAweDEzMWM2LCAweDExMGVlLCAweDE3M2VlLCAweDFkYzUwLCAweDFlZTJjLCAweDFkYzQ4LAorICAgICAweDFlZTI2LCAweDFkYzQ0LCAweDFkYzQyLCAweDE5ODUwLCAweDFjYzJjLCAweDFiOGQwLCAweDE5ODQ4LCAweDFjYzI2LAorICAgICAweDFiOGM4LCAweDFkYzY2LCAweDFiOGM0LCAweDE5ODQyLCAweDFiOGMyLCAweDExMDUwLCAweDE4ODJjLCAweDEzMGQwLAorICAgICAweDExMDQ4LCAweDE4ODI2LCAweDE3MWQwLCAweDEzMGM4LCAweDE5ODY2LCAweDE3MWM4LCAweDFiOGU2LCAweDExMDQyLAorICAgICAweDE3MWM0LCAweDEzMGMyLCAweDE3MWMyLCAweDEzMGVjLCAweDE3MWVjLCAweDE3MWU2LCAweDFlZTE2LCAweDFkYzIyLAorICAgICAweDFjYzE2LCAweDE5ODI0LCAweDE5ODIyLCAweDExMDI4LCAweDEzMDY4LCAweDE3MGU4LCAweDExMDIyLCAweDEzMDYyLAorICAgICAweDE4NTYwLCAweDEwYTQwLCAweDE4NTMwLCAweDEwYTIwLCAweDE4NTE4LCAweDFjMjhlLCAweDEwYTEwLCAweDE4NTBjLAorICAgICAweDEwYTA4LCAweDE4NTA2LCAweDEwYjYwLCAweDE4NWI4LCAweDFjMmRlLCAweDEwYjMwLCAweDE4NTljLCAweDEwYjE4LAorICAgICAweDE4NThlLCAweDEwYjBjLCAweDEwYjA2LCAweDEwYmI4LCAweDE4NWRlLCAweDEwYjljLCAweDEwYjhlLCAweDEwYmRlLAorICAgICAweDE4ZDQwLCAweDFjNmIwLCAweDFlMzVjLCAweDE4ZDIwLCAweDFjNjk4LCAweDE4ZDEwLCAweDFjNjhjLCAweDE4ZDA4LAorICAgICAweDFjNjg2LCAweDE4ZDA0LCAweDEwOTQwLCAweDE4NGIwLCAweDFjMjVjLCAweDExYjQwLCAweDEwOTIwLCAweDFjNmRjLAorICAgICAweDFjMjRlLCAweDExYjIwLCAweDE4ZDk4LCAweDFjNmNlLCAweDExYjEwLCAweDEwOTA4LCAweDE4NDg2LCAweDExYjA4LAorICAgICAweDE4ZDg2LCAweDEwOTAyLCAweDEwOWIwLCAweDE4NGRjLCAweDExYmIwLCAweDEwOTk4LCAweDE4NGNlLCAweDExYjk4LAorICAgICAweDE4ZGNlLCAweDExYjhjLCAweDEwOTg2LCAweDEwOWRjLCAweDExYmRjLCAweDEwOWNlLCAweDExYmNlLCAweDFjZWEwLAorICAgICAweDFlNzU4LCAweDFmM2FlLCAweDFjZTkwLCAweDFlNzRjLCAweDFjZTg4LCAweDFlNzQ2LCAweDFjZTg0LCAweDFjZTgyLAorICAgICAweDE4Y2EwLCAweDFjNjU4LCAweDE5ZGEwLCAweDE4YzkwLCAweDFjNjRjLCAweDE5ZDkwLCAweDFjZWNjLCAweDFjNjQ2LAorICAgICAweDE5ZDg4LCAweDE4Yzg0LCAweDE5ZDg0LCAweDE4YzgyLCAweDE5ZDgyLCAweDEwOGEwLCAweDE4NDU4LCAweDExOWEwLAorICAgICAweDEwODkwLCAweDFjNjZlLCAweDEzYmEwLCAweDExOTkwLCAweDE4Y2NjLCAweDE4NDQ2LCAweDEzYjkwLCAweDE5ZGNjLAorICAgICAweDEwODg0LCAweDEzYjg4LCAweDExOTg0LCAweDEwODgyLCAweDExOTgyLCAweDEwOGQ4LCAweDE4NDZlLCAweDExOWQ4LAorICAgICAweDEwOGNjLCAweDEzYmQ4LCAweDExOWNjLCAweDEwOGM2LCAweDEzYmNjLCAweDExOWM2LCAweDEwOGVlLCAweDExOWVlLAorICAgICAweDEzYmVlLCAweDFlZjUwLCAweDFmN2FjLCAweDFlZjQ4LCAweDFmN2E2LCAweDFlZjQ0LCAweDFlZjQyLCAweDFjZTUwLAorICAgICAweDFlNzJjLCAweDFkZWQwLCAweDFlZjZjLCAweDFlNzI2LCAweDFkZWM4LCAweDFlZjY2LCAweDFkZWM0LCAweDFjZTQyLAorICAgICAweDFkZWMyLCAweDE4YzUwLCAweDFjNjJjLCAweDE5Y2QwLCAweDE4YzQ4LCAweDFjNjI2LCAweDFiZGQwLCAweDE5Y2M4LAorICAgICAweDFjZTY2LCAweDFiZGM4LCAweDFkZWU2LCAweDE4YzQyLCAweDFiZGM0LCAweDE5Y2MyLCAweDFiZGMyLCAweDEwODUwLAorICAgICAweDE4NDJjLCAweDExOGQwLCAweDEwODQ4LCAweDE4NDI2LCAweDEzOWQwLCAweDExOGM4LCAweDE4YzY2LCAweDE3YmQwLAorICAgICAweDEzOWM4LCAweDE5Y2U2LCAweDEwODQyLCAweDE3YmM4LCAweDFiZGU2LCAweDExOGMyLCAweDE3YmM0LCAweDEwODZjLAorICAgICAweDExOGVjLCAweDEwODY2LCAweDEzOWVjLCAweDExOGU2LCAweDE3YmVjLCAweDEzOWU2LCAweDE3YmU2LCAweDFlZjI4LAorICAgICAweDFmNzk2LCAweDFlZjI0LCAweDFlZjIyLCAweDFjZTI4LCAweDFlNzE2LCAweDFkZTY4LCAweDFlZjM2LCAweDFkZTY0LAorICAgICAweDFjZTIyLCAweDFkZTYyLCAweDE4YzI4LCAweDFjNjE2LCAweDE5YzY4LCAweDE4YzI0LCAweDFiY2U4LCAweDE5YzY0LAorICAgICAweDE4YzIyLCAweDFiY2U0LCAweDE5YzYyLCAweDFiY2UyLCAweDEwODI4LCAweDE4NDE2LCAweDExODY4LCAweDE4YzM2LAorICAgICAweDEzOGU4LCAweDExODY0LCAweDEwODIyLCAweDE3OWU4LCAweDEzOGU0LCAweDExODYyLCAweDE3OWU0LCAweDEzOGUyLAorICAgICAweDE3OWUyLCAweDExODc2LCAweDE3OWY2LCAweDFlZjEyLCAweDFkZTM0LCAweDFkZTMyLCAweDE5YzM0LCAweDFiYzc0LAorICAgICAweDFiYzcyLCAweDExODM0LCAweDEzODc0LCAweDE3OGY0LCAweDE3OGYyLCAweDEwNTQwLCAweDEwNTIwLCAweDE4Mjk4LAorICAgICAweDEwNTEwLCAweDEwNTA4LCAweDEwNTA0LCAweDEwNWIwLCAweDEwNTk4LCAweDEwNThjLCAweDEwNTg2LCAweDEwNWRjLAorICAgICAweDEwNWNlLCAweDE4NmEwLCAweDE4NjkwLCAweDFjMzRjLCAweDE4Njg4LCAweDFjMzQ2LCAweDE4Njg0LCAweDE4NjgyLAorICAgICAweDEwNGEwLCAweDE4MjU4LCAweDEwZGEwLCAweDE4NmQ4LCAweDE4MjRjLCAweDEwZDkwLCAweDE4NmNjLCAweDEwZDg4LAorICAgICAweDE4NmM2LCAweDEwZDg0LCAweDEwNDgyLCAweDEwZDgyLCAweDEwNGQ4LCAweDE4MjZlLCAweDEwZGQ4LCAweDE4NmVlLAorICAgICAweDEwZGNjLCAweDEwNGM2LCAweDEwZGM2LCAweDEwNGVlLCAweDEwZGVlLCAweDFjNzUwLCAweDFjNzQ4LCAweDFjNzQ0LAorICAgICAweDFjNzQyLCAweDE4NjUwLCAweDE4ZWQwLCAweDFjNzZjLCAweDFjMzI2LCAweDE4ZWM4LCAweDFjNzY2LCAweDE4ZWM0LAorICAgICAweDE4NjQyLCAweDE4ZWMyLCAweDEwNDUwLCAweDEwY2QwLCAweDEwNDQ4LCAweDE4MjI2LCAweDExZGQwLCAweDEwY2M4LAorICAgICAweDEwNDQ0LCAweDExZGM4LCAweDEwY2M0LCAweDEwNDQyLCAweDExZGM0LCAweDEwY2MyLCAweDEwNDZjLCAweDEwY2VjLAorICAgICAweDEwNDY2LCAweDExZGVjLCAweDEwY2U2LCAweDExZGU2LCAweDFlN2E4LCAweDFlN2E0LCAweDFlN2EyLCAweDFjNzI4LAorICAgICAweDFjZjY4LCAweDFlN2I2LCAweDFjZjY0LCAweDFjNzIyLCAweDFjZjYyLCAweDE4NjI4LCAweDFjMzE2LCAweDE4ZTY4LAorICAgICAweDFjNzM2LCAweDE5ZWU4LCAweDE4ZTY0LCAweDE4NjIyLCAweDE5ZWU0LCAweDE4ZTYyLCAweDE5ZWUyLCAweDEwNDI4LAorICAgICAweDE4MjE2LCAweDEwYzY4LCAweDE4NjM2LCAweDExY2U4LCAweDEwYzY0LCAweDEwNDIyLCAweDEzZGU4LCAweDExY2U0LAorICAgICAweDEwYzYyLCAweDEzZGU0LCAweDExY2UyLCAweDEwNDM2LCAweDEwYzc2LCAweDExY2Y2LCAweDEzZGY2LCAweDFmN2Q0LAorICAgICAweDFmN2QyLCAweDFlNzk0LCAweDFlZmI0LCAweDFlNzkyLCAweDFlZmIyLCAweDFjNzE0LCAweDFjZjM0LCAweDFjNzEyLAorICAgICAweDFkZjc0LCAweDFjZjMyLCAweDFkZjcyLCAweDE4NjE0LCAweDE4ZTM0LCAweDE4NjEyLCAweDE5ZTc0LCAweDE4ZTMyLAorICAgICAweDFiZWY0fSwKKyAgICB7MHgxZjU2MCwgMHgxZmFiOCwgMHgxZWE0MCwgMHgxZjUzMCwgMHgxZmE5YywgMHgxZWEyMCwgMHgxZjUxOCwgMHgxZmE4ZSwKKyAgICAgMHgxZWExMCwgMHgxZjUwYywgMHgxZWEwOCwgMHgxZjUwNiwgMHgxZWEwNCwgMHgxZWI2MCwgMHgxZjViOCwgMHgxZmFkZSwKKyAgICAgMHgxZDY0MCwgMHgxZWIzMCwgMHgxZjU5YywgMHgxZDYyMCwgMHgxZWIxOCwgMHgxZjU4ZSwgMHgxZDYxMCwgMHgxZWIwYywKKyAgICAgMHgxZDYwOCwgMHgxZWIwNiwgMHgxZDYwNCwgMHgxZDc2MCwgMHgxZWJiOCwgMHgxZjVkZSwgMHgxYWU0MCwgMHgxZDczMCwKKyAgICAgMHgxZWI5YywgMHgxYWUyMCwgMHgxZDcxOCwgMHgxZWI4ZSwgMHgxYWUxMCwgMHgxZDcwYywgMHgxYWUwOCwgMHgxZDcwNiwKKyAgICAgMHgxYWUwNCwgMHgxYWY2MCwgMHgxZDdiOCwgMHgxZWJkZSwgMHgxNWU0MCwgMHgxYWYzMCwgMHgxZDc5YywgMHgxNWUyMCwKKyAgICAgMHgxYWYxOCwgMHgxZDc4ZSwgMHgxNWUxMCwgMHgxYWYwYywgMHgxNWUwOCwgMHgxYWYwNiwgMHgxNWY2MCwgMHgxYWZiOCwKKyAgICAgMHgxZDdkZSwgMHgxNWYzMCwgMHgxYWY5YywgMHgxNWYxOCwgMHgxYWY4ZSwgMHgxNWYwYywgMHgxNWZiOCwgMHgxYWZkZSwKKyAgICAgMHgxNWY5YywgMHgxNWY4ZSwgMHgxZTk0MCwgMHgxZjRiMCwgMHgxZmE1YywgMHgxZTkyMCwgMHgxZjQ5OCwgMHgxZmE0ZSwKKyAgICAgMHgxZTkxMCwgMHgxZjQ4YywgMHgxZTkwOCwgMHgxZjQ4NiwgMHgxZTkwNCwgMHgxZTkwMiwgMHgxZDM0MCwgMHgxZTliMCwKKyAgICAgMHgxZjRkYywgMHgxZDMyMCwgMHgxZTk5OCwgMHgxZjRjZSwgMHgxZDMxMCwgMHgxZTk4YywgMHgxZDMwOCwgMHgxZTk4NiwKKyAgICAgMHgxZDMwNCwgMHgxZDMwMiwgMHgxYTc0MCwgMHgxZDNiMCwgMHgxZTlkYywgMHgxYTcyMCwgMHgxZDM5OCwgMHgxZTljZSwKKyAgICAgMHgxYTcxMCwgMHgxZDM4YywgMHgxYTcwOCwgMHgxZDM4NiwgMHgxYTcwNCwgMHgxYTcwMiwgMHgxNGY0MCwgMHgxYTdiMCwKKyAgICAgMHgxZDNkYywgMHgxNGYyMCwgMHgxYTc5OCwgMHgxZDNjZSwgMHgxNGYxMCwgMHgxYTc4YywgMHgxNGYwOCwgMHgxYTc4NiwKKyAgICAgMHgxNGYwNCwgMHgxNGZiMCwgMHgxYTdkYywgMHgxNGY5OCwgMHgxYTdjZSwgMHgxNGY4YywgMHgxNGY4NiwgMHgxNGZkYywKKyAgICAgMHgxNGZjZSwgMHgxZThhMCwgMHgxZjQ1OCwgMHgxZmEyZSwgMHgxZTg5MCwgMHgxZjQ0YywgMHgxZTg4OCwgMHgxZjQ0NiwKKyAgICAgMHgxZTg4NCwgMHgxZTg4MiwgMHgxZDFhMCwgMHgxZThkOCwgMHgxZjQ2ZSwgMHgxZDE5MCwgMHgxZThjYywgMHgxZDE4OCwKKyAgICAgMHgxZThjNiwgMHgxZDE4NCwgMHgxZDE4MiwgMHgxYTNhMCwgMHgxZDFkOCwgMHgxZThlZSwgMHgxYTM5MCwgMHgxZDFjYywKKyAgICAgMHgxYTM4OCwgMHgxZDFjNiwgMHgxYTM4NCwgMHgxYTM4MiwgMHgxNDdhMCwgMHgxYTNkOCwgMHgxZDFlZSwgMHgxNDc5MCwKKyAgICAgMHgxYTNjYywgMHgxNDc4OCwgMHgxYTNjNiwgMHgxNDc4NCwgMHgxNDc4MiwgMHgxNDdkOCwgMHgxYTNlZSwgMHgxNDdjYywKKyAgICAgMHgxNDdjNiwgMHgxNDdlZSwgMHgxZTg1MCwgMHgxZjQyYywgMHgxZTg0OCwgMHgxZjQyNiwgMHgxZTg0NCwgMHgxZTg0MiwKKyAgICAgMHgxZDBkMCwgMHgxZTg2YywgMHgxZDBjOCwgMHgxZTg2NiwgMHgxZDBjNCwgMHgxZDBjMiwgMHgxYTFkMCwgMHgxZDBlYywKKyAgICAgMHgxYTFjOCwgMHgxZDBlNiwgMHgxYTFjNCwgMHgxYTFjMiwgMHgxNDNkMCwgMHgxYTFlYywgMHgxNDNjOCwgMHgxYTFlNiwKKyAgICAgMHgxNDNjNCwgMHgxNDNjMiwgMHgxNDNlYywgMHgxNDNlNiwgMHgxZTgyOCwgMHgxZjQxNiwgMHgxZTgyNCwgMHgxZTgyMiwKKyAgICAgMHgxZDA2OCwgMHgxZTgzNiwgMHgxZDA2NCwgMHgxZDA2MiwgMHgxYTBlOCwgMHgxZDA3NiwgMHgxYTBlNCwgMHgxYTBlMiwKKyAgICAgMHgxNDFlOCwgMHgxYTBmNiwgMHgxNDFlNCwgMHgxNDFlMiwgMHgxZTgxNCwgMHgxZTgxMiwgMHgxZDAzNCwgMHgxZDAzMiwKKyAgICAgMHgxYTA3NCwgMHgxYTA3MiwgMHgxZTU0MCwgMHgxZjJiMCwgMHgxZjk1YywgMHgxZTUyMCwgMHgxZjI5OCwgMHgxZjk0ZSwKKyAgICAgMHgxZTUxMCwgMHgxZjI4YywgMHgxZTUwOCwgMHgxZjI4NiwgMHgxZTUwNCwgMHgxZTUwMiwgMHgxY2I0MCwgMHgxZTViMCwKKyAgICAgMHgxZjJkYywgMHgxY2IyMCwgMHgxZTU5OCwgMHgxZjJjZSwgMHgxY2IxMCwgMHgxZTU4YywgMHgxY2IwOCwgMHgxZTU4NiwKKyAgICAgMHgxY2IwNCwgMHgxY2IwMiwgMHgxOTc0MCwgMHgxY2JiMCwgMHgxZTVkYywgMHgxOTcyMCwgMHgxY2I5OCwgMHgxZTVjZSwKKyAgICAgMHgxOTcxMCwgMHgxY2I4YywgMHgxOTcwOCwgMHgxY2I4NiwgMHgxOTcwNCwgMHgxOTcwMiwgMHgxMmY0MCwgMHgxOTdiMCwKKyAgICAgMHgxY2JkYywgMHgxMmYyMCwgMHgxOTc5OCwgMHgxY2JjZSwgMHgxMmYxMCwgMHgxOTc4YywgMHgxMmYwOCwgMHgxOTc4NiwKKyAgICAgMHgxMmYwNCwgMHgxMmZiMCwgMHgxOTdkYywgMHgxMmY5OCwgMHgxOTdjZSwgMHgxMmY4YywgMHgxMmY4NiwgMHgxMmZkYywKKyAgICAgMHgxMmZjZSwgMHgxZjZhMCwgMHgxZmI1OCwgMHgxNmJmMCwgMHgxZjY5MCwgMHgxZmI0YywgMHgxNjlmOCwgMHgxZjY4OCwKKyAgICAgMHgxZmI0NiwgMHgxNjhmYywgMHgxZjY4NCwgMHgxZjY4MiwgMHgxZTRhMCwgMHgxZjI1OCwgMHgxZjkyZSwgMHgxZWRhMCwKKyAgICAgMHgxZTQ5MCwgMHgxZmI2ZSwgMHgxZWQ5MCwgMHgxZjZjYywgMHgxZjI0NiwgMHgxZWQ4OCwgMHgxZTQ4NCwgMHgxZWQ4NCwKKyAgICAgMHgxZTQ4MiwgMHgxZWQ4MiwgMHgxYzlhMCwgMHgxZTRkOCwgMHgxZjI2ZSwgMHgxZGJhMCwgMHgxYzk5MCwgMHgxZTRjYywKKyAgICAgMHgxZGI5MCwgMHgxZWRjYywgMHgxZTRjNiwgMHgxZGI4OCwgMHgxYzk4NCwgMHgxZGI4NCwgMHgxYzk4MiwgMHgxZGI4MiwKKyAgICAgMHgxOTNhMCwgMHgxYzlkOCwgMHgxZTRlZSwgMHgxYjdhMCwgMHgxOTM5MCwgMHgxYzljYywgMHgxYjc5MCwgMHgxZGJjYywKKyAgICAgMHgxYzljNiwgMHgxYjc4OCwgMHgxOTM4NCwgMHgxYjc4NCwgMHgxOTM4MiwgMHgxYjc4MiwgMHgxMjdhMCwgMHgxOTNkOCwKKyAgICAgMHgxYzllZSwgMHgxNmZhMCwgMHgxMjc5MCwgMHgxOTNjYywgMHgxNmY5MCwgMHgxYjdjYywgMHgxOTNjNiwgMHgxNmY4OCwKKyAgICAgMHgxMjc4NCwgMHgxNmY4NCwgMHgxMjc4MiwgMHgxMjdkOCwgMHgxOTNlZSwgMHgxNmZkOCwgMHgxMjdjYywgMHgxNmZjYywKKyAgICAgMHgxMjdjNiwgMHgxNmZjNiwgMHgxMjdlZSwgMHgxZjY1MCwgMHgxZmIyYywgMHgxNjVmOCwgMHgxZjY0OCwgMHgxZmIyNiwKKyAgICAgMHgxNjRmYywgMHgxZjY0NCwgMHgxNjQ3ZSwgMHgxZjY0MiwgMHgxZTQ1MCwgMHgxZjIyYywgMHgxZWNkMCwgMHgxZTQ0OCwKKyAgICAgMHgxZjIyNiwgMHgxZWNjOCwgMHgxZjY2NiwgMHgxZWNjNCwgMHgxZTQ0MiwgMHgxZWNjMiwgMHgxYzhkMCwgMHgxZTQ2YywKKyAgICAgMHgxZDlkMCwgMHgxYzhjOCwgMHgxZTQ2NiwgMHgxZDljOCwgMHgxZWNlNiwgMHgxZDljNCwgMHgxYzhjMiwgMHgxZDljMiwKKyAgICAgMHgxOTFkMCwgMHgxYzhlYywgMHgxYjNkMCwgMHgxOTFjOCwgMHgxYzhlNiwgMHgxYjNjOCwgMHgxZDllNiwgMHgxYjNjNCwKKyAgICAgMHgxOTFjMiwgMHgxYjNjMiwgMHgxMjNkMCwgMHgxOTFlYywgMHgxNjdkMCwgMHgxMjNjOCwgMHgxOTFlNiwgMHgxNjdjOCwKKyAgICAgMHgxYjNlNiwgMHgxNjdjNCwgMHgxMjNjMiwgMHgxNjdjMiwgMHgxMjNlYywgMHgxNjdlYywgMHgxMjNlNiwgMHgxNjdlNiwKKyAgICAgMHgxZjYyOCwgMHgxZmIxNiwgMHgxNjJmYywgMHgxZjYyNCwgMHgxNjI3ZSwgMHgxZjYyMiwgMHgxZTQyOCwgMHgxZjIxNiwKKyAgICAgMHgxZWM2OCwgMHgxZjYzNiwgMHgxZWM2NCwgMHgxZTQyMiwgMHgxZWM2MiwgMHgxYzg2OCwgMHgxZTQzNiwgMHgxZDhlOCwKKyAgICAgMHgxYzg2NCwgMHgxZDhlNCwgMHgxYzg2MiwgMHgxZDhlMiwgMHgxOTBlOCwgMHgxYzg3NiwgMHgxYjFlOCwgMHgxZDhmNiwKKyAgICAgMHgxYjFlNCwgMHgxOTBlMiwgMHgxYjFlMiwgMHgxMjFlOCwgMHgxOTBmNiwgMHgxNjNlOCwgMHgxMjFlNCwgMHgxNjNlNCwKKyAgICAgMHgxMjFlMiwgMHgxNjNlMiwgMHgxMjFmNiwgMHgxNjNmNiwgMHgxZjYxNCwgMHgxNjE3ZSwgMHgxZjYxMiwgMHgxZTQxNCwKKyAgICAgMHgxZWMzNCwgMHgxZTQxMiwgMHgxZWMzMiwgMHgxYzgzNCwgMHgxZDg3NCwgMHgxYzgzMiwgMHgxZDg3MiwgMHgxOTA3NCwKKyAgICAgMHgxYjBmNCwgMHgxOTA3MiwgMHgxYjBmMiwgMHgxMjBmNCwgMHgxNjFmNCwgMHgxMjBmMiwgMHgxNjFmMiwgMHgxZjYwYSwKKyAgICAgMHgxZTQwYSwgMHgxZWMxYSwgMHgxYzgxYSwgMHgxZDgzYSwgMHgxOTAzYSwgMHgxYjA3YSwgMHgxZTJhMCwgMHgxZjE1OCwKKyAgICAgMHgxZjhhZSwgMHgxZTI5MCwgMHgxZjE0YywgMHgxZTI4OCwgMHgxZjE0NiwgMHgxZTI4NCwgMHgxZTI4MiwgMHgxYzVhMCwKKyAgICAgMHgxZTJkOCwgMHgxZjE2ZSwgMHgxYzU5MCwgMHgxZTJjYywgMHgxYzU4OCwgMHgxZTJjNiwgMHgxYzU4NCwgMHgxYzU4MiwKKyAgICAgMHgxOGJhMCwgMHgxYzVkOCwgMHgxZTJlZSwgMHgxOGI5MCwgMHgxYzVjYywgMHgxOGI4OCwgMHgxYzVjNiwgMHgxOGI4NCwKKyAgICAgMHgxOGI4MiwgMHgxMTdhMCwgMHgxOGJkOCwgMHgxYzVlZSwgMHgxMTc5MCwgMHgxOGJjYywgMHgxMTc4OCwgMHgxOGJjNiwKKyAgICAgMHgxMTc4NCwgMHgxMTc4MiwgMHgxMTdkOCwgMHgxOGJlZSwgMHgxMTdjYywgMHgxMTdjNiwgMHgxMTdlZSwgMHgxZjM1MCwKKyAgICAgMHgxZjlhYywgMHgxMzVmOCwgMHgxZjM0OCwgMHgxZjlhNiwgMHgxMzRmYywgMHgxZjM0NCwgMHgxMzQ3ZSwgMHgxZjM0MiwKKyAgICAgMHgxZTI1MCwgMHgxZjEyYywgMHgxZTZkMCwgMHgxZTI0OCwgMHgxZjEyNiwgMHgxZTZjOCwgMHgxZjM2NiwgMHgxZTZjNCwKKyAgICAgMHgxZTI0MiwgMHgxZTZjMiwgMHgxYzRkMCwgMHgxZTI2YywgMHgxY2RkMCwgMHgxYzRjOCwgMHgxZTI2NiwgMHgxY2RjOCwKKyAgICAgMHgxZTZlNiwgMHgxY2RjNCwgMHgxYzRjMiwgMHgxY2RjMiwgMHgxODlkMCwgMHgxYzRlYywgMHgxOWJkMCwgMHgxODljOCwKKyAgICAgMHgxYzRlNiwgMHgxOWJjOCwgMHgxY2RlNiwgMHgxOWJjNCwgMHgxODljMiwgMHgxOWJjMiwgMHgxMTNkMCwgMHgxODllYywKKyAgICAgMHgxMzdkMCwgMHgxMTNjOCwgMHgxODllNiwgMHgxMzdjOCwgMHgxOWJlNiwgMHgxMzdjNCwgMHgxMTNjMiwgMHgxMzdjMiwKKyAgICAgMHgxMTNlYywgMHgxMzdlYywgMHgxMTNlNiwgMHgxMzdlNiwgMHgxZmJhOCwgMHgxNzVmMCwgMHgxYmFmYywgMHgxZmJhNCwKKyAgICAgMHgxNzRmOCwgMHgxYmE3ZSwgMHgxZmJhMiwgMHgxNzQ3YywgMHgxNzQzZSwgMHgxZjMyOCwgMHgxZjk5NiwgMHgxMzJmYywKKyAgICAgMHgxZjc2OCwgMHgxZmJiNiwgMHgxNzZmYywgMHgxMzI3ZSwgMHgxZjc2NCwgMHgxZjMyMiwgMHgxNzY3ZSwgMHgxZjc2MiwKKyAgICAgMHgxZTIyOCwgMHgxZjExNiwgMHgxZTY2OCwgMHgxZTIyNCwgMHgxZWVlOCwgMHgxZjc3NiwgMHgxZTIyMiwgMHgxZWVlNCwKKyAgICAgMHgxZTY2MiwgMHgxZWVlMiwgMHgxYzQ2OCwgMHgxZTIzNiwgMHgxY2NlOCwgMHgxYzQ2NCwgMHgxZGRlOCwgMHgxY2NlNCwKKyAgICAgMHgxYzQ2MiwgMHgxZGRlNCwgMHgxY2NlMiwgMHgxZGRlMiwgMHgxODhlOCwgMHgxYzQ3NiwgMHgxOTllOCwgMHgxODhlNCwKKyAgICAgMHgxYmJlOCwgMHgxOTllNCwgMHgxODhlMiwgMHgxYmJlNCwgMHgxOTllMiwgMHgxYmJlMiwgMHgxMTFlOCwgMHgxODhmNiwKKyAgICAgMHgxMzNlOCwgMHgxMTFlNCwgMHgxNzdlOCwgMHgxMzNlNCwgMHgxMTFlMiwgMHgxNzdlNCwgMHgxMzNlMiwgMHgxNzdlMiwKKyAgICAgMHgxMTFmNiwgMHgxMzNmNiwgMHgxZmI5NCwgMHgxNzJmOCwgMHgxYjk3ZSwgMHgxZmI5MiwgMHgxNzI3YywgMHgxNzIzZSwKKyAgICAgMHgxZjMxNCwgMHgxMzE3ZSwgMHgxZjczNCwgMHgxZjMxMiwgMHgxNzM3ZSwgMHgxZjczMiwgMHgxZTIxNCwgMHgxZTYzNCwKKyAgICAgMHgxZTIxMiwgMHgxZWU3NCwgMHgxZTYzMiwgMHgxZWU3MiwgMHgxYzQzNCwgMHgxY2M3NCwgMHgxYzQzMiwgMHgxZGNmNCwKKyAgICAgMHgxY2M3MiwgMHgxZGNmMiwgMHgxODg3NCwgMHgxOThmNCwgMHgxODg3MiwgMHgxYjlmNCwgMHgxOThmMiwgMHgxYjlmMiwKKyAgICAgMHgxMTBmNCwgMHgxMzFmNCwgMHgxMTBmMiwgMHgxNzNmNCwgMHgxMzFmMiwgMHgxNzNmMiwgMHgxZmI4YSwgMHgxNzE3YywKKyAgICAgMHgxNzEzZSwgMHgxZjMwYSwgMHgxZjcxYSwgMHgxZTIwYSwgMHgxZTYxYSwgMHgxZWUzYSwgMHgxYzQxYSwgMHgxY2MzYSwKKyAgICAgMHgxZGM3YSwgMHgxODgzYSwgMHgxOTg3YSwgMHgxYjhmYSwgMHgxMTA3YSwgMHgxMzBmYSwgMHgxNzFmYSwgMHgxNzBiZSwKKyAgICAgMHgxZTE1MCwgMHgxZjBhYywgMHgxZTE0OCwgMHgxZjBhNiwgMHgxZTE0NCwgMHgxZTE0MiwgMHgxYzJkMCwgMHgxZTE2YywKKyAgICAgMHgxYzJjOCwgMHgxZTE2NiwgMHgxYzJjNCwgMHgxYzJjMiwgMHgxODVkMCwgMHgxYzJlYywgMHgxODVjOCwgMHgxYzJlNiwKKyAgICAgMHgxODVjNCwgMHgxODVjMiwgMHgxMGJkMCwgMHgxODVlYywgMHgxMGJjOCwgMHgxODVlNiwgMHgxMGJjNCwgMHgxMGJjMiwKKyAgICAgMHgxMGJlYywgMHgxMGJlNiwgMHgxZjFhOCwgMHgxZjhkNiwgMHgxMWFmYywgMHgxZjFhNCwgMHgxMWE3ZSwgMHgxZjFhMiwKKyAgICAgMHgxZTEyOCwgMHgxZjA5NiwgMHgxZTM2OCwgMHgxZTEyNCwgMHgxZTM2NCwgMHgxZTEyMiwgMHgxZTM2MiwgMHgxYzI2OCwKKyAgICAgMHgxZTEzNiwgMHgxYzZlOCwgMHgxYzI2NCwgMHgxYzZlNCwgMHgxYzI2MiwgMHgxYzZlMiwgMHgxODRlOCwgMHgxYzI3NiwKKyAgICAgMHgxOGRlOCwgMHgxODRlNCwgMHgxOGRlNCwgMHgxODRlMiwgMHgxOGRlMiwgMHgxMDllOCwgMHgxODRmNiwgMHgxMWJlOCwKKyAgICAgMHgxMDllNCwgMHgxMWJlNCwgMHgxMDllMiwgMHgxMWJlMiwgMHgxMDlmNiwgMHgxMWJmNiwgMHgxZjlkNCwgMHgxM2FmOCwKKyAgICAgMHgxOWQ3ZSwgMHgxZjlkMiwgMHgxM2E3YywgMHgxM2EzZSwgMHgxZjE5NCwgMHgxMTk3ZSwgMHgxZjNiNCwgMHgxZjE5MiwKKyAgICAgMHgxM2I3ZSwgMHgxZjNiMiwgMHgxZTExNCwgMHgxZTMzNCwgMHgxZTExMiwgMHgxZTc3NCwgMHgxZTMzMiwgMHgxZTc3MiwKKyAgICAgMHgxYzIzNCwgMHgxYzY3NCwgMHgxYzIzMiwgMHgxY2VmNCwgMHgxYzY3MiwgMHgxY2VmMiwgMHgxODQ3NCwgMHgxOGNmNCwKKyAgICAgMHgxODQ3MiwgMHgxOWRmNCwgMHgxOGNmMiwgMHgxOWRmMiwgMHgxMDhmNCwgMHgxMTlmNCwgMHgxMDhmMiwgMHgxM2JmNCwKKyAgICAgMHgxMTlmMiwgMHgxM2JmMiwgMHgxN2FmMCwgMHgxYmQ3YywgMHgxN2E3OCwgMHgxYmQzZSwgMHgxN2EzYywgMHgxN2ExZSwKKyAgICAgMHgxZjljYSwgMHgxMzk3YywgMHgxZmJkYSwgMHgxN2I3YywgMHgxMzkzZSwgMHgxN2IzZSwgMHgxZjE4YSwgMHgxZjM5YSwKKyAgICAgMHgxZjdiYSwgMHgxZTEwYSwgMHgxZTMxYSwgMHgxZTczYSwgMHgxZWY3YSwgMHgxYzIxYSwgMHgxYzYzYSwgMHgxY2U3YSwKKyAgICAgMHgxZGVmYSwgMHgxODQzYSwgMHgxOGM3YSwgMHgxOWNmYSwgMHgxYmRmYSwgMHgxMDg3YSwgMHgxMThmYSwgMHgxMzlmYSwKKyAgICAgMHgxNzk3OCwgMHgxYmNiZSwgMHgxNzkzYywgMHgxNzkxZSwgMHgxMzhiZSwgMHgxNzliZSwgMHgxNzhiYywgMHgxNzg5ZSwKKyAgICAgMHgxNzg1ZSwgMHgxZTBhOCwgMHgxZTBhNCwgMHgxZTBhMiwgMHgxYzE2OCwgMHgxZTBiNiwgMHgxYzE2NCwgMHgxYzE2MiwKKyAgICAgMHgxODJlOCwgMHgxYzE3NiwgMHgxODJlNCwgMHgxODJlMiwgMHgxMDVlOCwgMHgxODJmNiwgMHgxMDVlNCwgMHgxMDVlMiwKKyAgICAgMHgxMDVmNiwgMHgxZjBkNCwgMHgxMGQ3ZSwgMHgxZjBkMiwgMHgxZTA5NCwgMHgxZTFiNCwgMHgxZTA5MiwgMHgxZTFiMiwKKyAgICAgMHgxYzEzNCwgMHgxYzM3NCwgMHgxYzEzMiwgMHgxYzM3MiwgMHgxODI3NCwgMHgxODZmNCwgMHgxODI3MiwgMHgxODZmMiwKKyAgICAgMHgxMDRmNCwgMHgxMGRmNCwgMHgxMDRmMiwgMHgxMGRmMiwgMHgxZjhlYSwgMHgxMWQ3YywgMHgxMWQzZSwgMHgxZjBjYSwKKyAgICAgMHgxZjFkYSwgMHgxZTA4YSwgMHgxZTE5YSwgMHgxZTNiYSwgMHgxYzExYSwgMHgxYzMzYSwgMHgxYzc3YSwgMHgxODIzYSwKKyAgICAgMHgxODY3YSwgMHgxOGVmYSwgMHgxMDQ3YSwgMHgxMGNmYSwgMHgxMWRmYSwgMHgxM2Q3OCwgMHgxOWViZSwgMHgxM2QzYywKKyAgICAgMHgxM2QxZSwgMHgxMWNiZSwgMHgxM2RiZSwgMHgxN2Q3MCwgMHgxYmViYywgMHgxN2QzOCwgMHgxYmU5ZSwgMHgxN2QxYywKKyAgICAgMHgxN2QwZSwgMHgxM2NiYywgMHgxN2RiYywgMHgxM2M5ZSwgMHgxN2Q5ZSwgMHgxN2NiOCwgMHgxYmU1ZSwgMHgxN2M5YywKKyAgICAgMHgxN2M4ZSwgMHgxM2M1ZSwgMHgxN2NkZSwgMHgxN2M1YywgMHgxN2M0ZSwgMHgxN2MyZSwgMHgxYzBiNCwgMHgxYzBiMiwKKyAgICAgMHgxODE3NCwgMHgxODE3MiwgMHgxMDJmNCwgMHgxMDJmMiwgMHgxZTBkYSwgMHgxYzA5YSwgMHgxYzFiYSwgMHgxODEzYSwKKyAgICAgMHgxODM3YSwgMHgxMDI3YSwgMHgxMDZmYSwgMHgxMGViZSwgMHgxMWViYywgMHgxMWU5ZSwgMHgxM2ViOCwgMHgxOWY1ZSwKKyAgICAgMHgxM2U5YywgMHgxM2U4ZSwgMHgxMWU1ZSwgMHgxM2VkZSwgMHgxN2ViMCwgMHgxYmY1YywgMHgxN2U5OCwgMHgxYmY0ZSwKKyAgICAgMHgxN2U4YywgMHgxN2U4NiwgMHgxM2U1YywgMHgxN2VkYywgMHgxM2U0ZSwgMHgxN2VjZSwgMHgxN2U1OCwgMHgxYmYyZSwKKyAgICAgMHgxN2U0YywgMHgxN2U0NiwgMHgxM2UyZSwgMHgxN2U2ZSwgMHgxN2UyYywgMHgxN2UyNiwgMHgxMGY1ZSwgMHgxMWY1YywKKyAgICAgMHgxMWY0ZSwgMHgxM2Y1OCwgMHgxOWZhZSwgMHgxM2Y0YywgMHgxM2Y0NiwgMHgxMWYyZSwgMHgxM2Y2ZSwgMHgxM2YyYywKKyAgICAgMHgxM2YyNn0sCisgICAgezB4MWFiZTAsIDB4MWQ1ZjgsIDB4MTUzYzAsIDB4MWE5ZjAsIDB4MWQ0ZmMsIDB4MTUxZTAsIDB4MWE4ZjgsIDB4MWQ0N2UsCisgICAgIDB4MTUwZjAsIDB4MWE4N2MsIDB4MTUwNzgsIDB4MWZhZDAsIDB4MTViZTAsIDB4MWFkZjgsIDB4MWZhYzgsIDB4MTU5ZjAsCisgICAgIDB4MWFjZmMsIDB4MWZhYzQsIDB4MTU4ZjgsIDB4MWFjN2UsIDB4MWZhYzIsIDB4MTU4N2MsIDB4MWY1ZDAsIDB4MWZhZWMsCisgICAgIDB4MTVkZjgsIDB4MWY1YzgsIDB4MWZhZTYsIDB4MTVjZmMsIDB4MWY1YzQsIDB4MTVjN2UsIDB4MWY1YzIsIDB4MWViZDAsCisgICAgIDB4MWY1ZWMsIDB4MWViYzgsIDB4MWY1ZTYsIDB4MWViYzQsIDB4MWViYzIsIDB4MWQ3ZDAsIDB4MWViZWMsIDB4MWQ3YzgsCisgICAgIDB4MWViZTYsIDB4MWQ3YzQsIDB4MWQ3YzIsIDB4MWFmZDAsIDB4MWQ3ZWMsIDB4MWFmYzgsIDB4MWQ3ZTYsIDB4MWFmYzQsCisgICAgIDB4MTRiYzAsIDB4MWE1ZjAsIDB4MWQyZmMsIDB4MTQ5ZTAsIDB4MWE0ZjgsIDB4MWQyN2UsIDB4MTQ4ZjAsIDB4MWE0N2MsCisgICAgIDB4MTQ4NzgsIDB4MWE0M2UsIDB4MTQ4M2MsIDB4MWZhNjgsIDB4MTRkZjAsIDB4MWE2ZmMsIDB4MWZhNjQsIDB4MTRjZjgsCisgICAgIDB4MWE2N2UsIDB4MWZhNjIsIDB4MTRjN2MsIDB4MTRjM2UsIDB4MWY0ZTgsIDB4MWZhNzYsIDB4MTRlZmMsIDB4MWY0ZTQsCisgICAgIDB4MTRlN2UsIDB4MWY0ZTIsIDB4MWU5ZTgsIDB4MWY0ZjYsIDB4MWU5ZTQsIDB4MWU5ZTIsIDB4MWQzZTgsIDB4MWU5ZjYsCisgICAgIDB4MWQzZTQsIDB4MWQzZTIsIDB4MWE3ZTgsIDB4MWQzZjYsIDB4MWE3ZTQsIDB4MWE3ZTIsIDB4MTQ1ZTAsIDB4MWEyZjgsCisgICAgIDB4MWQxN2UsIDB4MTQ0ZjAsIDB4MWEyN2MsIDB4MTQ0NzgsIDB4MWEyM2UsIDB4MTQ0M2MsIDB4MTQ0MWUsIDB4MWZhMzQsCisgICAgIDB4MTQ2ZjgsIDB4MWEzN2UsIDB4MWZhMzIsIDB4MTQ2N2MsIDB4MTQ2M2UsIDB4MWY0NzQsIDB4MTQ3N2UsIDB4MWY0NzIsCisgICAgIDB4MWU4ZjQsIDB4MWU4ZjIsIDB4MWQxZjQsIDB4MWQxZjIsIDB4MWEzZjQsIDB4MWEzZjIsIDB4MTQyZjAsIDB4MWExN2MsCisgICAgIDB4MTQyNzgsIDB4MWExM2UsIDB4MTQyM2MsIDB4MTQyMWUsIDB4MWZhMWEsIDB4MTQzN2MsIDB4MTQzM2UsIDB4MWY0M2EsCisgICAgIDB4MWU4N2EsIDB4MWQwZmEsIDB4MTQxNzgsIDB4MWEwYmUsIDB4MTQxM2MsIDB4MTQxMWUsIDB4MTQxYmUsIDB4MTQwYmMsCisgICAgIDB4MTQwOWUsIDB4MTJiYzAsIDB4MTk1ZjAsIDB4MWNhZmMsIDB4MTI5ZTAsIDB4MTk0ZjgsIDB4MWNhN2UsIDB4MTI4ZjAsCisgICAgIDB4MTk0N2MsIDB4MTI4NzgsIDB4MTk0M2UsIDB4MTI4M2MsIDB4MWY5NjgsIDB4MTJkZjAsIDB4MTk2ZmMsIDB4MWY5NjQsCisgICAgIDB4MTJjZjgsIDB4MTk2N2UsIDB4MWY5NjIsIDB4MTJjN2MsIDB4MTJjM2UsIDB4MWYyZTgsIDB4MWY5NzYsIDB4MTJlZmMsCisgICAgIDB4MWYyZTQsIDB4MTJlN2UsIDB4MWYyZTIsIDB4MWU1ZTgsIDB4MWYyZjYsIDB4MWU1ZTQsIDB4MWU1ZTIsIDB4MWNiZTgsCisgICAgIDB4MWU1ZjYsIDB4MWNiZTQsIDB4MWNiZTIsIDB4MTk3ZTgsIDB4MWNiZjYsIDB4MTk3ZTQsIDB4MTk3ZTIsIDB4MWI1ZTAsCisgICAgIDB4MWRhZjgsIDB4MWVkN2UsIDB4MTY5YzAsIDB4MWI0ZjAsIDB4MWRhN2MsIDB4MTY4ZTAsIDB4MWI0NzgsIDB4MWRhM2UsCisgICAgIDB4MTY4NzAsIDB4MWI0M2MsIDB4MTY4MzgsIDB4MWI0MWUsIDB4MTY4MWMsIDB4MTI1ZTAsIDB4MTkyZjgsIDB4MWM5N2UsCisgICAgIDB4MTZkZTAsIDB4MTI0ZjAsIDB4MTkyN2MsIDB4MTZjZjAsIDB4MWI2N2MsIDB4MTkyM2UsIDB4MTZjNzgsIDB4MTI0M2MsCisgICAgIDB4MTZjM2MsIDB4MTI0MWUsIDB4MTZjMWUsIDB4MWY5MzQsIDB4MTI2ZjgsIDB4MTkzN2UsIDB4MWZiNzQsIDB4MWY5MzIsCisgICAgIDB4MTZlZjgsIDB4MTI2N2MsIDB4MWZiNzIsIDB4MTZlN2MsIDB4MTI2M2UsIDB4MTZlM2UsIDB4MWYyNzQsIDB4MTI3N2UsCisgICAgIDB4MWY2ZjQsIDB4MWYyNzIsIDB4MTZmN2UsIDB4MWY2ZjIsIDB4MWU0ZjQsIDB4MWVkZjQsIDB4MWU0ZjIsIDB4MWVkZjIsCisgICAgIDB4MWM5ZjQsIDB4MWRiZjQsIDB4MWM5ZjIsIDB4MWRiZjIsIDB4MTkzZjQsIDB4MTkzZjIsIDB4MTY1YzAsIDB4MWIyZjAsCisgICAgIDB4MWQ5N2MsIDB4MTY0ZTAsIDB4MWIyNzgsIDB4MWQ5M2UsIDB4MTY0NzAsIDB4MWIyM2MsIDB4MTY0MzgsIDB4MWIyMWUsCisgICAgIDB4MTY0MWMsIDB4MTY0MGUsIDB4MTIyZjAsIDB4MTkxN2MsIDB4MTY2ZjAsIDB4MTIyNzgsIDB4MTkxM2UsIDB4MTY2NzgsCisgICAgIDB4MWIzM2UsIDB4MTY2M2MsIDB4MTIyMWUsIDB4MTY2MWUsIDB4MWY5MWEsIDB4MTIzN2MsIDB4MWZiM2EsIDB4MTY3N2MsCisgICAgIDB4MTIzM2UsIDB4MTY3M2UsIDB4MWYyM2EsIDB4MWY2N2EsIDB4MWU0N2EsIDB4MWVjZmEsIDB4MWM4ZmEsIDB4MWQ5ZmEsCisgICAgIDB4MTkxZmEsIDB4MTYyZTAsIDB4MWIxNzgsIDB4MWQ4YmUsIDB4MTYyNzAsIDB4MWIxM2MsIDB4MTYyMzgsIDB4MWIxMWUsCisgICAgIDB4MTYyMWMsIDB4MTYyMGUsIDB4MTIxNzgsIDB4MTkwYmUsIDB4MTYzNzgsIDB4MTIxM2MsIDB4MTYzM2MsIDB4MTIxMWUsCisgICAgIDB4MTYzMWUsIDB4MTIxYmUsIDB4MTYzYmUsIDB4MTYxNzAsIDB4MWIwYmMsIDB4MTYxMzgsIDB4MWIwOWUsIDB4MTYxMWMsCisgICAgIDB4MTYxMGUsIDB4MTIwYmMsIDB4MTYxYmMsIDB4MTIwOWUsIDB4MTYxOWUsIDB4MTYwYjgsIDB4MWIwNWUsIDB4MTYwOWMsCisgICAgIDB4MTYwOGUsIDB4MTIwNWUsIDB4MTYwZGUsIDB4MTYwNWMsIDB4MTYwNGUsIDB4MTE1ZTAsIDB4MThhZjgsIDB4MWM1N2UsCisgICAgIDB4MTE0ZjAsIDB4MThhN2MsIDB4MTE0NzgsIDB4MThhM2UsIDB4MTE0M2MsIDB4MTE0MWUsIDB4MWY4YjQsIDB4MTE2ZjgsCisgICAgIDB4MThiN2UsIDB4MWY4YjIsIDB4MTE2N2MsIDB4MTE2M2UsIDB4MWYxNzQsIDB4MTE3N2UsIDB4MWYxNzIsIDB4MWUyZjQsCisgICAgIDB4MWUyZjIsIDB4MWM1ZjQsIDB4MWM1ZjIsIDB4MThiZjQsIDB4MThiZjIsIDB4MTM1YzAsIDB4MTlhZjAsIDB4MWNkN2MsCisgICAgIDB4MTM0ZTAsIDB4MTlhNzgsIDB4MWNkM2UsIDB4MTM0NzAsIDB4MTlhM2MsIDB4MTM0MzgsIDB4MTlhMWUsIDB4MTM0MWMsCisgICAgIDB4MTM0MGUsIDB4MTEyZjAsIDB4MTg5N2MsIDB4MTM2ZjAsIDB4MTEyNzgsIDB4MTg5M2UsIDB4MTM2NzgsIDB4MTliM2UsCisgICAgIDB4MTM2M2MsIDB4MTEyMWUsIDB4MTM2MWUsIDB4MWY4OWEsIDB4MTEzN2MsIDB4MWY5YmEsIDB4MTM3N2MsIDB4MTEzM2UsCisgICAgIDB4MTM3M2UsIDB4MWYxM2EsIDB4MWYzN2EsIDB4MWUyN2EsIDB4MWU2ZmEsIDB4MWM0ZmEsIDB4MWNkZmEsIDB4MTg5ZmEsCisgICAgIDB4MWJhZTAsIDB4MWRkNzgsIDB4MWVlYmUsIDB4MTc0YzAsIDB4MWJhNzAsIDB4MWRkM2MsIDB4MTc0NjAsIDB4MWJhMzgsCisgICAgIDB4MWRkMWUsIDB4MTc0MzAsIDB4MWJhMWMsIDB4MTc0MTgsIDB4MWJhMGUsIDB4MTc0MGMsIDB4MTMyZTAsIDB4MTk5NzgsCisgICAgIDB4MWNjYmUsIDB4MTc2ZTAsIDB4MTMyNzAsIDB4MTk5M2MsIDB4MTc2NzAsIDB4MWJiM2MsIDB4MTk5MWUsIDB4MTc2MzgsCisgICAgIDB4MTMyMWMsIDB4MTc2MWMsIDB4MTMyMGUsIDB4MTc2MGUsIDB4MTExNzgsIDB4MTg4YmUsIDB4MTMzNzgsIDB4MTExM2MsCisgICAgIDB4MTc3NzgsIDB4MTMzM2MsIDB4MTExMWUsIDB4MTc3M2MsIDB4MTMzMWUsIDB4MTc3MWUsIDB4MTExYmUsIDB4MTMzYmUsCisgICAgIDB4MTc3YmUsIDB4MTcyYzAsIDB4MWI5NzAsIDB4MWRjYmMsIDB4MTcyNjAsIDB4MWI5MzgsIDB4MWRjOWUsIDB4MTcyMzAsCisgICAgIDB4MWI5MWMsIDB4MTcyMTgsIDB4MWI5MGUsIDB4MTcyMGMsIDB4MTcyMDYsIDB4MTMxNzAsIDB4MTk4YmMsIDB4MTczNzAsCisgICAgIDB4MTMxMzgsIDB4MTk4OWUsIDB4MTczMzgsIDB4MWI5OWUsIDB4MTczMWMsIDB4MTMxMGUsIDB4MTczMGUsIDB4MTEwYmMsCisgICAgIDB4MTMxYmMsIDB4MTEwOWUsIDB4MTczYmMsIDB4MTMxOWUsIDB4MTczOWUsIDB4MTcxNjAsIDB4MWI4YjgsIDB4MWRjNWUsCisgICAgIDB4MTcxMzAsIDB4MWI4OWMsIDB4MTcxMTgsIDB4MWI4OGUsIDB4MTcxMGMsIDB4MTcxMDYsIDB4MTMwYjgsIDB4MTk4NWUsCisgICAgIDB4MTcxYjgsIDB4MTMwOWMsIDB4MTcxOWMsIDB4MTMwOGUsIDB4MTcxOGUsIDB4MTEwNWUsIDB4MTMwZGUsIDB4MTcxZGUsCisgICAgIDB4MTcwYjAsIDB4MWI4NWMsIDB4MTcwOTgsIDB4MWI4NGUsIDB4MTcwOGMsIDB4MTcwODYsIDB4MTMwNWMsIDB4MTcwZGMsCisgICAgIDB4MTMwNGUsIDB4MTcwY2UsIDB4MTcwNTgsIDB4MWI4MmUsIDB4MTcwNGMsIDB4MTcwNDYsIDB4MTMwMmUsIDB4MTcwNmUsCisgICAgIDB4MTcwMmMsIDB4MTcwMjYsIDB4MTBhZjAsIDB4MTg1N2MsIDB4MTBhNzgsIDB4MTg1M2UsIDB4MTBhM2MsIDB4MTBhMWUsCisgICAgIDB4MTBiN2MsIDB4MTBiM2UsIDB4MWYwYmEsIDB4MWUxN2EsIDB4MWMyZmEsIDB4MTg1ZmEsIDB4MTFhZTAsIDB4MThkNzgsCisgICAgIDB4MWM2YmUsIDB4MTFhNzAsIDB4MThkM2MsIDB4MTFhMzgsIDB4MThkMWUsIDB4MTFhMWMsIDB4MTFhMGUsIDB4MTA5NzgsCisgICAgIDB4MTg0YmUsIDB4MTFiNzgsIDB4MTA5M2MsIDB4MTFiM2MsIDB4MTA5MWUsIDB4MTFiMWUsIDB4MTA5YmUsIDB4MTFiYmUsCisgICAgIDB4MTNhYzAsIDB4MTlkNzAsIDB4MWNlYmMsIDB4MTNhNjAsIDB4MTlkMzgsIDB4MWNlOWUsIDB4MTNhMzAsIDB4MTlkMWMsCisgICAgIDB4MTNhMTgsIDB4MTlkMGUsIDB4MTNhMGMsIDB4MTNhMDYsIDB4MTE5NzAsIDB4MThjYmMsIDB4MTNiNzAsIDB4MTE5MzgsCisgICAgIDB4MThjOWUsIDB4MTNiMzgsIDB4MTE5MWMsIDB4MTNiMWMsIDB4MTE5MGUsIDB4MTNiMGUsIDB4MTA4YmMsIDB4MTE5YmMsCisgICAgIDB4MTA4OWUsIDB4MTNiYmMsIDB4MTE5OWUsIDB4MTNiOWUsIDB4MWJkNjAsIDB4MWRlYjgsIDB4MWVmNWUsIDB4MTdhNDAsCisgICAgIDB4MWJkMzAsIDB4MWRlOWMsIDB4MTdhMjAsIDB4MWJkMTgsIDB4MWRlOGUsIDB4MTdhMTAsIDB4MWJkMGMsIDB4MTdhMDgsCisgICAgIDB4MWJkMDYsIDB4MTdhMDQsIDB4MTM5NjAsIDB4MTljYjgsIDB4MWNlNWUsIDB4MTdiNjAsIDB4MTM5MzAsIDB4MTljOWMsCisgICAgIDB4MTdiMzAsIDB4MWJkOWMsIDB4MTljOGUsIDB4MTdiMTgsIDB4MTM5MGMsIDB4MTdiMGMsIDB4MTM5MDYsIDB4MTdiMDYsCisgICAgIDB4MTE4YjgsIDB4MThjNWUsIDB4MTM5YjgsIDB4MTE4OWMsIDB4MTdiYjgsIDB4MTM5OWMsIDB4MTE4OGUsIDB4MTdiOWMsCisgICAgIDB4MTM5OGUsIDB4MTdiOGUsIDB4MTA4NWUsIDB4MTE4ZGUsIDB4MTM5ZGUsIDB4MTdiZGUsIDB4MTc5NDAsIDB4MWJjYjAsCisgICAgIDB4MWRlNWMsIDB4MTc5MjAsIDB4MWJjOTgsIDB4MWRlNGUsIDB4MTc5MTAsIDB4MWJjOGMsIDB4MTc5MDgsIDB4MWJjODYsCisgICAgIDB4MTc5MDQsIDB4MTc5MDIsIDB4MTM4YjAsIDB4MTljNWMsIDB4MTc5YjAsIDB4MTM4OTgsIDB4MTljNGUsIDB4MTc5OTgsCisgICAgIDB4MWJjY2UsIDB4MTc5OGMsIDB4MTM4ODYsIDB4MTc5ODYsIDB4MTE4NWMsIDB4MTM4ZGMsIDB4MTE4NGUsIDB4MTc5ZGMsCisgICAgIDB4MTM4Y2UsIDB4MTc5Y2UsIDB4MTc4YTAsIDB4MWJjNTgsIDB4MWRlMmUsIDB4MTc4OTAsIDB4MWJjNGMsIDB4MTc4ODgsCisgICAgIDB4MWJjNDYsIDB4MTc4ODQsIDB4MTc4ODIsIDB4MTM4NTgsIDB4MTljMmUsIDB4MTc4ZDgsIDB4MTM4NGMsIDB4MTc4Y2MsCisgICAgIDB4MTM4NDYsIDB4MTc4YzYsIDB4MTE4MmUsIDB4MTM4NmUsIDB4MTc4ZWUsIDB4MTc4NTAsIDB4MWJjMmMsIDB4MTc4NDgsCisgICAgIDB4MWJjMjYsIDB4MTc4NDQsIDB4MTc4NDIsIDB4MTM4MmMsIDB4MTc4NmMsIDB4MTM4MjYsIDB4MTc4NjYsIDB4MTc4MjgsCisgICAgIDB4MWJjMTYsIDB4MTc4MjQsIDB4MTc4MjIsIDB4MTM4MTYsIDB4MTc4MzYsIDB4MTA1NzgsIDB4MTgyYmUsIDB4MTA1M2MsCisgICAgIDB4MTA1MWUsIDB4MTA1YmUsIDB4MTBkNzAsIDB4MTg2YmMsIDB4MTBkMzgsIDB4MTg2OWUsIDB4MTBkMWMsIDB4MTBkMGUsCisgICAgIDB4MTA0YmMsIDB4MTBkYmMsIDB4MTA0OWUsIDB4MTBkOWUsIDB4MTFkNjAsIDB4MThlYjgsIDB4MWM3NWUsIDB4MTFkMzAsCisgICAgIDB4MThlOWMsIDB4MTFkMTgsIDB4MThlOGUsIDB4MTFkMGMsIDB4MTFkMDYsIDB4MTBjYjgsIDB4MTg2NWUsIDB4MTFkYjgsCisgICAgIDB4MTBjOWMsIDB4MTFkOWMsIDB4MTBjOGUsIDB4MTFkOGUsIDB4MTA0NWUsIDB4MTBjZGUsIDB4MTFkZGUsIDB4MTNkNDAsCisgICAgIDB4MTllYjAsIDB4MWNmNWMsIDB4MTNkMjAsIDB4MTllOTgsIDB4MWNmNGUsIDB4MTNkMTAsIDB4MTllOGMsIDB4MTNkMDgsCisgICAgIDB4MTllODYsIDB4MTNkMDQsIDB4MTNkMDIsIDB4MTFjYjAsIDB4MThlNWMsIDB4MTNkYjAsIDB4MTFjOTgsIDB4MThlNGUsCisgICAgIDB4MTNkOTgsIDB4MTllY2UsIDB4MTNkOGMsIDB4MTFjODYsIDB4MTNkODYsIDB4MTBjNWMsIDB4MTFjZGMsIDB4MTBjNGUsCisgICAgIDB4MTNkZGMsIDB4MTFjY2UsIDB4MTNkY2UsIDB4MWJlYTAsIDB4MWRmNTgsIDB4MWVmYWUsIDB4MWJlOTAsIDB4MWRmNGMsCisgICAgIDB4MWJlODgsIDB4MWRmNDYsIDB4MWJlODQsIDB4MWJlODIsIDB4MTNjYTAsIDB4MTllNTgsIDB4MWNmMmUsIDB4MTdkYTAsCisgICAgIDB4MTNjOTAsIDB4MTllNGMsIDB4MTdkOTAsIDB4MWJlY2MsIDB4MTllNDYsIDB4MTdkODgsIDB4MTNjODQsIDB4MTdkODQsCisgICAgIDB4MTNjODIsIDB4MTdkODIsIDB4MTFjNTgsIDB4MThlMmUsIDB4MTNjZDgsIDB4MTFjNGMsIDB4MTdkZDgsIDB4MTNjY2MsCisgICAgIDB4MTFjNDYsIDB4MTdkY2MsIDB4MTNjYzYsIDB4MTdkYzYsIDB4MTBjMmUsIDB4MTFjNmUsIDB4MTNjZWUsIDB4MTdkZWUsCisgICAgIDB4MWJlNTAsIDB4MWRmMmMsIDB4MWJlNDgsIDB4MWRmMjYsIDB4MWJlNDQsIDB4MWJlNDIsIDB4MTNjNTAsIDB4MTllMmMsCisgICAgIDB4MTdjZDAsIDB4MTNjNDgsIDB4MTllMjYsIDB4MTdjYzgsIDB4MWJlNjYsIDB4MTdjYzQsIDB4MTNjNDIsIDB4MTdjYzIsCisgICAgIDB4MTFjMmMsIDB4MTNjNmMsIDB4MTFjMjYsIDB4MTdjZWMsIDB4MTNjNjYsIDB4MTdjZTYsIDB4MWJlMjgsIDB4MWRmMTYsCisgICAgIDB4MWJlMjQsIDB4MWJlMjIsIDB4MTNjMjgsIDB4MTllMTYsIDB4MTdjNjgsIDB4MTNjMjQsIDB4MTdjNjQsIDB4MTNjMjIsCisgICAgIDB4MTdjNjIsIDB4MTFjMTYsIDB4MTNjMzYsIDB4MTdjNzYsIDB4MWJlMTQsIDB4MWJlMTIsIDB4MTNjMTQsIDB4MTdjMzQsCisgICAgIDB4MTNjMTIsIDB4MTdjMzIsIDB4MTAyYmMsIDB4MTAyOWUsIDB4MTA2YjgsIDB4MTgzNWUsIDB4MTA2OWMsIDB4MTA2OGUsCisgICAgIDB4MTAyNWUsIDB4MTA2ZGUsIDB4MTBlYjAsIDB4MTg3NWMsIDB4MTBlOTgsIDB4MTg3NGUsIDB4MTBlOGMsIDB4MTBlODYsCisgICAgIDB4MTA2NWMsIDB4MTBlZGMsIDB4MTA2NGUsIDB4MTBlY2UsIDB4MTFlYTAsIDB4MThmNTgsIDB4MWM3YWUsIDB4MTFlOTAsCisgICAgIDB4MThmNGMsIDB4MTFlODgsIDB4MThmNDYsIDB4MTFlODQsIDB4MTFlODIsIDB4MTBlNTgsIDB4MTg3MmUsIDB4MTFlZDgsCisgICAgIDB4MThmNmUsIDB4MTFlY2MsIDB4MTBlNDYsIDB4MTFlYzYsIDB4MTA2MmUsIDB4MTBlNmUsIDB4MTFlZWUsIDB4MTlmNTAsCisgICAgIDB4MWNmYWMsIDB4MTlmNDgsIDB4MWNmYTYsIDB4MTlmNDQsIDB4MTlmNDIsIDB4MTFlNTAsIDB4MThmMmMsIDB4MTNlZDAsCisgICAgIDB4MTlmNmMsIDB4MThmMjYsIDB4MTNlYzgsIDB4MTFlNDQsIDB4MTNlYzQsIDB4MTFlNDIsIDB4MTNlYzIsIDB4MTBlMmMsCisgICAgIDB4MTFlNmMsIDB4MTBlMjYsIDB4MTNlZWMsIDB4MTFlNjYsIDB4MTNlZTYsIDB4MWRmYTgsIDB4MWVmZDYsIDB4MWRmYTQsCisgICAgIDB4MWRmYTIsIDB4MTlmMjgsIDB4MWNmOTYsIDB4MWJmNjgsIDB4MTlmMjQsIDB4MWJmNjQsIDB4MTlmMjIsIDB4MWJmNjIsCisgICAgIDB4MTFlMjgsIDB4MThmMTYsIDB4MTNlNjgsIDB4MTFlMjQsIDB4MTdlZTgsIDB4MTNlNjQsIDB4MTFlMjIsIDB4MTdlZTQsCisgICAgIDB4MTNlNjIsIDB4MTdlZTIsIDB4MTBlMTYsIDB4MTFlMzYsIDB4MTNlNzYsIDB4MTdlZjYsIDB4MWRmOTQsIDB4MWRmOTIsCisgICAgIDB4MTlmMTQsIDB4MWJmMzQsIDB4MTlmMTIsIDB4MWJmMzIsIDB4MTFlMTQsIDB4MTNlMzQsIDB4MTFlMTIsIDB4MTdlNzQsCisgICAgIDB4MTNlMzIsIDB4MTdlNzIsIDB4MWRmOGEsIDB4MTlmMGEsIDB4MWJmMWEsIDB4MTFlMGEsIDB4MTNlMWEsIDB4MTdlM2EsCisgICAgIDB4MTAzNWMsIDB4MTAzNGUsIDB4MTA3NTgsIDB4MTgzYWUsIDB4MTA3NGMsIDB4MTA3NDYsIDB4MTAzMmUsIDB4MTA3NmUsCisgICAgIDB4MTBmNTAsIDB4MTg3YWMsIDB4MTBmNDgsIDB4MTg3YTYsIDB4MTBmNDQsIDB4MTBmNDIsIDB4MTA3MmMsIDB4MTBmNmMsCisgICAgIDB4MTA3MjYsIDB4MTBmNjYsIDB4MThmYTgsIDB4MWM3ZDYsIDB4MThmYTQsIDB4MThmYTIsIDB4MTBmMjgsIDB4MTg3OTYsCisgICAgIDB4MTFmNjgsIDB4MThmYjYsIDB4MTFmNjQsIDB4MTBmMjIsIDB4MTFmNjIsIDB4MTA3MTYsIDB4MTBmMzYsIDB4MTFmNzYsCisgICAgIDB4MWNmZDQsIDB4MWNmZDIsIDB4MThmOTQsIDB4MTlmYjQsIDB4MThmOTIsIDB4MTlmYjIsIDB4MTBmMTQsIDB4MTFmMzQsCisgICAgIDB4MTBmMTIsIDB4MTNmNzQsIDB4MTFmMzIsIDB4MTNmNzIsIDB4MWNmY2EsIDB4MThmOGEsIDB4MTlmOWEsIDB4MTBmMGEsCisgICAgIDB4MTFmMWEsIDB4MTNmM2EsIDB4MTAzYWMsIDB4MTAzYTYsIDB4MTA3YTgsIDB4MTgzZDYsIDB4MTA3YTQsIDB4MTA3YTIsCisgICAgIDB4MTAzOTYsIDB4MTA3YjYsIDB4MTg3ZDQsIDB4MTg3ZDIsIDB4MTA3OTQsIDB4MTBmYjQsIDB4MTA3OTIsIDB4MTBmYjIsCisgICAgIDB4MWM3ZWF9fTsKKworQ0JDX1BERjQxNzo6Q0JDX1BERjQxNygpIDogQ0JDX1BERjQxNyhmYWxzZSkge30KKworQ0JDX1BERjQxNzo6Q0JDX1BERjQxNyhib29sIGNvbXBhY3QpCisgICAgOiBtX2NvbXBhY3QoY29tcGFjdCksCisgICAgICBtX2NvbXBhY3Rpb24oQVVUTyksCisgICAgICBtX21pbkNvbHMoMSksCisgICAgICBtX21heENvbHMoMzApLAorICAgICAgbV9tYXhSb3dzKDkwKSwKKyAgICAgIG1fbWluUm93cygzKSB7fQorCitDQkNfUERGNDE3Ojp+Q0JDX1BERjQxNygpIHt9CisKK0NCQ19CYXJjb2RlTWF0cml4KiBDQkNfUERGNDE3OjpnZXRCYXJjb2RlTWF0cml4KCkgeworICByZXR1cm4gbV9iYXJjb2RlTWF0cml4LmdldCgpOworfQorCitib29sIENCQ19QREY0MTc6OmdlbmVyYXRlQmFyY29kZUxvZ2ljKFdpZGVTdHJpbmcgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVycm9yQ29ycmVjdGlvbkxldmVsKSB7CisgIGludDMyX3QgZXJyb3JDb3JyZWN0aW9uQ29kZVdvcmRzID0KKyAgICAgIENCQ19QREY0MTdFcnJvckNvcnJlY3Rpb246OmdldEVycm9yQ29ycmVjdGlvbkNvZGV3b3JkQ291bnQoCisgICAgICAgICAgZXJyb3JDb3JyZWN0aW9uTGV2ZWwpOworICBpZiAoZXJyb3JDb3JyZWN0aW9uQ29kZVdvcmRzIDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW50MzJfdCBlID0gQkNFeGNlcHRpb25OTzsKKyAgV2lkZVN0cmluZyBoaWdoTGV2ZWwgPQorICAgICAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmVuY29kZUhpZ2hMZXZlbChtc2csIG1fY29tcGFjdGlvbiwgZSk7CisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgcmV0dXJuIGZhbHNlOworICBpbnQzMl90IHNvdXJjZUNvZGVXb3JkcyA9IGhpZ2hMZXZlbC5HZXRMZW5ndGgoKTsKKyAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gZGltZW5zaW9ucyA9CisgICAgICBkZXRlcm1pbmVEaW1lbnNpb25zKHNvdXJjZUNvZGVXb3JkcywgZXJyb3JDb3JyZWN0aW9uQ29kZVdvcmRzKTsKKyAgaWYgKGRpbWVuc2lvbnMuc2l6ZSgpICE9IDIpCisgICAgcmV0dXJuIGZhbHNlOworICBpbnQzMl90IGNvbHMgPSBkaW1lbnNpb25zWzBdOworICBpbnQzMl90IHJvd3MgPSBkaW1lbnNpb25zWzFdOworICBpbnQzMl90IHBhZCA9IGdldE51bWJlck9mUGFkQ29kZXdvcmRzKHNvdXJjZUNvZGVXb3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvcnJlY3Rpb25Db2RlV29yZHMsIGNvbHMsIHJvd3MpOworICBpZiAoc291cmNlQ29kZVdvcmRzICsgZXJyb3JDb3JyZWN0aW9uQ29kZVdvcmRzICsgMSA+IDkyOSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW50MzJfdCBuID0gc291cmNlQ29kZVdvcmRzICsgcGFkICsgMTsKKyAgV2lkZVN0cmluZyBzYjsKKyAgc2IgKz0gKHdjaGFyX3QpbjsKKyAgc2IgKz0gaGlnaExldmVsOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwYWQ7IGkrKykKKyAgICBzYiArPSAod2NoYXJfdCk5MDA7CisKKyAgV2lkZVN0cmluZyBkYXRhQ29kZXdvcmRzKHNiKTsKKyAgV2lkZVN0cmluZyBlYzsKKyAgaWYgKCFDQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uOjpnZW5lcmF0ZUVycm9yQ29ycmVjdGlvbigKKyAgICAgICAgICBkYXRhQ29kZXdvcmRzLCBlcnJvckNvcnJlY3Rpb25MZXZlbCwgJmVjKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBXaWRlU3RyaW5nIGZ1bGxDb2Rld29yZHMgPSBkYXRhQ29kZXdvcmRzICsgZWM7CisgIG1fYmFyY29kZU1hdHJpeCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDQkNfQmFyY29kZU1hdHJpeD4ocm93cywgY29scyk7CisgIGVuY29kZUxvd0xldmVsKGZ1bGxDb2Rld29yZHMsIGNvbHMsIHJvd3MsIGVycm9yQ29ycmVjdGlvbkxldmVsLAorICAgICAgICAgICAgICAgICBtX2JhcmNvZGVNYXRyaXguZ2V0KCkpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDQkNfUERGNDE3OjpzZXREaW1lbnNpb25zKGludDMyX3QgbWF4Q29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1pbkNvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhSb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWluUm93cykgeworICBtX21heENvbHMgPSBtYXhDb2xzOworICBtX21pbkNvbHMgPSBtaW5Db2xzOworICBtX21heFJvd3MgPSBtYXhSb3dzOworICBtX21pblJvd3MgPSBtaW5Sb3dzOworfQorCit2b2lkIENCQ19QREY0MTc6OnNldENvbXBhY3Rpb24oQ29tcGFjdGlvbiBjb21wYWN0aW9uKSB7CisgIG1fY29tcGFjdGlvbiA9IGNvbXBhY3Rpb247Cit9CisKK3ZvaWQgQ0JDX1BERjQxNzo6c2V0Q29tcGFjdChib29sIGNvbXBhY3QpIHsKKyAgbV9jb21wYWN0ID0gY29tcGFjdDsKK30KKworaW50MzJfdCBDQkNfUERGNDE3OjpjYWxjdWxhdGVOdW1iZXJPZlJvd3MoaW50MzJfdCBtLCBpbnQzMl90IGssIGludDMyX3QgYykgeworICBpbnQzMl90IHIgPSAoKG0gKyAxICsgaykgLyBjKSArIDE7CisgIGlmIChjICogciA+PSAobSArIDEgKyBrICsgYykpIHsKKyAgICByLS07CisgIH0KKyAgcmV0dXJuIHI7Cit9CisKK2ludDMyX3QgQ0JDX1BERjQxNzo6Z2V0TnVtYmVyT2ZQYWRDb2Rld29yZHMoaW50MzJfdCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByKSB7CisgIGludDMyX3QgbiA9IGMgKiByIC0gazsKKyAgcmV0dXJuIG4gPiBtICsgMSA/IG4gLSBtIC0gMSA6IDA7Cit9CisKK3ZvaWQgQ0JDX1BERjQxNzo6ZW5jb2RlQ2hhcihpbnQzMl90IHBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0JhcmNvZGVSb3cqIGxvZ2ljKSB7CisgIGludDMyX3QgbWFwID0gMSA8PCAobGVuIC0gMSk7CisgIGJvb2wgbGFzdCA9ICgocGF0dGVybiAmIG1hcCkgIT0gMCk7CisgIGludDMyX3Qgd2lkdGggPSAwOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgeworICAgIGJvb2wgYmxhY2sgPSAoKHBhdHRlcm4gJiBtYXApICE9IDApOworICAgIGlmIChsYXN0ID09IGJsYWNrKSB7CisgICAgICB3aWR0aCsrOworICAgIH0gZWxzZSB7CisgICAgICBsb2dpYy0+YWRkQmFyKGxhc3QsIHdpZHRoKTsKKyAgICAgIGxhc3QgPSBibGFjazsKKyAgICAgIHdpZHRoID0gMTsKKyAgICB9CisgICAgbWFwID4+PSAxOworICB9CisgIGxvZ2ljLT5hZGRCYXIobGFzdCwgd2lkdGgpOworfQorCit2b2lkIENCQ19QREY0MTc6OmVuY29kZUxvd0xldmVsKFdpZGVTdHJpbmcgZnVsbENvZGV3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXJyb3JDb3JyZWN0aW9uTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19CYXJjb2RlTWF0cml4KiBsb2dpYykgeworICBpbnQzMl90IGlkeCA9IDA7CisgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IHI7IHkrKykgeworICAgIGludDMyX3QgY2x1c3RlciA9IHkgJSAzOworICAgIGxvZ2ljLT5zdGFydFJvdygpOworICAgIGVuY29kZUNoYXIoU1RBUlRfUEFUVEVSTiwgMTcsIGxvZ2ljLT5nZXRDdXJyZW50Um93KCkpOworICAgIGludDMyX3QgbGVmdDsKKyAgICBpbnQzMl90IHJpZ2h0OworICAgIGlmIChjbHVzdGVyID09IDApIHsKKyAgICAgIGxlZnQgPSAoMzAgKiAoeSAvIDMpKSArICgociAtIDEpIC8gMyk7CisgICAgICByaWdodCA9ICgzMCAqICh5IC8gMykpICsgKGMgLSAxKTsKKyAgICB9IGVsc2UgaWYgKGNsdXN0ZXIgPT0gMSkgeworICAgICAgbGVmdCA9ICgzMCAqICh5IC8gMykpICsgKGVycm9yQ29ycmVjdGlvbkxldmVsICogMykgKyAoKHIgLSAxKSAlIDMpOworICAgICAgcmlnaHQgPSAoMzAgKiAoeSAvIDMpKSArICgociAtIDEpIC8gMyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGxlZnQgPSAoMzAgKiAoeSAvIDMpKSArIChjIC0gMSk7CisgICAgICByaWdodCA9ICgzMCAqICh5IC8gMykpICsgKGVycm9yQ29ycmVjdGlvbkxldmVsICogMykgKyAoKHIgLSAxKSAlIDMpOworICAgIH0KKyAgICBpbnQzMl90IHBhdHRlcm4gPSBDT0RFV09SRF9UQUJMRVtjbHVzdGVyXVtsZWZ0XTsKKyAgICBlbmNvZGVDaGFyKHBhdHRlcm4sIDE3LCBsb2dpYy0+Z2V0Q3VycmVudFJvdygpKTsKKyAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBjOyB4KyspIHsKKyAgICAgIHBhdHRlcm4gPSBDT0RFV09SRF9UQUJMRVtjbHVzdGVyXVtmdWxsQ29kZXdvcmRzW2lkeF1dOworICAgICAgZW5jb2RlQ2hhcihwYXR0ZXJuLCAxNywgbG9naWMtPmdldEN1cnJlbnRSb3coKSk7CisgICAgICBpZHgrKzsKKyAgICB9CisgICAgaWYgKG1fY29tcGFjdCkgeworICAgICAgZW5jb2RlQ2hhcihTVE9QX1BBVFRFUk4sIDEsIGxvZ2ljLT5nZXRDdXJyZW50Um93KCkpOworICAgIH0gZWxzZSB7CisgICAgICBwYXR0ZXJuID0gQ09ERVdPUkRfVEFCTEVbY2x1c3Rlcl1bcmlnaHRdOworICAgICAgZW5jb2RlQ2hhcihwYXR0ZXJuLCAxNywgbG9naWMtPmdldEN1cnJlbnRSb3coKSk7CisgICAgICBlbmNvZGVDaGFyKFNUT1BfUEFUVEVSTiwgMTgsIGxvZ2ljLT5nZXRDdXJyZW50Um93KCkpOworICAgIH0KKyAgfQorfQorCitzdGQ6OnZlY3RvcjxpbnQzMl90PiBDQkNfUERGNDE3OjpkZXRlcm1pbmVEaW1lbnNpb25zKAorICAgIGludDMyX3Qgc291cmNlQ29kZVdvcmRzLAorICAgIGludDMyX3QgZXJyb3JDb3JyZWN0aW9uQ29kZVdvcmRzKSBjb25zdCB7CisgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGRpbWVuc2lvbnM7CisgIGZsb2F0IHJhdGlvID0gMC4wZjsKKyAgZm9yIChpbnQzMl90IGNvbHMgPSBtX21pbkNvbHM7IGNvbHMgPD0gbV9tYXhDb2xzOyBjb2xzKyspIHsKKyAgICBpbnQzMl90IHJvd3MgPQorICAgICAgICBjYWxjdWxhdGVOdW1iZXJPZlJvd3Moc291cmNlQ29kZVdvcmRzLCBlcnJvckNvcnJlY3Rpb25Db2RlV29yZHMsIGNvbHMpOworICAgIGlmIChyb3dzIDwgbV9taW5Sb3dzKQorICAgICAgYnJlYWs7CisgICAgaWYgKHJvd3MgPiBtX21heFJvd3MpCisgICAgICBjb250aW51ZTsKKyAgICBmbG9hdCBuZXdSYXRpbyA9CisgICAgICAgICgoMTcgKiBjb2xzICsgNjkpICogREVGQVVMVF9NT0RVTEVfV0lEVEgpIC8gKHJvd3MgKiBIRUlHSFQpOworICAgIGlmICghZGltZW5zaW9ucy5lbXB0eSgpICYmCisgICAgICAgIGZhYnNmKG5ld1JhdGlvIC0gUFJFRkVSUkVEX1JBVElPKSA+IGZhYnNmKHJhdGlvIC0gUFJFRkVSUkVEX1JBVElPKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIHJhdGlvID0gbmV3UmF0aW87CisgICAgZGltZW5zaW9ucy5yZXNpemUoMik7CisgICAgZGltZW5zaW9uc1swXSA9IGNvbHM7CisgICAgZGltZW5zaW9uc1sxXSA9IHJvd3M7CisgIH0KKyAgaWYgKGRpbWVuc2lvbnMuZW1wdHkoKSkgeworICAgIGludDMyX3Qgcm93cyA9IGNhbGN1bGF0ZU51bWJlck9mUm93cyhzb3VyY2VDb2RlV29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29ycmVjdGlvbkNvZGVXb3JkcywgbV9taW5Db2xzKTsKKyAgICBpZiAocm93cyA8IG1fbWluUm93cykgeworICAgICAgZGltZW5zaW9ucy5yZXNpemUoMik7CisgICAgICBkaW1lbnNpb25zWzBdID0gbV9taW5Db2xzOworICAgICAgZGltZW5zaW9uc1sxXSA9IG1fbWluUm93czsKKyAgICB9IGVsc2UgaWYgKHJvd3MgPj0gMyAmJiByb3dzIDw9IDkwKSB7CisgICAgICBkaW1lbnNpb25zLnJlc2l6ZSgyKTsKKyAgICAgIGRpbWVuc2lvbnNbMF0gPSBtX21pbkNvbHM7CisgICAgICBkaW1lbnNpb25zWzFdID0gcm93czsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGRpbWVuc2lvbnM7Cit9CmRpZmYgLS1naXQgYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxNy5oIGIvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDE0ZGYwCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTcuaApAQCAtMCwwICsxLDY2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhCQVJDT0RFX1BERjQxN19CQ19QREY0MTdfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX1BERjQxN19CQ19QREY0MTdfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29tcGFjdGlvbi5oIgorCitjbGFzcyBDQkNfQmFyY29kZVJvdzsKK2NsYXNzIENCQ19CYXJjb2RlTWF0cml4OworCitjbGFzcyBDQkNfUERGNDE3IHsKKyBwdWJsaWM6CisgIENCQ19QREY0MTcoKTsKKyAgZXhwbGljaXQgQ0JDX1BERjQxNyhib29sIGNvbXBhY3QpOworICB2aXJ0dWFsIH5DQkNfUERGNDE3KCk7CisKKyAgQ0JDX0JhcmNvZGVNYXRyaXgqIGdldEJhcmNvZGVNYXRyaXgoKTsKKyAgYm9vbCBnZW5lcmF0ZUJhcmNvZGVMb2dpYyhXaWRlU3RyaW5nIG1zZywgaW50MzJfdCBlcnJvckNvcnJlY3Rpb25MZXZlbCk7CisgIHZvaWQgc2V0RGltZW5zaW9ucyhpbnQzMl90IG1heENvbHMsCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1pbkNvbHMsCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1heFJvd3MsCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1pblJvd3MpOworICB2b2lkIHNldENvbXBhY3Rpb24oQ29tcGFjdGlvbiBjb21wYWN0aW9uKTsKKyAgdm9pZCBzZXRDb21wYWN0KGJvb2wgY29tcGFjdCk7CisKKyBwcml2YXRlOgorICBzdGF0aWMgY29uc3QgaW50MzJfdCBTVEFSVF9QQVRURVJOID0gMHgxZmVhODsKKyAgc3RhdGljIGNvbnN0IGludDMyX3QgU1RPUF9QQVRURVJOID0gMHgzZmEyOTsKKyAgc3RhdGljIGNvbnN0IGludDMyX3QgQ09ERVdPUkRfVEFCTEVbXVs5MjldOworICBzdGF0aWMgY29uc3RleHByIGZsb2F0IFBSRUZFUlJFRF9SQVRJTyA9IDMuMGY7CisgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQgREVGQVVMVF9NT0RVTEVfV0lEVEggPSAwLjM1N2Y7CisgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQgSEVJR0hUID0gMi4wZjsKKworICBzdGF0aWMgaW50MzJfdCBjYWxjdWxhdGVOdW1iZXJPZlJvd3MoaW50MzJfdCBtLCBpbnQzMl90IGssIGludDMyX3QgYyk7CisgIHN0YXRpYyBpbnQzMl90IGdldE51bWJlck9mUGFkQ29kZXdvcmRzKGludDMyX3QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgcik7CisgIHN0YXRpYyB2b2lkIGVuY29kZUNoYXIoaW50MzJfdCBwYXR0ZXJuLCBpbnQzMl90IGxlbiwgQ0JDX0JhcmNvZGVSb3cqIGxvZ2ljKTsKKyAgdm9pZCBlbmNvZGVMb3dMZXZlbChXaWRlU3RyaW5nIGZ1bGxDb2Rld29yZHMsCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjLAorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgciwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVycm9yQ29ycmVjdGlvbkxldmVsLAorICAgICAgICAgICAgICAgICAgICAgIENCQ19CYXJjb2RlTWF0cml4KiBsb2dpYyk7CisgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGRldGVybWluZURpbWVuc2lvbnMoCisgICAgICBpbnQzMl90IHNvdXJjZUNvZGVXb3JkcywKKyAgICAgIGludDMyX3QgZXJyb3JDb3JyZWN0aW9uQ29kZVdvcmRzKSBjb25zdDsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0JDX0JhcmNvZGVNYXRyaXg+IG1fYmFyY29kZU1hdHJpeDsKKyAgYm9vbCBtX2NvbXBhY3Q7CisgIENvbXBhY3Rpb24gbV9jb21wYWN0aW9uOworICBpbnQzMl90IG1fbWluQ29sczsKKyAgaW50MzJfdCBtX21heENvbHM7CisgIGludDMyX3QgbV9tYXhSb3dzOworICBpbnQzMl90IG1fbWluUm93czsKK307CisKKyNlbmRpZiAgLy8gRlhCQVJDT0RFX1BERjQxN19CQ19QREY0MTdfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZU1hdHJpeC5jcHAgYi9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNYXRyaXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNDkyYjMKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNYXRyaXguY3BwCkBAIC0wLDAgKzEsNzMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBaWGluZyBhdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNYXRyaXguaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVSb3cuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK0NCQ19CYXJjb2RlTWF0cml4OjpDQkNfQmFyY29kZU1hdHJpeChpbnQzMl90IGhlaWdodCwgaW50MzJfdCB3aWR0aCkgeworICBtX21hdHJpeC5yZXNpemUoaGVpZ2h0ICsgMik7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9tYXRyaXguc2l6ZSgpOyArK2kpCisgICAgbV9tYXRyaXhbaV0gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0JDX0JhcmNvZGVSb3c+KCh3aWR0aCArIDQpICogMTcgKyAxKTsKKworICBtX3dpZHRoID0gd2lkdGggKiAxNzsKKyAgbV9oZWlnaHQgPSBoZWlnaHQgKyAyOworICBtX2N1cnJlbnRSb3cgPSAwOworICBtX291dEhlaWdodCA9IDA7CisgIG1fb3V0V2lkdGggPSAwOworfQorCitDQkNfQmFyY29kZU1hdHJpeDo6fkNCQ19CYXJjb2RlTWF0cml4KCkge30KKwordm9pZCBDQkNfQmFyY29kZU1hdHJpeDo6c2V0KGludDMyX3QgeCwgaW50MzJfdCB5LCB1aW50OF90IHZhbHVlKSB7CisgIG1fbWF0cml4W3ldLT5zZXQoeCwgdmFsdWUpOworfQordm9pZCBDQkNfQmFyY29kZU1hdHJpeDo6c2V0TWF0cml4KGludDMyX3QgeCwgaW50MzJfdCB5LCBib29sIGJsYWNrKSB7CisgIHNldCh4LCB5LCAodWludDhfdCkoYmxhY2sgPyAxIDogMCkpOworfQordm9pZCBDQkNfQmFyY29kZU1hdHJpeDo6c3RhcnRSb3coKSB7CisgICsrbV9jdXJyZW50Um93OworfQorc3RkOjp2ZWN0b3I8dWludDhfdD4mIENCQ19CYXJjb2RlTWF0cml4OjpnZXRNYXRyaXgoKSB7CisgIHJldHVybiBnZXRTY2FsZWRNYXRyaXgoMSwgMSk7Cit9CitzdGQ6OnZlY3Rvcjx1aW50OF90PiYgQ0JDX0JhcmNvZGVNYXRyaXg6OmdldFNjYWxlZE1hdHJpeChpbnQzMl90IHNjYWxlKSB7CisgIHJldHVybiBnZXRTY2FsZWRNYXRyaXgoc2NhbGUsIHNjYWxlKTsKK30KK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBDQkNfQmFyY29kZU1hdHJpeDo6Z2V0U2NhbGVkTWF0cml4KGludDMyX3QgeFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5U2NhbGUpIHsKKyAgc2l6ZV90IHlNYXggPSBtX2hlaWdodCAqIHlTY2FsZTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnl0ZWFycmF5ID0gbV9tYXRyaXhbMF0tPmdldFNjYWxlZFJvdyh4U2NhbGUpOworICBzaXplX3QgeE1heCA9IGJ5dGVhcnJheS5zaXplKCk7CisgIG1fbWF0cml4T3V0LnJlc2l6ZSh4TWF4ICogeU1heCk7CisgIG1fb3V0V2lkdGggPSB4TWF4OworICBtX291dEhlaWdodCA9IHlNYXg7CisgIGludDMyX3QgayA9IDA7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgeU1heDsgaSsrKSB7CisgICAgaWYgKGkgIT0gMCkKKyAgICAgIGJ5dGVhcnJheSA9IG1fbWF0cml4W2kgLyB5U2NhbGVdLT5nZXRTY2FsZWRSb3coeFNjYWxlKTsKKyAgICBrID0gaSAqIHhNYXg7CisgICAgZm9yIChzaXplX3QgbCA9IDA7IGwgPCB4TWF4OyBsKyspCisgICAgICBtX21hdHJpeE91dFtrICsgbF0gPSBieXRlYXJyYXlbbF07CisgIH0KKyAgcmV0dXJuIG1fbWF0cml4T3V0OworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWF0cml4LmggYi9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVNYXRyaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWFkYTk4Ci0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWF0cml4LmgKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9QREY0MTdfQkNfUERGNDE3QkFSQ09ERU1BVFJJWF9IXworI2RlZmluZSBGWEJBUkNPREVfUERGNDE3X0JDX1BERjQxN0JBUkNPREVNQVRSSVhfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK2NsYXNzIENCQ19CYXJjb2RlUm93OworCitjbGFzcyBDQkNfQmFyY29kZU1hdHJpeCB7CisgcHVibGljOgorICBDQkNfQmFyY29kZU1hdHJpeCgpOworICBDQkNfQmFyY29kZU1hdHJpeChpbnQzMl90IGhlaWdodCwgaW50MzJfdCB3aWR0aCk7CisgIHZpcnR1YWwgfkNCQ19CYXJjb2RlTWF0cml4KCk7CisKKyAgQ0JDX0JhcmNvZGVSb3cqIGdldEN1cnJlbnRSb3coKSBjb25zdCB7IHJldHVybiBtX21hdHJpeFttX2N1cnJlbnRSb3ddLmdldCgpOyB9CisgIGludDMyX3QgZ2V0V2lkdGgoKSBjb25zdCB7IHJldHVybiBtX291dFdpZHRoOyB9CisgIGludDMyX3QgZ2V0SGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gbV9vdXRIZWlnaHQ7IH0KKyAgdm9pZCBzZXQoaW50MzJfdCB4LCBpbnQzMl90IHksIHVpbnQ4X3QgdmFsdWUpOworICB2b2lkIHNldE1hdHJpeChpbnQzMl90IHgsIGludDMyX3QgeSwgYm9vbCBibGFjayk7CisgIHZvaWQgc3RhcnRSb3coKTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGdldE1hdHJpeCgpOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZ2V0U2NhbGVkTWF0cml4KGludDMyX3Qgc2NhbGUpOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZ2V0U2NhbGVkTWF0cml4KGludDMyX3QgeFNjYWxlLCBpbnQzMl90IHlTY2FsZSk7CisKKyBwcml2YXRlOgorICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0JDX0JhcmNvZGVSb3c+PiBtX21hdHJpeDsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbV9tYXRyaXhPdXQ7CisgIGludDMyX3QgbV9jdXJyZW50Um93OworICBpbnQzMl90IG1faGVpZ2h0OworICBpbnQzMl90IG1fd2lkdGg7CisgIGludDMyX3QgbV9vdXRXaWR0aDsKKyAgaW50MzJfdCBtX291dEhlaWdodDsKK307CisKKyNlbmRpZiAgLy8gRlhCQVJDT0RFX1BERjQxN19CQ19QREY0MTdCQVJDT0RFTUFUUklYX0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVSb3cuY3BwIGIvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlUm93LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGMyNTFmCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlUm93LmNwcApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6CisvKgorICogQ29weXJpZ2h0IDIwMTEgWlhpbmcgYXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlUm93LmgiCisKK0NCQ19CYXJjb2RlUm93OjpDQkNfQmFyY29kZVJvdyhzaXplX3Qgd2lkdGgpCisgICAgOiBtX3Jvdyh3aWR0aCksIG1fY3VycmVudExvY2F0aW9uKDApIHt9CisKK0NCQ19CYXJjb2RlUm93Ojp+Q0JDX0JhcmNvZGVSb3coKSB7fQorCit2b2lkIENCQ19CYXJjb2RlUm93OjpzZXQoaW50MzJfdCB4LCB1aW50OF90IHZhbHVlKSB7CisgIG1fcm93W3hdID0gdmFsdWU7Cit9CisKK3ZvaWQgQ0JDX0JhcmNvZGVSb3c6OnNldChpbnQzMl90IHgsIGJvb2wgYmxhY2spIHsKKyAgbV9yb3dbeF0gPSBibGFjayA/IDEgOiAwOworfQorCit2b2lkIENCQ19CYXJjb2RlUm93OjphZGRCYXIoYm9vbCBibGFjaywgaW50MzJfdCB3aWR0aCkgeworICBmb3IgKGludDMyX3QgaWkgPSAwOyBpaSA8IHdpZHRoOyBpaSsrKQorICAgIHNldChtX2N1cnJlbnRMb2NhdGlvbisrLCBibGFjayk7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBDQkNfQmFyY29kZVJvdzo6Z2V0Um93KCkgeworICByZXR1cm4gbV9yb3c7Cit9CisKK3N0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBDQkNfQmFyY29kZVJvdzo6Z2V0U2NhbGVkUm93KGludDMyX3Qgc2NhbGUpIHsKKyAgbV9vdXRwdXQucmVzaXplKG1fcm93LnNpemUoKSAqIHNjYWxlKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX291dHB1dC5zaXplKCk7IGkrKykKKyAgICBtX291dHB1dFtpXSA9IG1fcm93W2kgLyBzY2FsZV07CisgIHJldHVybiBtX291dHB1dDsKK30KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZVJvdy5oIGIvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlUm93LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ5ZDBlYgotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZVJvdy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEJBUkNPREVfUERGNDE3X0JDX1BERjQxN0JBUkNPREVST1dfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX1BERjQxN19CQ19QREY0MTdCQVJDT0RFUk9XX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworY2xhc3MgQ0JDX0JhcmNvZGVSb3cgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0JDX0JhcmNvZGVSb3coc2l6ZV90IHdpZHRoKTsKKyAgdmlydHVhbCB+Q0JDX0JhcmNvZGVSb3coKTsKKworICB2b2lkIHNldChpbnQzMl90IHgsIHVpbnQ4X3QgdmFsdWUpOworICB2b2lkIHNldChpbnQzMl90IHgsIGJvb2wgYmxhY2spOworICB2b2lkIGFkZEJhcihib29sIGJsYWNrLCBpbnQzMl90IHdpZHRoKTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGdldFJvdygpOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZ2V0U2NhbGVkUm93KGludDMyX3Qgc2NhbGUpOworCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbV9yb3c7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1fb3V0cHV0OworICBpbnQzMl90IG1fY3VycmVudExvY2F0aW9uOworfTsKKworI2VuZGlmICAvLyBGWEJBUkNPREVfUERGNDE3X0JDX1BERjQxN0JBUkNPREVST1dfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29tcGFjdGlvbi5jcHAgYi9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbXBhY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZWQ4NzgKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbXBhY3Rpb24uY3BwCkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBaWGluZyBhdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbXBhY3Rpb24uaCIKKworQ0JDX0NvbXBhY3Rpb246OkNCQ19Db21wYWN0aW9uKCkge30KK0NCQ19Db21wYWN0aW9uOjp+Q0JDX0NvbXBhY3Rpb24oKSB7fQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21wYWN0aW9uLmggYi9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbXBhY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjQ3OTVhCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21wYWN0aW9uLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9QREY0MTdfQkNfUERGNDE3Q09NUEFDVElPTl9IXworI2RlZmluZSBGWEJBUkNPREVfUERGNDE3X0JDX1BERjQxN0NPTVBBQ1RJT05fSF8KKworY2xhc3MgQ0JDX0NvbXBhY3Rpb247CitlbnVtIENvbXBhY3Rpb24geyBBVVRPLCBURVhULCBCWVRFUywgTlVNRVJJQyB9OworY2xhc3MgQ0JDX0NvbXBhY3Rpb24geworIHB1YmxpYzoKKyAgQ0JDX0NvbXBhY3Rpb24oKTsKKyAgdmlydHVhbCB+Q0JDX0NvbXBhY3Rpb24oKTsKK307CisKKyNlbmRpZiAgLy8gRlhCQVJDT0RFX1BERjQxN19CQ19QREY0MTdDT01QQUNUSU9OX0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbi5jcHAgYi9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRlM2ViNQotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uLmNwcApAQCAtMCwwICsxLDE2NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgorLyoKKyAqIENvcHlyaWdodCAyMDA2IEplcmVtaWFzIE1hZXJraSBpbiBwYXJ0LCBhbmQgWlhpbmcgQXV0aG9ycyBpbiBwYXJ0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFcnJvckNvcnJlY3Rpb24uaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIHsKKworY29uc3QgdWludDE2X3QgRUNfTEVWRUxfMF9DT0VGRklDSUVOVFNbMl0gPSB7MjcsIDkxN307Citjb25zdCB1aW50MTZfdCBFQ19MRVZFTF8xX0NPRUZGSUNJRU5UU1s0XSA9IHs1MjIsIDU2OCwgNzIzLCA4MDl9OworY29uc3QgdWludDE2X3QgRUNfTEVWRUxfMl9DT0VGRklDSUVOVFNbOF0gPSB7MjM3LCAzMDgsIDQzNiwgMjg0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQ2LCA2NTMsIDQyOCwgMzc5fTsKKworY29uc3QgdWludDE2X3QgRUNfTEVWRUxfM19DT0VGRklDSUVOVFNbMTZdID0gezI3NCwgNTYyLCAyMzIsIDc1NSwgNTk5LCA1MjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODAxLCAxMzIsIDI5NSwgMTE2LCA0NDIsIDQyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOTUsIDQyLCAgMTc2LCA2NX07CisKK2NvbnN0IHVpbnQxNl90IEVDX0xFVkVMXzRfQ09FRkZJQ0lFTlRTWzMyXSA9IHsKKyAgICAzNjEsIDU3NSwgOTIyLCA1MjUsIDE3NiwgNTg2LCA2NDAsIDMyMSwgNTM2LCA3NDIsIDY3NywKKyAgICA3NDIsIDY4NywgMjg0LCAxOTMsIDUxNywgMjczLCA0OTQsIDI2MywgMTQ3LCA1OTMsIDgwMCwKKyAgICA1NzEsIDMyMCwgODAzLCAxMzMsIDIzMSwgMzkwLCA2ODUsIDMzMCwgNjMsICA0MTB9OworCitjb25zdCB1aW50MTZfdCBFQ19MRVZFTF81X0NPRUZGSUNJRU5UU1s2NF0gPSB7CisgICAgNTM5LCA0MjIsIDYsICAgOTMsICA4NjIsIDc3MSwgNDUzLCAxMDYsIDYxMCwgMjg3LCAxMDcsIDUwNSwgNzMzLAorICAgIDg3NywgMzgxLCA2MTIsIDcyMywgNDc2LCA0NjIsIDE3MiwgNDMwLCA2MDksIDg1OCwgODIyLCA1NDMsIDM3NiwKKyAgICA1MTEsIDQwMCwgNjcyLCA3NjIsIDI4MywgMTg0LCA0NDAsIDM1LCAgNTE5LCAzMSwgIDQ2MCwgNTk0LCAyMjUsCisgICAgNTM1LCA1MTcsIDM1MiwgNjA1LCAxNTgsIDY1MSwgMjAxLCA0ODgsIDUwMiwgNjQ4LCA3MzMsIDcxNywgODMsCisgICAgNDA0LCA5NywgIDI4MCwgNzcxLCA4NDAsIDYyOSwgNCwgICAzODEsIDg0MywgNjIzLCAyNjQsIDU0M307CisKK2NvbnN0IHVpbnQxNl90IEVDX0xFVkVMXzZfQ09FRkZJQ0lFTlRTWzEyOF0gPSB7CisgICAgNTIxLCAzMTAsIDg2NCwgNTQ3LCA4NTgsIDU4MCwgMjk2LCAzNzksIDUzLCAgNzc5LCA4OTcsIDQ0NCwgNDAwLCA5MjUsIDc0OSwKKyAgICA0MTUsIDgyMiwgOTMsICAyMTcsIDIwOCwgOTI4LCAyNDQsIDU4MywgNjIwLCAyNDYsIDE0OCwgNDQ3LCA2MzEsIDI5MiwgOTA4LAorICAgIDQ5MCwgNzA0LCA1MTYsIDI1OCwgNDU3LCA5MDcsIDU5NCwgNzIzLCA2NzQsIDI5MiwgMjcyLCA5NiwgIDY4NCwgNDMyLCA2ODYsCisgICAgNjA2LCA4NjAsIDU2OSwgMTkzLCAyMTksIDEyOSwgMTg2LCAyMzYsIDI4NywgMTkyLCA3NzUsIDI3OCwgMTczLCA0MCwgIDM3OSwKKyAgICA3MTIsIDQ2MywgNjQ2LCA3NzYsIDE3MSwgNDkxLCAyOTcsIDc2MywgMTU2LCA3MzIsIDk1LCAgMjcwLCA0NDcsIDkwLCAgNTA3LAorICAgIDQ4LCAgMjI4LCA4MjEsIDgwOCwgODk4LCA3ODQsIDY2MywgNjI3LCAzNzgsIDM4MiwgMjYyLCAzODAsIDYwMiwgNzU0LCAzMzYsCisgICAgODksICA2MTQsIDg3LCAgNDMyLCA2NzAsIDYxNiwgMTU3LCAzNzQsIDI0MiwgNzI2LCA2MDAsIDI2OSwgMzc1LCA4OTgsIDg0NSwKKyAgICA0NTQsIDM1NCwgMTMwLCA4MTQsIDU4NywgODA0LCAzNCwgIDIxMSwgMzMwLCA1MzksIDI5NywgODI3LCA4NjUsIDM3LCAgNTE3LAorICAgIDgzNCwgMzE1LCA1NTAsIDg2LCAgODAxLCA0LCAgIDEwOCwgNTM5fTsKKworY29uc3QgdWludDE2X3QgRUNfTEVWRUxfN19DT0VGRklDSUVOVFNbMjU2XSA9IHsKKyAgICA1MjQsIDg5NCwgNzUsICA3NjYsIDg4MiwgODU3LCA3NCwgIDIwNCwgODIsICA1ODYsIDcwOCwgMjUwLCA5MDUsIDc4NiwgMTM4LAorICAgIDcyMCwgODU4LCAxOTQsIDMxMSwgOTEzLCAyNzUsIDE5MCwgMzc1LCA4NTAsIDQzOCwgNzMzLCAxOTQsIDI4MCwgMjAxLCAyODAsCisgICAgODI4LCA3NTcsIDcxMCwgODE0LCA5MTksIDg5LCAgNjgsICA1NjksIDExLCAgMjA0LCA3OTYsIDYwNSwgNTQwLCA5MTMsIDgwMSwKKyAgICA3MDAsIDc5OSwgMTM3LCA0MzksIDQxOCwgNTkyLCA2NjgsIDM1MywgODU5LCAzNzAsIDY5NCwgMzI1LCAyNDAsIDIxNiwgMjU3LAorICAgIDI4NCwgNTQ5LCAyMDksIDg4NCwgMzE1LCA3MCwgIDMyOSwgNzkzLCA0OTAsIDI3NCwgODc3LCAxNjIsIDc0OSwgODEyLCA2ODQsCisgICAgNDYxLCAzMzQsIDM3NiwgODQ5LCA1MjEsIDMwNywgMjkxLCA4MDMsIDcxMiwgMTksICAzNTgsIDM5OSwgOTA4LCAxMDMsIDUxMSwKKyAgICA1MSwgIDgsICAgNTE3LCAyMjUsIDI4OSwgNDcwLCA2MzcsIDczMSwgNjYsICAyNTUsIDkxNywgMjY5LCA0NjMsIDgzMCwgNzMwLAorICAgIDQzMywgODQ4LCA1ODUsIDEzNiwgNTM4LCA5MDYsIDkwLCAgMiwgICAyOTAsIDc0MywgMTk5LCA2NTUsIDkwMywgMzI5LCA0OSwKKyAgICA4MDIsIDU4MCwgMzU1LCA1ODgsIDE4OCwgNDYyLCAxMCwgIDEzNCwgNjI4LCAzMjAsIDQ3OSwgMTMwLCA3MzksIDcxLCAgMjYzLAorICAgIDMxOCwgMzc0LCA2MDEsIDE5MiwgNjA1LCAxNDIsIDY3MywgNjg3LCAyMzQsIDcyMiwgMzg0LCAxNzcsIDc1MiwgNjA3LCA2NDAsCisgICAgNDU1LCAxOTMsIDY4OSwgNzA3LCA4MDUsIDY0MSwgNDgsICA2MCwgIDczMiwgNjIxLCA4OTUsIDU0NCwgMjYxLCA4NTIsIDY1NSwKKyAgICAzMDksIDY5NywgNzU1LCA3NTYsIDYwLCAgMjMxLCA3NzMsIDQzNCwgNDIxLCA3MjYsIDUyOCwgNTAzLCAxMTgsIDQ5LCAgNzk1LAorICAgIDMyLCAgMTQ0LCA1MDAsIDIzOCwgODM2LCAzOTQsIDI4MCwgNTY2LCAzMTksIDksICAgNjQ3LCA1NTAsIDczLCAgOTE0LCAzNDIsCisgICAgMTI2LCAzMiwgIDY4MSwgMzMxLCA3OTIsIDYyMCwgNjAsICA2MDksIDQ0MSwgMTgwLCA3OTEsIDg5MywgNzU0LCA2MDUsIDM4MywKKyAgICAyMjgsIDc0OSwgNzYwLCAyMTMsIDU0LCAgMjk3LCAxMzQsIDU0LCAgODM0LCAyOTksIDkyMiwgMTkxLCA5MTAsIDUzMiwgNjA5LAorICAgIDgyOSwgMTg5LCAyMCwgIDE2NywgMjksICA4NzIsIDQ0OSwgODMsICA0MDIsIDQxLCAgNjU2LCA1MDUsIDU3OSwgNDgxLCAxNzMsCisgICAgNDA0LCAyNTEsIDY4OCwgOTUsICA0OTcsIDU1NSwgNjQyLCA1NDMsIDMwNywgMTU5LCA5MjQsIDU1OCwgNjQ4LCA1NSwgIDQ5NywKKyAgICAxMH07CisKK2NvbnN0IHVpbnQxNl90IEVDX0xFVkVMXzhfQ09FRkZJQ0lFTlRTWzUxMl0gPSB7CisgICAgMzUyLCA3NywgIDM3MywgNTA0LCAzNSwgIDU5OSwgNDI4LCAyMDcsIDQwOSwgNTc0LCAxMTgsIDQ5OCwgMjg1LCAzODAsIDM1MCwKKyAgICA0OTIsIDE5NywgMjY1LCA5MjAsIDE1NSwgOTE0LCAyOTksIDIyOSwgNjQzLCAyOTQsIDg3MSwgMzA2LCA4OCwgIDg3LCAgMTkzLAorICAgIDM1MiwgNzgxLCA4NDYsIDc1LCAgMzI3LCA1MjAsIDQzNSwgNTQzLCAyMDMsIDY2NiwgMjQ5LCAzNDYsIDc4MSwgNjIxLCA2NDAsCisgICAgMjY4LCA3OTQsIDUzNCwgNTM5LCA3ODEsIDQwOCwgMzkwLCA2NDQsIDEwMiwgNDc2LCA0OTksIDI5MCwgNjMyLCA1NDUsIDM3LAorICAgIDg1OCwgOTE2LCA1NTIsIDQxLCAgNTQyLCAyODksIDEyMiwgMjcyLCAzODMsIDgwMCwgNDg1LCA5OCwgIDc1MiwgNDcyLCA3NjEsCisgICAgMTA3LCA3ODQsIDg2MCwgNjU4LCA3NDEsIDI5MCwgMjA0LCA2ODEsIDQwNywgODU1LCA4NSwgIDk5LCAgNjIsICA0ODIsIDE4MCwKKyAgICAyMCwgIDI5NywgNDUxLCA1OTMsIDkxMywgMTQyLCA4MDgsIDY4NCwgMjg3LCA1MzYsIDU2MSwgNzYsICA2NTMsIDg5OSwgNzI5LAorICAgIDU2NywgNzQ0LCAzOTAsIDUxMywgMTkyLCA1MTYsIDI1OCwgMjQwLCA1MTgsIDc5NCwgMzk1LCA3NjgsIDg0OCwgNTEsICA2MTAsCisgICAgMzg0LCAxNjgsIDE5MCwgODI2LCAzMjgsIDU5NiwgNzg2LCAzMDMsIDU3MCwgMzgxLCA0MTUsIDY0MSwgMTU2LCAyMzcsIDE1MSwKKyAgICA0MjksIDUzMSwgMjA3LCA2NzYsIDcxMCwgODksICAxNjgsIDMwNCwgNDAyLCA0MCwgIDcwOCwgNTc1LCAxNjIsIDg2NCwgMjI5LAorICAgIDY1LCAgODYxLCA4NDEsIDUxMiwgMTY0LCA0NzcsIDIyMSwgOTIsICAzNTgsIDc4NSwgMjg4LCAzNTcsIDg1MCwgODM2LCA4MjcsCisgICAgNzM2LCA3MDcsIDk0LCAgOCwgICA0OTQsIDExNCwgNTIxLCAyLCAgIDQ5OSwgODUxLCA1NDMsIDE1MiwgNzI5LCA3NzEsIDk1LAorICAgIDI0OCwgMzYxLCA1NzgsIDMyMywgODU2LCA3OTcsIDI4OSwgNTEsICA2ODQsIDQ2NiwgNTMzLCA4MjAsIDY2OSwgNDUsICA5MDIsCisgICAgNDUyLCAxNjcsIDM0MiwgMjQ0LCAxNzMsIDM1LCAgNDYzLCA2NTEsIDUxLCAgNjk5LCA1OTEsIDQ1MiwgNTc4LCAzNywgIDEyNCwKKyAgICAyOTgsIDMzMiwgNTUyLCA0MywgIDQyNywgMTE5LCA2NjIsIDc3NywgNDc1LCA4NTAsIDc2NCwgMzY0LCA1NzgsIDkxMSwgMjgzLAorICAgIDcxMSwgNDcyLCA0MjAsIDI0NSwgMjg4LCA1OTQsIDM5NCwgNTExLCAzMjcsIDU4OSwgNzc3LCA2OTksIDY4OCwgNDMsICA0MDgsCisgICAgODQyLCAzODMsIDcyMSwgNTIxLCA1NjAsIDY0NCwgNzE0LCA1NTksIDYyLCAgMTQ1LCA4NzMsIDY2MywgNzEzLCAxNTksIDY3MiwKKyAgICA3MjksIDYyNCwgNTksICAxOTMsIDQxNywgMTU4LCAyMDksIDU2MywgNTY0LCAzNDMsIDY5MywgMTA5LCA2MDgsIDU2MywgMzY1LAorICAgIDE4MSwgNzcyLCA2NzcsIDMxMCwgMjQ4LCAzNTMsIDcwOCwgNDEwLCA1NzksIDg3MCwgNjE3LCA4NDEsIDYzMiwgODYwLCAyODksCisgICAgNTM2LCAzNSwgIDc3NywgNjE4LCA1ODYsIDQyNCwgODMzLCA3NywgIDU5NywgMzQ2LCAyNjksIDc1NywgNjMyLCA2OTUsIDc1MSwKKyAgICAzMzEsIDI0NywgMTg0LCA0NSwgIDc4NywgNjgwLCAxOCwgIDY2LCAgNDA3LCAzNjksIDU0LCAgNDkyLCAyMjgsIDYxMywgODMwLAorICAgIDkyMiwgNDM3LCA1MTksIDY0NCwgOTA1LCA3ODksIDQyMCwgMzA1LCA0NDEsIDIwNywgMzAwLCA4OTIsIDgyNywgMTQxLCA1MzcsCisgICAgMzgxLCA2NjIsIDUxMywgNTYsICAyNTIsIDM0MSwgMjQyLCA3OTcsIDgzOCwgODM3LCA3MjAsIDIyNCwgMzA3LCA2MzEsIDYxLAorICAgIDg3LCAgNTYwLCAzMTAsIDc1NiwgNjY1LCAzOTcsIDgwOCwgODUxLCAzMDksIDQ3MywgNzk1LCAzNzgsIDMxLCAgNjQ3LCA5MTUsCisgICAgNDU5LCA4MDYsIDU5MCwgNzMxLCA0MjUsIDIxNiwgNTQ4LCAyNDksIDMyMSwgODgxLCA2OTksIDUzNSwgNjczLCA3ODIsIDIxMCwKKyAgICA4MTUsIDkwNSwgMzAzLCA4NDMsIDkyMiwgMjgxLCA3MywgIDQ2OSwgNzkxLCA2NjAsIDE2MiwgNDk4LCAzMDgsIDE1NSwgNDIyLAorICAgIDkwNywgODE3LCAxODcsIDYyLCAgMTYsICA0MjUsIDUzNSwgMzM2LCAyODYsIDQzNywgMzc1LCAyNzMsIDYxMCwgMjk2LCAxODMsCisgICAgOTIzLCAxMTYsIDY2NywgNzUxLCAzNTMsIDYyLCAgMzY2LCA2OTEsIDM3OSwgNjg3LCA4NDIsIDM3LCAgMzU3LCA3MjAsIDc0MiwKKyAgICAzMzAsIDUsICAgMzksICA5MjMsIDMxMSwgNDI0LCAyNDIsIDc0OSwgMzIxLCA1NCwgIDY2OSwgMzE2LCAzNDIsIDI5OSwgNTM0LAorICAgIDEwNSwgNjY3LCA0ODgsIDY0MCwgNjcyLCA1NzYsIDU0MCwgMzE2LCA0ODYsIDcyMSwgNjEwLCA0NiwgIDY1NiwgNDQ3LCAxNzEsCisgICAgNjE2LCA0NjQsIDE5MCwgNTMxLCAyOTcsIDMyMSwgNzYyLCA3NTIsIDUzMywgMTc1LCAxMzQsIDE0LCAgMzgxLCA0MzMsIDcxNywKKyAgICA0NSwgIDExMSwgMjAsICA1OTYsIDI4NCwgNzM2LCAxMzgsIDY0NiwgNDExLCA4NzcsIDY2OSwgMTQxLCA5MTksIDQ1LCAgNzgwLAorICAgIDQwNywgMTY0LCAzMzIsIDg5OSwgMTY1LCA3MjYsIDYwMCwgMzI1LCA0OTgsIDY1NSwgMzU3LCA3NTIsIDc2OCwgMjIzLCA4NDksCisgICAgNjQ3LCA2MywgIDMxMCwgODYzLCAyNTEsIDM2NiwgMzA0LCAyODIsIDczOCwgNjc1LCA0MTAsIDM4OSwgMjQ0LCAzMSwgIDEyMSwKKyAgICAzMDMsIDI2M307CisKK2NvbnN0IHVpbnQxNl90KiBjb25zdCBFQ19DT0VGRklDSUVOVFNbOV0gPSB7CisgICAgRUNfTEVWRUxfMF9DT0VGRklDSUVOVFMsIEVDX0xFVkVMXzFfQ09FRkZJQ0lFTlRTLCBFQ19MRVZFTF8yX0NPRUZGSUNJRU5UUywKKyAgICBFQ19MRVZFTF8zX0NPRUZGSUNJRU5UUywgRUNfTEVWRUxfNF9DT0VGRklDSUVOVFMsIEVDX0xFVkVMXzVfQ09FRkZJQ0lFTlRTLAorICAgIEVDX0xFVkVMXzZfQ09FRkZJQ0lFTlRTLCBFQ19MRVZFTF83X0NPRUZGSUNJRU5UUywgRUNfTEVWRUxfOF9DT0VGRklDSUVOVFN9OworCit9ICAvLyBuYW1lc3BhY2UKKworQ0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbjo6Q0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbigpIHt9CitDQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uOjp+Q0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbigpIHt9CitpbnQzMl90IENCQ19QREY0MTdFcnJvckNvcnJlY3Rpb246OmdldEVycm9yQ29ycmVjdGlvbkNvZGV3b3JkQ291bnQoCisgICAgaW50MzJfdCBlcnJvckNvcnJlY3Rpb25MZXZlbCkgeworICBpZiAoZXJyb3JDb3JyZWN0aW9uTGV2ZWwgPCAwIHx8IGVycm9yQ29ycmVjdGlvbkxldmVsID4gOCkKKyAgICByZXR1cm4gLTE7CisgIHJldHVybiAxIDw8IChlcnJvckNvcnJlY3Rpb25MZXZlbCArIDEpOworfQorCitib29sIENCQ19QREY0MTdFcnJvckNvcnJlY3Rpb246OmdlbmVyYXRlRXJyb3JDb3JyZWN0aW9uKAorICAgIGNvbnN0IFdpZGVTdHJpbmcmIGRhdGFDb2Rld29yZHMsCisgICAgaW50MzJfdCBlcnJvckNvcnJlY3Rpb25MZXZlbCwKKyAgICBXaWRlU3RyaW5nKiByZXN1bHQpIHsKKyAgYXNzZXJ0KHJlc3VsdCk7CisgIGFzc2VydChyZXN1bHQtPklzRW1wdHkoKSk7CisKKyAgaW50MzJfdCBrID0gZ2V0RXJyb3JDb3JyZWN0aW9uQ29kZXdvcmRDb3VudChlcnJvckNvcnJlY3Rpb25MZXZlbCk7CisgIGlmIChrIDwgMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc3RkOjp2ZWN0b3I8d2NoYXJfdD4gZWNoKGspOworICBpbnQzMl90IHNsZCA9IGRhdGFDb2Rld29yZHMuR2V0TGVuZ3RoKCk7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNsZDsgaSsrKSB7CisgICAgaW50MzJfdCB0MSA9IChkYXRhQ29kZXdvcmRzW2ldICsgZWNoW2sgLSAxXSkgJSA5Mjk7CisgICAgaW50MzJfdCB0MjsKKyAgICBpbnQzMl90IHQzOworICAgIGZvciAoaW50MzJfdCBqID0gayAtIDE7IGogPj0gMTsgai0tKSB7CisgICAgICB0MiA9ICh0MSAqIEVDX0NPRUZGSUNJRU5UU1tlcnJvckNvcnJlY3Rpb25MZXZlbF1bal0pICUgOTI5OworICAgICAgdDMgPSA5MjkgLSB0MjsKKyAgICAgIGVjaFtqXSA9ICh3Y2hhcl90KSgoZWNoW2ogLSAxXSArIHQzKSAlIDkyOSk7CisgICAgfQorICAgIHQyID0gKHQxICogRUNfQ09FRkZJQ0lFTlRTW2Vycm9yQ29ycmVjdGlvbkxldmVsXVswXSkgJSA5Mjk7CisgICAgdDMgPSA5MjkgLSB0MjsKKyAgICBlY2hbMF0gPSAod2NoYXJfdCkodDMgJSA5MjkpOworICB9CisgIHJlc3VsdC0+UmVzZXJ2ZShrKTsKKyAgZm9yIChpbnQzMl90IGogPSBrIC0gMTsgaiA+PSAwOyBqLS0pIHsKKyAgICBpZiAoZWNoW2pdICE9IDApCisgICAgICBlY2hbal0gPSBzdGF0aWNfY2FzdDx3Y2hhcl90Pig5MjkpIC0gZWNoW2pdOworICAgICpyZXN1bHQgKz0gZWNoW2pdOworICB9CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFcnJvckNvcnJlY3Rpb24uaCBiL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UyODE2MgotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uLmgKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9QREY0MTdfQkNfUERGNDE3RVJST1JDT1JSRUNUSU9OX0hfCisjZGVmaW5lIEZYQkFSQ09ERV9QREY0MTdfQkNfUERGNDE3RVJST1JDT1JSRUNUSU9OX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisKK2NsYXNzIENCQ19QREY0MTdFcnJvckNvcnJlY3Rpb24geworIHB1YmxpYzoKKyAgQ0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbigpOworICB2aXJ0dWFsIH5DQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uKCk7CisKKyAgc3RhdGljIGludDMyX3QgZ2V0RXJyb3JDb3JyZWN0aW9uQ29kZXdvcmRDb3VudChpbnQzMl90IGVycm9yQ29ycmVjdGlvbkxldmVsKTsKKyAgc3RhdGljIGJvb2wgZ2VuZXJhdGVFcnJvckNvcnJlY3Rpb24oY29uc3QgV2lkZVN0cmluZyYgZGF0YUNvZGV3b3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlcnJvckNvcnJlY3Rpb25MZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyogcmVzdWx0KTsKK307CisKKyNlbmRpZiAgLy8gRlhCQVJDT0RFX1BERjQxN19CQ19QREY0MTdFUlJPUkNPUlJFQ1RJT05fSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5jcHAgYi9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OTI4N2EKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXIuY3BwCkBAIC0wLDAgKzEsNDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6CisvKgorICogQ29weXJpZ2h0IDIwMDYgSmVyZW1pYXMgTWFlcmtpIGluIHBhcnQsIGFuZCBaWGluZyBBdXRob3JzIGluIHBhcnQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXIuaCIKKworI2luY2x1ZGUgImZ4YmFyY29kZS9CQ19VdGlsQ29kaW5nQ29udmVydC5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29tcGFjdGlvbi5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS91dGlscy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2JpZ2ludC9CaWdJbnRlZ2VyTGlicmFyeS5oaCIKKworI2RlZmluZSBTVUJNT0RFX0FMUEhBIDAKKyNkZWZpbmUgU1VCTU9ERV9MT1dFUiAxCisjZGVmaW5lIFNVQk1PREVfTUlYRUQgMgorCitpbnQzMl90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpURVhUX0NPTVBBQ1RJT04gPSAwOworaW50MzJfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6QllURV9DT01QQUNUSU9OID0gMTsKK2ludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6Ok5VTUVSSUNfQ09NUEFDVElPTiA9IDI7CitpbnQzMl90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpTVUJNT0RFX1BVTkNUVUFUSU9OID0gMzsKK2ludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkxBVENIX1RPX1RFWFQgPSA5MDA7CitpbnQzMl90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpMQVRDSF9UT19CWVRFX1BBRERFRCA9IDkwMTsKK2ludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkxBVENIX1RPX05VTUVSSUMgPSA5MDI7CitpbnQzMl90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpTSElGVF9UT19CWVRFID0gOTEzOworaW50MzJfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fQllURSA9IDkyNDsKK3VpbnQ4X3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OlRFWFRfTUlYRURfUkFXW10gPSB7CisgICAgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDM4LCAxMywgOSwgNDQsIDU4LAorICAgIDM1LCA0NSwgNDYsIDM2LCA0NywgNDMsIDM3LCA0MiwgNjEsIDk0LCAwLCAgMzIsIDAsIDAsICAwfTsKK3VpbnQ4X3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OlRFWFRfUFVOQ1RVQVRJT05fUkFXW10gPSB7CisgICAgNTksIDYwLCA2MiwgNjQsIDkxLCA5MiwgOTMsICA5NSwgOTYsIDEyNiwgMzMsIDEzLCAgOSwgICA0NCwgNTgsCisgICAgMTAsIDQ1LCA0NiwgMzYsIDQ3LCAzNCwgMTI0LCA0MiwgNDAsIDQxLCAgNjMsIDEyMywgMTI1LCAzOSwgMH07CitpbnQzMl90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpNSVhFRFsxMjhdID0gezB9OworaW50MzJfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6UFVOQ1RVQVRJT05bMTI4XSA9IHswfTsKKwordm9pZCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6SW5pdGlhbGl6ZSgpIHsKKyAgSW52ZXJzZSgpOworfQorCit2b2lkIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpGaW5hbGl6ZSgpIHt9CisKK1dpZGVTdHJpbmcgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmVuY29kZUhpZ2hMZXZlbChXaWRlU3RyaW5nIHdpZGVNc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFjdGlvbiBjb21wYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKKyAgQnl0ZVN0cmluZyBieXRlczsKKyAgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpVbmljb2RlVG9VVEY4KHdpZGVNc2csIGJ5dGVzKTsKKyAgV2lkZVN0cmluZyBtc2c7CisgIGludDMyX3QgbGVuID0gYnl0ZXMuR2V0TGVuZ3RoKCk7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgd2NoYXJfdCBjaCA9ICh3Y2hhcl90KShieXRlc1tpXSAmIDB4ZmYpOworICAgIGlmIChjaCA9PSAnPycgJiYgYnl0ZXNbaV0gIT0gJz8nKSB7CisgICAgICBlID0gQkNFeGNlcHRpb25DaGFyYWN0ZXJzT3V0c2lkZUlTTzg4NTkxRW5jb2Rpbmc7CisgICAgICByZXR1cm4gV2lkZVN0cmluZygpOworICAgIH0KKyAgICBtc2cgKz0gY2g7CisgIH0KKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnl0ZUFycihieXRlcy5iZWdpbigpLCBieXRlcy5lbmQoKSk7CisgIFdpZGVTdHJpbmcgc2I7CisgIGxlbiA9IG1zZy5HZXRMZW5ndGgoKTsKKyAgaW50MzJfdCBwID0gMDsKKyAgaW50MzJfdCB0ZXh0U3ViTW9kZSA9IFNVQk1PREVfQUxQSEE7CisgIGlmIChjb21wYWN0aW9uID09IFRFWFQpIHsKKyAgICBlbmNvZGVUZXh0KG1zZywgcCwgbGVuLCBzYiwgdGV4dFN1Yk1vZGUpOworICB9IGVsc2UgaWYgKGNvbXBhY3Rpb24gPT0gQllURVMpIHsKKyAgICBlbmNvZGVCaW5hcnkoJmJ5dGVBcnIsIHAsIGJ5dGVBcnIuc2l6ZSgpLCBCWVRFX0NPTVBBQ1RJT04sIHNiKTsKKyAgfSBlbHNlIGlmIChjb21wYWN0aW9uID09IE5VTUVSSUMpIHsKKyAgICBzYiArPSAod2NoYXJfdClMQVRDSF9UT19OVU1FUklDOworICAgIGVuY29kZU51bWVyaWMobXNnLCBwLCBsZW4sIHNiKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQzMl90IGVuY29kaW5nTW9kZSA9IExBVENIX1RPX1RFWFQ7CisgICAgd2hpbGUgKHAgPCBsZW4pIHsKKyAgICAgIGludDMyX3QgbiA9IGRldGVybWluZUNvbnNlY3V0aXZlRGlnaXRDb3VudChtc2csIHApOworICAgICAgaWYgKG4gPj0gMTMpIHsKKyAgICAgICAgc2IgKz0gKHdjaGFyX3QpTEFUQ0hfVE9fTlVNRVJJQzsKKyAgICAgICAgZW5jb2RpbmdNb2RlID0gTlVNRVJJQ19DT01QQUNUSU9OOworICAgICAgICB0ZXh0U3ViTW9kZSA9IFNVQk1PREVfQUxQSEE7CisgICAgICAgIGVuY29kZU51bWVyaWMobXNnLCBwLCBuLCBzYik7CisgICAgICAgIHAgKz0gbjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludDMyX3QgdCA9IGRldGVybWluZUNvbnNlY3V0aXZlVGV4dENvdW50KG1zZywgcCk7CisgICAgICAgIGlmICh0ID49IDUgfHwgbiA9PSBsZW4pIHsKKyAgICAgICAgICBpZiAoZW5jb2RpbmdNb2RlICE9IFRFWFRfQ09NUEFDVElPTikgeworICAgICAgICAgICAgc2IgKz0gKHdjaGFyX3QpTEFUQ0hfVE9fVEVYVDsKKyAgICAgICAgICAgIGVuY29kaW5nTW9kZSA9IFRFWFRfQ09NUEFDVElPTjsKKyAgICAgICAgICAgIHRleHRTdWJNb2RlID0gU1VCTU9ERV9BTFBIQTsKKyAgICAgICAgICB9CisgICAgICAgICAgdGV4dFN1Yk1vZGUgPSBlbmNvZGVUZXh0KG1zZywgcCwgdCwgc2IsIHRleHRTdWJNb2RlKTsKKyAgICAgICAgICBwICs9IHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW50MzJfdCBiID0gZGV0ZXJtaW5lQ29uc2VjdXRpdmVCaW5hcnlDb3VudChtc2csICZieXRlQXJyLCBwLCBlKTsKKyAgICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgICAgICAgICAgcmV0dXJuIEwiICI7CisgICAgICAgICAgaWYgKGIgPT0gMCkgeworICAgICAgICAgICAgYiA9IDE7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChiID09IDEgJiYgZW5jb2RpbmdNb2RlID09IFRFWFRfQ09NUEFDVElPTikgeworICAgICAgICAgICAgZW5jb2RlQmluYXJ5KCZieXRlQXJyLCBwLCAxLCBURVhUX0NPTVBBQ1RJT04sIHNiKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW5jb2RlQmluYXJ5KCZieXRlQXJyLCBwLCBiLCBlbmNvZGluZ01vZGUsIHNiKTsKKyAgICAgICAgICAgIGVuY29kaW5nTW9kZSA9IEJZVEVfQ09NUEFDVElPTjsKKyAgICAgICAgICAgIHRleHRTdWJNb2RlID0gU1VCTU9ERV9BTFBIQTsKKyAgICAgICAgICB9CisgICAgICAgICAgcCArPSBiOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBzYjsKK30KKwordm9pZCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6SW52ZXJzZSgpIHsKKyAgZm9yIChzaXplX3QgbCA9IDA7IGwgPCBGWF9BcnJheVNpemUoTUlYRUQpOyArK2wpCisgICAgTUlYRURbbF0gPSAtMTsKKworICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoVEVYVF9NSVhFRF9SQVcpOyArK2kpIHsKKyAgICB1aW50OF90IGIgPSBURVhUX01JWEVEX1JBV1tpXTsKKyAgICBpZiAoYiAhPSAwKQorICAgICAgTUlYRURbYl0gPSBpOworICB9CisKKyAgZm9yIChzaXplX3QgbCA9IDA7IGwgPCBGWF9BcnJheVNpemUoUFVOQ1RVQVRJT04pOyArK2wpCisgICAgUFVOQ1RVQVRJT05bbF0gPSAtMTsKKworICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoVEVYVF9QVU5DVFVBVElPTl9SQVcpOyArK2kpIHsKKyAgICB1aW50OF90IGIgPSBURVhUX1BVTkNUVUFUSU9OX1JBV1tpXTsKKyAgICBpZiAoYiAhPSAwKQorICAgICAgUFVOQ1RVQVRJT05bYl0gPSBpOworICB9Cit9CisKK2ludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmVuY29kZVRleHQoV2lkZVN0cmluZyBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIHNiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluaXRpYWxTdWJtb2RlKSB7CisgIFdpZGVTdHJpbmcgdG1wOworICBpbnQzMl90IHN1Ym1vZGUgPSBpbml0aWFsU3VibW9kZTsKKyAgaW50MzJfdCBpZHggPSAwOworICB3aGlsZSAodHJ1ZSkgeworICAgIHdjaGFyX3QgY2ggPSBtc2dbc3RhcnRwb3MgKyBpZHhdOworICAgIHN3aXRjaCAoc3VibW9kZSkgeworICAgICAgY2FzZSBTVUJNT0RFX0FMUEhBOgorICAgICAgICBpZiAoaXNBbHBoYVVwcGVyKGNoKSkgeworICAgICAgICAgIGlmIChjaCA9PSAnICcpCisgICAgICAgICAgICB0bXAgKz0gKHdjaGFyX3QpMjY7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgdG1wICs9ICh3Y2hhcl90KShjaCAtIDY1KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNBbHBoYUxvd2VyKGNoKSkgeworICAgICAgICAgIHN1Ym1vZGUgPSBTVUJNT0RFX0xPV0VSOworICAgICAgICAgIHRtcCArPSAod2NoYXJfdCkyNzsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNNaXhlZChjaCkpIHsKKyAgICAgICAgICBzdWJtb2RlID0gU1VCTU9ERV9NSVhFRDsKKyAgICAgICAgICB0bXAgKz0gKHdjaGFyX3QpMjg7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgdG1wICs9ICh3Y2hhcl90KTI5OworICAgICAgICB0bXAgKz0gUFVOQ1RVQVRJT05bY2hdOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU1VCTU9ERV9MT1dFUjoKKyAgICAgICAgaWYgKGlzQWxwaGFMb3dlcihjaCkpIHsKKyAgICAgICAgICBpZiAoY2ggPT0gJyAnKSB7CisgICAgICAgICAgICB0bXAgKz0gKHdjaGFyX3QpMjY7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRtcCArPSAod2NoYXJfdCkoY2ggLSA5Nyk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChpc0FscGhhVXBwZXIoY2gpKSB7CisgICAgICAgICAgdG1wICs9ICh3Y2hhcl90KTI3OworICAgICAgICAgIHRtcCArPSAod2NoYXJfdCkoY2ggLSA2NSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlzTWl4ZWQoY2gpKSB7CisgICAgICAgICAgc3VibW9kZSA9IFNVQk1PREVfTUlYRUQ7CisgICAgICAgICAgdG1wICs9ICh3Y2hhcl90KTI4OworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgdG1wICs9ICh3Y2hhcl90KTI5OworICAgICAgICB0bXAgKz0gUFVOQ1RVQVRJT05bY2hdOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU1VCTU9ERV9NSVhFRDoKKyAgICAgICAgaWYgKGlzTWl4ZWQoY2gpKSB7CisgICAgICAgICAgdG1wICs9IE1JWEVEW2NoXTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNBbHBoYVVwcGVyKGNoKSkgeworICAgICAgICAgIHN1Ym1vZGUgPSBTVUJNT0RFX0FMUEhBOworICAgICAgICAgIHRtcCArPSAod2NoYXJfdCkyODsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNBbHBoYUxvd2VyKGNoKSkgeworICAgICAgICAgIHN1Ym1vZGUgPSBTVUJNT0RFX0xPV0VSOworICAgICAgICAgIHRtcCArPSAod2NoYXJfdCkyNzsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhcnRwb3MgKyBpZHggKyAxIDwgY291bnQpIHsKKyAgICAgICAgICB3Y2hhcl90IG5leHQgPSBtc2dbc3RhcnRwb3MgKyBpZHggKyAxXTsKKyAgICAgICAgICBpZiAoaXNQdW5jdHVhdGlvbihuZXh0KSkgeworICAgICAgICAgICAgc3VibW9kZSA9IFNVQk1PREVfUFVOQ1RVQVRJT047CisgICAgICAgICAgICB0bXAgKz0gKHdjaGFyX3QpMjU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdG1wICs9ICh3Y2hhcl90KTI5OworICAgICAgICB0bXAgKz0gUFVOQ1RVQVRJT05bY2hdOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChpc1B1bmN0dWF0aW9uKGNoKSkgeworICAgICAgICAgIHRtcCArPSBQVU5DVFVBVElPTltjaF07CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3VibW9kZSA9IFNVQk1PREVfQUxQSEE7CisgICAgICAgIHRtcCArPSAod2NoYXJfdCkyOTsKKyAgICAgICAgY29udGludWU7CisgICAgfQorICAgIGlkeCsrOworICAgIGlmIChpZHggPj0gY291bnQpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICB3Y2hhcl90IGggPSAwOworICBpbnQzMl90IGxlbiA9IHRtcC5HZXRMZW5ndGgoKTsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICBib29sIG9kZCA9IChpICUgMikgIT0gMDsKKyAgICBpZiAob2RkKSB7CisgICAgICBoID0gKHdjaGFyX3QpKChoICogMzApICsgdG1wW2ldKTsKKyAgICAgIHNiICs9IGg7CisgICAgfSBlbHNlIHsKKyAgICAgIGggPSB0bXBbaV07CisgICAgfQorICB9CisgIGlmICgobGVuICUgMikgIT0gMCkgeworICAgIHNiICs9ICh3Y2hhcl90KSgoaCAqIDMwKSArIDI5KTsKKyAgfQorICByZXR1cm4gc3VibW9kZTsKK30KK3ZvaWQgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmVuY29kZUJpbmFyeShzdGQ6OnZlY3Rvcjx1aW50OF90PiogYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIHNiKSB7CisgIGlmIChjb3VudCA9PSAxICYmIHN0YXJ0bW9kZSA9PSBURVhUX0NPTVBBQ1RJT04pIHsKKyAgICBzYiArPSAod2NoYXJfdClTSElGVF9UT19CWVRFOworICB9CisgIGludDMyX3QgaWR4ID0gc3RhcnRwb3M7CisgIGludDMyX3QgaSA9IDA7CisgIGlmIChjb3VudCA+PSA2KSB7CisgICAgc2IgKz0gKHdjaGFyX3QpTEFUQ0hfVE9fQllURTsKKyAgICB3Y2hhcl90IGNoYXJzWzVdOworICAgIHdoaWxlICgoc3RhcnRwb3MgKyBjb3VudCAtIGlkeCkgPj0gNikgeworICAgICAgaW50NjRfdCB0ID0gMDsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCA2OyBpKyspIHsKKyAgICAgICAgdCA8PD0gODsKKyAgICAgICAgdCArPSAoKmJ5dGVzKVtpZHggKyBpXSAmIDB4ZmY7CisgICAgICB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgIGNoYXJzW2ldID0gKHdjaGFyX3QpKHQgJSA5MDApOworICAgICAgICB0IC89IDkwMDsKKyAgICAgIH0KKyAgICAgIGZvciAoaSA9IDQ7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIHNiICs9IChjaGFyc1tpXSk7CisgICAgICB9CisgICAgICBpZHggKz0gNjsKKyAgICB9CisgIH0KKyAgaWYgKGlkeCA8IHN0YXJ0cG9zICsgY291bnQpIHsKKyAgICBzYiArPSAod2NoYXJfdClMQVRDSF9UT19CWVRFX1BBRERFRDsKKyAgfQorICBmb3IgKGkgPSBpZHg7IGkgPCBzdGFydHBvcyArIGNvdW50OyBpKyspIHsKKyAgICBpbnQzMl90IGNoID0gKCpieXRlcylbaV0gJiAweGZmOworICAgIHNiICs9ICh3Y2hhcl90KWNoOworICB9Cit9Cit2b2lkIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVOdW1lcmljKFdpZGVTdHJpbmcgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0cG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiBzYikgeworICBpbnQzMl90IGlkeCA9IDA7CisgIEJpZ0ludGVnZXIgbnVtOTAwID0gOTAwOworICB3aGlsZSAoaWR4IDwgY291bnQpIHsKKyAgICBXaWRlU3RyaW5nIHRtcDsKKyAgICBpbnQzMl90IGxlbiA9IDQ0IDwgY291bnQgLSBpZHggPyA0NCA6IGNvdW50IC0gaWR4OworICAgIEJ5dGVTdHJpbmcgcGFydCA9CisgICAgICAgICgod2NoYXJfdCknMScgKyBtc2cuTWlkKHN0YXJ0cG9zICsgaWR4LCBsZW4pKS5VVEY4RW5jb2RlKCk7CisgICAgQmlnSW50ZWdlciBiaWdpbnQgPSBzdHJpbmdUb0JpZ0ludGVnZXIocGFydC5jX3N0cigpKTsKKyAgICBkbyB7CisgICAgICBpbnQzMl90IGMgPSAoYmlnaW50ICUgbnVtOTAwKS50b0ludCgpOworICAgICAgdG1wICs9ICh3Y2hhcl90KShjKTsKKyAgICAgIGJpZ2ludCA9IGJpZ2ludCAvIG51bTkwMDsKKyAgICB9IHdoaWxlICghYmlnaW50LmlzWmVybygpKTsKKyAgICBmb3IgKGludDMyX3QgaSA9IHRtcC5HZXRMZW5ndGgoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgICBzYiArPSB0bXBbaV07CisgICAgfQorICAgIGlkeCArPSBsZW47CisgIH0KK30KK2Jvb2wgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmlzRGlnaXQod2NoYXJfdCBjaCkgeworICByZXR1cm4gY2ggPj0gJzAnICYmIGNoIDw9ICc5JzsKK30KK2Jvb2wgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmlzQWxwaGFVcHBlcih3Y2hhcl90IGNoKSB7CisgIHJldHVybiBjaCA9PSAnICcgfHwgKGNoID49ICdBJyAmJiBjaCA8PSAnWicpOworfQorYm9vbCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6aXNBbHBoYUxvd2VyKHdjaGFyX3QgY2gpIHsKKyAgcmV0dXJuIGNoID09ICcgJyB8fCAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6Jyk7Cit9Citib29sIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjppc01peGVkKHdjaGFyX3QgY2gpIHsKKyAgcmV0dXJuIE1JWEVEW2NoXSAhPSAtMTsKK30KK2Jvb2wgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmlzUHVuY3R1YXRpb24od2NoYXJfdCBjaCkgeworICByZXR1cm4gUFVOQ1RVQVRJT05bY2hdICE9IC0xOworfQorYm9vbCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6aXNUZXh0KHdjaGFyX3QgY2gpIHsKKyAgcmV0dXJuIGNoID09ICdcdCcgfHwgY2ggPT0gJ1xuJyB8fCBjaCA9PSAnXHInIHx8IChjaCA+PSAzMiAmJiBjaCA8PSAxMjYpOworfQoraW50MzJfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZGV0ZXJtaW5lQ29uc2VjdXRpdmVEaWdpdENvdW50KAorICAgIFdpZGVTdHJpbmcgbXNnLAorICAgIGludDMyX3Qgc3RhcnRwb3MpIHsKKyAgaW50MzJfdCBjb3VudCA9IDA7CisgIGludDMyX3QgbGVuID0gbXNnLkdldExlbmd0aCgpOworICBpbnQzMl90IGlkeCA9IHN0YXJ0cG9zOworICBpZiAoaWR4IDwgbGVuKSB7CisgICAgd2NoYXJfdCBjaCA9IG1zZ1tpZHhdOworICAgIHdoaWxlIChpc0RpZ2l0KGNoKSAmJiBpZHggPCBsZW4pIHsKKyAgICAgIGNvdW50Kys7CisgICAgICBpZHgrKzsKKyAgICAgIGlmIChpZHggPCBsZW4pIHsKKyAgICAgICAgY2ggPSBtc2dbaWR4XTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIGNvdW50OworfQoraW50MzJfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZGV0ZXJtaW5lQ29uc2VjdXRpdmVUZXh0Q291bnQoCisgICAgV2lkZVN0cmluZyBtc2csCisgICAgaW50MzJfdCBzdGFydHBvcykgeworICBpbnQzMl90IGxlbiA9IG1zZy5HZXRMZW5ndGgoKTsKKyAgaW50MzJfdCBpZHggPSBzdGFydHBvczsKKyAgd2hpbGUgKGlkeCA8IGxlbikgeworICAgIHdjaGFyX3QgY2ggPSBtc2dbaWR4XTsKKyAgICBpbnQzMl90IG51bWVyaWNDb3VudCA9IDA7CisgICAgd2hpbGUgKG51bWVyaWNDb3VudCA8IDEzICYmIGlzRGlnaXQoY2gpICYmIGlkeCA8IGxlbikgeworICAgICAgbnVtZXJpY0NvdW50Kys7CisgICAgICBpZHgrKzsKKyAgICAgIGlmIChpZHggPCBsZW4pIHsKKyAgICAgICAgY2ggPSBtc2dbaWR4XTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG51bWVyaWNDb3VudCA+PSAxMykgeworICAgICAgcmV0dXJuIGlkeCAtIHN0YXJ0cG9zIC0gbnVtZXJpY0NvdW50OworICAgIH0KKyAgICBpZiAobnVtZXJpY0NvdW50ID4gMCkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGNoID0gbXNnW2lkeF07CisgICAgaWYgKCFpc1RleHQoY2gpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWR4Kys7CisgIH0KKyAgcmV0dXJuIGlkeCAtIHN0YXJ0cG9zOworfQoraW50MzJfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZGV0ZXJtaW5lQ29uc2VjdXRpdmVCaW5hcnlDb3VudCgKKyAgICBXaWRlU3RyaW5nIG1zZywKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogYnl0ZXMsCisgICAgaW50MzJfdCBzdGFydHBvcywKKyAgICBpbnQzMl90JiBlKSB7CisgIGludDMyX3QgbGVuID0gbXNnLkdldExlbmd0aCgpOworICBpbnQzMl90IGlkeCA9IHN0YXJ0cG9zOworICB3aGlsZSAoaWR4IDwgbGVuKSB7CisgICAgd2NoYXJfdCBjaCA9IG1zZ1tpZHhdOworICAgIGludDMyX3QgbnVtZXJpY0NvdW50ID0gMDsKKyAgICB3aGlsZSAobnVtZXJpY0NvdW50IDwgMTMgJiYgaXNEaWdpdChjaCkpIHsKKyAgICAgIG51bWVyaWNDb3VudCsrOworICAgICAgaW50MzJfdCBpID0gaWR4ICsgbnVtZXJpY0NvdW50OworICAgICAgaWYgKGkgPj0gbGVuKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2ggPSBtc2dbaV07CisgICAgfQorICAgIGlmIChudW1lcmljQ291bnQgPj0gMTMpIHsKKyAgICAgIHJldHVybiBpZHggLSBzdGFydHBvczsKKyAgICB9CisgICAgaW50MzJfdCB0ZXh0Q291bnQgPSAwOworICAgIHdoaWxlICh0ZXh0Q291bnQgPCA1ICYmIGlzVGV4dChjaCkpIHsKKyAgICAgIHRleHRDb3VudCsrOworICAgICAgaW50MzJfdCBpID0gaWR4ICsgdGV4dENvdW50OworICAgICAgaWYgKGkgPj0gbGVuKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2ggPSBtc2dbaV07CisgICAgfQorICAgIGlmICh0ZXh0Q291bnQgPj0gNSkgeworICAgICAgcmV0dXJuIGlkeCAtIHN0YXJ0cG9zOworICAgIH0KKyAgICBjaCA9IG1zZ1tpZHhdOworICAgIGlmICgoKmJ5dGVzKVtpZHhdID09IDYzICYmIGNoICE9ICc/JykgeworICAgICAgZSA9IEJDRXhjZXB0aW9uTm9uRW5jb2RhYmxlQ2hhcmFjdGVyRGV0ZWN0ZWQ7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlkeCsrOworICB9CisgIHJldHVybiBpZHggLSBzdGFydHBvczsKK30KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5oIGIvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcwMWM4MQotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5oCkBAIC0wLDAgKzEsNzUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEJBUkNPREVfUERGNDE3X0JDX1BERjQxN0hJR0hMRVZFTEVOQ09ERVJfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX1BERjQxN19CQ19QREY0MTdISUdITEVWRUxFTkNPREVSX0hfCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29tcGFjdGlvbi5oIgorCitjbGFzcyBDQkNfUERGNDE3SGlnaExldmVsRW5jb2RlciB7CisgcHVibGljOgorICBzdGF0aWMgV2lkZVN0cmluZyBlbmNvZGVIaWdoTGV2ZWwoV2lkZVN0cmluZyBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYWN0aW9uIGNvbXBhY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKKyAgc3RhdGljIHZvaWQgSW52ZXJzZSgpOworICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKCk7CisgIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7CisKKyBwcml2YXRlOgorICBzdGF0aWMgaW50MzJfdCBURVhUX0NPTVBBQ1RJT047CisgIHN0YXRpYyBpbnQzMl90IEJZVEVfQ09NUEFDVElPTjsKKyAgc3RhdGljIGludDMyX3QgTlVNRVJJQ19DT01QQUNUSU9OOworICBzdGF0aWMgaW50MzJfdCBTVUJNT0RFX1BVTkNUVUFUSU9OOworICBzdGF0aWMgaW50MzJfdCBMQVRDSF9UT19URVhUOworICBzdGF0aWMgaW50MzJfdCBMQVRDSF9UT19CWVRFX1BBRERFRDsKKyAgc3RhdGljIGludDMyX3QgTEFUQ0hfVE9fTlVNRVJJQzsKKyAgc3RhdGljIGludDMyX3QgU0hJRlRfVE9fQllURTsKKyAgc3RhdGljIGludDMyX3QgTEFUQ0hfVE9fQllURTsKKyAgc3RhdGljIHVpbnQ4X3QgVEVYVF9NSVhFRF9SQVdbXTsKKyAgc3RhdGljIHVpbnQ4X3QgVEVYVF9QVU5DVFVBVElPTl9SQVdbXTsKKyAgc3RhdGljIGludDMyX3QgTUlYRURbMTI4XTsKKyAgc3RhdGljIGludDMyX3QgUFVOQ1RVQVRJT05bMTI4XTsKKyAgc3RhdGljIGludDMyX3QgZW5jb2RlVGV4dChXaWRlU3RyaW5nIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0cG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyYgc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbml0aWFsU3VibW9kZSk7CisgIHN0YXRpYyB2b2lkIGVuY29kZUJpbmFyeShzdGQ6OnZlY3Rvcjx1aW50OF90PiogYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0cG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyYgc2IpOworICBzdGF0aWMgdm9pZCBlbmNvZGVOdW1lcmljKFdpZGVTdHJpbmcgbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiBzYik7CisgIHN0YXRpYyBib29sIGlzRGlnaXQod2NoYXJfdCBjaCk7CisgIHN0YXRpYyBib29sIGlzQWxwaGFVcHBlcih3Y2hhcl90IGNoKTsKKyAgc3RhdGljIGJvb2wgaXNBbHBoYUxvd2VyKHdjaGFyX3QgY2gpOworICBzdGF0aWMgYm9vbCBpc01peGVkKHdjaGFyX3QgY2gpOworICBzdGF0aWMgYm9vbCBpc1B1bmN0dWF0aW9uKHdjaGFyX3QgY2gpOworICBzdGF0aWMgYm9vbCBpc1RleHQod2NoYXJfdCBjaCk7CisgIHN0YXRpYyBpbnQzMl90IGRldGVybWluZUNvbnNlY3V0aXZlRGlnaXRDb3VudChXaWRlU3RyaW5nIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MpOworICBzdGF0aWMgaW50MzJfdCBkZXRlcm1pbmVDb25zZWN1dGl2ZVRleHRDb3VudChXaWRlU3RyaW5nIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydHBvcyk7CisgIHN0YXRpYyBpbnQzMl90IGRldGVybWluZUNvbnNlY3V0aXZlQmluYXJ5Q291bnQoV2lkZVN0cmluZyBtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7CisKKyAgZnJpZW5kIGNsYXNzIFBERjQxN0hpZ2hMZXZlbEVuY29kZXJfRW5jb2RlTnVtZXJpY19UZXN0OworICBmcmllbmQgY2xhc3MgUERGNDE3SGlnaExldmVsRW5jb2Rlcl9FbmNvZGVCaW5hcnlfVGVzdDsKKyAgZnJpZW5kIGNsYXNzIFBERjQxN0hpZ2hMZXZlbEVuY29kZXJfRW5jb2RlVGV4dF9UZXN0OworICBmcmllbmQgY2xhc3MgUERGNDE3SGlnaExldmVsRW5jb2Rlcl9Db25zZWN1dGl2ZURpZ2l0Q291bnRfVGVzdDsKKyAgZnJpZW5kIGNsYXNzIFBERjQxN0hpZ2hMZXZlbEVuY29kZXJfQ29uc2VjdXRpdmVUZXh0Q291bnRfVGVzdDsKKyAgZnJpZW5kIGNsYXNzIFBERjQxN0hpZ2hMZXZlbEVuY29kZXJfQ29uc2VjdXRpdmVCaW5hcnlDb3VudF9UZXN0OworfTsKKworI2VuZGlmICAvLyBGWEJBUkNPREVfUERGNDE3X0JDX1BERjQxN0hJR0hMRVZFTEVOQ09ERVJfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcl91bml0dGVzdC5jcHAgYi9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXJfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNGE1OWEKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXJfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMjI5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXIuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKworVEVTVChQREY0MTdIaWdoTGV2ZWxFbmNvZGVyLCBFbmNvZGVIaWdoTGV2ZWwpIHsKKyAgLy8gVE9ETyh0c2VwZXopOiBpbXBsZW1lbnQgdGVzdCBjYXNlcy4KK30KKworVEVTVChQREY0MTdIaWdoTGV2ZWxFbmNvZGVyLCBFbmNvZGVUZXh0KSB7CisgIC8vIFRPRE8odHNlcGV6KTogaW1wbGVtZW50IHRlc3QgY2FzZXMuCit9CisKK1RFU1QoUERGNDE3SGlnaExldmVsRW5jb2RlciwgRW5jb2RlQmluYXJ5KSB7CisgIHN0cnVjdCBFbmNvZGVCaW5hcnlDYXNlIHsKKyAgICBjb25zdCBjaGFyKiBpbnB1dDsKKyAgICBpbnQgb2Zmc2V0OworICAgIGludCBjb3VudDsKKyAgICBpbnQgc3RhcnRtb2RlOworICAgIGNvbnN0IHdjaGFyX3QqIGV4cGVjdGVkOworICAgIGludCBleHBlY3RlZF9sZW5ndGg7CisgIH0gZW5jb2RlX2JpbmFyeV9jYXNlc1tdID0geworICAgICAgLy8gRW1wdHkgc3RyaW5nIGVuY29kZXMgYXMgZW1wdHkgc3RyaW5nLgorICAgICAgeyIiLCAwLCAwLCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6VEVYVF9DT01QQUNUSU9OLCBMIiIsIDB9LAorCisgICAgICAvLyBGZXdlciB0aGFuIDYgY2hhcmFjdGVycyBlbmNvZGVzIGFzIHByZWZpeCB3aXRob3V0IGNvbXBhY3Rpb24uCisgICAgICB7Inh4eHh4IiwgMCwgNSwgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OlRFWFRfQ09NUEFDVElPTiwKKyAgICAgICBMIlx4MDM4NXh4eHh4IiwgNn0sCisKKyAgICAgIC8vIDYgY2hhcmN0ZXJzIHRyaWdnZXJzdCB0ZXh0IGVuY29kaW5nIGNvbXBhY3Rpb24uCisgICAgICB7Inh4eHh4eCIsIDAsIDYsIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpURVhUX0NPTVBBQ1RJT04sCisgICAgICAgTCJcdTAzOWNcdTAwYzlcdTAzMWZcdTAxMmFcdTAwZDJcdTAyZDAiLCA2fSwKKworICAgICAgLy8gU2FtZSByZXN1bHQgaWYgaW5pdGlhbGx5IGluIG51bWVyaWMgY29tcGFjdGlvbiBtb2RlLgorICAgICAgeyJ4eHh4eHgiLCAwLCA2LCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6TlVNRVJJQ19DT01QQUNUSU9OLAorICAgICAgIEwiXHUwMzljXHUwMGM5XHUwMzFmXHUwMTJhXHUwMGQyXHUwMmQwIiwgNn0sCisgIH07CisKKyAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkluaXRpYWxpemUoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZW5jb2RlX2JpbmFyeV9jYXNlcyk7ICsraSkgeworICAgIEVuY29kZUJpbmFyeUNhc2UqIHB0ciA9ICZlbmNvZGVfYmluYXJ5X2Nhc2VzW2ldOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGlucHV0X2FycmF5OworICAgIHNpemVfdCBpbnB1dF9sZW5ndGggPSBzdHJsZW4ocHRyLT5pbnB1dCk7CisgICAgaW5wdXRfYXJyYXkucmVzaXplKGlucHV0X2xlbmd0aCk7CisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpbnB1dF9sZW5ndGg7ICsraikgeworICAgICAgaW5wdXRfYXJyYXlbal0gPSBwdHItPmlucHV0W2pdOworICAgIH0KKyAgICBXaWRlU3RyaW5nIGV4cGVjdGVkKHB0ci0+ZXhwZWN0ZWQsIHB0ci0+ZXhwZWN0ZWRfbGVuZ3RoKTsKKyAgICBXaWRlU3RyaW5nIHJlc3VsdDsKKyAgICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZW5jb2RlQmluYXJ5KAorICAgICAgICAmaW5wdXRfYXJyYXksIHB0ci0+b2Zmc2V0LCBwdHItPmNvdW50LCBwdHItPnN0YXJ0bW9kZSwgcmVzdWx0KTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIHJlc3VsdCkgPDwgIiBmb3IgY2FzZSBudW1iZXIgIiA8PCBpOworICB9CisgIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpGaW5hbGl6ZSgpOworfQorCitURVNUKFBERjQxN0hpZ2hMZXZlbEVuY29kZXIsIEVuY29kZU51bWVyaWMpIHsKKyAgc3RydWN0IEVuY29kZU51bWVyaWNDYXNlIHsKKyAgICBjb25zdCB3Y2hhcl90KiBpbnB1dDsKKyAgICBpbnQgb2Zmc2V0OworICAgIGludCBjb3VudDsKKyAgICBjb25zdCB3Y2hhcl90KiBleHBlY3RlZDsKKyAgICBpbnQgZXhwZWN0ZWRfbGVuZ3RoOworICB9IGVuY29kZV9udW1lcmljX2Nhc2VzW10gPSB7CisgICAgICAvLyBFbXB0eSBzdHJpbmcgZW5jb2RlcyBhcyBlbXB0eSBzdHJpbmcuCisgICAgICB7TCIiLCAwLCAwLCBMIiIsIDB9LAorCisgICAgICAvLyBTaW5nbGUgMCBzaG91bGQgZW5jb2RlIGFzIDEwIGJhc2UtOTAwID09IGEuCisgICAgICB7TCIwIiwgMCwgMSwgTCJceDAwMGEiLCAxfSwKKworICAgICAgLy8gODAwIHNob3VsZCBlbmNvZGUgYXMgMTgwMCBiYXNlLTkwMCA9PSAyLDAuCisgICAgICB7TCI4MDAiLCAwLCAzLCBMIlx4MDAwMlx4MDAwMCIsIDJ9LAorCisgICAgICAvLyBUZXN0IGxvbmdlciBzdHJpbmdzIGFuZCBzdWItc3RyaW5ncy4KKyAgICAgIHtMIjEyMzQ1NiIsIDAsIDYsIEwiXHgwMDAxXHgwMTVjXHgwMTAwIiwgM30sCisgICAgICB7TCIxMjM0NTYiLCAwLCA1LCBMIlx4MDA3Y1x4MDJlOSIsIDJ9LAorICAgICAge0wiMTIzNDU2IiwgMSwgNSwgTCJceDAwODlceDAwOWMiLCAyfSwKKyAgICAgIHtMIjEyMzQ1NiIsIDIsIDIsIEwiXHgwMDg2IiwgMX0sCisKKyAgICAgIC8vIFVwIHRvIDQ0IGNoYXJhY3RlcnMgZW5jb2RlcyBhcyAxNSBiYXNlLTkwMCB3b3Jkcy4KKyAgICAgIHtMIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgMCwgNDQsCisgICAgICAgTCJceDAxYjVceDAwNmZceDAyY2NceDAwODRceDAxYmNceDAwNzZceDAwYjNceDAwNWNceDAxZjBceDAzNGZceDAxZTYiCisgICAgICAgTCJceDAwOTBceDAyMGJceDAxOWJceDAwNjQiLAorICAgICAgIDE1fSwKKworICAgICAgLy8gNDUgY2hhcmFjdGVycyBzaG91bGQgZW5jb2RlIGFzIHNhbWUgMTUgd29yZHMgZm9sbG93ZWQgYnkgb25lIGFkZGl0aW9uYWwKKyAgICAgIC8vIHdvcmQuCisgICAgICB7TCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAwLCA0NSwKKyAgICAgICBMIlx4MDFiNVx4MDA2Zlx4MDJjY1x4MDA4NFx4MDFiY1x4MDA3Nlx4MDBiM1x4MDA1Y1x4MDFmMFx4MDM0Zlx4MDFlNiIKKyAgICAgICBMIlx4MDA5MFx4MDIwYlx4MDE5Ylx4MDA2NFx4MDAwYSIsCisgICAgICAgMTZ9LAorCisgICAgICAvLyA0NCBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5IDgwMCBzaG91bGQgZW5jb2RlIGFzIDE1IHdvcmRzIGZvbGxvd2VkIGJ5CisgICAgICAvLyAxODAwIGJhc2UtOTAwID09IDIsMC4KKyAgICAgIHtMIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODAwIiwgMCwgNDcsCisgICAgICAgTCJceDAxYjVceDAwNmZceDAyY2NceDAwODRceDAxYmNceDAwNzZceDAwYjNceDAwNWNceDAxZjBceDAzNGZceDAxZTYiCisgICAgICAgTCJceDAwOTBceDAyMGJceDAxOWJceDAwNjRceDAwMDJceDAwMDAiLAorICAgICAgIDE3fSwKKworICAgICAgLy8gRXZlbiBsb25nZXIgaW5wdXQuCisgICAgICB7TCIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIDAsIDUwLAorICAgICAgIEwiXHgwMWUwXHgwMmYwXHgwMzZkXHgwMmFkXHgwMjljXHgwMWVhXHgwMDExXHgwMDBiXHgwMmQ2XHgwMjNjXHgwMTA4IgorICAgICAgIEwiXHgwMmJiXHgwMDIzXHgwMmQyXHgwMGM4XHgwMDAxXHgwMGQzXHgwMDY0IiwKKyAgICAgICAxOH0sCisgIH07CisKKyAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkluaXRpYWxpemUoKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZW5jb2RlX251bWVyaWNfY2FzZXMpOyArK2kpIHsKKyAgICBFbmNvZGVOdW1lcmljQ2FzZSogcHRyID0gJmVuY29kZV9udW1lcmljX2Nhc2VzW2ldOworICAgIFdpZGVTdHJpbmcgaW5wdXQocHRyLT5pbnB1dCk7CisgICAgV2lkZVN0cmluZyBleHBlY3RlZChwdHItPmV4cGVjdGVkLCBwdHItPmV4cGVjdGVkX2xlbmd0aCk7CisgICAgV2lkZVN0cmluZyByZXN1bHQ7CisgICAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmVuY29kZU51bWVyaWMoaW5wdXQsIHB0ci0+b2Zmc2V0LCBwdHItPmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLCByZXN1bHQpIDw8ICIgZm9yIGNhc2UgbnVtYmVyICIgPDwgaTsKKyAgfQorICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6RmluYWxpemUoKTsKK30KKworVEVTVChQREY0MTdIaWdoTGV2ZWxFbmNvZGVyLCBDb25zZWN1dGl2ZURpZ2l0Q291bnQpIHsKKyAgc3RydWN0IENvbnNlY3V0aXZlRGlnaXRDYXNlIHsKKyAgICBjb25zdCB3Y2hhcl90KiBpbnB1dDsKKyAgICBpbnQgb2Zmc2V0OworICAgIGludCBleHBlY3RlZF9jb3VudDsKKyAgfSBjb25zZWN1dGl2ZV9kaWdpdF9jYXNlc1tdID0geworICAgICAgLy8gRW1wdHkgc3RyaW5nIGNvbnRhaW5zIDAgY29uc2VjdWl0dmUgZGlnaXRzLgorICAgICAge0wiIiwgMCwgMH0sCisKKyAgICAgIC8vIFNpbmdsZSBub24tZGlnaXQgY2hhcmFjdGVyIGNvbnRhaW5zIDAgY29uc2VjdXRpdmUgZGlnaXRzLgorICAgICAge0wiWCIsIDAsIDB9LAorCisgICAgICAvLyBMZWFkaW5nIG5vbi1kaWdpdCBmb2xsb3dlZCBieSBkaWdpdHMgY29udGFpbnMgMCBjb25zZWN1dGl2ZS4KKyAgICAgIHtMIlgxMjMiLCAwLCAwfSwKKworICAgICAgLy8gU2luZ2xlIGRpZ2l0IGNvbnRhaW5zIDEgY29uc2VjdXRpdmUgZGlnaXQuCisgICAgICB7TCIxIiwgMCwgMX0sCisKKyAgICAgIC8vIFNpbmdsZSBkaWdpdCBmb2xsb3dlIGJ5IG5vbi1kaWdpdCBjb250YWlucyAxIGNvbnNlY3V0aXZlIGRpZ2l0LgorICAgICAge0wiMVoiLCAwLCAxfSwKKworICAgICAgLy8gVGVzdCBsb25nZXIgc3RyaW5ncy4KKyAgICAgIHtMIjEyM0ZPTzQ1Njc4IiwgMCwgM30sCisKKyAgICAgIC8vIFRlc3Qgc3VidHJpbmcgc3RhcnRpbmcgaW4gZGlnaXRzIGZpZWxkLgorICAgICAge0wiMTIzRk9PNDU2NzgiLCAzLCAwfSwKKworICAgICAgLy8gVGVzdCBzdWJ0cmluZyBzdGFydGluZyBpbiBub24tZGlnaXRzIGZpZWxkLgorICAgICAge0wiMTIzRk9PNDU2NzgiLCAzLCAwfSwKKworICAgICAgLy8gVGVzdCBzdWJzdHJpbmcgc3RhcnRpbmcgaW4gZGlnaXRzIGZpZWxkIGZvbGxvd2luZyBub24tZGlnaXQgZmllbGQuCisgICAgICB7TCIxMjNGT080NTY3OCIsIDYsIDV9LAorICB9OworCisgIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpJbml0aWFsaXplKCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGNvbnNlY3V0aXZlX2RpZ2l0X2Nhc2VzKTsgKytpKSB7CisgICAgQ29uc2VjdXRpdmVEaWdpdENhc2UqIHB0ciA9ICZjb25zZWN1dGl2ZV9kaWdpdF9jYXNlc1tpXTsKKyAgICBXaWRlU3RyaW5nIGlucHV0KHB0ci0+aW5wdXQpOworICAgIGludCBhY3R1YWxfY291bnQgPQorICAgICAgICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZGV0ZXJtaW5lQ29uc2VjdXRpdmVEaWdpdENvdW50KGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0+b2Zmc2V0KTsKKyAgICBFWFBFQ1RfRVEocHRyLT5leHBlY3RlZF9jb3VudCwgYWN0dWFsX2NvdW50KSA8PCAiIGZvciBjYXNlIG51bWJlciAiIDw8IGk7CisgIH0KKyAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkZpbmFsaXplKCk7Cit9CisKK1RFU1QoUERGNDE3SGlnaExldmVsRW5jb2RlciwgQ29uc2VjdXRpdmVUZXh0Q291bnQpIHsKKyAgc3RydWN0IENvbnNlY3V0aXZlVGV4dENhc2UgeworICAgIGNvbnN0IHdjaGFyX3QqIGlucHV0OworICAgIGludCBvZmZzZXQ7CisgICAgaW50IGV4cGVjdGVkX2NvdW50OworICB9IGNvbnNlY3V0aXZlX3RleHRfY2FzZXNbXSA9IHsKKyAgICAgIC8vIEVtcHR5IHN0cmluZyBjb250YWlucyAwIGNvbnNlY3V0aXZlIHRleHQgY2hhcmFjdGVycy4KKyAgICAgIHtMIiIsIDAsIDB9LAorCisgICAgICAvLyBTaW5nbGUgdGV4dCBjaGFyYWN0ZXIgaXMgMSBjb25zZWN1dGl2ZSB0ZXh0IGNoYXJhY3RlcnMuCisgICAgICB7TCJYIiwgMCwgMX0sCisKKyAgICAgIC8vIFRyYWlsaW5nIG51bWJlcnMgY291bnQgYXMgdGV4dCBjaGFyYWN0ZXJzLgorICAgICAge0wiWDEyMyIsIDAsIDR9LAorCisgICAgICAvLyBMZWFkaW5nIG51bWJlcnMgY291bnQgYXMgdGV4dCBjaGFyYWN0ZXJzLgorICAgICAge0wiMTIzWCIsIDAsIDR9LAorCisgICAgICAvLyBFbWJlZGRlZCBsby12YWx1ZSBiaW5hcnkgY2hhcmFjdGVycyB0ZXJtaW5hdGUgdGV4dCBydW5zLgorICAgICAge0wiQUJDXHgwMDAxWFhYWCIsIDAsIDN9LAorCisgICAgICAvLyBFbWJlZGRlZCBoaS12YWx1ZSBiaW5hcnkgY2hhcmFjdGVycyB0ZXJtaW5hdGUgdGV4dCBydW5zLgorICAgICAge0wiQUJDXHgwMTAwWFhYWCIsIDAsIDN9LAorCisgICAgICAvLyBUZXh0IHJ1biBzdGlsbCBmb3VuZCBhZnRlciBpbmRleGluZyBwYXN0IGxvLXZhbHVlIGNoYXJhY3Rlci4KKyAgICAgIHtMIkFCQ1x4MDAwMVhYWFgiLCA0LCA0fSwKKworICAgICAgLy8gVGV4dCBydW4gc3RpbGwgZm91bmQgYWZ0ZXIgaW5kZXhpbmcgcGFzdCBoaS12YWx1ZSBjaGFyYWN0ZXIuCisgICAgICB7TCJBQkNceDAxMDBYWFhYIiwgNCwgNH0sCisKKyAgICAgIC8vIExlYWRpbmcgaGktdmFsdWUgY2hhcmFjdGVyIHJlc3VsdHMgaW4gMCBjb25zZWN1dGl2ZSBjaGFyYWN0ZXJzLgorICAgICAge0wiXHgwMTAwWFhYIiwgMCwgMH0sCisKKyAgICAgIC8vIFVwIHRvIDEyIG51bWJlcnMgY291bnQgYXMgdGV4dC4KKyAgICAgIHtMIjEyMzQ1Njc4OTAxMiIsIDAsIDEyfSwKKworICAgICAgLy8gMTMgb3IgbW9yZSBudW1iZXJzIGFyZSBjb21wcmVzc3NlZCB1c2luZyBudW1lcmljIGNvbXByZXNzaW9uLCBub3QgdGV4dC4KKyAgICAgIHtMIjEyMzQ1Njc4OTAxMjMiLCAwLCAwfSwKKworICAgICAgLy8gTGVhZGluZyBUZXh0IGNoYXJhY3RlciBkb2Vzbid0IGFmZmVjdCB0aGUgMTIgY2hhcmFjdGVyIGNhc2UuCisgICAgICB7TCJYMTIzNDU2Nzg5MDEyIiwgMCwgMTN9LAorCisgICAgICAvLyBMZWFkaW5nIFRleHQgY2hhcmFjdGVyIGRvZXNuJ3QgYWZmZWN0IHRoZSAxMyBjaGFyYWN0ZXIgY2FzZS4KKyAgICAgIHtMIlgxMjM0NTY3ODkwMTIzIiwgMCwgMX0sCisKKyAgICAgIC8vIEp1bXBpbmcgYmV0d2VlbiBudW1iZXJzIGFuZCBsZXR0ZXJzIHdvcmtzIHByb3Blcmx5LgorICAgICAge0wiWFhYMTIxWFhYMTIzNDU2Nzg5MDEyMzQiLCAwLCA5fSwKKyAgfTsKKworICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6SW5pdGlhbGl6ZSgpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShjb25zZWN1dGl2ZV90ZXh0X2Nhc2VzKTsgKytpKSB7CisgICAgQ29uc2VjdXRpdmVUZXh0Q2FzZSogcHRyID0gJmNvbnNlY3V0aXZlX3RleHRfY2FzZXNbaV07CisgICAgV2lkZVN0cmluZyBpbnB1dChwdHItPmlucHV0KTsKKyAgICBpbnQgYWN0dWFsX2NvdW50ID0KKyAgICAgICAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmRldGVybWluZUNvbnNlY3V0aXZlVGV4dENvdW50KGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyLT5vZmZzZXQpOworICAgIEVYUEVDVF9FUShwdHItPmV4cGVjdGVkX2NvdW50LCBhY3R1YWxfY291bnQpIDw8ICIgZm9yIGNhc2UgbnVtYmVyICIgPDwgaTsKKyAgfQorICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6RmluYWxpemUoKTsKK30KKworVEVTVChQREY0MTdIaWdoTGV2ZWxFbmNvZGVyLCBDb25zZWN1dGl2ZUJpbmFyeUNvdW50KSB7fQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdXcml0ZXIuY3BwIGIvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdXcml0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZWM5NzQKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1dyaXRlci5jcHAKQEAgLTAsMCArMSwxMTEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKKy8qCisgKiBDb3B5cmlnaHQgMjAxMiBaWGluZyBhdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1dyaXRlci5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL0JDX1R3b0RpbVdyaXRlci5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0QXJyYXkuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWF0cml4LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21wYWN0aW9uLmgiCisKK0NCQ19QREY0MTdXcml0ZXI6OkNCQ19QREY0MTdXcml0ZXIoKSB7CisgIG1fYkZpeGVkU2l6ZSA9IGZhbHNlOworfQorQ0JDX1BERjQxN1dyaXRlcjo6fkNCQ19QREY0MTdXcml0ZXIoKSB7CisgIG1fYlRydW5jYXRlZCA9IHRydWU7Cit9Citib29sIENCQ19QREY0MTdXcml0ZXI6OlNldEVycm9yQ29ycmVjdGlvbkxldmVsKGludDMyX3QgbGV2ZWwpIHsKKyAgaWYgKGxldmVsIDwgMCB8fCBsZXZlbCA+IDgpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbV9pQ29ycmVjdExldmVsID0gbGV2ZWw7CisgIHJldHVybiB0cnVlOworfQordm9pZCBDQkNfUERGNDE3V3JpdGVyOjpTZXRUcnVuY2F0ZWQoYm9vbCB0cnVuY2F0ZWQpIHsKKyAgbV9iVHJ1bmNhdGVkID0gdHJ1bmNhdGVkOworfQorCit1aW50OF90KiBDQkNfUERGNDE3V3JpdGVyOjpFbmNvZGUoY29uc3QgV2lkZVN0cmluZyYgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0KSB7CisgIENCQ19QREY0MTcgZW5jb2RlcjsKKyAgaW50MzJfdCBjb2wgPSAobV9XaWR0aCAvIG1fTW9kdWxlV2lkdGggLSA2OSkgLyAxNzsKKyAgaW50MzJfdCByb3cgPSBtX0hlaWdodCAvIChtX01vZHVsZVdpZHRoICogMjApOworICBpZiAocm93ID49IDMgJiYgcm93IDw9IDkwICYmIGNvbCA+PSAxICYmIGNvbCA8PSAzMCkKKyAgICBlbmNvZGVyLnNldERpbWVuc2lvbnMoY29sLCBjb2wsIHJvdywgcm93KTsKKyAgZWxzZSBpZiAoY29sID49IDEgJiYgY29sIDw9IDMwKQorICAgIGVuY29kZXIuc2V0RGltZW5zaW9ucyhjb2wsIGNvbCwgOTAsIDMpOworICBlbHNlIGlmIChyb3cgPj0gMyAmJiByb3cgPD0gOTApCisgICAgZW5jb2Rlci5zZXREaW1lbnNpb25zKDMwLCAxLCByb3csIHJvdyk7CisgIGlmICghZW5jb2Rlci5nZW5lcmF0ZUJhcmNvZGVMb2dpYyhjb250ZW50cywgbV9pQ29ycmVjdExldmVsKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBpbnQzMl90IGxpbmVUaGlja25lc3MgPSAyOworICBpbnQzMl90IGFzcGVjdFJhdGlvID0gNDsKKyAgQ0JDX0JhcmNvZGVNYXRyaXgqIGJhcmNvZGVNYXRyaXggPSBlbmNvZGVyLmdldEJhcmNvZGVNYXRyaXgoKTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gb3JpZ2luYWxTY2FsZSA9IGJhcmNvZGVNYXRyaXgtPmdldFNjYWxlZE1hdHJpeCgKKyAgICAgIGxpbmVUaGlja25lc3MsIGFzcGVjdFJhdGlvICogbGluZVRoaWNrbmVzcyk7CisgIGludDMyX3Qgd2lkdGggPSBvdXRXaWR0aDsKKyAgaW50MzJfdCBoZWlnaHQgPSBvdXRIZWlnaHQ7CisgIG91dFdpZHRoID0gYmFyY29kZU1hdHJpeC0+Z2V0V2lkdGgoKTsKKyAgb3V0SGVpZ2h0ID0gYmFyY29kZU1hdHJpeC0+Z2V0SGVpZ2h0KCk7CisgIGJvb2wgcm90YXRlZCA9IGZhbHNlOworICBpZiAoKGhlaWdodCA+IHdpZHRoKSBeIChvdXRXaWR0aCA8IG91dEhlaWdodCkpIHsKKyAgICByb3RhdGVBcnJheShvcmlnaW5hbFNjYWxlLCBvdXRIZWlnaHQsIG91dFdpZHRoKTsKKyAgICByb3RhdGVkID0gdHJ1ZTsKKyAgICBpbnQzMl90IHRlbXAgPSBvdXRIZWlnaHQ7CisgICAgb3V0SGVpZ2h0ID0gb3V0V2lkdGg7CisgICAgb3V0V2lkdGggPSB0ZW1wOworICB9CisgIGludDMyX3Qgc2NhbGVYID0gd2lkdGggLyBvdXRXaWR0aDsKKyAgaW50MzJfdCBzY2FsZVkgPSBoZWlnaHQgLyBvdXRIZWlnaHQ7CisgIGludDMyX3Qgc2NhbGUgPSBzdGQ6Om1pbihzY2FsZVgsIHNjYWxlWSk7CisgIGlmIChzY2FsZSA+IDEpIHsKKyAgICBvcmlnaW5hbFNjYWxlID0gYmFyY29kZU1hdHJpeC0+Z2V0U2NhbGVkTWF0cml4KAorICAgICAgICBzY2FsZSAqIGxpbmVUaGlja25lc3MsIHNjYWxlICogYXNwZWN0UmF0aW8gKiBsaW5lVGhpY2tuZXNzKTsKKyAgICBpZiAocm90YXRlZCkgeworICAgICAgcm90YXRlQXJyYXkob3JpZ2luYWxTY2FsZSwgb3V0SGVpZ2h0LCBvdXRXaWR0aCk7CisgICAgICBpbnQzMl90IHRlbXAgPSBvdXRIZWlnaHQ7CisgICAgICBvdXRIZWlnaHQgPSBvdXRXaWR0aDsKKyAgICAgIG91dFdpZHRoID0gdGVtcDsKKyAgICB9CisgIH0KKyAgdWludDhfdCogcmVzdWx0ID0gRlhfQWxsb2MyRCh1aW50OF90LCBvdXRIZWlnaHQsIG91dFdpZHRoKTsKKyAgbWVtY3B5KHJlc3VsdCwgb3JpZ2luYWxTY2FsZS5kYXRhKCksIG91dEhlaWdodCAqIG91dFdpZHRoKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBDQkNfUERGNDE3V3JpdGVyOjpyb3RhdGVBcnJheShzdGQ6OnZlY3Rvcjx1aW50OF90PiYgYml0YXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoKSB7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHRlbXAgPSBiaXRhcnJheTsKKyAgZm9yIChpbnQzMl90IGlpID0gMDsgaWkgPCBoZWlnaHQ7IGlpKyspIHsKKyAgICBpbnQzMl90IGludmVyc2VpaSA9IGhlaWdodCAtIGlpIC0gMTsKKyAgICBmb3IgKGludDMyX3QgamogPSAwOyBqaiA8IHdpZHRoOyBqaisrKSB7CisgICAgICBiaXRhcnJheVtqaiAqIGhlaWdodCArIGludmVyc2VpaV0gPSB0ZW1wW2lpICogd2lkdGggKyBqal07CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1dyaXRlci5oIGIvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjU5NjE2Ci0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdXcml0ZXIuaApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhCQVJDT0RFX1BERjQxN19CQ19QREY0MTdXUklURVJfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX1BERjQxN19CQ19QREY0MTdXUklURVJfSF8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvQkNfVHdvRGltV3JpdGVyLmgiCisKK2NsYXNzIENCQ19QREY0MTdXcml0ZXIgOiBwdWJsaWMgQ0JDX1R3b0RpbVdyaXRlciB7CisgcHVibGljOgorICBDQkNfUERGNDE3V3JpdGVyKCk7CisgIH5DQkNfUERGNDE3V3JpdGVyKCkgb3ZlcnJpZGU7CisKKyAgdWludDhfdCogRW5jb2RlKGNvbnN0IFdpZGVTdHJpbmcmIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCisgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQpOworCisgIC8vIENCQ19Ud29EaW1Xcml0ZXIKKyAgYm9vbCBTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGxldmVsKSBvdmVycmlkZTsKKworICB2b2lkIFNldFRydW5jYXRlZChib29sIHRydW5jYXRlZCk7CisKKyBwcml2YXRlOgorICB2b2lkIHJvdGF0ZUFycmF5KHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBiaXRhcnJheSwKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0KTsKKyAgYm9vbCBtX2JUcnVuY2F0ZWQ7Cit9OworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9QREY0MTdfQkNfUERGNDE3V1JJVEVSX0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZVdyaXRlci5jcHAgYi9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZVdyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzNWFmMwotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlV3JpdGVyLmNwcApAQCAtMCwwICsxLDg4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6CisvKgorICogQ29weXJpZ2h0IDIwMDggWlhpbmcgYXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZnhiYXJjb2RlL0JDX1R3b0RpbVdyaXRlci5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1Ni5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlV3JpdGVyLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRW5jb2Rlci5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTW9kZS5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlclZlcnNpb24uaCIKKworQ0JDX1FSQ29kZVdyaXRlcjo6Q0JDX1FSQ29kZVdyaXRlcigpIHsKKyAgbV9iRml4ZWRTaXplID0gdHJ1ZTsKKyAgbV9pQ29ycmVjdExldmVsID0gMTsKK30KKworQ0JDX1FSQ29kZVdyaXRlcjo6fkNCQ19RUkNvZGVXcml0ZXIoKSB7fQorCit2b2lkIENCQ19RUkNvZGVXcml0ZXI6OlJlbGVhc2VBbGwoKSB7CisgIGRlbGV0ZSBDQkNfUmVlZFNvbG9tb25HRjI1Njo6UVJDb2RlRmllbGQ7CisgIENCQ19SZWVkU29sb21vbkdGMjU2OjpRUkNvZGVGaWVsZCA9IG51bGxwdHI7CisgIGRlbGV0ZSBDQkNfUmVlZFNvbG9tb25HRjI1Njo6RGF0YU1hdHJpeEZpZWxkOworICBDQkNfUmVlZFNvbG9tb25HRjI1Njo6RGF0YU1hdHJpeEZpZWxkID0gbnVsbHB0cjsKKyAgQ0JDX1FSQ29kZXJNb2RlOjpEZXN0cm95KCk7CisgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OkRlc3Ryb3koKTsKKyAgQ0JDX1FSQ29kZXJWZXJzaW9uOjpEZXN0cm95KCk7Cit9CisKK2Jvb2wgQ0JDX1FSQ29kZVdyaXRlcjo6U2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBsZXZlbCkgeworICBpZiAobGV2ZWwgPCAwIHx8IGxldmVsID4gMykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBtX2lDb3JyZWN0TGV2ZWwgPSBsZXZlbDsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3VpbnQ4X3QqIENCQ19RUkNvZGVXcml0ZXI6OkVuY29kZShjb25zdCBXaWRlU3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVjTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0KSB7CisgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjID0gbnVsbHB0cjsKKyAgc3dpdGNoIChlY0xldmVsKSB7CisgICAgY2FzZSAwOgorICAgICAgZWMgPSBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpMOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgZWMgPSBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpNOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgZWMgPSBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpROworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgZWMgPSBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpIOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBudWxscHRyOworICB9CisgIENCQ19RUkNvZGVyIHFyOworICBpZiAoIUNCQ19RUkNvZGVyRW5jb2Rlcjo6RW5jb2RlKGNvbnRlbnRzLCBlYywgJnFyKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBvdXRXaWR0aCA9IHFyLkdldE1hdHJpeFdpZHRoKCk7CisgIG91dEhlaWdodCA9IHFyLkdldE1hdHJpeFdpZHRoKCk7CisgIHVpbnQ4X3QqIHJlc3VsdCA9IEZYX0FsbG9jMkQodWludDhfdCwgb3V0V2lkdGgsIG91dEhlaWdodCk7CisgIG1lbWNweShyZXN1bHQsIHFyLkdldE1hdHJpeCgpLT5HZXRBcnJheSgpLCBvdXRXaWR0aCAqIG91dEhlaWdodCk7CisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZVdyaXRlci5oIGIvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjNlZmM5Ci0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVXcml0ZXIuaApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVXUklURVJfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVXUklURVJfSF8KKworI2luY2x1ZGUgImZ4YmFyY29kZS9CQ19Ud29EaW1Xcml0ZXIuaCIKKworY2xhc3MgQ0JDX1R3b0RpbVdyaXRlcjsKK2NsYXNzIENCQ19RUkNvZGVXcml0ZXIgOiBwdWJsaWMgQ0JDX1R3b0RpbVdyaXRlciB7CisgcHVibGljOgorICBDQkNfUVJDb2RlV3JpdGVyKCk7CisgIH5DQkNfUVJDb2RlV3JpdGVyKCkgb3ZlcnJpZGU7CisKKyAgc3RhdGljIHZvaWQgUmVsZWFzZUFsbCgpOworCisgIHVpbnQ4X3QqIEVuY29kZShjb25zdCBXaWRlU3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgIGludDMyX3QgZWNMZXZlbCwKKyAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLAorICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0KTsKKworICAvLyBDQkNfVHdvRGltV3JpdGVyCisgIGJvb2wgU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBsZXZlbCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFV1JJVEVSX0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXIuY3BwIGIvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGEyNGZhCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyLmNwcApAQCAtMCwwICsxLDE0NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgorLyoKKyAqIENvcHlyaWdodCAyMDA4IFpYaW5nIGF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJmeGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVNYXRyaXguaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXIuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbC5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1vZGUuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvdXRpbHMuaCIKKworQ0JDX1FSQ29kZXI6OkNCQ19RUkNvZGVyKCkKKyAgICA6IG1fbW9kZShudWxscHRyKSwKKyAgICAgIG1fZWNMZXZlbChudWxscHRyKSwKKyAgICAgIG1fdmVyc2lvbigtMSksCisgICAgICBtX21hdHJpeFdpZHRoKC0xKSwKKyAgICAgIG1fbWFza1BhdHRlcm4oLTEpLAorICAgICAgbV9udW1Ub3RhbEJ5dGVzKC0xKSwKKyAgICAgIG1fbnVtRGF0YUJ5dGVzKC0xKSwKKyAgICAgIG1fbnVtRUNCeXRlcygtMSksCisgICAgICBtX251bVJTQmxvY2tzKC0xKSB7fQorCitDQkNfUVJDb2Rlcjo6fkNCQ19RUkNvZGVyKCkge30KKworQ0JDX1FSQ29kZXJNb2RlKiBDQkNfUVJDb2Rlcjo6R2V0TW9kZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fbW9kZS5HZXQoKTsKK30KKworY29uc3QgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogQ0JDX1FSQ29kZXI6OkdldEVDTGV2ZWwoKSBjb25zdCB7CisgIHJldHVybiBtX2VjTGV2ZWwuR2V0KCk7Cit9CisKK2ludDMyX3QgQ0JDX1FSQ29kZXI6OkdldFZlcnNpb24oKSBjb25zdCB7CisgIHJldHVybiBtX3ZlcnNpb247Cit9CisKK2ludDMyX3QgQ0JDX1FSQ29kZXI6OkdldE1hdHJpeFdpZHRoKCkgY29uc3QgeworICByZXR1cm4gbV9tYXRyaXhXaWR0aDsKK30KKworaW50MzJfdCBDQkNfUVJDb2Rlcjo6R2V0TWFza1BhdHRlcm4oKSBjb25zdCB7CisgIHJldHVybiBtX21hc2tQYXR0ZXJuOworfQorCitpbnQzMl90IENCQ19RUkNvZGVyOjpHZXROdW1Ub3RhbEJ5dGVzKCkgY29uc3QgeworICByZXR1cm4gbV9udW1Ub3RhbEJ5dGVzOworfQorCitpbnQzMl90IENCQ19RUkNvZGVyOjpHZXROdW1EYXRhQnl0ZXMoKSBjb25zdCB7CisgIHJldHVybiBtX251bURhdGFCeXRlczsKK30KKworaW50MzJfdCBDQkNfUVJDb2Rlcjo6R2V0TnVtRUNCeXRlcygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fbnVtRUNCeXRlczsKK30KKworaW50MzJfdCBDQkNfUVJDb2Rlcjo6R2V0TnVtUlNCbG9ja3MoKSBjb25zdCB7CisgIHJldHVybiBtX251bVJTQmxvY2tzOworfQorCitDQkNfQ29tbW9uQnl0ZU1hdHJpeCogQ0JDX1FSQ29kZXI6OkdldE1hdHJpeCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fbWF0cml4LmdldCgpOworfQorCitpbnQzMl90IENCQ19RUkNvZGVyOjpBdChpbnQzMl90IHgsIGludDMyX3QgeSwgaW50MzJfdCYgZSkgeworICBpbnQzMl90IHZhbHVlID0gbV9tYXRyaXgtPkdldCh4LCB5KTsKKyAgaWYgKCEodmFsdWUgPT0gMCB8fCB2YWx1ZSA9PSAxKSkgeworICAgIGUgPSBCQ0V4Y2VwdGlvblZhbHVlTXVzdEJlRWl0aGVyMG9yMTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gdmFsdWU7Cit9CisKK2Jvb2wgQ0JDX1FSQ29kZXI6OklzVmFsaWQoKSB7CisgIHJldHVybiBtX21vZGUgJiYgbV9lY0xldmVsICYmIG1fdmVyc2lvbiAhPSAtMSAmJiBtX21hdHJpeFdpZHRoICE9IC0xICYmCisgICAgICAgICBtX21hc2tQYXR0ZXJuICE9IC0xICYmIG1fbnVtVG90YWxCeXRlcyAhPSAtMSAmJiBtX251bURhdGFCeXRlcyAhPSAtMSAmJgorICAgICAgICAgbV9udW1FQ0J5dGVzICE9IC0xICYmIG1fbnVtUlNCbG9ja3MgIT0gLTEgJiYKKyAgICAgICAgIElzVmFsaWRNYXNrUGF0dGVybihtX21hc2tQYXR0ZXJuKSAmJgorICAgICAgICAgbV9udW1Ub3RhbEJ5dGVzID09IG1fbnVtRGF0YUJ5dGVzICsgbV9udW1FQ0J5dGVzICYmIG1fbWF0cml4ICYmCisgICAgICAgICBtX21hdHJpeFdpZHRoID09IG1fbWF0cml4LT5HZXRXaWR0aCgpICYmCisgICAgICAgICBtX21hdHJpeC0+R2V0V2lkdGgoKSA9PSBtX21hdHJpeC0+R2V0SGVpZ2h0KCk7Cit9CisKK3ZvaWQgQ0JDX1FSQ29kZXI6OlNldE1vZGUoQ0JDX1FSQ29kZXJNb2RlKiB2YWx1ZSkgeworICBtX21vZGUgPSB2YWx1ZTsKK30KKwordm9pZCBDQkNfUVJDb2Rlcjo6U2V0RUNMZXZlbChjb25zdCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsKSB7CisgIG1fZWNMZXZlbCA9IGVjTGV2ZWw7Cit9CisKK3ZvaWQgQ0JDX1FSQ29kZXI6OlNldFZlcnNpb24oaW50MzJfdCB2ZXJzaW9uKSB7CisgIG1fdmVyc2lvbiA9IHZlcnNpb247Cit9CisKK3ZvaWQgQ0JDX1FSQ29kZXI6OlNldE1hdHJpeFdpZHRoKGludDMyX3Qgd2lkdGgpIHsKKyAgbV9tYXRyaXhXaWR0aCA9IHdpZHRoOworfQorCit2b2lkIENCQ19RUkNvZGVyOjpTZXRNYXNrUGF0dGVybihpbnQzMl90IHBhdHRlcm4pIHsKKyAgbV9tYXNrUGF0dGVybiA9IHBhdHRlcm47Cit9CisKK3ZvaWQgQ0JDX1FSQ29kZXI6OlNldE51bURhdGFCeXRlcyhpbnQzMl90IGJ5dGVzKSB7CisgIG1fbnVtRGF0YUJ5dGVzID0gYnl0ZXM7Cit9CisKK3ZvaWQgQ0JDX1FSQ29kZXI6OlNldE51bVRvdGFsQnl0ZXMoaW50MzJfdCB2YWx1ZSkgeworICBtX251bVRvdGFsQnl0ZXMgPSB2YWx1ZTsKK30KKwordm9pZCBDQkNfUVJDb2Rlcjo6U2V0TnVtUlNCbG9ja3MoaW50MzJfdCBibG9jaykgeworICBtX251bVJTQmxvY2tzID0gYmxvY2s7Cit9CisKK3ZvaWQgQ0JDX1FSQ29kZXI6OlNldE51bUVDQnl0ZXMoaW50MzJfdCB2YWx1ZSkgeworICBtX251bUVDQnl0ZXMgPSB2YWx1ZTsKK30KKworYm9vbCBDQkNfUVJDb2Rlcjo6SXNWYWxpZE1hc2tQYXR0ZXJuKGludDMyX3QgbWFza1BhdHRlcm4pIHsKKyAgcmV0dXJuIG1hc2tQYXR0ZXJuID49IDAgJiYgbWFza1BhdHRlcm4gPCBrTnVtTWFza1BhdHRlcm5zOworfQorCit2b2lkIENCQ19RUkNvZGVyOjpTZXRNYXRyaXgoc3RkOjp1bmlxdWVfcHRyPENCQ19Db21tb25CeXRlTWF0cml4PiBwTWF0cml4KSB7CisgIG1fbWF0cml4ID0gc3RkOjptb3ZlKHBNYXRyaXgpOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyLmggYi9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjUzZGVkCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyLmgKQEAgLTAsMCArMSw2NSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUl9IXworI2RlZmluZSBGWEJBUkNPREVfUVJDT0RFX0JDX1FSQ09ERVJfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKKworY2xhc3MgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDsKK2NsYXNzIENCQ19RUkNvZGVyTW9kZTsKK2NsYXNzIENCQ19Db21tb25CeXRlTWF0cml4OworCitjbGFzcyBDQkNfUVJDb2RlciB7CisgcHVibGljOgorICBzdGF0aWMgY29uc3RleHByIGludDMyX3Qga051bU1hc2tQYXR0ZXJucyA9IDg7CisKKyAgQ0JDX1FSQ29kZXIoKTsKKyAgdmlydHVhbCB+Q0JDX1FSQ29kZXIoKTsKKworICBzdGF0aWMgYm9vbCBJc1ZhbGlkTWFza1BhdHRlcm4oaW50MzJfdCBtYXNrUGF0dGVybik7CisKKyAgQ0JDX1FSQ29kZXJNb2RlKiBHZXRNb2RlKCkgY29uc3Q7CisgIGNvbnN0IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIEdldEVDTGV2ZWwoKSBjb25zdDsKKyAgaW50MzJfdCBHZXRWZXJzaW9uKCkgY29uc3Q7CisgIGludDMyX3QgR2V0TWF0cml4V2lkdGgoKSBjb25zdDsKKyAgaW50MzJfdCBHZXRNYXNrUGF0dGVybigpIGNvbnN0OworICBpbnQzMl90IEdldE51bVRvdGFsQnl0ZXMoKSBjb25zdDsKKyAgaW50MzJfdCBHZXROdW1EYXRhQnl0ZXMoKSBjb25zdDsKKyAgaW50MzJfdCBHZXROdW1FQ0J5dGVzKCkgY29uc3Q7CisgIGludDMyX3QgR2V0TnVtUlNCbG9ja3MoKSBjb25zdDsKKyAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIEdldE1hdHJpeCgpIGNvbnN0OworCisgIGludDMyX3QgQXQoaW50MzJfdCB4LCBpbnQzMl90IHksIGludDMyX3QmIGUpOworICBib29sIElzVmFsaWQoKTsKKworICB2b2lkIFNldE1vZGUoQ0JDX1FSQ29kZXJNb2RlKiB2YWx1ZSk7CisgIHZvaWQgU2V0RUNMZXZlbChjb25zdCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsKTsKKyAgdm9pZCBTZXRWZXJzaW9uKGludDMyX3QgdmVyc2lvbik7CisgIHZvaWQgU2V0TWF0cml4V2lkdGgoaW50MzJfdCB3aWR0aCk7CisgIHZvaWQgU2V0TWFza1BhdHRlcm4oaW50MzJfdCBwYXR0ZXJuKTsKKyAgdm9pZCBTZXROdW1EYXRhQnl0ZXMoaW50MzJfdCBieXRlcyk7CisgIHZvaWQgU2V0TnVtVG90YWxCeXRlcyhpbnQzMl90IHZhbHVlKTsKKyAgdm9pZCBTZXROdW1FQ0J5dGVzKGludDMyX3QgdmFsdWUpOworICB2b2lkIFNldE51bVJTQmxvY2tzKGludDMyX3QgYmxvY2spOworICB2b2lkIFNldE1hdHJpeChzdGQ6OnVuaXF1ZV9wdHI8Q0JDX0NvbW1vbkJ5dGVNYXRyaXg+IHBNYXRyaXgpOworCisgcHJpdmF0ZToKKyAgVW5vd25lZFB0cjxDQkNfUVJDb2Rlck1vZGU+IG1fbW9kZTsKKyAgVW5vd25lZFB0cjxjb25zdCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsPiBtX2VjTGV2ZWw7CisgIGludDMyX3QgbV92ZXJzaW9uOworICBpbnQzMl90IG1fbWF0cml4V2lkdGg7CisgIGludDMyX3QgbV9tYXNrUGF0dGVybjsKKyAgaW50MzJfdCBtX251bVRvdGFsQnl0ZXM7CisgIGludDMyX3QgbV9udW1EYXRhQnl0ZXM7CisgIGludDMyX3QgbV9udW1FQ0J5dGVzOworICBpbnQzMl90IG1fbnVtUlNCbG9ja3M7CisgIHN0ZDo6dW5pcXVlX3B0cjxDQkNfQ29tbW9uQnl0ZU1hdHJpeD4gbV9tYXRyaXg7Cit9OworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUl9IXwpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQml0VmVjdG9yLmNwcCBiL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJpdFZlY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0MWFkMAotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJpdFZlY3Rvci5jcHAKQEAgLTAsMCArMSwxMDUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKKy8qCisgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCaXRWZWN0b3IuaCIKKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL3V0aWxzLmgiCisKK0NCQ19RUkNvZGVyQml0VmVjdG9yOjpDQkNfUVJDb2RlckJpdFZlY3RvcigpIHt9CisKK0NCQ19RUkNvZGVyQml0VmVjdG9yOjp+Q0JDX1FSQ29kZXJCaXRWZWN0b3IoKSB7fQorCitpbnQzMl90IENCQ19RUkNvZGVyQml0VmVjdG9yOjpBdChzaXplX3QgaW5kZXgsIGludDMyX3QmIGUpIGNvbnN0IHsKKyAgaWYgKGluZGV4ID49IG1fc2l6ZUluQml0cykgeworICAgIGUgPSBCQ0V4Y2VwdGlvbkJhZEluZGV4RXhjZXB0aW9uOworICAgIHJldHVybiAwOworICB9CisgIGludDMyX3QgdmFsdWUgPSBtX2FycmF5W2luZGV4ID4+IDNdICYgMHhmZjsKKyAgcmV0dXJuICh2YWx1ZSA+PiAoNyAtIChpbmRleCAmIDB4NykpKSAmIDE7Cit9CisKK3NpemVfdCBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6c2l6ZUluQnl0ZXMoKSBjb25zdCB7CisgIHJldHVybiAobV9zaXplSW5CaXRzICsgNykgPj4gMzsKK30KKworc2l6ZV90IENCQ19RUkNvZGVyQml0VmVjdG9yOjpTaXplKCkgY29uc3QgeworICByZXR1cm4gbV9zaXplSW5CaXRzOworfQorCit2b2lkIENCQ19RUkNvZGVyQml0VmVjdG9yOjpBcHBlbmRCaXQoaW50MzJfdCBiaXQpIHsKKyAgQVNTRVJUKGJpdCA9PSAwIHx8IGJpdCA9PSAxKTsKKyAgaW50MzJfdCBudW1CaXRzSW5MYXN0Qnl0ZSA9IG1fc2l6ZUluQml0cyAmIDB4NzsKKyAgaWYgKG51bUJpdHNJbkxhc3RCeXRlID09IDApIHsKKyAgICBBcHBlbmRCeXRlKDApOworICAgIG1fc2l6ZUluQml0cyAtPSA4OworICB9CisgIG1fYXJyYXlbbV9zaXplSW5CaXRzID4+IDNdIHw9IChiaXQgPDwgKDcgLSBudW1CaXRzSW5MYXN0Qnl0ZSkpOworICArK21fc2l6ZUluQml0czsKK30KKwordm9pZCBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6QXBwZW5kQml0cyhpbnQzMl90IHZhbHVlLCBpbnQzMl90IG51bUJpdHMpIHsKKyAgQVNTRVJUKG51bUJpdHMgPiAwKTsKKyAgQVNTRVJUKG51bUJpdHMgPD0gMzIpOworCisgIGludDMyX3QgbnVtQml0c0xlZnQgPSBudW1CaXRzOworICB3aGlsZSAobnVtQml0c0xlZnQgPiAwKSB7CisgICAgaWYgKChtX3NpemVJbkJpdHMgJiAweDcpID09IDAgJiYgbnVtQml0c0xlZnQgPj0gOCkgeworICAgICAgQXBwZW5kQnl0ZShzdGF0aWNfY2FzdDxpbnQ4X3Q+KCh2YWx1ZSA+PiAobnVtQml0c0xlZnQgLSA4KSkgJiAweGZmKSk7CisgICAgICBudW1CaXRzTGVmdCAtPSA4OworICAgIH0gZWxzZSB7CisgICAgICBBcHBlbmRCaXQoKHZhbHVlID4+IChudW1CaXRzTGVmdCAtIDEpKSAmIDEpOworICAgICAgLS1udW1CaXRzTGVmdDsKKyAgICB9CisgIH0KK30KKwordm9pZCBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6QXBwZW5kQml0VmVjdG9yKENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzKSB7CisgIGludDMyX3Qgc2l6ZSA9IGJpdHMtPlNpemUoKTsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgaW50IGUgPSBCQ0V4Y2VwdGlvbk5POworICAgIGludDMyX3QgbnVtID0gYml0cy0+QXQoaSwgZSk7CisgICAgQVNTRVJUKGUgPT0gQkNFeGNlcHRpb25OTyk7CisgICAgQXBwZW5kQml0KG51bSk7CisgIH0KK30KKworYm9vbCBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6WE9SKGNvbnN0IENCQ19RUkNvZGVyQml0VmVjdG9yKiBvdGhlcikgeworICBpZiAobV9zaXplSW5CaXRzICE9IG90aGVyLT5TaXplKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGNvbnN0IGF1dG8qIHBPdGhlciA9IG90aGVyLT5HZXRBcnJheSgpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVJbkJ5dGVzKCk7ICsraSkKKyAgICBtX2FycmF5W2ldIF49IHBPdGhlcltpXTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IHVpbnQ4X3QqIENCQ19RUkNvZGVyQml0VmVjdG9yOjpHZXRBcnJheSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYXJyYXkuZGF0YSgpOworfQorCit2b2lkIENCQ19RUkNvZGVyQml0VmVjdG9yOjpBcHBlbmRCeXRlKGludDhfdCB2YWx1ZSkgeworICBpZiAoKG1fc2l6ZUluQml0cyA+PiAzKSA9PSBtX2FycmF5LnNpemUoKSkKKyAgICBtX2FycmF5LnB1c2hfYmFjaygwKTsKKyAgbV9hcnJheVttX3NpemVJbkJpdHMgPj4gM10gPSB2YWx1ZTsKKyAgbV9zaXplSW5CaXRzICs9IDg7Cit9CmRpZmYgLS1naXQgYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCaXRWZWN0b3IuaCBiL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJpdFZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYmViNjAKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCaXRWZWN0b3IuaApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSQklUVkVDVE9SX0hfCisjZGVmaW5lIEZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUkJJVFZFQ1RPUl9IXworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK2NsYXNzIENCQ19RUkNvZGVyQml0VmVjdG9yIHsKKyBwdWJsaWM6CisgIENCQ19RUkNvZGVyQml0VmVjdG9yKCk7CisgIH5DQkNfUVJDb2RlckJpdFZlY3RvcigpOworCisgIGNvbnN0IHVpbnQ4X3QqIEdldEFycmF5KCkgY29uc3Q7CisgIGludDMyX3QgQXQoc2l6ZV90IGluZGV4LCBpbnQzMl90JiBlKSBjb25zdDsKKyAgc2l6ZV90IFNpemUoKSBjb25zdDsKKyAgc2l6ZV90IHNpemVJbkJ5dGVzKCkgY29uc3Q7CisKKyAgdm9pZCBBcHBlbmRCaXQoaW50MzJfdCBiaXQpOworICB2b2lkIEFwcGVuZEJpdHMoaW50MzJfdCB2YWx1ZSwgaW50MzJfdCBudW1CaXRzKTsKKyAgdm9pZCBBcHBlbmRCaXRWZWN0b3IoQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMpOworICBib29sIFhPUihjb25zdCBDQkNfUVJDb2RlckJpdFZlY3Rvciogb3RoZXIpOworCisgcHJpdmF0ZToKKyAgdm9pZCBBcHBlbmRCeXRlKGludDhfdCB2YWx1ZSk7CisKKyAgc2l6ZV90IG1fc2l6ZUluQml0cyA9IDA7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1fYXJyYXk7Cit9OworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUkJJVFZFQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQmxvY2tQYWlyLmNwcCBiL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJsb2NrUGFpci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjOTNlOQotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJsb2NrUGFpci5jcHAKQEAgLTAsMCArMSw0NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgorLyoKKyAqIENvcHlyaWdodCAyMDA4IFpYaW5nIGF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJsb2NrUGFpci5oIgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImZ4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZUFycmF5LmgiCisKK0NCQ19RUkNvZGVyQmxvY2tQYWlyOjpDQkNfUVJDb2RlckJsb2NrUGFpcigpIHt9CisKK0NCQ19RUkNvZGVyQmxvY2tQYWlyOjp+Q0JDX1FSQ29kZXJCbG9ja1BhaXIoKSB7fQorCitjb25zdCBDQkNfQ29tbW9uQnl0ZUFycmF5KiBDQkNfUVJDb2RlckJsb2NrUGFpcjo6R2V0RGF0YUJ5dGVzKCkgY29uc3QgeworICByZXR1cm4gbV9kYXRhQnl0ZXMuZ2V0KCk7Cit9CisKK2NvbnN0IENCQ19Db21tb25CeXRlQXJyYXkqIENCQ19RUkNvZGVyQmxvY2tQYWlyOjpHZXRFcnJvckNvcnJlY3Rpb25CeXRlcygpCisgICAgY29uc3QgeworICByZXR1cm4gbV9lcnJvckNvcnJlY3Rpb25CeXRlcy5nZXQoKTsKK30KKwordm9pZCBDQkNfUVJDb2RlckJsb2NrUGFpcjo6U2V0RGF0YSgKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0JDX0NvbW1vbkJ5dGVBcnJheT4gZGF0YSwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0JDX0NvbW1vbkJ5dGVBcnJheT4gZXJyb3JDb3JyZWN0aW9uKSB7CisgIG1fZGF0YUJ5dGVzID0gc3RkOjptb3ZlKGRhdGEpOworICBtX2Vycm9yQ29ycmVjdGlvbkJ5dGVzID0gc3RkOjptb3ZlKGVycm9yQ29ycmVjdGlvbik7Cit9CmRpZmYgLS1naXQgYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCbG9ja1BhaXIuaCBiL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJsb2NrUGFpci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNTcxZjMKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCbG9ja1BhaXIuaApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSQkxPQ0tQQUlSX0hfCisjZGVmaW5lIEZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUkJMT0NLUEFJUl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCitjbGFzcyBDQkNfQ29tbW9uQnl0ZUFycmF5OworCitjbGFzcyBDQkNfUVJDb2RlckJsb2NrUGFpciB7CisgcHVibGljOgorICBDQkNfUVJDb2RlckJsb2NrUGFpcigpOworICB+Q0JDX1FSQ29kZXJCbG9ja1BhaXIoKTsKKworICBjb25zdCBDQkNfQ29tbW9uQnl0ZUFycmF5KiBHZXREYXRhQnl0ZXMoKSBjb25zdDsKKyAgY29uc3QgQ0JDX0NvbW1vbkJ5dGVBcnJheSogR2V0RXJyb3JDb3JyZWN0aW9uQnl0ZXMoKSBjb25zdDsKKyAgdm9pZCBTZXREYXRhKHN0ZDo6dW5pcXVlX3B0cjxDQkNfQ29tbW9uQnl0ZUFycmF5PiBkYXRhLAorICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENCQ19Db21tb25CeXRlQXJyYXk+IGVycm9yQ29ycmVjdGlvbik7CisKKyBwcml2YXRlOgorICBzdGQ6OnVuaXF1ZV9wdHI8Q0JDX0NvbW1vbkJ5dGVBcnJheT4gbV9kYXRhQnl0ZXM7CisgIHN0ZDo6dW5pcXVlX3B0cjxDQkNfQ29tbW9uQnl0ZUFycmF5PiBtX2Vycm9yQ29ycmVjdGlvbkJ5dGVzOworfTsKKworI2VuZGlmICAvLyBGWEJBUkNPREVfUVJDT0RFX0JDX1FSQ09ERVJCTE9DS1BBSVJfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQmxvY2tzLmNwcCBiL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQmxvY2tzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGY0Njg4Ci0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCbG9ja3MuY3BwCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKKy8qCisgKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrcy5oIgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCbG9ja3NEYXRhLmgiCisKK0NCQ19RUkNvZGVyRUNCbG9ja3M6OkNCQ19RUkNvZGVyRUNCbG9ja3MoY29uc3QgQ0JDX1FSQ29kZXJFQ0Jsb2NrRGF0YSYgZGF0YSkKKyAgICA6IG1fZGF0YShkYXRhKSB7fQorCitDQkNfUVJDb2RlckVDQmxvY2tzOjp+Q0JDX1FSQ29kZXJFQ0Jsb2NrcygpIHt9CisKK2ludDMyX3QgQ0JDX1FSQ29kZXJFQ0Jsb2Nrczo6R2V0RUNDb2RlV29yZHNQZXJCbG9jaygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fZGF0YS5lY0NvZGVXb3Jkc1BlckJsb2NrOworfQorCitpbnQzMl90IENCQ19RUkNvZGVyRUNCbG9ja3M6OkdldE51bUJsb2NrcygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fZGF0YS5jb3VudDEgKyBtX2RhdGEuY291bnQyOworfQorCitpbnQzMl90IENCQ19RUkNvZGVyRUNCbG9ja3M6OkdldFRvdGFsRUNDb2RlV29yZHMoKSBjb25zdCB7CisgIHJldHVybiBHZXRFQ0NvZGVXb3Jkc1BlckJsb2NrKCkgKiBHZXROdW1CbG9ja3MoKTsKK30KKworaW50MzJfdCBDQkNfUVJDb2RlckVDQmxvY2tzOjpHZXRUb3RhbERhdGFDb2RlV29yZHMoKSBjb25zdCB7CisgIHJldHVybiBtX2RhdGEuY291bnQxICogKG1fZGF0YS5kYXRhQ29kZVdvcmRzMSArIEdldEVDQ29kZVdvcmRzUGVyQmxvY2soKSkgKworICAgICAgICAgbV9kYXRhLmNvdW50MiAqIChtX2RhdGEuZGF0YUNvZGVXb3JkczIgKyBHZXRFQ0NvZGVXb3Jkc1BlckJsb2NrKCkpOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCbG9ja3MuaCBiL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQmxvY2tzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM0ZjFjZAotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQmxvY2tzLmgKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUkVDQkxPQ0tTX0hfCisjZGVmaW5lIEZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUkVDQkxPQ0tTX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworc3RydWN0IENCQ19RUkNvZGVyRUNCbG9ja0RhdGE7CisKK2NsYXNzIENCQ19RUkNvZGVyRUNCbG9ja3MgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0JDX1FSQ29kZXJFQ0Jsb2Nrcyhjb25zdCBDQkNfUVJDb2RlckVDQmxvY2tEYXRhJiBkYXRhKTsKKyAgfkNCQ19RUkNvZGVyRUNCbG9ja3MoKTsKKworICBpbnQzMl90IEdldE51bUJsb2NrcygpIGNvbnN0OworICBpbnQzMl90IEdldFRvdGFsRUNDb2RlV29yZHMoKSBjb25zdDsKKyAgaW50MzJfdCBHZXRUb3RhbERhdGFDb2RlV29yZHMoKSBjb25zdDsKKworIHByaXZhdGU6CisgIGludDMyX3QgR2V0RUNDb2RlV29yZHNQZXJCbG9jaygpIGNvbnN0OworCisgIGNvbnN0IENCQ19RUkNvZGVyRUNCbG9ja0RhdGEmIG1fZGF0YTsKK307CisKKyNlbmRpZiAgLy8gRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSRUNCTE9DS1NfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQmxvY2tzRGF0YS5jcHAgYi9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrc0RhdGEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZmY3NDgKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrc0RhdGEuY3BwCkBAIC0wLDAgKzEsMTgwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6CisvKgorICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCbG9ja3NEYXRhLmgiCisKK2NvbnN0IENCQ19RUkNvZGVyRUNCbG9ja0RhdGEgZ19FQ0JEYXRhWzQwXVs0XSA9IHsKKyAgICB7ezcsIDEsIDE5LCAwLCAwfSwgezEwLCAxLCAxNiwgMCwgMH0sIHsxMywgMSwgMTMsIDAsIDB9LCB7MTcsIDEsIDksIDAsIDB9fSwKKyAgICB7ezEwLCAxLCAzNCwgMCwgMH0sCisgICAgIHsxNiwgMSwgMjgsIDAsIDB9LAorICAgICB7MjIsIDEsIDIyLCAwLCAwfSwKKyAgICAgezI4LCAxLCAxNiwgMCwgMH19LAorICAgIHt7MTUsIDEsIDU1LCAwLCAwfSwKKyAgICAgezI2LCAxLCA0NCwgMCwgMH0sCisgICAgIHsxOCwgMiwgMTcsIDAsIDB9LAorICAgICB7MjIsIDIsIDEzLCAwLCAwfX0sCisgICAge3syMCwgMSwgODAsIDAsIDB9LCB7MTgsIDIsIDMyLCAwLCAwfSwgezI2LCAyLCAyNCwgMCwgMH0sIHsxNiwgNCwgOSwgMCwgMH19LAorICAgIHt7MjYsIDEsIDEwOCwgMCwgMH0sCisgICAgIHsyNCwgMiwgNDMsIDAsIDB9LAorICAgICB7MTgsIDIsIDE1LCAyLCAxNn0sCisgICAgIHsyMiwgMiwgMTEsIDIsIDEyfX0sCisgICAge3sxOCwgMiwgNjgsIDAsIDB9LAorICAgICB7MTYsIDQsIDI3LCAwLCAwfSwKKyAgICAgezI0LCA0LCAxOSwgMCwgMH0sCisgICAgIHsyOCwgNCwgMTUsIDAsIDB9fSwKKyAgICB7ezIwLCAyLCA3OCwgMCwgMH0sCisgICAgIHsxOCwgNCwgMzEsIDAsIDB9LAorICAgICB7MTgsIDIsIDE0LCA0LCAxNX0sCisgICAgIHsyNiwgNCwgMTMsIDEsIDE0fX0sCisgICAge3syNCwgMiwgOTcsIDAsIDB9LAorICAgICB7MjIsIDIsIDM4LCAyLCAzOX0sCisgICAgIHsyMiwgNCwgMTgsIDIsIDE5fSwKKyAgICAgezI2LCA0LCAxNCwgMiwgMTV9fSwKKyAgICB7ezMwLCAyLCAxMTYsIDAsIDB9LAorICAgICB7MjIsIDMsIDM2LCAyLCAzN30sCisgICAgIHsyMCwgNCwgMTYsIDQsIDE3fSwKKyAgICAgezI0LCA0LCAxMiwgNCwgMTN9fSwKKyAgICB7ezE4LCAyLCA2OCwgMiwgNjl9LAorICAgICB7MjYsIDQsIDQzLCAxLCA0NH0sCisgICAgIHsyNCwgNiwgMTksIDIsIDIwfSwKKyAgICAgezI4LCA2LCAxNSwgMiwgMTZ9fSwKKyAgICB7ezIwLCA0LCA4MSwgMCwgMH0sCisgICAgIHszMCwgMSwgNTAsIDQsIDUxfSwKKyAgICAgezI4LCA0LCAyMiwgNCwgMjN9LAorICAgICB7MjQsIDMsIDEyLCA4LCAxM319LAorICAgIHt7MjQsIDIsIDkyLCAyLCA5M30sCisgICAgIHsyMiwgNiwgMzYsIDIsIDM3fSwKKyAgICAgezI2LCA0LCAyMCwgNiwgMjF9LAorICAgICB7MjgsIDcsIDE0LCA0LCAxNX19LAorICAgIHt7MjYsIDQsIDEwNywgMCwgMH0sCisgICAgIHsyMiwgOCwgMzcsIDEsIDM4fSwKKyAgICAgezI0LCA4LCAyMCwgNCwgMjF9LAorICAgICB7MjIsIDEyLCAxMSwgNCwgMTJ9fSwKKyAgICB7ezMwLCAzLCAxMTUsIDEsIDExNn0sCisgICAgIHsyNCwgNCwgNDAsIDUsIDQxfSwKKyAgICAgezIwLCAxMSwgMTYsIDUsIDE3fSwKKyAgICAgezI0LCAxMSwgMTIsIDUsIDEzfX0sCisgICAge3syMiwgNSwgODcsIDEsIDg4fSwKKyAgICAgezI0LCA1LCA0MSwgNSwgNDJ9LAorICAgICB7MzAsIDUsIDI0LCA3LCAyNX0sCisgICAgIHsyNCwgMTEsIDEyLCA3LCAxM319LAorICAgIHt7MjQsIDUsIDk4LCAxLCA5OX0sCisgICAgIHsyOCwgNywgNDUsIDMsIDQ2fSwKKyAgICAgezI0LCAxNSwgMTksIDIsIDIwfSwKKyAgICAgezMwLCAzLCAxNSwgMTMsIDE2fX0sCisgICAge3syOCwgMSwgMTA3LCA1LCAxMDh9LAorICAgICB7MjgsIDEwLCA0NiwgMSwgNDd9LAorICAgICB7MjgsIDEsIDIyLCAxNSwgMjN9LAorICAgICB7MjgsIDIsIDE0LCAxNywgMTV9fSwKKyAgICB7ezMwLCA1LCAxMjAsIDEsIDEyMX0sCisgICAgIHsyNiwgOSwgNDMsIDQsIDQ0fSwKKyAgICAgezI4LCAxNywgMjIsIDEsIDIzfSwKKyAgICAgezI4LCAyLCAxNCwgMTksIDE1fX0sCisgICAge3syOCwgMywgMTEzLCA0LCAxMTR9LAorICAgICB7MjYsIDMsIDQ0LCAxMSwgNDV9LAorICAgICB7MjYsIDE3LCAyMSwgNCwgMjJ9LAorICAgICB7MjYsIDksIDEzLCAxNiwgMTR9fSwKKyAgICB7ezI4LCAzLCAxMDcsIDUsIDEwOH0sCisgICAgIHsyNiwgMywgNDEsIDEzLCA0Mn0sCisgICAgIHszMCwgMTUsIDI0LCA1LCAyNX0sCisgICAgIHsyOCwgMTUsIDE1LCAxMCwgMTZ9fSwKKyAgICB7ezI4LCA0LCAxMTYsIDQsIDExN30sCisgICAgIHsyNiwgMTcsIDQyLCAwLCAwfSwKKyAgICAgezI4LCAxNywgMjIsIDYsIDIzfSwKKyAgICAgezMwLCAxOSwgMTYsIDYsIDE3fX0sCisgICAge3syOCwgMiwgMTExLCA3LCAxMTJ9LAorICAgICB7MjgsIDE3LCA0NiwgMCwgMH0sCisgICAgIHszMCwgNywgMjQsIDE2LCAyNX0sCisgICAgIHsyNCwgMzQsIDEzLCAwLCAwfX0sCisgICAge3szMCwgNCwgMTIxLCA1LCAxMjJ9LAorICAgICB7MjgsIDQsIDQ3LCAxNCwgNDh9LAorICAgICB7MzAsIDExLCAyNCwgMTQsIDI1fSwKKyAgICAgezMwLCAxNiwgMTUsIDE0LCAxNn19LAorICAgIHt7MzAsIDYsIDExNywgNCwgMTE4fSwKKyAgICAgezI4LCA2LCA0NSwgMTQsIDQ2fSwKKyAgICAgezMwLCAxMSwgMjQsIDE2LCAyNX0sCisgICAgIHszMCwgMzAsIDE2LCAyLCAxN319LAorICAgIHt7MjYsIDgsIDEwNiwgNCwgMTA3fSwKKyAgICAgezI4LCA4LCA0NywgMTMsIDQ4fSwKKyAgICAgezMwLCA3LCAyNCwgMjIsIDI1fSwKKyAgICAgezMwLCAyMiwgMTUsIDEzLCAxNn19LAorICAgIHt7MjgsIDEwLCAxMTQsIDIsIDExNX0sCisgICAgIHsyOCwgMTksIDQ2LCA0LCA0N30sCisgICAgIHsyOCwgMjgsIDIyLCA2LCAyM30sCisgICAgIHszMCwgMzMsIDE2LCA0LCAxN319LAorICAgIHt7MzAsIDgsIDEyMiwgNCwgMTIzfSwKKyAgICAgezI4LCAyMiwgNDUsIDMsIDQ2fSwKKyAgICAgezMwLCA4LCAyMywgMjYsIDI0fSwKKyAgICAgezMwLCAxMiwgMTUsIDI4LCAxNn19LAorICAgIHt7MzAsIDMsIDExNywgMTAsIDExOH0sCisgICAgIHsyOCwgMywgNDUsIDIzLCA0Nn0sCisgICAgIHszMCwgNCwgMjQsIDMxLCAyNX0sCisgICAgIHszMCwgMTEsIDE1LCAzMSwgMTZ9fSwKKyAgICB7ezMwLCA3LCAxMTYsIDcsIDExN30sCisgICAgIHsyOCwgMjEsIDQ1LCA3LCA0Nn0sCisgICAgIHszMCwgMSwgMjMsIDM3LCAyNH0sCisgICAgIHszMCwgMTksIDE1LCAyNiwgMTZ9fSwKKyAgICB7ezMwLCA1LCAxMTUsIDEwLCAxMTZ9LAorICAgICB7MjgsIDE5LCA0NywgMTAsIDQ4fSwKKyAgICAgezMwLCAxNSwgMjQsIDI1LCAyNX0sCisgICAgIHszMCwgMjMsIDE1LCAyNSwgMTZ9fSwKKyAgICB7ezMwLCAxMywgMTE1LCAzLCAxMTZ9LAorICAgICB7MjgsIDIsIDQ2LCAyOSwgNDd9LAorICAgICB7MzAsIDQyLCAyNCwgMSwgMjV9LAorICAgICB7MzAsIDIzLCAxNSwgMjgsIDE2fX0sCisgICAge3szMCwgMTcsIDExNSwgMCwgMH0sCisgICAgIHsyOCwgMTAsIDQ2LCAyMywgNDd9LAorICAgICB7MzAsIDEwLCAyNCwgMzUsIDI1fSwKKyAgICAgezMwLCAxOSwgMTUsIDM1LCAxNn19LAorICAgIHt7MzAsIDE3LCAxMTUsIDEsIDExNn0sCisgICAgIHsyOCwgMTQsIDQ2LCAyMSwgNDd9LAorICAgICB7MzAsIDI5LCAyNCwgMTksIDI1fSwKKyAgICAgezMwLCAxMSwgMTUsIDQ2LCAxNn19LAorICAgIHt7MzAsIDEzLCAxMTUsIDYsIDExNn0sCisgICAgIHsyOCwgMTQsIDQ2LCAyMywgNDd9LAorICAgICB7MzAsIDQ0LCAyNCwgNywgMjV9LAorICAgICB7MzAsIDU5LCAxNiwgMSwgMTd9fSwKKyAgICB7ezMwLCAxMiwgMTIxLCA3LCAxMjJ9LAorICAgICB7MjgsIDEyLCA0NywgMjYsIDQ4fSwKKyAgICAgezMwLCAzOSwgMjQsIDE0LCAyNX0sCisgICAgIHszMCwgMjIsIDE1LCA0MSwgMTZ9fSwKKyAgICB7ezMwLCA2LCAxMjEsIDE0LCAxMjJ9LAorICAgICB7MjgsIDYsIDQ3LCAzNCwgNDh9LAorICAgICB7MzAsIDQ2LCAyNCwgMTAsIDI1fSwKKyAgICAgezMwLCAyLCAxNSwgNjQsIDE2fX0sCisgICAge3szMCwgMTcsIDEyMiwgNCwgMTIzfSwKKyAgICAgezI4LCAyOSwgNDYsIDE0LCA0N30sCisgICAgIHszMCwgNDksIDI0LCAxMCwgMjV9LAorICAgICB7MzAsIDI0LCAxNSwgNDYsIDE2fX0sCisgICAge3szMCwgNCwgMTIyLCAxOCwgMTIzfSwKKyAgICAgezI4LCAxMywgNDYsIDMyLCA0N30sCisgICAgIHszMCwgNDgsIDI0LCAxNCwgMjV9LAorICAgICB7MzAsIDQyLCAxNSwgMzIsIDE2fX0sCisgICAge3szMCwgMjAsIDExNywgNCwgMTE4fSwKKyAgICAgezI4LCA0MCwgNDcsIDcsIDQ4fSwKKyAgICAgezMwLCA0MywgMjQsIDIyLCAyNX0sCisgICAgIHszMCwgMTAsIDE1LCA2NywgMTZ9fSwKKyAgICB7ezMwLCAxOSwgMTE4LCA2LCAxMTl9LAorICAgICB7MjgsIDE4LCA0NywgMzEsIDQ4fSwKKyAgICAgezMwLCAzNCwgMjQsIDM0LCAyNX0sCisgICAgIHszMCwgMjAsIDE1LCA2MSwgMTZ9fSwKK307CmRpZmYgLS1naXQgYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrc0RhdGEuaCBiL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQmxvY2tzRGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZDRjYTQKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrc0RhdGEuaApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSRUNCTE9DS1NEQVRBX0hfCisjZGVmaW5lIEZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUkVDQkxPQ0tTREFUQV9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3N0cnVjdCBDQkNfUVJDb2RlckVDQmxvY2tEYXRhIHsKKyAgdWludDhfdCBlY0NvZGVXb3Jkc1BlckJsb2NrOworICB1aW50OF90IGNvdW50MTsKKyAgdWludDhfdCBkYXRhQ29kZVdvcmRzMTsKKyAgdWludDhfdCBjb3VudDI7CisgIHVpbnQ4X3QgZGF0YUNvZGVXb3JkczI7Cit9OworCitleHRlcm4gY29uc3QgQ0JDX1FSQ29kZXJFQ0Jsb2NrRGF0YSBnX0VDQkRhdGFbNDBdWzRdOworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUkVDQkxPQ0tTREFUQV9IXwpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRW5jb2Rlci5jcHAgYi9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDRkZmMzCi0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRW5jb2Rlci5jcHAKQEAgLTAsMCArMSw2MTggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKy8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKKy8qCisgKiBDb3B5cmlnaHQgMjAwOCBaWGluZyBhdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFbmNvZGVyLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJmeGJhcmNvZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVBcnJheS5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb24uaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTYuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXIuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCbG9ja1BhaXIuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrcy5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hc2tVdGlsLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWF0cml4VXRpbC5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1vZGUuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJWZXJzaW9uLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCit1c2luZyBNb2RlU3RyaW5nUGFpciA9IHN0ZDo6cGFpcjxDQkNfUVJDb2Rlck1vZGUqLCBCeXRlU3RyaW5nPjsKKworbmFtZXNwYWNlIHsKKworLy8gVGhpcyBpcyBhIG1hcHBpbmcgZm9yIGFuIEFTQ0lJIHRhYmxlLCBzdGFydGluZyBhdCBhbiBpbmRleCBvZiAzMi4KK2NvbnN0IGludDhfdCBnX2FscGhhTnVtZXJpY1RhYmxlW10gPSB7CisgICAgMzYsIC0xLCAtMSwgLTEsIDM3LCAzOCwgLTEsIC0xLCAtMSwgLTEsIDM5LCA0MCwgLTEsIDQxLCA0MiwgNDMsICAvLyAzMi00NworICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksICA0NCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAgLy8gNDgtNjMKKyAgICAtMSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgIC8vIDY0LTc5CisgICAgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLCAzMywgMzQsIDM1fTsKKworaW50MzJfdCBHZXRBbHBoYU51bWVyaWNDb2RlKGludDMyX3QgY29kZSkgeworICBpZiAoY29kZSA8IDMyKQorICAgIHJldHVybiAtMTsKKyAgc2l6ZV90IGNvZGVfaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGNvZGUgLSAzMik7CisgIGlmIChjb2RlX2luZGV4ID49IEZYX0FycmF5U2l6ZShnX2FscGhhTnVtZXJpY1RhYmxlKSkKKyAgICByZXR1cm4gLTE7CisgIHJldHVybiBnX2FscGhhTnVtZXJpY1RhYmxlW2NvZGVfaW5kZXhdOworfQorCit2b2lkIEFwcGVuZE51bWVyaWNCeXRlcyhjb25zdCBCeXRlU3RyaW5nJiBjb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7CisgIGludDMyX3QgbGVuZ3RoID0gY29udGVudC5HZXRMZW5ndGgoKTsKKyAgaW50MzJfdCBpID0gMDsKKyAgd2hpbGUgKGkgPCBsZW5ndGgpIHsKKyAgICBpbnQzMl90IG51bTEgPSBjb250ZW50W2ldIC0gJzAnOworICAgIGlmIChpICsgMiA8IGxlbmd0aCkgeworICAgICAgaW50MzJfdCBudW0yID0gY29udGVudFtpICsgMV0gLSAnMCc7CisgICAgICBpbnQzMl90IG51bTMgPSBjb250ZW50W2kgKyAyXSAtICcwJzsKKyAgICAgIGJpdHMtPkFwcGVuZEJpdHMobnVtMSAqIDEwMCArIG51bTIgKiAxMCArIG51bTMsIDEwKTsKKyAgICAgIGkgKz0gMzsKKyAgICB9IGVsc2UgaWYgKGkgKyAxIDwgbGVuZ3RoKSB7CisgICAgICBpbnQzMl90IG51bTIgPSBjb250ZW50W2kgKyAxXSAtICcwJzsKKyAgICAgIGJpdHMtPkFwcGVuZEJpdHMobnVtMSAqIDEwICsgbnVtMiwgNyk7CisgICAgICBpICs9IDI7CisgICAgfSBlbHNlIHsKKyAgICAgIGJpdHMtPkFwcGVuZEJpdHMobnVtMSwgNCk7CisgICAgICBpKys7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQXBwZW5kQWxwaGFOdW1lcmljQnl0ZXMoY29uc3QgQnl0ZVN0cmluZyYgY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKKyAgaW50MzJfdCBsZW5ndGggPSBjb250ZW50LkdldExlbmd0aCgpOworICBpbnQzMl90IGkgPSAwOworICB3aGlsZSAoaSA8IGxlbmd0aCkgeworICAgIGludDMyX3QgY29kZTEgPSBHZXRBbHBoYU51bWVyaWNDb2RlKGNvbnRlbnRbaV0pOworICAgIGlmIChjb2RlMSA9PSAtMSkgeworICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZUNoYXJhY3RlcjsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGkgKyAxIDwgbGVuZ3RoKSB7CisgICAgICBpbnQzMl90IGNvZGUyID0gR2V0QWxwaGFOdW1lcmljQ29kZShjb250ZW50W2kgKyAxXSk7CisgICAgICBpZiAoY29kZTIgPT0gLTEpIHsKKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZUNoYXJhY3RlcjsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgYml0cy0+QXBwZW5kQml0cyhjb2RlMSAqIDQ1ICsgY29kZTIsIDExKTsKKyAgICAgIGkgKz0gMjsKKyAgICB9IGVsc2UgeworICAgICAgYml0cy0+QXBwZW5kQml0cyhjb2RlMSwgNik7CisgICAgICBpKys7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQXBwZW5kR0JLQnl0ZXMoY29uc3QgQnl0ZVN0cmluZyYgY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKKyAgaW50MzJfdCBsZW5ndGggPSBjb250ZW50LkdldExlbmd0aCgpOworICB1aW50MzJfdCB2YWx1ZSA9IDA7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAyKSB7CisgICAgdmFsdWUgPSAodWludDMyX3QpKGNvbnRlbnRbaV0gPDwgOCB8IGNvbnRlbnRbaSArIDFdKTsKKyAgICBpZiAodmFsdWUgPD0gMHhBQUZFICYmIHZhbHVlID49IDB4QTFBMSkgeworICAgICAgdmFsdWUgLT0gMHhBMUExOworICAgIH0gZWxzZSBpZiAodmFsdWUgPD0gMHhGQUZFICYmIHZhbHVlID49IDB4QjBBMSkgeworICAgICAgdmFsdWUgLT0gMHhBNkExOworICAgIH0gZWxzZSB7CisgICAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkYXRlQ2hhcmFjdGVyOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2YWx1ZSA9ICh1aW50MzJfdCkoKHZhbHVlID4+IDgpICogMHg2MCkgKyAodWludDMyX3QpKHZhbHVlICYgMHhmZik7CisgICAgYml0cy0+QXBwZW5kQml0cyh2YWx1ZSwgMTMpOworICB9Cit9CisKK3ZvaWQgQXBwZW5kOEJpdEJ5dGVzKGNvbnN0IEJ5dGVTdHJpbmcmIGNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywKKyAgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHJpbmcgZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29udGVudC5HZXRMZW5ndGgoKTsgaSsrKQorICAgIGJpdHMtPkFwcGVuZEJpdHMoY29udGVudFtpXSwgOCk7Cit9CisKK3ZvaWQgQXBwZW5kS2FuamlCeXRlcyhjb25zdCBCeXRlU3RyaW5nJiBjb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLAorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gYnl0ZXM7CisgIHVpbnQzMl90IHZhbHVlID0gMDsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBieXRlcy5zaXplKCk7IGkgKz0gMikgeworICAgIHZhbHVlID0gKHVpbnQzMl90KSgoY29udGVudFtpXSA8PCA4KSB8IGNvbnRlbnRbaSArIDFdKTsKKyAgICBpZiAodmFsdWUgPD0gMHg5ZmZjICYmIHZhbHVlID49IDB4ODE0MCkgeworICAgICAgdmFsdWUgLT0gMHg4MTQwOworICAgIH0gZWxzZSBpZiAodmFsdWUgPD0gMHhlYmJmICYmIHZhbHVlID49IDB4ZTA0MCkgeworICAgICAgdmFsdWUgLT0gMHhjMTQwOworICAgIH0gZWxzZSB7CisgICAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkYXRlQ2hhcmFjdGVyOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2YWx1ZSA9ICh1aW50MzJfdCkoKHZhbHVlID4+IDgpICogMHhjMCkgKyAodWludDMyX3QpKHZhbHVlICYgMHhmZik7CisgICAgYml0cy0+QXBwZW5kQml0cyh2YWx1ZSwgMTMpOworICB9Cit9CisKK3ZvaWQgQXBwZW5kTW9kZUluZm8oQ0JDX1FSQ29kZXJNb2RlKiBtb2RlLCBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cykgeworICBiaXRzLT5BcHBlbmRCaXRzKG1vZGUtPkdldEJpdHMoKSwgNCk7CisgIGlmIChtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0dCSykKKyAgICBiaXRzLT5BcHBlbmRCaXRzKDEsIDQpOworfQorCitib29sIEFwcGVuZExlbmd0aEluZm8oaW50MzJfdCBudW1MZXR0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2Rlck1vZGUqIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMpIHsKKyAgaW50MzJfdCBlID0gQkNFeGNlcHRpb25OTzsKKyAgY29uc3QgYXV0byogcWN2ID0gQ0JDX1FSQ29kZXJWZXJzaW9uOjpHZXRWZXJzaW9uRm9yTnVtYmVyKHZlcnNpb24pOworICBpZiAoIXFjdikKKyAgICByZXR1cm4gZmFsc2U7CisgIGludDMyX3QgbnVtQml0cyA9IG1vZGUtPkdldENoYXJhY3RlckNvdW50Qml0cyhxY3YtPkdldFZlcnNpb25OdW1iZXIoKSwgZSk7CisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAobnVtQml0cyA+ICgoMSA8PCBudW1CaXRzKSAtIDEpKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0dCSykKKyAgICBiaXRzLT5BcHBlbmRCaXRzKG51bUxldHRlcnMgLyAyLCBudW1CaXRzKTsKKyAgYml0cy0+QXBwZW5kQml0cyhudW1MZXR0ZXJzLCBudW1CaXRzKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQXBwZW5kQnl0ZXMoY29uc3QgQnl0ZVN0cmluZyYgY29udGVudCwKKyAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlLAorICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywKKyAgICAgICAgICAgICAgICAgQnl0ZVN0cmluZyBlbmNvZGluZywKKyAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgeworICBpZiAobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDKQorICAgIEFwcGVuZE51bWVyaWNCeXRlcyhjb250ZW50LCBiaXRzLCBlKTsKKyAgZWxzZSBpZiAobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUMpCisgICAgQXBwZW5kQWxwaGFOdW1lcmljQnl0ZXMoY29udGVudCwgYml0cywgZSk7CisgIGVsc2UgaWYgKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURSkKKyAgICBBcHBlbmQ4Qml0Qnl0ZXMoY29udGVudCwgYml0cywgZW5jb2RpbmcsIGUpOworICBlbHNlIGlmIChtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0tBTkpJKQorICAgIEFwcGVuZEthbmppQnl0ZXMoY29udGVudCwgYml0cywgZSk7CisgIGVsc2UgaWYgKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzR0JLKQorICAgIEFwcGVuZEdCS0J5dGVzKGNvbnRlbnQsIGJpdHMsIGUpOworICBlbHNlCisgICAgZSA9IEJDRXhjZXB0aW9uVW5zdXBwb3J0ZWRNb2RlOworfQorCitib29sIEluaXRRUkNvZGUoaW50MzJfdCBudW1JbnB1dEJ5dGVzLAorICAgICAgICAgICAgICAgIGNvbnN0IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsCisgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlLAorICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyKiBxckNvZGUpIHsKKyAgcXJDb2RlLT5TZXRFQ0xldmVsKGVjTGV2ZWwpOworICBxckNvZGUtPlNldE1vZGUobW9kZSk7CisgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8PSBDQkNfUVJDb2RlclZlcnNpb246OmtNYXhWZXJzaW9uOyArK2kpIHsKKyAgICBjb25zdCBhdXRvKiB2ZXJzaW9uID0gQ0JDX1FSQ29kZXJWZXJzaW9uOjpHZXRWZXJzaW9uRm9yTnVtYmVyKGkpOworICAgIGludDMyX3QgbnVtQnl0ZXMgPSB2ZXJzaW9uLT5HZXRUb3RhbENvZGVXb3JkcygpOworICAgIGNvbnN0IGF1dG8qIGVjQmxvY2tzID0gdmVyc2lvbi0+R2V0RUNCbG9ja3NGb3JMZXZlbCgqZWNMZXZlbCk7CisgICAgaW50MzJfdCBudW1FY0J5dGVzID0gZWNCbG9ja3MtPkdldFRvdGFsRUNDb2RlV29yZHMoKTsKKyAgICBpbnQzMl90IG51bVJTQmxvY2tzID0gZWNCbG9ja3MtPkdldE51bUJsb2NrcygpOworICAgIGludDMyX3QgbnVtRGF0YUJ5dGVzID0gbnVtQnl0ZXMgLSBudW1FY0J5dGVzOworICAgIGlmIChudW1EYXRhQnl0ZXMgPj0gbnVtSW5wdXRCeXRlcyArIDMpIHsKKyAgICAgIHFyQ29kZS0+U2V0VmVyc2lvbihpKTsKKyAgICAgIHFyQ29kZS0+U2V0TnVtVG90YWxCeXRlcyhudW1CeXRlcyk7CisgICAgICBxckNvZGUtPlNldE51bURhdGFCeXRlcyhudW1EYXRhQnl0ZXMpOworICAgICAgcXJDb2RlLT5TZXROdW1SU0Jsb2NrcyhudW1SU0Jsb2Nrcyk7CisgICAgICBxckNvZGUtPlNldE51bUVDQnl0ZXMobnVtRWNCeXRlcyk7CisgICAgICBxckNvZGUtPlNldE1hdHJpeFdpZHRoKHZlcnNpb24tPkdldERpbWVuc2lvbkZvclZlcnNpb24oKSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q0JDX0NvbW1vbkJ5dGVBcnJheT4gR2VuZXJhdGVFQ0J5dGVzKAorICAgIENCQ19Db21tb25CeXRlQXJyYXkqIGRhdGFCeXRlcywKKyAgICBpbnQzMl90IG51bUVjQnl0ZXNJbkJsb2NrKSB7CisgIGludDMyX3QgbnVtRGF0YUJ5dGVzID0gZGF0YUJ5dGVzLT5TaXplKCk7CisgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHRvRW5jb2RlKG51bURhdGFCeXRlcyArIG51bUVjQnl0ZXNJbkJsb2NrKTsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtRGF0YUJ5dGVzOyArK2kpCisgICAgdG9FbmNvZGVbaV0gPSBkYXRhQnl0ZXMtPkF0KGkpOworICBDQkNfUmVlZFNvbG9tb25FbmNvZGVyIGVuY29kZShDQkNfUmVlZFNvbG9tb25HRjI1Njo6UVJDb2RlRmllbGQpOworICBlbmNvZGUuSW5pdCgpOworICBpZiAoIWVuY29kZS5FbmNvZGUoJnRvRW5jb2RlLCBudW1FY0J5dGVzSW5CbG9jaykpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIGF1dG8gZWNCeXRlcyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDQkNfQ29tbW9uQnl0ZUFycmF5PihudW1FY0J5dGVzSW5CbG9jayk7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bUVjQnl0ZXNJbkJsb2NrOyArK2kpCisgICAgZWNCeXRlcy0+U2V0KGksIHRvRW5jb2RlW251bURhdGFCeXRlcyArIGldKTsKKyAgcmV0dXJuIGVjQnl0ZXM7Cit9CisKK2ludDMyX3QgR2V0U3BhbkJ5VmVyc2lvbihDQkNfUVJDb2Rlck1vZGUqIG1vZGVGaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2Rlck1vZGUqIG1vZGVTZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2ZXJzaW9uTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKKyAgaWYgKHZlcnNpb25OdW0gPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBpZiAobW9kZUZpcnN0ID09IENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQyAmJgorICAgICAgbW9kZVNlY29uZCA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFKSB7CisgICAgaWYgKHZlcnNpb25OdW0gPj0gMSAmJiB2ZXJzaW9uTnVtIDw9IDkpCisgICAgICByZXR1cm4gMTE7CisgICAgaWYgKHZlcnNpb25OdW0gPj0gMTAgJiYgdmVyc2lvbk51bSA8PSAyNikKKyAgICAgIHJldHVybiAxNTsKKyAgICBpZiAodmVyc2lvbk51bSA+PSAyNyAmJiB2ZXJzaW9uTnVtIDw9IENCQ19RUkNvZGVyVmVyc2lvbjo6a01heFZlcnNpb24pCisgICAgICByZXR1cm4gMTY7CisgICAgZSA9IEJDRXhjZXB0aW9uTm9TdWNoVmVyc2lvbjsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAobW9kZVNlY29uZCA9PSBDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUMgJiYKKyAgICAgIG1vZGVGaXJzdCA9PSBDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDKSB7CisgICAgaWYgKHZlcnNpb25OdW0gPj0gMSAmJiB2ZXJzaW9uTnVtIDw9IDkpCisgICAgICByZXR1cm4gMTM7CisgICAgaWYgKHZlcnNpb25OdW0gPj0gMTAgJiYgdmVyc2lvbk51bSA8PSAyNikKKyAgICAgIHJldHVybiAxNTsKKyAgICBpZiAodmVyc2lvbk51bSA+PSAyNyAmJiB2ZXJzaW9uTnVtIDw9IENCQ19RUkNvZGVyVmVyc2lvbjo6a01heFZlcnNpb24pCisgICAgICByZXR1cm4gMTc7CisgICAgZSA9IEJDRXhjZXB0aW9uTm9TdWNoVmVyc2lvbjsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAobW9kZVNlY29uZCA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFICYmCisgICAgICBtb2RlRmlyc3QgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQykgeworICAgIGlmICh2ZXJzaW9uTnVtID49IDEgJiYgdmVyc2lvbk51bSA8PSA5KQorICAgICAgcmV0dXJuIDY7CisgICAgaWYgKHZlcnNpb25OdW0gPj0gMTAgJiYgdmVyc2lvbk51bSA8PSAyNikKKyAgICAgIHJldHVybiA4OworICAgIGlmICh2ZXJzaW9uTnVtID49IDI3ICYmIHZlcnNpb25OdW0gPD0gQ0JDX1FSQ29kZXJWZXJzaW9uOjprTWF4VmVyc2lvbikKKyAgICAgIHJldHVybiA5OworICAgIGUgPSBCQ0V4Y2VwdGlvbk5vU3VjaFZlcnNpb247CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIC0xOworfQorCitpbnQzMl90IENhbGN1bGF0ZU1hc2tQZW5hbHR5KENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpIHsKKyAgcmV0dXJuIENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlMShtYXRyaXgpICsKKyAgICAgICAgIENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlMihtYXRyaXgpICsKKyAgICAgICAgIENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlMyhtYXRyaXgpICsKKyAgICAgICAgIENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlNChtYXRyaXgpOworfQorCitpbnQzMl90IENob29zZU1hc2tQYXR0ZXJuKENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKKyAgaW50MzJfdCBtaW5QZW5hbHR5ID0gNjU1MzU7CisgIGludDMyX3QgYmVzdE1hc2tQYXR0ZXJuID0gLTE7CisgIGZvciAoaW50MzJfdCBtYXNrUGF0dGVybiA9IDA7IG1hc2tQYXR0ZXJuIDwgQ0JDX1FSQ29kZXI6OmtOdW1NYXNrUGF0dGVybnM7CisgICAgICAgbWFza1BhdHRlcm4rKykgeworICAgIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6QnVpbGRNYXRyaXgoYml0cywgZWNMZXZlbCwgdmVyc2lvbiwgbWFza1BhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXgsIGUpOworICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgICByZXR1cm4gMDsKKyAgICBpbnQzMl90IHBlbmFsdHkgPSBDYWxjdWxhdGVNYXNrUGVuYWx0eShtYXRyaXgpOworICAgIGlmIChwZW5hbHR5IDwgbWluUGVuYWx0eSkgeworICAgICAgbWluUGVuYWx0eSA9IHBlbmFsdHk7CisgICAgICBiZXN0TWFza1BhdHRlcm4gPSBtYXNrUGF0dGVybjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGJlc3RNYXNrUGF0dGVybjsKK30KKwordm9pZCBHZXROdW1EYXRhQnl0ZXNBbmROdW1FQ0J5dGVzRm9yQmxvY2tJRChpbnQzMl90IG51bVRvdGFsQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRGF0YUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVJTQmxvY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJsb2NrSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG51bURhdGFCeXRlc0luQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG51bUVDQnl0ZXNJbkJsb2NrKSB7CisgIGlmIChibG9ja0lEID49IG51bVJTQmxvY2tzKQorICAgIHJldHVybjsKKworICBpbnQzMl90IG51bVJzQmxvY2tzSW5Hcm91cDIgPSBudW1Ub3RhbEJ5dGVzICUgbnVtUlNCbG9ja3M7CisgIGludDMyX3QgbnVtUnNCbG9ja3NJbkdyb3VwMSA9IG51bVJTQmxvY2tzIC0gbnVtUnNCbG9ja3NJbkdyb3VwMjsKKyAgaW50MzJfdCBudW1Ub3RhbEJ5dGVzSW5Hcm91cDEgPSBudW1Ub3RhbEJ5dGVzIC8gbnVtUlNCbG9ja3M7CisgIGludDMyX3QgbnVtVG90YWxCeXRlc0luR3JvdXAyID0gbnVtVG90YWxCeXRlc0luR3JvdXAxICsgMTsKKyAgaW50MzJfdCBudW1EYXRhQnl0ZXNJbkdyb3VwMSA9IG51bURhdGFCeXRlcyAvIG51bVJTQmxvY2tzOworICBpbnQzMl90IG51bURhdGFCeXRlc0luR3JvdXAyID0gbnVtRGF0YUJ5dGVzSW5Hcm91cDEgKyAxOworICBpbnQzMl90IG51bUVjQnl0ZXNJbkdyb3VwMSA9IG51bVRvdGFsQnl0ZXNJbkdyb3VwMSAtIG51bURhdGFCeXRlc0luR3JvdXAxOworICBpbnQzMl90IG51bUVjQnl0ZXNJbkdyb3VwMiA9IG51bVRvdGFsQnl0ZXNJbkdyb3VwMiAtIG51bURhdGFCeXRlc0luR3JvdXAyOworICBpZiAoYmxvY2tJRCA8IG51bVJzQmxvY2tzSW5Hcm91cDEpIHsKKyAgICBudW1EYXRhQnl0ZXNJbkJsb2NrID0gbnVtRGF0YUJ5dGVzSW5Hcm91cDE7CisgICAgbnVtRUNCeXRlc0luQmxvY2sgPSBudW1FY0J5dGVzSW5Hcm91cDE7CisgIH0gZWxzZSB7CisgICAgbnVtRGF0YUJ5dGVzSW5CbG9jayA9IG51bURhdGFCeXRlc0luR3JvdXAyOworICAgIG51bUVDQnl0ZXNJbkJsb2NrID0gbnVtRWNCeXRlc0luR3JvdXAyOworICB9Cit9CisKK2Jvb2wgVGVybWluYXRlQml0cyhpbnQzMl90IG51bURhdGFCeXRlcywgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMpIHsKKyAgc2l6ZV90IGNhcGFjaXR5ID0gbnVtRGF0YUJ5dGVzIDw8IDM7CisgIGlmIChiaXRzLT5TaXplKCkgPiBjYXBhY2l0eSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgNCAmJiBiaXRzLT5TaXplKCkgPCBjYXBhY2l0eTsgKytpKQorICAgIGJpdHMtPkFwcGVuZEJpdCgwKTsKKworICBpbnQzMl90IG51bUJpdHNJbkxhc3RCeXRlID0gYml0cy0+U2l6ZSgpICUgODsKKyAgaWYgKG51bUJpdHNJbkxhc3RCeXRlID4gMCkgeworICAgIGludDMyX3QgbnVtUGFkZGluZ0JpdHMgPSA4IC0gbnVtQml0c0luTGFzdEJ5dGU7CisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbnVtUGFkZGluZ0JpdHM7ICsraikKKyAgICAgIGJpdHMtPkFwcGVuZEJpdCgwKTsKKyAgfQorCisgIGlmIChiaXRzLT5TaXplKCkgJSA4ICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIGludDMyX3QgbnVtUGFkZGluZ0J5dGVzID0gbnVtRGF0YUJ5dGVzIC0gYml0cy0+c2l6ZUluQnl0ZXMoKTsKKyAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgbnVtUGFkZGluZ0J5dGVzOyArK2spCisgICAgYml0cy0+QXBwZW5kQml0cyhrICUgMiA/IDB4MTEgOiAweGVjLCA4KTsKKyAgcmV0dXJuIGJpdHMtPlNpemUoKSA9PSBjYXBhY2l0eTsKK30KKwordm9pZCBNZXJnZVN0cmluZyhzdGQ6OnZlY3RvcjxNb2RlU3RyaW5nUGFpcj4qIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgaW50MzJfdCB2ZXJzaW9uTnVtLAorICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7CisgIHNpemVfdCBtZXJnZU51bSA9IDA7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpICsgMSA8IHJlc3VsdC0+c2l6ZSgpOyBpKyspIHsKKyAgICBhdXRvJiBlbGVtZW50MSA9ICgqcmVzdWx0KVtpXTsKKyAgICBhdXRvJiBlbGVtZW50MiA9ICgqcmVzdWx0KVtpICsgMV07CisgICAgaWYgKGVsZW1lbnQxLmZpcnN0ID09IENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQykgeworICAgICAgaW50MzJfdCB0bXAgPSBHZXRTcGFuQnlWZXJzaW9uKENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFLCB2ZXJzaW9uTnVtLCBlKTsKKyAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgICAgIHJldHVybjsKKyAgICAgIGlmIChlbGVtZW50Mi5maXJzdCA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFICYmIHRtcCA+PSAwICYmCisgICAgICAgICAgZWxlbWVudDEuc2Vjb25kLkdldExlbmd0aCgpIDwgc3RhdGljX2Nhc3Q8c2l6ZV90Pih0bXApKSB7CisgICAgICAgIGVsZW1lbnQyLnNlY29uZCA9IGVsZW1lbnQxLnNlY29uZCArIGVsZW1lbnQyLnNlY29uZDsKKyAgICAgICAgcmVzdWx0LT5lcmFzZShyZXN1bHQtPmJlZ2luKCkgKyBpKTsKKyAgICAgICAgaS0tOworICAgICAgICBtZXJnZU51bSsrOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZWxlbWVudDEuZmlyc3QgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURSkgeworICAgICAgaWYgKGVsZW1lbnQyLmZpcnN0ID09IENCQ19RUkNvZGVyTW9kZTo6c0JZVEUpIHsKKyAgICAgICAgZWxlbWVudDEuc2Vjb25kICs9IGVsZW1lbnQyLnNlY29uZDsKKyAgICAgICAgcmVzdWx0LT5lcmFzZShyZXN1bHQtPmJlZ2luKCkgKyBpICsgMSk7CisgICAgICAgIGktLTsKKyAgICAgICAgbWVyZ2VOdW0rKzsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGVsZW1lbnQxLmZpcnN0ID09IENCQ19RUkNvZGVyTW9kZTo6c05VTUVSSUMpIHsKKyAgICAgIGludDMyX3QgdG1wID0gR2V0U3BhbkJ5VmVyc2lvbihDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyTW9kZTo6c0JZVEUsIHZlcnNpb25OdW0sIGUpOworICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKKyAgICAgICAgcmV0dXJuOworICAgICAgaWYgKGVsZW1lbnQyLmZpcnN0ID09IENCQ19RUkNvZGVyTW9kZTo6c0JZVEUgJiYgdG1wID49IDAgJiYKKyAgICAgICAgICBlbGVtZW50MS5zZWNvbmQuR2V0TGVuZ3RoKCkgPCBzdGF0aWNfY2FzdDxzaXplX3Q+KHRtcCkpIHsKKyAgICAgICAgZWxlbWVudDIuc2Vjb25kID0gZWxlbWVudDEuc2Vjb25kICsgZWxlbWVudDIuc2Vjb25kOworICAgICAgICByZXN1bHQtPmVyYXNlKHJlc3VsdC0+YmVnaW4oKSArIGkpOworICAgICAgICBpLS07CisgICAgICAgIG1lcmdlTnVtKys7CisgICAgICB9CisgICAgICB0bXAgPSBHZXRTcGFuQnlWZXJzaW9uKENCQ19RUkNvZGVyTW9kZTo6c05VTUVSSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQywgdmVyc2lvbk51bSwgZSk7CisgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgICAgICByZXR1cm47CisgICAgICBpZiAoZWxlbWVudDIuZmlyc3QgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQUxQSEFOVU1FUklDICYmIHRtcCA+PSAwICYmCisgICAgICAgICAgZWxlbWVudDEuc2Vjb25kLkdldExlbmd0aCgpIDwgc3RhdGljX2Nhc3Q8c2l6ZV90Pih0bXApKSB7CisgICAgICAgIGVsZW1lbnQyLnNlY29uZCA9IGVsZW1lbnQxLnNlY29uZCArIGVsZW1lbnQyLnNlY29uZDsKKyAgICAgICAgcmVzdWx0LT5lcmFzZShyZXN1bHQtPmJlZ2luKCkgKyBpKTsKKyAgICAgICAgaS0tOworICAgICAgICBtZXJnZU51bSsrOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAobWVyZ2VOdW0gIT0gMCkKKyAgICBNZXJnZVN0cmluZyhyZXN1bHQsIHZlcnNpb25OdW0sIGUpOworfQorCit2b2lkIFNwbGl0U3RyaW5nKGNvbnN0IEJ5dGVTdHJpbmcmIGNvbnRlbnQsCisgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1vZGVTdHJpbmdQYWlyPiogcmVzdWx0KSB7CisgIHNpemVfdCBpbmRleCA9IDA7CisgIHdoaWxlIChpbmRleCA8IGNvbnRlbnQuR2V0TGVuZ3RoKCkpIHsKKyAgICB1aW50OF90IGMgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb250ZW50W2luZGV4XSk7CisgICAgaWYgKCEoKGMgPj0gMHhBMSAmJiBjIDw9IDB4QUEpIHx8IChjID49IDB4QjAgJiYgYyA8PSAweEZBKSkpCisgICAgICBicmVhazsKKyAgICBpbmRleCArPSAyOworICB9CisgIGlmIChpbmRleCkKKyAgICByZXN1bHQtPnB1c2hfYmFjayh7Q0JDX1FSQ29kZXJNb2RlOjpzR0JLLCBjb250ZW50LkxlZnQoaW5kZXgpfSk7CisgIGlmIChpbmRleCA+PSBjb250ZW50LkdldExlbmd0aCgpKQorICAgIHJldHVybjsKKworICBzaXplX3QgZmxhZyA9IGluZGV4OworICB3aGlsZSAoR2V0QWxwaGFOdW1lcmljQ29kZShjb250ZW50W2luZGV4XSkgPT0gLTEgJiYKKyAgICAgICAgIGluZGV4IDwgY29udGVudC5HZXRMZW5ndGgoKSkgeworICAgIHVpbnQ4X3QgYyA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbnRlbnRbaW5kZXhdKTsKKyAgICBpZiAoKChjID49IDB4QTEgJiYgYyA8PSAweEFBKSB8fCAoYyA+PSAweEIwICYmIGMgPD0gMHhGQSkpKQorICAgICAgYnJlYWs7CisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KKyAgICBib29sIGhpZ2ggPSAhIUlzREJDU0xlYWRCeXRlKGNvbnRlbnRbaW5kZXhdKTsKKyNlbHNlCisgICAgYm9vbCBoaWdoID0gY29udGVudFtpbmRleF0gPiAxMjc7CisjZW5kaWYKKyAgICArK2luZGV4OworICAgIGlmIChoaWdoKQorICAgICAgKytpbmRleDsKKyAgfQorICBpZiAoaW5kZXggIT0gZmxhZykgeworICAgIHJlc3VsdC0+cHVzaF9iYWNrKAorICAgICAgICB7Q0JDX1FSQ29kZXJNb2RlOjpzQllURSwgY29udGVudC5NaWQoZmxhZywgaW5kZXggLSBmbGFnKX0pOworICB9CisgIGZsYWcgPSBpbmRleDsKKyAgaWYgKGluZGV4ID49IGNvbnRlbnQuR2V0TGVuZ3RoKCkpCisgICAgcmV0dXJuOworCisgIHdoaWxlIChpbmRleCA8IGNvbnRlbnQuR2V0TGVuZ3RoKCkgJiYgaXNkaWdpdChjb250ZW50W2luZGV4XSkpCisgICAgKytpbmRleDsKKworICBpZiAoaW5kZXggIT0gZmxhZykgeworICAgIHJlc3VsdC0+cHVzaF9iYWNrKAorICAgICAgICB7Q0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQywgY29udGVudC5NaWQoZmxhZywgaW5kZXggLSBmbGFnKX0pOworICB9CisgIGZsYWcgPSBpbmRleDsKKyAgaWYgKGluZGV4ID49IGNvbnRlbnQuR2V0TGVuZ3RoKCkpCisgICAgcmV0dXJuOworCisgIHdoaWxlIChpbmRleCA8IGNvbnRlbnQuR2V0TGVuZ3RoKCkgJiYKKyAgICAgICAgIEdldEFscGhhTnVtZXJpY0NvZGUoY29udGVudFtpbmRleF0pICE9IC0xKSB7CisgICAgKytpbmRleDsKKyAgfQorICBpZiAoaW5kZXggIT0gZmxhZykgeworICAgIHJlc3VsdC0+cHVzaF9iYWNrKAorICAgICAgICB7Q0JDX1FSQ29kZXJNb2RlOjpzQUxQSEFOVU1FUklDLCBjb250ZW50Lk1pZChmbGFnLCBpbmRleCAtIGZsYWcpfSk7CisgIH0KKyAgZmxhZyA9IGluZGV4OworICBpZiAoaW5kZXggPCBjb250ZW50LkdldExlbmd0aCgpKQorICAgIFNwbGl0U3RyaW5nKGNvbnRlbnQuUmlnaHQoY29udGVudC5HZXRMZW5ndGgoKSAtIGluZGV4KSwgcmVzdWx0KTsKK30KKworQ0JDX1FSQ29kZXJNb2RlKiBDaG9vc2VNb2RlKGNvbnN0IEJ5dGVTdHJpbmcmIGNvbnRlbnQsIEJ5dGVTdHJpbmcgZW5jb2RpbmcpIHsKKyAgaWYgKGVuY29kaW5nLkNvbXBhcmUoIlNISUZUX0pJUyIpID09IDApCisgICAgcmV0dXJuIENCQ19RUkNvZGVyTW9kZTo6c0tBTkpJOworCisgIGJvb2wgaGFzTnVtZXJpYyA9IGZhbHNlOworICBib29sIGhhc0FscGhhTnVtZXJpYyA9IGZhbHNlOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbnRlbnQuR2V0TGVuZ3RoKCk7IGkrKykgeworICAgIGlmIChpc2RpZ2l0KGNvbnRlbnRbaV0pKSB7CisgICAgICBoYXNOdW1lcmljID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKEdldEFscGhhTnVtZXJpY0NvZGUoY29udGVudFtpXSkgIT0gLTEpIHsKKyAgICAgIGhhc0FscGhhTnVtZXJpYyA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFOworICAgIH0KKyAgfQorICBpZiAoaGFzQWxwaGFOdW1lcmljKQorICAgIHJldHVybiBDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUM7CisgIGlmIChoYXNOdW1lcmljKQorICAgIHJldHVybiBDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDOworICByZXR1cm4gQ0JDX1FSQ29kZXJNb2RlOjpzQllURTsKK30KKworYm9vbCBJbnRlcmxlYXZlV2l0aEVDQnl0ZXMoQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVRvdGFsQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bURhdGFCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtUlNCbG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogcmVzdWx0KSB7CisgIEFTU0VSVChudW1Ub3RhbEJ5dGVzID49IDApOworICBBU1NFUlQobnVtRGF0YUJ5dGVzID49IDApOworICBpZiAoYml0cy0+c2l6ZUluQnl0ZXMoKSAhPSBzdGF0aWNfY2FzdDxzaXplX3Q+KG51bURhdGFCeXRlcykpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGludDMyX3QgZGF0YUJ5dGVzT2Zmc2V0ID0gMDsKKyAgaW50MzJfdCBtYXhOdW1EYXRhQnl0ZXMgPSAwOworICBpbnQzMl90IG1heE51bUVjQnl0ZXMgPSAwOworICBzdGQ6OnZlY3RvcjxDQkNfUVJDb2RlckJsb2NrUGFpcj4gYmxvY2tzKG51bVJTQmxvY2tzKTsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtUlNCbG9ja3M7IGkrKykgeworICAgIGludDMyX3QgbnVtRGF0YUJ5dGVzSW5CbG9jazsKKyAgICBpbnQzMl90IG51bUVjQnl0ZXNJbkJsb3NrOworICAgIEdldE51bURhdGFCeXRlc0FuZE51bUVDQnl0ZXNGb3JCbG9ja0lEKG51bVRvdGFsQnl0ZXMsIG51bURhdGFCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1SU0Jsb2NrcywgaSwgbnVtRGF0YUJ5dGVzSW5CbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1FY0J5dGVzSW5CbG9zayk7CisgICAgYXV0byBkYXRhQnl0ZXMgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0JDX0NvbW1vbkJ5dGVBcnJheT4oKTsKKyAgICBkYXRhQnl0ZXMtPlNldChiaXRzLT5HZXRBcnJheSgpLCBkYXRhQnl0ZXNPZmZzZXQsIG51bURhdGFCeXRlc0luQmxvY2spOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDQkNfQ29tbW9uQnl0ZUFycmF5PiBlY0J5dGVzID0KKyAgICAgICAgR2VuZXJhdGVFQ0J5dGVzKGRhdGFCeXRlcy5nZXQoKSwgbnVtRWNCeXRlc0luQmxvc2spOworICAgIGlmICghZWNCeXRlcykKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIG1heE51bURhdGFCeXRlcyA9IHN0ZDo6bWF4KG1heE51bURhdGFCeXRlcywgZGF0YUJ5dGVzLT5TaXplKCkpOworICAgIG1heE51bUVjQnl0ZXMgPSBzdGQ6Om1heChtYXhOdW1FY0J5dGVzLCBlY0J5dGVzLT5TaXplKCkpOworICAgIGJsb2Nrc1tpXS5TZXREYXRhKHN0ZDo6bW92ZShkYXRhQnl0ZXMpLCBzdGQ6Om1vdmUoZWNCeXRlcykpOworICAgIGRhdGFCeXRlc09mZnNldCArPSBudW1EYXRhQnl0ZXNJbkJsb2NrOworICB9CisgIGlmIChudW1EYXRhQnl0ZXMgIT0gZGF0YUJ5dGVzT2Zmc2V0KQorICAgIHJldHVybiBmYWxzZTsKKworICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBtYXhOdW1EYXRhQnl0ZXM7IHgrKykgeworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgYmxvY2tzLnNpemUoKTsgaisrKSB7CisgICAgICBjb25zdCBDQkNfQ29tbW9uQnl0ZUFycmF5KiBkYXRhQnl0ZXMgPSBibG9ja3Nbal0uR2V0RGF0YUJ5dGVzKCk7CisgICAgICBpZiAoeCA8IGRhdGFCeXRlcy0+U2l6ZSgpKQorICAgICAgICByZXN1bHQtPkFwcGVuZEJpdHMoZGF0YUJ5dGVzLT5BdCh4KSwgOCk7CisgICAgfQorICB9CisgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IG1heE51bUVjQnl0ZXM7IHkrKykgeworICAgIGZvciAoc2l6ZV90IGwgPSAwOyBsIDwgYmxvY2tzLnNpemUoKTsgbCsrKSB7CisgICAgICBjb25zdCBDQkNfQ29tbW9uQnl0ZUFycmF5KiBlY0J5dGVzID0gYmxvY2tzW2xdLkdldEVycm9yQ29ycmVjdGlvbkJ5dGVzKCk7CisgICAgICBpZiAoeSA8IGVjQnl0ZXMtPlNpemUoKSkKKyAgICAgICAgcmVzdWx0LT5BcHBlbmRCaXRzKGVjQnl0ZXMtPkF0KHkpLCA4KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PHNpemVfdD4obnVtVG90YWxCeXRlcykgPT0gcmVzdWx0LT5zaXplSW5CeXRlcygpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQ0JDX1FSQ29kZXJFbmNvZGVyOjpDQkNfUVJDb2RlckVuY29kZXIoKSB7fQorCitDQkNfUVJDb2RlckVuY29kZXI6On5DQkNfUVJDb2RlckVuY29kZXIoKSB7fQorCisvLyBzdGF0aWMKK2Jvb2wgQ0JDX1FSQ29kZXJFbmNvZGVyOjpFbmNvZGUoY29uc3QgV2lkZVN0cmluZyYgY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXIqIHFyQ29kZSkgeworICBCeXRlU3RyaW5nIGVuY29kaW5nID0gInV0ZjgiOworICBCeXRlU3RyaW5nIHV0ZjhEYXRhOworICBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OlVuaWNvZGVUb1VURjgoY29udGVudCwgdXRmOERhdGEpOworICBDQkNfUVJDb2Rlck1vZGUqIG1vZGUgPSBDaG9vc2VNb2RlKHV0ZjhEYXRhLCBlbmNvZGluZyk7CisgIENCQ19RUkNvZGVyQml0VmVjdG9yIGRhdGFCaXRzOworICBpbnQzMl90IGUgPSBCQ0V4Y2VwdGlvbk5POworICBBcHBlbmRCeXRlcyh1dGY4RGF0YSwgbW9kZSwgJmRhdGFCaXRzLCBlbmNvZGluZywgZSk7CisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgcmV0dXJuIGZhbHNlOworICBpbnQzMl90IG51bUlucHV0Qnl0ZXMgPSBkYXRhQml0cy5zaXplSW5CeXRlcygpOworICBpZiAoIUluaXRRUkNvZGUobnVtSW5wdXRCeXRlcywgZWNMZXZlbCwgbW9kZSwgcXJDb2RlKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIENCQ19RUkNvZGVyQml0VmVjdG9yIGhlYWRlckFuZERhdGFCaXRzOworICBBcHBlbmRNb2RlSW5mbyhtb2RlLCAmaGVhZGVyQW5kRGF0YUJpdHMpOworICBpbnQzMl90IG51bUxldHRlcnMgPSBtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0JZVEUgPyBkYXRhQml0cy5zaXplSW5CeXRlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbnRlbnQuR2V0TGVuZ3RoKCk7CisgIGlmICghQXBwZW5kTGVuZ3RoSW5mbyhudW1MZXR0ZXJzLCBxckNvZGUtPkdldFZlcnNpb24oKSwgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZoZWFkZXJBbmREYXRhQml0cykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaGVhZGVyQW5kRGF0YUJpdHMuQXBwZW5kQml0VmVjdG9yKCZkYXRhQml0cyk7CisgIGlmICghVGVybWluYXRlQml0cyhxckNvZGUtPkdldE51bURhdGFCeXRlcygpLCAmaGVhZGVyQW5kRGF0YUJpdHMpKQorICAgIHJldHVybiBmYWxzZTsKKyAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgZmluYWxCaXRzOworICBpZiAoIUludGVybGVhdmVXaXRoRUNCeXRlcygmaGVhZGVyQW5kRGF0YUJpdHMsIHFyQ29kZS0+R2V0TnVtVG90YWxCeXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxckNvZGUtPkdldE51bURhdGFCeXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxckNvZGUtPkdldE51bVJTQmxvY2tzKCksICZmaW5hbEJpdHMpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYXV0byBtYXRyaXggPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0JDX0NvbW1vbkJ5dGVNYXRyaXg+KAorICAgICAgcXJDb2RlLT5HZXRNYXRyaXhXaWR0aCgpLCBxckNvZGUtPkdldE1hdHJpeFdpZHRoKCkpOworICBtYXRyaXgtPkluaXQoKTsKKyAgaW50MzJfdCBtYXNrUGF0dGVybiA9IENob29zZU1hc2tQYXR0ZXJuKAorICAgICAgJmZpbmFsQml0cywgcXJDb2RlLT5HZXRFQ0xldmVsKCksIHFyQ29kZS0+R2V0VmVyc2lvbigpLCBtYXRyaXguZ2V0KCksIGUpOworICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgIHJldHVybiBmYWxzZTsKKworICBxckNvZGUtPlNldE1hc2tQYXR0ZXJuKG1hc2tQYXR0ZXJuKTsKKyAgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpCdWlsZE1hdHJpeCgmZmluYWxCaXRzLCBxckNvZGUtPkdldEVDTGV2ZWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxckNvZGUtPkdldFZlcnNpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxckNvZGUtPkdldE1hc2tQYXR0ZXJuKCksIG1hdHJpeC5nZXQoKSwgZSk7CisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgcmV0dXJuIGZhbHNlOworCisgIHFyQ29kZS0+U2V0TWF0cml4KHN0ZDo6bW92ZShtYXRyaXgpKTsKKyAgcmV0dXJuIHFyQ29kZS0+SXNWYWxpZCgpOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRW5jb2Rlci5oIGIvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhY2JkMWIKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFbmNvZGVyLmgKQEAgLTAsMCArMSwyOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUkVOQ09ERVJfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSRU5DT0RFUl9IXworCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorCitjbGFzcyBDQkNfUVJDb2RlcjsKK2NsYXNzIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw7CisKK2NsYXNzIENCQ19RUkNvZGVyRW5jb2RlciB7CisgcHVibGljOgorICBDQkNfUVJDb2RlckVuY29kZXIoKTsKKyAgfkNCQ19RUkNvZGVyRW5jb2RlcigpOworCisgIHN0YXRpYyBib29sIEVuY29kZShjb25zdCBXaWRlU3RyaW5nJiBjb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyKiBxckNvZGUpOworfTsKKworI2VuZGlmICAvLyBGWEJBUkNPREVfUVJDT0RFX0JDX1FSQ09ERVJFTkNPREVSX0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbC5jcHAgYi9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiMzIzMwotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmNwcApAQCAtMCwwICsxLDg0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6CisvKgorICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaCIKKworQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6TCA9IG51bGxwdHI7CitDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpNID0gbnVsbHB0cjsKK0NCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OlEgPSBudWxscHRyOworQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6SCA9IG51bGxwdHI7CisKK0NCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OkNCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwoCisgICAgaW50MzJfdCBvcmRpbmFsLAorICAgIGludDMyX3QgYml0cywKKyAgICBjb25zdCBjaGFyKiBuYW1lKQorICAgIDogbV9vcmRpbmFsKG9yZGluYWwpLCBtX2JpdHMoYml0cyksIG1fbmFtZShuYW1lKSB7fQorCitDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjp+Q0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCgpIHt9CisKK3ZvaWQgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6SW5pdGlhbGl6ZSgpIHsKKyAgTCA9IG5ldyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKDAsIDB4MDEsICJMIik7CisgIE0gPSBuZXcgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCgxLCAweDAwLCAiTSIpOworICBRID0gbmV3IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwoMiwgMHgwMywgIlEiKTsKKyAgSCA9IG5ldyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKDMsIDB4MDIsICJIIik7Cit9CisKK3ZvaWQgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6RmluYWxpemUoKSB7CisgIGRlbGV0ZSBMOworICBkZWxldGUgTTsKKyAgZGVsZXRlIFE7CisgIGRlbGV0ZSBIOworfQorCitDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpGb3JCaXRzKAorICAgIGludDMyX3QgYml0cykgeworICBzd2l0Y2ggKGJpdHMpIHsKKyAgICBjYXNlIDB4MDA6CisgICAgICByZXR1cm4gTTsKKyAgICBjYXNlIDB4MDE6CisgICAgICByZXR1cm4gTDsKKyAgICBjYXNlIDB4MDI6CisgICAgICByZXR1cm4gSDsKKyAgICBjYXNlIDB4MDM6CisgICAgICByZXR1cm4gUTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KK30KK3ZvaWQgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6RGVzdHJveSgpIHsKKyAgaWYgKEwpIHsKKyAgICBkZWxldGUgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6TDsKKyAgICBMID0gbnVsbHB0cjsKKyAgfQorICBpZiAoTSkgeworICAgIGRlbGV0ZSBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpNOworICAgIE0gPSBudWxscHRyOworICB9CisgIGlmIChIKSB7CisgICAgZGVsZXRlIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6Okg7CisgICAgSCA9IG51bGxwdHI7CisgIH0KKyAgaWYgKFEpIHsKKyAgICBkZWxldGUgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6UTsKKyAgICBRID0gbnVsbHB0cjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaCBiL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3NTYzYwotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmgKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUkVSUk9SQ09SUkVDVElPTkxFVkVMX0hfCisjZGVmaW5lIEZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUkVSUk9SQ09SUkVDVElPTkxFVkVMX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorCitjbGFzcyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBMOworICBzdGF0aWMgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogTTsKKyAgc3RhdGljIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIFE7CisgIHN0YXRpYyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBIOworCisgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsKKyAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsKKyAgc3RhdGljIHZvaWQgRGVzdHJveSgpOworICBzdGF0aWMgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogRm9yQml0cyhpbnQzMl90IGJpdHMpOworCisgIH5DQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKCk7CisKKyAgaW50MzJfdCBPcmRpbmFsKCkgY29uc3QgeyByZXR1cm4gbV9vcmRpbmFsOyB9CisgIGludDMyX3QgR2V0Qml0cygpIGNvbnN0IHsgcmV0dXJuIG1fYml0czsgfQorICBCeXRlU3RyaW5nIEdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtX25hbWU7IH0KKworIHByaXZhdGU6CisgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBvcmRpbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lKTsKKyAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCgpOworCisgIGludDMyX3QgbV9vcmRpbmFsOworICBpbnQzMl90IG1fYml0czsKKyAgQnl0ZVN0cmluZyBtX25hbWU7Cit9OworCisjZW5kaWYgIC8vIEZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUkVSUk9SQ09SUkVDVElPTkxFVkVMX0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNYXNrVXRpbC5jcHAgYi9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNYXNrVXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmMWU0YwotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hc2tVdGlsLmNwcApAQCAtMCwwICsxLDE5OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgorLyoKKyAqIENvcHlyaWdodCAyMDA4IFpYaW5nIGF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImZ4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlci5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWFza1V0aWwuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvdXRpbHMuaCIKKworQ0JDX1FSQ29kZXJNYXNrVXRpbDo6Q0JDX1FSQ29kZXJNYXNrVXRpbCgpIHt9CitDQkNfUVJDb2Rlck1hc2tVdGlsOjp+Q0JDX1FSQ29kZXJNYXNrVXRpbCgpIHt9CitpbnQzMl90IENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlMSgKKyAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4KSB7CisgIHJldHVybiBBcHBseU1hc2tQZW5hbHR5UnVsZTFJbnRlcm5hbChtYXRyaXgsIHRydWUpICsKKyAgICAgICAgIEFwcGx5TWFza1BlbmFsdHlSdWxlMUludGVybmFsKG1hdHJpeCwgZmFsc2UpOworfQorCitpbnQzMl90IENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlMigKKyAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4KSB7CisgIGludDMyX3QgcGVuYWx0eSA9IDA7CisgIHVpbnQ4X3QqIGFycmF5ID0gbWF0cml4LT5HZXRBcnJheSgpOworICBpbnQzMl90IHdpZHRoID0gbWF0cml4LT5HZXRXaWR0aCgpOworICBpbnQzMl90IGhlaWdodCA9IG1hdHJpeC0+R2V0SGVpZ2h0KCk7CisgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IGhlaWdodCAtIDE7IHkrKykgeworICAgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IHdpZHRoIC0gMTsgeCsrKSB7CisgICAgICBpbnQzMl90IHZhbHVlID0gYXJyYXlbeSAqIHdpZHRoICsgeF07CisgICAgICBpZiAodmFsdWUgPT0gYXJyYXlbeSAqIHdpZHRoICsgeCArIDFdICYmCisgICAgICAgICAgdmFsdWUgPT0gYXJyYXlbKHkgKyAxKSAqIHdpZHRoICsgeF0gJiYKKyAgICAgICAgICB2YWx1ZSA9PSBhcnJheVsoeSArIDEpICogd2lkdGggKyB4ICsgMV0pIHsKKyAgICAgICAgcGVuYWx0eSsrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMyAqIHBlbmFsdHk7Cit9CisKK2ludDMyX3QgQ0JDX1FSQ29kZXJNYXNrVXRpbDo6QXBwbHlNYXNrUGVuYWx0eVJ1bGUzKAorICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpIHsKKyAgaW50MzJfdCBwZW5hbHR5ID0gMDsKKyAgdWludDhfdCogYXJyYXkgPSBtYXRyaXgtPkdldEFycmF5KCk7CisgIGludDMyX3Qgd2lkdGggPSBtYXRyaXgtPkdldFdpZHRoKCk7CisgIGludDMyX3QgaGVpZ2h0ID0gbWF0cml4LT5HZXRIZWlnaHQoKTsKKyAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgICBpZiAoeCA9PSAwICYmCisgICAgICAgICAgKCh5ID49IDAgJiYgeSA8PSA2KSB8fCAoeSA+PSBoZWlnaHQgLSA3ICYmIHkgPD0gaGVpZ2h0IC0gMSkpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHggPT0gd2lkdGggLSA3ICYmICh5ID49IDAgJiYgeSA8PSA2KSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmICh5ID09IDAgJiYKKyAgICAgICAgICAoKHggPj0gMCAmJiB4IDw9IDYpIHx8ICh4ID49IHdpZHRoIC0gNyAmJiB4IDw9IHdpZHRoIC0gMSkpKSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHkgPT0gaGVpZ2h0IC0gNyAmJiAoeCA+PSAwICYmIHggPD0gNikpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoeCArIDYgPCB3aWR0aCAmJiBhcnJheVt5ICogd2lkdGggKyB4XSA9PSAxICYmCisgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCArIDFdID09IDAgJiYgYXJyYXlbeSAqIHdpZHRoICsgeCArIDJdID09IDEgJiYKKyAgICAgICAgICBhcnJheVt5ICogd2lkdGggKyB4ICsgM10gPT0gMSAmJiBhcnJheVt5ICogd2lkdGggKyB4ICsgNF0gPT0gMSAmJgorICAgICAgICAgIGFycmF5W3kgKiB3aWR0aCArIHggKyA1XSA9PSAwICYmIGFycmF5W3kgKiB3aWR0aCArIHggKyA2XSA9PSAxICYmCisgICAgICAgICAgKCh4ICsgMTAgPCB3aWR0aCAmJiBhcnJheVt5ICogd2lkdGggKyB4ICsgN10gPT0gMCAmJgorICAgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCArIDhdID09IDAgJiYgYXJyYXlbeSAqIHdpZHRoICsgeCArIDldID09IDAgJiYKKyAgICAgICAgICAgIGFycmF5W3kgKiB3aWR0aCArIHggKyAxMF0gPT0gMCkgfHwKKyAgICAgICAgICAgKHggLSA0ID49IDAgJiYgYXJyYXlbeSAqIHdpZHRoICsgeCAtIDFdID09IDAgJiYKKyAgICAgICAgICAgIGFycmF5W3kgKiB3aWR0aCArIHggLSAyXSA9PSAwICYmIGFycmF5W3kgKiB3aWR0aCArIHggLSAzXSA9PSAwICYmCisgICAgICAgICAgICBhcnJheVt5ICogd2lkdGggKyB4IC0gNF0gPT0gMCkpKSB7CisgICAgICAgIHBlbmFsdHkgKz0gNDA7CisgICAgICB9CisgICAgICBpZiAoeSArIDYgPCBoZWlnaHQgJiYgYXJyYXlbeSAqIHdpZHRoICsgeF0gPT0gMSAmJgorICAgICAgICAgIGFycmF5Wyh5ICsgMSkgKiB3aWR0aCArIHhdID09IDAgJiYgYXJyYXlbKHkgKyAyKSAqIHdpZHRoICsgeF0gPT0gMSAmJgorICAgICAgICAgIGFycmF5Wyh5ICsgMykgKiB3aWR0aCArIHhdID09IDEgJiYgYXJyYXlbKHkgKyA0KSAqIHdpZHRoICsgeF0gPT0gMSAmJgorICAgICAgICAgIGFycmF5Wyh5ICsgNSkgKiB3aWR0aCArIHhdID09IDAgJiYgYXJyYXlbKHkgKyA2KSAqIHdpZHRoICsgeF0gPT0gMSAmJgorICAgICAgICAgICgoeSArIDEwIDwgaGVpZ2h0ICYmIGFycmF5Wyh5ICsgNykgKiB3aWR0aCArIHhdID09IDAgJiYKKyAgICAgICAgICAgIGFycmF5Wyh5ICsgOCkgKiB3aWR0aCArIHhdID09IDAgJiYKKyAgICAgICAgICAgIGFycmF5Wyh5ICsgOSkgKiB3aWR0aCArIHhdID09IDAgJiYKKyAgICAgICAgICAgIGFycmF5Wyh5ICsgMTApICogd2lkdGggKyB4XSA9PSAwKSB8fAorICAgICAgICAgICAoeSAtIDQgPj0gMCAmJiBhcnJheVsoeSAtIDEpICogd2lkdGggKyB4XSA9PSAwICYmCisgICAgICAgICAgICBhcnJheVsoeSAtIDIpICogd2lkdGggKyB4XSA9PSAwICYmCisgICAgICAgICAgICBhcnJheVsoeSAtIDMpICogd2lkdGggKyB4XSA9PSAwICYmCisgICAgICAgICAgICBhcnJheVsoeSAtIDQpICogd2lkdGggKyB4XSA9PSAwKSkpIHsKKyAgICAgICAgcGVuYWx0eSArPSA0MDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHBlbmFsdHk7Cit9CitpbnQzMl90IENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlNCgKKyAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4KSB7CisgIGludDMyX3QgbnVtRGFya0NlbGxzID0gMDsKKyAgdWludDhfdCogYXJyYXkgPSBtYXRyaXgtPkdldEFycmF5KCk7CisgIGludDMyX3Qgd2lkdGggPSBtYXRyaXgtPkdldFdpZHRoKCk7CisgIGludDMyX3QgaGVpZ2h0ID0gbWF0cml4LT5HZXRIZWlnaHQoKTsKKyAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgICBpZiAoYXJyYXlbeSAqIHdpZHRoICsgeF0gPT0gMSkgeworICAgICAgICBudW1EYXJrQ2VsbHMgKz0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaW50MzJfdCBudW1Ub3RhbENlbGxzID0gbWF0cml4LT5HZXRIZWlnaHQoKSAqIG1hdHJpeC0+R2V0V2lkdGgoKTsKKyAgZG91YmxlIGRhcmtSYXRpbyA9IChkb3VibGUpbnVtRGFya0NlbGxzIC8gbnVtVG90YWxDZWxsczsKKyAgcmV0dXJuIGFicygoaW50MzJfdCkoZGFya1JhdGlvICogMTAwIC0gNTApIC8gNSkgKiA1ICogMTA7Cit9Citib29sIENCQ19RUkNvZGVyTWFza1V0aWw6OkdldERhdGFNYXNrQml0KGludDMyX3QgbWFza1BhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7CisgIGlmICghQ0JDX1FSQ29kZXI6OklzVmFsaWRNYXNrUGF0dGVybihtYXNrUGF0dGVybikpIHsKKyAgICBlID0gKEJDRXhjZXB0aW9uSW52YWxpZGF0ZU1hc2tQYXR0ZXJuKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaW50MzJfdCBpbnRlcm1lZGlhdGUgPSAwLCB0ZW1wID0gMDsKKyAgc3dpdGNoIChtYXNrUGF0dGVybikgeworICAgIGNhc2UgMDoKKyAgICAgIGludGVybWVkaWF0ZSA9ICh5ICsgeCkgJiAweDE7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICBpbnRlcm1lZGlhdGUgPSB5ICYgMHgxOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgaW50ZXJtZWRpYXRlID0geCAlIDM7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBpbnRlcm1lZGlhdGUgPSAoeSArIHgpICUgMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDoKKyAgICAgIGludGVybWVkaWF0ZSA9ICgoeSA+PiAxKSArICh4IC8gMykpICYgMHgxOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgdGVtcCA9IHkgKiB4OworICAgICAgaW50ZXJtZWRpYXRlID0gKHRlbXAgJiAweDEpICsgKHRlbXAgJSAzKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgIHRlbXAgPSB5ICogeDsKKyAgICAgIGludGVybWVkaWF0ZSA9ICgoKHRlbXAgJiAweDEpICsgKHRlbXAgJSAzKSkgJiAweDEpOworICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgdGVtcCA9IHkgKiB4OworICAgICAgaW50ZXJtZWRpYXRlID0gKCgodGVtcCAlIDMpICsgKCh5ICsgeCkgJiAweDEpKSAmIDB4MSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiB7CisgICAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkYXRlTWFza1BhdHRlcm47CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiBpbnRlcm1lZGlhdGUgPT0gMDsKK30KK2ludDMyX3QgQ0JDX1FSQ29kZXJNYXNrVXRpbDo6QXBwbHlNYXNrUGVuYWx0eVJ1bGUxSW50ZXJuYWwoCisgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwKKyAgICBib29sIGlzSG9yaXpvbnRhbCkgeworICBpbnQzMl90IHBlbmFsdHkgPSAwOworICBpbnQzMl90IG51bVNhbWVCaXRDZWxscyA9IDA7CisgIGludDMyX3QgcHJldkJpdCA9IC0xOworICBpbnQzMl90IHdpZHRoID0gbWF0cml4LT5HZXRXaWR0aCgpOworICBpbnQzMl90IGhlaWdodCA9IG1hdHJpeC0+R2V0SGVpZ2h0KCk7CisgIGludDMyX3QgaUxpbWl0ID0gaXNIb3Jpem9udGFsID8gaGVpZ2h0IDogd2lkdGg7CisgIGludDMyX3QgakxpbWl0ID0gaXNIb3Jpem9udGFsID8gd2lkdGggOiBoZWlnaHQ7CisgIHVpbnQ4X3QqIGFycmF5ID0gbWF0cml4LT5HZXRBcnJheSgpOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGltaXQ7ICsraSkgeworICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGpMaW1pdDsgKytqKSB7CisgICAgICBpbnQzMl90IGJpdCA9IGlzSG9yaXpvbnRhbCA/IGFycmF5W2kgKiB3aWR0aCArIGpdIDogYXJyYXlbaiAqIHdpZHRoICsgaV07CisgICAgICBpZiAoYml0ID09IHByZXZCaXQpIHsKKyAgICAgICAgbnVtU2FtZUJpdENlbGxzICs9IDE7CisgICAgICAgIGlmIChudW1TYW1lQml0Q2VsbHMgPT0gNSkgeworICAgICAgICAgIHBlbmFsdHkgKz0gMzsKKyAgICAgICAgfSBlbHNlIGlmIChudW1TYW1lQml0Q2VsbHMgPiA1KSB7CisgICAgICAgICAgcGVuYWx0eSArPSAxOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBudW1TYW1lQml0Q2VsbHMgPSAxOworICAgICAgICBwcmV2Qml0ID0gYml0OworICAgICAgfQorICAgIH0KKyAgICBudW1TYW1lQml0Q2VsbHMgPSAwOworICB9CisgIHJldHVybiBwZW5hbHR5OworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWFza1V0aWwuaCBiL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hc2tVdGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmY2NiYgotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hc2tVdGlsLmgKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUk1BU0tVVElMX0hfCisjZGVmaW5lIEZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUk1BU0tVVElMX0hfCitjbGFzcyBDQkNfQ29tbW9uQnl0ZU1hdHJpeDsKK2NsYXNzIENCQ19RUkNvZGVyTWFza1V0aWwgeworIHB1YmxpYzoKKyAgQ0JDX1FSQ29kZXJNYXNrVXRpbCgpOworICB2aXJ0dWFsIH5DQkNfUVJDb2Rlck1hc2tVdGlsKCk7CisgIHN0YXRpYyBib29sIEdldERhdGFNYXNrQml0KGludDMyX3QgbWFza1BhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKKworICBzdGF0aWMgaW50MzJfdCBBcHBseU1hc2tQZW5hbHR5UnVsZTEoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCk7CisgIHN0YXRpYyBpbnQzMl90IEFwcGx5TWFza1BlbmFsdHlSdWxlMihDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4KTsKKyAgc3RhdGljIGludDMyX3QgQXBwbHlNYXNrUGVuYWx0eVJ1bGUzKENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpOworICBzdGF0aWMgaW50MzJfdCBBcHBseU1hc2tQZW5hbHR5UnVsZTQoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCk7CisgIHN0YXRpYyBpbnQzMl90IEFwcGx5TWFza1BlbmFsdHlSdWxlMUludGVybmFsKENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNIb3Jpem9udGFsKTsKK307CisKKyNlbmRpZiAgLy8gRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSTUFTS1VUSUxfSF8KZGlmZiAtLWdpdCBhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hdHJpeFV0aWwuY3BwIGIvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWF0cml4VXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDViN2JjZAotLS0gL2Rldi9udWxsCisrKyBiL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hdHJpeFV0aWwuY3BwCkBAIC0wLDAgKzEsNDk0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6CisvKgorICogQ29weXJpZ2h0IDIwMDggWlhpbmcgYXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlTWF0cml4LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQml0VmVjdG9yLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNYXNrVXRpbC5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hdHJpeFV0aWwuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvdXRpbHMuaCIKKworY29uc3QgaW50MzJfdCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OlBPU0lUSU9OX0RFVEVDVElPTl9QQVRURVJOWzddWzddID0geworICAgIHsxLCAxLCAxLCAxLCAxLCAxLCAxfSwgezEsIDAsIDAsIDAsIDAsIDAsIDF9LCB7MSwgMCwgMSwgMSwgMSwgMCwgMX0sCisgICAgezEsIDAsIDEsIDEsIDEsIDAsIDF9LCB7MSwgMCwgMSwgMSwgMSwgMCwgMX0sIHsxLCAwLCAwLCAwLCAwLCAwLCAxfSwKKyAgICB7MSwgMSwgMSwgMSwgMSwgMSwgMX19OworY29uc3QgaW50MzJfdCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkhPUklaT05UQUxfU0VQQVJBVElPTl9QQVRURVJOWzFdWzhdID0geworICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwfX07Citjb25zdCBpbnQzMl90IENCQ19RUkNvZGVyTWF0cml4VXRpbDo6VkVSVElDQUxfU0VQQVJBVElPTl9QQVRURVJOWzddWzFdID0geworICAgIHswfSwgezB9LCB7MH0sIHswfSwgezB9LCB7MH0sIHswfX07Citjb25zdCBpbnQzMl90IENCQ19RUkNvZGVyTWF0cml4VXRpbDo6UE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOWzVdWzVdID0geworICAgIHsxLCAxLCAxLCAxLCAxfSwKKyAgICB7MSwgMCwgMCwgMCwgMX0sCisgICAgezEsIDAsIDEsIDAsIDF9LAorICAgIHsxLCAwLCAwLCAwLCAxfSwKKyAgICB7MSwgMSwgMSwgMSwgMX19OworY29uc3QgaW50MzJfdAorICAgIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6UE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOX0NPT1JESU5BVEVfVEFCTEVbNDBdWzddID0KKyAgICAgICAgLy8gTk9MSU5UTkVYVExJTkUKKyAgICB7CisgICAgICAgIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sICAgezYsIDE4LCAtMSwgLTEsIC0xLCAtMSwgLTF9LAorICAgICAgICB7NiwgMjIsIC0xLCAtMSwgLTEsIC0xLCAtMX0sICAgIHs2LCAyNiwgLTEsIC0xLCAtMSwgLTEsIC0xfSwKKyAgICAgICAgezYsIDMwLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCAgICB7NiwgMzQsIC0xLCAtMSwgLTEsIC0xLCAtMX0sCisgICAgICAgIHs2LCAyMiwgMzgsIC0xLCAtMSwgLTEsIC0xfSwgICAgezYsIDI0LCA0MiwgLTEsIC0xLCAtMSwgLTF9LAorICAgICAgICB7NiwgMjYsIDQ2LCAtMSwgLTEsIC0xLCAtMX0sICAgIHs2LCAyOCwgNTAsIC0xLCAtMSwgLTEsIC0xfSwKKyAgICAgICAgezYsIDMwLCA1NCwgLTEsIC0xLCAtMSwgLTF9LCAgICB7NiwgMzIsIDU4LCAtMSwgLTEsIC0xLCAtMX0sCisgICAgICAgIHs2LCAzNCwgNjIsIC0xLCAtMSwgLTEsIC0xfSwgICAgezYsIDI2LCA0NiwgNjYsIC0xLCAtMSwgLTF9LAorICAgICAgICB7NiwgMjYsIDQ4LCA3MCwgLTEsIC0xLCAtMX0sICAgIHs2LCAyNiwgNTAsIDc0LCAtMSwgLTEsIC0xfSwKKyAgICAgICAgezYsIDMwLCA1NCwgNzgsIC0xLCAtMSwgLTF9LCAgICB7NiwgMzAsIDU2LCA4MiwgLTEsIC0xLCAtMX0sCisgICAgICAgIHs2LCAzMCwgNTgsIDg2LCAtMSwgLTEsIC0xfSwgICAgezYsIDM0LCA2MiwgOTAsIC0xLCAtMSwgLTF9LAorICAgICAgICB7NiwgMjgsIDUwLCA3MiwgOTQsIC0xLCAtMX0sICAgIHs2LCAyNiwgNTAsIDc0LCA5OCwgLTEsIC0xfSwKKyAgICAgICAgezYsIDMwLCA1NCwgNzgsIDEwMiwgLTEsIC0xfSwgICB7NiwgMjgsIDU0LCA4MCwgMTA2LCAtMSwgLTF9LAorICAgICAgICB7NiwgMzIsIDU4LCA4NCwgMTEwLCAtMSwgLTF9LCAgIHs2LCAzMCwgNTgsIDg2LCAxMTQsIC0xLCAtMX0sCisgICAgICAgIHs2LCAzNCwgNjIsIDkwLCAxMTgsIC0xLCAtMX0sICAgezYsIDI2LCA1MCwgNzQsIDk4LCAxMjIsIC0xfSwKKyAgICAgICAgezYsIDMwLCA1NCwgNzgsIDEwMiwgMTI2LCAtMX0sICB7NiwgMjYsIDUyLCA3OCwgMTA0LCAxMzAsIC0xfSwKKyAgICAgICAgezYsIDMwLCA1NiwgODIsIDEwOCwgMTM0LCAtMX0sICB7NiwgMzQsIDYwLCA4NiwgMTEyLCAxMzgsIC0xfSwKKyAgICAgICAgezYsIDMwLCA1OCwgODYsIDExNCwgMTQyLCAtMX0sICB7NiwgMzQsIDYyLCA5MCwgMTE4LCAxNDYsIC0xfSwKKyAgICAgICAgezYsIDMwLCA1NCwgNzgsIDEwMiwgMTI2LCAxNTB9LCB7NiwgMjQsIDUwLCA3NiwgMTAyLCAxMjgsIDE1NH0sCisgICAgICAgIHs2LCAyOCwgNTQsIDgwLCAxMDYsIDEzMiwgMTU4fSwgezYsIDMyLCA1OCwgODQsIDExMCwgMTM2LCAxNjJ9LAorICAgICAgICB7NiwgMjYsIDU0LCA4MiwgMTEwLCAxMzgsIDE2Nn0sIHs2LCAzMCwgNTgsIDg2LCAxMTQsIDE0MiwgMTcwfSwKK307Citjb25zdCBpbnQzMl90IENCQ19RUkNvZGVyTWF0cml4VXRpbDo6VFlQRV9JTkZPX0NPT1JESU5BVEVTWzE1XVsyXSA9IHsKKyAgICB7OCwgMH0sIHs4LCAxfSwgezgsIDJ9LCB7OCwgM30sIHs4LCA0fSwgezgsIDV9LCB7OCwgN30sIHs4LCA4fSwKKyAgICB7NywgOH0sIHs1LCA4fSwgezQsIDh9LCB7MywgOH0sIHsyLCA4fSwgezEsIDh9LCB7MCwgOH0sCit9OworY29uc3QgaW50MzJfdCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OlZFUlNJT05fSU5GT19QT0xZID0gMHgxZjI1OworY29uc3QgaW50MzJfdCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OlRZUEVfSU5GT19QT0xZID0gMHgwNTM3OworY29uc3QgaW50MzJfdCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OlRZUEVfSU5GT19NQVNLX1BBVFRFUk4gPSAweDU0MTI7CisKK3ZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpDbGVhck1hdHJpeChDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKKyAgaWYgKCFtYXRyaXgpIHsKKyAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsKKyAgICByZXR1cm47CisgIH0KKyAgbWF0cml4LT5jbGVhcigodWludDhfdCktMSk7Cit9Cit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6QnVpbGRNYXRyaXgoCisgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGRhdGFCaXRzLAorICAgIGNvbnN0IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsCisgICAgaW50MzJfdCB2ZXJzaW9uLAorICAgIGludDMyX3QgbWFza1BhdHRlcm4sCisgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwKKyAgICBpbnQzMl90JiBlKSB7CisgIGlmICghbWF0cml4KSB7CisgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7CisgICAgcmV0dXJuOworICB9CisgIENsZWFyTWF0cml4KG1hdHJpeCwgZSk7CisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgcmV0dXJuOworICBFbWJlZEJhc2ljUGF0dGVybnModmVyc2lvbiwgbWF0cml4LCBlKTsKKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKKyAgICByZXR1cm47CisgIEVtYmVkVHlwZUluZm8oZWNMZXZlbCwgbWFza1BhdHRlcm4sIG1hdHJpeCwgZSk7CisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgcmV0dXJuOworICBNYXliZUVtYmVkVmVyc2lvbkluZm8odmVyc2lvbiwgbWF0cml4LCBlKTsKKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKKyAgICByZXR1cm47CisgIEVtYmVkRGF0YUJpdHMoZGF0YUJpdHMsIG1hc2tQYXR0ZXJuLCBtYXRyaXgsIGUpOworICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgIHJldHVybjsKK30KK3ZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpFbWJlZEJhc2ljUGF0dGVybnMoaW50MzJfdCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7CisgIGlmICghbWF0cml4KSB7CisgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7CisgICAgcmV0dXJuOworICB9CisgIEVtYmVkUG9zaXRpb25EZXRlY3Rpb25QYXR0ZXJuc0FuZFNlcGFyYXRvcnMobWF0cml4LCBlKTsKKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKKyAgICByZXR1cm47CisgIEVtYmVkRGFya0RvdEF0TGVmdEJvdHRvbUNvcm5lcihtYXRyaXgsIGUpOworICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgIHJldHVybjsKKyAgTWF5YmVFbWJlZFBvc2l0aW9uQWRqdXN0bWVudFBhdHRlcm5zKHZlcnNpb24sIG1hdHJpeCwgZSk7CisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgcmV0dXJuOworICBFbWJlZFRpbWluZ1BhdHRlcm5zKG1hdHJpeCwgZSk7CisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgcmV0dXJuOworfQorCit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RW1iZWRUeXBlSW5mbygKKyAgICBjb25zdCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLAorICAgIGludDMyX3QgbWFza1BhdHRlcm4sCisgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwKKyAgICBpbnQzMl90JiBlKSB7CisgIGlmICghbWF0cml4KSB7CisgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7CisgICAgcmV0dXJuOworICB9CisgIENCQ19RUkNvZGVyQml0VmVjdG9yIHR5cGVJbmZvQml0czsKKyAgTWFrZVR5cGVJbmZvQml0cyhlY0xldmVsLCBtYXNrUGF0dGVybiwgJnR5cGVJbmZvQml0cywgZSk7CisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgcmV0dXJuOworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdHlwZUluZm9CaXRzLlNpemUoKTsgaSsrKSB7CisgICAgaW50MzJfdCBiaXQgPSB0eXBlSW5mb0JpdHMuQXQodHlwZUluZm9CaXRzLlNpemUoKSAtIDEgLSBpLCBlKTsKKyAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgICAgcmV0dXJuOworICAgIGludDMyX3QgeDEgPSBUWVBFX0lORk9fQ09PUkRJTkFURVNbaV1bMF07CisgICAgaW50MzJfdCB5MSA9IFRZUEVfSU5GT19DT09SRElOQVRFU1tpXVsxXTsKKyAgICBtYXRyaXgtPlNldCh4MSwgeTEsIGJpdCk7CisgICAgaWYgKGkgPCA4KSB7CisgICAgICBpbnQzMl90IHgyID0gbWF0cml4LT5HZXRXaWR0aCgpIC0gaSAtIDE7CisgICAgICBpbnQzMl90IHkyID0gODsKKyAgICAgIG1hdHJpeC0+U2V0KHgyLCB5MiwgYml0KTsKKyAgICB9IGVsc2UgeworICAgICAgaW50MzJfdCB4MiA9IDg7CisgICAgICBpbnQzMl90IHkyID0gbWF0cml4LT5HZXRIZWlnaHQoKSAtIDcgKyAoaSAtIDgpOworICAgICAgbWF0cml4LT5TZXQoeDIsIHkyLCBiaXQpOworICAgIH0KKyAgfQorfQorCit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6TWF5YmVFbWJlZFZlcnNpb25JbmZvKGludDMyX3QgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgeworICBpZiAoIW1hdHJpeCkgeworICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOworICAgIHJldHVybjsKKyAgfQorICBpZiAodmVyc2lvbiA8IDcpIHsKKyAgICByZXR1cm47CisgIH0KKyAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgdmVyc2lvbkluZm9CaXRzOworICBNYWtlVmVyc2lvbkluZm9CaXRzKHZlcnNpb24sICZ2ZXJzaW9uSW5mb0JpdHMsIGUpOworICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgIHJldHVybjsKKyAgaW50MzJfdCBiaXRJbmRleCA9IDYgKiAzIC0gMTsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgNjsgaSsrKSB7CisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgMzsgaisrKSB7CisgICAgICBpbnQzMl90IGJpdCA9IHZlcnNpb25JbmZvQml0cy5BdChiaXRJbmRleCwgZSk7CisgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgICAgICByZXR1cm47CisgICAgICBiaXRJbmRleC0tOworICAgICAgbWF0cml4LT5TZXQoaSwgbWF0cml4LT5HZXRIZWlnaHQoKSAtIDExICsgaiwgYml0KTsKKyAgICAgIG1hdHJpeC0+U2V0KG1hdHJpeC0+R2V0SGVpZ2h0KCkgLSAxMSArIGosIGksIGJpdCk7CisgICAgfQorICB9Cit9Cit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RW1iZWREYXRhQml0cyhDQkNfUVJDb2RlckJpdFZlY3RvciogZGF0YUJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1hc2tQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKKyAgaWYgKCFtYXRyaXggfHwgIWRhdGFCaXRzKSB7CisgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7CisgICAgcmV0dXJuOworICB9CisgIHNpemVfdCBiaXRJbmRleCA9IDA7CisgIGludDMyX3QgZGlyZWN0aW9uID0gLTE7CisgIGludDMyX3QgeCA9IG1hdHJpeC0+R2V0V2lkdGgoKSAtIDE7CisgIGludDMyX3QgeSA9IG1hdHJpeC0+R2V0SGVpZ2h0KCkgLSAxOworICB3aGlsZSAoeCA+IDApIHsKKyAgICBpZiAoeCA9PSA2KSB7CisgICAgICB4IC09IDE7CisgICAgfQorICAgIHdoaWxlICh5ID49IDAgJiYgeSA8IG1hdHJpeC0+R2V0SGVpZ2h0KCkpIHsKKyAgICAgIGlmICh5ID09IDYpIHsKKyAgICAgICAgeSArPSBkaXJlY3Rpb247CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgIGludDMyX3QgeHggPSB4IC0gaTsKKyAgICAgICAgaWYgKCFJc0VtcHR5KG1hdHJpeC0+R2V0KHh4LCB5KSkpIHsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IGJpdDsKKyAgICAgICAgaWYgKGJpdEluZGV4IDwgZGF0YUJpdHMtPlNpemUoKSkgeworICAgICAgICAgIGJpdCA9IGRhdGFCaXRzLT5BdChiaXRJbmRleCwgZSk7CisgICAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICBiaXRJbmRleCsrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJpdCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hc2tQYXR0ZXJuICE9IC0xKSB7CisgICAgICAgICAgYm9vbCBib2wgPSBDQkNfUVJDb2Rlck1hc2tVdGlsOjpHZXREYXRhTWFza0JpdChtYXNrUGF0dGVybiwgeHgsIHksIGUpOworICAgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgaWYgKGJvbCkgeworICAgICAgICAgICAgYml0IF49IDB4MDE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1hdHJpeC0+U2V0KHh4LCB5LCBiaXQpOworICAgICAgfQorICAgICAgeSArPSBkaXJlY3Rpb247CisgICAgfQorICAgIGRpcmVjdGlvbiA9IC1kaXJlY3Rpb247CisgICAgeSArPSBkaXJlY3Rpb247CisgICAgeCAtPSAyOworICB9CisgIGlmIChiaXRJbmRleCAhPSBkYXRhQml0cy0+U2l6ZSgpKSB7CisgICAgcmV0dXJuOworICB9Cit9CitpbnQzMl90IENCQ19RUkNvZGVyTWF0cml4VXRpbDo6Q2FsY3VsYXRlQkNIQ29kZShpbnQzMl90IHZhbHVlLCBpbnQzMl90IHBvbHkpIHsKKyAgaW50MzJfdCBtc2JTZXRJblBvbHkgPSBGaW5kTVNCU2V0KHBvbHkpOworICB2YWx1ZSA8PD0gbXNiU2V0SW5Qb2x5IC0gMTsKKyAgd2hpbGUgKEZpbmRNU0JTZXQodmFsdWUpID49IG1zYlNldEluUG9seSkgeworICAgIHZhbHVlIF49IHBvbHkgPDwgKEZpbmRNU0JTZXQodmFsdWUpIC0gbXNiU2V0SW5Qb2x5KTsKKyAgfQorICByZXR1cm4gdmFsdWU7Cit9Cit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6TWFrZVR5cGVJbmZvQml0cygKKyAgICBjb25zdCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLAorICAgIGludDMyX3QgbWFza1BhdHRlcm4sCisgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsCisgICAgaW50MzJfdCYgZSkgeworICBpZiAoIWJpdHMpIHsKKyAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFDQkNfUVJDb2Rlcjo6SXNWYWxpZE1hc2tQYXR0ZXJuKG1hc2tQYXR0ZXJuKSkgeworICAgIGUgPSBCQ0V4Y2VwdGlvbkJhZE1hc2s7CisgICAgcmV0dXJuOworICB9CisgIGludDMyX3QgdHlwZUluZm8gPSAoZWNMZXZlbC0+R2V0Qml0cygpIDw8IDMpIHwgbWFza1BhdHRlcm47CisgIGJpdHMtPkFwcGVuZEJpdHModHlwZUluZm8sIDUpOworICBpbnQzMl90IGJjaENvZGUgPSBDYWxjdWxhdGVCQ0hDb2RlKHR5cGVJbmZvLCBUWVBFX0lORk9fUE9MWSk7CisgIGJpdHMtPkFwcGVuZEJpdHMoYmNoQ29kZSwgMTApOworICBDQkNfUVJDb2RlckJpdFZlY3RvciBtYXNrQml0czsKKyAgbWFza0JpdHMuQXBwZW5kQml0cyhUWVBFX0lORk9fTUFTS19QQVRURVJOLCAxNSk7CisgIGlmICghYml0cy0+WE9SKCZtYXNrQml0cykpIHsKKyAgICBlID0gQkNFeGNlcHRpb25HZW5lcmljOworICAgIHJldHVybjsKKyAgfQorICBBU1NFUlQoYml0cy0+U2l6ZSgpID09IDE1KTsKK30KKwordm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6Ok1ha2VWZXJzaW9uSW5mb0JpdHMoaW50MzJfdCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7CisgIGlmICghYml0cykgeworICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOworICAgIHJldHVybjsKKyAgfQorCisgIGJpdHMtPkFwcGVuZEJpdHModmVyc2lvbiwgNik7CisgIGludDMyX3QgYmNoQ29kZSA9IENhbGN1bGF0ZUJDSENvZGUodmVyc2lvbiwgVkVSU0lPTl9JTkZPX1BPTFkpOworICBiaXRzLT5BcHBlbmRCaXRzKGJjaENvZGUsIDEyKTsKKyAgQVNTRVJUKGJpdHMtPlNpemUoKSA9PSAxOCk7Cit9CisKK2Jvb2wgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpJc0VtcHR5KGludDMyX3QgdmFsdWUpIHsKKyAgcmV0dXJuICh1aW50OF90KXZhbHVlID09IDB4ZmY7Cit9Citib29sIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6SXNWYWxpZFZhbHVlKGludDMyX3QgdmFsdWUpIHsKKyAgcmV0dXJuICgodWludDhfdCl2YWx1ZSA9PSAweGZmIHx8ICh1aW50OF90KXZhbHVlID09IDB4MDAgfHwKKyAgICAgICAgICAodWludDhfdCl2YWx1ZSA9PSAweDAxKTsKK30KKwordm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkVGltaW5nUGF0dGVybnMoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKKyAgaWYgKCFtYXRyaXgpIHsKKyAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsKKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQzMl90IGkgPSA4OyBpIDwgbWF0cml4LT5HZXRXaWR0aCgpIC0gODsgaSsrKSB7CisgICAgaW50MzJfdCBiaXQgPSAoaSArIDEpICUgMjsKKyAgICBpZiAoIUlzVmFsaWRWYWx1ZShtYXRyaXgtPkdldChpLCA2KSkpIHsKKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVJbWFnZURhdGE7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChJc0VtcHR5KG1hdHJpeC0+R2V0KGksIDYpKSkgeworICAgICAgbWF0cml4LT5TZXQoaSwgNiwgYml0KTsKKyAgICB9CisgICAgaWYgKCFJc1ZhbGlkVmFsdWUobWF0cml4LT5HZXQoNiwgaSkpKSB7CisgICAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkYXRlSW1hZ2VEYXRhOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoSXNFbXB0eShtYXRyaXgtPkdldCg2LCBpKSkpIHsKKyAgICAgIG1hdHJpeC0+U2V0KDYsIGksIGJpdCk7CisgICAgfQorICB9Cit9Cit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RW1iZWREYXJrRG90QXRMZWZ0Qm90dG9tQ29ybmVyKAorICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCisgICAgaW50MzJfdCYgZSkgeworICBpZiAoIW1hdHJpeCkgeworICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOworICAgIHJldHVybjsKKyAgfQorICBpZiAobWF0cml4LT5HZXQoOCwgbWF0cml4LT5HZXRIZWlnaHQoKSAtIDgpID09IDApIHsKKyAgICBlID0gQkNFeGNlcHRpb25IZWlnaHRfOEJlWmVybzsKKyAgICByZXR1cm47CisgIH0KKyAgbWF0cml4LT5TZXQoOCwgbWF0cml4LT5HZXRIZWlnaHQoKSAtIDgsIDEpOworfQordm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkSG9yaXpvbnRhbFNlcGFyYXRpb25QYXR0ZXJuKAorICAgIGludDMyX3QgeFN0YXJ0LAorICAgIGludDMyX3QgeVN0YXJ0LAorICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCisgICAgaW50MzJfdCYgZSkgeworICBpZiAoIW1hdHJpeCkgeworICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOworICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCA4OyB4KyspIHsKKyAgICBpZiAoIUlzRW1wdHkobWF0cml4LT5HZXQoeFN0YXJ0ICsgeCwgeVN0YXJ0KSkpIHsKKyAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVEYXRhOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtYXRyaXgtPlNldCh4U3RhcnQgKyB4LCB5U3RhcnQsIEhPUklaT05UQUxfU0VQQVJBVElPTl9QQVRURVJOWzBdW3hdKTsKKyAgfQorfQordm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkVmVydGljYWxTZXBhcmF0aW9uUGF0dGVybigKKyAgICBpbnQzMl90IHhTdGFydCwKKyAgICBpbnQzMl90IHlTdGFydCwKKyAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LAorICAgIGludDMyX3QmIGUpIHsKKyAgaWYgKCFtYXRyaXgpIHsKKyAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsKKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgNzsgeSsrKSB7CisgICAgaWYgKCFJc0VtcHR5KG1hdHJpeC0+R2V0KHhTdGFydCwgeVN0YXJ0ICsgeSkpKSB7CisgICAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkYXRlRGF0YTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWF0cml4LT5TZXQoeFN0YXJ0LCB5U3RhcnQgKyB5LCBWRVJUSUNBTF9TRVBBUkFUSU9OX1BBVFRFUk5beV1bMF0pOworICB9Cit9Cit2b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RW1iZWRQb3NpdGlvbkFkanVzdG1lbnRQYXR0ZXJuKAorICAgIGludDMyX3QgeFN0YXJ0LAorICAgIGludDMyX3QgeVN0YXJ0LAorICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCisgICAgaW50MzJfdCYgZSkgeworICBpZiAoIW1hdHJpeCkgeworICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOworICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgNTsgeSsrKSB7CisgICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgNTsgeCsrKSB7CisgICAgICBpZiAoIUlzRW1wdHkobWF0cml4LT5HZXQoeFN0YXJ0ICsgeCwgeSArIHlTdGFydCkpKSB7CisgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVEYXRhOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBtYXRyaXgtPlNldCh4U3RhcnQgKyB4LCB5U3RhcnQgKyB5LCBQT1NJVElPTl9BREpVU1RNRU5UX1BBVFRFUk5beV1beF0pOworICAgIH0KKyAgfQorfQordm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkUG9zaXRpb25EZXRlY3Rpb25QYXR0ZXJuKAorICAgIGludDMyX3QgeFN0YXJ0LAorICAgIGludDMyX3QgeVN0YXJ0LAorICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCisgICAgaW50MzJfdCYgZSkgeworICBpZiAoIW1hdHJpeCkgeworICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOworICAgIHJldHVybjsKKyAgfQorICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCA3OyB5KyspIHsKKyAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCA3OyB4KyspIHsKKyAgICAgIGlmICghSXNFbXB0eShtYXRyaXgtPkdldCh4U3RhcnQgKyB4LCB5U3RhcnQgKyB5KSkpIHsKKyAgICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZURhdGE7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIG1hdHJpeC0+U2V0KHhTdGFydCArIHgsIHlTdGFydCArIHksIFBPU0lUSU9OX0RFVEVDVElPTl9QQVRURVJOW3ldW3hdKTsKKyAgICB9CisgIH0KK30KK3ZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpFbWJlZFBvc2l0aW9uRGV0ZWN0aW9uUGF0dGVybnNBbmRTZXBhcmF0b3JzKAorICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCisgICAgaW50MzJfdCYgZSkgeworICBpZiAoIW1hdHJpeCkgeworICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOworICAgIHJldHVybjsKKyAgfQorICBpbnQzMl90IHBkcFdpZHRoID0gNzsKKyAgRW1iZWRQb3NpdGlvbkRldGVjdGlvblBhdHRlcm4oMCwgMCwgbWF0cml4LCBlKTsKKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKKyAgICByZXR1cm47CisgIEVtYmVkUG9zaXRpb25EZXRlY3Rpb25QYXR0ZXJuKG1hdHJpeC0+R2V0V2lkdGgoKSAtIHBkcFdpZHRoLCAwLCBtYXRyaXgsIGUpOworICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgIHJldHVybjsKKyAgRW1iZWRQb3NpdGlvbkRldGVjdGlvblBhdHRlcm4oMCwgbWF0cml4LT5HZXRXaWR0aCgpIC0gcGRwV2lkdGgsIG1hdHJpeCwgZSk7CisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgcmV0dXJuOworICBpbnQzMl90IGhzcFdpZHRoID0gODsKKyAgRW1iZWRIb3Jpem9udGFsU2VwYXJhdGlvblBhdHRlcm4oMCwgaHNwV2lkdGggLSAxLCBtYXRyaXgsIGUpOworICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgIHJldHVybjsKKyAgRW1iZWRIb3Jpem9udGFsU2VwYXJhdGlvblBhdHRlcm4obWF0cml4LT5HZXRXaWR0aCgpIC0gaHNwV2lkdGgsIGhzcFdpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LCBlKTsKKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKKyAgICByZXR1cm47CisgIEVtYmVkSG9yaXpvbnRhbFNlcGFyYXRpb25QYXR0ZXJuKDAsIG1hdHJpeC0+R2V0V2lkdGgoKSAtIGhzcFdpZHRoLCBtYXRyaXgsIGUpOworICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgIHJldHVybjsKKyAgaW50MzJfdCB2c3BTaXplID0gNzsKKyAgRW1iZWRWZXJ0aWNhbFNlcGFyYXRpb25QYXR0ZXJuKHZzcFNpemUsIDAsIG1hdHJpeCwgZSk7CisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgcmV0dXJuOworICBFbWJlZFZlcnRpY2FsU2VwYXJhdGlvblBhdHRlcm4obWF0cml4LT5HZXRIZWlnaHQoKSAtIHZzcFNpemUgLSAxLCAwLCBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKKyAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKKyAgICByZXR1cm47CisgIEVtYmVkVmVydGljYWxTZXBhcmF0aW9uUGF0dGVybih2c3BTaXplLCBtYXRyaXgtPkdldEhlaWdodCgpIC0gdnNwU2l6ZSwgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7CisgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCisgICAgcmV0dXJuOworfQordm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6Ok1heWJlRW1iZWRQb3NpdGlvbkFkanVzdG1lbnRQYXR0ZXJucygKKyAgICBpbnQzMl90IHZlcnNpb24sCisgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwKKyAgICBpbnQzMl90JiBlKSB7CisgIGlmICghbWF0cml4KSB7CisgICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7CisgICAgcmV0dXJuOworICB9CisgIGlmICh2ZXJzaW9uIDwgMikgeworICAgIHJldHVybjsKKyAgfQorICBpbnQzMl90IGluZGV4ID0gdmVyc2lvbiAtIDE7CisgIGludDMyX3QgY29uc3QqIGNvb3JkaW5hdGVzID0KKyAgICAgICYoUE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOX0NPT1JESU5BVEVfVEFCTEVbaW5kZXhdWzBdKTsKKyAgaW50MzJfdCBudW1Db29yZGluYXRlID0gNzsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtQ29vcmRpbmF0ZTsgaSsrKSB7CisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbnVtQ29vcmRpbmF0ZTsgaisrKSB7CisgICAgICBpbnQzMl90IHkgPSBjb29yZGluYXRlc1tpXTsKKyAgICAgIGludDMyX3QgeCA9IGNvb3JkaW5hdGVzW2pdOworICAgICAgaWYgKHggPT0gLTEgfHwgeSA9PSAtMSkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChJc0VtcHR5KG1hdHJpeC0+R2V0KHgsIHkpKSkgeworICAgICAgICBFbWJlZFBvc2l0aW9uQWRqdXN0bWVudFBhdHRlcm4oeCAtIDIsIHkgLSAyLCBtYXRyaXgsIGUpOworICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQorICAgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KK2ludDMyX3QgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpGaW5kTVNCU2V0KGludDMyX3QgdmFsdWUpIHsKKyAgaW50MzJfdCBudW1EaWdpdHMgPSAwOworICB3aGlsZSAodmFsdWUgIT0gMCkgeworICAgIHZhbHVlID4+PSAxOworICAgICsrbnVtRGlnaXRzOworICB9CisgIHJldHVybiBudW1EaWdpdHM7Cit9CitDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkNCQ19RUkNvZGVyTWF0cml4VXRpbCgpIHt9CitDQkNfUVJDb2Rlck1hdHJpeFV0aWw6On5DQkNfUVJDb2Rlck1hdHJpeFV0aWwoKSB7fQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWF0cml4VXRpbC5oIGIvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWF0cml4VXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZmUwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNYXRyaXhVdGlsLmgKQEAgLTAsMCArMSw4OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUk1BVFJJWFVUSUxfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSTUFUUklYVVRJTF9IXworCitjbGFzcyBDQkNfQ29tbW9uQnl0ZU1hdHJpeDsKK2NsYXNzIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw7CitjbGFzcyBDQkNfUVJDb2RlckJpdFZlY3RvcjsKKworY2xhc3MgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsIHsKKyBwdWJsaWM6CisgIENCQ19RUkNvZGVyTWF0cml4VXRpbCgpOworICB2aXJ0dWFsIH5DQkNfUVJDb2Rlck1hdHJpeFV0aWwoKTsKKyAgc3RhdGljIHZvaWQgQ2xlYXJNYXRyaXgoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgaW50MzJfdCYgZSk7CisgIHN0YXRpYyB2b2lkIEJ1aWxkTWF0cml4KENCQ19RUkNvZGVyQml0VmVjdG9yKiBkYXRhQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1hc2tQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKKyAgc3RhdGljIHZvaWQgRW1iZWRCYXNpY1BhdHRlcm5zKGludDMyX3QgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKKyAgc3RhdGljIHZvaWQgRW1iZWRUeXBlSW5mbyhjb25zdCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWFza1BhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKKyAgc3RhdGljIHZvaWQgRW1iZWREYXRhQml0cyhDQkNfUVJDb2RlckJpdFZlY3RvciogZGF0YUJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXNrUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOworICBzdGF0aWMgdm9pZCBNYXliZUVtYmVkVmVyc2lvbkluZm8oaW50MzJfdCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOworICBzdGF0aWMgaW50MzJfdCBGaW5kTVNCU2V0KGludDMyX3QgdmFsdWUpOworICBzdGF0aWMgaW50MzJfdCBDYWxjdWxhdGVCQ0hDb2RlKGludDMyX3QgY29kZSwgaW50MzJfdCBwb2x5KTsKKyAgc3RhdGljIHZvaWQgTWFrZVR5cGVJbmZvQml0cyhjb25zdCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWFza1BhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7CisgIHN0YXRpYyB2b2lkIE1ha2VWZXJzaW9uSW5mb0JpdHMoaW50MzJfdCB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOworICBzdGF0aWMgYm9vbCBJc0VtcHR5KGludDMyX3QgdmFsdWUpOworICBzdGF0aWMgYm9vbCBJc1ZhbGlkVmFsdWUoaW50MzJfdCB2YWx1ZSk7CisgIHN0YXRpYyB2b2lkIEVtYmVkVGltaW5nUGF0dGVybnMoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgaW50MzJfdCYgZSk7CisgIHN0YXRpYyB2b2lkIEVtYmVkRGFya0RvdEF0TGVmdEJvdHRvbUNvcm5lcihDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7CisgIHN0YXRpYyB2b2lkIEVtYmVkSG9yaXpvbnRhbFNlcGFyYXRpb25QYXR0ZXJuKGludDMyX3QgeFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHlTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7CisgIHN0YXRpYyB2b2lkIEVtYmVkVmVydGljYWxTZXBhcmF0aW9uUGF0dGVybihpbnQzMl90IHhTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOworICBzdGF0aWMgdm9pZCBFbWJlZFBvc2l0aW9uQWRqdXN0bWVudFBhdHRlcm4oaW50MzJfdCB4U3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHlTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKKyAgc3RhdGljIHZvaWQgRW1iZWRQb3NpdGlvbkRldGVjdGlvblBhdHRlcm4oaW50MzJfdCB4U3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKKyAgc3RhdGljIHZvaWQgRW1iZWRQb3NpdGlvbkRldGVjdGlvblBhdHRlcm5zQW5kU2VwYXJhdG9ycygKKyAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCisgICAgICBpbnQzMl90JiBlKTsKKyAgc3RhdGljIHZvaWQgTWF5YmVFbWJlZFBvc2l0aW9uQWRqdXN0bWVudFBhdHRlcm5zKGludDMyX3QgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKKworIHByaXZhdGU6CisgIHN0YXRpYyBjb25zdCBpbnQzMl90IFBPU0lUSU9OX0RFVEVDVElPTl9QQVRURVJOWzddWzddOworICBzdGF0aWMgY29uc3QgaW50MzJfdCBWRVJUSUNBTF9TRVBBUkFUSU9OX1BBVFRFUk5bN11bMV07CisgIHN0YXRpYyBjb25zdCBpbnQzMl90IEhPUklaT05UQUxfU0VQQVJBVElPTl9QQVRURVJOWzFdWzhdOworICBzdGF0aWMgY29uc3QgaW50MzJfdCBQT1NJVElPTl9BREpVU1RNRU5UX1BBVFRFUk5bNV1bNV07CisgIHN0YXRpYyBjb25zdCBpbnQzMl90IFBPU0lUSU9OX0FESlVTVE1FTlRfUEFUVEVSTl9DT09SRElOQVRFX1RBQkxFWzQwXVs3XTsKKyAgc3RhdGljIGNvbnN0IGludDMyX3QgVFlQRV9JTkZPX0NPT1JESU5BVEVTWzE1XVsyXTsKKyAgc3RhdGljIGNvbnN0IGludDMyX3QgVkVSU0lPTl9JTkZPX1BPTFk7CisgIHN0YXRpYyBjb25zdCBpbnQzMl90IFRZUEVfSU5GT19QT0xZOworICBzdGF0aWMgY29uc3QgaW50MzJfdCBUWVBFX0lORk9fTUFTS19QQVRURVJOOworfTsKKworI2VuZGlmICAvLyBGWEJBUkNPREVfUVJDT0RFX0JDX1FSQ09ERVJNQVRSSVhVVElMX0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNb2RlLmNwcCBiL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1vZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOGMyMjcKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNb2RlLmNwcApAQCAtMCwwICsxLDE3MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgorLyoKKyAqIENvcHlyaWdodCAyMDA3IFpYaW5nIGF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1vZGUuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJmeGJhcmNvZGUvdXRpbHMuaCIKKworQ0JDX1FSQ29kZXJNb2RlKiBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFID0gbnVsbHB0cjsKK0NCQ19RUkNvZGVyTW9kZSogQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQyA9IG51bGxwdHI7CitDQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQyA9IG51bGxwdHI7CitDQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyTW9kZTo6c0tBTkpJID0gbnVsbHB0cjsKK0NCQ19RUkNvZGVyTW9kZSogQ0JDX1FSQ29kZXJNb2RlOjpzRUNJID0gbnVsbHB0cjsKK0NCQ19RUkNvZGVyTW9kZSogQ0JDX1FSQ29kZXJNb2RlOjpzR0JLID0gbnVsbHB0cjsKK0NCQ19RUkNvZGVyTW9kZSogQ0JDX1FSQ29kZXJNb2RlOjpzVEVSTUlOQVRPUiA9IG51bGxwdHI7CitDQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyTW9kZTo6c0ZOQzFfRklSU1RfUE9TSVRJT04gPSBudWxscHRyOworQ0JDX1FSQ29kZXJNb2RlKiBDQkNfUVJDb2Rlck1vZGU6OnNGTkMxX1NFQ09ORF9QT1NJVElPTiA9IG51bGxwdHI7CitDQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyTW9kZTo6c1NUUlVDVFVSRURfQVBQRU5EID0gbnVsbHB0cjsKKworQ0JDX1FSQ29kZXJNb2RlOjpDQkNfUVJDb2Rlck1vZGUoc3RkOjp2ZWN0b3I8aW50MzJfdD4gY2hhckNvdW50Qml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVTdHJpbmcgbmFtZSkKKyAgICA6IG1fY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnMoc3RkOjptb3ZlKGNoYXJDb3VudEJpdHMpKSwKKyAgICAgIG1fYml0cyhiaXRzKSwKKyAgICAgIG1fbmFtZShuYW1lKSB7fQorCitDQkNfUVJDb2Rlck1vZGU6On5DQkNfUVJDb2Rlck1vZGUoKSB7fQorCit2b2lkIENCQ19RUkNvZGVyTW9kZTo6SW5pdGlhbGl6ZSgpIHsKKyAgc0JZVEUgPSBuZXcgQ0JDX1FSQ29kZXJNb2RlKHs4LCAxNiwgMTZ9LCAweDQsICJCWVRFIik7CisgIHNBTFBIQU5VTUVSSUMgPSBuZXcgQ0JDX1FSQ29kZXJNb2RlKHs5LCAxMSwgMTN9LCAweDIsICJBTFBIQU5VTUVSSUMiKTsKKyAgc0VDSSA9IG5ldyBDQkNfUVJDb2Rlck1vZGUoc3RkOjp2ZWN0b3I8aW50MzJfdD4oKSwgMHg3LCAiRUNJIik7CisgIHNLQU5KSSA9IG5ldyBDQkNfUVJDb2Rlck1vZGUoezgsIDEwLCAxMn0sIDB4OCwgIktBTkpJIik7CisgIHNOVU1FUklDID0gbmV3IENCQ19RUkNvZGVyTW9kZSh7MTAsIDEyLCAxNH0sIDB4MSwgIk5VTUVSSUMiKTsKKyAgc0dCSyA9IG5ldyBDQkNfUVJDb2Rlck1vZGUoezgsIDEwLCAxMn0sIDB4MEQsICJHQksiKTsKKyAgc1RFUk1JTkFUT1IgPSBuZXcgQ0JDX1FSQ29kZXJNb2RlKHN0ZDo6dmVjdG9yPGludDMyX3Q+KCksIDB4MDAsICJURVJNSU5BVE9SIik7CisgIHNGTkMxX0ZJUlNUX1BPU0lUSU9OID0KKyAgICAgIG5ldyBDQkNfUVJDb2Rlck1vZGUoc3RkOjp2ZWN0b3I8aW50MzJfdD4oKSwgMHgwNSwgIkZOQzFfRklSU1RfUE9TSVRJT04iKTsKKyAgc0ZOQzFfU0VDT05EX1BPU0lUSU9OID0KKyAgICAgIG5ldyBDQkNfUVJDb2Rlck1vZGUoc3RkOjp2ZWN0b3I8aW50MzJfdD4oKSwgMHgwOSwgIkZOQzFfU0VDT05EX1BPU0lUSU9OIik7CisgIHNTVFJVQ1RVUkVEX0FQUEVORCA9CisgICAgICBuZXcgQ0JDX1FSQ29kZXJNb2RlKHN0ZDo6dmVjdG9yPGludDMyX3Q+KCksIDB4MDMsICJTVFJVQ1RVUkVEX0FQUEVORCIpOworfQorCit2b2lkIENCQ19RUkNvZGVyTW9kZTo6RmluYWxpemUoKSB7CisgIGRlbGV0ZSBzQllURTsKKyAgZGVsZXRlIHNBTFBIQU5VTUVSSUM7CisgIGRlbGV0ZSBzRUNJOworICBkZWxldGUgc0tBTkpJOworICBkZWxldGUgc05VTUVSSUM7CisgIGRlbGV0ZSBzR0JLOworICBkZWxldGUgc1RFUk1JTkFUT1I7CisgIGRlbGV0ZSBzRk5DMV9GSVJTVF9QT1NJVElPTjsKKyAgZGVsZXRlIHNGTkMxX1NFQ09ORF9QT1NJVElPTjsKKyAgZGVsZXRlIHNTVFJVQ1RVUkVEX0FQUEVORDsKK30KKworQ0JDX1FSQ29kZXJNb2RlKiBDQkNfUVJDb2Rlck1vZGU6OkZvckJpdHMoaW50MzJfdCBiaXRzLCBpbnQzMl90JiBlKSB7CisgIHN3aXRjaCAoYml0cykgeworICAgIGNhc2UgMHgwOgorICAgICAgcmV0dXJuIHNURVJNSU5BVE9SOworICAgIGNhc2UgMHgxOgorICAgICAgcmV0dXJuIHNOVU1FUklDOworICAgIGNhc2UgMHgyOgorICAgICAgcmV0dXJuIHNBTFBIQU5VTUVSSUM7CisgICAgY2FzZSAweDM6CisgICAgICByZXR1cm4gc1NUUlVDVFVSRURfQVBQRU5EOworICAgIGNhc2UgMHg0OgorICAgICAgcmV0dXJuIHNCWVRFOworICAgIGNhc2UgMHg1OgorICAgICAgcmV0dXJuIHNGTkMxX0ZJUlNUX1BPU0lUSU9OOworICAgIGNhc2UgMHg3OgorICAgICAgcmV0dXJuIHNFQ0k7CisgICAgY2FzZSAweDg6CisgICAgICByZXR1cm4gc0tBTkpJOworICAgIGNhc2UgMHg5OgorICAgICAgcmV0dXJuIHNGTkMxX1NFQ09ORF9QT1NJVElPTjsKKyAgICBjYXNlIDB4MEQ6CisgICAgICByZXR1cm4gc0dCSzsKKyAgICBkZWZhdWx0OgorICAgICAgZSA9IEJDRXhjZXB0aW9uVW5zdXBwb3J0ZWRNb2RlOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KK30KKworaW50MzJfdCBDQkNfUVJDb2Rlck1vZGU6OkdldEJpdHMoKSBjb25zdCB7CisgIHJldHVybiBtX2JpdHM7Cit9CisKK0J5dGVTdHJpbmcgQ0JDX1FSQ29kZXJNb2RlOjpHZXROYW1lKCkgY29uc3QgeworICByZXR1cm4gbV9uYW1lOworfQorCitpbnQzMl90IENCQ19RUkNvZGVyTW9kZTo6R2V0Q2hhcmFjdGVyQ291bnRCaXRzKGludDMyX3QgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSBjb25zdCB7CisgIGlmIChtX2NoYXJhY3RlckNvdW50Qml0c0ZvclZlcnNpb25zLmVtcHR5KCkpIHsKKyAgICBlID0gQkNFeGNlcHRpb25DaGFyYWN0ZXJOb3RUaGlzTW9kZTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpbnQzMl90IG9mZnNldDsKKyAgaWYgKG51bWJlciA8PSA5KSB7CisgICAgb2Zmc2V0ID0gMDsKKyAgfSBlbHNlIGlmIChudW1iZXIgPD0gMjYpIHsKKyAgICBvZmZzZXQgPSAxOworICB9IGVsc2UgeworICAgIG9mZnNldCA9IDI7CisgIH0KKyAgcmV0dXJuIG1fY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnNbb2Zmc2V0XTsKK30KKwordm9pZCBDQkNfUVJDb2Rlck1vZGU6OkRlc3Ryb3koKSB7CisgIGlmIChzQllURSkgeworICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFOworICAgIHNCWVRFID0gbnVsbHB0cjsKKyAgfQorICBpZiAoc05VTUVSSUMpIHsKKyAgICBkZWxldGUgQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQzsKKyAgICBzTlVNRVJJQyA9IG51bGxwdHI7CisgIH0KKyAgaWYgKHNBTFBIQU5VTUVSSUMpIHsKKyAgICBkZWxldGUgQ0JDX1FSQ29kZXJNb2RlOjpzQUxQSEFOVU1FUklDOworICAgIHNBTFBIQU5VTUVSSUMgPSBudWxscHRyOworICB9CisgIGlmIChzS0FOSkkpIHsKKyAgICBkZWxldGUgQ0JDX1FSQ29kZXJNb2RlOjpzS0FOSkk7CisgICAgc0tBTkpJID0gbnVsbHB0cjsKKyAgfQorICBpZiAoc0VDSSkgeworICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNFQ0k7CisgICAgc0VDSSA9IG51bGxwdHI7CisgIH0KKyAgaWYgKHNHQkspIHsKKyAgICBkZWxldGUgQ0JDX1FSQ29kZXJNb2RlOjpzR0JLOworICAgIHNHQksgPSBudWxscHRyOworICB9CisgIGlmIChzVEVSTUlOQVRPUikgeworICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNURVJNSU5BVE9SOworICAgIHNURVJNSU5BVE9SID0gbnVsbHB0cjsKKyAgfQorICBpZiAoc0ZOQzFfRklSU1RfUE9TSVRJT04pIHsKKyAgICBkZWxldGUgQ0JDX1FSQ29kZXJNb2RlOjpzRk5DMV9GSVJTVF9QT1NJVElPTjsKKyAgICBzRk5DMV9GSVJTVF9QT1NJVElPTiA9IG51bGxwdHI7CisgIH0KKyAgaWYgKHNGTkMxX1NFQ09ORF9QT1NJVElPTikgeworICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNGTkMxX1NFQ09ORF9QT1NJVElPTjsKKyAgICBzRk5DMV9TRUNPTkRfUE9TSVRJT04gPSBudWxscHRyOworICB9CisgIGlmIChzU1RSVUNUVVJFRF9BUFBFTkQpIHsKKyAgICBkZWxldGUgQ0JDX1FSQ29kZXJNb2RlOjpzU1RSVUNUVVJFRF9BUFBFTkQ7CisgICAgc1NUUlVDVFVSRURfQVBQRU5EID0gbnVsbHB0cjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTW9kZS5oIGIvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTW9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMjg0NGQKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNb2RlLmgKQEAgLTAsMCArMSw1MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUk1PREVfSF8KKyNkZWZpbmUgRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSTU9ERV9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorCitjbGFzcyBDQkNfUVJDb2Rlck1vZGUgeworIHB1YmxpYzoKKyAgdmlydHVhbCB+Q0JDX1FSQ29kZXJNb2RlKCk7CisKKyAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOworICBzdGF0aWMgdm9pZCBGaW5hbGl6ZSgpOworICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBGb3JCaXRzKGludDMyX3QgYml0cywgaW50MzJfdCYgZSk7CisgIHN0YXRpYyB2b2lkIERlc3Ryb3koKTsKKworICBpbnQzMl90IEdldENoYXJhY3RlckNvdW50Qml0cyhpbnQzMl90IG51bWJlciwgaW50MzJfdCYgZSkgY29uc3Q7CisgIGludDMyX3QgR2V0Qml0cygpIGNvbnN0OworICBCeXRlU3RyaW5nIEdldE5hbWUoKSBjb25zdDsKKworICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBzQllURTsKKyAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc05VTUVSSUM7CisgIHN0YXRpYyBDQkNfUVJDb2Rlck1vZGUqIHNBTFBIQU5VTUVSSUM7CisgIHN0YXRpYyBDQkNfUVJDb2Rlck1vZGUqIHNLQU5KSTsKKyAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc0VDSTsKKyAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc0dCSzsKKyAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc1RFUk1JTkFUT1I7CisgIHN0YXRpYyBDQkNfUVJDb2Rlck1vZGUqIHNGTkMxX0ZJUlNUX1BPU0lUSU9OOworICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBzRk5DMV9TRUNPTkRfUE9TSVRJT047CisgIHN0YXRpYyBDQkNfUVJDb2Rlck1vZGUqIHNTVFJVQ1RVUkVEX0FQUEVORDsKKworIHByaXZhdGU6CisgIENCQ19RUkNvZGVyTW9kZSgpOworICBDQkNfUVJDb2Rlck1vZGUoc3RkOjp2ZWN0b3I8aW50MzJfdD4gY2hhckNvdW50Qml0cywKKyAgICAgICAgICAgICAgICAgIGludDMyX3QgYml0cywKKyAgICAgICAgICAgICAgICAgIEJ5dGVTdHJpbmcgbmFtZSk7CisKKyAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gbV9jaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9uczsKKyAgY29uc3QgaW50MzJfdCBtX2JpdHM7CisgIGNvbnN0IEJ5dGVTdHJpbmcgbV9uYW1lOworfTsKKworI2VuZGlmICAvLyBGWEJBUkNPREVfUVJDT0RFX0JDX1FSQ09ERVJNT0RFX0hfCmRpZmYgLS1naXQgYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJWZXJzaW9uLmNwcCBiL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlclZlcnNpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTYwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJWZXJzaW9uLmNwcApAQCAtMCwwICsxLDk5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisvLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6CisvKgorICogQ29weXJpZ2h0IDIwMDcgWlhpbmcgYXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyVmVyc2lvbi5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImZ4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQml0VmVjdG9yLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCbG9ja3NEYXRhLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvdXRpbHMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK3N0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDQkNfUVJDb2RlclZlcnNpb24+PiogZ19WRVJTSU9OID0gbnVsbHB0cjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NCQ19RUkNvZGVyVmVyc2lvbjo6Q0JDX1FSQ29kZXJWZXJzaW9uKGludDMyX3QgdmVyc2lvbk51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENCQ19RUkNvZGVyRUNCbG9ja0RhdGEgZGF0YVs0XSkKKyAgICA6IG1fdmVyc2lvbk51bWJlcih2ZXJzaW9uTnVtYmVyKSB7CisgIG1fZWNCbG9ja3NBcnJheVswXSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDQkNfUVJDb2RlckVDQmxvY2tzPihkYXRhWzBdKTsKKyAgbV9lY0Jsb2Nrc0FycmF5WzFdID0gcGRmaXVtOjpNYWtlVW5pcXVlPENCQ19RUkNvZGVyRUNCbG9ja3M+KGRhdGFbMV0pOworICBtX2VjQmxvY2tzQXJyYXlbMl0gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0JDX1FSQ29kZXJFQ0Jsb2Nrcz4oZGF0YVsyXSk7CisgIG1fZWNCbG9ja3NBcnJheVszXSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDQkNfUVJDb2RlckVDQmxvY2tzPihkYXRhWzNdKTsKKyAgbV90b3RhbENvZGVXb3JkcyA9IG1fZWNCbG9ja3NBcnJheVswXS0+R2V0VG90YWxEYXRhQ29kZVdvcmRzKCk7Cit9CisKK0NCQ19RUkNvZGVyVmVyc2lvbjo6fkNCQ19RUkNvZGVyVmVyc2lvbigpIHsKK30KKworLy8gc3RhdGljCit2b2lkIENCQ19RUkNvZGVyVmVyc2lvbjo6SW5pdGlhbGl6ZSgpIHsKKyAgZ19WRVJTSU9OID0gbmV3IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDQkNfUVJDb2RlclZlcnNpb24+PigpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0JDX1FSQ29kZXJWZXJzaW9uOjpGaW5hbGl6ZSgpIHsKKyAgZGVsZXRlIGdfVkVSU0lPTjsKKyAgZ19WRVJTSU9OID0gbnVsbHB0cjsKK30KKworLy8gc3RhdGljCitjb25zdCBDQkNfUVJDb2RlclZlcnNpb24qIENCQ19RUkNvZGVyVmVyc2lvbjo6R2V0VmVyc2lvbkZvck51bWJlcigKKyAgICBpbnQzMl90IHZlcnNpb25OdW1iZXIpIHsKKyAgaWYgKGdfVkVSU0lPTi0+ZW1wdHkoKSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga01heFZlcnNpb247ICsraSkgeworICAgICAgZ19WRVJTSU9OLT5wdXNoX2JhY2soCisgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENCQ19RUkNvZGVyVmVyc2lvbj4oaSArIDEsIGdfRUNCRGF0YVtpXSkpOworICAgIH0KKyAgfQorICBpZiAodmVyc2lvbk51bWJlciA8IDEgfHwgdmVyc2lvbk51bWJlciA+IGtNYXhWZXJzaW9uKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gKCpnX1ZFUlNJT04pW3ZlcnNpb25OdW1iZXIgLSAxXS5nZXQoKTsKK30KKworLy8gc3RhdGljCit2b2lkIENCQ19RUkNvZGVyVmVyc2lvbjo6RGVzdHJveSgpIHsKKyAgZ19WRVJTSU9OLT5jbGVhcigpOworfQorCitpbnQzMl90IENCQ19RUkNvZGVyVmVyc2lvbjo6R2V0VmVyc2lvbk51bWJlcigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fdmVyc2lvbk51bWJlcjsKK30KKworaW50MzJfdCBDQkNfUVJDb2RlclZlcnNpb246OkdldFRvdGFsQ29kZVdvcmRzKCkgY29uc3QgeworICByZXR1cm4gbV90b3RhbENvZGVXb3JkczsKK30KKworaW50MzJfdCBDQkNfUVJDb2RlclZlcnNpb246OkdldERpbWVuc2lvbkZvclZlcnNpb24oKSBjb25zdCB7CisgIHJldHVybiAxNyArIDQgKiBtX3ZlcnNpb25OdW1iZXI7Cit9CisKK2NvbnN0IENCQ19RUkNvZGVyRUNCbG9ja3MqIENCQ19RUkNvZGVyVmVyc2lvbjo6R2V0RUNCbG9ja3NGb3JMZXZlbCgKKyAgICBjb25zdCBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsJiBlY0xldmVsKSBjb25zdCB7CisgIHJldHVybiBtX2VjQmxvY2tzQXJyYXlbZWNMZXZlbC5PcmRpbmFsKCldLmdldCgpOworfQpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyVmVyc2lvbi5oIGIvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyVmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYTIxM2MKLS0tIC9kZXYvbnVsbAorKysgYi9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJWZXJzaW9uLmgKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUlZFUlNJT05fSF8KKyNkZWZpbmUgRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSVkVSU0lPTl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImZ4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQmxvY2tzLmgiCisKK2NsYXNzIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw7CisKK2NsYXNzIENCQ19RUkNvZGVyVmVyc2lvbiB7CisgcHVibGljOgorICBzdGF0aWMgY29uc3RleHByIGludDMyX3Qga01heFZlcnNpb24gPSA0MDsKKworICBDQkNfUVJDb2RlclZlcnNpb24oaW50MzJfdCB2ZXJzaW9uTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0JDX1FSQ29kZXJFQ0Jsb2NrRGF0YSBkYXRhWzRdKTsKKyAgfkNCQ19RUkNvZGVyVmVyc2lvbigpOworCisgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsKKyAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsKKworICBzdGF0aWMgY29uc3QgQ0JDX1FSQ29kZXJWZXJzaW9uKiBHZXRWZXJzaW9uRm9yTnVtYmVyKGludDMyX3QgdmVyc2lvbk51bWJlcik7CisgIHN0YXRpYyB2b2lkIERlc3Ryb3koKTsKKworICBpbnQzMl90IEdldFZlcnNpb25OdW1iZXIoKSBjb25zdDsKKyAgaW50MzJfdCBHZXRUb3RhbENvZGVXb3JkcygpIGNvbnN0OworICBpbnQzMl90IEdldERpbWVuc2lvbkZvclZlcnNpb24oKSBjb25zdDsKKyAgY29uc3QgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyogR2V0RUNCbG9ja3NGb3JMZXZlbCgKKyAgICAgIGNvbnN0IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwmIGVjTGV2ZWwpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgY29uc3QgaW50MzJfdCBtX3ZlcnNpb25OdW1iZXI7CisgIGludDMyX3QgbV90b3RhbENvZGVXb3JkczsKKyAgc3RkOjp1bmlxdWVfcHRyPENCQ19RUkNvZGVyRUNCbG9ja3M+IG1fZWNCbG9ja3NBcnJheVs0XTsKK307CisKKyNlbmRpZiAgLy8gRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSVkVSU0lPTl9IXwpkaWZmIC0tZ2l0IGEvZnhiYXJjb2RlL3V0aWxzLmggYi9meGJhcmNvZGUvdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzAzYWY0Ci0tLSAvZGV2L251bGwKKysrIGIvZnhiYXJjb2RlL3V0aWxzLmgKQEAgLTAsMCArMSw3MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYQkFSQ09ERV9VVElMU19IXworI2RlZmluZSBGWEJBUkNPREVfVVRJTFNfSF8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorCitib29sIEJDX0ZYX0J5dGVTdHJpbmdfUmVwbGFjZShCeXRlU3RyaW5nJiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBjKTsKK3ZvaWQgQkNfRlhfQnl0ZVN0cmluZ19BcHBlbmQoQnl0ZVN0cmluZyYgZHN0LCBpbnQzMl90IGNvdW50LCBjaGFyIGMpOwordm9pZCBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChCeXRlU3RyaW5nJiBkc3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBiYSk7CisKKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXworI2luY2x1ZGUgPGxpbWl0cz4KKyNlbGlmIF9GWF9PU18gPT0gX0ZYX09TX01BQ09TWF8gfHwgX0ZYX09TXyA9PSBfRlhfT1NfTElOVVhfCisjaW5jbHVkZSA8bGltaXRzLmg+CisjZW5kaWYKKworZW51bSBCQ0ZPUk1BVCB7CisgIEJDRk9STUFUX1VOU1BFQ0lGWSA9IC0xLAorICBCQ0ZPUk1BVF9DT0RBQkFSLAorICBCQ0ZPUk1BVF9DT0RFXzM5LAorICBCQ0ZPUk1BVF9DT0RFXzEyOCwKKyAgQkNGT1JNQVRfQ09ERV8xMjhCLAorICBCQ0ZPUk1BVF9DT0RFXzEyOEMsCisgIEJDRk9STUFUX0VBTl84LAorICBCQ0ZPUk1BVF9VUENfQSwKKyAgQkNGT1JNQVRfRUFOXzEzLAorICBCQ0ZPUk1BVF9QREZfNDE3LAorICBCQ0ZPUk1BVF9EQVRBTUFUUklYLAorICBCQ0ZPUk1BVF9RUl9DT0RFCit9OworCisjZGVmaW5lIEJDRXhjZXB0aW9uTk8gMAorI2RlZmluZSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudCAxNgorI2RlZmluZSBCQ0V4Y2VwdGlvbkRlZ3JlZUlzTmVnYXRpdmUgMzEKKyNkZWZpbmUgQkNFeGNlcHRpb25BSXNaZXJvIDM3CisjZGVmaW5lIEJDRXhjZXB0aW9uVmFsdWVNdXN0QmVFaXRoZXIwb3IxIDUwCisjZGVmaW5lIEJDRXhjZXB0aW9uQmFkSW5kZXhFeGNlcHRpb24gNTIKKyNkZWZpbmUgQkNFeGNlcHRpb25Ob1N1Y2hWZXJzaW9uIDU4CisjZGVmaW5lIEJDRXhjZXB0aW9uVW5zdXBwb3J0ZWRNb2RlIDY0CisjZGVmaW5lIEJDRXhjZXB0aW9uSW52YWxpZGF0ZUNoYXJhY3RlciA2NQorI2RlZmluZSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVNYXNrUGF0dGVybiA2OAorI2RlZmluZSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyIDY5CisjZGVmaW5lIEJDRXhjZXB0aW9uQmFkTWFzayA3MAorI2RlZmluZSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVJbWFnZURhdGEgNzMKKyNkZWZpbmUgQkNFeGNlcHRpb25IZWlnaHRfOEJlWmVybyA3NAorI2RlZmluZSBCQ0V4Y2VwdGlvbkNoYXJhY3Rlck5vdFRoaXNNb2RlIDc1CisjZGVmaW5lIEJDRXhjZXB0aW9uSW52YWxpZGF0ZURhdGEgNzcKKyNkZWZpbmUgQkNFeGNlcHRpb25DaGFyYWN0ZXJzT3V0c2lkZUlTTzg4NTkxRW5jb2RpbmcgODcKKyNkZWZpbmUgQkNFeGNlcHRpb25JbGxlZ2FsRGF0YUNvZGV3b3JkcyA4OAorI2RlZmluZSBCQ0V4Y2VwdGlvbklsbGVnYWxTdGF0ZVVuZXhwZWN0ZWRDYXNlIDkwCisjZGVmaW5lIEJDRXhjZXB0aW9uSWxsZWdhbFN0YXRlTWVzc2FnZUxlbmd0aEludmFsaWQgOTIKKyNkZWZpbmUgQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnROb3RHaWdpdHMgOTMKKyNkZWZpbmUgQkNFeGNlcHRpb25JbGxlZ2FsU3RhdGVJbGxlZ2FsTW9kZSA5NAorI2RlZmluZSBCQ0V4Y2VwdGlvbk5vbkVuY29kYWJsZUNoYXJhY3RlckRldGVjdGVkIDk2CisjZGVmaW5lIEJDRXhjZXB0aW9uR2VuZXJpYyAxMDcKKworI2VuZGlmICAvLyBGWEJBUkNPREVfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL2Z4anMvQ0pYX0RlZmluZS5oIGIvZnhqcy9DSlhfRGVmaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEyNmZkNAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvQ0pYX0RlZmluZS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX0NKWF9ERUZJTkVfSF8KKyNkZWZpbmUgRlhKU19DSlhfREVGSU5FX0hfCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmeGpzL2Nqc19yZXR1cm4uaCIKKyNpbmNsdWRlICJmeGpzL2Nqc192OC5oIgorCit0ZW1wbGF0ZSA8Y2xhc3MgQywKKyAgICAgICAgICBDSlNfUmV0dXJuIChDOjoqTSkoQ0pTX1Y4KiBydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk+CitDSlNfUmV0dXJuIEpTTWV0aG9kKEMqIG5vZGUsCisgICAgICAgICAgICAgICAgICAgIENKU19WOCogcnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIChub2RlLT4qTSkocnVudGltZSwgcGFyYW1zKTsKK30KKworI2RlZmluZSBKU19NRVRIT0QobWV0aG9kX25hbWUsIGNsYXNzX25hbWUpICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBDSlNfUmV0dXJuIG1ldGhvZF9uYW1lIyNfc3RhdGljKCAgICAgICAgICAgICAgICAgIFwKKyAgICAgIENKWF9PYmplY3QqIG5vZGUsIENKU19WOCogcnVudGltZSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsgICBcCisgICAgcmV0dXJuIEpTTWV0aG9kPGNsYXNzX25hbWUsICZjbGFzc19uYW1lOjptZXRob2RfbmFtZT4oIFwKKyAgICAgICAgc3RhdGljX2Nhc3Q8Y2xhc3NfbmFtZSo+KG5vZGUpLCBydW50aW1lLCBwYXJhbXMpOyAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIENKU19SZXR1cm4gbWV0aG9kX25hbWUoQ0pTX1Y4KiBydW50aW1lLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykKKworI2RlZmluZSBKU19QUk9QKHByb3BfbmFtZSkgXAorICB2b2lkIHByb3BfbmFtZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwgYm9vbCBiU2V0dGluZywgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKQorCisjZW5kaWYgIC8vIEZYSlNfQ0pYX0RFRklORV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy9ERVBTIGIvZnhqcy9ERVBTCmluZGV4IDYzM2VlZWQuLjRjYzkzZjkgMTAwNjQ0Ci0tLSBhL2Z4anMvREVQUworKysgYi9meGpzL0RFUFMKQEAgLTEsNCArMSwxMSBAQAogaW5jbHVkZV9ydWxlcyA9IFsKKyAgJytjb3JlL2Zkcm0nLAorICAnK2NvcmUvZnBkZmFwaScsCisgICcrY29yZS9mcGRmZG9jJywKICAgJytjb3JlL2Z4Y3J0JywKKyAgJytjb3JlL2Z4Z2UnLAorICAnK3B1YmxpYycsCisgICcrZnBkZnNkaycsCiAgICcrdjgvaW5jbHVkZScsCisgICcreGZhL2Z4ZmEnCiBdCmRpZmYgLS1naXQgYS9meGpzL0pTX0RlZmluZS5jcHAgYi9meGpzL0pTX0RlZmluZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBmNzU1NwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvSlNfRGVmaW5lLmNwcApAQCAtMCwwICsxLDMwOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy9KU19EZWZpbmUuaCIKKworI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnhqcy9janNfZG9jdW1lbnQuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19vYmplY3QuaCIKKworbmFtZXNwYWNlIHsKKworZG91YmxlIEdldExvY2FsVFpBKCkgeworICBpZiAoIUZTREtfSXNTYW5kQm94UG9saWN5RW5hYmxlZChGUERGX1BPTElDWV9NQUNISU5FVElNRV9BQ0NFU1MpKQorICAgIHJldHVybiAwOworICB0aW1lX3QgdCA9IDA7CisgIHRpbWUoJnQpOworICBsb2NhbHRpbWUoJnQpOworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisgIC8vIEluIGdjYyAndGltZXpvbmUnIGlzIGEgZ2xvYmFsIHZhcmlhYmxlIGRlY2xhcmVkIGluIHRpbWUuaC4gSW4gVkMrKywgdGhhdAorICAvLyB2YXJpYWJsZSB3YXMgcmVtb3ZlZCBpbiBWQysrIDIwMTUsIHdpdGggX2dldF90aW1lem9uZSByZXBsYWNpbmcgaXQuCisgIGxvbmcgdGltZXpvbmUgPSAwOworICBfZ2V0X3RpbWV6b25lKCZ0aW1lem9uZSk7CisjZW5kaWYgIC8vIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisgIHJldHVybiAoZG91YmxlKSgtKHRpbWV6b25lICogMTAwMCkpOworfQorCitpbnQgR2V0RGF5bGlnaHRTYXZpbmdUQShkb3VibGUgZCkgeworICBpZiAoIUZTREtfSXNTYW5kQm94UG9saWN5RW5hYmxlZChGUERGX1BPTElDWV9NQUNISU5FVElNRV9BQ0NFU1MpKQorICAgIHJldHVybiAwOworICB0aW1lX3QgdCA9ICh0aW1lX3QpKGQgLyAxMDAwKTsKKyAgc3RydWN0IHRtKiB0bXAgPSBsb2NhbHRpbWUoJnQpOworICBpZiAoIXRtcCkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHRtcC0+dG1faXNkc3QgPiAwKQorICAgIC8vIE9uZSBob3VyLgorICAgIHJldHVybiAoaW50KTYwICogNjAgKiAxMDAwOworICByZXR1cm4gMDsKK30KKworZG91YmxlIE1vZChkb3VibGUgeCwgZG91YmxlIHkpIHsKKyAgZG91YmxlIHIgPSBmbW9kKHgsIHkpOworICBpZiAociA8IDApCisgICAgciArPSB5OworICByZXR1cm4gcjsKK30KKworYm9vbCBJc0xlYXBZZWFyKGludCB5ZWFyKSB7CisgIHJldHVybiAoeWVhciAlIDQgPT0gMCkgJiYgKCh5ZWFyICUgMTAwICE9IDApIHx8ICh5ZWFyICUgNDAwICE9IDApKTsKK30KKworaW50IERheUZyb21ZZWFyKGludCB5KSB7CisgIHJldHVybiAoaW50KSgzNjUgKiAoeSAtIDE5NzAuMCkgKyBmbG9vcigoeSAtIDE5NjkuMCkgLyA0KSAtCisgICAgICAgICAgICAgICBmbG9vcigoeSAtIDE5MDEuMCkgLyAxMDApICsgZmxvb3IoKHkgLSAxNjAxLjApIC8gNDAwKSk7Cit9CisKK2RvdWJsZSBUaW1lRnJvbVllYXIoaW50IHkpIHsKKyAgcmV0dXJuIDg2NDAwMDAwLjAgKiBEYXlGcm9tWWVhcih5KTsKK30KKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGRheXNNb250aFsxMl0gPSB7MCwgICAzMSwgIDU5LCAgOTAsICAxMjAsIDE1MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzR9Oworc3RhdGljIGNvbnN0IHVpbnQxNl90IGxlYXBEYXlzTW9udGhbMTJdID0gezAsICAgMzEsICA2MCwgIDkxLCAgMTIxLCAxNTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgyLCAyMTMsIDI0NCwgMjc0LCAzMDUsIDMzNX07CisKK2RvdWJsZSBUaW1lRnJvbVllYXJNb250aChpbnQgeSwgaW50IG0pIHsKKyAgY29uc3QgdWludDE2X3QqIHBNb250aCA9IElzTGVhcFllYXIoeSkgPyBsZWFwRGF5c01vbnRoIDogZGF5c01vbnRoOworICByZXR1cm4gVGltZUZyb21ZZWFyKHkpICsgKChkb3VibGUpcE1vbnRoW21dKSAqIDg2NDAwMDAwOworfQorCitpbnQgRGF5KGRvdWJsZSB0KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGZsb29yKHQgLyA4NjQwMDAwMC4wKSk7Cit9CisKK2ludCBZZWFyRnJvbVRpbWUoZG91YmxlIHQpIHsKKyAgLy8gZXN0aW1hdGUgdGhlIHRpbWUuCisgIGludCB5ID0gMTk3MCArIHN0YXRpY19jYXN0PGludD4odCAvICgzNjUuMjQyNSAqIDg2NDAwMDAwLjApKTsKKyAgaWYgKFRpbWVGcm9tWWVhcih5KSA8PSB0KSB7CisgICAgd2hpbGUgKFRpbWVGcm9tWWVhcih5ICsgMSkgPD0gdCkKKyAgICAgIHkrKzsKKyAgfSBlbHNlIHsKKyAgICB3aGlsZSAoVGltZUZyb21ZZWFyKHkpID4gdCkKKyAgICAgIHktLTsKKyAgfQorICByZXR1cm4geTsKK30KKworaW50IERheVdpdGhpblllYXIoZG91YmxlIHQpIHsKKyAgaW50IHllYXIgPSBZZWFyRnJvbVRpbWUodCk7CisgIGludCBkYXkgPSBEYXkodCk7CisgIHJldHVybiBkYXkgLSBEYXlGcm9tWWVhcih5ZWFyKTsKK30KKworaW50IE1vbnRoRnJvbVRpbWUoZG91YmxlIHQpIHsKKyAgaW50IGRheSA9IERheVdpdGhpblllYXIodCk7CisgIGludCB5ZWFyID0gWWVhckZyb21UaW1lKHQpOworICBpZiAoMCA8PSBkYXkgJiYgZGF5IDwgMzEpCisgICAgcmV0dXJuIDA7CisgIGlmICgzMSA8PSBkYXkgJiYgZGF5IDwgNTkgKyBJc0xlYXBZZWFyKHllYXIpKQorICAgIHJldHVybiAxOworICBpZiAoKDU5ICsgSXNMZWFwWWVhcih5ZWFyKSkgPD0gZGF5ICYmIGRheSA8ICg5MCArIElzTGVhcFllYXIoeWVhcikpKQorICAgIHJldHVybiAyOworICBpZiAoKDkwICsgSXNMZWFwWWVhcih5ZWFyKSkgPD0gZGF5ICYmIGRheSA8ICgxMjAgKyBJc0xlYXBZZWFyKHllYXIpKSkKKyAgICByZXR1cm4gMzsKKyAgaWYgKCgxMjAgKyBJc0xlYXBZZWFyKHllYXIpKSA8PSBkYXkgJiYgZGF5IDwgKDE1MSArIElzTGVhcFllYXIoeWVhcikpKQorICAgIHJldHVybiA0OworICBpZiAoKDE1MSArIElzTGVhcFllYXIoeWVhcikpIDw9IGRheSAmJiBkYXkgPCAoMTgxICsgSXNMZWFwWWVhcih5ZWFyKSkpCisgICAgcmV0dXJuIDU7CisgIGlmICgoMTgxICsgSXNMZWFwWWVhcih5ZWFyKSkgPD0gZGF5ICYmIGRheSA8ICgyMTIgKyBJc0xlYXBZZWFyKHllYXIpKSkKKyAgICByZXR1cm4gNjsKKyAgaWYgKCgyMTIgKyBJc0xlYXBZZWFyKHllYXIpKSA8PSBkYXkgJiYgZGF5IDwgKDI0MyArIElzTGVhcFllYXIoeWVhcikpKQorICAgIHJldHVybiA3OworICBpZiAoKDI0MyArIElzTGVhcFllYXIoeWVhcikpIDw9IGRheSAmJiBkYXkgPCAoMjczICsgSXNMZWFwWWVhcih5ZWFyKSkpCisgICAgcmV0dXJuIDg7CisgIGlmICgoMjczICsgSXNMZWFwWWVhcih5ZWFyKSkgPD0gZGF5ICYmIGRheSA8ICgzMDQgKyBJc0xlYXBZZWFyKHllYXIpKSkKKyAgICByZXR1cm4gOTsKKyAgaWYgKCgzMDQgKyBJc0xlYXBZZWFyKHllYXIpKSA8PSBkYXkgJiYgZGF5IDwgKDMzNCArIElzTGVhcFllYXIoeWVhcikpKQorICAgIHJldHVybiAxMDsKKyAgaWYgKCgzMzQgKyBJc0xlYXBZZWFyKHllYXIpKSA8PSBkYXkgJiYgZGF5IDwgKDM2NSArIElzTGVhcFllYXIoeWVhcikpKQorICAgIHJldHVybiAxMTsKKworICByZXR1cm4gLTE7Cit9CisKK2ludCBEYXRlRnJvbVRpbWUoZG91YmxlIHQpIHsKKyAgaW50IGRheSA9IERheVdpdGhpblllYXIodCk7CisgIGludCB5ZWFyID0gWWVhckZyb21UaW1lKHQpOworICBpbnQgbGVhcCA9IElzTGVhcFllYXIoeWVhcik7CisgIGludCBtb250aCA9IE1vbnRoRnJvbVRpbWUodCk7CisgIHN3aXRjaCAobW9udGgpIHsKKyAgICBjYXNlIDA6CisgICAgICByZXR1cm4gZGF5ICsgMTsKKyAgICBjYXNlIDE6CisgICAgICByZXR1cm4gZGF5IC0gMzA7CisgICAgY2FzZSAyOgorICAgICAgcmV0dXJuIGRheSAtIDU4IC0gbGVhcDsKKyAgICBjYXNlIDM6CisgICAgICByZXR1cm4gZGF5IC0gODkgLSBsZWFwOworICAgIGNhc2UgNDoKKyAgICAgIHJldHVybiBkYXkgLSAxMTkgLSBsZWFwOworICAgIGNhc2UgNToKKyAgICAgIHJldHVybiBkYXkgLSAxNTAgLSBsZWFwOworICAgIGNhc2UgNjoKKyAgICAgIHJldHVybiBkYXkgLSAxODAgLSBsZWFwOworICAgIGNhc2UgNzoKKyAgICAgIHJldHVybiBkYXkgLSAyMTEgLSBsZWFwOworICAgIGNhc2UgODoKKyAgICAgIHJldHVybiBkYXkgLSAyNDIgLSBsZWFwOworICAgIGNhc2UgOToKKyAgICAgIHJldHVybiBkYXkgLSAyNzIgLSBsZWFwOworICAgIGNhc2UgMTA6CisgICAgICByZXR1cm4gZGF5IC0gMzAzIC0gbGVhcDsKKyAgICBjYXNlIDExOgorICAgICAgcmV0dXJuIGRheSAtIDMzMyAtIGxlYXA7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitkb3VibGUgSlNfR2V0RGF0ZVRpbWUoKSB7CisgIGlmICghRlNES19Jc1NhbmRCb3hQb2xpY3lFbmFibGVkKEZQREZfUE9MSUNZX01BQ0hJTkVUSU1FX0FDQ0VTUykpCisgICAgcmV0dXJuIDA7CisgIHRpbWVfdCB0ID0gdGltZShudWxscHRyKTsKKyAgc3RydWN0IHRtKiBwVG0gPSBsb2NhbHRpbWUoJnQpOworCisgIGludCB5ZWFyID0gcFRtLT50bV95ZWFyICsgMTkwMDsKKyAgZG91YmxlIHQxID0gVGltZUZyb21ZZWFyKHllYXIpOworCisgIHJldHVybiB0MSArIHBUbS0+dG1feWRheSAqIDg2NDAwMDAwLjAgKyBwVG0tPnRtX2hvdXIgKiAzNjAwMDAwLjAgKworICAgICAgICAgcFRtLT50bV9taW4gKiA2MDAwMC4wICsgcFRtLT50bV9zZWMgKiAxMDAwLjA7Cit9CisKK2ludCBKU19HZXRZZWFyRnJvbVRpbWUoZG91YmxlIGR0KSB7CisgIHJldHVybiBZZWFyRnJvbVRpbWUoZHQpOworfQorCitpbnQgSlNfR2V0TW9udGhGcm9tVGltZShkb3VibGUgZHQpIHsKKyAgcmV0dXJuIE1vbnRoRnJvbVRpbWUoZHQpOworfQorCitpbnQgSlNfR2V0RGF5RnJvbVRpbWUoZG91YmxlIGR0KSB7CisgIHJldHVybiBEYXRlRnJvbVRpbWUoZHQpOworfQorCitpbnQgSlNfR2V0SG91ckZyb21UaW1lKGRvdWJsZSBkdCkgeworICByZXR1cm4gKGludClNb2QoZmxvb3IoZHQgLyAoNjAgKiA2MCAqIDEwMDApKSwgMjQpOworfQorCitpbnQgSlNfR2V0TWluRnJvbVRpbWUoZG91YmxlIGR0KSB7CisgIHJldHVybiAoaW50KU1vZChmbG9vcihkdCAvICg2MCAqIDEwMDApKSwgNjApOworfQorCitpbnQgSlNfR2V0U2VjRnJvbVRpbWUoZG91YmxlIGR0KSB7CisgIHJldHVybiAoaW50KU1vZChmbG9vcihkdCAvIDEwMDApLCA2MCk7Cit9CisKK2RvdWJsZSBKU19Mb2NhbFRpbWUoZG91YmxlIGQpIHsKKyAgcmV0dXJuIGQgKyBHZXRMb2NhbFRaQSgpICsgR2V0RGF5bGlnaHRTYXZpbmdUQShkKTsKK30KKworZG91YmxlIEpTX0RhdGVQYXJzZShjb25zdCBXaWRlU3RyaW5nJiBzdHIpIHsKKyAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gdjg6Oklzb2xhdGU6OkdldEN1cnJlbnQoKTsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUocElzb2xhdGUpOworICB2ODo6SGFuZGxlU2NvcGUgc2NvcGUocElzb2xhdGUpOworCisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IHBJc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOworCisgIC8vIFVzZSB0aGUgYnVpbHQtaW4gb2JqZWN0IG1ldGhvZC4KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdiA9CisgICAgICBjb250ZXh0LT5HbG9iYWwoKQorICAgICAgICAgIC0+R2V0KGNvbnRleHQsIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAiRGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0xvY2FsQ2hlY2tlZCgpKQorICAgICAgICAgIC5Ub0xvY2FsQ2hlY2tlZCgpOworICBpZiAodi0+SXNPYmplY3QoKSkgeworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvID0gdi0+VG9PYmplY3QoY29udGV4dCkuVG9Mb2NhbENoZWNrZWQoKTsKKyAgICB2ID0gby0+R2V0KGNvbnRleHQsIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCAicGFyc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvTG9jYWxDaGVja2VkKCkpCisgICAgICAgICAgICAuVG9Mb2NhbENoZWNrZWQoKTsKKyAgICBpZiAodi0+SXNGdW5jdGlvbigpKSB7CisgICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBmdW5DID0gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj46OkNhc3Qodik7CisgICAgICBjb25zdCBpbnQgYXJnYyA9IDE7CisgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB0aW1lU3RyID0KKyAgICAgICAgICBDSlNfUnVudGltZTo6Q3VycmVudFJ1bnRpbWVGcm9tSXNvbGF0ZShwSXNvbGF0ZSktPk5ld1N0cmluZygKKyAgICAgICAgICAgICAgc3RyLkFzU3RyaW5nVmlldygpKTsKKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGFyZ3ZbYXJnY10gPSB7dGltZVN0cn07CisgICAgICB2ID0gZnVuQy0+Q2FsbChjb250ZXh0LCBjb250ZXh0LT5HbG9iYWwoKSwgYXJnYywgYXJndikuVG9Mb2NhbENoZWNrZWQoKTsKKyAgICAgIGlmICh2LT5Jc051bWJlcigpKSB7CisgICAgICAgIGRvdWJsZSBkYXRlID0gdi0+VG9OdW1iZXIoY29udGV4dCkuVG9Mb2NhbENoZWNrZWQoKS0+VmFsdWUoKTsKKyAgICAgICAgaWYgKCFzdGQ6OmlzZmluaXRlKGRhdGUpKQorICAgICAgICAgIHJldHVybiBkYXRlOworICAgICAgICByZXR1cm4gSlNfTG9jYWxUaW1lKGRhdGUpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworZG91YmxlIEpTX01ha2VEYXkoaW50IG5ZZWFyLCBpbnQgbk1vbnRoLCBpbnQgbkRhdGUpIHsKKyAgZG91YmxlIHkgPSBzdGF0aWNfY2FzdDxkb3VibGU+KG5ZZWFyKTsKKyAgZG91YmxlIG0gPSBzdGF0aWNfY2FzdDxkb3VibGU+KG5Nb250aCk7CisgIGRvdWJsZSBkdCA9IHN0YXRpY19jYXN0PGRvdWJsZT4obkRhdGUpOworICBkb3VibGUgeW0gPSB5ICsgZmxvb3IobSAvIDEyKTsKKyAgZG91YmxlIG1uID0gTW9kKG0sIDEyKTsKKyAgZG91YmxlIHQgPSBUaW1lRnJvbVllYXJNb250aChzdGF0aWNfY2FzdDxpbnQ+KHltKSwgc3RhdGljX2Nhc3Q8aW50PihtbikpOworICBpZiAoWWVhckZyb21UaW1lKHQpICE9IHltIHx8IE1vbnRoRnJvbVRpbWUodCkgIT0gbW4gfHwgRGF0ZUZyb21UaW1lKHQpICE9IDEpCisgICAgcmV0dXJuIHN0ZDo6bmFuKCIiKTsKKworICByZXR1cm4gRGF5KHQpICsgZHQgLSAxOworfQorCitkb3VibGUgSlNfTWFrZVRpbWUoaW50IG5Ib3VyLCBpbnQgbk1pbiwgaW50IG5TZWMsIGludCBuTXMpIHsKKyAgZG91YmxlIGggPSBzdGF0aWNfY2FzdDxkb3VibGU+KG5Ib3VyKTsKKyAgZG91YmxlIG0gPSBzdGF0aWNfY2FzdDxkb3VibGU+KG5NaW4pOworICBkb3VibGUgcyA9IHN0YXRpY19jYXN0PGRvdWJsZT4oblNlYyk7CisgIGRvdWJsZSBtaWxsaSA9IHN0YXRpY19jYXN0PGRvdWJsZT4obk1zKTsKKyAgcmV0dXJuIGggKiAzNjAwMDAwICsgbSAqIDYwMDAwICsgcyAqIDEwMDAgKyBtaWxsaTsKK30KKworZG91YmxlIEpTX01ha2VEYXRlKGRvdWJsZSBkYXksIGRvdWJsZSB0aW1lKSB7CisgIGlmICghc3RkOjppc2Zpbml0ZShkYXkpIHx8ICFzdGQ6OmlzZmluaXRlKHRpbWUpKQorICAgIHJldHVybiBzdGQ6Om5hbigiIik7CisKKyAgcmV0dXJuIGRheSAqIDg2NDAwMDAwICsgdGltZTsKK30KKworc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+IEV4cGFuZEtleXdvcmRQYXJhbXMoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgb3JpZ2luYWxzLAorICAgIHNpemVfdCBuS2V5d29yZHMsCisgICAgLi4uKSB7CisgIEFTU0VSVChuS2V5d29yZHMpOworCisgIHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiByZXN1bHQobktleXdvcmRzLCB2ODo6TG9jYWw8djg6OlZhbHVlPigpKTsKKyAgc2l6ZV90IHNpemUgPSBzdGQ6Om1pbihvcmlnaW5hbHMuc2l6ZSgpLCBuS2V5d29yZHMpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkKKyAgICByZXN1bHRbaV0gPSBvcmlnaW5hbHNbaV07CisKKyAgaWYgKG9yaWdpbmFscy5zaXplKCkgIT0gMSB8fCAhb3JpZ2luYWxzWzBdLT5Jc09iamVjdCgpIHx8CisgICAgICBvcmlnaW5hbHNbMF0tPklzQXJyYXkoKSkgeworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgcmVzdWx0WzBdID0gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsgIC8vIE1ha2UgdW5rbm93bi4KKworICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiA9IHBSdW50aW1lLT5Ub09iamVjdChvcmlnaW5hbHNbMF0pOworICB2YV9saXN0IGFwOworICB2YV9zdGFydChhcCwgbktleXdvcmRzKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuS2V5d29yZHM7ICsraSkgeworICAgIGNvbnN0IHdjaGFyX3QqIHByb3BlcnR5ID0gdmFfYXJnKGFwLCBjb25zdCB3Y2hhcl90Kik7CisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdjhWYWx1ZSA9IHBSdW50aW1lLT5HZXRPYmplY3RQcm9wZXJ0eShwT2JqLCBwcm9wZXJ0eSk7CisgICAgaWYgKCF2OFZhbHVlLT5Jc1VuZGVmaW5lZCgpKQorICAgICAgcmVzdWx0W2ldID0gdjhWYWx1ZTsKKyAgfQorICB2YV9lbmQoYXApOworCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9meGpzL0pTX0RlZmluZS5oIGIvZnhqcy9KU19EZWZpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGU1NmY0Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9KU19EZWZpbmUuaApAQCAtMCwwICsxLDE2NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfSlNfREVGSU5FX0hfCisjZGVmaW5lIEZYSlNfSlNfREVGSU5FX0hfCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmeGpzL2Nqc19vYmplY3QuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19yZXR1cm4uaCIKKyNpbmNsdWRlICJmeGpzL2Z4anNfdjguaCIKKyNpbmNsdWRlICJmeGpzL2pzX3Jlc291cmNlcy5oIgorCitkb3VibGUgSlNfR2V0RGF0ZVRpbWUoKTsKK2ludCBKU19HZXRZZWFyRnJvbVRpbWUoZG91YmxlIGR0KTsKK2ludCBKU19HZXRNb250aEZyb21UaW1lKGRvdWJsZSBkdCk7CitpbnQgSlNfR2V0RGF5RnJvbVRpbWUoZG91YmxlIGR0KTsKK2ludCBKU19HZXRIb3VyRnJvbVRpbWUoZG91YmxlIGR0KTsKK2ludCBKU19HZXRNaW5Gcm9tVGltZShkb3VibGUgZHQpOworaW50IEpTX0dldFNlY0Zyb21UaW1lKGRvdWJsZSBkdCk7Citkb3VibGUgSlNfTG9jYWxUaW1lKGRvdWJsZSBkKTsKK2RvdWJsZSBKU19EYXRlUGFyc2UoY29uc3QgV2lkZVN0cmluZyYgc3RyKTsKK2RvdWJsZSBKU19NYWtlRGF5KGludCBuWWVhciwgaW50IG5Nb250aCwgaW50IG5EYXkpOworZG91YmxlIEpTX01ha2VUaW1lKGludCBuSG91ciwgaW50IG5NaW4sIGludCBuU2VjLCBpbnQgbk1zKTsKK2RvdWJsZSBKU19NYWtlRGF0ZShkb3VibGUgZGF5LCBkb3VibGUgdGltZSk7CisKKy8vIFNvbWUgSlMgbWV0aG9kcyBoYXZlIHRoZSBiaXphcnJlIGNvbnZlbnRpb24gdGhhdCB0aGV5IG1heSBhbHNvIGJlIGNhbGxlZAorLy8gd2l0aCBhIHNpbmdsZSBhcmd1bWVudCB3aGljaCBpcyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgYWN0dWFsIGFyZ3VtZW50cworLy8gYXMgaXRzIHByb3BlcnRpZXMuIFRoZSB2YXJ5aW5nIGFyZ3VtZW50cyB0byB0aGlzIG1ldGhvZCBhcmUgdGhlIHByb3BlcnR5CisvLyBuYW1lcyBhcyB3Y2hhcl90IHN0cmluZyBsaXRlcmFscyBjb3JyZXNwb25kaW5nIHRvIGVhY2ggcG9zaXRpb25hbCBhcmd1bWVudC4KKy8vIFRoZSByZXN1bHQgd2lsbCBhbHdheXMgY29udGFpbiB8bktleXdvcmRzfCB2YWx1ZSwgd2l0aCB1bnNwZWNpZmllZCBvbmVzCisvLyBiZWluZyBzZXQgdG8gdHlwZSBWVF91bmtub3duLgorc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+IEV4cGFuZEtleXdvcmRQYXJhbXMoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgb3JpZ2luYWxzLAorICAgIHNpemVfdCBuS2V5d29yZHMsCisgICAgLi4uKTsKKworLy8gQWxsIEpTIGNsYXNzZXMgaGF2ZSBhIG5hbWUsIGFuIG9iamVjdCBkZWZpbnRpb24gSUQsIGFuZCB0aGUgYWJpbGl0eSB0bworLy8gcmVnaXN0ZXIgdGhlbXNlbHZlcyB3aXRoIEZYSlNfVjguIFdlIG5ldmVyIG1ha2UgYSBCQVNFIGNsYXNzIG9uIGl0cyBvd24KKy8vIGJlY2F1c2UgaXQgY2FuJ3QgcmVhbGx5IGRvIGFueXRoaW5nLgorCisvLyBSaWNoIEpTIGNsYXNzZXMgcHJvdmlkZSBjb25zdGFudHMsIG1ldGhvZHMsIHByb3BlcnRpZXMsIGFuZCB0aGUgYWJpbGl0eQorLy8gdG8gY29uc3RydWN0IG5hdGl2ZSBvYmplY3Qgc3RhdGUuCisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBBPgorc3RhdGljIHZvaWQgSlNDb25zdHJ1Y3RvcihDRlhKU19FbmdpbmUqIHBFbmdpbmUsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmopIHsKKyAgQ0pTX09iamVjdCogcE9iaiA9IG5ldyBUKG9iaik7CisgIHBPYmotPlNldEVtYmVkT2JqZWN0KG5ldyBBKHBPYmopKTsKKyAgcEVuZ2luZS0+U2V0T2JqZWN0UHJpdmF0ZShvYmosIHBPYmopOworICBwT2JqLT5Jbml0SW5zdGFuY2Uoc3RhdGljX2Nhc3Q8Q0pTX1J1bnRpbWUqPihwRW5naW5lKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RhdGljIHZvaWQgSlNEZXN0cnVjdG9yKENGWEpTX0VuZ2luZSogcEVuZ2luZSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iaikgeworICBkZWxldGUgc3RhdGljX2Nhc3Q8VCo+KHBFbmdpbmUtPkdldE9iamVjdFByaXZhdGUob2JqKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBDLCBDSlNfUmV0dXJuIChDOjoqTSkoQ0pTX1J1bnRpbWUqKT4KK3ZvaWQgSlNQcm9wR2V0dGVyKGNvbnN0IGNoYXIqIHByb3BfbmFtZV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjbGFzc19uYW1lX3N0cmluZywKKyAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7CisgIENKU19SdW50aW1lKiBwUnVudGltZSA9CisgICAgICBDSlNfUnVudGltZTo6Q3VycmVudFJ1bnRpbWVGcm9tSXNvbGF0ZShpbmZvLkdldElzb2xhdGUoKSk7CisgIGlmICghcFJ1bnRpbWUpCisgICAgcmV0dXJuOworCisgIENKU19PYmplY3QqIHBKU09iaiA9CisgICAgICBzdGF0aWNfY2FzdDxDSlNfT2JqZWN0Kj4ocFJ1bnRpbWUtPkdldE9iamVjdFByaXZhdGUoaW5mby5Ib2xkZXIoKSkpOworICBpZiAoIXBKU09iaikKKyAgICByZXR1cm47CisKKyAgQyogcE9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Qyo+KHBKU09iai0+R2V0RW1iZWRPYmplY3QoKSk7CisgIENKU19SZXR1cm4gcmVzdWx0ID0gKHBPYmotPipNKShwUnVudGltZSk7CisgIGlmIChyZXN1bHQuSGFzRXJyb3IoKSkgeworICAgIHBSdW50aW1lLT5FcnJvcihKU0Zvcm1hdEVycm9yU3RyaW5nKGNsYXNzX25hbWVfc3RyaW5nLCBwcm9wX25hbWVfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5FcnJvcigpKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHJlc3VsdC5IYXNSZXR1cm4oKSkKKyAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KHJlc3VsdC5SZXR1cm4oKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBDLCBDSlNfUmV0dXJuIChDOjoqTSkoQ0pTX1J1bnRpbWUqLCB2ODo6TG9jYWw8djg6OlZhbHVlPik+Cit2b2lkIEpTUHJvcFNldHRlcihjb25zdCBjaGFyKiBwcm9wX25hbWVfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY2xhc3NfbmFtZV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksCisgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2b2lkPiYgaW5mbykgeworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPQorICAgICAgQ0pTX1J1bnRpbWU6OkN1cnJlbnRSdW50aW1lRnJvbUlzb2xhdGUoaW5mby5HZXRJc29sYXRlKCkpOworICBpZiAoIXBSdW50aW1lKQorICAgIHJldHVybjsKKworICBDSlNfT2JqZWN0KiBwSlNPYmogPQorICAgICAgc3RhdGljX2Nhc3Q8Q0pTX09iamVjdCo+KHBSdW50aW1lLT5HZXRPYmplY3RQcml2YXRlKGluZm8uSG9sZGVyKCkpKTsKKyAgaWYgKCFwSlNPYmopCisgICAgcmV0dXJuOworCisgIEMqIHBPYmogPSByZWludGVycHJldF9jYXN0PEMqPihwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpOworICBDSlNfUmV0dXJuIHJlc3VsdCA9IChwT2JqLT4qTSkocFJ1bnRpbWUsIHZhbHVlKTsKKyAgaWYgKHJlc3VsdC5IYXNFcnJvcigpKSB7CisgICAgcFJ1bnRpbWUtPkVycm9yKEpTRm9ybWF0RXJyb3JTdHJpbmcoY2xhc3NfbmFtZV9zdHJpbmcsIHByb3BfbmFtZV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LkVycm9yKCkpKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQywKKyAgICAgICAgICBDSlNfUmV0dXJuIChDOjoqTSkoQ0pTX1J1bnRpbWUqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mKT4KK3ZvaWQgSlNNZXRob2QoY29uc3QgY2hhciogbWV0aG9kX25hbWVfc3RyaW5nLAorICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjbGFzc19uYW1lX3N0cmluZywKKyAgICAgICAgICAgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsKKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0KKyAgICAgIENKU19SdW50aW1lOjpDdXJyZW50UnVudGltZUZyb21Jc29sYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsKKyAgaWYgKCFwUnVudGltZSkKKyAgICByZXR1cm47CisKKyAgQ0pTX09iamVjdCogcEpTT2JqID0KKyAgICAgIHN0YXRpY19jYXN0PENKU19PYmplY3QqPihwUnVudGltZS0+R2V0T2JqZWN0UHJpdmF0ZShpbmZvLkhvbGRlcigpKSk7CisgIGlmICghcEpTT2JqKQorICAgIHJldHVybjsKKworICBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4gcGFyYW1ldGVyczsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCAodW5zaWduZWQgaW50KWluZm8uTGVuZ3RoKCk7IGkrKykKKyAgICBwYXJhbWV0ZXJzLnB1c2hfYmFjayhpbmZvW2ldKTsKKworICBDKiBwT2JqID0gcmVpbnRlcnByZXRfY2FzdDxDKj4ocEpTT2JqLT5HZXRFbWJlZE9iamVjdCgpKTsKKyAgQ0pTX1JldHVybiByZXN1bHQgPSAocE9iai0+Kk0pKHBSdW50aW1lLCBwYXJhbWV0ZXJzKTsKKyAgaWYgKHJlc3VsdC5IYXNFcnJvcigpKSB7CisgICAgcFJ1bnRpbWUtPkVycm9yKEpTRm9ybWF0RXJyb3JTdHJpbmcoY2xhc3NfbmFtZV9zdHJpbmcsIG1ldGhvZF9uYW1lX3N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuRXJyb3IoKSkpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChyZXN1bHQuSGFzUmV0dXJuKCkpCisgICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChyZXN1bHQuUmV0dXJuKCkpOworfQorCisjZGVmaW5lIEpTX1NUQVRJQ19QUk9QKGVycl9uYW1lLCBwcm9wX25hbWUsIGNsYXNzX25hbWUpICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIGdldF8jI3Byb3BfbmFtZSMjX3N0YXRpYyggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgeyAgICAgICAgICBcCisgICAgSlNQcm9wR2V0dGVyPGNsYXNzX25hbWUsICZjbGFzc19uYW1lOjpnZXRfIyNwcm9wX25hbWU+KCAgICAgICBcCisgICAgICAgICNlcnJfbmFtZSwgI2NsYXNzX25hbWUsIHByb3BlcnR5LCBpbmZvKTsgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkIHNldF8jI3Byb3BfbmFtZSMjX3N0YXRpYyggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLCBcCisgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88dm9pZD4mIGluZm8pIHsgICAgICAgICAgICAgICBcCisgICAgSlNQcm9wU2V0dGVyPGNsYXNzX25hbWUsICZjbGFzc19uYW1lOjpzZXRfIyNwcm9wX25hbWU+KCAgICAgICBcCisgICAgICAgICNlcnJfbmFtZSwgI2NsYXNzX25hbWUsIHByb3BlcnR5LCB2YWx1ZSwgaW5mbyk7ICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBKU19TVEFUSUNfTUVUSE9EKG1ldGhvZF9uYW1lLCBjbGFzc19uYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdm9pZCBtZXRob2RfbmFtZSMjX3N0YXRpYyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEpTTWV0aG9kPGNsYXNzX25hbWUsICZjbGFzc19uYW1lOjptZXRob2RfbmFtZT4oI21ldGhvZF9uYW1lLCAjY2xhc3NfbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyk7ICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNlbmRpZiAgLy8gRlhKU19KU19ERUZJTkVfSF8KZGlmZiAtLWdpdCBhL2Z4anMvUkVBRE1FIGIvZnhqcy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjNTgyNwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvUkVBRE1FCkBAIC0wLDAgKzEsMzMgQEAKK1RoZXJlIGFyZSB0d28gc2VwYXJhdGUgd3JhcHBlcnMgZm9yIFY4IGhlcmUuICBPbmUgaXMgY2FsbGVkIEZYSlMsIGFuZAoraXQgaXMgdXNlZCBieSB0aGUgbm9uLVhGQSBjb2RlLiAgVGhlIG90aGVyIGlzIGNhbGxlZCBGWEpTRSwgYW5kIGl0IGlzCit1c2VkIG9ubHkgYnkgdGhlIFhGQSBjb2RlLiAgQWRkaXRpb25hbGx5IEZYSlNFIG1heSByZXF1ZXN0IHNlcnZpY2VzCitmcm9tIEZYSlMgdG8gYnJpZGdlIHRoZSB0d28uCisKK0JvdGggdGhlIEZYSlMgYW5kIEZYSlNFIGJpbmRpbmcgY29kZSBuZWVkcyB0byBiZSByZXBsYWNlZCBieSBzb21ldGhpbmcKK3NhbmVyLCBwZXJoYXBzIEdpbiBvciBwZXJoYXBzIHNvbWUgSURMLiBTZWUKKyAgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3BkZml1bS9pc3N1ZXMvZGV0YWlsP2lkPTcxNgorZm9yIHByb2dyZXNzIG9uIHRoZSBpc3N1ZS4KKworRlhKUyBiaW5kcyBvYmplY3RzIGJ5IHN0aWNraW5nIGEgcG9pbnRlciB0byBhIENGWEpTX1Blck9iamVjdERhdGEgaW4KK3RoZSBWOCBvYmplY3QncyBpbnRlcm5hbCBzbG90LiAgRlhKU0UgYmluZHMgb2JqZWN0cyBieSBzdGlja2luZyBhCitwb2ludGVyIHRvIGVpdGhlciBhbiBhY3R1YWwgdjggZnVuY3Rpb24gb2JqZWN0IG9yIGEgQ0ZYSlNFX0hvc3RPYmplY3QKK2luIHRoZSBWOCBvYmplY3QncyBpbnRlcm5hbCBzbG90LCBkZXBlbmRpbmcgdXBvbiB3aGV0aGVyIHRoZSBvYmplY3QKK3JlcHJlc2VudHMgKGluIHNvbWUgbm90aW9uKSBhICJjbGFzcyIgb3IgYW4gImluc3RhbmNlIi4gQWxzbywgVjggb2JqZWN0cworYm91bmQgaW4gb25lIGxpYnJhcnkgbWF5IHVuZXhwZWN0ZWRseSBhcnJpdmUgYXQgdGhlIG90aGVyIGdpdmVuIGEgc2NyaXB0Cit0aGF0J3MgdHJ5aW5nIHRvIG1lc3Mgd2l0aCB1cy4KKworVG8gZGlzdGluZ3Vpc2ggdGhlc2UgY2FzZXMsIHdlIHVzZSB0d28gaW50ZXJuYWwgc2xvdHMgZm9yIGFsbCBib3VuZAorb2JqZWN0cywgcmVnYXJkbGVzcyBvZiB0aGUgRlhKUy9GWEpTRSBkaXN0aW5jdGlvbi4gIFNsb3QgMCBpcyB0aGUKK3RhZyBhbmQgY29udGFpbnMgZWl0aGVyOgorICBrUGVyT2JqZWN0RGF0YVRhZyBmb3IgRlhKUyBvYmplY3RzLCBvcgorICBnX0ZYSlNFVGFnU3RyaW5nIGZvciBGWEpTRSBIb3N0IG9iamVjdHMsIG9yCisgIE9uZSBvZiA0IHNwZWNpZmljIEZYSlNFX0NMQVNTX0RFU0NSSVBUT1IgZ2xvYmFscyBmb3IgRlhKU0UgY2xhc3NlczoKKyAgICBHbG9iYWxDbGFzc0Rlc2NyaXB0b3IKKyAgICBOb3JtYWxDbGFzc0Rlc2NyaXB0b3IKKyAgICBWYXJpYWJsZXNDbGFzc0Rlc2NyaXB0b3IKKyAgICBmb3JtY2FsY19mbTJqc19kZXNjcmlwdG9yCisKK1Nsb3QgMSdzIGNvbnRlbnRzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZXNlIHRhZ3M6CisgIGtQZXJPYmplY3REYXRhVGFnIG1lYW5zIHRvIGV4cGVjdCBhIENGWEpTX1Blck9iamVjdERhdGEuCisgIGdfRlhKU0VUYWdTdHJpbmcgbWVhbnMgdG8gZXhwZWN0IGEgQ0ZYSlNFX0hvc3RPYmplY3QuCisgIEEgRlhKU0VfQ0xBU1NfREVTQ1JJUFRPUiBwb2ludGVyIG1lYW5zIHRvIGV4cGVjdCBhIHY4IGZ1bmN0aW9uLgpkaWZmIC0tZ2l0IGEvZnhqcy9jZnhqc2VfYXJndW1lbnRzLmNwcCBiL2Z4anMvY2Z4anNlX2FyZ3VtZW50cy5jcHAKaW5kZXggNzU5MDRjYi4uNjYzOTk2YyAxMDA2NDQKLS0tIGEvZnhqcy9jZnhqc2VfYXJndW1lbnRzLmNwcAorKysgYi9meGpzL2NmeGpzZV9hcmd1bWVudHMuY3BwCkBAIC04LDIwICs4LDIzIEBACiAKICNpbmNsdWRlICJmeGpzL2NmeGpzZV9jb250ZXh0LmgiCiAjaW5jbHVkZSAiZnhqcy9jZnhqc2VfdmFsdWUuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKLXY4OjpJc29sYXRlKiBDRlhKU0VfQXJndW1lbnRzOjpHZXRSdW50aW1lKCkgY29uc3QgewotICByZXR1cm4gbV9wUmV0VmFsdWUtPkdldElzb2xhdGUoKTsKLX0KK0NGWEpTRV9Bcmd1bWVudHM6OkNGWEpTRV9Bcmd1bWVudHMoCisgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4qIHBJbmZvLAorICAgIENGWEpTRV9WYWx1ZSogcFJldFZhbHVlKQorICAgIDogbV9wSW5mbyhwSW5mbyksIG1fcFJldFZhbHVlKHBSZXRWYWx1ZSkge30KKworQ0ZYSlNFX0FyZ3VtZW50czo6fkNGWEpTRV9Bcmd1bWVudHMoKSB7fQogCiBpbnQzMl90IENGWEpTRV9Bcmd1bWVudHM6OkdldExlbmd0aCgpIGNvbnN0IHsKICAgcmV0dXJuIG1fcEluZm8tPkxlbmd0aCgpOwogfQogCiBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBDRlhKU0VfQXJndW1lbnRzOjpHZXRWYWx1ZShpbnQzMl90IGluZGV4KSBjb25zdCB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGxwQXJnVmFsdWUoCi0gICAgICBuZXcgQ0ZYSlNFX1ZhbHVlKHY4OjpJc29sYXRlOjpHZXRDdXJyZW50KCkpKTsKLSAgbHBBcmdWYWx1ZS0+Rm9yY2VTZXRWYWx1ZSgoKm1fcEluZm8pW2luZGV4XSk7Ci0gIHJldHVybiBscEFyZ1ZhbHVlOworICBhdXRvIHBBcmdWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHY4OjpJc29sYXRlOjpHZXRDdXJyZW50KCkpOworICBwQXJnVmFsdWUtPkZvcmNlU2V0VmFsdWUoKCptX3BJbmZvKVtpbmRleF0pOworICByZXR1cm4gcEFyZ1ZhbHVlOwogfQogCiBib29sIENGWEpTRV9Bcmd1bWVudHM6OkdldEJvb2xlYW4oaW50MzJfdCBpbmRleCkgY29uc3QgewpAQCAtMzIsMTQgKzM1LDE0IEBACiAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PigoKm1fcEluZm8pW2luZGV4XS0+TnVtYmVyVmFsdWUoKSk7CiB9CiAKLUZYX0ZMT0FUIENGWEpTRV9Bcmd1bWVudHM6OkdldEZsb2F0KGludDMyX3QgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PEZYX0ZMT0FUPigoKm1fcEluZm8pW2luZGV4XS0+TnVtYmVyVmFsdWUoKSk7CitmbG9hdCBDRlhKU0VfQXJndW1lbnRzOjpHZXRGbG9hdChpbnQzMl90IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4oKCptX3BJbmZvKVtpbmRleF0tPk51bWJlclZhbHVlKCkpOwogfQogCi1DRlhfQnl0ZVN0cmluZyBDRlhKU0VfQXJndW1lbnRzOjpHZXRVVEY4U3RyaW5nKGludDMyX3QgaW5kZXgpIGNvbnN0IHsKK0J5dGVTdHJpbmcgQ0ZYSlNFX0FyZ3VtZW50czo6R2V0VVRGOFN0cmluZyhpbnQzMl90IGluZGV4KSBjb25zdCB7CiAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBoU3RyaW5nID0gKCptX3BJbmZvKVtpbmRleF0tPlRvU3RyaW5nKCk7Ci0gIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBzelN0cmluZ1ZhbChoU3RyaW5nKTsKLSAgcmV0dXJuIENGWF9CeXRlU3RyaW5nKCpzelN0cmluZ1ZhbCk7CisgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBzelN0cmluZ1ZhbChtX3BJbmZvLT5HZXRJc29sYXRlKCksIGhTdHJpbmcpOworICByZXR1cm4gQnl0ZVN0cmluZygqc3pTdHJpbmdWYWwpOwogfQogCiBDRlhKU0VfSG9zdE9iamVjdCogQ0ZYSlNFX0FyZ3VtZW50czo6R2V0T2JqZWN0KGludDMyX3QgaW5kZXgsCkBAIC01MSw2ICs1NCw2IEBACiAgIHJldHVybiBGWEpTRV9SZXRyaWV2ZU9iamVjdEJpbmRpbmcoaFZhbHVlLkFzPHY4OjpPYmplY3Q+KCksIHBDbGFzcyk7CiB9CiAKLUNGWEpTRV9WYWx1ZSogQ0ZYSlNFX0FyZ3VtZW50czo6R2V0UmV0dXJuVmFsdWUoKSB7Ci0gIHJldHVybiBtX3BSZXRWYWx1ZTsKK0NGWEpTRV9WYWx1ZSogQ0ZYSlNFX0FyZ3VtZW50czo6R2V0UmV0dXJuVmFsdWUoKSBjb25zdCB7CisgIHJldHVybiBtX3BSZXRWYWx1ZS5HZXQoKTsKIH0KZGlmZiAtLWdpdCBhL2Z4anMvY2Z4anNlX2FyZ3VtZW50cy5oIGIvZnhqcy9jZnhqc2VfYXJndW1lbnRzLmgKaW5kZXggNTFlMTk4MS4uOTJhMzZjOCAxMDA2NDQKLS0tIGEvZnhqcy9jZnhqc2VfYXJndW1lbnRzLmgKKysrIGIvZnhqcy9jZnhqc2VfYXJndW1lbnRzLmgKQEAgLTksMzAgKzksMjkgQEAKIAogI2luY2x1ZGUgPG1lbW9yeT4KIAorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV9jbGFzcy5oIgogI2luY2x1ZGUgImZ4anMvZnhqc2UuaCIKIAotY2xhc3MgQ0ZYSlNFX0NsYXNzOwotCiBjbGFzcyBDRlhKU0VfQXJndW1lbnRzIHsKICBwdWJsaWM6CiAgIENGWEpTRV9Bcmd1bWVudHMoY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4qIHBJbmZvLAotICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFJldFZhbHVlKQotICAgICAgOiBtX3BJbmZvKHBJbmZvKSwgbV9wUmV0VmFsdWUocFJldFZhbHVlKSB7fQorICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFJldFZhbHVlKTsKKyAgfkNGWEpTRV9Bcmd1bWVudHMoKTsKIAotICB2ODo6SXNvbGF0ZSogR2V0UnVudGltZSgpIGNvbnN0OwogICBpbnQzMl90IEdldExlbmd0aCgpIGNvbnN0OwogICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBHZXRWYWx1ZShpbnQzMl90IGluZGV4KSBjb25zdDsKICAgYm9vbCBHZXRCb29sZWFuKGludDMyX3QgaW5kZXgpIGNvbnN0OwogICBpbnQzMl90IEdldEludDMyKGludDMyX3QgaW5kZXgpIGNvbnN0OwotICBGWF9GTE9BVCBHZXRGbG9hdChpbnQzMl90IGluZGV4KSBjb25zdDsKLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0VVRGOFN0cmluZyhpbnQzMl90IGluZGV4KSBjb25zdDsKKyAgZmxvYXQgR2V0RmxvYXQoaW50MzJfdCBpbmRleCkgY29uc3Q7CisgIEJ5dGVTdHJpbmcgR2V0VVRGOFN0cmluZyhpbnQzMl90IGluZGV4KSBjb25zdDsKICAgQ0ZYSlNFX0hvc3RPYmplY3QqIEdldE9iamVjdChpbnQzMl90IGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9DbGFzcyogcENsYXNzID0gbnVsbHB0cikgY29uc3Q7Ci0gIENGWEpTRV9WYWx1ZSogR2V0UmV0dXJuVmFsdWUoKTsKKyAgQ0ZYSlNFX1ZhbHVlKiBHZXRSZXR1cm5WYWx1ZSgpIGNvbnN0OwogCiAgcHJpdmF0ZToKICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4qIG1fcEluZm87Ci0gIENGWEpTRV9WYWx1ZSogbV9wUmV0VmFsdWU7CisgIFVub3duZWRQdHI8Q0ZYSlNFX1ZhbHVlPiBtX3BSZXRWYWx1ZTsKIH07CiAKICNlbmRpZiAgLy8gRlhKU19DRlhKU0VfQVJHVU1FTlRTX0hfCmRpZmYgLS1naXQgYS9meGpzL2NmeGpzZV9jbGFzcy5jcHAgYi9meGpzL2NmeGpzZV9jbGFzcy5jcHAKaW5kZXggZmQ5N2I1Ny4uZGQyMTgxYiAxMDA2NDQKLS0tIGEvZnhqcy9jZnhqc2VfY2xhc3MuY3BwCisrKyBiL2Z4anMvY2Z4anNlX2NsYXNzLmNwcApAQCAtNyw5ICs3LDE0IEBACiAjaW5jbHVkZSAiZnhqcy9jZnhqc2VfY2xhc3MuaCIKIAogI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgogCisjaW5jbHVkZSAiZnhqcy9jZnhqc2VfYXJndW1lbnRzLmgiCiAjaW5jbHVkZSAiZnhqcy9jZnhqc2VfY29udGV4dC5oIgogI2luY2x1ZGUgImZ4anMvY2Z4anNlX3ZhbHVlLmgiCisjaW5jbHVkZSAiZnhqcy9janNfcmV0dXJuLmgiCisjaW5jbHVkZSAiZnhqcy9qc19yZXNvdXJjZXMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKIG5hbWVzcGFjZSB7CiAKQEAgLTIxLDczICsyNiwxNiBAQAogICBpZiAoIWxwRnVuY3Rpb25JbmZvKQogICAgIHJldHVybjsKIAotICBDRlhfQnl0ZVN0cmluZ0Mgc3pGdW5jdGlvbk5hbWUobHBGdW5jdGlvbkluZm8tPm5hbWUpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBscFRoaXNWYWx1ZSgKLSAgICAgIG5ldyBDRlhKU0VfVmFsdWUoaW5mby5HZXRJc29sYXRlKCkpKTsKLSAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUoaW5mby5UaGlzKCkpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBscFJldFZhbHVlKG5ldyBDRlhKU0VfVmFsdWUoaW5mby5HZXRJc29sYXRlKCkpKTsKKyAgQnl0ZVN0cmluZ1ZpZXcgc3pGdW5jdGlvbk5hbWUobHBGdW5jdGlvbkluZm8tPm5hbWUpOworICBhdXRvIGxwVGhpc1ZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4oaW5mby5HZXRJc29sYXRlKCkpOworICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShpbmZvLkhvbGRlcigpKTsKKyAgYXV0byBscFJldFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4oaW5mby5HZXRJc29sYXRlKCkpOwogICBDRlhKU0VfQXJndW1lbnRzIGltcGwoJmluZm8sIGxwUmV0VmFsdWUuZ2V0KCkpOwogICBscEZ1bmN0aW9uSW5mby0+Y2FsbGJhY2tQcm9jKGxwVGhpc1ZhbHVlLmdldCgpLCBzekZ1bmN0aW9uTmFtZSwgaW1wbCk7CiAgIGlmICghbHBSZXRWYWx1ZS0+RGlyZWN0R2V0VmFsdWUoKS5Jc0VtcHR5KCkpCiAgICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChscFJldFZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpKTsKIH0KIAotdm9pZCBWOENsYXNzR2xvYmFsQ29uc3RydWN0b3JDYWxsYmFja19XcmFwcGVyKAotICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7Ci0gIGNvbnN0IEZYSlNFX0NMQVNTX0RFU0NSSVBUT1IqIGxwQ2xhc3NEZWZpbml0aW9uID0KLSAgICAgIHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTX0RFU0NSSVBUT1IqPigKLSAgICAgICAgICBpbmZvLkRhdGEoKS5Bczx2ODo6RXh0ZXJuYWw+KCktPlZhbHVlKCkpOwotICBpZiAoIWxwQ2xhc3NEZWZpbml0aW9uKQotICAgIHJldHVybjsKLQotICBDRlhfQnl0ZVN0cmluZ0Mgc3pGdW5jdGlvbk5hbWUobHBDbGFzc0RlZmluaXRpb24tPm5hbWUpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBscFRoaXNWYWx1ZSgKLSAgICAgIG5ldyBDRlhKU0VfVmFsdWUoaW5mby5HZXRJc29sYXRlKCkpKTsKLSAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUoaW5mby5UaGlzKCkpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBscFJldFZhbHVlKG5ldyBDRlhKU0VfVmFsdWUoaW5mby5HZXRJc29sYXRlKCkpKTsKLSAgQ0ZYSlNFX0FyZ3VtZW50cyBpbXBsKCZpbmZvLCBscFJldFZhbHVlLmdldCgpKTsKLSAgbHBDbGFzc0RlZmluaXRpb24tPmNvbnN0cnVjdG9yKGxwVGhpc1ZhbHVlLmdldCgpLCBzekZ1bmN0aW9uTmFtZSwgaW1wbCk7Ci0gIGlmICghbHBSZXRWYWx1ZS0+RGlyZWN0R2V0VmFsdWUoKS5Jc0VtcHR5KCkpCi0gICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChscFJldFZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpKTsKLX0KLQotdm9pZCBWOEdldHRlckNhbGxiYWNrX1dyYXBwZXIodjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsKLSAgY29uc3QgRlhKU0VfUFJPUEVSVFlfREVTQ1JJUFRPUiogbHBQcm9wZXJ0eUluZm8gPQotICAgICAgc3RhdGljX2Nhc3Q8RlhKU0VfUFJPUEVSVFlfREVTQ1JJUFRPUio+KAotICAgICAgICAgIGluZm8uRGF0YSgpLkFzPHY4OjpFeHRlcm5hbD4oKS0+VmFsdWUoKSk7Ci0gIGlmICghbHBQcm9wZXJ0eUluZm8pCi0gICAgcmV0dXJuOwotCi0gIENGWF9CeXRlU3RyaW5nQyBzelByb3BlcnR5TmFtZShscFByb3BlcnR5SW5mby0+bmFtZSk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGxwVGhpc1ZhbHVlKAotICAgICAgbmV3IENGWEpTRV9WYWx1ZShpbmZvLkdldElzb2xhdGUoKSkpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBscFByb3BWYWx1ZSgKLSAgICAgIG5ldyBDRlhKU0VfVmFsdWUoaW5mby5HZXRJc29sYXRlKCkpKTsKLSAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUoaW5mby5UaGlzKCkpOwotICBscFByb3BlcnR5SW5mby0+Z2V0UHJvYyhscFRoaXNWYWx1ZS5nZXQoKSwgc3pQcm9wZXJ0eU5hbWUsIGxwUHJvcFZhbHVlLmdldCgpKTsKLSAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChscFByb3BWYWx1ZS0+RGlyZWN0R2V0VmFsdWUoKSk7Ci19Ci0KLXZvaWQgVjhTZXR0ZXJDYWxsYmFja19XcmFwcGVyKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHZvaWQ+JiBpbmZvKSB7Ci0gIGNvbnN0IEZYSlNFX1BST1BFUlRZX0RFU0NSSVBUT1IqIGxwUHJvcGVydHlJbmZvID0KLSAgICAgIHN0YXRpY19jYXN0PEZYSlNFX1BST1BFUlRZX0RFU0NSSVBUT1IqPigKLSAgICAgICAgICBpbmZvLkRhdGEoKS5Bczx2ODo6RXh0ZXJuYWw+KCktPlZhbHVlKCkpOwotICBpZiAoIWxwUHJvcGVydHlJbmZvKQotICAgIHJldHVybjsKLQotICBDRlhfQnl0ZVN0cmluZ0Mgc3pQcm9wZXJ0eU5hbWUobHBQcm9wZXJ0eUluZm8tPm5hbWUpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBscFRoaXNWYWx1ZSgKLSAgICAgIG5ldyBDRlhKU0VfVmFsdWUoaW5mby5HZXRJc29sYXRlKCkpKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gbHBQcm9wVmFsdWUoCi0gICAgICBuZXcgQ0ZYSlNFX1ZhbHVlKGluZm8uR2V0SXNvbGF0ZSgpKSk7Ci0gIGxwVGhpc1ZhbHVlLT5Gb3JjZVNldFZhbHVlKGluZm8uVGhpcygpKTsKLSAgbHBQcm9wVmFsdWUtPkZvcmNlU2V0VmFsdWUodmFsdWUpOwotICBscFByb3BlcnR5SW5mby0+c2V0UHJvYyhscFRoaXNWYWx1ZS5nZXQoKSwgc3pQcm9wZXJ0eU5hbWUsIGxwUHJvcFZhbHVlLmdldCgpKTsKLX0KLQogdm9pZCBWOENvbnN0cnVjdG9yQ2FsbGJhY2tfV3JhcHBlcigKICAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgewogICBpZiAoIWluZm8uSXNDb25zdHJ1Y3RDYWxsKCkpCkBAIC05OSw4ICs0Nyw4IEBACiAgIGlmICghbHBDbGFzc0RlZmluaXRpb24pCiAgICAgcmV0dXJuOwogCi0gIEFTU0VSVChpbmZvLlRoaXMoKS0+SW50ZXJuYWxGaWVsZENvdW50KCkpOwotICBpbmZvLlRoaXMoKS0+U2V0QWxpZ25lZFBvaW50ZXJJbkludGVybmFsRmllbGQoMCwgbnVsbHB0cik7CisgIEFTU0VSVChpbmZvLkhvbGRlcigpLT5JbnRlcm5hbEZpZWxkQ291bnQoKSk7CisgIGluZm8uSG9sZGVyKCktPlNldEFsaWduZWRQb2ludGVySW5JbnRlcm5hbEZpZWxkKDAsIG51bGxwdHIpOwogfQogCiB2b2lkIENvbnRleHRfR2xvYmFsT2JqVG9TdHJpbmcoCkBAIC0xMTEsMTUgKzU5LDE0IEBACiAgICAgcmV0dXJuOwogCiAgIGlmIChpbmZvLlRoaXMoKSA9PSBpbmZvLkhvbGRlcigpICYmIGxwQ2xhc3MtPm5hbWUpIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBzelN0cmluZ1ZhbDsKLSAgICBzelN0cmluZ1ZhbC5Gb3JtYXQoIltvYmplY3QgJXNdIiwgbHBDbGFzcy0+bmFtZSk7CisgICAgQnl0ZVN0cmluZyBzelN0cmluZ1ZhbCA9IEJ5dGVTdHJpbmc6OkZvcm1hdCgiW29iamVjdCAlc10iLCBscENsYXNzLT5uYW1lKTsKICAgICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KAogICAgICAgICBpbmZvLkdldElzb2xhdGUoKSwgc3pTdHJpbmdWYWwuY19zdHIoKSwgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywKICAgICAgICAgc3pTdHJpbmdWYWwuR2V0TGVuZ3RoKCkpKTsKICAgICByZXR1cm47CiAgIH0KICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGxvY2FsX3N0ciA9Ci0gICAgICBpbmZvLlRoaXMoKQorICAgICAgaW5mby5Ib2xkZXIoKQogICAgICAgICAgIC0+T2JqZWN0UHJvdG9Ub1N0cmluZyhpbmZvLkdldElzb2xhdGUoKS0+R2V0Q3VycmVudENvbnRleHQoKSkKICAgICAgICAgICAuRnJvbU1heWJlKHY4OjpMb2NhbDx2ODo6U3RyaW5nPigpKTsKICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChsb2NhbF9zdHIpOwpAQCAtMTMzLDIzICs4MCwyOSBAQAogICB2ODo6TG9jYWw8djg6OlN0cmluZz4gaFByb3BOYW1lID0KICAgICAgIGhDYWxsQmFja0luZm8tPkdldEludGVybmFsRmllbGQoMSkuQXM8djg6OlN0cmluZz4oKTsKICAgQVNTRVJUKGxwQ2xhc3MgJiYgIWhQcm9wTmFtZS5Jc0VtcHR5KCkpOwotICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgc3pQcm9wTmFtZShoUHJvcE5hbWUpOwotICBDRlhfQnl0ZVN0cmluZ0Mgc3pGeFByb3BOYW1lID0gKnN6UHJvcE5hbWU7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGxwVGhpc1ZhbHVlKAotICAgICAgbmV3IENGWEpTRV9WYWx1ZShpbmZvLkdldElzb2xhdGUoKSkpOwotICBscFRoaXNWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShpbmZvLlRoaXMoKSk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGxwUmV0VmFsdWUobmV3IENGWEpTRV9WYWx1ZShpbmZvLkdldElzb2xhdGUoKSkpOwotICBDRlhKU0VfQXJndW1lbnRzIGltcGwoJmluZm8sIGxwUmV0VmFsdWUuZ2V0KCkpOwotICBscENsYXNzLT5keW5NZXRob2RDYWxsKGxwVGhpc1ZhbHVlLmdldCgpLCBzekZ4UHJvcE5hbWUsIGltcGwpOwotICBpZiAoIWxwUmV0VmFsdWUtPkRpcmVjdEdldFZhbHVlKCkuSXNFbXB0eSgpKQotICAgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQobHBSZXRWYWx1ZS0+RGlyZWN0R2V0VmFsdWUoKSk7CisKKyAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHN6UHJvcE5hbWUoaW5mby5HZXRJc29sYXRlKCksIGhQcm9wTmFtZSk7CisgIFdpZGVTdHJpbmcgc3pGeFByb3BOYW1lID0gV2lkZVN0cmluZzo6RnJvbVVURjgoKnN6UHJvcE5hbWUpOworCisgIENKU19SZXR1cm4gcmVzdWx0ID0gbHBDbGFzcy0+ZHluTWV0aG9kQ2FsbChpbmZvLCBzekZ4UHJvcE5hbWUpOworICBpZiAocmVzdWx0Lkhhc0Vycm9yKCkpIHsKKyAgICBXaWRlU3RyaW5nIGVyciA9IEpTRm9ybWF0RXJyb3JTdHJpbmcoKnN6UHJvcE5hbWUsICIiLCByZXN1bHQuRXJyb3IoKSk7CisgICAgdjg6Ok1heWJlTG9jYWw8djg6OlN0cmluZz4gc3RyID0gdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgoCisgICAgICAgIGluZm8uR2V0SXNvbGF0ZSgpLCBCeXRlU3RyaW5nOjpGcm9tVW5pY29kZShlcnIpLmNfc3RyKCksCisgICAgICAgIHY4OjpOZXdTdHJpbmdUeXBlOjprTm9ybWFsKTsKKyAgICBpbmZvLkdldElzb2xhdGUoKS0+VGhyb3dFeGNlcHRpb24oc3RyLlRvTG9jYWxDaGVja2VkKCkpOworICAgIHJldHVybjsKKyAgfQorICBpZiAocmVzdWx0Lkhhc1JldHVybigpKQorICAgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQocmVzdWx0LlJldHVybigpKTsKIH0KIAogdm9pZCBEeW5Qcm9wR2V0dGVyQWRhcHRlcihjb25zdCBGWEpTRV9DTEFTU19ERVNDUklQVE9SKiBscENsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHBPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6UHJvcE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFZhbHVlKSB7CiAgIEFTU0VSVChscENsYXNzKTsKKwogICBpbnQzMl90IG5Qcm9wVHlwZSA9CiAgICAgICBscENsYXNzLT5keW5Qcm9wVHlwZUdldHRlciA9PSBudWxscHRyCiAgICAgICAgICAgPyBGWEpTRV9DbGFzc1Byb3BUeXBlX1Byb3BlcnR5CkBAIC0xODMsNyArMTM2LDcgQEAKIAogdm9pZCBEeW5Qcm9wU2V0dGVyQWRhcHRlcihjb25zdCBGWEpTRV9DTEFTU19ERVNDUklQVE9SKiBscENsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHBPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6UHJvcE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFZhbHVlKSB7CiAgIEFTU0VSVChscENsYXNzKTsKICAgaW50MzJfdCBuUHJvcFR5cGUgPQpAQCAtMTk4LDcgKzE1MSw3IEBACiAKIGJvb2wgRHluUHJvcFF1ZXJ5QWRhcHRlcihjb25zdCBGWEpTRV9DTEFTU19ERVNDUklQVE9SKiBscENsYXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pQcm9wTmFtZSkgewogICBBU1NFUlQobHBDbGFzcyk7CiAgIGludDMyX3QgblByb3BUeXBlID0KICAgICAgIGxwQ2xhc3MtPmR5blByb3BUeXBlR2V0dGVyID09IG51bGxwdHIKQEAgLTIwNywzNCArMTYwLDE3IEBACiAgIHJldHVybiBuUHJvcFR5cGUgIT0gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Ob25lOwogfQogCi1ib29sIER5blByb3BEZWxldGVyQWRhcHRlcihjb25zdCBGWEpTRV9DTEFTU19ERVNDUklQVE9SKiBscENsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lKSB7Ci0gIEFTU0VSVChscENsYXNzKTsKLSAgaW50MzJfdCBuUHJvcFR5cGUgPQotICAgICAgbHBDbGFzcy0+ZHluUHJvcFR5cGVHZXR0ZXIgPT0gbnVsbHB0cgotICAgICAgICAgID8gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Qcm9wZXJ0eQotICAgICAgICAgIDogbHBDbGFzcy0+ZHluUHJvcFR5cGVHZXR0ZXIocE9iamVjdCwgc3pQcm9wTmFtZSwgZmFsc2UpOwotICBpZiAoblByb3BUeXBlICE9IEZYSlNFX0NsYXNzUHJvcFR5cGVfTWV0aG9kKSB7Ci0gICAgaWYgKGxwQ2xhc3MtPmR5blByb3BEZWxldGVyKQotICAgICAgcmV0dXJuIGxwQ2xhc3MtPmR5blByb3BEZWxldGVyKHBPYmplY3QsIHN6UHJvcE5hbWUpOwotICAgIHJldHVybiBuUHJvcFR5cGUgIT0gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Qcm9wZXJ0eTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KIHZvaWQgTmFtZWRQcm9wZXJ0eVF1ZXJ5Q2FsbGJhY2soCiAgICAgdjg6OkxvY2FsPHY4OjpOYW1lPiBwcm9wZXJ0eSwKICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OkludGVnZXI+JiBpbmZvKSB7Ci0gIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiB0aGlzT2JqZWN0ID0gaW5mby5UaGlzKCk7CisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiB0aGlzT2JqZWN0ID0gaW5mby5Ib2xkZXIoKTsKICAgY29uc3QgRlhKU0VfQ0xBU1NfREVTQ1JJUFRPUiogbHBDbGFzcyA9IHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTX0RFU0NSSVBUT1IqPigKICAgICAgIGluZm8uRGF0YSgpLkFzPHY4OjpFeHRlcm5hbD4oKS0+VmFsdWUoKSk7CiAgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IGluZm8uR2V0SXNvbGF0ZSgpOwogICB2ODo6SGFuZGxlU2NvcGUgc2NvcGUocElzb2xhdGUpOwotICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgc3pQcm9wTmFtZShwcm9wZXJ0eSk7Ci0gIENGWF9CeXRlU3RyaW5nQyBzekZ4UHJvcE5hbWUoKnN6UHJvcE5hbWUsIHN6UHJvcE5hbWUubGVuZ3RoKCkpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBscFRoaXNWYWx1ZSgKLSAgICAgIG5ldyBDRlhKU0VfVmFsdWUoaW5mby5HZXRJc29sYXRlKCkpKTsKKyAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHN6UHJvcE5hbWUocElzb2xhdGUsIHByb3BlcnR5KTsKKyAgQnl0ZVN0cmluZ1ZpZXcgc3pGeFByb3BOYW1lKCpzelByb3BOYW1lLCBzelByb3BOYW1lLmxlbmd0aCgpKTsKKyAgYXV0byBscFRoaXNWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KGluZm8uR2V0SXNvbGF0ZSgpKTsKICAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUodGhpc09iamVjdCk7CiAgIGlmIChEeW5Qcm9wUXVlcnlBZGFwdGVyKGxwQ2xhc3MsIGxwVGhpc1ZhbHVlLmdldCgpLCBzekZ4UHJvcE5hbWUpKSB7CiAgICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCh2ODo6RG9udERlbGV0ZSk7CkBAIC0yNDQsMzUgKzE4MCwxNyBAQAogICBpbmZvLkdldFJldHVyblZhbHVlKCkuU2V0KGlWOEFic2VudCk7CiB9CiAKLXZvaWQgTmFtZWRQcm9wZXJ0eURlbGV0ZXJDYWxsYmFjaygKLSAgICB2ODo6TG9jYWw8djg6Ok5hbWU+IHByb3BlcnR5LAotICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6Qm9vbGVhbj4mIGluZm8pIHsKLSAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHRoaXNPYmplY3QgPSBpbmZvLlRoaXMoKTsKLSAgY29uc3QgRlhKU0VfQ0xBU1NfREVTQ1JJUFRPUiogbHBDbGFzcyA9IHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTX0RFU0NSSVBUT1IqPigKLSAgICAgIGluZm8uRGF0YSgpLkFzPHY4OjpFeHRlcm5hbD4oKS0+VmFsdWUoKSk7Ci0gIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IGluZm8uR2V0SXNvbGF0ZSgpOwotICB2ODo6SGFuZGxlU2NvcGUgc2NvcGUocElzb2xhdGUpOwotICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgc3pQcm9wTmFtZShwcm9wZXJ0eSk7Ci0gIENGWF9CeXRlU3RyaW5nQyBzekZ4UHJvcE5hbWUoKnN6UHJvcE5hbWUsIHN6UHJvcE5hbWUubGVuZ3RoKCkpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBscFRoaXNWYWx1ZSgKLSAgICAgIG5ldyBDRlhKU0VfVmFsdWUoaW5mby5HZXRJc29sYXRlKCkpKTsKLSAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUodGhpc09iamVjdCk7Ci0gIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQoCi0gICAgICAhIUR5blByb3BEZWxldGVyQWRhcHRlcihscENsYXNzLCBscFRoaXNWYWx1ZS5nZXQoKSwgc3pGeFByb3BOYW1lKSk7Ci19Ci0KIHZvaWQgTmFtZWRQcm9wZXJ0eUdldHRlckNhbGxiYWNrKAogICAgIHY4OjpMb2NhbDx2ODo6TmFtZT4gcHJvcGVydHksCiAgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsKLSAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHRoaXNPYmplY3QgPSBpbmZvLlRoaXMoKTsKKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHRoaXNPYmplY3QgPSBpbmZvLkhvbGRlcigpOwogICBjb25zdCBGWEpTRV9DTEFTU19ERVNDUklQVE9SKiBscENsYXNzID0gc3RhdGljX2Nhc3Q8RlhKU0VfQ0xBU1NfREVTQ1JJUFRPUio+KAogICAgICAgaW5mby5EYXRhKCkuQXM8djg6OkV4dGVybmFsPigpLT5WYWx1ZSgpKTsKLSAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHN6UHJvcE5hbWUocHJvcGVydHkpOwotICBDRlhfQnl0ZVN0cmluZ0Mgc3pGeFByb3BOYW1lKCpzelByb3BOYW1lLCBzelByb3BOYW1lLmxlbmd0aCgpKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gbHBUaGlzVmFsdWUoCi0gICAgICBuZXcgQ0ZYSlNFX1ZhbHVlKGluZm8uR2V0SXNvbGF0ZSgpKSk7CisgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBzelByb3BOYW1lKGluZm8uR2V0SXNvbGF0ZSgpLCBwcm9wZXJ0eSk7CisgIEJ5dGVTdHJpbmdWaWV3IHN6RnhQcm9wTmFtZSgqc3pQcm9wTmFtZSwgc3pQcm9wTmFtZS5sZW5ndGgoKSk7CisgIGF1dG8gbHBUaGlzVmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihpbmZvLkdldElzb2xhdGUoKSk7CiAgIGxwVGhpc1ZhbHVlLT5Gb3JjZVNldFZhbHVlKHRoaXNPYmplY3QpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBscE5ld1ZhbHVlKG5ldyBDRlhKU0VfVmFsdWUoaW5mby5HZXRJc29sYXRlKCkpKTsKKyAgYXV0byBscE5ld1ZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4oaW5mby5HZXRJc29sYXRlKCkpOwogICBEeW5Qcm9wR2V0dGVyQWRhcHRlcihscENsYXNzLCBscFRoaXNWYWx1ZS5nZXQoKSwgc3pGeFByb3BOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBscE5ld1ZhbHVlLmdldCgpKTsKICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChscE5ld1ZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpKTsKQEAgLTI4MiwxNiArMjAwLDE1IEBACiAgICAgdjg6OkxvY2FsPHY4OjpOYW1lPiBwcm9wZXJ0eSwKICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSwKICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgewotICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gdGhpc09iamVjdCA9IGluZm8uVGhpcygpOworICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gdGhpc09iamVjdCA9IGluZm8uSG9sZGVyKCk7CiAgIGNvbnN0IEZYSlNFX0NMQVNTX0RFU0NSSVBUT1IqIGxwQ2xhc3MgPSBzdGF0aWNfY2FzdDxGWEpTRV9DTEFTU19ERVNDUklQVE9SKj4oCiAgICAgICBpbmZvLkRhdGEoKS5Bczx2ODo6RXh0ZXJuYWw+KCktPlZhbHVlKCkpOwotICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgc3pQcm9wTmFtZShwcm9wZXJ0eSk7Ci0gIENGWF9CeXRlU3RyaW5nQyBzekZ4UHJvcE5hbWUoKnN6UHJvcE5hbWUsIHN6UHJvcE5hbWUubGVuZ3RoKCkpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBscFRoaXNWYWx1ZSgKLSAgICAgIG5ldyBDRlhKU0VfVmFsdWUoaW5mby5HZXRJc29sYXRlKCkpKTsKKyAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHN6UHJvcE5hbWUoaW5mby5HZXRJc29sYXRlKCksIHByb3BlcnR5KTsKKyAgQnl0ZVN0cmluZ1ZpZXcgc3pGeFByb3BOYW1lKCpzelByb3BOYW1lLCBzelByb3BOYW1lLmxlbmd0aCgpKTsKKyAgYXV0byBscFRoaXNWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KGluZm8uR2V0SXNvbGF0ZSgpKTsKICAgbHBUaGlzVmFsdWUtPkZvcmNlU2V0VmFsdWUodGhpc09iamVjdCk7CiAKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gbHBOZXdWYWx1ZShuZXcgQ0ZYSlNFX1ZhbHVlKGluZm8uR2V0SXNvbGF0ZSgpKSk7CisgIGF1dG8gbHBOZXdWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KGluZm8uR2V0SXNvbGF0ZSgpKTsKICAgbHBOZXdWYWx1ZS0+Rm9yY2VTZXRWYWx1ZSh2YWx1ZSk7CiAgIER5blByb3BTZXR0ZXJBZGFwdGVyKGxwQ2xhc3MsIGxwVGhpc1ZhbHVlLmdldCgpLCBzekZ4UHJvcE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGxwTmV3VmFsdWUuZ2V0KCkpOwpAQCAtMzAwLDE1ICsyMTcsNyBAQAogCiB2b2lkIE5hbWVkUHJvcGVydHlFbnVtZXJhdG9yQ2FsbGJhY2soCiAgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpBcnJheT4mIGluZm8pIHsKLSAgY29uc3QgRlhKU0VfQ0xBU1NfREVTQ1JJUFRPUiogbHBDbGFzcyA9IHN0YXRpY19jYXN0PEZYSlNFX0NMQVNTX0RFU0NSSVBUT1IqPigKLSAgICAgIGluZm8uRGF0YSgpLkFzPHY4OjpFeHRlcm5hbD4oKS0+VmFsdWUoKSk7Ci0gIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IGluZm8uR2V0SXNvbGF0ZSgpOwotICB2ODo6TG9jYWw8djg6OkFycmF5PiBuZXdBcnJheSA9IHY4OjpBcnJheTo6TmV3KHBJc29sYXRlLCBscENsYXNzLT5wcm9wTnVtKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBscENsYXNzLT5wcm9wTnVtOyBpKyspIHsKLSAgICBuZXdBcnJheS0+U2V0KAotICAgICAgICBpLCB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgbHBDbGFzcy0+cHJvcGVydGllc1tpXS5uYW1lKSk7Ci0gIH0KLSAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChuZXdBcnJheSk7CisgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQodjg6OkFycmF5OjpOZXcoaW5mby5HZXRJc29sYXRlKCkpKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCkBAIC0zMjEsMTMgKzIzMCwxMyBAQAogICBpZiAoIWxwQ29udGV4dCB8fCAhbHBDbGFzc0RlZmluaXRpb24pCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgQ0ZYSlNFX0NsYXNzKiBwQ2xhc3MgPQotICAgICAgR2V0Q2xhc3NGcm9tQ29udGV4dChscENvbnRleHQsIGxwQ2xhc3NEZWZpbml0aW9uLT5uYW1lKTsKLSAgaWYgKHBDbGFzcykKLSAgICByZXR1cm4gcENsYXNzOworICBDRlhKU0VfQ2xhc3MqIHBFeGlzdGluZ0NsYXNzID0KKyAgICAgIGxwQ29udGV4dC0+R2V0Q2xhc3NCeU5hbWUobHBDbGFzc0RlZmluaXRpb24tPm5hbWUpOworICBpZiAocEV4aXN0aW5nQ2xhc3MpCisgICAgcmV0dXJuIHBFeGlzdGluZ0NsYXNzOwogCi0gIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IGxwQ29udGV4dC0+bV9wSXNvbGF0ZTsKLSAgcENsYXNzID0gbmV3IENGWEpTRV9DbGFzcyhscENvbnRleHQpOworICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBscENvbnRleHQtPkdldElzb2xhdGUoKTsKKyAgYXV0byBwQ2xhc3MgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX0NsYXNzPihscENvbnRleHQpOwogICBwQ2xhc3MtPm1fc3pDbGFzc05hbWUgPSBscENsYXNzRGVmaW5pdGlvbi0+bmFtZTsKICAgcENsYXNzLT5tX2xwQ2xhc3NEZWZpbml0aW9uID0gbHBDbGFzc0RlZmluaXRpb247CiAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKHBJc29sYXRlKTsKQEAgLTMzNywyNSArMjQ2LDExIEBACiAgICAgICAgICAgcElzb2xhdGUsIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1NfREVTQ1JJUFRPUio+KGxwQ2xhc3NEZWZpbml0aW9uKSkpOwogICBoRnVuY3Rpb25UZW1wbGF0ZS0+U2V0Q2xhc3NOYW1lKAogICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsIGxwQ2xhc3NEZWZpbml0aW9uLT5uYW1lKSk7Ci0gIGhGdW5jdGlvblRlbXBsYXRlLT5JbnN0YW5jZVRlbXBsYXRlKCktPlNldEludGVybmFsRmllbGRDb3VudCgxKTsKKyAgaEZ1bmN0aW9uVGVtcGxhdGUtPkluc3RhbmNlVGVtcGxhdGUoKS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KDIpOwogICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBsYXRlPiBoT2JqZWN0VGVtcGxhdGUgPQogICAgICAgaEZ1bmN0aW9uVGVtcGxhdGUtPkluc3RhbmNlVGVtcGxhdGUoKTsKICAgU2V0VXBOYW1lZFByb3BIYW5kbGVyKHBJc29sYXRlLCBoT2JqZWN0VGVtcGxhdGUsIGxwQ2xhc3NEZWZpbml0aW9uKTsKIAotICBpZiAobHBDbGFzc0RlZmluaXRpb24tPnByb3BOdW0pIHsKLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBscENsYXNzRGVmaW5pdGlvbi0+cHJvcE51bTsgaSsrKSB7Ci0gICAgICBoT2JqZWN0VGVtcGxhdGUtPlNldE5hdGl2ZURhdGFQcm9wZXJ0eSgKLSAgICAgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscENsYXNzRGVmaW5pdGlvbi0+cHJvcGVydGllc1tpXS5uYW1lKSwKLSAgICAgICAgICBscENsYXNzRGVmaW5pdGlvbi0+cHJvcGVydGllc1tpXS5nZXRQcm9jID8gVjhHZXR0ZXJDYWxsYmFja19XcmFwcGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHIsCi0gICAgICAgICAgbHBDbGFzc0RlZmluaXRpb24tPnByb3BlcnRpZXNbaV0uc2V0UHJvYyA/IFY4U2V0dGVyQ2FsbGJhY2tfV3JhcHBlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyLAotICAgICAgICAgIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLCBjb25zdF9jYXN0PEZYSlNFX1BST1BFUlRZX0RFU0NSSVBUT1IqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ2xhc3NEZWZpbml0aW9uLT5wcm9wZXJ0aWVzICsgaSkpLAotICAgICAgICAgIHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0eUF0dHJpYnV0ZT4odjg6OkRvbnREZWxldGUpKTsKLSAgICB9Ci0gIH0KICAgaWYgKGxwQ2xhc3NEZWZpbml0aW9uLT5tZXRoTnVtKSB7CiAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbHBDbGFzc0RlZmluaXRpb24tPm1ldGhOdW07IGkrKykgewogICAgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBmdW4gPSB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KApAQCAtMzY5LDI3ICsyNjQsNyBAQAogICAgICAgICAgIHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0eUF0dHJpYnV0ZT4odjg6OlJlYWRPbmx5IHwgdjg6OkRvbnREZWxldGUpKTsKICAgICB9CiAgIH0KLSAgaWYgKGxwQ2xhc3NEZWZpbml0aW9uLT5jb25zdHJ1Y3RvcikgewotICAgIGlmIChiSXNKU0dsb2JhbCkgewotICAgICAgaE9iamVjdFRlbXBsYXRlLT5TZXQoCi0gICAgICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsIGxwQ2xhc3NEZWZpbml0aW9uLT5uYW1lKSwKLSAgICAgICAgICB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KAotICAgICAgICAgICAgICBwSXNvbGF0ZSwgVjhDbGFzc0dsb2JhbENvbnN0cnVjdG9yQ2FsbGJhY2tfV3JhcHBlciwKLSAgICAgICAgICAgICAgdjg6OkV4dGVybmFsOjpOZXcocElzb2xhdGUsIGNvbnN0X2Nhc3Q8RlhKU0VfQ0xBU1NfREVTQ1JJUFRPUio+KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQ2xhc3NEZWZpbml0aW9uKSkpLAotICAgICAgICAgIHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0eUF0dHJpYnV0ZT4odjg6OlJlYWRPbmx5IHwgdjg6OkRvbnREZWxldGUpKTsKLSAgICB9IGVsc2UgewotICAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBoTG9jYWxDb250ZXh0ID0KLSAgICAgICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcocElzb2xhdGUsIGxwQ29udGV4dC0+bV9oQ29udGV4dCk7Ci0gICAgICBGWEpTRV9HZXRHbG9iYWxPYmplY3RGcm9tQ29udGV4dChoTG9jYWxDb250ZXh0KQotICAgICAgICAgIC0+U2V0KHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KHBJc29sYXRlLCBscENsYXNzRGVmaW5pdGlvbi0+bmFtZSksCi0gICAgICAgICAgICAgICAgdjg6OkZ1bmN0aW9uOjpOZXcoCi0gICAgICAgICAgICAgICAgICAgIHBJc29sYXRlLCBWOENsYXNzR2xvYmFsQ29uc3RydWN0b3JDYWxsYmFja19XcmFwcGVyLAotICAgICAgICAgICAgICAgICAgICB2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxGWEpTRV9DTEFTU19ERVNDUklQVE9SKj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscENsYXNzRGVmaW5pdGlvbikpKSk7Ci0gICAgfQotICB9CisKICAgaWYgKGJJc0pTR2xvYmFsKSB7CiAgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBmdW4gPSB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KAogICAgICAgICBwSXNvbGF0ZSwgQ29udGV4dF9HbG9iYWxPYmpUb1N0cmluZywKQEAgLTM5OCwxOSArMjczLDEwIEBACiAgICAgZnVuLT5SZW1vdmVQcm90b3R5cGUoKTsKICAgICBoT2JqZWN0VGVtcGxhdGUtPlNldCh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgInRvU3RyaW5nIiksIGZ1bik7CiAgIH0KLSAgcENsYXNzLT5tX2hUZW1wbGF0ZS5SZXNldChscENvbnRleHQtPm1fcElzb2xhdGUsIGhGdW5jdGlvblRlbXBsYXRlKTsKLSAgbHBDb250ZXh0LT5tX3JnQ2xhc3Nlcy5wdXNoX2JhY2soc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9DbGFzcz4ocENsYXNzKSk7Ci0gIHJldHVybiBwQ2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotQ0ZYSlNFX0NsYXNzKiBDRlhKU0VfQ2xhc3M6OkdldENsYXNzRnJvbUNvbnRleHQoQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzek5hbWUpIHsKLSAgZm9yIChjb25zdCBhdXRvJiBwQ2xhc3MgOiBwQ29udGV4dC0+bV9yZ0NsYXNzZXMpIHsKLSAgICBpZiAocENsYXNzLT5tX3N6Q2xhc3NOYW1lID09IHN6TmFtZSkKLSAgICAgIHJldHVybiBwQ2xhc3MuZ2V0KCk7Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7CisgIHBDbGFzcy0+bV9oVGVtcGxhdGUuUmVzZXQobHBDb250ZXh0LT5HZXRJc29sYXRlKCksIGhGdW5jdGlvblRlbXBsYXRlKTsKKyAgQ0ZYSlNFX0NsYXNzKiBwUmVzdWx0ID0gcENsYXNzLmdldCgpOworICBscENvbnRleHQtPkFkZENsYXNzKHN0ZDo6bW92ZShwQ2xhc3MpKTsKKyAgcmV0dXJuIHBSZXN1bHQ7CiB9CiAKIC8vIHN0YXRpYwpAQCAtNDIxLDggKzI4Nyw3IEBACiAgIHY4OjpOYW1lZFByb3BlcnR5SGFuZGxlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbigKICAgICAgIGxwQ2xhc3NEZWZpbml0aW9uLT5keW5Qcm9wR2V0dGVyID8gTmFtZWRQcm9wZXJ0eUdldHRlckNhbGxiYWNrIDogMCwKICAgICAgIGxwQ2xhc3NEZWZpbml0aW9uLT5keW5Qcm9wU2V0dGVyID8gTmFtZWRQcm9wZXJ0eVNldHRlckNhbGxiYWNrIDogMCwKLSAgICAgIGxwQ2xhc3NEZWZpbml0aW9uLT5keW5Qcm9wVHlwZUdldHRlciA/IE5hbWVkUHJvcGVydHlRdWVyeUNhbGxiYWNrIDogMCwKLSAgICAgIGxwQ2xhc3NEZWZpbml0aW9uLT5keW5Qcm9wRGVsZXRlciA/IE5hbWVkUHJvcGVydHlEZWxldGVyQ2FsbGJhY2sgOiAwLAorICAgICAgbHBDbGFzc0RlZmluaXRpb24tPmR5blByb3BUeXBlR2V0dGVyID8gTmFtZWRQcm9wZXJ0eVF1ZXJ5Q2FsbGJhY2sgOiAwLCAwLAogICAgICAgTmFtZWRQcm9wZXJ0eUVudW1lcmF0b3JDYWxsYmFjaywKICAgICAgIHY4OjpFeHRlcm5hbDo6TmV3KHBJc29sYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxGWEpTRV9DTEFTU19ERVNDUklQVE9SKj4obHBDbGFzc0RlZmluaXRpb24pKSwKZGlmZiAtLWdpdCBhL2Z4anMvY2Z4anNlX2NsYXNzLmggYi9meGpzL2NmeGpzZV9jbGFzcy5oCmluZGV4IDFiMzUyOGEuLjA1NjUyNWYgMTAwNjQ0Ci0tLSBhL2Z4anMvY2Z4anNlX2NsYXNzLmgKKysrIGIvZnhqcy9jZnhqc2VfY2xhc3MuaApAQCAtNyw3ICs3LDcgQEAKICNpZm5kZWYgRlhKU19DRlhKU0VfQ0xBU1NfSF8KICNkZWZpbmUgRlhKU19DRlhKU0VfQ0xBU1NfSF8KIAotI2luY2x1ZGUgImZ4anMvY2Z4anNlX2FyZ3VtZW50cy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKICNpbmNsdWRlICJmeGpzL2Z4anNlLmgiCiAjaW5jbHVkZSAidjgvaW5jbHVkZS92OC5oIgogCkBAIC0xOCwyNSArMTgsMjMgQEAKICBwdWJsaWM6CiAgIHN0YXRpYyBDRlhKU0VfQ2xhc3MqIENyZWF0ZShDRlhKU0VfQ29udGV4dCogcENvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWEpTRV9DTEFTU19ERVNDUklQVE9SKiBscENsYXNzRGVmaW50aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXNKU0dsb2JhbCA9IGZhbHNlKTsKLSAgc3RhdGljIENGWEpTRV9DbGFzcyogR2V0Q2xhc3NGcm9tQ29udGV4dChDRlhKU0VfQ29udGV4dCogcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzek5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXNKU0dsb2JhbCk7CisKICAgc3RhdGljIHZvaWQgU2V0VXBOYW1lZFByb3BIYW5kbGVyKAogICAgICAgdjg6Oklzb2xhdGUqIHBJc29sYXRlLAogICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4mIGhPYmplY3RUZW1wbGF0ZSwKICAgICAgIGNvbnN0IEZYSlNFX0NMQVNTX0RFU0NSSVBUT1IqIGxwQ2xhc3NEZWZpbml0aW9uKTsKIAorICBleHBsaWNpdCBDRlhKU0VfQ2xhc3MoQ0ZYSlNFX0NvbnRleHQqIGxwQ29udGV4dCk7CiAgIH5DRlhKU0VfQ2xhc3MoKTsKIAotICBDRlhKU0VfQ29udGV4dCogR2V0Q29udGV4dCgpIHsgcmV0dXJuIG1fcENvbnRleHQ7IH0KKyAgQ0ZYSlNFX0NvbnRleHQqIEdldENvbnRleHQoKSBjb25zdCB7IHJldHVybiBtX3BDb250ZXh0LkdldCgpOyB9CiAgIHY4OjpHbG9iYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+JiBHZXRUZW1wbGF0ZSgpIHsgcmV0dXJuIG1faFRlbXBsYXRlOyB9CiAKICBwcm90ZWN0ZWQ6Ci0gIGV4cGxpY2l0IENGWEpTRV9DbGFzcyhDRlhKU0VfQ29udGV4dCogbHBDb250ZXh0KTsKLQotICBDRlhfQnl0ZVN0cmluZyBtX3N6Q2xhc3NOYW1lOwotICBjb25zdCBGWEpTRV9DTEFTU19ERVNDUklQVE9SKiBtX2xwQ2xhc3NEZWZpbml0aW9uOwotICBDRlhKU0VfQ29udGV4dCogbV9wQ29udGV4dDsKKyAgQnl0ZVN0cmluZyBtX3N6Q2xhc3NOYW1lOworICBVbm93bmVkUHRyPGNvbnN0IEZYSlNFX0NMQVNTX0RFU0NSSVBUT1I+IG1fbHBDbGFzc0RlZmluaXRpb247CisgIFVub3duZWRQdHI8Q0ZYSlNFX0NvbnRleHQ+IG1fcENvbnRleHQ7CiAgIHY4OjpHbG9iYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IG1faFRlbXBsYXRlOwogICBmcmllbmQgY2xhc3MgQ0ZYSlNFX0NvbnRleHQ7CiAgIGZyaWVuZCBjbGFzcyBDRlhKU0VfVmFsdWU7CmRpZmYgLS1naXQgYS9meGpzL2NmeGpzZV9jb250ZXh0LmNwcCBiL2Z4anMvY2Z4anNlX2NvbnRleHQuY3BwCmluZGV4IGQ4MmY4NzUuLmJmOWJlZTggMTAwNjQ0Ci0tLSBhL2Z4anMvY2Z4anNlX2NvbnRleHQuY3BwCisrKyBiL2Z4anMvY2Z4anNlX2NvbnRleHQuY3BwCkBAIC02LDEyICs2LDE1IEBACiAKICNpbmNsdWRlICJmeGpzL2NmeGpzZV9jb250ZXh0LmgiCiAKKyNpbmNsdWRlIDx1dGlsaXR5PgorCiAjaW5jbHVkZSAiZnhqcy9jZnhqc2VfY2xhc3MuaCIKICNpbmNsdWRlICJmeGpzL2NmeGpzZV92YWx1ZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAogbmFtZXNwYWNlIHsKIAotY29uc3QgRlhfQ0hBUiBzekNvbXBhdGlibGVNb2RlU2NyaXB0W10gPQorY29uc3QgY2hhciBzekNvbXBhdGlibGVNb2RlU2NyaXB0W10gPQogICAgICIoZnVuY3Rpb24oZ2xvYmFsLCBsaXN0KSB7XG4iCiAgICAgIiAgJ3VzZSBzdHJpY3QnO1xuIgogICAgICIgIHZhciBvYmpuYW1lO1xuIgpAQCAtMzgsNzkgKzQxLDEwIEBACiAgICAgIiAgfVxuIgogICAgICJ9KHRoaXMsIHtTdHJpbmc6IFsnc3Vic3RyJywgJ3RvVXBwZXJDYXNlJ119KSk7IjsKIAotfSAgLy8gbmFtZXNwYWNlCit3Y2hhcl90IGdfRlhKU0VUYWdTdHJpbmdbXSA9IEwiRlhKU0VfSG9zdE9iamVjdCI7CiAKLS8vIE5vdGUsIG5vdCBpbiB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZSBkdWUgdG8gdGhlIGZyaWVuZCBjYWxsCi0vLyBpbiBjZnhqc2VfY29udGV4dC5oCi0vLyBUT0RPKGRzaW5jbGFpcik6IFJlbW92ZSB0aGUgZnJpZW5kaW5nLCB1c2UgcHVibGljIG1ldGhvZHMuCi1jbGFzcyBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVDb250ZXh0IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQoQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0KQotICAgICAgOiBtX2NvbnRleHQocENvbnRleHQpLAotICAgICAgICBtX3BhcmVudChwQ29udGV4dC0+bV9wSXNvbGF0ZSksCi0gICAgICAgIG1fY3Njb3BlKHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhwQ29udGV4dC0+bV9wSXNvbGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5tX2hDb250ZXh0KSkge30KLSAgdjg6Oklzb2xhdGUqIEdldElzb2xhdGUoKSB7IHJldHVybiBtX2NvbnRleHQtPm1fcElzb2xhdGU7IH0KLSAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBHZXRMb2NhbENvbnRleHQoKSB7Ci0gICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhtX2NvbnRleHQtPm1fcElzb2xhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NvbnRleHQtPm1faENvbnRleHQpOwotICB9Ci0KLSBwcml2YXRlOgotICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVDb250ZXh0KAotICAgICAgY29uc3QgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlQ29udGV4dCYpID0gZGVsZXRlOwotICB2b2lkIG9wZXJhdG9yPShjb25zdCBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVDb250ZXh0JikgPSBkZWxldGU7Ci0gIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSkgPSBkZWxldGU7Ci0gIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqLCBzaXplX3QpID0gZGVsZXRlOwotCi0gIENGWEpTRV9Db250ZXh0KiBtX2NvbnRleHQ7Ci0gIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZSBtX3BhcmVudDsKLSAgdjg6OkNvbnRleHQ6OlNjb3BlIG1fY3Njb3BlOwotfTsKLQotdjg6OkxvY2FsPHY4OjpPYmplY3Q+IEZYSlNFX0dldEdsb2JhbE9iamVjdEZyb21Db250ZXh0KAotICAgIGNvbnN0IHY4OjpMb2NhbDx2ODo6Q29udGV4dD4mIGhDb250ZXh0KSB7Ci0gIHJldHVybiBoQ29udGV4dC0+R2xvYmFsKCktPkdldFByb3RvdHlwZSgpLkFzPHY4OjpPYmplY3Q+KCk7Ci19Ci0KLXZvaWQgRlhKU0VfVXBkYXRlT2JqZWN0QmluZGluZyh2ODo6TG9jYWw8djg6Ok9iamVjdD4mIGhPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0hvc3RPYmplY3QqIGxwTmV3QmluZGluZykgewotICBBU1NFUlQoIWhPYmplY3QuSXNFbXB0eSgpKTsKLSAgQVNTRVJUKGhPYmplY3QtPkludGVybmFsRmllbGRDb3VudCgpID4gMCk7Ci0gIGhPYmplY3QtPlNldEFsaWduZWRQb2ludGVySW5JbnRlcm5hbEZpZWxkKDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQqPihscE5ld0JpbmRpbmcpKTsKLX0KLQotQ0ZYSlNFX0hvc3RPYmplY3QqIEZYSlNFX1JldHJpZXZlT2JqZWN0QmluZGluZygKLSAgICBjb25zdCB2ODo6TG9jYWw8djg6Ok9iamVjdD4mIGhKU09iamVjdCwKLSAgICBDRlhKU0VfQ2xhc3MqIGxwQ2xhc3MpIHsKLSAgQVNTRVJUKCFoSlNPYmplY3QuSXNFbXB0eSgpKTsKLSAgaWYgKCFoSlNPYmplY3QtPklzT2JqZWN0KCkpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhPYmplY3QgPSBoSlNPYmplY3Q7Ci0gIGlmIChoT2JqZWN0LT5JbnRlcm5hbEZpZWxkQ291bnQoKSA9PSAwKSB7Ci0gICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFByb3RvT2JqZWN0ID0gaE9iamVjdC0+R2V0UHJvdG90eXBlKCk7Ci0gICAgaWYgKGhQcm90b09iamVjdC5Jc0VtcHR5KCkgfHwgIWhQcm90b09iamVjdC0+SXNPYmplY3QoKSkKLSAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgaE9iamVjdCA9IGhQcm90b09iamVjdC5Bczx2ODo6T2JqZWN0PigpOwotICAgIGlmIChoT2JqZWN0LT5JbnRlcm5hbEZpZWxkQ291bnQoKSA9PSAwKQotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgaWYgKGxwQ2xhc3MpIHsKLSAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGhDbGFzcyA9Ci0gICAgICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT46Ok5ldygKLSAgICAgICAgICAgIGxwQ2xhc3MtPkdldENvbnRleHQoKS0+R2V0UnVudGltZSgpLCBscENsYXNzLT5HZXRUZW1wbGF0ZSgpKTsKLSAgICBpZiAoIWhDbGFzcy0+SGFzSW5zdGFuY2UoaE9iamVjdCkpCi0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZYSlNFX0hvc3RPYmplY3QqPigKLSAgICAgIGhPYmplY3QtPkdldEFsaWduZWRQb2ludGVyRnJvbUludGVybmFsRmllbGQoMCkpOwotfQotCi12ODo6TG9jYWw8djg6Ok9iamVjdD4gRlhKU0VfQ3JlYXRlUmV0dXJuVmFsdWUodjg6Oklzb2xhdGUqIHBJc29sYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpUcnlDYXRjaCYgdHJ5Y2F0Y2gpIHsKK3Y4OjpMb2NhbDx2ODo6T2JqZWN0PiBDcmVhdGVSZXR1cm5WYWx1ZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OlRyeUNhdGNoJiB0cnljYXRjaCkgewogICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaFJldHVyblZhbHVlID0gdjg6Ok9iamVjdDo6TmV3KHBJc29sYXRlKTsKICAgaWYgKHRyeWNhdGNoLkhhc0NhdWdodCgpKSB7CiAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaEV4Y2VwdGlvbiA9IHRyeWNhdGNoLkV4Y2VwdGlvbigpOwpAQCAtMTQ2LDI2ICs4MCw5OSBAQAogICByZXR1cm4gaFJldHVyblZhbHVlOwogfQogCit2ODo6TG9jYWw8djg6Ok9iamVjdD4gR2V0R2xvYmFsT2JqZWN0RnJvbUNvbnRleHQoCisgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBoQ29udGV4dCkgeworICByZXR1cm4gaENvbnRleHQtPkdsb2JhbCgpLT5HZXRQcm90b3R5cGUoKS5Bczx2ODo6T2JqZWN0PigpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gTm90ZSwgbm90IGluIHRoZSBhbm9ueW1vdXMgbmFtZXNwYWNlIGR1ZSB0byB0aGUgZnJpZW5kIGNhbGwKKy8vIGluIGNmeGpzZV9jb250ZXh0LmgKKy8vIFRPRE8oZHNpbmNsYWlyKTogUmVtb3ZlIHRoZSBmcmllbmRpbmcsIHVzZSBwdWJsaWMgbWV0aG9kcy4KK2NsYXNzIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlQ29udGV4dChDRlhKU0VfQ29udGV4dCogcENvbnRleHQpCisgICAgICA6IG1fY29udGV4dChwQ29udGV4dCksCisgICAgICAgIG1fcGFyZW50KHBDb250ZXh0LT5tX3BJc29sYXRlKSwKKyAgICAgICAgbV9jc2NvcGUodjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KHBDb250ZXh0LT5tX3BJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPm1faENvbnRleHQpKSB7fQorICB2ODo6SXNvbGF0ZSogR2V0SXNvbGF0ZSgpIHsgcmV0dXJuIG1fY29udGV4dC0+bV9wSXNvbGF0ZTsgfQorICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IEdldExvY2FsQ29udGV4dCgpIHsKKyAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KG1fY29udGV4dC0+bV9wSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY29udGV4dC0+bV9oQ29udGV4dCk7CisgIH0KKworIHByaXZhdGU6CisgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQoCisgICAgICBjb25zdCBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVDb250ZXh0JikgPSBkZWxldGU7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQmKSA9IGRlbGV0ZTsKKyAgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCBzaXplKSA9IGRlbGV0ZTsKKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCosIHNpemVfdCkgPSBkZWxldGU7CisKKyAgVW5vd25lZFB0cjxDRlhKU0VfQ29udGV4dD4gbV9jb250ZXh0OworICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgbV9wYXJlbnQ7CisgIHY4OjpDb250ZXh0OjpTY29wZSBtX2NzY29wZTsKK307CisKK3ZvaWQgRlhKU0VfVXBkYXRlT2JqZWN0QmluZGluZyh2ODo6TG9jYWw8djg6Ok9iamVjdD4mIGhPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0hvc3RPYmplY3QqIGxwTmV3QmluZGluZykgeworICBBU1NFUlQoIWhPYmplY3QuSXNFbXB0eSgpKTsKKyAgQVNTRVJUKGhPYmplY3QtPkludGVybmFsRmllbGRDb3VudCgpID09IDIpOworICBoT2JqZWN0LT5TZXRBbGlnbmVkUG9pbnRlckluSW50ZXJuYWxGaWVsZCgwLCBnX0ZYSlNFVGFnU3RyaW5nKTsKKyAgaE9iamVjdC0+U2V0QWxpZ25lZFBvaW50ZXJJbkludGVybmFsRmllbGQoMSwgbHBOZXdCaW5kaW5nKTsKK30KKworQ0ZYSlNFX0hvc3RPYmplY3QqIEZYSlNFX1JldHJpZXZlT2JqZWN0QmluZGluZyh2ODo6TG9jYWw8djg6Ok9iamVjdD4gaEpTT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQ2xhc3MqIGxwQ2xhc3MpIHsKKyAgQVNTRVJUKCFoSlNPYmplY3QuSXNFbXB0eSgpKTsKKyAgaWYgKCFoSlNPYmplY3QtPklzT2JqZWN0KCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhPYmplY3QgPSBoSlNPYmplY3Q7CisgIGlmIChoT2JqZWN0LT5JbnRlcm5hbEZpZWxkQ291bnQoKSAhPSAyKSB7CisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFByb3RvT2JqZWN0ID0gaE9iamVjdC0+R2V0UHJvdG90eXBlKCk7CisgICAgaWYgKGhQcm90b09iamVjdC5Jc0VtcHR5KCkgfHwgIWhQcm90b09iamVjdC0+SXNPYmplY3QoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgaE9iamVjdCA9IGhQcm90b09iamVjdC5Bczx2ODo6T2JqZWN0PigpOworICAgIGlmIChoT2JqZWN0LT5JbnRlcm5hbEZpZWxkQ291bnQoKSAhPSAyKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaWYgKGhPYmplY3QtPkdldEFsaWduZWRQb2ludGVyRnJvbUludGVybmFsRmllbGQoMCkgIT0gZ19GWEpTRVRhZ1N0cmluZykKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgaWYgKGxwQ2xhc3MpIHsKKyAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGhDbGFzcyA9CisgICAgICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT46Ok5ldygKKyAgICAgICAgICAgIGxwQ2xhc3MtPkdldENvbnRleHQoKS0+R2V0SXNvbGF0ZSgpLCBscENsYXNzLT5HZXRUZW1wbGF0ZSgpKTsKKyAgICBpZiAoIWhDbGFzcy0+SGFzSW5zdGFuY2UoaE9iamVjdCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZYSlNFX0hvc3RPYmplY3QqPigKKyAgICAgIGhPYmplY3QtPkdldEFsaWduZWRQb2ludGVyRnJvbUludGVybmFsRmllbGQoMSkpOworfQorCiAvLyBzdGF0aWMKLUNGWEpTRV9Db250ZXh0KiBDRlhKU0VfQ29udGV4dDo6Q3JlYXRlKAorc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9Db250ZXh0PiBDRlhKU0VfQ29udGV4dDo6Q3JlYXRlKAogICAgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKLSAgICBjb25zdCBGWEpTRV9DTEFTU19ERVNDUklQVE9SKiBscEdsb2JhbENsYXNzLAotICAgIENGWEpTRV9Ib3N0T2JqZWN0KiBscEdsb2JhbE9iamVjdCkgeworICAgIGNvbnN0IEZYSlNFX0NMQVNTX0RFU0NSSVBUT1IqIHBHbG9iYWxDbGFzcywKKyAgICBDRlhKU0VfSG9zdE9iamVjdCogcEdsb2JhbE9iamVjdCkgewogICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUocElzb2xhdGUpOwotICBDRlhKU0VfQ29udGV4dCogcENvbnRleHQgPSBuZXcgQ0ZYSlNFX0NvbnRleHQocElzb2xhdGUpOwotICBDRlhKU0VfQ2xhc3MqIGxwR2xvYmFsQ2xhc3NPYmogPSBudWxscHRyOworICBhdXRvIHBDb250ZXh0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9Db250ZXh0PihwSXNvbGF0ZSk7CiAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGhPYmplY3RUZW1wbGF0ZTsKLSAgaWYgKGxwR2xvYmFsQ2xhc3MpIHsKLSAgICBscEdsb2JhbENsYXNzT2JqID0gQ0ZYSlNFX0NsYXNzOjpDcmVhdGUocENvbnRleHQsIGxwR2xvYmFsQ2xhc3MsIHRydWUpOwotICAgIEFTU0VSVChscEdsb2JhbENsYXNzT2JqKTsKKyAgaWYgKHBHbG9iYWxDbGFzcykgeworICAgIENGWEpTRV9DbGFzcyogcEdsb2JhbENsYXNzT2JqID0KKyAgICAgICAgQ0ZYSlNFX0NsYXNzOjpDcmVhdGUocENvbnRleHQuZ2V0KCksIHBHbG9iYWxDbGFzcywgdHJ1ZSk7CisgICAgQVNTRVJUKHBHbG9iYWxDbGFzc09iaik7CiAgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBoRnVuY3Rpb25UZW1wbGF0ZSA9CiAgICAgICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT46Ok5ldyhwSXNvbGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwR2xvYmFsQ2xhc3NPYmotPm1faFRlbXBsYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBHbG9iYWxDbGFzc09iai0+bV9oVGVtcGxhdGUpOwogICAgIGhPYmplY3RUZW1wbGF0ZSA9IGhGdW5jdGlvblRlbXBsYXRlLT5JbnN0YW5jZVRlbXBsYXRlKCk7CiAgIH0gZWxzZSB7CiAgICAgaE9iamVjdFRlbXBsYXRlID0gdjg6Ok9iamVjdFRlbXBsYXRlOjpOZXcocElzb2xhdGUpOwotICAgIGhPYmplY3RUZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KDEpOworICAgIGhPYmplY3RUZW1wbGF0ZS0+U2V0SW50ZXJuYWxGaWVsZENvdW50KDIpOwogICB9CisKICAgaE9iamVjdFRlbXBsYXRlLT5TZXQoCiAgICAgICB2ODo6U3ltYm9sOjpHZXRUb1N0cmluZ1RhZyhwSXNvbGF0ZSksCiAgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgImdsb2JhbCIsIHY4OjpOZXdTdHJpbmdUeXBlOjprTm9ybWFsKQpAQCAtMTc1LDkgKzE4Miw4IEBACiAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gaFJvb3RDb250ZXh0ID0gdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KAogICAgICAgcElzb2xhdGUsIENGWEpTRV9SdW50aW1lRGF0YTo6R2V0KHBJc29sYXRlKS0+bV9oUm9vdENvbnRleHQpOwogICBoTmV3Q29udGV4dC0+U2V0U2VjdXJpdHlUb2tlbihoUm9vdENvbnRleHQtPkdldFNlY3VyaXR5VG9rZW4oKSk7Ci0gIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoR2xvYmFsT2JqZWN0ID0KLSAgICAgIEZYSlNFX0dldEdsb2JhbE9iamVjdEZyb21Db250ZXh0KGhOZXdDb250ZXh0KTsKLSAgRlhKU0VfVXBkYXRlT2JqZWN0QmluZGluZyhoR2xvYmFsT2JqZWN0LCBscEdsb2JhbE9iamVjdCk7CisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoR2xvYmFsT2JqZWN0ID0gR2V0R2xvYmFsT2JqZWN0RnJvbUNvbnRleHQoaE5ld0NvbnRleHQpOworICBGWEpTRV9VcGRhdGVPYmplY3RCaW5kaW5nKGhHbG9iYWxPYmplY3QsIHBHbG9iYWxPYmplY3QpOwogICBwQ29udGV4dC0+bV9oQ29udGV4dC5SZXNldChwSXNvbGF0ZSwgaE5ld0NvbnRleHQpOwogICByZXR1cm4gcENvbnRleHQ7CiB9CkBAIC0xODcsMjIgKzE5MywzOCBAQAogQ0ZYSlNFX0NvbnRleHQ6On5DRlhKU0VfQ29udGV4dCgpIHt9CiAKIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IENGWEpTRV9Db250ZXh0OjpHZXRHbG9iYWxPYmplY3QoKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IHBWYWx1ZShuZXcgQ0ZYSlNFX1ZhbHVlKG1fcElzb2xhdGUpKTsKLQorICBhdXRvIHBWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KG1fcElzb2xhdGUpOwogICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVDb250ZXh0IHNjb3BlKHRoaXMpOwogICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGhDb250ZXh0ID0KICAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhtX3BJc29sYXRlLCBtX2hDb250ZXh0KTsKLSAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGhHbG9iYWxPYmplY3QgPSBoQ29udGV4dC0+R2xvYmFsKCk7CisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoR2xvYmFsT2JqZWN0ID0gR2V0R2xvYmFsT2JqZWN0RnJvbUNvbnRleHQoaENvbnRleHQpOwogICBwVmFsdWUtPkZvcmNlU2V0VmFsdWUoaEdsb2JhbE9iamVjdCk7Ci0KICAgcmV0dXJuIHBWYWx1ZTsKIH0KIAordjg6OkxvY2FsPHY4OjpDb250ZXh0PiBDRlhKU0VfQ29udGV4dDo6R2V0Q29udGV4dCgpIHsKKyAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhtX3BJc29sYXRlLCBtX2hDb250ZXh0KTsKK30KKwordm9pZCBDRlhKU0VfQ29udGV4dDo6QWRkQ2xhc3Moc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9DbGFzcz4gcENsYXNzKSB7CisgIG1fcmdDbGFzc2VzLnB1c2hfYmFjayhzdGQ6Om1vdmUocENsYXNzKSk7Cit9CisKK0NGWEpTRV9DbGFzcyogQ0ZYSlNFX0NvbnRleHQ6OkdldENsYXNzQnlOYW1lKAorICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzek5hbWUpIGNvbnN0IHsKKyAgYXV0byBwQ2xhc3MgPQorICAgICAgc3RkOjpmaW5kX2lmKG1fcmdDbGFzc2VzLmJlZ2luKCksIG1fcmdDbGFzc2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgIFtzek5hbWVdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfQ2xhc3M+JiBpdGVtKSB7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3pOYW1lID09IGl0ZW0tPm1fc3pDbGFzc05hbWU7CisgICAgICAgICAgICAgICAgICAgfSk7CisgIHJldHVybiBwQ2xhc3MgIT0gbV9yZ0NsYXNzZXMuZW5kKCkgPyBwQ2xhc3MtPmdldCgpIDogbnVsbHB0cjsKK30KKwogdm9pZCBDRlhKU0VfQ29udGV4dDo6RW5hYmxlQ29tcGF0aWJsZU1vZGUoKSB7CiAgIEV4ZWN1dGVTY3JpcHQoc3pDb21wYXRpYmxlTW9kZVNjcmlwdCwgbnVsbHB0ciwgbnVsbHB0cik7CiB9CiAKLWJvb2wgQ0ZYSlNFX0NvbnRleHQ6OkV4ZWN1dGVTY3JpcHQoY29uc3QgRlhfQ0hBUiogc3pTY3JpcHQsCitib29sIENGWEpTRV9Db250ZXh0OjpFeGVjdXRlU2NyaXB0KGNvbnN0IGNoYXIqIHN6U2NyaXB0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGxwUmV0VmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogbHBOZXdUaGlzT2JqZWN0KSB7CiAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZUNvbnRleHQgc2NvcGUodGhpcyk7CkBAIC0yMjEsNyArMjQzLDcgQEAKICAgICB9CiAgICAgaWYgKGxwUmV0VmFsdWUpIHsKICAgICAgIGxwUmV0VmFsdWUtPm1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTRV9DcmVhdGVSZXR1cm5WYWx1ZShtX3BJc29sYXRlLCB0cnljYXRjaCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlUmV0dXJuVmFsdWUobV9wSXNvbGF0ZSwgdHJ5Y2F0Y2gpKTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CkBAIC0yNDYsNyArMjY4LDcgQEAKICAgfQogICBpZiAobHBSZXRWYWx1ZSkgewogICAgIGxwUmV0VmFsdWUtPm1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhKU0VfQ3JlYXRlUmV0dXJuVmFsdWUobV9wSXNvbGF0ZSwgdHJ5Y2F0Y2gpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVSZXR1cm5WYWx1ZShtX3BJc29sYXRlLCB0cnljYXRjaCkpOwogICB9CiAgIHJldHVybiBmYWxzZTsKIH0KZGlmZiAtLWdpdCBhL2Z4anMvY2Z4anNlX2NvbnRleHQuaCBiL2Z4anMvY2Z4anNlX2NvbnRleHQuaAppbmRleCBhNjk0NTE0Li40ODgxNmViIDEwMDY0NAotLS0gYS9meGpzL2NmeGpzZV9jb250ZXh0LmgKKysrIGIvZnhqcy9jZnhqc2VfY29udGV4dC5oCkBAIC0xMCw3ICsxMCw2IEBACiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKICNpbmNsdWRlICJmeGpzL2Z4anNlLmgiCiAjaW5jbHVkZSAidjgvaW5jbHVkZS92OC5oIgogCkBAIC0yMCwyOCArMTksMjkgQEAKIAogY2xhc3MgQ0ZYSlNFX0NvbnRleHQgewogIHB1YmxpYzoKLSAgc3RhdGljIENGWEpTRV9Db250ZXh0KiBDcmVhdGUoCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX0NvbnRleHQ+IENyZWF0ZSgKICAgICAgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKLSAgICAgIGNvbnN0IEZYSlNFX0NMQVNTX0RFU0NSSVBUT1IqIGxwR2xvYmFsQ2xhc3MgPSBudWxscHRyLAotICAgICAgQ0ZYSlNFX0hvc3RPYmplY3QqIGxwR2xvYmFsT2JqZWN0ID0gbnVsbHB0cik7CisgICAgICBjb25zdCBGWEpTRV9DTEFTU19ERVNDUklQVE9SKiBwR2xvYmFsQ2xhc3MsCisgICAgICBDRlhKU0VfSG9zdE9iamVjdCogcEdsb2JhbE9iamVjdCk7CiAKKyAgZXhwbGljaXQgQ0ZYSlNFX0NvbnRleHQodjg6Oklzb2xhdGUqIHBJc29sYXRlKTsKICAgfkNGWEpTRV9Db250ZXh0KCk7CiAKLSAgdjg6Oklzb2xhdGUqIEdldFJ1bnRpbWUoKSB7IHJldHVybiBtX3BJc29sYXRlOyB9CisgIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKCkgY29uc3QgeyByZXR1cm4gbV9wSXNvbGF0ZTsgfQorICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IEdldENvbnRleHQoKTsKICAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gR2V0R2xvYmFsT2JqZWN0KCk7CisgIHZvaWQgQWRkQ2xhc3Moc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9DbGFzcz4gcENsYXNzKTsKKyAgQ0ZYSlNFX0NsYXNzKiBHZXRDbGFzc0J5TmFtZShjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pOYW1lKSBjb25zdDsKICAgdm9pZCBFbmFibGVDb21wYXRpYmxlTW9kZSgpOwotICBib29sIEV4ZWN1dGVTY3JpcHQoY29uc3QgRlhfQ0hBUiogc3pTY3JpcHQsCisgIGJvb2wgRXhlY3V0ZVNjcmlwdChjb25zdCBjaGFyKiBzelNjcmlwdCwKICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogbHBSZXRWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogbHBOZXdUaGlzT2JqZWN0ID0gbnVsbHB0cik7CiAKICBwcm90ZWN0ZWQ6Ci0gIGZyaWVuZCBjbGFzcyBDRlhKU0VfQ2xhc3M7CiAgIGZyaWVuZCBjbGFzcyBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVDb250ZXh0OwogCiAgIENGWEpTRV9Db250ZXh0KCk7CiAgIENGWEpTRV9Db250ZXh0KGNvbnN0IENGWEpTRV9Db250ZXh0Jik7Ci0gIGV4cGxpY2l0IENGWEpTRV9Db250ZXh0KHY4OjpJc29sYXRlKiBwSXNvbGF0ZSk7Ci0KICAgQ0ZYSlNFX0NvbnRleHQmIG9wZXJhdG9yPShjb25zdCBDRlhKU0VfQ29udGV4dCYpOwogCiAgIHY4OjpHbG9iYWw8djg6OkNvbnRleHQ+IG1faENvbnRleHQ7CkBAIC00OSwxNyArNDksMTAgQEAKICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWEpTRV9DbGFzcz4+IG1fcmdDbGFzc2VzOwogfTsKIAotdjg6OkxvY2FsPHY4OjpPYmplY3Q+IEZYSlNFX0NyZWF0ZVJldHVyblZhbHVlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6VHJ5Q2F0Y2gmIHRyeWNhdGNoKTsKLQotdjg6OkxvY2FsPHY4OjpPYmplY3Q+IEZYSlNFX0dldEdsb2JhbE9iamVjdEZyb21Db250ZXh0KAotICAgIGNvbnN0IHY4OjpMb2NhbDx2ODo6Q29udGV4dD4mIGhDb250ZXh0KTsKLQogdm9pZCBGWEpTRV9VcGRhdGVPYmplY3RCaW5kaW5nKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiYgaE9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfSG9zdE9iamVjdCogbHBOZXdCaW5kaW5nID0gbnVsbHB0cik7CiAKLUNGWEpTRV9Ib3N0T2JqZWN0KiBGWEpTRV9SZXRyaWV2ZU9iamVjdEJpbmRpbmcoCi0gICAgY29uc3Qgdjg6OkxvY2FsPHY4OjpPYmplY3Q+JiBoSlNPYmplY3QsCi0gICAgQ0ZYSlNFX0NsYXNzKiBscENsYXNzID0gbnVsbHB0cik7CitDRlhKU0VfSG9zdE9iamVjdCogRlhKU0VfUmV0cmlldmVPYmplY3RCaW5kaW5nKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoSlNPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9DbGFzcyogbHBDbGFzcyA9IG51bGxwdHIpOwogCiAjZW5kaWYgIC8vIEZYSlNfQ0ZYSlNFX0NPTlRFWFRfSF8KZGlmZiAtLWdpdCBhL2Z4anMvY2Z4anNlX2VuZ2luZS5jcHAgYi9meGpzL2NmeGpzZV9lbmdpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNTg5NWYKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2NmeGpzZV9lbmdpbmUuY3BwCkBAIC0wLDAgKzEsNzU1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV9lbmdpbmUuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2F1dG9yZXN0b3Jlci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3dpZGV0ZXh0YnVmLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9leHRlbnNpb24uaCIKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV9jbGFzcy5oIgorI2luY2x1ZGUgImZ4anMvY2Z4anNlX3Jlc29sdmVwcm9jZXNzb3IuaCIKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV92YWx1ZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9ldmVudHBhcmFtLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZm5vdGlmeS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxlbWdyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGVoZWxwZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vYmplY3QuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90aGlzcHJveHkuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmVlbGlzdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfYmFzaWNfZGF0YS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfcmVzb2x2ZW5vZGVfcnMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX3V0aWxzLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IEZYSlNFX0NMQVNTX0RFU0NSSVBUT1IgR2xvYmFsQ2xhc3NEZXNjcmlwdG9yID0geworICAgICJSb290IiwgICAvLyBuYW1lCisgICAgbnVsbHB0ciwgIC8vIG1ldGhvZHMKKyAgICAwLCAgICAgICAgLy8gbWV0aG9kIGNvdW50CisgICAgQ0ZYSlNFX0VuZ2luZTo6R2xvYmFsUHJvcFR5cGVHZXR0ZXIsCisgICAgQ0ZYSlNFX0VuZ2luZTo6R2xvYmFsUHJvcGVydHlHZXR0ZXIsCisgICAgQ0ZYSlNFX0VuZ2luZTo6R2xvYmFsUHJvcGVydHlTZXR0ZXIsCisgICAgQ0ZYSlNFX0VuZ2luZTo6Tm9ybWFsTWV0aG9kQ2FsbCwKK307CisKK2NvbnN0IEZYSlNFX0NMQVNTX0RFU0NSSVBUT1IgTm9ybWFsQ2xhc3NEZXNjcmlwdG9yID0geworICAgICJYRkFPYmplY3QiLCAgLy8gbmFtZQorICAgIG51bGxwdHIsICAgICAgLy8gbWV0aG9kcworICAgIDAsICAgICAgICAgICAgLy8gbWV0aG9kIGNvdW50CisgICAgQ0ZYSlNFX0VuZ2luZTo6Tm9ybWFsUHJvcFR5cGVHZXR0ZXIsCisgICAgQ0ZYSlNFX0VuZ2luZTo6Tm9ybWFsUHJvcGVydHlHZXR0ZXIsCisgICAgQ0ZYSlNFX0VuZ2luZTo6Tm9ybWFsUHJvcGVydHlTZXR0ZXIsCisgICAgQ0ZYSlNFX0VuZ2luZTo6Tm9ybWFsTWV0aG9kQ2FsbCwKK307CisKK2NvbnN0IEZYSlNFX0NMQVNTX0RFU0NSSVBUT1IgVmFyaWFibGVzQ2xhc3NEZXNjcmlwdG9yID0geworICAgICJYRkFTY3JpcHRPYmplY3QiLCAgLy8gbmFtZQorICAgIG51bGxwdHIsICAgICAgICAgICAgLy8gbWV0aG9kcworICAgIDAsICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGNvdW50CisgICAgQ0ZYSlNFX0VuZ2luZTo6Tm9ybWFsUHJvcFR5cGVHZXR0ZXIsCisgICAgQ0ZYSlNFX0VuZ2luZTo6R2xvYmFsUHJvcGVydHlHZXR0ZXIsCisgICAgQ0ZYSlNFX0VuZ2luZTo6R2xvYmFsUHJvcGVydHlTZXR0ZXIsCisgICAgQ0ZYSlNFX0VuZ2luZTo6Tm9ybWFsTWV0aG9kQ2FsbCwKK307CisKK2NvbnN0IGNoYXIga0Zvcm1DYWxjUnVudGltZVtdID0gInBmbV9ydCI7CisKK0NYRkFfVGhpc1Byb3h5KiBUb1RoaXNQcm94eShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwgQ0ZYSlNFX0NsYXNzKiBwQ2xhc3MpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfVGhpc1Byb3h5Kj4ocFZhbHVlLT5Ub0hvc3RPYmplY3QocENsYXNzKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0NYRkFfT2JqZWN0KiBDRlhKU0VfRW5naW5lOjpUb09iamVjdCgKKyAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgeworICBpZiAoIWluZm8uSG9sZGVyKCktPklzT2JqZWN0KCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQ0ZYSlNFX0hvc3RPYmplY3QqIGhvc3RPYmogPQorICAgICAgRlhKU0VfUmV0cmlldmVPYmplY3RCaW5kaW5nKGluZm8uSG9sZGVyKCkuQXM8djg6Ok9iamVjdD4oKSwgbnVsbHB0cik7CisgIGlmICghaG9zdE9iaiB8fCBob3N0T2JqLT50eXBlKCkgIT0gQ0ZYSlNFX0hvc3RPYmplY3Q6OmtYRkEpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX09iamVjdCo+KGhvc3RPYmopOworfQorCisvLyBzdGF0aWMuCitDWEZBX09iamVjdCogQ0ZYSlNFX0VuZ2luZTo6VG9PYmplY3QoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0NsYXNzKiBwQ2xhc3MpIHsKKyAgQ0ZYSlNFX0hvc3RPYmplY3QqIHBIb3N0T2JqID0gcFZhbHVlLT5Ub0hvc3RPYmplY3QocENsYXNzKTsKKyAgaWYgKCFwSG9zdE9iaiB8fCBwSG9zdE9iai0+dHlwZSgpICE9IENGWEpTRV9Ib3N0T2JqZWN0OjprWEZBKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9PYmplY3QqPihwSG9zdE9iaik7Cit9CisKK0NGWEpTRV9FbmdpbmU6OkNGWEpTRV9FbmdpbmUoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCB2ODo6SXNvbGF0ZSogcElzb2xhdGUpCisgICAgOiBDSlNfVjgocElzb2xhdGUpLAorICAgICAgbV9wRG9jdW1lbnQocERvY3VtZW50KSwKKyAgICAgIG1fSnNDb250ZXh0KENGWEpTRV9Db250ZXh0OjpDcmVhdGUocElzb2xhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZHbG9iYWxDbGFzc0Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEb2N1bWVudC0+R2V0Um9vdCgpKSksCisgICAgICBtX3BKc0NsYXNzKG51bGxwdHIpLAorICAgICAgbV9lU2NyaXB0VHlwZShDWEZBX1NjcmlwdDo6VHlwZTo6VW5rbm93biksCisgICAgICBtX3BTY3JpcHROb2RlQXJyYXkobnVsbHB0ciksCisgICAgICBtX1Jlc29sdmVQcm9jZXNzb3IocGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9SZXNvbHZlUHJvY2Vzc29yPigpKSwKKyAgICAgIG1fcFRoaXNPYmplY3QobnVsbHB0ciksCisgICAgICBtX2VSdW5BdFR5cGUoWEZBX0F0dHJpYnV0ZUVudW06OkNsaWVudCkgeworICBSZW1vdmVCdWlsdEluT2JqcyhtX0pzQ29udGV4dC5nZXQoKSk7CisgIG1fSnNDb250ZXh0LT5FbmFibGVDb21wYXRpYmxlTW9kZSgpOworCisgIC8vIERvbid0IGtub3cgaWYgdGhpcyBjYW4gaGFwcGVuIGJlZm9yZSB3ZSByZW1vdmUgdGhlIGJ1aWx0aW4gb2JqcyBhbmQgc2V0CisgIC8vIGNvbXBhdGliaWxpdHkgbW9kZS4KKyAgbV9wSnNDbGFzcyA9CisgICAgICBDRlhKU0VfQ2xhc3M6OkNyZWF0ZShtX0pzQ29udGV4dC5nZXQoKSwgJk5vcm1hbENsYXNzRGVzY3JpcHRvciwgZmFsc2UpOworfQorCitDRlhKU0VfRW5naW5lOjp+Q0ZYSlNFX0VuZ2luZSgpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbV9tYXBWYXJpYWJsZVRvQ29udGV4dCkKKyAgICBkZWxldGUgVG9UaGlzUHJveHkocGFpci5zZWNvbmQtPkdldEdsb2JhbE9iamVjdCgpLmdldCgpLCBudWxscHRyKTsKK30KKworYm9vbCBDRlhKU0VfRW5naW5lOjpSdW5TY3JpcHQoQ1hGQV9TY3JpcHQ6OlR5cGUgZVNjcmlwdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NTY3JpcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGhSZXRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfT2JqZWN0KiBwVGhpc09iamVjdCkgeworICBCeXRlU3RyaW5nIGJ0U2NyaXB0OworICBBdXRvUmVzdG9yZXI8Q1hGQV9TY3JpcHQ6OlR5cGU+IHR5cGVSZXN0b3JlcigmbV9lU2NyaXB0VHlwZSk7CisgIG1fZVNjcmlwdFR5cGUgPSBlU2NyaXB0VHlwZTsKKyAgaWYgKGVTY3JpcHRUeXBlID09IENYRkFfU2NyaXB0OjpUeXBlOjpGb3JtY2FsYykgeworICAgIGlmICghbV9GTTJKU0NvbnRleHQpIHsKKyAgICAgIG1fRk0ySlNDb250ZXh0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ+KAorICAgICAgICAgIEdldElzb2xhdGUoKSwgbV9Kc0NvbnRleHQuZ2V0KCksIG1fcERvY3VtZW50LkdldCgpKTsKKyAgICB9CisgICAgQ0ZYX1dpZGVUZXh0QnVmIHdzSmF2YVNjcmlwdDsKKyAgICBpZiAoIUNGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlRyYW5zbGF0ZSh3c1NjcmlwdCwgJndzSmF2YVNjcmlwdCkpIHsKKyAgICAgIGhSZXRWYWx1ZS0+U2V0VW5kZWZpbmVkKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGJ0U2NyaXB0ID0gRlhfVVRGOEVuY29kZSh3c0phdmFTY3JpcHQuQXNTdHJpbmdWaWV3KCkpOworICB9IGVsc2UgeworICAgIGJ0U2NyaXB0ID0gRlhfVVRGOEVuY29kZSh3c1NjcmlwdCk7CisgIH0KKyAgQXV0b1Jlc3RvcmVyPENYRkFfT2JqZWN0Kj4gbm9kZVJlc3RvcmVyKCZtX3BUaGlzT2JqZWN0KTsKKyAgbV9wVGhpc09iamVjdCA9IHBUaGlzT2JqZWN0OworICBDRlhKU0VfVmFsdWUqIHBWYWx1ZSA9IHBUaGlzT2JqZWN0ID8gR2V0SlNWYWx1ZUZyb21NYXAocFRoaXNPYmplY3QpIDogbnVsbHB0cjsKKyAgcmV0dXJuIG1fSnNDb250ZXh0LT5FeGVjdXRlU2NyaXB0KGJ0U2NyaXB0LmNfc3RyKCksIGhSZXRWYWx1ZSwgcFZhbHVlKTsKK30KKworYm9vbCBDRlhKU0VfRW5naW5lOjpRdWVyeU5vZGVCeUZsYWcoQ1hGQV9Ob2RlKiByZWZOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHByb3BuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nKSB7CisgIGlmICghcmVmTm9kZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc29sdmVSczsKKyAgaWYgKCFSZXNvbHZlT2JqZWN0cyhyZWZOb2RlLCBwcm9wbmFtZSwgJnJlc29sdmVScywgZHdGbGFnLCBudWxscHRyKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChyZXNvbHZlUnMuZHdGbGFncyA9PSBYRkFfUmVzb2x2ZU5vZGVfUlNUeXBlX05vZGVzKSB7CisgICAgcFZhbHVlLT5Bc3NpZ24oR2V0SlNWYWx1ZUZyb21NYXAocmVzb2x2ZVJzLm9iamVjdHMuZnJvbnQoKSkpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChyZXNvbHZlUnMuZHdGbGFncyA9PSBYRkFfUmVzb2x2ZU5vZGVfUlNUeXBlX0F0dHJpYnV0ZSkgeworICAgIGNvbnN0IFhGQV9TQ1JJUFRBVFRSSUJVVEVJTkZPKiBscEF0dHJpYnV0ZUluZm8gPSByZXNvbHZlUnMucFNjcmlwdEF0dHJpYnV0ZTsKKyAgICBpZiAobHBBdHRyaWJ1dGVJbmZvKSB7CisgICAgICBDSlhfT2JqZWN0KiBqc09iamVjdCA9IHJlc29sdmVScy5vYmplY3RzLmZyb250KCktPkpTT2JqZWN0KCk7CisgICAgICAoanNPYmplY3QtPioobHBBdHRyaWJ1dGVJbmZvLT5jYWxsYmFjaykpKHBWYWx1ZSwgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwQXR0cmlidXRlSW5mby0+YXR0cmlidXRlKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ0ZYSlNFX0VuZ2luZTo6R2xvYmFsUHJvcGVydHlTZXR0ZXIoQ0ZYSlNFX1ZhbHVlKiBwT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pQcm9wTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpIHsKKyAgQ1hGQV9PYmplY3QqIGxwT3JnaW5hbE5vZGUgPSBUb09iamVjdChwT2JqZWN0LCBudWxscHRyKTsKKyAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IGxwT3JnaW5hbE5vZGUtPkdldERvY3VtZW50KCk7CisgIENGWEpTRV9FbmdpbmUqIGxwU2NyaXB0Q29udGV4dCA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKTsKKyAgQ1hGQV9Ob2RlKiBwUmVmTm9kZSA9IFRvTm9kZShscFNjcmlwdENvbnRleHQtPkdldFRoaXNPYmplY3QoKSk7CisgIGlmIChscE9yZ2luYWxOb2RlLT5Jc1ZhcmlhYmxlc1RoaXMoKSkKKyAgICBwUmVmTm9kZSA9IFRvTm9kZShscFNjcmlwdENvbnRleHQtPkdldFZhcmlhYmxlc1RoaXMobHBPcmdpbmFsTm9kZSkpOworCisgIFdpZGVTdHJpbmcgd3NQcm9wTmFtZSA9IFdpZGVTdHJpbmc6OkZyb21VVEY4KHN6UHJvcE5hbWUpOworICBpZiAobHBTY3JpcHRDb250ZXh0LT5RdWVyeU5vZGVCeUZsYWcoCisgICAgICAgICAgcFJlZk5vZGUsIHdzUHJvcE5hbWUuQXNTdHJpbmdWaWV3KCksIHBWYWx1ZSwKKyAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzIHwKKyAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfAorICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfQXR0cmlidXRlcywKKyAgICAgICAgICB0cnVlKSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAobHBPcmdpbmFsTm9kZS0+SXNWYXJpYWJsZXNUaGlzKCkpIHsKKyAgICBpZiAocFZhbHVlICYmIHBWYWx1ZS0+SXNVbmRlZmluZWQoKSkgeworICAgICAgcE9iamVjdC0+U2V0T2JqZWN0T3duUHJvcGVydHkoc3pQcm9wTmFtZSwgcFZhbHVlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IHBEb2MtPkdldE5vdGlmeSgpOworICBpZiAoIXBOb3RpZnkpCisgICAgcmV0dXJuOworCisgIHBOb3RpZnktPkdldERvY0Vudmlyb25tZW50KCktPlNldEdsb2JhbFByb3BlcnR5KHBOb3RpZnktPkdldEhET0MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pQcm9wTmFtZSwgcFZhbHVlKTsKK30KKwordm9pZCBDRlhKU0VfRW5naW5lOjpHbG9iYWxQcm9wZXJ0eUdldHRlcihDRlhKU0VfVmFsdWUqIHBPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzelByb3BOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHBWYWx1ZSkgeworICBDWEZBX09iamVjdCogcE9yaWdpbmFsT2JqZWN0ID0gVG9PYmplY3QocE9iamVjdCwgbnVsbHB0cik7CisgIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBwT3JpZ2luYWxPYmplY3QtPkdldERvY3VtZW50KCk7CisgIENGWEpTRV9FbmdpbmUqIGxwU2NyaXB0Q29udGV4dCA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKTsKKyAgV2lkZVN0cmluZyB3c1Byb3BOYW1lID0gV2lkZVN0cmluZzo6RnJvbVVURjgoc3pQcm9wTmFtZSk7CisgIGlmIChscFNjcmlwdENvbnRleHQtPkdldFR5cGUoKSA9PSBDWEZBX1NjcmlwdDo6VHlwZTo6Rm9ybWNhbGMpIHsKKyAgICBpZiAoc3pQcm9wTmFtZSA9PSBrRm9ybUNhbGNSdW50aW1lKSB7CisgICAgICBscFNjcmlwdENvbnRleHQtPm1fRk0ySlNDb250ZXh0LT5HbG9iYWxQcm9wZXJ0eUdldHRlcihwVmFsdWUpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBYRkFfSGFzaENvZGUgdUhhc2hDb2RlID0gc3RhdGljX2Nhc3Q8WEZBX0hhc2hDb2RlPigKKyAgICAgICAgRlhfSGFzaENvZGVfR2V0Vyh3c1Byb3BOYW1lLkFzU3RyaW5nVmlldygpLCBmYWxzZSkpOworICAgIGlmICh1SGFzaENvZGUgIT0gWEZBX0hBU0hDT0RFX0xheW91dCkgeworICAgICAgQ1hGQV9PYmplY3QqIHBPYmogPQorICAgICAgICAgIGxwU2NyaXB0Q29udGV4dC0+R2V0RG9jdW1lbnQoKS0+R2V0WEZBT2JqZWN0KHVIYXNoQ29kZSk7CisgICAgICBpZiAocE9iaikgeworICAgICAgICBwVmFsdWUtPkFzc2lnbihscFNjcmlwdENvbnRleHQtPkdldEpTVmFsdWVGcm9tTWFwKHBPYmopKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgfQorCisgIENYRkFfTm9kZSogcFJlZk5vZGUgPSBUb05vZGUobHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCkpOworICBpZiAocE9yaWdpbmFsT2JqZWN0LT5Jc1ZhcmlhYmxlc1RoaXMoKSkKKyAgICBwUmVmTm9kZSA9IFRvTm9kZShscFNjcmlwdENvbnRleHQtPkdldFZhcmlhYmxlc1RoaXMocE9yaWdpbmFsT2JqZWN0KSk7CisKKyAgaWYgKGxwU2NyaXB0Q29udGV4dC0+UXVlcnlOb2RlQnlGbGFnKAorICAgICAgICAgIHBSZWZOb2RlLCB3c1Byb3BOYW1lLkFzU3RyaW5nVmlldygpLCBwVmFsdWUsCisgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfAorICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfQXR0cmlidXRlcywKKyAgICAgICAgICBmYWxzZSkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAobHBTY3JpcHRDb250ZXh0LT5RdWVyeU5vZGVCeUZsYWcoCisgICAgICAgICAgcFJlZk5vZGUsIHdzUHJvcE5hbWUuQXNTdHJpbmdWaWV3KCksIHBWYWx1ZSwKKyAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzLCBmYWxzZSkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBDWEZBX09iamVjdCogcFNjcmlwdE9iamVjdCA9CisgICAgICBscFNjcmlwdENvbnRleHQtPkdldFZhcmlhYmxlc1RoaXMocE9yaWdpbmFsT2JqZWN0LCB0cnVlKTsKKyAgaWYgKHBTY3JpcHRPYmplY3QgJiYgbHBTY3JpcHRDb250ZXh0LT5RdWVyeVZhcmlhYmxlVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyaXB0T2JqZWN0LT5Bc05vZGUoKSwgc3pQcm9wTmFtZSwgcFZhbHVlLCB0cnVlKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBwRG9jLT5HZXROb3RpZnkoKTsKKyAgaWYgKCFwTm90aWZ5KQorICAgIHJldHVybjsKKworICBwTm90aWZ5LT5HZXREb2NFbnZpcm9ubWVudCgpLT5HZXRHbG9iYWxQcm9wZXJ0eShwTm90aWZ5LT5HZXRIRE9DKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6UHJvcE5hbWUsIHBWYWx1ZSk7Cit9CisKK2ludDMyX3QgQ0ZYSlNFX0VuZ2luZTo6R2xvYmFsUHJvcFR5cGVHZXR0ZXIoQ0ZYSlNFX1ZhbHVlKiBwT3JpZ2luYWxWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6UHJvcE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlF1ZXJ5SW4pIHsKKyAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSBUb09iamVjdChwT3JpZ2luYWxWYWx1ZSwgbnVsbHB0cik7CisgIGlmICghcE9iamVjdCkKKyAgICByZXR1cm4gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Ob25lOworCisgIENGWEpTRV9FbmdpbmUqIGxwU2NyaXB0Q29udGV4dCA9IHBPYmplY3QtPkdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKTsKKyAgcE9iamVjdCA9IGxwU2NyaXB0Q29udGV4dC0+R2V0VmFyaWFibGVzVGhpcyhwT2JqZWN0KTsKKyAgV2lkZVN0cmluZyB3c1Byb3BOYW1lID0gV2lkZVN0cmluZzo6RnJvbVVURjgoc3pQcm9wTmFtZSk7CisgIGlmIChwT2JqZWN0LT5KU09iamVjdCgpLT5IYXNNZXRob2Qod3NQcm9wTmFtZSkpCisgICAgcmV0dXJuIEZYSlNFX0NsYXNzUHJvcFR5cGVfTWV0aG9kOworCisgIHJldHVybiBGWEpTRV9DbGFzc1Byb3BUeXBlX1Byb3BlcnR5OworfQorCit2b2lkIENGWEpTRV9FbmdpbmU6Ok5vcm1hbFByb3BlcnR5R2V0dGVyKENGWEpTRV9WYWx1ZSogcE9yaWdpbmFsVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzelByb3BOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHBSZXR1cm5WYWx1ZSkgeworICBDWEZBX09iamVjdCogcE9yaWdpbmFsT2JqZWN0ID0gVG9PYmplY3QocE9yaWdpbmFsVmFsdWUsIG51bGxwdHIpOworICBpZiAoIXBPcmlnaW5hbE9iamVjdCkgeworICAgIHBSZXR1cm5WYWx1ZS0+U2V0VW5kZWZpbmVkKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgV2lkZVN0cmluZyB3c1Byb3BOYW1lID0gV2lkZVN0cmluZzo6RnJvbVVURjgoc3pQcm9wTmFtZSk7CisgIENGWEpTRV9FbmdpbmUqIGxwU2NyaXB0Q29udGV4dCA9CisgICAgICBwT3JpZ2luYWxPYmplY3QtPkdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKTsKKyAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSBscFNjcmlwdENvbnRleHQtPkdldFZhcmlhYmxlc1RoaXMocE9yaWdpbmFsT2JqZWN0KTsKKyAgaWYgKHdzUHJvcE5hbWUgPT0gTCJ4ZmEiKSB7CisgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUgPSBscFNjcmlwdENvbnRleHQtPkdldEpTVmFsdWVGcm9tTWFwKAorICAgICAgICBscFNjcmlwdENvbnRleHQtPkdldERvY3VtZW50KCktPkdldFJvb3QoKSk7CisgICAgcFJldHVyblZhbHVlLT5Bc3NpZ24ocFZhbHVlKTsKKyAgICByZXR1cm47CisgIH0KKworICBib29sIGJSZXQgPSBscFNjcmlwdENvbnRleHQtPlF1ZXJ5Tm9kZUJ5RmxhZygKKyAgICAgIFRvTm9kZShwT2JqZWN0KSwgd3NQcm9wTmFtZS5Bc1N0cmluZ1ZpZXcoKSwgcFJldHVyblZhbHVlLAorICAgICAgWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfAorICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzLAorICAgICAgZmFsc2UpOworICBpZiAoYlJldCkKKyAgICByZXR1cm47CisKKyAgaWYgKHBPYmplY3QgPT0gbHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCkgfHwKKyAgICAgIChscFNjcmlwdENvbnRleHQtPkdldFR5cGUoKSA9PSBDWEZBX1NjcmlwdDo6VHlwZTo6SmF2YXNjcmlwdCAmJgorICAgICAgICFscFNjcmlwdENvbnRleHQtPklzU3RyaWN0U2NvcGVJbkphdmFTY3JpcHQoKSkpIHsKKyAgICBiUmV0ID0gbHBTY3JpcHRDb250ZXh0LT5RdWVyeU5vZGVCeUZsYWcoCisgICAgICAgIFRvTm9kZShwT2JqZWN0KSwgd3NQcm9wTmFtZS5Bc1N0cmluZ1ZpZXcoKSwgcFJldHVyblZhbHVlLAorICAgICAgICBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzLCBmYWxzZSk7CisgIH0KKyAgaWYgKGJSZXQpCisgICAgcmV0dXJuOworCisgIENYRkFfT2JqZWN0KiBwU2NyaXB0T2JqZWN0ID0KKyAgICAgIGxwU2NyaXB0Q29udGV4dC0+R2V0VmFyaWFibGVzVGhpcyhwT3JpZ2luYWxPYmplY3QsIHRydWUpOworICBpZiAocFNjcmlwdE9iamVjdCkgeworICAgIGJSZXQgPSBscFNjcmlwdENvbnRleHQtPlF1ZXJ5VmFyaWFibGVWYWx1ZShUb05vZGUocFNjcmlwdE9iamVjdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6UHJvcE5hbWUsIHBSZXR1cm5WYWx1ZSwgdHJ1ZSk7CisgIH0KKyAgaWYgKCFiUmV0KQorICAgIHBSZXR1cm5WYWx1ZS0+U2V0VW5kZWZpbmVkKCk7Cit9CisKK3ZvaWQgQ0ZYSlNFX0VuZ2luZTo6Tm9ybWFsUHJvcGVydHlTZXR0ZXIoQ0ZYSlNFX1ZhbHVlKiBwT3JpZ2luYWxWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6UHJvcE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFJldHVyblZhbHVlKSB7CisgIENYRkFfT2JqZWN0KiBwT3JpZ2luYWxPYmplY3QgPSBUb09iamVjdChwT3JpZ2luYWxWYWx1ZSwgbnVsbHB0cik7CisgIGlmICghcE9yaWdpbmFsT2JqZWN0KQorICAgIHJldHVybjsKKworICBDRlhKU0VfRW5naW5lKiBscFNjcmlwdENvbnRleHQgPQorICAgICAgcE9yaWdpbmFsT2JqZWN0LT5HZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCk7CisgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKHBPcmlnaW5hbE9iamVjdCk7CisgIFdpZGVTdHJpbmcgd3NQcm9wTmFtZSA9IFdpZGVTdHJpbmc6OkZyb21VVEY4KHN6UHJvcE5hbWUpOworICBjb25zdCBYRkFfU0NSSVBUQVRUUklCVVRFSU5GTyogbHBBdHRyaWJ1dGVJbmZvID0gWEZBX0dldFNjcmlwdEF0dHJpYnV0ZUJ5TmFtZSgKKyAgICAgIHBPYmplY3QtPkdldEVsZW1lbnRUeXBlKCksIHdzUHJvcE5hbWUuQXNTdHJpbmdWaWV3KCkpOworICBpZiAobHBBdHRyaWJ1dGVJbmZvKSB7CisgICAgQ0pYX09iamVjdCoganNPYmplY3QgPSBwT2JqZWN0LT5KU09iamVjdCgpOworICAgIChqc09iamVjdC0+KihscEF0dHJpYnV0ZUluZm8tPmNhbGxiYWNrKSkocFJldHVyblZhbHVlLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBBdHRyaWJ1dGVJbmZvLT5hdHRyaWJ1dGUpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChwT2JqZWN0LT5Jc05vZGUoKSkgeworICAgIGlmICh3c1Byb3BOYW1lWzBdID09ICcjJykKKyAgICAgIHdzUHJvcE5hbWUgPSB3c1Byb3BOYW1lLlJpZ2h0KHdzUHJvcE5hbWUuR2V0TGVuZ3RoKCkgLSAxKTsKKworICAgIENYRkFfTm9kZSogcE5vZGUgPSBUb05vZGUocE9iamVjdCk7CisgICAgQ1hGQV9Ob2RlKiBwUHJvcE9yQ2hpbGQgPSBudWxscHRyOworICAgIFhGQV9FbGVtZW50IGVUeXBlID0gQ1hGQV9Ob2RlOjpOYW1lVG9FbGVtZW50KHdzUHJvcE5hbWUpOworICAgIGlmIChlVHlwZSAhPSBYRkFfRWxlbWVudDo6VW5rbm93bikgeworICAgICAgcFByb3BPckNoaWxkID0KKyAgICAgICAgICBwTm9kZS0+SlNPYmplY3QoKS0+R2V0T3JDcmVhdGVQcm9wZXJ0eTxDWEZBX05vZGU+KDAsIGVUeXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgcFByb3BPckNoaWxkID0gcE5vZGUtPkdldEZpcnN0Q2hpbGRCeU5hbWUod3NQcm9wTmFtZS5Bc1N0cmluZ1ZpZXcoKSk7CisgICAgfQorCisgICAgaWYgKHBQcm9wT3JDaGlsZCkgeworICAgICAgY29uc3QgWEZBX1NDUklQVEFUVFJJQlVURUlORk8qIGxwQXR0ckluZm8gPSBYRkFfR2V0U2NyaXB0QXR0cmlidXRlQnlOYW1lKAorICAgICAgICAgIHBQcm9wT3JDaGlsZC0+R2V0RWxlbWVudFR5cGUoKSwgTCJ7ZGVmYXVsdH0iKTsKKyAgICAgIGlmIChscEF0dHJJbmZvKSB7CisgICAgICAgIHBQcm9wT3JDaGlsZC0+SlNPYmplY3QoKS0+U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUoCisgICAgICAgICAgICBwUmV0dXJuVmFsdWUsIHRydWUsIFhGQV9BdHRyaWJ1dGU6OlVua25vd24pOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICB9CisKKyAgQ1hGQV9PYmplY3QqIHBTY3JpcHRPYmplY3QgPQorICAgICAgbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKHBPcmlnaW5hbE9iamVjdCwgdHJ1ZSk7CisgIGlmIChwU2NyaXB0T2JqZWN0KSB7CisgICAgbHBTY3JpcHRDb250ZXh0LT5RdWVyeVZhcmlhYmxlVmFsdWUoVG9Ob2RlKHBTY3JpcHRPYmplY3QpLCBzelByb3BOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZXR1cm5WYWx1ZSwgZmFsc2UpOworICB9Cit9CisKK2ludDMyX3QgQ0ZYSlNFX0VuZ2luZTo6Tm9ybWFsUHJvcFR5cGVHZXR0ZXIoQ0ZYSlNFX1ZhbHVlKiBwT3JpZ2luYWxWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6UHJvcE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlF1ZXJ5SW4pIHsKKyAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSBUb09iamVjdChwT3JpZ2luYWxWYWx1ZSwgbnVsbHB0cik7CisgIGlmICghcE9iamVjdCkKKyAgICByZXR1cm4gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Ob25lOworCisgIENGWEpTRV9FbmdpbmUqIGxwU2NyaXB0Q29udGV4dCA9IHBPYmplY3QtPkdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKTsKKyAgcE9iamVjdCA9IGxwU2NyaXB0Q29udGV4dC0+R2V0VmFyaWFibGVzVGhpcyhwT2JqZWN0KTsKKyAgWEZBX0VsZW1lbnQgZVR5cGUgPSBwT2JqZWN0LT5HZXRFbGVtZW50VHlwZSgpOworICBXaWRlU3RyaW5nIHdzUHJvcE5hbWUgPSBXaWRlU3RyaW5nOjpGcm9tVVRGOChzelByb3BOYW1lKTsKKyAgaWYgKHBPYmplY3QtPkpTT2JqZWN0KCktPkhhc01ldGhvZCh3c1Byb3BOYW1lKSkKKyAgICByZXR1cm4gRlhKU0VfQ2xhc3NQcm9wVHlwZV9NZXRob2Q7CisKKyAgaWYgKGJRdWVyeUluICYmCisgICAgICAhWEZBX0dldFNjcmlwdEF0dHJpYnV0ZUJ5TmFtZShlVHlwZSwgd3NQcm9wTmFtZS5Bc1N0cmluZ1ZpZXcoKSkpIHsKKyAgICByZXR1cm4gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Ob25lOworICB9CisgIHJldHVybiBGWEpTRV9DbGFzc1Byb3BUeXBlX1Byb3BlcnR5OworfQorCitDSlNfUmV0dXJuIENGWEpTRV9FbmdpbmU6Ok5vcm1hbE1ldGhvZENhbGwoCisgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8sCisgICAgY29uc3QgV2lkZVN0cmluZyYgZnVuY3Rpb25OYW1lKSB7CisgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gVG9PYmplY3QoaW5mbyk7CisgIGlmICghcE9iamVjdCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ0ZYSlNFX0VuZ2luZSogbHBTY3JpcHRDb250ZXh0ID0gcE9iamVjdC0+R2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpOworICBwT2JqZWN0ID0gbHBTY3JpcHRDb250ZXh0LT5HZXRWYXJpYWJsZXNUaGlzKHBPYmplY3QpOworCisgIHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiBwYXJhbWV0ZXJzOworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpaW5mby5MZW5ndGgoKTsgaSsrKQorICAgIHBhcmFtZXRlcnMucHVzaF9iYWNrKGluZm9baV0pOworCisgIHJldHVybiBwT2JqZWN0LT5KU09iamVjdCgpLT5SdW5NZXRob2QoZnVuY3Rpb25OYW1lLCBwYXJhbWV0ZXJzKTsKK30KKworYm9vbCBDRlhKU0VfRW5naW5lOjpJc1N0cmljdFNjb3BlSW5KYXZhU2NyaXB0KCkgeworICByZXR1cm4gbV9wRG9jdW1lbnQtPkhhc0ZsYWcoWEZBX0RPQ0ZMQUdfU3RyaWN0U2NvcGluZyk7Cit9CisKK0NYRkFfU2NyaXB0OjpUeXBlIENGWEpTRV9FbmdpbmU6OkdldFR5cGUoKSB7CisgIHJldHVybiBtX2VTY3JpcHRUeXBlOworfQorCitDRlhKU0VfQ29udGV4dCogQ0ZYSlNFX0VuZ2luZTo6Q3JlYXRlVmFyaWFibGVzQ29udGV4dChDWEZBX05vZGUqIHBTY3JpcHROb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwU3ViZm9ybSkgeworICBpZiAoIXBTY3JpcHROb2RlIHx8ICFwU3ViZm9ybSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBhdXRvIHBOZXdDb250ZXh0ID0KKyAgICAgIENGWEpTRV9Db250ZXh0OjpDcmVhdGUoR2V0SXNvbGF0ZSgpLCAmVmFyaWFibGVzQ2xhc3NEZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ1hGQV9UaGlzUHJveHkocFN1YmZvcm0sIHBTY3JpcHROb2RlKSk7CisgIFJlbW92ZUJ1aWx0SW5PYmpzKHBOZXdDb250ZXh0LmdldCgpKTsKKyAgcE5ld0NvbnRleHQtPkVuYWJsZUNvbXBhdGlibGVNb2RlKCk7CisgIENGWEpTRV9Db250ZXh0KiBwUmVzdWx0ID0gcE5ld0NvbnRleHQuZ2V0KCk7CisgIG1fbWFwVmFyaWFibGVUb0NvbnRleHRbcFNjcmlwdE5vZGVdID0gc3RkOjptb3ZlKHBOZXdDb250ZXh0KTsKKyAgcmV0dXJuIHBSZXN1bHQ7Cit9CisKK0NYRkFfT2JqZWN0KiBDRlhKU0VfRW5naW5lOjpHZXRWYXJpYWJsZXNUaGlzKENYRkFfT2JqZWN0KiBwT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2NyaXB0Tm9kZSkgeworICBpZiAoIXBPYmplY3QtPklzVmFyaWFibGVzVGhpcygpKQorICAgIHJldHVybiBwT2JqZWN0OworCisgIENYRkFfVGhpc1Byb3h5KiBwUHJveHkgPSBzdGF0aWNfY2FzdDxDWEZBX1RoaXNQcm94eSo+KHBPYmplY3QpOworICByZXR1cm4gYlNjcmlwdE5vZGUgPyBwUHJveHktPkdldFNjcmlwdE5vZGUoKSA6IHBQcm94eS0+R2V0VGhpc05vZGUoKTsKK30KKworYm9vbCBDRlhKU0VfRW5naW5lOjpSdW5WYXJpYWJsZXNTY3JpcHQoQ1hGQV9Ob2RlKiBwU2NyaXB0Tm9kZSkgeworICBpZiAoIXBTY3JpcHROb2RlKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAocFNjcmlwdE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlNjcmlwdCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBDWEZBX05vZGUqIHBQYXJlbnQgPSBwU2NyaXB0Tm9kZS0+R2V0UGFyZW50KCk7CisgIGlmICghcFBhcmVudCB8fCBwUGFyZW50LT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpWYXJpYWJsZXMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGF1dG8gaXQgPSBtX21hcFZhcmlhYmxlVG9Db250ZXh0LmZpbmQocFNjcmlwdE5vZGUpOworICBpZiAoaXQgIT0gbV9tYXBWYXJpYWJsZVRvQ29udGV4dC5lbmQoKSAmJiBpdC0+c2Vjb25kKQorICAgIHJldHVybiB0cnVlOworCisgIENYRkFfTm9kZSogcFRleHROb2RlID0gcFNjcmlwdE5vZGUtPkdldEZpcnN0Q2hpbGQoKTsKKyAgaWYgKCFwVGV4dE5vZGUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIE9wdGlvbmFsPFdpZGVTdHJpbmc+IHdzU2NyaXB0ID0KKyAgICAgIHBUZXh0Tm9kZS0+SlNPYmplY3QoKS0+VHJ5Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6VmFsdWUsIHRydWUpOworICBpZiAoIXdzU2NyaXB0KQorICAgIHJldHVybiBmYWxzZTsKKworICBCeXRlU3RyaW5nIGJ0U2NyaXB0ID0gd3NTY3JpcHQtPlVURjhFbmNvZGUoKTsKKyAgYXV0byBoUmV0VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihHZXRJc29sYXRlKCkpOworICBDWEZBX05vZGUqIHBUaGlzT2JqZWN0ID0gcFBhcmVudC0+R2V0UGFyZW50KCk7CisgIENGWEpTRV9Db250ZXh0KiBwVmFyaWFibGVzQ29udGV4dCA9CisgICAgICBDcmVhdGVWYXJpYWJsZXNDb250ZXh0KHBTY3JpcHROb2RlLCBwVGhpc09iamVjdCk7CisgIEF1dG9SZXN0b3JlcjxDWEZBX09iamVjdCo+IG5vZGVSZXN0b3JlcigmbV9wVGhpc09iamVjdCk7CisgIG1fcFRoaXNPYmplY3QgPSBwVGhpc09iamVjdDsKKyAgcmV0dXJuIHBWYXJpYWJsZXNDb250ZXh0LT5FeGVjdXRlU2NyaXB0KGJ0U2NyaXB0LmNfc3RyKCksIGhSZXRWYWx1ZS5nZXQoKSk7Cit9CisKK2Jvb2wgQ0ZYSlNFX0VuZ2luZTo6UXVlcnlWYXJpYWJsZVZhbHVlKENYRkFfTm9kZSogcFNjcmlwdE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pQcm9wTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiR2V0dGVyKSB7CisgIGlmICghcFNjcmlwdE5vZGUgfHwgcFNjcmlwdE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlNjcmlwdCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQ1hGQV9Ob2RlKiB2YXJpYWJsZXNOb2RlID0gcFNjcmlwdE5vZGUtPkdldFBhcmVudCgpOworICBpZiAoIXZhcmlhYmxlc05vZGUgfHwKKyAgICAgIHZhcmlhYmxlc05vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlZhcmlhYmxlcykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYXV0byBpdCA9IG1fbWFwVmFyaWFibGVUb0NvbnRleHQuZmluZChwU2NyaXB0Tm9kZSk7CisgIGlmIChpdCA9PSBtX21hcFZhcmlhYmxlVG9Db250ZXh0LmVuZCgpIHx8ICFpdC0+c2Vjb25kKQorICAgIHJldHVybiBmYWxzZTsKKworICBDRlhKU0VfQ29udGV4dCogcFZhcmlhYmxlQ29udGV4dCA9IGl0LT5zZWNvbmQuZ2V0KCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IHBPYmplY3QgPSBwVmFyaWFibGVDb250ZXh0LT5HZXRHbG9iYWxPYmplY3QoKTsKKyAgYXV0byBoVmFyaWFibGVWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KEdldElzb2xhdGUoKSk7CisgIGlmICghYkdldHRlcikgeworICAgIHBPYmplY3QtPlNldE9iamVjdE93blByb3BlcnR5KHN6UHJvcE5hbWUsIHBWYWx1ZSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKHBPYmplY3QtPkhhc09iamVjdE93blByb3BlcnR5KHN6UHJvcE5hbWUsIGZhbHNlKSkgeworICAgIHBPYmplY3QtPkdldE9iamVjdFByb3BlcnR5KHN6UHJvcE5hbWUsIGhWYXJpYWJsZVZhbHVlLmdldCgpKTsKKyAgICBpZiAoaFZhcmlhYmxlVmFsdWUtPklzRnVuY3Rpb24oKSkKKyAgICAgIHBWYWx1ZS0+U2V0RnVuY3Rpb25CaW5kKGhWYXJpYWJsZVZhbHVlLmdldCgpLCBwT2JqZWN0LmdldCgpKTsKKyAgICBlbHNlIGlmIChiR2V0dGVyKQorICAgICAgcFZhbHVlLT5Bc3NpZ24oaFZhcmlhYmxlVmFsdWUuZ2V0KCkpOworICAgIGVsc2UKKyAgICAgIGhWYXJpYWJsZVZhbHVlLmdldCgpLT5Bc3NpZ24ocFZhbHVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ0ZYSlNFX0VuZ2luZTo6UmVtb3ZlQnVpbHRJbk9ianMoQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0KSBjb25zdCB7CisgIHN0YXRpYyBjb25zdCBCeXRlU3RyaW5nVmlldyBPQkpfTkFNRVsyXSA9IHsiTnVtYmVyIiwgIkRhdGUifTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gcE9iamVjdCA9IHBDb250ZXh0LT5HZXRHbG9iYWxPYmplY3QoKTsKKyAgYXV0byBoUHJvcCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KEdldElzb2xhdGUoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgaWYgKHBPYmplY3QtPkdldE9iamVjdFByb3BlcnR5KE9CSl9OQU1FW2ldLCBoUHJvcC5nZXQoKSkpCisgICAgICBwT2JqZWN0LT5EZWxldGVPYmplY3RQcm9wZXJ0eShPQkpfTkFNRVtpXSk7CisgIH0KK30KKworQ0ZYSlNFX0NsYXNzKiBDRlhKU0VfRW5naW5lOjpHZXRKc2VOb3JtYWxDbGFzcygpIHsKKyAgcmV0dXJuIG1fcEpzQ2xhc3M7Cit9CisKK2Jvb2wgQ0ZYSlNFX0VuZ2luZTo6UmVzb2x2ZU9iamVjdHMoQ1hGQV9PYmplY3QqIHJlZk9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1JTKiByZXNvbHZlTm9kZVJTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0eWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBiaW5kTm9kZSkgeworICBpZiAod3NFeHByZXNzaW9uLklzRW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKG1fZVNjcmlwdFR5cGUgIT0gQ1hGQV9TY3JpcHQ6OlR5cGU6OkZvcm1jYWxjIHx8CisgICAgICAoZHdTdHlsZXMgJiAoWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncykpKSB7CisgICAgbV91cE9iamVjdEFycmF5LmNsZWFyKCk7CisgIH0KKyAgaWYgKHJlZk9iamVjdCAmJiByZWZPYmplY3QtPklzTm9kZSgpICYmCisgICAgICAoZHdTdHlsZXMgJiAoWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncykpKSB7CisgICAgbV91cE9iamVjdEFycmF5LnB1c2hfYmFjayhyZWZPYmplY3QtPkFzTm9kZSgpKTsKKyAgfQorCisgIGJvb2wgYk5leHRDcmVhdGUgPSBmYWxzZTsKKyAgaWYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGUpCisgICAgbV9SZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCktPlNldENyZWF0ZU5vZGVUeXBlKGJpbmROb2RlKTsKKworICBtX1Jlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+bV9wQ3JlYXRlUGFyZW50ID0gbnVsbHB0cjsKKyAgbV9SZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCktPm1faUN1ckFsbFN0YXJ0ID0gLTE7CisKKyAgQ0ZYSlNFX1Jlc29sdmVOb2RlRGF0YSBybmRGaW5kKHRoaXMpOworICBpbnQzMl90IG5TdGFydCA9IDA7CisgIGludDMyX3QgbkxldmVsID0gMDsKKworICBzdGQ6OnZlY3RvcjxDWEZBX09iamVjdCo+IGZpbmRPYmplY3RzOworICBmaW5kT2JqZWN0cy5wdXNoX2JhY2socmVmT2JqZWN0ID8gcmVmT2JqZWN0IDogbV9wRG9jdW1lbnQtPkdldFJvb3QoKSk7CisgIGludDMyX3Qgbk5vZGVzID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBuTm9kZXMgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KGZpbmRPYmplY3RzKTsKKyAgICBpbnQzMl90IGkgPSAwOworICAgIHJuZEZpbmQubV9kd1N0eWxlcyA9IGR3U3R5bGVzOworICAgIG1fUmVzb2x2ZVByb2Nlc3Nvci0+U2V0Q3VyU3RhcnQoblN0YXJ0KTsKKyAgICBuU3RhcnQgPSBtX1Jlc29sdmVQcm9jZXNzb3ItPkdldEZpbHRlcih3c0V4cHJlc3Npb24sIG5TdGFydCwgcm5kRmluZCk7CisgICAgaWYgKG5TdGFydCA8IDEpIHsKKyAgICAgIGlmICgoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZSkgJiYgIWJOZXh0Q3JlYXRlKSB7CisgICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gbnVsbHB0cjsKKyAgICAgICAgblN0YXJ0ID0gbV9SZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCktPm1faUN1ckFsbFN0YXJ0OworICAgICAgICBpZiAoblN0YXJ0ICE9IC0xKSB7CisgICAgICAgICAgcERhdGFOb2RlID0gbV9wRG9jdW1lbnQtPkdldE5vdEJpbmROb2RlKGZpbmRPYmplY3RzKTsKKyAgICAgICAgICBpZiAocERhdGFOb2RlKSB7CisgICAgICAgICAgICBmaW5kT2JqZWN0cy5jbGVhcigpOworICAgICAgICAgICAgZmluZE9iamVjdHMucHVzaF9iYWNrKHBEYXRhTm9kZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcERhdGFOb2RlID0gZmluZE9iamVjdHMuZnJvbnQoKS0+QXNOb2RlKCk7CisgICAgICAgICAgZmluZE9iamVjdHMuY2xlYXIoKTsKKyAgICAgICAgICBmaW5kT2JqZWN0cy5wdXNoX2JhY2socERhdGFOb2RlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkd1N0eWxlcyB8PSBYRkFfUkVTT0xWRU5PREVfQmluZDsKKyAgICAgICAgZmluZE9iamVjdHMuY2xlYXIoKTsKKyAgICAgICAgZmluZE9iamVjdHMucHVzaF9iYWNrKAorICAgICAgICAgICAgbV9SZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCktPm1fcEFsbFN0YXJ0UGFyZW50KTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGJOZXh0Q3JlYXRlKSB7CisgICAgICBib29sIGJDcmVhdGUgPQorICAgICAgICAgIG1fUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpLT5SZXNvbHZlTm9kZXNfQ3JlYXRlTm9kZSgKKyAgICAgICAgICAgICAgcm5kRmluZC5tX3dzTmFtZSwgcm5kRmluZC5tX3dzQ29uZGl0aW9uLAorICAgICAgICAgICAgICBuU3RhcnQgPT0KKyAgICAgICAgICAgICAgICAgIHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PGludDMyX3Q+KHdzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSksCisgICAgICAgICAgICAgIHRoaXMpOworICAgICAgaWYgKGJDcmVhdGUpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDWEZBX09iamVjdCo+IHJldE9iamVjdHM7CisgICAgd2hpbGUgKGkgPCBuTm9kZXMpIHsKKyAgICAgIGJvb2wgYkRhdGFCaW5kID0gZmFsc2U7CisgICAgICBpZiAoKChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9CaW5kKSB8fAorICAgICAgICAgICAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZSkpICYmCisgICAgICAgICAgbk5vZGVzID4gMSkgeworICAgICAgICBDRlhKU0VfUmVzb2x2ZU5vZGVEYXRhIHJuZEJpbmQobnVsbHB0cik7CisgICAgICAgIG1fUmVzb2x2ZVByb2Nlc3Nvci0+R2V0RmlsdGVyKHdzRXhwcmVzc2lvbiwgblN0YXJ0LCBybmRCaW5kKTsKKyAgICAgICAgbV9SZXNvbHZlUHJvY2Vzc29yLT5TZXRJbmRleERhdGFCaW5kKHJuZEJpbmQubV93c0NvbmRpdGlvbiwgaSwgbk5vZGVzKTsKKyAgICAgICAgYkRhdGFCaW5kID0gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJuZEZpbmQubV9DdXJPYmplY3QgPSBmaW5kT2JqZWN0c1tpKytdOworICAgICAgcm5kRmluZC5tX25MZXZlbCA9IG5MZXZlbDsKKyAgICAgIHJuZEZpbmQubV9kd0ZsYWcgPSBYRkFfUmVzb2x2ZU5vZGVfUlNUeXBlX05vZGVzOworICAgICAgaWYgKCFtX1Jlc29sdmVQcm9jZXNzb3ItPlJlc29sdmUocm5kRmluZCkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAocm5kRmluZC5tX2R3RmxhZyA9PSBYRkFfUmVzb2x2ZU5vZGVfUlNUeXBlX0F0dHJpYnV0ZSAmJgorICAgICAgICAgIHJuZEZpbmQubV9wU2NyaXB0QXR0cmlidXRlICYmCisgICAgICAgICAgblN0YXJ0IDwKKyAgICAgICAgICAgICAgcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8aW50MzJfdD4od3NFeHByZXNzaW9uLkdldExlbmd0aCgpKSkgeworICAgICAgICBhdXRvIHBWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KEdldElzb2xhdGUoKSk7CisgICAgICAgIENKWF9PYmplY3QqIGpzT2JqZWN0ID0gcm5kRmluZC5tX09iamVjdHMuZnJvbnQoKS0+SlNPYmplY3QoKTsKKyAgICAgICAgKGpzT2JqZWN0LT4qKHJuZEZpbmQubV9wU2NyaXB0QXR0cmlidXRlLT5jYWxsYmFjaykpKAorICAgICAgICAgICAgcFZhbHVlLmdldCgpLCBmYWxzZSwgcm5kRmluZC5tX3BTY3JpcHRBdHRyaWJ1dGUtPmF0dHJpYnV0ZSk7CisgICAgICAgIHJuZEZpbmQubV9PYmplY3RzLmZyb250KCkgPSBUb09iamVjdChwVmFsdWUuZ2V0KCksIG51bGxwdHIpOworICAgICAgfQorICAgICAgaWYgKCFtX3VwT2JqZWN0QXJyYXkuZW1wdHkoKSkKKyAgICAgICAgbV91cE9iamVjdEFycmF5LnBvcF9iYWNrKCk7CisgICAgICByZXRPYmplY3RzLmluc2VydChyZXRPYmplY3RzLmVuZCgpLCBybmRGaW5kLm1fT2JqZWN0cy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgcm5kRmluZC5tX09iamVjdHMuZW5kKCkpOworICAgICAgcm5kRmluZC5tX09iamVjdHMuY2xlYXIoKTsKKyAgICAgIGlmIChiRGF0YUJpbmQpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBmaW5kT2JqZWN0cy5jbGVhcigpOworCisgICAgbk5vZGVzID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihyZXRPYmplY3RzKTsKKyAgICBpZiAobk5vZGVzIDwgMSkgeworICAgICAgaWYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGUpIHsKKyAgICAgICAgYk5leHRDcmVhdGUgPSB0cnVlOworICAgICAgICBpZiAoIW1fUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpLT5tX3BDcmVhdGVQYXJlbnQpIHsKKyAgICAgICAgICBtX1Jlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+bV9wQ3JlYXRlUGFyZW50ID0KKyAgICAgICAgICAgICAgVG9Ob2RlKHJuZEZpbmQubV9DdXJPYmplY3QpOworICAgICAgICAgIG1fUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpLT5tX2lDcmVhdGVDb3VudCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBiQ3JlYXRlID0KKyAgICAgICAgICAgIG1fUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpLT5SZXNvbHZlTm9kZXNfQ3JlYXRlTm9kZSgKKyAgICAgICAgICAgICAgICBybmRGaW5kLm1fd3NOYW1lLCBybmRGaW5kLm1fd3NDb25kaXRpb24sCisgICAgICAgICAgICAgICAgblN0YXJ0ID09IHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PGludDMyX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NFeHByZXNzaW9uLkdldExlbmd0aCgpKSwKKyAgICAgICAgICAgICAgICB0aGlzKTsKKyAgICAgICAgaWYgKGJDcmVhdGUpCisgICAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBmaW5kT2JqZWN0cyA9CisgICAgICAgIHN0ZDo6dmVjdG9yPENYRkFfT2JqZWN0Kj4ocmV0T2JqZWN0cy5iZWdpbigpLCByZXRPYmplY3RzLmVuZCgpKTsKKyAgICBybmRGaW5kLm1fT2JqZWN0cy5jbGVhcigpOworICAgIGlmIChuTGV2ZWwgPT0gMCkKKyAgICAgIGR3U3R5bGVzICY9IH4oWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyk7CisKKyAgICBuTGV2ZWwrKzsKKyAgfQorCisgIGlmICghYk5leHRDcmVhdGUpIHsKKyAgICByZXNvbHZlTm9kZVJTLT5kd0ZsYWdzID0gcm5kRmluZC5tX2R3RmxhZzsKKyAgICBpZiAobk5vZGVzID4gMCkgeworICAgICAgcmVzb2x2ZU5vZGVSUy0+b2JqZWN0cy5pbnNlcnQocmVzb2x2ZU5vZGVSUy0+b2JqZWN0cy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRPYmplY3RzLmJlZ2luKCksIGZpbmRPYmplY3RzLmVuZCgpKTsKKyAgICB9CisgICAgaWYgKHJuZEZpbmQubV9kd0ZsYWcgPT0gWEZBX1Jlc29sdmVOb2RlX1JTVHlwZV9BdHRyaWJ1dGUpIHsKKyAgICAgIHJlc29sdmVOb2RlUlMtPnBTY3JpcHRBdHRyaWJ1dGUgPSBybmRGaW5kLm1fcFNjcmlwdEF0dHJpYnV0ZTsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorICBpZiAoZHdTdHlsZXMgJiAoWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGUgfCBYRkFfUkVTT0xWRU5PREVfQmluZCB8CisgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfQmluZE5ldykpIHsKKyAgICBDWEZBX05vZGVIZWxwZXIqIGhlbHBlciA9IG1fUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpOworICAgIGlmIChoZWxwZXItPm1fcENyZWF0ZVBhcmVudCkKKyAgICAgIHJlc29sdmVOb2RlUlMtPm9iamVjdHMucHVzaF9iYWNrKGhlbHBlci0+bV9wQ3JlYXRlUGFyZW50KTsKKyAgICBlbHNlCisgICAgICBoZWxwZXItPkNyZWF0ZU5vZGVfRm9yQ29uZGl0aW9uKHJuZEZpbmQubV93c0NvbmRpdGlvbik7CisKKyAgICByZXNvbHZlTm9kZVJTLT5kd0ZsYWdzID0gaGVscGVyLT5tX2lDcmVhdGVGbGFnOworICAgIGlmIChyZXNvbHZlTm9kZVJTLT5kd0ZsYWdzID09IFhGQV9SZXNvbHZlTm9kZV9SU1R5cGVfQ3JlYXRlTm9kZU9uZSkgeworICAgICAgaWYgKGhlbHBlci0+bV9pQ3VyQWxsU3RhcnQgIT0gLTEpCisgICAgICAgIHJlc29sdmVOb2RlUlMtPmR3RmxhZ3MgPSBYRkFfUmVzb2x2ZU5vZGVfUlNUeXBlX0NyZWF0ZU5vZGVNaWRBbGw7CisgICAgfQorCisgICAgaWYgKCFiTmV4dENyZWF0ZSAmJiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZSkpCisgICAgICByZXNvbHZlTm9kZVJTLT5kd0ZsYWdzID0gWEZBX1Jlc29sdmVOb2RlX1JTVHlwZV9FeGlzdE5vZGVzOworCisgICAgcmV0dXJuICFyZXNvbHZlTm9kZVJTLT5vYmplY3RzLmVtcHR5KCk7CisgIH0KKyAgcmV0dXJuIG5Ob2RlcyA+IDA7Cit9CisKK3ZvaWQgQ0ZYSlNFX0VuZ2luZTo6QWRkVG9DYWNoZUxpc3Qoc3RkOjp1bmlxdWVfcHRyPENYRkFfTGlzdD4gcExpc3QpIHsKKyAgbV9DYWNoZUxpc3QucHVzaF9iYWNrKHN0ZDo6bW92ZShwTGlzdCkpOworfQorCitDRlhKU0VfVmFsdWUqIENGWEpTRV9FbmdpbmU6OkdldEpTVmFsdWVGcm9tTWFwKENYRkFfT2JqZWN0KiBwT2JqZWN0KSB7CisgIGlmICghcE9iamVjdCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgaWYgKHBPYmplY3QtPklzTm9kZSgpKQorICAgIFJ1blZhcmlhYmxlc1NjcmlwdChwT2JqZWN0LT5Bc05vZGUoKSk7CisKKyAgYXV0byBpdGVyID0gbV9tYXBPYmplY3RUb1ZhbHVlLmZpbmQocE9iamVjdCk7CisgIGlmIChpdGVyICE9IG1fbWFwT2JqZWN0VG9WYWx1ZS5lbmQoKSkKKyAgICByZXR1cm4gaXRlci0+c2Vjb25kLmdldCgpOworCisgIGF1dG8ganNWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KEdldElzb2xhdGUoKSk7CisgIGpzVmFsdWUtPlNldE9iamVjdChwT2JqZWN0LCBtX3BKc0NsYXNzKTsKKworICBDRlhKU0VfVmFsdWUqIHBWYWx1ZSA9IGpzVmFsdWUuZ2V0KCk7CisgIG1fbWFwT2JqZWN0VG9WYWx1ZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIocE9iamVjdCwgc3RkOjptb3ZlKGpzVmFsdWUpKSk7CisgIHJldHVybiBwVmFsdWU7Cit9CisKK2ludDMyX3QgQ0ZYSlNFX0VuZ2luZTo6R2V0SW5kZXhCeU5hbWUoQ1hGQV9Ob2RlKiByZWZOb2RlKSB7CisgIENYRkFfTm9kZUhlbHBlciogbHBOb2RlSGVscGVyID0gbV9SZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCk7CisgIHJldHVybiBscE5vZGVIZWxwZXItPkdldEluZGV4KHJlZk5vZGUsIFhGQV9MT0dJQ19UcmFuc3BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBOb2RlSGVscGVyLT5Ob2RlSXNQcm9wZXJ0eShyZWZOb2RlKSwgZmFsc2UpOworfQorCitpbnQzMl90IENGWEpTRV9FbmdpbmU6OkdldEluZGV4QnlDbGFzc05hbWUoQ1hGQV9Ob2RlKiByZWZOb2RlKSB7CisgIENYRkFfTm9kZUhlbHBlciogbHBOb2RlSGVscGVyID0gbV9SZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCk7CisgIHJldHVybiBscE5vZGVIZWxwZXItPkdldEluZGV4KHJlZk5vZGUsIFhGQV9MT0dJQ19UcmFuc3BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBOb2RlSGVscGVyLT5Ob2RlSXNQcm9wZXJ0eShyZWZOb2RlKSwgdHJ1ZSk7Cit9CisKK1dpZGVTdHJpbmcgQ0ZYSlNFX0VuZ2luZTo6R2V0U29tRXhwcmVzc2lvbihDWEZBX05vZGUqIHJlZk5vZGUpIHsKKyAgQ1hGQV9Ob2RlSGVscGVyKiBscE5vZGVIZWxwZXIgPSBtX1Jlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKTsKKyAgcmV0dXJuIGxwTm9kZUhlbHBlci0+R2V0TmFtZUV4cHJlc3Npb24ocmVmTm9kZSwgdHJ1ZSwgWEZBX0xPR0lDX1RyYW5zcGFyZW50KTsKK30KKwordm9pZCBDRlhKU0VfRW5naW5lOjpTZXROb2Rlc09mUnVuU2NyaXB0KHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+KiBwQXJyYXkpIHsKKyAgbV9wU2NyaXB0Tm9kZUFycmF5ID0gcEFycmF5OworfQorCit2b2lkIENGWEpTRV9FbmdpbmU6OkFkZE5vZGVzT2ZSdW5TY3JpcHQoQ1hGQV9Ob2RlKiBwTm9kZSkgeworICBpZiAobV9wU2NyaXB0Tm9kZUFycmF5ICYmICFwZGZpdW06OkNvbnRhaW5zVmFsdWUoKm1fcFNjcmlwdE5vZGVBcnJheSwgcE5vZGUpKQorICAgIG1fcFNjcmlwdE5vZGVBcnJheS0+cHVzaF9iYWNrKHBOb2RlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMvY2Z4anNlX2VuZ2luZS5oIGIvZnhqcy9jZnhqc2VfZW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzNjBiZAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2Z4anNlX2VuZ2luZS5oCkBAIC0wLDAgKzEsMTIxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19DRlhKU0VfRU5HSU5FX0hfCisjZGVmaW5lIEZYSlNfQ0ZYSlNFX0VOR0lORV9IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV9mb3JtY2FsY19jb250ZXh0LmgiCisjaW5jbHVkZSAiZnhqcy9janNfdjguaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NjcmlwdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfcmVzb2x2ZW5vZGVfcnMuaCIKKworI2RlZmluZSBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZSAweDAwMDIKKworY2xhc3MgQ1hGQV9MaXN0OworY2xhc3MgQ0ZYSlNFX1Jlc29sdmVQcm9jZXNzb3I7CisKK2NsYXNzIENGWEpTRV9FbmdpbmUgOiBwdWJsaWMgQ0pTX1Y4IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBDWEZBX09iamVjdCogVG9PYmplY3QoY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pOworICBzdGF0aWMgQ1hGQV9PYmplY3QqIFRvT2JqZWN0KENGWEpTRV9WYWx1ZSogcFZhbHVlLCBDRlhKU0VfQ2xhc3MqIHBDbGFzcyk7CisgIHN0YXRpYyB2b2lkIEdsb2JhbFByb3BlcnR5R2V0dGVyKENGWEpTRV9WYWx1ZSogcE9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6UHJvcE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFZhbHVlKTsKKyAgc3RhdGljIHZvaWQgR2xvYmFsUHJvcGVydHlTZXR0ZXIoQ0ZYSlNFX1ZhbHVlKiBwT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pQcm9wTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpOworICBzdGF0aWMgdm9pZCBOb3JtYWxQcm9wZXJ0eUdldHRlcihDRlhKU0VfVmFsdWUqIHBPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzelByb3BOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHBWYWx1ZSk7CisgIHN0YXRpYyB2b2lkIE5vcm1hbFByb3BlcnR5U2V0dGVyKENGWEpTRV9WYWx1ZSogcE9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6UHJvcE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFZhbHVlKTsKKyAgc3RhdGljIENKU19SZXR1cm4gTm9ybWFsTWV0aG9kQ2FsbCgKKyAgICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvLAorICAgICAgY29uc3QgV2lkZVN0cmluZyYgZnVuY3Rpb25OYW1lKTsKKyAgc3RhdGljIGludDMyX3QgTm9ybWFsUHJvcFR5cGVHZXR0ZXIoQ0ZYSlNFX1ZhbHVlKiBwT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pQcm9wTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUXVlcnlJbik7CisgIHN0YXRpYyBpbnQzMl90IEdsb2JhbFByb3BUeXBlR2V0dGVyKENGWEpTRV9WYWx1ZSogcE9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6UHJvcE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlF1ZXJ5SW4pOworCisgIGV4cGxpY2l0IENGWEpTRV9FbmdpbmUoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LCB2ODo6SXNvbGF0ZSogcElzb2xhdGUpOworICB+Q0ZYSlNFX0VuZ2luZSgpIG92ZXJyaWRlOworCisgIHZvaWQgU2V0RXZlbnRQYXJhbShDWEZBX0V2ZW50UGFyYW0gcGFyYW0pIHsgbV9ldmVudFBhcmFtID0gcGFyYW07IH0KKyAgQ1hGQV9FdmVudFBhcmFtKiBHZXRFdmVudFBhcmFtKCkgeyByZXR1cm4gJm1fZXZlbnRQYXJhbTsgfQorICBib29sIFJ1blNjcmlwdChDWEZBX1NjcmlwdDo6VHlwZSBlU2NyaXB0VHlwZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzU2NyaXB0LAorICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHBSZXRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgQ1hGQV9PYmplY3QqIHBUaGlzT2JqZWN0KTsKKworICBib29sIFJlc29sdmVPYmplY3RzKENYRkFfT2JqZWN0KiByZWZPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMqIHJlc29sdmVOb2RlUlMsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdHlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBiaW5kTm9kZSk7CisgIENGWEpTRV9WYWx1ZSogR2V0SlNWYWx1ZUZyb21NYXAoQ1hGQV9PYmplY3QqIHBPYmplY3QpOworICB2b2lkIEFkZFRvQ2FjaGVMaXN0KHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0xpc3Q+IHBMaXN0KTsKKyAgQ1hGQV9PYmplY3QqIEdldFRoaXNPYmplY3QoKSBjb25zdCB7IHJldHVybiBtX3BUaGlzT2JqZWN0OyB9CisKKyAgaW50MzJfdCBHZXRJbmRleEJ5TmFtZShDWEZBX05vZGUqIHJlZk5vZGUpOworICBpbnQzMl90IEdldEluZGV4QnlDbGFzc05hbWUoQ1hGQV9Ob2RlKiByZWZOb2RlKTsKKyAgV2lkZVN0cmluZyBHZXRTb21FeHByZXNzaW9uKENYRkFfTm9kZSogcmVmTm9kZSk7CisKKyAgdm9pZCBTZXROb2Rlc09mUnVuU2NyaXB0KHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+KiBwQXJyYXkpOworICB2b2lkIEFkZE5vZGVzT2ZSdW5TY3JpcHQoQ1hGQV9Ob2RlKiBwTm9kZSk7CisgIENGWEpTRV9DbGFzcyogR2V0SnNlTm9ybWFsQ2xhc3MoKTsKKworICB2b2lkIFNldFJ1bkF0VHlwZShYRkFfQXR0cmlidXRlRW51bSBlUnVuQXQpIHsgbV9lUnVuQXRUeXBlID0gZVJ1bkF0OyB9CisgIGJvb2wgSXNSdW5BdENsaWVudCgpIHsgcmV0dXJuIG1fZVJ1bkF0VHlwZSAhPSBYRkFfQXR0cmlidXRlRW51bTo6U2VydmVyOyB9CisKKyAgQ1hGQV9TY3JpcHQ6OlR5cGUgR2V0VHlwZSgpOworICBzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPiogR2V0VXBPYmplY3RBcnJheSgpIHsgcmV0dXJuICZtX3VwT2JqZWN0QXJyYXk7IH0KKyAgQ1hGQV9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BEb2N1bWVudC5HZXQoKTsgfQorCisgcHJpdmF0ZToKKyAgQ0ZYSlNFX0NvbnRleHQqIENyZWF0ZVZhcmlhYmxlc0NvbnRleHQoQ1hGQV9Ob2RlKiBwU2NyaXB0Tm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwU3ViZm9ybSk7CisgIHZvaWQgUmVtb3ZlQnVpbHRJbk9ianMoQ0ZYSlNFX0NvbnRleHQqIHBDb250ZXh0KSBjb25zdDsKKyAgYm9vbCBRdWVyeU5vZGVCeUZsYWcoQ1hGQV9Ob2RlKiByZWZOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgcHJvcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcpOworICBib29sIElzU3RyaWN0U2NvcGVJbkphdmFTY3JpcHQoKTsKKyAgQ1hGQV9PYmplY3QqIEdldFZhcmlhYmxlc1RoaXMoQ1hGQV9PYmplY3QqIHBPYmplY3QsIGJvb2wgYlNjcmlwdE5vZGUgPSBmYWxzZSk7CisgIGJvb2wgUXVlcnlWYXJpYWJsZVZhbHVlKENYRkFfTm9kZSogcFNjcmlwdE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzelByb3BOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiR2V0dGVyKTsKKyAgYm9vbCBSdW5WYXJpYWJsZXNTY3JpcHQoQ1hGQV9Ob2RlKiBwU2NyaXB0Tm9kZSk7CisKKyAgVW5vd25lZFB0cjxDWEZBX0RvY3VtZW50PiBjb25zdCBtX3BEb2N1bWVudDsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9Db250ZXh0PiBtX0pzQ29udGV4dDsKKyAgQ0ZYSlNFX0NsYXNzKiBtX3BKc0NsYXNzOworICBDWEZBX1NjcmlwdDo6VHlwZSBtX2VTY3JpcHRUeXBlOworICBzdGQ6Om1hcDxDWEZBX09iamVjdCosIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+PiBtX21hcE9iamVjdFRvVmFsdWU7CisgIHN0ZDo6bWFwPENYRkFfT2JqZWN0Kiwgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9Db250ZXh0Pj4KKyAgICAgIG1fbWFwVmFyaWFibGVUb0NvbnRleHQ7CisgIENYRkFfRXZlbnRQYXJhbSBtX2V2ZW50UGFyYW07CisgIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+IG1fdXBPYmplY3RBcnJheTsKKyAgLy8gQ2FjaGVMaXN0IGhvbGRzIHRoZSBMaXN0IGl0ZW1zIHNvIHdlIGNhbiBjbGVhbiB0aGVtIHVwIHdoZW4gd2UncmUgZG9uZS4KKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfTGlzdD4+IG1fQ2FjaGVMaXN0OworICBzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPiogbV9wU2NyaXB0Tm9kZUFycmF5OworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1Jlc29sdmVQcm9jZXNzb3I+IG1fUmVzb2x2ZVByb2Nlc3NvcjsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ+IG1fRk0ySlNDb250ZXh0OworICBDWEZBX09iamVjdCogbV9wVGhpc09iamVjdDsKKyAgWEZBX0F0dHJpYnV0ZUVudW0gbV9lUnVuQXRUeXBlOworfTsKKworI2VuZGlmICAvLyAgRlhKU19DRlhKU0VfRU5HSU5FX0hfCmRpZmYgLS1naXQgYS9meGpzL2NmeGpzZV9mb3JtY2FsY19jb250ZXh0LmNwcCBiL2Z4anMvY2Z4anNlX2Zvcm1jYWxjX2NvbnRleHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NmI5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2NmeGpzZV9mb3JtY2FsY19jb250ZXh0LmNwcApAQCAtMCwwICsxLDYyNTQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMvY2Z4anNlX2Zvcm1jYWxjX2NvbnRleHQuaCIKKworI2luY2x1ZGUgPHRpbWUuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X2RlY2ltYWwuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF93aWRldGV4dGJ1Zi5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9yYW5kb20uaCIKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV9jbGFzcy5oIgorI2luY2x1ZGUgImZ4anMvY2Z4anNlX2VuZ2luZS5oIgorI2luY2x1ZGUgImZ4anMvY2Z4anNlX3ZhbHVlLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X29iamVjdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZm5vdGlmeS5oIgorI2luY2x1ZGUgInhmYS9meGZhL2ZtMmpzL2N4ZmFfZm1wYXJzZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9mbTJqcy9jeGZhX2ZtdG9qYXZhc2NyaXB0ZGVwdGguaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xvY2FsZXZhbHVlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RpbWV6b25lcHJvdmlkZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX3V0aWxzLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IGRvdWJsZSBrRmluYW5jaWFsUHJlY2lzaW9uID0gMC4wMDAwMDAwMTsKKworc3RydWN0IFhGQV9GTUh0bWxSZXNlcnZlQ29kZSB7CisgIHVpbnQzMl90IG1fdUNvZGU7CisgIGNvbnN0IHdjaGFyX3QqIG1faHRtbFJlc2VydmU7Cit9OworCisvLyBTb3J0ZWQgYnkgbV9odG1sUmVzZXJ2ZQorWEZBX0ZNSHRtbFJlc2VydmVDb2RlIHJlc2VydmVzRm9yRGVjb2RlW10gPSB7CisgICAgezE5OCwgTCJBRWxpZyJ9LCAgIHsxOTMsIEwiQWFjdXRlIn0sICAgezE5NCwgTCJBY2lyYyJ9LAorICAgIHsxOTIsIEwiQWdyYXZlIn0sICB7OTEzLCBMIkFscGhhIn0sICAgIHsxOTcsIEwiQXJpbmcifSwKKyAgICB7MTk1LCBMIkF0aWxkZSJ9LCAgezE5NiwgTCJBdW1sIn0sICAgICB7OTE0LCBMIkJldGEifSwKKyAgICB7MTk5LCBMIkNjZWRpbCJ9LCAgezkzNSwgTCJDaGkifSwgICAgICB7ODIyNSwgTCJEYWdnZXIifSwKKyAgICB7OTE2LCBMIkRlbHRhIn0sICAgezIwOCwgTCJFVEgifSwgICAgICB7MjAxLCBMIkVhY3V0ZSJ9LAorICAgIHsyMDIsIEwiRWNpcmMifSwgICB7MjAwLCBMIkVncmF2ZSJ9LCAgIHs5MTcsIEwiRXBzaWxvbiJ9LAorICAgIHs5MTksIEwiRXRhIn0sICAgICB7MjAzLCBMIkV1bWwifSwgICAgIHs5MTUsIEwiR2FtbWEifSwKKyAgICB7OTIyLCBMIkthcHBhIn0sICAgezkyMywgTCJMYW1iZGEifSwgICB7OTI0LCBMIk11In0sCisgICAgezIwOSwgTCJOdGlsZGUifSwgIHs5MjUsIEwiTnUifSwgICAgICAgezMzOCwgTCJPRWxpZyJ9LAorICAgIHsyMTEsIEwiT2FjdXRlIn0sICB7MjEyLCBMIk9jaXJjIn0sICAgIHsyMTAsIEwiT2dyYXZlIn0sCisgICAgezkzNywgTCJPbWVnYSJ9LCAgIHs5MjcsIEwiT21pY3JvbiJ9LCAgezIxNiwgTCJPc2xhc2gifSwKKyAgICB7MjEzLCBMIk90aWxkZSJ9LCAgezIxNCwgTCJPdW1sIn0sICAgICB7OTM0LCBMIlBoaSJ9LAorICAgIHs5MjgsIEwiUGkifSwgICAgICB7OTM2LCBMIlBzaSJ9LCAgICAgIHs5MjksIEwiUmhvIn0sCisgICAgezM1MiwgTCJTY2Fyb24ifSwgIHs5MzEsIEwiU2lnbWEifSwgICAgezIyMiwgTCJUSE9STiJ9LAorICAgIHs5MzIsIEwiVGF1In0sICAgICB7OTIwLCBMIlRoZXRhIn0sICAgIHsyMTgsIEwiVWFjdXRlIn0sCisgICAgezIxOSwgTCJVY2lyYyJ9LCAgIHsyMTcsIEwiVWdyYXZlIn0sICAgezkzMywgTCJVcHNpbG9uIn0sCisgICAgezIyMCwgTCJVdW1sIn0sICAgIHs5MjYsIEwiWGkifSwgICAgICAgezIyMSwgTCJZYWN1dGUifSwKKyAgICB7Mzc2LCBMIll1bWwifSwgICAgezkxOCwgTCJaZXRhIn0sICAgICB7MjI1LCBMImFhY3V0ZSJ9LAorICAgIHsyMjYsIEwiYWNpcmMifSwgICB7MTgwLCBMImFjdXRlIn0sICAgIHsyMzAsIEwiYWVsaWcifSwKKyAgICB7MjI0LCBMImFncmF2ZSJ9LCAgezg1MDEsIEwiYWxlZnN5bSJ9LCB7OTQ1LCBMImFscGhhIn0sCisgICAgezM4LCBMImFtcCJ9LCAgICAgIHs4NzQzLCBMImFuZCJ9LCAgICAgezg3MzYsIEwiYW5nIn0sCisgICAgezM5LCBMImFwb3MifSwgICAgIHsyMjksIEwiYXJpbmcifSwgICAgezg3NzYsIEwiYXN5bXAifSwKKyAgICB7MjI3LCBMImF0aWxkZSJ9LCAgezIyOCwgTCJhdW1sIn0sICAgICB7ODIyMiwgTCJiZHF1byJ9LAorICAgIHs5NDYsIEwiYmV0YSJ9LCAgICB7MTY2LCBMImJydmJhciJ9LCAgIHs4MjI2LCBMImJ1bGwifSwKKyAgICB7ODc0NSwgTCJjYXAifSwgICAgezIzMSwgTCJjY2VkaWwifSwgICB7MTg0LCBMImNlZGlsIn0sCisgICAgezE2MiwgTCJjZW50In0sICAgIHs5NjcsIEwiY2hpIn0sICAgICAgezcxMCwgTCJjaXJjIn0sCisgICAgezk4MjcsIEwiY2x1YnMifSwgIHs4NzczLCBMImNvbmcifSwgICAgezE2OSwgTCJjb3B5In0sCisgICAgezg2MjksIEwiY3JhcnIifSwgIHs4NzQ2LCBMImN1cCJ9LCAgICAgezE2NCwgTCJjdXJyZW50In0sCisgICAgezg2NTksIEwiZEFyciJ9LCAgIHs4MjI0LCBMImRhZ2dlciJ9LCAgezg1OTUsIEwiZGFyciJ9LAorICAgIHsxNzYsIEwiZGVnIn0sICAgICB7OTQ4LCBMImRlbHRhIn0sICAgIHs5ODMwLCBMImRpYW1zIn0sCisgICAgezI0NywgTCJkaXZpZGUifSwgIHsyMzMsIEwiZWFjdXRlIn0sICAgezIzNCwgTCJlY2lyYyJ9LAorICAgIHsyMzIsIEwiZWdyYXZlIn0sICB7ODcwOSwgTCJlbXB0eSJ9LCAgIHs4MTk1LCBMImVtc3AifSwKKyAgICB7ODE5NCwgTCJlbnNwIn0sICAgezk0OSwgTCJlcHNpbG9uIn0sICB7ODgwMSwgTCJlcXVpdiJ9LAorICAgIHs5NTEsIEwiZXRhIn0sICAgICB7MjQwLCBMImV0aCJ9LCAgICAgIHsyMzUsIEwiZXVtbCJ9LAorICAgIHs4MzY0LCBMImV1cm8ifSwgICB7ODcwNywgTCJleGlzdCJ9LCAgIHs0MDIsIEwiZm5vZiJ9LAorICAgIHs4NzA0LCBMImZvcmFsbCJ9LCB7MTg5LCBMImZyYWMxMiJ9LCAgIHsxODgsIEwiZnJhYzE0In0sCisgICAgezE5MCwgTCJmcmFjMzQifSwgIHs4MjYwLCBMImZyYXNsIn0sICAgezk0NywgTCJnYW1tYSJ9LAorICAgIHs4ODA1LCBMImdlIn0sICAgICB7NjIsIEwiZ3QifSwgICAgICAgIHs4NjYwLCBMImhBcnIifSwKKyAgICB7ODU5NiwgTCJoYXJyIn0sICAgezk4MjksIEwiaGVhcnRzIn0sICB7ODIzMCwgTCJoZWxsaXAifSwKKyAgICB7MjM3LCBMImlhY3V0ZSJ9LCAgezIzOCwgTCJpY2lyYyJ9LCAgICB7MTYxLCBMImlleGNsIn0sCisgICAgezIzNiwgTCJpZ3JhdmUifSwgIHs4NDY1LCBMImltYWdlIn0sICAgezg3MzQsIEwiaW5maW4ifSwKKyAgICB7ODc0NywgTCJpbnQifSwgICAgezk1MywgTCJpb3RhIn0sICAgICB7MTkxLCBMImlxdWVzdCJ9LAorICAgIHs4NzEyLCBMImlzaW4ifSwgICB7MjM5LCBMIml1bWwifSwgICAgIHs5NTQsIEwia2FwcGEifSwKKyAgICB7ODY1NiwgTCJsQXJyIn0sICAgezIwNSwgTCJsYWN1dGUifSwgICB7OTU1LCBMImxhbWJkYSJ9LAorICAgIHs5MDAxLCBMImxhbmcifSwgICB7MTcxLCBMImxhcXVvIn0sICAgIHs4NTkyLCBMImxhcnIifSwKKyAgICB7ODk2OCwgTCJsY2VpbCJ9LCAgezIwNiwgTCJsY2lyYyJ9LCAgICB7ODIyMCwgTCJsZHF1byJ9LAorICAgIHs4ODA0LCBMImxlIn0sICAgICB7ODk3MCwgTCJsZmxvb3IifSwgIHsyMDQsIEwibGdyYXZlIn0sCisgICAgezkyMSwgTCJsb3RhIn0sICAgIHs4NzI3LCBMImxvd2FzdCJ9LCAgezk2NzQsIEwibG96In0sCisgICAgezgyMDYsIEwibHJtIn0sICAgIHs4MjQ5LCBMImxzYXF1byJ9LCAgezgyMTYsIEwibHNxdW8ifSwKKyAgICB7NjAsIEwibHQifSwgICAgICAgezIwNywgTCJsdW1sIn0sICAgICB7MTc1LCBMIm1hY3IifSwKKyAgICB7ODIxMiwgTCJtZGFzaCJ9LCAgezE4MSwgTCJtaWNybyJ9LCAgICB7MTgzLCBMIm1pZGRvdCJ9LAorICAgIHs4NzIyLCBMIm1pbnVzIn0sICB7OTU2LCBMIm11In0sICAgICAgIHs4NzExLCBMIm5hYmxhIn0sCisgICAgezE2MCwgTCJuYnNwIn0sICAgIHs4MjExLCBMIm5kYXNoIn0sICAgezg4MDAsIEwibmUifSwKKyAgICB7ODcxNSwgTCJuaSJ9LCAgICAgezE3MiwgTCJub3QifSwgICAgICB7ODcxMywgTCJub3RpbiJ9LAorICAgIHs4ODM2LCBMIm5zdWIifSwgICB7MjQxLCBMIm50aWxkZSJ9LCAgIHs5NTcsIEwibnUifSwKKyAgICB7MjQzLCBMIm9hY3V0ZSJ9LCAgezI0NCwgTCJvY2lyYyJ9LCAgICB7MzM5LCBMIm9lbGlnIn0sCisgICAgezI0MiwgTCJvZ3JhdmUifSwgIHs4MjU0LCBMIm9saW5lIn0sICAgezk2OSwgTCJvbWVnYSJ9LAorICAgIHs5NTksIEwib21pY3JvbiJ9LCB7ODg1MywgTCJvcGx1cyJ9LCAgIHs4NzQ0LCBMIm9yIn0sCisgICAgezE3MCwgTCJvcmRmIn0sICAgIHsxODYsIEwib3JkbSJ9LCAgICAgezI0OCwgTCJvc2xhc2gifSwKKyAgICB7MjQ1LCBMIm90aWxkZSJ9LCAgezg4NTUsIEwib3RpbWVzIn0sICB7MjQ2LCBMIm91bWwifSwKKyAgICB7MTgyLCBMInBhcmEifSwgICAgezg3MDYsIEwicGFydCJ9LCAgICB7ODI0MCwgTCJwZXJtaWwifSwKKyAgICB7ODg2OSwgTCJwZXJwIn0sICAgezk2NiwgTCJwaGkifSwgICAgICB7OTYwLCBMInBpIn0sCisgICAgezk4MiwgTCJwaXYifSwgICAgIHsxNzcsIEwicGx1c21uIn0sICAgezgyNDIsIEwicHJpbWUifSwKKyAgICB7ODcxOSwgTCJwcm9kIn0sICAgezg3MzMsIEwicHJvcCJ9LCAgICB7OTY4LCBMInBzaSJ9LAorICAgIHsxNjMsIEwicHVuZCJ9LCAgICB7MzQsIEwicXVvdCJ9LCAgICAgIHs4NjU4LCBMInJBcnIifSwKKyAgICB7ODczMCwgTCJyYWRpYyJ9LCAgezkwMDIsIEwicmFuZyJ9LCAgICB7MTg3LCBMInJhcXVvIn0sCisgICAgezg1OTQsIEwicmFyciJ9LCAgIHs4OTY5LCBMInJjZWlsIn0sICAgezg0NzYsIEwicmVhbCJ9LAorICAgIHsxNzQsIEwicmVnIn0sICAgICB7ODk3MSwgTCJyZmxvb3IifSwgIHs5NjEsIEwicmhvIn0sCisgICAgezgyMDcsIEwicmxtIn0sICAgIHs4MjUwLCBMInJzYXF1byJ9LCAgezgyMTcsIEwicnNxdW8ifSwKKyAgICB7MzUzLCBMInNhcm9uIn0sICAgezgyMTgsIEwic2JxdW8ifSwgICB7ODkwMSwgTCJzZG90In0sCisgICAgezE2NywgTCJzZWN0In0sICAgIHsxNzMsIEwic2h5In0sICAgICAgezk2MywgTCJzaWdtYSJ9LAorICAgIHs5NjIsIEwic2lnbWFmIn0sICB7ODc2NCwgTCJzaW0ifSwgICAgIHs5ODI0LCBMInNwYWRlcyJ9LAorICAgIHs4ODM0LCBMInN1YiJ9LCAgICB7ODgzOCwgTCJzdWJlIn0sICAgIHs4NzIxLCBMInN1bSJ9LAorICAgIHs4ODM1LCBMInN1cCJ9LCAgICB7MTg1LCBMInN1cDEifSwgICAgIHsxNzgsIEwic3VwMiJ9LAorICAgIHsxNzksIEwic3VwMyJ9LCAgICB7ODgzOSwgTCJzdXBlIn0sICAgIHsyMjMsIEwic3psaWcifSwKKyAgICB7OTY0LCBMInRhdSJ9LCAgICAgezgyMjEsIEwidGRxdW8ifSwgICB7ODc1NiwgTCJ0aGVyZTQifSwKKyAgICB7OTUyLCBMInRoZXRhIn0sICAgezk3NywgTCJ0aGV0YXN5bSJ9LCB7ODIwMSwgTCJ0aGluc3AifSwKKyAgICB7MjU0LCBMInRob3JuIn0sICAgezczMiwgTCJ0aWxkZSJ9LCAgICB7MjE1LCBMInRpbWVzIn0sCisgICAgezg0ODIsIEwidHJhZGUifSwgIHs4NjU3LCBMInVBcnIifSwgICAgezI1MCwgTCJ1YWN1dGUifSwKKyAgICB7ODU5MywgTCJ1YXJyIn0sICAgezI1MSwgTCJ1Y2lyYyJ9LCAgICB7MjQ5LCBMInVncmF2ZSJ9LAorICAgIHsxNjgsIEwidW1sIn0sICAgICB7OTc4LCBMInVwc2loIn0sICAgIHs5NjUsIEwidXBzaWxvbiJ9LAorICAgIHsyNTIsIEwidXVtbCJ9LCAgICB7ODQ3MiwgTCJ3ZWllcnAifSwgIHs5NTgsIEwieGkifSwKKyAgICB7MjUzLCBMInlhY3V0ZSJ9LCAgezE2NSwgTCJ5ZW4ifSwgICAgICB7MjU1LCBMInl1bWwifSwKKyAgICB7OTUwLCBMInpldGEifSwgICAgezgyMDUsIEwiendqIn0sICAgICB7ODIwNCwgTCJ6d25qIn0sCit9OworCisvLyBTb3J0ZWQgYnkgbV91Q29kZQorY29uc3QgWEZBX0ZNSHRtbFJlc2VydmVDb2RlIHJlc2VydmVzRm9yRW5jb2RlW10gPSB7CisgICAgezM0LCBMInF1b3QifSwgICAgIHszOCwgTCJhbXAifSwgICAgICB7MzksIEwiYXBvcyJ9LAorICAgIHs2MCwgTCJsdCJ9LCAgICAgICB7NjIsIEwiZ3QifSwgICAgICAgezE2MCwgTCJuYnNwIn0sCisgICAgezE2MSwgTCJpZXhjbCJ9LCAgIHsxNjIsIEwiY2VudCJ9LCAgICB7MTYzLCBMInB1bmQifSwKKyAgICB7MTY0LCBMImN1cnJlbnQifSwgezE2NSwgTCJ5ZW4ifSwgICAgIHsxNjYsIEwiYnJ2YmFyIn0sCisgICAgezE2NywgTCJzZWN0In0sICAgIHsxNjgsIEwidW1sIn0sICAgICB7MTY5LCBMImNvcHkifSwKKyAgICB7MTcwLCBMIm9yZGYifSwgICAgezE3MSwgTCJsYXF1byJ9LCAgIHsxNzIsIEwibm90In0sCisgICAgezE3MywgTCJzaHkifSwgICAgIHsxNzQsIEwicmVnIn0sICAgICB7MTc1LCBMIm1hY3IifSwKKyAgICB7MTc2LCBMImRlZyJ9LCAgICAgezE3NywgTCJwbHVzbW4ifSwgIHsxNzgsIEwic3VwMiJ9LAorICAgIHsxNzksIEwic3VwMyJ9LCAgICB7MTgwLCBMImFjdXRlIn0sICAgezE4MSwgTCJtaWNybyJ9LAorICAgIHsxODIsIEwicGFyYSJ9LCAgICB7MTgzLCBMIm1pZGRvdCJ9LCAgezE4NCwgTCJjZWRpbCJ9LAorICAgIHsxODUsIEwic3VwMSJ9LCAgICB7MTg2LCBMIm9yZG0ifSwgICAgezE4NywgTCJyYXF1byJ9LAorICAgIHsxODgsIEwiZnJhYzE0In0sICB7MTg5LCBMImZyYWMxMiJ9LCAgezE5MCwgTCJmcmFjMzQifSwKKyAgICB7MTkxLCBMImlxdWVzdCJ9LCAgezE5MiwgTCJBZ3JhdmUifSwgIHsxOTMsIEwiQWFjdXRlIn0sCisgICAgezE5NCwgTCJBY2lyYyJ9LCAgIHsxOTUsIEwiQXRpbGRlIn0sICB7MTk2LCBMIkF1bWwifSwKKyAgICB7MTk3LCBMIkFyaW5nIn0sICAgezE5OCwgTCJBRWxpZyJ9LCAgIHsxOTksIEwiQ2NlZGlsIn0sCisgICAgezIwMCwgTCJFZ3JhdmUifSwgIHsyMDEsIEwiRWFjdXRlIn0sICB7MjAyLCBMIkVjaXJjIn0sCisgICAgezIwMywgTCJFdW1sIn0sICAgIHsyMDQsIEwibGdyYXZlIn0sICB7MjA1LCBMImxhY3V0ZSJ9LAorICAgIHsyMDYsIEwibGNpcmMifSwgICB7MjA3LCBMImx1bWwifSwgICAgezIwOCwgTCJFVEgifSwKKyAgICB7MjA5LCBMIk50aWxkZSJ9LCAgezIxMCwgTCJPZ3JhdmUifSwgIHsyMTEsIEwiT2FjdXRlIn0sCisgICAgezIxMiwgTCJPY2lyYyJ9LCAgIHsyMTMsIEwiT3RpbGRlIn0sICB7MjE0LCBMIk91bWwifSwKKyAgICB7MjE1LCBMInRpbWVzIn0sICAgezIxNiwgTCJPc2xhc2gifSwgIHsyMTcsIEwiVWdyYXZlIn0sCisgICAgezIxOCwgTCJVYWN1dGUifSwgIHsyMTksIEwiVWNpcmMifSwgICB7MjIwLCBMIlV1bWwifSwKKyAgICB7MjIxLCBMIllhY3V0ZSJ9LCAgezIyMiwgTCJUSE9STiJ9LCAgIHsyMjMsIEwic3psaWcifSwKKyAgICB7MjI0LCBMImFncmF2ZSJ9LCAgezIyNSwgTCJhYWN1dGUifSwgIHsyMjYsIEwiYWNpcmMifSwKKyAgICB7MjI3LCBMImF0aWxkZSJ9LCAgezIyOCwgTCJhdW1sIn0sICAgIHsyMjksIEwiYXJpbmcifSwKKyAgICB7MjMwLCBMImFlbGlnIn0sICAgezIzMSwgTCJjY2VkaWwifSwgIHsyMzIsIEwiZWdyYXZlIn0sCisgICAgezIzMywgTCJlYWN1dGUifSwgIHsyMzQsIEwiZWNpcmMifSwgICB7MjM1LCBMImV1bWwifSwKKyAgICB7MjM2LCBMImlncmF2ZSJ9LCAgezIzNywgTCJpYWN1dGUifSwgIHsyMzgsIEwiaWNpcmMifSwKKyAgICB7MjM5LCBMIml1bWwifSwgICAgezI0MCwgTCJldGgifSwgICAgIHsyNDEsIEwibnRpbGRlIn0sCisgICAgezI0MiwgTCJvZ3JhdmUifSwgIHsyNDMsIEwib2FjdXRlIn0sICB7MjQ0LCBMIm9jaXJjIn0sCisgICAgezI0NSwgTCJvdGlsZGUifSwgIHsyNDYsIEwib3VtbCJ9LCAgICB7MjQ3LCBMImRpdmlkZSJ9LAorICAgIHsyNDgsIEwib3NsYXNoIn0sICB7MjQ5LCBMInVncmF2ZSJ9LCAgezI1MCwgTCJ1YWN1dGUifSwKKyAgICB7MjUxLCBMInVjaXJjIn0sICAgezI1MiwgTCJ1dW1sIn0sICAgIHsyNTMsIEwieWFjdXRlIn0sCisgICAgezI1NCwgTCJ0aG9ybiJ9LCAgIHsyNTUsIEwieXVtbCJ9LCAgICB7MzM4LCBMIk9FbGlnIn0sCisgICAgezMzOSwgTCJvZWxpZyJ9LCAgIHszNTIsIEwiU2Nhcm9uIn0sICB7MzUzLCBMInNhcm9uIn0sCisgICAgezM3NiwgTCJZdW1sIn0sICAgIHs0MDIsIEwiZm5vZiJ9LCAgICB7NzEwLCBMImNpcmMifSwKKyAgICB7NzMyLCBMInRpbGRlIn0sICAgezkxMywgTCJBbHBoYSJ9LCAgIHs5MTQsIEwiQmV0YSJ9LAorICAgIHs5MTUsIEwiR2FtbWEifSwgICB7OTE2LCBMIkRlbHRhIn0sICAgezkxNywgTCJFcHNpbG9uIn0sCisgICAgezkxOCwgTCJaZXRhIn0sICAgIHs5MTksIEwiRXRhIn0sICAgICB7OTIwLCBMIlRoZXRhIn0sCisgICAgezkyMSwgTCJsb3RhIn0sICAgIHs5MjIsIEwiS2FwcGEifSwgICB7OTIzLCBMIkxhbWJkYSJ9LAorICAgIHs5MjQsIEwiTXUifSwgICAgICB7OTI1LCBMIk51In0sICAgICAgezkyNiwgTCJYaSJ9LAorICAgIHs5MjcsIEwiT21pY3JvbiJ9LCB7OTI4LCBMIlBpIn0sICAgICAgezkyOSwgTCJSaG8ifSwKKyAgICB7OTMxLCBMIlNpZ21hIn0sICAgezkzMiwgTCJUYXUifSwgICAgIHs5MzMsIEwiVXBzaWxvbiJ9LAorICAgIHs5MzQsIEwiUGhpIn0sICAgICB7OTM1LCBMIkNoaSJ9LCAgICAgezkzNiwgTCJQc2kifSwKKyAgICB7OTM3LCBMIk9tZWdhIn0sICAgezk0NSwgTCJhbHBoYSJ9LCAgIHs5NDYsIEwiYmV0YSJ9LAorICAgIHs5NDcsIEwiZ2FtbWEifSwgICB7OTQ4LCBMImRlbHRhIn0sICAgezk0OSwgTCJlcHNpbG9uIn0sCisgICAgezk1MCwgTCJ6ZXRhIn0sICAgIHs5NTEsIEwiZXRhIn0sICAgICB7OTUyLCBMInRoZXRhIn0sCisgICAgezk1MywgTCJpb3RhIn0sICAgIHs5NTQsIEwia2FwcGEifSwgICB7OTU1LCBMImxhbWJkYSJ9LAorICAgIHs5NTYsIEwibXUifSwgICAgICB7OTU3LCBMIm51In0sICAgICAgezk1OCwgTCJ4aSJ9LAorICAgIHs5NTksIEwib21pY3JvbiJ9LCB7OTYwLCBMInBpIn0sICAgICAgezk2MSwgTCJyaG8ifSwKKyAgICB7OTYyLCBMInNpZ21hZiJ9LCAgezk2MywgTCJzaWdtYSJ9LCAgIHs5NjQsIEwidGF1In0sCisgICAgezk2NSwgTCJ1cHNpbG9uIn0sIHs5NjYsIEwicGhpIn0sICAgICB7OTY3LCBMImNoaSJ9LAorICAgIHs5NjgsIEwicHNpIn0sICAgICB7OTY5LCBMIm9tZWdhIn0sICAgezk3NywgTCJ0aGV0YXN5bSJ9LAorICAgIHs5NzgsIEwidXBzaWgifSwgICB7OTgyLCBMInBpdiJ9LCAgICAgezgxOTQsIEwiZW5zcCJ9LAorICAgIHs4MTk1LCBMImVtc3AifSwgICB7ODIwMSwgTCJ0aGluc3AifSwgezgyMDQsIEwienduaiJ9LAorICAgIHs4MjA1LCBMInp3aiJ9LCAgICB7ODIwNiwgTCJscm0ifSwgICAgezgyMDcsIEwicmxtIn0sCisgICAgezgyMTEsIEwibmRhc2gifSwgIHs4MjEyLCBMIm1kYXNoIn0sICB7ODIxNiwgTCJsc3F1byJ9LAorICAgIHs4MjE3LCBMInJzcXVvIn0sICB7ODIxOCwgTCJzYnF1byJ9LCAgezgyMjAsIEwibGRxdW8ifSwKKyAgICB7ODIyMSwgTCJ0ZHF1byJ9LCAgezgyMjIsIEwiYmRxdW8ifSwgIHs4MjI0LCBMImRhZ2dlciJ9LAorICAgIHs4MjI1LCBMIkRhZ2dlciJ9LCB7ODIyNiwgTCJidWxsIn0sICAgezgyMzAsIEwiaGVsbGlwIn0sCisgICAgezgyNDAsIEwicGVybWlsIn0sIHs4MjQyLCBMInByaW1lIn0sICB7ODI0OSwgTCJsc2FxdW8ifSwKKyAgICB7ODI1MCwgTCJyc2FxdW8ifSwgezgyNTQsIEwib2xpbmUifSwgIHs4MjYwLCBMImZyYXNsIn0sCisgICAgezgzNjQsIEwiZXVybyJ9LCAgIHs4NDY1LCBMImltYWdlIn0sICB7ODQ3MiwgTCJ3ZWllcnAifSwKKyAgICB7ODQ3NiwgTCJyZWFsIn0sICAgezg0ODIsIEwidHJhZGUifSwgIHs4NTAxLCBMImFsZWZzeW0ifSwKKyAgICB7ODU5MiwgTCJsYXJyIn0sICAgezg1OTMsIEwidWFyciJ9LCAgIHs4NTk0LCBMInJhcnIifSwKKyAgICB7ODU5NSwgTCJkYXJyIn0sICAgezg1OTYsIEwiaGFyciJ9LCAgIHs4NjI5LCBMImNyYXJyIn0sCisgICAgezg2NTYsIEwibEFyciJ9LCAgIHs4NjU3LCBMInVBcnIifSwgICB7ODY1OCwgTCJyQXJyIn0sCisgICAgezg2NTksIEwiZEFyciJ9LCAgIHs4NjYwLCBMImhBcnIifSwgICB7ODcwNCwgTCJmb3JhbGwifSwKKyAgICB7ODcwNiwgTCJwYXJ0In0sICAgezg3MDcsIEwiZXhpc3QifSwgIHs4NzA5LCBMImVtcHR5In0sCisgICAgezg3MTEsIEwibmFibGEifSwgIHs4NzEyLCBMImlzaW4ifSwgICB7ODcxMywgTCJub3RpbiJ9LAorICAgIHs4NzE1LCBMIm5pIn0sICAgICB7ODcxOSwgTCJwcm9kIn0sICAgezg3MjEsIEwic3VtIn0sCisgICAgezg3MjIsIEwibWludXMifSwgIHs4NzI3LCBMImxvd2FzdCJ9LCB7ODczMCwgTCJyYWRpYyJ9LAorICAgIHs4NzMzLCBMInByb3AifSwgICB7ODczNCwgTCJpbmZpbiJ9LCAgezg3MzYsIEwiYW5nIn0sCisgICAgezg3NDMsIEwiYW5kIn0sICAgIHs4NzQ0LCBMIm9yIn0sICAgICB7ODc0NSwgTCJjYXAifSwKKyAgICB7ODc0NiwgTCJjdXAifSwgICAgezg3NDcsIEwiaW50In0sICAgIHs4NzU2LCBMInRoZXJlNCJ9LAorICAgIHs4NzY0LCBMInNpbSJ9LCAgICB7ODc3MywgTCJjb25nIn0sICAgezg3NzYsIEwiYXN5bXAifSwKKyAgICB7ODgwMCwgTCJuZSJ9LCAgICAgezg4MDEsIEwiZXF1aXYifSwgIHs4ODA0LCBMImxlIn0sCisgICAgezg4MDUsIEwiZ2UifSwgICAgIHs4ODM0LCBMInN1YiJ9LCAgICB7ODgzNSwgTCJzdXAifSwKKyAgICB7ODgzNiwgTCJuc3ViIn0sICAgezg4MzgsIEwic3ViZSJ9LCAgIHs4ODM5LCBMInN1cGUifSwKKyAgICB7ODg1MywgTCJvcGx1cyJ9LCAgezg4NTUsIEwib3RpbWVzIn0sIHs4ODY5LCBMInBlcnAifSwKKyAgICB7ODkwMSwgTCJzZG90In0sICAgezg5NjgsIEwibGNlaWwifSwgIHs4OTY5LCBMInJjZWlsIn0sCisgICAgezg5NzAsIEwibGZsb29yIn0sIHs4OTcxLCBMInJmbG9vciJ9LCB7OTAwMSwgTCJsYW5nIn0sCisgICAgezkwMDIsIEwicmFuZyJ9LCAgIHs5Njc0LCBMImxveiJ9LCAgICB7OTgyNCwgTCJzcGFkZXMifSwKKyAgICB7OTgyNywgTCJjbHVicyJ9LCAgezk4MjksIEwiaGVhcnRzIn0sIHs5ODMwLCBMImRpYW1zIn0sCit9OworCitjb25zdCBGWEpTRV9GVU5DVElPTl9ERVNDUklQVE9SIGZvcm1jYWxjX2ZtMmpzX2Z1bmN0aW9uc1tdID0geworICAgIHsiQWJzIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6QWJzfSwKKyAgICB7IkF2ZyIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkF2Z30sCisgICAgeyJDZWlsIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6Q2VpbH0sCisgICAgeyJDb3VudCIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkNvdW50fSwKKyAgICB7IkZsb29yIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6Rmxvb3J9LAorICAgIHsiTWF4IiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6TWF4fSwKKyAgICB7Ik1pbiIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6Ok1pbn0sCisgICAgeyJNb2QiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpNb2R9LAorICAgIHsiUm91bmQiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpSb3VuZH0sCisgICAgeyJTdW0iLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpTdW19LAorICAgIHsiRGF0ZSIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkRhdGV9LAorICAgIHsiRGF0ZTJOdW0iLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpEYXRlMk51bX0sCisgICAgeyJEYXRlRm10IiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6RGF0ZUZtdH0sCisgICAgeyJJc29EYXRlMk51bSIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6Oklzb0RhdGUyTnVtfSwKKyAgICB7Iklzb1RpbWUyTnVtIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6SXNvVGltZTJOdW19LAorICAgIHsiTG9jYWxEYXRlRm10IiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6TG9jYWxEYXRlRm10fSwKKyAgICB7IkxvY2FsVGltZUZtdCIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkxvY2FsVGltZUZtdH0sCisgICAgeyJOdW0yRGF0ZSIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6Ok51bTJEYXRlfSwKKyAgICB7Ik51bTJHTVRpbWUiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpOdW0yR01UaW1lfSwKKyAgICB7Ik51bTJUaW1lIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6TnVtMlRpbWV9LAorICAgIHsiVGltZSIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlRpbWV9LAorICAgIHsiVGltZTJOdW0iLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpUaW1lMk51bX0sCisgICAgeyJUaW1lRm10IiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6VGltZUZtdH0sCisgICAgeyJBcHIiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpBcHJ9LAorICAgIHsiQ3Rlcm0iLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpDVGVybX0sCisgICAgeyJGViIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkZWfSwKKyAgICB7IklwbXQiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpJUG10fSwKKyAgICB7Ik5QViIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6Ok5QVn0sCisgICAgeyJQbXQiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpQbXR9LAorICAgIHsiUFBtdCIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlBQbXR9LAorICAgIHsiUFYiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpQVn0sCisgICAgeyJSYXRlIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6UmF0ZX0sCisgICAgeyJUZXJtIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6VGVybX0sCisgICAgeyJDaG9vc2UiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpDaG9vc2V9LAorICAgIHsiRXhpc3RzIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6RXhpc3RzfSwKKyAgICB7Ikhhc1ZhbHVlIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6SGFzVmFsdWV9LAorICAgIHsiT25lb2YiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpPbmVvZn0sCisgICAgeyJXaXRoaW4iLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpXaXRoaW59LAorICAgIHsiSWYiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpJZn0sCisgICAgeyJFdmFsIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6RXZhbH0sCisgICAgeyJUcmFuc2xhdGUiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpldmFsX3RyYW5zbGF0aW9ufSwKKyAgICB7IlJlZiIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlJlZn0sCisgICAgeyJVbml0VHlwZSIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlVuaXRUeXBlfSwKKyAgICB7IlVuaXRWYWx1ZSIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlVuaXRWYWx1ZX0sCisgICAgeyJBdCIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkF0fSwKKyAgICB7IkNvbmNhdCIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkNvbmNhdH0sCisgICAgeyJEZWNvZGUiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpEZWNvZGV9LAorICAgIHsiRW5jb2RlIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6RW5jb2RlfSwKKyAgICB7IkZvcm1hdCIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkZvcm1hdH0sCisgICAgeyJMZWZ0IiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6TGVmdH0sCisgICAgeyJMZW4iLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpMZW59LAorICAgIHsiTG93ZXIiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpMb3dlcn0sCisgICAgeyJMdHJpbSIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6Okx0cmltfSwKKyAgICB7IlBhcnNlIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6UGFyc2V9LAorICAgIHsiUmVwbGFjZSIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlJlcGxhY2V9LAorICAgIHsiUmlnaHQiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpSaWdodH0sCisgICAgeyJSdHJpbSIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlJ0cmltfSwKKyAgICB7IlNwYWNlIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6U3BhY2V9LAorICAgIHsiU3RyIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6U3RyfSwKKyAgICB7IlN0dWZmIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6U3R1ZmZ9LAorICAgIHsiU3Vic3RyIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6U3Vic3RyfSwKKyAgICB7IlV1aWQiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpVdWlkfSwKKyAgICB7IlVwcGVyIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6VXBwZXJ9LAorICAgIHsiV29yZE51bSIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OldvcmROdW19LAorICAgIHsiR2V0IiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6R2V0fSwKKyAgICB7IlBvc3QiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpQb3N0fSwKKyAgICB7IlB1dCIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlB1dH0sCisgICAgeyJwb3Nfb3AiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0Ojpwb3NpdGl2ZV9vcGVyYXRvcn0sCisgICAgeyJuZWdfb3AiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpuZWdhdGl2ZV9vcGVyYXRvcn0sCisgICAgeyJsb2dfb3Jfb3AiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0Ojpsb2dpY2FsX29yX29wZXJhdG9yfSwKKyAgICB7ImxvZ19hbmRfb3AiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0Ojpsb2dpY2FsX2FuZF9vcGVyYXRvcn0sCisgICAgeyJsb2dfbm90X29wIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6bG9naWNhbF9ub3Rfb3BlcmF0b3J9LAorICAgIHsiZXFfb3AiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjplcXVhbGl0eV9vcGVyYXRvcn0sCisgICAgeyJuZXFfb3AiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0Ojpub3RlcXVhbGl0eV9vcGVyYXRvcn0sCisgICAgeyJsdF9vcCIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6Omxlc3Nfb3BlcmF0b3J9LAorICAgIHsibGVfb3AiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpsZXNzZXF1YWxfb3BlcmF0b3J9LAorICAgIHsiZ3Rfb3AiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpncmVhdGVyX29wZXJhdG9yfSwKKyAgICB7ImdlX29wIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6Z3JlYXRlcmVxdWFsX29wZXJhdG9yfSwKKyAgICB7InBsdXNfb3AiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpwbHVzX29wZXJhdG9yfSwKKyAgICB7Im1pbnVzX29wIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6bWludXNfb3BlcmF0b3J9LAorICAgIHsibXVsX29wIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6bXVsdGlwbGVfb3BlcmF0b3J9LAorICAgIHsiZGl2X29wIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6ZGl2aWRlX29wZXJhdG9yfSwKKyAgICB7ImFzZ25fdmFsX29wIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6YXNzaWduX3ZhbHVlX29wZXJhdG9yfSwKKyAgICB7ImRvdF9hY2MiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0Ojpkb3RfYWNjZXNzb3J9LAorICAgIHsiZG90ZG90X2FjYyIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OmRvdGRvdF9hY2Nlc3Nvcn0sCisgICAgeyJjb25jYXRfb2JqIiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6Y29uY2F0X2ZtX29iamVjdH0sCisgICAgeyJpc19vYmoiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0Ojppc19mbV9vYmplY3R9LAorICAgIHsiaXNfYXJ5IiwgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6aXNfZm1fYXJyYXl9LAorICAgIHsiZ2V0X3ZhbCIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OmdldF9mbV92YWx1ZX0sCisgICAgeyJnZXRfanNvYmoiLCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpnZXRfZm1fanNvYmp9LAorICAgIHsidmFyX2ZpbHRlciIsIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OmZtX3Zhcl9maWx0ZXJ9LAorfTsKKworY29uc3QgRlhKU0VfQ0xBU1NfREVTQ1JJUFRPUiBmb3JtY2FsY19mbTJqc19kZXNjcmlwdG9yID0geworICAgICJYRkFfRk0ySlNfRm9ybUNhbGNDbGFzcyIsICAgICAgICAgICAgICAgLy8gbmFtZQorICAgIGZvcm1jYWxjX2ZtMmpzX2Z1bmN0aW9ucywgICAgICAgICAgICAgICAgLy8gbWV0aG9kcworICAgIEZYX0FycmF5U2l6ZShmb3JtY2FsY19mbTJqc19mdW5jdGlvbnMpLCAgLy8gbnVtYmVyIG9mIG1ldGhvZHMKKyAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR5bmFtaWMgcHJvcCB0eXBlCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkeW5hbWljIHByb3AgZ2V0dGVyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkeW5hbWljIHByb3Agc2V0dGVyCisgICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkeW5hbWljIHByb3AgbWV0aG9kIGNhbGwKK307CisKK2NvbnN0IHVpbnQ4X3QgZ19zQWx0VGFibGVfRGF0ZVtdID0geworICAgIDI1NSwgMjU1LCAyNTUsIDMsICAgOSwgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMiwgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAxLCAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorfTsKK3N0YXRpY19hc3NlcnQoRlhfQXJyYXlTaXplKGdfc0FsdFRhYmxlX0RhdGUpID09IEwnYScgLSBMJ0EnICsgMSwKKyAgICAgICAgICAgICAgIkludmFsaWQgZ19zQWx0VGFibGVfRGF0ZSBzaXplLiIpOworCitjb25zdCB1aW50OF90IGdfc0FsdFRhYmxlX1RpbWVbXSA9IHsKKyAgICAxNCwgIDI1NSwgMjU1LCAzLCAgIDksICAgMjU1LCAyNTUsIDE1LCAgMjU1LCAyNTUsIDI1NSwKKyAgICAyNTUsIDYsICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDcsICAgMjU1LCAyNTUsIDI1NSwKKyAgICAyNTUsIDI1NSwgMSwgICAxNywgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKK307CitzdGF0aWNfYXNzZXJ0KEZYX0FycmF5U2l6ZShnX3NBbHRUYWJsZV9UaW1lKSA9PSBMJ2EnIC0gTCdBJyArIDEsCisgICAgICAgICAgICAgICJJbnZhbGlkIGdfc0FsdFRhYmxlX1RpbWUgc2l6ZS4iKTsKKwordm9pZCBBbHRlcm5hdGVEYXRlVGltZVN5bWJvbHMoV2lkZVN0cmluZyYgd3NQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NBbHRTeW1ib2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcEFsdFRhYmxlKSB7CisgIGludDMyX3Qgbkxlbmd0aCA9IHdzUGF0dGVybi5HZXRMZW5ndGgoKTsKKyAgYm9vbCBiSW5Db25zdFJhbmdlID0gZmFsc2U7CisgIGJvb2wgYkVzY2FwZSA9IGZhbHNlOworICBpbnQzMl90IGkgPSAwOworICB3aGlsZSAoaSA8IG5MZW5ndGgpIHsKKyAgICB3Y2hhcl90IHdjID0gd3NQYXR0ZXJuW2ldOworICAgIGlmICh3YyA9PSBMJ1wnJykgeworICAgICAgYkluQ29uc3RSYW5nZSA9ICFiSW5Db25zdFJhbmdlOworICAgICAgaWYgKGJFc2NhcGUpIHsKKyAgICAgICAgaSsrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgd3NQYXR0ZXJuLkRlbGV0ZShpKTsKKyAgICAgICAgbkxlbmd0aC0tOworICAgICAgfQorICAgICAgYkVzY2FwZSA9ICFiRXNjYXBlOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICghYkluQ29uc3RSYW5nZSAmJiB3YyA+PSBMJ0EnICYmIHdjIDw9IEwnYScpIHsKKyAgICAgIHVpbnQ4X3QgbkFsdCA9IHBBbHRUYWJsZVt3YyAtIEwnQSddOworICAgICAgaWYgKG5BbHQgIT0gMjU1KQorICAgICAgICB3c1BhdHRlcm4uU2V0QXQoaSwgd3NBbHRTeW1ib2xzW25BbHRdKTsKKyAgICB9CisgICAgaSsrOworICAgIGJFc2NhcGUgPSBmYWxzZTsKKyAgfQorfQorCitib29sIFBhdHRlcm5TdHJpbmdUeXBlKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzelBhdHRlcm4sIHVpbnQzMl90JiBwYXR0ZXJuVHlwZSkgeworICBXaWRlU3RyaW5nIHdzUGF0dGVybiA9IFdpZGVTdHJpbmc6OkZyb21VVEY4KHN6UGF0dGVybik7CisgIGlmIChMImRhdGV0aW1lIiA9PSB3c1BhdHRlcm4uTGVmdCg4KSkgeworICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX0RBVEVUSU1FOworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChMImRhdGUiID09IHdzUGF0dGVybi5MZWZ0KDQpKSB7CisgICAgYXV0byBwb3MgPSB3c1BhdHRlcm4uRmluZChMInRpbWUiKTsKKyAgICBwYXR0ZXJuVHlwZSA9CisgICAgICAgIHBvcy5oYXNfdmFsdWUoKSAmJiBwb3MudmFsdWUoKSAhPSAwID8gWEZBX1ZUX0RBVEVUSU1FIDogWEZBX1ZUX0RBVEU7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKEwidGltZSIgPT0gd3NQYXR0ZXJuLkxlZnQoNCkpIHsKKyAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9USU1FOworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChMInRleHQiID09IHdzUGF0dGVybi5MZWZ0KDQpKSB7CisgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfVEVYVDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAoTCJudW0iID09IHdzUGF0dGVybi5MZWZ0KDMpKSB7CisgICAgaWYgKEwiaW50ZWdlciIgPT0gd3NQYXR0ZXJuLk1pZCg0LCA3KSkgeworICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfSU5URUdFUjsKKyAgICB9IGVsc2UgaWYgKEwiZGVjaW1hbCIgPT0gd3NQYXR0ZXJuLk1pZCg0LCA3KSkgeworICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfREVDSU1BTDsKKyAgICB9IGVsc2UgaWYgKEwiY3VycmVuY3kiID09IHdzUGF0dGVybi5NaWQoNCwgOCkpIHsKKyAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX0ZMT0FUOworICAgIH0gZWxzZSBpZiAoTCJwZXJjZW50IiA9PSB3c1BhdHRlcm4uTWlkKDQsIDcpKSB7CisgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9GTE9BVDsKKyAgICB9IGVsc2UgeworICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfRkxPQVQ7CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcGF0dGVyblR5cGUgPSBYRkFfVlRfTlVMTDsKKyAgd3NQYXR0ZXJuLk1ha2VMb3dlcigpOworICBjb25zdCB3Y2hhcl90KiBwRGF0YSA9IHdzUGF0dGVybi5jX3N0cigpOworICBpbnQzMl90IGlMZW5ndGggPSB3c1BhdHRlcm4uR2V0TGVuZ3RoKCk7CisgIGludDMyX3QgaUluZGV4ID0gMDsKKyAgYm9vbCBiU2luZ2xlUXVvdGF0aW9uID0gZmFsc2U7CisgIHdjaGFyX3QgcGF0dGVybkNoYXI7CisgIHdoaWxlIChpSW5kZXggPCBpTGVuZ3RoKSB7CisgICAgcGF0dGVybkNoYXIgPSBwRGF0YVtpSW5kZXhdOworICAgIGlmIChwYXR0ZXJuQ2hhciA9PSAweDI3KSB7CisgICAgICBiU2luZ2xlUXVvdGF0aW9uID0gIWJTaW5nbGVRdW90YXRpb247CisgICAgfSBlbHNlIGlmICghYlNpbmdsZVF1b3RhdGlvbiAmJgorICAgICAgICAgICAgICAgKHBhdHRlcm5DaGFyID09ICd5JyB8fCBwYXR0ZXJuQ2hhciA9PSAnaicpKSB7CisgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9EQVRFOworICAgICAgaUluZGV4Kys7CisgICAgICB3Y2hhcl90IHRpbWVQYXR0ZXJuQ2hhcjsKKyAgICAgIHdoaWxlIChpSW5kZXggPCBpTGVuZ3RoKSB7CisgICAgICAgIHRpbWVQYXR0ZXJuQ2hhciA9IHBEYXRhW2lJbmRleF07CisgICAgICAgIGlmICh0aW1lUGF0dGVybkNoYXIgPT0gMHgyNykgeworICAgICAgICAgIGJTaW5nbGVRdW90YXRpb24gPSAhYlNpbmdsZVF1b3RhdGlvbjsKKyAgICAgICAgfSBlbHNlIGlmICghYlNpbmdsZVF1b3RhdGlvbiAmJiB0aW1lUGF0dGVybkNoYXIgPT0gJ3QnKSB7CisgICAgICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfREFURVRJTUU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaUluZGV4Kys7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKCFiU2luZ2xlUXVvdGF0aW9uICYmCisgICAgICAgICAgICAgICAocGF0dGVybkNoYXIgPT0gJ2gnIHx8IHBhdHRlcm5DaGFyID09ICdrJykpIHsKKyAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX1RJTUU7CisgICAgICBicmVhazsKKyAgICB9IGVsc2UgaWYgKCFiU2luZ2xlUXVvdGF0aW9uICYmCisgICAgICAgICAgICAgICAocGF0dGVybkNoYXIgPT0gJ2EnIHx8IHBhdHRlcm5DaGFyID09ICd4JyB8fAorICAgICAgICAgICAgICAgIHBhdHRlcm5DaGFyID09ICdvJyB8fCBwYXR0ZXJuQ2hhciA9PSAnMCcpKSB7CisgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9URVhUOworICAgICAgaWYgKHBhdHRlcm5DaGFyID09ICd4JyB8fCBwYXR0ZXJuQ2hhciA9PSAnbycgfHwgcGF0dGVybkNoYXIgPT0gJzAnKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIWJTaW5nbGVRdW90YXRpb24gJiYKKyAgICAgICAgICAgICAgIChwYXR0ZXJuQ2hhciA9PSAneicgfHwgcGF0dGVybkNoYXIgPT0gJ3MnIHx8CisgICAgICAgICAgICAgICAgcGF0dGVybkNoYXIgPT0gJ2UnIHx8IHBhdHRlcm5DaGFyID09ICd2JyB8fAorICAgICAgICAgICAgICAgIHBhdHRlcm5DaGFyID09ICc4JyB8fCBwYXR0ZXJuQ2hhciA9PSAnLCcgfHwKKyAgICAgICAgICAgICAgICBwYXR0ZXJuQ2hhciA9PSAnLicgfHwgcGF0dGVybkNoYXIgPT0gJyQnKSkgeworICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfRkxPQVQ7CisgICAgICBpZiAocGF0dGVybkNoYXIgPT0gJ3YnIHx8IHBhdHRlcm5DaGFyID09ICc4JyB8fCBwYXR0ZXJuQ2hhciA9PSAnJCcpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlJbmRleCsrOworICB9CisgIGlmIChwYXR0ZXJuVHlwZSA9PSBYRkFfVlRfTlVMTCkgeworICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX1RFWFQgfCBYRkFfVlRfRkxPQVQ7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitDRlhKU0VfRm9ybUNhbGNDb250ZXh0KiBUb0pTQ29udGV4dChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9DbGFzcyogcENsYXNzKSB7CisgIENGWEpTRV9Ib3N0T2JqZWN0KiBwSG9zdE9iaiA9IHBWYWx1ZS0+VG9Ib3N0T2JqZWN0KHBDbGFzcyk7CisgIGlmICghcEhvc3RPYmogfHwgcEhvc3RPYmotPnR5cGUoKSAhPSBDRlhKU0VfSG9zdE9iamVjdDo6a0ZNMkpTKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZYSlNFX0Zvcm1DYWxjQ29udGV4dCo+KHBIb3N0T2JqKTsKK30KKworYm9vbCBJc1doaXRlc3BhY2UoY2hhciBjKSB7CisgIHJldHVybiBjID09IDB4MjAgfHwgYyA9PSAweDA5IHx8IGMgPT0gMHgwQiB8fCBjID09IDB4MEMgfHwgYyA9PSAweDBBIHx8CisgICAgICAgICBjID09IDB4MEQ7Cit9CisKK0lGWF9Mb2NhbGUqIExvY2FsZUZyb21TdHJpbmcoQ1hGQV9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Mb2NhbGVNZ3IqIHBNZ3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekxvY2FsZSkgeworICBpZiAoIXN6TG9jYWxlLklzRW1wdHkoKSkKKyAgICByZXR1cm4gcE1nci0+R2V0TG9jYWxlQnlOYW1lKFdpZGVTdHJpbmc6OkZyb21VVEY4KHN6TG9jYWxlKSk7CisKKyAgQ1hGQV9Ob2RlKiBwVGhpc05vZGUgPSBUb05vZGUocERvYy0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRUaGlzT2JqZWN0KCkpOworICBBU1NFUlQocFRoaXNOb2RlKTsKKyAgcmV0dXJuIHBUaGlzTm9kZS0+R2V0TG9jYWxlKCk7Cit9CisKK1dpZGVTdHJpbmcgRm9ybWF0RnJvbVN0cmluZyhJRlhfTG9jYWxlKiBwTG9jYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZvcm1hdCkgeworICBpZiAoIXN6Rm9ybWF0LklzRW1wdHkoKSkKKyAgICByZXR1cm4gV2lkZVN0cmluZzo6RnJvbVVURjgoc3pGb3JtYXQpOworCisgIHJldHVybiBwTG9jYWxlLT5HZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHQpOworfQorCitGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIFN1YkNhdGVnb3J5RnJvbUludChpbnQzMl90IGlTdHlsZSkgeworICBzd2l0Y2ggKGlTdHlsZSkgeworICAgIGNhc2UgMToKKyAgICAgIHJldHVybiBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0OworICAgIGNhc2UgMzoKKyAgICAgIHJldHVybiBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0xvbmc7CisgICAgY2FzZSA0OgorICAgICAgcmV0dXJuIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbDsKKyAgICBjYXNlIDA6CisgICAgY2FzZSAyOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW07CisgIH0KK30KKworYm9vbCBJc1BhcnRPZk51bWJlcihjaGFyIGNoKSB7CisgIHJldHVybiBzdGQ6OmlzZGlnaXQoY2gpIHx8IGNoID09ICctJyB8fCBjaCA9PSAnLic7Cit9CisKK2Jvb2wgSXNQYXJ0T2ZOdW1iZXJXKHdjaGFyX3QgY2gpIHsKKyAgcmV0dXJuIHN0ZDo6aXN3ZGlnaXQoY2gpIHx8IGNoID09IEwnLScgfHwgY2ggPT0gTCcuJzsKK30KKworQnl0ZVN0cmluZyBHVUlEU3RyaW5nKGJvb2wgYlNlcGFyYXRvcikgeworICB1aW50OF90IGRhdGFbMTZdOworICBGWF9SYW5kb21fR2VuZXJhdGVNVChyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oZGF0YSksIDQpOworICBkYXRhWzZdID0gKGRhdGFbNl0gJiAweDBGKSB8IDB4NDA7CisKKyAgQnl0ZVN0cmluZyBic1N0cjsKKyAgY2hhciogcEJ1ZiA9IGJzU3RyLkdldEJ1ZmZlcig0MCk7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDE2OyArK2ksIHBCdWYgKz0gMikgeworICAgIGlmIChiU2VwYXJhdG9yICYmIChpID09IDQgfHwgaSA9PSA2IHx8IGkgPT0gOCB8fCBpID09IDEwKSkKKyAgICAgICpwQnVmKysgPSBMJy0nOworCisgICAgRlhTWVNfSW50VG9Ud29IZXhDaGFycyhkYXRhW2ldLCBwQnVmKTsKKyAgfQorICBic1N0ci5SZWxlYXNlQnVmZmVyKGJTZXBhcmF0b3IgPyAzNiA6IDMyKTsKKyAgcmV0dXJuIGJzU3RyOworfQorCitkb3VibGUgQnl0ZVN0cmluZ1RvRG91YmxlKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzelN0cmluZ1ZhbCkgeworICBXaWRlU3RyaW5nIHdzVmFsdWUgPSBXaWRlU3RyaW5nOjpGcm9tVVRGOChzelN0cmluZ1ZhbCk7CisgIHdzVmFsdWUuVHJpbSgpOworCisgIGludDMyX3QgY2MgPSAwOworICBib29sIGJOZWdhdGl2ZSA9IGZhbHNlOworCisgIGNvbnN0IHdjaGFyX3QqIHN0ciA9IHdzVmFsdWUuY19zdHIoKTsKKyAgaW50MzJfdCBsZW4gPSB3c1ZhbHVlLkdldExlbmd0aCgpOworICBpZiAoc3RyWzBdID09ICcrJykgeworICAgIGNjKys7CisgIH0gZWxzZSBpZiAoc3RyWzBdID09ICctJykgeworICAgIGJOZWdhdGl2ZSA9IHRydWU7CisgICAgY2MrKzsKKyAgfQorCisgIGludDMyX3QgbkludGVncmFsTGVuID0gMDsKKyAgaW50NjRfdCBuSW50ZWdyYWwgPSAwOworICB3aGlsZSAoY2MgPCBsZW4pIHsKKyAgICBpZiAoc3RyW2NjXSA9PSAnLicgfHwgc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScgfHwKKyAgICAgICAgbkludGVncmFsTGVuID4gMTcpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgbkludGVncmFsID0gbkludGVncmFsICogMTAgKyBzdHJbY2NdIC0gJzAnOworICAgIGNjKys7CisgICAgbkludGVncmFsTGVuKys7CisgIH0KKyAgbkludGVncmFsID0gYk5lZ2F0aXZlID8gLW5JbnRlZ3JhbCA6IG5JbnRlZ3JhbDsKKworICBpbnQzMl90IHNjYWxlID0gMDsKKyAgZG91YmxlIGZyYWN0aW9uID0gMC4wOworICB1aW50MzJfdCBkd0ZyYWN0aW9uYWwgPSAwOworICBpZiAoY2MgPCBsZW4gJiYgc3RyW2NjXSA9PSAnLicpIHsKKyAgICBjYysrOworICAgIHdoaWxlIChjYyA8IGxlbikgeworICAgICAgZnJhY3Rpb24gKz0gWEZBX0dldEZyYWN0aW9uYWxTY2FsZShzY2FsZSkgKiAoc3RyW2NjXSAtICcwJyk7CisgICAgICBzY2FsZSsrOworICAgICAgY2MrKzsKKyAgICAgIGlmIChjYyA9PSBsZW4pCisgICAgICAgIGJyZWFrOworICAgICAgaWYgKHNjYWxlID09IFhGQV9HZXRNYXhGcmFjdGlvbmFsU2NhbGUoKSB8fCBzdHJbY2NdID09ICdFJyB8fAorICAgICAgICAgIHN0cltjY10gPT0gJ2UnKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGR3RnJhY3Rpb25hbCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihmcmFjdGlvbiAqIDQyOTQ5NjcyOTYuMCk7CisgIH0KKworICBpbnQzMl90IG5FeHBvbmVudCA9IDA7CisgIGJvb2wgYkV4cFNpZ24gPSBmYWxzZTsKKyAgaWYgKGNjIDwgbGVuICYmIChzdHJbY2NdID09ICdFJyB8fCBzdHJbY2NdID09ICdlJykpIHsKKyAgICBjYysrOworICAgIGlmIChjYyA8IGxlbikgeworICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7CisgICAgICAgIGNjKys7CisgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJy0nKSB7CisgICAgICAgIGJFeHBTaWduID0gdHJ1ZTsKKyAgICAgICAgY2MrKzsKKyAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKGNjIDwgbGVuKSB7CisgICAgICBpZiAoc3RyW2NjXSA9PSAnLicgfHwgIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKQorICAgICAgICByZXR1cm4gMDsKKworICAgICAgbkV4cG9uZW50ID0gbkV4cG9uZW50ICogMTAgKyBzdHJbY2NdIC0gJzAnOworICAgICAgY2MrKzsKKyAgICB9CisgICAgbkV4cG9uZW50ID0gYkV4cFNpZ24gPyAtbkV4cG9uZW50IDogbkV4cG9uZW50OworICB9CisKKyAgZG91YmxlIGRWYWx1ZSA9IGR3RnJhY3Rpb25hbCAvIDQyOTQ5NjcyOTYuMDsKKyAgZFZhbHVlID0gbkludGVncmFsICsgKG5JbnRlZ3JhbCA+PSAwID8gZFZhbHVlIDogLWRWYWx1ZSk7CisgIGlmIChuRXhwb25lbnQgIT0gMCkKKyAgICBkVmFsdWUgKj0gRlhTWVNfcG93KDEwLCBzdGF0aWNfY2FzdDxmbG9hdD4obkV4cG9uZW50KSk7CisKKyAgcmV0dXJuIGRWYWx1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpBYnMoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAxKSB7CisgICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIkFicyIpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IGFyZ3MuR2V0VmFsdWUoMCk7CisgIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgYXJnT25lLmdldCgpKSkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgIHJldHVybjsKKyAgfQorCisgIGRvdWJsZSBkVmFsdWUgPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBhcmdPbmUuZ2V0KCkpOworICBpZiAoZFZhbHVlIDwgMCkKKyAgICBkVmFsdWUgPSAtZFZhbHVlOworCisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0RG91YmxlKGRWYWx1ZSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpBdmcoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOworICBpZiAoYXJnYyA8IDEpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICByZXR1cm47CisgIH0KKworICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPkdldFNjcmlwdFJ1bnRpbWUoKTsKKyAgdWludDMyX3QgdUNvdW50ID0gMDsKKyAgZG91YmxlIGRTdW0gPSAwLjA7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1ZhbHVlID0gYXJncy5HZXRWYWx1ZShpKTsKKyAgICBpZiAoYXJnVmFsdWUtPklzTnVsbCgpKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoIWFyZ1ZhbHVlLT5Jc0FycmF5KCkpIHsKKyAgICAgIGRTdW0gKz0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnVmFsdWUuZ2V0KCkpOworICAgICAgdUNvdW50Kys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBhdXRvIGxlbmd0aFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICAgIGFyZ1ZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eSgibGVuZ3RoIiwgbGVuZ3RoVmFsdWUuZ2V0KCkpOworICAgIGludDMyX3QgaUxlbmd0aCA9IGxlbmd0aFZhbHVlLT5Ub0ludGVnZXIoKTsKKworICAgIGlmIChpTGVuZ3RoID4gMikgeworICAgICAgYXV0byBwcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICAgICAgYXJnVmFsdWUtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMSwgcHJvcGVydHlWYWx1ZS5nZXQoKSk7CisKKyAgICAgIGF1dG8ganNPYmplY3RWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICAgIGlmIChwcm9wZXJ0eVZhbHVlLT5Jc051bGwoKSkgeworICAgICAgICBmb3IgKGludDMyX3QgaiA9IDI7IGogPCBpTGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICBhcmdWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeChqLCBqc09iamVjdFZhbHVlLmdldCgpKTsKKyAgICAgICAgICBhdXRvIGRlZmF1bHRQcm9wVmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgICAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzT2JqZWN0VmFsdWUuZ2V0KCksIGRlZmF1bHRQcm9wVmFsdWUuZ2V0KCkpOworICAgICAgICAgIGlmIChkZWZhdWx0UHJvcFZhbHVlLT5Jc051bGwoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgZFN1bSArPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBkZWZhdWx0UHJvcFZhbHVlLmdldCgpKTsKKyAgICAgICAgICB1Q291bnQrKzsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGogPSAyOyBqIDwgaUxlbmd0aDsgaisrKSB7CisgICAgICAgICAgYXJnVmFsdWUtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoaiwganNPYmplY3RWYWx1ZS5nZXQoKSk7CisgICAgICAgICAgYXV0byBuZXdQcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICAgICAgICAgIGpzT2JqZWN0VmFsdWUtPkdldE9iamVjdFByb3BlcnR5KAorICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLT5Ub1N0cmluZygpLkFzU3RyaW5nVmlldygpLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKKyAgICAgICAgICBpZiAobmV3UHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIGRTdW0gKz0gVmFsdWVUb0RvdWJsZShwVGhpcywgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7CisgICAgICAgICAgdUNvdW50Kys7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKHVDb3VudCA9PSAwKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXREb3VibGUoZFN1bSAvIHVDb3VudCk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpDZWlsKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAxKSB7CisgICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIkNlaWwiKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdWYWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKKyAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdWYWx1ZS5nZXQoKSkpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICByZXR1cm47CisgIH0KKworICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEZsb2F0KGNlaWwoVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdWYWx1ZS5nZXQoKSkpKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkNvdW50KENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOworICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOworICBpbnQzMl90IGlDb3VudCA9IDA7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFyZ3MuR2V0TGVuZ3RoKCk7IGkrKykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1ZhbHVlID0gYXJncy5HZXRWYWx1ZShpKTsKKyAgICBpZiAoYXJnVmFsdWUtPklzTnVsbCgpKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoYXJnVmFsdWUtPklzQXJyYXkoKSkgeworICAgICAgYXV0byBsZW5ndGhWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICAgIGFyZ1ZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eSgibGVuZ3RoIiwgbGVuZ3RoVmFsdWUuZ2V0KCkpOworCisgICAgICBpbnQzMl90IGlMZW5ndGggPSBsZW5ndGhWYWx1ZS0+VG9JbnRlZ2VyKCk7CisgICAgICBpZiAoaUxlbmd0aCA8PSAyKSB7CisgICAgICAgIHBDb250ZXh0LT5UaHJvd0FyZ3VtZW50TWlzbWF0Y2hFeGNlcHRpb24oKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBhdXRvIHByb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgICAgICBhdXRvIGpzT2JqZWN0VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgICAgICBhdXRvIG5ld1Byb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgICAgICBhcmdWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgxLCBwcm9wZXJ0eVZhbHVlLmdldCgpKTsKKyAgICAgIGFyZ1ZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KDIsIGpzT2JqZWN0VmFsdWUuZ2V0KCkpOworICAgICAgaWYgKHByb3BlcnR5VmFsdWUtPklzTnVsbCgpKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBqID0gMjsgaiA8IGlMZW5ndGg7IGorKykgeworICAgICAgICAgIGFyZ1ZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KGosIGpzT2JqZWN0VmFsdWUuZ2V0KCkpOworICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc09iamVjdFZhbHVlLmdldCgpLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKKyAgICAgICAgICBpZiAoIW5ld1Byb3BlcnR5VmFsdWUtPklzTnVsbCgpKQorICAgICAgICAgICAgaUNvdW50Kys7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaW50MzJfdCBqID0gMjsgaiA8IGlMZW5ndGg7IGorKykgeworICAgICAgICAgIGFyZ1ZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KGosIGpzT2JqZWN0VmFsdWUuZ2V0KCkpOworICAgICAgICAgIGpzT2JqZWN0VmFsdWUtPkdldE9iamVjdFByb3BlcnR5KAorICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLT5Ub1N0cmluZygpLkFzU3RyaW5nVmlldygpLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKKyAgICAgICAgICBpQ291bnQgKz0gbmV3UHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkgPyAwIDogMTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXJnVmFsdWUtPklzT2JqZWN0KCkpIHsKKyAgICAgIGF1dG8gbmV3UHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShhcmdWYWx1ZS5nZXQoKSwgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7CisgICAgICBpZiAoIW5ld1Byb3BlcnR5VmFsdWUtPklzTnVsbCgpKQorICAgICAgICBpQ291bnQrKzsKKyAgICB9IGVsc2UgeworICAgICAgaUNvdW50Kys7CisgICAgfQorICB9CisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcihpQ291bnQpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6Rmxvb3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMSkgeworICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJGbG9vciIpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1ZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICBpZiAoVmFsdWVJc051bGwocFRoaXMsIGFyZ1ZhbHVlLmdldCgpKSkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgIHJldHVybjsKKyAgfQorCisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0RmxvYXQoZmxvb3IoVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdWYWx1ZS5nZXQoKSkpKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6Ok1heChDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOworICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOworICB1aW50MzJfdCB1Q291bnQgPSAwOworICBkb3VibGUgZE1heFZhbHVlID0gMC4wOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcmdzLkdldExlbmd0aCgpOyBpKyspIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdWYWx1ZSA9IGFyZ3MuR2V0VmFsdWUoaSk7CisgICAgaWYgKGFyZ1ZhbHVlLT5Jc051bGwoKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKGFyZ1ZhbHVlLT5Jc0FycmF5KCkpIHsKKyAgICAgIGF1dG8gbGVuZ3RoVmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgICAgICBhcmdWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHkoImxlbmd0aCIsIGxlbmd0aFZhbHVlLmdldCgpKTsKKyAgICAgIGludDMyX3QgaUxlbmd0aCA9IGxlbmd0aFZhbHVlLT5Ub0ludGVnZXIoKTsKKyAgICAgIGlmIChpTGVuZ3RoIDw9IDIpIHsKKyAgICAgICAgcENvbnRleHQtPlRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGF1dG8gcHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICAgIGF1dG8ganNPYmplY3RWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICAgIGF1dG8gbmV3UHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICAgIGFyZ1ZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KDEsIHByb3BlcnR5VmFsdWUuZ2V0KCkpOworICAgICAgYXJnVmFsdWUtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMiwganNPYmplY3RWYWx1ZS5nZXQoKSk7CisgICAgICBpZiAocHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkpIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGogPSAyOyBqIDwgaUxlbmd0aDsgaisrKSB7CisgICAgICAgICAgYXJnVmFsdWUtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoaiwganNPYmplY3RWYWx1ZS5nZXQoKSk7CisgICAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzT2JqZWN0VmFsdWUuZ2V0KCksIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOworICAgICAgICAgIGlmIChuZXdQcm9wZXJ0eVZhbHVlLT5Jc051bGwoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgdUNvdW50Kys7CisgICAgICAgICAgZG91YmxlIGRWYWx1ZSA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOworICAgICAgICAgIGRNYXhWYWx1ZSA9ICh1Q291bnQgPT0gMSkgPyBkVmFsdWUgOiBzdGQ6Om1heChkTWF4VmFsdWUsIGRWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoaW50MzJfdCBqID0gMjsgaiA8IGlMZW5ndGg7IGorKykgeworICAgICAgICAgIGFyZ1ZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KGosIGpzT2JqZWN0VmFsdWUuZ2V0KCkpOworICAgICAgICAgIGpzT2JqZWN0VmFsdWUtPkdldE9iamVjdFByb3BlcnR5KAorICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLT5Ub1N0cmluZygpLkFzU3RyaW5nVmlldygpLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKKyAgICAgICAgICBpZiAobmV3UHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIHVDb3VudCsrOworICAgICAgICAgIGRvdWJsZSBkVmFsdWUgPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKKyAgICAgICAgICBkTWF4VmFsdWUgPSAodUNvdW50ID09IDEpID8gZFZhbHVlIDogc3RkOjptYXgoZE1heFZhbHVlLCBkVmFsdWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChhcmdWYWx1ZS0+SXNPYmplY3QoKSkgeworICAgICAgYXV0byBuZXdQcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGFyZ1ZhbHVlLmdldCgpLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKKyAgICAgIGlmIChuZXdQcm9wZXJ0eVZhbHVlLT5Jc051bGwoKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIHVDb3VudCsrOworICAgICAgZG91YmxlIGRWYWx1ZSA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOworICAgICAgZE1heFZhbHVlID0gKHVDb3VudCA9PSAxKSA/IGRWYWx1ZSA6IHN0ZDo6bWF4KGRNYXhWYWx1ZSwgZFZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgdUNvdW50Kys7CisgICAgICBkb3VibGUgZFZhbHVlID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnVmFsdWUuZ2V0KCkpOworICAgICAgZE1heFZhbHVlID0gKHVDb3VudCA9PSAxKSA/IGRWYWx1ZSA6IHN0ZDo6bWF4KGRNYXhWYWx1ZSwgZFZhbHVlKTsKKyAgICB9CisgIH0KKyAgaWYgKHVDb3VudCA9PSAwKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXREb3VibGUoZE1heFZhbHVlKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6Ok1pbihDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOworICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOworICB1aW50MzJfdCB1Q291bnQgPSAwOworICBkb3VibGUgZE1pblZhbHVlID0gMC4wOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcmdzLkdldExlbmd0aCgpOyBpKyspIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdWYWx1ZSA9IGFyZ3MuR2V0VmFsdWUoaSk7CisgICAgaWYgKGFyZ1ZhbHVlLT5Jc051bGwoKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKGFyZ1ZhbHVlLT5Jc0FycmF5KCkpIHsKKyAgICAgIGF1dG8gbGVuZ3RoVmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgICAgICBhcmdWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHkoImxlbmd0aCIsIGxlbmd0aFZhbHVlLmdldCgpKTsKKyAgICAgIGludDMyX3QgaUxlbmd0aCA9IGxlbmd0aFZhbHVlLT5Ub0ludGVnZXIoKTsKKyAgICAgIGlmIChpTGVuZ3RoIDw9IDIpIHsKKyAgICAgICAgcENvbnRleHQtPlRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIGF1dG8gcHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICAgIGF1dG8ganNPYmplY3RWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICAgIGF1dG8gbmV3UHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICAgIGFyZ1ZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KDEsIHByb3BlcnR5VmFsdWUuZ2V0KCkpOworICAgICAgYXJnVmFsdWUtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMiwganNPYmplY3RWYWx1ZS5nZXQoKSk7CisgICAgICBpZiAocHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkpIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGogPSAyOyBqIDwgaUxlbmd0aDsgaisrKSB7CisgICAgICAgICAgYXJnVmFsdWUtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoaiwganNPYmplY3RWYWx1ZS5nZXQoKSk7CisgICAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzT2JqZWN0VmFsdWUuZ2V0KCksIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOworICAgICAgICAgIGlmIChuZXdQcm9wZXJ0eVZhbHVlLT5Jc051bGwoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgdUNvdW50Kys7CisgICAgICAgICAgZG91YmxlIGRWYWx1ZSA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOworICAgICAgICAgIGRNaW5WYWx1ZSA9IHVDb3VudCA9PSAxID8gZFZhbHVlIDogc3RkOjptaW4oZE1pblZhbHVlLCBkVmFsdWUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGludDMyX3QgaiA9IDI7IGogPCBpTGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICBhcmdWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeChqLCBqc09iamVjdFZhbHVlLmdldCgpKTsKKyAgICAgICAgICBqc09iamVjdFZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZS0+VG9TdHJpbmcoKS5Bc1N0cmluZ1ZpZXcoKSwgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7CisgICAgICAgICAgaWYgKG5ld1Byb3BlcnR5VmFsdWUtPklzTnVsbCgpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICB1Q291bnQrKzsKKyAgICAgICAgICBkb3VibGUgZFZhbHVlID0gVmFsdWVUb0RvdWJsZShwVGhpcywgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7CisgICAgICAgICAgZE1pblZhbHVlID0gdUNvdW50ID09IDEgPyBkVmFsdWUgOiBzdGQ6Om1pbihkTWluVmFsdWUsIGRWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGFyZ1ZhbHVlLT5Jc09iamVjdCgpKSB7CisgICAgICBhdXRvIG5ld1Byb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnVmFsdWUuZ2V0KCksIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOworICAgICAgaWYgKG5ld1Byb3BlcnR5VmFsdWUtPklzTnVsbCgpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgdUNvdW50Kys7CisgICAgICBkb3VibGUgZFZhbHVlID0gVmFsdWVUb0RvdWJsZShwVGhpcywgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7CisgICAgICBkTWluVmFsdWUgPSB1Q291bnQgPT0gMSA/IGRWYWx1ZSA6IHN0ZDo6bWluKGRNaW5WYWx1ZSwgZFZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgdUNvdW50Kys7CisgICAgICBkb3VibGUgZFZhbHVlID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnVmFsdWUuZ2V0KCkpOworICAgICAgZE1pblZhbHVlID0gdUNvdW50ID09IDEgPyBkVmFsdWUgOiBzdGQ6Om1pbihkTWluVmFsdWUsIGRWYWx1ZSk7CisgICAgfQorICB9CisgIGlmICh1Q291bnQgPT0gMCkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgIHJldHVybjsKKyAgfQorCisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0RG91YmxlKGRNaW5WYWx1ZSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpNb2QoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBDRlhKU0VfRm9ybUNhbGNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMikgeworICAgIHBDb250ZXh0LT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIk1vZCIpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IGFyZ3MuR2V0VmFsdWUoMCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1R3byA9IGFyZ3MuR2V0VmFsdWUoMSk7CisgIGlmIChhcmdPbmUtPklzTnVsbCgpIHx8IGFyZ1R3by0+SXNOdWxsKCkpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICByZXR1cm47CisgIH0KKworICBib29sIGFyZ09uZVJlc3VsdDsKKyAgZG91YmxlIGREaXZpZGVuZCA9IEV4dHJhY3REb3VibGUocFRoaXMsIGFyZ09uZS5nZXQoKSwgJmFyZ09uZVJlc3VsdCk7CisgIGJvb2wgYXJnVHdvUmVzdWx0OworICBkb3VibGUgZERpdmlzb3IgPSBFeHRyYWN0RG91YmxlKHBUaGlzLCBhcmdUd28uZ2V0KCksICZhcmdUd29SZXN1bHQpOworICBpZiAoIWFyZ09uZVJlc3VsdCB8fCAhYXJnVHdvUmVzdWx0KSB7CisgICAgcENvbnRleHQtPlRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChkRGl2aXNvciA9PSAwLjApIHsKKyAgICBwQ29udGV4dC0+VGhyb3dEaXZpZGVCeVplcm9FeGNlcHRpb24oKTsKKyAgICByZXR1cm47CisgIH0KKworICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldERvdWJsZShkRGl2aWRlbmQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkRGl2aXNvciAqIChpbnQzMl90KShkRGl2aWRlbmQgLyBkRGl2aXNvcikpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6Um91bmQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dCogcENvbnRleHQgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cik7CisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7CisgIGlmIChhcmdjIDwgMSB8fCBhcmdjID4gMikgeworICAgIHBDb250ZXh0LT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIlJvdW5kIik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gYXJncy5HZXRWYWx1ZSgwKTsKKyAgaWYgKGFyZ09uZS0+SXNOdWxsKCkpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICByZXR1cm47CisgIH0KKworICBib29sIGRWYWx1ZVJldDsKKyAgZG91YmxlIGRWYWx1ZSA9IEV4dHJhY3REb3VibGUocFRoaXMsIGFyZ09uZS5nZXQoKSwgJmRWYWx1ZVJldCk7CisgIGlmICghZFZhbHVlUmV0KSB7CisgICAgcENvbnRleHQtPlRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorCisgIHVpbnQ4X3QgdVByZWNpc2lvbiA9IDA7CisgIGlmIChhcmdjID4gMSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1R3byA9IGFyZ3MuR2V0VmFsdWUoMSk7CisgICAgaWYgKGFyZ1R3by0+SXNOdWxsKCkpIHsKKyAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZFByZWNpc2lvblJldDsKKyAgICBkb3VibGUgZFByZWNpc2lvbiA9IEV4dHJhY3REb3VibGUocFRoaXMsIGFyZ1R3by5nZXQoKSwgJmRQcmVjaXNpb25SZXQpOworICAgIGlmICghZFByZWNpc2lvblJldCkgeworICAgICAgcENvbnRleHQtPlRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVQcmVjaXNpb24gPSBzdGF0aWNfY2FzdDx1aW50OF90PihwZGZpdW06OmNsYW1wKGRQcmVjaXNpb24sIDAuMCwgMTIuMCkpOworICB9CisKKyAgQ0ZYX0RlY2ltYWwgZGVjaW1hbFZhbHVlKHN0YXRpY19jYXN0PGZsb2F0PihkVmFsdWUpLCB1UHJlY2lzaW9uKTsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXREb3VibGUoZGVjaW1hbFZhbHVlKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlN1bShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7CisgIGlmIChhcmdjID09IDApIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICByZXR1cm47CisgIH0KKworICBDRlhKU0VfRm9ybUNhbGNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKKyAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsKKyAgdWludDMyX3QgdUNvdW50ID0gMDsKKyAgZG91YmxlIGRTdW0gPSAwLjA7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1ZhbHVlID0gYXJncy5HZXRWYWx1ZShpKTsKKyAgICBpZiAoYXJnVmFsdWUtPklzTnVsbCgpKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoYXJnVmFsdWUtPklzQXJyYXkoKSkgeworICAgICAgYXV0byBsZW5ndGhWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICAgIGFyZ1ZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eSgibGVuZ3RoIiwgbGVuZ3RoVmFsdWUuZ2V0KCkpOworICAgICAgaW50MzJfdCBpTGVuZ3RoID0gbGVuZ3RoVmFsdWUtPlRvSW50ZWdlcigpOworICAgICAgaWYgKGlMZW5ndGggPD0gMikgeworICAgICAgICBwQ29udGV4dC0+VGhyb3dBcmd1bWVudE1pc21hdGNoRXhjZXB0aW9uKCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKworICAgICAgYXV0byBwcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICAgICAgYXJnVmFsdWUtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMSwgcHJvcGVydHlWYWx1ZS5nZXQoKSk7CisgICAgICBhdXRvIGpzT2JqZWN0VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgICAgICBhdXRvIG5ld1Byb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgICAgICBpZiAocHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkpIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGogPSAyOyBqIDwgaUxlbmd0aDsgaisrKSB7CisgICAgICAgICAgYXJnVmFsdWUtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoaiwganNPYmplY3RWYWx1ZS5nZXQoKSk7CisgICAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzT2JqZWN0VmFsdWUuZ2V0KCksIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOworICAgICAgICAgIGlmIChuZXdQcm9wZXJ0eVZhbHVlLT5Jc051bGwoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgZFN1bSArPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBqc09iamVjdFZhbHVlLmdldCgpKTsKKyAgICAgICAgICB1Q291bnQrKzsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGogPSAyOyBqIDwgaUxlbmd0aDsgaisrKSB7CisgICAgICAgICAgYXJnVmFsdWUtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoaiwganNPYmplY3RWYWx1ZS5nZXQoKSk7CisgICAgICAgICAganNPYmplY3RWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHkoCisgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUtPlRvU3RyaW5nKCkuQXNTdHJpbmdWaWV3KCksIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOworICAgICAgICAgIGlmIChuZXdQcm9wZXJ0eVZhbHVlLT5Jc051bGwoKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgZFN1bSArPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKKyAgICAgICAgICB1Q291bnQrKzsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoYXJnVmFsdWUtPklzT2JqZWN0KCkpIHsKKyAgICAgIGF1dG8gbmV3UHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShhcmdWYWx1ZS5nZXQoKSwgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7CisgICAgICBpZiAobmV3UHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBkU3VtICs9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ1ZhbHVlLmdldCgpKTsKKyAgICAgIHVDb3VudCsrOworICAgIH0gZWxzZSB7CisgICAgICBkU3VtICs9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ1ZhbHVlLmdldCgpKTsKKyAgICAgIHVDb3VudCsrOworICAgIH0KKyAgfQorICBpZiAodUNvdW50ID09IDApIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICByZXR1cm47CisgIH0KKworICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldERvdWJsZShkU3VtKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkRhdGUoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDApIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiRGF0ZSIpOworICAgIHJldHVybjsKKyAgfQorCisgIHRpbWVfdCBjdXJyZW50VGltZTsKKyAgdGltZSgmY3VycmVudFRpbWUpOworICBzdHJ1Y3QgdG0qIHBUbVN0cnVjdCA9IGdtdGltZSgmY3VycmVudFRpbWUpOworCisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcihEYXRlU3RyaW5nMk51bSgKKyAgICAgIEJ5dGVTdHJpbmc6OkZvcm1hdCgiJWQlMDJkJTAyZCIsIHBUbVN0cnVjdC0+dG1feWVhciArIDE5MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgcFRtU3RydWN0LT50bV9tb24gKyAxLCBwVG1TdHJ1Y3QtPnRtX21kYXkpCisgICAgICAgICAgLkFzU3RyaW5nVmlldygpKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpEYXRlMk51bShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOworICBpZiAoYXJnYyA8IDEgfHwgYXJnYyA+IDMpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiRGF0ZTJOdW0iKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBkYXRlVmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgZGF0ZVZhbHVlLmdldCgpKSkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgIHJldHVybjsKKyAgfQorCisgIEJ5dGVTdHJpbmcgZGF0ZVN0cmluZyA9IFZhbHVlVG9VVEY4U3RyaW5nKGRhdGVWYWx1ZS5nZXQoKSk7CisgIEJ5dGVTdHJpbmcgZm9ybWF0U3RyaW5nOworICBpZiAoYXJnYyA+IDEpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBmb3JtYXRWYWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKKyAgICBpZiAoVmFsdWVJc051bGwocFRoaXMsIGZvcm1hdFZhbHVlLmdldCgpKSkgeworICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGZvcm1hdFN0cmluZyA9IFZhbHVlVG9VVEY4U3RyaW5nKGZvcm1hdFZhbHVlLmdldCgpKTsKKyAgfQorCisgIEJ5dGVTdHJpbmcgbG9jYWxTdHJpbmc7CisgIGlmIChhcmdjID4gMikgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGxvY2FsVmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMik7CisgICAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBsb2NhbFZhbHVlLmdldCgpKSkgeworICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGxvY2FsU3RyaW5nID0gVmFsdWVUb1VURjhTdHJpbmcobG9jYWxWYWx1ZS5nZXQoKSk7CisgIH0KKworICBCeXRlU3RyaW5nIHN6SXNvRGF0ZVN0cmluZyA9CisgICAgICBMb2NhbDJJc29EYXRlKHBUaGlzLCBkYXRlU3RyaW5nLkFzU3RyaW5nVmlldygpLAorICAgICAgICAgICAgICAgICAgICBmb3JtYXRTdHJpbmcuQXNTdHJpbmdWaWV3KCksIGxvY2FsU3RyaW5nLkFzU3RyaW5nVmlldygpKTsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKAorICAgICAgRGF0ZVN0cmluZzJOdW0oc3pJc29EYXRlU3RyaW5nLkFzU3RyaW5nVmlldygpKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpEYXRlRm10KENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOworICBpZiAoYXJnYyA+IDIpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiRGF0ZTJOdW0iKTsKKyAgICByZXR1cm47CisgIH0KKworICBpbnQzMl90IGlTdHlsZSA9IDA7CisgIGlmIChhcmdjID4gMCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1N0eWxlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICAgIGlmIChhcmdTdHlsZS0+SXNOdWxsKCkpIHsKKyAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlTdHlsZSA9IChpbnQzMl90KVZhbHVlVG9GbG9hdChwVGhpcywgYXJnU3R5bGUuZ2V0KCkpOworICAgIGlmIChpU3R5bGUgPCAwIHx8IGlTdHlsZSA+IDQpCisgICAgICBpU3R5bGUgPSAwOworICB9CisKKyAgQnl0ZVN0cmluZyBzekxvY2FsOworICBpZiAoYXJnYyA+IDEpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdMb2NhbCA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKKyAgICBpZiAoYXJnTG9jYWwtPklzTnVsbCgpKSB7CisgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3pMb2NhbCA9IFZhbHVlVG9VVEY4U3RyaW5nKGFyZ0xvY2FsLmdldCgpKTsKKyAgfQorCisgIEJ5dGVTdHJpbmcgZm9ybWF0U3RyID0KKyAgICAgIEdldFN0YW5kYXJkRGF0ZUZvcm1hdChwVGhpcywgaVN0eWxlLCBzekxvY2FsLkFzU3RyaW5nVmlldygpKTsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoZm9ybWF0U3RyLkFzU3RyaW5nVmlldygpKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6Oklzb0RhdGUyTnVtKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDEpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cikKKyAgICAgICAgLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIklzb0RhdGUyTnVtIik7CisgICAgcmV0dXJuOworICB9CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKKyAgaWYgKGFyZ09uZS0+SXNOdWxsKCkpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICByZXR1cm47CisgIH0KKyAgQnl0ZVN0cmluZyBzekFyZ1N0cmluZyA9IFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZS5nZXQoKSk7CisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcihEYXRlU3RyaW5nMk51bShzekFyZ1N0cmluZy5Bc1N0cmluZ1ZpZXcoKSkpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6SXNvVGltZTJOdW0oQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dCogcENvbnRleHQgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cik7CisgIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDEpIHsKKyAgICBwQ29udGV4dC0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJJc29UaW1lMk51bSIpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKKyAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdPbmUuZ2V0KCkpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOworICBDWEZBX0xvY2FsZU1nciogcE1nciA9IHBEb2MtPkdldExvY2FsTWdyKCk7CisgIEJ5dGVTdHJpbmcgc3pBcmdTdHJpbmcgPSBWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUuZ2V0KCkpOworICBhdXRvIHBvcyA9IHN6QXJnU3RyaW5nLkZpbmQoJ1QnLCAwKTsKKyAgaWYgKCFwb3MuaGFzX3ZhbHVlKCkgfHwgcG9zLnZhbHVlKCkgPT0gc3pBcmdTdHJpbmcuR2V0TGVuZ3RoKCkgLSAxKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKDApOworICAgIHJldHVybjsKKyAgfQorICBzekFyZ1N0cmluZyA9IHN6QXJnU3RyaW5nLlJpZ2h0KHN6QXJnU3RyaW5nLkdldExlbmd0aCgpIC0gKHBvcy52YWx1ZSgpICsgMSkpOworCisgIENYRkFfTG9jYWxlVmFsdWUgdGltZVZhbHVlKAorICAgICAgWEZBX1ZUX1RJTUUsIFdpZGVTdHJpbmc6OkZyb21VVEY4KHN6QXJnU3RyaW5nLkFzU3RyaW5nVmlldygpKSwgcE1ncik7CisgIGlmICghdGltZVZhbHVlLklzVmFsaWQoKSkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcigwKTsKKyAgICByZXR1cm47CisgIH0KKworICBDRlhfRGF0ZVRpbWUgdW5pVGltZSA9IHRpbWVWYWx1ZS5HZXRUaW1lKCk7CisgIGludDMyX3QgaG91ciA9IHVuaVRpbWUuR2V0SG91cigpOworICBpbnQzMl90IG1pbiA9IHVuaVRpbWUuR2V0TWludXRlKCk7CisgIGludDMyX3Qgc2Vjb25kID0gdW5pVGltZS5HZXRTZWNvbmQoKTsKKyAgaW50MzJfdCBtaWxTZWNvbmQgPSB1bmlUaW1lLkdldE1pbGxpc2Vjb25kKCk7CisKKyAgLy8gVE9ETyhkc2luY2xhaXIpOiBTZWUgaWYgdGhlcmUgaXMgb3RoZXIgdGltZSBjb252ZXJzaW9uIGNvZGUgaW4gcGRmaXVtIGFuZAorICAvLyAgIGNvbnNvbGlkYXRlLgorICBpbnQzMl90IG1pbnMgPSBob3VyICogNjAgKyBtaW47CisgIG1pbnMgLT0gKHBNZ3ItPkdldERlZkxvY2FsZSgpLT5HZXRUaW1lWm9uZSgpLnR6SG91ciAqIDYwKTsKKyAgd2hpbGUgKG1pbnMgPiAxNDQwKQorICAgIG1pbnMgLT0gMTQ0MDsKKyAgd2hpbGUgKG1pbnMgPCAwKQorICAgIG1pbnMgKz0gMTQ0MDsKKyAgaG91ciA9IG1pbnMgLyA2MDsKKyAgbWluID0gbWlucyAlIDYwOworCisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcihob3VyICogMzYwMDAwMCArIG1pbiAqIDYwMDAwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCAqIDEwMDAgKyBtaWxTZWNvbmQgKyAxKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkxvY2FsRGF0ZUZtdChDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7CisgIGlmIChhcmdjID4gMikgeworICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKQorICAgICAgICAtPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiTG9jYWxEYXRlRm10Iik7CisgICAgcmV0dXJuOworICB9CisKKyAgaW50MzJfdCBpU3R5bGUgPSAwOworICBpZiAoYXJnYyA+IDApIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdTdHlsZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKKyAgICBpZiAoYXJnU3R5bGUtPklzTnVsbCgpKSB7CisgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaVN0eWxlID0gKGludDMyX3QpVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdTdHlsZS5nZXQoKSk7CisgICAgaWYgKGlTdHlsZSA+IDQgfHwgaVN0eWxlIDwgMCkKKyAgICAgIGlTdHlsZSA9IDA7CisgIH0KKworICBCeXRlU3RyaW5nIHN6TG9jYWw7CisgIGlmIChhcmdjID4gMSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ0xvY2FsID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOworICAgIGlmIChhcmdMb2NhbC0+SXNOdWxsKCkpIHsKKyAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzekxvY2FsID0gVmFsdWVUb1VURjhTdHJpbmcoYXJnTG9jYWwuZ2V0KCkpOworICB9CisKKyAgQnl0ZVN0cmluZyBmb3JtYXRTdHIgPQorICAgICAgR2V0TG9jYWxEYXRlRm9ybWF0KHBUaGlzLCBpU3R5bGUsIHN6TG9jYWwuQXNTdHJpbmdWaWV3KCksIGZhbHNlKTsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoZm9ybWF0U3RyLkFzU3RyaW5nVmlldygpKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkxvY2FsVGltZUZtdChDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7CisgIGlmIChhcmdjID4gMikgeworICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKQorICAgICAgICAtPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiTG9jYWxUaW1lRm10Iik7CisgICAgcmV0dXJuOworICB9CisKKyAgaW50MzJfdCBpU3R5bGUgPSAwOworICBpZiAoYXJnYyA+IDApIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdTdHlsZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKKyAgICBpZiAoYXJnU3R5bGUtPklzTnVsbCgpKSB7CisgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaVN0eWxlID0gKGludDMyX3QpVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdTdHlsZS5nZXQoKSk7CisgICAgaWYgKGlTdHlsZSA+IDQgfHwgaVN0eWxlIDwgMCkKKyAgICAgIGlTdHlsZSA9IDA7CisgIH0KKworICBCeXRlU3RyaW5nIHN6TG9jYWw7CisgIGlmIChhcmdjID4gMSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ0xvY2FsID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOworICAgIGlmIChhcmdMb2NhbC0+SXNOdWxsKCkpIHsKKyAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzekxvY2FsID0gVmFsdWVUb1VURjhTdHJpbmcoYXJnTG9jYWwuZ2V0KCkpOworICB9CisKKyAgQnl0ZVN0cmluZyBmb3JtYXRTdHIgPQorICAgICAgR2V0TG9jYWxUaW1lRm9ybWF0KHBUaGlzLCBpU3R5bGUsIHN6TG9jYWwuQXNTdHJpbmdWaWV3KCksIGZhbHNlKTsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoZm9ybWF0U3RyLkFzU3RyaW5nVmlldygpKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6Ok51bTJEYXRlKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7CisgIGlmIChhcmdjIDwgMSB8fCBhcmdjID4gMykgeworICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJOdW0yRGF0ZSIpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGRhdGVWYWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKKyAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBkYXRlVmFsdWUuZ2V0KCkpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisgIGludDMyX3QgZERhdGUgPSAoaW50MzJfdClWYWx1ZVRvRmxvYXQocFRoaXMsIGRhdGVWYWx1ZS5nZXQoKSk7CisgIGlmIChkRGF0ZSA8IDEpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICByZXR1cm47CisgIH0KKworICBCeXRlU3RyaW5nIGZvcm1hdFN0cmluZzsKKyAgaWYgKGFyZ2MgPiAxKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gZm9ybWF0VmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7CisgICAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBmb3JtYXRWYWx1ZS5nZXQoKSkpIHsKKyAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3JtYXRTdHJpbmcgPSBWYWx1ZVRvVVRGOFN0cmluZyhmb3JtYXRWYWx1ZS5nZXQoKSk7CisgIH0KKworICBCeXRlU3RyaW5nIGxvY2FsU3RyaW5nOworICBpZiAoYXJnYyA+IDIpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBsb2NhbFZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDIpOworICAgIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgbG9jYWxWYWx1ZS5nZXQoKSkpIHsKKyAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsb2NhbFN0cmluZyA9IFZhbHVlVG9VVEY4U3RyaW5nKGxvY2FsVmFsdWUuZ2V0KCkpOworICB9CisKKyAgaW50MzJfdCBpWWVhciA9IDE5MDA7CisgIGludDMyX3QgaU1vbnRoID0gMTsKKyAgaW50MzJfdCBpRGF5ID0gMTsKKyAgaW50MzJfdCBpID0gMDsKKyAgd2hpbGUgKGREYXRlID4gMCkgeworICAgIGlmIChpTW9udGggPT0gMikgeworICAgICAgaWYgKCghKChpWWVhciArIGkpICUgNCkgJiYgKChpWWVhciArIGkpICUgMTAwKSkgfHwgISgoaVllYXIgKyBpKSAlIDQwMCkpIHsKKyAgICAgICAgaWYgKGREYXRlID4gMjkpIHsKKyAgICAgICAgICArK2lNb250aDsKKyAgICAgICAgICBpZiAoaU1vbnRoID4gMTIpIHsKKyAgICAgICAgICAgIGlNb250aCA9IDE7CisgICAgICAgICAgICArK2k7CisgICAgICAgICAgfQorICAgICAgICAgIGlEYXkgPSAxOworICAgICAgICAgIGREYXRlIC09IDI5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlEYXkgKz0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZERhdGUpIC0gMTsKKyAgICAgICAgICBkRGF0ZSA9IDA7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkRGF0ZSA+IDI4KSB7CisgICAgICAgICAgKytpTW9udGg7CisgICAgICAgICAgaWYgKGlNb250aCA+IDEyKSB7CisgICAgICAgICAgICBpTW9udGggPSAxOworICAgICAgICAgICAgKytpOworICAgICAgICAgIH0KKyAgICAgICAgICBpRGF5ID0gMTsKKyAgICAgICAgICBkRGF0ZSAtPSAyODsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpRGF5ICs9IHN0YXRpY19jYXN0PGludDMyX3Q+KGREYXRlKSAtIDE7CisgICAgICAgICAgZERhdGUgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChpTW9udGggPCA4KSB7CisgICAgICBpZiAoKGlNb250aCAlIDIgPT0gMCkpIHsKKyAgICAgICAgaWYgKGREYXRlID4gMzApIHsKKyAgICAgICAgICArK2lNb250aDsKKyAgICAgICAgICBpZiAoaU1vbnRoID4gMTIpIHsKKyAgICAgICAgICAgIGlNb250aCA9IDE7CisgICAgICAgICAgICArK2k7CisgICAgICAgICAgfQorICAgICAgICAgIGlEYXkgPSAxOworICAgICAgICAgIGREYXRlIC09IDMwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlEYXkgKz0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZERhdGUpIC0gMTsKKyAgICAgICAgICBkRGF0ZSA9IDA7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkRGF0ZSA+IDMxKSB7CisgICAgICAgICAgKytpTW9udGg7CisgICAgICAgICAgaWYgKGlNb250aCA+IDEyKSB7CisgICAgICAgICAgICBpTW9udGggPSAxOworICAgICAgICAgICAgKytpOworICAgICAgICAgIH0KKyAgICAgICAgICBpRGF5ID0gMTsKKyAgICAgICAgICBkRGF0ZSAtPSAzMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpRGF5ICs9IHN0YXRpY19jYXN0PGludDMyX3Q+KGREYXRlKSAtIDE7CisgICAgICAgICAgZERhdGUgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChpTW9udGggJSAyICE9IDApIHsKKyAgICAgICAgaWYgKGREYXRlID4gMzApIHsKKyAgICAgICAgICArK2lNb250aDsKKyAgICAgICAgICBpZiAoaU1vbnRoID4gMTIpIHsKKyAgICAgICAgICAgIGlNb250aCA9IDE7CisgICAgICAgICAgICArK2k7CisgICAgICAgICAgfQorICAgICAgICAgIGlEYXkgPSAxOworICAgICAgICAgIGREYXRlIC09IDMwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlEYXkgKz0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZERhdGUpIC0gMTsKKyAgICAgICAgICBkRGF0ZSA9IDA7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkRGF0ZSA+IDMxKSB7CisgICAgICAgICAgKytpTW9udGg7CisgICAgICAgICAgaWYgKGlNb250aCA+IDEyKSB7CisgICAgICAgICAgICBpTW9udGggPSAxOworICAgICAgICAgICAgKytpOworICAgICAgICAgIH0KKyAgICAgICAgICBpRGF5ID0gMTsKKyAgICAgICAgICBkRGF0ZSAtPSAzMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpRGF5ICs9IHN0YXRpY19jYXN0PGludDMyX3Q+KGREYXRlKSAtIDE7CisgICAgICAgICAgZERhdGUgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgQnl0ZVN0cmluZyBzekxvY2FsRGF0ZVN0cmluZyA9IElzb0RhdGUyTG9jYWwoCisgICAgICBwVGhpcywKKyAgICAgIEJ5dGVTdHJpbmc6OkZvcm1hdCgiJWQlMDJkJTAyZCIsIGlZZWFyICsgaSwgaU1vbnRoLCBpRGF5KS5Bc1N0cmluZ1ZpZXcoKSwKKyAgICAgIGZvcm1hdFN0cmluZy5Bc1N0cmluZ1ZpZXcoKSwgbG9jYWxTdHJpbmcuQXNTdHJpbmdWaWV3KCkpOworICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZyhzekxvY2FsRGF0ZVN0cmluZy5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpOdW0yR01UaW1lKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOworICBpZiAoYXJnYyA8IDEgfHwgYXJnYyA+IDMpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cikKKyAgICAgICAgLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIk51bTJHTVRpbWUiKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiB0aW1lVmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIGlmICh0aW1lVmFsdWUtPklzTnVsbCgpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisgIGludDMyX3QgaVRpbWUgPSAoaW50MzJfdClWYWx1ZVRvRmxvYXQocFRoaXMsIHRpbWVWYWx1ZS5nZXQoKSk7CisgIGlmIChhYnMoaVRpbWUpIDwgMS4wKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgQnl0ZVN0cmluZyBmb3JtYXRTdHJpbmc7CisgIGlmIChhcmdjID4gMSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGZvcm1hdFZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOworICAgIGlmIChmb3JtYXRWYWx1ZS0+SXNOdWxsKCkpIHsKKyAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3JtYXRTdHJpbmcgPSBWYWx1ZVRvVVRGOFN0cmluZyhmb3JtYXRWYWx1ZS5nZXQoKSk7CisgIH0KKworICBCeXRlU3RyaW5nIGxvY2FsU3RyaW5nOworICBpZiAoYXJnYyA+IDIpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBsb2NhbFZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDIpOworICAgIGlmIChsb2NhbFZhbHVlLT5Jc051bGwoKSkgeworICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGxvY2FsU3RyaW5nID0gVmFsdWVUb1VURjhTdHJpbmcobG9jYWxWYWx1ZS5nZXQoKSk7CisgIH0KKworICBCeXRlU3RyaW5nIHN6R01UVGltZVN0cmluZyA9CisgICAgICBOdW0yQWxsVGltZShwVGhpcywgaVRpbWUsIGZvcm1hdFN0cmluZy5Bc1N0cmluZ1ZpZXcoKSwKKyAgICAgICAgICAgICAgICAgIGxvY2FsU3RyaW5nLkFzU3RyaW5nVmlldygpLCB0cnVlKTsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoc3pHTVRUaW1lU3RyaW5nLkFzU3RyaW5nVmlldygpKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6Ok51bTJUaW1lKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7CisgIGlmIChhcmdjIDwgMSB8fCBhcmdjID4gMykgeworICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJOdW0yVGltZSIpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IHRpbWVWYWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKKyAgaWYgKHRpbWVWYWx1ZS0+SXNOdWxsKCkpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICByZXR1cm47CisgIH0KKyAgZmxvYXQgZlRpbWUgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIHRpbWVWYWx1ZS5nZXQoKSk7CisgIGlmIChmYWJzKGZUaW1lKSA8IDEuMCkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgIHJldHVybjsKKyAgfQorCisgIEJ5dGVTdHJpbmcgZm9ybWF0U3RyaW5nOworICBpZiAoYXJnYyA+IDEpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBmb3JtYXRWYWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKKyAgICBpZiAoZm9ybWF0VmFsdWUtPklzTnVsbCgpKSB7CisgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9ybWF0U3RyaW5nID0gVmFsdWVUb1VURjhTdHJpbmcoZm9ybWF0VmFsdWUuZ2V0KCkpOworICB9CisKKyAgQnl0ZVN0cmluZyBsb2NhbFN0cmluZzsKKyAgaWYgKGFyZ2MgPiAyKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gbG9jYWxWYWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAyKTsKKyAgICBpZiAobG9jYWxWYWx1ZS0+SXNOdWxsKCkpIHsKKyAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsb2NhbFN0cmluZyA9IFZhbHVlVG9VVEY4U3RyaW5nKGxvY2FsVmFsdWUuZ2V0KCkpOworICB9CisKKyAgQnl0ZVN0cmluZyBzekxvY2FsVGltZVN0cmluZyA9IE51bTJBbGxUaW1lKHBUaGlzLCBzdGF0aWNfY2FzdDxpbnQzMl90PihmVGltZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRTdHJpbmcuQXNTdHJpbmdWaWV3KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0cmluZy5Bc1N0cmluZ1ZpZXcoKSwgZmFsc2UpOworICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZyhzekxvY2FsVGltZVN0cmluZy5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpUaW1lKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAwKSB7CisgICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIlRpbWUiKTsKKyAgICByZXR1cm47CisgIH0KKworICB0aW1lX3Qgbm93OworICB0aW1lKCZub3cpOworCisgIHN0cnVjdCB0bSogcEdtdCA9IGdtdGltZSgmbm93KTsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKAorICAgICAgKHBHbXQtPnRtX2hvdXIgKiAzNjAwICsgcEdtdC0+dG1fbWluICogNjAgKyBwR210LT50bV9zZWMpICogMTAwMCk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpUaW1lMk51bShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOworICBpZiAoYXJnYyA8IDEgfHwgYXJnYyA+IDMpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiVGltZTJOdW0iKTsKKyAgICByZXR1cm47CisgIH0KKworICBCeXRlU3RyaW5nIHRpbWVTdHJpbmc7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IHRpbWVWYWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKKyAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCB0aW1lVmFsdWUuZ2V0KCkpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisgIHRpbWVTdHJpbmcgPSBWYWx1ZVRvVVRGOFN0cmluZyh0aW1lVmFsdWUuZ2V0KCkpOworCisgIEJ5dGVTdHJpbmcgZm9ybWF0U3RyaW5nOworICBpZiAoYXJnYyA+IDEpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBmb3JtYXRWYWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKKyAgICBpZiAoVmFsdWVJc051bGwocFRoaXMsIGZvcm1hdFZhbHVlLmdldCgpKSkgeworICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGZvcm1hdFN0cmluZyA9IFZhbHVlVG9VVEY4U3RyaW5nKGZvcm1hdFZhbHVlLmdldCgpKTsKKyAgfQorCisgIEJ5dGVTdHJpbmcgbG9jYWxTdHJpbmc7CisgIGlmIChhcmdjID4gMikgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGxvY2FsVmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMik7CisgICAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBsb2NhbFZhbHVlLmdldCgpKSkgeworICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGxvY2FsU3RyaW5nID0gVmFsdWVUb1VURjhTdHJpbmcobG9jYWxWYWx1ZS5nZXQoKSk7CisgIH0KKworICBDWEZBX0RvY3VtZW50KiBwRG9jID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5HZXREb2N1bWVudCgpOworICBDWEZBX0xvY2FsZU1nciogcE1nciA9IHBEb2MtPkdldExvY2FsTWdyKCk7CisgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBudWxscHRyOworICBpZiAobG9jYWxTdHJpbmcuSXNFbXB0eSgpKSB7CisgICAgQ1hGQV9Ob2RlKiBwVGhpc05vZGUgPSBUb05vZGUocERvYy0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRUaGlzT2JqZWN0KCkpOworICAgIEFTU0VSVChwVGhpc05vZGUpOworICAgIHBMb2NhbGUgPSBwVGhpc05vZGUtPkdldExvY2FsZSgpOworICB9IGVsc2UgeworICAgIHBMb2NhbGUgPQorICAgICAgICBwTWdyLT5HZXRMb2NhbGVCeU5hbWUoV2lkZVN0cmluZzo6RnJvbVVURjgobG9jYWxTdHJpbmcuQXNTdHJpbmdWaWV3KCkpKTsKKyAgfQorCisgIFdpZGVTdHJpbmcgd3NGb3JtYXQ7CisgIGlmIChmb3JtYXRTdHJpbmcuSXNFbXB0eSgpKQorICAgIHdzRm9ybWF0ID0gcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0KTsKKyAgZWxzZQorICAgIHdzRm9ybWF0ID0gV2lkZVN0cmluZzo6RnJvbVVURjgoZm9ybWF0U3RyaW5nLkFzU3RyaW5nVmlldygpKTsKKworICB3c0Zvcm1hdCA9IEwidGltZXsiICsgd3NGb3JtYXQgKyBMIn0iOworICBDWEZBX0xvY2FsZVZhbHVlIGxvY2FsZVZhbHVlKFhGQV9WVF9USU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmc6OkZyb21VVEY4KHRpbWVTdHJpbmcuQXNTdHJpbmdWaWV3KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzRm9ybWF0LCBwTG9jYWxlLCBwTWdyKTsKKyAgaWYgKCFsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoMCk7CisgICAgcmV0dXJuOworICB9CisKKyAgQ0ZYX0RhdGVUaW1lIHVuaVRpbWUgPSBsb2NhbGVWYWx1ZS5HZXRUaW1lKCk7CisgIGludDMyX3QgaG91ciA9IHVuaVRpbWUuR2V0SG91cigpOworICBpbnQzMl90IG1pbiA9IHVuaVRpbWUuR2V0TWludXRlKCk7CisgIGludDMyX3Qgc2Vjb25kID0gdW5pVGltZS5HZXRTZWNvbmQoKTsKKyAgaW50MzJfdCBtaWxTZWNvbmQgPSB1bmlUaW1lLkdldE1pbGxpc2Vjb25kKCk7CisgIGludDMyX3QgbWlucyA9IGhvdXIgKiA2MCArIG1pbjsKKworICBtaW5zIC09IChDWEZBX1RpbWVab25lUHJvdmlkZXIoKS5HZXRUaW1lWm9uZSgpLnR6SG91ciAqIDYwKTsKKyAgd2hpbGUgKG1pbnMgPiAxNDQwKQorICAgIG1pbnMgLT0gMTQ0MDsKKworICB3aGlsZSAobWlucyA8IDApCisgICAgbWlucyArPSAxNDQwOworCisgIGhvdXIgPSBtaW5zIC8gNjA7CisgIG1pbiA9IG1pbnMgJSA2MDsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKGhvdXIgKiAzNjAwMDAwICsgbWluICogNjAwMDAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kICogMTAwMCArIG1pbFNlY29uZCArIDEpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6VGltZUZtdChDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKKyAgaWYgKGFyZ2MgPiAyKSB7CisgICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIlRpbWVGbXQiKTsKKyAgICByZXR1cm47CisgIH0KKworICBpbnQzMl90IGlTdHlsZSA9IDA7CisgIGlmIChhcmdjID4gMCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1N0eWxlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICAgIGlmIChhcmdTdHlsZS0+SXNOdWxsKCkpIHsKKyAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpU3R5bGUgPSAoaW50MzJfdClWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ1N0eWxlLmdldCgpKTsKKyAgICBpZiAoaVN0eWxlID4gNCB8fCBpU3R5bGUgPCAwKQorICAgICAgaVN0eWxlID0gMDsKKyAgfQorCisgIEJ5dGVTdHJpbmcgc3pMb2NhbDsKKyAgaWYgKGFyZ2MgPiAxKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnTG9jYWwgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7CisgICAgaWYgKGFyZ0xvY2FsLT5Jc051bGwoKSkgeworICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHN6TG9jYWwgPSBWYWx1ZVRvVVRGOFN0cmluZyhhcmdMb2NhbC5nZXQoKSk7CisgIH0KKworICBCeXRlU3RyaW5nIGZvcm1hdFN0ciA9CisgICAgICBHZXRTdGFuZGFyZFRpbWVGb3JtYXQocFRoaXMsIGlTdHlsZSwgc3pMb2NhbC5Bc1N0cmluZ1ZpZXcoKSk7CisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKGZvcm1hdFN0ci5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpJc0lzb0RhdGVGb3JtYXQoY29uc3QgY2hhciogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWWVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNb250aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlEYXkpIHsKKyAgaVllYXIgPSAwOworICBpTW9udGggPSAxOworICBpRGF5ID0gMTsKKworICBpZiAoaUxlbmd0aCA8IDQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGNoYXIgc3RyWWVhcls1XTsKKyAgc3RyWWVhcls0XSA9ICdcMCc7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgIGlmICghc3RkOjppc2RpZ2l0KHBEYXRhW2ldKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHN0clllYXJbaV0gPSBwRGF0YVtpXTsKKyAgfQorICBpWWVhciA9IEZYU1lTX2F0b2koc3RyWWVhcik7CisgIGlTdHlsZSA9IDA7CisgIGlmIChpTGVuZ3RoID09IDQpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaVN0eWxlID0gcERhdGFbNF0gPT0gJy0nID8gMSA6IDA7CisKKyAgY2hhciBzdHJUZW1wWzNdOworICBzdHJUZW1wWzJdID0gJ1wwJzsKKyAgaW50MzJfdCBpUG9zT2ZmID0gaVN0eWxlID09IDAgPyA0IDogNTsKKyAgaWYgKCFzdGQ6OmlzZGlnaXQocERhdGFbaVBvc09mZl0pIHx8ICFzdGQ6OmlzZGlnaXQocERhdGFbaVBvc09mZiArIDFdKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc3RyVGVtcFswXSA9IHBEYXRhW2lQb3NPZmZdOworICBzdHJUZW1wWzFdID0gcERhdGFbaVBvc09mZiArIDFdOworICBpTW9udGggPSBGWFNZU19hdG9pKHN0clRlbXApOworICBpZiAoaU1vbnRoID4gMTIgfHwgaU1vbnRoIDwgMSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGlTdHlsZSA9PSAwKSB7CisgICAgaVBvc09mZiArPSAyOworICAgIGlmIChpTGVuZ3RoID09IDYpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICBpUG9zT2ZmICs9IDM7CisgICAgaWYgKGlMZW5ndGggPT0gNykKKyAgICAgIHJldHVybiB0cnVlOworICB9CisgIGlmICghc3RkOjppc2RpZ2l0KHBEYXRhW2lQb3NPZmZdKSB8fCAhc3RkOjppc2RpZ2l0KHBEYXRhW2lQb3NPZmYgKyAxXSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHN0clRlbXBbMF0gPSBwRGF0YVtpUG9zT2ZmXTsKKyAgc3RyVGVtcFsxXSA9IHBEYXRhW2lQb3NPZmYgKyAxXTsKKyAgaURheSA9IEZYU1lTX2F0b2koc3RyVGVtcCk7CisgIGlmIChpUG9zT2ZmICsgMiA8IGlMZW5ndGgpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICgoIShpWWVhciAlIDQpICYmIChpWWVhciAlIDEwMCkpIHx8ICEoaVllYXIgJSA0MDApKSB7CisgICAgaWYgKGlNb250aCA9PSAyICYmIGlEYXkgPiAyOSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoaU1vbnRoID09IDIgJiYgaURheSA+IDI4KQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChpTW9udGggIT0gMikgeworICAgIGlmIChpTW9udGggPCA4KSB7CisgICAgICBpZiAoaURheSA+IChpTW9udGggJSAyID09IDAgPyAzMCA6IDMxKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoaURheSA+IChpTW9udGggJSAyID09IDAgPyAzMSA6IDMwKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gc3RhdGljCitib29sIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OklzSXNvVGltZUZvcm1hdChjb25zdCBjaGFyKiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlIb3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1pbnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTWlsbGlTZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWm9uZUhvdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWm9uZU1pbnV0ZSkgeworICBpSG91ciA9IDA7CisgIGlNaW51dGUgPSAwOworICBpU2Vjb25kID0gMDsKKyAgaU1pbGxpU2Vjb25kID0gMDsKKyAgaVpvbmVIb3VyID0gMDsKKyAgaVpvbmVNaW51dGUgPSAwOworICBpZiAoIXBEYXRhKQorICAgIHJldHVybiBmYWxzZTsKKworICBjaGFyIHN0clRlbXBbM107CisgIHN0clRlbXBbMl0gPSAnXDAnOworICBpbnQzMl90IGlab25lID0gMDsKKyAgaW50MzJfdCBpID0gMDsKKyAgd2hpbGUgKGkgPCBpTGVuZ3RoKSB7CisgICAgaWYgKCFzdGQ6OmlzZGlnaXQocERhdGFbaV0pICYmIHBEYXRhW2ldICE9ICc6JykgeworICAgICAgaVpvbmUgPSBpOworICAgICAgYnJlYWs7CisgICAgfQorICAgICsraTsKKyAgfQorICBpZiAoaSA9PSBpTGVuZ3RoKQorICAgIGlab25lID0gaUxlbmd0aDsKKworICBpbnQzMl90IGlQb3MgPSAwOworICBpbnQzMl90IGlJbmRleCA9IDA7CisgIHdoaWxlIChpSW5kZXggPCBpWm9uZSkgeworICAgIGlmICghc3RkOjppc2RpZ2l0KHBEYXRhW2lJbmRleF0pKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgc3RyVGVtcFswXSA9IHBEYXRhW2lJbmRleF07CisgICAgaWYgKCFzdGQ6OmlzZGlnaXQocERhdGFbaUluZGV4ICsgMV0pKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgc3RyVGVtcFsxXSA9IHBEYXRhW2lJbmRleCArIDFdOworICAgIGlmIChGWFNZU19hdG9pKHN0clRlbXApID4gNjApCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAocERhdGFbMl0gPT0gJzonKSB7CisgICAgICBpZiAoaVBvcyA9PSAwKSB7CisgICAgICAgIGlIb3VyID0gRlhTWVNfYXRvaShzdHJUZW1wKTsKKyAgICAgICAgKytpUG9zOworICAgICAgfSBlbHNlIGlmIChpUG9zID09IDEpIHsKKyAgICAgICAgaU1pbnV0ZSA9IEZYU1lTX2F0b2koc3RyVGVtcCk7CisgICAgICAgICsraVBvczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlTZWNvbmQgPSBGWFNZU19hdG9pKHN0clRlbXApOworICAgICAgfQorICAgICAgaUluZGV4ICs9IDM7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChpUG9zID09IDApIHsKKyAgICAgICAgaUhvdXIgPSBGWFNZU19hdG9pKHN0clRlbXApOworICAgICAgICArK2lQb3M7CisgICAgICB9IGVsc2UgaWYgKGlQb3MgPT0gMSkgeworICAgICAgICBpTWludXRlID0gRlhTWVNfYXRvaShzdHJUZW1wKTsKKyAgICAgICAgKytpUG9zOworICAgICAgfSBlbHNlIGlmIChpUG9zID09IDIpIHsKKyAgICAgICAgaVNlY29uZCA9IEZYU1lTX2F0b2koc3RyVGVtcCk7CisgICAgICAgICsraVBvczsKKyAgICAgIH0KKyAgICAgIGlJbmRleCArPSAyOworICAgIH0KKyAgfQorCisgIGlmIChpSW5kZXggPCBpTGVuZ3RoICYmIHBEYXRhW2lJbmRleF0gPT0gJy4nKSB7CisgICAgY29uc3RleHByIGludCBrU3ViU2Vjb25kTGVuZ3RoID0gMzsKKyAgICBpZiAoaUluZGV4ICsga1N1YlNlY29uZExlbmd0aCA+PSBpTGVuZ3RoKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgKytpSW5kZXg7CisgICAgY2hhciBzdHJTZWNba1N1YlNlY29uZExlbmd0aCArIDFdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga1N1YlNlY29uZExlbmd0aDsgKytpKSB7CisgICAgICBjaGFyIGMgPSBwRGF0YVtpSW5kZXggKyBpXTsKKyAgICAgIGlmICghc3RkOjppc2RpZ2l0KGMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBzdHJTZWNbaV0gPSBjOworICAgIH0KKyAgICBzdHJTZWNba1N1YlNlY29uZExlbmd0aF0gPSAnXDAnOworCisgICAgaU1pbGxpU2Vjb25kID0gRlhTWVNfYXRvaShzdHJTZWMpOworICAgIGlmIChpTWlsbGlTZWNvbmQgPiAxMDApIHsKKyAgICAgIGlNaWxsaVNlY29uZCA9IDA7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlJbmRleCArPSBrU3ViU2Vjb25kTGVuZ3RoOworICB9CisKKyAgaWYgKGlJbmRleCA8IGlMZW5ndGggJiYgRlhTWVNfdG9sb3dlcihwRGF0YVtpSW5kZXhdKSA9PSAneicpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaW50MzJfdCBpU2lnbiA9IDE7CisgIGlmIChpSW5kZXggPCBpTGVuZ3RoKSB7CisgICAgaWYgKHBEYXRhW2lJbmRleF0gPT0gJysnKSB7CisgICAgICArK2lJbmRleDsKKyAgICB9IGVsc2UgaWYgKHBEYXRhW2lJbmRleF0gPT0gJy0nKSB7CisgICAgICBpU2lnbiA9IC0xOworICAgICAgKytpSW5kZXg7CisgICAgfQorICB9CisgIGlQb3MgPSAwOworICB3aGlsZSAoaUluZGV4IDwgaUxlbmd0aCkgeworICAgIGlmICghc3RkOjppc2RpZ2l0KHBEYXRhW2lJbmRleF0pKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgc3RyVGVtcFswXSA9IHBEYXRhW2lJbmRleF07CisgICAgaWYgKCFzdGQ6OmlzZGlnaXQocERhdGFbaUluZGV4ICsgMV0pKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgc3RyVGVtcFsxXSA9IHBEYXRhW2lJbmRleCArIDFdOworICAgIGlmIChGWFNZU19hdG9pKHN0clRlbXApID4gNjApCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAocERhdGFbMl0gPT0gJzonKSB7CisgICAgICBpZiAoaVBvcyA9PSAwKSB7CisgICAgICAgIGlab25lSG91ciA9IEZYU1lTX2F0b2koc3RyVGVtcCk7CisgICAgICB9IGVsc2UgaWYgKGlQb3MgPT0gMSkgeworICAgICAgICBpWm9uZU1pbnV0ZSA9IEZYU1lTX2F0b2koc3RyVGVtcCk7CisgICAgICB9CisgICAgICBpSW5kZXggKz0gMzsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFpUG9zKSB7CisgICAgICAgIGlab25lSG91ciA9IEZYU1lTX2F0b2koc3RyVGVtcCk7CisgICAgICAgICsraVBvczsKKyAgICAgIH0gZWxzZSBpZiAoaVBvcyA9PSAxKSB7CisgICAgICAgIGlab25lTWludXRlID0gRlhTWVNfYXRvaShzdHJUZW1wKTsKKyAgICAgICAgKytpUG9zOworICAgICAgfQorICAgICAgaUluZGV4ICs9IDI7CisgICAgfQorICB9CisgIGlmIChpSW5kZXggPCBpTGVuZ3RoKQorICAgIHJldHVybiBmYWxzZTsKKworICBpWm9uZUhvdXIgKj0gaVNpZ247CisgIHJldHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6SXNJc29EYXRlVGltZUZvcm1hdChjb25zdCBjaGFyKiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVllYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1vbnRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlEYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUhvdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1pbnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpU2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNaWxsaW9uU2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlab25lSG91ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWm9uZU1pbnV0ZSkgeworICBpWWVhciA9IDA7CisgIGlNb250aCA9IDA7CisgIGlEYXkgPSAwOworICBpSG91ciA9IDA7CisgIGlNaW51dGUgPSAwOworICBpU2Vjb25kID0gMDsKKyAgaWYgKCFwRGF0YSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW50MzJfdCBpSW5kZXggPSAwOworICB3aGlsZSAocERhdGFbaUluZGV4XSAhPSAnVCcgJiYgcERhdGFbaUluZGV4XSAhPSAndCcpIHsKKyAgICBpZiAoaUluZGV4ID49IGlMZW5ndGgpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgKytpSW5kZXg7CisgIH0KKyAgaWYgKGlJbmRleCAhPSA4ICYmIGlJbmRleCAhPSAxMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW50MzJfdCBpU3R5bGUgPSAtMTsKKyAgaWYgKCFJc0lzb0RhdGVGb3JtYXQocERhdGEsIGlJbmRleCwgaVN0eWxlLCBpWWVhciwgaU1vbnRoLCBpRGF5KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChwRGF0YVtpSW5kZXhdICE9ICdUJyAmJiBwRGF0YVtpSW5kZXhdICE9ICd0JykKKyAgICByZXR1cm4gdHJ1ZTsKKworICArK2lJbmRleDsKKyAgaWYgKCgoaUxlbmd0aCAtIGlJbmRleCA+IDEzKSAmJiAoaUxlbmd0aCAtIGlJbmRleCA8IDYpKSAmJgorICAgICAgKGlMZW5ndGggLSBpSW5kZXggIT0gMTUpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIElzSXNvVGltZUZvcm1hdChwRGF0YSArIGlJbmRleCwgaUxlbmd0aCAtIGlJbmRleCwgaUhvdXIsIGlNaW51dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaVNlY29uZCwgaU1pbGxpb25TZWNvbmQsIGlab25lSG91ciwgaVpvbmVNaW51dGUpOworfQorCisvLyBzdGF0aWMKK0J5dGVTdHJpbmcgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6TG9jYWwySXNvRGF0ZSgKKyAgICBDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekRhdGUsCisgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6Rm9ybWF0LAorICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekxvY2FsZSkgeworICBDWEZBX0RvY3VtZW50KiBwRG9jID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5HZXREb2N1bWVudCgpOworICBpZiAoIXBEb2MpCisgICAgcmV0dXJuIEJ5dGVTdHJpbmcoKTsKKworICBDWEZBX0xvY2FsZU1nciogcE1nciA9IHBEb2MtPkdldExvY2FsTWdyKCk7CisgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBMb2NhbGVGcm9tU3RyaW5nKHBEb2MsIHBNZ3IsIHN6TG9jYWxlKTsKKyAgaWYgKCFwTG9jYWxlKQorICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisKKyAgV2lkZVN0cmluZyB3c0Zvcm1hdCA9IEZvcm1hdEZyb21TdHJpbmcocExvY2FsZSwgc3pGb3JtYXQpOworICBDRlhfRGF0ZVRpbWUgZHQgPSBDWEZBX0xvY2FsZVZhbHVlKFhGQV9WVF9EQVRFLCBXaWRlU3RyaW5nOjpGcm9tVVRGOChzekRhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzRm9ybWF0LCBwTG9jYWxlLCBwTWdyKQorICAgICAgICAgICAgICAgICAgICAgICAgLkdldERhdGUoKTsKKworICByZXR1cm4gQnl0ZVN0cmluZzo6Rm9ybWF0KCIlNGQtJTAyZC0lMDJkIiwgZHQuR2V0WWVhcigpLCBkdC5HZXRNb250aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0LkdldERheSgpKTsKK30KKworLy8gc3RhdGljCitCeXRlU3RyaW5nIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6Oklzb0RhdGUyTG9jYWwoCisgICAgQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pEYXRlLAorICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZvcm1hdCwKKyAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pMb2NhbGUpIHsKKyAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+R2V0RG9jdW1lbnQoKTsKKyAgaWYgKCFwRG9jKQorICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisKKyAgQ1hGQV9Mb2NhbGVNZ3IqIHBNZ3IgPSBwRG9jLT5HZXRMb2NhbE1ncigpOworICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gTG9jYWxlRnJvbVN0cmluZyhwRG9jLCBwTWdyLCBzekxvY2FsZSk7CisgIGlmICghcExvY2FsZSkKKyAgICByZXR1cm4gQnl0ZVN0cmluZygpOworCisgIFdpZGVTdHJpbmcgd3NGb3JtYXQgPSBGb3JtYXRGcm9tU3RyaW5nKHBMb2NhbGUsIHN6Rm9ybWF0KTsKKyAgV2lkZVN0cmluZyB3c1JldDsKKyAgQ1hGQV9Mb2NhbGVWYWx1ZShYRkFfVlRfREFURSwgV2lkZVN0cmluZzo6RnJvbVVURjgoc3pEYXRlKSwgcE1ncikKKyAgICAgIC5Gb3JtYXRQYXR0ZXJucyh3c1JldCwgd3NGb3JtYXQsIHBMb2NhbGUsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7CisgIHJldHVybiB3c1JldC5VVEY4RW5jb2RlKCk7Cit9CisKKy8vIHN0YXRpYworQnl0ZVN0cmluZyBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpJc29UaW1lMkxvY2FsKAorICAgIENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6VGltZSwKKyAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGb3JtYXQsCisgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6TG9jYWxlKSB7CisgIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPkdldERvY3VtZW50KCk7CisgIGlmICghcERvYykKKyAgICByZXR1cm4gQnl0ZVN0cmluZygpOworCisgIENYRkFfTG9jYWxlTWdyKiBwTWdyID0gcERvYy0+R2V0TG9jYWxNZ3IoKTsKKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9IExvY2FsZUZyb21TdHJpbmcocERvYywgcE1nciwgc3pMb2NhbGUpOworICBpZiAoIXBMb2NhbGUpCisgICAgcmV0dXJuIEJ5dGVTdHJpbmcoKTsKKworICBXaWRlU3RyaW5nIHdzRm9ybWF0ID0geworICAgICAgTCJ0aW1leyIsIEZvcm1hdEZyb21TdHJpbmcocExvY2FsZSwgc3pGb3JtYXQpLkFzU3RyaW5nVmlldygpLCBMIn0ifTsKKyAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZShYRkFfVlRfVElNRSwgV2lkZVN0cmluZzo6RnJvbVVURjgoc3pUaW1lKSwgcE1ncik7CisgIFdpZGVTdHJpbmcgd3NSZXQ7CisgIHdpZGdldFZhbHVlLkZvcm1hdFBhdHRlcm5zKHdzUmV0LCB3c0Zvcm1hdCwgcExvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsKKyAgcmV0dXJuIHdzUmV0LlVURjhFbmNvZGUoKTsKK30KKworLy8gc3RhdGljCitpbnQzMl90IENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkRhdGVTdHJpbmcyTnVtKAorICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekRhdGVTdHJpbmcpIHsKKyAgaW50MzJfdCBpTGVuZ3RoID0gc3pEYXRlU3RyaW5nLkdldExlbmd0aCgpOworICBpbnQzMl90IGlZZWFyID0gMDsKKyAgaW50MzJfdCBpTW9udGggPSAwOworICBpbnQzMl90IGlEYXkgPSAwOworICBpZiAoaUxlbmd0aCA8PSAxMCkgeworICAgIGludDMyX3QgaVN0eWxlID0gLTE7CisgICAgaWYgKCFJc0lzb0RhdGVGb3JtYXQoc3pEYXRlU3RyaW5nLnVudGVybWluYXRlZF9jX3N0cigpLCBpTGVuZ3RoLCBpU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaVllYXIsIGlNb250aCwgaURheSkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpbnQzMl90IGlIb3VyID0gMDsKKyAgICBpbnQzMl90IGlNaW51dGUgPSAwOworICAgIGludDMyX3QgaVNlY29uZCA9IDA7CisgICAgaW50MzJfdCBpTWlsbGlTZWNvbmQgPSAwOworICAgIGludDMyX3QgaVpvbmVIb3VyID0gMDsKKyAgICBpbnQzMl90IGlab25lTWludXRlID0gMDsKKyAgICBpZiAoIUlzSXNvRGF0ZVRpbWVGb3JtYXQoc3pEYXRlU3RyaW5nLnVudGVybWluYXRlZF9jX3N0cigpLCBpTGVuZ3RoLCBpWWVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU1vbnRoLCBpRGF5LCBpSG91ciwgaU1pbnV0ZSwgaVNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU1pbGxpU2Vjb25kLCBpWm9uZUhvdXIsIGlab25lTWludXRlKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgZmxvYXQgZERheXMgPSAwOworICBpbnQzMl90IGkgPSAxOworICBpZiAoaVllYXIgPCAxOTAwKQorICAgIHJldHVybiAwOworCisgIHdoaWxlIChpWWVhciAtIGkgPj0gMTkwMCkgeworICAgIGREYXlzICs9CisgICAgICAgICgoISgoaVllYXIgLSBpKSAlIDQpICYmICgoaVllYXIgLSBpKSAlIDEwMCkpIHx8ICEoKGlZZWFyIC0gaSkgJSA0MDApKQorICAgICAgICAgICAgPyAzNjYKKyAgICAgICAgICAgIDogMzY1OworICAgICsraTsKKyAgfQorICBpID0gMTsKKyAgd2hpbGUgKGkgPCBpTW9udGgpIHsKKyAgICBpZiAoaSA9PSAyKQorICAgICAgZERheXMgKz0gKCghKGlZZWFyICUgNCkgJiYgKGlZZWFyICUgMTAwKSkgfHwgIShpWWVhciAlIDQwMCkpID8gMjkgOiAyODsKKyAgICBlbHNlIGlmIChpIDw9IDcpCisgICAgICBkRGF5cyArPSAoaSAlIDIgPT0gMCkgPyAzMCA6IDMxOworICAgIGVsc2UKKyAgICAgIGREYXlzICs9IChpICUgMiA9PSAwKSA/IDMxIDogMzA7CisKKyAgICArK2k7CisgIH0KKyAgaSA9IDA7CisgIHdoaWxlIChpRGF5IC0gaSA+IDApIHsKKyAgICBkRGF5cyArPSAxOworICAgICsraTsKKyAgfQorICByZXR1cm4gKGludDMyX3QpZERheXM7Cit9CisKKy8vIHN0YXRpYworQnl0ZVN0cmluZyBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpHZXRMb2NhbERhdGVGb3JtYXQoCisgICAgQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICBpbnQzMl90IGlTdHlsZSwKKyAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pMb2NhbGUsCisgICAgYm9vbCBiU3RhbmRhcmQpIHsKKyAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+R2V0RG9jdW1lbnQoKTsKKyAgaWYgKCFwRG9jKQorICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisKKyAgQ1hGQV9Mb2NhbGVNZ3IqIHBNZ3IgPSBwRG9jLT5HZXRMb2NhbE1ncigpOworICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gTG9jYWxlRnJvbVN0cmluZyhwRG9jLCBwTWdyLCBzekxvY2FsZSk7CisgIGlmICghcExvY2FsZSkKKyAgICByZXR1cm4gQnl0ZVN0cmluZygpOworCisgIFdpZGVTdHJpbmcgc3RyUmV0ID0gcExvY2FsZS0+R2V0RGF0ZVBhdHRlcm4oU3ViQ2F0ZWdvcnlGcm9tSW50KGlTdHlsZSkpOworICBpZiAoIWJTdGFuZGFyZCkgeworICAgIEFsdGVybmF0ZURhdGVUaW1lU3ltYm9scyhzdHJSZXQsIHBMb2NhbGUtPkdldERhdGVUaW1lU3ltYm9scygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX3NBbHRUYWJsZV9EYXRlKTsKKyAgfQorICByZXR1cm4gc3RyUmV0LlVURjhFbmNvZGUoKTsKK30KKworLy8gc3RhdGljCitCeXRlU3RyaW5nIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkdldExvY2FsVGltZUZvcm1hdCgKKyAgICBDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgIGludDMyX3QgaVN0eWxlLAorICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekxvY2FsZSwKKyAgICBib29sIGJTdGFuZGFyZCkgeworICBDWEZBX0RvY3VtZW50KiBwRG9jID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5HZXREb2N1bWVudCgpOworICBpZiAoIXBEb2MpCisgICAgcmV0dXJuIEJ5dGVTdHJpbmcoKTsKKworICBDWEZBX0xvY2FsZU1nciogcE1nciA9IHBEb2MtPkdldExvY2FsTWdyKCk7CisgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBMb2NhbGVGcm9tU3RyaW5nKHBEb2MsIHBNZ3IsIHN6TG9jYWxlKTsKKyAgaWYgKCFwTG9jYWxlKQorICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisKKyAgV2lkZVN0cmluZyBzdHJSZXQgPSBwTG9jYWxlLT5HZXRUaW1lUGF0dGVybihTdWJDYXRlZ29yeUZyb21JbnQoaVN0eWxlKSk7CisgIGlmICghYlN0YW5kYXJkKSB7CisgICAgQWx0ZXJuYXRlRGF0ZVRpbWVTeW1ib2xzKHN0clJldCwgcExvY2FsZS0+R2V0RGF0ZVRpbWVTeW1ib2xzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfc0FsdFRhYmxlX1RpbWUpOworICB9CisgIHJldHVybiBzdHJSZXQuVVRGOEVuY29kZSgpOworfQorCisvLyBzdGF0aWMKK0J5dGVTdHJpbmcgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6R2V0U3RhbmRhcmREYXRlRm9ybWF0KAorICAgIENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgaW50MzJfdCBpU3R5bGUsCisgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6TG9jYWxTdHIpIHsKKyAgcmV0dXJuIEdldExvY2FsRGF0ZUZvcm1hdChwVGhpcywgaVN0eWxlLCBzekxvY2FsU3RyLCB0cnVlKTsKK30KKworLy8gc3RhdGljCitCeXRlU3RyaW5nIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkdldFN0YW5kYXJkVGltZUZvcm1hdCgKKyAgICBDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgIGludDMyX3QgaVN0eWxlLAorICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekxvY2FsU3RyKSB7CisgIHJldHVybiBHZXRMb2NhbFRpbWVGb3JtYXQocFRoaXMsIGlTdHlsZSwgc3pMb2NhbFN0ciwgdHJ1ZSk7Cit9CisKKy8vIHN0YXRpYworQnl0ZVN0cmluZyBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpOdW0yQWxsVGltZShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiR00pIHsKKyAgaW50MzJfdCBpSG91ciA9IDA7CisgIGludDMyX3QgaU1pbiA9IDA7CisgIGludDMyX3QgaVNlYyA9IDA7CisgIGlIb3VyID0gc3RhdGljX2Nhc3Q8aW50PihpVGltZSkgLyAzNjAwMDAwOworICBpTWluID0gKHN0YXRpY19jYXN0PGludD4oaVRpbWUpIC0gaUhvdXIgKiAzNjAwMDAwKSAvIDYwMDAwOworICBpU2VjID0gKHN0YXRpY19jYXN0PGludD4oaVRpbWUpIC0gaUhvdXIgKiAzNjAwMDAwIC0gaU1pbiAqIDYwMDAwKSAvIDEwMDA7CisKKyAgaWYgKCFiR00pIHsKKyAgICBpbnQzMl90IGlab25lSG91ciA9IDA7CisgICAgaW50MzJfdCBpWm9uZU1pbiA9IDA7CisgICAgaW50MzJfdCBpWm9uZVNlYyA9IDA7CisgICAgR2V0TG9jYWxUaW1lWm9uZShpWm9uZUhvdXIsIGlab25lTWluLCBpWm9uZVNlYyk7CisgICAgaUhvdXIgKz0gaVpvbmVIb3VyOworICAgIGlNaW4gKz0gaVpvbmVNaW47CisgICAgaVNlYyArPSBpWm9uZVNlYzsKKyAgfQorCisgIHJldHVybiBJc29UaW1lMkxvY2FsKAorICAgICAgcFRoaXMsCisgICAgICBCeXRlU3RyaW5nOjpGb3JtYXQoIiUwMmQ6JTAyZDolMDJkIiwgaUhvdXIsIGlNaW4sIGlTZWMpLkFzU3RyaW5nVmlldygpLAorICAgICAgc3pGb3JtYXQsIHN6TG9jYWxlKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkdldExvY2FsVGltZVpvbmUoaW50MzJfdCYgaUhvdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpU2VjKSB7CisgIHRpbWVfdCBub3c7CisgIHRpbWUoJm5vdyk7CisKKyAgc3RydWN0IHRtKiBwR210ID0gZ210aW1lKCZub3cpOworICBzdHJ1Y3QgdG0qIHBMb2NhbCA9IGxvY2FsdGltZSgmbm93KTsKKyAgaUhvdXIgPSBwTG9jYWwtPnRtX2hvdXIgLSBwR210LT50bV9ob3VyOworICBpTWluID0gcExvY2FsLT50bV9taW4gLSBwR210LT50bV9taW47CisgIGlTZWMgPSBwTG9jYWwtPnRtX3NlYyAtIHBHbXQtPnRtX3NlYzsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkFwcihDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOworICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAzKSB7CisgICAgcENvbnRleHQtPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiQXByIik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdUd28gPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1RocmVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDIpOworICBpZiAoVmFsdWVJc051bGwocFRoaXMsIGFyZ09uZS5nZXQoKSkgfHwgVmFsdWVJc051bGwocFRoaXMsIGFyZ1R3by5nZXQoKSkgfHwKKyAgICAgIFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdUaHJlZS5nZXQoKSkpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICByZXR1cm47CisgIH0KKworICBkb3VibGUgblByaW5jaXBhbCA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ09uZS5nZXQoKSk7CisgIGRvdWJsZSBuUGF5bWVudCA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ1R3by5nZXQoKSk7CisgIGRvdWJsZSBuUGVyaW9kcyA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ1RocmVlLmdldCgpKTsKKyAgaWYgKG5QcmluY2lwYWwgPD0gMCB8fCBuUGF5bWVudCA8PSAwIHx8IG5QZXJpb2RzIDw9IDApIHsKKyAgICBwQ29udGV4dC0+VGhyb3dBcmd1bWVudE1pc21hdGNoRXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZG91YmxlIHIgPSAyICogKG5QZXJpb2RzICogblBheW1lbnQgLSBuUHJpbmNpcGFsKSAvIChuUGVyaW9kcyAqIG5QcmluY2lwYWwpOworICBkb3VibGUgblRlbXAgPSAxOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuUGVyaW9kczsgKytpKQorICAgIG5UZW1wICo9ICgxICsgcik7CisKKyAgZG91YmxlIG5SZXQgPSByICogblRlbXAgLyAoblRlbXAgLSAxKSAtIG5QYXltZW50IC8gblByaW5jaXBhbDsKKyAgd2hpbGUgKGZhYnMoblJldCkgPiBrRmluYW5jaWFsUHJlY2lzaW9uKSB7CisgICAgZG91YmxlIG5EZXJpdmF0aXZlID0KKyAgICAgICAgKChuVGVtcCArIHIgKiBuUGVyaW9kcyAqIChuVGVtcCAvICgxICsgcikpKSAqIChuVGVtcCAtIDEpIC0KKyAgICAgICAgIChyICogblRlbXAgKiBuUGVyaW9kcyAqIChuVGVtcCAvICgxICsgcikpKSkgLworICAgICAgICAoKG5UZW1wIC0gMSkgKiAoblRlbXAgLSAxKSk7CisgICAgaWYgKG5EZXJpdmF0aXZlID09IDApIHsKKyAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHIgPSByIC0gblJldCAvIG5EZXJpdmF0aXZlOworICAgIG5UZW1wID0gMTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuUGVyaW9kczsgKytpKSB7CisgICAgICBuVGVtcCAqPSAoMSArIHIpOworICAgIH0KKyAgICBuUmV0ID0gciAqIG5UZW1wIC8gKG5UZW1wIC0gMSkgLSBuUGF5bWVudCAvIG5QcmluY2lwYWw7CisgIH0KKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXREb3VibGUociAqIDEyKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkNUZXJtKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOworICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAzKSB7CisgICAgcENvbnRleHQtPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiQ1Rlcm0iKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1R3byA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVGhyZWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMik7CisgIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgYXJnT25lLmdldCgpKSB8fCBWYWx1ZUlzTnVsbChwVGhpcywgYXJnVHdvLmdldCgpKSB8fAorICAgICAgVmFsdWVJc051bGwocFRoaXMsIGFyZ1RocmVlLmdldCgpKSkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgIHJldHVybjsKKyAgfQorCisgIGZsb2F0IG5SYXRlID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdPbmUuZ2V0KCkpOworICBmbG9hdCBuRnV0dXJlVmFsdWUgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ1R3by5nZXQoKSk7CisgIGZsb2F0IG5Jbml0QW1vdW50ID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdUaHJlZS5nZXQoKSk7CisgIGlmICgoblJhdGUgPD0gMCkgfHwgKG5GdXR1cmVWYWx1ZSA8PSAwKSB8fCAobkluaXRBbW91bnQgPD0gMCkpIHsKKyAgICBwQ29udGV4dC0+VGhyb3dBcmd1bWVudE1pc21hdGNoRXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRGbG9hdChsb2coKGZsb2F0KShuRnV0dXJlVmFsdWUgLyBuSW5pdEFtb3VudCkpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coKGZsb2F0KSgxICsgblJhdGUpKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpGVihDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBDRlhKU0VfRm9ybUNhbGNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMykgeworICAgIHBDb250ZXh0LT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIkZWIik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdUd28gPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1RocmVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDIpOworICBpZiAoVmFsdWVJc051bGwocFRoaXMsIGFyZ09uZS5nZXQoKSkgfHwgVmFsdWVJc051bGwocFRoaXMsIGFyZ1R3by5nZXQoKSkgfHwKKyAgICAgIFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdUaHJlZS5nZXQoKSkpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICByZXR1cm47CisgIH0KKworICBkb3VibGUgbkFtb3VudCA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ09uZS5nZXQoKSk7CisgIGRvdWJsZSBuUmF0ZSA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ1R3by5nZXQoKSk7CisgIGRvdWJsZSBuUGVyaW9kID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnVGhyZWUuZ2V0KCkpOworICBpZiAoKG5SYXRlIDwgMCkgfHwgKG5QZXJpb2QgPD0gMCkgfHwgKG5BbW91bnQgPD0gMCkpIHsKKyAgICBwQ29udGV4dC0+VGhyb3dBcmd1bWVudE1pc21hdGNoRXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZG91YmxlIGRSZXN1bHQgPSAwOworICBpZiAoblJhdGUpIHsKKyAgICBkb3VibGUgblRlbXAgPSAxOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgblBlcmlvZDsgKytpKSB7CisgICAgICBuVGVtcCAqPSAxICsgblJhdGU7CisgICAgfQorICAgIGRSZXN1bHQgPSBuQW1vdW50ICogKG5UZW1wIC0gMSkgLyBuUmF0ZTsKKyAgfSBlbHNlIHsKKyAgICBkUmVzdWx0ID0gbkFtb3VudCAqIG5QZXJpb2Q7CisgIH0KKworICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldERvdWJsZShkUmVzdWx0KTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OklQbXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOworICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSA1KSB7CisgICAgcENvbnRleHQtPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiSVBtdCIpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVHdvID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdUaHJlZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAyKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnRm91ciA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAzKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnRml2ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCA0KTsKKyAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdPbmUuZ2V0KCkpIHx8IFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdUd28uZ2V0KCkpIHx8CisgICAgICBWYWx1ZUlzTnVsbChwVGhpcywgYXJnVGhyZWUuZ2V0KCkpIHx8IFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdGb3VyLmdldCgpKSB8fAorICAgICAgVmFsdWVJc051bGwocFRoaXMsIGFyZ0ZpdmUuZ2V0KCkpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZmxvYXQgblByaW5jaXBhbEFtb3VudCA9IFZhbHVlVG9GbG9hdChwVGhpcywgYXJnT25lLmdldCgpKTsKKyAgZmxvYXQgblJhdGUgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ1R3by5nZXQoKSk7CisgIGZsb2F0IG5QYXltZW50ID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdUaHJlZS5nZXQoKSk7CisgIGZsb2F0IG5GaXJzdE1vbnRoID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdGb3VyLmdldCgpKTsKKyAgZmxvYXQgbk51bWJlck9mTW9udGhzID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdGaXZlLmdldCgpKTsKKyAgaWYgKChuUHJpbmNpcGFsQW1vdW50IDw9IDApIHx8IChuUmF0ZSA8PSAwKSB8fCAoblBheW1lbnQgPD0gMCkgfHwKKyAgICAgIChuRmlyc3RNb250aCA8IDApIHx8IChuTnVtYmVyT2ZNb250aHMgPCAwKSkgeworICAgIHBDb250ZXh0LT5UaHJvd0FyZ3VtZW50TWlzbWF0Y2hFeGNlcHRpb24oKTsKKyAgICByZXR1cm47CisgIH0KKworICBmbG9hdCBuUmF0ZU9mTW9udGggPSBuUmF0ZSAvIDEyOworICBpbnQzMl90IGlOdW1zID0KKyAgICAgIChpbnQzMl90KSgobG9nMTAoKGZsb2F0KShuUGF5bWVudCAvIG5QcmluY2lwYWxBbW91bnQpKSAtCisgICAgICAgICAgICAgICAgIGxvZzEwKChmbG9hdCkoblBheW1lbnQgLyBuUHJpbmNpcGFsQW1vdW50IC0gblJhdGVPZk1vbnRoKSkpIC8KKyAgICAgICAgICAgICAgICBsb2cxMCgoZmxvYXQpKDEgKyBuUmF0ZU9mTW9udGgpKSk7CisgIGludDMyX3QgaUVuZCA9IHN0ZDo6bWluKChpbnQzMl90KShuRmlyc3RNb250aCArIG5OdW1iZXJPZk1vbnRocyAtIDEpLCBpTnVtcyk7CisKKyAgaWYgKG5QYXltZW50IDwgblByaW5jaXBhbEFtb3VudCAqIG5SYXRlT2ZNb250aCkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0RmxvYXQoMCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaW50MzJfdCBpID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IG5GaXJzdE1vbnRoIC0gMTsgKytpKQorICAgIG5QcmluY2lwYWxBbW91bnQgLT0gblBheW1lbnQgLSBuUHJpbmNpcGFsQW1vdW50ICogblJhdGVPZk1vbnRoOworCisgIGZsb2F0IG5TdW0gPSAwOworICBmb3IgKDsgaSA8IGlFbmQ7ICsraSkgeworICAgIG5TdW0gKz0gblByaW5jaXBhbEFtb3VudCAqIG5SYXRlT2ZNb250aDsKKyAgICBuUHJpbmNpcGFsQW1vdW50IC09IG5QYXltZW50IC0gblByaW5jaXBhbEFtb3VudCAqIG5SYXRlT2ZNb250aDsKKyAgfQorICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEZsb2F0KG5TdW0pOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6TlBWKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dCogcENvbnRleHQgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cik7CisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7CisgIGlmIChhcmdjIDwgMykgeworICAgIHBDb250ZXh0LT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIk5QViIpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+PiBhcmdWYWx1ZXM7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworICAgIGFyZ1ZhbHVlcy5wdXNoX2JhY2soR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIGkpKTsKKyAgICBpZiAoVmFsdWVJc051bGwocFRoaXMsIGFyZ1ZhbHVlc1tpXS5nZXQoKSkpIHsKKyAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIGRvdWJsZSBuUmF0ZSA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ1ZhbHVlc1swXS5nZXQoKSk7CisgIGlmIChuUmF0ZSA8PSAwKSB7CisgICAgcENvbnRleHQtPlRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gZGF0YShhcmdjIC0gMSk7CisgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IGFyZ2M7IGkrKykKKyAgICBkYXRhLnB1c2hfYmFjayhWYWx1ZVRvRG91YmxlKHBUaGlzLCBhcmdWYWx1ZXNbaV0uZ2V0KCkpKTsKKworICBkb3VibGUgblN1bSA9IDA7CisgIGludDMyX3QgaUluZGV4ID0gMDsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJnYyAtIDE7IGkrKykgeworICAgIGRvdWJsZSBuVGVtcCA9IDE7CisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDw9IGk7IGorKykKKyAgICAgIG5UZW1wICo9IDEgKyBuUmF0ZTsKKworICAgIGRvdWJsZSBuTnVtID0gZGF0YVtpSW5kZXgrK107CisgICAgblN1bSArPSBuTnVtIC8gblRlbXA7CisgIH0KKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXREb3VibGUoblN1bSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpQbXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBDRlhKU0VfRm9ybUNhbGNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMykgeworICAgIHBDb250ZXh0LT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIlBtdCIpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVHdvID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdUaHJlZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAyKTsKKyAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdPbmUuZ2V0KCkpIHx8IFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdUd28uZ2V0KCkpIHx8CisgICAgICBWYWx1ZUlzTnVsbChwVGhpcywgYXJnVGhyZWUuZ2V0KCkpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZmxvYXQgblByaW5jaXBhbCA9IFZhbHVlVG9GbG9hdChwVGhpcywgYXJnT25lLmdldCgpKTsKKyAgZmxvYXQgblJhdGUgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ1R3by5nZXQoKSk7CisgIGZsb2F0IG5QZXJpb2RzID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdUaHJlZS5nZXQoKSk7CisgIGlmICgoblByaW5jaXBhbCA8PSAwKSB8fCAoblJhdGUgPD0gMCkgfHwgKG5QZXJpb2RzIDw9IDApKSB7CisgICAgcENvbnRleHQtPlRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorCisgIGZsb2F0IG5UbXAgPSAxICsgblJhdGU7CisgIGZsb2F0IG5TdW0gPSBuVG1wOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuUGVyaW9kcyAtIDE7ICsraSkKKyAgICBuU3VtICo9IG5UbXA7CisKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRGbG9hdCgoblByaW5jaXBhbCAqIG5SYXRlICogblN1bSkgLyAoblN1bSAtIDEpKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlBQbXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOworICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSA1KSB7CisgICAgcENvbnRleHQtPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiUFBtdCIpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVHdvID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdUaHJlZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAyKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnRm91ciA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAzKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnRml2ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCA0KTsKKyAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdPbmUuZ2V0KCkpIHx8IFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdUd28uZ2V0KCkpIHx8CisgICAgICBWYWx1ZUlzTnVsbChwVGhpcywgYXJnVGhyZWUuZ2V0KCkpIHx8IFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdGb3VyLmdldCgpKSB8fAorICAgICAgVmFsdWVJc051bGwocFRoaXMsIGFyZ0ZpdmUuZ2V0KCkpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZmxvYXQgblByaW5jaXBhbEFtb3VudCA9IFZhbHVlVG9GbG9hdChwVGhpcywgYXJnT25lLmdldCgpKTsKKyAgZmxvYXQgblJhdGUgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ1R3by5nZXQoKSk7CisgIGZsb2F0IG5QYXltZW50ID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdUaHJlZS5nZXQoKSk7CisgIGZsb2F0IG5GaXJzdE1vbnRoID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdGb3VyLmdldCgpKTsKKyAgZmxvYXQgbk51bWJlck9mTW9udGhzID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdGaXZlLmdldCgpKTsKKyAgaWYgKChuUHJpbmNpcGFsQW1vdW50IDw9IDApIHx8IChuUmF0ZSA8PSAwKSB8fCAoblBheW1lbnQgPD0gMCkgfHwKKyAgICAgIChuRmlyc3RNb250aCA8IDApIHx8IChuTnVtYmVyT2ZNb250aHMgPCAwKSkgeworICAgIHBDb250ZXh0LT5UaHJvd0FyZ3VtZW50TWlzbWF0Y2hFeGNlcHRpb24oKTsKKyAgICByZXR1cm47CisgIH0KKworICBmbG9hdCBuUmF0ZU9mTW9udGggPSBuUmF0ZSAvIDEyOworICBpbnQzMl90IGlOdW1zID0KKyAgICAgIChpbnQzMl90KSgobG9nMTAoKGZsb2F0KShuUGF5bWVudCAvIG5QcmluY2lwYWxBbW91bnQpKSAtCisgICAgICAgICAgICAgICAgIGxvZzEwKChmbG9hdCkoblBheW1lbnQgLyBuUHJpbmNpcGFsQW1vdW50IC0gblJhdGVPZk1vbnRoKSkpIC8KKyAgICAgICAgICAgICAgICBsb2cxMCgoZmxvYXQpKDEgKyBuUmF0ZU9mTW9udGgpKSk7CisgIGludDMyX3QgaUVuZCA9IHN0ZDo6bWluKChpbnQzMl90KShuRmlyc3RNb250aCArIG5OdW1iZXJPZk1vbnRocyAtIDEpLCBpTnVtcyk7CisgIGlmIChuUGF5bWVudCA8IG5QcmluY2lwYWxBbW91bnQgKiBuUmF0ZU9mTW9udGgpIHsKKyAgICBwQ29udGV4dC0+VGhyb3dBcmd1bWVudE1pc21hdGNoRXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaW50MzJfdCBpID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IG5GaXJzdE1vbnRoIC0gMTsgKytpKQorICAgIG5QcmluY2lwYWxBbW91bnQgLT0gblBheW1lbnQgLSBuUHJpbmNpcGFsQW1vdW50ICogblJhdGVPZk1vbnRoOworCisgIGZsb2F0IG5UZW1wID0gMDsKKyAgZmxvYXQgblN1bSA9IDA7CisgIGZvciAoOyBpIDwgaUVuZDsgKytpKSB7CisgICAgblRlbXAgPSBuUGF5bWVudCAtIG5QcmluY2lwYWxBbW91bnQgKiBuUmF0ZU9mTW9udGg7CisgICAgblN1bSArPSBuVGVtcDsKKyAgICBuUHJpbmNpcGFsQW1vdW50IC09IG5UZW1wOworICB9CisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0RmxvYXQoblN1bSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpQVihDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBDRlhKU0VfRm9ybUNhbGNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMykgeworICAgIHBDb250ZXh0LT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIlBWIik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdUd28gPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1RocmVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDIpOworICBpZiAoVmFsdWVJc051bGwocFRoaXMsIGFyZ09uZS5nZXQoKSkgfHwgVmFsdWVJc051bGwocFRoaXMsIGFyZ1R3by5nZXQoKSkgfHwKKyAgICAgIFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdUaHJlZS5nZXQoKSkpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICByZXR1cm47CisgIH0KKworICBkb3VibGUgbkFtb3VudCA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ09uZS5nZXQoKSk7CisgIGRvdWJsZSBuUmF0ZSA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ1R3by5nZXQoKSk7CisgIGRvdWJsZSBuUGVyaW9kID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnVGhyZWUuZ2V0KCkpOworICBpZiAoKG5BbW91bnQgPD0gMCkgfHwgKG5SYXRlIDwgMCkgfHwgKG5QZXJpb2QgPD0gMCkpIHsKKyAgICBwQ29udGV4dC0+VGhyb3dBcmd1bWVudE1pc21hdGNoRXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZG91YmxlIG5UZW1wID0gMTsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgblBlcmlvZDsgKytpKQorICAgIG5UZW1wICo9IDEgKyBuUmF0ZTsKKworICBuVGVtcCA9IDEgLyBuVGVtcDsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXREb3VibGUobkFtb3VudCAqICgoMSAtIG5UZW1wKSAvIG5SYXRlKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpSYXRlKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBDRlhKU0VfRm9ybUNhbGNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMykgeworICAgIHBDb250ZXh0LT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIlJhdGUiKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1R3byA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVGhyZWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMik7CisgIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgYXJnT25lLmdldCgpKSB8fCBWYWx1ZUlzTnVsbChwVGhpcywgYXJnVHdvLmdldCgpKSB8fAorICAgICAgVmFsdWVJc051bGwocFRoaXMsIGFyZ1RocmVlLmdldCgpKSkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgIHJldHVybjsKKyAgfQorCisgIGZsb2F0IG5GdXR1cmUgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ09uZS5nZXQoKSk7CisgIGZsb2F0IG5QcmVzZW50ID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdUd28uZ2V0KCkpOworICBmbG9hdCBuVG90YWxOdW1iZXIgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ1RocmVlLmdldCgpKTsKKyAgaWYgKChuRnV0dXJlIDw9IDApIHx8IChuUHJlc2VudCA8IDApIHx8IChuVG90YWxOdW1iZXIgPD0gMCkpIHsKKyAgICBwQ29udGV4dC0+VGhyb3dBcmd1bWVudE1pc21hdGNoRXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRGbG9hdCgKKyAgICAgIEZYU1lTX3BvdygoZmxvYXQpKG5GdXR1cmUgLyBuUHJlc2VudCksIChmbG9hdCkoMSAvIG5Ub3RhbE51bWJlcikpIC0gMSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpUZXJtKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBDRlhKU0VfRm9ybUNhbGNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMykgeworICAgIHBDb250ZXh0LT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIlRlcm0iKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1R3byA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVGhyZWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMik7CisgIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgYXJnT25lLmdldCgpKSB8fCBWYWx1ZUlzTnVsbChwVGhpcywgYXJnVHdvLmdldCgpKSB8fAorICAgICAgVmFsdWVJc051bGwocFRoaXMsIGFyZ1RocmVlLmdldCgpKSkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgIHJldHVybjsKKyAgfQorCisgIGZsb2F0IG5Nb3VudCA9IFZhbHVlVG9GbG9hdChwVGhpcywgYXJnT25lLmdldCgpKTsKKyAgZmxvYXQgblJhdGUgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ1R3by5nZXQoKSk7CisgIGZsb2F0IG5GdXR1cmUgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ1RocmVlLmdldCgpKTsKKyAgaWYgKChuTW91bnQgPD0gMCkgfHwgKG5SYXRlIDw9IDApIHx8IChuRnV0dXJlIDw9IDApKSB7CisgICAgcENvbnRleHQtPlRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorCisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0RmxvYXQobG9nKChmbG9hdCkobkZ1dHVyZSAvIG5Nb3VudCAqIG5SYXRlKSArIDEpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coKGZsb2F0KSgxICsgblJhdGUpKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpDaG9vc2UoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBDRlhKU0VfRm9ybUNhbGNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKKyAgaWYgKGFyZ2MgPCAyKSB7CisgICAgcENvbnRleHQtPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiQ2hvb3NlIik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gYXJncy5HZXRWYWx1ZSgwKTsKKyAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdPbmUuZ2V0KCkpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaW50MzJfdCBpSW5kZXggPSAoaW50MzJfdClWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ09uZS5nZXQoKSk7CisgIGlmIChpSW5kZXggPCAxKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoIiIpOworICAgIHJldHVybjsKKyAgfQorCisgIGJvb2wgYkZvdW5kID0gZmFsc2U7CisgIGJvb2wgYlN0b3BDb3VudGVyRmxhZ3MgPSBmYWxzZTsKKyAgaW50MzJfdCBpQXJnSW5kZXggPSAxOworICBpbnQzMl90IGlWYWx1ZUluZGV4ID0gMDsKKyAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsKKyAgd2hpbGUgKCFiRm91bmQgJiYgIWJTdG9wQ291bnRlckZsYWdzICYmIChpQXJnSW5kZXggPCBhcmdjKSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ0luZGV4VmFsdWUgPSBhcmdzLkdldFZhbHVlKGlBcmdJbmRleCk7CisgICAgaWYgKGFyZ0luZGV4VmFsdWUtPklzQXJyYXkoKSkgeworICAgICAgYXV0byBsZW5ndGhWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICAgIGFyZ0luZGV4VmFsdWUtPkdldE9iamVjdFByb3BlcnR5KCJsZW5ndGgiLCBsZW5ndGhWYWx1ZS5nZXQoKSk7CisgICAgICBpbnQzMl90IGlMZW5ndGggPSBsZW5ndGhWYWx1ZS0+VG9JbnRlZ2VyKCk7CisgICAgICBpZiAoaUxlbmd0aCA+IDMpCisgICAgICAgIGJTdG9wQ291bnRlckZsYWdzID0gdHJ1ZTsKKworICAgICAgaVZhbHVlSW5kZXggKz0gKGlMZW5ndGggLSAyKTsKKyAgICAgIGlmIChpVmFsdWVJbmRleCA+PSBpSW5kZXgpIHsKKyAgICAgICAgYXV0byBwcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICAgICAgICBhdXRvIGpzT2JqZWN0VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgICAgICAgIGF1dG8gbmV3UHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICAgICAgYXJnSW5kZXhWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgxLCBwcm9wZXJ0eVZhbHVlLmdldCgpKTsKKyAgICAgICAgYXJnSW5kZXhWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgKKyAgICAgICAgICAgIChpTGVuZ3RoIC0gMSkgLSAoaVZhbHVlSW5kZXggLSBpSW5kZXgpLCBqc09iamVjdFZhbHVlLmdldCgpKTsKKyAgICAgICAgaWYgKHByb3BlcnR5VmFsdWUtPklzTnVsbCgpKSB7CisgICAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzT2JqZWN0VmFsdWUuZ2V0KCksIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGpzT2JqZWN0VmFsdWUtPkdldE9iamVjdFByb3BlcnR5KAorICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLT5Ub1N0cmluZygpLkFzU3RyaW5nVmlldygpLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKKyAgICAgICAgfQorICAgICAgICBCeXRlU3RyaW5nIGJzQ2hvc2VuID0gVmFsdWVUb1VURjhTdHJpbmcobmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7CisgICAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKGJzQ2hvc2VuLkFzU3RyaW5nVmlldygpKTsKKyAgICAgICAgYkZvdW5kID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaVZhbHVlSW5kZXgrKzsKKyAgICAgIGlmIChpVmFsdWVJbmRleCA9PSBpSW5kZXgpIHsKKyAgICAgICAgQnl0ZVN0cmluZyBic0Nob3NlbiA9IFZhbHVlVG9VVEY4U3RyaW5nKGFyZ0luZGV4VmFsdWUuZ2V0KCkpOworICAgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZyhic0Nob3Nlbi5Bc1N0cmluZ1ZpZXcoKSk7CisgICAgICAgIGJGb3VuZCA9IHRydWU7CisgICAgICB9CisgICAgfQorICAgIGlBcmdJbmRleCsrOworICB9CisgIGlmICghYkZvdW5kKQorICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKCIiKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkV4aXN0cyhDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDEpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiRXhpc3RzIik7CisgICAgcmV0dXJuOworICB9CisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcihhcmdzLkdldFZhbHVlKDApLT5Jc09iamVjdCgpKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6Okhhc1ZhbHVlKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDEpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiSGFzVmFsdWUiKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIGlmICghYXJnT25lLT5Jc1N0cmluZygpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKGFyZ09uZS0+SXNOdW1iZXIoKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdPbmUtPklzQm9vbGVhbigpKTsKKyAgICByZXR1cm47CisgIH0KKworICBCeXRlU3RyaW5nIHZhbHVlU3RyID0gYXJnT25lLT5Ub1N0cmluZygpOworICB2YWx1ZVN0ci5UcmltTGVmdCgpOworICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoIXZhbHVlU3RyLklzRW1wdHkoKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpPbmVvZihDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpZiAoYXJncy5HZXRMZW5ndGgoKSA8IDIpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiT25lb2YiKTsKKyAgICByZXR1cm47CisgIH0KKworICBib29sIGJGbGFncyA9IGZhbHNlOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+PiBwYXJhbWV0ZXJWYWx1ZXM7CisgIHVuZm9sZEFyZ3MocFRoaXMsIGFyZ3MsICZwYXJhbWV0ZXJWYWx1ZXMsIDEpOworICBmb3IgKGNvbnN0IGF1dG8mIHZhbHVlIDogcGFyYW1ldGVyVmFsdWVzKSB7CisgICAgaWYgKHNpbXBsZVZhbHVlQ29tcGFyZShwVGhpcywgYXJnT25lLmdldCgpLCB2YWx1ZS5nZXQoKSkpIHsKKyAgICAgIGJGbGFncyA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoYkZsYWdzKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OldpdGhpbihDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDMpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiV2l0aGluIik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICBpZiAoYXJnT25lLT5Jc051bGwoKSkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0VW5kZWZpbmVkKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnTG93ID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdIaWdoID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDIpOworICBpZiAoYXJnT25lLT5Jc051bWJlcigpKSB7CisgICAgZmxvYXQgb25lTnVtYmVyID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdPbmUuZ2V0KCkpOworICAgIGZsb2F0IGxvd051bWJlciA9IFZhbHVlVG9GbG9hdChwVGhpcywgYXJnTG93LmdldCgpKTsKKyAgICBmbG9hdCBoZWlnaHROdW1iZXIgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ0hpZ2guZ2V0KCkpOworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcigob25lTnVtYmVyID49IGxvd051bWJlcikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uZU51bWJlciA8PSBoZWlnaHROdW1iZXIpKTsKKyAgICByZXR1cm47CisgIH0KKworICBCeXRlU3RyaW5nIG9uZVN0cmluZyA9IFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZS5nZXQoKSk7CisgIEJ5dGVTdHJpbmcgbG93U3RyaW5nID0gVmFsdWVUb1VURjhTdHJpbmcoYXJnTG93LmdldCgpKTsKKyAgQnl0ZVN0cmluZyBoZWlnaHRTdHJpbmcgPSBWYWx1ZVRvVVRGOFN0cmluZyhhcmdIaWdoLmdldCgpKTsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKAorICAgICAgKG9uZVN0cmluZy5Db21wYXJlKGxvd1N0cmluZy5Bc1N0cmluZ1ZpZXcoKSkgPj0gMCkgJiYKKyAgICAgIChvbmVTdHJpbmcuQ29tcGFyZShoZWlnaHRTdHJpbmcuQXNTdHJpbmdWaWV3KCkpIDw9IDApKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OklmKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDMpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiSWYiKTsKKyAgICByZXR1cm47CisgIH0KKworICBhcmdzLkdldFJldHVyblZhbHVlKCktPkFzc2lnbihHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCktPlRvQm9vbGVhbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKS5nZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMikuZ2V0KCkpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6RXZhbChDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dCogcENvbnRleHQgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cik7CisgIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDEpIHsKKyAgICBwQ29udGV4dC0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJFdmFsIik7CisgICAgcmV0dXJuOworICB9CisKKyAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gc2NyaXB0VmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIEJ5dGVTdHJpbmcgdXRmOFNjcmlwdFN0cmluZyA9IFZhbHVlVG9VVEY4U3RyaW5nKHNjcmlwdFZhbHVlLmdldCgpKTsKKyAgaWYgKHV0ZjhTY3JpcHRTdHJpbmcuSXNFbXB0eSgpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgQ0ZYX1dpZGVUZXh0QnVmIHdzSmF2YVNjcmlwdEJ1ZjsKKyAgaWYgKCFDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpUcmFuc2xhdGUoCisgICAgICAgICAgV2lkZVN0cmluZzo6RnJvbVVURjgodXRmOFNjcmlwdFN0cmluZy5Bc1N0cmluZ1ZpZXcoKSkuQXNTdHJpbmdWaWV3KCksCisgICAgICAgICAgJndzSmF2YVNjcmlwdEJ1ZikpIHsKKyAgICBwQ29udGV4dC0+VGhyb3dDb21waWxlckVycm9yRXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9Db250ZXh0PiBwTmV3Q29udGV4dCgKKyAgICAgIENGWEpTRV9Db250ZXh0OjpDcmVhdGUocElzb2xhdGUsIG51bGxwdHIsIG51bGxwdHIpKTsKKworICBhdXRvIHJldHVyblZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICBwTmV3Q29udGV4dC0+RXhlY3V0ZVNjcmlwdCgKKyAgICAgIEZYX1VURjhFbmNvZGUod3NKYXZhU2NyaXB0QnVmLkFzU3RyaW5nVmlldygpKS5jX3N0cigpLCByZXR1cm5WYWx1ZS5nZXQoKSk7CisKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5Bc3NpZ24ocmV0dXJuVmFsdWUuZ2V0KCkpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6UmVmKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dCogcENvbnRleHQgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cik7CisgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7CisgIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDEpIHsKKyAgICBwQ29udGV4dC0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJSZWYiKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOworICBpZiAoIWFyZ09uZS0+SXNBcnJheSgpICYmICFhcmdPbmUtPklzT2JqZWN0KCkgJiYgIWFyZ09uZS0+SXNCb29sZWFuKCkgJiYKKyAgICAgICFhcmdPbmUtPklzU3RyaW5nKCkgJiYgIWFyZ09uZS0+SXNOdWxsKCkgJiYgIWFyZ09uZS0+SXNOdW1iZXIoKSkgeworICAgIHBDb250ZXh0LT5UaHJvd0FyZ3VtZW50TWlzbWF0Y2hFeGNlcHRpb24oKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoYXJnT25lLT5Jc0Jvb2xlYW4oKSB8fCBhcmdPbmUtPklzU3RyaW5nKCkgfHwgYXJnT25lLT5Jc051bWJlcigpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5Bc3NpZ24oYXJnT25lLmdldCgpKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPj4gdmFsdWVzOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzOyBpKyspCisgICAgdmFsdWVzLnB1c2hfYmFjayhwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSkpOworCisgIGludCBpbnRWYWwgPSAzOworICBpZiAoYXJnT25lLT5Jc051bGwoKSkgeworICAgIC8vIFRPRE8oZHNpbmNsYWlyKTogV2h5IGlzIHRoaXMgNCB3aGVuIHRoZSBvdGhlcnMgYXJlIGFsbCAzPworICAgIGludFZhbCA9IDQ7CisgICAgdmFsdWVzWzJdLT5TZXROdWxsKCk7CisgIH0gZWxzZSBpZiAoYXJnT25lLT5Jc0FycmF5KCkpIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgYXV0byBsZW5ndGhWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICBhcmdPbmUtPkdldE9iamVjdFByb3BlcnR5KCJsZW5ndGgiLCBsZW5ndGhWYWx1ZS5nZXQoKSk7CisgICAgQVNTRVJUKGxlbmd0aFZhbHVlLT5Ub0ludGVnZXIoKSA+PSAzKTsKKyNlbmRpZgorCisgICAgYXV0byBwcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICAgIGF1dG8ganNPYmplY3RWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICBhcmdPbmUtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMSwgcHJvcGVydHlWYWx1ZS5nZXQoKSk7CisgICAgYXJnT25lLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KDIsIGpzT2JqZWN0VmFsdWUuZ2V0KCkpOworICAgIGlmICghcHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkgfHwganNPYmplY3RWYWx1ZS0+SXNOdWxsKCkpIHsKKyAgICAgIHBDb250ZXh0LT5UaHJvd0FyZ3VtZW50TWlzbWF0Y2hFeGNlcHRpb24oKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YWx1ZXNbMl0tPkFzc2lnbihqc09iamVjdFZhbHVlLmdldCgpKTsKKyAgfSBlbHNlIGlmIChhcmdPbmUtPklzT2JqZWN0KCkpIHsKKyAgICB2YWx1ZXNbMl0tPkFzc2lnbihhcmdPbmUuZ2V0KCkpOworICB9CisKKyAgdmFsdWVzWzBdLT5TZXRJbnRlZ2VyKGludFZhbCk7CisgIHZhbHVlc1sxXS0+U2V0TnVsbCgpOworICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEFycmF5KHZhbHVlcyk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpVbml0VHlwZShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAxKSB7CisgICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIlVuaXRUeXBlIik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gdW5pdHNwYW5WYWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKKyAgaWYgKHVuaXRzcGFuVmFsdWUtPklzTnVsbCgpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgQnl0ZVN0cmluZyB1bml0c3BhblN0cmluZyA9IFZhbHVlVG9VVEY4U3RyaW5nKHVuaXRzcGFuVmFsdWUuZ2V0KCkpOworICBpZiAodW5pdHNwYW5TdHJpbmcuSXNFbXB0eSgpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoImluIik7CisgICAgcmV0dXJuOworICB9CisKKyAgZW51bSBYRkFfRk0ySlNfVkFMVUVUWVBFX1BhcnNlclN0YXR1cyB7CisgICAgVkFMVUVUWVBFX1NUQVJULAorICAgIFZBTFVFVFlQRV9IQVZFSU5WQUxJRENIQVIsCisgICAgVkFMVUVUWVBFX0hBVkVESUdJVCwKKyAgICBWQUxVRVRZUEVfSEFWRURJR0lUV0hJVEUsCisgICAgVkFMVUVUWVBFX0lTQ00sCisgICAgVkFMVUVUWVBFX0lTTU0sCisgICAgVkFMVUVUWVBFX0lTUFQsCisgICAgVkFMVUVUWVBFX0lTTVAsCisgICAgVkFMVUVUWVBFX0lTSU4sCisgIH07CisgIHVuaXRzcGFuU3RyaW5nLk1ha2VMb3dlcigpOworICBXaWRlU3RyaW5nIHdzVHlwZVN0cmluZyA9IFdpZGVTdHJpbmc6OkZyb21VVEY4KHVuaXRzcGFuU3RyaW5nLkFzU3RyaW5nVmlldygpKTsKKyAgY29uc3Qgd2NoYXJfdCogcERhdGEgPSB3c1R5cGVTdHJpbmcuY19zdHIoKTsKKyAgaW50MzJfdCB1ID0gMDsKKyAgaW50MzJfdCB1TGVuID0gd3NUeXBlU3RyaW5nLkdldExlbmd0aCgpOworICB3aGlsZSAoSXNXaGl0ZXNwYWNlKHBEYXRhW3VdKSkKKyAgICB1Kys7CisKKyAgWEZBX0ZNMkpTX1ZBTFVFVFlQRV9QYXJzZXJTdGF0dXMgZVBhcnNlclN0YXR1cyA9IFZBTFVFVFlQRV9TVEFSVDsKKyAgd2NoYXJfdCB0eXBlQ2hhcjsKKyAgLy8gVE9ETyhkc2luY2xhaXIpOiBDbGVhbnVwIHRoaXMgcGFyc2VyLCBmaWd1cmUgb3V0IHdoYXQgdGhlIHZhcmlvdXMgY2hlY2tzCisgIC8vICAgIGFyZSBmb3IuCisgIHdoaWxlICh1IDwgdUxlbikgeworICAgIHR5cGVDaGFyID0gcERhdGFbdV07CisgICAgaWYgKElzV2hpdGVzcGFjZSh0eXBlQ2hhcikpIHsKKyAgICAgIGlmIChlUGFyc2VyU3RhdHVzICE9IFZBTFVFVFlQRV9IQVZFRElHSVQgJiYKKyAgICAgICAgICBlUGFyc2VyU3RhdHVzICE9IFZBTFVFVFlQRV9IQVZFRElHSVRXSElURSkgeworICAgICAgICBlUGFyc2VyU3RhdHVzID0gVkFMVUVUWVBFX0lTSU47CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZVBhcnNlclN0YXR1cyA9IFZBTFVFVFlQRV9IQVZFRElHSVRXSElURTsKKyAgICB9IGVsc2UgaWYgKElzUGFydE9mTnVtYmVyVyh0eXBlQ2hhcikpIHsKKyAgICAgIGlmIChlUGFyc2VyU3RhdHVzID09IFZBTFVFVFlQRV9IQVZFRElHSVRXSElURSkgeworICAgICAgICBlUGFyc2VyU3RhdHVzID0gVkFMVUVUWVBFX0lTSU47CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZVBhcnNlclN0YXR1cyA9IFZBTFVFVFlQRV9IQVZFRElHSVQ7CisgICAgfSBlbHNlIGlmICgodHlwZUNoYXIgPT0gJ2MnIHx8IHR5cGVDaGFyID09ICdwJykgJiYgKHUgKyAxIDwgdUxlbikpIHsKKyAgICAgIHdjaGFyX3QgbmV4dENoYXIgPSBwRGF0YVt1ICsgMV07CisgICAgICBpZiAoKGVQYXJzZXJTdGF0dXMgPT0gVkFMVUVUWVBFX1NUQVJUIHx8CisgICAgICAgICAgIGVQYXJzZXJTdGF0dXMgPT0gVkFMVUVUWVBFX0hBVkVESUdJVCB8fAorICAgICAgICAgICBlUGFyc2VyU3RhdHVzID09IFZBTFVFVFlQRV9IQVZFRElHSVRXSElURSkgJiYKKyAgICAgICAgICAhSXNQYXJ0T2ZOdW1iZXJXKG5leHRDaGFyKSkgeworICAgICAgICBlUGFyc2VyU3RhdHVzID0gKHR5cGVDaGFyID09ICdjJykgPyBWQUxVRVRZUEVfSVNDTSA6IFZBTFVFVFlQRV9JU1BUOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfSEFWRUlOVkFMSURDSEFSOworICAgIH0gZWxzZSBpZiAodHlwZUNoYXIgPT0gJ20nICYmICh1ICsgMSA8IHVMZW4pKSB7CisgICAgICB3Y2hhcl90IG5leHRDaGFyID0gcERhdGFbdSArIDFdOworICAgICAgaWYgKChlUGFyc2VyU3RhdHVzID09IFZBTFVFVFlQRV9TVEFSVCB8fAorICAgICAgICAgICBlUGFyc2VyU3RhdHVzID09IFZBTFVFVFlQRV9IQVZFRElHSVQgfHwKKyAgICAgICAgICAgZVBhcnNlclN0YXR1cyA9PSBWQUxVRVRZUEVfSEFWRURJR0lUV0hJVEUpICYmCisgICAgICAgICAgIUlzUGFydE9mTnVtYmVyVyhuZXh0Q2hhcikpIHsKKyAgICAgICAgZVBhcnNlclN0YXR1cyA9IFZBTFVFVFlQRV9JU01NOworICAgICAgICBpZiAobmV4dENoYXIgPT0gJ3AnIHx8ICgodSArIDUgPCB1TGVuKSAmJiBwRGF0YVt1ICsgMV0gPT0gJ2knICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhW3UgKyAyXSA9PSAnbCcgJiYgcERhdGFbdSArIDNdID09ICdsJyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVt1ICsgNF0gPT0gJ2knICYmIHBEYXRhW3UgKyA1XSA9PSAncCcpKSB7CisgICAgICAgICAgZVBhcnNlclN0YXR1cyA9IFZBTFVFVFlQRV9JU01QOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBlUGFyc2VyU3RhdHVzID0gVkFMVUVUWVBFX0hBVkVJTlZBTElEQ0hBUjsKKyAgICB9CisgICAgdSsrOworICB9CisgIHN3aXRjaCAoZVBhcnNlclN0YXR1cykgeworICAgIGNhc2UgVkFMVUVUWVBFX0lTQ006CisgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygiY20iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVkFMVUVUWVBFX0lTTU06CisgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygibW0iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVkFMVUVUWVBFX0lTUFQ6CisgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygicHQiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVkFMVUVUWVBFX0lTTVA6CisgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygibXAiKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygiaW4iKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpVbml0VmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOworICBpZiAoYXJnYyA8IDEgfHwgYXJnYyA+IDIpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiVW5pdFZhbHVlIik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gdW5pdHNwYW5WYWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKKyAgaWYgKHVuaXRzcGFuVmFsdWUtPklzTnVsbCgpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgQnl0ZVN0cmluZyB1bml0c3BhblN0cmluZyA9IFZhbHVlVG9VVEY4U3RyaW5nKHVuaXRzcGFuVmFsdWUuZ2V0KCkpOworICBjb25zdCBjaGFyKiBwRGF0YSA9IHVuaXRzcGFuU3RyaW5nLmNfc3RyKCk7CisgIGlmICghcERhdGEpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoMCk7CisgICAgcmV0dXJuOworICB9CisKKyAgc2l6ZV90IHUgPSAwOworICB3aGlsZSAoSXNXaGl0ZXNwYWNlKHBEYXRhW3VdKSkKKyAgICArK3U7CisKKyAgd2hpbGUgKHUgPCB1bml0c3BhblN0cmluZy5HZXRMZW5ndGgoKSkgeworICAgIGlmICghSXNQYXJ0T2ZOdW1iZXIocERhdGFbdV0pKQorICAgICAgYnJlYWs7CisgICAgKyt1OworICB9CisKKyAgY2hhciogcFRlbXAgPSBudWxscHRyOworICBkb3VibGUgZEZpcnN0TnVtYmVyID0gc3RydG9kKHBEYXRhLCAmcFRlbXApOworICB3aGlsZSAoSXNXaGl0ZXNwYWNlKHBEYXRhW3VdKSkKKyAgICArK3U7CisKKyAgc2l6ZV90IHVMZW4gPSB1bml0c3BhblN0cmluZy5HZXRMZW5ndGgoKTsKKyAgQnl0ZVN0cmluZyBzdHJGaXJzdFVuaXQ7CisgIHdoaWxlICh1IDwgdUxlbikgeworICAgIGlmIChwRGF0YVt1XSA9PSAnICcpCisgICAgICBicmVhazsKKworICAgIHN0ckZpcnN0VW5pdCArPSBwRGF0YVt1XTsKKyAgICArK3U7CisgIH0KKyAgc3RyRmlyc3RVbml0Lk1ha2VMb3dlcigpOworCisgIEJ5dGVTdHJpbmcgc3RyVW5pdDsKKyAgaWYgKGFyZ2MgPiAxKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gdW5pdFZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOworICAgIEJ5dGVTdHJpbmcgdW5pdFRlbXBTdHJpbmcgPSBWYWx1ZVRvVVRGOFN0cmluZyh1bml0VmFsdWUuZ2V0KCkpOworICAgIGNvbnN0IGNoYXIqIHBDaGFyID0gdW5pdFRlbXBTdHJpbmcuY19zdHIoKTsKKyAgICBzaXplX3QgdVZhbCA9IDA7CisgICAgd2hpbGUgKElzV2hpdGVzcGFjZShwQ2hhclt1VmFsXSkpCisgICAgICArK3VWYWw7CisKKyAgICB3aGlsZSAodVZhbCA8IHVuaXRUZW1wU3RyaW5nLkdldExlbmd0aCgpKSB7CisgICAgICBpZiAoIXN0ZDo6aXNkaWdpdChwQ2hhclt1VmFsXSkgJiYgcENoYXJbdVZhbF0gIT0gJy4nKQorICAgICAgICBicmVhazsKKyAgICAgICsrdVZhbDsKKyAgICB9CisgICAgd2hpbGUgKElzV2hpdGVzcGFjZShwQ2hhclt1VmFsXSkpCisgICAgICArK3VWYWw7CisKKyAgICBzaXplX3QgdVZhbExlbiA9IHVuaXRUZW1wU3RyaW5nLkdldExlbmd0aCgpOworICAgIHdoaWxlICh1VmFsIDwgdVZhbExlbikgeworICAgICAgaWYgKHBDaGFyW3VWYWxdID09ICcgJykKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIHN0clVuaXQgKz0gcENoYXJbdVZhbF07CisgICAgICArK3VWYWw7CisgICAgfQorICAgIHN0clVuaXQuTWFrZUxvd2VyKCk7CisgIH0gZWxzZSB7CisgICAgc3RyVW5pdCA9IHN0ckZpcnN0VW5pdDsKKyAgfQorCisgIGRvdWJsZSBkUmVzdWx0ID0gMDsKKyAgaWYgKHN0ckZpcnN0VW5pdCA9PSAiaW4iIHx8IHN0ckZpcnN0VW5pdCA9PSAiaW5jaGVzIikgeworICAgIGlmIChzdHJVbml0ID09ICJtbSIgfHwgc3RyVW5pdCA9PSAibWlsbGltZXRlcnMiKQorICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAqIDI1LjQ7CisgICAgZWxzZSBpZiAoc3RyVW5pdCA9PSAiY20iIHx8IHN0clVuaXQgPT0gImNlbnRpbWV0ZXJzIikKKyAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgKiAyLjU0OworICAgIGVsc2UgaWYgKHN0clVuaXQgPT0gInB0IiB8fCBzdHJVbml0ID09ICJwb2ludHMiKQorICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDcyOworICAgIGVsc2UgaWYgKHN0clVuaXQgPT0gIm1wIiB8fCBzdHJVbml0ID09ICJtaWxsaXBvaW50cyIpCisgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gNzIwMDA7CisgICAgZWxzZQorICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlcjsKKyAgfSBlbHNlIGlmIChzdHJGaXJzdFVuaXQgPT0gIm1tIiB8fCBzdHJGaXJzdFVuaXQgPT0gIm1pbGxpbWV0ZXJzIikgeworICAgIGlmIChzdHJVbml0ID09ICJtbSIgfHwgc3RyVW5pdCA9PSAibWlsbGltZXRlcnMiKQorICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlcjsKKyAgICBlbHNlIGlmIChzdHJVbml0ID09ICJjbSIgfHwgc3RyVW5pdCA9PSAiY2VudGltZXRlcnMiKQorICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDEwOworICAgIGVsc2UgaWYgKHN0clVuaXQgPT0gInB0IiB8fCBzdHJVbml0ID09ICJwb2ludHMiKQorICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDI1LjQgLyA3MjsKKyAgICBlbHNlIGlmIChzdHJVbml0ID09ICJtcCIgfHwgc3RyVW5pdCA9PSAibWlsbGlwb2ludHMiKQorICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDI1LjQgLyA3MjAwMDsKKyAgICBlbHNlCisgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gMjUuNDsKKyAgfSBlbHNlIGlmIChzdHJGaXJzdFVuaXQgPT0gImNtIiB8fCBzdHJGaXJzdFVuaXQgPT0gImNlbnRpbWV0ZXJzIikgeworICAgIGlmIChzdHJVbml0ID09ICJtbSIgfHwgc3RyVW5pdCA9PSAibWlsbGltZXRlcnMiKQorICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAqIDEwOworICAgIGVsc2UgaWYgKHN0clVuaXQgPT0gImNtIiB8fCBzdHJVbml0ID09ICJjZW50aW1ldGVycyIpCisgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyOworICAgIGVsc2UgaWYgKHN0clVuaXQgPT0gInB0IiB8fCBzdHJVbml0ID09ICJwb2ludHMiKQorICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDIuNTQgLyA3MjsKKyAgICBlbHNlIGlmIChzdHJVbml0ID09ICJtcCIgfHwgc3RyVW5pdCA9PSAibWlsbGlwb2ludHMiKQorICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDIuNTQgLyA3MjAwMDsKKyAgICBlbHNlCisgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gMi41NDsKKyAgfSBlbHNlIGlmIChzdHJGaXJzdFVuaXQgPT0gInB0IiB8fCBzdHJGaXJzdFVuaXQgPT0gInBvaW50cyIpIHsKKyAgICBpZiAoc3RyVW5pdCA9PSAibW0iIHx8IHN0clVuaXQgPT0gIm1pbGxpbWV0ZXJzIikKKyAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyA3MiAqIDI1LjQ7CisgICAgZWxzZSBpZiAoc3RyVW5pdCA9PSAiY20iIHx8IHN0clVuaXQgPT0gImNlbnRpbWV0ZXJzIikKKyAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyA3MiAqIDIuNTQ7CisgICAgZWxzZSBpZiAoc3RyVW5pdCA9PSAicHQiIHx8IHN0clVuaXQgPT0gInBvaW50cyIpCisgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyOworICAgIGVsc2UgaWYgKHN0clVuaXQgPT0gIm1wIiB8fCBzdHJVbml0ID09ICJtaWxsaXBvaW50cyIpCisgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyICogMTAwMDsKKyAgICBlbHNlCisgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gNzI7CisgIH0gZWxzZSBpZiAoc3RyRmlyc3RVbml0ID09ICJtcCIgfHwgc3RyRmlyc3RVbml0ID09ICJtaWxsaXBvaW50cyIpIHsKKyAgICBpZiAoc3RyVW5pdCA9PSAibW0iIHx8IHN0clVuaXQgPT0gIm1pbGxpbWV0ZXJzIikKKyAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyA3MjAwMCAqIDI1LjQ7CisgICAgZWxzZSBpZiAoc3RyVW5pdCA9PSAiY20iIHx8IHN0clVuaXQgPT0gImNlbnRpbWV0ZXJzIikKKyAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyA3MjAwMCAqIDIuNTQ7CisgICAgZWxzZSBpZiAoc3RyVW5pdCA9PSAicHQiIHx8IHN0clVuaXQgPT0gInBvaW50cyIpCisgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gMTAwMDsKKyAgICBlbHNlIGlmIChzdHJVbml0ID09ICJtcCIgfHwgc3RyVW5pdCA9PSAibWlsbGlwb2ludHMiKQorICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlcjsKKyAgICBlbHNlCisgICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gNzIwMDA7CisgIH0KKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXREb3VibGUoZFJlc3VsdCk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpBdChDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAyKSB7CisgICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIkF0Iik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdUd28gPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7CisgIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgYXJnT25lLmdldCgpKSB8fCBWYWx1ZUlzTnVsbChwVGhpcywgYXJnVHdvLmdldCgpKSkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgIHJldHVybjsKKyAgfQorCisgIEJ5dGVTdHJpbmcgc3RyaW5nVHdvID0gVmFsdWVUb1VURjhTdHJpbmcoYXJnVHdvLmdldCgpKTsKKyAgaWYgKHN0cmluZ1R3by5Jc0VtcHR5KCkpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoMSk7CisgICAgcmV0dXJuOworICB9CisKKyAgQnl0ZVN0cmluZyBzdHJpbmdPbmUgPSBWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUuZ2V0KCkpOworICBhdXRvIHBvcyA9IHN0cmluZ09uZS5GaW5kKHN0cmluZ1R3by5Bc1N0cmluZ1ZpZXcoKSk7CisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcihwb3MuaGFzX3ZhbHVlKCkgPyBwb3MudmFsdWUoKSArIDEgOiAwKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkNvbmNhdChDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7CisgIGlmIChhcmdjIDwgMSkgeworICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJDb25jYXQiKTsKKyAgICByZXR1cm47CisgIH0KKworICBCeXRlU3RyaW5nIHJlc3VsdFN0cmluZzsKKyAgYm9vbCBiQWxsTnVsbCA9IHRydWU7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IHZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIGkpOworICAgIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgdmFsdWUuZ2V0KCkpKQorICAgICAgY29udGludWU7CisKKyAgICBiQWxsTnVsbCA9IGZhbHNlOworICAgIHJlc3VsdFN0cmluZyArPSBWYWx1ZVRvVVRGOFN0cmluZyh2YWx1ZS5nZXQoKSk7CisgIH0KKworICBpZiAoYkFsbE51bGwpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICByZXR1cm47CisgIH0KKworICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZyhyZXN1bHRTdHJpbmcuQXNTdHJpbmdWaWV3KCkpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6RGVjb2RlKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKKyAgaWYgKGFyZ2MgPCAxIHx8IGFyZ2MgPiAyKSB7CisgICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIkRlY29kZSIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChhcmdjID09IDEpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgICAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdPbmUuZ2V0KCkpKSB7CisgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBXaWRlU3RyaW5nIGRlY29kZWQgPSBEZWNvZGVVUkwoCisgICAgICAgIFdpZGVTdHJpbmc6OkZyb21VVEY4KFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZS5nZXQoKSkuQXNTdHJpbmdWaWV3KCkpKTsKKworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKAorICAgICAgICBGWF9VVEY4RW5jb2RlKGRlY29kZWQuQXNTdHJpbmdWaWV3KCkpLkFzU3RyaW5nVmlldygpKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1R3byA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKKyAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdPbmUuZ2V0KCkpIHx8IFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdUd28uZ2V0KCkpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgQnl0ZVN0cmluZyB0b0RlY29kZVN0cmluZyA9IFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZS5nZXQoKSk7CisgIEJ5dGVTdHJpbmcgaWRlbnRpZnlTdHJpbmcgPSBWYWx1ZVRvVVRGOFN0cmluZyhhcmdUd28uZ2V0KCkpOworICBXaWRlU3RyaW5nIGRlY29kZWQ7CisKKyAgV2lkZVN0cmluZyB0b0RlY29kZVdpZGVTdHJpbmcgPQorICAgICAgV2lkZVN0cmluZzo6RnJvbVVURjgodG9EZWNvZGVTdHJpbmcuQXNTdHJpbmdWaWV3KCkpOworCisgIGlmIChpZGVudGlmeVN0cmluZy5FcXVhbE5vQ2FzZSgiaHRtbCIpKQorICAgIGRlY29kZWQgPSBEZWNvZGVIVE1MKHRvRGVjb2RlV2lkZVN0cmluZyk7CisgIGVsc2UgaWYgKGlkZW50aWZ5U3RyaW5nLkVxdWFsTm9DYXNlKCJ4bWwiKSkKKyAgICBkZWNvZGVkID0gRGVjb2RlWE1MKHRvRGVjb2RlV2lkZVN0cmluZyk7CisgIGVsc2UKKyAgICBkZWNvZGVkID0gRGVjb2RlVVJMKHRvRGVjb2RlV2lkZVN0cmluZyk7CisKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoCisgICAgICBGWF9VVEY4RW5jb2RlKGRlY29kZWQuQXNTdHJpbmdWaWV3KCkpLkFzU3RyaW5nVmlldygpKTsKK30KKworLy8gc3RhdGljCitXaWRlU3RyaW5nIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkRlY29kZVVSTChjb25zdCBXaWRlU3RyaW5nJiB3c1VSTFN0cmluZykgeworICBjb25zdCB3Y2hhcl90KiBwRGF0YSA9IHdzVVJMU3RyaW5nLmNfc3RyKCk7CisgIHNpemVfdCBpID0gMDsKKyAgQ0ZYX1dpZGVUZXh0QnVmIHdzUmVzdWx0QnVmOworICB3aGlsZSAoaSA8IHdzVVJMU3RyaW5nLkdldExlbmd0aCgpKSB7CisgICAgd2NoYXJfdCBjaCA9IHBEYXRhW2ldOworICAgIGlmICgnJScgIT0gY2gpIHsKKyAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoY2gpOworICAgICAgKytpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgd2NoYXJfdCBjaFRlbXAgPSAwOworICAgIGludDMyX3QgaUNvdW50ID0gMDsKKyAgICB3aGlsZSAoaUNvdW50IDwgMikgeworICAgICAgKytpOworICAgICAgY2ggPSBwRGF0YVtpXTsKKyAgICAgIGlmIChjaCA8PSAnOScgJiYgY2ggPj0gJzAnKSB7CisgICAgICAgIC8vIFRPRE8oZHNpbmNsYWlyKTogUHJlbXVsdGlwbHkgYW5kIGFkZCByYXRoZXIgdGhlbiBzY2FsZS4KKyAgICAgICAgY2hUZW1wICs9IChjaCAtICcwJykgKiAoIWlDb3VudCA/IDE2IDogMSk7CisgICAgICB9IGVsc2UgaWYgKGNoIDw9ICdGJyAmJiBjaCA+PSAnQScpIHsKKyAgICAgICAgY2hUZW1wICs9IChjaCAtICdBJyArIDEwKSAqICghaUNvdW50ID8gMTYgOiAxKTsKKyAgICAgIH0gZWxzZSBpZiAoY2ggPD0gJ2YnICYmIGNoID49ICdhJykgeworICAgICAgICBjaFRlbXAgKz0gKGNoIC0gJ2EnICsgMTApICogKCFpQ291bnQgPyAxNiA6IDEpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKKyAgICAgIH0KKyAgICAgICsraUNvdW50OworICAgIH0KKyAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKGNoVGVtcCk7CisgICAgKytpOworICB9CisgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoMCk7CisgIHJldHVybiB3c1Jlc3VsdEJ1Zi5NYWtlU3RyaW5nKCk7Cit9CisKKy8vIHN0YXRpYworV2lkZVN0cmluZyBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpEZWNvZGVIVE1MKGNvbnN0IFdpZGVTdHJpbmcmIHdzSFRNTFN0cmluZykgeworICB3Y2hhcl90IHN0clN0cmluZ1s5XTsKKyAgc2l6ZV90IGlTdHJJbmRleCA9IDA7CisgIHNpemVfdCBpTGVuID0gd3NIVE1MU3RyaW5nLkdldExlbmd0aCgpOworICBzaXplX3QgaSA9IDA7CisgIGludDMyX3QgaUNvZGUgPSAwOworICBjb25zdCB3Y2hhcl90KiBwRGF0YSA9IHdzSFRNTFN0cmluZy5jX3N0cigpOworICBDRlhfV2lkZVRleHRCdWYgd3NSZXN1bHRCdWY7CisgIHdoaWxlIChpIDwgaUxlbikgeworICAgIHdjaGFyX3QgY2ggPSBwRGF0YVtpXTsKKyAgICBpZiAoY2ggIT0gJyYnKSB7CisgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKGNoKTsKKyAgICAgICsraTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgICsraTsKKyAgICBjaCA9IHBEYXRhW2ldOworICAgIGlmIChjaCA9PSAnIycpIHsKKyAgICAgICsraTsKKyAgICAgIGNoID0gcERhdGFbaV07CisgICAgICBpZiAoY2ggIT0gJ3gnICYmIGNoICE9ICdYJykgeworICAgICAgICByZXR1cm4gV2lkZVN0cmluZygpOworICAgICAgfQorCisgICAgICArK2k7CisgICAgICBjaCA9IHBEYXRhW2ldOworICAgICAgaWYgKChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB8fCAoY2ggPD0gJ2YnICYmIGNoID49ICdhJykgfHwKKyAgICAgICAgICAoY2ggPD0gJ0YnICYmIGNoID49ICdBJykpIHsKKyAgICAgICAgd2hpbGUgKGNoICE9ICc7JyAmJiBpIDwgaUxlbikgeworICAgICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisgICAgICAgICAgICBpQ29kZSArPSBjaCAtICcwJzsKKyAgICAgICAgICB9IGVsc2UgaWYgKGNoIDw9ICdmJyAmJiBjaCA+PSAnYScpIHsKKyAgICAgICAgICAgIGlDb2RlICs9IGNoIC0gJ2EnICsgMTA7CisgICAgICAgICAgfSBlbHNlIGlmIChjaCA8PSAnRicgJiYgY2ggPj0gJ0EnKSB7CisgICAgICAgICAgICBpQ29kZSArPSBjaCAtICdBJyArIDEwOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gV2lkZVN0cmluZygpOworICAgICAgICAgIH0KKyAgICAgICAgICArK2k7CisgICAgICAgICAgLy8gVE9ETyhkc2luY2xhaXIpOiBQb3N0bXVsdGlwbHkgc2VlbXMgd3JvbmcsIHN0YXJ0IGF0IHplcm8KKyAgICAgICAgICAvLyAgIGFuZCBwcmUtbXVsdGlwbHkgdGhlbiBjYW4gcmVtb3ZlIHRoZSBwb3N0IGRpdmlkZS4KKyAgICAgICAgICBpQ29kZSAqPSAxNjsKKyAgICAgICAgICBjaCA9IHBEYXRhW2ldOworICAgICAgICB9CisgICAgICAgIGlDb2RlIC89IDE2OworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB3aGlsZSAoY2ggIT0gJzsnICYmIGkgPCBpTGVuKSB7CisgICAgICAgIHN0clN0cmluZ1tpU3RySW5kZXgrK10gPSBjaDsKKyAgICAgICAgKytpOworICAgICAgICBjaCA9IHBEYXRhW2ldOworICAgICAgfQorICAgICAgc3RyU3RyaW5nW2lTdHJJbmRleF0gPSAwOworICAgIH0KKyAgICB1aW50MzJfdCBpRGF0YSA9IDA7CisgICAgaWYgKEhUTUxTVFIyQ29kZShzdHJTdHJpbmcsICZpRGF0YSkpIHsKKyAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoKHdjaGFyX3QpaURhdGEpOworICAgIH0gZWxzZSB7CisgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKGlDb2RlKTsKKyAgICB9CisgICAgaVN0ckluZGV4ID0gMDsKKyAgICBzdHJTdHJpbmdbaVN0ckluZGV4XSA9IDA7CisgICAgKytpOworICB9CisgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoMCk7CisKKyAgcmV0dXJuIHdzUmVzdWx0QnVmLk1ha2VTdHJpbmcoKTsKK30KKworLy8gc3RhdGljCitXaWRlU3RyaW5nIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkRlY29kZVhNTChjb25zdCBXaWRlU3RyaW5nJiB3c1hNTFN0cmluZykgeworICB3Y2hhcl90IHN0clN0cmluZ1s5XTsKKyAgaW50MzJfdCBpU3RySW5kZXggPSAwOworICBpbnQzMl90IGlMZW4gPSB3c1hNTFN0cmluZy5HZXRMZW5ndGgoKTsKKyAgaW50MzJfdCBpID0gMDsKKyAgaW50MzJfdCBpQ29kZSA9IDA7CisgIHdjaGFyX3QgY2ggPSAwOworICBjb25zdCB3Y2hhcl90KiBwRGF0YSA9IHdzWE1MU3RyaW5nLmNfc3RyKCk7CisgIENGWF9XaWRlVGV4dEJ1ZiB3c1Jlc3VsdEJ1ZjsKKyAgd2hpbGUgKGkgPCBpTGVuKSB7CisgICAgY2ggPSBwRGF0YVtpXTsKKyAgICBpZiAoY2ggIT0gJyYnKSB7CisgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKGNoKTsKKyAgICAgICsraTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIFRPRE8oZHNpbmNsYWlyKTogVGhpcyBpcyB2ZXJ5IHNpbWlsYXIgdG8gRGVjb2RlSFRNTCwgY2FuIHRoZXkgYmUKKyAgICAvLyAgIGNvbWJpbmVkPworICAgICsraTsKKyAgICBjaCA9IHBEYXRhW2ldOworICAgIGlmIChjaCA9PSAnIycpIHsKKyAgICAgICsraTsKKyAgICAgIGNoID0gcERhdGFbaV07CisgICAgICBpZiAoY2ggIT0gJ3gnICYmIGNoICE9ICdYJykgeworICAgICAgICByZXR1cm4gV2lkZVN0cmluZygpOworICAgICAgfQorCisgICAgICArK2k7CisgICAgICBjaCA9IHBEYXRhW2ldOworICAgICAgaWYgKChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB8fCAoY2ggPD0gJ2YnICYmIGNoID49ICdhJykgfHwKKyAgICAgICAgICAoY2ggPD0gJ0YnICYmIGNoID49ICdBJykpIHsKKyAgICAgICAgd2hpbGUgKGNoICE9ICc7JykgeworICAgICAgICAgIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CisgICAgICAgICAgICBpQ29kZSArPSBjaCAtICcwJzsKKyAgICAgICAgICB9IGVsc2UgaWYgKGNoIDw9ICdmJyAmJiBjaCA+PSAnYScpIHsKKyAgICAgICAgICAgIGlDb2RlICs9IGNoIC0gJ2EnICsgMTA7CisgICAgICAgICAgfSBlbHNlIGlmIChjaCA8PSAnRicgJiYgY2ggPj0gJ0EnKSB7CisgICAgICAgICAgICBpQ29kZSArPSBjaCAtICdBJyArIDEwOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gV2lkZVN0cmluZygpOworICAgICAgICAgIH0KKyAgICAgICAgICArK2k7CisgICAgICAgICAgaUNvZGUgKj0gMTY7CisgICAgICAgICAgY2ggPSBwRGF0YVtpXTsKKyAgICAgICAgfQorICAgICAgICBpQ29kZSAvPSAxNjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgd2hpbGUgKGNoICE9ICc7JyAmJiBpIDwgaUxlbikgeworICAgICAgICBzdHJTdHJpbmdbaVN0ckluZGV4KytdID0gY2g7CisgICAgICAgICsraTsKKyAgICAgICAgY2ggPSBwRGF0YVtpXTsKKyAgICAgIH0KKyAgICAgIHN0clN0cmluZ1tpU3RySW5kZXhdID0gMDsKKyAgICB9CisKKyAgICBjb25zdCB3Y2hhcl90KiBjb25zdCBzdHJOYW1lW10gPSB7TCJxdW90IiwgTCJhbXAiLCBMImFwb3MiLCBMImx0IiwgTCJndCJ9OworICAgIGludDMyX3QgaUluZGV4ID0gMDsKKyAgICB3aGlsZSAoaUluZGV4IDwgNSkgeworICAgICAgaWYgKG1lbWNtcChzdHJTdHJpbmcsIHN0ck5hbWVbaUluZGV4XSwgd2NzbGVuKHN0ck5hbWVbaUluZGV4XSkpID09IDApIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICArK2lJbmRleDsKKyAgICB9CisgICAgc3dpdGNoIChpSW5kZXgpIHsKKyAgICAgIGNhc2UgMDoKKyAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcignIicpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcignJicpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcignXCcnKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM6CisgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJzwnKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ6CisgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJz4nKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKGlDb2RlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlTdHJJbmRleCA9IDA7CisgICAgc3RyU3RyaW5nW2lTdHJJbmRleF0gPSAwOworICAgICsraTsKKyAgICBpQ29kZSA9IDA7CisgIH0KKyAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcigwKTsKKyAgcmV0dXJuIHdzUmVzdWx0QnVmLk1ha2VTdHJpbmcoKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkVuY29kZShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7CisgIGlmIChhcmdjIDwgMSB8fCBhcmdjID4gMikgeworICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJFbmNvZGUiKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoYXJnYyA9PSAxKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICAgIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgYXJnT25lLmdldCgpKSkgeworICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgV2lkZVN0cmluZyBlbmNvZGVkID0gRW5jb2RlVVJMKFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZS5nZXQoKSkpOworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKAorICAgICAgICBGWF9VVEY4RW5jb2RlKGVuY29kZWQuQXNTdHJpbmdWaWV3KCkpLkFzU3RyaW5nVmlldygpKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1R3byA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKKyAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdPbmUuZ2V0KCkpIHx8IFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdUd28uZ2V0KCkpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgQnl0ZVN0cmluZyB0b0VuY29kZVN0cmluZyA9IFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZS5nZXQoKSk7CisgIEJ5dGVTdHJpbmcgaWRlbnRpZnlTdHJpbmcgPSBWYWx1ZVRvVVRGOFN0cmluZyhhcmdUd28uZ2V0KCkpOworICBXaWRlU3RyaW5nIGVuY29kZWQ7CisgIGlmIChpZGVudGlmeVN0cmluZy5FcXVhbE5vQ2FzZSgiaHRtbCIpKQorICAgIGVuY29kZWQgPSBFbmNvZGVIVE1MKHRvRW5jb2RlU3RyaW5nKTsKKyAgZWxzZSBpZiAoaWRlbnRpZnlTdHJpbmcuRXF1YWxOb0Nhc2UoInhtbCIpKQorICAgIGVuY29kZWQgPSBFbmNvZGVYTUwodG9FbmNvZGVTdHJpbmcpOworICBlbHNlCisgICAgZW5jb2RlZCA9IEVuY29kZVVSTCh0b0VuY29kZVN0cmluZyk7CisKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoCisgICAgICBGWF9VVEY4RW5jb2RlKGVuY29kZWQuQXNTdHJpbmdWaWV3KCkpLkFzU3RyaW5nVmlldygpKTsKK30KKworLy8gc3RhdGljCitXaWRlU3RyaW5nIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkVuY29kZVVSTChjb25zdCBCeXRlU3RyaW5nJiBzelVSTFN0cmluZykgeworICBXaWRlU3RyaW5nIHdzVVJMU3RyaW5nID0gV2lkZVN0cmluZzo6RnJvbVVURjgoc3pVUkxTdHJpbmcuQXNTdHJpbmdWaWV3KCkpOworICBDRlhfV2lkZVRleHRCdWYgd3NSZXN1bHRCdWY7CisgIHdjaGFyX3Qgc3RyRW5jb2RlWzRdOworICBzdHJFbmNvZGVbMF0gPSAnJSc7CisgIHN0ckVuY29kZVszXSA9IDA7CisgIHdjaGFyX3Qgc3RyVW5zYWZlW10gPSB7JyAnLCAnPCcsICAnPicsICciJywgJyMnLCAnJScsICd7JywgJ30nLAorICAgICAgICAgICAgICAgICAgICAgICAgICd8JywgJ1xcJywgJ14nLCAnficsICdbJywgJ10nLCAnYCd9OworICB3Y2hhcl90IHN0clJlc2VydmVkW10gPSB7JzsnLCAnLycsICc/JywgJzonLCAnQCcsICc9JywgJyYnfTsKKyAgd2NoYXJfdCBzdHJTcGVjaWFsW10gPSB7JyQnLCAnLScsICcrJywgJyEnLCAnKicsICdcJycsICcoJywgJyknLCAnLCd9OworICBjb25zdCB3Y2hhcl90KiBzdHJDb2RlID0gTCIwMTIzNDU2Nzg5YWJjZGVmIjsKKyAgZm9yIChhdXRvIGNoIDogd3NVUkxTdHJpbmcpIHsKKyAgICBpbnQzMl90IGkgPSAwOworICAgIGludDMyX3QgaUNvdW50ID0gRlhfQXJyYXlTaXplKHN0clVuc2FmZSk7CisgICAgd2hpbGUgKGkgPCBpQ291bnQpIHsKKyAgICAgIGlmIChjaCA9PSBzdHJVbnNhZmVbaV0pIHsKKyAgICAgICAgaW50MzJfdCBpSW5kZXggPSBjaCAvIDE2OworICAgICAgICBzdHJFbmNvZGVbMV0gPSBzdHJDb2RlW2lJbmRleF07CisgICAgICAgIHN0ckVuY29kZVsyXSA9IHN0ckNvZGVbY2ggLSBpSW5kZXggKiAxNl07CisgICAgICAgIHdzUmVzdWx0QnVmIDw8IHN0ckVuY29kZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICArK2k7CisgICAgfQorICAgIGlmIChpIDwgaUNvdW50KQorICAgICAgY29udGludWU7CisKKyAgICBpID0gMDsKKyAgICBpQ291bnQgPSBGWF9BcnJheVNpemUoc3RyUmVzZXJ2ZWQpOworICAgIHdoaWxlIChpIDwgaUNvdW50KSB7CisgICAgICBpZiAoY2ggPT0gc3RyUmVzZXJ2ZWRbaV0pIHsKKyAgICAgICAgaW50MzJfdCBpSW5kZXggPSBjaCAvIDE2OworICAgICAgICBzdHJFbmNvZGVbMV0gPSBzdHJDb2RlW2lJbmRleF07CisgICAgICAgIHN0ckVuY29kZVsyXSA9IHN0ckNvZGVbY2ggLSBpSW5kZXggKiAxNl07CisgICAgICAgIHdzUmVzdWx0QnVmIDw8IHN0ckVuY29kZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICArK2k7CisgICAgfQorICAgIGlmIChpIDwgaUNvdW50KQorICAgICAgY29udGludWU7CisKKyAgICBpID0gMDsKKyAgICBpQ291bnQgPSBGWF9BcnJheVNpemUoc3RyU3BlY2lhbCk7CisgICAgd2hpbGUgKGkgPCBpQ291bnQpIHsKKyAgICAgIGlmIChjaCA9PSBzdHJTcGVjaWFsW2ldKSB7CisgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoY2gpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgICsraTsKKyAgICB9CisgICAgaWYgKGkgPCBpQ291bnQpCisgICAgICBjb250aW51ZTsKKworICAgIGlmICgoY2ggPj0gMHg4MCAmJiBjaCA8PSAweGZmKSB8fCBjaCA8PSAweDFmIHx8IGNoID09IDB4N2YpIHsKKyAgICAgIGludDMyX3QgaUluZGV4ID0gY2ggLyAxNjsKKyAgICAgIHN0ckVuY29kZVsxXSA9IHN0ckNvZGVbaUluZGV4XTsKKyAgICAgIHN0ckVuY29kZVsyXSA9IHN0ckNvZGVbY2ggLSBpSW5kZXggKiAxNl07CisgICAgICB3c1Jlc3VsdEJ1ZiA8PCBzdHJFbmNvZGU7CisgICAgfSBlbHNlIGlmIChjaCA+PSAweDIwICYmIGNoIDw9IDB4N2UpIHsKKyAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoY2gpOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCB3Y2hhcl90IGlSYWRpeCA9IDE2OworICAgICAgV2lkZVN0cmluZyBzdHJUbXA7CisgICAgICB3aGlsZSAoY2ggPj0gaVJhZGl4KSB7CisgICAgICAgIHdjaGFyX3QgdG1wID0gc3RyQ29kZVtjaCAlIGlSYWRpeF07CisgICAgICAgIGNoIC89IGlSYWRpeDsKKyAgICAgICAgc3RyVG1wICs9IHRtcDsKKyAgICAgIH0KKyAgICAgIHN0clRtcCArPSBzdHJDb2RlW2NoXTsKKyAgICAgIGludDMyX3QgaUxlbiA9IHN0clRtcC5HZXRMZW5ndGgoKTsKKyAgICAgIGlmIChpTGVuIDwgMikKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGludDMyX3QgaUluZGV4ID0gMDsKKyAgICAgIGlmIChpTGVuICUgMiAhPSAwKSB7CisgICAgICAgIHN0ckVuY29kZVsxXSA9ICcwJzsKKyAgICAgICAgc3RyRW5jb2RlWzJdID0gc3RyVG1wW2lMZW4gLSAxXTsKKyAgICAgICAgaUluZGV4ID0gaUxlbiAtIDI7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdHJFbmNvZGVbMV0gPSBzdHJUbXBbaUxlbiAtIDFdOworICAgICAgICBzdHJFbmNvZGVbMl0gPSBzdHJUbXBbaUxlbiAtIDJdOworICAgICAgICBpSW5kZXggPSBpTGVuIC0gMzsKKyAgICAgIH0KKyAgICAgIHdzUmVzdWx0QnVmIDw8IHN0ckVuY29kZTsKKyAgICAgIHdoaWxlIChpSW5kZXggPiAwKSB7CisgICAgICAgIHN0ckVuY29kZVsxXSA9IHN0clRtcFtpSW5kZXhdOworICAgICAgICBzdHJFbmNvZGVbMl0gPSBzdHJUbXBbaUluZGV4IC0gMV07CisgICAgICAgIGlJbmRleCAtPSAyOworICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBzdHJFbmNvZGU7CisgICAgICB9CisgICAgfQorICB9CisgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoMCk7CisgIHJldHVybiB3c1Jlc3VsdEJ1Zi5NYWtlU3RyaW5nKCk7Cit9CisKKy8vIHN0YXRpYworV2lkZVN0cmluZyBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpFbmNvZGVIVE1MKGNvbnN0IEJ5dGVTdHJpbmcmIHN6SFRNTFN0cmluZykgeworICBXaWRlU3RyaW5nIHdzSFRNTFN0cmluZyA9IFdpZGVTdHJpbmc6OkZyb21VVEY4KHN6SFRNTFN0cmluZy5Bc1N0cmluZ1ZpZXcoKSk7CisgIGNvbnN0IHdjaGFyX3QqIHN0ckNvZGUgPSBMIjAxMjM0NTY3ODlhYmNkZWYiOworICB3Y2hhcl90IHN0ckVuY29kZVs5XTsKKyAgc3RyRW5jb2RlWzBdID0gJyYnOworICBzdHJFbmNvZGVbMV0gPSAnIyc7CisgIHN0ckVuY29kZVsyXSA9ICd4JzsKKyAgc3RyRW5jb2RlWzVdID0gJzsnOworICBzdHJFbmNvZGVbNl0gPSAwOworICBzdHJFbmNvZGVbN10gPSAnOyc7CisgIHN0ckVuY29kZVs4XSA9IDA7CisgIENGWF9XaWRlVGV4dEJ1ZiB3c1Jlc3VsdEJ1ZjsKKyAgaW50MzJfdCBpTGVuID0gd3NIVE1MU3RyaW5nLkdldExlbmd0aCgpOworICBpbnQzMl90IGkgPSAwOworICBjb25zdCB3Y2hhcl90KiBwRGF0YSA9IHdzSFRNTFN0cmluZy5jX3N0cigpOworICB3aGlsZSAoaSA8IGlMZW4pIHsKKyAgICB1aW50MzJfdCBjaCA9IHBEYXRhW2ldOworICAgIFdpZGVTdHJpbmcgaHRtbFJlc2VydmU7CisgICAgaWYgKEhUTUxDb2RlMlNUUihjaCwgJmh0bWxSZXNlcnZlKSkgeworICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcihMJyYnKTsKKyAgICAgIHdzUmVzdWx0QnVmIDw8IGh0bWxSZXNlcnZlOworICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcihMJzsnKTsKKyAgICB9IGVsc2UgaWYgKGNoID49IDMyICYmIGNoIDw9IDEyNikgeworICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcigod2NoYXJfdCljaCk7CisgICAgfSBlbHNlIGlmIChjaCA8IDI1NikgeworICAgICAgaW50MzJfdCBpSW5kZXggPSBjaCAvIDE2OworICAgICAgc3RyRW5jb2RlWzNdID0gc3RyQ29kZVtpSW5kZXhdOworICAgICAgc3RyRW5jb2RlWzRdID0gc3RyQ29kZVtjaCAtIGlJbmRleCAqIDE2XTsKKyAgICAgIHN0ckVuY29kZVs1XSA9ICc7JzsKKyAgICAgIHN0ckVuY29kZVs2XSA9IDA7CisgICAgICB3c1Jlc3VsdEJ1ZiA8PCBzdHJFbmNvZGU7CisgICAgfSBlbHNlIHsKKyAgICAgIGludDMyX3QgaUJpZ0J5dGUgPSBjaCAvIDI1NjsKKyAgICAgIGludDMyX3QgaUxpdHRsZUJ5dGUgPSBjaCAlIDI1NjsKKyAgICAgIHN0ckVuY29kZVszXSA9IHN0ckNvZGVbaUJpZ0J5dGUgLyAxNl07CisgICAgICBzdHJFbmNvZGVbNF0gPSBzdHJDb2RlW2lCaWdCeXRlICUgMTZdOworICAgICAgc3RyRW5jb2RlWzVdID0gc3RyQ29kZVtpTGl0dGxlQnl0ZSAvIDE2XTsKKyAgICAgIHN0ckVuY29kZVs2XSA9IHN0ckNvZGVbaUxpdHRsZUJ5dGUgJSAxNl07CisgICAgICB3c1Jlc3VsdEJ1ZiA8PCBzdHJFbmNvZGU7CisgICAgfQorICAgICsraTsKKyAgfQorICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKDApOworICByZXR1cm4gd3NSZXN1bHRCdWYuTWFrZVN0cmluZygpOworfQorCisvLyBzdGF0aWMKK1dpZGVTdHJpbmcgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6RW5jb2RlWE1MKGNvbnN0IEJ5dGVTdHJpbmcmIHN6WE1MU3RyaW5nKSB7CisgIFdpZGVTdHJpbmcgd3NYTUxTdHJpbmcgPSBXaWRlU3RyaW5nOjpGcm9tVVRGOChzelhNTFN0cmluZy5Bc1N0cmluZ1ZpZXcoKSk7CisgIENGWF9XaWRlVGV4dEJ1ZiB3c1Jlc3VsdEJ1ZjsKKyAgd2NoYXJfdCBzdHJFbmNvZGVbOV07CisgIHN0ckVuY29kZVswXSA9ICcmJzsKKyAgc3RyRW5jb2RlWzFdID0gJyMnOworICBzdHJFbmNvZGVbMl0gPSAneCc7CisgIHN0ckVuY29kZVs1XSA9ICc7JzsKKyAgc3RyRW5jb2RlWzZdID0gMDsKKyAgc3RyRW5jb2RlWzddID0gJzsnOworICBzdHJFbmNvZGVbOF0gPSAwOworICBjb25zdCB3Y2hhcl90KiBzdHJDb2RlID0gTCIwMTIzNDU2Nzg5YWJjZGVmIjsKKyAgZm9yIChjb25zdCBhdXRvJiBjaCA6IHdzWE1MU3RyaW5nKSB7CisgICAgc3dpdGNoIChjaCkgeworICAgICAgY2FzZSAnIic6CisgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJyYnKTsKKyAgICAgICAgd3NSZXN1bHRCdWYgPDwgV2lkZVN0cmluZ1ZpZXcoTCJxdW90Iik7CisgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJzsnKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcmJzoKKyAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcignJicpOworICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBXaWRlU3RyaW5nVmlldyhMImFtcCIpOworICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCc7Jyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnXCcnOgorICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCcmJyk7CisgICAgICAgIHdzUmVzdWx0QnVmIDw8IFdpZGVTdHJpbmdWaWV3KEwiYXBvcyIpOworICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCc7Jyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPCc6CisgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJyYnKTsKKyAgICAgICAgd3NSZXN1bHRCdWYgPDwgV2lkZVN0cmluZ1ZpZXcoTCJsdCIpOworICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCc7Jyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPic6CisgICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJyYnKTsKKyAgICAgICAgd3NSZXN1bHRCdWYgPDwgV2lkZVN0cmluZ1ZpZXcoTCJndCIpOworICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCc7Jyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogeworICAgICAgICBpZiAoY2ggPj0gMzIgJiYgY2ggPD0gMTI2KSB7CisgICAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcihjaCk7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPCAyNTYpIHsKKyAgICAgICAgICBpbnQzMl90IGlJbmRleCA9IGNoIC8gMTY7CisgICAgICAgICAgc3RyRW5jb2RlWzNdID0gc3RyQ29kZVtpSW5kZXhdOworICAgICAgICAgIHN0ckVuY29kZVs0XSA9IHN0ckNvZGVbY2ggLSBpSW5kZXggKiAxNl07CisgICAgICAgICAgc3RyRW5jb2RlWzVdID0gJzsnOworICAgICAgICAgIHN0ckVuY29kZVs2XSA9IDA7CisgICAgICAgICAgd3NSZXN1bHRCdWYgPDwgc3RyRW5jb2RlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGludDMyX3QgaUJpZ0J5dGUgPSBjaCAvIDI1NjsKKyAgICAgICAgICBpbnQzMl90IGlMaXR0bGVCeXRlID0gY2ggJSAyNTY7CisgICAgICAgICAgc3RyRW5jb2RlWzNdID0gc3RyQ29kZVtpQmlnQnl0ZSAvIDE2XTsKKyAgICAgICAgICBzdHJFbmNvZGVbNF0gPSBzdHJDb2RlW2lCaWdCeXRlICUgMTZdOworICAgICAgICAgIHN0ckVuY29kZVs1XSA9IHN0ckNvZGVbaUxpdHRsZUJ5dGUgLyAxNl07CisgICAgICAgICAgc3RyRW5jb2RlWzZdID0gc3RyQ29kZVtpTGl0dGxlQnl0ZSAlIDE2XTsKKyAgICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBzdHJFbmNvZGU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoMCk7CisgIHJldHVybiB3c1Jlc3VsdEJ1Zi5NYWtlU3RyaW5nKCk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpIVE1MU1RSMkNvZGUoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGlDb2RlKSB7CisgIGF1dG8gY21wRnVuYyA9IFtdKGNvbnN0IFhGQV9GTUh0bWxSZXNlcnZlQ29kZSYgaXRlciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHZhbCkgeworICAgIC8vIFRPRE8odHNlcGV6KTogY2hlY2sgdXNhZ2Ugb2YgY19zdHIoKSBiZWxvdy4KKyAgICByZXR1cm4gd2NzY21wKHZhbC51bnRlcm1pbmF0ZWRfY19zdHIoKSwgaXRlci5tX2h0bWxSZXNlcnZlKSA+IDA7CisgIH07CisgIGNvbnN0IFhGQV9GTUh0bWxSZXNlcnZlQ29kZSogcmVzdWx0ID0KKyAgICAgIHN0ZDo6bG93ZXJfYm91bmQoc3RkOjpiZWdpbihyZXNlcnZlc0ZvckRlY29kZSksCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZW5kKHJlc2VydmVzRm9yRGVjb2RlKSwgcERhdGEsIGNtcEZ1bmMpOworICBpZiAocmVzdWx0ICE9IHN0ZDo6ZW5kKHJlc2VydmVzRm9yRW5jb2RlKSAmJgorICAgICAgIXdjc2NtcChwRGF0YS51bnRlcm1pbmF0ZWRfY19zdHIoKSwgcmVzdWx0LT5tX2h0bWxSZXNlcnZlKSkgeworICAgICppQ29kZSA9IHJlc3VsdC0+bV91Q29kZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpIVE1MQ29kZTJTVFIodWludDMyX3QgaUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nKiB3c0hUTUxSZXNlcnZlKSB7CisgIGF1dG8gY21wRnVuYyA9IFtdKGNvbnN0IFhGQV9GTUh0bWxSZXNlcnZlQ29kZSBpdGVyLCBjb25zdCB1aW50MzJfdCYgdmFsKSB7CisgICAgcmV0dXJuIGl0ZXIubV91Q29kZSA8IHZhbDsKKyAgfTsKKyAgY29uc3QgWEZBX0ZNSHRtbFJlc2VydmVDb2RlKiByZXN1bHQgPQorICAgICAgc3RkOjpsb3dlcl9ib3VuZChzdGQ6OmJlZ2luKHJlc2VydmVzRm9yRW5jb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjplbmQocmVzZXJ2ZXNGb3JFbmNvZGUpLCBpQ29kZSwgY21wRnVuYyk7CisgIGlmIChyZXN1bHQgIT0gc3RkOjplbmQocmVzZXJ2ZXNGb3JFbmNvZGUpICYmIHJlc3VsdC0+bV91Q29kZSA9PSBpQ29kZSkgeworICAgICp3c0hUTUxSZXNlcnZlID0gcmVzdWx0LT5tX2h0bWxSZXNlcnZlOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OkZvcm1hdChDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOworICBpZiAoYXJncy5HZXRMZW5ndGgoKSA8IDIpIHsKKyAgICBwQ29udGV4dC0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJGb3JtYXQiKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIEJ5dGVTdHJpbmcgc3pQYXR0ZXJuID0gVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLmdldCgpKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdUd28gPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7CisgIEJ5dGVTdHJpbmcgc3pWYWx1ZSA9IFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1R3by5nZXQoKSk7CisKKyAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOworICBDWEZBX0xvY2FsZU1nciogcE1nciA9IHBEb2MtPkdldExvY2FsTWdyKCk7CisgIENYRkFfTm9kZSogcFRoaXNOb2RlID0gVG9Ob2RlKHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpKTsKKyAgQVNTRVJUKHBUaGlzTm9kZSk7CisKKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9IHBUaGlzTm9kZS0+R2V0TG9jYWxlKCk7CisgIHVpbnQzMl90IHBhdHRlcm5UeXBlOworICBXaWRlU3RyaW5nIHdzUGF0dGVybiA9IFdpZGVTdHJpbmc6OkZyb21VVEY4KHN6UGF0dGVybi5Bc1N0cmluZ1ZpZXcoKSk7CisgIFdpZGVTdHJpbmcgd3NWYWx1ZSA9IFdpZGVTdHJpbmc6OkZyb21VVEY4KHN6VmFsdWUuQXNTdHJpbmdWaWV3KCkpOworICBpZiAoIVBhdHRlcm5TdHJpbmdUeXBlKHN6UGF0dGVybi5Bc1N0cmluZ1ZpZXcoKSwgcGF0dGVyblR5cGUpKSB7CisgICAgc3dpdGNoIChwYXR0ZXJuVHlwZSkgeworICAgICAgY2FzZSBYRkFfVlRfREFURVRJTUU6IHsKKyAgICAgICAgYXV0byBpVENoYXIgPSB3c1BhdHRlcm4uRmluZChMJ1QnKTsKKyAgICAgICAgaWYgKCFpVENoYXIuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygiIik7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIFdpZGVTdHJpbmcgd3NEYXRlUGF0dGVybihMImRhdGV7Iik7CisgICAgICAgIHdzRGF0ZVBhdHRlcm4gKz0gd3NQYXR0ZXJuLkxlZnQoaVRDaGFyLnZhbHVlKCkpICsgTCJ9ICI7CisKKyAgICAgICAgV2lkZVN0cmluZyB3c1RpbWVQYXR0ZXJuKEwidGltZXsiKTsKKyAgICAgICAgd3NUaW1lUGF0dGVybiArPQorICAgICAgICAgICAgd3NQYXR0ZXJuLlJpZ2h0KHdzUGF0dGVybi5HZXRMZW5ndGgoKSAtIChpVENoYXIudmFsdWUoKSArIDEpKSArCisgICAgICAgICAgICBMIn0iOworICAgICAgICB3c1BhdHRlcm4gPSB3c0RhdGVQYXR0ZXJuICsgd3NUaW1lUGF0dGVybjsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIFhGQV9WVF9EQVRFOiB7CisgICAgICAgIHdzUGF0dGVybiA9IEwiZGF0ZXsiICsgd3NQYXR0ZXJuICsgTCJ9IjsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIFhGQV9WVF9USU1FOiB7CisgICAgICAgIHdzUGF0dGVybiA9IEwidGltZXsiICsgd3NQYXR0ZXJuICsgTCJ9IjsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIFhGQV9WVF9URVhUOiB7CisgICAgICAgIHdzUGF0dGVybiA9IEwidGV4dHsiICsgd3NQYXR0ZXJuICsgTCJ9IjsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIFhGQV9WVF9GTE9BVDogeworICAgICAgICB3c1BhdHRlcm4gPSBMIm51bXsiICsgd3NQYXR0ZXJuICsgTCJ9IjsKKyAgICAgIH0gYnJlYWs7CisgICAgICBkZWZhdWx0OiB7CisgICAgICAgIFdpZGVTdHJpbmcgd3NUZXN0UGF0dGVybjsKKyAgICAgICAgd3NUZXN0UGF0dGVybiA9IEwibnVteyIgKyB3c1BhdHRlcm4gKyBMIn0iOworICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIHRlbXBMb2NhbGVWYWx1ZShYRkFfVlRfRkxPQVQsIHdzVmFsdWUsIHdzVGVzdFBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUsIHBNZ3IpOworICAgICAgICBpZiAodGVtcExvY2FsZVZhbHVlLklzVmFsaWQoKSkgeworICAgICAgICAgIHdzUGF0dGVybiA9IHdzVGVzdFBhdHRlcm47CisgICAgICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfRkxPQVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgd3NUZXN0UGF0dGVybiA9IEwidGV4dHsiICsgd3NQYXR0ZXJuICsgTCJ9IjsKKyAgICAgICAgICB3c1BhdHRlcm4gPSB3c1Rlc3RQYXR0ZXJuOworICAgICAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX1RFWFQ7CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgfQorICB9CisgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUocGF0dGVyblR5cGUsIHdzVmFsdWUsIHdzUGF0dGVybiwgcExvY2FsZSwgcE1ncik7CisgIFdpZGVTdHJpbmcgd3NSZXQ7CisgIGlmICghbG9jYWxlVmFsdWUuRm9ybWF0UGF0dGVybnMod3NSZXQsIHdzUGF0dGVybiwgcExvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoIiIpOworICAgIHJldHVybjsKKyAgfQorCisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKHdzUmV0LlVURjhFbmNvZGUoKS5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpMZWZ0KENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAyKSB7CisgICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIkxlZnQiKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1R3byA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKKyAgaWYgKChWYWx1ZUlzTnVsbChwVGhpcywgYXJnT25lLmdldCgpKSkgfHwKKyAgICAgIChWYWx1ZUlzTnVsbChwVGhpcywgYXJnVHdvLmdldCgpKSkpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICByZXR1cm47CisgIH0KKworICBCeXRlU3RyaW5nIHNvdXJjZVN0cmluZyA9IFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZS5nZXQoKSk7CisgIGludDMyX3QgY291bnQgPSBzdGQ6Om1heCgwLCBWYWx1ZVRvSW50ZWdlcihwVGhpcywgYXJnVHdvLmdldCgpKSk7CisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKHNvdXJjZVN0cmluZy5MZWZ0KGNvdW50KS5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpMZW4oQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAxKSB7CisgICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIkxlbiIpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKKyAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdPbmUuZ2V0KCkpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgQnl0ZVN0cmluZyBzb3VyY2VTdHJpbmcgPSBWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUuZ2V0KCkpOworICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoc291cmNlU3RyaW5nLkdldExlbmd0aCgpKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6Okxvd2VyKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7CisgIGlmIChhcmdjIDwgMSB8fCBhcmdjID4gMikgeworICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJMb3dlciIpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKKyAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdPbmUuZ2V0KCkpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgQ0ZYX1dpZGVUZXh0QnVmIGxvd1N0cmluZ0J1ZjsKKyAgQnl0ZVN0cmluZyBhcmdTdHJpbmcgPSBWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUuZ2V0KCkpOworICBXaWRlU3RyaW5nIHdzQXJnU3RyaW5nID0gV2lkZVN0cmluZzo6RnJvbVVURjgoYXJnU3RyaW5nLkFzU3RyaW5nVmlldygpKTsKKyAgY29uc3Qgd2NoYXJfdCogcERhdGEgPSB3c0FyZ1N0cmluZy5jX3N0cigpOworICBzaXplX3QgaSA9IDA7CisgIHdoaWxlIChpIDwgYXJnU3RyaW5nLkdldExlbmd0aCgpKSB7CisgICAgaW50MzJfdCBjaCA9IHBEYXRhW2ldOworICAgIGlmICgoY2ggPj0gMHg0MSAmJiBjaCA8PSAweDVBKSB8fCAoY2ggPj0gMHhDMCAmJiBjaCA8PSAweERFKSkKKyAgICAgIGNoICs9IDMyOworICAgIGVsc2UgaWYgKGNoID09IDB4MTAwIHx8IGNoID09IDB4MTAyIHx8IGNoID09IDB4MTA0KQorICAgICAgY2ggKz0gMTsKKworICAgIGxvd1N0cmluZ0J1Zi5BcHBlbmRDaGFyKGNoKTsKKyAgICArK2k7CisgIH0KKyAgbG93U3RyaW5nQnVmLkFwcGVuZENoYXIoMCk7CisKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoCisgICAgICBGWF9VVEY4RW5jb2RlKGxvd1N0cmluZ0J1Zi5Bc1N0cmluZ1ZpZXcoKSkuQXNTdHJpbmdWaWV3KCkpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6THRyaW0oQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMSkgeworICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJMdHJpbSIpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKKyAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdPbmUuZ2V0KCkpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgQnl0ZVN0cmluZyBzb3VyY2VTdHJpbmcgPSBWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUuZ2V0KCkpOworICBzb3VyY2VTdHJpbmcuVHJpbUxlZnQoKTsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoc291cmNlU3RyaW5nLkFzU3RyaW5nVmlldygpKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlBhcnNlKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOworICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAyKSB7CisgICAgcENvbnRleHQtPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiUGFyc2UiKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1R3byA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKKyAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdUd28uZ2V0KCkpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgQnl0ZVN0cmluZyBzelBhdHRlcm4gPSBWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUuZ2V0KCkpOworICBCeXRlU3RyaW5nIHN6VmFsdWUgPSBWYWx1ZVRvVVRGOFN0cmluZyhhcmdUd28uZ2V0KCkpOworICBDWEZBX0RvY3VtZW50KiBwRG9jID0gcENvbnRleHQtPkdldERvY3VtZW50KCk7CisgIENYRkFfTG9jYWxlTWdyKiBwTWdyID0gcERvYy0+R2V0TG9jYWxNZ3IoKTsKKyAgQ1hGQV9Ob2RlKiBwVGhpc05vZGUgPSBUb05vZGUocERvYy0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRUaGlzT2JqZWN0KCkpOworICBBU1NFUlQocFRoaXNOb2RlKTsKKworICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gcFRoaXNOb2RlLT5HZXRMb2NhbGUoKTsKKyAgV2lkZVN0cmluZyB3c1BhdHRlcm4gPSBXaWRlU3RyaW5nOjpGcm9tVVRGOChzelBhdHRlcm4uQXNTdHJpbmdWaWV3KCkpOworICBXaWRlU3RyaW5nIHdzVmFsdWUgPSBXaWRlU3RyaW5nOjpGcm9tVVRGOChzelZhbHVlLkFzU3RyaW5nVmlldygpKTsKKyAgdWludDMyX3QgcGF0dGVyblR5cGU7CisgIGlmIChQYXR0ZXJuU3RyaW5nVHlwZShzelBhdHRlcm4uQXNTdHJpbmdWaWV3KCksIHBhdHRlcm5UeXBlKSkgeworICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUocGF0dGVyblR5cGUsIHdzVmFsdWUsIHdzUGF0dGVybiwgcExvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZ3IpOworICAgIGlmICghbG9jYWxlVmFsdWUuSXNWYWxpZCgpKSB7CisgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygiIik7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKAorICAgICAgICBsb2NhbGVWYWx1ZS5HZXRWYWx1ZSgpLlVURjhFbmNvZGUoKS5Bc1N0cmluZ1ZpZXcoKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgc3dpdGNoIChwYXR0ZXJuVHlwZSkgeworICAgIGNhc2UgWEZBX1ZUX0RBVEVUSU1FOiB7CisgICAgICBhdXRvIGlUQ2hhciA9IHdzUGF0dGVybi5GaW5kKEwnVCcpOworICAgICAgaWYgKCFpVENoYXIuaGFzX3ZhbHVlKCkpIHsKKyAgICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoIiIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBXaWRlU3RyaW5nIHdzRGF0ZVBhdHRlcm4oTCJkYXRleyIgKyB3c1BhdHRlcm4uTGVmdChpVENoYXIudmFsdWUoKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwifSAiKTsKKyAgICAgIFdpZGVTdHJpbmcgd3NUaW1lUGF0dGVybigKKyAgICAgICAgICBMInRpbWV7IiArCisgICAgICAgICAgd3NQYXR0ZXJuLlJpZ2h0KHdzUGF0dGVybi5HZXRMZW5ndGgoKSAtIChpVENoYXIudmFsdWUoKSArIDEpKSArIEwifSIpOworICAgICAgd3NQYXR0ZXJuID0gd3NEYXRlUGF0dGVybiArIHdzVGltZVBhdHRlcm47CisgICAgICBDWEZBX0xvY2FsZVZhbHVlIGxvY2FsZVZhbHVlKHBhdHRlcm5UeXBlLCB3c1ZhbHVlLCB3c1BhdHRlcm4sIHBMb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZ3IpOworICAgICAgaWYgKCFsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsKKyAgICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoIiIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygKKyAgICAgICAgICBsb2NhbGVWYWx1ZS5HZXRWYWx1ZSgpLlVURjhFbmNvZGUoKS5Bc1N0cmluZ1ZpZXcoKSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgWEZBX1ZUX0RBVEU6IHsKKyAgICAgIHdzUGF0dGVybiA9IEwiZGF0ZXsiICsgd3NQYXR0ZXJuICsgTCJ9IjsKKyAgICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUocGF0dGVyblR5cGUsIHdzVmFsdWUsIHdzUGF0dGVybiwgcExvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1ncik7CisgICAgICBpZiAoIWxvY2FsZVZhbHVlLklzVmFsaWQoKSkgeworICAgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygiIik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKAorICAgICAgICAgIGxvY2FsZVZhbHVlLkdldFZhbHVlKCkuVVRGOEVuY29kZSgpLkFzU3RyaW5nVmlldygpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FzZSBYRkFfVlRfVElNRTogeworICAgICAgd3NQYXR0ZXJuID0gTCJ0aW1leyIgKyB3c1BhdHRlcm4gKyBMIn0iOworICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSBsb2NhbGVWYWx1ZShwYXR0ZXJuVHlwZSwgd3NWYWx1ZSwgd3NQYXR0ZXJuLCBwTG9jYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWdyKTsKKyAgICAgIGlmICghbG9jYWxlVmFsdWUuSXNWYWxpZCgpKSB7CisgICAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKCIiKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoCisgICAgICAgICAgbG9jYWxlVmFsdWUuR2V0VmFsdWUoKS5VVEY4RW5jb2RlKCkuQXNTdHJpbmdWaWV3KCkpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjYXNlIFhGQV9WVF9URVhUOiB7CisgICAgICB3c1BhdHRlcm4gPSBMInRleHR7IiArIHdzUGF0dGVybiArIEwifSI7CisgICAgICBDWEZBX0xvY2FsZVZhbHVlIGxvY2FsZVZhbHVlKFhGQV9WVF9URVhULCB3c1ZhbHVlLCB3c1BhdHRlcm4sIHBMb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZ3IpOworICAgICAgaWYgKCFsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsKKyAgICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoIiIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygKKyAgICAgICAgICBsb2NhbGVWYWx1ZS5HZXRWYWx1ZSgpLlVURjhFbmNvZGUoKS5Bc1N0cmluZ1ZpZXcoKSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGNhc2UgWEZBX1ZUX0ZMT0FUOiB7CisgICAgICB3c1BhdHRlcm4gPSBMIm51bXsiICsgd3NQYXR0ZXJuICsgTCJ9IjsKKyAgICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUoWEZBX1ZUX0ZMT0FULCB3c1ZhbHVlLCB3c1BhdHRlcm4sIHBMb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZ3IpOworICAgICAgaWYgKCFsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsKKyAgICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoIiIpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldERvdWJsZShsb2NhbGVWYWx1ZS5HZXREb3VibGVOdW0oKSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgIFdpZGVTdHJpbmcgd3NUZXN0UGF0dGVybjsKKyAgICAgIHdzVGVzdFBhdHRlcm4gPSBMIm51bXsiICsgd3NQYXR0ZXJuICsgTCJ9IjsKKyAgICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUoWEZBX1ZUX0ZMT0FULCB3c1ZhbHVlLCB3c1Rlc3RQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLCBwTWdyKTsKKyAgICAgIGlmIChsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsKKyAgICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXREb3VibGUobG9jYWxlVmFsdWUuR2V0RG91YmxlTnVtKCkpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIHdzVGVzdFBhdHRlcm4gPSBMInRleHR7IiArIHdzUGF0dGVybiArIEwifSI7CisgICAgICBDWEZBX0xvY2FsZVZhbHVlIGxvY2FsZVZhbHVlMihYRkFfVlRfVEVYVCwgd3NWYWx1ZSwgd3NUZXN0UGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUsIHBNZ3IpOworICAgICAgaWYgKCFsb2NhbGVWYWx1ZTIuSXNWYWxpZCgpKSB7CisgICAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKCIiKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoCisgICAgICAgICAgbG9jYWxlVmFsdWUyLkdldFZhbHVlKCkuVVRGOEVuY29kZSgpLkFzU3RyaW5nVmlldygpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlJlcGxhY2UoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7CisgIGlmIChhcmdjIDwgMiB8fCBhcmdjID4gMykgeworICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJSZXBsYWNlIik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdUd28gPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7CisgIEJ5dGVTdHJpbmcgb25lU3RyaW5nOworICBCeXRlU3RyaW5nIHR3b1N0cmluZzsKKyAgaWYgKCFWYWx1ZUlzTnVsbChwVGhpcywgYXJnT25lLmdldCgpKSAmJiAhVmFsdWVJc051bGwocFRoaXMsIGFyZ1R3by5nZXQoKSkpIHsKKyAgICBvbmVTdHJpbmcgPSBWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUuZ2V0KCkpOworICAgIHR3b1N0cmluZyA9IFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1R3by5nZXQoKSk7CisgIH0KKworICBCeXRlU3RyaW5nIHRocmVlU3RyaW5nOworICBpZiAoYXJnYyA+IDIpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdUaHJlZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAyKTsKKyAgICB0aHJlZVN0cmluZyA9IFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1RocmVlLmdldCgpKTsKKyAgfQorCisgIHNpemVfdCBpRmluZExlbiA9IHR3b1N0cmluZy5HZXRMZW5ndGgoKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHJlc3VsdFN0cmluZzsKKyAgc2l6ZV90IGlGaW5kSW5kZXggPSAwOworICBmb3IgKHNpemVfdCB1ID0gMDsgdSA8IG9uZVN0cmluZy5HZXRMZW5ndGgoKTsgKyt1KSB7CisgICAgY2hhciBjaCA9IHN0YXRpY19jYXN0PGNoYXI+KG9uZVN0cmluZ1t1XSk7CisgICAgaWYgKGNoICE9IHN0YXRpY19jYXN0PGNoYXI+KHR3b1N0cmluZ1tpRmluZEluZGV4XSkpIHsKKyAgICAgIHJlc3VsdFN0cmluZyA8PCBjaDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHNpemVfdCBpVGVtcCA9IHUgKyAxOworICAgICsraUZpbmRJbmRleDsKKyAgICB3aGlsZSAoaUZpbmRJbmRleCA8IGlGaW5kTGVuKSB7CisgICAgICB1aW50OF90IGNoVGVtcCA9IG9uZVN0cmluZ1tpVGVtcF07CisgICAgICBpZiAoY2hUZW1wICE9IHR3b1N0cmluZ1tpRmluZEluZGV4XSkgeworICAgICAgICBpRmluZEluZGV4ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgICsraVRlbXA7CisgICAgICArK2lGaW5kSW5kZXg7CisgICAgfQorICAgIGlmIChpRmluZEluZGV4ID09IGlGaW5kTGVuKSB7CisgICAgICByZXN1bHRTdHJpbmcgPDwgdGhyZWVTdHJpbmc7CisgICAgICB1ICs9IGlGaW5kTGVuIC0gMTsKKyAgICAgIGlGaW5kSW5kZXggPSAwOworICAgIH0gZWxzZSB7CisgICAgICByZXN1bHRTdHJpbmcgPDwgY2g7CisgICAgfQorICB9CisgIHJlc3VsdFN0cmluZyA8PCAnXDAnOworICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZyhCeXRlU3RyaW5nVmlldyhyZXN1bHRTdHJpbmcuc3RyKCkuY19zdHIoKSkpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6UmlnaHQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMikgeworICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJSaWdodCIpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVHdvID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOworICBpZiAoKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdPbmUuZ2V0KCkpKSB8fAorICAgICAgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdUd28uZ2V0KCkpKSkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgIHJldHVybjsKKyAgfQorCisgIEJ5dGVTdHJpbmcgc291cmNlU3RyaW5nID0gVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLmdldCgpKTsKKyAgaW50MzJfdCBjb3VudCA9IHN0ZDo6bWF4KDAsIFZhbHVlVG9JbnRlZ2VyKHBUaGlzLCBhcmdUd28uZ2V0KCkpKTsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoc291cmNlU3RyaW5nLlJpZ2h0KGNvdW50KS5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpSdHJpbShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAxKSB7CisgICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIlJ0cmltIik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICBpZiAoVmFsdWVJc051bGwocFRoaXMsIGFyZ09uZS5nZXQoKSkpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICByZXR1cm47CisgIH0KKworICBCeXRlU3RyaW5nIHNvdXJjZVN0cmluZyA9IFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZS5nZXQoKSk7CisgIHNvdXJjZVN0cmluZy5UcmltUmlnaHQoKTsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoc291cmNlU3RyaW5nLkFzU3RyaW5nVmlldygpKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlNwYWNlKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDEpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiU3BhY2UiKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIGlmIChhcmdPbmUtPklzTnVsbCgpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaW50MzJfdCBjb3VudCA9IHN0ZDo6bWF4KDAsIFZhbHVlVG9JbnRlZ2VyKHBUaGlzLCBhcmdPbmUuZ2V0KCkpKTsKKyAgc3RkOjpvc3RyaW5nc3RyZWFtIHNwYWNlU3RyaW5nOworICBpbnQzMl90IGluZGV4ID0gMDsKKyAgd2hpbGUgKGluZGV4IDwgY291bnQpIHsKKyAgICBzcGFjZVN0cmluZyA8PCAnICc7CisgICAgaW5kZXgrKzsKKyAgfQorICBzcGFjZVN0cmluZyA8PCAnXDAnOworICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZyhCeXRlU3RyaW5nVmlldyhzcGFjZVN0cmluZy5zdHIoKS5jX3N0cigpKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpTdHIoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOworICBpZiAoYXJnYyA8IDEgfHwgYXJnYyA+IDMpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiU3RyIik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gbnVtYmVyVmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIGlmIChudW1iZXJWYWx1ZS0+SXNOdWxsKCkpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICByZXR1cm47CisgIH0KKyAgZmxvYXQgZk51bWJlciA9IFZhbHVlVG9GbG9hdChwVGhpcywgbnVtYmVyVmFsdWUuZ2V0KCkpOworCisgIGludDMyX3QgaVdpZHRoID0gMTA7CisgIGlmIChhcmdjID4gMSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IHdpZHRoVmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7CisgICAgaVdpZHRoID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oVmFsdWVUb0Zsb2F0KHBUaGlzLCB3aWR0aFZhbHVlLmdldCgpKSk7CisgIH0KKworICBpbnQzMl90IGlQcmVjaXNpb24gPSAwOworICBpZiAoYXJnYyA+IDIpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBwcmVjaXNpb25WYWx1ZSA9CisgICAgICAgIEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAyKTsKKyAgICBpUHJlY2lzaW9uID0gc3RkOjptYXgoCisgICAgICAgIDAsIHN0YXRpY19jYXN0PGludDMyX3Q+KFZhbHVlVG9GbG9hdChwVGhpcywgcHJlY2lzaW9uVmFsdWUuZ2V0KCkpKSk7CisgIH0KKworICBCeXRlU3RyaW5nIGZvcm1hdFN0ciA9ICIlIjsKKyAgaWYgKGlQcmVjaXNpb24pIHsKKyAgICBmb3JtYXRTdHIgKz0gIi4iOworICAgIGZvcm1hdFN0ciArPSBCeXRlU3RyaW5nOjpGb3JtYXRJbnRlZ2VyKGlQcmVjaXNpb24pOworICB9CisgIGZvcm1hdFN0ciArPSAiZiI7CisgIEJ5dGVTdHJpbmcgbnVtYmVyU3RyaW5nID0gQnl0ZVN0cmluZzo6Rm9ybWF0KGZvcm1hdFN0ci5jX3N0cigpLCBmTnVtYmVyKTsKKworICBjb25zdCBjaGFyKiBwRGF0YSA9IG51bWJlclN0cmluZy5jX3N0cigpOworICBpbnQzMl90IGlMZW5ndGggPSBudW1iZXJTdHJpbmcuR2V0TGVuZ3RoKCk7CisgIGludDMyX3QgdSA9IDA7CisgIHdoaWxlICh1IDwgaUxlbmd0aCkgeworICAgIGlmIChwRGF0YVt1XSA9PSAnLicpCisgICAgICBicmVhazsKKworICAgICsrdTsKKyAgfQorCisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXN1bHRCdWY7CisgIGlmICh1ID4gaVdpZHRoIHx8IChpUHJlY2lzaW9uICsgdSkgPj0gaVdpZHRoKSB7CisgICAgaW50MzJfdCBpID0gMDsKKyAgICB3aGlsZSAoaSA8IGlXaWR0aCkgeworICAgICAgcmVzdWx0QnVmIDw8ICcqJzsKKyAgICAgICsraTsKKyAgICB9CisgICAgcmVzdWx0QnVmIDw8ICdcMCc7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoQnl0ZVN0cmluZ1ZpZXcocmVzdWx0QnVmLnN0cigpLmNfc3RyKCkpKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAodSA9PSBpTGVuZ3RoKSB7CisgICAgaWYgKGlMZW5ndGggPiBpV2lkdGgpIHsKKyAgICAgIGludDMyX3QgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IGlXaWR0aCkgeworICAgICAgICByZXN1bHRCdWYgPDwgJyonOworICAgICAgICArK2k7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGludDMyX3QgaSA9IDA7CisgICAgICB3aGlsZSAoaSA8IGlXaWR0aCAtIGlMZW5ndGgpIHsKKyAgICAgICAgcmVzdWx0QnVmIDw8ICcgJzsKKyAgICAgICAgKytpOworICAgICAgfQorICAgICAgcmVzdWx0QnVmIDw8IHBEYXRhOworICAgIH0KKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZyhCeXRlU3RyaW5nVmlldyhyZXN1bHRCdWYuc3RyKCkuY19zdHIoKSkpOworICAgIHJldHVybjsKKyAgfQorCisgIGludDMyX3QgaUxlYXZpbmdTcGFjZSA9IGlXaWR0aCAtIHUgLSBpUHJlY2lzaW9uOworICBpZiAoaVByZWNpc2lvbiAhPSAwKQorICAgIGlMZWF2aW5nU3BhY2UtLTsKKworICBpbnQzMl90IGkgPSAwOworICB3aGlsZSAoaSA8IGlMZWF2aW5nU3BhY2UpIHsKKyAgICByZXN1bHRCdWYgPDwgJyAnOworICAgICsraTsKKyAgfQorICBpID0gMDsKKyAgd2hpbGUgKGkgPCB1KSB7CisgICAgcmVzdWx0QnVmIDw8IHBEYXRhW2ldOworICAgICsraTsKKyAgfQorICBpZiAoaVByZWNpc2lvbiAhPSAwKQorICAgIHJlc3VsdEJ1ZiA8PCAnLic7CisKKyAgdSsrOworICBpID0gMDsKKyAgd2hpbGUgKHUgPCBpTGVuZ3RoKSB7CisgICAgaWYgKGkgPj0gaVByZWNpc2lvbikKKyAgICAgIGJyZWFrOworCisgICAgcmVzdWx0QnVmIDw8IHBEYXRhW3VdOworICAgICsraTsKKyAgICArK3U7CisgIH0KKyAgd2hpbGUgKGkgPCBpUHJlY2lzaW9uKSB7CisgICAgcmVzdWx0QnVmIDw8ICcwJzsKKyAgICArK2k7CisgIH0KKyAgcmVzdWx0QnVmIDw8ICdcMCc7CisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKEJ5dGVTdHJpbmdWaWV3KHJlc3VsdEJ1Zi5zdHIoKS5jX3N0cigpKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpTdHVmZihDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOworICBpZiAoYXJnYyA8IDMgfHwgYXJnYyA+IDQpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiU3R1ZmYiKTsKKyAgICByZXR1cm47CisgIH0KKworICBCeXRlU3RyaW5nIHNvdXJjZVN0cmluZzsKKyAgQnl0ZVN0cmluZyBpbnNlcnRTdHJpbmc7CisgIGludDMyX3QgaUxlbmd0aCA9IDA7CisgIGludDMyX3QgaVN0YXJ0ID0gMDsKKyAgaW50MzJfdCBpRGVsZXRlID0gMDsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gc291cmNlVmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IHN0YXJ0VmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGRlbGV0ZVZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDIpOworICBpZiAoIXNvdXJjZVZhbHVlLT5Jc051bGwoKSAmJiAhc3RhcnRWYWx1ZS0+SXNOdWxsKCkgJiYKKyAgICAgICFkZWxldGVWYWx1ZS0+SXNOdWxsKCkpIHsKKyAgICBzb3VyY2VTdHJpbmcgPSBWYWx1ZVRvVVRGOFN0cmluZyhzb3VyY2VWYWx1ZS5nZXQoKSk7CisgICAgaUxlbmd0aCA9IHNvdXJjZVN0cmluZy5HZXRMZW5ndGgoKTsKKyAgICBpU3RhcnQgPSBwZGZpdW06OmNsYW1wKAorICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihWYWx1ZVRvRmxvYXQocFRoaXMsIHN0YXJ0VmFsdWUuZ2V0KCkpKSwgMSwKKyAgICAgICAgaUxlbmd0aCk7CisgICAgaURlbGV0ZSA9IHN0ZDo6bWF4KAorICAgICAgICAwLCBzdGF0aWNfY2FzdDxpbnQzMl90PihWYWx1ZVRvRmxvYXQocFRoaXMsIGRlbGV0ZVZhbHVlLmdldCgpKSkpOworICB9CisKKyAgaWYgKGFyZ2MgPiAzKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gaW5zZXJ0VmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMyk7CisgICAgaW5zZXJ0U3RyaW5nID0gVmFsdWVUb1VURjhTdHJpbmcoaW5zZXJ0VmFsdWUuZ2V0KCkpOworICB9CisKKyAgaVN0YXJ0IC09IDE7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXN1bHRTdHJpbmc7CisgIGludDMyX3QgaSA9IDA7CisgIHdoaWxlIChpIDwgaVN0YXJ0KSB7CisgICAgcmVzdWx0U3RyaW5nIDw8IHN0YXRpY19jYXN0PGNoYXI+KHNvdXJjZVN0cmluZ1tpXSk7CisgICAgKytpOworICB9CisgIHJlc3VsdFN0cmluZyA8PCBpbnNlcnRTdHJpbmcuQXNTdHJpbmdWaWV3KCk7CisgIGkgPSBpU3RhcnQgKyBpRGVsZXRlOworICB3aGlsZSAoaSA8IGlMZW5ndGgpIHsKKyAgICByZXN1bHRTdHJpbmcgPDwgc3RhdGljX2Nhc3Q8Y2hhcj4oc291cmNlU3RyaW5nW2ldKTsKKyAgICArK2k7CisgIH0KKyAgcmVzdWx0U3RyaW5nIDw8ICdcMCc7CisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKEJ5dGVTdHJpbmdWaWV3KHJlc3VsdFN0cmluZy5zdHIoKS5jX3N0cigpKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpTdWJzdHIoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAzKSB7CisgICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIlN1YnN0ciIpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IHN0cmluZ1ZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBzdGFydFZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBlbmRWYWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAyKTsKKyAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBzdHJpbmdWYWx1ZS5nZXQoKSkgfHwKKyAgICAgIChWYWx1ZUlzTnVsbChwVGhpcywgc3RhcnRWYWx1ZS5nZXQoKSkpIHx8CisgICAgICAoVmFsdWVJc051bGwocFRoaXMsIGVuZFZhbHVlLmdldCgpKSkpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICByZXR1cm47CisgIH0KKworICBpbnQzMl90IGlTdGFydCA9IDA7CisgIGludDMyX3QgaUNvdW50ID0gMDsKKyAgQnl0ZVN0cmluZyBzelNvdXJjZVN0ciA9IFZhbHVlVG9VVEY4U3RyaW5nKHN0cmluZ1ZhbHVlLmdldCgpKTsKKyAgaW50MzJfdCBpTGVuZ3RoID0gc3pTb3VyY2VTdHIuR2V0TGVuZ3RoKCk7CisgIGlmIChpTGVuZ3RoID09IDApIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygiIik7CisgICAgcmV0dXJuOworICB9CisKKyAgaVN0YXJ0ID0gcGRmaXVtOjpjbGFtcCgKKyAgICAgIGlMZW5ndGgsIDEsIHN0YXRpY19jYXN0PGludDMyX3Q+KFZhbHVlVG9GbG9hdChwVGhpcywgc3RhcnRWYWx1ZS5nZXQoKSkpKTsKKyAgaUNvdW50ID0KKyAgICAgIHN0ZDo6bWF4KDAsIHN0YXRpY19jYXN0PGludDMyX3Q+KFZhbHVlVG9GbG9hdChwVGhpcywgZW5kVmFsdWUuZ2V0KCkpKSk7CisKKyAgaVN0YXJ0IC09IDE7CisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKAorICAgICAgc3pTb3VyY2VTdHIuTWlkKGlTdGFydCwgaUNvdW50KS5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpVdWlkKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOworICBpZiAoYXJnYyA8IDAgfHwgYXJnYyA+IDEpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiVXVpZCIpOworICAgIHJldHVybjsKKyAgfQorCisgIGludDMyX3QgaU51bSA9IDA7CisgIGlmIChhcmdjID4gMCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKKyAgICBpTnVtID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdPbmUuZ2V0KCkpKTsKKyAgfQorICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZyhHVUlEU3RyaW5nKCEhaU51bSkuQXNTdHJpbmdWaWV3KCkpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6VXBwZXIoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKKyAgaWYgKGFyZ2MgPCAxIHx8IGFyZ2MgPiAyKSB7CisgICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIlVwcGVyIik7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICBpZiAoVmFsdWVJc051bGwocFRoaXMsIGFyZ09uZS5nZXQoKSkpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICByZXR1cm47CisgIH0KKworICBDRlhfV2lkZVRleHRCdWYgdXBwZXJTdHJpbmdCdWY7CisgIEJ5dGVTdHJpbmcgYXJnU3RyaW5nID0gVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLmdldCgpKTsKKyAgV2lkZVN0cmluZyB3c0FyZ1N0cmluZyA9IFdpZGVTdHJpbmc6OkZyb21VVEY4KGFyZ1N0cmluZy5Bc1N0cmluZ1ZpZXcoKSk7CisgIGNvbnN0IHdjaGFyX3QqIHBEYXRhID0gd3NBcmdTdHJpbmcuY19zdHIoKTsKKyAgc2l6ZV90IGkgPSAwOworICB3aGlsZSAoaSA8IHdzQXJnU3RyaW5nLkdldExlbmd0aCgpKSB7CisgICAgaW50MzJfdCBjaCA9IHBEYXRhW2ldOworICAgIGlmICgoY2ggPj0gMHg2MSAmJiBjaCA8PSAweDdBKSB8fCAoY2ggPj0gMHhFMCAmJiBjaCA8PSAweEZFKSkKKyAgICAgIGNoIC09IDMyOworICAgIGVsc2UgaWYgKGNoID09IDB4MTAxIHx8IGNoID09IDB4MTAzIHx8IGNoID09IDB4MTA1KQorICAgICAgY2ggLT0gMTsKKworICAgIHVwcGVyU3RyaW5nQnVmLkFwcGVuZENoYXIoY2gpOworICAgICsraTsKKyAgfQorICB1cHBlclN0cmluZ0J1Zi5BcHBlbmRDaGFyKDApOworCisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKAorICAgICAgRlhfVVRGOEVuY29kZSh1cHBlclN0cmluZ0J1Zi5Bc1N0cmluZ1ZpZXcoKSkuQXNTdHJpbmdWaWV3KCkpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6V29yZE51bShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKKyAgaWYgKGFyZ2MgPCAxIHx8IGFyZ2MgPiAzKSB7CisgICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIldvcmROdW0iKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBudW1iZXJWYWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKKyAgaWYgKG51bWJlclZhbHVlLT5Jc051bGwoKSkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgIHJldHVybjsKKyAgfQorICBmbG9hdCBmTnVtYmVyID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBudW1iZXJWYWx1ZS5nZXQoKSk7CisKKyAgaW50MzJfdCBpSWRlbnRpZmllciA9IDA7CisgIGlmIChhcmdjID4gMSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGlkZW50aWZpZXJWYWx1ZSA9CisgICAgICAgIEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKKyAgICBpZiAoaWRlbnRpZmllclZhbHVlLT5Jc051bGwoKSkgeworICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlJZGVudGlmaWVyID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oVmFsdWVUb0Zsb2F0KHBUaGlzLCBpZGVudGlmaWVyVmFsdWUuZ2V0KCkpKTsKKyAgfQorCisgIEJ5dGVTdHJpbmcgbG9jYWxlU3RyaW5nOworICBpZiAoYXJnYyA+IDIpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBsb2NhbGVWYWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAyKTsKKyAgICBpZiAobG9jYWxlVmFsdWUtPklzTnVsbCgpKSB7CisgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbG9jYWxlU3RyaW5nID0gVmFsdWVUb1VURjhTdHJpbmcobG9jYWxlVmFsdWUuZ2V0KCkpOworICB9CisKKyAgaWYgKGZOdW1iZXIgPCAwLjBmIHx8IGZOdW1iZXIgPiA5MjIzMzcyMDM2ODU0Nzc1NTAuMGYpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygiKiIpOworICAgIHJldHVybjsKKyAgfQorCisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKAorICAgICAgV29yZFVTKEJ5dGVTdHJpbmc6OkZvcm1hdCgiJS4yZiIsIGZOdW1iZXIpLCBpSWRlbnRpZmllcikuQXNTdHJpbmdWaWV3KCkpOworfQorCisvLyBzdGF0aWMKK0J5dGVTdHJpbmcgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6VHJpbGxpb25VUyhjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pEYXRhKSB7CisgIHN0ZDo6b3N0cmluZ3N0cmVhbSBzdHJCdWY7CisgIEJ5dGVTdHJpbmdWaWV3IHBVbml0c1tdID0geyJ6ZXJvIiwgIm9uZSIsICJ0d28iLCAgICJ0aHJlZSIsICJmb3VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpdmUiLCAic2l4IiwgInNldmVuIiwgImVpZ2h0IiwgIm5pbmUifTsKKyAgQnl0ZVN0cmluZ1ZpZXcgcENhcFVuaXRzW10gPSB7Ilplcm8iLCAiT25lIiwgIlR3byIsICAgIlRocmVlIiwgIkZvdXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRml2ZSIsICJTaXgiLCAiU2V2ZW4iLCAiRWlnaHQiLCAiTmluZSJ9OworICBCeXRlU3RyaW5nVmlldyBwVGVuc1tdID0geyJUZW4iLCAgICAgICJFbGV2ZW4iLCAgIlR3ZWx2ZSIsICAiVGhpcnRlZW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb3VydGVlbiIsICJGaWZ0ZWVuIiwgIlNpeHRlZW4iLCAiU2V2ZW50ZWVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWlnaHRlZW4iLCAiTmluZXRlZW4ifTsKKyAgQnl0ZVN0cmluZ1ZpZXcgcExhc3RUZW5zW10gPSB7IlR3ZW50eSIsICJUaGlydHkiLCAgIkZvcnR5IiwgICJGaWZ0eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaXh0eSIsICAiU2V2ZW50eSIsICJFaWdodHkiLCAiTmluZXR5In07CisgIEJ5dGVTdHJpbmdWaWV3IHBDb21tW10gPSB7IiBIdW5kcmVkICIsICIgVGhvdXNhbmQgIiwgIiBNaWxsaW9uICIsICIgQmlsbGlvbiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcmlsbGlvbiJ9OworICBjb25zdCBjaGFyKiBwRGF0YSA9IHN6RGF0YS51bnRlcm1pbmF0ZWRfY19zdHIoKTsKKyAgaW50MzJfdCBpTGVuZ3RoID0gc3pEYXRhLkdldExlbmd0aCgpOworICBpbnQzMl90IGlDb21tID0gMDsKKyAgaWYgKGlMZW5ndGggPiAxMikKKyAgICBpQ29tbSA9IDQ7CisgIGVsc2UgaWYgKGlMZW5ndGggPiA5KQorICAgIGlDb21tID0gMzsKKyAgZWxzZSBpZiAoaUxlbmd0aCA+IDYpCisgICAgaUNvbW0gPSAyOworICBlbHNlIGlmIChpTGVuZ3RoID4gMykKKyAgICBpQ29tbSA9IDE7CisKKyAgaW50MzJfdCBpRmlyc3RDb3VudCA9IGlMZW5ndGggJSAzOworICBpZiAoaUZpcnN0Q291bnQgPT0gMCkKKyAgICBpRmlyc3RDb3VudCA9IDM7CisKKyAgaW50MzJfdCBpSW5kZXggPSAwOworICBpZiAoaUZpcnN0Q291bnQgPT0gMykgeworICAgIGlmIChwRGF0YVtpSW5kZXhdICE9ICcwJykgeworICAgICAgc3RyQnVmIDw8IHBDYXBVbml0c1twRGF0YVtpSW5kZXhdIC0gJzAnXTsKKyAgICAgIHN0ckJ1ZiA8PCBwQ29tbVswXTsKKyAgICB9CisgICAgaWYgKHBEYXRhW2lJbmRleCArIDFdID09ICcwJykgeworICAgICAgc3RyQnVmIDw8IHBDYXBVbml0c1twRGF0YVtpSW5kZXggKyAyXSAtICcwJ107CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChwRGF0YVtpSW5kZXggKyAxXSA+ICcxJykgeworICAgICAgICBzdHJCdWYgPDwgcExhc3RUZW5zW3BEYXRhW2lJbmRleCArIDFdIC0gJzInXTsKKyAgICAgICAgc3RyQnVmIDw8ICItIjsKKyAgICAgICAgc3RyQnVmIDw8IHBVbml0c1twRGF0YVtpSW5kZXggKyAyXSAtICcwJ107CisgICAgICB9IGVsc2UgaWYgKHBEYXRhW2lJbmRleCArIDFdID09ICcxJykgeworICAgICAgICBzdHJCdWYgPDwgcFRlbnNbcERhdGFbaUluZGV4ICsgMl0gLSAnMCddOworICAgICAgfSBlbHNlIGlmIChwRGF0YVtpSW5kZXggKyAxXSA9PSAnMCcpIHsKKyAgICAgICAgc3RyQnVmIDw8IHBDYXBVbml0c1twRGF0YVtpSW5kZXggKyAyXSAtICcwJ107CisgICAgICB9CisgICAgfQorICAgIGlJbmRleCArPSAzOworICB9IGVsc2UgaWYgKGlGaXJzdENvdW50ID09IDIpIHsKKyAgICBpZiAocERhdGFbaUluZGV4XSA9PSAnMCcpIHsKKyAgICAgIHN0ckJ1ZiA8PCBwQ2FwVW5pdHNbcERhdGFbaUluZGV4ICsgMV0gLSAnMCddOworICAgIH0gZWxzZSB7CisgICAgICBpZiAocERhdGFbaUluZGV4XSA+ICcxJykgeworICAgICAgICBzdHJCdWYgPDwgcExhc3RUZW5zW3BEYXRhW2lJbmRleF0gLSAnMiddOworICAgICAgICBzdHJCdWYgPDwgIi0iOworICAgICAgICBzdHJCdWYgPDwgcFVuaXRzW3BEYXRhW2lJbmRleCArIDFdIC0gJzAnXTsKKyAgICAgIH0gZWxzZSBpZiAocERhdGFbaUluZGV4XSA9PSAnMScpIHsKKyAgICAgICAgc3RyQnVmIDw8IHBUZW5zW3BEYXRhW2lJbmRleCArIDFdIC0gJzAnXTsKKyAgICAgIH0gZWxzZSBpZiAocERhdGFbaUluZGV4XSA9PSAnMCcpIHsKKyAgICAgICAgc3RyQnVmIDw8IHBDYXBVbml0c1twRGF0YVtpSW5kZXggKyAxXSAtICcwJ107CisgICAgICB9CisgICAgfQorICAgIGlJbmRleCArPSAyOworICB9IGVsc2UgaWYgKGlGaXJzdENvdW50ID09IDEpIHsKKyAgICBzdHJCdWYgPDwgcENhcFVuaXRzW3BEYXRhW2lJbmRleF0gLSAnMCddOworICAgIGlJbmRleCArPSAxOworICB9CisgIGlmIChpTGVuZ3RoID4gMyAmJiBpRmlyc3RDb3VudCA+IDApIHsKKyAgICBzdHJCdWYgPDwgcENvbW1baUNvbW1dOworICAgIC0taUNvbW07CisgIH0KKyAgd2hpbGUgKGlJbmRleCA8IGlMZW5ndGgpIHsKKyAgICBpZiAocERhdGFbaUluZGV4XSAhPSAnMCcpIHsKKyAgICAgIHN0ckJ1ZiA8PCBwQ2FwVW5pdHNbcERhdGFbaUluZGV4XSAtICcwJ107CisgICAgICBzdHJCdWYgPDwgcENvbW1bMF07CisgICAgfQorICAgIGlmIChwRGF0YVtpSW5kZXggKyAxXSA9PSAnMCcpIHsKKyAgICAgIHN0ckJ1ZiA8PCBwQ2FwVW5pdHNbcERhdGFbaUluZGV4ICsgMl0gLSAnMCddOworICAgIH0gZWxzZSB7CisgICAgICBpZiAocERhdGFbaUluZGV4ICsgMV0gPiAnMScpIHsKKyAgICAgICAgc3RyQnVmIDw8IHBMYXN0VGVuc1twRGF0YVtpSW5kZXggKyAxXSAtICcyJ107CisgICAgICAgIHN0ckJ1ZiA8PCAiLSI7CisgICAgICAgIHN0ckJ1ZiA8PCBwVW5pdHNbcERhdGFbaUluZGV4ICsgMl0gLSAnMCddOworICAgICAgfSBlbHNlIGlmIChwRGF0YVtpSW5kZXggKyAxXSA9PSAnMScpIHsKKyAgICAgICAgc3RyQnVmIDw8IHBUZW5zW3BEYXRhW2lJbmRleCArIDJdIC0gJzAnXTsKKyAgICAgIH0gZWxzZSBpZiAocERhdGFbaUluZGV4ICsgMV0gPT0gJzAnKSB7CisgICAgICAgIHN0ckJ1ZiA8PCBwQ2FwVW5pdHNbcERhdGFbaUluZGV4ICsgMl0gLSAnMCddOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaUluZGV4IDwgaUxlbmd0aCAtIDMpIHsKKyAgICAgIHN0ckJ1ZiA8PCBwQ29tbVtpQ29tbV07CisgICAgICAtLWlDb21tOworICAgIH0KKyAgICBpSW5kZXggKz0gMzsKKyAgfQorICByZXR1cm4gQnl0ZVN0cmluZyhzdHJCdWYpOworfQorCisvLyBzdGF0aWMKK0J5dGVTdHJpbmcgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6V29yZFVTKGNvbnN0IEJ5dGVTdHJpbmcmIHN6RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0eWxlKSB7CisgIGNvbnN0IGNoYXIqIHBEYXRhID0gc3pEYXRhLmNfc3RyKCk7CisgIGludDMyX3QgaUxlbmd0aCA9IHN6RGF0YS5HZXRMZW5ndGgoKTsKKyAgaWYgKGlTdHlsZSA8IDAgfHwgaVN0eWxlID4gMikgeworICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisgIH0KKworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RyQnVmOworCisgIGludDMyX3QgaUluZGV4ID0gMDsKKyAgd2hpbGUgKGlJbmRleCA8IGlMZW5ndGgpIHsKKyAgICBpZiAocERhdGFbaUluZGV4XSA9PSAnLicpCisgICAgICBicmVhazsKKyAgICArK2lJbmRleDsKKyAgfQorICBpbnQzMl90IGlJbnRlZ2VyID0gaUluZGV4OworICBpSW5kZXggPSAwOworICB3aGlsZSAoaUluZGV4IDwgaUludGVnZXIpIHsKKyAgICBpbnQzMl90IGlDb3VudCA9IChpSW50ZWdlciAtIGlJbmRleCkgJSAxMjsKKyAgICBpZiAoIWlDb3VudCAmJiBpSW50ZWdlciAtIGlJbmRleCA+IDApCisgICAgICBpQ291bnQgPSAxMjsKKworICAgIHN0ckJ1ZiA8PCBUcmlsbGlvblVTKEJ5dGVTdHJpbmdWaWV3KHBEYXRhICsgaUluZGV4LCBpQ291bnQpKTsKKyAgICBpSW5kZXggKz0gaUNvdW50OworICAgIGlmIChpSW5kZXggPCBpSW50ZWdlcikKKyAgICAgIHN0ckJ1ZiA8PCAiIFRyaWxsaW9uICI7CisgIH0KKworICBpZiAoaVN0eWxlID4gMCkKKyAgICBzdHJCdWYgPDwgIiBEb2xsYXJzIjsKKworICBpZiAoaVN0eWxlID4gMSAmJiBpSW50ZWdlciA8IGlMZW5ndGgpIHsKKyAgICBzdHJCdWYgPDwgIiBBbmQgIjsKKyAgICBpSW5kZXggPSBpSW50ZWdlciArIDE7CisgICAgd2hpbGUgKGlJbmRleCA8IGlMZW5ndGgpIHsKKyAgICAgIGludDMyX3QgaUNvdW50ID0gKGlMZW5ndGggLSBpSW5kZXgpICUgMTI7CisgICAgICBpZiAoIWlDb3VudCAmJiBpTGVuZ3RoIC0gaUluZGV4ID4gMCkKKyAgICAgICAgaUNvdW50ID0gMTI7CisKKyAgICAgIHN0ckJ1ZiA8PCBUcmlsbGlvblVTKEJ5dGVTdHJpbmdWaWV3KHBEYXRhICsgaUluZGV4LCBpQ291bnQpKTsKKyAgICAgIGlJbmRleCArPSBpQ291bnQ7CisgICAgICBpZiAoaUluZGV4IDwgaUxlbmd0aCkKKyAgICAgICAgc3RyQnVmIDw8ICIgVHJpbGxpb24gIjsKKyAgICB9CisgICAgc3RyQnVmIDw8ICIgQ2VudHMiOworICB9CisgIHJldHVybiBCeXRlU3RyaW5nKHN0ckJ1Zik7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpHZXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBDRlhKU0VfRm9ybUNhbGNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMSkgeworICAgIHBDb250ZXh0LT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIkdldCIpOworICAgIHJldHVybjsKKyAgfQorCisgIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsKKyAgaWYgKCFwRG9jKQorICAgIHJldHVybjsKKworICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBwRG9jLT5HZXROb3RpZnkoKS0+R2V0QXBwUHJvdmlkZXIoKTsKKyAgaWYgKCFwQXBwUHJvdmlkZXIpCisgICAgcmV0dXJuOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKKyAgQnl0ZVN0cmluZyB1cmxTdHJpbmcgPSBWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUuZ2V0KCkpOworICBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gcEZpbGUgPQorICAgICAgcEFwcFByb3ZpZGVyLT5Eb3dubG9hZFVSTChXaWRlU3RyaW5nOjpGcm9tVVRGOCh1cmxTdHJpbmcuQXNTdHJpbmdWaWV3KCkpKTsKKyAgaWYgKCFwRmlsZSkKKyAgICByZXR1cm47CisKKyAgaW50MzJfdCBzaXplID0gcEZpbGUtPkdldFNpemUoKTsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YUJ1ZihzaXplKTsKKyAgcEZpbGUtPlJlYWRCbG9jayhkYXRhQnVmLmRhdGEoKSwgc2l6ZSk7CisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKEJ5dGVTdHJpbmdWaWV3KGRhdGFCdWYpKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlBvc3QoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOworICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOworICBpZiAoYXJnYyA8IDIgfHwgYXJnYyA+IDUpIHsKKyAgICBwQ29udGV4dC0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJQb3N0Iik7CisgICAgcmV0dXJuOworICB9CisKKyAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOworICBpZiAoIXBEb2MpCisgICAgcmV0dXJuOworCisgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IHBEb2MtPkdldE5vdGlmeSgpLT5HZXRBcHBQcm92aWRlcigpOworICBpZiAoIXBBcHBQcm92aWRlcikKKyAgICByZXR1cm47CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICBCeXRlU3RyaW5nIGJzVVJMID0gVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLmdldCgpKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdUd28gPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7CisgIEJ5dGVTdHJpbmcgYnNEYXRhID0gVmFsdWVUb1VURjhTdHJpbmcoYXJnVHdvLmdldCgpKTsKKworICBCeXRlU3RyaW5nIGJzQ29udGVudFR5cGU7CisgIGlmIChhcmdjID4gMikgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1RocmVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDIpOworICAgIGJzQ29udGVudFR5cGUgPSBWYWx1ZVRvVVRGOFN0cmluZyhhcmdUaHJlZS5nZXQoKSk7CisgIH0KKworICBCeXRlU3RyaW5nIGJzRW5jb2RlOworICBpZiAoYXJnYyA+IDMpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdGb3VyID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDMpOworICAgIGJzRW5jb2RlID0gVmFsdWVUb1VURjhTdHJpbmcoYXJnRm91ci5nZXQoKSk7CisgIH0KKworICBCeXRlU3RyaW5nIGJzSGVhZGVyOworICBpZiAoYXJnYyA+IDQpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdGaXZlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDQpOworICAgIGJzSGVhZGVyID0gVmFsdWVUb1VURjhTdHJpbmcoYXJnRml2ZS5nZXQoKSk7CisgIH0KKworICBXaWRlU3RyaW5nIGRlY29kZWRSZXNwb25zZTsKKyAgaWYgKCFwQXBwUHJvdmlkZXItPlBvc3RSZXF1ZXN0VVJMKAorICAgICAgICAgIFdpZGVTdHJpbmc6OkZyb21VVEY4KGJzVVJMLkFzU3RyaW5nVmlldygpKSwKKyAgICAgICAgICBXaWRlU3RyaW5nOjpGcm9tVVRGOChic0RhdGEuQXNTdHJpbmdWaWV3KCkpLAorICAgICAgICAgIFdpZGVTdHJpbmc6OkZyb21VVEY4KGJzQ29udGVudFR5cGUuQXNTdHJpbmdWaWV3KCkpLAorICAgICAgICAgIFdpZGVTdHJpbmc6OkZyb21VVEY4KGJzRW5jb2RlLkFzU3RyaW5nVmlldygpKSwKKyAgICAgICAgICBXaWRlU3RyaW5nOjpGcm9tVVRGOChic0hlYWRlci5Bc1N0cmluZ1ZpZXcoKSksIGRlY29kZWRSZXNwb25zZSkpIHsKKyAgICBwQ29udGV4dC0+VGhyb3dTZXJ2ZXJEZW5pZWRFeGNlcHRpb24oKTsKKyAgICByZXR1cm47CisgIH0KKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoZGVjb2RlZFJlc3BvbnNlLlVURjhFbmNvZGUoKS5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpQdXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBDRlhKU0VfRm9ybUNhbGNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKKyAgaWYgKGFyZ2MgPCAyIHx8IGFyZ2MgPiAzKSB7CisgICAgcENvbnRleHQtPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiUHV0Iik7CisgICAgcmV0dXJuOworICB9CisKKyAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOworICBpZiAoIXBEb2MpCisgICAgcmV0dXJuOworCisgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IHBEb2MtPkdldE5vdGlmeSgpLT5HZXRBcHBQcm92aWRlcigpOworICBpZiAoIXBBcHBQcm92aWRlcikKKyAgICByZXR1cm47CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICBCeXRlU3RyaW5nIGJzVVJMID0gVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLmdldCgpKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdUd28gPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7CisgIEJ5dGVTdHJpbmcgYnNEYXRhID0gVmFsdWVUb1VURjhTdHJpbmcoYXJnVHdvLmdldCgpKTsKKworICBCeXRlU3RyaW5nIGJzRW5jb2RlOworICBpZiAoYXJnYyA+IDIpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdUaHJlZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAyKTsKKyAgICBic0VuY29kZSA9IFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1RocmVlLmdldCgpKTsKKyAgfQorCisgIGlmICghcEFwcFByb3ZpZGVyLT5QdXRSZXF1ZXN0VVJMKAorICAgICAgICAgIFdpZGVTdHJpbmc6OkZyb21VVEY4KGJzVVJMLkFzU3RyaW5nVmlldygpKSwKKyAgICAgICAgICBXaWRlU3RyaW5nOjpGcm9tVVRGOChic0RhdGEuQXNTdHJpbmdWaWV3KCkpLAorICAgICAgICAgIFdpZGVTdHJpbmc6OkZyb21VVEY4KGJzRW5jb2RlLkFzU3RyaW5nVmlldygpKSkpIHsKKyAgICBwQ29udGV4dC0+VGhyb3dTZXJ2ZXJEZW5pZWRFeGNlcHRpb24oKTsKKyAgICByZXR1cm47CisgIH0KKworICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygiIik7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0Ojphc3NpZ25fdmFsdWVfb3BlcmF0b3IoCisgICAgQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOworICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAyKSB7CisgICAgcENvbnRleHQtPlRocm93Q29tcGlsZXJFcnJvckV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGxWYWx1ZSA9IGFyZ3MuR2V0VmFsdWUoMCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IHJWYWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKKyAgaWYgKGxWYWx1ZS0+SXNBcnJheSgpKSB7CisgICAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsKKyAgICBhdXRvIGxlZnRMZW5ndGhWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICBsVmFsdWUtPkdldE9iamVjdFByb3BlcnR5KCJsZW5ndGgiLCBsZWZ0TGVuZ3RoVmFsdWUuZ2V0KCkpOworICAgIGludDMyX3QgaUxlZnRMZW5ndGggPSBsZWZ0TGVuZ3RoVmFsdWUtPlRvSW50ZWdlcigpOworICAgIGF1dG8ganNPYmplY3RWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICBhdXRvIHByb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgICAgbFZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KDEsIHByb3BlcnR5VmFsdWUuZ2V0KCkpOworICAgIGlmIChwcm9wZXJ0eVZhbHVlLT5Jc051bGwoKSkgeworICAgICAgZm9yIChpbnQzMl90IGkgPSAyOyBpIDwgaUxlZnRMZW5ndGg7IGkrKykgeworICAgICAgICBsVmFsdWUtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoaSwganNPYmplY3RWYWx1ZS5nZXQoKSk7CisgICAgICAgIGlmICghU2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzT2JqZWN0VmFsdWUuZ2V0KCksIHJWYWx1ZS5nZXQoKSkpIHsKKyAgICAgICAgICBwQ29udGV4dC0+VGhyb3dOb0RlZmF1bHRQcm9wZXJ0eUV4Y2VwdGlvbihzekZ1bmNOYW1lKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZm9yIChpbnQzMl90IGkgPSAyOyBpIDwgaUxlZnRMZW5ndGg7IGkrKykgeworICAgICAgICBsVmFsdWUtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoaSwganNPYmplY3RWYWx1ZS5nZXQoKSk7CisgICAgICAgIGpzT2JqZWN0VmFsdWUtPlNldE9iamVjdFByb3BlcnR5KAorICAgICAgICAgICAgcHJvcGVydHlWYWx1ZS0+VG9TdHJpbmcoKS5Bc1N0cmluZ1ZpZXcoKSwgclZhbHVlLmdldCgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSBpZiAobFZhbHVlLT5Jc09iamVjdCgpKSB7CisgICAgaWYgKCFTZXRPYmplY3REZWZhdWx0VmFsdWUobFZhbHVlLmdldCgpLCByVmFsdWUuZ2V0KCkpKSB7CisgICAgICBwQ29udGV4dC0+VGhyb3dOb0RlZmF1bHRQcm9wZXJ0eUV4Y2VwdGlvbihzekZ1bmNOYW1lKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5Bc3NpZ24oclZhbHVlLmdldCgpKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OmxvZ2ljYWxfb3Jfb3BlcmF0b3IoCisgICAgQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDIpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93Q29tcGlsZXJFcnJvckV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ0ZpcnN0ID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdTZWNvbmQgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7CisgIGlmIChhcmdGaXJzdC0+SXNOdWxsKCkgJiYgYXJnU2Vjb25kLT5Jc051bGwoKSkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgIHJldHVybjsKKyAgfQorCisgIGZsb2F0IGZpcnN0ID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdGaXJzdC5nZXQoKSk7CisgIGZsb2F0IHNlY29uZCA9IFZhbHVlVG9GbG9hdChwVGhpcywgYXJnU2Vjb25kLmdldCgpKTsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKChmaXJzdCB8fCBzZWNvbmQpID8gMSA6IDApOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6bG9naWNhbF9hbmRfb3BlcmF0b3IoCisgICAgQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDIpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93Q29tcGlsZXJFcnJvckV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ0ZpcnN0ID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdTZWNvbmQgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7CisgIGlmIChhcmdGaXJzdC0+SXNOdWxsKCkgJiYgYXJnU2Vjb25kLT5Jc051bGwoKSkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgIHJldHVybjsKKyAgfQorCisgIGZsb2F0IGZpcnN0ID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdGaXJzdC5nZXQoKSk7CisgIGZsb2F0IHNlY29uZCA9IFZhbHVlVG9GbG9hdChwVGhpcywgYXJnU2Vjb25kLmdldCgpKTsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKChmaXJzdCAmJiBzZWNvbmQpID8gMSA6IDApOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6ZXF1YWxpdHlfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMikgeworICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dDb21waWxlckVycm9yRXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGZtX3JlZl9lcXVhbChwVGhpcywgYXJncykpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoMSk7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnRmlyc3QgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1NlY29uZCA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKKyAgaWYgKGFyZ0ZpcnN0LT5Jc051bGwoKSB8fCBhcmdTZWNvbmQtPklzTnVsbCgpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKAorICAgICAgICAoYXJnRmlyc3QtPklzTnVsbCgpICYmIGFyZ1NlY29uZC0+SXNOdWxsKCkpID8gMSA6IDApOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChhcmdGaXJzdC0+SXNTdHJpbmcoKSAmJiBhcmdTZWNvbmQtPklzU3RyaW5nKCkpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoYXJnRmlyc3QtPlRvU3RyaW5nKCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnU2Vjb25kLT5Ub1N0cmluZygpKTsKKyAgICByZXR1cm47CisgIH0KKworICBkb3VibGUgZmlyc3QgPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBhcmdGaXJzdC5nZXQoKSk7CisgIGRvdWJsZSBzZWNvbmQgPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBhcmdTZWNvbmQuZ2V0KCkpOworICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoKGZpcnN0ID09IHNlY29uZCkgPyAxIDogMCk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0Ojpub3RlcXVhbGl0eV9vcGVyYXRvcigKKyAgICBDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMikgeworICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dDb21waWxlckVycm9yRXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGZtX3JlZl9lcXVhbChwVGhpcywgYXJncykpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoMCk7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnRmlyc3QgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1NlY29uZCA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKKyAgaWYgKGFyZ0ZpcnN0LT5Jc051bGwoKSB8fCBhcmdTZWNvbmQtPklzTnVsbCgpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKAorICAgICAgICAoYXJnRmlyc3QtPklzTnVsbCgpICYmIGFyZ1NlY29uZC0+SXNOdWxsKCkpID8gMCA6IDEpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChhcmdGaXJzdC0+SXNTdHJpbmcoKSAmJiBhcmdTZWNvbmQtPklzU3RyaW5nKCkpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoYXJnRmlyc3QtPlRvU3RyaW5nKCkgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnU2Vjb25kLT5Ub1N0cmluZygpKTsKKyAgICByZXR1cm47CisgIH0KKworICBkb3VibGUgZmlyc3QgPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBhcmdGaXJzdC5nZXQoKSk7CisgIGRvdWJsZSBzZWNvbmQgPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBhcmdTZWNvbmQuZ2V0KCkpOworICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoZmlyc3QgIT0gc2Vjb25kKTsKK30KKworLy8gc3RhdGljCitib29sIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OmZtX3JlZl9lcXVhbChDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdGaXJzdCA9IGFyZ3MuR2V0VmFsdWUoMCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1NlY29uZCA9IGFyZ3MuR2V0VmFsdWUoMSk7CisgIGlmICghYXJnRmlyc3QtPklzQXJyYXkoKSB8fCAhYXJnU2Vjb25kLT5Jc0FycmF5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+R2V0U2NyaXB0UnVudGltZSgpOworICBhdXRvIGZpcnN0RmxhZ1ZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICBhdXRvIHNlY29uZEZsYWdWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgYXJnRmlyc3QtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMCwgZmlyc3RGbGFnVmFsdWUuZ2V0KCkpOworICBhcmdTZWNvbmQtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMCwgc2Vjb25kRmxhZ1ZhbHVlLmdldCgpKTsKKyAgaWYgKGZpcnN0RmxhZ1ZhbHVlLT5Ub0ludGVnZXIoKSAhPSAzIHx8IHNlY29uZEZsYWdWYWx1ZS0+VG9JbnRlZ2VyKCkgIT0gMykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYXV0byBmaXJzdEpTT2JqZWN0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICBhdXRvIHNlY29uZEpTT2JqZWN0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICBhcmdGaXJzdC0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgyLCBmaXJzdEpTT2JqZWN0LmdldCgpKTsKKyAgYXJnU2Vjb25kLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KDIsIHNlY29uZEpTT2JqZWN0LmdldCgpKTsKKyAgaWYgKGZpcnN0SlNPYmplY3QtPklzTnVsbCgpIHx8IHNlY29uZEpTT2JqZWN0LT5Jc051bGwoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcmV0dXJuIChmaXJzdEpTT2JqZWN0LT5Ub0hvc3RPYmplY3QobnVsbHB0cikgPT0KKyAgICAgICAgICBzZWNvbmRKU09iamVjdC0+VG9Ib3N0T2JqZWN0KG51bGxwdHIpKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6Omxlc3Nfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDIpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93Q29tcGlsZXJFcnJvckV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ0ZpcnN0ID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdTZWNvbmQgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7CisgIGlmIChhcmdGaXJzdC0+SXNOdWxsKCkgfHwgYXJnU2Vjb25kLT5Jc051bGwoKSkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcigwKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoYXJnRmlyc3QtPklzU3RyaW5nKCkgJiYgYXJnU2Vjb25kLT5Jc1N0cmluZygpKSB7CisgICAgaW50IHJlc3VsdCA9CisgICAgICAgIGFyZ0ZpcnN0LT5Ub1N0cmluZygpLkNvbXBhcmUoYXJnU2Vjb25kLT5Ub1N0cmluZygpLkFzU3RyaW5nVmlldygpKSA8IDA7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKHJlc3VsdCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZG91YmxlIGZpcnN0ID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnRmlyc3QuZ2V0KCkpOworICBkb3VibGUgc2Vjb25kID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnU2Vjb25kLmdldCgpKTsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKChmaXJzdCA8IHNlY29uZCkgPyAxIDogMCk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpsZXNzZXF1YWxfb3BlcmF0b3IoCisgICAgQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDIpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93Q29tcGlsZXJFcnJvckV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ0ZpcnN0ID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdTZWNvbmQgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7CisgIGlmIChhcmdGaXJzdC0+SXNOdWxsKCkgfHwgYXJnU2Vjb25kLT5Jc051bGwoKSkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcigKKyAgICAgICAgKGFyZ0ZpcnN0LT5Jc051bGwoKSAmJiBhcmdTZWNvbmQtPklzTnVsbCgpKSA/IDEgOiAwKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoYXJnRmlyc3QtPklzU3RyaW5nKCkgJiYgYXJnU2Vjb25kLT5Jc1N0cmluZygpKSB7CisgICAgaW50IHJlc3VsdCA9CisgICAgICAgIGFyZ0ZpcnN0LT5Ub1N0cmluZygpLkNvbXBhcmUoYXJnU2Vjb25kLT5Ub1N0cmluZygpLkFzU3RyaW5nVmlldygpKSA8PSAwOworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcihyZXN1bHQpOworICAgIHJldHVybjsKKyAgfQorCisgIGRvdWJsZSBmaXJzdCA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ0ZpcnN0LmdldCgpKTsKKyAgZG91YmxlIHNlY29uZCA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ1NlY29uZC5nZXQoKSk7CisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcigoZmlyc3QgPD0gc2Vjb25kKSA/IDEgOiAwKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OmdyZWF0ZXJfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDIpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93Q29tcGlsZXJFcnJvckV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ0ZpcnN0ID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdTZWNvbmQgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7CisgIGlmIChhcmdGaXJzdC0+SXNOdWxsKCkgfHwgYXJnU2Vjb25kLT5Jc051bGwoKSkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcigwKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoYXJnRmlyc3QtPklzU3RyaW5nKCkgJiYgYXJnU2Vjb25kLT5Jc1N0cmluZygpKSB7CisgICAgaW50IHJlc3VsdCA9CisgICAgICAgIGFyZ0ZpcnN0LT5Ub1N0cmluZygpLkNvbXBhcmUoYXJnU2Vjb25kLT5Ub1N0cmluZygpLkFzU3RyaW5nVmlldygpKSA+IDA7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKHJlc3VsdCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZG91YmxlIGZpcnN0ID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnRmlyc3QuZ2V0KCkpOworICBkb3VibGUgc2Vjb25kID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnU2Vjb25kLmdldCgpKTsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKChmaXJzdCA+IHNlY29uZCkgPyAxIDogMCk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpncmVhdGVyZXF1YWxfb3BlcmF0b3IoCisgICAgQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDIpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93Q29tcGlsZXJFcnJvckV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ0ZpcnN0ID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdTZWNvbmQgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7CisgIGlmIChhcmdGaXJzdC0+SXNOdWxsKCkgfHwgYXJnU2Vjb25kLT5Jc051bGwoKSkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcigKKyAgICAgICAgKGFyZ0ZpcnN0LT5Jc051bGwoKSAmJiBhcmdTZWNvbmQtPklzTnVsbCgpKSA/IDEgOiAwKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoYXJnRmlyc3QtPklzU3RyaW5nKCkgJiYgYXJnU2Vjb25kLT5Jc1N0cmluZygpKSB7CisgICAgaW50IHJlc3VsdCA9CisgICAgICAgIGFyZ0ZpcnN0LT5Ub1N0cmluZygpLkNvbXBhcmUoYXJnU2Vjb25kLT5Ub1N0cmluZygpLkFzU3RyaW5nVmlldygpKSA+PSAwOworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcihyZXN1bHQpOworICAgIHJldHVybjsKKyAgfQorCisgIGRvdWJsZSBmaXJzdCA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ0ZpcnN0LmdldCgpKTsKKyAgZG91YmxlIHNlY29uZCA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ1NlY29uZC5nZXQoKSk7CisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcigoZmlyc3QgPj0gc2Vjb25kKSA/IDEgOiAwKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OnBsdXNfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDIpIHsKKyAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93Q29tcGlsZXJFcnJvckV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ0ZpcnN0ID0gYXJncy5HZXRWYWx1ZSgwKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnU2Vjb25kID0gYXJncy5HZXRWYWx1ZSgxKTsKKyAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdGaXJzdC5nZXQoKSkgJiYKKyAgICAgIFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdTZWNvbmQuZ2V0KCkpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZG91YmxlIGZpcnN0ID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnRmlyc3QuZ2V0KCkpOworICBkb3VibGUgc2Vjb25kID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnU2Vjb25kLmdldCgpKTsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXREb3VibGUoZmlyc3QgKyBzZWNvbmQpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6bWludXNfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMikgeworICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dDb21waWxlckVycm9yRXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnRmlyc3QgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1NlY29uZCA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKKyAgaWYgKGFyZ0ZpcnN0LT5Jc051bGwoKSAmJiBhcmdTZWNvbmQtPklzTnVsbCgpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZG91YmxlIGZpcnN0ID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnRmlyc3QuZ2V0KCkpOworICBkb3VibGUgc2Vjb25kID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnU2Vjb25kLmdldCgpKTsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXREb3VibGUoZmlyc3QgLSBzZWNvbmQpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6bXVsdGlwbGVfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMikgeworICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dDb21waWxlckVycm9yRXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnRmlyc3QgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1NlY29uZCA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKKyAgaWYgKGFyZ0ZpcnN0LT5Jc051bGwoKSAmJiBhcmdTZWNvbmQtPklzTnVsbCgpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZG91YmxlIGZpcnN0ID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnRmlyc3QuZ2V0KCkpOworICBkb3VibGUgc2Vjb25kID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnU2Vjb25kLmdldCgpKTsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXREb3VibGUoZmlyc3QgKiBzZWNvbmQpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6ZGl2aWRlX29wZXJhdG9yKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dCogcENvbnRleHQgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cik7CisgIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDIpIHsKKyAgICBwQ29udGV4dC0+VGhyb3dDb21waWxlckVycm9yRXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnRmlyc3QgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1NlY29uZCA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKKyAgaWYgKGFyZ0ZpcnN0LT5Jc051bGwoKSAmJiBhcmdTZWNvbmQtPklzTnVsbCgpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZG91YmxlIHNlY29uZCA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ1NlY29uZC5nZXQoKSk7CisgIGlmIChzZWNvbmQgPT0gMC4wKSB7CisgICAgcENvbnRleHQtPlRocm93RGl2aWRlQnlaZXJvRXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZG91YmxlIGZpcnN0ID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnRmlyc3QuZ2V0KCkpOworICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldERvdWJsZShmaXJzdCAvIHNlY29uZCk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0Ojpwb3NpdGl2ZV9vcGVyYXRvcihDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAxKSB7CisgICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd0NvbXBpbGVyRXJyb3JFeGNlcHRpb24oKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIGlmIChhcmdPbmUtPklzTnVsbCgpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0RG91YmxlKDAuMCArIFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ09uZS5nZXQoKSkpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6bmVnYXRpdmVfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMSkgeworICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dDb21waWxlckVycm9yRXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICBpZiAoYXJnT25lLT5Jc051bGwoKSkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOworICAgIHJldHVybjsKKyAgfQorICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldERvdWJsZSgwLjAgLSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBhcmdPbmUuZ2V0KCkpKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OmxvZ2ljYWxfbm90X29wZXJhdG9yKAorICAgIENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAxKSB7CisgICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd0NvbXBpbGVyRXJyb3JFeGNlcHRpb24oKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIGlmIChhcmdPbmUtPklzTnVsbCgpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZG91YmxlIGZpcnN0ID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnT25lLmdldCgpKTsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKChmaXJzdCA9PSAwLjApID8gMSA6IDApOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6ZG90X2FjY2Vzc29yKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dCogcENvbnRleHQgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cik7CisgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7CisgIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7CisgIGlmIChhcmdjIDwgNCB8fCBhcmdjID4gNSkgeworICAgIHBDb250ZXh0LT5UaHJvd0NvbXBpbGVyRXJyb3JFeGNlcHRpb24oKTsKKyAgICByZXR1cm47CisgIH0KKworICBib29sIGJJc1N0YXIgPSB0cnVlOworICBpbnQzMl90IGlJbmRleFZhbHVlID0gMDsKKyAgaWYgKGFyZ2MgPiA0KSB7CisgICAgYklzU3RhciA9IGZhbHNlOworICAgIGlJbmRleFZhbHVlID0gVmFsdWVUb0ludGVnZXIocFRoaXMsIGFyZ3MuR2V0VmFsdWUoNCkuZ2V0KCkpOworICB9CisKKyAgQnl0ZVN0cmluZyBzek5hbWUgPSBhcmdzLkdldFVURjhTdHJpbmcoMik7CisgIEJ5dGVTdHJpbmcgc3pTb21FeHAgPSBHZW5lcmF0ZVNvbUV4cHJlc3Npb24oCisgICAgICBzek5hbWUuQXNTdHJpbmdWaWV3KCksIGFyZ3MuR2V0SW50MzIoMyksIGlJbmRleFZhbHVlLCBiSXNTdGFyKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdBY2Nlc3NvciA9IGFyZ3MuR2V0VmFsdWUoMCk7CisgIGlmIChhcmdBY2Nlc3Nvci0+SXNBcnJheSgpKSB7CisgICAgYXV0byBwTGVuZ3RoVmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgICAgYXJnQWNjZXNzb3ItPkdldE9iamVjdFByb3BlcnR5KCJsZW5ndGgiLCBwTGVuZ3RoVmFsdWUuZ2V0KCkpOworICAgIGludDMyX3QgaUxlbmd0aCA9IHBMZW5ndGhWYWx1ZS0+VG9JbnRlZ2VyKCk7CisgICAgaWYgKGlMZW5ndGggPCAzKSB7CisgICAgICBwQ29udGV4dC0+VGhyb3dBcmd1bWVudE1pc21hdGNoRXhjZXB0aW9uKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBoSlNPYmpWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPj4+IHJlc29sdmVWYWx1ZXMoCisgICAgICAgIGlMZW5ndGggLSAyKTsKKyAgICBib29sIGJBdHRyaWJ1dGUgPSBmYWxzZTsKKyAgICBpbnQzMl90IGlDb3VudGVyID0gMDsKKyAgICBmb3IgKGludDMyX3QgaSA9IDI7IGkgPCBpTGVuZ3RoOyBpKyspIHsKKyAgICAgIGFyZ0FjY2Vzc29yLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KGksIGhKU09ialZhbHVlLmdldCgpKTsKKworICAgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc29sdmVOb2RlUlM7CisgICAgICBpZiAoUmVzb2x2ZU9iamVjdHMocFRoaXMsIGhKU09ialZhbHVlLmdldCgpLCBzelNvbUV4cC5Bc1N0cmluZ1ZpZXcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzb2x2ZU5vZGVSUywgdHJ1ZSwgc3pOYW1lLklzRW1wdHkoKSkpIHsKKyAgICAgICAgUGFyc2VSZXNvbHZlUmVzdWx0KHBUaGlzLCByZXNvbHZlTm9kZVJTLCBoSlNPYmpWYWx1ZS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlVmFsdWVzW2kgLSAyXSwgJmJBdHRyaWJ1dGUpOworICAgICAgICBpQ291bnRlciArPSByZXNvbHZlVmFsdWVzW2kgLSAyXS5zaXplKCk7CisgICAgICB9CisgICAgfQorICAgIGlmIChpQ291bnRlciA8IDEpIHsKKyAgICAgIHBDb250ZXh0LT5UaHJvd1Byb3BlcnR5Tm90SW5PYmplY3RFeGNlcHRpb24oCisgICAgICAgICAgV2lkZVN0cmluZzo6RnJvbVVURjgoc3pOYW1lLkFzU3RyaW5nVmlldygpKSwKKyAgICAgICAgICBXaWRlU3RyaW5nOjpGcm9tVVRGOChzelNvbUV4cC5Bc1N0cmluZ1ZpZXcoKSkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+PiB2YWx1ZXM7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50ZXIgKyAyOyBpKyspCisgICAgICB2YWx1ZXMucHVzaF9iYWNrKHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKSk7CisKKyAgICB2YWx1ZXNbMF0tPlNldEludGVnZXIoMSk7CisgICAgaWYgKGJBdHRyaWJ1dGUpCisgICAgICB2YWx1ZXNbMV0tPlNldFN0cmluZyhzek5hbWUuQXNTdHJpbmdWaWV3KCkpOworICAgIGVsc2UKKyAgICAgIHZhbHVlc1sxXS0+U2V0TnVsbCgpOworCisgICAgaW50MzJfdCBpSW5kZXggPSAyOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGggLSAyOyBpKyspIHsKKyAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcmVzb2x2ZVZhbHVlc1tpXS5zaXplKCk7IGorKykgeworICAgICAgICB2YWx1ZXNbaUluZGV4XS0+QXNzaWduKHJlc29sdmVWYWx1ZXNbaV1bal0uZ2V0KCkpOworICAgICAgICBpSW5kZXgrKzsKKyAgICAgIH0KKyAgICB9CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRBcnJheSh2YWx1ZXMpOworICAgIHJldHVybjsKKyAgfQorCisgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvbHZlTm9kZVJTOworICBib29sIGlSZXQgPSBmYWxzZTsKKyAgQnl0ZVN0cmluZyBic0FjY2Vzc29yTmFtZSA9IGFyZ3MuR2V0VVRGOFN0cmluZygxKTsKKyAgaWYgKGFyZ0FjY2Vzc29yLT5Jc09iamVjdCgpIHx8CisgICAgICAoYXJnQWNjZXNzb3ItPklzTnVsbCgpICYmIGJzQWNjZXNzb3JOYW1lLklzRW1wdHkoKSkpIHsKKyAgICBpUmV0ID0gUmVzb2x2ZU9iamVjdHMocFRoaXMsIGFyZ0FjY2Vzc29yLmdldCgpLCBzelNvbUV4cC5Bc1N0cmluZ1ZpZXcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVOb2RlUlMsIHRydWUsIHN6TmFtZS5Jc0VtcHR5KCkpOworICB9IGVsc2UgaWYgKCFhcmdBY2Nlc3Nvci0+SXNPYmplY3QoKSAmJiAhYnNBY2Nlc3Nvck5hbWUuSXNFbXB0eSgpICYmCisgICAgICAgICAgICAgR2V0T2JqZWN0Rm9yTmFtZShwVGhpcywgYXJnQWNjZXNzb3IuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic0FjY2Vzc29yTmFtZS5Bc1N0cmluZ1ZpZXcoKSkpIHsKKyAgICBpUmV0ID0gUmVzb2x2ZU9iamVjdHMocFRoaXMsIGFyZ0FjY2Vzc29yLmdldCgpLCBzelNvbUV4cC5Bc1N0cmluZ1ZpZXcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVOb2RlUlMsIHRydWUsIHN6TmFtZS5Jc0VtcHR5KCkpOworICB9CisgIGlmICghaVJldCkgeworICAgIHBDb250ZXh0LT5UaHJvd1Byb3BlcnR5Tm90SW5PYmplY3RFeGNlcHRpb24oCisgICAgICAgIFdpZGVTdHJpbmc6OkZyb21VVEY4KHN6TmFtZS5Bc1N0cmluZ1ZpZXcoKSksCisgICAgICAgIFdpZGVTdHJpbmc6OkZyb21VVEY4KHN6U29tRXhwLkFzU3RyaW5nVmlldygpKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4+IHJlc29sdmVWYWx1ZXM7CisgIGJvb2wgYkF0dHJpYnV0ZSA9IGZhbHNlOworICBQYXJzZVJlc29sdmVSZXN1bHQocFRoaXMsIHJlc29sdmVOb2RlUlMsIGFyZ0FjY2Vzc29yLmdldCgpLCAmcmVzb2x2ZVZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICZiQXR0cmlidXRlKTsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPj4gdmFsdWVzOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc29sdmVWYWx1ZXMuc2l6ZSgpICsgMjsgaSsrKQorICAgIHZhbHVlcy5wdXNoX2JhY2socGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpKTsKKworICB2YWx1ZXNbMF0tPlNldEludGVnZXIoMSk7CisgIGlmIChiQXR0cmlidXRlKQorICAgIHZhbHVlc1sxXS0+U2V0U3RyaW5nKHN6TmFtZS5Bc1N0cmluZ1ZpZXcoKSk7CisgIGVsc2UKKyAgICB2YWx1ZXNbMV0tPlNldE51bGwoKTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc29sdmVWYWx1ZXMuc2l6ZSgpOyBpKyspCisgICAgdmFsdWVzW2kgKyAyXS0+QXNzaWduKHJlc29sdmVWYWx1ZXNbaV0uZ2V0KCkpOworCisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0QXJyYXkodmFsdWVzKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OmRvdGRvdF9hY2Nlc3NvcihDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOworICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOworICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOworICBpZiAoYXJnYyA8IDQgfHwgYXJnYyA+IDUpIHsKKyAgICBwQ29udGV4dC0+VGhyb3dDb21waWxlckVycm9yRXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgYm9vbCBiSXNTdGFyID0gdHJ1ZTsKKyAgaW50MzJfdCBpSW5kZXhWYWx1ZSA9IDA7CisgIGlmIChhcmdjID4gNCkgeworICAgIGJJc1N0YXIgPSBmYWxzZTsKKyAgICBpSW5kZXhWYWx1ZSA9IFZhbHVlVG9JbnRlZ2VyKHBUaGlzLCBhcmdzLkdldFZhbHVlKDQpLmdldCgpKTsKKyAgfQorCisgIEJ5dGVTdHJpbmcgc3pOYW1lID0gYXJncy5HZXRVVEY4U3RyaW5nKDIpOworICBCeXRlU3RyaW5nIHN6U29tRXhwID0gR2VuZXJhdGVTb21FeHByZXNzaW9uKAorICAgICAgc3pOYW1lLkFzU3RyaW5nVmlldygpLCBhcmdzLkdldEludDMyKDMpLCBpSW5kZXhWYWx1ZSwgYklzU3Rhcik7CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnQWNjZXNzb3IgPSBhcmdzLkdldFZhbHVlKDApOworICBpZiAoYXJnQWNjZXNzb3ItPklzQXJyYXkoKSkgeworICAgIGF1dG8gcExlbmd0aFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICAgIGFyZ0FjY2Vzc29yLT5HZXRPYmplY3RQcm9wZXJ0eSgibGVuZ3RoIiwgcExlbmd0aFZhbHVlLmdldCgpKTsKKyAgICBpbnQzMl90IGlMZW5ndGggPSBwTGVuZ3RoVmFsdWUtPlRvSW50ZWdlcigpOworICAgIGlmIChpTGVuZ3RoIDwgMykgeworICAgICAgcENvbnRleHQtPlRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3QgaUNvdW50ZXIgPSAwOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4+PiByZXNvbHZlVmFsdWVzKAorICAgICAgICBpTGVuZ3RoIC0gMik7CisgICAgYXV0byBoSlNPYmpWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICBib29sIGJBdHRyaWJ1dGUgPSBmYWxzZTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDI7IGkgPCBpTGVuZ3RoOyBpKyspIHsKKyAgICAgIGFyZ0FjY2Vzc29yLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KGksIGhKU09ialZhbHVlLmdldCgpKTsKKyAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvbHZlTm9kZVJTOworICAgICAgaWYgKFJlc29sdmVPYmplY3RzKHBUaGlzLCBoSlNPYmpWYWx1ZS5nZXQoKSwgc3pTb21FeHAuQXNTdHJpbmdWaWV3KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVOb2RlUlMsIGZhbHNlLCBmYWxzZSkpIHsKKyAgICAgICAgUGFyc2VSZXNvbHZlUmVzdWx0KHBUaGlzLCByZXNvbHZlTm9kZVJTLCBoSlNPYmpWYWx1ZS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlVmFsdWVzW2kgLSAyXSwgJmJBdHRyaWJ1dGUpOworICAgICAgICBpQ291bnRlciArPSByZXNvbHZlVmFsdWVzW2kgLSAyXS5zaXplKCk7CisgICAgICB9CisgICAgfQorICAgIGlmIChpQ291bnRlciA8IDEpIHsKKyAgICAgIHBDb250ZXh0LT5UaHJvd1Byb3BlcnR5Tm90SW5PYmplY3RFeGNlcHRpb24oCisgICAgICAgICAgV2lkZVN0cmluZzo6RnJvbVVURjgoc3pOYW1lLkFzU3RyaW5nVmlldygpKSwKKyAgICAgICAgICBXaWRlU3RyaW5nOjpGcm9tVVRGOChzelNvbUV4cC5Bc1N0cmluZ1ZpZXcoKSkpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+PiB2YWx1ZXM7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50ZXIgKyAyOyBpKyspCisgICAgICB2YWx1ZXMucHVzaF9iYWNrKHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKSk7CisKKyAgICB2YWx1ZXNbMF0tPlNldEludGVnZXIoMSk7CisgICAgaWYgKGJBdHRyaWJ1dGUpCisgICAgICB2YWx1ZXNbMV0tPlNldFN0cmluZyhzek5hbWUuQXNTdHJpbmdWaWV3KCkpOworICAgIGVsc2UKKyAgICAgIHZhbHVlc1sxXS0+U2V0TnVsbCgpOworCisgICAgaW50MzJfdCBpSW5kZXggPSAyOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGggLSAyOyBpKyspIHsKKyAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcmVzb2x2ZVZhbHVlc1tpXS5zaXplKCk7IGorKykgeworICAgICAgICB2YWx1ZXNbaUluZGV4XS0+QXNzaWduKHJlc29sdmVWYWx1ZXNbaV1bal0uZ2V0KCkpOworICAgICAgICBpSW5kZXgrKzsKKyAgICAgIH0KKyAgICB9CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRBcnJheSh2YWx1ZXMpOworICAgIHJldHVybjsKKyAgfQorCisgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvbHZlTm9kZVJTOworICBib29sIGlSZXQgPSBmYWxzZTsKKyAgQnl0ZVN0cmluZyBic0FjY2Vzc29yTmFtZSA9IGFyZ3MuR2V0VVRGOFN0cmluZygxKTsKKyAgaWYgKGFyZ0FjY2Vzc29yLT5Jc09iamVjdCgpIHx8CisgICAgICAoYXJnQWNjZXNzb3ItPklzTnVsbCgpICYmIGJzQWNjZXNzb3JOYW1lLklzRW1wdHkoKSkpIHsKKyAgICBpUmV0ID0gUmVzb2x2ZU9iamVjdHMocFRoaXMsIGFyZ0FjY2Vzc29yLmdldCgpLCBzelNvbUV4cC5Bc1N0cmluZ1ZpZXcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVOb2RlUlMsIGZhbHNlLCBmYWxzZSk7CisgIH0gZWxzZSBpZiAoIWFyZ0FjY2Vzc29yLT5Jc09iamVjdCgpICYmICFic0FjY2Vzc29yTmFtZS5Jc0VtcHR5KCkgJiYKKyAgICAgICAgICAgICBHZXRPYmplY3RGb3JOYW1lKHBUaGlzLCBhcmdBY2Nlc3Nvci5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzQWNjZXNzb3JOYW1lLkFzU3RyaW5nVmlldygpKSkgeworICAgIGlSZXQgPSBSZXNvbHZlT2JqZWN0cyhwVGhpcywgYXJnQWNjZXNzb3IuZ2V0KCksIHN6U29tRXhwLkFzU3RyaW5nVmlldygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzb2x2ZU5vZGVSUywgZmFsc2UsIGZhbHNlKTsKKyAgfQorICBpZiAoIWlSZXQpIHsKKyAgICBwQ29udGV4dC0+VGhyb3dQcm9wZXJ0eU5vdEluT2JqZWN0RXhjZXB0aW9uKAorICAgICAgICBXaWRlU3RyaW5nOjpGcm9tVVRGOChzek5hbWUuQXNTdHJpbmdWaWV3KCkpLAorICAgICAgICBXaWRlU3RyaW5nOjpGcm9tVVRGOChzelNvbUV4cC5Bc1N0cmluZ1ZpZXcoKSkpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+PiByZXNvbHZlVmFsdWVzOworICBib29sIGJBdHRyaWJ1dGUgPSBmYWxzZTsKKyAgUGFyc2VSZXNvbHZlUmVzdWx0KHBUaGlzLCByZXNvbHZlTm9kZVJTLCBhcmdBY2Nlc3Nvci5nZXQoKSwgJnJlc29sdmVWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAmYkF0dHJpYnV0ZSk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4+IHZhbHVlczsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNvbHZlVmFsdWVzLnNpemUoKSArIDI7IGkrKykKKyAgICB2YWx1ZXMucHVzaF9iYWNrKHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKSk7CisKKyAgdmFsdWVzWzBdLT5TZXRJbnRlZ2VyKDEpOworICBpZiAoYkF0dHJpYnV0ZSkKKyAgICB2YWx1ZXNbMV0tPlNldFN0cmluZyhzek5hbWUuQXNTdHJpbmdWaWV3KCkpOworICBlbHNlCisgICAgdmFsdWVzWzFdLT5TZXROdWxsKCk7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNvbHZlVmFsdWVzLnNpemUoKTsgaSsrKQorICAgIHZhbHVlc1tpICsgMl0tPkFzc2lnbihyZXNvbHZlVmFsdWVzW2ldLmdldCgpKTsKKworICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEFycmF5KHZhbHVlcyk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpldmFsX3RyYW5zbGF0aW9uKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBDRlhKU0VfRm9ybUNhbGNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMSkgeworICAgIHBDb250ZXh0LT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIkV2YWwiKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7CisgIEJ5dGVTdHJpbmcgYXJnU3RyaW5nID0gVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLmdldCgpKTsKKyAgaWYgKGFyZ1N0cmluZy5Jc0VtcHR5KCkpIHsKKyAgICBwQ29udGV4dC0+VGhyb3dBcmd1bWVudE1pc21hdGNoRXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgV2lkZVN0cmluZyBzY3JpcHRTdHJpbmcgPSBXaWRlU3RyaW5nOjpGcm9tVVRGOChhcmdTdHJpbmcuQXNTdHJpbmdWaWV3KCkpOworICBDRlhfV2lkZVRleHRCdWYgd3NKYXZhU2NyaXB0QnVmOworICBpZiAoIUNGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlRyYW5zbGF0ZShzY3JpcHRTdHJpbmcuQXNTdHJpbmdWaWV3KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3c0phdmFTY3JpcHRCdWYpKSB7CisgICAgcENvbnRleHQtPlRocm93Q29tcGlsZXJFcnJvckV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorCisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKAorICAgICAgRlhfVVRGOEVuY29kZSh3c0phdmFTY3JpcHRCdWYuQXNTdHJpbmdWaWV3KCkpLkFzU3RyaW5nVmlldygpKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OmlzX2ZtX29iamVjdChDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDEpIHsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEJvb2xlYW4oZmFsc2UpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IGFyZ3MuR2V0VmFsdWUoMCk7CisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0Qm9vbGVhbihhcmdPbmUtPklzT2JqZWN0KCkpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6aXNfZm1fYXJyYXkoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMSkgeworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0Qm9vbGVhbihmYWxzZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gYXJncy5HZXRWYWx1ZSgwKTsKKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRCb29sZWFuKGFyZ09uZS0+SXNBcnJheSgpKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OmdldF9mbV92YWx1ZShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOworICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAxKSB7CisgICAgcENvbnRleHQtPlRocm93Q29tcGlsZXJFcnJvckV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IGFyZ3MuR2V0VmFsdWUoMCk7CisgIGlmIChhcmdPbmUtPklzQXJyYXkoKSkgeworICAgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7CisgICAgYXV0byBwcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICAgIGF1dG8ganNPYmplY3RWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICBhcmdPbmUtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMSwgcHJvcGVydHlWYWx1ZS5nZXQoKSk7CisgICAgYXJnT25lLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KDIsIGpzT2JqZWN0VmFsdWUuZ2V0KCkpOworICAgIGlmIChwcm9wZXJ0eVZhbHVlLT5Jc051bGwoKSkgeworICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzT2JqZWN0VmFsdWUuZ2V0KCksIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAganNPYmplY3RWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHkocHJvcGVydHlWYWx1ZS0+VG9TdHJpbmcoKS5Bc1N0cmluZ1ZpZXcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCkpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChhcmdPbmUtPklzT2JqZWN0KCkpIHsKKyAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnT25lLmdldCgpLCBhcmdzLkdldFJldHVyblZhbHVlKCkpOworICAgIHJldHVybjsKKyAgfQorCisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+QXNzaWduKGFyZ09uZS5nZXQoKSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpnZXRfZm1fanNvYmooQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgeworICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAxKSB7CisgICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd0NvbXBpbGVyRXJyb3JFeGNlcHRpb24oKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOworICBpZiAoIWFyZ09uZS0+SXNBcnJheSgpKSB7CisgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5Bc3NpZ24oYXJnT25lLmdldCgpKTsKKyAgICByZXR1cm47CisgIH0KKworI2lmbmRlZiBOREVCVUcKKyAgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dCogcENvbnRleHQgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cik7CisgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7CisgIGF1dG8gbGVuZ3RoVmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgIGFyZ09uZS0+R2V0T2JqZWN0UHJvcGVydHkoImxlbmd0aCIsIGxlbmd0aFZhbHVlLmdldCgpKTsKKyAgQVNTRVJUKGxlbmd0aFZhbHVlLT5Ub0ludGVnZXIoKSA+PSAzKTsKKyNlbmRpZgorCisgIGFyZ09uZS0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgyLCBhcmdzLkdldFJldHVyblZhbHVlKCkpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6Zm1fdmFyX2ZpbHRlcihDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKKyAgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dCogcENvbnRleHQgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cik7CisgIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDEpIHsKKyAgICBwQ29udGV4dC0+VGhyb3dDb21waWxlckVycm9yRXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gYXJncy5HZXRWYWx1ZSgwKTsKKyAgaWYgKCFhcmdPbmUtPklzQXJyYXkoKSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IHNpbXBsZVZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+QXNzaWduKHNpbXBsZVZhbHVlLmdldCgpKTsKKyAgICByZXR1cm47CisgIH0KKworI2lmbmRlZiBOREVCVUcKKyAgYXV0byBsZW5ndGhWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgYXJnT25lLT5HZXRPYmplY3RQcm9wZXJ0eSgibGVuZ3RoIiwgbGVuZ3RoVmFsdWUuZ2V0KCkpOworICBBU1NFUlQobGVuZ3RoVmFsdWUtPlRvSW50ZWdlcigpID49IDMpOworI2VuZGlmCisKKyAgYXV0byBmbGFnc1ZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICBhcmdPbmUtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMCwgZmxhZ3NWYWx1ZS5nZXQoKSk7CisgIGludDMyX3QgaUZsYWdzID0gZmxhZ3NWYWx1ZS0+VG9JbnRlZ2VyKCk7CisgIGlmIChpRmxhZ3MgIT0gMyAmJiBpRmxhZ3MgIT0gNCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IHNpbXBsZVZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOworICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+QXNzaWduKHNpbXBsZVZhbHVlLmdldCgpKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoaUZsYWdzID09IDQpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPj4gdmFsdWVzOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgIHZhbHVlcy5wdXNoX2JhY2socGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpKTsKKworICAgIHZhbHVlc1swXS0+U2V0SW50ZWdlcigzKTsKKyAgICB2YWx1ZXNbMV0tPlNldE51bGwoKTsKKyAgICB2YWx1ZXNbMl0tPlNldE51bGwoKTsKKyAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEFycmF5KHZhbHVlcyk7CisgICAgcmV0dXJuOworICB9CisKKyAgYXV0byBvYmplY3RWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgYXJnT25lLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KDIsIG9iamVjdFZhbHVlLmdldCgpKTsKKyAgaWYgKG9iamVjdFZhbHVlLT5Jc051bGwoKSkgeworICAgIHBDb250ZXh0LT5UaHJvd0NvbXBpbGVyRXJyb3JFeGNlcHRpb24oKTsKKyAgICByZXR1cm47CisgIH0KKyAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5Bc3NpZ24oYXJnT25lLmdldCgpKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OmNvbmNhdF9mbV9vYmplY3QoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7CisgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+R2V0U2NyaXB0UnVudGltZSgpOworICB1aW50MzJfdCBpTGVuZ3RoID0gMDsKKyAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4+IGFyZ1ZhbHVlczsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgYXJnVmFsdWVzLnB1c2hfYmFjayhhcmdzLkdldFZhbHVlKGkpKTsKKyAgICBpZiAoYXJnVmFsdWVzW2ldLT5Jc0FycmF5KCkpIHsKKyAgICAgIGF1dG8gbGVuZ3RoVmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgICAgICBhcmdWYWx1ZXNbaV0tPkdldE9iamVjdFByb3BlcnR5KCJsZW5ndGgiLCBsZW5ndGhWYWx1ZS5nZXQoKSk7CisgICAgICBpbnQzMl90IGxlbmd0aCA9IGxlbmd0aFZhbHVlLT5Ub0ludGVnZXIoKTsKKyAgICAgIGlMZW5ndGggPSBpTGVuZ3RoICsgKChsZW5ndGggPiAyKSA/IChsZW5ndGggLSAyKSA6IDApOworICAgIH0KKyAgICBpTGVuZ3RoICs9IDE7CisgIH0KKworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPj4gcmV0dXJuVmFsdWVzOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAoaW50MzJfdClpTGVuZ3RoOyBpKyspCisgICAgcmV0dXJuVmFsdWVzLnB1c2hfYmFjayhwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSkpOworCisgIGludDMyX3QgaW5kZXggPSAwOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBpZiAoYXJnVmFsdWVzW2ldLT5Jc0FycmF5KCkpIHsKKyAgICAgIGF1dG8gbGVuZ3RoVmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgICAgICBhcmdWYWx1ZXNbaV0tPkdldE9iamVjdFByb3BlcnR5KCJsZW5ndGgiLCBsZW5ndGhWYWx1ZS5nZXQoKSk7CisKKyAgICAgIGludDMyX3QgbGVuZ3RoID0gbGVuZ3RoVmFsdWUtPlRvSW50ZWdlcigpOworICAgICAgZm9yIChpbnQzMl90IGogPSAyOyBqIDwgbGVuZ3RoOyBqKyspIHsKKyAgICAgICAgYXJnVmFsdWVzW2ldLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KGosIHJldHVyblZhbHVlc1tpbmRleF0uZ2V0KCkpOworICAgICAgICBpbmRleCsrOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm5WYWx1ZXNbaW5kZXhdLT5Bc3NpZ24oYXJnVmFsdWVzW2ldLmdldCgpKTsKKyAgICBpbmRleCsrOworICB9CisgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0QXJyYXkocmV0dXJuVmFsdWVzKTsKK30KKworLy8gc3RhdGljCitzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpHZXRTaW1wbGVWYWx1ZSgKKyAgICBDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MsCisgICAgdWludDMyX3QgaW5kZXgpIHsKKyAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5HZXRTY3JpcHRSdW50aW1lKCk7CisgIEFTU0VSVChpbmRleCA8ICh1aW50MzJfdClhcmdzLkdldExlbmd0aCgpKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdJbmRleCA9IGFyZ3MuR2V0VmFsdWUoaW5kZXgpOworICBpZiAoIWFyZ0luZGV4LT5Jc0FycmF5KCkgJiYgIWFyZ0luZGV4LT5Jc09iamVjdCgpKQorICAgIHJldHVybiBhcmdJbmRleDsKKworICBpZiAoYXJnSW5kZXgtPklzQXJyYXkoKSkgeworICAgIGF1dG8gbGVuZ3RoVmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgICAgYXJnSW5kZXgtPkdldE9iamVjdFByb3BlcnR5KCJsZW5ndGgiLCBsZW5ndGhWYWx1ZS5nZXQoKSk7CisgICAgaW50MzJfdCBpTGVuZ3RoID0gbGVuZ3RoVmFsdWUtPlRvSW50ZWdlcigpOworICAgIGF1dG8gc2ltcGxlVmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgICAgaWYgKGlMZW5ndGggPCAzKSB7CisgICAgICBzaW1wbGVWYWx1ZS5nZXQoKS0+U2V0VW5kZWZpbmVkKCk7CisgICAgICByZXR1cm4gc2ltcGxlVmFsdWU7CisgICAgfQorCisgICAgYXV0byBwcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICAgIGF1dG8ganNPYmplY3RWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICBhcmdJbmRleC0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgxLCBwcm9wZXJ0eVZhbHVlLmdldCgpKTsKKyAgICBhcmdJbmRleC0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgyLCBqc09iamVjdFZhbHVlLmdldCgpKTsKKyAgICBpZiAocHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkpIHsKKyAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc09iamVjdFZhbHVlLmdldCgpLCBzaW1wbGVWYWx1ZS5nZXQoKSk7CisgICAgICByZXR1cm4gc2ltcGxlVmFsdWU7CisgICAgfQorCisgICAganNPYmplY3RWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHkocHJvcGVydHlWYWx1ZS0+VG9TdHJpbmcoKS5Bc1N0cmluZ1ZpZXcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGVWYWx1ZS5nZXQoKSk7CisgICAgcmV0dXJuIHNpbXBsZVZhbHVlOworICB9CisKKyAgYXV0byBkZWZhdWx0VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgIEdldE9iamVjdERlZmF1bHRWYWx1ZShhcmdJbmRleC5nZXQoKSwgZGVmYXVsdFZhbHVlLmdldCgpKTsKKyAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKK30KKworLy8gc3RhdGljCitib29sIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlZhbHVlSXNOdWxsKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogYXJnKSB7CisgIGlmICghYXJnIHx8IGFyZy0+SXNOdWxsKCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKCFhcmctPklzQXJyYXkoKSAmJiAhYXJnLT5Jc09iamVjdCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPkdldFNjcmlwdFJ1bnRpbWUoKTsKKyAgaWYgKGFyZy0+SXNBcnJheSgpKSB7CisgICAgaW50MzJfdCBpTGVuZ3RoID0gaHZhbHVlX2dldF9hcnJheV9sZW5ndGgocFRoaXMsIGFyZyk7CisgICAgaWYgKGlMZW5ndGggPCAzKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBhdXRvIHByb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgICAgYXV0byBqc09iamVjdFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICAgIGFyZy0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgxLCBwcm9wZXJ0eVZhbHVlLmdldCgpKTsKKyAgICBhcmctPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMiwganNPYmplY3RWYWx1ZS5nZXQoKSk7CisgICAgaWYgKHByb3BlcnR5VmFsdWUtPklzTnVsbCgpKSB7CisgICAgICBhdXRvIGRlZmF1bHRWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc09iamVjdFZhbHVlLmdldCgpLCBkZWZhdWx0VmFsdWUuZ2V0KCkpOworICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZS0+SXNOdWxsKCk7CisgICAgfQorCisgICAgYXV0byBuZXdQcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICAgIGpzT2JqZWN0VmFsdWUtPkdldE9iamVjdFByb3BlcnR5KHByb3BlcnR5VmFsdWUtPlRvU3RyaW5nKCkuQXNTdHJpbmdWaWV3KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7CisgICAgcmV0dXJuIG5ld1Byb3BlcnR5VmFsdWUtPklzTnVsbCgpOworICB9CisKKyAgYXV0byBkZWZhdWx0VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgIEdldE9iamVjdERlZmF1bHRWYWx1ZShhcmcsIGRlZmF1bHRWYWx1ZS5nZXQoKSk7CisgIHJldHVybiBkZWZhdWx0VmFsdWUtPklzTnVsbCgpOworfQorCisvLyBzdGF0aWMKK2ludDMyX3QgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6aHZhbHVlX2dldF9hcnJheV9sZW5ndGgoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBhcmcpIHsKKyAgaWYgKCFhcmcgfHwgIWFyZy0+SXNBcnJheSgpKQorICAgIHJldHVybiAwOworCisgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+R2V0U2NyaXB0UnVudGltZSgpOworICBhdXRvIGxlbmd0aFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICBhcmctPkdldE9iamVjdFByb3BlcnR5KCJsZW5ndGgiLCBsZW5ndGhWYWx1ZS5nZXQoKSk7CisgIHJldHVybiBsZW5ndGhWYWx1ZS0+VG9JbnRlZ2VyKCk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpzaW1wbGVWYWx1ZUNvbXBhcmUoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogZmlyc3RWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogc2Vjb25kVmFsdWUpIHsKKyAgaWYgKCFmaXJzdFZhbHVlKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoZmlyc3RWYWx1ZS0+SXNTdHJpbmcoKSkgeworICAgIEJ5dGVTdHJpbmcgZmlyc3RTdHJpbmcgPSBWYWx1ZVRvVVRGOFN0cmluZyhmaXJzdFZhbHVlKTsKKyAgICBCeXRlU3RyaW5nIHNlY29uZFN0cmluZyA9IFZhbHVlVG9VVEY4U3RyaW5nKHNlY29uZFZhbHVlKTsKKyAgICByZXR1cm4gZmlyc3RTdHJpbmcgPT0gc2Vjb25kU3RyaW5nOworICB9CisgIGlmIChmaXJzdFZhbHVlLT5Jc051bWJlcigpKSB7CisgICAgZmxvYXQgZmlyc3QgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIGZpcnN0VmFsdWUpOworICAgIGZsb2F0IHNlY29uZCA9IFZhbHVlVG9GbG9hdChwVGhpcywgc2Vjb25kVmFsdWUpOworICAgIHJldHVybiBmaXJzdCA9PSBzZWNvbmQ7CisgIH0KKyAgaWYgKGZpcnN0VmFsdWUtPklzQm9vbGVhbigpKQorICAgIHJldHVybiBmaXJzdFZhbHVlLT5Ub0Jvb2xlYW4oKSA9PSBzZWNvbmRWYWx1ZS0+VG9Cb29sZWFuKCk7CisKKyAgcmV0dXJuIGZpcnN0VmFsdWUtPklzTnVsbCgpICYmIHNlY29uZFZhbHVlICYmIHNlY29uZFZhbHVlLT5Jc051bGwoKTsKK30KKworLy8gc3RhdGljCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OnVuZm9sZEFyZ3MoCisgICAgQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzLAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+PiogcmVzdWx0VmFsdWVzLAorICAgIGludDMyX3QgaVN0YXJ0KSB7CisgIHJlc3VsdFZhbHVlcy0+Y2xlYXIoKTsKKworICBpbnQzMl90IGlDb3VudCA9IDA7CisgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+R2V0U2NyaXB0UnVudGltZSgpOworICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPj4gYXJnc1ZhbHVlOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcmdjIC0gaVN0YXJ0OyBpKyspIHsKKyAgICBhcmdzVmFsdWUucHVzaF9iYWNrKGFyZ3MuR2V0VmFsdWUoaSArIGlTdGFydCkpOworICAgIGlmIChhcmdzVmFsdWVbaV0tPklzQXJyYXkoKSkgeworICAgICAgYXV0byBsZW5ndGhWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICAgIGFyZ3NWYWx1ZVtpXS0+R2V0T2JqZWN0UHJvcGVydHkoImxlbmd0aCIsIGxlbmd0aFZhbHVlLmdldCgpKTsKKyAgICAgIGludDMyX3QgaUxlbmd0aCA9IGxlbmd0aFZhbHVlLT5Ub0ludGVnZXIoKTsKKyAgICAgIGlDb3VudCArPSAoKGlMZW5ndGggPiAyKSA/IChpTGVuZ3RoIC0gMikgOiAwKTsKKyAgICB9IGVsc2UgeworICAgICAgaUNvdW50ICs9IDE7CisgICAgfQorICB9CisKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspCisgICAgcmVzdWx0VmFsdWVzLT5wdXNoX2JhY2socGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpKTsKKworICBpbnQzMl90IGluZGV4ID0gMDsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJnYyAtIGlTdGFydDsgaSsrKSB7CisgICAgaWYgKGFyZ3NWYWx1ZVtpXS0+SXNBcnJheSgpKSB7CisgICAgICBhdXRvIGxlbmd0aFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICAgICAgYXJnc1ZhbHVlW2ldLT5HZXRPYmplY3RQcm9wZXJ0eSgibGVuZ3RoIiwgbGVuZ3RoVmFsdWUuZ2V0KCkpOworICAgICAgaW50MzJfdCBpTGVuZ3RoID0gbGVuZ3RoVmFsdWUtPlRvSW50ZWdlcigpOworICAgICAgaWYgKGlMZW5ndGggPCAzKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgYXV0byBwcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICAgICAgYXV0byBqc09iamVjdFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICAgICAgYXJnc1ZhbHVlW2ldLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KDEsIHByb3BlcnR5VmFsdWUuZ2V0KCkpOworICAgICAgaWYgKHByb3BlcnR5VmFsdWUtPklzTnVsbCgpKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBqID0gMjsgaiA8IGlMZW5ndGg7IGorKykgeworICAgICAgICAgIGFyZ3NWYWx1ZVtpXS0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeChqLCBqc09iamVjdFZhbHVlLmdldCgpKTsKKyAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNPYmplY3RWYWx1ZS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpyZXN1bHRWYWx1ZXMpW2luZGV4XS5nZXQoKSk7CisgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGogPSAyOyBqIDwgaUxlbmd0aDsgaisrKSB7CisgICAgICAgICAgYXJnc1ZhbHVlW2ldLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KGosIGpzT2JqZWN0VmFsdWUuZ2V0KCkpOworICAgICAgICAgIGpzT2JqZWN0VmFsdWUtPkdldE9iamVjdFByb3BlcnR5KAorICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLT5Ub1N0cmluZygpLkFzU3RyaW5nVmlldygpLAorICAgICAgICAgICAgICAoKnJlc3VsdFZhbHVlcylbaW5kZXhdLmdldCgpKTsKKyAgICAgICAgICBpbmRleCsrOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChhcmdzVmFsdWVbaV0tPklzT2JqZWN0KCkpIHsKKyAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShhcmdzVmFsdWVbaV0uZ2V0KCksICgqcmVzdWx0VmFsdWVzKVtpbmRleF0uZ2V0KCkpOworICAgICAgaW5kZXgrKzsKKyAgICB9IGVsc2UgeworICAgICAgKCpyZXN1bHRWYWx1ZXMpW2luZGV4XS0+QXNzaWduKGFyZ3NWYWx1ZVtpXS5nZXQoKSk7CisgICAgICBpbmRleCsrOworICAgIH0KKyAgfQorfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6R2V0T2JqZWN0RGVmYXVsdFZhbHVlKAorICAgIENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgIENGWEpTRV9WYWx1ZSogcERlZmF1bHRWYWx1ZSkgeworICBDWEZBX05vZGUqIHBOb2RlID0gVG9Ob2RlKENGWEpTRV9FbmdpbmU6OlRvT2JqZWN0KHBWYWx1ZSwgbnVsbHB0cikpOworICBpZiAoIXBOb2RlKSB7CisgICAgcERlZmF1bHRWYWx1ZS0+U2V0TnVsbCgpOworICAgIHJldHVybjsKKyAgfQorICBwTm9kZS0+SlNPYmplY3QoKS0+U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUocERlZmF1bHRWYWx1ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duKTsKK30KKworLy8gc3RhdGljCitib29sIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlNldE9iamVjdERlZmF1bHRWYWx1ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogaE5ld1ZhbHVlKSB7CisgIENYRkFfTm9kZSogcE5vZGUgPSBUb05vZGUoQ0ZYSlNFX0VuZ2luZTo6VG9PYmplY3QocFZhbHVlLCBudWxscHRyKSk7CisgIGlmICghcE5vZGUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHBOb2RlLT5KU09iamVjdCgpLT5TY3JpcHRfU29tX0RlZmF1bHRWYWx1ZShoTmV3VmFsdWUsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHN0YXRpYworQnl0ZVN0cmluZyBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpHZW5lcmF0ZVNvbUV4cHJlc3Npb24oCisgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6TmFtZSwKKyAgICBpbnQzMl90IGlJbmRleEZsYWdzLAorICAgIGludDMyX3QgaUluZGV4VmFsdWUsCisgICAgYm9vbCBiSXNTdGFyKSB7CisgIGlmIChiSXNTdGFyKQorICAgIHJldHVybiBCeXRlU3RyaW5nKHN6TmFtZSwgIlsqXSIpOworCisgIGlmIChpSW5kZXhGbGFncyA9PSAwKQorICAgIHJldHVybiBCeXRlU3RyaW5nKHN6TmFtZSk7CisKKyAgaWYgKGlJbmRleEZsYWdzID09IDEgfHwgaUluZGV4VmFsdWUgPT0gMCkgeworICAgIHJldHVybiBCeXRlU3RyaW5nKHN6TmFtZSwgIlsiKSArIEJ5dGVTdHJpbmc6OkZvcm1hdEludGVnZXIoaUluZGV4VmFsdWUpICsKKyAgICAgICAgICAgIl0iOworICB9CisgIEJ5dGVTdHJpbmcgc3pTb21FeHA7CisgIGlmIChpSW5kZXhGbGFncyA9PSAyKSB7CisgICAgc3pTb21FeHAgPSAoaUluZGV4VmFsdWUgPCAwKSA/IChzek5hbWUgKyAiWy0iKSA6IChzek5hbWUgKyAiWysiKTsKKyAgICBpSW5kZXhWYWx1ZSA9IChpSW5kZXhWYWx1ZSA8IDApID8gKDAgLSBpSW5kZXhWYWx1ZSkgOiBpSW5kZXhWYWx1ZTsKKyAgICBzelNvbUV4cCArPSBCeXRlU3RyaW5nOjpGb3JtYXRJbnRlZ2VyKGlJbmRleFZhbHVlKTsKKyAgICBzelNvbUV4cCArPSAiXSI7CisgIH0gZWxzZSB7CisgICAgc3pTb21FeHAgPSAoaUluZGV4VmFsdWUgPCAwKSA/IChzek5hbWUgKyAiWyIpIDogKHN6TmFtZSArICJbLSIpOworICAgIGlJbmRleFZhbHVlID0gKGlJbmRleFZhbHVlIDwgMCkgPyAoMCAtIGlJbmRleFZhbHVlKSA6IGlJbmRleFZhbHVlOworICAgIHN6U29tRXhwICs9IEJ5dGVTdHJpbmc6OkZvcm1hdEludGVnZXIoaUluZGV4VmFsdWUpOworICAgIHN6U29tRXhwICs9ICJdIjsKKyAgfQorICByZXR1cm4gc3pTb21FeHA7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpHZXRPYmplY3RGb3JOYW1lKAorICAgIENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgQ0ZYSlNFX1ZhbHVlKiBhY2Nlc3NvclZhbHVlLAorICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekFjY2Vzc29yTmFtZSkgeworICBDWEZBX0RvY3VtZW50KiBwRG9jID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5HZXREb2N1bWVudCgpOworICBpZiAoIXBEb2MpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENGWEpTRV9FbmdpbmUqIHBTY3JpcHRDb250ZXh0ID0gcERvYy0+R2V0U2NyaXB0Q29udGV4dCgpOworICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb2x2ZU5vZGVSUzsKKyAgdWludDMyX3QgZHdGbGFncyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzIHwKKyAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQ7CisgIGJvb2wgaVJldCA9IHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cygKKyAgICAgIHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCksCisgICAgICBXaWRlU3RyaW5nOjpGcm9tVVRGOChzekFjY2Vzc29yTmFtZSkuQXNTdHJpbmdWaWV3KCksICZyZXNvbHZlTm9kZVJTLAorICAgICAgZHdGbGFncywgbnVsbHB0cik7CisgIGlmIChpUmV0ICYmIHJlc29sdmVOb2RlUlMuZHdGbGFncyA9PSBYRkFfUmVzb2x2ZU5vZGVfUlNUeXBlX05vZGVzKSB7CisgICAgYWNjZXNzb3JWYWx1ZS0+QXNzaWduKAorICAgICAgICBwU2NyaXB0Q29udGV4dC0+R2V0SlNWYWx1ZUZyb21NYXAocmVzb2x2ZU5vZGVSUy5vYmplY3RzLmZyb250KCkpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpSZXNvbHZlT2JqZWN0cyhDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHBSZWZWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzU29tRXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMqIHJlc29sdmVOb2RlUlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYmRvdEFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJIYXNOb1Jlc29sdmVOYW1lKSB7CisgIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPkdldERvY3VtZW50KCk7CisgIGlmICghcERvYykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgV2lkZVN0cmluZyB3c1NvbUV4cHJlc3Npb24gPSBXaWRlU3RyaW5nOjpGcm9tVVRGOChic1NvbUV4cCk7CisgIENGWEpTRV9FbmdpbmUqIHBTY3JpcHRDb250ZXh0ID0gcERvYy0+R2V0U2NyaXB0Q29udGV4dCgpOworICBDWEZBX09iamVjdCogcE5vZGUgPSBudWxscHRyOworICB1aW50MzJfdCBkRmxhZ3MgPSAwVUw7CisgIGlmIChiZG90QWNjZXNzb3IpIHsKKyAgICBpZiAocFJlZlZhbHVlICYmIHBSZWZWYWx1ZS0+SXNOdWxsKCkpIHsKKyAgICAgIHBOb2RlID0gcFNjcmlwdENvbnRleHQtPkdldFRoaXNPYmplY3QoKTsKKyAgICAgIGRGbGFncyA9IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHBOb2RlID0gQ0ZYSlNFX0VuZ2luZTo6VG9PYmplY3QocFJlZlZhbHVlLCBudWxscHRyKTsKKyAgICAgIEFTU0VSVChwTm9kZSk7CisgICAgICBpZiAoYkhhc05vUmVzb2x2ZU5hbWUpIHsKKyAgICAgICAgV2lkZVN0cmluZyB3c05hbWU7CisgICAgICAgIGlmIChDWEZBX05vZGUqIHBYRkFOb2RlID0gcE5vZGUtPkFzTm9kZSgpKSB7CisgICAgICAgICAgT3B0aW9uYWw8V2lkZVN0cmluZz4gcmV0ID0KKyAgICAgICAgICAgICAgcFhGQU5vZGUtPkpTT2JqZWN0KCktPlRyeUF0dHJpYnV0ZShYRkFfQXR0cmlidXRlOjpOYW1lLCBmYWxzZSk7CisgICAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICAgIHdzTmFtZSA9ICpyZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdzTmFtZS5Jc0VtcHR5KCkpCisgICAgICAgICAgd3NOYW1lID0gTCIjIiArIHBOb2RlLT5HZXRDbGFzc05hbWUoKTsKKworICAgICAgICB3c1NvbUV4cHJlc3Npb24gPSB3c05hbWUgKyB3c1NvbUV4cHJlc3Npb247CisgICAgICAgIGRGbGFncyA9IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5nczsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRGbGFncyA9IChic1NvbUV4cCA9PSAiKiIpCisgICAgICAgICAgICAgICAgICAgICA/IChYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4pCisgICAgICAgICAgICAgICAgICAgICA6IChYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfQXR0cmlidXRlcyB8CisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIHBOb2RlID0gQ0ZYSlNFX0VuZ2luZTo6VG9PYmplY3QocFJlZlZhbHVlLCBudWxscHRyKTsKKyAgICBkRmxhZ3MgPSBYRkFfUkVTT0xWRU5PREVfQW55Q2hpbGQ7CisgIH0KKyAgcmV0dXJuIHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cyhwTm9kZSwgd3NTb21FeHByZXNzaW9uLkFzU3RyaW5nVmlldygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVOb2RlUlMsIGRGbGFncywgbnVsbHB0cik7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpQYXJzZVJlc29sdmVSZXN1bHQoCisgICAgQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICBjb25zdCBYRkFfUkVTT0xWRU5PREVfUlMmIHJlc29sdmVOb2RlUlMsCisgICAgQ0ZYSlNFX1ZhbHVlKiBwUGFyZW50VmFsdWUsCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4+KiByZXN1bHRWYWx1ZXMsCisgICAgYm9vbCogYkF0dHJpYnV0ZSkgeworICBBU1NFUlQoYkF0dHJpYnV0ZSk7CisKKyAgcmVzdWx0VmFsdWVzLT5jbGVhcigpOworCisgIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOworICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOworCisgIGlmIChyZXNvbHZlTm9kZVJTLmR3RmxhZ3MgPT0gWEZBX1Jlc29sdmVOb2RlX1JTVHlwZV9Ob2RlcykgeworICAgICpiQXR0cmlidXRlID0gZmFsc2U7CisgICAgQ0ZYSlNFX0VuZ2luZSogcFNjcmlwdENvbnRleHQgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpOworICAgIGZvciAoQ1hGQV9PYmplY3QqIHBPYmplY3QgOiByZXNvbHZlTm9kZVJTLm9iamVjdHMpIHsKKyAgICAgIHJlc3VsdFZhbHVlcy0+cHVzaF9iYWNrKHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKSk7CisgICAgICByZXN1bHRWYWx1ZXMtPmJhY2soKS0+QXNzaWduKHBTY3JpcHRDb250ZXh0LT5HZXRKU1ZhbHVlRnJvbU1hcChwT2JqZWN0KSk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgICpiQXR0cmlidXRlID0gdHJ1ZTsKKyAgaWYgKHJlc29sdmVOb2RlUlMucFNjcmlwdEF0dHJpYnV0ZSAmJgorICAgICAgcmVzb2x2ZU5vZGVSUy5wU2NyaXB0QXR0cmlidXRlLT5lVmFsdWVUeXBlID09IFhGQV9TY3JpcHRUeXBlOjpPYmplY3QpIHsKKyAgICBmb3IgKENYRkFfT2JqZWN0KiBwT2JqZWN0IDogcmVzb2x2ZU5vZGVSUy5vYmplY3RzKSB7CisgICAgICBhdXRvIHBWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICAgIENKWF9PYmplY3QqIGpzT2JqZWN0ID0gcE9iamVjdC0+SlNPYmplY3QoKTsKKyAgICAgIChqc09iamVjdC0+KihyZXNvbHZlTm9kZVJTLnBTY3JpcHRBdHRyaWJ1dGUtPmNhbGxiYWNrKSkoCisgICAgICAgICAgcFZhbHVlLmdldCgpLCBmYWxzZSwgcmVzb2x2ZU5vZGVSUy5wU2NyaXB0QXR0cmlidXRlLT5hdHRyaWJ1dGUpOworCisgICAgICByZXN1bHRWYWx1ZXMtPnB1c2hfYmFjayhzdGQ6Om1vdmUocFZhbHVlKSk7CisgICAgICAqYkF0dHJpYnV0ZSA9IGZhbHNlOworICAgIH0KKyAgfQorICBpZiAoISpiQXR0cmlidXRlKQorICAgIHJldHVybjsKKyAgaWYgKCFwUGFyZW50VmFsdWUgfHwgIXBQYXJlbnRWYWx1ZS0+SXNPYmplY3QoKSkKKyAgICByZXR1cm47CisKKyAgcmVzdWx0VmFsdWVzLT5wdXNoX2JhY2socGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpKTsKKyAgcmVzdWx0VmFsdWVzLT5iYWNrKCktPkFzc2lnbihwUGFyZW50VmFsdWUpOworfQorCisvLyBzdGF0aWMKK2ludDMyX3QgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6VmFsdWVUb0ludGVnZXIoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpIHsKKyAgaWYgKCFwVmFsdWUpCisgICAgcmV0dXJuIDA7CisKKyAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5HZXRTY3JpcHRSdW50aW1lKCk7CisgIGlmIChwVmFsdWUtPklzQXJyYXkoKSkgeworICAgIGF1dG8gcHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICBhdXRvIGpzT2JqZWN0VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgICAgYXV0byBuZXdQcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICAgIHBWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgxLCBwcm9wZXJ0eVZhbHVlLmdldCgpKTsKKyAgICBwVmFsdWUtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMiwganNPYmplY3RWYWx1ZS5nZXQoKSk7CisgICAgaWYgKHByb3BlcnR5VmFsdWUtPklzTnVsbCgpKSB7CisgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNPYmplY3RWYWx1ZS5nZXQoKSwgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7CisgICAgICByZXR1cm4gVmFsdWVUb0ludGVnZXIocFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOworICAgIH0KKworICAgIGpzT2JqZWN0VmFsdWUtPkdldE9iamVjdFByb3BlcnR5KHByb3BlcnR5VmFsdWUtPlRvU3RyaW5nKCkuQXNTdHJpbmdWaWV3KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7CisgICAgcmV0dXJuIFZhbHVlVG9JbnRlZ2VyKHBUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKKyAgfQorICBpZiAocFZhbHVlLT5Jc09iamVjdCgpKSB7CisgICAgYXV0byBuZXdQcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShwVmFsdWUsIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOworICAgIHJldHVybiBWYWx1ZVRvSW50ZWdlcihwVGhpcywgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7CisgIH0KKyAgaWYgKHBWYWx1ZS0+SXNTdHJpbmcoKSkKKyAgICByZXR1cm4gRlhTWVNfYXRvaShwVmFsdWUtPlRvU3RyaW5nKCkuY19zdHIoKSk7CisgIHJldHVybiBwVmFsdWUtPlRvSW50ZWdlcigpOworfQorCisvLyBzdGF0aWMKK2Zsb2F0IENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlZhbHVlVG9GbG9hdChDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogYXJnKSB7CisgIGlmICghYXJnKQorICAgIHJldHVybiAwLjBmOworCisgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+R2V0U2NyaXB0UnVudGltZSgpOworICBpZiAoYXJnLT5Jc0FycmF5KCkpIHsKKyAgICBhdXRvIHByb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgICAgYXV0byBqc09iamVjdFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICAgIGF1dG8gbmV3UHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICBhcmctPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMSwgcHJvcGVydHlWYWx1ZS5nZXQoKSk7CisgICAgYXJnLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KDIsIGpzT2JqZWN0VmFsdWUuZ2V0KCkpOworICAgIGlmIChwcm9wZXJ0eVZhbHVlLT5Jc051bGwoKSkgeworICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzT2JqZWN0VmFsdWUuZ2V0KCksIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOworICAgICAgcmV0dXJuIFZhbHVlVG9GbG9hdChwVGhpcywgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7CisgICAgfQorICAgIGpzT2JqZWN0VmFsdWUtPkdldE9iamVjdFByb3BlcnR5KHByb3BlcnR5VmFsdWUtPlRvU3RyaW5nKCkuQXNTdHJpbmdWaWV3KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7CisgICAgcmV0dXJuIFZhbHVlVG9GbG9hdChwVGhpcywgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7CisgIH0KKyAgaWYgKGFyZy0+SXNPYmplY3QoKSkgeworICAgIGF1dG8gbmV3UHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKKyAgICByZXR1cm4gVmFsdWVUb0Zsb2F0KHBUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKKyAgfQorICBpZiAoYXJnLT5Jc1N0cmluZygpKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0PigKKyAgICAgICAgQnl0ZVN0cmluZ1RvRG91YmxlKGFyZy0+VG9TdHJpbmcoKS5Bc1N0cmluZ1ZpZXcoKSkpOworICB9CisgIGlmIChhcmctPklzVW5kZWZpbmVkKCkpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIGFyZy0+VG9GbG9hdCgpOworfQorCisvLyBzdGF0aWMKK2RvdWJsZSBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpWYWx1ZVRvRG91YmxlKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGFyZykgeworICBpZiAoIWFyZykKKyAgICByZXR1cm4gMDsKKworICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPkdldFNjcmlwdFJ1bnRpbWUoKTsKKyAgaWYgKGFyZy0+SXNBcnJheSgpKSB7CisgICAgYXV0byBwcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICAgIGF1dG8ganNPYmplY3RWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICBhdXRvIG5ld1Byb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgICAgYXJnLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KDEsIHByb3BlcnR5VmFsdWUuZ2V0KCkpOworICAgIGFyZy0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgyLCBqc09iamVjdFZhbHVlLmdldCgpKTsKKyAgICBpZiAocHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkpIHsKKyAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc09iamVjdFZhbHVlLmdldCgpLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKKyAgICAgIHJldHVybiBWYWx1ZVRvRG91YmxlKHBUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKKyAgICB9CisgICAganNPYmplY3RWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHkocHJvcGVydHlWYWx1ZS0+VG9TdHJpbmcoKS5Bc1N0cmluZ1ZpZXcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKKyAgICByZXR1cm4gVmFsdWVUb0RvdWJsZShwVGhpcywgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7CisgIH0KKyAgaWYgKGFyZy0+SXNPYmplY3QoKSkgeworICAgIGF1dG8gbmV3UHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKKyAgICByZXR1cm4gVmFsdWVUb0RvdWJsZShwVGhpcywgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7CisgIH0KKyAgaWYgKGFyZy0+SXNTdHJpbmcoKSkKKyAgICByZXR1cm4gQnl0ZVN0cmluZ1RvRG91YmxlKGFyZy0+VG9TdHJpbmcoKS5Bc1N0cmluZ1ZpZXcoKSk7CisgIGlmIChhcmctPklzVW5kZWZpbmVkKCkpCisgICAgcmV0dXJuIDA7CisgIHJldHVybiBhcmctPlRvRG91YmxlKCk7Cit9CisKKy8vIHN0YXRpYy4KK2RvdWJsZSBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpFeHRyYWN0RG91YmxlKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHJldCkgeworICBBU1NFUlQocmV0KTsKKyAgKnJldCA9IHRydWU7CisKKyAgaWYgKCFzcmMpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKCFzcmMtPklzQXJyYXkoKSkKKyAgICByZXR1cm4gVmFsdWVUb0RvdWJsZShwVGhpcywgc3JjKTsKKworICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPkdldFNjcmlwdFJ1bnRpbWUoKTsKKyAgYXV0byBsZW5ndGhWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgc3JjLT5HZXRPYmplY3RQcm9wZXJ0eSgibGVuZ3RoIiwgbGVuZ3RoVmFsdWUuZ2V0KCkpOworICBpbnQzMl90IGlMZW5ndGggPSBsZW5ndGhWYWx1ZS0+VG9JbnRlZ2VyKCk7CisgIGlmIChpTGVuZ3RoIDw9IDIpIHsKKyAgICAqcmV0ID0gZmFsc2U7CisgICAgcmV0dXJuIDAuMDsKKyAgfQorCisgIGF1dG8gcHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKKyAgYXV0byBqc09iamVjdFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOworICBzcmMtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMSwgcHJvcGVydHlWYWx1ZS5nZXQoKSk7CisgIHNyYy0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgyLCBqc09iamVjdFZhbHVlLmdldCgpKTsKKyAgaWYgKHByb3BlcnR5VmFsdWUtPklzTnVsbCgpKQorICAgIHJldHVybiBWYWx1ZVRvRG91YmxlKHBUaGlzLCBqc09iamVjdFZhbHVlLmdldCgpKTsKKworICBhdXRvIG5ld1Byb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7CisgIGpzT2JqZWN0VmFsdWUtPkdldE9iamVjdFByb3BlcnR5KHByb3BlcnR5VmFsdWUtPlRvU3RyaW5nKCkuQXNTdHJpbmdWaWV3KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOworICByZXR1cm4gVmFsdWVUb0RvdWJsZShwVGhpcywgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7Cit9CisKKy8vIHN0YXRpYworQnl0ZVN0cmluZyBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpWYWx1ZVRvVVRGOFN0cmluZyhDRlhKU0VfVmFsdWUqIGFyZykgeworICBpZiAoIWFyZyB8fCBhcmctPklzTnVsbCgpIHx8IGFyZy0+SXNVbmRlZmluZWQoKSkKKyAgICByZXR1cm4gQnl0ZVN0cmluZygpOworICBpZiAoYXJnLT5Jc0Jvb2xlYW4oKSkKKyAgICByZXR1cm4gYXJnLT5Ub0Jvb2xlYW4oKSA/ICIxIiA6ICIwIjsKKyAgcmV0dXJuIGFyZy0+VG9TdHJpbmcoKTsKK30KKworLy8gc3RhdGljLgorYm9vbCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpUcmFuc2xhdGUoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzRm9ybWNhbGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVRleHRCdWYqIHdzSmF2YXNjcmlwdCkgeworICBpZiAod3NGb3JtY2FsYy5Jc0VtcHR5KCkpIHsKKyAgICB3c0phdmFzY3JpcHQtPkNsZWFyKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBDWEZBX0ZNUGFyc2VyIHBhcnNlcih3c0Zvcm1jYWxjKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1GdW5jdGlvbkRlZmluaXRpb24+IGZ1bmMgPSBwYXJzZXIuUGFyc2UoKTsKKyAgaWYgKCFmdW5jIHx8IHBhcnNlci5IYXNFcnJvcigpKQorICAgIHJldHVybiBmYWxzZTsKKworICBDWEZBX0ZNVG9KYXZhU2NyaXB0RGVwdGg6OlJlc2V0KCk7CisgIGlmICghZnVuYy0+VG9KYXZhU2NyaXB0KCp3c0phdmFzY3JpcHQpKQorICAgIHJldHVybiBmYWxzZTsKKworICB3c0phdmFzY3JpcHQtPkFwcGVuZENoYXIoMCk7CisKKyAgcmV0dXJuICFDWEZBX0lzVG9vQmlnKCp3c0phdmFzY3JpcHQpOworfQorCitDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpDRlhKU0VfRm9ybUNhbGNDb250ZXh0KHY4OjpJc29sYXRlKiBwU2NyaXB0SXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0NvbnRleHQqIHBTY3JpcHRDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0RvY3VtZW50KiBwRG9jKQorICAgIDogQ0ZYSlNFX0hvc3RPYmplY3Qoa0ZNMkpTKSwKKyAgICAgIG1fcElzb2xhdGUocFNjcmlwdElzb2xhdGUpLAorICAgICAgbV9wRk1DbGFzcyhDRlhKU0VfQ2xhc3M6OkNyZWF0ZShwU2NyaXB0Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1jYWxjX2ZtMmpzX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSksCisgICAgICBtX3BWYWx1ZShwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwU2NyaXB0SXNvbGF0ZSkpLAorICAgICAgbV9wRG9jdW1lbnQocERvYykgeworICBtX3BWYWx1ZS5nZXQoKS0+U2V0T2JqZWN0KHRoaXMsIG1fcEZNQ2xhc3MpOworfQorCitDRlhKU0VfRm9ybUNhbGNDb250ZXh0Ojp+Q0ZYSlNFX0Zvcm1DYWxjQ29udGV4dCgpIHt9CisKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6R2xvYmFsUHJvcGVydHlHZXR0ZXIoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpIHsKKyAgcFZhbHVlLT5Bc3NpZ24obV9wVmFsdWUuZ2V0KCkpOworfQorCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlRocm93Tm9EZWZhdWx0UHJvcGVydHlFeGNlcHRpb24oCisgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIG5hbWUpIGNvbnN0IHsKKyAgLy8gVE9ETyh0c2VwZXopOiBjaGVjayB1c2FnZSBvZiBjX3N0cigpIGJlbG93LgorICBUaHJvd0V4Y2VwdGlvbihMIiUuMTZTIGRvZXNuJ3QgaGF2ZSBhIGRlZmF1bHQgcHJvcGVydHkuIiwKKyAgICAgICAgICAgICAgICAgbmFtZS51bnRlcm1pbmF0ZWRfY19zdHIoKSk7Cit9CisKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6VGhyb3dDb21waWxlckVycm9yRXhjZXB0aW9uKCkgY29uc3QgeworICBUaHJvd0V4Y2VwdGlvbihMIkNvbXBpbGVyIGVycm9yLiIpOworfQorCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlRocm93RGl2aWRlQnlaZXJvRXhjZXB0aW9uKCkgY29uc3QgeworICBUaHJvd0V4Y2VwdGlvbihMIkRpdmlkZSBieSB6ZXJvLiIpOworfQorCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlRocm93U2VydmVyRGVuaWVkRXhjZXB0aW9uKCkgY29uc3QgeworICBUaHJvd0V4Y2VwdGlvbihMIlNlcnZlciBkb2VzIG5vdCBwZXJtaXQgb3BlcmF0aW9uLiIpOworfQorCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlRocm93UHJvcGVydHlOb3RJbk9iamVjdEV4Y2VwdGlvbigKKyAgICBjb25zdCBXaWRlU3RyaW5nJiBuYW1lLAorICAgIGNvbnN0IFdpZGVTdHJpbmcmIGV4cCkgY29uc3QgeworICBUaHJvd0V4Y2VwdGlvbigKKyAgICAgIEwiQW4gYXR0ZW1wdCB3YXMgbWFkZSB0byByZWZlcmVuY2UgcHJvcGVydHkgJyUuMTZzJyBvZiBhIG5vbi1vYmplY3QgIgorICAgICAgTCJpbiBTT00gZXhwcmVzc2lvbiAlLjE2cy4iLAorICAgICAgbmFtZS5jX3N0cigpLCBleHAuY19zdHIoKSk7Cit9CisKK3ZvaWQgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oCisgICAgY29uc3QgV2lkZVN0cmluZyYgbWV0aG9kKSBjb25zdCB7CisgIFRocm93RXhjZXB0aW9uKEwiSW5jb3JyZWN0IG51bWJlciBvZiBwYXJhbWV0ZXJzIGNhbGxpbmcgbWV0aG9kICclLjE2cycuIiwKKyAgICAgICAgICAgICAgICAgbWV0aG9kLmNfc3RyKCkpOworfQorCit2b2lkIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQ6OlRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpIGNvbnN0IHsKKyAgVGhyb3dFeGNlcHRpb24oTCJBcmd1bWVudCBtaXNtYXRjaCBpbiBwcm9wZXJ0eSBvciBmdW5jdGlvbiBhcmd1bWVudC4iKTsKK30KKwordm9pZCBDRlhKU0VfRm9ybUNhbGNDb250ZXh0OjpUaHJvd0V4Y2VwdGlvbihjb25zdCB3Y2hhcl90KiBzdHIsIC4uLikgY29uc3QgeworICB2YV9saXN0IGFyZ19wdHI7CisgIHZhX3N0YXJ0KGFyZ19wdHIsIHN0cik7CisgIFdpZGVTdHJpbmcgd3NNZXNzYWdlID0gV2lkZVN0cmluZzo6Rm9ybWF0VihzdHIsIGFyZ19wdHIpOworICB2YV9lbmQoYXJnX3B0cik7CisKKyAgQVNTRVJUKCF3c01lc3NhZ2UuSXNFbXB0eSgpKTsKKyAgRlhKU0VfVGhyb3dNZXNzYWdlKHdzTWVzc2FnZS5VVEY4RW5jb2RlKCkuQXNTdHJpbmdWaWV3KCkpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy9jZnhqc2VfZm9ybWNhbGNfY29udGV4dC5oIGIvZnhqcy9jZnhqc2VfZm9ybWNhbGNfY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZTMxNzgKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2NmeGpzZV9mb3JtY2FsY19jb250ZXh0LmgKQEAgLTAsMCArMSw0NDUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX0NGWEpTRV9GT1JNQ0FMQ19DT05URVhUX0hfCisjZGVmaW5lIEZYSlNfQ0ZYSlNFX0ZPUk1DQUxDX0NPTlRFWFRfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV9hcmd1bWVudHMuaCIKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV9jb250ZXh0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9yZXNvbHZlbm9kZV9ycy5oIgorCitjbGFzcyBDRlhfV2lkZVRleHRCdWY7CitjbGFzcyBDWEZBX0RvY3VtZW50OworCitjbGFzcyBDRlhKU0VfRm9ybUNhbGNDb250ZXh0IDogcHVibGljIENGWEpTRV9Ib3N0T2JqZWN0IHsKKyBwdWJsaWM6CisgIENGWEpTRV9Gb3JtQ2FsY0NvbnRleHQodjg6Oklzb2xhdGUqIHBTY3JpcHRJc29sYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Db250ZXh0KiBwU2NyaXB0Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0RvY3VtZW50KiBwRG9jKTsKKyAgfkNGWEpTRV9Gb3JtQ2FsY0NvbnRleHQoKSBvdmVycmlkZTsKKworICBzdGF0aWMgdm9pZCBBYnMoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIEF2ZyhDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgQ2VpbChDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBDb3VudChDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIEZsb29yKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgTWF4KENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBNaW4oQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIE1vZChDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgUm91bmQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBTdW0oQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIERhdGUoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgRGF0ZTJOdW0oQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBEYXRlRm10KENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIElzb0RhdGUyTnVtKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgSXNvVGltZTJOdW0oQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBMb2NhbERhdGVGbXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIExvY2FsVGltZUZtdChDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgTnVtMkRhdGUoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBOdW0yR01UaW1lKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIE51bTJUaW1lKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgVGltZShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBUaW1lMk51bShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIFRpbWVGbXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKworICBzdGF0aWMgYm9vbCBJc0lzb0RhdGVGb3JtYXQoY29uc3QgY2hhciogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWWVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNb250aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlEYXkpOworICBzdGF0aWMgYm9vbCBJc0lzb1RpbWVGb3JtYXQoY29uc3QgY2hhciogcERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSG91ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNaW51dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpU2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1pbGxpU2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVpvbmVIb3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVpvbmVNaW51dGUpOworICBzdGF0aWMgYm9vbCBJc0lzb0RhdGVUaW1lRm9ybWF0KGNvbnN0IGNoYXIqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWWVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTW9udGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaURheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSG91ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTWludXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1pbGxpb25TZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVpvbmVIb3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlab25lTWludXRlKTsKKyAgc3RhdGljIEJ5dGVTdHJpbmcgTG9jYWwySXNvRGF0ZShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekxvY2FsZSk7CisgIHN0YXRpYyBCeXRlU3RyaW5nIElzb0RhdGUyTG9jYWwoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pEYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pMb2NhbGUpOworICBzdGF0aWMgQnl0ZVN0cmluZyBJc29UaW1lMkxvY2FsKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6TG9jYWxlKTsKKyAgc3RhdGljIGludDMyX3QgRGF0ZVN0cmluZzJOdW0oY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RGF0ZVN0cmluZyk7CisgIHN0YXRpYyBCeXRlU3RyaW5nIEdldExvY2FsRGF0ZUZvcm1hdChDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pMb2NhbFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0YW5kYXJkKTsKKyAgc3RhdGljIEJ5dGVTdHJpbmcgR2V0TG9jYWxUaW1lRm9ybWF0KENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekxvY2FsU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3RhbmRhcmQpOworICBzdGF0aWMgQnl0ZVN0cmluZyBHZXRTdGFuZGFyZERhdGVGb3JtYXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6TG9jYWxTdHIpOworICBzdGF0aWMgQnl0ZVN0cmluZyBHZXRTdGFuZGFyZFRpbWVGb3JtYXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6TG9jYWxTdHIpOworICBzdGF0aWMgQnl0ZVN0cmluZyBOdW0yQWxsVGltZShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekxvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiR00pOworICBzdGF0aWMgdm9pZCBHZXRMb2NhbFRpbWVab25lKGludDMyX3QmIGlIb3VyLCBpbnQzMl90JiBpTWluLCBpbnQzMl90JiBpU2VjKTsKKworICBzdGF0aWMgdm9pZCBBcHIoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIENUZXJtKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgRlYoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBJUG10KENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIE5QVihDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgUG10KENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBQUG10KENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIFBWKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgUmF0ZShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBUZXJtKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIENob29zZShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgRXhpc3RzKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBIYXNWYWx1ZShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIE9uZW9mKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgV2l0aGluKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBJZihDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIEV2YWwoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgUmVmKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBVbml0VHlwZShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIFVuaXRWYWx1ZShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKworICBzdGF0aWMgdm9pZCBBdChDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIENvbmNhdChDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgRGVjb2RlKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgV2lkZVN0cmluZyBEZWNvZGVVUkwoY29uc3QgV2lkZVN0cmluZyYgd3NVUkxTdHJpbmcpOworICBzdGF0aWMgV2lkZVN0cmluZyBEZWNvZGVIVE1MKGNvbnN0IFdpZGVTdHJpbmcmIHdzSFRNTFN0cmluZyk7CisgIHN0YXRpYyBXaWRlU3RyaW5nIERlY29kZVhNTChjb25zdCBXaWRlU3RyaW5nJiB3c1hNTFN0cmluZyk7CisgIHN0YXRpYyB2b2lkIEVuY29kZShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIFdpZGVTdHJpbmcgRW5jb2RlVVJMKGNvbnN0IEJ5dGVTdHJpbmcmIHN6VVJMU3RyaW5nKTsKKyAgc3RhdGljIFdpZGVTdHJpbmcgRW5jb2RlSFRNTChjb25zdCBCeXRlU3RyaW5nJiBzekhUTUxTdHJpbmcpOworICBzdGF0aWMgV2lkZVN0cmluZyBFbmNvZGVYTUwoY29uc3QgQnl0ZVN0cmluZyYgc3pYTUxTdHJpbmcpOworICBzdGF0aWMgYm9vbCBIVE1MU1RSMkNvZGUoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHBEYXRhLCB1aW50MzJfdCogaUNvZGUpOworICBzdGF0aWMgYm9vbCBIVE1MQ29kZTJTVFIodWludDMyX3QgaUNvZGUsIFdpZGVTdHJpbmcqIHdzSFRNTFJlc2VydmUpOworICBzdGF0aWMgdm9pZCBGb3JtYXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIExlZnQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgTGVuKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBMb3dlcihDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIEx0cmltKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgUGFyc2UoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBSZXBsYWNlKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIFJpZ2h0KENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgUnRyaW0oQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBTcGFjZShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIFN0cihDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgU3R1ZmYoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBTdWJzdHIoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIFV1aWQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgVXBwZXIoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBXb3JkTnVtKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyBCeXRlU3RyaW5nIFRyaWxsaW9uVVMoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RGF0YSk7CisgIHN0YXRpYyBCeXRlU3RyaW5nIFdvcmRVUyhjb25zdCBCeXRlU3RyaW5nJiBzekRhdGEsIGludDMyX3QgaVN0eWxlKTsKKworICBzdGF0aWMgdm9pZCBHZXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIFBvc3QoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgUHV0KENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBhc3NpZ25fdmFsdWVfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIGxvZ2ljYWxfb3Jfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgbG9naWNhbF9hbmRfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBlcXVhbGl0eV9vcGVyYXRvcihDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIG5vdGVxdWFsaXR5X29wZXJhdG9yKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIGJvb2wgZm1fcmVmX2VxdWFsKENGWEpTRV9WYWx1ZSogcFRoaXMsIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBsZXNzX29wZXJhdG9yKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIGxlc3NlcXVhbF9vcGVyYXRvcihDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgZ3JlYXRlcl9vcGVyYXRvcihDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBncmVhdGVyZXF1YWxfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIHBsdXNfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgbWludXNfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBtdWx0aXBsZV9vcGVyYXRvcihDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIGRpdmlkZV9vcGVyYXRvcihDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgcG9zaXRpdmVfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBuZWdhdGl2ZV9vcGVyYXRvcihDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIGxvZ2ljYWxfbm90X29wZXJhdG9yKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgZG90X2FjY2Vzc29yKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBkb3Rkb3RfYWNjZXNzb3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIGV2YWxfdHJhbnNsYXRpb24oQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgaXNfZm1fb2JqZWN0KENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBpc19mbV9hcnJheShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIGdldF9mbV92YWx1ZShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKyAgc3RhdGljIHZvaWQgZ2V0X2ZtX2pzb2JqKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOworICBzdGF0aWMgdm9pZCBmbV92YXJfZmlsdGVyKENGWEpTRV9WYWx1ZSogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6RnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CisgIHN0YXRpYyB2b2lkIGNvbmNhdF9mbV9vYmplY3QoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKKworICBzdGF0aWMgaW50MzJfdCBodmFsdWVfZ2V0X2FycmF5X2xlbmd0aChDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGFyZyk7CisgIHN0YXRpYyBib29sIHNpbXBsZVZhbHVlQ29tcGFyZShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBmaXJzdFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBzZWNvbmRWYWx1ZSk7CisgIHN0YXRpYyB2b2lkIHVuZm9sZEFyZ3MoCisgICAgICBDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncywKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+PiogcmVzdWx0VmFsdWVzLAorICAgICAgaW50MzJfdCBpU3RhcnQgPSAwKTsKKyAgc3RhdGljIHZvaWQgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKENGWEpTRV9WYWx1ZSogcE9iamVjdFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwRGVmYXVsdFZhbHVlKTsKKyAgc3RhdGljIGJvb2wgU2V0T2JqZWN0RGVmYXVsdFZhbHVlKENGWEpTRV9WYWx1ZSogcE9iamVjdFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwTmV3VmFsdWUpOworICBzdGF0aWMgQnl0ZVN0cmluZyBHZW5lcmF0ZVNvbUV4cHJlc3Npb24oY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUluZGV4RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlJbmRleFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXNTdGFyKTsKKyAgc3RhdGljIGJvb2wgR2V0T2JqZWN0Rm9yTmFtZShDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogYWNjZXNzb3JWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pBY2Nlc3Nvck5hbWUpOworICBzdGF0aWMgYm9vbCBSZXNvbHZlT2JqZWN0cyhDRlhKU0VfVmFsdWUqIHBUaGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHBQYXJlbnRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzU29tRXhwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMqIHJlc29sdmVOb2RlUlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYmRvdEFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJIYXNOb1Jlc29sdmVOYW1lKTsKKyAgc3RhdGljIHZvaWQgUGFyc2VSZXNvbHZlUmVzdWx0KAorICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgIGNvbnN0IFhGQV9SRVNPTFZFTk9ERV9SUyYgcmVzb2x2ZU5vZGVSUywKKyAgICAgIENGWEpTRV9WYWx1ZSogcFBhcmVudFZhbHVlLAorICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4+KiByZXN1bHRWYWx1ZXMsCisgICAgICBib29sKiBiQXR0cmlidXRlKTsKKworICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gR2V0U2ltcGxlVmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbmRleCk7CisgIHN0YXRpYyBib29sIFZhbHVlSXNOdWxsKENGWEpTRV9WYWx1ZSogcFRoaXMsIENGWEpTRV9WYWx1ZSogcFZhbHVlKTsKKyAgc3RhdGljIGludDMyX3QgVmFsdWVUb0ludGVnZXIoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpOworICBzdGF0aWMgZmxvYXQgVmFsdWVUb0Zsb2F0KENGWEpTRV9WYWx1ZSogcFRoaXMsIENGWEpTRV9WYWx1ZSogcFZhbHVlKTsKKyAgc3RhdGljIGRvdWJsZSBWYWx1ZVRvRG91YmxlKENGWEpTRV9WYWx1ZSogcFRoaXMsIENGWEpTRV9WYWx1ZSogcFZhbHVlKTsKKyAgc3RhdGljIEJ5dGVTdHJpbmcgVmFsdWVUb1VURjhTdHJpbmcoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpOworICBzdGF0aWMgZG91YmxlIEV4dHJhY3REb3VibGUoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcmV0KTsKKworICBzdGF0aWMgYm9vbCBUcmFuc2xhdGUoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzRm9ybWNhbGMsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVRleHRCdWYqIHdzSmF2YXNjcmlwdCk7CisKKyAgdm9pZCBHbG9iYWxQcm9wZXJ0eUdldHRlcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSk7CisKKyBwcml2YXRlOgorICB2ODo6SXNvbGF0ZSogR2V0U2NyaXB0UnVudGltZSgpIGNvbnN0IHsgcmV0dXJuIG1fcElzb2xhdGU7IH0KKyAgQ1hGQV9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BEb2N1bWVudC5HZXQoKTsgfQorCisgIHZvaWQgVGhyb3dOb0RlZmF1bHRQcm9wZXJ0eUV4Y2VwdGlvbihjb25zdCBCeXRlU3RyaW5nVmlldyYgbmFtZSkgY29uc3Q7CisgIHZvaWQgVGhyb3dDb21waWxlckVycm9yRXhjZXB0aW9uKCkgY29uc3Q7CisgIHZvaWQgVGhyb3dEaXZpZGVCeVplcm9FeGNlcHRpb24oKSBjb25zdDsKKyAgdm9pZCBUaHJvd1NlcnZlckRlbmllZEV4Y2VwdGlvbigpIGNvbnN0OworICB2b2lkIFRocm93UHJvcGVydHlOb3RJbk9iamVjdEV4Y2VwdGlvbihjb25zdCBXaWRlU3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBleHApIGNvbnN0OworICB2b2lkIFRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpIGNvbnN0OworICB2b2lkIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKGNvbnN0IFdpZGVTdHJpbmcmIG1ldGhvZCkgY29uc3Q7CisgIHZvaWQgVGhyb3dFeGNlcHRpb24oY29uc3Qgd2NoYXJfdCogc3RyLCAuLi4pIGNvbnN0OworCisgIHY4OjpJc29sYXRlKiBtX3BJc29sYXRlOworICBDRlhKU0VfQ2xhc3MqIG1fcEZNQ2xhc3M7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IG1fcFZhbHVlOworICBVbm93bmVkUHRyPENYRkFfRG9jdW1lbnQ+IGNvbnN0IG1fcERvY3VtZW50OworfTsKKworI2VuZGlmICAvLyBGWEpTX0NGWEpTRV9GT1JNQ0FMQ19DT05URVhUX0hfCmRpZmYgLS1naXQgYS9meGpzL2NmeGpzZV9mb3JtY2FsY19jb250ZXh0X2VtYmVkZGVydGVzdC5jcHAgYi9meGpzL2NmeGpzZV9mb3JtY2FsY19jb250ZXh0X2VtYmVkZGVydGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ4ZDVjYwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2Z4anNlX2Zvcm1jYWxjX2NvbnRleHRfZW1iZWRkZXJ0ZXN0LmNwcApAQCAtMCwwICsxLDE0NDYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInRlc3RpbmcveGZhX2pzX2VtYmVkZGVyX3Rlc3QuaCIKKworY2xhc3MgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCA6IHB1YmxpYyBYRkFKU0VtYmVkZGVyVGVzdCB7fTsKKworLy8gVE9ETyhkc2luY2xhaXIpOiBDb21tZW50IG91dCB0ZXN0cyBhcmUgYnJva2VuIGFuZCBuZWVkIHRvIGJlIGZpeGVkLgorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgVHJhbnNsYXRlRW1wdHkpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBjb25zdCBjaGFyIGlucHV0W10gPSAiIjsKKyAgRVhQRUNUX1RSVUUoRXhlY3V0ZShpbnB1dCkpOworICAvLyBUT0RPKGRzaW5jbGFpcik6IFRoaXMgc2hvdWxkIHByb2JhYmx5IHRocm93IGFzIGEgYmxhbmsgZm9ybWNhbGMgc2NyaXB0CisgIC8vIGlzIGludmFsaWQuCit9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBUcmFuc2xhdGVOdW1iZXIpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBjb25zdCBjaGFyIGlucHV0W10gPSAiMTIzIjsKKyAgRVhQRUNUX1RSVUUoRXhlY3V0ZShpbnB1dCkpOworCisgIENGWEpTRV9WYWx1ZSogdmFsdWUgPSBHZXRWYWx1ZSgpOworICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNJbnRlZ2VyKCkpOworICBFWFBFQ1RfRVEoMTIzLCB2YWx1ZS0+VG9JbnRlZ2VyKCkpIDw8ICJQcm9ncmFtOiAiIDw8IGlucHV0OworfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgTnVtZXJpYykgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogcHJvZ3JhbTsKKyAgICBpbnQgcmVzdWx0OworICB9IHRlc3RzW10gPSB7eyIxMjMgKyA0NTYiLCA1Nzl9LAorICAgICAgICAgICAgICAgeyIyIC0gMyAqIDEwIC8gMiArIDciLCAtNn0sCisgICAgICAgICAgICAgICB7IjEwICogMyArIDUgKiA0IiwgNTB9LAorICAgICAgICAgICAgICAgeyIoNSAtIFwiYWJjXCIpICogMyIsIDE1fSwKKyAgICAgICAgICAgICAgIHsiXCIxMDBcIiAvIDEwZTEiLCAxfSwKKyAgICAgICAgICAgICAgIHsiNSArIG51bGwgKyAzIiwgOH0sCisgICAgICAgICAgICAgICAvLyB7ImlmIChcImFiY1wiKSB0aGVuXG4iCisgICAgICAgICAgICAgICAvLyAgIiAgMTBcbiIKKyAgICAgICAgICAgICAgIC8vICAiZWxzZVxuIgorICAgICAgICAgICAgICAgLy8gICIgIDIwXG4iCisgICAgICAgICAgICAgICAvLyAgImVuZGlmIiwKKyAgICAgICAgICAgICAgIC8vICAyMH0sCisgICAgICAgICAgICAgICAvLyB7IjMgLyAwICsgMSIsIDB9LAorICAgICAgICAgICAgICAgeyItKDE3KSIsIC0xN30sCisgICAgICAgICAgICAgICB7Ii0oLTE3KSIsIDE3fSwKKyAgICAgICAgICAgICAgIHsiKygxNykiLCAxN30sCisgICAgICAgICAgICAgICB7IisoLTE3KSIsIC0xN30sCisgICAgICAgICAgICAgICB7ImlmICgxIDwgMikgdGhlblxuMVxuZW5kaWYiLCAxfSwKKyAgICAgICAgICAgICAgIHsiaWYgKFwiYWJjXCIgPiBcImRlZlwiKSB0aGVuXG4iCisgICAgICAgICAgICAgICAgIiAgMSBhbmQgMFxuIgorICAgICAgICAgICAgICAgICJlbHNlXG4iCisgICAgICAgICAgICAgICAgIiAgMFxuIgorICAgICAgICAgICAgICAgICJlbmRpZiIsCisgICAgICAgICAgICAgICAgMH19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNJbnRlZ2VyKCkpOworICAgIEVYUEVDVF9FUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub0ludGVnZXIoKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbTsKKyAgfQorfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgU3RyaW5ncykgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogcHJvZ3JhbTsKKyAgICBjb25zdCBjaGFyKiByZXN1bHQ7CisgIH0gdGVzdHNbXSA9IHsKKyAgICAgIHsiXCJhYmNcIiIsICJhYmMifSwKKyAgICAgIHsiY29uY2F0KFwiVGhlIHRvdGFsIGlzIFwiLCAyLCBcIiBkb2xsYXJzIGFuZCBcIiwgNTcsIFwiIGNlbnRzLlwiKSIsCisgICAgICAgIlRoZSB0b3RhbCBpcyAyIGRvbGxhcnMgYW5kIDU3IGNlbnRzLiJ9fTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzU3RyaW5nKCkpOworICAgIEVYUEVDVF9TVFJFUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkpCisgICAgICAgIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW0gPDwgIiBSZXN1bHQ6ICciCisgICAgICAgIDw8IHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkgPDwgIiciOworICB9Cit9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBCb29sZWFucykgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogcHJvZ3JhbTsKKyAgICBib29sIHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0ge3siMCBhbmQgMSBvciAyID4gMSIsIHRydWV9LAorICAgICAgICAgICAgICAgeyIyIDwgMyBub3QgMSA9PSAxIiwgZmFsc2V9LAorICAgICAgICAgICAgICAgeyJcImFiY1wiIHwgMiIsIHRydWV9LAorICAgICAgICAgICAgICAgeyIxIG9yIDAiLCB0cnVlfSwKKyAgICAgICAgICAgICAgIHsiMCB8IDAiLCBmYWxzZX0sCisgICAgICAgICAgICAgICB7IjAgb3IgMSB8IDAgb3IgMCIsIHRydWV9LAorICAgICAgICAgICAgICAgeyIxIGFuZCAwIiwgZmFsc2V9LAorICAgICAgICAgICAgICAgLy8geyIwICYgMCIsIHRydWV9LCAgLy8gVE9ETyhkc2luY2xhaXIpIENvbmZpcm0gd2l0aCBSZWFkZXIuCisgICAgICAgICAgICAgICB7IjAgYW5kIDEgJiAwIGFuZCAwIiwgZmFsc2V9LAorICAgICAgICAgICAgICAgeyJub3QoXCJ0cnVlXCIpIiwgdHJ1ZX0sCisgICAgICAgICAgICAgICB7Im5vdCgxKSIsIGZhbHNlfSwKKyAgICAgICAgICAgICAgIHsiMyA9PSAzIiwgdHJ1ZX0sCisgICAgICAgICAgICAgICB7IjMgPD4gNCIsIHRydWV9LAorICAgICAgICAgICAgICAgeyJcImFiY1wiIGVxIFwiZGVmXCIiLCBmYWxzZX0sCisgICAgICAgICAgICAgICB7IlwiZGVmXCIgbmUgXCJhYmNcIiIsIHRydWV9LAorICAgICAgICAgICAgICAgeyI1ICsgNSA9PSAxMCIsIHRydWV9LAorICAgICAgICAgICAgICAgeyI1ICsgNSA8PiBcIjEwXCIiLCBmYWxzZX0sCisgICAgICAgICAgICAgICB7IjMgPCAzIiwgZmFsc2V9LAorICAgICAgICAgICAgICAgeyIzID4gNCIsIGZhbHNlfSwKKyAgICAgICAgICAgICAgIHsiXCJhYmNcIiA8PSBcImRlZlwiIiwgdHJ1ZX0sCisgICAgICAgICAgICAgICB7IlwiZGVmXCIgPiBcImFiY1wiIiwgdHJ1ZX0sCisgICAgICAgICAgICAgICB7IjEyID49IDEyIiwgdHJ1ZX0sCisgICAgICAgICAgICAgICB7IlwidHJ1ZVwiIDwgXCJmYWxzZVwiIiwgZmFsc2V9fTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzSW50ZWdlcigpKSA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtOworICAgIEVYUEVDVF9FUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub0Jvb2xlYW4oKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbTsKKyAgfQorfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgQWJzKSB7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgic2ltcGxlX3hmYS5wZGYiKSk7CisKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBwcm9ncmFtOworICAgIGZsb2F0IHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0ge3siQWJzKDEuMDMpIiwgMS4wM2Z9LCB7IkFicygtMS4wMykiLCAxLjAzZn0sIHsiQWJzKDApIiwgMC4wZn19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNOdW1iZXIoKSk7CisgICAgRVhQRUNUX0ZMT0FUX0VRKHRlc3RzW2ldLnJlc3VsdCwgdmFsdWUtPlRvRmxvYXQoKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbTsKKyAgfQorfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgQXZnKSB7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgic2ltcGxlX3hmYS5wZGYiKSk7CisKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBwcm9ncmFtOworICAgIGZsb2F0IHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0ge3siQXZnKDAsIDMyLCAxNikiLCAxNi4wZn0sIHsiQXZnKDIuNSwgMTcsIG51bGwpIiwgOS43NWZ9fTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzTnVtYmVyKCkpOworICAgIEVYUEVDVF9GTE9BVF9FUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub0Zsb2F0KCkpCisgICAgICAgIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW07CisgIH0KK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIENlaWwpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgaW50IHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0ge3siQ2VpbCgyLjU4NzUpIiwgM30sIHsiQ2VpbCgtNS45KSIsIC01fSwgeyJDZWlsKFwiYWJjXCIpIiwgMH19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNJbnRlZ2VyKCkpOworICAgIEVYUEVDVF9FUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub0ludGVnZXIoKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbTsKKyAgfQorfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgQ291bnQpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgaW50IHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0ge3siQ291bnQoXCJUb255XCIsIFwiQmx1ZVwiLCA0MSkiLCAzfX07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBFWFBFQ1RfVFJVRShFeGVjdXRlKHRlc3RzW2ldLnByb2dyYW0pKTsKKworICAgIENGWEpTRV9WYWx1ZSogdmFsdWUgPSBHZXRWYWx1ZSgpOworICAgIEVYUEVDVF9UUlVFKHZhbHVlLT5Jc0ludGVnZXIoKSk7CisgICAgRVhQRUNUX0VRKHRlc3RzW2ldLnJlc3VsdCwgdmFsdWUtPlRvSW50ZWdlcigpKQorICAgICAgICA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtOworICB9Cit9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBGbG9vcikgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogcHJvZ3JhbTsKKyAgICBpbnQgcmVzdWx0OworICB9IHRlc3RzW10gPSB7eyJGbG9vcigyMS4zNDA5ODczKSIsIDIxfSwKKyAgICAgICAgICAgICAgIHsiRmxvb3IoNS45OTk5NjUzNDIpIiwgNX0sCisgICAgICAgICAgICAgICB7IkZsb29yKDMuMiAqIDE1KSIsIDQ4fX07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBFWFBFQ1RfVFJVRShFeGVjdXRlKHRlc3RzW2ldLnByb2dyYW0pKTsKKworICAgIENGWEpTRV9WYWx1ZSogdmFsdWUgPSBHZXRWYWx1ZSgpOworICAgIEVYUEVDVF9UUlVFKHZhbHVlLT5Jc0ludGVnZXIoKSk7CisgICAgRVhQRUNUX0VRKHRlc3RzW2ldLnJlc3VsdCwgdmFsdWUtPlRvSW50ZWdlcigpKQorICAgICAgICA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtOworICB9Cit9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBNYXgpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgaW50IHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0ge3siTWF4KDIzNCwgMTUsIDEwNykiLCAyMzR9LAorICAgICAgICAgICAgICAgeyJNYXgoXCJhYmNcIiwgMTUsIFwiVG9ueSBCbHVlXCIpIiwgMTV9LAorICAgICAgICAgICAgICAgeyJNYXgoXCJhYmNcIikiLCAwfX07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBFWFBFQ1RfVFJVRShFeGVjdXRlKHRlc3RzW2ldLnByb2dyYW0pKTsKKworICAgIENGWEpTRV9WYWx1ZSogdmFsdWUgPSBHZXRWYWx1ZSgpOworICAgIEVYUEVDVF9UUlVFKHZhbHVlLT5Jc0ludGVnZXIoKSk7CisgICAgRVhQRUNUX0VRKHRlc3RzW2ldLnJlc3VsdCwgdmFsdWUtPlRvSW50ZWdlcigpKQorICAgICAgICA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtOworICB9Cit9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBNaW4pIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgaW50IHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0ge3siTWluKDIzNCwgMTUsIDEwNykiLCAxNX0sCisgICAgICAgICAgICAgICAvLyBUT0RPKGRzaW5jbGFpcik6IFZlcmlmeSB3aXRoIFJlYWRlcjsgSSBiZWxpZXZlIHRoaXMgc2hvdWxkCisgICAgICAgICAgICAgICAvLyBoYXZlIGEgcmV0dXJuIG9mIDAuCisgICAgICAgICAgICAgICAvLyB7Ik1pbihcImFiY1wiLCAxNSwgXCJUb255IEJsdWVcIikiLCAxNX0sCisgICAgICAgICAgICAgICB7Ik1pbihcImFiY1wiKSIsIDB9fTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzSW50ZWdlcigpKTsKKyAgICBFWFBFQ1RfRVEodGVzdHNbaV0ucmVzdWx0LCB2YWx1ZS0+VG9JbnRlZ2VyKCkpCisgICAgICAgIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW07CisgIH0KK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIE1vZCkgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogcHJvZ3JhbTsKKyAgICBpbnQgcmVzdWx0OworICB9IHRlc3RzW10gPSB7eyJNb2QoNjQsIC0zKSIsIDF9LCB7Ik1vZCgtMTMsIDMpIiwgLTF9LCB7Ik1vZChcImFiY1wiLCAyKSIsIDB9fTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzSW50ZWdlcigpKTsKKyAgICBFWFBFQ1RfRVEodGVzdHNbaV0ucmVzdWx0LCB2YWx1ZS0+VG9JbnRlZ2VyKCkpCisgICAgICAgIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW07CisgIH0KK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIFJvdW5kKSB7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgic2ltcGxlX3hmYS5wZGYiKSk7CisKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBwcm9ncmFtOworICAgIGZsb2F0IHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0ge3siUm91bmQoMTIuMzg5NzY0NTM3LCA0KSIsIDEyLjM4OThmfSwKKyAgICAgICAgICAgICAgIHsiUm91bmQoMjAvMywgMikiLCA2LjY3Zn0sCisgICAgICAgICAgICAgICB7IlJvdW5kKDguOTg5NywgXCJhYmNcIikiLCA5LjBmfSwKKyAgICAgICAgICAgICAgIHsiUm91bmQoRlYoNDAwLCAwLjEwLzEyLCAzMCoxMiksIDIpIiwgOTA0MTk1LjE3Zn19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNOdW1iZXIoKSkgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbTsKKyAgICBFWFBFQ1RfRkxPQVRfRVEodGVzdHNbaV0ucmVzdWx0LCB2YWx1ZS0+VG9GbG9hdCgpKQorICAgICAgICA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtOworICB9Cit9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBTdW0pIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgaW50IHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0ge3siU3VtKDIsIDQsIDYsIDgpIiwgMjB9LAorICAgICAgICAgICAgICAgeyJTdW0oLTIsIDQsIC02LCA4KSIsIDR9LAorICAgICAgICAgICAgICAgeyJTdW0oNCwgMTYsIFwiYWJjXCIsIDE5KSIsIDM5fX07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBFWFBFQ1RfVFJVRShFeGVjdXRlKHRlc3RzW2ldLnByb2dyYW0pKTsKKworICAgIENGWEpTRV9WYWx1ZSogdmFsdWUgPSBHZXRWYWx1ZSgpOworICAgIEVYUEVDVF9UUlVFKHZhbHVlLT5Jc0ludGVnZXIoKSk7CisgICAgRVhQRUNUX0VRKHRlc3RzW2ldLnJlc3VsdCwgdmFsdWUtPlRvSW50ZWdlcigpKQorICAgICAgICA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtOworICB9Cit9CisKKy8vIFRFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBESVNBQkxFRF9EYXRlKSB7CisvLyAgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgic2ltcGxlX3hmYS5wZGYiKSk7CisvLworLy8gICBUT0RPKGRzaW5jbGFpcik6IE1ha2UgY29tcGF0aWJsZSB3aXRoIHdpbmRvd3MuCisvLyAgIHRpbWVfdCBzZWNvbmRzID0gdGltZShudWxscHRyKTsKKy8vICAgaW50IGRheXMgPSBzZWNvbmRzIC8gKDYwICogNjAgKiAyNCk7CisKKy8vICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSgiRGF0ZSgpIikpOworCisvLyAgIENGWEpTRV9WYWx1ZSogdmFsdWUgPSBHZXRWYWx1ZSgpOworLy8gICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNOdW1iZXIoKSk7CisvLyAgIEVYUEVDVF9FUShkYXlzLCB2YWx1ZS0+VG9JbnRlZ2VyKCkpOworLy8gfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgRGF0ZTJOdW0pIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgaW50IHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0geworICAgICAgLy8geyJEYXRlMk51bShcIk1hciAxNSwgMTk5NlwiKSIsIDM1MTM4fSwKKyAgICAgIHsiRGF0ZTJOdW0oXCIxLzEvMTkwMFwiLCBcIkQvTS9ZWVlZXCIpIiwgMX0sCisgICAgICB7IkRhdGUyTnVtKFwiMDMvMTUvOTZcIiwgXCJNTS9ERC9ZWVwiKSIsIDM1MTM4fSwKKyAgICAgIC8vIHsiRGF0ZTJOdW0oXCJBdWcgMSwgMTk5NlwiLCBcIk1NTSBELCBZWVlZXCIpIiwgMzUyNzd9LAorICAgICAgeyJEYXRlMk51bShcIjk2LTA4LTIwXCIsIFwiWVktTU0tRERcIiwgXCJmcl9GUlwiKSIsIDM1Mjk2fSwKKyAgICAgIHsiRGF0ZTJOdW0oXCIxLzMvMDBcIiwgXCJEL00vWVlcIikgLSBEYXRlMk51bShcIjEvMi8wMFwiLCBcIkQvTS9ZWVwiKSIsCisgICAgICAgMjl9fTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzSW50ZWdlcigpKTsKKyAgICBFWFBFQ1RfRVEodGVzdHNbaV0ucmVzdWx0LCB2YWx1ZS0+VG9JbnRlZ2VyKCkpCisgICAgICAgIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW07CisgIH0KK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIERhdGVGbXQpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgY29uc3QgY2hhciogcmVzdWx0OworICB9IHRlc3RzW10gPSB7CisgICAgICAvLyB7IkRhdGVGbXQoMSkiLCAiTS9EL1lZIn0sCisgICAgICAvLyB7IkRhdGVGbXQoMiwgXCJmcl9DQVwiKSIsICJZWS1NTS1ERCJ9LAorICAgICAgeyJEYXRlRm10KDMsIFwiZGVfREVcIikiLCAiRC4gTU1NTSBZWVlZIn0sCisgICAgICAvLyB7IkRhdGVGbXQoNCwgXCJmcl9GUlwiKSIsICJFRUUgRCcgTU1NTSBZWVlZIn0KKyAgfTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzU3RyaW5nKCkpOworICAgIEVYUEVDVF9TVFJFUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkpCisgICAgICAgIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW0gPDwgIiBSZXN1bHQ6ICciCisgICAgICAgIDw8IHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkgPDwgIiciOworICB9Cit9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBJc29EYXRlMk51bSkgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogcHJvZ3JhbTsKKyAgICBpbnQgcmVzdWx0OworICB9IHRlc3RzW10gPSB7eyJJc29EYXRlMk51bShcIjE5MDBcIikiLCAxfSwKKyAgICAgICAgICAgICAgIHsiSXNvRGF0ZTJOdW0oXCIxOTAwLTAxXCIpIiwgMX0sCisgICAgICAgICAgICAgICB7Iklzb0RhdGUyTnVtKFwiMTkwMC0wMS0wMVwiKSIsIDF9LAorICAgICAgICAgICAgICAgeyJJc29EYXRlMk51bShcIjE5OTYwMzE1VDIwOjIwOjIwXCIpIiwgMzUxMzh9LAorICAgICAgICAgICAgICAgeyJJc29EYXRlMk51bShcIjIwMDAtMDMtMDFcIikgLSBJc29EYXRlMk51bShcIjIwMDAwMjAxXCIpIiwgMjl9fTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzSW50ZWdlcigpKTsKKyAgICBFWFBFQ1RfRVEodGVzdHNbaV0ucmVzdWx0LCB2YWx1ZS0+VG9JbnRlZ2VyKCkpCisgICAgICAgIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW07CisgIH0KK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIERJU0FCTEVEX0lzb1RpbWUyTnVtKSB7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgic2ltcGxlX3hmYS5wZGYiKSk7CisKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBwcm9ncmFtOworICAgIGludCByZXN1bHQ7CisgIH0gdGVzdHNbXSA9IHt7Iklzb1RpbWUyTnVtKFwiMDA6MDA6MDBaXCIpIiwgMX19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNJbnRlZ2VyKCkpOworICAgIEVYUEVDVF9FUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub0ludGVnZXIoKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbTsKKyAgfQorfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgTG9jYWxEYXRlRm10KSB7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgic2ltcGxlX3hmYS5wZGYiKSk7CisKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBwcm9ncmFtOworICAgIGNvbnN0IGNoYXIqIHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0gey8vIHsiTG9jYWxEYXRlRm10KDEsIFwiZGVfREVcIikiLCAidHQuTU0udXUifSwKKyAgICAgICAgICAgICAgIC8vIHsiTG9jYWxEYXRlRm10KDIsIFwiZnJfQ0FcIikiLCAiYWEtTU0tamoifSwKKyAgICAgICAgICAgICAgIHsiTG9jYWxEYXRlRm10KDMsIFwiZGVfQ0hcIikiLCAidC4gTU1NTSBqampqIn0sCisgICAgICAgICAgICAgICB7IkxvY2FsRGF0ZUZtdCg0LCBcImZyX0ZSXCIpIiwgIkVFRUUgaiBNTU1NIGFhYWEifX07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBFWFBFQ1RfVFJVRShFeGVjdXRlKHRlc3RzW2ldLnByb2dyYW0pKTsKKworICAgIENGWEpTRV9WYWx1ZSogdmFsdWUgPSBHZXRWYWx1ZSgpOworICAgIEVYUEVDVF9UUlVFKHZhbHVlLT5Jc1N0cmluZygpKTsKKyAgICBFWFBFQ1RfU1RSRVEodGVzdHNbaV0ucmVzdWx0LCB2YWx1ZS0+VG9TdHJpbmcoKS5jX3N0cigpKQorICAgICAgICA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtIDw8ICIgUmVzdWx0OiAnIgorICAgICAgICA8PCB2YWx1ZS0+VG9TdHJpbmcoKS5jX3N0cigpIDw8ICInIjsKKyAgfQorfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgRElTQUJMRURfTG9jYWxUaW1lRm10KSB7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgic2ltcGxlX3hmYS5wZGYiKSk7CisKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBwcm9ncmFtOworICAgIGNvbnN0IGNoYXIqIHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0ge3siTG9jYWxUaW1lRm10KDEsIFwiZGVfREVcIikiLCAiSEg6bW0ifSwKKyAgICAgICAgICAgICAgIHsiTG9jYWxUaW1lRm10KDIsIFwiZnJfQ0FcIikiLCAiSEg6bW06OnNzIn0sCisgICAgICAgICAgICAgICB7IkxvY2FsVGltZUZtdCgzLCBcImRlX0NIXCIpIiwgIkhIOm1tOnNzIHoifSwKKyAgICAgICAgICAgICAgIHsiTG9jYWxUaW1lRm10KDQsIFwiZnJfRlJcIikiLCAiSEgnIGggJ21tIHoifX07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBFWFBFQ1RfVFJVRShFeGVjdXRlKHRlc3RzW2ldLnByb2dyYW0pKTsKKworICAgIENGWEpTRV9WYWx1ZSogdmFsdWUgPSBHZXRWYWx1ZSgpOworICAgIEVYUEVDVF9UUlVFKHZhbHVlLT5Jc1N0cmluZygpKTsKKyAgICBFWFBFQ1RfU1RSRVEodGVzdHNbaV0ucmVzdWx0LCB2YWx1ZS0+VG9TdHJpbmcoKS5jX3N0cigpKQorICAgICAgICA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtIDw8ICIgUmVzdWx0OiAnIgorICAgICAgICA8PCB2YWx1ZS0+VG9TdHJpbmcoKS5jX3N0cigpIDw8ICInIjsKKyAgfQorfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgTnVtMkRhdGUpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgY29uc3QgY2hhciogcmVzdWx0OworICB9IHRlc3RzW10gPSB7CisgICAgICB7Ik51bTJEYXRlKDEsIFwiREQvTU0vWVlZWVwiKSIsICIwMS8wMS8xOTAwIn0sCisgICAgICB7Ik51bTJEYXRlKDM1MTM5LCBcIkRELU1NTS1ZWVlZXCIsIFwiZGVfREVcIikiLCAiMTYtTXJ6LTE5OTYifSwKKyAgICAgIC8vIHsiTnVtMkRhdGUoRGF0ZTJOdW0oXCJNYXIgMTUsIDIwMDBcIikgLSBEYXRlMk51bShcIjk4LTAzLTE1XCIsICIKKyAgICAgIC8vICAiXCJZWS1NTS1ERFwiLCBcImZyX0NBXCIpKSIsCisgICAgICAvLyAgIkphbiAxLCAxOTAyIn0KKyAgfTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzU3RyaW5nKCkpIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW07CisgICAgRVhQRUNUX1NUUkVRKHRlc3RzW2ldLnJlc3VsdCwgdmFsdWUtPlRvU3RyaW5nKCkuY19zdHIoKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbSA8PCAiIFJlc3VsdDogJyIKKyAgICAgICAgPDwgdmFsdWUtPlRvU3RyaW5nKCkuY19zdHIoKSA8PCAiJyI7CisgIH0KK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIERJU0FCTEVEX051bTJHTVRpbWUpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgY29uc3QgY2hhciogcmVzdWx0OworICB9IHRlc3RzW10gPSB7Ly8gQnJva2VuIG9uIFdpbmRvd3Mgb25seS4KKyAgICAgICAgICAgICAgIHsiTnVtMkdNVGltZSgxLCBcIkhIOk1NOlNTXCIpIiwgIjAwOjAwOjAwIn0sCisgICAgICAgICAgICAgICAvLyBCZWxvdyBicm9rZW4gb24gb3RoZXIgcGxhdGZvcm1zLgorICAgICAgICAgICAgICAgeyJOdW0yR01UaW1lKDY1NTkzMDAxLCBcIkhIOk1NOlNTIFpcIikiLCAiMTg6MTM6MTMgR01UIn0sCisgICAgICAgICAgICAgICB7Ik51bTJHTVRpbWUoNDM5OTMwMDEsIFRpbWVGbXQoNCwgXCJkZV9ERVwiKSwgXCJkZV9ERVwiKSIsCisgICAgICAgICAgICAgICAgIjEyLjEzIFVociBHTVQifX07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBFWFBFQ1RfVFJVRShFeGVjdXRlKHRlc3RzW2ldLnByb2dyYW0pKTsKKworICAgIENGWEpTRV9WYWx1ZSogdmFsdWUgPSBHZXRWYWx1ZSgpOworICAgIEVYUEVDVF9UUlVFKHZhbHVlLT5Jc1N0cmluZygpKTsKKyAgICBFWFBFQ1RfU1RSRVEodGVzdHNbaV0ucmVzdWx0LCB2YWx1ZS0+VG9TdHJpbmcoKS5jX3N0cigpKQorICAgICAgICA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtIDw8ICIgUmVzdWx0OiAnIgorICAgICAgICA8PCB2YWx1ZS0+VG9TdHJpbmcoKS5jX3N0cigpIDw8ICInIjsKKyAgfQorfQorCisvLyBUT0RPKGRzaW5jbGFpcik6IEJyb2tlbiBvbiBNYWMgLi4uCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgRElTQUJMRURfTnVtMlRpbWUpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgY29uc3QgY2hhciogcmVzdWx0OworICB9IHRlc3RzW10gPSB7eyJOdW0yVGltZSgxLCBcIkhIOk1NOlNTXCIpIiwgIjAwOjAwOjAwIn19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNTdHJpbmcoKSk7CisgICAgRVhQRUNUX1NUUkVRKHRlc3RzW2ldLnJlc3VsdCwgdmFsdWUtPlRvU3RyaW5nKCkuY19zdHIoKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbSA8PCAiIFJlc3VsdDogJyIKKyAgICAgICAgPDwgdmFsdWUtPlRvU3RyaW5nKCkuY19zdHIoKSA8PCAiJyI7CisgIH0KK30KKworLy8gVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIERJU0FCTEVEX1RpbWUpIHsKKy8vICAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKy8vICAgVE9ETyhkc2luY2xhaXIpOiBNYWtlIGNvbXBhdGlibGUgd2l0aCB3aW5kb3dzLgorLy8gICBzdHJ1Y3QgdGltZXZhbCB0cDsKKy8vICAgZ2V0dGltZW9mZGF5KCZ0cCwgbnVsbHB0cik7CisKKy8vICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSgiVGltZSgpIikpOworCisvLyAgIENGWEpTRV9WYWx1ZSogdmFsdWUgPSBHZXRWYWx1ZSgpOworLy8gICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNJbnRlZ2VyKCkpOworLy8gICBFWFBFQ1RfRVEodHAudHZfc2VjICogMTAwMEwgKyB0cC50dl91c2VjIC8gMTAwMCwgdmFsdWUtPlRvSW50ZWdlcigpKQorLy8gICAgICAgPDwgIlByb2dyYW06IFRpbWUoKSI7CisvLyB9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBUaW1lMk51bSkgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogcHJvZ3JhbTsKKyAgICBpbnQgcmVzdWx0OworICB9IHRlc3RzW10gPSB7CisgICAgICAvLyB7IlRpbWUyTnVtKFwiMDA6MDA6MDAgR01UXCIsIFwiSEg6TU06U1MgWlwiKSIsIDF9LAorICAgICAgeyJUaW1lMk51bShcIjEzOjEzOjEzIEdNVFwiLCBcIkhIOk1NOlNTIFpcIiwgXCJmcl9GUlwiKSIsIDQ3NTkzMDAxfX07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBFWFBFQ1RfVFJVRShFeGVjdXRlKHRlc3RzW2ldLnByb2dyYW0pKTsKKworICAgIENGWEpTRV9WYWx1ZSogdmFsdWUgPSBHZXRWYWx1ZSgpOworICAgIEVYUEVDVF9UUlVFKHZhbHVlLT5Jc0ludGVnZXIoKSk7CisgICAgRVhQRUNUX0VRKHRlc3RzW2ldLnJlc3VsdCwgdmFsdWUtPlRvSW50ZWdlcigpKQorICAgICAgICA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtOworICB9Cit9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBUaW1lRm10KSB7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgic2ltcGxlX3hmYS5wZGYiKSk7CisKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBwcm9ncmFtOworICAgIGNvbnN0IGNoYXIqIHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0geworICAgICAgLy8geyJUaW1lRm10KDEpIiwgImg6Ok1NIEEifSwKKyAgICAgIHsiVGltZUZtdCgyLCBcImZyX0NBXCIpIiwgIkhIOk1NOlNTIn0sCisgICAgICB7IlRpbWVGbXQoMywgXCJmcl9GUlwiKSIsICJISDpNTTpTUyBaIn0sCisgICAgICAvLyB7IlRpbWVGbXQoNCwgXCJkZV9ERVwiKSIsICJILk1NJyBVaHIgJ1oifQorICB9OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNTdHJpbmcoKSk7CisgICAgRVhQRUNUX1NUUkVRKHRlc3RzW2ldLnJlc3VsdCwgdmFsdWUtPlRvU3RyaW5nKCkuY19zdHIoKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbSA8PCAiIFJlc3VsdDogJyIKKyAgICAgICAgPDwgdmFsdWUtPlRvU3RyaW5nKCkuY19zdHIoKSA8PCAiJyI7CisgIH0KK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIERJU0FCTEVEX0FwcikgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogcHJvZ3JhbTsKKyAgICBmbG9hdCByZXN1bHQ7CisgIH0gdGVzdHNbXSA9IHt7IkFwcigzNTAwMCwgMjY5LjUwLCAzNjApIiwgMC4wODUxNTQwNDU2NmZ9LAorICAgICAgICAgICAgICAgeyJBcHIoMjEwMDAwICogMC43NSwgODUwICsgMTEwLCAyNSAqIDI2KSIsIDAuMDcxNjEzMzI0MDRmfX07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBFWFBFQ1RfVFJVRShFeGVjdXRlKHRlc3RzW2ldLnByb2dyYW0pKTsKKworICAgIENGWEpTRV9WYWx1ZSogdmFsdWUgPSBHZXRWYWx1ZSgpOworICAgIEVYUEVDVF9UUlVFKHZhbHVlLT5Jc051bWJlcigpKTsKKyAgICBFWFBFQ1RfRkxPQVRfRVEodGVzdHNbaV0ucmVzdWx0LCB2YWx1ZS0+VG9GbG9hdCgpKQorICAgICAgICA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtOworICB9Cit9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBDVGVybSkgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogcHJvZ3JhbTsKKyAgICBmbG9hdCByZXN1bHQ7CisgIH0gdGVzdHNbXSA9IHsKKyAgICAgIC8vIHsiQ1Rlcm0oMC4wMiwgMTAwMCwgMTAwKSIsIDExNi4yNzY3NDc0NTE1Zn0sCisgICAgICB7IkNUZXJtKDAuMTAsIDUwMDAwMCwgMTIwMDApIiwgMzkuMTMyMjQ2NDg1MDJmfSwKKyAgICAgIC8vIHsiQ1Rlcm0oMC4wMjc1ICsgMC4wMDI1LCAxMDAwMDAwLCA1NTAwMCAqIDAuMTApIiwgMTc2LjAyMjI2MDQ0OTc1Zn0KKyAgfTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzTnVtYmVyKCkpOworICAgIEVYUEVDVF9GTE9BVF9FUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub0Zsb2F0KCkpCisgICAgICAgIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW07CisgIH0KK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIEZWKSB7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgic2ltcGxlX3hmYS5wZGYiKSk7CisKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBwcm9ncmFtOworICAgIGZsb2F0IHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0ge3siRlYoNDAwLCAwLjEwIC8gMTIsIDMwICogMTIpIiwgOTA0MTk1LjE2OTkxODQyNDQ1Zn0sCisgICAgICAgICAgICAgICB7IkZWKDEwMDAsIDAuMDc1IC8gNCwgMTAgKiA0KSIsIDU4NzkxLjk2MTQ1NTM1OTgxZn19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNOdW1iZXIoKSk7CisgICAgRVhQRUNUX0ZMT0FUX0VRKHRlc3RzW2ldLnJlc3VsdCwgdmFsdWUtPlRvRmxvYXQoKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbTsKKyAgfQorfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgSVBtdCkgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogcHJvZ3JhbTsKKyAgICBmbG9hdCByZXN1bHQ7CisgIH0gdGVzdHNbXSA9IHt7IklQbXQoMzAwMDAsIDAuMDg1LCAyOTUuNTAsIDcsIDMpIiwgNjI0Ljg4MzkyODMxNDJmfSwKKyAgICAgICAgICAgICAgIHsiSVBtdCgxNjAwMDAsIDAuMDQ3NSwgOTgwLCAyNCwgMTIpIiwgNzEwMy44MDgzMzU2OTQ4NWZ9LAorICAgICAgICAgICAgICAgeyJJUG10KDE1MDAwLCAwLjA2NSwgNjUuNTAsIDE1LCAxKSIsIDAuMGZ9fTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzTnVtYmVyKCkpOworICAgIEVYUEVDVF9GTE9BVF9FUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub0Zsb2F0KCkpCisgICAgICAgIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW07CisgIH0KK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIERJU0FCTEVEX05QVikgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogcHJvZ3JhbTsKKyAgICBmbG9hdCByZXN1bHQ7CisgIH0gdGVzdHNbXSA9IHt7Ik5QVigwLjA2NSwgNTAwMCkiLCA0Njk0LjgzNTY4MDc1MTE3Zn0sCisgICAgICAgICAgICAgICB7Ik5QVigwLjEwLCA1MDAsIDE1MDAsIDQwMDAsIDEwMDAwKSIsIDExNTI5LjYwODYzMzI5MDA3Zn0sCisgICAgICAgICAgICAgICB7Ik5QVigwLjAyNzUgLyAxMiwgNTAsIDYwLCA0MCwgMTAwLCAyNSkiLCAyNzMuMTQxOTM4Mzg0NTdmfX07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBFWFBFQ1RfVFJVRShFeGVjdXRlKHRlc3RzW2ldLnByb2dyYW0pKTsKKworICAgIENGWEpTRV9WYWx1ZSogdmFsdWUgPSBHZXRWYWx1ZSgpOworICAgIEVYUEVDVF9UUlVFKHZhbHVlLT5Jc051bWJlcigpKSA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtOworICAgIEVYUEVDVF9GTE9BVF9FUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub0Zsb2F0KCkpCisgICAgICAgIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW07CisgIH0KK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIFBtdCkgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogcHJvZ3JhbTsKKyAgICBmbG9hdCByZXN1bHQ7CisgIH0gdGVzdHNbXSA9IHsvLyB7IlBtdCgxNTAwMDAsIDAuMDQ3NSAvIDEyLCAyNSAqIDEyKSIsIDg1NS4xNzYwNDIwNzE2NGZ9LAorICAgICAgICAgICAgICAgeyJQbXQoMjUwMDAsIDAuMDg1LCAxMikiLCAzNDAzLjgyMTQ1MTY5ODc2Zn19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNOdW1iZXIoKSk7CisgICAgRVhQRUNUX0ZMT0FUX0VRKHRlc3RzW2ldLnJlc3VsdCwgdmFsdWUtPlRvRmxvYXQoKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbTsKKyAgfQorfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgUFBtdCkgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogcHJvZ3JhbTsKKyAgICBmbG9hdCByZXN1bHQ7CisgIH0gdGVzdHNbXSA9IHsKKyAgICAgIHsiUFBtdCgzMDAwMCwgMC4wODUsIDI5NS41MCwgNywgMykiLCAyNjEuNjE2MDcxNjg1OGZ9LAorICAgICAgeyJQUG10KDE2MDAwMCwgMC4wNDc1LCA5ODAsIDI0LCAxMikiLCA0NjU2LjE5MTY2NDMwNTE1Zn0sCisgICAgICAvLyB7IlBQbXQoMTUwMDAsIDAuMDY1LCA2NS41MCwgMTUsIDEpIiwgMC4wZn0KKyAgfTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzTnVtYmVyKCkpOworICAgIEVYUEVDVF9GTE9BVF9FUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub0Zsb2F0KCkpCisgICAgICAgIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW07CisgIH0KK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIFBWKSB7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgic2ltcGxlX3hmYS5wZGYiKSk7CisKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBwcm9ncmFtOworICAgIGZsb2F0IHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0geworICAgICAgeyJQVig0MDAsIDAuMTAgLyAxMiwgMzAgKiAxMikiLCA0NTU4MC4zMjc5OTA3NDQzOWZ9LAorICAgICAgLy8geyJQVigxMDAwLCAwLjA3NSAvIDQsIDEwICogNCkiLCA1ODc5MS45NjE0NTUzNTk4MWZ9CisgIH07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBFWFBFQ1RfVFJVRShFeGVjdXRlKHRlc3RzW2ldLnByb2dyYW0pKTsKKworICAgIENGWEpTRV9WYWx1ZSogdmFsdWUgPSBHZXRWYWx1ZSgpOworICAgIEVYUEVDVF9UUlVFKHZhbHVlLT5Jc051bWJlcigpKTsKKyAgICBFWFBFQ1RfRkxPQVRfRVEodGVzdHNbaV0ucmVzdWx0LCB2YWx1ZS0+VG9GbG9hdCgpKQorICAgICAgICA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtOworICB9Cit9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBESVNBQkxFRF9SYXRlKSB7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgic2ltcGxlX3hmYS5wZGYiKSk7CisKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBwcm9ncmFtOworICAgIGZsb2F0IHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0ge3siUmF0ZSgxMjAwMCwgODAwMCwgNSkiLCAwLjA4NDQ3MTc3MTJmfSwKKyAgICAgICAgICAgICAgIHsiUmF0ZSgxMDAwMCwgMC4yNSAqIDUwMDAsIDQgKiAxMikiLCAwLjA0NDI3Mzc4MjQzZn19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNOdW1iZXIoKSk7CisgICAgRVhQRUNUX0ZMT0FUX0VRKHRlc3RzW2ldLnJlc3VsdCwgdmFsdWUtPlRvRmxvYXQoKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbTsKKyAgfQorfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgVGVybSkgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogcHJvZ3JhbTsKKyAgICBmbG9hdCByZXN1bHQ7CisgIH0gdGVzdHNbXSA9IHsvLyB7IlRlcm0oNDc1LCAuMDUsIDE1MDApIiwgMy4wMDQ3NzUxNzcyOGZ9LAorICAgICAgICAgICAgICAgeyJUZXJtKDI1MDAsIDAuMDI3NSArIDAuMDAyNSwgNTAwMCkiLCAxLjk3MTI4Nzg2MzY5Zn19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNOdW1iZXIoKSk7CisgICAgRVhQRUNUX0ZMT0FUX0VRKHRlc3RzW2ldLnJlc3VsdCwgdmFsdWUtPlRvRmxvYXQoKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbTsKKyAgfQorfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgQ2hvb3NlKSB7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgic2ltcGxlX3hmYS5wZGYiKSk7CisKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBwcm9ncmFtOworICAgIGNvbnN0IGNoYXIqIHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0geworICAgICAgeyJDaG9vc2UoMywgXCJUYXhlc1wiLCBcIlByaWNlXCIsIFwiUGVyc29uXCIsIFwiVGVsbGVyXCIpIiwgIlBlcnNvbiJ9LAorICAgICAgeyJDaG9vc2UoMiwgMTAsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDEpIiwgIjkifSwKKyAgICAgIHsiQ2hvb3NlKDIwLzMsIFwiQVwiLCBcIkJcIiwgXCJDXCIsIFwiRFwiLCBcIkVcIiwgXCJGXCIsIFwiR1wiLCBcIkhcIikiLAorICAgICAgICJGIn19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNTdHJpbmcoKSk7CisgICAgRVhQRUNUX1NUUkVRKHRlc3RzW2ldLnJlc3VsdCwgdmFsdWUtPlRvU3RyaW5nKCkuY19zdHIoKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbSA8PCAiIFJlc3VsdDogJyIKKyAgICAgICAgPDwgdmFsdWUtPlRvU3RyaW5nKCkuY19zdHIoKSA8PCAiJyI7CisgIH0KK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIEV4aXN0cykgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIEVYUEVDVF9UUlVFKEV4ZWN1dGUoIkV4aXN0cyhcImhlbGxvIHdvcmxkXCIpIikpOworICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgRVhQRUNUX1RSVUUodmFsdWUtPklzSW50ZWdlcigpKTsKKyAgRVhQRUNUX0ZBTFNFKHZhbHVlLT5Ub0Jvb2xlYW4oKSk7Cit9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBIYXNWYWx1ZSkgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogcHJvZ3JhbTsKKyAgICBib29sIHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0ge3siSGFzVmFsdWUoMikiLCB0cnVlfSwgeyJIYXNWYWx1ZShcIiBcIikiLCBmYWxzZX19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNJbnRlZ2VyKCkpIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW07CisgICAgRVhQRUNUX0VRKHRlc3RzW2ldLnJlc3VsdCwgdmFsdWUtPlRvQm9vbGVhbigpKQorICAgICAgICA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtOworICB9Cit9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBPbmVvZikgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogcHJvZ3JhbTsKKyAgICBib29sIHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0geworICAgICAgeyJPbmVvZigzLCAxMCwgOSwgOCwgNywgNiwgNSwgNCwgMywgMiwgMSkiLCB0cnVlfSwKKyAgICAgIHsiT25lb2YoXCJKb2huXCIsIFwiQmlsbFwiLCBcIkdhcnlcIiwgXCJKb2FuXCIsIFwiSm9oblwiLCBcIkxpc2FcIikiLAorICAgICAgIHRydWV9LAorICAgICAgeyJPbmVvZigzLCAxLCAyNSkiLCBmYWxzZX0sCisgICAgICB7Ik9uZW9mKDMsIDMsIG51bGwpIiwgdHJ1ZX0sCisgICAgICB7Ik9uZW9mKDMsIG51bGwsIG51bGwpIiwgZmFsc2V9LAorICB9OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNJbnRlZ2VyKCkpIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW07CisgICAgRVhQRUNUX0VRKHRlc3RzW2ldLnJlc3VsdCwgdmFsdWUtPlRvQm9vbGVhbigpKQorICAgICAgICA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtOworICB9Cit9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBXaXRoaW4pIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgYm9vbCByZXN1bHQ7CisgIH0gdGVzdHNbXSA9IHt7IldpdGhpbihcIkNcIiwgXCJBXCIsIFwiRFwiKSIsIHRydWV9LAorICAgICAgICAgICAgICAgeyJXaXRoaW4oMS41LCAwLCAyKSIsIHRydWV9LAorICAgICAgICAgICAgICAgeyJXaXRoaW4oLTEsIDAsIDIpIiwgZmFsc2V9fTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzSW50ZWdlcigpKSA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtOworICAgIEVYUEVDVF9FUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub0Jvb2xlYW4oKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbTsKKyAgfQorfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgRElTQUJMRURfRXZhbCkgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogcHJvZ3JhbTsKKyAgICBpbnQgcmVzdWx0OworICB9IHRlc3RzW10gPSB7eyJldmFsKFwiMTAqMys1KjRcIikiLCA1MH19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNJbnRlZ2VyKCkpOworICAgIEVYUEVDVF9FUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub0ludGVnZXIoKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbTsKKyAgfQorfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgRElTQUJMRURfTnVsbCkgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogcHJvZ3JhbTsKKyAgICBjb25zdCBjaGFyKiByZXN1bHQ7CisgIH0gdGVzdHNbXSA9IHt7Ik51bGwoKSIsICJudWxsIn0sCisgICAgICAgICAgICAgICB7IkNvbmNhdChcIkFCQ1wiLCBOdWxsKCksIFwiREVGXCIpIiwgIkFCQ0RFRiJ9fTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzU3RyaW5nKCkpOworICAgIEVYUEVDVF9TVFJFUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkpCisgICAgICAgIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW0gPDwgIiBSZXN1bHQ6ICciCisgICAgICAgIDw8IHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkgPDwgIiciOworICB9CisKKyAgRVhQRUNUX1RSVUUoRXhlY3V0ZSgiTnVsbCgpICsgNSIpKTsKKworICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgRVhQRUNUX1RSVUUodmFsdWUtPklzSW50ZWdlcigpKTsKKyAgRVhQRUNUX0VRKDUsIHZhbHVlLT5Ub0ludGVnZXIoKSk7Cit9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBSZWYpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgY29uc3QgY2hhciogcmVzdWx0OworICB9IHRlc3RzW10gPSB7eyJSZWYoXCIxMCozKzUqNFwiKSIsICIxMCozKzUqNCJ9LCB7IlJlZihcImhlbGxvXCIpIiwgImhlbGxvIn19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNTdHJpbmcoKSk7CisgICAgRVhQRUNUX1NUUkVRKHRlc3RzW2ldLnJlc3VsdCwgdmFsdWUtPlRvU3RyaW5nKCkuY19zdHIoKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbSA8PCAiIFJlc3VsdDogJyIKKyAgICAgICAgPDwgdmFsdWUtPlRvU3RyaW5nKCkuY19zdHIoKSA8PCAiJyI7CisgIH0KK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIFVuaXRUeXBlKSB7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgic2ltcGxlX3hmYS5wZGYiKSk7CisKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBwcm9ncmFtOworICAgIGNvbnN0IGNoYXIqIHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0ge3siVW5pdFR5cGUoXCIzNiBpblwiKSIsICJpbiJ9LAorICAgICAgICAgICAgICAgeyJVbml0VHlwZShcIjIuNTRjZW50aW1ldGVyc1wiKSIsICJjbSJ9LAorICAgICAgICAgICAgICAgeyJVbml0VHlwZShcInBpY2FzXCIpIiwgInB0In0sCisgICAgICAgICAgICAgICB7IlVuaXRUeXBlKFwiMi5jbVwiKSIsICJjbSJ9LAorICAgICAgICAgICAgICAgeyJVbml0VHlwZShcIjIuemVybyBjbVwiKSIsICJpbiJ9LAorICAgICAgICAgICAgICAgeyJVbml0VHlwZShcImtpbG9tZXRlcnNcIikiLCAiaW4ifX07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBFWFBFQ1RfVFJVRShFeGVjdXRlKHRlc3RzW2ldLnByb2dyYW0pKTsKKworICAgIENGWEpTRV9WYWx1ZSogdmFsdWUgPSBHZXRWYWx1ZSgpOworICAgIEVYUEVDVF9UUlVFKHZhbHVlLT5Jc1N0cmluZygpKTsKKyAgICBFWFBFQ1RfU1RSRVEodGVzdHNbaV0ucmVzdWx0LCB2YWx1ZS0+VG9TdHJpbmcoKS5jX3N0cigpKQorICAgICAgICA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtIDw8ICIgUmVzdWx0OiAnIgorICAgICAgICA8PCB2YWx1ZS0+VG9TdHJpbmcoKS5jX3N0cigpIDw8ICInIjsKKyAgfQorfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgVW5pdFZhbHVlKSB7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgic2ltcGxlX3hmYS5wZGYiKSk7CisKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBwcm9ncmFtOworICAgIGZsb2F0IHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0geworICAgICAgeyJVbml0VmFsdWUoXCIyaW5cIikiLCAyLjBmfSwgeyJVbml0VmFsdWUoXCIyaW5cIiwgXCJjbVwiKSIsIDUuMDhmfSwKKyAgICAgIC8vIHsiVW5pdFZhbHVlKFwiNlwiLCBcInB0XCIpIiwgNDMyZn0sCisgICAgICAvLyB7IlVuaXRUeXBlKFwiQVwiLCBcImNtXCIpIiwgMC4wZn0sCisgICAgICAvLyB7IlVuaXRUeXBlKFwiNS4wOGNtXCIsIFwia2lsb2dyYW1zXCIpIiwgMi4wZn0KKyAgfTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzTnVtYmVyKCkpOworICAgIEVYUEVDVF9GTE9BVF9FUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub0Zsb2F0KCkpCisgICAgICAgIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW07CisgIH0KK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIEF0KSB7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgic2ltcGxlX3hmYS5wZGYiKSk7CisKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBwcm9ncmFtOworICAgIGludCByZXN1bHQ7CisgIH0gdGVzdHNbXSA9IHt7IkF0KFwiQUJDREVGR0hcIiwgXCJBQlwiKSIsIDF9LAorICAgICAgICAgICAgICAgeyJBdChcIkFCQ0RFRkdIXCIsIFwiRlwiKSIsIDZ9LAorICAgICAgICAgICAgICAgeyJBdCgyMzQxMjkzMTI5ODQ3MSwgMjkpIiwgNX19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNJbnRlZ2VyKCkpOworICAgIEVYUEVDVF9FUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub0ludGVnZXIoKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbTsKKyAgfQorfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgQ29uY2F0KSB7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgic2ltcGxlX3hmYS5wZGYiKSk7CisKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBwcm9ncmFtOworICAgIGNvbnN0IGNoYXIqIHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0ge3siQ29uY2F0KFwiQUJDXCIsIFwiREVGXCIpIiwgIkFCQ0RFRiJ9LAorICAgICAgICAgICAgICAgeyJDb25jYXQoXCJUb255XCIsIFNwYWNlKDEpLCBcIkJsdWVcIikiLCAiVG9ueSBCbHVlIn0sCisgICAgICAgICAgICAgICB7IkNvbmNhdChcIllvdSBvd2UgXCIsIFdvcmROdW0oMTE1NC42NywgMiksIFwiLlwiKSIsCisgICAgICAgICAgICAgICAgIllvdSBvd2UgT25lIFRob3VzYW5kIE9uZSBIdW5kcmVkIEZpZnR5LWZvdXIgRG9sbGFycyBBbmQgIgorICAgICAgICAgICAgICAgICJTaXh0eS1zZXZlbiBDZW50cy4ifX07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBFWFBFQ1RfVFJVRShFeGVjdXRlKHRlc3RzW2ldLnByb2dyYW0pKTsKKworICAgIENGWEpTRV9WYWx1ZSogdmFsdWUgPSBHZXRWYWx1ZSgpOworICAgIEVYUEVDVF9UUlVFKHZhbHVlLT5Jc1N0cmluZygpKTsKKyAgICBFWFBFQ1RfU1RSRVEodGVzdHNbaV0ucmVzdWx0LCB2YWx1ZS0+VG9TdHJpbmcoKS5jX3N0cigpKQorICAgICAgICA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtIDw8ICIgUmVzdWx0OiAnIgorICAgICAgICA8PCB2YWx1ZS0+VG9TdHJpbmcoKS5jX3N0cigpIDw8ICInIjsKKyAgfQorfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgRGVjb2RlKSB7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgic2ltcGxlX3hmYS5wZGYiKSk7CisKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBwcm9ncmFtOworICAgIGNvbnN0IGNoYXIqIHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0geworICAgICAgeyJEZWNvZGUoXCImQUVsaWc7JkFhY3V0ZTsmQWNpcmM7JkFhY3V0ZTsmQWNpcmM7XCIsIFwiaHRtbFwiKSIsICLDhsOBw4LDgcOCIn0sCisgICAgICAvLyB7IkRlY29kZShcIn4hQCMkJSVeJmFtcDsqKClfK3xgeyZxdW90O31bXSZsdDsmZ3Q7PywuLzsmYXBvczs6XCIsICIKKyAgICAgIC8vICAiXCJ4bWxcIikiLAorICAgICAgLy8gICJ+IUAjJCUlXiYqKClfK3xgeyIKKyAgICAgIC8vICAifVtdPD4/LC4vOyc6In0KKyAgfTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzU3RyaW5nKCkpOworICAgIEVYUEVDVF9TVFJFUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkpCisgICAgICAgIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW0gPDwgIiBSZXN1bHQ6ICciCisgICAgICAgIDw8IHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkgPDwgIiciOworICB9Cit9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBESVNBQkxFRF9FbmNvZGUpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgY29uc3QgY2hhciogcmVzdWx0OworICB9IHRlc3RzW10gPSB7CisgICAgICB7IkVuY29kZShcIlwiXCJoZWxsbywgd29ybGQhXCJcIlwiLCBcInVybFwiKSIsCisgICAgICAgIiUlMjJoZWxsbywlJTIwd29ybGQhJSUyMiJ9LAorICAgICAgeyJFbmNvZGUoXCLDgcOCw4PDhMOFw4ZcIiwgXCJodG1sXCIpIiwgIiYjeGMxOyYjWGMyOyYjWGMzOyYjeGM0OyYjeGM1OyYjeGM2OyJ9fTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzU3RyaW5nKCkpOworICAgIEVYUEVDVF9TVFJFUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkpCisgICAgICAgIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW0gPDwgIiBSZXN1bHQ6ICciCisgICAgICAgIDw8IHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkgPDwgIiciOworICB9Cit9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBESVNBQkxFRF9Gb3JtYXQpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgY29uc3QgY2hhciogcmVzdWx0OworICB9IHRlc3RzW10gPSB7eyJGb3JtYXQoXCJNTU0gRCwgWVlZWVwiLCBcIjIwMDIwOTAxXCIpIiwgIlNlcCAxLCAyMDAyIn0sCisgICAgICAgICAgICAgICB7IkZvcm1hdChcIiQ5LDk5OSw5OTkuOTlcIiwgMTIzNDU2Ny44OSkiLCAiJDEsMjM0LDU2Ny44OSJ9fTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzU3RyaW5nKCkpOworICAgIEVYUEVDVF9TVFJFUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkpCisgICAgICAgIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW0gPDwgIiBSZXN1bHQ6ICciCisgICAgICAgIDw8IHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkgPDwgIiciOworICB9Cit9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBMZWZ0KSB7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgic2ltcGxlX3hmYS5wZGYiKSk7CisKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBwcm9ncmFtOworICAgIGNvbnN0IGNoYXIqIHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0ge3siTGVmdChcIkFCQ0RFRkdIXCIsIDMpIiwgIkFCQyJ9LAorICAgICAgICAgICAgICAgeyJMZWZ0KFwiVG9ueSBCbHVlXCIsIDUpIiwgIlRvbnkgIn19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNTdHJpbmcoKSk7CisgICAgRVhQRUNUX1NUUkVRKHRlc3RzW2ldLnJlc3VsdCwgdmFsdWUtPlRvU3RyaW5nKCkuY19zdHIoKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbSA8PCAiIFJlc3VsdDogJyIKKyAgICAgICAgPDwgdmFsdWUtPlRvU3RyaW5nKCkuY19zdHIoKSA8PCAiJyI7CisgIH0KK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIExlbikgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogcHJvZ3JhbTsKKyAgICBpbnQgcmVzdWx0OworICB9IHRlc3RzW10gPSB7CisgICAgICB7IkxlbihcIkFCQ0RFRkdIXCIpIiwgOH0sIHsiTGVuKDQpIiwgMX0sIHsiTGVuKFN0cig0LjUzMiwgNiwgNCkpIiwgNn19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNJbnRlZ2VyKCkpOworICAgIEVYUEVDVF9FUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub0ludGVnZXIoKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbTsKKyAgfQorfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgTG93ZXIpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgY29uc3QgY2hhciogcmVzdWx0OworICB9IHRlc3RzW10gPSB7eyJMb3dlcihcIkFCQ1wiKSIsICJhYmMifSwKKyAgICAgICAgICAgICAgIHsiTG93ZXIoXCIyMSBNYWluIFN0LlwiKSIsICIyMSBtYWluIHN0LiJ9LAorICAgICAgICAgICAgICAgeyJMb3dlcigxNSkiLCAiMTUifX07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBFWFBFQ1RfVFJVRShFeGVjdXRlKHRlc3RzW2ldLnByb2dyYW0pKTsKKworICAgIENGWEpTRV9WYWx1ZSogdmFsdWUgPSBHZXRWYWx1ZSgpOworICAgIEVYUEVDVF9UUlVFKHZhbHVlLT5Jc1N0cmluZygpKTsKKyAgICBFWFBFQ1RfU1RSRVEodGVzdHNbaV0ucmVzdWx0LCB2YWx1ZS0+VG9TdHJpbmcoKS5jX3N0cigpKQorICAgICAgICA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtIDw8ICIgUmVzdWx0OiAnIgorICAgICAgICA8PCB2YWx1ZS0+VG9TdHJpbmcoKS5jX3N0cigpIDw8ICInIjsKKyAgfQorfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgTHRyaW0pIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgY29uc3QgY2hhciogcmVzdWx0OworICB9IHRlc3RzW10gPSB7eyJMdHJpbShcIiAgIEFCQ0RcIikiLCAiQUJDRCJ9LAorICAgICAgICAgICAgICAgeyJMdHJpbShSdHJpbShcIiAgICBUb255IEJsdWUgICAgXCIpKSIsICJUb255IEJsdWUifX07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBFWFBFQ1RfVFJVRShFeGVjdXRlKHRlc3RzW2ldLnByb2dyYW0pKTsKKworICAgIENGWEpTRV9WYWx1ZSogdmFsdWUgPSBHZXRWYWx1ZSgpOworICAgIEVYUEVDVF9UUlVFKHZhbHVlLT5Jc1N0cmluZygpKTsKKyAgICBFWFBFQ1RfU1RSRVEodGVzdHNbaV0ucmVzdWx0LCB2YWx1ZS0+VG9TdHJpbmcoKS5jX3N0cigpKQorICAgICAgICA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtIDw8ICIgUmVzdWx0OiAnIgorICAgICAgICA8PCB2YWx1ZS0+VG9TdHJpbmcoKS5jX3N0cigpIDw8ICInIjsKKyAgfQorfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgRElTQUJMRURfUGFyc2UpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgY29uc3QgY2hhciogcmVzdWx0OworICB9IHRlc3RzW10gPSB7eyJQYXJzZShcIk1NTSBELCBZWVlZXCIsIFwiU2VwIDEsIDIwMDJcIikiLCAiMjAwMi0wOS0wMSJ9fTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzU3RyaW5nKCkpOworICAgIEVYUEVDVF9TVFJFUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkpCisgICAgICAgIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW0gPDwgIiBSZXN1bHQ6ICciCisgICAgICAgIDw8IHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkgPDwgIiciOworICB9CisKKyAgRVhQRUNUX1RSVUUoRXhlY3V0ZSgiUGFyc2UoXCIkOSw5OTksOTk5Ljk5XCIsIFwiJDEsMjM0LDU2Ny44OVwiKSIpKTsKKyAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgIEVYUEVDVF9UUlVFKHZhbHVlLT5Jc051bWJlcigpKTsKKyAgRVhQRUNUX0ZMT0FUX0VRKDEyMzQ1NjcuODlmLCB2YWx1ZS0+VG9GbG9hdCgpKTsKK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIFJlcGxhY2UpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgY29uc3QgY2hhciogcmVzdWx0OworICB9IHRlc3RzW10gPSB7eyJSZXBsYWNlKFwiVG9ueSBCbHVlXCIsIFwiVG9ueVwiLCBcIkNocmlzXCIpIiwgIkNocmlzIEJsdWUifSwKKyAgICAgICAgICAgICAgIHsiUmVwbGFjZShcIkFCQ0RFRkdIXCIsIFwiRFwiKSIsICJBQkNFRkdIIn0sCisgICAgICAgICAgICAgICB7IlJlcGxhY2UoXCJBQkNERUZHSFwiLCBcImRcIikiLCAiQUJDREVGR0gifX07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBFWFBFQ1RfVFJVRShFeGVjdXRlKHRlc3RzW2ldLnByb2dyYW0pKTsKKworICAgIENGWEpTRV9WYWx1ZSogdmFsdWUgPSBHZXRWYWx1ZSgpOworICAgIEVYUEVDVF9UUlVFKHZhbHVlLT5Jc1N0cmluZygpKTsKKyAgICBFWFBFQ1RfU1RSRVEodGVzdHNbaV0ucmVzdWx0LCB2YWx1ZS0+VG9TdHJpbmcoKS5jX3N0cigpKQorICAgICAgICA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtIDw8ICIgUmVzdWx0OiAnIgorICAgICAgICA8PCB2YWx1ZS0+VG9TdHJpbmcoKS5jX3N0cigpIDw8ICInIjsKKyAgfQorfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgUmlnaHQpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgY29uc3QgY2hhciogcmVzdWx0OworICB9IHRlc3RzW10gPSB7eyJSaWdodChcIkFCQ0RFRkdIXCIsIDMpIiwgIkZHSCJ9LAorICAgICAgICAgICAgICAgeyJSaWdodChcIlRvbnkgQmx1ZVwiLCA1KSIsICIgQmx1ZSJ9fTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzU3RyaW5nKCkpOworICAgIEVYUEVDVF9TVFJFUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkpCisgICAgICAgIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW0gPDwgIiBSZXN1bHQ6ICciCisgICAgICAgIDw8IHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkgPDwgIiciOworICB9Cit9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBSdHJpbSkgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciogcHJvZ3JhbTsKKyAgICBjb25zdCBjaGFyKiByZXN1bHQ7CisgIH0gdGVzdHNbXSA9IHt7IlJ0cmltKFwiQUJDRCAgIFwiKSIsICJBQkNEIn0sCisgICAgICAgICAgICAgICB7IlJ0cmltKFwiVG9ueSBCbHVlICAgICAgXHRcIikiLCAiVG9ueSBCbHVlIn19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNTdHJpbmcoKSk7CisgICAgRVhQRUNUX1NUUkVRKHRlc3RzW2ldLnJlc3VsdCwgdmFsdWUtPlRvU3RyaW5nKCkuY19zdHIoKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbSA8PCAiIFJlc3VsdDogJyIKKyAgICAgICAgPDwgdmFsdWUtPlRvU3RyaW5nKCkuY19zdHIoKSA8PCAiJyI7CisgIH0KK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIFNwYWNlKSB7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgic2ltcGxlX3hmYS5wZGYiKSk7CisKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBwcm9ncmFtOworICAgIGNvbnN0IGNoYXIqIHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0ge3siU3BhY2UoNSkiLCAiICAgICAifSwKKyAgICAgICAgICAgICAgIHsiQ29uY2F0KFwiVG9ueVwiLCBTcGFjZSgxKSwgXCJCbHVlXCIpIiwgIlRvbnkgQmx1ZSJ9fTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzU3RyaW5nKCkpOworICAgIEVYUEVDVF9TVFJFUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkpCisgICAgICAgIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW0gPDwgIiBSZXN1bHQ6ICciCisgICAgICAgIDw8IHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkgPDwgIiciOworICB9Cit9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBTdHIpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgY29uc3QgY2hhciogcmVzdWx0OworICB9IHRlc3RzW10gPSB7eyJTdHIoMi40NTYpIiwgIiAgICAgICAgIDIifSwKKyAgICAgICAgICAgICAgIHsiU3RyKDQuNTMyLCA2LCA0KSIsICI0LjUzMjAifSwKKyAgICAgICAgICAgICAgIHsiU3RyKDIzNC40NTgsIDQpIiwgIiAyMzQifSwKKyAgICAgICAgICAgICAgIHsiU3RyKDMxLjIzNDUsIDQsIDIpIiwgIioqKioifX07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBFWFBFQ1RfVFJVRShFeGVjdXRlKHRlc3RzW2ldLnByb2dyYW0pKTsKKworICAgIENGWEpTRV9WYWx1ZSogdmFsdWUgPSBHZXRWYWx1ZSgpOworICAgIEVYUEVDVF9UUlVFKHZhbHVlLT5Jc1N0cmluZygpKTsKKyAgICBFWFBFQ1RfU1RSRVEodGVzdHNbaV0ucmVzdWx0LCB2YWx1ZS0+VG9TdHJpbmcoKS5jX3N0cigpKQorICAgICAgICA8PCAiUHJvZ3JhbTogIiA8PCB0ZXN0c1tpXS5wcm9ncmFtIDw8ICIgUmVzdWx0OiAnIgorICAgICAgICA8PCB2YWx1ZS0+VG9TdHJpbmcoKS5jX3N0cigpIDw8ICInIjsKKyAgfQorfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgU3R1ZmYpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgY29uc3QgY2hhciogcmVzdWx0OworICB9IHRlc3RzW10gPSB7eyJTdHVmZihcIlRvbnlCbHVlXCIsIDUsIDAsIFwiIFwiKSIsICJUb255IEJsdWUifSwKKyAgICAgICAgICAgICAgIHsiU3R1ZmYoXCJBQkNERUZHSFwiLCA0LCAyKSIsICJBQkNGR0gifSwKKyAgICAgICAgICAgICAgIHsiU3R1ZmYoXCJtZW1iZXJzLWxpc3RAbXl3ZWIuY29tXCIsIDAsIDAsIFwiY2M6XCIpIiwKKyAgICAgICAgICAgICAgICAiY2M6bWVtYmVycy1saXN0QG15d2ViLmNvbSJ9fTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzU3RyaW5nKCkpOworICAgIEVYUEVDVF9TVFJFUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkpCisgICAgICAgIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW0gPDwgIiBSZXN1bHQ6ICciCisgICAgICAgIDw8IHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkgPDwgIiciOworICB9Cit9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBTdWJzdHIpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgY29uc3QgY2hhciogcmVzdWx0OworICB9IHRlc3RzW10gPSB7eyJTdWJzdHIoXCJBQkNERUZHXCIsIDMsIDQpIiwgIkNERUYifSwKKyAgICAgICAgICAgICAgIHsiU3Vic3RyKDMyMTQsIDIsIDEpIiwgIjIifSwKKyAgICAgICAgICAgICAgIHsiU3Vic3RyKFwiQUJDREVGR1wiLCA1LCAwKSIsICIifSwKKyAgICAgICAgICAgICAgIHsiU3Vic3RyKFwiMjEgV2F0ZXJsb28gU3QuXCIsIDQsIDUpIiwgIldhdGVyIn19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNTdHJpbmcoKSk7CisgICAgRVhQRUNUX1NUUkVRKHRlc3RzW2ldLnJlc3VsdCwgdmFsdWUtPlRvU3RyaW5nKCkuY19zdHIoKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbSA8PCAiIFJlc3VsdDogJyIKKyAgICAgICAgPDwgdmFsdWUtPlRvU3RyaW5nKCkuY19zdHIoKSA8PCAiJyI7CisgIH0KK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIFV1aWQpIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBFWFBFQ1RfVFJVRShFeGVjdXRlKCJVdWlkKCkiKSk7CisKKyAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgIEVYUEVDVF9UUlVFKHZhbHVlLT5Jc1N0cmluZygpKTsKK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIFVwcGVyKSB7CisgIEFTU0VSVF9UUlVFKE9wZW5Eb2N1bWVudCgic2ltcGxlX3hmYS5wZGYiKSk7CisKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyKiBwcm9ncmFtOworICAgIGNvbnN0IGNoYXIqIHJlc3VsdDsKKyAgfSB0ZXN0c1tdID0ge3siVXBwZXIoXCJhYmNcIikiLCAiQUJDIn0sCisgICAgICAgICAgICAgICB7IlVwcGVyKFwiMjEgTWFpbiBTdC5cIikiLCAiMjEgTUFJTiBTVC4ifSwKKyAgICAgICAgICAgICAgIHsiVXBwZXIoMTUpIiwgIjE1In19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoRXhlY3V0ZSh0ZXN0c1tpXS5wcm9ncmFtKSk7CisKKyAgICBDRlhKU0VfVmFsdWUqIHZhbHVlID0gR2V0VmFsdWUoKTsKKyAgICBFWFBFQ1RfVFJVRSh2YWx1ZS0+SXNTdHJpbmcoKSk7CisgICAgRVhQRUNUX1NUUkVRKHRlc3RzW2ldLnJlc3VsdCwgdmFsdWUtPlRvU3RyaW5nKCkuY19zdHIoKSkKKyAgICAgICAgPDwgIlByb2dyYW06ICIgPDwgdGVzdHNbaV0ucHJvZ3JhbSA8PCAiIFJlc3VsdDogJyIKKyAgICAgICAgPDwgdmFsdWUtPlRvU3RyaW5nKCkuY19zdHIoKSA8PCAiJyI7CisgIH0KK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIFdvcmROdW0pIHsKKyAgQVNTRVJUX1RSVUUoT3BlbkRvY3VtZW50KCJzaW1wbGVfeGZhLnBkZiIpKTsKKworICBzdHJ1Y3QgeworICAgIGNvbnN0IGNoYXIqIHByb2dyYW07CisgICAgY29uc3QgY2hhciogcmVzdWx0OworICB9IHRlc3RzW10gPSB7CisgICAgICAvLyB7IldvcmROdW0oMTIzLjQ1KSIsCisgICAgICAvLyAgIk9uZSBIdW5kcmVkIGFuZCBUd2VudHktdGhyZWUifSwgIC8vIFRoaXMgbG9va3MgbGlrZSBpdCdzIHdyb25nIGluIHRoZQorICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3JtY2FsYyBkb2N1bWVudC4KKyAgICAgIC8vIHsiV29yZE51bSgxMjMuNDUsIDEpIiwgIk9uZSBIdW5kcmVkIGFuZCBUd2VudHktdGhyZWUgRG9sbGFycyJ9LAorICAgICAgeyJXb3JkTnVtKDExNTQuNjcsIDIpIiwKKyAgICAgICAiT25lIFRob3VzYW5kIE9uZSBIdW5kcmVkIEZpZnR5LWZvdXIgRG9sbGFycyBBbmQgU2l4dHktc2V2ZW4gQ2VudHMifSwKKyAgICAgIHsiV29yZE51bSg0MywgMikiLCAiRm9ydHktdGhyZWUgRG9sbGFycyBBbmQgWmVybyBDZW50cyJ9fTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKEV4ZWN1dGUodGVzdHNbaV0ucHJvZ3JhbSkpOworCisgICAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9IEdldFZhbHVlKCk7CisgICAgRVhQRUNUX1RSVUUodmFsdWUtPklzU3RyaW5nKCkpOworICAgIEVYUEVDVF9TVFJFUSh0ZXN0c1tpXS5yZXN1bHQsIHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkpCisgICAgICAgIDw8ICJQcm9ncmFtOiAiIDw8IHRlc3RzW2ldLnByb2dyYW0gPDwgIiBSZXN1bHQ6ICciCisgICAgICAgIDw8IHZhbHVlLT5Ub1N0cmluZygpLmNfc3RyKCkgPDwgIiciOworICB9Cit9CisKK1RFU1RfRihDRlhKU0VfRm9ybUNhbGNDb250ZXh0RW1iZWRkZXJUZXN0LCBHZXQpIHsKKyAgLy8gVE9ETyhkc2luY2xhaXIpOiBJcyB0aGlzIHN1cHBvcnRlZD8KK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIFBvc3QpIHsKKyAgLy8gVE9ETyhkc2luY2xhaXIpOiBJcyB0aGlzIHN1cHBvcnRlZD8KK30KKworVEVTVF9GKENGWEpTRV9Gb3JtQ2FsY0NvbnRleHRFbWJlZGRlclRlc3QsIFB1dCkgeworICAvLyBUT0RPKGRzaW5jbGFpcik6IElzIHRoaXMgc3VwcG9ydGVkPworfQorCitURVNUX0YoQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dEVtYmVkZGVyVGVzdCwgSW52YWxpZEZ1bmN0aW9ucykgeworICBBU1NFUlRfVFJVRShPcGVuRG9jdW1lbnQoInNpbXBsZV94ZmEucGRmIikpOworCisgIGNvbnN0IGNoYXIqIGNvbnN0IHRlc3RzW10gPSB7CisgICAgICAiRigpIiwgIigpIiwgIigpKCkoKSIsICJSb3VuZCgyLjApKCkiLAorICB9OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX0ZBTFNFKEV4ZWN1dGVTaWxlbmNlRmFpbHVyZSh0ZXN0c1tpXSkpOworICB9Cit9CmRpZmYgLS1naXQgYS9meGpzL2NmeGpzZV9pc29sYXRldHJhY2tlci5jcHAgYi9meGpzL2NmeGpzZV9pc29sYXRldHJhY2tlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZDQxNTguLjAwMDAwMDAKLS0tIGEvZnhqcy9jZnhqc2VfaXNvbGF0ZXRyYWNrZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiZnhqcy9jZnhqc2VfaXNvbGF0ZXRyYWNrZXIuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi1DRlhKU0VfSXNvbGF0ZVRyYWNrZXI6OkNGWEpTRV9Jc29sYXRlVHJhY2tlcigpIHt9Ci0KLUNGWEpTRV9Jc29sYXRlVHJhY2tlcjo6fkNGWEpTRV9Jc29sYXRlVHJhY2tlcigpIHt9Ci0KLXZvaWQgQ0ZYSlNFX0lzb2xhdGVUcmFja2VyOjpBcHBlbmQoCi0gICAgdjg6Oklzb2xhdGUqIHBJc29sYXRlLAotICAgIHN0ZDo6dW5pcXVlX3B0cjx2ODo6QXJyYXlCdWZmZXI6OkFsbG9jYXRvcj4gYWxsb2MpIHsKLSAgbV9Pd25lZElzb2xhdGVzLnB1c2hfYmFjayhwSXNvbGF0ZSk7Ci0gIG1fQWxsb2NhdG9yTWFwW3BJc29sYXRlXSA9IHN0ZDo6bW92ZShhbGxvYyk7Ci19Ci0KLXZvaWQgQ0ZYSlNFX0lzb2xhdGVUcmFja2VyOjpSZW1vdmUoCi0gICAgdjg6Oklzb2xhdGUqIHBJc29sYXRlLAotICAgIENGWEpTRV9Jc29sYXRlVHJhY2tlcjo6RGlzcG9zZUNhbGxiYWNrIGxwZm5EaXNwb3NlQ2FsbGJhY2spIHsKLSAgYXV0byBpdCA9IHN0ZDo6ZmluZChtX093bmVkSXNvbGF0ZXMuYmVnaW4oKSwgbV9Pd25lZElzb2xhdGVzLmVuZCgpLCBwSXNvbGF0ZSk7Ci0gIGJvb2wgYkZvdW5kID0gaXQgIT0gbV9Pd25lZElzb2xhdGVzLmVuZCgpOwotICBpZiAoYkZvdW5kKQotICAgIG1fT3duZWRJc29sYXRlcy5lcmFzZShpdCk7Ci0gIGxwZm5EaXNwb3NlQ2FsbGJhY2socElzb2xhdGUsIGJGb3VuZCk7Ci0KLSAgbV9BbGxvY2F0b3JNYXAuZXJhc2UocElzb2xhdGUpOwotfQotCi12b2lkIENGWEpTRV9Jc29sYXRlVHJhY2tlcjo6UmVtb3ZlQWxsKAotICAgIENGWEpTRV9Jc29sYXRlVHJhY2tlcjo6RGlzcG9zZUNhbGxiYWNrIGxwZm5EaXNwb3NlQ2FsbGJhY2spIHsKLSAgZm9yICh2ODo6SXNvbGF0ZSogcElzb2xhdGUgOiBtX093bmVkSXNvbGF0ZXMpCi0gICAgbHBmbkRpc3Bvc2VDYWxsYmFjayhwSXNvbGF0ZSwgdHJ1ZSk7Ci0KLSAgbV9Pd25lZElzb2xhdGVzLmNsZWFyKCk7Ci0gIG1fQWxsb2NhdG9yTWFwLmNsZWFyKCk7Ci19CmRpZmYgLS1naXQgYS9meGpzL2NmeGpzZV9pc29sYXRldHJhY2tlci5oIGIvZnhqcy9jZnhqc2VfaXNvbGF0ZXRyYWNrZXIuaAppbmRleCA1MzQwZDliLi4yYmIxNmNhIDEwMDY0NAotLS0gYS9meGpzL2NmeGpzZV9pc29sYXRldHJhY2tlci5oCisrKyBiL2Z4anMvY2Z4anNlX2lzb2xhdGV0cmFja2VyLmgKQEAgLTUyLDI0ICs1Miw0IEBACiAgIHY4OjpDb250ZXh0OjpTY29wZSBtX2NzY29wZTsKIH07CiAKLWNsYXNzIENGWEpTRV9Jc29sYXRlVHJhY2tlciB7Ci0gcHVibGljOgotICB0eXBlZGVmIHZvaWQgKCpEaXNwb3NlQ2FsbGJhY2spKHY4OjpJc29sYXRlKiwgYm9vbCBiT3duZWRJc29sYXRlKTsKLQotICBDRlhKU0VfSXNvbGF0ZVRyYWNrZXIoKTsKLSAgfkNGWEpTRV9Jc29sYXRlVHJhY2tlcigpOwotCi0gIHZvaWQgQXBwZW5kKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKLSAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHY4OjpBcnJheUJ1ZmZlcjo6QWxsb2NhdG9yPiBhbGxvYyk7Ci0gIHZvaWQgUmVtb3ZlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwgRGlzcG9zZUNhbGxiYWNrIGxwZm5EaXNwb3NlQ2FsbGJhY2spOwotICB2b2lkIFJlbW92ZUFsbChEaXNwb3NlQ2FsbGJhY2sgbHBmbkRpc3Bvc2VDYWxsYmFjayk7Ci0KLSAgc3RhdGljIENGWEpTRV9Jc29sYXRlVHJhY2tlciogZ19wSW5zdGFuY2U7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHN0ZDo6dmVjdG9yPHY4OjpJc29sYXRlKj4gbV9Pd25lZElzb2xhdGVzOwotICBzdGQ6Om1hcDx2ODo6SXNvbGF0ZSosIHN0ZDo6dW5pcXVlX3B0cjx2ODo6QXJyYXlCdWZmZXI6OkFsbG9jYXRvcj4+Ci0gICAgICBtX0FsbG9jYXRvck1hcDsKLX07Ci0KICNlbmRpZiAgLy8gRlhKU19DRlhKU0VfSVNPTEFURVRSQUNLRVJfSF8KZGlmZiAtLWdpdCBhL2Z4anMvY2Z4anNlX3Jlc29sdmVwcm9jZXNzb3IuY3BwIGIvZnhqcy9jZnhqc2VfcmVzb2x2ZXByb2Nlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhMDgzOAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2Z4anNlX3Jlc29sdmVwcm9jZXNzb3IuY3BwCkBAIC0wLDAgKzEsNzQ2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV9yZXNvbHZlcHJvY2Vzc29yLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgImZ4anMvY2Z4anNlX2VuZ2luZS5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9vYmplY3QuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxlbWdyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGVoZWxwZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vYmplY3QuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vY2N1ci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfcmVzb2x2ZW5vZGVfcnMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX3V0aWxzLmgiCisKK0NGWEpTRV9SZXNvbHZlUHJvY2Vzc29yOjpDRlhKU0VfUmVzb2x2ZVByb2Nlc3NvcigpCisgICAgOiBtX2lDdXJTdGFydCgwKSwgbV9wTm9kZUhlbHBlcihwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Ob2RlSGVscGVyPigpKSB7fQorCitDRlhKU0VfUmVzb2x2ZVByb2Nlc3Nvcjo6fkNGWEpTRV9SZXNvbHZlUHJvY2Vzc29yKCkge30KKworYm9vbCBDRlhKU0VfUmVzb2x2ZVByb2Nlc3Nvcjo6UmVzb2x2ZShDRlhKU0VfUmVzb2x2ZU5vZGVEYXRhJiBybmQpIHsKKyAgaWYgKCFybmQubV9DdXJPYmplY3QpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICghcm5kLm1fQ3VyT2JqZWN0LT5Jc05vZGUoKSkgeworICAgIGlmIChybmQubV9kd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzKSB7CisgICAgICByZXR1cm4gUmVzb2x2ZUZvckF0dHJpYnV0ZVJzKHJuZC5tX0N1ck9iamVjdCwgcm5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybmQubV93c05hbWUuQXNTdHJpbmdWaWV3KCkpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKHJuZC5tX2R3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0FueUNoaWxkKQorICAgIHJldHVybiBSZXNvbHZlQW55Q2hpbGQocm5kKTsKKworICBpZiAocm5kLm1fd3NOYW1lLkdldExlbmd0aCgpKSB7CisgICAgd2NoYXJfdCB3Y2ggPSBybmQubV93c05hbWVbMF07CisgICAgc3dpdGNoICh3Y2gpIHsKKyAgICAgIGNhc2UgJyQnOgorICAgICAgICByZXR1cm4gUmVzb2x2ZURvbGxhcihybmQpOworICAgICAgY2FzZSAnISc6CisgICAgICAgIHJldHVybiBSZXNvbHZlRXhjYWxtYXRvcnkocm5kKTsKKyAgICAgIGNhc2UgJyMnOgorICAgICAgICByZXR1cm4gUmVzb2x2ZU51bWJlclNpZ24ocm5kKTsKKyAgICAgIGNhc2UgJyonOgorICAgICAgICByZXR1cm4gUmVzb2x2ZUFzdGVyaXNrKHJuZCk7CisgICAgICAvLyBUT0RPKGRzaW5jbGFpcik6IFdlIGNvdWxkIHByb2JhYmx5IHJlbW92ZSB0aGlzLgorICAgICAgY2FzZSAnLic6CisgICAgICAgIHJldHVybiBSZXNvbHZlQW55Q2hpbGQocm5kKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAocm5kLm1fdUhhc2hOYW1lID09IFhGQV9IQVNIQ09ERV9UaGlzICYmIHJuZC5tX25MZXZlbCA9PSAwKSB7CisgICAgcm5kLm1fT2JqZWN0cy5wdXNoX2JhY2socm5kLm1fcFNDLT5HZXRUaGlzT2JqZWN0KCkpOworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChybmQubV9DdXJPYmplY3QtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlhmYSkgeworICAgIENYRkFfT2JqZWN0KiBwT2JqTm9kZSA9CisgICAgICAgIHJuZC5tX3BTQy0+R2V0RG9jdW1lbnQoKS0+R2V0WEZBT2JqZWN0KHJuZC5tX3VIYXNoTmFtZSk7CisgICAgaWYgKHBPYmpOb2RlKSB7CisgICAgICBybmQubV9PYmplY3RzLnB1c2hfYmFjayhwT2JqTm9kZSk7CisgICAgfSBlbHNlIGlmIChybmQubV91SGFzaE5hbWUgPT0gWEZBX0hBU0hDT0RFX1hmYSkgeworICAgICAgcm5kLm1fT2JqZWN0cy5wdXNoX2JhY2socm5kLm1fQ3VyT2JqZWN0KTsKKyAgICB9IGVsc2UgaWYgKChybmQubV9kd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzKSAmJgorICAgICAgICAgICAgICAgUmVzb2x2ZUZvckF0dHJpYnV0ZVJzKHJuZC5tX0N1ck9iamVjdCwgcm5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZC5tX3dzTmFtZS5Bc1N0cmluZ1ZpZXcoKSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoIXJuZC5tX09iamVjdHMuZW1wdHkoKSkKKyAgICAgIEZpbHRlckNvbmRpdGlvbihybmQsIHJuZC5tX3dzQ29uZGl0aW9uKTsKKworICAgIHJldHVybiAhcm5kLm1fT2JqZWN0cy5lbXB0eSgpOworICB9CisgIGlmICghUmVzb2x2ZU5vcm1hbChybmQpICYmIHJuZC5tX3VIYXNoTmFtZSA9PSBYRkFfSEFTSENPREVfWGZhKQorICAgIHJuZC5tX09iamVjdHMucHVzaF9iYWNrKHJuZC5tX3BTQy0+R2V0RG9jdW1lbnQoKS0+R2V0Um9vdCgpKTsKKworICByZXR1cm4gIXJuZC5tX09iamVjdHMuZW1wdHkoKTsKK30KKworYm9vbCBDRlhKU0VfUmVzb2x2ZVByb2Nlc3Nvcjo6UmVzb2x2ZUFueUNoaWxkKENGWEpTRV9SZXNvbHZlTm9kZURhdGEmIHJuZCkgeworICBXaWRlU3RyaW5nIHdzTmFtZSA9IHJuZC5tX3dzTmFtZTsKKyAgV2lkZVN0cmluZyB3c0NvbmRpdGlvbiA9IHJuZC5tX3dzQ29uZGl0aW9uOworICBDWEZBX05vZGUqIGZpbmROb2RlID0gbnVsbHB0cjsKKyAgYm9vbCBiQ2xhc3NOYW1lID0gZmFsc2U7CisgIGlmICh3c05hbWUuR2V0TGVuZ3RoKCkgJiYgd3NOYW1lWzBdID09ICcjJykgeworICAgIGJDbGFzc05hbWUgPSB0cnVlOworICAgIHdzTmFtZSA9IHdzTmFtZS5SaWdodCh3c05hbWUuR2V0TGVuZ3RoKCkgLSAxKTsKKyAgfQorICBmaW5kTm9kZSA9IG1fcE5vZGVIZWxwZXItPlJlc29sdmVOb2Rlc19HZXRPbmVDaGlsZCgKKyAgICAgIFRvTm9kZShybmQubV9DdXJPYmplY3QpLCB3c05hbWUuY19zdHIoKSwgYkNsYXNzTmFtZSk7CisgIGlmICghZmluZE5vZGUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICh3c0NvbmRpdGlvbi5Jc0VtcHR5KCkpIHsKKyAgICBybmQubV9PYmplY3RzLnB1c2hfYmFjayhmaW5kTm9kZSk7CisgICAgcmV0dXJuICFybmQubV9PYmplY3RzLmVtcHR5KCk7CisgIH0KKworICBzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPiB0ZW1wTm9kZXM7CisgIGZvciAoYXV0byogcE9iamVjdCA6IHJuZC5tX09iamVjdHMpCisgICAgdGVtcE5vZGVzLnB1c2hfYmFjayhwT2JqZWN0LT5Bc05vZGUoKSk7CisgIG1fcE5vZGVIZWxwZXItPkNvdW50U2libGluZ3MoZmluZE5vZGUsIFhGQV9MT0dJQ19UcmFuc3BhcmVudCwgJnRlbXBOb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2xhc3NOYW1lKTsKKyAgcm5kLm1fT2JqZWN0cyA9IHN0ZDo6dmVjdG9yPENYRkFfT2JqZWN0Kj4odGVtcE5vZGVzLmJlZ2luKCksIHRlbXBOb2Rlcy5lbmQoKSk7CisgIEZpbHRlckNvbmRpdGlvbihybmQsIHdzQ29uZGl0aW9uKTsKKyAgcmV0dXJuICFybmQubV9PYmplY3RzLmVtcHR5KCk7Cit9CisKK2Jvb2wgQ0ZYSlNFX1Jlc29sdmVQcm9jZXNzb3I6OlJlc29sdmVEb2xsYXIoQ0ZYSlNFX1Jlc29sdmVOb2RlRGF0YSYgcm5kKSB7CisgIFdpZGVTdHJpbmcgd3NOYW1lID0gcm5kLm1fd3NOYW1lOworICBXaWRlU3RyaW5nIHdzQ29uZGl0aW9uID0gcm5kLm1fd3NDb25kaXRpb247CisgIGludDMyX3QgaU5hbWVMZW4gPSB3c05hbWUuR2V0TGVuZ3RoKCk7CisgIGlmIChpTmFtZUxlbiA9PSAxKSB7CisgICAgcm5kLm1fT2JqZWN0cy5wdXNoX2JhY2socm5kLm1fQ3VyT2JqZWN0KTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAocm5kLm1fbkxldmVsID4gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgWEZBX0hhc2hDb2RlIGR3TmFtZUhhc2ggPSBzdGF0aWNfY2FzdDxYRkFfSGFzaENvZGU+KEZYX0hhc2hDb2RlX0dldFcoCisgICAgICBXaWRlU3RyaW5nVmlldyh3c05hbWUuY19zdHIoKSArIDEsIGlOYW1lTGVuIC0gMSksIGZhbHNlKSk7CisgIGlmIChkd05hbWVIYXNoID09IFhGQV9IQVNIQ09ERV9YZmEpIHsKKyAgICBybmQubV9PYmplY3RzLnB1c2hfYmFjayhybmQubV9wU0MtPkdldERvY3VtZW50KCktPkdldFJvb3QoKSk7CisgIH0gZWxzZSB7CisgICAgQ1hGQV9PYmplY3QqIHBPYmpOb2RlID0gcm5kLm1fcFNDLT5HZXREb2N1bWVudCgpLT5HZXRYRkFPYmplY3QoZHdOYW1lSGFzaCk7CisgICAgaWYgKHBPYmpOb2RlKQorICAgICAgcm5kLm1fT2JqZWN0cy5wdXNoX2JhY2socE9iak5vZGUpOworICB9CisgIGlmICghcm5kLm1fT2JqZWN0cy5lbXB0eSgpKQorICAgIEZpbHRlckNvbmRpdGlvbihybmQsIHdzQ29uZGl0aW9uKTsKKworICByZXR1cm4gIXJuZC5tX09iamVjdHMuZW1wdHkoKTsKK30KKworYm9vbCBDRlhKU0VfUmVzb2x2ZVByb2Nlc3Nvcjo6UmVzb2x2ZUV4Y2FsbWF0b3J5KENGWEpTRV9SZXNvbHZlTm9kZURhdGEmIHJuZCkgeworICBpZiAocm5kLm1fbkxldmVsID4gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQ1hGQV9Ob2RlKiBkYXRhc2V0cyA9CisgICAgICBUb05vZGUocm5kLm1fcFNDLT5HZXREb2N1bWVudCgpLT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0RhdGFzZXRzKSk7CisgIGlmICghZGF0YXNldHMpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENGWEpTRV9SZXNvbHZlTm9kZURhdGEgcm5kRmluZChybmQubV9wU0MpOworICBybmRGaW5kLm1fQ3VyT2JqZWN0ID0gZGF0YXNldHM7CisgIHJuZEZpbmQubV93c05hbWUgPSBybmQubV93c05hbWUuUmlnaHQocm5kLm1fd3NOYW1lLkdldExlbmd0aCgpIC0gMSk7CisgIHJuZEZpbmQubV91SGFzaE5hbWUgPSBzdGF0aWNfY2FzdDxYRkFfSGFzaENvZGU+KAorICAgICAgRlhfSGFzaENvZGVfR2V0VyhybmRGaW5kLm1fd3NOYW1lLkFzU3RyaW5nVmlldygpLCBmYWxzZSkpOworICBybmRGaW5kLm1fbkxldmVsID0gcm5kLm1fbkxldmVsICsgMTsKKyAgcm5kRmluZC5tX2R3U3R5bGVzID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuOworICBybmRGaW5kLm1fd3NDb25kaXRpb24gPSBybmQubV93c0NvbmRpdGlvbjsKKyAgUmVzb2x2ZShybmRGaW5kKTsKKworICBybmQubV9PYmplY3RzLmluc2VydChybmQubV9PYmplY3RzLmVuZCgpLCBybmRGaW5kLm1fT2JqZWN0cy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICBybmRGaW5kLm1fT2JqZWN0cy5lbmQoKSk7CisgIHJldHVybiAhcm5kLm1fT2JqZWN0cy5lbXB0eSgpOworfQorCitib29sIENGWEpTRV9SZXNvbHZlUHJvY2Vzc29yOjpSZXNvbHZlTnVtYmVyU2lnbihDRlhKU0VfUmVzb2x2ZU5vZGVEYXRhJiBybmQpIHsKKyAgV2lkZVN0cmluZyB3c05hbWUgPSBybmQubV93c05hbWUuUmlnaHQocm5kLm1fd3NOYW1lLkdldExlbmd0aCgpIC0gMSk7CisgIFdpZGVTdHJpbmcgd3NDb25kaXRpb24gPSBybmQubV93c0NvbmRpdGlvbjsKKyAgQ1hGQV9Ob2RlKiBjdXJOb2RlID0gVG9Ob2RlKHJuZC5tX0N1ck9iamVjdCk7CisgIGlmIChSZXNvbHZlRm9yQXR0cmlidXRlUnMoY3VyTm9kZSwgcm5kLCB3c05hbWUuQXNTdHJpbmdWaWV3KCkpKQorICAgIHJldHVybiB0cnVlOworCisgIENGWEpTRV9SZXNvbHZlTm9kZURhdGEgcm5kRmluZChybmQubV9wU0MpOworICBybmRGaW5kLm1fbkxldmVsID0gcm5kLm1fbkxldmVsICsgMTsKKyAgcm5kRmluZC5tX2R3U3R5bGVzID0gcm5kLm1fZHdTdHlsZXM7CisgIHJuZEZpbmQubV9kd1N0eWxlcyB8PSBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZTsKKyAgcm5kRmluZC5tX2R3U3R5bGVzICY9IH5YRkFfUkVTT0xWRU5PREVfQXR0cmlidXRlczsKKyAgcm5kRmluZC5tX3dzTmFtZSA9IHdzTmFtZTsKKyAgcm5kRmluZC5tX3VIYXNoTmFtZSA9IHN0YXRpY19jYXN0PFhGQV9IYXNoQ29kZT4oCisgICAgICBGWF9IYXNoQ29kZV9HZXRXKHJuZEZpbmQubV93c05hbWUuQXNTdHJpbmdWaWV3KCksIGZhbHNlKSk7CisgIHJuZEZpbmQubV93c0NvbmRpdGlvbiA9IHdzQ29uZGl0aW9uOworICBybmRGaW5kLm1fQ3VyT2JqZWN0ID0gY3VyTm9kZTsKKyAgUmVzb2x2ZU5vcm1hbChybmRGaW5kKTsKKyAgaWYgKHJuZEZpbmQubV9PYmplY3RzLmVtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmICh3c0NvbmRpdGlvbi5HZXRMZW5ndGgoKSA9PSAwICYmCisgICAgICBwZGZpdW06OkNvbnRhaW5zVmFsdWUocm5kRmluZC5tX09iamVjdHMsIGN1ck5vZGUpKSB7CisgICAgcm5kLm1fT2JqZWN0cy5wdXNoX2JhY2soY3VyTm9kZSk7CisgIH0gZWxzZSB7CisgICAgcm5kLm1fT2JqZWN0cy5pbnNlcnQocm5kLm1fT2JqZWN0cy5lbmQoKSwgcm5kRmluZC5tX09iamVjdHMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBybmRGaW5kLm1fT2JqZWN0cy5lbmQoKSk7CisgIH0KKyAgcmV0dXJuICFybmQubV9PYmplY3RzLmVtcHR5KCk7Cit9CisKK2Jvb2wgQ0ZYSlNFX1Jlc29sdmVQcm9jZXNzb3I6OlJlc29sdmVGb3JBdHRyaWJ1dGVScygKKyAgICBDWEZBX09iamVjdCogY3VyTm9kZSwKKyAgICBDRlhKU0VfUmVzb2x2ZU5vZGVEYXRhJiBybmQsCisgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHN0ckF0dHIpIHsKKyAgY29uc3QgWEZBX1NDUklQVEFUVFJJQlVURUlORk8qIGxwU2NyaXB0QXR0cmlidXRlID0KKyAgICAgIFhGQV9HZXRTY3JpcHRBdHRyaWJ1dGVCeU5hbWUoY3VyTm9kZS0+R2V0RWxlbWVudFR5cGUoKSwgc3RyQXR0cik7CisgIGlmICghbHBTY3JpcHRBdHRyaWJ1dGUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJuZC5tX3BTY3JpcHRBdHRyaWJ1dGUgPSBscFNjcmlwdEF0dHJpYnV0ZTsKKyAgcm5kLm1fT2JqZWN0cy5wdXNoX2JhY2soY3VyTm9kZSk7CisgIHJuZC5tX2R3RmxhZyA9IFhGQV9SZXNvbHZlTm9kZV9SU1R5cGVfQXR0cmlidXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDRlhKU0VfUmVzb2x2ZVByb2Nlc3Nvcjo6UmVzb2x2ZU5vcm1hbChDRlhKU0VfUmVzb2x2ZU5vZGVEYXRhJiBybmQpIHsKKyAgaWYgKHJuZC5tX25MZXZlbCA+IDMyIHx8ICFybmQubV9DdXJPYmplY3QtPklzTm9kZSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBDWEZBX05vZGUqIGN1ck5vZGUgPSBybmQubV9DdXJPYmplY3QtPkFzTm9kZSgpOworICBzaXplX3Qgbk51bSA9IHJuZC5tX09iamVjdHMuc2l6ZSgpOworICB1aW50MzJfdCBkd1N0eWxlcyA9IHJuZC5tX2R3U3R5bGVzOworICBXaWRlU3RyaW5nJiB3c05hbWUgPSBybmQubV93c05hbWU7CisgIFhGQV9IYXNoQ29kZSB1TmFtZUhhc2ggPSBybmQubV91SGFzaE5hbWU7CisgIFdpZGVTdHJpbmcmIHdzQ29uZGl0aW9uID0gcm5kLm1fd3NDb25kaXRpb247CisKKyAgQ0ZYSlNFX1Jlc29sdmVOb2RlRGF0YSBybmRGaW5kKHJuZC5tX3BTQyk7CisgIHJuZEZpbmQubV93c05hbWUgPSBybmQubV93c05hbWU7CisgIHJuZEZpbmQubV93c0NvbmRpdGlvbiA9IHJuZC5tX3dzQ29uZGl0aW9uOworICBybmRGaW5kLm1fbkxldmVsID0gcm5kLm1fbkxldmVsICsgMTsKKyAgcm5kRmluZC5tX3VIYXNoTmFtZSA9IHVOYW1lSGFzaDsKKworICBzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPiBjaGlsZHJlbjsKKyAgc3RkOjp2ZWN0b3I8Q1hGQV9Ob2RlKj4gcHJvcGVydGllczsKKyAgQ1hGQV9Ob2RlKiBwVmFyaWFibGVzTm9kZSA9IG51bGxwdHI7CisgIENYRkFfTm9kZSogcFBhZ2VTZXROb2RlID0gbnVsbHB0cjsKKyAgZm9yIChDWEZBX05vZGUqIHBDaGlsZCA9IGN1ck5vZGUtPkdldEZpcnN0Q2hpbGQoKTsgcENoaWxkOworICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+R2V0TmV4dFNpYmxpbmcoKSkgeworICAgIGlmIChwQ2hpbGQtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlZhcmlhYmxlcykgeworICAgICAgcFZhcmlhYmxlc05vZGUgPSBwQ2hpbGQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHBDaGlsZC0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6UGFnZVNldCkgeworICAgICAgcFBhZ2VTZXROb2RlID0gcENoaWxkOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChjdXJOb2RlLT5IYXNQcm9wZXJ0eShwQ2hpbGQtPkdldEVsZW1lbnRUeXBlKCkpKQorICAgICAgcHJvcGVydGllcy5wdXNoX2JhY2socENoaWxkKTsKKyAgICBlbHNlCisgICAgICBjaGlsZHJlbi5wdXNoX2JhY2socENoaWxkKTsKKyAgfQorICBpZiAoKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMpICYmIHBWYXJpYWJsZXNOb2RlKSB7CisgICAgaWYgKHBWYXJpYWJsZXNOb2RlLT5HZXRDbGFzc0hhc2hDb2RlKCkgPT0gdU5hbWVIYXNoKSB7CisgICAgICBybmQubV9PYmplY3RzLnB1c2hfYmFjayhwVmFyaWFibGVzTm9kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJuZEZpbmQubV9DdXJPYmplY3QgPSBwVmFyaWFibGVzTm9kZTsKKyAgICAgIFNldFN0eWxlc0ZvckNoaWxkKGR3U3R5bGVzLCBybmRGaW5kKTsKKyAgICAgIFdpZGVTdHJpbmcgd3NTYXZlQ29uZGl0aW9uID0gcm5kRmluZC5tX3dzQ29uZGl0aW9uOworICAgICAgcm5kRmluZC5tX3dzQ29uZGl0aW9uLmNsZWFyKCk7CisgICAgICBSZXNvbHZlTm9ybWFsKHJuZEZpbmQpOworICAgICAgcm5kRmluZC5tX3dzQ29uZGl0aW9uID0gd3NTYXZlQ29uZGl0aW9uOworICAgICAgcm5kLm1fT2JqZWN0cy5pbnNlcnQocm5kLm1fT2JqZWN0cy5lbmQoKSwgcm5kRmluZC5tX09iamVjdHMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZEZpbmQubV9PYmplY3RzLmVuZCgpKTsKKyAgICAgIHJuZEZpbmQubV9PYmplY3RzLmNsZWFyKCk7CisgICAgfQorICAgIGlmIChybmQubV9PYmplY3RzLnNpemUoKSA+IG5OdW0pIHsKKyAgICAgIEZpbHRlckNvbmRpdGlvbihybmQsIHdzQ29uZGl0aW9uKTsKKyAgICAgIHJldHVybiAhcm5kLm1fT2JqZWN0cy5lbXB0eSgpOworICAgIH0KKyAgfQorCisgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbikgeworICAgIGJvb2wgYlNldEZsYWcgPSBmYWxzZTsKKyAgICBpZiAocFBhZ2VTZXROb2RlICYmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzKSkKKyAgICAgIGNoaWxkcmVuLnB1c2hfYmFjayhwUGFnZVNldE5vZGUpOworCisgICAgZm9yIChDWEZBX05vZGUqIGNoaWxkIDogY2hpbGRyZW4pIHsKKyAgICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lKSB7CisgICAgICAgIGlmIChjaGlsZC0+R2V0Q2xhc3NIYXNoQ29kZSgpID09IHVOYW1lSGFzaCkKKyAgICAgICAgICBybmQubV9PYmplY3RzLnB1c2hfYmFjayhjaGlsZCk7CisgICAgICB9IGVsc2UgaWYgKGNoaWxkLT5HZXROYW1lSGFzaCgpID09IHVOYW1lSGFzaCkgeworICAgICAgICBybmQubV9PYmplY3RzLnB1c2hfYmFjayhjaGlsZCk7CisgICAgICB9CisKKyAgICAgIGlmIChtX3BOb2RlSGVscGVyLT5Ob2RlSXNUcmFuc3BhcmVudChjaGlsZCkgJiYKKyAgICAgICAgICBjaGlsZC0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6UGFnZVNldCkgeworICAgICAgICBpZiAoIWJTZXRGbGFnKSB7CisgICAgICAgICAgU2V0U3R5bGVzRm9yQ2hpbGQoZHdTdHlsZXMsIHJuZEZpbmQpOworICAgICAgICAgIGJTZXRGbGFnID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBybmRGaW5kLm1fQ3VyT2JqZWN0ID0gY2hpbGQ7CisKKyAgICAgICAgV2lkZVN0cmluZyB3c1NhdmVDb25kaXRpb24gPSBybmRGaW5kLm1fd3NDb25kaXRpb247CisgICAgICAgIHJuZEZpbmQubV93c0NvbmRpdGlvbi5jbGVhcigpOworICAgICAgICBSZXNvbHZlTm9ybWFsKHJuZEZpbmQpOworCisgICAgICAgIHJuZEZpbmQubV93c0NvbmRpdGlvbiA9IHdzU2F2ZUNvbmRpdGlvbjsKKyAgICAgICAgcm5kLm1fT2JqZWN0cy5pbnNlcnQocm5kLm1fT2JqZWN0cy5lbmQoKSwgcm5kRmluZC5tX09iamVjdHMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kRmluZC5tX09iamVjdHMuZW5kKCkpOworICAgICAgICBybmRGaW5kLm1fT2JqZWN0cy5jbGVhcigpOworICAgICAgfQorICAgIH0KKyAgICBpZiAocm5kLm1fT2JqZWN0cy5zaXplKCkgPiBuTnVtKSB7CisgICAgICBpZiAoIShkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9BTEwpKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+IHVwQXJyYXlOb2RlczsKKyAgICAgICAgaWYgKG1fcE5vZGVIZWxwZXItPk5vZGVJc1RyYW5zcGFyZW50KFRvTm9kZShjdXJOb2RlKSkpIHsKKyAgICAgICAgICBtX3BOb2RlSGVscGVyLT5Db3VudFNpYmxpbmdzKFRvTm9kZShybmQubV9PYmplY3RzWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MT0dJQ19UcmFuc3BhcmVudCwgJnVwQXJyYXlOb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEhKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1RhZ05hbWUpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodXBBcnJheU5vZGVzLnNpemUoKSA+IHJuZC5tX09iamVjdHMuc2l6ZSgpKSB7CisgICAgICAgICAgQ1hGQV9PYmplY3QqIHBTYXZlT2JqZWN0ID0gcm5kLm1fT2JqZWN0cy5mcm9udCgpOworICAgICAgICAgIHJuZC5tX09iamVjdHMgPSBzdGQ6OnZlY3RvcjxDWEZBX09iamVjdCo+KHVwQXJyYXlOb2Rlcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwQXJyYXlOb2Rlcy5lbmQoKSk7CisgICAgICAgICAgcm5kLm1fT2JqZWN0cy5mcm9udCgpID0gcFNhdmVPYmplY3Q7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEZpbHRlckNvbmRpdGlvbihybmQsIHdzQ29uZGl0aW9uKTsKKyAgICAgIHJldHVybiAhcm5kLm1fT2JqZWN0cy5lbXB0eSgpOworICAgIH0KKyAgfQorICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQXR0cmlidXRlcykgeworICAgIGlmIChSZXNvbHZlRm9yQXR0cmlidXRlUnMoY3VyTm9kZSwgcm5kLCB3c05hbWUuQXNTdHJpbmdWaWV3KCkpKQorICAgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMpIHsKKyAgICBmb3IgKENYRkFfTm9kZSogcENoaWxkUHJvcGVydHkgOiBwcm9wZXJ0aWVzKSB7CisgICAgICBpZiAocENoaWxkUHJvcGVydHktPklzVW5uYW1lZCgpKSB7CisgICAgICAgIGlmIChwQ2hpbGRQcm9wZXJ0eS0+R2V0Q2xhc3NIYXNoQ29kZSgpID09IHVOYW1lSGFzaCkKKyAgICAgICAgICBybmQubV9PYmplY3RzLnB1c2hfYmFjayhwQ2hpbGRQcm9wZXJ0eSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKHBDaGlsZFByb3BlcnR5LT5HZXROYW1lSGFzaCgpID09IHVOYW1lSGFzaCAmJgorICAgICAgICAgIHBDaGlsZFByb3BlcnR5LT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpFeHRyYXMgJiYKKyAgICAgICAgICBwQ2hpbGRQcm9wZXJ0eS0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6SXRlbXMpIHsKKyAgICAgICAgcm5kLm1fT2JqZWN0cy5wdXNoX2JhY2socENoaWxkUHJvcGVydHkpOworICAgICAgfQorICAgIH0KKyAgICBpZiAocm5kLm1fT2JqZWN0cy5zaXplKCkgPiBuTnVtKSB7CisgICAgICBGaWx0ZXJDb25kaXRpb24ocm5kLCB3c0NvbmRpdGlvbik7CisgICAgICByZXR1cm4gIXJuZC5tX09iamVjdHMuZW1wdHkoKTsKKyAgICB9CisKKyAgICBDWEZBX05vZGUqIHBQcm9wID0gbnVsbHB0cjsKKyAgICBpZiAoWEZBX0VsZW1lbnQ6OlN1YmZvcm0gPT0gY3VyTm9kZS0+R2V0RWxlbWVudFR5cGUoKSAmJgorICAgICAgICBYRkFfSEFTSENPREVfT2NjdXIgPT0gdU5hbWVIYXNoKSB7CisgICAgICBDWEZBX05vZGUqIHBJbnN0YW5jZU1hbmFnZXIgPQorICAgICAgICAgIGN1ck5vZGUtPkFzTm9kZSgpLT5HZXRJbnN0YW5jZU1nck9mU3ViZm9ybSgpOworICAgICAgaWYgKHBJbnN0YW5jZU1hbmFnZXIpIHsKKyAgICAgICAgcFByb3AgPSBwSW5zdGFuY2VNYW5hZ2VyLT5KU09iamVjdCgpLT5HZXRPckNyZWF0ZVByb3BlcnR5PENYRkFfT2NjdXI+KAorICAgICAgICAgICAgMCwgWEZBX0VsZW1lbnQ6Ok9jY3VyKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgWEZBX0VsZW1lbnQgZVR5cGUgPSBDWEZBX05vZGU6Ok5hbWVUb0VsZW1lbnQod3NOYW1lKTsKKyAgICAgIGlmIChlVHlwZSA9PSBYRkFfRWxlbWVudDo6UGFnZVNldCkgeworICAgICAgICBwUHJvcCA9IGN1ck5vZGUtPkFzTm9kZSgpLT5KU09iamVjdCgpLT5HZXRQcm9wZXJ0eTxDWEZBX05vZGU+KDAsIGVUeXBlKTsKKyAgICAgIH0gZWxzZSBpZiAoZVR5cGUgIT0gWEZBX0VsZW1lbnQ6OlVua25vd24pIHsKKyAgICAgICAgcFByb3AgPSBjdXJOb2RlLT5Bc05vZGUoKS0+SlNPYmplY3QoKS0+R2V0T3JDcmVhdGVQcm9wZXJ0eTxDWEZBX05vZGU+KAorICAgICAgICAgICAgMCwgZVR5cGUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAocFByb3ApIHsKKyAgICAgIHJuZC5tX09iamVjdHMucHVzaF9iYWNrKHBQcm9wKTsKKyAgICAgIHJldHVybiAhcm5kLm1fT2JqZWN0cy5lbXB0eSgpOworICAgIH0KKyAgfQorCisgIENYRkFfTm9kZSogcGFyZW50Tm9kZSA9IG1fcE5vZGVIZWxwZXItPlJlc29sdmVOb2Rlc19HZXRQYXJlbnQoCisgICAgICBjdXJOb2RlLT5Bc05vZGUoKSwgWEZBX0xPR0lDX05vVHJhbnNwYXJlbnQpOworICB1aW50MzJfdCB1Q3VyQ2xhc3NIYXNoID0gY3VyTm9kZS0+R2V0Q2xhc3NIYXNoQ29kZSgpOworICBpZiAoIXBhcmVudE5vZGUpIHsKKyAgICBpZiAodUN1ckNsYXNzSGFzaCA9PSB1TmFtZUhhc2gpIHsKKyAgICAgIHJuZC5tX09iamVjdHMucHVzaF9iYWNrKGN1ck5vZGUtPkFzTm9kZSgpKTsKKyAgICAgIEZpbHRlckNvbmRpdGlvbihybmQsIHdzQ29uZGl0aW9uKTsKKyAgICAgIGlmICghcm5kLm1fT2JqZWN0cy5lbXB0eSgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzKSB7CisgICAgQ1hGQV9Ob2RlKiBjaGlsZCA9IHBhcmVudE5vZGUtPkdldEZpcnN0Q2hpbGQoKTsKKyAgICB1aW50MzJfdCBkd1N1YlN0eWxlcyA9CisgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzOworICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lKQorICAgICAgZHdTdWJTdHlsZXMgfD0gWEZBX1JFU09MVkVOT0RFX1RhZ05hbWU7CisgICAgaWYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0FMTCkKKyAgICAgIGR3U3ViU3R5bGVzIHw9IFhGQV9SRVNPTFZFTk9ERV9BTEw7CisKKyAgICBybmRGaW5kLm1fZHdTdHlsZXMgPSBkd1N1YlN0eWxlczsKKyAgICB3aGlsZSAoY2hpbGQpIHsKKyAgICAgIGlmIChjaGlsZCA9PSBjdXJOb2RlKSB7CisgICAgICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lKSB7CisgICAgICAgICAgaWYgKHVDdXJDbGFzc0hhc2ggPT0gdU5hbWVIYXNoKQorICAgICAgICAgICAgcm5kLm1fT2JqZWN0cy5wdXNoX2JhY2soY3VyTm9kZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGNoaWxkLT5HZXROYW1lSGFzaCgpID09IHVOYW1lSGFzaCkgeworICAgICAgICAgICAgcm5kLm1fT2JqZWN0cy5wdXNoX2JhY2soY3VyTm9kZSk7CisgICAgICAgICAgICBpZiAocm5kLm1fbkxldmVsID09IDAgJiYgd3NDb25kaXRpb24uR2V0TGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICBybmQubV9PYmplY3RzLmNsZWFyKCk7CisgICAgICAgICAgICAgIHJuZC5tX09iamVjdHMucHVzaF9iYWNrKGN1ck5vZGUpOworICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2hpbGQgPSBjaGlsZC0+R2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lKSB7CisgICAgICAgIGlmIChjaGlsZC0+R2V0Q2xhc3NIYXNoQ29kZSgpID09IHVOYW1lSGFzaCkKKyAgICAgICAgICBybmQubV9PYmplY3RzLnB1c2hfYmFjayhjaGlsZCk7CisgICAgICB9IGVsc2UgaWYgKGNoaWxkLT5HZXROYW1lSGFzaCgpID09IHVOYW1lSGFzaCkgeworICAgICAgICBybmQubV9PYmplY3RzLnB1c2hfYmFjayhjaGlsZCk7CisgICAgICB9CisKKyAgICAgIGJvb2wgYklubmVyU2VhcmNoID0gZmFsc2U7CisgICAgICBpZiAocGFyZW50Tm9kZS0+SGFzUHJvcGVydHkoY2hpbGQtPkdldEVsZW1lbnRUeXBlKCkpKSB7CisgICAgICAgIGlmICgoY2hpbGQtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlZhcmlhYmxlcyB8fAorICAgICAgICAgICAgIGNoaWxkLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpQYWdlU2V0KSkgeworICAgICAgICAgIGJJbm5lclNlYXJjaCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAobV9wTm9kZUhlbHBlci0+Tm9kZUlzVHJhbnNwYXJlbnQoY2hpbGQpKSB7CisgICAgICAgIGJJbm5lclNlYXJjaCA9IHRydWU7CisgICAgICB9CisgICAgICBpZiAoYklubmVyU2VhcmNoKSB7CisgICAgICAgIHJuZEZpbmQubV9DdXJPYmplY3QgPSBjaGlsZDsKKyAgICAgICAgV2lkZVN0cmluZyB3c09yaWdpbkNvbmRpdGlvbiA9IHJuZEZpbmQubV93c0NvbmRpdGlvbjsKKyAgICAgICAgcm5kRmluZC5tX3dzQ29uZGl0aW9uLmNsZWFyKCk7CisKKyAgICAgICAgdWludDMyX3QgZHdPcmlnaW5TdHlsZSA9IHJuZEZpbmQubV9kd1N0eWxlczsKKyAgICAgICAgcm5kRmluZC5tX2R3U3R5bGVzID0gZHdPcmlnaW5TdHlsZSB8IFhGQV9SRVNPTFZFTk9ERV9BTEw7CisgICAgICAgIFJlc29sdmVOb3JtYWwocm5kRmluZCk7CisKKyAgICAgICAgcm5kRmluZC5tX2R3U3R5bGVzID0gZHdPcmlnaW5TdHlsZTsKKyAgICAgICAgcm5kRmluZC5tX3dzQ29uZGl0aW9uID0gd3NPcmlnaW5Db25kaXRpb247CisgICAgICAgIHJuZC5tX09iamVjdHMuaW5zZXJ0KHJuZC5tX09iamVjdHMuZW5kKCksIHJuZEZpbmQubV9PYmplY3RzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZEZpbmQubV9PYmplY3RzLmVuZCgpKTsKKyAgICAgICAgcm5kRmluZC5tX09iamVjdHMuY2xlYXIoKTsKKyAgICAgIH0KKyAgICAgIGNoaWxkID0gY2hpbGQtPkdldE5leHRTaWJsaW5nKCk7CisgICAgfQorICAgIGlmIChybmQubV9PYmplY3RzLnNpemUoKSA+IG5OdW0pIHsKKyAgICAgIGlmIChtX3BOb2RlSGVscGVyLT5Ob2RlSXNUcmFuc3BhcmVudChwYXJlbnROb2RlKSkgeworICAgICAgICBzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPiB1cEFycmF5Tm9kZXM7CisgICAgICAgIG1fcE5vZGVIZWxwZXItPkNvdW50U2libGluZ3MoVG9Ob2RlKHJuZC5tX09iamVjdHMuZnJvbnQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0xPR0lDX1RyYW5zcGFyZW50LCAmdXBBcnJheU5vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEhKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1RhZ05hbWUpKTsKKyAgICAgICAgaWYgKHVwQXJyYXlOb2Rlcy5zaXplKCkgPiBybmQubV9PYmplY3RzLnNpemUoKSkgeworICAgICAgICAgIENYRkFfT2JqZWN0KiBwU2F2ZU9iamVjdCA9IHJuZC5tX09iamVjdHMuZnJvbnQoKTsKKyAgICAgICAgICBybmQubV9PYmplY3RzID0gc3RkOjp2ZWN0b3I8Q1hGQV9PYmplY3QqPih1cEFycmF5Tm9kZXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cEFycmF5Tm9kZXMuZW5kKCkpOworICAgICAgICAgIHJuZC5tX09iamVjdHMuZnJvbnQoKSA9IHBTYXZlT2JqZWN0OworICAgICAgICB9CisgICAgICB9CisgICAgICBGaWx0ZXJDb25kaXRpb24ocm5kLCB3c0NvbmRpdGlvbik7CisgICAgICByZXR1cm4gIXJuZC5tX09iamVjdHMuZW1wdHkoKTsKKyAgICB9CisgIH0KKworICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfUGFyZW50KSB7CisgICAgdWludDMyX3QgZHdTdWJTdHlsZXMgPSBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MgfCBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzOworICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lKQorICAgICAgZHdTdWJTdHlsZXMgfD0gWEZBX1JFU09MVkVOT0RFX1RhZ05hbWU7CisgICAgaWYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0FMTCkKKyAgICAgIGR3U3ViU3R5bGVzIHw9IFhGQV9SRVNPTFZFTk9ERV9BTEw7CisKKyAgICBybmRGaW5kLm1fZHdTdHlsZXMgPSBkd1N1YlN0eWxlczsKKyAgICBybmRGaW5kLm1fQ3VyT2JqZWN0ID0gcGFyZW50Tm9kZTsKKyAgICBybmQubV9wU0MtPkdldFVwT2JqZWN0QXJyYXkoKS0+cHVzaF9iYWNrKHBhcmVudE5vZGUpOworICAgIFJlc29sdmVOb3JtYWwocm5kRmluZCk7CisgICAgcm5kLm1fT2JqZWN0cy5pbnNlcnQocm5kLm1fT2JqZWN0cy5lbmQoKSwgcm5kRmluZC5tX09iamVjdHMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBybmRGaW5kLm1fT2JqZWN0cy5lbmQoKSk7CisgICAgcm5kRmluZC5tX09iamVjdHMuY2xlYXIoKTsKKyAgICBpZiAocm5kLm1fT2JqZWN0cy5zaXplKCkgPiBuTnVtKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENGWEpTRV9SZXNvbHZlUHJvY2Vzc29yOjpSZXNvbHZlQXN0ZXJpc2soQ0ZYSlNFX1Jlc29sdmVOb2RlRGF0YSYgcm5kKSB7CisgIENYRkFfTm9kZSogY3VyTm9kZSA9IFRvTm9kZShybmQubV9DdXJPYmplY3QpOworICBzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPiBhcnJheSA9CisgICAgICBjdXJOb2RlLT5HZXROb2RlTGlzdChYRkFfTk9ERUZJTFRFUl9DaGlsZHJlbiB8IFhGQV9OT0RFRklMVEVSX1Byb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6VW5rbm93bik7CisgIHJuZC5tX09iamVjdHMuaW5zZXJ0KHJuZC5tX09iamVjdHMuZW5kKCksIGFycmF5LmJlZ2luKCksIGFycmF5LmVuZCgpKTsKKyAgcmV0dXJuICFybmQubV9PYmplY3RzLmVtcHR5KCk7Cit9CisKK2ludDMyX3QgQ0ZYSlNFX1Jlc29sdmVQcm9jZXNzb3I6OkdldEZpbHRlcihjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9SZXNvbHZlTm9kZURhdGEmIHJuZCkgeworICBBU1NFUlQoblN0YXJ0ID4gLTEpOworCisgIGludDMyX3QgaUxlbmd0aCA9IHdzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKTsKKyAgaWYgKG5TdGFydCA+PSBpTGVuZ3RoKQorICAgIHJldHVybiAwOworCisgIFdpZGVTdHJpbmcmIHdzTmFtZSA9IHJuZC5tX3dzTmFtZTsKKyAgV2lkZVN0cmluZyYgd3NDb25kaXRpb24gPSBybmQubV93c0NvbmRpdGlvbjsKKyAgd2NoYXJfdCogcE5hbWVCdWYgPSB3c05hbWUuR2V0QnVmZmVyKGlMZW5ndGggLSBuU3RhcnQpOworICB3Y2hhcl90KiBwQ29uZGl0aW9uQnVmID0gd3NDb25kaXRpb24uR2V0QnVmZmVyKGlMZW5ndGggLSBuU3RhcnQpOworICBpbnQzMl90IG5OYW1lQ291bnQgPSAwOworICBpbnQzMl90IG5Db25kaXRpb25Db3VudCA9IDA7CisgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHN0YWNrOworICBpbnQzMl90IG5UeXBlID0gLTE7CisgIGNvbnN0IHdjaGFyX3QqIHBTcmMgPSB3c0V4cHJlc3Npb24udW50ZXJtaW5hdGVkX2Nfc3RyKCk7CisgIHdjaGFyX3Qgd1ByZXYgPSAwOworICB3Y2hhcl90IHdDdXI7CisgIGJvb2wgYklzQ29uZGl0aW9uID0gZmFsc2U7CisgIHdoaWxlIChuU3RhcnQgPCBpTGVuZ3RoKSB7CisgICAgd0N1ciA9IHBTcmNbblN0YXJ0KytdOworICAgIGlmICh3Q3VyID09ICcuJykgeworICAgICAgaWYgKHdQcmV2ID09ICdcXCcpIHsKKyAgICAgICAgcE5hbWVCdWZbbk5hbWVDb3VudCAtIDFdID0gd1ByZXYgPSAnLic7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgaWYgKG5OYW1lQ291bnQgPT0gMCkgeworICAgICAgICBybmQubV9kd1N0eWxlcyB8PSBYRkFfUkVTT0xWRU5PREVfQW55Q2hpbGQ7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICB3Y2hhcl90IHdMb29rYWhlYWQgPSBuU3RhcnQgPCBpTGVuZ3RoID8gcFNyY1tuU3RhcnRdIDogMDsKKyAgICAgIGlmICh3TG9va2FoZWFkICE9ICdbJyAmJiB3TG9va2FoZWFkICE9ICcoJyAmJiBuVHlwZSA8IDApCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAod0N1ciA9PSAnWycgfHwgd0N1ciA9PSAnKCcpIHsKKyAgICAgIGJJc0NvbmRpdGlvbiA9IHRydWU7CisgICAgfSBlbHNlIGlmICh3Q3VyID09ICcuJyAmJiBuU3RhcnQgPCBpTGVuZ3RoICYmCisgICAgICAgICAgICAgICAocFNyY1tuU3RhcnRdID09ICdbJyB8fCBwU3JjW25TdGFydF0gPT0gJygnKSkgeworICAgICAgYklzQ29uZGl0aW9uID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGJJc0NvbmRpdGlvbikKKyAgICAgIHBDb25kaXRpb25CdWZbbkNvbmRpdGlvbkNvdW50KytdID0gd0N1cjsKKyAgICBlbHNlCisgICAgICBwTmFtZUJ1ZltuTmFtZUNvdW50KytdID0gd0N1cjsKKworICAgIGlmICgoblR5cGUgPT0gMCAmJiB3Q3VyID09ICddJykgfHwgKG5UeXBlID09IDEgJiYgd0N1ciA9PSAnKScpIHx8CisgICAgICAgIChuVHlwZSA9PSAyICYmIHdDdXIgPT0gJyInKSkgeworICAgICAgblR5cGUgPSBzdGFjay5lbXB0eSgpID8gLTEgOiBzdGFjay5iYWNrKCk7CisgICAgICBpZiAoIXN0YWNrLmVtcHR5KCkpCisgICAgICAgIHN0YWNrLnBvcF9iYWNrKCk7CisgICAgfSBlbHNlIGlmICh3Q3VyID09ICdbJykgeworICAgICAgc3RhY2sucHVzaF9iYWNrKG5UeXBlKTsKKyAgICAgIG5UeXBlID0gMDsKKyAgICB9IGVsc2UgaWYgKHdDdXIgPT0gJygnKSB7CisgICAgICBzdGFjay5wdXNoX2JhY2soblR5cGUpOworICAgICAgblR5cGUgPSAxOworICAgIH0gZWxzZSBpZiAod0N1ciA9PSAnIicpIHsKKyAgICAgIHN0YWNrLnB1c2hfYmFjayhuVHlwZSk7CisgICAgICBuVHlwZSA9IDI7CisgICAgfQorICAgIHdQcmV2ID0gd0N1cjsKKyAgfQorICBpZiAoIXN0YWNrLmVtcHR5KCkpCisgICAgcmV0dXJuIC0xOworCisgIHdzTmFtZS5SZWxlYXNlQnVmZmVyKG5OYW1lQ291bnQpOworICB3c05hbWUuVHJpbSgpOworICB3c0NvbmRpdGlvbi5SZWxlYXNlQnVmZmVyKG5Db25kaXRpb25Db3VudCk7CisgIHdzQ29uZGl0aW9uLlRyaW0oKTsKKyAgcm5kLm1fdUhhc2hOYW1lID0KKyAgICAgIHN0YXRpY19jYXN0PFhGQV9IYXNoQ29kZT4oRlhfSGFzaENvZGVfR2V0Vyh3c05hbWUuQXNTdHJpbmdWaWV3KCksIGZhbHNlKSk7CisgIHJldHVybiBuU3RhcnQ7Cit9CisKK3ZvaWQgQ0ZYSlNFX1Jlc29sdmVQcm9jZXNzb3I6OkNvbmRpdGlvbkFycmF5KGludDMyX3QgaUN1ckluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyB3c0NvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZvdW5kQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfUmVzb2x2ZU5vZGVEYXRhJiBybmQpIHsKKyAgaW50MzJfdCBpTGVuID0gd3NDb25kaXRpb24uR2V0TGVuZ3RoKCk7CisgIGJvb2wgYlJlbGF0aXZlID0gZmFsc2U7CisgIGJvb2wgYkFsbCA9IGZhbHNlOworICBpbnQzMl90IGkgPSAxOworICBmb3IgKDsgaSA8IGlMZW47ICsraSkgeworICAgIHdjaGFyX3QgY2ggPSB3c0NvbmRpdGlvbltpXTsKKyAgICBpZiAoY2ggPT0gJyAnKQorICAgICAgY29udGludWU7CisgICAgaWYgKGNoID09ICcrJyB8fCBjaCA9PSAnLScpCisgICAgICBiUmVsYXRpdmUgPSB0cnVlOworICAgIGVsc2UgaWYgKGNoID09ICcqJykKKyAgICAgIGJBbGwgPSB0cnVlOworCisgICAgYnJlYWs7CisgIH0KKyAgaWYgKGJBbGwpIHsKKyAgICBpZiAocm5kLm1fZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZSkgeworICAgICAgaWYgKHJuZC5tX2R3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0JpbmQpIHsKKyAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9wQ3JlYXRlUGFyZW50ID0gVG9Ob2RlKHJuZC5tX0N1ck9iamVjdCk7CisgICAgICAgIG1fcE5vZGVIZWxwZXItPm1faUNyZWF0ZUNvdW50ID0gMTsKKyAgICAgICAgcm5kLm1fT2JqZWN0cy5jbGVhcigpOworICAgICAgICBtX3BOb2RlSGVscGVyLT5tX2lDdXJBbGxTdGFydCA9IC0xOworICAgICAgICBtX3BOb2RlSGVscGVyLT5tX3BBbGxTdGFydFBhcmVudCA9IG51bGxwdHI7CisgICAgICB9IGVsc2UgaWYgKG1fcE5vZGVIZWxwZXItPm1faUN1ckFsbFN0YXJ0ID09IC0xKSB7CisgICAgICAgIG1fcE5vZGVIZWxwZXItPm1faUN1ckFsbFN0YXJ0ID0gbV9pQ3VyU3RhcnQ7CisgICAgICAgIG1fcE5vZGVIZWxwZXItPm1fcEFsbFN0YXJ0UGFyZW50ID0gVG9Ob2RlKHJuZC5tX0N1ck9iamVjdCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChybmQubV9kd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9CaW5kTmV3KSB7CisgICAgICBpZiAobV9wTm9kZUhlbHBlci0+bV9pQ3VyQWxsU3RhcnQgPT0gLTEpCisgICAgICAgIG1fcE5vZGVIZWxwZXItPm1faUN1ckFsbFN0YXJ0ID0gbV9pQ3VyU3RhcnQ7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorICBpZiAoaUZvdW5kQ291bnQgPT0gMSAmJiAhaUxlbikKKyAgICByZXR1cm47CisKKyAgaW50MzJfdCBpSW5kZXggPSB3c0NvbmRpdGlvbi5NaWQoaSwgaUxlbiAtIDEgLSBpKS5HZXRJbnRlZ2VyKCk7CisgIGlmIChiUmVsYXRpdmUpCisgICAgaUluZGV4ICs9IGlDdXJJbmRleDsKKworICBpZiAoaUZvdW5kQ291bnQgPD0gaUluZGV4IHx8IGlJbmRleCA8IDApIHsKKyAgICBpZiAocm5kLm1fZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZSkgeworICAgICAgbV9wTm9kZUhlbHBlci0+bV9wQ3JlYXRlUGFyZW50ID0gVG9Ob2RlKHJuZC5tX0N1ck9iamVjdCk7CisgICAgICBtX3BOb2RlSGVscGVyLT5tX2lDcmVhdGVDb3VudCA9IGlJbmRleCAtIGlGb3VuZENvdW50ICsgMTsKKyAgICB9CisgICAgcm5kLm1fT2JqZWN0cy5jbGVhcigpOworICB9IGVsc2UgeworICAgIENYRkFfT2JqZWN0KiByZXQgPSBybmQubV9PYmplY3RzW2lJbmRleF07CisgICAgcm5kLm1fT2JqZWN0cy5jbGVhcigpOworICAgIHJuZC5tX09iamVjdHMucHVzaF9iYWNrKHJldCk7CisgIH0KK30KKwordm9pZCBDRlhKU0VfUmVzb2x2ZVByb2Nlc3Nvcjo6RG9QcmVkaWNhdGVGaWx0ZXIoaW50MzJfdCBpQ3VySW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nIHdzQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRm91bmRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9SZXNvbHZlTm9kZURhdGEmIHJuZCkgeworICBBU1NFUlQoaUZvdW5kQ291bnQgPT0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihybmQubV9PYmplY3RzKSk7CisgIFdpZGVTdHJpbmcgd3NFeHByZXNzaW9uOworICBDWEZBX1NjcmlwdDo6VHlwZSBlTGFuZ1R5cGUgPSBDWEZBX1NjcmlwdDo6VHlwZTo6VW5rbm93bjsKKyAgaWYgKHdzQ29uZGl0aW9uLkxlZnQoMikgPT0gTCIuWyIgJiYgd3NDb25kaXRpb24uTGFzdCgpID09IEwnXScpCisgICAgZUxhbmdUeXBlID0gQ1hGQV9TY3JpcHQ6OlR5cGU6OkZvcm1jYWxjOworICBlbHNlIGlmICh3c0NvbmRpdGlvbi5MZWZ0KDIpID09IEwiLigiICYmIHdzQ29uZGl0aW9uLkxhc3QoKSA9PSBMJyknKQorICAgIGVMYW5nVHlwZSA9IENYRkFfU2NyaXB0OjpUeXBlOjpKYXZhc2NyaXB0OworICBlbHNlCisgICAgcmV0dXJuOworCisgIENGWEpTRV9FbmdpbmUqIHBDb250ZXh0ID0gcm5kLm1fcFNDOworICB3c0V4cHJlc3Npb24gPSB3c0NvbmRpdGlvbi5NaWQoMiwgd3NDb25kaXRpb24uR2V0TGVuZ3RoKCkgLSAzKTsKKyAgZm9yIChpbnQzMl90IGkgPSBpRm91bmRDb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7CisgICAgYXV0byBwUmV0VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihybmQubV9wU0MtPkdldElzb2xhdGUoKSk7CisgICAgYm9vbCBiUmV0ID0gcENvbnRleHQtPlJ1blNjcmlwdChlTGFuZ1R5cGUsIHdzRXhwcmVzc2lvbi5Bc1N0cmluZ1ZpZXcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSZXRWYWx1ZS5nZXQoKSwgcm5kLm1fT2JqZWN0c1tpXSk7CisgICAgaWYgKCFiUmV0IHx8ICFwUmV0VmFsdWUtPlRvQm9vbGVhbigpKQorICAgICAgcm5kLm1fT2JqZWN0cy5lcmFzZShybmQubV9PYmplY3RzLmJlZ2luKCkgKyBpKTsKKyAgfQorfQorCit2b2lkIENGWEpTRV9SZXNvbHZlUHJvY2Vzc29yOjpGaWx0ZXJDb25kaXRpb24oQ0ZYSlNFX1Jlc29sdmVOb2RlRGF0YSYgcm5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcgd3NDb25kaXRpb24pIHsKKyAgaW50MzJfdCBpQ3VyckluZGV4ID0gMDsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Q1hGQV9Ob2RlKj4qIHBBcnJheSA9IHJuZC5tX3BTQy0+R2V0VXBPYmplY3RBcnJheSgpOworICBpZiAoIXBBcnJheS0+ZW1wdHkoKSkgeworICAgIENYRkFfTm9kZSogY3VyTm9kZSA9IHBBcnJheS0+YmFjaygpOworICAgIGJvb2wgYklzUHJvcGVydHkgPSBtX3BOb2RlSGVscGVyLT5Ob2RlSXNQcm9wZXJ0eShjdXJOb2RlKTsKKyAgICBpZiAoY3VyTm9kZS0+SXNVbm5hbWVkKCkgfHwKKyAgICAgICAgKGJJc1Byb3BlcnR5ICYmIGN1ck5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlBhZ2VTZXQpKSB7CisgICAgICBpQ3VyckluZGV4ID0gbV9wTm9kZUhlbHBlci0+R2V0SW5kZXgoY3VyTm9kZSwgWEZBX0xPR0lDX1RyYW5zcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJc1Byb3BlcnR5LCB0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgaUN1cnJJbmRleCA9IG1fcE5vZGVIZWxwZXItPkdldEluZGV4KGN1ck5vZGUsIFhGQV9MT0dJQ19UcmFuc3BhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSXNQcm9wZXJ0eSwgZmFsc2UpOworICAgIH0KKyAgfQorCisgIGludDMyX3QgaUZvdW5kQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHJuZC5tX09iamVjdHMpOworICB3c0NvbmRpdGlvbi5UcmltKCk7CisKKyAgaW50MzJfdCBpTGVuID0gd3NDb25kaXRpb24uR2V0TGVuZ3RoKCk7CisgIGlmICghaUxlbikgeworICAgIGlmIChybmQubV9kd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9BTEwpCisgICAgICByZXR1cm47CisgICAgaWYgKGlGb3VuZENvdW50ID09IDEpCisgICAgICByZXR1cm47CisKKyAgICBpZiAoaUZvdW5kQ291bnQgPD0gaUN1cnJJbmRleCkgeworICAgICAgaWYgKHJuZC5tX2R3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGUpIHsKKyAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9wQ3JlYXRlUGFyZW50ID0gVG9Ob2RlKHJuZC5tX0N1ck9iamVjdCk7CisgICAgICAgIG1fcE5vZGVIZWxwZXItPm1faUNyZWF0ZUNvdW50ID0gaUN1cnJJbmRleCAtIGlGb3VuZENvdW50ICsgMTsKKyAgICAgIH0KKyAgICAgIHJuZC5tX09iamVjdHMuY2xlYXIoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDWEZBX09iamVjdCogcmV0ID0gcm5kLm1fT2JqZWN0c1tpQ3VyckluZGV4XTsKKyAgICBybmQubV9PYmplY3RzLmNsZWFyKCk7CisgICAgcm5kLm1fT2JqZWN0cy5wdXNoX2JhY2socmV0KTsKKyAgICByZXR1cm47CisgIH0KKworICB3Y2hhcl90IHdUeXBlQ2hhciA9IHdzQ29uZGl0aW9uWzBdOworICBzd2l0Y2ggKHdUeXBlQ2hhcikgeworICAgIGNhc2UgJ1snOgorICAgICAgQ29uZGl0aW9uQXJyYXkoaUN1cnJJbmRleCwgd3NDb25kaXRpb24sIGlGb3VuZENvdW50LCBybmQpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgJy4nOgorICAgICAgaWYgKGlMZW4gPiAxICYmICh3c0NvbmRpdGlvblsxXSA9PSAnWycgfHwgd3NDb25kaXRpb25bMV0gPT0gJygnKSkKKyAgICAgICAgRG9QcmVkaWNhdGVGaWx0ZXIoaUN1cnJJbmRleCwgd3NDb25kaXRpb24sIGlGb3VuZENvdW50LCBybmQpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgJygnOgorICAgIGNhc2UgJyInOgorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm47CisgIH0KK30KK3ZvaWQgQ0ZYSlNFX1Jlc29sdmVQcm9jZXNzb3I6OlNldFN0eWxlc0ZvckNoaWxkKHVpbnQzMl90IGR3UGFyZW50U3R5bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1Jlc29sdmVOb2RlRGF0YSYgcm5kKSB7CisgIHVpbnQzMl90IGR3U3ViU3R5bGVzID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuOworICBpZiAoZHdQYXJlbnRTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZSkKKyAgICBkd1N1YlN0eWxlcyB8PSBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZTsKKworICBkd1N1YlN0eWxlcyAmPSB+WEZBX1JFU09MVkVOT0RFX1BhcmVudDsKKyAgZHdTdWJTdHlsZXMgJj0gflhGQV9SRVNPTFZFTk9ERV9TaWJsaW5nczsKKyAgZHdTdWJTdHlsZXMgJj0gflhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzOworICBkd1N1YlN0eWxlcyB8PSBYRkFfUkVTT0xWRU5PREVfQUxMOworICBybmQubV9kd1N0eWxlcyA9IGR3U3ViU3R5bGVzOworfQorCit2b2lkIENGWEpTRV9SZXNvbHZlUHJvY2Vzc29yOjpTZXRJbmRleERhdGFCaW5kKFdpZGVTdHJpbmcmIHdzTmV4dENvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCkgeworICBpZiAobV9wTm9kZUhlbHBlci0+Q3JlYXRlTm9kZV9Gb3JDb25kaXRpb24od3NOZXh0Q29uZGl0aW9uKSkgeworICAgIGlmIChtX3BOb2RlSGVscGVyLT5tX2VMYXN0Q3JlYXRlVHlwZSA9PSBYRkFfRWxlbWVudDo6RGF0YUdyb3VwKSB7CisgICAgICBpSW5kZXggPSAwOworICAgIH0gZWxzZSB7CisgICAgICBpSW5kZXggPSBpQ291bnQgLSAxOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpSW5kZXggPSBpQ291bnQgLSAxOworICB9Cit9CisKK0NGWEpTRV9SZXNvbHZlTm9kZURhdGE6OkNGWEpTRV9SZXNvbHZlTm9kZURhdGEoQ0ZYSlNFX0VuZ2luZSogcFNDKQorICAgIDogbV9wU0MocFNDKSwKKyAgICAgIG1fQ3VyT2JqZWN0KG51bGxwdHIpLAorICAgICAgbV93c05hbWUoKSwKKyAgICAgIG1fdUhhc2hOYW1lKFhGQV9IQVNIQ09ERV9Ob25lKSwKKyAgICAgIG1fd3NDb25kaXRpb24oKSwKKyAgICAgIG1fbkxldmVsKDApLAorICAgICAgbV9PYmplY3RzKCksCisgICAgICBtX2R3U3R5bGVzKFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiksCisgICAgICBtX3BTY3JpcHRBdHRyaWJ1dGUobnVsbHB0ciksCisgICAgICBtX2R3RmxhZyhYRkFfUmVzb2x2ZU5vZGVfUlNUeXBlX05vZGVzKSB7fQorCitDRlhKU0VfUmVzb2x2ZU5vZGVEYXRhOjp+Q0ZYSlNFX1Jlc29sdmVOb2RlRGF0YSgpIHt9CmRpZmYgLS1naXQgYS9meGpzL2NmeGpzZV9yZXNvbHZlcHJvY2Vzc29yLmggYi9meGpzL2NmeGpzZV9yZXNvbHZlcHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFhYmE2ZQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2Z4anNlX3Jlc29sdmVwcm9jZXNzb3IuaApAQCAtMCwwICsxLDc3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19DRlhKU0VfUkVTT0xWRVBST0NFU1NPUl9IXworI2RlZmluZSBGWEpTX0NGWEpTRV9SRVNPTFZFUFJPQ0VTU09SX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9yZXNvbHZlbm9kZV9ycy5oIgorCitjbGFzcyBDWEZBX05vZGVIZWxwZXI7CitjbGFzcyBDRlhKU0VfRW5naW5lOworCitjbGFzcyBDRlhKU0VfUmVzb2x2ZU5vZGVEYXRhIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENGWEpTRV9SZXNvbHZlTm9kZURhdGEoQ0ZYSlNFX0VuZ2luZSogcFNDKTsKKyAgfkNGWEpTRV9SZXNvbHZlTm9kZURhdGEoKTsKKworICBDRlhKU0VfRW5naW5lKiBtX3BTQzsKKyAgQ1hGQV9PYmplY3QqIG1fQ3VyT2JqZWN0OworICBXaWRlU3RyaW5nIG1fd3NOYW1lOworICBYRkFfSGFzaENvZGUgbV91SGFzaE5hbWU7CisgIFdpZGVTdHJpbmcgbV93c0NvbmRpdGlvbjsKKyAgaW50MzJfdCBtX25MZXZlbDsKKyAgc3RkOjp2ZWN0b3I8Q1hGQV9PYmplY3QqPiBtX09iamVjdHM7ICAvLyBOb3Qgb3duZWQuCisgIHVpbnQzMl90IG1fZHdTdHlsZXM7CisgIGNvbnN0IFhGQV9TQ1JJUFRBVFRSSUJVVEVJTkZPKiBtX3BTY3JpcHRBdHRyaWJ1dGU7CisgIFhGQV9SZXNvbHZlTm9kZV9SU1R5cGUgbV9kd0ZsYWc7Cit9OworCitjbGFzcyBDRlhKU0VfUmVzb2x2ZVByb2Nlc3NvciB7CisgcHVibGljOgorICBDRlhKU0VfUmVzb2x2ZVByb2Nlc3NvcigpOworICB+Q0ZYSlNFX1Jlc29sdmVQcm9jZXNzb3IoKTsKKworICBib29sIFJlc29sdmUoQ0ZYSlNFX1Jlc29sdmVOb2RlRGF0YSYgcm5kKTsKKyAgaW50MzJfdCBHZXRGaWx0ZXIoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnQsCisgICAgICAgICAgICAgICAgICAgIENGWEpTRV9SZXNvbHZlTm9kZURhdGEmIHJuZCk7CisgIHZvaWQgU2V0SW5kZXhEYXRhQmluZChXaWRlU3RyaW5nJiB3c05leHRDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCk7CisgIHZvaWQgU2V0Q3VyU3RhcnQoaW50MzJfdCBzdGFydCkgeyBtX2lDdXJTdGFydCA9IHN0YXJ0OyB9CisKKyAgQ1hGQV9Ob2RlSGVscGVyKiBHZXROb2RlSGVscGVyKCkgY29uc3QgeyByZXR1cm4gbV9wTm9kZUhlbHBlci5nZXQoKTsgfQorCisgcHJpdmF0ZToKKyAgYm9vbCBSZXNvbHZlRm9yQXR0cmlidXRlUnMoQ1hGQV9PYmplY3QqIGN1ck5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9SZXNvbHZlTm9kZURhdGEmIHJuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHN0ckF0dHIpOworICBib29sIFJlc29sdmVBbnlDaGlsZChDRlhKU0VfUmVzb2x2ZU5vZGVEYXRhJiBybmQpOworICBib29sIFJlc29sdmVEb2xsYXIoQ0ZYSlNFX1Jlc29sdmVOb2RlRGF0YSYgcm5kKTsKKyAgYm9vbCBSZXNvbHZlRXhjYWxtYXRvcnkoQ0ZYSlNFX1Jlc29sdmVOb2RlRGF0YSYgcm5kKTsKKyAgYm9vbCBSZXNvbHZlTnVtYmVyU2lnbihDRlhKU0VfUmVzb2x2ZU5vZGVEYXRhJiBybmQpOworICBib29sIFJlc29sdmVBc3RlcmlzayhDRlhKU0VfUmVzb2x2ZU5vZGVEYXRhJiBybmQpOworICBib29sIFJlc29sdmVOb3JtYWwoQ0ZYSlNFX1Jlc29sdmVOb2RlRGF0YSYgcm5kKTsKKyAgdm9pZCBTZXRTdHlsZXNGb3JDaGlsZCh1aW50MzJfdCBkd1BhcmVudFN0eWxlcywgQ0ZYSlNFX1Jlc29sdmVOb2RlRGF0YSYgcm5kKTsKKworICB2b2lkIENvbmRpdGlvbkFycmF5KGludDMyX3QgaUN1ckluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcgd3NDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRm91bmRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfUmVzb2x2ZU5vZGVEYXRhJiBybmQpOworICB2b2lkIERvUHJlZGljYXRlRmlsdGVyKGludDMyX3QgaUN1ckluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcgd3NDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRm91bmRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfUmVzb2x2ZU5vZGVEYXRhJiBybmQpOworICB2b2lkIEZpbHRlckNvbmRpdGlvbihDRlhKU0VfUmVzb2x2ZU5vZGVEYXRhJiBybmQsIFdpZGVTdHJpbmcgd3NDb25kaXRpb24pOworCisgIGludDMyX3QgbV9pQ3VyU3RhcnQ7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX05vZGVIZWxwZXI+IG1fcE5vZGVIZWxwZXI7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfQ0ZYSlNFX1JFU09MVkVQUk9DRVNTT1JfSF8KZGlmZiAtLWdpdCBhL2Z4anMvY2Z4anNlX3J1bnRpbWVkYXRhLmNwcCBiL2Z4anMvY2Z4anNlX3J1bnRpbWVkYXRhLmNwcAppbmRleCBiOGRmOWNlLi5iNWMyZGU5IDEwMDY0NAotLS0gYS9meGpzL2NmeGpzZV9ydW50aW1lZGF0YS5jcHAKKysrIGIvZnhqcy9jZnhqc2VfcnVudGltZWRhdGEuY3BwCkBAIC0xMSw2NyArMTEsNiBAQAogI2luY2x1ZGUgImZ4anMvY2Z4anNlX2lzb2xhdGV0cmFja2VyLmgiCiAjaW5jbHVkZSAiZnhqcy9meGpzX3Y4LmgiCiAKLW5hbWVzcGFjZSB7Ci0KLS8vIER1cGxpY2F0ZXMgZnBkZnNkaydzIGNqc19ydW50aW1lLmgsIGJ1dCBrZWVwcyBYRkEgZnJvbSBkZXBlbmRpbmcgb24gaXQuCi0vLyBUT0RPKHRzZXBleik6IG1ha2UgYSBzaW5nbGUgdmVyc2lvbiBvZiB0aGlzLgotY2xhc3MgRlhKU0VfQXJyYXlCdWZmZXJBbGxvY2F0b3IgOiBwdWJsaWMgdjg6OkFycmF5QnVmZmVyOjpBbGxvY2F0b3IgewotICB2b2lkKiBBbGxvY2F0ZShzaXplX3QgbGVuZ3RoKSBvdmVycmlkZSB7IHJldHVybiBjYWxsb2MoMSwgbGVuZ3RoKTsgfQotICB2b2lkKiBBbGxvY2F0ZVVuaW5pdGlhbGl6ZWQoc2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGUgeyByZXR1cm4gbWFsbG9jKGxlbmd0aCk7IH0KLSAgdm9pZCBGcmVlKHZvaWQqIGRhdGEsIHNpemVfdCBsZW5ndGgpIG92ZXJyaWRlIHsgZnJlZShkYXRhKTsgfQotfTsKLQotdm9pZCBSdW50aW1lX0Rpc3Bvc2VDYWxsYmFjayh2ODo6SXNvbGF0ZSogcElzb2xhdGUsIGJvb2wgYk93bmVkKSB7Ci0gIGlmIChGWEpTX1Blcklzb2xhdGVEYXRhKiBwRGF0YSA9IEZYSlNfUGVySXNvbGF0ZURhdGE6OkdldChwSXNvbGF0ZSkpCi0gICAgZGVsZXRlIHBEYXRhOwotICBpZiAoYk93bmVkKQotICAgIHBJc29sYXRlLT5EaXNwb3NlKCk7Ci19Ci0KLXZvaWQgS2lsbFY4KCkgewotICB2ODo6Vjg6OkRpc3Bvc2UoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLXZvaWQgRlhKU0VfSW5pdGlhbGl6ZSgpIHsKLSAgaWYgKCFDRlhKU0VfSXNvbGF0ZVRyYWNrZXI6OmdfcEluc3RhbmNlKQotICAgIENGWEpTRV9Jc29sYXRlVHJhY2tlcjo6Z19wSW5zdGFuY2UgPSBuZXcgQ0ZYSlNFX0lzb2xhdGVUcmFja2VyOwotCi0gIHN0YXRpYyBib29sIGJWOEluaXRpYWxpemVkID0gZmFsc2U7Ci0gIGlmIChiVjhJbml0aWFsaXplZCkKLSAgICByZXR1cm47Ci0KLSAgYlY4SW5pdGlhbGl6ZWQgPSB0cnVlOwotICBhdGV4aXQoS2lsbFY4KTsKLX0KLQotdm9pZCBGWEpTRV9GaW5hbGl6ZSgpIHsKLSAgaWYgKCFDRlhKU0VfSXNvbGF0ZVRyYWNrZXI6OmdfcEluc3RhbmNlKQotICAgIHJldHVybjsKLQotICBDRlhKU0VfSXNvbGF0ZVRyYWNrZXI6OmdfcEluc3RhbmNlLT5SZW1vdmVBbGwoUnVudGltZV9EaXNwb3NlQ2FsbGJhY2spOwotICBkZWxldGUgQ0ZYSlNFX0lzb2xhdGVUcmFja2VyOjpnX3BJbnN0YW5jZTsKLSAgQ0ZYSlNFX0lzb2xhdGVUcmFja2VyOjpnX3BJbnN0YW5jZSA9IG51bGxwdHI7Ci19Ci0KLXY4OjpJc29sYXRlKiBGWEpTRV9SdW50aW1lX0NyZWF0ZV9Pd24oKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjx2ODo6QXJyYXlCdWZmZXI6OkFsbG9jYXRvcj4gYWxsb2NhdG9yKAotICAgICAgbmV3IEZYSlNFX0FycmF5QnVmZmVyQWxsb2NhdG9yKCkpOwotICB2ODo6SXNvbGF0ZTo6Q3JlYXRlUGFyYW1zIHBhcmFtczsKLSAgcGFyYW1zLmFycmF5X2J1ZmZlcl9hbGxvY2F0b3IgPSBhbGxvY2F0b3IuZ2V0KCk7Ci0gIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IHY4OjpJc29sYXRlOjpOZXcocGFyYW1zKTsKLSAgQVNTRVJUKHBJc29sYXRlICYmIENGWEpTRV9Jc29sYXRlVHJhY2tlcjo6Z19wSW5zdGFuY2UpOwotICBDRlhKU0VfSXNvbGF0ZVRyYWNrZXI6OmdfcEluc3RhbmNlLT5BcHBlbmQocElzb2xhdGUsIHN0ZDo6bW92ZShhbGxvY2F0b3IpKTsKLSAgcmV0dXJuIHBJc29sYXRlOwotfQotCi12b2lkIEZYSlNFX1J1bnRpbWVfUmVsZWFzZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUpIHsKLSAgaWYgKCFwSXNvbGF0ZSkKLSAgICByZXR1cm47Ci0gIENGWEpTRV9Jc29sYXRlVHJhY2tlcjo6Z19wSW5zdGFuY2UtPlJlbW92ZShwSXNvbGF0ZSwgUnVudGltZV9EaXNwb3NlQ2FsbGJhY2spOwotfQotCiBDRlhKU0VfUnVudGltZURhdGE6OkNGWEpTRV9SdW50aW1lRGF0YSh2ODo6SXNvbGF0ZSogcElzb2xhdGUpCiAgICAgOiBtX3BJc29sYXRlKHBJc29sYXRlKSB7fQogCkBAIC04Miw2ICsyMSw3IEBACiAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfUnVudGltZURhdGE+IHBSdW50aW1lRGF0YSgKICAgICAgIG5ldyBDRlhKU0VfUnVudGltZURhdGEocElzb2xhdGUpKTsKICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlIHNjb3BlKHBJc29sYXRlKTsKKwogICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGhGdW5jVGVtcGxhdGUgPQogICAgICAgdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhwSXNvbGF0ZSk7CiAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IGhHbG9iYWxUZW1wbGF0ZSA9CkBAIC05MCw5ICszMCwxMSBAQAogICAgICAgdjg6OlN5bWJvbDo6R2V0VG9TdHJpbmdUYWcocElzb2xhdGUpLAogICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsICJnbG9iYWwiLCB2ODo6TmV3U3RyaW5nVHlwZTo6a05vcm1hbCkKICAgICAgICAgICAuVG9Mb2NhbENoZWNrZWQoKSk7CisKICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBoQ29udGV4dCA9CiAgICAgICB2ODo6Q29udGV4dDo6TmV3KHBJc29sYXRlLCAwLCBoR2xvYmFsVGVtcGxhdGUpOwogICBoQ29udGV4dC0+U2V0U2VjdXJpdHlUb2tlbih2ODo6RXh0ZXJuYWw6Ok5ldyhwSXNvbGF0ZSwgcElzb2xhdGUpKTsKKwogICBwUnVudGltZURhdGEtPm1faFJvb3RDb250ZXh0R2xvYmFsVGVtcGxhdGUuUmVzZXQocElzb2xhdGUsIGhGdW5jVGVtcGxhdGUpOwogICBwUnVudGltZURhdGEtPm1faFJvb3RDb250ZXh0LlJlc2V0KHBJc29sYXRlLCBoQ29udGV4dCk7CiAgIHJldHVybiBwUnVudGltZURhdGE7CkBAIC0xMDAsMTAgKzQyLDkgQEAKIAogQ0ZYSlNFX1J1bnRpbWVEYXRhKiBDRlhKU0VfUnVudGltZURhdGE6OkdldCh2ODo6SXNvbGF0ZSogcElzb2xhdGUpIHsKICAgRlhKU19QZXJJc29sYXRlRGF0YTo6U2V0VXAocElzb2xhdGUpOworCiAgIEZYSlNfUGVySXNvbGF0ZURhdGEqIHBEYXRhID0gRlhKU19QZXJJc29sYXRlRGF0YTo6R2V0KHBJc29sYXRlKTsKICAgaWYgKCFwRGF0YS0+bV9wRlhKU0VSdW50aW1lRGF0YSkKICAgICBwRGF0YS0+bV9wRlhKU0VSdW50aW1lRGF0YSA9IENGWEpTRV9SdW50aW1lRGF0YTo6Q3JlYXRlKHBJc29sYXRlKTsKICAgcmV0dXJuIHBEYXRhLT5tX3BGWEpTRVJ1bnRpbWVEYXRhLmdldCgpOwogfQotCi1DRlhKU0VfSXNvbGF0ZVRyYWNrZXIqIENGWEpTRV9Jc29sYXRlVHJhY2tlcjo6Z19wSW5zdGFuY2UgPSBudWxscHRyOwpkaWZmIC0tZ2l0IGEvZnhqcy9jZnhqc2VfdmFsdWUuY3BwIGIvZnhqcy9jZnhqc2VfdmFsdWUuY3BwCmluZGV4IDY4YzgyZTUuLmQwN2IzNTYgMTAwNjQ0Ci0tLSBhL2Z4anMvY2Z4anNlX3ZhbHVlLmNwcAorKysgYi9meGpzL2NmeGpzZV92YWx1ZS5jcHAKQEAgLTEzLDggKzEzLDggQEAKIAogbmFtZXNwYWNlIHsKIAotZG91YmxlIGZ0b2QoRlhfRkxPQVQgZk51bWJlcikgewotICBzdGF0aWNfYXNzZXJ0KHNpemVvZihGWF9GTE9BVCkgPT0gNCwgIkZYX0ZMT0FUIG9mIGluY29ycmVjdCBzaXplIik7Citkb3VibGUgZnRvZChmbG9hdCBmTnVtYmVyKSB7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGZsb2F0KSA9PSA0LCAiZmxvYXQgb2YgaW5jb3JyZWN0IHNpemUiKTsKIAogICB1aW50MzJfdCBuRmxvYXRCaXRzID0gKHVpbnQzMl90JilmTnVtYmVyOwogICB1aW50OF90IG5FeHBvbmVudCA9ICh1aW50OF90KShuRmxvYXRCaXRzID4+IDIzKTsKQEAgLTUyLDEzICs1MiwxMyBAQAogCiB9ICAvLyBuYW1lc3BhY2UKIAotdm9pZCBGWEpTRV9UaHJvd01lc3NhZ2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB1dGY4TWVzc2FnZSkgewordm9pZCBGWEpTRV9UaHJvd01lc3NhZ2UoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHV0ZjhNZXNzYWdlKSB7CiAgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IHY4OjpJc29sYXRlOjpHZXRDdXJyZW50KCk7CiAgIEFTU0VSVChwSXNvbGF0ZSk7CiAKICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUocElzb2xhdGUpOwogICB2ODo6TG9jYWw8djg6OlN0cmluZz4gaE1lc3NhZ2UgPSB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOCgKLSAgICAgIHBJc29sYXRlLCB1dGY4TWVzc2FnZS5jX3N0cigpLCB2ODo6U3RyaW5nOjprTm9ybWFsU3RyaW5nLAorICAgICAgcElzb2xhdGUsIHV0ZjhNZXNzYWdlLnVudGVybWluYXRlZF9jX3N0cigpLCB2ODo6U3RyaW5nOjprTm9ybWFsU3RyaW5nLAogICAgICAgdXRmOE1lc3NhZ2UuR2V0TGVuZ3RoKCkpOwogICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoRXJyb3IgPSB2ODo6RXhjZXB0aW9uOjpFcnJvcihoTWVzc2FnZSk7CiAgIHBJc29sYXRlLT5UaHJvd0V4Y2VwdGlvbihoRXJyb3IpOwpAQCAtODMsMjAgKzgzLDkgQEAKIAogdm9pZCBDRlhKU0VfVmFsdWU6OlNldE9iamVjdChDRlhKU0VfSG9zdE9iamVjdCogbHBPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9DbGFzcyogcENsYXNzKSB7Ci0gIGlmICghcENsYXNzKSB7Ci0gICAgQVNTRVJUKCFscE9iamVjdCk7Ci0gICAgU2V0SlNPYmplY3QoKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgU2V0SG9zdE9iamVjdChscE9iamVjdCwgcENsYXNzKTsKLX0KLQotdm9pZCBDRlhKU0VfVmFsdWU6OlNldEhvc3RPYmplY3QoQ0ZYSlNFX0hvc3RPYmplY3QqIGxwT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0NsYXNzKiBscENsYXNzKSB7CiAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOwotICBBU1NFUlQobHBDbGFzcyk7CiAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gaENsYXNzID0KLSAgICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT46Ok5ldyhtX3BJc29sYXRlLCBscENsYXNzLT5tX2hUZW1wbGF0ZSk7CisgICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+OjpOZXcobV9wSXNvbGF0ZSwgcENsYXNzLT5tX2hUZW1wbGF0ZSk7CiAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBoT2JqZWN0ID0gaENsYXNzLT5JbnN0YW5jZVRlbXBsYXRlKCktPk5ld0luc3RhbmNlKCk7CiAgIEZYSlNFX1VwZGF0ZU9iamVjdEJpbmRpbmcoaE9iamVjdCwgbHBPYmplY3QpOwogICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoT2JqZWN0KTsKQEAgLTEyMCwxMyArMTA5LDEzIEBACiAgIG1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsIGhEYXRlKTsKIH0KIAotdm9pZCBDRlhKU0VfVmFsdWU6OlNldEZsb2F0KEZYX0ZMT0FUIGZGbG9hdCkgewordm9pZCBDRlhKU0VfVmFsdWU6OlNldEZsb2F0KGZsb2F0IGZGbG9hdCkgewogICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7CiAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSA9IHY4OjpOdW1iZXI6Ok5ldyhtX3BJc29sYXRlLCBmdG9kKGZGbG9hdCkpOwogICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBwVmFsdWUpOwogfQogCi1ib29sIENGWEpTRV9WYWx1ZTo6U2V0T2JqZWN0UHJvcGVydHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLAorYm9vbCBDRlhKU0VfVmFsdWU6OlNldE9iamVjdFByb3BlcnR5KGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzelByb3BOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUpIHsKICAgQVNTRVJUKGxwUHJvcFZhbHVlKTsKICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7CkBAIC0xMzgsMTMgKzEyNywxMyBAQAogICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoUHJvcFZhbHVlID0KICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbHBQcm9wVmFsdWUtPkRpcmVjdEdldFZhbHVlKCkpOwogICByZXR1cm4gKGJvb2wpaE9iamVjdC5Bczx2ODo6T2JqZWN0PigpLT5TZXQoCi0gICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChtX3BJc29sYXRlLCBzelByb3BOYW1lLmNfc3RyKCksCisgICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChtX3BJc29sYXRlLCBzelByb3BOYW1lLnVudGVybWluYXRlZF9jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6UHJvcE5hbWUuR2V0TGVuZ3RoKCkpLAogICAgICAgaFByb3BWYWx1ZSk7CiB9CiAKLWJvb2wgQ0ZYSlNFX1ZhbHVlOjpHZXRPYmplY3RQcm9wZXJ0eShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsCitib29sIENGWEpTRV9WYWx1ZTo6R2V0T2JqZWN0UHJvcGVydHkoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6UHJvcE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSkgewogICBBU1NFUlQobHBQcm9wVmFsdWUpOwogICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShtX3BJc29sYXRlKTsKQEAgLTE1NSw4ICsxNDQsOCBAQAogCiAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhQcm9wVmFsdWUgPQogICAgICAgaE9iamVjdC5Bczx2ODo6T2JqZWN0PigpLT5HZXQodjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgoCi0gICAgICAgICAgbV9wSXNvbGF0ZSwgc3pQcm9wTmFtZS5jX3N0cigpLCB2ODo6U3RyaW5nOjprTm9ybWFsU3RyaW5nLAotICAgICAgICAgIHN6UHJvcE5hbWUuR2V0TGVuZ3RoKCkpKTsKKyAgICAgICAgICBtX3BJc29sYXRlLCBzelByb3BOYW1lLnVudGVybWluYXRlZF9jX3N0cigpLAorICAgICAgICAgIHY4OjpTdHJpbmc6OmtOb3JtYWxTdHJpbmcsIHN6UHJvcE5hbWUuR2V0TGVuZ3RoKCkpKTsKICAgbHBQcm9wVmFsdWUtPkZvcmNlU2V0VmFsdWUoaFByb3BWYWx1ZSk7CiAgIHJldHVybiB0cnVlOwogfQpAQCAtMTg3LDcgKzE3Niw3IEBACiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENGWEpTRV9WYWx1ZTo6RGVsZXRlT2JqZWN0UHJvcGVydHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lKSB7Citib29sIENGWEpTRV9WYWx1ZTo6RGVsZXRlT2JqZWN0UHJvcGVydHkoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6UHJvcE5hbWUpIHsKICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7CiAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhPYmplY3QgPQogICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBtX2hWYWx1ZSk7CkBAIC0xOTUsMTIgKzE4NCwxMiBAQAogICAgIHJldHVybiBmYWxzZTsKIAogICBoT2JqZWN0LkFzPHY4OjpPYmplY3Q+KCktPkRlbGV0ZSh2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOCgKLSAgICAgIG1fcElzb2xhdGUsIHN6UHJvcE5hbWUuY19zdHIoKSwgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywKKyAgICAgIG1fcElzb2xhdGUsIHN6UHJvcE5hbWUudW50ZXJtaW5hdGVkX2Nfc3RyKCksIHY4OjpTdHJpbmc6OmtOb3JtYWxTdHJpbmcsCiAgICAgICBzelByb3BOYW1lLkdldExlbmd0aCgpKSk7CiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENGWEpTRV9WYWx1ZTo6SGFzT2JqZWN0T3duUHJvcGVydHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLAorYm9vbCBDRlhKU0VfVmFsdWU6Okhhc09iamVjdE93blByb3BlcnR5KGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzelByb3BOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlVzZVR5cGVHZXR0ZXIpIHsKICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7CiAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhPYmplY3QgPQpAQCAtMjA5LDcgKzE5OCw3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBoS2V5ID0gdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgoCi0gICAgICBtX3BJc29sYXRlLCBzelByb3BOYW1lLmNfc3RyKCksIHY4OjpTdHJpbmc6OmtOb3JtYWxTdHJpbmcsCisgICAgICBtX3BJc29sYXRlLCBzelByb3BOYW1lLnVudGVybWluYXRlZF9jX3N0cigpLCB2ODo6U3RyaW5nOjprTm9ybWFsU3RyaW5nLAogICAgICAgc3pQcm9wTmFtZS5HZXRMZW5ndGgoKSk7CiAgIHJldHVybiBoT2JqZWN0LkFzPHY4OjpPYmplY3Q+KCktPkhhc1JlYWxOYW1lZFByb3BlcnR5KGhLZXkpIHx8CiAgICAgICAgICAoYlVzZVR5cGVHZXR0ZXIgJiYKQEAgLTIxOCw3ICsyMDcsNyBAQAogICAgICAgICAgICAgICAuRnJvbU1heWJlKGZhbHNlKSk7CiB9CiAKLWJvb2wgQ0ZYSlNFX1ZhbHVlOjpTZXRPYmplY3RPd25Qcm9wZXJ0eShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsCitib29sIENGWEpTRV9WYWx1ZTo6U2V0T2JqZWN0T3duUHJvcGVydHkoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6UHJvcE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSkgewogICBBU1NFUlQobHBQcm9wVmFsdWUpOwogICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGVSb290Q29udGV4dCBzY29wZShtX3BJc29sYXRlKTsKQEAgLTIzMiw3ICsyMjEsNyBAQAogICByZXR1cm4gaE9iamVjdC5Bczx2ODo6T2JqZWN0PigpCiAgICAgICAtPkRlZmluZU93blByb3BlcnR5KAogICAgICAgICAgIG1fcElzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCksCi0gICAgICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgobV9wSXNvbGF0ZSwgc3pQcm9wTmFtZS5jX3N0cigpLAorICAgICAgICAgIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KG1fcElzb2xhdGUsIHN6UHJvcE5hbWUudW50ZXJtaW5hdGVkX2Nfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzelByb3BOYW1lLkdldExlbmd0aCgpKSwKICAgICAgICAgICBwVmFsdWUpCkBAIC0yNzIsNzkgKzI2MSw2IEBACiAgIHJldHVybiB0cnVlOwogfQogCi0jZGVmaW5lIEZYSlNFX0lOVkFMSURfUFRSICgodm9pZCopKGludHB0cl90KS0xKQotYm9vbCBDRlhKU0VfVmFsdWU6OkNhbGwoQ0ZYSlNFX1ZhbHVlKiBscFJlY2VpdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBscFJldFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkFyZ0NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiogbHBBcmdzKSB7Ci0gIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOwotICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoRnVuY3Rpb25WYWx1ZSA9Ci0gICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIERpcmVjdEdldFZhbHVlKCkpOwotICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gaEZ1bmN0aW9uT2JqZWN0ID0KLSAgICAgICFoRnVuY3Rpb25WYWx1ZS5Jc0VtcHR5KCkgJiYgaEZ1bmN0aW9uVmFsdWUtPklzT2JqZWN0KCkKLSAgICAgICAgICA/IGhGdW5jdGlvblZhbHVlLkFzPHY4OjpPYmplY3Q+KCkKLSAgICAgICAgICA6IHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpOwotCi0gIHY4OjpUcnlDYXRjaCB0cnljYXRjaChtX3BJc29sYXRlKTsKLSAgaWYgKGhGdW5jdGlvbk9iamVjdC5Jc0VtcHR5KCkgfHwgIWhGdW5jdGlvbk9iamVjdC0+SXNDYWxsYWJsZSgpKSB7Ci0gICAgaWYgKGxwUmV0VmFsdWUpCi0gICAgICBscFJldFZhbHVlLT5Gb3JjZVNldFZhbHVlKEZYSlNFX0NyZWF0ZVJldHVyblZhbHVlKG1fcElzb2xhdGUsIHRyeWNhdGNoKSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFJldHVyblZhbHVlOwotICB2ODo6TG9jYWw8djg6OlZhbHVlPiogbHBMb2NhbEFyZ3MgPSBOVUxMOwotICBpZiAobkFyZ0NvdW50KSB7Ci0gICAgbHBMb2NhbEFyZ3MgPSBGWF9BbGxvYyh2ODo6TG9jYWw8djg6OlZhbHVlPiwgbkFyZ0NvdW50KTsKLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbkFyZ0NvdW50OyBpKyspIHsKLSAgICAgIG5ldyAobHBMb2NhbEFyZ3MgKyBpKSB2ODo6TG9jYWw8djg6OlZhbHVlPjsKLSAgICAgIENGWEpTRV9WYWx1ZSogbHBBcmcgPSBscEFyZ3NbaV07Ci0gICAgICBpZiAobHBBcmcpIHsKLSAgICAgICAgbHBMb2NhbEFyZ3NbaV0gPQotICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT46Ok5ldyhtX3BJc29sYXRlLCBscEFyZy0+RGlyZWN0R2V0VmFsdWUoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAobHBMb2NhbEFyZ3NbaV0uSXNFbXB0eSgpKSB7Ci0gICAgICAgIGxwTG9jYWxBcmdzW2ldID0gdjg6OlVuZGVmaW5lZChtX3BJc29sYXRlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBib29sIGJSZXRWYWx1ZSA9IHRydWU7Ci0gIGlmIChscFJlY2VpdmVyID09IEZYSlNFX0lOVkFMSURfUFRSKSB7Ci0gICAgdjg6Ok1heWJlTG9jYWw8djg6OlZhbHVlPiBtYXliZV9yZXR2YWx1ZSA9Ci0gICAgICAgIGhGdW5jdGlvbk9iamVjdC0+Q2FsbEFzQ29uc3RydWN0b3IobV9wSXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQXJnQ291bnQsIGxwTG9jYWxBcmdzKTsKLSAgICBoUmV0dXJuVmFsdWUgPSBtYXliZV9yZXR2YWx1ZS5Gcm9tTWF5YmUodjg6OkxvY2FsPHY4OjpWYWx1ZT4oKSk7Ci0gIH0gZWxzZSB7Ci0gICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gaFJlY2VpdmVyOwotICAgIGlmIChscFJlY2VpdmVyKSB7Ci0gICAgICBoUmVjZWl2ZXIgPQotICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbHBSZWNlaXZlci0+RGlyZWN0R2V0VmFsdWUoKSk7Ci0gICAgfQotICAgIGlmIChoUmVjZWl2ZXIuSXNFbXB0eSgpIHx8ICFoUmVjZWl2ZXItPklzT2JqZWN0KCkpCi0gICAgICBoUmVjZWl2ZXIgPSB2ODo6T2JqZWN0OjpOZXcobV9wSXNvbGF0ZSk7Ci0KLSAgICB2ODo6TWF5YmVMb2NhbDx2ODo6VmFsdWU+IG1heWJlX3JldHZhbHVlID0gaEZ1bmN0aW9uT2JqZWN0LT5DYWxsQXNGdW5jdGlvbigKLSAgICAgICAgbV9wSXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKSwgaFJlY2VpdmVyLCBuQXJnQ291bnQsIGxwTG9jYWxBcmdzKTsKLSAgICBoUmV0dXJuVmFsdWUgPSBtYXliZV9yZXR2YWx1ZS5Gcm9tTWF5YmUodjg6OkxvY2FsPHY4OjpWYWx1ZT4oKSk7Ci0gIH0KLQotICBpZiAodHJ5Y2F0Y2guSGFzQ2F1Z2h0KCkpIHsKLSAgICBoUmV0dXJuVmFsdWUgPSBGWEpTRV9DcmVhdGVSZXR1cm5WYWx1ZShtX3BJc29sYXRlLCB0cnljYXRjaCk7Ci0gICAgYlJldFZhbHVlID0gZmFsc2U7Ci0gIH0KLQotICBpZiAobHBSZXRWYWx1ZSkKLSAgICBscFJldFZhbHVlLT5Gb3JjZVNldFZhbHVlKGhSZXR1cm5WYWx1ZSk7Ci0KLSAgaWYgKGxwTG9jYWxBcmdzKSB7Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5BcmdDb3VudDsgaSsrKQotICAgICAgbHBMb2NhbEFyZ3NbaV0ufkxvY2FsKCk7Ci0gICAgRlhfRnJlZShscExvY2FsQXJncyk7Ci0gIH0KLSAgcmV0dXJuIGJSZXRWYWx1ZTsKLX0KLQogYm9vbCBDRlhKU0VfVmFsdWU6OklzVW5kZWZpbmVkKCkgY29uc3QgewogICBpZiAobV9oVmFsdWUuSXNFbXB0eSgpKQogICAgIHJldHVybiBmYWxzZTsKQEAgLTQ0MiwxMSArMzU4LDExIEBACiAgIHJldHVybiBzdGF0aWNfY2FzdDxib29sPihoVmFsdWUtPkJvb2xlYW5WYWx1ZSgpKTsKIH0KIAotRlhfRkxPQVQgQ0ZYSlNFX1ZhbHVlOjpUb0Zsb2F0KCkgY29uc3QgeworZmxvYXQgQ0ZYSlNFX1ZhbHVlOjpUb0Zsb2F0KCkgY29uc3QgewogICBBU1NFUlQoIW1faFZhbHVlLklzRW1wdHkoKSk7CiAgIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOwogICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6TG9jYWw8djg6OlZhbHVlPjo6TmV3KG1fcElzb2xhdGUsIG1faFZhbHVlKTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihoVmFsdWUtPk51bWJlclZhbHVlKCkpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGhWYWx1ZS0+TnVtYmVyVmFsdWUoKSk7CiB9CiAKIGRvdWJsZSBDRlhKU0VfVmFsdWU6OlRvRG91YmxlKCkgY29uc3QgewpAQCAtNDYzLDEzICszNzksMTMgQEAKICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KGhWYWx1ZS0+TnVtYmVyVmFsdWUoKSk7CiB9CiAKLUNGWF9CeXRlU3RyaW5nIENGWEpTRV9WYWx1ZTo6VG9TdHJpbmcoKSBjb25zdCB7CitCeXRlU3RyaW5nIENGWEpTRV9WYWx1ZTo6VG9TdHJpbmcoKSBjb25zdCB7CiAgIEFTU0VSVCghbV9oVmFsdWUuSXNFbXB0eSgpKTsKICAgQ0ZYSlNFX1Njb3BlVXRpbF9Jc29sYXRlSGFuZGxlUm9vdENvbnRleHQgc2NvcGUobV9wSXNvbGF0ZSk7CiAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcobV9wSXNvbGF0ZSwgbV9oVmFsdWUpOwogICB2ODo6TG9jYWw8djg6OlN0cmluZz4gaFN0cmluZyA9IGhWYWx1ZS0+VG9TdHJpbmcoKTsKLSAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIGhTdHJpbmdWYWwoaFN0cmluZyk7Ci0gIHJldHVybiBDRlhfQnl0ZVN0cmluZygqaFN0cmluZ1ZhbCk7CisgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBoU3RyaW5nVmFsKG1fcElzb2xhdGUsIGhTdHJpbmcpOworICByZXR1cm4gQnl0ZVN0cmluZygqaFN0cmluZ1ZhbCk7CiB9CiAKIHZvaWQgQ0ZYSlNFX1ZhbHVlOjpTZXRVbmRlZmluZWQoKSB7CkBAIC01MDIsNyArNDE4LDcgQEAKICAgbV9oVmFsdWUuUmVzZXQobV9wSXNvbGF0ZSwgaFZhbHVlKTsKIH0KIAotdm9pZCBDRlhKU0VfVmFsdWU6OlNldFN0cmluZyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6U3RyaW5nKSB7Cit2b2lkIENGWEpTRV9WYWx1ZTo6U2V0U3RyaW5nKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzelN0cmluZykgewogICBDRlhKU0VfU2NvcGVVdGlsX0lzb2xhdGVIYW5kbGUgc2NvcGUobV9wSXNvbGF0ZSk7CiAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGhWYWx1ZSA9IHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KAogICAgICAgbV9wSXNvbGF0ZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oc3pTdHJpbmcucmF3X3N0cigpKSwKQEAgLTUxMCw4ICs0MjYsMyBAQAogICBtX2hWYWx1ZS5SZXNldChtX3BJc29sYXRlLCBoVmFsdWUpOwogfQogCi12b2lkIENGWEpTRV9WYWx1ZTo6U2V0SlNPYmplY3QoKSB7Ci0gIENGWEpTRV9TY29wZVV0aWxfSXNvbGF0ZUhhbmRsZVJvb3RDb250ZXh0IHNjb3BlKG1fcElzb2xhdGUpOwotICB2ODo6TG9jYWw8djg6OlZhbHVlPiBoVmFsdWUgPSB2ODo6T2JqZWN0OjpOZXcobV9wSXNvbGF0ZSk7Ci0gIG1faFZhbHVlLlJlc2V0KG1fcElzb2xhdGUsIGhWYWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9meGpzL2NmeGpzZV92YWx1ZS5oIGIvZnhqcy9jZnhqc2VfdmFsdWUuaAppbmRleCBmMmViZGMxLi41MmJiMDM2IDEwMDY0NAotLS0gYS9meGpzL2NmeGpzZV92YWx1ZS5oCisrKyBiL2Z4anMvY2Z4anNlX3ZhbHVlLmgKQEAgLTM1LDEyICszNSwxMiBAQAogICBib29sIElzRnVuY3Rpb24oKSBjb25zdDsKICAgYm9vbCBJc0RhdGUoKSBjb25zdDsKICAgYm9vbCBUb0Jvb2xlYW4oKSBjb25zdDsKLSAgRlhfRkxPQVQgVG9GbG9hdCgpIGNvbnN0OworICBmbG9hdCBUb0Zsb2F0KCkgY29uc3Q7CiAgIGRvdWJsZSBUb0RvdWJsZSgpIGNvbnN0OwogICBpbnQzMl90IFRvSW50ZWdlcigpIGNvbnN0OwotICBDRlhfQnl0ZVN0cmluZyBUb1N0cmluZygpIGNvbnN0OwotICBDRlhfV2lkZVN0cmluZyBUb1dpZGVTdHJpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChUb1N0cmluZygpLkFzU3RyaW5nQygpKTsKKyAgQnl0ZVN0cmluZyBUb1N0cmluZygpIGNvbnN0OworICBXaWRlU3RyaW5nIFRvV2lkZVN0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gV2lkZVN0cmluZzo6RnJvbVVURjgoVG9TdHJpbmcoKS5Bc1N0cmluZ1ZpZXcoKSk7CiAgIH0KICAgQ0ZYSlNFX0hvc3RPYmplY3QqIFRvSG9zdE9iamVjdChDRlhKU0VfQ2xhc3MqIGxwQ2xhc3MpIGNvbnN0OwogCkBAIC00OSwzMSArNDksMjUgQEAKICAgdm9pZCBTZXRCb29sZWFuKGJvb2wgYkJvb2xlYW4pOwogICB2b2lkIFNldEludGVnZXIoaW50MzJfdCBuSW50ZWdlcik7CiAgIHZvaWQgU2V0RG91YmxlKGRvdWJsZSBkRG91YmxlKTsKLSAgdm9pZCBTZXRTdHJpbmcoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelN0cmluZyk7Ci0gIHZvaWQgU2V0RmxvYXQoRlhfRkxPQVQgZkZsb2F0KTsKLSAgdm9pZCBTZXRKU09iamVjdCgpOworICB2b2lkIFNldFN0cmluZyhjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pTdHJpbmcpOworICB2b2lkIFNldEZsb2F0KGZsb2F0IGZGbG9hdCk7CiAKICAgdm9pZCBTZXRPYmplY3QoQ0ZYSlNFX0hvc3RPYmplY3QqIGxwT2JqZWN0LCBDRlhKU0VfQ2xhc3MqIHBDbGFzcyk7Ci0gIHZvaWQgU2V0SG9zdE9iamVjdChDRlhKU0VfSG9zdE9iamVjdCogbHBPYmplY3QsIENGWEpTRV9DbGFzcyogbHBDbGFzcyk7CiAgIHZvaWQgU2V0QXJyYXkoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4+JiB2YWx1ZXMpOwogICB2b2lkIFNldERhdGUoZG91YmxlIGREb3VibGUpOwogCi0gIGJvb2wgR2V0T2JqZWN0UHJvcGVydHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLAorICBib29sIEdldE9iamVjdFByb3BlcnR5KGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzelByb3BOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogbHBQcm9wVmFsdWUpOwotICBib29sIFNldE9iamVjdFByb3BlcnR5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwKKyAgYm9vbCBTZXRPYmplY3RQcm9wZXJ0eShjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pQcm9wTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKTsKICAgYm9vbCBHZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KHVpbnQzMl90IHVQcm9wSWR4LCBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKTsKICAgYm9vbCBTZXRPYmplY3RQcm9wZXJ0eSh1aW50MzJfdCB1UHJvcElkeCwgQ0ZYSlNFX1ZhbHVlKiBscFByb3BWYWx1ZSk7Ci0gIGJvb2wgRGVsZXRlT2JqZWN0UHJvcGVydHkoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lKTsKLSAgYm9vbCBIYXNPYmplY3RPd25Qcm9wZXJ0eShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsCisgIGJvb2wgRGVsZXRlT2JqZWN0UHJvcGVydHkoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6UHJvcE5hbWUpOworICBib29sIEhhc09iamVjdE93blByb3BlcnR5KGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzelByb3BOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlVzZVR5cGVHZXR0ZXIpOwotICBib29sIFNldE9iamVjdE93blByb3BlcnR5KGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwKKyAgYm9vbCBTZXRPYmplY3RPd25Qcm9wZXJ0eShjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pQcm9wTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGxwUHJvcFZhbHVlKTsKICAgYm9vbCBTZXRGdW5jdGlvbkJpbmQoQ0ZYSlNFX1ZhbHVlKiBscE9sZEZ1bmN0aW9uLCBDRlhKU0VfVmFsdWUqIGxwTmV3VGhpcyk7Ci0gIGJvb2wgQ2FsbChDRlhKU0VfVmFsdWUqIGxwUmVjZWl2ZXIsCi0gICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGxwUmV0VmFsdWUsCi0gICAgICAgICAgICB1aW50MzJfdCBuQXJnQ291bnQsCi0gICAgICAgICAgICBDRlhKU0VfVmFsdWUqKiBscEFyZ3MpOwogCiAgIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKCkgY29uc3QgeyByZXR1cm4gbV9wSXNvbGF0ZTsgfQogICBjb25zdCB2ODo6R2xvYmFsPHY4OjpWYWx1ZT4mIERpcmVjdEdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV9oVmFsdWU7IH0KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX2Fubm90LmNwcCBiL2Z4anMvY2pzX2Fubm90LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWVjY2VmCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfYW5ub3QuY3BwCkBAIC0wLDAgKzEsMTExIEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL2Nqc19hbm5vdC5oIgorCisjaW5jbHVkZSAiZnhqcy9KU19EZWZpbmUuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19ldmVudF9jb250ZXh0LmgiCisjaW5jbHVkZSAiZnhqcy9janNfb2JqZWN0LmgiCisjaW5jbHVkZSAiZnhqcy9qc19yZXNvdXJjZXMuaCIKKworbmFtZXNwYWNlIHsKKworQ1BERlNES19CQUFubm90KiBUb0JBQW5ub3QoQ1BERlNES19Bbm5vdCogYW5ub3QpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PENQREZTREtfQkFBbm5vdCo+KGFubm90KTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIENKU19Bbm5vdDo6UHJvcGVydHlTcGVjc1tdID0geworICAgIHsiaGlkZGVuIiwgZ2V0X2hpZGRlbl9zdGF0aWMsIHNldF9oaWRkZW5fc3RhdGljfSwKKyAgICB7Im5hbWUiLCBnZXRfbmFtZV9zdGF0aWMsIHNldF9uYW1lX3N0YXRpY30sCisgICAgeyJ0eXBlIiwgZ2V0X3R5cGVfc3RhdGljLCBzZXRfdHlwZV9zdGF0aWN9fTsKKworaW50IENKU19Bbm5vdDo6T2JqRGVmbklEID0gLTE7CisKKy8vIHN0YXRpYworaW50IENKU19Bbm5vdDo6R2V0T2JqRGVmbklEKCkgeworICByZXR1cm4gT2JqRGVmbklEOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0pTX0Fubm90OjpEZWZpbmVKU09iamVjdHMoQ0ZYSlNfRW5naW5lKiBwRW5naW5lKSB7CisgIE9iakRlZm5JRCA9IHBFbmdpbmUtPkRlZmluZU9iaigiQW5ub3QiLCBGWEpTT0JKVFlQRV9EWU5BTUlDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNDb25zdHJ1Y3RvcjxDSlNfQW5ub3QsIEFubm90PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTRGVzdHJ1Y3RvcjxDSlNfQW5ub3Q+KTsKKyAgRGVmaW5lUHJvcHMocEVuZ2luZSwgT2JqRGVmbklELCBQcm9wZXJ0eVNwZWNzLCBGWF9BcnJheVNpemUoUHJvcGVydHlTcGVjcykpOworfQorCitBbm5vdDo6QW5ub3QoQ0pTX09iamVjdCogcEpTT2JqZWN0KSA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpIHt9CisKK0Fubm90Ojp+QW5ub3QoKSB7fQorCitDSlNfUmV0dXJuIEFubm90OjpnZXRfaGlkZGVuKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBpZiAoIW1fcEFubm90KQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a0JhZE9iamVjdEVycm9yKSk7CisKKyAgQ1BERl9Bbm5vdCogcFBERkFubm90ID0gVG9CQUFubm90KG1fcEFubm90LkdldCgpKS0+R2V0UERGQW5ub3QoKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld0Jvb2xlYW4oCisgICAgICBDUERGX0Fubm90OjpJc0Fubm90YXRpb25IaWRkZW4ocFBERkFubm90LT5HZXRBbm5vdERpY3QoKSkpKTsKK30KKworQ0pTX1JldHVybiBBbm5vdDo6c2V0X2hpZGRlbihDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIC8vIE1heSBpbnZhbGlkYXRlIG1fcEFubm90LgorICBib29sIGJIaWRkZW4gPSBwUnVudGltZS0+VG9Cb29sZWFuKHZwKTsKKyAgaWYgKCFtX3BBbm5vdCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtCYWRPYmplY3RFcnJvcikpOworCisgIHVpbnQzMl90IGZsYWdzID0gVG9CQUFubm90KG1fcEFubm90LkdldCgpKS0+R2V0RmxhZ3MoKTsKKyAgaWYgKGJIaWRkZW4pIHsKKyAgICBmbGFncyB8PSBBTk5PVEZMQUdfSElEREVOOworICAgIGZsYWdzIHw9IEFOTk9URkxBR19JTlZJU0lCTEU7CisgICAgZmxhZ3MgfD0gQU5OT1RGTEFHX05PVklFVzsKKyAgICBmbGFncyAmPSB+QU5OT1RGTEFHX1BSSU5UOworICB9IGVsc2UgeworICAgIGZsYWdzICY9IH5BTk5PVEZMQUdfSElEREVOOworICAgIGZsYWdzICY9IH5BTk5PVEZMQUdfSU5WSVNJQkxFOworICAgIGZsYWdzICY9IH5BTk5PVEZMQUdfTk9WSUVXOworICAgIGZsYWdzIHw9IEFOTk9URkxBR19QUklOVDsKKyAgfQorICBUb0JBQW5ub3QobV9wQW5ub3QuR2V0KCkpLT5TZXRGbGFncyhmbGFncyk7CisKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQW5ub3Q6OmdldF9uYW1lKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBpZiAoIW1fcEFubm90KQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a0JhZE9iamVjdEVycm9yKSk7CisgIHJldHVybiBDSlNfUmV0dXJuKAorICAgICAgcFJ1bnRpbWUtPk5ld1N0cmluZyhUb0JBQW5ub3QobV9wQW5ub3QuR2V0KCkpLT5HZXRBbm5vdE5hbWUoKS5jX3N0cigpKSk7Cit9CisKK0NKU19SZXR1cm4gQW5ub3Q6OnNldF9uYW1lKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgLy8gTWF5IGludmFsaWRhdGUgbV9wQW5ub3QuCisgIFdpZGVTdHJpbmcgYW5ub3ROYW1lID0gcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyh2cCk7CisgIGlmICghbV9wQW5ub3QpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprQmFkT2JqZWN0RXJyb3IpKTsKKworICBUb0JBQW5ub3QobV9wQW5ub3QuR2V0KCkpLT5TZXRBbm5vdE5hbWUoYW5ub3ROYW1lKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQW5ub3Q6OmdldF90eXBlKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBpZiAoIW1fcEFubm90KQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a0JhZE9iamVjdEVycm9yKSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcoCisgICAgICBXaWRlU3RyaW5nOjpGcm9tTG9jYWwoQ1BERl9Bbm5vdDo6QW5ub3RTdWJ0eXBlVG9TdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvQkFBbm5vdChtX3BBbm5vdC5HZXQoKSktPkdldEFubm90U3VidHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY19zdHIoKSkKKyAgICAgICAgICAuY19zdHIoKSkpOworfQorCitDSlNfUmV0dXJuIEFubm90OjpzZXRfdHlwZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1JlYWRPbmx5RXJyb3IpKTsKK30KKwordm9pZCBBbm5vdDo6U2V0U0RLQW5ub3QoQ1BERlNES19CQUFubm90KiBhbm5vdCkgeworICBtX3BBbm5vdC5SZXNldChhbm5vdCk7Cit9CmRpZmYgLS1naXQgYS9meGpzL2Nqc19hbm5vdC5oIGIvZnhqcy9janNfYW5ub3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODEyNGY2Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfYW5ub3QuaApAQCAtMCwwICsxLDUwIEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19DSlNfQU5OT1RfSF8KKyNkZWZpbmUgRlhKU19DSlNfQU5OT1RfSF8KKworI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19iYWFubm90LmgiCisjaW5jbHVkZSAiZnhqcy9KU19EZWZpbmUuaCIKKworY2xhc3MgQW5ub3QgOiBwdWJsaWMgQ0pTX0VtYmVkT2JqIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEFubm90KENKU19PYmplY3QqIHBKU09iamVjdCk7CisgIH5Bbm5vdCgpIG92ZXJyaWRlOworCisgIENKU19SZXR1cm4gZ2V0X2hpZGRlbihDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9oaWRkZW4oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfbmFtZShDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9uYW1lKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X3R5cGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfdHlwZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICB2b2lkIFNldFNES0Fubm90KENQREZTREtfQkFBbm5vdCogYW5ub3QpOworCisgcHJpdmF0ZToKKyAgQ1BERlNES19Bbm5vdDo6T2JzZXJ2ZWRQdHIgbV9wQW5ub3Q7Cit9OworCitjbGFzcyBDSlNfQW5ub3QgOiBwdWJsaWMgQ0pTX09iamVjdCB7CisgcHVibGljOgorICBzdGF0aWMgaW50IEdldE9iakRlZm5JRCgpOworICBzdGF0aWMgdm9pZCBEZWZpbmVKU09iamVjdHMoQ0ZYSlNfRW5naW5lKiBwRW5naW5lKTsKKworICBleHBsaWNpdCBDSlNfQW5ub3Qodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQorICB+Q0pTX0Fubm90KCkgb3ZlcnJpZGUge30KKworICBKU19TVEFUSUNfUFJPUChoaWRkZW4sIGhpZGRlbiwgQW5ub3QpOworICBKU19TVEFUSUNfUFJPUChuYW1lLCBuYW1lLCBBbm5vdCk7CisgIEpTX1NUQVRJQ19QUk9QKHR5cGUsIHR5cGUsIEFubm90KTsKKworIHByaXZhdGU6CisgIHN0YXRpYyBpbnQgT2JqRGVmbklEOworICBzdGF0aWMgY29uc3QgSlNQcm9wZXJ0eVNwZWMgUHJvcGVydHlTcGVjc1tdOworfTsKKworI2VuZGlmICAvLyBGWEpTX0NKU19BTk5PVF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy9janNfYXBwLmNwcCBiL2Z4anMvY2pzX2FwcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjYWMyMgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2pzX2FwcC5jcHAKQEAgLTAsMCArMSw1NzcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMvY2pzX2FwcC5oIgorCisjaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX2ludGVyZm9ybS5oIgorI2luY2x1ZGUgImZ4anMvY2pzX2RvY3VtZW50LmgiCisjaW5jbHVkZSAiZnhqcy9janNfdGltZXJvYmouaCIKKyNpbmNsdWRlICJmeGpzL2dsb2JhbF90aW1lci5oIgorI2luY2x1ZGUgImZ4anMvaWpzX2V2ZW50X2NvbnRleHQuaCIKKyNpbmNsdWRlICJmeGpzL2pzX3Jlc291cmNlcy5oIgorCituYW1lc3BhY2UgeworCitib29sIElzVHlwZUtub3duKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlKSB7CisgIHJldHVybiAhdmFsdWUuSXNFbXB0eSgpICYmCisgICAgICAgICAodmFsdWUtPklzU3RyaW5nKCkgfHwgdmFsdWUtPklzTnVtYmVyKCkgfHwgdmFsdWUtPklzQm9vbGVhbigpIHx8CisgICAgICAgICAgdmFsdWUtPklzRGF0ZSgpIHx8IHZhbHVlLT5Jc09iamVjdCgpIHx8IHZhbHVlLT5Jc051bGwoKSB8fAorICAgICAgICAgIHZhbHVlLT5Jc1VuZGVmaW5lZCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKyNkZWZpbmUgSlNfU1RSX1ZJRVdFUlRZUEUgTCJwZGZpdW0iCisjZGVmaW5lIEpTX1NUUl9WSUVXRVJWQVJJQVRJT04gTCJGdWxsIgorI2RlZmluZSBKU19TVFJfUExBVEZPUk0gTCJXSU4iCisjZGVmaW5lIEpTX1NUUl9MQU5HVUFHRSBMIkVOVSIKKyNkZWZpbmUgSlNfTlVNX1ZJRVdFUlZFUlNJT04gOAorI2lmZGVmIFBERl9FTkFCTEVfWEZBCisjZGVmaW5lIEpTX05VTV9WSUVXRVJWRVJTSU9OX1hGQSAxMQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorI2RlZmluZSBKU19OVU1fRk9STVNWRVJTSU9OIDcKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgQ0pTX0FwcDo6UHJvcGVydHlTcGVjc1tdID0geworICAgIHsiYWN0aXZlRG9jcyIsIGdldF9hY3RpdmVfZG9jc19zdGF0aWMsIHNldF9hY3RpdmVfZG9jc19zdGF0aWN9LAorICAgIHsiY2FsY3VsYXRlIiwgZ2V0X2NhbGN1bGF0ZV9zdGF0aWMsIHNldF9jYWxjdWxhdGVfc3RhdGljfSwKKyAgICB7ImZvcm1zVmVyc2lvbiIsIGdldF9mb3Jtc192ZXJzaW9uX3N0YXRpYywgc2V0X2Zvcm1zX3ZlcnNpb25fc3RhdGljfSwKKyAgICB7ImZzIiwgZ2V0X2ZzX3N0YXRpYywgc2V0X2ZzX3N0YXRpY30sCisgICAgeyJmdWxsc2NyZWVuIiwgZ2V0X2Z1bGxzY3JlZW5fc3RhdGljLCBzZXRfZnVsbHNjcmVlbl9zdGF0aWN9LAorICAgIHsibGFuZ3VhZ2UiLCBnZXRfbGFuZ3VhZ2Vfc3RhdGljLCBzZXRfbGFuZ3VhZ2Vfc3RhdGljfSwKKyAgICB7Im1lZGlhIiwgZ2V0X21lZGlhX3N0YXRpYywgc2V0X21lZGlhX3N0YXRpY30sCisgICAgeyJwbGF0Zm9ybSIsIGdldF9wbGF0Zm9ybV9zdGF0aWMsIHNldF9wbGF0Zm9ybV9zdGF0aWN9LAorICAgIHsicnVudGltZUhpZ2hsaWdodCIsIGdldF9ydW50aW1lX2hpZ2hsaWdodF9zdGF0aWMsCisgICAgIHNldF9ydW50aW1lX2hpZ2hsaWdodF9zdGF0aWN9LAorICAgIHsidmlld2VyVHlwZSIsIGdldF92aWV3ZXJfdHlwZV9zdGF0aWMsIHNldF92aWV3ZXJfdHlwZV9zdGF0aWN9LAorICAgIHsidmlld2VyVmFyaWF0aW9uIiwgZ2V0X3ZpZXdlcl92YXJpYXRpb25fc3RhdGljLAorICAgICBzZXRfdmlld2VyX3ZhcmlhdGlvbl9zdGF0aWN9LAorICAgIHsidmlld2VyVmVyc2lvbiIsIGdldF92aWV3ZXJfdmVyc2lvbl9zdGF0aWMsIHNldF92aWV3ZXJfdmVyc2lvbl9zdGF0aWN9fTsKKworY29uc3QgSlNNZXRob2RTcGVjIENKU19BcHA6Ok1ldGhvZFNwZWNzW10gPSB7CisgICAgeyJhbGVydCIsIGFsZXJ0X3N0YXRpY30sCisgICAgeyJiZWVwIiwgYmVlcF9zdGF0aWN9LAorICAgIHsiYnJvd3NlRm9yRG9jIiwgYnJvd3NlRm9yRG9jX3N0YXRpY30sCisgICAgeyJjbGVhckludGVydmFsIiwgY2xlYXJJbnRlcnZhbF9zdGF0aWN9LAorICAgIHsiY2xlYXJUaW1lT3V0IiwgY2xlYXJUaW1lT3V0X3N0YXRpY30sCisgICAgeyJleGVjRGlhbG9nIiwgZXhlY0RpYWxvZ19zdGF0aWN9LAorICAgIHsiZXhlY01lbnVJdGVtIiwgZXhlY01lbnVJdGVtX3N0YXRpY30sCisgICAgeyJmaW5kQ29tcG9uZW50IiwgZmluZENvbXBvbmVudF9zdGF0aWN9LAorICAgIHsiZ29CYWNrIiwgZ29CYWNrX3N0YXRpY30sCisgICAgeyJnb0ZvcndhcmQiLCBnb0ZvcndhcmRfc3RhdGljfSwKKyAgICB7ImxhdW5jaFVSTCIsIGxhdW5jaFVSTF9zdGF0aWN9LAorICAgIHsibWFpbE1zZyIsIG1haWxNc2dfc3RhdGljfSwKKyAgICB7Im5ld0ZERiIsIG5ld0ZERl9zdGF0aWN9LAorICAgIHsibmV3RG9jIiwgbmV3RG9jX3N0YXRpY30sCisgICAgeyJvcGVuRG9jIiwgb3BlbkRvY19zdGF0aWN9LAorICAgIHsib3BlbkZERiIsIG9wZW5GREZfc3RhdGljfSwKKyAgICB7InBvcFVwTWVudUV4IiwgcG9wVXBNZW51RXhfc3RhdGljfSwKKyAgICB7InBvcFVwTWVudSIsIHBvcFVwTWVudV9zdGF0aWN9LAorICAgIHsicmVzcG9uc2UiLCByZXNwb25zZV9zdGF0aWN9LAorICAgIHsic2V0SW50ZXJ2YWwiLCBzZXRJbnRlcnZhbF9zdGF0aWN9LAorICAgIHsic2V0VGltZU91dCIsIHNldFRpbWVPdXRfc3RhdGljfX07CisKK2ludCBDSlNfQXBwOjpPYmpEZWZuSUQgPSAtMTsKKworLy8gc3RhdGljCit2b2lkIENKU19BcHA6OkRlZmluZUpTT2JqZWN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUpIHsKKyAgT2JqRGVmbklEID0KKyAgICAgIHBFbmdpbmUtPkRlZmluZU9iaigiYXBwIiwgRlhKU09CSlRZUEVfU1RBVElDLCBKU0NvbnN0cnVjdG9yPENKU19BcHAsIGFwcD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgSlNEZXN0cnVjdG9yPENKU19BcHA+KTsKKyAgRGVmaW5lUHJvcHMocEVuZ2luZSwgT2JqRGVmbklELCBQcm9wZXJ0eVNwZWNzLCBGWF9BcnJheVNpemUoUHJvcGVydHlTcGVjcykpOworICBEZWZpbmVNZXRob2RzKHBFbmdpbmUsIE9iakRlZm5JRCwgTWV0aG9kU3BlY3MsIEZYX0FycmF5U2l6ZShNZXRob2RTcGVjcykpOworfQorCithcHA6OmFwcChDSlNfT2JqZWN0KiBwSlNPYmplY3QpCisgICAgOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KSwgbV9iQ2FsY3VsYXRlKHRydWUpLCBtX2JSdW50aW1lSGlnaExpZ2h0KGZhbHNlKSB7fQorCithcHA6On5hcHAoKSB7fQorCitDSlNfUmV0dXJuIGFwcDo6Z2V0X2FjdGl2ZV9kb2NzKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBDSlNfRG9jdW1lbnQqIHBKU0RvY3VtZW50ID0gbnVsbHB0cjsKKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmogPSBwUnVudGltZS0+R2V0VGhpc09iaigpOworICBpZiAoQ0ZYSlNfRW5naW5lOjpHZXRPYmpEZWZuSUQocE9iaikgPT0gQ0pTX0RvY3VtZW50OjpHZXRPYmpEZWZuSUQoKSkKKyAgICBwSlNEb2N1bWVudCA9IHN0YXRpY19jYXN0PENKU19Eb2N1bWVudCo+KHBSdW50aW1lLT5HZXRPYmplY3RQcml2YXRlKHBPYmopKTsKKworICB2ODo6TG9jYWw8djg6OkFycmF5PiBhRG9jcyA9IHBSdW50aW1lLT5OZXdBcnJheSgpOworICBwUnVudGltZS0+UHV0QXJyYXlFbGVtZW50KAorICAgICAgYURvY3MsIDAsCisgICAgICBwSlNEb2N1bWVudCA/IHY4OjpMb2NhbDx2ODo6VmFsdWU+KHBKU0RvY3VtZW50LT5Ub1Y4T2JqZWN0KCkpCisgICAgICAgICAgICAgICAgICA6IHY4OjpMb2NhbDx2ODo6VmFsdWU+KCkpOworICBpZiAocFJ1bnRpbWUtPkdldEFycmF5TGVuZ3RoKGFEb2NzKSA+IDApCisgICAgcmV0dXJuIENKU19SZXR1cm4oYURvY3MpOworICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3VW5kZWZpbmVkKCkpOworfQorCitDSlNfUmV0dXJuIGFwcDo6c2V0X2FjdGl2ZV9kb2NzKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworfQorCitDSlNfUmV0dXJuIGFwcDo6Z2V0X2NhbGN1bGF0ZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld0Jvb2xlYW4obV9iQ2FsY3VsYXRlKSk7Cit9CisKK0NKU19SZXR1cm4gYXBwOjpzZXRfY2FsY3VsYXRlKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgbV9iQ2FsY3VsYXRlID0gcFJ1bnRpbWUtPlRvQm9vbGVhbih2cCk7CisgIHBSdW50aW1lLT5HZXRGb3JtRmlsbEVudigpLT5HZXRJbnRlckZvcm0oKS0+RW5hYmxlQ2FsY3VsYXRlKG1fYkNhbGN1bGF0ZSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIGFwcDo6Z2V0X2Zvcm1zX3ZlcnNpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdOdW1iZXIoSlNfTlVNX0ZPUk1TVkVSU0lPTikpOworfQorCitDSlNfUmV0dXJuIGFwcDo6c2V0X2Zvcm1zX3ZlcnNpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBhcHA6OmdldF92aWV3ZXJfdHlwZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1N0cmluZyhKU19TVFJfVklFV0VSVFlQRSkpOworfQorCitDSlNfUmV0dXJuIGFwcDo6c2V0X3ZpZXdlcl90eXBlKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworfQorCitDSlNfUmV0dXJuIGFwcDo6Z2V0X3ZpZXdlcl92YXJpYXRpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcoSlNfU1RSX1ZJRVdFUlZBUklBVElPTikpOworfQorCitDSlNfUmV0dXJuIGFwcDo6c2V0X3ZpZXdlcl92YXJpYXRpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBhcHA6OmdldF92aWV3ZXJfdmVyc2lvbihDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBDUERGWEZBX0NvbnRleHQqIHBYRkFDb250ZXh0ID0gcFJ1bnRpbWUtPkdldEZvcm1GaWxsRW52KCktPkdldFhGQUNvbnRleHQoKTsKKyAgaWYgKHBYRkFDb250ZXh0LT5Db250YWluc1hGQUZvcm0oKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3TnVtYmVyKEpTX05VTV9WSUVXRVJWRVJTSU9OX1hGQSkpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3TnVtYmVyKEpTX05VTV9WSUVXRVJWRVJTSU9OKSk7Cit9CisKK0NKU19SZXR1cm4gYXBwOjpzZXRfdmlld2VyX3ZlcnNpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7Cit9CisKK0NKU19SZXR1cm4gYXBwOjpnZXRfcGxhdGZvcm0oQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYgPSBwUnVudGltZS0+R2V0Rm9ybUZpbGxFbnYoKTsKKyAgaWYgKCFwRm9ybUZpbGxFbnYpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIFdpZGVTdHJpbmcgcGxhdGZyb20gPSBwRm9ybUZpbGxFbnYtPkdldFBsYXRmb3JtKCk7CisgIGlmICghcGxhdGZyb20uSXNFbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcocGxhdGZyb20uY19zdHIoKSkpOworI2VuZGlmCisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcoSlNfU1RSX1BMQVRGT1JNKSk7Cit9CisKK0NKU19SZXR1cm4gYXBwOjpzZXRfcGxhdGZvcm0oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7Cit9CisKK0NKU19SZXR1cm4gYXBwOjpnZXRfbGFuZ3VhZ2UoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYgPSBwUnVudGltZS0+R2V0Rm9ybUZpbGxFbnYoKTsKKyAgaWYgKCFwRm9ybUZpbGxFbnYpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIFdpZGVTdHJpbmcgbGFuZ3VhZ2UgPSBwRm9ybUZpbGxFbnYtPkdldExhbmd1YWdlKCk7CisgIGlmICghbGFuZ3VhZ2UuSXNFbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcobGFuZ3VhZ2UuY19zdHIoKSkpOworI2VuZGlmCisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcoSlNfU1RSX0xBTkdVQUdFKSk7Cit9CisKK0NKU19SZXR1cm4gYXBwOjpzZXRfbGFuZ3VhZ2UoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7Cit9CisKKy8vIGNyZWF0ZXMgYSBuZXcgZmRmIG9iamVjdCB0aGF0IGNvbnRhaW5zIG5vIGRhdGEKKy8vIGNvbW1lbnQ6IG5lZWQgcmVhZGVyIHN1cHBvcnQKKy8vIG5vdGU6CisvLyBDRkRGX0RvY3VtZW50ICogQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpOZXdGREYoKTsKK0NKU19SZXR1cm4gYXBwOjpuZXdGREYoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworLy8gb3BlbnMgYSBzcGVjaWZpZWQgcGRmIGRvY3VtZW50IGFuZCByZXR1cm5zIGl0cyBkb2N1bWVudCBvYmplY3QKKy8vIGNvbW1lbnQ6bmVlZCByZWFkZXIgc3VwcG9ydAorLy8gbm90ZTogYXMgZGVmaW5lZCBpbiBqcyByZWZlcmVuY2UsIHRoZSBwcm90byBvZiB0aGlzIGZ1bmN0aW9uJ3MgZm91cnRoCisvLyBwYXJtZXRlcnMsIGhvdyBvbGQgYW4gZmRmIGRvY3VtZW50IHdoaWxlIGRvIG5vdCBzaG93IGl0LgorLy8gQ0ZERl9Eb2N1bWVudCAqIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6T3BlbkZERihzdHJpbmcgc3RyUGF0aCxib29sCisvLyBiVXNlckNvbnYpOworCitDSlNfUmV0dXJuIGFwcDo6b3BlbkZERihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBhcHA6OmFsZXJ0KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4gbmV3UGFyYW1zID0gRXhwYW5kS2V5d29yZFBhcmFtcygKKyAgICAgIHBSdW50aW1lLCBwYXJhbXMsIDQsIEwiY01zZyIsIEwibkljb24iLCBMIm5UeXBlIiwgTCJjVGl0bGUiKTsKKworICBpZiAoIUlzVHlwZUtub3duKG5ld1BhcmFtc1swXSkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52ID0gcFJ1bnRpbWUtPkdldEZvcm1GaWxsRW52KCk7CisgIGlmICghcEZvcm1GaWxsRW52KQorICAgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdOdW1iZXIoMCkpOworCisgIFdpZGVTdHJpbmcgc3dNc2c7CisgIGlmIChuZXdQYXJhbXNbMF0tPklzQXJyYXkoKSkgeworICAgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IGNhcnJheSA9IHBSdW50aW1lLT5Ub0FycmF5KG5ld1BhcmFtc1swXSk7CisgICAgc3dNc2cgPSBMIlsiOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcFJ1bnRpbWUtPkdldEFycmF5TGVuZ3RoKGNhcnJheSk7ICsraSkgeworICAgICAgaWYgKGkpCisgICAgICAgIHN3TXNnICs9IEwiLCAiOworCisgICAgICBzd01zZyArPSBwUnVudGltZS0+VG9XaWRlU3RyaW5nKHBSdW50aW1lLT5HZXRBcnJheUVsZW1lbnQoY2FycmF5LCBpKSk7CisgICAgfQorICAgIHN3TXNnICs9IEwiXSI7CisgIH0gZWxzZSB7CisgICAgc3dNc2cgPSBwUnVudGltZS0+VG9XaWRlU3RyaW5nKG5ld1BhcmFtc1swXSk7CisgIH0KKworICBpbnQgaUljb24gPSAwOworICBpZiAoSXNUeXBlS25vd24obmV3UGFyYW1zWzFdKSkKKyAgICBpSWNvbiA9IHBSdW50aW1lLT5Ub0ludDMyKG5ld1BhcmFtc1sxXSk7CisKKyAgaW50IGlUeXBlID0gMDsKKyAgaWYgKElzVHlwZUtub3duKG5ld1BhcmFtc1syXSkpCisgICAgaVR5cGUgPSBwUnVudGltZS0+VG9JbnQzMihuZXdQYXJhbXNbMl0pOworCisgIFdpZGVTdHJpbmcgc3dUaXRsZTsKKyAgaWYgKElzVHlwZUtub3duKG5ld1BhcmFtc1szXSkpCisgICAgc3dUaXRsZSA9IHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcobmV3UGFyYW1zWzNdKTsKKyAgZWxzZQorICAgIHN3VGl0bGUgPSBKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtBbGVydCk7CisKKyAgcFJ1bnRpbWUtPkJlZ2luQmxvY2soKTsKKyAgcEZvcm1GaWxsRW52LT5LaWxsRm9jdXNBbm5vdCgwKTsKKworICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXQgPSBwUnVudGltZS0+TmV3TnVtYmVyKAorICAgICAgcEZvcm1GaWxsRW52LT5KU19hcHBBbGVydChzd01zZy5jX3N0cigpLCBzd1RpdGxlLmNfc3RyKCksIGlUeXBlLCBpSWNvbikpOworICBwUnVudGltZS0+RW5kQmxvY2soKTsKKworICByZXR1cm4gQ0pTX1JldHVybihyZXQpOworfQorCitDSlNfUmV0dXJuIGFwcDo6YmVlcChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSA9PSAxKSB7CisgICAgcFJ1bnRpbWUtPkdldEZvcm1GaWxsRW52KCktPkpTX2FwcEJlZXAocFJ1bnRpbWUtPlRvSW50MzIocGFyYW1zWzBdKSk7CisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisgIH0KKyAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworfQorCitDSlNfUmV0dXJuIGFwcDo6ZmluZENvbXBvbmVudChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBhcHA6OnBvcFVwTWVudUV4KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7Cit9CisKK0NKU19SZXR1cm4gYXBwOjpnZXRfZnMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBhcHA6OnNldF9mcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBhcHA6OnNldEludGVydmFsKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSA+IDIgfHwgcGFyYW1zLnNpemUoKSA9PSAwKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBXaWRlU3RyaW5nIHNjcmlwdCA9CisgICAgICBwYXJhbXMuc2l6ZSgpID4gMCA/IHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzBdKSA6IEwiIjsKKyAgaWYgKHNjcmlwdC5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprSW52YWxpZElucHV0RXJyb3IpKTsKKworICB1aW50MzJfdCBkd0ludGVydmFsID0gcGFyYW1zLnNpemUoKSA+IDEgPyBwUnVudGltZS0+VG9JbnQzMihwYXJhbXNbMV0pIDogMTAwMDsKKyAgR2xvYmFsVGltZXIqIHRpbWVyUmVmID0gbmV3IEdsb2JhbFRpbWVyKHRoaXMsIHBSdW50aW1lLT5HZXRGb3JtRmlsbEVudigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bnRpbWUsIDAsIHNjcmlwdCwgZHdJbnRlcnZhbCwgMCk7CisgIG1fVGltZXJzLmluc2VydChzdGQ6OnVuaXF1ZV9wdHI8R2xvYmFsVGltZXI+KHRpbWVyUmVmKSk7CisKKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBSZXRPYmogPQorICAgICAgcFJ1bnRpbWUtPk5ld0Z4RHluYW1pY09iaihDSlNfVGltZXJPYmo6OkdldE9iakRlZm5JRCgpKTsKKyAgaWYgKHBSZXRPYmouSXNFbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDSlNfVGltZXJPYmoqIHBKU19UaW1lck9iaiA9CisgICAgICBzdGF0aWNfY2FzdDxDSlNfVGltZXJPYmoqPihwUnVudGltZS0+R2V0T2JqZWN0UHJpdmF0ZShwUmV0T2JqKSk7CisgIFRpbWVyT2JqKiBwVGltZXJPYmogPSBzdGF0aWNfY2FzdDxUaW1lck9iaio+KHBKU19UaW1lck9iai0+R2V0RW1iZWRPYmplY3QoKSk7CisgIHBUaW1lck9iai0+U2V0VGltZXIodGltZXJSZWYpOworCisgIHJldHVybiBDSlNfUmV0dXJuKHBSZXRPYmopOworfQorCitDSlNfUmV0dXJuIGFwcDo6c2V0VGltZU91dChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSA+IDIgfHwgcGFyYW1zLnNpemUoKSA9PSAwKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBXaWRlU3RyaW5nIHNjcmlwdCA9IHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzBdKTsKKyAgaWYgKHNjcmlwdC5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprSW52YWxpZElucHV0RXJyb3IpKTsKKworICB1aW50MzJfdCBkd1RpbWVPdXQgPSBwYXJhbXMuc2l6ZSgpID4gMSA/IHBSdW50aW1lLT5Ub0ludDMyKHBhcmFtc1sxXSkgOiAxMDAwOworICBHbG9iYWxUaW1lciogdGltZXJSZWYgPQorICAgICAgbmV3IEdsb2JhbFRpbWVyKHRoaXMsIHBSdW50aW1lLT5HZXRGb3JtRmlsbEVudigpLCBwUnVudGltZSwgMSwgc2NyaXB0LAorICAgICAgICAgICAgICAgICAgICAgIGR3VGltZU91dCwgZHdUaW1lT3V0KTsKKyAgbV9UaW1lcnMuaW5zZXJ0KHN0ZDo6dW5pcXVlX3B0cjxHbG9iYWxUaW1lcj4odGltZXJSZWYpKTsKKworICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcFJldE9iaiA9CisgICAgICBwUnVudGltZS0+TmV3RnhEeW5hbWljT2JqKENKU19UaW1lck9iajo6R2V0T2JqRGVmbklEKCkpOworICBpZiAocFJldE9iai5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENKU19UaW1lck9iaiogcEpTX1RpbWVyT2JqID0KKyAgICAgIHN0YXRpY19jYXN0PENKU19UaW1lck9iaio+KHBSdW50aW1lLT5HZXRPYmplY3RQcml2YXRlKHBSZXRPYmopKTsKKyAgVGltZXJPYmoqIHBUaW1lck9iaiA9IHN0YXRpY19jYXN0PFRpbWVyT2JqKj4ocEpTX1RpbWVyT2JqLT5HZXRFbWJlZE9iamVjdCgpKTsKKyAgcFRpbWVyT2JqLT5TZXRUaW1lcih0aW1lclJlZik7CisKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJldE9iaik7Cit9CisKK0NKU19SZXR1cm4gYXBwOjpjbGVhclRpbWVPdXQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBhcHA6OkNsZWFyVGltZXJDb21tb24ocFJ1bnRpbWUsIHBhcmFtc1swXSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIGFwcDo6Y2xlYXJJbnRlcnZhbChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBhcHA6OkNsZWFyVGltZXJDb21tb24ocFJ1bnRpbWUsIHBhcmFtc1swXSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCit2b2lkIGFwcDo6Q2xlYXJUaW1lckNvbW1vbihDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBhcmFtKSB7CisgIGlmICghcGFyYW0tPklzT2JqZWN0KCkpCisgICAgcmV0dXJuOworCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqID0gcFJ1bnRpbWUtPlRvT2JqZWN0KHBhcmFtKTsKKyAgaWYgKENGWEpTX0VuZ2luZTo6R2V0T2JqRGVmbklEKHBPYmopICE9IENKU19UaW1lck9iajo6R2V0T2JqRGVmbklEKCkpCisgICAgcmV0dXJuOworCisgIENKU19PYmplY3QqIHBKU09iaiA9CisgICAgICBzdGF0aWNfY2FzdDxDSlNfT2JqZWN0Kj4ocFJ1bnRpbWUtPkdldE9iamVjdFByaXZhdGUocE9iaikpOworICBpZiAoIXBKU09iaikKKyAgICByZXR1cm47CisKKyAgVGltZXJPYmoqIHBUaW1lck9iaiA9IHN0YXRpY19jYXN0PFRpbWVyT2JqKj4ocEpTT2JqLT5HZXRFbWJlZE9iamVjdCgpKTsKKyAgaWYgKCFwVGltZXJPYmopCisgICAgcmV0dXJuOworCisgIEdsb2JhbFRpbWVyOjpDYW5jZWwocFRpbWVyT2JqLT5HZXRUaW1lcklEKCkpOworfQorCitDSlNfUmV0dXJuIGFwcDo6ZXhlY01lbnVJdGVtKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworfQorCit2b2lkIGFwcDo6VGltZXJQcm9jKEdsb2JhbFRpbWVyKiBwVGltZXIpIHsKKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gcFRpbWVyLT5HZXRSdW50aW1lKCk7CisgIGlmIChwUnVudGltZSAmJiAoIXBUaW1lci0+SXNPbmVTaG90KCkgfHwgcFRpbWVyLT5HZXRUaW1lT3V0KCkgPiAwKSkKKyAgICBSdW5Kc1NjcmlwdChwUnVudGltZSwgcFRpbWVyLT5HZXRKU2NyaXB0KCkpOworfQorCit2b2lkIGFwcDo6Q2FuY2VsUHJvYyhHbG9iYWxUaW1lciogcFRpbWVyKSB7CisgIG1fVGltZXJzLmVyYXNlKHBkZml1bTo6RmFrZVVuaXF1ZVB0cjxHbG9iYWxUaW1lcj4ocFRpbWVyKSk7Cit9CisKK3ZvaWQgYXBwOjpSdW5Kc1NjcmlwdChDSlNfUnVudGltZSogcFJ1bnRpbWUsIGNvbnN0IFdpZGVTdHJpbmcmIHdzU2NyaXB0KSB7CisgIGlmICghcFJ1bnRpbWUtPklzQmxvY2tpbmcoKSkgeworICAgIElKU19FdmVudENvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPk5ld0V2ZW50Q29udGV4dCgpOworICAgIHBDb250ZXh0LT5PbkV4dGVybmFsX0V4ZWMoKTsKKyAgICBXaWRlU3RyaW5nIHd0SW5mbzsKKyAgICBwQ29udGV4dC0+UnVuU2NyaXB0KHdzU2NyaXB0LCAmd3RJbmZvKTsKKyAgICBwUnVudGltZS0+UmVsZWFzZUV2ZW50Q29udGV4dChwQ29udGV4dCk7CisgIH0KK30KKworQ0pTX1JldHVybiBhcHA6OmdvQmFjayhDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIC8vIE5vdCBzdXBwb3J0ZWQuCisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIGFwcDo6Z29Gb3J3YXJkKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gYXBwOjptYWlsTXNnKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiBuZXdQYXJhbXMgPQorICAgICAgRXhwYW5kS2V5d29yZFBhcmFtcyhwUnVudGltZSwgcGFyYW1zLCA2LCBMImJVSSIsIEwiY1RvIiwgTCJjQ2MiLCBMImNCY2MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMImNTdWJqZWN0IiwgTCJjTXNnIik7CisKKyAgaWYgKCFJc1R5cGVLbm93bihuZXdQYXJhbXNbMF0pKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBib29sIGJVSSA9IHBSdW50aW1lLT5Ub0Jvb2xlYW4obmV3UGFyYW1zWzBdKTsKKyAgV2lkZVN0cmluZyBjVG87CisgIGlmIChJc1R5cGVLbm93bihuZXdQYXJhbXNbMV0pKSB7CisgICAgY1RvID0gcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhuZXdQYXJhbXNbMV0pOworICB9IGVsc2UgeworICAgIC8vIGNUbyBwYXJhbWV0ZXIgcmVxdWlyZWQgd2hlbiBVSSBub3QgaW52b2tlZC4KKyAgICBpZiAoIWJVSSkKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKyAgfQorCisgIFdpZGVTdHJpbmcgY0NjOworICBpZiAoSXNUeXBlS25vd24obmV3UGFyYW1zWzJdKSkKKyAgICBjQ2MgPSBwUnVudGltZS0+VG9XaWRlU3RyaW5nKG5ld1BhcmFtc1syXSk7CisKKyAgV2lkZVN0cmluZyBjQmNjOworICBpZiAoSXNUeXBlS25vd24obmV3UGFyYW1zWzNdKSkKKyAgICBjQmNjID0gcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhuZXdQYXJhbXNbM10pOworCisgIFdpZGVTdHJpbmcgY1N1YmplY3Q7CisgIGlmIChJc1R5cGVLbm93bihuZXdQYXJhbXNbNF0pKQorICAgIGNTdWJqZWN0ID0gcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhuZXdQYXJhbXNbNF0pOworCisgIFdpZGVTdHJpbmcgY01zZzsKKyAgaWYgKElzVHlwZUtub3duKG5ld1BhcmFtc1s1XSkpCisgICAgY01zZyA9IHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcobmV3UGFyYW1zWzVdKTsKKworICBwUnVudGltZS0+QmVnaW5CbG9jaygpOworICBwUnVudGltZS0+R2V0Rm9ybUZpbGxFbnYoKS0+SlNfZG9jbWFpbEZvcm0obnVsbHB0ciwgMCwgYlVJLCBjVG8uY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNTdWJqZWN0LmNfc3RyKCksIGNDYy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY0JjYy5jX3N0cigpLCBjTXNnLmNfc3RyKCkpOworICBwUnVudGltZS0+RW5kQmxvY2soKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gYXBwOjpsYXVuY2hVUkwoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIGFwcDo6Z2V0X3J1bnRpbWVfaGlnaGxpZ2h0KENKU19SdW50aW1lKiBwUnVudGltZSkgeworICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3Qm9vbGVhbihtX2JSdW50aW1lSGlnaExpZ2h0KSk7Cit9CisKK0NKU19SZXR1cm4gYXBwOjpzZXRfcnVudGltZV9oaWdobGlnaHQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICBtX2JSdW50aW1lSGlnaExpZ2h0ID0gcFJ1bnRpbWUtPlRvQm9vbGVhbih2cCk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIGFwcDo6Z2V0X2Z1bGxzY3JlZW4oQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBhcHA6OnNldF9mdWxsc2NyZWVuKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworfQorCitDSlNfUmV0dXJuIGFwcDo6cG9wVXBNZW51KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworfQorCitDSlNfUmV0dXJuIGFwcDo6YnJvd3NlRm9yRG9jKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgorICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworV2lkZVN0cmluZyBhcHA6OlN5c1BhdGhUb1BERlBhdGgoY29uc3QgV2lkZVN0cmluZyYgc09sZFBhdGgpIHsKKyAgV2lkZVN0cmluZyBzUmV0ID0gTCIvIjsKKyAgZm9yIChjb25zdCB3Y2hhcl90JiBjIDogc09sZFBhdGgpIHsKKyAgICBpZiAoYyAhPSBMJzonKQorICAgICAgc1JldCArPSAoYyA9PSBMJ1xcJykgPyBMJy8nIDogYzsKKyAgfQorICByZXR1cm4gc1JldDsKK30KKworQ0pTX1JldHVybiBhcHA6Om5ld0RvYyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBhcHA6Om9wZW5Eb2MoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworfQorCitDSlNfUmV0dXJuIGFwcDo6cmVzcG9uc2UoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiBuZXdQYXJhbXMgPQorICAgICAgRXhwYW5kS2V5d29yZFBhcmFtcyhwUnVudGltZSwgcGFyYW1zLCA1LCBMImNRdWVzdGlvbiIsIEwiY1RpdGxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTCJjRGVmYXVsdCIsIEwiYlBhc3N3b3JkIiwgTCJjTGFiZWwiKTsKKworICBpZiAoIUlzVHlwZUtub3duKG5ld1BhcmFtc1swXSkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIFdpZGVTdHJpbmcgc3dRdWVzdGlvbiA9IHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcobmV3UGFyYW1zWzBdKTsKKyAgV2lkZVN0cmluZyBzd1RpdGxlID0gTCJQREYiOworICBpZiAoSXNUeXBlS25vd24obmV3UGFyYW1zWzFdKSkKKyAgICBzd1RpdGxlID0gcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhuZXdQYXJhbXNbMV0pOworCisgIFdpZGVTdHJpbmcgc3dEZWZhdWx0OworICBpZiAoSXNUeXBlS25vd24obmV3UGFyYW1zWzJdKSkKKyAgICBzd0RlZmF1bHQgPSBwUnVudGltZS0+VG9XaWRlU3RyaW5nKG5ld1BhcmFtc1syXSk7CisKKyAgYm9vbCBiUGFzc3dvcmQgPSBmYWxzZTsKKyAgaWYgKElzVHlwZUtub3duKG5ld1BhcmFtc1szXSkpCisgICAgYlBhc3N3b3JkID0gcFJ1bnRpbWUtPlRvQm9vbGVhbihuZXdQYXJhbXNbM10pOworCisgIFdpZGVTdHJpbmcgc3dMYWJlbDsKKyAgaWYgKElzVHlwZUtub3duKG5ld1BhcmFtc1s0XSkpCisgICAgc3dMYWJlbCA9IHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcobmV3UGFyYW1zWzRdKTsKKworICBjb25zdCBpbnQgTUFYX0lOUFVUX0JZVEVTID0gMjA0ODsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcEJ1ZmYoTUFYX0lOUFVUX0JZVEVTICsgMik7CisgIGludCBuTGVuZ3RoQnl0ZXMgPSBwUnVudGltZS0+R2V0Rm9ybUZpbGxFbnYoKS0+SlNfYXBwUmVzcG9uc2UoCisgICAgICBzd1F1ZXN0aW9uLmNfc3RyKCksIHN3VGl0bGUuY19zdHIoKSwgc3dEZWZhdWx0LmNfc3RyKCksIHN3TGFiZWwuY19zdHIoKSwKKyAgICAgIGJQYXNzd29yZCwgcEJ1ZmYuZGF0YSgpLCBNQVhfSU5QVVRfQllURVMpOworCisgIGlmIChuTGVuZ3RoQnl0ZXMgPCAwIHx8IG5MZW5ndGhCeXRlcyA+IE1BWF9JTlBVVF9CWVRFUykKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbVRvb0xvbmdFcnJvcikpOworCisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcoCisgICAgICBXaWRlU3RyaW5nOjpGcm9tVVRGMTZMRShyZWludGVycHJldF9jYXN0PHVpbnQxNl90Kj4ocEJ1ZmYuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5MZW5ndGhCeXRlcyAvIHNpemVvZih1aW50MTZfdCkpCisgICAgICAgICAgLmNfc3RyKCkpKTsKK30KKworQ0pTX1JldHVybiBhcHA6OmdldF9tZWRpYShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworfQorCitDSlNfUmV0dXJuIGFwcDo6c2V0X21lZGlhKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworfQorCitDSlNfUmV0dXJuIGFwcDo6ZXhlY0RpYWxvZyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX2FwcC5oIGIvZnhqcy9janNfYXBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAzYzcwNQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2pzX2FwcC5oCkBAIC0wLDAgKzEsMTY5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19DSlNfQVBQX0hfCisjZGVmaW5lIEZYSlNfQ0pTX0FQUF9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmeGpzL0pTX0RlZmluZS5oIgorCitjbGFzcyBDSlNfUnVudGltZTsKK2NsYXNzIEdsb2JhbFRpbWVyOworCitjbGFzcyBhcHAgOiBwdWJsaWMgQ0pTX0VtYmVkT2JqIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IGFwcChDSlNfT2JqZWN0KiBwSlNPYmplY3QpOworICB+YXBwKCkgb3ZlcnJpZGU7CisKKyAgQ0pTX1JldHVybiBnZXRfYWN0aXZlX2RvY3MoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfYWN0aXZlX2RvY3MoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfY2FsY3VsYXRlKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2NhbGN1bGF0ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9mb3Jtc192ZXJzaW9uKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2Zvcm1zX3ZlcnNpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfZnMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfZnMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfZnVsbHNjcmVlbihDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9mdWxsc2NyZWVuKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X2xhbmd1YWdlKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2xhbmd1YWdlKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X21lZGlhKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X21lZGlhKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X3BsYXRmb3JtKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X3BsYXRmb3JtKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X3J1bnRpbWVfaGlnaGxpZ2h0KENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X3J1bnRpbWVfaGlnaGxpZ2h0KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X3ZpZXdlcl90eXBlKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X3ZpZXdlcl90eXBlKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X3ZpZXdlcl92YXJpYXRpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfdmlld2VyX3ZhcmlhdGlvbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X3ZpZXdlcl92ZXJzaW9uKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X3ZpZXdlcl92ZXJzaW9uKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gYWxlcnQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBiZWVwKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBicm93c2VGb3JEb2MoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gY2xlYXJJbnRlcnZhbChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gY2xlYXJUaW1lT3V0KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGV4ZWNEaWFsb2coQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGV4ZWNNZW51SXRlbShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBmaW5kQ29tcG9uZW50KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBnb0JhY2soQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gZ29Gb3J3YXJkKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGxhdW5jaFVSTChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBtYWlsTXNnKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBuZXdGREYoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gbmV3RG9jKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIG9wZW5Eb2MoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIG9wZW5GREYoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIHBvcFVwTWVudUV4KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gcG9wVXBNZW51KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIHJlc3BvbnNlKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gc2V0SW50ZXJ2YWwoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBzZXRUaW1lT3V0KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKworICB2b2lkIFRpbWVyUHJvYyhHbG9iYWxUaW1lciogcFRpbWVyKTsKKyAgdm9pZCBDYW5jZWxQcm9jKEdsb2JhbFRpbWVyKiBwVGltZXIpOworCisgIHN0YXRpYyBXaWRlU3RyaW5nIFN5c1BhdGhUb1BERlBhdGgoY29uc3QgV2lkZVN0cmluZyYgc09sZFBhdGgpOworCisgcHJpdmF0ZToKKyAgLy8gQ0pTX0VtYmVkT2JqCisgIHZvaWQgUnVuSnNTY3JpcHQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBjb25zdCBXaWRlU3RyaW5nJiB3c1NjcmlwdCk7CisKKyAgdm9pZCBDbGVhclRpbWVyQ29tbW9uKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcGFyYW0pOworCisgIGJvb2wgbV9iQ2FsY3VsYXRlOworICBib29sIG1fYlJ1bnRpbWVIaWdoTGlnaHQ7CisgIHN0ZDo6c2V0PHN0ZDo6dW5pcXVlX3B0cjxHbG9iYWxUaW1lcj4+IG1fVGltZXJzOworfTsKKworY2xhc3MgQ0pTX0FwcCA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIERlZmluZUpTT2JqZWN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUpOworCisgIGV4cGxpY2l0IENKU19BcHAodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQorICB+Q0pTX0FwcCgpIG92ZXJyaWRlIHt9CisKKyAgSlNfU1RBVElDX1BST1AoYWN0aXZlRG9jcywgYWN0aXZlX2RvY3MsIGFwcCk7CisgIEpTX1NUQVRJQ19QUk9QKGNhbGN1bGF0ZSwgY2FsY3VsYXRlLCBhcHApOworICBKU19TVEFUSUNfUFJPUChmb3Jtc1ZlcnNpb24sIGZvcm1zX3ZlcnNpb24sIGFwcCk7CisgIEpTX1NUQVRJQ19QUk9QKGZzLCBmcywgYXBwKTsKKyAgSlNfU1RBVElDX1BST1AoZnVsbHNjcmVlbiwgZnVsbHNjcmVlbiwgYXBwKTsKKyAgSlNfU1RBVElDX1BST1AobGFuZ3VhZ2UsIGxhbmd1YWdlLCBhcHApOworICBKU19TVEFUSUNfUFJPUChtZWRpYSwgbWVkaWEsIGFwcCk7CisgIEpTX1NUQVRJQ19QUk9QKHBsYXRmb3JtLCBwbGF0Zm9ybSwgYXBwKTsKKyAgSlNfU1RBVElDX1BST1AocnVudGltZUhpZ2hsaWdodCwgcnVudGltZV9oaWdobGlnaHQsIGFwcCk7CisgIEpTX1NUQVRJQ19QUk9QKHZpZXdlclR5cGUsIHZpZXdlcl90eXBlLCBhcHApOworICBKU19TVEFUSUNfUFJPUCh2aWV3ZXJWYXJpYXRpb24sIHZpZXdlcl92YXJpYXRpb24sIGFwcCk7CisgIEpTX1NUQVRJQ19QUk9QKHZpZXdlclZlcnNpb24sIHZpZXdlcl92ZXJzaW9uLCBhcHApOworCisgIEpTX1NUQVRJQ19NRVRIT0QoYWxlcnQsIGFwcCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoYmVlcCwgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChicm93c2VGb3JEb2MsIGFwcCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoY2xlYXJJbnRlcnZhbCwgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChjbGVhclRpbWVPdXQsIGFwcCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZXhlY0RpYWxvZywgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChleGVjTWVudUl0ZW0sIGFwcCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZmluZENvbXBvbmVudCwgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChnb0JhY2ssIGFwcCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZ29Gb3J3YXJkLCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKGxhdW5jaFVSTCwgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChtYWlsTXNnLCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKG5ld0ZERiwgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChuZXdEb2MsIGFwcCk7CisgIEpTX1NUQVRJQ19NRVRIT0Qob3BlbkRvYywgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChvcGVuRkRGLCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKHBvcFVwTWVudUV4LCBhcHApOworICBKU19TVEFUSUNfTUVUSE9EKHBvcFVwTWVudSwgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChyZXNwb25zZSwgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChzZXRJbnRlcnZhbCwgYXBwKTsKKyAgSlNfU1RBVElDX01FVEhPRChzZXRUaW1lT3V0LCBhcHApOworCisgcHJpdmF0ZToKKyAgc3RhdGljIGludCBPYmpEZWZuSUQ7CisgIHN0YXRpYyBjb25zdCBKU1Byb3BlcnR5U3BlYyBQcm9wZXJ0eVNwZWNzW107CisgIHN0YXRpYyBjb25zdCBKU01ldGhvZFNwZWMgTWV0aG9kU3BlY3NbXTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19DSlNfQVBQX0hfCmRpZmYgLS1naXQgYS9meGpzL2Nqc19ib3JkZXIuY3BwIGIvZnhqcy9janNfYm9yZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTY5M2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfYm9yZGVyLmNwcApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL2Nqc19ib3JkZXIuaCIKKworY29uc3QgSlNDb25zdFNwZWMgQ0pTX0JvcmRlcjo6Q29uc3RTcGVjc1tdID0geworICAgIHsicyIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJzb2xpZCJ9LAorICAgIHsiYiIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJiZXZlbGVkIn0sCisgICAgeyJkIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgImRhc2hlZCJ9LAorICAgIHsiaSIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJpbnNldCJ9LAorICAgIHsidSIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJ1bmRlcmxpbmUifX07CisKK2ludCBDSlNfQm9yZGVyOjpPYmpEZWZuSUQgPSAtMTsKKworLy8gc3RhdGljCit2b2lkIENKU19Cb3JkZXI6OkRlZmluZUpTT2JqZWN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUpIHsKKyAgT2JqRGVmbklEID0KKyAgICAgIHBFbmdpbmUtPkRlZmluZU9iaigiYm9yZGVyIiwgRlhKU09CSlRZUEVfU1RBVElDLCBudWxscHRyLCBudWxscHRyKTsKKyAgRGVmaW5lQ29uc3RzKHBFbmdpbmUsIE9iakRlZm5JRCwgQ29uc3RTcGVjcywgRlhfQXJyYXlTaXplKENvbnN0U3BlY3MpKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX2JvcmRlci5oIGIvZnhqcy9janNfYm9yZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNmY2VmNwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2pzX2JvcmRlci5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX0NKU19CT1JERVJfSF8KKyNkZWZpbmUgRlhKU19DSlNfQk9SREVSX0hfCisKKyNpbmNsdWRlICJmeGpzL0pTX0RlZmluZS5oIgorCitjbGFzcyBDSlNfQm9yZGVyIDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgRGVmaW5lSlNPYmplY3RzKENGWEpTX0VuZ2luZSogcEVuZ2luZSk7CisKKyAgZXhwbGljaXQgQ0pTX0JvcmRlcih2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9CisgIH5DSlNfQm9yZGVyKCkgb3ZlcnJpZGUge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBpbnQgT2JqRGVmbklEOworICBzdGF0aWMgY29uc3QgSlNDb25zdFNwZWMgQ29uc3RTcGVjc1tdOworfTsKKworI2VuZGlmICAvLyBGWEpTX0NKU19CT1JERVJfSF8KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX2NvbG9yLmNwcCBiL2Z4anMvY2pzX2NvbG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGE5OGRkCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfY29sb3IuY3BwCkBAIC0wLDAgKzEsMzAyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL2Nqc19jb2xvci5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnhqcy9KU19EZWZpbmUuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19ldmVudF9jb250ZXh0LmgiCisjaW5jbHVkZSAiZnhqcy9janNfZXZlbnRoYW5kbGVyLmgiCisjaW5jbHVkZSAiZnhqcy9janNfb2JqZWN0LmgiCisjaW5jbHVkZSAiZnhqcy9janNfcnVudGltZS5oIgorCitjb25zdCBKU1Byb3BlcnR5U3BlYyBDSlNfQ29sb3I6OlByb3BlcnR5U3BlY3NbXSA9IHsKKyAgICB7ImJsYWNrIiwgZ2V0X2JsYWNrX3N0YXRpYywgc2V0X2JsYWNrX3N0YXRpY30sCisgICAgeyJibHVlIiwgZ2V0X2JsdWVfc3RhdGljLCBzZXRfYmx1ZV9zdGF0aWN9LAorICAgIHsiY3lhbiIsIGdldF9jeWFuX3N0YXRpYywgc2V0X2N5YW5fc3RhdGljfSwKKyAgICB7ImRrR3JheSIsIGdldF9kYXJrX2dyYXlfc3RhdGljLCBzZXRfZGFya19ncmF5X3N0YXRpY30sCisgICAgeyJncmF5IiwgZ2V0X2dyYXlfc3RhdGljLCBzZXRfZ3JheV9zdGF0aWN9LAorICAgIHsiZ3JlZW4iLCBnZXRfZ3JlZW5fc3RhdGljLCBzZXRfZ3JlZW5fc3RhdGljfSwKKyAgICB7Imx0R3JheSIsIGdldF9saWdodF9ncmF5X3N0YXRpYywgc2V0X2xpZ2h0X2dyYXlfc3RhdGljfSwKKyAgICB7Im1hZ2VudGEiLCBnZXRfbWFnZW50YV9zdGF0aWMsIHNldF9tYWdlbnRhX3N0YXRpY30sCisgICAgeyJyZWQiLCBnZXRfcmVkX3N0YXRpYywgc2V0X3JlZF9zdGF0aWN9LAorICAgIHsidHJhbnNwYXJlbnQiLCBnZXRfdHJhbnNwYXJlbnRfc3RhdGljLCBzZXRfdHJhbnNwYXJlbnRfc3RhdGljfSwKKyAgICB7IndoaXRlIiwgZ2V0X3doaXRlX3N0YXRpYywgc2V0X3doaXRlX3N0YXRpY30sCisgICAgeyJ5ZWxsb3ciLCBnZXRfeWVsbG93X3N0YXRpYywgc2V0X3llbGxvd19zdGF0aWN9fTsKKworY29uc3QgSlNNZXRob2RTcGVjIENKU19Db2xvcjo6TWV0aG9kU3BlY3NbXSA9IHt7ImNvbnZlcnQiLCBjb252ZXJ0X3N0YXRpY30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiZXF1YWwiLCBlcXVhbF9zdGF0aWN9fTsKKworaW50IENKU19Db2xvcjo6T2JqRGVmbklEID0gLTE7CisKKy8vIHN0YXRpYwordm9pZCBDSlNfQ29sb3I6OkRlZmluZUpTT2JqZWN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUpIHsKKyAgT2JqRGVmbklEID0gcEVuZ2luZS0+RGVmaW5lT2JqKCJjb2xvciIsIEZYSlNPQkpUWVBFX1NUQVRJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQ29uc3RydWN0b3I8Q0pTX0NvbG9yLCBjb2xvcj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0Rlc3RydWN0b3I8Q0pTX0NvbG9yPik7CisgIERlZmluZVByb3BzKHBFbmdpbmUsIE9iakRlZm5JRCwgUHJvcGVydHlTcGVjcywgRlhfQXJyYXlTaXplKFByb3BlcnR5U3BlY3MpKTsKKyAgRGVmaW5lTWV0aG9kcyhwRW5naW5lLCBPYmpEZWZuSUQsIE1ldGhvZFNwZWNzLCBGWF9BcnJheVNpemUoTWV0aG9kU3BlY3MpKTsKK30KKworLy8gc3RhdGljCit2ODo6TG9jYWw8djg6OkFycmF5PiBjb2xvcjo6Q29udmVydFBXTENvbG9yVG9BcnJheShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQ29sb3ImIGNvbG9yKSB7CisgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IGFycmF5OworICBzd2l0Y2ggKGNvbG9yLm5Db2xvclR5cGUpIHsKKyAgICBjYXNlIENGWF9Db2xvcjo6a1RyYW5zcGFyZW50OgorICAgICAgYXJyYXkgPSBwUnVudGltZS0+TmV3QXJyYXkoKTsKKyAgICAgIHBSdW50aW1lLT5QdXRBcnJheUVsZW1lbnQoYXJyYXksIDAsIHBSdW50aW1lLT5OZXdTdHJpbmcoTCJUIikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDRlhfQ29sb3I6OmtHcmF5OgorICAgICAgYXJyYXkgPSBwUnVudGltZS0+TmV3QXJyYXkoKTsKKyAgICAgIHBSdW50aW1lLT5QdXRBcnJheUVsZW1lbnQoYXJyYXksIDAsIHBSdW50aW1lLT5OZXdTdHJpbmcoTCJHIikpOworICAgICAgcFJ1bnRpbWUtPlB1dEFycmF5RWxlbWVudChhcnJheSwgMSwgcFJ1bnRpbWUtPk5ld051bWJlcihjb2xvci5mQ29sb3IxKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENGWF9Db2xvcjo6a1JHQjoKKyAgICAgIGFycmF5ID0gcFJ1bnRpbWUtPk5ld0FycmF5KCk7CisgICAgICBwUnVudGltZS0+UHV0QXJyYXlFbGVtZW50KGFycmF5LCAwLCBwUnVudGltZS0+TmV3U3RyaW5nKEwiUkdCIikpOworICAgICAgcFJ1bnRpbWUtPlB1dEFycmF5RWxlbWVudChhcnJheSwgMSwgcFJ1bnRpbWUtPk5ld051bWJlcihjb2xvci5mQ29sb3IxKSk7CisgICAgICBwUnVudGltZS0+UHV0QXJyYXlFbGVtZW50KGFycmF5LCAyLCBwUnVudGltZS0+TmV3TnVtYmVyKGNvbG9yLmZDb2xvcjIpKTsKKyAgICAgIHBSdW50aW1lLT5QdXRBcnJheUVsZW1lbnQoYXJyYXksIDMsIHBSdW50aW1lLT5OZXdOdW1iZXIoY29sb3IuZkNvbG9yMykpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDRlhfQ29sb3I6OmtDTVlLOgorICAgICAgYXJyYXkgPSBwUnVudGltZS0+TmV3QXJyYXkoKTsKKyAgICAgIHBSdW50aW1lLT5QdXRBcnJheUVsZW1lbnQoYXJyYXksIDAsIHBSdW50aW1lLT5OZXdTdHJpbmcoTCJDTVlLIikpOworICAgICAgcFJ1bnRpbWUtPlB1dEFycmF5RWxlbWVudChhcnJheSwgMSwgcFJ1bnRpbWUtPk5ld051bWJlcihjb2xvci5mQ29sb3IxKSk7CisgICAgICBwUnVudGltZS0+UHV0QXJyYXlFbGVtZW50KGFycmF5LCAyLCBwUnVudGltZS0+TmV3TnVtYmVyKGNvbG9yLmZDb2xvcjIpKTsKKyAgICAgIHBSdW50aW1lLT5QdXRBcnJheUVsZW1lbnQoYXJyYXksIDMsIHBSdW50aW1lLT5OZXdOdW1iZXIoY29sb3IuZkNvbG9yMykpOworICAgICAgcFJ1bnRpbWUtPlB1dEFycmF5RWxlbWVudChhcnJheSwgNCwgcFJ1bnRpbWUtPk5ld051bWJlcihjb2xvci5mQ29sb3I0KSk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gYXJyYXk7Cit9CisKKy8vIHN0YXRpYworQ0ZYX0NvbG9yIGNvbG9yOjpDb252ZXJ0QXJyYXlUb1BXTENvbG9yKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OkFycmF5PiBhcnJheSkgeworICBpbnQgbkFycmF5TGVuID0gcFJ1bnRpbWUtPkdldEFycmF5TGVuZ3RoKGFycmF5KTsKKyAgaWYgKG5BcnJheUxlbiA8IDEpCisgICAgcmV0dXJuIENGWF9Db2xvcigpOworCisgIFdpZGVTdHJpbmcgc1NwYWNlID0KKyAgICAgIHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcocFJ1bnRpbWUtPkdldEFycmF5RWxlbWVudChhcnJheSwgMCkpOworICBpZiAoc1NwYWNlID09IEwiVCIpCisgICAgcmV0dXJuIENGWF9Db2xvcihDRlhfQ29sb3I6OmtUcmFuc3BhcmVudCk7CisKKyAgZmxvYXQgZDEgPSAwOworICBpZiAobkFycmF5TGVuID4gMSkgeworICAgIGQxID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KAorICAgICAgICBwUnVudGltZS0+VG9Eb3VibGUocFJ1bnRpbWUtPkdldEFycmF5RWxlbWVudChhcnJheSwgMSkpKTsKKyAgfQorCisgIGlmIChzU3BhY2UgPT0gTCJHIikKKyAgICByZXR1cm4gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIGQxKTsKKworICBmbG9hdCBkMiA9IDA7CisgIGZsb2F0IGQzID0gMDsKKyAgaWYgKG5BcnJheUxlbiA+IDIpIHsKKyAgICBkMiA9IHN0YXRpY19jYXN0PGZsb2F0PigKKyAgICAgICAgcFJ1bnRpbWUtPlRvRG91YmxlKHBSdW50aW1lLT5HZXRBcnJheUVsZW1lbnQoYXJyYXksIDIpKSk7CisgIH0KKyAgaWYgKG5BcnJheUxlbiA+IDMpIHsKKyAgICBkMyA9IHN0YXRpY19jYXN0PGZsb2F0PigKKyAgICAgICAgcFJ1bnRpbWUtPlRvRG91YmxlKHBSdW50aW1lLT5HZXRBcnJheUVsZW1lbnQoYXJyYXksIDMpKSk7CisgIH0KKworICBpZiAoc1NwYWNlID09IEwiUkdCIikKKyAgICByZXR1cm4gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a1JHQiwgZDEsIGQyLCBkMyk7CisKKyAgZmxvYXQgZDQgPSAwOworICBpZiAobkFycmF5TGVuID4gNCkgeworICAgIGQ0ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KAorICAgICAgICBwUnVudGltZS0+VG9Eb3VibGUocFJ1bnRpbWUtPkdldEFycmF5RWxlbWVudChhcnJheSwgNCkpKTsKKyAgfQorICBpZiAoc1NwYWNlID09IEwiQ01ZSyIpCisgICAgcmV0dXJuIENGWF9Db2xvcihDRlhfQ29sb3I6OmtDTVlLLCBkMSwgZDIsIGQzLCBkNCk7CisKKyAgcmV0dXJuIENGWF9Db2xvcigpOworfQorCitjb2xvcjo6Y29sb3IoQ0pTX09iamVjdCogcEpTT2JqZWN0KSA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpIHsKKyAgbV9jclRyYW5zcGFyZW50ID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a1RyYW5zcGFyZW50KTsKKyAgbV9jckJsYWNrID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0dyYXksIDApOworICBtX2NyV2hpdGUgPSBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprR3JheSwgMSk7CisgIG1fY3JSZWQgPSBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprUkdCLCAxLCAwLCAwKTsKKyAgbV9jckdyZWVuID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a1JHQiwgMCwgMSwgMCk7CisgIG1fY3JCbHVlID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a1JHQiwgMCwgMCwgMSk7CisgIG1fY3JDeWFuID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0NNWUssIDEsIDAsIDAsIDApOworICBtX2NyTWFnZW50YSA9IENGWF9Db2xvcihDRlhfQ29sb3I6OmtDTVlLLCAwLCAxLCAwLCAwKTsKKyAgbV9jclllbGxvdyA9IENGWF9Db2xvcihDRlhfQ29sb3I6OmtDTVlLLCAwLCAwLCAxLCAwKTsKKyAgbV9jckRLR3JheSA9IENGWF9Db2xvcihDRlhfQ29sb3I6OmtHcmF5LCAwLjI1KTsKKyAgbV9jckdyYXkgPSBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprR3JheSwgMC41KTsKKyAgbV9jckxUR3JheSA9IENGWF9Db2xvcihDRlhfQ29sb3I6OmtHcmF5LCAwLjc1KTsKK30KKworY29sb3I6On5jb2xvcigpIHt9CisKK0NKU19SZXR1cm4gY29sb3I6OmdldF90cmFuc3BhcmVudChDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgcmV0dXJuIEdldFByb3BlcnR5SGVscGVyKHBSdW50aW1lLCAmbV9jclRyYW5zcGFyZW50KTsKK30KKworQ0pTX1JldHVybiBjb2xvcjo6c2V0X3RyYW5zcGFyZW50KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gU2V0UHJvcGVydHlIZWxwZXIocFJ1bnRpbWUsIHZwLCAmbV9jclRyYW5zcGFyZW50KTsKK30KKworQ0pTX1JldHVybiBjb2xvcjo6Z2V0X2JsYWNrKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICByZXR1cm4gR2V0UHJvcGVydHlIZWxwZXIocFJ1bnRpbWUsICZtX2NyQmxhY2spOworfQorCitDSlNfUmV0dXJuIGNvbG9yOjpzZXRfYmxhY2soQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gU2V0UHJvcGVydHlIZWxwZXIocFJ1bnRpbWUsIHZwLCAmbV9jckJsYWNrKTsKK30KKworQ0pTX1JldHVybiBjb2xvcjo6Z2V0X3doaXRlKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICByZXR1cm4gR2V0UHJvcGVydHlIZWxwZXIocFJ1bnRpbWUsICZtX2NyV2hpdGUpOworfQorCitDSlNfUmV0dXJuIGNvbG9yOjpzZXRfd2hpdGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gU2V0UHJvcGVydHlIZWxwZXIocFJ1bnRpbWUsIHZwLCAmbV9jcldoaXRlKTsKK30KKworQ0pTX1JldHVybiBjb2xvcjo6Z2V0X3JlZChDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgcmV0dXJuIEdldFByb3BlcnR5SGVscGVyKHBSdW50aW1lLCAmbV9jclJlZCk7Cit9CisKK0NKU19SZXR1cm4gY29sb3I6OnNldF9yZWQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gU2V0UHJvcGVydHlIZWxwZXIocFJ1bnRpbWUsIHZwLCAmbV9jclJlZCk7Cit9CisKK0NKU19SZXR1cm4gY29sb3I6OmdldF9ncmVlbihDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgcmV0dXJuIEdldFByb3BlcnR5SGVscGVyKHBSdW50aW1lLCAmbV9jckdyZWVuKTsKK30KKworQ0pTX1JldHVybiBjb2xvcjo6c2V0X2dyZWVuKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIFNldFByb3BlcnR5SGVscGVyKHBSdW50aW1lLCB2cCwgJm1fY3JHcmVlbik7Cit9CisKK0NKU19SZXR1cm4gY29sb3I6OmdldF9ibHVlKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICByZXR1cm4gR2V0UHJvcGVydHlIZWxwZXIocFJ1bnRpbWUsICZtX2NyQmx1ZSk7Cit9CisKK0NKU19SZXR1cm4gY29sb3I6OnNldF9ibHVlKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIFNldFByb3BlcnR5SGVscGVyKHBSdW50aW1lLCB2cCwgJm1fY3JCbHVlKTsKK30KKworQ0pTX1JldHVybiBjb2xvcjo6Z2V0X2N5YW4oQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHJldHVybiBHZXRQcm9wZXJ0eUhlbHBlcihwUnVudGltZSwgJm1fY3JDeWFuKTsKK30KKworQ0pTX1JldHVybiBjb2xvcjo6c2V0X2N5YW4oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gU2V0UHJvcGVydHlIZWxwZXIocFJ1bnRpbWUsIHZwLCAmbV9jckN5YW4pOworfQorCitDSlNfUmV0dXJuIGNvbG9yOjpnZXRfbWFnZW50YShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgcmV0dXJuIEdldFByb3BlcnR5SGVscGVyKHBSdW50aW1lLCAmbV9jck1hZ2VudGEpOworfQorCitDSlNfUmV0dXJuIGNvbG9yOjpzZXRfbWFnZW50YShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBTZXRQcm9wZXJ0eUhlbHBlcihwUnVudGltZSwgdnAsICZtX2NyTWFnZW50YSk7Cit9CisKK0NKU19SZXR1cm4gY29sb3I6OmdldF95ZWxsb3coQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHJldHVybiBHZXRQcm9wZXJ0eUhlbHBlcihwUnVudGltZSwgJm1fY3JZZWxsb3cpOworfQorCitDSlNfUmV0dXJuIGNvbG9yOjpzZXRfeWVsbG93KENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIFNldFByb3BlcnR5SGVscGVyKHBSdW50aW1lLCB2cCwgJm1fY3JZZWxsb3cpOworfQorCitDSlNfUmV0dXJuIGNvbG9yOjpnZXRfZGFya19ncmF5KENKU19SdW50aW1lKiBwUnVudGltZSkgeworICByZXR1cm4gR2V0UHJvcGVydHlIZWxwZXIocFJ1bnRpbWUsICZtX2NyREtHcmF5KTsKK30KKworQ0pTX1JldHVybiBjb2xvcjo6c2V0X2RhcmtfZ3JheShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBTZXRQcm9wZXJ0eUhlbHBlcihwUnVudGltZSwgdnAsICZtX2NyREtHcmF5KTsKK30KKworQ0pTX1JldHVybiBjb2xvcjo6Z2V0X2dyYXkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHJldHVybiBHZXRQcm9wZXJ0eUhlbHBlcihwUnVudGltZSwgJm1fY3JHcmF5KTsKK30KKworQ0pTX1JldHVybiBjb2xvcjo6c2V0X2dyYXkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gU2V0UHJvcGVydHlIZWxwZXIocFJ1bnRpbWUsIHZwLCAmbV9jckdyYXkpOworfQorCitDSlNfUmV0dXJuIGNvbG9yOjpnZXRfbGlnaHRfZ3JheShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgcmV0dXJuIEdldFByb3BlcnR5SGVscGVyKHBSdW50aW1lLCAmbV9jckxUR3JheSk7Cit9CisKK0NKU19SZXR1cm4gY29sb3I6OnNldF9saWdodF9ncmF5KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBTZXRQcm9wZXJ0eUhlbHBlcihwUnVudGltZSwgdnAsICZtX2NyTFRHcmF5KTsKK30KKworQ0pTX1JldHVybiBjb2xvcjo6R2V0UHJvcGVydHlIZWxwZXIoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBDRlhfQ29sb3IqIHZhcikgeworICB2ODo6TG9jYWw8djg6OlZhbHVlPiBhcnJheSA9IENvbnZlcnRQV0xDb2xvclRvQXJyYXkocFJ1bnRpbWUsICp2YXIpOworICBpZiAoYXJyYXkuSXNFbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdBcnJheSgpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4oYXJyYXkpOworfQorCitDSlNfUmV0dXJuIGNvbG9yOjpTZXRQcm9wZXJ0eUhlbHBlcihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Db2xvciogdmFyKSB7CisgIGlmICh2cC5Jc0VtcHR5KCkgfHwgIXZwLT5Jc0FycmF5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgICp2YXIgPSBDb252ZXJ0QXJyYXlUb1BXTENvbG9yKHBSdW50aW1lLCBwUnVudGltZS0+VG9BcnJheSh2cCkpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBjb2xvcjo6Y29udmVydChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CisgIGlmIChpU2l6ZSA8IDIpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworICBpZiAocGFyYW1zWzBdLklzRW1wdHkoKSB8fCAhcGFyYW1zWzBdLT5Jc0FycmF5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIFdpZGVTdHJpbmcgc0Rlc3RTcGFjZSA9IHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzFdKTsKKyAgaW50IG5Db2xvclR5cGUgPSBDRlhfQ29sb3I6OmtUcmFuc3BhcmVudDsKKyAgaWYgKHNEZXN0U3BhY2UgPT0gTCJUIikKKyAgICBuQ29sb3JUeXBlID0gQ0ZYX0NvbG9yOjprVHJhbnNwYXJlbnQ7CisgIGVsc2UgaWYgKHNEZXN0U3BhY2UgPT0gTCJHIikKKyAgICBuQ29sb3JUeXBlID0gQ0ZYX0NvbG9yOjprR3JheTsKKyAgZWxzZSBpZiAoc0Rlc3RTcGFjZSA9PSBMIlJHQiIpCisgICAgbkNvbG9yVHlwZSA9IENGWF9Db2xvcjo6a1JHQjsKKyAgZWxzZSBpZiAoc0Rlc3RTcGFjZSA9PSBMIkNNWUsiKQorICAgIG5Db2xvclR5cGUgPSBDRlhfQ29sb3I6OmtDTVlLOworCisgIENGWF9Db2xvciBjb2xvciA9CisgICAgICBDb252ZXJ0QXJyYXlUb1BXTENvbG9yKHBSdW50aW1lLCBwUnVudGltZS0+VG9BcnJheShwYXJhbXNbMF0pKTsKKworICB2ODo6TG9jYWw8djg6OlZhbHVlPiBhcnJheSA9CisgICAgICBDb252ZXJ0UFdMQ29sb3JUb0FycmF5KHBSdW50aW1lLCBjb2xvci5Db252ZXJ0Q29sb3JUeXBlKG5Db2xvclR5cGUpKTsKKyAgaWYgKGFycmF5LklzRW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3QXJyYXkoKSk7CisgIHJldHVybiBDSlNfUmV0dXJuKGFycmF5KTsKK30KKworQ0pTX1JldHVybiBjb2xvcjo6ZXF1YWwoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPCAyKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKyAgaWYgKHBhcmFtc1swXS5Jc0VtcHR5KCkgfHwgIXBhcmFtc1swXS0+SXNBcnJheSgpIHx8IHBhcmFtc1sxXS5Jc0VtcHR5KCkgfHwKKyAgICAgICFwYXJhbXNbMV0tPklzQXJyYXkoKSkgeworICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKyAgfQorCisgIENGWF9Db2xvciBjb2xvcjEgPQorICAgICAgQ29udmVydEFycmF5VG9QV0xDb2xvcihwUnVudGltZSwgcFJ1bnRpbWUtPlRvQXJyYXkocGFyYW1zWzBdKSk7CisgIENGWF9Db2xvciBjb2xvcjIgPQorICAgICAgQ29udmVydEFycmF5VG9QV0xDb2xvcihwUnVudGltZSwgcFJ1bnRpbWUtPlRvQXJyYXkocGFyYW1zWzFdKSk7CisKKyAgY29sb3IxID0gY29sb3IxLkNvbnZlcnRDb2xvclR5cGUoY29sb3IyLm5Db2xvclR5cGUpOworICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3Qm9vbGVhbihjb2xvcjEgPT0gY29sb3IyKSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL2Nqc19jb2xvci5oIGIvZnhqcy9janNfY29sb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjdjMWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfY29sb3IuaApAQCAtMCwwICsxLDExNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfQ0pTX0NPTE9SX0hfCisjZGVmaW5lIEZYSlNfQ0pTX0NPTE9SX0hfCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmcGRmc2RrL3B3bC9jcHdsX3duZC5oIgorI2luY2x1ZGUgImZ4anMvSlNfRGVmaW5lLmgiCisKK2NsYXNzIGNvbG9yIDogcHVibGljIENKU19FbWJlZE9iaiB7CisgcHVibGljOgorICBzdGF0aWMgdjg6OkxvY2FsPHY4OjpBcnJheT4gQ29udmVydFBXTENvbG9yVG9BcnJheShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Db2xvciYgY29sb3IpOworICBzdGF0aWMgQ0ZYX0NvbG9yIENvbnZlcnRBcnJheVRvUFdMQ29sb3IoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpBcnJheT4gYXJyYXkpOworCisgIGV4cGxpY2l0IGNvbG9yKENKU19PYmplY3QqIHBKU09iamVjdCk7CisgIH5jb2xvcigpIG92ZXJyaWRlOworCisgIENKU19SZXR1cm4gZ2V0X2JsYWNrKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2JsYWNrKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X2JsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfYmx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9jeWFuKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2N5YW4oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfZGFya19ncmF5KENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2RhcmtfZ3JheShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9ncmF5KENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2dyYXkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfZ3JlZW4oQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfZ3JlZW4oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfbGlnaHRfZ3JheShDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9saWdodF9ncmF5KENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X21hZ2VudGEoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfbWFnZW50YShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9yZWQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfcmVkKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X3RyYW5zcGFyZW50KENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X3RyYW5zcGFyZW50KENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X3doaXRlKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X3doaXRlKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X3llbGxvdyhDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF95ZWxsb3coQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBjb252ZXJ0KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBlcXVhbChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworCisgcHJpdmF0ZToKKyAgQ0pTX1JldHVybiBHZXRQcm9wZXJ0eUhlbHBlcihDSlNfUnVudGltZSogcFJ1bnRpbWUsIENGWF9Db2xvciogdmFsKTsKKyAgQ0pTX1JldHVybiBTZXRQcm9wZXJ0eUhlbHBlcihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NvbG9yKiB2YWwpOworCisgIENGWF9Db2xvciBtX2NyVHJhbnNwYXJlbnQ7CisgIENGWF9Db2xvciBtX2NyQmxhY2s7CisgIENGWF9Db2xvciBtX2NyV2hpdGU7CisgIENGWF9Db2xvciBtX2NyUmVkOworICBDRlhfQ29sb3IgbV9jckdyZWVuOworICBDRlhfQ29sb3IgbV9jckJsdWU7CisgIENGWF9Db2xvciBtX2NyQ3lhbjsKKyAgQ0ZYX0NvbG9yIG1fY3JNYWdlbnRhOworICBDRlhfQ29sb3IgbV9jclllbGxvdzsKKyAgQ0ZYX0NvbG9yIG1fY3JES0dyYXk7CisgIENGWF9Db2xvciBtX2NyR3JheTsKKyAgQ0ZYX0NvbG9yIG1fY3JMVEdyYXk7Cit9OworCitjbGFzcyBDSlNfQ29sb3IgOiBwdWJsaWMgQ0pTX09iamVjdCB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBEZWZpbmVKU09iamVjdHMoQ0ZYSlNfRW5naW5lKiBwRW5naW5lKTsKKworICBleHBsaWNpdCBDSlNfQ29sb3Iodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQorICB+Q0pTX0NvbG9yKCkgb3ZlcnJpZGUge30KKworICBKU19TVEFUSUNfUFJPUChibGFjaywgYmxhY2ssIGNvbG9yKTsKKyAgSlNfU1RBVElDX1BST1AoYmx1ZSwgYmx1ZSwgY29sb3IpOworICBKU19TVEFUSUNfUFJPUChjeWFuLCBjeWFuLCBjb2xvcik7CisgIEpTX1NUQVRJQ19QUk9QKGRrR3JheSwgZGFya19ncmF5LCBjb2xvcik7CisgIEpTX1NUQVRJQ19QUk9QKGdyYXksIGdyYXksIGNvbG9yKTsKKyAgSlNfU1RBVElDX1BST1AoZ3JlZW4sIGdyZWVuLCBjb2xvcik7CisgIEpTX1NUQVRJQ19QUk9QKGx0R3JheSwgbGlnaHRfZ3JheSwgY29sb3IpOworICBKU19TVEFUSUNfUFJPUChtYWdlbnRhLCBtYWdlbnRhLCBjb2xvcik7CisgIEpTX1NUQVRJQ19QUk9QKHJlZCwgcmVkLCBjb2xvcik7CisgIEpTX1NUQVRJQ19QUk9QKHRyYW5zcGFyZW50LCB0cmFuc3BhcmVudCwgY29sb3IpOworICBKU19TVEFUSUNfUFJPUCh3aGl0ZSwgd2hpdGUsIGNvbG9yKTsKKyAgSlNfU1RBVElDX1BST1AoeWVsbG93LCB5ZWxsb3csIGNvbG9yKTsKKworICBKU19TVEFUSUNfTUVUSE9EKGNvbnZlcnQsIGNvbG9yKTsKKyAgSlNfU1RBVElDX01FVEhPRChlcXVhbCwgY29sb3IpOworCisgcHJpdmF0ZToKKyAgc3RhdGljIGludCBPYmpEZWZuSUQ7CisgIHN0YXRpYyBjb25zdCBKU1Byb3BlcnR5U3BlYyBQcm9wZXJ0eVNwZWNzW107CisgIHN0YXRpYyBjb25zdCBKU01ldGhvZFNwZWMgTWV0aG9kU3BlY3NbXTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19DSlNfQ09MT1JfSF8KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX2NvbnNvbGUuY3BwIGIvZnhqcy9janNfY29uc29sZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkyMWNkMgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2pzX2NvbnNvbGUuY3BwCkBAIC0wLDAgKzEsNTMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMvY2pzX2NvbnNvbGUuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImZ4anMvSlNfRGVmaW5lLmgiCisjaW5jbHVkZSAiZnhqcy9janNfZXZlbnRfY29udGV4dC5oIgorI2luY2x1ZGUgImZ4anMvY2pzX2V2ZW50aGFuZGxlci5oIgorI2luY2x1ZGUgImZ4anMvY2pzX29iamVjdC5oIgorCitjb25zdCBKU01ldGhvZFNwZWMgQ0pTX0NvbnNvbGU6Ok1ldGhvZFNwZWNzW10gPSB7eyJjbGVhciIsIGNsZWFyX3N0YXRpY30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJoaWRlIiwgaGlkZV9zdGF0aWN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsicHJpbnRsbiIsIHByaW50bG5fc3RhdGljfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InNob3ciLCBzaG93X3N0YXRpY319OworCitpbnQgQ0pTX0NvbnNvbGU6Ok9iakRlZm5JRCA9IC0xOworCisvLyBzdGF0aWMKK3ZvaWQgQ0pTX0NvbnNvbGU6OkRlZmluZUpTT2JqZWN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUpIHsKKyAgT2JqRGVmbklEID0gcEVuZ2luZS0+RGVmaW5lT2JqKCJjb25zb2xlIiwgRlhKU09CSlRZUEVfU1RBVElDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNDb25zdHJ1Y3RvcjxDSlNfQ29uc29sZSwgY29uc29sZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0Rlc3RydWN0b3I8Q0pTX0NvbnNvbGU+KTsKKyAgRGVmaW5lTWV0aG9kcyhwRW5naW5lLCBPYmpEZWZuSUQsIE1ldGhvZFNwZWNzLCBGWF9BcnJheVNpemUoTWV0aG9kU3BlY3MpKTsKK30KKworY29uc29sZTo6Y29uc29sZShDSlNfT2JqZWN0KiBwSlNPYmplY3QpIDogQ0pTX0VtYmVkT2JqKHBKU09iamVjdCkge30KKworY29uc29sZTo6fmNvbnNvbGUoKSB7fQorCitDSlNfUmV0dXJuIGNvbnNvbGU6OmNsZWFyKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gY29uc29sZTo6aGlkZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gY29uc29sZTo6cHJpbnRsbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4ocGFyYW1zLnNpemUoKSA+IDApOworfQorCitDSlNfUmV0dXJuIGNvbnNvbGU6OnNob3coQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy9janNfY29uc29sZS5oIGIvZnhqcy9janNfY29uc29sZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYTU1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc19jb25zb2xlLmgKQEAgLTAsMCArMSw0NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfQ0pTX0NPTlNPTEVfSF8KKyNkZWZpbmUgRlhKU19DSlNfQ09OU09MRV9IXworCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnhqcy9KU19EZWZpbmUuaCIKKworY2xhc3MgY29uc29sZSA6IHB1YmxpYyBDSlNfRW1iZWRPYmogeworIHB1YmxpYzoKKyAgZXhwbGljaXQgY29uc29sZShDSlNfT2JqZWN0KiBwSlNPYmplY3QpOworICB+Y29uc29sZSgpIG92ZXJyaWRlOworCisgcHVibGljOgorICBDSlNfUmV0dXJuIGNsZWFyKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gaGlkZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gcHJpbnRsbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gc2hvdyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7Cit9OworCitjbGFzcyBDSlNfQ29uc29sZSA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIERlZmluZUpTT2JqZWN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUpOworCisgIGV4cGxpY2l0IENKU19Db25zb2xlKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge30KKyAgfkNKU19Db25zb2xlKCkgb3ZlcnJpZGUge30KKworICBKU19TVEFUSUNfTUVUSE9EKGNsZWFyLCBjb25zb2xlKTsKKyAgSlNfU1RBVElDX01FVEhPRChoaWRlLCBjb25zb2xlKTsKKyAgSlNfU1RBVElDX01FVEhPRChwcmludGxuLCBjb25zb2xlKTsKKyAgSlNfU1RBVElDX01FVEhPRChzaG93LCBjb25zb2xlKTsKKworIHByaXZhdGU6CisgIHN0YXRpYyBpbnQgT2JqRGVmbklEOworICBzdGF0aWMgY29uc3QgSlNNZXRob2RTcGVjIE1ldGhvZFNwZWNzW107Cit9OworCisjZW5kaWYgIC8vIEZYSlNfQ0pTX0NPTlNPTEVfSF8KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX2RlbGF5ZGF0YS5jcHAgYi9meGpzL2Nqc19kZWxheWRhdGEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZTFmNzgKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc19kZWxheWRhdGEuY3BwCkBAIC0wLDAgKzEsMTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMvY2pzX2RlbGF5ZGF0YS5oIgorCitDSlNfRGVsYXlEYXRhOjpDSlNfRGVsYXlEYXRhKEZJRUxEX1BST1AgcHJvcCwgaW50IGlkeCwgY29uc3QgV2lkZVN0cmluZyYgbmFtZSkKKyAgICA6IGVQcm9wKHByb3ApLCBuQ29udHJvbEluZGV4KGlkeCksIHNGaWVsZE5hbWUobmFtZSkge30KKworQ0pTX0RlbGF5RGF0YTo6fkNKU19EZWxheURhdGEoKSB7fQpkaWZmIC0tZ2l0IGEvZnhqcy9janNfZGVsYXlkYXRhLmggYi9meGpzL2Nqc19kZWxheWRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWViNjVkCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfZGVsYXlkYXRhLmgKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfQ0pTX0RFTEFZREFUQV9IXworI2RlZmluZSBGWEpTX0NKU19ERUxBWURBVEFfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC93aWRlc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9jb2xvci5oIgorI2luY2x1ZGUgImZ4anMvY2pzX2ZpZWxkLmgiCisKK3N0cnVjdCBDSlNfRGVsYXlEYXRhIHsKKyAgQ0pTX0RlbGF5RGF0YShGSUVMRF9QUk9QIHByb3AsIGludCBpZHgsIGNvbnN0IFdpZGVTdHJpbmcmIG5hbWUpOworICB+Q0pTX0RlbGF5RGF0YSgpOworCisgIEZJRUxEX1BST1AgZVByb3A7CisgIGludCBuQ29udHJvbEluZGV4OworICBXaWRlU3RyaW5nIHNGaWVsZE5hbWU7CisgIGludDMyX3QgbnVtOworICBib29sIGI7CisgIEJ5dGVTdHJpbmcgc3RyaW5nOworICBXaWRlU3RyaW5nIHdpZGVzdHJpbmc7CisgIENGWF9GbG9hdFJlY3QgcmVjdDsKKyAgQ0ZYX0NvbG9yIGNvbG9yOworICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gd29yZGFycmF5OworICBzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nPiB3aWRlc3RyaW5nYXJyYXk7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfQ0pTX0RFTEFZREFUQV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy9janNfZGlzcGxheS5jcHAgYi9meGpzL2Nqc19kaXNwbGF5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTcwYmZjCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfZGlzcGxheS5jcHAKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy9janNfZGlzcGxheS5oIgorCitjb25zdCBKU0NvbnN0U3BlYyBDSlNfRGlzcGxheTo6Q29uc3RTcGVjc1tdID0geworICAgIHsidmlzaWJsZSIsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDAsIDB9LAorICAgIHsiaGlkZGVuIiwgSlNDb25zdFNwZWM6Ok51bWJlciwgMSwgMH0sCisgICAgeyJub1ByaW50IiwgSlNDb25zdFNwZWM6Ok51bWJlciwgMiwgMH0sCisgICAgeyJub1ZpZXciLCBKU0NvbnN0U3BlYzo6TnVtYmVyLCAzLCAwfX07CisKK2ludCBDSlNfRGlzcGxheTo6T2JqRGVmbklEID0gLTE7CisKKy8vIHN0YXRpYwordm9pZCBDSlNfRGlzcGxheTo6RGVmaW5lSlNPYmplY3RzKENGWEpTX0VuZ2luZSogcEVuZ2luZSkgeworICBPYmpEZWZuSUQgPQorICAgICAgcEVuZ2luZS0+RGVmaW5lT2JqKCJkaXNwbGF5IiwgRlhKU09CSlRZUEVfU1RBVElDLCBudWxscHRyLCBudWxscHRyKTsKKyAgRGVmaW5lQ29uc3RzKHBFbmdpbmUsIE9iakRlZm5JRCwgQ29uc3RTcGVjcywgRlhfQXJyYXlTaXplKENvbnN0U3BlY3MpKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX2Rpc3BsYXkuaCBiL2Z4anMvY2pzX2Rpc3BsYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjEzYzM4Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfZGlzcGxheS5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX0NKU19ESVNQTEFZX0hfCisjZGVmaW5lIEZYSlNfQ0pTX0RJU1BMQVlfSF8KKworI2luY2x1ZGUgImZ4anMvSlNfRGVmaW5lLmgiCisKK2NsYXNzIENKU19EaXNwbGF5IDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgRGVmaW5lSlNPYmplY3RzKENGWEpTX0VuZ2luZSogcEVuZ2luZSk7CisKKyAgZXhwbGljaXQgQ0pTX0Rpc3BsYXkodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQorICB+Q0pTX0Rpc3BsYXkoKSBvdmVycmlkZSB7fQorCisgcHJpdmF0ZToKKyAgc3RhdGljIGludCBPYmpEZWZuSUQ7CisgIHN0YXRpYyBjb25zdCBKU0NvbnN0U3BlYyBDb25zdFNwZWNzW107Cit9OworCisjZW5kaWYgIC8vIEZYSlNfQ0pTX0RJU1BMQVlfSF8KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX2RvY3VtZW50LmNwcCBiL2Z4anMvY2pzX2RvY3VtZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGVjYTJmCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfZG9jdW1lbnQuY3BwCkBAIC0wLDAgKzEsMTQ5OSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy9janNfZG9jdW1lbnQuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2ZvbnQuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhZ2VvYmplY3QuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3RleHRvYmplY3QuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfbmFtZS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9pbnRlcmZvcm0uaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9uYW1ldHJlZS5oIgorI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19hbm5vdGl0ZXJhdGlvbi5oIgorI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19pbnRlcmZvcm0uaCIKKyNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfcGFnZXZpZXcuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19hbm5vdC5oIgorI2luY2x1ZGUgImZ4anMvY2pzX2FwcC5oIgorI2luY2x1ZGUgImZ4anMvY2pzX2RlbGF5ZGF0YS5oIgorI2luY2x1ZGUgImZ4anMvY2pzX2ZpZWxkLmgiCisjaW5jbHVkZSAiZnhqcy9janNfaWNvbi5oIgorI2luY2x1ZGUgImZ4anMvY2pzX3ByaW50cGFyYW1zb2JqLmgiCisjaW5jbHVkZSAiZnhqcy9qc19yZXNvdXJjZXMuaCIKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgQ0pTX0RvY3VtZW50OjpQcm9wZXJ0eVNwZWNzW10gPSB7CisgICAgeyJBREJFIiwgZ2V0X0FEQkVfc3RhdGljLCBzZXRfQURCRV9zdGF0aWN9LAorICAgIHsiYXV0aG9yIiwgZ2V0X2F1dGhvcl9zdGF0aWMsIHNldF9hdXRob3Jfc3RhdGljfSwKKyAgICB7ImJhc2VVUkwiLCBnZXRfYmFzZV9VUkxfc3RhdGljLCBzZXRfYmFzZV9VUkxfc3RhdGljfSwKKyAgICB7ImJvb2ttYXJrUm9vdCIsIGdldF9ib29rbWFya19yb290X3N0YXRpYywgc2V0X2Jvb2ttYXJrX3Jvb3Rfc3RhdGljfSwKKyAgICB7ImNhbGN1bGF0ZSIsIGdldF9jYWxjdWxhdGVfc3RhdGljLCBzZXRfY2FsY3VsYXRlX3N0YXRpY30sCisgICAgeyJDb2xsYWIiLCBnZXRfY29sbGFiX3N0YXRpYywgc2V0X2NvbGxhYl9zdGF0aWN9LAorICAgIHsiY3JlYXRpb25EYXRlIiwgZ2V0X2NyZWF0aW9uX2RhdGVfc3RhdGljLCBzZXRfY3JlYXRpb25fZGF0ZV9zdGF0aWN9LAorICAgIHsiY3JlYXRvciIsIGdldF9jcmVhdG9yX3N0YXRpYywgc2V0X2NyZWF0b3Jfc3RhdGljfSwKKyAgICB7ImRlbGF5IiwgZ2V0X2RlbGF5X3N0YXRpYywgc2V0X2RlbGF5X3N0YXRpY30sCisgICAgeyJkaXJ0eSIsIGdldF9kaXJ0eV9zdGF0aWMsIHNldF9kaXJ0eV9zdGF0aWN9LAorICAgIHsiZG9jdW1lbnRGaWxlTmFtZSIsIGdldF9kb2N1bWVudF9maWxlX25hbWVfc3RhdGljLAorICAgICBzZXRfZG9jdW1lbnRfZmlsZV9uYW1lX3N0YXRpY30sCisgICAgeyJleHRlcm5hbCIsIGdldF9leHRlcm5hbF9zdGF0aWMsIHNldF9leHRlcm5hbF9zdGF0aWN9LAorICAgIHsiZmlsZXNpemUiLCBnZXRfZmlsZXNpemVfc3RhdGljLCBzZXRfZmlsZXNpemVfc3RhdGljfSwKKyAgICB7Imljb25zIiwgZ2V0X2ljb25zX3N0YXRpYywgc2V0X2ljb25zX3N0YXRpY30sCisgICAgeyJpbmZvIiwgZ2V0X2luZm9fc3RhdGljLCBzZXRfaW5mb19zdGF0aWN9LAorICAgIHsia2V5d29yZHMiLCBnZXRfa2V5d29yZHNfc3RhdGljLCBzZXRfa2V5d29yZHNfc3RhdGljfSwKKyAgICB7ImxheW91dCIsIGdldF9sYXlvdXRfc3RhdGljLCBzZXRfbGF5b3V0X3N0YXRpY30sCisgICAgeyJtZWRpYSIsIGdldF9tZWRpYV9zdGF0aWMsIHNldF9tZWRpYV9zdGF0aWN9LAorICAgIHsibW9kRGF0ZSIsIGdldF9tb2RfZGF0ZV9zdGF0aWMsIHNldF9tb2RfZGF0ZV9zdGF0aWN9LAorICAgIHsibW91c2VYIiwgZ2V0X21vdXNlX3hfc3RhdGljLCBzZXRfbW91c2VfeF9zdGF0aWN9LAorICAgIHsibW91c2VZIiwgZ2V0X21vdXNlX3lfc3RhdGljLCBzZXRfbW91c2VfeV9zdGF0aWN9LAorICAgIHsibnVtRmllbGRzIiwgZ2V0X251bV9maWVsZHNfc3RhdGljLCBzZXRfbnVtX2ZpZWxkc19zdGF0aWN9LAorICAgIHsibnVtUGFnZXMiLCBnZXRfbnVtX3BhZ2VzX3N0YXRpYywgc2V0X251bV9wYWdlc19zdGF0aWN9LAorICAgIHsicGFnZU51bSIsIGdldF9wYWdlX251bV9zdGF0aWMsIHNldF9wYWdlX251bV9zdGF0aWN9LAorICAgIHsicGFnZVdpbmRvd1JlY3QiLCBnZXRfcGFnZV93aW5kb3dfcmVjdF9zdGF0aWMsCisgICAgIHNldF9wYWdlX3dpbmRvd19yZWN0X3N0YXRpY30sCisgICAgeyJwYXRoIiwgZ2V0X3BhdGhfc3RhdGljLCBzZXRfcGF0aF9zdGF0aWN9LAorICAgIHsicHJvZHVjZXIiLCBnZXRfcHJvZHVjZXJfc3RhdGljLCBzZXRfcHJvZHVjZXJfc3RhdGljfSwKKyAgICB7InN1YmplY3QiLCBnZXRfc3ViamVjdF9zdGF0aWMsIHNldF9zdWJqZWN0X3N0YXRpY30sCisgICAgeyJ0aXRsZSIsIGdldF90aXRsZV9zdGF0aWMsIHNldF90aXRsZV9zdGF0aWN9LAorICAgIHsiVVJMIiwgZ2V0X1VSTF9zdGF0aWMsIHNldF9VUkxfc3RhdGljfSwKKyAgICB7Inpvb20iLCBnZXRfem9vbV9zdGF0aWMsIHNldF96b29tX3N0YXRpY30sCisgICAgeyJ6b29tVHlwZSIsIGdldF96b29tX3R5cGVfc3RhdGljLCBzZXRfem9vbV90eXBlX3N0YXRpY319OworCitjb25zdCBKU01ldGhvZFNwZWMgQ0pTX0RvY3VtZW50OjpNZXRob2RTcGVjc1tdID0geworICAgIHsiYWRkQW5ub3QiLCBhZGRBbm5vdF9zdGF0aWN9LAorICAgIHsiYWRkRmllbGQiLCBhZGRGaWVsZF9zdGF0aWN9LAorICAgIHsiYWRkTGluayIsIGFkZExpbmtfc3RhdGljfSwKKyAgICB7ImFkZEljb24iLCBhZGRJY29uX3N0YXRpY30sCisgICAgeyJjYWxjdWxhdGVOb3ciLCBjYWxjdWxhdGVOb3dfc3RhdGljfSwKKyAgICB7ImNsb3NlRG9jIiwgY2xvc2VEb2Nfc3RhdGljfSwKKyAgICB7ImNyZWF0ZURhdGFPYmplY3QiLCBjcmVhdGVEYXRhT2JqZWN0X3N0YXRpY30sCisgICAgeyJkZWxldGVQYWdlcyIsIGRlbGV0ZVBhZ2VzX3N0YXRpY30sCisgICAgeyJleHBvcnRBc1RleHQiLCBleHBvcnRBc1RleHRfc3RhdGljfSwKKyAgICB7ImV4cG9ydEFzRkRGIiwgZXhwb3J0QXNGREZfc3RhdGljfSwKKyAgICB7ImV4cG9ydEFzWEZERiIsIGV4cG9ydEFzWEZERl9zdGF0aWN9LAorICAgIHsiZXh0cmFjdFBhZ2VzIiwgZXh0cmFjdFBhZ2VzX3N0YXRpY30sCisgICAgeyJnZXRBbm5vdCIsIGdldEFubm90X3N0YXRpY30sCisgICAgeyJnZXRBbm5vdHMiLCBnZXRBbm5vdHNfc3RhdGljfSwKKyAgICB7ImdldEFubm90M0QiLCBnZXRBbm5vdDNEX3N0YXRpY30sCisgICAgeyJnZXRBbm5vdHMzRCIsIGdldEFubm90czNEX3N0YXRpY30sCisgICAgeyJnZXRGaWVsZCIsIGdldEZpZWxkX3N0YXRpY30sCisgICAgeyJnZXRJY29uIiwgZ2V0SWNvbl9zdGF0aWN9LAorICAgIHsiZ2V0TGlua3MiLCBnZXRMaW5rc19zdGF0aWN9LAorICAgIHsiZ2V0TnRoRmllbGROYW1lIiwgZ2V0TnRoRmllbGROYW1lX3N0YXRpY30sCisgICAgeyJnZXRPQ0dzIiwgZ2V0T0NHc19zdGF0aWN9LAorICAgIHsiZ2V0UGFnZUJveCIsIGdldFBhZ2VCb3hfc3RhdGljfSwKKyAgICB7ImdldFBhZ2VOdGhXb3JkIiwgZ2V0UGFnZU50aFdvcmRfc3RhdGljfSwKKyAgICB7ImdldFBhZ2VOdGhXb3JkUXVhZHMiLCBnZXRQYWdlTnRoV29yZFF1YWRzX3N0YXRpY30sCisgICAgeyJnZXRQYWdlTnVtV29yZHMiLCBnZXRQYWdlTnVtV29yZHNfc3RhdGljfSwKKyAgICB7ImdldFByaW50UGFyYW1zIiwgZ2V0UHJpbnRQYXJhbXNfc3RhdGljfSwKKyAgICB7ImdldFVSTCIsIGdldFVSTF9zdGF0aWN9LAorICAgIHsiZ290b05hbWVkRGVzdCIsIGdvdG9OYW1lZERlc3Rfc3RhdGljfSwKKyAgICB7ImltcG9ydEFuRkRGIiwgaW1wb3J0QW5GREZfc3RhdGljfSwKKyAgICB7ImltcG9ydEFuWEZERiIsIGltcG9ydEFuWEZERl9zdGF0aWN9LAorICAgIHsiaW1wb3J0VGV4dERhdGEiLCBpbXBvcnRUZXh0RGF0YV9zdGF0aWN9LAorICAgIHsiaW5zZXJ0UGFnZXMiLCBpbnNlcnRQYWdlc19zdGF0aWN9LAorICAgIHsibWFpbEZvcm0iLCBtYWlsRm9ybV9zdGF0aWN9LAorICAgIHsicHJpbnQiLCBwcmludF9zdGF0aWN9LAorICAgIHsicmVtb3ZlRmllbGQiLCByZW1vdmVGaWVsZF9zdGF0aWN9LAorICAgIHsicmVwbGFjZVBhZ2VzIiwgcmVwbGFjZVBhZ2VzX3N0YXRpY30sCisgICAgeyJyZXNldEZvcm0iLCByZXNldEZvcm1fc3RhdGljfSwKKyAgICB7InJlbW92ZUljb24iLCByZW1vdmVJY29uX3N0YXRpY30sCisgICAgeyJzYXZlQXMiLCBzYXZlQXNfc3RhdGljfSwKKyAgICB7InN1Ym1pdEZvcm0iLCBzdWJtaXRGb3JtX3N0YXRpY30sCisgICAgeyJzeW5jQW5ub3RTY2FuIiwgc3luY0Fubm90U2Nhbl9zdGF0aWN9LAorICAgIHsibWFpbERvYyIsIG1haWxEb2Nfc3RhdGljfX07CisKK2ludCBDSlNfRG9jdW1lbnQ6Ok9iakRlZm5JRCA9IC0xOworCisvLyBzdGF0aWMKK2ludCBDSlNfRG9jdW1lbnQ6OkdldE9iakRlZm5JRCgpIHsKKyAgcmV0dXJuIE9iakRlZm5JRDsKK30KKworLy8gc3RhdGljCit2b2lkIENKU19Eb2N1bWVudDo6RGVmaW5lSlNPYmplY3RzKENGWEpTX0VuZ2luZSogcEVuZ2luZSkgeworICBPYmpEZWZuSUQgPSBwRW5naW5lLT5EZWZpbmVPYmooIkRvY3VtZW50IiwgRlhKU09CSlRZUEVfR0xPQkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNDb25zdHJ1Y3RvcjxDSlNfRG9jdW1lbnQsIERvY3VtZW50PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTRGVzdHJ1Y3RvcjxDSlNfRG9jdW1lbnQ+KTsKKyAgRGVmaW5lUHJvcHMocEVuZ2luZSwgT2JqRGVmbklELCBQcm9wZXJ0eVNwZWNzLCBGWF9BcnJheVNpemUoUHJvcGVydHlTcGVjcykpOworICBEZWZpbmVNZXRob2RzKHBFbmdpbmUsIE9iakRlZm5JRCwgTWV0aG9kU3BlY3MsIEZYX0FycmF5U2l6ZShNZXRob2RTcGVjcykpOworfQorCit2b2lkIENKU19Eb2N1bWVudDo6SW5pdEluc3RhbmNlKElKU19SdW50aW1lKiBwSVJ1bnRpbWUpIHsKKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0gc3RhdGljX2Nhc3Q8Q0pTX1J1bnRpbWUqPihwSVJ1bnRpbWUpOworICBEb2N1bWVudCogcERvYyA9IHN0YXRpY19jYXN0PERvY3VtZW50Kj4oR2V0RW1iZWRPYmplY3QoKSk7CisgIHBEb2MtPlNldEZvcm1GaWxsRW52KHBSdW50aW1lLT5HZXRGb3JtRmlsbEVudigpKTsKK30KKworRG9jdW1lbnQ6OkRvY3VtZW50KENKU19PYmplY3QqIHBKU09iamVjdCkKKyAgICA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpLAorICAgICAgbV9wRm9ybUZpbGxFbnYobnVsbHB0ciksCisgICAgICBtX2N3QmFzZVVSTChMIiIpLAorICAgICAgbV9iRGVsYXkoZmFsc2UpIHt9CisKK0RvY3VtZW50Ojp+RG9jdW1lbnQoKSB7fQorCisvLyBUaGUgdG90YWwgbnVtYmVyIG9mIGZpZWxkcyBpbiBkb2N1bWVudC4KK0NKU19SZXR1cm4gRG9jdW1lbnQ6OmdldF9udW1fZmllbGRzKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBpZiAoIW1fcEZvcm1GaWxsRW52KQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a0JhZE9iamVjdEVycm9yKSk7CisKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBtX3BGb3JtRmlsbEVudi0+R2V0SW50ZXJGb3JtKCk7CisgIENQREZfSW50ZXJGb3JtKiBwUERGRm9ybSA9IHBJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOworICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3TnVtYmVyKAorICAgICAgc3RhdGljX2Nhc3Q8aW50PihwUERGRm9ybS0+Q291bnRGaWVsZHMoV2lkZVN0cmluZygpKSkpKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6c2V0X251bV9maWVsZHMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUmVhZE9ubHlFcnJvcikpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRfZGlydHkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIGlmICghbV9wRm9ybUZpbGxFbnYpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprQmFkT2JqZWN0RXJyb3IpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld0Jvb2xlYW4oISFtX3BGb3JtRmlsbEVudi0+R2V0Q2hhbmdlTWFyaygpKSk7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OnNldF9kaXJ0eShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIGlmICghbV9wRm9ybUZpbGxFbnYpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprQmFkT2JqZWN0RXJyb3IpKTsKKworICBwUnVudGltZS0+VG9Cb29sZWFuKHZwKSA/IG1fcEZvcm1GaWxsRW52LT5TZXRDaGFuZ2VNYXJrKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX3BGb3JtRmlsbEVudi0+Q2xlYXJDaGFuZ2VNYXJrKCk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRfQURCRShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1VuZGVmaW5lZCgpKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6c2V0X0FEQkUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6Z2V0X3BhZ2VfbnVtKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBpZiAoIW1fcEZvcm1GaWxsRW52KQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a0JhZE9iamVjdEVycm9yKSk7CisKKyAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gbV9wRm9ybUZpbGxFbnYtPkdldEN1cnJlbnRWaWV3KCk7CisgIGlmICghcFBhZ2VWaWV3KQorICAgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdVbmRlZmluZWQoKSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdOdW1iZXIocFBhZ2VWaWV3LT5HZXRQYWdlSW5kZXgoKSkpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpzZXRfcGFnZV9udW0oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIGlmICghbV9wRm9ybUZpbGxFbnYpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprQmFkT2JqZWN0RXJyb3IpKTsKKworICBpbnQgaVBhZ2VDb3VudCA9IG1fcEZvcm1GaWxsRW52LT5HZXRQYWdlQ291bnQoKTsKKyAgaW50IGlQYWdlTnVtID0gcFJ1bnRpbWUtPlRvSW50MzIodnApOworICBpZiAoaVBhZ2VOdW0gPj0gMCAmJiBpUGFnZU51bSA8IGlQYWdlQ291bnQpCisgICAgbV9wRm9ybUZpbGxFbnYtPkpTX2RvY2dvdG9QYWdlKGlQYWdlTnVtKTsKKyAgZWxzZSBpZiAoaVBhZ2VOdW0gPj0gaVBhZ2VDb3VudCkKKyAgICBtX3BGb3JtRmlsbEVudi0+SlNfZG9jZ290b1BhZ2UoaVBhZ2VDb3VudCAtIDEpOworICBlbHNlIGlmIChpUGFnZU51bSA8IDApCisgICAgbV9wRm9ybUZpbGxFbnYtPkpTX2RvY2dvdG9QYWdlKDApOworCisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjphZGRBbm5vdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICAvLyBOb3Qgc3VwcG9ydGVkLgorICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6YWRkRmllbGQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgLy8gTm90IHN1cHBvcnRlZC4KKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OmV4cG9ydEFzVGV4dCgKKyAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgorICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6ZXhwb3J0QXNGREYoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OmV4cG9ydEFzWEZERigKKyAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgorICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6Z2V0RmllbGQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPCAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKyAgaWYgKCFtX3BGb3JtRmlsbEVudikKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtCYWRPYmplY3RFcnJvcikpOworCisgIFdpZGVTdHJpbmcgd2lkZU5hbWUgPSBwUnVudGltZS0+VG9XaWRlU3RyaW5nKHBhcmFtc1swXSk7CisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gbV9wRm9ybUZpbGxFbnYtPkdldEludGVyRm9ybSgpOworICBDUERGX0ludGVyRm9ybSogcFBERkZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKKyAgaWYgKHBQREZGb3JtLT5Db3VudEZpZWxkcyh3aWRlTmFtZSkgPD0gMCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3VW5kZWZpbmVkKCkpOworCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwRmllbGRPYmogPQorICAgICAgcFJ1bnRpbWUtPk5ld0Z4RHluYW1pY09iaihDSlNfRmllbGQ6OkdldE9iakRlZm5JRCgpKTsKKyAgaWYgKHBGaWVsZE9iai5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENKU19GaWVsZCogcEpTRmllbGQgPQorICAgICAgc3RhdGljX2Nhc3Q8Q0pTX0ZpZWxkKj4ocFJ1bnRpbWUtPkdldE9iamVjdFByaXZhdGUocEZpZWxkT2JqKSk7CisgIEZpZWxkKiBwRmllbGQgPSBzdGF0aWNfY2FzdDxGaWVsZCo+KHBKU0ZpZWxkLT5HZXRFbWJlZE9iamVjdCgpKTsKKyAgcEZpZWxkLT5BdHRhY2hGaWVsZCh0aGlzLCB3aWRlTmFtZSk7CisgIGlmICghcEpTRmllbGQpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIHJldHVybiBDSlNfUmV0dXJuKHBKU0ZpZWxkLT5Ub1Y4T2JqZWN0KCkpOworfQorCisvLyBHZXRzIHRoZSBuYW1lIG9mIHRoZSBudGggZmllbGQgaW4gdGhlIGRvY3VtZW50CitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXROdGhGaWVsZE5hbWUoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworICBpZiAoIW1fcEZvcm1GaWxsRW52KQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a0JhZE9iamVjdEVycm9yKSk7CisKKyAgaW50IG5JbmRleCA9IHBSdW50aW1lLT5Ub0ludDMyKHBhcmFtc1swXSk7CisgIGlmIChuSW5kZXggPCAwKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1ZhbHVlRXJyb3IpKTsKKworICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IG1fcEZvcm1GaWxsRW52LT5HZXRJbnRlckZvcm0oKTsKKyAgQ1BERl9JbnRlckZvcm0qIHBQREZGb3JtID0gcEludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7CisgIENQREZfRm9ybUZpZWxkKiBwRmllbGQgPSBwUERGRm9ybS0+R2V0RmllbGQobkluZGV4LCBXaWRlU3RyaW5nKCkpOworICBpZiAoIXBGaWVsZCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcocEZpZWxkLT5HZXRGdWxsTmFtZSgpLmNfc3RyKCkpKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6aW1wb3J0QW5GREYoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OmltcG9ydEFuWEZERigKKyAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgorICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6aW1wb3J0VGV4dERhdGEoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKKy8vIGV4cG9ydHMgdGhlIGZvcm0gZGF0YSBhbmQgbWFpbHMgdGhlIHJlc3VsdGluZyBmZGYgZmlsZSBhcyBhbiBhdHRhY2htZW50IHRvCisvLyBhbGwgcmVjaXBpZW50cy4KKy8vIGNvbW1lbnQ6IG5lZWQgcmVhZGVyIHN1cHBvcnRzCitDSlNfUmV0dXJuIERvY3VtZW50OjptYWlsRm9ybShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIW1fcEZvcm1GaWxsRW52KQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a0JhZE9iamVjdEVycm9yKSk7CisgIGlmICghbV9wRm9ybUZpbGxFbnYtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0VYVFJBQ1RfQUNDRVNTKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQZXJtaXNzaW9uRXJyb3IpKTsKKworICBpbnQgaUxlbmd0aCA9IHBhcmFtcy5zaXplKCk7CisgIGJvb2wgYlVJID0gaUxlbmd0aCA+IDAgPyBwUnVudGltZS0+VG9Cb29sZWFuKHBhcmFtc1swXSkgOiB0cnVlOworICBXaWRlU3RyaW5nIGNUbyA9IGlMZW5ndGggPiAxID8gcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMV0pIDogTCIiOworICBXaWRlU3RyaW5nIGNDYyA9IGlMZW5ndGggPiAyID8gcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMl0pIDogTCIiOworICBXaWRlU3RyaW5nIGNCY2MgPSBpTGVuZ3RoID4gMyA/IHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzNdKSA6IEwiIjsKKyAgV2lkZVN0cmluZyBjU3ViamVjdCA9IGlMZW5ndGggPiA0ID8gcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbNF0pIDogTCIiOworICBXaWRlU3RyaW5nIGNNc2cgPSBpTGVuZ3RoID4gNSA/IHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzVdKSA6IEwiIjsKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBtX3BGb3JtRmlsbEVudi0+R2V0SW50ZXJGb3JtKCk7CisgIEJ5dGVTdHJpbmcgc1RleHRCdWYgPSBwSW50ZXJGb3JtLT5FeHBvcnRGb3JtVG9GREZUZXh0QnVmKCk7CisgIGlmIChzVGV4dEJ1Zi5HZXRMZW5ndGgoKSA9PSAwKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBzaXplX3QgbkJ1ZlNpemUgPSBzVGV4dEJ1Zi5HZXRMZW5ndGgoKTsKKyAgY2hhciogcE11dGFibGVCdWYgPSBGWF9BbGxvYyhjaGFyLCBuQnVmU2l6ZSk7CisgIG1lbWNweShwTXV0YWJsZUJ1Ziwgc1RleHRCdWYuY19zdHIoKSwgbkJ1ZlNpemUpOworCisgIHBSdW50aW1lLT5CZWdpbkJsb2NrKCk7CisgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52ID0gcFJ1bnRpbWUtPkdldEZvcm1GaWxsRW52KCk7CisgIHBGb3JtRmlsbEVudi0+SlNfZG9jbWFpbEZvcm0ocE11dGFibGVCdWYsIG5CdWZTaXplLCBiVUksIGNUby5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNTdWJqZWN0LmNfc3RyKCksIGNDYy5jX3N0cigpLCBjQmNjLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY01zZy5jX3N0cigpKTsKKyAgcFJ1bnRpbWUtPkVuZEJsb2NrKCk7CisgIEZYX0ZyZWUocE11dGFibGVCdWYpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6cHJpbnQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKCFtX3BGb3JtRmlsbEVudikKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtCYWRPYmplY3RFcnJvcikpOworCisgIGJvb2wgYlVJID0gdHJ1ZTsKKyAgaW50IG5TdGFydCA9IDA7CisgIGludCBuRW5kID0gMDsKKyAgYm9vbCBiU2lsZW50ID0gZmFsc2U7CisgIGJvb2wgYlNocmlua1RvRml0ID0gZmFsc2U7CisgIGJvb2wgYlByaW50QXNJbWFnZSA9IGZhbHNlOworICBib29sIGJSZXZlcnNlID0gZmFsc2U7CisgIGJvb2wgYkFubm90YXRpb25zID0gZmFsc2U7CisgIGludCBubGVuZ3RoID0gcGFyYW1zLnNpemUoKTsKKyAgaWYgKG5sZW5ndGggPT0gOSkgeworICAgIGlmIChwYXJhbXNbOF0tPklzT2JqZWN0KCkpIHsKKyAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqID0gcFJ1bnRpbWUtPlRvT2JqZWN0KHBhcmFtc1s4XSk7CisgICAgICBpZiAoQ0ZYSlNfRW5naW5lOjpHZXRPYmpEZWZuSUQocE9iaikgPT0KKyAgICAgICAgICBDSlNfUHJpbnRQYXJhbXNPYmo6OkdldE9iakRlZm5JRCgpKSB7CisgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqID0gcFJ1bnRpbWUtPlRvT2JqZWN0KHBhcmFtc1s4XSk7CisgICAgICAgIENKU19PYmplY3QqIHBKU09iaiA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxDSlNfT2JqZWN0Kj4ocFJ1bnRpbWUtPkdldE9iamVjdFByaXZhdGUocE9iaikpOworICAgICAgICBpZiAocEpTT2JqKSB7CisgICAgICAgICAgaWYgKFByaW50UGFyYW1zT2JqKiBwcHJpbnRwYXJhbXNPYmogPQorICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UHJpbnRQYXJhbXNPYmoqPihwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpKSB7CisgICAgICAgICAgICBiVUkgPSBwcHJpbnRwYXJhbXNPYmotPmJVSTsKKyAgICAgICAgICAgIG5TdGFydCA9IHBwcmludHBhcmFtc09iai0+blN0YXJ0OworICAgICAgICAgICAgbkVuZCA9IHBwcmludHBhcmFtc09iai0+bkVuZDsKKyAgICAgICAgICAgIGJTaWxlbnQgPSBwcHJpbnRwYXJhbXNPYmotPmJTaWxlbnQ7CisgICAgICAgICAgICBiU2hyaW5rVG9GaXQgPSBwcHJpbnRwYXJhbXNPYmotPmJTaHJpbmtUb0ZpdDsKKyAgICAgICAgICAgIGJQcmludEFzSW1hZ2UgPSBwcHJpbnRwYXJhbXNPYmotPmJQcmludEFzSW1hZ2U7CisgICAgICAgICAgICBiUmV2ZXJzZSA9IHBwcmludHBhcmFtc09iai0+YlJldmVyc2U7CisgICAgICAgICAgICBiQW5ub3RhdGlvbnMgPSBwcHJpbnRwYXJhbXNPYmotPmJBbm5vdGF0aW9uczsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKG5sZW5ndGggPj0gMSkKKyAgICAgIGJVSSA9IHBSdW50aW1lLT5Ub0Jvb2xlYW4ocGFyYW1zWzBdKTsKKyAgICBpZiAobmxlbmd0aCA+PSAyKQorICAgICAgblN0YXJ0ID0gcFJ1bnRpbWUtPlRvSW50MzIocGFyYW1zWzFdKTsKKyAgICBpZiAobmxlbmd0aCA+PSAzKQorICAgICAgbkVuZCA9IHBSdW50aW1lLT5Ub0ludDMyKHBhcmFtc1syXSk7CisgICAgaWYgKG5sZW5ndGggPj0gNCkKKyAgICAgIGJTaWxlbnQgPSBwUnVudGltZS0+VG9Cb29sZWFuKHBhcmFtc1szXSk7CisgICAgaWYgKG5sZW5ndGggPj0gNSkKKyAgICAgIGJTaHJpbmtUb0ZpdCA9IHBSdW50aW1lLT5Ub0Jvb2xlYW4ocGFyYW1zWzRdKTsKKyAgICBpZiAobmxlbmd0aCA+PSA2KQorICAgICAgYlByaW50QXNJbWFnZSA9IHBSdW50aW1lLT5Ub0Jvb2xlYW4ocGFyYW1zWzVdKTsKKyAgICBpZiAobmxlbmd0aCA+PSA3KQorICAgICAgYlJldmVyc2UgPSBwUnVudGltZS0+VG9Cb29sZWFuKHBhcmFtc1s2XSk7CisgICAgaWYgKG5sZW5ndGggPj0gOCkKKyAgICAgIGJBbm5vdGF0aW9ucyA9IHBSdW50aW1lLT5Ub0Jvb2xlYW4ocGFyYW1zWzddKTsKKyAgfQorCisgIGlmICghbV9wRm9ybUZpbGxFbnYpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIG1fcEZvcm1GaWxsRW52LT5KU19kb2NwcmludChiVUksIG5TdGFydCwgbkVuZCwgYlNpbGVudCwgYlNocmlua1RvRml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlByaW50QXNJbWFnZSwgYlJldmVyc2UsIGJBbm5vdGF0aW9ucyk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCisvLyByZW1vdmVzIHRoZSBzcGVjaWZpZWQgZmllbGQgZnJvbSB0aGUgZG9jdW1lbnQuCisvLyBjb21tZW50OgorLy8gbm90ZTogaWYgdGhlIGZpbGVkIG5hbWUgaXMgbm90IHJhdGlvbmFsLCBhZG9iZSBpcyBkdW1iIGZvciBpdC4KKworQ0pTX1JldHVybiBEb2N1bWVudDo6cmVtb3ZlRmllbGQoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworICBpZiAoIW1fcEZvcm1GaWxsRW52KQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a0JhZE9iamVjdEVycm9yKSk7CisKKyAgaWYgKCEobV9wRm9ybUZpbGxFbnYtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSkgfHwKKyAgICAgICAgbV9wRm9ybUZpbGxFbnYtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0FOTk9UX0ZPUk0pKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQZXJtaXNzaW9uRXJyb3IpKTsKKworICBXaWRlU3RyaW5nIHNGaWVsZE5hbWUgPSBwUnVudGltZS0+VG9XaWRlU3RyaW5nKHBhcmFtc1swXSk7CisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gbV9wRm9ybUZpbGxFbnYtPkdldEludGVyRm9ybSgpOworICBzdGQ6OnZlY3RvcjxDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0cj4gd2lkZ2V0czsKKyAgcEludGVyRm9ybS0+R2V0V2lkZ2V0cyhzRmllbGROYW1lLCAmd2lkZ2V0cyk7CisgIGlmICh3aWRnZXRzLmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgZm9yIChjb25zdCBhdXRvJiBwQW5ub3QgOiB3aWRnZXRzKSB7CisgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBzdGF0aWNfY2FzdDxDUERGU0RLX1dpZGdldCo+KHBBbm5vdC5HZXQoKSk7CisgICAgaWYgKCFwV2lkZ2V0KQorICAgICAgY29udGludWU7CisKKyAgICBDRlhfRmxvYXRSZWN0IHJjQW5ub3QgPSBwV2lkZ2V0LT5HZXRSZWN0KCk7CisgICAgLS1yY0Fubm90LmxlZnQ7CisgICAgLS1yY0Fubm90LmJvdHRvbTsKKyAgICArK3JjQW5ub3QucmlnaHQ7CisgICAgKytyY0Fubm90LnRvcDsKKworICAgIHN0ZDo6dmVjdG9yPENGWF9GbG9hdFJlY3Q+IGFSZWZyZXNoKDEsIHJjQW5ub3QpOworICAgIFVuZGVybHlpbmdQYWdlVHlwZSogcFBhZ2UgPSBwV2lkZ2V0LT5HZXRVbmRlcmx5aW5nUGFnZSgpOworICAgIEFTU0VSVChwUGFnZSk7CisKKyAgICAvLyBJZiB0aGVyZSBpcyBjdXJyZW50bHkgbm8gcGFnZXZpZXcgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYWdlIGJlaW5nIHVzZWQKKyAgICAvLyBkbyBub3QgY3JlYXRlIG9uZS4gV2UgbWF5IGJlIGluIHRoZSBwcm9jZXNzIG9mIHRlYXJpbmcgZG93biB0aGUgZG9jdW1lbnQKKyAgICAvLyBhbmQgY3JlYXRpbmcgYSBuZXcgcGFnZXZpZXcgYXQgdGhpcyBwb2ludCB3aWxsIGNhdXNlIGJhZCB0aGluZ3MuCisgICAgQ1BERlNES19QYWdlVmlldyogcFBhZ2VWaWV3ID0gbV9wRm9ybUZpbGxFbnYtPkdldFBhZ2VWaWV3KHBQYWdlLCBmYWxzZSk7CisgICAgaWYgKHBQYWdlVmlldykgeworI2lmIFBERl9FTkFCTEVfWEZBCisgICAgICBwUGFnZVZpZXctPkRlbGV0ZUFubm90KHBXaWRnZXQpOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorICAgICAgcFBhZ2VWaWV3LT5VcGRhdGVSZWN0cyhhUmVmcmVzaCk7CisgICAgfQorICB9CisgIG1fcEZvcm1GaWxsRW52LT5TZXRDaGFuZ2VNYXJrKCk7CisKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKKy8vIHJlc2V0IGZpbGVkIHZhbHVlcyB3aXRoaW4gYSBkb2N1bWVudC4KKy8vIGNvbW1lbnQ6CisvLyBub3RlOiBpZiB0aGUgZmllbGRzIG5hbWVzIHIgbm90IHJhdGlvbmFsLCBhb2RiZSBpcyBkdW1iIGZvciBpdC4KKworQ0pTX1JldHVybiBEb2N1bWVudDo6cmVzZXRGb3JtKAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIW1fcEZvcm1GaWxsRW52KQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a0JhZE9iamVjdEVycm9yKSk7CisgIGlmICghKG1fcEZvcm1GaWxsRW52LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpIHx8CisgICAgICAgIG1fcEZvcm1GaWxsRW52LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9BTk5PVF9GT1JNKSB8fAorICAgICAgICBtX3BGb3JtRmlsbEVudi0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRklMTF9GT1JNKSkpIHsKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQZXJtaXNzaW9uRXJyb3IpKTsKKyAgfQorCisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gbV9wRm9ybUZpbGxFbnYtPkdldEludGVyRm9ybSgpOworICBDUERGX0ludGVyRm9ybSogcFBERkZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKKyAgaWYgKHBhcmFtcy5lbXB0eSgpKSB7CisgICAgcFBERkZvcm0tPlJlc2V0Rm9ybSh0cnVlKTsKKyAgICBtX3BGb3JtRmlsbEVudi0+U2V0Q2hhbmdlTWFyaygpOworICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworICB9CisKKyAgdjg6OkxvY2FsPHY4OjpBcnJheT4gYXJyYXk7CisgIGlmIChwYXJhbXNbMF0tPklzU3RyaW5nKCkpIHsKKyAgICBhcnJheSA9IHBSdW50aW1lLT5OZXdBcnJheSgpOworICAgIHBSdW50aW1lLT5QdXRBcnJheUVsZW1lbnQoYXJyYXksIDAsIHBhcmFtc1swXSk7CisgIH0gZWxzZSB7CisgICAgYXJyYXkgPSBwUnVudGltZS0+VG9BcnJheShwYXJhbXNbMF0pOworICB9CisKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBhRmllbGRzOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBSdW50aW1lLT5HZXRBcnJheUxlbmd0aChhcnJheSk7ICsraSkgeworICAgIFdpZGVTdHJpbmcgc3dWYWwgPQorICAgICAgICBwUnVudGltZS0+VG9XaWRlU3RyaW5nKHBSdW50aW1lLT5HZXRBcnJheUVsZW1lbnQoYXJyYXksIGkpKTsKKyAgICBmb3IgKGludCBqID0gMCwganN6ID0gcFBERkZvcm0tPkNvdW50RmllbGRzKHN3VmFsKTsgaiA8IGpzejsgKytqKQorICAgICAgYUZpZWxkcy5wdXNoX2JhY2socFBERkZvcm0tPkdldEZpZWxkKGosIHN3VmFsKSk7CisgIH0KKworICBpZiAoIWFGaWVsZHMuZW1wdHkoKSkgeworICAgIHBQREZGb3JtLT5SZXNldEZvcm0oYUZpZWxkcywgdHJ1ZSwgdHJ1ZSk7CisgICAgbV9wRm9ybUZpbGxFbnYtPlNldENoYW5nZU1hcmsoKTsKKyAgfQorCisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpzYXZlQXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OnN5bmNBbm5vdFNjYW4oCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpzdWJtaXRGb3JtKAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpbnQgblNpemUgPSBwYXJhbXMuc2l6ZSgpOworICBpZiAoblNpemUgPCAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKyAgaWYgKCFtX3BGb3JtRmlsbEVudikKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtCYWRPYmplY3RFcnJvcikpOworCisgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IGFGaWVsZHM7CisgIFdpZGVTdHJpbmcgc3RyVVJMOworICBib29sIGJGREYgPSB0cnVlOworICBib29sIGJFbXB0eSA9IGZhbHNlOworICBpZiAocGFyYW1zWzBdLT5Jc1N0cmluZygpKSB7CisgICAgc3RyVVJMID0gcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMF0pOworICAgIGlmIChuU2l6ZSA+IDEpCisgICAgICBiRkRGID0gcFJ1bnRpbWUtPlRvQm9vbGVhbihwYXJhbXNbMV0pOworICAgIGlmIChuU2l6ZSA+IDIpCisgICAgICBiRW1wdHkgPSBwUnVudGltZS0+VG9Cb29sZWFuKHBhcmFtc1syXSk7CisgICAgaWYgKG5TaXplID4gMykKKyAgICAgIGFGaWVsZHMgPSBwUnVudGltZS0+VG9BcnJheShwYXJhbXNbM10pOworICB9IGVsc2UgaWYgKHBhcmFtc1swXS0+SXNPYmplY3QoKSkgeworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqID0gcFJ1bnRpbWUtPlRvT2JqZWN0KHBhcmFtc1swXSk7CisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlID0gcFJ1bnRpbWUtPkdldE9iamVjdFByb3BlcnR5KHBPYmosIEwiY1VSTCIpOworICAgIGlmICghcFZhbHVlLklzRW1wdHkoKSkKKyAgICAgIHN0clVSTCA9IHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcocFZhbHVlKTsKKworICAgIGJGREYgPSBwUnVudGltZS0+VG9Cb29sZWFuKHBSdW50aW1lLT5HZXRPYmplY3RQcm9wZXJ0eShwT2JqLCBMImJGREYiKSk7CisgICAgYkVtcHR5ID0gcFJ1bnRpbWUtPlRvQm9vbGVhbihwUnVudGltZS0+R2V0T2JqZWN0UHJvcGVydHkocE9iaiwgTCJiRW1wdHkiKSk7CisgICAgYUZpZWxkcyA9IHBSdW50aW1lLT5Ub0FycmF5KHBSdW50aW1lLT5HZXRPYmplY3RQcm9wZXJ0eShwT2JqLCBMImFGaWVsZHMiKSk7CisgIH0KKworICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IG1fcEZvcm1GaWxsRW52LT5HZXRJbnRlckZvcm0oKTsKKyAgQ1BERl9JbnRlckZvcm0qIHBQREZJbnRlckZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKKworICBpZiAocFJ1bnRpbWUtPkdldEFycmF5TGVuZ3RoKGFGaWVsZHMpID09IDAgJiYgYkVtcHR5KSB7CisgICAgaWYgKHBQREZJbnRlckZvcm0tPkNoZWNrUmVxdWlyZWRGaWVsZHMobnVsbHB0ciwgdHJ1ZSkpIHsKKyAgICAgIHBSdW50aW1lLT5CZWdpbkJsb2NrKCk7CisgICAgICBwSW50ZXJGb3JtLT5TdWJtaXRGb3JtKHN0clVSTCwgZmFsc2UpOworICAgICAgcFJ1bnRpbWUtPkVuZEJsb2NrKCk7CisgICAgfQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworICB9CisKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBmaWVsZE9iamVjdHM7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcFJ1bnRpbWUtPkdldEFycmF5TGVuZ3RoKGFGaWVsZHMpOyArK2kpIHsKKyAgICBXaWRlU3RyaW5nIHNOYW1lID0KKyAgICAgICAgcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwUnVudGltZS0+R2V0QXJyYXlFbGVtZW50KGFGaWVsZHMsIGkpKTsKKyAgICBDUERGX0ludGVyRm9ybSogcFBERkZvcm0gPSBwSW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKKyAgICBmb3IgKGludCBqID0gMCwganN6ID0gcFBERkZvcm0tPkNvdW50RmllbGRzKHNOYW1lKTsgaiA8IGpzejsgKytqKSB7CisgICAgICBDUERGX0Zvcm1GaWVsZCogcEZpZWxkID0gcFBERkZvcm0tPkdldEZpZWxkKGosIHNOYW1lKTsKKyAgICAgIGlmICghYkVtcHR5ICYmIHBGaWVsZC0+R2V0VmFsdWUoKS5Jc0VtcHR5KCkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBmaWVsZE9iamVjdHMucHVzaF9iYWNrKHBGaWVsZCk7CisgICAgfQorICB9CisKKyAgaWYgKHBQREZJbnRlckZvcm0tPkNoZWNrUmVxdWlyZWRGaWVsZHMoJmZpZWxkT2JqZWN0cywgdHJ1ZSkpIHsKKyAgICBwUnVudGltZS0+QmVnaW5CbG9jaygpOworICAgIHBJbnRlckZvcm0tPlN1Ym1pdEZpZWxkcyhzdHJVUkwsIGZpZWxkT2JqZWN0cywgdHJ1ZSwgIWJGREYpOworICAgIHBSdW50aW1lLT5FbmRCbG9jaygpOworICB9CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCit2b2lkIERvY3VtZW50OjpTZXRGb3JtRmlsbEVudihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgeworICBtX3BGb3JtRmlsbEVudi5SZXNldChwRm9ybUZpbGxFbnYpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRfYm9va21hcmtfcm9vdChDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OnNldF9ib29rbWFya19yb290KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjptYWlsRG9jKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgLy8gVE9ETyh0c2VwZXopOiBDaGVjayBtYXhpbXVtIG51bWJlciBvZiBhbGxvd2VkIHBhcmFtcy4KKyAgYm9vbCBiVUkgPSB0cnVlOworICBXaWRlU3RyaW5nIGNUbyA9IEwiIjsKKyAgV2lkZVN0cmluZyBjQ2MgPSBMIiI7CisgIFdpZGVTdHJpbmcgY0JjYyA9IEwiIjsKKyAgV2lkZVN0cmluZyBjU3ViamVjdCA9IEwiIjsKKyAgV2lkZVN0cmluZyBjTXNnID0gTCIiOworCisgIGlmIChwYXJhbXMuc2l6ZSgpID49IDEpCisgICAgYlVJID0gcFJ1bnRpbWUtPlRvQm9vbGVhbihwYXJhbXNbMF0pOworICBpZiAocGFyYW1zLnNpemUoKSA+PSAyKQorICAgIGNUbyA9IHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzFdKTsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMykKKyAgICBjQ2MgPSBwUnVudGltZS0+VG9XaWRlU3RyaW5nKHBhcmFtc1syXSk7CisgIGlmIChwYXJhbXMuc2l6ZSgpID49IDQpCisgICAgY0JjYyA9IHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzNdKTsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gNSkKKyAgICBjU3ViamVjdCA9IHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzRdKTsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gNikKKyAgICBjTXNnID0gcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbNV0pOworCisgIGlmIChwYXJhbXMuc2l6ZSgpID49IDEgJiYgcGFyYW1zWzBdLT5Jc09iamVjdCgpKSB7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmogPSBwUnVudGltZS0+VG9PYmplY3QocGFyYW1zWzBdKTsKKyAgICBiVUkgPSBwUnVudGltZS0+VG9Cb29sZWFuKHBSdW50aW1lLT5HZXRPYmplY3RQcm9wZXJ0eShwT2JqLCBMImJVSSIpKTsKKyAgICBjVG8gPSBwUnVudGltZS0+VG9XaWRlU3RyaW5nKHBSdW50aW1lLT5HZXRPYmplY3RQcm9wZXJ0eShwT2JqLCBMImNUbyIpKTsKKyAgICBjQ2MgPSBwUnVudGltZS0+VG9XaWRlU3RyaW5nKHBSdW50aW1lLT5HZXRPYmplY3RQcm9wZXJ0eShwT2JqLCBMImNDYyIpKTsKKyAgICBjQmNjID0gcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwUnVudGltZS0+R2V0T2JqZWN0UHJvcGVydHkocE9iaiwgTCJjQmNjIikpOworICAgIGNTdWJqZWN0ID0KKyAgICAgICAgcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwUnVudGltZS0+R2V0T2JqZWN0UHJvcGVydHkocE9iaiwgTCJjU3ViamVjdCIpKTsKKyAgICBjTXNnID0gcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwUnVudGltZS0+R2V0T2JqZWN0UHJvcGVydHkocE9iaiwgTCJjTXNnIikpOworICB9CisKKyAgcFJ1bnRpbWUtPkJlZ2luQmxvY2soKTsKKyAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYgPSBwUnVudGltZS0+R2V0Rm9ybUZpbGxFbnYoKTsKKyAgcEZvcm1GaWxsRW52LT5KU19kb2NtYWlsRm9ybShudWxscHRyLCAwLCBiVUksIGNUby5jX3N0cigpLCBjU3ViamVjdC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNDYy5jX3N0cigpLCBjQmNjLmNfc3RyKCksIGNNc2cuY19zdHIoKSk7CisgIHBSdW50aW1lLT5FbmRCbG9jaygpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6Z2V0X2F1dGhvcihDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgcmV0dXJuIGdldFByb3BlcnR5SW50ZXJuYWwocFJ1bnRpbWUsICJBdXRob3IiKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6c2V0X2F1dGhvcihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBzZXRQcm9wZXJ0eUludGVybmFsKHBSdW50aW1lLCB2cCwgIkF1dGhvciIpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRfaW5mbyhDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgaWYgKCFtX3BGb3JtRmlsbEVudikKKyAgICBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a0JhZE9iamVjdEVycm9yKSk7CisKKyAgY29uc3QgYXV0byogcERpY3Rpb25hcnkgPSBtX3BGb3JtRmlsbEVudi0+R2V0UERGRG9jdW1lbnQoKS0+R2V0SW5mbygpOworICBpZiAoIXBEaWN0aW9uYXJ5KQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBXaWRlU3RyaW5nIGN3QXV0aG9yID0gcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0Rm9yKCJBdXRob3IiKTsKKyAgV2lkZVN0cmluZyBjd1RpdGxlID0gcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0Rm9yKCJUaXRsZSIpOworICBXaWRlU3RyaW5nIGN3U3ViamVjdCA9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dEZvcigiU3ViamVjdCIpOworICBXaWRlU3RyaW5nIGN3S2V5d29yZHMgPSBwRGljdGlvbmFyeS0+R2V0VW5pY29kZVRleHRGb3IoIktleXdvcmRzIik7CisgIFdpZGVTdHJpbmcgY3dDcmVhdG9yID0gcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0Rm9yKCJDcmVhdG9yIik7CisgIFdpZGVTdHJpbmcgY3dQcm9kdWNlciA9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dEZvcigiUHJvZHVjZXIiKTsKKyAgV2lkZVN0cmluZyBjd0NyZWF0aW9uRGF0ZSA9IHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dEZvcigiQ3JlYXRpb25EYXRlIik7CisgIFdpZGVTdHJpbmcgY3dNb2REYXRlID0gcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0Rm9yKCJNb2REYXRlIik7CisgIFdpZGVTdHJpbmcgY3dUcmFwcGVkID0gcERpY3Rpb25hcnktPkdldFVuaWNvZGVUZXh0Rm9yKCJUcmFwcGVkIik7CisKKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmogPSBwUnVudGltZS0+TmV3RnhEeW5hbWljT2JqKC0xKTsKKyAgcFJ1bnRpbWUtPlB1dE9iamVjdFByb3BlcnR5KHBPYmosIEwiQXV0aG9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW50aW1lLT5OZXdTdHJpbmcoY3dBdXRob3IuQXNTdHJpbmdWaWV3KCkpKTsKKyAgcFJ1bnRpbWUtPlB1dE9iamVjdFByb3BlcnR5KHBPYmosIEwiVGl0bGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bnRpbWUtPk5ld1N0cmluZyhjd1RpdGxlLkFzU3RyaW5nVmlldygpKSk7CisgIHBSdW50aW1lLT5QdXRPYmplY3RQcm9wZXJ0eShwT2JqLCBMIlN1YmplY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bnRpbWUtPk5ld1N0cmluZyhjd1N1YmplY3QuQXNTdHJpbmdWaWV3KCkpKTsKKyAgcFJ1bnRpbWUtPlB1dE9iamVjdFByb3BlcnR5KHBPYmosIEwiS2V5d29yZHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bnRpbWUtPk5ld1N0cmluZyhjd0tleXdvcmRzLkFzU3RyaW5nVmlldygpKSk7CisgIHBSdW50aW1lLT5QdXRPYmplY3RQcm9wZXJ0eShwT2JqLCBMIkNyZWF0b3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bnRpbWUtPk5ld1N0cmluZyhjd0NyZWF0b3IuQXNTdHJpbmdWaWV3KCkpKTsKKyAgcFJ1bnRpbWUtPlB1dE9iamVjdFByb3BlcnR5KHBPYmosIEwiUHJvZHVjZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bnRpbWUtPk5ld1N0cmluZyhjd1Byb2R1Y2VyLkFzU3RyaW5nVmlldygpKSk7CisgIHBSdW50aW1lLT5QdXRPYmplY3RQcm9wZXJ0eSgKKyAgICAgIHBPYmosIEwiQ3JlYXRpb25EYXRlIiwKKyAgICAgIHBSdW50aW1lLT5OZXdTdHJpbmcoY3dDcmVhdGlvbkRhdGUuQXNTdHJpbmdWaWV3KCkpKTsKKyAgcFJ1bnRpbWUtPlB1dE9iamVjdFByb3BlcnR5KHBPYmosIEwiTW9kRGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnVudGltZS0+TmV3U3RyaW5nKGN3TW9kRGF0ZS5Bc1N0cmluZ1ZpZXcoKSkpOworICBwUnVudGltZS0+UHV0T2JqZWN0UHJvcGVydHkocE9iaiwgTCJUcmFwcGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW50aW1lLT5OZXdTdHJpbmcoY3dUcmFwcGVkLkFzU3RyaW5nVmlldygpKSk7CisKKyAgLy8gSXQncyB0byBiZSBjb21wYXRpYmxlIHRvIG5vbi1zdGFuZGFyZCBpbmZvIGRpY3Rpb25hcnkuCisgIGZvciAoY29uc3QgYXV0byYgaXQgOiAqcERpY3Rpb25hcnkpIHsKKyAgICBjb25zdCBCeXRlU3RyaW5nJiBic0tleSA9IGl0LmZpcnN0OworICAgIENQREZfT2JqZWN0KiBwVmFsdWVPYmogPSBpdC5zZWNvbmQuZ2V0KCk7CisgICAgV2lkZVN0cmluZyB3c0tleSA9IFdpZGVTdHJpbmc6OkZyb21VVEY4KGJzS2V5LkFzU3RyaW5nVmlldygpKTsKKyAgICBpZiAocFZhbHVlT2JqLT5Jc1N0cmluZygpIHx8IHBWYWx1ZU9iai0+SXNOYW1lKCkpIHsKKyAgICAgIHBSdW50aW1lLT5QdXRPYmplY3RQcm9wZXJ0eSgKKyAgICAgICAgICBwT2JqLCB3c0tleSwKKyAgICAgICAgICBwUnVudGltZS0+TmV3U3RyaW5nKHBWYWx1ZU9iai0+R2V0VW5pY29kZVRleHQoKS5Bc1N0cmluZ1ZpZXcoKSkpOworICAgIH0gZWxzZSBpZiAocFZhbHVlT2JqLT5Jc051bWJlcigpKSB7CisgICAgICBwUnVudGltZS0+UHV0T2JqZWN0UHJvcGVydHkocE9iaiwgd3NLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bnRpbWUtPk5ld051bWJlcihwVmFsdWVPYmotPkdldE51bWJlcigpKSk7CisgICAgfSBlbHNlIGlmIChwVmFsdWVPYmotPklzQm9vbGVhbigpKSB7CisgICAgICBwUnVudGltZS0+UHV0T2JqZWN0UHJvcGVydHkoCisgICAgICAgICAgcE9iaiwgd3NLZXksIHBSdW50aW1lLT5OZXdCb29sZWFuKCEhcFZhbHVlT2JqLT5HZXRJbnRlZ2VyKCkpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIENKU19SZXR1cm4ocE9iaik7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OnNldF9pbmZvKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUmVhZE9ubHlFcnJvcikpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRQcm9wZXJ0eUludGVybmFsKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgcHJvcE5hbWUpIHsKKyAgaWYgKCFtX3BGb3JtRmlsbEVudikKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtCYWRPYmplY3RFcnJvcikpOworCisgIENQREZfRGljdGlvbmFyeSogcERpY3Rpb25hcnkgPSBtX3BGb3JtRmlsbEVudi0+R2V0UERGRG9jdW1lbnQoKS0+R2V0SW5mbygpOworICBpZiAoIXBEaWN0aW9uYXJ5KQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKyAgcmV0dXJuIENKU19SZXR1cm4oCisgICAgICBwUnVudGltZS0+TmV3U3RyaW5nKHBEaWN0aW9uYXJ5LT5HZXRVbmljb2RlVGV4dEZvcihwcm9wTmFtZSkuY19zdHIoKSkpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpzZXRQcm9wZXJ0eUludGVybmFsKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIHByb3BOYW1lKSB7CisgIGlmICghbV9wRm9ybUZpbGxFbnYpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprQmFkT2JqZWN0RXJyb3IpKTsKKworICBDUERGX0RpY3Rpb25hcnkqIHBEaWN0aW9uYXJ5ID0gbV9wRm9ybUZpbGxFbnYtPkdldFBERkRvY3VtZW50KCktPkdldEluZm8oKTsKKyAgaWYgKCFwRGljdGlvbmFyeSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgaWYgKCFtX3BGb3JtRmlsbEVudi0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQZXJtaXNzaW9uRXJyb3IpKTsKKworICBXaWRlU3RyaW5nIGNzUHJvcGVydHkgPSBwUnVudGltZS0+VG9XaWRlU3RyaW5nKHZwKTsKKyAgcERpY3Rpb25hcnktPlNldE5ld0ZvcjxDUERGX1N0cmluZz4ocHJvcE5hbWUsIFBERl9FbmNvZGVUZXh0KGNzUHJvcGVydHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIG1fcEZvcm1GaWxsRW52LT5TZXRDaGFuZ2VNYXJrKCk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRfY3JlYXRpb25fZGF0ZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgcmV0dXJuIGdldFByb3BlcnR5SW50ZXJuYWwocFJ1bnRpbWUsICJDcmVhdGlvbkRhdGUiKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6c2V0X2NyZWF0aW9uX2RhdGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIHNldFByb3BlcnR5SW50ZXJuYWwocFJ1bnRpbWUsIHZwLCAiQ3JlYXRpb25EYXRlIik7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OmdldF9jcmVhdG9yKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICByZXR1cm4gZ2V0UHJvcGVydHlJbnRlcm5hbChwUnVudGltZSwgIkNyZWF0b3IiKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6c2V0X2NyZWF0b3IoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIHNldFByb3BlcnR5SW50ZXJuYWwocFJ1bnRpbWUsIHZwLCAiQ3JlYXRvciIpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRfZGVsYXkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIGlmICghbV9wRm9ybUZpbGxFbnYpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprQmFkT2JqZWN0RXJyb3IpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld0Jvb2xlYW4obV9iRGVsYXkpKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6c2V0X2RlbGF5KENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgaWYgKCFtX3BGb3JtRmlsbEVudikKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtCYWRPYmplY3RFcnJvcikpOworICBpZiAoIW1fcEZvcm1GaWxsRW52LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9NT0RJRlkpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1Blcm1pc3Npb25FcnJvcikpOworCisgIG1fYkRlbGF5ID0gcFJ1bnRpbWUtPlRvQm9vbGVhbih2cCk7CisgIGlmIChtX2JEZWxheSkgeworICAgIG1fRGVsYXlEYXRhLmNsZWFyKCk7CisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisgIH0KKworICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPENKU19EZWxheURhdGE+PiBEZWxheURhdGFUb1Byb2Nlc3M7CisgIERlbGF5RGF0YVRvUHJvY2Vzcy5zd2FwKG1fRGVsYXlEYXRhKTsKKyAgZm9yIChjb25zdCBhdXRvJiBwRGF0YSA6IERlbGF5RGF0YVRvUHJvY2VzcykKKyAgICBGaWVsZDo6RG9EZWxheShtX3BGb3JtRmlsbEVudi5HZXQoKSwgcERhdGEuZ2V0KCkpOworCisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRfa2V5d29yZHMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHJldHVybiBnZXRQcm9wZXJ0eUludGVybmFsKHBSdW50aW1lLCAiS2V5d29yZHMiKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6c2V0X2tleXdvcmRzKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gc2V0UHJvcGVydHlJbnRlcm5hbChwUnVudGltZSwgdnAsICJLZXl3b3JkcyIpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRfbW9kX2RhdGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHJldHVybiBnZXRQcm9wZXJ0eUludGVybmFsKHBSdW50aW1lLCAiTW9kRGF0ZSIpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpzZXRfbW9kX2RhdGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBzZXRQcm9wZXJ0eUludGVybmFsKHBSdW50aW1lLCB2cCwgIk1vZERhdGUiKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6Z2V0X3Byb2R1Y2VyKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICByZXR1cm4gZ2V0UHJvcGVydHlJbnRlcm5hbChwUnVudGltZSwgIlByb2R1Y2VyIik7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OnNldF9wcm9kdWNlcihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIHNldFByb3BlcnR5SW50ZXJuYWwocFJ1bnRpbWUsIHZwLCAiUHJvZHVjZXIiKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6Z2V0X3N1YmplY3QoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHJldHVybiBnZXRQcm9wZXJ0eUludGVybmFsKHBSdW50aW1lLCAiU3ViamVjdCIpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpzZXRfc3ViamVjdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gc2V0UHJvcGVydHlJbnRlcm5hbChwUnVudGltZSwgdnAsICJTdWJqZWN0Iik7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OmdldF90aXRsZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgaWYgKCFtX3BGb3JtRmlsbEVudiB8fCAhbV9wRm9ybUZpbGxFbnYtPkdldFVuZGVybHlpbmdEb2N1bWVudCgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a0JhZE9iamVjdEVycm9yKSk7CisgIHJldHVybiBnZXRQcm9wZXJ0eUludGVybmFsKHBSdW50aW1lLCAiVGl0bGUiKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6c2V0X3RpdGxlKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgaWYgKCFtX3BGb3JtRmlsbEVudiB8fCAhbV9wRm9ybUZpbGxFbnYtPkdldFVuZGVybHlpbmdEb2N1bWVudCgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a0JhZE9iamVjdEVycm9yKSk7CisgIHJldHVybiBzZXRQcm9wZXJ0eUludGVybmFsKHBSdW50aW1lLCB2cCwgIlRpdGxlIik7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OmdldF9udW1fcGFnZXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIGlmICghbV9wRm9ybUZpbGxFbnYpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprQmFkT2JqZWN0RXJyb3IpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld051bWJlcihtX3BGb3JtRmlsbEVudi0+R2V0UGFnZUNvdW50KCkpKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6c2V0X251bV9wYWdlcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1JlYWRPbmx5RXJyb3IpKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6Z2V0X2V4dGVybmFsKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICAvLyBJbiBDaHJvbWUgY2FzZSwgc2hvdWxkIGFsd2F5cyByZXR1cm4gdHJ1ZS4KKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld0Jvb2xlYW4odHJ1ZSkpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpzZXRfZXh0ZXJuYWwoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRfZmlsZXNpemUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdOdW1iZXIoMCkpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpzZXRfZmlsZXNpemUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1JlYWRPbmx5RXJyb3IpKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6Z2V0X21vdXNlX3goQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpzZXRfbW91c2VfeChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6Z2V0X21vdXNlX3koQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpzZXRfbW91c2VfeShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6Z2V0X1VSTChDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgaWYgKCFtX3BGb3JtRmlsbEVudikKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtCYWRPYmplY3RFcnJvcikpOworICByZXR1cm4gQ0pTX1JldHVybigKKyAgICAgIHBSdW50aW1lLT5OZXdTdHJpbmcobV9wRm9ybUZpbGxFbnYtPkpTX2RvY0dldEZpbGVQYXRoKCkuY19zdHIoKSkpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpzZXRfVVJMKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUmVhZE9ubHlFcnJvcikpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRfYmFzZV9VUkwoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcobV9jd0Jhc2VVUkwuY19zdHIoKSkpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpzZXRfYmFzZV9VUkwoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIG1fY3dCYXNlVVJMID0gcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyh2cCk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRfY2FsY3VsYXRlKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBpZiAoIW1fcEZvcm1GaWxsRW52KQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a0JhZE9iamVjdEVycm9yKSk7CisKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBtX3BGb3JtRmlsbEVudi0+R2V0SW50ZXJGb3JtKCk7CisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdCb29sZWFuKCEhcEludGVyRm9ybS0+SXNDYWxjdWxhdGVFbmFibGVkKCkpKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6c2V0X2NhbGN1bGF0ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIGlmICghbV9wRm9ybUZpbGxFbnYpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprQmFkT2JqZWN0RXJyb3IpKTsKKworICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IG1fcEZvcm1GaWxsRW52LT5HZXRJbnRlckZvcm0oKTsKKyAgcEludGVyRm9ybS0+RW5hYmxlQ2FsY3VsYXRlKHBSdW50aW1lLT5Ub0Jvb2xlYW4odnApKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OmdldF9kb2N1bWVudF9maWxlX25hbWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIGlmICghbV9wRm9ybUZpbGxFbnYpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprQmFkT2JqZWN0RXJyb3IpKTsKKworICBXaWRlU3RyaW5nIHdzRmlsZVBhdGggPSBtX3BGb3JtRmlsbEVudi0+SlNfZG9jR2V0RmlsZVBhdGgoKTsKKyAgc2l6ZV90IGkgPSB3c0ZpbGVQYXRoLkdldExlbmd0aCgpOworICBmb3IgKDsgaSA+IDA7IGktLSkgeworICAgIGlmICh3c0ZpbGVQYXRoW2kgLSAxXSA9PSBMJ1xcJyB8fCB3c0ZpbGVQYXRoW2kgLSAxXSA9PSBMJy8nKQorICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoaSA+IDAgJiYgaSA8IHdzRmlsZVBhdGguR2V0TGVuZ3RoKCkpIHsKKyAgICByZXR1cm4gQ0pTX1JldHVybigKKyAgICAgICAgcFJ1bnRpbWUtPk5ld1N0cmluZyh3c0ZpbGVQYXRoLkdldEJ1ZmZlcih3c0ZpbGVQYXRoLkdldExlbmd0aCgpKSArIGkpKTsKKyAgfQorICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3U3RyaW5nKEwiIikpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpzZXRfZG9jdW1lbnRfZmlsZV9uYW1lKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUmVhZE9ubHlFcnJvcikpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRfcGF0aChDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgaWYgKCFtX3BGb3JtRmlsbEVudikKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtCYWRPYmplY3RFcnJvcikpOworICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3U3RyaW5nKAorICAgICAgYXBwOjpTeXNQYXRoVG9QREZQYXRoKG1fcEZvcm1GaWxsRW52LT5KU19kb2NHZXRGaWxlUGF0aCgpKS5jX3N0cigpKSk7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OnNldF9wYXRoKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUmVhZE9ubHlFcnJvcikpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRfcGFnZV93aW5kb3dfcmVjdChDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OnNldF9wYWdlX3dpbmRvd19yZWN0KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRfbGF5b3V0KENKU19SdW50aW1lKiBwUnVudGltZSkgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6c2V0X2xheW91dChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjphZGRMaW5rKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OmNsb3NlRG9jKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRQYWdlQm94KAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6Z2V0QW5ub3QoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisgIGlmICghbV9wRm9ybUZpbGxFbnYpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprQmFkT2JqZWN0RXJyb3IpKTsKKworICBpbnQgblBhZ2VObyA9IHBSdW50aW1lLT5Ub0ludDMyKHBhcmFtc1swXSk7CisgIFdpZGVTdHJpbmcgc3dBbm5vdE5hbWUgPSBwUnVudGltZS0+VG9XaWRlU3RyaW5nKHBhcmFtc1sxXSk7CisgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IG1fcEZvcm1GaWxsRW52LT5HZXRQYWdlVmlldyhuUGFnZU5vKTsKKyAgaWYgKCFwUGFnZVZpZXcpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZTREtfQW5ub3RJdGVyYXRpb24gYW5ub3RJdGVyYXRpb24ocFBhZ2VWaWV3LCBmYWxzZSk7CisgIENQREZTREtfQkFBbm5vdCogcFNES0JBQW5ub3QgPSBudWxscHRyOworICBmb3IgKGNvbnN0IGF1dG8mIHBTREtBbm5vdEN1ciA6IGFubm90SXRlcmF0aW9uKSB7CisgICAgQ1BERlNES19CQUFubm90KiBwQkFBbm5vdCA9CisgICAgICAgIHN0YXRpY19jYXN0PENQREZTREtfQkFBbm5vdCo+KHBTREtBbm5vdEN1ci5HZXQoKSk7CisgICAgaWYgKHBCQUFubm90ICYmIHBCQUFubm90LT5HZXRBbm5vdE5hbWUoKSA9PSBzd0Fubm90TmFtZSkgeworICAgICAgcFNES0JBQW5ub3QgPSBwQkFBbm5vdDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoIXBTREtCQUFubm90KQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiA9CisgICAgICBwUnVudGltZS0+TmV3RnhEeW5hbWljT2JqKENKU19Bbm5vdDo6R2V0T2JqRGVmbklEKCkpOworICBpZiAocE9iai5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENKU19Bbm5vdCogcEpTX0Fubm90ID0KKyAgICAgIHN0YXRpY19jYXN0PENKU19Bbm5vdCo+KHBSdW50aW1lLT5HZXRPYmplY3RQcml2YXRlKHBPYmopKTsKKyAgaWYgKCFwSlNfQW5ub3QpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIEFubm90KiBwQW5ub3QgPSBzdGF0aWNfY2FzdDxBbm5vdCo+KHBKU19Bbm5vdC0+R2V0RW1iZWRPYmplY3QoKSk7CisgIHBBbm5vdC0+U2V0U0RLQW5ub3QocFNES0JBQW5ub3QpOworCisgIHJldHVybiBDSlNfUmV0dXJuKHBKU19Bbm5vdC0+VG9WOE9iamVjdCgpKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6Z2V0QW5ub3RzKAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIW1fcEZvcm1GaWxsRW52KQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a0JhZE9iamVjdEVycm9yKSk7CisKKyAgLy8gVE9ETyh0b25pa2l0b28pOiBBZGQgc3VwcG9ydCBzdXBwb3J0ZWQgcGFyYW1ldGVycyBhcyBwZXIKKyAgLy8gdGhlIFBERiBzcGVjLgorCisgIGludCBuUGFnZU5vID0gbV9wRm9ybUZpbGxFbnYtPkdldFBhZ2VDb3VudCgpOworICB2ODo6TG9jYWw8djg6OkFycmF5PiBhbm5vdHMgPSBwUnVudGltZS0+TmV3QXJyYXkoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuUGFnZU5vOyArK2kpIHsKKyAgICBDUERGU0RLX1BhZ2VWaWV3KiBwUGFnZVZpZXcgPSBtX3BGb3JtRmlsbEVudi0+R2V0UGFnZVZpZXcoaSk7CisgICAgaWYgKCFwUGFnZVZpZXcpCisgICAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgICBDUERGU0RLX0Fubm90SXRlcmF0aW9uIGFubm90SXRlcmF0aW9uKHBQYWdlVmlldywgZmFsc2UpOworICAgIGZvciAoY29uc3QgYXV0byYgcFNES0Fubm90Q3VyIDogYW5ub3RJdGVyYXRpb24pIHsKKyAgICAgIGlmICghcFNES0Fubm90Q3VyKQorICAgICAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtCYWRPYmplY3RFcnJvcikpOworCisgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiA9CisgICAgICAgICAgcFJ1bnRpbWUtPk5ld0Z4RHluYW1pY09iaihDSlNfQW5ub3Q6OkdldE9iakRlZm5JRCgpKTsKKyAgICAgIGlmIChwT2JqLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgICAgICBDSlNfQW5ub3QqIHBKU19Bbm5vdCA9CisgICAgICAgICAgc3RhdGljX2Nhc3Q8Q0pTX0Fubm90Kj4ocFJ1bnRpbWUtPkdldE9iamVjdFByaXZhdGUocE9iaikpOworICAgICAgQW5ub3QqIHBBbm5vdCA9IHN0YXRpY19jYXN0PEFubm90Kj4ocEpTX0Fubm90LT5HZXRFbWJlZE9iamVjdCgpKTsKKyAgICAgIHBBbm5vdC0+U2V0U0RLQW5ub3Qoc3RhdGljX2Nhc3Q8Q1BERlNES19CQUFubm90Kj4ocFNES0Fubm90Q3VyLkdldCgpKSk7CisgICAgICBwUnVudGltZS0+UHV0QXJyYXlFbGVtZW50KAorICAgICAgICAgIGFubm90cywgaSwKKyAgICAgICAgICBwSlNfQW5ub3QgPyB2ODo6TG9jYWw8djg6OlZhbHVlPihwSlNfQW5ub3QtPlRvVjhPYmplY3QoKSkKKyAgICAgICAgICAgICAgICAgICAgOiB2ODo6TG9jYWw8djg6OlZhbHVlPigpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIENKU19SZXR1cm4oYW5ub3RzKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6Z2V0QW5ub3QzRCgKKyAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1VuZGVmaW5lZCgpKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6Z2V0QW5ub3RzM0QoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRPQ0dzKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OmdldExpbmtzKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitib29sIERvY3VtZW50OjpJc0VuY2xvc2VkSW5SZWN0KENGWF9GbG9hdFJlY3QgcmVjdCwgQ0ZYX0Zsb2F0UmVjdCBMaW5rUmVjdCkgeworICByZXR1cm4gKHJlY3QubGVmdCA8PSBMaW5rUmVjdC5sZWZ0ICYmIHJlY3QudG9wIDw9IExpbmtSZWN0LnRvcCAmJgorICAgICAgICAgIHJlY3QucmlnaHQgPj0gTGlua1JlY3QucmlnaHQgJiYgcmVjdC5ib3R0b20gPj0gTGlua1JlY3QuYm90dG9tKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6YWRkSWNvbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIFdpZGVTdHJpbmcgc3dJY29uTmFtZSA9IHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzBdKTsKKyAgaWYgKCFwYXJhbXNbMV0tPklzT2JqZWN0KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprVHlwZUVycm9yKSk7CisKKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBKU0ljb24gPSBwUnVudGltZS0+VG9PYmplY3QocGFyYW1zWzFdKTsKKyAgaWYgKENGWEpTX0VuZ2luZTo6R2V0T2JqRGVmbklEKHBKU0ljb24pICE9IENKU19JY29uOjpHZXRPYmpEZWZuSUQoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtUeXBlRXJyb3IpKTsKKworICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiA9IHBSdW50aW1lLT5Ub09iamVjdChwYXJhbXNbMV0pOworICBDSlNfT2JqZWN0KiBvYmogPSBzdGF0aWNfY2FzdDxDSlNfT2JqZWN0Kj4ocFJ1bnRpbWUtPkdldE9iamVjdFByaXZhdGUocE9iaikpOworICBpZiAoIW9iai0+R2V0RW1iZWRPYmplY3QoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtUeXBlRXJyb3IpKTsKKworICBtX0ljb25OYW1lcy5wdXNoX2JhY2soc3dJY29uTmFtZSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRfaWNvbnMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIGlmIChtX0ljb25OYW1lcy5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdVbmRlZmluZWQoKSk7CisKKyAgdjg6OkxvY2FsPHY4OjpBcnJheT4gSWNvbnMgPSBwUnVudGltZS0+TmV3QXJyYXkoKTsKKyAgaW50IGkgPSAwOworICBmb3IgKGNvbnN0IGF1dG8mIG5hbWUgOiBtX0ljb25OYW1lcykgeworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqID0KKyAgICAgICAgcFJ1bnRpbWUtPk5ld0Z4RHluYW1pY09iaihDSlNfSWNvbjo6R2V0T2JqRGVmbklEKCkpOworICAgIGlmIChwT2JqLklzRW1wdHkoKSkKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICAgIENKU19JY29uKiBwSlNfSWNvbiA9CisgICAgICAgIHN0YXRpY19jYXN0PENKU19JY29uKj4ocFJ1bnRpbWUtPkdldE9iamVjdFByaXZhdGUocE9iaikpOworICAgIEljb24qIHBJY29uID0gc3RhdGljX2Nhc3Q8SWNvbio+KHBKU19JY29uLT5HZXRFbWJlZE9iamVjdCgpKTsKKyAgICBwSWNvbi0+U2V0SWNvbk5hbWUobmFtZSk7CisgICAgcFJ1bnRpbWUtPlB1dEFycmF5RWxlbWVudChJY29ucywgaSsrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEpTX0ljb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHY4OjpMb2NhbDx2ODo6VmFsdWU+KHBKU19JY29uLT5Ub1Y4T2JqZWN0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB2ODo6TG9jYWw8djg6OlZhbHVlPigpKTsKKyAgfQorICByZXR1cm4gQ0pTX1JldHVybihJY29ucyk7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OnNldF9pY29ucyhDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1JlYWRPbmx5RXJyb3IpKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6Z2V0SWNvbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIFdpZGVTdHJpbmcgc3dJY29uTmFtZSA9IHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzBdKTsKKyAgYXV0byBpdCA9IHN0ZDo6ZmluZChtX0ljb25OYW1lcy5iZWdpbigpLCBtX0ljb25OYW1lcy5lbmQoKSwgc3dJY29uTmFtZSk7CisgIGlmIChpdCA9PSBtX0ljb25OYW1lcy5lbmQoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmogPQorICAgICAgcFJ1bnRpbWUtPk5ld0Z4RHluYW1pY09iaihDSlNfSWNvbjo6R2V0T2JqRGVmbklEKCkpOworICBpZiAocE9iai5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENKU19JY29uKiBwSlNfSWNvbiA9IHN0YXRpY19jYXN0PENKU19JY29uKj4ocFJ1bnRpbWUtPkdldE9iamVjdFByaXZhdGUocE9iaikpOworICBpZiAoIXBKU19JY29uKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBJY29uKiBwSWNvbiA9IHN0YXRpY19jYXN0PEljb24qPihwSlNfSWNvbi0+R2V0RW1iZWRPYmplY3QoKSk7CisgIHBJY29uLT5TZXRJY29uTmFtZSgqaXQpOworICByZXR1cm4gQ0pTX1JldHVybihwSlNfSWNvbi0+VG9WOE9iamVjdCgpKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6cmVtb3ZlSWNvbigKKyAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgLy8gVW5zYWZlLCBubyBzdXBwb3J0ZWQuCisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpjcmVhdGVEYXRhT2JqZWN0KAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICAvLyBVbnNhZmUsIG5vdCBpbXBsZW1lbnRlZC4KKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OmdldF9tZWRpYShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OnNldF9tZWRpYShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpjYWxjdWxhdGVOb3coCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmICghbV9wRm9ybUZpbGxFbnYpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprQmFkT2JqZWN0RXJyb3IpKTsKKworICBpZiAoIShtX3BGb3JtRmlsbEVudi0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fTU9ESUZZKSB8fAorICAgICAgICBtX3BGb3JtRmlsbEVudi0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fQU5OT1RfRk9STSkgfHwKKyAgICAgICAgbV9wRm9ybUZpbGxFbnYtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0ZJTExfRk9STSkpKSB7CisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGVybWlzc2lvbkVycm9yKSk7CisgIH0KKworICBtX3BGb3JtRmlsbEVudi0+R2V0SW50ZXJGb3JtKCktPk9uQ2FsY3VsYXRlKCk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRfY29sbGFiKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6c2V0X2NvbGxhYihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRQYWdlTnRoV29yZCgKKyAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKCFtX3BGb3JtRmlsbEVudikKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtCYWRPYmplY3RFcnJvcikpOworICBpZiAoIW1fcEZvcm1GaWxsRW52LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9FWFRSQUNUX0FDQ0VTUykpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGVybWlzc2lvbkVycm9yKSk7CisKKyAgLy8gVE9ETyh0c2VwZXopOiBjaGVjayBtYXhpbXVtIGFsbG93YWJsZSBwYXJhbXMuCisKKyAgaW50IG5QYWdlTm8gPSBwYXJhbXMuc2l6ZSgpID4gMCA/IHBSdW50aW1lLT5Ub0ludDMyKHBhcmFtc1swXSkgOiAwOworICBpbnQgbldvcmRObyA9IHBhcmFtcy5zaXplKCkgPiAxID8gcFJ1bnRpbWUtPlRvSW50MzIocGFyYW1zWzFdKSA6IDA7CisgIGJvb2wgYlN0cmlwID0gcGFyYW1zLnNpemUoKSA+IDIgPyBwUnVudGltZS0+VG9Cb29sZWFuKHBhcmFtc1syXSkgOiB0cnVlOworCisgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCA9IG1fcEZvcm1GaWxsRW52LT5HZXRQREZEb2N1bWVudCgpOworICBpZiAoIXBEb2N1bWVudCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgaWYgKG5QYWdlTm8gPCAwIHx8IG5QYWdlTm8gPj0gcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtWYWx1ZUVycm9yKSk7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBwRG9jdW1lbnQtPkdldFBhZ2UoblBhZ2VObyk7CisgIGlmICghcFBhZ2VEaWN0KQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX1BhZ2UgcGFnZShwRG9jdW1lbnQsIHBQYWdlRGljdCwgdHJ1ZSk7CisgIHBhZ2UuUGFyc2VDb250ZW50KCk7CisKKyAgaW50IG5Xb3JkcyA9IDA7CisgIFdpZGVTdHJpbmcgc3dSZXQ7CisgIGZvciAoYXV0byYgcFBhZ2VPYmogOiAqcGFnZS5HZXRQYWdlT2JqZWN0TGlzdCgpKSB7CisgICAgaWYgKHBQYWdlT2JqLT5Jc1RleHQoKSkgeworICAgICAgQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiA9IHBQYWdlT2JqLT5Bc1RleHQoKTsKKyAgICAgIGludCBuT2JqV29yZHMgPSBDb3VudFdvcmRzKHBUZXh0T2JqKTsKKyAgICAgIGlmIChuV29yZHMgKyBuT2JqV29yZHMgPj0gbldvcmRObykgeworICAgICAgICBzd1JldCA9IEdldE9ialdvcmRTdHIocFRleHRPYmosIG5Xb3JkTm8gLSBuV29yZHMpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIG5Xb3JkcyArPSBuT2JqV29yZHM7CisgICAgfQorICB9CisKKyAgaWYgKGJTdHJpcCkKKyAgICBzd1JldC5UcmltKCk7CisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcoc3dSZXQuY19zdHIoKSkpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRQYWdlTnRoV29yZFF1YWRzKAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIW1fcEZvcm1GaWxsRW52KQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a0JhZE9iamVjdEVycm9yKSk7CisgIGlmICghbV9wRm9ybUZpbGxFbnYtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX0VYVFJBQ1RfQUNDRVNTKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtCYWRPYmplY3RFcnJvcikpOworICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OmdldFBhZ2VOdW1Xb3JkcygKKyAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKCFtX3BGb3JtRmlsbEVudikKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtCYWRPYmplY3RFcnJvcikpOworICBpZiAoIW1fcEZvcm1GaWxsRW52LT5HZXRQZXJtaXNzaW9ucyhGUERGUEVSTV9FWFRSQUNUX0FDQ0VTUykpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGVybWlzc2lvbkVycm9yKSk7CisKKyAgaW50IG5QYWdlTm8gPSBwYXJhbXMuc2l6ZSgpID4gMCA/IHBSdW50aW1lLT5Ub0ludDMyKHBhcmFtc1swXSkgOiAwOworICBDUERGX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBtX3BGb3JtRmlsbEVudi0+R2V0UERGRG9jdW1lbnQoKTsKKyAgaWYgKG5QYWdlTm8gPCAwIHx8IG5QYWdlTm8gPj0gcERvY3VtZW50LT5HZXRQYWdlQ291bnQoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtWYWx1ZUVycm9yKSk7CisKKyAgQ1BERl9EaWN0aW9uYXJ5KiBwUGFnZURpY3QgPSBwRG9jdW1lbnQtPkdldFBhZ2UoblBhZ2VObyk7CisgIGlmICghcFBhZ2VEaWN0KQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX1BhZ2UgcGFnZShwRG9jdW1lbnQsIHBQYWdlRGljdCwgdHJ1ZSk7CisgIHBhZ2UuUGFyc2VDb250ZW50KCk7CisKKyAgaW50IG5Xb3JkcyA9IDA7CisgIGZvciAoYXV0byYgcFBhZ2VPYmogOiAqcGFnZS5HZXRQYWdlT2JqZWN0TGlzdCgpKSB7CisgICAgaWYgKHBQYWdlT2JqLT5Jc1RleHQoKSkKKyAgICAgIG5Xb3JkcyArPSBDb3VudFdvcmRzKHBQYWdlT2JqLT5Bc1RleHQoKSk7CisgIH0KKworICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3TnVtYmVyKG5Xb3JkcykpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50OjpnZXRQcmludFBhcmFtcygKKyAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBSZXRPYmogPQorICAgICAgcFJ1bnRpbWUtPk5ld0Z4RHluYW1pY09iaihDSlNfUHJpbnRQYXJhbXNPYmo6OkdldE9iakRlZm5JRCgpKTsKKyAgaWYgKHBSZXRPYmouSXNFbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICAvLyBOb3QgaW1wbGVtZW50ZWQgeWV0LgorCisgIHJldHVybiBDSlNfUmV0dXJuKHBSZXRPYmopOworfQorCisjZGVmaW5lIElTTEFUSU5XT1JEKHUpICh1ICE9IDB4MjAgJiYgdSA8PSAweDI4RkYpCisKK2ludCBEb2N1bWVudDo6Q291bnRXb3JkcyhDUERGX1RleHRPYmplY3QqIHBUZXh0T2JqKSB7CisgIGlmICghcFRleHRPYmopCisgICAgcmV0dXJuIDA7CisKKyAgaW50IG5Xb3JkcyA9IDA7CisKKyAgQ1BERl9Gb250KiBwRm9udCA9IHBUZXh0T2JqLT5HZXRGb250KCk7CisgIGlmICghcEZvbnQpCisgICAgcmV0dXJuIDA7CisKKyAgYm9vbCBiSXNMYXRpbiA9IGZhbHNlOworCisgIGZvciAoc2l6ZV90IGkgPSAwLCBzeiA9IHBUZXh0T2JqLT5Db3VudENoYXJzKCk7IGkgPCBzejsgKytpKSB7CisgICAgdWludDMyX3QgY2hhcmNvZGUgPSBDUERGX0ZvbnQ6OmtJbnZhbGlkQ2hhckNvZGU7CisgICAgZmxvYXQga2VybmluZzsKKworICAgIHBUZXh0T2JqLT5HZXRDaGFySW5mbyhpLCAmY2hhcmNvZGUsICZrZXJuaW5nKTsKKyAgICBXaWRlU3RyaW5nIHN3VW5pY29kZSA9IHBGb250LT5Vbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKworICAgIHVpbnQxNl90IHVuaWNvZGUgPSAwOworICAgIGlmIChzd1VuaWNvZGUuR2V0TGVuZ3RoKCkgPiAwKQorICAgICAgdW5pY29kZSA9IHN3VW5pY29kZVswXTsKKworICAgIGlmIChJU0xBVElOV09SRCh1bmljb2RlKSAmJiBiSXNMYXRpbikKKyAgICAgIGNvbnRpbnVlOworCisgICAgYklzTGF0aW4gPSBJU0xBVElOV09SRCh1bmljb2RlKTsKKyAgICBpZiAodW5pY29kZSAhPSAweDIwKQorICAgICAgbldvcmRzKys7CisgIH0KKworICByZXR1cm4gbldvcmRzOworfQorCitXaWRlU3RyaW5nIERvY3VtZW50OjpHZXRPYmpXb3JkU3RyKENQREZfVGV4dE9iamVjdCogcFRleHRPYmosIGludCBuV29yZEluZGV4KSB7CisgIFdpZGVTdHJpbmcgc3dSZXQ7CisKKyAgQ1BERl9Gb250KiBwRm9udCA9IHBUZXh0T2JqLT5HZXRGb250KCk7CisgIGlmICghcEZvbnQpCisgICAgcmV0dXJuIEwiIjsKKworICBpbnQgbldvcmRzID0gMDsKKyAgYm9vbCBiSXNMYXRpbiA9IGZhbHNlOworCisgIGZvciAoc2l6ZV90IGkgPSAwLCBzeiA9IHBUZXh0T2JqLT5Db3VudENoYXJzKCk7IGkgPCBzejsgKytpKSB7CisgICAgdWludDMyX3QgY2hhcmNvZGUgPSBDUERGX0ZvbnQ6OmtJbnZhbGlkQ2hhckNvZGU7CisgICAgZmxvYXQga2VybmluZzsKKworICAgIHBUZXh0T2JqLT5HZXRDaGFySW5mbyhpLCAmY2hhcmNvZGUsICZrZXJuaW5nKTsKKyAgICBXaWRlU3RyaW5nIHN3VW5pY29kZSA9IHBGb250LT5Vbmljb2RlRnJvbUNoYXJDb2RlKGNoYXJjb2RlKTsKKworICAgIHVpbnQxNl90IHVuaWNvZGUgPSAwOworICAgIGlmIChzd1VuaWNvZGUuR2V0TGVuZ3RoKCkgPiAwKQorICAgICAgdW5pY29kZSA9IHN3VW5pY29kZVswXTsKKworICAgIGlmIChJU0xBVElOV09SRCh1bmljb2RlKSAmJiBiSXNMYXRpbikgeworICAgIH0gZWxzZSB7CisgICAgICBiSXNMYXRpbiA9IElTTEFUSU5XT1JEKHVuaWNvZGUpOworICAgICAgaWYgKHVuaWNvZGUgIT0gMHgyMCkKKyAgICAgICAgbldvcmRzKys7CisgICAgfQorCisgICAgaWYgKG5Xb3JkcyAtIDEgPT0gbldvcmRJbmRleCkKKyAgICAgIHN3UmV0ICs9IHVuaWNvZGU7CisgIH0KKworICByZXR1cm4gc3dSZXQ7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OmdldF96b29tKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6c2V0X3pvb20oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6Z2V0X3pvb21fdHlwZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OnNldF96b29tX3R5cGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6ZGVsZXRlUGFnZXMoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OmV4dHJhY3RQYWdlcygKKyAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgorICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6aW5zZXJ0UGFnZXMoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIC8vIFVuc2FmZSwgbm90IHN1cHBvcnRlZC4KKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRG9jdW1lbnQ6OnJlcGxhY2VQYWdlcygKKyAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgLy8gVW5zYWZlLCBub3Qgc3VwcG9ydGVkLgorICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBEb2N1bWVudDo6Z2V0VVJMKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIERvY3VtZW50Ojpnb3RvTmFtZWREZXN0KAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKyAgaWYgKCFtX3BGb3JtRmlsbEVudikKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtCYWRPYmplY3RFcnJvcikpOworCisgIFdpZGVTdHJpbmcgd2lkZU5hbWUgPSBwUnVudGltZS0+VG9XaWRlU3RyaW5nKHBhcmFtc1swXSk7CisgIENQREZfRG9jdW1lbnQqIHBEb2N1bWVudCA9IG1fcEZvcm1GaWxsRW52LT5HZXRQREZEb2N1bWVudCgpOworICBpZiAoIXBEb2N1bWVudCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERl9OYW1lVHJlZSBuYW1lVHJlZShwRG9jdW1lbnQsICJEZXN0cyIpOworICBDUERGX0FycmF5KiBkZXN0QXJyYXkgPSBuYW1lVHJlZS5Mb29rdXBOYW1lZERlc3QocERvY3VtZW50LCB3aWRlTmFtZSk7CisgIGlmICghZGVzdEFycmF5KQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Rlc3QgZGVzdChkZXN0QXJyYXkpOworICBjb25zdCBDUERGX0FycmF5KiBhcnJheU9iamVjdCA9IFRvQXJyYXkoZGVzdC5HZXRPYmplY3QoKSk7CisgIHN0ZDo6dmVjdG9yPGZsb2F0PiBzY3JvbGxQb3NpdGlvbkFycmF5OworICBpZiAoYXJyYXlPYmplY3QpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMjsgaSA8IGFycmF5T2JqZWN0LT5HZXRDb3VudCgpOyBpKyspCisgICAgICBzY3JvbGxQb3NpdGlvbkFycmF5LnB1c2hfYmFjayhhcnJheU9iamVjdC0+R2V0RmxvYXRBdChpKSk7CisgIH0KKyAgcFJ1bnRpbWUtPkJlZ2luQmxvY2soKTsKKyAgbV9wRm9ybUZpbGxFbnYtPkRvR29Ub0FjdGlvbihkZXN0LkdldFBhZ2VJbmRleChwRG9jdW1lbnQpLCBkZXN0LkdldFpvb21Nb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb25BcnJheS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb25BcnJheS5zaXplKCkpOworICBwUnVudGltZS0+RW5kQmxvY2soKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OkFkZERlbGF5RGF0YShDSlNfRGVsYXlEYXRhKiBwRGF0YSkgeworICBtX0RlbGF5RGF0YS5wdXNoX2JhY2soc3RkOjp1bmlxdWVfcHRyPENKU19EZWxheURhdGE+KHBEYXRhKSk7Cit9CisKK3ZvaWQgRG9jdW1lbnQ6OkRvRmllbGREZWxheShjb25zdCBXaWRlU3RyaW5nJiBzRmllbGROYW1lLCBpbnQgbkNvbnRyb2xJbmRleCkgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0pTX0RlbGF5RGF0YT4+IGRlbGF5ZWRfZGF0YTsKKyAgYXV0byBpdGVyID0gbV9EZWxheURhdGEuYmVnaW4oKTsKKyAgd2hpbGUgKGl0ZXIgIT0gbV9EZWxheURhdGEuZW5kKCkpIHsKKyAgICBhdXRvIG9sZCA9IGl0ZXIrKzsKKyAgICBpZiAoKCpvbGQpLT5zRmllbGROYW1lID09IHNGaWVsZE5hbWUgJiYKKyAgICAgICAgKCpvbGQpLT5uQ29udHJvbEluZGV4ID09IG5Db250cm9sSW5kZXgpIHsKKyAgICAgIGRlbGF5ZWRfZGF0YS5wdXNoX2JhY2soc3RkOjptb3ZlKCpvbGQpKTsKKyAgICAgIG1fRGVsYXlEYXRhLmVyYXNlKG9sZCk7CisgICAgfQorICB9CisKKyAgZm9yIChjb25zdCBhdXRvJiBwRGF0YSA6IGRlbGF5ZWRfZGF0YSkKKyAgICBGaWVsZDo6RG9EZWxheShtX3BGb3JtRmlsbEVudi5HZXQoKSwgcERhdGEuZ2V0KCkpOworfQorCitDSlNfRG9jdW1lbnQqIERvY3VtZW50OjpHZXRDSlNEb2MoKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxDSlNfRG9jdW1lbnQqPihtX3BKU09iamVjdC5HZXQoKSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL2Nqc19kb2N1bWVudC5oIGIvZnhqcy9janNfZG9jdW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGZhZjk2Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfZG9jdW1lbnQuaApAQCAtMCwwICsxLDMzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfQ0pTX0RPQ1VNRU5UX0hfCisjZGVmaW5lIEZYSlNfQ0pTX0RPQ1VNRU5UX0hfCisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmeGpzL0pTX0RlZmluZS5oIgorCitjbGFzcyBDSlNfRG9jdW1lbnQ7CitjbGFzcyBDUERGX1RleHRPYmplY3Q7CisKK3N0cnVjdCBDSlNfRGVsYXlEYXRhOworCitjbGFzcyBEb2N1bWVudCA6IHB1YmxpYyBDSlNfRW1iZWRPYmogeworIHB1YmxpYzoKKyAgZXhwbGljaXQgRG9jdW1lbnQoQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKKyAgfkRvY3VtZW50KCkgb3ZlcnJpZGU7CisKKyAgQ0pTX1JldHVybiBnZXRfQURCRShDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9BREJFKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X2F1dGhvcihDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9hdXRob3IoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfYmFzZV9VUkwoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfYmFzZV9VUkwoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfYm9va21hcmtfcm9vdChDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9ib29rbWFya19yb290KENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X2NhbGN1bGF0ZShDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9jYWxjdWxhdGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfY29sbGFiKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2NvbGxhYihDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9jcmVhdGlvbl9kYXRlKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2NyZWF0aW9uX2RhdGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfY3JlYXRvcihDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9jcmVhdG9yKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X2RlbGF5KENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2RlbGF5KENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X2RpcnR5KENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2RpcnR5KENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X2RvY3VtZW50X2ZpbGVfbmFtZShDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9kb2N1bWVudF9maWxlX25hbWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X2V4dGVybmFsKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2V4dGVybmFsKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X2ZpbGVzaXplKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2ZpbGVzaXplKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X2ljb25zKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2ljb25zKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X2luZm8oQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfaW5mbyhDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9rZXl3b3JkcyhDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9rZXl3b3JkcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9sYXlvdXQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfbGF5b3V0KENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X21lZGlhKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X21lZGlhKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X21vZF9kYXRlKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X21vZF9kYXRlKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X21vdXNlX3goQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfbW91c2VfeChDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9tb3VzZV95KENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X21vdXNlX3koQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfbnVtX2ZpZWxkcyhDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9udW1fZmllbGRzKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X251bV9wYWdlcyhDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9udW1fcGFnZXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfcGFnZV9udW0oQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfcGFnZV9udW0oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfcGFnZV93aW5kb3dfcmVjdChDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9wYWdlX3dpbmRvd19yZWN0KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfcGF0aChDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9wYXRoKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X3Byb2R1Y2VyKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X3Byb2R1Y2VyKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X3N1YmplY3QoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfc3ViamVjdChDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF90aXRsZShDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF90aXRsZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF96b29tKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X3pvb20oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfem9vbV90eXBlKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X3pvb21fdHlwZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9VUkwoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfVVJMKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gYWRkQW5ub3QoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBhZGRGaWVsZChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGFkZExpbmsoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGFkZEljb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGNhbGN1bGF0ZU5vdyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBjbG9zZURvYyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGNyZWF0ZURhdGFPYmplY3QoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGRlbGV0ZVBhZ2VzKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gZXhwb3J0QXNUZXh0KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGV4cG9ydEFzRkRGKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gZXhwb3J0QXNYRkRGKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGV4dHJhY3RQYWdlcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBnZXRBbm5vdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGdldEFubm90cyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBnZXRBbm5vdDNEKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBnZXRBbm5vdHMzRChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGdldEZpZWxkKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gZ2V0SWNvbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gZ2V0TGlua3MoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBnZXROdGhGaWVsZE5hbWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gZ2V0T0NHcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gZ2V0UGFnZUJveChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gZ2V0UGFnZU50aFdvcmQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBnZXRQYWdlTnRoV29yZFF1YWRzKAorICAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGdldFBhZ2VOdW1Xb3JkcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBnZXRQcmludFBhcmFtcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGdldFVSTChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBnb3RvTmFtZWREZXN0KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBpbXBvcnRBbkZERihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGltcG9ydEFuWEZERihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBpbXBvcnRUZXh0RGF0YShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGluc2VydFBhZ2VzKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gbWFpbEZvcm0oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBwcmludChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIHJlbW92ZUZpZWxkKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gcmVwbGFjZVBhZ2VzKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIHJlc2V0Rm9ybShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBzYXZlQXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gc3VibWl0Rm9ybShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gc3luY0Fubm90U2NhbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gbWFpbERvYyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gcmVtb3ZlSWNvbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisKKyAgdm9pZCBTZXRGb3JtRmlsbEVudihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudik7CisgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogR2V0Rm9ybUZpbGxFbnYoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fcEZvcm1GaWxsRW52LkdldCgpOworICB9CisgIHZvaWQgQWRkRGVsYXlEYXRhKENKU19EZWxheURhdGEqIHBEYXRhKTsKKyAgdm9pZCBEb0ZpZWxkRGVsYXkoY29uc3QgV2lkZVN0cmluZyYgc0ZpZWxkTmFtZSwgaW50IG5Db250cm9sSW5kZXgpOworICBDSlNfRG9jdW1lbnQqIEdldENKU0RvYygpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgYm9vbCBJc0VuY2xvc2VkSW5SZWN0KENGWF9GbG9hdFJlY3QgcmVjdCwgQ0ZYX0Zsb2F0UmVjdCBMaW5rUmVjdCk7CisgIGludCBDb3VudFdvcmRzKENQREZfVGV4dE9iamVjdCogcFRleHRPYmopOworICBXaWRlU3RyaW5nIEdldE9ialdvcmRTdHIoQ1BERl9UZXh0T2JqZWN0KiBwVGV4dE9iaiwgaW50IG5Xb3JkSW5kZXgpOworCisgIENKU19SZXR1cm4gZ2V0UHJvcGVydHlJbnRlcm5hbChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBwcm9wTmFtZSk7CisgIENKU19SZXR1cm4gc2V0UHJvcGVydHlJbnRlcm5hbChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIHByb3BOYW1lKTsKKworICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6Ok9ic2VydmVkUHRyIG1fcEZvcm1GaWxsRW52OworICBXaWRlU3RyaW5nIG1fY3dCYXNlVVJMOworICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPENKU19EZWxheURhdGE+PiBtX0RlbGF5RGF0YTsKKyAgLy8gTmVlZHMgdG8gYmUgYSBzdGQ6Omxpc3QgZm9yIGl0ZXJhdG9yIHN0YWJpbGl0eS4KKyAgc3RkOjpsaXN0PFdpZGVTdHJpbmc+IG1fSWNvbk5hbWVzOworICBib29sIG1fYkRlbGF5OworfTsKKworY2xhc3MgQ0pTX0RvY3VtZW50IDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgc3RhdGljIGludCBHZXRPYmpEZWZuSUQoKTsKKyAgc3RhdGljIHZvaWQgRGVmaW5lSlNPYmplY3RzKENGWEpTX0VuZ2luZSogcEVuZ2luZSk7CisKKyAgZXhwbGljaXQgQ0pTX0RvY3VtZW50KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge30KKyAgfkNKU19Eb2N1bWVudCgpIG92ZXJyaWRlIHt9CisKKyAgLy8gQ0pTX09iamVjdAorICB2b2lkIEluaXRJbnN0YW5jZShJSlNfUnVudGltZSogcElSdW50aW1lKSBvdmVycmlkZTsKKworICBKU19TVEFUSUNfUFJPUChBREJFLCBBREJFLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGF1dGhvciwgYXV0aG9yLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGJhc2VVUkwsIGJhc2VfVVJMLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGJvb2ttYXJrUm9vdCwgYm9va21hcmtfcm9vdCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChjYWxjdWxhdGUsIGNhbGN1bGF0ZSwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChDb2xsYWIsIGNvbGxhYiwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChjcmVhdGlvbkRhdGUsIGNyZWF0aW9uX2RhdGUsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AoY3JlYXRvciwgY3JlYXRvciwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChkZWxheSwgZGVsYXksIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AoZGlydHksIGRpcnR5LCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGRvY3VtZW50RmlsZU5hbWUsIGRvY3VtZW50X2ZpbGVfbmFtZSwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChleHRlcm5hbCwgZXh0ZXJuYWwsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AoZmlsZXNpemUsIGZpbGVzaXplLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGljb25zLCBpY29ucywgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChpbmZvLCBpbmZvLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGtleXdvcmRzLCBrZXl3b3JkcywgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChsYXlvdXQsIGxheW91dCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChtZWRpYSwgbWVkaWEsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AobW9kRGF0ZSwgbW9kX2RhdGUsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AobW91c2VYLCBtb3VzZV94LCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKG1vdXNlWSwgbW91c2VfeSwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChudW1GaWVsZHMsIG51bV9maWVsZHMsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX1BST1AobnVtUGFnZXMsIG51bV9wYWdlcywgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChwYWdlTnVtLCBwYWdlX251bSwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChwYWdlV2luZG93UmVjdCwgcGFnZV93aW5kb3dfcmVjdCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChwYXRoLCBwYXRoLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHByb2R1Y2VyLCBwcm9kdWNlciwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChzdWJqZWN0LCBzdWJqZWN0LCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHRpdGxlLCB0aXRsZSwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUChVUkwsIFVSTCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfUFJPUCh6b29tLCB6b29tLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHpvb21UeXBlLCB6b29tX3R5cGUsIERvY3VtZW50KTsKKworICBKU19TVEFUSUNfTUVUSE9EKGFkZEFubm90LCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoYWRkRmllbGQsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChhZGRMaW5rLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoYWRkSWNvbiwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGNhbGN1bGF0ZU5vdywgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGNsb3NlRG9jLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoY3JlYXRlRGF0YU9iamVjdCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGRlbGV0ZVBhZ2VzLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZXhwb3J0QXNUZXh0LCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZXhwb3J0QXNGREYsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChleHBvcnRBc1hGREYsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChleHRyYWN0UGFnZXMsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRBbm5vdCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGdldEFubm90cywgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGdldEFubm90M0QsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRBbm5vdHMzRCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGdldEZpZWxkLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZ2V0SWNvbiwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGdldExpbmtzLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZ2V0TnRoRmllbGROYW1lLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZ2V0T0NHcywgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGdldFBhZ2VCb3gsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRQYWdlTnRoV29yZCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGdldFBhZ2VOdGhXb3JkUXVhZHMsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRQYWdlTnVtV29yZHMsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRQcmludFBhcmFtcywgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGdldFVSTCwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGdvdG9OYW1lZERlc3QsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChpbXBvcnRBbkZERiwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGltcG9ydEFuWEZERiwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKGltcG9ydFRleHREYXRhLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoaW5zZXJ0UGFnZXMsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChtYWlsRm9ybSwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKHByaW50LCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QocmVtb3ZlRmllbGQsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChyZXBsYWNlUGFnZXMsIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChyZW1vdmVJY29uLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0QocmVzZXRGb3JtLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0Qoc2F2ZUFzLCBEb2N1bWVudCk7CisgIEpTX1NUQVRJQ19NRVRIT0Qoc3VibWl0Rm9ybSwgRG9jdW1lbnQpOworICBKU19TVEFUSUNfTUVUSE9EKHN5bmNBbm5vdFNjYW4sIERvY3VtZW50KTsKKyAgSlNfU1RBVElDX01FVEhPRChtYWlsRG9jLCBEb2N1bWVudCk7CisKKyBwcml2YXRlOgorICBzdGF0aWMgaW50IE9iakRlZm5JRDsKKyAgc3RhdGljIGNvbnN0IEpTUHJvcGVydHlTcGVjIFByb3BlcnR5U3BlY3NbXTsKKyAgc3RhdGljIGNvbnN0IEpTTWV0aG9kU3BlYyBNZXRob2RTcGVjc1tdOworfTsKKworI2VuZGlmICAvLyBGWEpTX0NKU19ET0NVTUVOVF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy9janNfZW1iZWRvYmouY3BwIGIvZnhqcy9janNfZW1iZWRvYmouY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZWJkNjMKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc19lbWJlZG9iai5jcHAKQEAgLTAsMCArMSwxMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy9janNfZW1iZWRvYmouaCIKKworI2luY2x1ZGUgImZ4anMvY2pzX29iamVjdC5oIgorCitDSlNfRW1iZWRPYmo6OkNKU19FbWJlZE9iaihDSlNfT2JqZWN0KiBwSlNPYmplY3QpIDogbV9wSlNPYmplY3QocEpTT2JqZWN0KSB7fQorCitDSlNfRW1iZWRPYmo6On5DSlNfRW1iZWRPYmooKSB7fQpkaWZmIC0tZ2l0IGEvZnhqcy9janNfZW1iZWRvYmouaCBiL2Z4anMvY2pzX2VtYmVkb2JqLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJlNTQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2pzX2VtYmVkb2JqLmgKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfQ0pTX0VNQkVET0JKX0hfCisjZGVmaW5lIEZYSlNfQ0pTX0VNQkVET0JKX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisKK2NsYXNzIENKU19PYmplY3Q7CisKK2NsYXNzIENKU19FbWJlZE9iaiB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlNfRW1iZWRPYmooQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKKyAgdmlydHVhbCB+Q0pTX0VtYmVkT2JqKCk7CisKKyAgQ0pTX09iamVjdCogR2V0SlNPYmplY3QoKSBjb25zdCB7IHJldHVybiBtX3BKU09iamVjdC5HZXQoKTsgfQorCisgcHJvdGVjdGVkOgorICBVbm93bmVkUHRyPENKU19PYmplY3Q+IGNvbnN0IG1fcEpTT2JqZWN0OworfTsKKworI2VuZGlmICAvLyBGWEpTX0NKU19FTUJFRE9CSl9IXwpkaWZmIC0tZ2l0IGEvZnhqcy9janNfZXZlbnQuY3BwIGIvZnhqcy9janNfZXZlbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYjk4OGYKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc19ldmVudC5jcHAKQEAgLTAsMCArMSwzMDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMvY2pzX2V2ZW50LmgiCisKKyNpbmNsdWRlICJmeGpzL0pTX0RlZmluZS5oIgorI2luY2x1ZGUgImZ4anMvY2pzX2V2ZW50X2NvbnRleHQuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19ldmVudGhhbmRsZXIuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19maWVsZC5oIgorI2luY2x1ZGUgImZ4anMvY2pzX29iamVjdC5oIgorCitjb25zdCBKU1Byb3BlcnR5U3BlYyBDSlNfRXZlbnQ6OlByb3BlcnR5U3BlY3NbXSA9IHsKKyAgICB7ImNoYW5nZSIsIGdldF9jaGFuZ2Vfc3RhdGljLCBzZXRfY2hhbmdlX3N0YXRpY30sCisgICAgeyJjaGFuZ2VFeCIsIGdldF9jaGFuZ2VfZXhfc3RhdGljLCBzZXRfY2hhbmdlX2V4X3N0YXRpY30sCisgICAgeyJjb21taXRLZXkiLCBnZXRfY29tbWl0X2tleV9zdGF0aWMsIHNldF9jb21taXRfa2V5X3N0YXRpY30sCisgICAgeyJmaWVsZEZ1bGwiLCBnZXRfZmllbGRfZnVsbF9zdGF0aWMsIHNldF9maWVsZF9mdWxsX3N0YXRpY30sCisgICAgeyJrZXlEb3duIiwgZ2V0X2tleV9kb3duX3N0YXRpYywgc2V0X2tleV9kb3duX3N0YXRpY30sCisgICAgeyJtb2RpZmllciIsIGdldF9tb2RpZmllcl9zdGF0aWMsIHNldF9tb2RpZmllcl9zdGF0aWN9LAorICAgIHsibmFtZSIsIGdldF9uYW1lX3N0YXRpYywgc2V0X25hbWVfc3RhdGljfSwKKyAgICB7InJjIiwgZ2V0X3JjX3N0YXRpYywgc2V0X3JjX3N0YXRpY30sCisgICAgeyJyaWNoQ2hhbmdlIiwgZ2V0X3JpY2hfY2hhbmdlX3N0YXRpYywgc2V0X3JpY2hfY2hhbmdlX3N0YXRpY30sCisgICAgeyJyaWNoQ2hhbmdlRXgiLCBnZXRfcmljaF9jaGFuZ2VfZXhfc3RhdGljLCBzZXRfcmljaF9jaGFuZ2VfZXhfc3RhdGljfSwKKyAgICB7InJpY2hWYWx1ZSIsIGdldF9yaWNoX3ZhbHVlX3N0YXRpYywgc2V0X3JpY2hfdmFsdWVfc3RhdGljfSwKKyAgICB7InNlbEVuZCIsIGdldF9zZWxfZW5kX3N0YXRpYywgc2V0X3NlbF9lbmRfc3RhdGljfSwKKyAgICB7InNlbFN0YXJ0IiwgZ2V0X3NlbF9zdGFydF9zdGF0aWMsIHNldF9zZWxfc3RhcnRfc3RhdGljfSwKKyAgICB7InNoaWZ0IiwgZ2V0X3NoaWZ0X3N0YXRpYywgc2V0X3NoaWZ0X3N0YXRpY30sCisgICAgeyJzb3VyY2UiLCBnZXRfc291cmNlX3N0YXRpYywgc2V0X3NvdXJjZV9zdGF0aWN9LAorICAgIHsidGFyZ2V0IiwgZ2V0X3RhcmdldF9zdGF0aWMsIHNldF90YXJnZXRfc3RhdGljfSwKKyAgICB7InRhcmdldE5hbWUiLCBnZXRfdGFyZ2V0X25hbWVfc3RhdGljLCBzZXRfdGFyZ2V0X25hbWVfc3RhdGljfSwKKyAgICB7InR5cGUiLCBnZXRfdHlwZV9zdGF0aWMsIHNldF90eXBlX3N0YXRpY30sCisgICAgeyJ2YWx1ZSIsIGdldF92YWx1ZV9zdGF0aWMsIHNldF92YWx1ZV9zdGF0aWN9LAorICAgIHsid2lsbENvbW1pdCIsIGdldF93aWxsX2NvbW1pdF9zdGF0aWMsIHNldF93aWxsX2NvbW1pdF9zdGF0aWN9fTsKKworaW50IENKU19FdmVudDo6T2JqRGVmbklEID0gLTE7CisKKy8vIHN0YXRpYwordm9pZCBDSlNfRXZlbnQ6OkRlZmluZUpTT2JqZWN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUpIHsKKyAgT2JqRGVmbklEID0gcEVuZ2luZS0+RGVmaW5lT2JqKCJldmVudCIsIEZYSlNPQkpUWVBFX1NUQVRJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQ29uc3RydWN0b3I8Q0pTX0V2ZW50LCBldmVudD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0Rlc3RydWN0b3I8Q0pTX0V2ZW50Pik7CisgIERlZmluZVByb3BzKHBFbmdpbmUsIE9iakRlZm5JRCwgUHJvcGVydHlTcGVjcywgRlhfQXJyYXlTaXplKFByb3BlcnR5U3BlY3MpKTsKK30KKworZXZlbnQ6OmV2ZW50KENKU19PYmplY3QqIHBKc09iamVjdCkgOiBDSlNfRW1iZWRPYmoocEpzT2JqZWN0KSB7fQorCitldmVudDo6fmV2ZW50KCkge30KKworQ0pTX1JldHVybiBldmVudDo6Z2V0X2NoYW5nZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0KKyAgICAgIHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCktPkdldEV2ZW50SGFuZGxlcigpOworICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3U3RyaW5nKHBFdmVudC0+Q2hhbmdlKCkuY19zdHIoKSkpOworfQorCitDSlNfUmV0dXJuIGV2ZW50OjpzZXRfY2hhbmdlKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0KKyAgICAgIHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCktPkdldEV2ZW50SGFuZGxlcigpOworCisgIGlmICh2cC0+SXNTdHJpbmcoKSkgeworICAgIFdpZGVTdHJpbmcmIHdDaGFuZ2UgPSBwRXZlbnQtPkNoYW5nZSgpOworICAgIHdDaGFuZ2UgPSBwUnVudGltZS0+VG9XaWRlU3RyaW5nKHZwKTsKKyAgfQorICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBldmVudDo6Z2V0X2NoYW5nZV9leChDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0KKyAgICAgIHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCktPkdldEV2ZW50SGFuZGxlcigpOworCisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcocEV2ZW50LT5DaGFuZ2VFeCgpLmNfc3RyKCkpKTsKK30KKworQ0pTX1JldHVybiBldmVudDo6c2V0X2NoYW5nZV9leChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBldmVudDo6Z2V0X2NvbW1pdF9rZXkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9CisgICAgICBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpLT5HZXRFdmVudEhhbmRsZXIoKTsKKworICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3TnVtYmVyKHBFdmVudC0+Q29tbWl0S2V5KCkpKTsKK30KKworQ0pTX1JldHVybiBldmVudDo6c2V0X2NvbW1pdF9rZXkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworfQorCitDSlNfUmV0dXJuIGV2ZW50OjpnZXRfZmllbGRfZnVsbChDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0KKyAgICAgIHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCktPkdldEV2ZW50SGFuZGxlcigpOworCisgIGlmICh3Y3NjbXAoKGNvbnN0IHdjaGFyX3QqKXBFdmVudC0+TmFtZSgpLCBMIktleXN0cm9rZSIpICE9IDApCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdCb29sZWFuKHBFdmVudC0+RmllbGRGdWxsKCkpKTsKK30KKworQ0pTX1JldHVybiBldmVudDo6c2V0X2ZpZWxkX2Z1bGwoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworfQorCitDSlNfUmV0dXJuIGV2ZW50OjpnZXRfa2V5X2Rvd24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9CisgICAgICBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpLT5HZXRFdmVudEhhbmRsZXIoKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld0Jvb2xlYW4ocEV2ZW50LT5LZXlEb3duKCkpKTsKK30KKworQ0pTX1JldHVybiBldmVudDo6c2V0X2tleV9kb3duKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworfQorCitDSlNfUmV0dXJuIGV2ZW50OjpnZXRfbW9kaWZpZXIoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9CisgICAgICBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpLT5HZXRFdmVudEhhbmRsZXIoKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld0Jvb2xlYW4ocEV2ZW50LT5Nb2RpZmllcigpKSk7Cit9CisKK0NKU19SZXR1cm4gZXZlbnQ6OnNldF9tb2RpZmllcihDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBldmVudDo6Z2V0X25hbWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9CisgICAgICBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpLT5HZXRFdmVudEhhbmRsZXIoKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1N0cmluZyhwRXZlbnQtPk5hbWUoKSkpOworfQorCitDSlNfUmV0dXJuIGV2ZW50OjpzZXRfbmFtZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBldmVudDo6Z2V0X3JjKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPQorICAgICAgcFJ1bnRpbWUtPkdldEN1cnJlbnRFdmVudENvbnRleHQoKS0+R2V0RXZlbnRIYW5kbGVyKCk7CisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdCb29sZWFuKHBFdmVudC0+UmMoKSkpOworfQorCitDSlNfUmV0dXJuIGV2ZW50OjpzZXRfcmMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPQorICAgICAgcFJ1bnRpbWUtPkdldEN1cnJlbnRFdmVudENvbnRleHQoKS0+R2V0RXZlbnRIYW5kbGVyKCk7CisgIHBFdmVudC0+UmMoKSA9IHBSdW50aW1lLT5Ub0Jvb2xlYW4odnApOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBldmVudDo6Z2V0X3JpY2hfY2hhbmdlKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBldmVudDo6c2V0X3JpY2hfY2hhbmdlKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBldmVudDo6Z2V0X3JpY2hfY2hhbmdlX2V4KENKU19SdW50aW1lKiBwUnVudGltZSkgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBldmVudDo6c2V0X3JpY2hfY2hhbmdlX2V4KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBldmVudDo6Z2V0X3JpY2hfdmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIGV2ZW50OjpzZXRfcmljaF92YWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBldmVudDo6Z2V0X3NlbF9lbmQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9CisgICAgICBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpLT5HZXRFdmVudEhhbmRsZXIoKTsKKworICBpZiAod2NzY21wKChjb25zdCB3Y2hhcl90KilwRXZlbnQtPk5hbWUoKSwgTCJLZXlzdHJva2UiKSAhPSAwKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdOdW1iZXIocEV2ZW50LT5TZWxFbmQoKSkpOworfQorCitDSlNfUmV0dXJuIGV2ZW50OjpzZXRfc2VsX2VuZChDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9CisgICAgICBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpLT5HZXRFdmVudEhhbmRsZXIoKTsKKworICBpZiAod2NzY21wKChjb25zdCB3Y2hhcl90KilwRXZlbnQtPk5hbWUoKSwgTCJLZXlzdHJva2UiKSAhPSAwKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIHBFdmVudC0+U2V0U2VsRW5kKHBSdW50aW1lLT5Ub0ludDMyKHZwKSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIGV2ZW50OjpnZXRfc2VsX3N0YXJ0KENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPQorICAgICAgcFJ1bnRpbWUtPkdldEN1cnJlbnRFdmVudENvbnRleHQoKS0+R2V0RXZlbnRIYW5kbGVyKCk7CisKKyAgaWYgKHdjc2NtcCgoY29uc3Qgd2NoYXJfdCopcEV2ZW50LT5OYW1lKCksIEwiS2V5c3Ryb2tlIikgIT0gMCkKKyAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKworICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3TnVtYmVyKHBFdmVudC0+U2VsU3RhcnQoKSkpOworfQorCitDSlNfUmV0dXJuIGV2ZW50OjpzZXRfc2VsX3N0YXJ0KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0KKyAgICAgIHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCktPkdldEV2ZW50SGFuZGxlcigpOworCisgIGlmICh3Y3NjbXAoKGNvbnN0IHdjaGFyX3QqKXBFdmVudC0+TmFtZSgpLCBMIktleXN0cm9rZSIpICE9IDApCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgcEV2ZW50LT5TZXRTZWxTdGFydChwUnVudGltZS0+VG9JbnQzMih2cCkpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBldmVudDo6Z2V0X3NoaWZ0KENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPQorICAgICAgcFJ1bnRpbWUtPkdldEN1cnJlbnRFdmVudENvbnRleHQoKS0+R2V0RXZlbnRIYW5kbGVyKCk7CisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdCb29sZWFuKHBFdmVudC0+U2hpZnQoKSkpOworfQorCitDSlNfUmV0dXJuIGV2ZW50OjpzZXRfc2hpZnQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7Cit9CisKK0NKU19SZXR1cm4gZXZlbnQ6OmdldF9zb3VyY2UoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9CisgICAgICBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpLT5HZXRFdmVudEhhbmRsZXIoKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocEV2ZW50LT5Tb3VyY2UoKS0+R2V0SlNPYmplY3QoKS0+VG9WOE9iamVjdCgpKTsKK30KKworQ0pTX1JldHVybiBldmVudDo6c2V0X3NvdXJjZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBldmVudDo6Z2V0X3RhcmdldChDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0KKyAgICAgIHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCktPkdldEV2ZW50SGFuZGxlcigpOworICByZXR1cm4gQ0pTX1JldHVybihwRXZlbnQtPlRhcmdldF9GaWVsZCgpLT5HZXRKU09iamVjdCgpLT5Ub1Y4T2JqZWN0KCkpOworfQorCitDSlNfUmV0dXJuIGV2ZW50OjpzZXRfdGFyZ2V0KENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworfQorCitDSlNfUmV0dXJuIGV2ZW50OjpnZXRfdGFyZ2V0X25hbWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9CisgICAgICBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpLT5HZXRFdmVudEhhbmRsZXIoKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1N0cmluZyhwRXZlbnQtPlRhcmdldE5hbWUoKS5jX3N0cigpKSk7Cit9CisKK0NKU19SZXR1cm4gZXZlbnQ6OnNldF90YXJnZXRfbmFtZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworfQorCitDSlNfUmV0dXJuIGV2ZW50OjpnZXRfdHlwZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0KKyAgICAgIHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCktPkdldEV2ZW50SGFuZGxlcigpOworICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3U3RyaW5nKHBFdmVudC0+VHlwZSgpKSk7Cit9CisKK0NKU19SZXR1cm4gZXZlbnQ6OnNldF90eXBlKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworfQorCitDSlNfUmV0dXJuIGV2ZW50OjpnZXRfdmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9CisgICAgICBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpLT5HZXRFdmVudEhhbmRsZXIoKTsKKworICBpZiAod2NzY21wKChjb25zdCB3Y2hhcl90KilwRXZlbnQtPlR5cGUoKSwgTCJGaWVsZCIpICE9IDApCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1N0cmluZyhwRXZlbnQtPlZhbHVlKCkuY19zdHIoKSkpOworfQorCitDSlNfUmV0dXJuIGV2ZW50OjpzZXRfdmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPQorICAgICAgcFJ1bnRpbWUtPkdldEN1cnJlbnRFdmVudENvbnRleHQoKS0+R2V0RXZlbnRIYW5kbGVyKCk7CisKKyAgaWYgKHdjc2NtcCgoY29uc3Qgd2NoYXJfdCopcEV2ZW50LT5UeXBlKCksIEwiRmllbGQiKSAhPSAwKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBpZiAoIXBFdmVudC0+bV9wVmFsdWUpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIHBFdmVudC0+VmFsdWUoKSA9IHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcodnApOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBldmVudDo6Z2V0X3dpbGxfY29tbWl0KENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPQorICAgICAgcFJ1bnRpbWUtPkdldEN1cnJlbnRFdmVudENvbnRleHQoKS0+R2V0RXZlbnRIYW5kbGVyKCk7CisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdCb29sZWFuKHBFdmVudC0+V2lsbENvbW1pdCgpKSk7Cit9CisKK0NKU19SZXR1cm4gZXZlbnQ6OnNldF93aWxsX2NvbW1pdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy9janNfZXZlbnQuaCBiL2Z4anMvY2pzX2V2ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFlNWZhMgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2pzX2V2ZW50LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX0NKU19FVkVOVF9IXworI2RlZmluZSBGWEpTX0NKU19FVkVOVF9IXworCisjaW5jbHVkZSAiZnhqcy9KU19EZWZpbmUuaCIKKworY2xhc3MgZXZlbnQgOiBwdWJsaWMgQ0pTX0VtYmVkT2JqIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IGV2ZW50KENKU19PYmplY3QqIHBKU09iamVjdCk7CisgIH5ldmVudCgpIG92ZXJyaWRlOworCisgIENKU19SZXR1cm4gZ2V0X2NoYW5nZShDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9jaGFuZ2UoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfY2hhbmdlX2V4KENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2NoYW5nZV9leChDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9jb21taXRfa2V5KENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2NvbW1pdF9rZXkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfZmllbGRfZnVsbChDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9maWVsZF9mdWxsKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X2tleV9kb3duKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2tleV9kb3duKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X21vZGlmaWVyKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X21vZGlmaWVyKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X25hbWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfbmFtZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9yYyhDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9yYyhDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9yaWNoX2NoYW5nZShDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9yaWNoX2NoYW5nZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9yaWNoX2NoYW5nZV9leChDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9yaWNoX2NoYW5nZV9leChDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9yaWNoX3ZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X3JpY2hfdmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfc2VsX2VuZChDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9zZWxfZW5kKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X3NlbF9zdGFydChDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9zZWxfc3RhcnQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfc2hpZnQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfc2hpZnQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfc291cmNlKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X3NvdXJjZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF90YXJnZXQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfdGFyZ2V0KENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X3RhcmdldF9uYW1lKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X3RhcmdldF9uYW1lKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X3R5cGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfdHlwZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF92YWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF92YWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF93aWxsX2NvbW1pdChDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF93aWxsX2NvbW1pdChDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKK307CisKK2NsYXNzIENKU19FdmVudCA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIERlZmluZUpTT2JqZWN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUpOworCisgIGV4cGxpY2l0IENKU19FdmVudCh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9CisgIH5DSlNfRXZlbnQoKSBvdmVycmlkZSB7fQorCisgIEpTX1NUQVRJQ19QUk9QKGNoYW5nZSwgY2hhbmdlLCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGNoYW5nZUV4LCBjaGFuZ2VfZXgsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1AoY29tbWl0S2V5LCBjb21taXRfa2V5LCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKGZpZWxkRnVsbCwgZmllbGRfZnVsbCwgZXZlbnQpOworICBKU19TVEFUSUNfUFJPUChrZXlEb3duLCBrZXlfZG93biwgZXZlbnQpOworICBKU19TVEFUSUNfUFJPUChtb2RpZmllciwgbW9kaWZpZXIsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1AobmFtZSwgbmFtZSwgZXZlbnQpOworICBKU19TVEFUSUNfUFJPUChyYywgcmMsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1AocmljaENoYW5nZSwgcmljaF9jaGFuZ2UsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1AocmljaENoYW5nZUV4LCByaWNoX2NoYW5nZV9leCwgZXZlbnQpOworICBKU19TVEFUSUNfUFJPUChyaWNoVmFsdWUsIHJpY2hfdmFsdWUsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1Aoc2VsRW5kLCBzZWxfZW5kLCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHNlbFN0YXJ0LCBzZWxfc3RhcnQsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1Aoc2hpZnQsIHNoaWZ0LCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHNvdXJjZSwgc291cmNlLCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHRhcmdldCwgdGFyZ2V0LCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHRhcmdldE5hbWUsIHRhcmdldF9uYW1lLCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHR5cGUsIHR5cGUsIGV2ZW50KTsKKyAgSlNfU1RBVElDX1BST1AodmFsdWUsIHZhbHVlLCBldmVudCk7CisgIEpTX1NUQVRJQ19QUk9QKHdpbGxDb21taXQsIHdpbGxfY29tbWl0LCBldmVudCk7CisKKyBwcml2YXRlOgorICBzdGF0aWMgaW50IE9iakRlZm5JRDsKKyAgc3RhdGljIGNvbnN0IEpTUHJvcGVydHlTcGVjIFByb3BlcnR5U3BlY3NbXTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19DSlNfRVZFTlRfSF8KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX2V2ZW50X2NvbnRleHQuY3BwIGIvZnhqcy9janNfZXZlbnRfY29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJmMjcwYgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2pzX2V2ZW50X2NvbnRleHQuY3BwCkBAIC0wLDAgKzEsMjgxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL2Nqc19ldmVudF9jb250ZXh0LmgiCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2F1dG9yZXN0b3Jlci5oIgorI2luY2x1ZGUgImZ4anMvSlNfRGVmaW5lLmgiCisjaW5jbHVkZSAiZnhqcy9janNfZXZlbnRoYW5kbGVyLmgiCisjaW5jbHVkZSAiZnhqcy9janNfcnVudGltZS5oIgorI2luY2x1ZGUgImZ4anMvanNfcmVzb3VyY2VzLmgiCisKK0NKU19FdmVudENvbnRleHQ6OkNKU19FdmVudENvbnRleHQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKQorICAgIDogbV9wUnVudGltZShwUnVudGltZSksCisgICAgICBtX3BFdmVudEhhbmRsZXIobmV3IENKU19FdmVudEhhbmRsZXIodGhpcykpLAorICAgICAgbV9iQnVzeShmYWxzZSkgeworICBBU1NFUlQocFJ1bnRpbWUpOworfQorCitDSlNfRXZlbnRDb250ZXh0Ojp+Q0pTX0V2ZW50Q29udGV4dCgpIHt9CisKK0NQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogQ0pTX0V2ZW50Q29udGV4dDo6R2V0Rm9ybUZpbGxFbnYoKSB7CisgIHJldHVybiBtX3BSdW50aW1lLT5HZXRGb3JtRmlsbEVudigpOworfQorCitib29sIENKU19FdmVudENvbnRleHQ6OlJ1blNjcmlwdChjb25zdCBXaWRlU3RyaW5nJiBzY3JpcHQsIFdpZGVTdHJpbmcqIGluZm8pIHsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUobV9wUnVudGltZS0+R2V0SXNvbGF0ZSgpKTsKKyAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShtX3BSdW50aW1lLT5HZXRJc29sYXRlKCkpOworICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBtX3BSdW50aW1lLT5OZXdMb2NhbENvbnRleHQoKTsKKyAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRfc2NvcGUoY29udGV4dCk7CisKKyAgaWYgKG1fYkJ1c3kpIHsKKyAgICAqaW5mbyA9IEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a0J1c3lFcnJvcik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQXV0b1Jlc3RvcmVyPGJvb2w+IHJlc3RvcmVyKCZtX2JCdXN5KTsKKyAgbV9iQnVzeSA9IHRydWU7CisKKyAgQVNTRVJUKG1fcEV2ZW50SGFuZGxlci0+SXNWYWxpZCgpKTsKKyAgQ0pTX1J1bnRpbWU6OkZpZWxkRXZlbnQgZXZlbnQobV9wRXZlbnRIYW5kbGVyLT5UYXJnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEV2ZW50SGFuZGxlci0+RXZlbnRUeXBlKCkpOworICBpZiAoIW1fcFJ1bnRpbWUtPkFkZEV2ZW50VG9TZXQoZXZlbnQpKSB7CisgICAgKmluZm8gPSBKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtEdXBsaWNhdGVFdmVudEVycm9yKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBXaWRlU3RyaW5nIHNFcnJvck1lc3NhZ2U7CisgIGludCBuUmV0ID0gMDsKKyAgaWYgKHNjcmlwdC5HZXRMZW5ndGgoKSA+IDApCisgICAgblJldCA9IG1fcFJ1bnRpbWUtPkV4ZWN1dGVTY3JpcHQoc2NyaXB0LmNfc3RyKCksICZzRXJyb3JNZXNzYWdlKTsKKworICBpZiAoblJldCA8IDApCisgICAgKmluZm8gKz0gc0Vycm9yTWVzc2FnZTsKKyAgZWxzZQorICAgICppbmZvID0gSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUnVuU3VjY2Vzcyk7CisKKyAgbV9wUnVudGltZS0+UmVtb3ZlRXZlbnRGcm9tU2V0KGV2ZW50KTsKKyAgbV9wRXZlbnRIYW5kbGVyLT5EZXN0cm95KCk7CisgIHJldHVybiBuUmV0ID49IDA7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25BcHBfSW5pdCgpIHsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PbkFwcF9Jbml0KCk7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25Eb2NfT3BlbihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzdHJUYXJnZXROYW1lKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25Eb2NfT3BlbihwRm9ybUZpbGxFbnYsIHN0clRhcmdldE5hbWUpOworfQorCit2b2lkIENKU19FdmVudENvbnRleHQ6Ok9uRG9jX1dpbGxQcmludCgKKyAgICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgeworICBtX3BFdmVudEhhbmRsZXItPk9uRG9jX1dpbGxQcmludChwRm9ybUZpbGxFbnYpOworfQorCit2b2lkIENKU19FdmVudENvbnRleHQ6Ok9uRG9jX0RpZFByaW50KAorICAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25Eb2NfRGlkUHJpbnQocEZvcm1GaWxsRW52KTsKK30KKwordm9pZCBDSlNfRXZlbnRDb250ZXh0OjpPbkRvY19XaWxsU2F2ZSgKKyAgICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgeworICBtX3BFdmVudEhhbmRsZXItPk9uRG9jX1dpbGxTYXZlKHBGb3JtRmlsbEVudik7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25Eb2NfRGlkU2F2ZSgKKyAgICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgeworICBtX3BFdmVudEhhbmRsZXItPk9uRG9jX0RpZFNhdmUocEZvcm1GaWxsRW52KTsKK30KKwordm9pZCBDSlNfRXZlbnRDb250ZXh0OjpPbkRvY19XaWxsQ2xvc2UoCisgICAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIHsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PbkRvY19XaWxsQ2xvc2UocEZvcm1GaWxsRW52KTsKK30KKwordm9pZCBDSlNfRXZlbnRDb250ZXh0OjpPblBhZ2VfT3BlbihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgeworICBtX3BFdmVudEhhbmRsZXItPk9uUGFnZV9PcGVuKHBGb3JtRmlsbEVudik7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25QYWdlX0Nsb3NlKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25QYWdlX0Nsb3NlKHBGb3JtRmlsbEVudik7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25QYWdlX0luVmlldygKKyAgICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgeworICBtX3BFdmVudEhhbmRsZXItPk9uUGFnZV9JblZpZXcocEZvcm1GaWxsRW52KTsKK30KKwordm9pZCBDSlNfRXZlbnRDb250ZXh0OjpPblBhZ2VfT3V0VmlldygKKyAgICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgeworICBtX3BFdmVudEhhbmRsZXItPk9uUGFnZV9PdXRWaWV3KHBGb3JtRmlsbEVudik7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25GaWVsZF9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgeworICBtX3BFdmVudEhhbmRsZXItPk9uRmllbGRfTW91c2VEb3duKGJNb2RpZmllciwgYlNoaWZ0LCBwVGFyZ2V0KTsKK30KKwordm9pZCBDSlNfRXZlbnRDb250ZXh0OjpPbkZpZWxkX01vdXNlRW50ZXIoYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9Nb3VzZUVudGVyKGJNb2RpZmllciwgYlNoaWZ0LCBwVGFyZ2V0KTsKK30KKwordm9pZCBDSlNfRXZlbnRDb250ZXh0OjpPbkZpZWxkX01vdXNlRXhpdChib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9Nb3VzZUV4aXQoYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQpOworfQorCit2b2lkIENKU19FdmVudENvbnRleHQ6Ok9uRmllbGRfTW91c2VVcChib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpIHsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX01vdXNlVXAoYk1vZGlmaWVyLCBiU2hpZnQsIHBUYXJnZXQpOworfQorCit2b2lkIENKU19FdmVudENvbnRleHQ6Ok9uRmllbGRfRm9jdXMoYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgVmFsdWUpIHsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX0ZvY3VzKGJNb2RpZmllciwgYlNoaWZ0LCBwVGFyZ2V0LCBWYWx1ZSk7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25GaWVsZF9CbHVyKGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIFZhbHVlKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9CbHVyKGJNb2RpZmllciwgYlNoaWZ0LCBwVGFyZ2V0LCBWYWx1ZSk7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYlJjKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9DYWxjdWxhdGUocFNvdXJjZSwgcFRhcmdldCwgVmFsdWUsIGJSYyk7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJXaWxsQ29tbWl0KSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9Gb3JtYXQocFRhcmdldCwgVmFsdWUsIGJXaWxsQ29tbWl0KTsKK30KKwordm9pZCBDSlNfRXZlbnRDb250ZXh0OjpPbkZpZWxkX0tleXN0cm9rZShXaWRlU3RyaW5nJiBzdHJDaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJLZXlEb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2VsRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5TZWxTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiV2lsbENvbW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmllbGRGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiUmMpIHsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PbkZpZWxkX0tleXN0cm9rZSgKKyAgICAgIHN0ckNoYW5nZSwgc3RyQ2hhbmdlRXgsIGJLZXlEb3duLCBiTW9kaWZpZXIsIG5TZWxFbmQsIG5TZWxTdGFydCwgYlNoaWZ0LAorICAgICAgcFRhcmdldCwgVmFsdWUsIGJXaWxsQ29tbWl0LCBiRmllbGRGdWxsLCBiUmMpOworfQorCit2b2lkIENKU19FdmVudENvbnRleHQ6Ok9uRmllbGRfVmFsaWRhdGUoV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYktleURvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyYgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYlJjKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25GaWVsZF9WYWxpZGF0ZShzdHJDaGFuZ2UsIHN0ckNoYW5nZUV4LCBiS2V5RG93biwgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNoaWZ0LCBwVGFyZ2V0LCBWYWx1ZSwgYlJjKTsKK30KKwordm9pZCBDSlNfRXZlbnRDb250ZXh0OjpPblNjcmVlbl9Gb2N1cyhib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9Gb2N1cyhiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25TY3JlZW5fQmx1cihib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fQmx1cihiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25TY3JlZW5fT3Blbihib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fT3BlbihiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25TY3JlZW5fQ2xvc2UoYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fQ2xvc2UoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOworfQorCit2b2lkIENKU19FdmVudENvbnRleHQ6Ok9uU2NyZWVuX01vdXNlRG93bihib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBtX3BFdmVudEhhbmRsZXItPk9uU2NyZWVuX01vdXNlRG93bihiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25TY3JlZW5fTW91c2VVcChib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fTW91c2VVcChiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25TY3JlZW5fTW91c2VFbnRlcihib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fTW91c2VFbnRlcihiTW9kaWZpZXIsIGJTaGlmdCwgcFNjcmVlbik7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25TY3JlZW5fTW91c2VFeGl0KGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25TY3JlZW5fTW91c2VFeGl0KGJNb2RpZmllciwgYlNoaWZ0LCBwU2NyZWVuKTsKK30KKwordm9pZCBDSlNfRXZlbnRDb250ZXh0OjpPblNjcmVlbl9JblZpZXcoYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PblNjcmVlbl9JblZpZXcoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOworfQorCit2b2lkIENKU19FdmVudENvbnRleHQ6Ok9uU2NyZWVuX091dFZpZXcoYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBtX3BFdmVudEhhbmRsZXItPk9uU2NyZWVuX091dFZpZXcoYk1vZGlmaWVyLCBiU2hpZnQsIHBTY3JlZW4pOworfQorCit2b2lkIENKU19FdmVudENvbnRleHQ6Ok9uQm9va21hcmtfTW91c2VVcChDUERGX0Jvb2ttYXJrKiBwQm9va01hcmspIHsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PbkJvb2ttYXJrX01vdXNlVXAocEJvb2tNYXJrKTsKK30KKwordm9pZCBDSlNfRXZlbnRDb250ZXh0OjpPbkxpbmtfTW91c2VVcCgKKyAgICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgeworICBtX3BFdmVudEhhbmRsZXItPk9uTGlua19Nb3VzZVVwKHBGb3JtRmlsbEVudik7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25Db25zb2xlX0V4ZWMoKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25Db25zb2xlX0V4ZWMoKTsKK30KKwordm9pZCBDSlNfRXZlbnRDb250ZXh0OjpPbkV4dGVybmFsX0V4ZWMoKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25FeHRlcm5hbF9FeGVjKCk7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50Q29udGV4dDo6T25CYXRjaEV4ZWMoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIHsKKyAgbV9wRXZlbnRIYW5kbGVyLT5PbkJhdGNoRXhlYyhwRm9ybUZpbGxFbnYpOworfQorCit2b2lkIENKU19FdmVudENvbnRleHQ6Ok9uTWVudV9FeGVjKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzdHJUYXJnZXROYW1lKSB7CisgIG1fcEV2ZW50SGFuZGxlci0+T25NZW51X0V4ZWMocEZvcm1GaWxsRW52LCBzdHJUYXJnZXROYW1lKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX2V2ZW50X2NvbnRleHQuaCBiL2Z4anMvY2pzX2V2ZW50X2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTU3MjkwCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfZXZlbnRfY29udGV4dC5oCkBAIC0wLDAgKzEsMTM2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19DSlNfRVZFTlRfQ09OVEVYVF9IXworI2RlZmluZSBGWEpTX0NKU19FVkVOVF9DT05URVhUX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgorI2luY2x1ZGUgImZ4anMvaWpzX2V2ZW50X2NvbnRleHQuaCIKKworY2xhc3MgQ0pTX0V2ZW50SGFuZGxlcjsKK2NsYXNzIENKU19SdW50aW1lOworY2xhc3MgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OworCitjbGFzcyBDSlNfRXZlbnRDb250ZXh0IDogcHVibGljIElKU19FdmVudENvbnRleHQgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pTX0V2ZW50Q29udGV4dChDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICB+Q0pTX0V2ZW50Q29udGV4dCgpIG92ZXJyaWRlOworCisgIC8vIElKU19FdmVudENvbnRleHQKKyAgYm9vbCBSdW5TY3JpcHQoY29uc3QgV2lkZVN0cmluZyYgc2NyaXB0LCBXaWRlU3RyaW5nKiBpbmZvKSBvdmVycmlkZTsKKyAgdm9pZCBPbkFwcF9Jbml0KCkgb3ZlcnJpZGU7CisgIHZvaWQgT25Eb2NfT3BlbihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHN0clRhcmdldE5hbWUpIG92ZXJyaWRlOworICB2b2lkIE9uRG9jX1dpbGxQcmludChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgb3ZlcnJpZGU7CisgIHZvaWQgT25Eb2NfRGlkUHJpbnQoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIG92ZXJyaWRlOworICB2b2lkIE9uRG9jX1dpbGxTYXZlKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSBvdmVycmlkZTsKKyAgdm9pZCBPbkRvY19EaWRTYXZlKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSBvdmVycmlkZTsKKyAgdm9pZCBPbkRvY19XaWxsQ2xvc2UoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIG92ZXJyaWRlOworICB2b2lkIE9uUGFnZV9PcGVuKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSBvdmVycmlkZTsKKyAgdm9pZCBPblBhZ2VfQ2xvc2UoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIG92ZXJyaWRlOworICB2b2lkIE9uUGFnZV9JblZpZXcoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIG92ZXJyaWRlOworICB2b2lkIE9uUGFnZV9PdXRWaWV3KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSBvdmVycmlkZTsKKyAgdm9pZCBPbkZpZWxkX01vdXNlRG93bihib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgb3ZlcnJpZGU7CisgIHZvaWQgT25GaWVsZF9Nb3VzZUVudGVyKGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpIG92ZXJyaWRlOworICB2b2lkIE9uRmllbGRfTW91c2VFeGl0KGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSBvdmVycmlkZTsKKyAgdm9pZCBPbkZpZWxkX01vdXNlVXAoYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgb3ZlcnJpZGU7CisgIHZvaWQgT25GaWVsZF9Gb2N1cyhib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBWYWx1ZSkgb3ZlcnJpZGU7CisgIHZvaWQgT25GaWVsZF9CbHVyKGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIFZhbHVlKSBvdmVycmlkZTsKKyAgdm9pZCBPbkZpZWxkX0NhbGN1bGF0ZShDUERGX0Zvcm1GaWVsZCogcFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiUmMpIG92ZXJyaWRlOworICB2b2lkIE9uRmllbGRfRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYldpbGxDb21taXQpIG92ZXJyaWRlOworICB2b2lkIE9uRmllbGRfS2V5c3Ryb2tlKFdpZGVTdHJpbmcmIHN0ckNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJLZXlEb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgblNlbEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5TZWxTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJXaWxsQ29tbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkZpZWxkRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiUmMpIG92ZXJyaWRlOworICB2b2lkIE9uRmllbGRfVmFsaWRhdGUoV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJLZXlEb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyYgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiUmMpIG92ZXJyaWRlOworICB2b2lkIE9uU2NyZWVuX0ZvY3VzKGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlOworICB2b2lkIE9uU2NyZWVuX0JsdXIoYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlOworICB2b2lkIE9uU2NyZWVuX09wZW4oYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlOworICB2b2lkIE9uU2NyZWVuX0Nsb3NlKGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlOworICB2b2lkIE9uU2NyZWVuX01vdXNlRG93bihib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlOworICB2b2lkIE9uU2NyZWVuX01vdXNlVXAoYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlOworICB2b2lkIE9uU2NyZWVuX01vdXNlRW50ZXIoYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlOworICB2b2lkIE9uU2NyZWVuX01vdXNlRXhpdChib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlOworICB2b2lkIE9uU2NyZWVuX0luVmlldyhib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlOworICB2b2lkIE9uU2NyZWVuX091dFZpZXcoYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlOworICB2b2lkIE9uQm9va21hcmtfTW91c2VVcChDUERGX0Jvb2ttYXJrKiBwQm9va01hcmspIG92ZXJyaWRlOworICB2b2lkIE9uTGlua19Nb3VzZVVwKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSBvdmVycmlkZTsKKyAgdm9pZCBPbk1lbnVfRXhlYyhDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzdHJUYXJnZXROYW1lKSBvdmVycmlkZTsKKyAgdm9pZCBPbkJhdGNoRXhlYyhDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgb3ZlcnJpZGU7CisgIHZvaWQgT25Db25zb2xlX0V4ZWMoKSBvdmVycmlkZTsKKyAgdm9pZCBPbkV4dGVybmFsX0V4ZWMoKSBvdmVycmlkZTsKKworICBDSlNfUnVudGltZSogR2V0SlNSdW50aW1lKCkgY29uc3QgeyByZXR1cm4gbV9wUnVudGltZS5HZXQoKTsgfQorICBDSlNfRXZlbnRIYW5kbGVyKiBHZXRFdmVudEhhbmRsZXIoKSBjb25zdCB7IHJldHVybiBtX3BFdmVudEhhbmRsZXIuZ2V0KCk7IH0KKworICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIEdldEZvcm1GaWxsRW52KCk7CisKKyBwcml2YXRlOgorICBVbm93bmVkUHRyPENKU19SdW50aW1lPiBjb25zdCBtX3BSdW50aW1lOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pTX0V2ZW50SGFuZGxlcj4gbV9wRXZlbnRIYW5kbGVyOworICBib29sIG1fYkJ1c3k7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfQ0pTX0VWRU5UX0NPTlRFWFRfSF8KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX2V2ZW50X2NvbnRleHRfc3R1Yi5jcHAgYi9meGpzL2Nqc19ldmVudF9jb250ZXh0X3N0dWIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MTdhYjIKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc19ldmVudF9jb250ZXh0X3N0dWIuY3BwCkBAIC0wLDAgKzEsMTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMvY2pzX2V2ZW50X2NvbnRleHRfc3R1Yi5oIgorCitib29sIENKU19FdmVudENvbnRleHRTdHViOjpSdW5TY3JpcHQoY29uc3QgV2lkZVN0cmluZyYgc2NyaXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcqIGluZm8pIHsKKyAgcmV0dXJuIGZhbHNlOworfQpkaWZmIC0tZ2l0IGEvZnhqcy9janNfZXZlbnRfY29udGV4dF9zdHViLmggYi9meGpzL2Nqc19ldmVudF9jb250ZXh0X3N0dWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzg1MzY5Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfZXZlbnRfY29udGV4dF9zdHViLmgKQEAgLTAsMCArMSwxMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX0NKU19FVkVOVF9DT05URVhUX1NUVUJfSF8KKyNkZWZpbmUgRlhKU19DSlNfRVZFTlRfQ09OVEVYVF9TVFVCX0hfCisKKyNpbmNsdWRlICJmeGpzL2lqc19ldmVudF9jb250ZXh0LmgiCisKK2NsYXNzIENKU19FdmVudENvbnRleHRTdHViIGZpbmFsIDogcHVibGljIElKU19FdmVudENvbnRleHQgeworIHB1YmxpYzoKKyAgQ0pTX0V2ZW50Q29udGV4dFN0dWIoKSB7fQorICB+Q0pTX0V2ZW50Q29udGV4dFN0dWIoKSBvdmVycmlkZSB7fQorCisgIC8vIElKU19FdmVudENvbnRleHQ6CisgIGJvb2wgUnVuU2NyaXB0KGNvbnN0IFdpZGVTdHJpbmcmIHNjcmlwdCwgV2lkZVN0cmluZyogaW5mbykgb3ZlcnJpZGU7CisKKyAgdm9pZCBPbkFwcF9Jbml0KCkgb3ZlcnJpZGUge30KKyAgdm9pZCBPbkRvY19PcGVuKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAorICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgc3RyVGFyZ2V0TmFtZSkgb3ZlcnJpZGUge30KKyAgdm9pZCBPbkRvY19XaWxsUHJpbnQoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25Eb2NfRGlkUHJpbnQoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25Eb2NfV2lsbFNhdmUoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25Eb2NfRGlkU2F2ZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgb3ZlcnJpZGUge30KKyAgdm9pZCBPbkRvY19XaWxsQ2xvc2UoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25QYWdlX09wZW4oQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25QYWdlX0Nsb3NlKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSBvdmVycmlkZSB7fQorICB2b2lkIE9uUGFnZV9JblZpZXcoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25QYWdlX091dFZpZXcoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25GaWVsZF9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25GaWVsZF9Nb3VzZUVudGVyKGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25GaWVsZF9Nb3VzZUV4aXQoYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25GaWVsZF9Nb3VzZVVwKGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25GaWVsZF9Gb2N1cyhib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBWYWx1ZSkgb3ZlcnJpZGUge30KKyAgdm9pZCBPbkZpZWxkX0JsdXIoYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgVmFsdWUpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyYgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYlJjKSBvdmVycmlkZSB7fQorICB2b2lkIE9uRmllbGRfRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYldpbGxDb21taXQpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25GaWVsZF9LZXlzdHJva2UoV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgS2V5RG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5TZWxFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2VsU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyYgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiV2lsbENvbW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGaWVsZEZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYlJjKSBvdmVycmlkZSB7fQorICB2b2lkIE9uRmllbGRfVmFsaWRhdGUoV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJLZXlEb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyYgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiUmMpIG92ZXJyaWRlIHt9CisgIHZvaWQgT25TY3JlZW5fRm9jdXMoYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgb3ZlcnJpZGUge30KKyAgdm9pZCBPblNjcmVlbl9CbHVyKGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSBvdmVycmlkZSB7fQorICB2b2lkIE9uU2NyZWVuX09wZW4oYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlIHt9CisgIHZvaWQgT25TY3JlZW5fQ2xvc2UoYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgb3ZlcnJpZGUge30KKyAgdm9pZCBPblNjcmVlbl9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSBvdmVycmlkZSB7fQorICB2b2lkIE9uU2NyZWVuX01vdXNlVXAoYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlIHt9CisgIHZvaWQgT25TY3JlZW5fTW91c2VFbnRlcihib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgb3ZlcnJpZGUge30KKyAgdm9pZCBPblNjcmVlbl9Nb3VzZUV4aXQoYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSBvdmVycmlkZSB7fQorICB2b2lkIE9uU2NyZWVuX0luVmlldyhib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIG92ZXJyaWRlIHt9CisgIHZvaWQgT25TY3JlZW5fT3V0Vmlldyhib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgb3ZlcnJpZGUge30KKyAgdm9pZCBPbkJvb2ttYXJrX01vdXNlVXAoQ1BERl9Cb29rbWFyayogcEJvb2tNYXJrKSBvdmVycmlkZSB7fQorICB2b2lkIE9uTGlua19Nb3VzZVVwKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSBvdmVycmlkZSB7fQorICB2b2lkIE9uTWVudV9FeGVjKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmKSBvdmVycmlkZSB7fQorICB2b2lkIE9uQmF0Y2hFeGVjKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSBvdmVycmlkZSB7fQorICB2b2lkIE9uQ29uc29sZV9FeGVjKCkgb3ZlcnJpZGUge30KKyAgdm9pZCBPbkV4dGVybmFsX0V4ZWMoKSBvdmVycmlkZSB7fQorfTsKKworI2VuZGlmICAvLyBGWEpTX0NKU19FVkVOVF9DT05URVhUX1NUVUJfSF8KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX2V2ZW50aGFuZGxlci5jcHAgYi9meGpzL2Nqc19ldmVudGhhbmRsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMTUwYjIKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc19ldmVudGhhbmRsZXIuY3BwCkBAIC0wLDAgKzEsNjU0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL2Nqc19ldmVudGhhbmRsZXIuaCIKKworI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX2Zvcm1maWVsZC5oIgorI2luY2x1ZGUgImZ4anMvSlNfRGVmaW5lLmgiCisjaW5jbHVkZSAiZnhqcy9janNfZG9jdW1lbnQuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19ldmVudF9jb250ZXh0LmgiCisjaW5jbHVkZSAiZnhqcy9janNfZmllbGQuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19vYmplY3QuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19ydW50aW1lLmgiCisKK0NKU19FdmVudEhhbmRsZXI6OkNKU19FdmVudEhhbmRsZXIoQ0pTX0V2ZW50Q29udGV4dCogcENvbnRleHQpCisgICAgOiBtX3BKU0V2ZW50Q29udGV4dChwQ29udGV4dCksCisgICAgICBtX2VFdmVudFR5cGUoSkVUX1VOS05PV04pLAorICAgICAgbV9iVmFsaWQoZmFsc2UpLAorICAgICAgbV9wV2lkZVN0ckNoYW5nZShudWxscHRyKSwKKyAgICAgIG1fbkNvbW1pdEtleSgtMSksCisgICAgICBtX2JLZXlEb3duKGZhbHNlKSwKKyAgICAgIG1fYk1vZGlmaWVyKGZhbHNlKSwKKyAgICAgIG1fYlNoaWZ0KGZhbHNlKSwKKyAgICAgIG1fcElTZWxFbmQobnVsbHB0ciksCisgICAgICBtX25TZWxFbmREdSgwKSwKKyAgICAgIG1fcElTZWxTdGFydChudWxscHRyKSwKKyAgICAgIG1fblNlbFN0YXJ0RHUoMCksCisgICAgICBtX2JXaWxsQ29tbWl0KGZhbHNlKSwKKyAgICAgIG1fcFZhbHVlKG51bGxwdHIpLAorICAgICAgbV9iRmllbGRGdWxsKGZhbHNlKSwKKyAgICAgIG1fcGJSYyhudWxscHRyKSwKKyAgICAgIG1fYlJjRHUoZmFsc2UpLAorICAgICAgbV9wVGFyZ2V0Qm9va01hcmsobnVsbHB0ciksCisgICAgICBtX3BUYXJnZXRGb3JtRmlsbEVudihudWxscHRyKSwKKyAgICAgIG1fcFRhcmdldEFubm90KG51bGxwdHIpIHt9CisKK0NKU19FdmVudEhhbmRsZXI6On5DSlNfRXZlbnRIYW5kbGVyKCkge30KKwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkFwcF9Jbml0KCkgeworICBJbml0aWFsKEpFVF9BUFBfSU5JVCk7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25Eb2NfT3BlbihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzdHJUYXJnZXROYW1lKSB7CisgIEluaXRpYWwoSkVUX0RPQ19PUEVOKTsKKyAgbV9wVGFyZ2V0Rm9ybUZpbGxFbnYuUmVzZXQocEZvcm1GaWxsRW52KTsKKyAgbV9zdHJUYXJnZXROYW1lID0gc3RyVGFyZ2V0TmFtZTsKK30KKwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkRvY19XaWxsUHJpbnQoCisgICAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIHsKKyAgSW5pdGlhbChKRVRfRE9DX1dJTExQUklOVCk7CisgIG1fcFRhcmdldEZvcm1GaWxsRW52LlJlc2V0KHBGb3JtRmlsbEVudik7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25Eb2NfRGlkUHJpbnQoCisgICAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIHsKKyAgSW5pdGlhbChKRVRfRE9DX0RJRFBSSU5UKTsKKyAgbV9wVGFyZ2V0Rm9ybUZpbGxFbnYuUmVzZXQocEZvcm1GaWxsRW52KTsKK30KKwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkRvY19XaWxsU2F2ZSgKKyAgICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgeworICBJbml0aWFsKEpFVF9ET0NfV0lMTFNBVkUpOworICBtX3BUYXJnZXRGb3JtRmlsbEVudi5SZXNldChwRm9ybUZpbGxFbnYpOworfQorCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRG9jX0RpZFNhdmUoCisgICAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpIHsKKyAgSW5pdGlhbChKRVRfRE9DX0RJRFNBVkUpOworICBtX3BUYXJnZXRGb3JtRmlsbEVudi5SZXNldChwRm9ybUZpbGxFbnYpOworfQorCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRG9jX1dpbGxDbG9zZSgKKyAgICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgeworICBJbml0aWFsKEpFVF9ET0NfV0lMTENMT1NFKTsKKyAgbV9wVGFyZ2V0Rm9ybUZpbGxFbnYuUmVzZXQocEZvcm1GaWxsRW52KTsKK30KKwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblBhZ2VfT3BlbihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgeworICBJbml0aWFsKEpFVF9QQUdFX09QRU4pOworICBtX3BUYXJnZXRGb3JtRmlsbEVudi5SZXNldChwRm9ybUZpbGxFbnYpOworfQorCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uUGFnZV9DbG9zZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgeworICBJbml0aWFsKEpFVF9QQUdFX0NMT1NFKTsKKyAgbV9wVGFyZ2V0Rm9ybUZpbGxFbnYuUmVzZXQocEZvcm1GaWxsRW52KTsKK30KKwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblBhZ2VfSW5WaWV3KAorICAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSB7CisgIEluaXRpYWwoSkVUX1BBR0VfSU5WSUVXKTsKKyAgbV9wVGFyZ2V0Rm9ybUZpbGxFbnYuUmVzZXQocEZvcm1GaWxsRW52KTsKK30KKwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblBhZ2VfT3V0VmlldygKKyAgICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgeworICBJbml0aWFsKEpFVF9QQUdFX09VVFZJRVcpOworICBtX3BUYXJnZXRGb3JtRmlsbEVudi5SZXNldChwRm9ybUZpbGxFbnYpOworfQorCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfTW91c2VFbnRlcihib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpIHsKKyAgSW5pdGlhbChKRVRfRklFTERfTU9VU0VFTlRFUik7CisKKyAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7CisgIG1fYlNoaWZ0ID0gYlNoaWZ0OworCisgIG1fc3RyVGFyZ2V0TmFtZSA9IHBUYXJnZXQtPkdldEZ1bGxOYW1lKCk7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9Nb3VzZUV4aXQoYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgeworICBJbml0aWFsKEpFVF9GSUVMRF9NT1VTRUVYSVQpOworCisgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOworICBtX2JTaGlmdCA9IGJTaGlmdDsKKyAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKK30KKwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX01vdXNlRG93bihib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSB7CisgIEluaXRpYWwoSkVUX0ZJRUxEX01PVVNFRE9XTik7CisgIG1fZUV2ZW50VHlwZSA9IEpFVF9GSUVMRF9NT1VTRURPV047CisKKyAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7CisgIG1fYlNoaWZ0ID0gYlNoaWZ0OworICBtX3N0clRhcmdldE5hbWUgPSBwVGFyZ2V0LT5HZXRGdWxsTmFtZSgpOworfQorCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfTW91c2VVcChib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpIHsKKyAgSW5pdGlhbChKRVRfRklFTERfTU9VU0VVUCk7CisKKyAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7CisgIG1fYlNoaWZ0ID0gYlNoaWZ0OworICBtX3N0clRhcmdldE5hbWUgPSBwVGFyZ2V0LT5HZXRGdWxsTmFtZSgpOworfQorCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfRm9jdXMoYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgVmFsdWUpIHsKKyAgSW5pdGlhbChKRVRfRklFTERfRk9DVVMpOworCisgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOworICBtX2JTaGlmdCA9IGJTaGlmdDsKKyAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKKyAgbV9wVmFsdWUgPSAoV2lkZVN0cmluZyopJlZhbHVlOworfQorCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRmllbGRfQmx1cihib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBWYWx1ZSkgeworICBJbml0aWFsKEpFVF9GSUVMRF9CTFVSKTsKKworICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKKyAgbV9iU2hpZnQgPSBiU2hpZnQ7CisgIG1fc3RyVGFyZ2V0TmFtZSA9IHBUYXJnZXQtPkdldEZ1bGxOYW1lKCk7CisgIG1fcFZhbHVlID0gKFdpZGVTdHJpbmcqKSZWYWx1ZTsKK30KKwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPbkZpZWxkX0tleXN0cm9rZShXaWRlU3RyaW5nJiBzdHJDaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEtleURvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5TZWxFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgblNlbFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJXaWxsQ29tbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGaWVsZEZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJSYykgeworICBJbml0aWFsKEpFVF9GSUVMRF9LRVlTVFJPS0UpOworCisgIG1fbkNvbW1pdEtleSA9IDA7CisgIG1fcFdpZGVTdHJDaGFuZ2UgPSAmc3RyQ2hhbmdlOworICBtX1dpZGVTdHJDaGFuZ2VFeCA9IHN0ckNoYW5nZUV4OworICBtX2JLZXlEb3duID0gS2V5RG93bjsKKyAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7CisgIG1fcElTZWxFbmQgPSAmblNlbEVuZDsKKyAgbV9wSVNlbFN0YXJ0ID0gJm5TZWxTdGFydDsKKyAgbV9iU2hpZnQgPSBiU2hpZnQ7CisgIG1fc3RyVGFyZ2V0TmFtZSA9IHBUYXJnZXQtPkdldEZ1bGxOYW1lKCk7CisgIG1fcFZhbHVlID0gJlZhbHVlOworICBtX2JXaWxsQ29tbWl0ID0gYldpbGxDb21taXQ7CisgIG1fcGJSYyA9ICZiUmM7CisgIG1fYkZpZWxkRnVsbCA9IGJGaWVsZEZ1bGw7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9WYWxpZGF0ZShXaWRlU3RyaW5nJiBzdHJDaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgc3RyQ2hhbmdlRXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiS2V5RG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiUmMpIHsKKyAgSW5pdGlhbChKRVRfRklFTERfVkFMSURBVEUpOworCisgIG1fcFdpZGVTdHJDaGFuZ2UgPSAmc3RyQ2hhbmdlOworICBtX1dpZGVTdHJDaGFuZ2VFeCA9IHN0ckNoYW5nZUV4OworICBtX2JLZXlEb3duID0gYktleURvd247CisgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOworICBtX2JTaGlmdCA9IGJTaGlmdDsKKyAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKKyAgbV9wVmFsdWUgPSAmVmFsdWU7CisgIG1fcGJSYyA9ICZiUmM7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9DYWxjdWxhdGUoQ1BERl9Gb3JtRmllbGQqIHBTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYlJjKSB7CisgIEluaXRpYWwoSkVUX0ZJRUxEX0NBTENVTEFURSk7CisKKyAgaWYgKHBTb3VyY2UpCisgICAgbV9zdHJTb3VyY2VOYW1lID0gcFNvdXJjZS0+R2V0RnVsbE5hbWUoKTsKKyAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKKyAgbV9wVmFsdWUgPSAmVmFsdWU7CisgIG1fcGJSYyA9ICZiUmM7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJXaWxsQ29tbWl0KSB7CisgIEluaXRpYWwoSkVUX0ZJRUxEX0ZPUk1BVCk7CisKKyAgbV9uQ29tbWl0S2V5ID0gMDsKKyAgbV9zdHJUYXJnZXROYW1lID0gcFRhcmdldC0+R2V0RnVsbE5hbWUoKTsKKyAgbV9wVmFsdWUgPSAmVmFsdWU7CisgIG1fYldpbGxDb21taXQgPSBiV2lsbENvbW1pdDsKK30KKwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Gb2N1cyhib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKKyAgSW5pdGlhbChKRVRfU0NSRUVOX0ZPQ1VTKTsKKworICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKKyAgbV9iU2hpZnQgPSBiU2hpZnQ7CisgIG1fcFRhcmdldEFubm90LlJlc2V0KHBTY3JlZW4pOworfQorCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX0JsdXIoYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBJbml0aWFsKEpFVF9TQ1JFRU5fQkxVUik7CisKKyAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7CisgIG1fYlNoaWZ0ID0gYlNoaWZ0OworICBtX3BUYXJnZXRBbm5vdC5SZXNldChwU2NyZWVuKTsKK30KKwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9PcGVuKGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKKyAgSW5pdGlhbChKRVRfU0NSRUVOX09QRU4pOworCisgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOworICBtX2JTaGlmdCA9IGJTaGlmdDsKKyAgbV9wVGFyZ2V0QW5ub3QuUmVzZXQocFNjcmVlbik7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fQ2xvc2UoYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7CisgIEluaXRpYWwoSkVUX1NDUkVFTl9DTE9TRSk7CisKKyAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7CisgIG1fYlNoaWZ0ID0gYlNoaWZ0OworICBtX3BUYXJnZXRBbm5vdC5SZXNldChwU2NyZWVuKTsKK30KKwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKKyAgSW5pdGlhbChKRVRfU0NSRUVOX01PVVNFRE9XTik7CisKKyAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7CisgIG1fYlNoaWZ0ID0gYlNoaWZ0OworICBtX3BUYXJnZXRBbm5vdC5SZXNldChwU2NyZWVuKTsKK30KKwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9Nb3VzZVVwKGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKKyAgSW5pdGlhbChKRVRfU0NSRUVOX01PVVNFVVApOworCisgIG1fYk1vZGlmaWVyID0gYk1vZGlmaWVyOworICBtX2JTaGlmdCA9IGJTaGlmdDsKKyAgbV9wVGFyZ2V0QW5ub3QuUmVzZXQocFNjcmVlbik7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25TY3JlZW5fTW91c2VFbnRlcihib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSB7CisgIEluaXRpYWwoSkVUX1NDUkVFTl9NT1VTRUVOVEVSKTsKKworICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKKyAgbV9iU2hpZnQgPSBiU2hpZnQ7CisgIG1fcFRhcmdldEFubm90LlJlc2V0KHBTY3JlZW4pOworfQorCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX01vdXNlRXhpdChib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBJbml0aWFsKEpFVF9TQ1JFRU5fTU9VU0VFWElUKTsKKworICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKKyAgbV9iU2hpZnQgPSBiU2hpZnQ7CisgIG1fcFRhcmdldEFubm90LlJlc2V0KHBTY3JlZW4pOworfQorCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uU2NyZWVuX0luVmlldyhib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgeworICBJbml0aWFsKEpFVF9TQ1JFRU5fSU5WSUVXKTsKKyAgbV9iTW9kaWZpZXIgPSBiTW9kaWZpZXI7CisgIG1fYlNoaWZ0ID0gYlNoaWZ0OworICBtX3BUYXJnZXRBbm5vdC5SZXNldChwU2NyZWVuKTsKK30KKwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpPblNjcmVlbl9PdXRWaWV3KGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pIHsKKyAgSW5pdGlhbChKRVRfU0NSRUVOX09VVFZJRVcpOworICBtX2JNb2RpZmllciA9IGJNb2RpZmllcjsKKyAgbV9iU2hpZnQgPSBiU2hpZnQ7CisgIG1fcFRhcmdldEFubm90LlJlc2V0KHBTY3JlZW4pOworfQorCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uTGlua19Nb3VzZVVwKAorICAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcFRhcmdldEZvcm1GaWxsRW52KSB7CisgIEluaXRpYWwoSkVUX0xJTktfTU9VU0VVUCk7CisgIG1fcFRhcmdldEZvcm1GaWxsRW52LlJlc2V0KHBUYXJnZXRGb3JtRmlsbEVudik7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25Cb29rbWFya19Nb3VzZVVwKENQREZfQm9va21hcmsqIHBCb29rTWFyaykgeworICBJbml0aWFsKEpFVF9CT09LTUFSS19NT1VTRVVQKTsKKyAgbV9wVGFyZ2V0Qm9va01hcmsgPSBwQm9va01hcms7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25NZW51X0V4ZWMoCisgICAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwVGFyZ2V0Rm9ybUZpbGxFbnYsCisgICAgY29uc3QgV2lkZVN0cmluZyYgc3RyVGFyZ2V0TmFtZSkgeworICBJbml0aWFsKEpFVF9NRU5VX0VYRUMpOworICBtX3BUYXJnZXRGb3JtRmlsbEVudi5SZXNldChwVGFyZ2V0Rm9ybUZpbGxFbnYpOworICBtX3N0clRhcmdldE5hbWUgPSBzdHJUYXJnZXROYW1lOworfQorCit2b2lkIENKU19FdmVudEhhbmRsZXI6Ok9uRXh0ZXJuYWxfRXhlYygpIHsKKyAgSW5pdGlhbChKRVRfRVhURVJOQUxfRVhFQyk7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25CYXRjaEV4ZWMoCisgICAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwVGFyZ2V0Rm9ybUZpbGxFbnYpIHsKKyAgSW5pdGlhbChKRVRfQkFUQ0hfRVhFQyk7CisgIG1fcFRhcmdldEZvcm1GaWxsRW52LlJlc2V0KHBUYXJnZXRGb3JtRmlsbEVudik7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6T25Db25zb2xlX0V4ZWMoKSB7CisgIEluaXRpYWwoSkVUX0NPTlNPTEVfRVhFQyk7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6SW5pdGlhbChKU19FVkVOVF9UIHR5cGUpIHsKKyAgbV9lRXZlbnRUeXBlID0gdHlwZTsKKworICBtX3N0clRhcmdldE5hbWUgPSBMIiI7CisgIG1fc3RyU291cmNlTmFtZSA9IEwiIjsKKyAgbV9wV2lkZVN0ckNoYW5nZSA9IG51bGxwdHI7CisgIG1fV2lkZVN0ckNoYW5nZUR1ID0gTCIiOworICBtX1dpZGVTdHJDaGFuZ2VFeCA9IEwiIjsKKyAgbV9uQ29tbWl0S2V5ID0gLTE7CisgIG1fYktleURvd24gPSBmYWxzZTsKKyAgbV9iTW9kaWZpZXIgPSBmYWxzZTsKKyAgbV9iU2hpZnQgPSBmYWxzZTsKKyAgbV9wSVNlbEVuZCA9IG51bGxwdHI7CisgIG1fblNlbEVuZER1ID0gMDsKKyAgbV9wSVNlbFN0YXJ0ID0gbnVsbHB0cjsKKyAgbV9uU2VsU3RhcnREdSA9IDA7CisgIG1fYldpbGxDb21taXQgPSBmYWxzZTsKKyAgbV9wVmFsdWUgPSBudWxscHRyOworICBtX2JGaWVsZEZ1bGwgPSBmYWxzZTsKKyAgbV9wYlJjID0gbnVsbHB0cjsKKyAgbV9iUmNEdSA9IGZhbHNlOworCisgIG1fcFRhcmdldEJvb2tNYXJrID0gbnVsbHB0cjsKKyAgbV9wVGFyZ2V0Rm9ybUZpbGxFbnYuUmVzZXQoKTsKKyAgbV9wVGFyZ2V0QW5ub3QuUmVzZXQoKTsKKworICBtX2JWYWxpZCA9IHRydWU7Cit9CisKK3ZvaWQgQ0pTX0V2ZW50SGFuZGxlcjo6RGVzdHJveSgpIHsKKyAgbV9iVmFsaWQgPSBmYWxzZTsKK30KKworYm9vbCBDSlNfRXZlbnRIYW5kbGVyOjpJc1ZhbGlkKCkgY29uc3QgeworICByZXR1cm4gbV9iVmFsaWQ7Cit9CisKK1dpZGVTdHJpbmcmIENKU19FdmVudEhhbmRsZXI6OkNoYW5nZSgpIHsKKyAgaWYgKG1fcFdpZGVTdHJDaGFuZ2UpIHsKKyAgICByZXR1cm4gKm1fcFdpZGVTdHJDaGFuZ2U7CisgIH0KKyAgcmV0dXJuIG1fV2lkZVN0ckNoYW5nZUR1OworfQorCitjb25zdCBXaWRlU3RyaW5nJiBDSlNfRXZlbnRIYW5kbGVyOjpDaGFuZ2VFeCgpIHsKKyAgcmV0dXJuIG1fV2lkZVN0ckNoYW5nZUV4OworfQorCitpbnQgQ0pTX0V2ZW50SGFuZGxlcjo6Q29tbWl0S2V5KCkgY29uc3QgeworICByZXR1cm4gbV9uQ29tbWl0S2V5OworfQorCitib29sIENKU19FdmVudEhhbmRsZXI6OkZpZWxkRnVsbCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYkZpZWxkRnVsbDsKK30KKworYm9vbCBDSlNfRXZlbnRIYW5kbGVyOjpLZXlEb3duKCkgY29uc3QgeworICByZXR1cm4gbV9iS2V5RG93bjsKK30KKworYm9vbCBDSlNfRXZlbnRIYW5kbGVyOjpNb2RpZmllcigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYk1vZGlmaWVyOworfQorCitjb25zdCB3Y2hhcl90KiBDSlNfRXZlbnRIYW5kbGVyOjpOYW1lKCkgY29uc3QgeworICBzd2l0Y2ggKG1fZUV2ZW50VHlwZSkgeworICAgIGNhc2UgSkVUX0FQUF9JTklUOgorICAgICAgcmV0dXJuIEwiSW5pdCI7CisgICAgY2FzZSBKRVRfQkFUQ0hfRVhFQzoKKyAgICAgIHJldHVybiBMIkV4ZWMiOworICAgIGNhc2UgSkVUX0JPT0tNQVJLX01PVVNFVVA6CisgICAgICByZXR1cm4gTCJNb3VzZSBVcCI7CisgICAgY2FzZSBKRVRfQ09OU09MRV9FWEVDOgorICAgICAgcmV0dXJuIEwiRXhlYyI7CisgICAgY2FzZSBKRVRfRE9DX0RJRFBSSU5UOgorICAgICAgcmV0dXJuIEwiRGlkUHJpbnQiOworICAgIGNhc2UgSkVUX0RPQ19ESURTQVZFOgorICAgICAgcmV0dXJuIEwiRGlkU2F2ZSI7CisgICAgY2FzZSBKRVRfRE9DX09QRU46CisgICAgICByZXR1cm4gTCJPcGVuIjsKKyAgICBjYXNlIEpFVF9ET0NfV0lMTENMT1NFOgorICAgICAgcmV0dXJuIEwiV2lsbENsb3NlIjsKKyAgICBjYXNlIEpFVF9ET0NfV0lMTFBSSU5UOgorICAgICAgcmV0dXJuIEwiV2lsbFByaW50IjsKKyAgICBjYXNlIEpFVF9ET0NfV0lMTFNBVkU6CisgICAgICByZXR1cm4gTCJXaWxsU2F2ZSI7CisgICAgY2FzZSBKRVRfRVhURVJOQUxfRVhFQzoKKyAgICAgIHJldHVybiBMIkV4ZWMiOworICAgIGNhc2UgSkVUX0ZJRUxEX0ZPQ1VTOgorICAgIGNhc2UgSkVUX1NDUkVFTl9GT0NVUzoKKyAgICAgIHJldHVybiBMIkZvY3VzIjsKKyAgICBjYXNlIEpFVF9GSUVMRF9CTFVSOgorICAgIGNhc2UgSkVUX1NDUkVFTl9CTFVSOgorICAgICAgcmV0dXJuIEwiQmx1ciI7CisgICAgY2FzZSBKRVRfRklFTERfTU9VU0VET1dOOgorICAgIGNhc2UgSkVUX1NDUkVFTl9NT1VTRURPV046CisgICAgICByZXR1cm4gTCJNb3VzZSBEb3duIjsKKyAgICBjYXNlIEpFVF9GSUVMRF9NT1VTRVVQOgorICAgIGNhc2UgSkVUX1NDUkVFTl9NT1VTRVVQOgorICAgICAgcmV0dXJuIEwiTW91c2UgVXAiOworICAgIGNhc2UgSkVUX0ZJRUxEX01PVVNFRU5URVI6CisgICAgY2FzZSBKRVRfU0NSRUVOX01PVVNFRU5URVI6CisgICAgICByZXR1cm4gTCJNb3VzZSBFbnRlciI7CisgICAgY2FzZSBKRVRfRklFTERfTU9VU0VFWElUOgorICAgIGNhc2UgSkVUX1NDUkVFTl9NT1VTRUVYSVQ6CisgICAgICByZXR1cm4gTCJNb3VzZSBFeGl0IjsKKyAgICBjYXNlIEpFVF9GSUVMRF9DQUxDVUxBVEU6CisgICAgICByZXR1cm4gTCJDYWxjdWxhdGUiOworICAgIGNhc2UgSkVUX0ZJRUxEX0ZPUk1BVDoKKyAgICAgIHJldHVybiBMIkZvcm1hdCI7CisgICAgY2FzZSBKRVRfRklFTERfS0VZU1RST0tFOgorICAgICAgcmV0dXJuIEwiS2V5c3Ryb2tlIjsKKyAgICBjYXNlIEpFVF9GSUVMRF9WQUxJREFURToKKyAgICAgIHJldHVybiBMIlZhbGlkYXRlIjsKKyAgICBjYXNlIEpFVF9MSU5LX01PVVNFVVA6CisgICAgICByZXR1cm4gTCJNb3VzZSBVcCI7CisgICAgY2FzZSBKRVRfTUVOVV9FWEVDOgorICAgICAgcmV0dXJuIEwiRXhlYyI7CisgICAgY2FzZSBKRVRfUEFHRV9PUEVOOgorICAgIGNhc2UgSkVUX1NDUkVFTl9PUEVOOgorICAgICAgcmV0dXJuIEwiT3BlbiI7CisgICAgY2FzZSBKRVRfUEFHRV9DTE9TRToKKyAgICBjYXNlIEpFVF9TQ1JFRU5fQ0xPU0U6CisgICAgICByZXR1cm4gTCJDbG9zZSI7CisgICAgY2FzZSBKRVRfU0NSRUVOX0lOVklFVzoKKyAgICBjYXNlIEpFVF9QQUdFX0lOVklFVzoKKyAgICAgIHJldHVybiBMIkluVmlldyI7CisgICAgY2FzZSBKRVRfUEFHRV9PVVRWSUVXOgorICAgIGNhc2UgSkVUX1NDUkVFTl9PVVRWSUVXOgorICAgICAgcmV0dXJuIEwiT3V0VmlldyI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBMIiI7CisgIH0KK30KKworY29uc3Qgd2NoYXJfdCogQ0pTX0V2ZW50SGFuZGxlcjo6VHlwZSgpIGNvbnN0IHsKKyAgc3dpdGNoIChtX2VFdmVudFR5cGUpIHsKKyAgICBjYXNlIEpFVF9BUFBfSU5JVDoKKyAgICAgIHJldHVybiBMIkFwcCI7CisgICAgY2FzZSBKRVRfQkFUQ0hfRVhFQzoKKyAgICAgIHJldHVybiBMIkJhdGNoIjsKKyAgICBjYXNlIEpFVF9CT09LTUFSS19NT1VTRVVQOgorICAgICAgcmV0dXJuIEwiQm9va01hcmsiOworICAgIGNhc2UgSkVUX0NPTlNPTEVfRVhFQzoKKyAgICAgIHJldHVybiBMIkNvbnNvbGUiOworICAgIGNhc2UgSkVUX0RPQ19ESURQUklOVDoKKyAgICBjYXNlIEpFVF9ET0NfRElEU0FWRToKKyAgICBjYXNlIEpFVF9ET0NfT1BFTjoKKyAgICBjYXNlIEpFVF9ET0NfV0lMTENMT1NFOgorICAgIGNhc2UgSkVUX0RPQ19XSUxMUFJJTlQ6CisgICAgY2FzZSBKRVRfRE9DX1dJTExTQVZFOgorICAgICAgcmV0dXJuIEwiRG9jIjsKKyAgICBjYXNlIEpFVF9FWFRFUk5BTF9FWEVDOgorICAgICAgcmV0dXJuIEwiRXh0ZXJuYWwiOworICAgIGNhc2UgSkVUX0ZJRUxEX0JMVVI6CisgICAgY2FzZSBKRVRfRklFTERfRk9DVVM6CisgICAgY2FzZSBKRVRfRklFTERfTU9VU0VET1dOOgorICAgIGNhc2UgSkVUX0ZJRUxEX01PVVNFRU5URVI6CisgICAgY2FzZSBKRVRfRklFTERfTU9VU0VFWElUOgorICAgIGNhc2UgSkVUX0ZJRUxEX01PVVNFVVA6CisgICAgY2FzZSBKRVRfRklFTERfQ0FMQ1VMQVRFOgorICAgIGNhc2UgSkVUX0ZJRUxEX0ZPUk1BVDoKKyAgICBjYXNlIEpFVF9GSUVMRF9LRVlTVFJPS0U6CisgICAgY2FzZSBKRVRfRklFTERfVkFMSURBVEU6CisgICAgICByZXR1cm4gTCJGaWVsZCI7CisgICAgY2FzZSBKRVRfU0NSRUVOX0ZPQ1VTOgorICAgIGNhc2UgSkVUX1NDUkVFTl9CTFVSOgorICAgIGNhc2UgSkVUX1NDUkVFTl9PUEVOOgorICAgIGNhc2UgSkVUX1NDUkVFTl9DTE9TRToKKyAgICBjYXNlIEpFVF9TQ1JFRU5fTU9VU0VET1dOOgorICAgIGNhc2UgSkVUX1NDUkVFTl9NT1VTRVVQOgorICAgIGNhc2UgSkVUX1NDUkVFTl9NT1VTRUVOVEVSOgorICAgIGNhc2UgSkVUX1NDUkVFTl9NT1VTRUVYSVQ6CisgICAgY2FzZSBKRVRfU0NSRUVOX0lOVklFVzoKKyAgICBjYXNlIEpFVF9TQ1JFRU5fT1VUVklFVzoKKyAgICAgIHJldHVybiBMIlNjcmVlbiI7CisgICAgY2FzZSBKRVRfTElOS19NT1VTRVVQOgorICAgICAgcmV0dXJuIEwiTGluayI7CisgICAgY2FzZSBKRVRfTUVOVV9FWEVDOgorICAgICAgcmV0dXJuIEwiTWVudSI7CisgICAgY2FzZSBKRVRfUEFHRV9PUEVOOgorICAgIGNhc2UgSkVUX1BBR0VfQ0xPU0U6CisgICAgY2FzZSBKRVRfUEFHRV9JTlZJRVc6CisgICAgY2FzZSBKRVRfUEFHRV9PVVRWSUVXOgorICAgICAgcmV0dXJuIEwiUGFnZSI7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBMIiI7CisgIH0KK30KKworYm9vbCYgQ0pTX0V2ZW50SGFuZGxlcjo6UmMoKSB7CisgIHJldHVybiBtX3BiUmMgPyAqbV9wYlJjIDogbV9iUmNEdTsKK30KKworaW50IENKU19FdmVudEhhbmRsZXI6OlNlbEVuZCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcElTZWxFbmQgPyAqbV9wSVNlbEVuZCA6IG1fblNlbEVuZER1OworfQorCitpbnQgQ0pTX0V2ZW50SGFuZGxlcjo6U2VsU3RhcnQoKSBjb25zdCB7CisgIHJldHVybiBtX3BJU2VsU3RhcnQgPyAqbV9wSVNlbFN0YXJ0IDogbV9uU2VsU3RhcnREdTsKK30KKwordm9pZCBDSlNfRXZlbnRIYW5kbGVyOjpTZXRTZWxFbmQoaW50IHZhbHVlKSB7CisgIGludCYgdGFyZ2V0ID0gbV9wSVNlbEVuZCA/ICptX3BJU2VsRW5kIDogbV9uU2VsRW5kRHU7CisgIHRhcmdldCA9IHZhbHVlOworfQorCit2b2lkIENKU19FdmVudEhhbmRsZXI6OlNldFNlbFN0YXJ0KGludCB2YWx1ZSkgeworICBpbnQmIHRhcmdldCA9IG1fcElTZWxTdGFydCA/ICptX3BJU2VsU3RhcnQgOiBtX25TZWxTdGFydER1OworICB0YXJnZXQgPSB2YWx1ZTsKK30KKworYm9vbCBDSlNfRXZlbnRIYW5kbGVyOjpTaGlmdCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYlNoaWZ0OworfQorCitGaWVsZCogQ0pTX0V2ZW50SGFuZGxlcjo6U291cmNlKCkgeworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBtX3BKU0V2ZW50Q29udGV4dC0+R2V0SlNSdW50aW1lKCk7CisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwRG9jT2JqID0KKyAgICAgIHBSdW50aW1lLT5OZXdGeER5bmFtaWNPYmooQ0pTX0RvY3VtZW50OjpHZXRPYmpEZWZuSUQoKSk7CisgIGlmIChwRG9jT2JqLklzRW1wdHkoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcEZpZWxkT2JqID0KKyAgICAgIHBSdW50aW1lLT5OZXdGeER5bmFtaWNPYmooQ0pTX0ZpZWxkOjpHZXRPYmpEZWZuSUQoKSk7CisgIGlmIChwRmllbGRPYmouSXNFbXB0eSgpKQorICAgIHJldHVybiBudWxscHRyOworCisgIENKU19Eb2N1bWVudCogcEpTRG9jdW1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8Q0pTX0RvY3VtZW50Kj4ocFJ1bnRpbWUtPkdldE9iamVjdFByaXZhdGUocERvY09iaikpOworICBDSlNfRmllbGQqIHBKU0ZpZWxkID0KKyAgICAgIHN0YXRpY19jYXN0PENKU19GaWVsZCo+KHBSdW50aW1lLT5HZXRPYmplY3RQcml2YXRlKHBGaWVsZE9iaikpOworCisgIERvY3VtZW50KiBwRG9jdW1lbnQgPSBzdGF0aWNfY2FzdDxEb2N1bWVudCo+KHBKU0RvY3VtZW50LT5HZXRFbWJlZE9iamVjdCgpKTsKKyAgcERvY3VtZW50LT5TZXRGb3JtRmlsbEVudihtX3BUYXJnZXRGb3JtRmlsbEVudgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1fcFRhcmdldEZvcm1GaWxsRW52LkdldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbV9wSlNFdmVudENvbnRleHQtPkdldEZvcm1GaWxsRW52KCkpOworCisgIEZpZWxkKiBwRmllbGQgPSBzdGF0aWNfY2FzdDxGaWVsZCo+KHBKU0ZpZWxkLT5HZXRFbWJlZE9iamVjdCgpKTsKKyAgcEZpZWxkLT5BdHRhY2hGaWVsZChwRG9jdW1lbnQsIG1fc3RyU291cmNlTmFtZSk7CisgIHJldHVybiBwRmllbGQ7Cit9CisKK0ZpZWxkKiBDSlNfRXZlbnRIYW5kbGVyOjpUYXJnZXRfRmllbGQoKSB7CisgIENKU19SdW50aW1lKiBwUnVudGltZSA9IG1fcEpTRXZlbnRDb250ZXh0LT5HZXRKU1J1bnRpbWUoKTsKKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBEb2NPYmogPQorICAgICAgcFJ1bnRpbWUtPk5ld0Z4RHluYW1pY09iaihDSlNfRG9jdW1lbnQ6OkdldE9iakRlZm5JRCgpKTsKKyAgaWYgKHBEb2NPYmouSXNFbXB0eSgpKQorICAgIHJldHVybiBudWxscHRyOworCisgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwRmllbGRPYmogPQorICAgICAgcFJ1bnRpbWUtPk5ld0Z4RHluYW1pY09iaihDSlNfRmllbGQ6OkdldE9iakRlZm5JRCgpKTsKKyAgaWYgKHBGaWVsZE9iai5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQ0pTX0RvY3VtZW50KiBwSlNEb2N1bWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxDSlNfRG9jdW1lbnQqPihwUnVudGltZS0+R2V0T2JqZWN0UHJpdmF0ZShwRG9jT2JqKSk7CisgIENKU19GaWVsZCogcEpTRmllbGQgPQorICAgICAgc3RhdGljX2Nhc3Q8Q0pTX0ZpZWxkKj4ocFJ1bnRpbWUtPkdldE9iamVjdFByaXZhdGUocEZpZWxkT2JqKSk7CisKKyAgRG9jdW1lbnQqIHBEb2N1bWVudCA9IHN0YXRpY19jYXN0PERvY3VtZW50Kj4ocEpTRG9jdW1lbnQtPkdldEVtYmVkT2JqZWN0KCkpOworICBwRG9jdW1lbnQtPlNldEZvcm1GaWxsRW52KG1fcFRhcmdldEZvcm1GaWxsRW52CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbV9wVGFyZ2V0Rm9ybUZpbGxFbnYuR2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX3BKU0V2ZW50Q29udGV4dC0+R2V0Rm9ybUZpbGxFbnYoKSk7CisKKyAgRmllbGQqIHBGaWVsZCA9IHN0YXRpY19jYXN0PEZpZWxkKj4ocEpTRmllbGQtPkdldEVtYmVkT2JqZWN0KCkpOworICBwRmllbGQtPkF0dGFjaEZpZWxkKHBEb2N1bWVudCwgbV9zdHJUYXJnZXROYW1lKTsKKyAgcmV0dXJuIHBGaWVsZDsKK30KKworV2lkZVN0cmluZyYgQ0pTX0V2ZW50SGFuZGxlcjo6VmFsdWUoKSB7CisgIHJldHVybiAqbV9wVmFsdWU7Cit9CisKK2Jvb2wgQ0pTX0V2ZW50SGFuZGxlcjo6V2lsbENvbW1pdCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fYldpbGxDb21taXQ7Cit9CisKK2NvbnN0IFdpZGVTdHJpbmcmIENKU19FdmVudEhhbmRsZXI6OlRhcmdldE5hbWUoKSBjb25zdCB7CisgIHJldHVybiBtX3N0clRhcmdldE5hbWU7Cit9CmRpZmYgLS1naXQgYS9meGpzL2Nqc19ldmVudGhhbmRsZXIuaCBiL2Z4anMvY2pzX2V2ZW50aGFuZGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3Y2UxZGMKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc19ldmVudGhhbmRsZXIuaApAQCAtMCwwICsxLDE5NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfQ0pTX0VWRU5USEFORExFUl9IXworI2RlZmluZSBGWEpTX0NKU19FVkVOVEhBTkRMRVJfSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisjaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX2Zvcm1maWxsZW52aXJvbm1lbnQuaCIKKworY2xhc3MgQ0pTX0V2ZW50Q29udGV4dDsKK2NsYXNzIENQREZTREtfQW5ub3Q7CitjbGFzcyBDUERGX0Jvb2ttYXJrOworY2xhc3MgQ1BERl9Gb3JtRmllbGQ7CitjbGFzcyBGaWVsZDsKKworZW51bSBKU19FVkVOVF9UIHsKKyAgSkVUX1VOS05PV04sCisgIEpFVF9BUFBfSU5JVCwKKyAgSkVUX0RPQ19PUEVOLAorICBKRVRfRE9DX1dJTExQUklOVCwKKyAgSkVUX0RPQ19ESURQUklOVCwKKyAgSkVUX0RPQ19XSUxMU0FWRSwKKyAgSkVUX0RPQ19ESURTQVZFLAorICBKRVRfRE9DX1dJTExDTE9TRSwKKyAgSkVUX1BBR0VfT1BFTiwKKyAgSkVUX1BBR0VfQ0xPU0UsCisgIEpFVF9QQUdFX0lOVklFVywKKyAgSkVUX1BBR0VfT1VUVklFVywKKyAgSkVUX0ZJRUxEX01PVVNFRE9XTiwKKyAgSkVUX0ZJRUxEX01PVVNFVVAsCisgIEpFVF9GSUVMRF9NT1VTRUVOVEVSLAorICBKRVRfRklFTERfTU9VU0VFWElULAorICBKRVRfRklFTERfRk9DVVMsCisgIEpFVF9GSUVMRF9CTFVSLAorICBKRVRfRklFTERfS0VZU1RST0tFLAorICBKRVRfRklFTERfVkFMSURBVEUsCisgIEpFVF9GSUVMRF9DQUxDVUxBVEUsCisgIEpFVF9GSUVMRF9GT1JNQVQsCisgIEpFVF9TQ1JFRU5fRk9DVVMsCisgIEpFVF9TQ1JFRU5fQkxVUiwKKyAgSkVUX1NDUkVFTl9PUEVOLAorICBKRVRfU0NSRUVOX0NMT1NFLAorICBKRVRfU0NSRUVOX01PVVNFRE9XTiwKKyAgSkVUX1NDUkVFTl9NT1VTRVVQLAorICBKRVRfU0NSRUVOX01PVVNFRU5URVIsCisgIEpFVF9TQ1JFRU5fTU9VU0VFWElULAorICBKRVRfU0NSRUVOX0lOVklFVywKKyAgSkVUX1NDUkVFTl9PVVRWSUVXLAorICBKRVRfQkFUQ0hfRVhFQywKKyAgSkVUX01FTlVfRVhFQywKKyAgSkVUX0NPTlNPTEVfRVhFQywKKyAgSkVUX0VYVEVSTkFMX0VYRUMsCisgIEpFVF9CT09LTUFSS19NT1VTRVVQLAorICBKRVRfTElOS19NT1VTRVVQCit9OworCitjbGFzcyBDSlNfRXZlbnRIYW5kbGVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKU19FdmVudEhhbmRsZXIoQ0pTX0V2ZW50Q29udGV4dCogcENvbnRleHQpOworICB2aXJ0dWFsIH5DSlNfRXZlbnRIYW5kbGVyKCk7CisKKyAgdm9pZCBPbkFwcF9Jbml0KCk7CisKKyAgdm9pZCBPbkRvY19PcGVuKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAorICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgc3RyVGFyZ2V0TmFtZSk7CisgIHZvaWQgT25Eb2NfV2lsbFByaW50KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KTsKKyAgdm9pZCBPbkRvY19EaWRQcmludChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudik7CisgIHZvaWQgT25Eb2NfV2lsbFNhdmUoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpOworICB2b2lkIE9uRG9jX0RpZFNhdmUoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpOworICB2b2lkIE9uRG9jX1dpbGxDbG9zZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudik7CisKKyAgdm9pZCBPblBhZ2VfT3BlbihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudik7CisgIHZvaWQgT25QYWdlX0Nsb3NlKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KTsKKyAgdm9pZCBPblBhZ2VfSW5WaWV3KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KTsKKyAgdm9pZCBPblBhZ2VfT3V0VmlldyhDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudik7CisKKyAgdm9pZCBPbkZpZWxkX0NhbGN1bGF0ZShDUERGX0Zvcm1GaWVsZCogcFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiUmMpOworICB2b2lkIE9uRmllbGRfRm9ybWF0KENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYldpbGxDb21taXQpOworICB2b2lkIE9uRmllbGRfS2V5c3Ryb2tlKFdpZGVTdHJpbmcmIHN0ckNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEtleURvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50JiBuU2VsRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgblNlbFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYldpbGxDb21taXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmllbGRGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJSYyk7CisgIHZvaWQgT25GaWVsZF9WYWxpZGF0ZShXaWRlU3RyaW5nJiBzdHJDaGFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYktleURvd24sCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJSYyk7CisKKyAgdm9pZCBPbkZpZWxkX01vdXNlRG93bihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KTsKKyAgdm9pZCBPbkZpZWxkX01vdXNlRW50ZXIoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCk7CisgIHZvaWQgT25GaWVsZF9Nb3VzZUV4aXQoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCk7CisgIHZvaWQgT25GaWVsZF9Nb3VzZVVwKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpOworICB2b2lkIE9uRmllbGRfQmx1cihib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBWYWx1ZSk7CisgIHZvaWQgT25GaWVsZF9Gb2N1cyhib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBWYWx1ZSk7CisKKyAgdm9pZCBPblNjcmVlbl9Gb2N1cyhib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworICB2b2lkIE9uU2NyZWVuX0JsdXIoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKyAgdm9pZCBPblNjcmVlbl9PcGVuKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisgIHZvaWQgT25TY3JlZW5fQ2xvc2UoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKyAgdm9pZCBPblNjcmVlbl9Nb3VzZURvd24oYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKyAgdm9pZCBPblNjcmVlbl9Nb3VzZVVwKGJvb2wgYk1vZGlmaWVyLCBib29sIGJTaGlmdCwgQ1BERlNES19Bbm5vdCogcFNjcmVlbik7CisgIHZvaWQgT25TY3JlZW5fTW91c2VFbnRlcihib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworICB2b2lkIE9uU2NyZWVuX01vdXNlRXhpdChib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworICB2b2lkIE9uU2NyZWVuX0luVmlldyhib29sIGJNb2RpZmllciwgYm9vbCBiU2hpZnQsIENQREZTREtfQW5ub3QqIHBTY3JlZW4pOworICB2b2lkIE9uU2NyZWVuX091dFZpZXcoYm9vbCBiTW9kaWZpZXIsIGJvb2wgYlNoaWZ0LCBDUERGU0RLX0Fubm90KiBwU2NyZWVuKTsKKworICB2b2lkIE9uQm9va21hcmtfTW91c2VVcChDUERGX0Jvb2ttYXJrKiBwQm9va01hcmspOworICB2b2lkIE9uTGlua19Nb3VzZVVwKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KTsKKworICB2b2lkIE9uTWVudV9FeGVjKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHN0clRhcmdldE5hbWUpOworICB2b2lkIE9uQmF0Y2hFeGVjKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KTsKKyAgdm9pZCBPbkNvbnNvbGVfRXhlYygpOworICB2b2lkIE9uRXh0ZXJuYWxfRXhlYygpOworCisgIHZvaWQgSW5pdGlhbChKU19FVkVOVF9UIHR5cGUpOworICB2b2lkIERlc3Ryb3koKTsKKyAgYm9vbCBJc1ZhbGlkKCkgY29uc3Q7CisKKyAgV2lkZVN0cmluZyYgQ2hhbmdlKCk7CisgIGNvbnN0IFdpZGVTdHJpbmcmIENoYW5nZUV4KCk7CisgIGludCBDb21taXRLZXkoKSBjb25zdDsKKyAgYm9vbCBGaWVsZEZ1bGwoKSBjb25zdDsKKyAgYm9vbCBLZXlEb3duKCkgY29uc3Q7CisgIGJvb2wgTW9kaWZpZXIoKSBjb25zdDsKKyAgY29uc3Qgd2NoYXJfdCogTmFtZSgpIGNvbnN0OworICBjb25zdCB3Y2hhcl90KiBUeXBlKCkgY29uc3Q7CisgIGJvb2wmIFJjKCk7CisgIGludCBTZWxFbmQoKSBjb25zdDsKKyAgaW50IFNlbFN0YXJ0KCkgY29uc3Q7CisgIHZvaWQgU2V0U2VsRW5kKGludCB2YWx1ZSk7CisgIHZvaWQgU2V0U2VsU3RhcnQoaW50IHZhbHVlKTsKKyAgYm9vbCBTaGlmdCgpIGNvbnN0OworICBGaWVsZCogU291cmNlKCk7CisgIEZpZWxkKiBUYXJnZXRfRmllbGQoKTsKKyAgV2lkZVN0cmluZyYgVmFsdWUoKTsKKyAgYm9vbCBXaWxsQ29tbWl0KCkgY29uc3Q7CisgIGNvbnN0IFdpZGVTdHJpbmcmIFRhcmdldE5hbWUoKSBjb25zdDsKKworICBKU19FVkVOVF9UIEV2ZW50VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fZUV2ZW50VHlwZTsgfQorCisgIFVub3duZWRQdHI8Q0pTX0V2ZW50Q29udGV4dD4gY29uc3QgbV9wSlNFdmVudENvbnRleHQ7CisgIEpTX0VWRU5UX1QgbV9lRXZlbnRUeXBlOworICBib29sIG1fYlZhbGlkOworCisgIFdpZGVTdHJpbmcgbV9zdHJUYXJnZXROYW1lOworICBXaWRlU3RyaW5nIG1fc3RyU291cmNlTmFtZTsKKyAgVW5vd25lZFB0cjxXaWRlU3RyaW5nPiBtX3BXaWRlU3RyQ2hhbmdlOworICBXaWRlU3RyaW5nIG1fV2lkZVN0ckNoYW5nZUR1OworICBXaWRlU3RyaW5nIG1fV2lkZVN0ckNoYW5nZUV4OworICBpbnQgbV9uQ29tbWl0S2V5OworICBib29sIG1fYktleURvd247CisgIGJvb2wgbV9iTW9kaWZpZXI7CisgIGJvb2wgbV9iU2hpZnQ7CisgIGludCogbV9wSVNlbEVuZDsKKyAgaW50IG1fblNlbEVuZER1OworICBpbnQqIG1fcElTZWxTdGFydDsKKyAgaW50IG1fblNlbFN0YXJ0RHU7CisgIGJvb2wgbV9iV2lsbENvbW1pdDsKKyAgVW5vd25lZFB0cjxXaWRlU3RyaW5nPiBtX3BWYWx1ZTsKKyAgYm9vbCBtX2JGaWVsZEZ1bGw7CisgIGJvb2wqIG1fcGJSYzsKKyAgYm9vbCBtX2JSY0R1OworCisgIFVub3duZWRQdHI8Q1BERl9Cb29rbWFyaz4gbV9wVGFyZ2V0Qm9va01hcms7CisgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6T2JzZXJ2ZWRQdHIgbV9wVGFyZ2V0Rm9ybUZpbGxFbnY7CisgIENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyIG1fcFRhcmdldEFubm90OworfTsKKworI2VuZGlmICAvLyBGWEpTX0NKU19FVkVOVEhBTkRMRVJfSF8KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX2ZpZWxkLmNwcCBiL2Z4anMvY2pzX2ZpZWxkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjA2YmUwCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfZmllbGQuY3BwCkBAIC0wLDAgKzEsMjY3MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy9janNfZmllbGQuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2ZvbnQuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9mb3JtZmllbGQuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9pbnRlcmZvcm0uaCIKKyNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfaW50ZXJmb3JtLmgiCisjaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX3BhZ2V2aWV3LmgiCisjaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX3dpZGdldC5oIgorI2luY2x1ZGUgImZ4anMvY2pzX2NvbG9yLmgiCisjaW5jbHVkZSAiZnhqcy9janNfZGVsYXlkYXRhLmgiCisjaW5jbHVkZSAiZnhqcy9janNfZG9jdW1lbnQuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19pY29uLmgiCisjaW5jbHVkZSAiZnhqcy9qc19yZXNvdXJjZXMuaCIKKworbmFtZXNwYWNlIHsKKworYm9vbCBTZXRXaWRnZXREaXNwbGF5U3RhdHVzKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0LCBpbnQgdmFsdWUpIHsKKyAgaWYgKCFwV2lkZ2V0KQorICAgIHJldHVybiBmYWxzZTsKKworICB1aW50MzJfdCBkd0ZsYWcgPSBwV2lkZ2V0LT5HZXRGbGFncygpOworICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgY2FzZSAwOgorICAgICAgZHdGbGFnICY9IH5BTk5PVEZMQUdfSU5WSVNJQkxFOworICAgICAgZHdGbGFnICY9IH5BTk5PVEZMQUdfSElEREVOOworICAgICAgZHdGbGFnICY9IH5BTk5PVEZMQUdfTk9WSUVXOworICAgICAgZHdGbGFnIHw9IEFOTk9URkxBR19QUklOVDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIGR3RmxhZyAmPSB+QU5OT1RGTEFHX0lOVklTSUJMRTsKKyAgICAgIGR3RmxhZyAmPSB+QU5OT1RGTEFHX05PVklFVzsKKyAgICAgIGR3RmxhZyB8PSAoQU5OT1RGTEFHX0hJRERFTiB8IEFOTk9URkxBR19QUklOVCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICBkd0ZsYWcgJj0gfkFOTk9URkxBR19JTlZJU0lCTEU7CisgICAgICBkd0ZsYWcgJj0gfkFOTk9URkxBR19QUklOVDsKKyAgICAgIGR3RmxhZyAmPSB+QU5OT1RGTEFHX0hJRERFTjsKKyAgICAgIGR3RmxhZyAmPSB+QU5OT1RGTEFHX05PVklFVzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIGR3RmxhZyB8PSBBTk5PVEZMQUdfTk9WSUVXOworICAgICAgZHdGbGFnIHw9IEFOTk9URkxBR19QUklOVDsKKyAgICAgIGR3RmxhZyAmPSB+QU5OT1RGTEFHX0hJRERFTjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgaWYgKGR3RmxhZyAhPSBwV2lkZ2V0LT5HZXRGbGFncygpKSB7CisgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFnKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIENKU19GaWVsZDo6UHJvcGVydHlTcGVjc1tdID0geworICAgIHsiYWxpZ25tZW50IiwgZ2V0X2FsaWdubWVudF9zdGF0aWMsIHNldF9hbGlnbm1lbnRfc3RhdGljfSwKKyAgICB7ImJvcmRlclN0eWxlIiwgZ2V0X2JvcmRlcl9zdHlsZV9zdGF0aWMsIHNldF9ib3JkZXJfc3R5bGVfc3RhdGljfSwKKyAgICB7ImJ1dHRvbkFsaWduWCIsIGdldF9idXR0b25fYWxpZ25feF9zdGF0aWMsIHNldF9idXR0b25fYWxpZ25feF9zdGF0aWN9LAorICAgIHsiYnV0dG9uQWxpZ25ZIiwgZ2V0X2J1dHRvbl9hbGlnbl95X3N0YXRpYywgc2V0X2J1dHRvbl9hbGlnbl95X3N0YXRpY30sCisgICAgeyJidXR0b25GaXRCb3VuZHMiLCBnZXRfYnV0dG9uX2ZpdF9ib3VuZHNfc3RhdGljLAorICAgICBzZXRfYnV0dG9uX2ZpdF9ib3VuZHNfc3RhdGljfSwKKyAgICB7ImJ1dHRvblBvc2l0aW9uIiwgZ2V0X2J1dHRvbl9wb3NpdGlvbl9zdGF0aWMsIHNldF9idXR0b25fcG9zaXRpb25fc3RhdGljfSwKKyAgICB7ImJ1dHRvblNjYWxlSG93IiwgZ2V0X2J1dHRvbl9zY2FsZV9ob3dfc3RhdGljLAorICAgICBzZXRfYnV0dG9uX3NjYWxlX2hvd19zdGF0aWN9LAorICAgIHsiYnV0dG9uU2NhbGVXaGVuIiwgZ2V0X2J1dHRvbl9zY2FsZV93aGVuX3N0YXRpYywKKyAgICAgc2V0X2J1dHRvbl9zY2FsZV93aGVuX3N0YXRpY30sCisgICAgeyJjYWxjT3JkZXJJbmRleCIsIGdldF9jYWxjX29yZGVyX2luZGV4X3N0YXRpYywKKyAgICAgc2V0X2NhbGNfb3JkZXJfaW5kZXhfc3RhdGljfSwKKyAgICB7ImNoYXJMaW1pdCIsIGdldF9jaGFyX2xpbWl0X3N0YXRpYywgc2V0X2NoYXJfbGltaXRfc3RhdGljfSwKKyAgICB7ImNvbWIiLCBnZXRfY29tYl9zdGF0aWMsIHNldF9jb21iX3N0YXRpY30sCisgICAgeyJjb21taXRPblNlbENoYW5nZSIsIGdldF9jb21taXRfb25fc2VsX2NoYW5nZV9zdGF0aWMsCisgICAgIHNldF9jb21taXRfb25fc2VsX2NoYW5nZV9zdGF0aWN9LAorICAgIHsiY3VycmVudFZhbHVlSW5kaWNlcyIsIGdldF9jdXJyZW50X3ZhbHVlX2luZGljZXNfc3RhdGljLAorICAgICBzZXRfY3VycmVudF92YWx1ZV9pbmRpY2VzX3N0YXRpY30sCisgICAgeyJkZWZhdWx0U3R5bGUiLCBnZXRfZGVmYXVsdF9zdHlsZV9zdGF0aWMsIHNldF9kZWZhdWx0X3N0eWxlX3N0YXRpY30sCisgICAgeyJkZWZhdWx0VmFsdWUiLCBnZXRfZGVmYXVsdF92YWx1ZV9zdGF0aWMsIHNldF9kZWZhdWx0X3ZhbHVlX3N0YXRpY30sCisgICAgeyJkb05vdFNjcm9sbCIsIGdldF9kb19ub3Rfc2Nyb2xsX3N0YXRpYywgc2V0X2RvX25vdF9zY3JvbGxfc3RhdGljfSwKKyAgICB7ImRvTm90U3BlbGxDaGVjayIsIGdldF9kb19ub3Rfc3BlbGxfY2hlY2tfc3RhdGljLAorICAgICBzZXRfZG9fbm90X3NwZWxsX2NoZWNrX3N0YXRpY30sCisgICAgeyJkZWxheSIsIGdldF9kZWxheV9zdGF0aWMsIHNldF9kZWxheV9zdGF0aWN9LAorICAgIHsiZGlzcGxheSIsIGdldF9kaXNwbGF5X3N0YXRpYywgc2V0X2Rpc3BsYXlfc3RhdGljfSwKKyAgICB7ImRvYyIsIGdldF9kb2Nfc3RhdGljLCBzZXRfZG9jX3N0YXRpY30sCisgICAgeyJlZGl0YWJsZSIsIGdldF9lZGl0YWJsZV9zdGF0aWMsIHNldF9lZGl0YWJsZV9zdGF0aWN9LAorICAgIHsiZXhwb3J0VmFsdWVzIiwgZ2V0X2V4cG9ydF92YWx1ZXNfc3RhdGljLCBzZXRfZXhwb3J0X3ZhbHVlc19zdGF0aWN9LAorICAgIHsiaGlkZGVuIiwgZ2V0X2hpZGRlbl9zdGF0aWMsIHNldF9oaWRkZW5fc3RhdGljfSwKKyAgICB7ImZpbGVTZWxlY3QiLCBnZXRfZmlsZV9zZWxlY3Rfc3RhdGljLCBzZXRfZmlsZV9zZWxlY3Rfc3RhdGljfSwKKyAgICB7ImZpbGxDb2xvciIsIGdldF9maWxsX2NvbG9yX3N0YXRpYywgc2V0X2ZpbGxfY29sb3Jfc3RhdGljfSwKKyAgICB7ImxpbmVXaWR0aCIsIGdldF9saW5lX3dpZHRoX3N0YXRpYywgc2V0X2xpbmVfd2lkdGhfc3RhdGljfSwKKyAgICB7ImhpZ2hsaWdodCIsIGdldF9oaWdobGlnaHRfc3RhdGljLCBzZXRfaGlnaGxpZ2h0X3N0YXRpY30sCisgICAgeyJtdWx0aWxpbmUiLCBnZXRfbXVsdGlsaW5lX3N0YXRpYywgc2V0X211bHRpbGluZV9zdGF0aWN9LAorICAgIHsibXVsdGlwbGVTZWxlY3Rpb24iLCBnZXRfbXVsdGlwbGVfc2VsZWN0aW9uX3N0YXRpYywKKyAgICAgc2V0X211bHRpcGxlX3NlbGVjdGlvbl9zdGF0aWN9LAorICAgIHsibmFtZSIsIGdldF9uYW1lX3N0YXRpYywgc2V0X25hbWVfc3RhdGljfSwKKyAgICB7Im51bUl0ZW1zIiwgZ2V0X251bV9pdGVtc19zdGF0aWMsIHNldF9udW1faXRlbXNfc3RhdGljfSwKKyAgICB7InBhZ2UiLCBnZXRfcGFnZV9zdGF0aWMsIHNldF9wYWdlX3N0YXRpY30sCisgICAgeyJwYXNzd29yZCIsIGdldF9wYXNzd29yZF9zdGF0aWMsIHNldF9wYXNzd29yZF9zdGF0aWN9LAorICAgIHsicHJpbnQiLCBnZXRfcHJpbnRfc3RhdGljLCBzZXRfcHJpbnRfc3RhdGljfSwKKyAgICB7InJhZGlvc0luVW5pc29uIiwgZ2V0X3JhZGlvc19pbl91bmlzb25fc3RhdGljLAorICAgICBzZXRfcmFkaW9zX2luX3VuaXNvbl9zdGF0aWN9LAorICAgIHsicmVhZG9ubHkiLCBnZXRfcmVhZG9ubHlfc3RhdGljLCBzZXRfcmVhZG9ubHlfc3RhdGljfSwKKyAgICB7InJlY3QiLCBnZXRfcmVjdF9zdGF0aWMsIHNldF9yZWN0X3N0YXRpY30sCisgICAgeyJyZXF1aXJlZCIsIGdldF9yZXF1aXJlZF9zdGF0aWMsIHNldF9yZXF1aXJlZF9zdGF0aWN9LAorICAgIHsicmljaFRleHQiLCBnZXRfcmljaF90ZXh0X3N0YXRpYywgc2V0X3JpY2hfdGV4dF9zdGF0aWN9LAorICAgIHsicmljaFZhbHVlIiwgZ2V0X3JpY2hfdmFsdWVfc3RhdGljLCBzZXRfcmljaF92YWx1ZV9zdGF0aWN9LAorICAgIHsicm90YXRpb24iLCBnZXRfcm90YXRpb25fc3RhdGljLCBzZXRfcm90YXRpb25fc3RhdGljfSwKKyAgICB7InN0cm9rZUNvbG9yIiwgZ2V0X3N0cm9rZV9jb2xvcl9zdGF0aWMsIHNldF9zdHJva2VfY29sb3Jfc3RhdGljfSwKKyAgICB7InN0eWxlIiwgZ2V0X3N0eWxlX3N0YXRpYywgc2V0X3N0eWxlX3N0YXRpY30sCisgICAgeyJzdWJtaXROYW1lIiwgZ2V0X3N1Ym1pdF9uYW1lX3N0YXRpYywgc2V0X3N1Ym1pdF9uYW1lX3N0YXRpY30sCisgICAgeyJ0ZXh0Q29sb3IiLCBnZXRfdGV4dF9jb2xvcl9zdGF0aWMsIHNldF90ZXh0X2NvbG9yX3N0YXRpY30sCisgICAgeyJ0ZXh0Rm9udCIsIGdldF90ZXh0X2ZvbnRfc3RhdGljLCBzZXRfdGV4dF9mb250X3N0YXRpY30sCisgICAgeyJ0ZXh0U2l6ZSIsIGdldF90ZXh0X3NpemVfc3RhdGljLCBzZXRfdGV4dF9zaXplX3N0YXRpY30sCisgICAgeyJ0eXBlIiwgZ2V0X3R5cGVfc3RhdGljLCBzZXRfdHlwZV9zdGF0aWN9LAorICAgIHsidXNlck5hbWUiLCBnZXRfdXNlcl9uYW1lX3N0YXRpYywgc2V0X3VzZXJfbmFtZV9zdGF0aWN9LAorICAgIHsidmFsdWUiLCBnZXRfdmFsdWVfc3RhdGljLCBzZXRfdmFsdWVfc3RhdGljfSwKKyAgICB7InZhbHVlQXNTdHJpbmciLCBnZXRfdmFsdWVfYXNfc3RyaW5nX3N0YXRpYywgc2V0X3ZhbHVlX2FzX3N0cmluZ19zdGF0aWN9LAorICAgIHsic291cmNlIiwgZ2V0X3NvdXJjZV9zdGF0aWMsIHNldF9zb3VyY2Vfc3RhdGljfX07CisKK2NvbnN0IEpTTWV0aG9kU3BlYyBDSlNfRmllbGQ6Ok1ldGhvZFNwZWNzW10gPSB7CisgICAgeyJicm93c2VGb3JGaWxlVG9TdWJtaXQiLCBicm93c2VGb3JGaWxlVG9TdWJtaXRfc3RhdGljfSwKKyAgICB7ImJ1dHRvbkdldENhcHRpb24iLCBidXR0b25HZXRDYXB0aW9uX3N0YXRpY30sCisgICAgeyJidXR0b25HZXRJY29uIiwgYnV0dG9uR2V0SWNvbl9zdGF0aWN9LAorICAgIHsiYnV0dG9uSW1wb3J0SWNvbiIsIGJ1dHRvbkltcG9ydEljb25fc3RhdGljfSwKKyAgICB7ImJ1dHRvblNldENhcHRpb24iLCBidXR0b25TZXRDYXB0aW9uX3N0YXRpY30sCisgICAgeyJidXR0b25TZXRJY29uIiwgYnV0dG9uU2V0SWNvbl9zdGF0aWN9LAorICAgIHsiY2hlY2tUaGlzQm94IiwgY2hlY2tUaGlzQm94X3N0YXRpY30sCisgICAgeyJjbGVhckl0ZW1zIiwgY2xlYXJJdGVtc19zdGF0aWN9LAorICAgIHsiZGVmYXVsdElzQ2hlY2tlZCIsIGRlZmF1bHRJc0NoZWNrZWRfc3RhdGljfSwKKyAgICB7ImRlbGV0ZUl0ZW1BdCIsIGRlbGV0ZUl0ZW1BdF9zdGF0aWN9LAorICAgIHsiZ2V0QXJyYXkiLCBnZXRBcnJheV9zdGF0aWN9LAorICAgIHsiZ2V0SXRlbUF0IiwgZ2V0SXRlbUF0X3N0YXRpY30sCisgICAgeyJnZXRMb2NrIiwgZ2V0TG9ja19zdGF0aWN9LAorICAgIHsiaW5zZXJ0SXRlbUF0IiwgaW5zZXJ0SXRlbUF0X3N0YXRpY30sCisgICAgeyJpc0JveENoZWNrZWQiLCBpc0JveENoZWNrZWRfc3RhdGljfSwKKyAgICB7ImlzRGVmYXVsdENoZWNrZWQiLCBpc0RlZmF1bHRDaGVja2VkX3N0YXRpY30sCisgICAgeyJzZXRBY3Rpb24iLCBzZXRBY3Rpb25fc3RhdGljfSwKKyAgICB7InNldEZvY3VzIiwgc2V0Rm9jdXNfc3RhdGljfSwKKyAgICB7InNldEl0ZW1zIiwgc2V0SXRlbXNfc3RhdGljfSwKKyAgICB7InNldExvY2siLCBzZXRMb2NrX3N0YXRpY30sCisgICAgeyJzaWduYXR1cmVHZXRNb2RpZmljYXRpb25zIiwgc2lnbmF0dXJlR2V0TW9kaWZpY2F0aW9uc19zdGF0aWN9LAorICAgIHsic2lnbmF0dXJlR2V0U2VlZFZhbHVlIiwgc2lnbmF0dXJlR2V0U2VlZFZhbHVlX3N0YXRpY30sCisgICAgeyJzaWduYXR1cmVJbmZvIiwgc2lnbmF0dXJlSW5mb19zdGF0aWN9LAorICAgIHsic2lnbmF0dXJlU2V0U2VlZFZhbHVlIiwgc2lnbmF0dXJlU2V0U2VlZFZhbHVlX3N0YXRpY30sCisgICAgeyJzaWduYXR1cmVTaWduIiwgc2lnbmF0dXJlU2lnbl9zdGF0aWN9LAorICAgIHsic2lnbmF0dXJlVmFsaWRhdGUiLCBzaWduYXR1cmVWYWxpZGF0ZV9zdGF0aWN9fTsKKworaW50IENKU19GaWVsZDo6T2JqRGVmbklEID0gLTE7CisKKy8vIHN0YXRpYworaW50IENKU19GaWVsZDo6R2V0T2JqRGVmbklEKCkgeworICByZXR1cm4gT2JqRGVmbklEOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0pTX0ZpZWxkOjpEZWZpbmVKU09iamVjdHMoQ0ZYSlNfRW5naW5lKiBwRW5naW5lKSB7CisgIE9iakRlZm5JRCA9IHBFbmdpbmUtPkRlZmluZU9iaigiRmllbGQiLCBGWEpTT0JKVFlQRV9EWU5BTUlDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNDb25zdHJ1Y3RvcjxDSlNfRmllbGQsIEZpZWxkPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTRGVzdHJ1Y3RvcjxDSlNfRmllbGQ+KTsKKyAgRGVmaW5lUHJvcHMocEVuZ2luZSwgT2JqRGVmbklELCBQcm9wZXJ0eVNwZWNzLCBGWF9BcnJheVNpemUoUHJvcGVydHlTcGVjcykpOworICBEZWZpbmVNZXRob2RzKHBFbmdpbmUsIE9iakRlZm5JRCwgTWV0aG9kU3BlY3MsIEZYX0FycmF5U2l6ZShNZXRob2RTcGVjcykpOworfQorCit2b2lkIENKU19GaWVsZDo6SW5pdEluc3RhbmNlKElKU19SdW50aW1lKiBwSVJ1bnRpbWUpIHt9CisKK0ZpZWxkOjpGaWVsZChDSlNfT2JqZWN0KiBwSlNPYmplY3QpCisgICAgOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KSwKKyAgICAgIG1fcEpTRG9jKG51bGxwdHIpLAorICAgICAgbV9wRm9ybUZpbGxFbnYobnVsbHB0ciksCisgICAgICBtX25Gb3JtQ29udHJvbEluZGV4KC0xKSwKKyAgICAgIG1fYkNhblNldChmYWxzZSksCisgICAgICBtX2JEZWxheShmYWxzZSkge30KKworRmllbGQ6On5GaWVsZCgpIHt9CisKKy8vIG5vdGU6IGlDb250cm9sTm8gPSAtMSwgbWVhbnMgbm90IGEgd2lkZ2V0Lgordm9pZCBGaWVsZDo6UGFyc2VGaWVsZE5hbWUoY29uc3Qgc3RkOjp3c3RyaW5nJiBzdHJGaWVsZE5hbWVQYXJzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OndzdHJpbmcmIHN0ckZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCYgaUNvbnRyb2xObykgeworICBpbnQgaVN0YXJ0ID0gc3RyRmllbGROYW1lUGFyc2VkLmZpbmRfbGFzdF9vZihMJy4nKTsKKyAgaWYgKGlTdGFydCA9PSAtMSkgeworICAgIHN0ckZpZWxkTmFtZSA9IHN0ckZpZWxkTmFtZVBhcnNlZDsKKyAgICBpQ29udHJvbE5vID0gLTE7CisgICAgcmV0dXJuOworICB9CisgIHN0ZDo6d3N0cmluZyBzdWZmaXhhbCA9IHN0ckZpZWxkTmFtZVBhcnNlZC5zdWJzdHIoaVN0YXJ0ICsgMSk7CisgIGlDb250cm9sTm8gPSBGWFNZU193dG9pKHN1ZmZpeGFsLmNfc3RyKCkpOworICBpZiAoaUNvbnRyb2xObyA9PSAwKSB7CisgICAgaW50IGlTcGFjZVN0YXJ0OworICAgIHdoaWxlICgoaVNwYWNlU3RhcnQgPSBzdWZmaXhhbC5maW5kX2xhc3Rfb2YoTCIgIikpICE9IC0xKSB7CisgICAgICBzdWZmaXhhbC5lcmFzZShpU3BhY2VTdGFydCwgMSk7CisgICAgfQorCisgICAgaWYgKHN1ZmZpeGFsLmNvbXBhcmUoTCIwIikgIT0gMCkgeworICAgICAgc3RyRmllbGROYW1lID0gc3RyRmllbGROYW1lUGFyc2VkOworICAgICAgaUNvbnRyb2xObyA9IC0xOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBzdHJGaWVsZE5hbWUgPSBzdHJGaWVsZE5hbWVQYXJzZWQuc3Vic3RyKDAsIGlTdGFydCk7Cit9CisKK2Jvb2wgRmllbGQ6OkF0dGFjaEZpZWxkKERvY3VtZW50KiBwRG9jdW1lbnQsIGNvbnN0IFdpZGVTdHJpbmcmIGNzRmllbGROYW1lKSB7CisgIG1fcEpTRG9jID0gcERvY3VtZW50OworICBtX3BGb3JtRmlsbEVudi5SZXNldChwRG9jdW1lbnQtPkdldEZvcm1GaWxsRW52KCkpOworICBtX2JDYW5TZXQgPSBtX3BGb3JtRmlsbEVudi0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fRklMTF9GT1JNKSB8fAorICAgICAgICAgICAgICBtX3BGb3JtRmlsbEVudi0+R2V0UGVybWlzc2lvbnMoRlBERlBFUk1fQU5OT1RfRk9STSkgfHwKKyAgICAgICAgICAgICAgbV9wRm9ybUZpbGxFbnYtPkdldFBlcm1pc3Npb25zKEZQREZQRVJNX01PRElGWSk7CisKKyAgQ1BERlNES19JbnRlckZvcm0qIHBSREludGVyRm9ybSA9IG1fcEZvcm1GaWxsRW52LT5HZXRJbnRlckZvcm0oKTsKKyAgQ1BERl9JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBwUkRJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOworICBXaWRlU3RyaW5nIHN3RmllbGROYW1lVGVtcCA9IGNzRmllbGROYW1lOworICBzd0ZpZWxkTmFtZVRlbXAuUmVwbGFjZShMIi4uIiwgTCIuIik7CisKKyAgaWYgKHBJbnRlckZvcm0tPkNvdW50RmllbGRzKHN3RmllbGROYW1lVGVtcCkgPD0gMCkgeworICAgIHN0ZDo6d3N0cmluZyBzdHJGaWVsZE5hbWU7CisgICAgaW50IGlDb250cm9sTm8gPSAtMTsKKyAgICBQYXJzZUZpZWxkTmFtZShzd0ZpZWxkTmFtZVRlbXAuY19zdHIoKSwgc3RyRmllbGROYW1lLCBpQ29udHJvbE5vKTsKKyAgICBpZiAoaUNvbnRyb2xObyA9PSAtMSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIG1fRmllbGROYW1lID0gc3RyRmllbGROYW1lLmNfc3RyKCk7CisgICAgbV9uRm9ybUNvbnRyb2xJbmRleCA9IGlDb250cm9sTm87CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBtX0ZpZWxkTmFtZSA9IHN3RmllbGROYW1lVGVtcDsKKyAgbV9uRm9ybUNvbnRyb2xJbmRleCA9IC0xOworCisgIHJldHVybiB0cnVlOworfQorCitzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkOjpHZXRGb3JtRmllbGRzKAorICAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAorICAgIGNvbnN0IFdpZGVTdHJpbmcmIGNzRmllbGROYW1lKSB7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gZmllbGRzOworICBDUERGU0RLX0ludGVyRm9ybSogcFJlYWRlckludGVyRm9ybSA9IHBGb3JtRmlsbEVudi0+R2V0SW50ZXJGb3JtKCk7CisgIENQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFJlYWRlckludGVyRm9ybS0+R2V0SW50ZXJGb3JtKCk7CisgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBJbnRlckZvcm0tPkNvdW50RmllbGRzKGNzRmllbGROYW1lKTsgaSA8IHN6OyArK2kpIHsKKyAgICBpZiAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBwSW50ZXJGb3JtLT5HZXRGaWVsZChpLCBjc0ZpZWxkTmFtZSkpCisgICAgICBmaWVsZHMucHVzaF9iYWNrKHBGb3JtRmllbGQpOworICB9CisgIHJldHVybiBmaWVsZHM7Cit9CisKK3N0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGQ6OkdldEZvcm1GaWVsZHMoCisgICAgY29uc3QgV2lkZVN0cmluZyYgY3NGaWVsZE5hbWUpIGNvbnN0IHsKKyAgcmV0dXJuIEZpZWxkOjpHZXRGb3JtRmllbGRzKG1fcEZvcm1GaWxsRW52LkdldCgpLCBjc0ZpZWxkTmFtZSk7Cit9CisKK3ZvaWQgRmllbGQ6OlVwZGF0ZUZvcm1GaWVsZChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJDaGFuZ2VNYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJlc2V0QVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmVmcmVzaCkgeworICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IHBGb3JtRmlsbEVudi0+R2V0SW50ZXJGb3JtKCk7CisKKyAgaWYgKGJSZXNldEFQKSB7CisgICAgc3RkOjp2ZWN0b3I8Q1BERlNES19Bbm5vdDo6T2JzZXJ2ZWRQdHI+IHdpZGdldHM7CisgICAgcEludGVyRm9ybS0+R2V0V2lkZ2V0cyhwRm9ybUZpZWxkLCAmd2lkZ2V0cyk7CisKKyAgICBGb3JtRmllbGRUeXBlIGZpZWxkVHlwZSA9IHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpOworICAgIGlmIChmaWVsZFR5cGUgPT0gRm9ybUZpZWxkVHlwZTo6a0NvbWJvQm94IHx8CisgICAgICAgIGZpZWxkVHlwZSA9PSBGb3JtRmllbGRUeXBlOjprVGV4dEZpZWxkKSB7CisgICAgICBmb3IgKGF1dG8mIHBPYnNlcnZlZCA6IHdpZGdldHMpIHsKKyAgICAgICAgaWYgKHBPYnNlcnZlZCkgeworICAgICAgICAgIGJvb2wgYkZvcm1hdHRlZCA9IGZhbHNlOworICAgICAgICAgIFdpZGVTdHJpbmcgc1ZhbHVlID0gc3RhdGljX2Nhc3Q8Q1BERlNES19XaWRnZXQqPihwT2JzZXJ2ZWQuR2V0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5PbkZvcm1hdChiRm9ybWF0dGVkKTsKKyAgICAgICAgICBpZiAocE9ic2VydmVkKSB7ICAvLyBOb3QgcmVkdW5kYW50LCBtYXkgYmUgY2xvYmJlcmVkIGJ5IE9uRm9ybWF0LgorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1BERlNES19XaWRnZXQqPihwT2JzZXJ2ZWQuR2V0KCkpCisgICAgICAgICAgICAgICAgLT5SZXNldEFwcGVhcmFuY2UoYkZvcm1hdHRlZCA/ICZzVmFsdWUgOiBudWxscHRyLCBmYWxzZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoYXV0byYgcE9ic2VydmVkIDogd2lkZ2V0cykgeworICAgICAgICBpZiAocE9ic2VydmVkKSB7CisgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1BERlNES19XaWRnZXQqPihwT2JzZXJ2ZWQuR2V0KCkpCisgICAgICAgICAgICAgIC0+UmVzZXRBcHBlYXJhbmNlKG51bGxwdHIsIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChiUmVmcmVzaCkgeworICAgIC8vIFJlZnJlc2ggdGhlIHdpZGdldCBsaXN0LiBUaGUgY2FsbHMgaW4gfGJSZXNldEFQfCBtYXkgaGF2ZSBjYXVzZWQgd2lkZ2V0cworICAgIC8vIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gV2UgbmVlZCB0byBjYWxsIHxHZXRXaWRnZXRzfCBhZ2FpbiB0byBiZQorICAgIC8vIHN1cmUgbm9uZSBvZiB0aGUgd2lkZ2V0cyBoYXZlIGJlZW4gZGVsZXRlZC4KKyAgICBzdGQ6OnZlY3RvcjxDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0cj4gd2lkZ2V0czsKKyAgICBwSW50ZXJGb3JtLT5HZXRXaWRnZXRzKHBGb3JtRmllbGQsICZ3aWRnZXRzKTsKKworICAgIC8vIFRPRE8oZHNpbmNsYWlyKTogRGV0ZXJtaW5lIGlmIGFsbCB3aWRnZXRzIHNoYXJlIHRoZSBzYW1lCisgICAgLy8gQ1BERlNES19JbnRlckZvcm0uIElmIHRoYXQncyB0aGUgY2FzZSwgd2UgY2FuIG1vdmUgdGhlIGNvZGUgdG8KKyAgICAvLyB8R2V0Rm9ybUZpbGxFbnZ8IG91dCBvZiB0aGUgbG9vcC4KKyAgICBmb3IgKGF1dG8mIHBPYnNlcnZlZCA6IHdpZGdldHMpIHsKKyAgICAgIGlmIChwT2JzZXJ2ZWQpIHsKKyAgICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBzdGF0aWNfY2FzdDxDUERGU0RLX1dpZGdldCo+KHBPYnNlcnZlZC5HZXQoKSk7CisgICAgICAgIHBXaWRnZXQtPkdldEludGVyRm9ybSgpLT5HZXRGb3JtRmlsbEVudigpLT5VcGRhdGVBbGxWaWV3cyhudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdpZGdldCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGJDaGFuZ2VNYXJrKQorICAgIHBGb3JtRmlsbEVudi0+U2V0Q2hhbmdlTWFyaygpOworfQorCit2b2lkIEZpZWxkOjpVcGRhdGVGb3JtQ29udHJvbChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNoYW5nZU1hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZXNldEFQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmVmcmVzaCkgeworICBBU1NFUlQocEZvcm1Db250cm9sKTsKKworICBDUERGU0RLX0ludGVyRm9ybSogcEZvcm0gPSBwRm9ybUZpbGxFbnYtPkdldEludGVyRm9ybSgpOworICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBGb3JtLT5HZXRXaWRnZXQocEZvcm1Db250cm9sKTsKKworICBpZiAocFdpZGdldCkgeworICAgIENQREZTREtfV2lkZ2V0OjpPYnNlcnZlZFB0ciBvYnNlcnZlZF93aWRnZXQocFdpZGdldCk7CisgICAgaWYgKGJSZXNldEFQKSB7CisgICAgICBGb3JtRmllbGRUeXBlIGZpZWxkVHlwZSA9IHBXaWRnZXQtPkdldEZpZWxkVHlwZSgpOworICAgICAgaWYgKGZpZWxkVHlwZSA9PSBGb3JtRmllbGRUeXBlOjprQ29tYm9Cb3ggfHwKKyAgICAgICAgICBmaWVsZFR5cGUgPT0gRm9ybUZpZWxkVHlwZTo6a1RleHRGaWVsZCkgeworICAgICAgICBib29sIGJGb3JtYXR0ZWQgPSBmYWxzZTsKKyAgICAgICAgV2lkZVN0cmluZyBzVmFsdWUgPSBwV2lkZ2V0LT5PbkZvcm1hdChiRm9ybWF0dGVkKTsKKyAgICAgICAgaWYgKCFvYnNlcnZlZF93aWRnZXQpCisgICAgICAgICAgcmV0dXJuOworICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UoYkZvcm1hdHRlZCA/ICZzVmFsdWUgOiBudWxscHRyLCBmYWxzZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwV2lkZ2V0LT5SZXNldEFwcGVhcmFuY2UobnVsbHB0ciwgZmFsc2UpOworICAgICAgfQorICAgICAgaWYgKCFvYnNlcnZlZF93aWRnZXQpCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYlJlZnJlc2gpIHsKKyAgICAgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFdpZGdldC0+R2V0SW50ZXJGb3JtKCk7CisgICAgICBwSW50ZXJGb3JtLT5HZXRGb3JtRmlsbEVudigpLT5VcGRhdGVBbGxWaWV3cyhudWxscHRyLCBwV2lkZ2V0KTsKKyAgICB9CisgIH0KKworICBpZiAoYkNoYW5nZU1hcmspCisgICAgcEZvcm1GaWxsRW52LT5TZXRDaGFuZ2VNYXJrKCk7Cit9CisKK0NQREZTREtfV2lkZ2V0KiBGaWVsZDo6R2V0V2lkZ2V0KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sKSB7CisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0KKyAgICAgIHN0YXRpY19jYXN0PENQREZTREtfSW50ZXJGb3JtKj4ocEZvcm1GaWxsRW52LT5HZXRJbnRlckZvcm0oKSk7CisgIHJldHVybiBwSW50ZXJGb3JtID8gcEludGVyRm9ybS0+R2V0V2lkZ2V0KHBGb3JtQ29udHJvbCkgOiBudWxscHRyOworfQorCitib29sIEZpZWxkOjpWYWx1ZUlzT2NjdXIoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQsIFdpZGVTdHJpbmcgY3NPcHRMYWJlbCkgeworICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBpZiAoY3NPcHRMYWJlbC5Db21wYXJlKHBGb3JtRmllbGQtPkdldE9wdGlvbkxhYmVsKGkpKSA9PSAwKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK0NQREZfRm9ybUNvbnRyb2wqIEZpZWxkOjpHZXRTbWFydEZpZWxkQ29udHJvbChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCkgeworICBpZiAoIXBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSB8fAorICAgICAgbV9uRm9ybUNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIGlmIChtX25Gb3JtQ29udHJvbEluZGV4IDwgMCkKKyAgICByZXR1cm4gcEZvcm1GaWVsZC0+R2V0Q29udHJvbCgwKTsKKyAgcmV0dXJuIHBGb3JtRmllbGQtPkdldENvbnRyb2wobV9uRm9ybUNvbnRyb2xJbmRleCk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OmdldF9hbGlnbm1lbnQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIEFTU0VSVChtX3BGb3JtRmlsbEVudik7CisKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZvcm1GaWVsZFR5cGU6OmtUZXh0RmllbGQpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOworICBpZiAoIXBGb3JtQ29udHJvbCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgc3dpdGNoIChwRm9ybUNvbnRyb2wtPkdldENvbnRyb2xBbGlnbm1lbnQoKSkgeworICAgIGNhc2UgMDoKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcoTCJsZWZ0IikpOworICAgIGNhc2UgMToKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcoTCJjZW50ZXIiKSk7CisgICAgY2FzZSAyOgorICAgICAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1N0cmluZyhMInJpZ2h0IikpOworICB9CisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcoTCIiKSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF9hbGlnbm1lbnQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOworICByZXR1cm4gQ0pTX1JldHVybihtX2JDYW5TZXQpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpnZXRfYm9yZGVyX3N0eWxlKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOworCisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIGlmICghcEZvcm1GaWVsZCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPQorICAgICAgR2V0V2lkZ2V0KG1fcEZvcm1GaWxsRW52LkdldCgpLCBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKSk7CisgIGlmICghcFdpZGdldCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgc3dpdGNoIChwV2lkZ2V0LT5HZXRCb3JkZXJTdHlsZSgpKSB7CisgICAgY2FzZSBCb3JkZXJTdHlsZTo6U09MSUQ6CisgICAgICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3U3RyaW5nKEwic29saWQiKSk7CisgICAgY2FzZSBCb3JkZXJTdHlsZTo6REFTSDoKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcoTCJkYXNoZWQiKSk7CisgICAgY2FzZSBCb3JkZXJTdHlsZTo6QkVWRUxFRDoKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcoTCJiZXZlbGVkIikpOworICAgIGNhc2UgQm9yZGVyU3R5bGU6OklOU0VUOgorICAgICAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1N0cmluZyhMImluc2V0IikpOworICAgIGNhc2UgQm9yZGVyU3R5bGU6OlVOREVSTElORToKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcoTCJ1bmRlcmxpbmUiKSk7CisgIH0KKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1N0cmluZyhMIiIpKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6c2V0X2JvcmRlcl9zdHlsZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIEFTU0VSVChtX3BGb3JtRmlsbEVudik7CisKKyAgaWYgKCFtX2JDYW5TZXQpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIEJ5dGVTdHJpbmcgYnl0ZV9zdHIgPSBCeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwUnVudGltZS0+VG9XaWRlU3RyaW5nKHZwKSk7CisgIGlmIChtX2JEZWxheSkgeworICAgIEFkZERlbGF5X1N0cmluZyhGUF9CT1JERVJTVFlMRSwgYnl0ZV9zdHIpOworICB9IGVsc2UgeworICAgIEZpZWxkOjpTZXRCb3JkZXJTdHlsZShtX3BGb3JtRmlsbEVudi5HZXQoKSwgbV9GaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbkZvcm1Db250cm9sSW5kZXgsIGJ5dGVfc3RyKTsKKyAgfQorICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKwordm9pZCBGaWVsZDo6U2V0Qm9yZGVyU3R5bGUoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgc3RyaW5nKSB7CisgIEFTU0VSVChwRm9ybUZpbGxFbnYpOworCisgIEJvcmRlclN0eWxlIG5Cb3JkZXJTdHlsZSA9IEJvcmRlclN0eWxlOjpTT0xJRDsKKyAgaWYgKHN0cmluZyA9PSAic29saWQiKQorICAgIG5Cb3JkZXJTdHlsZSA9IEJvcmRlclN0eWxlOjpTT0xJRDsKKyAgZWxzZSBpZiAoc3RyaW5nID09ICJiZXZlbGVkIikKKyAgICBuQm9yZGVyU3R5bGUgPSBCb3JkZXJTdHlsZTo6QkVWRUxFRDsKKyAgZWxzZSBpZiAoc3RyaW5nID09ICJkYXNoZWQiKQorICAgIG5Cb3JkZXJTdHlsZSA9IEJvcmRlclN0eWxlOjpEQVNIOworICBlbHNlIGlmIChzdHJpbmcgPT0gImluc2V0IikKKyAgICBuQm9yZGVyU3R5bGUgPSBCb3JkZXJTdHlsZTo6SU5TRVQ7CisgIGVsc2UgaWYgKHN0cmluZyA9PSAidW5kZXJsaW5lIikKKyAgICBuQm9yZGVyU3R5bGUgPSBCb3JkZXJTdHlsZTo6VU5ERVJMSU5FOworICBlbHNlCisgICAgcmV0dXJuOworCisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9CisgICAgICBHZXRGb3JtRmllbGRzKHBGb3JtRmlsbEVudiwgc3dGaWVsZE5hbWUpOworICBmb3IgKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkIDogRmllbGRBcnJheSkgeworICAgIGlmIChuQ29udHJvbEluZGV4IDwgMCkgeworICAgICAgYm9vbCBiU2V0ID0gZmFsc2U7CisgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGkgPCBzejsgKytpKSB7CisgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9CisgICAgICAgICAgICAgICAgR2V0V2lkZ2V0KHBGb3JtRmlsbEVudiwgcEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKSkpIHsKKyAgICAgICAgICBpZiAocFdpZGdldC0+R2V0Qm9yZGVyU3R5bGUoKSAhPSBuQm9yZGVyU3R5bGUpIHsKKyAgICAgICAgICAgIHBXaWRnZXQtPlNldEJvcmRlclN0eWxlKG5Cb3JkZXJTdHlsZSk7CisgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChiU2V0KQorICAgICAgICBVcGRhdGVGb3JtRmllbGQocEZvcm1GaWxsRW52LCBwRm9ybUZpZWxkLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKG5Db250cm9sSW5kZXggPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKQorICAgICAgICByZXR1cm47CisgICAgICBpZiAoQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0KKyAgICAgICAgICAgICAgcEZvcm1GaWVsZC0+R2V0Q29udHJvbChuQ29udHJvbEluZGV4KSkgeworICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBHZXRXaWRnZXQocEZvcm1GaWxsRW52LCBwRm9ybUNvbnRyb2wpKSB7CisgICAgICAgICAgaWYgKHBXaWRnZXQtPkdldEJvcmRlclN0eWxlKCkgIT0gbkJvcmRlclN0eWxlKSB7CisgICAgICAgICAgICBwV2lkZ2V0LT5TZXRCb3JkZXJTdHlsZShuQm9yZGVyU3R5bGUpOworICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocEZvcm1GaWxsRW52LCBwRm9ybUNvbnRyb2wsIHRydWUsIHRydWUsIHRydWUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCitDSlNfUmV0dXJuIEZpZWxkOjpnZXRfYnV0dG9uX2FsaWduX3goQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIEFTU0VSVChtX3BGb3JtRmlsbEVudik7CisKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZvcm1GaWVsZFR5cGU6OmtQdXNoQnV0dG9uKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgaWYgKCFwRm9ybUNvbnRyb2wpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfSWNvbkZpdCBJY29uRml0ID0gcEZvcm1Db250cm9sLT5HZXRJY29uRml0KCk7CisKKyAgZmxvYXQgZkxlZnQ7CisgIGZsb2F0IGZCb3R0b207CisgIEljb25GaXQuR2V0SWNvblBvc2l0aW9uKGZMZWZ0LCBmQm90dG9tKTsKKworICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3TnVtYmVyKHN0YXRpY19jYXN0PGludDMyX3Q+KGZMZWZ0KSkpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpzZXRfYnV0dG9uX2FsaWduX3goQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIEFTU0VSVChtX3BGb3JtRmlsbEVudik7CisgIHJldHVybiBDSlNfUmV0dXJuKG1fYkNhblNldCk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OmdldF9idXR0b25fYWxpZ25feShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKKworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRm9ybUZpZWxkVHlwZTo6a1B1c2hCdXR0b24pCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOworICBpZiAoIXBGb3JtQ29udHJvbCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERl9JY29uRml0IEljb25GaXQgPSBwRm9ybUNvbnRyb2wtPkdldEljb25GaXQoKTsKKworICBmbG9hdCBmTGVmdDsKKyAgZmxvYXQgZkJvdHRvbTsKKyAgSWNvbkZpdC5HZXRJY29uUG9zaXRpb24oZkxlZnQsIGZCb3R0b20pOworCisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdOdW1iZXIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oZkJvdHRvbSkpKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6c2V0X2J1dHRvbl9hbGlnbl95KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOworICByZXR1cm4gQ0pTX1JldHVybihtX2JDYW5TZXQpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpnZXRfYnV0dG9uX2ZpdF9ib3VuZHMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIEFTU0VSVChtX3BGb3JtRmlsbEVudik7CisKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZvcm1GaWVsZFR5cGU6OmtQdXNoQnV0dG9uKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgaWYgKCFwRm9ybUNvbnRyb2wpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIHJldHVybiBDSlNfUmV0dXJuKAorICAgICAgcFJ1bnRpbWUtPk5ld0Jvb2xlYW4ocEZvcm1Db250cm9sLT5HZXRJY29uRml0KCkuR2V0Rml0dGluZ0JvdW5kcygpKSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF9idXR0b25fZml0X2JvdW5kcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKKyAgcmV0dXJuIENKU19SZXR1cm4obV9iQ2FuU2V0KTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6Z2V0X2J1dHRvbl9wb3NpdGlvbihDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKKworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRm9ybUZpZWxkVHlwZTo6a1B1c2hCdXR0b24pCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOworICBpZiAoIXBGb3JtQ29udHJvbCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld051bWJlcihwRm9ybUNvbnRyb2wtPkdldFRleHRQb3NpdGlvbigpKSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF9idXR0b25fcG9zaXRpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOworICByZXR1cm4gQ0pTX1JldHVybihtX2JDYW5TZXQpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpnZXRfYnV0dG9uX3NjYWxlX2hvdyhDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKKworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRm9ybUZpZWxkVHlwZTo6a1B1c2hCdXR0b24pCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOworICBpZiAoIXBGb3JtQ29udHJvbCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld0Jvb2xlYW4oCisgICAgICBwRm9ybUNvbnRyb2wtPkdldEljb25GaXQoKS5Jc1Byb3BvcnRpb25hbFNjYWxlKCkgPyAwIDogMSkpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpzZXRfYnV0dG9uX3NjYWxlX2hvdyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOworICByZXR1cm4gQ0pTX1JldHVybihtX2JDYW5TZXQpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpnZXRfYnV0dG9uX3NjYWxlX3doZW4oQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIEFTU0VSVChtX3BGb3JtRmlsbEVudik7CisKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZvcm1GaWVsZFR5cGU6OmtQdXNoQnV0dG9uKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgaWYgKCFwRm9ybUNvbnRyb2wpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfSWNvbkZpdCBJY29uRml0ID0gcEZvcm1Db250cm9sLT5HZXRJY29uRml0KCk7CisgIGludCBTY2FsZU0gPSBJY29uRml0LkdldFNjYWxlTWV0aG9kKCk7CisgIHN3aXRjaCAoU2NhbGVNKSB7CisgICAgY2FzZSBDUERGX0ljb25GaXQ6OkFsd2F5czoKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKAorICAgICAgICAgIHBSdW50aW1lLT5OZXdOdW1iZXIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oQ1BERl9JY29uRml0OjpBbHdheXMpKSk7CisgICAgY2FzZSBDUERGX0ljb25GaXQ6OkJpZ2dlcjoKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKAorICAgICAgICAgIHBSdW50aW1lLT5OZXdOdW1iZXIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oQ1BERl9JY29uRml0OjpCaWdnZXIpKSk7CisgICAgY2FzZSBDUERGX0ljb25GaXQ6Ok5ldmVyOgorICAgICAgcmV0dXJuIENKU19SZXR1cm4oCisgICAgICAgICAgcFJ1bnRpbWUtPk5ld051bWJlcihzdGF0aWNfY2FzdDxpbnQzMl90PihDUERGX0ljb25GaXQ6Ok5ldmVyKSkpOworICAgIGNhc2UgQ1BERl9JY29uRml0OjpTbWFsbGVyOgorICAgICAgcmV0dXJuIENKU19SZXR1cm4oCisgICAgICAgICAgcFJ1bnRpbWUtPk5ld051bWJlcihzdGF0aWNfY2FzdDxpbnQzMl90PihDUERGX0ljb25GaXQ6OlNtYWxsZXIpKSk7CisgIH0KKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF9idXR0b25fc2NhbGVfd2hlbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKKyAgcmV0dXJuIENKU19SZXR1cm4obV9iQ2FuU2V0KTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6Z2V0X2NhbGNfb3JkZXJfaW5kZXgoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIEFTU0VSVChtX3BGb3JtRmlsbEVudik7CisKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZvcm1GaWVsZFR5cGU6OmtDb21ib0JveCAmJgorICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRm9ybUZpZWxkVHlwZTo6a1RleHRGaWVsZCkgeworICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKyAgfQorCisgIENQREZTREtfSW50ZXJGb3JtKiBwUkRJbnRlckZvcm0gPSBtX3BGb3JtRmlsbEVudi0+R2V0SW50ZXJGb3JtKCk7CisgIENQREZfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gcFJESW50ZXJGb3JtLT5HZXRJbnRlckZvcm0oKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld051bWJlcihzdGF0aWNfY2FzdDxpbnQzMl90PigKKyAgICAgIHBJbnRlckZvcm0tPkZpbmRGaWVsZEluQ2FsY3VsYXRpb25PcmRlcihwRm9ybUZpZWxkKSkpKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6c2V0X2NhbGNfb3JkZXJfaW5kZXgoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKKyAgcmV0dXJuIENKU19SZXR1cm4obV9iQ2FuU2V0KTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6Z2V0X2NoYXJfbGltaXQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIEFTU0VSVChtX3BGb3JtRmlsbEVudik7CisKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZvcm1GaWVsZFR5cGU6OmtUZXh0RmllbGQpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworICByZXR1cm4gQ0pTX1JldHVybigKKyAgICAgIHBSdW50aW1lLT5OZXdOdW1iZXIoc3RhdGljX2Nhc3Q8aW50MzJfdD4ocEZvcm1GaWVsZC0+R2V0TWF4TGVuKCkpKSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF9jaGFyX2xpbWl0KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIEFTU0VSVChtX3BGb3JtRmlsbEVudik7CisgIHJldHVybiBDSlNfUmV0dXJuKG1fYkNhblNldCk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OmdldF9jb21iKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOworCisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGb3JtRmllbGRUeXBlOjprVGV4dEZpZWxkKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICByZXR1cm4gQ0pTX1JldHVybigKKyAgICAgIHBSdW50aW1lLT5OZXdCb29sZWFuKCEhKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19DT01CKSkpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpzZXRfY29tYihDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIEFTU0VSVChtX3BGb3JtRmlsbEVudik7CisgIHJldHVybiBDSlNfUmV0dXJuKG1fYkNhblNldCk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OmdldF9jb21taXRfb25fc2VsX2NoYW5nZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKKworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRm9ybUZpZWxkVHlwZTo6a0NvbWJvQm94ICYmCisgICAgICBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGb3JtRmllbGRUeXBlOjprTGlzdEJveCkgeworICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKyAgfQorCisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdCb29sZWFuKAorICAgICAgISEocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0NPTU1JVE9OU0VMQ0hBTkdFKSkpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpzZXRfY29tbWl0X29uX3NlbF9jaGFuZ2UoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIEFTU0VSVChtX3BGb3JtRmlsbEVudik7CisgIHJldHVybiBDSlNfUmV0dXJuKG1fYkNhblNldCk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OmdldF9jdXJyZW50X3ZhbHVlX2luZGljZXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGb3JtRmllbGRUeXBlOjprQ29tYm9Cb3ggJiYKKyAgICAgIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZvcm1GaWVsZFR5cGU6OmtMaXN0Qm94KSB7CisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworICB9CisKKyAgaW50IGNvdW50ID0gcEZvcm1GaWVsZC0+Q291bnRTZWxlY3RlZEl0ZW1zKCk7CisgIGlmIChjb3VudCA8PSAwKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdOdW1iZXIoLTEpKTsKKyAgaWYgKGNvdW50ID09IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld051bWJlcihwRm9ybUZpZWxkLT5HZXRTZWxlY3RlZEluZGV4KDApKSk7CisKKyAgdjg6OkxvY2FsPHY4OjpBcnJheT4gU2VsQXJyYXkgPSBwUnVudGltZS0+TmV3QXJyYXkoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgcFJ1bnRpbWUtPlB1dEFycmF5RWxlbWVudCgKKyAgICAgICAgU2VsQXJyYXksIGksIHBSdW50aW1lLT5OZXdOdW1iZXIocEZvcm1GaWVsZC0+R2V0U2VsZWN0ZWRJbmRleChpKSkpOworICB9CisgIGlmIChTZWxBcnJheS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld0FycmF5KCkpOworICByZXR1cm4gQ0pTX1JldHVybihTZWxBcnJheSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF9jdXJyZW50X3ZhbHVlX2luZGljZXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICBpZiAoIW1fYkNhblNldCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGFycmF5OworICBpZiAodnAtPklzTnVtYmVyKCkpIHsKKyAgICBhcnJheS5wdXNoX2JhY2socFJ1bnRpbWUtPlRvSW50MzIodnApKTsKKyAgfSBlbHNlIGlmICghdnAuSXNFbXB0eSgpICYmIHZwLT5Jc0FycmF5KCkpIHsKKyAgICB2ODo6TG9jYWw8djg6OkFycmF5PiBTZWxBcnJheSA9IHBSdW50aW1lLT5Ub0FycmF5KHZwKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBSdW50aW1lLT5HZXRBcnJheUxlbmd0aChTZWxBcnJheSk7IGkrKykgeworICAgICAgYXJyYXkucHVzaF9iYWNrKAorICAgICAgICAgIHBSdW50aW1lLT5Ub0ludDMyKHBSdW50aW1lLT5HZXRBcnJheUVsZW1lbnQoU2VsQXJyYXksIGkpKSk7CisgICAgfQorICB9CisKKyAgaWYgKG1fYkRlbGF5KSB7CisgICAgQWRkRGVsYXlfV29yZEFycmF5KEZQX0NVUlJFTlRWQUxVRUlORElDRVMsIGFycmF5KTsKKyAgfSBlbHNlIHsKKyAgICBGaWVsZDo6U2V0Q3VycmVudFZhbHVlSW5kaWNlcyhtX3BGb3JtRmlsbEVudi5HZXQoKSwgbV9GaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uRm9ybUNvbnRyb2xJbmRleCwgYXJyYXkpOworICB9CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCit2b2lkIEZpZWxkOjpTZXRDdXJyZW50VmFsdWVJbmRpY2VzKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYXJyYXkpIHsKKyAgQVNTRVJUKHBGb3JtRmlsbEVudik7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9CisgICAgICBHZXRGb3JtRmllbGRzKHBGb3JtRmlsbEVudiwgc3dGaWVsZE5hbWUpOworCisgIGZvciAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgOiBGaWVsZEFycmF5KSB7CisgICAgRm9ybUZpZWxkVHlwZSBmaWVsZFR5cGUgPSBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKTsKKyAgICBpZiAoZmllbGRUeXBlID09IEZvcm1GaWVsZFR5cGU6OmtDb21ib0JveCB8fAorICAgICAgICBmaWVsZFR5cGUgPT0gRm9ybUZpZWxkVHlwZTo6a0xpc3RCb3gpIHsKKyAgICAgIHVpbnQzMl90IGR3RmllbGRGbGFncyA9IHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKTsKKyAgICAgIHBGb3JtRmllbGQtPkNsZWFyU2VsZWN0aW9uKHRydWUpOworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcnJheS5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoaSAhPSAwICYmICEoZHdGaWVsZEZsYWdzICYgKDEgPDwgMjEpKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKGFycmF5W2ldIDwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHBGb3JtRmllbGQtPkNvdW50T3B0aW9ucygpKSAmJgorICAgICAgICAgICAgIXBGb3JtRmllbGQtPklzSXRlbVNlbGVjdGVkKGFycmF5W2ldKSkgeworICAgICAgICAgIHBGb3JtRmllbGQtPlNldEl0ZW1TZWxlY3Rpb24oYXJyYXlbaV0sIHRydWUpOworICAgICAgICB9CisgICAgICB9CisgICAgICBVcGRhdGVGb3JtRmllbGQocEZvcm1GaWxsRW52LCBwRm9ybUZpZWxkLCB0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICB9CisgIH0KK30KKworQ0pTX1JldHVybiBGaWVsZDo6Z2V0X2RlZmF1bHRfc3R5bGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6c2V0X2RlZmF1bHRfc3R5bGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpnZXRfZGVmYXVsdF92YWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKKworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRm9ybUZpZWxkVHlwZTo6a1B1c2hCdXR0b24gfHwKKyAgICAgIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZvcm1GaWVsZFR5cGU6OmtTaWduYXR1cmUpIHsKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisgIH0KKworICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3U3RyaW5nKHBGb3JtRmllbGQtPkdldERlZmF1bHRWYWx1ZSgpLmNfc3RyKCkpKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6c2V0X2RlZmF1bHRfdmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKKyAgcmV0dXJuIENKU19SZXR1cm4obV9iQ2FuU2V0KTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6Z2V0X2RvX25vdF9zY3JvbGwoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIEFTU0VSVChtX3BGb3JtRmlsbEVudik7CisKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZvcm1GaWVsZFR5cGU6OmtUZXh0RmllbGQpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdCb29sZWFuKAorICAgICAgISEocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0RPTk9UU0NST0xMKSkpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpzZXRfZG9fbm90X3Njcm9sbChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOworICByZXR1cm4gQ0pTX1JldHVybihtX2JDYW5TZXQpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpnZXRfZG9fbm90X3NwZWxsX2NoZWNrKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOworCisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGb3JtRmllbGRUeXBlOjprVGV4dEZpZWxkICYmCisgICAgICBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGb3JtRmllbGRUeXBlOjprQ29tYm9Cb3gpIHsKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisgIH0KKworICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3Qm9vbGVhbigKKyAgICAgICEhKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19ET05PVFNQRUxMQ0hFQ0spKSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF9kb19ub3Rfc3BlbGxfY2hlY2soQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOworICByZXR1cm4gQ0pTX1JldHVybihtX2JDYW5TZXQpOworfQorCit2b2lkIEZpZWxkOjpTZXREZWxheShib29sIGJEZWxheSkgeworICBtX2JEZWxheSA9IGJEZWxheTsKKworICBpZiAobV9iRGVsYXkpCisgICAgcmV0dXJuOworICBpZiAobV9wSlNEb2MpCisgICAgbV9wSlNEb2MtPkRvRmllbGREZWxheShtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OmdldF9kZWxheShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld0Jvb2xlYW4obV9iRGVsYXkpKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6c2V0X2RlbGF5KENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgaWYgKCFtX2JDYW5TZXQpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIFNldERlbGF5KHBSdW50aW1lLT5Ub0Jvb2xlYW4odnApKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OmdldF9kaXNwbGF5KENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBBU1NFUlQocEZvcm1GaWVsZCk7CisKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBtX3BGb3JtRmlsbEVudi0+R2V0SW50ZXJGb3JtKCk7CisgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0KKyAgICAgIHBJbnRlckZvcm0tPkdldFdpZGdldChHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKSk7CisgIGlmICghcFdpZGdldCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgdWludDMyX3QgZHdGbGFnID0gcFdpZGdldC0+R2V0RmxhZ3MoKTsKKyAgaWYgKEFOTk9URkxBR19JTlZJU0lCTEUgJiBkd0ZsYWcgfHwgQU5OT1RGTEFHX0hJRERFTiAmIGR3RmxhZykKKyAgICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3TnVtYmVyKDEpKTsKKworICBpZiAoQU5OT1RGTEFHX1BSSU5UICYgZHdGbGFnKSB7CisgICAgaWYgKEFOTk9URkxBR19OT1ZJRVcgJiBkd0ZsYWcpCisgICAgICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3TnVtYmVyKDMpKTsKKyAgICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3TnVtYmVyKDApKTsKKyAgfQorICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3TnVtYmVyKDIpKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6c2V0X2Rpc3BsYXkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICBpZiAoIW1fYkNhblNldCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgaWYgKG1fYkRlbGF5KSB7CisgICAgQWRkRGVsYXlfSW50KEZQX0RJU1BMQVksIHBSdW50aW1lLT5Ub0ludDMyKHZwKSk7CisgIH0gZWxzZSB7CisgICAgRmllbGQ6OlNldERpc3BsYXkobV9wRm9ybUZpbGxFbnYuR2V0KCksIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIHBSdW50aW1lLT5Ub0ludDMyKHZwKSk7CisgIH0KKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK3ZvaWQgRmllbGQ6OlNldERpc3BsYXkoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcikgeworICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IHBGb3JtRmlsbEVudi0+R2V0SW50ZXJGb3JtKCk7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9CisgICAgICBHZXRGb3JtRmllbGRzKHBGb3JtRmlsbEVudiwgc3dGaWVsZE5hbWUpOworICBmb3IgKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkIDogRmllbGRBcnJheSkgeworICAgIGlmIChuQ29udHJvbEluZGV4IDwgMCkgeworICAgICAgYm9vbCBiQW55U2V0ID0gZmFsc2U7CisgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGkgPCBzejsgKytpKSB7CisgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woaSk7CisgICAgICAgIEFTU0VSVChwRm9ybUNvbnRyb2wpOworCisgICAgICAgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KHBGb3JtQ29udHJvbCk7CisgICAgICAgIGlmIChTZXRXaWRnZXREaXNwbGF5U3RhdHVzKHBXaWRnZXQsIG51bWJlcikpCisgICAgICAgICAgYkFueVNldCA9IHRydWU7CisgICAgICB9CisKKyAgICAgIGlmIChiQW55U2V0KQorICAgICAgICBVcGRhdGVGb3JtRmllbGQocEZvcm1GaWxsRW52LCBwRm9ybUZpZWxkLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChuQ29udHJvbEluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG5Db250cm9sSW5kZXgpOworICAgICAgaWYgKCFwRm9ybUNvbnRyb2wpCisgICAgICAgIHJldHVybjsKKworICAgICAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1Db250cm9sKTsKKyAgICAgIGlmIChTZXRXaWRnZXREaXNwbGF5U3RhdHVzKHBXaWRnZXQsIG51bWJlcikpCisgICAgICAgIFVwZGF0ZUZvcm1Db250cm9sKHBGb3JtRmlsbEVudiwgcEZvcm1Db250cm9sLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgfQorICB9Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OmdldF9kb2MoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKG1fcEpTRG9jLT5HZXRDSlNEb2MoKS0+VG9WOE9iamVjdCgpKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6c2V0X2RvYyhDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6Z2V0X2VkaXRhYmxlKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRm9ybUZpZWxkVHlwZTo6a0NvbWJvQm94KQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICByZXR1cm4gQ0pTX1JldHVybigKKyAgICAgIHBSdW50aW1lLT5OZXdCb29sZWFuKCEhKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19FRElUKSkpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpzZXRfZWRpdGFibGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gQ0pTX1JldHVybihtX2JDYW5TZXQpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpnZXRfZXhwb3J0X3ZhbHVlcyhDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZvcm1GaWVsZFR5cGU6OmtDaGVja0JveCAmJgorICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRm9ybUZpZWxkVHlwZTo6a1JhZGlvQnV0dG9uKSB7CisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworICB9CisKKyAgdjg6OkxvY2FsPHY4OjpBcnJheT4gRXhwb3J0VmFsdWVzQXJyYXkgPSBwUnVudGltZS0+TmV3QXJyYXkoKTsKKyAgaWYgKG1fbkZvcm1Db250cm9sSW5kZXggPCAwKSB7CisgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBpIDwgc3o7IGkrKykgeworICAgICAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gcEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKTsKKyAgICAgIHBSdW50aW1lLT5QdXRBcnJheUVsZW1lbnQoCisgICAgICAgICAgRXhwb3J0VmFsdWVzQXJyYXksIGksCisgICAgICAgICAgcFJ1bnRpbWUtPk5ld1N0cmluZyhwRm9ybUNvbnRyb2wtPkdldEV4cG9ydFZhbHVlKCkuY19zdHIoKSkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAobV9uRm9ybUNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCisgICAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPQorICAgICAgICBwRm9ybUZpZWxkLT5HZXRDb250cm9sKG1fbkZvcm1Db250cm9sSW5kZXgpOworICAgIGlmICghcEZvcm1Db250cm9sKQorICAgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgICAgcFJ1bnRpbWUtPlB1dEFycmF5RWxlbWVudCgKKyAgICAgICAgRXhwb3J0VmFsdWVzQXJyYXksIDAsCisgICAgICAgIHBSdW50aW1lLT5OZXdTdHJpbmcocEZvcm1Db250cm9sLT5HZXRFeHBvcnRWYWx1ZSgpLmNfc3RyKCkpKTsKKyAgfQorICByZXR1cm4gQ0pTX1JldHVybihFeHBvcnRWYWx1ZXNBcnJheSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF9leHBvcnRfdmFsdWVzKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGb3JtRmllbGRUeXBlOjprQ2hlY2tCb3ggJiYKKyAgICAgIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZvcm1GaWVsZFR5cGU6OmtSYWRpb0J1dHRvbikgeworICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKyAgfQorCisgIHJldHVybiBDSlNfUmV0dXJuKG1fYkNhblNldCAmJiAhdnAuSXNFbXB0eSgpICYmIHZwLT5Jc0FycmF5KCkpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpnZXRfZmlsZV9zZWxlY3QoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGb3JtRmllbGRUeXBlOjprVGV4dEZpZWxkKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3Qm9vbGVhbigKKyAgICAgICEhKHBGb3JtRmllbGQtPkdldEZpZWxkRmxhZ3MoKSAmIEZJRUxERkxBR19GSUxFU0VMRUNUKSkpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpzZXRfZmlsZV9zZWxlY3QoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGb3JtRmllbGRUeXBlOjprVGV4dEZpZWxkKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKyAgcmV0dXJuIENKU19SZXR1cm4obV9iQ2FuU2V0KTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6Z2V0X2ZpbGxfY29sb3IoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIEFTU0VSVChwRm9ybUZpZWxkKTsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7CisgIGlmICghcEZvcm1Db250cm9sKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBpbnQgaUNvbG9yVHlwZTsKKyAgcEZvcm1Db250cm9sLT5HZXRCYWNrZ3JvdW5kQ29sb3IoaUNvbG9yVHlwZSk7CisKKyAgQ0ZYX0NvbG9yIGNvbG9yOworICBpZiAoaUNvbG9yVHlwZSA9PSBDRlhfQ29sb3I6OmtUcmFuc3BhcmVudCkgeworICAgIGNvbG9yID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a1RyYW5zcGFyZW50KTsKKyAgfSBlbHNlIGlmIChpQ29sb3JUeXBlID09IENGWF9Db2xvcjo6a0dyYXkpIHsKKyAgICBjb2xvciA9IENGWF9Db2xvcihDRlhfQ29sb3I6OmtHcmF5LAorICAgICAgICAgICAgICAgICAgICAgIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoMCkpOworICB9IGVsc2UgaWYgKGlDb2xvclR5cGUgPT0gQ0ZYX0NvbG9yOjprUkdCKSB7CisgICAgY29sb3IgPQorICAgICAgICBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprUkdCLCBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKDApLAorICAgICAgICAgICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcigxKSwKKyAgICAgICAgICAgICAgICAgIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoMikpOworICB9IGVsc2UgaWYgKGlDb2xvclR5cGUgPT0gQ0ZYX0NvbG9yOjprQ01ZSykgeworICAgIGNvbG9yID0KKyAgICAgICAgQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0NNWUssIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoMCksCisgICAgICAgICAgICAgICAgICBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQmFja2dyb3VuZENvbG9yKDEpLAorICAgICAgICAgICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJhY2tncm91bmRDb2xvcigyKSwKKyAgICAgICAgICAgICAgICAgIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCYWNrZ3JvdW5kQ29sb3IoMykpOworICB9IGVsc2UgeworICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKyAgfQorCisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGFycmF5ID0gY29sb3I6OkNvbnZlcnRQV0xDb2xvclRvQXJyYXkocFJ1bnRpbWUsIGNvbG9yKTsKKyAgaWYgKGFycmF5LklzRW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3QXJyYXkoKSk7CisgIHJldHVybiBDSlNfUmV0dXJuKGFycmF5KTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6c2V0X2ZpbGxfY29sb3IoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworICBpZiAoIW1fYkNhblNldCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisgIGlmICh2cC5Jc0VtcHR5KCkgfHwgIXZwLT5Jc0FycmF5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6Z2V0X2hpZGRlbihDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgQVNTRVJUKHBGb3JtRmllbGQpOworCisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gbV9wRm9ybUZpbGxFbnYtPkdldEludGVyRm9ybSgpOworICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9CisgICAgICBwSW50ZXJGb3JtLT5HZXRXaWRnZXQoR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCkpOworICBpZiAoIXBXaWRnZXQpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIHVpbnQzMl90IGR3RmxhZ3MgPSBwV2lkZ2V0LT5HZXRGbGFncygpOworICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3Qm9vbGVhbihBTk5PVEZMQUdfSU5WSVNJQkxFICYgZHdGbGFncyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTk5PVEZMQUdfSElEREVOICYgZHdGbGFncykpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpzZXRfaGlkZGVuKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgaWYgKCFtX2JDYW5TZXQpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIGlmIChtX2JEZWxheSkgeworICAgIEFkZERlbGF5X0Jvb2woRlBfSElEREVOLCBwUnVudGltZS0+VG9Cb29sZWFuKHZwKSk7CisgIH0gZWxzZSB7CisgICAgRmllbGQ6OlNldEhpZGRlbihtX3BGb3JtRmlsbEVudi5HZXQoKSwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBwUnVudGltZS0+VG9Cb29sZWFuKHZwKSk7CisgIH0KKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK3ZvaWQgRmllbGQ6OlNldEhpZGRlbihDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGIpIHsKKyAgaW50IGRpc3BsYXkgPSBiID8gMSAvKkhpZGRlbiovIDogMCAvKlZpc2libGUqLzsKKyAgU2V0RGlzcGxheShwRm9ybUZpbGxFbnYsIHN3RmllbGROYW1lLCBuQ29udHJvbEluZGV4LCBkaXNwbGF5KTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6Z2V0X2hpZ2hsaWdodChDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKKworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRm9ybUZpZWxkVHlwZTo6a1B1c2hCdXR0b24pCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOworICBpZiAoIXBGb3JtQ29udHJvbCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgaW50IGVITSA9IHBGb3JtQ29udHJvbC0+R2V0SGlnaGxpZ2h0aW5nTW9kZSgpOworICBzd2l0Y2ggKGVITSkgeworICAgIGNhc2UgQ1BERl9Gb3JtQ29udHJvbDo6Tm9uZToKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcoTCJub25lIikpOworICAgIGNhc2UgQ1BERl9Gb3JtQ29udHJvbDo6UHVzaDoKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcoTCJwdXNoIikpOworICAgIGNhc2UgQ1BERl9Gb3JtQ29udHJvbDo6SW52ZXJ0OgorICAgICAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1N0cmluZyhMImludmVydCIpKTsKKyAgICBjYXNlIENQREZfRm9ybUNvbnRyb2w6Ok91dGxpbmU6CisgICAgICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3U3RyaW5nKEwib3V0bGluZSIpKTsKKyAgICBjYXNlIENQREZfRm9ybUNvbnRyb2w6OlRvZ2dsZToKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcoTCJ0b2dnbGUiKSk7CisgIH0KKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF9oaWdobGlnaHQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOworICByZXR1cm4gQ0pTX1JldHVybihtX2JDYW5TZXQpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpnZXRfbGluZV93aWR0aChDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgQVNTRVJUKHBGb3JtRmllbGQpOworCisgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IEdldFNtYXJ0RmllbGRDb250cm9sKHBGb3JtRmllbGQpOworICBpZiAoIXBGb3JtQ29udHJvbCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBtX3BGb3JtRmlsbEVudi0+R2V0SW50ZXJGb3JtKCk7CisgIGlmICghcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUZpZWxkLT5HZXRDb250cm9sKDApKTsKKyAgaWYgKCFwV2lkZ2V0KQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3TnVtYmVyKHBXaWRnZXQtPkdldEJvcmRlcldpZHRoKCkpKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6c2V0X2xpbmVfd2lkdGgoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgaWYgKCFtX2JDYW5TZXQpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIGlmIChtX2JEZWxheSkgeworICAgIEFkZERlbGF5X0ludChGUF9MSU5FV0lEVEgsIHBSdW50aW1lLT5Ub0ludDMyKHZwKSk7CisgIH0gZWxzZSB7CisgICAgRmllbGQ6OlNldExpbmVXaWR0aChtX3BGb3JtRmlsbEVudi5HZXQoKSwgbV9GaWVsZE5hbWUsIG1fbkZvcm1Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBwUnVudGltZS0+VG9JbnQzMih2cCkpOworICB9CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCit2b2lkIEZpZWxkOjpTZXRMaW5lV2lkdGgoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcikgeworICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IHBGb3JtRmlsbEVudi0+R2V0SW50ZXJGb3JtKCk7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9CisgICAgICBHZXRGb3JtRmllbGRzKHBGb3JtRmlsbEVudiwgc3dGaWVsZE5hbWUpOworICBmb3IgKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkIDogRmllbGRBcnJheSkgeworICAgIGlmIChuQ29udHJvbEluZGV4IDwgMCkgeworICAgICAgYm9vbCBiU2V0ID0gZmFsc2U7CisgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGkgPCBzejsgKytpKSB7CisgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woaSk7CisgICAgICAgIEFTU0VSVChwRm9ybUNvbnRyb2wpOworCisgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKSB7CisgICAgICAgICAgaWYgKG51bWJlciAhPSBwV2lkZ2V0LT5HZXRCb3JkZXJXaWR0aCgpKSB7CisgICAgICAgICAgICBwV2lkZ2V0LT5TZXRCb3JkZXJXaWR0aChudW1iZXIpOworICAgICAgICAgICAgYlNldCA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoYlNldCkKKyAgICAgICAgVXBkYXRlRm9ybUZpZWxkKHBGb3JtRmlsbEVudiwgcEZvcm1GaWVsZCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChuQ29udHJvbEluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKKyAgICAgICAgcmV0dXJuOworICAgICAgaWYgKENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ29udHJvbCA9CisgICAgICAgICAgICAgIHBGb3JtRmllbGQtPkdldENvbnRyb2wobkNvbnRyb2xJbmRleCkpIHsKKyAgICAgICAgaWYgKENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KHBGb3JtQ29udHJvbCkpIHsKKyAgICAgICAgICBpZiAobnVtYmVyICE9IHBXaWRnZXQtPkdldEJvcmRlcldpZHRoKCkpIHsKKyAgICAgICAgICAgIHBXaWRnZXQtPlNldEJvcmRlcldpZHRoKG51bWJlcik7CisgICAgICAgICAgICBVcGRhdGVGb3JtQ29udHJvbChwRm9ybUZpbGxFbnYsIHBGb3JtQ29udHJvbCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OmdldF9tdWx0aWxpbmUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIEFTU0VSVChtX3BGb3JtRmlsbEVudik7CisKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZvcm1GaWVsZFR5cGU6OmtUZXh0RmllbGQpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdCb29sZWFuKAorICAgICAgISEocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX01VTFRJTElORSkpKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6c2V0X211bHRpbGluZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIEFTU0VSVChtX3BGb3JtRmlsbEVudik7CisgIHJldHVybiBDSlNfUmV0dXJuKG1fYkNhblNldCk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OmdldF9tdWx0aXBsZV9zZWxlY3Rpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIEFTU0VSVChtX3BGb3JtRmlsbEVudik7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGb3JtRmllbGRUeXBlOjprTGlzdEJveCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld0Jvb2xlYW4oCisgICAgICAhIShwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfTVVMVElTRUxFQ1QpKSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF9tdWx0aXBsZV9zZWxlY3Rpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOworICByZXR1cm4gQ0pTX1JldHVybihtX2JDYW5TZXQpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpnZXRfbmFtZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcobV9GaWVsZE5hbWUuY19zdHIoKSkpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpzZXRfbmFtZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6Z2V0X251bV9pdGVtcyhDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZvcm1GaWVsZFR5cGU6OmtDb21ib0JveCAmJgorICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRm9ybUZpZWxkVHlwZTo6a0xpc3RCb3gpIHsKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisgIH0KKworICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3TnVtYmVyKHBGb3JtRmllbGQtPkNvdW50T3B0aW9ucygpKSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF9udW1faXRlbXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OmdldF9wYWdlKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBpZiAoIXBGb3JtRmllbGQpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIHN0ZDo6dmVjdG9yPENQREZTREtfQW5ub3Q6Ok9ic2VydmVkUHRyPiB3aWRnZXRzOworICBtX3BGb3JtRmlsbEVudi0+R2V0SW50ZXJGb3JtKCktPkdldFdpZGdldHMocEZvcm1GaWVsZCwgJndpZGdldHMpOworICBpZiAod2lkZ2V0cy5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdOdW1iZXIoLTEpKTsKKworICB2ODo6TG9jYWw8djg6OkFycmF5PiBQYWdlQXJyYXkgPSBwUnVudGltZS0+TmV3QXJyYXkoKTsKKyAgaW50IGkgPSAwOworICBmb3IgKGNvbnN0IGF1dG8mIHBPYnNlcnZlZCA6IHdpZGdldHMpIHsKKyAgICBpZiAoIXBPYnNlcnZlZCkKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a0JhZE9iamVjdEVycm9yKSk7CisKKyAgICBhdXRvKiBwV2lkZ2V0ID0gc3RhdGljX2Nhc3Q8Q1BERlNES19XaWRnZXQqPihwT2JzZXJ2ZWQuR2V0KCkpOworICAgIENQREZTREtfUGFnZVZpZXcqIHBQYWdlVmlldyA9IHBXaWRnZXQtPkdldFBhZ2VWaWV3KCk7CisgICAgaWYgKCFwUGFnZVZpZXcpCisgICAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgICBwUnVudGltZS0+UHV0QXJyYXlFbGVtZW50KAorICAgICAgICBQYWdlQXJyYXksIGksCisgICAgICAgIHBSdW50aW1lLT5OZXdOdW1iZXIoc3RhdGljX2Nhc3Q8aW50MzJfdD4ocFBhZ2VWaWV3LT5HZXRQYWdlSW5kZXgoKSkpKTsKKyAgICArK2k7CisgIH0KKyAgcmV0dXJuIENKU19SZXR1cm4oUGFnZUFycmF5KTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6c2V0X3BhZ2UoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtSZWFkT25seUVycm9yKSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OmdldF9wYXNzd29yZChDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKKworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRm9ybUZpZWxkVHlwZTo6a1RleHRGaWVsZCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld0Jvb2xlYW4oCisgICAgICAhIShwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUEFTU1dPUkQpKSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF9wYXNzd29yZChDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIEFTU0VSVChtX3BGb3JtRmlsbEVudik7CisgIHJldHVybiBDSlNfUmV0dXJuKG1fYkNhblNldCk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OmdldF9wcmludChDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBtX3BGb3JtRmlsbEVudi0+R2V0SW50ZXJGb3JtKCk7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIENQREZTREtfV2lkZ2V0KiBwV2lkZ2V0ID0KKyAgICAgIHBJbnRlckZvcm0tPkdldFdpZGdldChHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKSk7CisgIGlmICghcFdpZGdldCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgcmV0dXJuIENKU19SZXR1cm4oCisgICAgICBwUnVudGltZS0+TmV3Qm9vbGVhbighIShwV2lkZ2V0LT5HZXRGbGFncygpICYgQU5OT1RGTEFHX1BSSU5UKSkpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpzZXRfcHJpbnQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IG1fcEZvcm1GaWxsRW52LT5HZXRJbnRlckZvcm0oKTsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIGlmICghbV9iQ2FuU2V0KQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBmb3IgKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkIDogRmllbGRBcnJheSkgeworICAgIGlmIChtX25Gb3JtQ29udHJvbEluZGV4IDwgMCkgeworICAgICAgYm9vbCBiU2V0ID0gZmFsc2U7CisgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7IGkgPCBzejsgKytpKSB7CisgICAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9CisgICAgICAgICAgICAgICAgcEludGVyRm9ybS0+R2V0V2lkZ2V0KHBGb3JtRmllbGQtPkdldENvbnRyb2woaSkpKSB7CisgICAgICAgICAgdWludDMyX3QgZHdGbGFncyA9IHBXaWRnZXQtPkdldEZsYWdzKCk7CisgICAgICAgICAgaWYgKHBSdW50aW1lLT5Ub0Jvb2xlYW4odnApKQorICAgICAgICAgICAgZHdGbGFncyB8PSBBTk5PVEZMQUdfUFJJTlQ7CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgZHdGbGFncyAmPSB+QU5OT1RGTEFHX1BSSU5UOworCisgICAgICAgICAgaWYgKGR3RmxhZ3MgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkgeworICAgICAgICAgICAgcFdpZGdldC0+U2V0RmxhZ3MoZHdGbGFncyk7CisgICAgICAgICAgICBiU2V0ID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgaWYgKGJTZXQpCisgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChtX3BGb3JtRmlsbEVudi5HZXQoKSwgcEZvcm1GaWVsZCwgdHJ1ZSwgZmFsc2UsIHRydWUpOworCisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpZiAobV9uRm9ybUNvbnRyb2xJbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCisgICAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgICBpZiAoQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0KKyAgICAgICAgICAgIHBGb3JtRmllbGQtPkdldENvbnRyb2wobV9uRm9ybUNvbnRyb2xJbmRleCkpIHsKKyAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKSB7CisgICAgICAgIHVpbnQzMl90IGR3RmxhZ3MgPSBwV2lkZ2V0LT5HZXRGbGFncygpOworICAgICAgICBpZiAocFJ1bnRpbWUtPlRvQm9vbGVhbih2cCkpCisgICAgICAgICAgZHdGbGFncyB8PSBBTk5PVEZMQUdfUFJJTlQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBkd0ZsYWdzICY9IH5BTk5PVEZMQUdfUFJJTlQ7CisKKyAgICAgICAgaWYgKGR3RmxhZ3MgIT0gcFdpZGdldC0+R2V0RmxhZ3MoKSkgeworICAgICAgICAgIHBXaWRnZXQtPlNldEZsYWdzKGR3RmxhZ3MpOworICAgICAgICAgIFVwZGF0ZUZvcm1Db250cm9sKG1fcEZvcm1GaWxsRW52LkdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtRmllbGQtPkdldENvbnRyb2wobV9uRm9ybUNvbnRyb2xJbmRleCksIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHRydWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpnZXRfcmFkaW9zX2luX3VuaXNvbihDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpICE9IEZvcm1GaWVsZFR5cGU6OmtSYWRpb0J1dHRvbikKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld0Jvb2xlYW4oCisgICAgICAhIShwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUkFESU9TSU5VTklTT04pKSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF9yYWRpb3NfaW5fdW5pc29uKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKyAgcmV0dXJuIENKU19SZXR1cm4obV9iQ2FuU2V0KTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6Z2V0X3JlYWRvbmx5KENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld0Jvb2xlYW4oCisgICAgICAhIShGaWVsZEFycmF5WzBdLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUkVBRE9OTFkpKSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF9yZWFkb25seShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKyAgcmV0dXJuIENKU19SZXR1cm4obV9iQ2FuU2V0KTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6Z2V0X3JlY3QoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIENQREZTREtfSW50ZXJGb3JtKiBwSW50ZXJGb3JtID0gbV9wRm9ybUZpbGxFbnYtPkdldEludGVyRm9ybSgpOworICBDUERGU0RLX1dpZGdldCogcFdpZGdldCA9CisgICAgICBwSW50ZXJGb3JtLT5HZXRXaWRnZXQoR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCkpOworICBpZiAoIXBXaWRnZXQpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENGWF9GbG9hdFJlY3QgY3JSZWN0ID0gcFdpZGdldC0+R2V0UmVjdCgpOworICB2ODo6TG9jYWw8djg6OkFycmF5PiByY0FycmF5ID0gcFJ1bnRpbWUtPk5ld0FycmF5KCk7CisgIHBSdW50aW1lLT5QdXRBcnJheUVsZW1lbnQoCisgICAgICByY0FycmF5LCAwLCBwUnVudGltZS0+TmV3TnVtYmVyKHN0YXRpY19jYXN0PGludDMyX3Q+KGNyUmVjdC5sZWZ0KSkpOworICBwUnVudGltZS0+UHV0QXJyYXlFbGVtZW50KAorICAgICAgcmNBcnJheSwgMSwgcFJ1bnRpbWUtPk5ld051bWJlcihzdGF0aWNfY2FzdDxpbnQzMl90PihjclJlY3QudG9wKSkpOworICBwUnVudGltZS0+UHV0QXJyYXlFbGVtZW50KAorICAgICAgcmNBcnJheSwgMiwgcFJ1bnRpbWUtPk5ld051bWJlcihzdGF0aWNfY2FzdDxpbnQzMl90PihjclJlY3QucmlnaHQpKSk7CisgIHBSdW50aW1lLT5QdXRBcnJheUVsZW1lbnQoCisgICAgICByY0FycmF5LCAzLCBwUnVudGltZS0+TmV3TnVtYmVyKHN0YXRpY19jYXN0PGludDMyX3Q+KGNyUmVjdC5ib3R0b20pKSk7CisKKyAgcmV0dXJuIENKU19SZXR1cm4ocmNBcnJheSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF9yZWN0KENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgaWYgKCFtX2JDYW5TZXQpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworICBpZiAodnAuSXNFbXB0eSgpIHx8ICF2cC0+SXNBcnJheSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICB2ODo6TG9jYWw8djg6OkFycmF5PiByY0FycmF5ID0gcFJ1bnRpbWUtPlRvQXJyYXkodnApOworICBpZiAocFJ1bnRpbWUtPkdldEFycmF5TGVuZ3RoKHJjQXJyYXkpIDwgNCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgZmxvYXQgcEFycmF5WzRdOworICBwQXJyYXlbMF0gPSBzdGF0aWNfY2FzdDxmbG9hdD4oCisgICAgICBwUnVudGltZS0+VG9JbnQzMihwUnVudGltZS0+R2V0QXJyYXlFbGVtZW50KHJjQXJyYXksIDApKSk7CisgIHBBcnJheVsxXSA9IHN0YXRpY19jYXN0PGZsb2F0PigKKyAgICAgIHBSdW50aW1lLT5Ub0ludDMyKHBSdW50aW1lLT5HZXRBcnJheUVsZW1lbnQocmNBcnJheSwgMSkpKTsKKyAgcEFycmF5WzJdID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KAorICAgICAgcFJ1bnRpbWUtPlRvSW50MzIocFJ1bnRpbWUtPkdldEFycmF5RWxlbWVudChyY0FycmF5LCAyKSkpOworICBwQXJyYXlbM10gPSBzdGF0aWNfY2FzdDxmbG9hdD4oCisgICAgICBwUnVudGltZS0+VG9JbnQzMihwUnVudGltZS0+R2V0QXJyYXlFbGVtZW50KHJjQXJyYXksIDMpKSk7CisKKyAgQ0ZYX0Zsb2F0UmVjdCBjclJlY3QocEFycmF5KTsKKyAgaWYgKG1fYkRlbGF5KSB7CisgICAgQWRkRGVsYXlfUmVjdChGUF9SRUNULCBjclJlY3QpOworICB9IGVsc2UgeworICAgIEZpZWxkOjpTZXRSZWN0KG1fcEZvcm1GaWxsRW52LkdldCgpLCBtX0ZpZWxkTmFtZSwgbV9uRm9ybUNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICBjclJlY3QpOworICB9CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCit2b2lkIEZpZWxkOjpTZXRSZWN0KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IG5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9GbG9hdFJlY3QmIHJlY3QpIHsKKyAgQ1BERlNES19JbnRlckZvcm0qIHBJbnRlckZvcm0gPSBwRm9ybUZpbGxFbnYtPkdldEludGVyRm9ybSgpOworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPQorICAgICAgR2V0Rm9ybUZpZWxkcyhwRm9ybUZpbGxFbnYsIHN3RmllbGROYW1lKTsKKyAgZm9yIChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA6IEZpZWxkQXJyYXkpIHsKKyAgICBpZiAobkNvbnRyb2xJbmRleCA8IDApIHsKKyAgICAgIGJvb2wgYlNldCA9IGZhbHNlOworICAgICAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyBpIDwgc3o7ICsraSkgeworICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpOworICAgICAgICBBU1NFUlQocEZvcm1Db250cm9sKTsKKworICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1Db250cm9sKSkgeworICAgICAgICAgIENGWF9GbG9hdFJlY3QgY3JSZWN0ID0gcmVjdDsKKworICAgICAgICAgIENQREZfUGFnZSogcFBERlBhZ2UgPSBwV2lkZ2V0LT5HZXRQREZQYWdlKCk7CisgICAgICAgICAgY3JSZWN0LkludGVyc2VjdChwUERGUGFnZS0+R2V0UGFnZUJCb3goKSk7CisKKyAgICAgICAgICBpZiAoIWNyUmVjdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIENGWF9GbG9hdFJlY3QgcmNPbGQgPSBwV2lkZ2V0LT5HZXRSZWN0KCk7CisgICAgICAgICAgICBpZiAoY3JSZWN0LmxlZnQgIT0gcmNPbGQubGVmdCB8fCBjclJlY3QucmlnaHQgIT0gcmNPbGQucmlnaHQgfHwKKyAgICAgICAgICAgICAgICBjclJlY3QudG9wICE9IHJjT2xkLnRvcCB8fCBjclJlY3QuYm90dG9tICE9IHJjT2xkLmJvdHRvbSkgeworICAgICAgICAgICAgICBwV2lkZ2V0LT5TZXRSZWN0KGNyUmVjdCk7CisgICAgICAgICAgICAgIGJTZXQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoYlNldCkKKyAgICAgICAgVXBkYXRlRm9ybUZpZWxkKHBGb3JtRmlsbEVudiwgcEZvcm1GaWVsZCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChuQ29udHJvbEluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKKyAgICAgIHJldHVybjsKKyAgICBpZiAoQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0KKyAgICAgICAgICAgIHBGb3JtRmllbGQtPkdldENvbnRyb2wobkNvbnRyb2xJbmRleCkpIHsKKyAgICAgIGlmIChDUERGU0RLX1dpZGdldCogcFdpZGdldCA9IHBJbnRlckZvcm0tPkdldFdpZGdldChwRm9ybUNvbnRyb2wpKSB7CisgICAgICAgIENGWF9GbG9hdFJlY3QgY3JSZWN0ID0gcmVjdDsKKworICAgICAgICBDUERGX1BhZ2UqIHBQREZQYWdlID0gcFdpZGdldC0+R2V0UERGUGFnZSgpOworICAgICAgICBjclJlY3QuSW50ZXJzZWN0KHBQREZQYWdlLT5HZXRQYWdlQkJveCgpKTsKKworICAgICAgICBpZiAoIWNyUmVjdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICBDRlhfRmxvYXRSZWN0IHJjT2xkID0gcFdpZGdldC0+R2V0UmVjdCgpOworICAgICAgICAgIGlmIChjclJlY3QubGVmdCAhPSByY09sZC5sZWZ0IHx8IGNyUmVjdC5yaWdodCAhPSByY09sZC5yaWdodCB8fAorICAgICAgICAgICAgICBjclJlY3QudG9wICE9IHJjT2xkLnRvcCB8fCBjclJlY3QuYm90dG9tICE9IHJjT2xkLmJvdHRvbSkgeworICAgICAgICAgICAgcFdpZGdldC0+U2V0UmVjdChjclJlY3QpOworICAgICAgICAgICAgVXBkYXRlRm9ybUNvbnRyb2wocEZvcm1GaWxsRW52LCBwRm9ybUNvbnRyb2wsIHRydWUsIHRydWUsIHRydWUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorfQorCitDSlNfUmV0dXJuIEZpZWxkOjpnZXRfcmVxdWlyZWQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGb3JtRmllbGRUeXBlOjprUHVzaEJ1dHRvbikKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld0Jvb2xlYW4oCisgICAgICAhIShwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUkVRVUlSRUQpKSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF9yZXF1aXJlZChDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKyAgcmV0dXJuIENKU19SZXR1cm4obV9iQ2FuU2V0KTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6Z2V0X3JpY2hfdGV4dChDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKKworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRm9ybUZpZWxkVHlwZTo6a1RleHRGaWVsZCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld0Jvb2xlYW4oCisgICAgICAhIShwRm9ybUZpZWxkLT5HZXRGaWVsZEZsYWdzKCkgJiBGSUVMREZMQUdfUklDSFRFWFQpKSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF9yaWNoX3RleHQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOworICByZXR1cm4gQ0pTX1JldHVybihtX2JDYW5TZXQpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpnZXRfcmljaF92YWx1ZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF9yaWNoX3ZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpnZXRfcm90YXRpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIEFTU0VSVChtX3BGb3JtRmlsbEVudik7CisKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7CisgIGlmICghcEZvcm1Db250cm9sKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3TnVtYmVyKHBGb3JtQ29udHJvbC0+R2V0Um90YXRpb24oKSkpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpzZXRfcm90YXRpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOworICByZXR1cm4gQ0pTX1JldHVybihtX2JDYW5TZXQpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpnZXRfc3Ryb2tlX2NvbG9yKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgaWYgKCFwRm9ybUNvbnRyb2wpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIGludCBpQ29sb3JUeXBlOworICBwRm9ybUNvbnRyb2wtPkdldEJvcmRlckNvbG9yKGlDb2xvclR5cGUpOworCisgIENGWF9Db2xvciBjb2xvcjsKKyAgaWYgKGlDb2xvclR5cGUgPT0gQ0ZYX0NvbG9yOjprVHJhbnNwYXJlbnQpIHsKKyAgICBjb2xvciA9IENGWF9Db2xvcihDRlhfQ29sb3I6OmtUcmFuc3BhcmVudCk7CisgIH0gZWxzZSBpZiAoaUNvbG9yVHlwZSA9PSBDRlhfQ29sb3I6OmtHcmF5KSB7CisgICAgY29sb3IgPQorICAgICAgICBDRlhfQ29sb3IoQ0ZYX0NvbG9yOjprR3JheSwgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJvcmRlckNvbG9yKDApKTsKKyAgfSBlbHNlIGlmIChpQ29sb3JUeXBlID09IENGWF9Db2xvcjo6a1JHQikgeworICAgIGNvbG9yID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a1JHQiwgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJvcmRlckNvbG9yKDApLAorICAgICAgICAgICAgICAgICAgICAgIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcigxKSwKKyAgICAgICAgICAgICAgICAgICAgICBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoMikpOworICB9IGVsc2UgaWYgKGlDb2xvclR5cGUgPT0gQ0ZYX0NvbG9yOjprQ01ZSykgeworICAgIGNvbG9yID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a0NNWUssIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcigwKSwKKyAgICAgICAgICAgICAgICAgICAgICBwRm9ybUNvbnRyb2wtPkdldE9yaWdpbmFsQm9yZGVyQ29sb3IoMSksCisgICAgICAgICAgICAgICAgICAgICAgcEZvcm1Db250cm9sLT5HZXRPcmlnaW5hbEJvcmRlckNvbG9yKDIpLAorICAgICAgICAgICAgICAgICAgICAgIHBGb3JtQ29udHJvbC0+R2V0T3JpZ2luYWxCb3JkZXJDb2xvcigzKSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworICB9CisKKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gYXJyYXkgPSBjb2xvcjo6Q29udmVydFBXTENvbG9yVG9BcnJheShwUnVudGltZSwgY29sb3IpOworICBpZiAoYXJyYXkuSXNFbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdBcnJheSgpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4oYXJyYXkpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpzZXRfc3Ryb2tlX2NvbG9yKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgaWYgKCFtX2JDYW5TZXQpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworICBpZiAodnAuSXNFbXB0eSgpIHx8ICF2cC0+SXNBcnJheSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OmdldF9zdHlsZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKKworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRm9ybUZpZWxkVHlwZTo6a1JhZGlvQnV0dG9uICYmCisgICAgICBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGb3JtRmllbGRUeXBlOjprQ2hlY2tCb3gpIHsKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisgIH0KKworICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgaWYgKCFwRm9ybUNvbnRyb2wpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIFdpZGVTdHJpbmcgY3NXQ2FwdGlvbiA9IHBGb3JtQ29udHJvbC0+R2V0Tm9ybWFsQ2FwdGlvbigpOworICBCeXRlU3RyaW5nIGNzQkNhcHRpb247CisKKyAgc3dpdGNoIChjc1dDYXB0aW9uWzBdKSB7CisgICAgY2FzZSBMJ2wnOgorICAgICAgY3NCQ2FwdGlvbiA9ICJjaXJjbGUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJzgnOgorICAgICAgY3NCQ2FwdGlvbiA9ICJjcm9zcyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwndSc6CisgICAgICBjc0JDYXB0aW9uID0gImRpYW1vbmQiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJ24nOgorICAgICAgY3NCQ2FwdGlvbiA9ICJzcXVhcmUiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMJ0gnOgorICAgICAgY3NCQ2FwdGlvbiA9ICJzdGFyIjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICAvLyBMJzQnCisgICAgICBjc0JDYXB0aW9uID0gImNoZWNrIjsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBDSlNfUmV0dXJuKAorICAgICAgcFJ1bnRpbWUtPk5ld1N0cmluZyhXaWRlU3RyaW5nOjpGcm9tTG9jYWwoY3NCQ2FwdGlvbi5jX3N0cigpKS5jX3N0cigpKSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF9zdHlsZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIEFTU0VSVChtX3BGb3JtRmlsbEVudik7CisgIHJldHVybiBDSlNfUmV0dXJuKG1fYkNhblNldCk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OmdldF9zdWJtaXRfbmFtZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF9zdWJtaXRfbmFtZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OmdldF90ZXh0X2NvbG9yKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wgPSBHZXRTbWFydEZpZWxkQ29udHJvbChwRm9ybUZpZWxkKTsKKyAgaWYgKCFwRm9ybUNvbnRyb2wpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIGludCBpQ29sb3JUeXBlOworICBGWF9BUkdCIGNvbG9yOworICBDUERGX0RlZmF1bHRBcHBlYXJhbmNlIEZpZWxkQXBwZWFyYW5jZSA9IHBGb3JtQ29udHJvbC0+R2V0RGVmYXVsdEFwcGVhcmFuY2UoKTsKKyAgRmllbGRBcHBlYXJhbmNlLkdldENvbG9yKGNvbG9yLCBpQ29sb3JUeXBlKTsKKworICBpbnQzMl90IGE7CisgIGludDMyX3QgcjsKKyAgaW50MzJfdCBnOworICBpbnQzMl90IGI7CisgIHN0ZDo6dGllKGEsIHIsIGcsIGIpID0gQXJnYkRlY29kZShjb2xvcik7CisKKyAgQ0ZYX0NvbG9yIGNyUmV0ID0KKyAgICAgIENGWF9Db2xvcihDRlhfQ29sb3I6OmtSR0IsIHIgLyAyNTUuMGYsIGcgLyAyNTUuMGYsIGIgLyAyNTUuMGYpOworCisgIGlmIChpQ29sb3JUeXBlID09IENGWF9Db2xvcjo6a1RyYW5zcGFyZW50KQorICAgIGNyUmV0ID0gQ0ZYX0NvbG9yKENGWF9Db2xvcjo6a1RyYW5zcGFyZW50KTsKKworICB2ODo6TG9jYWw8djg6OlZhbHVlPiBhcnJheSA9IGNvbG9yOjpDb252ZXJ0UFdMQ29sb3JUb0FycmF5KHBSdW50aW1lLCBjclJldCk7CisgIGlmIChhcnJheS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld0FycmF5KCkpOworICByZXR1cm4gQ0pTX1JldHVybihhcnJheSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF90ZXh0X2NvbG9yKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIGlmICghbV9iQ2FuU2V0KQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKyAgaWYgKHZwLklzRW1wdHkoKSB8fCAhdnAtPklzQXJyYXkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpnZXRfdGV4dF9mb250KENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOworCisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIEFTU0VSVChwRm9ybUZpZWxkKTsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7CisgIGlmICghcEZvcm1Db250cm9sKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBGb3JtRmllbGRUeXBlIGZpZWxkVHlwZSA9IHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpOworICBpZiAoZmllbGRUeXBlICE9IEZvcm1GaWVsZFR5cGU6OmtQdXNoQnV0dG9uICYmCisgICAgICBmaWVsZFR5cGUgIT0gRm9ybUZpZWxkVHlwZTo6a0NvbWJvQm94ICYmCisgICAgICBmaWVsZFR5cGUgIT0gRm9ybUZpZWxkVHlwZTo6a0xpc3RCb3ggJiYKKyAgICAgIGZpZWxkVHlwZSAhPSBGb3JtRmllbGRUeXBlOjprVGV4dEZpZWxkKSB7CisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworICB9CisKKyAgQ1BERl9Gb250KiBwRm9udCA9IHBGb3JtQ29udHJvbC0+R2V0RGVmYXVsdENvbnRyb2xGb250KCk7CisgIGlmICghcEZvbnQpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcoCisgICAgICBXaWRlU3RyaW5nOjpGcm9tTG9jYWwocEZvbnQtPkdldEJhc2VGb250KCkuY19zdHIoKSkuY19zdHIoKSkpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpzZXRfdGV4dF9mb250KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKKworICBpZiAoIW1fYkNhblNldCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisgIHJldHVybiBDSlNfUmV0dXJuKAorICAgICAgIUJ5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcodnApKS5Jc0VtcHR5KCkpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpnZXRfdGV4dF9zaXplKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOworCisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIEFTU0VSVChwRm9ybUZpZWxkKTsKKyAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7CisgIGlmICghcEZvcm1Db250cm9sKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBmbG9hdCBmRm9udFNpemU7CisgIENQREZfRGVmYXVsdEFwcGVhcmFuY2UgRmllbGRBcHBlYXJhbmNlID0gcEZvcm1Db250cm9sLT5HZXREZWZhdWx0QXBwZWFyYW5jZSgpOworICBGaWVsZEFwcGVhcmFuY2UuR2V0Rm9udCgmZkZvbnRTaXplKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld051bWJlcihzdGF0aWNfY2FzdDxpbnQ+KGZGb250U2l6ZSkpKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6c2V0X3RleHRfc2l6ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIEFTU0VSVChtX3BGb3JtRmlsbEVudik7CisgIHJldHVybiBDSlNfUmV0dXJuKG1fYkNhblNldCk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OmdldF90eXBlKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBzd2l0Y2ggKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpKSB7CisgICAgY2FzZSBGb3JtRmllbGRUeXBlOjprVW5rbm93bjoKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcoTCJ1bmtub3duIikpOworICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a1B1c2hCdXR0b246CisgICAgICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3U3RyaW5nKEwiYnV0dG9uIikpOworICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a0NoZWNrQm94OgorICAgICAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1N0cmluZyhMImNoZWNrYm94IikpOworICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a1JhZGlvQnV0dG9uOgorICAgICAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1N0cmluZyhMInJhZGlvYnV0dG9uIikpOworICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a0NvbWJvQm94OgorICAgICAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1N0cmluZyhMImNvbWJvYm94IikpOworICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a0xpc3RCb3g6CisgICAgICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3U3RyaW5nKEwibGlzdGJveCIpKTsKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtUZXh0RmllbGQ6CisgICAgICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3U3RyaW5nKEwidGV4dCIpKTsKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtTaWduYXR1cmU6CisgICAgICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3U3RyaW5nKEwic2lnbmF0dXJlIikpOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3U3RyaW5nKEwidW5rbm93biIpKTsKKyAgfQorfQorCitDSlNfUmV0dXJuIEZpZWxkOjpzZXRfdHlwZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6Z2V0X3VzZXJfbmFtZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgQVNTRVJUKG1fcEZvcm1GaWxsRW52KTsKKworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgcmV0dXJuIENKU19SZXR1cm4oCisgICAgICBwUnVudGltZS0+TmV3U3RyaW5nKEZpZWxkQXJyYXlbMF0tPkdldEFsdGVybmF0ZU5hbWUoKS5jX3N0cigpKSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF91c2VyX25hbWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICBBU1NFUlQobV9wRm9ybUZpbGxFbnYpOworICByZXR1cm4gQ0pTX1JldHVybihtX2JDYW5TZXQpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpnZXRfdmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXQ7CisKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBzd2l0Y2ggKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpKSB7CisgICAgY2FzZSBGb3JtRmllbGRUeXBlOjprUHVzaEJ1dHRvbjoKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtDb21ib0JveDoKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtUZXh0RmllbGQ6CisgICAgICByZXQgPSBwUnVudGltZS0+TmV3U3RyaW5nKHBGb3JtRmllbGQtPkdldFZhbHVlKCkuY19zdHIoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtMaXN0Qm94OiB7CisgICAgICBpZiAocEZvcm1GaWVsZC0+Q291bnRTZWxlY3RlZEl0ZW1zKCkgPiAxKSB7CisgICAgICAgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IFZhbHVlQXJyYXkgPSBwUnVudGltZS0+TmV3QXJyYXkoKTsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gRWxlbWVudFZhbHVlOworICAgICAgICBpbnQgaUluZGV4OworICAgICAgICBmb3IgKGludCBpID0gMCwgc3ogPSBwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgICBpSW5kZXggPSBwRm9ybUZpZWxkLT5HZXRTZWxlY3RlZEluZGV4KGkpOworICAgICAgICAgIEVsZW1lbnRWYWx1ZSA9CisgICAgICAgICAgICAgIHBSdW50aW1lLT5OZXdTdHJpbmcocEZvcm1GaWVsZC0+R2V0T3B0aW9uVmFsdWUoaUluZGV4KS5jX3N0cigpKTsKKyAgICAgICAgICBpZiAod2NzbGVuKHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcoRWxlbWVudFZhbHVlKS5jX3N0cigpKSA9PSAwKSB7CisgICAgICAgICAgICBFbGVtZW50VmFsdWUgPQorICAgICAgICAgICAgICAgIHBSdW50aW1lLT5OZXdTdHJpbmcocEZvcm1GaWVsZC0+R2V0T3B0aW9uTGFiZWwoaUluZGV4KS5jX3N0cigpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcFJ1bnRpbWUtPlB1dEFycmF5RWxlbWVudChWYWx1ZUFycmF5LCBpLCBFbGVtZW50VmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldCA9IFZhbHVlQXJyYXk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBwUnVudGltZS0+TmV3U3RyaW5nKHBGb3JtRmllbGQtPkdldFZhbHVlKCkuY19zdHIoKSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBGb3JtRmllbGRUeXBlOjprQ2hlY2tCb3g6CisgICAgY2FzZSBGb3JtRmllbGRUeXBlOjprUmFkaW9CdXR0b246IHsKKyAgICAgIGJvb2wgYkZpbmQgPSBmYWxzZTsKKyAgICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgaWYgKHBGb3JtRmllbGQtPkdldENvbnRyb2woaSktPklzQ2hlY2tlZCgpKSB7CisgICAgICAgICAgcmV0ID0gcFJ1bnRpbWUtPk5ld1N0cmluZygKKyAgICAgICAgICAgICAgcEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKS0+R2V0RXhwb3J0VmFsdWUoKS5jX3N0cigpKTsKKyAgICAgICAgICBiRmluZCA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICghYkZpbmQpCisgICAgICAgIHJldCA9IHBSdW50aW1lLT5OZXdTdHJpbmcoTCJPZmYiKTsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXQgPSBwUnVudGltZS0+TmV3U3RyaW5nKHBGb3JtRmllbGQtPkdldFZhbHVlKCkuY19zdHIoKSk7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TWF5YmVDb2VyY2VUb051bWJlcihyZXQpKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6c2V0X3ZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgaWYgKCFtX2JDYW5TZXQpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIHN0ZDo6dmVjdG9yPFdpZGVTdHJpbmc+IHN0ckFycmF5OworICBpZiAoIXZwLklzRW1wdHkoKSAmJiB2cC0+SXNBcnJheSgpKSB7CisgICAgdjg6OkxvY2FsPHY4OjpBcnJheT4gVmFsdWVBcnJheSA9IHBSdW50aW1lLT5Ub0FycmF5KHZwKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBSdW50aW1lLT5HZXRBcnJheUxlbmd0aChWYWx1ZUFycmF5KTsgaSsrKSB7CisgICAgICBzdHJBcnJheS5wdXNoX2JhY2soCisgICAgICAgICAgcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwUnVudGltZS0+R2V0QXJyYXlFbGVtZW50KFZhbHVlQXJyYXksIGkpKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIHN0ckFycmF5LnB1c2hfYmFjayhwUnVudGltZS0+VG9XaWRlU3RyaW5nKHZwKSk7CisgIH0KKworICBpZiAobV9iRGVsYXkpIHsKKyAgICBBZGREZWxheV9XaWRlU3RyaW5nQXJyYXkoRlBfVkFMVUUsIHN0ckFycmF5KTsKKyAgfSBlbHNlIHsKKyAgICBGaWVsZDo6U2V0VmFsdWUobV9wRm9ybUZpbGxFbnYuR2V0KCksIG1fRmllbGROYW1lLCBtX25Gb3JtQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICBzdHJBcnJheSk7CisgIH0KKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK3ZvaWQgRmllbGQ6OlNldFZhbHVlKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFdpZGVTdHJpbmc+JiBzdHJBcnJheSkgeworICBBU1NFUlQocEZvcm1GaWxsRW52KTsKKyAgaWYgKHN0ckFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuOworCisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9CisgICAgICBHZXRGb3JtRmllbGRzKHBGb3JtRmlsbEVudiwgc3dGaWVsZE5hbWUpOworCisgIGZvciAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgOiBGaWVsZEFycmF5KSB7CisgICAgaWYgKHBGb3JtRmllbGQtPkdldEZ1bGxOYW1lKCkuQ29tcGFyZShzd0ZpZWxkTmFtZSkgIT0gMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgc3dpdGNoIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSkgeworICAgICAgY2FzZSBGb3JtRmllbGRUeXBlOjprVGV4dEZpZWxkOgorICAgICAgY2FzZSBGb3JtRmllbGRUeXBlOjprQ29tYm9Cb3g6CisgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpICE9IHN0ckFycmF5WzBdKSB7CisgICAgICAgICAgcEZvcm1GaWVsZC0+U2V0VmFsdWUoc3RyQXJyYXlbMF0sIHRydWUpOworICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRm9ybUZpbGxFbnYsIHBGb3JtRmllbGQsIHRydWUsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a0NoZWNrQm94OgorICAgICAgY2FzZSBGb3JtRmllbGRUeXBlOjprUmFkaW9CdXR0b246CisgICAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpICE9IHN0ckFycmF5WzBdKSB7CisgICAgICAgICAgcEZvcm1GaWVsZC0+U2V0VmFsdWUoc3RyQXJyYXlbMF0sIHRydWUpOworICAgICAgICAgIFVwZGF0ZUZvcm1GaWVsZChwRm9ybUZpbGxFbnYsIHBGb3JtRmllbGQsIHRydWUsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a0xpc3RCb3g6IHsKKyAgICAgICAgYm9vbCBiTW9kaWZpZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdHIgOiBzdHJBcnJheSkgeworICAgICAgICAgIGlmICghcEZvcm1GaWVsZC0+SXNJdGVtU2VsZWN0ZWQocEZvcm1GaWVsZC0+RmluZE9wdGlvbihzdHIpKSkgeworICAgICAgICAgICAgYk1vZGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYk1vZGlmaWVkKSB7CisgICAgICAgICAgcEZvcm1GaWVsZC0+Q2xlYXJTZWxlY3Rpb24odHJ1ZSk7CisgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdHIgOiBzdHJBcnJheSkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gcEZvcm1GaWVsZC0+RmluZE9wdGlvbihzdHIpOworICAgICAgICAgICAgaWYgKCFwRm9ybUZpZWxkLT5Jc0l0ZW1TZWxlY3RlZChpbmRleCkpCisgICAgICAgICAgICAgIHBGb3JtRmllbGQtPlNldEl0ZW1TZWxlY3Rpb24oaW5kZXgsIHRydWUsIHRydWUpOworICAgICAgICAgIH0KKyAgICAgICAgICBVcGRhdGVGb3JtRmllbGQocEZvcm1GaWxsRW52LCBwRm9ybUZpZWxkLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKworQ0pTX1JldHVybiBGaWVsZDo6Z2V0X3ZhbHVlX2FzX3N0cmluZyhDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgaWYgKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZvcm1GaWVsZFR5cGU6OmtQdXNoQnV0dG9uKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRm9ybUZpZWxkVHlwZTo6a0NoZWNrQm94KSB7CisgICAgaWYgKCFwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCisgICAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisgICAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1N0cmluZygKKyAgICAgICAgcEZvcm1GaWVsZC0+R2V0Q29udHJvbCgwKS0+SXNDaGVja2VkKCkgPyBMIlllcyIgOiBMIk9mZiIpKTsKKyAgfQorCisgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGb3JtRmllbGRUeXBlOjprUmFkaW9CdXR0b24gJiYKKyAgICAgICEocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX1JBRElPU0lOVU5JU09OKSkgeworICAgIGZvciAoaW50IGkgPSAwLCBzeiA9IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKTsgaSA8IHN6OyBpKyspIHsKKyAgICAgIGlmIChwRm9ybUZpZWxkLT5HZXRDb250cm9sKGkpLT5Jc0NoZWNrZWQoKSkgeworICAgICAgICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3U3RyaW5nKAorICAgICAgICAgICAgcEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKS0+R2V0RXhwb3J0VmFsdWUoKS5jX3N0cigpKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcoTCJPZmYiKSk7CisgIH0KKworICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRm9ybUZpZWxkVHlwZTo6a0xpc3RCb3ggJiYKKyAgICAgIChwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKSA+IDEpKSB7CisgICAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1N0cmluZyhMIiIpKTsKKyAgfQorICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3U3RyaW5nKHBGb3JtRmllbGQtPkdldFZhbHVlKCkuY19zdHIoKSkpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpzZXRfdmFsdWVfYXNfc3RyaW5nKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpicm93c2VGb3JGaWxlVG9TdWJtaXQoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIGlmICgocEZvcm1GaWVsZC0+R2V0RmllbGRGbGFncygpICYgRklFTERGTEFHX0ZJTEVTRUxFQ1QpICYmCisgICAgICAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRm9ybUZpZWxkVHlwZTo6a1RleHRGaWVsZCkpIHsKKyAgICBXaWRlU3RyaW5nIHdzRmlsZU5hbWUgPSBtX3BGb3JtRmlsbEVudi0+SlNfZmllbGRCcm93c2UoKTsKKyAgICBpZiAoIXdzRmlsZU5hbWUuSXNFbXB0eSgpKSB7CisgICAgICBwRm9ybUZpZWxkLT5TZXRWYWx1ZSh3c0ZpbGVOYW1lKTsKKyAgICAgIFVwZGF0ZUZvcm1GaWVsZChtX3BGb3JtRmlsbEVudi5HZXQoKSwgcEZvcm1GaWVsZCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworICB9CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6YnV0dG9uR2V0Q2FwdGlvbigKKyAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaW50IG5mYWNlID0gMDsKKyAgaW50IGlTaXplID0gcGFyYW1zLnNpemUoKTsKKyAgaWYgKGlTaXplID49IDEpCisgICAgbmZhY2UgPSBwUnVudGltZS0+VG9JbnQzMihwYXJhbXNbMF0pOworCisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGb3JtRmllbGRUeXBlOjprUHVzaEJ1dHRvbikKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7CisgIGlmICghcEZvcm1Db250cm9sKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBpZiAobmZhY2UgPT0gMCkgeworICAgIHJldHVybiBDSlNfUmV0dXJuKAorICAgICAgICBwUnVudGltZS0+TmV3U3RyaW5nKHBGb3JtQ29udHJvbC0+R2V0Tm9ybWFsQ2FwdGlvbigpLmNfc3RyKCkpKTsKKyAgfSBlbHNlIGlmIChuZmFjZSA9PSAxKSB7CisgICAgcmV0dXJuIENKU19SZXR1cm4oCisgICAgICAgIHBSdW50aW1lLT5OZXdTdHJpbmcocEZvcm1Db250cm9sLT5HZXREb3duQ2FwdGlvbigpLmNfc3RyKCkpKTsKKyAgfSBlbHNlIGlmIChuZmFjZSA9PSAyKSB7CisgICAgcmV0dXJuIENKU19SZXR1cm4oCisgICAgICAgIHBSdW50aW1lLT5OZXdTdHJpbmcocEZvcm1Db250cm9sLT5HZXRSb2xsb3ZlckNhcHRpb24oKS5jX3N0cigpKSk7CisgIH0KKyAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpidXR0b25HZXRJY29uKAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSA+PSAxKSB7CisgICAgaW50IG5GYWNlID0gcFJ1bnRpbWUtPlRvSW50MzIocGFyYW1zWzBdKTsKKyAgICBpZiAobkZhY2UgPCAwIHx8IG5GYWNlID4gMikKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIGlmIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGb3JtRmllbGRUeXBlOjprUHVzaEJ1dHRvbikKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERl9Gb3JtQ29udHJvbCogcEZvcm1Db250cm9sID0gR2V0U21hcnRGaWVsZENvbnRyb2wocEZvcm1GaWVsZCk7CisgIGlmICghcEZvcm1Db250cm9sKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiA9CisgICAgICBwUnVudGltZS0+TmV3RnhEeW5hbWljT2JqKENKU19JY29uOjpHZXRPYmpEZWZuSUQoKSk7CisgIGlmIChwT2JqLklzRW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ0pTX0ljb24qIHBKU19JY29uID0gc3RhdGljX2Nhc3Q8Q0pTX0ljb24qPihwUnVudGltZS0+R2V0T2JqZWN0UHJpdmF0ZShwT2JqKSk7CisgIGlmICghcEpTX0ljb24pCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworICByZXR1cm4gQ0pTX1JldHVybihwSlNfSWNvbi0+VG9WOE9iamVjdCgpKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6YnV0dG9uSW1wb3J0SWNvbigKKyAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OmJ1dHRvblNldENhcHRpb24oCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6YnV0dG9uU2V0SWNvbigKKyAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpjaGVja1RoaXNCb3goCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGludCBpU2l6ZSA9IHBhcmFtcy5zaXplKCk7CisgIGlmIChpU2l6ZSA8IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIGlmICghbV9iQ2FuU2V0KQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBpbnQgbldpZGdldCA9IHBSdW50aW1lLT5Ub0ludDMyKHBhcmFtc1swXSk7CisgIGJvb2wgYkNoZWNraXQgPSB0cnVlOworICBpZiAoaVNpemUgPj0gMikKKyAgICBiQ2hlY2tpdCA9IHBSdW50aW1lLT5Ub0Jvb2xlYW4ocGFyYW1zWzFdKTsKKworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgPSBGaWVsZEFycmF5WzBdOworICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgIT0gRm9ybUZpZWxkVHlwZTo6a0NoZWNrQm94ICYmCisgICAgICBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSAhPSBGb3JtRmllbGRUeXBlOjprUmFkaW9CdXR0b24pIHsKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisgIH0KKyAgaWYgKG5XaWRnZXQgPCAwIHx8IG5XaWRnZXQgPj0gcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKyAgLy8gVE9ETyh3ZWlsaSk6IENoZWNrIHdoZXRoZXIgYW55dGhpbmcgc3BlY2lhbCBuZWVkZWQgZm9yIHJhZGlvIGJ1dHRvbiwKKyAgLy8gb3RoZXJ3aXNlIG1lcmdlIHRoZXNlIGJyYW5jaGVzLgorICBpZiAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRm9ybUZpZWxkVHlwZTo6a1JhZGlvQnV0dG9uKQorICAgIHBGb3JtRmllbGQtPkNoZWNrQ29udHJvbChuV2lkZ2V0LCBiQ2hlY2tpdCwgdHJ1ZSk7CisgIGVsc2UKKyAgICBwRm9ybUZpZWxkLT5DaGVja0NvbnRyb2wobldpZGdldCwgYkNoZWNraXQsIHRydWUpOworCisgIFVwZGF0ZUZvcm1GaWVsZChtX3BGb3JtRmlsbEVudi5HZXQoKSwgcEZvcm1GaWVsZCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpjbGVhckl0ZW1zKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OmRlZmF1bHRJc0NoZWNrZWQoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmICghbV9iQ2FuU2V0KQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOworICBpZiAoaVNpemUgPCAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBpbnQgbldpZGdldCA9IHBSdW50aW1lLT5Ub0ludDMyKHBhcmFtc1swXSk7CisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIGlmIChuV2lkZ2V0IDwgMCB8fCBuV2lkZ2V0ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld0Jvb2xlYW4oCisgICAgICBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGb3JtRmllbGRUeXBlOjprQ2hlY2tCb3ggfHwKKyAgICAgIHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZvcm1GaWVsZFR5cGU6OmtSYWRpb0J1dHRvbikpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpkZWxldGVJdGVtQXQoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpnZXRBcnJheShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBzdGQ6OnZlY3RvcjxDUERGX0Zvcm1GaWVsZCo+IEZpZWxkQXJyYXkgPSBHZXRGb3JtRmllbGRzKG1fRmllbGROYW1lKTsKKyAgaWYgKEZpZWxkQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFdpZGVTdHJpbmc+PiBzd1NvcnQ7CisgIGZvciAoQ1BERl9Gb3JtRmllbGQqIHBGb3JtRmllbGQgOiBGaWVsZEFycmF5KSB7CisgICAgc3dTb3J0LnB1c2hfYmFjaygKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFdpZGVTdHJpbmc+KG5ldyBXaWRlU3RyaW5nKHBGb3JtRmllbGQtPkdldEZ1bGxOYW1lKCkpKSk7CisgIH0KKworICBzdGQ6OnNvcnQoc3dTb3J0LmJlZ2luKCksIHN3U29ydC5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxXaWRlU3RyaW5nPiYgcDEsCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8V2lkZVN0cmluZz4mIHAyKSB7IHJldHVybiAqcDEgPCAqcDI7IH0pOworCisgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IEZvcm1GaWVsZEFycmF5ID0gcFJ1bnRpbWUtPk5ld0FycmF5KCk7CisgIGludCBqID0gMDsKKyAgZm9yIChjb25zdCBhdXRvJiBwU3RyIDogc3dTb3J0KSB7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmogPQorICAgICAgICBwUnVudGltZS0+TmV3RnhEeW5hbWljT2JqKENKU19GaWVsZDo6R2V0T2JqRGVmbklEKCkpOworICAgIGlmIChwT2JqLklzRW1wdHkoKSkKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICAgIENKU19GaWVsZCogcEpTRmllbGQgPQorICAgICAgICBzdGF0aWNfY2FzdDxDSlNfRmllbGQqPihwUnVudGltZS0+R2V0T2JqZWN0UHJpdmF0ZShwT2JqKSk7CisgICAgRmllbGQqIHBGaWVsZCA9IHN0YXRpY19jYXN0PEZpZWxkKj4ocEpTRmllbGQtPkdldEVtYmVkT2JqZWN0KCkpOworICAgIHBGaWVsZC0+QXR0YWNoRmllbGQobV9wSlNEb2MsICpwU3RyKTsKKyAgICBwUnVudGltZS0+UHV0QXJyYXlFbGVtZW50KEZvcm1GaWVsZEFycmF5LCBqKyssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSlNGaWVsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdjg6OkxvY2FsPHY4OjpWYWx1ZT4ocEpTRmllbGQtPlRvVjhPYmplY3QoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHY4OjpMb2NhbDx2ODo6VmFsdWU+KCkpOworICB9CisgIHJldHVybiBDSlNfUmV0dXJuKEZvcm1GaWVsZEFycmF5KTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6Z2V0SXRlbUF0KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpbnQgaVNpemUgPSBwYXJhbXMuc2l6ZSgpOworICBpbnQgbklkeCA9IC0xOworICBpZiAoaVNpemUgPj0gMSkKKyAgICBuSWR4ID0gcFJ1bnRpbWUtPlRvSW50MzIocGFyYW1zWzBdKTsKKworICBib29sIGJFeHBvcnQgPSB0cnVlOworICBpZiAoaVNpemUgPj0gMikKKyAgICBiRXhwb3J0ID0gcFJ1bnRpbWUtPlRvQm9vbGVhbihwYXJhbXNbMV0pOworCisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIGlmICgocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRm9ybUZpZWxkVHlwZTo6a0xpc3RCb3gpIHx8CisgICAgICAocEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRm9ybUZpZWxkVHlwZTo6a0NvbWJvQm94KSkgeworICAgIGlmIChuSWR4ID09IC0xIHx8IG5JZHggPiBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKSkKKyAgICAgIG5JZHggPSBwRm9ybUZpZWxkLT5Db3VudE9wdGlvbnMoKSAtIDE7CisgICAgaWYgKGJFeHBvcnQpIHsKKyAgICAgIFdpZGVTdHJpbmcgc3RydmFsID0gcEZvcm1GaWVsZC0+R2V0T3B0aW9uVmFsdWUobklkeCk7CisgICAgICBpZiAoc3RydmFsLklzRW1wdHkoKSkgeworICAgICAgICByZXR1cm4gQ0pTX1JldHVybigKKyAgICAgICAgICAgIHBSdW50aW1lLT5OZXdTdHJpbmcocEZvcm1GaWVsZC0+R2V0T3B0aW9uTGFiZWwobklkeCkuY19zdHIoKSkpOworICAgICAgfQorICAgICAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1N0cmluZyhzdHJ2YWwuY19zdHIoKSkpOworICAgIH0KKyAgICByZXR1cm4gQ0pTX1JldHVybigKKyAgICAgICAgcFJ1bnRpbWUtPk5ld1N0cmluZyhwRm9ybUZpZWxkLT5HZXRPcHRpb25MYWJlbChuSWR4KS5jX3N0cigpKSk7CisgIH0KKyAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjpnZXRMb2NrKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjppbnNlcnRJdGVtQXQoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIEZpZWxkOjppc0JveENoZWNrZWQoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGludCBuSW5kZXggPSAtMTsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMSkKKyAgICBuSW5kZXggPSBwUnVudGltZS0+VG9JbnQzMihwYXJhbXNbMF0pOworCisgIHN0ZDo6dmVjdG9yPENQREZfRm9ybUZpZWxkKj4gRmllbGRBcnJheSA9IEdldEZvcm1GaWVsZHMobV9GaWVsZE5hbWUpOworICBpZiAoRmllbGRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCA9IEZpZWxkQXJyYXlbMF07CisgIGlmIChuSW5kZXggPCAwIHx8IG5JbmRleCA+PSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdCb29sZWFuKAorICAgICAgKChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGb3JtRmllbGRUeXBlOjprQ2hlY2tCb3ggfHwKKyAgICAgICAgcEZvcm1GaWVsZC0+R2V0RmllbGRUeXBlKCkgPT0gRm9ybUZpZWxkVHlwZTo6a1JhZGlvQnV0dG9uKSAmJgorICAgICAgIHBGb3JtRmllbGQtPkdldENvbnRyb2wobkluZGV4KS0+SXNDaGVja2VkKCkgIT0gMCkpKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6aXNEZWZhdWx0Q2hlY2tlZCgKKyAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaW50IG5JbmRleCA9IC0xOworICBpZiAocGFyYW1zLnNpemUoKSA+PSAxKQorICAgIG5JbmRleCA9IHBSdW50aW1lLT5Ub0ludDMyKHBhcmFtc1swXSk7CisKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgaWYgKG5JbmRleCA8IDAgfHwgbkluZGV4ID49IHBGb3JtRmllbGQtPkNvdW50Q29udHJvbHMoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld0Jvb2xlYW4oCisgICAgICAoKHBGb3JtRmllbGQtPkdldEZpZWxkVHlwZSgpID09IEZvcm1GaWVsZFR5cGU6OmtDaGVja0JveCB8fAorICAgICAgICBwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSA9PSBGb3JtRmllbGRUeXBlOjprUmFkaW9CdXR0b24pICYmCisgICAgICAgcEZvcm1GaWVsZC0+R2V0Q29udHJvbChuSW5kZXgpLT5Jc0RlZmF1bHRDaGVja2VkKCkgIT0gMCkpKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6c2V0QWN0aW9uKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6c2V0Rm9jdXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBGaWVsZEFycmF5ID0gR2V0Rm9ybUZpZWxkcyhtX0ZpZWxkTmFtZSk7CisgIGlmIChGaWVsZEFycmF5LmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gRmllbGRBcnJheVswXTsKKyAgaW50MzJfdCBuQ291bnQgPSBwRm9ybUZpZWxkLT5Db3VudENvbnRyb2xzKCk7CisgIGlmIChuQ291bnQgPCAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDUERGU0RLX0ludGVyRm9ybSogcEludGVyRm9ybSA9IG1fcEZvcm1GaWxsRW52LT5HZXRJbnRlckZvcm0oKTsKKyAgQ1BERlNES19XaWRnZXQqIHBXaWRnZXQgPSBudWxscHRyOworICBpZiAobkNvdW50ID09IDEpIHsKKyAgICBwV2lkZ2V0ID0gcEludGVyRm9ybS0+R2V0V2lkZ2V0KHBGb3JtRmllbGQtPkdldENvbnRyb2woMCkpOworICB9IGVsc2UgeworICAgIFVuZGVybHlpbmdQYWdlVHlwZSogcFBhZ2UgPQorICAgICAgICBVbmRlcmx5aW5nRnJvbUZQREZQYWdlKG1fcEZvcm1GaWxsRW52LT5HZXRDdXJyZW50UGFnZSgKKyAgICAgICAgICAgIG1fcEZvcm1GaWxsRW52LT5HZXRVbmRlcmx5aW5nRG9jdW1lbnQoKSkpOworICAgIGlmICghcFBhZ2UpCisgICAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisgICAgaWYgKENQREZTREtfUGFnZVZpZXcqIHBDdXJQYWdlVmlldyA9CisgICAgICAgICAgICBtX3BGb3JtRmlsbEVudi0+R2V0UGFnZVZpZXcocFBhZ2UsIHRydWUpKSB7CisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgeworICAgICAgICBpZiAoQ1BERlNES19XaWRnZXQqIHBUZW1wV2lkZ2V0ID0KKyAgICAgICAgICAgICAgICBwSW50ZXJGb3JtLT5HZXRXaWRnZXQocEZvcm1GaWVsZC0+R2V0Q29udHJvbChpKSkpIHsKKyAgICAgICAgICBpZiAocFRlbXBXaWRnZXQtPkdldFBERlBhZ2UoKSA9PSBwQ3VyUGFnZVZpZXctPkdldFBERlBhZ2UoKSkgeworICAgICAgICAgICAgcFdpZGdldCA9IHBUZW1wV2lkZ2V0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKHBXaWRnZXQpIHsKKyAgICBDUERGU0RLX0Fubm90OjpPYnNlcnZlZFB0ciBwT2JzZXJ2ZWQocFdpZGdldCk7CisgICAgbV9wRm9ybUZpbGxFbnYtPlNldEZvY3VzQW5ub3QoJnBPYnNlcnZlZCk7CisgIH0KKworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6c2V0SXRlbXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldExvY2soQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNpZ25hdHVyZUdldE1vZGlmaWNhdGlvbnMoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6c2lnbmF0dXJlR2V0U2VlZFZhbHVlKAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNpZ25hdHVyZUluZm8oCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6c2lnbmF0dXJlU2V0U2VlZFZhbHVlKAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNpZ25hdHVyZVNpZ24oCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6c2lnbmF0dXJlVmFsaWRhdGUoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBGaWVsZDo6Z2V0X3NvdXJjZShDSlNfUnVudGltZSogcFJ1bnRpbWUpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gRmllbGQ6OnNldF9zb3VyY2UoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKwordm9pZCBGaWVsZDo6QWRkRGVsYXlfSW50KEZJRUxEX1BST1AgcHJvcCwgaW50MzJfdCBuKSB7CisgIENKU19EZWxheURhdGEqIHBOZXdEYXRhID0KKyAgICAgIG5ldyBDSlNfRGVsYXlEYXRhKHByb3AsIG1fbkZvcm1Db250cm9sSW5kZXgsIG1fRmllbGROYW1lKTsKKyAgcE5ld0RhdGEtPm51bSA9IG47CisgIG1fcEpTRG9jLT5BZGREZWxheURhdGEocE5ld0RhdGEpOworfQorCit2b2lkIEZpZWxkOjpBZGREZWxheV9Cb29sKEZJRUxEX1BST1AgcHJvcCwgYm9vbCBiKSB7CisgIENKU19EZWxheURhdGEqIHBOZXdEYXRhID0KKyAgICAgIG5ldyBDSlNfRGVsYXlEYXRhKHByb3AsIG1fbkZvcm1Db250cm9sSW5kZXgsIG1fRmllbGROYW1lKTsKKyAgcE5ld0RhdGEtPmIgPSBiOworICBtX3BKU0RvYy0+QWRkRGVsYXlEYXRhKHBOZXdEYXRhKTsKK30KKwordm9pZCBGaWVsZDo6QWRkRGVsYXlfU3RyaW5nKEZJRUxEX1BST1AgcHJvcCwgY29uc3QgQnl0ZVN0cmluZyYgc3RyaW5nKSB7CisgIENKU19EZWxheURhdGEqIHBOZXdEYXRhID0KKyAgICAgIG5ldyBDSlNfRGVsYXlEYXRhKHByb3AsIG1fbkZvcm1Db250cm9sSW5kZXgsIG1fRmllbGROYW1lKTsKKyAgcE5ld0RhdGEtPnN0cmluZyA9IHN0cmluZzsKKyAgbV9wSlNEb2MtPkFkZERlbGF5RGF0YShwTmV3RGF0YSk7Cit9CisKK3ZvaWQgRmllbGQ6OkFkZERlbGF5X1JlY3QoRklFTERfUFJPUCBwcm9wLCBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KSB7CisgIENKU19EZWxheURhdGEqIHBOZXdEYXRhID0KKyAgICAgIG5ldyBDSlNfRGVsYXlEYXRhKHByb3AsIG1fbkZvcm1Db250cm9sSW5kZXgsIG1fRmllbGROYW1lKTsKKyAgcE5ld0RhdGEtPnJlY3QgPSByZWN0OworICBtX3BKU0RvYy0+QWRkRGVsYXlEYXRhKHBOZXdEYXRhKTsKK30KKwordm9pZCBGaWVsZDo6QWRkRGVsYXlfV29yZEFycmF5KEZJRUxEX1BST1AgcHJvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGFycmF5KSB7CisgIENKU19EZWxheURhdGEqIHBOZXdEYXRhID0KKyAgICAgIG5ldyBDSlNfRGVsYXlEYXRhKHByb3AsIG1fbkZvcm1Db250cm9sSW5kZXgsIG1fRmllbGROYW1lKTsKKyAgcE5ld0RhdGEtPndvcmRhcnJheSA9IGFycmF5OworICBtX3BKU0RvYy0+QWRkRGVsYXlEYXRhKHBOZXdEYXRhKTsKK30KKwordm9pZCBGaWVsZDo6QWRkRGVsYXlfV2lkZVN0cmluZ0FycmF5KEZJRUxEX1BST1AgcHJvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nPiYgYXJyYXkpIHsKKyAgQ0pTX0RlbGF5RGF0YSogcE5ld0RhdGEgPQorICAgICAgbmV3IENKU19EZWxheURhdGEocHJvcCwgbV9uRm9ybUNvbnRyb2xJbmRleCwgbV9GaWVsZE5hbWUpOworICBwTmV3RGF0YS0+d2lkZXN0cmluZ2FycmF5ID0gYXJyYXk7CisgIG1fcEpTRG9jLT5BZGREZWxheURhdGEocE5ld0RhdGEpOworfQorCit2b2lkIEZpZWxkOjpEb0RlbGF5KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAorICAgICAgICAgICAgICAgICAgICBDSlNfRGVsYXlEYXRhKiBwRGF0YSkgeworICBBU1NFUlQocEZvcm1GaWxsRW52KTsKKyAgc3dpdGNoIChwRGF0YS0+ZVByb3ApIHsKKyAgICBjYXNlIEZQX0JPUkRFUlNUWUxFOgorICAgICAgRmllbGQ6OlNldEJvcmRlclN0eWxlKHBGb3JtRmlsbEVudiwgcERhdGEtPnNGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPm5Db250cm9sSW5kZXgsIHBEYXRhLT5zdHJpbmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUF9DVVJSRU5UVkFMVUVJTkRJQ0VTOgorICAgICAgRmllbGQ6OlNldEN1cnJlbnRWYWx1ZUluZGljZXMocEZvcm1GaWxsRW52LCBwRGF0YS0+c0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5uQ29udHJvbEluZGV4LCBwRGF0YS0+d29yZGFycmF5KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlBfRElTUExBWToKKyAgICAgIEZpZWxkOjpTZXREaXNwbGF5KHBGb3JtRmlsbEVudiwgcERhdGEtPnNGaWVsZE5hbWUsIHBEYXRhLT5uQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPm51bSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZQX0hJRERFTjoKKyAgICAgIEZpZWxkOjpTZXRIaWRkZW4ocEZvcm1GaWxsRW52LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlBfTElORVdJRFRIOgorICAgICAgRmllbGQ6OlNldExpbmVXaWR0aChwRm9ybUZpbGxFbnYsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPm51bSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZQX1JFQ1Q6CisgICAgICBGaWVsZDo6U2V0UmVjdChwRm9ybUZpbGxFbnYsIHBEYXRhLT5zRmllbGROYW1lLCBwRGF0YS0+bkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5yZWN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlBfVkFMVUU6CisgICAgICBGaWVsZDo6U2V0VmFsdWUocEZvcm1GaWxsRW52LCBwRGF0YS0+c0ZpZWxkTmFtZSwgcERhdGEtPm5Db250cm9sSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPndpZGVzdHJpbmdhcnJheSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgTk9UUkVBQ0hFRCgpOworICB9Cit9CmRpZmYgLS1naXQgYS9meGpzL2Nqc19maWVsZC5oIGIvZnhqcy9janNfZmllbGQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTE2ZTA3Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfZmllbGQuaApAQCAtMCwwICsxLDQzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfQ0pTX0ZJRUxEX0hfCisjZGVmaW5lIEZYSlNfQ0pTX0ZJRUxEX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnhqcy9KU19EZWZpbmUuaCIKKworY2xhc3MgQ1BERl9Gb3JtQ29udHJvbDsKK2NsYXNzIENQREZTREtfV2lkZ2V0OworY2xhc3MgRG9jdW1lbnQ7CitzdHJ1Y3QgQ0pTX0RlbGF5RGF0YTsKKworZW51bSBGSUVMRF9QUk9QIHsKKyAgRlBfQk9SREVSU1RZTEUsCisgIEZQX0NVUlJFTlRWQUxVRUlORElDRVMsCisgIEZQX0RJU1BMQVksCisgIEZQX0hJRERFTiwKKyAgRlBfTElORVdJRFRILAorICBGUF9SRUNULAorICBGUF9WQUxVRQorfTsKKworY2xhc3MgRmllbGQgOiBwdWJsaWMgQ0pTX0VtYmVkT2JqIHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIERvRGVsYXkoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCisgICAgICAgICAgICAgICAgICAgICAgQ0pTX0RlbGF5RGF0YSogcERhdGEpOworCisgIGV4cGxpY2l0IEZpZWxkKENKU19PYmplY3QqIHBKU09iamVjdCk7CisgIH5GaWVsZCgpIG92ZXJyaWRlOworCisgIENKU19SZXR1cm4gZ2V0X2FsaWdubWVudChDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9hbGlnbm1lbnQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfYm9yZGVyX3N0eWxlKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2JvcmRlcl9zdHlsZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9idXR0b25fYWxpZ25feChDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9idXR0b25fYWxpZ25feChDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9idXR0b25fYWxpZ25feShDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9idXR0b25fYWxpZ25feShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9idXR0b25fZml0X2JvdW5kcyhDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9idXR0b25fZml0X2JvdW5kcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9idXR0b25fcG9zaXRpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfYnV0dG9uX3Bvc2l0aW9uKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9idXR0b25fc2NhbGVfaG93KENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2J1dHRvbl9zY2FsZV9ob3coQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9idXR0b25fc2NhbGVfd2hlbihDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9idXR0b25fc2NhbGVfd2hlbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9jYWxjX29yZGVyX2luZGV4KENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2NhbGNfb3JkZXJfaW5kZXgoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9jaGFyX2xpbWl0KENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2NoYXJfbGltaXQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfY29tYihDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9jb21iKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X2NvbW1pdF9vbl9zZWxfY2hhbmdlKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2NvbW1pdF9vbl9zZWxfY2hhbmdlKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X2N1cnJlbnRfdmFsdWVfaW5kaWNlcyhDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9jdXJyZW50X3ZhbHVlX2luZGljZXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X2RlZmF1bHRfc3R5bGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfZGVmYXVsdF9zdHlsZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9kZWZhdWx0X3ZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2RlZmF1bHRfdmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfZG9fbm90X3Njcm9sbChDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9kb19ub3Rfc2Nyb2xsKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X2RvX25vdF9zcGVsbF9jaGVjayhDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9kb19ub3Rfc3BlbGxfY2hlY2soQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X2RlbGF5KENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2RlbGF5KENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X2Rpc3BsYXkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfZGlzcGxheShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9kb2MoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfZG9jKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X2VkaXRhYmxlKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2VkaXRhYmxlKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X2V4cG9ydF92YWx1ZXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfZXhwb3J0X3ZhbHVlcyhDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9maWxlX3NlbGVjdChDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9maWxlX3NlbGVjdChDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9maWxsX2NvbG9yKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2ZpbGxfY29sb3IoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfaGlkZGVuKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X2hpZGRlbihDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9oaWdobGlnaHQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfaGlnaGxpZ2h0KENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X2xpbmVfd2lkdGgoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfbGluZV93aWR0aChDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9tdWx0aWxpbmUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfbXVsdGlsaW5lKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X211bHRpcGxlX3NlbGVjdGlvbihDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9tdWx0aXBsZV9zZWxlY3Rpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X25hbWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfbmFtZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9udW1faXRlbXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfbnVtX2l0ZW1zKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X3BhZ2UoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfcGFnZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9wYXNzd29yZChDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9wYXNzd29yZChDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9wcmludChDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9wcmludChDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9yYWRpb3NfaW5fdW5pc29uKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X3JhZGlvc19pbl91bmlzb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9yZWFkb25seShDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9yZWFkb25seShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9yZWN0KENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X3JlY3QoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfcmVxdWlyZWQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfcmVxdWlyZWQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfcmljaF90ZXh0KENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X3JpY2hfdGV4dChDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9yaWNoX3ZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X3JpY2hfdmFsdWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfcm90YXRpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfcm90YXRpb24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfc3Ryb2tlX2NvbG9yKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X3N0cm9rZV9jb2xvcihDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9zdHlsZShDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9zdHlsZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF9zdWJtaXRfbmFtZShDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9zdWJtaXRfbmFtZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF90ZXh0X2NvbG9yKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X3RleHRfY29sb3IoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBnZXRfdGV4dF9mb250KENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X3RleHRfZm9udChDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF90ZXh0X3NpemUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfdGV4dF9zaXplKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X3R5cGUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfdHlwZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKTsKKworICBDSlNfUmV0dXJuIGdldF91c2VyX25hbWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKTsKKyAgQ0pTX1JldHVybiBzZXRfdXNlcl9uYW1lKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X3ZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X3ZhbHVlKENKU19SdW50aW1lKiBwUnVudGltZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X3ZhbHVlX2FzX3N0cmluZyhDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF92YWx1ZV9hc19zdHJpbmcoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdnApOworCisgIENKU19SZXR1cm4gZ2V0X3NvdXJjZShDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICBDSlNfUmV0dXJuIHNldF9zb3VyY2UoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgQ0pTX1JldHVybiBicm93c2VGb3JGaWxlVG9TdWJtaXQoCisgICAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gYnV0dG9uR2V0Q2FwdGlvbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gYnV0dG9uR2V0SWNvbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gYnV0dG9uSW1wb3J0SWNvbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gYnV0dG9uU2V0Q2FwdGlvbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gYnV0dG9uU2V0SWNvbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gY2hlY2tUaGlzQm94KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGNsZWFySXRlbXMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGRlZmF1bHRJc0NoZWNrZWQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGRlbGV0ZUl0ZW1BdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBnZXRBcnJheShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGdldEl0ZW1BdChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBnZXRMb2NrKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBpbnNlcnRJdGVtQXQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gaXNCb3hDaGVja2VkKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGlzRGVmYXVsdENoZWNrZWQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIHNldEFjdGlvbihDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBzZXRGb2N1cyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIHNldEl0ZW1zKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gc2V0TG9jayhDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gc2lnbmF0dXJlR2V0TW9kaWZpY2F0aW9ucygKKyAgICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBzaWduYXR1cmVHZXRTZWVkVmFsdWUoCisgICAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gc2lnbmF0dXJlSW5mbyhDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gc2lnbmF0dXJlU2V0U2VlZFZhbHVlKAorICAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIHNpZ25hdHVyZVNpZ24oQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIHNpZ25hdHVyZVZhbGlkYXRlKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisKKyAgYm9vbCBBdHRhY2hGaWVsZChEb2N1bWVudCogcERvY3VtZW50LCBjb25zdCBXaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSk7CisKKyBwcml2YXRlOgorICBzdGF0aWMgdm9pZCBTZXRCb3JkZXJTdHlsZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBzdHJpbmcpOworICBzdGF0aWMgdm9pZCBTZXRDdXJyZW50VmFsdWVJbmRpY2VzKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYXJyYXkpOworICBzdGF0aWMgdm9pZCBTZXREaXNwbGF5KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpOworICBzdGF0aWMgdm9pZCBTZXRIaWRkZW4oQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiKTsKKyAgc3RhdGljIHZvaWQgU2V0TGluZVdpZHRoKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgc3dGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpOworICBzdGF0aWMgdm9pZCBTZXRNdWx0aWxpbmUoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ29udHJvbEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiKTsKKyAgc3RhdGljIHZvaWQgU2V0UmVjdChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzd0ZpZWxkTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KTsKKyAgc3RhdGljIHZvaWQgU2V0VmFsdWUoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHN3RmllbGROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvbnRyb2xJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8V2lkZVN0cmluZz4mIHN0ckFycmF5KTsKKworICBzdGF0aWMgdm9pZCBVcGRhdGVGb3JtRmllbGQoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNoYW5nZU1hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZXNldEFQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmVmcmVzaCk7CisgIHN0YXRpYyB2b2lkIFVwZGF0ZUZvcm1Db250cm9sKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNoYW5nZU1hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJlc2V0QVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJlZnJlc2gpOworCisgIHN0YXRpYyBDUERGU0RLX1dpZGdldCogR2V0V2lkZ2V0KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1Db250cm9sKiBwRm9ybUNvbnRyb2wpOworICBzdGF0aWMgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBHZXRGb3JtRmllbGRzKAorICAgICAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCisgICAgICBjb25zdCBXaWRlU3RyaW5nJiBjc0ZpZWxkTmFtZSk7CisKKyAgdm9pZCBTZXREZWxheShib29sIGJEZWxheSk7CisgIHZvaWQgUGFyc2VGaWVsZE5hbWUoY29uc3Qgc3RkOjp3c3RyaW5nJiBzdHJGaWVsZE5hbWVQYXJzZWQsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjp3c3RyaW5nJiBzdHJGaWVsZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgaW50JiBpQ29udHJvbE5vKTsKKyAgc3RkOjp2ZWN0b3I8Q1BERl9Gb3JtRmllbGQqPiBHZXRGb3JtRmllbGRzKAorICAgICAgY29uc3QgV2lkZVN0cmluZyYgY3NGaWVsZE5hbWUpIGNvbnN0OworICBDUERGX0Zvcm1Db250cm9sKiBHZXRTbWFydEZpZWxkQ29udHJvbChDUERGX0Zvcm1GaWVsZCogcEZvcm1GaWVsZCk7CisgIGJvb2wgVmFsdWVJc09jY3VyKENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkLCBXaWRlU3RyaW5nIGNzT3B0TGFiZWwpOworCisgIHZvaWQgQWRkRGVsYXlfSW50KEZJRUxEX1BST1AgcHJvcCwgaW50MzJfdCBuKTsKKyAgdm9pZCBBZGREZWxheV9Cb29sKEZJRUxEX1BST1AgcHJvcCwgYm9vbCBiKTsKKyAgdm9pZCBBZGREZWxheV9TdHJpbmcoRklFTERfUFJPUCBwcm9wLCBjb25zdCBCeXRlU3RyaW5nJiBzdHJpbmcpOworICB2b2lkIEFkZERlbGF5X1JlY3QoRklFTERfUFJPUCBwcm9wLCBjb25zdCBDRlhfRmxvYXRSZWN0JiByZWN0KTsKKyAgdm9pZCBBZGREZWxheV9Xb3JkQXJyYXkoRklFTERfUFJPUCBwcm9wLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGFycmF5KTsKKyAgdm9pZCBBZGREZWxheV9XaWRlU3RyaW5nQXJyYXkoRklFTERfUFJPUCBwcm9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nPiYgYXJyYXkpOworCisgIHZvaWQgRG9EZWxheSgpOworCisgIERvY3VtZW50KiBtX3BKU0RvYzsKKyAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OjpPYnNlcnZlZFB0ciBtX3BGb3JtRmlsbEVudjsKKyAgV2lkZVN0cmluZyBtX0ZpZWxkTmFtZTsKKyAgaW50IG1fbkZvcm1Db250cm9sSW5kZXg7CisgIGJvb2wgbV9iQ2FuU2V0OworICBib29sIG1fYkRlbGF5OworfTsKKworY2xhc3MgQ0pTX0ZpZWxkIDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgc3RhdGljIGludCBHZXRPYmpEZWZuSUQoKTsKKyAgc3RhdGljIHZvaWQgRGVmaW5lSlNPYmplY3RzKENGWEpTX0VuZ2luZSogcEVuZ2luZSk7CisKKyAgZXhwbGljaXQgQ0pTX0ZpZWxkKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge30KKyAgfkNKU19GaWVsZCgpIG92ZXJyaWRlIHt9CisKKyAgdm9pZCBJbml0SW5zdGFuY2UoSUpTX1J1bnRpbWUqIHBJUnVudGltZSkgb3ZlcnJpZGU7CisKKyAgSlNfU1RBVElDX1BST1AoYWxpZ25tZW50LCBhbGlnbm1lbnQsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoYm9yZGVyU3R5bGUsIGJvcmRlcl9zdHlsZSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChidXR0b25BbGlnblgsIGJ1dHRvbl9hbGlnbl94LCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGJ1dHRvbkFsaWduWSwgYnV0dG9uX2FsaWduX3ksIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoYnV0dG9uRml0Qm91bmRzLCBidXR0b25fZml0X2JvdW5kcywgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChidXR0b25Qb3NpdGlvbiwgYnV0dG9uX3Bvc2l0aW9uLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGJ1dHRvblNjYWxlSG93LCBidXR0b25fc2NhbGVfaG93LCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKEJ1dHRvblNjYWxlV2hlbiwgYnV0dG9uX3NjYWxlX3doZW4sIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoY2FsY09yZGVySW5kZXgsIGNhbGNfb3JkZXJfaW5kZXgsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoY2hhckxpbWl0LCBjaGFyX2xpbWl0LCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGNvbWIsIGNvbWIsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoY29tbWl0T25TZWxDaGFuZ2UsIGNvbW1pdF9vbl9zZWxfY2hhbmdlLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGN1cnJlbnRWYWx1ZUluZGljZXMsIGN1cnJlbnRfdmFsdWVfaW5kaWNlcywgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChkZWZhdWx0U3R5bGUsIGRlZmF1bHRfc3R5bGUsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoZGVmYXVsdFZhbHVlLCBkZWZhdWx0X3ZhbHVlLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGRvTm90U2Nyb2xsLCBkb19ub3Rfc2Nyb2xsLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGRvTm90U3BlbGxDaGVjaywgZG9fbm90X3NwZWxsX2NoZWNrLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGRlbGF5LCBkZWxheSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChkaXNwbGF5LCBkaXNwbGF5LCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGRvYywgZG9jLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGVkaXRhYmxlLCBlZGl0YWJsZSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChleHBvcnRWYWx1ZXMsIGV4cG9ydF92YWx1ZXMsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoZmlsZVNlbGVjdCwgZmlsZV9zZWxlY3QsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AoZmlsbENvbG9yLCBmaWxsX2NvbG9yLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGhpZGRlbiwgaGlkZGVuLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGhpZ2hsaWdodCwgaGlnaGxpZ2h0LCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKGxpbmVXaWR0aCwgbGluZV93aWR0aCwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChtdWx0aWxpbmUsIG11bHRpbGluZSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChtdWx0aXBsZVNlbGVjdGlvbiwgbXVsdGlwbGVfc2VsZWN0aW9uLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKG5hbWUsIG5hbWUsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AobnVtSXRlbXMsIG51bV9pdGVtcywgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChwYWdlLCBwYWdlLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKHBhc3N3b3JkLCBwYXNzd29yZCwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChwcmludCwgcHJpbnQsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AocmFkaW9zSW5Vbmlzb24sIHJhZGlvc19pbl91bmlzb24sIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AocmVhZG9ubHksIHJlYWRvbmx5LCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKHJlY3QsIHJlY3QsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AocmVxdWlyZWQsIHJlcXVpcmVkLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKHJpY2hUZXh0LCByaWNoX3RleHQsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AocmljaFZhbHVlLCByaWNoX3ZhbHVlLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKHJvdGF0aW9uLCByb3RhdGlvbiwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChzdHJva2VDb2xvciwgc3Ryb2tlX2NvbG9yLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKHN0eWxlLCBzdHlsZSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUChzdWJtaXROYW1lLCBzdWJtaXRfbmFtZSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUCh0ZXh0Q29sb3IsIHRleHRfY29sb3IsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AodGV4dEZvbnQsIHRleHRfZm9udCwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUCh0ZXh0U2l6ZSwgdGV4dF9zaXplLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKHR5cGUsIHR5cGUsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AodXNlck5hbWUsIHVzZXJfbmFtZSwgRmllbGQpOworICBKU19TVEFUSUNfUFJPUCh2YWx1ZSwgdmFsdWUsIEZpZWxkKTsKKyAgSlNfU1RBVElDX1BST1AodmFsdWVBc1N0cmluZywgdmFsdWVfYXNfc3RyaW5nLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19QUk9QKHNvdXJjZSwgc291cmNlLCBGaWVsZCk7CisKKyAgSlNfU1RBVElDX01FVEhPRChicm93c2VGb3JGaWxlVG9TdWJtaXQsIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChidXR0b25HZXRDYXB0aW9uLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoYnV0dG9uR2V0SWNvbiwgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKGJ1dHRvbkltcG9ydEljb24sIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChidXR0b25TZXRDYXB0aW9uLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoYnV0dG9uU2V0SWNvbiwgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKGNoZWNrVGhpc0JveCwgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKGNsZWFySXRlbXMsIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChkZWZhdWx0SXNDaGVja2VkLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZGVsZXRlSXRlbUF0LCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoZ2V0QXJyYXksIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRJdGVtQXQsIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChnZXRMb2NrLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoaW5zZXJ0SXRlbUF0LCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoaXNCb3hDaGVja2VkLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoaXNEZWZhdWx0Q2hlY2tlZCwgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKHNldEFjdGlvbiwgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKHNldEZvY3VzLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0Qoc2V0SXRlbXMsIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChzZXRMb2NrLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0Qoc2lnbmF0dXJlR2V0TW9kaWZpY2F0aW9ucywgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKHNpZ25hdHVyZUdldFNlZWRWYWx1ZSwgRmllbGQpOworICBKU19TVEFUSUNfTUVUSE9EKHNpZ25hdHVyZUluZm8sIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChzaWduYXR1cmVTZXRTZWVkVmFsdWUsIEZpZWxkKTsKKyAgSlNfU1RBVElDX01FVEhPRChzaWduYXR1cmVTaWduLCBGaWVsZCk7CisgIEpTX1NUQVRJQ19NRVRIT0Qoc2lnbmF0dXJlVmFsaWRhdGUsIEZpZWxkKTsKKworIHByaXZhdGU6CisgIHN0YXRpYyBpbnQgT2JqRGVmbklEOworICBzdGF0aWMgY29uc3QgSlNQcm9wZXJ0eVNwZWMgUHJvcGVydHlTcGVjc1tdOworICBzdGF0aWMgY29uc3QgSlNNZXRob2RTcGVjIE1ldGhvZFNwZWNzW107Cit9OworCisjZW5kaWYgIC8vIEZYSlNfQ0pTX0ZJRUxEX0hfCmRpZmYgLS1naXQgYS9meGpzL2Nqc19mb250LmNwcCBiL2Z4anMvY2pzX2ZvbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YjM5MmYKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc19mb250LmNwcApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL2Nqc19mb250LmgiCisKK2NvbnN0IEpTQ29uc3RTcGVjIENKU19Gb250OjpDb25zdFNwZWNzW10gPSB7CisgICAgeyJUaW1lcyIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJUaW1lcy1Sb21hbiJ9LAorICAgIHsiVGltZXNCIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgIlRpbWVzLUJvbGQifSwKKyAgICB7IlRpbWVzSSIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJUaW1lcy1JdGFsaWMifSwKKyAgICB7IlRpbWVzQkkiLCBKU0NvbnN0U3BlYzo6U3RyaW5nLCAwLCAiVGltZXMtQm9sZEl0YWxpYyJ9LAorICAgIHsiSGVsdiIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJIZWx2ZXRpY2EifSwKKyAgICB7IkhlbHZCIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgIkhlbHZldGljYS1Cb2xkIn0sCisgICAgeyJIZWx2SSIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJIZWx2ZXRpY2EtT2JsaXF1ZSJ9LAorICAgIHsiSGVsdkJJIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgIkhlbHZldGljYS1Cb2xkT2JsaXF1ZSJ9LAorICAgIHsiQ291ciIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJDb3VyaWVyIn0sCisgICAgeyJDb3VyQiIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJDb3VyaWVyLUJvbGQifSwKKyAgICB7IkNvdXJJIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgIkNvdXJpZXItT2JsaXF1ZSJ9LAorICAgIHsiQ291ckJJIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgIkNvdXJpZXItQm9sZE9ibGlxdWUifSwKKyAgICB7IlN5bWJvbCIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJTeW1ib2wifSwKKyAgICB7IlphcGZEIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgIlphcGZEaW5nYmF0cyJ9fTsKKworaW50IENKU19Gb250OjpPYmpEZWZuSUQgPSAtMTsKKworLy8gc3RhdGljCit2b2lkIENKU19Gb250OjpEZWZpbmVKU09iamVjdHMoQ0ZYSlNfRW5naW5lKiBwRW5naW5lKSB7CisgIE9iakRlZm5JRCA9IHBFbmdpbmUtPkRlZmluZU9iaigiZm9udCIsIEZYSlNPQkpUWVBFX1NUQVRJQywgbnVsbHB0ciwgbnVsbHB0cik7CisgIERlZmluZUNvbnN0cyhwRW5naW5lLCBPYmpEZWZuSUQsIENvbnN0U3BlY3MsIEZYX0FycmF5U2l6ZShDb25zdFNwZWNzKSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL2Nqc19mb250LmggYi9meGpzL2Nqc19mb250LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFlZGYwNgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2pzX2ZvbnQuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19DSlNfRk9OVF9IXworI2RlZmluZSBGWEpTX0NKU19GT05UX0hfCisKKyNpbmNsdWRlICJmeGpzL0pTX0RlZmluZS5oIgorCitjbGFzcyBDSlNfRm9udCA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIERlZmluZUpTT2JqZWN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUpOworCisgIGV4cGxpY2l0IENKU19Gb250KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge30KKyAgfkNKU19Gb250KCkgb3ZlcnJpZGUge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBpbnQgT2JqRGVmbklEOworICBzdGF0aWMgY29uc3QgSlNDb25zdFNwZWMgQ29uc3RTcGVjc1tdOworfTsKKworI2VuZGlmICAvLyBGWEpTX0NKU19GT05UX0hfCmRpZmYgLS1naXQgYS9meGpzL2Nqc19nbG9iYWwuY3BwIGIvZnhqcy9janNfZ2xvYmFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjY2NDg4Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfZ2xvYmFsLmNwcApAQCAtMCwwICsxLDYxNSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy9janNfZ2xvYmFsLmgiCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9leHRlbnNpb24uaCIKKyNpbmNsdWRlICJmeGpzL0pTX0RlZmluZS5oIgorI2luY2x1ZGUgImZ4anMvY2pzX2V2ZW50X2NvbnRleHQuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19ldmVudGhhbmRsZXIuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19nbG9iYWxkYXRhLmgiCisjaW5jbHVkZSAiZnhqcy9janNfa2V5dmFsdWUuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19vYmplY3QuaCIKKyNpbmNsdWRlICJmeGpzL2pzX3Jlc291cmNlcy5oIgorCituYW1lc3BhY2UgeworCitXaWRlU3RyaW5nIFByb3BGcm9tVjhQcm9wKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5KSB7CisgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSB1dGY4X3ZhbHVlKHBJc29sYXRlLCBwcm9wZXJ0eSk7CisgIHJldHVybiBXaWRlU3RyaW5nOjpGcm9tVVRGOChCeXRlU3RyaW5nVmlldygqdXRmOF92YWx1ZSwgdXRmOF92YWx1ZS5sZW5ndGgoKSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQWx0Pgordm9pZCBKU1NwZWNpYWxQcm9wUXVlcnkoY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OkludGVnZXI+JiBpbmZvKSB7CisgIENKU19SdW50aW1lKiBwUnVudGltZSA9CisgICAgICBDSlNfUnVudGltZTo6Q3VycmVudFJ1bnRpbWVGcm9tSXNvbGF0ZShpbmZvLkdldElzb2xhdGUoKSk7CisgIGlmICghcFJ1bnRpbWUpCisgICAgcmV0dXJuOworCisgIENKU19PYmplY3QqIHBKU09iaiA9CisgICAgICBzdGF0aWNfY2FzdDxDSlNfT2JqZWN0Kj4ocFJ1bnRpbWUtPkdldE9iamVjdFByaXZhdGUoaW5mby5Ib2xkZXIoKSkpOworICBpZiAoIXBKU09iaikKKyAgICByZXR1cm47CisKKyAgQWx0KiBwT2JqID0gcmVpbnRlcnByZXRfY2FzdDxBbHQqPihwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpOworICBDSlNfUmV0dXJuIHJlc3VsdCA9CisgICAgICBwT2JqLT5RdWVyeVByb3BlcnR5KFByb3BGcm9tVjhQcm9wKGluZm8uR2V0SXNvbGF0ZSgpLCBwcm9wZXJ0eSkuY19zdHIoKSk7CisgIGluZm8uR2V0UmV0dXJuVmFsdWUoKS5TZXQoIXJlc3VsdC5IYXNFcnJvcigpID8gNCA6IDApOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQWx0Pgordm9pZCBKU1NwZWNpYWxQcm9wR2V0KGNvbnN0IGNoYXIqIGNsYXNzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7CisgIENKU19SdW50aW1lKiBwUnVudGltZSA9CisgICAgICBDSlNfUnVudGltZTo6Q3VycmVudFJ1bnRpbWVGcm9tSXNvbGF0ZShpbmZvLkdldElzb2xhdGUoKSk7CisgIGlmICghcFJ1bnRpbWUpCisgICAgcmV0dXJuOworCisgIENKU19PYmplY3QqIHBKU09iaiA9CisgICAgICBzdGF0aWNfY2FzdDxDSlNfT2JqZWN0Kj4ocFJ1bnRpbWUtPkdldE9iamVjdFByaXZhdGUoaW5mby5Ib2xkZXIoKSkpOworICBpZiAoIXBKU09iaikKKyAgICByZXR1cm47CisKKyAgQWx0KiBwT2JqID0gcmVpbnRlcnByZXRfY2FzdDxBbHQqPihwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpOworICBDSlNfUmV0dXJuIHJlc3VsdCA9IHBPYmotPkdldFByb3BlcnR5KAorICAgICAgcFJ1bnRpbWUsIFByb3BGcm9tVjhQcm9wKGluZm8uR2V0SXNvbGF0ZSgpLCBwcm9wZXJ0eSkuY19zdHIoKSk7CisgIGlmIChyZXN1bHQuSGFzRXJyb3IoKSkgeworICAgIHBSdW50aW1lLT5FcnJvcigKKyAgICAgICAgSlNGb3JtYXRFcnJvclN0cmluZyhjbGFzc19uYW1lLCAiR2V0UHJvcGVydHkiLCByZXN1bHQuRXJyb3IoKSkpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChyZXN1bHQuSGFzUmV0dXJuKCkpCisgICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChyZXN1bHQuUmV0dXJuKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQWx0Pgordm9pZCBKU1NwZWNpYWxQcm9wUHV0KGNvbnN0IGNoYXIqIGNsYXNzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7CisgIENKU19SdW50aW1lKiBwUnVudGltZSA9CisgICAgICBDSlNfUnVudGltZTo6Q3VycmVudFJ1bnRpbWVGcm9tSXNvbGF0ZShpbmZvLkdldElzb2xhdGUoKSk7CisgIGlmICghcFJ1bnRpbWUpCisgICAgcmV0dXJuOworCisgIENKU19PYmplY3QqIHBKU09iaiA9CisgICAgICBzdGF0aWNfY2FzdDxDSlNfT2JqZWN0Kj4ocFJ1bnRpbWUtPkdldE9iamVjdFByaXZhdGUoaW5mby5Ib2xkZXIoKSkpOworICBpZiAoIXBKU09iaikKKyAgICByZXR1cm47CisKKyAgQWx0KiBwT2JqID0gcmVpbnRlcnByZXRfY2FzdDxBbHQqPihwSlNPYmotPkdldEVtYmVkT2JqZWN0KCkpOworICBDSlNfUmV0dXJuIHJlc3VsdCA9IHBPYmotPlNldFByb3BlcnR5KAorICAgICAgcFJ1bnRpbWUsIFByb3BGcm9tVjhQcm9wKGluZm8uR2V0SXNvbGF0ZSgpLCBwcm9wZXJ0eSkuY19zdHIoKSwgdmFsdWUpOworICBpZiAocmVzdWx0Lkhhc0Vycm9yKCkpIHsKKyAgICBwUnVudGltZS0+RXJyb3IoCisgICAgICAgIEpTRm9ybWF0RXJyb3JTdHJpbmcoY2xhc3NfbmFtZSwgIlB1dFByb3BlcnR5IiwgcmVzdWx0LkVycm9yKCkpKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQWx0Pgordm9pZCBKU1NwZWNpYWxQcm9wRGVsKGNvbnN0IGNoYXIqIGNsYXNzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6Qm9vbGVhbj4mIGluZm8pIHsKKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0KKyAgICAgIENKU19SdW50aW1lOjpDdXJyZW50UnVudGltZUZyb21Jc29sYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsKKyAgaWYgKCFwUnVudGltZSkKKyAgICByZXR1cm47CisKKyAgQ0pTX09iamVjdCogcEpTT2JqID0KKyAgICAgIHN0YXRpY19jYXN0PENKU19PYmplY3QqPihwUnVudGltZS0+R2V0T2JqZWN0UHJpdmF0ZShpbmZvLkhvbGRlcigpKSk7CisgIGlmICghcEpTT2JqKQorICAgIHJldHVybjsKKworICBBbHQqIHBPYmogPSByZWludGVycHJldF9jYXN0PEFsdCo+KHBKU09iai0+R2V0RW1iZWRPYmplY3QoKSk7CisgIENKU19SZXR1cm4gcmVzdWx0ID0gcE9iai0+RGVsUHJvcGVydHkoCisgICAgICBwUnVudGltZSwgUHJvcEZyb21WOFByb3AoaW5mby5HZXRJc29sYXRlKCksIHByb3BlcnR5KS5jX3N0cigpKTsKKyAgaWYgKHJlc3VsdC5IYXNFcnJvcigpKSB7CisgICAgLy8gVE9ETyhkc2luY2xhaXIpOiBTaG91bGQgdGhpcyBzZXQgdGhlIHBSdW50aW1lLT5FcnJvciByZXN1bHQ/CisgICAgLy8gQnl0ZVN0cmluZyBjYk5hbWUgPQorICAgIC8vICAgICBCeXRlU3RyaW5nOjpGb3JtYXQoIiVzLiVzIiwgY2xhc3NfbmFtZSwgIkRlbFByb3BlcnR5Iik7CisgIH0KK30KKworc3RydWN0IEpTR2xvYmFsRGF0YSB7CisgIEpTR2xvYmFsRGF0YSgpOworICB+SlNHbG9iYWxEYXRhKCk7CisKKyAgSlNfR2xvYmFsRGF0YVR5cGUgblR5cGU7CisgIGRvdWJsZSBkRGF0YTsKKyAgYm9vbCBiRGF0YTsKKyAgQnl0ZVN0cmluZyBzRGF0YTsKKyAgdjg6Okdsb2JhbDx2ODo6T2JqZWN0PiBwRGF0YTsKKyAgYm9vbCBiUGVyc2lzdGVudDsKKyAgYm9vbCBiRGVsZXRlZDsKK307CisKK2NsYXNzIEpTR2xvYmFsQWx0ZXJuYXRlIDogcHVibGljIENKU19FbWJlZE9iaiB7CisgcHVibGljOgorICBleHBsaWNpdCBKU0dsb2JhbEFsdGVybmF0ZShDSlNfT2JqZWN0KiBwSlNPYmplY3QpOworICB+SlNHbG9iYWxBbHRlcm5hdGUoKSBvdmVycmlkZTsKKworICBDSlNfUmV0dXJuIHNldFBlcnNpc3RlbnQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIFF1ZXJ5UHJvcGVydHkoY29uc3Qgd2NoYXJfdCogcHJvcG5hbWUpOworICBDSlNfUmV0dXJuIEdldFByb3BlcnR5KENKU19SdW50aW1lKiBwUnVudGltZSwgY29uc3Qgd2NoYXJfdCogcHJvcG5hbWUpOworICBDSlNfUmV0dXJuIFNldFByb3BlcnR5KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBwcm9wbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisgIENKU19SZXR1cm4gRGVsUHJvcGVydHkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCBjb25zdCB3Y2hhcl90KiBwcm9wbmFtZSk7CisgIHZvaWQgSW5pdGlhbChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudik7CisKKyBwcml2YXRlOgorICB2b2lkIFVwZGF0ZUdsb2JhbFBlcnNpc3RlbnRWYXJpYWJsZXMoKTsKKyAgdm9pZCBDb21taXRHbG9iYWxQZXJzaXNpdGVudFZhcmlhYmxlcyhDSlNfUnVudGltZSogcFJ1bnRpbWUpOworICB2b2lkIERlc3Ryb3lHbG9iYWxQZXJzaXNpdGVudFZhcmlhYmxlcygpOworICBDSlNfUmV0dXJuIFNldEdsb2JhbFZhcmlhYmxlcyhjb25zdCBCeXRlU3RyaW5nJiBwcm9wbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNfR2xvYmFsRGF0YVR5cGUgblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgc0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRGVmYXVsdFBlcnNpc3RlbnQpOworICB2b2lkIE9iamVjdFRvQXJyYXkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosCisgICAgICAgICAgICAgICAgICAgICBDSlNfR2xvYmFsVmFyaWFibGVBcnJheSYgYXJyYXkpOworICB2b2lkIFB1dE9iamVjdFByb3BlcnR5KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmosIENKU19LZXlWYWx1ZSogcERhdGEpOworCisgIHN0ZDo6bWFwPEJ5dGVTdHJpbmcsIHN0ZDo6dW5pcXVlX3B0cjxKU0dsb2JhbERhdGE+PiBtX01hcEdsb2JhbDsKKyAgV2lkZVN0cmluZyBtX3NGaWxlUGF0aDsKKyAgQ0pTX0dsb2JhbERhdGEqIG1fcEdsb2JhbERhdGE7CisgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6T2JzZXJ2ZWRQdHIgbV9wRm9ybUZpbGxFbnY7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworY29uc3QgSlNNZXRob2RTcGVjIENKU19HbG9iYWw6Ok1ldGhvZFNwZWNzW10gPSB7CisgICAgeyJzZXRQZXJzaXN0ZW50Iiwgc2V0UGVyc2lzdGVudF9zdGF0aWN9fTsKKworaW50IENKU19HbG9iYWw6Ok9iakRlZm5JRCA9IC0xOworCisvLyBzdGF0aWMKK3ZvaWQgQ0pTX0dsb2JhbDo6c2V0UGVyc2lzdGVudF9zdGF0aWMoCisgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsKKyAgSlNNZXRob2Q8SlNHbG9iYWxBbHRlcm5hdGUsICZKU0dsb2JhbEFsdGVybmF0ZTo6c2V0UGVyc2lzdGVudD4oCisgICAgICAic2V0UGVyc2lzdGVudCIsICJnbG9iYWwiLCBpbmZvKTsKK30KKworLy8gc3RhdGljCit2b2lkIENKU19HbG9iYWw6OnF1ZXJ5cHJvcF9zdGF0aWMoCisgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LAorICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6SW50ZWdlcj4mIGluZm8pIHsKKyAgSlNTcGVjaWFsUHJvcFF1ZXJ5PEpTR2xvYmFsQWx0ZXJuYXRlPigiZ2xvYmFsIiwgcHJvcGVydHksIGluZm8pOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0pTX0dsb2JhbDo6Z2V0cHJvcF9zdGF0aWMoCisgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LAorICAgIGNvbnN0IHY4OjpQcm9wZXJ0eUNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKSB7CisgIEpTU3BlY2lhbFByb3BHZXQ8SlNHbG9iYWxBbHRlcm5hdGU+KCJnbG9iYWwiLCBwcm9wZXJ0eSwgaW5mbyk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDSlNfR2xvYmFsOjpwdXRwcm9wX3N0YXRpYygKKyAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUsCisgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsKKyAgSlNTcGVjaWFsUHJvcFB1dDxKU0dsb2JhbEFsdGVybmF0ZT4oImdsb2JhbCIsIHByb3BlcnR5LCB2YWx1ZSwgaW5mbyk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBDSlNfR2xvYmFsOjpkZWxwcm9wX3N0YXRpYygKKyAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksCisgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpCb29sZWFuPiYgaW5mbykgeworICBKU1NwZWNpYWxQcm9wRGVsPEpTR2xvYmFsQWx0ZXJuYXRlPigiZ2xvYmFsIiwgcHJvcGVydHksIGluZm8pOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0pTX0dsb2JhbDo6RGVmaW5lQWxsUHJvcGVydGllcyhDRlhKU19FbmdpbmUqIHBFbmdpbmUpIHsKKyAgcEVuZ2luZS0+RGVmaW5lT2JqQWxsUHJvcGVydGllcygKKyAgICAgIE9iakRlZm5JRCwgQ0pTX0dsb2JhbDo6cXVlcnlwcm9wX3N0YXRpYywgQ0pTX0dsb2JhbDo6Z2V0cHJvcF9zdGF0aWMsCisgICAgICBDSlNfR2xvYmFsOjpwdXRwcm9wX3N0YXRpYywgQ0pTX0dsb2JhbDo6ZGVscHJvcF9zdGF0aWMpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0pTX0dsb2JhbDo6RGVmaW5lSlNPYmplY3RzKENGWEpTX0VuZ2luZSogcEVuZ2luZSkgeworICBPYmpEZWZuSUQgPSBwRW5naW5lLT5EZWZpbmVPYmooImdsb2JhbCIsIEZYSlNPQkpUWVBFX1NUQVRJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQ29uc3RydWN0b3I8Q0pTX0dsb2JhbCwgSlNHbG9iYWxBbHRlcm5hdGU+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNEZXN0cnVjdG9yPENKU19HbG9iYWw+KTsKKyAgRGVmaW5lTWV0aG9kcyhwRW5naW5lLCBPYmpEZWZuSUQsIE1ldGhvZFNwZWNzLCBGWF9BcnJheVNpemUoTWV0aG9kU3BlY3MpKTsKKyAgRGVmaW5lQWxsUHJvcGVydGllcyhwRW5naW5lKTsKK30KKwordm9pZCBDSlNfR2xvYmFsOjpJbml0SW5zdGFuY2UoSUpTX1J1bnRpbWUqIHBJUnVudGltZSkgeworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBzdGF0aWNfY2FzdDxDSlNfUnVudGltZSo+KHBJUnVudGltZSk7CisgIEpTR2xvYmFsQWx0ZXJuYXRlKiBwR2xvYmFsID0KKyAgICAgIHN0YXRpY19jYXN0PEpTR2xvYmFsQWx0ZXJuYXRlKj4oR2V0RW1iZWRPYmplY3QoKSk7CisgIHBHbG9iYWwtPkluaXRpYWwocFJ1bnRpbWUtPkdldEZvcm1GaWxsRW52KCkpOworfQorCitKU0dsb2JhbERhdGE6OkpTR2xvYmFsRGF0YSgpCisgICAgOiBuVHlwZShKU19HbG9iYWxEYXRhVHlwZTo6TlVNQkVSKSwKKyAgICAgIGREYXRhKDApLAorICAgICAgYkRhdGEoZmFsc2UpLAorICAgICAgc0RhdGEoIiIpLAorICAgICAgYlBlcnNpc3RlbnQoZmFsc2UpLAorICAgICAgYkRlbGV0ZWQoZmFsc2UpIHt9CisKK0pTR2xvYmFsRGF0YTo6fkpTR2xvYmFsRGF0YSgpIHsKKyAgcERhdGEuUmVzZXQoKTsKK30KKworSlNHbG9iYWxBbHRlcm5hdGU6OkpTR2xvYmFsQWx0ZXJuYXRlKENKU19PYmplY3QqIHBKU09iamVjdCkKKyAgICA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpLCBtX3BGb3JtRmlsbEVudihudWxscHRyKSB7fQorCitKU0dsb2JhbEFsdGVybmF0ZTo6fkpTR2xvYmFsQWx0ZXJuYXRlKCkgeworICBEZXN0cm95R2xvYmFsUGVyc2lzaXRlbnRWYXJpYWJsZXMoKTsKKyAgbV9wR2xvYmFsRGF0YS0+UmVsZWFzZSgpOworfQorCit2b2lkIEpTR2xvYmFsQWx0ZXJuYXRlOjpJbml0aWFsKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSB7CisgIG1fcEZvcm1GaWxsRW52LlJlc2V0KHBGb3JtRmlsbEVudik7CisgIG1fcEdsb2JhbERhdGEgPSBDSlNfR2xvYmFsRGF0YTo6R2V0UmV0YWluZWRJbnN0YW5jZShwRm9ybUZpbGxFbnYpOworICBVcGRhdGVHbG9iYWxQZXJzaXN0ZW50VmFyaWFibGVzKCk7Cit9CisKK0NKU19SZXR1cm4gSlNHbG9iYWxBbHRlcm5hdGU6OlF1ZXJ5UHJvcGVydHkoY29uc3Qgd2NoYXJfdCogcHJvcG5hbWUpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4oV2lkZVN0cmluZyhwcm9wbmFtZSkgIT0gTCJzZXRQZXJzaXN0ZW50Iik7Cit9CisKK0NKU19SZXR1cm4gSlNHbG9iYWxBbHRlcm5hdGU6OkRlbFByb3BlcnR5KENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHByb3BuYW1lKSB7CisgIGF1dG8gaXQgPSBtX01hcEdsb2JhbC5maW5kKEJ5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHByb3BuYW1lKSk7CisgIGlmIChpdCA9PSBtX01hcEdsb2JhbC5lbmQoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgaXQtPnNlY29uZC0+YkRlbGV0ZWQgPSB0cnVlOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBKU0dsb2JhbEFsdGVybmF0ZTo6R2V0UHJvcGVydHkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogcHJvcG5hbWUpIHsKKyAgYXV0byBpdCA9IG1fTWFwR2xvYmFsLmZpbmQoQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocHJvcG5hbWUpKTsKKyAgaWYgKGl0ID09IG1fTWFwR2xvYmFsLmVuZCgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIEpTR2xvYmFsRGF0YSogcERhdGEgPSBpdC0+c2Vjb25kLmdldCgpOworICBpZiAocERhdGEtPmJEZWxldGVkKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIHN3aXRjaCAocERhdGEtPm5UeXBlKSB7CisgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6TlVNQkVSOgorICAgICAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld051bWJlcihwRGF0YS0+ZERhdGEpKTsKKyAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpCT09MRUFOOgorICAgICAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld0Jvb2xlYW4ocERhdGEtPmJEYXRhKSk7CisgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6U1RSSU5HOgorICAgICAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1N0cmluZygKKyAgICAgICAgICBXaWRlU3RyaW5nOjpGcm9tTG9jYWwocERhdGEtPnNEYXRhLmNfc3RyKCkpLmNfc3RyKCkpKTsKKyAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpPQkpFQ1Q6CisgICAgICByZXR1cm4gQ0pTX1JldHVybigKKyAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD46Ok5ldyhwUnVudGltZS0+R2V0SXNvbGF0ZSgpLCBwRGF0YS0+cERhdGEpKTsKKyAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpOVUxMT0JKOgorICAgICAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld051bGwoKSk7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBKU0dsb2JhbEFsdGVybmF0ZTo6U2V0UHJvcGVydHkoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogcHJvcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCkgeworICBCeXRlU3RyaW5nIHNQcm9wTmFtZSA9IEJ5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHByb3BuYW1lKTsKKyAgaWYgKHZwLT5Jc051bWJlcigpKSB7CisgICAgcmV0dXJuIFNldEdsb2JhbFZhcmlhYmxlcyhzUHJvcE5hbWUsIEpTX0dsb2JhbERhdGFUeXBlOjpOVU1CRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnVudGltZS0+VG9Eb3VibGUodnApLCBmYWxzZSwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgZmFsc2UpOworICB9CisgIGlmICh2cC0+SXNCb29sZWFuKCkpIHsKKyAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR2xvYmFsRGF0YVR5cGU6OkJPT0xFQU4sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnVudGltZS0+VG9Cb29sZWFuKHZwKSwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwgZmFsc2UpOworICB9CisgIGlmICh2cC0+SXNTdHJpbmcoKSkgeworICAgIHJldHVybiBTZXRHbG9iYWxWYXJpYWJsZXMoCisgICAgICAgIHNQcm9wTmFtZSwgSlNfR2xvYmFsRGF0YVR5cGU6OlNUUklORywgMCwgZmFsc2UsCisgICAgICAgIEJ5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcodnApKSwKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksIGZhbHNlKTsKKyAgfQorICBpZiAodnAtPklzT2JqZWN0KCkpIHsKKyAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR2xvYmFsRGF0YVR5cGU6Ok9CSkVDVCwgMCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgcFJ1bnRpbWUtPlRvT2JqZWN0KHZwKSwgZmFsc2UpOworICB9CisgIGlmICh2cC0+SXNOdWxsKCkpIHsKKyAgICByZXR1cm4gU2V0R2xvYmFsVmFyaWFibGVzKHNQcm9wTmFtZSwgSlNfR2xvYmFsRGF0YVR5cGU6Ok5VTExPQkosIDAsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpLCBmYWxzZSk7CisgIH0KKyAgaWYgKHZwLT5Jc1VuZGVmaW5lZCgpKSB7CisgICAgRGVsUHJvcGVydHkocFJ1bnRpbWUsIHByb3BuYW1lKTsKKyAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKyAgfQorICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7Cit9CisKK0NKU19SZXR1cm4gSlNHbG9iYWxBbHRlcm5hdGU6OnNldFBlcnNpc3RlbnQoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIGF1dG8gaXQgPSBtX01hcEdsb2JhbC5maW5kKAorICAgICAgQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUocFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMF0pKSk7CisgIGlmIChpdCA9PSBtX01hcEdsb2JhbC5lbmQoKSB8fCBpdC0+c2Vjb25kLT5iRGVsZXRlZCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtHbG9iYWxOb3RGb3VuZEVycm9yKSk7CisKKyAgaXQtPnNlY29uZC0+YlBlcnNpc3RlbnQgPSBwUnVudGltZS0+VG9Cb29sZWFuKHBhcmFtc1sxXSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCit2b2lkIEpTR2xvYmFsQWx0ZXJuYXRlOjpVcGRhdGVHbG9iYWxQZXJzaXN0ZW50VmFyaWFibGVzKCkgeworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPQorICAgICAgc3RhdGljX2Nhc3Q8Q0pTX1J1bnRpbWUqPihDRlhKU19FbmdpbmU6OkN1cnJlbnRFbmdpbmVGcm9tSXNvbGF0ZSgKKyAgICAgICAgICBtX3BKU09iamVjdC0+VG9WOE9iamVjdCgpLT5HZXRJc29sYXRlKCkpKTsKKworICBmb3IgKGludCBpID0gMCwgc3ogPSBtX3BHbG9iYWxEYXRhLT5HZXRTaXplKCk7IGkgPCBzejsgaSsrKSB7CisgICAgQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcERhdGEgPSBtX3BHbG9iYWxEYXRhLT5HZXRBdChpKTsKKyAgICBzd2l0Y2ggKHBEYXRhLT5kYXRhLm5UeXBlKSB7CisgICAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpOVU1CRVI6CisgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlcyhwRGF0YS0+ZGF0YS5zS2V5LCBKU19HbG9iYWxEYXRhVHlwZTo6TlVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmRhdGEuZERhdGEsIGZhbHNlLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpLCBwRGF0YS0+YlBlcnNpc3RlbnQgPT0gMSk7CisgICAgICAgIHBSdW50aW1lLT5QdXRPYmplY3RQcm9wZXJ0eShtX3BKU09iamVjdC0+VG9WOE9iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmRhdGEuc0tleS5VVEY4RGVjb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnVudGltZS0+TmV3TnVtYmVyKHBEYXRhLT5kYXRhLmREYXRhKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6Qk9PTEVBTjoKKyAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVzKHBEYXRhLT5kYXRhLnNLZXksIEpTX0dsb2JhbERhdGFUeXBlOjpCT09MRUFOLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmRhdGEuYkRhdGEgPT0gMSwgIiIsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmJQZXJzaXN0ZW50ID09IDEpOworICAgICAgICBwUnVudGltZS0+UHV0T2JqZWN0UHJvcGVydHkoCisgICAgICAgICAgICBtX3BKU09iamVjdC0+VG9WOE9iamVjdCgpLCBwRGF0YS0+ZGF0YS5zS2V5LlVURjhEZWNvZGUoKSwKKyAgICAgICAgICAgIHBSdW50aW1lLT5OZXdCb29sZWFuKHBEYXRhLT5kYXRhLmJEYXRhID09IDEpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpTVFJJTkc6CisgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlcyhwRGF0YS0+ZGF0YS5zS2V5LCBKU19HbG9iYWxEYXRhVHlwZTo6U1RSSU5HLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHBEYXRhLT5kYXRhLnNEYXRhLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5iUGVyc2lzdGVudCA9PSAxKTsKKyAgICAgICAgcFJ1bnRpbWUtPlB1dE9iamVjdFByb3BlcnR5KAorICAgICAgICAgICAgbV9wSlNPYmplY3QtPlRvVjhPYmplY3QoKSwgcERhdGEtPmRhdGEuc0tleS5VVEY4RGVjb2RlKCksCisgICAgICAgICAgICBwUnVudGltZS0+TmV3U3RyaW5nKHBEYXRhLT5kYXRhLnNEYXRhLlVURjhEZWNvZGUoKS5Bc1N0cmluZ1ZpZXcoKSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6Ok9CSkVDVDogeworICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiA9IHBSdW50aW1lLT5OZXdGeER5bmFtaWNPYmooLTEpOworICAgICAgICBpZiAoIXBPYmouSXNFbXB0eSgpKSB7CisgICAgICAgICAgUHV0T2JqZWN0UHJvcGVydHkocE9iaiwgJnBEYXRhLT5kYXRhKTsKKyAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZXMocERhdGEtPmRhdGEuc0tleSwgSlNfR2xvYmFsRGF0YVR5cGU6Ok9CSkVDVCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICIiLCBwT2JqLCBwRGF0YS0+YlBlcnNpc3RlbnQgPT0gMSk7CisgICAgICAgICAgcFJ1bnRpbWUtPlB1dE9iamVjdFByb3BlcnR5KG1fcEpTT2JqZWN0LT5Ub1Y4T2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEYXRhLT5kYXRhLnNLZXkuVVRGOERlY29kZSgpLCBwT2JqKTsKKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6Ok5VTExPQko6CisgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlcyhwRGF0YS0+ZGF0YS5zS2V5LCBKU19HbG9iYWxEYXRhVHlwZTo6TlVMTE9CSiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAiIiwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YS0+YlBlcnNpc3RlbnQgPT0gMSk7CisgICAgICAgIHBSdW50aW1lLT5QdXRPYmplY3RQcm9wZXJ0eShtX3BKU09iamVjdC0+VG9WOE9iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEtPmRhdGEuc0tleS5VVEY4RGVjb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnVudGltZS0+TmV3TnVsbCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK3ZvaWQgSlNHbG9iYWxBbHRlcm5hdGU6OkNvbW1pdEdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBmb3IgKGNvbnN0IGF1dG8mIGl0ZXIgOiBtX01hcEdsb2JhbCkgeworICAgIEJ5dGVTdHJpbmcgbmFtZSA9IGl0ZXIuZmlyc3Q7CisgICAgSlNHbG9iYWxEYXRhKiBwRGF0YSA9IGl0ZXIuc2Vjb25kLmdldCgpOworICAgIGlmIChwRGF0YS0+YkRlbGV0ZWQpIHsKKyAgICAgIG1fcEdsb2JhbERhdGEtPkRlbGV0ZUdsb2JhbFZhcmlhYmxlKG5hbWUpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIHN3aXRjaCAocERhdGEtPm5UeXBlKSB7CisgICAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpOVU1CRVI6CisgICAgICAgIG1fcEdsb2JhbERhdGEtPlNldEdsb2JhbFZhcmlhYmxlTnVtYmVyKG5hbWUsIHBEYXRhLT5kRGF0YSk7CisgICAgICAgIG1fcEdsb2JhbERhdGEtPlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChuYW1lLCBwRGF0YS0+YlBlcnNpc3RlbnQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6OkJPT0xFQU46CisgICAgICAgIG1fcEdsb2JhbERhdGEtPlNldEdsb2JhbFZhcmlhYmxlQm9vbGVhbihuYW1lLCBwRGF0YS0+YkRhdGEpOworICAgICAgICBtX3BHbG9iYWxEYXRhLT5TZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQobmFtZSwgcERhdGEtPmJQZXJzaXN0ZW50KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpTVFJJTkc6CisgICAgICAgIG1fcEdsb2JhbERhdGEtPlNldEdsb2JhbFZhcmlhYmxlU3RyaW5nKG5hbWUsIHBEYXRhLT5zRGF0YSk7CisgICAgICAgIG1fcEdsb2JhbERhdGEtPlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChuYW1lLCBwRGF0YS0+YlBlcnNpc3RlbnQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6Ok9CSkVDVDogeworICAgICAgICBDSlNfR2xvYmFsVmFyaWFibGVBcnJheSBhcnJheTsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iaiA9IHY4OjpMb2NhbDx2ODo6T2JqZWN0Pjo6TmV3KAorICAgICAgICAgICAgR2V0SlNPYmplY3QoKS0+R2V0SXNvbGF0ZSgpLCBwRGF0YS0+cERhdGEpOworICAgICAgICBPYmplY3RUb0FycmF5KHBSdW50aW1lLCBvYmosIGFycmF5KTsKKyAgICAgICAgbV9wR2xvYmFsRGF0YS0+U2V0R2xvYmFsVmFyaWFibGVPYmplY3QobmFtZSwgYXJyYXkpOworICAgICAgICBtX3BHbG9iYWxEYXRhLT5TZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQobmFtZSwgcERhdGEtPmJQZXJzaXN0ZW50KTsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpOVUxMT0JKOgorICAgICAgICBtX3BHbG9iYWxEYXRhLT5TZXRHbG9iYWxWYXJpYWJsZU51bGwobmFtZSk7CisgICAgICAgIG1fcEdsb2JhbERhdGEtPlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChuYW1lLCBwRGF0YS0+YlBlcnNpc3RlbnQpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKwordm9pZCBKU0dsb2JhbEFsdGVybmF0ZTo6T2JqZWN0VG9BcnJheShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfR2xvYmFsVmFyaWFibGVBcnJheSYgYXJyYXkpIHsKKyAgc3RkOjp2ZWN0b3I8V2lkZVN0cmluZz4gcEtleUxpc3QgPSBwUnVudGltZS0+R2V0T2JqZWN0UHJvcGVydHlOYW1lcyhwT2JqKTsKKyAgZm9yIChjb25zdCBhdXRvJiB3cyA6IHBLZXlMaXN0KSB7CisgICAgQnl0ZVN0cmluZyBzS2V5ID0gd3MuVVRGOEVuY29kZSgpOworICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHYgPSBwUnVudGltZS0+R2V0T2JqZWN0UHJvcGVydHkocE9iaiwgd3MpOworICAgIGlmICh2LT5Jc051bWJlcigpKSB7CisgICAgICBDSlNfS2V5VmFsdWUqIHBPYmpFbGVtZW50ID0gbmV3IENKU19LZXlWYWx1ZTsKKyAgICAgIHBPYmpFbGVtZW50LT5uVHlwZSA9IEpTX0dsb2JhbERhdGFUeXBlOjpOVU1CRVI7CisgICAgICBwT2JqRWxlbWVudC0+c0tleSA9IHNLZXk7CisgICAgICBwT2JqRWxlbWVudC0+ZERhdGEgPSBwUnVudGltZS0+VG9Eb3VibGUodik7CisgICAgICBhcnJheS5BZGQocE9iakVsZW1lbnQpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICh2LT5Jc0Jvb2xlYW4oKSkgeworICAgICAgQ0pTX0tleVZhbHVlKiBwT2JqRWxlbWVudCA9IG5ldyBDSlNfS2V5VmFsdWU7CisgICAgICBwT2JqRWxlbWVudC0+blR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6Qk9PTEVBTjsKKyAgICAgIHBPYmpFbGVtZW50LT5zS2V5ID0gc0tleTsKKyAgICAgIHBPYmpFbGVtZW50LT5kRGF0YSA9IHBSdW50aW1lLT5Ub0Jvb2xlYW4odik7CisgICAgICBhcnJheS5BZGQocE9iakVsZW1lbnQpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICh2LT5Jc1N0cmluZygpKSB7CisgICAgICBCeXRlU3RyaW5nIHNWYWx1ZSA9IEJ5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcodikpOworICAgICAgQ0pTX0tleVZhbHVlKiBwT2JqRWxlbWVudCA9IG5ldyBDSlNfS2V5VmFsdWU7CisgICAgICBwT2JqRWxlbWVudC0+blR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6U1RSSU5HOworICAgICAgcE9iakVsZW1lbnQtPnNLZXkgPSBzS2V5OworICAgICAgcE9iakVsZW1lbnQtPnNEYXRhID0gc1ZhbHVlOworICAgICAgYXJyYXkuQWRkKHBPYmpFbGVtZW50KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAodi0+SXNPYmplY3QoKSkgeworICAgICAgQ0pTX0tleVZhbHVlKiBwT2JqRWxlbWVudCA9IG5ldyBDSlNfS2V5VmFsdWU7CisgICAgICBwT2JqRWxlbWVudC0+blR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6T0JKRUNUOworICAgICAgcE9iakVsZW1lbnQtPnNLZXkgPSBzS2V5OworICAgICAgT2JqZWN0VG9BcnJheShwUnVudGltZSwgcFJ1bnRpbWUtPlRvT2JqZWN0KHYpLCBwT2JqRWxlbWVudC0+b2JqRGF0YSk7CisgICAgICBhcnJheS5BZGQocE9iakVsZW1lbnQpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICh2LT5Jc051bGwoKSkgeworICAgICAgQ0pTX0tleVZhbHVlKiBwT2JqRWxlbWVudCA9IG5ldyBDSlNfS2V5VmFsdWU7CisgICAgICBwT2JqRWxlbWVudC0+blR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6TlVMTE9CSjsKKyAgICAgIHBPYmpFbGVtZW50LT5zS2V5ID0gc0tleTsKKyAgICAgIGFycmF5LkFkZChwT2JqRWxlbWVudCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgSlNHbG9iYWxBbHRlcm5hdGU6OlB1dE9iamVjdFByb3BlcnR5KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX0tleVZhbHVlKiBwRGF0YSkgeworICBDSlNfUnVudGltZSogcFJ1bnRpbWUgPSBDSlNfUnVudGltZTo6Q3VycmVudFJ1bnRpbWVGcm9tSXNvbGF0ZSgKKyAgICAgIG1fcEpTT2JqZWN0LT5Ub1Y4T2JqZWN0KCktPkdldElzb2xhdGUoKSk7CisKKyAgZm9yIChpbnQgaSA9IDAsIHN6ID0gcERhdGEtPm9iakRhdGEuQ291bnQoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBDSlNfS2V5VmFsdWUqIHBPYmpEYXRhID0gcERhdGEtPm9iakRhdGEuR2V0QXQoaSk7CisgICAgc3dpdGNoIChwT2JqRGF0YS0+blR5cGUpIHsKKyAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6Ok5VTUJFUjoKKyAgICAgICAgcFJ1bnRpbWUtPlB1dE9iamVjdFByb3BlcnR5KHBPYmosIHBPYmpEYXRhLT5zS2V5LlVURjhEZWNvZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW50aW1lLT5OZXdOdW1iZXIocE9iakRhdGEtPmREYXRhKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6Qk9PTEVBTjoKKyAgICAgICAgcFJ1bnRpbWUtPlB1dE9iamVjdFByb3BlcnR5KHBPYmosIHBPYmpEYXRhLT5zS2V5LlVURjhEZWNvZGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW50aW1lLT5OZXdCb29sZWFuKHBPYmpEYXRhLT5iRGF0YSA9PSAxKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6U1RSSU5HOgorICAgICAgICBwUnVudGltZS0+UHV0T2JqZWN0UHJvcGVydHkoCisgICAgICAgICAgICBwT2JqLCBwT2JqRGF0YS0+c0tleS5VVEY4RGVjb2RlKCksCisgICAgICAgICAgICBwUnVudGltZS0+TmV3U3RyaW5nKHBPYmpEYXRhLT5zRGF0YS5VVEY4RGVjb2RlKCkuQXNTdHJpbmdWaWV3KCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpPQkpFQ1Q6IHsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBOZXdPYmogPSBwUnVudGltZS0+TmV3RnhEeW5hbWljT2JqKC0xKTsKKyAgICAgICAgaWYgKCFwTmV3T2JqLklzRW1wdHkoKSkgeworICAgICAgICAgIFB1dE9iamVjdFByb3BlcnR5KHBOZXdPYmosIHBPYmpEYXRhKTsKKyAgICAgICAgICBwUnVudGltZS0+UHV0T2JqZWN0UHJvcGVydHkocE9iaiwgcE9iakRhdGEtPnNLZXkuVVRGOERlY29kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTmV3T2JqKTsKKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6Ok5VTExPQko6CisgICAgICAgIHBSdW50aW1lLT5QdXRPYmplY3RQcm9wZXJ0eShwT2JqLCBwT2JqRGF0YS0+c0tleS5VVEY4RGVjb2RlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnVudGltZS0+TmV3TnVsbCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK3ZvaWQgSlNHbG9iYWxBbHRlcm5hdGU6OkRlc3Ryb3lHbG9iYWxQZXJzaXNpdGVudFZhcmlhYmxlcygpIHsKKyAgbV9NYXBHbG9iYWwuY2xlYXIoKTsKK30KKworQ0pTX1JldHVybiBKU0dsb2JhbEFsdGVybmF0ZTo6U2V0R2xvYmFsVmFyaWFibGVzKGNvbnN0IEJ5dGVTdHJpbmcmIHByb3BuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTX0dsb2JhbERhdGFUeXBlIG5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmcmIHNEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJEZWZhdWx0UGVyc2lzdGVudCkgeworICBpZiAocHJvcG5hbWUuSXNFbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBhdXRvIGl0ID0gbV9NYXBHbG9iYWwuZmluZChwcm9wbmFtZSk7CisgIGlmIChpdCAhPSBtX01hcEdsb2JhbC5lbmQoKSkgeworICAgIEpTR2xvYmFsRGF0YSogcFRlbXAgPSBpdC0+c2Vjb25kLmdldCgpOworICAgIGlmIChwVGVtcC0+YkRlbGV0ZWQgfHwgcFRlbXAtPm5UeXBlICE9IG5UeXBlKSB7CisgICAgICBwVGVtcC0+ZERhdGEgPSAwOworICAgICAgcFRlbXAtPmJEYXRhID0gMDsKKyAgICAgIHBUZW1wLT5zRGF0YS5jbGVhcigpOworICAgICAgcFRlbXAtPm5UeXBlID0gblR5cGU7CisgICAgfQorICAgIHBUZW1wLT5iRGVsZXRlZCA9IGZhbHNlOworICAgIHN3aXRjaCAoblR5cGUpIHsKKyAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6Ok5VTUJFUjoKKyAgICAgICAgcFRlbXAtPmREYXRhID0gZERhdGE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6Qk9PTEVBTjoKKyAgICAgICAgcFRlbXAtPmJEYXRhID0gYkRhdGE7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6U1RSSU5HOgorICAgICAgICBwVGVtcC0+c0RhdGEgPSBzRGF0YTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpPQkpFQ1Q6CisgICAgICAgIHBUZW1wLT5wRGF0YS5SZXNldChwRGF0YS0+R2V0SXNvbGF0ZSgpLCBwRGF0YSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6TlVMTE9CSjoKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisgICAgfQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworICB9CisKKyAgYXV0byBwTmV3RGF0YSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxKU0dsb2JhbERhdGE+KCk7CisgIHN3aXRjaCAoblR5cGUpIHsKKyAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpOVU1CRVI6CisgICAgICBwTmV3RGF0YS0+blR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6TlVNQkVSOworICAgICAgcE5ld0RhdGEtPmREYXRhID0gZERhdGE7CisgICAgICBwTmV3RGF0YS0+YlBlcnNpc3RlbnQgPSBiRGVmYXVsdFBlcnNpc3RlbnQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpCT09MRUFOOgorICAgICAgcE5ld0RhdGEtPm5UeXBlID0gSlNfR2xvYmFsRGF0YVR5cGU6OkJPT0xFQU47CisgICAgICBwTmV3RGF0YS0+YkRhdGEgPSBiRGF0YTsKKyAgICAgIHBOZXdEYXRhLT5iUGVyc2lzdGVudCA9IGJEZWZhdWx0UGVyc2lzdGVudDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6OlNUUklORzoKKyAgICAgIHBOZXdEYXRhLT5uVHlwZSA9IEpTX0dsb2JhbERhdGFUeXBlOjpTVFJJTkc7CisgICAgICBwTmV3RGF0YS0+c0RhdGEgPSBzRGF0YTsKKyAgICAgIHBOZXdEYXRhLT5iUGVyc2lzdGVudCA9IGJEZWZhdWx0UGVyc2lzdGVudDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6Ok9CSkVDVDoKKyAgICAgIHBOZXdEYXRhLT5uVHlwZSA9IEpTX0dsb2JhbERhdGFUeXBlOjpPQkpFQ1Q7CisgICAgICBwTmV3RGF0YS0+cERhdGEuUmVzZXQocERhdGEtPkdldElzb2xhdGUoKSwgcERhdGEpOworICAgICAgcE5ld0RhdGEtPmJQZXJzaXN0ZW50ID0gYkRlZmF1bHRQZXJzaXN0ZW50OworICAgICAgYnJlYWs7CisgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6TlVMTE9CSjoKKyAgICAgIHBOZXdEYXRhLT5uVHlwZSA9IEpTX0dsb2JhbERhdGFUeXBlOjpOVUxMT0JKOworICAgICAgcE5ld0RhdGEtPmJQZXJzaXN0ZW50ID0gYkRlZmF1bHRQZXJzaXN0ZW50OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKyAgfQorICBtX01hcEdsb2JhbFtwcm9wbmFtZV0gPSBzdGQ6Om1vdmUocE5ld0RhdGEpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX2dsb2JhbC5oIGIvZnhqcy9janNfZ2xvYmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAzZDZlOQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2pzX2dsb2JhbC5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX0NKU19HTE9CQUxfSF8KKyNkZWZpbmUgRlhKU19DSlNfR0xPQkFMX0hfCisKKyNpbmNsdWRlICJmeGpzL0pTX0RlZmluZS5oIgorCitjbGFzcyBDSlNfR2xvYmFsIDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgRGVmaW5lSlNPYmplY3RzKENGWEpTX0VuZ2luZSogcEVuZ2luZSk7CisgIHN0YXRpYyB2b2lkIERlZmluZUFsbFByb3BlcnRpZXMoQ0ZYSlNfRW5naW5lKiBwRW5naW5lKTsKKworICBzdGF0aWMgdm9pZCBxdWVyeXByb3Bfc3RhdGljKAorICAgICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BlcnR5LAorICAgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpJbnRlZ2VyPiYgaW5mbyk7CisgIHN0YXRpYyB2b2lkIGdldHByb3Bfc3RhdGljKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pOworICBzdGF0aWMgdm9pZCBwdXRwcm9wX3N0YXRpYyh2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ODo6UHJvcGVydHlDYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbyk7CisgIHN0YXRpYyB2b2lkIGRlbHByb3Bfc3RhdGljKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdjg6OlByb3BlcnR5Q2FsbGJhY2tJbmZvPHY4OjpCb29sZWFuPiYgaW5mbyk7CisKKyAgc3RhdGljIHZvaWQgc2V0UGVyc2lzdGVudF9zdGF0aWMoCisgICAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbyk7CisKKyAgZXhwbGljaXQgQ0pTX0dsb2JhbCh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9CisgIH5DSlNfR2xvYmFsKCkgb3ZlcnJpZGUge30KKworICAvLyBDSlNfT2JqZWN0CisgIHZvaWQgSW5pdEluc3RhbmNlKElKU19SdW50aW1lKiBwSVJ1bnRpbWUpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgc3RhdGljIGludCBPYmpEZWZuSUQ7CisgIHN0YXRpYyBjb25zdCBKU01ldGhvZFNwZWMgTWV0aG9kU3BlY3NbXTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19DSlNfR0xPQkFMX0hfCmRpZmYgLS1naXQgYS9meGpzL2Nqc19nbG9iYWxhcnJheXMuY3BwIGIvZnhqcy9janNfZ2xvYmFsYXJyYXlzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODU3MTYxCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfZ2xvYmFsYXJyYXlzLmNwcApAQCAtMCwwICsxLDc0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL2Nqc19nbG9iYWxhcnJheXMuaCIKKworI2RlZmluZSBHTE9CQUxfQVJSQVkocnQsIG5hbWUsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB3Y2hhcl90KiB2YWx1ZXNbXSA9IHtfX1ZBX0FSR1NfX307ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IGFycmF5ID0gKHJ0KS0+TmV3QXJyYXkoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodmFsdWVzKTsgKytpKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGFycmF5LT5TZXQoaSwgKHJ0KS0+TmV3U3RyaW5nKHZhbHVlc1tpXSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChydCktPlNldENvbnN0QXJyYXkoKG5hbWUpLCBhcnJheSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHJ0KS0+RGVmaW5lR2xvYmFsQ29uc3QoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKG5hbWUpLCBbXShjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgeyAgICAgICAgXAorICAgICAgICAgIENKU19SdW50aW1lKiBwQ3VycmVudFJ1bnRpbWUgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIENKU19SdW50aW1lOjpDdXJyZW50UnVudGltZUZyb21Jc29sYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsgICAgIFwKKyAgICAgICAgICBpZiAocEN1cnJlbnRSdW50aW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChwQ3VycmVudFJ1bnRpbWUtPkdldENvbnN0QXJyYXkobmFtZSkpOyBcCisgICAgICAgIH0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0pTX0dsb2JhbEFycmF5czo6RGVmaW5lSlNPYmplY3RzKENKU19SdW50aW1lKiBwUnVudGltZSkgeworICBHTE9CQUxfQVJSQVkocFJ1bnRpbWUsIEwiUkVfTlVNQkVSX0VOVFJZX0RPVF9TRVAiLCBMIlsrLV0/XFxkKlxcLj9cXGQqIik7CisgIEdMT0JBTF9BUlJBWShwUnVudGltZSwgTCJSRV9OVU1CRVJfQ09NTUlUX0RPVF9TRVAiLAorICAgICAgICAgICAgICAgTCJbKy1dP1xcZCsoXFwuXFxkKyk/IiwgIC8vIC0xLjAgb3IgLTEKKyAgICAgICAgICAgICAgIEwiWystXT9cXC5cXGQrIiwgICAgICAgICAvLyAtLjEKKyAgICAgICAgICAgICAgIEwiWystXT9cXGQrXFwuIik7ICAgICAgICAvLyAtMS4KKworICBHTE9CQUxfQVJSQVkocFJ1bnRpbWUsIEwiUkVfTlVNQkVSX0VOVFJZX0NPTU1BX1NFUCIsIEwiWystXT9cXGQqLD9cXGQqIik7CisgIEdMT0JBTF9BUlJBWShwUnVudGltZSwgTCJSRV9OVU1CRVJfQ09NTUlUX0NPTU1BX1NFUCIsCisgICAgICAgICAgICAgICBMIlsrLV0/XFxkKyhbLixdXFxkKyk/IiwgIC8vIC0xLDAgb3IgLTEKKyAgICAgICAgICAgICAgIEwiWystXT9bLixdXFxkKyIsICAgICAgICAgLy8gLSwxCisgICAgICAgICAgICAgICBMIlsrLV0/XFxkK1suLF0iKTsgICAgICAgIC8vIC0xLAorCisgIEdMT0JBTF9BUlJBWShwUnVudGltZSwgTCJSRV9aSVBfRU5UUlkiLCBMIlxcZHswLDV9Iik7CisgIEdMT0JBTF9BUlJBWShwUnVudGltZSwgTCJSRV9aSVBfQ09NTUlUIiwgTCJcXGR7NX0iKTsKKyAgR0xPQkFMX0FSUkFZKHBSdW50aW1lLCBMIlJFX1pJUDRfRU5UUlkiLCBMIlxcZHswLDV9KFxcLnxbLSBdKT9cXGR7MCw0fSIpOworICBHTE9CQUxfQVJSQVkocFJ1bnRpbWUsIEwiUkVfWklQNF9DT01NSVQiLCBMIlxcZHs1fShcXC58Wy0gXSk/XFxkezR9Iik7CisgIEdMT0JBTF9BUlJBWShwUnVudGltZSwgTCJSRV9QSE9ORV9FTlRSWSIsCisgICAgICAgICAgICAgICAvLyA1NTUtMTIzNCBvciA0MDggNTU1LTEyMzQKKyAgICAgICAgICAgICAgIEwiXFxkezAsM30oXFwufFstIF0pP1xcZHswLDN9KFxcLnxbLSBdKT9cXGR7MCw0fSIsCisKKyAgICAgICAgICAgICAgIC8vICg0MDgKKyAgICAgICAgICAgICAgIEwiXFwoXFxkezAsM30iLAorCisgICAgICAgICAgICAgICAvLyAoNDA4KSA1NTUtMTIzNAorICAgICAgICAgICAgICAgLy8gKGFsbG93IHRoZSBhZGRpdGlvbiBvZiBwYXJlbnMgYXMgYW4gYWZ0ZXJ0aG91Z2h0KQorICAgICAgICAgICAgICAgTCJcXChcXGR7MCwzfVxcKShcXC58Wy0gXSk/XFxkezAsM30oXFwufFstIF0pP1xcZHswLDR9IiwKKworICAgICAgICAgICAgICAgLy8gKDQwOCA1NTUtMTIzNAorICAgICAgICAgICAgICAgTCJcXChcXGR7MCwzfShcXC58Wy0gXSk/XFxkezAsM30oXFwufFstIF0pP1xcZHswLDR9IiwKKworICAgICAgICAgICAgICAgLy8gNDA4KSA1NTUtMTIzNAorICAgICAgICAgICAgICAgTCJcXGR7MCwzfVxcKShcXC58Wy0gXSk/XFxkezAsM30oXFwufFstIF0pP1xcZHswLDR9IiwKKworICAgICAgICAgICAgICAgLy8gaW50ZXJuYXRpb25hbAorICAgICAgICAgICAgICAgTCIwMTEoXFwufFstIFxcZF0pKiIpOworCisgIEdMT0JBTF9BUlJBWSgKKyAgICAgIHBSdW50aW1lLCBMIlJFX1BIT05FX0NPTU1JVCIsIEwiXFxkezN9KFxcLnxbLSBdKT9cXGR7NH0iLCAgLy8gNTU1LTEyMzQKKyAgICAgIEwiXFxkezN9KFxcLnxbLSBdKT9cXGR7M30oXFwufFstIF0pP1xcZHs0fSIsICAgICAgICAgICAgICAgLy8gNDA4IDU1NS0xMjM0CisgICAgICBMIlxcKFxcZHszfVxcKShcXC58Wy0gXSk/XFxkezN9KFxcLnxbLSBdKT9cXGR7NH0iLCAgLy8gKDQwOCkgNTU1LTEyMzQKKyAgICAgIEwiMDExKFxcLnxbLSBcXGRdKSoiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRlcm5hdGlvbmFsCisKKyAgR0xPQkFMX0FSUkFZKHBSdW50aW1lLCBMIlJFX1NTTl9FTlRSWSIsCisgICAgICAgICAgICAgICBMIlxcZHswLDN9KFxcLnxbLSBdKT9cXGR7MCwyfShcXC58Wy0gXSk/XFxkezAsNH0iKTsKKworICBHTE9CQUxfQVJSQVkocFJ1bnRpbWUsIEwiUkVfU1NOX0NPTU1JVCIsCisgICAgICAgICAgICAgICBMIlxcZHszfShcXC58Wy0gXSk/XFxkezJ9KFxcLnxbLSBdKT9cXGR7NH0iKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX2dsb2JhbGFycmF5cy5oIGIvZnhqcy9janNfZ2xvYmFsYXJyYXlzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk3Yjk3YgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2pzX2dsb2JhbGFycmF5cy5oCkBAIC0wLDAgKzEsMTcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX0NKU19HTE9CQUxBUlJBWVNfSF8KKyNkZWZpbmUgRlhKU19DSlNfR0xPQkFMQVJSQVlTX0hfCisKKyNpbmNsdWRlICJmeGpzL0pTX0RlZmluZS5oIgorCitjbGFzcyBDSlNfR2xvYmFsQXJyYXlzIDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgRGVmaW5lSlNPYmplY3RzKENKU19SdW50aW1lKiBwUnVudG1pZSk7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfQ0pTX0dMT0JBTEFSUkFZU19IXwpkaWZmIC0tZ2l0IGEvZnhqcy9janNfZ2xvYmFsY29uc3RzLmNwcCBiL2Z4anMvY2pzX2dsb2JhbGNvbnN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk4NDc5NwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2pzX2dsb2JhbGNvbnN0cy5jcHAKQEAgLTAsMCArMSw0NyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy9janNfZ2xvYmFsY29uc3RzLmgiCisKKyNkZWZpbmUgR0xPQkFMX1NUUklORyhydCwgbmFtZSwgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChydCktPkRlZmluZUdsb2JhbENvbnN0KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKG5hbWUpLCBbXShjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbykgeyAgIFwKKyAgICAgICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBDRlhKU19FbmdpbmU6OkN1cnJlbnRFbmdpbmVGcm9tSXNvbGF0ZShpbmZvLkdldElzb2xhdGUoKSkgXAorICAgICAgICAgICAgICAgIC0+TmV3U3RyaW5nKHZhbHVlKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0pCisKKy8vIHN0YXRpYwordm9pZCBDSlNfR2xvYmFsQ29uc3RzOjpEZWZpbmVKU09iamVjdHMoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIEdMT0JBTF9TVFJJTkcocFJ1bnRpbWUsIEwiSURTX0dSRUFURVJfVEhBTiIsCisgICAgICAgICAgICAgICAgTCJJbnZhbGlkIHZhbHVlOiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlIHMuIik7CisKKyAgR0xPQkFMX1NUUklORyhwUnVudGltZSwgTCJJRFNfR1RfQU5EX0xUIiwKKyAgICAgICAgICAgICAgICBMIkludmFsaWQgdmFsdWU6IG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICUgcyAiCisgICAgICAgICAgICAgICAgTCJhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICUgcy4iKTsKKworICBHTE9CQUxfU1RSSU5HKHBSdW50aW1lLCBMIklEU19MRVNTX1RIQU4iLAorICAgICAgICAgICAgICAgIEwiSW52YWxpZCB2YWx1ZTogbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJSBzLiIpOworCisgIEdMT0JBTF9TVFJJTkcocFJ1bnRpbWUsIEwiSURTX0lOVkFMSURfTU9OVEgiLCBMIioqSW52YWxpZCoqIik7CisgIEdMT0JBTF9TVFJJTkcoCisgICAgICBwUnVudGltZSwgTCJJRFNfSU5WQUxJRF9EQVRFIiwKKyAgICAgIEwiSW52YWxpZCBkYXRlIC8gdGltZTogcGxlYXNlIGVuc3VyZSB0aGF0IHRoZSBkYXRlIC8gdGltZSBleGlzdHMuRmllbGQiKTsKKworICBHTE9CQUxfU1RSSU5HKHBSdW50aW1lLCBMIklEU19JTlZBTElEX1ZBTFVFIiwKKyAgICAgICAgICAgICAgICBMIlRoZSB2YWx1ZSBlbnRlcmVkIGRvZXMgbm90IG1hdGNoIHRoZSBmb3JtYXQgb2YgdGhlIGZpZWxkIik7CisKKyAgR0xPQkFMX1NUUklORyhwUnVudGltZSwgTCJJRFNfQU0iLCBMImFtIik7CisgIEdMT0JBTF9TVFJJTkcocFJ1bnRpbWUsIEwiSURTX1BNIiwgTCJwbSIpOworICBHTE9CQUxfU1RSSU5HKHBSdW50aW1lLCBMIklEU19NT05USF9JTkZPIiwKKyAgICAgICAgICAgICAgICBMIkphbnVhcnlbMV0gRmVicnVhcnlbMl0gTWFyY2hbM10gQXByaWxbNF0gTWF5WzVdICIKKyAgICAgICAgICAgICAgICBMIkp1bmVbNl0gSnVseVs3XSBBdWd1c3RbOF0gU2VwdGVtYmVyWzldIE9jdG9iZXJbMTBdICIKKyAgICAgICAgICAgICAgICBMIk5vdmVtYmVyWzExXSBEZWNlbWJlclsxMl0gU2VwdFs5XSBKYW5bMV0gRmViWzJdIE1hclszXSAiCisgICAgICAgICAgICAgICAgTCJBcHJbNF0gSnVuWzZdIEp1bFs3XSBBdWdbOF0gU2VwWzldIE9jdFsxMF0gTm92WzExXSAiCisgICAgICAgICAgICAgICAgTCJEZWNbMTJdIik7CisKKyAgR0xPQkFMX1NUUklORyhwUnVudGltZSwgTCJJRFNfU1RBUlRVUF9DT05TT0xFX01TRyIsIEwiKiogXiBfIF4gKioiKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX2dsb2JhbGNvbnN0cy5oIGIvZnhqcy9janNfZ2xvYmFsY29uc3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2NjE4ZQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2pzX2dsb2JhbGNvbnN0cy5oCkBAIC0wLDAgKzEsMTcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX0NKU19HTE9CQUxDT05TVFNfSF8KKyNkZWZpbmUgRlhKU19DSlNfR0xPQkFMQ09OU1RTX0hfCisKKyNpbmNsdWRlICJmeGpzL0pTX0RlZmluZS5oIgorCitjbGFzcyBDSlNfR2xvYmFsQ29uc3RzIDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgRGVmaW5lSlNPYmplY3RzKENKU19SdW50aW1lKiBwUnVudGltZSk7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfQ0pTX0dMT0JBTENPTlNUU19IXwpkaWZmIC0tZ2l0IGEvZnhqcy9janNfZ2xvYmFsZGF0YS5jcHAgYi9meGpzL2Nqc19nbG9iYWxkYXRhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzhiY2U1Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfZ2xvYmFsZGF0YS5jcHAKQEAgLTAsMCArMSwzOTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMvY2pzX2dsb2JhbGRhdGEuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKKworI2RlZmluZSBKU19NQVhHTE9CQUxEQVRBICgxMDI0ICogNCAtIDgpCisKKyNkZWZpbmUgUkVBREVSX0pTX0dMT0JBTERBVEFfRklMRU5BTUUgTCJSZWFkZXJfSnNHbG9iYWwuRGF0YSIKKyNkZWZpbmUgUEhBTlRPTV9KU19HTE9CQUxEQVRBX0ZJTEVOQU1FIEwiUGhhbnRvbV9Kc0dsb2JhbC5EYXRhIgorI2RlZmluZSBTREtfSlNfR0xPQkFMREFUQV9GSUxFTkFNRSBMIlNES19Kc0dsb2JhbC5EYXRhIgorCituYW1lc3BhY2UgeworCitjb25zdCB1aW50OF90IEpTX1JDNEtFWVtdID0geworICAgIDB4MTksIDB4YTgsIDB4ZTgsIDB4MDEsIDB4ZjYsIDB4YTgsIDB4YjYsIDB4NGQsIDB4ODIsIDB4MDQsIDB4NDUsIDB4NmQsCisgICAgMHhiNCwgMHhjZiwgMHhkNywgMHg3NywgMHg2NywgMHhmOSwgMHg3NSwgMHg5ZiwgMHhmMCwgMHhlMCwgMHgxZSwgMHg1MSwKKyAgICAweGVlLCAweDQ2LCAweGZkLCAweDBiLCAweGM5LCAweDkzLCAweDI1LCAweDU1LCAweDRhLCAweGVlLCAweGUwLCAweDE2LAorICAgIDB4ZDAsIDB4ZGYsIDB4OGMsIDB4ZmEsIDB4MmEsIDB4YTksIDB4NDksIDB4ZmQsIDB4OTcsIDB4MWMsIDB4MGUsIDB4MjIsCisgICAgMHgxMywgMHgyOCwgMHg3YywgMHhhZiwgMHhjNCwgMHhmYywgMHg5YywgMHgxMiwgMHg2NSwgMHg4YywgMHg0ZSwgMHg1YiwKKyAgICAweDA0LCAweDc1LCAweDg5LCAweGM5LCAweGIxLCAweGVkLCAweDUwLCAweGNhLCAweDk2LCAweDZmLCAweDFhLCAweDdhLAorICAgIDB4ZmUsIDB4NTgsIDB4NWQsIDB4ZWMsIDB4MTksIDB4NGEsIDB4ZjYsIDB4MzUsIDB4NmEsIDB4OTcsIDB4MTQsIDB4MDAsCisgICAgMHgwZSwgMHhkMCwgMHg2YiwgMHhiYiwgMHhkNSwgMHg3NSwgMHg1NSwgMHg4YiwgMHg2ZSwgMHg2YiwgMHgxOSwgMHhhMCwKKyAgICAweGY4LCAweDc3LCAweGQ1LCAweGEzfTsKKworLy8gUmV0dXJucyB0cnVlIGlmIG5vbi1lbXB0eSwgc2V0dGluZyBzUHJvcE5hbWUKK2Jvb2wgVHJpbVByb3BOYW1lKEJ5dGVTdHJpbmcqIHNQcm9wTmFtZSkgeworICBzUHJvcE5hbWUtPlRyaW0oKTsKKyAgcmV0dXJuIHNQcm9wTmFtZS0+R2V0TGVuZ3RoKCkgIT0gMDsKK30KKworQ0pTX0dsb2JhbERhdGEqIGdfcEluc3RhbmNlID0gbnVsbHB0cjsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworQ0pTX0dsb2JhbERhdGEqIENKU19HbG9iYWxEYXRhOjpHZXRSZXRhaW5lZEluc3RhbmNlKAorICAgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEFwcCkgeworICBpZiAoIWdfcEluc3RhbmNlKSB7CisgICAgZ19wSW5zdGFuY2UgPSBuZXcgQ0pTX0dsb2JhbERhdGEoKTsKKyAgfQorICArK2dfcEluc3RhbmNlLT5tX1JlZkNvdW50OworICByZXR1cm4gZ19wSW5zdGFuY2U7Cit9CisKK3ZvaWQgQ0pTX0dsb2JhbERhdGE6OlJlbGVhc2UoKSB7CisgIGlmICghLS1tX1JlZkNvdW50KSB7CisgICAgZGVsZXRlIGdfcEluc3RhbmNlOworICAgIGdfcEluc3RhbmNlID0gbnVsbHB0cjsKKyAgfQorfQorCitDSlNfR2xvYmFsRGF0YTo6Q0pTX0dsb2JhbERhdGEoKQorICAgIDogbV9SZWZDb3VudCgwKSwgbV9zRmlsZVBhdGgoU0RLX0pTX0dMT0JBTERBVEFfRklMRU5BTUUpIHsKKyAgTG9hZEdsb2JhbFBlcnNpc3RlbnRWYXJpYWJsZXMoKTsKK30KKworQ0pTX0dsb2JhbERhdGE6On5DSlNfR2xvYmFsRGF0YSgpIHsKKyAgU2F2ZUdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKCk7Cit9CisKK0NKU19HbG9iYWxEYXRhOjppdGVyYXRvciBDSlNfR2xvYmFsRGF0YTo6RmluZEdsb2JhbFZhcmlhYmxlKAorICAgIGNvbnN0IEJ5dGVTdHJpbmcmIHByb3BuYW1lKSB7CisgIGZvciAoYXV0byBpdCA9IG1fYXJyYXlHbG9iYWxEYXRhLmJlZ2luKCk7IGl0ICE9IG1fYXJyYXlHbG9iYWxEYXRhLmVuZCgpOworICAgICAgICsraXQpIHsKKyAgICBpZiAoKCppdCktPmRhdGEuc0tleSA9PSBwcm9wbmFtZSkKKyAgICAgIHJldHVybiBpdDsKKyAgfQorICByZXR1cm4gbV9hcnJheUdsb2JhbERhdGEuZW5kKCk7Cit9CisKK0NKU19HbG9iYWxEYXRhOjpjb25zdF9pdGVyYXRvciBDSlNfR2xvYmFsRGF0YTo6RmluZEdsb2JhbFZhcmlhYmxlKAorICAgIGNvbnN0IEJ5dGVTdHJpbmcmIHByb3BuYW1lKSBjb25zdCB7CisgIGZvciAoYXV0byBpdCA9IG1fYXJyYXlHbG9iYWxEYXRhLmJlZ2luKCk7IGl0ICE9IG1fYXJyYXlHbG9iYWxEYXRhLmVuZCgpOworICAgICAgICsraXQpIHsKKyAgICBpZiAoKCppdCktPmRhdGEuc0tleSA9PSBwcm9wbmFtZSkKKyAgICAgIHJldHVybiBpdDsKKyAgfQorICByZXR1cm4gbV9hcnJheUdsb2JhbERhdGEuZW5kKCk7Cit9CisKK0NKU19HbG9iYWxEYXRhX0VsZW1lbnQqIENKU19HbG9iYWxEYXRhOjpHZXRHbG9iYWxWYXJpYWJsZSgKKyAgICBjb25zdCBCeXRlU3RyaW5nJiBwcm9wbmFtZSkgeworICBhdXRvIGl0ZXIgPSBGaW5kR2xvYmFsVmFyaWFibGUocHJvcG5hbWUpOworICByZXR1cm4gaXRlciAhPSBtX2FycmF5R2xvYmFsRGF0YS5lbmQoKSA/IGl0ZXItPmdldCgpIDogbnVsbHB0cjsKK30KKwordm9pZCBDSlNfR2xvYmFsRGF0YTo6U2V0R2xvYmFsVmFyaWFibGVOdW1iZXIoY29uc3QgQnl0ZVN0cmluZyYgcHJvcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZERhdGEpIHsKKyAgQnl0ZVN0cmluZyBzUHJvcE5hbWUocHJvcG5hbWUpOworICBpZiAoIVRyaW1Qcm9wTmFtZSgmc1Byb3BOYW1lKSkKKyAgICByZXR1cm47CisKKyAgaWYgKENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBEYXRhID0gR2V0R2xvYmFsVmFyaWFibGUoc1Byb3BOYW1lKSkgeworICAgIHBEYXRhLT5kYXRhLm5UeXBlID0gSlNfR2xvYmFsRGF0YVR5cGU6Ok5VTUJFUjsKKyAgICBwRGF0YS0+ZGF0YS5kRGF0YSA9IGREYXRhOworICAgIHJldHVybjsKKyAgfQorICBhdXRvIHBOZXdEYXRhID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKU19HbG9iYWxEYXRhX0VsZW1lbnQ+KCk7CisgIHBOZXdEYXRhLT5kYXRhLnNLZXkgPSBzUHJvcE5hbWU7CisgIHBOZXdEYXRhLT5kYXRhLm5UeXBlID0gSlNfR2xvYmFsRGF0YVR5cGU6Ok5VTUJFUjsKKyAgcE5ld0RhdGEtPmRhdGEuZERhdGEgPSBkRGF0YTsKKyAgbV9hcnJheUdsb2JhbERhdGEucHVzaF9iYWNrKHN0ZDo6bW92ZShwTmV3RGF0YSkpOworfQorCit2b2lkIENKU19HbG9iYWxEYXRhOjpTZXRHbG9iYWxWYXJpYWJsZUJvb2xlYW4oY29uc3QgQnl0ZVN0cmluZyYgcHJvcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRGF0YSkgeworICBCeXRlU3RyaW5nIHNQcm9wTmFtZShwcm9wbmFtZSk7CisgIGlmICghVHJpbVByb3BOYW1lKCZzUHJvcE5hbWUpKQorICAgIHJldHVybjsKKworICBpZiAoQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcERhdGEgPSBHZXRHbG9iYWxWYXJpYWJsZShzUHJvcE5hbWUpKSB7CisgICAgcERhdGEtPmRhdGEublR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6Qk9PTEVBTjsKKyAgICBwRGF0YS0+ZGF0YS5iRGF0YSA9IGJEYXRhOworICAgIHJldHVybjsKKyAgfQorICBhdXRvIHBOZXdEYXRhID0gcGRmaXVtOjpNYWtlVW5pcXVlPENKU19HbG9iYWxEYXRhX0VsZW1lbnQ+KCk7CisgIHBOZXdEYXRhLT5kYXRhLnNLZXkgPSBzUHJvcE5hbWU7CisgIHBOZXdEYXRhLT5kYXRhLm5UeXBlID0gSlNfR2xvYmFsRGF0YVR5cGU6OkJPT0xFQU47CisgIHBOZXdEYXRhLT5kYXRhLmJEYXRhID0gYkRhdGE7CisgIG1fYXJyYXlHbG9iYWxEYXRhLnB1c2hfYmFjayhzdGQ6Om1vdmUocE5ld0RhdGEpKTsKK30KKwordm9pZCBDSlNfR2xvYmFsRGF0YTo6U2V0R2xvYmFsVmFyaWFibGVTdHJpbmcoY29uc3QgQnl0ZVN0cmluZyYgcHJvcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nJiBzRGF0YSkgeworICBCeXRlU3RyaW5nIHNQcm9wTmFtZShwcm9wbmFtZSk7CisgIGlmICghVHJpbVByb3BOYW1lKCZzUHJvcE5hbWUpKQorICAgIHJldHVybjsKKworICBpZiAoQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcERhdGEgPSBHZXRHbG9iYWxWYXJpYWJsZShzUHJvcE5hbWUpKSB7CisgICAgcERhdGEtPmRhdGEublR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6U1RSSU5HOworICAgIHBEYXRhLT5kYXRhLnNEYXRhID0gc0RhdGE7CisgICAgcmV0dXJuOworICB9CisgIGF1dG8gcE5ld0RhdGEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pTX0dsb2JhbERhdGFfRWxlbWVudD4oKTsKKyAgcE5ld0RhdGEtPmRhdGEuc0tleSA9IHNQcm9wTmFtZTsKKyAgcE5ld0RhdGEtPmRhdGEublR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6U1RSSU5HOworICBwTmV3RGF0YS0+ZGF0YS5zRGF0YSA9IHNEYXRhOworICBtX2FycmF5R2xvYmFsRGF0YS5wdXNoX2JhY2soc3RkOjptb3ZlKHBOZXdEYXRhKSk7Cit9CisKK3ZvaWQgQ0pTX0dsb2JhbERhdGE6OlNldEdsb2JhbFZhcmlhYmxlT2JqZWN0KAorICAgIGNvbnN0IEJ5dGVTdHJpbmcmIHByb3BuYW1lLAorICAgIGNvbnN0IENKU19HbG9iYWxWYXJpYWJsZUFycmF5JiBhcnJheSkgeworICBCeXRlU3RyaW5nIHNQcm9wTmFtZShwcm9wbmFtZSk7CisgIGlmICghVHJpbVByb3BOYW1lKCZzUHJvcE5hbWUpKQorICAgIHJldHVybjsKKworICBpZiAoQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcERhdGEgPSBHZXRHbG9iYWxWYXJpYWJsZShzUHJvcE5hbWUpKSB7CisgICAgcERhdGEtPmRhdGEublR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6T0JKRUNUOworICAgIHBEYXRhLT5kYXRhLm9iakRhdGEuQ29weShhcnJheSk7CisgICAgcmV0dXJuOworICB9CisgIGF1dG8gcE5ld0RhdGEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pTX0dsb2JhbERhdGFfRWxlbWVudD4oKTsKKyAgcE5ld0RhdGEtPmRhdGEuc0tleSA9IHNQcm9wTmFtZTsKKyAgcE5ld0RhdGEtPmRhdGEublR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6T0JKRUNUOworICBwTmV3RGF0YS0+ZGF0YS5vYmpEYXRhLkNvcHkoYXJyYXkpOworICBtX2FycmF5R2xvYmFsRGF0YS5wdXNoX2JhY2soc3RkOjptb3ZlKHBOZXdEYXRhKSk7Cit9CisKK3ZvaWQgQ0pTX0dsb2JhbERhdGE6OlNldEdsb2JhbFZhcmlhYmxlTnVsbChjb25zdCBCeXRlU3RyaW5nJiBwcm9wbmFtZSkgeworICBCeXRlU3RyaW5nIHNQcm9wTmFtZShwcm9wbmFtZSk7CisgIGlmICghVHJpbVByb3BOYW1lKCZzUHJvcE5hbWUpKQorICAgIHJldHVybjsKKworICBpZiAoQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogcERhdGEgPSBHZXRHbG9iYWxWYXJpYWJsZShzUHJvcE5hbWUpKSB7CisgICAgcERhdGEtPmRhdGEublR5cGUgPSBKU19HbG9iYWxEYXRhVHlwZTo6TlVMTE9CSjsKKyAgICByZXR1cm47CisgIH0KKyAgYXV0byBwTmV3RGF0YSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDSlNfR2xvYmFsRGF0YV9FbGVtZW50PigpOworICBwTmV3RGF0YS0+ZGF0YS5zS2V5ID0gc1Byb3BOYW1lOworICBwTmV3RGF0YS0+ZGF0YS5uVHlwZSA9IEpTX0dsb2JhbERhdGFUeXBlOjpOVUxMT0JKOworICBtX2FycmF5R2xvYmFsRGF0YS5wdXNoX2JhY2soc3RkOjptb3ZlKHBOZXdEYXRhKSk7Cit9CisKK2Jvb2wgQ0pTX0dsb2JhbERhdGE6OlNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChjb25zdCBCeXRlU3RyaW5nJiBwcm9wbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJQZXJzaXN0ZW50KSB7CisgIEJ5dGVTdHJpbmcgc1Byb3BOYW1lKHByb3BuYW1lKTsKKyAgaWYgKCFUcmltUHJvcE5hbWUoJnNQcm9wTmFtZSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENKU19HbG9iYWxEYXRhX0VsZW1lbnQqIHBEYXRhID0gR2V0R2xvYmFsVmFyaWFibGUoc1Byb3BOYW1lKTsKKyAgaWYgKCFwRGF0YSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcERhdGEtPmJQZXJzaXN0ZW50ID0gYlBlcnNpc3RlbnQ7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENKU19HbG9iYWxEYXRhOjpEZWxldGVHbG9iYWxWYXJpYWJsZShjb25zdCBCeXRlU3RyaW5nJiBwcm9wbmFtZSkgeworICBCeXRlU3RyaW5nIHNQcm9wTmFtZShwcm9wbmFtZSk7CisgIGlmICghVHJpbVByb3BOYW1lKCZzUHJvcE5hbWUpKQorICAgIHJldHVybiBmYWxzZTsKKworICBhdXRvIGl0ZXIgPSBGaW5kR2xvYmFsVmFyaWFibGUoc1Byb3BOYW1lKTsKKyAgaWYgKGl0ZXIgPT0gbV9hcnJheUdsb2JhbERhdGEuZW5kKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG1fYXJyYXlHbG9iYWxEYXRhLmVyYXNlKGl0ZXIpOworICByZXR1cm4gdHJ1ZTsKK30KKworaW50MzJfdCBDSlNfR2xvYmFsRGF0YTo6R2V0U2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9hcnJheUdsb2JhbERhdGEpOworfQorCitDSlNfR2xvYmFsRGF0YV9FbGVtZW50KiBDSlNfR2xvYmFsRGF0YTo6R2V0QXQoaW50IGluZGV4KSBjb25zdCB7CisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gR2V0U2l6ZSgpKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gbV9hcnJheUdsb2JhbERhdGFbaW5kZXhdLmdldCgpOworfQorCit2b2lkIENKU19HbG9iYWxEYXRhOjpMb2FkR2xvYmFsUGVyc2lzdGVudFZhcmlhYmxlcygpIHsKKyAgdWludDhfdCogcEJ1ZmZlciA9IG51bGxwdHI7CisgIGludDMyX3Qgbkxlbmd0aCA9IDA7CisKKyAgTG9hZEZpbGVCdWZmZXIobV9zRmlsZVBhdGguY19zdHIoKSwgcEJ1ZmZlciwgbkxlbmd0aCk7CisgIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKHBCdWZmZXIsIG5MZW5ndGgsIEpTX1JDNEtFWSwgc2l6ZW9mKEpTX1JDNEtFWSkpOworCisgIGlmIChwQnVmZmVyKSB7CisgICAgdWludDhfdCogcCA9IHBCdWZmZXI7CisgICAgdWludDE2X3Qgd1R5cGUgPSAqKCh1aW50MTZfdCopcCk7CisgICAgcCArPSBzaXplb2YodWludDE2X3QpOworCisgICAgaWYgKHdUeXBlID09ICh1aW50MTZfdCkoKCdYJyA8PCA4KSB8ICdGJykpIHsKKyAgICAgIHVpbnQxNl90IHdWZXJzaW9uID0gKigodWludDE2X3QqKXApOworICAgICAgcCArPSBzaXplb2YodWludDE2X3QpOworCisgICAgICBBU1NFUlQod1ZlcnNpb24gPD0gMik7CisKKyAgICAgIHVpbnQzMl90IGR3Q291bnQgPSAqKCh1aW50MzJfdCopcCk7CisgICAgICBwICs9IHNpemVvZih1aW50MzJfdCk7CisKKyAgICAgIHVpbnQzMl90IGR3U2l6ZSA9ICooKHVpbnQzMl90KilwKTsKKyAgICAgIHAgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKworICAgICAgaWYgKGR3U2l6ZSA9PSBuTGVuZ3RoIC0gc2l6ZW9mKHVpbnQxNl90KSAqIDIgLSBzaXplb2YodWludDMyX3QpICogMikgeworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDAsIHN6ID0gZHdDb3VudDsgaSA8IHN6OyBpKyspIHsKKyAgICAgICAgICBpZiAocCA+IHBCdWZmZXIgKyBuTGVuZ3RoKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICB1aW50MzJfdCBkd05hbWVMZW4gPSAqKCh1aW50MzJfdCopcCk7CisgICAgICAgICAgcCArPSBzaXplb2YodWludDMyX3QpOworCisgICAgICAgICAgaWYgKHAgKyBkd05hbWVMZW4gPiBwQnVmZmVyICsgbkxlbmd0aCkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgQnl0ZVN0cmluZyBzRW50cnkgPSBCeXRlU3RyaW5nKHAsIGR3TmFtZUxlbik7CisgICAgICAgICAgcCArPSBzaXplb2YoY2hhcikgKiBkd05hbWVMZW47CisKKyAgICAgICAgICBKU19HbG9iYWxEYXRhVHlwZSB3RGF0YVR5cGUgPQorICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxKU19HbG9iYWxEYXRhVHlwZT4oKigodWludDE2X3QqKXApKTsKKyAgICAgICAgICBwICs9IHNpemVvZih1aW50MTZfdCk7CisKKyAgICAgICAgICBzd2l0Y2ggKHdEYXRhVHlwZSkgeworICAgICAgICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6TlVNQkVSOiB7CisgICAgICAgICAgICAgIGRvdWJsZSBkRGF0YSA9IDA7CisgICAgICAgICAgICAgIHN3aXRjaCAod1ZlcnNpb24pIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6IHsKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RGF0YSA9ICooKHVpbnQzMl90KilwKTsKKyAgICAgICAgICAgICAgICAgIHAgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICAgICAgICAgICAgICAgIGREYXRhID0gZHdEYXRhOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiB7CisgICAgICAgICAgICAgICAgICBkRGF0YSA9ICooKGRvdWJsZSopcCk7CisgICAgICAgICAgICAgICAgICBwICs9IHNpemVvZihkb3VibGUpOworICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVOdW1iZXIoc0VudHJ5LCBkRGF0YSk7CisgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlUGVyc2lzdGVudChzRW50cnksIHRydWUpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6OkJPT0xFQU46IHsKKyAgICAgICAgICAgICAgdWludDE2X3Qgd0RhdGEgPSAqKCh1aW50MTZfdCopcCk7CisgICAgICAgICAgICAgIHAgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKyAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVCb29sZWFuKHNFbnRyeSwgKGJvb2wpKHdEYXRhID09IDEpKTsKKyAgICAgICAgICAgICAgU2V0R2xvYmFsVmFyaWFibGVQZXJzaXN0ZW50KHNFbnRyeSwgdHJ1ZSk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6U1RSSU5HOiB7CisgICAgICAgICAgICAgIHVpbnQzMl90IGR3TGVuZ3RoID0gKigodWludDMyX3QqKXApOworICAgICAgICAgICAgICBwICs9IHNpemVvZih1aW50MzJfdCk7CisKKyAgICAgICAgICAgICAgaWYgKHAgKyBkd0xlbmd0aCA+IHBCdWZmZXIgKyBuTGVuZ3RoKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlU3RyaW5nKHNFbnRyeSwgQnl0ZVN0cmluZyhwLCBkd0xlbmd0aCkpOworICAgICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQoc0VudHJ5LCB0cnVlKTsKKyAgICAgICAgICAgICAgcCArPSBzaXplb2YoY2hhcikgKiBkd0xlbmd0aDsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpOVUxMT0JKOiB7CisgICAgICAgICAgICAgIFNldEdsb2JhbFZhcmlhYmxlTnVsbChzRW50cnkpOworICAgICAgICAgICAgICBTZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQoc0VudHJ5LCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6Ok9CSkVDVDoKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIEZYX0ZyZWUocEJ1ZmZlcik7CisgIH0KK30KKwordm9pZCBDSlNfR2xvYmFsRGF0YTo6U2F2ZUdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKCkgeworICB1aW50MzJfdCBuQ291bnQgPSAwOworICBDRlhfQmluYXJ5QnVmIHNEYXRhOworICBmb3IgKGNvbnN0IGF1dG8mIHBFbGVtZW50IDogbV9hcnJheUdsb2JhbERhdGEpIHsKKyAgICBpZiAocEVsZW1lbnQtPmJQZXJzaXN0ZW50KSB7CisgICAgICBDRlhfQmluYXJ5QnVmIHNFbGVtZW50OworICAgICAgTWFrZUJ5dGVTdHJpbmcocEVsZW1lbnQtPmRhdGEuc0tleSwgJnBFbGVtZW50LT5kYXRhLCBzRWxlbWVudCk7CisgICAgICBpZiAoc0RhdGEuR2V0U2l6ZSgpICsgc0VsZW1lbnQuR2V0U2l6ZSgpID4gSlNfTUFYR0xPQkFMREFUQSkKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIHNEYXRhLkFwcGVuZEJsb2NrKHNFbGVtZW50LkdldEJ1ZmZlcigpLCBzRWxlbWVudC5HZXRTaXplKCkpOworICAgICAgbkNvdW50Kys7CisgICAgfQorICB9CisKKyAgQ0ZYX0JpbmFyeUJ1ZiBzRmlsZTsKKyAgdWludDE2X3Qgd1R5cGUgPSAodWludDE2X3QpKCgnWCcgPDwgOCkgfCAnRicpOworICBzRmlsZS5BcHBlbmRCbG9jaygmd1R5cGUsIHNpemVvZih1aW50MTZfdCkpOworICB1aW50MTZfdCB3VmVyc2lvbiA9IDI7CisgIHNGaWxlLkFwcGVuZEJsb2NrKCZ3VmVyc2lvbiwgc2l6ZW9mKHVpbnQxNl90KSk7CisgIHNGaWxlLkFwcGVuZEJsb2NrKCZuQ291bnQsIHNpemVvZih1aW50MzJfdCkpOworICB1aW50MzJfdCBkd1NpemUgPSBzRGF0YS5HZXRTaXplKCk7CisgIHNGaWxlLkFwcGVuZEJsb2NrKCZkd1NpemUsIHNpemVvZih1aW50MzJfdCkpOworCisgIHNGaWxlLkFwcGVuZEJsb2NrKHNEYXRhLkdldEJ1ZmZlcigpLCBzRGF0YS5HZXRTaXplKCkpOworCisgIENSWVBUX0FyY0ZvdXJDcnlwdEJsb2NrKHNGaWxlLkdldEJ1ZmZlcigpLCBzRmlsZS5HZXRTaXplKCksIEpTX1JDNEtFWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEpTX1JDNEtFWSkpOworICBXcml0ZUZpbGVCdWZmZXIobV9zRmlsZVBhdGguY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHNGaWxlLkdldEJ1ZmZlcigpKSwgc0ZpbGUuR2V0U2l6ZSgpKTsKK30KKwordm9pZCBDSlNfR2xvYmFsRGF0YTo6TG9hZEZpbGVCdWZmZXIoY29uc3Qgd2NoYXJfdCogc0ZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuTGVuZ3RoKSB7CisgIC8vIFVuU3VwcG9ydC4KK30KKwordm9pZCBDSlNfR2xvYmFsRGF0YTo6V3JpdGVGaWxlQnVmZmVyKGNvbnN0IHdjaGFyX3QqIHNGaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbkxlbmd0aCkgeworICAvLyBVblN1cHBvcnQuCit9CisKK3ZvaWQgQ0pTX0dsb2JhbERhdGE6Ok1ha2VCeXRlU3RyaW5nKGNvbnN0IEJ5dGVTdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSlNfS2V5VmFsdWUqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0JpbmFyeUJ1ZiYgc0RhdGEpIHsKKyAgc3dpdGNoIChwRGF0YS0+blR5cGUpIHsKKyAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpOVU1CRVI6IHsKKyAgICAgIHVpbnQzMl90IGR3TmFtZUxlbiA9ICh1aW50MzJfdCluYW1lLkdldExlbmd0aCgpOworICAgICAgc0RhdGEuQXBwZW5kQmxvY2soJmR3TmFtZUxlbiwgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICBzRGF0YS5BcHBlbmRTdHJpbmcobmFtZSk7CisgICAgICBzRGF0YS5BcHBlbmRCbG9jaygmcERhdGEtPm5UeXBlLCBzaXplb2YodWludDE2X3QpKTsKKworICAgICAgZG91YmxlIGREYXRhID0gcERhdGEtPmREYXRhOworICAgICAgc0RhdGEuQXBwZW5kQmxvY2soJmREYXRhLCBzaXplb2YoZG91YmxlKSk7CisgICAgfSBicmVhazsKKyAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpCT09MRUFOOiB7CisgICAgICB1aW50MzJfdCBkd05hbWVMZW4gPSAodWludDMyX3QpbmFtZS5HZXRMZW5ndGgoKTsKKyAgICAgIHNEYXRhLkFwcGVuZEJsb2NrKCZkd05hbWVMZW4sIHNpemVvZih1aW50MzJfdCkpOworICAgICAgc0RhdGEuQXBwZW5kU3RyaW5nKG5hbWUpOworICAgICAgc0RhdGEuQXBwZW5kQmxvY2soJnBEYXRhLT5uVHlwZSwgc2l6ZW9mKHVpbnQxNl90KSk7CisKKyAgICAgIHVpbnQxNl90IHdEYXRhID0gKHVpbnQxNl90KXBEYXRhLT5iRGF0YTsKKyAgICAgIHNEYXRhLkFwcGVuZEJsb2NrKCZ3RGF0YSwgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgfSBicmVhazsKKyAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpTVFJJTkc6IHsKKyAgICAgIHVpbnQzMl90IGR3TmFtZUxlbiA9ICh1aW50MzJfdCluYW1lLkdldExlbmd0aCgpOworICAgICAgc0RhdGEuQXBwZW5kQmxvY2soJmR3TmFtZUxlbiwgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICBzRGF0YS5BcHBlbmRTdHJpbmcobmFtZSk7CisgICAgICBzRGF0YS5BcHBlbmRCbG9jaygmcERhdGEtPm5UeXBlLCBzaXplb2YodWludDE2X3QpKTsKKworICAgICAgdWludDMyX3QgZHdEYXRhTGVuID0gKHVpbnQzMl90KXBEYXRhLT5zRGF0YS5HZXRMZW5ndGgoKTsKKyAgICAgIHNEYXRhLkFwcGVuZEJsb2NrKCZkd0RhdGFMZW4sIHNpemVvZih1aW50MzJfdCkpOworICAgICAgc0RhdGEuQXBwZW5kU3RyaW5nKHBEYXRhLT5zRGF0YSk7CisgICAgfSBicmVhazsKKyAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpOVUxMT0JKOiB7CisgICAgICB1aW50MzJfdCBkd05hbWVMZW4gPSAodWludDMyX3QpbmFtZS5HZXRMZW5ndGgoKTsKKyAgICAgIHNEYXRhLkFwcGVuZEJsb2NrKCZkd05hbWVMZW4sIHNpemVvZih1aW50MzJfdCkpOworICAgICAgc0RhdGEuQXBwZW5kU3RyaW5nKG5hbWUpOworICAgICAgc0RhdGEuQXBwZW5kQmxvY2soJnBEYXRhLT5uVHlwZSwgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX2dsb2JhbGRhdGEuaCBiL2Z4anMvY2pzX2dsb2JhbGRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWE0YjIxCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfZ2xvYmFsZGF0YS5oCkBAIC0wLDAgKzEsNzcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX0NKU19HTE9CQUxEQVRBX0hfCisjZGVmaW5lIEZYSlNfQ0pTX0dMT0JBTERBVEFfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9iaW5hcnlidWYuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19rZXl2YWx1ZS5oIgorCitjbGFzcyBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ7CisKK2NsYXNzIENKU19HbG9iYWxEYXRhX0VsZW1lbnQgeworIHB1YmxpYzoKKyAgQ0pTX0dsb2JhbERhdGFfRWxlbWVudCgpIHt9CisgIH5DSlNfR2xvYmFsRGF0YV9FbGVtZW50KCkge30KKworICBDSlNfS2V5VmFsdWUgZGF0YTsKKyAgYm9vbCBiUGVyc2lzdGVudDsKK307CisKK2NsYXNzIENKU19HbG9iYWxEYXRhIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBDSlNfR2xvYmFsRGF0YSogR2V0UmV0YWluZWRJbnN0YW5jZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBBcHApOworICB2b2lkIFJlbGVhc2UoKTsKKworICB2b2lkIFNldEdsb2JhbFZhcmlhYmxlTnVtYmVyKGNvbnN0IEJ5dGVTdHJpbmcmIHByb3BuYW1lLCBkb3VibGUgZERhdGEpOworICB2b2lkIFNldEdsb2JhbFZhcmlhYmxlQm9vbGVhbihjb25zdCBCeXRlU3RyaW5nJiBwcm9wbmFtZSwgYm9vbCBiRGF0YSk7CisgIHZvaWQgU2V0R2xvYmFsVmFyaWFibGVTdHJpbmcoY29uc3QgQnl0ZVN0cmluZyYgcHJvcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgc0RhdGEpOworICB2b2lkIFNldEdsb2JhbFZhcmlhYmxlT2JqZWN0KGNvbnN0IEJ5dGVTdHJpbmcmIHByb3BuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENKU19HbG9iYWxWYXJpYWJsZUFycmF5JiBhcnJheSk7CisgIHZvaWQgU2V0R2xvYmFsVmFyaWFibGVOdWxsKGNvbnN0IEJ5dGVTdHJpbmcmIHByb3BuYW1lKTsKKyAgYm9vbCBTZXRHbG9iYWxWYXJpYWJsZVBlcnNpc3RlbnQoY29uc3QgQnl0ZVN0cmluZyYgcHJvcG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlBlcnNpc3RlbnQpOworICBib29sIERlbGV0ZUdsb2JhbFZhcmlhYmxlKGNvbnN0IEJ5dGVTdHJpbmcmIHByb3BuYW1lKTsKKworICBpbnQzMl90IEdldFNpemUoKSBjb25zdDsKKyAgQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogR2V0QXQoaW50IGluZGV4KSBjb25zdDsKKworIHByaXZhdGU6CisgIHVzaW5nIGl0ZXJhdG9yID0KKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDSlNfR2xvYmFsRGF0YV9FbGVtZW50Pj46Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0pTX0dsb2JhbERhdGFfRWxlbWVudD4+Ojpjb25zdF9pdGVyYXRvcjsKKworICBDSlNfR2xvYmFsRGF0YSgpOworICB+Q0pTX0dsb2JhbERhdGEoKTsKKworICB2b2lkIExvYWRHbG9iYWxQZXJzaXN0ZW50VmFyaWFibGVzKCk7CisgIHZvaWQgU2F2ZUdsb2JhbFBlcnNpc2l0ZW50VmFyaWFibGVzKCk7CisKKyAgQ0pTX0dsb2JhbERhdGFfRWxlbWVudCogR2V0R2xvYmFsVmFyaWFibGUoY29uc3QgQnl0ZVN0cmluZyYgc1Byb3BuYW1lKTsKKyAgaXRlcmF0b3IgRmluZEdsb2JhbFZhcmlhYmxlKGNvbnN0IEJ5dGVTdHJpbmcmIHNQcm9wbmFtZSk7CisgIGNvbnN0X2l0ZXJhdG9yIEZpbmRHbG9iYWxWYXJpYWJsZShjb25zdCBCeXRlU3RyaW5nJiBzUHJvcG5hbWUpIGNvbnN0OworCisgIHZvaWQgTG9hZEZpbGVCdWZmZXIoY29uc3Qgd2NoYXJfdCogc0ZpbGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBwQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5MZW5ndGgpOworICB2b2lkIFdyaXRlRmlsZUJ1ZmZlcihjb25zdCB3Y2hhcl90KiBzRmlsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbkxlbmd0aCk7CisgIHZvaWQgTWFrZUJ5dGVTdHJpbmcoY29uc3QgQnl0ZVN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBDSlNfS2V5VmFsdWUqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9CaW5hcnlCdWYmIHNEYXRhKTsKKworICBzaXplX3QgbV9SZWZDb3VudDsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENKU19HbG9iYWxEYXRhX0VsZW1lbnQ+PiBtX2FycmF5R2xvYmFsRGF0YTsKKyAgV2lkZVN0cmluZyBtX3NGaWxlUGF0aDsKK307CisKKyNlbmRpZiAgLy8gRlhKU19DSlNfR0xPQkFMREFUQV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy9janNfZ2xvYmFsdmFyaWFibGVhcnJheS5jcHAgYi9meGpzL2Nqc19nbG9iYWx2YXJpYWJsZWFycmF5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmY5ZjFiCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfZ2xvYmFsdmFyaWFibGVhcnJheS5jcHAKQEAgLTAsMCArMSw2OCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy9janNfZ2xvYmFsdmFyaWFibGVhcnJheS5oIgorCisjaW5jbHVkZSAiZnhqcy9janNfa2V5dmFsdWUuaCIKKworQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXk6OkNKU19HbG9iYWxWYXJpYWJsZUFycmF5KCkge30KKworQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXk6On5DSlNfR2xvYmFsVmFyaWFibGVBcnJheSgpIHt9CisKK3ZvaWQgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXk6OkNvcHkoY29uc3QgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkmIGFycmF5KSB7CisgIG1fQXJyYXkuY2xlYXIoKTsKKyAgZm9yIChpbnQgaSA9IDAsIHN6ID0gYXJyYXkuQ291bnQoKTsgaSA8IHN6OyBpKyspIHsKKyAgICBDSlNfS2V5VmFsdWUqIHBPbGRPYmpEYXRhID0gYXJyYXkuR2V0QXQoaSk7CisgICAgc3dpdGNoIChwT2xkT2JqRGF0YS0+blR5cGUpIHsKKyAgICAgIGNhc2UgSlNfR2xvYmFsRGF0YVR5cGU6Ok5VTUJFUjogeworICAgICAgICBDSlNfS2V5VmFsdWUqIHBOZXdPYmpEYXRhID0gbmV3IENKU19LZXlWYWx1ZTsKKyAgICAgICAgcE5ld09iakRhdGEtPnNLZXkgPSBwT2xkT2JqRGF0YS0+c0tleTsKKyAgICAgICAgcE5ld09iakRhdGEtPm5UeXBlID0gcE9sZE9iakRhdGEtPm5UeXBlOworICAgICAgICBwTmV3T2JqRGF0YS0+ZERhdGEgPSBwT2xkT2JqRGF0YS0+ZERhdGE7CisgICAgICAgIEFkZChwTmV3T2JqRGF0YSk7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6Qk9PTEVBTjogeworICAgICAgICBDSlNfS2V5VmFsdWUqIHBOZXdPYmpEYXRhID0gbmV3IENKU19LZXlWYWx1ZTsKKyAgICAgICAgcE5ld09iakRhdGEtPnNLZXkgPSBwT2xkT2JqRGF0YS0+c0tleTsKKyAgICAgICAgcE5ld09iakRhdGEtPm5UeXBlID0gcE9sZE9iakRhdGEtPm5UeXBlOworICAgICAgICBwTmV3T2JqRGF0YS0+YkRhdGEgPSBwT2xkT2JqRGF0YS0+YkRhdGE7CisgICAgICAgIEFkZChwTmV3T2JqRGF0YSk7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6U1RSSU5HOiB7CisgICAgICAgIENKU19LZXlWYWx1ZSogcE5ld09iakRhdGEgPSBuZXcgQ0pTX0tleVZhbHVlOworICAgICAgICBwTmV3T2JqRGF0YS0+c0tleSA9IHBPbGRPYmpEYXRhLT5zS2V5OworICAgICAgICBwTmV3T2JqRGF0YS0+blR5cGUgPSBwT2xkT2JqRGF0YS0+blR5cGU7CisgICAgICAgIHBOZXdPYmpEYXRhLT5zRGF0YSA9IHBPbGRPYmpEYXRhLT5zRGF0YTsKKyAgICAgICAgQWRkKHBOZXdPYmpEYXRhKTsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIEpTX0dsb2JhbERhdGFUeXBlOjpPQkpFQ1Q6IHsKKyAgICAgICAgQ0pTX0tleVZhbHVlKiBwTmV3T2JqRGF0YSA9IG5ldyBDSlNfS2V5VmFsdWU7CisgICAgICAgIHBOZXdPYmpEYXRhLT5zS2V5ID0gcE9sZE9iakRhdGEtPnNLZXk7CisgICAgICAgIHBOZXdPYmpEYXRhLT5uVHlwZSA9IHBPbGRPYmpEYXRhLT5uVHlwZTsKKyAgICAgICAgcE5ld09iakRhdGEtPm9iakRhdGEuQ29weShwT2xkT2JqRGF0YS0+b2JqRGF0YSk7CisgICAgICAgIEFkZChwTmV3T2JqRGF0YSk7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSBKU19HbG9iYWxEYXRhVHlwZTo6TlVMTE9CSjogeworICAgICAgICBDSlNfS2V5VmFsdWUqIHBOZXdPYmpEYXRhID0gbmV3IENKU19LZXlWYWx1ZTsKKyAgICAgICAgcE5ld09iakRhdGEtPnNLZXkgPSBwT2xkT2JqRGF0YS0+c0tleTsKKyAgICAgICAgcE5ld09iakRhdGEtPm5UeXBlID0gcE9sZE9iakRhdGEtPm5UeXBlOworICAgICAgICBBZGQocE5ld09iakRhdGEpOworICAgICAgfSBicmVhazsKKyAgICB9CisgIH0KK30KKwordm9pZCBDSlNfR2xvYmFsVmFyaWFibGVBcnJheTo6QWRkKENKU19LZXlWYWx1ZSogcCkgeworICBtX0FycmF5LnB1c2hfYmFjayhzdGQ6OnVuaXF1ZV9wdHI8Q0pTX0tleVZhbHVlPihwKSk7Cit9CisKK2ludCBDSlNfR2xvYmFsVmFyaWFibGVBcnJheTo6Q291bnQoKSBjb25zdCB7CisgIHJldHVybiBtX0FycmF5LnNpemUoKTsKK30KKworQ0pTX0tleVZhbHVlKiBDSlNfR2xvYmFsVmFyaWFibGVBcnJheTo6R2V0QXQoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBtX0FycmF5LmF0KGluZGV4KS5nZXQoKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX2dsb2JhbHZhcmlhYmxlYXJyYXkuaCBiL2Z4anMvY2pzX2dsb2JhbHZhcmlhYmxlYXJyYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjQ5ZjYwCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfZ2xvYmFsdmFyaWFibGVhcnJheS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX0NKU19HTE9CQUxWQVJJQUJMRUFSUkFZX0hfCisjZGVmaW5lIEZYSlNfQ0pTX0dMT0JBTFZBUklBQkxFQVJSQVlfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK2NsYXNzIENKU19LZXlWYWx1ZTsKKworY2xhc3MgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkgeworIHB1YmxpYzoKKyAgQ0pTX0dsb2JhbFZhcmlhYmxlQXJyYXkoKTsKKyAgfkNKU19HbG9iYWxWYXJpYWJsZUFycmF5KCk7CisKKyAgdm9pZCBBZGQoQ0pTX0tleVZhbHVlKiBwKTsKKyAgaW50IENvdW50KCkgY29uc3Q7CisgIENKU19LZXlWYWx1ZSogR2V0QXQoaW50IGluZGV4KSBjb25zdDsKKyAgdm9pZCBDb3B5KGNvbnN0IENKU19HbG9iYWxWYXJpYWJsZUFycmF5JiBhcnJheSk7CisKKyBwcml2YXRlOgorICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0pTX0tleVZhbHVlPj4gbV9BcnJheTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19DSlNfR0xPQkFMVkFSSUFCTEVBUlJBWV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy9janNfaGlnaGxpZ2h0LmNwcCBiL2Z4anMvY2pzX2hpZ2hsaWdodC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYwYTVhOAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2pzX2hpZ2hsaWdodC5jcHAKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy9janNfaGlnaGxpZ2h0LmgiCisKK2NvbnN0IEpTQ29uc3RTcGVjIENKU19IaWdobGlnaHQ6OkNvbnN0U3BlY3NbXSA9IHsKKyAgICB7Im4iLCBKU0NvbnN0U3BlYzo6U3RyaW5nLCAwLCAibm9uZSJ9LAorICAgIHsiaSIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJpbnZlcnQifSwKKyAgICB7InAiLCBKU0NvbnN0U3BlYzo6U3RyaW5nLCAwLCAicHVzaCJ9LAorICAgIHsibyIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJvdXRsaW5lIn19OworCitpbnQgQ0pTX0hpZ2hsaWdodDo6T2JqRGVmbklEID0gLTE7CisKKy8vIHN0YXRpYwordm9pZCBDSlNfSGlnaGxpZ2h0OjpEZWZpbmVKU09iamVjdHMoQ0ZYSlNfRW5naW5lKiBwRW5naW5lKSB7CisgIE9iakRlZm5JRCA9CisgICAgICBwRW5naW5lLT5EZWZpbmVPYmooImhpZ2hsaWdodCIsIEZYSlNPQkpUWVBFX1NUQVRJQywgbnVsbHB0ciwgbnVsbHB0cik7CisgIERlZmluZUNvbnN0cyhwRW5naW5lLCBPYmpEZWZuSUQsIENvbnN0U3BlY3MsIEZYX0FycmF5U2l6ZShDb25zdFNwZWNzKSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL2Nqc19oaWdobGlnaHQuaCBiL2Z4anMvY2pzX2hpZ2hsaWdodC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MDkxZDMKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc19oaWdobGlnaHQuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19DSlNfSElHSExJR0hUX0hfCisjZGVmaW5lIEZYSlNfQ0pTX0hJR0hMSUdIVF9IXworCisjaW5jbHVkZSAiZnhqcy9KU19EZWZpbmUuaCIKKworY2xhc3MgQ0pTX0hpZ2hsaWdodCA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIERlZmluZUpTT2JqZWN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUpOworCisgIGV4cGxpY2l0IENKU19IaWdobGlnaHQodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQorICB+Q0pTX0hpZ2hsaWdodCgpIG92ZXJyaWRlIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgaW50IE9iakRlZm5JRDsKKyAgc3RhdGljIGNvbnN0IEpTQ29uc3RTcGVjIENvbnN0U3BlY3NbXTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19DSlNfSElHSExJR0hUX0hfCmRpZmYgLS1naXQgYS9meGpzL2Nqc19pY29uLmNwcCBiL2Z4anMvY2pzX2ljb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNTZmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc19pY29uLmNwcApAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL2Nqc19pY29uLmgiCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIENKU19JY29uOjpQcm9wZXJ0eVNwZWNzW10gPSB7CisgICAgeyJuYW1lIiwgZ2V0X25hbWVfc3RhdGljLCBzZXRfbmFtZV9zdGF0aWN9fTsKKworaW50IENKU19JY29uOjpPYmpEZWZuSUQgPSAtMTsKKworLy8gc3RhdGljCitpbnQgQ0pTX0ljb246OkdldE9iakRlZm5JRCgpIHsKKyAgcmV0dXJuIE9iakRlZm5JRDsKK30KKworLy8gc3RhdGljCit2b2lkIENKU19JY29uOjpEZWZpbmVKU09iamVjdHMoQ0ZYSlNfRW5naW5lKiBwRW5naW5lKSB7CisgIE9iakRlZm5JRCA9CisgICAgICBwRW5naW5lLT5EZWZpbmVPYmooIkljb24iLCBGWEpTT0JKVFlQRV9EWU5BTUlDLAorICAgICAgICAgICAgICAgICAgICAgICAgIEpTQ29uc3RydWN0b3I8Q0pTX0ljb24sIEljb24+LCBKU0Rlc3RydWN0b3I8Q0pTX0ljb24+KTsKKyAgRGVmaW5lUHJvcHMocEVuZ2luZSwgT2JqRGVmbklELCBQcm9wZXJ0eVNwZWNzLCBGWF9BcnJheVNpemUoUHJvcGVydHlTcGVjcykpOworfQorCitJY29uOjpJY29uKENKU19PYmplY3QqIHBKU09iamVjdCkKKyAgICA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpLCBtX3N3SWNvbk5hbWUoTCIiKSB7fQorCitJY29uOjp+SWNvbigpIHt9CisKK0NKU19SZXR1cm4gSWNvbjo6Z2V0X25hbWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcobV9zd0ljb25OYW1lLmNfc3RyKCkpKTsKK30KKworQ0pTX1JldHVybiBJY29uOjpzZXRfbmFtZShDSlNfUnVudGltZSogcFJ1bnRpbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZwKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX2ljb24uaCBiL2Z4anMvY2pzX2ljb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWI4NDM4Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfaWNvbi5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX0NKU19JQ09OX0hfCisjZGVmaW5lIEZYSlNfQ0pTX0lDT05fSF8KKworI2luY2x1ZGUgImZ4anMvSlNfRGVmaW5lLmgiCisKK2NsYXNzIEljb24gOiBwdWJsaWMgQ0pTX0VtYmVkT2JqIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEljb24oQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKKyAgfkljb24oKSBvdmVycmlkZTsKKworICBDSlNfUmV0dXJuIGdldF9uYW1lKENKU19SdW50aW1lKiBwUnVudGltZSk7CisgIENKU19SZXR1cm4gc2V0X25hbWUoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2cCk7CisKKyAgV2lkZVN0cmluZyBHZXRJY29uTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3dJY29uTmFtZTsgfQorICB2b2lkIFNldEljb25OYW1lKFdpZGVTdHJpbmcgbmFtZSkgeyBtX3N3SWNvbk5hbWUgPSBuYW1lOyB9CisKKyBwcml2YXRlOgorICBXaWRlU3RyaW5nIG1fc3dJY29uTmFtZTsKK307CisKK2NsYXNzIENKU19JY29uIDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgc3RhdGljIGludCBHZXRPYmpEZWZuSUQoKTsKKyAgc3RhdGljIHZvaWQgRGVmaW5lSlNPYmplY3RzKENGWEpTX0VuZ2luZSogcEVuZ2luZSk7CisKKyAgZXhwbGljaXQgQ0pTX0ljb24odjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQorICB+Q0pTX0ljb24oKSBvdmVycmlkZSB7fQorCisgIEpTX1NUQVRJQ19QUk9QKG5hbWUsIG5hbWUsIEljb24pOworCisgcHJpdmF0ZToKKyAgc3RhdGljIGludCBPYmpEZWZuSUQ7CisgIHN0YXRpYyBjb25zdCBKU1Byb3BlcnR5U3BlYyBQcm9wZXJ0eVNwZWNzW107Cit9OworCisjZW5kaWYgIC8vIEZYSlNfQ0pTX0lDT05fSF8KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX2tleXZhbHVlLmNwcCBiL2Z4anMvY2pzX2tleXZhbHVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmRhM2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfa2V5dmFsdWUuY3BwCkBAIC0wLDAgKzEsMTEgQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMvY2pzX2tleXZhbHVlLmgiCisKK0NKU19LZXlWYWx1ZTo6Q0pTX0tleVZhbHVlKCkge30KKworQ0pTX0tleVZhbHVlOjp+Q0pTX0tleVZhbHVlKCkge30KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX2tleXZhbHVlLmggYi9meGpzL2Nqc19rZXl2YWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZmQzMTQKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc19rZXl2YWx1ZS5oCkBAIC0wLDAgKzEsMjggQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX0NKU19LRVlWQUxVRV9IXworI2RlZmluZSBGWEpTX0NKU19LRVlWQUxVRV9IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19nbG9iYWx2YXJpYWJsZWFycmF5LmgiCisKK2VudW0gY2xhc3MgSlNfR2xvYmFsRGF0YVR5cGUgeyBOVU1CRVIgPSAwLCBCT09MRUFOLCBTVFJJTkcsIE9CSkVDVCwgTlVMTE9CSiB9OworCitjbGFzcyBDSlNfS2V5VmFsdWUgeworIHB1YmxpYzoKKyAgQ0pTX0tleVZhbHVlKCk7CisgIH5DSlNfS2V5VmFsdWUoKTsKKworICBCeXRlU3RyaW5nIHNLZXk7CisgIEpTX0dsb2JhbERhdGFUeXBlIG5UeXBlOworICBkb3VibGUgZERhdGE7CisgIGJvb2wgYkRhdGE7CisgIEJ5dGVTdHJpbmcgc0RhdGE7CisgIENKU19HbG9iYWxWYXJpYWJsZUFycmF5IG9iakRhdGE7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfQ0pTX0tFWVZBTFVFX0hfCmRpZmYgLS1naXQgYS9meGpzL2Nqc19vYmplY3QuY3BwIGIvZnhqcy9janNfb2JqZWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWU1Y2UxCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfb2JqZWN0LmNwcApAQCAtMCwwICsxLDUwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL2Nqc19vYmplY3QuaCIKKworLy8gc3RhdGljCit2b2lkIENKU19PYmplY3Q6OkRlZmluZUNvbnN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2JqSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBKU0NvbnN0U3BlYyBjb25zdHNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCkgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICBwRW5naW5lLT5EZWZpbmVPYmpDb25zdCgKKyAgICAgICAgb2JqSWQsIGNvbnN0c1tpXS5wTmFtZSwKKyAgICAgICAgY29uc3RzW2ldLmVUeXBlID09IEpTQ29uc3RTcGVjOjpOdW1iZXIKKyAgICAgICAgICAgID8gcEVuZ2luZS0+TmV3TnVtYmVyKGNvbnN0c1tpXS5udW1iZXIpLkFzPHY4OjpWYWx1ZT4oKQorICAgICAgICAgICAgOiBwRW5naW5lLT5OZXdTdHJpbmcoY29uc3RzW2ldLnBTdHIpLkFzPHY4OjpWYWx1ZT4oKSk7CisgIH0KK30KKworLy8gc3RhdGljCit2b2lkIENKU19PYmplY3Q6OkRlZmluZVByb3BzKENGWEpTX0VuZ2luZSogcEVuZ2luZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9iaklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm9wc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgcEVuZ2luZS0+RGVmaW5lT2JqUHJvcGVydHkob2JqSWQsIHByb3BzW2ldLnBOYW1lLCBwcm9wc1tpXS5wUHJvcEdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wc1tpXS5wUHJvcFB1dCk7CisgIH0KK30KKworLy8gc3RhdGljCit2b2lkIENKU19PYmplY3Q6OkRlZmluZU1ldGhvZHMoQ0ZYSlNfRW5naW5lKiBwRW5naW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvYmpJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBKU01ldGhvZFNwZWMgbWV0aG9kc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCkgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpCisgICAgcEVuZ2luZS0+RGVmaW5lT2JqTWV0aG9kKG9iaklkLCBtZXRob2RzW2ldLnBOYW1lLCBtZXRob2RzW2ldLnBNZXRob2RDYWxsKTsKK30KKworQ0pTX09iamVjdDo6Q0pTX09iamVjdCh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgeworICBtX3BJc29sYXRlID0gcE9iamVjdC0+R2V0SXNvbGF0ZSgpOworICBtX3BWOE9iamVjdC5SZXNldChtX3BJc29sYXRlLCBwT2JqZWN0KTsKK30KKworQ0pTX09iamVjdDo6fkNKU19PYmplY3QoKSB7fQorCit2b2lkIENKU19PYmplY3Q6OkluaXRJbnN0YW5jZShJSlNfUnVudGltZSogcElSdW50aW1lKSB7fQpkaWZmIC0tZ2l0IGEvZnhqcy9janNfb2JqZWN0LmggYi9meGpzL2Nqc19vYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTI5YTAxCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfb2JqZWN0LmgKQEAgLTAsMCArMSw3MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfQ0pTX09CSkVDVF9IXworI2RlZmluZSBGWEpTX0NKU19PQkpFQ1RfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImZwZGZzZGsvZnNka19kZWZpbmUuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19lbWJlZG9iai5oIgorI2luY2x1ZGUgImZ4anMvY2pzX3J1bnRpbWUuaCIKKyNpbmNsdWRlICJmeGpzL2Z4anNfdjguaCIKKworc3RydWN0IEpTQ29uc3RTcGVjIHsKKyAgZW51bSBUeXBlIHsgTnVtYmVyID0gMCwgU3RyaW5nID0gMSB9OworCisgIGNvbnN0IGNoYXIqIHBOYW1lOworICBUeXBlIGVUeXBlOworICBkb3VibGUgbnVtYmVyOworICBjb25zdCBjaGFyKiBwU3RyOworfTsKKworc3RydWN0IEpTUHJvcGVydHlTcGVjIHsKKyAgY29uc3QgY2hhciogcE5hbWU7CisgIHY4OjpBY2Nlc3NvckdldHRlckNhbGxiYWNrIHBQcm9wR2V0OworICB2ODo6QWNjZXNzb3JTZXR0ZXJDYWxsYmFjayBwUHJvcFB1dDsKK307CisKK3N0cnVjdCBKU01ldGhvZFNwZWMgeworICBjb25zdCBjaGFyKiBwTmFtZTsKKyAgdjg6OkZ1bmN0aW9uQ2FsbGJhY2sgcE1ldGhvZENhbGw7Cit9OworCitjbGFzcyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIERlZmluZUNvbnN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2JqSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBKU0NvbnN0U3BlYyBjb25zdHNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCk7CisgIHN0YXRpYyB2b2lkIERlZmluZVByb3BzKENGWEpTX0VuZ2luZSogcEVuZ2luZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9iaklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm9wc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQpOworICBzdGF0aWMgdm9pZCBEZWZpbmVNZXRob2RzKENGWEpTX0VuZ2luZSogcEVuZ2luZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2JqSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSlNNZXRob2RTcGVjIG1ldGhvZHNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQpOworCisgIGV4cGxpY2l0IENKU19PYmplY3Qodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpOworICB2aXJ0dWFsIH5DSlNfT2JqZWN0KCk7CisKKyAgdmlydHVhbCB2b2lkIEluaXRJbnN0YW5jZShJSlNfUnVudGltZSogcElSdW50aW1lKTsKKworICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gVG9WOE9iamVjdCgpIHsgcmV0dXJuIG1fcFY4T2JqZWN0LkdldChtX3BJc29sYXRlKTsgfQorCisgIC8vIFRha2VzIG93bmVyc2hpcCBvZiB8cE9ianwuCisgIHZvaWQgU2V0RW1iZWRPYmplY3QoQ0pTX0VtYmVkT2JqKiBwT2JqKSB7IG1fcEVtYmVkT2JqLnJlc2V0KHBPYmopOyB9CisgIENKU19FbWJlZE9iaiogR2V0RW1iZWRPYmplY3QoKSBjb25zdCB7IHJldHVybiBtX3BFbWJlZE9iai5nZXQoKTsgfQorCisgIHY4OjpJc29sYXRlKiBHZXRJc29sYXRlKCkgY29uc3QgeyByZXR1cm4gbV9wSXNvbGF0ZTsgfQorCisgcHJvdGVjdGVkOgorICBzdGQ6OnVuaXF1ZV9wdHI8Q0pTX0VtYmVkT2JqPiBtX3BFbWJlZE9iajsKKyAgdjg6Okdsb2JhbDx2ODo6T2JqZWN0PiBtX3BWOE9iamVjdDsKKyAgdjg6Oklzb2xhdGUqIG1fcElzb2xhdGU7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfQ0pTX09CSkVDVF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy9janNfcG9zaXRpb24uY3BwIGIvZnhqcy9janNfcG9zaXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZTRhYjAKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc19wb3NpdGlvbi5jcHAKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy9janNfcG9zaXRpb24uaCIKKworY29uc3QgSlNDb25zdFNwZWMgQ0pTX1Bvc2l0aW9uOjpDb25zdFNwZWNzW10gPSB7CisgICAgeyJ0ZXh0T25seSIsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDAsIDB9LAorICAgIHsiaWNvbk9ubHkiLCBKU0NvbnN0U3BlYzo6TnVtYmVyLCAxLCAwfSwKKyAgICB7Imljb25UZXh0ViIsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDIsIDB9LAorICAgIHsidGV4dEljb25WIiwgSlNDb25zdFNwZWM6Ok51bWJlciwgMywgMH0sCisgICAgeyJpY29uVGV4dEgiLCBKU0NvbnN0U3BlYzo6TnVtYmVyLCA0LCAwfSwKKyAgICB7InRleHRJY29uSCIsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDUsIDB9LAorICAgIHsib3ZlcmxheSIsIEpTQ29uc3RTcGVjOjpOdW1iZXIsIDYsIDB9fTsKKworaW50IENKU19Qb3NpdGlvbjo6T2JqRGVmbklEID0gLTE7CisKKy8vIHN0YXRpYwordm9pZCBDSlNfUG9zaXRpb246OkRlZmluZUpTT2JqZWN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUpIHsKKyAgT2JqRGVmbklEID0KKyAgICAgIHBFbmdpbmUtPkRlZmluZU9iaigicG9zaXRpb24iLCBGWEpTT0JKVFlQRV9TVEFUSUMsIG51bGxwdHIsIG51bGxwdHIpOworICBEZWZpbmVDb25zdHMocEVuZ2luZSwgT2JqRGVmbklELCBDb25zdFNwZWNzLCBGWF9BcnJheVNpemUoQ29uc3RTcGVjcykpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy9janNfcG9zaXRpb24uaCBiL2Z4anMvY2pzX3Bvc2l0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1N2YwMQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2pzX3Bvc2l0aW9uLmgKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfQ0pTX1BPU0lUSU9OX0hfCisjZGVmaW5lIEZYSlNfQ0pTX1BPU0lUSU9OX0hfCisKKyNpbmNsdWRlICJmeGpzL0pTX0RlZmluZS5oIgorCitjbGFzcyBDSlNfUG9zaXRpb24gOiBwdWJsaWMgQ0pTX09iamVjdCB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBEZWZpbmVKU09iamVjdHMoQ0ZYSlNfRW5naW5lKiBwRW5naW5lKTsKKworICBleHBsaWNpdCBDSlNfUG9zaXRpb24odjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQorICB+Q0pTX1Bvc2l0aW9uKCkgb3ZlcnJpZGUge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBpbnQgT2JqRGVmbklEOworICBzdGF0aWMgY29uc3QgSlNDb25zdFNwZWMgQ29uc3RTcGVjc1tdOworfTsKKworI2VuZGlmICAvLyBGWEpTX0NKU19QT1NJVElPTl9IXwpkaWZmIC0tZ2l0IGEvZnhqcy9janNfcHJpbnRwYXJhbXNvYmouY3BwIGIvZnhqcy9janNfcHJpbnRwYXJhbXNvYmouY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NmMyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc19wcmludHBhcmFtc29iai5jcHAKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy9janNfcHJpbnRwYXJhbXNvYmouaCIKKworaW50IENKU19QcmludFBhcmFtc09iajo6T2JqRGVmbklEID0gLTE7CisKKy8vIHN0YXRpYworaW50IENKU19QcmludFBhcmFtc09iajo6R2V0T2JqRGVmbklEKCkgeworICByZXR1cm4gT2JqRGVmbklEOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ0pTX1ByaW50UGFyYW1zT2JqOjpEZWZpbmVKU09iamVjdHMoQ0ZYSlNfRW5naW5lKiBwRW5naW5lKSB7CisgIE9iakRlZm5JRCA9CisgICAgICBwRW5naW5lLT5EZWZpbmVPYmooIlByaW50UGFyYW1zT2JqIiwgRlhKU09CSlRZUEVfRFlOQU1JQywKKyAgICAgICAgICAgICAgICAgICAgICAgICBKU0NvbnN0cnVjdG9yPENKU19QcmludFBhcmFtc09iaiwgUHJpbnRQYXJhbXNPYmo+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEpTRGVzdHJ1Y3RvcjxDSlNfUHJpbnRQYXJhbXNPYmo+KTsKK30KKworUHJpbnRQYXJhbXNPYmo6OlByaW50UGFyYW1zT2JqKENKU19PYmplY3QqIHBKU09iamVjdCkKKyAgICA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpIHsKKyAgYlVJID0gdHJ1ZTsKKyAgblN0YXJ0ID0gMDsKKyAgbkVuZCA9IDA7CisgIGJTaWxlbnQgPSBmYWxzZTsKKyAgYlNocmlua1RvRml0ID0gZmFsc2U7CisgIGJQcmludEFzSW1hZ2UgPSBmYWxzZTsKKyAgYlJldmVyc2UgPSBmYWxzZTsKKyAgYkFubm90YXRpb25zID0gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX3ByaW50cGFyYW1zb2JqLmggYi9meGpzL2Nqc19wcmludHBhcmFtc29iai5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYzkxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc19wcmludHBhcmFtc29iai5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX0NKU19QUklOVFBBUkFNU09CSl9IXworI2RlZmluZSBGWEpTX0NKU19QUklOVFBBUkFNU09CSl9IXworCisjaW5jbHVkZSAiZnhqcy9KU19EZWZpbmUuaCIKKworY2xhc3MgUHJpbnRQYXJhbXNPYmogOiBwdWJsaWMgQ0pTX0VtYmVkT2JqIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFByaW50UGFyYW1zT2JqKENKU19PYmplY3QqIHBKU09iamVjdCk7CisgIH5QcmludFBhcmFtc09iaigpIG92ZXJyaWRlIHt9CisKKyBwdWJsaWM6CisgIGJvb2wgYlVJOworICBpbnQgblN0YXJ0OworICBpbnQgbkVuZDsKKyAgYm9vbCBiU2lsZW50OworICBib29sIGJTaHJpbmtUb0ZpdDsKKyAgYm9vbCBiUHJpbnRBc0ltYWdlOworICBib29sIGJSZXZlcnNlOworICBib29sIGJBbm5vdGF0aW9uczsKK307CisKK2NsYXNzIENKU19QcmludFBhcmFtc09iaiA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBpbnQgR2V0T2JqRGVmbklEKCk7CisgIHN0YXRpYyB2b2lkIERlZmluZUpTT2JqZWN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUpOworCisgIGV4cGxpY2l0IENKU19QcmludFBhcmFtc09iaih2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkKKyAgICAgIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQorICB+Q0pTX1ByaW50UGFyYW1zT2JqKCkgb3ZlcnJpZGUge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBpbnQgT2JqRGVmbklEOworfTsKKworI2VuZGlmICAvLyBGWEpTX0NKU19QUklOVFBBUkFNU09CSl9IXwpkaWZmIC0tZ2l0IGEvZnhqcy9janNfcHVibGljbWV0aG9kcy5jcHAgYi9meGpzL2Nqc19wdWJsaWNtZXRob2RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWVhZTdmCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfcHVibGljbWV0aG9kcy5jcHAKQEAgLTAsMCArMSwxNzQwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL2Nqc19wdWJsaWNtZXRob2RzLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8Y3djdHlwZT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9pbnRlcmZvcm0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgImZwZGZzZGsvY3BkZnNka19mb3JtZmlsbGVudmlyb25tZW50LmgiCisjaW5jbHVkZSAiZnBkZnNkay9jcGRmc2RrX2ludGVyZm9ybS5oIgorI2luY2x1ZGUgImZ4anMvSlNfRGVmaW5lLmgiCisjaW5jbHVkZSAiZnhqcy9janNfY29sb3IuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19ldmVudF9jb250ZXh0LmgiCisjaW5jbHVkZSAiZnhqcy9janNfZXZlbnRoYW5kbGVyLmgiCisjaW5jbHVkZSAiZnhqcy9janNfZmllbGQuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19vYmplY3QuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19ydW50aW1lLmgiCisjaW5jbHVkZSAiZnhqcy9janNfdXRpbC5oIgorI2luY2x1ZGUgImZ4anMvanNfcmVzb3VyY2VzLmgiCisKKy8vIHN0YXRpYworY29uc3QgSlNNZXRob2RTcGVjIENKU19QdWJsaWNNZXRob2RzOjpHbG9iYWxGdW5jdGlvblNwZWNzW10gPSB7CisgICAgeyJBRk51bWJlcl9Gb3JtYXQiLCBBRk51bWJlcl9Gb3JtYXRfc3RhdGljfSwKKyAgICB7IkFGTnVtYmVyX0tleXN0cm9rZSIsIEFGTnVtYmVyX0tleXN0cm9rZV9zdGF0aWN9LAorICAgIHsiQUZQZXJjZW50X0Zvcm1hdCIsIEFGUGVyY2VudF9Gb3JtYXRfc3RhdGljfSwKKyAgICB7IkFGUGVyY2VudF9LZXlzdHJva2UiLCBBRlBlcmNlbnRfS2V5c3Ryb2tlX3N0YXRpY30sCisgICAgeyJBRkRhdGVfRm9ybWF0RXgiLCBBRkRhdGVfRm9ybWF0RXhfc3RhdGljfSwKKyAgICB7IkFGRGF0ZV9LZXlzdHJva2VFeCIsIEFGRGF0ZV9LZXlzdHJva2VFeF9zdGF0aWN9LAorICAgIHsiQUZEYXRlX0Zvcm1hdCIsIEFGRGF0ZV9Gb3JtYXRfc3RhdGljfSwKKyAgICB7IkFGRGF0ZV9LZXlzdHJva2UiLCBBRkRhdGVfS2V5c3Ryb2tlX3N0YXRpY30sCisgICAgeyJBRlRpbWVfRm9ybWF0RXgiLCBBRlRpbWVfRm9ybWF0RXhfc3RhdGljfSwKKyAgICB7IkFGVGltZV9LZXlzdHJva2VFeCIsIEFGVGltZV9LZXlzdHJva2VFeF9zdGF0aWN9LAorICAgIHsiQUZUaW1lX0Zvcm1hdCIsIEFGVGltZV9Gb3JtYXRfc3RhdGljfSwKKyAgICB7IkFGVGltZV9LZXlzdHJva2UiLCBBRlRpbWVfS2V5c3Ryb2tlX3N0YXRpY30sCisgICAgeyJBRlNwZWNpYWxfRm9ybWF0IiwgQUZTcGVjaWFsX0Zvcm1hdF9zdGF0aWN9LAorICAgIHsiQUZTcGVjaWFsX0tleXN0cm9rZSIsIEFGU3BlY2lhbF9LZXlzdHJva2Vfc3RhdGljfSwKKyAgICB7IkFGU3BlY2lhbF9LZXlzdHJva2VFeCIsIEFGU3BlY2lhbF9LZXlzdHJva2VFeF9zdGF0aWN9LAorICAgIHsiQUZTaW1wbGUiLCBBRlNpbXBsZV9zdGF0aWN9LAorICAgIHsiQUZNYWtlTnVtYmVyIiwgQUZNYWtlTnVtYmVyX3N0YXRpY30sCisgICAgeyJBRlNpbXBsZV9DYWxjdWxhdGUiLCBBRlNpbXBsZV9DYWxjdWxhdGVfc3RhdGljfSwKKyAgICB7IkFGUmFuZ2VfVmFsaWRhdGUiLCBBRlJhbmdlX1ZhbGlkYXRlX3N0YXRpY30sCisgICAgeyJBRk1lcmdlQ2hhbmdlIiwgQUZNZXJnZUNoYW5nZV9zdGF0aWN9LAorICAgIHsiQUZQYXJzZURhdGVFeCIsIEFGUGFyc2VEYXRlRXhfc3RhdGljfSwKKyAgICB7IkFGRXh0cmFjdE51bXMiLCBBRkV4dHJhY3ROdW1zX3N0YXRpY30sCit9OworCituYW1lc3BhY2UgeworCisjaWYgX0ZYX09TXyAhPSBfRlhfT1NfQU5EUk9JRF8KK2NvbnN0ZXhwciBkb3VibGUga0RvdWJsZUNvcnJlY3QgPSAwLjAwMDAwMDAwMDAwMDAwMTsKKyNlbmRpZgorCitjb25zdCB3Y2hhcl90KiBjb25zdCBrTW9udGhzW10gPSB7TCJKYW4iLCBMIkZlYiIsIEwiTWFyIiwgTCJBcHIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiTWF5IiwgTCJKdW4iLCBMIkp1bCIsIEwiQXVnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIlNlcCIsIEwiT2N0IiwgTCJOb3YiLCBMIkRlYyJ9OworCitjb25zdCB3Y2hhcl90KiBjb25zdCBrRnVsbE1vbnRoc1tdID0ge0wiSmFudWFyeSIsIEwiRmVicnVhcnkiLCBMIk1hcmNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJBcHJpbCIsICAgTCJNYXkiLCAgICAgIEwiSnVuZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiSnVseSIsICAgIEwiQXVndXN0IiwgICBMIlNlcHRlbWJlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiT2N0b2JlciIsIEwiTm92ZW1iZXIiLCBMIkRlY2VtYmVyIn07CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCBTdHJUcmltKGNvbnN0IFQmIHN0cikgeworICBUIHJlc3VsdCA9IHN0cjsKKyAgcmVzdWx0LlRyaW0oJyAnKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBBbGVydElmUG9zc2libGUoQ0pTX0V2ZW50Q29udGV4dCogcENvbnRleHQsIGNvbnN0IHdjaGFyX3QqIHN3TXNnKSB7CisgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52ID0gcENvbnRleHQtPkdldEZvcm1GaWxsRW52KCk7CisgIGlmIChwRm9ybUZpbGxFbnYpCisgICAgcEZvcm1GaWxsRW52LT5KU19hcHBBbGVydChzd01zZywgbnVsbHB0ciwgMCwgMyk7Cit9CisKKyNpZiBfRlhfT1NfICE9IF9GWF9PU19BTkRST0lEXworQnl0ZVN0cmluZyBDYWxjdWxhdGVTdHJpbmcoZG91YmxlIGRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpRGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBpRGVjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGJOZWdhdGl2ZSkgeworICAqYk5lZ2F0aXZlID0gZFZhbHVlIDwgMDsKKyAgaWYgKCpiTmVnYXRpdmUpCisgICAgZFZhbHVlID0gLWRWYWx1ZTsKKworICAvLyBNYWtlIHN1cmUgdGhlIG51bWJlciBvZiBwcmVjaXNpb24gY2hhcmFjdGVycyB3aWxsIGZpdC4KKyAgaURlYyA9IHN0ZDo6bWluKGlEZWMsIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZGlnaXRzMTApOworCisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBzcyA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKGlEZWMpIDw8IGRWYWx1ZTsKKyAgc3RkOjpzdHJpbmcgdmFsdWUgPSBzcy5zdHIoKTsKKyAgc2l6ZV90IHBvcyA9IHZhbHVlLmZpbmQoJy4nKTsKKyAgKmlEZWMyID0gcG9zID09IHN0ZDo6c3RyaW5nOjpucG9zID8gdmFsdWUuc2l6ZSgpIDogc3RhdGljX2Nhc3Q8aW50Pihwb3MpOworICByZXR1cm4gQnl0ZVN0cmluZyh2YWx1ZS5jX3N0cigpKTsKK30KKyNlbmRpZgorCitXaWRlU3RyaW5nIENhbGNNZXJnZWRTdHJpbmcoY29uc3QgQ0pTX0V2ZW50SGFuZGxlciogZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgY2hhbmdlKSB7CisgIFdpZGVTdHJpbmcgcHJlZml4ID0gdmFsdWUuTGVmdChldmVudC0+U2VsU3RhcnQoKSk7CisgIFdpZGVTdHJpbmcgcG9zdGZpeDsKKyAgaW50IGVuZCA9IGV2ZW50LT5TZWxFbmQoKTsKKyAgaWYgKGVuZCA+PSAwICYmIHN0YXRpY19jYXN0PHNpemVfdD4oZW5kKSA8IHZhbHVlLkdldExlbmd0aCgpKQorICAgIHBvc3RmaXggPSB2YWx1ZS5SaWdodCh2YWx1ZS5HZXRMZW5ndGgoKSAtIHN0YXRpY19jYXN0PHNpemVfdD4oZW5kKSk7CisgIHJldHVybiBwcmVmaXggKyBjaGFuZ2UgKyBwb3N0Zml4OworfQorCit0ZW1wbGF0ZSA8Q0pTX1JldHVybiAoKkYpKENKU19SdW50aW1lKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+Jik+Cit2b2lkIEpTR2xvYmFsRnVuYyhjb25zdCBjaGFyKiBmdW5jX25hbWVfc3RyaW5nLAorICAgICAgICAgICAgICAgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsKKyAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lID0KKyAgICAgIENKU19SdW50aW1lOjpDdXJyZW50UnVudGltZUZyb21Jc29sYXRlKGluZm8uR2V0SXNvbGF0ZSgpKTsKKyAgaWYgKCFwUnVudGltZSkKKyAgICByZXR1cm47CisKKyAgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+IHBhcmFtZXRlcnM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5mby5MZW5ndGgoKTsgKytpKQorICAgIHBhcmFtZXRlcnMucHVzaF9iYWNrKGluZm9baV0pOworCisgIENKU19SZXR1cm4gcmVzdWx0ID0gKCpGKShwUnVudGltZSwgcGFyYW1ldGVycyk7CisgIGlmIChyZXN1bHQuSGFzRXJyb3IoKSkgeworICAgIHBSdW50aW1lLT5FcnJvcigKKyAgICAgICAgSlNGb3JtYXRFcnJvclN0cmluZyhmdW5jX25hbWVfc3RyaW5nLCBudWxscHRyLCByZXN1bHQuRXJyb3IoKSkpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChyZXN1bHQuSGFzUmV0dXJuKCkpCisgICAgaW5mby5HZXRSZXR1cm5WYWx1ZSgpLlNldChyZXN1bHQuUmV0dXJuKCkpOworfQorCitpbnQgV2l0aGluQm91bmRzT3JaZXJvKGludCB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgcmV0dXJuIHZhbHVlID49IDAgJiYgc3RhdGljX2Nhc3Q8c2l6ZV90Pih2YWx1ZSkgPCBzaXplID8gdmFsdWUgOiAwOworfQorCitpbnQgVmFsaWRTdHlsZU9yWmVybyhpbnQgc3R5bGUpIHsKKyAgcmV0dXJuIFdpdGhpbkJvdW5kc09yWmVybyhzdHlsZSwgNCk7Cit9CisKK2Jvb2wgSXNEaWdpdFNlcGFyYXRvck9yRGVjaW1hbE1hcmsoaW50IGMpIHsKKyAgcmV0dXJuIGMgPT0gJy4nIHx8IGMgPT0gJywnOworfQorCisjaWYgX0ZYX09TXyAhPSBfRlhfT1NfQU5EUk9JRF8KK2Jvb2wgSXNTdHlsZVdpdGhEaWdpdFNlcGFyYXRvcihpbnQgc3R5bGUpIHsKKyAgcmV0dXJuIHN0eWxlID09IDAgfHwgc3R5bGUgPT0gMjsKK30KKworY2hhciBEaWdpdFNlcGFyYXRvckZvclN0eWxlKGludCBzdHlsZSkgeworICBBU1NFUlQoSXNTdHlsZVdpdGhEaWdpdFNlcGFyYXRvcihzdHlsZSkpOworICByZXR1cm4gc3R5bGUgPT0gMCA/ICcsJyA6ICcuJzsKK30KKyNlbmRpZgorCitib29sIElzU3R5bGVXaXRoQ29tbWFEZWNpbWFsTWFyayhpbnQgc3R5bGUpIHsKKyAgcmV0dXJuIHN0eWxlID49IDI7Cit9CisKK2NoYXIgRGVjaW1hbE1hcmtGb3JTdHlsZShpbnQgc3R5bGUpIHsKKyAgcmV0dXJuIElzU3R5bGVXaXRoQ29tbWFEZWNpbWFsTWFyayhzdHlsZSkgPyAnLCcgOiAnLic7Cit9CisKKyNpZiBfRlhfT1NfICE9IF9GWF9PU19BTkRST0lEXwordm9pZCBOb3JtYWxpemVEZWNpbWFsTWFyayhCeXRlU3RyaW5nKiBzdHIpIHsKKyAgc3RyLT5SZXBsYWNlKCIsIiwgIi4iKTsKK30KKyNlbmRpZgorCit2b2lkIE5vcm1hbGl6ZURlY2ltYWxNYXJrVyhXaWRlU3RyaW5nKiBzdHIpIHsKKyAgc3RyLT5SZXBsYWNlKEwiLCIsIEwiLiIpOworfQorCitib29sIElzVmFsaWRNb250aChpbnQgbSkgeworICByZXR1cm4gbSA+PSAxICYmIG0gPD0gMTI7Cit9CisKKy8vIFRPRE8odGhlc3RpZyk6IFNob3VsZCB0aGlzIHRha2UgdGhlIG1vbnRoIGludG8gY29uc2lkZXJhdGlvbj8KK2Jvb2wgSXNWYWxpZERheShpbnQgZCkgeworICByZXR1cm4gZCA+PSAxICYmIGQgPD0gMzE7Cit9CisKKy8vIFRPRE8odGhlc3RpZyk6IFNob3VsZCAyNCBiZSBhbGxvd2VkPyBTaW1pbGFybHksIDYwIGZvciBtaW51dGVzIGFuZCBzZWNvbmRzLgorYm9vbCBJc1ZhbGlkMjRIb3VyKGludCBoKSB7CisgIHJldHVybiBoID49IDAgJiYgaCA8PSAyNDsKK30KKworYm9vbCBJc1ZhbGlkTWludXRlKGludCBtKSB7CisgIHJldHVybiBtID49IDAgJiYgbSA8PSA2MDsKK30KKworYm9vbCBJc1ZhbGlkU2Vjb25kKGludCBzKSB7CisgIHJldHVybiBzID49IDAgJiYgcyA8PSA2MDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0NKU19QdWJsaWNNZXRob2RzOjpDSlNfUHVibGljTWV0aG9kcyh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkKKyAgICA6IENKU19PYmplY3QocE9iamVjdCkge30KKworQ0pTX1B1YmxpY01ldGhvZHM6On5DSlNfUHVibGljTWV0aG9kcygpIHt9CisKKy8vIHN0YXRpYwordm9pZCBDSlNfUHVibGljTWV0aG9kczo6RGVmaW5lSlNPYmplY3RzKENGWEpTX0VuZ2luZSogcEVuZ2luZSkgeworICBmb3IgKGNvbnN0IGF1dG8mIHNwZWMgOiBHbG9iYWxGdW5jdGlvblNwZWNzKQorICAgIHBFbmdpbmUtPkRlZmluZUdsb2JhbE1ldGhvZChzcGVjLnBOYW1lLCBzcGVjLnBNZXRob2RDYWxsKTsKK30KKworI2RlZmluZSBKU19TVEFUSUNfR0xPQkFMX0ZVTihmdW5fbmFtZSkgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIENKU19QdWJsaWNNZXRob2RzOjpmdW5fbmFtZSMjX3N0YXRpYyggICAgICAgICAgICAgXAorICAgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pIHsgXAorICAgIEpTR2xvYmFsRnVuYzxmdW5fbmFtZT4oI2Z1bl9uYW1lLCBpbmZvKTsgICAgICAgICAgICAgXAorICB9CisKK0pTX1NUQVRJQ19HTE9CQUxfRlVOKEFGTnVtYmVyX0Zvcm1hdCk7CitKU19TVEFUSUNfR0xPQkFMX0ZVTihBRk51bWJlcl9LZXlzdHJva2UpOworSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZQZXJjZW50X0Zvcm1hdCk7CitKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlBlcmNlbnRfS2V5c3Ryb2tlKTsKK0pTX1NUQVRJQ19HTE9CQUxfRlVOKEFGRGF0ZV9Gb3JtYXRFeCk7CitKU19TVEFUSUNfR0xPQkFMX0ZVTihBRkRhdGVfS2V5c3Ryb2tlRXgpOworSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZEYXRlX0Zvcm1hdCk7CitKU19TVEFUSUNfR0xPQkFMX0ZVTihBRkRhdGVfS2V5c3Ryb2tlKTsKK0pTX1NUQVRJQ19HTE9CQUxfRlVOKEFGVGltZV9Gb3JtYXRFeCk7CitKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlRpbWVfS2V5c3Ryb2tlRXgpOworSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZUaW1lX0Zvcm1hdCk7CitKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlRpbWVfS2V5c3Ryb2tlKTsKK0pTX1NUQVRJQ19HTE9CQUxfRlVOKEFGU3BlY2lhbF9Gb3JtYXQpOworSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZTcGVjaWFsX0tleXN0cm9rZSk7CitKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlNwZWNpYWxfS2V5c3Ryb2tlRXgpOworSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZTaW1wbGUpOworSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZNYWtlTnVtYmVyKTsKK0pTX1NUQVRJQ19HTE9CQUxfRlVOKEFGU2ltcGxlX0NhbGN1bGF0ZSk7CitKU19TVEFUSUNfR0xPQkFMX0ZVTihBRlJhbmdlX1ZhbGlkYXRlKTsKK0pTX1NUQVRJQ19HTE9CQUxfRlVOKEFGTWVyZ2VDaGFuZ2UpOworSlNfU1RBVElDX0dMT0JBTF9GVU4oQUZQYXJzZURhdGVFeCk7CitKU19TVEFUSUNfR0xPQkFMX0ZVTihBRkV4dHJhY3ROdW1zKTsKKworYm9vbCBDSlNfUHVibGljTWV0aG9kczo6SXNOdW1iZXIoY29uc3QgV2lkZVN0cmluZyYgc3RyKSB7CisgIFdpZGVTdHJpbmcgc1RyaW0gPSBTdHJUcmltKHN0cik7CisgIGNvbnN0IHdjaGFyX3QqIHBUcmltID0gc1RyaW0uY19zdHIoKTsKKyAgY29uc3Qgd2NoYXJfdCogcCA9IHBUcmltOworICBib29sIGJEb3QgPSBmYWxzZTsKKyAgYm9vbCBiS1hKUyA9IGZhbHNlOworCisgIHdjaGFyX3QgYzsKKyAgd2hpbGUgKChjID0gKnApICE9IEwnXDAnKSB7CisgICAgaWYgKElzRGlnaXRTZXBhcmF0b3JPckRlY2ltYWxNYXJrKGMpKSB7CisgICAgICBpZiAoYkRvdCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgYkRvdCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChjID09IEwnLScgfHwgYyA9PSBMJysnKSB7CisgICAgICBpZiAocCAhPSBwVHJpbSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoYyA9PSBMJ2UnIHx8IGMgPT0gTCdFJykgeworICAgICAgaWYgKGJLWEpTKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIHArKzsKKyAgICAgIGMgPSAqcDsKKyAgICAgIGlmIChjICE9IEwnKycgJiYgYyAhPSBMJy0nKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBiS1hKUyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghc3RkOjppc3dkaWdpdChjKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBwKys7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDSlNfUHVibGljTWV0aG9kczo6TWFza1NhdGlzZmllZCh3Y2hhcl90IGNfQ2hhbmdlLCB3Y2hhcl90IGNfTWFzaykgeworICBzd2l0Y2ggKGNfTWFzaykgeworICAgIGNhc2UgTCc5JzoKKyAgICAgIHJldHVybiAhIXN0ZDo6aXN3ZGlnaXQoY19DaGFuZ2UpOworICAgIGNhc2UgTCdBJzoKKyAgICAgIHJldHVybiBGWFNZU19pc3dhbHBoYShjX0NoYW5nZSk7CisgICAgY2FzZSBMJ08nOgorICAgICAgcmV0dXJuIEZYU1lTX2lzd2FsbnVtKGNfQ2hhbmdlKTsKKyAgICBjYXNlIEwnWCc6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIChjX0NoYW5nZSA9PSBjX01hc2spOworICB9Cit9CisKK2Jvb2wgQ0pTX1B1YmxpY01ldGhvZHM6OklzUmVzZXJ2ZWRNYXNrQ2hhcih3Y2hhcl90IGNoKSB7CisgIHJldHVybiBjaCA9PSBMJzknIHx8IGNoID09IEwnQScgfHwgY2ggPT0gTCdPJyB8fCBjaCA9PSBMJ1gnOworfQorCitkb3VibGUgQ0pTX1B1YmxpY01ldGhvZHM6OkFGX1NpbXBsZShjb25zdCB3Y2hhcl90KiBzRnVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkVmFsdWUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRWYWx1ZTIpIHsKKyAgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sIEwiQVZHIikgPT0gMCB8fAorICAgICAgRlhTWVNfd2NzaWNtcChzRnVjdGlvbiwgTCJTVU0iKSA9PSAwKSB7CisgICAgcmV0dXJuIGRWYWx1ZTEgKyBkVmFsdWUyOworICB9CisgIGlmIChGWFNZU193Y3NpY21wKHNGdWN0aW9uLCBMIlBSRCIpID09IDApCisgICAgcmV0dXJuIGRWYWx1ZTEgKiBkVmFsdWUyOworICBpZiAoRlhTWVNfd2NzaWNtcChzRnVjdGlvbiwgTCJNSU4iKSA9PSAwKQorICAgIHJldHVybiBzdGQ6Om1pbihkVmFsdWUxLCBkVmFsdWUyKTsKKyAgaWYgKEZYU1lTX3djc2ljbXAoc0Z1Y3Rpb24sIEwiTUFYIikgPT0gMCkKKyAgICByZXR1cm4gc3RkOjptYXgoZFZhbHVlMSwgZFZhbHVlMik7CisgIHJldHVybiBkVmFsdWUxOworfQorCit2ODo6TG9jYWw8djg6OkFycmF5PiBDSlNfUHVibGljTWV0aG9kczo6QUZfTWFrZUFycmF5RnJvbUxpc3QoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbCkgeworICBpZiAoIXZhbC5Jc0VtcHR5KCkgJiYgdmFsLT5Jc0FycmF5KCkpCisgICAgcmV0dXJuIHBSdW50aW1lLT5Ub0FycmF5KHZhbCk7CisKKyAgV2lkZVN0cmluZyB3c1N0ciA9IHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcodmFsKTsKKyAgQnl0ZVN0cmluZyB0ID0gQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUod3NTdHIpOworICBjb25zdCBjaGFyKiBwID0gdC5jX3N0cigpOworCisgIGludCBuSW5kZXggPSAwOworICB2ODo6TG9jYWw8djg6OkFycmF5PiBTdHJBcnJheSA9IHBSdW50aW1lLT5OZXdBcnJheSgpOworICB3aGlsZSAoKnApIHsKKyAgICBjb25zdCBjaGFyKiBwVGVtcCA9IHN0cmNocihwLCAnLCcpOworICAgIGlmICghcFRlbXApIHsKKyAgICAgIHBSdW50aW1lLT5QdXRBcnJheUVsZW1lbnQoCisgICAgICAgICAgU3RyQXJyYXksIG5JbmRleCwKKyAgICAgICAgICBwUnVudGltZS0+TmV3U3RyaW5nKFN0clRyaW0oQnl0ZVN0cmluZyhwKSkuY19zdHIoKSkpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcFJ1bnRpbWUtPlB1dEFycmF5RWxlbWVudCgKKyAgICAgICAgU3RyQXJyYXksIG5JbmRleCwKKyAgICAgICAgcFJ1bnRpbWUtPk5ld1N0cmluZyhTdHJUcmltKEJ5dGVTdHJpbmcocCwgcFRlbXAgLSBwKSkuY19zdHIoKSkpOworCisgICAgbkluZGV4Kys7CisgICAgcCA9ICsrcFRlbXA7CisgIH0KKyAgcmV0dXJuIFN0ckFycmF5OworfQorCitpbnQgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlU3RyaW5nSW50ZWdlcihjb25zdCBXaWRlU3RyaW5nJiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBwU2tpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuTWF4U3RlcCkgeworICBpbnQgblJldCA9IDA7CisgIHNpemVfdCBuU2tpcCA9IDA7CisgIGZvciAoc2l6ZV90IGkgPSBuU3RhcnQ7IGkgPCBzdHIuR2V0TGVuZ3RoKCk7ICsraSkgeworICAgIGlmIChpIC0gblN0YXJ0ID4gMTApCisgICAgICBicmVhazsKKworICAgIHdjaGFyX3QgYyA9IHN0cltpXTsKKyAgICBpZiAoIXN0ZDo6aXN3ZGlnaXQoYykpCisgICAgICBicmVhazsKKworICAgIG5SZXQgPSBuUmV0ICogMTAgKyBGWFNZU19EZWNpbWFsQ2hhclRvSW50KGMpOworICAgICsrblNraXA7CisgICAgaWYgKG5Ta2lwID49IG5NYXhTdGVwKQorICAgICAgYnJlYWs7CisgIH0KKworICAqcFNraXAgPSBuU2tpcDsKKyAgcmV0dXJuIG5SZXQ7Cit9CisKK1dpZGVTdHJpbmcgQ0pTX1B1YmxpY01ldGhvZHM6OlBhcnNlU3RyaW5nU3RyaW5nKGNvbnN0IFdpZGVTdHJpbmcmIHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIHBTa2lwKSB7CisgIFdpZGVTdHJpbmcgc3dSZXQ7CisgIHN3UmV0LlJlc2VydmUoc3RyLkdldExlbmd0aCgpKTsKKyAgZm9yIChzaXplX3QgaSA9IG5TdGFydDsgaSA8IHN0ci5HZXRMZW5ndGgoKTsgKytpKSB7CisgICAgd2NoYXJfdCBjID0gc3RyW2ldOworICAgIGlmICghc3RkOjppc3dkaWdpdChjKSkKKyAgICAgIGJyZWFrOworCisgICAgc3dSZXQgKz0gYzsKKyAgfQorCisgICpwU2tpcCA9IHN3UmV0LkdldExlbmd0aCgpOworICByZXR1cm4gc3dSZXQ7Cit9CisKK2RvdWJsZSBDSlNfUHVibGljTWV0aG9kczo6UGFyc2VOb3JtYWxEYXRlKGNvbnN0IFdpZGVTdHJpbmcmIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogYldyb25nRm9ybWF0KSB7CisgIGRvdWJsZSBkdCA9IEpTX0dldERhdGVUaW1lKCk7CisKKyAgaW50IG5ZZWFyID0gSlNfR2V0WWVhckZyb21UaW1lKGR0KTsKKyAgaW50IG5Nb250aCA9IEpTX0dldE1vbnRoRnJvbVRpbWUoZHQpICsgMTsKKyAgaW50IG5EYXkgPSBKU19HZXREYXlGcm9tVGltZShkdCk7CisgIGludCBuSG91ciA9IEpTX0dldEhvdXJGcm9tVGltZShkdCk7CisgIGludCBuTWluID0gSlNfR2V0TWluRnJvbVRpbWUoZHQpOworICBpbnQgblNlYyA9IEpTX0dldFNlY0Zyb21UaW1lKGR0KTsKKworICBpbnQgbnVtYmVyWzNdOworCisgIHNpemVfdCBuU2tpcCA9IDA7CisgIHNpemVfdCBuTGVuID0gdmFsdWUuR2V0TGVuZ3RoKCk7CisgIHNpemVfdCBuSW5kZXggPSAwOworICBzaXplX3QgaSA9IDA7CisgIHdoaWxlIChpIDwgbkxlbikgeworICAgIGlmIChuSW5kZXggPiAyKQorICAgICAgYnJlYWs7CisKKyAgICB3Y2hhcl90IGMgPSB2YWx1ZVtpXTsKKyAgICBpZiAoc3RkOjppc3dkaWdpdChjKSkgeworICAgICAgbnVtYmVyW25JbmRleCsrXSA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaSwgJm5Ta2lwLCA0KTsKKyAgICAgIGkgKz0gblNraXA7CisgICAgfSBlbHNlIHsKKyAgICAgIGkrKzsKKyAgICB9CisgIH0KKworICBpZiAobkluZGV4ID09IDIpIHsKKyAgICAvLyBUT0RPKHRoZXN0aWcpOiBTaG91bGQgdGhlIGVsc2UgY2FzZSBzZXQgfGJXcm9uZ0Zvcm1hdHwgdG8gdHJ1ZT8KKyAgICAvLyBjYXNlMjogbW9udGgvZGF5CisgICAgLy8gY2FzZTM6IGRheS9tb250aAorICAgIGlmIChJc1ZhbGlkTW9udGgobnVtYmVyWzBdKSAmJiBJc1ZhbGlkRGF5KG51bWJlclsxXSkpIHsKKyAgICAgIG5Nb250aCA9IG51bWJlclswXTsKKyAgICAgIG5EYXkgPSBudW1iZXJbMV07CisgICAgfSBlbHNlIGlmIChJc1ZhbGlkRGF5KG51bWJlclswXSkgJiYgSXNWYWxpZE1vbnRoKG51bWJlclsxXSkpIHsKKyAgICAgIG5EYXkgPSBudW1iZXJbMF07CisgICAgICBuTW9udGggPSBudW1iZXJbMV07CisgICAgfQorCisgICAgaWYgKGJXcm9uZ0Zvcm1hdCkKKyAgICAgICpiV3JvbmdGb3JtYXQgPSBmYWxzZTsKKyAgfSBlbHNlIGlmIChuSW5kZXggPT0gMykgeworICAgIC8vIFRPRE8odGhlc3RpZyk6IFNob3VsZCB0aGUgZWxzZSBjYXNlIHNldCB8Yldyb25nRm9ybWF0fCB0byB0cnVlPworICAgIC8vIGNhc2UxOiB5ZWFyL21vbnRoL2RheQorICAgIC8vIGNhc2UyOiBtb250aC9kYXkveWVhcgorICAgIC8vIGNhc2UzOiBkYXkvbW9udGgveWVhcgorICAgIGlmIChudW1iZXJbMF0gPiAxMiAmJiBJc1ZhbGlkTW9udGgobnVtYmVyWzFdKSAmJiBJc1ZhbGlkRGF5KG51bWJlclsyXSkpIHsKKyAgICAgIG5ZZWFyID0gbnVtYmVyWzBdOworICAgICAgbk1vbnRoID0gbnVtYmVyWzFdOworICAgICAgbkRheSA9IG51bWJlclsyXTsKKyAgICB9IGVsc2UgaWYgKElzVmFsaWRNb250aChudW1iZXJbMF0pICYmIElzVmFsaWREYXkobnVtYmVyWzFdKSAmJgorICAgICAgICAgICAgICAgbnVtYmVyWzJdID4gMzEpIHsKKyAgICAgIG5Nb250aCA9IG51bWJlclswXTsKKyAgICAgIG5EYXkgPSBudW1iZXJbMV07CisgICAgICBuWWVhciA9IG51bWJlclsyXTsKKyAgICB9IGVsc2UgaWYgKElzVmFsaWREYXkobnVtYmVyWzBdKSAmJiBJc1ZhbGlkTW9udGgobnVtYmVyWzFdKSAmJgorICAgICAgICAgICAgICAgbnVtYmVyWzJdID4gMzEpIHsKKyAgICAgIG5EYXkgPSBudW1iZXJbMF07CisgICAgICBuTW9udGggPSBudW1iZXJbMV07CisgICAgICBuWWVhciA9IG51bWJlclsyXTsKKyAgICB9CisKKyAgICBpZiAoYldyb25nRm9ybWF0KQorICAgICAgKmJXcm9uZ0Zvcm1hdCA9IGZhbHNlOworICB9IGVsc2UgeworICAgIGlmIChiV3JvbmdGb3JtYXQpCisgICAgICAqYldyb25nRm9ybWF0ID0gdHJ1ZTsKKyAgICByZXR1cm4gZHQ7CisgIH0KKworICAvLyBUT0RPKHRoZXN0aWcpOiBTaG91bGQgd2Ugc2V0IHxiV3JvbmdGb3JtYXR8IHRvIGZhbHNlIGhlcmUgdG9vPworICByZXR1cm4gSlNfRGF0ZVBhcnNlKFdpZGVTdHJpbmc6OkZvcm1hdChMIiVkLyVkLyVkICVkOiVkOiVkIiwgbk1vbnRoLCBuRGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuWWVhciwgbkhvdXIsIG5NaW4sIG5TZWMpKTsKK30KKworZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpNYWtlUmVndWxhckRhdGUoY29uc3QgV2lkZVN0cmluZyYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBiV3JvbmdGb3JtYXQpIHsKKyAgZG91YmxlIGR0ID0gSlNfR2V0RGF0ZVRpbWUoKTsKKworICBpZiAoZm9ybWF0LklzRW1wdHkoKSB8fCB2YWx1ZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIGR0OworCisgIGludCBuWWVhciA9IEpTX0dldFllYXJGcm9tVGltZShkdCk7CisgIGludCBuTW9udGggPSBKU19HZXRNb250aEZyb21UaW1lKGR0KSArIDE7CisgIGludCBuRGF5ID0gSlNfR2V0RGF5RnJvbVRpbWUoZHQpOworICBpbnQgbkhvdXIgPSBKU19HZXRIb3VyRnJvbVRpbWUoZHQpOworICBpbnQgbk1pbiA9IEpTX0dldE1pbkZyb21UaW1lKGR0KTsKKyAgaW50IG5TZWMgPSBKU19HZXRTZWNGcm9tVGltZShkdCk7CisKKyAgaW50IG5ZZWFyU3ViID0gOTk7ICAvLyBuWWVhciAtIDIwMDA7CisKKyAgYm9vbCBiUG0gPSBmYWxzZTsKKyAgYm9vbCBiRXhpdCA9IGZhbHNlOworICBib29sIGJCYWRGb3JtYXQgPSBmYWxzZTsKKworICBzaXplX3QgaSA9IDA7CisgIHNpemVfdCBqID0gMDsKKworICB3aGlsZSAoaSA8IGZvcm1hdC5HZXRMZW5ndGgoKSkgeworICAgIGlmIChiRXhpdCkKKyAgICAgIGJyZWFrOworCisgICAgd2NoYXJfdCBjID0gZm9ybWF0W2ldOworICAgIHN3aXRjaCAoYykgeworICAgICAgY2FzZSAnOic6CisgICAgICBjYXNlICcuJzoKKyAgICAgIGNhc2UgJy0nOgorICAgICAgY2FzZSAnXFwnOgorICAgICAgY2FzZSAnLyc6CisgICAgICAgIGkrKzsKKyAgICAgICAgaisrOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAneSc6CisgICAgICBjYXNlICdtJzoKKyAgICAgIGNhc2UgJ2QnOgorICAgICAgY2FzZSAnSCc6CisgICAgICBjYXNlICdoJzoKKyAgICAgIGNhc2UgJ00nOgorICAgICAgY2FzZSAncyc6CisgICAgICBjYXNlICd0JzogeworICAgICAgICBzaXplX3Qgb2xkaiA9IGo7CisgICAgICAgIHNpemVfdCBuU2tpcCA9IDA7CisgICAgICAgIHNpemVfdCByZW1haW5pbmcgPSBmb3JtYXQuR2V0TGVuZ3RoKCkgLSBpIC0gMTsKKworICAgICAgICBpZiAocmVtYWluaW5nID09IDAgfHwgZm9ybWF0W2kgKyAxXSAhPSBjKSB7CisgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICd5JzoKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBqKys7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICAgIG5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgJm5Ta2lwLCAyKTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBqICs9IG5Ta2lwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICAgICAgICBuRGF5ID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCAmblNraXAsIDIpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgIGogKz0gblNraXA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnSCc6CisgICAgICAgICAgICAgIG5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCAmblNraXAsIDIpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgIGogKz0gblNraXA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICAgIG5Ib3VyID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCAmblNraXAsIDIpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgIGogKz0gblNraXA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnTSc6CisgICAgICAgICAgICAgIG5NaW4gPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosICZuU2tpcCwgMik7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgaiArPSBuU2tpcDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgICAgblNlYyA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgJm5Ta2lwLCAyKTsKKyAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICBqICs9IG5Ta2lwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3QnOgorICAgICAgICAgICAgICBiUG0gPSAoaiA8IHZhbHVlLkdldExlbmd0aCgpICYmIHZhbHVlW2pdID09ICdwJyk7CisgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nID09IDEgfHwgZm9ybWF0W2kgKyAyXSAhPSBjKSB7CisgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICd5JzoKKyAgICAgICAgICAgICAgblllYXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosICZuU2tpcCwgNCk7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgICAgaiArPSBuU2tpcDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgICAgbk1vbnRoID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCAmblNraXAsIDIpOworICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgICAgIGogKz0gblNraXA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICAgIG5EYXkgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosICZuU2tpcCwgMik7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgICAgaiArPSBuU2tpcDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdIJzoKKyAgICAgICAgICAgICAgbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosICZuU2tpcCwgMik7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgICAgaiArPSBuU2tpcDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgICAgbkhvdXIgPSBQYXJzZVN0cmluZ0ludGVnZXIodmFsdWUsIGosICZuU2tpcCwgMik7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgICAgaiArPSBuU2tpcDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdNJzoKKyAgICAgICAgICAgICAgbk1pbiA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgJm5Ta2lwLCAyKTsKKyAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgICBqICs9IG5Ta2lwOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICBuU2VjID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCAmblNraXAsIDIpOworICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgICAgIGogKz0gblNraXA7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICAgIGJQbSA9IChqICsgMSA8IHZhbHVlLkdldExlbmd0aCgpICYmIHZhbHVlW2pdID09ICdwJyAmJgorICAgICAgICAgICAgICAgICAgICAgdmFsdWVbaiArIDFdID09ICdtJyk7CisgICAgICAgICAgICAgIGkgKz0gMjsKKyAgICAgICAgICAgICAgaiArPSAyOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nID09IDIgfHwgZm9ybWF0W2kgKyAzXSAhPSBjKSB7CisgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdtJzogeworICAgICAgICAgICAgICBXaWRlU3RyaW5nIHNNb250aCA9IFBhcnNlU3RyaW5nU3RyaW5nKHZhbHVlLCBqLCAmblNraXApOworICAgICAgICAgICAgICBib29sIGJGaW5kID0gZmFsc2U7CisgICAgICAgICAgICAgIGZvciAoaW50IG0gPSAwOyBtIDwgMTI7IG0rKykgeworICAgICAgICAgICAgICAgIGlmIChzTW9udGguQ29tcGFyZU5vQ2FzZShrTW9udGhzW21dKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICBuTW9udGggPSBtICsgMTsKKyAgICAgICAgICAgICAgICAgIGkgKz0gMzsKKyAgICAgICAgICAgICAgICAgIGogKz0gblNraXA7CisgICAgICAgICAgICAgICAgICBiRmluZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICBpZiAoIWJGaW5kKSB7CisgICAgICAgICAgICAgICAgbk1vbnRoID0gUGFyc2VTdHJpbmdJbnRlZ2VyKHZhbHVlLCBqLCAmblNraXAsIDMpOworICAgICAgICAgICAgICAgIGkgKz0gMzsKKyAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSAneSc6CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgaSArPSAzOworICAgICAgICAgICAgICBqICs9IDM7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyZW1haW5pbmcgPT0gMyB8fCBmb3JtYXRbaSArIDRdICE9IGMpIHsKKyAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ3knOgorICAgICAgICAgICAgICBuWWVhciA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgJm5Ta2lwLCA0KTsKKyAgICAgICAgICAgICAgaiArPSBuU2tpcDsKKyAgICAgICAgICAgICAgaSArPSA0OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ20nOiB7CisgICAgICAgICAgICAgIGJvb2wgYkZpbmQgPSBmYWxzZTsKKworICAgICAgICAgICAgICBXaWRlU3RyaW5nIHNNb250aCA9IFBhcnNlU3RyaW5nU3RyaW5nKHZhbHVlLCBqLCAmblNraXApOworICAgICAgICAgICAgICBzTW9udGguTWFrZUxvd2VyKCk7CisKKyAgICAgICAgICAgICAgZm9yIChpbnQgbSA9IDA7IG0gPCAxMjsgbSsrKSB7CisgICAgICAgICAgICAgICAgV2lkZVN0cmluZyBzRnVsbE1vbnRocyA9IGtGdWxsTW9udGhzW21dOworICAgICAgICAgICAgICAgIHNGdWxsTW9udGhzLk1ha2VMb3dlcigpOworCisgICAgICAgICAgICAgICAgaWYgKHNGdWxsTW9udGhzLkNvbnRhaW5zKHNNb250aC5jX3N0cigpKSkgeworICAgICAgICAgICAgICAgICAgbk1vbnRoID0gbSArIDE7CisgICAgICAgICAgICAgICAgICBpICs9IDQ7CisgICAgICAgICAgICAgICAgICBqICs9IG5Ta2lwOworICAgICAgICAgICAgICAgICAgYkZpbmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgaWYgKCFiRmluZCkgeworICAgICAgICAgICAgICAgIG5Nb250aCA9IFBhcnNlU3RyaW5nSW50ZWdlcih2YWx1ZSwgaiwgJm5Ta2lwLCA0KTsKKyAgICAgICAgICAgICAgICBpICs9IDQ7CisgICAgICAgICAgICAgICAgaiArPSBuU2tpcDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGkgKz0gNDsKKyAgICAgICAgICAgICAgaiArPSA0OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKGogPj0gdmFsdWUuR2V0TGVuZ3RoKCkgfHwgZm9ybWF0W2ldICE9IHZhbHVlW2pdKSB7CisgICAgICAgICAgICBiQmFkRm9ybWF0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJFeGl0ID0gdHJ1ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaSsrOworICAgICAgICAgIGorKzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvbGRqID09IGopIHsKKyAgICAgICAgICBiQmFkRm9ybWF0ID0gdHJ1ZTsKKyAgICAgICAgICBiRXhpdCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICh2YWx1ZS5HZXRMZW5ndGgoKSA8PSBqKSB7CisgICAgICAgICAgYkV4aXQgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdFtpXSAhPSB2YWx1ZVtqXSkgeworICAgICAgICAgIGJCYWRGb3JtYXQgPSB0cnVlOworICAgICAgICAgIGJFeGl0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGkrKzsKKyAgICAgICAgaisrOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoYlBtKQorICAgIG5Ib3VyICs9IDEyOworCisgIGlmIChuWWVhciA+PSAwICYmIG5ZZWFyIDw9IG5ZZWFyU3ViKQorICAgIG5ZZWFyICs9IDIwMDA7CisKKyAgaWYgKCFiQmFkRm9ybWF0KSB7CisgICAgYkJhZEZvcm1hdCA9ICFJc1ZhbGlkTW9udGgobk1vbnRoKSB8fCAhSXNWYWxpZERheShuRGF5KSB8fAorICAgICAgICAgICAgICAgICAhSXNWYWxpZDI0SG91cihuSG91cikgfHwgIUlzVmFsaWRNaW51dGUobk1pbikgfHwKKyAgICAgICAgICAgICAgICAgIUlzVmFsaWRTZWNvbmQoblNlYyk7CisgIH0KKworICBkb3VibGUgZFJldDsKKyAgaWYgKGJCYWRGb3JtYXQpIHsKKyAgICBkUmV0ID0gUGFyc2VOb3JtYWxEYXRlKHZhbHVlLCAmYkJhZEZvcm1hdCk7CisgIH0gZWxzZSB7CisgICAgZFJldCA9IEpTX01ha2VEYXRlKEpTX01ha2VEYXkoblllYXIsIG5Nb250aCAtIDEsIG5EYXkpLAorICAgICAgICAgICAgICAgICAgICAgICBKU19NYWtlVGltZShuSG91ciwgbk1pbiwgblNlYywgMCkpOworICAgIGlmIChzdGQ6OmlzbmFuKGRSZXQpKQorICAgICAgZFJldCA9IEpTX0RhdGVQYXJzZSh2YWx1ZSk7CisgIH0KKworICBpZiAoc3RkOjppc25hbihkUmV0KSkKKyAgICBkUmV0ID0gUGFyc2VOb3JtYWxEYXRlKHZhbHVlLCAmYkJhZEZvcm1hdCk7CisKKyAgaWYgKGJXcm9uZ0Zvcm1hdCkKKyAgICAqYldyb25nRm9ybWF0ID0gYkJhZEZvcm1hdDsKKworICByZXR1cm4gZFJldDsKK30KKworV2lkZVN0cmluZyBDSlNfUHVibGljTWV0aG9kczo6TWFrZUZvcm1hdERhdGUoZG91YmxlIGREYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgZm9ybWF0KSB7CisgIFdpZGVTdHJpbmcgc1JldDsKKyAgV2lkZVN0cmluZyBzUGFydDsKKworICBpbnQgblllYXIgPSBKU19HZXRZZWFyRnJvbVRpbWUoZERhdGUpOworICBpbnQgbk1vbnRoID0gSlNfR2V0TW9udGhGcm9tVGltZShkRGF0ZSkgKyAxOworICBpbnQgbkRheSA9IEpTX0dldERheUZyb21UaW1lKGREYXRlKTsKKyAgaW50IG5Ib3VyID0gSlNfR2V0SG91ckZyb21UaW1lKGREYXRlKTsKKyAgaW50IG5NaW4gPSBKU19HZXRNaW5Gcm9tVGltZShkRGF0ZSk7CisgIGludCBuU2VjID0gSlNfR2V0U2VjRnJvbVRpbWUoZERhdGUpOworCisgIHNpemVfdCBpID0gMDsKKyAgd2hpbGUgKGkgPCBmb3JtYXQuR2V0TGVuZ3RoKCkpIHsKKyAgICB3Y2hhcl90IGMgPSBmb3JtYXRbaV07CisgICAgc2l6ZV90IHJlbWFpbmluZyA9IGZvcm1hdC5HZXRMZW5ndGgoKSAtIGkgLSAxOworICAgIHNQYXJ0LmNsZWFyKCk7CisgICAgc3dpdGNoIChjKSB7CisgICAgICBjYXNlICd5JzoKKyAgICAgIGNhc2UgJ20nOgorICAgICAgY2FzZSAnZCc6CisgICAgICBjYXNlICdIJzoKKyAgICAgIGNhc2UgJ2gnOgorICAgICAgY2FzZSAnTSc6CisgICAgICBjYXNlICdzJzoKKyAgICAgIGNhc2UgJ3QnOgorICAgICAgICBpZiAocmVtYWluaW5nID09IDAgfHwgZm9ybWF0W2kgKyAxXSAhPSBjKSB7CisgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICd5JzoKKyAgICAgICAgICAgICAgc1BhcnQgKz0gYzsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgICAgc1BhcnQgPSBXaWRlU3RyaW5nOjpGb3JtYXQoTCIlZCIsIG5Nb250aCk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnZCc6CisgICAgICAgICAgICAgIHNQYXJ0ID0gV2lkZVN0cmluZzo6Rm9ybWF0KEwiJWQiLCBuRGF5KTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdIJzoKKyAgICAgICAgICAgICAgc1BhcnQgPSBXaWRlU3RyaW5nOjpGb3JtYXQoTCIlZCIsIG5Ib3VyKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgICAgc1BhcnQgPQorICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZzo6Rm9ybWF0KEwiJWQiLCBuSG91ciA+IDEyID8gbkhvdXIgLSAxMiA6IG5Ib3VyKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdNJzoKKyAgICAgICAgICAgICAgc1BhcnQgPSBXaWRlU3RyaW5nOjpGb3JtYXQoTCIlZCIsIG5NaW4pOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ3MnOgorICAgICAgICAgICAgICBzUGFydCA9IFdpZGVTdHJpbmc6OkZvcm1hdChMIiVkIiwgblNlYyk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICAgIHNQYXJ0ICs9IG5Ib3VyID4gMTIgPyAncCcgOiAnYSc7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpKys7CisgICAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nID09IDEgfHwgZm9ybWF0W2kgKyAyXSAhPSBjKSB7CisgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICd5JzoKKyAgICAgICAgICAgICAgc1BhcnQgPSBXaWRlU3RyaW5nOjpGb3JtYXQoTCIlMDJkIiwgblllYXIgLSAoblllYXIgLyAxMDApICogMTAwKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgICAgc1BhcnQgPSBXaWRlU3RyaW5nOjpGb3JtYXQoTCIlMDJkIiwgbk1vbnRoKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdkJzoKKyAgICAgICAgICAgICAgc1BhcnQgPSBXaWRlU3RyaW5nOjpGb3JtYXQoTCIlMDJkIiwgbkRheSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnSCc6CisgICAgICAgICAgICAgIHNQYXJ0ID0gV2lkZVN0cmluZzo6Rm9ybWF0KEwiJTAyZCIsIG5Ib3VyKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgICAgc1BhcnQgPQorICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZzo6Rm9ybWF0KEwiJTAyZCIsIG5Ib3VyID4gMTIgPyBuSG91ciAtIDEyIDogbkhvdXIpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ00nOgorICAgICAgICAgICAgICBzUGFydCA9IFdpZGVTdHJpbmc6OkZvcm1hdChMIiUwMmQiLCBuTWluKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdzJzoKKyAgICAgICAgICAgICAgc1BhcnQgPSBXaWRlU3RyaW5nOjpGb3JtYXQoTCIlMDJkIiwgblNlYyk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAndCc6CisgICAgICAgICAgICAgIHNQYXJ0ID0gbkhvdXIgPiAxMiA/IEwicG0iIDogTCJhbSI7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpICs9IDI7CisgICAgICAgIH0gZWxzZSBpZiAocmVtYWluaW5nID09IDIgfHwgZm9ybWF0W2kgKyAzXSAhPSBjKSB7CisgICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgICAgaSArPSAzOworICAgICAgICAgICAgICBpZiAoSXNWYWxpZE1vbnRoKG5Nb250aCkpCisgICAgICAgICAgICAgICAgc1BhcnQgKz0ga01vbnRoc1tuTW9udGggLSAxXTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBpICs9IDM7CisgICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CisgICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CisgICAgICAgICAgICAgIHNQYXJ0ICs9IGM7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyZW1haW5pbmcgPT0gMyB8fCBmb3JtYXRbaSArIDRdICE9IGMpIHsKKyAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ3knOgorICAgICAgICAgICAgICBzUGFydCA9IFdpZGVTdHJpbmc6OkZvcm1hdChMIiUwNGQiLCBuWWVhcik7CisgICAgICAgICAgICAgIGkgKz0gNDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdtJzoKKyAgICAgICAgICAgICAgaSArPSA0OworICAgICAgICAgICAgICBpZiAoSXNWYWxpZE1vbnRoKG5Nb250aCkpCisgICAgICAgICAgICAgICAgc1BhcnQgKz0ga0Z1bGxNb250aHNbbk1vbnRoIC0gMV07CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgaSArPSA0OworICAgICAgICAgICAgICBzUGFydCArPSBjOworICAgICAgICAgICAgICBzUGFydCArPSBjOworICAgICAgICAgICAgICBzUGFydCArPSBjOworICAgICAgICAgICAgICBzUGFydCArPSBjOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaSsrOworICAgICAgICAgIHNQYXJ0ICs9IGM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpKys7CisgICAgICAgIHNQYXJ0ICs9IGM7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHNSZXQgKz0gc1BhcnQ7CisgIH0KKworICByZXR1cm4gc1JldDsKK30KKworLy8gZnVuY3Rpb24gQUZOdW1iZXJfRm9ybWF0KG5EZWMsIHNlcFN0eWxlLCBuZWdTdHlsZSwgY3VyclN0eWxlLCBzdHJDdXJyZW5jeSwKKy8vIGJDdXJyZW5jeVByZXBlbmQpCitDSlNfUmV0dXJuIENKU19QdWJsaWNNZXRob2RzOjpBRk51bWJlcl9Gb3JtYXQoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisjaWYgX0ZYX09TXyAhPSBfRlhfT1NfQU5EUk9JRF8KKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gNikKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0KKyAgICAgIHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCktPkdldEV2ZW50SGFuZGxlcigpOworICBpZiAoIXBFdmVudC0+bV9wVmFsdWUpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIFdpZGVTdHJpbmcmIFZhbHVlID0gcEV2ZW50LT5WYWx1ZSgpOworICBCeXRlU3RyaW5nIHN0clZhbHVlID0gU3RyVHJpbShCeXRlU3RyaW5nOjpGcm9tVW5pY29kZShWYWx1ZSkpOworICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIGludCBpRGVjID0gYWJzKHBSdW50aW1lLT5Ub0ludDMyKHBhcmFtc1swXSkpOworICBpbnQgaVNlcFN0eWxlID0gVmFsaWRTdHlsZU9yWmVybyhwUnVudGltZS0+VG9JbnQzMihwYXJhbXNbMV0pKTsKKyAgaW50IGlOZWdTdHlsZSA9IFZhbGlkU3R5bGVPclplcm8ocFJ1bnRpbWUtPlRvSW50MzIocGFyYW1zWzJdKSk7CisgIC8vIHBhcmFtc1szXSBpcyBpQ3VyclN0eWxlLCBpdCdzIG5vdCB1c2VkLgorICBXaWRlU3RyaW5nIHdzdHJDdXJyZW5jeSA9IHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzRdKTsKKyAgYm9vbCBiQ3VycmVuY3lQcmVwZW5kID0gcFJ1bnRpbWUtPlRvQm9vbGVhbihwYXJhbXNbNV0pOworCisgIC8vIFByb2Nlc3NpbmcgZGVjaW1hbCBwbGFjZXMKKyAgTm9ybWFsaXplRGVjaW1hbE1hcmsoJnN0clZhbHVlKTsKKyAgZG91YmxlIGRWYWx1ZSA9IGF0b2Yoc3RyVmFsdWUuY19zdHIoKSk7CisgIGlmIChpRGVjID4gMCkKKyAgICBkVmFsdWUgKz0ga0RvdWJsZUNvcnJlY3Q7CisKKyAgLy8gQ2FsY3VsYXRpbmcgbnVtYmVyIHN0cmluZworICBib29sIGJOZWdhdGl2ZTsKKyAgaW50IGlEZWMyOworICBzdHJWYWx1ZSA9IENhbGN1bGF0ZVN0cmluZyhkVmFsdWUsIGlEZWMsICZpRGVjMiwgJmJOZWdhdGl2ZSk7CisgIGlmIChzdHJWYWx1ZS5Jc0VtcHR5KCkpIHsKKyAgICBkVmFsdWUgPSAwOworICAgIHN0clZhbHVlID0gQ2FsY3VsYXRlU3RyaW5nKGRWYWx1ZSwgaURlYywgJmlEZWMyLCAmYk5lZ2F0aXZlKTsKKyAgICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKSB7CisgICAgICBzdHJWYWx1ZSA9ICIwIjsKKyAgICAgIGlEZWMyID0gMTsKKyAgICB9CisgIH0KKyAgQVNTRVJUKGlEZWMyID49IDApOworCisgIC8vIFByb2Nlc3Npbmcgc2VwYXJhdG9yIHN0eWxlCisgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KGlEZWMyKSA8IHN0clZhbHVlLkdldExlbmd0aCgpKSB7CisgICAgaWYgKElzU3R5bGVXaXRoQ29tbWFEZWNpbWFsTWFyayhpU2VwU3R5bGUpKQorICAgICAgc3RyVmFsdWUuUmVwbGFjZSgiLiIsICIsIik7CisKKyAgICBpZiAoaURlYzIgPT0gMCkKKyAgICAgIHN0clZhbHVlLkluc2VydChpRGVjMiwgJzAnKTsKKyAgfQorICBpZiAoSXNTdHlsZVdpdGhEaWdpdFNlcGFyYXRvcihpU2VwU3R5bGUpKSB7CisgICAgY2hhciBjU2VwYXJhdG9yID0gRGlnaXRTZXBhcmF0b3JGb3JTdHlsZShpU2VwU3R5bGUpOworICAgIGZvciAoaW50IGlEZWNQb3NpdGl2ZSA9IGlEZWMyIC0gMzsgaURlY1Bvc2l0aXZlID4gMDsgaURlY1Bvc2l0aXZlIC09IDMpCisgICAgICBzdHJWYWx1ZS5JbnNlcnQoaURlY1Bvc2l0aXZlLCBjU2VwYXJhdG9yKTsKKyAgfQorCisgIC8vIFByb2Nlc3NpbmcgY3VycmVuY3kgc3RyaW5nCisgIFZhbHVlID0gV2lkZVN0cmluZzo6RnJvbUxvY2FsKHN0clZhbHVlLkFzU3RyaW5nVmlldygpKTsKKyAgaWYgKGJDdXJyZW5jeVByZXBlbmQpCisgICAgVmFsdWUgPSB3c3RyQ3VycmVuY3kgKyBWYWx1ZTsKKyAgZWxzZQorICAgIFZhbHVlID0gVmFsdWUgKyB3c3RyQ3VycmVuY3k7CisKKyAgLy8gUHJvY2Vzc2luZyBuZWdhdGl2ZSBzdHlsZQorICBpZiAoYk5lZ2F0aXZlKSB7CisgICAgaWYgKGlOZWdTdHlsZSA9PSAwKSB7CisgICAgICBWYWx1ZS5JbnNlcnRBdEZyb250KEwnLScpOworICAgIH0gZWxzZSBpZiAoaU5lZ1N0eWxlID09IDIgfHwgaU5lZ1N0eWxlID09IDMpIHsKKyAgICAgIFZhbHVlLkluc2VydEF0RnJvbnQoTCcoJyk7CisgICAgICBWYWx1ZSArPSBMJyknOworICAgIH0KKyAgICBpZiAoaU5lZ1N0eWxlID09IDEgfHwgaU5lZ1N0eWxlID09IDMpIHsKKyAgICAgIGlmIChGaWVsZCogZlRhcmdldCA9IHBFdmVudC0+VGFyZ2V0X0ZpZWxkKCkpIHsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpBcnJheT4gYXJDb2xvciA9IHBSdW50aW1lLT5OZXdBcnJheSgpOworICAgICAgICBwUnVudGltZS0+UHV0QXJyYXlFbGVtZW50KGFyQ29sb3IsIDAsIHBSdW50aW1lLT5OZXdTdHJpbmcoTCJSR0IiKSk7CisgICAgICAgIHBSdW50aW1lLT5QdXRBcnJheUVsZW1lbnQoYXJDb2xvciwgMSwgcFJ1bnRpbWUtPk5ld051bWJlcigxKSk7CisgICAgICAgIHBSdW50aW1lLT5QdXRBcnJheUVsZW1lbnQoYXJDb2xvciwgMiwgcFJ1bnRpbWUtPk5ld051bWJlcigwKSk7CisgICAgICAgIHBSdW50aW1lLT5QdXRBcnJheUVsZW1lbnQoYXJDb2xvciwgMywgcFJ1bnRpbWUtPk5ld051bWJlcigwKSk7CisgICAgICAgIGZUYXJnZXQtPnNldF90ZXh0X2NvbG9yKHBSdW50aW1lLCBhckNvbG9yKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGlOZWdTdHlsZSA9PSAxIHx8IGlOZWdTdHlsZSA9PSAzKSB7CisgICAgICBpZiAoRmllbGQqIGZUYXJnZXQgPSBwRXZlbnQtPlRhcmdldF9GaWVsZCgpKSB7CisgICAgICAgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IGFyQ29sb3IgPSBwUnVudGltZS0+TmV3QXJyYXkoKTsKKyAgICAgICAgcFJ1bnRpbWUtPlB1dEFycmF5RWxlbWVudChhckNvbG9yLCAwLCBwUnVudGltZS0+TmV3U3RyaW5nKEwiUkdCIikpOworICAgICAgICBwUnVudGltZS0+UHV0QXJyYXlFbGVtZW50KGFyQ29sb3IsIDEsIHBSdW50aW1lLT5OZXdOdW1iZXIoMCkpOworICAgICAgICBwUnVudGltZS0+UHV0QXJyYXlFbGVtZW50KGFyQ29sb3IsIDIsIHBSdW50aW1lLT5OZXdOdW1iZXIoMCkpOworICAgICAgICBwUnVudGltZS0+UHV0QXJyYXlFbGVtZW50KGFyQ29sb3IsIDMsIHBSdW50aW1lLT5OZXdOdW1iZXIoMCkpOworCisgICAgICAgIENKU19SZXR1cm4gcmVzdWx0ID0gZlRhcmdldC0+Z2V0X3RleHRfY29sb3IocFJ1bnRpbWUpOworICAgICAgICBDRlhfQ29sb3IgY3JQcm9wID0gY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IoCisgICAgICAgICAgICBwUnVudGltZSwgcFJ1bnRpbWUtPlRvQXJyYXkocmVzdWx0LlJldHVybigpKSk7CisgICAgICAgIENGWF9Db2xvciBjckNvbG9yID0gY29sb3I6OkNvbnZlcnRBcnJheVRvUFdMQ29sb3IocFJ1bnRpbWUsIGFyQ29sb3IpOworICAgICAgICBpZiAoY3JDb2xvciAhPSBjclByb3ApCisgICAgICAgICAgZlRhcmdldC0+c2V0X3RleHRfY29sb3IocFJ1bnRpbWUsIGFyQ29sb3IpOworICAgICAgfQorICAgIH0KKyAgfQorI2VuZGlmCisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCisvLyBmdW5jdGlvbiBBRk51bWJlcl9LZXlzdHJva2UobkRlYywgc2VwU3R5bGUsIG5lZ1N0eWxlLCBjdXJyU3R5bGUsIHN0ckN1cnJlbmN5LAorLy8gYkN1cnJlbmN5UHJlcGVuZCkKK0NKU19SZXR1cm4gQ0pTX1B1YmxpY01ldGhvZHM6OkFGTnVtYmVyX0tleXN0cm9rZSgKKyAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPCAyKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBDSlNfRXZlbnRDb250ZXh0KiBwQ29udGV4dCA9IHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCk7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKKyAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBXaWRlU3RyaW5nJiB2YWwgPSBwRXZlbnQtPlZhbHVlKCk7CisgIFdpZGVTdHJpbmcmIHdzdHJDaGFuZ2UgPSBwRXZlbnQtPkNoYW5nZSgpOworICBXaWRlU3RyaW5nIHdzdHJWYWx1ZSA9IHZhbDsKKworICBpZiAocEV2ZW50LT5XaWxsQ29tbWl0KCkpIHsKKyAgICBXaWRlU3RyaW5nIHN3VGVtcCA9IFN0clRyaW0od3N0clZhbHVlKTsKKyAgICBpZiAoc3dUZW1wLklzRW1wdHkoKSkKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgICAgTm9ybWFsaXplRGVjaW1hbE1hcmtXKCZzd1RlbXApOworICAgIGlmICghSXNOdW1iZXIoc3dUZW1wLmNfc3RyKCkpKSB7CisgICAgICBwRXZlbnQtPlJjKCkgPSBmYWxzZTsKKyAgICAgIFdpZGVTdHJpbmcgc0Vycm9yID0gSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprSW52YWxpZElucHV0RXJyb3IpOworICAgICAgQWxlcnRJZlBvc3NpYmxlKHBDb250ZXh0LCBzRXJyb3IuY19zdHIoKSk7CisgICAgICByZXR1cm4gQ0pTX1JldHVybihzRXJyb3IpOworICAgIH0KKyAgICAvLyBJdCBoYXBwZW5zIGFmdGVyIHRoZSBsYXN0IGtleXN0cm9rZSBhbmQgYmVmb3JlIHZhbGlkYXRpbmcsCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisgIH0KKworICBXaWRlU3RyaW5nIHdzdHJTZWxlY3RlZDsKKyAgaWYgKHBFdmVudC0+U2VsU3RhcnQoKSAhPSAtMSkgeworICAgIHdzdHJTZWxlY3RlZCA9IHdzdHJWYWx1ZS5NaWQocEV2ZW50LT5TZWxTdGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEV2ZW50LT5TZWxFbmQoKSAtIHBFdmVudC0+U2VsU3RhcnQoKSk7CisgIH0KKworICBib29sIGJIYXNTaWduID0gd3N0clZhbHVlLkNvbnRhaW5zKEwnLScpICYmICF3c3RyU2VsZWN0ZWQuQ29udGFpbnMoTCctJyk7CisgIGlmIChiSGFzU2lnbikgeworICAgIC8vIGNhbid0IGluc2VydCAiY2hhbmdlIiBpbiBmcm9udCB0byBzaWduIHBvc3Rpb24uCisgICAgaWYgKHBFdmVudC0+U2VsU3RhcnQoKSA9PSAwKSB7CisgICAgICBwRXZlbnQtPlJjKCkgPSBmYWxzZTsKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworICAgIH0KKyAgfQorCisgIGludCBpU2VwU3R5bGUgPSBWYWxpZFN0eWxlT3JaZXJvKHBSdW50aW1lLT5Ub0ludDMyKHBhcmFtc1sxXSkpOworICBjb25zdCB3Y2hhcl90IGNTZXAgPSBEZWNpbWFsTWFya0ZvclN0eWxlKGlTZXBTdHlsZSk7CisKKyAgYm9vbCBiSGFzU2VwID0gd3N0clZhbHVlLkNvbnRhaW5zKGNTZXApOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdzdHJDaGFuZ2UuR2V0TGVuZ3RoKCk7ICsraSkgeworICAgIGlmICh3c3RyQ2hhbmdlW2ldID09IGNTZXApIHsKKyAgICAgIGlmIChiSGFzU2VwKSB7CisgICAgICAgIHBFdmVudC0+UmMoKSA9IGZhbHNlOworICAgICAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKyAgICAgIH0KKyAgICAgIGJIYXNTZXAgPSB0cnVlOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICh3c3RyQ2hhbmdlW2ldID09IEwnLScpIHsKKyAgICAgIGlmIChiSGFzU2lnbikgeworICAgICAgICBwRXZlbnQtPlJjKCkgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisgICAgICB9CisgICAgICAvLyBzaWduJ3MgcG9zaXRpb24gaXMgbm90IGNvcnJlY3QKKyAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgcEV2ZW50LT5SYygpID0gZmFsc2U7CisgICAgICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworICAgICAgfQorICAgICAgaWYgKHBFdmVudC0+U2VsU3RhcnQoKSAhPSAwKSB7CisgICAgICAgIHBFdmVudC0+UmMoKSA9IGZhbHNlOworICAgICAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKyAgICAgIH0KKyAgICAgIGJIYXNTaWduID0gdHJ1ZTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmICghc3RkOjppc3dkaWdpdCh3c3RyQ2hhbmdlW2ldKSkgeworICAgICAgcEV2ZW50LT5SYygpID0gZmFsc2U7CisgICAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKyAgICB9CisgIH0KKworICB2YWwgPSBDYWxjTWVyZ2VkU3RyaW5nKHBFdmVudCwgd3N0clZhbHVlLCB3c3RyQ2hhbmdlKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKKy8vIGZ1bmN0aW9uIEFGUGVyY2VudF9Gb3JtYXQobkRlYywgc2VwU3R5bGUpCitDSlNfUmV0dXJuIENKU19QdWJsaWNNZXRob2RzOjpBRlBlcmNlbnRfRm9ybWF0KAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworI2lmIF9GWF9PU18gIT0gX0ZYX09TX0FORFJPSURfCisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9CisgICAgICBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpLT5HZXRFdmVudEhhbmRsZXIoKTsKKyAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBXaWRlU3RyaW5nJiBWYWx1ZSA9IHBFdmVudC0+VmFsdWUoKTsKKyAgQnl0ZVN0cmluZyBzdHJWYWx1ZSA9IFN0clRyaW0oQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVmFsdWUpKTsKKyAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKworICBpbnQgaURlYyA9IGFicyhwUnVudGltZS0+VG9JbnQzMihwYXJhbXNbMF0pKTsKKyAgaW50IGlTZXBTdHlsZSA9IFZhbGlkU3R5bGVPclplcm8ocFJ1bnRpbWUtPlRvSW50MzIocGFyYW1zWzFdKSk7CisKKyAgLy8gZm9yIHByb2Nlc3NpbmcgZGVjaW1hbCBwbGFjZXMKKyAgZG91YmxlIGRWYWx1ZSA9IGF0b2Yoc3RyVmFsdWUuY19zdHIoKSk7CisgIGRWYWx1ZSAqPSAxMDA7CisgIGlmIChpRGVjID4gMCkKKyAgICBkVmFsdWUgKz0ga0RvdWJsZUNvcnJlY3Q7CisKKyAgaW50IGlEZWMyOworICBpbnQgaU5lZ2F0aXZlID0gMDsKKyAgc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSwgaURlYywgJmlEZWMyLCAmaU5lZ2F0aXZlKTsKKyAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkgeworICAgIGRWYWx1ZSA9IDA7CisgICAgc3RyVmFsdWUgPSBmY3Z0KGRWYWx1ZSwgaURlYywgJmlEZWMyLCAmaU5lZ2F0aXZlKTsKKyAgfQorCisgIGlmIChpRGVjMiA8IDApIHsKKyAgICBCeXRlU3RyaW5nIHplcm9zOworICAgIGNoYXIqIHplcm9zX3B0ciA9IHplcm9zLkdldEJ1ZmZlcihhYnMoaURlYzIpKTsKKyAgICBtZW1zZXQoemVyb3NfcHRyLCAnMCcsIGFicyhpRGVjMikpOworICAgIHN0clZhbHVlID0gemVyb3MgKyBzdHJWYWx1ZTsKKworICAgIGlEZWMyID0gMDsKKyAgfQorICBpbnQgaU1heCA9IHN0clZhbHVlLkdldExlbmd0aCgpOworICBpZiAoaURlYzIgPiBpTWF4KSB7CisgICAgZm9yIChpbnQgaU51bSA9IDA7IGlOdW0gPD0gaURlYzIgLSBpTWF4OyBpTnVtKyspCisgICAgICBzdHJWYWx1ZSArPSAnMCc7CisKKyAgICBpTWF4ID0gaURlYzIgKyAxOworICB9CisKKyAgLy8gZm9yIHByb2Nlc3Npbmcgc2VwZXJhdG9yIHN0eWxlCisgIGlmIChpRGVjMiA8IGlNYXgpIHsKKyAgICBjaGFyIG1hcmsgPSBEZWNpbWFsTWFya0ZvclN0eWxlKGlTZXBTdHlsZSk7CisgICAgc3RyVmFsdWUuSW5zZXJ0KGlEZWMyLCBtYXJrKTsKKyAgICBpTWF4Kys7CisKKyAgICBpZiAoaURlYzIgPT0gMCkKKyAgICAgIHN0clZhbHVlLkluc2VydChpRGVjMiwgJzAnKTsKKyAgfQorICBpZiAoSXNTdHlsZVdpdGhEaWdpdFNlcGFyYXRvcihpU2VwU3R5bGUpKSB7CisgICAgY2hhciBjU2VwYXJhdG9yID0gRGlnaXRTZXBhcmF0b3JGb3JTdHlsZShpU2VwU3R5bGUpOworICAgIGZvciAoaW50IGlEZWNQb3NpdGl2ZSA9IGlEZWMyIC0gMzsgaURlY1Bvc2l0aXZlID4gMDsgaURlY1Bvc2l0aXZlIC09IDMpIHsKKyAgICAgIHN0clZhbHVlLkluc2VydChpRGVjUG9zaXRpdmUsIGNTZXBhcmF0b3IpOworICAgICAgaU1heCsrOworICAgIH0KKyAgfQorCisgIC8vIG5lZ2F0aXZlIG1hcmsKKyAgaWYgKGlOZWdhdGl2ZSkKKyAgICBzdHJWYWx1ZS5JbnNlcnRBdEZyb250KCctJyk7CisKKyAgc3RyVmFsdWUgKz0gJyUnOworICBWYWx1ZSA9IFdpZGVTdHJpbmc6OkZyb21Mb2NhbChzdHJWYWx1ZS5Bc1N0cmluZ1ZpZXcoKSk7CisjZW5kaWYKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKKy8vIEFGUGVyY2VudF9LZXlzdHJva2UobkRlYywgc2VwU3R5bGUpCitDSlNfUmV0dXJuIENKU19QdWJsaWNNZXRob2RzOjpBRlBlcmNlbnRfS2V5c3Ryb2tlKAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gQUZOdW1iZXJfS2V5c3Ryb2tlKHBSdW50aW1lLCBwYXJhbXMpOworfQorCisvLyBmdW5jdGlvbiBBRkRhdGVfRm9ybWF0RXgoY0Zvcm1hdCkKK0NKU19SZXR1cm4gQ0pTX1B1YmxpY01ldGhvZHM6OkFGRGF0ZV9Gb3JtYXRFeCgKKyAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgQ0pTX0V2ZW50Q29udGV4dCogcENvbnRleHQgPSBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpOworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnQgPSBwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCk7CisgIGlmICghcEV2ZW50LT5tX3BWYWx1ZSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgV2lkZVN0cmluZyYgdmFsID0gcEV2ZW50LT5WYWx1ZSgpOworICBXaWRlU3RyaW5nIHN0clZhbHVlID0gdmFsOworICBpZiAoc3RyVmFsdWUuSXNFbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIFdpZGVTdHJpbmcgc0Zvcm1hdCA9IHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzBdKTsKKyAgZG91YmxlIGREYXRlOworICBpZiAoc3RyVmFsdWUuQ29udGFpbnMoTCJHTVQiKSkgeworICAgIC8vIGZvciBHTVQgZm9ybWF0IHRpbWUKKyAgICAvLyBzdWNoIGFzICJUdWUgQXVnIDExIDE0OjI0OjE2IEdNVCswODAwMjAwOSIKKyAgICBkRGF0ZSA9IE1ha2VJbnRlckRhdGUoc3RyVmFsdWUpOworICB9IGVsc2UgeworICAgIGREYXRlID0gTWFrZVJlZ3VsYXJEYXRlKHN0clZhbHVlLCBzRm9ybWF0LCBudWxscHRyKTsKKyAgfQorCisgIGlmIChzdGQ6OmlzbmFuKGREYXRlKSkgeworICAgIFdpZGVTdHJpbmcgc3dNc2cgPSBXaWRlU3RyaW5nOjpGb3JtYXQoCisgICAgICAgIEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcnNlRGF0ZUVycm9yKS5jX3N0cigpLCBzRm9ybWF0LmNfc3RyKCkpOworICAgIEFsZXJ0SWZQb3NzaWJsZShwQ29udGV4dCwgc3dNc2cuY19zdHIoKSk7CisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworICB9CisKKyAgdmFsID0gTWFrZUZvcm1hdERhdGUoZERhdGUsIHNGb3JtYXQpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworZG91YmxlIENKU19QdWJsaWNNZXRob2RzOjpNYWtlSW50ZXJEYXRlKGNvbnN0IFdpZGVTdHJpbmcmIHN0clZhbHVlKSB7CisgIHN0ZDo6dmVjdG9yPFdpZGVTdHJpbmc+IHdzQXJyYXk7CisgIFdpZGVTdHJpbmcgc1RlbXA7CisgIGZvciAoY29uc3QgYXV0byYgYyA6IHN0clZhbHVlKSB7CisgICAgaWYgKGMgPT0gTCcgJyB8fCBjID09IEwnOicpIHsKKyAgICAgIHdzQXJyYXkucHVzaF9iYWNrKHNUZW1wKTsKKyAgICAgIHNUZW1wLmNsZWFyKCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgc1RlbXAgKz0gYzsKKyAgfQorICB3c0FycmF5LnB1c2hfYmFjayhzVGVtcCk7CisgIGlmICh3c0FycmF5LnNpemUoKSAhPSA4KQorICAgIHJldHVybiAwOworCisgIGludCBuTW9udGggPSAxOworICBzVGVtcCA9IHdzQXJyYXlbMV07CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGtNb250aHMpOyArK2kpIHsKKyAgICBpZiAoc1RlbXAuQ29tcGFyZShrTW9udGhzW2ldKSA9PSAwKSB7CisgICAgICBuTW9udGggPSBpICsgMTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGludCBuRGF5ID0gRlhfYXRvZih3c0FycmF5WzJdLkFzU3RyaW5nVmlldygpKTsKKyAgaW50IG5Ib3VyID0gRlhfYXRvZih3c0FycmF5WzNdLkFzU3RyaW5nVmlldygpKTsKKyAgaW50IG5NaW4gPSBGWF9hdG9mKHdzQXJyYXlbNF0uQXNTdHJpbmdWaWV3KCkpOworICBpbnQgblNlYyA9IEZYX2F0b2Yod3NBcnJheVs1XS5Bc1N0cmluZ1ZpZXcoKSk7CisgIGludCBuWWVhciA9IEZYX2F0b2Yod3NBcnJheVs3XS5Bc1N0cmluZ1ZpZXcoKSk7CisgIGRvdWJsZSBkUmV0ID0gSlNfTWFrZURhdGUoSlNfTWFrZURheShuWWVhciwgbk1vbnRoIC0gMSwgbkRheSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNfTWFrZVRpbWUobkhvdXIsIG5NaW4sIG5TZWMsIDApKTsKKyAgaWYgKHN0ZDo6aXNuYW4oZFJldCkpCisgICAgZFJldCA9IEpTX0RhdGVQYXJzZShzdHJWYWx1ZSk7CisKKyAgcmV0dXJuIGRSZXQ7Cit9CisKKy8vIEFGRGF0ZV9LZXlzdHJva2VFeChjRm9ybWF0KQorQ0pTX1JldHVybiBDSlNfUHVibGljTWV0aG9kczo6QUZEYXRlX0tleXN0cm9rZUV4KAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKSB7CisgICAgcmV0dXJuIENKU19SZXR1cm4oCisgICAgICAgIFdpZGVTdHJpbmcoTCJBRkRhdGVfS2V5c3Ryb2tlRXgncyBwYXJhbWV0ZXJzJyBzaXplIHIgbm90IGNvcnJlY3QiKSk7CisgIH0KKworICBDSlNfRXZlbnRDb250ZXh0KiBwQ29udGV4dCA9IHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCk7CisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9IHBDb250ZXh0LT5HZXRFdmVudEhhbmRsZXIoKTsKKyAgaWYgKHBFdmVudC0+V2lsbENvbW1pdCgpKSB7CisgICAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQorICAgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgICAgY29uc3QgV2lkZVN0cmluZyYgc3RyVmFsdWUgPSBwRXZlbnQtPlZhbHVlKCk7CisgICAgaWYgKHN0clZhbHVlLklzRW1wdHkoKSkKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgICAgV2lkZVN0cmluZyBzRm9ybWF0ID0gcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMF0pOworICAgIGJvb2wgYldyb25nRm9ybWF0ID0gZmFsc2U7CisgICAgZG91YmxlIGRSZXQgPSBNYWtlUmVndWxhckRhdGUoc3RyVmFsdWUsIHNGb3JtYXQsICZiV3JvbmdGb3JtYXQpOworICAgIGlmIChiV3JvbmdGb3JtYXQgfHwgc3RkOjppc25hbihkUmV0KSkgeworICAgICAgV2lkZVN0cmluZyBzd01zZyA9IFdpZGVTdHJpbmc6OkZvcm1hdCgKKyAgICAgICAgICBKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJzZURhdGVFcnJvcikuY19zdHIoKSwKKyAgICAgICAgICBzRm9ybWF0LmNfc3RyKCkpOworICAgICAgQWxlcnRJZlBvc3NpYmxlKHBDb250ZXh0LCBzd01zZy5jX3N0cigpKTsKKyAgICAgIHBFdmVudC0+UmMoKSA9IGZhbHNlOworICAgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisgICAgfQorICB9CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfRm9ybWF0KAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBzdGF0aWMgY29uc3RleHByIGNvbnN0IHdjaGFyX3QqIGNGb3JtYXRzW10gPSB7TCJtL2QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtL2QveXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbS9kZC95eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tL3l5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZC1tbW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJkLW1tbS15eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImRkLW1tbS15eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMInl5LW1tLWRkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tLXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tbS15eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tbSBkLCB5eXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tbSBkLCB5eXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibS9kL3l5IGg6TU0gdHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtL2QveXkgSEg6TU0ifTsKKworICBpbnQgaUluZGV4ID0KKyAgICAgIFdpdGhpbkJvdW5kc09yWmVybyhwUnVudGltZS0+VG9JbnQzMihwYXJhbXNbMF0pLCBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKTsKKyAgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+IG5ld1BhcmFtczsKKyAgbmV3UGFyYW1zLnB1c2hfYmFjayhwUnVudGltZS0+TmV3U3RyaW5nKGNGb3JtYXRzW2lJbmRleF0pKTsKKyAgcmV0dXJuIEFGRGF0ZV9Gb3JtYXRFeChwUnVudGltZSwgbmV3UGFyYW1zKTsKK30KKworLy8gQUZEYXRlX0tleXN0cm9rZUV4KGNGb3JtYXQpCitDSlNfUmV0dXJuIENKU19QdWJsaWNNZXRob2RzOjpBRkRhdGVfS2V5c3Ryb2tlKAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBzdGF0aWMgY29uc3RleHByIGNvbnN0IHdjaGFyX3QqIGNGb3JtYXRzW10gPSB7TCJtL2QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtL2QveXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtbS9kZC95eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tL3l5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZC1tbW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJkLW1tbS15eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImRkLW1tbS15eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMInl5LW1tLWRkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tLXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tbS15eSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIm1tbSBkLCB5eXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibW1tbSBkLCB5eXl5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwibS9kL3l5IGg6TU0gdHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJtL2QveXkgSEg6TU0ifTsKKworICBpbnQgaUluZGV4ID0KKyAgICAgIFdpdGhpbkJvdW5kc09yWmVybyhwUnVudGltZS0+VG9JbnQzMihwYXJhbXNbMF0pLCBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKTsKKyAgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+IG5ld1BhcmFtczsKKyAgbmV3UGFyYW1zLnB1c2hfYmFjayhwUnVudGltZS0+TmV3U3RyaW5nKGNGb3JtYXRzW2lJbmRleF0pKTsKKyAgcmV0dXJuIEFGRGF0ZV9LZXlzdHJva2VFeChwUnVudGltZSwgbmV3UGFyYW1zKTsKK30KKworLy8gZnVuY3Rpb24gQUZUaW1lX0Zvcm1hdChwdGYpCitDSlNfUmV0dXJuIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfRm9ybWF0KAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBzdGF0aWMgY29uc3RleHByIGNvbnN0IHdjaGFyX3QqIGNGb3JtYXRzW10gPSB7TCJISDpNTSIsIEwiaDpNTSB0dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkhIOk1NOnNzIiwgTCJoOk1NOnNzIHR0In07CisKKyAgaW50IGlJbmRleCA9CisgICAgICBXaXRoaW5Cb3VuZHNPclplcm8ocFJ1bnRpbWUtPlRvSW50MzIocGFyYW1zWzBdKSwgRlhfQXJyYXlTaXplKGNGb3JtYXRzKSk7CisgIHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiBuZXdQYXJhbXM7CisgIG5ld1BhcmFtcy5wdXNoX2JhY2socFJ1bnRpbWUtPk5ld1N0cmluZyhjRm9ybWF0c1tpSW5kZXhdKSk7CisgIHJldHVybiBBRkRhdGVfRm9ybWF0RXgocFJ1bnRpbWUsIG5ld1BhcmFtcyk7Cit9CisKK0NKU19SZXR1cm4gQ0pTX1B1YmxpY01ldGhvZHM6OkFGVGltZV9LZXlzdHJva2UoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIHN0YXRpYyBjb25zdGV4cHIgY29uc3Qgd2NoYXJfdCogY0Zvcm1hdHNbXSA9IHtMIkhIOk1NIiwgTCJoOk1NIHR0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiSEg6TU06c3MiLCBMImg6TU06c3MgdHQifTsKKworICBpbnQgaUluZGV4ID0KKyAgICAgIFdpdGhpbkJvdW5kc09yWmVybyhwUnVudGltZS0+VG9JbnQzMihwYXJhbXNbMF0pLCBGWF9BcnJheVNpemUoY0Zvcm1hdHMpKTsKKyAgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+IG5ld1BhcmFtczsKKyAgbmV3UGFyYW1zLnB1c2hfYmFjayhwUnVudGltZS0+TmV3U3RyaW5nKGNGb3JtYXRzW2lJbmRleF0pKTsKKyAgcmV0dXJuIEFGRGF0ZV9LZXlzdHJva2VFeChwUnVudGltZSwgbmV3UGFyYW1zKTsKK30KKworQ0pTX1JldHVybiBDSlNfUHVibGljTWV0aG9kczo6QUZUaW1lX0Zvcm1hdEV4KAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gQUZEYXRlX0Zvcm1hdEV4KHBSdW50aW1lLCBwYXJhbXMpOworfQorCitDSlNfUmV0dXJuIENKU19QdWJsaWNNZXRob2RzOjpBRlRpbWVfS2V5c3Ryb2tlRXgoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBBRkRhdGVfS2V5c3Ryb2tlRXgocFJ1bnRpbWUsIHBhcmFtcyk7Cit9CisKKy8vIGZ1bmN0aW9uIEFGU3BlY2lhbF9Gb3JtYXQocHNmKQorQ0pTX1JldHVybiBDSlNfUHVibGljTWV0aG9kczo6QUZTcGVjaWFsX0Zvcm1hdCgKKyAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0KKyAgICAgIHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCktPkdldEV2ZW50SGFuZGxlcigpOworICBpZiAoIXBFdmVudC0+bV9wVmFsdWUpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIGNvbnN0IFdpZGVTdHJpbmcmIHdzU291cmNlID0gcEV2ZW50LT5WYWx1ZSgpOworICBXaWRlU3RyaW5nIHdzRm9ybWF0OworICBzd2l0Y2ggKHBSdW50aW1lLT5Ub0ludDMyKHBhcmFtc1swXSkpIHsKKyAgICBjYXNlIDA6CisgICAgICB3c0Zvcm1hdCA9IEwiOTk5OTkiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgd3NGb3JtYXQgPSBMIjk5OTk5LTk5OTkiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgaWYgKHV0aWw6OnByaW50eChMIjk5OTk5OTk5OTkiLCB3c1NvdXJjZSkuR2V0TGVuZ3RoKCkgPj0gMTApCisgICAgICAgIHdzRm9ybWF0ID0gTCIoOTk5KSA5OTktOTk5OSI7CisgICAgICBlbHNlCisgICAgICAgIHdzRm9ybWF0ID0gTCI5OTktOTk5OSI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICB3c0Zvcm1hdCA9IEwiOTk5LTk5LTk5OTkiOworICAgICAgYnJlYWs7CisgIH0KKworICBwRXZlbnQtPlZhbHVlKCkgPSB1dGlsOjpwcmludHgod3NGb3JtYXQsIHdzU291cmNlKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKKy8vIGZ1bmN0aW9uIEFGU3BlY2lhbF9LZXlzdHJva2VFeChtYXNrKQorQ0pTX1JldHVybiBDSlNfUHVibGljTWV0aG9kczo6QUZTcGVjaWFsX0tleXN0cm9rZUV4KAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSA8IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENKU19FdmVudENvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPkdldEN1cnJlbnRFdmVudENvbnRleHQoKTsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOworICBpZiAoIXBFdmVudC0+bV9wVmFsdWUpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIGNvbnN0IFdpZGVTdHJpbmcmIHZhbEV2ZW50ID0gcEV2ZW50LT5WYWx1ZSgpOworICBXaWRlU3RyaW5nIHdzdHJNYXNrID0gcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMF0pOworICBpZiAod3N0ck1hc2suSXNFbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIGlmIChwRXZlbnQtPldpbGxDb21taXQoKSkgeworICAgIGlmICh2YWxFdmVudC5Jc0VtcHR5KCkpCisgICAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKworICAgIHNpemVfdCBpSW5kZXhNYXNrID0gMDsKKyAgICBmb3IgKDsgaUluZGV4TWFzayA8IHZhbEV2ZW50LkdldExlbmd0aCgpOyArK2lJbmRleE1hc2spIHsKKyAgICAgIGlmICghTWFza1NhdGlzZmllZCh2YWxFdmVudFtpSW5kZXhNYXNrXSwgd3N0ck1hc2tbaUluZGV4TWFza10pKQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoaUluZGV4TWFzayAhPSB3c3RyTWFzay5HZXRMZW5ndGgoKSB8fAorICAgICAgICAoaUluZGV4TWFzayAhPSB2YWxFdmVudC5HZXRMZW5ndGgoKSAmJiB3c3RyTWFzay5HZXRMZW5ndGgoKSAhPSAwKSkgeworICAgICAgQWxlcnRJZlBvc3NpYmxlKHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgIEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a0ludmFsaWRJbnB1dEVycm9yKS5jX3N0cigpKTsKKyAgICAgIHBFdmVudC0+UmMoKSA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKyAgfQorCisgIFdpZGVTdHJpbmcmIHdpZGVDaGFuZ2UgPSBwRXZlbnQtPkNoYW5nZSgpOworICBpZiAod2lkZUNoYW5nZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgV2lkZVN0cmluZyB3Q2hhbmdlID0gd2lkZUNoYW5nZTsKKyAgc2l6ZV90IGlJbmRleE1hc2sgPSBwRXZlbnQtPlNlbFN0YXJ0KCk7CisgIHNpemVfdCBjb21iaW5lZF9sZW4gPSB2YWxFdmVudC5HZXRMZW5ndGgoKSArIHdDaGFuZ2UuR2V0TGVuZ3RoKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgcEV2ZW50LT5TZWxTdGFydCgpIC0gcEV2ZW50LT5TZWxFbmQoKTsKKyAgaWYgKGNvbWJpbmVkX2xlbiA+IHdzdHJNYXNrLkdldExlbmd0aCgpKSB7CisgICAgQWxlcnRJZlBvc3NpYmxlKHBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICBKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbVRvb0xvbmdFcnJvcikuY19zdHIoKSk7CisgICAgcEV2ZW50LT5SYygpID0gZmFsc2U7CisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisgIH0KKworICBpZiAoaUluZGV4TWFzayA+PSB3c3RyTWFzay5HZXRMZW5ndGgoKSAmJiAhd0NoYW5nZS5Jc0VtcHR5KCkpIHsKKyAgICBBbGVydElmUG9zc2libGUocENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgIEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtVG9vTG9uZ0Vycm9yKS5jX3N0cigpKTsKKyAgICBwRXZlbnQtPlJjKCkgPSBmYWxzZTsKKyAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKyAgfQorCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgd0NoYW5nZS5HZXRMZW5ndGgoKTsgKytpKSB7CisgICAgaWYgKGlJbmRleE1hc2sgPj0gd3N0ck1hc2suR2V0TGVuZ3RoKCkpIHsKKyAgICAgIEFsZXJ0SWZQb3NzaWJsZShwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICBKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbVRvb0xvbmdFcnJvcikuY19zdHIoKSk7CisgICAgICBwRXZlbnQtPlJjKCkgPSBmYWxzZTsKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworICAgIH0KKyAgICB3Y2hhcl90IHdNYXNrID0gd3N0ck1hc2tbaUluZGV4TWFza107CisgICAgaWYgKCFJc1Jlc2VydmVkTWFza0NoYXIod01hc2spKQorICAgICAgd0NoYW5nZS5TZXRBdChpLCB3TWFzayk7CisKKyAgICBpZiAoIU1hc2tTYXRpc2ZpZWQod0NoYW5nZVtpXSwgd01hc2spKSB7CisgICAgICBwRXZlbnQtPlJjKCkgPSBmYWxzZTsKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworICAgIH0KKyAgICBpSW5kZXhNYXNrKys7CisgIH0KKyAgd2lkZUNoYW5nZSA9IHdDaGFuZ2U7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCisvLyBmdW5jdGlvbiBBRlNwZWNpYWxfS2V5c3Ryb2tlKHBzZikKK0NKU19SZXR1cm4gQ0pTX1B1YmxpY01ldGhvZHM6OkFGU3BlY2lhbF9LZXlzdHJva2UoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENKU19FdmVudEhhbmRsZXIqIHBFdmVudCA9CisgICAgICBwUnVudGltZS0+R2V0Q3VycmVudEV2ZW50Q29udGV4dCgpLT5HZXRFdmVudEhhbmRsZXIoKTsKKyAgaWYgKCFwRXZlbnQtPm1fcFZhbHVlKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBjb25zdCBjaGFyKiBjRm9ybWF0ID0gIiI7CisgIHN3aXRjaCAocFJ1bnRpbWUtPlRvSW50MzIocGFyYW1zWzBdKSkgeworICAgIGNhc2UgMDoKKyAgICAgIGNGb3JtYXQgPSAiOTk5OTkiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgY0Zvcm1hdCA9ICI5OTk5OTk5OTkiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgaWYgKHBFdmVudC0+VmFsdWUoKS5HZXRMZW5ndGgoKSArIHBFdmVudC0+Q2hhbmdlKCkuR2V0TGVuZ3RoKCkgPiA3KQorICAgICAgICBjRm9ybWF0ID0gIjk5OTk5OTk5OTkiOworICAgICAgZWxzZQorICAgICAgICBjRm9ybWF0ID0gIjk5OTk5OTkiOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgY0Zvcm1hdCA9ICI5OTk5OTk5OTkiOworICAgICAgYnJlYWs7CisgIH0KKworICBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4gcGFyYW1zMjsKKyAgcGFyYW1zMi5wdXNoX2JhY2socFJ1bnRpbWUtPk5ld1N0cmluZyhjRm9ybWF0KSk7CisgIHJldHVybiBBRlNwZWNpYWxfS2V5c3Ryb2tlRXgocFJ1bnRpbWUsIHBhcmFtczIpOworfQorCitDSlNfUmV0dXJuIENKU19QdWJsaWNNZXRob2RzOjpBRk1lcmdlQ2hhbmdlKAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBDSlNfRXZlbnRIYW5kbGVyKiBwRXZlbnRIYW5kbGVyID0KKyAgICAgIHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCktPkdldEV2ZW50SGFuZGxlcigpOworCisgIFdpZGVTdHJpbmcgc3dWYWx1ZTsKKyAgaWYgKHBFdmVudEhhbmRsZXItPm1fcFZhbHVlKQorICAgIHN3VmFsdWUgPSBwRXZlbnRIYW5kbGVyLT5WYWx1ZSgpOworCisgIGlmIChwRXZlbnRIYW5kbGVyLT5XaWxsQ29tbWl0KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1N0cmluZyhzd1ZhbHVlLmNfc3RyKCkpKTsKKworICBXaWRlU3RyaW5nIG1lcmdlZCA9CisgICAgICBDYWxjTWVyZ2VkU3RyaW5nKHBFdmVudEhhbmRsZXIsIHN3VmFsdWUsIHBFdmVudEhhbmRsZXItPkNoYW5nZSgpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1N0cmluZyhtZXJnZWQuY19zdHIoKSkpOworfQorCitDSlNfUmV0dXJuIENKU19QdWJsaWNNZXRob2RzOjpBRlBhcnNlRGF0ZUV4KAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAyKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBXaWRlU3RyaW5nIHNWYWx1ZSA9IHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzBdKTsKKyAgV2lkZVN0cmluZyBzRm9ybWF0ID0gcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMV0pOworICBkb3VibGUgZERhdGUgPSBNYWtlUmVndWxhckRhdGUoc1ZhbHVlLCBzRm9ybWF0LCBudWxscHRyKTsKKyAgaWYgKHN0ZDo6aXNuYW4oZERhdGUpKSB7CisgICAgV2lkZVN0cmluZyBzd01zZyA9IFdpZGVTdHJpbmc6OkZvcm1hdCgKKyAgICAgICAgSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyc2VEYXRlRXJyb3IpLmNfc3RyKCksIHNGb3JtYXQuY19zdHIoKSk7CisgICAgQWxlcnRJZlBvc3NpYmxlKHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCksIHN3TXNnLmNfc3RyKCkpOworICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKyAgfQorICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3TnVtYmVyKGREYXRlKSk7Cit9CisKK0NKU19SZXR1cm4gQ0pTX1B1YmxpY01ldGhvZHM6OkFGU2ltcGxlKAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAzKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3TnVtYmVyKHN0YXRpY19jYXN0PGRvdWJsZT4oQUZfU2ltcGxlKAorICAgICAgcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMF0pLmNfc3RyKCksIHBSdW50aW1lLT5Ub0RvdWJsZShwYXJhbXNbMV0pLAorICAgICAgcFJ1bnRpbWUtPlRvRG91YmxlKHBhcmFtc1syXSkpKSkpOworfQorCitDSlNfUmV0dXJuIENKU19QdWJsaWNNZXRob2RzOjpBRk1ha2VOdW1iZXIoCisgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIFdpZGVTdHJpbmcgd3MgPSBwUnVudGltZS0+VG9XaWRlU3RyaW5nKHBhcmFtc1swXSk7CisgIE5vcm1hbGl6ZURlY2ltYWxNYXJrVygmd3MpOworCisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbCA9CisgICAgICBwUnVudGltZS0+TWF5YmVDb2VyY2VUb051bWJlcihwUnVudGltZS0+TmV3U3RyaW5nKHdzLmNfc3RyKCkpKTsKKyAgaWYgKCF2YWwtPklzTnVtYmVyKCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld051bWJlcigwKSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHZhbCk7Cit9CisKK0NKU19SZXR1cm4gQ0pTX1B1YmxpY01ldGhvZHM6OkFGU2ltcGxlX0NhbGN1bGF0ZSgKKyAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgaWYgKChwYXJhbXNbMV0uSXNFbXB0eSgpIHx8ICFwYXJhbXNbMV0tPklzQXJyYXkoKSkgJiYgIXBhcmFtc1sxXS0+SXNTdHJpbmcoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgQ1BERlNES19JbnRlckZvcm0qIHBSZWFkZXJJbnRlckZvcm0gPQorICAgICAgcFJ1bnRpbWUtPkdldEZvcm1GaWxsRW52KCktPkdldEludGVyRm9ybSgpOworICBDUERGX0ludGVyRm9ybSogcEludGVyRm9ybSA9IHBSZWFkZXJJbnRlckZvcm0tPkdldEludGVyRm9ybSgpOworCisgIFdpZGVTdHJpbmcgc0Z1bmN0aW9uID0gcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMF0pOworICBkb3VibGUgZFZhbHVlID0gd2NzY21wKHNGdW5jdGlvbi5jX3N0cigpLCBMIlBSRCIpID09IDAgPyAxLjAgOiAwLjA7CisKKyAgdjg6OkxvY2FsPHY4OjpBcnJheT4gRmllbGROYW1lQXJyYXkgPQorICAgICAgQUZfTWFrZUFycmF5RnJvbUxpc3QocFJ1bnRpbWUsIHBhcmFtc1swXSk7CisgIGludCBuRmllbGRzQ291bnQgPSAwOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBSdW50aW1lLT5HZXRBcnJheUxlbmd0aChGaWVsZE5hbWVBcnJheSk7ICsraSkgeworICAgIFdpZGVTdHJpbmcgd3NGaWVsZE5hbWUgPQorICAgICAgICBwUnVudGltZS0+VG9XaWRlU3RyaW5nKHBSdW50aW1lLT5HZXRBcnJheUVsZW1lbnQoRmllbGROYW1lQXJyYXksIGkpKTsKKworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcEludGVyRm9ybS0+Q291bnRGaWVsZHMod3NGaWVsZE5hbWUpOyArK2opIHsKKyAgICAgIENQREZfRm9ybUZpZWxkKiBwRm9ybUZpZWxkID0gcEludGVyRm9ybS0+R2V0RmllbGQoaiwgd3NGaWVsZE5hbWUpOworICAgICAgaWYgKCFwRm9ybUZpZWxkKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgZG91YmxlIGRUZW1wID0gMC4wOworICAgICAgc3dpdGNoIChwRm9ybUZpZWxkLT5HZXRGaWVsZFR5cGUoKSkgeworICAgICAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtUZXh0RmllbGQ6CisgICAgICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a0NvbWJvQm94OiB7CisgICAgICAgICAgV2lkZVN0cmluZyB0cmltbWVkID0gcEZvcm1GaWVsZC0+R2V0VmFsdWUoKTsKKyAgICAgICAgICB0cmltbWVkLlRyaW1SaWdodCgpOworICAgICAgICAgIHRyaW1tZWQuVHJpbUxlZnQoKTsKKyAgICAgICAgICBkVGVtcCA9IEZYX2F0b2YodHJpbW1lZC5Bc1N0cmluZ1ZpZXcoKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGb3JtRmllbGRUeXBlOjprUHVzaEJ1dHRvbjoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGb3JtRmllbGRUeXBlOjprQ2hlY2tCb3g6CisgICAgICAgIGNhc2UgRm9ybUZpZWxkVHlwZTo6a1JhZGlvQnV0dG9uOgorICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgcEZvcm1GaWVsZC0+Q291bnRDb250cm9scygpOyArK2MpIHsKKyAgICAgICAgICAgIENQREZfRm9ybUNvbnRyb2wqIHBGb3JtQ3RybCA9IHBGb3JtRmllbGQtPkdldENvbnRyb2woYyk7CisgICAgICAgICAgICBpZiAoIXBGb3JtRmllbGQgfHwgIXBGb3JtQ3RybC0+SXNDaGVja2VkKCkpCisgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBXaWRlU3RyaW5nIHRyaW1tZWQgPSBwRm9ybUN0cmwtPkdldEV4cG9ydFZhbHVlKCk7CisgICAgICAgICAgICB0cmltbWVkLlRyaW1SaWdodCgpOworICAgICAgICAgICAgdHJpbW1lZC5UcmltTGVmdCgpOworICAgICAgICAgICAgZFRlbXAgPSBGWF9hdG9mKHRyaW1tZWQuQXNTdHJpbmdWaWV3KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZvcm1GaWVsZFR5cGU6OmtMaXN0Qm94OgorICAgICAgICAgIGlmIChwRm9ybUZpZWxkLT5Db3VudFNlbGVjdGVkSXRlbXMoKSA8PSAxKSB7CisgICAgICAgICAgICBXaWRlU3RyaW5nIHRyaW1tZWQgPSBwRm9ybUZpZWxkLT5HZXRWYWx1ZSgpOworICAgICAgICAgICAgdHJpbW1lZC5UcmltUmlnaHQoKTsKKyAgICAgICAgICAgIHRyaW1tZWQuVHJpbUxlZnQoKTsKKyAgICAgICAgICAgIGRUZW1wID0gRlhfYXRvZih0cmltbWVkLkFzU3RyaW5nVmlldygpKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGlmIChpID09IDAgJiYgaiA9PSAwICYmCisgICAgICAgICAgKHdjc2NtcChzRnVuY3Rpb24uY19zdHIoKSwgTCJNSU4iKSA9PSAwIHx8CisgICAgICAgICAgIHdjc2NtcChzRnVuY3Rpb24uY19zdHIoKSwgTCJNQVgiKSA9PSAwKSkgeworICAgICAgICBkVmFsdWUgPSBkVGVtcDsKKyAgICAgIH0KKyAgICAgIGRWYWx1ZSA9IEFGX1NpbXBsZShzRnVuY3Rpb24uY19zdHIoKSwgZFZhbHVlLCBkVGVtcCk7CisKKyAgICAgIG5GaWVsZHNDb3VudCsrOworICAgIH0KKyAgfQorCisgIGlmICh3Y3NjbXAoc0Z1bmN0aW9uLmNfc3RyKCksIEwiQVZHIikgPT0gMCAmJiBuRmllbGRzQ291bnQgPiAwKQorICAgIGRWYWx1ZSAvPSBuRmllbGRzQ291bnQ7CisKKyAgZFZhbHVlID0gZmxvb3IoZFZhbHVlICogRlhTWVNfcG93KDEwLCA2KSArIDAuNDkpIC8gRlhTWVNfcG93KDEwLCA2KTsKKworICBDSlNfRXZlbnRDb250ZXh0KiBwQ29udGV4dCA9IHBSdW50aW1lLT5HZXRDdXJyZW50RXZlbnRDb250ZXh0KCk7CisgIGlmIChwQ29udGV4dC0+R2V0RXZlbnRIYW5kbGVyKCktPm1fcFZhbHVlKSB7CisgICAgcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpLT5WYWx1ZSgpID0KKyAgICAgICAgcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwUnVudGltZS0+TmV3TnVtYmVyKGRWYWx1ZSkpOworICB9CisKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gdmFsaWRhdGVzIHRoZSBjdXJyZW50IGV2ZW50IHRvIGVuc3VyZSB0aGF0IGl0cyB2YWx1ZSBpcworKiogd2l0aGluIHRoZSBzcGVjaWZpZWQgcmFuZ2UuICovCitDSlNfUmV0dXJuIENKU19QdWJsaWNNZXRob2RzOjpBRlJhbmdlX1ZhbGlkYXRlKAorICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSA0KQorICAgIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENKU19FdmVudENvbnRleHQqIHBDb250ZXh0ID0gcFJ1bnRpbWUtPkdldEN1cnJlbnRFdmVudENvbnRleHQoKTsKKyAgQ0pTX0V2ZW50SGFuZGxlciogcEV2ZW50ID0gcENvbnRleHQtPkdldEV2ZW50SGFuZGxlcigpOworICBpZiAoIXBFdmVudC0+bV9wVmFsdWUpCisgICAgcmV0dXJuIENKU19SZXR1cm4oZmFsc2UpOworCisgIGlmIChwRXZlbnQtPlZhbHVlKCkuSXNFbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIGRvdWJsZSBkRWVudFZhbHVlID0gYXRvZihCeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwRXZlbnQtPlZhbHVlKCkpLmNfc3RyKCkpOworICBib29sIGJHcmVhdGVyVGhhbiA9IHBSdW50aW1lLT5Ub0Jvb2xlYW4ocGFyYW1zWzBdKTsKKyAgZG91YmxlIGRHcmVhdGVyVGhhbiA9IHBSdW50aW1lLT5Ub0RvdWJsZShwYXJhbXNbMV0pOworICBib29sIGJMZXNzVGhhbiA9IHBSdW50aW1lLT5Ub0Jvb2xlYW4ocGFyYW1zWzJdKTsKKyAgZG91YmxlIGRMZXNzVGhhbiA9IHBSdW50aW1lLT5Ub0RvdWJsZShwYXJhbXNbM10pOworICBXaWRlU3RyaW5nIHN3TXNnOworCisgIGlmIChiR3JlYXRlclRoYW4gJiYgYkxlc3NUaGFuKSB7CisgICAgaWYgKGRFZW50VmFsdWUgPCBkR3JlYXRlclRoYW4gfHwgZEVlbnRWYWx1ZSA+IGRMZXNzVGhhbikKKyAgICAgIHN3TXNnID0gV2lkZVN0cmluZzo6Rm9ybWF0KAorICAgICAgICAgIEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1JhbmdlQmV0d2VlbkVycm9yKS5jX3N0cigpLAorICAgICAgICAgIHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzFdKS5jX3N0cigpLAorICAgICAgICAgIHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzNdKS5jX3N0cigpKTsKKyAgfSBlbHNlIGlmIChiR3JlYXRlclRoYW4pIHsKKyAgICBpZiAoZEVlbnRWYWx1ZSA8IGRHcmVhdGVyVGhhbikKKyAgICAgIHN3TXNnID0gV2lkZVN0cmluZzo6Rm9ybWF0KAorICAgICAgICAgIEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1JhbmdlR3JlYXRlckVycm9yKS5jX3N0cigpLAorICAgICAgICAgIHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzFdKS5jX3N0cigpKTsKKyAgfSBlbHNlIGlmIChiTGVzc1RoYW4pIHsKKyAgICBpZiAoZEVlbnRWYWx1ZSA+IGRMZXNzVGhhbikKKyAgICAgIHN3TXNnID0gV2lkZVN0cmluZzo6Rm9ybWF0KAorICAgICAgICAgIEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1JhbmdlTGVzc0Vycm9yKS5jX3N0cigpLAorICAgICAgICAgIHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzNdKS5jX3N0cigpKTsKKyAgfQorCisgIGlmICghc3dNc2cuSXNFbXB0eSgpKSB7CisgICAgQWxlcnRJZlBvc3NpYmxlKHBDb250ZXh0LCBzd01zZy5jX3N0cigpKTsKKyAgICBwRXZlbnQtPlJjKCkgPSBmYWxzZTsKKyAgfQorICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlNfUHVibGljTWV0aG9kczo6QUZFeHRyYWN0TnVtcygKKyAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgV2lkZVN0cmluZyBzdHIgPSBwUnVudGltZS0+VG9XaWRlU3RyaW5nKHBhcmFtc1swXSk7CisgIGlmIChzdHIuR2V0TGVuZ3RoKCkgPiAwICYmIElzRGlnaXRTZXBhcmF0b3JPckRlY2ltYWxNYXJrKHN0clswXSkpCisgICAgc3RyLkluc2VydEF0RnJvbnQoTCcwJyk7CisKKyAgV2lkZVN0cmluZyBzUGFydDsKKyAgdjg6OkxvY2FsPHY4OjpBcnJheT4gbnVtcyA9IHBSdW50aW1lLT5OZXdBcnJheSgpOworICBpbnQgbkluZGV4ID0gMDsKKyAgZm9yIChjb25zdCBhdXRvJiB3YyA6IHN0cikgeworICAgIGlmIChzdGQ6Omlzd2RpZ2l0KHdjKSkgeworICAgICAgc1BhcnQgKz0gd2M7CisgICAgfSBlbHNlIGlmIChzUGFydC5HZXRMZW5ndGgoKSA+IDApIHsKKyAgICAgIHBSdW50aW1lLT5QdXRBcnJheUVsZW1lbnQobnVtcywgbkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnVudGltZS0+TmV3U3RyaW5nKHNQYXJ0LmNfc3RyKCkpKTsKKyAgICAgIHNQYXJ0LmNsZWFyKCk7CisgICAgICBuSW5kZXgrKzsKKyAgICB9CisgIH0KKyAgaWYgKHNQYXJ0LkdldExlbmd0aCgpID4gMCkKKyAgICBwUnVudGltZS0+UHV0QXJyYXlFbGVtZW50KG51bXMsIG5JbmRleCwgcFJ1bnRpbWUtPk5ld1N0cmluZyhzUGFydC5jX3N0cigpKSk7CisKKyAgaWYgKHBSdW50aW1lLT5HZXRBcnJheUxlbmd0aChudW1zKSA+IDApCisgICAgcmV0dXJuIENKU19SZXR1cm4obnVtcyk7CisgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdVbmRlZmluZWQoKSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL2Nqc19wdWJsaWNtZXRob2RzLmggYi9meGpzL2Nqc19wdWJsaWNtZXRob2RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcyNjk5NgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2pzX3B1YmxpY21ldGhvZHMuaApAQCAtMCwwICsxLDE2MCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfQ0pTX1BVQkxJQ01FVEhPRFNfSF8KKyNkZWZpbmUgRlhKU19DSlNfUFVCTElDTUVUSE9EU19IXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImZ4anMvSlNfRGVmaW5lLmgiCisKK2NsYXNzIENKU19QdWJsaWNNZXRob2RzIDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pTX1B1YmxpY01ldGhvZHModjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpOworICB+Q0pTX1B1YmxpY01ldGhvZHMoKSBvdmVycmlkZTsKKworICBzdGF0aWMgdm9pZCBEZWZpbmVKU09iamVjdHMoQ0ZYSlNfRW5naW5lKiBwRW5naW5lKTsKKyAgc3RhdGljIGRvdWJsZSBNYWtlUmVndWxhckRhdGUoY29uc3QgV2lkZVN0cmluZyYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogYldyb25nRm9ybWF0KTsKKworICAvLyBFeHBvc2VkIGZvciB0ZXN0aW5nLgorICBzdGF0aWMgV2lkZVN0cmluZyBNYWtlRm9ybWF0RGF0ZShkb3VibGUgZERhdGUsIGNvbnN0IFdpZGVTdHJpbmcmIGZvcm1hdCk7CisgIHN0YXRpYyBib29sIElzTnVtYmVyKGNvbnN0IFdpZGVTdHJpbmcmIHN0cik7CisKKyAgc3RhdGljIENKU19SZXR1cm4gQUZOdW1iZXJfRm9ybWF0KAorICAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBzdGF0aWMgQ0pTX1JldHVybiBBRk51bWJlcl9LZXlzdHJva2UoCisgICAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIHN0YXRpYyBDSlNfUmV0dXJuIEFGUGVyY2VudF9Gb3JtYXQoCisgICAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIHN0YXRpYyBDSlNfUmV0dXJuIEFGUGVyY2VudF9LZXlzdHJva2UoCisgICAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIHN0YXRpYyBDSlNfUmV0dXJuIEFGRGF0ZV9Gb3JtYXRFeCgKKyAgICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgc3RhdGljIENKU19SZXR1cm4gQUZEYXRlX0tleXN0cm9rZUV4KAorICAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBzdGF0aWMgQ0pTX1JldHVybiBBRkRhdGVfRm9ybWF0KAorICAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBzdGF0aWMgQ0pTX1JldHVybiBBRkRhdGVfS2V5c3Ryb2tlKAorICAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBzdGF0aWMgQ0pTX1JldHVybiBBRlRpbWVfRm9ybWF0RXgoCisgICAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIHN0YXRpYyBDSlNfUmV0dXJuIEFGVGltZV9LZXlzdHJva2VFeCgKKyAgICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgc3RhdGljIENKU19SZXR1cm4gQUZUaW1lX0Zvcm1hdCgKKyAgICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgc3RhdGljIENKU19SZXR1cm4gQUZUaW1lX0tleXN0cm9rZSgKKyAgICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgc3RhdGljIENKU19SZXR1cm4gQUZTcGVjaWFsX0Zvcm1hdCgKKyAgICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgc3RhdGljIENKU19SZXR1cm4gQUZTcGVjaWFsX0tleXN0cm9rZSgKKyAgICAgIENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgc3RhdGljIENKU19SZXR1cm4gQUZTcGVjaWFsX0tleXN0cm9rZUV4KAorICAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBzdGF0aWMgQ0pTX1JldHVybiBBRlNpbXBsZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgc3RhdGljIENKU19SZXR1cm4gQUZNYWtlTnVtYmVyKAorICAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBzdGF0aWMgQ0pTX1JldHVybiBBRlNpbXBsZV9DYWxjdWxhdGUoCisgICAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIHN0YXRpYyBDSlNfUmV0dXJuIEFGUmFuZ2VfVmFsaWRhdGUoCisgICAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIHN0YXRpYyBDSlNfUmV0dXJuIEFGTWVyZ2VDaGFuZ2UoCisgICAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIHN0YXRpYyBDSlNfUmV0dXJuIEFGUGFyc2VEYXRlRXgoCisgICAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIHN0YXRpYyBDSlNfUmV0dXJuIEFGRXh0cmFjdE51bXMoCisgICAgICBDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisKKyAgc3RhdGljIHZvaWQgQUZOdW1iZXJfRm9ybWF0X3N0YXRpYygKKyAgICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKTsKKyAgc3RhdGljIHZvaWQgQUZOdW1iZXJfS2V5c3Ryb2tlX3N0YXRpYygKKyAgICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKTsKKyAgc3RhdGljIHZvaWQgQUZQZXJjZW50X0Zvcm1hdF9zdGF0aWMoCisgICAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbyk7CisgIHN0YXRpYyB2b2lkIEFGUGVyY2VudF9LZXlzdHJva2Vfc3RhdGljKAorICAgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pOworICBzdGF0aWMgdm9pZCBBRkRhdGVfRm9ybWF0RXhfc3RhdGljKAorICAgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pOworICBzdGF0aWMgdm9pZCBBRkRhdGVfS2V5c3Ryb2tlRXhfc3RhdGljKAorICAgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pOworICBzdGF0aWMgdm9pZCBBRkRhdGVfRm9ybWF0X3N0YXRpYygKKyAgICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKTsKKyAgc3RhdGljIHZvaWQgQUZEYXRlX0tleXN0cm9rZV9zdGF0aWMoCisgICAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbyk7CisgIHN0YXRpYyB2b2lkIEFGVGltZV9Gb3JtYXRFeF9zdGF0aWMoCisgICAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbyk7CisgIHN0YXRpYyB2b2lkIEFGVGltZV9LZXlzdHJva2VFeF9zdGF0aWMoCisgICAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbyk7CisgIHN0YXRpYyB2b2lkIEFGVGltZV9Gb3JtYXRfc3RhdGljKAorICAgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pOworICBzdGF0aWMgdm9pZCBBRlRpbWVfS2V5c3Ryb2tlX3N0YXRpYygKKyAgICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKTsKKyAgc3RhdGljIHZvaWQgQUZTcGVjaWFsX0Zvcm1hdF9zdGF0aWMoCisgICAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbyk7CisgIHN0YXRpYyB2b2lkIEFGU3BlY2lhbF9LZXlzdHJva2Vfc3RhdGljKAorICAgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pOworICBzdGF0aWMgdm9pZCBBRlNwZWNpYWxfS2V5c3Ryb2tlRXhfc3RhdGljKAorICAgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pOworICBzdGF0aWMgdm9pZCBBRlNpbXBsZV9zdGF0aWMoY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pOworICBzdGF0aWMgdm9pZCBBRk1ha2VOdW1iZXJfc3RhdGljKAorICAgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pOworICBzdGF0aWMgdm9pZCBBRlNpbXBsZV9DYWxjdWxhdGVfc3RhdGljKAorICAgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pOworICBzdGF0aWMgdm9pZCBBRlJhbmdlX1ZhbGlkYXRlX3N0YXRpYygKKyAgICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKTsKKyAgc3RhdGljIHZvaWQgQUZNZXJnZUNoYW5nZV9zdGF0aWMoCisgICAgICBjb25zdCB2ODo6RnVuY3Rpb25DYWxsYmFja0luZm88djg6OlZhbHVlPiYgaW5mbyk7CisgIHN0YXRpYyB2b2lkIEFGUGFyc2VEYXRlRXhfc3RhdGljKAorICAgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8pOworICBzdGF0aWMgdm9pZCBBRkV4dHJhY3ROdW1zX3N0YXRpYygKKyAgICAgIGNvbnN0IHY4OjpGdW5jdGlvbkNhbGxiYWNrSW5mbzx2ODo6VmFsdWU+JiBpbmZvKTsKKworICBzdGF0aWMgY29uc3QgSlNNZXRob2RTcGVjIEdsb2JhbEZ1bmN0aW9uU3BlY3NbXTsKKyAgc3RhdGljIGludCBQYXJzZVN0cmluZ0ludGVnZXIoY29uc3QgV2lkZVN0cmluZyYgc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIHBTa2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgbk1heFN0ZXApOworICBzdGF0aWMgV2lkZVN0cmluZyBQYXJzZVN0cmluZ1N0cmluZyhjb25zdCBXaWRlU3RyaW5nJiBzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogcFNraXApOworICBzdGF0aWMgZG91YmxlIFBhcnNlTm9ybWFsRGF0ZShjb25zdCBXaWRlU3RyaW5nJiB2YWx1ZSwgYm9vbCogYldyb25nRm9ybWF0KTsKKyAgc3RhdGljIGRvdWJsZSBNYWtlSW50ZXJEYXRlKGNvbnN0IFdpZGVTdHJpbmcmIHZhbHVlKTsKKworICBzdGF0aWMgYm9vbCBNYXNrU2F0aXNmaWVkKHdjaGFyX3QgY19DaGFuZ2UsIHdjaGFyX3QgY19NYXNrKTsKKyAgc3RhdGljIGJvb2wgSXNSZXNlcnZlZE1hc2tDaGFyKHdjaGFyX3QgY2gpOworCisgIHN0YXRpYyBkb3VibGUgQUZfU2ltcGxlKGNvbnN0IHdjaGFyX3QqIHNGdWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZFZhbHVlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRWYWx1ZTIpOworICBzdGF0aWMgdjg6OkxvY2FsPHY4OjpBcnJheT4gQUZfTWFrZUFycmF5RnJvbUxpc3QoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19DSlNfUFVCTElDTUVUSE9EU19IXwpkaWZmIC0tZ2l0IGEvZnhqcy9janNfcHVibGljbWV0aG9kc19lbWJlZGRlcnRlc3QuY3BwIGIvZnhqcy9janNfcHVibGljbWV0aG9kc19lbWJlZGRlcnRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYWIwODEKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc19wdWJsaWNtZXRob2RzX2VtYmVkZGVydGVzdC5jcHAKQEAgLTAsMCArMSwxNjIgQEAKKy8vIENvcHlyaWdodCAyMDE1IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgPGNtYXRoPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19wdWJsaWNtZXRob2RzLmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy9qc19lbWJlZGRlcl90ZXN0LmgiCisKK25hbWVzcGFjZSB7CisKK2RvdWJsZSBSb3VuZERvd25EYXRlKGRvdWJsZSBkYXRlKSB7CisgIHJldHVybiBkYXRlIC0gZm1vZChkYXRlLCA4NjQwMDAwMCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBDSlNfUHVibGljTWV0aG9kc0VtYmVkZGVyVGVzdCA6IHB1YmxpYyBKU0VtYmVkZGVyVGVzdCB7fTsKKworVEVTVF9GKENKU19QdWJsaWNNZXRob2RzRW1iZWRkZXJUZXN0LCBNYWtlUmVndWxhckRhdGUpIHsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSgpKTsKKyAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKCkpOworICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZShHZXRWOENvbnRleHQoKSk7CisgIGJvb2wgYldyb25nRm9ybWF0OworICBkb3VibGUgZGF0ZTsKKworICAvLyAxOTY4CisgIGJXcm9uZ0Zvcm1hdCA9IGZhbHNlOworICBkYXRlID0gQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VSZWd1bGFyRGF0ZShMIjA2LzI1LzE5NjgiLCBMIm1tL2RkL3l5eXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYldyb25nRm9ybWF0KTsKKyAgZGF0ZSA9IFJvdW5kRG93bkRhdGUoZGF0ZSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoLTQ3ODY1NjAwMDAwLCBkYXRlKTsKKyAgRVhQRUNUX0ZBTFNFKGJXcm9uZ0Zvcm1hdCk7CisKKyAgLy8gMTk2OAorICBiV3JvbmdGb3JtYXQgPSBmYWxzZTsKKyAgZGF0ZSA9IENKU19QdWJsaWNNZXRob2RzOjpNYWtlUmVndWxhckRhdGUoTCIyNTA2MTk2OCIsIEwiZGRtbXl5eXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYldyb25nRm9ybWF0KTsKKyAgZGF0ZSA9IFJvdW5kRG93bkRhdGUoZGF0ZSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoLTQ3ODY1NjAwMDAwLCBkYXRlKTsKKyAgRVhQRUNUX0ZBTFNFKGJXcm9uZ0Zvcm1hdCk7CisKKyAgLy8gMTk2OAorICBiV3JvbmdGb3JtYXQgPSBmYWxzZTsKKyAgZGF0ZSA9IENKU19QdWJsaWNNZXRob2RzOjpNYWtlUmVndWxhckRhdGUoTCIxOTY4MDYyNSIsIEwieXl5eW1tZGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYldyb25nRm9ybWF0KTsKKyAgZGF0ZSA9IFJvdW5kRG93bkRhdGUoZGF0ZSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoLTQ3ODY1NjAwMDAwLCBkYXRlKTsKKyAgRVhQRUNUX0ZBTFNFKGJXcm9uZ0Zvcm1hdCk7CisKKyAgLy8gMTk4NQorICBiV3JvbmdGb3JtYXQgPSBmYWxzZTsKKyAgZGF0ZSA9IENKU19QdWJsaWNNZXRob2RzOjpNYWtlUmVndWxhckRhdGUoTCIzMTEyMTk4NSIsIEwiZGRtbXl5eXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYldyb25nRm9ybWF0KTsKKyAgZGF0ZSA9IFJvdW5kRG93bkRhdGUoZGF0ZSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoNTA0ODM1MjAwMDAwLjAsIGRhdGUpOworICBFWFBFQ1RfRkFMU0UoYldyb25nRm9ybWF0KTsKKworICAvLyAyMDg1LCB0aGUgb3RoZXIgJzg1LgorICBiV3JvbmdGb3JtYXQgPSBmYWxzZTsKKyAgZGF0ZSA9CisgICAgICBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKEwiMzExMjg1IiwgTCJkZG1teXkiLCAmYldyb25nRm9ybWF0KTsKKyAgZGF0ZSA9IFJvdW5kRG93bkRhdGUoZGF0ZSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMzY2MDU5NTIwMDAwMC4wLCBkYXRlKTsKKyAgRVhQRUNUX0ZBTFNFKGJXcm9uZ0Zvcm1hdCk7CisKKyAgLy8gMTk5NQorICBiV3JvbmdGb3JtYXQgPSBmYWxzZTsKKyAgZGF0ZSA9IENKU19QdWJsaWNNZXRob2RzOjpNYWtlUmVndWxhckRhdGUoTCIwMTAyMTk5NSIsIEwiZGRtbXl5eXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYldyb25nRm9ybWF0KTsKKyAgZGF0ZSA9IFJvdW5kRG93bkRhdGUoZGF0ZSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoNzkxNTk2ODAwMDAwLjAsIGRhdGUpOworICBFWFBFQ1RfRkFMU0UoYldyb25nRm9ybWF0KTsKKworICAvLyAyMDk1LCB0aGUgb3RoZXIgJzk1LgorICBiV3JvbmdGb3JtYXQgPSBmYWxzZTsKKyAgZGF0ZSA9CisgICAgICBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKEwiMDEwMjk1IiwgTCJkZG1teXkiLCAmYldyb25nRm9ybWF0KTsKKyAgZGF0ZSA9IFJvdW5kRG93bkRhdGUoZGF0ZSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMzk0NzM1NjgwMDAwMC4wLCBkYXRlKTsKKyAgRVhQRUNUX0ZBTFNFKGJXcm9uZ0Zvcm1hdCk7CisKKyAgLy8gMjAwNQorICBiV3JvbmdGb3JtYXQgPSBmYWxzZTsKKyAgZGF0ZSA9IENKU19QdWJsaWNNZXRob2RzOjpNYWtlUmVndWxhckRhdGUoTCIwMTAyMjAwNSIsIEwiZGRtbXl5eXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYldyb25nRm9ybWF0KTsKKyAgZGF0ZSA9IFJvdW5kRG93bkRhdGUoZGF0ZSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMTEwNzIxNjAwMDAwMC4wLCBkYXRlKTsKKyAgRVhQRUNUX0ZBTFNFKGJXcm9uZ0Zvcm1hdCk7CisKKyAgLy8gMjAwNQorICBiV3JvbmdGb3JtYXQgPSBmYWxzZTsKKyAgZGF0ZSA9CisgICAgICBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKEwiMDEwMjA1IiwgTCJkZG1teXkiLCAmYldyb25nRm9ybWF0KTsKKyAgZGF0ZSA9IFJvdW5kRG93bkRhdGUoZGF0ZSk7CisgIEVYUEVDVF9ET1VCTEVfRVEoMTEwNzIxNjAwMDAwMC4wLCBkYXRlKTsKKyAgRVhQRUNUX0ZBTFNFKGJXcm9uZ0Zvcm1hdCk7Cit9CisKK1RFU1RfRihDSlNfUHVibGljTWV0aG9kc0VtYmVkZGVyVGVzdCwgTWFrZUZvcm1hdERhdGUpIHsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoaXNvbGF0ZSgpKTsKKyAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShpc29sYXRlKCkpOworICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZShHZXRWOENvbnRleHQoKSk7CisgIFdpZGVTdHJpbmcgZm9ybWF0dGVkX2RhdGU7CisKKyAgLy8gMTk2OC0wNi0yNQorICBmb3JtYXR0ZWRfZGF0ZSA9IENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZSgtNDc5NTIwMDAwMDAsIEwiZGRtbXl5Iik7CisgIEVYUEVDVF9TVFJFUShMIjI1MDY2OCIsIGZvcm1hdHRlZF9kYXRlLmNfc3RyKCkpOworICBmb3JtYXR0ZWRfZGF0ZSA9IENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZSgtNDc5NTIwMDAwMDAsIEwieXkvbW0vZGQiKTsKKyAgRVhQRUNUX1NUUkVRKEwiNjgvMDYvMjUiLCBmb3JtYXR0ZWRfZGF0ZS5jX3N0cigpKTsKKworICAvLyAxOTY5LTEyLTMxCisgIGZvcm1hdHRlZF9kYXRlID0gQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VGb3JtYXREYXRlKC0wLjAwMDEsIEwiZGRtbXl5Iik7CisgIEVYUEVDVF9TVFJFUShMIjMxMTI2OSIsIGZvcm1hdHRlZF9kYXRlLmNfc3RyKCkpOworICBmb3JtYXR0ZWRfZGF0ZSA9IENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZSgtMC4wMDAxLCBMInl5IW1tZGQiKTsKKyAgRVhQRUNUX1NUUkVRKEwiNjkhMTIzMSIsIGZvcm1hdHRlZF9kYXRlLmNfc3RyKCkpOworCisgIC8vIDE5NzAtMDEtMDEKKyAgZm9ybWF0dGVkX2RhdGUgPSBDSlNfUHVibGljTWV0aG9kczo6TWFrZUZvcm1hdERhdGUoMCwgTCJkZG1teXkiKTsKKyAgRVhQRUNUX1NUUkVRKEwiMDEwMTcwIiwgZm9ybWF0dGVkX2RhdGUuY19zdHIoKSk7CisgIGZvcm1hdHRlZF9kYXRlID0gQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VGb3JtYXREYXRlKDAsIEwibW0teXl5eS1kZCIpOworICBFWFBFQ1RfU1RSRVEoTCIwMS0xOTcwLTAxIiwgZm9ybWF0dGVkX2RhdGUuY19zdHIoKSk7CisKKyAgLy8gMTk4NS0xMi0zMQorICBmb3JtYXR0ZWRfZGF0ZSA9IENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZSg1MDQ4MzUyMDAwMDAuMCwgTCJkZG1teXkiKTsKKyAgRVhQRUNUX1NUUkVRKEwiMzExMjg1IiwgZm9ybWF0dGVkX2RhdGUuY19zdHIoKSk7CisgIGZvcm1hdHRlZF9kYXRlID0gQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VGb3JtYXREYXRlKDUwNDgzNTIwMDAwMC4wLCBMInl5bW1kZCIpOworICBFWFBFQ1RfU1RSRVEoTCI4NTEyMzEiLCBmb3JtYXR0ZWRfZGF0ZS5jX3N0cigpKTsKKworICAvLyAxOTk1LTAyLTAxCisgIGZvcm1hdHRlZF9kYXRlID0gQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VGb3JtYXREYXRlKDc5MTU5NjgwMDAwMC4wLCBMImRkbW15eSIpOworICBFWFBFQ1RfU1RSRVEoTCIwMTAyOTUiLCBmb3JtYXR0ZWRfZGF0ZS5jX3N0cigpKTsKKyAgZm9ybWF0dGVkX2RhdGUgPQorICAgICAgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VGb3JtYXREYXRlKDc5MTU5NjgwMDAwMC4wLCBMInl5eXltbWRkIik7CisgIEVYUEVDVF9TVFJFUShMIjE5OTUwMjAxIiwgZm9ybWF0dGVkX2RhdGUuY19zdHIoKSk7CisKKyAgLy8gMjAwNS0wMi0wMQorICBmb3JtYXR0ZWRfZGF0ZSA9CisgICAgICBDSlNfUHVibGljTWV0aG9kczo6TWFrZUZvcm1hdERhdGUoMTEwNzIxNjAwMDAwMC4wLCBMImRkbW15eSIpOworICBFWFBFQ1RfU1RSRVEoTCIwMTAyMDUiLCBmb3JtYXR0ZWRfZGF0ZS5jX3N0cigpKTsKKyAgZm9ybWF0dGVkX2RhdGUgPQorICAgICAgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VGb3JtYXREYXRlKDExMDcyMTYwMDAwMDAuMCwgTCJ5eXl5ZGRtbSIpOworICBFWFBFQ1RfU1RSRVEoTCIyMDA1MDEwMiIsIGZvcm1hdHRlZF9kYXRlLmNfc3RyKCkpOworCisgIC8vIDIwODUtMTItMzEKKyAgZm9ybWF0dGVkX2RhdGUgPQorICAgICAgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VGb3JtYXREYXRlKDM2NjA1OTUyMDAwMDAuMCwgTCJkZG1teXkiKTsKKyAgRVhQRUNUX1NUUkVRKEwiMzExMjg1IiwgZm9ybWF0dGVkX2RhdGUuY19zdHIoKSk7CisgIGZvcm1hdHRlZF9kYXRlID0KKyAgICAgIENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZSgzNjYwNTk1MjAwMDAwLjAsIEwieXl5eWRkIik7CisgIEVYUEVDVF9TVFJFUShMIjIwODUzMSIsIGZvcm1hdHRlZF9kYXRlLmNfc3RyKCkpOworCisgIC8vIDIwOTUtMDItMDEKKyAgZm9ybWF0dGVkX2RhdGUgPQorICAgICAgQ0pTX1B1YmxpY01ldGhvZHM6Ok1ha2VGb3JtYXREYXRlKDM5NDczNTY4MDAwMDAuMCwgTCJkZG1teXkiKTsKKyAgRVhQRUNUX1NUUkVRKEwiMDEwMjk1IiwgZm9ybWF0dGVkX2RhdGUuY19zdHIoKSk7CisgIGZvcm1hdHRlZF9kYXRlID0KKyAgICAgIENKU19QdWJsaWNNZXRob2RzOjpNYWtlRm9ybWF0RGF0ZSgzOTQ3MzU2ODAwMDAwLjAsIEwibW1kZHl5eXkiKTsKKyAgRVhQRUNUX1NUUkVRKEwiMDIwMTIwOTUiLCBmb3JtYXR0ZWRfZGF0ZS5jX3N0cigpKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX3B1YmxpY21ldGhvZHNfdW5pdHRlc3QuY3BwIGIvZnhqcy9janNfcHVibGljbWV0aG9kc191bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdiZjkzYgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2pzX3B1YmxpY21ldGhvZHNfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNTEgQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImZ4anMvY2pzX3B1YmxpY21ldGhvZHMuaCIKKworI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInRlc3RpbmcvdGVzdF9zdXBwb3J0LmgiCisKK1RFU1QoQ0pTX1B1YmxpY01ldGhvZHMsIElzTnVtYmVyKSB7CisgIC8vIFRPRE8od2VpbGkpOiBDaGVjayB3aGV0aGVyIHJlc3VsdHMgZnJvbSBjYXNlIDAsIDEsIDEwLCAxNSBhcmUgaW50ZW5kZWQuCisgIHN0cnVjdCB7CisgICAgY29uc3Qgd2NoYXJfdCogaW5wdXQ7CisgICAgYm9vbCBleHBlY3RlZDsKKyAgfSB0ZXN0X2RhdGFbXSA9IHsKKyAgICAgIC8vIEVtcHR5IHN0cmluZy4KKyAgICAgIHtMIiIsIHRydWV9LAorICAgICAgLy8gT25seSB3aGl0ZXNwYWNlcy4KKyAgICAgIHtMIiAgIiwgdHJ1ZX0sCisgICAgICAvLyBDb250ZW50IHdpdGggaW52YWxpZCBjaGFyYWN0ZXJzLgorICAgICAge0wieHl6MDAiLCBmYWxzZX0sCisgICAgICB7TCIxJSIsIGZhbHNlfSwKKyAgICAgIC8vIEhleCBzdHJpbmcuCisgICAgICB7TCIweDIzNCIsIGZhbHNlfSwKKyAgICAgIC8vIFNpZ25lZCBudW1iZXJzLgorICAgICAge0wiKzEyMyIsIHRydWV9LAorICAgICAge0wiLTk4NzY1IiwgdHJ1ZX0sCisgICAgICAvLyBOdW1iZXJzIHdpdGggd2hpdGVzcGFjZXMuCisgICAgICB7TCIgIDM0NSAiLCB0cnVlfSwKKyAgICAgIC8vIEZsb2F0IG51bWJlcnMuCisgICAgICB7TCItMWU1IiwgZmFsc2V9LAorICAgICAge0wiLTJlIiwgZmFsc2V9LAorICAgICAge0wiZS01IiwgdHJ1ZX0sCisgICAgICB7TCIwLjAyMyIsIHRydWV9LAorICAgICAge0wiLjM1NjA4OSIsIHRydWV9LAorICAgICAge0wiMWUtOSIsIHRydWV9LAorICAgICAge0wiLTEuMjNlKzIzIiwgdHJ1ZX0sCisgICAgICAvLyBOdW1iZXJzIHdpdGggY29tbWFzLgorICAgICAge0wiMSwwMDAsMDAwIiwgZmFsc2V9LAorICAgICAge0wiNTYwLDAyNCIsIHRydWV9LAorICAgICAgLy8gUmVndWxhciBudW1iZXJzLgorICAgICAge0wiMCIsIHRydWV9LAorICAgICAge0wiMDEyMyIsIHRydWV9LAorICAgICAge0wiOTg3NjEyMyIsIHRydWV9LAorICB9OworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0X2RhdGEpOyArK2kpIHsKKyAgICBFWFBFQ1RfRVEodGVzdF9kYXRhW2ldLmV4cGVjdGVkLAorICAgICAgICAgICAgICBDSlNfUHVibGljTWV0aG9kczo6SXNOdW1iZXIodGVzdF9kYXRhW2ldLmlucHV0KSkKKyAgICAgICAgPDwgImZvciBjYXNlICIgPDwgaTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZnhqcy9janNfcmVwb3J0LmNwcCBiL2Z4anMvY2pzX3JlcG9ydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc4OGE5MAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2pzX3JlcG9ydC5jcHAKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy9janNfcmVwb3J0LmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmeGpzL0pTX0RlZmluZS5oIgorI2luY2x1ZGUgImZ4anMvY2pzX29iamVjdC5oIgorCitjb25zdCBKU01ldGhvZFNwZWMgQ0pTX1JlcG9ydDo6TWV0aG9kU3BlY3NbXSA9IHsKKyAgICB7InNhdmUiLCBzYXZlX3N0YXRpY30sCisgICAgeyJ3cml0ZVRleHQiLCB3cml0ZVRleHRfc3RhdGljfX07CisKK2ludCBDSlNfUmVwb3J0OjpPYmpEZWZuSUQgPSAtMTsKKworLy8gc3RhdGljCit2b2lkIENKU19SZXBvcnQ6OkRlZmluZUpTT2JqZWN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUsIEZYSlNPQkpUWVBFIGVPYmpUeXBlKSB7CisgIE9iakRlZm5JRCA9CisgICAgICBwRW5naW5lLT5EZWZpbmVPYmooIlJlcG9ydCIsIGVPYmpUeXBlLCBKU0NvbnN0cnVjdG9yPENKU19SZXBvcnQsIFJlcG9ydD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgSlNEZXN0cnVjdG9yPENKU19SZXBvcnQ+KTsKKyAgRGVmaW5lTWV0aG9kcyhwRW5naW5lLCBPYmpEZWZuSUQsIE1ldGhvZFNwZWNzLCBGWF9BcnJheVNpemUoTWV0aG9kU3BlY3MpKTsKK30KKworUmVwb3J0OjpSZXBvcnQoQ0pTX09iamVjdCogcEpTT2JqZWN0KSA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpIHt9CisKK1JlcG9ydDo6flJlcG9ydCgpIHt9CisKK0NKU19SZXR1cm4gUmVwb3J0Ojp3cml0ZVRleHQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIFJlcG9ydDo6c2F2ZShDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICAvLyBVbnNhZmUsIG5vdCBzdXBwb3J0ZWQuCisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy9janNfcmVwb3J0LmggYi9meGpzL2Nqc19yZXBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDI1OWVmCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfcmVwb3J0LmgKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfQ0pTX1JFUE9SVF9IXworI2RlZmluZSBGWEpTX0NKU19SRVBPUlRfSF8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImZ4anMvSlNfRGVmaW5lLmgiCisKK2NsYXNzIFJlcG9ydCA6IHB1YmxpYyBDSlNfRW1iZWRPYmogeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUmVwb3J0KENKU19PYmplY3QqIHBKU09iamVjdCk7CisgIH5SZXBvcnQoKSBvdmVycmlkZTsKKworIHB1YmxpYzoKKyAgQ0pTX1JldHVybiBzYXZlKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiB3cml0ZVRleHQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7Cit9OworCitjbGFzcyBDSlNfUmVwb3J0IDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgRGVmaW5lSlNPYmplY3RzKENGWEpTX0VuZ2luZSogcEVuZ2luZSwgRlhKU09CSlRZUEUgZU9ialR5cGUpOworCisgIGV4cGxpY2l0IENKU19SZXBvcnQodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQorICB+Q0pTX1JlcG9ydCgpIG92ZXJyaWRlIHt9CisKKyAgSlNfU1RBVElDX01FVEhPRChzYXZlLCBSZXBvcnQpCisgIEpTX1NUQVRJQ19NRVRIT0Qod3JpdGVUZXh0LCBSZXBvcnQpOworCisgcHJpdmF0ZToKKyAgc3RhdGljIGludCBPYmpEZWZuSUQ7CisgIHN0YXRpYyBjb25zdCBKU01ldGhvZFNwZWMgTWV0aG9kU3BlY3NbXTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19DSlNfUkVQT1JUX0hfCmRpZmYgLS1naXQgYS9meGpzL2Nqc19yZXR1cm4uY3BwIGIvZnhqcy9janNfcmV0dXJuLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGZkMWM1Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfcmV0dXJuLmNwcApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL2Nqc19yZXR1cm4uaCIKKworQ0pTX1JldHVybjo6Q0pTX1JldHVybihib29sIHJlc3VsdCkgOiBpc19lcnJvcl8oIXJlc3VsdCkge30KKworQ0pTX1JldHVybjo6Q0pTX1JldHVybihjb25zdCBXaWRlU3RyaW5nJiBlcnIpIDogaXNfZXJyb3JfKHRydWUpLCBlcnJvcl8oZXJyKSB7fQorCitDSlNfUmV0dXJuOjpDSlNfUmV0dXJuKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJldCkKKyAgICA6IGlzX2Vycm9yXyhmYWxzZSksIHJldHVybl8ocmV0KSB7fQorCitDSlNfUmV0dXJuOjpDSlNfUmV0dXJuKGNvbnN0IENKU19SZXR1cm4mKSA9IGRlZmF1bHQ7CisKK0NKU19SZXR1cm46On5DSlNfUmV0dXJuKCkgPSBkZWZhdWx0OwpkaWZmIC0tZ2l0IGEvZnhqcy9janNfcmV0dXJuLmggYi9meGpzL2Nqc19yZXR1cm4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWM1Nzc4Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfcmV0dXJuLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfQ0pTX1JFVFVSTl9IXworI2RlZmluZSBGWEpTX0NKU19SRVRVUk5fSF8KKworI2luY2x1ZGUgImZ4anMvZnhqc192OC5oIgorCitjbGFzcyBDSlNfUmV0dXJuIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKU19SZXR1cm4oYm9vbCk7CisgIGV4cGxpY2l0IENKU19SZXR1cm4oY29uc3QgV2lkZVN0cmluZyYpOworICBleHBsaWNpdCBDSlNfUmV0dXJuKHY4OjpMb2NhbDx2ODo6VmFsdWU+KTsKKyAgQ0pTX1JldHVybihjb25zdCBDSlNfUmV0dXJuJik7CisgIH5DSlNfUmV0dXJuKCk7CisKKyAgYm9vbCBIYXNFcnJvcigpIGNvbnN0IHsgcmV0dXJuIGlzX2Vycm9yXzsgfQorICBXaWRlU3RyaW5nIEVycm9yKCkgY29uc3QgeyByZXR1cm4gZXJyb3JfOyB9CisKKyAgYm9vbCBIYXNSZXR1cm4oKSBjb25zdCB7IHJldHVybiAhcmV0dXJuXy5Jc0VtcHR5KCk7IH0KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gUmV0dXJuKCkgY29uc3QgeyByZXR1cm4gcmV0dXJuXzsgfQorCisgcHJpdmF0ZToKKyAgQ0pTX1JldHVybigpID0gZGVsZXRlOworCisgIGJvb2wgaXNfZXJyb3JfID0gZmFsc2U7CisgIFdpZGVTdHJpbmcgZXJyb3JfOworICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXR1cm5fOworfTsKKworI2VuZGlmICAvLyBGWEpTX0NKU19SRVRVUk5fSF8KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX3J1bnRpbWUuY3BwIGIvZnhqcy9janNfcnVudGltZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlOTVlMQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2pzX3J1bnRpbWUuY3BwCkBAIC0wLDAgKzEsMjkyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL2Nqc19ydW50aW1lLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfZm9ybWZpbGxlbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImZ4anMvSlNfRGVmaW5lLmgiCisjaW5jbHVkZSAiZnhqcy9janNfYW5ub3QuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19hcHAuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19ib3JkZXIuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19jb2xvci5oIgorI2luY2x1ZGUgImZ4anMvY2pzX2NvbnNvbGUuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19kaXNwbGF5LmgiCisjaW5jbHVkZSAiZnhqcy9janNfZG9jdW1lbnQuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19ldmVudC5oIgorI2luY2x1ZGUgImZ4anMvY2pzX2V2ZW50X2NvbnRleHQuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19ldmVudGhhbmRsZXIuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19maWVsZC5oIgorI2luY2x1ZGUgImZ4anMvY2pzX2ZvbnQuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19nbG9iYWwuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19nbG9iYWxhcnJheXMuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19nbG9iYWxjb25zdHMuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19nbG9iYWxkYXRhLmgiCisjaW5jbHVkZSAiZnhqcy9janNfaGlnaGxpZ2h0LmgiCisjaW5jbHVkZSAiZnhqcy9janNfaWNvbi5oIgorI2luY2x1ZGUgImZ4anMvY2pzX29iamVjdC5oIgorI2luY2x1ZGUgImZ4anMvY2pzX3Bvc2l0aW9uLmgiCisjaW5jbHVkZSAiZnhqcy9janNfcHJpbnRwYXJhbXNvYmouaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19wdWJsaWNtZXRob2RzLmgiCisjaW5jbHVkZSAiZnhqcy9janNfcmVwb3J0LmgiCisjaW5jbHVkZSAiZnhqcy9janNfc2NhbGVob3cuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19zY2FsZXdoZW4uaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19zdHlsZS5oIgorI2luY2x1ZGUgImZ4anMvY2pzX3RpbWVyb2JqLmgiCisjaW5jbHVkZSAiZnhqcy9janNfdXRpbC5oIgorI2luY2x1ZGUgImZ4anMvY2pzX3pvb210eXBlLmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfZm9ybWZpbGwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorI2luY2x1ZGUgImZ4anMvY2Z4anNlX3ZhbHVlLmgiCisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKKy8vIHN0YXRpYwordm9pZCBJSlNfUnVudGltZTo6SW5pdGlhbGl6ZSh1bnNpZ25lZCBpbnQgc2xvdCwgdm9pZCogaXNvbGF0ZSkgeworICBGWEpTX0luaXRpYWxpemUoc2xvdCwgcmVpbnRlcnByZXRfY2FzdDx2ODo6SXNvbGF0ZSo+KGlzb2xhdGUpKTsKK30KKworLy8gc3RhdGljCit2b2lkIElKU19SdW50aW1lOjpEZXN0cm95KCkgeworICBGWEpTX1JlbGVhc2UoKTsKK30KKworLy8gc3RhdGljCitJSlNfUnVudGltZSogSUpTX1J1bnRpbWU6OkNyZWF0ZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgeworICByZXR1cm4gbmV3IENKU19SdW50aW1lKHBGb3JtRmlsbEVudik7Cit9CisKKy8vIHN0YXRpYworQ0pTX1J1bnRpbWUqIENKU19SdW50aW1lOjpDdXJyZW50UnVudGltZUZyb21Jc29sYXRlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0pTX1J1bnRpbWUqPigKKyAgICAgIENGWEpTX0VuZ2luZTo6Q3VycmVudEVuZ2luZUZyb21Jc29sYXRlKHBJc29sYXRlKSk7Cit9CisKK0NKU19SdW50aW1lOjpDSlNfUnVudGltZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikKKyAgICA6IG1fcEZvcm1GaWxsRW52KHBGb3JtRmlsbEVudiksCisgICAgICBtX2JCbG9ja2luZyhmYWxzZSksCisgICAgICBtX2lzb2xhdGVNYW5hZ2VkKGZhbHNlKSB7CisgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IG51bGxwdHI7CisKKyAgSVBERl9KU1BMQVRGT1JNKiBwUGxhdGZvcm0gPSBtX3BGb3JtRmlsbEVudi0+R2V0Rm9ybUZpbGxJbmZvKCktPm1fcEpzUGxhdGZvcm07CisgIGlmIChwUGxhdGZvcm0tPnZlcnNpb24gPD0gMikgeworICAgIHVuc2lnbmVkIGludCBlbWJlZGRlckRhdGFTbG90ID0gMDsKKyAgICB2ODo6SXNvbGF0ZSogcEV4dGVybmFsSXNvbGF0ZSA9IG51bGxwdHI7CisgICAgaWYgKHBQbGF0Zm9ybS0+dmVyc2lvbiA9PSAyKSB7CisgICAgICBwRXh0ZXJuYWxJc29sYXRlID0gcmVpbnRlcnByZXRfY2FzdDx2ODo6SXNvbGF0ZSo+KHBQbGF0Zm9ybS0+bV9pc29sYXRlKTsKKyAgICAgIGVtYmVkZGVyRGF0YVNsb3QgPSBwUGxhdGZvcm0tPm1fdjhFbWJlZGRlclNsb3Q7CisgICAgfQorICAgIEZYSlNfSW5pdGlhbGl6ZShlbWJlZGRlckRhdGFTbG90LCBwRXh0ZXJuYWxJc29sYXRlKTsKKyAgfQorICBtX2lzb2xhdGVNYW5hZ2VkID0gRlhKU19HZXRJc29sYXRlKCZwSXNvbGF0ZSk7CisgIFNldElzb2xhdGUocElzb2xhdGUpOworCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUocElzb2xhdGUpOworICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKHBJc29sYXRlKTsKKyNlbmRpZgorCisgIGlmIChtX2lzb2xhdGVNYW5hZ2VkIHx8IEZYSlNfR2xvYmFsSXNvbGF0ZVJlZkNvdW50KCkgPT0gMCkKKyAgICBEZWZpbmVKU09iamVjdHMoKTsKKworICBJSlNfRXZlbnRDb250ZXh0KiBwQ29udGV4dCA9IE5ld0V2ZW50Q29udGV4dCgpOworICBJbml0aWFsaXplRW5naW5lKCk7CisgIFJlbGVhc2VFdmVudENvbnRleHQocENvbnRleHQpOworICBTZXRGb3JtRmlsbEVudlRvRG9jdW1lbnQoKTsKK30KKworQ0pTX1J1bnRpbWU6On5DSlNfUnVudGltZSgpIHsKKyAgTm90aWZ5T2JzZXJ2ZWRQdHJzKCk7CisgIFJlbGVhc2VFbmdpbmUoKTsKKyAgaWYgKG1faXNvbGF0ZU1hbmFnZWQpIHsKKyAgICBHZXRJc29sYXRlKCktPkRpc3Bvc2UoKTsKKyAgICBTZXRJc29sYXRlKG51bGxwdHIpOworICB9Cit9CisKK3ZvaWQgQ0pTX1J1bnRpbWU6OkRlZmluZUpTT2JqZWN0cygpIHsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoR2V0SXNvbGF0ZSgpKTsKKyAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShHZXRJc29sYXRlKCkpOworICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB2ODo6Q29udGV4dDo6TmV3KEdldElzb2xhdGUoKSk7CisgIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKGNvbnRleHQpOworCisgIC8vIFRoZSBjYWxsIG9yZGVyIGRldGVybWluZXMgdGhlICJPYmpEZWZJRCIgYXNzaWduZWQgdG8gZWFjaCBjbGFzcy4KKyAgLy8gT2JqRGVmSURzIDAgLSAyCisgIENKU19Cb3JkZXI6OkRlZmluZUpTT2JqZWN0cyh0aGlzKTsKKyAgQ0pTX0Rpc3BsYXk6OkRlZmluZUpTT2JqZWN0cyh0aGlzKTsKKyAgQ0pTX0ZvbnQ6OkRlZmluZUpTT2JqZWN0cyh0aGlzKTsKKworICAvLyBPYmpEZWZJRHMgMyAtIDUKKyAgQ0pTX0hpZ2hsaWdodDo6RGVmaW5lSlNPYmplY3RzKHRoaXMpOworICBDSlNfUG9zaXRpb246OkRlZmluZUpTT2JqZWN0cyh0aGlzKTsKKyAgQ0pTX1NjYWxlSG93OjpEZWZpbmVKU09iamVjdHModGhpcyk7CisKKyAgLy8gT2JqRGVmSURzIDYgLSA4CisgIENKU19TY2FsZVdoZW46OkRlZmluZUpTT2JqZWN0cyh0aGlzKTsKKyAgQ0pTX1N0eWxlOjpEZWZpbmVKU09iamVjdHModGhpcyk7CisgIENKU19ab29tdHlwZTo6RGVmaW5lSlNPYmplY3RzKHRoaXMpOworCisgIC8vIE9iakRlZklEcyA5IC0gMTEKKyAgQ0pTX0FwcDo6RGVmaW5lSlNPYmplY3RzKHRoaXMpOworICBDSlNfQ29sb3I6OkRlZmluZUpTT2JqZWN0cyh0aGlzKTsKKyAgQ0pTX0NvbnNvbGU6OkRlZmluZUpTT2JqZWN0cyh0aGlzKTsKKworICAvLyBPYmpEZWZJRHMgMTIgLSAxNAorICBDSlNfRG9jdW1lbnQ6OkRlZmluZUpTT2JqZWN0cyh0aGlzKTsKKyAgQ0pTX0V2ZW50OjpEZWZpbmVKU09iamVjdHModGhpcyk7CisgIENKU19GaWVsZDo6RGVmaW5lSlNPYmplY3RzKHRoaXMpOworCisgIC8vIE9iakRlZklEcyAxNSAtIDE3CisgIENKU19HbG9iYWw6OkRlZmluZUpTT2JqZWN0cyh0aGlzKTsKKyAgQ0pTX0ljb246OkRlZmluZUpTT2JqZWN0cyh0aGlzKTsKKyAgQ0pTX1V0aWw6OkRlZmluZUpTT2JqZWN0cyh0aGlzKTsKKworICAvLyBPYmpEZWZJRHMgMTggLSAyMCAodGhlc2UgY2FuJ3QgZmFpbCwgcmV0dXJuIHZvaWQpLgorICBDSlNfUHVibGljTWV0aG9kczo6RGVmaW5lSlNPYmplY3RzKHRoaXMpOworICBDSlNfR2xvYmFsQ29uc3RzOjpEZWZpbmVKU09iamVjdHModGhpcyk7CisgIENKU19HbG9iYWxBcnJheXM6OkRlZmluZUpTT2JqZWN0cyh0aGlzKTsKKworICAvLyBPYmpEZWZJRHMgMjEgLSAyMy4KKyAgQ0pTX1RpbWVyT2JqOjpEZWZpbmVKU09iamVjdHModGhpcyk7CisgIENKU19QcmludFBhcmFtc09iajo6RGVmaW5lSlNPYmplY3RzKHRoaXMpOworICBDSlNfQW5ub3Q6OkRlZmluZUpTT2JqZWN0cyh0aGlzKTsKK30KKworSUpTX0V2ZW50Q29udGV4dCogQ0pTX1J1bnRpbWU6Ok5ld0V2ZW50Q29udGV4dCgpIHsKKyAgbV9FdmVudENvbnRleHRBcnJheS5wdXNoX2JhY2socGRmaXVtOjpNYWtlVW5pcXVlPENKU19FdmVudENvbnRleHQ+KHRoaXMpKTsKKyAgcmV0dXJuIG1fRXZlbnRDb250ZXh0QXJyYXkuYmFjaygpLmdldCgpOworfQorCit2b2lkIENKU19SdW50aW1lOjpSZWxlYXNlRXZlbnRDb250ZXh0KElKU19FdmVudENvbnRleHQqIHBDb250ZXh0KSB7CisgIGF1dG8gaXQgPSBzdGQ6OmZpbmQobV9FdmVudENvbnRleHRBcnJheS5iZWdpbigpLCBtX0V2ZW50Q29udGV4dEFycmF5LmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgIHBkZml1bTo6RmFrZVVuaXF1ZVB0cjxDSlNfRXZlbnRDb250ZXh0PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q0pTX0V2ZW50Q29udGV4dCo+KHBDb250ZXh0KSkpOworICBpZiAoaXQgIT0gbV9FdmVudENvbnRleHRBcnJheS5lbmQoKSkKKyAgICBtX0V2ZW50Q29udGV4dEFycmF5LmVyYXNlKGl0KTsKK30KKworQ0pTX0V2ZW50Q29udGV4dCogQ0pTX1J1bnRpbWU6OkdldEN1cnJlbnRFdmVudENvbnRleHQoKSBjb25zdCB7CisgIHJldHVybiBtX0V2ZW50Q29udGV4dEFycmF5LmVtcHR5KCkgPyBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtX0V2ZW50Q29udGV4dEFycmF5LmJhY2soKS5nZXQoKTsKK30KKwordm9pZCBDSlNfUnVudGltZTo6U2V0Rm9ybUZpbGxFbnZUb0RvY3VtZW50KCkgeworICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShHZXRJc29sYXRlKCkpOworICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKEdldElzb2xhdGUoKSk7CisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IE5ld0xvY2FsQ29udGV4dCgpOworICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZShjb250ZXh0KTsKKworICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcFRoaXMgPSBHZXRUaGlzT2JqKCk7CisgIGlmIChwVGhpcy5Jc0VtcHR5KCkpCisgICAgcmV0dXJuOworCisgIGlmIChDRlhKU19FbmdpbmU6OkdldE9iakRlZm5JRChwVGhpcykgIT0gQ0pTX0RvY3VtZW50OjpHZXRPYmpEZWZuSUQoKSkKKyAgICByZXR1cm47CisKKyAgQ0pTX0RvY3VtZW50KiBwSlNEb2N1bWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxDSlNfRG9jdW1lbnQqPihHZXRPYmplY3RQcml2YXRlKHBUaGlzKSk7CisgIGlmICghcEpTRG9jdW1lbnQpCisgICAgcmV0dXJuOworCisgIERvY3VtZW50KiBwRG9jdW1lbnQgPSBzdGF0aWNfY2FzdDxEb2N1bWVudCo+KHBKU0RvY3VtZW50LT5HZXRFbWJlZE9iamVjdCgpKTsKKyAgaWYgKCFwRG9jdW1lbnQpCisgICAgcmV0dXJuOworCisgIHBEb2N1bWVudC0+U2V0Rm9ybUZpbGxFbnYobV9wRm9ybUZpbGxFbnYuR2V0KCkpOworfQorCitDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIENKU19SdW50aW1lOjpHZXRGb3JtRmlsbEVudigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEZvcm1GaWxsRW52LkdldCgpOworfQorCitpbnQgQ0pTX1J1bnRpbWU6OkV4ZWN1dGVTY3JpcHQoY29uc3QgV2lkZVN0cmluZyYgc2NyaXB0LCBXaWRlU3RyaW5nKiBpbmZvKSB7CisgIEZYSlNFcnIgZXJyb3IgPSB7fTsKKyAgaW50IG5SZXQgPSBFeGVjdXRlKHNjcmlwdCwgJmVycm9yKTsKKyAgaWYgKG5SZXQgPCAwKSB7CisgICAgKmluZm8gPSBXaWRlU3RyaW5nOjpGb3JtYXQoTCJbIExpbmU6ICUwNWQgeyAlbHMgfSBdIDogJXMiLCBlcnJvci5saW5udW0gLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnNyY2xpbmUsIGVycm9yLm1lc3NhZ2UpOworICB9CisgIHJldHVybiBuUmV0OworfQorCitib29sIENKU19SdW50aW1lOjpBZGRFdmVudFRvU2V0KGNvbnN0IEZpZWxkRXZlbnQmIGV2ZW50KSB7CisgIHJldHVybiBtX0ZpZWxkRXZlbnRTZXQuaW5zZXJ0KGV2ZW50KS5zZWNvbmQ7Cit9CisKK3ZvaWQgQ0pTX1J1bnRpbWU6OlJlbW92ZUV2ZW50RnJvbVNldChjb25zdCBGaWVsZEV2ZW50JiBldmVudCkgeworICBtX0ZpZWxkRXZlbnRTZXQuZXJhc2UoZXZlbnQpOworfQorCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKK1dpZGVTdHJpbmcgQ2hhbmdlT2JqTmFtZShjb25zdCBXaWRlU3RyaW5nJiBzdHIpIHsKKyAgV2lkZVN0cmluZyBzUmV0ID0gc3RyOworICBzUmV0LlJlcGxhY2UoTCJfIiwgTCIuIik7CisgIHJldHVybiBzUmV0OworfQorCitib29sIENKU19SdW50aW1lOjpHZXRWYWx1ZUJ5TmFtZShjb25zdCBCeXRlU3RyaW5nVmlldyYgdXRmOE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHBWYWx1ZSkgeworICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShHZXRJc29sYXRlKCkpOworICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKEdldElzb2xhdGUoKSk7CisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IE5ld0xvY2FsQ29udGV4dCgpOworICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZShjb250ZXh0KTsKKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcHJvcHZhbHVlID0gY29udGV4dC0+R2xvYmFsKCktPkdldCgKKyAgICAgIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KEdldElzb2xhdGUoKSwgdXRmOE5hbWUudW50ZXJtaW5hdGVkX2Nfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6U3RyaW5nOjprTm9ybWFsU3RyaW5nLCB1dGY4TmFtZS5HZXRMZW5ndGgoKSkpOworICBpZiAocHJvcHZhbHVlLklzRW1wdHkoKSkgeworICAgIHBWYWx1ZS0+U2V0VW5kZWZpbmVkKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHBWYWx1ZS0+Rm9yY2VTZXRWYWx1ZShwcm9wdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDSlNfUnVudGltZTo6U2V0VmFsdWVCeU5hbWUoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHV0ZjhOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpIHsKKyAgaWYgKHV0ZjhOYW1lLklzRW1wdHkoKSB8fCAhcFZhbHVlKQorICAgIHJldHVybiBmYWxzZTsKKworICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBHZXRJc29sYXRlKCk7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKHBJc29sYXRlKTsKKyAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShwSXNvbGF0ZSk7CisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IE5ld0xvY2FsQ29udGV4dCgpOworICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZShjb250ZXh0KTsKKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcHJvcHZhbHVlID0KKyAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+OjpOZXcoR2V0SXNvbGF0ZSgpLCBwVmFsdWUtPkRpcmVjdEdldFZhbHVlKCkpOworICBjb250ZXh0LT5HbG9iYWwoKS0+U2V0KAorICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgocElzb2xhdGUsIHV0ZjhOYW1lLnVudGVybWluYXRlZF9jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OlN0cmluZzo6a05vcm1hbFN0cmluZywgdXRmOE5hbWUuR2V0TGVuZ3RoKCkpLAorICAgICAgcHJvcHZhbHVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisjZW5kaWYKKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gQ0pTX1J1bnRpbWU6Ok1heWJlQ29lcmNlVG9OdW1iZXIoCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUpIHsKKyAgYm9vbCBiQWxsb3dOYU4gPSBmYWxzZTsKKyAgaWYgKHZhbHVlLT5Jc1N0cmluZygpKSB7CisgICAgQnl0ZVN0cmluZyBic3RyID0gQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoVG9XaWRlU3RyaW5nKHZhbHVlKSk7CisgICAgaWYgKGJzdHIuR2V0TGVuZ3RoKCkgPT0gMCkKKyAgICAgIHJldHVybiB2YWx1ZTsKKyAgICBpZiAoYnN0ciA9PSAiTmFOIikKKyAgICAgIGJBbGxvd05hTiA9IHRydWU7CisgIH0KKworICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBHZXRJc29sYXRlKCk7CisgIHY4OjpUcnlDYXRjaCB0cnlfY2F0Y2gocElzb2xhdGUpOworICB2ODo6TWF5YmVMb2NhbDx2ODo6TnVtYmVyPiBtYXliZU51bSA9CisgICAgICB2YWx1ZS0+VG9OdW1iZXIocElzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCkpOworICBpZiAobWF5YmVOdW0uSXNFbXB0eSgpKQorICAgIHJldHVybiB2YWx1ZTsKKworICB2ODo6TG9jYWw8djg6Ok51bWJlcj4gbnVtID0gbWF5YmVOdW0uVG9Mb2NhbENoZWNrZWQoKTsKKyAgaWYgKHN0ZDo6aXNuYW4obnVtLT5WYWx1ZSgpKSAmJiAhYkFsbG93TmFOKQorICAgIHJldHVybiB2YWx1ZTsKKworICByZXR1cm4gbnVtOworfQpkaWZmIC0tZ2l0IGEvZnhqcy9janNfcnVudGltZS5oIGIvZnhqcy9janNfcnVudGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlY2MwZDUKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc19ydW50aW1lLmgKQEAgLTAsMCArMSw3MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfQ0pTX1JVTlRJTUVfSF8KKyNkZWZpbmUgRlhKU19DSlNfUlVOVElNRV9IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L29ic2VydmFibGUuaCIKKyNpbmNsdWRlICJmcGRmc2RrL2NwZGZzZGtfZm9ybWZpbGxlbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImZ4anMvY2pzX2V2ZW50aGFuZGxlci5oIgorI2luY2x1ZGUgImZ4anMvZnhqc192OC5oIgorI2luY2x1ZGUgImZ4anMvaWpzX3J1bnRpbWUuaCIKKworY2xhc3MgQ0pTX0V2ZW50Q29udGV4dDsKKworY2xhc3MgQ0pTX1J1bnRpbWUgOiBwdWJsaWMgSUpTX1J1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDRlhKU19FbmdpbmUsCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYnNlcnZhYmxlPENKU19SdW50aW1lPiB7CisgcHVibGljOgorICB1c2luZyBGaWVsZEV2ZW50ID0gc3RkOjpwYWlyPFdpZGVTdHJpbmcsIEpTX0VWRU5UX1Q+OworCisgIHN0YXRpYyBDSlNfUnVudGltZSogQ3VycmVudFJ1bnRpbWVGcm9tSXNvbGF0ZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUpOworCisgIGV4cGxpY2l0IENKU19SdW50aW1lKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KTsKKyAgfkNKU19SdW50aW1lKCkgb3ZlcnJpZGU7CisKKyAgLy8gSUpTX1J1bnRpbWUKKyAgSUpTX0V2ZW50Q29udGV4dCogTmV3RXZlbnRDb250ZXh0KCkgb3ZlcnJpZGU7CisgIHZvaWQgUmVsZWFzZUV2ZW50Q29udGV4dChJSlNfRXZlbnRDb250ZXh0KiBwQ29udGV4dCkgb3ZlcnJpZGU7CisgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogR2V0Rm9ybUZpbGxFbnYoKSBjb25zdCBvdmVycmlkZTsKKyAgaW50IEV4ZWN1dGVTY3JpcHQoY29uc3QgV2lkZVN0cmluZyYgc2NyaXB0LCBXaWRlU3RyaW5nKiBpbmZvKSBvdmVycmlkZTsKKworICBDSlNfRXZlbnRDb250ZXh0KiBHZXRDdXJyZW50RXZlbnRDb250ZXh0KCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBpc24ndCBhbHJlYWR5IGZvdW5kIGluIHRoZSBzZXQuCisgIGJvb2wgQWRkRXZlbnRUb1NldChjb25zdCBGaWVsZEV2ZW50JiBldmVudCk7CisgIHZvaWQgUmVtb3ZlRXZlbnRGcm9tU2V0KGNvbnN0IEZpZWxkRXZlbnQmIGV2ZW50KTsKKworICB2b2lkIEJlZ2luQmxvY2soKSB7IG1fYkJsb2NraW5nID0gdHJ1ZTsgfQorICB2b2lkIEVuZEJsb2NrKCkgeyBtX2JCbG9ja2luZyA9IGZhbHNlOyB9CisgIGJvb2wgSXNCbG9ja2luZygpIGNvbnN0IHsgcmV0dXJuIG1fYkJsb2NraW5nOyB9CisKKyAgLy8gQXR0ZW1wdCB0byBjb252ZXJ0IHRoZSB8dmFsdWV8IGludG8gYSBudW1iZXIuIElmIHN1Y2Nlc3NmdWwgdGhlIG51bWJlcgorICAvLyB2YWx1ZSB3aWxsIGJlIHJldHVybmVkLCBvdGhlcndpc2UgfHZhbHVlfCBpcyByZXR1cm5lZC4KKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gTWF5YmVDb2VyY2VUb051bWJlcih2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSk7CisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICBib29sIEdldFZhbHVlQnlOYW1lKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiB1dGY4TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHBWYWx1ZSkgb3ZlcnJpZGU7CisgIGJvb2wgU2V0VmFsdWVCeU5hbWUoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHV0ZjhOYW1lLAorICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFZhbHVlKSBvdmVycmlkZTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworIHByaXZhdGU6CisgIHZvaWQgRGVmaW5lSlNPYmplY3RzKCk7CisgIHZvaWQgU2V0Rm9ybUZpbGxFbnZUb0RvY3VtZW50KCk7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENKU19FdmVudENvbnRleHQ+PiBtX0V2ZW50Q29udGV4dEFycmF5OworICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQ6Ok9ic2VydmVkUHRyIG1fcEZvcm1GaWxsRW52OworICBib29sIG1fYkJsb2NraW5nOworICBib29sIG1faXNvbGF0ZU1hbmFnZWQ7CisgIHN0ZDo6c2V0PEZpZWxkRXZlbnQ+IG1fRmllbGRFdmVudFNldDsKK307CisKKyNlbmRpZiAgLy8gRlhKU19DSlNfUlVOVElNRV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy9janNfcnVudGltZXN0dWIuY3BwIGIvZnhqcy9janNfcnVudGltZXN0dWIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTY3MjgKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc19ydW50aW1lc3R1Yi5jcHAKQEAgLTAsMCArMSw2MCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgorI2luY2x1ZGUgImZ4anMvY2pzX2V2ZW50X2NvbnRleHRfc3R1Yi5oIgorI2luY2x1ZGUgImZ4anMvaWpzX3J1bnRpbWUuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK2NsYXNzIENKU19SdW50aW1lU3R1YiBmaW5hbCA6IHB1YmxpYyBJSlNfUnVudGltZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlNfUnVudGltZVN0dWIoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpCisgICAgICA6IG1fcEZvcm1GaWxsRW52KHBGb3JtRmlsbEVudikge30KKyAgfkNKU19SdW50aW1lU3R1YigpIG92ZXJyaWRlIHt9CisKKyAgSUpTX0V2ZW50Q29udGV4dCogTmV3RXZlbnRDb250ZXh0KCkgb3ZlcnJpZGUgeworICAgIGlmICghbV9wQ29udGV4dCkKKyAgICAgIG1fcENvbnRleHQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pTX0V2ZW50Q29udGV4dFN0dWI+KCk7CisgICAgcmV0dXJuIG1fcENvbnRleHQuZ2V0KCk7CisgIH0KKworICB2b2lkIFJlbGVhc2VFdmVudENvbnRleHQoSUpTX0V2ZW50Q29udGV4dCogcENvbnRleHQpIG92ZXJyaWRlIHt9CisKKyAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBHZXRGb3JtRmlsbEVudigpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gbV9wRm9ybUZpbGxFbnYuR2V0KCk7CisgIH0KKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIGJvb2wgR2V0VmFsdWVCeU5hbWUoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmLCBDRlhKU0VfVmFsdWUqKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBTZXRWYWx1ZUJ5TmFtZShjb25zdCBCeXRlU3RyaW5nVmlldyYsIENGWEpTRV9WYWx1ZSopIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworICBpbnQgRXhlY3V0ZVNjcmlwdChjb25zdCBXaWRlU3RyaW5nJiBzY3JpcHQsIFdpZGVTdHJpbmcqIGluZm8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgcHJvdGVjdGVkOgorICBVbm93bmVkUHRyPENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudD4gY29uc3QgbV9wRm9ybUZpbGxFbnY7CisgIHN0ZDo6dW5pcXVlX3B0cjxDSlNfRXZlbnRDb250ZXh0U3R1Yj4gbV9wQ29udGV4dDsKK307CisKKy8vIHN0YXRpYwordm9pZCBJSlNfUnVudGltZTo6SW5pdGlhbGl6ZSh1bnNpZ25lZCBpbnQgc2xvdCwgdm9pZCogaXNvbGF0ZSkge30KKworLy8gc3RhdGljCit2b2lkIElKU19SdW50aW1lOjpEZXN0cm95KCkge30KKworLy8gc3RhdGljCitJSlNfUnVudGltZSogSUpTX1J1bnRpbWU6OkNyZWF0ZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgeworICByZXR1cm4gbmV3IENKU19SdW50aW1lU3R1YihwRm9ybUZpbGxFbnYpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy9janNfc2NhbGVob3cuY3BwIGIvZnhqcy9janNfc2NhbGVob3cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2Mjg2M2IKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc19zY2FsZWhvdy5jcHAKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy9janNfc2NhbGVob3cuaCIKKworY29uc3QgSlNDb25zdFNwZWMgQ0pTX1NjYWxlSG93OjpDb25zdFNwZWNzW10gPSB7CisgICAgeyJwcm9wb3J0aW9uYWwiLCBKU0NvbnN0U3BlYzo6TnVtYmVyLCAwLCAwfSwKKyAgICB7ImFuYW1vcnBoaWMiLCBKU0NvbnN0U3BlYzo6TnVtYmVyLCAxLCAwfX07CisKK2ludCBDSlNfU2NhbGVIb3c6Ok9iakRlZm5JRCA9IC0xOworCisvLyBzdGF0aWMKK3ZvaWQgQ0pTX1NjYWxlSG93OjpEZWZpbmVKU09iamVjdHMoQ0ZYSlNfRW5naW5lKiBwRW5naW5lKSB7CisgIE9iakRlZm5JRCA9CisgICAgICBwRW5naW5lLT5EZWZpbmVPYmooInNjYWxlSG93IiwgRlhKU09CSlRZUEVfU1RBVElDLCBudWxscHRyLCBudWxscHRyKTsKKyAgRGVmaW5lQ29uc3RzKHBFbmdpbmUsIE9iakRlZm5JRCwgQ29uc3RTcGVjcywgRlhfQXJyYXlTaXplKENvbnN0U3BlY3MpKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX3NjYWxlaG93LmggYi9meGpzL2Nqc19zY2FsZWhvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNzdhM2UKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc19zY2FsZWhvdy5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX0NKU19TQ0FMRUhPV19IXworI2RlZmluZSBGWEpTX0NKU19TQ0FMRUhPV19IXworCisjaW5jbHVkZSAiZnhqcy9KU19EZWZpbmUuaCIKKworY2xhc3MgQ0pTX1NjYWxlSG93IDogcHVibGljIENKU19PYmplY3QgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgRGVmaW5lSlNPYmplY3RzKENGWEpTX0VuZ2luZSogcEVuZ2luZSk7CisKKyAgZXhwbGljaXQgQ0pTX1NjYWxlSG93KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqZWN0KSA6IENKU19PYmplY3QocE9iamVjdCkge30KKyAgfkNKU19TY2FsZUhvdygpIG92ZXJyaWRlIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgaW50IE9iakRlZm5JRDsKKyAgc3RhdGljIGNvbnN0IEpTQ29uc3RTcGVjIENvbnN0U3BlY3NbXTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19DSlNfU0NBTEVIT1dfSF8KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX3NjYWxld2hlbi5jcHAgYi9meGpzL2Nqc19zY2FsZXdoZW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZjA0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc19zY2FsZXdoZW4uY3BwCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMvY2pzX3NjYWxld2hlbi5oIgorCitjb25zdCBKU0NvbnN0U3BlYyBDSlNfU2NhbGVXaGVuOjpDb25zdFNwZWNzW10gPSB7CisgICAgeyJhbHdheXMiLCBKU0NvbnN0U3BlYzo6TnVtYmVyLCAwLCAwfSwKKyAgICB7Im5ldmVyIiwgSlNDb25zdFNwZWM6Ok51bWJlciwgMSwgMH0sCisgICAgeyJ0b29CaWciLCBKU0NvbnN0U3BlYzo6TnVtYmVyLCAyLCAwfSwKKyAgICB7InRvb1NtYWxsIiwgSlNDb25zdFNwZWM6Ok51bWJlciwgMywgMH19OworCitpbnQgQ0pTX1NjYWxlV2hlbjo6T2JqRGVmbklEID0gLTE7CisKKy8vIHN0YXRpYwordm9pZCBDSlNfU2NhbGVXaGVuOjpEZWZpbmVKU09iamVjdHMoQ0ZYSlNfRW5naW5lKiBwRW5naW5lKSB7CisgIE9iakRlZm5JRCA9CisgICAgICBwRW5naW5lLT5EZWZpbmVPYmooInNjYWxlV2hlbiIsIEZYSlNPQkpUWVBFX1NUQVRJQywgbnVsbHB0ciwgbnVsbHB0cik7CisgIERlZmluZUNvbnN0cyhwRW5naW5lLCBPYmpEZWZuSUQsIENvbnN0U3BlY3MsIEZYX0FycmF5U2l6ZShDb25zdFNwZWNzKSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL2Nqc19zY2FsZXdoZW4uaCBiL2Z4anMvY2pzX3NjYWxld2hlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5N2EyODUKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc19zY2FsZXdoZW4uaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19DSlNfU0NBTEVXSEVOX0hfCisjZGVmaW5lIEZYSlNfQ0pTX1NDQUxFV0hFTl9IXworCisjaW5jbHVkZSAiZnhqcy9KU19EZWZpbmUuaCIKKworY2xhc3MgQ0pTX1NjYWxlV2hlbiA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIERlZmluZUpTT2JqZWN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUpOworCisgIGV4cGxpY2l0IENKU19TY2FsZVdoZW4odjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQorICB+Q0pTX1NjYWxlV2hlbigpIG92ZXJyaWRlIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgaW50IE9iakRlZm5JRDsKKyAgc3RhdGljIGNvbnN0IEpTQ29uc3RTcGVjIENvbnN0U3BlY3NbXTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19DSlNfU0NBTEVXSEVOX0hfCmRpZmYgLS1naXQgYS9meGpzL2Nqc19zdHlsZS5jcHAgYi9meGpzL2Nqc19zdHlsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU5NWU5YQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2pzX3N0eWxlLmNwcApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL2Nqc19zdHlsZS5oIgorCitjb25zdCBKU0NvbnN0U3BlYyBDSlNfU3R5bGU6OkNvbnN0U3BlY3NbXSA9IHsKKyAgICB7ImNoIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgImNoZWNrIn0sCisgICAgeyJjciIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJjcm9zcyJ9LAorICAgIHsiZGkiLCBKU0NvbnN0U3BlYzo6U3RyaW5nLCAwLCAiZGlhbW9uZCJ9LAorICAgIHsiY2kiLCBKU0NvbnN0U3BlYzo6U3RyaW5nLCAwLCAiY2lyY2xlIn0sCisgICAgeyJzdCIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJzdGFyIn0sCisgICAgeyJzcSIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJzcXVhcmUifX07CisKK2ludCBDSlNfU3R5bGU6Ok9iakRlZm5JRCA9IC0xOworCisvLyBzdGF0aWMKK3ZvaWQgQ0pTX1N0eWxlOjpEZWZpbmVKU09iamVjdHMoQ0ZYSlNfRW5naW5lKiBwRW5naW5lKSB7CisgIE9iakRlZm5JRCA9IHBFbmdpbmUtPkRlZmluZU9iaigic3R5bGUiLCBGWEpTT0JKVFlQRV9TVEFUSUMsIG51bGxwdHIsIG51bGxwdHIpOworICBEZWZpbmVDb25zdHMocEVuZ2luZSwgT2JqRGVmbklELCBDb25zdFNwZWNzLCBGWF9BcnJheVNpemUoQ29uc3RTcGVjcykpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy9janNfc3R5bGUuaCBiL2Z4anMvY2pzX3N0eWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhYjY2YgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2pzX3N0eWxlLmgKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfQ0pTX1NUWUxFX0hfCisjZGVmaW5lIEZYSlNfQ0pTX1NUWUxFX0hfCisKKyNpbmNsdWRlICJmeGpzL0pTX0RlZmluZS5oIgorCitjbGFzcyBDSlNfU3R5bGUgOiBwdWJsaWMgQ0pTX09iamVjdCB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBEZWZpbmVKU09iamVjdHMoQ0ZYSlNfRW5naW5lKiBwRW5naW5lKTsKKworICBleHBsaWNpdCBDSlNfU3R5bGUodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmplY3QpIDogQ0pTX09iamVjdChwT2JqZWN0KSB7fQorICB+Q0pTX1N0eWxlKCkgb3ZlcnJpZGUge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBpbnQgT2JqRGVmbklEOworICBzdGF0aWMgY29uc3QgSlNDb25zdFNwZWMgQ29uc3RTcGVjc1tdOworfTsKKworI2VuZGlmICAvLyBGWEpTX0NKU19TVFlMRV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy9janNfdGltZXJvYmouY3BwIGIvZnhqcy9janNfdGltZXJvYmouY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMGFkMDgKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc190aW1lcm9iai5jcHAKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy9janNfdGltZXJvYmouaCIKKworI2luY2x1ZGUgImZ4anMvZ2xvYmFsX3RpbWVyLmgiCisKK2ludCBDSlNfVGltZXJPYmo6Ok9iakRlZm5JRCA9IC0xOworCisvLyBzdGF0aWMKK2ludCBDSlNfVGltZXJPYmo6OkdldE9iakRlZm5JRCgpIHsKKyAgcmV0dXJuIE9iakRlZm5JRDsKK30KKworLy8gc3RhdGljCit2b2lkIENKU19UaW1lck9iajo6RGVmaW5lSlNPYmplY3RzKENGWEpTX0VuZ2luZSogcEVuZ2luZSkgeworICBPYmpEZWZuSUQgPSBwRW5naW5lLT5EZWZpbmVPYmooIlRpbWVyT2JqIiwgRlhKU09CSlRZUEVfRFlOQU1JQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTQ29uc3RydWN0b3I8Q0pTX1RpbWVyT2JqLCBUaW1lck9iaj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0Rlc3RydWN0b3I8Q0pTX1RpbWVyT2JqPik7Cit9CisKK1RpbWVyT2JqOjpUaW1lck9iaihDSlNfT2JqZWN0KiBwSlNPYmplY3QpCisgICAgOiBDSlNfRW1iZWRPYmoocEpTT2JqZWN0KSwgbV9uVGltZXJJRCgwKSB7fQorCitUaW1lck9iajo6flRpbWVyT2JqKCkge30KKwordm9pZCBUaW1lck9iajo6U2V0VGltZXIoR2xvYmFsVGltZXIqIHBUaW1lcikgeworICBtX25UaW1lcklEID0gcFRpbWVyLT5HZXRUaW1lcklEKCk7Cit9CmRpZmYgLS1naXQgYS9meGpzL2Nqc190aW1lcm9iai5oIGIvZnhqcy9janNfdGltZXJvYmouaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTA5NTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfdGltZXJvYmouaApAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19DSlNfVElNRVJPQkpfSF8KKyNkZWZpbmUgRlhKU19DSlNfVElNRVJPQkpfSF8KKworI2luY2x1ZGUgImZ4anMvSlNfRGVmaW5lLmgiCisKK2NsYXNzIEdsb2JhbFRpbWVyOworCitjbGFzcyBUaW1lck9iaiA6IHB1YmxpYyBDSlNfRW1iZWRPYmogeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVGltZXJPYmooQ0pTX09iamVjdCogcEpTT2JqZWN0KTsKKyAgflRpbWVyT2JqKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBTZXRUaW1lcihHbG9iYWxUaW1lciogcFRpbWVyKTsKKyAgaW50IEdldFRpbWVySUQoKSBjb25zdCB7IHJldHVybiBtX25UaW1lcklEOyB9CisKKyBwcml2YXRlOgorICBpbnQgbV9uVGltZXJJRDsgIC8vIFdlYWsgcmVmZXJlbmNlIHRvIEdsb2JhbFRpbWVyIHRocm91Z2ggZ2xvYmFsIG1hcC4KK307CisKK2NsYXNzIENKU19UaW1lck9iaiA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBpbnQgR2V0T2JqRGVmbklEKCk7CisgIHN0YXRpYyB2b2lkIERlZmluZUpTT2JqZWN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUpOworCisgIGV4cGxpY2l0IENKU19UaW1lck9iaih2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9CisgIH5DSlNfVGltZXJPYmooKSBvdmVycmlkZSB7fQorCisgcHJpdmF0ZToKKyAgc3RhdGljIGludCBPYmpEZWZuSUQ7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfQ0pTX1RJTUVST0JKX0hfCmRpZmYgLS1naXQgYS9meGpzL2Nqc191dGlsLmNwcCBiL2Z4anMvY2pzX3V0aWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MjY3YWQKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc191dGlsLmNwcApAQCAtMCwwICsxLDQ3MSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy9janNfdXRpbC5oIgorCisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGN3Y3R5cGU+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAiZnhqcy9KU19EZWZpbmUuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc19ldmVudF9jb250ZXh0LmgiCisjaW5jbHVkZSAiZnhqcy9janNfZXZlbnRoYW5kbGVyLmgiCisjaW5jbHVkZSAiZnhqcy9janNfb2JqZWN0LmgiCisjaW5jbHVkZSAiZnhqcy9janNfcHVibGljbWV0aG9kcy5oIgorI2luY2x1ZGUgImZ4anMvY2pzX3J1bnRpbWUuaCIKKyNpbmNsdWRlICJmeGpzL2pzX3Jlc291cmNlcy5oIgorCisjaWYgX0ZYX09TXyA9PSBfRlhfT1NfQU5EUk9JRF8KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2VuZGlmCisKK25hbWVzcGFjZSB7CisKKy8vIE1hcCBQREYtc3R5bGUgZGlyZWN0aXZlcyB0byBlcXVpdmFsZW50IHdjc2Z0aW1lIGRpcmVjdGl2ZXMuIE5vdAorLy8gYWxsIGhhdmUgZGlyZWN0IGVxdWl2YWxlbnRzLCB0aG91Z2guCitzdHJ1Y3QgVGJDb252ZXJ0IHsKKyAgY29uc3Qgd2NoYXJfdCogbHBzekpTTWFyazsKKyAgY29uc3Qgd2NoYXJfdCogbHBzekNwcE1hcms7Cit9OworCisvLyBNYXAgUERGLXN0eWxlIGRpcmVjdGl2ZXMgbGFja2luZyBkaXJlY3Qgd2NzZnRpbWUgZGlyZWN0aXZlcyB0bworLy8gdGhlIHZhbHVlIHdpdGggd2hpY2ggdGhleSB3aWxsIGJlIHJlcGxhY2VkLgorc3RydWN0IFRiQ29udmVydEFkZGl0aW9uYWwgeworICBjb25zdCB3Y2hhcl90KiBscHN6SlNNYXJrOworICBpbnQgaVZhbHVlOworfTsKKworY29uc3QgVGJDb252ZXJ0IFRiQ29udmVydFRhYmxlW10gPSB7CisgICAge0wibW1tbSIsIEwiJUIifSwge0wibW1tIiwgTCIlYiJ9LCB7TCJtbSIsIEwiJW0ifSwgICB7TCJkZGRkIiwgTCIlQSJ9LAorICAgIHtMImRkZCIsIEwiJWEifSwgIHtMImRkIiwgTCIlZCJ9LCAge0wieXl5eSIsIEwiJVkifSwge0wieXkiLCBMIiV5In0sCisgICAge0wiSEgiLCBMIiVIIn0sICAge0wiaGgiLCBMIiVJIn0sICB7TCJNTSIsIEwiJU0ifSwgICB7TCJzcyIsIEwiJVMifSwKKyAgICB7TCJUVCIsIEwiJXAifSwKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyAgICB7TCJ0dCIsIEwiJXAifSwgICB7TCJoIiwgTCIlI0kifSwKKyNlbHNlCisgICAge0widHQiLCBMIiVQIn0sICAge0wiaCIsIEwiJWwifSwKKyNlbmRpZgorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK2NvbnN0IEpTTWV0aG9kU3BlYyBDSlNfVXRpbDo6TWV0aG9kU3BlY3NbXSA9IHsKKyAgICB7InByaW50ZCIsIHByaW50ZF9zdGF0aWN9LAorICAgIHsicHJpbnRmIiwgcHJpbnRmX3N0YXRpY30sCisgICAgeyJwcmludHgiLCBwcmludHhfc3RhdGljfSwKKyAgICB7InNjYW5kIiwgc2NhbmRfc3RhdGljfSwKKyAgICB7ImJ5dGVUb0NoYXIiLCBieXRlVG9DaGFyX3N0YXRpY319OworCitpbnQgQ0pTX1V0aWw6Ok9iakRlZm5JRCA9IC0xOworCisvLyBzdGF0aWMKK3ZvaWQgQ0pTX1V0aWw6OkRlZmluZUpTT2JqZWN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUpIHsKKyAgT2JqRGVmbklEID0KKyAgICAgIHBFbmdpbmUtPkRlZmluZU9iaigidXRpbCIsIEZYSlNPQkpUWVBFX1NUQVRJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICBKU0NvbnN0cnVjdG9yPENKU19VdGlsLCB1dGlsPiwgSlNEZXN0cnVjdG9yPENKU19VdGlsPik7CisgIERlZmluZU1ldGhvZHMocEVuZ2luZSwgT2JqRGVmbklELCBNZXRob2RTcGVjcywgRlhfQXJyYXlTaXplKE1ldGhvZFNwZWNzKSk7Cit9CisKK3V0aWw6OnV0aWwoQ0pTX09iamVjdCogcEpTT2JqZWN0KSA6IENKU19FbWJlZE9iaihwSlNPYmplY3QpIHt9CisKK3V0aWw6On51dGlsKCkge30KKworQ0pTX1JldHVybiB1dGlsOjpwcmludGYoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgY29uc3Qgc2l6ZV90IGlTaXplID0gcGFyYW1zLnNpemUoKTsKKyAgaWYgKGlTaXplIDwgMSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgc3RkOjp3c3RyaW5nIHVuc2FmZV9mbXRfc3RyaW5nKHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzBdKS5jX3N0cigpKTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp3c3RyaW5nPiB1bnNhZmVfY29udmVyc2lvbl9zcGVjaWZpZXJzOworICBpbnQgaU9mZnNldCA9IDA7CisgIGludCBpT2ZmZW5kID0gMDsKKyAgdW5zYWZlX2ZtdF9zdHJpbmcuaW5zZXJ0KHVuc2FmZV9mbXRfc3RyaW5nLmJlZ2luKCksIEwnUycpOworICB3aGlsZSAoaU9mZnNldCAhPSAtMSkgeworICAgIGlPZmZlbmQgPSB1bnNhZmVfZm10X3N0cmluZy5maW5kKEwiJSIsIGlPZmZzZXQgKyAxKTsKKyAgICBzdGQ6OndzdHJpbmcgc3RyU3ViOworICAgIGlmIChpT2ZmZW5kID09IC0xKQorICAgICAgc3RyU3ViID0gdW5zYWZlX2ZtdF9zdHJpbmcuc3Vic3RyKGlPZmZzZXQpOworICAgIGVsc2UKKyAgICAgIHN0clN1YiA9IHVuc2FmZV9mbXRfc3RyaW5nLnN1YnN0cihpT2Zmc2V0LCBpT2ZmZW5kIC0gaU9mZnNldCk7CisgICAgdW5zYWZlX2NvbnZlcnNpb25fc3BlY2lmaWVycy5wdXNoX2JhY2soc3RyU3ViKTsKKyAgICBpT2Zmc2V0ID0gaU9mZmVuZDsKKyAgfQorCisgIHN0ZDo6d3N0cmluZyBjX3N0clJlc3VsdDsKKyAgZm9yIChzaXplX3QgaUluZGV4ID0gMDsgaUluZGV4IDwgdW5zYWZlX2NvbnZlcnNpb25fc3BlY2lmaWVycy5zaXplKCk7CisgICAgICAgKytpSW5kZXgpIHsKKyAgICBzdGQ6OndzdHJpbmcgY19zdHJGb3JtYXQgPSB1bnNhZmVfY29udmVyc2lvbl9zcGVjaWZpZXJzW2lJbmRleF07CisgICAgaWYgKGlJbmRleCA9PSAwKSB7CisgICAgICBjX3N0clJlc3VsdCA9IGNfc3RyRm9ybWF0OworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKGlJbmRleCA+PSBpU2l6ZSkgeworICAgICAgY19zdHJSZXN1bHQgKz0gY19zdHJGb3JtYXQ7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBXaWRlU3RyaW5nIHN0clNlZ21lbnQ7CisgICAgc3dpdGNoIChQYXJzZURhdGFUeXBlKCZjX3N0ckZvcm1hdCkpIHsKKyAgICAgIGNhc2UgVVRJTF9JTlQ6CisgICAgICAgIHN0clNlZ21lbnQgPSBXaWRlU3RyaW5nOjpGb3JtYXQoY19zdHJGb3JtYXQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnVudGltZS0+VG9JbnQzMihwYXJhbXNbaUluZGV4XSkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVVRJTF9ET1VCTEU6CisgICAgICAgIHN0clNlZ21lbnQgPSBXaWRlU3RyaW5nOjpGb3JtYXQoY19zdHJGb3JtYXQuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUnVudGltZS0+VG9Eb3VibGUocGFyYW1zW2lJbmRleF0pKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVUSUxfU1RSSU5HOgorICAgICAgICBzdHJTZWdtZW50ID0KKyAgICAgICAgICAgIFdpZGVTdHJpbmc6OkZvcm1hdChjX3N0ckZvcm1hdC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBSdW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zW2lJbmRleF0pLmNfc3RyKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHN0clNlZ21lbnQgPSBXaWRlU3RyaW5nOjpGb3JtYXQoTCIlbHMiLCBjX3N0ckZvcm1hdC5jX3N0cigpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNfc3RyUmVzdWx0ICs9IHN0clNlZ21lbnQuY19zdHIoKTsKKyAgfQorCisgIGNfc3RyUmVzdWx0LmVyYXNlKGNfc3RyUmVzdWx0LmJlZ2luKCkpOworICByZXR1cm4gQ0pTX1JldHVybihwUnVudGltZS0+TmV3U3RyaW5nKGNfc3RyUmVzdWx0LmNfc3RyKCkpKTsKK30KKworQ0pTX1JldHVybiB1dGlsOjpwcmludGQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgY29uc3Qgc2l6ZV90IGlTaXplID0gcGFyYW1zLnNpemUoKTsKKyAgaWYgKGlTaXplIDwgMikKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisKKyAgaWYgKHBhcmFtc1sxXS5Jc0VtcHR5KCkgfHwgIXBhcmFtc1sxXS0+SXNEYXRlKCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprU2Vjb25kUGFyYW1Ob3REYXRlRXJyb3IpKTsKKworICB2ODo6TG9jYWw8djg6OkRhdGU+IHY4X2RhdGUgPSBwYXJhbXNbMV0uQXM8djg6OkRhdGU+KCk7CisgIGlmICh2OF9kYXRlLklzRW1wdHkoKSB8fCBzdGQ6OmlzbmFuKHBSdW50aW1lLT5Ub0RvdWJsZSh2OF9kYXRlKSkpIHsKKyAgICByZXR1cm4gQ0pTX1JldHVybigKKyAgICAgICAgSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprU2Vjb25kUGFyYW1JbnZhbGlkRGF0ZUVycm9yKSk7CisgIH0KKworICBkb3VibGUgZGF0ZSA9IEpTX0xvY2FsVGltZShwUnVudGltZS0+VG9Eb3VibGUodjhfZGF0ZSkpOworICBpbnQgeWVhciA9IEpTX0dldFllYXJGcm9tVGltZShkYXRlKTsKKyAgaW50IG1vbnRoID0gSlNfR2V0TW9udGhGcm9tVGltZShkYXRlKSArIDE7ICAvLyBPbmUtYmFzZWQuCisgIGludCBkYXkgPSBKU19HZXREYXlGcm9tVGltZShkYXRlKTsKKyAgaW50IGhvdXIgPSBKU19HZXRIb3VyRnJvbVRpbWUoZGF0ZSk7CisgIGludCBtaW4gPSBKU19HZXRNaW5Gcm9tVGltZShkYXRlKTsKKyAgaW50IHNlYyA9IEpTX0dldFNlY0Zyb21UaW1lKGRhdGUpOworCisgIGlmIChwYXJhbXNbMF0tPklzTnVtYmVyKCkpIHsKKyAgICBXaWRlU3RyaW5nIHN3UmVzdWx0OworICAgIHN3aXRjaCAocFJ1bnRpbWUtPlRvSW50MzIocGFyYW1zWzBdKSkgeworICAgICAgY2FzZSAwOgorICAgICAgICBzd1Jlc3VsdCA9IFdpZGVTdHJpbmc6OkZvcm1hdChMIkQ6JTA0ZCUwMmQlMDJkJTAyZCUwMmQlMDJkIiwgeWVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGgsIGRheSwgaG91ciwgbWluLCBzZWMpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgc3dSZXN1bHQgPSBXaWRlU3RyaW5nOjpGb3JtYXQoTCIlMDRkLiUwMmQuJTAyZCAlMDJkOiUwMmQ6JTAyZCIsIHllYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoLCBkYXksIGhvdXIsIG1pbiwgc2VjKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIHN3UmVzdWx0ID0gV2lkZVN0cmluZzo6Rm9ybWF0KEwiJTA0ZC8lMDJkLyUwMmQgJTAyZDolMDJkOiUwMmQiLCB5ZWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb250aCwgZGF5LCBob3VyLCBtaW4sIHNlYyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprVmFsdWVFcnJvcikpOworICAgIH0KKworICAgIHJldHVybiBDSlNfUmV0dXJuKHBSdW50aW1lLT5OZXdTdHJpbmcoc3dSZXN1bHQuY19zdHIoKSkpOworICB9CisKKyAgaWYgKHBhcmFtc1swXS0+SXNTdHJpbmcoKSkgeworICAgIC8vIFdlIGRvbid0IHN1cHBvcnQgWEZBUGljdHVyZSBhdCB0aGUgbW9tZW50LgorICAgIGlmIChpU2l6ZSA+IDIgJiYgcFJ1bnRpbWUtPlRvQm9vbGVhbihwYXJhbXNbMl0pKQorICAgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprTm90U3VwcG9ydGVkRXJyb3IpKTsKKworICAgIC8vIENvbnZlcnQgUERGLXN0eWxlIGZvcm1hdCBzcGVjaWZpZXJzIHRvIHdjc2Z0aW1lIHNwZWNpZmllcnMuIFJlbW92ZSBhbnkKKyAgICAvLyBwcmUtZXhpc3RpbmcgJS1kaXJlY3RpdmVzIGJlZm9yZSBpbnNlcnRpbmcgb3VyIG93bi4KKyAgICBzdGQ6OmJhc2ljX3N0cmluZzx3Y2hhcl90PiBjRm9ybWF0ID0KKyAgICAgICAgcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMF0pLmNfc3RyKCk7CisgICAgY0Zvcm1hdC5lcmFzZShzdGQ6OnJlbW92ZShjRm9ybWF0LmJlZ2luKCksIGNGb3JtYXQuZW5kKCksICclJyksCisgICAgICAgICAgICAgICAgICBjRm9ybWF0LmVuZCgpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKFRiQ29udmVydFRhYmxlKTsgKytpKSB7CisgICAgICBpbnQgaVN0YXJ0ID0gMDsKKyAgICAgIGludCBpRW5kOworICAgICAgd2hpbGUgKChpRW5kID0gY0Zvcm1hdC5maW5kKFRiQ29udmVydFRhYmxlW2ldLmxwc3pKU01hcmssIGlTdGFydCkpICE9CisgICAgICAgICAgICAgLTEpIHsKKyAgICAgICAgY0Zvcm1hdC5yZXBsYWNlKGlFbmQsIHdjc2xlbihUYkNvbnZlcnRUYWJsZVtpXS5scHN6SlNNYXJrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRiQ29udmVydFRhYmxlW2ldLmxwc3pDcHBNYXJrKTsKKyAgICAgICAgaVN0YXJ0ID0gaUVuZDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoeWVhciA8IDApCisgICAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtWYWx1ZUVycm9yKSk7CisKKyAgICBzdGF0aWMgY29uc3QgVGJDb252ZXJ0QWRkaXRpb25hbCBjVGFibGVBZFtdID0geworICAgICAgICB7TCJtIiwgbW9udGh9LCB7TCJkIiwgZGF5fSwKKyAgICAgICAge0wiSCIsIGhvdXJ9LCAge0wiaCIsIGhvdXIgPiAxMiA/IGhvdXIgLSAxMiA6IGhvdXJ9LAorICAgICAgICB7TCJNIiwgbWlufSwgICB7TCJzIiwgc2VjfSwKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoY1RhYmxlQWQpOyArK2kpIHsKKyAgICAgIGludCBpU3RhcnQgPSAwOworICAgICAgaW50IGlFbmQ7CisgICAgICB3aGlsZSAoKGlFbmQgPSBjRm9ybWF0LmZpbmQoY1RhYmxlQWRbaV0ubHBzekpTTWFyaywgaVN0YXJ0KSkgIT0gLTEpIHsKKyAgICAgICAgaWYgKGlFbmQgPiAwKSB7CisgICAgICAgICAgaWYgKGNGb3JtYXRbaUVuZCAtIDFdID09IEwnJScpIHsKKyAgICAgICAgICAgIGlTdGFydCA9IGlFbmQgKyAxOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNGb3JtYXQucmVwbGFjZShpRW5kLCB3Y3NsZW4oY1RhYmxlQWRbaV0ubHBzekpTTWFyayksCisgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nOjpGb3JtYXQoTCIlZCIsIGNUYWJsZUFkW2ldLmlWYWx1ZSkuY19zdHIoKSk7CisgICAgICAgIGlTdGFydCA9IGlFbmQ7CisgICAgICB9CisgICAgfQorCisgICAgc3RydWN0IHRtIHRpbWUgPSB7fTsKKyAgICB0aW1lLnRtX3llYXIgPSB5ZWFyIC0gMTkwMDsKKyAgICB0aW1lLnRtX21vbiA9IG1vbnRoIC0gMTsKKyAgICB0aW1lLnRtX21kYXkgPSBkYXk7CisgICAgdGltZS50bV9ob3VyID0gaG91cjsKKyAgICB0aW1lLnRtX21pbiA9IG1pbjsKKyAgICB0aW1lLnRtX3NlYyA9IHNlYzsKKworICAgIHdjaGFyX3QgYnVmWzY0XSA9IHt9OworICAgIEZYU1lTX3djc2Z0aW1lKGJ1ZiwgNjQsIGNGb3JtYXQuY19zdHIoKSwgJnRpbWUpOworICAgIGNGb3JtYXQgPSBidWY7CisgICAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1N0cmluZyhjRm9ybWF0LmNfc3RyKCkpKTsKKyAgfQorCisgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1R5cGVFcnJvcikpOworfQorCitDSlNfUmV0dXJuIHV0aWw6OnByaW50eChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSA8IDIpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIHJldHVybiBDSlNfUmV0dXJuKAorICAgICAgcFJ1bnRpbWUtPk5ld1N0cmluZyhwcmludHgocFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNfc3RyKCkpKTsKK30KKworZW51bSBDYXNlTW9kZSB7IGtQcmVzZXJ2ZUNhc2UsIGtVcHBlckNhc2UsIGtMb3dlckNhc2UgfTsKKworc3RhdGljIHdjaGFyX3QgVHJhbnNsYXRlQ2FzZSh3Y2hhcl90IGlucHV0LCBDYXNlTW9kZSBlTW9kZSkgeworICBpZiAoZU1vZGUgPT0ga0xvd2VyQ2FzZSAmJiBGWFNZU19pc3VwcGVyKGlucHV0KSkKKyAgICByZXR1cm4gaW5wdXQgfCAweDIwOworICBpZiAoZU1vZGUgPT0ga1VwcGVyQ2FzZSAmJiBGWFNZU19pc2xvd2VyKGlucHV0KSkKKyAgICByZXR1cm4gaW5wdXQgJiB+MHgyMDsKKyAgcmV0dXJuIGlucHV0OworfQorCitXaWRlU3RyaW5nIHV0aWw6OnByaW50eChjb25zdCBXaWRlU3RyaW5nJiB3c0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzU291cmNlKSB7CisgIFdpZGVTdHJpbmcgd3NSZXN1bHQ7CisgIHNpemVfdCBpU291cmNlSWR4ID0gMDsKKyAgc2l6ZV90IGlGb3JtYXRJZHggPSAwOworICBDYXNlTW9kZSBlQ2FzZU1vZGUgPSBrUHJlc2VydmVDYXNlOworICBib29sIGJFc2NhcGVkID0gZmFsc2U7CisgIHdoaWxlIChpRm9ybWF0SWR4IDwgd3NGb3JtYXQuR2V0TGVuZ3RoKCkpIHsKKyAgICBpZiAoYkVzY2FwZWQpIHsKKyAgICAgIGJFc2NhcGVkID0gZmFsc2U7CisgICAgICB3c1Jlc3VsdCArPSB3c0Zvcm1hdFtpRm9ybWF0SWR4XTsKKyAgICAgICsraUZvcm1hdElkeDsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBzd2l0Y2ggKHdzRm9ybWF0W2lGb3JtYXRJZHhdKSB7CisgICAgICBjYXNlICdcXCc6IHsKKyAgICAgICAgYkVzY2FwZWQgPSB0cnVlOworICAgICAgICArK2lGb3JtYXRJZHg7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSAnPCc6IHsKKyAgICAgICAgZUNhc2VNb2RlID0ga0xvd2VyQ2FzZTsKKyAgICAgICAgKytpRm9ybWF0SWR4OworICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgJz4nOiB7CisgICAgICAgIGVDYXNlTW9kZSA9IGtVcHBlckNhc2U7CisgICAgICAgICsraUZvcm1hdElkeDsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlICc9JzogeworICAgICAgICBlQ2FzZU1vZGUgPSBrUHJlc2VydmVDYXNlOworICAgICAgICArK2lGb3JtYXRJZHg7CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSAnPyc6IHsKKyAgICAgICAgaWYgKGlTb3VyY2VJZHggPCB3c1NvdXJjZS5HZXRMZW5ndGgoKSkgeworICAgICAgICAgIHdzUmVzdWx0ICs9IFRyYW5zbGF0ZUNhc2Uod3NTb3VyY2VbaVNvdXJjZUlkeF0sIGVDYXNlTW9kZSk7CisgICAgICAgICAgKytpU291cmNlSWR4OworICAgICAgICB9CisgICAgICAgICsraUZvcm1hdElkeDsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlICdYJzogeworICAgICAgICBpZiAoaVNvdXJjZUlkeCA8IHdzU291cmNlLkdldExlbmd0aCgpKSB7CisgICAgICAgICAgaWYgKEZYU1lTX2lzd2FsbnVtKHdzU291cmNlW2lTb3VyY2VJZHhdKSkgeworICAgICAgICAgICAgd3NSZXN1bHQgKz0gVHJhbnNsYXRlQ2FzZSh3c1NvdXJjZVtpU291cmNlSWR4XSwgZUNhc2VNb2RlKTsKKyAgICAgICAgICAgICsraUZvcm1hdElkeDsKKyAgICAgICAgICB9CisgICAgICAgICAgKytpU291cmNlSWR4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICsraUZvcm1hdElkeDsKKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICAgIGNhc2UgJ0EnOiB7CisgICAgICAgIGlmIChpU291cmNlSWR4IDwgd3NTb3VyY2UuR2V0TGVuZ3RoKCkpIHsKKyAgICAgICAgICBpZiAoRlhTWVNfaXN3YWxwaGEod3NTb3VyY2VbaVNvdXJjZUlkeF0pKSB7CisgICAgICAgICAgICB3c1Jlc3VsdCArPSBUcmFuc2xhdGVDYXNlKHdzU291cmNlW2lTb3VyY2VJZHhdLCBlQ2FzZU1vZGUpOworICAgICAgICAgICAgKytpRm9ybWF0SWR4OworICAgICAgICAgIH0KKyAgICAgICAgICArK2lTb3VyY2VJZHg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKytpRm9ybWF0SWR4OworICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgICAgY2FzZSAnOSc6IHsKKyAgICAgICAgaWYgKGlTb3VyY2VJZHggPCB3c1NvdXJjZS5HZXRMZW5ndGgoKSkgeworICAgICAgICAgIGlmIChzdGQ6Omlzd2RpZ2l0KHdzU291cmNlW2lTb3VyY2VJZHhdKSkgeworICAgICAgICAgICAgd3NSZXN1bHQgKz0gd3NTb3VyY2VbaVNvdXJjZUlkeF07CisgICAgICAgICAgICArK2lGb3JtYXRJZHg7CisgICAgICAgICAgfQorICAgICAgICAgICsraVNvdXJjZUlkeDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICArK2lGb3JtYXRJZHg7CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlICcqJzogeworICAgICAgICBpZiAoaVNvdXJjZUlkeCA8IHdzU291cmNlLkdldExlbmd0aCgpKSB7CisgICAgICAgICAgd3NSZXN1bHQgKz0gVHJhbnNsYXRlQ2FzZSh3c1NvdXJjZVtpU291cmNlSWR4XSwgZUNhc2VNb2RlKTsKKyAgICAgICAgICArK2lTb3VyY2VJZHg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKytpRm9ybWF0SWR4OworICAgICAgICB9CisgICAgICB9IGJyZWFrOworICAgICAgZGVmYXVsdDogeworICAgICAgICB3c1Jlc3VsdCArPSB3c0Zvcm1hdFtpRm9ybWF0SWR4XTsKKyAgICAgICAgKytpRm9ybWF0SWR4OworICAgICAgfSBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHdzUmVzdWx0OworfQorCitDSlNfUmV0dXJuIHV0aWw6OnNjYW5kKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPCAyKQorICAgIHJldHVybiBDSlNfUmV0dXJuKGZhbHNlKTsKKworICBXaWRlU3RyaW5nIHNGb3JtYXQgPSBwUnVudGltZS0+VG9XaWRlU3RyaW5nKHBhcmFtc1swXSk7CisgIFdpZGVTdHJpbmcgc0RhdGUgPSBwUnVudGltZS0+VG9XaWRlU3RyaW5nKHBhcmFtc1sxXSk7CisgIGRvdWJsZSBkRGF0ZSA9IEpTX0dldERhdGVUaW1lKCk7CisgIGlmIChzRGF0ZS5HZXRMZW5ndGgoKSA+IDApCisgICAgZERhdGUgPSBDSlNfUHVibGljTWV0aG9kczo6TWFrZVJlZ3VsYXJEYXRlKHNEYXRlLCBzRm9ybWF0LCBudWxscHRyKTsKKworICBpZiAoc3RkOjppc25hbihkRGF0ZSkpCisgICAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1VuZGVmaW5lZCgpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld0RhdGUoZERhdGUpKTsKK30KKworQ0pTX1JldHVybiB1dGlsOjpieXRlVG9DaGFyKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSA8IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIGludCBhcmcgPSBwUnVudGltZS0+VG9JbnQzMihwYXJhbXNbMF0pOworICBpZiAoYXJnIDwgMCB8fCBhcmcgPiAyNTUpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprVmFsdWVFcnJvcikpOworCisgIFdpZGVTdHJpbmcgd1N0cihzdGF0aWNfY2FzdDx3Y2hhcl90PihhcmcpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocFJ1bnRpbWUtPk5ld1N0cmluZyh3U3RyLmNfc3RyKCkpKTsKK30KKworLy8gRW5zdXJlIHRoYXQgc0Zvcm1hdCBjb250YWlucyBhdCBtb3N0IG9uZSB3ZWxsLXVuZGVyc3Rvb2QgcHJpbnRmIGZvcm1hdHRpbmcKKy8vIGRpcmVjdGl2ZSB3aGljaCBpcyBzYWZlIHRvIHVzZSB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50LCBhbmQgcmV0dXJuIHRoZSB0eXBlCisvLyBvZiBhcmd1bWVudCBleHBlY3RlZCwgb3IgLTEgb3RoZXJ3aXNlLiBJZiAtMSBpcyByZXR1cm5lZCwgaXQgaXMgTk9UIHNhZmUKKy8vIHRvIHVzZSBzRm9ybWF0IHdpdGggcHJpbnRmKCkgYW5kIGl0IG11c3QgYmUgY29waWVkIGJ5dGUtYnktYnl0ZS4KK2ludCB1dGlsOjpQYXJzZURhdGFUeXBlKHN0ZDo6d3N0cmluZyogc0Zvcm1hdCkgeworICBlbnVtIFN0YXRlIHsgQkVGT1JFLCBGTEFHUywgV0lEVEgsIFBSRUNJU0lPTiwgU1BFQ0lGSUVSLCBBRlRFUiB9OworCisgIGludCByZXN1bHQgPSAtMTsKKyAgU3RhdGUgc3RhdGUgPSBCRUZPUkU7CisgIHNpemVfdCBwcmVjaXNpb25fZGlnaXRzID0gMDsKKyAgc2l6ZV90IGkgPSAwOworICB3aGlsZSAoaSA8IHNGb3JtYXQtPmxlbmd0aCgpKSB7CisgICAgd2NoYXJfdCBjID0gKCpzRm9ybWF0KVtpXTsKKyAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICBjYXNlIEJFRk9SRToKKyAgICAgICAgaWYgKGMgPT0gTCclJykKKyAgICAgICAgICBzdGF0ZSA9IEZMQUdTOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRkxBR1M6CisgICAgICAgIGlmIChjID09IEwnKycgfHwgYyA9PSBMJy0nIHx8IGMgPT0gTCcjJyB8fCBjID09IEwnICcpIHsKKyAgICAgICAgICAvLyBTdGF5IGluIHNhbWUgc3RhdGUuCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RhdGUgPSBXSURUSDsKKyAgICAgICAgICBjb250aW51ZTsgIC8vIFJlLXByb2Nlc3Mgc2FtZSBjaGFyYWN0ZXIuCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdJRFRIOgorICAgICAgICBpZiAoYyA9PSBMJyonKQorICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgaWYgKHN0ZDo6aXN3ZGlnaXQoYykpIHsKKyAgICAgICAgICAvLyBTdGF5IGluIHNhbWUgc3RhdGUuCisgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBMJy4nKSB7CisgICAgICAgICAgc3RhdGUgPSBQUkVDSVNJT047CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RhdGUgPSBTUEVDSUZJRVI7CisgICAgICAgICAgY29udGludWU7ICAvLyBSZS1wcm9jZXNzIHNhbWUgY2hhcmFjdGVyLgorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBQUkVDSVNJT046CisgICAgICAgIGlmIChjID09IEwnKicpCisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBpZiAoc3RkOjppc3dkaWdpdChjKSkgeworICAgICAgICAgIC8vIFN0YXkgaW4gc2FtZSBzdGF0ZS4KKyAgICAgICAgICArK3ByZWNpc2lvbl9kaWdpdHM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RhdGUgPSBTUEVDSUZJRVI7CisgICAgICAgICAgY29udGludWU7ICAvLyBSZS1wcm9jZXNzIHNhbWUgY2hhcmFjdGVyLgorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTUEVDSUZJRVI6CisgICAgICAgIGlmIChjID09IEwnYycgfHwgYyA9PSBMJ0MnIHx8IGMgPT0gTCdkJyB8fCBjID09IEwnaScgfHwgYyA9PSBMJ28nIHx8CisgICAgICAgICAgICBjID09IEwndScgfHwgYyA9PSBMJ3gnIHx8IGMgPT0gTCdYJykgeworICAgICAgICAgIHJlc3VsdCA9IFVUSUxfSU5UOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gTCdlJyB8fCBjID09IEwnRScgfHwgYyA9PSBMJ2YnIHx8IGMgPT0gTCdnJyB8fAorICAgICAgICAgICAgICAgICAgIGMgPT0gTCdHJykgeworICAgICAgICAgIHJlc3VsdCA9IFVUSUxfRE9VQkxFOworICAgICAgICB9IGVsc2UgaWYgKGMgPT0gTCdzJyB8fCBjID09IEwnUycpIHsKKyAgICAgICAgICAvLyBNYXAgcyB0byBTIHNpbmNlIHdlIGFsd2F5cyBkZWFsIGludGVybmFsbHkgd2l0aCB3Y2hhcl90IHN0cmluZ3MuCisgICAgICAgICAgLy8gVE9ETyh0c2VwZXopOiBQcm9iYWJseSAxMDAlIGJvcmtlZC4gJVMgaXMgbm90IGEgc3RhbmRhcmQKKyAgICAgICAgICAvLyBjb252ZXJzaW9uLgorICAgICAgICAgICgqc0Zvcm1hdClbaV0gPSBMJ1MnOworICAgICAgICAgIHJlc3VsdCA9IFVUSUxfU1RSSU5HOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZSA9IEFGVEVSOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQUZURVI6CisgICAgICAgIGlmIChjID09IEwnJScpCisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAvLyBTdGF5IGluIHNhbWUgc3RhdGUgdW50aWwgc3RyaW5nIGV4aGF1c3RlZC4KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgICsraTsKKyAgfQorICAvLyBTZWUgaHR0cHM6Ly9jcmJ1Zy5jb20vNzQwMTY2CisgIGlmIChyZXN1bHQgPT0gVVRJTF9JTlQgJiYgcHJlY2lzaW9uX2RpZ2l0cyA+IDIpCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9meGpzL2Nqc191dGlsLmggYi9meGpzL2Nqc191dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MyMDI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvY2pzX3V0aWwuaApAQCAtMCwwICsxLDYzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19DSlNfVVRJTF9IXworI2RlZmluZSBGWEpTX0NKU19VVElMX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnhqcy9KU19EZWZpbmUuaCIKKworLy8gUmV0dXJuIHZhbHVlcyBmb3IgUGFyc2VEYXRhVHlwZSgpIGJlbG93LgorI2RlZmluZSBVVElMX0lOVCAwCisjZGVmaW5lIFVUSUxfRE9VQkxFIDEKKyNkZWZpbmUgVVRJTF9TVFJJTkcgMgorCitjbGFzcyB1dGlsIDogcHVibGljIENKU19FbWJlZE9iaiB7CisgcHVibGljOgorICBleHBsaWNpdCB1dGlsKENKU19PYmplY3QqIHBKU09iamVjdCk7CisgIH51dGlsKCkgb3ZlcnJpZGU7CisKKyAgQ0pTX1JldHVybiBwcmludGQoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcyk7CisgIENKU19SZXR1cm4gcHJpbnRmKENKU19SdW50aW1lKiBwUnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIHByaW50eChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKTsKKyAgQ0pTX1JldHVybiBzY2FuZChDSlNfUnVudGltZSogcFJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworICBDSlNfUmV0dXJuIGJ5dGVUb0NoYXIoQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworCisgIHN0YXRpYyBXaWRlU3RyaW5nIHByaW50eChjb25zdCBXaWRlU3RyaW5nJiBjRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgY1NvdXJjZSk7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQ0pTX1V0aWxfUGFyc2VEYXRhVHlwZV9UZXN0OworCisgIHN0YXRpYyBpbnQgUGFyc2VEYXRhVHlwZShzdGQ6OndzdHJpbmcqIHNGb3JtYXQpOworfTsKKworY2xhc3MgQ0pTX1V0aWwgOiBwdWJsaWMgQ0pTX09iamVjdCB7CisgcHVibGljOgorICBzdGF0aWMgdm9pZCBEZWZpbmVKU09iamVjdHMoQ0ZYSlNfRW5naW5lKiBwRW5naW5lKTsKKworICBleHBsaWNpdCBDSlNfVXRpbCh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9CisgIH5DSlNfVXRpbCgpIG92ZXJyaWRlIHt9CisKKyAgSlNfU1RBVElDX01FVEhPRChwcmludGQsIHV0aWwpOworICBKU19TVEFUSUNfTUVUSE9EKHByaW50ZiwgdXRpbCk7CisgIEpTX1NUQVRJQ19NRVRIT0QocHJpbnR4LCB1dGlsKTsKKyAgSlNfU1RBVElDX01FVEhPRChzY2FuZCwgdXRpbCk7CisgIEpTX1NUQVRJQ19NRVRIT0QoYnl0ZVRvQ2hhciwgdXRpbCk7CisKKyBwcml2YXRlOgorICBzdGF0aWMgaW50IE9iakRlZm5JRDsKKyAgc3RhdGljIGNvbnN0IEpTTWV0aG9kU3BlYyBNZXRob2RTcGVjc1tdOworfTsKKworI2VuZGlmICAvLyBGWEpTX0NKU19VVElMX0hfCmRpZmYgLS1naXQgYS9meGpzL2Nqc191dGlsX3VuaXR0ZXN0LmNwcCBiL2Z4anMvY2pzX3V0aWxfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNDNmMGYKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc191dGlsX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDExMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAiZnhqcy9janNfdXRpbC5oIgorCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy90ZXN0X3N1cHBvcnQuaCIKKworVEVTVChDSlNfVXRpbCwgUGFyc2VEYXRhVHlwZSkgeworICBzdHJ1Y3QgUGFyc2VEYXRhVHlwZUNhc2UgeworICAgIGNvbnN0IHdjaGFyX3QqIGNvbnN0IGlucHV0X3N0cmluZzsKKyAgICBjb25zdCBpbnQgZXhwZWN0ZWQ7CisgIH07CisKKyAgLy8gQ29tbWVudGVkIG91dCB0ZXN0cyBmb2xsb3cgdGhlIHNwZWMgYnV0IGFyZSBub3QgcGFzc2luZy4KKyAgY29uc3QgUGFyc2VEYXRhVHlwZUNhc2UgY2FzZXNbXSA9IHsKKyAgICAgIC8vIE5vdCBjb252ZXJzaW9ucworICAgICAge0wiIiwgLTF9LAorICAgICAge0wiZCIsIC0xfSwKKworICAgICAgLy8gU2ltcGxlIGNhc2VzCisgICAgICB7TCIlZCIsIFVUSUxfSU5UfSwKKyAgICAgIHtMIiV4IiwgVVRJTF9JTlR9LAorICAgICAge0wiJWYiLCBVVElMX0RPVUJMRX0sCisgICAgICB7TCIlcyIsIFVUSUxfU1RSSU5HfSwKKworICAgICAgLy8gbkRlY1NlcCBOb3QgaW1wbGVtZW50ZWQKKyAgICAgIC8vIHtMIiUsMGQiLCBVVElMX0lOVH0sCisgICAgICAvLyB7TCIlLDFkIiwgVVRJTF9JTlR9LAorICAgICAgLy8ge0wiJSwyZCIsIFVUSUxfSU5UfSwKKyAgICAgIC8vIHtMIiUsM2QiLCBVVElMX0lOVH0sCisgICAgICAvLyB7TCIlLDRkIiwgLTF9LAorICAgICAgLy8ge0wiJSxkIiwgLTF9LAorCisgICAgICAvLyBjRmxhZ3MoIisgMCMiIikgYXJlIG9ubHkgdmFsaWQgZm9yIG51bWVyaWMgY29udmVyc2lvbnMuCisgICAgICB7TCIlK2QiLCBVVElMX0lOVH0sCisgICAgICB7TCIlK3giLCBVVElMX0lOVH0sCisgICAgICB7TCIlK2YiLCBVVElMX0RPVUJMRX0sCisgICAgICAvLyB7TCIlK3MiLCAtMX0sCisgICAgICB7TCIlIGQiLCBVVElMX0lOVH0sCisgICAgICB7TCIlIHgiLCBVVElMX0lOVH0sCisgICAgICB7TCIlIGYiLCBVVElMX0RPVUJMRX0sCisgICAgICAvLyB7TCIlIHMiLCAtMX0sCisgICAgICB7TCIlMGQiLCBVVElMX0lOVH0sCisgICAgICB7TCIlMHgiLCBVVElMX0lOVH0sCisgICAgICB7TCIlMGYiLCBVVElMX0RPVUJMRX0sCisgICAgICAvLyB7TCIlMHMiLCAtMX0sCisgICAgICB7TCIlI2QiLCBVVElMX0lOVH0sCisgICAgICB7TCIlI3giLCBVVElMX0lOVH0sCisgICAgICB7TCIlI2YiLCBVVElMX0RPVUJMRX0sCisgICAgICAvLyB7TCIlI3MiLCAtMX0sCisKKyAgICAgIC8vIG5XaWR0aCBzaG91bGQgd29yay4gZm9yIGFsbCBjb252ZXJzaW9ucywgY2FuIGJlIGNvbWJpbmVkIHdpdGggY0ZsYWdzPTAKKyAgICAgIC8vIGZvciBudW1iZXJzLgorICAgICAge0wiJTVkIiwgVVRJTF9JTlR9LAorICAgICAge0wiJTA1ZCIsIFVUSUxfSU5UfSwKKyAgICAgIHtMIiU1eCIsIFVUSUxfSU5UfSwKKyAgICAgIHtMIiUwNXgiLCBVVElMX0lOVH0sCisgICAgICB7TCIlNWYiLCBVVElMX0RPVUJMRX0sCisgICAgICB7TCIlMDVmIiwgVVRJTF9ET1VCTEV9LAorICAgICAge0wiJTVzIiwgVVRJTF9TVFJJTkd9LAorICAgICAgLy8ge0wiJTA1cyIsIC0xfSwKKworICAgICAgLy8gblByZWNpc2lvbiBzaG91bGQgb25seSB3b3JrIGZvciBmbG9hdAorICAgICAgLy8ge0wiJS41ZCIsIC0xfSwKKyAgICAgIC8vIHtMIiUuNXgiLCAtMX0sCisgICAgICB7TCIlLjVmIiwgVVRJTF9ET1VCTEV9LAorICAgICAgLy8ge0wiJS41cyIsIC0xfSwKKyAgICAgIC8vIHtMIiUuMTRkIiwgLTF9LAorICAgICAgLy8ge0wiJS4xNHgiLCAtMX0sCisgICAgICB7TCIlLjE0ZiIsIFVUSUxfRE9VQkxFfSwKKyAgICAgIC8vIHtMIiUuMTRzIiwgLTF9LAorICAgICAgLy8ge0wiJS5mIiwgLTF9LAorCisgICAgICAvLyBTZWUgaHR0cHM6Ly9jcmJ1Zy5jb20vNzQwMTY2CisgICAgICAvLyBuUHJlY2lzaW9uIHRvbyBsYXJnZSAoPiAyNjApIGNhdXNlcyBjcmFzaGVzIGluIFdpbmRvd3MuCisgICAgICAvLyBBdm9pZCB0aGlzIGJ5IGxpbWl0aW5nIHRvIHR3byBkaWdpdHMKKyAgICAgIHtMIiUuMWQiLCBVVElMX0lOVH0sCisgICAgICB7TCIlLjEwZCIsIFVUSUxfSU5UfSwKKyAgICAgIHtMIiUuMTAwZCIsIC0xfSwKKworICAgICAgLy8gVW5leHBlY3RlZCBjaGFyYWN0ZXJzCisgICAgICB7TCIlYWQiLCAtMX0sCisgICAgICB7TCIlYngiLCAtMX0sCisgICAgICAvLyB7TCIlY2YiLCAtMX0sCisgICAgICAvLyB7TCIlZXMiLCAtMX0sCisgICAgICAvLyB7TCIlZ2QiLCAtMX0sCisgICAgICB7TCIlaHgiLCAtMX0sCisgICAgICAvLyB7TCIlaWYiLCAtMX0sCisgICAgICB7TCIlanMiLCAtMX0sCisgICAgICB7TCIlQGQiLCAtMX0sCisgICAgICB7TCIlfngiLCAtMX0sCisgICAgICB7TCIlW2YiLCAtMX0sCisgICAgICB7TCIlXDBzIiwgLTF9LAorICAgICAge0wiJVxuZCIsIC0xfSwKKyAgICAgIHtMIiVccngiLCAtMX0sCisgICAgICAvLyB7TCIlJWYiLCAtMX0sCisgICAgICAvLyB7TCIlICBzIiwgLTF9LAorCisgICAgICAvLyBDb21iaW5lIG11bHRpcGxlIHZhbGlkIGNvbXBvbmVudHMKKyAgICAgIHtMIiUrNmQiLCBVVElMX0lOVH0sCisgICAgICB7TCIlIDd4IiwgVVRJTF9JTlR9LAorICAgICAge0wiJSM5LjNmIiwgVVRJTF9ET1VCTEV9LAorICAgICAge0wiJTEwcyIsIFVUSUxfU1RSSU5HfSwKKyAgfTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShjYXNlcyk7IGkrKykgeworICAgIHN0ZDo6d3N0cmluZyBpbnB1dChjYXNlc1tpXS5pbnB1dF9zdHJpbmcpOworICAgIEVYUEVDVF9FUShjYXNlc1tpXS5leHBlY3RlZCwgdXRpbDo6UGFyc2VEYXRhVHlwZSgmaW5wdXQpKQorICAgICAgICA8PCBjYXNlc1tpXS5pbnB1dF9zdHJpbmc7CisgIH0KK30KZGlmZiAtLWdpdCBhL2Z4anMvY2pzX3Y4LmNwcCBiL2Z4anMvY2pzX3Y4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjc3ZWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfdjguY3BwCkBAIC0wLDAgKzEsMjQxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL2Nqc192OC5oIgorCisjaWZkZWYgUERGX0VOQUJMRV9YRkEKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV9jb250ZXh0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb2JqZWN0LmgiCisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKK0NKU19WODo6Q0pTX1Y4KHY4OjpJc29sYXRlKiBpc29sYXRlKSA6IG1faXNvbGF0ZShpc29sYXRlKSB7fQorCitDSlNfVjg6On5DSlNfVjgoKSB7CisgIG1fVjhQZXJzaXN0ZW50Q29udGV4dC5SZXNldCgpOworfQorCit2ODo6TG9jYWw8djg6OlZhbHVlPiBDSlNfVjg6OkdldE9iamVjdFByb3BlcnR5KAorICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAorICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzUHJvcGVydHlOYW1lKSB7CisgIGlmIChwT2JqLklzRW1wdHkoKSkKKyAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsOworICBpZiAoIXBPYmotPkdldChtX2lzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgIE5ld1N0cmluZyh3c1Byb3BlcnR5TmFtZS5Bc1N0cmluZ1ZpZXcoKSkpCisgICAgICAgICAgIC5Ub0xvY2FsKCZ2YWwpKQorICAgIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOworICByZXR1cm4gdmFsOworfQorCitzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nPiBDSlNfVjg6OkdldE9iamVjdFByb3BlcnR5TmFtZXMoCisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmopIHsKKyAgaWYgKHBPYmouSXNFbXB0eSgpKQorICAgIHJldHVybiBzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nPigpOworCisgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IHZhbDsKKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gbV9pc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOworICBpZiAoIXBPYmotPkdldFByb3BlcnR5TmFtZXMoY29udGV4dCkuVG9Mb2NhbCgmdmFsKSkKKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8V2lkZVN0cmluZz4oKTsKKworICBzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nPiByZXN1bHQ7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB2YWwtPkxlbmd0aCgpOyArK2kpIHsKKyAgICByZXN1bHQucHVzaF9iYWNrKFRvV2lkZVN0cmluZyh2YWwtPkdldChjb250ZXh0LCBpKS5Ub0xvY2FsQ2hlY2tlZCgpKSk7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIENKU19WODo6UHV0T2JqZWN0UHJvcGVydHkodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NQcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFB1dCkgeworICBpZiAocE9iai5Jc0VtcHR5KCkpCisgICAgcmV0dXJuOworICBwT2JqLT5TZXQobV9pc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpLAorICAgICAgICAgICAgTmV3U3RyaW5nKHdzUHJvcGVydHlOYW1lLkFzU3RyaW5nVmlldygpKSwgcFB1dCkKKyAgICAgIC5Gcm9tSnVzdCgpOworfQorCit2ODo6TG9jYWw8djg6OkFycmF5PiBDSlNfVjg6Ok5ld0FycmF5KCkgeworICByZXR1cm4gdjg6OkFycmF5OjpOZXcobV9pc29sYXRlKTsKK30KKwordW5zaWduZWQgQ0pTX1Y4OjpQdXRBcnJheUVsZW1lbnQodjg6OkxvY2FsPHY4OjpBcnJheT4gcEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpIHsKKyAgaWYgKHBBcnJheS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIDA7CisgIGlmIChwQXJyYXktPlNldChtX2lzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCksIGluZGV4LCBwVmFsdWUpLklzTm90aGluZygpKQorICAgIHJldHVybiAwOworICByZXR1cm4gMTsKK30KKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gQ0pTX1Y4OjpHZXRBcnJheUVsZW1lbnQodjg6OkxvY2FsPHY4OjpBcnJheT4gcEFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW5kZXgpIHsKKyAgaWYgKHBBcnJheS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7CisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbDsKKyAgaWYgKCFwQXJyYXktPkdldChtX2lzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCksIGluZGV4KS5Ub0xvY2FsKCZ2YWwpKQorICAgIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOworICByZXR1cm4gdmFsOworfQorCit1bnNpZ25lZCBDSlNfVjg6OkdldEFycmF5TGVuZ3RoKHY4OjpMb2NhbDx2ODo6QXJyYXk+IHBBcnJheSkgeworICBpZiAocEFycmF5LklzRW1wdHkoKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIHBBcnJheS0+TGVuZ3RoKCk7Cit9CisKK3Y4OjpMb2NhbDx2ODo6Q29udGV4dD4gQ0pTX1Y4OjpOZXdMb2NhbENvbnRleHQoKSB7CisgIHJldHVybiB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcobV9pc29sYXRlLCBtX1Y4UGVyc2lzdGVudENvbnRleHQpOworfQorCit2ODo6TG9jYWw8djg6OkNvbnRleHQ+IENKU19WODo6R2V0UGVyc2lzdGVudENvbnRleHQoKSB7CisgIHJldHVybiBtX1Y4UGVyc2lzdGVudENvbnRleHQuR2V0KG1faXNvbGF0ZSk7Cit9CisKK3Y4OjpMb2NhbDx2ODo6TnVtYmVyPiBDSlNfVjg6Ok5ld051bWJlcihpbnQgbnVtYmVyKSB7CisgIHJldHVybiB2ODo6SW50MzI6Ok5ldyhtX2lzb2xhdGUsIG51bWJlcik7Cit9CisKK3Y4OjpMb2NhbDx2ODo6TnVtYmVyPiBDSlNfVjg6Ok5ld051bWJlcihkb3VibGUgbnVtYmVyKSB7CisgIHJldHVybiB2ODo6TnVtYmVyOjpOZXcobV9pc29sYXRlLCBudW1iZXIpOworfQorCit2ODo6TG9jYWw8djg6Ok51bWJlcj4gQ0pTX1Y4OjpOZXdOdW1iZXIoZmxvYXQgbnVtYmVyKSB7CisgIHJldHVybiB2ODo6TnVtYmVyOjpOZXcobV9pc29sYXRlLCAoZmxvYXQpbnVtYmVyKTsKK30KKwordjg6OkxvY2FsPHY4OjpCb29sZWFuPiBDSlNfVjg6Ok5ld0Jvb2xlYW4oYm9vbCBiKSB7CisgIHJldHVybiB2ODo6Qm9vbGVhbjo6TmV3KG1faXNvbGF0ZSwgYik7Cit9CisKK3Y4OjpMb2NhbDx2ODo6U3RyaW5nPiBDSlNfVjg6Ok5ld1N0cmluZyhjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyKSB7CisgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IG1faXNvbGF0ZSA/IG1faXNvbGF0ZSA6IHY4OjpJc29sYXRlOjpHZXRDdXJyZW50KCk7CisgIHJldHVybiB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgc3RyLnVudGVybWluYXRlZF9jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwsIHN0ci5HZXRMZW5ndGgoKSkKKyAgICAgIC5Ub0xvY2FsQ2hlY2tlZCgpOworfQorCit2ODo6TG9jYWw8djg6OlN0cmluZz4gQ0pTX1Y4OjpOZXdTdHJpbmcoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHN0cikgeworICAvLyBDb252ZXJzaW9uIGZyb20gcGRmaXVtJ3Mgd2NoYXJfdCB3aWRlLXN0cmluZ3MgdG8gdjgncyB1aW50MTZfdAorICAvLyB3aWRlLXN0cmluZ3MgaXNuJ3QgaGFuZGxlZCBieSB2OCwgc28gdXNlIFVURjggYXMgYSBjb21tb24KKyAgLy8gaW50ZXJtZWRpYXRlIGZvcm1hdC4KKyAgcmV0dXJuIE5ld1N0cmluZyhGWF9VVEY4RW5jb2RlKHN0cikuQXNTdHJpbmdWaWV3KCkpOworfQorCit2ODo6TG9jYWw8djg6OlZhbHVlPiBDSlNfVjg6Ok5ld051bGwoKSB7CisgIHJldHVybiB2ODo6TnVsbChtX2lzb2xhdGUpOworfQorCit2ODo6TG9jYWw8djg6OlZhbHVlPiBDSlNfVjg6Ok5ld1VuZGVmaW5lZCgpIHsKKyAgcmV0dXJuIHY4OjpVbmRlZmluZWQobV9pc29sYXRlKTsKK30KKwordjg6OkxvY2FsPHY4OjpEYXRlPiBDSlNfVjg6Ok5ld0RhdGUoZG91YmxlIGQpIHsKKyAgcmV0dXJuIHY4OjpEYXRlOjpOZXcobV9pc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpLCBkKQorICAgICAgLlRvTG9jYWxDaGVja2VkKCkKKyAgICAgIC5Bczx2ODo6RGF0ZT4oKTsKK30KKworaW50IENKU19WODo6VG9JbnQzMih2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpIHsKKyAgaWYgKHBWYWx1ZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIDA7CisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IG1faXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKTsKKyAgdjg6Ok1heWJlTG9jYWw8djg6OkludDMyPiBtYXliZV9pbnQzMiA9IHBWYWx1ZS0+VG9JbnQzMihjb250ZXh0KTsKKyAgaWYgKG1heWJlX2ludDMyLklzRW1wdHkoKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIG1heWJlX2ludDMyLlRvTG9jYWxDaGVja2VkKCktPlZhbHVlKCk7Cit9CisKK2Jvb2wgQ0pTX1Y4OjpUb0Jvb2xlYW4odjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKSB7CisgIGlmIChwVmFsdWUuSXNFbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gbV9pc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOworICB2ODo6TWF5YmVMb2NhbDx2ODo6Qm9vbGVhbj4gbWF5YmVfYm9vbGVhbiA9IHBWYWx1ZS0+VG9Cb29sZWFuKGNvbnRleHQpOworICBpZiAobWF5YmVfYm9vbGVhbi5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gbWF5YmVfYm9vbGVhbi5Ub0xvY2FsQ2hlY2tlZCgpLT5WYWx1ZSgpOworfQorCitkb3VibGUgQ0pTX1Y4OjpUb0RvdWJsZSh2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpIHsKKyAgaWYgKHBWYWx1ZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIDAuMDsKKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gbV9pc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOworICB2ODo6TWF5YmVMb2NhbDx2ODo6TnVtYmVyPiBtYXliZV9udW1iZXIgPSBwVmFsdWUtPlRvTnVtYmVyKGNvbnRleHQpOworICBpZiAobWF5YmVfbnVtYmVyLklzRW1wdHkoKSkKKyAgICByZXR1cm4gMC4wOworICByZXR1cm4gbWF5YmVfbnVtYmVyLlRvTG9jYWxDaGVja2VkKCktPlZhbHVlKCk7Cit9CisKK1dpZGVTdHJpbmcgQ0pTX1Y4OjpUb1dpZGVTdHJpbmcodjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKSB7CisgIGlmIChwVmFsdWUuSXNFbXB0eSgpKQorICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CisgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IG1faXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKTsKKyAgdjg6Ok1heWJlTG9jYWw8djg6OlN0cmluZz4gbWF5YmVfc3RyaW5nID0gcFZhbHVlLT5Ub1N0cmluZyhjb250ZXh0KTsKKyAgaWYgKG1heWJlX3N0cmluZy5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKKyAgdjg6OlN0cmluZzo6VXRmOFZhbHVlIHMobV9pc29sYXRlLCBtYXliZV9zdHJpbmcuVG9Mb2NhbENoZWNrZWQoKSk7CisgIHJldHVybiBXaWRlU3RyaW5nOjpGcm9tVVRGOChCeXRlU3RyaW5nVmlldygqcywgcy5sZW5ndGgoKSkpOworfQorCitCeXRlU3RyaW5nIENKU19WODo6VG9CeXRlU3RyaW5nKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSkgeworICBpZiAocFZhbHVlLklzRW1wdHkoKSkKKyAgICByZXR1cm4gQnl0ZVN0cmluZygpOworICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBtX2lzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7CisgIHY4OjpNYXliZUxvY2FsPHY4OjpTdHJpbmc+IG1heWJlX3N0cmluZyA9IHBWYWx1ZS0+VG9TdHJpbmcoY29udGV4dCk7CisgIGlmIChtYXliZV9zdHJpbmcuSXNFbXB0eSgpKQorICAgIHJldHVybiBCeXRlU3RyaW5nKCk7CisgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBzKG1faXNvbGF0ZSwgbWF5YmVfc3RyaW5nLlRvTG9jYWxDaGVja2VkKCkpOworICByZXR1cm4gQnl0ZVN0cmluZygqcyk7Cit9CisKK3Y4OjpMb2NhbDx2ODo6T2JqZWN0PiBDSlNfVjg6OlRvT2JqZWN0KHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSkgeworICBpZiAocFZhbHVlLklzRW1wdHkoKSB8fCAhcFZhbHVlLT5Jc09iamVjdCgpKQorICAgIHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKTsKKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gbV9pc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOworICByZXR1cm4gcFZhbHVlLT5Ub09iamVjdChjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpOworfQorCit2ODo6TG9jYWw8djg6OkFycmF5PiBDSlNfVjg6OlRvQXJyYXkodjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKSB7CisgIGlmIChwVmFsdWUuSXNFbXB0eSgpIHx8ICFwVmFsdWUtPklzQXJyYXkoKSkKKyAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpBcnJheT4oKTsKKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gbV9pc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOworICByZXR1cm4gdjg6OkxvY2FsPHY4OjpBcnJheT46OkNhc3QocFZhbHVlLT5Ub09iamVjdChjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpKTsKK30KKwordm9pZCBDSlNfVjg6OlNldENvbnN0QXJyYXkoY29uc3QgV2lkZVN0cmluZyYgbmFtZSwgdjg6OkxvY2FsPHY4OjpBcnJheT4gYXJyYXkpIHsKKyAgbV9Db25zdEFycmF5c1tuYW1lXSA9IHY4OjpHbG9iYWw8djg6OkFycmF5PihHZXRJc29sYXRlKCksIGFycmF5KTsKK30KKwordjg6OkxvY2FsPHY4OjpBcnJheT4gQ0pTX1Y4OjpHZXRDb25zdEFycmF5KGNvbnN0IFdpZGVTdHJpbmcmIG5hbWUpIHsKKyAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6QXJyYXk+OjpOZXcoR2V0SXNvbGF0ZSgpLCBtX0NvbnN0QXJyYXlzW25hbWVdKTsKK30KKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCitDWEZBX09iamVjdCogQ0pTX1Y4OjpUb1hGQU9iamVjdCh2ODo6TG9jYWw8djg6OlZhbHVlPiBvYmopIHsKKyAgQVNTRVJUKCFvYmouSXNFbXB0eSgpKTsKKworICBpZiAoIW9iai0+SXNPYmplY3QoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBDRlhKU0VfSG9zdE9iamVjdCogaG9zdE9iaiA9CisgICAgICBGWEpTRV9SZXRyaWV2ZU9iamVjdEJpbmRpbmcob2JqLkFzPHY4OjpPYmplY3Q+KCksIG51bGxwdHIpOworICBpZiAoIWhvc3RPYmogfHwgaG9zdE9iai0+dHlwZSgpICE9IENGWEpTRV9Ib3N0T2JqZWN0OjprWEZBKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9PYmplY3QqPihob3N0T2JqKTsKK30KKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gQ0pTX1Y4OjpOZXdYRkFPYmplY3QoCisgICAgQ1hGQV9PYmplY3QqIG9iaiwKKyAgICB2ODo6R2xvYmFsPHY4OjpGdW5jdGlvblRlbXBsYXRlPiYgdG1wbCkgeworICB2ODo6RXNjYXBhYmxlSGFuZGxlU2NvcGUgc2NvcGUobV9pc29sYXRlKTsKKyAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBrbGFzcyA9CisgICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+OjpOZXcobV9pc29sYXRlLCB0bXBsKTsKKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iamVjdCA9IGtsYXNzLT5JbnN0YW5jZVRlbXBsYXRlKCktPk5ld0luc3RhbmNlKCk7CisgIEZYSlNFX1VwZGF0ZU9iamVjdEJpbmRpbmcob2JqZWN0LCBvYmopOworICByZXR1cm4gc2NvcGUuRXNjYXBlKG9iamVjdCk7Cit9CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCmRpZmYgLS1naXQgYS9meGpzL2Nqc192OC5oIGIvZnhqcy9janNfdjguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzlkMjM2Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfdjguaApAQCAtMCwwICsxLDkzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19DSlNfVjhfSF8KKyNkZWZpbmUgRlhKU19DSlNfVjhfSF8KKworI2luY2x1ZGUgPHY4LXV0aWwuaD4KKyNpbmNsdWRlIDx2OC5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvYnl0ZXN0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC93aWRlc3RyaW5nLmgiCisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorY2xhc3MgQ1hGQV9PYmplY3Q7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKK2NsYXNzIENKU19WOCB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlNfVjgodjg6Oklzb2xhdGUqIHBJc29sYXRlKTsKKyAgdmlydHVhbCB+Q0pTX1Y4KCk7CisKKyAgdjg6Oklzb2xhdGUqIEdldElzb2xhdGUoKSBjb25zdCB7IHJldHVybiBtX2lzb2xhdGU7IH0KKworICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IE5ld0xvY2FsQ29udGV4dCgpOworICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IEdldFBlcnNpc3RlbnRDb250ZXh0KCk7CisKKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gTmV3TnVsbCgpOworICB2ODo6TG9jYWw8djg6OlZhbHVlPiBOZXdVbmRlZmluZWQoKTsKKyAgdjg6OkxvY2FsPHY4OjpBcnJheT4gTmV3QXJyYXkoKTsKKyAgdjg6OkxvY2FsPHY4OjpOdW1iZXI+IE5ld051bWJlcihpbnQgbnVtYmVyKTsKKyAgdjg6OkxvY2FsPHY4OjpOdW1iZXI+IE5ld051bWJlcihkb3VibGUgbnVtYmVyKTsKKyAgdjg6OkxvY2FsPHY4OjpOdW1iZXI+IE5ld051bWJlcihmbG9hdCBudW1iZXIpOworICB2ODo6TG9jYWw8djg6OkJvb2xlYW4+IE5ld0Jvb2xlYW4oYm9vbCBiKTsKKyAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IE5ld1N0cmluZyhjb25zdCBCeXRlU3RyaW5nVmlldyYgc3RyKTsKKyAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IE5ld1N0cmluZyhjb25zdCBXaWRlU3RyaW5nVmlldyYgc3RyKTsKKyAgdjg6OkxvY2FsPHY4OjpEYXRlPiBOZXdEYXRlKGRvdWJsZSBkKTsKKworICBpbnQgVG9JbnQzMih2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpOworICBib29sIFRvQm9vbGVhbih2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpOworICBkb3VibGUgVG9Eb3VibGUodjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKTsKKyAgV2lkZVN0cmluZyBUb1dpZGVTdHJpbmcodjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKTsKKyAgQnl0ZVN0cmluZyBUb0J5dGVTdHJpbmcodjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKTsKKyAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IFRvT2JqZWN0KHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSk7CisgIHY4OjpMb2NhbDx2ODo6QXJyYXk+IFRvQXJyYXkodjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKTsKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIENYRkFfT2JqZWN0KiBUb1hGQU9iamVjdCh2ODo6TG9jYWw8djg6OlZhbHVlPiBvYmopOworICB2ODo6TG9jYWw8djg6OlZhbHVlPiBOZXdYRkFPYmplY3QoQ1hGQV9PYmplY3QqIG9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpHbG9iYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+JiB0bXBsKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworICAvLyBBcnJheXMuCisgIHVuc2lnbmVkIEdldEFycmF5TGVuZ3RoKHY4OjpMb2NhbDx2ODo6QXJyYXk+IHBBcnJheSk7CisgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IEdldEFycmF5RWxlbWVudCh2ODo6TG9jYWw8djg6OkFycmF5PiBwQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbmRleCk7CisgIHVuc2lnbmVkIFB1dEFycmF5RWxlbWVudCh2ODo6TG9jYWw8djg6OkFycmF5PiBwQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSk7CisKKyAgdm9pZCBTZXRDb25zdEFycmF5KGNvbnN0IFdpZGVTdHJpbmcmIG5hbWUsIHY4OjpMb2NhbDx2ODo6QXJyYXk+IGFycmF5KTsKKyAgdjg6OkxvY2FsPHY4OjpBcnJheT4gR2V0Q29uc3RBcnJheShjb25zdCBXaWRlU3RyaW5nJiBuYW1lKTsKKworICAvLyBPYmplY3RzLgorICBzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nPiBHZXRPYmplY3RQcm9wZXJ0eU5hbWVzKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKTsKKyAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gR2V0T2JqZWN0UHJvcGVydHkodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIFByb3BlcnR5TmFtZSk7CisgIHZvaWQgUHV0T2JqZWN0UHJvcGVydHkodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgUHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSk7CisKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgU2V0SXNvbGF0ZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUpIHsgbV9pc29sYXRlID0gcElzb2xhdGU7IH0KKyAgdm9pZCBDbGVhckNvbnN0QXJyYXkoKSB7IG1fQ29uc3RBcnJheXMuY2xlYXIoKTsgfQorCisgIHZvaWQgUmVzZXRQZXJzaXN0ZW50Q29udGV4dCh2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQpIHsKKyAgICBtX1Y4UGVyc2lzdGVudENvbnRleHQuUmVzZXQobV9pc29sYXRlLCBjb250ZXh0KTsKKyAgfQorICB2b2lkIFJlbGVhc2VQZXJzaXN0ZW50Q29udGV4dCgpIHsgbV9WOFBlcnNpc3RlbnRDb250ZXh0LlJlc2V0KCk7IH0KKworIHByaXZhdGU6CisgIHY4OjpJc29sYXRlKiBtX2lzb2xhdGU7CisgIHN0ZDo6bWFwPFdpZGVTdHJpbmcsIHY4OjpHbG9iYWw8djg6OkFycmF5Pj4gbV9Db25zdEFycmF5czsKKyAgdjg6Okdsb2JhbDx2ODo6Q29udGV4dD4gbV9WOFBlcnNpc3RlbnRDb250ZXh0OworfTsKKworI2VuZGlmICAvLyBGWEpTX0NKU19WOF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy9janNfem9vbXR5cGUuY3BwIGIvZnhqcy9janNfem9vbXR5cGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOGJiYTAKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL2Nqc196b29tdHlwZS5jcHAKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy9janNfem9vbXR5cGUuaCIKKworY29uc3QgSlNDb25zdFNwZWMgQ0pTX1pvb210eXBlOjpDb25zdFNwZWNzW10gPSB7CisgICAgeyJub25lIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgIk5vVmFyeSJ9LAorICAgIHsiZml0UCIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJGaXRQYWdlIn0sCisgICAgeyJmaXRXIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgIkZpdFdpZHRoIn0sCisgICAgeyJmaXRIIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgIkZpdEhlaWdodCJ9LAorICAgIHsiZml0ViIsIEpTQ29uc3RTcGVjOjpTdHJpbmcsIDAsICJGaXRWaXNpYmxlV2lkdGgifSwKKyAgICB7InByZWYiLCBKU0NvbnN0U3BlYzo6U3RyaW5nLCAwLCAiUHJlZmVycmVkIn0sCisgICAgeyJyZWZXIiwgSlNDb25zdFNwZWM6OlN0cmluZywgMCwgIlJlZmxvd1dpZHRoIn19OworCitpbnQgQ0pTX1pvb210eXBlOjpPYmpEZWZuSUQgPSAtMTsKKworLy8gc3RhdGljCit2b2lkIENKU19ab29tdHlwZTo6RGVmaW5lSlNPYmplY3RzKENGWEpTX0VuZ2luZSogcEVuZ2luZSkgeworICBPYmpEZWZuSUQgPQorICAgICAgcEVuZ2luZS0+RGVmaW5lT2JqKCJ6b29tdHlwZSIsIEZYSlNPQkpUWVBFX1NUQVRJQywgbnVsbHB0ciwgbnVsbHB0cik7CisgIERlZmluZUNvbnN0cyhwRW5naW5lLCBPYmpEZWZuSUQsIENvbnN0U3BlY3MsIEZYX0FycmF5U2l6ZShDb25zdFNwZWNzKSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL2Nqc196b29tdHlwZS5oIGIvZnhqcy9janNfem9vbXR5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGRiMGE0Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9janNfem9vbXR5cGUuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19DSlNfWk9PTVRZUEVfSF8KKyNkZWZpbmUgRlhKU19DSlNfWk9PTVRZUEVfSF8KKworI2luY2x1ZGUgImZ4anMvSlNfRGVmaW5lLmgiCisKK2NsYXNzIENKU19ab29tdHlwZSA6IHB1YmxpYyBDSlNfT2JqZWN0IHsKKyBwdWJsaWM6CisgIHN0YXRpYyB2b2lkIERlZmluZUpTT2JqZWN0cyhDRlhKU19FbmdpbmUqIHBFbmdpbmUpOworCisgIGV4cGxpY2l0IENKU19ab29tdHlwZSh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iamVjdCkgOiBDSlNfT2JqZWN0KHBPYmplY3QpIHt9CisgIH5DSlNfWm9vbXR5cGUoKSBvdmVycmlkZSB7fQorCisgcHJpdmF0ZToKKyAgc3RhdGljIGludCBPYmpEZWZuSUQ7CisgIHN0YXRpYyBjb25zdCBKU0NvbnN0U3BlYyBDb25zdFNwZWNzW107Cit9OworCisjZW5kaWYgIC8vIEZYSlNfQ0pTX1pPT01UWVBFX0hfCmRpZmYgLS1naXQgYS9meGpzL2Z4anNfdjguY3BwIGIvZnhqcy9meGpzX3Y4LmNwcAppbmRleCBiMGUxYTFiLi41MDM0NWNmIDEwMDY0NAotLS0gYS9meGpzL2Z4anNfdjguY3BwCisrKyBiL2Z4anMvZnhqc192OC5jcHAKQEAgLTgsNyArOCw3IEBACiAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jYXRvci9wYXJ0aXRpb25fYWxsb2MuaCIKIAogLy8gS2VlcCB0aGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgdmFsdWVzIGRlZmluZWQgaW4gZ2luL3B1YmxpYy9jb250ZXh0X2hvbGRlci5oCiAvLyAod2l0aG91dCBhY3R1YWxseSByZXF1aXJpbmcgYSBkZXBlbmRlbmN5IG9uIGdpbiBpdHNlbGYgZm9yIHRoZSBzdGFuZGFsb25lCkBAIC0xNDQsMTUgKzE0NCwyNCBAQAogfQogCiB2b2lkKiBGWEpTX0FycmF5QnVmZmVyQWxsb2NhdG9yOjpBbGxvY2F0ZShzaXplX3QgbGVuZ3RoKSB7Ci0gIHJldHVybiBjYWxsb2MoMSwgbGVuZ3RoKTsKKyAgaWYgKGxlbmd0aCA+IGtNYXhBbGxvd2VkQnl0ZXMpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHZvaWQqIHAgPSBBbGxvY2F0ZVVuaW5pdGlhbGl6ZWQobGVuZ3RoKTsKKyAgaWYgKHApCisgICAgbWVtc2V0KHAsIDAsIGxlbmd0aCk7CisgIHJldHVybiBwOwogfQogCiB2b2lkKiBGWEpTX0FycmF5QnVmZmVyQWxsb2NhdG9yOjpBbGxvY2F0ZVVuaW5pdGlhbGl6ZWQoc2l6ZV90IGxlbmd0aCkgewotICByZXR1cm4gbWFsbG9jKGxlbmd0aCk7CisgIGlmIChsZW5ndGggPiBrTWF4QWxsb3dlZEJ5dGVzKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gcGRmaXVtOjpiYXNlOjpQYXJ0aXRpb25BbGxvY0dlbmVyaWMoCisgICAgICBnQXJyYXlCdWZmZXJQYXJ0aXRpb25BbGxvY2F0b3Iucm9vdCgpLCBsZW5ndGgsICJGWEpTX0FycmF5QnVmZmVyIik7CiB9CiAKIHZvaWQgRlhKU19BcnJheUJ1ZmZlckFsbG9jYXRvcjo6RnJlZSh2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIGZyZWUoZGF0YSk7CisgIHBkZml1bTo6YmFzZTo6UGFydGl0aW9uRnJlZUdlbmVyaWMoZ0FycmF5QnVmZmVyUGFydGl0aW9uQWxsb2NhdG9yLnJvb3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKTsKIH0KIAogdm9pZCBWOFRlbXBsYXRlTWFwVHJhaXRzOjpEaXNwb3NlKHY4OjpJc29sYXRlKiBpc29sYXRlLApAQCAtMTYxLDE1ICsxNzAsMTYgQEAKICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iaiA9IHZhbHVlLkdldChpc29sYXRlKTsKICAgaWYgKG9iai5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuOwotICBDRlhKU19FbmdpbmUqIHBFbmdpbmUgPSBDRlhKU19FbmdpbmU6OkN1cnJlbnRFbmdpbmVGcm9tSXNvbGF0ZShpc29sYXRlKTsKLSAgaW50IGlkID0gcEVuZ2luZS0+R2V0T2JqRGVmbklEKG9iaik7CisgIGludCBpZCA9IENGWEpTX0VuZ2luZTo6R2V0T2JqRGVmbklEKG9iaik7CiAgIGlmIChpZCA9PSAtMSkKICAgICByZXR1cm47CiAgIENGWEpTX09iakRlZmluaXRpb24qIHBPYmpEZWYgPSBDRlhKU19PYmpEZWZpbml0aW9uOjpGb3JJRChpc29sYXRlLCBpZCk7CiAgIGlmICghcE9iakRlZikKICAgICByZXR1cm47Ci0gIGlmIChwT2JqRGVmLT5tX3BEZXN0cnVjdG9yKQotICAgIHBPYmpEZWYtPm1fcERlc3RydWN0b3IocEVuZ2luZSwgb2JqKTsKKyAgaWYgKHBPYmpEZWYtPm1fcERlc3RydWN0b3IpIHsKKyAgICBwT2JqRGVmLT5tX3BEZXN0cnVjdG9yKENGWEpTX0VuZ2luZTo6Q3VycmVudEVuZ2luZUZyb21Jc29sYXRlKGlzb2xhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqKTsKKyAgfQogICBDRlhKU19FbmdpbmU6OkZyZWVPYmplY3RQcml2YXRlKG9iaik7CiB9CiAKQEAgLTI0NCwxMyArMjU0LDExIEBACiBGWEpTX1Blcklzb2xhdGVEYXRhOjpGWEpTX1Blcklzb2xhdGVEYXRhKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkKICAgICA6IG1fcER5bmFtaWNPYmpzTWFwKG5ldyBWOFRlbXBsYXRlTWFwKHBJc29sYXRlKSkge30KIAotQ0ZYSlNfRW5naW5lOjpDRlhKU19FbmdpbmUoKSA6IG1faXNvbGF0ZShudWxscHRyKSB7fQorQ0ZYSlNfRW5naW5lOjpDRlhKU19FbmdpbmUoKSA6IENKU19WOChudWxscHRyKSB7fQogCi1DRlhKU19FbmdpbmU6OkNGWEpTX0VuZ2luZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUpIDogbV9pc29sYXRlKHBJc29sYXRlKSB7fQorQ0ZYSlNfRW5naW5lOjpDRlhKU19FbmdpbmUodjg6Oklzb2xhdGUqIHBJc29sYXRlKSA6IENKU19WOChwSXNvbGF0ZSkge30KIAotQ0ZYSlNfRW5naW5lOjp+Q0ZYSlNfRW5naW5lKCkgewotICBtX1Y4UGVyc2lzdGVudENvbnRleHQuUmVzZXQoKTsKLX0KK0NGWEpTX0VuZ2luZTo6fkNGWEpTX0VuZ2luZSgpID0gZGVmYXVsdDsKIAogLy8gc3RhdGljCiBDRlhKU19FbmdpbmUqIENGWEpTX0VuZ2luZTo6Q3VycmVudEVuZ2luZUZyb21Jc29sYXRlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkgewpAQCAtMjgyLDQzICsyOTAsMzkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWEpTT0JKVFlQRSBlT2JqVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU19FbmdpbmU6OkNvbnN0cnVjdG9yIHBDb25zdHJ1Y3RvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU19FbmdpbmU6OkRlc3RydWN0b3IgcERlc3RydWN0b3IpIHsKLSAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUobV9pc29sYXRlKTsKLSAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShtX2lzb2xhdGUpOwotICBGWEpTX1Blcklzb2xhdGVEYXRhOjpTZXRVcChtX2lzb2xhdGUpOworICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShHZXRJc29sYXRlKCkpOworICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKEdldElzb2xhdGUoKSk7CisgIEZYSlNfUGVySXNvbGF0ZURhdGE6OlNldFVwKEdldElzb2xhdGUoKSk7CiAgIENGWEpTX09iakRlZmluaXRpb24qIHBPYmpEZWYgPSBuZXcgQ0ZYSlNfT2JqRGVmaW5pdGlvbigKLSAgICAgIG1faXNvbGF0ZSwgc09iak5hbWUsIGVPYmpUeXBlLCBwQ29uc3RydWN0b3IsIHBEZXN0cnVjdG9yKTsKKyAgICAgIEdldElzb2xhdGUoKSwgc09iak5hbWUsIGVPYmpUeXBlLCBwQ29uc3RydWN0b3IsIHBEZXN0cnVjdG9yKTsKICAgcmV0dXJuIHBPYmpEZWYtPkFzc2lnbklEKCk7CiB9CiAKIHZvaWQgQ0ZYSlNfRW5naW5lOjpEZWZpbmVPYmpNZXRob2QoaW50IG5PYmpEZWZuSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNNZXRob2ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6RnVuY3Rpb25DYWxsYmFjayBwTWV0aG9kQ2FsbCkgewotICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShtX2lzb2xhdGUpOwotICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKG1faXNvbGF0ZSk7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKEdldElzb2xhdGUoKSk7CisgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoR2V0SXNvbGF0ZSgpKTsKICAgQ0ZYSlNfT2JqRGVmaW5pdGlvbiogcE9iakRlZiA9Ci0gICAgICBDRlhKU19PYmpEZWZpbml0aW9uOjpGb3JJRChtX2lzb2xhdGUsIG5PYmpEZWZuSUQpOworICAgICAgQ0ZYSlNfT2JqRGVmaW5pdGlvbjo6Rm9ySUQoR2V0SXNvbGF0ZSgpLCBuT2JqRGVmbklEKTsKICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBmdW4gPSB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KAotICAgICAgbV9pc29sYXRlLCBwTWV0aG9kQ2FsbCwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKSwgcE9iakRlZi0+R2V0U2lnbmF0dXJlKCkpOworICAgICAgR2V0SXNvbGF0ZSgpLCBwTWV0aG9kQ2FsbCwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKSwKKyAgICAgIHBPYmpEZWYtPkdldFNpZ25hdHVyZSgpKTsKICAgZnVuLT5SZW1vdmVQcm90b3R5cGUoKTsKLSAgcE9iakRlZi0+R2V0SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXQoCi0gICAgICB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChtX2lzb2xhdGUsIHNNZXRob2ROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwpCi0gICAgICAgICAgLlRvTG9jYWxDaGVja2VkKCksCi0gICAgICBmdW4sIHY4OjpSZWFkT25seSk7CisgIHBPYmpEZWYtPkdldEluc3RhbmNlVGVtcGxhdGUoKS0+U2V0KE5ld1N0cmluZyhzTWV0aG9kTmFtZSksIGZ1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OlJlYWRPbmx5KTsKIH0KIAogdm9pZCBDRlhKU19FbmdpbmU6OkRlZmluZU9ialByb3BlcnR5KGludCBuT2JqRGVmbklELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHNQcm9wTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6QWNjZXNzb3JHZXR0ZXJDYWxsYmFjayBwUHJvcEdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6QWNjZXNzb3JTZXR0ZXJDYWxsYmFjayBwUHJvcFB1dCkgewotICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShtX2lzb2xhdGUpOwotICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKG1faXNvbGF0ZSk7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKEdldElzb2xhdGUoKSk7CisgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoR2V0SXNvbGF0ZSgpKTsKICAgQ0ZYSlNfT2JqRGVmaW5pdGlvbiogcE9iakRlZiA9Ci0gICAgICBDRlhKU19PYmpEZWZpbml0aW9uOjpGb3JJRChtX2lzb2xhdGUsIG5PYmpEZWZuSUQpOwotICBwT2JqRGVmLT5HZXRJbnN0YW5jZVRlbXBsYXRlKCktPlNldEFjY2Vzc29yKAotICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgobV9pc29sYXRlLCBzUHJvcE5hbWUsIHY4OjpOZXdTdHJpbmdUeXBlOjprTm9ybWFsKQotICAgICAgICAgIC5Ub0xvY2FsQ2hlY2tlZCgpLAotICAgICAgcFByb3BHZXQsIHBQcm9wUHV0KTsKKyAgICAgIENGWEpTX09iakRlZmluaXRpb246OkZvcklEKEdldElzb2xhdGUoKSwgbk9iakRlZm5JRCk7CisgIHBPYmpEZWYtPkdldEluc3RhbmNlVGVtcGxhdGUoKS0+U2V0QWNjZXNzb3IoTmV3U3RyaW5nKHNQcm9wTmFtZSksIHBQcm9wR2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9wUHV0KTsKIH0KIAogdm9pZCBDRlhKU19FbmdpbmU6OkRlZmluZU9iakFsbFByb3BlcnRpZXMoCkBAIC0zMjcsMTAgKzMzMSwxMCBAQAogICAgIHY4OjpOYW1lZFByb3BlcnR5R2V0dGVyQ2FsbGJhY2sgcFByb3BHZXQsCiAgICAgdjg6Ok5hbWVkUHJvcGVydHlTZXR0ZXJDYWxsYmFjayBwUHJvcFB1dCwKICAgICB2ODo6TmFtZWRQcm9wZXJ0eURlbGV0ZXJDYWxsYmFjayBwUHJvcERlbCkgewotICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShtX2lzb2xhdGUpOwotICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKG1faXNvbGF0ZSk7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKEdldElzb2xhdGUoKSk7CisgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoR2V0SXNvbGF0ZSgpKTsKICAgQ0ZYSlNfT2JqRGVmaW5pdGlvbiogcE9iakRlZiA9Ci0gICAgICBDRlhKU19PYmpEZWZpbml0aW9uOjpGb3JJRChtX2lzb2xhdGUsIG5PYmpEZWZuSUQpOworICAgICAgQ0ZYSlNfT2JqRGVmaW5pdGlvbjo6Rm9ySUQoR2V0SXNvbGF0ZSgpLCBuT2JqRGVmbklEKTsKICAgcE9iakRlZi0+R2V0SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXROYW1lZFByb3BlcnR5SGFuZGxlcihwUHJvcEdldCwgcFByb3BQdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb3BRdXJleSwgcFByb3BEZWwpOwogfQpAQCAtMzM4LDYzICszNDIsNTYgQEAKIHZvaWQgQ0ZYSlNfRW5naW5lOjpEZWZpbmVPYmpDb25zdChpbnQgbk9iakRlZm5JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzQ29uc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBEZWZhdWx0KSB7Ci0gIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKG1faXNvbGF0ZSk7Ci0gIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUobV9pc29sYXRlKTsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoR2V0SXNvbGF0ZSgpKTsKKyAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShHZXRJc29sYXRlKCkpOwogICBDRlhKU19PYmpEZWZpbml0aW9uKiBwT2JqRGVmID0KLSAgICAgIENGWEpTX09iakRlZmluaXRpb246OkZvcklEKG1faXNvbGF0ZSwgbk9iakRlZm5JRCk7Ci0gIHBPYmpEZWYtPkdldEluc3RhbmNlVGVtcGxhdGUoKS0+U2V0KG1faXNvbGF0ZSwgc0NvbnN0TmFtZSwgcERlZmF1bHQpOworICAgICAgQ0ZYSlNfT2JqRGVmaW5pdGlvbjo6Rm9ySUQoR2V0SXNvbGF0ZSgpLCBuT2JqRGVmbklEKTsKKyAgcE9iakRlZi0+R2V0SW5zdGFuY2VUZW1wbGF0ZSgpLT5TZXQoR2V0SXNvbGF0ZSgpLCBzQ29uc3ROYW1lLCBwRGVmYXVsdCk7CiB9CiAKIHZvaWQgQ0ZYSlNfRW5naW5lOjpEZWZpbmVHbG9iYWxNZXRob2QoY29uc3QgY2hhciogc01ldGhvZE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpGdW5jdGlvbkNhbGxiYWNrIHBNZXRob2RDYWxsKSB7Ci0gIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKG1faXNvbGF0ZSk7Ci0gIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUobV9pc29sYXRlKTsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoR2V0SXNvbGF0ZSgpKTsKKyAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZShHZXRJc29sYXRlKCkpOwogICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGZ1biA9Ci0gICAgICB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KG1faXNvbGF0ZSwgcE1ldGhvZENhbGwpOworICAgICAgdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhHZXRJc29sYXRlKCksIHBNZXRob2RDYWxsKTsKICAgZnVuLT5SZW1vdmVQcm90b3R5cGUoKTsKLSAgR2V0R2xvYmFsT2JqZWN0VGVtcGxhdGUobV9pc29sYXRlKS0+U2V0KAotICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgobV9pc29sYXRlLCBzTWV0aG9kTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpOZXdTdHJpbmdUeXBlOjprTm9ybWFsKQotICAgICAgICAgIC5Ub0xvY2FsQ2hlY2tlZCgpLAotICAgICAgZnVuLCB2ODo6UmVhZE9ubHkpOworICBHZXRHbG9iYWxPYmplY3RUZW1wbGF0ZShHZXRJc29sYXRlKCkpCisgICAgICAtPlNldChOZXdTdHJpbmcoc01ldGhvZE5hbWUpLCBmdW4sIHY4OjpSZWFkT25seSk7CiB9CiAKIHZvaWQgQ0ZYSlNfRW5naW5lOjpEZWZpbmVHbG9iYWxDb25zdChjb25zdCB3Y2hhcl90KiBzQ29uc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpGdW5jdGlvbkNhbGxiYWNrIHBDb25zdEdldHRlcikgewotICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShtX2lzb2xhdGUpOwotICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKG1faXNvbGF0ZSk7Ci0gIENGWF9CeXRlU3RyaW5nIGJzQ29uc3QgPSBGWF9VVEY4RW5jb2RlKENGWF9XaWRlU3RyaW5nQyhzQ29uc3ROYW1lKSk7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKEdldElzb2xhdGUoKSk7CisgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoR2V0SXNvbGF0ZSgpKTsKICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBmdW4gPQotICAgICAgdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhtX2lzb2xhdGUsIHBDb25zdEdldHRlcik7CisgICAgICB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KEdldElzb2xhdGUoKSwgcENvbnN0R2V0dGVyKTsKICAgZnVuLT5SZW1vdmVQcm90b3R5cGUoKTsKLSAgR2V0R2xvYmFsT2JqZWN0VGVtcGxhdGUobV9pc29sYXRlKS0+U2V0QWNjZXNzb3JQcm9wZXJ0eSgKLSAgICAgIHY4OjpTdHJpbmc6Ok5ld0Zyb21VdGY4KG1faXNvbGF0ZSwgYnNDb25zdC5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwpCi0gICAgICAgICAgLlRvTG9jYWxDaGVja2VkKCksCi0gICAgICBmdW4pOworICBHZXRHbG9iYWxPYmplY3RUZW1wbGF0ZShHZXRJc29sYXRlKCkpCisgICAgICAtPlNldEFjY2Vzc29yUHJvcGVydHkoTmV3U3RyaW5nKHNDb25zdE5hbWUpLCBmdW4pOwogfQogCiB2b2lkIENGWEpTX0VuZ2luZTo6SW5pdGlhbGl6ZUVuZ2luZSgpIHsKLSAgaWYgKG1faXNvbGF0ZSA9PSBnX2lzb2xhdGUpCisgIGlmIChHZXRJc29sYXRlKCkgPT0gZ19pc29sYXRlKQogICAgICsrZ19pc29sYXRlX3JlZl9jb3VudDsKIAotICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShtX2lzb2xhdGUpOwotICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlX3Njb3BlKG1faXNvbGF0ZSk7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKEdldElzb2xhdGUoKSk7CisgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoR2V0SXNvbGF0ZSgpKTsKIAogICAvLyBUaGlzIGhhcyB0byBoYXBwZW4gYmVmb3JlIHdlIGNhbGwgR2V0R2xvYmFsT2JqZWN0VGVtcGxhdGUgYmVjYXVzZSB0aGF0Ci0gIC8vIG1ldGhvZCBnZXRzIHRoZSBQZXJJc29sYXRlRGF0YSBmcm9tIG1faXNvbGF0ZS4KLSAgRlhKU19QZXJJc29sYXRlRGF0YTo6U2V0VXAobV9pc29sYXRlKTsKKyAgLy8gbWV0aG9kIGdldHMgdGhlIFBlcklzb2xhdGVEYXRhIGZyb20gR2V0SXNvbGF0ZSgpLgorICBGWEpTX1Blcklzb2xhdGVEYXRhOjpTZXRVcChHZXRJc29sYXRlKCkpOwogCi0gIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gdjhDb250ZXh0ID0KLSAgICAgIHY4OjpDb250ZXh0OjpOZXcobV9pc29sYXRlLCBudWxscHRyLCBHZXRHbG9iYWxPYmplY3RUZW1wbGF0ZShtX2lzb2xhdGUpKTsKKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiB2OENvbnRleHQgPSB2ODo6Q29udGV4dDo6TmV3KAorICAgICAgR2V0SXNvbGF0ZSgpLCBudWxscHRyLCBHZXRHbG9iYWxPYmplY3RUZW1wbGF0ZShHZXRJc29sYXRlKCkpKTsKICAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRfc2NvcGUodjhDb250ZXh0KTsKIAogICB2OENvbnRleHQtPlNldEFsaWduZWRQb2ludGVySW5FbWJlZGRlckRhdGEoa1BlckNvbnRleHREYXRhSW5kZXgsIHRoaXMpOwogCi0gIGludCBtYXhJRCA9IENGWEpTX09iakRlZmluaXRpb246Ok1heElEKG1faXNvbGF0ZSk7CisgIGludCBtYXhJRCA9IENGWEpTX09iakRlZmluaXRpb246Ok1heElEKEdldElzb2xhdGUoKSk7CiAgIG1fU3RhdGljT2JqZWN0cy5yZXNpemUobWF4SUQgKyAxKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhJRDsgKytpKSB7Ci0gICAgQ0ZYSlNfT2JqRGVmaW5pdGlvbiogcE9iakRlZiA9IENGWEpTX09iakRlZmluaXRpb246OkZvcklEKG1faXNvbGF0ZSwgaSk7CisgICAgQ0ZYSlNfT2JqRGVmaW5pdGlvbiogcE9iakRlZiA9IENGWEpTX09iakRlZmluaXRpb246OkZvcklEKEdldElzb2xhdGUoKSwgaSk7CiAgICAgaWYgKHBPYmpEZWYtPm1fT2JqVHlwZSA9PSBGWEpTT0JKVFlQRV9HTE9CQUwpIHsKICAgICAgIENGWEpTX1Blck9iamVjdERhdGE6OlNldEluT2JqZWN0KG5ldyBDRlhKU19QZXJPYmplY3REYXRhKGkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjhDb250ZXh0LT5HbG9iYWwoKQpAQCAtNDA4LDQyICs0MDUsMzkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub0xvY2FsQ2hlY2tlZCgpKTsKICAgICAgIH0KICAgICB9IGVsc2UgaWYgKHBPYmpEZWYtPm1fT2JqVHlwZSA9PSBGWEpTT0JKVFlQRV9TVEFUSUMpIHsKLSAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwT2JqTmFtZSA9Ci0gICAgICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgobV9pc29sYXRlLCBwT2JqRGVmLT5tX09iak5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKHBPYmpEZWYtPm1fT2JqTmFtZSkpCi0gICAgICAgICAgICAgIC5Ub0xvY2FsQ2hlY2tlZCgpOwotCisgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gcE9iak5hbWUgPSBOZXdTdHJpbmcocE9iakRlZi0+bV9PYmpOYW1lKTsKICAgICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmogPSBOZXdGeER5bmFtaWNPYmooaSwgdHJ1ZSk7Ci0gICAgICB2OENvbnRleHQtPkdsb2JhbCgpLT5TZXQodjhDb250ZXh0LCBwT2JqTmFtZSwgb2JqKS5Gcm9tSnVzdCgpOwotICAgICAgbV9TdGF0aWNPYmplY3RzW2ldID0gbmV3IHY4OjpHbG9iYWw8djg6Ok9iamVjdD4obV9pc29sYXRlLCBvYmopOworICAgICAgaWYgKCFvYmouSXNFbXB0eSgpKSB7CisgICAgICAgIHY4Q29udGV4dC0+R2xvYmFsKCktPlNldCh2OENvbnRleHQsIHBPYmpOYW1lLCBvYmopLkZyb21KdXN0KCk7CisgICAgICAgIG1fU3RhdGljT2JqZWN0c1tpXSA9IG5ldyB2ODo6R2xvYmFsPHY4OjpPYmplY3Q+KEdldElzb2xhdGUoKSwgb2JqKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fU3RhdGljT2JqZWN0c1tpXSA9IG51bGxwdHI7CisgICAgICB9CiAgICAgfQogICB9Ci0gIG1fVjhQZXJzaXN0ZW50Q29udGV4dC5SZXNldChtX2lzb2xhdGUsIHY4Q29udGV4dCk7CisgIFJlc2V0UGVyc2lzdGVudENvbnRleHQodjhDb250ZXh0KTsKIH0KIAogdm9pZCBDRlhKU19FbmdpbmU6OlJlbGVhc2VFbmdpbmUoKSB7Ci0gIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKG1faXNvbGF0ZSk7Ci0gIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUobV9pc29sYXRlKTsKLSAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0KLSAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhtX2lzb2xhdGUsIG1fVjhQZXJzaXN0ZW50Q29udGV4dCk7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKEdldElzb2xhdGUoKSk7CisgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoR2V0SXNvbGF0ZSgpKTsKKyAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gTmV3TG9jYWxDb250ZXh0KCk7CiAgIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKGNvbnRleHQpOwotCi0gIEZYSlNfUGVySXNvbGF0ZURhdGEqIHBEYXRhID0gRlhKU19QZXJJc29sYXRlRGF0YTo6R2V0KG1faXNvbGF0ZSk7CisgIEZYSlNfUGVySXNvbGF0ZURhdGEqIHBEYXRhID0gRlhKU19QZXJJc29sYXRlRGF0YTo6R2V0KEdldElzb2xhdGUoKSk7CiAgIGlmICghcERhdGEpCiAgICAgcmV0dXJuOwogCi0gIG1fQ29uc3RBcnJheXMuY2xlYXIoKTsKKyAgQ2xlYXJDb25zdEFycmF5KCk7CiAKLSAgaW50IG1heElEID0gQ0ZYSlNfT2JqRGVmaW5pdGlvbjo6TWF4SUQobV9pc29sYXRlKTsKKyAgaW50IG1heElEID0gQ0ZYSlNfT2JqRGVmaW5pdGlvbjo6TWF4SUQoR2V0SXNvbGF0ZSgpKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhJRDsgKytpKSB7Ci0gICAgQ0ZYSlNfT2JqRGVmaW5pdGlvbiogcE9iakRlZiA9IENGWEpTX09iakRlZmluaXRpb246OkZvcklEKG1faXNvbGF0ZSwgaSk7CisgICAgQ0ZYSlNfT2JqRGVmaW5pdGlvbiogcE9iakRlZiA9IENGWEpTX09iakRlZmluaXRpb246OkZvcklEKEdldElzb2xhdGUoKSwgaSk7CiAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmo7CiAgICAgaWYgKHBPYmpEZWYtPm1fT2JqVHlwZSA9PSBGWEpTT0JKVFlQRV9HTE9CQUwpIHsKICAgICAgIHBPYmogPQogICAgICAgICAgIGNvbnRleHQtPkdsb2JhbCgpLT5HZXRQcm90b3R5cGUoKS0+VG9PYmplY3QoY29udGV4dCkuVG9Mb2NhbENoZWNrZWQoKTsKICAgICB9IGVsc2UgaWYgKG1fU3RhdGljT2JqZWN0c1tpXSAmJiAhbV9TdGF0aWNPYmplY3RzW2ldLT5Jc0VtcHR5KCkpIHsKLSAgICAgIHBPYmogPSB2ODo6TG9jYWw8djg6Ok9iamVjdD46Ok5ldyhtX2lzb2xhdGUsICptX1N0YXRpY09iamVjdHNbaV0pOworICAgICAgcE9iaiA9IHY4OjpMb2NhbDx2ODo6T2JqZWN0Pjo6TmV3KEdldElzb2xhdGUoKSwgKm1fU3RhdGljT2JqZWN0c1tpXSk7CiAgICAgICBkZWxldGUgbV9TdGF0aWNPYmplY3RzW2ldOwogICAgICAgbV9TdGF0aWNPYmplY3RzW2ldID0gbnVsbHB0cjsKICAgICB9CkBAIC00NTUsMzUgKzQ0OSwzMCBAQAogICAgIH0KICAgfQogCi0gIG1fVjhQZXJzaXN0ZW50Q29udGV4dC5SZXNldCgpOworICBSZWxlYXNlUGVyc2lzdGVudENvbnRleHQoKTsKIAotICBpZiAobV9pc29sYXRlID09IGdfaXNvbGF0ZSAmJiAtLWdfaXNvbGF0ZV9yZWZfY291bnQgPiAwKQorICBpZiAoR2V0SXNvbGF0ZSgpID09IGdfaXNvbGF0ZSAmJiAtLWdfaXNvbGF0ZV9yZWZfY291bnQgPiAwKQogICAgIHJldHVybjsKIAogICBkZWxldGUgcERhdGE7Ci0gIG1faXNvbGF0ZS0+U2V0RGF0YShnX2VtYmVkZGVyRGF0YVNsb3QsIG51bGxwdHIpOworICBHZXRJc29sYXRlKCktPlNldERhdGEoZ19lbWJlZGRlckRhdGFTbG90LCBudWxscHRyKTsKIH0KIAotaW50IENGWEpTX0VuZ2luZTo6RXhlY3V0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc2NyaXB0LCBGWEpTRXJyKiBwRXJyb3IpIHsKLSAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUobV9pc29sYXRlKTsKLSAgdjg6OlRyeUNhdGNoIHRyeV9jYXRjaChtX2lzb2xhdGUpOwotICBDRlhfQnl0ZVN0cmluZyBic1NjcmlwdCA9IHNjcmlwdC5VVEY4RW5jb2RlKCk7Ci0gIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IG1faXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKTsKK2ludCBDRlhKU19FbmdpbmU6OkV4ZWN1dGUoY29uc3QgV2lkZVN0cmluZyYgc2NyaXB0LCBGWEpTRXJyKiBwRXJyb3IpIHsKKyAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUoR2V0SXNvbGF0ZSgpKTsKKyAgdjg6OlRyeUNhdGNoIHRyeV9jYXRjaChHZXRJc29sYXRlKCkpOworICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBHZXRJc29sYXRlKCktPkdldEN1cnJlbnRDb250ZXh0KCk7CiAgIHY4OjpMb2NhbDx2ODo6U2NyaXB0PiBjb21waWxlZF9zY3JpcHQ7Ci0gIGlmICghdjg6OlNjcmlwdDo6Q29tcGlsZShjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgobV9pc29sYXRlLCBic1NjcmlwdC5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6Ok5ld1N0cmluZ1R5cGU6OmtOb3JtYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic1NjcmlwdC5HZXRMZW5ndGgoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9Mb2NhbENoZWNrZWQoKSkKKyAgaWYgKCF2ODo6U2NyaXB0OjpDb21waWxlKGNvbnRleHQsIE5ld1N0cmluZyhzY3JpcHQuQXNTdHJpbmdWaWV3KCkpKQogICAgICAgICAgICAuVG9Mb2NhbCgmY29tcGlsZWRfc2NyaXB0KSkgewotICAgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBlcnJvcih0cnlfY2F0Y2guRXhjZXB0aW9uKCkpOworICAgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBlcnJvcihHZXRJc29sYXRlKCksIHRyeV9jYXRjaC5FeGNlcHRpb24oKSk7CiAgICAgLy8gVE9ETyh0c2VwZXopOiByZXR1cm4gZXJyb3IgdmlhIHBFcnJvci0+bWVzc2FnZS4KICAgICByZXR1cm4gLTE7CiAgIH0KIAogICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXN1bHQ7CiAgIGlmICghY29tcGlsZWRfc2NyaXB0LT5SdW4oY29udGV4dCkuVG9Mb2NhbCgmcmVzdWx0KSkgewotICAgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBlcnJvcih0cnlfY2F0Y2guRXhjZXB0aW9uKCkpOworICAgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSBlcnJvcihHZXRJc29sYXRlKCksIHRyeV9jYXRjaC5FeGNlcHRpb24oKSk7CiAgICAgLy8gVE9ETyh0c2VwZXopOiByZXR1cm4gZXJyb3IgdmlhIHBFcnJvci0+bWVzc2FnZS4KICAgICByZXR1cm4gLTE7CiAgIH0KQEAgLTQ5MiwyNSArNDgxLDI2IEBACiAKIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBDRlhKU19FbmdpbmU6Ok5ld0Z4RHluYW1pY09iaihpbnQgbk9iakRlZm5JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTdGF0aWMpIHsKLSAgdjg6Oklzb2xhdGU6OlNjb3BlIGlzb2xhdGVfc2NvcGUobV9pc29sYXRlKTsKLSAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gbV9pc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOworICB2ODo6SXNvbGF0ZTo6U2NvcGUgaXNvbGF0ZV9zY29wZShHZXRJc29sYXRlKCkpOworICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBHZXRJc29sYXRlKCktPkdldEN1cnJlbnRDb250ZXh0KCk7CiAgIGlmIChuT2JqRGVmbklEID09IC0xKSB7Ci0gICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gb2JqVGVtcGwgPSB2ODo6T2JqZWN0VGVtcGxhdGU6Ok5ldyhtX2lzb2xhdGUpOworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+IG9ialRlbXBsID0KKyAgICAgICAgdjg6Ok9iamVjdFRlbXBsYXRlOjpOZXcoR2V0SXNvbGF0ZSgpKTsKICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2JqOwogICAgIGlmICghb2JqVGVtcGwtPk5ld0luc3RhbmNlKGNvbnRleHQpLlRvTG9jYWwoJm9iaikpCiAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCk7CiAgICAgcmV0dXJuIG9iajsKICAgfQogCi0gIEZYSlNfUGVySXNvbGF0ZURhdGEqIHBEYXRhID0gRlhKU19QZXJJc29sYXRlRGF0YTo6R2V0KG1faXNvbGF0ZSk7CisgIEZYSlNfUGVySXNvbGF0ZURhdGEqIHBEYXRhID0gRlhKU19QZXJJc29sYXRlRGF0YTo6R2V0KEdldElzb2xhdGUoKSk7CiAgIGlmICghcERhdGEpCiAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpOwogCi0gIGlmIChuT2JqRGVmbklEIDwgMCB8fCBuT2JqRGVmbklEID49IENGWEpTX09iakRlZmluaXRpb246Ok1heElEKG1faXNvbGF0ZSkpCisgIGlmIChuT2JqRGVmbklEIDwgMCB8fCBuT2JqRGVmbklEID49IENGWEpTX09iakRlZmluaXRpb246Ok1heElEKEdldElzb2xhdGUoKSkpCiAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpOwogCiAgIENGWEpTX09iakRlZmluaXRpb24qIHBPYmpEZWYgPQotICAgICAgQ0ZYSlNfT2JqRGVmaW5pdGlvbjo6Rm9ySUQobV9pc29sYXRlLCBuT2JqRGVmbklEKTsKKyAgICAgIENGWEpTX09iakRlZmluaXRpb246OkZvcklEKEdldElzb2xhdGUoKSwgbk9iakRlZm5JRCk7CiAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBvYmo7CiAgIGlmICghcE9iakRlZi0+R2V0SW5zdGFuY2VUZW1wbGF0ZSgpLT5OZXdJbnN0YW5jZShjb250ZXh0KS5Ub0xvY2FsKCZvYmopKQogICAgIHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD4oKTsKQEAgLTUyMCwzMSArNTEwLDI1IEBACiAgIGlmIChwT2JqRGVmLT5tX3BDb25zdHJ1Y3RvcikKICAgICBwT2JqRGVmLT5tX3BDb25zdHJ1Y3Rvcih0aGlzLCBvYmopOwogCi0gIGlmICghYlN0YXRpYyAmJiBGWEpTX1Blcklzb2xhdGVEYXRhOjpHZXQobV9pc29sYXRlKS0+bV9wRHluYW1pY09ianNNYXApCi0gICAgRlhKU19QZXJJc29sYXRlRGF0YTo6R2V0KG1faXNvbGF0ZSktPm1fcER5bmFtaWNPYmpzTWFwLT5zZXQocE9iakRhdGEsIG9iaik7CisgIGlmICghYlN0YXRpYyAmJiBGWEpTX1Blcklzb2xhdGVEYXRhOjpHZXQoR2V0SXNvbGF0ZSgpKS0+bV9wRHluYW1pY09ianNNYXApCisgICAgRlhKU19QZXJJc29sYXRlRGF0YTo6R2V0KEdldElzb2xhdGUoKSkKKyAgICAgICAgLT5tX3BEeW5hbWljT2Jqc01hcC0+c2V0KHBPYmpEYXRhLCBvYmopOwogCiAgIHJldHVybiBvYmo7CiB9CiAKIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBDRlhKU19FbmdpbmU6OkdldFRoaXNPYmooKSB7Ci0gIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKG1faXNvbGF0ZSk7Ci0gIGlmICghRlhKU19QZXJJc29sYXRlRGF0YTo6R2V0KG1faXNvbGF0ZSkpCisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKEdldElzb2xhdGUoKSk7CisgIGlmICghRlhKU19QZXJJc29sYXRlRGF0YTo6R2V0KEdldElzb2xhdGUoKSkpCiAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6T2JqZWN0PigpOwogCiAgIC8vIFJldHVybiB0aGUgZ2xvYmFsIG9iamVjdC4KLSAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gbV9pc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOworICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBHZXRJc29sYXRlKCktPkdldEN1cnJlbnRDb250ZXh0KCk7CiAgIHJldHVybiBjb250ZXh0LT5HbG9iYWwoKS0+R2V0UHJvdG90eXBlKCktPlRvT2JqZWN0KGNvbnRleHQpLlRvTG9jYWxDaGVja2VkKCk7CiB9CiAKLXZvaWQgQ0ZYSlNfRW5naW5lOjpFcnJvcihjb25zdCBDRlhfV2lkZVN0cmluZyYgbWVzc2FnZSkgewotICAvLyBDb252ZXJzaW9uIGZyb20gcGRmaXVtJ3Mgd2NoYXJfdCB3aWRlLXN0cmluZ3MgdG8gdjgncyB1aW50MTZfdAotICAvLyB3aWRlLXN0cmluZ3MgaXNuJ3QgaGFuZGxlZCBieSB2OCwgc28gdXNlIFVURjggYXMgYSBjb21tb24KLSAgLy8gaW50ZXJtZWRpYXRlIGZvcm1hdC4KLSAgQ0ZYX0J5dGVTdHJpbmcgdXRmOF9tZXNzYWdlID0gbWVzc2FnZS5VVEY4RW5jb2RlKCk7Ci0gIG1faXNvbGF0ZS0+VGhyb3dFeGNlcHRpb24odjg6OlN0cmluZzo6TmV3RnJvbVV0ZjgobV9pc29sYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0ZjhfbWVzc2FnZS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpOZXdTdHJpbmdUeXBlOjprTm9ybWFsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9Mb2NhbENoZWNrZWQoKSk7Cit2b2lkIENGWEpTX0VuZ2luZTo6RXJyb3IoY29uc3QgV2lkZVN0cmluZyYgbWVzc2FnZSkgeworICBHZXRJc29sYXRlKCktPlRocm93RXhjZXB0aW9uKE5ld1N0cmluZyhtZXNzYWdlLkFzU3RyaW5nVmlldygpKSk7CiB9CiAKIHZvaWQgQ0ZYSlNfRW5naW5lOjpTZXRPYmplY3RQcml2YXRlKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLCB2b2lkKiBwKSB7CkBAIC01NjAsNyArNTQ0LDcgQEAKICAgaWYgKCFwRGF0YSAmJiAhcE9iai5Jc0VtcHR5KCkpIHsKICAgICAvLyBJdCBjb3VsZCBiZSBhIGdsb2JhbCBwcm94eSBvYmplY3QuCiAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdiA9IHBPYmotPkdldFByb3RvdHlwZSgpOwotICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IG1faXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKTsKKyAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBHZXRJc29sYXRlKCktPkdldEN1cnJlbnRDb250ZXh0KCk7CiAgICAgaWYgKHYtPklzT2JqZWN0KCkpIHsKICAgICAgIHBEYXRhID0gQ0ZYSlNfUGVyT2JqZWN0RGF0YTo6R2V0RnJvbU9iamVjdCgKICAgICAgICAgICB2LT5Ub09iamVjdChjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpKTsKQEAgLTU2OCwxNzIgKzU1MiwzIEBACiAgIH0KICAgcmV0dXJuIHBEYXRhID8gcERhdGEtPm1fcFByaXZhdGUgOiBudWxscHRyOwogfQotCi12ODo6TG9jYWw8djg6OlZhbHVlPiBDRlhKU19FbmdpbmU6OkdldE9iamVjdFByb3BlcnR5KAotICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Byb3BlcnR5TmFtZSkgewotICBpZiAocE9iai5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7Ci0gIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbDsKLSAgaWYgKCFwT2JqLT5HZXQobV9pc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICBOZXdTdHJpbmcod3NQcm9wZXJ0eU5hbWUuQXNTdHJpbmdDKCkpKQotICAgICAgICAgICAuVG9Mb2NhbCgmdmFsKSkKLSAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKLSAgcmV0dXJuIHZhbDsKLX0KLQotc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+IENGWEpTX0VuZ2luZTo6R2V0T2JqZWN0UHJvcGVydHlOYW1lcygKLSAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaikgewotICBpZiAocE9iai5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIHN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nPigpOwotCi0gIHY4OjpMb2NhbDx2ODo6QXJyYXk+IHZhbDsKLSAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gbV9pc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOwotICBpZiAoIXBPYmotPkdldFByb3BlcnR5TmFtZXMoY29udGV4dCkuVG9Mb2NhbCgmdmFsKSkKLSAgICByZXR1cm4gc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+KCk7Ci0KLSAgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+IHJlc3VsdDsKLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHZhbC0+TGVuZ3RoKCk7ICsraSkgewotICAgIHJlc3VsdC5wdXNoX2JhY2soVG9XaWRlU3RyaW5nKHZhbC0+R2V0KGNvbnRleHQsIGkpLlRvTG9jYWxDaGVja2VkKCkpKTsKLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgQ0ZYSlNfRW5naW5lOjpQdXRPYmplY3RQcm9wZXJ0eSh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQcm9wZXJ0eU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFB1dCkgewotICBpZiAocE9iai5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuOwotICBwT2JqLT5TZXQobV9pc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpLAotICAgICAgICAgICAgTmV3U3RyaW5nKHdzUHJvcGVydHlOYW1lLkFzU3RyaW5nQygpKSwgcFB1dCkKLSAgICAgIC5Gcm9tSnVzdCgpOwotfQotCi0KLXY4OjpMb2NhbDx2ODo6QXJyYXk+IENGWEpTX0VuZ2luZTo6TmV3QXJyYXkoKSB7Ci0gIHJldHVybiB2ODo6QXJyYXk6Ok5ldyhtX2lzb2xhdGUpOwotfQotCi11bnNpZ25lZCBDRlhKU19FbmdpbmU6OlB1dEFycmF5RWxlbWVudCh2ODo6TG9jYWw8djg6OkFycmF5PiBwQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSkgewotICBpZiAocEFycmF5LklzRW1wdHkoKSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKHBBcnJheS0+U2V0KG1faXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKSwgaW5kZXgsIHBWYWx1ZSkuSXNOb3RoaW5nKCkpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi12ODo6TG9jYWw8djg6OlZhbHVlPiBDRlhKU19FbmdpbmU6OkdldEFycmF5RWxlbWVudCh2ODo6TG9jYWw8djg6OkFycmF5PiBwQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbmRleCkgewotICBpZiAocEFycmF5LklzRW1wdHkoKSkKLSAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKLSAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsOwotICBpZiAoIXBBcnJheS0+R2V0KG1faXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKSwgaW5kZXgpLlRvTG9jYWwoJnZhbCkpCi0gICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7Ci0gIHJldHVybiB2YWw7Ci19Ci0KLXVuc2lnbmVkIENGWEpTX0VuZ2luZTo6R2V0QXJyYXlMZW5ndGgodjg6OkxvY2FsPHY4OjpBcnJheT4gcEFycmF5KSB7Ci0gIGlmIChwQXJyYXkuSXNFbXB0eSgpKQotICAgIHJldHVybiAwOwotICByZXR1cm4gcEFycmF5LT5MZW5ndGgoKTsKLX0KLQotdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBDRlhKU19FbmdpbmU6Ok5ld0xvY2FsQ29udGV4dCgpIHsKLSAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhtX2lzb2xhdGUsIG1fVjhQZXJzaXN0ZW50Q29udGV4dCk7Ci19Ci0KLXY4OjpMb2NhbDx2ODo6Q29udGV4dD4gQ0ZYSlNfRW5naW5lOjpHZXRQZXJzaXN0ZW50Q29udGV4dCgpIHsKLSAgcmV0dXJuIG1fVjhQZXJzaXN0ZW50Q29udGV4dC5HZXQobV9pc29sYXRlKTsKLX0KLQotdjg6OkxvY2FsPHY4OjpWYWx1ZT4gQ0ZYSlNfRW5naW5lOjpOZXdOdW1iZXIoaW50IG51bWJlcikgewotICByZXR1cm4gdjg6OkludDMyOjpOZXcobV9pc29sYXRlLCBudW1iZXIpOwotfQotCi12ODo6TG9jYWw8djg6OlZhbHVlPiBDRlhKU19FbmdpbmU6Ok5ld051bWJlcihkb3VibGUgbnVtYmVyKSB7Ci0gIHJldHVybiB2ODo6TnVtYmVyOjpOZXcobV9pc29sYXRlLCBudW1iZXIpOwotfQotCi12ODo6TG9jYWw8djg6OlZhbHVlPiBDRlhKU19FbmdpbmU6Ok5ld051bWJlcihmbG9hdCBudW1iZXIpIHsKLSAgcmV0dXJuIHY4OjpOdW1iZXI6Ok5ldyhtX2lzb2xhdGUsIChmbG9hdCludW1iZXIpOwotfQotCi12ODo6TG9jYWw8djg6OlZhbHVlPiBDRlhKU19FbmdpbmU6Ok5ld0Jvb2xlYW4oYm9vbCBiKSB7Ci0gIHJldHVybiB2ODo6Qm9vbGVhbjo6TmV3KG1faXNvbGF0ZSwgYik7Ci19Ci0KLXY4OjpMb2NhbDx2ODo6VmFsdWU+IENGWEpTX0VuZ2luZTo6TmV3U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKSB7Ci0gIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IG1faXNvbGF0ZSA/IG1faXNvbGF0ZSA6IHY4OjpJc29sYXRlOjpHZXRDdXJyZW50KCk7Ci0gIHJldHVybiB2ODo6U3RyaW5nOjpOZXdGcm9tVXRmOChwSXNvbGF0ZSwgc3RyLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ODo6TmV3U3RyaW5nVHlwZTo6a05vcm1hbCwgc3RyLkdldExlbmd0aCgpKQotICAgICAgLlRvTG9jYWxDaGVja2VkKCk7Ci19Ci0KLXY4OjpMb2NhbDx2ODo6VmFsdWU+IENGWEpTX0VuZ2luZTo6TmV3U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKSB7Ci0gIHJldHVybiBOZXdTdHJpbmcoRlhfVVRGOEVuY29kZShzdHIpLkFzU3RyaW5nQygpKTsKLX0KLQotdjg6OkxvY2FsPHY4OjpWYWx1ZT4gQ0ZYSlNfRW5naW5lOjpOZXdOdWxsKCkgewotICByZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKLX0KLQotdjg6OkxvY2FsPHY4OjpEYXRlPiBDRlhKU19FbmdpbmU6Ok5ld0RhdGUoZG91YmxlIGQpIHsKLSAgcmV0dXJuIHY4OjpEYXRlOjpOZXcobV9pc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpLCBkKQotICAgICAgLlRvTG9jYWxDaGVja2VkKCkKLSAgICAgIC5Bczx2ODo6RGF0ZT4oKTsKLX0KLQotaW50IENGWEpTX0VuZ2luZTo6VG9JbnQzMih2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpIHsKLSAgaWYgKHBWYWx1ZS5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIDA7Ci0gIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IG1faXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKTsKLSAgcmV0dXJuIHBWYWx1ZS0+VG9JbnQzMihjb250ZXh0KS5Ub0xvY2FsQ2hlY2tlZCgpLT5WYWx1ZSgpOwotfQotCi1ib29sIENGWEpTX0VuZ2luZTo6VG9Cb29sZWFuKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSkgewotICBpZiAocFZhbHVlLklzRW1wdHkoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IG1faXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKTsKLSAgcmV0dXJuIHBWYWx1ZS0+VG9Cb29sZWFuKGNvbnRleHQpLlRvTG9jYWxDaGVja2VkKCktPlZhbHVlKCk7Ci19Ci0KLWRvdWJsZSBDRlhKU19FbmdpbmU6OlRvRG91YmxlKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSkgewotICBpZiAocFZhbHVlLklzRW1wdHkoKSkKLSAgICByZXR1cm4gMC4wOwotICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBtX2lzb2xhdGUtPkdldEN1cnJlbnRDb250ZXh0KCk7Ci0gIHJldHVybiBwVmFsdWUtPlRvTnVtYmVyKGNvbnRleHQpLlRvTG9jYWxDaGVja2VkKCktPlZhbHVlKCk7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENGWEpTX0VuZ2luZTo6VG9XaWRlU3RyaW5nKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSkgewotICBpZiAocFZhbHVlLklzRW1wdHkoKSkKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gbV9pc29sYXRlLT5HZXRDdXJyZW50Q29udGV4dCgpOwotICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgcyhwVmFsdWUtPlRvU3RyaW5nKGNvbnRleHQpLlRvTG9jYWxDaGVja2VkKCkpOwotICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KENGWF9CeXRlU3RyaW5nQygqcywgcy5sZW5ndGgoKSkpOwotfQotCi12ODo6TG9jYWw8djg6Ok9iamVjdD4gQ0ZYSlNfRW5naW5lOjpUb09iamVjdCh2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpIHsKLSAgaWYgKHBWYWx1ZS5Jc0VtcHR5KCkgfHwgIXBWYWx1ZS0+SXNPYmplY3QoKSkKLSAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCk7Ci0gIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IG1faXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKTsKLSAgcmV0dXJuIHBWYWx1ZS0+VG9PYmplY3QoY29udGV4dCkuVG9Mb2NhbENoZWNrZWQoKTsKLX0KLQotdjg6OkxvY2FsPHY4OjpBcnJheT4gQ0ZYSlNfRW5naW5lOjpUb0FycmF5KHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSkgewotICBpZiAocFZhbHVlLklzRW1wdHkoKSB8fCAhcFZhbHVlLT5Jc0FycmF5KCkpCi0gICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6QXJyYXk+KCk7Ci0gIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gY29udGV4dCA9IG1faXNvbGF0ZS0+R2V0Q3VycmVudENvbnRleHQoKTsKLSAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6QXJyYXk+OjpDYXN0KHBWYWx1ZS0+VG9PYmplY3QoY29udGV4dCkuVG9Mb2NhbENoZWNrZWQoKSk7Ci19Ci0KLXZvaWQgQ0ZYSlNfRW5naW5lOjpTZXRDb25zdEFycmF5KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpBcnJheT4gYXJyYXkpIHsKLSAgbV9Db25zdEFycmF5c1tuYW1lXSA9IHY4OjpHbG9iYWw8djg6OkFycmF5PihHZXRJc29sYXRlKCksIGFycmF5KTsKLX0KLQotdjg6OkxvY2FsPHY4OjpBcnJheT4gQ0ZYSlNfRW5naW5lOjpHZXRDb25zdEFycmF5KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBuYW1lKSB7Ci0gIHJldHVybiB2ODo6TG9jYWw8djg6OkFycmF5Pjo6TmV3KEdldElzb2xhdGUoKSwgbV9Db25zdEFycmF5c1tuYW1lXSk7Ci19CmRpZmYgLS1naXQgYS9meGpzL2Z4anNfdjguaCBiL2Z4anMvZnhqc192OC5oCmluZGV4IDUwYjBiMmMuLjQ1NzUyMzUgMTAwNjQ0Ci0tLSBhL2Z4anMvZnhqc192OC5oCisrKyBiL2Z4anMvZnhqc192OC5oCkBAIC0yMiw2ICsyMiw4IEBACiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJmeGpzL2Nqc192OC5oIgorCiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKIC8vIEhlYWRlciBmb3IgQ0ZYSlNFX1J1bnRpbWVEYXRhLiBGWEpTX1Y4IGRvZXNuJ3QgaW50ZXJwcmV0IHRoaXMgY2xhc3MsCiAvLyBpdCBpcyBqdXN0IHBhc3NlZCBhbG9uZyB0byBYRkEuCkBAIC01MywxMCArNTUsOCBAQAogICB0eXBlZGVmIHY4OjpHbG9iYWxWYWx1ZU1hcDx2b2lkKiwgdjg6Ok9iamVjdCwgVjhUZW1wbGF0ZU1hcFRyYWl0cz4gTWFwVHlwZTsKICAgdHlwZWRlZiB2b2lkIFdlYWtDYWxsYmFja0RhdGFUeXBlOwogCi0gIHN0YXRpYyBXZWFrQ2FsbGJhY2tEYXRhVHlwZSogV2Vha0NhbGxiYWNrUGFyYW1ldGVyKAotICAgICAgTWFwVHlwZSogbWFwLAotICAgICAgdm9pZCoga2V5LAotICAgICAgY29uc3Qgdjg6OkxvY2FsPHY4OjpPYmplY3Q+JiB2YWx1ZSkgeworICBzdGF0aWMgV2Vha0NhbGxiYWNrRGF0YVR5cGUqCisgIFdlYWtDYWxsYmFja1BhcmFtZXRlcihNYXBUeXBlKiBtYXAsIHZvaWQqIGtleSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHZhbHVlKSB7CiAgICAgcmV0dXJuIGtleTsKICAgfQogICBzdGF0aWMgTWFwVHlwZSogTWFwRnJvbVdlYWtDYWxsYmFja0luZm8oCkBAIC0xMTEsNiArMTExLDcgQEAKIH07CiAKIGNsYXNzIEZYSlNfQXJyYXlCdWZmZXJBbGxvY2F0b3IgOiBwdWJsaWMgdjg6OkFycmF5QnVmZmVyOjpBbGxvY2F0b3IgeworICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhBbGxvd2VkQnl0ZXMgPSAweDEwMDAwMDAwOwogICB2b2lkKiBBbGxvY2F0ZShzaXplX3QgbGVuZ3RoKSBvdmVycmlkZTsKICAgdm9pZCogQWxsb2NhdGVVbmluaXRpYWxpemVkKHNpemVfdCBsZW5ndGgpIG92ZXJyaWRlOwogICB2b2lkIEZyZWUodm9pZCogZGF0YSwgc2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGU7CkBAIC0xMjcsMTAgKzEyOCwxMCBAQAogLy8gR2V0IHRoZSBnbG9iYWwgaXNvbGF0ZSdzIHJlZiBjb3VudC4KIHNpemVfdCBGWEpTX0dsb2JhbElzb2xhdGVSZWZDb3VudCgpOwogCi1jbGFzcyBDRlhKU19FbmdpbmUgeworY2xhc3MgQ0ZYSlNfRW5naW5lIDogcHVibGljIENKU19WOCB7CiAgcHVibGljOgogICBleHBsaWNpdCBDRlhKU19FbmdpbmUodjg6Oklzb2xhdGUqIHBJc29sYXRlKTsKLSAgfkNGWEpTX0VuZ2luZSgpOworICB+Q0ZYSlNfRW5naW5lKCkgb3ZlcnJpZGU7CiAKICAgdXNpbmcgQ29uc3RydWN0b3IgPSB2b2lkICgqKShDRlhKU19FbmdpbmUqIHBFbmdpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IG9iaik7CkBAIC0xMzksOCArMTQwLDYgQEAKICAgc3RhdGljIENGWEpTX0VuZ2luZSogQ3VycmVudEVuZ2luZUZyb21Jc29sYXRlKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSk7CiAgIHN0YXRpYyBpbnQgR2V0T2JqRGVmbklEKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKTsKIAotICB2ODo6SXNvbGF0ZSogR2V0SXNvbGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1faXNvbGF0ZTsgfQotCiAgIC8vIEFsd2F5cyByZXR1cm5zIGEgdmFsaWQsIG5ld2x5LWNyZWF0ZWQgb2JqRGVmbklELgogICBpbnQgRGVmaW5lT2JqKGNvbnN0IGNoYXIqIHNPYmpOYW1lLAogICAgICAgICAgICAgICAgIEZYSlNPQkpUWVBFIGVPYmpUeXBlLApAQCAtMTcyLDY4ICsxNzEsMjUgQEAKICAgdm9pZCBSZWxlYXNlRW5naW5lKCk7CiAKICAgLy8gQ2FsbGVkIGFmdGVyIEZYSlNfSW5pdGlhbGl6ZUVuZ2luZSBjYWxsIG1hZGUuCi0gIGludCBFeGVjdXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQsIEZYSlNFcnIqIHBlcnJvcik7CisgIGludCBFeGVjdXRlKGNvbnN0IFdpZGVTdHJpbmcmIHNjcmlwdCwgRlhKU0VyciogcGVycm9yKTsKIAotICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IE5ld0xvY2FsQ29udGV4dCgpOwotICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IEdldFBlcnNpc3RlbnRDb250ZXh0KCk7CiAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBHZXRUaGlzT2JqKCk7CiAKLSAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gTmV3TnVsbCgpOwotICB2ODo6TG9jYWw8djg6OkFycmF5PiBOZXdBcnJheSgpOwotICB2ODo6TG9jYWw8djg6OlZhbHVlPiBOZXdOdW1iZXIoaW50IG51bWJlcik7Ci0gIHY4OjpMb2NhbDx2ODo6VmFsdWU+IE5ld051bWJlcihkb3VibGUgbnVtYmVyKTsKLSAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gTmV3TnVtYmVyKGZsb2F0IG51bWJlcik7Ci0gIHY4OjpMb2NhbDx2ODo6VmFsdWU+IE5ld0Jvb2xlYW4oYm9vbCBiKTsKLSAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gTmV3U3RyaW5nKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3RyKTsKLSAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gTmV3U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKTsKLSAgdjg6OkxvY2FsPHY4OjpEYXRlPiBOZXdEYXRlKGRvdWJsZSBkKTsKICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IE5ld0Z4RHluYW1pY09iaihpbnQgbk9iakRlZm5JRCwgYm9vbCBiU3RhdGljID0gZmFsc2UpOwogCi0gIGludCBUb0ludDMyKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSk7Ci0gIGJvb2wgVG9Cb29sZWFuKHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSk7Ci0gIGRvdWJsZSBUb0RvdWJsZSh2ODo6TG9jYWw8djg6OlZhbHVlPiBwVmFsdWUpOwotICBDRlhfV2lkZVN0cmluZyBUb1dpZGVTdHJpbmcodjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKTsKLSAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IFRvT2JqZWN0KHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSk7Ci0gIHY4OjpMb2NhbDx2ODo6QXJyYXk+IFRvQXJyYXkodjg6OkxvY2FsPHY4OjpWYWx1ZT4gcFZhbHVlKTsKLQotICAvLyBBcnJheXMuCi0gIHVuc2lnbmVkIEdldEFycmF5TGVuZ3RoKHY4OjpMb2NhbDx2ODo6QXJyYXk+IHBBcnJheSk7Ci0gIHY4OjpMb2NhbDx2ODo6VmFsdWU+IEdldEFycmF5RWxlbWVudCh2ODo6TG9jYWw8djg6OkFycmF5PiBwQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbmRleCk7Ci0gIHVuc2lnbmVkIFB1dEFycmF5RWxlbWVudCh2ODo6TG9jYWw8djg6OkFycmF5PiBwQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSk7Ci0KLSAgLy8gT2JqZWN0cy4KLSAgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+IEdldE9iamVjdFByb3BlcnR5TmFtZXMoCi0gICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaik7Ci0gIHY4OjpMb2NhbDx2ODo6VmFsdWU+IEdldE9iamVjdFByb3BlcnR5KHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgUHJvcGVydHlOYW1lKTsKLSAgdm9pZCBQdXRPYmplY3RQcm9wZXJ0eSh2ODo6TG9jYWw8djg6Ok9iamVjdD4gcE9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgUHJvcGVydHlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHBWYWx1ZSk7Ci0KICAgLy8gTmF0aXZlIG9iamVjdCBiaW5kaW5nLgogICB2b2lkIFNldE9iamVjdFByaXZhdGUodjg6OkxvY2FsPHY4OjpPYmplY3Q+IHBPYmosIHZvaWQqIHApOwogICB2b2lkKiBHZXRPYmplY3RQcml2YXRlKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKTsKICAgc3RhdGljIHZvaWQgRnJlZU9iamVjdFByaXZhdGUodm9pZCogcCk7CiAgIHN0YXRpYyB2b2lkIEZyZWVPYmplY3RQcml2YXRlKHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBwT2JqKTsKIAotICB2b2lkIFNldENvbnN0QXJyYXkoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG5hbWUsIHY4OjpMb2NhbDx2ODo6QXJyYXk+IGFycmF5KTsKLSAgdjg6OkxvY2FsPHY4OjpBcnJheT4gR2V0Q29uc3RBcnJheShjb25zdCBDRlhfV2lkZVN0cmluZyYgbmFtZSk7Ci0KLSAgdm9pZCBFcnJvcihjb25zdCBDRlhfV2lkZVN0cmluZyYgbWVzc2FnZSk7CisgIHZvaWQgRXJyb3IoY29uc3QgV2lkZVN0cmluZyYgbWVzc2FnZSk7CiAKICBwcm90ZWN0ZWQ6CiAgIENGWEpTX0VuZ2luZSgpOwogCi0gIHZvaWQgU2V0SXNvbGF0ZSh2ODo6SXNvbGF0ZSogcElzb2xhdGUpIHsgbV9pc29sYXRlID0gcElzb2xhdGU7IH0KLQogIHByaXZhdGU6Ci0gIHY4OjpJc29sYXRlKiBtX2lzb2xhdGU7Ci0gIHY4OjpHbG9iYWw8djg6OkNvbnRleHQ+IG1fVjhQZXJzaXN0ZW50Q29udGV4dDsKICAgc3RkOjp2ZWN0b3I8djg6Okdsb2JhbDx2ODo6T2JqZWN0Pio+IG1fU3RhdGljT2JqZWN0czsKLSAgc3RkOjptYXA8Q0ZYX1dpZGVTdHJpbmcsIHY4OjpHbG9iYWw8djg6OkFycmF5Pj4gbV9Db25zdEFycmF5czsKIH07CiAKICNlbmRpZiAgLy8gRlhKU19GWEpTX1Y4X0hfCmRpZmYgLS1naXQgYS9meGpzL2Z4anNfdjhfZW1iZWRkZXJ0ZXN0LmNwcCBiL2Z4anMvZnhqc192OF9lbWJlZGRlcnRlc3QuY3BwCmluZGV4IDRkMDVhMjAuLmQ5NzUyNjQgMTAwNjQ0Ci0tLSBhL2Z4anMvZnhqc192OF9lbWJlZGRlcnRlc3QuY3BwCisrKyBiL2Z4anMvZnhqc192OF9lbWJlZGRlcnRlc3QuY3BwCkBAIC0xOSw3ICsxOSw3IEBACiAKIGNsYXNzIEZYSlNWOEVtYmVkZGVyVGVzdCA6IHB1YmxpYyBKU0VtYmVkZGVyVGVzdCB7CiAgcHVibGljOgotICB2b2lkIEV4ZWN1dGVJbkN1cnJlbnRDb250ZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzY3JpcHQpIHsKKyAgdm9pZCBFeGVjdXRlSW5DdXJyZW50Q29udGV4dChjb25zdCBXaWRlU3RyaW5nJiBzY3JpcHQpIHsKICAgICBGWEpTRXJyIGVycm9yOwogICAgIGludCBzdHMgPSBlbmdpbmUoKS0+RXhlY3V0ZShzY3JpcHQsICZlcnJvcik7CiAgICAgRVhQRUNUX0VRKDAsIHN0cyk7CkBAIC0zNyw3ICszNyw3IEBACiAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoaXNvbGF0ZSgpKTsKICAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRfc2NvcGUoR2V0VjhDb250ZXh0KCkpOwogCi0gIEV4ZWN1dGVJbkN1cnJlbnRDb250ZXh0KENGWF9XaWRlU3RyaW5nKGtTY3JpcHQxKSk7CisgIEV4ZWN1dGVJbkN1cnJlbnRDb250ZXh0KFdpZGVTdHJpbmcoa1NjcmlwdDEpKTsKICAgQ2hlY2tBc3NpZ25tZW50SW5DdXJyZW50Q29udGV4dChrRXhwZWN0ZWQxKTsKIH0KIApAQCAtNTIsMTMgKzUyLDEzIEBACiAgIGVuZ2luZTIuSW5pdGlhbGl6ZUVuZ2luZSgpOwogCiAgIHY4OjpDb250ZXh0OjpTY29wZSBjb250ZXh0X3Njb3BlKEdldFY4Q29udGV4dCgpKTsKLSAgRXhlY3V0ZUluQ3VycmVudENvbnRleHQoQ0ZYX1dpZGVTdHJpbmcoa1NjcmlwdDApKTsKKyAgRXhlY3V0ZUluQ3VycmVudENvbnRleHQoV2lkZVN0cmluZyhrU2NyaXB0MCkpOwogICBDaGVja0Fzc2lnbm1lbnRJbkN1cnJlbnRDb250ZXh0KGtFeHBlY3RlZDApOwogCiAgIHsKICAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQxID0gZW5naW5lMS5OZXdMb2NhbENvbnRleHQoKTsKICAgICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZTEoY29udGV4dDEpOwotICAgIEV4ZWN1dGVJbkN1cnJlbnRDb250ZXh0KENGWF9XaWRlU3RyaW5nKGtTY3JpcHQxKSk7CisgICAgRXhlY3V0ZUluQ3VycmVudENvbnRleHQoV2lkZVN0cmluZyhrU2NyaXB0MSkpOwogICAgIENoZWNrQXNzaWdubWVudEluQ3VycmVudENvbnRleHQoa0V4cGVjdGVkMSk7CiAgIH0KIApAQCAtNjcsNyArNjcsNyBAQAogICB7CiAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0MiA9IGVuZ2luZTIuTmV3TG9jYWxDb250ZXh0KCk7CiAgICAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRfc2NvcGUyKGNvbnRleHQyKTsKLSAgICBFeGVjdXRlSW5DdXJyZW50Q29udGV4dChDRlhfV2lkZVN0cmluZyhrU2NyaXB0MikpOworICAgIEV4ZWN1dGVJbkN1cnJlbnRDb250ZXh0KFdpZGVTdHJpbmcoa1NjcmlwdDIpKTsKICAgICBDaGVja0Fzc2lnbm1lbnRJbkN1cnJlbnRDb250ZXh0KGtFeHBlY3RlZDIpOwogICB9CiAKQEAgLTk4LDExICs5OCwyNSBAQAogICBFWFBFQ1RfRkFMU0UoZW5naW5lKCktPlRvQm9vbGVhbihudWxseikpOwogICBFWFBFQ1RfRVEoMCwgZW5naW5lKCktPlRvSW50MzIobnVsbHopKTsKICAgRVhQRUNUX0VRKDAuMCwgZW5naW5lKCktPlRvRG91YmxlKG51bGx6KSk7Ci0gIEVYUEVDVF9FUShMIiIsIGVuZ2luZSgpLT5Ub1dpZGVTdHJpbmcobnVsbHopKTsKKyAgRVhQRUNUX0VRKEwibnVsbCIsIGVuZ2luZSgpLT5Ub1dpZGVTdHJpbmcobnVsbHopKTsKICAgRVhQRUNUX1RSVUUoZW5naW5lKCktPlRvT2JqZWN0KG51bGx6KS5Jc0VtcHR5KCkpOwogICBFWFBFQ1RfVFJVRShlbmdpbmUoKS0+VG9BcnJheShudWxseikuSXNFbXB0eSgpKTsKIH0KIAorVEVTVF9GKEZYSlNWOEVtYmVkZGVyVGVzdCwgTmV3VW5kZWZpbmVkKSB7CisgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUoKSk7CisgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoaXNvbGF0ZSgpKTsKKyAgdjg6OkNvbnRleHQ6OlNjb3BlIGNvbnRleHRfc2NvcGUoR2V0VjhDb250ZXh0KCkpOworCisgIGF1dG8gdW5kZWYgPSBlbmdpbmUoKS0+TmV3VW5kZWZpbmVkKCk7CisgIEVYUEVDVF9GQUxTRShlbmdpbmUoKS0+VG9Cb29sZWFuKHVuZGVmKSk7CisgIEVYUEVDVF9FUSgwLCBlbmdpbmUoKS0+VG9JbnQzMih1bmRlZikpOworICBFWFBFQ1RfVFJVRShzdGQ6OmlzbmFuKGVuZ2luZSgpLT5Ub0RvdWJsZSh1bmRlZikpKTsKKyAgRVhQRUNUX0VRKEwidW5kZWZpbmVkIiwgZW5naW5lKCktPlRvV2lkZVN0cmluZyh1bmRlZikpOworICBFWFBFQ1RfVFJVRShlbmdpbmUoKS0+VG9PYmplY3QodW5kZWYpLklzRW1wdHkoKSk7CisgIEVYUEVDVF9UUlVFKGVuZ2luZSgpLT5Ub0FycmF5KHVuZGVmKS5Jc0VtcHR5KCkpOworfQorCiBURVNUX0YoRlhKU1Y4RW1iZWRkZXJUZXN0LCBOZXdCb29sZWFuKSB7CiAgIHY4OjpJc29sYXRlOjpTY29wZSBpc29sYXRlX3Njb3BlKGlzb2xhdGUoKSk7CiAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGUoaXNvbGF0ZSgpKTsKQEAgLTE5Miw2ICsyMDYsNyBAQAogICB2ODo6Q29udGV4dDo6U2NvcGUgY29udGV4dF9zY29wZShHZXRWOENvbnRleHQoKSk7CiAKICAgYXV0byBvYmplY3QgPSBlbmdpbmUoKS0+TmV3RnhEeW5hbWljT2JqKC0xKTsKKyAgQVNTRVJUX0ZBTFNFKG9iamVjdC5Jc0VtcHR5KCkpOwogICBFWFBFQ1RfRVEoMHUsIGVuZ2luZSgpLT5HZXRPYmplY3RQcm9wZXJ0eU5hbWVzKG9iamVjdCkuc2l6ZSgpKTsKICAgRVhQRUNUX0ZBTFNFKGVuZ2luZSgpLT5HZXRPYmplY3RQcm9wZXJ0eShvYmplY3QsIEwiY2xhbXMiKS5Jc0VtcHR5KCkpOwogICBFWFBFQ1RfVFJVRShlbmdpbmUoKS0+R2V0T2JqZWN0UHJvcGVydHkob2JqZWN0LCBMImNsYW1zIiktPklzVW5kZWZpbmVkKCkpOwpkaWZmIC0tZ2l0IGEvZnhqcy9meGpzZS5oIGIvZnhqcy9meGpzZS5oCmluZGV4IDA2OWEzYjIuLjg3M2ZjZjUgMTAwNjQ0Ci0tLSBhL2Z4anMvZnhqc2UuaAorKysgYi9meGpzL2Z4anNlLmgKQEAgLTEzLDI0ICsxMywzNiBAQAogCiBjbGFzcyBDRlhKU0VfQXJndW1lbnRzOwogY2xhc3MgQ0ZYSlNFX1ZhbHVlOworY2xhc3MgQ0pTX1JldHVybjsKIAotLy8gQysrIG9iamVjdCB3aGljaCBjYW4gYmUgd3JhcHBlZCBieSBDRlhKU0VfdmFsdWUuCisvLyBDKysgb2JqZWN0IHdoaWNoIGlzIHJldHJpZXZlZCBmcm9tIHY4IG9iamVjdCdzIHNsb3QuCiBjbGFzcyBDRlhKU0VfSG9zdE9iamVjdCB7CiAgcHVibGljOgogICB2aXJ0dWFsIH5DRlhKU0VfSG9zdE9iamVjdCgpIHt9CisKKyAgLy8gU21hbGwgbGF5ZXJpbmcgdmlvbGF0aW9uIGhlcmUsIGJ1dCB3ZSBuZWVkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdGhlCisgIC8vIHR3byBraW5kcyBvZiBzdWJjbGFzc2VzLgorICBlbnVtIFR5cGUgeyBrWEZBLCBrRk0ySlMgfTsKKyAgVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZV87IH0KKworIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgQ0ZYSlNFX0hvc3RPYmplY3QoVHlwZSB0eXBlKSB7IHR5cGVfID0gdHlwZTsgfQorCisgIFR5cGUgdHlwZV87CiB9OwogCit0eXBlZGVmIENKU19SZXR1cm4gKCpGWEpTRV9NZXRob2RDYWxsYmFjaykoCisgICAgY29uc3Qgdjg6OkZ1bmN0aW9uQ2FsbGJhY2tJbmZvPHY4OjpWYWx1ZT4mIGluZm8sCisgICAgY29uc3QgV2lkZVN0cmluZyYgZnVuY3Rpb25OYW1lKTsKIHR5cGVkZWYgdm9pZCAoKkZYSlNFX0Z1bmNDYWxsYmFjaykoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pGdW5jTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7CiB0eXBlZGVmIHZvaWQgKCpGWEpTRV9Qcm9wQWNjZXNzb3IpKENGWEpTRV9WYWx1ZSogcE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgc3pQcm9wTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpOwogdHlwZWRlZiBpbnQzMl90ICgqRlhKU0VfUHJvcFR5cGVHZXR0ZXIpKENGWEpTRV9WYWx1ZSogcE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6UHJvcE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUXVlcnlJbik7Ci10eXBlZGVmIGJvb2wgKCpGWEpTRV9Qcm9wRGVsZXRlcikoQ0ZYSlNFX1ZhbHVlKiBwT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSk7CiAKIGVudW0gRlhKU0VfQ2xhc3NQcm9wVHlwZXMgewogICBGWEpTRV9DbGFzc1Byb3BUeXBlX05vbmUsCkBAIC0zOSwzNiArNTEsMjAgQEAKIH07CiAKIHN0cnVjdCBGWEpTRV9GVU5DVElPTl9ERVNDUklQVE9SIHsKLSAgY29uc3QgRlhfQ0hBUiogbmFtZTsKKyAgY29uc3QgY2hhciogbmFtZTsKICAgRlhKU0VfRnVuY0NhbGxiYWNrIGNhbGxiYWNrUHJvYzsKIH07CiAKLXN0cnVjdCBGWEpTRV9QUk9QRVJUWV9ERVNDUklQVE9SIHsKLSAgY29uc3QgRlhfQ0hBUiogbmFtZTsKLSAgRlhKU0VfUHJvcEFjY2Vzc29yIGdldFByb2M7Ci0gIEZYSlNFX1Byb3BBY2Nlc3NvciBzZXRQcm9jOwotfTsKLQogc3RydWN0IEZYSlNFX0NMQVNTX0RFU0NSSVBUT1IgewotICBjb25zdCBGWF9DSEFSKiBuYW1lOwotICBGWEpTRV9GdW5jQ2FsbGJhY2sgY29uc3RydWN0b3I7Ci0gIGNvbnN0IEZYSlNFX1BST1BFUlRZX0RFU0NSSVBUT1IqIHByb3BlcnRpZXM7CisgIGNvbnN0IGNoYXIqIG5hbWU7CiAgIGNvbnN0IEZYSlNFX0ZVTkNUSU9OX0RFU0NSSVBUT1IqIG1ldGhvZHM7Ci0gIGludDMyX3QgcHJvcE51bTsKICAgaW50MzJfdCBtZXRoTnVtOwogICBGWEpTRV9Qcm9wVHlwZUdldHRlciBkeW5Qcm9wVHlwZUdldHRlcjsKICAgRlhKU0VfUHJvcEFjY2Vzc29yIGR5blByb3BHZXR0ZXI7CiAgIEZYSlNFX1Byb3BBY2Nlc3NvciBkeW5Qcm9wU2V0dGVyOwotICBGWEpTRV9Qcm9wRGVsZXRlciBkeW5Qcm9wRGVsZXRlcjsKLSAgRlhKU0VfRnVuY0NhbGxiYWNrIGR5bk1ldGhvZENhbGw7CisgIEZYSlNFX01ldGhvZENhbGxiYWNrIGR5bk1ldGhvZENhbGw7CiB9OwogCi12b2lkIEZYSlNFX0luaXRpYWxpemUoKTsKLXZvaWQgRlhKU0VfRmluYWxpemUoKTsKLQotdjg6Oklzb2xhdGUqIEZYSlNFX1J1bnRpbWVfQ3JlYXRlX093bigpOwotdm9pZCBGWEpTRV9SdW50aW1lX1JlbGVhc2Uodjg6Oklzb2xhdGUqIHBJc29sYXRlKTsKLQotdm9pZCBGWEpTRV9UaHJvd01lc3NhZ2UoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiB1dGY4TWVzc2FnZSk7Cit2b2lkIEZYSlNFX1Rocm93TWVzc2FnZShjb25zdCBCeXRlU3RyaW5nVmlldyYgdXRmOE1lc3NhZ2UpOwogCiAjZW5kaWYgIC8vIEZYSlNfRlhKU0VfSF8KZGlmZiAtLWdpdCBhL2Z4anMvZ2xvYmFsX3RpbWVyLmNwcCBiL2Z4anMvZ2xvYmFsX3RpbWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjdmMDljCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy9nbG9iYWxfdGltZXIuY3BwCkBAIC0wLDAgKzEsODAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMvZ2xvYmFsX3RpbWVyLmgiCisKK0dsb2JhbFRpbWVyOjpHbG9iYWxUaW1lcihhcHAqIHBPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzY3JpcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdFbGFwc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdUaW1lT3V0KQorICAgIDogbV9uVGltZXJJRCgwKSwKKyAgICAgIG1fcEVtYmVkT2JqKHBPYmopLAorICAgICAgbV9iUHJvY2Vzc2luZyhmYWxzZSksCisgICAgICBtX25UeXBlKG5UeXBlKSwKKyAgICAgIG1fZHdUaW1lT3V0KGR3VGltZU91dCksCisgICAgICBtX3N3SlNjcmlwdChzY3JpcHQpLAorICAgICAgbV9wUnVudGltZShwUnVudGltZSksCisgICAgICBtX3BGb3JtRmlsbEVudihwRm9ybUZpbGxFbnYpIHsKKyAgQ0ZYX1N5c3RlbUhhbmRsZXIqIHBIYW5kbGVyID0gbV9wRm9ybUZpbGxFbnYtPkdldFN5c0hhbmRsZXIoKTsKKyAgbV9uVGltZXJJRCA9IHBIYW5kbGVyLT5TZXRUaW1lcihkd0VsYXBzZSwgVHJpZ2dlcik7CisgIGlmIChtX25UaW1lcklEKQorICAgICgqR2V0R2xvYmFsVGltZXJNYXAoKSlbbV9uVGltZXJJRF0gPSB0aGlzOworfQorCitHbG9iYWxUaW1lcjo6fkdsb2JhbFRpbWVyKCkgeworICBpZiAoIW1fblRpbWVySUQpCisgICAgcmV0dXJuOworCisgIGlmIChHZXRSdW50aW1lKCkpCisgICAgbV9wRm9ybUZpbGxFbnYtPkdldFN5c0hhbmRsZXIoKS0+S2lsbFRpbWVyKG1fblRpbWVySUQpOworCisgIEdldEdsb2JhbFRpbWVyTWFwKCktPmVyYXNlKG1fblRpbWVySUQpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgR2xvYmFsVGltZXI6OlRyaWdnZXIoaW50IG5UaW1lcklEKSB7CisgIGF1dG8gaXQgPSBHZXRHbG9iYWxUaW1lck1hcCgpLT5maW5kKG5UaW1lcklEKTsKKyAgaWYgKGl0ID09IEdldEdsb2JhbFRpbWVyTWFwKCktPmVuZCgpKQorICAgIHJldHVybjsKKworICBHbG9iYWxUaW1lciogcFRpbWVyID0gaXQtPnNlY29uZDsKKyAgaWYgKHBUaW1lci0+bV9iUHJvY2Vzc2luZykKKyAgICByZXR1cm47CisKKyAgcFRpbWVyLT5tX2JQcm9jZXNzaW5nID0gdHJ1ZTsKKyAgaWYgKHBUaW1lci0+bV9wRW1iZWRPYmopCisgICAgcFRpbWVyLT5tX3BFbWJlZE9iai0+VGltZXJQcm9jKHBUaW1lcik7CisKKyAgLy8gVGltZXIgcHJvYyBtYXkgaGF2ZSBkZXN0cm95ZWQgdGltZXIsIGZpbmQgaXQgYWdhaW4uCisgIGl0ID0gR2V0R2xvYmFsVGltZXJNYXAoKS0+ZmluZChuVGltZXJJRCk7CisgIGlmIChpdCA9PSBHZXRHbG9iYWxUaW1lck1hcCgpLT5lbmQoKSkKKyAgICByZXR1cm47CisKKyAgcFRpbWVyID0gaXQtPnNlY29uZDsKKyAgcFRpbWVyLT5tX2JQcm9jZXNzaW5nID0gZmFsc2U7CisgIGlmIChwVGltZXItPklzT25lU2hvdCgpKQorICAgIHBUaW1lci0+bV9wRW1iZWRPYmotPkNhbmNlbFByb2MocFRpbWVyKTsKK30KKworLy8gc3RhdGljCit2b2lkIEdsb2JhbFRpbWVyOjpDYW5jZWwoaW50IG5UaW1lcklEKSB7CisgIGF1dG8gaXQgPSBHZXRHbG9iYWxUaW1lck1hcCgpLT5maW5kKG5UaW1lcklEKTsKKyAgaWYgKGl0ID09IEdldEdsb2JhbFRpbWVyTWFwKCktPmVuZCgpKQorICAgIHJldHVybjsKKworICBHbG9iYWxUaW1lciogcFRpbWVyID0gaXQtPnNlY29uZDsKKyAgcFRpbWVyLT5tX3BFbWJlZE9iai0+Q2FuY2VsUHJvYyhwVGltZXIpOworfQorCisvLyBzdGF0aWMKK0dsb2JhbFRpbWVyOjpUaW1lck1hcCogR2xvYmFsVGltZXI6OkdldEdsb2JhbFRpbWVyTWFwKCkgeworICAvLyBMZWFrIHRoZSB0aW1lciBhcnJheSBhdCBzaHV0ZG93bi4KKyAgc3RhdGljIGF1dG8qIHNfVGltZXJNYXAgPSBuZXcgVGltZXJNYXA7CisgIHJldHVybiBzX1RpbWVyTWFwOworfQpkaWZmIC0tZ2l0IGEvZnhqcy9nbG9iYWxfdGltZXIuaCBiL2Z4anMvZ2xvYmFsX3RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM4ODA2YgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvZ2xvYmFsX3RpbWVyLmgKQEAgLTAsMCArMSw1MCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfR0xPQkFMX1RJTUVSX0hfCisjZGVmaW5lIEZYSlNfR0xPQkFMX1RJTUVSX0hfCisKKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlICJmeGpzL2Nqc19hcHAuaCIKKworY2xhc3MgR2xvYmFsVGltZXIgeworIHB1YmxpYzoKKyAgR2xvYmFsVGltZXIoYXBwKiBwT2JqLAorICAgICAgICAgICAgICBDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKKyAgICAgICAgICAgICAgQ0pTX1J1bnRpbWUqIHBSdW50aW1lLAorICAgICAgICAgICAgICBpbnQgblR5cGUsCisgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHNjcmlwdCwKKyAgICAgICAgICAgICAgdWludDMyX3QgZHdFbGFwc2UsCisgICAgICAgICAgICAgIHVpbnQzMl90IGR3VGltZU91dCk7CisgIH5HbG9iYWxUaW1lcigpOworCisgIHN0YXRpYyB2b2lkIFRyaWdnZXIoaW50IG5UaW1lcklEKTsKKyAgc3RhdGljIHZvaWQgQ2FuY2VsKGludCBuVGltZXJJRCk7CisKKyAgYm9vbCBJc09uZVNob3QoKSBjb25zdCB7IHJldHVybiBtX25UeXBlID09IDE7IH0KKyAgdWludDMyX3QgR2V0VGltZU91dCgpIGNvbnN0IHsgcmV0dXJuIG1fZHdUaW1lT3V0OyB9CisgIGludCBHZXRUaW1lcklEKCkgY29uc3QgeyByZXR1cm4gbV9uVGltZXJJRDsgfQorICBDSlNfUnVudGltZSogR2V0UnVudGltZSgpIGNvbnN0IHsgcmV0dXJuIG1fcFJ1bnRpbWUuR2V0KCk7IH0KKyAgV2lkZVN0cmluZyBHZXRKU2NyaXB0KCkgY29uc3QgeyByZXR1cm4gbV9zd0pTY3JpcHQ7IH0KKworIHByaXZhdGU6CisgIHVzaW5nIFRpbWVyTWFwID0gc3RkOjptYXA8dWludDMyX3QsIEdsb2JhbFRpbWVyKj47CisgIHN0YXRpYyBUaW1lck1hcCogR2V0R2xvYmFsVGltZXJNYXAoKTsKKworICB1aW50MzJfdCBtX25UaW1lcklEOworICBhcHAqIGNvbnN0IG1fcEVtYmVkT2JqOworICBib29sIG1fYlByb2Nlc3Npbmc7CisKKyAgLy8gZGF0YQorICBjb25zdCBpbnQgbV9uVHlwZTsgIC8vIDA6SW50ZXJ2YWw7IDE6VGltZU91dAorICBjb25zdCB1aW50MzJfdCBtX2R3VGltZU91dDsKKyAgY29uc3QgV2lkZVN0cmluZyBtX3N3SlNjcmlwdDsKKyAgQ0pTX1J1bnRpbWU6Ok9ic2VydmVkUHRyIG1fcFJ1bnRpbWU7CisgIENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudDo6T2JzZXJ2ZWRQdHIgbV9wRm9ybUZpbGxFbnY7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfR0xPQkFMX1RJTUVSX0hfCmRpZmYgLS1naXQgYS9meGpzL2lqc19ldmVudF9jb250ZXh0LmggYi9meGpzL2lqc19ldmVudF9jb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4ZGQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvaWpzX2V2ZW50X2NvbnRleHQuaApAQCAtMCwwICsxLDEzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfSUpTX0VWRU5UX0NPTlRFWFRfSF8KKyNkZWZpbmUgRlhKU19JSlNfRVZFTlRfQ09OVEVYVF9IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorCitjbGFzcyBDUERGX0Jvb2ttYXJrOworY2xhc3MgQ1BERl9Gb3JtRmllbGQ7CitjbGFzcyBDUERGU0RLX0Fubm90OworY2xhc3MgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OworCisvLyBSZWNvcmRzIHRoZSBkZXRhaWxzIG9mIGFuIGV2ZW50IGFuZCB0cmlnZ2VycyBKUyBleGVjdXRpb24gZm9yIGl0LiBUaGVyZQorLy8gY2FuIGJlIG1vcmUgdGhhbiBvbmUgb2YgdGhlc2UgYXQgYW55IGdpdmVuIHRpbWUsIGFzIEpTIGNhbGxiYWNrcyB0byBDKysKKy8vIG1heSB0cmlnZ2VyIG5ldyBldmVudHMgb24gdG9wIG9mIG9uZSBhbm90aGVyLgorY2xhc3MgSUpTX0V2ZW50Q29udGV4dCB7CisgcHVibGljOgorICB2aXJ0dWFsIGJvb2wgUnVuU2NyaXB0KGNvbnN0IFdpZGVTdHJpbmcmIHNjcmlwdCwgV2lkZVN0cmluZyogaW5mbykgPSAwOworCisgIHZpcnR1YWwgdm9pZCBPbkFwcF9Jbml0KCkgPSAwOworCisgIHZpcnR1YWwgdm9pZCBPbkRvY19PcGVuKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzdHJUYXJnZXROYW1lKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbkRvY19XaWxsUHJpbnQoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uRG9jX0RpZFByaW50KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbkRvY19XaWxsU2F2ZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgPSAwOworICB2aXJ0dWFsIHZvaWQgT25Eb2NfRGlkU2F2ZShDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgPSAwOworICB2aXJ0dWFsIHZvaWQgT25Eb2NfV2lsbENsb3NlKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIE9uUGFnZV9PcGVuKENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblBhZ2VfQ2xvc2UoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uUGFnZV9JblZpZXcoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uUGFnZV9PdXRWaWV3KENQREZTREtfRm9ybUZpbGxFbnZpcm9ubWVudCogcEZvcm1GaWxsRW52KSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIE9uRmllbGRfTW91c2VEb3duKGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25GaWVsZF9Nb3VzZUVudGVyKGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbkZpZWxkX01vdXNlRXhpdChib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uRmllbGRfTW91c2VVcChib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25GaWVsZF9Gb2N1cyhib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBWYWx1ZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25GaWVsZF9CbHVyKGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9ybUZpZWxkKiBwVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIFZhbHVlKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIE9uRmllbGRfQ2FsY3VsYXRlKENQREZfRm9ybUZpZWxkKiBwU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJSYykgPSAwOworICB2aXJ0dWFsIHZvaWQgT25GaWVsZF9Gb3JtYXQoQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYldpbGxDb21taXQpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uRmllbGRfS2V5c3Ryb2tlKFdpZGVTdHJpbmcmIHN0ckNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHN0ckNoYW5nZUV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBLZXlEb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5TZWxFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQmIG5TZWxTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb3JtRmllbGQqIHBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYldpbGxDb21taXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGaWVsZEZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiUmMpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uRmllbGRfVmFsaWRhdGUoV2lkZVN0cmluZyYgc3RyQ2hhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBzdHJDaGFuZ2VFeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiS2V5RG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0Zvcm1GaWVsZCogcFRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyYgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJSYykgPSAwOworCisgIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9Gb2N1cyhib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworICB2aXJ0dWFsIHZvaWQgT25TY3JlZW5fQmx1cihib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uU2NyZWVuX09wZW4oYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9DbG9zZShib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworICB2aXJ0dWFsIHZvaWQgT25TY3JlZW5fTW91c2VEb3duKGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uU2NyZWVuX01vdXNlVXAoYm9vbCBiTW9kaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9Nb3VzZUVudGVyKGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworICB2aXJ0dWFsIHZvaWQgT25TY3JlZW5fTW91c2VFeGl0KGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZTREtfQW5ub3QqIHBTY3JlZW4pID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uU2NyZWVuX0luVmlldyhib29sIGJNb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGU0RLX0Fubm90KiBwU2NyZWVuKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPblNjcmVlbl9PdXRWaWV3KGJvb2wgYk1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERlNES19Bbm5vdCogcFNjcmVlbikgPSAwOworCisgIHZpcnR1YWwgdm9pZCBPbkJvb2ttYXJrX01vdXNlVXAoQ1BERl9Cb29rbWFyayogcEJvb2tNYXJrKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbkxpbmtfTW91c2VVcChDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgPSAwOworCisgIHZpcnR1YWwgdm9pZCBPbk1lbnVfRXhlYyhDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbkJhdGNoRXhlYyhDUERGU0RLX0Zvcm1GaWxsRW52aXJvbm1lbnQqIHBGb3JtRmlsbEVudikgPSAwOworICB2aXJ0dWFsIHZvaWQgT25Db25zb2xlX0V4ZWMoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBPbkV4dGVybmFsX0V4ZWMoKSA9IDA7CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgfklKU19FdmVudENvbnRleHQoKSB7fQorfTsKKworI2VuZGlmICAvLyBGWEpTX0lKU19FVkVOVF9DT05URVhUX0hfCmRpZmYgLS1naXQgYS9meGpzL2lqc19ydW50aW1lLmggYi9meGpzL2lqc19ydW50aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0OWFhZAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvaWpzX3J1bnRpbWUuaApAQCAtMCwwICsxLDQ0IEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19JSlNfUlVOVElNRV9IXworI2RlZmluZSBGWEpTX0lKU19SVU5USU1FX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorI2luY2x1ZGUgImZ4anMvZnhqc2UuaCIKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworY2xhc3MgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50OworY2xhc3MgSUpTX0V2ZW50Q29udGV4dDsKKworLy8gT3ducyB0aGUgRkpYUyBvYmplY3RzIG5lZWRlZCB0byBhY3R1YWxseSBleGVjdXRlIEpTLgorY2xhc3MgSUpTX1J1bnRpbWUgeworIHB1YmxpYzoKKyAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSh1bnNpZ25lZCBpbnQgc2xvdCwgdm9pZCogaXNvbGF0ZSk7CisgIHN0YXRpYyB2b2lkIERlc3Ryb3koKTsKKyAgc3RhdGljIElKU19SdW50aW1lKiBDcmVhdGUoQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBwRm9ybUZpbGxFbnYpOworICB2aXJ0dWFsIH5JSlNfUnVudGltZSgpIHt9CisKKyAgdmlydHVhbCBJSlNfRXZlbnRDb250ZXh0KiBOZXdFdmVudENvbnRleHQoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBSZWxlYXNlRXZlbnRDb250ZXh0KElKU19FdmVudENvbnRleHQqIHBDb250ZXh0KSA9IDA7CisgIHZpcnR1YWwgQ1BERlNES19Gb3JtRmlsbEVudmlyb25tZW50KiBHZXRGb3JtRmlsbEVudigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBpbnQgRXhlY3V0ZVNjcmlwdChjb25zdCBXaWRlU3RyaW5nJiBzY3JpcHQsIFdpZGVTdHJpbmcqIGluZm8pID0gMDsKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisgIHZpcnR1YWwgYm9vbCBHZXRWYWx1ZUJ5TmFtZShjb25zdCBCeXRlU3RyaW5nVmlldyYgdXRmOE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHBWYWx1ZSkgPSAwOworICB2aXJ0dWFsIGJvb2wgU2V0VmFsdWVCeU5hbWUoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHV0ZjhOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpID0gMDsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworIHByb3RlY3RlZDoKKyAgSUpTX1J1bnRpbWUoKSB7fQorfTsKKworI2VuZGlmICAvLyBGWEpTX0lKU19SVU5USU1FX0hfCmRpZmYgLS1naXQgYS9meGpzL2pzX3Jlc291cmNlcy5jcHAgYi9meGpzL2pzX3Jlc291cmNlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmZmJjMwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvanNfcmVzb3VyY2VzLmNwcApAQCAtMCwwICsxLDcwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL2pzX3Jlc291cmNlcy5oIgorCitXaWRlU3RyaW5nIEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZSBtc2cpIHsKKyAgc3dpdGNoIChtc2cpIHsKKyAgICBjYXNlIEpTTWVzc2FnZTo6a0FsZXJ0OgorICAgICAgcmV0dXJuIEwiQWxlcnQiOworICAgIGNhc2UgSlNNZXNzYWdlOjprUGFyYW1FcnJvcjoKKyAgICAgIHJldHVybiBMIkluY29ycmVjdCBudW1iZXIgb2YgcGFyYW1ldGVycyBwYXNzZWQgdG8gZnVuY3Rpb24uIjsKKyAgICBjYXNlIEpTTWVzc2FnZTo6a0ludmFsaWRJbnB1dEVycm9yOgorICAgICAgcmV0dXJuIEwiVGhlIGlucHV0IHZhbHVlIGlzIGludmFsaWQuIjsKKyAgICBjYXNlIEpTTWVzc2FnZTo6a1BhcmFtVG9vTG9uZ0Vycm9yOgorICAgICAgcmV0dXJuIEwiVGhlIGlucHV0IHZhbHVlIGlzIHRvbyBsb25nLiI7CisgICAgY2FzZSBKU01lc3NhZ2U6OmtQYXJzZURhdGVFcnJvcjoKKyAgICAgIHJldHVybiBMIlRoZSBpbnB1dCB2YWx1ZSBjYW4ndCBiZSBwYXJzZWQgYXMgYSB2YWxpZCBkYXRlL3RpbWUgKCVzKS4iOworICAgIGNhc2UgSlNNZXNzYWdlOjprUmFuZ2VCZXR3ZWVuRXJyb3I6CisgICAgICByZXR1cm4gTCJUaGUgaW5wdXQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMiCisgICAgICAgICAgICAgTCIgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcy4iOworICAgIGNhc2UgSlNNZXNzYWdlOjprUmFuZ2VHcmVhdGVyRXJyb3I6CisgICAgICByZXR1cm4gTCJUaGUgaW5wdXQgdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMuIjsKKyAgICBjYXNlIEpTTWVzc2FnZTo6a1JhbmdlTGVzc0Vycm9yOgorICAgICAgcmV0dXJuIEwiVGhlIGlucHV0IHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzLiI7CisgICAgY2FzZSBKU01lc3NhZ2U6OmtOb3RTdXBwb3J0ZWRFcnJvcjoKKyAgICAgIHJldHVybiBMIk9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkLiI7CisgICAgY2FzZSBKU01lc3NhZ2U6OmtCdXN5RXJyb3I6CisgICAgICByZXR1cm4gTCJTeXN0ZW0gaXMgYnVzeS4iOworICAgIGNhc2UgSlNNZXNzYWdlOjprRHVwbGljYXRlRXZlbnRFcnJvcjoKKyAgICAgIHJldHVybiBMIkR1cGxpY2F0ZSBmb3JtZmllbGQgZXZlbnQgZm91bmQuIjsKKyAgICBjYXNlIEpTTWVzc2FnZTo6a1J1blN1Y2Nlc3M6CisgICAgICByZXR1cm4gTCJTY3JpcHQgcmFuIHN1Y2Nlc3NmdWxseS4iOworICAgIGNhc2UgSlNNZXNzYWdlOjprU2Vjb25kUGFyYW1Ob3REYXRlRXJyb3I6CisgICAgICByZXR1cm4gTCJUaGUgc2Vjb25kIHBhcmFtZXRlciBjYW4ndCBiZSBjb252ZXJ0ZWQgdG8gYSBEYXRlLiI7CisgICAgY2FzZSBKU01lc3NhZ2U6OmtTZWNvbmRQYXJhbUludmFsaWREYXRlRXJyb3I6CisgICAgICByZXR1cm4gTCJUaGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhbiBpbnZhbGlkIERhdGUhIjsKKyAgICBjYXNlIEpTTWVzc2FnZTo6a0dsb2JhbE5vdEZvdW5kRXJyb3I6CisgICAgICByZXR1cm4gTCJHbG9iYWwgdmFsdWUgbm90IGZvdW5kLiI7CisgICAgY2FzZSBKU01lc3NhZ2U6OmtSZWFkT25seUVycm9yOgorICAgICAgcmV0dXJuIEwiQ2Fubm90IGFzc2lnbiB0byByZWFkb25seSBwcm9wZXJ0eS4iOworICAgIGNhc2UgSlNNZXNzYWdlOjprVHlwZUVycm9yOgorICAgICAgcmV0dXJuIEwiSW5jb3JyZWN0IHBhcmFtZXRlciB0eXBlLiI7CisgICAgY2FzZSBKU01lc3NhZ2U6OmtWYWx1ZUVycm9yOgorICAgICAgcmV0dXJuIEwiSW5jb3JyZWN0IHBhcmFtZXRlciB2YWx1ZS4iOworICAgIGNhc2UgSlNNZXNzYWdlOjprUGVybWlzc2lvbkVycm9yOgorICAgICAgcmV0dXJuIEwiUGVybWlzc2lvbiBkZW5pZWQuIjsKKyAgICBjYXNlIEpTTWVzc2FnZTo6a0JhZE9iamVjdEVycm9yOgorICAgICAgcmV0dXJuIEwiT2JqZWN0IG5vIGxvbmdlciBleGlzdHMuIjsKKyAgICBjYXNlIEpTTWVzc2FnZTo6a1Rvb01hbnlPY2N1cmFuY2VzOgorICAgICAgcmV0dXJuIEwiVG9vIG1hbnkgb2NjdXJhbmNlcyI7CisgIH0KKyAgTk9UUkVBQ0hFRCgpOworICByZXR1cm4gTCIiOworfQorCitXaWRlU3RyaW5nIEpTRm9ybWF0RXJyb3JTdHJpbmcoY29uc3QgY2hhciogY2xhc3NfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwcm9wZXJ0eV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIGRldGFpbHMpIHsKKyAgV2lkZVN0cmluZyByZXN1bHQgPSBXaWRlU3RyaW5nOjpGcm9tTG9jYWwoY2xhc3NfbmFtZSk7CisgIGlmIChwcm9wZXJ0eV9uYW1lKSB7CisgICAgcmVzdWx0ICs9IEwiLiI7CisgICAgcmVzdWx0ICs9IFdpZGVTdHJpbmc6OkZyb21Mb2NhbChwcm9wZXJ0eV9uYW1lKTsKKyAgfQorICByZXN1bHQgKz0gTCI6ICI7CisgIHJlc3VsdCArPSBkZXRhaWxzOworICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvZnhqcy9qc19yZXNvdXJjZXMuaCBiL2Z4anMvanNfcmVzb3VyY2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI2NjRjOQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMvanNfcmVzb3VyY2VzLmgKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfSlNfUkVTT1VSQ0VTX0hfCisjZGVmaW5lIEZYSlNfSlNfUkVTT1VSQ0VTX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3dpZGVzdHJpbmcuaCIKKworZW51bSBjbGFzcyBKU01lc3NhZ2UgeworICBrUnVuU3VjY2VzcyA9IDAsCisgIGtBbGVydCwKKyAga1BhcmFtRXJyb3IsCisgIGtJbnZhbGlkSW5wdXRFcnJvciwKKyAga1BhcmFtVG9vTG9uZ0Vycm9yLAorICBrUGFyc2VEYXRlRXJyb3IsCisgIGtSYW5nZUJldHdlZW5FcnJvciwKKyAga1JhbmdlR3JlYXRlckVycm9yLAorICBrUmFuZ2VMZXNzRXJyb3IsCisgIGtOb3RTdXBwb3J0ZWRFcnJvciwKKyAga0J1c3lFcnJvciwKKyAga0R1cGxpY2F0ZUV2ZW50RXJyb3IsCisgIGtTZWNvbmRQYXJhbU5vdERhdGVFcnJvciwKKyAga1NlY29uZFBhcmFtSW52YWxpZERhdGVFcnJvciwKKyAga0dsb2JhbE5vdEZvdW5kRXJyb3IsCisgIGtSZWFkT25seUVycm9yLAorICBrVHlwZUVycm9yLAorICBrVmFsdWVFcnJvciwKKyAga1Blcm1pc3Npb25FcnJvciwKKyAga0JhZE9iamVjdEVycm9yLAorICBrVG9vTWFueU9jY3VyYW5jZXMKK307CisKK1dpZGVTdHJpbmcgSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlIG1zZyk7CitXaWRlU3RyaW5nIEpTRm9ybWF0RXJyb3JTdHJpbmcoY29uc3QgY2hhciogY2xhc3NfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwcm9wZXJ0eV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIGRldGFpbHMpOworCisjZW5kaWYgIC8vIEZYSlNfSlNfUkVTT1VSQ0VTX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfYXJjLmNwcCBiL2Z4anMveGZhL2NqeF9hcmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYjYyNmQKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfYXJjLmNwcApAQCAtMCwwICsxLDQ5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfYXJjLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hcmMuaCIKKworQ0pYX0FyYzo6Q0pYX0FyYyhDWEZBX0FyYyogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfQXJjOjp+Q0pYX0FyYygpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfQXJjOjpjaXJjdWxhcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9BcmM6OmhhbmQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0FyYzo6c3RhcnRBbmdsZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQXJjOjpzd2VlcEFuZ2xlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9BcmM6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0FyYzo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9hcmMuaCBiL2Z4anMveGZhL2NqeF9hcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWE2YmI2Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2FyYy5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfQVJDX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9BUkNfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfQXJjOworCitjbGFzcyBDSlhfQXJjIDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9BcmMoQ1hGQV9BcmMqIG5vZGUpOworICB+Q0pYX0FyYygpIG92ZXJyaWRlOworCisgIEpTX1BST1AoY2lyY3VsYXIpOworICBKU19QUk9QKGhhbmQpOworICBKU19QUk9QKHN0YXJ0QW5nbGUpOworICBKU19QUk9QKHN3ZWVwQW5nbGUpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9BUkNfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9hcmVhLmNwcCBiL2Z4anMveGZhL2NqeF9hcmVhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTYyMTk0Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2FyZWEuY3BwCkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9hcmVhLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hcmVhLmgiCisKK0NKWF9BcmVhOjpDSlhfQXJlYShDWEZBX0FyZWEqIG5vZGUpIDogQ0pYX0NvbnRhaW5lcihub2RlKSB7fQorCitDSlhfQXJlYTo6fkNKWF9BcmVhKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9BcmVhOjpjb2xTcGFuKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0FyZWE6OnJlbGV2YW50KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQXJlYTo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9BcmVhOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0FyZWE6OngoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQXJlYTo6eShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2FyZWEuaCBiL2Z4anMveGZhL2NqeF9hcmVhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQwODNiMwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9hcmVhLmgKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9BUkVBX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9BUkVBX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfY29udGFpbmVyLmgiCisKK2NsYXNzIENYRkFfQXJlYTsKKworY2xhc3MgQ0pYX0FyZWEgOiBwdWJsaWMgQ0pYX0NvbnRhaW5lciB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfQXJlYShDWEZBX0FyZWEqIG5vZGUpOworICB+Q0pYX0FyZWEoKSBvdmVycmlkZTsKKworICBKU19QUk9QKGNvbFNwYW4pOworICBKU19QUk9QKHJlbGV2YW50KTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworICBKU19QUk9QKHgpOworICBKU19QUk9QKHkpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfQVJFQV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2Fzc2lzdC5jcHAgYi9meGpzL3hmYS9janhfYXNzaXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2Q3ZjM3Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2Fzc2lzdC5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2Fzc2lzdC5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXNzaXN0LmgiCisKK0NKWF9Bc3Npc3Q6OkNKWF9Bc3Npc3QoQ1hGQV9Bc3Npc3QqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX0Fzc2lzdDo6fkNKWF9Bc3Npc3QoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0Fzc2lzdDo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQXNzaXN0Ojpyb2xlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Bc3Npc3Q6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfYXNzaXN0LmggYi9meGpzL3hmYS9janhfYXNzaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU3YzljNQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9hc3Npc3QuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0FTU0lTVF9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfQVNTSVNUX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX0Fzc2lzdDsKKworY2xhc3MgQ0pYX0Fzc2lzdCA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfQXNzaXN0KENYRkFfQXNzaXN0KiBub2RlKTsKKyAgfkNKWF9Bc3Npc3QoKSBvdmVycmlkZTsKKworICBKU19QUk9QKHJvbGUpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9BU1NJU1RfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9iYXJjb2RlLmNwcCBiL2Z4anMveGZhL2NqeF9iYXJjb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTIwY2MzCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2JhcmNvZGUuY3BwCkBAIC0wLDAgKzEsMTMzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfYmFyY29kZS5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmFyY29kZS5oIgorCitDSlhfQmFyY29kZTo6Q0pYX0JhcmNvZGUoQ1hGQV9CYXJjb2RlKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9CYXJjb2RlOjp+Q0pYX0JhcmNvZGUoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0JhcmNvZGU6OmNoYXJFbmNvZGluZyhDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQmFyY29kZTo6Y2hlY2tzdW0oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9CYXJjb2RlOjpkYXRhQ29sdW1uQ291bnQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0JhcmNvZGU6OmRhdGFMZW5ndGgoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQmFyY29kZTo6ZGF0YVByZXAoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9CYXJjb2RlOjpkYXRhUm93Q291bnQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0JhcmNvZGU6OmVuZENoYXIoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQmFyY29kZTo6ZXJyb3JDb3JyZWN0aW9uTGV2ZWwoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9CYXJjb2RlOjptb2R1bGVIZWlnaHQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0JhcmNvZGU6Om1vZHVsZVdpZHRoKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQmFyY29kZTo6cHJpbnRDaGVja0RpZ2l0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9CYXJjb2RlOjpyb3dDb2x1bW5SYXRpbyhDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0JhcmNvZGU6OnN0YXJ0Q2hhcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQmFyY29kZTo6dGV4dExvY2F0aW9uKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9CYXJjb2RlOjp0cnVuY2F0ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0JhcmNvZGU6OnR5cGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQmFyY29kZTo6dXBzTW9kZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9CYXJjb2RlOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0JhcmNvZGU6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQmFyY29kZTo6d2lkZU5hcnJvd1JhdGlvKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2JhcmNvZGUuaCBiL2Z4anMveGZhL2NqeF9iYXJjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVkODg4MQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9iYXJjb2RlLmgKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9CQVJDT0RFX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9CQVJDT0RFX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX0JhcmNvZGU7CisKK2NsYXNzIENKWF9CYXJjb2RlIDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9CYXJjb2RlKENYRkFfQmFyY29kZSogYXJjKTsKKyAgfkNKWF9CYXJjb2RlKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChjaGFyRW5jb2RpbmcpOworICBKU19QUk9QKGNoZWNrc3VtKTsKKyAgSlNfUFJPUChkYXRhQ29sdW1uQ291bnQpOworICBKU19QUk9QKGRhdGFMZW5ndGgpOworICBKU19QUk9QKGRhdGFQcmVwKTsKKyAgSlNfUFJPUChkYXRhUm93Q291bnQpOworICBKU19QUk9QKGVuZENoYXIpOworICBKU19QUk9QKGVycm9yQ29ycmVjdGlvbkxldmVsKTsKKyAgSlNfUFJPUChtb2R1bGVIZWlnaHQpOworICBKU19QUk9QKG1vZHVsZVdpZHRoKTsKKyAgSlNfUFJPUChwcmludENoZWNrRGlnaXQpOworICBKU19QUk9QKHJvd0NvbHVtblJhdGlvKTsKKyAgSlNfUFJPUChzdGFydENoYXIpOworICBKU19QUk9QKHRleHRMb2NhdGlvbik7CisgIEpTX1BST1AodHJ1bmNhdGUpOworICBKU19QUk9QKHR5cGUpOworICBKU19QUk9QKHVwc01vZGUpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7CisgIEpTX1BST1Aod2lkZU5hcnJvd1JhdGlvKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0JBUkNPREVfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9iaW5kLmNwcCBiL2Z4anMveGZhL2NqeF9iaW5kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzMzMTJkCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2JpbmQuY3BwCkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9iaW5kLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9iaW5kLmgiCisKK0NKWF9CaW5kOjpDSlhfQmluZChDWEZBX0JpbmQqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX0JpbmQ6On5DSlhfQmluZCgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfQmluZDo6Y29udGVudFR5cGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9CaW5kOjptYXRjaChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0JpbmQ6OnJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQmluZDo6dHJhbnNmZXJFbmNvZGluZyhDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9CaW5kOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0JpbmQ6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9iaW5kLmggYi9meGpzL3hmYS9janhfYmluZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYzhhYjgKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfYmluZC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfQklORF9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfQklORF9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9CaW5kOworCitjbGFzcyBDSlhfQmluZCA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfQmluZChDWEZBX0JpbmQqIG5vZGUpOworICB+Q0pYX0JpbmQoKSBvdmVycmlkZTsKKworICBKU19QUk9QKGNvbnRlbnRUeXBlKTsKKyAgSlNfUFJPUChtYXRjaCk7CisgIEpTX1BST1AocmVmKTsKKyAgSlNfUFJPUCh0cmFuc2ZlckVuY29kaW5nKTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfQklORF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2JpbmRpdGVtcy5jcHAgYi9meGpzL3hmYS9janhfYmluZGl0ZW1zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDFmMzBkCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2JpbmRpdGVtcy5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2JpbmRpdGVtcy5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmluZGl0ZW1zLmgiCisKK0NKWF9CaW5kSXRlbXM6OkNKWF9CaW5kSXRlbXMoQ1hGQV9CaW5kSXRlbXMqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX0JpbmRJdGVtczo6fkNKWF9CaW5kSXRlbXMoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0JpbmRJdGVtczo6Y29ubmVjdGlvbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQmluZEl0ZW1zOjpsYWJlbFJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9CaW5kSXRlbXM6OnZhbHVlUmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfYmluZGl0ZW1zLmggYi9meGpzL3hmYS9janhfYmluZGl0ZW1zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ3YjNmYQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9iaW5kaXRlbXMuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0JJTkRJVEVNU19IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfQklORElURU1TX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX0JpbmRJdGVtczsKKworY2xhc3MgQ0pYX0JpbmRJdGVtcyA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfQmluZEl0ZW1zKENYRkFfQmluZEl0ZW1zKiBub2RlKTsKKyAgfkNKWF9CaW5kSXRlbXMoKSBvdmVycmlkZTsKKworICBKU19QUk9QKGNvbm5lY3Rpb24pOworICBKU19QUk9QKGxhYmVsUmVmKTsKKyAgSlNfUFJPUCh2YWx1ZVJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9CSU5ESVRFTVNfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9ib29rZW5kLmNwcCBiL2Z4anMveGZhL2NqeF9ib29rZW5kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzk5ZTI2Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2Jvb2tlbmQuY3BwCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ib29rZW5kLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib29rZW5kLmgiCisKK0NKWF9Cb29rZW5kOjpDSlhfQm9va2VuZChDWEZBX0Jvb2tlbmQqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX0Jvb2tlbmQ6On5DSlhfQm9va2VuZCgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfQm9va2VuZDo6bGVhZGVyKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Cb29rZW5kOjp0cmFpbGVyKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0Jvb2tlbmQ6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQm9va2VuZDo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2Jvb2tlbmQuaCBiL2Z4anMveGZhL2NqeF9ib29rZW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2NTA5MQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9ib29rZW5kLmgKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9CT09LRU5EX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9CT09LRU5EX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX0Jvb2tlbmQ7CisKK2NsYXNzIENKWF9Cb29rZW5kIDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9Cb29rZW5kKENYRkFfQm9va2VuZCogbm9kZSk7CisgIH5DSlhfQm9va2VuZCgpIG92ZXJyaWRlOworCisgIEpTX1BST1AobGVhZGVyKTsKKyAgSlNfUFJPUCh0cmFpbGVyKTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfQk9PS0VORF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2Jvb2xlYW4uY3BwIGIvZnhqcy94ZmEvY2p4X2Jvb2xlYW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MWQwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfYm9vbGVhbi5jcHAKQEAgLTAsMCArMSw1NyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2Jvb2xlYW4uaCIKKworI2luY2x1ZGUgImZ4anMvY2Z4anNlX3ZhbHVlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV93aWRnZXRhY2MuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib29sZWFuLmgiCisKK0NKWF9Cb29sZWFuOjpDSlhfQm9vbGVhbihDWEZBX0Jvb2xlYW4qIG5vZGUpIDogQ0pYX0NvbnRlbnQobm9kZSkge30KKworQ0pYX0Jvb2xlYW46On5DSlhfQm9vbGVhbigpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfQm9vbGVhbjo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Cb29sZWFuOjpkZWZhdWx0VmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgaWYgKCFiU2V0dGluZykgeworICAgIFdpZGVTdHJpbmcgd3NWYWx1ZSA9IEdldENvbnRlbnQodHJ1ZSk7CisgICAgcFZhbHVlLT5TZXRCb29sZWFuKHdzVmFsdWUgPT0gTCIxIik7CisgICAgcmV0dXJuOworICB9CisKKyAgQnl0ZVN0cmluZyBuZXdWYWx1ZTsKKyAgaWYgKHBWYWx1ZSAmJiAhKHBWYWx1ZS0+SXNOdWxsKCkgfHwgcFZhbHVlLT5Jc1VuZGVmaW5lZCgpKSkKKyAgICBuZXdWYWx1ZSA9IHBWYWx1ZS0+VG9TdHJpbmcoKTsKKworICBpbnQzMl90IGlWYWx1ZSA9IEZYU1lTX2F0b2kobmV3VmFsdWUuY19zdHIoKSk7CisgIFdpZGVTdHJpbmcgd3NOZXdWYWx1ZShpVmFsdWUgPT0gMCA/IEwiMCIgOiBMIjEiKTsKKyAgV2lkZVN0cmluZyB3c0Zvcm1hdFZhbHVlKHdzTmV3VmFsdWUpOworICBDWEZBX1dpZGdldEFjYyogcENvbnRhaW5lcldpZGdldEFjYyA9CisgICAgICBUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5HZXRDb250YWluZXJXaWRnZXRBY2MoKTsKKyAgaWYgKHBDb250YWluZXJXaWRnZXRBY2MpCisgICAgd3NGb3JtYXRWYWx1ZSA9IHBDb250YWluZXJXaWRnZXRBY2MtPkdldEZvcm1hdERhdGFWYWx1ZSh3c05ld1ZhbHVlKTsKKworICBTZXRDb250ZW50KHdzTmV3VmFsdWUsIHdzRm9ybWF0VmFsdWUsIHRydWUsIHRydWUsIHRydWUpOworfQorCit2b2lkIENKWF9Cb29sZWFuOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0Jvb2xlYW46OnZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBkZWZhdWx0VmFsdWUocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfYm9vbGVhbi5oIGIvZnhqcy94ZmEvY2p4X2Jvb2xlYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTAyOTFhCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2Jvb2xlYW4uaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0JPT0xFQU5fSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0JPT0xFQU5fSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9jb250ZW50LmgiCisKK2NsYXNzIENYRkFfQm9vbGVhbjsKKworY2xhc3MgQ0pYX0Jvb2xlYW4gOiBwdWJsaWMgQ0pYX0NvbnRlbnQgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0Jvb2xlYW4oQ1hGQV9Cb29sZWFuKiBub2RlKTsKKyAgfkNKWF9Cb29sZWFuKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKGRlZmF1bHRWYWx1ZSk7IC8qIHtkZWZhdWx0fSAqLworICBKU19QUk9QKHVzZWhyZWYpOworICBKU19QUk9QKHZhbHVlKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0JPT0xFQU5fSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9ib3JkZXIuY3BwIGIvZnhqcy94ZmEvY2p4X2JvcmRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIzNTVhOAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9ib3JkZXIuY3BwCkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ib3JkZXIuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2JvcmRlci5oIgorCitDSlhfQm9yZGVyOjpDSlhfQm9yZGVyKENYRkFfQm9yZGVyKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9Cb3JkZXI6On5DSlhfQm9yZGVyKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9Cb3JkZXI6OmJyZWFrVmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0JvcmRlcjo6aGFuZChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQm9yZGVyOjpwcmVzZW5jZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Cb3JkZXI6OnJlbGV2YW50KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0JvcmRlcjo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQm9yZGVyOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2JvcmRlci5oIGIvZnhqcy94ZmEvY2p4X2JvcmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NWNhNGMKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfYm9yZGVyLmgKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9CT1JERVJfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0JPUkRFUl9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9Cb3JkZXI7CisKK2NsYXNzIENKWF9Cb3JkZXIgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0JvcmRlcihDWEZBX0JvcmRlciogbm9kZSk7CisgIH5DSlhfQm9yZGVyKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChicmVha1ZhbHVlKTsgLyogYnJlYWsgKi8KKyAgSlNfUFJPUChoYW5kKTsKKyAgSlNfUFJPUChwcmVzZW5jZSk7CisgIEpTX1BST1AocmVsZXZhbnQpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9CT1JERVJfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9icmVhay5jcHAgYi9meGpzL3hmYS9janhfYnJlYWsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNGEwNWYKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfYnJlYWsuY3BwCkBAIC0wLDAgKzEsODUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9icmVhay5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYnJlYWsuaCIKKworQ0pYX0JyZWFrOjpDSlhfQnJlYWsoQ1hGQV9CcmVhayogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfQnJlYWs6On5DSlhfQnJlYWsoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0JyZWFrOjphZnRlcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQnJlYWs6OmFmdGVyVGFyZ2V0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9CcmVhazo6YmVmb3JlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0JyZWFrOjpiZWZvcmVUYXJnZXQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQnJlYWs6OmJvb2tlbmRMZWFkZXIoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9CcmVhazo6Ym9va2VuZFRyYWlsZXIoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0JyZWFrOjpvdmVyZmxvd0xlYWRlcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQnJlYWs6Om92ZXJmbG93VGFyZ2V0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9CcmVhazo6b3ZlcmZsb3dUcmFpbGVyKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0JyZWFrOjpzdGFydE5ldyhDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQnJlYWs6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9CcmVhazo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfYnJlYWsuaCBiL2Z4anMveGZhL2NqeF9icmVhay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2Y2IyNDkKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfYnJlYWsuaApAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0JSRUFLX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9CUkVBS19IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9CcmVhazsKKworY2xhc3MgQ0pYX0JyZWFrIDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9CcmVhayhDWEZBX0JyZWFrKiBub2RlKTsKKyAgfkNKWF9CcmVhaygpIG92ZXJyaWRlOworCisgIEpTX1BST1AoYWZ0ZXIpOworICBKU19QUk9QKGFmdGVyVGFyZ2V0KTsKKyAgSlNfUFJPUChiZWZvcmUpOworICBKU19QUk9QKGJlZm9yZVRhcmdldCk7CisgIEpTX1BST1AoYm9va2VuZExlYWRlcik7CisgIEpTX1BST1AoYm9va2VuZFRyYWlsZXIpOworICBKU19QUk9QKG92ZXJmbG93TGVhZGVyKTsKKyAgSlNfUFJPUChvdmVyZmxvd1RhcmdldCk7CisgIEpTX1BST1Aob3ZlcmZsb3dUcmFpbGVyKTsKKyAgSlNfUFJPUChzdGFydE5ldyk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0JSRUFLX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfYnJlYWthZnRlci5jcHAgYi9meGpzL3hmYS9janhfYnJlYWthZnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZhNWEzYgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9icmVha2FmdGVyLmNwcApAQCAtMCwwICsxLDU1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfYnJlYWthZnRlci5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYnJlYWthZnRlci5oIgorCitDSlhfQnJlYWtBZnRlcjo6Q0pYX0JyZWFrQWZ0ZXIoQ1hGQV9CcmVha0FmdGVyKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9CcmVha0FmdGVyOjp+Q0pYX0JyZWFrQWZ0ZXIoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0JyZWFrQWZ0ZXI6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQnJlYWtBZnRlcjo6c3RhcnROZXcoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9CcmVha0FmdGVyOjp0cmFpbGVyKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0JyZWFrQWZ0ZXI6OnRhcmdldFR5cGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQnJlYWtBZnRlcjo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9CcmVha0FmdGVyOjp0YXJnZXQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0JyZWFrQWZ0ZXI6OmxlYWRlcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9icmVha2FmdGVyLmggYi9meGpzL3hmYS9janhfYnJlYWthZnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMWVjY2MKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfYnJlYWthZnRlci5oCkBAIC0wLDAgKzEsMjggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfQlJFQUtBRlRFUl9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfQlJFQUtBRlRFUl9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9CcmVha0FmdGVyOworCitjbGFzcyBDSlhfQnJlYWtBZnRlciA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfQnJlYWtBZnRlcihDWEZBX0JyZWFrQWZ0ZXIqIG5vZGUpOworICB+Q0pYX0JyZWFrQWZ0ZXIoKSBvdmVycmlkZTsKKworICBKU19QUk9QKGxlYWRlcik7CisgIEpTX1BST1Aoc3RhcnROZXcpOworICBKU19QUk9QKHRhcmdldCk7CisgIEpTX1BST1AodGFyZ2V0VHlwZSk7CisgIEpTX1BST1AodHJhaWxlcik7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0JSRUFLQUZURVJfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9icmVha2JlZm9yZS5jcHAgYi9meGpzL3hmYS9janhfYnJlYWtiZWZvcmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZmEwMWUKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfYnJlYWtiZWZvcmUuY3BwCkBAIC0wLDAgKzEsNTUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9icmVha2JlZm9yZS5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYnJlYWtiZWZvcmUuaCIKKworQ0pYX0JyZWFrQmVmb3JlOjpDSlhfQnJlYWtCZWZvcmUoQ1hGQV9CcmVha0JlZm9yZSogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfQnJlYWtCZWZvcmU6On5DSlhfQnJlYWtCZWZvcmUoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0JyZWFrQmVmb3JlOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQnJlYWtCZWZvcmU6OnN0YXJ0TmV3KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9CcmVha0JlZm9yZTo6dHJhaWxlcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0JyZWFrQmVmb3JlOjp0YXJnZXRUeXBlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQnJlYWtCZWZvcmU6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9CcmVha0JlZm9yZTo6dGFyZ2V0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0JyZWFrQmVmb3JlOjpsZWFkZXIoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9icmVha2JlZm9yZS5oIGIvZnhqcy94ZmEvY2p4X2JyZWFrYmVmb3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4ZGJiYgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9icmVha2JlZm9yZS5oCkBAIC0wLDAgKzEsMjggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfQlJFQUtCRUZPUkVfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0JSRUFLQkVGT1JFX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX0JyZWFrQmVmb3JlOworCitjbGFzcyBDSlhfQnJlYWtCZWZvcmUgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0JyZWFrQmVmb3JlKENYRkFfQnJlYWtCZWZvcmUqIG5vZGUpOworICB+Q0pYX0JyZWFrQmVmb3JlKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChsZWFkZXIpOworICBKU19QUk9QKHN0YXJ0TmV3KTsKKyAgSlNfUFJPUCh0YXJnZXQpOworICBKU19QUk9QKHRhcmdldFR5cGUpOworICBKU19QUk9QKHRyYWlsZXIpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9CUkVBS0JFRk9SRV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2J1dHRvbi5jcHAgYi9meGpzL3hmYS9janhfYnV0dG9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWJkNmViCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2J1dHRvbi5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2J1dHRvbi5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYnV0dG9uLmgiCisKK0NKWF9CdXR0b246OkNKWF9CdXR0b24oQ1hGQV9CdXR0b24qIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX0J1dHRvbjo6fkNKWF9CdXR0b24oKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0J1dHRvbjo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQnV0dG9uOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9CdXR0b246OmhpZ2hsaWdodChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfYnV0dG9uLmggYi9meGpzL3hmYS9janhfYnV0dG9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczMmFhZQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9idXR0b24uaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0JVVFRPTl9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfQlVUVE9OX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX0J1dHRvbjsKKworY2xhc3MgQ0pYX0J1dHRvbiA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfQnV0dG9uKENYRkFfQnV0dG9uKiBub2RlKTsKKyAgfkNKWF9CdXR0b24oKSBvdmVycmlkZTsKKworICBKU19QUk9QKGhpZ2hsaWdodCk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0JVVFRPTl9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2NhbGN1bGF0ZS5jcHAgYi9meGpzL3hmYS9janhfY2FsY3VsYXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWRiNGRmCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2NhbGN1bGF0ZS5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2NhbGN1bGF0ZS5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2FsY3VsYXRlLmgiCisKK0NKWF9DYWxjdWxhdGU6OkNKWF9DYWxjdWxhdGUoQ1hGQV9DYWxjdWxhdGUqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX0NhbGN1bGF0ZTo6fkNKWF9DYWxjdWxhdGUoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0NhbGN1bGF0ZTo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQ2FsY3VsYXRlOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9DYWxjdWxhdGU6Om92ZXJyaWRlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfY2FsY3VsYXRlLmggYi9meGpzL3hmYS9janhfY2FsY3VsYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxMGYxYgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9jYWxjdWxhdGUuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0NBTENVTEFURV9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfQ0FMQ1VMQVRFX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX0NhbGN1bGF0ZTsKKworY2xhc3MgQ0pYX0NhbGN1bGF0ZSA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfQ2FsY3VsYXRlKENYRkFfQ2FsY3VsYXRlKiBub2RlKTsKKyAgfkNKWF9DYWxjdWxhdGUoKSBvdmVycmlkZTsKKworICBKU19QUk9QKG92ZXJyaWRlKTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfQ0FMQ1VMQVRFX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfY2FwdGlvbi5jcHAgYi9meGpzL3hmYS9janhfY2FwdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM3ZjZhOAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9jYXB0aW9uLmNwcApAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfY2FwdGlvbi5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2FwdGlvbi5oIgorCitDSlhfQ2FwdGlvbjo6Q0pYX0NhcHRpb24oQ1hGQV9DYXB0aW9uKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9DYXB0aW9uOjp+Q0pYX0NhcHRpb24oKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0NhcHRpb246OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQ2FwdGlvbjo6cmVzZXJ2ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9DYXB0aW9uOjpwcmVzZW5jZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0NhcHRpb246OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQ2FwdGlvbjo6cGxhY2VtZW50KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2NhcHRpb24uaCBiL2Z4anMveGZhL2NqeF9jYXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmNjkxNQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9jYXB0aW9uLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9DQVBUSU9OX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9DQVBUSU9OX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX0NhcHRpb247CisKK2NsYXNzIENKWF9DYXB0aW9uIDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9DYXB0aW9uKENYRkFfQ2FwdGlvbiogbm9kZSk7CisgIH5DSlhfQ2FwdGlvbigpIG92ZXJyaWRlOworCisgIEpTX1BST1AocGxhY2VtZW50KTsKKyAgSlNfUFJPUChwcmVzZW5jZSk7CisgIEpTX1BST1AocmVzZXJ2ZSk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0NBUFRJT05fSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9jZXJ0aWZpY2F0ZS5jcHAgYi9meGpzL3hmYS9janhfY2VydGlmaWNhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMTA1NjUKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfY2VydGlmaWNhdGUuY3BwCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9jZXJ0aWZpY2F0ZS5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2VydGlmaWNhdGUuaCIKKworQ0pYX0NlcnRpZmljYXRlOjpDSlhfQ2VydGlmaWNhdGUoQ1hGQV9DZXJ0aWZpY2F0ZSogbm9kZSkgOiBDSlhfVGV4dE5vZGUobm9kZSkge30KKworQ0pYX0NlcnRpZmljYXRlOjp+Q0pYX0NlcnRpZmljYXRlKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9DZXJ0aWZpY2F0ZTo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0NlcnRpZmljYXRlOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9jZXJ0aWZpY2F0ZS5oIGIvZnhqcy94ZmEvY2p4X2NlcnRpZmljYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY2MmI5MQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9jZXJ0aWZpY2F0ZS5oCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfQ0VSVElGSUNBVEVfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0NFUlRJRklDQVRFX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdGV4dG5vZGUuaCIKKworY2xhc3MgQ1hGQV9DZXJ0aWZpY2F0ZTsKKworY2xhc3MgQ0pYX0NlcnRpZmljYXRlIDogcHVibGljIENKWF9UZXh0Tm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfQ2VydGlmaWNhdGUoQ1hGQV9DZXJ0aWZpY2F0ZSogbm9kZSk7CisgIH5DSlhfQ2VydGlmaWNhdGUoKSBvdmVycmlkZTsKKworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9DRVJUSUZJQ0FURV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2NlcnRpZmljYXRlcy5jcHAgYi9meGpzL3hmYS9janhfY2VydGlmaWNhdGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODI4NjMwCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2NlcnRpZmljYXRlcy5jcHAKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2NlcnRpZmljYXRlcy5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2VydGlmaWNhdGVzLmgiCisKK0NKWF9DZXJ0aWZpY2F0ZXM6OkNKWF9DZXJ0aWZpY2F0ZXMoQ1hGQV9DZXJ0aWZpY2F0ZXMqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX0NlcnRpZmljYXRlczo6fkNKWF9DZXJ0aWZpY2F0ZXMoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0NlcnRpZmljYXRlczo6dXJsKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQ2VydGlmaWNhdGVzOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9DZXJ0aWZpY2F0ZXM6OmNyZWRlbnRpYWxTZXJ2ZXJQb2xpY3koQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0NlcnRpZmljYXRlczo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQ2VydGlmaWNhdGVzOjp1cmxQb2xpY3koQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2NlcnRpZmljYXRlcy5oIGIvZnhqcy94ZmEvY2p4X2NlcnRpZmljYXRlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MGQ4OGQKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfY2VydGlmaWNhdGVzLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9DRVJUSUZJQ0FURVNfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0NFUlRJRklDQVRFU19IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9DZXJ0aWZpY2F0ZXM7CisKK2NsYXNzIENKWF9DZXJ0aWZpY2F0ZXMgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0NlcnRpZmljYXRlcyhDWEZBX0NlcnRpZmljYXRlcyogbm9kZSk7CisgIH5DSlhfQ2VydGlmaWNhdGVzKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChjcmVkZW50aWFsU2VydmVyUG9saWN5KTsKKyAgSlNfUFJPUCh1cmwpOworICBKU19QUk9QKHVybFBvbGljeSk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0NFUlRJRklDQVRFU19IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2NoZWNrYnV0dG9uLmNwcCBiL2Z4anMveGZhL2NqeF9jaGVja2J1dHRvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM1YjFlNgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9jaGVja2J1dHRvbi5jcHAKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2NoZWNrYnV0dG9uLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jaGVja2J1dHRvbi5oIgorCitDSlhfQ2hlY2tCdXR0b246OkNKWF9DaGVja0J1dHRvbihDWEZBX0NoZWNrQnV0dG9uKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9DaGVja0J1dHRvbjo6fkNKWF9DaGVja0J1dHRvbigpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfQ2hlY2tCdXR0b246OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9DaGVja0J1dHRvbjo6YWxsb3dOZXV0cmFsKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0NoZWNrQnV0dG9uOjptYXJrKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQ2hlY2tCdXR0b246OnNoYXBlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9DaGVja0J1dHRvbjo6c2l6ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0NoZWNrQnV0dG9uOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9jaGVja2J1dHRvbi5oIGIvZnhqcy94ZmEvY2p4X2NoZWNrYnV0dG9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjY2E2OAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9jaGVja2J1dHRvbi5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfQ0hFQ0tCVVRUT05fSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0NIRUNLQlVUVE9OX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX0NoZWNrQnV0dG9uOworCitjbGFzcyBDSlhfQ2hlY2tCdXR0b24gOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0NoZWNrQnV0dG9uKENYRkFfQ2hlY2tCdXR0b24qIG5vZGUpOworICB+Q0pYX0NoZWNrQnV0dG9uKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChhbGxvd05ldXRyYWwpOworICBKU19QUk9QKG1hcmspOworICBKU19QUk9QKHNoYXBlKTsKKyAgSlNfUFJPUChzaXplKTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfQ0hFQ0tCVVRUT05fSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9jaG9pY2VsaXN0LmNwcCBiL2Z4anMveGZhL2NqeF9jaG9pY2VsaXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzg1YTAzCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2Nob2ljZWxpc3QuY3BwCkBAIC0wLDAgKzEsNDMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9jaG9pY2VsaXN0LmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jaG9pY2VsaXN0LmgiCisKK0NKWF9DaG9pY2VMaXN0OjpDSlhfQ2hvaWNlTGlzdChDWEZBX0Nob2ljZUxpc3QqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX0Nob2ljZUxpc3Q6On5DSlhfQ2hvaWNlTGlzdCgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfQ2hvaWNlTGlzdDo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9DaG9pY2VMaXN0OjpvcGVuKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0Nob2ljZUxpc3Q6OmNvbW1pdE9uKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQ2hvaWNlTGlzdDo6dGV4dEVudHJ5KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9DaG9pY2VMaXN0Ojp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfY2hvaWNlbGlzdC5oIGIvZnhqcy94ZmEvY2p4X2Nob2ljZWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDMzNmYyCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2Nob2ljZWxpc3QuaApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0NIT0lDRUxJU1RfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0NIT0lDRUxJU1RfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfQ2hvaWNlTGlzdDsKKworY2xhc3MgQ0pYX0Nob2ljZUxpc3QgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0Nob2ljZUxpc3QoQ1hGQV9DaG9pY2VMaXN0KiBub2RlKTsKKyAgfkNKWF9DaG9pY2VMaXN0KCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChjb21taXRPbik7CisgIEpTX1BST1Aob3Blbik7CisgIEpTX1BST1AodGV4dEVudHJ5KTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfQ0hPSUNFTElTVF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2NvbG9yLmNwcCBiL2Z4anMveGZhL2NqeF9jb2xvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU3ZGEwNQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9jb2xvci5jcHAKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2NvbG9yLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb2xvci5oIgorCitDSlhfQ29sb3I6OkNKWF9Db2xvcihDWEZBX0NvbG9yKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9Db2xvcjo6fkNKWF9Db2xvcigpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfQ29sb3I6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Db2xvcjo6Y1NwYWNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0NvbG9yOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQ29sb3I6OnZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2NvbG9yLmggYi9meGpzL3hmYS9janhfY29sb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjI1NzUzCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2NvbG9yLmgKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9DT0xPUl9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfQ09MT1JfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfQ29sb3I7CisKK2NsYXNzIENKWF9Db2xvciA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfQ29sb3IoQ1hGQV9Db2xvciogbm9kZSk7CisgIH5DSlhfQ29sb3IoKSBvdmVycmlkZTsKKworICBKU19QUk9QKGNTcGFjZSk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKKyAgSlNfUFJPUCh2YWx1ZSk7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9DT0xPUl9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2NvbWIuY3BwIGIvZnhqcy94ZmEvY2p4X2NvbWIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MTQ0YWYKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfY29tYi5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2NvbWIuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbWIuaCIKKworQ0pYX0NvbWI6OkNKWF9Db21iKENYRkFfQ29tYiogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfQ29tYjo6fkNKWF9Db21iKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9Db21iOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0NvbWI6Om51bWJlck9mQ2VsbHMoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX0ludGVnZXIocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0NvbWI6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9jb21iLmggYi9meGpzL3hmYS9janhfY29tYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOGQ2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfY29tYi5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfQ09NQl9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfQ09NQl9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9Db21iOworCitjbGFzcyBDSlhfQ29tYiA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfQ29tYihDWEZBX0NvbWIqIG5vZGUpOworICB+Q0pYX0NvbWIoKSBvdmVycmlkZTsKKworICBKU19QUk9QKG51bWJlck9mQ2VsbHMpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9DT01CX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfY29tbWFuZC5jcHAgYi9meGpzL3hmYS9janhfY29tbWFuZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBlNjU0YgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9jb21tYW5kLmNwcApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfY29tbWFuZC5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tbWFuZC5oIgorCitDSlhfQ29tbWFuZDo6Q0pYX0NvbW1hbmQoQ1hGQV9Db21tYW5kKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9Db21tYW5kOjp+Q0pYX0NvbW1hbmQoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0NvbW1hbmQ6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQ29tbWFuZDo6dGltZW91dChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Db21tYW5kOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfY29tbWFuZC5oIGIvZnhqcy94ZmEvY2p4X2NvbW1hbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDYwNWEzCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2NvbW1hbmQuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0NPTU1BTkRfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0NPTU1BTkRfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfQ29tbWFuZDsKKworY2xhc3MgQ0pYX0NvbW1hbmQgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0NvbW1hbmQoQ1hGQV9Db21tYW5kKiBub2RlKTsKKyAgfkNKWF9Db21tYW5kKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUCh0aW1lb3V0KTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfQ09NTUFORF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2Nvbm5lY3QuY3BwIGIvZnhqcy94ZmEvY2p4X2Nvbm5lY3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ODQyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfY29ubmVjdC5jcHAKQEAgLTAsMCArMSw1NSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2Nvbm5lY3QuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2Nvbm5lY3QuaCIKKworQ0pYX0Nvbm5lY3Q6OkNKWF9Db25uZWN0KENYRkFfQ29ubmVjdCogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfQ29ubmVjdDo6fkNKWF9Db25uZWN0KCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9Db25uZWN0Ojp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0Nvbm5lY3Q6OnRpbWVvdXQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQ29ubmVjdDo6Y29ubmVjdGlvbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Db25uZWN0Ojp1c2FnZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0Nvbm5lY3Q6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQ29ubmVjdDo6ZGVsYXllZE9wZW4oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Db25uZWN0OjpyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfY29ubmVjdC5oIGIvZnhqcy94ZmEvY2p4X2Nvbm5lY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzI3OTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2Nvbm5lY3QuaApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0NPTk5FQ1RfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0NPTk5FQ1RfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfQ29ubmVjdDsKKworY2xhc3MgQ0pYX0Nvbm5lY3QgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0Nvbm5lY3QoQ1hGQV9Db25uZWN0KiBub2RlKTsKKyAgfkNKWF9Db25uZWN0KCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChjb25uZWN0aW9uKTsKKyAgSlNfUFJPUChkZWxheWVkT3Blbik7CisgIEpTX1BST1AocmVmKTsKKyAgSlNfUFJPUCh0aW1lb3V0KTsKKyAgSlNfUFJPUCh1c2FnZSk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0NPTk5FQ1RfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9jb25uZWN0c3RyaW5nLmNwcCBiL2Z4anMveGZhL2NqeF9jb25uZWN0c3RyaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWM2MzU5Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2Nvbm5lY3RzdHJpbmcuY3BwCkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9jb25uZWN0c3RyaW5nLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25uZWN0c3RyaW5nLmgiCisKK0NKWF9Db25uZWN0U3RyaW5nOjpDSlhfQ29ubmVjdFN0cmluZyhDWEZBX0Nvbm5lY3RTdHJpbmcqIG5vZGUpCisgICAgOiBDSlhfVGV4dE5vZGUobm9kZSkge30KKworQ0pYX0Nvbm5lY3RTdHJpbmc6On5DSlhfQ29ubmVjdFN0cmluZygpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfQ29ubmVjdFN0cmluZzo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Db25uZWN0U3RyaW5nOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfY29ubmVjdHN0cmluZy5oIGIvZnhqcy94ZmEvY2p4X2Nvbm5lY3RzdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjljOTJiCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2Nvbm5lY3RzdHJpbmcuaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0NPTk5FQ1RTVFJJTkdfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0NPTk5FQ1RTVFJJTkdfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF90ZXh0bm9kZS5oIgorCitjbGFzcyBDWEZBX0Nvbm5lY3RTdHJpbmc7CisKK2NsYXNzIENKWF9Db25uZWN0U3RyaW5nIDogcHVibGljIENKWF9UZXh0Tm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfQ29ubmVjdFN0cmluZyhDWEZBX0Nvbm5lY3RTdHJpbmcqIG5vZGUpOworICB+Q0pYX0Nvbm5lY3RTdHJpbmcoKSBvdmVycmlkZTsKKworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9DT05ORUNUU1RSSU5HX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfY29udGFpbmVyLmNwcCBiL2Z4anMveGZhL2NqeF9jb250YWluZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMGFjYTAKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfY29udGFpbmVyLmNwcApAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfY29udGFpbmVyLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV9lbmdpbmUuaCIKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV92YWx1ZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2FycmF5bm9kZWxpc3QuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2ZpZWxkLmgiCisKK2NvbnN0IENKWF9NZXRob2RTcGVjIENKWF9Db250YWluZXI6Ok1ldGhvZFNwZWNzW10gPSB7CisgICAgeyJnZXREZWx0YSIsIGdldERlbHRhX3N0YXRpY30sCisgICAgeyJnZXREZWx0YXMiLCBnZXREZWx0YXNfc3RhdGljfX07CisKK0NKWF9Db250YWluZXI6OkNKWF9Db250YWluZXIoQ1hGQV9Ob2RlKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHsKKyAgRGVmaW5lTWV0aG9kcyhNZXRob2RTcGVjcywgRlhfQXJyYXlTaXplKE1ldGhvZFNwZWNzKSk7Cit9CisKK0NKWF9Db250YWluZXI6On5DSlhfQ29udGFpbmVyKCkge30KKworQ0pTX1JldHVybiBDSlhfQ29udGFpbmVyOjpnZXREZWx0YSgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0NvbnRhaW5lcjo6Z2V0RGVsdGFzKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBDWEZBX0FycmF5Tm9kZUxpc3QqIHBGb3JtTm9kZXMgPSBuZXcgQ1hGQV9BcnJheU5vZGVMaXN0KEdldERvY3VtZW50KCkpOworICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdYRkFPYmplY3QoCisgICAgICBwRm9ybU5vZGVzLAorICAgICAgR2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKc2VOb3JtYWxDbGFzcygpLT5HZXRUZW1wbGF0ZSgpKSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfY29udGFpbmVyLmggYi9meGpzL3hmYS9janhfY29udGFpbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUyMTcwZgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9jb250YWluZXIuaApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0NPTlRBSU5FUl9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfQ09OVEFJTkVSX0hfCisKKyNpbmNsdWRlICJmeGpzL0NKWF9EZWZpbmUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX05vZGU7CisKK2NsYXNzIENKWF9Db250YWluZXIgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0NvbnRhaW5lcihDWEZBX05vZGUqIG5vZGUpOworICB+Q0pYX0NvbnRhaW5lcigpIG92ZXJyaWRlOworCisgIEpTX01FVEhPRChnZXREZWx0YSwgQ0pYX0NvbnRhaW5lcik7CisgIEpTX01FVEhPRChnZXREZWx0YXMsIENKWF9Db250YWluZXIpOworCisgcHJpdmF0ZToKKyAgc3RhdGljIGNvbnN0IENKWF9NZXRob2RTcGVjIE1ldGhvZFNwZWNzW107Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9DT05UQUlORVJfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9jb250ZW50LmNwcCBiL2Z4anMveGZhL2NqeF9jb250ZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDI1ODI5Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2NvbnRlbnQuY3BwCkBAIC0wLDAgKzEsMTQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9jb250ZW50LmgiCisKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV92YWx1ZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX29iamVjdC5oIgorCitDSlhfQ29udGVudDo6Q0pYX0NvbnRlbnQoQ1hGQV9PYmplY3QqIG9iaikgOiBDSlhfT2JqZWN0KG9iaikge30KKworQ0pYX0NvbnRlbnQ6On5DSlhfQ29udGVudCgpIHt9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfY29udGVudC5oIGIvZnhqcy94ZmEvY2p4X2NvbnRlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODNhNzUwCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2NvbnRlbnQuaApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0NPTlRFTlRfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0NPTlRFTlRfSF8KKworI2luY2x1ZGUgImZ4anMvQ0pYX0RlZmluZS5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9vYmplY3QuaCIKKworY2xhc3MgQ1hGQV9Db250ZW50OworCitjbGFzcyBDSlhfQ29udGVudCA6IHB1YmxpYyBDSlhfT2JqZWN0IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9Db250ZW50KENYRkFfT2JqZWN0KiBvYmopOworICB+Q0pYX0NvbnRlbnQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0NPTlRFTlRfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9jb250ZW50YXJlYS5jcHAgYi9meGpzL3hmYS9janhfY29udGVudGFyZWEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZTc0ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfY29udGVudGFyZWEuY3BwCkBAIC0wLDAgKzEsNDQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9jb250ZW50YXJlYS5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29udGVudGFyZWEuaCIKKworQ0pYX0NvbnRlbnRBcmVhOjpDSlhfQ29udGVudEFyZWEoQ1hGQV9Db250ZW50QXJlYSogbm9kZSkKKyAgICA6IENKWF9Db250YWluZXIobm9kZSkge30KKworQ0pYX0NvbnRlbnRBcmVhOjp+Q0pYX0NvbnRlbnRBcmVhKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9Db250ZW50QXJlYTo6eChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0NvbnRlbnRBcmVhOjp5KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQ29udGVudEFyZWE6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Db250ZW50QXJlYTo6cmVsZXZhbnQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0NvbnRlbnRBcmVhOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9jb250ZW50YXJlYS5oIGIvZnhqcy94ZmEvY2p4X2NvbnRlbnRhcmVhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3ZTEwOAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9jb250ZW50YXJlYS5oCkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfQ09OVEVOVEFSRUFfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0NPTlRFTlRBUkVBX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfY29udGFpbmVyLmgiCisKK2NsYXNzIENYRkFfQ29udGVudEFyZWE7CisKK2NsYXNzIENKWF9Db250ZW50QXJlYSA6IHB1YmxpYyBDSlhfQ29udGFpbmVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9Db250ZW50QXJlYShDWEZBX0NvbnRlbnRBcmVhKiBub2RlKTsKKyAgfkNKWF9Db250ZW50QXJlYSgpIG92ZXJyaWRlOworCisgIEpTX1BST1AocmVsZXZhbnQpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7CisgIEpTX1BST1AoeCk7CisgIEpTX1BST1AoeSk7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9DT05URU5UQVJFQV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2Nvcm5lci5jcHAgYi9meGpzL3hmYS9janhfY29ybmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWQxOTIyCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2Nvcm5lci5jcHAKQEAgLTAsMCArMSw2MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2Nvcm5lci5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29ybmVyLmgiCisKK0NKWF9Db3JuZXI6OkNKWF9Db3JuZXIoQ1hGQV9Db3JuZXIqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX0Nvcm5lcjo6fkNKWF9Db3JuZXIoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0Nvcm5lcjo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQ29ybmVyOjpzdHJva2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Db3JuZXI6OnByZXNlbmNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0Nvcm5lcjo6aW52ZXJ0ZWQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQ29ybmVyOjp0aGlja25lc3MoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Db3JuZXI6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0Nvcm5lcjo6am9pbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfQ29ybmVyOjpyYWRpdXMoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2Nvcm5lci5oIGIvZnhqcy94ZmEvY2p4X2Nvcm5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMjUxYTUKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfY29ybmVyLmgKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9DT1JORVJfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0NPUk5FUl9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9Db3JuZXI7CisKK2NsYXNzIENKWF9Db3JuZXIgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0Nvcm5lcihDWEZBX0Nvcm5lciogbm9kZSk7CisgIH5DSlhfQ29ybmVyKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChpbnZlcnRlZCk7CisgIEpTX1BST1Aoam9pbik7CisgIEpTX1BST1AocHJlc2VuY2UpOworICBKU19QUk9QKHJhZGl1cyk7CisgIEpTX1BST1Aoc3Ryb2tlKTsKKyAgSlNfUFJPUCh0aGlja25lc3MpOworICBKU19QUk9QKHVzZWhyZWYpOworICBKU19QUk9QKHVzZSk7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9DT1JORVJfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9kYXRhdmFsdWUuY3BwIGIvZnhqcy94ZmEvY2p4X2RhdGF2YWx1ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkwZWQ0NQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9kYXRhdmFsdWUuY3BwCkBAIC0wLDAgKzEsNDMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9kYXRhdmFsdWUuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGF2YWx1ZS5oIgorCitDSlhfRGF0YVZhbHVlOjpDSlhfRGF0YVZhbHVlKENYRkFfRGF0YVZhbHVlKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9EYXRhVmFsdWU6On5DSlhfRGF0YVZhbHVlKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9EYXRhVmFsdWU6OmNvbnRlbnRUeXBlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0RhdGFWYWx1ZTo6Y29udGFpbnMoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRGF0YVZhbHVlOjpkZWZhdWx0VmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9EYXRhVmFsdWU6OnZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgZGVmYXVsdFZhbHVlKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9EYXRhVmFsdWU6OmlzTnVsbChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9CT09MKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2RhdGF2YWx1ZS5oIGIvZnhqcy94ZmEvY2p4X2RhdGF2YWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZThlZDQKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZGF0YXZhbHVlLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9EQVRBVkFMVUVfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0RBVEFWQUxVRV9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9EYXRhVmFsdWU7CisKK2NsYXNzIENKWF9EYXRhVmFsdWUgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0RhdGFWYWx1ZShDWEZBX0RhdGFWYWx1ZSogbm9kZSk7CisgIH5DSlhfRGF0YVZhbHVlKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChkZWZhdWx0VmFsdWUpOyAvKiB7ZGVmYXVsdH0gKi8KKyAgSlNfUFJPUChjb250YWlucyk7CisgIEpTX1BST1AoY29udGVudFR5cGUpOworICBKU19QUk9QKGlzTnVsbCk7CisgIEpTX1BST1AodmFsdWUpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfREFUQVZBTFVFX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZGF0YXdpbmRvdy5jcHAgYi9meGpzL3hmYS9janhfZGF0YXdpbmRvdy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwOWNiNAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9kYXRhd2luZG93LmNwcApAQCAtMCwwICsxLDY1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZGF0YXdpbmRvdy5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnhqcy9jZnhqc2VfdmFsdWUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9kYXRhd2luZG93LmgiCisKK2NvbnN0IENKWF9NZXRob2RTcGVjIENKWF9EYXRhV2luZG93OjpNZXRob2RTcGVjc1tdID0geworICAgIHsiZ290b1JlY29yZCIsIGdvdG9SZWNvcmRfc3RhdGljfSwKKyAgICB7ImlzUmVjb3JkR3JvdXAiLCBpc1JlY29yZEdyb3VwX3N0YXRpY30sCisgICAgeyJtb3ZlQ3VycmVudFJlY29yZCIsIG1vdmVDdXJyZW50UmVjb3JkX3N0YXRpY30sCisgICAgeyJyZWNvcmQiLCByZWNvcmRfc3RhdGljfX07CisKK0NKWF9EYXRhV2luZG93OjpDSlhfRGF0YVdpbmRvdyhDU2NyaXB0X0RhdGFXaW5kb3cqIHdpbmRvdykKKyAgICA6IENKWF9PYmplY3Qod2luZG93KSB7CisgIERlZmluZU1ldGhvZHMoTWV0aG9kU3BlY3MsIEZYX0FycmF5U2l6ZShNZXRob2RTcGVjcykpOworfQorCitDSlhfRGF0YVdpbmRvdzo6fkNKWF9EYXRhV2luZG93KCkge30KKworQ0pTX1JldHVybiBDSlhfRGF0YVdpbmRvdzo6bW92ZUN1cnJlbnRSZWNvcmQoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIENKWF9EYXRhV2luZG93OjpyZWNvcmQoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIENKWF9EYXRhV2luZG93Ojpnb3RvUmVjb3JkKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfRGF0YVdpbmRvdzo6aXNSZWNvcmRHcm91cCgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK3ZvaWQgQ0pYX0RhdGFXaW5kb3c6OnJlY29yZHNCZWZvcmUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkge30KKwordm9pZCBDSlhfRGF0YVdpbmRvdzo6Y3VycmVudFJlY29yZE51bWJlcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7fQorCit2b2lkIENKWF9EYXRhV2luZG93OjpyZWNvcmRzQWZ0ZXIoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHt9CisKK3ZvaWQgQ0pYX0RhdGFXaW5kb3c6OmlzRGVmaW5lZChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkge30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9kYXRhd2luZG93LmggYi9meGpzL3hmYS9janhfZGF0YXdpbmRvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYWE2YTQKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZGF0YXdpbmRvdy5oCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfREFUQVdJTkRPV19IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfREFUQVdJTkRPV19IXworCisjaW5jbHVkZSAiZnhqcy9DSlhfRGVmaW5lLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X29iamVjdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmFfYmFzaWMuaCIKKworY2xhc3MgQ0ZYSlNFX1ZhbHVlOworY2xhc3MgQ1NjcmlwdF9EYXRhV2luZG93OworCitjbGFzcyBDSlhfRGF0YVdpbmRvdyA6IHB1YmxpYyBDSlhfT2JqZWN0IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9EYXRhV2luZG93KENTY3JpcHRfRGF0YVdpbmRvdyogd2luZG93KTsKKyAgfkNKWF9EYXRhV2luZG93KCkgb3ZlcnJpZGU7CisKKyAgSlNfTUVUSE9EKGdvdG9SZWNvcmQsIENKWF9EYXRhV2luZG93KTsKKyAgSlNfTUVUSE9EKGlzUmVjb3JkR3JvdXAsIENKWF9EYXRhV2luZG93KTsKKyAgSlNfTUVUSE9EKG1vdmVDdXJyZW50UmVjb3JkLCBDSlhfRGF0YVdpbmRvdyk7CisgIEpTX01FVEhPRChyZWNvcmQsIENKWF9EYXRhV2luZG93KTsKKworICBKU19QUk9QKGN1cnJlbnRSZWNvcmROdW1iZXIpOworICBKU19QUk9QKGlzRGVmaW5lZCk7CisgIEpTX1BST1AocmVjb3Jkc0FmdGVyKTsKKyAgSlNfUFJPUChyZWNvcmRzQmVmb3JlKTsKKworIHByaXZhdGU6CisgIHN0YXRpYyBjb25zdCBDSlhfTWV0aG9kU3BlYyBNZXRob2RTcGVjc1tdOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfREFUQVdJTkRPV19IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2RhdGUuY3BwIGIvZnhqcy94ZmEvY2p4X2RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZTk1YTkKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZGF0ZS5jcHAKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2RhdGUuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGUuaCIKKworQ0pYX0RhdGU6OkNKWF9EYXRlKENYRkFfRGF0ZSogbm9kZSkgOiBDSlhfQ29udGVudChub2RlKSB7fQorCitDSlhfRGF0ZTo6fkNKWF9EYXRlKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9EYXRlOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0RhdGU6OmRlZmF1bHRWYWx1ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZShwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRGF0ZTo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9EYXRlOjp2YWx1ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgZGVmYXVsdFZhbHVlKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2RhdGUuaCBiL2Z4anMveGZhL2NqeF9kYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZkZmQwZQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9kYXRlLmgKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9EQVRFX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9EQVRFX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfY29udGVudC5oIgorCitjbGFzcyBDWEZBX0RhdGU7CisKK2NsYXNzIENKWF9EYXRlIDogcHVibGljIENKWF9Db250ZW50IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9EYXRlKENYRkFfRGF0ZSogbm9kZSk7CisgIH5DSlhfRGF0ZSgpIG92ZXJyaWRlOworCisgIEpTX1BST1AoZGVmYXVsdFZhbHVlKTsgLyoge2RlZmF1bHR9ICovCisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKKyAgSlNfUFJPUCh2YWx1ZSk7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9EQVRFX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZGF0ZXRpbWUuY3BwIGIvZnhqcy94ZmEvY2p4X2RhdGV0aW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWZmZDA1Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2RhdGV0aW1lLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZGF0ZXRpbWUuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGV0aW1lLmgiCisKK0NKWF9EYXRlVGltZTo6Q0pYX0RhdGVUaW1lKENYRkFfRGF0ZVRpbWUqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX0RhdGVUaW1lOjp+Q0pYX0RhdGVUaW1lKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9EYXRlVGltZTo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0RhdGVUaW1lOjpkZWZhdWx0VmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZShwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRGF0ZVRpbWU6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9EYXRlVGltZTo6dmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZGF0ZXRpbWUuaCBiL2Z4anMveGZhL2NqeF9kYXRldGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZjdkMmYKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZGF0ZXRpbWUuaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0RBVEVUSU1FX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9EQVRFVElNRV9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9EYXRlVGltZTsKKworY2xhc3MgQ0pYX0RhdGVUaW1lIDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9EYXRlVGltZShDWEZBX0RhdGVUaW1lKiBub2RlKTsKKyAgfkNKWF9EYXRlVGltZSgpIG92ZXJyaWRlOworCisgIEpTX1BST1AoZGVmYXVsdFZhbHVlKTsgLyoge2RlZmF1bHR9ICovCisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKKyAgSlNfUFJPUCh2YWx1ZSk7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9EQVRFVElNRV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2RhdGV0aW1lZWRpdC5jcHAgYi9meGpzL3hmYS9janhfZGF0ZXRpbWVlZGl0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODRkYmYwCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2RhdGV0aW1lZWRpdC5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2RhdGV0aW1lZWRpdC5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZXRpbWVlZGl0LmgiCisKK0NKWF9EYXRlVGltZUVkaXQ6OkNKWF9EYXRlVGltZUVkaXQoQ1hGQV9EYXRlVGltZUVkaXQqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX0RhdGVUaW1lRWRpdDo6fkNKWF9EYXRlVGltZUVkaXQoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0RhdGVUaW1lRWRpdDo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRGF0ZVRpbWVFZGl0Ojp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9EYXRlVGltZUVkaXQ6OmhTY3JvbGxQb2xpY3koQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZGF0ZXRpbWVlZGl0LmggYi9meGpzL3hmYS9janhfZGF0ZXRpbWVlZGl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3YzZiYgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9kYXRldGltZWVkaXQuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0RBVEVUSU1FRURJVF9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfREFURVRJTUVFRElUX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX0RhdGVUaW1lRWRpdDsKKworY2xhc3MgQ0pYX0RhdGVUaW1lRWRpdCA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfRGF0ZVRpbWVFZGl0KENYRkFfRGF0ZVRpbWVFZGl0KiBub2RlKTsKKyAgfkNKWF9EYXRlVGltZUVkaXQoKSBvdmVycmlkZTsKKworICBKU19QUk9QKGhTY3JvbGxQb2xpY3kpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9EQVRFVElNRUVESVRfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9kZWNpbWFsLmNwcCBiL2Z4anMveGZhL2NqeF9kZWNpbWFsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Njc2M2JhCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2RlY2ltYWwuY3BwCkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9kZWNpbWFsLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWNpbWFsLmgiCisKK0NKWF9EZWNpbWFsOjpDSlhfRGVjaW1hbChDWEZBX0RlY2ltYWwqIG5vZGUpIDogQ0pYX0NvbnRlbnQobm9kZSkge30KKworQ0pYX0RlY2ltYWw6On5DSlhfRGVjaW1hbCgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfRGVjaW1hbDo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9EZWNpbWFsOjpmcmFjRGlnaXRzKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0RlY2ltYWw6OmRlZmF1bHRWYWx1ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZShwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRGVjaW1hbDo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9EZWNpbWFsOjp2YWx1ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0RlY2ltYWw6OmxlYWREaWdpdHMoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9kZWNpbWFsLmggYi9meGpzL3hmYS9janhfZGVjaW1hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NTMxMTIKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZGVjaW1hbC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfREVDSU1BTF9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfREVDSU1BTF9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2NvbnRlbnQuaCIKKworY2xhc3MgQ1hGQV9EZWNpbWFsOworCitjbGFzcyBDSlhfRGVjaW1hbCA6IHB1YmxpYyBDSlhfQ29udGVudCB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfRGVjaW1hbChDWEZBX0RlY2ltYWwqIG5vZGUpOworICB+Q0pYX0RlY2ltYWwoKSBvdmVycmlkZTsKKworICBKU19QUk9QKGRlZmF1bHRWYWx1ZSk7IC8qIHtkZWZhdWx0fSAqLworICBKU19QUk9QKGZyYWNEaWdpdHMpOworICBKU19QUk9QKGxlYWREaWdpdHMpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7CisgIEpTX1BST1AodmFsdWUpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfREVDSU1BTF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2RlZmF1bHR1aS5jcHAgYi9meGpzL3hmYS9janhfZGVmYXVsdHVpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzk5NWNkCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2RlZmF1bHR1aS5jcHAKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2RlZmF1bHR1aS5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVmYXVsdHVpLmgiCisKK0NKWF9EZWZhdWx0VWk6OkNKWF9EZWZhdWx0VWkoQ1hGQV9EZWZhdWx0VWkqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX0RlZmF1bHRVaTo6fkNKWF9EZWZhdWx0VWkoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0RlZmF1bHRVaTo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRGVmYXVsdFVpOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2RlZmF1bHR1aS5oIGIvZnhqcy94ZmEvY2p4X2RlZmF1bHR1aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiODk4M2IKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZGVmYXVsdHVpLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9ERUZBVUxUVUlfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0RFRkFVTFRVSV9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9EZWZhdWx0VWk7CisKK2NsYXNzIENKWF9EZWZhdWx0VWkgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0RlZmF1bHRVaShDWEZBX0RlZmF1bHRVaSogbm9kZSk7CisgIH5DSlhfRGVmYXVsdFVpKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfREVGQVVMVFVJX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZGVsZXRlLmNwcCBiL2Z4anMveGZhL2NqeF9kZWxldGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmU5OTEKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZGVsZXRlLmNwcApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZGVsZXRlLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWxldGUuaCIKKworQ0pYX0RlbGV0ZTo6Q0pYX0RlbGV0ZShDWEZBX0RlbGV0ZSogbm9kZSkgOiBDSlhfVGV4dE5vZGUobm9kZSkge30KKworQ0pYX0RlbGV0ZTo6fkNKWF9EZWxldGUoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0RlbGV0ZTo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRGVsZXRlOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2RlbGV0ZS5oIGIvZnhqcy94ZmEvY2p4X2RlbGV0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxM2ExNDAKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZGVsZXRlLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9ERUxFVEVfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0RFTEVURV9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3RleHRub2RlLmgiCisKK2NsYXNzIENYRkFfRGVsZXRlOworCitjbGFzcyBDSlhfRGVsZXRlIDogcHVibGljIENKWF9UZXh0Tm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfRGVsZXRlKENYRkFfRGVsZXRlKiBub2RlKTsKKyAgfkNKWF9EZWxldGUoKSBvdmVycmlkZTsKKworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9ERUxFVEVfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9kZWx0YS5jcHAgYi9meGpzL3hmYS9janhfZGVsdGEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOGNiZDUKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZGVsdGEuY3BwCkBAIC0wLDAgKzEsNDAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9kZWx0YS5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnhqcy9jZnhqc2VfdmFsdWUuaCIKKyNpbmNsdWRlICJmeGpzL2pzX3Jlc291cmNlcy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RlbHRhLmgiCisKK2NvbnN0IENKWF9NZXRob2RTcGVjIENKWF9EZWx0YTo6TWV0aG9kU3BlY3NbXSA9IHt7InJlc3RvcmUiLCByZXN0b3JlX3N0YXRpY319OworCitDSlhfRGVsdGE6OkNKWF9EZWx0YShDWEZBX0RlbHRhKiBkZWx0YSkgOiBDSlhfT2JqZWN0KGRlbHRhKSB7CisgIERlZmluZU1ldGhvZHMoTWV0aG9kU3BlY3MsIEZYX0FycmF5U2l6ZShNZXRob2RTcGVjcykpOworfQorCitDSlhfRGVsdGE6On5DSlhfRGVsdGEoKSB7fQorCitDSlNfUmV0dXJuIENKWF9EZWx0YTo6cmVzdG9yZShDSlNfVjgqIHJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIXBhcmFtcy5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK3ZvaWQgQ0pYX0RlbHRhOjpjdXJyZW50VmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkge30KKwordm9pZCBDSlhfRGVsdGE6OnNhdmVkVmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7fQorCit2b2lkIENKWF9EZWx0YTo6dGFyZ2V0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHt9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZGVsdGEuaCBiL2Z4anMveGZhL2NqeF9kZWx0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiOTgxY2QKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZGVsdGEuaApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0RFTFRBX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9ERUxUQV9IXworCisjaW5jbHVkZSAiZnhqcy9DSlhfRGVmaW5lLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X29iamVjdC5oIgorCitjbGFzcyBDWEZBX0RlbHRhOworCitjbGFzcyBDSlhfRGVsdGEgOiBwdWJsaWMgQ0pYX09iamVjdCB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfRGVsdGEoQ1hGQV9EZWx0YSogZGVsdGEpOworICB+Q0pYX0RlbHRhKCkgb3ZlcnJpZGU7CisKKyAgSlNfTUVUSE9EKHJlc3RvcmUsIENKWF9EZWx0YSk7CisKKyAgSlNfUFJPUChjdXJyZW50VmFsdWUpOworICBKU19QUk9QKHNhdmVkVmFsdWUpOworICBKU19QUk9QKHRhcmdldCk7CisKKyBwcml2YXRlOgorICBzdGF0aWMgY29uc3QgQ0pYX01ldGhvZFNwZWMgTWV0aG9kU3BlY3NbXTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0RFTFRBX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZGVsdGFzLmNwcCBiL2Z4anMveGZhL2NqeF9kZWx0YXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OTY5ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZGVsdGFzLmNwcApAQCAtMCwwICsxLDEzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZGVsdGFzLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWx0YXMuaCIKKworQ0pYX0RlbHRhczo6Q0pYX0RlbHRhcyhDWEZBX0RlbHRhcyogc3JjKSA6IENKWF9MaXN0KHNyYykge30KKworQ0pYX0RlbHRhczo6fkNKWF9EZWx0YXMoKSB7fQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2RlbHRhcy5oIGIvZnhqcy94ZmEvY2p4X2RlbHRhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NDc1M2YKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZGVsdGFzLmgKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9ERUxUQVNfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0RFTFRBU19IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2xpc3QuaCIKKworY2xhc3MgQ1hGQV9EZWx0YXM7CisKK2NsYXNzIENKWF9EZWx0YXMgOiBwdWJsaWMgQ0pYX0xpc3QgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0RlbHRhcyhDWEZBX0RlbHRhcyogbm9kZSk7CisgIH5DSlhfRGVsdGFzKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9ERUxUQVNfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9kZXNjLmNwcCBiL2Z4anMveGZhL2NqeF9kZXNjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDlhZTYzCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2Rlc2MuY3BwCkBAIC0wLDAgKzEsNDAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9kZXNjLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV92YWx1ZS5oIgorI2luY2x1ZGUgImZ4anMvanNfcmVzb3VyY2VzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVzYy5oIgorCitjb25zdCBDSlhfTWV0aG9kU3BlYyBDSlhfRGVzYzo6TWV0aG9kU3BlY3NbXSA9IHt7Im1ldGFkYXRhIiwgbWV0YWRhdGFfc3RhdGljfX07CisKK0NKWF9EZXNjOjpDSlhfRGVzYyhDWEZBX0Rlc2MqIGRlc2MpIDogQ0pYX05vZGUoZGVzYykgeworICBEZWZpbmVNZXRob2RzKE1ldGhvZFNwZWNzLCBGWF9BcnJheVNpemUoTWV0aG9kU3BlY3MpKTsKK30KKworQ0pYX0Rlc2M6On5DSlhfRGVzYygpIHt9CisKK0NKU19SZXR1cm4gQ0pYX0Rlc2M6Om1ldGFkYXRhKENKU19WOCogcnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDAgJiYgcGFyYW1zLnNpemUoKSAhPSAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocnVudGltZS0+TmV3U3RyaW5nKCIiKSk7Cit9CisKK3ZvaWQgQ0pYX0Rlc2M6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRGVzYzo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2Rlc2MuaCBiL2Z4anMveGZhL2NqeF9kZXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQyMWM3YgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9kZXNjLmgKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9ERVNDX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9ERVNDX0hfCisKKyNpbmNsdWRlICJmeGpzL0NKWF9EZWZpbmUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX0Rlc2M7CisKK2NsYXNzIENKWF9EZXNjIDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9EZXNjKENYRkFfRGVzYyogZGVzYyk7CisgIH5DSlhfRGVzYygpIG92ZXJyaWRlOworCisgIEpTX01FVEhPRChtZXRhZGF0YSwgQ0pYX0Rlc2MpOworCisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKKworIHByaXZhdGU6CisgIHN0YXRpYyBjb25zdCBDSlhfTWV0aG9kU3BlYyBNZXRob2RTcGVjc1tdOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfREVTQ19IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2RpZ2VzdG1ldGhvZC5jcHAgYi9meGpzL3hmYS9janhfZGlnZXN0bWV0aG9kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODVmYzAwCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2RpZ2VzdG1ldGhvZC5jcHAKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2RpZ2VzdG1ldGhvZC5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGlnZXN0bWV0aG9kLmgiCisKK0NKWF9EaWdlc3RNZXRob2Q6OkNKWF9EaWdlc3RNZXRob2QoQ1hGQV9EaWdlc3RNZXRob2QqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX0RpZ2VzdE1ldGhvZDo6fkNKWF9EaWdlc3RNZXRob2QoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0RpZ2VzdE1ldGhvZDo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRGlnZXN0TWV0aG9kOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2RpZ2VzdG1ldGhvZC5oIGIvZnhqcy94ZmEvY2p4X2RpZ2VzdG1ldGhvZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNGU2ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZGlnZXN0bWV0aG9kLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9ESUdFU1RNRVRIT0RfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0RJR0VTVE1FVEhPRF9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9EaWdlc3RNZXRob2Q7CisKK2NsYXNzIENKWF9EaWdlc3RNZXRob2QgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0RpZ2VzdE1ldGhvZChDWEZBX0RpZ2VzdE1ldGhvZCogbm9kZSk7CisgIH5DSlhfRGlnZXN0TWV0aG9kKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfRElHRVNUTUVUSE9EX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZGlnZXN0bWV0aG9kcy5jcHAgYi9meGpzL3hmYS9janhfZGlnZXN0bWV0aG9kcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3Y2JjZAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9kaWdlc3RtZXRob2RzLmNwcApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZGlnZXN0bWV0aG9kcy5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGlnZXN0bWV0aG9kcy5oIgorCitDSlhfRGlnZXN0TWV0aG9kczo6Q0pYX0RpZ2VzdE1ldGhvZHMoQ1hGQV9EaWdlc3RNZXRob2RzKiBub2RlKQorICAgIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX0RpZ2VzdE1ldGhvZHM6On5DSlhfRGlnZXN0TWV0aG9kcygpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfRGlnZXN0TWV0aG9kczo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9EaWdlc3RNZXRob2RzOjp0eXBlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0RpZ2VzdE1ldGhvZHM6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9kaWdlc3RtZXRob2RzLmggYi9meGpzL3hmYS9janhfZGlnZXN0bWV0aG9kcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYWRkYzMKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZGlnZXN0bWV0aG9kcy5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfRElHRVNUTUVUSE9EU19IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfRElHRVNUTUVUSE9EU19IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9EaWdlc3RNZXRob2RzOworCitjbGFzcyBDSlhfRGlnZXN0TWV0aG9kcyA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfRGlnZXN0TWV0aG9kcyhDWEZBX0RpZ2VzdE1ldGhvZHMqIG5vZGUpOworICB+Q0pYX0RpZ2VzdE1ldGhvZHMoKSBvdmVycmlkZTsKKworICBKU19QUk9QKHR5cGUpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9ESUdFU1RNRVRIT0RTX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZHJhdy5jcHAgYi9meGpzL3hmYS9janhfZHJhdy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFiYWFiZgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9kcmF3LmNwcApAQCAtMCwwICsxLDE1MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2RyYXcuaCIKKworI2luY2x1ZGUgImZ4anMvY2Z4anNlX3ZhbHVlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV93aWRnZXRhY2MuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kcmF3LmgiCisKK0NKWF9EcmF3OjpDSlhfRHJhdyhDWEZBX0RyYXcqIG5vZGUpIDogQ0pYX0NvbnRhaW5lcihub2RlKSB7fQorCitDSlhfRHJhdzo6fkNKWF9EcmF3KCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9EcmF3OjpoKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0RyYXc6OncoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRHJhdzo6eChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9EcmF3Ojp5KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0RyYXc6OmhBbGlnbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRHJhdzo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9EcmF3Ojpyb3RhdGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0RyYXc6OnByZXNlbmNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRHJhdzo6dkFsaWduKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9EcmF3OjptYXhIKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0RyYXc6Om1heFcoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRHJhdzo6bWluSChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9EcmF3OjptaW5XKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0RyYXc6OnJlbGV2YW50KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRHJhdzo6cmF3VmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIGRlZmF1bHRWYWx1ZShwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRHJhdzo6ZGVmYXVsdFZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIGlmICghYlNldHRpbmcpIHsKKyAgICBXaWRlU3RyaW5nIGNvbnRlbnQgPSBHZXRDb250ZW50KHRydWUpOworICAgIGlmIChjb250ZW50LklzRW1wdHkoKSkKKyAgICAgIHBWYWx1ZS0+U2V0TnVsbCgpOworICAgIGVsc2UKKyAgICAgIHBWYWx1ZS0+U2V0U3RyaW5nKGNvbnRlbnQuVVRGOEVuY29kZSgpLkFzU3RyaW5nVmlldygpKTsKKworICAgIHJldHVybjsKKyAgfQorCisgIGlmICghcFZhbHVlIHx8ICFwVmFsdWUtPklzU3RyaW5nKCkpCisgICAgcmV0dXJuOworCisgIFhGQV9FbGVtZW50IHVpVHlwZSA9IEdldFhGQU5vZGUoKS0+R2V0V2lkZ2V0QWNjKCktPkdldFVJVHlwZSgpOworICBpZiAodWlUeXBlICE9IFhGQV9FbGVtZW50OjpUZXh0KQorICAgIHJldHVybjsKKworICBXaWRlU3RyaW5nIHdzTmV3VmFsdWUgPSBwVmFsdWUtPlRvV2lkZVN0cmluZygpOworICBTZXRDb250ZW50KHdzTmV3VmFsdWUsIHdzTmV3VmFsdWUsIHRydWUsIHRydWUsIHRydWUpOworfQorCit2b2lkIENKWF9EcmF3Ojpjb2xTcGFuKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0RyYXc6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRHJhdzo6bG9jYWxlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9EcmF3OjphbmNob3JUeXBlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZHJhdy5oIGIvZnhqcy94ZmEvY2p4X2RyYXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDU2MDNhCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2RyYXcuaApAQCAtMCwwICsxLDQxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0RSQVdfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0RSQVdfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9jb250YWluZXIuaCIKKworY2xhc3MgQ1hGQV9EcmF3OworCitjbGFzcyBDSlhfRHJhdyA6IHB1YmxpYyBDSlhfQ29udGFpbmVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9EcmF3KENYRkFfRHJhdyogbm9kZSk7CisgIH5DSlhfRHJhdygpIG92ZXJyaWRlOworCisgIEpTX1BST1AoZGVmYXVsdFZhbHVlKTsgLyoge2RlZmF1bHR9ICovCisgIEpTX1BST1AoYW5jaG9yVHlwZSk7CisgIEpTX1BST1AoY29sU3Bhbik7CisgIEpTX1BST1AoaCk7CisgIEpTX1BST1AoaEFsaWduKTsKKyAgSlNfUFJPUChsb2NhbGUpOworICBKU19QUk9QKG1heEgpOworICBKU19QUk9QKG1heFcpOworICBKU19QUk9QKG1pbkgpOworICBKU19QUk9QKG1pblcpOworICBKU19QUk9QKHByZXNlbmNlKTsKKyAgSlNfUFJPUChyYXdWYWx1ZSk7CisgIEpTX1BST1AocmVsZXZhbnQpOworICBKU19QUk9QKHJvdGF0ZSk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKKyAgSlNfUFJPUCh2QWxpZ24pOworICBKU19QUk9QKHcpOworICBKU19QUk9QKHgpOworICBKU19QUk9QKHkpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfRFJBV19IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2VkZ2UuY3BwIGIvZnhqcy94ZmEvY2p4X2VkZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMWZhMzUKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZWRnZS5jcHAKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2VkZ2UuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2VkZ2UuaCIKKworQ0pYX0VkZ2U6OkNKWF9FZGdlKENYRkFfRWRnZSogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfRWRnZTo6fkNKWF9FZGdlKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9FZGdlOjpjYXAoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0VkZ2U6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRWRnZTo6c3Ryb2tlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9FZGdlOjpwcmVzZW5jZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0VkZ2U6OnRoaWNrbmVzcyhDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRWRnZTo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2VkZ2UuaCBiL2Z4anMveGZhL2NqeF9lZGdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0ZGRlYgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9lZGdlLmgKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9FREdFX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9FREdFX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX0VkZ2U7CisKK2NsYXNzIENKWF9FZGdlIDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9FZGdlKENYRkFfRWRnZSogbm9kZSk7CisgIH5DSlhfRWRnZSgpIG92ZXJyaWRlOworCisgIEpTX1BST1AoY2FwKTsKKyAgSlNfUFJPUChwcmVzZW5jZSk7CisgIEpTX1BST1Aoc3Ryb2tlKTsKKyAgSlNfUFJPUCh0aGlja25lc3MpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9FREdFX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZW5jb2RpbmcuY3BwIGIvZnhqcy94ZmEvY2p4X2VuY29kaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWJmZTQwCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2VuY29kaW5nLmNwcApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZW5jb2RpbmcuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2VuY29kaW5nLmgiCisKK0NKWF9FbmNvZGluZzo6Q0pYX0VuY29kaW5nKENYRkFfRW5jb2RpbmcqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX0VuY29kaW5nOjp+Q0pYX0VuY29kaW5nKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9FbmNvZGluZzo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0VuY29kaW5nOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9lbmNvZGluZy5oIGIvZnhqcy94ZmEvY2p4X2VuY29kaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE4MjMzMwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9lbmNvZGluZy5oCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfRU5DT0RJTkdfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0VOQ09ESU5HX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX0VuY29kaW5nOworCitjbGFzcyBDSlhfRW5jb2RpbmcgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0VuY29kaW5nKENYRkFfRW5jb2RpbmcqIG5vZGUpOworICB+Q0pYX0VuY29kaW5nKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfRU5DT0RJTkdfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9lbmNvZGluZ3MuY3BwIGIvZnhqcy94ZmEvY2p4X2VuY29kaW5ncy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY3OTI5ZgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9lbmNvZGluZ3MuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9lbmNvZGluZ3MuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2VuY29kaW5ncy5oIgorCitDSlhfRW5jb2RpbmdzOjpDSlhfRW5jb2RpbmdzKENYRkFfRW5jb2RpbmdzKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9FbmNvZGluZ3M6On5DSlhfRW5jb2RpbmdzKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9FbmNvZGluZ3M6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0VuY29kaW5nczo6dHlwZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRW5jb2RpbmdzOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2VuY29kaW5ncy5oIGIvZnhqcy94ZmEvY2p4X2VuY29kaW5ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNGY2MTcKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZW5jb2RpbmdzLmgKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9FTkNPRElOR1NfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0VOQ09ESU5HU19IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9FbmNvZGluZ3M7CisKK2NsYXNzIENKWF9FbmNvZGluZ3MgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0VuY29kaW5ncyhDWEZBX0VuY29kaW5ncyogbm9kZSk7CisgIH5DSlhfRW5jb2RpbmdzKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUCh0eXBlKTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfRU5DT0RJTkdTX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZW5jcnlwdC5jcHAgYi9meGpzL3hmYS9janhfZW5jcnlwdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJlZDFmMgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9lbmNyeXB0LmNwcApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZW5jcnlwdC5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jcnlwdC5oIgorCitDSlhfRW5jcnlwdDo6Q0pYX0VuY3J5cHQoQ1hGQV9FbmNyeXB0KiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9FbmNyeXB0Ojp+Q0pYX0VuY3J5cHQoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0VuY3J5cHQ6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRW5jcnlwdDo6Zm9ybWF0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7fQorCit2b2lkIENKWF9FbmNyeXB0Ojp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZW5jcnlwdC5oIGIvZnhqcy94ZmEvY2p4X2VuY3J5cHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWZhYzE1Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2VuY3J5cHQuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0VOQ1JZUFRfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0VOQ1JZUFRfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfRW5jcnlwdDsKKworY2xhc3MgQ0pYX0VuY3J5cHQgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0VuY3J5cHQoQ1hGQV9FbmNyeXB0KiBub2RlKTsKKyAgfkNKWF9FbmNyeXB0KCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChmb3JtYXQpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9FTkNSWVBUX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZXZlbnQuY3BwIGIvZnhqcy94ZmEvY2p4X2V2ZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2IyYmNlCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2V2ZW50LmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZXZlbnQuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2V2ZW50LmgiCisKK0NKWF9FdmVudDo6Q0pYX0V2ZW50KENYRkFfRXZlbnQqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX0V2ZW50Ojp+Q0pYX0V2ZW50KCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9FdmVudDo6cmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0V2ZW50Ojp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRXZlbnQ6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9FdmVudDo6YWN0aXZpdHkoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZXZlbnQuaCBiL2Z4anMveGZhL2NqeF9ldmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNmQ5MjAKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZXZlbnQuaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0VWRU5UX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9FVkVOVF9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9FdmVudDsKKworY2xhc3MgQ0pYX0V2ZW50IDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9FdmVudChDWEZBX0V2ZW50KiBub2RlKTsKKyAgfkNKWF9FdmVudCgpIG92ZXJyaWRlOworCisgIEpTX1BST1AoYWN0aXZpdHkpOworICBKU19QUk9QKHJlZik7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0VWRU5UX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZXZlbnRwc2V1ZG9tb2RlbC5jcHAgYi9meGpzL3hmYS9janhfZXZlbnRwc2V1ZG9tb2RlbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyZDk3NwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9ldmVudHBzZXVkb21vZGVsLmNwcApAQCAtMCwwICsxLDI1NiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2V2ZW50cHNldWRvbW9kZWwuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImZ4anMvY2Z4anNlX2VuZ2luZS5oIgorI2luY2x1ZGUgImZ4anMvY2Z4anNlX3ZhbHVlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9ldmVudHBhcmFtLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZm5vdGlmeS5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZ3aWRnZXRoYW5kbGVyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfZXZlbnRwc2V1ZG9tb2RlbC5oIgorCituYW1lc3BhY2UgeworCit2b2lkIFN0cmluZ1Byb3BlcnR5KENGWEpTRV9WYWx1ZSogcFZhbHVlLCBXaWRlU3RyaW5nJiB3c1ZhbHVlLCBib29sIGJTZXR0aW5nKSB7CisgIGlmIChiU2V0dGluZykgeworICAgIHdzVmFsdWUgPSBwVmFsdWUtPlRvV2lkZVN0cmluZygpOworICAgIHJldHVybjsKKyAgfQorICBwVmFsdWUtPlNldFN0cmluZyh3c1ZhbHVlLlVURjhFbmNvZGUoKS5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKK3ZvaWQgSW50ZXJQcm9wZXJ0eShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwgaW50MzJfdCYgaVZhbHVlLCBib29sIGJTZXR0aW5nKSB7CisgIGlmIChiU2V0dGluZykgeworICAgIGlWYWx1ZSA9IHBWYWx1ZS0+VG9JbnRlZ2VyKCk7CisgICAgcmV0dXJuOworICB9CisgIHBWYWx1ZS0+U2V0SW50ZWdlcihpVmFsdWUpOworfQorCit2b2lkIEJvb2xlYW5Qcm9wZXJ0eShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwgYm9vbCYgYlZhbHVlLCBib29sIGJTZXR0aW5nKSB7CisgIGlmIChiU2V0dGluZykgeworICAgIGJWYWx1ZSA9IHBWYWx1ZS0+VG9Cb29sZWFuKCk7CisgICAgcmV0dXJuOworICB9CisgIHBWYWx1ZS0+U2V0Qm9vbGVhbihiVmFsdWUpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworY29uc3QgQ0pYX01ldGhvZFNwZWMgQ0pYX0V2ZW50UHNldWRvTW9kZWw6Ok1ldGhvZFNwZWNzW10gPSB7CisgICAgeyJlbWl0IiwgZW1pdF9zdGF0aWN9LAorICAgIHsicmVzZXQiLCByZXNldF9zdGF0aWN9fTsKKworQ0pYX0V2ZW50UHNldWRvTW9kZWw6OkNKWF9FdmVudFBzZXVkb01vZGVsKENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbCogbW9kZWwpCisgICAgOiBDSlhfT2JqZWN0KG1vZGVsKSB7CisgIERlZmluZU1ldGhvZHMoTWV0aG9kU3BlY3MsIEZYX0FycmF5U2l6ZShNZXRob2RTcGVjcykpOworfQorCitDSlhfRXZlbnRQc2V1ZG9Nb2RlbDo6fkNKWF9FdmVudFBzZXVkb01vZGVsKCkge30KKwordm9pZCBDSlhfRXZlbnRQc2V1ZG9Nb2RlbDo6Y2hhbmdlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFByb3BlcnR5KHBWYWx1ZSwgWEZBX0V2ZW50OjpDaGFuZ2UsIGJTZXR0aW5nKTsKK30KKwordm9pZCBDSlhfRXZlbnRQc2V1ZG9Nb2RlbDo6Y29tbWl0S2V5KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFByb3BlcnR5KHBWYWx1ZSwgWEZBX0V2ZW50OjpDb21taXRLZXksIGJTZXR0aW5nKTsKK30KKwordm9pZCBDSlhfRXZlbnRQc2V1ZG9Nb2RlbDo6ZnVsbFRleHQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFByb3BlcnR5KHBWYWx1ZSwgWEZBX0V2ZW50OjpGdWxsVGV4dCwgYlNldHRpbmcpOworfQorCit2b2lkIENKWF9FdmVudFBzZXVkb01vZGVsOjprZXlEb3duKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgUHJvcGVydHkocFZhbHVlLCBYRkFfRXZlbnQ6OktleWRvd24sIGJTZXR0aW5nKTsKK30KKwordm9pZCBDSlhfRXZlbnRQc2V1ZG9Nb2RlbDo6bW9kaWZpZXIoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFByb3BlcnR5KHBWYWx1ZSwgWEZBX0V2ZW50OjpNb2RpZmllciwgYlNldHRpbmcpOworfQorCit2b2lkIENKWF9FdmVudFBzZXVkb01vZGVsOjpuZXdDb250ZW50VHlwZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgUHJvcGVydHkocFZhbHVlLCBYRkFfRXZlbnQ6Ok5ld0NvbnRlbnRUeXBlLCBiU2V0dGluZyk7Cit9CisKK3ZvaWQgQ0pYX0V2ZW50UHNldWRvTW9kZWw6Om5ld1RleHQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBQcm9wZXJ0eShwVmFsdWUsIFhGQV9FdmVudDo6TmV3VGV4dCwgYlNldHRpbmcpOworfQorCit2b2lkIENKWF9FdmVudFBzZXVkb01vZGVsOjpwcmV2Q29udGVudFR5cGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgUHJvcGVydHkocFZhbHVlLCBYRkFfRXZlbnQ6OlByZXZpb3VzQ29udGVudFR5cGUsIGJTZXR0aW5nKTsKK30KKwordm9pZCBDSlhfRXZlbnRQc2V1ZG9Nb2RlbDo6cHJldlRleHQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFByb3BlcnR5KHBWYWx1ZSwgWEZBX0V2ZW50OjpQcmV2aW91c1RleHQsIGJTZXR0aW5nKTsKK30KKwordm9pZCBDSlhfRXZlbnRQc2V1ZG9Nb2RlbDo6cmVlbnRlcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFByb3BlcnR5KHBWYWx1ZSwgWEZBX0V2ZW50OjpSZWVudGVyLCBiU2V0dGluZyk7Cit9CisKK3ZvaWQgQ0pYX0V2ZW50UHNldWRvTW9kZWw6OnNlbEVuZChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBQcm9wZXJ0eShwVmFsdWUsIFhGQV9FdmVudDo6U2VsZWN0aW9uRW5kLCBiU2V0dGluZyk7Cit9CisKK3ZvaWQgQ0pYX0V2ZW50UHNldWRvTW9kZWw6OnNlbFN0YXJ0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBQcm9wZXJ0eShwVmFsdWUsIFhGQV9FdmVudDo6U2VsZWN0aW9uU3RhcnQsIGJTZXR0aW5nKTsKK30KKwordm9pZCBDSlhfRXZlbnRQc2V1ZG9Nb2RlbDo6c2hpZnQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFByb3BlcnR5KHBWYWx1ZSwgWEZBX0V2ZW50OjpTaGlmdCwgYlNldHRpbmcpOworfQorCit2b2lkIENKWF9FdmVudFBzZXVkb01vZGVsOjpzb2FwRmF1bHRDb2RlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgUHJvcGVydHkocFZhbHVlLCBYRkFfRXZlbnQ6OlNvYXBGYXVsdENvZGUsIGJTZXR0aW5nKTsKK30KKwordm9pZCBDSlhfRXZlbnRQc2V1ZG9Nb2RlbDo6c29hcEZhdWx0U3RyaW5nKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFByb3BlcnR5KHBWYWx1ZSwgWEZBX0V2ZW50OjpTb2FwRmF1bHRTdHJpbmcsIGJTZXR0aW5nKTsKK30KKwordm9pZCBDSlhfRXZlbnRQc2V1ZG9Nb2RlbDo6dGFyZ2V0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFByb3BlcnR5KHBWYWx1ZSwgWEZBX0V2ZW50OjpUYXJnZXQsIGJTZXR0aW5nKTsKK30KKworQ0pTX1JldHVybiBDSlhfRXZlbnRQc2V1ZG9Nb2RlbDo6ZW1pdCgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgQ0ZYSlNFX0VuZ2luZSogcFNjcmlwdENvbnRleHQgPSBHZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCk7CisgIGlmICghcFNjcmlwdENvbnRleHQpCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSA9IHBTY3JpcHRDb250ZXh0LT5HZXRFdmVudFBhcmFtKCk7CisgIGlmICghcEV2ZW50UGFyYW0pCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IEdldERvY3VtZW50KCktPkdldE5vdGlmeSgpOworICBpZiAoIXBOb3RpZnkpCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgQ1hGQV9GRldpZGdldEhhbmRsZXIqIHBXaWRnZXRIYW5kbGVyID0gcE5vdGlmeS0+R2V0V2lkZ2V0SGFuZGxlcigpOworICBpZiAoIXBXaWRnZXRIYW5kbGVyKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIHBXaWRnZXRIYW5kbGVyLT5Qcm9jZXNzRXZlbnQocEV2ZW50UGFyYW0tPm1fcFRhcmdldCwgcEV2ZW50UGFyYW0pOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfRXZlbnRQc2V1ZG9Nb2RlbDo6cmVzZXQoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIENGWEpTRV9FbmdpbmUqIHBTY3JpcHRDb250ZXh0ID0gR2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpOworICBpZiAoIXBTY3JpcHRDb250ZXh0KQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIENYRkFfRXZlbnRQYXJhbSogcEV2ZW50UGFyYW0gPSBwU2NyaXB0Q29udGV4dC0+R2V0RXZlbnRQYXJhbSgpOworICBpZiAoIXBFdmVudFBhcmFtKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIHBFdmVudFBhcmFtLT5SZXNldCgpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKwordm9pZCBDSlhfRXZlbnRQc2V1ZG9Nb2RlbDo6UHJvcGVydHkoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRXZlbnQgZHdGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZykgeworICBDRlhKU0VfRW5naW5lKiBwU2NyaXB0Q29udGV4dCA9IEdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKTsKKyAgaWYgKCFwU2NyaXB0Q29udGV4dCkKKyAgICByZXR1cm47CisKKyAgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSA9IHBTY3JpcHRDb250ZXh0LT5HZXRFdmVudFBhcmFtKCk7CisgIGlmICghcEV2ZW50UGFyYW0pCisgICAgcmV0dXJuOworCisgIHN3aXRjaCAoZHdGbGFnKSB7CisgICAgY2FzZSBYRkFfRXZlbnQ6OkNhbmNlbEFjdGlvbjoKKyAgICAgIEJvb2xlYW5Qcm9wZXJ0eShwVmFsdWUsIHBFdmVudFBhcmFtLT5tX2JDYW5jZWxBY3Rpb24sIGJTZXR0aW5nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0V2ZW50OjpDaGFuZ2U6CisgICAgICBTdHJpbmdQcm9wZXJ0eShwVmFsdWUsIHBFdmVudFBhcmFtLT5tX3dzQ2hhbmdlLCBiU2V0dGluZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FdmVudDo6Q29tbWl0S2V5OgorICAgICAgSW50ZXJQcm9wZXJ0eShwVmFsdWUsIHBFdmVudFBhcmFtLT5tX2lDb21taXRLZXksIGJTZXR0aW5nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0V2ZW50OjpGdWxsVGV4dDoKKyAgICAgIFN0cmluZ1Byb3BlcnR5KHBWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fd3NGdWxsVGV4dCwgYlNldHRpbmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRXZlbnQ6OktleWRvd246CisgICAgICBCb29sZWFuUHJvcGVydHkocFZhbHVlLCBwRXZlbnRQYXJhbS0+bV9iS2V5RG93biwgYlNldHRpbmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRXZlbnQ6Ok1vZGlmaWVyOgorICAgICAgQm9vbGVhblByb3BlcnR5KHBWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fYk1vZGlmaWVyLCBiU2V0dGluZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FdmVudDo6TmV3Q29udGVudFR5cGU6CisgICAgICBTdHJpbmdQcm9wZXJ0eShwVmFsdWUsIHBFdmVudFBhcmFtLT5tX3dzTmV3Q29udGVudFR5cGUsIGJTZXR0aW5nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0V2ZW50OjpOZXdUZXh0OgorICAgICAgU3RyaW5nUHJvcGVydHkocFZhbHVlLCBwRXZlbnRQYXJhbS0+bV93c05ld1RleHQsIGJTZXR0aW5nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0V2ZW50OjpQcmV2aW91c0NvbnRlbnRUeXBlOgorICAgICAgU3RyaW5nUHJvcGVydHkocFZhbHVlLCBwRXZlbnRQYXJhbS0+bV93c1ByZXZDb250ZW50VHlwZSwgYlNldHRpbmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRXZlbnQ6OlByZXZpb3VzVGV4dDoKKyAgICAgIFN0cmluZ1Byb3BlcnR5KHBWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fd3NQcmV2VGV4dCwgYlNldHRpbmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRXZlbnQ6OlJlZW50ZXI6CisgICAgICBCb29sZWFuUHJvcGVydHkocFZhbHVlLCBwRXZlbnRQYXJhbS0+bV9iUmVlbnRlciwgYlNldHRpbmcpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRXZlbnQ6OlNlbGVjdGlvbkVuZDoKKyAgICAgIEludGVyUHJvcGVydHkocFZhbHVlLCBwRXZlbnRQYXJhbS0+bV9pU2VsRW5kLCBiU2V0dGluZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FdmVudDo6U2VsZWN0aW9uU3RhcnQ6CisgICAgICBJbnRlclByb3BlcnR5KHBWYWx1ZSwgcEV2ZW50UGFyYW0tPm1faVNlbFN0YXJ0LCBiU2V0dGluZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FdmVudDo6U2hpZnQ6CisgICAgICBCb29sZWFuUHJvcGVydHkocFZhbHVlLCBwRXZlbnRQYXJhbS0+bV9iU2hpZnQsIGJTZXR0aW5nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0V2ZW50OjpTb2FwRmF1bHRDb2RlOgorICAgICAgU3RyaW5nUHJvcGVydHkocFZhbHVlLCBwRXZlbnRQYXJhbS0+bV93c1NvYXBGYXVsdENvZGUsIGJTZXR0aW5nKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0V2ZW50OjpTb2FwRmF1bHRTdHJpbmc6CisgICAgICBTdHJpbmdQcm9wZXJ0eShwVmFsdWUsIHBFdmVudFBhcmFtLT5tX3dzU29hcEZhdWx0U3RyaW5nLCBiU2V0dGluZyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FdmVudDo6VGFyZ2V0OgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZXZlbnRwc2V1ZG9tb2RlbC5oIGIvZnhqcy94ZmEvY2p4X2V2ZW50cHNldWRvbW9kZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmQ3MzFjCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2V2ZW50cHNldWRvbW9kZWwuaApAQCAtMCwwICsxLDY3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0VWRU5UUFNFVURPTU9ERUxfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0VWRU5UUFNFVURPTU9ERUxfSF8KKworI2luY2x1ZGUgImZ4anMvQ0pYX0RlZmluZS5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9vYmplY3QuaCIKKworY2xhc3MgQ0ZYSlNFX1ZhbHVlOworY2xhc3MgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOworCitlbnVtIGNsYXNzIFhGQV9FdmVudCB7CisgIENoYW5nZSA9IDAsCisgIENvbW1pdEtleSwKKyAgRnVsbFRleHQsCisgIEtleWRvd24sCisgIE1vZGlmaWVyLAorICBOZXdDb250ZW50VHlwZSwKKyAgTmV3VGV4dCwKKyAgUHJldmlvdXNDb250ZW50VHlwZSwKKyAgUHJldmlvdXNUZXh0LAorICBSZWVudGVyLAorICBTZWxlY3Rpb25FbmQsCisgIFNlbGVjdGlvblN0YXJ0LAorICBTaGlmdCwKKyAgU29hcEZhdWx0Q29kZSwKKyAgU29hcEZhdWx0U3RyaW5nLAorICBUYXJnZXQsCisgIENhbmNlbEFjdGlvbgorfTsKKworY2xhc3MgQ0pYX0V2ZW50UHNldWRvTW9kZWwgOiBwdWJsaWMgQ0pYX09iamVjdCB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfRXZlbnRQc2V1ZG9Nb2RlbChDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWwqIG1vZGVsKTsKKyAgfkNKWF9FdmVudFBzZXVkb01vZGVsKCkgb3ZlcnJpZGU7CisKKyAgSlNfTUVUSE9EKGVtaXQsIENKWF9FdmVudFBzZXVkb01vZGVsKTsKKyAgSlNfTUVUSE9EKHJlc2V0LCBDSlhfRXZlbnRQc2V1ZG9Nb2RlbCk7CisKKyAgSlNfUFJPUChjaGFuZ2UpOworICBKU19QUk9QKGNvbW1pdEtleSk7CisgIEpTX1BST1AoZnVsbFRleHQpOworICBKU19QUk9QKGtleURvd24pOworICBKU19QUk9QKG1vZGlmaWVyKTsKKyAgSlNfUFJPUChuZXdDb250ZW50VHlwZSk7CisgIEpTX1BST1AobmV3VGV4dCk7CisgIEpTX1BST1AocHJldkNvbnRlbnRUeXBlKTsKKyAgSlNfUFJPUChwcmV2VGV4dCk7CisgIEpTX1BST1AocmVlbnRlcik7CisgIEpTX1BST1Aoc2VsRW5kKTsKKyAgSlNfUFJPUChzZWxTdGFydCk7CisgIEpTX1BST1Aoc2hpZnQpOworICBKU19QUk9QKHNvYXBGYXVsdENvZGUpOworICBKU19QUk9QKHNvYXBGYXVsdFN0cmluZyk7CisgIEpTX1BST1AodGFyZ2V0KTsKKworIHByaXZhdGU6CisgIHZvaWQgUHJvcGVydHkoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsIFhGQV9FdmVudCBkd0ZsYWcsIGJvb2wgYlNldHRpbmcpOworCisgIHN0YXRpYyBjb25zdCBDSlhfTWV0aG9kU3BlYyBNZXRob2RTcGVjc1tdOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfRVZFTlRQU0VVRE9NT0RFTF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2V4Y2xncm91cC5jcHAgYi9meGpzL3hmYS9janhfZXhjbGdyb3VwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDgxNGRjCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2V4Y2xncm91cC5jcHAKQEAgLTAsMCArMSwyOTAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9leGNsZ3JvdXAuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImZ4anMvY2Z4anNlX2VuZ2luZS5oIgorI2luY2x1ZGUgImZ4anMvY2Z4anNlX3ZhbHVlLmgiCisjaW5jbHVkZSAiZnhqcy9qc19yZXNvdXJjZXMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmbm90aWZ5LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvZnhmYS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhjbGdyb3VwLmgiCisKK2NvbnN0IENKWF9NZXRob2RTcGVjIENKWF9FeGNsR3JvdXA6Ok1ldGhvZFNwZWNzW10gPSB7CisgICAgeyJleGVjQ2FsY3VsYXRlIiwgZXhlY0NhbGN1bGF0ZV9zdGF0aWN9LAorICAgIHsiZXhlY0V2ZW50IiwgZXhlY0V2ZW50X3N0YXRpY30sCisgICAgeyJleGVjSW5pdGlhbGl6ZSIsIGV4ZWNJbml0aWFsaXplX3N0YXRpY30sCisgICAgeyJleGVjVmFsaWRhdGUiLCBleGVjVmFsaWRhdGVfc3RhdGljfSwKKyAgICB7InNlbGVjdGVkTWVtYmVyIiwgc2VsZWN0ZWRNZW1iZXJfc3RhdGljfX07CisKK0NKWF9FeGNsR3JvdXA6OkNKWF9FeGNsR3JvdXAoQ1hGQV9FeGNsR3JvdXAqIGdyb3VwKSA6IENKWF9Ob2RlKGdyb3VwKSB7CisgIERlZmluZU1ldGhvZHMoTWV0aG9kU3BlY3MsIEZYX0FycmF5U2l6ZShNZXRob2RTcGVjcykpOworfQorCitDSlhfRXhjbEdyb3VwOjp+Q0pYX0V4Y2xHcm91cCgpIHt9CisKK0NKU19SZXR1cm4gQ0pYX0V4Y2xHcm91cDo6ZXhlY0V2ZW50KAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBleGVjU2luZ2xlRXZlbnRCeU5hbWUocnVudGltZS0+VG9XaWRlU3RyaW5nKHBhcmFtc1swXSkuQXNTdHJpbmdWaWV3KCksCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RXhjbEdyb3VwKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0V4Y2xHcm91cDo6ZXhlY0luaXRpYWxpemUoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmICghcGFyYW1zLmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBHZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKKyAgaWYgKHBOb3RpZnkpCisgICAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QoR2V0WEZBTm9kZSgpLCBYRkFfRVZFTlRfSW5pdGlhbGl6ZSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIENKWF9FeGNsR3JvdXA6OmV4ZWNDYWxjdWxhdGUoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmICghcGFyYW1zLmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBHZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKKyAgaWYgKHBOb3RpZnkpCisgICAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QoR2V0WEZBTm9kZSgpLCBYRkFfRVZFTlRfQ2FsY3VsYXRlKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0V4Y2xHcm91cDo6ZXhlY1ZhbGlkYXRlKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIXBhcmFtcy5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBDWEZBX0ZGTm90aWZ5KiBub3RpZnkgPSBHZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKKyAgaWYgKCFub3RpZnkpCisgICAgcmV0dXJuIENKU19SZXR1cm4ocnVudGltZS0+TmV3Qm9vbGVhbihmYWxzZSkpOworCisgIGludDMyX3QgaVJldCA9IG5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QoR2V0WEZBTm9kZSgpLCBYRkFfRVZFTlRfVmFsaWRhdGUpOworICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdCb29sZWFuKGlSZXQgIT0gWEZBX0VWRU5URVJST1JfRXJyb3IpKTsKK30KKworQ0pTX1JldHVybiBDSlhfRXhjbEdyb3VwOjpzZWxlY3RlZE1lbWJlcigKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKCFwYXJhbXMuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5HZXRXaWRnZXRBY2MoKTsKKyAgaWYgKCFwV2lkZ2V0QWNjKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld051bGwoKSk7CisKKyAgQ1hGQV9Ob2RlKiBwUmV0dXJuTm9kZSA9IG51bGxwdHI7CisgIGlmIChwYXJhbXMuZW1wdHkoKSkgeworICAgIHBSZXR1cm5Ob2RlID0gcFdpZGdldEFjYy0+R2V0U2VsZWN0ZWRNZW1iZXIoKTsKKyAgfSBlbHNlIHsKKyAgICBwUmV0dXJuTm9kZSA9IHBXaWRnZXRBY2MtPlNldFNlbGVjdGVkTWVtYmVyKAorICAgICAgICBydW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzBdKS5Bc1N0cmluZ1ZpZXcoKSwgdHJ1ZSk7CisgIH0KKyAgaWYgKCFwUmV0dXJuTm9kZSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdOdWxsKCkpOworCisgIENGWEpTRV9WYWx1ZSogdmFsdWUgPQorICAgICAgR2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwUmV0dXJuTm9kZSk7CisgIGlmICghdmFsdWUpCisgICAgcmV0dXJuIENKU19SZXR1cm4ocnVudGltZS0+TmV3TnVsbCgpKTsKKworICByZXR1cm4gQ0pTX1JldHVybih2YWx1ZS0+RGlyZWN0R2V0VmFsdWUoKS5HZXQocnVudGltZS0+R2V0SXNvbGF0ZSgpKSk7Cit9CisKK3ZvaWQgQ0pYX0V4Y2xHcm91cDo6ZGVmYXVsdFZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IEdldFhGQU5vZGUoKS0+R2V0V2lkZ2V0QWNjKCk7CisgIGlmICghcFdpZGdldEFjYykKKyAgICByZXR1cm47CisKKyAgaWYgKGJTZXR0aW5nKSB7CisgICAgcFdpZGdldEFjYy0+U2V0U2VsZWN0ZWRNZW1iZXJCeVZhbHVlKHBWYWx1ZS0+VG9XaWRlU3RyaW5nKCkuQXNTdHJpbmdWaWV3KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIHRydWUsIHRydWUpOworICAgIHJldHVybjsKKyAgfQorCisgIFdpZGVTdHJpbmcgd3NWYWx1ZSA9IEdldENvbnRlbnQodHJ1ZSk7CisgIFhGQV9WRVJTSU9OIGN1clZlcnNpb24gPSBHZXREb2N1bWVudCgpLT5HZXRDdXJWZXJzaW9uTW9kZSgpOworICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkgJiYgY3VyVmVyc2lvbiA+PSBYRkFfVkVSU0lPTl8zMDApIHsKKyAgICBwVmFsdWUtPlNldE51bGwoKTsKKyAgICByZXR1cm47CisgIH0KKyAgcFZhbHVlLT5TZXRTdHJpbmcod3NWYWx1ZS5VVEY4RW5jb2RlKCkuQXNTdHJpbmdWaWV3KCkpOworfQorCit2b2lkIENKWF9FeGNsR3JvdXA6OnJhd1ZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgZGVmYXVsdFZhbHVlKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9FeGNsR3JvdXA6OnRyYW5zaWVudChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHt9CisKK3ZvaWQgQ0pYX0V4Y2xHcm91cDo6YWNjZXNzKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRXhjbEdyb3VwOjphY2Nlc3NLZXkoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9FeGNsR3JvdXA6OmFuY2hvclR5cGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0V4Y2xHcm91cDo6Ym9yZGVyQ29sb3IoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfU29tX0JvcmRlckNvbG9yKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9FeGNsR3JvdXA6OmJvcmRlcldpZHRoKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X1NvbV9Cb3JkZXJXaWR0aChwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRXhjbEdyb3VwOjpjb2xTcGFuKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9FeGNsR3JvdXA6OmZpbGxDb2xvcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X1NvbV9GaWxsQ29sb3IocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0V4Y2xHcm91cDo6aChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRXhjbEdyb3VwOjpoQWxpZ24oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9FeGNsR3JvdXA6OmxheW91dChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0V4Y2xHcm91cDo6bWFuZGF0b3J5KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfU29tX01hbmRhdG9yeShwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRXhjbEdyb3VwOjptYW5kYXRvcnlNZXNzYWdlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9Tb21fTWFuZGF0b3J5TWVzc2FnZShwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRXhjbEdyb3VwOjptYXhIKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9FeGNsR3JvdXA6Om1heFcoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0V4Y2xHcm91cDo6bWluSChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRXhjbEdyb3VwOjptaW5XKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9FeGNsR3JvdXA6OnByZXNlbmNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0V4Y2xHcm91cDo6cmVsZXZhbnQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRXhjbEdyb3VwOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9FeGNsR3JvdXA6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0V4Y2xHcm91cDo6dmFsaWRhdGlvbk1lc3NhZ2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfU29tX1ZhbGlkYXRpb25NZXNzYWdlKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9FeGNsR3JvdXA6OnZBbGlnbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0V4Y2xHcm91cDo6dyhDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRXhjbEdyb3VwOjp4KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9FeGNsR3JvdXA6OnkoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZXhjbGdyb3VwLmggYi9meGpzL3hmYS9janhfZXhjbGdyb3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk3MmZiYQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9leGNsZ3JvdXAuaApAQCAtMCwwICsxLDU5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0VYQ0xHUk9VUF9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfRVhDTEdST1VQX0hfCisKKyNpbmNsdWRlICJmeGpzL0NKWF9EZWZpbmUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX0V4Y2xHcm91cDsKKworY2xhc3MgQ0pYX0V4Y2xHcm91cCA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfRXhjbEdyb3VwKENYRkFfRXhjbEdyb3VwKiBncm91cCk7CisgIH5DSlhfRXhjbEdyb3VwKCkgb3ZlcnJpZGU7CisKKyAgSlNfTUVUSE9EKGV4ZWNDYWxjdWxhdGUsIENKWF9FeGNsR3JvdXApOworICBKU19NRVRIT0QoZXhlY0V2ZW50LCBDSlhfRXhjbEdyb3VwKTsKKyAgSlNfTUVUSE9EKGV4ZWNJbml0aWFsaXplLCBDSlhfRXhjbEdyb3VwKTsKKyAgSlNfTUVUSE9EKGV4ZWNWYWxpZGF0ZSwgQ0pYX0V4Y2xHcm91cCk7CisgIEpTX01FVEhPRChzZWxlY3RlZE1lbWJlciwgQ0pYX0V4Y2xHcm91cCk7CisKKyAgSlNfUFJPUChkZWZhdWx0VmFsdWUpOyAvKiB7ZGVmYXVsdH0gKi8KKyAgSlNfUFJPUChhY2Nlc3MpOworICBKU19QUk9QKGFjY2Vzc0tleSk7CisgIEpTX1BST1AoYW5jaG9yVHlwZSk7CisgIEpTX1BST1AoYm9yZGVyQ29sb3IpOworICBKU19QUk9QKGJvcmRlcldpZHRoKTsKKyAgSlNfUFJPUChjb2xTcGFuKTsKKyAgSlNfUFJPUChmaWxsQ29sb3IpOworICBKU19QUk9QKGgpOworICBKU19QUk9QKGhBbGlnbik7CisgIEpTX1BST1AobGF5b3V0KTsKKyAgSlNfUFJPUChtYW5kYXRvcnkpOworICBKU19QUk9QKG1hbmRhdG9yeU1lc3NhZ2UpOworICBKU19QUk9QKG1heEgpOworICBKU19QUk9QKG1heFcpOworICBKU19QUk9QKG1pbkgpOworICBKU19QUk9QKG1pblcpOworICBKU19QUk9QKHByZXNlbmNlKTsKKyAgSlNfUFJPUChyYXdWYWx1ZSk7CisgIEpTX1BST1AocmVsZXZhbnQpOworICBKU19QUk9QKHRyYW5zaWVudCk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKKyAgSlNfUFJPUCh2YWxpZGF0aW9uTWVzc2FnZSk7CisgIEpTX1BST1AodkFsaWduKTsKKyAgSlNfUFJPUCh3KTsKKyAgSlNfUFJPUCh4KTsKKyAgSlNfUFJPUCh5KTsKKworIHByaXZhdGU6CisgIHN0YXRpYyBjb25zdCBDSlhfTWV0aG9kU3BlYyBNZXRob2RTcGVjc1tdOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfRVhDTEdST1VQX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZXhkYXRhLmNwcCBiL2Z4anMveGZhL2NqeF9leGRhdGEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZTcyYzQKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZXhkYXRhLmNwcApAQCAtMCwwICsxLDU1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZXhkYXRhLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9leGRhdGEuaCIKKworQ0pYX0V4RGF0YTo6Q0pYX0V4RGF0YShDWEZBX0V4RGF0YSogbm9kZSkgOiBDSlhfQ29udGVudChub2RlKSB7fQorCitDSlhfRXhEYXRhOjp+Q0pYX0V4RGF0YSgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfRXhEYXRhOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9FeERhdGE6OmNvbnRlbnRUeXBlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0V4RGF0YTo6dHJhbnNmZXJFbmNvZGluZyhDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRXhEYXRhOjpkZWZhdWx0VmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9FeERhdGE6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0V4RGF0YTo6bWF4TGVuZ3RoKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRXhEYXRhOjpocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2V4ZGF0YS5oIGIvZnhqcy94ZmEvY2p4X2V4ZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNTlkYTgKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZXhkYXRhLmgKQEAgLTAsMCArMSwyOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9FWERBVEFfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0VYREFUQV9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2NvbnRlbnQuaCIKKworY2xhc3MgQ1hGQV9FeERhdGE7CisKK2NsYXNzIENKWF9FeERhdGEgOiBwdWJsaWMgQ0pYX0NvbnRlbnQgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0V4RGF0YShDWEZBX0V4RGF0YSogbm9kZSk7CisgIH5DSlhfRXhEYXRhKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChkZWZhdWx0VmFsdWUpOyAvKiB7ZGVmYXVsdH0gKi8KKyAgSlNfUFJPUChjb250ZW50VHlwZSk7CisgIEpTX1BST1AoaHJlZik7CisgIEpTX1BST1AobWF4TGVuZ3RoKTsKKyAgSlNfUFJPUCh0cmFuc2ZlckVuY29kaW5nKTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfRVhEQVRBX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZXhlY3V0ZS5jcHAgYi9meGpzL3hmYS9janhfZXhlY3V0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjNGE3NwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9leGVjdXRlLmNwcApAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZXhlY3V0ZS5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhlY3V0ZS5oIgorCitDSlhfRXhlY3V0ZTo6Q0pYX0V4ZWN1dGUoQ1hGQV9FeGVjdXRlKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9FeGVjdXRlOjp+Q0pYX0V4ZWN1dGUoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0V4ZWN1dGU6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRXhlY3V0ZTo6Y29ubmVjdGlvbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9FeGVjdXRlOjpydW5BdChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0V4ZWN1dGU6OmV4ZWN1dGVUeXBlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRXhlY3V0ZTo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2V4ZWN1dGUuaCBiL2Z4anMveGZhL2NqeF9leGVjdXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY3ZjYyOQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9leGVjdXRlLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9FWEVDVVRFX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9FWEVDVVRFX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX0V4ZWN1dGU7CisKK2NsYXNzIENKWF9FeGVjdXRlIDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9FeGVjdXRlKENYRkFfRXhlY3V0ZSogbm9kZSk7CisgIH5DSlhfRXhlY3V0ZSgpIG92ZXJyaWRlOworCisgIEpTX1BST1AoY29ubmVjdGlvbik7CisgIEpTX1BST1AoZXhlY3V0ZVR5cGUpOworICBKU19QUk9QKHJ1bkF0KTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfRVhFQ1VURV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2V4b2JqZWN0LmNwcCBiL2Z4anMveGZhL2NqeF9leG9iamVjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI1MmQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9leG9iamVjdC5jcHAKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2V4b2JqZWN0LmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9leG9iamVjdC5oIgorCitDSlhfRXhPYmplY3Q6OkNKWF9FeE9iamVjdChDWEZBX0V4T2JqZWN0KiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9FeE9iamVjdDo6fkNKWF9FeE9iamVjdCgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfRXhPYmplY3Q6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9FeE9iamVjdDo6Y29kZVR5cGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0V4T2JqZWN0OjphcmNoaXZlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRXhPYmplY3Q6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9FeE9iamVjdDo6Y29kZUJhc2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0V4T2JqZWN0OjpjbGFzc0lkKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9leG9iamVjdC5oIGIvZnhqcy94ZmEvY2p4X2V4b2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZlYzI0YQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9leG9iamVjdC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfRVhPQkpFQ1RfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0VYT0JKRUNUX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX0V4T2JqZWN0OworCitjbGFzcyBDSlhfRXhPYmplY3QgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0V4T2JqZWN0KENYRkFfRXhPYmplY3QqIG5vZGUpOworICB+Q0pYX0V4T2JqZWN0KCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChhcmNoaXZlKTsKKyAgSlNfUFJPUChjbGFzc0lkKTsKKyAgSlNfUFJPUChjb2RlQmFzZSk7CisgIEpTX1BST1AoY29kZVR5cGUpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9FWE9CSkVDVF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2V4dHJhcy5jcHAgYi9meGpzL3hmYS9janhfZXh0cmFzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2VhOGVhCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2V4dHJhcy5jcHAKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2V4dHJhcy5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXh0cmFzLmgiCisKK0NKWF9FeHRyYXM6OkNKWF9FeHRyYXMoQ1hGQV9FeHRyYXMqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX0V4dHJhczo6fkNKWF9FeHRyYXMoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0V4dHJhczo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRXh0cmFzOjp0eXBlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7fQorCit2b2lkIENKWF9FeHRyYXM6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZXh0cmFzLmggYi9meGpzL3hmYS9janhfZXh0cmFzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY1NzkwMwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9leHRyYXMuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0VYVFJBU19IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfRVhUUkFTX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX0V4dHJhczsKKworY2xhc3MgQ0pYX0V4dHJhcyA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfRXh0cmFzKENYRkFfRXh0cmFzKiBub2RlKTsKKyAgfkNKWF9FeHRyYXMoKSBvdmVycmlkZTsKKworICBKU19QUk9QKHR5cGUpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9FWFRSQVNfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9maWVsZC5jcHAgYi9meGpzL3hmYS9janhfZmllbGQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OWM2ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZmllbGQuY3BwCkBAIC0wLDAgKzEsNTMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZmllbGQuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X2RlY2ltYWwuaCIKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV92YWx1ZS5oIgorI2luY2x1ZGUgImZ4anMvanNfcmVzb3VyY2VzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9ldmVudHBhcmFtLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZm5vdGlmeS5oIgorI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmEuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2ZpZWxkLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsdWUuaCIKKworY29uc3QgQ0pYX01ldGhvZFNwZWMgQ0pYX0ZpZWxkOjpNZXRob2RTcGVjc1tdID0geworICAgIHsiYWRkSXRlbSIsIGFkZEl0ZW1fc3RhdGljfSwKKyAgICB7ImJvdW5kSXRlbSIsIGJvdW5kSXRlbV9zdGF0aWN9LAorICAgIHsiY2xlYXJJdGVtcyIsIGNsZWFySXRlbXNfc3RhdGljfSwKKyAgICB7ImRlbGV0ZUl0ZW0iLCBkZWxldGVJdGVtX3N0YXRpY30sCisgICAgeyJleGVjQ2FsY3VsYXRlIiwgZXhlY0NhbGN1bGF0ZV9zdGF0aWN9LAorICAgIHsiZXhlY0V2ZW50IiwgZXhlY0V2ZW50X3N0YXRpY30sCisgICAgeyJleGVjSW5pdGlhbGl6ZSIsIGV4ZWNJbml0aWFsaXplX3N0YXRpY30sCisgICAgeyJleGVjVmFsaWRhdGUiLCBleGVjVmFsaWRhdGVfc3RhdGljfSwKKyAgICB7ImdldERpc3BsYXlJdGVtIiwgZ2V0RGlzcGxheUl0ZW1fc3RhdGljfSwKKyAgICB7ImdldEl0ZW1TdGF0ZSIsIGdldEl0ZW1TdGF0ZV9zdGF0aWN9LAorICAgIHsiZ2V0U2F2ZUl0ZW0iLCBnZXRTYXZlSXRlbV9zdGF0aWN9LAorICAgIHsic2V0SXRlbVN0YXRlIiwgc2V0SXRlbVN0YXRlX3N0YXRpY319OworCitDSlhfRmllbGQ6OkNKWF9GaWVsZChDWEZBX0ZpZWxkKiBmaWVsZCkgOiBDSlhfQ29udGFpbmVyKGZpZWxkKSB7CisgIERlZmluZU1ldGhvZHMoTWV0aG9kU3BlY3MsIEZYX0FycmF5U2l6ZShNZXRob2RTcGVjcykpOworfQorCitDSlhfRmllbGQ6On5DSlhfRmllbGQoKSB7fQorCitDSlNfUmV0dXJuIENKWF9GaWVsZDo6Y2xlYXJJdGVtcygKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5HZXRXaWRnZXRBY2MoKTsKKyAgaWYgKHBXaWRnZXRBY2MpCisgICAgcFdpZGdldEFjYy0+RGVsZXRlSXRlbSgtMSwgdHJ1ZSwgZmFsc2UpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfRmllbGQ6OmV4ZWNFdmVudCgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgV2lkZVN0cmluZyBldmVudFN0cmluZyA9IHJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMF0pOworICBpbnQzMl90IGlSZXQgPQorICAgICAgZXhlY1NpbmdsZUV2ZW50QnlOYW1lKGV2ZW50U3RyaW5nLkFzU3RyaW5nVmlldygpLCBYRkFfRWxlbWVudDo6RmllbGQpOworICBpZiAoZXZlbnRTdHJpbmcgIT0gTCJ2YWxpZGF0ZSIpCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgcmV0dXJuIENKU19SZXR1cm4ocnVudGltZS0+TmV3Qm9vbGVhbihpUmV0ICE9IFhGQV9FVkVOVEVSUk9SX0Vycm9yKSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0ZpZWxkOjpleGVjSW5pdGlhbGl6ZSgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKCFwYXJhbXMuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IEdldERvY3VtZW50KCktPkdldE5vdGlmeSgpOworICBpZiAocE5vdGlmeSkgeworICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KEdldFhGQU5vZGUoKSwgWEZBX0VWRU5UX0luaXRpYWxpemUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgfQorICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfRmllbGQ6OmRlbGV0ZUl0ZW0oCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gVG9Ob2RlKEdldFhGQU9iamVjdCgpKS0+R2V0V2lkZ2V0QWNjKCk7CisgIGlmICghcFdpZGdldEFjYykKKyAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKworICBib29sIGJWYWx1ZSA9IHBXaWRnZXRBY2MtPkRlbGV0ZUl0ZW0ocnVudGltZS0+VG9JbnQzMihwYXJhbXNbMF0pLCB0cnVlLCB0cnVlKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocnVudGltZS0+TmV3Qm9vbGVhbihiVmFsdWUpKTsKK30KKworQ0pTX1JldHVybiBDSlhfRmllbGQ6OmdldFNhdmVJdGVtKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBpbnQzMl90IGlJbmRleCA9IHJ1bnRpbWUtPlRvSW50MzIocGFyYW1zWzBdKTsKKyAgaWYgKGlJbmRleCA8IDApCisgICAgcmV0dXJuIENKU19SZXR1cm4ocnVudGltZS0+TmV3TnVsbCgpKTsKKworICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IFRvTm9kZShHZXRYRkFPYmplY3QoKSktPkdldFdpZGdldEFjYygpOworICBpZiAoIXBXaWRnZXRBY2MpCisgICAgcmV0dXJuIENKU19SZXR1cm4ocnVudGltZS0+TmV3TnVsbCgpKTsKKworICBPcHRpb25hbDxXaWRlU3RyaW5nPiB2YWx1ZSA9IHBXaWRnZXRBY2MtPkdldENob2ljZUxpc3RJdGVtKGlJbmRleCwgdHJ1ZSk7CisgIGlmICghdmFsdWUpCisgICAgcmV0dXJuIENKU19SZXR1cm4ocnVudGltZS0+TmV3TnVsbCgpKTsKKworICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdTdHJpbmcodmFsdWUtPlVURjhFbmNvZGUoKS5Bc1N0cmluZ1ZpZXcoKSkpOworfQorCitDSlNfUmV0dXJuIENKWF9GaWVsZDo6Ym91bmRJdGVtKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IFRvTm9kZShHZXRYRkFPYmplY3QoKSktPkdldFdpZGdldEFjYygpOworICBpZiAoIXBXaWRnZXRBY2MpCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgV2lkZVN0cmluZyB2YWx1ZSA9IHJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMF0pOworICBXaWRlU3RyaW5nIGJvdW5kVmFsdWUgPSBwV2lkZ2V0QWNjLT5HZXRJdGVtVmFsdWUodmFsdWUuQXNTdHJpbmdWaWV3KCkpOworICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdTdHJpbmcoYm91bmRWYWx1ZS5VVEY4RW5jb2RlKCkuQXNTdHJpbmdWaWV3KCkpKTsKK30KKworQ0pTX1JldHVybiBDSlhfRmllbGQ6OmdldEl0ZW1TdGF0ZSgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5HZXRXaWRnZXRBY2MoKTsKKyAgaWYgKCFwV2lkZ2V0QWNjKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIGludDMyX3Qgc3RhdGUgPSBwV2lkZ2V0QWNjLT5HZXRJdGVtU3RhdGUocnVudGltZS0+VG9JbnQzMihwYXJhbXNbMF0pKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocnVudGltZS0+TmV3Qm9vbGVhbihzdGF0ZSAhPSAwKSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0ZpZWxkOjpleGVjQ2FsY3VsYXRlKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIXBhcmFtcy5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gR2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCk7CisgIGlmIChwTm90aWZ5KSB7CisgICAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QoR2V0WEZBTm9kZSgpLCBYRkFfRVZFTlRfQ2FsY3VsYXRlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIH0KKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0ZpZWxkOjpnZXREaXNwbGF5SXRlbSgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgaW50MzJfdCBpSW5kZXggPSBydW50aW1lLT5Ub0ludDMyKHBhcmFtc1swXSk7CisgIGlmIChpSW5kZXggPCAwKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld051bGwoKSk7CisKKyAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5HZXRXaWRnZXRBY2MoKTsKKyAgaWYgKCFwV2lkZ2V0QWNjKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld051bGwoKSk7CisKKyAgT3B0aW9uYWw8V2lkZVN0cmluZz4gdmFsdWUgPSBwV2lkZ2V0QWNjLT5HZXRDaG9pY2VMaXN0SXRlbShpSW5kZXgsIGZhbHNlKTsKKyAgaWYgKCF2YWx1ZSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdOdWxsKCkpOworCisgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld1N0cmluZyh2YWx1ZS0+VVRGOEVuY29kZSgpLkFzU3RyaW5nVmlldygpKSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0ZpZWxkOjpzZXRJdGVtU3RhdGUoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gVG9Ob2RlKEdldFhGQU9iamVjdCgpKS0+R2V0V2lkZ2V0QWNjKCk7CisgIGlmICghcFdpZGdldEFjYykKKyAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKworICBpbnQzMl90IGlJbmRleCA9IHJ1bnRpbWUtPlRvSW50MzIocGFyYW1zWzBdKTsKKyAgaWYgKHJ1bnRpbWUtPlRvSW50MzIocGFyYW1zWzFdKSAhPSAwKSB7CisgICAgcFdpZGdldEFjYy0+U2V0SXRlbVN0YXRlKGlJbmRleCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisgIH0KKyAgaWYgKHBXaWRnZXRBY2MtPkdldEl0ZW1TdGF0ZShpSW5kZXgpKQorICAgIHBXaWRnZXRBY2MtPlNldEl0ZW1TdGF0ZShpSW5kZXgsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlKTsKKworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfRmllbGQ6OmFkZEl0ZW0oQ0pTX1Y4KiBydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSAmJiBwYXJhbXMuc2l6ZSgpICE9IDIpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gVG9Ob2RlKEdldFhGQU9iamVjdCgpKS0+R2V0V2lkZ2V0QWNjKCk7CisgIGlmICghcFdpZGdldEFjYykKKyAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKworICBXaWRlU3RyaW5nIGxhYmVsOworICBpZiAocGFyYW1zLnNpemUoKSA+PSAxKQorICAgIGxhYmVsID0gcnVudGltZS0+VG9XaWRlU3RyaW5nKHBhcmFtc1swXSk7CisKKyAgV2lkZVN0cmluZyB2YWx1ZTsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMikKKyAgICB2YWx1ZSA9IHJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMV0pOworCisgIHBXaWRnZXRBY2MtPkluc2VydEl0ZW0obGFiZWwsIHZhbHVlLCB0cnVlKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0ZpZWxkOjpleGVjVmFsaWRhdGUoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmICghcGFyYW1zLmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBHZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKKyAgaWYgKCFwTm90aWZ5KQorICAgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld0Jvb2xlYW4oZmFsc2UpKTsKKworICBpbnQzMl90IGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdChHZXRYRkFOb2RlKCksIFhGQV9FVkVOVF9WYWxpZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocnVudGltZS0+TmV3Qm9vbGVhbihpUmV0ICE9IFhGQV9FVkVOVEVSUk9SX0Vycm9yKSk7Cit9CisKK3ZvaWQgQ0pYX0ZpZWxkOjpkZWZhdWx0VmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBDWEZBX05vZGUqIHhmYU5vZGUgPSBHZXRYRkFOb2RlKCk7CisgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0geGZhTm9kZS0+R2V0V2lkZ2V0QWNjKCk7CisgIGlmICghcFdpZGdldEFjYykKKyAgICByZXR1cm47CisKKyAgaWYgKGJTZXR0aW5nKSB7CisgICAgaWYgKHBWYWx1ZSkgeworICAgICAgcFdpZGdldEFjYy0+U2V0UHJlTnVsbChwV2lkZ2V0QWNjLT5Jc051bGwoKSk7CisgICAgICBwV2lkZ2V0QWNjLT5TZXRJc051bGwocFZhbHVlLT5Jc051bGwoKSk7CisgICAgfQorCisgICAgV2lkZVN0cmluZyB3c05ld1RleHQ7CisgICAgaWYgKHBWYWx1ZSAmJiAhKHBWYWx1ZS0+SXNOdWxsKCkgfHwgcFZhbHVlLT5Jc1VuZGVmaW5lZCgpKSkKKyAgICAgIHdzTmV3VGV4dCA9IHBWYWx1ZS0+VG9XaWRlU3RyaW5nKCk7CisKKyAgICBDWEZBX05vZGUqIHBVSUNoaWxkID0gcFdpZGdldEFjYy0+R2V0VUlDaGlsZCgpOworICAgIGlmIChwVUlDaGlsZC0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6TnVtZXJpY0VkaXQpIHsKKyAgICAgIHdzTmV3VGV4dCA9IHBXaWRnZXRBY2MtPk51bWVyaWNMaW1pdCgKKyAgICAgICAgICB3c05ld1RleHQsIHBXaWRnZXRBY2MtPkdldExlYWREaWdpdHMoKSwgcFdpZGdldEFjYy0+R2V0RnJhY0RpZ2l0cygpKTsKKyAgICB9CisKKyAgICBDWEZBX1dpZGdldEFjYyogcENvbnRhaW5lcldpZGdldEFjYyA9IHhmYU5vZGUtPkdldENvbnRhaW5lcldpZGdldEFjYygpOworICAgIFdpZGVTdHJpbmcgd3NGb3JtYXRUZXh0KHdzTmV3VGV4dCk7CisgICAgaWYgKHBDb250YWluZXJXaWRnZXRBY2MpCisgICAgICB3c0Zvcm1hdFRleHQgPSBwQ29udGFpbmVyV2lkZ2V0QWNjLT5HZXRGb3JtYXREYXRhVmFsdWUod3NOZXdUZXh0KTsKKworICAgIFNldENvbnRlbnQod3NOZXdUZXh0LCB3c0Zvcm1hdFRleHQsIHRydWUsIHRydWUsIHRydWUpOworICAgIHJldHVybjsKKyAgfQorCisgIFdpZGVTdHJpbmcgY29udGVudCA9IEdldENvbnRlbnQodHJ1ZSk7CisgIGlmIChjb250ZW50LklzRW1wdHkoKSkgeworICAgIHBWYWx1ZS0+U2V0TnVsbCgpOworICAgIHJldHVybjsKKyAgfQorCisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBwV2lkZ2V0QWNjLT5HZXRVSUNoaWxkKCk7CisgIENYRkFfTm9kZSogZm9ybVZhbHVlID0geGZhTm9kZS0+R2V0Rm9ybVZhbHVlSWZFeGlzdHMoKTsKKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IGZvcm1WYWx1ZSA/IGZvcm1WYWx1ZS0+R2V0Rmlyc3RDaGlsZCgpIDogbnVsbHB0cjsKKyAgaWYgKHBOb2RlICYmIHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpEZWNpbWFsKSB7CisgICAgaWYgKHBVSUNoaWxkLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpOdW1lcmljRWRpdCAmJgorICAgICAgICAocE5vZGUtPkpTT2JqZWN0KCktPkdldEludGVnZXIoWEZBX0F0dHJpYnV0ZTo6RnJhY0RpZ2l0cykgPT0gLTEpKSB7CisgICAgICBwVmFsdWUtPlNldFN0cmluZyhjb250ZW50LlVURjhFbmNvZGUoKS5Bc1N0cmluZ1ZpZXcoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENGWF9EZWNpbWFsIGRlY2ltYWwoY29udGVudC5Bc1N0cmluZ1ZpZXcoKSk7CisgICAgICBwVmFsdWUtPlNldEZsb2F0KChmbG9hdCkoZG91YmxlKWRlY2ltYWwpOworICAgIH0KKyAgfSBlbHNlIGlmIChwTm9kZSAmJiBwTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6SW50ZWdlcikgeworICAgIHBWYWx1ZS0+U2V0SW50ZWdlcihGWFNZU193dG9pKGNvbnRlbnQuY19zdHIoKSkpOworICB9IGVsc2UgaWYgKHBOb2RlICYmIHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpCb29sZWFuKSB7CisgICAgcFZhbHVlLT5TZXRCb29sZWFuKEZYU1lTX3d0b2koY29udGVudC5jX3N0cigpKSA9PSAwID8gZmFsc2UgOiB0cnVlKTsKKyAgfSBlbHNlIGlmIChwTm9kZSAmJiBwTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6RmxvYXQpIHsKKyAgICBDRlhfRGVjaW1hbCBkZWNpbWFsKGNvbnRlbnQuQXNTdHJpbmdWaWV3KCkpOworICAgIHBWYWx1ZS0+U2V0RmxvYXQoKGZsb2F0KShkb3VibGUpZGVjaW1hbCk7CisgIH0gZWxzZSB7CisgICAgcFZhbHVlLT5TZXRTdHJpbmcoY29udGVudC5VVEY4RW5jb2RlKCkuQXNTdHJpbmdWaWV3KCkpOworICB9Cit9CisKK3ZvaWQgQ0pYX0ZpZWxkOjplZGl0VmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IEdldFhGQU5vZGUoKS0+R2V0V2lkZ2V0QWNjKCk7CisgIGlmICghcFdpZGdldEFjYykKKyAgICByZXR1cm47CisKKyAgaWYgKGJTZXR0aW5nKSB7CisgICAgcFdpZGdldEFjYy0+U2V0VmFsdWUoWEZBX1ZBTFVFUElDVFVSRV9FZGl0LCBwVmFsdWUtPlRvV2lkZVN0cmluZygpKTsKKyAgICByZXR1cm47CisgIH0KKyAgcFZhbHVlLT5TZXRTdHJpbmcoCisgICAgICBwV2lkZ2V0QWNjLT5HZXRWYWx1ZShYRkFfVkFMVUVQSUNUVVJFX0VkaXQpLlVURjhFbmNvZGUoKS5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKK3ZvaWQgQ0pYX0ZpZWxkOjpmb3JtYXRNZXNzYWdlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfU29tX01lc3NhZ2UocFZhbHVlLCBiU2V0dGluZywgWEZBX1NPTV9Gb3JtYXRNZXNzYWdlKTsKK30KKwordm9pZCBDSlhfRmllbGQ6OmZvcm1hdHRlZFZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gR2V0WEZBTm9kZSgpLT5HZXRXaWRnZXRBY2MoKTsKKyAgaWYgKCFwV2lkZ2V0QWNjKQorICAgIHJldHVybjsKKworICBpZiAoYlNldHRpbmcpIHsKKyAgICBwV2lkZ2V0QWNjLT5TZXRWYWx1ZShYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXksIHBWYWx1ZS0+VG9XaWRlU3RyaW5nKCkpOworICAgIHJldHVybjsKKyAgfQorICBwVmFsdWUtPlNldFN0cmluZyhwV2lkZ2V0QWNjLT5HZXRWYWx1ZShYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpCisgICAgICAgICAgICAgICAgICAgICAgICAuVVRGOEVuY29kZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuQXNTdHJpbmdWaWV3KCkpOworfQorCit2b2lkIENKWF9GaWVsZDo6cGFyZW50U3ViZm9ybShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgaWYgKGJTZXR0aW5nKSB7CisgICAgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKTsKKyAgICByZXR1cm47CisgIH0KKyAgcFZhbHVlLT5TZXROdWxsKCk7Cit9CisKK3ZvaWQgQ0pYX0ZpZWxkOjpzZWxlY3RlZEluZGV4KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IEdldFhGQU5vZGUoKS0+R2V0V2lkZ2V0QWNjKCk7CisgIGlmICghcFdpZGdldEFjYykKKyAgICByZXR1cm47CisKKyAgaWYgKCFiU2V0dGluZykgeworICAgIHBWYWx1ZS0+U2V0SW50ZWdlcihwV2lkZ2V0QWNjLT5HZXRTZWxlY3RlZEl0ZW0oMCkpOworICAgIHJldHVybjsKKyAgfQorCisgIGludDMyX3QgaUluZGV4ID0gcFZhbHVlLT5Ub0ludGVnZXIoKTsKKyAgaWYgKGlJbmRleCA9PSAtMSkgeworICAgIHBXaWRnZXRBY2MtPkNsZWFyQWxsU2VsZWN0aW9ucygpOworICAgIHJldHVybjsKKyAgfQorCisgIHBXaWRnZXRBY2MtPlNldEl0ZW1TdGF0ZShpSW5kZXgsIHRydWUsIHRydWUsIHRydWUsIHRydWUpOworfQorCit2b2lkIENKWF9GaWVsZDo6YWNjZXNzKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ZpZWxkOjphY2Nlc3NLZXkoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRmllbGQ6OmFuY2hvclR5cGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9GaWVsZDo6Ym9yZGVyQ29sb3IoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X1NvbV9Cb3JkZXJDb2xvcihwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRmllbGQ6OmJvcmRlcldpZHRoKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9Tb21fQm9yZGVyV2lkdGgocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ZpZWxkOjpjb2xTcGFuKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRmllbGQ6OmZpbGxDb2xvcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9Tb21fRmlsbENvbG9yKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9GaWVsZDo6Zm9udENvbG9yKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X1NvbV9Gb250Q29sb3IocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ZpZWxkOjpoKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRmllbGQ6OmhBbGlnbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9GaWVsZDo6bG9jYWxlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ZpZWxkOjptYW5kYXRvcnkoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfU29tX01hbmRhdG9yeShwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRmllbGQ6Om1hbmRhdG9yeU1lc3NhZ2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9Tb21fTWFuZGF0b3J5TWVzc2FnZShwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRmllbGQ6Om1heEgoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9GaWVsZDo6bWF4VyhDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ZpZWxkOjptaW5IKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRmllbGQ6Om1pblcoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9GaWVsZDo6cHJlc2VuY2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ZpZWxkOjpyYXdWYWx1ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBkZWZhdWx0VmFsdWUocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ZpZWxkOjpyZWxldmFudChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRmllbGQ6OnJvdGF0ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9GaWVsZDo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ZpZWxkOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRmllbGQ6OnZhbGlkYXRpb25NZXNzYWdlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9Tb21fVmFsaWRhdGlvbk1lc3NhZ2UocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ZpZWxkOjp2QWxpZ24oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRmllbGQ6OncoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9GaWVsZDo6eChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ZpZWxkOjp5KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9maWVsZC5oIGIvZnhqcy94ZmEvY2p4X2ZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3MjM4ZgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9maWVsZC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfRklFTERfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0ZJRUxEX0hfCisKKyNpbmNsdWRlICJmeGpzL0NKWF9EZWZpbmUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfY29udGFpbmVyLmgiCisKK2NsYXNzIENYRkFfRmllbGQ7CisKK2NsYXNzIENKWF9GaWVsZCA6IHB1YmxpYyBDSlhfQ29udGFpbmVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9GaWVsZChDWEZBX0ZpZWxkKiBmaWVsZCk7CisgIH5DSlhfRmllbGQoKSBvdmVycmlkZTsKKworICBKU19NRVRIT0QoYWRkSXRlbSwgQ0pYX0ZpZWxkKTsKKyAgSlNfTUVUSE9EKGJvdW5kSXRlbSwgQ0pYX0ZpZWxkKTsKKyAgSlNfTUVUSE9EKGNsZWFySXRlbXMsIENKWF9GaWVsZCk7CisgIEpTX01FVEhPRChkZWxldGVJdGVtLCBDSlhfRmllbGQpOworICBKU19NRVRIT0QoZXhlY0NhbGN1bGF0ZSwgQ0pYX0ZpZWxkKTsKKyAgSlNfTUVUSE9EKGV4ZWNFdmVudCwgQ0pYX0ZpZWxkKTsKKyAgSlNfTUVUSE9EKGV4ZWNJbml0aWFsaXplLCBDSlhfRmllbGQpOworICBKU19NRVRIT0QoZXhlY1ZhbGlkYXRlLCBDSlhfRmllbGQpOworICBKU19NRVRIT0QoZ2V0RGlzcGxheUl0ZW0sIENKWF9GaWVsZCk7CisgIEpTX01FVEhPRChnZXRJdGVtU3RhdGUsIENKWF9GaWVsZCk7CisgIEpTX01FVEhPRChnZXRTYXZlSXRlbSwgQ0pYX0ZpZWxkKTsKKyAgSlNfTUVUSE9EKHNldEl0ZW1TdGF0ZSwgQ0pYX0ZpZWxkKTsKKworICBKU19QUk9QKGRlZmF1bHRWYWx1ZSk7IC8qIHtkZWZhdWx0fSAqLworICBKU19QUk9QKGFjY2Vzcyk7CisgIEpTX1BST1AoYWNjZXNzS2V5KTsKKyAgSlNfUFJPUChhbmNob3JUeXBlKTsKKyAgSlNfUFJPUChib3JkZXJDb2xvcik7CisgIEpTX1BST1AoYm9yZGVyV2lkdGgpOworICBKU19QUk9QKGNvbFNwYW4pOworICBKU19QUk9QKGVkaXRWYWx1ZSk7CisgIEpTX1BST1AoZmlsbENvbG9yKTsKKyAgSlNfUFJPUChmb250Q29sb3IpOworICBKU19QUk9QKGZvcm1hdE1lc3NhZ2UpOworICBKU19QUk9QKGZvcm1hdHRlZFZhbHVlKTsKKyAgSlNfUFJPUChoKTsKKyAgSlNfUFJPUChoQWxpZ24pOworICBKU19QUk9QKGxvY2FsZSk7CisgIEpTX1BST1AobWFuZGF0b3J5KTsKKyAgSlNfUFJPUChtYW5kYXRvcnlNZXNzYWdlKTsKKyAgSlNfUFJPUChtYXhIKTsKKyAgSlNfUFJPUChtYXhXKTsKKyAgSlNfUFJPUChtaW5IKTsKKyAgSlNfUFJPUChtaW5XKTsKKyAgSlNfUFJPUChwYXJlbnRTdWJmb3JtKTsKKyAgSlNfUFJPUChwcmVzZW5jZSk7CisgIEpTX1BST1AocmF3VmFsdWUpOworICBKU19QUk9QKHJlbGV2YW50KTsKKyAgSlNfUFJPUChyb3RhdGUpOworICBKU19QUk9QKHNlbGVjdGVkSW5kZXgpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7CisgIEpTX1BST1AodmFsaWRhdGlvbk1lc3NhZ2UpOworICBKU19QUk9QKHZBbGlnbik7CisgIEpTX1BST1Aodyk7CisgIEpTX1BST1AoeCk7CisgIEpTX1BST1AoeSk7CisKKyBwcml2YXRlOgorICBzdGF0aWMgY29uc3QgQ0pYX01ldGhvZFNwZWMgTWV0aG9kU3BlY3NbXTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0ZJRUxEX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZmlsbC5jcHAgYi9meGpzL3hmYS9janhfZmlsbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM2YWE5NQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9maWxsLmNwcApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZmlsbC5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmlsbC5oIgorCitDSlhfRmlsbDo6Q0pYX0ZpbGwoQ1hGQV9GaWxsKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9GaWxsOjp+Q0pYX0ZpbGwoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0ZpbGw6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRmlsbDo6cHJlc2VuY2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9GaWxsOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZmlsbC5oIGIvZnhqcy94ZmEvY2p4X2ZpbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjllM2NjCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2ZpbGwuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0ZJTExfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0ZJTExfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfRmlsbDsKKworY2xhc3MgQ0pYX0ZpbGwgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0ZpbGwoQ1hGQV9GaWxsKiBub2RlKTsKKyAgfkNKWF9GaWxsKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChwcmVzZW5jZSk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0ZJTExfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9maWx0ZXIuY3BwIGIvZnhqcy94ZmEvY2p4X2ZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQzZGZhOAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9maWx0ZXIuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9maWx0ZXIuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2ZpbHRlci5oIgorCitDSlhfRmlsdGVyOjpDSlhfRmlsdGVyKENYRkFfRmlsdGVyKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9GaWx0ZXI6On5DSlhfRmlsdGVyKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9GaWx0ZXI6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ZpbHRlcjo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRmlsdGVyOjphZGRSZXZvY2F0aW9uSW5mbyhDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2ZpbHRlci5oIGIvZnhqcy94ZmEvY2p4X2ZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NWQ1MDkKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZmlsdGVyLmgKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9GSUxURVJfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0ZJTFRFUl9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9GaWx0ZXI7CisKK2NsYXNzIENKWF9GaWx0ZXIgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0ZpbHRlcihDWEZBX0ZpbHRlciogbm9kZSk7CisgIH5DSlhfRmlsdGVyKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChhZGRSZXZvY2F0aW9uSW5mbyk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0ZJTFRFUl9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2Zsb2F0LmNwcCBiL2Z4anMveGZhL2NqeF9mbG9hdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ4MDgxMgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9mbG9hdC5jcHAKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2Zsb2F0LmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9mbG9hdC5oIgorCitDSlhfRmxvYXQ6OkNKWF9GbG9hdChDWEZBX0Zsb2F0KiBub2RlKSA6IENKWF9Db250ZW50KG5vZGUpIHt9CisKK0NKWF9GbG9hdDo6fkNKWF9GbG9hdCgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfRmxvYXQ6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9GbG9hdDo6ZGVmYXVsdFZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0Zsb2F0Ojp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRmxvYXQ6OnZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIGRlZmF1bHRWYWx1ZShwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9mbG9hdC5oIGIvZnhqcy94ZmEvY2p4X2Zsb2F0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5NDg5YgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9mbG9hdC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfRkxPQVRfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0ZMT0FUX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfY29udGVudC5oIgorCitjbGFzcyBDWEZBX0Zsb2F0OworCitjbGFzcyBDSlhfRmxvYXQgOiBwdWJsaWMgQ0pYX0NvbnRlbnQgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0Zsb2F0KENYRkFfRmxvYXQqIG5vZGUpOworICB+Q0pYX0Zsb2F0KCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChkZWZhdWx0VmFsdWUpOyAvKiB7ZGVmYXVsdH0gKi8KKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworICBKU19QUk9QKHZhbHVlKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0ZMT0FUX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfZm9udC5jcHAgYi9meGpzL3hmYS9janhfZm9udC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBjNjIzNwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9mb250LmNwcApAQCAtMCwwICsxLDExNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2ZvbnQuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2ZvbnQuaCIKKworQ0pYX0ZvbnQ6OkNKWF9Gb250KENYRkFfRm9udCogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfRm9udDo6fkNKWF9Gb250KCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9Gb250OjpsaW5lVGhyb3VnaChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ZvbnQ6OnR5cGVmYWNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRm9udDo6Zm9udEhvcml6b250YWxTY2FsZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Gb250Ojp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ZvbnQ6Omtlcm5pbmdNb2RlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRm9udDo6dW5kZXJsaW5lKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Gb250OjpiYXNlbGluZVNoaWZ0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ZvbnQ6Om92ZXJsaW5lUGVyaW9kKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRm9udDo6bGV0dGVyU3BhY2luZyhDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Gb250OjpsaW5lVGhyb3VnaFBlcmlvZChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ZvbnQ6OmZvbnRWZXJ0aWNhbFNjYWxlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRm9udDo6c2l6ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Gb250Ojpwb3N0dXJlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ZvbnQ6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfRm9udDo6d2VpZ2h0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Gb250Ojp1bmRlcmxpbmVQZXJpb2QoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ZvbnQ6Om92ZXJsaW5lKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9mb250LmggYi9meGpzL3hmYS9janhfZm9udC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YjQwZTQKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZm9udC5oCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfRk9OVF9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfRk9OVF9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9Gb250OworCitjbGFzcyBDSlhfRm9udCA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfRm9udChDWEZBX0ZvbnQqIG5vZGUpOworICB+Q0pYX0ZvbnQoKSBvdmVycmlkZTsKKworICBKU19QUk9QKGJhc2VsaW5lU2hpZnQpOworICBKU19QUk9QKGZvbnRIb3Jpem9udGFsU2NhbGUpOworICBKU19QUk9QKGZvbnRWZXJ0aWNhbFNjYWxlKTsKKyAgSlNfUFJPUChrZXJuaW5nTW9kZSk7CisgIEpTX1BST1AobGV0dGVyU3BhY2luZyk7CisgIEpTX1BST1AobGluZVRocm91Z2gpOworICBKU19QUk9QKGxpbmVUaHJvdWdoUGVyaW9kKTsKKyAgSlNfUFJPUChvdmVybGluZSk7CisgIEpTX1BST1Aob3ZlcmxpbmVQZXJpb2QpOworICBKU19QUk9QKHBvc3R1cmUpOworICBKU19QUk9QKHNpemUpOworICBKU19QUk9QKHR5cGVmYWNlKTsKKyAgSlNfUFJPUCh1bmRlcmxpbmUpOworICBKU19QUk9QKHVuZGVybGluZVBlcmlvZCk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKKyAgSlNfUFJPUCh3ZWlnaHQpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfRk9OVF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2Zvcm0uY3BwIGIvZnhqcy94ZmEvY2p4X2Zvcm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZjA2ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZm9ybS5jcHAKQEAgLTAsMCArMSwxMjMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9mb3JtLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV9lbmdpbmUuaCIKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV92YWx1ZS5oIgorI2luY2x1ZGUgImZ4anMvanNfcmVzb3VyY2VzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9ldmVudHBhcmFtLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZm5vdGlmeS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2FycmF5bm9kZWxpc3QuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2Zvcm0uaCIKKworY29uc3QgQ0pYX01ldGhvZFNwZWMgQ0pYX0Zvcm06Ok1ldGhvZFNwZWNzW10gPSB7CisgICAgeyJleGVjQ2FsY3VsYXRlIiwgZXhlY0NhbGN1bGF0ZV9zdGF0aWN9LAorICAgIHsiZXhlY0luaXRpYWxpemUiLCBleGVjSW5pdGlhbGl6ZV9zdGF0aWN9LAorICAgIHsiZXhlY1ZhbGlkYXRlIiwgZXhlY1ZhbGlkYXRlX3N0YXRpY30sCisgICAgeyJmb3JtTm9kZXMiLCBmb3JtTm9kZXNfc3RhdGljfSwKKyAgICB7InJlY2FsY3VsYXRlIiwgcmVjYWxjdWxhdGVfc3RhdGljfSwKKyAgICB7InJlbWVyZ2UiLCByZW1lcmdlX3N0YXRpY319OworCitDSlhfRm9ybTo6Q0pYX0Zvcm0oQ1hGQV9Gb3JtKiBmb3JtKSA6IENKWF9Nb2RlbChmb3JtKSB7CisgIERlZmluZU1ldGhvZHMoTWV0aG9kU3BlY3MsIEZYX0FycmF5U2l6ZShNZXRob2RTcGVjcykpOworfQorCitDSlhfRm9ybTo6fkNKWF9Gb3JtKCkge30KKworQ0pTX1JldHVybiBDSlhfRm9ybTo6Zm9ybU5vZGVzKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IFRvTm9kZShydW50aW1lLT5Ub1hGQU9iamVjdChwYXJhbXNbMF0pKTsKKyAgaWYgKCFwRGF0YU5vZGUpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprVmFsdWVFcnJvcikpOworCisgIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+IGZvcm1JdGVtczsKKyAgQ1hGQV9BcnJheU5vZGVMaXN0KiBwRm9ybU5vZGVzID0gbmV3IENYRkFfQXJyYXlOb2RlTGlzdChHZXREb2N1bWVudCgpKTsKKyAgcEZvcm1Ob2Rlcy0+U2V0QXJyYXlOb2RlTGlzdChmb3JtSXRlbXMpOworCisgIENGWEpTRV9WYWx1ZSogdmFsdWUgPQorICAgICAgR2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwRm9ybU5vZGVzKTsKKyAgaWYgKCF2YWx1ZSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdOdWxsKCkpOworICByZXR1cm4gQ0pTX1JldHVybih2YWx1ZS0+RGlyZWN0R2V0VmFsdWUoKS5HZXQocnVudGltZS0+R2V0SXNvbGF0ZSgpKSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0Zvcm06OnJlbWVyZ2UoQ0pTX1Y4KiBydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIXBhcmFtcy5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBHZXREb2N1bWVudCgpLT5Eb0RhdGFSZW1lcmdlKHRydWUpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfRm9ybTo6ZXhlY0luaXRpYWxpemUoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmICghcGFyYW1zLmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBHZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKKyAgaWYgKHBOb3RpZnkpCisgICAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QoR2V0WEZBTm9kZSgpLCBYRkFfRVZFTlRfSW5pdGlhbGl6ZSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIENKWF9Gb3JtOjpyZWNhbGN1bGF0ZSgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSA9CisgICAgICBHZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEV2ZW50UGFyYW0oKTsKKyAgaWYgKHBFdmVudFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9DYWxjdWxhdGUgfHwKKyAgICAgIHBFdmVudFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9Jbml0Q2FsY3VsYXRlKSB7CisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisgIH0KKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IEdldERvY3VtZW50KCktPkdldE5vdGlmeSgpOworICBpZiAoIXBOb3RpZnkgfHwgcnVudGltZS0+VG9JbnQzMihwYXJhbXNbMF0pICE9IDApCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QoR2V0WEZBTm9kZSgpLCBYRkFfRVZFTlRfQ2FsY3VsYXRlKTsKKyAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QoR2V0WEZBTm9kZSgpLCBYRkFfRVZFTlRfVmFsaWRhdGUpOworICBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdChHZXRYRkFOb2RlKCksIFhGQV9FVkVOVF9SZWFkeSwgdHJ1ZSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIENKWF9Gb3JtOjpleGVjQ2FsY3VsYXRlKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIXBhcmFtcy5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gR2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCk7CisgIGlmIChwTm90aWZ5KQorICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KEdldFhGQU5vZGUoKSwgWEZBX0VWRU5UX0NhbGN1bGF0ZSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIENKWF9Gb3JtOjpleGVjVmFsaWRhdGUoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDApCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBHZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKKyAgaWYgKCFwTm90aWZ5KQorICAgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld0Jvb2xlYW4oZmFsc2UpKTsKKworICBpbnQzMl90IGlSZXQgPQorICAgICAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QoR2V0WEZBTm9kZSgpLCBYRkFfRVZFTlRfVmFsaWRhdGUpOworICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdCb29sZWFuKGlSZXQgIT0gWEZBX0VWRU5URVJST1JfRXJyb3IpKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9mb3JtLmggYi9meGpzL3hmYS9janhfZm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZDY0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfZm9ybS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfRk9STV9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfRk9STV9IXworCisjaW5jbHVkZSAiZnhqcy9DSlhfRGVmaW5lLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X21vZGVsLmgiCisKK2NsYXNzIENYRkFfRm9ybTsKKworY2xhc3MgQ0pYX0Zvcm0gOiBwdWJsaWMgQ0pYX01vZGVsIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9Gb3JtKENYRkFfRm9ybSogZm9ybSk7CisgIH5DSlhfRm9ybSgpIG92ZXJyaWRlOworCisgIEpTX01FVEhPRChleGVjQ2FsY3VsYXRlLCBDSlhfRm9ybSk7CisgIEpTX01FVEhPRChleGVjSW5pdGlhbGl6ZSwgQ0pYX0Zvcm0pOworICBKU19NRVRIT0QoZXhlY1ZhbGlkYXRlLCBDSlhfRm9ybSk7CisgIEpTX01FVEhPRChmb3JtTm9kZXMsIENKWF9Gb3JtKTsKKyAgSlNfTUVUSE9EKHJlY2FsY3VsYXRlLCBDSlhfRm9ybSk7CisgIEpTX01FVEhPRChyZW1lcmdlLCBDSlhfRm9ybSk7CisKKyBwcml2YXRlOgorICBzdGF0aWMgY29uc3QgQ0pYX01ldGhvZFNwZWMgTWV0aG9kU3BlY3NbXTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0ZPUk1fSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9mb3JtYXQuY3BwIGIvZnhqcy94ZmEvY2p4X2Zvcm1hdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc4NjUwMgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9mb3JtYXQuY3BwCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9mb3JtYXQuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2Zvcm1hdC5oIgorCitDSlhfRm9ybWF0OjpDSlhfRm9ybWF0KENYRkFfRm9ybWF0KiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9Gb3JtYXQ6On5DSlhfRm9ybWF0KCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9Gb3JtYXQ6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0Zvcm1hdDo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9mb3JtYXQuaCBiL2Z4anMveGZhL2NqeF9mb3JtYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZThjOTcxCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2Zvcm1hdC5oCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfRk9STUFUX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9GT1JNQVRfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfRm9ybWF0OworCitjbGFzcyBDSlhfRm9ybWF0IDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9Gb3JtYXQoQ1hGQV9Gb3JtYXQqIG5vZGUpOworICB+Q0pYX0Zvcm1hdCgpIG92ZXJyaWRlOworCisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0ZPUk1BVF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2hhbmRsZXIuY3BwIGIvZnhqcy94ZmEvY2p4X2hhbmRsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMDlhNzUKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfaGFuZGxlci5jcHAKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2hhbmRsZXIuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2hhbmRsZXIuaCIKKworQ0pYX0hhbmRsZXI6OkNKWF9IYW5kbGVyKENYRkFfSGFuZGxlciogbm9kZSkgOiBDSlhfVGV4dE5vZGUobm9kZSkge30KKworQ0pYX0hhbmRsZXI6On5DSlhfSGFuZGxlcigpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfSGFuZGxlcjo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9IYW5kbGVyOjp0eXBlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0hhbmRsZXI6OnZlcnNpb24oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkge30KKwordm9pZCBDSlhfSGFuZGxlcjo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2hhbmRsZXIuaCBiL2Z4anMveGZhL2NqeF9oYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzczMzI4YgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9oYW5kbGVyLmgKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9IQU5ETEVSX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9IQU5ETEVSX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdGV4dG5vZGUuaCIKKworY2xhc3MgQ1hGQV9IYW5kbGVyOworCitjbGFzcyBDSlhfSGFuZGxlciA6IHB1YmxpYyBDSlhfVGV4dE5vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0hhbmRsZXIoQ1hGQV9IYW5kbGVyKiBub2RlKTsKKyAgfkNKWF9IYW5kbGVyKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUCh0eXBlKTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHZlcnNpb24pOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfSEFORExFUl9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2hvc3Rwc2V1ZG9tb2RlbC5jcHAgYi9meGpzL3hmYS9janhfaG9zdHBzZXVkb21vZGVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmFhMmJkCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2hvc3Rwc2V1ZG9tb2RlbC5jcHAKQEAgLTAsMCArMSw2MzggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ob3N0cHNldWRvbW9kZWwuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV9lbmdpbmUuaCIKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV92YWx1ZS5oIgorI2luY2x1ZGUgImZ4anMvanNfcmVzb3VyY2VzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZm5vdGlmeS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jc2NyaXB0X2hvc3Rwc2V1ZG9tb2RlbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dHByb2Nlc3Nvci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX3Jlc29sdmVub2RlX3JzLmgiCisKK25hbWVzcGFjZSB7CisKK2ludDMyX3QgRmlsdGVyTmFtZShjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0LAorICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIHdzRmlsdGVyKSB7CisgIEFTU0VSVChuU3RhcnQgPiAtMSk7CisgIGludDMyX3QgaUxlbmd0aCA9IHdzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKTsKKyAgaWYgKG5TdGFydCA+PSBpTGVuZ3RoKQorICAgIHJldHVybiBpTGVuZ3RoOworCisgIHdjaGFyX3QqIHBCdWYgPSB3c0ZpbHRlci5HZXRCdWZmZXIoaUxlbmd0aCAtIG5TdGFydCk7CisgIGludDMyX3QgbkNvdW50ID0gMDsKKyAgY29uc3Qgd2NoYXJfdCogcFNyYyA9IHdzRXhwcmVzc2lvbi51bnRlcm1pbmF0ZWRfY19zdHIoKTsKKyAgd2NoYXJfdCB3Q3VyOworICB3aGlsZSAoblN0YXJ0IDwgaUxlbmd0aCkgeworICAgIHdDdXIgPSBwU3JjW25TdGFydCsrXTsKKyAgICBpZiAod0N1ciA9PSAnLCcpCisgICAgICBicmVhazsKKworICAgIHBCdWZbbkNvdW50KytdID0gd0N1cjsKKyAgfQorICB3c0ZpbHRlci5SZWxlYXNlQnVmZmVyKG5Db3VudCk7CisgIHdzRmlsdGVyLlRyaW0oKTsKKyAgcmV0dXJuIG5TdGFydDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2NvbnN0IENKWF9NZXRob2RTcGVjIENKWF9Ib3N0UHNldWRvTW9kZWw6Ok1ldGhvZFNwZWNzW10gPSB7CisgICAgeyJiZWVwIiwgYmVlcF9zdGF0aWN9LAorICAgIHsiZG9jdW1lbnRDb3VudEluQmF0Y2giLCBkb2N1bWVudENvdW50SW5CYXRjaF9zdGF0aWN9LAorICAgIHsiZG9jdW1lbnRJbkJhdGNoIiwgZG9jdW1lbnRJbkJhdGNoX3N0YXRpY30sCisgICAgeyJleHBvcnREYXRhIiwgZXhwb3J0RGF0YV9zdGF0aWN9LAorICAgIHsiZ2V0Rm9jdXMiLCBnZXRGb2N1c19zdGF0aWN9LAorICAgIHsiZ290b1VSTCIsIGdvdG9VUkxfc3RhdGljfSwKKyAgICB7ImltcG9ydERhdGEiLCBpbXBvcnREYXRhX3N0YXRpY30sCisgICAgeyJtZXNzYWdlQm94IiwgbWVzc2FnZUJveF9zdGF0aWN9LAorICAgIHsib3Blbkxpc3QiLCBvcGVuTGlzdF9zdGF0aWN9LAorICAgIHsicGFnZURvd24iLCBwYWdlRG93bl9zdGF0aWN9LAorICAgIHsicGFnZVVwIiwgcGFnZVVwX3N0YXRpY30sCisgICAgeyJwcmludCIsIHByaW50X3N0YXRpY30sCisgICAgeyJyZXNldERhdGEiLCByZXNldERhdGFfc3RhdGljfSwKKyAgICB7InJlc3BvbnNlIiwgcmVzcG9uc2Vfc3RhdGljfSwKKyAgICB7InNldEZvY3VzIiwgc2V0Rm9jdXNfc3RhdGljfX07CisKK0NKWF9Ib3N0UHNldWRvTW9kZWw6OkNKWF9Ib3N0UHNldWRvTW9kZWwoQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWwqIG1vZGVsKQorICAgIDogQ0pYX09iamVjdChtb2RlbCkgeworICBEZWZpbmVNZXRob2RzKE1ldGhvZFNwZWNzLCBGWF9BcnJheVNpemUoTWV0aG9kU3BlY3MpKTsKK30KKworQ0pYX0hvc3RQc2V1ZG9Nb2RlbDo6fkNKWF9Ib3N0UHNldWRvTW9kZWwoKSB7fQorCit2b2lkIENKWF9Ib3N0UHNldWRvTW9kZWw6OmFwcFR5cGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IEdldERvY3VtZW50KCktPkdldE5vdGlmeSgpOworICBpZiAoIXBOb3RpZnkpCisgICAgcmV0dXJuOworCisgIGlmIChiU2V0dGluZykgeworICAgIFRocm93SW52YWxpZFByb3BlcnR5RXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisgIHBWYWx1ZS0+U2V0U3RyaW5nKCJFeGNoYW5nZSIpOworfQorCit2b2lkIENKWF9Ib3N0UHNldWRvTW9kZWw6OmNhbGN1bGF0aW9uc0VuYWJsZWQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IEdldERvY3VtZW50KCktPkdldE5vdGlmeSgpOworICBpZiAoIXBOb3RpZnkpCisgICAgcmV0dXJuOworCisgIENYRkFfRkZEb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7CisgIGlmIChiU2V0dGluZykgeworICAgIHBOb3RpZnktPkdldERvY0Vudmlyb25tZW50KCktPlNldENhbGN1bGF0aW9uc0VuYWJsZWQoaERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYWx1ZS0+VG9Cb29sZWFuKCkpOworICAgIHJldHVybjsKKyAgfQorICBwVmFsdWUtPlNldEJvb2xlYW4ocE5vdGlmeS0+R2V0RG9jRW52aXJvbm1lbnQoKS0+SXNDYWxjdWxhdGlvbnNFbmFibGVkKGhEb2MpKTsKK30KKwordm9pZCBDSlhfSG9zdFBzZXVkb01vZGVsOjpjdXJyZW50UGFnZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBHZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKKyAgaWYgKCFwTm90aWZ5KQorICAgIHJldHVybjsKKworICBDWEZBX0ZGRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOworICBpZiAoYlNldHRpbmcpIHsKKyAgICBwTm90aWZ5LT5HZXREb2NFbnZpcm9ubWVudCgpLT5TZXRDdXJyZW50UGFnZShoRG9jLCBwVmFsdWUtPlRvSW50ZWdlcigpKTsKKyAgICByZXR1cm47CisgIH0KKyAgcFZhbHVlLT5TZXRJbnRlZ2VyKHBOb3RpZnktPkdldERvY0Vudmlyb25tZW50KCktPkdldEN1cnJlbnRQYWdlKGhEb2MpKTsKK30KKwordm9pZCBDSlhfSG9zdFBzZXVkb01vZGVsOjpsYW5ndWFnZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBHZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKKyAgaWYgKCFwTm90aWZ5KQorICAgIHJldHVybjsKKworICBpZiAoYlNldHRpbmcpIHsKKyAgICBUaHJvd0V4Y2VwdGlvbihMIlVuYWJsZSB0byBzZXQgbGFuZ3VhZ2UgdmFsdWUuIik7CisgICAgcmV0dXJuOworICB9CisgIHBWYWx1ZS0+U2V0U3RyaW5nKAorICAgICAgcE5vdGlmeS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0TGFuZ3VhZ2UoKS5VVEY4RW5jb2RlKCkuQXNTdHJpbmdWaWV3KCkpOworfQorCit2b2lkIENKWF9Ib3N0UHNldWRvTW9kZWw6Om51bVBhZ2VzKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IEdldERvY3VtZW50KCktPkdldE5vdGlmeSgpOworICBpZiAoIXBOb3RpZnkpCisgICAgcmV0dXJuOworCisgIENYRkFfRkZEb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7CisgIGlmIChiU2V0dGluZykgeworICAgIFRocm93RXhjZXB0aW9uKEwiVW5hYmxlIHRvIHNldCBudW1QYWdlcyB2YWx1ZS4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgcFZhbHVlLT5TZXRJbnRlZ2VyKHBOb3RpZnktPkdldERvY0Vudmlyb25tZW50KCktPkNvdW50UGFnZXMoaERvYykpOworfQorCit2b2lkIENKWF9Ib3N0UHNldWRvTW9kZWw6OnBsYXRmb3JtKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IEdldERvY3VtZW50KCktPkdldE5vdGlmeSgpOworICBpZiAoIXBOb3RpZnkpCisgICAgcmV0dXJuOworCisgIGlmIChiU2V0dGluZykgeworICAgIFRocm93RXhjZXB0aW9uKEwiVW5hYmxlIHRvIHNldCBwbGF0Zm9ybSB2YWx1ZS4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgcFZhbHVlLT5TZXRTdHJpbmcoCisgICAgICBwTm90aWZ5LT5HZXRBcHBQcm92aWRlcigpLT5HZXRQbGF0Zm9ybSgpLlVURjhFbmNvZGUoKS5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKK3ZvaWQgQ0pYX0hvc3RQc2V1ZG9Nb2RlbDo6dGl0bGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBpZiAoIUdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKS0+SXNSdW5BdENsaWVudCgpKQorICAgIHJldHVybjsKKworICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gR2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCk7CisgIGlmICghcE5vdGlmeSkKKyAgICByZXR1cm47CisKKyAgQ1hGQV9GRkRvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsKKyAgaWYgKGJTZXR0aW5nKSB7CisgICAgcE5vdGlmeS0+R2V0RG9jRW52aXJvbm1lbnQoKS0+U2V0VGl0bGUoaERvYywgcFZhbHVlLT5Ub1dpZGVTdHJpbmcoKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgV2lkZVN0cmluZyB3c1RpdGxlOworICBwTm90aWZ5LT5HZXREb2NFbnZpcm9ubWVudCgpLT5HZXRUaXRsZShoRG9jLCB3c1RpdGxlKTsKKyAgcFZhbHVlLT5TZXRTdHJpbmcod3NUaXRsZS5VVEY4RW5jb2RlKCkuQXNTdHJpbmdWaWV3KCkpOworfQorCit2b2lkIENKWF9Ib3N0UHNldWRvTW9kZWw6OnZhbGlkYXRpb25zRW5hYmxlZChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IEdldERvY3VtZW50KCktPkdldE5vdGlmeSgpOworICBpZiAoIXBOb3RpZnkpCisgICAgcmV0dXJuOworCisgIENYRkFfRkZEb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7CisgIGlmIChiU2V0dGluZykgeworICAgIHBOb3RpZnktPkdldERvY0Vudmlyb25tZW50KCktPlNldFZhbGlkYXRpb25zRW5hYmxlZChoRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFsdWUtPlRvQm9vbGVhbigpKTsKKyAgICByZXR1cm47CisgIH0KKworICBib29sIGJFbmFibGVkID0gcE5vdGlmeS0+R2V0RG9jRW52aXJvbm1lbnQoKS0+SXNWYWxpZGF0aW9uc0VuYWJsZWQoaERvYyk7CisgIHBWYWx1ZS0+U2V0Qm9vbGVhbihiRW5hYmxlZCk7Cit9CisKK3ZvaWQgQ0pYX0hvc3RQc2V1ZG9Nb2RlbDo6dmFyaWF0aW9uKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBpZiAoIUdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKS0+SXNSdW5BdENsaWVudCgpKQorICAgIHJldHVybjsKKworICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gR2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCk7CisgIGlmICghcE5vdGlmeSkKKyAgICByZXR1cm47CisKKyAgaWYgKGJTZXR0aW5nKSB7CisgICAgVGhyb3dFeGNlcHRpb24oTCJVbmFibGUgdG8gc2V0IHZhcmlhdGlvbiB2YWx1ZS4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgcFZhbHVlLT5TZXRTdHJpbmcoIkZ1bGwiKTsKK30KKwordm9pZCBDSlhfSG9zdFBzZXVkb01vZGVsOjp2ZXJzaW9uKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBHZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKKyAgaWYgKCFwTm90aWZ5KQorICAgIHJldHVybjsKKworICBpZiAoYlNldHRpbmcpIHsKKyAgICBUaHJvd0V4Y2VwdGlvbihMIlVuYWJsZSB0byBzZXQgdmVyc2lvbiB2YWx1ZS4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgcFZhbHVlLT5TZXRTdHJpbmcoIjExIik7Cit9CisKK3ZvaWQgQ0pYX0hvc3RQc2V1ZG9Nb2RlbDo6bmFtZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gR2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCk7CisgIGlmICghcE5vdGlmeSkKKyAgICByZXR1cm47CisKKyAgaWYgKGJTZXR0aW5nKSB7CisgICAgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKTsKKyAgICByZXR1cm47CisgIH0KKyAgcFZhbHVlLT5TZXRTdHJpbmcoCisgICAgICBwTm90aWZ5LT5HZXRBcHBQcm92aWRlcigpLT5HZXRBcHBOYW1lKCkuVVRGOEVuY29kZSgpLkFzU3RyaW5nVmlldygpKTsKK30KKworQ0pTX1JldHVybiBDSlhfSG9zdFBzZXVkb01vZGVsOjpnb3RvVVJMKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIUdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKS0+SXNSdW5BdENsaWVudCgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBHZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKKyAgaWYgKCFwTm90aWZ5KQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIENYRkFfRkZEb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7CisgIFdpZGVTdHJpbmcgVVJMID0gcnVudGltZS0+VG9XaWRlU3RyaW5nKHBhcmFtc1swXSk7CisgIHBOb3RpZnktPkdldERvY0Vudmlyb25tZW50KCktPkdvdG9VUkwoaERvYywgVVJMKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0hvc3RQc2V1ZG9Nb2RlbDo6b3Blbkxpc3QoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmICghR2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpLT5Jc1J1bkF0Q2xpZW50KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IEdldERvY3VtZW50KCktPkdldE5vdGlmeSgpOworICBpZiAoIXBOb3RpZnkpCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG51bGxwdHI7CisgIGlmIChwYXJhbXNbMF0tPklzT2JqZWN0KCkpIHsKKyAgICBwTm9kZSA9IFRvTm9kZShydW50aW1lLT5Ub1hGQU9iamVjdChwYXJhbXNbMF0pKTsKKyAgfSBlbHNlIGlmIChwYXJhbXNbMF0tPklzU3RyaW5nKCkpIHsKKyAgICBDRlhKU0VfRW5naW5lKiBwU2NyaXB0Q29udGV4dCA9IEdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKTsKKyAgICBpZiAoIXBTY3JpcHRDb250ZXh0KQorICAgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgICBDWEZBX09iamVjdCogcE9iamVjdCA9IHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCk7CisgICAgaWYgKCFwT2JqZWN0KQorICAgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgICB1aW50MzJfdCBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwKKyAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfU2libGluZ3M7CisgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc29sdmVOb2RlUlM7CisgICAgYm9vbCBpUmV0ID0gcFNjcmlwdENvbnRleHQtPlJlc29sdmVPYmplY3RzKAorICAgICAgICBwT2JqZWN0LCBydW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzBdKS5Bc1N0cmluZ1ZpZXcoKSwKKyAgICAgICAgJnJlc29sdmVOb2RlUlMsIGR3RmxhZywgbnVsbHB0cik7CisgICAgaWYgKCFpUmV0IHx8ICFyZXNvbHZlTm9kZVJTLm9iamVjdHMuZnJvbnQoKS0+SXNOb2RlKCkpCisgICAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKworICAgIHBOb2RlID0gcmVzb2x2ZU5vZGVSUy5vYmplY3RzLmZyb250KCktPkFzTm9kZSgpOworICB9CisKKyAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBEb2NMYXlvdXQgPSBHZXREb2N1bWVudCgpLT5HZXREb2NMYXlvdXQoKTsKKyAgaWYgKCFwRG9jTGF5b3V0KQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIENYRkFfRkZXaWRnZXQqIGhXaWRnZXQgPQorICAgICAgcE5vdGlmeS0+R2V0SFdpZGdldChwRG9jTGF5b3V0LT5HZXRMYXlvdXRJdGVtKHBOb2RlKSk7CisgIGlmICghaFdpZGdldCkKKyAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKworICBwTm90aWZ5LT5HZXREb2NFbnZpcm9ubWVudCgpLT5TZXRGb2N1c1dpZGdldChwTm90aWZ5LT5HZXRIRE9DKCksIGhXaWRnZXQpOworICBwTm90aWZ5LT5PcGVuRHJvcERvd25MaXN0KGhXaWRnZXQpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfSG9zdFBzZXVkb01vZGVsOjpyZXNwb25zZSgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5lbXB0eSgpIHx8IHBhcmFtcy5zaXplKCkgPiA0KQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gR2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCk7CisgIGlmICghcE5vdGlmeSkKKyAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKworICBXaWRlU3RyaW5nIHF1ZXN0aW9uOworICBpZiAocGFyYW1zLnNpemUoKSA+PSAxKQorICAgIHF1ZXN0aW9uID0gcnVudGltZS0+VG9XaWRlU3RyaW5nKHBhcmFtc1swXSk7CisKKyAgV2lkZVN0cmluZyB0aXRsZTsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMikKKyAgICB0aXRsZSA9IHJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMV0pOworCisgIFdpZGVTdHJpbmcgZGVmYXVsdEFuc3dlcjsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMykKKyAgICBkZWZhdWx0QW5zd2VyID0gcnVudGltZS0+VG9XaWRlU3RyaW5nKHBhcmFtc1syXSk7CisKKyAgYm9vbCBtYXJrID0gZmFsc2U7CisgIGlmIChwYXJhbXMuc2l6ZSgpID49IDQpCisgICAgbWFyayA9IHJ1bnRpbWUtPlRvSW50MzIocGFyYW1zWzNdKSAhPSAwOworCisgIFdpZGVTdHJpbmcgYW5zd2VyID0KKyAgICAgIHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPlJlc3BvbnNlKHF1ZXN0aW9uLCB0aXRsZSwgZGVmYXVsdEFuc3dlciwgbWFyayk7CisgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld1N0cmluZyhhbnN3ZXIuVVRGOEVuY29kZSgpLkFzU3RyaW5nVmlldygpKSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0hvc3RQc2V1ZG9Nb2RlbDo6ZG9jdW1lbnRJbkJhdGNoKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdOdW1iZXIoMCkpOworfQorCitDSlNfUmV0dXJuIENKWF9Ib3N0UHNldWRvTW9kZWw6OnJlc2V0RGF0YSgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPiAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gR2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCk7CisgIGlmICghcE5vdGlmeSkKKyAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKworICBXaWRlU3RyaW5nIGV4cHJlc3Npb247CisgIGlmIChwYXJhbXMuc2l6ZSgpID49IDEpCisgICAgZXhwcmVzc2lvbiA9IHJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMF0pOworCisgIGlmIChleHByZXNzaW9uLklzRW1wdHkoKSkgeworICAgIHBOb3RpZnktPlJlc2V0RGF0YSgpOworICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworICB9CisKKyAgaW50MzJfdCBpU3RhcnQgPSAwOworICBXaWRlU3RyaW5nIHdzTmFtZTsKKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG51bGxwdHI7CisgIGludDMyX3QgaUV4cExlbmd0aCA9IGV4cHJlc3Npb24uR2V0TGVuZ3RoKCk7CisgIHdoaWxlIChpU3RhcnQgPCBpRXhwTGVuZ3RoKSB7CisgICAgaVN0YXJ0ID0gRmlsdGVyTmFtZShleHByZXNzaW9uLkFzU3RyaW5nVmlldygpLCBpU3RhcnQsIHdzTmFtZSk7CisgICAgQ0ZYSlNFX0VuZ2luZSogcFNjcmlwdENvbnRleHQgPSBHZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCk7CisgICAgaWYgKCFwU2NyaXB0Q29udGV4dCkKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgICAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSBwU2NyaXB0Q29udGV4dC0+R2V0VGhpc09iamVjdCgpOworICAgIGlmICghcE9iamVjdCkKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgICAgdWludDMyX3QgZHdGbGFnID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8CisgICAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOworICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvbHZlTm9kZVJTOworICAgIGJvb2wgaVJldCA9IHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cyhwT2JqZWN0LCB3c05hbWUuQXNTdHJpbmdWaWV3KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNvbHZlTm9kZVJTLCBkd0ZsYWcsIG51bGxwdHIpOworICAgIGlmICghaVJldCB8fCAhcmVzb2x2ZU5vZGVSUy5vYmplY3RzLmZyb250KCktPklzTm9kZSgpKQorICAgICAgY29udGludWU7CisKKyAgICBwTm9kZSA9IHJlc29sdmVOb2RlUlMub2JqZWN0cy5mcm9udCgpLT5Bc05vZGUoKTsKKyAgICBwTm90aWZ5LT5SZXNldERhdGEocE5vZGUtPkdldFdpZGdldEFjYygpKTsKKyAgfQorICBpZiAoIXBOb2RlKQorICAgIHBOb3RpZnktPlJlc2V0RGF0YSgpOworCisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIENKWF9Ib3N0UHNldWRvTW9kZWw6OmJlZXAoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmICghR2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpLT5Jc1J1bkF0Q2xpZW50KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgaWYgKHBhcmFtcy5zaXplKCkgPiAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gR2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCk7CisgIGlmICghcE5vdGlmeSkKKyAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKworICB1aW50MzJfdCBkd1R5cGUgPSA0OworICBpZiAocGFyYW1zLnNpemUoKSA+PSAxKQorICAgIGR3VHlwZSA9IHJ1bnRpbWUtPlRvSW50MzIocGFyYW1zWzBdKTsKKworICBwTm90aWZ5LT5HZXRBcHBQcm92aWRlcigpLT5CZWVwKGR3VHlwZSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIENKWF9Ib3N0UHNldWRvTW9kZWw6OnNldEZvY3VzKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIUdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKS0+SXNSdW5BdENsaWVudCgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBHZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKKyAgaWYgKCFwTm90aWZ5KQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIENYRkFfTm9kZSogcE5vZGUgPSBudWxscHRyOworICBpZiAocGFyYW1zLnNpemUoKSA+PSAxKSB7CisgICAgaWYgKHBhcmFtc1swXS0+SXNPYmplY3QoKSkgeworICAgICAgcE5vZGUgPSBUb05vZGUocnVudGltZS0+VG9YRkFPYmplY3QocGFyYW1zWzBdKSk7CisgICAgfSBlbHNlIGlmIChwYXJhbXNbMF0tPklzU3RyaW5nKCkpIHsKKyAgICAgIENGWEpTRV9FbmdpbmUqIHBTY3JpcHRDb250ZXh0ID0gR2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpOworICAgICAgaWYgKCFwU2NyaXB0Q29udGV4dCkKKyAgICAgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgICAgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gcFNjcmlwdENvbnRleHQtPkdldFRoaXNPYmplY3QoKTsKKyAgICAgIGlmICghcE9iamVjdCkKKyAgICAgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgICAgIHVpbnQzMl90IGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfAorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOworICAgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc29sdmVOb2RlUlM7CisgICAgICBib29sIGlSZXQgPSBwU2NyaXB0Q29udGV4dC0+UmVzb2x2ZU9iamVjdHMoCisgICAgICAgICAgcE9iamVjdCwgcnVudGltZS0+VG9XaWRlU3RyaW5nKHBhcmFtc1swXSkuQXNTdHJpbmdWaWV3KCksCisgICAgICAgICAgJnJlc29sdmVOb2RlUlMsIGR3RmxhZywgbnVsbHB0cik7CisgICAgICBpZiAoIWlSZXQgfHwgIXJlc29sdmVOb2RlUlMub2JqZWN0cy5mcm9udCgpLT5Jc05vZGUoKSkKKyAgICAgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgICAgIHBOb2RlID0gcmVzb2x2ZU5vZGVSUy5vYmplY3RzLmZyb250KCktPkFzTm9kZSgpOworICAgIH0KKyAgfQorICBwTm90aWZ5LT5TZXRGb2N1c1dpZGdldE5vZGUocE5vZGUpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfSG9zdFBzZXVkb01vZGVsOjpnZXRGb2N1cygKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IEdldERvY3VtZW50KCktPkdldE5vdGlmeSgpOworICBpZiAoIXBOb3RpZnkpCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBOb3RpZnktPkdldEZvY3VzV2lkZ2V0Tm9kZSgpOworICBpZiAoIXBOb2RlKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIENGWEpTRV9WYWx1ZSogdmFsdWUgPQorICAgICAgR2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwTm9kZSk7CisgIGlmICghdmFsdWUpCisgICAgcmV0dXJuIENKU19SZXR1cm4ocnVudGltZS0+TmV3TnVsbCgpKTsKKworICByZXR1cm4gQ0pTX1JldHVybih2YWx1ZS0+RGlyZWN0R2V0VmFsdWUoKS5HZXQocnVudGltZS0+R2V0SXNvbGF0ZSgpKSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0hvc3RQc2V1ZG9Nb2RlbDo6bWVzc2FnZUJveCgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKCFHZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCktPklzUnVuQXRDbGllbnQoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKworICBpZiAocGFyYW1zLmVtcHR5KCkgfHwgcGFyYW1zLnNpemUoKSA+IDQpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBHZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKKyAgaWYgKCFwTm90aWZ5KQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIFdpZGVTdHJpbmcgbWVzc2FnZTsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMSkKKyAgICBtZXNzYWdlID0gcnVudGltZS0+VG9XaWRlU3RyaW5nKHBhcmFtc1swXSk7CisKKyAgV2lkZVN0cmluZyB0aXRsZTsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMikKKyAgICB0aXRsZSA9IHJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMV0pOworCisgIHVpbnQzMl90IG1lc3NhZ2VUeXBlID0gWEZBX01CSUNPTl9FcnJvcjsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMykgeworICAgIG1lc3NhZ2VUeXBlID0gcnVudGltZS0+VG9JbnQzMihwYXJhbXNbMl0pOworICAgIGlmIChtZXNzYWdlVHlwZSA+IFhGQV9NQklDT05fU3RhdHVzKQorICAgICAgbWVzc2FnZVR5cGUgPSBYRkFfTUJJQ09OX0Vycm9yOworICB9CisKKyAgdWludDMyX3QgYnV0dG9uVHlwZSA9IFhGQV9NQl9PSzsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gNCkgeworICAgIGJ1dHRvblR5cGUgPSBydW50aW1lLT5Ub0ludDMyKHBhcmFtc1szXSk7CisgICAgaWYgKGJ1dHRvblR5cGUgPiBYRkFfTUJfWWVzTm9DYW5jZWwpCisgICAgICBidXR0b25UeXBlID0gWEZBX01CX09LOworICB9CisKKyAgaW50MzJfdCBpVmFsdWUgPSBwTm90aWZ5LT5HZXRBcHBQcm92aWRlcigpLT5Nc2dCb3gobWVzc2FnZSwgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlLCBidXR0b25UeXBlKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocnVudGltZS0+TmV3TnVtYmVyKGlWYWx1ZSkpOworfQorCitDSlNfUmV0dXJuIENKWF9Ib3N0UHNldWRvTW9kZWw6OmRvY3VtZW50Q291bnRJbkJhdGNoKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdOdW1iZXIoMCkpOworfQorCitDSlNfUmV0dXJuIENKWF9Ib3N0UHNldWRvTW9kZWw6OnByaW50KAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIUdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKS0+SXNSdW5BdENsaWVudCgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDgpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBHZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKKyAgaWYgKCFwTm90aWZ5KQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIHVpbnQzMl90IGR3T3B0aW9ucyA9IDA7CisgIGlmIChydW50aW1lLT5Ub0Jvb2xlYW4ocGFyYW1zWzBdKSkKKyAgICBkd09wdGlvbnMgfD0gWEZBX1BSSU5UT1BUX1Nob3dEaWFsb2c7CisgIGlmIChydW50aW1lLT5Ub0Jvb2xlYW4ocGFyYW1zWzNdKSkKKyAgICBkd09wdGlvbnMgfD0gWEZBX1BSSU5UT1BUX0NhbkNhbmNlbDsKKyAgaWYgKHJ1bnRpbWUtPlRvQm9vbGVhbihwYXJhbXNbNF0pKQorICAgIGR3T3B0aW9ucyB8PSBYRkFfUFJJTlRPUFRfU2hyaW5rUGFnZTsKKyAgaWYgKHJ1bnRpbWUtPlRvQm9vbGVhbihwYXJhbXNbNV0pKQorICAgIGR3T3B0aW9ucyB8PSBYRkFfUFJJTlRPUFRfQXNJbWFnZTsKKyAgaWYgKHJ1bnRpbWUtPlRvQm9vbGVhbihwYXJhbXNbNl0pKQorICAgIGR3T3B0aW9ucyB8PSBYRkFfUFJJTlRPUFRfUmV2ZXJzZU9yZGVyOworICBpZiAocnVudGltZS0+VG9Cb29sZWFuKHBhcmFtc1s3XSkpCisgICAgZHdPcHRpb25zIHw9IFhGQV9QUklOVE9QVF9QcmludEFubm90OworCisgIGludDMyX3QgblN0YXJ0UGFnZSA9IHJ1bnRpbWUtPlRvSW50MzIocGFyYW1zWzFdKTsKKyAgaW50MzJfdCBuRW5kUGFnZSA9IHJ1bnRpbWUtPlRvSW50MzIocGFyYW1zWzJdKTsKKworICBwTm90aWZ5LT5HZXREb2NFbnZpcm9ubWVudCgpLT5QcmludChwTm90aWZ5LT5HZXRIRE9DKCksIG5TdGFydFBhZ2UsIG5FbmRQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd09wdGlvbnMpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfSG9zdFBzZXVkb01vZGVsOjppbXBvcnREYXRhKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLmVtcHR5KCkgfHwgcGFyYW1zLnNpemUoKSA+IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIENKWF9Ib3N0UHNldWRvTW9kZWw6OmV4cG9ydERhdGEoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuZW1wdHkoKSB8fCBwYXJhbXMuc2l6ZSgpID4gMikKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IEdldERvY3VtZW50KCktPkdldE5vdGlmeSgpOworICBpZiAoIXBOb3RpZnkpCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgV2lkZVN0cmluZyBmaWxlUGF0aDsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMSkKKyAgICBmaWxlUGF0aCA9IHJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMF0pOworCisgIGJvb2wgWERQID0gdHJ1ZTsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMikKKyAgICBYRFAgPSBydW50aW1lLT5Ub0Jvb2xlYW4ocGFyYW1zWzFdKTsKKworICBwTm90aWZ5LT5HZXREb2NFbnZpcm9ubWVudCgpLT5FeHBvcnREYXRhKHBOb3RpZnktPkdldEhET0MoKSwgZmlsZVBhdGgsIFhEUCk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIENKWF9Ib3N0UHNldWRvTW9kZWw6OnBhZ2VVcCgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IEdldERvY3VtZW50KCktPkdldE5vdGlmeSgpOworICBpZiAoIXBOb3RpZnkpCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgQ1hGQV9GRkRvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsKKyAgaW50MzJfdCBuQ3VyUGFnZSA9IHBOb3RpZnktPkdldERvY0Vudmlyb25tZW50KCktPkdldEN1cnJlbnRQYWdlKGhEb2MpOworICBpbnQzMl90IG5OZXdQYWdlID0gMDsKKyAgaWYgKG5DdXJQYWdlIDw9IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgbk5ld1BhZ2UgPSBuQ3VyUGFnZSAtIDE7CisgIHBOb3RpZnktPkdldERvY0Vudmlyb25tZW50KCktPlNldEN1cnJlbnRQYWdlKGhEb2MsIG5OZXdQYWdlKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0hvc3RQc2V1ZG9Nb2RlbDo6cGFnZURvd24oCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBHZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKKyAgaWYgKCFwTm90aWZ5KQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIENYRkFfRkZEb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7CisgIGludDMyX3QgbkN1clBhZ2UgPSBwTm90aWZ5LT5HZXREb2NFbnZpcm9ubWVudCgpLT5HZXRDdXJyZW50UGFnZShoRG9jKTsKKyAgaW50MzJfdCBuUGFnZUNvdW50ID0gcE5vdGlmeS0+R2V0RG9jRW52aXJvbm1lbnQoKS0+Q291bnRQYWdlcyhoRG9jKTsKKyAgaWYgKCFuUGFnZUNvdW50IHx8IG5DdXJQYWdlID09IG5QYWdlQ291bnQpCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgaW50MzJfdCBuTmV3UGFnZSA9IDA7CisgIGlmIChuQ3VyUGFnZSA+PSBuUGFnZUNvdW50KQorICAgIG5OZXdQYWdlID0gblBhZ2VDb3VudCAtIDE7CisgIGVsc2UKKyAgICBuTmV3UGFnZSA9IG5DdXJQYWdlICsgMTsKKworICBwTm90aWZ5LT5HZXREb2NFbnZpcm9ubWVudCgpLT5TZXRDdXJyZW50UGFnZShoRG9jLCBuTmV3UGFnZSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2hvc3Rwc2V1ZG9tb2RlbC5oIGIvZnhqcy94ZmEvY2p4X2hvc3Rwc2V1ZG9tb2RlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZDZmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfaG9zdHBzZXVkb21vZGVsLmgKQEAgLTAsMCArMSw1NyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9IT1NUUFNFVURPTU9ERUxfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0hPU1RQU0VVRE9NT0RFTF9IXworCisjaW5jbHVkZSAiZnhqcy9DSlhfRGVmaW5lLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X29iamVjdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmFfYmFzaWMuaCIKKworY2xhc3MgQ0ZYSlNFX1ZhbHVlOworY2xhc3MgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw7CisKK2NsYXNzIENKWF9Ib3N0UHNldWRvTW9kZWwgOiBwdWJsaWMgQ0pYX09iamVjdCB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfSG9zdFBzZXVkb01vZGVsKENTY3JpcHRfSG9zdFBzZXVkb01vZGVsKiBtb2RlbCk7CisgIH5DSlhfSG9zdFBzZXVkb01vZGVsKCkgb3ZlcnJpZGU7CisKKyAgSlNfTUVUSE9EKGJlZXAsIENKWF9Ib3N0UHNldWRvTW9kZWwpOworICBKU19NRVRIT0QoZG9jdW1lbnRDb3VudEluQmF0Y2gsIENKWF9Ib3N0UHNldWRvTW9kZWwpOworICBKU19NRVRIT0QoZG9jdW1lbnRJbkJhdGNoLCBDSlhfSG9zdFBzZXVkb01vZGVsKTsKKyAgSlNfTUVUSE9EKGV4cG9ydERhdGEsIENKWF9Ib3N0UHNldWRvTW9kZWwpOworICBKU19NRVRIT0QoZ2V0Rm9jdXMsIENKWF9Ib3N0UHNldWRvTW9kZWwpOworICBKU19NRVRIT0QoZ290b1VSTCwgQ0pYX0hvc3RQc2V1ZG9Nb2RlbCk7CisgIEpTX01FVEhPRChpbXBvcnREYXRhLCBDSlhfSG9zdFBzZXVkb01vZGVsKTsKKyAgSlNfTUVUSE9EKG1lc3NhZ2VCb3gsIENKWF9Ib3N0UHNldWRvTW9kZWwpOworICBKU19NRVRIT0Qob3Blbkxpc3QsIENKWF9Ib3N0UHNldWRvTW9kZWwpOworICBKU19NRVRIT0QocGFnZURvd24sIENKWF9Ib3N0UHNldWRvTW9kZWwpOworICBKU19NRVRIT0QocGFnZVVwLCBDSlhfSG9zdFBzZXVkb01vZGVsKTsKKyAgSlNfTUVUSE9EKHByaW50LCBDSlhfSG9zdFBzZXVkb01vZGVsKTsKKyAgSlNfTUVUSE9EKHJlc2V0RGF0YSwgQ0pYX0hvc3RQc2V1ZG9Nb2RlbCk7CisgIEpTX01FVEhPRChyZXNwb25zZSwgQ0pYX0hvc3RQc2V1ZG9Nb2RlbCk7CisgIEpTX01FVEhPRChzZXRGb2N1cywgQ0pYX0hvc3RQc2V1ZG9Nb2RlbCk7CisKKyAgSlNfUFJPUChhcHBUeXBlKTsKKyAgSlNfUFJPUChjYWxjdWxhdGlvbnNFbmFibGVkKTsKKyAgSlNfUFJPUChjdXJyZW50UGFnZSk7CisgIEpTX1BST1AobGFuZ3VhZ2UpOworICBKU19QUk9QKG51bVBhZ2VzKTsKKyAgSlNfUFJPUChwbGF0Zm9ybSk7CisgIEpTX1BST1AodGl0bGUpOworICBKU19QUk9QKHZhbGlkYXRpb25zRW5hYmxlZCk7CisgIEpTX1BST1AodmFyaWF0aW9uKTsKKyAgSlNfUFJPUCh2ZXJzaW9uKTsKKworICAvLyBUT0RPKGRzaW5jbGFpcik6IFJlbW92ZSB3aGVuIHhmYV9iYXNpY19kYXRhX2VsZW1lbnRfc2NyaXB0IGlzIHJlbW92ZWQuCisgIC8vIERvZXNuJ3QgZXhpc3QgaW4gc3BlYworICBKU19QUk9QKG5hbWUpOworCisgcHJpdmF0ZToKKyAgc3RhdGljIGNvbnN0IENKWF9NZXRob2RTcGVjIE1ldGhvZFNwZWNzW107Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9IT1NUUFNFVURPTU9ERUxfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9pbWFnZS5jcHAgYi9meGpzL3hmYS9janhfaW1hZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYTIxMzEKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfaW1hZ2UuY3BwCkBAIC0wLDAgKzEsNjEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9pbWFnZS5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW1hZ2UuaCIKKworQ0pYX0ltYWdlOjpDSlhfSW1hZ2UoQ1hGQV9JbWFnZSogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfSW1hZ2U6On5DSlhfSW1hZ2UoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0ltYWdlOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfSW1hZ2U6OmNvbnRlbnRUeXBlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9JbWFnZTo6dHJhbnNmZXJFbmNvZGluZyhDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ltYWdlOjpkZWZhdWx0VmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZV9SZWFkKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9JbWFnZTo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ltYWdlOjphc3BlY3QoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfSW1hZ2U6OnZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlX1JlYWQocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ltYWdlOjpocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9pbWFnZS5oIGIvZnhqcy94ZmEvY2p4X2ltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkMTIwYQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9pbWFnZS5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfSU1BR0VfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0lNQUdFX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX0ltYWdlOworCitjbGFzcyBDSlhfSW1hZ2UgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0ltYWdlKENYRkFfSW1hZ2UqIG5vZGUpOworICB+Q0pYX0ltYWdlKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChkZWZhdWx0VmFsdWUpOyAvKiB7ZGVmYXVsdH0gKi8KKyAgSlNfUFJPUChhc3BlY3QpOworICBKU19QUk9QKGNvbnRlbnRUeXBlKTsKKyAgSlNfUFJPUChocmVmKTsKKyAgSlNfUFJPUCh0cmFuc2ZlckVuY29kaW5nKTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworICBKU19QUk9QKHZhbHVlKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0lNQUdFX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfaW1hZ2VlZGl0LmNwcCBiL2Z4anMveGZhL2NqeF9pbWFnZWVkaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMjVlY2EKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfaW1hZ2VlZGl0LmNwcApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfaW1hZ2VlZGl0LmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbWFnZWVkaXQuaCIKKworQ0pYX0ltYWdlRWRpdDo6Q0pYX0ltYWdlRWRpdChDWEZBX0ltYWdlRWRpdCogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfSW1hZ2VFZGl0Ojp+Q0pYX0ltYWdlRWRpdCgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfSW1hZ2VFZGl0Ojp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9JbWFnZUVkaXQ6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ltYWdlRWRpdDo6ZGF0YShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9pbWFnZWVkaXQuaCBiL2Z4anMveGZhL2NqeF9pbWFnZWVkaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmY0ZmEzCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2ltYWdlZWRpdC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfSU1BR0VFRElUX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9JTUFHRUVESVRfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfSW1hZ2VFZGl0OworCitjbGFzcyBDSlhfSW1hZ2VFZGl0IDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9JbWFnZUVkaXQoQ1hGQV9JbWFnZUVkaXQqIG5vZGUpOworICB+Q0pYX0ltYWdlRWRpdCgpIG92ZXJyaWRlOworCisgIEpTX1BST1AoZGF0YSk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0lNQUdFRURJVF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2luc2VydC5jcHAgYi9meGpzL3hmYS9janhfaW5zZXJ0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjJhZTMyCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2luc2VydC5jcHAKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2luc2VydC5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW5zZXJ0LmgiCisKK0NKWF9JbnNlcnQ6OkNKWF9JbnNlcnQoQ1hGQV9JbnNlcnQqIG5vZGUpIDogQ0pYX1RleHROb2RlKG5vZGUpIHt9CisKK0NKWF9JbnNlcnQ6On5DSlhfSW5zZXJ0KCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9JbnNlcnQ6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0luc2VydDo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9pbnNlcnQuaCBiL2Z4anMveGZhL2NqeF9pbnNlcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjczZGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2luc2VydC5oCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfSU5TRVJUX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9JTlNFUlRfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF90ZXh0bm9kZS5oIgorCitjbGFzcyBDWEZBX0luc2VydDsKKworY2xhc3MgQ0pYX0luc2VydCA6IHB1YmxpYyBDSlhfVGV4dE5vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0luc2VydChDWEZBX0luc2VydCogbm9kZSk7CisgIH5DSlhfSW5zZXJ0KCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfSU5TRVJUX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfaW5zdGFuY2VtYW5hZ2VyLmNwcCBiL2Z4anMveGZhL2NqeF9pbnN0YW5jZW1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMDU0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfaW5zdGFuY2VtYW5hZ2VyLmNwcApAQCAtMCwwICsxLDMyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2luc3RhbmNlbWFuYWdlci5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImZ4anMvY2Z4anNlX2VuZ2luZS5oIgorI2luY2x1ZGUgImZ4anMvY2Z4anNlX3ZhbHVlLmgiCisjaW5jbHVkZSAiZnhqcy9qc19yZXNvdXJjZXMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmbm90aWZ5LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbnN0YW5jZW1hbmFnZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXRwcm9jZXNzb3IuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vY2N1ci5oIgorCitjb25zdCBDSlhfTWV0aG9kU3BlYyBDSlhfSW5zdGFuY2VNYW5hZ2VyOjpNZXRob2RTcGVjc1tdID0geworICAgIHsiYWRkSW5zdGFuY2UiLCBhZGRJbnN0YW5jZV9zdGF0aWN9LAorICAgIHsiaW5zZXJ0SW5zdGFuY2UiLCBpbnNlcnRJbnN0YW5jZV9zdGF0aWN9LAorICAgIHsibW92ZUluc3RhbmNlIiwgbW92ZUluc3RhbmNlX3N0YXRpY30sCisgICAgeyJyZW1vdmVJbnN0YW5jZSIsIHJlbW92ZUluc3RhbmNlX3N0YXRpY30sCisgICAgeyJzZXRJbnN0YW5jZXMiLCBzZXRJbnN0YW5jZXNfc3RhdGljfX07CisKK0NKWF9JbnN0YW5jZU1hbmFnZXI6OkNKWF9JbnN0YW5jZU1hbmFnZXIoQ1hGQV9JbnN0YW5jZU1hbmFnZXIqIG1ncikKKyAgICA6IENKWF9Ob2RlKG1ncikgeworICBEZWZpbmVNZXRob2RzKE1ldGhvZFNwZWNzLCBGWF9BcnJheVNpemUoTWV0aG9kU3BlY3MpKTsKK30KKworQ0pYX0luc3RhbmNlTWFuYWdlcjo6fkNKWF9JbnN0YW5jZU1hbmFnZXIoKSB7fQorCitpbnQzMl90IENKWF9JbnN0YW5jZU1hbmFnZXI6OlNldEluc3RhbmNlcyhpbnQzMl90IGlEZXNpcmVkKSB7CisgIENYRkFfT2NjdXIqIG9jY3VyID0gR2V0WEZBTm9kZSgpLT5HZXRPY2N1cklmRXhpc3RzKCk7CisgIGludDMyX3QgaU1pbiA9IG9jY3VyID8gb2NjdXItPkdldE1pbigpIDogQ1hGQV9PY2N1cjo6a0RlZmF1bHRNaW47CisgIGlmIChpRGVzaXJlZCA8IGlNaW4pIHsKKyAgICBUaHJvd1Rvb01hbnlPY2N1cmFuY2VzRXhjZXB0aW9uKEwibWluIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpbnQzMl90IGlNYXggPSBvY2N1ciA/IG9jY3VyLT5HZXRNYXgoKSA6IENYRkFfT2NjdXI6OmtEZWZhdWx0TWF4OworICBpZiAoaU1heCA+PSAwICYmIGlEZXNpcmVkID4gaU1heCkgeworICAgIFRocm93VG9vTWFueU9jY3VyYW5jZXNFeGNlcHRpb24oTCJtYXgiKTsKKyAgICByZXR1cm4gMjsKKyAgfQorCisgIGludDMyX3QgaUNvdW50ID0gR2V0WEZBTm9kZSgpLT5HZXRDb3VudCgpOworICBpZiAoaURlc2lyZWQgPT0gaUNvdW50KQorICAgIHJldHVybiAwOworCisgIGlmIChpRGVzaXJlZCA8IGlDb3VudCkgeworICAgIFdpZGVTdHJpbmcgd3NJbnN0TWFuYWdlck5hbWUgPSBHZXRDRGF0YShYRkFfQXR0cmlidXRlOjpOYW1lKTsKKyAgICBXaWRlU3RyaW5nIHdzSW5zdGFuY2VOYW1lID0gV2lkZVN0cmluZygKKyAgICAgICAgd3NJbnN0TWFuYWdlck5hbWUuSXNFbXB0eSgpCisgICAgICAgICAgICA/IHdzSW5zdE1hbmFnZXJOYW1lCisgICAgICAgICAgICA6IHdzSW5zdE1hbmFnZXJOYW1lLlJpZ2h0KHdzSW5zdE1hbmFnZXJOYW1lLkdldExlbmd0aCgpIC0gMSkpOworICAgIHVpbnQzMl90IGRJbnN0YW5jZU5hbWVIYXNoID0KKyAgICAgICAgRlhfSGFzaENvZGVfR2V0Vyh3c0luc3RhbmNlTmFtZS5Bc1N0cmluZ1ZpZXcoKSwgZmFsc2UpOworICAgIENYRkFfTm9kZSogcFByZXZTaWJsaW5nID0gaURlc2lyZWQgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gR2V0WEZBTm9kZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHZXRYRkFOb2RlKCktPkdldEl0ZW1JZkV4aXN0cyhpRGVzaXJlZCAtIDEpOworICAgIGlmICghcFByZXZTaWJsaW5nKSB7CisgICAgICAvLyBUT0RPKGRzaW5jbGFpcik6IEJldHRlciBlcnJvcj8KKyAgICAgIFRocm93SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgd2hpbGUgKGlDb3VudCA+IGlEZXNpcmVkKSB7CisgICAgICBDWEZBX05vZGUqIHBSZW1vdmVJbnN0YW5jZSA9IHBQcmV2U2libGluZy0+R2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgIGlmIChwUmVtb3ZlSW5zdGFuY2UtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm0gJiYKKyAgICAgICAgICBwUmVtb3ZlSW5zdGFuY2UtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm1TZXQpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAocFJlbW92ZUluc3RhbmNlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpJbnN0YW5jZU1hbmFnZXIpIHsKKyAgICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChwUmVtb3ZlSW5zdGFuY2UtPkdldE5hbWVIYXNoKCkgPT0gZEluc3RhbmNlTmFtZUhhc2gpIHsKKyAgICAgICAgR2V0WEZBTm9kZSgpLT5SZW1vdmVJdGVtKHBSZW1vdmVJbnN0YW5jZSwgdHJ1ZSk7CisgICAgICAgIGlDb3VudC0tOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICB3aGlsZSAoaUNvdW50IDwgaURlc2lyZWQpIHsKKyAgICAgIENYRkFfTm9kZSogcE5ld0luc3RhbmNlID0gR2V0WEZBTm9kZSgpLT5DcmVhdGVJbnN0YW5jZUlmUG9zc2libGUodHJ1ZSk7CisgICAgICBpZiAoIXBOZXdJbnN0YW5jZSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgIEdldFhGQU5vZGUoKS0+SW5zZXJ0SXRlbShwTmV3SW5zdGFuY2UsIGlDb3VudCwgaUNvdW50LCBmYWxzZSk7CisgICAgICArK2lDb3VudDsKKworICAgICAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IEdldERvY3VtZW50KCktPkdldE5vdGlmeSgpOworICAgICAgaWYgKCFwTm90aWZ5KQorICAgICAgICByZXR1cm4gMDsKKworICAgICAgcE5vdGlmeS0+UnVuTm9kZUluaXRpYWxpemUocE5ld0luc3RhbmNlKTsKKyAgICB9CisgIH0KKworICBDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dFBybyA9IEdldERvY3VtZW50KCktPkdldExheW91dFByb2Nlc3NvcigpOworICBpZiAocExheW91dFBybykgeworICAgIHBMYXlvdXRQcm8tPkFkZENoYW5nZWRDb250YWluZXIoCisgICAgICAgIFRvTm9kZShHZXREb2N1bWVudCgpLT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0Zvcm0pKSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgQ0pYX0luc3RhbmNlTWFuYWdlcjo6TW92ZUluc3RhbmNlKGludDMyX3QgaVRvLCBpbnQzMl90IGlGcm9tKSB7CisgIGludDMyX3QgaUNvdW50ID0gR2V0WEZBTm9kZSgpLT5HZXRDb3VudCgpOworICBpZiAoaUZyb20gPiBpQ291bnQgfHwgaVRvID4gaUNvdW50IC0gMSkgeworICAgIFRocm93SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChpRnJvbSA8IDAgfHwgaVRvIDwgMCB8fCBpRnJvbSA9PSBpVG8pCisgICAgcmV0dXJuIDA7CisKKyAgQ1hGQV9Ob2RlKiBwTW92ZUluc3RhbmNlID0gR2V0WEZBTm9kZSgpLT5HZXRJdGVtSWZFeGlzdHMoaUZyb20pOworICBpZiAoIXBNb3ZlSW5zdGFuY2UpIHsKKyAgICBUaHJvd0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIEdldFhGQU5vZGUoKS0+UmVtb3ZlSXRlbShwTW92ZUluc3RhbmNlLCBmYWxzZSk7CisgIEdldFhGQU5vZGUoKS0+SW5zZXJ0SXRlbShwTW92ZUluc3RhbmNlLCBpVG8sIGlDb3VudCAtIDEsIHRydWUpOworICBDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dFBybyA9IEdldERvY3VtZW50KCktPkdldExheW91dFByb2Nlc3NvcigpOworICBpZiAocExheW91dFBybykgeworICAgIHBMYXlvdXRQcm8tPkFkZENoYW5nZWRDb250YWluZXIoCisgICAgICAgIFRvTm9kZShHZXREb2N1bWVudCgpLT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0Zvcm0pKSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0luc3RhbmNlTWFuYWdlcjo6bW92ZUluc3RhbmNlKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAyKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBpbnQzMl90IGlGcm9tID0gcnVudGltZS0+VG9JbnQzMihwYXJhbXNbMF0pOworICBpbnQzMl90IGlUbyA9IHJ1bnRpbWUtPlRvSW50MzIocGFyYW1zWzFdKTsKKyAgTW92ZUluc3RhbmNlKGlUbywgaUZyb20pOworCisgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBHZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKKyAgaWYgKCFwTm90aWZ5KQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIENYRkFfTm9kZSogcFRvSW5zdGFuY2UgPSBHZXRYRkFOb2RlKCktPkdldEl0ZW1JZkV4aXN0cyhpVG8pOworICBpZiAocFRvSW5zdGFuY2UgJiYgcFRvSW5zdGFuY2UtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm0pCisgICAgcE5vdGlmeS0+UnVuU3ViZm9ybUluZGV4Q2hhbmdlKHBUb0luc3RhbmNlKTsKKworICBDWEZBX05vZGUqIHBGcm9tSW5zdGFuY2UgPSBHZXRYRkFOb2RlKCktPkdldEl0ZW1JZkV4aXN0cyhpRnJvbSk7CisgIGlmIChwRnJvbUluc3RhbmNlICYmCisgICAgICBwRnJvbUluc3RhbmNlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpTdWJmb3JtKSB7CisgICAgcE5vdGlmeS0+UnVuU3ViZm9ybUluZGV4Q2hhbmdlKHBGcm9tSW5zdGFuY2UpOworICB9CisKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0luc3RhbmNlTWFuYWdlcjo6cmVtb3ZlSW5zdGFuY2UoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIGludDMyX3QgaUluZGV4ID0gcnVudGltZS0+VG9JbnQzMihwYXJhbXNbMF0pOworICBpbnQzMl90IGlDb3VudCA9IEdldFhGQU5vZGUoKS0+R2V0Q291bnQoKTsKKyAgaWYgKGlJbmRleCA8IDAgfHwgaUluZGV4ID49IGlDb3VudCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtJbnZhbGlkSW5wdXRFcnJvcikpOworCisgIENYRkFfT2NjdXIqIG9jY3VyID0gR2V0WEZBTm9kZSgpLT5HZXRPY2N1cklmRXhpc3RzKCk7CisgIGludDMyX3QgaU1pbiA9IG9jY3VyID8gb2NjdXItPkdldE1pbigpIDogQ1hGQV9PY2N1cjo6a0RlZmF1bHRNaW47CisgIGlmIChpQ291bnQgLSAxIDwgaU1pbikKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtUb29NYW55T2NjdXJhbmNlcykpOworCisgIENYRkFfTm9kZSogcFJlbW92ZUluc3RhbmNlID0gR2V0WEZBTm9kZSgpLT5HZXRJdGVtSWZFeGlzdHMoaUluZGV4KTsKKyAgaWYgKCFwUmVtb3ZlSW5zdGFuY2UpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIEdldFhGQU5vZGUoKS0+UmVtb3ZlSXRlbShwUmVtb3ZlSW5zdGFuY2UsIHRydWUpOworCisgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBHZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKKyAgaWYgKHBOb3RpZnkpIHsKKyAgICBmb3IgKGludDMyX3QgaSA9IGlJbmRleDsgaSA8IGlDb3VudCAtIDE7IGkrKykgeworICAgICAgQ1hGQV9Ob2RlKiBwU3ViZm9ybUluc3RhbmNlID0gR2V0WEZBTm9kZSgpLT5HZXRJdGVtSWZFeGlzdHMoaSk7CisgICAgICBpZiAocFN1YmZvcm1JbnN0YW5jZSAmJgorICAgICAgICAgIHBTdWJmb3JtSW5zdGFuY2UtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm0pIHsKKyAgICAgICAgcE5vdGlmeS0+UnVuU3ViZm9ybUluZGV4Q2hhbmdlKHBTdWJmb3JtSW5zdGFuY2UpOworICAgICAgfQorICAgIH0KKyAgfQorICBDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dFBybyA9IEdldERvY3VtZW50KCktPkdldExheW91dFByb2Nlc3NvcigpOworICBpZiAocExheW91dFBybykgeworICAgIHBMYXlvdXRQcm8tPkFkZENoYW5nZWRDb250YWluZXIoCisgICAgICAgIFRvTm9kZShHZXREb2N1bWVudCgpLT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0Zvcm0pKSk7CisgIH0KKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0luc3RhbmNlTWFuYWdlcjo6c2V0SW5zdGFuY2VzKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBTZXRJbnN0YW5jZXMocnVudGltZS0+VG9JbnQzMihwYXJhbXNbMF0pKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0luc3RhbmNlTWFuYWdlcjo6YWRkSW5zdGFuY2UoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmICghcGFyYW1zLmVtcHR5KCkgJiYgcGFyYW1zLnNpemUoKSAhPSAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBib29sIGZGbGFncyA9IHRydWU7CisgIGlmIChwYXJhbXMuc2l6ZSgpID09IDEpCisgICAgZkZsYWdzID0gcnVudGltZS0+VG9Cb29sZWFuKHBhcmFtc1swXSk7CisKKyAgaW50MzJfdCBpQ291bnQgPSBHZXRYRkFOb2RlKCktPkdldENvdW50KCk7CisgIENYRkFfT2NjdXIqIG9jY3VyID0gR2V0WEZBTm9kZSgpLT5HZXRPY2N1cklmRXhpc3RzKCk7CisgIGludDMyX3QgaU1heCA9IG9jY3VyID8gb2NjdXItPkdldE1heCgpIDogQ1hGQV9PY2N1cjo6a0RlZmF1bHRNYXg7CisgIGlmIChpTWF4ID49IDAgJiYgaUNvdW50ID49IGlNYXgpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprVG9vTWFueU9jY3VyYW5jZXMpKTsKKworICBDWEZBX05vZGUqIHBOZXdJbnN0YW5jZSA9IEdldFhGQU5vZGUoKS0+Q3JlYXRlSW5zdGFuY2VJZlBvc3NpYmxlKGZGbGFncyk7CisgIGlmICghcE5ld0luc3RhbmNlKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld051bGwoKSk7CisKKyAgR2V0WEZBTm9kZSgpLT5JbnNlcnRJdGVtKHBOZXdJbnN0YW5jZSwgaUNvdW50LCBpQ291bnQsIGZhbHNlKTsKKworICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gR2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCk7CisgIGlmIChwTm90aWZ5KSB7CisgICAgcE5vdGlmeS0+UnVuTm9kZUluaXRpYWxpemUocE5ld0luc3RhbmNlKTsKKworICAgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvID0gR2V0RG9jdW1lbnQoKS0+R2V0TGF5b3V0UHJvY2Vzc29yKCk7CisgICAgaWYgKHBMYXlvdXRQcm8pIHsKKyAgICAgIHBMYXlvdXRQcm8tPkFkZENoYW5nZWRDb250YWluZXIoCisgICAgICAgICAgVG9Ob2RlKEdldERvY3VtZW50KCktPkdldFhGQU9iamVjdChYRkFfSEFTSENPREVfRm9ybSkpKTsKKyAgICB9CisgIH0KKworICBDRlhKU0VfVmFsdWUqIHZhbHVlID0KKyAgICAgIEdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocE5ld0luc3RhbmNlKTsKKyAgaWYgKCF2YWx1ZSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdOdWxsKCkpOworCisgIHJldHVybiBDSlNfUmV0dXJuKHZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpLkdldChydW50aW1lLT5HZXRJc29sYXRlKCkpKTsKK30KKworQ0pTX1JldHVybiBDSlhfSW5zdGFuY2VNYW5hZ2VyOjppbnNlcnRJbnN0YW5jZSgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSAmJiBwYXJhbXMuc2l6ZSgpICE9IDIpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIGludDMyX3QgaUluZGV4ID0gcnVudGltZS0+VG9JbnQzMihwYXJhbXNbMF0pOworICBib29sIGJCaW5kID0gZmFsc2U7CisgIGlmIChwYXJhbXMuc2l6ZSgpID09IDIpCisgICAgYkJpbmQgPSBydW50aW1lLT5Ub0Jvb2xlYW4ocGFyYW1zWzFdKTsKKworICBpbnQzMl90IGlDb3VudCA9IEdldFhGQU5vZGUoKS0+R2V0Q291bnQoKTsKKyAgaWYgKGlJbmRleCA8IDAgfHwgaUluZGV4ID4gaUNvdW50KQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a0ludmFsaWRJbnB1dEVycm9yKSk7CisKKyAgQ1hGQV9PY2N1ciogb2NjdXIgPSBHZXRYRkFOb2RlKCktPkdldE9jY3VySWZFeGlzdHMoKTsKKyAgaW50MzJfdCBpTWF4ID0gb2NjdXIgPyBvY2N1ci0+R2V0TWF4KCkgOiBDWEZBX09jY3VyOjprRGVmYXVsdE1heDsKKyAgaWYgKGlNYXggPj0gMCAmJiBpQ291bnQgPj0gaU1heCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtJbnZhbGlkSW5wdXRFcnJvcikpOworCisgIENYRkFfTm9kZSogcE5ld0luc3RhbmNlID0gR2V0WEZBTm9kZSgpLT5DcmVhdGVJbnN0YW5jZUlmUG9zc2libGUoYkJpbmQpOworICBpZiAoIXBOZXdJbnN0YW5jZSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdOdWxsKCkpOworCisgIEdldFhGQU5vZGUoKS0+SW5zZXJ0SXRlbShwTmV3SW5zdGFuY2UsIGlJbmRleCwgaUNvdW50LCB0cnVlKTsKKworICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gR2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCk7CisgIGlmIChwTm90aWZ5KSB7CisgICAgcE5vdGlmeS0+UnVuTm9kZUluaXRpYWxpemUocE5ld0luc3RhbmNlKTsKKyAgICBDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dFBybyA9IEdldERvY3VtZW50KCktPkdldExheW91dFByb2Nlc3NvcigpOworICAgIGlmIChwTGF5b3V0UHJvKSB7CisgICAgICBwTGF5b3V0UHJvLT5BZGRDaGFuZ2VkQ29udGFpbmVyKAorICAgICAgICAgIFRvTm9kZShHZXREb2N1bWVudCgpLT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0Zvcm0pKSk7CisgICAgfQorICB9CisKKyAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9CisgICAgICBHZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBOZXdJbnN0YW5jZSk7CisgIGlmICghdmFsdWUpCisgICAgcmV0dXJuIENKU19SZXR1cm4ocnVudGltZS0+TmV3TnVsbCgpKTsKKworICByZXR1cm4gQ0pTX1JldHVybih2YWx1ZS0+RGlyZWN0R2V0VmFsdWUoKS5HZXQocnVudGltZS0+R2V0SXNvbGF0ZSgpKSk7Cit9CisKK3ZvaWQgQ0pYX0luc3RhbmNlTWFuYWdlcjo6bWF4KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBpZiAoYlNldHRpbmcpIHsKKyAgICBUaHJvd0ludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorICBDWEZBX09jY3VyKiBvY2N1ciA9IEdldFhGQU5vZGUoKS0+R2V0T2NjdXJJZkV4aXN0cygpOworICBwVmFsdWUtPlNldEludGVnZXIob2NjdXIgPyBvY2N1ci0+R2V0TWF4KCkgOiBDWEZBX09jY3VyOjprRGVmYXVsdE1heCk7Cit9CisKK3ZvaWQgQ0pYX0luc3RhbmNlTWFuYWdlcjo6bWluKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBpZiAoYlNldHRpbmcpIHsKKyAgICBUaHJvd0ludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorICBDWEZBX09jY3VyKiBvY2N1ciA9IEdldFhGQU5vZGUoKS0+R2V0T2NjdXJJZkV4aXN0cygpOworICBwVmFsdWUtPlNldEludGVnZXIob2NjdXIgPyBvY2N1ci0+R2V0TWluKCkgOiBDWEZBX09jY3VyOjprRGVmYXVsdE1pbik7Cit9CisKK3ZvaWQgQ0pYX0luc3RhbmNlTWFuYWdlcjo6Y291bnQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBpZiAoYlNldHRpbmcpIHsKKyAgICBwVmFsdWUtPlNldEludGVnZXIoR2V0WEZBTm9kZSgpLT5HZXRDb3VudCgpKTsKKyAgICByZXR1cm47CisgIH0KKyAgU2V0SW5zdGFuY2VzKHBWYWx1ZS0+VG9JbnRlZ2VyKCkpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2luc3RhbmNlbWFuYWdlci5oIGIvZnhqcy94ZmEvY2p4X2luc3RhbmNlbWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZWZhZDUKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfaW5zdGFuY2VtYW5hZ2VyLmgKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9JTlNUQU5DRU1BTkFHRVJfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0lOU1RBTkNFTUFOQUdFUl9IXworCisjaW5jbHVkZSAiZnhqcy9DSlhfRGVmaW5lLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9JbnN0YW5jZU1hbmFnZXI7CisKK2NsYXNzIENKWF9JbnN0YW5jZU1hbmFnZXIgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0luc3RhbmNlTWFuYWdlcihDWEZBX0luc3RhbmNlTWFuYWdlciogbWdyKTsKKyAgfkNKWF9JbnN0YW5jZU1hbmFnZXIoKSBvdmVycmlkZTsKKworICBKU19NRVRIT0QoYWRkSW5zdGFuY2UsIENKWF9JbnN0YW5jZU1hbmFnZXIpOworICBKU19NRVRIT0QoaW5zZXJ0SW5zdGFuY2UsIENKWF9JbnN0YW5jZU1hbmFnZXIpOworICBKU19NRVRIT0QobW92ZUluc3RhbmNlLCBDSlhfSW5zdGFuY2VNYW5hZ2VyKTsKKyAgSlNfTUVUSE9EKHJlbW92ZUluc3RhbmNlLCBDSlhfSW5zdGFuY2VNYW5hZ2VyKTsKKyAgSlNfTUVUSE9EKHNldEluc3RhbmNlcywgQ0pYX0luc3RhbmNlTWFuYWdlcik7CisKKyAgSlNfUFJPUChjb3VudCk7CisgIEpTX1BST1AobWF4KTsKKyAgSlNfUFJPUChtaW4pOworCisgIGludDMyX3QgTW92ZUluc3RhbmNlKGludDMyX3QgaVRvLCBpbnQzMl90IGlGcm9tKTsKKworIHByaXZhdGU6CisgIGludDMyX3QgU2V0SW5zdGFuY2VzKGludDMyX3QgaURlc2lyZWQpOworCisgIHN0YXRpYyBjb25zdCBDSlhfTWV0aG9kU3BlYyBNZXRob2RTcGVjc1tdOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfSU5TVEFOQ0VNQU5BR0VSX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfaW50ZWdlci5jcHAgYi9meGpzL3hmYS9janhfaW50ZWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4NDBkZAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9pbnRlZ2VyLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfaW50ZWdlci5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW50ZWdlci5oIgorCitDSlhfSW50ZWdlcjo6Q0pYX0ludGVnZXIoQ1hGQV9JbnRlZ2VyKiBub2RlKSA6IENKWF9Db250ZW50KG5vZGUpIHt9CisKK0NKWF9JbnRlZ2VyOjp+Q0pYX0ludGVnZXIoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX0ludGVnZXI6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfSW50ZWdlcjo6ZGVmYXVsdFZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9JbnRlZ2VyOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0ludGVnZXI6OnZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBkZWZhdWx0VmFsdWUocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfaW50ZWdlci5oIGIvZnhqcy94ZmEvY2p4X2ludGVnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGRhYWJmCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2ludGVnZXIuaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0lOVEVHRVJfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0lOVEVHRVJfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9jb250ZW50LmgiCisKK2NsYXNzIENYRkFfSW50ZWdlcjsKKworY2xhc3MgQ0pYX0ludGVnZXIgOiBwdWJsaWMgQ0pYX0NvbnRlbnQgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0ludGVnZXIoQ1hGQV9JbnRlZ2VyKiBub2RlKTsKKyAgfkNKWF9JbnRlZ2VyKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChkZWZhdWx0VmFsdWUpOyAvKiB7ZGVmYXVsdH0gKi8KKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworICBKU19QUk9QKHZhbHVlKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0lOVEVHRVJfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9pc3N1ZXJzLmNwcCBiL2Z4anMveGZhL2NqeF9pc3N1ZXJzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2QzODFkCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2lzc3VlcnMuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9pc3N1ZXJzLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pc3N1ZXJzLmgiCisKK0NKWF9Jc3N1ZXJzOjpDSlhfSXNzdWVycyhDWEZBX0lzc3VlcnMqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX0lzc3VlcnM6On5DSlhfSXNzdWVycygpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfSXNzdWVyczo6dHlwZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Jc3N1ZXJzOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0lzc3VlcnM6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9pc3N1ZXJzLmggYi9meGpzL3hmYS9janhfaXNzdWVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNzZlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfaXNzdWVycy5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfSVNTVUVSU19IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfSVNTVUVSU19IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9Jc3N1ZXJzOworCitjbGFzcyBDSlhfSXNzdWVycyA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfSXNzdWVycyhDWEZBX0lzc3VlcnMqIG5vZGUpOworICB+Q0pYX0lzc3VlcnMoKSBvdmVycmlkZTsKKworICBKU19QUk9QKHR5cGUpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9JU1NVRVJTX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfaXRlbXMuY3BwIGIvZnhqcy94ZmEvY2p4X2l0ZW1zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGFmZGQwCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2l0ZW1zLmNwcApAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfaXRlbXMuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2l0ZW1zLmgiCisKK0NKWF9JdGVtczo6Q0pYX0l0ZW1zKENYRkFfSXRlbXMqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX0l0ZW1zOjp+Q0pYX0l0ZW1zKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9JdGVtczo6cmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0l0ZW1zOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfSXRlbXM6OnByZXNlbmNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9JdGVtczo6c2F2ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0l0ZW1zOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9pdGVtcy5oIGIvZnhqcy94ZmEvY2p4X2l0ZW1zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRmMmI0MwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9pdGVtcy5oCkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfSVRFTVNfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0lURU1TX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX0l0ZW1zOworCitjbGFzcyBDSlhfSXRlbXMgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0l0ZW1zKENYRkFfSXRlbXMqIG5vZGUpOworICB+Q0pYX0l0ZW1zKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChwcmVzZW5jZSk7CisgIEpTX1BST1AocmVmKTsKKyAgSlNfUFJPUChzYXZlKTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfSVRFTVNfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9rZWVwLmNwcCBiL2Z4anMveGZhL2NqeF9rZWVwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTIzOGUzCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2tlZXAuY3BwCkBAIC0wLDAgKzEsNDMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9rZWVwLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9rZWVwLmgiCisKK0NKWF9LZWVwOjpDSlhfS2VlcChDWEZBX0tlZXAqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX0tlZXA6On5DSlhfS2VlcCgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfS2VlcDo6bmV4dChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9LZWVwOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0tlZXA6OnByZXZpb3VzKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfS2VlcDo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9LZWVwOjppbnRhY3QoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfa2VlcC5oIGIvZnhqcy94ZmEvY2p4X2tlZXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYThhMTExCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2tlZXAuaApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0tFRVBfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0tFRVBfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfS2VlcDsKKworY2xhc3MgQ0pYX0tlZXAgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0tlZXAoQ1hGQV9LZWVwKiBub2RlKTsKKyAgfkNKWF9LZWVwKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChpbnRhY3QpOworICBKU19QUk9QKG5leHQpOworICBKU19QUk9QKHByZXZpb3VzKTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfS0VFUF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2tleXVzYWdlLmNwcCBiL2Z4anMveGZhL2NqeF9rZXl1c2FnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk5NDdlOQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9rZXl1c2FnZS5jcHAKQEAgLTAsMCArMSw4NSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2tleXVzYWdlLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9rZXl1c2FnZS5oIgorCitDSlhfS2V5VXNhZ2U6OkNKWF9LZXlVc2FnZShDWEZBX0tleVVzYWdlKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9LZXlVc2FnZTo6fkNKWF9LZXlVc2FnZSgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfS2V5VXNhZ2U6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9LZXlVc2FnZTo6bm9uUmVwdWRpYXRpb24oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0tleVVzYWdlOjplbmNpcGhlck9ubHkoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfS2V5VXNhZ2U6OnR5cGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9LZXlVc2FnZTo6ZGlnaXRhbFNpZ25hdHVyZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0tleVVzYWdlOjpjcmxTaWduKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfS2V5VXNhZ2U6OmtleUFncmVlbWVudChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9LZXlVc2FnZTo6a2V5RW5jaXBoZXJtZW50KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0tleVVzYWdlOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfS2V5VXNhZ2U6OmRhdGFFbmNpcGhlcm1lbnQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9LZXlVc2FnZTo6a2V5Q2VydFNpZ24oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0tleVVzYWdlOjpkZWNpcGhlck9ubHkoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9rZXl1c2FnZS5oIGIvZnhqcy94ZmEvY2p4X2tleXVzYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZmNTQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9rZXl1c2FnZS5oCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfS0VZVVNBR0VfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0tFWVVTQUdFX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX0tleVVzYWdlOworCitjbGFzcyBDSlhfS2V5VXNhZ2UgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0tleVVzYWdlKENYRkFfS2V5VXNhZ2UqIG5vZGUpOworICB+Q0pYX0tleVVzYWdlKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChjcmxTaWduKTsKKyAgSlNfUFJPUChkYXRhRW5jaXBoZXJtZW50KTsKKyAgSlNfUFJPUChkZWNpcGhlck9ubHkpOworICBKU19QUk9QKGRpZ2l0YWxTaWduYXR1cmUpOworICBKU19QUk9QKGVuY2lwaGVyT25seSk7CisgIEpTX1BST1Aoa2V5QWdyZWVtZW50KTsKKyAgSlNfUFJPUChrZXlDZXJ0U2lnbik7CisgIEpTX1BST1Aoa2V5RW5jaXBoZXJtZW50KTsKKyAgSlNfUFJPUChub25SZXB1ZGlhdGlvbik7CisgIEpTX1BST1AodHlwZSk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0tFWVVTQUdFX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfbGF5b3V0cHNldWRvbW9kZWwuY3BwIGIvZnhqcy94ZmEvY2p4X2xheW91dHBzZXVkb21vZGVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODRiZDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2xheW91dHBzZXVkb21vZGVsLmNwcApAQCAtMCwwICsxLDQ4MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2xheW91dHBzZXVkb21vZGVsLmgiCisKKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisjaW5jbHVkZSAiZnhqcy9jZnhqc2VfZW5naW5lLmgiCisjaW5jbHVkZSAiZnhqcy9jZnhqc2VfdmFsdWUuaCIKKyNpbmNsdWRlICJmeGpzL2pzX3Jlc291cmNlcy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZub3RpZnkuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9sYXlvdXRwc2V1ZG9tb2RlbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2FycmF5bm9kZWxpc3QuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb250YWluZXJsYXlvdXRpdGVtLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9mb3JtLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0aXRlbS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dHByb2Nlc3Nvci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21lYXN1cmVtZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGVpdGVyYXRvcnRlbXBsYXRlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhdmVyc2VzdHJhdGVneV9jb250ZW50bGF5b3V0aXRlbS5oIgorCitjb25zdCBDSlhfTWV0aG9kU3BlYyBDSlhfTGF5b3V0UHNldWRvTW9kZWw6Ok1ldGhvZFNwZWNzW10gPSB7CisgICAgeyJhYnNQYWdlIiwgYWJzUGFnZV9zdGF0aWN9LAorICAgIHsiYWJzUGFnZUNvdW50IiwgYWJzUGFnZUNvdW50X3N0YXRpY30sCisgICAgeyJhYnNQYWdlQ291bnRJbkJhdGNoIiwgYWJzUGFnZUNvdW50SW5CYXRjaF9zdGF0aWN9LAorICAgIHsiYWJzUGFnZUluQmF0Y2giLCBhYnNQYWdlSW5CYXRjaF9zdGF0aWN9LAorICAgIHsiYWJzUGFnZVNwYW4iLCBhYnNQYWdlU3Bhbl9zdGF0aWN9LAorICAgIHsiaCIsIGhfc3RhdGljfSwKKyAgICB7InBhZ2UiLCBwYWdlX3N0YXRpY30sCisgICAgeyJwYWdlQ29udGVudCIsIHBhZ2VDb250ZW50X3N0YXRpY30sCisgICAgeyJwYWdlQ291bnQiLCBwYWdlQ291bnRfc3RhdGljfSwKKyAgICB7InBhZ2VTcGFuIiwgcGFnZVNwYW5fc3RhdGljfSwKKyAgICB7InJlbGF5b3V0IiwgcmVsYXlvdXRfc3RhdGljfSwKKyAgICB7InJlbGF5b3V0UGFnZUFyZWEiLCByZWxheW91dFBhZ2VBcmVhX3N0YXRpY30sCisgICAgeyJzaGVldCIsIHNoZWV0X3N0YXRpY30sCisgICAgeyJzaGVldENvdW50Iiwgc2hlZXRDb3VudF9zdGF0aWN9LAorICAgIHsic2hlZXRDb3VudEluQmF0Y2giLCBzaGVldENvdW50SW5CYXRjaF9zdGF0aWN9LAorICAgIHsic2hlZXRJbkJhdGNoIiwgc2hlZXRJbkJhdGNoX3N0YXRpY30sCisgICAgeyJ3Iiwgd19zdGF0aWN9LAorICAgIHsieCIsIHhfc3RhdGljfSwKKyAgICB7InkiLCB5X3N0YXRpY319OworCitDSlhfTGF5b3V0UHNldWRvTW9kZWw6OkNKWF9MYXlvdXRQc2V1ZG9Nb2RlbChDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsKiBtb2RlbCkKKyAgICA6IENKWF9PYmplY3QobW9kZWwpIHsKKyAgRGVmaW5lTWV0aG9kcyhNZXRob2RTcGVjcywgRlhfQXJyYXlTaXplKE1ldGhvZFNwZWNzKSk7Cit9CisKK0NKWF9MYXlvdXRQc2V1ZG9Nb2RlbDo6fkNKWF9MYXlvdXRQc2V1ZG9Nb2RlbCgpIHt9CisKK3ZvaWQgQ0pYX0xheW91dFBzZXVkb01vZGVsOjpyZWFkeShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gR2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCk7CisgIGlmICghcE5vdGlmeSkKKyAgICByZXR1cm47CisgIGlmIChiU2V0dGluZykgeworICAgIFRocm93RXhjZXB0aW9uKEwiVW5hYmxlIHRvIHNldCByZWFkeSB2YWx1ZS4iKTsKKyAgICByZXR1cm47CisgIH0KKworICBpbnQzMl90IGlTdGF0dXMgPSBwTm90aWZ5LT5HZXRMYXlvdXRTdGF0dXMoKTsKKyAgcFZhbHVlLT5TZXRCb29sZWFuKGlTdGF0dXMgPj0gMik7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0xheW91dFBzZXVkb01vZGVsOjpIV1hZKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcywKKyAgICBYRkFfTEFZT1VUTU9ERUxfSFdYWSBsYXlvdXRNb2RlbCkgeworICBpZiAocGFyYW1zLmVtcHR5KCkgfHwgcGFyYW1zLnNpemUoKSA+IDMpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENYRkFfTm9kZSogcE5vZGUgPSBUb05vZGUocnVudGltZS0+VG9YRkFPYmplY3QocGFyYW1zWzBdKSk7CisgIGlmICghcE5vZGUpCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgV2lkZVN0cmluZyB1bml0KEwicHQiKTsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMikgeworICAgIFdpZGVTdHJpbmcgdG1wX3VuaXQgPSBydW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzFdKTsKKyAgICBpZiAoIXRtcF91bml0LklzRW1wdHkoKSkKKyAgICAgIHVuaXQgPSB0bXBfdW5pdDsKKyAgfQorICBpbnQzMl90IGlJbmRleCA9IHBhcmFtcy5zaXplKCkgPj0gMyA/IHJ1bnRpbWUtPlRvSW50MzIocGFyYW1zWzJdKSA6IDA7CisKKyAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBEb2NMYXlvdXQgPSBHZXREb2N1bWVudCgpLT5HZXREb2NMYXlvdXQoKTsKKyAgaWYgKCFwRG9jTGF5b3V0KQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0gPSBwRG9jTGF5b3V0LT5HZXRMYXlvdXRJdGVtKHBOb2RlKTsKKyAgaWYgKCFwTGF5b3V0SXRlbSkKKyAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKworICB3aGlsZSAoaUluZGV4ID4gMCAmJiBwTGF5b3V0SXRlbSkgeworICAgIHBMYXlvdXRJdGVtID0gcExheW91dEl0ZW0tPkdldE5leHQoKTsKKyAgICAtLWlJbmRleDsKKyAgfQorCisgIGlmICghcExheW91dEl0ZW0pCisgICAgcmV0dXJuIENKU19SZXR1cm4ocnVudGltZS0+TmV3TnVtYmVyKDAuMCkpOworCisgIENYRkFfTWVhc3VyZW1lbnQgbWVhc3VyZTsKKyAgQ0ZYX1JlY3RGIHJ0UmVjdCA9IHBMYXlvdXRJdGVtLT5HZXRSZWN0KHRydWUpOworICBzd2l0Y2ggKGxheW91dE1vZGVsKSB7CisgICAgY2FzZSBYRkFfTEFZT1VUTU9ERUxfSDoKKyAgICAgIG1lYXN1cmUuU2V0KHJ0UmVjdC5oZWlnaHQsIFhGQV9Vbml0OjpQdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9MQVlPVVRNT0RFTF9XOgorICAgICAgbWVhc3VyZS5TZXQocnRSZWN0LndpZHRoLCBYRkFfVW5pdDo6UHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfTEFZT1VUTU9ERUxfWDoKKyAgICAgIG1lYXN1cmUuU2V0KHJ0UmVjdC5sZWZ0LCBYRkFfVW5pdDo6UHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfTEFZT1VUTU9ERUxfWToKKyAgICAgIG1lYXN1cmUuU2V0KHJ0UmVjdC50b3AsIFhGQV9Vbml0OjpQdCk7CisgICAgICBicmVhazsKKyAgfQorCisgIGZsb2F0IGZWYWx1ZSA9CisgICAgICBtZWFzdXJlLlRvVW5pdChDWEZBX01lYXN1cmVtZW50OjpHZXRVbml0RnJvbVN0cmluZyh1bml0LkFzU3RyaW5nVmlldygpKSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld051bWJlcihGWFNZU19yb3VuZChmVmFsdWUgKiAxMDAwKSAvIDEwMDAuMGYpKTsKK30KKworQ0pTX1JldHVybiBDSlhfTGF5b3V0UHNldWRvTW9kZWw6OmgoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBIV1hZKHJ1bnRpbWUsIHBhcmFtcywgWEZBX0xBWU9VVE1PREVMX0gpOworfQorCitDSlNfUmV0dXJuIENKWF9MYXlvdXRQc2V1ZG9Nb2RlbDo6dygKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIEhXWFkocnVudGltZSwgcGFyYW1zLCBYRkFfTEFZT1VUTU9ERUxfVyk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0xheW91dFBzZXVkb01vZGVsOjp4KAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gSFdYWShydW50aW1lLCBwYXJhbXMsIFhGQV9MQVlPVVRNT0RFTF9YKTsKK30KKworQ0pTX1JldHVybiBDSlhfTGF5b3V0UHNldWRvTW9kZWw6OnkoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBIV1hZKHJ1bnRpbWUsIHBhcmFtcywgWEZBX0xBWU9VVE1PREVMX1kpOworfQorCitDSlNfUmV0dXJuIENKWF9MYXlvdXRQc2V1ZG9Nb2RlbDo6TnVtYmVyZWRQYWdlQ291bnQoQ0pTX1Y4KiBydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk51bWJlcmVkKSB7CisgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwRG9jTGF5b3V0ID0gR2V0RG9jdW1lbnQoKS0+R2V0RG9jTGF5b3V0KCk7CisgIGlmICghcERvY0xheW91dCkKKyAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKworICBpbnQzMl90IGlQYWdlQ291bnQgPSAwOworICBpbnQzMl90IGlQYWdlTnVtID0gcERvY0xheW91dC0+Q291bnRQYWdlcygpOworICBpZiAoYk51bWJlcmVkKSB7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVBhZ2VOdW07IGkrKykgeworICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwTGF5b3V0UGFnZSA9IHBEb2NMYXlvdXQtPkdldFBhZ2UoaSk7CisgICAgICBpZiAoIXBMYXlvdXRQYWdlKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgQ1hGQV9Ob2RlKiBwTWFzdGVyUGFnZSA9IHBMYXlvdXRQYWdlLT5HZXRNYXN0ZXJQYWdlKCk7CisgICAgICBpZiAocE1hc3RlclBhZ2UtPkpTT2JqZWN0KCktPkdldEludGVnZXIoWEZBX0F0dHJpYnV0ZTo6TnVtYmVyZWQpKQorICAgICAgICBpUGFnZUNvdW50Kys7CisgICAgfQorICB9IGVsc2UgeworICAgIGlQYWdlQ291bnQgPSBpUGFnZU51bTsKKyAgfQorICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdOdW1iZXIoaVBhZ2VDb3VudCkpOworfQorCitDSlNfUmV0dXJuIENKWF9MYXlvdXRQc2V1ZG9Nb2RlbDo6cGFnZUNvdW50KAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gTnVtYmVyZWRQYWdlQ291bnQocnVudGltZSwgdHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0xheW91dFBzZXVkb01vZGVsOjpwYWdlU3BhbigKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IFRvTm9kZShydW50aW1lLT5Ub1hGQU9iamVjdChwYXJhbXNbMF0pKTsKKyAgaWYgKCFwTm9kZSkKKyAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKworICBDWEZBX0xheW91dFByb2Nlc3NvciogcERvY0xheW91dCA9IEdldERvY3VtZW50KCktPkdldERvY0xheW91dCgpOworICBpZiAoIXBEb2NMYXlvdXQpCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSA9IHBEb2NMYXlvdXQtPkdldExheW91dEl0ZW0ocE5vZGUpOworICBpZiAoIXBMYXlvdXRJdGVtKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld051bWJlcigtMSkpOworCisgIGludDMyX3QgaUxhc3QgPSBwTGF5b3V0SXRlbS0+R2V0TGFzdCgpLT5HZXRQYWdlKCktPkdldFBhZ2VJbmRleCgpOworICBpbnQzMl90IGlGaXJzdCA9IHBMYXlvdXRJdGVtLT5HZXRGaXJzdCgpLT5HZXRQYWdlKCktPkdldFBhZ2VJbmRleCgpOworICBpbnQzMl90IGlQYWdlU3BhbiA9IGlMYXN0IC0gaUZpcnN0ICsgMTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocnVudGltZS0+TmV3TnVtYmVyKGlQYWdlU3BhbikpOworfQorCitDSlNfUmV0dXJuIENKWF9MYXlvdXRQc2V1ZG9Nb2RlbDo6cGFnZSgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIFBhZ2VJbnRlcm5hbHMocnVudGltZSwgcGFyYW1zLCBmYWxzZSk7Cit9CisKK3N0ZDo6dmVjdG9yPENYRkFfTm9kZSo+IENKWF9MYXlvdXRQc2V1ZG9Nb2RlbDo6R2V0T2JqQXJyYXkoCisgICAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBEb2NMYXlvdXQsCisgICAgaW50MzJfdCBpUGFnZU5vLAorICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzVHlwZSwKKyAgICBib29sIGJPblBhZ2VBcmVhKSB7CisgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcExheW91dFBhZ2UgPSBwRG9jTGF5b3V0LT5HZXRQYWdlKGlQYWdlTm8pOworICBpZiAoIXBMYXlvdXRQYWdlKQorICAgIHJldHVybiBzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPigpOworCisgIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+IHJldEFycmF5OworICBpZiAod3NUeXBlID09IEwicGFnZUFyZWEiKSB7CisgICAgaWYgKHBMYXlvdXRQYWdlLT5tX3BGb3JtTm9kZSkKKyAgICAgIHJldEFycmF5LnB1c2hfYmFjayhwTGF5b3V0UGFnZS0+bV9wRm9ybU5vZGUpOworICAgIHJldHVybiByZXRBcnJheTsKKyAgfQorICBpZiAod3NUeXBlID09IEwiY29udGVudEFyZWEiKSB7CisgICAgZm9yIChDWEZBX0xheW91dEl0ZW0qIHBJdGVtID0gcExheW91dFBhZ2UtPm1fcEZpcnN0Q2hpbGQ7IHBJdGVtOworICAgICAgICAgcEl0ZW0gPSBwSXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsKKyAgICAgIGlmIChwSXRlbS0+bV9wRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkNvbnRlbnRBcmVhKQorICAgICAgICByZXRBcnJheS5wdXNoX2JhY2socEl0ZW0tPm1fcEZvcm1Ob2RlKTsKKyAgICB9CisgICAgcmV0dXJuIHJldEFycmF5OworICB9CisgIHN0ZDo6c2V0PENYRkFfTm9kZSo+IGZvcm1JdGVtczsKKyAgaWYgKHdzVHlwZS5Jc0VtcHR5KCkpIHsKKyAgICBpZiAocExheW91dFBhZ2UtPm1fcEZvcm1Ob2RlKQorICAgICAgcmV0QXJyYXkucHVzaF9iYWNrKHBMYXlvdXRQYWdlLT5tX3BGb3JtTm9kZSk7CisKKyAgICBmb3IgKENYRkFfTGF5b3V0SXRlbSogcEl0ZW0gPSBwTGF5b3V0UGFnZS0+bV9wRmlyc3RDaGlsZDsgcEl0ZW07CisgICAgICAgICBwSXRlbSA9IHBJdGVtLT5tX3BOZXh0U2libGluZykgeworICAgICAgaWYgKHBJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6Q29udGVudEFyZWEpIHsKKyAgICAgICAgcmV0QXJyYXkucHVzaF9iYWNrKHBJdGVtLT5tX3BGb3JtTm9kZSk7CisgICAgICAgIGlmICghYk9uUGFnZUFyZWEpIHsKKyAgICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfQ29udGVudExheW91dEl0ZW0+CisgICAgICAgICAgaXRlcmF0b3Ioc3RhdGljX2Nhc3Q8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+KHBJdGVtLT5tX3BGaXJzdENoaWxkKSk7CisgICAgICAgICAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwSXRlbUNoaWxkID0gaXRlcmF0b3IuR2V0Q3VycmVudCgpOworICAgICAgICAgICAgICAgcEl0ZW1DaGlsZDsgcEl0ZW1DaGlsZCA9IGl0ZXJhdG9yLk1vdmVUb05leHQoKSkgeworICAgICAgICAgICAgaWYgKCFwSXRlbUNoaWxkLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBYRkFfRWxlbWVudCBlVHlwZSA9IHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRFbGVtZW50VHlwZSgpOworICAgICAgICAgICAgaWYgKGVUeXBlICE9IFhGQV9FbGVtZW50OjpGaWVsZCAmJiBlVHlwZSAhPSBYRkFfRWxlbWVudDo6RHJhdyAmJgorICAgICAgICAgICAgICAgIGVUeXBlICE9IFhGQV9FbGVtZW50OjpTdWJmb3JtICYmIGVUeXBlICE9IFhGQV9FbGVtZW50OjpBcmVhKSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBkZml1bTo6Q29udGFpbnNWYWx1ZShmb3JtSXRlbXMsIHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlKSkKKyAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGZvcm1JdGVtcy5pbnNlcnQocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUpOworICAgICAgICAgICAgcmV0QXJyYXkucHVzaF9iYWNrKHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChiT25QYWdlQXJlYSkgeworICAgICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVHJhdmVyc2VTdHJhdGVneV9Db250ZW50TGF5b3V0SXRlbT4KKyAgICAgICAgICBpdGVyYXRvcihzdGF0aWNfY2FzdDxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4ocEl0ZW0pKTsKKyAgICAgICAgICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBJdGVtQ2hpbGQgPSBpdGVyYXRvci5HZXRDdXJyZW50KCk7CisgICAgICAgICAgICAgICBwSXRlbUNoaWxkOyBwSXRlbUNoaWxkID0gaXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICBpZiAoIXBJdGVtQ2hpbGQtPklzQ29udGVudExheW91dEl0ZW0oKSkgeworICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFhGQV9FbGVtZW50IGVUeXBlID0gcEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCk7CisgICAgICAgICAgICBpZiAoZVR5cGUgIT0gWEZBX0VsZW1lbnQ6OkZpZWxkICYmIGVUeXBlICE9IFhGQV9FbGVtZW50OjpEcmF3ICYmCisgICAgICAgICAgICAgICAgZVR5cGUgIT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm0gJiYgZVR5cGUgIT0gWEZBX0VsZW1lbnQ6OkFyZWEpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGRmaXVtOjpDb250YWluc1ZhbHVlKGZvcm1JdGVtcywgcEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUpKQorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGZvcm1JdGVtcy5pbnNlcnQocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUpOworICAgICAgICAgICAgcmV0QXJyYXkucHVzaF9iYWNrKHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldEFycmF5OworICB9CisKKyAgWEZBX0VsZW1lbnQgZVR5cGUgPSBYRkFfRWxlbWVudDo6VW5rbm93bjsKKyAgaWYgKHdzVHlwZSA9PSBMImZpZWxkIikKKyAgICBlVHlwZSA9IFhGQV9FbGVtZW50OjpGaWVsZDsKKyAgZWxzZSBpZiAod3NUeXBlID09IEwiZHJhdyIpCisgICAgZVR5cGUgPSBYRkFfRWxlbWVudDo6RHJhdzsKKyAgZWxzZSBpZiAod3NUeXBlID09IEwic3ViZm9ybSIpCisgICAgZVR5cGUgPSBYRkFfRWxlbWVudDo6U3ViZm9ybTsKKyAgZWxzZSBpZiAod3NUeXBlID09IEwiYXJlYSIpCisgICAgZVR5cGUgPSBYRkFfRWxlbWVudDo6QXJlYTsKKworICBpZiAoZVR5cGUgIT0gWEZBX0VsZW1lbnQ6OlVua25vd24pIHsKKyAgICBmb3IgKENYRkFfTGF5b3V0SXRlbSogcEl0ZW0gPSBwTGF5b3V0UGFnZS0+bV9wRmlyc3RDaGlsZDsgcEl0ZW07CisgICAgICAgICBwSXRlbSA9IHBJdGVtLT5tX3BOZXh0U2libGluZykgeworICAgICAgaWYgKHBJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6Q29udGVudEFyZWEpIHsKKyAgICAgICAgaWYgKCFiT25QYWdlQXJlYSkgeworICAgICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVHJhdmVyc2VTdHJhdGVneV9Db250ZW50TGF5b3V0SXRlbT4KKyAgICAgICAgICBpdGVyYXRvcihzdGF0aWNfY2FzdDxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4ocEl0ZW0tPm1fcEZpcnN0Q2hpbGQpKTsKKyAgICAgICAgICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBJdGVtQ2hpbGQgPSBpdGVyYXRvci5HZXRDdXJyZW50KCk7CisgICAgICAgICAgICAgICBwSXRlbUNoaWxkOyBwSXRlbUNoaWxkID0gaXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICBpZiAoIXBJdGVtQ2hpbGQtPklzQ29udGVudExheW91dEl0ZW0oKSkKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gZVR5cGUpCisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKHBkZml1bTo6Q29udGFpbnNWYWx1ZShmb3JtSXRlbXMsIHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlKSkKKyAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGZvcm1JdGVtcy5pbnNlcnQocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUpOworICAgICAgICAgICAgcmV0QXJyYXkucHVzaF9iYWNrKHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChiT25QYWdlQXJlYSkgeworICAgICAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVHJhdmVyc2VTdHJhdGVneV9Db250ZW50TGF5b3V0SXRlbT4KKyAgICAgICAgICBpdGVyYXRvcihzdGF0aWNfY2FzdDxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4ocEl0ZW0pKTsKKyAgICAgICAgICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBJdGVtQ2hpbGQgPSBpdGVyYXRvci5HZXRDdXJyZW50KCk7CisgICAgICAgICAgICAgICBwSXRlbUNoaWxkOyBwSXRlbUNoaWxkID0gaXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7CisgICAgICAgICAgICBpZiAoIXBJdGVtQ2hpbGQtPklzQ29udGVudExheW91dEl0ZW0oKSkKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gZVR5cGUpCisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKHBkZml1bTo6Q29udGFpbnNWYWx1ZShmb3JtSXRlbXMsIHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlKSkKKyAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGZvcm1JdGVtcy5pbnNlcnQocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUpOworICAgICAgICAgICAgcmV0QXJyYXkucHVzaF9iYWNrKHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHJldEFycmF5OworfQorCitDSlNfUmV0dXJuIENKWF9MYXlvdXRQc2V1ZG9Nb2RlbDo6cGFnZUNvbnRlbnQoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuZW1wdHkoKSB8fCBwYXJhbXMuc2l6ZSgpID4gMykKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgaW50MzJfdCBpSW5kZXggPSAwOworICBpZiAocGFyYW1zLnNpemUoKSA+PSAxKQorICAgIGlJbmRleCA9IHJ1bnRpbWUtPlRvSW50MzIocGFyYW1zWzBdKTsKKworICBXaWRlU3RyaW5nIHdzVHlwZTsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMikKKyAgICB3c1R5cGUgPSBydW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzFdKTsKKworICBib29sIGJPblBhZ2VBcmVhID0gZmFsc2U7CisgIGlmIChwYXJhbXMuc2l6ZSgpID49IDMpCisgICAgYk9uUGFnZUFyZWEgPSBydW50aW1lLT5Ub0Jvb2xlYW4ocGFyYW1zWzJdKTsKKworICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gR2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCk7CisgIGlmICghcE5vdGlmeSkKKyAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKworICBDWEZBX0xheW91dFByb2Nlc3NvciogcERvY0xheW91dCA9IEdldERvY3VtZW50KCktPkdldERvY0xheW91dCgpOworICBpZiAoIXBEb2NMYXlvdXQpCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgYXV0byBwQXJyYXlOb2RlTGlzdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0FycmF5Tm9kZUxpc3Q+KEdldERvY3VtZW50KCkpOworICBwQXJyYXlOb2RlTGlzdC0+U2V0QXJyYXlOb2RlTGlzdCgKKyAgICAgIEdldE9iakFycmF5KHBEb2NMYXlvdXQsIGlJbmRleCwgd3NUeXBlLCBiT25QYWdlQXJlYSkpOworCisgIC8vIFRPRE8oZHNpbmNsYWlyKTogV2hvIG93bnMgdGhlIGFycmF5IG9uY2Ugd2UgcmVsZWFzZSBpdD8gV29uJ3QgdGhpcyBsZWFrPworICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdYRkFPYmplY3QoCisgICAgICBwQXJyYXlOb2RlTGlzdC5yZWxlYXNlKCksCisgICAgICBHZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpzZU5vcm1hbENsYXNzKCktPkdldFRlbXBsYXRlKCkpKTsKK30KKworQ0pTX1JldHVybiBDSlhfTGF5b3V0UHNldWRvTW9kZWw6OmFic1BhZ2VDb3VudCgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIE51bWJlcmVkUGFnZUNvdW50KHJ1bnRpbWUsIGZhbHNlKTsKK30KKworQ0pTX1JldHVybiBDSlhfTGF5b3V0UHNldWRvTW9kZWw6OmFic1BhZ2VDb3VudEluQmF0Y2goCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld051bWJlcigwKSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0xheW91dFBzZXVkb01vZGVsOjpzaGVldENvdW50SW5CYXRjaCgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIENKU19SZXR1cm4ocnVudGltZS0+TmV3TnVtYmVyKDApKTsKK30KKworQ0pTX1JldHVybiBDSlhfTGF5b3V0UHNldWRvTW9kZWw6OnJlbGF5b3V0KAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBDWEZBX05vZGUqIHBSb290Tm9kZSA9IEdldERvY3VtZW50KCktPkdldFJvb3QoKTsKKyAgQ1hGQV9Gb3JtKiBwRm9ybVJvb3QgPQorICAgICAgcFJvb3ROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX0Zvcm0+KFhGQV9FbGVtZW50OjpGb3JtKTsKKyAgQ1hGQV9Ob2RlKiBwQ29udGVudFJvb3ROb2RlID0gcEZvcm1Sb290LT5HZXRGaXJzdENoaWxkKCk7CisgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvY2Vzc29yID0gR2V0RG9jdW1lbnQoKS0+R2V0TGF5b3V0UHJvY2Vzc29yKCk7CisgIGlmIChwQ29udGVudFJvb3ROb2RlKQorICAgIHBMYXlvdXRQcm9jZXNzb3ItPkFkZENoYW5nZWRDb250YWluZXIocENvbnRlbnRSb290Tm9kZSk7CisKKyAgcExheW91dFByb2Nlc3Nvci0+U2V0Rm9yY2VSZUxheW91dCh0cnVlKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0xheW91dFBzZXVkb01vZGVsOjphYnNQYWdlU3BhbigKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgcmV0dXJuIHBhZ2VTcGFuKHJ1bnRpbWUsIHBhcmFtcyk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0xheW91dFBzZXVkb01vZGVsOjphYnNQYWdlSW5CYXRjaCgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld051bWJlcigwKSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0xheW91dFBzZXVkb01vZGVsOjpzaGVldEluQmF0Y2goCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdOdW1iZXIoMCkpOworfQorCitDSlNfUmV0dXJuIENKWF9MYXlvdXRQc2V1ZG9Nb2RlbDo6c2hlZXQoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBQYWdlSW50ZXJuYWxzKHJ1bnRpbWUsIHBhcmFtcywgdHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0xheW91dFBzZXVkb01vZGVsOjpyZWxheW91dFBhZ2VBcmVhKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfTGF5b3V0UHNldWRvTW9kZWw6OnNoZWV0Q291bnQoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBOdW1iZXJlZFBhZ2VDb3VudChydW50aW1lLCBmYWxzZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0xheW91dFBzZXVkb01vZGVsOjphYnNQYWdlKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gUGFnZUludGVybmFscyhydW50aW1lLCBwYXJhbXMsIHRydWUpOworfQorCitDSlNfUmV0dXJuIENKWF9MYXlvdXRQc2V1ZG9Nb2RlbDo6UGFnZUludGVybmFscygKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMsCisgICAgYm9vbCBiQWJzUGFnZSkgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBDWEZBX05vZGUqIHBOb2RlID0gVG9Ob2RlKHJ1bnRpbWUtPlRvWEZBT2JqZWN0KHBhcmFtc1swXSkpOworICBpZiAoIXBOb2RlKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld051bWJlcigwKSk7CisKKyAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBEb2NMYXlvdXQgPSBHZXREb2N1bWVudCgpLT5HZXREb2NMYXlvdXQoKTsKKyAgaWYgKCFwRG9jTGF5b3V0KQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0gPSBwRG9jTGF5b3V0LT5HZXRMYXlvdXRJdGVtKHBOb2RlKTsKKyAgaWYgKCFwTGF5b3V0SXRlbSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdOdW1iZXIoLTEpKTsKKworICBpbnQzMl90IGlQYWdlID0gcExheW91dEl0ZW0tPkdldEZpcnN0KCktPkdldFBhZ2UoKS0+R2V0UGFnZUluZGV4KCk7CisgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld051bWJlcihiQWJzUGFnZSA/IGlQYWdlIDogaVBhZ2UgKyAxKSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfbGF5b3V0cHNldWRvbW9kZWwuaCBiL2Z4anMveGZhL2NqeF9sYXlvdXRwc2V1ZG9tb2RlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYmVmNjAKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfbGF5b3V0cHNldWRvbW9kZWwuaApAQCAtMCwwICsxLDcwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0xBWU9VVFBTRVVET01PREVMX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9MQVlPVVRQU0VVRE9NT0RFTF9IXworCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnhqcy9DSlhfRGVmaW5lLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X29iamVjdC5oIgorCitlbnVtIFhGQV9MQVlPVVRNT0RFTF9IV1hZIHsKKyAgWEZBX0xBWU9VVE1PREVMX0gsCisgIFhGQV9MQVlPVVRNT0RFTF9XLAorICBYRkFfTEFZT1VUTU9ERUxfWCwKKyAgWEZBX0xBWU9VVE1PREVMX1kKK307CisKK2NsYXNzIENGWEpTRV9WYWx1ZTsKK2NsYXNzIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw7CitjbGFzcyBDWEZBX0xheW91dFByb2Nlc3NvcjsKK2NsYXNzIENYRkFfTm9kZTsKKworY2xhc3MgQ0pYX0xheW91dFBzZXVkb01vZGVsIDogcHVibGljIENKWF9PYmplY3QgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0xheW91dFBzZXVkb01vZGVsKENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWwqIG1vZGVsKTsKKyAgfkNKWF9MYXlvdXRQc2V1ZG9Nb2RlbCgpIG92ZXJyaWRlOworCisgIEpTX01FVEhPRChhYnNQYWdlLCBDSlhfTGF5b3V0UHNldWRvTW9kZWwpOworICBKU19NRVRIT0QoYWJzUGFnZUNvdW50LCBDSlhfTGF5b3V0UHNldWRvTW9kZWwpOworICBKU19NRVRIT0QoYWJzUGFnZUNvdW50SW5CYXRjaCwgQ0pYX0xheW91dFBzZXVkb01vZGVsKTsKKyAgSlNfTUVUSE9EKGFic1BhZ2VJbkJhdGNoLCBDSlhfTGF5b3V0UHNldWRvTW9kZWwpOworICBKU19NRVRIT0QoYWJzUGFnZVNwYW4sIENKWF9MYXlvdXRQc2V1ZG9Nb2RlbCk7CisgIEpTX01FVEhPRChoLCBDSlhfTGF5b3V0UHNldWRvTW9kZWwpOworICBKU19NRVRIT0QocGFnZSwgQ0pYX0xheW91dFBzZXVkb01vZGVsKTsKKyAgSlNfTUVUSE9EKHBhZ2VDb250ZW50LCBDSlhfTGF5b3V0UHNldWRvTW9kZWwpOworICBKU19NRVRIT0QocGFnZUNvdW50LCBDSlhfTGF5b3V0UHNldWRvTW9kZWwpOworICBKU19NRVRIT0QocGFnZVNwYW4sIENKWF9MYXlvdXRQc2V1ZG9Nb2RlbCk7CisgIEpTX01FVEhPRChyZWxheW91dCwgQ0pYX0xheW91dFBzZXVkb01vZGVsKTsKKyAgSlNfTUVUSE9EKHJlbGF5b3V0UGFnZUFyZWEsIENKWF9MYXlvdXRQc2V1ZG9Nb2RlbCk7CisgIEpTX01FVEhPRChzaGVldCwgQ0pYX0xheW91dFBzZXVkb01vZGVsKTsKKyAgSlNfTUVUSE9EKHNoZWV0Q291bnQsIENKWF9MYXlvdXRQc2V1ZG9Nb2RlbCk7CisgIEpTX01FVEhPRChzaGVldENvdW50SW5CYXRjaCwgQ0pYX0xheW91dFBzZXVkb01vZGVsKTsKKyAgSlNfTUVUSE9EKHNoZWV0SW5CYXRjaCwgQ0pYX0xheW91dFBzZXVkb01vZGVsKTsKKyAgSlNfTUVUSE9EKHcsIENKWF9MYXlvdXRQc2V1ZG9Nb2RlbCk7CisgIEpTX01FVEhPRCh4LCBDSlhfTGF5b3V0UHNldWRvTW9kZWwpOworICBKU19NRVRIT0QoeSwgQ0pYX0xheW91dFBzZXVkb01vZGVsKTsKKworICBKU19QUk9QKHJlYWR5KTsKKworIHByaXZhdGU6CisgIENKU19SZXR1cm4gTnVtYmVyZWRQYWdlQ291bnQoQ0pTX1Y4KiBydW50aW1lLCBib29sIGJOdW1iZXJlZCk7CisgIENKU19SZXR1cm4gSFdYWShDSlNfVjgqIHJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgIFhGQV9MQVlPVVRNT0RFTF9IV1hZIGxheW91dE1vZGVsKTsKKyAgc3RkOjp2ZWN0b3I8Q1hGQV9Ob2RlKj4gR2V0T2JqQXJyYXkoQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBEb2NMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBhZ2VObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJPblBhZ2VBcmVhKTsKKyAgQ0pTX1JldHVybiBQYWdlSW50ZXJuYWxzKENKU19WOCogcnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWJzUGFnZSk7CisKKyAgc3RhdGljIGNvbnN0IENKWF9NZXRob2RTcGVjIE1ldGhvZFNwZWNzW107Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9MQVlPVVRQU0VVRE9NT0RFTF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2xpbmUuY3BwIGIvZnhqcy94ZmEvY2p4X2xpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NTY5MzkKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfbGluZS5jcHAKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2xpbmUuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xpbmUuaCIKKworQ0pYX0xpbmU6OkNKWF9MaW5lKENYRkFfTGluZSogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfTGluZTo6fkNKWF9MaW5lKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9MaW5lOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0xpbmU6OnNsb3BlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfTGluZTo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9MaW5lOjpoYW5kKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfbGluZS5oIGIvZnhqcy94ZmEvY2p4X2xpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDQxYzEyCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X2xpbmUuaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX0xJTkVfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0xJTkVfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfTGluZTsKKworY2xhc3MgQ0pYX0xpbmUgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0xpbmUoQ1hGQV9MaW5lKiBub2RlKTsKKyAgfkNKWF9MaW5lKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChoYW5kKTsKKyAgSlNfUFJPUChzbG9wZSk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0xJTkVfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9saW5lYXIuY3BwIGIvZnhqcy94ZmEvY2p4X2xpbmVhci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMyMjY5OQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9saW5lYXIuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9saW5lYXIuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xpbmVhci5oIgorCitDSlhfTGluZWFyOjpDSlhfTGluZWFyKENYRkFfTGluZWFyKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9MaW5lYXI6On5DSlhfTGluZWFyKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9MaW5lYXI6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX0xpbmVhcjo6dHlwZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfTGluZWFyOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2xpbmVhci5oIGIvZnhqcy94ZmEvY2p4X2xpbmVhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYTU0YmYKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfbGluZWFyLmgKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9MSU5FQVJfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0xJTkVBUl9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9MaW5lYXI7CisKK2NsYXNzIENKWF9MaW5lYXIgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX0xpbmVhcihDWEZBX0xpbmVhciogbm9kZSk7CisgIH5DSlhfTGluZWFyKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUCh0eXBlKTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfTElORUFSX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfbGlzdC5jcHAgYi9meGpzL3hmYS9janhfbGlzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNiZDMyZAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9saXN0LmNwcApAQCAtMCwwICsxLDk4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbGlzdC5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnhqcy9jZnhqc2VfZW5naW5lLmgiCisjaW5jbHVkZSAiZnhqcy9jZnhqc2VfdmFsdWUuaCIKKyNpbmNsdWRlICJmeGpzL2pzX3Jlc291cmNlcy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9jb252ZXJzaW9ucy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGlzdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY29uc3QgQ0pYX01ldGhvZFNwZWMgQ0pYX0xpc3Q6Ok1ldGhvZFNwZWNzW10gPSB7eyJhcHBlbmQiLCBhcHBlbmRfc3RhdGljfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiaW5zZXJ0IiwgaW5zZXJ0X3N0YXRpY30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Iml0ZW0iLCBpdGVtX3N0YXRpY30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7InJlbW92ZSIsIHJlbW92ZV9zdGF0aWN9fTsKKworQ0pYX0xpc3Q6OkNKWF9MaXN0KENYRkFfTGlzdCogbGlzdCkgOiBDSlhfT2JqZWN0KGxpc3QpIHsKKyAgRGVmaW5lTWV0aG9kcyhNZXRob2RTcGVjcywgRlhfQXJyYXlTaXplKE1ldGhvZFNwZWNzKSk7Cit9CisKK0NKWF9MaXN0Ojp+Q0pYX0xpc3QoKSB7fQorCitDWEZBX0xpc3QqIENKWF9MaXN0OjpHZXRYRkFMaXN0KCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9MaXN0Kj4oR2V0WEZBT2JqZWN0KCkpOworfQorCitDSlNfUmV0dXJuIENKWF9MaXN0OjphcHBlbmQoQ0pTX1Y4KiBydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIGF1dG8qIHBOb2RlID0gVG9Ob2RlKHJ1bnRpbWUtPlRvWEZBT2JqZWN0KHBhcmFtc1swXSkpOworICBpZiAoIXBOb2RlKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1ZhbHVlRXJyb3IpKTsKKworICBHZXRYRkFMaXN0KCktPkFwcGVuZChwTm9kZSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIENKWF9MaXN0OjppbnNlcnQoQ0pTX1Y4KiBydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDIpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIGF1dG8qIHBOZXdOb2RlID0gVG9Ob2RlKHJ1bnRpbWUtPlRvWEZBT2JqZWN0KHBhcmFtc1swXSkpOworICBpZiAoIXBOZXdOb2RlKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1ZhbHVlRXJyb3IpKTsKKworICBhdXRvKiBwQmVmb3JlTm9kZSA9IFRvTm9kZShydW50aW1lLT5Ub1hGQU9iamVjdChwYXJhbXNbMV0pKTsKKyAgR2V0WEZBTGlzdCgpLT5JbnNlcnQocE5ld05vZGUsIHBCZWZvcmVOb2RlKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0xpc3Q6OnJlbW92ZShDSlNfVjgqIHJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgYXV0byogcE5vZGUgPSBUb05vZGUocnVudGltZS0+VG9YRkFPYmplY3QocGFyYW1zWzBdKSk7CisgIGlmICghcE5vZGUpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprVmFsdWVFcnJvcikpOworCisgIEdldFhGQUxpc3QoKS0+UmVtb3ZlKHBOb2RlKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX0xpc3Q6Oml0ZW0oQ0pTX1Y4KiBydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBpbnQzMl90IGluZGV4ID0gcnVudGltZS0+VG9JbnQzMihwYXJhbXNbMF0pOworICBzaXplX3QgY2FzdF9pbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdD4oaW5kZXgpOworICBpZiAoaW5kZXggPCAwIHx8IGNhc3RfaW5kZXggPj0gR2V0WEZBTGlzdCgpLT5HZXRMZW5ndGgoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtJbnZhbGlkSW5wdXRFcnJvcikpOworCisgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld1hGQU9iamVjdCgKKyAgICAgIEdldFhGQUxpc3QoKS0+SXRlbShjYXN0X2luZGV4KSwKKyAgICAgIEdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SnNlTm9ybWFsQ2xhc3MoKS0+R2V0VGVtcGxhdGUoKSkpOworfQorCit2b2lkIENKWF9MaXN0OjpsZW5ndGgoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgaWYgKGJTZXR0aW5nKSB7CisgICAgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKTsKKyAgICByZXR1cm47CisgIH0KKyAgcFZhbHVlLT5TZXRJbnRlZ2VyKAorICAgICAgcGRmaXVtOjpiYXNlOjpjaGVja2VkX2Nhc3Q8aW50MzJfdD4oR2V0WEZBTGlzdCgpLT5HZXRMZW5ndGgoKSkpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2xpc3QuaCBiL2Z4anMveGZhL2NqeF9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM4MDFiNwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9saXN0LmgKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9MSVNUX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9MSVNUX0hfCisKKyNpbmNsdWRlICJmeGpzL0NKWF9EZWZpbmUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfb2JqZWN0LmgiCisKK2NsYXNzIENYRkFfTGlzdDsKKworY2xhc3MgQ0pYX0xpc3QgOiBwdWJsaWMgQ0pYX09iamVjdCB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfTGlzdChDWEZBX0xpc3QqIGxpc3QpOworICB+Q0pYX0xpc3QoKSBvdmVycmlkZTsKKworICBKU19NRVRIT0QoYXBwZW5kLCBDSlhfTGlzdCk7CisgIEpTX01FVEhPRChpbnNlcnQsIENKWF9MaXN0KTsKKyAgSlNfTUVUSE9EKGl0ZW0sIENKWF9MaXN0KTsKKyAgSlNfTUVUSE9EKHJlbW92ZSwgQ0pYX0xpc3QpOworCisgIEpTX1BST1AobGVuZ3RoKTsKKworIHByaXZhdGU6CisgIENYRkFfTGlzdCogR2V0WEZBTGlzdCgpOworCisgIHN0YXRpYyBjb25zdCBDSlhfTWV0aG9kU3BlYyBNZXRob2RTcGVjc1tdOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfTElTVF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X2xvZ3BzZXVkb21vZGVsLmNwcCBiL2Z4anMveGZhL2NqeF9sb2dwc2V1ZG9tb2RlbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEwZGRmYQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9sb2dwc2V1ZG9tb2RlbC5jcHAKQEAgLTAsMCArMSw1NiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2xvZ3BzZXVkb21vZGVsLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV92YWx1ZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jc2NyaXB0X2xvZ3BzZXVkb21vZGVsLmgiCisKK2NvbnN0IENKWF9NZXRob2RTcGVjIENKWF9Mb2dQc2V1ZG9Nb2RlbDo6TWV0aG9kU3BlY3NbXSA9IHsKKyAgICB7Im1lc3NhZ2UiLCBtZXNzYWdlX3N0YXRpY30sCisgICAgeyJ0cmFjZUVuYWJsZWQiLCB0cmFjZUVuYWJsZWRfc3RhdGljfSwKKyAgICB7InRyYWNlQWN0aXZhdGUiLCB0cmFjZUFjdGl2YXRlX3N0YXRpY30sCisgICAgeyJ0cmFjZURlYWN0aXZhdGUiLCB0cmFjZURlYWN0aXZhdGVfc3RhdGljfSwKKyAgICB7InRyYWNlIiwgdHJhY2Vfc3RhdGljfX07CisKK0NKWF9Mb2dQc2V1ZG9Nb2RlbDo6Q0pYX0xvZ1BzZXVkb01vZGVsKENTY3JpcHRfTG9nUHNldWRvTW9kZWwqIG1vZGVsKQorICAgIDogQ0pYX09iamVjdChtb2RlbCkgeworICBEZWZpbmVNZXRob2RzKE1ldGhvZFNwZWNzLCBGWF9BcnJheVNpemUoTWV0aG9kU3BlY3MpKTsKK30KKworQ0pYX0xvZ1BzZXVkb01vZGVsOjp+Q0pYX0xvZ1BzZXVkb01vZGVsKCkge30KKworQ0pTX1JldHVybiBDSlhfTG9nUHNldWRvTW9kZWw6Om1lc3NhZ2UoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIENKWF9Mb2dQc2V1ZG9Nb2RlbDo6dHJhY2VFbmFibGVkKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfTG9nUHNldWRvTW9kZWw6OnRyYWNlQWN0aXZhdGUoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIENKWF9Mb2dQc2V1ZG9Nb2RlbDo6dHJhY2VEZWFjdGl2YXRlKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfTG9nUHNldWRvTW9kZWw6OnRyYWNlKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9sb2dwc2V1ZG9tb2RlbC5oIGIvZnhqcy94ZmEvY2p4X2xvZ3BzZXVkb21vZGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcyYmYzMAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9sb2dwc2V1ZG9tb2RlbC5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfTE9HUFNFVURPTU9ERUxfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX0xPR1BTRVVET01PREVMX0hfCisKKyNpbmNsdWRlICJmeGpzL0NKWF9EZWZpbmUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfb2JqZWN0LmgiCisKK2NsYXNzIENTY3JpcHRfTG9nUHNldWRvTW9kZWw7CisKKy8vIFRPRE8oZHNpbmNsYWlyKTogVGhpcyBkb2Vzbid0IGV4aXN0IGluIHRoZSBzcGVjLiBSZW1vdmUgYWZ0ZXIKKy8vIHhmYV9iYXNpY19kYXRhX2VsZW1lbnRfc2NyaXB0IGlzIHJlbW92ZWQuCitjbGFzcyBDSlhfTG9nUHNldWRvTW9kZWwgOiBwdWJsaWMgQ0pYX09iamVjdCB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfTG9nUHNldWRvTW9kZWwoQ1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbCogbW9kZWwpOworICB+Q0pYX0xvZ1BzZXVkb01vZGVsKCkgb3ZlcnJpZGU7CisKKyAgSlNfTUVUSE9EKG1lc3NhZ2UsIENKWF9Mb2dQc2V1ZG9Nb2RlbCk7CisgIEpTX01FVEhPRCh0cmFjZUVuYWJsZWQsIENKWF9Mb2dQc2V1ZG9Nb2RlbCk7CisgIEpTX01FVEhPRCh0cmFjZUFjdGl2YXRlLCBDSlhfTG9nUHNldWRvTW9kZWwpOworICBKU19NRVRIT0QodHJhY2VEZWFjdGl2YXRlLCBDSlhfTG9nUHNldWRvTW9kZWwpOworICBKU19NRVRIT0QodHJhY2UsIENKWF9Mb2dQc2V1ZG9Nb2RlbCk7CisKKyBwcml2YXRlOgorICBzdGF0aWMgY29uc3QgQ0pYX01ldGhvZFNwZWMgTWV0aG9kU3BlY3NbXTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX0xPR1BTRVVET01PREVMX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfbWFuaWZlc3QuY3BwIGIvZnhqcy94ZmEvY2p4X21hbmlmZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODgyMjM4Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X21hbmlmZXN0LmNwcApAQCAtMCwwICsxLDU2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbWFuaWZlc3QuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImZ4anMvY2Z4anNlX3ZhbHVlLmgiCisjaW5jbHVkZSAiZnhqcy9qc19yZXNvdXJjZXMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tYW5pZmVzdC5oIgorCitjb25zdCBDSlhfTWV0aG9kU3BlYyBDSlhfTWFuaWZlc3Q6Ok1ldGhvZFNwZWNzW10gPSB7CisgICAgeyJldmFsdWF0ZSIsIGV2YWx1YXRlX3N0YXRpY319OworCitDSlhfTWFuaWZlc3Q6OkNKWF9NYW5pZmVzdChDWEZBX01hbmlmZXN0KiBtYW5pZmVzdCkgOiBDSlhfTm9kZShtYW5pZmVzdCkgeworICBEZWZpbmVNZXRob2RzKE1ldGhvZFNwZWNzLCBGWF9BcnJheVNpemUoTWV0aG9kU3BlY3MpKTsKK30KKworQ0pYX01hbmlmZXN0Ojp+Q0pYX01hbmlmZXN0KCkge30KKworQ0pTX1JldHVybiBDSlhfTWFuaWZlc3Q6OmV2YWx1YXRlKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIXBhcmFtcy5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICByZXR1cm4gQ0pTX1JldHVybigKKyAgICAgIHJ1bnRpbWUtPk5ld0Jvb2xlYW4oISFUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5HZXRXaWRnZXRBY2MoKSkpOworfQorCit2b2lkIENKWF9NYW5pZmVzdDo6ZGVmYXVsdFZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX01hbmlmZXN0OjphY3Rpb24oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfTWFuaWZlc3Q6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9NYW5pZmVzdDo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfbWFuaWZlc3QuaCBiL2Z4anMveGZhL2NqeF9tYW5pZmVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZmNhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfbWFuaWZlc3QuaApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX01BTklGRVNUX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9NQU5JRkVTVF9IXworCisjaW5jbHVkZSAiZnhqcy9DSlhfRGVmaW5lLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9NYW5pZmVzdDsKKworY2xhc3MgQ0pYX01hbmlmZXN0IDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9NYW5pZmVzdChDWEZBX01hbmlmZXN0KiBtYW5pZmVzdCk7CisgIH5DSlhfTWFuaWZlc3QoKSBvdmVycmlkZTsKKworICBKU19NRVRIT0QoZXZhbHVhdGUsIENKWF9NYW5pZmVzdCk7CisKKyAgSlNfUFJPUChkZWZhdWx0VmFsdWUpOyAvKiB7ZGVmYXVsdH0gKi8KKyAgSlNfUFJPUChhY3Rpb24pOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7CisKKyBwcml2YXRlOgorICBzdGF0aWMgY29uc3QgQ0pYX01ldGhvZFNwZWMgTWV0aG9kU3BlY3NbXTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX01BTklGRVNUX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfbWFwLmNwcCBiL2Z4anMveGZhL2NqeF9tYXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMWZhMTQKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfbWFwLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbWFwLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tYXAuaCIKKworQ0pYX01hcDo6Q0pYX01hcChDWEZBX01hcCogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfTWFwOjp+Q0pYX01hcCgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfTWFwOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9NYXA6OmJpbmQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX01hcDo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfTWFwOjpmcm9tKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X21hcC5oIGIvZnhqcy94ZmEvY2p4X21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYTdlYjYKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfbWFwLmgKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9NQVBfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX01BUF9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9NYXA7CisKK2NsYXNzIENKWF9NYXAgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX01hcChDWEZBX01hcCogbm9kZSk7CisgIH5DSlhfTWFwKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChiaW5kKTsKKyAgSlNfUFJPUChmcm9tKTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfTUFQX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfbWFyZ2luLmNwcCBiL2Z4anMveGZhL2NqeF9tYXJnaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYTE4MGIKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfbWFyZ2luLmNwcApAQCAtMCwwICsxLDQ5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbWFyZ2luLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tYXJnaW4uaCIKKworQ0pYX01hcmdpbjo6Q0pYX01hcmdpbihDWEZBX01hcmdpbiogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfTWFyZ2luOjp+Q0pYX01hcmdpbigpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfTWFyZ2luOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9NYXJnaW46OmxlZnRJbnNldChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX01hcmdpbjo6Ym90dG9tSW5zZXQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfTWFyZ2luOjp0b3BJbnNldChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9NYXJnaW46OnJpZ2h0SW5zZXQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX01hcmdpbjo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9tYXJnaW4uaCBiL2Z4anMveGZhL2NqeF9tYXJnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2E4ODRmCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X21hcmdpbi5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfTUFSR0lOX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9NQVJHSU5fSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfTWFyZ2luOworCitjbGFzcyBDSlhfTWFyZ2luIDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9NYXJnaW4oQ1hGQV9NYXJnaW4qIG5vZGUpOworICB+Q0pYX01hcmdpbigpIG92ZXJyaWRlOworCisgIEpTX1BST1AoYm90dG9tSW5zZXQpOworICBKU19QUk9QKGxlZnRJbnNldCk7CisgIEpTX1BST1AocmlnaHRJbnNldCk7CisgIEpTX1BST1AodG9wSW5zZXQpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9NQVJHSU5fSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9tZHAuY3BwIGIvZnhqcy94ZmEvY2p4X21kcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk3MzBmNgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9tZHAuY3BwCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9tZHAuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21kcC5oIgorCitDSlhfTWRwOjpDSlhfTWRwKENYRkFfTWRwKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9NZHA6On5DSlhfTWRwKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9NZHA6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX01kcDo6c2lnbmF0dXJlVHlwZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfTWRwOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9NZHA6OnBlcm1pc3Npb25zKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfbWRwLmggYi9meGpzL3hmYS9janhfbWRwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjZTJiOAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9tZHAuaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX01EUF9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfTURQX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX01kcDsKKworY2xhc3MgQ0pYX01kcCA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfTWRwKENYRkFfTWRwKiBub2RlKTsKKyAgfkNKWF9NZHAoKSBvdmVycmlkZTsKKworICBKU19QUk9QKHBlcm1pc3Npb25zKTsKKyAgSlNfUFJPUChzaWduYXR1cmVUeXBlKTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfTURQX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfbWVkaXVtLmNwcCBiL2Z4anMveGZhL2NqeF9tZWRpdW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OTg2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfbWVkaXVtLmNwcApAQCAtMCwwICsxLDU1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbWVkaXVtLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWRpdW0uaCIKKworQ0pYX01lZGl1bTo6Q0pYX01lZGl1bShDWEZBX01lZGl1bSogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfTWVkaXVtOjp+Q0pYX01lZGl1bSgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfTWVkaXVtOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9NZWRpdW06Om9yaWVudGF0aW9uKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX01lZGl1bTo6aW1hZ2luZ0JCb3goQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfTWVkaXVtOjpzaG9ydFZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9NZWRpdW06OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX01lZGl1bTo6c3RvY2soQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfTWVkaXVtOjpsb25nVmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X21lZGl1bS5oIGIvZnhqcy94ZmEvY2p4X21lZGl1bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MDIzZGMKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfbWVkaXVtLmgKQEAgLTAsMCArMSwyOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9NRURJVU1fSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX01FRElVTV9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9NZWRpdW07CisKK2NsYXNzIENKWF9NZWRpdW0gOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX01lZGl1bShDWEZBX01lZGl1bSogbm9kZSk7CisgIH5DSlhfTWVkaXVtKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChpbWFnaW5nQkJveCk7CisgIEpTX1BST1AobG9uZ1ZhbHVlKTsgLyogbG9uZyAqLworICBKU19QUk9QKG9yaWVudGF0aW9uKTsKKyAgSlNfUFJPUChzaG9ydFZhbHVlKTsgLyogc2hvcnQgKi8KKyAgSlNfUFJPUChzdG9jayk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX01FRElVTV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X21lc3NhZ2UuY3BwIGIvZnhqcy94ZmEvY2p4X21lc3NhZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZjNmNmEKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfbWVzc2FnZS5jcHAKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X21lc3NhZ2UuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21lc3NhZ2UuaCIKKworQ0pYX01lc3NhZ2U6OkNKWF9NZXNzYWdlKENYRkFfTWVzc2FnZSogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfTWVzc2FnZTo6fkNKWF9NZXNzYWdlKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9NZXNzYWdlOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX01lc3NhZ2U6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9tZXNzYWdlLmggYi9meGpzL3hmYS9janhfbWVzc2FnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYTQ2MWUKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfbWVzc2FnZS5oCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfTUVTU0FHRV9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfTUVTU0FHRV9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9NZXNzYWdlOworCitjbGFzcyBDSlhfTWVzc2FnZSA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfTWVzc2FnZShDWEZBX01lc3NhZ2UqIG5vZGUpOworICB+Q0pYX01lc3NhZ2UoKSBvdmVycmlkZTsKKworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9NRVNTQUdFX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfbW9kZWwuY3BwIGIvZnhqcy94ZmEvY2p4X21vZGVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTVkNmIyCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X21vZGVsLmNwcApAQCAtMCwwICsxLDkyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbW9kZWwuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImZ4anMvY2Z4anNlX2VuZ2luZS5oIgorI2luY2x1ZGUgImZ4anMvY2Z4anNlX3ZhbHVlLmgiCisjaW5jbHVkZSAiZnhqcy9qc19yZXNvdXJjZXMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWx0YS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCisKK2NvbnN0IENKWF9NZXRob2RTcGVjIENKWF9Nb2RlbDo6TWV0aG9kU3BlY3NbXSA9IHsKKyAgICB7ImNsZWFyRXJyb3JMaXN0IiwgY2xlYXJFcnJvckxpc3Rfc3RhdGljfSwKKyAgICB7ImNyZWF0ZU5vZGUiLCBjcmVhdGVOb2RlX3N0YXRpY30sCisgICAgeyJpc0NvbXBhdGlibGVOUyIsIGlzQ29tcGF0aWJsZU5TX3N0YXRpY319OworCitDSlhfTW9kZWw6OkNKWF9Nb2RlbChDWEZBX05vZGUqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkgeworICBEZWZpbmVNZXRob2RzKE1ldGhvZFNwZWNzLCBGWF9BcnJheVNpemUoTWV0aG9kU3BlY3MpKTsKK30KKworQ0pYX01vZGVsOjp+Q0pYX01vZGVsKCkge30KKworQ0pTX1JldHVybiBDSlhfTW9kZWw6OmNsZWFyRXJyb3JMaXN0KAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfTW9kZWw6OmNyZWF0ZU5vZGUoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuZW1wdHkoKSB8fCBwYXJhbXMuc2l6ZSgpID4gMykKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgV2lkZVN0cmluZyBuYW1lOworICBpZiAocGFyYW1zLnNpemUoKSA+IDEpCisgICAgbmFtZSA9IHJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMV0pOworCisgIFdpZGVTdHJpbmcgbmFtZVNwYWNlOworICBpZiAocGFyYW1zLnNpemUoKSA9PSAzKQorICAgIG5hbWVTcGFjZSA9IHJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMl0pOworCisgIFdpZGVTdHJpbmcgdGFnTmFtZSA9IHJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMF0pOworICBYRkFfRWxlbWVudCBlVHlwZSA9IENYRkFfTm9kZTo6TmFtZVRvRWxlbWVudCh0YWdOYW1lKTsKKyAgQ1hGQV9Ob2RlKiBwTmV3Tm9kZSA9IEdldFhGQU5vZGUoKS0+Q3JlYXRlU2FtZVBhY2tldE5vZGUoZVR5cGUpOworICBpZiAoIXBOZXdOb2RlKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld051bGwoKSk7CisKKyAgaWYgKCFuYW1lLklzRW1wdHkoKSkgeworICAgIGlmICghcE5ld05vZGUtPkhhc0F0dHJpYnV0ZShYRkFfQXR0cmlidXRlOjpOYW1lKSkKKyAgICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICAgIHBOZXdOb2RlLT5KU09iamVjdCgpLT5TZXRBdHRyaWJ1dGUoWEZBX0F0dHJpYnV0ZTo6TmFtZSwgbmFtZS5Bc1N0cmluZ1ZpZXcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgIGlmIChwTmV3Tm9kZS0+R2V0UGFja2V0VHlwZSgpID09IFhGQV9QYWNrZXRUeXBlOjpEYXRhc2V0cykKKyAgICAgIHBOZXdOb2RlLT5DcmVhdGVYTUxNYXBwaW5nTm9kZSgpOworICB9CisKKyAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9CisgICAgICBHZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBOZXdOb2RlKTsKKyAgaWYgKCF2YWx1ZSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdOdWxsKCkpOworCisgIHJldHVybiBDSlNfUmV0dXJuKHZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpLkdldChydW50aW1lLT5HZXRJc29sYXRlKCkpKTsKK30KKworQ0pTX1JldHVybiBDSlhfTW9kZWw6OmlzQ29tcGF0aWJsZU5TKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIFdpZGVTdHJpbmcgbmFtZVNwYWNlOworICBpZiAocGFyYW1zLnNpemUoKSA+PSAxKQorICAgIG5hbWVTcGFjZSA9IHJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMF0pOworCisgIHJldHVybiBDSlNfUmV0dXJuKAorICAgICAgcnVudGltZS0+TmV3Qm9vbGVhbihUcnlOYW1lc3BhY2UoKS52YWx1ZV9vcihXaWRlU3RyaW5nKCkpID09IG5hbWVTcGFjZSkpOworfQorCit2b2lkIENKWF9Nb2RlbDo6Y29udGV4dChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHt9CisKK3ZvaWQgQ0pYX01vZGVsOjphbGlhc05vZGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkge30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9tb2RlbC5oIGIvZnhqcy94ZmEvY2p4X21vZGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlMWNjNwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9tb2RlbC5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfTU9ERUxfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX01PREVMX0hfCisKKyNpbmNsdWRlICJmeGpzL0NKWF9EZWZpbmUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX05vZGU7CisKK2NsYXNzIENKWF9Nb2RlbCA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfTW9kZWwoQ1hGQV9Ob2RlKiBvYmopOworICB+Q0pYX01vZGVsKCkgb3ZlcnJpZGU7CisKKyAgSlNfTUVUSE9EKGNsZWFyRXJyb3JMaXN0LCBDSlhfTW9kZWwpOworICBKU19NRVRIT0QoY3JlYXRlTm9kZSwgQ0pYX01vZGVsKTsKKyAgSlNfTUVUSE9EKGlzQ29tcGF0aWJsZU5TLCBDSlhfTW9kZWwpOworCisgIEpTX1BST1AoYWxpYXNOb2RlKTsKKyAgSlNfUFJPUChjb250ZXh0KTsKKworIHByaXZhdGU6CisgIHN0YXRpYyBjb25zdCBDSlhfTWV0aG9kU3BlYyBNZXRob2RTcGVjc1tdOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfTU9ERUxfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9ub2RlLmNwcCBiL2Z4anMveGZhL2NqeF9ub2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjI2NDJjCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X25vZGUuY3BwCkBAIC0wLDAgKzEsNTMyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X21lbW9yeXN0cmVhbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29kZXBhZ2UuaCIKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV9lbmdpbmUuaCIKKyNpbmNsdWRlICJmeGpzL2pzX3Jlc291cmNlcy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmbm90aWZ5LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2ltcGxlX3BhcnNlci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfdXRpbHMuaCIKKworbmFtZXNwYWNlIHsKKworZW51bSBjbGFzcyBFdmVudEFwcGxpZXNUb28geworICBrTm9uZSA9IDAsCisgIGtBbGwgPSAxLAorICBrQWxsTm9uUmVjdXJzaXZlID0gMiwKKyAga1N1YmZvcm0gPSAzLAorICBrRmllbGRPckV4Y2x1c2lvbiA9IDQsCisgIGtGaWVsZCA9IDUsCisgIGtTaWduYXR1cmUgPSA2LAorICBrQ2hvaWNlTGlzdCA9IDcKK307CisKK3N0cnVjdCBYRkFfRXhlY0V2ZW50UGFyYUluZm8geworIHB1YmxpYzoKKyAgdWludDMyX3QgbV91SGFzaDsKKyAgY29uc3Qgd2NoYXJfdCogbV9scGNFdmVudE5hbWU7CisgIFhGQV9FVkVOVFRZUEUgbV9ldmVudFR5cGU7CisgIEV2ZW50QXBwbGllc1RvbyBtX3ZhbGlkRmxhZ3M7Cit9OworCitjb25zdCBYRkFfRXhlY0V2ZW50UGFyYUluZm8gZ3NfZXZlbnRQYXJhSW5mb3NbXSA9IHsKKyAgICB7MHgxMDlkN2NlNywgTCJtb3VzZUVudGVyIiwgWEZBX0VWRU5UX01vdXNlRW50ZXIsIEV2ZW50QXBwbGllc1Rvbzo6a0ZpZWxkfSwKKyAgICB7MHgxYmZjNzJkOSwgTCJwcmVPcGVuIiwgWEZBX0VWRU5UX1ByZU9wZW4sIEV2ZW50QXBwbGllc1Rvbzo6a0Nob2ljZUxpc3R9LAorICAgIHsweDIxOTZhNDUyLCBMImluaXRpYWxpemUiLCBYRkFfRVZFTlRfSW5pdGlhbGl6ZSwgRXZlbnRBcHBsaWVzVG9vOjprQWxsfSwKKyAgICB7MHgyNzQxMGYwMywgTCJtb3VzZUV4aXQiLCBYRkFfRVZFTlRfTW91c2VFeGl0LCBFdmVudEFwcGxpZXNUb286OmtGaWVsZH0sCisgICAgezB4MzZmMWM2ZDgsIEwicHJlU2lnbiIsIFhGQV9FVkVOVF9QcmVTaWduLCBFdmVudEFwcGxpZXNUb286OmtTaWduYXR1cmV9LAorICAgIHsweDQ3MzFkNmJhLCBMImV4aXQiLCBYRkFfRVZFTlRfRXhpdCwgRXZlbnRBcHBsaWVzVG9vOjprQWxsTm9uUmVjdXJzaXZlfSwKKyAgICB7MHg3MjMzMDE4YSwgTCJ2YWxpZGF0ZSIsIFhGQV9FVkVOVF9WYWxpZGF0ZSwgRXZlbnRBcHBsaWVzVG9vOjprQWxsfSwKKyAgICB7MHg4ODA4Mzg1ZSwgTCJpbmRleENoYW5nZSIsIFhGQV9FVkVOVF9JbmRleENoYW5nZSwKKyAgICAgRXZlbnRBcHBsaWVzVG9vOjprU3ViZm9ybX0sCisgICAgezB4ODkxZjQ2MDYsIEwiY2hhbmdlIiwgWEZBX0VWRU5UX0NoYW5nZSwKKyAgICAgRXZlbnRBcHBsaWVzVG9vOjprRmllbGRPckV4Y2x1c2lvbn0sCisgICAgezB4OWY2OTNiMjEsIEwibW91c2VEb3duIiwgWEZBX0VWRU5UX01vdXNlRG93biwgRXZlbnRBcHBsaWVzVG9vOjprRmllbGR9LAorICAgIHsweGNkY2U1NmIzLCBMImZ1bGwiLCBYRkFfRVZFTlRfRnVsbCwgRXZlbnRBcHBsaWVzVG9vOjprRmllbGRPckV4Y2x1c2lvbn0sCisgICAgezB4ZDU3NmQwOGUsIEwibW91c2VVcCIsIFhGQV9FVkVOVF9Nb3VzZVVwLCBFdmVudEFwcGxpZXNUb286OmtGaWVsZH0sCisgICAgezB4ZDk1NjU3YTYsIEwiY2xpY2siLCBYRkFfRVZFTlRfQ2xpY2ssIEV2ZW50QXBwbGllc1Rvbzo6a0ZpZWxkT3JFeGNsdXNpb259LAorICAgIHsweGRiZmJlMDJlLCBMImNhbGN1bGF0ZSIsIFhGQV9FVkVOVF9DYWxjdWxhdGUsIEV2ZW50QXBwbGllc1Rvbzo6a0FsbH0sCisgICAgezB4ZTI1ZmE3YjgsIEwicG9zdE9wZW4iLCBYRkFfRVZFTlRfUG9zdE9wZW4sIEV2ZW50QXBwbGllc1Rvbzo6a0Nob2ljZUxpc3R9LAorICAgIHsweGUyOGRjZTdlLCBMImVudGVyIiwgWEZBX0VWRU5UX0VudGVyLCBFdmVudEFwcGxpZXNUb286OmtBbGxOb25SZWN1cnNpdmV9LAorICAgIHsweGZkNTRmYmI3LCBMInBvc3RTaWduIiwgWEZBX0VWRU5UX1Bvc3RTaWduLCBFdmVudEFwcGxpZXNUb286OmtTaWduYXR1cmV9LAorfTsKKworY29uc3QgWEZBX0V4ZWNFdmVudFBhcmFJbmZvKiBHZXRFdmVudFBhcmFJbmZvQnlOYW1lKAorICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c0V2ZW50TmFtZSkgeworICB1aW50MzJfdCB1SGFzaCA9IEZYX0hhc2hDb2RlX0dldFcod3NFdmVudE5hbWUsIGZhbHNlKTsKKyAgaW50MzJfdCBpU3RhcnQgPSAwOworICBpbnQzMl90IGlFbmQgPSAoc2l6ZW9mKGdzX2V2ZW50UGFyYUluZm9zKSAvIHNpemVvZihnc19ldmVudFBhcmFJbmZvc1swXSkpIC0gMTsKKyAgZG8geworICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7CisgICAgY29uc3QgWEZBX0V4ZWNFdmVudFBhcmFJbmZvKiBldmVudFBhcmFJbmZvID0gJmdzX2V2ZW50UGFyYUluZm9zW2lNaWRdOworICAgIGlmICh1SGFzaCA9PSBldmVudFBhcmFJbmZvLT5tX3VIYXNoKQorICAgICAgcmV0dXJuIGV2ZW50UGFyYUluZm87CisgICAgaWYgKHVIYXNoIDwgZXZlbnRQYXJhSW5mby0+bV91SGFzaCkKKyAgICAgIGlFbmQgPSBpTWlkIC0gMTsKKyAgICBlbHNlCisgICAgICBpU3RhcnQgPSBpTWlkICsgMTsKKyAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOworICByZXR1cm4gbnVsbHB0cjsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2NvbnN0IENKWF9NZXRob2RTcGVjIENKWF9Ob2RlOjpNZXRob2RTcGVjc1tdID0geworICAgIHsiYXBwbHlYU0wiLCBhcHBseVhTTF9zdGF0aWN9LAorICAgIHsiYXNzaWduTm9kZSIsIGFzc2lnbk5vZGVfc3RhdGljfSwKKyAgICB7ImNsb25lIiwgY2xvbmVfc3RhdGljfSwKKyAgICB7ImdldEF0dHJpYnV0ZSIsIGdldEF0dHJpYnV0ZV9zdGF0aWN9LAorICAgIHsiZ2V0RWxlbWVudCIsIGdldEVsZW1lbnRfc3RhdGljfSwKKyAgICB7ImlzUHJvcGVydHlTcGVjaWZpZWQiLCBpc1Byb3BlcnR5U3BlY2lmaWVkX3N0YXRpY30sCisgICAgeyJsb2FkWE1MIiwgbG9hZFhNTF9zdGF0aWN9LAorICAgIHsic2F2ZUZpbHRlcmVkWE1MIiwgc2F2ZUZpbHRlcmVkWE1MX3N0YXRpY30sCisgICAgeyJzYXZlWE1MIiwgc2F2ZVhNTF9zdGF0aWN9LAorICAgIHsic2V0QXR0cmlidXRlIiwgc2V0QXR0cmlidXRlX3N0YXRpY30sCisgICAgeyJzZXRFbGVtZW50Iiwgc2V0RWxlbWVudF9zdGF0aWN9fTsKKworQ0pYX05vZGU6OkNKWF9Ob2RlKENYRkFfTm9kZSogbm9kZSkgOiBDSlhfVHJlZShub2RlKSB7CisgIERlZmluZU1ldGhvZHMoTWV0aG9kU3BlY3MsIEZYX0FycmF5U2l6ZShNZXRob2RTcGVjcykpOworfQorCitDSlhfTm9kZTo6fkNKWF9Ob2RlKCkgPSBkZWZhdWx0OworCitDWEZBX05vZGUqIENKWF9Ob2RlOjpHZXRYRkFOb2RlKCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9Ob2RlKj4oR2V0WEZBT2JqZWN0KCkpOworfQorCitjb25zdCBDWEZBX05vZGUqIENKWF9Ob2RlOjpHZXRYRkFOb2RlKCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgQ1hGQV9Ob2RlKj4oR2V0WEZBT2JqZWN0KCkpOworfQorCitDSlNfUmV0dXJuIENKWF9Ob2RlOjphcHBseVhTTChDSlNfVjgqIHJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICAvLyBUT0RPKHdlaWxpKTogY2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGltcGxlbWVudCB0aGlzLCBwZGZpdW06NTAxLgorICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfTm9kZTo6YXNzaWduTm9kZSgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5lbXB0eSgpIHx8IHBhcmFtcy5zaXplKCkgPiAzKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICAvLyBUT0RPKHdlaWxpKTogY2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGltcGxlbWVudCB0aGlzLCBwZGZpdW06NTAxLgorICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfTm9kZTo6Y2xvbmUoQ0pTX1Y4KiBydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgQ1hGQV9Ob2RlKiBwQ2xvbmVOb2RlID0gR2V0WEZBTm9kZSgpLT5DbG9uZShydW50aW1lLT5Ub0Jvb2xlYW4ocGFyYW1zWzBdKSk7CisgIENGWEpTRV9WYWx1ZSogdmFsdWUgPQorICAgICAgR2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwQ2xvbmVOb2RlKTsKKyAgaWYgKCF2YWx1ZSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdOdWxsKCkpOworICByZXR1cm4gQ0pTX1JldHVybih2YWx1ZS0+RGlyZWN0R2V0VmFsdWUoKS5HZXQocnVudGltZS0+R2V0SXNvbGF0ZSgpKSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX05vZGU6OmdldEF0dHJpYnV0ZSgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgV2lkZVN0cmluZyBleHByZXNzaW9uID0gcnVudGltZS0+VG9XaWRlU3RyaW5nKHBhcmFtc1swXSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld1N0cmluZygKKyAgICAgIEdldEF0dHJpYnV0ZShleHByZXNzaW9uLkFzU3RyaW5nVmlldygpKS5VVEY4RW5jb2RlKCkuQXNTdHJpbmdWaWV3KCkpKTsKK30KKworQ0pTX1JldHVybiBDSlhfTm9kZTo6Z2V0RWxlbWVudCgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5lbXB0eSgpIHx8IHBhcmFtcy5zaXplKCkgPiAyKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBXaWRlU3RyaW5nIGV4cHJlc3Npb24gPSBydW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzBdKTsKKyAgaW50MzJfdCBpVmFsdWUgPSBwYXJhbXMuc2l6ZSgpID49IDIgPyBydW50aW1lLT5Ub0ludDMyKHBhcmFtc1sxXSkgOiAwOworCisgIENYRkFfTm9kZSogcE5vZGUgPSBHZXRPckNyZWF0ZVByb3BlcnR5PENYRkFfTm9kZT4oCisgICAgICBpVmFsdWUsIENYRkFfTm9kZTo6TmFtZVRvRWxlbWVudChleHByZXNzaW9uKSk7CisgIGlmICghcE5vZGUpCisgICAgcmV0dXJuIENKU19SZXR1cm4ocnVudGltZS0+TmV3TnVsbCgpKTsKKworICBDRlhKU0VfVmFsdWUqIHZhbHVlID0KKyAgICAgIEdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocE5vZGUpOworICBpZiAoIXZhbHVlKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld051bGwoKSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpLkdldChydW50aW1lLT5HZXRJc29sYXRlKCkpKTsKK30KKworQ0pTX1JldHVybiBDSlhfTm9kZTo6aXNQcm9wZXJ0eVNwZWNpZmllZCgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5lbXB0eSgpIHx8IHBhcmFtcy5zaXplKCkgPiAzKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBXaWRlU3RyaW5nIGV4cHJlc3Npb24gPSBydW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzBdKTsKKyAgWEZBX0F0dHJpYnV0ZSBhdHRyID0gQ1hGQV9Ob2RlOjpOYW1lVG9BdHRyaWJ1dGUoZXhwcmVzc2lvbi5Bc1N0cmluZ1ZpZXcoKSk7CisgIGlmIChhdHRyICE9IFhGQV9BdHRyaWJ1dGU6OlVua25vd24gJiYgSGFzQXR0cmlidXRlKGF0dHIpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld0Jvb2xlYW4odHJ1ZSkpOworCisgIGJvb2wgYlBhcmVudCA9IHBhcmFtcy5zaXplKCkgPCAyIHx8IHJ1bnRpbWUtPlRvQm9vbGVhbihwYXJhbXNbMV0pOworICBpbnQzMl90IGlJbmRleCA9IHBhcmFtcy5zaXplKCkgPT0gMyA/IHJ1bnRpbWUtPlRvSW50MzIocGFyYW1zWzJdKSA6IDA7CisgIFhGQV9FbGVtZW50IGVUeXBlID0gQ1hGQV9Ob2RlOjpOYW1lVG9FbGVtZW50KGV4cHJlc3Npb24pOworICBib29sIGJIYXMgPSAhIUdldE9yQ3JlYXRlUHJvcGVydHk8Q1hGQV9Ob2RlPihpSW5kZXgsIGVUeXBlKTsKKyAgaWYgKCFiSGFzICYmIGJQYXJlbnQgJiYgR2V0WEZBTm9kZSgpLT5HZXRQYXJlbnQoKSkgeworICAgIC8vIEFsc28gY2hlY2sgb24gdGhlIHBhcmVudC4KKyAgICBhdXRvKiBqc25vZGUgPSBHZXRYRkFOb2RlKCktPkdldFBhcmVudCgpLT5KU09iamVjdCgpOworICAgIGJIYXMgPSBqc25vZGUtPkhhc0F0dHJpYnV0ZShhdHRyKSB8fAorICAgICAgICAgICAhIWpzbm9kZS0+R2V0T3JDcmVhdGVQcm9wZXJ0eTxDWEZBX05vZGU+KGlJbmRleCwgZVR5cGUpOworICB9CisgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld0Jvb2xlYW4oYkhhcykpOworfQorCitDSlNfUmV0dXJuIENKWF9Ob2RlOjpsb2FkWE1MKENKU19WOCogcnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5lbXB0eSgpIHx8IHBhcmFtcy5zaXplKCkgPiAzKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBCeXRlU3RyaW5nIGV4cHJlc3Npb24gPSBydW50aW1lLT5Ub0J5dGVTdHJpbmcocGFyYW1zWzBdKTsKKyAgaWYgKGV4cHJlc3Npb24uSXNFbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIGJvb2wgYklnbm9yZVJvb3QgPSB0cnVlOworICBpZiAocGFyYW1zLnNpemUoKSA+PSAyKQorICAgIGJJZ25vcmVSb290ID0gcnVudGltZS0+VG9Cb29sZWFuKHBhcmFtc1sxXSk7CisKKyAgYm9vbCBiT3ZlcndyaXRlID0gMDsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPj0gMykKKyAgICBiT3ZlcndyaXRlID0gcnVudGltZS0+VG9Cb29sZWFuKHBhcmFtc1syXSk7CisKKyAgYXV0byBwUGFyc2VyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfU2ltcGxlUGFyc2VyPihHZXREb2N1bWVudCgpKTsKKyAgaWYgKCFwUGFyc2VyKQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIENGWF9YTUxOb2RlKiBwWE1MTm9kZSA9IHBQYXJzZXItPlBhcnNlWE1MRGF0YShleHByZXNzaW9uKTsKKyAgaWYgKCFwWE1MTm9kZSkKKyAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKworICBpZiAoYklnbm9yZVJvb3QgJiYKKyAgICAgIChwWE1MTm9kZS0+R2V0VHlwZSgpICE9IEZYX1hNTE5PREVfRWxlbWVudCB8fAorICAgICAgIFhGQV9SZWNvZ25pemVSaWNoVGV4dChzdGF0aWNfY2FzdDxDRlhfWE1MRWxlbWVudCo+KHBYTUxOb2RlKSkpKSB7CisgICAgYklnbm9yZVJvb3QgPSBmYWxzZTsKKyAgfQorCisgIENYRkFfTm9kZSogcEZha2VSb290ID0gR2V0WEZBTm9kZSgpLT5DbG9uZShmYWxzZSk7CisgIFdpZGVTdHJpbmcgd3NDb250ZW50VHlwZSA9IEdldENEYXRhKFhGQV9BdHRyaWJ1dGU6OkNvbnRlbnRUeXBlKTsKKyAgaWYgKCF3c0NvbnRlbnRUeXBlLklzRW1wdHkoKSkgeworICAgIHBGYWtlUm9vdC0+SlNPYmplY3QoKS0+U2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6Q29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nKHdzQ29udGVudFR5cGUpLCBmYWxzZSwgZmFsc2UpOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGWF9YTUxOb2RlPiBwRmFrZVhNTFJvb3QocEZha2VSb290LT5HZXRYTUxNYXBwaW5nTm9kZSgpKTsKKyAgaWYgKCFwRmFrZVhNTFJvb3QpIHsKKyAgICBDRlhfWE1MTm9kZSogcFRoaXNYTUxSb290ID0gR2V0WEZBTm9kZSgpLT5HZXRYTUxNYXBwaW5nTm9kZSgpOworICAgIHBGYWtlWE1MUm9vdCA9IHBUaGlzWE1MUm9vdCA/IHBUaGlzWE1MUm9vdC0+Q2xvbmUoKSA6IG51bGxwdHI7CisgIH0KKyAgaWYgKCFwRmFrZVhNTFJvb3QpIHsKKyAgICBwRmFrZVhNTFJvb3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX1hNTEVsZW1lbnQ+KAorICAgICAgICBXaWRlU3RyaW5nKEdldFhGQU5vZGUoKS0+R2V0Q2xhc3NOYW1lKCkpKTsKKyAgfQorCisgIGlmIChiSWdub3JlUm9vdCkgeworICAgIENGWF9YTUxOb2RlKiBwWE1MQ2hpbGQgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZYX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOworICAgIHdoaWxlIChwWE1MQ2hpbGQpIHsKKyAgICAgIENGWF9YTUxOb2RlKiBwWE1MU2libGluZyA9CisgICAgICAgICAgcFhNTENoaWxkLT5HZXROb2RlSXRlbShDRlhfWE1MTm9kZTo6TmV4dFNpYmxpbmcpOworICAgICAgcFhNTE5vZGUtPlJlbW92ZUNoaWxkTm9kZShwWE1MQ2hpbGQpOworICAgICAgcEZha2VYTUxSb290LT5JbnNlcnRDaGlsZE5vZGUocFhNTENoaWxkKTsKKyAgICAgIHBYTUxDaGlsZCA9IHBYTUxTaWJsaW5nOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBDRlhfWE1MTm9kZSogcFhNTFBhcmVudCA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShDRlhfWE1MTm9kZTo6UGFyZW50KTsKKyAgICBpZiAocFhNTFBhcmVudCkKKyAgICAgIHBYTUxQYXJlbnQtPlJlbW92ZUNoaWxkTm9kZShwWE1MTm9kZSk7CisKKyAgICBwRmFrZVhNTFJvb3QtPkluc2VydENoaWxkTm9kZShwWE1MTm9kZSk7CisgIH0KKworICBwUGFyc2VyLT5Db25zdHJ1Y3RYRkFOb2RlKHBGYWtlUm9vdCwgcEZha2VYTUxSb290LmdldCgpKTsKKyAgcEZha2VSb290ID0gcFBhcnNlci0+R2V0Um9vdE5vZGUoKTsKKyAgaWYgKCFwRmFrZVJvb3QpCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgaWYgKGJPdmVyd3JpdGUpIHsKKyAgICBDWEZBX05vZGUqIHBDaGlsZCA9IEdldFhGQU5vZGUoKS0+R2V0Rmlyc3RDaGlsZCgpOworICAgIENYRkFfTm9kZSogcE5ld0NoaWxkID0gcEZha2VSb290LT5HZXRGaXJzdENoaWxkKCk7CisgICAgaW50MzJfdCBpbmRleCA9IDA7CisgICAgd2hpbGUgKHBOZXdDaGlsZCkgeworICAgICAgQ1hGQV9Ob2RlKiBwSXRlbSA9IHBOZXdDaGlsZC0+R2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgIHBGYWtlUm9vdC0+UmVtb3ZlQ2hpbGQocE5ld0NoaWxkLCB0cnVlKTsKKyAgICAgIEdldFhGQU5vZGUoKS0+SW5zZXJ0Q2hpbGQoaW5kZXgrKywgcE5ld0NoaWxkKTsKKyAgICAgIHBOZXdDaGlsZC0+U2V0RmxhZyhYRkFfTm9kZUZsYWdfSW5pdGlhbGl6ZWQsIHRydWUpOworICAgICAgcE5ld0NoaWxkID0gcEl0ZW07CisgICAgfQorCisgICAgd2hpbGUgKHBDaGlsZCkgeworICAgICAgQ1hGQV9Ob2RlKiBwSXRlbSA9IHBDaGlsZC0+R2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgIEdldFhGQU5vZGUoKS0+UmVtb3ZlQ2hpbGQocENoaWxkLCB0cnVlKTsKKyAgICAgIHBGYWtlUm9vdC0+SW5zZXJ0Q2hpbGQocENoaWxkLCBudWxscHRyKTsKKyAgICAgIHBDaGlsZCA9IHBJdGVtOworICAgIH0KKworICAgIGlmIChHZXRYRkFOb2RlKCktPkdldFBhY2tldFR5cGUoKSA9PSBYRkFfUGFja2V0VHlwZTo6Rm9ybSAmJgorICAgICAgICBHZXRYRkFOb2RlKCktPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkV4RGF0YSkgeworICAgICAgQ0ZYX1hNTE5vZGUqIHBUZW1wWE1MTm9kZSA9IEdldFhGQU5vZGUoKS0+R2V0WE1MTWFwcGluZ05vZGUoKTsKKyAgICAgIEdldFhGQU5vZGUoKS0+U2V0WE1MTWFwcGluZ05vZGUocEZha2VYTUxSb290LnJlbGVhc2UoKSk7CisgICAgICBHZXRYRkFOb2RlKCktPlNldEZsYWcoWEZBX05vZGVGbGFnX093blhNTE5vZGUsIGZhbHNlKTsKKyAgICAgIGlmIChwVGVtcFhNTE5vZGUgJiYgIXBUZW1wWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZYX1hNTE5vZGU6OlBhcmVudCkpCisgICAgICAgIHBGYWtlWE1MUm9vdC5yZXNldChwVGVtcFhNTE5vZGUpOworICAgICAgZWxzZQorICAgICAgICBwRmFrZVhNTFJvb3QgPSBudWxscHRyOworICAgIH0KKyAgICBNb3ZlQnVmZmVyTWFwRGF0YShwRmFrZVJvb3QsIEdldFhGQU5vZGUoKSk7CisgIH0gZWxzZSB7CisgICAgQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBwRmFrZVJvb3QtPkdldEZpcnN0Q2hpbGQoKTsKKyAgICB3aGlsZSAocENoaWxkKSB7CisgICAgICBDWEZBX05vZGUqIHBJdGVtID0gcENoaWxkLT5HZXROZXh0U2libGluZygpOworICAgICAgcEZha2VSb290LT5SZW1vdmVDaGlsZChwQ2hpbGQsIHRydWUpOworICAgICAgR2V0WEZBTm9kZSgpLT5JbnNlcnRDaGlsZChwQ2hpbGQsIG51bGxwdHIpOworICAgICAgcENoaWxkLT5TZXRGbGFnKFhGQV9Ob2RlRmxhZ19Jbml0aWFsaXplZCwgdHJ1ZSk7CisgICAgICBwQ2hpbGQgPSBwSXRlbTsKKyAgICB9CisgIH0KKworICBpZiAocEZha2VYTUxSb290KSB7CisgICAgcEZha2VSb290LT5TZXRYTUxNYXBwaW5nTm9kZShwRmFrZVhNTFJvb3QucmVsZWFzZSgpKTsKKyAgICBwRmFrZVJvb3QtPlNldEZsYWcoWEZBX05vZGVGbGFnX093blhNTE5vZGUsIGZhbHNlKTsKKyAgfQorICBwRmFrZVJvb3QtPlNldEZsYWcoWEZBX05vZGVGbGFnX0hhc1JlbW92ZWRDaGlsZHJlbiwgZmFsc2UpOworCisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIENKWF9Ob2RlOjpzYXZlRmlsdGVyZWRYTUwoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIC8vIFRPRE8od2VpbGkpOiBDaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMsIHBkZml1bTo1MDEuCisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIENKWF9Ob2RlOjpzYXZlWE1MKENKU19WOCogcnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPiAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKyAgaWYgKHBhcmFtcy5zaXplKCkgPT0gMSAmJiBydW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzBdKSAhPSBMInByZXR0eSIpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprVmFsdWVFcnJvcikpOworCisgIC8vIFRPRE8od2VpbGkpOiBDaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gc2F2ZSBwcmV0dHkgcHJpbnQgWE1MLCBwZGZpdW06NTAxLgorCisgIFdpZGVTdHJpbmcgYnNYTUxIZWFkZXIgPSBMIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIjsKKyAgaWYgKEdldFhGQU5vZGUoKS0+R2V0UGFja2V0VHlwZSgpICE9IFhGQV9QYWNrZXRUeXBlOjpGb3JtICYmCisgICAgICBHZXRYRkFOb2RlKCktPkdldFBhY2tldFR5cGUoKSAhPSBYRkFfUGFja2V0VHlwZTo6RGF0YXNldHMpIHsKKyAgICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdTdHJpbmcoIiIpKTsKKyAgfQorCisgIENGWF9YTUxOb2RlKiBwRWxlbWVudCA9IG51bGxwdHI7CisgIGlmIChHZXRYRkFOb2RlKCktPkdldFBhY2tldFR5cGUoKSA9PSBYRkFfUGFja2V0VHlwZTo6RGF0YXNldHMpIHsKKyAgICBwRWxlbWVudCA9IEdldFhGQU5vZGUoKS0+R2V0WE1MTWFwcGluZ05vZGUoKTsKKyAgICBpZiAoIXBFbGVtZW50IHx8IHBFbGVtZW50LT5HZXRUeXBlKCkgIT0gRlhfWE1MTk9ERV9FbGVtZW50KSB7CisgICAgICByZXR1cm4gQ0pTX1JldHVybigKKyAgICAgICAgICBydW50aW1lLT5OZXdTdHJpbmcoYnNYTUxIZWFkZXIuVVRGOEVuY29kZSgpLkFzU3RyaW5nVmlldygpKSk7CisgICAgfQorCisgICAgWEZBX0RhdGFFeHBvcnRlcl9EZWFsV2l0aERhdGFHcm91cE5vZGUoR2V0WEZBTm9kZSgpKTsKKyAgfQorCisgIGF1dG8gcE1lbW9yeVN0cmVhbSA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfTWVtb3J5U3RyZWFtPih0cnVlKTsKKyAgYXV0byBwU3RyZWFtID0KKyAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDRlhfU2Vla2FibGVTdHJlYW1Qcm94eT4ocE1lbW9yeVN0cmVhbSwgdHJ1ZSk7CisgIHBTdHJlYW0tPlNldENvZGVQYWdlKEZYX0NPREVQQUdFX1VURjgpOworICBwU3RyZWFtLT5Xcml0ZVN0cmluZyhic1hNTEhlYWRlci5Bc1N0cmluZ1ZpZXcoKSk7CisKKyAgaWYgKEdldFhGQU5vZGUoKS0+R2V0UGFja2V0VHlwZSgpID09IFhGQV9QYWNrZXRUeXBlOjpGb3JtKQorICAgIFhGQV9EYXRhRXhwb3J0ZXJfUmVnZW5lcmF0ZUZvcm1GaWxlKEdldFhGQU5vZGUoKSwgcFN0cmVhbSwgbnVsbHB0ciwgdHJ1ZSk7CisgIGVsc2UKKyAgICBwRWxlbWVudC0+U2F2ZVhNTE5vZGUocFN0cmVhbSk7CisKKyAgcmV0dXJuIENKU19SZXR1cm4ocnVudGltZS0+TmV3U3RyaW5nKAorICAgICAgQnl0ZVN0cmluZ1ZpZXcocE1lbW9yeVN0cmVhbS0+R2V0QnVmZmVyKCksIHBNZW1vcnlTdHJlYW0tPkdldFNpemUoKSkpKTsKK30KKworQ0pTX1JldHVybiBDSlhfTm9kZTo6c2V0QXR0cmlidXRlKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAyKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBXaWRlU3RyaW5nIGF0dHJpYnV0ZVZhbHVlID0gcnVudGltZS0+VG9XaWRlU3RyaW5nKHBhcmFtc1swXSk7CisgIFdpZGVTdHJpbmcgYXR0cmlidXRlID0gcnVudGltZS0+VG9XaWRlU3RyaW5nKHBhcmFtc1sxXSk7CisgIFNldEF0dHJpYnV0ZShhdHRyaWJ1dGUuQXNTdHJpbmdWaWV3KCksIGF0dHJpYnV0ZVZhbHVlLkFzU3RyaW5nVmlldygpLCB0cnVlKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX05vZGU6OnNldEVsZW1lbnQoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEgJiYgcGFyYW1zLnNpemUoKSAhPSAyKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICAvLyBUT0RPKHdlaWxpKTogY2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGltcGxlbWVudCB0aGlzLCBwZGZpdW06NTAxLgorICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKwordm9pZCBDSlhfTm9kZTo6aWQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Ob2RlOjpucyhDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgaWYgKGJTZXR0aW5nKSB7CisgICAgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKTsKKyAgICByZXR1cm47CisgIH0KKyAgcFZhbHVlLT5TZXRTdHJpbmcoCisgICAgICBUcnlOYW1lc3BhY2UoKS52YWx1ZV9vcihXaWRlU3RyaW5nKCkpLlVURjhFbmNvZGUoKS5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKK3ZvaWQgQ0pYX05vZGU6Om1vZGVsKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBpZiAoYlNldHRpbmcpIHsKKyAgICBUaHJvd0ludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorICBwVmFsdWUtPkFzc2lnbihHZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKAorICAgICAgR2V0WEZBTm9kZSgpLT5HZXRNb2RlbE5vZGUoKSkpOworfQorCit2b2lkIENKWF9Ob2RlOjppc0NvbnRhaW5lcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgaWYgKGJTZXR0aW5nKSB7CisgICAgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKTsKKyAgICByZXR1cm47CisgIH0KKyAgcFZhbHVlLT5TZXRCb29sZWFuKEdldFhGQU5vZGUoKS0+SXNDb250YWluZXJOb2RlKCkpOworfQorCit2b2lkIENKWF9Ob2RlOjppc051bGwoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgaWYgKGJTZXR0aW5nKSB7CisgICAgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKEdldFhGQU5vZGUoKS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6U3ViZm9ybSkgeworICAgIHBWYWx1ZS0+U2V0Qm9vbGVhbihmYWxzZSk7CisgICAgcmV0dXJuOworICB9CisgIHBWYWx1ZS0+U2V0Qm9vbGVhbihHZXRDb250ZW50KGZhbHNlKS5Jc0VtcHR5KCkpOworfQorCit2b2lkIENKWF9Ob2RlOjpvbmVPZkNoaWxkKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgaWYgKGJTZXR0aW5nKSB7CisgICAgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKTsKKyAgICByZXR1cm47CisgIH0KKworICBzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPiBwcm9wZXJ0aWVzID0gR2V0WEZBTm9kZSgpLT5HZXROb2RlTGlzdCgKKyAgICAgIFhGQV9OT0RFRklMVEVSX09uZU9mUHJvcGVydHksIFhGQV9FbGVtZW50OjpVbmtub3duKTsKKyAgaWYgKCFwcm9wZXJ0aWVzLmVtcHR5KCkpIHsKKyAgICBwVmFsdWUtPkFzc2lnbihHZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKAorICAgICAgICBwcm9wZXJ0aWVzLmZyb250KCkpKTsKKyAgfQorfQorCitpbnQzMl90IENKWF9Ob2RlOjpleGVjU2luZ2xlRXZlbnRCeU5hbWUoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzRXZlbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50IGVUeXBlKSB7CisgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBHZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKKyAgaWYgKCFwTm90aWZ5KQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKKworICBjb25zdCBYRkFfRXhlY0V2ZW50UGFyYUluZm8qIGV2ZW50UGFyYUluZm8gPQorICAgICAgR2V0RXZlbnRQYXJhSW5mb0J5TmFtZSh3c0V2ZW50TmFtZSk7CisgIGlmICghZXZlbnRQYXJhSW5mbykKKyAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7CisKKyAgc3dpdGNoIChldmVudFBhcmFJbmZvLT5tX3ZhbGlkRmxhZ3MpIHsKKyAgICBjYXNlIEV2ZW50QXBwbGllc1Rvbzo6a05vbmU6CisgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7CisgICAgY2FzZSBFdmVudEFwcGxpZXNUb286OmtBbGw6CisgICAgY2FzZSBFdmVudEFwcGxpZXNUb286OmtBbGxOb25SZWN1cnNpdmU6CisgICAgICByZXR1cm4gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QoCisgICAgICAgICAgR2V0WEZBTm9kZSgpLCBldmVudFBhcmFJbmZvLT5tX2V2ZW50VHlwZSwgZmFsc2UsCisgICAgICAgICAgZXZlbnRQYXJhSW5mby0+bV92YWxpZEZsYWdzID09IEV2ZW50QXBwbGllc1Rvbzo6a0FsbCk7CisgICAgY2FzZSBFdmVudEFwcGxpZXNUb286OmtTdWJmb3JtOgorICAgICAgaWYgKGVUeXBlICE9IFhGQV9FbGVtZW50OjpTdWJmb3JtKQorICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7CisKKyAgICAgIHJldHVybiBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCgKKyAgICAgICAgICBHZXRYRkFOb2RlKCksIGV2ZW50UGFyYUluZm8tPm1fZXZlbnRUeXBlLCBmYWxzZSwgZmFsc2UpOworICAgIGNhc2UgRXZlbnRBcHBsaWVzVG9vOjprRmllbGRPckV4Y2x1c2lvbjogeworICAgICAgaWYgKGVUeXBlICE9IFhGQV9FbGVtZW50OjpFeGNsR3JvdXAgJiYgZVR5cGUgIT0gWEZBX0VsZW1lbnQ6OkZpZWxkKQorICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7CisKKyAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBHZXRYRkFOb2RlKCktPkdldFBhcmVudCgpOworICAgICAgaWYgKHBQYXJlbnROb2RlICYmCisgICAgICAgICAgcFBhcmVudE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkV4Y2xHcm91cCkgeworICAgICAgICAvLyBUT0RPKGRzaW5jbGFpcik6IFRoaXMgc2VlbXMgbGlrZSBhIGJ1Zywgd2UgZG8gdGhlIHNhbWUgd29yayB0d2ljZT8KKyAgICAgICAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QoR2V0WEZBTm9kZSgpLCBldmVudFBhcmFJbmZvLT5tX2V2ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCgKKyAgICAgICAgICBHZXRYRkFOb2RlKCksIGV2ZW50UGFyYUluZm8tPm1fZXZlbnRUeXBlLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKyAgICBjYXNlIEV2ZW50QXBwbGllc1Rvbzo6a0ZpZWxkOgorICAgICAgaWYgKGVUeXBlICE9IFhGQV9FbGVtZW50OjpGaWVsZCkKKyAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0OworCisgICAgICByZXR1cm4gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QoCisgICAgICAgICAgR2V0WEZBTm9kZSgpLCBldmVudFBhcmFJbmZvLT5tX2V2ZW50VHlwZSwgZmFsc2UsIGZhbHNlKTsKKyAgICBjYXNlIEV2ZW50QXBwbGllc1Rvbzo6a1NpZ25hdHVyZTogeworICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBHZXRYRkFOb2RlKCktPkdldFdpZGdldEFjYygpOworICAgICAgaWYgKCFwV2lkZ2V0QWNjKQorICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7CisKKyAgICAgIENYRkFfTm9kZSogcFVJTm9kZSA9IHBXaWRnZXRBY2MtPkdldFVJQ2hpbGQoKTsKKyAgICAgIGlmIChwVUlOb2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpTaWduYXR1cmUpCisgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKKworICAgICAgcmV0dXJuIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KAorICAgICAgICAgIEdldFhGQU5vZGUoKSwgZXZlbnRQYXJhSW5mby0+bV9ldmVudFR5cGUsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorICAgIGNhc2UgRXZlbnRBcHBsaWVzVG9vOjprQ2hvaWNlTGlzdDogeworICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBHZXRYRkFOb2RlKCktPkdldFdpZGdldEFjYygpOworICAgICAgaWYgKCFwV2lkZ2V0QWNjKQorICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7CisKKyAgICAgIENYRkFfTm9kZSogcFVJTm9kZSA9IHBXaWRnZXRBY2MtPkdldFVJQ2hpbGQoKTsKKyAgICAgIGlmIChwVUlOb2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpDaG9pY2VMaXN0IHx8CisgICAgICAgICAgcFdpZGdldEFjYy0+SXNMaXN0Qm94KCkpIHsKKyAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0OworICAgICAgfQorICAgICAgcmV0dXJuIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KAorICAgICAgICAgIEdldFhGQU5vZGUoKSwgZXZlbnRQYXJhSW5mby0+bV9ldmVudFR5cGUsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorICB9CisgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9ub2RlLmggYi9meGpzL3hmYS9janhfbm9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3Y2JjZTgKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfbm9kZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfTk9ERV9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfTk9ERV9IXworCisjaW5jbHVkZSAiZnhqcy9DSlhfRGVmaW5lLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X29iamVjdC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF90cmVlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvZnhmYV9iYXNpYy5oIgorCitjbGFzcyBDWEZBX05vZGU7CisKK2NsYXNzIENKWF9Ob2RlIDogcHVibGljIENKWF9UcmVlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9Ob2RlKENYRkFfTm9kZSogbm9kZSk7CisgIH5DSlhfTm9kZSgpIG92ZXJyaWRlOworCisgIEpTX01FVEhPRChhcHBseVhTTCwgQ0pYX05vZGUpOworICBKU19NRVRIT0QoYXNzaWduTm9kZSwgQ0pYX05vZGUpOworICBKU19NRVRIT0QoY2xvbmUsIENKWF9Ob2RlKTsKKyAgSlNfTUVUSE9EKGdldEF0dHJpYnV0ZSwgQ0pYX05vZGUpOworICBKU19NRVRIT0QoZ2V0RWxlbWVudCwgQ0pYX05vZGUpOworICBKU19NRVRIT0QoaXNQcm9wZXJ0eVNwZWNpZmllZCwgQ0pYX05vZGUpOworICBKU19NRVRIT0QobG9hZFhNTCwgQ0pYX05vZGUpOworICBKU19NRVRIT0Qoc2F2ZUZpbHRlcmVkWE1MLCBDSlhfTm9kZSk7CisgIEpTX01FVEhPRChzYXZlWE1MLCBDSlhfTm9kZSk7CisgIEpTX01FVEhPRChzZXRBdHRyaWJ1dGUsIENKWF9Ob2RlKTsKKyAgSlNfTUVUSE9EKHNldEVsZW1lbnQsIENKWF9Ob2RlKTsKKworICBKU19QUk9QKGlkKTsKKyAgSlNfUFJPUChpc0NvbnRhaW5lcik7CisgIEpTX1BST1AoaXNOdWxsKTsKKyAgSlNfUFJPUChtb2RlbCk7CisgIEpTX1BST1AobnMpOworICBKU19QUk9QKG9uZU9mQ2hpbGQpOworCisgIENYRkFfTm9kZSogR2V0WEZBTm9kZSgpOworICBjb25zdCBDWEZBX05vZGUqIEdldFhGQU5vZGUoKSBjb25zdDsKKworIHByb3RlY3RlZDoKKyAgaW50MzJfdCBleGVjU2luZ2xlRXZlbnRCeU5hbWUoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzRXZlbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudCBlVHlwZSk7CisKKyBwcml2YXRlOgorICBzdGF0aWMgY29uc3QgQ0pYX01ldGhvZFNwZWMgTWV0aG9kU3BlY3NbXTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX05PREVfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9udW1lcmljZWRpdC5jcHAgYi9meGpzL3hmYS9janhfbnVtZXJpY2VkaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NmNjNjYKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfbnVtZXJpY2VkaXQuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9udW1lcmljZWRpdC5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtZXJpY2VkaXQuaCIKKworQ0pYX051bWVyaWNFZGl0OjpDSlhfTnVtZXJpY0VkaXQoQ1hGQV9OdW1lcmljRWRpdCogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfTnVtZXJpY0VkaXQ6On5DSlhfTnVtZXJpY0VkaXQoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX051bWVyaWNFZGl0Ojp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfTnVtZXJpY0VkaXQ6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9OdW1lcmljRWRpdDo6aFNjcm9sbFBvbGljeShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfbnVtZXJpY2VkaXQuaCBiL2Z4anMveGZhL2NqeF9udW1lcmljZWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZjlkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfbnVtZXJpY2VkaXQuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX05VTUVSSUNFRElUX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9OVU1FUklDRURJVF9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9OdW1lcmljRWRpdDsKKworY2xhc3MgQ0pYX051bWVyaWNFZGl0IDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9OdW1lcmljRWRpdChDWEZBX051bWVyaWNFZGl0KiBub2RlKTsKKyAgfkNKWF9OdW1lcmljRWRpdCgpIG92ZXJyaWRlOworCisgIEpTX1BST1AoaFNjcm9sbFBvbGljeSk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX05VTUVSSUNFRElUX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfb2JqZWN0LmNwcCBiL2Z4anMveGZhL2NqeF9vYmplY3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MDhjZjMKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfb2JqZWN0LmNwcApAQCAtMCwwICsxLDE3MDQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9vYmplY3QuaCIKKworI2luY2x1ZGUgPHR1cGxlPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfZGVjaW1hbC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbHRleHQuaCIKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV9lbmdpbmUuaCIKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV92YWx1ZS5oIgorI2luY2x1ZGUgImZ4anMvY2pzX3JldHVybi5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ib29sZWFuLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2RyYXcuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZmllbGQuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfaW5zdGFuY2VtYW5hZ2VyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZub3RpZnkuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV93aWRnZXRhY2MuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib3JkZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhdmFsdWUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2VkZ2UuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9maWxsLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9udC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dHByb2Nlc3Nvci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21lYXN1cmVtZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX29iamVjdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX29jY3VyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJvdG8uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJmb3JtLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsaWRhdGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWx1ZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfdXRpbHMuaCIKKworbmFtZXNwYWNlIHsKKwordm9pZCBYRkFfRGVsZXRlV2lkZVN0cmluZyh2b2lkKiBwRGF0YSkgeworICBkZWxldGUgc3RhdGljX2Nhc3Q8V2lkZVN0cmluZyo+KHBEYXRhKTsKK30KKwordm9pZCBYRkFfQ29weVdpZGVTdHJpbmcodm9pZComIHBEYXRhKSB7CisgIGlmICghcERhdGEpCisgICAgcmV0dXJuOworICBwRGF0YSA9IG5ldyBXaWRlU3RyaW5nKCpyZWludGVycHJldF9jYXN0PFdpZGVTdHJpbmcqPihwRGF0YSkpOworfQorCitYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPIGRlbGV0ZVdpZGVTdHJpbmdDYWxsQmFjayA9IHtYRkFfRGVsZXRlV2lkZVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9Db3B5V2lkZVN0cmluZ307CisKK2VudW0gWEZBX0tFWVRZUEUgeworICBYRkFfS0VZVFlQRV9DdXN0b20sCisgIFhGQV9LRVlUWVBFX0VsZW1lbnQsCit9OworCit2b2lkKiBHZXRNYXBLZXlfQ3VzdG9tKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c0tleSkgeworICB1aW50MzJfdCBkd0tleSA9IEZYX0hhc2hDb2RlX0dldFcod3NLZXksIGZhbHNlKTsKKyAgcmV0dXJuICh2b2lkKikodWludHB0cl90KSgoZHdLZXkgPDwgMSkgfCBYRkFfS0VZVFlQRV9DdXN0b20pOworfQorCit2b2lkKiBHZXRNYXBLZXlfRWxlbWVudChYRkFfRWxlbWVudCBlVHlwZSwgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIHJldHVybiAodm9pZCopKHVpbnRwdHJfdCkoKHN0YXRpY19jYXN0PHVpbnQzMl90PihlVHlwZSkgPDwgMTYpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGVBdHRyaWJ1dGUpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfS0VZVFlQRV9FbGVtZW50KTsKK30KKwordm9pZCBYRkFfRGVmYXVsdEZyZWVEYXRhKHZvaWQqIHBEYXRhKSB7fQorCitYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPIGdzX1hGQURlZmF1bHRGcmVlRGF0YSA9IHtYRkFfRGVmYXVsdEZyZWVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cn07CisKK3N0ZDo6dHVwbGU8aW50MzJfdCwgaW50MzJfdCwgaW50MzJfdD4gU3RyVG9SR0IoY29uc3QgV2lkZVN0cmluZyYgc3RyUkdCKSB7CisgIGludDMyX3QgciA9IDA7CisgIGludDMyX3QgZyA9IDA7CisgIGludDMyX3QgYiA9IDA7CisKKyAgc2l6ZV90IGlJbmRleCA9IDA7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyUkdCLkdldExlbmd0aCgpOyArK2kpIHsKKyAgICB3Y2hhcl90IGNoID0gc3RyUkdCW2ldOworICAgIGlmIChjaCA9PSBMJywnKQorICAgICAgKytpSW5kZXg7CisgICAgaWYgKGlJbmRleCA+IDIpCisgICAgICBicmVhazsKKworICAgIGludDMyX3QgaVZhbHVlID0gY2ggLSBMJzAnOworICAgIGlmIChpVmFsdWUgPj0gMCAmJiBpVmFsdWUgPD0gOSkgeworICAgICAgc3dpdGNoIChpSW5kZXgpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgIHIgPSByICogMTAgKyBpVmFsdWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICBnID0gZyAqIDEwICsgaVZhbHVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGIgPSBiICogMTAgKyBpVmFsdWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB7ciwgZywgYn07Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitzdHJ1Y3QgWEZBX01BUERBVEFCTE9DSyB7CisgIHVpbnQ4X3QqIEdldERhdGEoKSBjb25zdCB7IHJldHVybiAodWludDhfdCopdGhpcyArIHNpemVvZihYRkFfTUFQREFUQUJMT0NLKTsgfQorCisgIFhGQV9NQVBEQVRBQkxPQ0tDQUxMQkFDS0lORk8qIHBDYWxsYmFja0luZm87CisgIGludDMyX3QgaUJ5dGVzOworfTsKKworc3RydWN0IFhGQV9NQVBNT0RVTEVEQVRBIHsKKyAgWEZBX01BUE1PRFVMRURBVEEoKSB7fQorICB+WEZBX01BUE1PRFVMRURBVEEoKSB7fQorCisgIHN0ZDo6bWFwPHZvaWQqLCB2b2lkKj4gbV9WYWx1ZU1hcDsKKyAgc3RkOjptYXA8dm9pZCosIFhGQV9NQVBEQVRBQkxPQ0sqPiBtX0J1ZmZlck1hcDsKK307CisKK0NKWF9PYmplY3Q6OkNKWF9PYmplY3QoQ1hGQV9PYmplY3QqIG9iaikgOiBvYmplY3RfKG9iaikge30KKworQ0pYX09iamVjdDo6fkNKWF9PYmplY3QoKSB7CisgIENsZWFyTWFwTW9kdWxlQnVmZmVyKCk7Cit9CisKK3ZvaWQgQ0pYX09iamVjdDo6RGVmaW5lTWV0aG9kcyhjb25zdCBDSlhfTWV0aG9kU3BlYyBtZXRob2Rfc3BlY3NbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgY291bnQpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKQorICAgIG1ldGhvZF9zcGVjc19bbWV0aG9kX3NwZWNzW2ldLnBOYW1lXSA9IG1ldGhvZF9zcGVjc1tpXS5wTWV0aG9kQ2FsbDsKK30KKworQ1hGQV9Eb2N1bWVudCogQ0pYX09iamVjdDo6R2V0RG9jdW1lbnQoKSBjb25zdCB7CisgIHJldHVybiBvYmplY3RfLT5HZXREb2N1bWVudCgpOworfQorCit2b2lkIENKWF9PYmplY3Q6OmNsYXNzTmFtZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgaWYgKGJTZXR0aW5nKSB7CisgICAgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKTsKKyAgICByZXR1cm47CisgIH0KKyAgcFZhbHVlLT5TZXRTdHJpbmcoCisgICAgICBGWF9VVEY4RW5jb2RlKEdldFhGQU9iamVjdCgpLT5HZXRDbGFzc05hbWUoKSkuQXNTdHJpbmdWaWV3KCkpOworfQorCitpbnQzMl90IENKWF9PYmplY3Q6OlN1YmZvcm1fYW5kX1N1YmZvcm1TZXRfSW5zdGFuY2VJbmRleCgpIHsKKyAgaW50MzJfdCBpbmRleCA9IDA7CisgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IFRvTm9kZShHZXRYRkFPYmplY3QoKSktPkdldFByZXZTaWJsaW5nKCk7IHBOb2RlOworICAgICAgIHBOb2RlID0gcE5vZGUtPkdldFByZXZTaWJsaW5nKCkpIHsKKyAgICBpZiAoKHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpTdWJmb3JtKSAmJgorICAgICAgICAocE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm1TZXQpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaW5kZXgrKzsKKyAgfQorICByZXR1cm4gaW5kZXg7Cit9CisKK2Jvb2wgQ0pYX09iamVjdDo6SGFzTWV0aG9kKGNvbnN0IFdpZGVTdHJpbmcmIGZ1bmMpIGNvbnN0IHsKKyAgcmV0dXJuIHBkZml1bTo6Q29udGFpbnNLZXkobWV0aG9kX3NwZWNzXywgZnVuYy5VVEY4RW5jb2RlKCkpOworfQorCitDSlNfUmV0dXJuIENKWF9PYmplY3Q6OlJ1bk1ldGhvZCgKKyAgICBjb25zdCBXaWRlU3RyaW5nJiBmdW5jLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGF1dG8gaXQgPSBtZXRob2Rfc3BlY3NfLmZpbmQoZnVuYy5VVEY4RW5jb2RlKCkpOworICBpZiAoaXQgPT0gbWV0aG9kX3NwZWNzXy5lbmQoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihmYWxzZSk7CisgIHJldHVybiBpdC0+c2Vjb25kKHRoaXMsIEdldFhGQU9iamVjdCgpLT5HZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgIHBhcmFtcyk7Cit9CisKK3ZvaWQgQ0pYX09iamVjdDo6VGhyb3dUb29NYW55T2NjdXJhbmNlc0V4Y2VwdGlvbihjb25zdCBXaWRlU3RyaW5nJiBvYmopIGNvbnN0IHsKKyAgVGhyb3dFeGNlcHRpb24oCisgICAgICBMIlRoZSBlbGVtZW50IFslbHNdIGhhcyB2aW9sYXRlZCBpdHMgYWxsb3dhYmxlIG51bWJlciBvZiBvY2N1cnJlbmNlcy4iLAorICAgICAgb2JqLmNfc3RyKCkpOworfQorCit2b2lkIENKWF9PYmplY3Q6OlRocm93SW52YWxpZFByb3BlcnR5RXhjZXB0aW9uKCkgY29uc3QgeworICBUaHJvd0V4Y2VwdGlvbihMIkludmFsaWQgcHJvcGVydHkgc2V0IG9wZXJhdGlvbi4iKTsKK30KKwordm9pZCBDSlhfT2JqZWN0OjpUaHJvd0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKSBjb25zdCB7CisgIFRocm93RXhjZXB0aW9uKEwiSW5kZXggdmFsdWUgaXMgb3V0IG9mIGJvdW5kcy4iKTsKK30KKwordm9pZCBDSlhfT2JqZWN0OjpUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbigKKyAgICBjb25zdCBXaWRlU3RyaW5nJiBtZXRob2QpIGNvbnN0IHsKKyAgVGhyb3dFeGNlcHRpb24oTCJJbmNvcnJlY3QgbnVtYmVyIG9mIHBhcmFtZXRlcnMgY2FsbGluZyBtZXRob2QgJyUuMTZzJy4iLAorICAgICAgICAgICAgICAgICBtZXRob2QuY19zdHIoKSk7Cit9CisKK3ZvaWQgQ0pYX09iamVjdDo6VGhyb3dBcmd1bWVudE1pc21hdGNoRXhjZXB0aW9uKCkgY29uc3QgeworICBUaHJvd0V4Y2VwdGlvbihMIkFyZ3VtZW50IG1pc21hdGNoIGluIHByb3BlcnR5IG9yIGZ1bmN0aW9uIGFyZ3VtZW50LiIpOworfQorCit2b2lkIENKWF9PYmplY3Q6OlRocm93RXhjZXB0aW9uKGNvbnN0IHdjaGFyX3QqIHN0ciwgLi4uKSBjb25zdCB7CisgIHZhX2xpc3QgYXJnX3B0cjsKKyAgdmFfc3RhcnQoYXJnX3B0ciwgc3RyKTsKKyAgV2lkZVN0cmluZyB3c01lc3NhZ2UgPSBXaWRlU3RyaW5nOjpGb3JtYXRWKHN0ciwgYXJnX3B0cik7CisgIHZhX2VuZChhcmdfcHRyKTsKKworICBBU1NFUlQoIXdzTWVzc2FnZS5Jc0VtcHR5KCkpOworICBGWEpTRV9UaHJvd01lc3NhZ2Uod3NNZXNzYWdlLlVURjhFbmNvZGUoKS5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKK2Jvb2wgQ0pYX09iamVjdDo6SGFzQXR0cmlidXRlKFhGQV9BdHRyaWJ1dGUgZUF0dHIpIHsKKyAgdm9pZCogcEtleSA9IEdldE1hcEtleV9FbGVtZW50KEdldFhGQU9iamVjdCgpLT5HZXRFbGVtZW50VHlwZSgpLCBlQXR0cik7CisgIHJldHVybiBIYXNNYXBNb2R1bGVLZXkocEtleSk7Cit9CisKK2Jvb2wgQ0pYX09iamVjdDo6U2V0QXR0cmlidXRlKFhGQV9BdHRyaWJ1dGUgZUF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk5vdGlmeSkgeworICBzd2l0Y2ggKFRvTm9kZShHZXRYRkFPYmplY3QoKSktPkdldEF0dHJpYnV0ZVR5cGUoZUF0dHIpKSB7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlVHlwZTo6RW51bTogeworICAgICAgT3B0aW9uYWw8WEZBX0F0dHJpYnV0ZUVudW0+IGl0ZW0gPQorICAgICAgICAgIENYRkFfTm9kZTo6TmFtZVRvQXR0cmlidXRlRW51bSh3c1ZhbHVlKTsKKyAgICAgIHJldHVybiBTZXRFbnVtKAorICAgICAgICAgIGVBdHRyLAorICAgICAgICAgIGl0ZW0gPyAqaXRlbSA6ICooVG9Ob2RlKEdldFhGQU9iamVjdCgpKS0+R2V0RGVmYXVsdEVudW0oZUF0dHIpKSwKKyAgICAgICAgICBiTm90aWZ5KTsKKyAgICB9CisgICAgY2FzZSBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGE6CisgICAgICByZXR1cm4gU2V0Q0RhdGEoZUF0dHIsIFdpZGVTdHJpbmcod3NWYWx1ZSksIGJOb3RpZnksIGZhbHNlKTsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVUeXBlOjpCb29sZWFuOgorICAgICAgcmV0dXJuIFNldEJvb2xlYW4oZUF0dHIsIHdzVmFsdWUgIT0gTCIwIiwgYk5vdGlmeSk7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlcjoKKyAgICAgIHJldHVybiBTZXRJbnRlZ2VyKGVBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoRlhTWVNfd2NzdG9mKHdzVmFsdWUudW50ZXJtaW5hdGVkX2Nfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZS5HZXRMZW5ndGgoKSwgbnVsbHB0cikpLAorICAgICAgICAgICAgICAgICAgICAgICAgYk5vdGlmeSk7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZToKKyAgICAgIHJldHVybiBTZXRNZWFzdXJlKGVBdHRyLCBDWEZBX01lYXN1cmVtZW50KHdzVmFsdWUpLCBiTm90aWZ5KTsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIENKWF9PYmplY3Q6OlNldE1hcE1vZHVsZVN0cmluZyh2b2lkKiBwS2V5LCBjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NWYWx1ZSkgeworICBTZXRNYXBNb2R1bGVCdWZmZXIocEtleSwgKHZvaWQqKXdzVmFsdWUudW50ZXJtaW5hdGVkX2Nfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlLkdldExlbmd0aCgpICogc2l6ZW9mKHdjaGFyX3QpLCBudWxscHRyKTsKK30KKworYm9vbCBDSlhfT2JqZWN0OjpTZXRBdHRyaWJ1dGUoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzQXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5KSB7CisgIFhGQV9BdHRyaWJ1dGUgYXR0ciA9IENYRkFfTm9kZTo6TmFtZVRvQXR0cmlidXRlKHdzVmFsdWUpOworICBpZiAoYXR0ciAhPSBYRkFfQXR0cmlidXRlOjpVbmtub3duKQorICAgIHJldHVybiBTZXRBdHRyaWJ1dGUoYXR0ciwgd3NWYWx1ZSwgYk5vdGlmeSk7CisKKyAgdm9pZCogcEtleSA9IEdldE1hcEtleV9DdXN0b20od3NBdHRyKTsKKyAgU2V0TWFwTW9kdWxlU3RyaW5nKHBLZXksIHdzVmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworV2lkZVN0cmluZyBDSlhfT2JqZWN0OjpHZXRBdHRyaWJ1dGUoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGF0dHIpIHsKKyAgcmV0dXJuIFRyeUF0dHJpYnV0ZShhdHRyLCB0cnVlKS52YWx1ZV9vcihXaWRlU3RyaW5nKCkpOworfQorCitXaWRlU3RyaW5nIENKWF9PYmplY3Q6OkdldEF0dHJpYnV0ZShYRkFfQXR0cmlidXRlIGF0dHIpIHsKKyAgcmV0dXJuIFRyeUF0dHJpYnV0ZShhdHRyLCB0cnVlKS52YWx1ZV9vcihXaWRlU3RyaW5nKCkpOworfQorCitPcHRpb25hbDxXaWRlU3RyaW5nPiBDSlhfT2JqZWN0OjpUcnlBdHRyaWJ1dGUoWEZBX0F0dHJpYnV0ZSBlQXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJVc2VEZWZhdWx0KSB7CisgIHN3aXRjaCAoVG9Ob2RlKEdldFhGQU9iamVjdCgpKS0+R2V0QXR0cmlidXRlVHlwZShlQXR0cikpIHsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtOiB7CisgICAgICBPcHRpb25hbDxYRkFfQXR0cmlidXRlRW51bT4gdmFsdWUgPSBUcnlFbnVtKGVBdHRyLCBiVXNlRGVmYXVsdCk7CisgICAgICBpZiAoIXZhbHVlKQorICAgICAgICByZXR1cm4ge307CisKKyAgICAgIHJldHVybiB7Q1hGQV9Ob2RlOjpBdHRyaWJ1dGVFbnVtVG9OYW1lKCp2YWx1ZSl9OworICAgIH0KKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YToKKyAgICAgIHJldHVybiBUcnlDRGF0YShlQXR0ciwgYlVzZURlZmF1bHQpOworCisgICAgY2FzZSBYRkFfQXR0cmlidXRlVHlwZTo6Qm9vbGVhbjogeworICAgICAgT3B0aW9uYWw8Ym9vbD4gdmFsdWUgPSBUcnlCb29sZWFuKGVBdHRyLCBiVXNlRGVmYXVsdCk7CisgICAgICBpZiAoIXZhbHVlKQorICAgICAgICByZXR1cm4ge307CisgICAgICByZXR1cm4geyp2YWx1ZSA/IEwiMSIgOiBMIjAifTsKKyAgICB9CisgICAgY2FzZSBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlcjogeworICAgICAgT3B0aW9uYWw8aW50MzJfdD4gaVZhbHVlID0gVHJ5SW50ZWdlcihlQXR0ciwgYlVzZURlZmF1bHQpOworICAgICAgaWYgKCFpVmFsdWUpCisgICAgICAgIHJldHVybiB7fTsKKyAgICAgIHJldHVybiB7V2lkZVN0cmluZzo6Rm9ybWF0KEwiJWQiLCAqaVZhbHVlKX07CisgICAgfQorICAgIGNhc2UgWEZBX0F0dHJpYnV0ZVR5cGU6Ok1lYXN1cmU6IHsKKyAgICAgIE9wdGlvbmFsPENYRkFfTWVhc3VyZW1lbnQ+IHZhbHVlID0gVHJ5TWVhc3VyZShlQXR0ciwgYlVzZURlZmF1bHQpOworICAgICAgaWYgKCF2YWx1ZSkKKyAgICAgICAgcmV0dXJuIHt9OworCisgICAgICByZXR1cm4ge3ZhbHVlLT5Ub1N0cmluZygpfTsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiB7fTsKK30KKworT3B0aW9uYWw8V2lkZVN0cmluZz4gQ0pYX09iamVjdDo6VHJ5QXR0cmlidXRlKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c0F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVXNlRGVmYXVsdCkgeworICBYRkFfQXR0cmlidXRlIGF0dHIgPSBDWEZBX05vZGU6Ok5hbWVUb0F0dHJpYnV0ZSh3c0F0dHIpOworICBpZiAoYXR0ciAhPSBYRkFfQXR0cmlidXRlOjpVbmtub3duKQorICAgIHJldHVybiBUcnlBdHRyaWJ1dGUoYXR0ciwgYlVzZURlZmF1bHQpOworCisgIHZvaWQqIHBLZXkgPSBHZXRNYXBLZXlfQ3VzdG9tKHdzQXR0cik7CisgIFdpZGVTdHJpbmdWaWV3IHdzVmFsdWVDOworICBpZiAoIUdldE1hcE1vZHVsZVN0cmluZyhwS2V5LCB3c1ZhbHVlQykpCisgICAgcmV0dXJuIHt9OworCisgIHJldHVybiB7V2lkZVN0cmluZyh3c1ZhbHVlQyl9OworfQorCit2b2lkIENKWF9PYmplY3Q6OlJlbW92ZUF0dHJpYnV0ZShjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NBdHRyKSB7CisgIHZvaWQqIHBLZXkgPSBHZXRNYXBLZXlfQ3VzdG9tKHdzQXR0cik7CisgIGlmIChwS2V5KQorICAgIFJlbW92ZU1hcE1vZHVsZUtleShwS2V5KTsKK30KKworT3B0aW9uYWw8Ym9vbD4gQ0pYX09iamVjdDo6VHJ5Qm9vbGVhbihYRkFfQXR0cmlidXRlIGVBdHRyLCBib29sIGJVc2VEZWZhdWx0KSB7CisgIHZvaWQqIHBWYWx1ZSA9IG51bGxwdHI7CisgIHZvaWQqIHBLZXkgPSBHZXRNYXBLZXlfRWxlbWVudChHZXRYRkFPYmplY3QoKS0+R2V0RWxlbWVudFR5cGUoKSwgZUF0dHIpOworICBpZiAoR2V0TWFwTW9kdWxlVmFsdWUocEtleSwgcFZhbHVlKSkKKyAgICByZXR1cm4geyEhcFZhbHVlfTsKKyAgaWYgKCFiVXNlRGVmYXVsdCkKKyAgICByZXR1cm4ge307CisKKyAgcmV0dXJuIFRvTm9kZShHZXRYRkFPYmplY3QoKSktPkdldERlZmF1bHRCb29sZWFuKGVBdHRyKTsKK30KKworYm9vbCBDSlhfT2JqZWN0OjpTZXRCb29sZWFuKFhGQV9BdHRyaWJ1dGUgZUF0dHIsIGJvb2wgYlZhbHVlLCBib29sIGJOb3RpZnkpIHsKKyAgQ0ZYX1hNTEVsZW1lbnQqIGVsZW0gPSBTZXRWYWx1ZShlQXR0ciwgWEZBX0F0dHJpYnV0ZVR5cGU6OkJvb2xlYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSh1aW50cHRyX3QpYlZhbHVlLCBiTm90aWZ5KTsKKyAgaWYgKGVsZW0pCisgICAgZWxlbS0+U2V0U3RyaW5nKENYRkFfTm9kZTo6QXR0cmlidXRlVG9OYW1lKGVBdHRyKSwgYlZhbHVlID8gTCIxIiA6IEwiMCIpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDSlhfT2JqZWN0OjpHZXRCb29sZWFuKFhGQV9BdHRyaWJ1dGUgZUF0dHIpIHsKKyAgcmV0dXJuIFRyeUJvb2xlYW4oZUF0dHIsIHRydWUpLnZhbHVlX29yKGZhbHNlKTsKK30KKworYm9vbCBDSlhfT2JqZWN0OjpTZXRJbnRlZ2VyKFhGQV9BdHRyaWJ1dGUgZUF0dHIsIGludDMyX3QgaVZhbHVlLCBib29sIGJOb3RpZnkpIHsKKyAgQ0ZYX1hNTEVsZW1lbnQqIGVsZW0gPSBTZXRWYWx1ZShlQXR0ciwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSh1aW50cHRyX3QpaVZhbHVlLCBiTm90aWZ5KTsKKyAgaWYgKGVsZW0pIHsKKyAgICBlbGVtLT5TZXRTdHJpbmcoQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVUb05hbWUoZUF0dHIpLAorICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nOjpGb3JtYXQoTCIlZCIsIGlWYWx1ZSkpOworICB9CisgIHJldHVybiB0cnVlOworfQorCitpbnQzMl90IENKWF9PYmplY3Q6OkdldEludGVnZXIoWEZBX0F0dHJpYnV0ZSBlQXR0cikgeworICByZXR1cm4gVHJ5SW50ZWdlcihlQXR0ciwgdHJ1ZSkudmFsdWVfb3IoMCk7Cit9CisKK09wdGlvbmFsPGludDMyX3Q+IENKWF9PYmplY3Q6OlRyeUludGVnZXIoWEZBX0F0dHJpYnV0ZSBlQXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVXNlRGVmYXVsdCkgeworICB2b2lkKiBwS2V5ID0gR2V0TWFwS2V5X0VsZW1lbnQoR2V0WEZBT2JqZWN0KCktPkdldEVsZW1lbnRUeXBlKCksIGVBdHRyKTsKKyAgdm9pZCogcFZhbHVlID0gbnVsbHB0cjsKKyAgaWYgKEdldE1hcE1vZHVsZVZhbHVlKHBLZXksIHBWYWx1ZSkpCisgICAgcmV0dXJuIHtzdGF0aWNfY2FzdDxpbnQzMl90PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ocFZhbHVlKSl9OworICBpZiAoIWJVc2VEZWZhdWx0KQorICAgIHJldHVybiB7fTsKKworICByZXR1cm4gVG9Ob2RlKEdldFhGQU9iamVjdCgpKS0+R2V0RGVmYXVsdEludGVnZXIoZUF0dHIpOworfQorCitPcHRpb25hbDxYRkFfQXR0cmlidXRlRW51bT4gQ0pYX09iamVjdDo6VHJ5RW51bShYRkFfQXR0cmlidXRlIGVBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVXNlRGVmYXVsdCkgeworICB2b2lkKiBwS2V5ID0gR2V0TWFwS2V5X0VsZW1lbnQoR2V0WEZBT2JqZWN0KCktPkdldEVsZW1lbnRUeXBlKCksIGVBdHRyKTsKKyAgdm9pZCogcFZhbHVlID0gbnVsbHB0cjsKKyAgaWYgKEdldE1hcE1vZHVsZVZhbHVlKHBLZXksIHBWYWx1ZSkpIHsKKyAgICByZXR1cm4geworICAgICAgICBzdGF0aWNfY2FzdDxYRkFfQXR0cmlidXRlRW51bT4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHBWYWx1ZSkpfTsKKyAgfQorICBpZiAoIWJVc2VEZWZhdWx0KQorICAgIHJldHVybiB7fTsKKworICByZXR1cm4gVG9Ob2RlKEdldFhGQU9iamVjdCgpKS0+R2V0RGVmYXVsdEVudW0oZUF0dHIpOworfQorCitib29sIENKWF9PYmplY3Q6OlNldEVudW0oWEZBX0F0dHJpYnV0ZSBlQXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlRW51bSBlVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5KSB7CisgIENGWF9YTUxFbGVtZW50KiBlbGVtID0gU2V0VmFsdWUoZUF0dHIsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikodWludHB0cl90KWVWYWx1ZSwgYk5vdGlmeSk7CisgIGlmIChlbGVtKSB7CisgICAgZWxlbS0+U2V0U3RyaW5nKENYRkFfTm9kZTo6QXR0cmlidXRlVG9OYW1lKGVBdHRyKSwKKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVFbnVtVG9OYW1lKGVWYWx1ZSkpOworICB9CisgIHJldHVybiB0cnVlOworfQorCitYRkFfQXR0cmlidXRlRW51bSBDSlhfT2JqZWN0OjpHZXRFbnVtKFhGQV9BdHRyaWJ1dGUgZUF0dHIpIHsKKyAgcmV0dXJuIFRyeUVudW0oZUF0dHIsIHRydWUpLnZhbHVlX29yKFhGQV9BdHRyaWJ1dGVFbnVtOjpVbmtub3duKTsKK30KKworYm9vbCBDSlhfT2JqZWN0OjpTZXRNZWFzdXJlKFhGQV9BdHRyaWJ1dGUgZUF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9NZWFzdXJlbWVudCBtVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5KSB7CisgIHZvaWQqIHBLZXkgPSBHZXRNYXBLZXlfRWxlbWVudChHZXRYRkFPYmplY3QoKS0+R2V0RWxlbWVudFR5cGUoKSwgZUF0dHIpOworICBPbkNoYW5naW5nKGVBdHRyLCBiTm90aWZ5KTsKKyAgU2V0TWFwTW9kdWxlQnVmZmVyKHBLZXksICZtVmFsdWUsIHNpemVvZihDWEZBX01lYXN1cmVtZW50KSwgbnVsbHB0cik7CisgIE9uQ2hhbmdlZChlQXR0ciwgYk5vdGlmeSwgZmFsc2UpOworICByZXR1cm4gdHJ1ZTsKK30KKworT3B0aW9uYWw8Q1hGQV9NZWFzdXJlbWVudD4gQ0pYX09iamVjdDo6VHJ5TWVhc3VyZShYRkFfQXR0cmlidXRlIGVBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJVc2VEZWZhdWx0KSBjb25zdCB7CisgIHZvaWQqIHBLZXkgPSBHZXRNYXBLZXlfRWxlbWVudChHZXRYRkFPYmplY3QoKS0+R2V0RWxlbWVudFR5cGUoKSwgZUF0dHIpOworICB2b2lkKiBwVmFsdWU7CisgIGludDMyX3QgaUJ5dGVzOworICBpZiAoR2V0TWFwTW9kdWxlQnVmZmVyKHBLZXksIHBWYWx1ZSwgaUJ5dGVzLCB0cnVlKSAmJgorICAgICAgaUJ5dGVzID09IHNpemVvZihDWEZBX01lYXN1cmVtZW50KSkgeworICAgIHJldHVybiB7KnJlaW50ZXJwcmV0X2Nhc3Q8Q1hGQV9NZWFzdXJlbWVudCo+KHBWYWx1ZSl9OworICB9CisgIGlmICghYlVzZURlZmF1bHQpCisgICAgcmV0dXJuIHt9OworCisgIHJldHVybiBUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5HZXREZWZhdWx0TWVhc3VyZW1lbnQoZUF0dHIpOworfQorCitPcHRpb25hbDxmbG9hdD4gQ0pYX09iamVjdDo6VHJ5TWVhc3VyZUFzRmxvYXQoWEZBX0F0dHJpYnV0ZSBhdHRyKSBjb25zdCB7CisgIE9wdGlvbmFsPENYRkFfTWVhc3VyZW1lbnQ+IG1lYXN1cmUgPSBUcnlNZWFzdXJlKGF0dHIsIGZhbHNlKTsKKyAgaWYgKG1lYXN1cmUpCisgICAgcmV0dXJuIHttZWFzdXJlLT5Ub1VuaXQoWEZBX1VuaXQ6OlB0KX07CisgIHJldHVybiB7fTsKK30KKworQ1hGQV9NZWFzdXJlbWVudCBDSlhfT2JqZWN0OjpHZXRNZWFzdXJlKFhGQV9BdHRyaWJ1dGUgZUF0dHIpIGNvbnN0IHsKKyAgcmV0dXJuIFRyeU1lYXN1cmUoZUF0dHIsIHRydWUpLnZhbHVlX29yKENYRkFfTWVhc3VyZW1lbnQoKSk7Cit9CisKK1dpZGVTdHJpbmcgQ0pYX09iamVjdDo6R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZSBlQXR0cikgeworICByZXR1cm4gVHJ5Q0RhdGEoZUF0dHIsIHRydWUpLnZhbHVlX29yKFdpZGVTdHJpbmcoKSk7Cit9CisKK2Jvb2wgQ0pYX09iamVjdDo6U2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZSBlQXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTY3JpcHRNb2RpZnkpIHsKKyAgQ1hGQV9Ob2RlKiB4ZmFPYmogPSBUb05vZGUoR2V0WEZBT2JqZWN0KCkpOworICB2b2lkKiBwS2V5ID0gR2V0TWFwS2V5X0VsZW1lbnQoeGZhT2JqLT5HZXRFbGVtZW50VHlwZSgpLCBlQXR0cik7CisgIE9uQ2hhbmdpbmcoZUF0dHIsIGJOb3RpZnkpOworICBpZiAoZUF0dHIgPT0gWEZBX0F0dHJpYnV0ZTo6VmFsdWUpIHsKKyAgICBXaWRlU3RyaW5nKiBwQ2xvbmUgPSBuZXcgV2lkZVN0cmluZyh3c1ZhbHVlKTsKKyAgICBTZXRVc2VyRGF0YShwS2V5LCBwQ2xvbmUsICZkZWxldGVXaWRlU3RyaW5nQ2FsbEJhY2spOworICB9IGVsc2UgeworICAgIFNldE1hcE1vZHVsZVN0cmluZyhwS2V5LCB3c1ZhbHVlLkFzU3RyaW5nVmlldygpKTsKKyAgICBpZiAoZUF0dHIgPT0gWEZBX0F0dHJpYnV0ZTo6TmFtZSkKKyAgICAgIHhmYU9iai0+VXBkYXRlTmFtZUhhc2goKTsKKyAgfQorICBPbkNoYW5nZWQoZUF0dHIsIGJOb3RpZnksIGJTY3JpcHRNb2RpZnkpOworCisgIGlmICgheGZhT2JqLT5Jc05lZWRTYXZpbmdYTUxOb2RlKCkgfHwgZUF0dHIgPT0gWEZBX0F0dHJpYnV0ZTo6UXVhbGlmaWVkTmFtZSB8fAorICAgICAgZUF0dHIgPT0gWEZBX0F0dHJpYnV0ZTo6QmluZGluZ05vZGUpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGlmIChlQXR0ciA9PSBYRkFfQXR0cmlidXRlOjpOYW1lICYmCisgICAgICAoeGZhT2JqLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpEYXRhVmFsdWUgfHwKKyAgICAgICB4ZmFPYmotPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkRhdGFHcm91cCkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGF1dG8qIGVsZW0gPSBzdGF0aWNfY2FzdDxDRlhfWE1MRWxlbWVudCo+KHhmYU9iai0+R2V0WE1MTWFwcGluZ05vZGUoKSk7CisgIGlmIChlQXR0ciA9PSBYRkFfQXR0cmlidXRlOjpWYWx1ZSkgeworICAgIEZYX1hNTE5PREVUWVBFIGVYTUxUeXBlID0gZWxlbS0+R2V0VHlwZSgpOworICAgIHN3aXRjaCAoZVhNTFR5cGUpIHsKKyAgICAgIGNhc2UgRlhfWE1MTk9ERV9FbGVtZW50OgorICAgICAgICBpZiAoeGZhT2JqLT5Jc0F0dHJpYnV0ZUluWE1MKCkpIHsKKyAgICAgICAgICBlbGVtLT5TZXRTdHJpbmcoV2lkZVN0cmluZyhHZXRDRGF0YShYRkFfQXR0cmlidXRlOjpRdWFsaWZpZWROYW1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJvb2wgYkRlbGV0ZUNoaWxkcmVuID0gdHJ1ZTsKKyAgICAgICAgICBpZiAoeGZhT2JqLT5HZXRQYWNrZXRUeXBlKCkgPT0gWEZBX1BhY2tldFR5cGU6OkRhdGFzZXRzKSB7CisgICAgICAgICAgICBmb3IgKENYRkFfTm9kZSogcENoaWxkRGF0YU5vZGUgPSB4ZmFPYmotPkdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgICAgICAgICAgcENoaWxkRGF0YU5vZGU7CisgICAgICAgICAgICAgICAgIHBDaGlsZERhdGFOb2RlID0gcENoaWxkRGF0YU5vZGUtPkdldE5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgICAgICAgaWYgKCFwQ2hpbGREYXRhTm9kZS0+R2V0QmluZEl0ZW1zKCktPmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBiRGVsZXRlQ2hpbGRyZW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoYkRlbGV0ZUNoaWxkcmVuKQorICAgICAgICAgICAgZWxlbS0+RGVsZXRlQ2hpbGRyZW4oKTsKKworICAgICAgICAgIGVsZW0tPlNldFRleHREYXRhKHdzVmFsdWUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWF9YTUxOT0RFX1RleHQ6CisgICAgICAgIHN0YXRpY19jYXN0PENGWF9YTUxUZXh0Kj4oeGZhT2JqLT5HZXRYTUxNYXBwaW5nTm9kZSgpKQorICAgICAgICAgICAgLT5TZXRUZXh0KHdzVmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgQVNTRVJUKGVsZW0tPkdldFR5cGUoKSA9PSBGWF9YTUxOT0RFX0VsZW1lbnQpOworCisgIFdpZGVTdHJpbmcgd3NBdHRyTmFtZSA9IENYRkFfTm9kZTo6QXR0cmlidXRlVG9OYW1lKGVBdHRyKTsKKyAgaWYgKGVBdHRyID09IFhGQV9BdHRyaWJ1dGU6OkNvbnRlbnRUeXBlKQorICAgIHdzQXR0ck5hbWUgPSBMInhmYToiICsgd3NBdHRyTmFtZTsKKworICBlbGVtLT5TZXRTdHJpbmcod3NBdHRyTmFtZSwgd3NWYWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENKWF9PYmplY3Q6OlNldEF0dHJpYnV0ZVZhbHVlKGNvbnN0IFdpZGVTdHJpbmcmIHdzVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzWE1MVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk5vdGlmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2NyaXB0TW9kaWZ5KSB7CisgIGF1dG8qIHhmYU9iaiA9IFRvTm9kZShHZXRYRkFPYmplY3QoKSk7CisKKyAgdm9pZCogcEtleSA9CisgICAgICBHZXRNYXBLZXlfRWxlbWVudCh4ZmFPYmotPkdldEVsZW1lbnRUeXBlKCksIFhGQV9BdHRyaWJ1dGU6OlZhbHVlKTsKKyAgT25DaGFuZ2luZyhYRkFfQXR0cmlidXRlOjpWYWx1ZSwgYk5vdGlmeSk7CisgIFdpZGVTdHJpbmcqIHBDbG9uZSA9IG5ldyBXaWRlU3RyaW5nKHdzVmFsdWUpOworICBTZXRVc2VyRGF0YShwS2V5LCBwQ2xvbmUsICZkZWxldGVXaWRlU3RyaW5nQ2FsbEJhY2spOworICBPbkNoYW5nZWQoWEZBX0F0dHJpYnV0ZTo6VmFsdWUsIGJOb3RpZnksIGJTY3JpcHRNb2RpZnkpOworICBpZiAoIXhmYU9iai0+SXNOZWVkU2F2aW5nWE1MTm9kZSgpKQorICAgIHJldHVybjsKKworICBhdXRvKiBlbGVtID0gc3RhdGljX2Nhc3Q8Q0ZYX1hNTEVsZW1lbnQqPih4ZmFPYmotPkdldFhNTE1hcHBpbmdOb2RlKCkpOworICBGWF9YTUxOT0RFVFlQRSBlWE1MVHlwZSA9IGVsZW0tPkdldFR5cGUoKTsKKyAgc3dpdGNoIChlWE1MVHlwZSkgeworICAgIGNhc2UgRlhfWE1MTk9ERV9FbGVtZW50OgorICAgICAgaWYgKHhmYU9iai0+SXNBdHRyaWJ1dGVJblhNTCgpKSB7CisgICAgICAgIGVsZW0tPlNldFN0cmluZyhXaWRlU3RyaW5nKEdldENEYXRhKFhGQV9BdHRyaWJ1dGU6OlF1YWxpZmllZE5hbWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdzWE1MVmFsdWUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYm9vbCBiRGVsZXRlQ2hpbGRyZW4gPSB0cnVlOworICAgICAgICBpZiAoeGZhT2JqLT5HZXRQYWNrZXRUeXBlKCkgPT0gWEZBX1BhY2tldFR5cGU6OkRhdGFzZXRzKSB7CisgICAgICAgICAgZm9yIChDWEZBX05vZGUqIHBDaGlsZERhdGFOb2RlID0geGZhT2JqLT5HZXRGaXJzdENoaWxkKCk7CisgICAgICAgICAgICAgICBwQ2hpbGREYXRhTm9kZTsKKyAgICAgICAgICAgICAgIHBDaGlsZERhdGFOb2RlID0gcENoaWxkRGF0YU5vZGUtPkdldE5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgICAgIGlmICghcENoaWxkRGF0YU5vZGUtPkdldEJpbmRJdGVtcygpLT5lbXB0eSgpKSB7CisgICAgICAgICAgICAgIGJEZWxldGVDaGlsZHJlbiA9IGZhbHNlOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJEZWxldGVDaGlsZHJlbikKKyAgICAgICAgICBlbGVtLT5EZWxldGVDaGlsZHJlbigpOworCisgICAgICAgIGVsZW0tPlNldFRleHREYXRhKHdzWE1MVmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBGWF9YTUxOT0RFX1RleHQ6CisgICAgICBzdGF0aWNfY2FzdDxDRlhfWE1MVGV4dCo+KHhmYU9iai0+R2V0WE1MTWFwcGluZ05vZGUoKSkKKyAgICAgICAgICAtPlNldFRleHQod3NYTUxWYWx1ZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgQVNTRVJUKDApOworICB9Cit9CisKK09wdGlvbmFsPFdpZGVTdHJpbmc+IENKWF9PYmplY3Q6OlRyeUNEYXRhKFhGQV9BdHRyaWJ1dGUgZUF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJVc2VEZWZhdWx0KSB7CisgIHZvaWQqIHBLZXkgPSBHZXRNYXBLZXlfRWxlbWVudChHZXRYRkFPYmplY3QoKS0+R2V0RWxlbWVudFR5cGUoKSwgZUF0dHIpOworICBpZiAoZUF0dHIgPT0gWEZBX0F0dHJpYnV0ZTo6VmFsdWUpIHsKKyAgICB2b2lkKiBwRGF0YTsKKyAgICBpbnQzMl90IGlCeXRlcyA9IDA7CisgICAgV2lkZVN0cmluZyogcFN0ciA9IG51bGxwdHI7CisgICAgaWYgKEdldE1hcE1vZHVsZUJ1ZmZlcihwS2V5LCBwRGF0YSwgaUJ5dGVzLCB0cnVlKSAmJgorICAgICAgICBpQnl0ZXMgPT0gc2l6ZW9mKHZvaWQqKSkgeworICAgICAgbWVtY3B5KCZwRGF0YSwgcERhdGEsIGlCeXRlcyk7CisgICAgICBwU3RyID0gcmVpbnRlcnByZXRfY2FzdDxXaWRlU3RyaW5nKj4ocERhdGEpOworICAgIH0KKyAgICBpZiAocFN0cikKKyAgICAgIHJldHVybiB7KnBTdHJ9OworICB9IGVsc2UgeworICAgIFdpZGVTdHJpbmdWaWV3IHdzVmFsdWVDOworICAgIGlmIChHZXRNYXBNb2R1bGVTdHJpbmcocEtleSwgd3NWYWx1ZUMpKQorICAgICAgcmV0dXJuIHtXaWRlU3RyaW5nKHdzVmFsdWVDKX07CisgIH0KKyAgaWYgKCFiVXNlRGVmYXVsdCkKKyAgICByZXR1cm4ge307CisKKyAgcmV0dXJuIFRvTm9kZShHZXRYRkFPYmplY3QoKSktPkdldERlZmF1bHRDRGF0YShlQXR0cik7Cit9CisKK0NGWF9YTUxFbGVtZW50KiBDSlhfT2JqZWN0OjpTZXRWYWx1ZShYRkFfQXR0cmlidXRlIGVBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGVUeXBlIGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJOb3RpZnkpIHsKKyAgdm9pZCogcEtleSA9IEdldE1hcEtleV9FbGVtZW50KEdldFhGQU9iamVjdCgpLT5HZXRFbGVtZW50VHlwZSgpLCBlQXR0cik7CisgIE9uQ2hhbmdpbmcoZUF0dHIsIGJOb3RpZnkpOworICBTZXRNYXBNb2R1bGVWYWx1ZShwS2V5LCBwVmFsdWUpOworICBPbkNoYW5nZWQoZUF0dHIsIGJOb3RpZnksIGZhbHNlKTsKKyAgaWYgKCFUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5Jc05lZWRTYXZpbmdYTUxOb2RlKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgYXV0byogZWxlbSA9CisgICAgICBzdGF0aWNfY2FzdDxDRlhfWE1MRWxlbWVudCo+KFRvTm9kZShHZXRYRkFPYmplY3QoKSktPkdldFhNTE1hcHBpbmdOb2RlKCkpOworICBBU1NFUlQoZWxlbS0+R2V0VHlwZSgpID09IEZYX1hNTE5PREVfRWxlbWVudCk7CisKKyAgcmV0dXJuIGVsZW07Cit9CisKK2Jvb2wgQ0pYX09iamVjdDo6U2V0Q29udGVudChjb25zdCBXaWRlU3RyaW5nJiB3c0NvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NYTUxWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJOb3RpZnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2NyaXB0TW9kaWZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN5bmNEYXRhKSB7CisgIENYRkFfTm9kZSogcE5vZGUgPSBudWxscHRyOworICBDWEZBX05vZGUqIHBCaW5kTm9kZSA9IG51bGxwdHI7CisgIHN3aXRjaCAoVG9Ob2RlKEdldFhGQU9iamVjdCgpKS0+R2V0T2JqZWN0VHlwZSgpKSB7CisgICAgY2FzZSBYRkFfT2JqZWN0VHlwZTo6Q29udGFpbmVyTm9kZTogeworICAgICAgaWYgKFhGQV9GaWVsZElzTXVsdGlMaXN0Qm94KFRvTm9kZShHZXRYRkFPYmplY3QoKSkpKSB7CisgICAgICAgIENYRkFfVmFsdWUqIHBWYWx1ZSA9CisgICAgICAgICAgICBHZXRPckNyZWF0ZVByb3BlcnR5PENYRkFfVmFsdWU+KDAsIFhGQV9FbGVtZW50OjpWYWx1ZSk7CisgICAgICAgIGlmICghcFZhbHVlKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIENYRkFfTm9kZSogcENoaWxkVmFsdWUgPSBwVmFsdWUtPkdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgQVNTRVJUKHBDaGlsZFZhbHVlKTsKKyAgICAgICAgcENoaWxkVmFsdWUtPkpTT2JqZWN0KCktPlNldENEYXRhKFhGQV9BdHRyaWJ1dGU6OkNvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJ0ZXh0L3htbCIsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHBDaGlsZFZhbHVlLT5KU09iamVjdCgpLT5TZXRDb250ZW50KHdzQ29udGVudCwgd3NDb250ZW50LCBiTm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2NyaXB0TW9kaWZ5LCBmYWxzZSk7CisgICAgICAgIENYRkFfTm9kZSogcEJpbmQgPSBUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5HZXRCaW5kRGF0YSgpOworICAgICAgICBpZiAoYlN5bmNEYXRhICYmIHBCaW5kKSB7CisgICAgICAgICAgc3RkOjp2ZWN0b3I8V2lkZVN0cmluZz4gd3NTYXZlVGV4dEFycmF5OworICAgICAgICAgIHNpemVfdCBpU2l6ZSA9IDA7CisgICAgICAgICAgaWYgKCF3c0NvbnRlbnQuSXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzaXplX3QgaVN0YXJ0ID0gMDsKKyAgICAgICAgICAgIHNpemVfdCBpTGVuZ3RoID0gd3NDb250ZW50LkdldExlbmd0aCgpOworICAgICAgICAgICAgYXV0byBpRW5kID0gd3NDb250ZW50LkZpbmQoTCdcbicsIGlTdGFydCk7CisgICAgICAgICAgICBpRW5kID0gIWlFbmQuaGFzX3ZhbHVlKCkgPyBpTGVuZ3RoIDogaUVuZDsKKyAgICAgICAgICAgIHdoaWxlIChpRW5kLnZhbHVlKCkgPj0gaVN0YXJ0KSB7CisgICAgICAgICAgICAgIHdzU2F2ZVRleHRBcnJheS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICB3c0NvbnRlbnQuTWlkKGlTdGFydCwgaUVuZC52YWx1ZSgpIC0gaVN0YXJ0KSk7CisgICAgICAgICAgICAgIGlTdGFydCA9IGlFbmQudmFsdWUoKSArIDE7CisgICAgICAgICAgICAgIGlmIChpU3RhcnQgPj0gaUxlbmd0aCkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICBpRW5kID0gd3NDb250ZW50LkZpbmQoTCdcbicsIGlTdGFydCk7CisgICAgICAgICAgICAgIGlmICghaUVuZC5oYXNfdmFsdWUoKSkgeworICAgICAgICAgICAgICAgIHdzU2F2ZVRleHRBcnJheS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIHdzQ29udGVudC5NaWQoaVN0YXJ0LCBpTGVuZ3RoIC0gaVN0YXJ0KSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlTaXplID0gd3NTYXZlVGV4dEFycmF5LnNpemUoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKGlTaXplID09IDApIHsKKyAgICAgICAgICAgIHdoaWxlIChDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwQmluZC0+R2V0Rmlyc3RDaGlsZCgpKSB7CisgICAgICAgICAgICAgIHBCaW5kLT5SZW1vdmVDaGlsZChwQ2hpbGROb2RlLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q1hGQV9Ob2RlKj4gdmFsdWVOb2RlcyA9IHBCaW5kLT5HZXROb2RlTGlzdCgKKyAgICAgICAgICAgICAgICBYRkFfTk9ERUZJTFRFUl9DaGlsZHJlbiwgWEZBX0VsZW1lbnQ6OkRhdGFWYWx1ZSk7CisgICAgICAgICAgICBzaXplX3QgaURhdGFzID0gdmFsdWVOb2Rlcy5zaXplKCk7CisgICAgICAgICAgICBpZiAoaURhdGFzIDwgaVNpemUpIHsKKyAgICAgICAgICAgICAgc2l6ZV90IGlBZGROb2RlcyA9IGlTaXplIC0gaURhdGFzOworICAgICAgICAgICAgICBDWEZBX05vZGUqIHBWYWx1ZU5vZGVzID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgd2hpbGUgKGlBZGROb2Rlcy0tID4gMCkgeworICAgICAgICAgICAgICAgIHBWYWx1ZU5vZGVzID0KKyAgICAgICAgICAgICAgICAgICAgcEJpbmQtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FbGVtZW50OjpEYXRhVmFsdWUpOworICAgICAgICAgICAgICAgIHBWYWx1ZU5vZGVzLT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpOYW1lLCBMInZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBwVmFsdWVOb2Rlcy0+Q3JlYXRlWE1MTWFwcGluZ05vZGUoKTsKKyAgICAgICAgICAgICAgICBwQmluZC0+SW5zZXJ0Q2hpbGQocFZhbHVlTm9kZXMsIG51bGxwdHIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHBWYWx1ZU5vZGVzID0gbnVsbHB0cjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaURhdGFzID4gaVNpemUpIHsKKyAgICAgICAgICAgICAgc2l6ZV90IGlEZWxOb2RlcyA9IGlEYXRhcyAtIGlTaXplOworICAgICAgICAgICAgICB3aGlsZSAoaURlbE5vZGVzLS0gPiAwKSB7CisgICAgICAgICAgICAgICAgcEJpbmQtPlJlbW92ZUNoaWxkKHBCaW5kLT5HZXRGaXJzdENoaWxkKCksIHRydWUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IGkgPSAwOworICAgICAgICAgICAgZm9yIChDWEZBX05vZGUqIHBWYWx1ZU5vZGUgPSBwQmluZC0+R2V0Rmlyc3RDaGlsZCgpOyBwVmFsdWVOb2RlOworICAgICAgICAgICAgICAgICBwVmFsdWVOb2RlID0gcFZhbHVlTm9kZS0+R2V0TmV4dFNpYmxpbmcoKSkgeworICAgICAgICAgICAgICBwVmFsdWVOb2RlLT5KU09iamVjdCgpLT5TZXRBdHRyaWJ1dGVWYWx1ZSgKKyAgICAgICAgICAgICAgICAgIHdzU2F2ZVRleHRBcnJheVtpXSwgd3NTYXZlVGV4dEFycmF5W2ldLCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcEFycmF5Tm9kZSA6ICoocEJpbmQtPkdldEJpbmRJdGVtcygpKSkgeworICAgICAgICAgICAgaWYgKHBBcnJheU5vZGUuR2V0KCkgIT0gVG9Ob2RlKEdldFhGQU9iamVjdCgpKSkgeworICAgICAgICAgICAgICBwQXJyYXlOb2RlLT5KU09iamVjdCgpLT5TZXRDb250ZW50KHdzQ29udGVudCwgd3NDb250ZW50LCBiTm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTY3JpcHRNb2RpZnksIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoVG9Ob2RlKEdldFhGQU9iamVjdCgpKS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6RXhjbEdyb3VwKSB7CisgICAgICAgIHBOb2RlID0gVG9Ob2RlKEdldFhGQU9iamVjdCgpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENYRkFfVmFsdWUqIHBWYWx1ZSA9CisgICAgICAgICAgICBHZXRPckNyZWF0ZVByb3BlcnR5PENYRkFfVmFsdWU+KDAsIFhGQV9FbGVtZW50OjpWYWx1ZSk7CisgICAgICAgIGlmICghcFZhbHVlKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIENYRkFfTm9kZSogcENoaWxkVmFsdWUgPSBwVmFsdWUtPkdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgQVNTRVJUKHBDaGlsZFZhbHVlKTsKKyAgICAgICAgcENoaWxkVmFsdWUtPkpTT2JqZWN0KCktPlNldENvbnRlbnQod3NDb250ZW50LCB3c0NvbnRlbnQsIGJOb3RpZnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTY3JpcHRNb2RpZnksIGZhbHNlKTsKKyAgICAgIH0KKyAgICAgIHBCaW5kTm9kZSA9IFRvTm9kZShHZXRYRkFPYmplY3QoKSktPkdldEJpbmREYXRhKCk7CisgICAgICBpZiAocEJpbmROb2RlICYmIGJTeW5jRGF0YSkgeworICAgICAgICBwQmluZE5vZGUtPkpTT2JqZWN0KCktPlNldENvbnRlbnQod3NDb250ZW50LCB3c1hNTFZhbHVlLCBiTm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNjcmlwdE1vZGlmeSwgZmFsc2UpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBBcnJheU5vZGUgOiAqKHBCaW5kTm9kZS0+R2V0QmluZEl0ZW1zKCkpKSB7CisgICAgICAgICAgaWYgKHBBcnJheU5vZGUuR2V0KCkgIT0gVG9Ob2RlKEdldFhGQU9iamVjdCgpKSkgeworICAgICAgICAgICAgcEFycmF5Tm9kZS0+SlNPYmplY3QoKS0+U2V0Q29udGVudCh3c0NvbnRlbnQsIHdzQ29udGVudCwgYk5vdGlmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgZmFsc2UpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgcEJpbmROb2RlID0gbnVsbHB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZTogeworICAgICAgV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOworICAgICAgaWYgKFRvTm9kZShHZXRYRkFPYmplY3QoKSktPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkV4RGF0YSkgeworICAgICAgICBPcHRpb25hbDxXaWRlU3RyaW5nPiByZXQgPQorICAgICAgICAgICAgVHJ5QXR0cmlidXRlKFhGQV9BdHRyaWJ1dGU6OkNvbnRlbnRUeXBlLCBmYWxzZSk7CisgICAgICAgIGlmIChyZXQpCisgICAgICAgICAgd3NDb250ZW50VHlwZSA9ICpyZXQ7CisgICAgICAgIGlmICh3c0NvbnRlbnRUeXBlID09IEwidGV4dC9odG1sIikgeworICAgICAgICAgIHdzQ29udGVudFR5cGUgPSBMIiI7CisgICAgICAgICAgU2V0QXR0cmlidXRlKFhGQV9BdHRyaWJ1dGU6OkNvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlLkFzU3RyaW5nVmlldygpLAorICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgQ1hGQV9Ob2RlKiBwQ29udGVudFJhd0RhdGFOb2RlID0gVG9Ob2RlKEdldFhGQU9iamVjdCgpKS0+R2V0Rmlyc3RDaGlsZCgpOworICAgICAgaWYgKCFwQ29udGVudFJhd0RhdGFOb2RlKSB7CisgICAgICAgIHBDb250ZW50UmF3RGF0YU5vZGUgPQorICAgICAgICAgICAgVG9Ob2RlKEdldFhGQU9iamVjdCgpKQorICAgICAgICAgICAgICAgIC0+Q3JlYXRlU2FtZVBhY2tldE5vZGUoKHdzQ29udGVudFR5cGUgPT0gTCJ0ZXh0L3htbCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBYRkFfRWxlbWVudDo6U2hhcnB4bWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFhGQV9FbGVtZW50OjpTaGFycHRleHQpOworICAgICAgICBUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5JbnNlcnRDaGlsZChwQ29udGVudFJhd0RhdGFOb2RlLCBudWxscHRyKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBwQ29udGVudFJhd0RhdGFOb2RlLT5KU09iamVjdCgpLT5TZXRDb250ZW50KAorICAgICAgICAgIHdzQ29udGVudCwgd3NYTUxWYWx1ZSwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSwgYlN5bmNEYXRhKTsKKyAgICB9CisgICAgY2FzZSBYRkFfT2JqZWN0VHlwZTo6Tm9kZUM6CisgICAgY2FzZSBYRkFfT2JqZWN0VHlwZTo6VGV4dE5vZGU6CisgICAgICBwTm9kZSA9IFRvTm9kZShHZXRYRkFPYmplY3QoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9PYmplY3RUeXBlOjpOb2RlVjoKKyAgICAgIHBOb2RlID0gVG9Ob2RlKEdldFhGQU9iamVjdCgpKTsKKyAgICAgIGlmIChiU3luY0RhdGEgJiYKKyAgICAgICAgICBUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5HZXRQYWNrZXRUeXBlKCkgPT0gWEZBX1BhY2tldFR5cGU6OkZvcm0pIHsKKyAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50ID0gVG9Ob2RlKEdldFhGQU9iamVjdCgpKS0+R2V0UGFyZW50KCk7CisgICAgICAgIGlmIChwUGFyZW50KSB7CisgICAgICAgICAgcFBhcmVudCA9IHBQYXJlbnQtPkdldFBhcmVudCgpOworICAgICAgICB9CisgICAgICAgIGlmIChwUGFyZW50ICYmIHBQYXJlbnQtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlZhbHVlKSB7CisgICAgICAgICAgcFBhcmVudCA9IHBQYXJlbnQtPkdldFBhcmVudCgpOworICAgICAgICAgIGlmIChwUGFyZW50ICYmIHBQYXJlbnQtPklzQ29udGFpbmVyTm9kZSgpKSB7CisgICAgICAgICAgICBwQmluZE5vZGUgPSBwUGFyZW50LT5HZXRCaW5kRGF0YSgpOworICAgICAgICAgICAgaWYgKHBCaW5kTm9kZSkgeworICAgICAgICAgICAgICBwQmluZE5vZGUtPkpTT2JqZWN0KCktPlNldENvbnRlbnQod3NDb250ZW50LCB3c1hNTFZhbHVlLCBiTm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNjcmlwdE1vZGlmeSwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpEYXRhVmFsdWUpIHsKKyAgICAgICAgcE5vZGUgPSBUb05vZGUoR2V0WEZBT2JqZWN0KCkpOworICAgICAgICBwQmluZE5vZGUgPSBUb05vZGUoR2V0WEZBT2JqZWN0KCkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKCFwTm9kZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgU2V0QXR0cmlidXRlVmFsdWUod3NDb250ZW50LCB3c1hNTFZhbHVlLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5KTsKKyAgaWYgKHBCaW5kTm9kZSAmJiBiU3luY0RhdGEpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHBBcnJheU5vZGUgOiAqKHBCaW5kTm9kZS0+R2V0QmluZEl0ZW1zKCkpKSB7CisgICAgICBwQXJyYXlOb2RlLT5KU09iamVjdCgpLT5TZXRDb250ZW50KHdzQ29udGVudCwgd3NDb250ZW50LCBiTm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2NyaXB0TW9kaWZ5LCBmYWxzZSk7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitXaWRlU3RyaW5nIENKWF9PYmplY3Q6OkdldENvbnRlbnQoYm9vbCBiU2NyaXB0TW9kaWZ5KSB7CisgIHJldHVybiBUcnlDb250ZW50KGJTY3JpcHRNb2RpZnksIHRydWUpLnZhbHVlX29yKFdpZGVTdHJpbmcoKSk7Cit9CisKK09wdGlvbmFsPFdpZGVTdHJpbmc+IENKWF9PYmplY3Q6OlRyeUNvbnRlbnQoYm9vbCBiU2NyaXB0TW9kaWZ5LCBib29sIGJQcm90bykgeworICBDWEZBX05vZGUqIHBOb2RlID0gbnVsbHB0cjsKKyAgc3dpdGNoIChUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5HZXRPYmplY3RUeXBlKCkpIHsKKyAgICBjYXNlIFhGQV9PYmplY3RUeXBlOjpDb250YWluZXJOb2RlOgorICAgICAgaWYgKFRvTm9kZShHZXRYRkFPYmplY3QoKSktPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkV4Y2xHcm91cCkgeworICAgICAgICBwTm9kZSA9IFRvTm9kZShHZXRYRkFPYmplY3QoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBDWEZBX1ZhbHVlKiBwVmFsdWUgPQorICAgICAgICAgICAgVG9Ob2RlKEdldFhGQU9iamVjdCgpKQorICAgICAgICAgICAgICAgIC0+R2V0Q2hpbGQ8Q1hGQV9WYWx1ZT4oMCwgWEZBX0VsZW1lbnQ6OlZhbHVlLCBmYWxzZSk7CisgICAgICAgIGlmICghcFZhbHVlKQorICAgICAgICAgIHJldHVybiB7fTsKKworICAgICAgICBDWEZBX05vZGUqIHBDaGlsZFZhbHVlID0gcFZhbHVlLT5HZXRGaXJzdENoaWxkKCk7CisgICAgICAgIGlmIChwQ2hpbGRWYWx1ZSAmJiBYRkFfRmllbGRJc011bHRpTGlzdEJveChUb05vZGUoR2V0WEZBT2JqZWN0KCkpKSkgeworICAgICAgICAgIHBDaGlsZFZhbHVlLT5KU09iamVjdCgpLT5TZXRBdHRyaWJ1dGUoWEZBX0F0dHJpYnV0ZTo6Q29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMInRleHQveG1sIiwgZmFsc2UpOworICAgICAgICB9CisgICAgICAgIGlmIChwQ2hpbGRWYWx1ZSkKKyAgICAgICAgICByZXR1cm4gcENoaWxkVmFsdWUtPkpTT2JqZWN0KCktPlRyeUNvbnRlbnQoYlNjcmlwdE1vZGlmeSwgYlByb3RvKTsKKyAgICAgICAgcmV0dXJuIHt9OworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGU6IHsKKyAgICAgIENYRkFfTm9kZSogcENvbnRlbnRSYXdEYXRhTm9kZSA9IFRvTm9kZShHZXRYRkFPYmplY3QoKSktPkdldEZpcnN0Q2hpbGQoKTsKKyAgICAgIGlmICghcENvbnRlbnRSYXdEYXRhTm9kZSkgeworICAgICAgICBYRkFfRWxlbWVudCBlbGVtZW50ID0gWEZBX0VsZW1lbnQ6OlNoYXJwdGV4dDsKKyAgICAgICAgaWYgKFRvTm9kZShHZXRYRkFPYmplY3QoKSktPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkV4RGF0YSkgeworICAgICAgICAgIE9wdGlvbmFsPFdpZGVTdHJpbmc+IGNvbnRlbnRUeXBlID0KKyAgICAgICAgICAgICAgVHJ5QXR0cmlidXRlKFhGQV9BdHRyaWJ1dGU6OkNvbnRlbnRUeXBlLCBmYWxzZSk7CisgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlKSB7CisgICAgICAgICAgICBpZiAoKmNvbnRlbnRUeXBlID09IEwidGV4dC9odG1sIikKKyAgICAgICAgICAgICAgZWxlbWVudCA9IFhGQV9FbGVtZW50OjpTaGFycHhIVE1MOworICAgICAgICAgICAgZWxzZSBpZiAoKmNvbnRlbnRUeXBlID09IEwidGV4dC94bWwiKQorICAgICAgICAgICAgICBlbGVtZW50ID0gWEZBX0VsZW1lbnQ6OlNoYXJweG1sOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwQ29udGVudFJhd0RhdGFOb2RlID0KKyAgICAgICAgICAgIFRvTm9kZShHZXRYRkFPYmplY3QoKSktPkNyZWF0ZVNhbWVQYWNrZXROb2RlKGVsZW1lbnQpOworICAgICAgICBUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5JbnNlcnRDaGlsZChwQ29udGVudFJhd0RhdGFOb2RlLCBudWxscHRyKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBwQ29udGVudFJhd0RhdGFOb2RlLT5KU09iamVjdCgpLT5UcnlDb250ZW50KGJTY3JpcHRNb2RpZnksIHRydWUpOworICAgIH0KKyAgICBjYXNlIFhGQV9PYmplY3RUeXBlOjpOb2RlQzoKKyAgICBjYXNlIFhGQV9PYmplY3RUeXBlOjpOb2RlVjoKKyAgICBjYXNlIFhGQV9PYmplY3RUeXBlOjpUZXh0Tm9kZToKKyAgICAgIHBOb2RlID0gVG9Ob2RlKEdldFhGQU9iamVjdCgpKTsKKyAgICBkZWZhdWx0OgorICAgICAgaWYgKFRvTm9kZShHZXRYRkFPYmplY3QoKSktPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkRhdGFWYWx1ZSkKKyAgICAgICAgcE5vZGUgPSBUb05vZGUoR2V0WEZBT2JqZWN0KCkpOworICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKHBOb2RlKSB7CisgICAgaWYgKGJTY3JpcHRNb2RpZnkpIHsKKyAgICAgIENGWEpTRV9FbmdpbmUqIHBTY3JpcHRDb250ZXh0ID0gR2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpOworICAgICAgaWYgKHBTY3JpcHRDb250ZXh0KQorICAgICAgICBHZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCktPkFkZE5vZGVzT2ZSdW5TY3JpcHQoCisgICAgICAgICAgICBUb05vZGUoR2V0WEZBT2JqZWN0KCkpKTsKKyAgICB9CisgICAgcmV0dXJuIFRyeUNEYXRhKFhGQV9BdHRyaWJ1dGU6OlZhbHVlLCBmYWxzZSk7CisgIH0KKyAgcmV0dXJuIHt9OworfQorCitPcHRpb25hbDxXaWRlU3RyaW5nPiBDSlhfT2JqZWN0OjpUcnlOYW1lc3BhY2UoKSB7CisgIGlmIChUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5Jc01vZGVsTm9kZSgpIHx8CisgICAgICBUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpQYWNrZXQpIHsKKyAgICBDRlhfWE1MTm9kZSogcFhNTE5vZGUgPSBUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5HZXRYTUxNYXBwaW5nTm9kZSgpOworICAgIGlmICghcFhNTE5vZGUgfHwgcFhNTE5vZGUtPkdldFR5cGUoKSAhPSBGWF9YTUxOT0RFX0VsZW1lbnQpCisgICAgICByZXR1cm4ge307CisKKyAgICByZXR1cm4ge3N0YXRpY19jYXN0PENGWF9YTUxFbGVtZW50Kj4ocFhNTE5vZGUpLT5HZXROYW1lc3BhY2VVUkkoKX07CisgIH0KKworICBpZiAoVG9Ob2RlKEdldFhGQU9iamVjdCgpKS0+R2V0UGFja2V0VHlwZSgpICE9IFhGQV9QYWNrZXRUeXBlOjpEYXRhc2V0cykKKyAgICByZXR1cm4gVG9Ob2RlKEdldFhGQU9iamVjdCgpKS0+R2V0TW9kZWxOb2RlKCktPkpTT2JqZWN0KCktPlRyeU5hbWVzcGFjZSgpOworCisgIENGWF9YTUxOb2RlKiBwWE1MTm9kZSA9IFRvTm9kZShHZXRYRkFPYmplY3QoKSktPkdldFhNTE1hcHBpbmdOb2RlKCk7CisgIGlmICghcFhNTE5vZGUgfHwgcFhNTE5vZGUtPkdldFR5cGUoKSAhPSBGWF9YTUxOT0RFX0VsZW1lbnQpCisgICAgcmV0dXJuIHt9OworCisgIGlmIChUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpEYXRhVmFsdWUgJiYKKyAgICAgIEdldEVudW0oWEZBX0F0dHJpYnV0ZTo6Q29udGFpbnMpID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpNZXRhRGF0YSkgeworICAgIFdpZGVTdHJpbmcgd3NOYW1lc3BhY2U7CisgICAgYm9vbCByZXQgPSBYRkFfRkRFRXh0ZW5zaW9uX1Jlc29sdmVOYW1lc3BhY2VRdWFsaWZpZXIoCisgICAgICAgIHN0YXRpY19jYXN0PENGWF9YTUxFbGVtZW50Kj4ocFhNTE5vZGUpLAorICAgICAgICBHZXRDRGF0YShYRkFfQXR0cmlidXRlOjpRdWFsaWZpZWROYW1lKSwgJndzTmFtZXNwYWNlKTsKKyAgICBpZiAoIXJldCkKKyAgICAgIHJldHVybiB7fTsKKyAgICByZXR1cm4ge3dzTmFtZXNwYWNlfTsKKyAgfQorICByZXR1cm4ge3N0YXRpY19jYXN0PENGWF9YTUxFbGVtZW50Kj4ocFhNTE5vZGUpLT5HZXROYW1lc3BhY2VVUkkoKX07Cit9CisKK3N0ZDo6cGFpcjxDWEZBX05vZGUqLCBpbnQzMl90PiBDSlhfT2JqZWN0OjpHZXRQcm9wZXJ0eUludGVybmFsKAorICAgIGludDMyX3QgaW5kZXgsCisgICAgWEZBX0VsZW1lbnQgZVByb3BlcnR5KSBjb25zdCB7CisgIGNvbnN0IENYRkFfTm9kZSogeGZhTm9kZSA9IFRvTm9kZShHZXRYRkFPYmplY3QoKSk7CisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0geGZhTm9kZS0+UHJvcGVydHlPY2N1cmFuY2VDb3VudChlUHJvcGVydHkpKQorICAgIHJldHVybiB7bnVsbHB0ciwgMH07CisKKyAgaW50MzJfdCBpQ291bnQgPSAwOworICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSB4ZmFOb2RlLT5HZXRGaXJzdENoaWxkKCk7IHBOb2RlOworICAgICAgIHBOb2RlID0gcE5vZGUtPkdldE5leHRTaWJsaW5nKCkpIHsKKyAgICBpZiAocE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gZVByb3BlcnR5KSB7CisgICAgICBpQ291bnQrKzsKKyAgICAgIGlmIChpQ291bnQgPiBpbmRleCkKKyAgICAgICAgcmV0dXJuIHtwTm9kZSwgaUNvdW50fTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHtudWxscHRyLCBpQ291bnR9OworfQorCitDWEZBX05vZGUqIENKWF9PYmplY3Q6OkdldE9yQ3JlYXRlUHJvcGVydHlJbnRlcm5hbChpbnQzMl90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQgZVByb3BlcnR5KSB7CisgIENYRkFfTm9kZSogeGZhTm9kZSA9IFRvTm9kZShHZXRYRkFPYmplY3QoKSk7CisgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0geGZhTm9kZS0+UHJvcGVydHlPY2N1cmFuY2VDb3VudChlUHJvcGVydHkpKQorICAgIHJldHVybiBudWxscHRyOworCisgIGludDMyX3QgaUNvdW50ID0gMDsKKyAgQ1hGQV9Ob2RlKiBub2RlOworICBzdGQ6OnRpZShub2RlLCBpQ291bnQpID0gR2V0UHJvcGVydHlJbnRlcm5hbChpbmRleCwgZVByb3BlcnR5KTsKKyAgaWYgKG5vZGUpCisgICAgcmV0dXJuIG5vZGU7CisKKyAgaWYgKHhmYU5vZGUtPkhhc1Byb3BlcnR5RmxhZ3MoZVByb3BlcnR5LCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mKSkgeworICAgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHhmYU5vZGUtPkdldEZpcnN0Q2hpbGQoKTsgcE5vZGU7CisgICAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROZXh0U2libGluZygpKSB7CisgICAgICBpZiAoeGZhTm9kZS0+SGFzUHJvcGVydHlGbGFncyhwTm9kZS0+R2V0RWxlbWVudFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QUk9QRVJUWUZMQUdfT25lT2YpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgfQorICAgIH0KKyAgfQorCisgIENYRkFfTm9kZSogcE5ld05vZGUgPSBudWxscHRyOworICBmb3IgKDsgaUNvdW50IDw9IGluZGV4OyArK2lDb3VudCkgeworICAgIHBOZXdOb2RlID0gR2V0RG9jdW1lbnQoKS0+Q3JlYXRlTm9kZSh4ZmFOb2RlLT5HZXRQYWNrZXRUeXBlKCksIGVQcm9wZXJ0eSk7CisgICAgaWYgKCFwTmV3Tm9kZSkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgeGZhTm9kZS0+SW5zZXJ0Q2hpbGQocE5ld05vZGUsIG51bGxwdHIpOworICAgIHBOZXdOb2RlLT5TZXRGbGFnKFhGQV9Ob2RlRmxhZ19Jbml0aWFsaXplZCwgdHJ1ZSk7CisgIH0KKyAgcmV0dXJuIHBOZXdOb2RlOworfQorCitib29sIENKWF9PYmplY3Q6OlNldFVzZXJEYXRhKHZvaWQqIHBLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPKiBwQ2FsbGJhY2tJbmZvKSB7CisgIFNldE1hcE1vZHVsZUJ1ZmZlcihwS2V5LCAmcERhdGEsIHNpemVvZih2b2lkKiksCisgICAgICAgICAgICAgICAgICAgICBwQ2FsbGJhY2tJbmZvID8gcENhbGxiYWNrSW5mbyA6ICZnc19YRkFEZWZhdWx0RnJlZURhdGEpOworICByZXR1cm4gdHJ1ZTsKK30KKworWEZBX01BUE1PRFVMRURBVEEqIENKWF9PYmplY3Q6OkNyZWF0ZU1hcE1vZHVsZURhdGEoKSB7CisgIGlmICghbWFwX21vZHVsZV9kYXRhXykKKyAgICBtYXBfbW9kdWxlX2RhdGFfID0gcGRmaXVtOjpNYWtlVW5pcXVlPFhGQV9NQVBNT0RVTEVEQVRBPigpOworICByZXR1cm4gbWFwX21vZHVsZV9kYXRhXy5nZXQoKTsKK30KKworWEZBX01BUE1PRFVMRURBVEEqIENKWF9PYmplY3Q6OkdldE1hcE1vZHVsZURhdGEoKSBjb25zdCB7CisgIHJldHVybiBtYXBfbW9kdWxlX2RhdGFfLmdldCgpOworfQorCit2b2lkIENKWF9PYmplY3Q6OlNldE1hcE1vZHVsZVZhbHVlKHZvaWQqIHBLZXksIHZvaWQqIHBWYWx1ZSkgeworICBDcmVhdGVNYXBNb2R1bGVEYXRhKCktPm1fVmFsdWVNYXBbcEtleV0gPSBwVmFsdWU7Cit9CisKK2Jvb2wgQ0pYX09iamVjdDo6R2V0TWFwTW9kdWxlVmFsdWUodm9pZCogcEtleSwgdm9pZComIHBWYWx1ZSkgeworICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBUb05vZGUoR2V0WEZBT2JqZWN0KCkpOyBwTm9kZTsKKyAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXRUZW1wbGF0ZU5vZGVJZkV4aXN0cygpKSB7CisgICAgWEZBX01BUE1PRFVMRURBVEEqIHBNb2R1bGUgPSBwTm9kZS0+SlNPYmplY3QoKS0+R2V0TWFwTW9kdWxlRGF0YSgpOworICAgIGlmIChwTW9kdWxlKSB7CisgICAgICBhdXRvIGl0ID0gcE1vZHVsZS0+bV9WYWx1ZU1hcC5maW5kKHBLZXkpOworICAgICAgaWYgKGl0ICE9IHBNb2R1bGUtPm1fVmFsdWVNYXAuZW5kKCkpIHsKKyAgICAgICAgcFZhbHVlID0gaXQtPnNlY29uZDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIGlmIChwTm9kZS0+R2V0UGFja2V0VHlwZSgpID09IFhGQV9QYWNrZXRUeXBlOjpEYXRhc2V0cykKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDSlhfT2JqZWN0OjpHZXRNYXBNb2R1bGVTdHJpbmcodm9pZCogcEtleSwgV2lkZVN0cmluZ1ZpZXcmIHdzVmFsdWUpIHsKKyAgdm9pZCogcFZhbHVlOworICBpbnQzMl90IGlCeXRlczsKKyAgaWYgKCFHZXRNYXBNb2R1bGVCdWZmZXIocEtleSwgcFZhbHVlLCBpQnl0ZXMsIHRydWUpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBEZWZlbnNpdmUgbWVhc3VyZTogbm8gb3V0LW9mLWJvdW5kcyBwb2ludGVycyBldmVuIGlmIHplcm8gbGVuZ3RoLgorICBpbnQzMl90IGlDaGFycyA9IGlCeXRlcyAvIHNpemVvZih3Y2hhcl90KTsKKyAgd3NWYWx1ZSA9IFdpZGVTdHJpbmdWaWV3KGlDaGFycyA/IChjb25zdCB3Y2hhcl90KilwVmFsdWUgOiBudWxscHRyLCBpQ2hhcnMpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDSlhfT2JqZWN0OjpTZXRNYXBNb2R1bGVCdWZmZXIoCisgICAgdm9pZCogcEtleSwKKyAgICB2b2lkKiBwVmFsdWUsCisgICAgaW50MzJfdCBpQnl0ZXMsCisgICAgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyogcENhbGxiYWNrSW5mbykgeworICBYRkFfTUFQREFUQUJMT0NLKiYgcEJ1ZmZlciA9IENyZWF0ZU1hcE1vZHVsZURhdGEoKS0+bV9CdWZmZXJNYXBbcEtleV07CisgIGlmICghcEJ1ZmZlcikgeworICAgIHBCdWZmZXIgPSByZWludGVycHJldF9jYXN0PFhGQV9NQVBEQVRBQkxPQ0sqPigKKyAgICAgICAgRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKFhGQV9NQVBEQVRBQkxPQ0spICsgaUJ5dGVzKSk7CisgIH0gZWxzZSBpZiAocEJ1ZmZlci0+aUJ5dGVzICE9IGlCeXRlcykgeworICAgIGlmIChwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvICYmIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKQorICAgICAgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUoKih2b2lkKiopcEJ1ZmZlci0+R2V0RGF0YSgpKTsKKworICAgIHBCdWZmZXIgPSByZWludGVycHJldF9jYXN0PFhGQV9NQVBEQVRBQkxPQ0sqPigKKyAgICAgICAgRlhfUmVhbGxvYyh1aW50OF90LCBwQnVmZmVyLCBzaXplb2YoWEZBX01BUERBVEFCTE9DSykgKyBpQnl0ZXMpKTsKKyAgfSBlbHNlIGlmIChwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvICYmIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKSB7CisgICAgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUoCisgICAgICAgICpyZWludGVycHJldF9jYXN0PHZvaWQqKj4ocEJ1ZmZlci0+R2V0RGF0YSgpKSk7CisgIH0KKyAgaWYgKCFwQnVmZmVyKQorICAgIHJldHVybjsKKworICBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvID0gcENhbGxiYWNrSW5mbzsKKyAgcEJ1ZmZlci0+aUJ5dGVzID0gaUJ5dGVzOworICBtZW1jcHkocEJ1ZmZlci0+R2V0RGF0YSgpLCBwVmFsdWUsIGlCeXRlcyk7Cit9CisKK2Jvb2wgQ0pYX09iamVjdDo6R2V0TWFwTW9kdWxlQnVmZmVyKHZvaWQqIHBLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUHJvdG9BbHNvKSBjb25zdCB7CisgIFhGQV9NQVBEQVRBQkxPQ0sqIHBCdWZmZXIgPSBudWxscHRyOworICBmb3IgKGNvbnN0IENYRkFfTm9kZSogcE5vZGUgPSBUb05vZGUoR2V0WEZBT2JqZWN0KCkpOyBwTm9kZTsKKyAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXRUZW1wbGF0ZU5vZGVJZkV4aXN0cygpKSB7CisgICAgWEZBX01BUE1PRFVMRURBVEEqIHBNb2R1bGUgPSBwTm9kZS0+SlNPYmplY3QoKS0+R2V0TWFwTW9kdWxlRGF0YSgpOworICAgIGlmIChwTW9kdWxlKSB7CisgICAgICBhdXRvIGl0ID0gcE1vZHVsZS0+bV9CdWZmZXJNYXAuZmluZChwS2V5KTsKKyAgICAgIGlmIChpdCAhPSBwTW9kdWxlLT5tX0J1ZmZlck1hcC5lbmQoKSkgeworICAgICAgICBwQnVmZmVyID0gaXQtPnNlY29uZDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmICghYlByb3RvQWxzbyB8fCBwTm9kZS0+R2V0UGFja2V0VHlwZSgpID09IFhGQV9QYWNrZXRUeXBlOjpEYXRhc2V0cykKKyAgICAgIGJyZWFrOworICB9CisgIGlmICghcEJ1ZmZlcikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcFZhbHVlID0gcEJ1ZmZlci0+R2V0RGF0YSgpOworICBpQnl0ZXMgPSBwQnVmZmVyLT5pQnl0ZXM7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENKWF9PYmplY3Q6Okhhc01hcE1vZHVsZUtleSh2b2lkKiBwS2V5KSB7CisgIFhGQV9NQVBNT0RVTEVEQVRBKiBwTW9kdWxlID0gR2V0TWFwTW9kdWxlRGF0YSgpOworICByZXR1cm4gcE1vZHVsZSAmJiAocGRmaXVtOjpDb250YWluc0tleShwTW9kdWxlLT5tX1ZhbHVlTWFwLCBwS2V5KSB8fAorICAgICAgICAgICAgICAgICAgICAgcGRmaXVtOjpDb250YWluc0tleShwTW9kdWxlLT5tX0J1ZmZlck1hcCwgcEtleSkpOworfQorCit2b2lkIENKWF9PYmplY3Q6OkNsZWFyTWFwTW9kdWxlQnVmZmVyKCkgeworICBYRkFfTUFQTU9EVUxFREFUQSogcE1vZHVsZSA9IEdldE1hcE1vZHVsZURhdGEoKTsKKyAgaWYgKCFwTW9kdWxlKQorICAgIHJldHVybjsKKworICBmb3IgKGF1dG8mIHBhaXIgOiBwTW9kdWxlLT5tX0J1ZmZlck1hcCkgeworICAgIFhGQV9NQVBEQVRBQkxPQ0sqIHBCdWZmZXIgPSBwYWlyLnNlY29uZDsKKyAgICBpZiAocEJ1ZmZlcikgeworICAgICAgaWYgKHBCdWZmZXItPnBDYWxsYmFja0luZm8gJiYgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUpCisgICAgICAgIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKCoodm9pZCoqKXBCdWZmZXItPkdldERhdGEoKSk7CisKKyAgICAgIEZYX0ZyZWUocEJ1ZmZlcik7CisgICAgfQorICB9CisgIHBNb2R1bGUtPm1fQnVmZmVyTWFwLmNsZWFyKCk7CisgIHBNb2R1bGUtPm1fVmFsdWVNYXAuY2xlYXIoKTsKK30KKwordm9pZCBDSlhfT2JqZWN0OjpSZW1vdmVNYXBNb2R1bGVLZXkodm9pZCogcEtleSkgeworICBBU1NFUlQocEtleSk7CisKKyAgWEZBX01BUE1PRFVMRURBVEEqIHBNb2R1bGUgPSBHZXRNYXBNb2R1bGVEYXRhKCk7CisgIGlmICghcE1vZHVsZSkKKyAgICByZXR1cm47CisKKyAgYXV0byBpdCA9IHBNb2R1bGUtPm1fQnVmZmVyTWFwLmZpbmQocEtleSk7CisgIGlmIChpdCAhPSBwTW9kdWxlLT5tX0J1ZmZlck1hcC5lbmQoKSkgeworICAgIFhGQV9NQVBEQVRBQkxPQ0sqIHBCdWZmZXIgPSBpdC0+c2Vjb25kOworICAgIGlmIChwQnVmZmVyKSB7CisgICAgICBpZiAocEJ1ZmZlci0+cENhbGxiYWNrSW5mbyAmJiBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSkKKyAgICAgICAgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUoKih2b2lkKiopcEJ1ZmZlci0+R2V0RGF0YSgpKTsKKworICAgICAgRlhfRnJlZShwQnVmZmVyKTsKKyAgICB9CisgICAgcE1vZHVsZS0+bV9CdWZmZXJNYXAuZXJhc2UoaXQpOworICB9CisgIHBNb2R1bGUtPm1fVmFsdWVNYXAuZXJhc2UocEtleSk7CisgIHJldHVybjsKK30KKwordm9pZCBDSlhfT2JqZWN0OjpNZXJnZUFsbERhdGEoQ1hGQV9PYmplY3QqIHBEc3RNb2R1bGUpIHsKKyAgWEZBX01BUE1PRFVMRURBVEEqIHBEc3RNb2R1bGVEYXRhID0KKyAgICAgIFRvTm9kZShwRHN0TW9kdWxlKS0+SlNPYmplY3QoKS0+Q3JlYXRlTWFwTW9kdWxlRGF0YSgpOworICBYRkFfTUFQTU9EVUxFREFUQSogcFNyY01vZHVsZURhdGEgPSBHZXRNYXBNb2R1bGVEYXRhKCk7CisgIGlmICghcFNyY01vZHVsZURhdGEpCisgICAgcmV0dXJuOworCisgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IHBTcmNNb2R1bGVEYXRhLT5tX1ZhbHVlTWFwKQorICAgIHBEc3RNb2R1bGVEYXRhLT5tX1ZhbHVlTWFwW3BhaXIuZmlyc3RdID0gcGFpci5zZWNvbmQ7CisKKyAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogcFNyY01vZHVsZURhdGEtPm1fQnVmZmVyTWFwKSB7CisgICAgWEZBX01BUERBVEFCTE9DSyogcFNyY0J1ZmZlciA9IHBhaXIuc2Vjb25kOworICAgIFhGQV9NQVBEQVRBQkxPQ0sqJiBwRHN0QnVmZmVyID0gcERzdE1vZHVsZURhdGEtPm1fQnVmZmVyTWFwW3BhaXIuZmlyc3RdOworICAgIGlmIChwU3JjQnVmZmVyLT5wQ2FsbGJhY2tJbmZvICYmIHBTcmNCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlICYmCisgICAgICAgICFwU3JjQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wQ29weSkgeworICAgICAgaWYgKHBEc3RCdWZmZXIpIHsKKyAgICAgICAgcERzdEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUoKih2b2lkKiopcERzdEJ1ZmZlci0+R2V0RGF0YSgpKTsKKyAgICAgICAgcERzdE1vZHVsZURhdGEtPm1fQnVmZmVyTWFwLmVyYXNlKHBhaXIuZmlyc3QpOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICghcERzdEJ1ZmZlcikgeworICAgICAgcERzdEJ1ZmZlciA9IChYRkFfTUFQREFUQUJMT0NLKilGWF9BbGxvYygKKyAgICAgICAgICB1aW50OF90LCBzaXplb2YoWEZBX01BUERBVEFCTE9DSykgKyBwU3JjQnVmZmVyLT5pQnl0ZXMpOworICAgIH0gZWxzZSBpZiAocERzdEJ1ZmZlci0+aUJ5dGVzICE9IHBTcmNCdWZmZXItPmlCeXRlcykgeworICAgICAgaWYgKHBEc3RCdWZmZXItPnBDYWxsYmFja0luZm8gJiYgcERzdEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUpIHsKKyAgICAgICAgcERzdEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUoKih2b2lkKiopcERzdEJ1ZmZlci0+R2V0RGF0YSgpKTsKKyAgICAgIH0KKyAgICAgIHBEc3RCdWZmZXIgPSAoWEZBX01BUERBVEFCTE9DSyopRlhfUmVhbGxvYygKKyAgICAgICAgICB1aW50OF90LCBwRHN0QnVmZmVyLCBzaXplb2YoWEZBX01BUERBVEFCTE9DSykgKyBwU3JjQnVmZmVyLT5pQnl0ZXMpOworICAgIH0gZWxzZSBpZiAocERzdEJ1ZmZlci0+cENhbGxiYWNrSW5mbyAmJiBwRHN0QnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSkgeworICAgICAgcERzdEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUoKih2b2lkKiopcERzdEJ1ZmZlci0+R2V0RGF0YSgpKTsKKyAgICB9CisgICAgaWYgKCFwRHN0QnVmZmVyKQorICAgICAgY29udGludWU7CisKKyAgICBwRHN0QnVmZmVyLT5wQ2FsbGJhY2tJbmZvID0gcFNyY0J1ZmZlci0+cENhbGxiYWNrSW5mbzsKKyAgICBwRHN0QnVmZmVyLT5pQnl0ZXMgPSBwU3JjQnVmZmVyLT5pQnl0ZXM7CisgICAgbWVtY3B5KHBEc3RCdWZmZXItPkdldERhdGEoKSwgcFNyY0J1ZmZlci0+R2V0RGF0YSgpLCBwU3JjQnVmZmVyLT5pQnl0ZXMpOworICAgIGlmIChwRHN0QnVmZmVyLT5wQ2FsbGJhY2tJbmZvICYmIHBEc3RCdWZmZXItPnBDYWxsYmFja0luZm8tPnBDb3B5KSB7CisgICAgICBwRHN0QnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wQ29weSgqKHZvaWQqKilwRHN0QnVmZmVyLT5HZXREYXRhKCkpOworICAgIH0KKyAgfQorfQorCit2b2lkIENKWF9PYmplY3Q6Ok1vdmVCdWZmZXJNYXBEYXRhKENYRkFfT2JqZWN0KiBwRHN0TW9kdWxlKSB7CisgIGlmICghcERzdE1vZHVsZSkKKyAgICByZXR1cm47CisKKyAgYm9vbCBiTmVlZE1vdmUgPSB0cnVlOworICBpZiAocERzdE1vZHVsZS0+R2V0RWxlbWVudFR5cGUoKSAhPSBHZXRYRkFPYmplY3QoKS0+R2V0RWxlbWVudFR5cGUoKSkKKyAgICBiTmVlZE1vdmUgPSBmYWxzZTsKKworICBpZiAoYk5lZWRNb3ZlKQorICAgIFRvTm9kZShwRHN0TW9kdWxlKS0+SlNPYmplY3QoKS0+U2V0Q2FsY0RhdGEoUmVsZWFzZUNhbGNEYXRhKCkpOworICBpZiAoIXBEc3RNb2R1bGUtPklzTm9kZVYoKSkKKyAgICByZXR1cm47CisKKyAgV2lkZVN0cmluZyB3c1ZhbHVlID0gVG9Ob2RlKHBEc3RNb2R1bGUpLT5KU09iamVjdCgpLT5HZXRDb250ZW50KGZhbHNlKTsKKyAgV2lkZVN0cmluZyB3c0Zvcm1hdFZhbHVlKHdzVmFsdWUpOworICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IFRvTm9kZShwRHN0TW9kdWxlKS0+R2V0Q29udGFpbmVyV2lkZ2V0QWNjKCk7CisgIGlmIChwV2lkZ2V0QWNjKQorICAgIHdzRm9ybWF0VmFsdWUgPSBwV2lkZ2V0QWNjLT5HZXRGb3JtYXREYXRhVmFsdWUod3NWYWx1ZSk7CisKKyAgVG9Ob2RlKHBEc3RNb2R1bGUpCisgICAgICAtPkpTT2JqZWN0KCkKKyAgICAgIC0+U2V0Q29udGVudCh3c1ZhbHVlLCB3c0Zvcm1hdFZhbHVlLCB0cnVlLCB0cnVlLCB0cnVlKTsKK30KKwordm9pZCBDSlhfT2JqZWN0OjpNb3ZlQnVmZmVyTWFwRGF0YShDWEZBX09iamVjdCogcFNyY01vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9PYmplY3QqIHBEc3RNb2R1bGUpIHsKKyAgaWYgKCFwU3JjTW9kdWxlIHx8ICFwRHN0TW9kdWxlKQorICAgIHJldHVybjsKKworICBDWEZBX05vZGUqIHBTcmNDaGlsZCA9IFRvTm9kZShwU3JjTW9kdWxlKS0+R2V0Rmlyc3RDaGlsZCgpOworICBDWEZBX05vZGUqIHBEc3RDaGlsZCA9IFRvTm9kZShwRHN0TW9kdWxlKS0+R2V0Rmlyc3RDaGlsZCgpOworICB3aGlsZSAocFNyY0NoaWxkICYmIHBEc3RDaGlsZCkgeworICAgIE1vdmVCdWZmZXJNYXBEYXRhKHBTcmNDaGlsZCwgcERzdENoaWxkKTsKKworICAgIHBTcmNDaGlsZCA9IHBTcmNDaGlsZC0+R2V0TmV4dFNpYmxpbmcoKTsKKyAgICBwRHN0Q2hpbGQgPSBwRHN0Q2hpbGQtPkdldE5leHRTaWJsaW5nKCk7CisgIH0KKyAgVG9Ob2RlKHBTcmNNb2R1bGUpLT5KU09iamVjdCgpLT5Nb3ZlQnVmZmVyTWFwRGF0YShwRHN0TW9kdWxlKTsKK30KKwordm9pZCBDSlhfT2JqZWN0OjpPbkNoYW5naW5nKFhGQV9BdHRyaWJ1dGUgZUF0dHIsIGJvb2wgYk5vdGlmeSkgeworICBpZiAoIWJOb3RpZnkgfHwgIVRvTm9kZShHZXRYRkFPYmplY3QoKSktPklzSW5pdGlhbGl6ZWQoKSkKKyAgICByZXR1cm47CisKKyAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IEdldERvY3VtZW50KCktPkdldE5vdGlmeSgpOworICBpZiAocE5vdGlmeSkKKyAgICBwTm90aWZ5LT5PblZhbHVlQ2hhbmdpbmcoVG9Ob2RlKEdldFhGQU9iamVjdCgpKSwgZUF0dHIpOworfQorCit2b2lkIENKWF9PYmplY3Q6Ok9uQ2hhbmdlZChYRkFfQXR0cmlidXRlIGVBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2NyaXB0TW9kaWZ5KSB7CisgIGlmIChiTm90aWZ5ICYmIFRvTm9kZShHZXRYRkFPYmplY3QoKSktPklzSW5pdGlhbGl6ZWQoKSkKKyAgICBUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5TZW5kQXR0cmlidXRlQ2hhbmdlTWVzc2FnZShlQXR0ciwgYlNjcmlwdE1vZGlmeSk7Cit9CisKK3ZvaWQgQ0pYX09iamVjdDo6U2V0Q2FsY0RhdGEoc3RkOjp1bmlxdWVfcHRyPENYRkFfQ2FsY0RhdGE+IGRhdGEpIHsKKyAgY2FsY19kYXRhXyA9IHN0ZDo6bW92ZShkYXRhKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPENYRkFfQ2FsY0RhdGE+IENKWF9PYmplY3Q6OlJlbGVhc2VDYWxjRGF0YSgpIHsKKyAgcmV0dXJuIHN0ZDo6bW92ZShjYWxjX2RhdGFfKTsKK30KKwordm9pZCBDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIGlmICghYlNldHRpbmcpIHsKKyAgICBwVmFsdWUtPlNldFN0cmluZyhHZXRBdHRyaWJ1dGUoZUF0dHJpYnV0ZSkuVVRGOEVuY29kZSgpLkFzU3RyaW5nVmlldygpKTsKKyAgICByZXR1cm47CisgIH0KKworICBXaWRlU3RyaW5nIHdzVmFsdWUgPSBwVmFsdWUtPlRvV2lkZVN0cmluZygpOworICBTZXRBdHRyaWJ1dGUoZUF0dHJpYnV0ZSwgd3NWYWx1ZS5Bc1N0cmluZ1ZpZXcoKSwgdHJ1ZSk7CisgIGlmIChlQXR0cmlidXRlICE9IFhGQV9BdHRyaWJ1dGU6OlVzZSB8fAorICAgICAgR2V0WEZBT2JqZWN0KCktPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OkRlc2MpIHsKKyAgICByZXR1cm47CisgIH0KKworICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUgPQorICAgICAgVG9Ob2RlKEdldERvY3VtZW50KCktPkdldFhGQU9iamVjdChYRkFfSEFTSENPREVfVGVtcGxhdGUpKTsKKyAgQ1hGQV9Qcm90byogcFByb3RvUm9vdCA9CisgICAgICBwVGVtcGxhdGVOb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX1N1YmZvcm0+KFhGQV9FbGVtZW50OjpTdWJmb3JtKQorICAgICAgICAgIC0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9Qcm90bz4oWEZBX0VsZW1lbnQ6OlByb3RvKTsKKworICBXaWRlU3RyaW5nIHdzSUQ7CisgIFdpZGVTdHJpbmcgd3NTT007CisgIGlmICghd3NWYWx1ZS5Jc0VtcHR5KCkpIHsKKyAgICBpZiAod3NWYWx1ZVswXSA9PSAnIycpCisgICAgICB3c0lEID0gV2lkZVN0cmluZyh3c1ZhbHVlLmNfc3RyKCkgKyAxLCB3c1ZhbHVlLkdldExlbmd0aCgpIC0gMSk7CisgICAgZWxzZQorICAgICAgd3NTT00gPSB3c1ZhbHVlOworICB9CisKKyAgQ1hGQV9Ob2RlKiBwUHJvdG9Ob2RlID0gbnVsbHB0cjsKKyAgaWYgKCF3c1NPTS5Jc0VtcHR5KCkpIHsKKyAgICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb2x2ZU5vZGVSUzsKKyAgICBib29sIGlSZXQgPSBHZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCktPlJlc29sdmVPYmplY3RzKAorICAgICAgICBwUHJvdG9Sb290LCB3c1NPTS5Bc1N0cmluZ1ZpZXcoKSwgJnJlc29sdmVOb2RlUlMsCisgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzIHwKKyAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8CisgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MsCisgICAgICAgIG51bGxwdHIpOworICAgIGlmIChpUmV0ICYmIHJlc29sdmVOb2RlUlMub2JqZWN0cy5mcm9udCgpLT5Jc05vZGUoKSkKKyAgICAgIHBQcm90b05vZGUgPSByZXNvbHZlTm9kZVJTLm9iamVjdHMuZnJvbnQoKS0+QXNOb2RlKCk7CisKKyAgfSBlbHNlIGlmICghd3NJRC5Jc0VtcHR5KCkpIHsKKyAgICBwUHJvdG9Ob2RlID0gR2V0RG9jdW1lbnQoKS0+R2V0Tm9kZUJ5SUQocFByb3RvUm9vdCwgd3NJRC5Bc1N0cmluZ1ZpZXcoKSk7CisgIH0KKyAgaWYgKCFwUHJvdG9Ob2RlKQorICAgIHJldHVybjsKKworICBDWEZBX05vZGUqIHBIZWFkQ2hpbGQgPSBUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5HZXRGaXJzdENoaWxkKCk7CisgIHdoaWxlIChwSGVhZENoaWxkKSB7CisgICAgQ1hGQV9Ob2RlKiBwU2libGluZyA9IHBIZWFkQ2hpbGQtPkdldE5leHRTaWJsaW5nKCk7CisgICAgVG9Ob2RlKEdldFhGQU9iamVjdCgpKS0+UmVtb3ZlQ2hpbGQocEhlYWRDaGlsZCwgdHJ1ZSk7CisgICAgcEhlYWRDaGlsZCA9IHBTaWJsaW5nOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfTm9kZT4gcFByb3RvRm9ybShwUHJvdG9Ob2RlLT5DbG9uZVRlbXBsYXRlVG9Gb3JtKHRydWUpKTsKKyAgcEhlYWRDaGlsZCA9IHBQcm90b0Zvcm0tPkdldEZpcnN0Q2hpbGQoKTsKKyAgd2hpbGUgKHBIZWFkQ2hpbGQpIHsKKyAgICBDWEZBX05vZGUqIHBTaWJsaW5nID0gcEhlYWRDaGlsZC0+R2V0TmV4dFNpYmxpbmcoKTsKKyAgICBwUHJvdG9Gb3JtLT5SZW1vdmVDaGlsZChwSGVhZENoaWxkLCB0cnVlKTsKKyAgICBUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5JbnNlcnRDaGlsZChwSGVhZENoaWxkLCBudWxscHRyKTsKKyAgICBwSGVhZENoaWxkID0gcFNpYmxpbmc7CisgIH0KKworICBHZXREb2N1bWVudCgpLT5SZW1vdmVQdXJnZU5vZGUocFByb3RvRm9ybS5nZXQoKSk7Cit9CisKK3ZvaWQgQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBpZiAoYlNldHRpbmcpIHsKKyAgICBTZXRCb29sZWFuKGVBdHRyaWJ1dGUsIHBWYWx1ZS0+VG9Cb29sZWFuKCksIHRydWUpOworICAgIHJldHVybjsKKyAgfQorICBwVmFsdWUtPlNldFN0cmluZyhHZXRCb29sZWFuKGVBdHRyaWJ1dGUpID8gIjEiIDogIjAiKTsKK30KKwordm9pZCBDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0ludGVnZXIoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIGlmIChiU2V0dGluZykgeworICAgIFNldEludGVnZXIoZUF0dHJpYnV0ZSwgcFZhbHVlLT5Ub0ludGVnZXIoKSwgdHJ1ZSk7CisgICAgcmV0dXJuOworICB9CisgIHBWYWx1ZS0+U2V0SW50ZWdlcihHZXRJbnRlZ2VyKGVBdHRyaWJ1dGUpKTsKK30KKwordm9pZCBDSlhfT2JqZWN0OjpTY3JpcHRfU29tX0ZvbnRDb2xvcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIENYRkFfRm9udCogZm9udCA9IFRvTm9kZShvYmplY3RfLkdldCgpKS0+R2V0T3JDcmVhdGVGb250SWZQb3NzaWJsZSgpOworICBpZiAoIWZvbnQpCisgICAgcmV0dXJuOworCisgIGlmIChiU2V0dGluZykgeworICAgIGludDMyX3QgcjsKKyAgICBpbnQzMl90IGc7CisgICAgaW50MzJfdCBiOworICAgIHN0ZDo6dGllKHIsIGcsIGIpID0gU3RyVG9SR0IocFZhbHVlLT5Ub1dpZGVTdHJpbmcoKSk7CisgICAgRlhfQVJHQiBjb2xvciA9IEFyZ2JFbmNvZGUoMHhmZiwgciwgZywgYik7CisgICAgZm9udC0+U2V0Q29sb3IoY29sb3IpOworICAgIHJldHVybjsKKyAgfQorCisgIGludDMyX3QgYTsKKyAgaW50MzJfdCByOworICBpbnQzMl90IGc7CisgIGludDMyX3QgYjsKKyAgc3RkOjp0aWUoYSwgciwgZywgYikgPSBBcmdiRGVjb2RlKGZvbnQtPkdldENvbG9yKCkpOworICBwVmFsdWUtPlNldFN0cmluZyhCeXRlU3RyaW5nOjpGb3JtYXQoIiVkLCVkLCVkIiwgciwgZywgYikuQXNTdHJpbmdWaWV3KCkpOworfQorCit2b2lkIENKWF9PYmplY3Q6OlNjcmlwdF9Tb21fRmlsbENvbG9yKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgQ1hGQV9Cb3JkZXIqIGJvcmRlciA9IFRvTm9kZShvYmplY3RfLkdldCgpKS0+R2V0T3JDcmVhdGVCb3JkZXJJZlBvc3NpYmxlKCk7CisgIENYRkFfRmlsbCogYm9yZGVyZmlsbCA9IGJvcmRlci0+R2V0T3JDcmVhdGVGaWxsSWZQb3NzaWJsZSgpOworICBpZiAoIWJvcmRlcmZpbGwpCisgICAgcmV0dXJuOworCisgIGlmIChiU2V0dGluZykgeworICAgIGludDMyX3QgcjsKKyAgICBpbnQzMl90IGc7CisgICAgaW50MzJfdCBiOworICAgIHN0ZDo6dGllKHIsIGcsIGIpID0gU3RyVG9SR0IocFZhbHVlLT5Ub1dpZGVTdHJpbmcoKSk7CisgICAgRlhfQVJHQiBjb2xvciA9IEFyZ2JFbmNvZGUoMHhmZiwgciwgZywgYik7CisgICAgYm9yZGVyZmlsbC0+U2V0Q29sb3IoY29sb3IpOworICAgIHJldHVybjsKKyAgfQorCisgIEZYX0FSR0IgY29sb3IgPSBib3JkZXJmaWxsLT5HZXRDb2xvcihmYWxzZSk7CisgIGludDMyX3QgYTsKKyAgaW50MzJfdCByOworICBpbnQzMl90IGc7CisgIGludDMyX3QgYjsKKyAgc3RkOjp0aWUoYSwgciwgZywgYikgPSBBcmdiRGVjb2RlKGNvbG9yKTsKKyAgcFZhbHVlLT5TZXRTdHJpbmcoCisgICAgICBXaWRlU3RyaW5nOjpGb3JtYXQoTCIlZCwlZCwlZCIsIHIsIGcsIGIpLlVURjhFbmNvZGUoKS5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKK3ZvaWQgQ0pYX09iamVjdDo6U2NyaXB0X1NvbV9Cb3JkZXJDb2xvcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBDWEZBX0JvcmRlciogYm9yZGVyID0gVG9Ob2RlKG9iamVjdF8uR2V0KCkpLT5HZXRPckNyZWF0ZUJvcmRlcklmUG9zc2libGUoKTsKKyAgaW50MzJfdCBpU2l6ZSA9IGJvcmRlci0+Q291bnRFZGdlcygpOworICBpZiAoYlNldHRpbmcpIHsKKyAgICBpbnQzMl90IHIgPSAwOworICAgIGludDMyX3QgZyA9IDA7CisgICAgaW50MzJfdCBiID0gMDsKKyAgICBzdGQ6OnRpZShyLCBnLCBiKSA9IFN0clRvUkdCKHBWYWx1ZS0+VG9XaWRlU3RyaW5nKCkpOworICAgIEZYX0FSR0IgcmdiID0gQXJnYkVuY29kZSgxMDAsIHIsIGcsIGIpOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyArK2kpIHsKKyAgICAgIENYRkFfRWRnZSogZWRnZSA9IGJvcmRlci0+R2V0RWRnZUlmRXhpc3RzKGkpOworICAgICAgaWYgKGVkZ2UpCisgICAgICAgIGVkZ2UtPlNldENvbG9yKHJnYik7CisgICAgfQorCisgICAgcmV0dXJuOworICB9CisKKyAgQ1hGQV9FZGdlKiBlZGdlID0gYm9yZGVyLT5HZXRFZGdlSWZFeGlzdHMoMCk7CisgIEZYX0FSR0IgY29sb3IgPSBlZGdlID8gZWRnZS0+R2V0Q29sb3IoKSA6IENYRkFfRWRnZTo6a0RlZmF1bHRDb2xvcjsKKyAgaW50MzJfdCBhOworICBpbnQzMl90IHI7CisgIGludDMyX3QgZzsKKyAgaW50MzJfdCBiOworICBzdGQ6OnRpZShhLCByLCBnLCBiKSA9IEFyZ2JEZWNvZGUoY29sb3IpOworICBwVmFsdWUtPlNldFN0cmluZygKKyAgICAgIFdpZGVTdHJpbmc6OkZvcm1hdChMIiVkLCVkLCVkIiwgciwgZywgYikuVVRGOEVuY29kZSgpLkFzU3RyaW5nVmlldygpKTsKK30KKwordm9pZCBDSlhfT2JqZWN0OjpTY3JpcHRfU29tX0JvcmRlcldpZHRoKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIENYRkFfQm9yZGVyKiBib3JkZXIgPSBUb05vZGUob2JqZWN0Xy5HZXQoKSktPkdldE9yQ3JlYXRlQm9yZGVySWZQb3NzaWJsZSgpOworICBpZiAoYlNldHRpbmcpIHsKKyAgICBDWEZBX0VkZ2UqIGVkZ2UgPSBib3JkZXItPkdldEVkZ2VJZkV4aXN0cygwKTsKKyAgICBDWEZBX01lYXN1cmVtZW50IHRoaWNrbmVzcyA9CisgICAgICAgIGVkZ2UgPyBlZGdlLT5HZXRNU1RoaWNrbmVzcygpIDogQ1hGQV9NZWFzdXJlbWVudCgwLjUsIFhGQV9Vbml0OjpQdCk7CisgICAgcFZhbHVlLT5TZXRTdHJpbmcodGhpY2tuZXNzLlRvU3RyaW5nKCkuVVRGOEVuY29kZSgpLkFzU3RyaW5nVmlldygpKTsKKyAgICByZXR1cm47CisgIH0KKworICBXaWRlU3RyaW5nIHdzVGhpY2tuZXNzID0gcFZhbHVlLT5Ub1dpZGVTdHJpbmcoKTsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYm9yZGVyLT5Db3VudEVkZ2VzKCk7ICsraSkgeworICAgIENYRkFfRWRnZSogZWRnZSA9IGJvcmRlci0+R2V0RWRnZUlmRXhpc3RzKGkpOworICAgIGlmIChlZGdlKQorICAgICAgZWRnZS0+U2V0TVNUaGlja25lc3MoQ1hGQV9NZWFzdXJlbWVudCh3c1RoaWNrbmVzcy5Bc1N0cmluZ1ZpZXcoKSkpOworICB9Cit9CisKK3ZvaWQgQ0pYX09iamVjdDo6U2NyaXB0X1NvbV9NZXNzYWdlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9TT01fTUVTU0FHRVRZUEUgaU1lc3NhZ2VUeXBlKSB7CisgIGJvb2wgYk5ldyA9IGZhbHNlOworICBDWEZBX1ZhbGlkYXRlKiB2YWxpZGF0ZSA9IFRvTm9kZShvYmplY3RfLkdldCgpKS0+R2V0VmFsaWRhdGVJZkV4aXN0cygpOworICBpZiAoIXZhbGlkYXRlKSB7CisgICAgdmFsaWRhdGUgPSBUb05vZGUob2JqZWN0Xy5HZXQoKSktPkdldE9yQ3JlYXRlVmFsaWRhdGVJZlBvc3NpYmxlKCk7CisgICAgYk5ldyA9IHRydWU7CisgIH0KKworICBpZiAoYlNldHRpbmcpIHsKKyAgICBpZiAodmFsaWRhdGUpIHsKKyAgICAgIHN3aXRjaCAoaU1lc3NhZ2VUeXBlKSB7CisgICAgICAgIGNhc2UgWEZBX1NPTV9WYWxpZGF0aW9uTWVzc2FnZToKKyAgICAgICAgICB2YWxpZGF0ZS0+U2V0U2NyaXB0TWVzc2FnZVRleHQocFZhbHVlLT5Ub1dpZGVTdHJpbmcoKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWEZBX1NPTV9Gb3JtYXRNZXNzYWdlOgorICAgICAgICAgIHZhbGlkYXRlLT5TZXRGb3JtYXRNZXNzYWdlVGV4dChwVmFsdWUtPlRvV2lkZVN0cmluZygpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBYRkFfU09NX01hbmRhdG9yeU1lc3NhZ2U6CisgICAgICAgICAgdmFsaWRhdGUtPlNldE51bGxNZXNzYWdlVGV4dChwVmFsdWUtPlRvV2lkZVN0cmluZygpKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWJOZXcpIHsKKyAgICAgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBHZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKKyAgICAgIGlmICghcE5vdGlmeSkKKyAgICAgICAgcmV0dXJuOworCisgICAgICBwTm90aWZ5LT5BZGRDYWxjVmFsaWRhdGUoVG9Ob2RlKEdldFhGQU9iamVjdCgpKSk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIGlmICghdmFsaWRhdGUpIHsKKyAgICAvLyBUT0RPKGRzaW5jbGFpcik6IEJldHRlciBlcnJvciBtZXNzYWdlPworICAgIFRocm93SW52YWxpZFByb3BlcnR5RXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgV2lkZVN0cmluZyB3c01lc3NhZ2U7CisgIHN3aXRjaCAoaU1lc3NhZ2VUeXBlKSB7CisgICAgY2FzZSBYRkFfU09NX1ZhbGlkYXRpb25NZXNzYWdlOgorICAgICAgd3NNZXNzYWdlID0gdmFsaWRhdGUtPkdldFNjcmlwdE1lc3NhZ2VUZXh0KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9TT01fRm9ybWF0TWVzc2FnZToKKyAgICAgIHdzTWVzc2FnZSA9IHZhbGlkYXRlLT5HZXRGb3JtYXRNZXNzYWdlVGV4dCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfU09NX01hbmRhdG9yeU1lc3NhZ2U6CisgICAgICB3c01lc3NhZ2UgPSB2YWxpZGF0ZS0+R2V0TnVsbE1lc3NhZ2VUZXh0KCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcFZhbHVlLT5TZXRTdHJpbmcod3NNZXNzYWdlLlVURjhFbmNvZGUoKS5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKK3ZvaWQgQ0pYX09iamVjdDo6U2NyaXB0X1NvbV9WYWxpZGF0aW9uTWVzc2FnZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfU29tX01lc3NhZ2UocFZhbHVlLCBiU2V0dGluZywgWEZBX1NPTV9WYWxpZGF0aW9uTWVzc2FnZSk7Cit9CisKK3ZvaWQgQ0pYX09iamVjdDo6U2NyaXB0X1NvbV9NYW5kYXRvcnlNZXNzYWdlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfU29tX01lc3NhZ2UocFZhbHVlLCBiU2V0dGluZywgWEZBX1NPTV9NYW5kYXRvcnlNZXNzYWdlKTsKK30KKwordm9pZCBDSlhfT2JqZWN0OjpTY3JpcHRfRmllbGRfTGVuZ3RoKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIGlmIChiU2V0dGluZykgeworICAgIFRocm93SW52YWxpZFByb3BlcnR5RXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisgIGlmICghVG9Ob2RlKG9iamVjdF8uR2V0KCkpLT5HZXRXaWRnZXRBY2MoKSkgeworICAgIHBWYWx1ZS0+U2V0SW50ZWdlcigwKTsKKyAgICByZXR1cm47CisgIH0KKyAgcFZhbHVlLT5TZXRJbnRlZ2VyKAorICAgICAgVG9Ob2RlKG9iamVjdF8uR2V0KCkpLT5HZXRXaWRnZXRBY2MoKS0+Q291bnRDaG9pY2VMaXN0SXRlbXModHJ1ZSkpOworfQorCit2b2lkIENKWF9PYmplY3Q6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIC8qIHVudXNlZCAqLykgeworICBYRkFfRWxlbWVudCBlVHlwZSA9IFRvTm9kZShHZXRYRkFPYmplY3QoKSktPkdldEVsZW1lbnRUeXBlKCk7CisKKyAgLy8gVE9ETyhkc2luY2xhaXIpOiBUaGlzIHNob3VsZCBsb29rIHRocm91Z2ggdGhlIHByb3BlcnRpZXMgb24gdGhlIG5vZGUgdG8gc2VlCisgIC8vIGlmIGRlZmF1bHRWYWx1ZSBpcyBkZWZpbmVkIGFuZCwgaWYgc28sIGNhbGwgdGhhdCBvbmUuIEp1c3QgaGF2ZSB0byBtYWtlCisgIC8vIHN1cmUgdGhhdCB0aG9zZSBkZWZhdWx0VmFsdWUgY2FsbHMgZG9uJ3QgY2FsbCBiYWNrIHRvIHRoaXMgb25lIC4uLi4KKyAgaWYgKGVUeXBlID09IFhGQV9FbGVtZW50OjpGaWVsZCkgeworICAgIHN0YXRpY19jYXN0PENKWF9GaWVsZCo+KHRoaXMpLT5kZWZhdWx0VmFsdWUocFZhbHVlLCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24pOworICAgIHJldHVybjsKKyAgfQorICBpZiAoZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OkRyYXcpIHsKKyAgICBzdGF0aWNfY2FzdDxDSlhfRHJhdyo+KHRoaXMpLT5kZWZhdWx0VmFsdWUocFZhbHVlLCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93bik7CisgICAgcmV0dXJuOworICB9CisgIGlmIChlVHlwZSA9PSBYRkFfRWxlbWVudDo6Qm9vbGVhbikgeworICAgIHN0YXRpY19jYXN0PENKWF9Cb29sZWFuKj4odGhpcyktPmRlZmF1bHRWYWx1ZShwVmFsdWUsIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoYlNldHRpbmcpIHsKKyAgICBXaWRlU3RyaW5nIHdzTmV3VmFsdWU7CisgICAgaWYgKHBWYWx1ZSAmJiAhKHBWYWx1ZS0+SXNOdWxsKCkgfHwgcFZhbHVlLT5Jc1VuZGVmaW5lZCgpKSkKKyAgICAgIHdzTmV3VmFsdWUgPSBwVmFsdWUtPlRvV2lkZVN0cmluZygpOworCisgICAgV2lkZVN0cmluZyB3c0Zvcm1hdFZhbHVlKHdzTmV3VmFsdWUpOworICAgIENYRkFfV2lkZ2V0QWNjKiBwQ29udGFpbmVyV2lkZ2V0QWNjID0gbnVsbHB0cjsKKyAgICBpZiAoVG9Ob2RlKEdldFhGQU9iamVjdCgpKS0+R2V0UGFja2V0VHlwZSgpID09IFhGQV9QYWNrZXRUeXBlOjpEYXRhc2V0cykgeworICAgICAgV2lkZVN0cmluZyB3c1BpY3R1cmU7CisgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBGb3JtTm9kZSA6ICooVG9Ob2RlKEdldFhGQU9iamVjdCgpKS0+R2V0QmluZEl0ZW1zKCkpKSB7CisgICAgICAgIGlmICghcEZvcm1Ob2RlIHx8IHBGb3JtTm9kZS0+SGFzUmVtb3ZlZENoaWxkcmVuKCkpCisgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgcENvbnRhaW5lcldpZGdldEFjYyA9IHBGb3JtTm9kZS0+R2V0Q29udGFpbmVyV2lkZ2V0QWNjKCk7CisgICAgICAgIGlmIChwQ29udGFpbmVyV2lkZ2V0QWNjKSB7CisgICAgICAgICAgd3NQaWN0dXJlID0KKyAgICAgICAgICAgICAgcENvbnRhaW5lcldpZGdldEFjYy0+R2V0UGljdHVyZUNvbnRlbnQoWEZBX1ZBTFVFUElDVFVSRV9EYXRhQmluZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF3c1BpY3R1cmUuSXNFbXB0eSgpKQorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHBDb250YWluZXJXaWRnZXRBY2MgPSBudWxscHRyOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoVG9Ob2RlKEdldFhGQU9iamVjdCgpKS0+R2V0UGFja2V0VHlwZSgpID09CisgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZTo6Rm9ybSkgeworICAgICAgcENvbnRhaW5lcldpZGdldEFjYyA9IFRvTm9kZShHZXRYRkFPYmplY3QoKSktPkdldENvbnRhaW5lcldpZGdldEFjYygpOworICAgIH0KKworICAgIGlmIChwQ29udGFpbmVyV2lkZ2V0QWNjKQorICAgICAgd3NGb3JtYXRWYWx1ZSA9IHBDb250YWluZXJXaWRnZXRBY2MtPkdldEZvcm1hdERhdGFWYWx1ZSh3c05ld1ZhbHVlKTsKKworICAgIFNldENvbnRlbnQod3NOZXdWYWx1ZSwgd3NGb3JtYXRWYWx1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgV2lkZVN0cmluZyBjb250ZW50ID0gR2V0Q29udGVudCh0cnVlKTsKKyAgaWYgKGNvbnRlbnQuSXNFbXB0eSgpICYmIGVUeXBlICE9IFhGQV9FbGVtZW50OjpUZXh0ICYmCisgICAgICBlVHlwZSAhPSBYRkFfRWxlbWVudDo6U3VibWl0VXJsKSB7CisgICAgcFZhbHVlLT5TZXROdWxsKCk7CisgIH0gZWxzZSBpZiAoZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OkludGVnZXIpIHsKKyAgICBwVmFsdWUtPlNldEludGVnZXIoRlhTWVNfd3RvaShjb250ZW50LmNfc3RyKCkpKTsKKyAgfSBlbHNlIGlmIChlVHlwZSA9PSBYRkFfRWxlbWVudDo6RmxvYXQgfHwgZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OkRlY2ltYWwpIHsKKyAgICBDRlhfRGVjaW1hbCBkZWNpbWFsKGNvbnRlbnQuQXNTdHJpbmdWaWV3KCkpOworICAgIHBWYWx1ZS0+U2V0RmxvYXQoKGZsb2F0KShkb3VibGUpZGVjaW1hbCk7CisgIH0gZWxzZSB7CisgICAgcFZhbHVlLT5TZXRTdHJpbmcoY29udGVudC5VVEY4RW5jb2RlKCkuQXNTdHJpbmdWaWV3KCkpOworICB9Cit9CisKK3ZvaWQgQ0pYX09iamVjdDo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWVfUmVhZChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBpZiAoYlNldHRpbmcpIHsKKyAgICBUaHJvd0ludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorCisgIFdpZGVTdHJpbmcgY29udGVudCA9IEdldENvbnRlbnQodHJ1ZSk7CisgIGlmIChjb250ZW50LklzRW1wdHkoKSkgeworICAgIHBWYWx1ZS0+U2V0TnVsbCgpOworICAgIHJldHVybjsKKyAgfQorICBwVmFsdWUtPlNldFN0cmluZyhjb250ZW50LlVURjhFbmNvZGUoKS5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKK3ZvaWQgQ0pYX09iamVjdDo6U2NyaXB0X1NvbV9EYXRhTm9kZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBpZiAoYlNldHRpbmcpIHsKKyAgICBUaHJvd0ludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorCisgIENYRkFfTm9kZSogcERhdGFOb2RlID0gVG9Ob2RlKEdldFhGQU9iamVjdCgpKS0+R2V0QmluZERhdGEoKTsKKyAgaWYgKCFwRGF0YU5vZGUpIHsKKyAgICBwVmFsdWUtPlNldE51bGwoKTsKKyAgICByZXR1cm47CisgIH0KKworICBwVmFsdWUtPkFzc2lnbigKKyAgICAgIEdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocERhdGFOb2RlKSk7Cit9CisKK3ZvaWQgQ0pYX09iamVjdDo6U2NyaXB0X1NvbV9NYW5kYXRvcnkoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBDWEZBX1ZhbGlkYXRlKiB2YWxpZGF0ZSA9CisgICAgICBUb05vZGUob2JqZWN0Xy5HZXQoKSktPkdldE9yQ3JlYXRlVmFsaWRhdGVJZlBvc3NpYmxlKCk7CisgIGlmICghdmFsaWRhdGUpCisgICAgcmV0dXJuOworCisgIGlmIChiU2V0dGluZykgeworICAgIHZhbGlkYXRlLT5TZXROdWxsVGVzdChwVmFsdWUtPlRvV2lkZVN0cmluZygpKTsKKyAgICByZXR1cm47CisgIH0KKworICBXaWRlU3RyaW5nIHN0ciA9IENYRkFfTm9kZTo6QXR0cmlidXRlRW51bVRvTmFtZSh2YWxpZGF0ZS0+R2V0TnVsbFRlc3QoKSk7CisgIHBWYWx1ZS0+U2V0U3RyaW5nKHN0ci5VVEY4RW5jb2RlKCkuQXNTdHJpbmdWaWV3KCkpOworfQorCit2b2lkIENKWF9PYmplY3Q6OlNjcmlwdF9Tb21fSW5zdGFuY2VJbmRleChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgaWYgKCFiU2V0dGluZykgeworICAgIHBWYWx1ZS0+U2V0SW50ZWdlcihTdWJmb3JtX2FuZF9TdWJmb3JtU2V0X0luc3RhbmNlSW5kZXgoKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaW50MzJfdCBpVG8gPSBwVmFsdWUtPlRvSW50ZWdlcigpOworICBpbnQzMl90IGlGcm9tID0gU3ViZm9ybV9hbmRfU3ViZm9ybVNldF9JbnN0YW5jZUluZGV4KCk7CisgIENYRkFfTm9kZSogcE1hbmFnZXJOb2RlID0gbnVsbHB0cjsKKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gVG9Ob2RlKEdldFhGQU9iamVjdCgpKS0+R2V0UHJldlNpYmxpbmcoKTsgcE5vZGU7CisgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0UHJldlNpYmxpbmcoKSkgeworICAgIGlmIChwTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6SW5zdGFuY2VNYW5hZ2VyKSB7CisgICAgICBwTWFuYWdlck5vZGUgPSBwTm9kZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoIXBNYW5hZ2VyTm9kZSkKKyAgICByZXR1cm47CisKKyAgYXV0byogbWdyID0gc3RhdGljX2Nhc3Q8Q0pYX0luc3RhbmNlTWFuYWdlcio+KHBNYW5hZ2VyTm9kZS0+SlNPYmplY3QoKSk7CisgIG1nci0+TW92ZUluc3RhbmNlKGlUbywgaUZyb20pOworICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gR2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCk7CisgIGlmICghcE5vdGlmeSkKKyAgICByZXR1cm47CisKKyAgQ1hGQV9Ob2RlKiBwVG9JbnN0YW5jZSA9IHBNYW5hZ2VyTm9kZS0+R2V0SXRlbUlmRXhpc3RzKGlUbyk7CisgIGlmIChwVG9JbnN0YW5jZSAmJiBwVG9JbnN0YW5jZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6U3ViZm9ybSkgeworICAgIHBOb3RpZnktPlJ1blN1YmZvcm1JbmRleENoYW5nZShwVG9JbnN0YW5jZSk7CisgIH0KKworICBDWEZBX05vZGUqIHBGcm9tSW5zdGFuY2UgPSBwTWFuYWdlck5vZGUtPkdldEl0ZW1JZkV4aXN0cyhpRnJvbSk7CisgIGlmIChwRnJvbUluc3RhbmNlICYmCisgICAgICBwRnJvbUluc3RhbmNlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpTdWJmb3JtKSB7CisgICAgcE5vdGlmeS0+UnVuU3ViZm9ybUluZGV4Q2hhbmdlKHBGcm9tSW5zdGFuY2UpOworICB9Cit9CisKK3ZvaWQgQ0pYX09iamVjdDo6U2NyaXB0X1N1YmZvcm1fSW5zdGFuY2VNYW5hZ2VyKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtIGVBdHRyaWJ1dGUpIHsKKyAgaWYgKGJTZXR0aW5nKSB7CisgICAgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKTsKKyAgICByZXR1cm47CisgIH0KKworICBXaWRlU3RyaW5nIHdzTmFtZSA9IEdldENEYXRhKFhGQV9BdHRyaWJ1dGU6Ok5hbWUpOworICBDWEZBX05vZGUqIHBJbnN0YW5jZU1nciA9IG51bGxwdHI7CisgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IFRvTm9kZShHZXRYRkFPYmplY3QoKSktPkdldFByZXZTaWJsaW5nKCk7IHBOb2RlOworICAgICAgIHBOb2RlID0gcE5vZGUtPkdldFByZXZTaWJsaW5nKCkpIHsKKyAgICBpZiAocE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6Okluc3RhbmNlTWFuYWdlcikgeworICAgICAgV2lkZVN0cmluZyB3c0luc3RNZ3JOYW1lID0KKyAgICAgICAgICBwTm9kZS0+SlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6TmFtZSk7CisgICAgICBpZiAod3NJbnN0TWdyTmFtZS5HZXRMZW5ndGgoKSA+PSAxICYmIHdzSW5zdE1nck5hbWVbMF0gPT0gJ18nICYmCisgICAgICAgICAgd3NJbnN0TWdyTmFtZS5SaWdodCh3c0luc3RNZ3JOYW1lLkdldExlbmd0aCgpIC0gMSkgPT0gd3NOYW1lKSB7CisgICAgICAgIHBJbnN0YW5jZU1nciA9IHBOb2RlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmICghcEluc3RhbmNlTWdyKSB7CisgICAgcFZhbHVlLT5TZXROdWxsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgcFZhbHVlLT5Bc3NpZ24oCisgICAgICBHZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBJbnN0YW5jZU1ncikpOworfQorCit2b2lkIENKWF9PYmplY3Q6OlNjcmlwdF9TdWJtaXRGb3JtYXRfTW9kZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHt9CisKK3ZvaWQgQ0pYX09iamVjdDo6U2NyaXB0X0Zvcm1fQ2hlY2tzdW0oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBpZiAoYlNldHRpbmcpIHsKKyAgICBTZXRBdHRyaWJ1dGUoWEZBX0F0dHJpYnV0ZTo6Q2hlY2tzdW0sIHBWYWx1ZS0+VG9XaWRlU3RyaW5nKCkuQXNTdHJpbmdWaWV3KCksCisgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICByZXR1cm47CisgIH0KKworICBPcHRpb25hbDxXaWRlU3RyaW5nPiBjaGVja3N1bSA9IFRyeUF0dHJpYnV0ZShYRkFfQXR0cmlidXRlOjpDaGVja3N1bSwgZmFsc2UpOworICBwVmFsdWUtPlNldFN0cmluZyhjaGVja3N1bSA/IGNoZWNrc3VtLT5VVEY4RW5jb2RlKCkuQXNTdHJpbmdWaWV3KCkgOiAiIik7Cit9CisKK3ZvaWQgQ0pYX09iamVjdDo6U2NyaXB0X0V4Y2xHcm91cF9FcnJvclRleHQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBpZiAoYlNldHRpbmcpCisgICAgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9vYmplY3QuaCBiL2Z4anMveGZhL2NqeF9vYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjUyYjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X29iamVjdC5oCkBAIC0wLDAgKzEsMjgxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX09CSkVDVF9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfT0JKRUNUX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvd2lkZXN0cmluZy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWxlbGVtZW50LmgiCisjaW5jbHVkZSAiZnhqcy9DSlhfRGVmaW5lLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9vcHRpb25hbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmFfYmFzaWMuaCIKKworY2xhc3MgQ0ZYSlNFX1ZhbHVlOworY2xhc3MgQ0pTX1Y4OworY2xhc3MgQ1hGQV9DYWxjRGF0YTsKK2NsYXNzIENYRkFfRG9jdW1lbnQ7CitjbGFzcyBDWEZBX0xheW91dEl0ZW07CitjbGFzcyBDWEZBX05vZGU7CitjbGFzcyBDWEZBX09iamVjdDsKK3N0cnVjdCBYRkFfTUFQTU9EVUxFREFUQTsKKwordHlwZWRlZiBDSlNfUmV0dXJuICgqQ0pYX01ldGhvZENhbGwpKAorICAgIENKWF9PYmplY3QqIG9iaiwKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworc3RydWN0IENKWF9NZXRob2RTcGVjIHsKKyAgY29uc3QgY2hhciogcE5hbWU7CisgIENKWF9NZXRob2RDYWxsIHBNZXRob2RDYWxsOworfTsKKwordHlwZWRlZiB2b2lkICgqUERfQ0FMTEJBQ0tfRlJFRURBVEEpKHZvaWQqIHBEYXRhKTsKK3R5cGVkZWYgdm9pZCAoKlBEX0NBTExCQUNLX0RVUExJQ0FURURBVEEpKHZvaWQqJiBwRGF0YSk7CisKK3N0cnVjdCBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPIHsKKyAgUERfQ0FMTEJBQ0tfRlJFRURBVEEgcEZyZWU7CisgIFBEX0NBTExCQUNLX0RVUExJQ0FURURBVEEgcENvcHk7Cit9OworCitlbnVtIFhGQV9TT01fTUVTU0FHRVRZUEUgeworICBYRkFfU09NX1ZhbGlkYXRpb25NZXNzYWdlLAorICBYRkFfU09NX0Zvcm1hdE1lc3NhZ2UsCisgIFhGQV9TT01fTWFuZGF0b3J5TWVzc2FnZQorfTsKKworY2xhc3MgQ0pYX09iamVjdCB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfT2JqZWN0KENYRkFfT2JqZWN0KiBvYmopOworICB2aXJ0dWFsIH5DSlhfT2JqZWN0KCk7CisKKyAgSlNfUFJPUChjbGFzc05hbWUpOworCisgIENYRkFfT2JqZWN0KiBHZXRYRkFPYmplY3QoKSB7IHJldHVybiBvYmplY3RfLkdldCgpOyB9CisgIGNvbnN0IENYRkFfT2JqZWN0KiBHZXRYRkFPYmplY3QoKSBjb25zdCB7IHJldHVybiBvYmplY3RfLkdldCgpOyB9CisKKyAgQ1hGQV9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdDsKKworICB2b2lkIFNldENhbGNSZWN1cnNpb25Db3VudChzaXplX3QgY291bnQpIHsgY2FsY19yZWN1cnNpb25fY291bnRfID0gY291bnQ7IH0KKyAgc2l6ZV90IEdldENhbGNSZWN1cnNpb25Db3VudCgpIGNvbnN0IHsgcmV0dXJuIGNhbGNfcmVjdXJzaW9uX2NvdW50XzsgfQorCisgIHZvaWQgU2V0TGF5b3V0SXRlbShDWEZBX0xheW91dEl0ZW0qIGl0ZW0pIHsgbGF5b3V0X2l0ZW1fID0gaXRlbTsgfQorICBDWEZBX0xheW91dEl0ZW0qIEdldExheW91dEl0ZW0oKSBjb25zdCB7IHJldHVybiBsYXlvdXRfaXRlbV8uR2V0KCk7IH0KKworICBib29sIEhhc01ldGhvZChjb25zdCBXaWRlU3RyaW5nJiBmdW5jKSBjb25zdDsKKyAgQ0pTX1JldHVybiBSdW5NZXRob2QoY29uc3QgV2lkZVN0cmluZyYgZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpOworCisgIGJvb2wgSGFzQXR0cmlidXRlKFhGQV9BdHRyaWJ1dGUgZUF0dHIpOworICBib29sIFNldEF0dHJpYnV0ZShYRkFfQXR0cmlidXRlIGVBdHRyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5KTsKKyAgYm9vbCBTZXRBdHRyaWJ1dGUoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzQXR0ciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzVmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgYk5vdGlmeSk7CisgIHZvaWQgUmVtb3ZlQXR0cmlidXRlKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c0F0dHIpOworICBXaWRlU3RyaW5nIEdldEF0dHJpYnV0ZShjb25zdCBXaWRlU3RyaW5nVmlldyYgYXR0cik7CisgIFdpZGVTdHJpbmcgR2V0QXR0cmlidXRlKFhGQV9BdHRyaWJ1dGUgYXR0cik7CisgIE9wdGlvbmFsPFdpZGVTdHJpbmc+IFRyeUF0dHJpYnV0ZShjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVXNlRGVmYXVsdCk7CisgIE9wdGlvbmFsPFdpZGVTdHJpbmc+IFRyeUF0dHJpYnV0ZShYRkFfQXR0cmlidXRlIGVBdHRyLCBib29sIGJVc2VEZWZhdWx0KTsKKworICBPcHRpb25hbDxXaWRlU3RyaW5nPiBUcnlDb250ZW50KGJvb2wgYlNjcmlwdE1vZGlmeSwgYm9vbCBiUHJvdG8pOworICBib29sIFNldENvbnRlbnQoY29uc3QgV2lkZVN0cmluZyYgd3NDb250ZW50LAorICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NYTUxWYWx1ZSwKKyAgICAgICAgICAgICAgICAgIGJvb2wgYk5vdGlmeSwKKyAgICAgICAgICAgICAgICAgIGJvb2wgYlNjcmlwdE1vZGlmeSwKKyAgICAgICAgICAgICAgICAgIGJvb2wgYlN5bmNEYXRhKTsKKyAgV2lkZVN0cmluZyBHZXRDb250ZW50KGJvb2wgYlNjcmlwdE1vZGlmeSk7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFQqIEdldFByb3BlcnR5KGludDMyX3QgaW5kZXgsIFhGQV9FbGVtZW50IGVUeXBlKSBjb25zdCB7CisgICAgQ1hGQV9Ob2RlKiBub2RlOworICAgIGludDMyX3QgY291bnQ7CisgICAgc3RkOjp0aWUobm9kZSwgY291bnQpID0gR2V0UHJvcGVydHlJbnRlcm5hbChpbmRleCwgZVR5cGUpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUKj4obm9kZSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFQqIEdldE9yQ3JlYXRlUHJvcGVydHkoaW50MzJfdCBpbmRleCwgWEZBX0VsZW1lbnQgZVR5cGUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KEdldE9yQ3JlYXRlUHJvcGVydHlJbnRlcm5hbChpbmRleCwgZVR5cGUpKTsKKyAgfQorCisgIHZvaWQgU2V0QXR0cmlidXRlVmFsdWUoY29uc3QgV2lkZVN0cmluZyYgd3NWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c1hNTFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk5vdGlmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTY3JpcHRNb2RpZnkpOworCisgIHZvaWQgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpOworICB2b2lkIFNjcmlwdF9BdHRyaWJ1dGVfQk9PTChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKTsKKyAgdm9pZCBTY3JpcHRfQXR0cmlidXRlX0ludGVnZXIoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSk7CisKKyAgdm9pZCBTY3JpcHRfU29tX0ZvbnRDb2xvcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSk7CisgIHZvaWQgU2NyaXB0X1NvbV9GaWxsQ29sb3IoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpOworICB2b2lkIFNjcmlwdF9Tb21fQm9yZGVyQ29sb3IoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKTsKKyAgdm9pZCBTY3JpcHRfU29tX0JvcmRlcldpZHRoKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSk7CisgIHZvaWQgU2NyaXB0X1NvbV9WYWxpZGF0aW9uTWVzc2FnZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpOworICB2b2lkIFNjcmlwdF9Tb21fTWFuZGF0b3J5TWVzc2FnZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKTsKKyAgdm9pZCBTY3JpcHRfRmllbGRfTGVuZ3RoKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSk7CisgIHZvaWQgU2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpOworICB2b2lkIFNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlX1JlYWQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKTsKKyAgdm9pZCBTY3JpcHRfU29tX0RhdGFOb2RlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSk7CisgIHZvaWQgU2NyaXB0X1NvbV9NYW5kYXRvcnkoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpOworICB2b2lkIFNjcmlwdF9Tb21fSW5zdGFuY2VJbmRleChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKTsKKyAgdm9pZCBTY3JpcHRfU29tX01lc3NhZ2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9TT01fTUVTU0FHRVRZUEUgaU1lc3NhZ2VUeXBlKTsKKyAgdm9pZCBTY3JpcHRfU3ViZm9ybV9JbnN0YW5jZU1hbmFnZXIoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtIGVBdHRyaWJ1dGUpOworICB2b2lkIFNjcmlwdF9TdWJtaXRGb3JtYXRfTW9kZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKTsKKyAgdm9pZCBTY3JpcHRfRm9ybV9DaGVja3N1bShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSk7CisgIHZvaWQgU2NyaXB0X0V4Y2xHcm91cF9FcnJvclRleHQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpOworCisgIE9wdGlvbmFsPFdpZGVTdHJpbmc+IFRyeU5hbWVzcGFjZSgpOworCisgIE9wdGlvbmFsPGludDMyX3Q+IFRyeUludGVnZXIoWEZBX0F0dHJpYnV0ZSBlQXR0ciwgYm9vbCBiVXNlRGVmYXVsdCk7CisgIGJvb2wgU2V0SW50ZWdlcihYRkFfQXR0cmlidXRlIGVBdHRyLCBpbnQzMl90IGlWYWx1ZSwgYm9vbCBiTm90aWZ5KTsKKyAgaW50MzJfdCBHZXRJbnRlZ2VyKFhGQV9BdHRyaWJ1dGUgZUF0dHIpOworCisgIE9wdGlvbmFsPFdpZGVTdHJpbmc+IFRyeUNEYXRhKFhGQV9BdHRyaWJ1dGUgZUF0dHIsIGJvb2wgYlVzZURlZmF1bHQpOworICBib29sIFNldENEYXRhKFhGQV9BdHRyaWJ1dGUgZUF0dHIsCisgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NWYWx1ZSwKKyAgICAgICAgICAgICAgICBib29sIGJOb3RpZnksCisgICAgICAgICAgICAgICAgYm9vbCBiU2NyaXB0TW9kaWZ5KTsKKyAgV2lkZVN0cmluZyBHZXRDRGF0YShYRkFfQXR0cmlidXRlIGVBdHRyKTsKKworICBPcHRpb25hbDxYRkFfQXR0cmlidXRlRW51bT4gVHJ5RW51bShYRkFfQXR0cmlidXRlIGVBdHRyLCBib29sIGJVc2VEZWZhdWx0KTsKKyAgYm9vbCBTZXRFbnVtKFhGQV9BdHRyaWJ1dGUgZUF0dHIsIFhGQV9BdHRyaWJ1dGVFbnVtIGVWYWx1ZSwgYm9vbCBiTm90aWZ5KTsKKyAgWEZBX0F0dHJpYnV0ZUVudW0gR2V0RW51bShYRkFfQXR0cmlidXRlIGVBdHRyKTsKKworICBPcHRpb25hbDxib29sPiBUcnlCb29sZWFuKFhGQV9BdHRyaWJ1dGUgZUF0dHIsIGJvb2wgYlVzZURlZmF1bHQpOworICBib29sIFNldEJvb2xlYW4oWEZBX0F0dHJpYnV0ZSBlQXR0ciwgYm9vbCBiVmFsdWUsIGJvb2wgYk5vdGlmeSk7CisgIGJvb2wgR2V0Qm9vbGVhbihYRkFfQXR0cmlidXRlIGVBdHRyKTsKKworICBPcHRpb25hbDxDWEZBX01lYXN1cmVtZW50PiBUcnlNZWFzdXJlKFhGQV9BdHRyaWJ1dGUgZUF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVXNlRGVmYXVsdCkgY29uc3Q7CisgIE9wdGlvbmFsPGZsb2F0PiBUcnlNZWFzdXJlQXNGbG9hdChYRkFfQXR0cmlidXRlIGF0dHIpIGNvbnN0OworICBib29sIFNldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZSBlQXR0ciwgQ1hGQV9NZWFzdXJlbWVudCBtVmFsdWUsIGJvb2wgYk5vdGlmeSk7CisgIENYRkFfTWVhc3VyZW1lbnQgR2V0TWVhc3VyZShYRkFfQXR0cmlidXRlIGVBdHRyKSBjb25zdDsKKworICB2b2lkIE1lcmdlQWxsRGF0YShDWEZBX09iamVjdCogcERzdE1vZHVsZSk7CisKKyAgdm9pZCBTZXRDYWxjRGF0YShzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9DYWxjRGF0YT4gZGF0YSk7CisgIENYRkFfQ2FsY0RhdGEqIEdldENhbGNEYXRhKCkgY29uc3QgeyByZXR1cm4gY2FsY19kYXRhXy5nZXQoKTsgfQorICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9DYWxjRGF0YT4gUmVsZWFzZUNhbGNEYXRhKCk7CisKKyAgaW50MzJfdCBJbnN0YW5jZU1hbmFnZXJfU2V0SW5zdGFuY2VzKGludDMyX3QgaURlc2lyZWQpOworICBpbnQzMl90IEluc3RhbmNlTWFuYWdlcl9Nb3ZlSW5zdGFuY2UoaW50MzJfdCBpVG8sIGludDMyX3QgaUZyb20pOworCisgIHZvaWQgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKSBjb25zdDsKKyAgdm9pZCBUaHJvd0FyZ3VtZW50TWlzbWF0Y2hFeGNlcHRpb24oKSBjb25zdDsKKyAgdm9pZCBUaHJvd0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKSBjb25zdDsKKyAgdm9pZCBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihjb25zdCBXaWRlU3RyaW5nJiBtZXRob2QpIGNvbnN0OworICB2b2lkIFRocm93VG9vTWFueU9jY3VyYW5jZXNFeGNlcHRpb24oY29uc3QgV2lkZVN0cmluZyYgb2JqKSBjb25zdDsKKworIHByb3RlY3RlZDoKKyAgdm9pZCBEZWZpbmVNZXRob2RzKGNvbnN0IENKWF9NZXRob2RTcGVjIG1ldGhvZF9zcGVjc1tdLCBzaXplX3QgY291bnQpOworCisgIHZvaWQgTW92ZUJ1ZmZlck1hcERhdGEoQ1hGQV9PYmplY3QqIHBTcmNNb2R1bGUsIENYRkFfT2JqZWN0KiBwRHN0TW9kdWxlKTsKKyAgdm9pZCBTZXRNYXBNb2R1bGVTdHJpbmcodm9pZCogcEtleSwgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzVmFsdWUpOworICB2b2lkIFRocm93RXhjZXB0aW9uKGNvbnN0IHdjaGFyX3QqIHN0ciwgLi4uKSBjb25zdDsKKworIHByaXZhdGU6CisgIHZvaWQgU2NyaXB0X0Jvb2xlYW5fRGVmYXVsdFZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpOworICB2b2lkIFNjcmlwdF9EcmF3X0RlZmF1bHRWYWx1ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKTsKKyAgdm9pZCBTY3JpcHRfRmllbGRfRGVmYXVsdFZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSk7CisKKyAgc3RkOjpwYWlyPENYRkFfTm9kZSosIGludDMyX3Q+IEdldFByb3BlcnR5SW50ZXJuYWwoaW50MzJfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQgZVR5cGUpIGNvbnN0OworICBDWEZBX05vZGUqIEdldE9yQ3JlYXRlUHJvcGVydHlJbnRlcm5hbChpbnQzMl90IGluZGV4LCBYRkFfRWxlbWVudCBlVHlwZSk7CisKKyAgdm9pZCBPbkNoYW5nZWQoWEZBX0F0dHJpYnV0ZSBlQXR0ciwgYm9vbCBiTm90aWZ5LCBib29sIGJTY3JpcHRNb2RpZnkpOworICB2b2lkIE9uQ2hhbmdpbmcoWEZBX0F0dHJpYnV0ZSBlQXR0ciwgYm9vbCBiTm90aWZ5KTsKKyAgYm9vbCBTZXRVc2VyRGF0YSh2b2lkKiBwS2V5LAorICAgICAgICAgICAgICAgICAgIHZvaWQqIHBEYXRhLAorICAgICAgICAgICAgICAgICAgIFhGQV9NQVBEQVRBQkxPQ0tDQUxMQkFDS0lORk8qIHBDYWxsYmFja0luZm8pOworCisgIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBYTUwgbm9kZSB0aGF0IG5lZWRzIHRvIGJlIHVwZGF0ZWQgd2l0aCB0aGUgbmV3CisgIC8vIGF0dHJpYnV0ZSB2YWx1ZS4gfG51bGxwdHJ8IGlmIG5vIHVwZGF0ZSBpcyBuZWVkZWQuCisgIENGWF9YTUxFbGVtZW50KiBTZXRWYWx1ZShYRkFfQXR0cmlidXRlIGVBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZVR5cGUgZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJOb3RpZnkpOworICBpbnQzMl90IFN1YmZvcm1fYW5kX1N1YmZvcm1TZXRfSW5zdGFuY2VJbmRleCgpOworCisgIFhGQV9NQVBNT0RVTEVEQVRBKiBDcmVhdGVNYXBNb2R1bGVEYXRhKCk7CisgIFhGQV9NQVBNT0RVTEVEQVRBKiBHZXRNYXBNb2R1bGVEYXRhKCkgY29uc3Q7CisgIHZvaWQgU2V0TWFwTW9kdWxlVmFsdWUodm9pZCogcEtleSwgdm9pZCogcFZhbHVlKTsKKyAgYm9vbCBHZXRNYXBNb2R1bGVWYWx1ZSh2b2lkKiBwS2V5LCB2b2lkKiYgcFZhbHVlKTsKKyAgYm9vbCBHZXRNYXBNb2R1bGVTdHJpbmcodm9pZCogcEtleSwgV2lkZVN0cmluZ1ZpZXcmIHdzVmFsdWUpOworICB2b2lkIFNldE1hcE1vZHVsZUJ1ZmZlcih2b2lkKiBwS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPKiBwQ2FsbGJhY2tJbmZvKTsKKyAgYm9vbCBHZXRNYXBNb2R1bGVCdWZmZXIodm9pZCogcEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZComIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJQcm90b0Fsc28pIGNvbnN0OworICBib29sIEhhc01hcE1vZHVsZUtleSh2b2lkKiBwS2V5KTsKKyAgdm9pZCBDbGVhck1hcE1vZHVsZUJ1ZmZlcigpOworICB2b2lkIFJlbW92ZU1hcE1vZHVsZUtleSh2b2lkKiBwS2V5KTsKKyAgdm9pZCBNb3ZlQnVmZmVyTWFwRGF0YShDWEZBX09iamVjdCogcERzdE1vZHVsZSk7CisKKyAgVW5vd25lZFB0cjxDWEZBX09iamVjdD4gb2JqZWN0XzsKKyAgVW5vd25lZFB0cjxDWEZBX0xheW91dEl0ZW0+IGxheW91dF9pdGVtXzsKKyAgc3RkOjp1bmlxdWVfcHRyPFhGQV9NQVBNT0RVTEVEQVRBPiBtYXBfbW9kdWxlX2RhdGFfOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9DYWxjRGF0YT4gY2FsY19kYXRhXzsKKyAgc3RkOjptYXA8Qnl0ZVN0cmluZywgQ0pYX01ldGhvZENhbGw+IG1ldGhvZF9zcGVjc187CisgIHNpemVfdCBjYWxjX3JlY3Vyc2lvbl9jb3VudF8gPSAwOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfT0JKRUNUX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfb2NjdXIuY3BwIGIvZnhqcy94ZmEvY2p4X29jY3VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTdjZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X29jY3VyLmNwcApAQCAtMCwwICsxLDU2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfb2NjdXIuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImZ4anMvY2Z4anNlX3ZhbHVlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb2NjdXIuaCIKKworQ0pYX09jY3VyOjpDSlhfT2NjdXIoQ1hGQV9PY2N1ciogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfT2NjdXI6On5DSlhfT2NjdXIoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX09jY3VyOjptYXgoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBDWEZBX09jY3VyKiBvY2N1ciA9IHN0YXRpY19jYXN0PENYRkFfT2NjdXIqPihHZXRYRkFOb2RlKCkpOworICBpZiAoIWJTZXR0aW5nKSB7CisgICAgcFZhbHVlLT5TZXRJbnRlZ2VyKG9jY3VyLT5HZXRNYXgoKSk7CisgICAgcmV0dXJuOworICB9CisgIG9jY3VyLT5TZXRNYXgocFZhbHVlLT5Ub0ludGVnZXIoKSk7Cit9CisKK3ZvaWQgQ0pYX09jY3VyOjptaW4oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBDWEZBX09jY3VyKiBvY2N1ciA9IHN0YXRpY19jYXN0PENYRkFfT2NjdXIqPihHZXRYRkFOb2RlKCkpOworICBpZiAoIWJTZXR0aW5nKSB7CisgICAgcFZhbHVlLT5TZXRJbnRlZ2VyKG9jY3VyLT5HZXRNaW4oKSk7CisgICAgcmV0dXJuOworICB9CisgIG9jY3VyLT5TZXRNaW4ocFZhbHVlLT5Ub0ludGVnZXIoKSk7Cit9CisKK3ZvaWQgQ0pYX09jY3VyOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfT2NjdXI6OmluaXRpYWwoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9PY2N1cjo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfb2NjdXIuaCBiL2Z4anMveGZhL2NqeF9vY2N1ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMTc0MjMKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfb2NjdXIuaApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX09DQ1VSX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9PQ0NVUl9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9PY2N1cjsKKworY2xhc3MgQ0pYX09jY3VyIDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9PY2N1cihDWEZBX09jY3VyKiBub2RlKTsKKyAgfkNKWF9PY2N1cigpIG92ZXJyaWRlOworCisgIEpTX1BST1AoaW5pdGlhbCk7CisgIEpTX1BST1AobWF4KTsKKyAgSlNfUFJPUChtaW4pOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9PQ0NVUl9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X29pZC5jcHAgYi9meGpzL3hmYS9janhfb2lkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzIwZjhkCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X29pZC5jcHAKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X29pZC5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb2lkLmgiCisKK0NKWF9PaWQ6OkNKWF9PaWQoQ1hGQV9PaWQqIG5vZGUpIDogQ0pYX1RleHROb2RlKG5vZGUpIHt9CisKK0NKWF9PaWQ6On5DSlhfT2lkKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9PaWQ6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX09pZDo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9vaWQuaCBiL2Z4anMveGZhL2NqeF9vaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTc4Mzg4Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X29pZC5oCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfT0lEX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9PSURfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF90ZXh0bm9kZS5oIgorCitjbGFzcyBDWEZBX09pZDsKKworY2xhc3MgQ0pYX09pZCA6IHB1YmxpYyBDSlhfVGV4dE5vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX09pZChDWEZBX09pZCogbm9kZSk7CisgIH5DSlhfT2lkKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfT0lEX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfb2lkcy5jcHAgYi9meGpzL3hmYS9janhfb2lkcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwNjk3NAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9vaWRzLmNwcApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfb2lkcy5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb2lkcy5oIgorCitDSlhfT2lkczo6Q0pYX09pZHMoQ1hGQV9PaWRzKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9PaWRzOjp+Q0pYX09pZHMoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX09pZHM6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfT2lkczo6dHlwZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9PaWRzOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfb2lkcy5oIGIvZnhqcy94ZmEvY2p4X29pZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTUxMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X29pZHMuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX09JRFNfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX09JRFNfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfT2lkczsKKworY2xhc3MgQ0pYX09pZHMgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX09pZHMoQ1hGQV9PaWRzKiBub2RlKTsKKyAgfkNKWF9PaWRzKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUCh0eXBlKTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfT0lEU19IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X29wZXJhdGlvbi5jcHAgYi9meGpzL3hmYS9janhfb3BlcmF0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjQxMmJkCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X29wZXJhdGlvbi5jcHAKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X29wZXJhdGlvbi5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3BlcmF0aW9uLmgiCisKK0NKWF9PcGVyYXRpb246OkNKWF9PcGVyYXRpb24oQ1hGQV9PcGVyYXRpb24qIG5vZGUpIDogQ0pYX1RleHROb2RlKG5vZGUpIHt9CisKK0NKWF9PcGVyYXRpb246On5DSlhfT3BlcmF0aW9uKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9PcGVyYXRpb246OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX09wZXJhdGlvbjo6b3V0cHV0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfT3BlcmF0aW9uOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9PcGVyYXRpb246OmlucHV0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfb3BlcmF0aW9uLmggYi9meGpzL3hmYS9janhfb3BlcmF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyZWE2MgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9vcGVyYXRpb24uaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX09QRVJBVElPTl9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfT1BFUkFUSU9OX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdGV4dG5vZGUuaCIKKworY2xhc3MgQ1hGQV9PcGVyYXRpb247CisKK2NsYXNzIENKWF9PcGVyYXRpb24gOiBwdWJsaWMgQ0pYX1RleHROb2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9PcGVyYXRpb24oQ1hGQV9PcGVyYXRpb24qIG5vZGUpOworICB+Q0pYX09wZXJhdGlvbigpIG92ZXJyaWRlOworCisgIEpTX1BST1AoaW5wdXQpOworICBKU19QUk9QKG91dHB1dCk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX09QRVJBVElPTl9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X292ZXJmbG93LmNwcCBiL2Z4anMveGZhL2NqeF9vdmVyZmxvdy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY1NzJkNAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9vdmVyZmxvdy5jcHAKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X292ZXJmbG93LmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vdmVyZmxvdy5oIgorCitDSlhfT3ZlcmZsb3c6OkNKWF9PdmVyZmxvdyhDWEZBX092ZXJmbG93KiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9PdmVyZmxvdzo6fkNKWF9PdmVyZmxvdygpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfT3ZlcmZsb3c6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9PdmVyZmxvdzo6dHJhaWxlcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX092ZXJmbG93Ojp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfT3ZlcmZsb3c6OnRhcmdldChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9PdmVyZmxvdzo6bGVhZGVyKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfb3ZlcmZsb3cuaCBiL2Z4anMveGZhL2NqeF9vdmVyZmxvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0Zjk0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfb3ZlcmZsb3cuaApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX09WRVJGTE9XX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9PVkVSRkxPV19IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9PdmVyZmxvdzsKKworY2xhc3MgQ0pYX092ZXJmbG93IDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9PdmVyZmxvdyhDWEZBX092ZXJmbG93KiBub2RlKTsKKyAgfkNKWF9PdmVyZmxvdygpIG92ZXJyaWRlOworCisgIEpTX1BST1AobGVhZGVyKTsKKyAgSlNfUFJPUCh0YXJnZXQpOworICBKU19QUk9QKHRyYWlsZXIpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9PVkVSRkxPV19IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3BhY2tldC5jcHAgYi9meGpzL3hmYS9janhfcGFja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGViZTYyCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3BhY2tldC5jcHAKQEAgLTAsMCArMSw5MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3BhY2tldC5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnhqcy9jZnhqc2VfdmFsdWUuaCIKKyNpbmNsdWRlICJmeGpzL2pzX3Jlc291cmNlcy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhY2tldC5oIgorCitjb25zdCBDSlhfTWV0aG9kU3BlYyBDSlhfUGFja2V0OjpNZXRob2RTcGVjc1tdID0geworICAgIHsiZ2V0QXR0cmlidXRlIiwgZ2V0QXR0cmlidXRlX3N0YXRpY30sCisgICAgeyJyZW1vdmVBdHRyaWJ1dGUiLCByZW1vdmVBdHRyaWJ1dGVfc3RhdGljfSwKKyAgICB7InNldEF0dHJpYnV0ZSIsIHNldEF0dHJpYnV0ZV9zdGF0aWN9fTsKKworQ0pYX1BhY2tldDo6Q0pYX1BhY2tldChDWEZBX1BhY2tldCogcGFja2V0KSA6IENKWF9Ob2RlKHBhY2tldCkgeworICBEZWZpbmVNZXRob2RzKE1ldGhvZFNwZWNzLCBGWF9BcnJheVNpemUoTWV0aG9kU3BlY3MpKTsKK30KKworQ0pYX1BhY2tldDo6fkNKWF9QYWNrZXQoKSB7fQorCitDSlNfUmV0dXJuIENKWF9QYWNrZXQ6OmdldEF0dHJpYnV0ZSgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgV2lkZVN0cmluZyBhdHRyaWJ1dGVWYWx1ZTsKKyAgQ0ZYX1hNTE5vZGUqIHBYTUxOb2RlID0gR2V0WEZBTm9kZSgpLT5HZXRYTUxNYXBwaW5nTm9kZSgpOworICBpZiAocFhNTE5vZGUgJiYgcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGWF9YTUxOT0RFX0VsZW1lbnQpIHsKKyAgICBhdHRyaWJ1dGVWYWx1ZSA9IHN0YXRpY19jYXN0PENGWF9YTUxFbGVtZW50Kj4ocFhNTE5vZGUpLT5HZXRTdHJpbmcoCisgICAgICAgIHJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMF0pLmNfc3RyKCkpOworICB9CisgIHJldHVybiBDSlNfUmV0dXJuKAorICAgICAgcnVudGltZS0+TmV3U3RyaW5nKGF0dHJpYnV0ZVZhbHVlLlVURjhFbmNvZGUoKS5Bc1N0cmluZ1ZpZXcoKSkpOworfQorCitDSlNfUmV0dXJuIENKWF9QYWNrZXQ6OnNldEF0dHJpYnV0ZSgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMikKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgQ0ZYX1hNTE5vZGUqIHBYTUxOb2RlID0gR2V0WEZBTm9kZSgpLT5HZXRYTUxNYXBwaW5nTm9kZSgpOworICBpZiAocFhNTE5vZGUgJiYgcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGWF9YTUxOT0RFX0VsZW1lbnQpIHsKKyAgICBzdGF0aWNfY2FzdDxDRlhfWE1MRWxlbWVudCo+KHBYTUxOb2RlKS0+U2V0U3RyaW5nKAorICAgICAgICBydW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzFdKSwgcnVudGltZS0+VG9XaWRlU3RyaW5nKHBhcmFtc1swXSkpOworICB9CisgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld051bGwoKSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX1BhY2tldDo6cmVtb3ZlQXR0cmlidXRlKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBDRlhfWE1MTm9kZSogcFhNTE5vZGUgPSBHZXRYRkFOb2RlKCktPkdldFhNTE1hcHBpbmdOb2RlKCk7CisgIGlmIChwWE1MTm9kZSAmJiBwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZYX1hNTE5PREVfRWxlbWVudCkgeworICAgIFdpZGVTdHJpbmcgbmFtZSA9IHJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMF0pOworICAgIENGWF9YTUxFbGVtZW50KiBwWE1MRWxlbWVudCA9IHN0YXRpY19jYXN0PENGWF9YTUxFbGVtZW50Kj4ocFhNTE5vZGUpOworICAgIGlmIChwWE1MRWxlbWVudC0+SGFzQXR0cmlidXRlKG5hbWUuY19zdHIoKSkpCisgICAgICBwWE1MRWxlbWVudC0+UmVtb3ZlQXR0cmlidXRlKG5hbWUuY19zdHIoKSk7CisgIH0KKyAgcmV0dXJuIENKU19SZXR1cm4ocnVudGltZS0+TmV3TnVsbCgpKTsKK30KKwordm9pZCBDSlhfUGFja2V0Ojpjb250ZW50KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIENGWF9YTUxOb2RlKiBwWE1MTm9kZSA9IEdldFhGQU5vZGUoKS0+R2V0WE1MTWFwcGluZ05vZGUoKTsKKyAgaWYgKGJTZXR0aW5nKSB7CisgICAgaWYgKHBYTUxOb2RlICYmIHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRlhfWE1MTk9ERV9FbGVtZW50KSB7CisgICAgICBDRlhfWE1MRWxlbWVudCogcFhNTEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxDRlhfWE1MRWxlbWVudCo+KHBYTUxOb2RlKTsKKyAgICAgIHBYTUxFbGVtZW50LT5TZXRUZXh0RGF0YShwVmFsdWUtPlRvV2lkZVN0cmluZygpKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgV2lkZVN0cmluZyB3c1RleHREYXRhOworICBpZiAocFhNTE5vZGUgJiYgcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGWF9YTUxOT0RFX0VsZW1lbnQpIHsKKyAgICBDRlhfWE1MRWxlbWVudCogcFhNTEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxDRlhfWE1MRWxlbWVudCo+KHBYTUxOb2RlKTsKKyAgICB3c1RleHREYXRhID0gcFhNTEVsZW1lbnQtPkdldFRleHREYXRhKCk7CisgIH0KKworICBwVmFsdWUtPlNldFN0cmluZyh3c1RleHREYXRhLlVURjhFbmNvZGUoKS5Bc1N0cmluZ1ZpZXcoKSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfcGFja2V0LmggYi9meGpzL3hmYS9janhfcGFja2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxYzE3MAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9wYWNrZXQuaApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX1BBQ0tFVF9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfUEFDS0VUX0hfCisKKyNpbmNsdWRlICJmeGpzL0NKWF9EZWZpbmUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX1BhY2tldDsKKworY2xhc3MgQ0pYX1BhY2tldCA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfUGFja2V0KENYRkFfUGFja2V0KiBwYWNrZXQpOworICB+Q0pYX1BhY2tldCgpIG92ZXJyaWRlOworCisgIEpTX01FVEhPRChnZXRBdHRyaWJ1dGUsIENKWF9QYWNrZXQpOworICBKU19NRVRIT0QocmVtb3ZlQXR0cmlidXRlLCBDSlhfUGFja2V0KTsKKyAgSlNfTUVUSE9EKHNldEF0dHJpYnV0ZSwgQ0pYX1BhY2tldCk7CisKKyAgSlNfUFJPUChjb250ZW50KTsKKworIHByaXZhdGU6CisgIHN0YXRpYyBjb25zdCBDSlhfTWV0aG9kU3BlYyBNZXRob2RTcGVjc1tdOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfUEFDS0VUX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfcGFnZWFyZWEuY3BwIGIvZnhqcy94ZmEvY2p4X3BhZ2VhcmVhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDg1ZDM4Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3BhZ2VhcmVhLmNwcApAQCAtMCwwICsxLDYxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfcGFnZWFyZWEuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2VhcmVhLmgiCisKK0NKWF9QYWdlQXJlYTo6Q0pYX1BhZ2VBcmVhKENYRkFfUGFnZUFyZWEqIG5vZGUpIDogQ0pYX0NvbnRhaW5lcihub2RlKSB7fQorCitDSlhfUGFnZUFyZWE6On5DSlhfUGFnZUFyZWEoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX1BhZ2VBcmVhOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfUGFnZUFyZWE6OnBhZ2VQb3NpdGlvbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9QYWdlQXJlYTo6b2RkT3JFdmVuKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1BhZ2VBcmVhOjpyZWxldmFudChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfUGFnZUFyZWE6OmluaXRpYWxOdW1iZXIoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9QYWdlQXJlYTo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1BhZ2VBcmVhOjpudW1iZXJlZChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfUGFnZUFyZWE6OmJsYW5rT3JOb3RCbGFuayhDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3BhZ2VhcmVhLmggYi9meGpzL3hmYS9janhfcGFnZWFyZWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTM1ZmE2Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3BhZ2VhcmVhLmgKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9QQUdFQVJFQV9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfUEFHRUFSRUFfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9jb250YWluZXIuaCIKKworY2xhc3MgQ1hGQV9QYWdlQXJlYTsKKworY2xhc3MgQ0pYX1BhZ2VBcmVhIDogcHVibGljIENKWF9Db250YWluZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1BhZ2VBcmVhKENYRkFfUGFnZUFyZWEqIG5vZGUpOworICB+Q0pYX1BhZ2VBcmVhKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChibGFua09yTm90QmxhbmspOworICBKU19QUk9QKGluaXRpYWxOdW1iZXIpOworICBKU19QUk9QKG51bWJlcmVkKTsKKyAgSlNfUFJPUChvZGRPckV2ZW4pOworICBKU19QUk9QKHBhZ2VQb3NpdGlvbik7CisgIEpTX1BST1AocmVsZXZhbnQpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9QQUdFQVJFQV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3BhZ2VzZXQuY3BwIGIvZnhqcy94ZmEvY2p4X3BhZ2VzZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYWI3OTAKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfcGFnZXNldC5jcHAKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3BhZ2VzZXQuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2VzZXQuaCIKKworQ0pYX1BhZ2VTZXQ6OkNKWF9QYWdlU2V0KENYRkFfUGFnZVNldCogbm9kZSkgOiBDSlhfQ29udGFpbmVyKG5vZGUpIHt9CisKK0NKWF9QYWdlU2V0Ojp+Q0pYX1BhZ2VTZXQoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX1BhZ2VTZXQ6OnJlbGF0aW9uKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfUGFnZVNldDo6cmVsZXZhbnQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9QYWdlU2V0Ojp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1BhZ2VTZXQ6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9wYWdlc2V0LmggYi9meGpzL3hmYS9janhfcGFnZXNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMGFiMTcKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfcGFnZXNldC5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfUEFHRVNFVF9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfUEFHRVNFVF9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2NvbnRhaW5lci5oIgorCitjbGFzcyBDWEZBX1BhZ2VTZXQ7CisKK2NsYXNzIENKWF9QYWdlU2V0IDogcHVibGljIENKWF9Db250YWluZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1BhZ2VTZXQoQ1hGQV9QYWdlU2V0KiBub2RlKTsKKyAgfkNKWF9QYWdlU2V0KCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChyZWxhdGlvbik7CisgIEpTX1BST1AocmVsZXZhbnQpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9QQUdFU0VUX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfcGFyYS5jcHAgYi9meGpzL3hmYS9janhfcGFyYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ExMmU0NwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9wYXJhLmNwcApAQCAtMCwwICsxLDk3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfcGFyYS5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFyYS5oIgorCitDSlhfUGFyYTo6Q0pYX1BhcmEoQ1hGQV9QYXJhKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9QYXJhOjp+Q0pYX1BhcmEoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX1BhcmE6OmhBbGlnbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfUGFyYTo6dGV4dEluZGVudChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9QYXJhOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1BhcmE6Om1hcmdpblJpZ2h0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfUGFyYTo6bWFyZ2luTGVmdChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9QYXJhOjpyYWRpeE9mZnNldChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1BhcmE6OnByZXNlcnZlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfUGFyYTo6c3BhY2VCZWxvdyhDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9QYXJhOjp2QWxpZ24oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1BhcmE6OnRhYkRlZmF1bHQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfUGFyYTo6dGFiU3RvcHMoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9QYXJhOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1BhcmE6OmxpbmVIZWlnaHQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfUGFyYTo6c3BhY2VBYm92ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3BhcmEuaCBiL2Z4anMveGZhL2NqeF9wYXJhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmMjg0MQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9wYXJhLmgKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9QQVJBX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9QQVJBX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX1BhcmE7CisKK2NsYXNzIENKWF9QYXJhIDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9QYXJhKENYRkFfUGFyYSogbm9kZSk7CisgIH5DSlhfUGFyYSgpIG92ZXJyaWRlOworCisgIEpTX1BST1AoaEFsaWduKTsKKyAgSlNfUFJPUChsaW5lSGVpZ2h0KTsKKyAgSlNfUFJPUChtYXJnaW5MZWZ0KTsKKyAgSlNfUFJPUChtYXJnaW5SaWdodCk7CisgIEpTX1BST1AocHJlc2VydmUpOworICBKU19QUk9QKHJhZGl4T2Zmc2V0KTsKKyAgSlNfUFJPUChzcGFjZUFib3ZlKTsKKyAgSlNfUFJPUChzcGFjZUJlbG93KTsKKyAgSlNfUFJPUCh0YWJEZWZhdWx0KTsKKyAgSlNfUFJPUCh0YWJTdG9wcyk7CisgIEpTX1BST1AodGV4dEluZGVudCk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKKyAgSlNfUFJPUCh2QWxpZ24pOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfUEFSQV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3Bhc3N3b3JkLmNwcCBiL2Z4anMveGZhL2NqeF9wYXNzd29yZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ0MzU0YgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9wYXNzd29yZC5jcHAKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3Bhc3N3b3JkLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYXNzd29yZC5oIgorCitDSlhfUGFzc3dvcmQ6OkNKWF9QYXNzd29yZChDWEZBX1Bhc3N3b3JkKiBub2RlKSA6IENKWF9UZXh0Tm9kZShub2RlKSB7fQorCitDSlhfUGFzc3dvcmQ6On5DSlhfUGFzc3dvcmQoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX1Bhc3N3b3JkOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfUGFzc3dvcmQ6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3Bhc3N3b3JkLmggYi9meGpzL3hmYS9janhfcGFzc3dvcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGU5M2NjCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3Bhc3N3b3JkLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9QQVNTV09SRF9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfUEFTU1dPUkRfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF90ZXh0bm9kZS5oIgorCitjbGFzcyBDWEZBX1Bhc3N3b3JkOworCitjbGFzcyBDSlhfUGFzc3dvcmQgOiBwdWJsaWMgQ0pYX1RleHROb2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9QYXNzd29yZChDWEZBX1Bhc3N3b3JkKiBub2RlKTsKKyAgfkNKWF9QYXNzd29yZCgpIG92ZXJyaWRlOworCisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX1BBU1NXT1JEX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfcGFzc3dvcmRlZGl0LmNwcCBiL2Z4anMveGZhL2NqeF9wYXNzd29yZGVkaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMWM1OTEKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfcGFzc3dvcmRlZGl0LmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfcGFzc3dvcmRlZGl0LmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYXNzd29yZGVkaXQuaCIKKworQ0pYX1Bhc3N3b3JkRWRpdDo6Q0pYX1Bhc3N3b3JkRWRpdChDWEZBX1Bhc3N3b3JkRWRpdCogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfUGFzc3dvcmRFZGl0Ojp+Q0pYX1Bhc3N3b3JkRWRpdCgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfUGFzc3dvcmRFZGl0Ojp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9QYXNzd29yZEVkaXQ6OnBhc3N3b3JkQ2hhcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1Bhc3N3b3JkRWRpdDo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfUGFzc3dvcmRFZGl0OjpoU2Nyb2xsUG9saWN5KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3Bhc3N3b3JkZWRpdC5oIGIvZnhqcy94ZmEvY2p4X3Bhc3N3b3JkZWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0YTVmY2IKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfcGFzc3dvcmRlZGl0LmgKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9QQVNTV09SREVESVRfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1BBU1NXT1JERURJVF9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9QYXNzd29yZEVkaXQ7CisKK2NsYXNzIENKWF9QYXNzd29yZEVkaXQgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1Bhc3N3b3JkRWRpdChDWEZBX1Bhc3N3b3JkRWRpdCogbm9kZSk7CisgIH5DSlhfUGFzc3dvcmRFZGl0KCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChoU2Nyb2xsUG9saWN5KTsKKyAgSlNfUFJPUChwYXNzd29yZENoYXIpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9QQVNTV09SREVESVRfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9wYXR0ZXJuLmNwcCBiL2Z4anMveGZhL2NqeF9wYXR0ZXJuLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWNhYTg0Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3BhdHRlcm4uY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9wYXR0ZXJuLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYXR0ZXJuLmgiCisKK0NKWF9QYXR0ZXJuOjpDSlhfUGF0dGVybihDWEZBX1BhdHRlcm4qIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX1BhdHRlcm46On5DSlhfUGF0dGVybigpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfUGF0dGVybjo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9QYXR0ZXJuOjp0eXBlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1BhdHRlcm46OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9wYXR0ZXJuLmggYi9meGpzL3hmYS9janhfcGF0dGVybi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNzU0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfcGF0dGVybi5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfUEFUVEVSTl9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfUEFUVEVSTl9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9QYXR0ZXJuOworCitjbGFzcyBDSlhfUGF0dGVybiA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfUGF0dGVybihDWEZBX1BhdHRlcm4qIG5vZGUpOworICB+Q0pYX1BhdHRlcm4oKSBvdmVycmlkZTsKKworICBKU19QUk9QKHR5cGUpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9QQVRURVJOX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfcGljdHVyZS5jcHAgYi9meGpzL3hmYS9janhfcGljdHVyZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmNWVjNAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9waWN0dXJlLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfcGljdHVyZS5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGljdHVyZS5oIgorCitDSlhfUGljdHVyZTo6Q0pYX1BpY3R1cmUoQ1hGQV9QaWN0dXJlKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9QaWN0dXJlOjp+Q0pYX1BpY3R1cmUoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX1BpY3R1cmU6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfUGljdHVyZTo6ZGVmYXVsdFZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9QaWN0dXJlOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1BpY3R1cmU6OnZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZShwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9waWN0dXJlLmggYi9meGpzL3hmYS9janhfcGljdHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NDk3YzMKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfcGljdHVyZS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfUElDVFVSRV9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfUElDVFVSRV9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9QaWN0dXJlOworCitjbGFzcyBDSlhfUGljdHVyZSA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfUGljdHVyZShDWEZBX1BpY3R1cmUqIG5vZGUpOworICB+Q0pYX1BpY3R1cmUoKSBvdmVycmlkZTsKKworICBKU19QUk9QKGRlZmF1bHRWYWx1ZSk7IC8qIHtkZWZhdWx0fSAqLworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7CisgIEpTX1BST1AodmFsdWUpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfUElDVFVSRV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3F1ZXJ5LmNwcCBiL2Z4anMveGZhL2NqeF9xdWVyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZmMjU1ZgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9xdWVyeS5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3F1ZXJ5LmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9xdWVyeS5oIgorCitDSlhfUXVlcnk6OkNKWF9RdWVyeShDWEZBX1F1ZXJ5KiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9RdWVyeTo6fkNKWF9RdWVyeSgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfUXVlcnk6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9RdWVyeTo6Y29tbWFuZFR5cGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1F1ZXJ5Ojp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9xdWVyeS5oIGIvZnhqcy94ZmEvY2p4X3F1ZXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA1N2ZhMgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9xdWVyeS5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfUVVFUllfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1FVRVJZX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX1F1ZXJ5OworCitjbGFzcyBDSlhfUXVlcnkgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1F1ZXJ5KENYRkFfUXVlcnkqIG5vZGUpOworICB+Q0pYX1F1ZXJ5KCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChjb21tYW5kVHlwZSk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX1FVRVJZX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfcmFkaWFsLmNwcCBiL2Z4anMveGZhL2NqeF9yYWRpYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOGIxYTIKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfcmFkaWFsLmNwcApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfcmFkaWFsLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9yYWRpYWwuaCIKKworQ0pYX1JhZGlhbDo6Q0pYX1JhZGlhbChDWEZBX1JhZGlhbCogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfUmFkaWFsOjp+Q0pYX1JhZGlhbCgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfUmFkaWFsOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9SYWRpYWw6OnR5cGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1JhZGlhbDo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9yYWRpYWwuaCBiL2Z4anMveGZhL2NqeF9yYWRpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDczNzk3Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3JhZGlhbC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfUkFESUFMX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9SQURJQUxfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfUmFkaWFsOworCitjbGFzcyBDSlhfUmFkaWFsIDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9SYWRpYWwoQ1hGQV9SYWRpYWwqIG5vZGUpOworICB+Q0pYX1JhZGlhbCgpIG92ZXJyaWRlOworCisgIEpTX1BST1AodHlwZSk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX1JBRElBTF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3JlYXNvbi5jcHAgYi9meGpzL3hmYS9janhfcmVhc29uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWJiNmMzCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3JlYXNvbi5jcHAKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3JlYXNvbi5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVhc29uLmgiCisKK0NKWF9SZWFzb246OkNKWF9SZWFzb24oQ1hGQV9SZWFzb24qIG5vZGUpIDogQ0pYX1RleHROb2RlKG5vZGUpIHt9CisKK0NKWF9SZWFzb246On5DSlhfUmVhc29uKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9SZWFzb246OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1JlYXNvbjo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9yZWFzb24uaCBiL2Z4anMveGZhL2NqeF9yZWFzb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjVjZWRlCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3JlYXNvbi5oCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfUkVBU09OX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9SRUFTT05fSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF90ZXh0bm9kZS5oIgorCitjbGFzcyBDWEZBX1JlYXNvbjsKKworY2xhc3MgQ0pYX1JlYXNvbiA6IHB1YmxpYyBDSlhfVGV4dE5vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1JlYXNvbihDWEZBX1JlYXNvbiogbm9kZSk7CisgIH5DSlhfUmVhc29uKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfUkVBU09OX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfcmVhc29ucy5jcHAgYi9meGpzL3hmYS9janhfcmVhc29ucy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFhOTg2OAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9yZWFzb25zLmNwcApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfcmVhc29ucy5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVhc29ucy5oIgorCitDSlhfUmVhc29uczo6Q0pYX1JlYXNvbnMoQ1hGQV9SZWFzb25zKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9SZWFzb25zOjp+Q0pYX1JlYXNvbnMoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX1JlYXNvbnM6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfUmVhc29uczo6dHlwZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9SZWFzb25zOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfcmVhc29ucy5oIGIvZnhqcy94ZmEvY2p4X3JlYXNvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWRhNjJhCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3JlYXNvbnMuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX1JFQVNPTlNfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1JFQVNPTlNfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfUmVhc29uczsKKworY2xhc3MgQ0pYX1JlYXNvbnMgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1JlYXNvbnMoQ1hGQV9SZWFzb25zKiBub2RlKTsKKyAgfkNKWF9SZWFzb25zKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUCh0eXBlKTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfUkVBU09OU19IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3JlY29yZHNldC5jcHAgYi9meGpzL3hmYS9janhfcmVjb3Jkc2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGZlMjFmCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3JlY29yZHNldC5jcHAKQEAgLTAsMCArMSw2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3JlY29yZHNldC5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVjb3Jkc2V0LmgiCisKK0NKWF9SZWNvcmRTZXQ6OkNKWF9SZWNvcmRTZXQoQ1hGQV9SZWNvcmRTZXQqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX1JlY29yZFNldDo6fkNKWF9SZWNvcmRTZXQoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX1JlY29yZFNldDo6bWF4KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfUmVjb3JkU2V0Ojp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9SZWNvcmRTZXQ6OmVvZkFjdGlvbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1JlY29yZFNldDo6Y3Vyc29yVHlwZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfUmVjb3JkU2V0Ojpsb2NrVHlwZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9SZWNvcmRTZXQ6OmJvZkFjdGlvbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1JlY29yZFNldDo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfUmVjb3JkU2V0OjpjdXJzb3JMb2NhdGlvbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3JlY29yZHNldC5oIGIvZnhqcy94ZmEvY2p4X3JlY29yZHNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMzRmNmUKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfcmVjb3Jkc2V0LmgKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9SRUNPUkRTRVRfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1JFQ09SRFNFVF9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9SZWNvcmRTZXQ7CisKK2NsYXNzIENKWF9SZWNvcmRTZXQgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1JlY29yZFNldChDWEZBX1JlY29yZFNldCogbm9kZSk7CisgIH5DSlhfUmVjb3JkU2V0KCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChib2ZBY3Rpb24pOworICBKU19QUk9QKGN1cnNvckxvY2F0aW9uKTsKKyAgSlNfUFJPUChjdXJzb3JUeXBlKTsKKyAgSlNfUFJPUChlb2ZBY3Rpb24pOworICBKU19QUk9QKGxvY2tUeXBlKTsKKyAgSlNfUFJPUChtYXgpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9SRUNPUkRTRVRfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9yZWN0YW5nbGUuY3BwIGIvZnhqcy94ZmEvY2p4X3JlY3RhbmdsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1YTI5ZgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9yZWN0YW5nbGUuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9yZWN0YW5nbGUuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3JlY3RhbmdsZS5oIgorCitDSlhfUmVjdGFuZ2xlOjpDSlhfUmVjdGFuZ2xlKENYRkFfUmVjdGFuZ2xlKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9SZWN0YW5nbGU6On5DSlhfUmVjdGFuZ2xlKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9SZWN0YW5nbGU6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1JlY3RhbmdsZTo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfUmVjdGFuZ2xlOjpoYW5kKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3JlY3RhbmdsZS5oIGIvZnhqcy94ZmEvY2p4X3JlY3RhbmdsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOGY3YTkKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfcmVjdGFuZ2xlLmgKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9SRUNUQU5HTEVfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1JFQ1RBTkdMRV9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9SZWN0YW5nbGU7CisKK2NsYXNzIENKWF9SZWN0YW5nbGUgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1JlY3RhbmdsZShDWEZBX1JlY3RhbmdsZSogbm9kZSk7CisgIH5DSlhfUmVjdGFuZ2xlKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChoYW5kKTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfUkVDVEFOR0xFX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfcmVmLmNwcCBiL2Z4anMveGZhL2NqeF9yZWYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MzA4MTUKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfcmVmLmNwcApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfcmVmLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWYuaCIKKworQ0pYX1JlZjo6Q0pYX1JlZihDWEZBX1JlZiogbm9kZSkgOiBDSlhfVGV4dE5vZGUobm9kZSkge30KKworQ0pYX1JlZjo6fkNKWF9SZWYoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX1JlZjo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfUmVmOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3JlZi5oIGIvZnhqcy94ZmEvY2p4X3JlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNjYyODIKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfcmVmLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9SRUZfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1JFRl9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3RleHRub2RlLmgiCisKK2NsYXNzIENYRkFfUmVmOworCitjbGFzcyBDSlhfUmVmIDogcHVibGljIENKWF9UZXh0Tm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfUmVmKENYRkFfUmVmKiBub2RlKTsKKyAgfkNKWF9SZWYoKSBvdmVycmlkZTsKKworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9SRUZfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9yb290ZWxlbWVudC5jcHAgYi9meGpzL3hmYS9janhfcm9vdGVsZW1lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZmJiMDAKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfcm9vdGVsZW1lbnQuY3BwCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9yb290ZWxlbWVudC5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcm9vdGVsZW1lbnQuaCIKKworQ0pYX1Jvb3RFbGVtZW50OjpDSlhfUm9vdEVsZW1lbnQoQ1hGQV9Sb290RWxlbWVudCogbm9kZSkgOiBDSlhfVGV4dE5vZGUobm9kZSkge30KKworQ0pYX1Jvb3RFbGVtZW50Ojp+Q0pYX1Jvb3RFbGVtZW50KCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9Sb290RWxlbWVudDo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1Jvb3RFbGVtZW50Ojp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9yb290ZWxlbWVudC5oIGIvZnhqcy94ZmEvY2p4X3Jvb3RlbGVtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA3OTBkZgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9yb290ZWxlbWVudC5oCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfUk9PVEVMRU1FTlRfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1JPT1RFTEVNRU5UX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdGV4dG5vZGUuaCIKKworY2xhc3MgQ1hGQV9Sb290RWxlbWVudDsKKworY2xhc3MgQ0pYX1Jvb3RFbGVtZW50IDogcHVibGljIENKWF9UZXh0Tm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfUm9vdEVsZW1lbnQoQ1hGQV9Sb290RWxlbWVudCogbm9kZSk7CisgIH5DSlhfUm9vdEVsZW1lbnQoKSBvdmVycmlkZTsKKworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9ST09URUxFTUVOVF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3NjcmlwdC5jcHAgYi9meGpzL3hmYS9janhfc2NyaXB0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDE2YzEzCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3NjcmlwdC5jcHAKQEAgLTAsMCArMSw2NiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3NjcmlwdC5oIgorCisjaW5jbHVkZSAiZnhqcy9jZnhqc2VfdmFsdWUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zY3JpcHQuaCIKKworQ0pYX1NjcmlwdDo6Q0pYX1NjcmlwdChDWEZBX1NjcmlwdCogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfU2NyaXB0Ojp+Q0pYX1NjcmlwdCgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfU2NyaXB0Ojp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9TY3JpcHQ6OmNvbnRlbnRUeXBlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1NjcmlwdDo6cnVuQXQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfU2NyaXB0OjpzdGF0ZWxlc3MoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIGlmIChiU2V0dGluZykgeworICAgIFRocm93SW52YWxpZFByb3BlcnR5RXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisgIHBWYWx1ZS0+U2V0U3RyaW5nKEZYX1VURjhFbmNvZGUoV2lkZVN0cmluZ1ZpZXcoTCIwIiwgMSkpLkFzU3RyaW5nVmlldygpKTsKK30KKwordm9pZCBDSlhfU2NyaXB0OjpkZWZhdWx0VmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9TY3JpcHQ6OmJpbmRpbmcoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1NjcmlwdDo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfU2NyaXB0Ojp2YWx1ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIGRlZmF1bHRWYWx1ZShwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9zY3JpcHQuaCBiL2Z4anMveGZhL2NqeF9zY3JpcHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDVmOTk0Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3NjcmlwdC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfU0NSSVBUX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9TQ1JJUFRfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfU2NyaXB0OworCitjbGFzcyBDSlhfU2NyaXB0IDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9TY3JpcHQoQ1hGQV9TY3JpcHQqIG5vZGUpOworICB+Q0pYX1NjcmlwdCgpIG92ZXJyaWRlOworCisgIEpTX1BST1AoZGVmYXVsdFZhbHVlKTsgLyoge2RlZmF1bHR9ICovCisgIEpTX1BST1AoYmluZGluZyk7CisgIEpTX1BST1AoY29udGVudFR5cGUpOworICBKU19QUk9QKHJ1bkF0KTsKKyAgSlNfUFJPUChzdGF0ZWxlc3MpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7CisgIEpTX1BST1AodmFsdWUpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfU0NSSVBUX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfc2VsZWN0LmNwcCBiL2Z4anMveGZhL2NqeF9zZWxlY3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxY2IyNTkKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfc2VsZWN0LmNwcApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc2VsZWN0LmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zZWxlY3QuaCIKKworQ0pYX1NlbGVjdDo6Q0pYX1NlbGVjdChDWEZBX1NlbGVjdCogbm9kZSkgOiBDSlhfVGV4dE5vZGUobm9kZSkge30KKworQ0pYX1NlbGVjdDo6fkNKWF9TZWxlY3QoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX1NlbGVjdDo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfU2VsZWN0Ojp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3NlbGVjdC5oIGIvZnhqcy94ZmEvY2p4X3NlbGVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNGMwMDMKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfc2VsZWN0LmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9TRUxFQ1RfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1NFTEVDVF9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3RleHRub2RlLmgiCisKK2NsYXNzIENYRkFfU2VsZWN0OworCitjbGFzcyBDSlhfU2VsZWN0IDogcHVibGljIENKWF9UZXh0Tm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfU2VsZWN0KENYRkFfU2VsZWN0KiBub2RlKTsKKyAgfkNKWF9TZWxlY3QoKSBvdmVycmlkZTsKKworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9TRUxFQ1RfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9zZXRwcm9wZXJ0eS5jcHAgYi9meGpzL3hmYS9janhfc2V0cHJvcGVydHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MWZjNGQKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfc2V0cHJvcGVydHkuY3BwCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zZXRwcm9wZXJ0eS5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2V0cHJvcGVydHkuaCIKKworQ0pYX1NldFByb3BlcnR5OjpDSlhfU2V0UHJvcGVydHkoQ1hGQV9TZXRQcm9wZXJ0eSogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfU2V0UHJvcGVydHk6On5DSlhfU2V0UHJvcGVydHkoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX1NldFByb3BlcnR5Ojpjb25uZWN0aW9uKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfU2V0UHJvcGVydHk6OnRhcmdldChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3NldHByb3BlcnR5LmggYi9meGpzL3hmYS9janhfc2V0cHJvcGVydHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTI5ZmVmCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3NldHByb3BlcnR5LmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9TRVRQUk9QRVJUWV9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfU0VUUFJPUEVSVFlfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfU2V0UHJvcGVydHk7CisKK2NsYXNzIENKWF9TZXRQcm9wZXJ0eSA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfU2V0UHJvcGVydHkoQ1hGQV9TZXRQcm9wZXJ0eSogbm9kZSk7CisgIH5DSlhfU2V0UHJvcGVydHkoKSBvdmVycmlkZTsKKworICBKU19QUk9QKGNvbm5lY3Rpb24pOworICBKU19QUk9QKHRhcmdldCk7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9TRVRQUk9QRVJUWV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3NpZ25hdHVyZS5jcHAgYi9meGpzL3hmYS9janhfc2lnbmF0dXJlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTJkOWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3NpZ25hdHVyZS5jcHAKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3NpZ25hdHVyZS5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2lnbmF0dXJlLmgiCisKK0NKWF9TaWduYXR1cmU6OkNKWF9TaWduYXR1cmUoQ1hGQV9TaWduYXR1cmUqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX1NpZ25hdHVyZTo6fkNKWF9TaWduYXR1cmUoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX1NpZ25hdHVyZTo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfU2lnbmF0dXJlOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3NpZ25hdHVyZS5oIGIvZnhqcy94ZmEvY2p4X3NpZ25hdHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZDBiMWEKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfc2lnbmF0dXJlLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9TSUdOQVRVUkVfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1NJR05BVFVSRV9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9TaWduYXR1cmU7CisKK2NsYXNzIENKWF9TaWduYXR1cmUgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1NpZ25hdHVyZShDWEZBX1NpZ25hdHVyZSogbm9kZSk7CisgIH5DSlhfU2lnbmF0dXJlKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfU0lHTkFUVVJFX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfc2lnbmF0dXJlcHJvcGVydGllcy5jcHAgYi9meGpzL3hmYS9janhfc2lnbmF0dXJlcHJvcGVydGllcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYyZTdhNwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9zaWduYXR1cmVwcm9wZXJ0aWVzLmNwcApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc2lnbmF0dXJlcHJvcGVydGllcy5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2lnbmF0dXJlcHJvcGVydGllcy5oIgorCitDSlhfU2lnbmF0dXJlUHJvcGVydGllczo6Q0pYX1NpZ25hdHVyZVByb3BlcnRpZXMoQ1hGQV9TaWduYXR1cmVQcm9wZXJ0aWVzKiBub2RlKQorICAgIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX1NpZ25hdHVyZVByb3BlcnRpZXM6On5DSlhfU2lnbmF0dXJlUHJvcGVydGllcygpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfU2lnbmF0dXJlUHJvcGVydGllczo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9TaWduYXR1cmVQcm9wZXJ0aWVzOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfc2lnbmF0dXJlcHJvcGVydGllcy5oIGIvZnhqcy94ZmEvY2p4X3NpZ25hdHVyZXByb3BlcnRpZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmQ0N2EzCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3NpZ25hdHVyZXByb3BlcnRpZXMuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX1NJR05BVFVSRVBST1BFUlRJRVNfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1NJR05BVFVSRVBST1BFUlRJRVNfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfU2lnbmF0dXJlUHJvcGVydGllczsKKworLyogRGVwcmVjYXRlZCAqLworY2xhc3MgQ0pYX1NpZ25hdHVyZVByb3BlcnRpZXMgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1NpZ25hdHVyZVByb3BlcnRpZXMoQ1hGQV9TaWduYXR1cmVQcm9wZXJ0aWVzKiBub2RlKTsKKyAgfkNKWF9TaWduYXR1cmVQcm9wZXJ0aWVzKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfU0lHTkFUVVJFUFJPUEVSVElFU19IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3NpZ25hdHVyZXBzZXVkb21vZGVsLmNwcCBiL2Z4anMveGZhL2NqeF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAyNTMyYwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5jcHAKQEAgLTAsMCArMSw1OSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3NpZ25hdHVyZXBzZXVkb21vZGVsLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV92YWx1ZS5oIgorI2luY2x1ZGUgImZ4anMvanNfcmVzb3VyY2VzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfc2lnbmF0dXJlcHNldWRvbW9kZWwuaCIKKworY29uc3QgQ0pYX01ldGhvZFNwZWMgQ0pYX1NpZ25hdHVyZVBzZXVkb01vZGVsOjpNZXRob2RTcGVjc1tdID0geworICAgIHsidmVyaWZ5IiwgdmVyaWZ5U2lnbmF0dXJlX3N0YXRpY30sCisgICAgeyJzaWduIiwgc2lnbl9zdGF0aWN9LAorICAgIHsiZW51bWVyYXRlIiwgZW51bWVyYXRlX3N0YXRpY30sCisgICAgeyJjbGVhciIsIGNsZWFyX3N0YXRpY319OworCitDSlhfU2lnbmF0dXJlUHNldWRvTW9kZWw6OkNKWF9TaWduYXR1cmVQc2V1ZG9Nb2RlbCgKKyAgICBDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsKiBtb2RlbCkKKyAgICA6IENKWF9PYmplY3QobW9kZWwpIHsKKyAgRGVmaW5lTWV0aG9kcyhNZXRob2RTcGVjcywgRlhfQXJyYXlTaXplKE1ldGhvZFNwZWNzKSk7Cit9CisKK0NKWF9TaWduYXR1cmVQc2V1ZG9Nb2RlbDo6fkNKWF9TaWduYXR1cmVQc2V1ZG9Nb2RlbCgpIHt9CisKK0NKU19SZXR1cm4gQ0pYX1NpZ25hdHVyZVBzZXVkb01vZGVsOjp2ZXJpZnlTaWduYXR1cmUoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuZW1wdHkoKSB8fCBwYXJhbXMuc2l6ZSgpID4gNCkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld051bWJlcigwKSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX1NpZ25hdHVyZVBzZXVkb01vZGVsOjpzaWduKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSA8IDMgfHwgcGFyYW1zLnNpemUoKSA+IDcpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdCb29sZWFuKGZhbHNlKSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX1NpZ25hdHVyZVBzZXVkb01vZGVsOjplbnVtZXJhdGUoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmICghcGFyYW1zLmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfU2lnbmF0dXJlUHNldWRvTW9kZWw6OmNsZWFyKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLmVtcHR5KCkgfHwgcGFyYW1zLnNpemUoKSA+IDIpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdCb29sZWFuKGZhbHNlKSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfc2lnbmF0dXJlcHNldWRvbW9kZWwuaCBiL2Z4anMveGZhL2NqeF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZjkwZmIKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfc2lnbmF0dXJlcHNldWRvbW9kZWwuaApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX1NJR05BVFVSRVBTRVVET01PREVMX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9TSUdOQVRVUkVQU0VVRE9NT0RFTF9IXworCisjaW5jbHVkZSAiZnhqcy9DSlhfRGVmaW5lLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X29iamVjdC5oIgorCitjbGFzcyBDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOworCitjbGFzcyBDSlhfU2lnbmF0dXJlUHNldWRvTW9kZWwgOiBwdWJsaWMgQ0pYX09iamVjdCB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfU2lnbmF0dXJlUHNldWRvTW9kZWwoQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbCogbW9kZWwpOworICB+Q0pYX1NpZ25hdHVyZVBzZXVkb01vZGVsKCkgb3ZlcnJpZGU7CisKKyAgSlNfTUVUSE9EKHZlcmlmeVNpZ25hdHVyZSAvKnZlcmlmeSovLCBDSlhfU2lnbmF0dXJlUHNldWRvTW9kZWwpOworICBKU19NRVRIT0Qoc2lnbiwgQ0pYX1NpZ25hdHVyZVBzZXVkb01vZGVsKTsKKyAgSlNfTUVUSE9EKGVudW1lcmF0ZSwgQ0pYX1NpZ25hdHVyZVBzZXVkb01vZGVsKTsKKyAgSlNfTUVUSE9EKGNsZWFyLCBDSlhfU2lnbmF0dXJlUHNldWRvTW9kZWwpOworCisgcHJpdmF0ZToKKyAgc3RhdGljIGNvbnN0IENKWF9NZXRob2RTcGVjIE1ldGhvZFNwZWNzW107Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9TSUdOQVRVUkVQU0VVRE9NT0RFTF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3NpZ25kYXRhLmNwcCBiL2Z4anMveGZhL2NqeF9zaWduZGF0YS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNhNzQzMAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9zaWduZGF0YS5jcHAKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3NpZ25kYXRhLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaWduZGF0YS5oIgorCitDSlhfU2lnbkRhdGE6OkNKWF9TaWduRGF0YShDWEZBX1NpZ25EYXRhKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9TaWduRGF0YTo6fkNKWF9TaWduRGF0YSgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfU2lnbkRhdGE6OnJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9TaWduRGF0YTo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1NpZ25EYXRhOjpvcGVyYXRpb24oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfU2lnbkRhdGE6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9TaWduRGF0YTo6dGFyZ2V0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfc2lnbmRhdGEuaCBiL2Z4anMveGZhL2NqeF9zaWduZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOWIxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfc2lnbmRhdGEuaApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX1NJR05EQVRBX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9TSUdOREFUQV9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9TaWduRGF0YTsKKworY2xhc3MgQ0pYX1NpZ25EYXRhIDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9TaWduRGF0YShDWEZBX1NpZ25EYXRhKiBub2RlKTsKKyAgfkNKWF9TaWduRGF0YSgpIG92ZXJyaWRlOworCisgIEpTX1BST1Aob3BlcmF0aW9uKTsKKyAgSlNfUFJPUChyZWYpOworICBKU19QUk9QKHRhcmdldCk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX1NJR05EQVRBX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfc2lnbmluZy5jcHAgYi9meGpzL3hmYS9janhfc2lnbmluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc4ZjcyNQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9zaWduaW5nLmNwcApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc2lnbmluZy5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2lnbmluZy5oIgorCitDSlhfU2lnbmluZzo6Q0pYX1NpZ25pbmcoQ1hGQV9TaWduaW5nKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9TaWduaW5nOjp+Q0pYX1NpZ25pbmcoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX1NpZ25pbmc6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfU2lnbmluZzo6dHlwZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9TaWduaW5nOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfc2lnbmluZy5oIGIvZnhqcy94ZmEvY2p4X3NpZ25pbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjM1NTA5Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3NpZ25pbmcuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX1NJR05JTkdfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1NJR05JTkdfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfU2lnbmluZzsKKworY2xhc3MgQ0pYX1NpZ25pbmcgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1NpZ25pbmcoQ1hGQV9TaWduaW5nKiBub2RlKTsKKyAgfkNKWF9TaWduaW5nKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUCh0eXBlKTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfU0lHTklOR19IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3NvYXBhY3Rpb24uY3BwIGIvZnhqcy94ZmEvY2p4X3NvYXBhY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NGQyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfc29hcGFjdGlvbi5jcHAKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3NvYXBhY3Rpb24uaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NvYXBhY3Rpb24uaCIKKworQ0pYX1NvYXBBY3Rpb246OkNKWF9Tb2FwQWN0aW9uKENYRkFfU29hcEFjdGlvbiogbm9kZSkgOiBDSlhfVGV4dE5vZGUobm9kZSkge30KKworQ0pYX1NvYXBBY3Rpb246On5DSlhfU29hcEFjdGlvbigpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfU29hcEFjdGlvbjo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Tb2FwQWN0aW9uOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfc29hcGFjdGlvbi5oIGIvZnhqcy94ZmEvY2p4X3NvYXBhY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmM5MGU0Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3NvYXBhY3Rpb24uaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX1NPQVBBQ1RJT05fSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1NPQVBBQ1RJT05fSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF90ZXh0bm9kZS5oIgorCitjbGFzcyBDWEZBX1NvYXBBY3Rpb247CisKK2NsYXNzIENKWF9Tb2FwQWN0aW9uIDogcHVibGljIENKWF9UZXh0Tm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfU29hcEFjdGlvbihDWEZBX1NvYXBBY3Rpb24qIG5vZGUpOworICB+Q0pYX1NvYXBBY3Rpb24oKSBvdmVycmlkZTsKKworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9TT0FQQUNUSU9OX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfc29hcGFkZHJlc3MuY3BwIGIvZnhqcy94ZmEvY2p4X3NvYXBhZGRyZXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTdlODRjCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3NvYXBhZGRyZXNzLmNwcApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc29hcGFkZHJlc3MuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NvYXBhZGRyZXNzLmgiCisKK0NKWF9Tb2FwQWRkcmVzczo6Q0pYX1NvYXBBZGRyZXNzKENYRkFfU29hcEFkZHJlc3MqIG5vZGUpIDogQ0pYX1RleHROb2RlKG5vZGUpIHt9CisKK0NKWF9Tb2FwQWRkcmVzczo6fkNKWF9Tb2FwQWRkcmVzcygpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfU29hcEFkZHJlc3M6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Tb2FwQWRkcmVzczo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfc29hcGFkZHJlc3MuaCBiL2Z4anMveGZhL2NqeF9zb2FwYWRkcmVzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNmUwMDQKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfc29hcGFkZHJlc3MuaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX1NPQVBBRERSRVNTX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9TT0FQQUREUkVTU19IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3RleHRub2RlLmgiCisKK2NsYXNzIENYRkFfU29hcEFkZHJlc3M7CisKK2NsYXNzIENKWF9Tb2FwQWRkcmVzcyA6IHB1YmxpYyBDSlhfVGV4dE5vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1NvYXBBZGRyZXNzKENYRkFfU29hcEFkZHJlc3MqIG5vZGUpOworICB+Q0pYX1NvYXBBZGRyZXNzKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfU09BUEFERFJFU1NfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9zb2xpZC5jcHAgYi9meGpzL3hmYS9janhfc29saWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OTIxNTMKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfc29saWQuY3BwCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zb2xpZC5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc29saWQuaCIKKworQ0pYX1NvbGlkOjpDSlhfU29saWQoQ1hGQV9Tb2xpZCogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfU29saWQ6On5DSlhfU29saWQoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX1NvbGlkOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfU29saWQ6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3NvbGlkLmggYi9meGpzL3hmYS9janhfc29saWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjhkZDVlCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3NvbGlkLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9TT0xJRF9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfU09MSURfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfU29saWQ7CisKK2NsYXNzIENKWF9Tb2xpZCA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfU29saWQoQ1hGQV9Tb2xpZCogbm9kZSk7CisgIH5DSlhfU29saWQoKSBvdmVycmlkZTsKKworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9TT0xJRF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3NvdXJjZS5jcHAgYi9meGpzL3hmYS9janhfc291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTlhNmMzCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3NvdXJjZS5jcHAKQEAgLTAsMCArMSwxNzkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zb3VyY2UuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImZ4anMvY2Z4anNlX3ZhbHVlLmgiCisjaW5jbHVkZSAiZnhqcy9qc19yZXNvdXJjZXMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zb3VyY2UuaCIKKworY29uc3QgQ0pYX01ldGhvZFNwZWMgQ0pYX1NvdXJjZTo6TWV0aG9kU3BlY3NbXSA9IHsKKyAgICB7ImFkZE5ldyIsIGFkZE5ld19zdGF0aWN9LAorICAgIHsiY2FuY2VsIiwgY2FuY2VsX3N0YXRpY30sCisgICAgeyJjYW5jZWxCYXRjaCIsIGNhbmNlbEJhdGNoX3N0YXRpY30sCisgICAgeyJjbG9zZSIsIGNsb3NlX3N0YXRpY30sCisgICAgeyJkZWxldGUiLCBkZWxldGVJdGVtX3N0YXRpY30sCisgICAgeyJmaXJzdCIsIGZpcnN0X3N0YXRpY30sCisgICAgeyJoYXNEYXRhQ2hhbmdlZCIsIGhhc0RhdGFDaGFuZ2VkX3N0YXRpY30sCisgICAgeyJpc0JPRiIsIGlzQk9GX3N0YXRpY30sCisgICAgeyJpc0VPRiIsIGlzRU9GX3N0YXRpY30sCisgICAgeyJsYXN0IiwgbGFzdF9zdGF0aWN9LAorICAgIHsibmV4dCIsIG5leHRfc3RhdGljfSwKKyAgICB7Im9wZW4iLCBvcGVuX3N0YXRpY30sCisgICAgeyJwcmV2aW91cyIsIHByZXZpb3VzX3N0YXRpY30sCisgICAgeyJyZXF1ZXJ5IiwgcmVxdWVyeV9zdGF0aWN9LAorICAgIHsicmVzeW5jIiwgcmVzeW5jX3N0YXRpY30sCisgICAgeyJ1cGRhdGUiLCB1cGRhdGVfc3RhdGljfSwKKyAgICB7InVwZGF0ZUJhdGNoIiwgdXBkYXRlQmF0Y2hfc3RhdGljfX07CisKK0NKWF9Tb3VyY2U6OkNKWF9Tb3VyY2UoQ1hGQV9Tb3VyY2UqIHNyYykgOiBDSlhfTm9kZShzcmMpIHsKKyAgRGVmaW5lTWV0aG9kcyhNZXRob2RTcGVjcywgRlhfQXJyYXlTaXplKE1ldGhvZFNwZWNzKSk7Cit9CisKK0NKWF9Tb3VyY2U6On5DSlhfU291cmNlKCkge30KKworQ0pTX1JldHVybiBDSlhfU291cmNlOjpuZXh0KENKU19WOCogcnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIXBhcmFtcy5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX1NvdXJjZTo6Y2FuY2VsQmF0Y2goCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmICghcGFyYW1zLmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfU291cmNlOjpmaXJzdChDSlNfVjgqIHJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmICghcGFyYW1zLmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfU291cmNlOjp1cGRhdGVCYXRjaCgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKCFwYXJhbXMuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIENKWF9Tb3VyY2U6OnByZXZpb3VzKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIXBhcmFtcy5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX1NvdXJjZTo6aXNCT0YoQ0pTX1Y4KiBydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIXBhcmFtcy5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX1NvdXJjZTo6aXNFT0YoQ0pTX1Y4KiBydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIXBhcmFtcy5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX1NvdXJjZTo6Y2FuY2VsKENKU19WOCogcnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmICghcGFyYW1zLmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfU291cmNlOjp1cGRhdGUoQ0pTX1Y4KiBydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKCFwYXJhbXMuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIENKWF9Tb3VyY2U6Om9wZW4oQ0pTX1Y4KiBydW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmICghcGFyYW1zLmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfU291cmNlOjpkZWxldGVJdGVtKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIXBhcmFtcy5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX1NvdXJjZTo6YWRkTmV3KENKU19WOCogcnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmICghcGFyYW1zLmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfU291cmNlOjpyZXF1ZXJ5KAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIXBhcmFtcy5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX1NvdXJjZTo6cmVzeW5jKENKU19WOCogcnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmICghcGFyYW1zLmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfU291cmNlOjpjbG9zZShDSlNfVjgqIHJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmICghcGFyYW1zLmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfU291cmNlOjpsYXN0KENKU19WOCogcnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIXBhcmFtcy5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX1NvdXJjZTo6aGFzRGF0YUNoYW5nZWQoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmICghcGFyYW1zLmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKwordm9pZCBDSlhfU291cmNlOjpkYihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7fQorCit2b2lkIENKWF9Tb3VyY2U6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1NvdXJjZTo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9zb3VyY2UuaCBiL2Z4anMveGZhL2NqeF9zb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTg0OTEyCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3NvdXJjZS5oCkBAIC0wLDAgKzEsNDYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfU09VUkNFX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9TT1VSQ0VfSF8KKworI2luY2x1ZGUgImZ4anMvQ0pYX0RlZmluZS5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfU291cmNlOworCitjbGFzcyBDSlhfU291cmNlIDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9Tb3VyY2UoQ1hGQV9Tb3VyY2UqIHNyYyk7CisgIH5DSlhfU291cmNlKCkgb3ZlcnJpZGU7CisKKyAgSlNfTUVUSE9EKGFkZE5ldywgQ0pYX1NvdXJjZSk7CisgIEpTX01FVEhPRChjYW5jZWwsIENKWF9Tb3VyY2UpOworICBKU19NRVRIT0QoY2FuY2VsQmF0Y2gsIENKWF9Tb3VyY2UpOworICBKU19NRVRIT0QoY2xvc2UsIENKWF9Tb3VyY2UpOworICBKU19NRVRIT0QoZGVsZXRlSXRlbSAvKmRlbGV0ZSovLCBDSlhfU291cmNlKTsKKyAgSlNfTUVUSE9EKGZpcnN0LCBDSlhfU291cmNlKTsKKyAgSlNfTUVUSE9EKGhhc0RhdGFDaGFuZ2VkLCBDSlhfU291cmNlKTsKKyAgSlNfTUVUSE9EKGlzQk9GLCBDSlhfU291cmNlKTsKKyAgSlNfTUVUSE9EKGlzRU9GLCBDSlhfU291cmNlKTsKKyAgSlNfTUVUSE9EKGxhc3QsIENKWF9Tb3VyY2UpOworICBKU19NRVRIT0QobmV4dCwgQ0pYX1NvdXJjZSk7CisgIEpTX01FVEhPRChvcGVuLCBDSlhfU291cmNlKTsKKyAgSlNfTUVUSE9EKHByZXZpb3VzLCBDSlhfU291cmNlKTsKKyAgSlNfTUVUSE9EKHJlcXVlcnksIENKWF9Tb3VyY2UpOworICBKU19NRVRIT0QocmVzeW5jLCBDSlhfU291cmNlKTsKKyAgSlNfTUVUSE9EKHVwZGF0ZSwgQ0pYX1NvdXJjZSk7CisgIEpTX01FVEhPRCh1cGRhdGVCYXRjaCwgQ0pYX1NvdXJjZSk7CisKKyAgSlNfUFJPUChkYik7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKKworIHByaXZhdGU6CisgIHN0YXRpYyBjb25zdCBDSlhfTWV0aG9kU3BlYyBNZXRob2RTcGVjc1tdOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfc291cmNlc2V0LmNwcCBiL2Z4anMveGZhL2NqeF9zb3VyY2VzZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZmFiZGUKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfc291cmNlc2V0LmNwcApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc291cmNlc2V0LmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zb3VyY2VzZXQuaCIKKworQ0pYX1NvdXJjZVNldDo6Q0pYX1NvdXJjZVNldChDWEZBX1NvdXJjZVNldCogbm9kZSkgOiBDSlhfTW9kZWwobm9kZSkge30KKworQ0pYX1NvdXJjZVNldDo6fkNKWF9Tb3VyY2VTZXQoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX1NvdXJjZVNldDo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfU291cmNlU2V0Ojp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3NvdXJjZXNldC5oIGIvZnhqcy94ZmEvY2p4X3NvdXJjZXNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNGFjNjgKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfc291cmNlc2V0LmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9TT1VSQ0VTRVRfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1NPVVJDRVNFVF9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X21vZGVsLmgiCisKK2NsYXNzIENYRkFfU291cmNlU2V0OworCitjbGFzcyBDSlhfU291cmNlU2V0IDogcHVibGljIENKWF9Nb2RlbCB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfU291cmNlU2V0KENYRkFfU291cmNlU2V0KiBub2RlKTsKKyAgfkNKWF9Tb3VyY2VTZXQoKSBvdmVycmlkZTsKKworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9TT1VSQ0VTRVRfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9zcGVhay5jcHAgYi9meGpzL3hmYS9janhfc3BlYWsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MWIyNDUKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfc3BlYWsuY3BwCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zcGVhay5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3BlYWsuaCIKKworQ0pYX1NwZWFrOjpDSlhfU3BlYWsoQ1hGQV9TcGVhayogbm9kZSkgOiBDSlhfVGV4dE5vZGUobm9kZSkge30KKworQ0pYX1NwZWFrOjp+Q0pYX1NwZWFrKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9TcGVhazo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1NwZWFrOjpwcmlvcml0eShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfU3BlYWs6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9TcGVhazo6ZGlzYWJsZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfc3BlYWsuaCBiL2Z4anMveGZhL2NqeF9zcGVhay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OTgxMDUKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfc3BlYWsuaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX1NQRUFLX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9TUEVBS19IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3RleHRub2RlLmgiCisKK2NsYXNzIENYRkFfU3BlYWs7CisKK2NsYXNzIENKWF9TcGVhayA6IHB1YmxpYyBDSlhfVGV4dE5vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1NwZWFrKENYRkFfU3BlYWsqIG5vZGUpOworICB+Q0pYX1NwZWFrKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChkaXNhYmxlKTsKKyAgSlNfUFJPUChwcmlvcml0eSk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX1NQRUFLX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfc3RpcHBsZS5jcHAgYi9meGpzL3hmYS9janhfc3RpcHBsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1MjBjOQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9zdGlwcGxlLmNwcApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc3RpcHBsZS5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3RpcHBsZS5oIgorCitDSlhfU3RpcHBsZTo6Q0pYX1N0aXBwbGUoQ1hGQV9TdGlwcGxlKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9TdGlwcGxlOjp+Q0pYX1N0aXBwbGUoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX1N0aXBwbGU6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfU3RpcHBsZTo6cmF0ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9TdGlwcGxlOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfc3RpcHBsZS5oIGIvZnhqcy94ZmEvY2p4X3N0aXBwbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGRkZDgzCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3N0aXBwbGUuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX1NUSVBQTEVfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1NUSVBQTEVfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfU3RpcHBsZTsKKworY2xhc3MgQ0pYX1N0aXBwbGUgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1N0aXBwbGUoQ1hGQV9TdGlwcGxlKiBub2RlKTsKKyAgfkNKWF9TdGlwcGxlKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChyYXRlKTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfU1RJUFBMRV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3N1YmZvcm0uY3BwIGIvZnhqcy94ZmEvY2p4X3N1YmZvcm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0N2Q2NmQKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfc3ViZm9ybS5jcHAKQEAgLTAsMCArMSwyMjkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zdWJmb3JtLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV92YWx1ZS5oIgorI2luY2x1ZGUgImZ4anMvanNfcmVzb3VyY2VzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9ldmVudHBhcmFtLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZm5vdGlmeS5oIgorI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmEuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWx0YS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCisKK2NvbnN0IENKWF9NZXRob2RTcGVjIENKWF9TdWJmb3JtOjpNZXRob2RTcGVjc1tdID0geworICAgIHsiZXhlY0NhbGN1bGF0ZSIsIGV4ZWNDYWxjdWxhdGVfc3RhdGljfSwKKyAgICB7ImV4ZWNFdmVudCIsIGV4ZWNFdmVudF9zdGF0aWN9LAorICAgIHsiZXhlY0luaXRpYWxpemUiLCBleGVjSW5pdGlhbGl6ZV9zdGF0aWN9LAorICAgIHsiZXhlY1ZhbGlkYXRlIiwgZXhlY1ZhbGlkYXRlX3N0YXRpY319OworCitDSlhfU3ViZm9ybTo6Q0pYX1N1YmZvcm0oQ1hGQV9Ob2RlKiBub2RlKSA6IENKWF9Db250YWluZXIobm9kZSkgeworICBEZWZpbmVNZXRob2RzKE1ldGhvZFNwZWNzLCBGWF9BcnJheVNpemUoTWV0aG9kU3BlY3MpKTsKK30KKworQ0pYX1N1YmZvcm06On5DSlhfU3ViZm9ybSgpIHt9CisKK0NKU19SZXR1cm4gQ0pYX1N1YmZvcm06OmV4ZWNFdmVudCgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisKKyAgZXhlY1NpbmdsZUV2ZW50QnlOYW1lKHJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMF0pLkFzU3RyaW5nVmlldygpLAorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlN1YmZvcm0pOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfU3ViZm9ybTo6ZXhlY0luaXRpYWxpemUoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmICghcGFyYW1zLmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBHZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKKyAgaWYgKHBOb3RpZnkpCisgICAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QoR2V0WEZBTm9kZSgpLCBYRkFfRVZFTlRfSW5pdGlhbGl6ZSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIENKWF9TdWJmb3JtOjpleGVjQ2FsY3VsYXRlKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIXBhcmFtcy5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gR2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCk7CisgIGlmIChwTm90aWZ5KQorICAgIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KEdldFhGQU5vZGUoKSwgWEZBX0VWRU5UX0NhbGN1bGF0ZSk7CisgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworfQorCitDSlNfUmV0dXJuIENKWF9TdWJmb3JtOjpleGVjVmFsaWRhdGUoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmICghcGFyYW1zLmVtcHR5KCkpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBHZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKKyAgaWYgKCFwTm90aWZ5KQorICAgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld0Jvb2xlYW4oZmFsc2UpKTsKKworICBpbnQzMl90IGlSZXQgPQorICAgICAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QoR2V0WEZBTm9kZSgpLCBYRkFfRVZFTlRfVmFsaWRhdGUpOworICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdCb29sZWFuKGlSZXQgIT0gWEZBX0VWRU5URVJST1JfRXJyb3IpKTsKK30KKwordm9pZCBDSlhfU3ViZm9ybTo6bG9jYWxlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIGlmIChiU2V0dGluZykgeworICAgIFNldENEYXRhKFhGQV9BdHRyaWJ1dGU6OkxvY2FsZSwgcFZhbHVlLT5Ub1dpZGVTdHJpbmcoKSwgdHJ1ZSwgdHJ1ZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgV2lkZVN0cmluZyB3c0xvY2FsZU5hbWUgPSBHZXRYRkFOb2RlKCktPkdldExvY2FsZU5hbWUoKS52YWx1ZV9vcihMIiIpOworICBwVmFsdWUtPlNldFN0cmluZyh3c0xvY2FsZU5hbWUuVVRGOEVuY29kZSgpLkFzU3RyaW5nVmlldygpKTsKK30KKwordm9pZCBDSlhfU3ViZm9ybTo6aW5zdGFuY2VJbmRleChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9Tb21fSW5zdGFuY2VJbmRleChwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfU3ViZm9ybTo6YWxsb3dNYWNybyhDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9TdWJmb3JtOjphbmNob3JUeXBlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1N1YmZvcm06OmNvbFNwYW4oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfU3ViZm9ybTo6Y29sdW1uV2lkdGhzKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9TdWJmb3JtOjpoKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1N1YmZvcm06OmhBbGlnbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfU3ViZm9ybTo6bGF5b3V0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9TdWJmb3JtOjptYXhIKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1N1YmZvcm06Om1heFcoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfU3ViZm9ybTo6bWluSChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9TdWJmb3JtOjptaW5XKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1N1YmZvcm06OnByZXNlbmNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfU3ViZm9ybTo6cmVsZXZhbnQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9TdWJmb3JtOjpyZXN0b3JlU3RhdGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1N1YmZvcm06OnNjb3BlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfU3ViZm9ybTo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9TdWJmb3JtOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1N1YmZvcm06OnZhbGlkYXRpb25NZXNzYWdlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfU29tX1ZhbGlkYXRpb25NZXNzYWdlKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9TdWJmb3JtOjp2QWxpZ24oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1N1YmZvcm06OncoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfU3ViZm9ybTo6eChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9TdWJmb3JtOjp5KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfc3ViZm9ybS5oIGIvZnhqcy94ZmEvY2p4X3N1YmZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWM1MzViCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3N1YmZvcm0uaApAQCAtMCwwICsxLDU0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX1NVQkZPUk1fSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1NVQkZPUk1fSF8KKworI2luY2x1ZGUgImZ4anMvQ0pYX0RlZmluZS5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9jb250YWluZXIuaCIKKworY2xhc3MgQ1hGQV9EZWx0YTsKKworY2xhc3MgQ0pYX1N1YmZvcm0gOiBwdWJsaWMgQ0pYX0NvbnRhaW5lciB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfU3ViZm9ybShDWEZBX05vZGUqIGNvbnRhaW5lcik7CisgIH5DSlhfU3ViZm9ybSgpIG92ZXJyaWRlOworCisgIEpTX01FVEhPRChleGVjQ2FsY3VsYXRlLCBDSlhfU3ViZm9ybSk7CisgIEpTX01FVEhPRChleGVjRXZlbnQsIENKWF9TdWJmb3JtKTsKKyAgSlNfTUVUSE9EKGV4ZWNJbml0aWFsaXplLCBDSlhfU3ViZm9ybSk7CisgIEpTX01FVEhPRChleGVjVmFsaWRhdGUsIENKWF9TdWJmb3JtKTsKKworICBKU19QUk9QKGFsbG93TWFjcm8pOworICBKU19QUk9QKGFuY2hvclR5cGUpOworICBKU19QUk9QKGNvbFNwYW4pOworICBKU19QUk9QKGNvbHVtbldpZHRocyk7CisgIEpTX1BST1AoaCk7CisgIEpTX1BST1AoaEFsaWduKTsKKyAgSlNfUFJPUChpbnN0YW5jZUluZGV4KTsKKyAgSlNfUFJPUChsYXlvdXQpOworICBKU19QUk9QKGxvY2FsZSk7CisgIEpTX1BST1AobWF4SCk7CisgIEpTX1BST1AobWF4Vyk7CisgIEpTX1BST1AobWluSCk7CisgIEpTX1BST1AobWluVyk7CisgIEpTX1BST1AocHJlc2VuY2UpOworICBKU19QUk9QKHJlbGV2YW50KTsKKyAgSlNfUFJPUChyZXN0b3JlU3RhdGUpOworICBKU19QUk9QKHNjb3BlKTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworICBKU19QUk9QKHZhbGlkYXRpb25NZXNzYWdlKTsKKyAgSlNfUFJPUCh2QWxpZ24pOworICBKU19QUk9QKHcpOworICBKU19QUk9QKHgpOworICBKU19QUk9QKHkpOworCisgcHJpdmF0ZToKKyAgc3RhdGljIGNvbnN0IENKWF9NZXRob2RTcGVjIE1ldGhvZFNwZWNzW107Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9TVUJGT1JNX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfc3ViZm9ybXNldC5jcHAgYi9meGpzL3hmYS9janhfc3ViZm9ybXNldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QzNmFiYgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9zdWJmb3Jtc2V0LmNwcApAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc3ViZm9ybXNldC5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3ViZm9ybXNldC5oIgorCitDSlhfU3ViZm9ybVNldDo6Q0pYX1N1YmZvcm1TZXQoQ1hGQV9TdWJmb3JtU2V0KiBub2RlKSA6IENKWF9Db250YWluZXIobm9kZSkge30KKworQ0pYX1N1YmZvcm1TZXQ6On5DSlhfU3ViZm9ybVNldCgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfU3ViZm9ybVNldDo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9TdWJmb3JtU2V0OjpyZWxhdGlvbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1N1YmZvcm1TZXQ6OnJlbGV2YW50KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfU3ViZm9ybVNldDo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9TdWJmb3JtU2V0OjppbnN0YW5jZUluZGV4KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X1NvbV9JbnN0YW5jZUluZGV4KHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3N1YmZvcm1zZXQuaCBiL2Z4anMveGZhL2NqeF9zdWJmb3Jtc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg5YjQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9zdWJmb3Jtc2V0LmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9TVUJGT1JNU0VUX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9TVUJGT1JNU0VUX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfY29udGFpbmVyLmgiCisKK2NsYXNzIENYRkFfU3ViZm9ybVNldDsKKworY2xhc3MgQ0pYX1N1YmZvcm1TZXQgOiBwdWJsaWMgQ0pYX0NvbnRhaW5lciB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfU3ViZm9ybVNldChDWEZBX1N1YmZvcm1TZXQqIG5vZGUpOworICB+Q0pYX1N1YmZvcm1TZXQoKSBvdmVycmlkZTsKKworICBKU19QUk9QKGluc3RhbmNlSW5kZXgpOworICBKU19QUk9QKHJlbGF0aW9uKTsKKyAgSlNfUFJPUChyZWxldmFudCk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX1NVQkZPUk1TRVRfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9zdWJqZWN0ZG4uY3BwIGIvZnhqcy94ZmEvY2p4X3N1YmplY3Rkbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE1YjRhYgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9zdWJqZWN0ZG4uY3BwCkBAIC0wLDAgKzEsMTkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zdWJqZWN0ZG4uaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3N1YmplY3Rkbi5oIgorCitDSlhfU3ViamVjdEROOjpDSlhfU3ViamVjdEROKENYRkFfU3ViamVjdEROKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9TdWJqZWN0RE46On5DSlhfU3ViamVjdEROKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9TdWJqZWN0RE46OmRlbGltaXRlcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfc3ViamVjdGRuLmggYi9meGpzL3hmYS9janhfc3ViamVjdGRuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEzMjE4YgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9zdWJqZWN0ZG4uaApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX1NVQkpFQ1RETl9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfU1VCSkVDVEROX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX1N1YmplY3RETjsKKworY2xhc3MgQ0pYX1N1YmplY3RETiA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfU3ViamVjdEROKENYRkFfU3ViamVjdEROKiBub2RlKTsKKyAgfkNKWF9TdWJqZWN0RE4oKSBvdmVycmlkZTsKKworICBKU19QUk9QKGRlbGltaXRlcik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9TVUJKRUNURE5fSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF9zdWJqZWN0ZG5zLmNwcCBiL2Z4anMveGZhL2NqeF9zdWJqZWN0ZG5zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2Q5ZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3N1YmplY3RkbnMuY3BwCkBAIC0wLDAgKzEsMTkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zdWJqZWN0ZG5zLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJqZWN0ZG5zLmgiCisKK0NKWF9TdWJqZWN0RE5zOjpDSlhfU3ViamVjdEROcyhDWEZBX1N1YmplY3RETnMqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX1N1YmplY3RETnM6On5DSlhfU3ViamVjdEROcygpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfU3ViamVjdEROczo6dHlwZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3N1YmplY3RkbnMuaCBiL2Z4anMveGZhL2NqeF9zdWJqZWN0ZG5zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA0ZDgyNgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF9zdWJqZWN0ZG5zLmgKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9TVUJKRUNURE5TX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9TVUJKRUNURE5TX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX1N1YmplY3RETnM7CisKK2NsYXNzIENKWF9TdWJqZWN0RE5zIDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9TdWJqZWN0RE5zKENYRkFfU3ViamVjdEROcyogbm9kZSk7CisgIH5DSlhfU3ViamVjdEROcygpIG92ZXJyaWRlOworCisgIEpTX1BST1AodHlwZSk7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9TVUJKRUNURE5TX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfc3VibWl0LmNwcCBiL2Z4anMveGZhL2NqeF9zdWJtaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MmU0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfc3VibWl0LmNwcApAQCAtMCwwICsxLDU1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc3VibWl0LmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJtaXQuaCIKKworQ0pYX1N1Ym1pdDo6Q0pYX1N1Ym1pdChDWEZBX1N1Ym1pdCogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfU3VibWl0Ojp+Q0pYX1N1Ym1pdCgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfU3VibWl0Ojpmb3JtYXQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9TdWJtaXQ6OmVtYmVkUERGKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1N1Ym1pdDo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfU3VibWl0Ojp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9TdWJtaXQ6OnRhcmdldChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1N1Ym1pdDo6dGV4dEVuY29kaW5nKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfU3VibWl0Ojp4ZHBDb250ZW50KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3N1Ym1pdC5oIGIvZnhqcy94ZmEvY2p4X3N1Ym1pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlZmVjMzIKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfc3VibWl0LmgKQEAgLTAsMCArMSwyOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9TVUJNSVRfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1NVQk1JVF9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9TdWJtaXQ7CisKK2NsYXNzIENKWF9TdWJtaXQgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1N1Ym1pdChDWEZBX1N1Ym1pdCogbm9kZSk7CisgIH5DSlhfU3VibWl0KCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChlbWJlZFBERik7CisgIEpTX1BST1AoZm9ybWF0KTsKKyAgSlNfUFJPUCh0YXJnZXQpOworICBKU19QUk9QKHRleHRFbmNvZGluZyk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKKyAgSlNfUFJPUCh4ZHBDb250ZW50KTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX1NVQk1JVF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3RlbXBsYXRlLmNwcCBiL2Z4anMveGZhL2NqeF90ZW1wbGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE2YzlkNAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF90ZW1wbGF0ZS5jcHAKQEAgLTAsMCArMSw4MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3RlbXBsYXRlLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV92YWx1ZS5oIgorI2luY2x1ZGUgImZ4anMvanNfcmVzb3VyY2VzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZW1wbGF0ZS5oIgorCitjb25zdCBDSlhfTWV0aG9kU3BlYyBDSlhfVGVtcGxhdGU6Ok1ldGhvZFNwZWNzW10gPSB7CisgICAgeyJleGVjQ2FsY3VsYXRlIiwgZXhlY0NhbGN1bGF0ZV9zdGF0aWN9LAorICAgIHsiZXhlY0luaXRpYWxpemUiLCBleGVjSW5pdGlhbGl6ZV9zdGF0aWN9LAorICAgIHsiZXhlY1ZhbGlkYXRlIiwgZXhlY1ZhbGlkYXRlX3N0YXRpY30sCisgICAgeyJmb3JtTm9kZXMiLCBmb3JtTm9kZXNfc3RhdGljfSwKKyAgICB7InJlY2FsY3VsYXRlIiwgcmVjYWxjdWxhdGVfc3RhdGljfSwKKyAgICB7InJlbWVyZ2UiLCByZW1lcmdlX3N0YXRpY319OworCitDSlhfVGVtcGxhdGU6OkNKWF9UZW1wbGF0ZShDWEZBX1RlbXBsYXRlKiB0bXBsKSA6IENKWF9Nb2RlbCh0bXBsKSB7CisgIERlZmluZU1ldGhvZHMoTWV0aG9kU3BlY3MsIEZYX0FycmF5U2l6ZShNZXRob2RTcGVjcykpOworfQorCitDSlhfVGVtcGxhdGU6On5DSlhfVGVtcGxhdGUoKSB7fQorCitDSlNfUmV0dXJuIENKWF9UZW1wbGF0ZTo6Zm9ybU5vZGVzKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocnVudGltZS0+TmV3Qm9vbGVhbih0cnVlKSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX1RlbXBsYXRlOjpyZW1lcmdlKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIXBhcmFtcy5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKworICBHZXREb2N1bWVudCgpLT5Eb0RhdGFSZW1lcmdlKHRydWUpOworICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKK30KKworQ0pTX1JldHVybiBDSlhfVGVtcGxhdGU6OmV4ZWNJbml0aWFsaXplKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIXBhcmFtcy5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4oCisgICAgICBydW50aW1lLT5OZXdCb29sZWFuKCEhVG9Ob2RlKEdldFhGQU9iamVjdCgpKS0+R2V0V2lkZ2V0QWNjKCkpKTsKK30KKworQ0pTX1JldHVybiBDSlhfVGVtcGxhdGU6OnJlY2FsY3VsYXRlKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAocGFyYW1zLnNpemUoKSAhPSAxKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocnVudGltZS0+TmV3Qm9vbGVhbih0cnVlKSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX1RlbXBsYXRlOjpleGVjQ2FsY3VsYXRlKAorICAgIENKU19WOCogcnVudGltZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx2ODo6TG9jYWw8djg6OlZhbHVlPj4mIHBhcmFtcykgeworICBpZiAoIXBhcmFtcy5lbXB0eSgpKQorICAgIHJldHVybiBDSlNfUmV0dXJuKEpTR2V0U3RyaW5nRnJvbUlEKEpTTWVzc2FnZTo6a1BhcmFtRXJyb3IpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4oCisgICAgICBydW50aW1lLT5OZXdCb29sZWFuKCEhVG9Ob2RlKEdldFhGQU9iamVjdCgpKS0+R2V0V2lkZ2V0QWNjKCkpKTsKK30KKworQ0pTX1JldHVybiBDSlhfVGVtcGxhdGU6OmV4ZWNWYWxpZGF0ZSgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKCFwYXJhbXMuZW1wdHkoKSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihKU0dldFN0cmluZ0Zyb21JRChKU01lc3NhZ2U6OmtQYXJhbUVycm9yKSk7CisgIHJldHVybiBDSlNfUmV0dXJuKAorICAgICAgcnVudGltZS0+TmV3Qm9vbGVhbighIVRvTm9kZShHZXRYRkFPYmplY3QoKSktPkdldFdpZGdldEFjYygpKSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfdGVtcGxhdGUuaCBiL2Z4anMveGZhL2NqeF90ZW1wbGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjODI3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfdGVtcGxhdGUuaApAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX1RFTVBMQVRFX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9URU1QTEFURV9IXworCisjaW5jbHVkZSAiZnhqcy9DSlhfRGVmaW5lLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X21vZGVsLmgiCisKK2NsYXNzIENYRkFfVGVtcGxhdGU7CisKK2NsYXNzIENKWF9UZW1wbGF0ZSA6IHB1YmxpYyBDSlhfTW9kZWwgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1RlbXBsYXRlKENYRkFfVGVtcGxhdGUqIHRtcGwpOworICB+Q0pYX1RlbXBsYXRlKCkgb3ZlcnJpZGU7CisKKyAgLyogVGhlIGRvY3MgbGlzdCBhIHxjcmVhdGVOb2RlfCBtZXRob2Qgb24gVGVtcGxhdGUgYnV0IHRoYXQgbWV0aG9kIGFscmVhZHkKKyAgICogZXhpc3RzIG9uIE1vZGVsLCBhbHNvIHRoZSB8Y3JlYXRlTm9kZXwgZG9jcyBzYXkgaXQgZXhpc3RzIG9uIE1vZGVsIG5vdAorICAgKiBvbiBUZW1wbGF0ZSBzbyBJJ20gbGVhdmluZyB8Y3JlYXRlTm9kZXwgb3V0IG9mIHRoZSB0ZW1wbGF0ZSBtZXRob2RzLiAqLworICBKU19NRVRIT0QoZXhlY0NhbGN1bGF0ZSwgQ0pYX1RlbXBsYXRlKTsKKyAgSlNfTUVUSE9EKGV4ZWNJbml0aWFsaXplLCBDSlhfVGVtcGxhdGUpOworICBKU19NRVRIT0QoZXhlY1ZhbGlkYXRlLCBDSlhfVGVtcGxhdGUpOworICBKU19NRVRIT0QoZm9ybU5vZGVzLCBDSlhfVGVtcGxhdGUpOworICBKU19NRVRIT0QocmVjYWxjdWxhdGUsIENKWF9UZW1wbGF0ZSk7CisgIEpTX01FVEhPRChyZW1lcmdlLCBDSlhfVGVtcGxhdGUpOworCisgcHJpdmF0ZToKKyAgc3RhdGljIGNvbnN0IENKWF9NZXRob2RTcGVjIE1ldGhvZFNwZWNzW107Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9URU1QTEFURV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3RleHQuY3BwIGIvZnhqcy94ZmEvY2p4X3RleHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYTJmZjgKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfdGV4dC5jcHAKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3RleHQuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RleHQuaCIKKworQ0pYX1RleHQ6OkNKWF9UZXh0KENYRkFfVGV4dCogbm9kZSkgOiBDSlhfQ29udGVudChub2RlKSB7fQorCitDSlhfVGV4dDo6fkNKWF9UZXh0KCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9UZXh0Ojp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1RleHQ6Om1heENoYXJzKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfVGV4dDo6ZGVmYXVsdFZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9UZXh0Ojp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1RleHQ6OnZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZShwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF90ZXh0LmggYi9meGpzL3hmYS9janhfdGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NmE3YTkKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfdGV4dC5oCkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfVEVYVF9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfVEVYVF9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2NvbnRlbnQuaCIKKworY2xhc3MgQ1hGQV9UZXh0OworCitjbGFzcyBDSlhfVGV4dCA6IHB1YmxpYyBDSlhfQ29udGVudCB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfVGV4dChDWEZBX1RleHQqIG5vZGUpOworICB+Q0pYX1RleHQoKSBvdmVycmlkZTsKKworICBKU19QUk9QKGRlZmF1bHRWYWx1ZSk7IC8qIHtkZWZhdWx0fSAqLworICBKU19QUk9QKG1heENoYXJzKTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworICBKU19QUk9QKHZhbHVlKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX1RFWFRfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF90ZXh0ZWRpdC5jcHAgYi9meGpzL3hmYS9janhfdGV4dGVkaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYTZmYWEKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfdGV4dGVkaXQuY3BwCkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF90ZXh0ZWRpdC5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGV4dGVkaXQuaCIKKworQ0pYX1RleHRFZGl0OjpDSlhfVGV4dEVkaXQoQ1hGQV9UZXh0RWRpdCogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfVGV4dEVkaXQ6On5DSlhfVGV4dEVkaXQoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX1RleHRFZGl0Ojp2U2Nyb2xsUG9saWN5KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfVGV4dEVkaXQ6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9UZXh0RWRpdDo6YWxsb3dSaWNoVGV4dChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1RleHRFZGl0OjptdWx0aUxpbmUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfVGV4dEVkaXQ6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9UZXh0RWRpdDo6aFNjcm9sbFBvbGljeShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfdGV4dGVkaXQuaCBiL2Z4anMveGZhL2NqeF90ZXh0ZWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZjQyYzkKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfdGV4dGVkaXQuaApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX1RFWFRFRElUX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9URVhURURJVF9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9UZXh0RWRpdDsKKworY2xhc3MgQ0pYX1RleHRFZGl0IDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9UZXh0RWRpdChDWEZBX1RleHRFZGl0KiBub2RlKTsKKyAgfkNKWF9UZXh0RWRpdCgpIG92ZXJyaWRlOworCisgIEpTX1BST1AoYWxsb3dSaWNoVGV4dCk7CisgIEpTX1BST1AoaFNjcm9sbFBvbGljeSk7CisgIEpTX1BST1AobXVsdGlMaW5lKTsKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworICBKU19QUk9QKHZTY3JvbGxQb2xpY3kpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfVEVYVEVESVRfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF90ZXh0bm9kZS5jcHAgYi9meGpzL3hmYS9janhfdGV4dG5vZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMzUxMGMKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfdGV4dG5vZGUuY3BwCkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF90ZXh0bm9kZS5oIgorCisjaW5jbHVkZSAiZnhqcy9jZnhqc2VfdmFsdWUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK0NKWF9UZXh0Tm9kZTo6Q0pYX1RleHROb2RlKENYRkFfTm9kZSogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfVGV4dE5vZGU6On5DSlhfVGV4dE5vZGUoKSB7fQorCit2b2lkIENKWF9UZXh0Tm9kZTo6ZGVmYXVsdFZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGF0dHIpIHsKKyAgU2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUocFZhbHVlLCBiU2V0dGluZywgYXR0cik7Cit9CisKK3ZvaWQgQ0pYX1RleHROb2RlOjp2YWx1ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgYXR0cikgeworICBTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZShwVmFsdWUsIGJTZXR0aW5nLCBhdHRyKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF90ZXh0bm9kZS5oIGIvZnhqcy94ZmEvY2p4X3RleHRub2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkNDRkNwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF90ZXh0bm9kZS5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfVEVYVE5PREVfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1RFWFROT0RFX0hfCisKKyNpbmNsdWRlICJmeGpzL0NKWF9EZWZpbmUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX05vZGU7CisKK2NsYXNzIENKWF9UZXh0Tm9kZSA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfVGV4dE5vZGUoQ1hGQV9Ob2RlKiBub2RlKTsKKyAgfkNKWF9UZXh0Tm9kZSgpIG92ZXJyaWRlOworCisgIEpTX1BST1AoZGVmYXVsdFZhbHVlKTsgLyoge2RlZmF1bHR9ICovCisgIEpTX1BST1AodmFsdWUpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfVEVYVE5PREVfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF90aW1lLmNwcCBiL2Z4anMveGZhL2NqeF90aW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDg1NWZkCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3RpbWUuY3BwCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF90aW1lLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90aW1lLmgiCisKK0NKWF9UaW1lOjpDSlhfVGltZShDWEZBX1RpbWUqIG5vZGUpIDogQ0pYX0NvbnRlbnQobm9kZSkge30KKworQ0pYX1RpbWU6On5DSlhfVGltZSgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfVGltZTo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9UaW1lOjpkZWZhdWx0VmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1RpbWU6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfVGltZTo6dmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3RpbWUuaCBiL2Z4anMveGZhL2NqeF90aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTViMDVjYwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF90aW1lLmgKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9USU1FX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9USU1FX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfY29udGVudC5oIgorCitjbGFzcyBDWEZBX1RpbWU7CisKK2NsYXNzIENKWF9UaW1lIDogcHVibGljIENKWF9Db250ZW50IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9UaW1lKENYRkFfVGltZSogbm9kZSk7CisgIH5DSlhfVGltZSgpIG92ZXJyaWRlOworCisgIEpTX1BST1AoZGVmYXVsdFZhbHVlKTsgLyoge2RlZmF1bHR9ICovCisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKKyAgSlNfUFJPUCh2YWx1ZSk7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9USU1FX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfdGltZXN0YW1wLmNwcCBiL2Z4anMveGZhL2NqeF90aW1lc3RhbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMWQ2OTYKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfdGltZXN0YW1wLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdGltZXN0YW1wLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90aW1lc3RhbXAuaCIKKworQ0pYX1RpbWVTdGFtcDo6Q0pYX1RpbWVTdGFtcChDWEZBX1RpbWVTdGFtcCogbm9kZSkgOiBDSlhfTm9kZShub2RlKSB7fQorCitDSlhfVGltZVN0YW1wOjp+Q0pYX1RpbWVTdGFtcCgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfVGltZVN0YW1wOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9UaW1lU3RhbXA6OnR5cGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1RpbWVTdGFtcDo6c2VydmVyKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfVGltZVN0YW1wOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3RpbWVzdGFtcC5oIGIvZnhqcy94ZmEvY2p4X3RpbWVzdGFtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkN2FiMDIKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfdGltZXN0YW1wLmgKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9USU1FU1RBTVBfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1RJTUVTVEFNUF9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9UaW1lU3RhbXA7CisKK2NsYXNzIENKWF9UaW1lU3RhbXAgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1RpbWVTdGFtcChDWEZBX1RpbWVTdGFtcCogbm9kZSk7CisgIH5DSlhfVGltZVN0YW1wKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChzZXJ2ZXIpOworICBKU19QUk9QKHR5cGUpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9USU1FU1RBTVBfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF90b29sdGlwLmNwcCBiL2Z4anMveGZhL2NqeF90b29sdGlwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDZlMjQyCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3Rvb2x0aXAuY3BwCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF90b29sdGlwLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90b29sdGlwLmgiCisKK0NKWF9Ub29sVGlwOjpDSlhfVG9vbFRpcChDWEZBX1Rvb2xUaXAqIG5vZGUpIDogQ0pYX1RleHROb2RlKG5vZGUpIHt9CisKK0NKWF9Ub29sVGlwOjp+Q0pYX1Rvb2xUaXAoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX1Rvb2xUaXA6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfVG9vbFRpcDo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3Rvb2x0aXAuaCBiL2Z4anMveGZhL2NqeF90b29sdGlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc4ZDExYgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF90b29sdGlwLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9UT09MVElQX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9UT09MVElQX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdGV4dG5vZGUuaCIKKworY2xhc3MgQ1hGQV9Ub29sVGlwOworCitjbGFzcyBDSlhfVG9vbFRpcCA6IHB1YmxpYyBDSlhfVGV4dE5vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1Rvb2xUaXAoQ1hGQV9Ub29sVGlwKiBub2RlKTsKKyAgfkNKWF9Ub29sVGlwKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfVE9PTFRJUF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3RyYXZlcnNhbC5jcHAgYi9meGpzL3hmYS9janhfdHJhdmVyc2FsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmRjZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3RyYXZlcnNhbC5jcHAKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3RyYXZlcnNhbC5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhdmVyc2FsLmgiCisKK0NKWF9UcmF2ZXJzYWw6OkNKWF9UcmF2ZXJzYWwoQ1hGQV9UcmF2ZXJzYWwqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX1RyYXZlcnNhbDo6fkNKWF9UcmF2ZXJzYWwoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX1RyYXZlcnNhbDo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfVHJhdmVyc2FsOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3RyYXZlcnNhbC5oIGIvZnhqcy94ZmEvY2p4X3RyYXZlcnNhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MDcyZjMKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfdHJhdmVyc2FsLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9UUkFWRVJTQUxfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1RSQVZFUlNBTF9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9UcmF2ZXJzYWw7CisKK2NsYXNzIENKWF9UcmF2ZXJzYWwgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1RyYXZlcnNhbChDWEZBX1RyYXZlcnNhbCogbm9kZSk7CisgIH5DSlhfVHJhdmVyc2FsKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUCh1c2UpOworICBKU19QUk9QKHVzZWhyZWYpOworfTsKKworI2VuZGlmICAvLyBGWEpTX1hGQV9DSlhfVFJBVkVSU0FMX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfdHJhdmVyc2UuY3BwIGIvZnhqcy94ZmEvY2p4X3RyYXZlcnNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGQ1MzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3RyYXZlcnNlLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdHJhdmVyc2UuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RyYXZlcnNlLmgiCisKK0NKWF9UcmF2ZXJzZTo6Q0pYX1RyYXZlcnNlKENYRkFfVHJhdmVyc2UqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX1RyYXZlcnNlOjp+Q0pYX1RyYXZlcnNlKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9UcmF2ZXJzZTo6cmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1RyYXZlcnNlOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfVHJhdmVyc2U6Om9wZXJhdGlvbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9UcmF2ZXJzZTo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfdHJhdmVyc2UuaCBiL2Z4anMveGZhL2NqeF90cmF2ZXJzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZWY4OGUKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfdHJhdmVyc2UuaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX1RSQVZFUlNFX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9UUkFWRVJTRV9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9UcmF2ZXJzZTsKKworY2xhc3MgQ0pYX1RyYXZlcnNlIDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9UcmF2ZXJzZShDWEZBX1RyYXZlcnNlKiBub2RlKTsKKyAgfkNKWF9UcmF2ZXJzZSgpIG92ZXJyaWRlOworCisgIEpTX1BST1Aob3BlcmF0aW9uKTsKKyAgSlNfUFJPUChyZWYpOworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9UUkFWRVJTRV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3RyZWUuY3BwIGIvZnhqcy94ZmEvY2p4X3RyZWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMDExNWIKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfdHJlZS5jcHAKQEAgLTAsMCArMSwyMzkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF90cmVlLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV9lbmdpbmUuaCIKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV92YWx1ZS5oIgorI2luY2x1ZGUgImZ4anMvanNfcmVzb3VyY2VzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2FycmF5bm9kZWxpc3QuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hdHRhY2hub2RlbGlzdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX29iamVjdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfcmVzb2x2ZW5vZGVfcnMuaCIKKworY29uc3QgQ0pYX01ldGhvZFNwZWMgQ0pYX1RyZWU6Ok1ldGhvZFNwZWNzW10gPSB7CisgICAgeyJyZXNvbHZlTm9kZSIsIHJlc29sdmVOb2RlX3N0YXRpY30sCisgICAgeyJyZXNvbHZlTm9kZXMiLCByZXNvbHZlTm9kZXNfc3RhdGljfX07CisKK0NKWF9UcmVlOjpDSlhfVHJlZShDWEZBX09iamVjdCogb2JqKSA6IENKWF9PYmplY3Qob2JqKSB7CisgIERlZmluZU1ldGhvZHMoTWV0aG9kU3BlY3MsIEZYX0FycmF5U2l6ZShNZXRob2RTcGVjcykpOworfQorCitDSlhfVHJlZTo6fkNKWF9UcmVlKCkge30KKworQ0pTX1JldHVybiBDSlhfVHJlZTo6cmVzb2x2ZU5vZGUoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIFdpZGVTdHJpbmcgZXhwcmVzc2lvbiA9IHJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMF0pOworICBDRlhKU0VfRW5naW5lKiBwU2NyaXB0Q29udGV4dCA9IEdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKTsKKyAgaWYgKCFwU2NyaXB0Q29udGV4dCkKKyAgICByZXR1cm4gQ0pTX1JldHVybih0cnVlKTsKKworICBDWEZBX09iamVjdCogcmVmTm9kZSA9IEdldFhGQU9iamVjdCgpOworICBpZiAocmVmTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6WGZhKQorICAgIHJlZk5vZGUgPSBwU2NyaXB0Q29udGV4dC0+R2V0VGhpc09iamVjdCgpOworCisgIHVpbnQzMl90IGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzIHwKKyAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfCBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwKKyAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOworICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb2x2ZU5vZGVSUzsKKyAgaWYgKCFwU2NyaXB0Q29udGV4dC0+UmVzb2x2ZU9iamVjdHMoVG9Ob2RlKHJlZk5vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9uLkFzU3RyaW5nVmlldygpLCAmcmVzb2x2ZU5vZGVSUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFnLCBudWxscHRyKSkgeworICAgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld051bGwoKSk7CisgIH0KKworICBpZiAocmVzb2x2ZU5vZGVSUy5kd0ZsYWdzID09IFhGQV9SZXNvbHZlTm9kZV9SU1R5cGVfTm9kZXMpIHsKKyAgICBDWEZBX09iamVjdCogcE9iamVjdCA9IHJlc29sdmVOb2RlUlMub2JqZWN0cy5mcm9udCgpOworICAgIENGWEpTRV9WYWx1ZSogdmFsdWUgPQorICAgICAgICBHZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBPYmplY3QpOworICAgIGlmICghdmFsdWUpCisgICAgICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdOdWxsKCkpOworCisgICAgcmV0dXJuIENKU19SZXR1cm4odmFsdWUtPkRpcmVjdEdldFZhbHVlKCkuR2V0KHJ1bnRpbWUtPkdldElzb2xhdGUoKSkpOworICB9CisKKyAgY29uc3QgWEZBX1NDUklQVEFUVFJJQlVURUlORk8qIGxwQXR0cmlidXRlSW5mbyA9CisgICAgICByZXNvbHZlTm9kZVJTLnBTY3JpcHRBdHRyaWJ1dGU7CisgIGlmICghbHBBdHRyaWJ1dGVJbmZvIHx8CisgICAgICBscEF0dHJpYnV0ZUluZm8tPmVWYWx1ZVR5cGUgIT0gWEZBX1NjcmlwdFR5cGU6Ok9iamVjdCkgeworICAgIHJldHVybiBDSlNfUmV0dXJuKHJ1bnRpbWUtPk5ld051bGwoKSk7CisgIH0KKworICBhdXRvIHBWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBTY3JpcHRDb250ZXh0LT5HZXRJc29sYXRlKCkpOworICBDSlhfT2JqZWN0KiBqc09iamVjdCA9IHJlc29sdmVOb2RlUlMub2JqZWN0cy5mcm9udCgpLT5KU09iamVjdCgpOworICAoanNPYmplY3QtPioobHBBdHRyaWJ1dGVJbmZvLT5jYWxsYmFjaykpKHBWYWx1ZS5nZXQoKSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBBdHRyaWJ1dGVJbmZvLT5hdHRyaWJ1dGUpOworICByZXR1cm4gQ0pTX1JldHVybihwVmFsdWUtPkRpcmVjdEdldFZhbHVlKCkuR2V0KHJ1bnRpbWUtPkdldElzb2xhdGUoKSkpOworfQorCitDSlNfUmV0dXJuIENKWF9UcmVlOjpyZXNvbHZlTm9kZXMoCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENYRkFfT2JqZWN0KiByZWZOb2RlID0gR2V0WEZBT2JqZWN0KCk7CisgIGlmIChyZWZOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpYZmEpCisgICAgcmVmTm9kZSA9IEdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpOworCisgIENGWEpTRV9FbmdpbmUqIHBTY3JpcHRDb250ZXh0ID0gR2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpOworICBpZiAoIXBTY3JpcHRDb250ZXh0KQorICAgIHJldHVybiBDSlNfUmV0dXJuKHRydWUpOworCisgIGF1dG8gcFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocFNjcmlwdENvbnRleHQtPkdldElzb2xhdGUoKSk7CisgIFJlc29sdmVOb2RlTGlzdChwVmFsdWUuZ2V0KCksIHJ1bnRpbWUtPlRvV2lkZVN0cmluZyhwYXJhbXNbMF0pLAorICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXMgfAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8CisgICAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzLAorICAgICAgICAgICAgICAgICAgVG9Ob2RlKHJlZk5vZGUpKTsKKyAgcmV0dXJuIENKU19SZXR1cm4ocFZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpLkdldChydW50aW1lLT5HZXRJc29sYXRlKCkpKTsKK30KKwordm9pZCBDSlhfVHJlZTo6YWxsKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIGlmIChiU2V0dGluZykgeworICAgIFRocm93SW52YWxpZFByb3BlcnR5RXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgdWludDMyX3QgZHdGbGFnID0gWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzIHwgWEZBX1JFU09MVkVOT0RFX0FMTDsKKyAgV2lkZVN0cmluZyB3c0V4cHJlc3Npb24gPSBHZXRBdHRyaWJ1dGUoWEZBX0F0dHJpYnV0ZTo6TmFtZSkgKyBMIlsqXSI7CisgIFJlc29sdmVOb2RlTGlzdChwVmFsdWUsIHdzRXhwcmVzc2lvbiwgZHdGbGFnLCBudWxscHRyKTsKK30KKwordm9pZCBDSlhfVHJlZTo6Y2xhc3NBbGwoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIGlmIChiU2V0dGluZykgeworICAgIFRocm93SW52YWxpZFByb3BlcnR5RXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgV2lkZVN0cmluZyB3c0V4cHJlc3Npb24gPSBMIiMiICsgR2V0WEZBT2JqZWN0KCktPkdldENsYXNzTmFtZSgpICsgTCJbKl0iOworICBSZXNvbHZlTm9kZUxpc3QocFZhbHVlLCB3c0V4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MgfCBYRkFfUkVTT0xWRU5PREVfQUxMLCBudWxscHRyKTsKK30KKwordm9pZCBDSlhfVHJlZTo6bmFtZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9UcmVlOjpub2RlcyhDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgQ0ZYSlNFX0VuZ2luZSogcFNjcmlwdENvbnRleHQgPSBHZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCk7CisgIGlmICghcFNjcmlwdENvbnRleHQpCisgICAgcmV0dXJuOworCisgIGlmIChiU2V0dGluZykgeworICAgIFdpZGVTdHJpbmcgd3NNZXNzYWdlID0gTCJVbmFibGUgdG8gc2V0ICI7CisgICAgRlhKU0VfVGhyb3dNZXNzYWdlKHdzTWVzc2FnZS5VVEY4RW5jb2RlKCkuQXNTdHJpbmdWaWV3KCkpOworICAgIHJldHVybjsKKyAgfQorCisgIENYRkFfQXR0YWNoTm9kZUxpc3QqIHBOb2RlTGlzdCA9CisgICAgICBuZXcgQ1hGQV9BdHRhY2hOb2RlTGlzdChHZXREb2N1bWVudCgpLCBUb05vZGUoR2V0WEZBT2JqZWN0KCkpKTsKKyAgcFZhbHVlLT5TZXRPYmplY3QocE5vZGVMaXN0LCBwU2NyaXB0Q29udGV4dC0+R2V0SnNlTm9ybWFsQ2xhc3MoKSk7Cit9CisKK3ZvaWQgQ0pYX1RyZWU6OnBhcmVudChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBpZiAoYlNldHRpbmcpIHsKKyAgICBUaHJvd0ludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorCisgIENYRkFfTm9kZSogcFBhcmVudCA9IFRvTm9kZShHZXRYRkFPYmplY3QoKSktPkdldFBhcmVudCgpOworICBpZiAoIXBQYXJlbnQpIHsKKyAgICBwVmFsdWUtPlNldE51bGwoKTsKKyAgICByZXR1cm47CisgIH0KKworICBwVmFsdWUtPkFzc2lnbihHZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBQYXJlbnQpKTsKK30KKwordm9pZCBDSlhfVHJlZTo6aW5kZXgoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIGlmIChiU2V0dGluZykgeworICAgIFRocm93SW52YWxpZFByb3BlcnR5RXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisgIHBWYWx1ZS0+U2V0SW50ZWdlcihUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5HZXROb2RlU2FtZU5hbWVJbmRleCgpKTsKK30KKwordm9pZCBDSlhfVHJlZTo6Y2xhc3NJbmRleChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIGlmIChiU2V0dGluZykgeworICAgIFRocm93SW52YWxpZFByb3BlcnR5RXhjZXB0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisgIHBWYWx1ZS0+U2V0SW50ZWdlcihUb05vZGUoR2V0WEZBT2JqZWN0KCkpLT5HZXROb2RlU2FtZUNsYXNzSW5kZXgoKSk7Cit9CisKK3ZvaWQgQ0pYX1RyZWU6OnNvbUV4cHJlc3Npb24oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBpZiAoYlNldHRpbmcpIHsKKyAgICBUaHJvd0ludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbigpOworICAgIHJldHVybjsKKyAgfQorCisgIFdpZGVTdHJpbmcgd3NTT01FeHByZXNzaW9uID0gR2V0WEZBT2JqZWN0KCktPkdldFNPTUV4cHJlc3Npb24oKTsKKyAgcFZhbHVlLT5TZXRTdHJpbmcod3NTT01FeHByZXNzaW9uLlVURjhFbmNvZGUoKS5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKK3ZvaWQgQ0pYX1RyZWU6OlJlc29sdmVOb2RlTGlzdChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nIHdzRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiByZWZOb2RlKSB7CisgIENGWEpTRV9FbmdpbmUqIHBTY3JpcHRDb250ZXh0ID0gR2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpOworICBpZiAoIXBTY3JpcHRDb250ZXh0KQorICAgIHJldHVybjsKKyAgaWYgKCFyZWZOb2RlKQorICAgIHJlZk5vZGUgPSBUb05vZGUoR2V0WEZBT2JqZWN0KCkpOworCisgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvbHZlTm9kZVJTOworICBwU2NyaXB0Q29udGV4dC0+UmVzb2x2ZU9iamVjdHMocmVmTm9kZSwgd3NFeHByZXNzaW9uLkFzU3RyaW5nVmlldygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVOb2RlUlMsIGR3RmxhZywgbnVsbHB0cik7CisgIENYRkFfQXJyYXlOb2RlTGlzdCogcE5vZGVMaXN0ID0gbmV3IENYRkFfQXJyYXlOb2RlTGlzdChHZXREb2N1bWVudCgpKTsKKyAgaWYgKHJlc29sdmVOb2RlUlMuZHdGbGFncyA9PSBYRkFfUmVzb2x2ZU5vZGVfUlNUeXBlX05vZGVzKSB7CisgICAgZm9yIChDWEZBX09iamVjdCogcE9iamVjdCA6IHJlc29sdmVOb2RlUlMub2JqZWN0cykgeworICAgICAgaWYgKHBPYmplY3QtPklzTm9kZSgpKQorICAgICAgICBwTm9kZUxpc3QtPkFwcGVuZChwT2JqZWN0LT5Bc05vZGUoKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChyZXNvbHZlTm9kZVJTLnBTY3JpcHRBdHRyaWJ1dGUgJiYKKyAgICAgICAgcmVzb2x2ZU5vZGVSUy5wU2NyaXB0QXR0cmlidXRlLT5lVmFsdWVUeXBlID09IFhGQV9TY3JpcHRUeXBlOjpPYmplY3QpIHsKKyAgICAgIGZvciAoQ1hGQV9PYmplY3QqIHBPYmplY3QgOiByZXNvbHZlTm9kZVJTLm9iamVjdHMpIHsKKyAgICAgICAgYXV0byBwVmFsdWUgPQorICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocFNjcmlwdENvbnRleHQtPkdldElzb2xhdGUoKSk7CisgICAgICAgIENKWF9PYmplY3QqIGpzT2JqZWN0ID0gcE9iamVjdC0+SlNPYmplY3QoKTsKKyAgICAgICAgKGpzT2JqZWN0LT4qKHJlc29sdmVOb2RlUlMucFNjcmlwdEF0dHJpYnV0ZS0+Y2FsbGJhY2spKSgKKyAgICAgICAgICAgIHBWYWx1ZS5nZXQoKSwgZmFsc2UsIHJlc29sdmVOb2RlUlMucFNjcmlwdEF0dHJpYnV0ZS0+YXR0cmlidXRlKTsKKworICAgICAgICBDWEZBX09iamVjdCogb2JqID0gQ0ZYSlNFX0VuZ2luZTo6VG9PYmplY3QocFZhbHVlLmdldCgpLCBudWxscHRyKTsKKyAgICAgICAgaWYgKG9iai0+SXNOb2RlKCkpCisgICAgICAgICAgcE5vZGVMaXN0LT5BcHBlbmQob2JqLT5Bc05vZGUoKSk7CisgICAgICB9CisgICAgfQorICB9CisgIHBWYWx1ZS0+U2V0T2JqZWN0KHBOb2RlTGlzdCwgcFNjcmlwdENvbnRleHQtPkdldEpzZU5vcm1hbENsYXNzKCkpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3RyZWUuaCBiL2Z4anMveGZhL2NqeF90cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM4OWQyZQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF90cmVlLmgKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9UUkVFX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9UUkVFX0hfCisKKyNpbmNsdWRlICJmeGpzL0NKWF9EZWZpbmUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfb2JqZWN0LmgiCisKK2NsYXNzIENYRkFfT2JqZWN0OworY2xhc3MgQ1hGQV9Ob2RlOworCitjbGFzcyBDSlhfVHJlZSA6IHB1YmxpYyBDSlhfT2JqZWN0IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9UcmVlKENYRkFfT2JqZWN0KiBvYmopOworICB+Q0pYX1RyZWUoKSBvdmVycmlkZTsKKworICBKU19NRVRIT0QocmVzb2x2ZU5vZGUsIENKWF9UcmVlKTsKKyAgSlNfTUVUSE9EKHJlc29sdmVOb2RlcywgQ0pYX1RyZWUpOworCisgIEpTX1BST1AoYWxsKTsKKyAgSlNfUFJPUChjbGFzc0FsbCk7CisgIEpTX1BST1AoY2xhc3NJbmRleCk7CisgIEpTX1BST1AoaW5kZXgpOworICBKU19QUk9QKG5hbWUpOworICBKU19QUk9QKG5vZGVzKTsKKyAgSlNfUFJPUChwYXJlbnQpOworICBKU19QUk9QKHNvbUV4cHJlc3Npb24pOworCisgcHJpdmF0ZToKKyAgdm9pZCBSZXNvbHZlTm9kZUxpc3QoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcgd3NFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcmVmTm9kZSk7CisKKyAgc3RhdGljIGNvbnN0IENKWF9NZXRob2RTcGVjIE1ldGhvZFNwZWNzW107Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9UUkVFX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfdHJlZWxpc3QuY3BwIGIvZnhqcy94ZmEvY2p4X3RyZWVsaXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTFhMGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3RyZWVsaXN0LmNwcApAQCAtMCwwICsxLDQ4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdHJlZWxpc3QuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImZ4anMvY2Z4anNlX2VuZ2luZS5oIgorI2luY2x1ZGUgImZ4anMvY2Z4anNlX3ZhbHVlLmgiCisjaW5jbHVkZSAiZnhqcy9qc19yZXNvdXJjZXMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmVlbGlzdC5oIgorCitjb25zdCBDSlhfTWV0aG9kU3BlYyBDSlhfVHJlZUxpc3Q6Ok1ldGhvZFNwZWNzW10gPSB7CisgICAgeyJuYW1lZEl0ZW0iLCBuYW1lZEl0ZW1fc3RhdGljfX07CisKK0NKWF9UcmVlTGlzdDo6Q0pYX1RyZWVMaXN0KENYRkFfVHJlZUxpc3QqIGxpc3QpIDogQ0pYX0xpc3QobGlzdCkgeworICBEZWZpbmVNZXRob2RzKE1ldGhvZFNwZWNzLCBGWF9BcnJheVNpemUoTWV0aG9kU3BlY3MpKTsKK30KKworQ0pYX1RyZWVMaXN0Ojp+Q0pYX1RyZWVMaXN0KCkge30KKworQ1hGQV9UcmVlTGlzdCogQ0pYX1RyZWVMaXN0OjpHZXRYRkFUcmVlTGlzdCgpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfVHJlZUxpc3QqPihHZXRYRkFPYmplY3QoKSk7Cit9CisKK0NKU19SZXR1cm4gQ0pYX1RyZWVMaXN0OjpuYW1lZEl0ZW0oCisgICAgQ0pTX1Y4KiBydW50aW1lLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHY4OjpMb2NhbDx2ODo6VmFsdWU+PiYgcGFyYW1zKSB7CisgIGlmIChwYXJhbXMuc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworCisgIENYRkFfTm9kZSogcE5vZGUgPSBHZXRYRkFUcmVlTGlzdCgpLT5OYW1lZEl0ZW0oCisgICAgICBydW50aW1lLT5Ub1dpZGVTdHJpbmcocGFyYW1zWzBdKS5Bc1N0cmluZ1ZpZXcoKSk7CisgIGlmICghcE5vZGUpCisgICAgcmV0dXJuIENKU19SZXR1cm4odHJ1ZSk7CisKKyAgQ0ZYSlNFX1ZhbHVlKiB2YWx1ZSA9CisgICAgICBHZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBOb2RlKTsKKyAgaWYgKCF2YWx1ZSkKKyAgICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdOdWxsKCkpOworCisgIHJldHVybiBDSlNfUmV0dXJuKHZhbHVlLT5EaXJlY3RHZXRWYWx1ZSgpLkdldChydW50aW1lLT5HZXRJc29sYXRlKCkpKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF90cmVlbGlzdC5oIGIvZnhqcy94ZmEvY2p4X3RyZWVsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlhOTVlNgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF90cmVlbGlzdC5oCkBAIC0wLDAgKzEsMjggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfVFJFRUxJU1RfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1RSRUVMSVNUX0hfCisKKyNpbmNsdWRlICJmeGpzL0NKWF9EZWZpbmUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbGlzdC5oIgorCitjbGFzcyBDWEZBX1RyZWVMaXN0OworCitjbGFzcyBDSlhfVHJlZUxpc3QgOiBwdWJsaWMgQ0pYX0xpc3QgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1RyZWVMaXN0KENYRkFfVHJlZUxpc3QqIGxpc3QpOworICB+Q0pYX1RyZWVMaXN0KCkgb3ZlcnJpZGU7CisKKyAgSlNfTUVUSE9EKG5hbWVkSXRlbSwgQ0pYX1RyZWVMaXN0KTsKKworIHByaXZhdGU6CisgIENYRkFfVHJlZUxpc3QqIEdldFhGQVRyZWVMaXN0KCk7CisKKyAgc3RhdGljIGNvbnN0IENKWF9NZXRob2RTcGVjIE1ldGhvZFNwZWNzW107Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9UUkVFTElTVF9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3VpLmNwcCBiL2Z4anMveGZhL2NqeF91aS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBkYjc4OQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF91aS5jcHAKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3VpLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV91aS5oIgorCitDSlhfVWk6OkNKWF9VaShDWEZBX1VpKiBub2RlKSA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9VaTo6fkNKWF9VaSgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfVWk6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9VaTo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfdWkuaCBiL2Z4anMveGZhL2NqeF91aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MmIxZGUKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfdWkuaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX1VJX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9VSV9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9VaTsKKworY2xhc3MgQ0pYX1VpIDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9VaShDWEZBX1VpKiBub2RlKTsKKyAgfkNKWF9VaSgpIG92ZXJyaWRlOworCisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX1VJX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfdXBkYXRlLmNwcCBiL2Z4anMveGZhL2NqeF91cGRhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZDFlZjIKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfdXBkYXRlLmNwcApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdXBkYXRlLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV91cGRhdGUuaCIKKworQ0pYX1VwZGF0ZTo6Q0pYX1VwZGF0ZShDWEZBX1VwZGF0ZSogbm9kZSkgOiBDSlhfVGV4dE5vZGUobm9kZSkge30KKworQ0pYX1VwZGF0ZTo6fkNKWF9VcGRhdGUoKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX1VwZGF0ZTo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfVXBkYXRlOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3VwZGF0ZS5oIGIvZnhqcy94ZmEvY2p4X3VwZGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYWNiNGIKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfdXBkYXRlLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9VUERBVEVfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1VQREFURV9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3RleHRub2RlLmgiCisKK2NsYXNzIENYRkFfVXBkYXRlOworCitjbGFzcyBDSlhfVXBkYXRlIDogcHVibGljIENKWF9UZXh0Tm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfVXBkYXRlKENYRkFfVXBkYXRlKiBub2RlKTsKKyAgfkNKWF9VcGRhdGUoKSBvdmVycmlkZTsKKworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9VUERBVEVfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF91cmkuY3BwIGIvZnhqcy94ZmEvY2p4X3VyaS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmYmI2OAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF91cmkuY3BwCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF91cmkuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3VyaS5oIgorCitDSlhfVXJpOjpDSlhfVXJpKENYRkFfVXJpKiBub2RlKSA6IENKWF9UZXh0Tm9kZShub2RlKSB7fQorCitDSlhfVXJpOjp+Q0pYX1VyaSgpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfVXJpOjp1c2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Vcmk6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfdXJpLmggYi9meGpzL3hmYS9janhfdXJpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA1YmM1YwotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF91cmkuaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX1VSSV9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfVVJJX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdGV4dG5vZGUuaCIKKworY2xhc3MgQ1hGQV9Vcmk7CisKK2NsYXNzIENKWF9VcmkgOiBwdWJsaWMgQ0pYX1RleHROb2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9VcmkoQ1hGQV9VcmkqIG5vZGUpOworICB+Q0pYX1VyaSgpIG92ZXJyaWRlOworCisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX1VSSV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3VzZXIuY3BwIGIvZnhqcy94ZmEvY2p4X3VzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MmY5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfdXNlci5jcHAKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3VzZXIuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3VzZXIuaCIKKworQ0pYX1VzZXI6OkNKWF9Vc2VyKENYRkFfVXNlciogbm9kZSkgOiBDSlhfVGV4dE5vZGUobm9kZSkge30KKworQ0pYX1VzZXI6On5DSlhfVXNlcigpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfVXNlcjo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9Vc2VyOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfdXNlci5oIGIvZnhqcy94ZmEvY2p4X3VzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTExZGY4Ci0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3VzZXIuaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgRlhKU19YRkFfQ0pYX1VTRVJfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1VTRVJfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF90ZXh0bm9kZS5oIgorCitjbGFzcyBDWEZBX1VzZXI7CisKK2NsYXNzIENKWF9Vc2VyIDogcHVibGljIENKWF9UZXh0Tm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfVXNlcihDWEZBX1VzZXIqIG5vZGUpOworICB+Q0pYX1VzZXIoKSBvdmVycmlkZTsKKworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9VU0VSX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfdmFsaWRhdGUuY3BwIGIvZnhqcy94ZmEvY2p4X3ZhbGlkYXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmMyNjRlCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3ZhbGlkYXRlLmNwcApAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdmFsaWRhdGUuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZhbGlkYXRlLmgiCisKK0NKWF9WYWxpZGF0ZTo6Q0pYX1ZhbGlkYXRlKENYRkFfVmFsaWRhdGUqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX1ZhbGlkYXRlOjp+Q0pYX1ZhbGlkYXRlKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9WYWxpZGF0ZTo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1ZhbGlkYXRlOjpzY3JpcHRUZXN0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfVmFsaWRhdGU6Om51bGxUZXN0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9WYWxpZGF0ZTo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1ZhbGlkYXRlOjpmb3JtYXRUZXN0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF92YWxpZGF0ZS5oIGIvZnhqcy94ZmEvY2p4X3ZhbGlkYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU0OTIzZAotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF92YWxpZGF0ZS5oCkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfVkFMSURBVEVfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1ZBTElEQVRFX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX1ZhbGlkYXRlOworCitjbGFzcyBDSlhfVmFsaWRhdGUgOiBwdWJsaWMgQ0pYX05vZGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1ZhbGlkYXRlKENYRkFfVmFsaWRhdGUqIG5vZGUpOworICB+Q0pYX1ZhbGlkYXRlKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUChmb3JtYXRUZXN0KTsKKyAgSlNfUFJPUChudWxsVGVzdCk7CisgIEpTX1BST1Aoc2NyaXB0VGVzdCk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX1ZBTElEQVRFX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfdmFsdWUuY3BwIGIvZnhqcy94ZmEvY2p4X3ZhbHVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmUzYjIzCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3ZhbHVlLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdmFsdWUuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZhbHVlLmgiCisKK0NKWF9WYWx1ZTo6Q0pYX1ZhbHVlKENYRkFfVmFsdWUqIG5vZGUpIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX1ZhbHVlOjp+Q0pYX1ZhbHVlKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9WYWx1ZTo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1ZhbHVlOjpyZWxldmFudChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfVmFsdWU6OnVzZWhyZWYoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQorCit2b2lkIENKWF9WYWx1ZTo6b3ZlcnJpZGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9CT09MKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3ZhbHVlLmggYi9meGpzL3hmYS9janhfdmFsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWMyYTJjCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3ZhbHVlLmgKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9WQUxVRV9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfVkFMVUVfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfVmFsdWU7CisKK2NsYXNzIENKWF9WYWx1ZSA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfVmFsdWUoQ1hGQV9WYWx1ZSogbm9kZSk7CisgIH5DSlhfVmFsdWUoKSBvdmVycmlkZTsKKworICBKU19QUk9QKG92ZXJyaWRlKTsKKyAgSlNfUFJPUChyZWxldmFudCk7CisgIEpTX1BST1AodXNlKTsKKyAgSlNfUFJPUCh1c2VocmVmKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfdmFyaWFibGVzLmNwcCBiL2Z4anMveGZhL2NqeF92YXJpYWJsZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MDRjOWYKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfdmFyaWFibGVzLmNwcApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdmFyaWFibGVzLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV92YXJpYWJsZXMuaCIKKworQ0pYX1ZhcmlhYmxlczo6Q0pYX1ZhcmlhYmxlcyhDWEZBX1ZhcmlhYmxlcyogbm9kZSkgOiBDSlhfQ29udGFpbmVyKG5vZGUpIHt9CisKK0NKWF9WYXJpYWJsZXM6On5DSlhfVmFyaWFibGVzKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9WYXJpYWJsZXM6OnVzZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1ZhcmlhYmxlczo6dXNlaHJlZihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF92YXJpYWJsZXMuaCBiL2Z4anMveGZhL2NqeF92YXJpYWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWQzNzNlCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3ZhcmlhYmxlcy5oCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfVkFSSUFCTEVTX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9WQVJJQUJMRVNfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9jb250YWluZXIuaCIKKworY2xhc3MgQ1hGQV9WYXJpYWJsZXM7CisKK2NsYXNzIENKWF9WYXJpYWJsZXMgOiBwdWJsaWMgQ0pYX0NvbnRhaW5lciB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfVmFyaWFibGVzKENYRkFfVmFyaWFibGVzKiBub2RlKTsKKyAgfkNKWF9WYXJpYWJsZXMoKSBvdmVycmlkZTsKKworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9WQVJJQUJMRVNfSF8KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF93c2RsYWRkcmVzcy5jcHAgYi9meGpzL3hmYS9janhfd3NkbGFkZHJlc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNmE3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfd3NkbGFkZHJlc3MuY3BwCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF93c2RsYWRkcmVzcy5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd3NkbGFkZHJlc3MuaCIKKworQ0pYX1dzZGxBZGRyZXNzOjpDSlhfV3NkbEFkZHJlc3MoQ1hGQV9Xc2RsQWRkcmVzcyogbm9kZSkgOiBDSlhfVGV4dE5vZGUobm9kZSkge30KKworQ0pYX1dzZGxBZGRyZXNzOjp+Q0pYX1dzZGxBZGRyZXNzKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9Xc2RsQWRkcmVzczo6dXNlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1dzZGxBZGRyZXNzOjp1c2VocmVmKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF93c2RsYWRkcmVzcy5oIGIvZnhqcy94ZmEvY2p4X3dzZGxhZGRyZXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc0MmQxYQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF93c2RsYWRkcmVzcy5oCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfV1NETEFERFJFU1NfSF8KKyNkZWZpbmUgRlhKU19YRkFfQ0pYX1dTRExBRERSRVNTX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdGV4dG5vZGUuaCIKKworY2xhc3MgQ1hGQV9Xc2RsQWRkcmVzczsKKworY2xhc3MgQ0pYX1dzZGxBZGRyZXNzIDogcHVibGljIENKWF9UZXh0Tm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfV3NkbEFkZHJlc3MoQ1hGQV9Xc2RsQWRkcmVzcyogbm9kZSk7CisgIH5DSlhfV3NkbEFkZHJlc3MoKSBvdmVycmlkZTsKKworICBKU19QUk9QKHVzZSk7CisgIEpTX1BST1AodXNlaHJlZik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9XU0RMQUREUkVTU19IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3dzZGxjb25uZWN0aW9uLmNwcCBiL2Z4anMveGZhL2NqeF93c2RsY29ubmVjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM2Y2E0NgotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF93c2RsY29ubmVjdGlvbi5jcHAKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3dzZGxjb25uZWN0aW9uLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV92YWx1ZS5oIgorI2luY2x1ZGUgImZ4anMvanNfcmVzb3VyY2VzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd3NkbGNvbm5lY3Rpb24uaCIKKworY29uc3QgQ0pYX01ldGhvZFNwZWMgQ0pYX1dzZGxDb25uZWN0aW9uOjpNZXRob2RTcGVjc1tdID0geworICAgIHsiZXhlY3V0ZSIsIGV4ZWN1dGVfc3RhdGljfX07CisKK0NKWF9Xc2RsQ29ubmVjdGlvbjo6Q0pYX1dzZGxDb25uZWN0aW9uKENYRkFfV3NkbENvbm5lY3Rpb24qIGNvbm5lY3Rpb24pCisgICAgOiBDSlhfTm9kZShjb25uZWN0aW9uKSB7CisgIERlZmluZU1ldGhvZHMoTWV0aG9kU3BlY3MsIEZYX0FycmF5U2l6ZShNZXRob2RTcGVjcykpOworfQorCitDSlhfV3NkbENvbm5lY3Rpb246On5DSlhfV3NkbENvbm5lY3Rpb24oKSB7fQorCitDSlNfUmV0dXJuIENKWF9Xc2RsQ29ubmVjdGlvbjo6ZXhlY3V0ZSgKKyAgICBDSlNfVjgqIHJ1bnRpbWUsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8djg6OkxvY2FsPHY4OjpWYWx1ZT4+JiBwYXJhbXMpIHsKKyAgaWYgKCFwYXJhbXMuZW1wdHkoKSAmJiBwYXJhbXMuc2l6ZSgpICE9IDEpCisgICAgcmV0dXJuIENKU19SZXR1cm4oSlNHZXRTdHJpbmdGcm9tSUQoSlNNZXNzYWdlOjprUGFyYW1FcnJvcikpOworICByZXR1cm4gQ0pTX1JldHVybihydW50aW1lLT5OZXdCb29sZWFuKGZhbHNlKSk7Cit9CisKK3ZvaWQgQ0pYX1dzZGxDb25uZWN0aW9uOjpkYXRhRGVzY3JpcHRpb24oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KKwordm9pZCBDSlhfV3NkbENvbm5lY3Rpb246OmV4ZWN1dGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3dzZGxjb25uZWN0aW9uLmggYi9meGpzL3hmYS9janhfd3NkbGNvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzU1YjVkCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3dzZGxjb25uZWN0aW9uLmgKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9XU0RMQ09OTkVDVElPTl9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfV1NETENPTk5FQ1RJT05fSF8KKworI2luY2x1ZGUgImZ4anMvQ0pYX0RlZmluZS5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ub2RlLmgiCisKK2NsYXNzIENYRkFfV3NkbENvbm5lY3Rpb247CisKK2NsYXNzIENKWF9Xc2RsQ29ubmVjdGlvbiA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfV3NkbENvbm5lY3Rpb24oQ1hGQV9Xc2RsQ29ubmVjdGlvbiogY29ubmVjdGlvbik7CisgIH5DSlhfV3NkbENvbm5lY3Rpb24oKSBvdmVycmlkZTsKKworICBKU19NRVRIT0QoZXhlY3V0ZSwgQ0pYX1dzZGxDb25uZWN0aW9uKTsKKworICBKU19QUk9QKGRhdGFEZXNjcmlwdGlvbik7CisgIEpTX1BST1AoZXhlY3V0ZSk7CisKKyBwcml2YXRlOgorICBzdGF0aWMgY29uc3QgQ0pYX01ldGhvZFNwZWMgTWV0aG9kU3BlY3NbXTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX1dTRExDT05ORUNUSU9OX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfeGZhLmNwcCBiL2Z4anMveGZhL2NqeF94ZmEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMGQ3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfeGZhLmNwcApAQCAtMCwwICsxLDM5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfeGZhLmgiCisKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV9lbmdpbmUuaCIKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV92YWx1ZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeGZhLmgiCisKK0NKWF9YZmE6OkNKWF9YZmEoQ1hGQV9YZmEqIG5vZGUpIDogQ0pYX01vZGVsKG5vZGUpIHt9CisKK0NKWF9YZmE6On5DSlhfWGZhKCkgPSBkZWZhdWx0OworCit2b2lkIENKWF9YZmE6OnRoaXNWYWx1ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgaWYgKGJTZXR0aW5nKQorICAgIHJldHVybjsKKworICBDWEZBX09iamVjdCogcFRoaXMgPSBHZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKTsKKyAgQVNTRVJUKHBUaGlzKTsKKyAgcFZhbHVlLT5Bc3NpZ24oR2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwVGhpcykpOworfQorCit2b2lkIENKWF9YZmE6OnRpbWVTdGFtcChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyaWJ1dGUpIHsKKyAgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Cit9CisKK3ZvaWQgQ0pYX1hmYTo6dXVpZChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF94ZmEuaCBiL2Z4anMveGZhL2NqeF94ZmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzhlZDdlCi0tLSAvZGV2L251bGwKKysrIGIvZnhqcy94ZmEvY2p4X3hmYS5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfWEZBX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9YRkFfSF8KKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9tb2RlbC5oIgorCitjbGFzcyBDWEZBX1hmYTsKKworY2xhc3MgQ0pYX1hmYSA6IHB1YmxpYyBDSlhfTW9kZWwgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ0pYX1hmYShDWEZBX1hmYSogbm9kZSk7CisgIH5DSlhfWGZhKCkgb3ZlcnJpZGU7CisKKyAgSlNfUFJPUCh0aGlzVmFsdWUpOyAvKiB0aGlzICovCisgIEpTX1BST1AodGltZVN0YW1wKTsKKyAgSlNfUFJPUCh1dWlkKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX1hGQV9IXwpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3htbGNvbm5lY3Rpb24uY3BwIGIvZnhqcy94ZmEvY2p4X3htbGNvbm5lY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MjJhYWIKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfeG1sY29ubmVjdGlvbi5jcHAKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3htbGNvbm5lY3Rpb24uaCIKKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3htbGNvbm5lY3Rpb24uaCIKKworQ0pYX1htbENvbm5lY3Rpb246OkNKWF9YbWxDb25uZWN0aW9uKENYRkFfWG1sQ29ubmVjdGlvbiogbm9kZSkKKyAgICA6IENKWF9Ob2RlKG5vZGUpIHt9CisKK0NKWF9YbWxDb25uZWN0aW9uOjp+Q0pYX1htbENvbm5lY3Rpb24oKSA9IGRlZmF1bHQ7CisKK3ZvaWQgQ0pYX1htbENvbm5lY3Rpb246OmRhdGFEZXNjcmlwdGlvbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKK30KZGlmZiAtLWdpdCBhL2Z4anMveGZhL2NqeF94bWxjb25uZWN0aW9uLmggYi9meGpzL3hmYS9janhfeG1sY29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYzVjMzcKLS0tIC9kZXYvbnVsbAorKysgYi9meGpzL3hmYS9janhfeG1sY29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBGWEpTX1hGQV9DSlhfWE1MQ09OTkVDVElPTl9IXworI2RlZmluZSBGWEpTX1hGQV9DSlhfWE1MQ09OTkVDVElPTl9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKworY2xhc3MgQ1hGQV9YbWxDb25uZWN0aW9uOworCitjbGFzcyBDSlhfWG1sQ29ubmVjdGlvbiA6IHB1YmxpYyBDSlhfTm9kZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDSlhfWG1sQ29ubmVjdGlvbihDWEZBX1htbENvbm5lY3Rpb24qIG5vZGUpOworICB+Q0pYX1htbENvbm5lY3Rpb24oKSBvdmVycmlkZTsKKworICBKU19QUk9QKGRhdGFEZXNjcmlwdGlvbik7Cit9OworCisjZW5kaWYgIC8vIEZYSlNfWEZBX0NKWF9YTUxDT05ORUNUSU9OX0hfCmRpZmYgLS1naXQgYS9meGpzL3hmYS9janhfeHNkY29ubmVjdGlvbi5jcHAgYi9meGpzL3hmYS9janhfeHNkY29ubmVjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3ZDQyYQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF94c2Rjb25uZWN0aW9uLmNwcApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfeHNkY29ubmVjdGlvbi5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeHNkY29ubmVjdGlvbi5oIgorCitDSlhfWHNkQ29ubmVjdGlvbjo6Q0pYX1hzZENvbm5lY3Rpb24oQ1hGQV9Yc2RDb25uZWN0aW9uKiBub2RlKQorICAgIDogQ0pYX05vZGUobm9kZSkge30KKworQ0pYX1hzZENvbm5lY3Rpb246On5DSlhfWHNkQ29ubmVjdGlvbigpID0gZGVmYXVsdDsKKwordm9pZCBDSlhfWHNkQ29ubmVjdGlvbjo6ZGF0YURlc2NyaXB0aW9uKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0cmlidXRlKSB7CisgIFNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nKHBWYWx1ZSwgYlNldHRpbmcsIGVBdHRyaWJ1dGUpOworfQpkaWZmIC0tZ2l0IGEvZnhqcy94ZmEvY2p4X3hzZGNvbm5lY3Rpb24uaCBiL2Z4anMveGZhL2NqeF94c2Rjb25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZjNzlhMQotLS0gL2Rldi9udWxsCisrKyBiL2Z4anMveGZhL2NqeF94c2Rjb25uZWN0aW9uLmgKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIEZYSlNfWEZBX0NKWF9YU0RDT05ORUNUSU9OX0hfCisjZGVmaW5lIEZYSlNfWEZBX0NKWF9YU0RDT05ORUNUSU9OX0hfCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorCitjbGFzcyBDWEZBX1hzZENvbm5lY3Rpb247CisKK2NsYXNzIENKWF9Yc2RDb25uZWN0aW9uIDogcHVibGljIENKWF9Ob2RlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENKWF9Yc2RDb25uZWN0aW9uKENYRkFfWHNkQ29ubmVjdGlvbiogbm9kZSk7CisgIH5DSlhfWHNkQ29ubmVjdGlvbigpIG92ZXJyaWRlOworCisgIEpTX1BST1AoZGF0YURlc2NyaXB0aW9uKTsKK307CisKKyNlbmRpZiAgLy8gRlhKU19YRkFfQ0pYX1hTRENPTk5FQ1RJT05fSF8KZGlmZiAtLWdpdCBhL2luZnJhL2NvbmZpZy9jcS5jZmcgYi9pbmZyYS9jb25maWcvY3EuY2ZnCmluZGV4IDcwNjJlNDMuLjZkMmE2OTkgMTAwNjQ0Ci0tLSBhL2luZnJhL2NvbmZpZy9jcS5jZmcKKysrIGIvaW5mcmEvY29uZmlnL2NxLmNmZwpAQCAtNywxNSArNyw4IEBACiBjcV9zdGF0dXNfdXJsOiAiaHR0cHM6Ly9jaHJvbWl1bS1jcS1zdGF0dXMuYXBwc3BvdC5jb20iCiAKIGdlcnJpdCB7fQotcmlldHZlbGQgewotICB1cmw6ICJodHRwczovL2NvZGVyZXZpZXcuY2hyb21pdW0ub3JnIgotfQogCiB2ZXJpZmllcnMgewotICByZXZpZXdlcl9sZ3RtIHsKLSAgICAgY29tbWl0dGVyX2xpc3Q6ICJwcm9qZWN0LXBkZml1bS1jb21taXR0ZXJzIgotICAgICBkcnlfcnVuX2FjY2Vzc19saXN0OiAicHJvamVjdC1wZGZpdW0tdHJ5am9iLWFjY2VzcyIKLSAgfQogICBnZXJyaXRfY3FfYWJpbGl0eSB7CiAgICAgIGNvbW1pdHRlcl9saXN0OiAicHJvamVjdC1wZGZpdW0tY29tbWl0dGVycyIKICAgICAgZHJ5X3J1bl9hY2Nlc3NfbGlzdDogInByb2plY3QtcGRmaXVtLXRyeWpvYi1hY2Nlc3MiCkBAIC00Miw2ICszNSw5IEBACiAgICAgICAgIG5hbWU6ICJsaW51eF9hc2FuX2xzYW4iCiAgICAgICB9CiAgICAgICBidWlsZGVycyB7CisgICAgICAgIG5hbWU6ICJsaW51eF9tc2FuIgorICAgICAgfQorICAgICAgYnVpbGRlcnMgewogICAgICAgICBuYW1lOiAibGludXhfbm9fdjgiCiAgICAgICB9CiAgICAgICBidWlsZGVycyB7CkBAIC01NCw2ICs1MCw5IEBACiAgICAgICAgIG5hbWU6ICJsaW51eF94ZmFfYXNhbl9sc2FuIgogICAgICAgfQogICAgICAgYnVpbGRlcnMgeworICAgICAgICBuYW1lOiAibGludXhfeGZhX21zYW4iCisgICAgICB9CisgICAgICBidWlsZGVycyB7CiAgICAgICAgIG5hbWU6ICJsaW51eF94ZmFfcmVsIgogICAgICAgfQogICAgICAgYnVpbGRlcnMgewpAQCAtNzUsNiArNzQsOSBAQAogICAgICAgICBuYW1lOiAid2luIgogICAgICAgfQogICAgICAgYnVpbGRlcnMgeworICAgICAgICBuYW1lOiAid2luX2FzYW4iCisgICAgICB9CisgICAgICBidWlsZGVycyB7CiAgICAgICAgIG5hbWU6ICJ3aW5fbm9fdjgiCiAgICAgICB9CiAgICAgICBidWlsZGVycyB7CkBAIC04NywxMCArODksMTMgQEAKICAgICAgICAgbmFtZTogIndpbl94ZmFfMzIiCiAgICAgICB9CiAgICAgICBidWlsZGVycyB7Ci0gICAgICAgIG5hbWU6ICJ3aW5feGZhX2NsYW5nIgorICAgICAgICBuYW1lOiAid2luX3hmYV9hc2FuIgogICAgICAgfQogICAgICAgYnVpbGRlcnMgewotICAgICAgICBuYW1lOiAid2luX3hmYV9jbGFuZ18zMiIKKyAgICAgICAgbmFtZTogIndpbl94ZmFfbXN2YyIKKyAgICAgIH0KKyAgICAgIGJ1aWxkZXJzIHsKKyAgICAgICAgbmFtZTogIndpbl94ZmFfbXN2Y18zMiIKICAgICAgIH0KICAgICAgIGJ1aWxkZXJzIHsKICAgICAgICAgbmFtZTogIndpbl94ZmFfcmVsIgpkaWZmIC0tZ2l0IGEvbmF2YmFyLm1kIGIvbmF2YmFyLm1kCmluZGV4IGE3ZjkzMDcuLmMxMmNmMTEgMTAwNjQ0Ci0tLSBhL25hdmJhci5tZAorKysgYi9uYXZiYXIubWQKQEAgLTksNSArOSw2IEBACiAqIFtIb21lXSgvUkVBRE1FLm1kKQogKiBbR2V0dGluZyBTdGFydGVkXSgvZG9jcy9nZXR0aW5nLXN0YXJ0ZWQubWQpCiAqIFtWOCBHZXR0aW5nIFN0YXJ0ZWRdKC9kb2NzL3Y4LWdldHRpbmctc3RhcnRlZC5tZCkKKyogW1NhZmV0eU5ldF0oL2RvY3Mvc2FmZXR5bmV0Lm1kKQogCiBbaG9tZV06IC9SRUFETUUubWQKZGlmZiAtLWdpdCBhL3BkZml1bS5icCBiL3BkZml1bS5icAppbmRleCBkMWE0ZjE2Li5lMTg4MjgwIDEwMDY0NAotLS0gYS9wZGZpdW0uYnAKKysrIGIvcGRmaXVtLmJwCkBAIC0xLDQxICsxLDMxIEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnBkZml1bSIsCi0gICAgZGVmYXVsdHM6IFsicGRmaXVtLWRlZmF1bHRzIl0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1EVjhfREVQUkVDQVRJT05fV0FSTklOR1MiLAotICAgICAgICAiLURfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIsCi0KLSAgICAgICAgLy8gTWFzayBzb21lIHdhcm5pbmdzLiBUaGVzZSBhcmUgYmVuaWduLCBidXQgd2UgcHJvYmFibHkgd2FudCB0byBmaXggdGhlbQotICAgICAgICAvLyB1cHN0cmVhbSBhdCBzb21lIHBvaW50LgotICAgICAgICAiLVduby1zaWduLWNvbXBhcmUiLAotICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKLSAgICBdLAorICAgIGRlZmF1bHRzOiBbInBkZml1bS1jb3JlIl0sCiAKICAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlicGRmaXVtZm9ybWZpbGxlciIsCi0gICAgICAgICJsaWJwZGZpdW1wZGZ3aW5kb3ciLAotICAgICAgICAibGlicGRmaXVtamF2YXNjcmlwdCIsCi0gICAgICAgICJsaWJwZGZpdW1mcGRmYXBpIiwKLSAgICAgICAgImxpYnBkZml1bWZ4Z2UiLAotICAgICAgICAibGlicGRmaXVtZnhlZGl0IiwKLSAgICAgICAgImxpYnBkZml1bWZwZGZ0ZXh0IiwKLSAgICAgICAgImxpYnBkZml1bWZ4Y3J0IiwKLSAgICAgICAgImxpYnBkZml1bWZ4Y29kZWMiLAotICAgICAgICAibGlicGRmaXVtZnBkZmRvYyIsCiAgICAgICAgICJsaWJwZGZpdW1mZHJtIiwKLSAgICAgICAgImxpYnBkZml1bWFnZzIzIiwKKyAgICAgICAgImxpYnBkZml1bWZvcm1maWxsZXIiLAorICAgICAgICAibGlicGRmaXVtZnBkZmFwaSIsCisgICAgICAgICJsaWJwZGZpdW1mcGRmZG9jIiwKKyAgICAgICAgImxpYnBkZml1bWZwZGZ0ZXh0IiwKKyAgICAgICAgImxpYnBkZml1bWZ4Y29kZWMiLAorICAgICAgICAibGlicGRmaXVtZnhjcnQiLAorICAgICAgICAibGlicGRmaXVtZnhnZSIsCisgICAgICAgICJsaWJwZGZpdW1meGpzIiwKKyAgICAgICAgImxpYnBkZml1bXB3bCIsCisgICAgICAgICJsaWJwZGZpdW1meF9hZ2ciLAogICAgICAgICAibGlicGRmaXVtYmlnaW50IiwKLSAgICAgICAgImxpYnBkZml1bWxjbXMiLAotICAgICAgICAibGlicGRmaXVtanBlZyIsCi0gICAgICAgICJsaWJwZGZpdW1vcGVuanBlZyIsCi0gICAgICAgICJsaWJwZGZpdW16bGliIiwKKyAgICAgICAgImxpYnBkZml1bXBkZml1bWJhc2UiLAorICAgICAgICAibGlicGRmaXVtbGNtczIiLAorICAgICAgICAibGlicGRmaXVtZnhfbGlib3BlbmpwZWciLAogICAgIF0sCiAKICAgICAvLyBUT0RPOiBmaWd1cmUgb3V0IHdoeSB0dXJuaW5nIG9uIGV4Y2VwdGlvbnMgcmVxdWlyZXMgbWFudWFsbHkgbGlua2luZyBsaWJkbAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJkbCIsCiAgICAgICAgICJsaWJmdDIiLAorICAgICAgICAibGlieiIsCisgICAgICAgICJsaWJqcGVnIiwKICAgICBdLAogCiAgICAgc3JjczogWwpAQCAtNjAsNiArNTAsOSBAQAogICAgICAgICAiZnBkZnNkay9mcGRmX3N0cnVjdHRyZWUuY3BwIiwKICAgICAgICAgImZwZGZzZGsvZnBkZl9zeXNmb250aW5mby5jcHAiLAogICAgICAgICAiZnBkZnNkay9mcGRmX3RyYW5zZm9ybXBhZ2UuY3BwIiwKKyAgICAgICAgImZwZGZzZGsvZnBkZmFubm90LmNwcCIsCisgICAgICAgICJmcGRmc2RrL2ZwZGZhdHRhY2htZW50LmNwcCIsCisgICAgICAgICJmcGRmc2RrL2ZwZGZjYXRhbG9nLmNwcCIsCiAgICAgICAgICJmcGRmc2RrL2ZwZGZkb2MuY3BwIiwKICAgICAgICAgImZwZGZzZGsvZnBkZmVkaXRpbWcuY3BwIiwKICAgICAgICAgImZwZGZzZGsvZnBkZmVkaXRwYWdlLmNwcCIsCkBAIC03MSw5ICs2NCwxNSBAQAogICAgICAgICAiZnBkZnNkay9mcGRmdGV4dC5jcHAiLAogICAgICAgICAiZnBkZnNkay9mcGRmdmlldy5jcHAiLAogICAgICAgICAiZnBkZnNkay9mc2RrX2FjdGlvbmhhbmRsZXIuY3BwIiwKKyAgICAgICAgImZwZGZzZGsvZnNka19maWxld3JpdGVhZGFwdGVyLmNwcCIsCiAgICAgICAgICJmcGRmc2RrL2ZzZGtfcGF1c2VhZGFwdGVyLmNwcCIsCiAgICAgICAgICJmcGRmc2RrL3BkZnNka19maWVsZGFjdGlvbi5jcHAiLAogICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbInB1YmxpYyJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9mcmVldHlwZS9pbmNsdWRlIiwKKyAgICAgICAgImV4dGVybmFsL2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUiLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9wZGZpdW0uZ25pIGIvcGRmaXVtLmduaQppbmRleCA4Y2UwOWY5Li5lNDg3NTBlIDEwMDY0NAotLS0gYS9wZGZpdW0uZ25pCisrKyBiL3BkZml1bS5nbmkKQEAgLTcsOSArNywxMyBAQAogIyBUaGlzIGZpbGUgY29udGFpbnMgUERGaXVtLXJlbGF0ZWQgYnVpbGQgZmxhZ3MuCiAKIGRlY2xhcmVfYXJncygpIHsKLSAgIyBPbiBBbmRyb2lkIHRoZXJlJ3Mgbm8gc3lzdGVtIEZyZWVUeXBlLiBPbiBXaW5kb3dzIGFuZCBNYWMsIG9ubHkgYSBmZXcKLSAgIyBtZXRob2RzIGFyZSB1c2VkIGZyb20gaXQuCi0gIHBkZml1bV9idW5kbGVfZnJlZXR5cGUgPSAhaXNfbGludXgKKyAgIyBCdWlsZCBQREZpdW0gZWl0aGVyOgorICAjIDEpIFdoZW4gc2V0IHRvIHRydWUsIHdpdGggYSBidW5kbGVkIEZyZWVUeXBlLCBidWlsdCBmcm9tIEZyZWVUeXBlIHNvdXJjZQorICAjICAgIGNvZGUgaW4gLy90aGlyZF9wYXJ0eS9mcmVldHlwZSBhbmQgUERGaXVtJ3MgRnJlZVR5cGUgY29uZmlncyBpbgorICAjICAgIHRoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUuCisgICMgMikgV2hlbiBzZXQgdG8gZmFsc2UsIHVzZSB3aGF0ZXZlciBGcmVlVHlwZSB0YXJnZXQgaXMgZGVmaW5lZCBpbgorICAjICAgIC8vYnVpbGQvY29uZmlnL2ZyZWV0eXBlLgorICBwZGZfYnVuZGxlX2ZyZWV0eXBlID0gcGRmX2J1bmRsZV9mcmVldHlwZV9vdmVycmlkZQogCiAgICMgQnVpbGQgUERGaXVtIGVpdGhlciB3aXRoIG9yIHdpdGhvdXQgdjggc3VwcG9ydC4KICAgcGRmX2VuYWJsZV92OCA9IHBkZl9lbmFibGVfdjhfb3ZlcnJpZGUKQEAgLTI5LDEwICszMywxMiBAQAogICAjIElmIFhGQSwgYWxzbyBzdXBwb3J0IHBuZyBjb2RlYy4gSWdub3JlZCBpZiBub3QgWEZBLgogICBwZGZfZW5hYmxlX3hmYV90aWZmID0gdHJ1ZQogCi0gICMgQnVpbGQgUERGaXVtIGFnYWluc3Qgc2tpYSAoZXhwZXJpbWVudGFsKSByYXRoZXIgdGhhbiBhZ2cuIFVzZSBTa2lhIHRvIGRyYXcgZXZlcnl0aGluZy4KKyAgIyBCdWlsZCBQREZpdW0gYWdhaW5zdCBTa2lhIChleHBlcmltZW50YWwpIHJhdGhlciB0aGFuIEFHRy4gVXNlIFNraWEgdG8gZHJhdworICAjIGV2ZXJ5dGhpbmcuCiAgIHBkZl91c2Vfc2tpYSA9IHBkZl91c2Vfc2tpYV9vdmVycmlkZQogCi0gICMgQnVpbGQgUERGaXVtIGFnYWluc3Qgc2tpYSAoZXhwZXJpbWVudGFsKSByYXRoZXIgdGhhbiBhZ2cuIFVzZSBTa2lhIHRvIGRyYXcgcGF0aHMuCisgICMgQnVpbGQgUERGaXVtIGFnYWluc3QgU2tpYSAoZXhwZXJpbWVudGFsKSByYXRoZXIgdGhhbiBBR0cuIFVzZSBTa2lhIHRvIGRyYXcKKyAgIyBwYXRocy4KICAgcGRmX3VzZV9za2lhX3BhdGhzID0gcGRmX3VzZV9za2lhX3BhdGhzX292ZXJyaWRlCiAKICAgIyBCdWlsZCBQREZpdW0gd2l0aCBvciB3aXRob3V0IGV4cGVyaW1lbnRhbCB3aW4zMiBHREkgQVBJcy4KQEAgLTQxLDYgKzQ3LDI1IEBACiAgICMgQnVpbGQgUERGaXVtIHN0YW5kYWxvbmUKICAgcGRmX2lzX3N0YW5kYWxvbmUgPSBmYWxzZQogCisgICMgQnVpbGQgYSBjb21wbGV0ZSBzdGF0aWMgbGlicmFyeQorICBwZGZfaXNfY29tcGxldGVfbGliID0gZmFsc2UKKworICAjIEVuYWJsZSBjYWxsZ3JpbmQgZm9yIHBlcmZvcm1hbmNlIHByb2ZpbGluZworICBlbmFibGVfY2FsbGdyaW5kID0gZmFsc2UKKwogICAjIEVuYWJsZSBjb3ZlcmFnZSBpbmZvcm1hdGlvbgogICB1c2VfY292ZXJhZ2UgPSBmYWxzZQorCisgICMgRG9uJ3QgYnVpbGQgYWdhaW5zdCBidW5kbGVkIHpsaWIuCisgIHVzZV9zeXN0ZW1femxpYiA9IGZhbHNlCisKKyAgIyBEb24ndCBidWlsZCBhZ2FpbnN0IGJ1bmRsZWQgbGNtczIuCisgIHVzZV9zeXN0ZW1fbGNtczIgPSBmYWxzZQorCisgICMgRG9uJ3QgYnVpbGQgYWdhaW5zdCBidW5kbGVkIGxpYnBuZy4KKyAgdXNlX3N5c3RlbV9saWJwbmcgPSBmYWxzZQorfQorCitpZiAocGRmX3VzZV9za2lhICYmIHBkZl91c2Vfc2tpYV9wYXRocykgeworICBhc3NlcnQoZmFsc2UsICJFbmFibGUgYXQgbW9zdCBPTkUgb2YgcGRmX3VzZV9za2lhIGFuZCBwZGZfdXNlX3NraWFfcGF0aHMiKQogfQpkaWZmIC0tZ2l0IGEvcGRmaXVtZmRybS5icCBiL3BkZml1bWZkcm0uYnAKaW5kZXggZjI4Yzc5ZS4uYjU5ODk4ZiAxMDA2NDQKLS0tIGEvcGRmaXVtZmRybS5icAorKysgYi9wZGZpdW1mZHJtLmJwCkBAIC0xLDE2ICsxLDkgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlicGRmaXVtZmRybSIsCi0gICAgZGVmYXVsdHM6IFsicGRmaXVtLWRlZmF1bHRzIl0sCisgICAgZGVmYXVsdHM6IFsicGRmaXVtLWNvcmUiXSwKIAotICAgIGNmbGFnczogWwotICAgICAgICAiLURPUEpfU1RBVElDIiwKLSAgICAgICAgIi1EVjhfREVQUkVDQVRJT05fV0FSTklOR1MiLAotICAgICAgICAiLURfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIsCi0KLSAgICAgICAgLy8gTWFzayBzb21lIHdhcm5pbmdzLiBUaGVzZSBhcmUgYmVuaWduLCBidXQgd2UgcHJvYmFibHkgd2FudCB0byBmaXggdGhlbQotICAgICAgICAvLyB1cHN0cmVhbSBhdCBzb21lIHBvaW50LgotICAgICAgICAiLVduby1zaWduLWNvbXBhcmUiLAotICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlicGRmaXVtZnhjcnQiLAogICAgIF0sCiAKICAgICBzcmNzOiBbCmRpZmYgLS1naXQgYS9wZGZpdW1mb3JtZmlsbGVyLmJwIGIvcGRmaXVtZm9ybWZpbGxlci5icAppbmRleCA4MjA2ZjY2Li5hNjYxOWRmIDEwMDY0NAotLS0gYS9wZGZpdW1mb3JtZmlsbGVyLmJwCisrKyBiL3BkZml1bWZvcm1maWxsZXIuYnAKQEAgLTEsMjAgKzEsMTQgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlicGRmaXVtZm9ybWZpbGxlciIsCi0gICAgZGVmYXVsdHM6IFsicGRmaXVtLWRlZmF1bHRzIl0sCisgICAgZGVmYXVsdHM6IFsicGRmaXVtLWNvcmUiXSwKIAotICAgIGNmbGFnczogWwotICAgICAgICAiLURPUEpfU1RBVElDIiwKLSAgICAgICAgIi1EVjhfREVQUkVDQVRJT05fV0FSTklOR1MiLAotICAgICAgICAiLURfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIsCi0KLSAgICAgICAgLy8gTWFzayBzb21lIHdhcm5pbmdzLiBUaGVzZSBhcmUgYmVuaWduLCBidXQgd2UgcHJvYmFibHkgd2FudCB0byBmaXggdGhlbQotICAgICAgICAvLyB1cHN0cmVhbSBhdCBzb21lIHBvaW50LgotICAgICAgICAiLVduby1zaWduLWNvbXBhcmUiLAotICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlicGRmaXVtZnhjcnQiLAogICAgIF0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJmcGRmc2RrL2Zvcm1maWxsZXIvY2JhX2ZvbnRtYXAuY3BwIiwKKyAgICAgICAgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2J1dHRvbi5jcHAiLAogICAgICAgICAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfY2hlY2tib3guY3BwIiwKICAgICAgICAgImZwZGZzZGsvZm9ybWZpbGxlci9jZmZsX2NvbWJvYm94LmNwcCIsCiAgICAgICAgICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9mb3JtZmlsbGVyLmNwcCIsCkBAIC0yMyw2ICsxNyw3IEBACiAgICAgICAgICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9wdXNoYnV0dG9uLmNwcCIsCiAgICAgICAgICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF9yYWRpb2J1dHRvbi5jcHAiLAogICAgICAgICAiZnBkZnNkay9mb3JtZmlsbGVyL2NmZmxfdGV4dGZpZWxkLmNwcCIsCisgICAgICAgICJmcGRmc2RrL2Zvcm1maWxsZXIvY2ZmbF90ZXh0b2JqZWN0LmNwcCIsCiAgICAgXSwKIAogICAgIGluY2x1ZGVfZGlyczogWwpkaWZmIC0tZ2l0IGEvcGRmaXVtZnBkZmFwaS5icCBiL3BkZml1bWZwZGZhcGkuYnAKaW5kZXggZTJmNGU1MS4uMmJlYjljNiAxMDA2NDQKLS0tIGEvcGRmaXVtZnBkZmFwaS5icAorKysgYi9wZGZpdW1mcGRmYXBpLmJwCkBAIC0xLDE3ICsxLDExIEBACiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnBkZml1bWZwZGZhcGkiLAotICAgIGRlZmF1bHRzOiBbInBkZml1bS1kZWZhdWx0cyJdLAorICAgIGRlZmF1bHRzOiBbInBkZml1bS1jb3JlIl0sCiAKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1ET1BKX1NUQVRJQyIsCi0gICAgICAgICItRFY4X0RFUFJFQ0FUSU9OX1dBUk5JTkdTIiwKLSAgICAgICAgIi1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiLAotCi0gICAgICAgIC8vIE1hc2sgc29tZSB3YXJuaW5ncy4gVGhlc2UgYXJlIGJlbmlnbiwgYnV0IHdlIHByb2JhYmx5IHdhbnQgdG8gZml4IHRoZW0KLSAgICAgICAgLy8gdXBzdHJlYW0gYXQgc29tZSBwb2ludC4KLSAgICAgICAgIi1Xbm8tc2lnbi1jb21wYXJlIiwKLSAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCi0gICAgICAgICItV25vLW1pc3NpbmctZmllbGQtaW5pdGlhbGl6ZXJzIiwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlicGRmaXVtZnhjcnQiLAorICAgICAgICAibGlicGRmaXVtbGNtczIiLAorICAgICAgICAibGlicGRmaXVtZmRybSIsCiAgICAgXSwKIAogICAgIHNyY3M6IFsKQEAgLTc5LDE5ICs3MywyNiBAQAogICAgICAgICAiY29yZS9mcGRmYXBpL2NtYXBzL2ZwZGZfY21hcHMuY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmFwaS9jcGRmX21vZHVsZW1nci5jcHAiLAogICAgICAgICAiY29yZS9mcGRmYXBpL2NwZGZfcGFnZXJlbmRlcmNvbnRleHQuY3BwIiwKKyAgICAgICAgImNvcmUvZnBkZmFwaS9lZGl0L2NwZGZfY3JlYXRvci5jcHAiLAorICAgICAgICAiY29yZS9mcGRmYXBpL2VkaXQvY3BkZl9lbmNyeXB0b3IuY3BwIiwKKyAgICAgICAgImNvcmUvZnBkZmFwaS9lZGl0L2NwZGZfZmxhdGVlbmNvZGVyLmNwcCIsCiAgICAgICAgICJjb3JlL2ZwZGZhcGkvZWRpdC9jcGRmX3BhZ2Vjb250ZW50Z2VuZXJhdG9yLmNwcCIsCi0gICAgICAgICJjb3JlL2ZwZGZhcGkvZWRpdC9mcGRmX2VkaXRfY3JlYXRlLmNwcCIsCisgICAgICAgICJjb3JlL2ZwZGZhcGkvZm9udC9jZnhfY3R0Z3N1YnRhYmxlLmNwcCIsCisgICAgICAgICJjb3JlL2ZwZGZhcGkvZm9udC9jZnhfc3RvY2tmb250YXJyYXkuY3BwIiwKKyAgICAgICAgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfY2lkMnVuaWNvZGVtYXAuY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfY2lkZm9udC5jcHAiLAorICAgICAgICAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9jbWFwLmNwcCIsCisgICAgICAgICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NtYXBtYW5hZ2VyLmNwcCIsCisgICAgICAgICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NtYXBwYXJzZXIuY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udC5jcHAiLAogICAgICAgICAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9mb250ZW5jb2RpbmcuY3BwIiwKKyAgICAgICAgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfZm9udGdsb2JhbHMuY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfc2ltcGxlZm9udC5jcHAiLAorICAgICAgICAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl90b3VuaWNvZGVtYXAuY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfdHJ1ZXR5cGVmb250LmNwcCIsCiAgICAgICAgICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX3R5cGUxZm9udC5jcHAiLAogICAgICAgICAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl90eXBlM2NoYXIuY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmFwaS9mb250L2NwZGZfdHlwZTNmb250LmNwcCIsCi0gICAgICAgICJjb3JlL2ZwZGZhcGkvZm9udC9mcGRmX2ZvbnQuY3BwIiwKLSAgICAgICAgImNvcmUvZnBkZmFwaS9mb250L2ZwZGZfZm9udF9jaWQuY3BwIiwKLSAgICAgICAgImNvcmUvZnBkZmFwaS9mb250L3R0Z3N1YnRhYmxlLmNwcCIsCiAgICAgICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2FsbHN0YXRlcy5jcHAiLAogICAgICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jbGlwcGF0aC5jcHAiLAogICAgICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9jb2xvci5jcHAiLApAQCAtMTAwLDExICsxMDEsMTUgQEAKICAgICAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29udGVudG1hcmsuY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfY29udGVudG1hcmtpdGVtLmNwcCIsCiAgICAgICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2NvbnRlbnRwYXJzZXIuY3BwIiwKKyAgICAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZGV2aWNlY3MuY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZG9jcGFnZWRhdGEuY3BwIiwKKyAgICAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZXhwaW50ZnVuYy5jcHAiLAogICAgICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9mb3JtLmNwcCIsCiAgICAgICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2Zvcm1vYmplY3QuY3BwIiwKKyAgICAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZnVuY3Rpb24uY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfZ2VuZXJhbHN0YXRlLmNwcCIsCiAgICAgICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX2dyYXBoaWNzdGF0ZXMuY3BwIiwKKyAgICAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfaWNjcHJvZmlsZS5jcHAiLAogICAgICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9pbWFnZS5jcHAiLAogICAgICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9pbWFnZW9iamVjdC5jcHAiLAogICAgICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9tZXNoc3RyZWFtLmNwcCIsCkBAIC0xMTYsMTggKzEyMSwyMiBAQAogICAgICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYXRoLmNwcCIsCiAgICAgICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3BhdGhvYmplY3QuY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGF0dGVybi5jcHAiLAorICAgICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9wYXR0ZXJuY3MuY3BwIiwKKyAgICAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcHNlbmdpbmUuY3BwIiwKKyAgICAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcHNmdW5jLmNwcCIsCisgICAgICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3NhbXBsZWRmdW5jLmNwcCIsCiAgICAgICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3NoYWRpbmdvYmplY3QuY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc2hhZGluZ3BhdHRlcm4uY3BwIiwKKyAgICAgICAgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfc3RpdGNoZnVuYy5jcHAiLAogICAgICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl9zdHJlYW1jb250ZW50cGFyc2VyLmNwcCIsCiAgICAgICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3N0cmVhbXBhcnNlci5jcHAiLAogICAgICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl90ZXh0b2JqZWN0LmNwcCIsCiAgICAgICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9jcGRmX3RleHRzdGF0ZS5jcHAiLAogICAgICAgICAiY29yZS9mcGRmYXBpL3BhZ2UvY3BkZl90aWxpbmdwYXR0ZXJuLmNwcCIsCi0gICAgICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9mcGRmX3BhZ2VfY29sb3JzLmNwcCIsCi0gICAgICAgICJjb3JlL2ZwZGZhcGkvcGFnZS9mcGRmX3BhZ2VfZnVuYy5jcHAiLAogICAgICAgICAiY29yZS9mcGRmYXBpL3BhcnNlci9jZmRmX2RvY3VtZW50LmNwcCIsCiAgICAgICAgICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9ib29sZWFuLmNwcCIsCisgICAgICAgICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfY3Jvc3NfcmVmX2F2YWlsLmNwcCIsCiAgICAgICAgICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfY3J5cHRvX2hhbmRsZXIuY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kYXRhX2F2YWlsLmNwcCIsCiAgICAgICAgICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5jcHAiLApAQCAtMTM5LDcgKzE0OCwxMSBAQAogICAgICAgICAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bGwuY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9udW1iZXIuY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3QuY3BwIiwKKyAgICAgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3RfYXZhaWwuY3BwIiwKKyAgICAgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9vYmplY3Rfd2Fsa2VyLmNwcCIsCisgICAgICAgICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfcGFnZV9vYmplY3RfYXZhaWwuY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9wYXJzZXIuY3BwIiwKKyAgICAgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9yZWFkX3ZhbGlkYXRvci5jcHAiLAogICAgICAgICAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3JlZmVyZW5jZS5jcHAiLAogICAgICAgICAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3NlY3VyaXR5X2hhbmRsZXIuY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zaW1wbGVfcGFyc2VyLmNwcCIsCmRpZmYgLS1naXQgYS9wZGZpdW1mcGRmZG9jLmJwIGIvcGRmaXVtZnBkZmRvYy5icAppbmRleCAxZDk3NGY2Li5jMzQ5M2E4IDEwMDY0NAotLS0gYS9wZGZpdW1mcGRmZG9jLmJwCisrKyBiL3BkZml1bWZwZGZkb2MuYnAKQEAgLTEsMjEgKzEsMTMgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlicGRmaXVtZnBkZmRvYyIsCi0gICAgZGVmYXVsdHM6IFsicGRmaXVtLWRlZmF1bHRzIl0sCisgICAgZGVmYXVsdHM6IFsicGRmaXVtLWNvcmUiXSwKIAotICAgIGNmbGFnczogWwotICAgICAgICAiLURPUEpfU1RBVElDIiwKLSAgICAgICAgIi1EVjhfREVQUkVDQVRJT05fV0FSTklOR1MiLAotICAgICAgICAiLURfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIsCi0KLSAgICAgICAgLy8gTWFzayBzb21lIHdhcm5pbmdzLiBUaGVzZSBhcmUgYmVuaWduLCBidXQgd2UgcHJvYmFibHkgd2FudCB0byBmaXggdGhlbQotICAgICAgICAvLyB1cHN0cmVhbSBhdCBzb21lIHBvaW50LgotICAgICAgICAiLVduby1zaWduLWNvbXBhcmUiLAotICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlicGRmaXVtZnhjcnQiLAogICAgIF0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJjb3JlL2ZwZGZkb2MvY2xpbmUuY3BwIiwKLSAgICAgICAgImNvcmUvZnBkZmRvYy9jbGluZXMuY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmRvYy9jcGRmX2FhY3Rpb24uY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmRvYy9jcGRmX2FjdGlvbi5jcHAiLAogICAgICAgICAiY29yZS9mcGRmZG9jL2NwZGZfYWN0aW9uZmllbGRzLmNwcCIsCkBAIC0zOSwxNiArMzEsMTUgQEAKICAgICAgICAgImNvcmUvZnBkZmRvYy9jcGRmX251bWJlcnRyZWUuY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmRvYy9jcGRmX29jY29udGV4dC5jcHAiLAogICAgICAgICAiY29yZS9mcGRmZG9jL2NwZGZfcGFnZWxhYmVsLmNwcCIsCisgICAgICAgICJjb3JlL2ZwZGZkb2MvY3BkZl9zdHJ1Y3RlbGVtZW50LmNwcCIsCisgICAgICAgICJjb3JlL2ZwZGZkb2MvY3BkZl9zdHJ1Y3R0cmVlLmNwcCIsCiAgICAgICAgICJjb3JlL2ZwZGZkb2MvY3BkZl92YXJpYWJsZXRleHQuY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmRvYy9jcGRmX3ZpZXdlcnByZWZlcmVuY2VzLmNwcCIsCi0gICAgICAgICJjb3JlL2ZwZGZkb2MvY3B2dF9jb2xvci5jcHAiLAogICAgICAgICAiY29yZS9mcGRmZG9jL2NwdnRfZm9udG1hcC5jcHAiLAogICAgICAgICAiY29yZS9mcGRmZG9jL2NwdnRfZ2VuZXJhdGVhcC5jcHAiLAotICAgICAgICAiY29yZS9mcGRmZG9jL2NwdnRfc2VjdGlvbmluZm8uY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmRvYy9jcHZ0X3dvcmRpbmZvLmNwcCIsCiAgICAgICAgICJjb3JlL2ZwZGZkb2MvY3NlY3Rpb24uY3BwIiwKICAgICAgICAgImNvcmUvZnBkZmRvYy9jdHlwZXNldC5jcHAiLAotICAgICAgICAiY29yZS9mcGRmZG9jL2RvY190YWdnZWQuY3BwIiwKICAgICBdLAogCiAgICAgaW5jbHVkZV9kaXJzOiBbCmRpZmYgLS1naXQgYS9wZGZpdW1mcGRmdGV4dC5icCBiL3BkZml1bWZwZGZ0ZXh0LmJwCmluZGV4IGVmZjYwYzMuLjdhZTc1ZDcgMTAwNjQ0Ci0tLSBhL3BkZml1bWZwZGZ0ZXh0LmJwCisrKyBiL3BkZml1bWZwZGZ0ZXh0LmJwCkBAIC0xLDE2ICsxLDkgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlicGRmaXVtZnBkZnRleHQiLAotICAgIGRlZmF1bHRzOiBbInBkZml1bS1kZWZhdWx0cyJdLAorICAgIGRlZmF1bHRzOiBbInBkZml1bS1jb3JlIl0sCiAKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1ET1BKX1NUQVRJQyIsCi0gICAgICAgICItRFY4X0RFUFJFQ0FUSU9OX1dBUk5JTkdTIiwKLSAgICAgICAgIi1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiLAotCi0gICAgICAgIC8vIE1hc2sgc29tZSB3YXJuaW5ncy4gVGhlc2UgYXJlIGJlbmlnbiwgYnV0IHdlIHByb2JhYmx5IHdhbnQgdG8gZml4IHRoZW0KLSAgICAgICAgLy8gdXBzdHJlYW0gYXQgc29tZSBwb2ludC4KLSAgICAgICAgIi1Xbm8tc2lnbi1jb21wYXJlIiwKLSAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnBkZml1bWZ4Y3J0IiwKICAgICBdLAogCiAgICAgc3JjczogWwpkaWZmIC0tZ2l0IGEvcGRmaXVtZnhjb2RlYy5icCBiL3BkZml1bWZ4Y29kZWMuYnAKaW5kZXggZjFjY2ZiNS4uZjhiNWZiNyAxMDA2NDQKLS0tIGEvcGRmaXVtZnhjb2RlYy5icAorKysgYi9wZGZpdW1meGNvZGVjLmJwCkBAIC0xLDIyICsxLDI2IEBACiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnBkZml1bWZ4Y29kZWMiLAotICAgIGRlZmF1bHRzOiBbInBkZml1bS1kZWZhdWx0cyJdLAorICAgIGRlZmF1bHRzOiBbInBkZml1bS1jb3JlIl0sCiAKICAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1ET1BKX1NUQVRJQyIsCi0gICAgICAgICItRFY4X0RFUFJFQ0FUSU9OX1dBUk5JTkdTIiwKLSAgICAgICAgIi1EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MiLAotCi0gICAgICAgIC8vIE1hc2sgc29tZSB3YXJuaW5ncy4gVGhlc2UgYXJlIGJlbmlnbiwgYnV0IHdlIHByb2JhYmx5IHdhbnQgdG8gZml4IHRoZW0KLSAgICAgICAgLy8gdXBzdHJlYW0gYXQgc29tZSBwb2ludC4KLSAgICAgICAgIi1Xbm8tc2lnbi1jb21wYXJlIiwKICAgICAgICAgIi1Xbm8tcG9pbnRlci10by1pbnQtY2FzdCIsCi0gICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAorICAgICAgICAiLURVU0VfU1lTVEVNX1pMSUIiLAorICAgICAgICAiLURVU0VfU1lTVEVNX0xJQkpQRUciLAogICAgIF0sCiAKLSAgICBzaGFyZWRfbGliczogWyJsaWJ6Il0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnBkZml1bWZ4Y3J0IiwKKyAgICAgICAgImxpYnBkZml1bWxjbXMyIiwKKyAgICAgICAgImxpYnBkZml1bWZ4X2xpYm9wZW5qcGVnIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnoiLAorICAgICAgICAibGlianBlZyIsCisgICAgXSwKIAogICAgIHNyY3M6IFsKKyAgICAgICAgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfc2NhbmxpbmVkZWNvZGVyLmNwcCIsCiAgICAgICAgICJjb3JlL2Z4Y29kZWMvY29kZWMvZnhfY29kZWMuY3BwIiwKICAgICAgICAgImNvcmUvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19mYXguY3BwIiwKICAgICAgICAgImNvcmUvZnhjb2RlYy9jb2RlYy9meF9jb2RlY19mbGF0ZS5jcHAiLApAQCAtMzAsNyArMzQsNiBAQAogICAgICAgICAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0NvbnRleHQuY3BwIiwKICAgICAgICAgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9HcmRQcm9jLmNwcCIsCiAgICAgICAgICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfR3JyZFByb2MuY3BwIiwKLSAgICAgICAgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9Hc2lkUHJvYy5jcHAiLAogICAgICAgICAiY29yZS9meGNvZGVjL2piaWcyL0pCaWcyX0h0cmRQcm9jLmNwcCIsCiAgICAgICAgICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfSHVmZm1hbkRlY29kZXIuY3BwIiwKICAgICAgICAgImNvcmUvZnhjb2RlYy9qYmlnMi9KQmlnMl9IdWZmbWFuVGFibGUuY3BwIiwKZGlmZiAtLWdpdCBhL3BkZml1bWZ4Y3J0LmJwIGIvcGRmaXVtZnhjcnQuYnAKaW5kZXggNjBlNzBmOC4uNWFjYmMyOCAxMDA2NDQKLS0tIGEvcGRmaXVtZnhjcnQuYnAKKysrIGIvcGRmaXVtZnhjcnQuYnAKQEAgLTEsNDUgKzEsNDIgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlicGRmaXVtZnhjcnQiLAotICAgIGRlZmF1bHRzOiBbInBkZml1bS1kZWZhdWx0cyJdLAorICAgIGRlZmF1bHRzOiBbInBkZml1bS1jb3JlIl0sCiAKLSAgICBhcmNoOiB7Ci0gICAgICAgIGFybTY0OiB7Ci0gICAgICAgICAgICBjZmxhZ3M6IFsKLSAgICAgICAgICAgICAgICAiLURfRlhfQ1BVXz1fRlhfWDY0XyIsCi0gICAgICAgICAgICAgICAgIi1mUElDIiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgIH0sCi0gICAgfSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlicGRmaXVtcGRmaXVtYmFzZSIKKyAgICBdLAogCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItRE9QSl9TVEFUSUMiLAotICAgICAgICAiLURWOF9ERVBSRUNBVElPTl9XQVJOSU5HUyIsCi0gICAgICAgICItRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIiwKLQotICAgICAgICAvLyBNYXNrIHNvbWUgd2FybmluZ3MuIFRoZXNlIGFyZSBiZW5pZ24sIGJ1dCB3ZSBwcm9iYWJseSB3YW50IHRvIGZpeCB0aGVtCi0gICAgICAgIC8vIHVwc3RyZWFtIGF0IHNvbWUgcG9pbnQuCi0gICAgICAgICItV25vLXNpZ24tY29tcGFyZSIsCi0gICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJmdDIiLAogICAgIF0sCiAKICAgICBzcmNzOiBbCi0gICAgICAgICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljX2FycmF5LmNwcCIsCi0gICAgICAgICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljX2JzdHJpbmcuY3BwIiwKLSAgICAgICAgImNvcmUvZnhjcnQvZnhfYmFzaWNfYnVmZmVyLmNwcCIsCi0gICAgICAgICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljX2Nvb3Jkcy5jcHAiLAotICAgICAgICAiY29yZS9meGNydC9meF9iYXNpY19nY2MuY3BwIiwKLSAgICAgICAgImNvcmUvZnhjcnQvZnhfYmFzaWNfbWVtbWdyLmNwcCIsCi0gICAgICAgICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljX3V0Zi5jcHAiLAotICAgICAgICAiY29yZS9meGNydC9meF9iYXNpY191dGlsLmNwcCIsCi0gICAgICAgICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljX3dzdHJpbmcuY3BwIiwKKyAgICAgICAgImNvcmUvZnhjcnQvYnl0ZXN0cmluZy5jcHAiLAorICAgICAgICAiY29yZS9meGNydC9jZnhfYmluYXJ5YnVmLmNwcCIsCisgICAgICAgICJjb3JlL2Z4Y3J0L2NmeF9iaXRzdHJlYW0uY3BwIiwKKyAgICAgICAgImNvcmUvZnhjcnQvY2Z4X2RhdGV0aW1lLmNwcCIsCisgICAgICAgICJjb3JlL2Z4Y3J0L2NmeF9maWxlYWNjZXNzX3Bvc2l4LmNwcCIsCisgICAgICAgICJjb3JlL2Z4Y3J0L2NmeF9maWxlYWNjZXNzX3dpbmRvd3MuY3BwIiwKKyAgICAgICAgImNvcmUvZnhjcnQvY2Z4X21lbW9yeXN0cmVhbS5jcHAiLAorICAgICAgICAiY29yZS9meGNydC9jZnhfc2Vla2FibGVtdWx0aXN0cmVhbS5jcHAiLAorICAgICAgICAiY29yZS9meGNydC9jZnhfdXRmOGRlY29kZXIuY3BwIiwKKyAgICAgICAgImNvcmUvZnhjcnQvY2Z4X3dpZGV0ZXh0YnVmLmNwcCIsCiAgICAgICAgICJjb3JlL2Z4Y3J0L2Z4X2JpZGkuY3BwIiwKKyAgICAgICAgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuY3BwIiwKICAgICAgICAgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmNwcCIsCisgICAgICAgICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5jcHAiLAorICAgICAgICAiY29yZS9meGNydC9meF9yYW5kb20uY3BwIiwKKyAgICAgICAgImNvcmUvZnhjcnQvZnhfc3RyZWFtLmNwcCIsCisgICAgICAgICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5jcHAiLAorICAgICAgICAiY29yZS9meGNydC9meF9zeXN0ZW0uY3BwIiwKICAgICAgICAgImNvcmUvZnhjcnQvZnhfdWNkZGF0YS5jcHAiLAogICAgICAgICAiY29yZS9meGNydC9meF91bmljb2RlLmNwcCIsCi0gICAgICAgICJjb3JlL2Z4Y3J0L2Z4X3htbF9jb21wb3Nlci5jcHAiLAotICAgICAgICAiY29yZS9meGNydC9meF94bWxfcGFyc2VyLmNwcCIsCi0gICAgICAgICJjb3JlL2Z4Y3J0L2Z4Y3J0X3Bvc2l4LmNwcCIsCi0gICAgICAgICJjb3JlL2Z4Y3J0L2Z4Y3J0X3N0cmVhbS5jcHAiLAotICAgICAgICAiY29yZS9meGNydC9meGNydF93aW5kb3dzLmNwcCIsCisgICAgICAgICJjb3JlL2Z4Y3J0L3dpZGVzdHJpbmcuY3BwIiwKKyAgICAgICAgImNvcmUvZnhjcnQveG1sL2N4bWxfYXR0cml0ZW0uY3BwIiwKKyAgICAgICAgImNvcmUvZnhjcnQveG1sL2N4bWxfY29udGVudC5jcHAiLAorICAgICAgICAiY29yZS9meGNydC94bWwvY3htbF9kYXRhYnVmYWNjLmNwcCIsCisgICAgICAgICJjb3JlL2Z4Y3J0L3htbC9jeG1sX2VsZW1lbnQuY3BwIiwKKyAgICAgICAgImNvcmUvZnhjcnQveG1sL2N4bWxfb2JqZWN0LmNwcCIsCisgICAgICAgICJjb3JlL2Z4Y3J0L3htbC9jeG1sX3BhcnNlci5jcHAiLAogICAgIF0sCiB9CmRpZmYgLS1naXQgYS9wZGZpdW1meGVkaXQuYnAgYi9wZGZpdW1meGVkaXQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMTYyMmUuLjAwMDAwMDAKLS0tIGEvcGRmaXVtZnhlZGl0LmJwCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJwZGZpdW1meGVkaXQiLAotICAgIGRlZmF1bHRzOiBbInBkZml1bS1kZWZhdWx0cyJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItRE9QSl9TVEFUSUMiLAotICAgICAgICAiLURWOF9ERVBSRUNBVElPTl9XQVJOSU5HUyIsCi0gICAgICAgICItRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIiwKLQotICAgICAgICAvLyBNYXNrIHNvbWUgd2FybmluZ3MuIFRoZXNlIGFyZSBiZW5pZ24sIGJ1dCB3ZSBwcm9iYWJseSB3YW50IHRvIGZpeCB0aGVtCi0gICAgICAgIC8vIHVwc3RyZWFtIGF0IHNvbWUgcG9pbnQuCi0gICAgICAgICItV25vLXNpZ24tY29tcGFyZSIsCi0gICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAotICAgIF0sCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJmcGRmc2RrL2Z4ZWRpdC9meGV0X2FwLmNwcCIsCi0gICAgICAgICJmcGRmc2RrL2Z4ZWRpdC9meGV0X2VkaXQuY3BwIiwKLSAgICAgICAgImZwZGZzZGsvZnhlZGl0L2Z4ZXRfbGlzdC5jcHAiLAotICAgIF0sCi0KLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImV4dGVybmFsL2ZyZWV0eXBlL2luY2x1ZGUiLAotICAgICAgICAiZXh0ZXJuYWwvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZSIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL3BkZml1bWZ4Z2UuYnAgYi9wZGZpdW1meGdlLmJwCmluZGV4IDUzNTBhOWMuLjljNzI3MDEgMTAwNjQ0Ci0tLSBhL3BkZml1bWZ4Z2UuYnAKKysrIGIvcGRmaXVtZnhnZS5icApAQCAtMSwzMSArMSw1NSBAQAogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJwZGZpdW1meGdlIiwKLSAgICBkZWZhdWx0czogWyJwZGZpdW0tZGVmYXVsdHMiXSwKKyAgICBkZWZhdWx0czogWyJwZGZpdW0tY29yZSJdLAogCiAgICAgY2ZsYWdzOiBbCi0gICAgICAgICItRE9QSl9TVEFUSUMiLAotICAgICAgICAiLURWOF9ERVBSRUNBVElPTl9XQVJOSU5HUyIsCi0gICAgICAgICItRF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTIiwKLQotICAgICAgICAvLyBNYXNrIHNvbWUgd2FybmluZ3MuIFRoZXNlIGFyZSBiZW5pZ24sIGJ1dCB3ZSBwcm9iYWJseSB3YW50IHRvIGZpeCB0aGVtCi0gICAgICAgIC8vIHVwc3RyZWFtIGF0IHNvbWUgcG9pbnQuCi0gICAgICAgICItV25vLXNpZ24tY29tcGFyZSIsCi0gICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAorICAgICAgICAiLURERUZJTkVfUFNfVEFCTEVTIiwKKyAgICAgICAgIi1ERUZJTkVfUFNfVEFCTEVTX0RBVEEiLAogICAgIF0sCiAKLSAgICBjbGFuZ19jZmxhZ3M6IFsiLVduby1zd2l0Y2giXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlicGRmaXVtZnhjcnQiLAorICAgICAgICAibGlicGRmaXVtZnhfYWdnIiwKKyAgICBdLAogCiAgICAgc3JjczogWworICAgICAgICAiY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhYnVmZmVyZm9udC5jcHAiLAogICAgICAgICAiY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhZGV2aWNlbW9kdWxlLmNwcCIsCisgICAgICAgICJjb3JlL2Z4Z2UvYW5kcm9pZC9jZnBmX3NraWFmaWxlZm9udC5jcHAiLAogICAgICAgICAiY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhZm9udC5jcHAiLAorICAgICAgICAiY29yZS9meGdlL2FuZHJvaWQvY2ZwZl9za2lhZm9udGRlc2NyaXB0b3IuY3BwIiwKICAgICAgICAgImNvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYWZvbnRtZ3IuY3BwIiwKKyAgICAgICAgImNvcmUvZnhnZS9hbmRyb2lkL2NmcGZfc2tpYXBhdGhmb250LmNwcCIsCiAgICAgICAgICJjb3JlL2Z4Z2UvYW5kcm9pZC9jZnhfYW5kcm9pZGZvbnRpbmZvLmNwcCIsCiAgICAgICAgICJjb3JlL2Z4Z2UvYW5kcm9pZC9meF9hbmRyb2lkX2ltcC5jcHAiLAotICAgICAgICAiY29yZS9meGdlL2RpYi9meF9kaWJfY29tcG9zaXRlLmNwcCIsCi0gICAgICAgICJjb3JlL2Z4Z2UvZGliL2Z4X2RpYl9jb252ZXJ0LmNwcCIsCi0gICAgICAgICJjb3JlL2Z4Z2UvZGliL2Z4X2RpYl9lbmdpbmUuY3BwIiwKKyAgICAgICAgImNvcmUvZnhnZS9jZnhfY2xpcHJnbi5jcHAiLAorICAgICAgICAiY29yZS9meGdlL2NmeF9jb2xvci5jcHAiLAorICAgICAgICAiY29yZS9meGdlL2NmeF9mYWNlY2FjaGUuY3BwIiwKKyAgICAgICAgImNvcmUvZnhnZS9jZnhfZm9sZGVyZm9udGluZm8uY3BwIiwKKyAgICAgICAgImNvcmUvZnhnZS9jZnhfZm9udC5jcHAiLAorICAgICAgICAiY29yZS9meGdlL2NmeF9mb250Y2FjaGUuY3BwIiwKKyAgICAgICAgImNvcmUvZnhnZS9jZnhfZm9udG1hcHBlci5jcHAiLAorICAgICAgICAiY29yZS9meGdlL2NmeF9mb250bWdyLmNwcCIsCisgICAgICAgICJjb3JlL2Z4Z2UvY2Z4X2dlbW9kdWxlLmNwcCIsCisgICAgICAgICJjb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGUuY3BwIiwKKyAgICAgICAgImNvcmUvZnhnZS9jZnhfZ3JhcGhzdGF0ZWRhdGEuY3BwIiwKKyAgICAgICAgImNvcmUvZnhnZS9jZnhfcGF0aGRhdGEuY3BwIiwKKyAgICAgICAgImNvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmNwcCIsCisgICAgICAgICJjb3JlL2Z4Z2UvY2Z4X3N1YnN0Zm9udC5jcHAiLAorICAgICAgICAiY29yZS9meGdlL2NmeF91bmljb2RlZW5jb2RpbmcuY3BwIiwKKyAgICAgICAgImNvcmUvZnhnZS9jdHRmb250ZGVzYy5jcHAiLAorICAgICAgICAiY29yZS9meGdlL2RpYi9jZnhfYml0bWFwY29tcG9zZXIuY3BwIiwKKyAgICAgICAgImNvcmUvZnhnZS9kaWIvY2Z4X2JpdG1hcHN0b3Jlci5jcHAiLAorICAgICAgICAiY29yZS9meGdlL2RpYi9jZnhfZGliZXh0cmFjdG9yLmNwcCIsCisgICAgICAgICJjb3JlL2Z4Z2UvZGliL2NmeF9kaWJpdG1hcC5jcHAiLAorICAgICAgICAiY29yZS9meGdlL2RpYi9jZnhfZGlic291cmNlLmNwcCIsCisgICAgICAgICJjb3JlL2Z4Z2UvZGliL2NmeF9maWx0ZXJlZGRpYi5jcHAiLAorICAgICAgICAiY29yZS9meGdlL2RpYi9jZnhfaW1hZ2VyZW5kZXJlci5jcHAiLAorICAgICAgICAiY29yZS9meGdlL2RpYi9jZnhfaW1hZ2VzdHJldGNoZXIuY3BwIiwKKyAgICAgICAgImNvcmUvZnhnZS9kaWIvY2Z4X2ltYWdldHJhbnNmb3JtZXIuY3BwIiwKKyAgICAgICAgImNvcmUvZnhnZS9kaWIvY2Z4X3NjYW5saW5lY29tcG9zaXRvci5jcHAiLAorICAgICAgICAiY29yZS9meGdlL2RpYi9jc3RyZXRjaGVuZ2luZS5jcHAiLAogICAgICAgICAiY29yZS9meGdlL2RpYi9meF9kaWJfbWFpbi5jcHAiLAotICAgICAgICAiY29yZS9meGdlL2RpYi9meF9kaWJfdHJhbnNmb3JtLmNwcCIsCiAgICAgICAgICJjb3JlL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXREaW5nYmF0cy5jcHAiLAogICAgICAgICAiY29yZS9meGdlL2ZvbnRkYXRhL2Nocm9tZWZvbnRkYXRhL0ZveGl0Rml4ZWQuY3BwIiwKICAgICAgICAgImNvcmUvZnhnZS9mb250ZGF0YS9jaHJvbWVmb250ZGF0YS9Gb3hpdEZpeGVkQm9sZC5jcHAiLApAQCAtNDMsMjUgKzY3LDExIEBACiAgICAgICAgICJjb3JlL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTZXJpZk1NLmNwcCIsCiAgICAgICAgICJjb3JlL2Z4Z2UvZm9udGRhdGEvY2hyb21lZm9udGRhdGEvRm94aXRTeW1ib2wuY3BwIiwKICAgICAgICAgImNvcmUvZnhnZS9mcmVldHlwZS9meF9mcmVldHlwZS5jcHAiLAotICAgICAgICAiY29yZS9meGdlL2dlL2NmeF9jbGlwcmduLmNwcCIsCi0gICAgICAgICJjb3JlL2Z4Z2UvZ2UvY2Z4X2ZhY2VjYWNoZS5jcHAiLAotICAgICAgICAiY29yZS9meGdlL2dlL2NmeF9mb2xkZXJmb250aW5mby5jcHAiLAotICAgICAgICAiY29yZS9meGdlL2dlL2NmeF9mb250LmNwcCIsCi0gICAgICAgICJjb3JlL2Z4Z2UvZ2UvY2Z4X2ZvbnRjYWNoZS5jcHAiLAotICAgICAgICAiY29yZS9meGdlL2dlL2NmeF9mb250bWFwcGVyLmNwcCIsCi0gICAgICAgICJjb3JlL2Z4Z2UvZ2UvY2Z4X2ZvbnRtZ3IuY3BwIiwKLSAgICAgICAgImNvcmUvZnhnZS9nZS9jZnhfZ2Vtb2R1bGUuY3BwIiwKLSAgICAgICAgImNvcmUvZnhnZS9nZS9jZnhfZ3JhcGhzdGF0ZS5jcHAiLAotICAgICAgICAiY29yZS9meGdlL2dlL2NmeF9ncmFwaHN0YXRlZGF0YS5jcHAiLAotICAgICAgICAiY29yZS9meGdlL2dlL2NmeF9wYXRoZGF0YS5jcHAiLAotICAgICAgICAiY29yZS9meGdlL2dlL2NmeF9yZW5kZXJkZXZpY2UuY3BwIiwKLSAgICAgICAgImNvcmUvZnhnZS9nZS9jZnhfc3Vic3Rmb250LmNwcCIsCi0gICAgICAgICJjb3JlL2Z4Z2UvZ2UvY2Z4X3VuaWNvZGVlbmNvZGluZy5jcHAiLAotICAgICAgICAiY29yZS9meGdlL2dlL2N0dGZvbnRkZXNjLmNwcCIsCi0gICAgICAgICJjb3JlL2Z4Z2UvZ2UvZnhfZ2VfZm9udG1hcC5jcHAiLAotICAgICAgICAiY29yZS9meGdlL2dlL2Z4X2dlX2xpbnV4LmNwcCIsCi0gICAgICAgICJjb3JlL2Z4Z2UvZ2UvZnhfZ2VfdGV4dC5jcHAiLAorICAgICAgICAiY29yZS9meGdlL2Z4X2dlX2ZvbnRtYXAuY3BwIiwKKyAgICAgICAgImNvcmUvZnhnZS9meF9nZV9saW51eC5jcHAiLAorICAgICAgICAiY29yZS9meGdlL2Z4X2dlX3RleHQuY3BwIiwKICAgICAgICAgImNvcmUvZnhnZS9pZnhfcmVuZGVyZGV2aWNlZHJpdmVyLmNwcCIsCisKICAgICAgICAgImNvcmUvZnhnZS9hZ2cvZnhfYWdnX2RyaXZlci5jcHAiLAogICAgIF0sCiAKZGlmZiAtLWdpdCBhL3BkZml1bWZ4anMuYnAgYi9wZGZpdW1meGpzLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MmM5NWIKLS0tIC9kZXYvbnVsbAorKysgYi9wZGZpdW1meGpzLmJwCkBAIC0wLDAgKzEsMTMgQEAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlicGRmaXVtZnhqcyIsCisgICAgZGVmYXVsdHM6IFsicGRmaXVtLWNvcmUiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJwZGZpdW1meGNydCIKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAiZnhqcy9janNfZXZlbnRfY29udGV4dF9zdHViLmNwcCIsCisgICAgICAgICJmeGpzL2Nqc19ydW50aW1lc3R1Yi5jcHAiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9wZGZpdW1qYXZhc2NyaXB0LmJwIGIvcGRmaXVtamF2YXNjcmlwdC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJhZTIzZC4uMDAwMDAwMAotLS0gYS9wZGZpdW1qYXZhc2NyaXB0LmJwCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJwZGZpdW1qYXZhc2NyaXB0IiwKLSAgICBkZWZhdWx0czogWyJwZGZpdW0tZGVmYXVsdHMiXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLURPUEpfU1RBVElDIiwKLSAgICAgICAgIi1EVjhfREVQUkVDQVRJT05fV0FSTklOR1MiLAotICAgICAgICAiLURfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIsCi0KLSAgICAgICAgLy8gTWFzayBzb21lIHdhcm5pbmdzLiBUaGVzZSBhcmUgYmVuaWduLCBidXQgd2UgcHJvYmFibHkgd2FudCB0byBmaXggdGhlbQotICAgICAgICAvLyB1cHN0cmVhbSBhdCBzb21lIHBvaW50LgotICAgICAgICAiLVduby1zaWduLWNvbXBhcmUiLAotICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKLSAgICBdLAotCi0gICAgc3JjczogWyJmcGRmc2RrL2phdmFzY3JpcHQvSlNfUnVudGltZV9TdHViLmNwcCJdLAotfQpkaWZmIC0tZ2l0IGEvcGRmaXVtcGRmd2luZG93LmJwIGIvcGRmaXVtcGRmd2luZG93LmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTYzYzZmLi4wMDAwMDAwCi0tLSBhL3BkZml1bXBkZndpbmRvdy5icAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGlicGRmaXVtcGRmd2luZG93IiwKLSAgICBkZWZhdWx0czogWyJwZGZpdW0tZGVmYXVsdHMiXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLURPUEpfU1RBVElDIiwKLSAgICAgICAgIi1EVjhfREVQUkVDQVRJT05fV0FSTklOR1MiLAotICAgICAgICAiLURfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIsCi0KLSAgICAgICAgLy8gTWFzayBzb21lIHdhcm5pbmdzLiBUaGVzZSBhcmUgYmVuaWduLCBidXQgd2UgcHJvYmFibHkgd2FudCB0byBmaXggdGhlbQotICAgICAgICAvLyB1cHN0cmVhbSBhdCBzb21lIHBvaW50LgotICAgICAgICAiLVduby1zaWduLWNvbXBhcmUiLAotICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKLSAgICBdLAotCi0gICAgc3JjczogWwotICAgICAgICAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0J1dHRvbi5jcHAiLAotICAgICAgICAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0NhcmV0LmNwcCIsCi0gICAgICAgICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfQ29tYm9Cb3guY3BwIiwKLSAgICAgICAgImZwZGZzZGsvcGRmd2luZG93L1BXTF9FZGl0LmNwcCIsCi0gICAgICAgICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfRWRpdEN0cmwuY3BwIiwKLSAgICAgICAgImZwZGZzZGsvcGRmd2luZG93L1BXTF9Gb250TWFwLmNwcCIsCi0gICAgICAgICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfSWNvbi5jcHAiLAotICAgICAgICAiZnBkZnNkay9wZGZ3aW5kb3cvUFdMX0xpc3RCb3guY3BwIiwKLSAgICAgICAgImZwZGZzZGsvcGRmd2luZG93L1BXTF9TY3JvbGxCYXIuY3BwIiwKLSAgICAgICAgImZwZGZzZGsvcGRmd2luZG93L1BXTF9TcGVjaWFsQnV0dG9uLmNwcCIsCi0gICAgICAgICJmcGRmc2RrL3BkZndpbmRvdy9QV0xfVXRpbHMuY3BwIiwKLSAgICAgICAgImZwZGZzZGsvcGRmd2luZG93L1BXTF9XbmQuY3BwIiwKLSAgICAgICAgImZwZGZzZGsvcGRmd2luZG93L2Nwd2xfY29sb3IuY3BwIiwKLSAgICBdLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJleHRlcm5hbC9mcmVldHlwZS9pbmNsdWRlIiwKLSAgICAgICAgImV4dGVybmFsL2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS9wZGZpdW1wd2wuYnAgYi9wZGZpdW1wd2wuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhiZDU2MgotLS0gL2Rldi9udWxsCisrKyBiL3BkZml1bXB3bC5icApAQCAtMCwwICsxLDMyIEBACitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnBkZml1bXB3bCIsCisgICAgZGVmYXVsdHM6IFsicGRmaXVtLWNvcmUiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJwZGZpdW1meGNydCIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImZwZGZzZGsvcHdsL2Nwd2xfYXBwc3RyZWFtLmNwcCIsCisgICAgICAgICJmcGRmc2RrL3B3bC9jcHdsX2J1dHRvbi5jcHAiLAorICAgICAgICAiZnBkZnNkay9wd2wvY3B3bF9jYXJldC5jcHAiLAorICAgICAgICAiZnBkZnNkay9wd2wvY3B3bF9jb21ib19ib3guY3BwIiwKKyAgICAgICAgImZwZGZzZGsvcHdsL2Nwd2xfZWRpdC5jcHAiLAorICAgICAgICAiZnBkZnNkay9wd2wvY3B3bF9lZGl0X2N0cmwuY3BwIiwKKyAgICAgICAgImZwZGZzZGsvcHdsL2Nwd2xfZWRpdF9pbXBsLmNwcCIsCisgICAgICAgICJmcGRmc2RrL3B3bC9jcHdsX2ZvbnRfbWFwLmNwcCIsCisgICAgICAgICJmcGRmc2RrL3B3bC9jcHdsX2ljb24uY3BwIiwKKyAgICAgICAgImZwZGZzZGsvcHdsL2Nwd2xfbGlzdF9ib3guY3BwIiwKKyAgICAgICAgImZwZGZzZGsvcHdsL2Nwd2xfbGlzdF9pbXBsLmNwcCIsCisgICAgICAgICJmcGRmc2RrL3B3bC9jcHdsX3Njcm9sbF9iYXIuY3BwIiwKKyAgICAgICAgImZwZGZzZGsvcHdsL2Nwd2xfc3BlY2lhbF9idXR0b24uY3BwIiwKKyAgICAgICAgImZwZGZzZGsvcHdsL2Nwd2xfdGltZXIuY3BwIiwKKyAgICAgICAgImZwZGZzZGsvcHdsL2Nwd2xfdGltZXJfaGFuZGxlci5jcHAiLAorICAgICAgICAiZnBkZnNkay9wd2wvY3B3bF93bmQuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9mcmVldHlwZS9pbmNsdWRlIiwKKyAgICAgICAgImV4dGVybmFsL2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9wdWJsaWMvUFJFU1VCTUlULnB5IGIvcHVibGljL1BSRVNVQk1JVC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWJkODczCi0tLSAvZGV2L251bGwKKysrIGIvcHVibGljL1BSRVNVQk1JVC5weQpAQCAtMCwwICsxLDMzIEBACisjIENvcHlyaWdodCAyMDE3IFRoZSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisiIiJQcmVzdWJtaXQgc2NyaXB0IGZvciBwZGZpdW0uCisKK1NlZSBodHRwOi8vZGV2LmNocm9taXVtLm9yZy9kZXZlbG9wZXJzL2hvdy10b3MvZGVwb3R0b29scy9wcmVzdWJtaXQtc2NyaXB0cworZm9yIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgcHJlc3VibWl0IEFQSSBidWlsdCBpbnRvIGRlcG90X3Rvb2xzLgorIiIiCisKK2RlZiBfQ2hlY2tQdWJsaWNIZWFkZXJzKGlucHV0X2FwaSwgb3V0cHV0X2FwaSk6CisgICIiIkNoZWNrcyB0aGF0IHRoZSBwdWJsaWMgaGVhZGVycyBtYXRjaCB0aGUgQVBJIHRlc3RzLiIiIgorICBzcmNfcGF0aCA9IGlucHV0X2FwaS5vc19wYXRoLmRpcm5hbWUoaW5wdXRfYXBpLlByZXN1Ym1pdExvY2FsUGF0aCgpKQorICBjaGVja19zY3JpcHQgPSBpbnB1dF9hcGkub3NfcGF0aC5qb2luKAorICAgICAgc3JjX3BhdGgsICd0ZXN0aW5nJyAsICd0b29scycgLCAnYXBpX2NoZWNrLnB5JykKKyAgdHJ5OgorICAgIGlucHV0X2FwaS5zdWJwcm9jZXNzLmNoZWNrX291dHB1dChjaGVja19zY3JpcHQpCisgICAgcmV0dXJuIFtdCisgIGV4Y2VwdCBpbnB1dF9hcGkuc3VicHJvY2Vzcy5DYWxsZWRQcm9jZXNzRXJyb3IgYXMgZXJyb3I6CisgICAgcmV0dXJuIFtvdXRwdXRfYXBpLlByZXN1Ym1pdEVycm9yKCdhcGlfY2hlY2sucHkgZmFpbGVkOicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdfdGV4dD1lcnJvci5vdXRwdXQpXQorCisKK2RlZiBDaGVja0NoYW5nZU9uVXBsb2FkKGlucHV0X2FwaSwgb3V0cHV0X2FwaSk6CisgIHJlc3VsdHMgPSBbXQorICByZXN1bHRzICs9IF9DaGVja1B1YmxpY0hlYWRlcnMoaW5wdXRfYXBpLCBvdXRwdXRfYXBpKQorICByZXR1cm4gcmVzdWx0cworCisKK2RlZiBDaGVja0NoYW5nZU9uQ29tbWl0KGlucHV0X2FwaSwgb3V0cHV0X2FwaSk6CisgIHJlc3VsdHMgPSBbXQorICByZXN1bHRzICs9IF9DaGVja1B1YmxpY0hlYWRlcnMoaW5wdXRfYXBpLCBvdXRwdXRfYXBpKQorICByZXR1cm4gcmVzdWx0cwpkaWZmIC0tZ2l0IGEvcHVibGljL2NwcC9mcGRmX2RlbGV0ZXJzLmggYi9wdWJsaWMvY3BwL2ZwZGZfZGVsZXRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzhlZjMwCi0tLSAvZGV2L251bGwKKysrIGIvcHVibGljL2NwcC9mcGRmX2RlbGV0ZXJzLmgKQEAgLTAsMCArMSw1MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIFBVQkxJQ19DUFBfRlBERl9ERUxFVEVSU19IXworI2RlZmluZSBQVUJMSUNfQ1BQX0ZQREZfREVMRVRFUlNfSF8KKworI2luY2x1ZGUgInB1YmxpYy9mcGRmX2RhdGFhdmFpbC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2VkaXQuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9mb3JtZmlsbC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX3N0cnVjdHRyZWUuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl90ZXh0LmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCisKKy8vIEN1c3RvbSBkZWxldGVycyBmb3IgdXNpbmcgRlBERl8qIHR5cGVzIHdpdGggc3RkOjp1bmlxdWVfcHRyPD4uCisKK3N0cnVjdCBGUERGQXZhaWxEZWxldGVyIHsKKyAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShGUERGX0FWQUlMIGF2YWlsKSB7IEZQREZBdmFpbF9EZXN0cm95KGF2YWlsKTsgfQorfTsKKworc3RydWN0IEZQREZCaXRtYXBEZWxldGVyIHsKKyAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShGUERGX0JJVE1BUCBiaXRtYXApIHsgRlBERkJpdG1hcF9EZXN0cm95KGJpdG1hcCk7IH0KK307CisKK3N0cnVjdCBGUERGRG9jdW1lbnREZWxldGVyIHsKKyAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShGUERGX0RPQ1VNRU5UIGRvYykgeyBGUERGX0Nsb3NlRG9jdW1lbnQoZG9jKTsgfQorfTsKKworc3RydWN0IEZQREZGb3JtSGFuZGxlRGVsZXRlciB7CisgIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoRlBERl9GT1JNSEFORExFIGZvcm0pIHsKKyAgICBGUERGRE9DX0V4aXRGb3JtRmlsbEVudmlyb25tZW50KGZvcm0pOworICB9Cit9OworCitzdHJ1Y3QgRlBERlRleHRQYWdlRGVsZXRlciB7CisgIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoRlBERl9URVhUUEFHRSB0ZXh0KSB7IEZQREZUZXh0X0Nsb3NlUGFnZSh0ZXh0KTsgfQorfTsKKworc3RydWN0IEZQREZQYWdlRGVsZXRlciB7CisgIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoRlBERl9QQUdFIHBhZ2UpIHsgRlBERl9DbG9zZVBhZ2UocGFnZSk7IH0KK307CisKK3N0cnVjdCBGUERGU3RydWN0VHJlZURlbGV0ZXIgeworICBpbmxpbmUgdm9pZCBvcGVyYXRvcigpKEZQREZfU1RSVUNUVFJFRSB0cmVlKSB7IEZQREZfU3RydWN0VHJlZV9DbG9zZSh0cmVlKTsgfQorfTsKKworc3RydWN0IEZQREZGb250RGVsZXRlciB7CisgIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoRlBERl9GT05UIGZvbnQpIHsgRlBERkZvbnRfQ2xvc2UoZm9udCk7IH0KK307CisKKyNlbmRpZiAgLy8gUFVCTElDX0NQUF9GUERGX0RFTEVURVJTX0hfCmRpZmYgLS1naXQgYS9wdWJsaWMvZnBkZl9hbm5vdC5oIGIvcHVibGljL2ZwZGZfYW5ub3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWVmNTRjCi0tLSAvZGV2L251bGwKKysrIGIvcHVibGljL2ZwZGZfYW5ub3QuaApAQCAtMCwwICsxLDUwOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIFBVQkxJQ19GUERGX0FOTk9UX0hfCisjZGVmaW5lIFBVQkxJQ19GUERGX0FOTk9UX0hfCisKKy8vIE5PTElOVE5FWFRMSU5FKGJ1aWxkL2luY2x1ZGUpCisjaW5jbHVkZSAiZnBkZnZpZXcuaCIKKworLy8gTk9MSU5UTkVYVExJTkUoYnVpbGQvaW5jbHVkZSkKKyNpbmNsdWRlICJmcGRmX2RvYy5oIgorLy8gTk9MSU5UTkVYVExJTkUoYnVpbGQvaW5jbHVkZSkKKyNpbmNsdWRlICJmcGRmX2Zvcm1maWxsLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgIC8vIF9fY3BsdXNwbHVzCisKKyNkZWZpbmUgRlBERl9BTk5PVF9VTktOT1dOIDAKKyNkZWZpbmUgRlBERl9BTk5PVF9URVhUIDEKKyNkZWZpbmUgRlBERl9BTk5PVF9MSU5LIDIKKyNkZWZpbmUgRlBERl9BTk5PVF9GUkVFVEVYVCAzCisjZGVmaW5lIEZQREZfQU5OT1RfTElORSA0CisjZGVmaW5lIEZQREZfQU5OT1RfU1FVQVJFIDUKKyNkZWZpbmUgRlBERl9BTk5PVF9DSVJDTEUgNgorI2RlZmluZSBGUERGX0FOTk9UX1BPTFlHT04gNworI2RlZmluZSBGUERGX0FOTk9UX1BPTFlMSU5FIDgKKyNkZWZpbmUgRlBERl9BTk5PVF9ISUdITElHSFQgOQorI2RlZmluZSBGUERGX0FOTk9UX1VOREVSTElORSAxMAorI2RlZmluZSBGUERGX0FOTk9UX1NRVUlHR0xZIDExCisjZGVmaW5lIEZQREZfQU5OT1RfU1RSSUtFT1VUIDEyCisjZGVmaW5lIEZQREZfQU5OT1RfU1RBTVAgMTMKKyNkZWZpbmUgRlBERl9BTk5PVF9DQVJFVCAxNAorI2RlZmluZSBGUERGX0FOTk9UX0lOSyAxNQorI2RlZmluZSBGUERGX0FOTk9UX1BPUFVQIDE2CisjZGVmaW5lIEZQREZfQU5OT1RfRklMRUFUVEFDSE1FTlQgMTcKKyNkZWZpbmUgRlBERl9BTk5PVF9TT1VORCAxOAorI2RlZmluZSBGUERGX0FOTk9UX01PVklFIDE5CisjZGVmaW5lIEZQREZfQU5OT1RfV0lER0VUIDIwCisjZGVmaW5lIEZQREZfQU5OT1RfU0NSRUVOIDIxCisjZGVmaW5lIEZQREZfQU5OT1RfUFJJTlRFUk1BUksgMjIKKyNkZWZpbmUgRlBERl9BTk5PVF9UUkFQTkVUIDIzCisjZGVmaW5lIEZQREZfQU5OT1RfV0FURVJNQVJLIDI0CisjZGVmaW5lIEZQREZfQU5OT1RfVEhSRUVEIDI1CisjZGVmaW5lIEZQREZfQU5OT1RfUklDSE1FRElBIDI2CisjZGVmaW5lIEZQREZfQU5OT1RfWEZBV0lER0VUIDI3CisKKy8vIFJlZmVyIHRvIFBERiBSZWZlcmVuY2UgKDZ0aCBlZGl0aW9uKSB0YWJsZSA4LjE2IGZvciBhbGwgYW5ub3RhdGlvbiBmbGFncy4KKyNkZWZpbmUgRlBERl9BTk5PVF9GTEFHX05PTkUgMAorI2RlZmluZSBGUERGX0FOTk9UX0ZMQUdfSU5WSVNJQkxFICgxIDw8IDApCisjZGVmaW5lIEZQREZfQU5OT1RfRkxBR19ISURERU4gKDEgPDwgMSkKKyNkZWZpbmUgRlBERl9BTk5PVF9GTEFHX1BSSU5UICgxIDw8IDIpCisjZGVmaW5lIEZQREZfQU5OT1RfRkxBR19OT1pPT00gKDEgPDwgMykKKyNkZWZpbmUgRlBERl9BTk5PVF9GTEFHX05PUk9UQVRFICgxIDw8IDQpCisjZGVmaW5lIEZQREZfQU5OT1RfRkxBR19OT1ZJRVcgKDEgPDwgNSkKKyNkZWZpbmUgRlBERl9BTk5PVF9GTEFHX1JFQURPTkxZICgxIDw8IDYpCisjZGVmaW5lIEZQREZfQU5OT1RfRkxBR19MT0NLRUQgKDEgPDwgNykKKyNkZWZpbmUgRlBERl9BTk5PVF9GTEFHX1RPR0dMRU5PVklFVyAoMSA8PCA4KQorCisjZGVmaW5lIEZQREZfQU5OT1RfQVBQRUFSQU5DRU1PREVfTk9STUFMIDAKKyNkZWZpbmUgRlBERl9BTk5PVF9BUFBFQVJBTkNFTU9ERV9ST0xMT1ZFUiAxCisjZGVmaW5lIEZQREZfQU5OT1RfQVBQRUFSQU5DRU1PREVfRE9XTiAyCisjZGVmaW5lIEZQREZfQU5OT1RfQVBQRUFSQU5DRU1PREVfQ09VTlQgMworCisjZGVmaW5lIEZQREZfT0JKRUNUX1VOS05PV04gMAorI2RlZmluZSBGUERGX09CSkVDVF9CT09MRUFOIDEKKyNkZWZpbmUgRlBERl9PQkpFQ1RfTlVNQkVSIDIKKyNkZWZpbmUgRlBERl9PQkpFQ1RfU1RSSU5HIDMKKyNkZWZpbmUgRlBERl9PQkpFQ1RfTkFNRSA0CisjZGVmaW5lIEZQREZfT0JKRUNUX0FSUkFZIDUKKyNkZWZpbmUgRlBERl9PQkpFQ1RfRElDVElPTkFSWSA2CisjZGVmaW5lIEZQREZfT0JKRUNUX1NUUkVBTSA3CisjZGVmaW5lIEZQREZfT0JKRUNUX05VTExPQkogOAorI2RlZmluZSBGUERGX09CSkVDVF9SRUZFUkVOQ0UgOQorCisvLyBSZWZlciB0byBQREYgUmVmZXJlbmNlIHZlcnNpb24gMS43IHRhYmxlIDguNzAgZm9yIGZpZWxkIGZsYWdzIGNvbW1vbiB0byBhbGwKKy8vIGludGVyYWN0aXZlIGZvcm0gZmllbGQgdHlwZXMuCisjZGVmaW5lIEZQREZfRk9STUZMQUdfTk9ORSAwCisjZGVmaW5lIEZQREZfRk9STUZMQUdfUkVBRE9OTFkgKDEgPDwgMCkKKyNkZWZpbmUgRlBERl9GT1JNRkxBR19SRVFVSVJFRCAoMSA8PCAxKQorI2RlZmluZSBGUERGX0ZPUk1GTEFHX05PRVhQT1JUICgxIDw8IDIpCisKKy8vIFJlZmVyIHRvIFBERiBSZWZlcmVuY2UgdmVyc2lvbiAxLjcgdGFibGUgOC43NyBmb3IgZmllbGQgZmxhZ3Mgc3BlY2lmaWMgdG8KKy8vIGludGVyYWN0aXZlIGZvcm0gdGV4dCBmaWVsZHMuCisjZGVmaW5lIEZQREZfRk9STUZMQUdfVEVYVF9NVUxUSUxJTkUgKDEgPDwgMTIpCisKKy8vIFJlZmVyIHRvIFBERiBSZWZlcmVuY2UgdmVyc2lvbiAxLjcgdGFibGUgOC43OSBmb3IgZmllbGQgZmxhZ3Mgc3BlY2lmaWMgdG8KKy8vIGludGVyYWN0aXZlIGZvcm0gY2hvaWNlIGZpZWxkcy4KKyNkZWZpbmUgRlBERl9GT1JNRkxBR19DSE9JQ0VfQ09NQk8gKDEgPDwgMTcpCisjZGVmaW5lIEZQREZfRk9STUZMQUdfQ0hPSUNFX0VESVQgKDEgPDwgMTgpCisKK3R5cGVkZWYgZW51bSBGUERGQU5OT1RfQ09MT1JUWVBFIHsKKyAgRlBERkFOTk9UX0NPTE9SVFlQRV9Db2xvciA9IDAsCisgIEZQREZBTk5PVF9DT0xPUlRZUEVfSW50ZXJpb3JDb2xvcgorfSBGUERGQU5OT1RfQ09MT1JUWVBFOworCisvLyBFeHBlcmltZW50YWwgQVBJLgorLy8gQ2hlY2sgaWYgYW4gYW5ub3RhdGlvbiBzdWJ0eXBlIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIGNyZWF0aW9uLgorLy8gQ3VycmVudGx5IHN1cHBvcnRlZCBzdWJ0eXBlczogY2lyY2xlLCBoaWdobGlnaHQsIGluaywgcG9wdXAsIHNxdWFyZSwKKy8vIHNxdWlnZ2x5LCBzdGFtcCwgc3RyaWtlb3V0LCB0ZXh0LCBhbmQgdW5kZXJsaW5lLgorLy8KKy8vICAgc3VidHlwZSAgIC0gdGhlIHN1YnR5cGUgdG8gYmUgY2hlY2tlZC4KKy8vCisvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBzdWJ0eXBlIHN1cHBvcnRlZC4KK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCitGUERGQW5ub3RfSXNTdXBwb3J0ZWRTdWJ0eXBlKEZQREZfQU5OT1RBVElPTl9TVUJUWVBFIHN1YnR5cGUpOworCisvLyBFeHBlcmltZW50YWwgQVBJLgorLy8gQ3JlYXRlIGFuIGFubm90YXRpb24gaW4gfHBhZ2V8IG9mIHRoZSBzdWJ0eXBlIHxzdWJ0eXBlfC4gSWYgdGhlIHNwZWNpZmllZAorLy8gc3VidHlwZSBpcyBpbGxlZ2FsIG9yIHVuc3VwcG9ydGVkLCB0aGVuIGEgbmV3IGFubm90YXRpb24gd2lsbCBub3QgYmUgY3JlYXRlZC4KKy8vIE11c3QgY2FsbCBGUERGUGFnZV9DbG9zZUFubm90KCkgd2hlbiB0aGUgYW5ub3RhdGlvbiByZXR1cm5lZCBieSB0aGlzCisvLyBmdW5jdGlvbiBpcyBubyBsb25nZXIgbmVlZGVkLgorLy8KKy8vICAgcGFnZSAgICAgIC0gaGFuZGxlIHRvIGEgcGFnZS4KKy8vICAgc3VidHlwZSAgIC0gdGhlIHN1YnR5cGUgb2YgdGhlIG5ldyBhbm5vdGF0aW9uLgorLy8KKy8vIFJldHVybnMgYSBoYW5kbGUgdG8gdGhlIG5ldyBhbm5vdGF0aW9uIG9iamVjdCwgb3IgTlVMTCBvbiBmYWlsdXJlLgorRlBERl9FWFBPUlQgRlBERl9BTk5PVEFUSU9OIEZQREZfQ0FMTENPTlYKK0ZQREZQYWdlX0NyZWF0ZUFubm90KEZQREZfUEFHRSBwYWdlLCBGUERGX0FOTk9UQVRJT05fU1VCVFlQRSBzdWJ0eXBlKTsKKworLy8gRXhwZXJpbWVudGFsIEFQSS4KKy8vIEdldCB0aGUgbnVtYmVyIG9mIGFubm90YXRpb25zIGluIHxwYWdlfC4KKy8vCisvLyAgIHBhZ2UgICAtIGhhbmRsZSB0byBhIHBhZ2UuCisvLworLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGFubm90YXRpb25zIGluIHxwYWdlfC4KK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZQYWdlX0dldEFubm90Q291bnQoRlBERl9QQUdFIHBhZ2UpOworCisvLyBFeHBlcmltZW50YWwgQVBJLgorLy8gR2V0IGFubm90YXRpb24gaW4gfHBhZ2V8IGF0IHxpbmRleHwuIE11c3QgY2FsbCBGUERGUGFnZV9DbG9zZUFubm90KCkgd2hlbiB0aGUKKy8vIGFubm90YXRpb24gcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBpcyBubyBsb25nZXIgbmVlZGVkLgorLy8KKy8vICAgcGFnZSAgLSBoYW5kbGUgdG8gYSBwYWdlLgorLy8gICBpbmRleCAtIHRoZSBpbmRleCBvZiB0aGUgYW5ub3RhdGlvbi4KKy8vCisvLyBSZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBhbm5vdGF0aW9uIG9iamVjdCwgb3IgTlVMTCBvbiBmYWlsdXJlLgorRlBERl9FWFBPUlQgRlBERl9BTk5PVEFUSU9OIEZQREZfQ0FMTENPTlYgRlBERlBhZ2VfR2V0QW5ub3QoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOworCisvLyBFeHBlcmltZW50YWwgQVBJLgorLy8gR2V0IHRoZSBpbmRleCBvZiB8YW5ub3R8IGluIHxwYWdlfC4gVGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2YKKy8vIEZQREZQYWdlX0dldEFubm90KCkuCisvLworLy8gICBwYWdlICAtIGhhbmRsZSB0byB0aGUgcGFnZSB0aGF0IHRoZSBhbm5vdGF0aW9uIGlzIG9uLgorLy8gICBhbm5vdCAtIGhhbmRsZSB0byBhbiBhbm5vdGF0aW9uLgorLy8KKy8vIFJldHVybnMgdGhlIGluZGV4IG9mIHxhbm5vdHwsIG9yIC0xIG9uIGZhaWx1cmUuCitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OViBGUERGUGFnZV9HZXRBbm5vdEluZGV4KEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0FOTk9UQVRJT04gYW5ub3QpOworCisvLyBFeHBlcmltZW50YWwgQVBJLgorLy8gQ2xvc2UgYW4gYW5ub3RhdGlvbi4gTXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgYW5ub3RhdGlvbiByZXR1cm5lZCBieQorLy8gRlBERlBhZ2VfQ3JlYXRlQW5ub3QoKSBvciBGUERGUGFnZV9HZXRBbm5vdCgpIGlzIG5vIGxvbmdlciBuZWVkZWQuIFRoaXMKKy8vIGZ1bmN0aW9uIGRvZXMgbm90IHJlbW92ZSB0aGUgYW5ub3RhdGlvbiBmcm9tIHRoZSBkb2N1bWVudC4KKy8vCisvLyAgIGFubm90ICAtIGhhbmRsZSB0byBhbiBhbm5vdGF0aW9uLgorRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZQYWdlX0Nsb3NlQW5ub3QoRlBERl9BTk5PVEFUSU9OIGFubm90KTsKKworLy8gRXhwZXJpbWVudGFsIEFQSS4KKy8vIFJlbW92ZSB0aGUgYW5ub3RhdGlvbiBpbiB8cGFnZXwgYXQgfGluZGV4fC4KKy8vCisvLyAgIHBhZ2UgIC0gaGFuZGxlIHRvIGEgcGFnZS4KKy8vICAgaW5kZXggLSB0aGUgaW5kZXggb2YgdGhlIGFubm90YXRpb24uCisvLworLy8gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwuCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGUGFnZV9SZW1vdmVBbm5vdChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCk7CisKKy8vIEV4cGVyaW1lbnRhbCBBUEkuCisvLyBHZXQgdGhlIHN1YnR5cGUgb2YgYW4gYW5ub3RhdGlvbi4KKy8vCisvLyAgIGFubm90ICAtIGhhbmRsZSB0byBhbiBhbm5vdGF0aW9uLgorLy8KKy8vIFJldHVybnMgdGhlIGFubm90YXRpb24gc3VidHlwZS4KK0ZQREZfRVhQT1JUIEZQREZfQU5OT1RBVElPTl9TVUJUWVBFIEZQREZfQ0FMTENPTlYKK0ZQREZBbm5vdF9HZXRTdWJ0eXBlKEZQREZfQU5OT1RBVElPTiBhbm5vdCk7CisKKy8vIEV4cGVyaW1lbnRhbCBBUEkuCisvLyBDaGVjayBpZiBhbiBhbm5vdGF0aW9uIHN1YnR5cGUgaXMgY3VycmVudGx5IHN1cHBvcnRlZCBmb3Igb2JqZWN0IGV4dHJhY3Rpb24sCisvLyB1cGRhdGUsIGFuZCByZW1vdmFsLgorLy8gQ3VycmVudGx5IHN1cHBvcnRlZCBzdWJ0eXBlczogaW5rIGFuZCBzdGFtcC4KKy8vCisvLyAgIHN1YnR5cGUgICAtIHRoZSBzdWJ0eXBlIHRvIGJlIGNoZWNrZWQuCisvLworLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgc3VidHlwZSBzdXBwb3J0ZWQuCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgorRlBERkFubm90X0lzT2JqZWN0U3VwcG9ydGVkU3VidHlwZShGUERGX0FOTk9UQVRJT05fU1VCVFlQRSBzdWJ0eXBlKTsKKworLy8gRXhwZXJpbWVudGFsIEFQSS4KKy8vIFVwZGF0ZSB8b2JqfCBpbiB8YW5ub3R8LiB8b2JqfCBtdXN0IGJlIGluIHxhbm5vdHwgYWxyZWFkeSBhbmQgbXVzdCBoYXZlCisvLyBiZWVuIHJldHJpZXZlZCBieSBGUERGQW5ub3RfR2V0T2JqZWN0KCkuIEN1cnJlbnRseSwgb25seSBpbmsgYW5kIHN0YW1wCisvLyBhbm5vdGF0aW9ucyBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMgQVBJLiBBbHNvIG5vdGUgdGhhdCBvbmx5IHBhdGgsIGltYWdlLCBhbmQKKy8vIHRleHQgb2JqZWN0cyBoYXZlIEFQSXMgZm9yIG1vZGlmaWNhdGlvbjsgc2VlIEZQREZQYXRoXyooKSwgRlBERlRleHRfKigpLCBhbmQKKy8vIEZQREZJbWFnZU9ial8qKCkuCisvLworLy8gICBhbm5vdCAgLSBoYW5kbGUgdG8gYW4gYW5ub3RhdGlvbi4KKy8vICAgb2JqICAgIC0gaGFuZGxlIHRvIHRoZSBvYmplY3QgdGhhdCB8YW5ub3R8IG5lZWRzIHRvIHVwZGF0ZS4KKy8vCisvLyBSZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLgorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZBbm5vdF9VcGRhdGVPYmplY3QoRlBERl9BTk5PVEFUSU9OIGFubm90LCBGUERGX1BBR0VPQkpFQ1Qgb2JqKTsKKworLy8gRXhwZXJpbWVudGFsIEFQSS4KKy8vIEFkZCB8b2JqfCB0byB8YW5ub3R8LiB8b2JqfCBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkIGJ5CisvLyBGUERGUGFnZU9ial9DcmVhdGVOZXd7UGF0aHxSZWN0fSgpIG9yIEZQREZQYWdlT2JqX05ld3tUZXh0fEltYWdlfU9iaigpLCBhbmQKKy8vIHdpbGwgYmUgb3duZWQgYnkgfGFubm90fC4gTm90ZSB0aGF0IGFuIHxvYmp8IGNhbm5vdCBiZWxvbmcgdG8gbW9yZSB0aGFuIG9uZQorLy8gfGFubm90fC4gQ3VycmVudGx5LCBvbmx5IGluayBhbmQgc3RhbXAgYW5ub3RhdGlvbnMgYXJlIHN1cHBvcnRlZCBieSB0aGlzIEFQSS4KKy8vIEFsc28gbm90ZSB0aGF0IG9ubHkgcGF0aCwgaW1hZ2UsIGFuZCB0ZXh0IG9iamVjdHMgaGF2ZSBBUElzIGZvciBjcmVhdGlvbi4KKy8vCisvLyAgIGFubm90ICAtIGhhbmRsZSB0byBhbiBhbm5vdGF0aW9uLgorLy8gICBvYmogICAgLSBoYW5kbGUgdG8gdGhlIG9iamVjdCB0aGF0IGlzIHRvIGJlIGFkZGVkIHRvIHxhbm5vdHwuCisvLworLy8gUmV0dXJuIHRydWUgaWYgc3VjY2Vzc2Z1bC4KK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCitGUERGQW5ub3RfQXBwZW5kT2JqZWN0KEZQREZfQU5OT1RBVElPTiBhbm5vdCwgRlBERl9QQUdFT0JKRUNUIG9iaik7CisKKy8vIEV4cGVyaW1lbnRhbCBBUEkuCisvLyBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiBvYmplY3RzIGluIHxhbm5vdHwsIGluY2x1ZGluZyBwYXRoIG9iamVjdHMsIHRleHQKKy8vIG9iamVjdHMsIGV4dGVybmFsIG9iamVjdHMsIGltYWdlIG9iamVjdHMsIGFuZCBzaGFkaW5nIG9iamVjdHMuCisvLworLy8gICBhbm5vdCAgLSBoYW5kbGUgdG8gYW4gYW5ub3RhdGlvbi4KKy8vCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpbiB8YW5ub3R8LgorRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERkFubm90X0dldE9iamVjdENvdW50KEZQREZfQU5OT1RBVElPTiBhbm5vdCk7CisKKy8vIEV4cGVyaW1lbnRhbCBBUEkuCisvLyBHZXQgdGhlIG9iamVjdCBpbiB8YW5ub3R8IGF0IHxpbmRleHwuCisvLworLy8gICBhbm5vdCAgLSBoYW5kbGUgdG8gYW4gYW5ub3RhdGlvbi4KKy8vICAgaW5kZXggIC0gdGhlIGluZGV4IG9mIHRoZSBvYmplY3QuCisvLworLy8gUmV0dXJuIGEgaGFuZGxlIHRvIHRoZSBvYmplY3QsIG9yIE5VTEwgb24gZmFpbHVyZS4KK0ZQREZfRVhQT1JUIEZQREZfUEFHRU9CSkVDVCBGUERGX0NBTExDT05WCitGUERGQW5ub3RfR2V0T2JqZWN0KEZQREZfQU5OT1RBVElPTiBhbm5vdCwgaW50IGluZGV4KTsKKworLy8gRXhwZXJpbWVudGFsIEFQSS4KKy8vIFJlbW92ZSB0aGUgb2JqZWN0IGluIHxhbm5vdHwgYXQgfGluZGV4fC4KKy8vCisvLyAgIGFubm90ICAtIGhhbmRsZSB0byBhbiBhbm5vdGF0aW9uLgorLy8gICBpbmRleCAgLSB0aGUgaW5kZXggb2YgdGhlIG9iamVjdCB0byBiZSByZW1vdmVkLgorLy8KKy8vIFJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwuCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgorRlBERkFubm90X1JlbW92ZU9iamVjdChGUERGX0FOTk9UQVRJT04gYW5ub3QsIGludCBpbmRleCk7CisKKy8vIEV4cGVyaW1lbnRhbCBBUEkuCisvLyBTZXQgdGhlIGNvbG9yIG9mIGFuIGFubm90YXRpb24uIEZhaWxzIHdoZW4gY2FsbGVkIG9uIGFubm90YXRpb25zIHdpdGgKKy8vIGFwcGVhcmFuY2Ugc3RyZWFtcyBhbHJlYWR5IGRlZmluZWQ7IGluc3RlYWQgdXNlCisvLyBGUERGUGF0aF9TZXR7U3Ryb2tlfEZpbGx9Q29sb3IoKS4KKy8vCisvLyAgIGFubm90ICAgIC0gaGFuZGxlIHRvIGFuIGFubm90YXRpb24uCisvLyAgIHR5cGUgICAgIC0gdHlwZSBvZiB0aGUgY29sb3IgdG8gYmUgc2V0LgorLy8gICBSLCBHLCBCICAtIGJ1ZmZlciB0byBob2xkIHRoZSBSR0IgdmFsdWUgb2YgdGhlIGNvbG9yLiBSYW5nZXMgZnJvbSAwIHRvIDI1NS4KKy8vICAgQSAgICAgICAgLSBidWZmZXIgdG8gaG9sZCB0aGUgb3BhY2l0eS4gUmFuZ2VzIGZyb20gMCB0byAyNTUuCisvLworLy8gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwuCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGQW5ub3RfU2V0Q29sb3IoRlBERl9BTk5PVEFUSU9OIGFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZBTk5PVF9DT0xPUlRZUEUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgQSk7CisKKy8vIEV4cGVyaW1lbnRhbCBBUEkuCisvLyBHZXQgdGhlIGNvbG9yIG9mIGFuIGFubm90YXRpb24uIElmIG5vIGNvbG9yIGlzIHNwZWNpZmllZCwgZGVmYXVsdCB0byB5ZWxsb3cKKy8vIGZvciBoaWdobGlnaHQgYW5ub3RhdGlvbiwgYmxhY2sgZm9yIGFsbCBlbHNlLiBGYWlscyB3aGVuIGNhbGxlZCBvbgorLy8gYW5ub3RhdGlvbnMgd2l0aCBhcHBlYXJhbmNlIHN0cmVhbXMgYWxyZWFkeSBkZWZpbmVkOyBpbnN0ZWFkIHVzZQorLy8gRlBERlBhdGhfR2V0e1N0cm9rZXxGaWxsfUNvbG9yKCkuCisvLworLy8gICBhbm5vdCAgICAtIGhhbmRsZSB0byBhbiBhbm5vdGF0aW9uLgorLy8gICB0eXBlICAgICAtIHR5cGUgb2YgdGhlIGNvbG9yIHJlcXVlc3RlZC4KKy8vICAgUiwgRywgQiAgLSBidWZmZXIgdG8gaG9sZCB0aGUgUkdCIHZhbHVlIG9mIHRoZSBjb2xvci4gUmFuZ2VzIGZyb20gMCB0byAyNTUuCisvLyAgIEEgICAgICAgIC0gYnVmZmVyIHRvIGhvbGQgdGhlIG9wYWNpdHkuIFJhbmdlcyBmcm9tIDAgdG8gMjU1LgorLy8KKy8vIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLgorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRlBERkFubm90X0dldENvbG9yKEZQREZfQU5OT1RBVElPTiBhbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGQU5OT1RfQ09MT1JUWVBFIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50KiBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCogRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQqIEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50KiBBKTsKKworLy8gRXhwZXJpbWVudGFsIEFQSS4KKy8vIENoZWNrIGlmIHRoZSBhbm5vdGF0aW9uIGlzIG9mIGEgdHlwZSB0aGF0IGhhcyBhdHRhY2htZW50IHBvaW50cworLy8gKGkuZS4gcXVhZHBvaW50cykuIFF1YWRwb2ludHMgYXJlIHRoZSB2ZXJ0aWNlcyBvZiB0aGUgcmVjdGFuZ2UgdGhhdAorLy8gZW5jb21wYXNzZXMgdGhlIHRleHRzIGFmZmVjdGVkIGJ5IHRoZSBhbm5vdGF0aW9uLiBUaGV5IHByb3ZpZGUgdGhlCisvLyBjb29yZGluYXRlcyBpbiB0aGUgcGFnZSB3aGVyZSB0aGUgYW5ub3RhdGlvbiBpcyBhdHRhY2hlZC4gT25seSB0ZXh0IG1hcmt1cAorLy8gYW5ub3RhdGlvbnMgKGkuZS4gaGlnaGxpZ2h0LCBzdHJpa2VvdXQsIHNxdWlnZ2x5LCBhbmQgdW5kZXJsaW5lKSBhbmQgbGluaworLy8gYW5ub3RhdGlvbnMgaGF2ZSBxdWFkcG9pbnRzLgorLy8KKy8vICAgYW5ub3QgIC0gaGFuZGxlIHRvIGFuIGFubm90YXRpb24uCisvLworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBhbm5vdGF0aW9uIGlzIG9mIGEgdHlwZSB0aGF0IGhhcyBxdWFkcG9pbnRzLCBmYWxzZQorLy8gb3RoZXJ3aXNlLgorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZBbm5vdF9IYXNBdHRhY2htZW50UG9pbnRzKEZQREZfQU5OT1RBVElPTiBhbm5vdCk7CisKKy8vIEV4cGVyaW1lbnRhbCBBUEkuCisvLyBTZXQgdGhlIGF0dGFjaG1lbnQgcG9pbnRzIChpLmUuIHF1YWRwb2ludHMpIG9mIGFuIGFubm90YXRpb24uIElmIHRoZQorLy8gYW5ub3RhdGlvbidzIGFwcGVhcmFuY2Ugc3RyZWFtIGlzIGRlZmluZWQgYW5kIHRoaXMgYW5ub3RhdGlvbiBpcyBvZiBhIHR5cGUKKy8vIHdpdGggcXVhZHBvaW50cywgdGhlbiB1cGRhdGUgdGhlIGJvdW5kaW5nIGJveCB0b28gaWYgdGhlIG5ldyBxdWFkcG9pbnRzCisvLyBkZWZpbmUgYSBiaWdnZXIgb25lLgorLy8KKy8vICAgYW5ub3QgICAgICAtIGhhbmRsZSB0byBhbiBhbm5vdGF0aW9uLgorLy8gICBxdWFkUG9pbnRzIC0gdGhlIHF1YWRwb2ludHMgdG8gYmUgc2V0LgorLy8KKy8vIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLgorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZBbm5vdF9TZXRBdHRhY2htZW50UG9pbnRzKEZQREZfQU5OT1RBVElPTiBhbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZTX1FVQURQT0lOVFNGKiBxdWFkUG9pbnRzKTsKKworLy8gRXhwZXJpbWVudGFsIEFQSS4KKy8vIEdldCB0aGUgYXR0YWNobWVudCBwb2ludHMgKGkuZS4gcXVhZHBvaW50cykgb2YgYW4gYW5ub3RhdGlvbi4KKy8vCisvLyAgIGFubm90ICAgICAgLSBoYW5kbGUgdG8gYW4gYW5ub3RhdGlvbi4KKy8vICAgcXVhZFBvaW50cyAtIHJlY2VpdmVzIHRoZSBxdWFkcG9pbnRzOyBtdXN0IG5vdCBiZSBOVUxMLgorLy8KKy8vIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLgorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZBbm5vdF9HZXRBdHRhY2htZW50UG9pbnRzKEZQREZfQU5OT1RBVElPTiBhbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX1FVQURQT0lOVFNGKiBxdWFkUG9pbnRzKTsKKworLy8gRXhwZXJpbWVudGFsIEFQSS4KKy8vIFNldCB0aGUgYW5ub3RhdGlvbiByZWN0YW5nbGUgZGVmaW5pbmcgdGhlIGxvY2F0aW9uIG9mIHRoZSBhbm5vdGF0aW9uLiBJZiB0aGUKKy8vIGFubm90YXRpb24ncyBhcHBlYXJhbmNlIHN0cmVhbSBpcyBkZWZpbmVkIGFuZCB0aGlzIGFubm90YXRpb24gaXMgb2YgYSB0eXBlCisvLyB3aXRob3V0IHF1YWRwb2ludHMsIHRoZW4gdXBkYXRlIHRoZSBib3VuZGluZyBib3ggdG9vIGlmIHRoZSBuZXcgcmVjdGFuZ2xlCisvLyBkZWZpbmVzIGEgYmlnZ2VyIG9uZS4KKy8vCisvLyAgIGFubm90ICAtIGhhbmRsZSB0byBhbiBhbm5vdGF0aW9uLgorLy8gICByZWN0ICAgLSB0aGUgYW5ub3RhdGlvbiByZWN0YW5nbGUgdG8gYmUgc2V0LgorLy8KKy8vIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLgorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRlBERkFubm90X1NldFJlY3QoRlBERl9BTk5PVEFUSU9OIGFubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlNfUkVDVEYqIHJlY3QpOworCisvLyBFeHBlcmltZW50YWwgQVBJLgorLy8gR2V0IHRoZSBhbm5vdGF0aW9uIHJlY3RhbmdsZSBkZWZpbmluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGFubm90YXRpb24uCisvLworLy8gICBhbm5vdCAgLSBoYW5kbGUgdG8gYW4gYW5ub3RhdGlvbi4KKy8vICAgcmVjdCAgIC0gcmVjZWl2ZXMgdGhlIHJlY3RhbmdsZTsgbXVzdCBub3QgYmUgTlVMTC4KKy8vCisvLyBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bC4KK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZBbm5vdF9HZXRSZWN0KEZQREZfQU5OT1RBVElPTiBhbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX1JFQ1RGKiByZWN0KTsKKworLy8gRXhwZXJpbWVudGFsIEFQSS4KKy8vIENoZWNrIGlmIHxhbm5vdHwncyBkaWN0aW9uYXJ5IGhhcyB8a2V5fCBhcyBhIGtleS4KKy8vCisvLyAgIGFubm90ICAtIGhhbmRsZSB0byBhbiBhbm5vdGF0aW9uLgorLy8gICBrZXkgICAgLSB0aGUga2V5IHRvIGxvb2sgZm9yLCBlbmNvZGVkIGluIFVURi04LgorLy8KKy8vIFJldHVybnMgdHJ1ZSBpZiB8a2V5fCBleGlzdHMuCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGQW5ub3RfSGFzS2V5KEZQREZfQU5OT1RBVElPTiBhbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIGtleSk7CisKKy8vIEV4cGVyaW1lbnRhbCBBUEkuCisvLyBHZXQgdGhlIHR5cGUgb2YgdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gfGtleXwgaW4gfGFubm90fCdzIGRpY3Rpb25hcnkuCisvLworLy8gICBhbm5vdCAgLSBoYW5kbGUgdG8gYW4gYW5ub3RhdGlvbi4KKy8vICAga2V5ICAgIC0gdGhlIGtleSB0byBsb29rIGZvciwgZW5jb2RlZCBpbiBVVEYtOC4KKy8vCisvLyBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBkaWN0aW9uYXJ5IHZhbHVlLgorRlBERl9FWFBPUlQgRlBERl9PQkpFQ1RfVFlQRSBGUERGX0NBTExDT05WCitGUERGQW5ub3RfR2V0VmFsdWVUeXBlKEZQREZfQU5OT1RBVElPTiBhbm5vdCwgRlBERl9CWVRFU1RSSU5HIGtleSk7CisKKy8vIEV4cGVyaW1lbnRhbCBBUEkuCisvLyBTZXQgdGhlIHN0cmluZyB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHxrZXl8IGluIHxhbm5vdHwncyBkaWN0aW9uYXJ5LAorLy8gb3ZlcndyaXRpbmcgdGhlIGV4aXN0aW5nIHZhbHVlIGlmIGFueS4gVGhlIHZhbHVlIHR5cGUgd291bGQgYmUKKy8vIEZQREZfT0JKRUNUX1NUUklORyBhZnRlciB0aGlzIGZ1bmN0aW9uIGNhbGwgc3VjY2VlZHMuCisvLworLy8gICBhbm5vdCAgLSBoYW5kbGUgdG8gYW4gYW5ub3RhdGlvbi4KKy8vICAga2V5ICAgIC0gdGhlIGtleSB0byB0aGUgZGljdGlvbmFyeSBlbnRyeSB0byBiZSBzZXQsIGVuY29kZWQgaW4gVVRGLTguCisvLyAgIHZhbHVlICAtIHRoZSBzdHJpbmcgdmFsdWUgdG8gYmUgc2V0LCBlbmNvZGVkIGluIFVURjE2LUxFLgorLy8KKy8vIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLgorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZBbm5vdF9TZXRTdHJpbmdWYWx1ZShGUERGX0FOTk9UQVRJT04gYW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgdmFsdWUpOworCisvLyBFeHBlcmltZW50YWwgQVBJLgorLy8gR2V0IHRoZSBzdHJpbmcgdmFsdWUgY29ycmVzcG9uZGluZyB0byB8a2V5fCBpbiB8YW5ub3R8J3MgZGljdGlvbmFyeS4gfGJ1ZmZlcnwKKy8vIGlzIG9ubHkgbW9kaWZpZWQgaWYgfGJ1ZmxlbnwgaXMgbG9uZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiBjb250ZW50cy4gTm90ZSB0aGF0CisvLyBpZiB8a2V5fCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZGljdGlvbmFyeSBvciBpZiB8a2V5fCdzIGNvcnJlc3BvbmRpbmcgdmFsdWUKKy8vIGluIHRoZSBkaWN0aW9uYXJ5IGlzIG5vdCBhIHN0cmluZyAoaS5lLiB0aGUgdmFsdWUgaXMgbm90IG9mIHR5cGUKKy8vIEZQREZfT0JKRUNUX1NUUklORyBvciBGUERGX09CSkVDVF9OQU1FKSwgdGhlbiBhbiBlbXB0eSBzdHJpbmcgd291bGQgYmUgY29waWVkCisvLyB0byB8YnVmZmVyfCBhbmQgdGhlIHJldHVybiB2YWx1ZSB3b3VsZCBiZSAyLiBPbiBvdGhlciBlcnJvcnMsIG5vdGhpbmcgd291bGQKKy8vIGJlIGFkZGVkIHRvIHxidWZmZXJ8IGFuZCB0aGUgcmV0dXJuIHZhbHVlIHdvdWxkIGJlIDAuCisvLworLy8gICBhbm5vdCAgLSBoYW5kbGUgdG8gYW4gYW5ub3RhdGlvbi4KKy8vICAga2V5ICAgIC0gdGhlIGtleSB0byB0aGUgcmVxdWVzdGVkIGRpY3Rpb25hcnkgZW50cnksIGVuY29kZWQgaW4gVVRGLTguCisvLyAgIGJ1ZmZlciAtIGJ1ZmZlciBmb3IgaG9sZGluZyB0aGUgdmFsdWUgc3RyaW5nLCBlbmNvZGVkIGluIFVURjE2LUxFLgorLy8gICBidWZsZW4gLSBsZW5ndGggb2YgdGhlIGJ1ZmZlci4KKy8vCisvLyBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB2YWx1ZS4KK0ZQREZfRVhQT1JUIHVuc2lnbmVkIGxvbmcgRlBERl9DQUxMQ09OVgorRlBERkFubm90X0dldFN0cmluZ1ZhbHVlKEZQREZfQU5OT1RBVElPTiBhbm5vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1Zmxlbik7CisKKy8vIEV4cGVyaW1lbnRhbCBBUEkuCisvLyBTZXQgdGhlIEFQIChhcHBlYXJhbmNlIHN0cmluZykgaW4gfGFubm90fCdzIGRpY3Rpb25hcnkgZm9yIGEgZ2l2ZW4KKy8vIHxhcHBlYXJhbmNlTW9kZXwuCisvLworLy8gICBhbm5vdCAgICAgICAgICAtIGhhbmRsZSB0byBhbiBhbm5vdGF0aW9uLgorLy8gICBhcHBlYXJhbmNlTW9kZSAtIHRoZSBhcHBlYXJhbmNlIG1vZGUgKG5vcm1hbCwgcm9sbG92ZXIgb3IgZG93bikgZm9yIHdoaWNoCisvLyAgICAgICAgICAgICAgICAgICAgdG8gZ2V0IHRoZSBBUC4KKy8vICAgdmFsdWUgICAgICAgICAgLSB0aGUgc3RyaW5nIHZhbHVlIHRvIGJlIHNldCwgZW5jb2RlZCBpbiBVVEYxNi1MRS4gSWYKKy8vICAgICAgICAgICAgICAgICAgICBudWxscHRyIGlzIHBhc3NlZCwgdGhlIEFQIGlzIGNsZWFyZWQgZm9yIHRoYXQgbW9kZS4gSWYgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgbW9kZSBpcyBOb3JtYWwsIEFQcyBmb3IgYWxsIG1vZGVzIGFyZSBjbGVhcmVkLgorLy8KKy8vIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLgorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZBbm5vdF9TZXRBUChGUERGX0FOTk9UQVRJT04gYW5ub3QsCisgICAgICAgICAgICAgICAgRlBERl9BTk5PVF9BUFBFQVJBTkNFTU9ERSBhcHBlYXJhbmNlTW9kZSwKKyAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgdmFsdWUpOworCisvLyBFeHBlcmltZW50YWwgQVBJLgorLy8gR2V0IHRoZSBBUCAoYXBwZWFyYW5jZSBzdHJpbmcpIGZyb20gfGFubm90fCdzIGRpY3Rpb25hcnkgZm9yIGEgZ2l2ZW4KKy8vIHxhcHBlYXJhbmNlTW9kZXwuCisvLyB8YnVmZmVyfCBpcyBvbmx5IG1vZGlmaWVkIGlmIHxidWZsZW58IGlzIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSB3aG9sZSBBUAorLy8gc3RyaW5nLiBJZiB8YnVmbGVufCBpcyBzbWFsbGVyLCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgQVAgaXMgc3RpbGwgcmV0dXJuZWQsCisvLyBidXQgbm90aGluZyBpcyBjb3BpZWQuCisvLyBJZiB0aGVyZSBpcyBubyBhcHBlYXJhbmNlIHN0cmVhbSBmb3IgfGFubm90fCBpbiB8YXBwZWFyYW5jZU1vZGV8LCBhbiBlbXB0eQorLy8gc3RyaW5nIGlzIHdyaXR0ZW4gdG8gfGJ1ZnwgYW5kIDIgaXMgcmV0dXJuZWQuCisvLyBPbiBvdGhlciBlcnJvcnMsIG5vdGhpbmcgaXMgd3JpdHRlbiB0byB8YnVmZmVyfCBhbmQgMCBpcyByZXR1cm5lZC4KKy8vCisvLyAgIGFubm90ICAgICAgICAgIC0gaGFuZGxlIHRvIGFuIGFubm90YXRpb24uCisvLyAgIGFwcGVhcmFuY2VNb2RlIC0gdGhlIGFwcGVhcmFuY2UgbW9kZSAobm9ybWFsLCByb2xsb3ZlciBvciBkb3duKSBmb3Igd2hpY2gKKy8vICAgICAgICAgICAgICAgICAgICB0byBnZXQgdGhlIEFQLgorLy8gICBidWZmZXIgICAgICAgICAtIGJ1ZmZlciBmb3IgaG9sZGluZyB0aGUgdmFsdWUgc3RyaW5nLCBlbmNvZGVkIGluIFVURjE2LUxFLgorLy8gICBidWZsZW4gICAgICAgICAtIGxlbmd0aCBvZiB0aGUgYnVmZmVyLgorLy8KKy8vIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHZhbHVlLgorRlBERl9FWFBPUlQgdW5zaWduZWQgbG9uZyBGUERGX0NBTExDT05WCitGUERGQW5ub3RfR2V0QVAoRlBERl9BTk5PVEFUSU9OIGFubm90LAorICAgICAgICAgICAgICAgIEZQREZfQU5OT1RfQVBQRUFSQU5DRU1PREUgYXBwZWFyYW5jZU1vZGUsCisgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmbGVuKTsKKworLy8gRXhwZXJpbWVudGFsIEFQSS4KKy8vIEdldCB0aGUgYW5ub3RhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHxrZXl8IGluIHxhbm5vdHwncyBkaWN0aW9uYXJ5LiBDb21tb24KKy8vIGtleXMgZm9yIGxpbmtpbmcgYW5ub3RhdGlvbnMgaW5jbHVkZSAiSVJUIiBhbmQgIlBvcHVwIi4gTXVzdCBjYWxsCisvLyBGUERGUGFnZV9DbG9zZUFubm90KCkgd2hlbiB0aGUgYW5ub3RhdGlvbiByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIGlzIG5vCisvLyBsb25nZXIgbmVlZGVkLgorLy8KKy8vICAgYW5ub3QgIC0gaGFuZGxlIHRvIGFuIGFubm90YXRpb24uCisvLyAgIGtleSAgICAtIHRoZSBrZXkgdG8gdGhlIHJlcXVlc3RlZCBkaWN0aW9uYXJ5IGVudHJ5LCBlbmNvZGVkIGluIFVURi04LgorLy8KKy8vIFJldHVybnMgYSBoYW5kbGUgdG8gdGhlIGxpbmtlZCBhbm5vdGF0aW9uIG9iamVjdCwgb3IgTlVMTCBvbiBmYWlsdXJlLgorRlBERl9FWFBPUlQgRlBERl9BTk5PVEFUSU9OIEZQREZfQ0FMTENPTlYKK0ZQREZBbm5vdF9HZXRMaW5rZWRBbm5vdChGUERGX0FOTk9UQVRJT04gYW5ub3QsIEZQREZfQllURVNUUklORyBrZXkpOworCisvLyBFeHBlcmltZW50YWwgQVBJLgorLy8gR2V0IHRoZSBhbm5vdGF0aW9uIGZsYWdzIG9mIHxhbm5vdHwuCisvLworLy8gICBhbm5vdCAgICAtIGhhbmRsZSB0byBhbiBhbm5vdGF0aW9uLgorLy8KKy8vIFJldHVybnMgdGhlIGFubm90YXRpb24gZmxhZ3MuCitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OViBGUERGQW5ub3RfR2V0RmxhZ3MoRlBERl9BTk5PVEFUSU9OIGFubm90KTsKKworLy8gRXhwZXJpbWVudGFsIEFQSS4KKy8vIFNldCB0aGUgfGFubm90fCdzIGZsYWdzIHRvIGJlIG9mIHRoZSB2YWx1ZSB8ZmxhZ3N8LgorLy8KKy8vICAgYW5ub3QgICAgICAtIGhhbmRsZSB0byBhbiBhbm5vdGF0aW9uLgorLy8gICBmbGFncyAgICAgIC0gdGhlIGZsYWcgdmFsdWVzIHRvIGJlIHNldC4KKy8vCisvLyBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bC4KK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZBbm5vdF9TZXRGbGFncyhGUERGX0FOTk9UQVRJT04gYW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKKworLy8gRXhwZXJpbWVudGFsIEFQSS4KKy8vIEdldCB0aGUgYW5ub3RhdGlvbiBmbGFncyBvZiB8YW5ub3R8LCB3aGljaCBpcyBhbiBpbnRlcmFjdGl2ZSBmb3JtCisvLyBhbm5vdGF0aW9uIGluIHxwYWdlfC4KKy8vCisvLyAgIHBhZ2UgICAgIC0gaGFuZGxlIHRvIGEgcGFnZS4KKy8vICAgYW5ub3QgICAgLSBoYW5kbGUgdG8gYW4gaW50ZXJhY3RpdmUgZm9ybSBhbm5vdGF0aW9uLgorLy8KKy8vIFJldHVybnMgdGhlIGFubm90YXRpb24gZmxhZ3Mgc3BlY2lmaWMgdG8gaW50ZXJhY3RpdmUgZm9ybXMuCitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OVgorRlBERkFubm90X0dldEZvcm1GaWVsZEZsYWdzKEZQREZfUEFHRSBwYWdlLCBGUERGX0FOTk9UQVRJT04gYW5ub3QpOworCisvLyBFeHBlcmltZW50YWwgQVBJLgorLy8gUmV0cmlldmVzIGFuIGludGVyYWN0aXZlIGZvcm0gYW5ub3RhdGlvbiB3aG9zZSByZWN0YW5nbGUgY29udGFpbnMgYSBnaXZlbgorLy8gcG9pbnQgb24gYSBwYWdlLiBNdXN0IGNhbGwgRlBERlBhZ2VfQ2xvc2VBbm5vdCgpIHdoZW4gdGhlIGFubm90YXRpb24gcmV0dXJuZWQKKy8vIGlzIG5vIGxvbmdlciBuZWVkZWQuCisvLworLy8KKy8vICAgIGhIYW5kbGUgICAgIC0gICBoYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUsIHJldHVybmVkIGJ5CisvLyAgICAgICAgICAgICAgICAgICAgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KKy8vICAgIHBhZ2UgICAgICAgIC0gICBoYW5kbGUgdG8gdGhlIHBhZ2UsIHJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UgZnVuY3Rpb24uCisvLyAgICBwYWdlX3ggICAgICAtICAgWCBwb3NpdGlvbiBpbiBQREYgInVzZXIgc3BhY2UiLgorLy8gICAgcGFnZV95ICAgICAgLSAgIFkgcG9zaXRpb24gaW4gUERGICJ1c2VyIHNwYWNlIi4KKy8vCisvLyBSZXR1cm5zIHRoZSBpbnRlcmFjdGl2ZSBmb3JtIGFubm90YXRpb24gd2hvc2UgcmVjdGFuZ2xlIGNvbnRhaW5zIHRoZSBnaXZlbgorLy8gY29vcmRpbmF0ZXMgb24gdGhlIHBhZ2UuIElmIHRoZXJlIGlzIG5vIHN1Y2ggYW5ub3RhdGlvbiwgcmV0dXJuIE5VTEwuCitGUERGX0VYUE9SVCBGUERGX0FOTk9UQVRJT04gRlBERl9DQUxMQ09OVgorRlBERkFubm90X0dldEZvcm1GaWVsZEF0UG9pbnQoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV95KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAvLyBleHRlcm4gIkMiCisjZW5kaWYgIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAgLy8gUFVCTElDX0ZQREZfQU5OT1RfSF8KZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX2F0dGFjaG1lbnQuaCBiL3B1YmxpYy9mcGRmX2F0dGFjaG1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjU1OTc0Ci0tLSAvZGV2L251bGwKKysrIGIvcHVibGljL2ZwZGZfYXR0YWNobWVudC5oCkBAIC0wLDAgKzEsMTcwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgUFVCTElDX0ZQREZfQVRUQUNITUVOVF9IXworI2RlZmluZSBQVUJMSUNfRlBERl9BVFRBQ0hNRU5UX0hfCisKKy8vIE5PTElOVE5FWFRMSU5FKGJ1aWxkL2luY2x1ZGUpCisjaW5jbHVkZSAiZnBkZnZpZXcuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAgLy8gX19jcGx1c3BsdXMKKworLy8gRXhwZXJpbWVudGFsIEFQSS4KKy8vIEdldCB0aGUgbnVtYmVyIG9mIGVtYmVkZGVkIGZpbGVzIGluIHxkb2N1bWVudHwuCisvLworLy8gICBkb2N1bWVudCAtIGhhbmRsZSB0byBhIGRvY3VtZW50LgorLy8KKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBlbWJlZGRlZCBmaWxlcyBpbiB8ZG9jdW1lbnR8LgorRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYKK0ZQREZEb2NfR2V0QXR0YWNobWVudENvdW50KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOworCisvLyBFeHBlcmltZW50YWwgQVBJLgorLy8gQWRkIGFuIGVtYmVkZGVkIGZpbGUgd2l0aCB8bmFtZXwgaW4gfGRvY3VtZW50fC4gSWYgfG5hbWV8IGlzIGVtcHR5LCBvciBpZgorLy8gfG5hbWV8IGlzIHRoZSBuYW1lIG9mIGEgZXhpc3RpbmcgZW1iZWRkZWQgZmlsZSBpbiB8ZG9jdW1lbnR8LCBvciBpZgorLy8gfGRvY3VtZW50fCdzIGVtYmVkZGVkIGZpbGUgbmFtZSB0cmVlIGlzIHRvbyBkZWVwIChpLmUuIHxkb2N1bWVudHwgaGFzIHRvbworLy8gbWFueSBlbWJlZGRlZCBmaWxlcyBhbHJlYWR5KSwgdGhlbiBhIG5ldyBhdHRhY2htZW50IHdpbGwgbm90IGJlIGFkZGVkLgorLy8KKy8vICAgZG9jdW1lbnQgLSBoYW5kbGUgdG8gYSBkb2N1bWVudC4KKy8vICAgbmFtZSAgICAgLSBuYW1lIG9mIHRoZSBuZXcgYXR0YWNobWVudC4KKy8vCisvLyBSZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBuZXcgYXR0YWNobWVudCBvYmplY3QsIG9yIE5VTEwgb24gZmFpbHVyZS4KK0ZQREZfRVhQT1JUIEZQREZfQVRUQUNITUVOVCBGUERGX0NBTExDT05WCitGUERGRG9jX0FkZEF0dGFjaG1lbnQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9XSURFU1RSSU5HIG5hbWUpOworCisvLyBFeHBlcmltZW50YWwgQVBJLgorLy8gR2V0IHRoZSBlbWJlZGRlZCBhdHRhY2htZW50IGF0IHxpbmRleHwgaW4gfGRvY3VtZW50fC4gTm90ZSB0aGF0IHRoZSByZXR1cm5lZAorLy8gYXR0YWNobWVudCBoYW5kbGUgaXMgb25seSB2YWxpZCB3aGlsZSB8ZG9jdW1lbnR8IGlzIG9wZW4uCisvLworLy8gICBkb2N1bWVudCAtIGhhbmRsZSB0byBhIGRvY3VtZW50LgorLy8gICBpbmRleCAgICAtIHRoZSBpbmRleCBvZiB0aGUgcmVxdWVzdGVkIGVtYmVkZGVkIGZpbGUuCisvLworLy8gUmV0dXJucyB0aGUgaGFuZGxlIHRvIHRoZSBhdHRhY2htZW50IG9iamVjdCwgb3IgTlVMTCBvbiBmYWlsdXJlLgorRlBERl9FWFBPUlQgRlBERl9BVFRBQ0hNRU5UIEZQREZfQ0FMTENPTlYKK0ZQREZEb2NfR2V0QXR0YWNobWVudChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBpbnQgaW5kZXgpOworCisvLyBFeHBlcmltZW50YWwgQVBJLgorLy8gRGVsZXRlIHRoZSBlbWJlZGRlZCBhdHRhY2htZW50IGF0IHxpbmRleHwgaW4gfGRvY3VtZW50fC4gTm90ZSB0aGF0IHRoaXMgZG9lcworLy8gbm90IHJlbW92ZSB0aGUgYXR0YWNobWVudCBkYXRhIGZyb20gdGhlIFBERiBmaWxlOyBpdCBzaW1wbHkgcmVtb3ZlcyB0aGUKKy8vIGZpbGUncyBlbnRyeSBpbiB0aGUgZW1iZWRkZWQgZmlsZXMgbmFtZSB0cmVlIHNvIHRoYXQgaXQgZG9lcyBub3QgYXBwZWFyIGluCisvLyB0aGUgYXR0YWNobWVudCBsaXN0LiBUaGlzIGJlaGF2aW9yIG1heSBjaGFuZ2UgaW4gdGhlIGZ1dHVyZS4KKy8vCisvLyAgIGRvY3VtZW50IC0gaGFuZGxlIHRvIGEgZG9jdW1lbnQuCisvLyAgIGluZGV4ICAgIC0gdGhlIGluZGV4IG9mIHRoZSBlbWJlZGRlZCBmaWxlIHRvIGJlIGRlbGV0ZWQuCisvLworLy8gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwuCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgorRlBERkRvY19EZWxldGVBdHRhY2htZW50KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIGludCBpbmRleCk7CisKKy8vIEV4cGVyaW1lbnRhbCBBUEkuCisvLyBHZXQgdGhlIG5hbWUgb2YgdGhlIHxhdHRhY2htZW50fCBmaWxlLiB8YnVmZmVyfCBpcyBvbmx5IG1vZGlmaWVkIGlmIHxidWZsZW58CisvLyBpcyBsb25nZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxlIG5hbWUuIE9uIGVycm9ycywgfGJ1ZmZlcnwgaXMgdW5tb2RpZmllZAorLy8gYW5kIHRoZSByZXR1cm5lZCBsZW5ndGggaXMgMC4KKy8vCisvLyAgIGF0dGFjaG1lbnQgLSBoYW5kbGUgdG8gYW4gYXR0YWNobWVudC4KKy8vICAgYnVmZmVyICAgICAtIGJ1ZmZlciBmb3IgaG9sZGluZyB0aGUgZmlsZSBuYW1lLCBlbmNvZGVkIGluIFVURjE2LUxFLgorLy8gICBidWZsZW4gICAgIC0gbGVuZ3RoIG9mIHRoZSBidWZmZXIuCisvLworLy8gUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBmaWxlIG5hbWUuCitGUERGX0VYUE9SVCB1bnNpZ25lZCBsb25nIEZQREZfQ0FMTENPTlYKK0ZQREZBdHRhY2htZW50X0dldE5hbWUoRlBERl9BVFRBQ0hNRU5UIGF0dGFjaG1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZsZW4pOworCisvLyBFeHBlcmltZW50YWwgQVBJLgorLy8gQ2hlY2sgaWYgdGhlIHBhcmFtcyBkaWN0aW9uYXJ5IG9mIHxhdHRhY2htZW50fCBoYXMgfGtleXwgYXMgYSBrZXkuCisvLworLy8gICBhdHRhY2htZW50IC0gaGFuZGxlIHRvIGFuIGF0dGFjaG1lbnQuCisvLyAgIGtleSAgICAgICAgLSB0aGUga2V5IHRvIGxvb2sgZm9yLCBlbmNvZGVkIGluIFVURi04LgorLy8KKy8vIFJldHVybnMgdHJ1ZSBpZiB8a2V5fCBleGlzdHMuCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgorRlBERkF0dGFjaG1lbnRfSGFzS2V5KEZQREZfQVRUQUNITUVOVCBhdHRhY2htZW50LCBGUERGX0JZVEVTVFJJTkcga2V5KTsKKworLy8gRXhwZXJpbWVudGFsIEFQSS4KKy8vIEdldCB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byB8a2V5fCBpbiB0aGUgcGFyYW1zIGRpY3Rpb25hcnkgb2YKKy8vIHRoZSBlbWJlZGRlZCB8YXR0YWNobWVudHwuCisvLworLy8gICBhdHRhY2htZW50IC0gaGFuZGxlIHRvIGFuIGF0dGFjaG1lbnQuCisvLyAgIGtleSAgICAgICAgLSB0aGUga2V5IHRvIGxvb2sgZm9yLCBlbmNvZGVkIGluIFVURi04LgorLy8KKy8vIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGRpY3Rpb25hcnkgdmFsdWUuCitGUERGX0VYUE9SVCBGUERGX09CSkVDVF9UWVBFIEZQREZfQ0FMTENPTlYKK0ZQREZBdHRhY2htZW50X0dldFZhbHVlVHlwZShGUERGX0FUVEFDSE1FTlQgYXR0YWNobWVudCwgRlBERl9CWVRFU1RSSU5HIGtleSk7CisKKy8vIEV4cGVyaW1lbnRhbCBBUEkuCisvLyBTZXQgdGhlIHN0cmluZyB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHxrZXl8IGluIHRoZSBwYXJhbXMgZGljdGlvbmFyeSBvZiB0aGUKKy8vIGVtYmVkZGVkIGZpbGUgfGF0dGFjaG1lbnR8LCBvdmVyd3JpdGluZyB0aGUgZXhpc3RpbmcgdmFsdWUgaWYgYW55LiBUaGUgdmFsdWUKKy8vIHR5cGUgc2hvdWxkIGJlIEZQREZfT0JKRUNUX1NUUklORyBhZnRlciB0aGlzIGZ1bmN0aW9uIGNhbGwgc3VjY2VlZHMuCisvLworLy8gICBhdHRhY2htZW50IC0gaGFuZGxlIHRvIGFuIGF0dGFjaG1lbnQuCisvLyAgIGtleSAgICAgICAgLSB0aGUga2V5IHRvIHRoZSBkaWN0aW9uYXJ5IGVudHJ5LCBlbmNvZGVkIGluIFVURi04LgorLy8gICB2YWx1ZSAgICAgIC0gdGhlIHN0cmluZyB2YWx1ZSB0byBiZSBzZXQsIGVuY29kZWQgaW4gVVRGMTYtTEUuCisvLworLy8gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwuCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgorRlBERkF0dGFjaG1lbnRfU2V0U3RyaW5nVmFsdWUoRlBERl9BVFRBQ0hNRU5UIGF0dGFjaG1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHZhbHVlKTsKKworLy8gRXhwZXJpbWVudGFsIEFQSS4KKy8vIEdldCB0aGUgc3RyaW5nIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gfGtleXwgaW4gdGhlIHBhcmFtcyBkaWN0aW9uYXJ5IG9mIHRoZQorLy8gZW1iZWRkZWQgZmlsZSB8YXR0YWNobWVudHwuIHxidWZmZXJ8IGlzIG9ubHkgbW9kaWZpZWQgaWYgfGJ1ZmxlbnwgaXMgbG9uZ2VyCisvLyB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyB2YWx1ZS4gTm90ZSB0aGF0IGlmIHxrZXl8IGRvZXMgbm90IGV4aXN0IGluIHRoZQorLy8gZGljdGlvbmFyeSBvciBpZiB8a2V5fCdzIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gdGhlIGRpY3Rpb25hcnkgaXMgbm90IGEKKy8vIHN0cmluZyAoaS5lLiB0aGUgdmFsdWUgaXMgbm90IG9mIHR5cGUgRlBERl9PQkpFQ1RfU1RSSU5HIG9yCisvLyBGUERGX09CSkVDVF9OQU1FKSwgdGhlbiBhbiBlbXB0eSBzdHJpbmcgd291bGQgYmUgY29waWVkIHRvIHxidWZmZXJ8IGFuZCB0aGUKKy8vIHJldHVybiB2YWx1ZSB3b3VsZCBiZSAyLiBPbiBvdGhlciBlcnJvcnMsIG5vdGhpbmcgd291bGQgYmUgYWRkZWQgdG8gfGJ1ZmZlcnwKKy8vIGFuZCB0aGUgcmV0dXJuIHZhbHVlIHdvdWxkIGJlIDAuCisvLworLy8gICBhdHRhY2htZW50IC0gaGFuZGxlIHRvIGFuIGF0dGFjaG1lbnQuCisvLyAgIGtleSAgICAgICAgLSB0aGUga2V5IHRvIHRoZSByZXF1ZXN0ZWQgc3RyaW5nIHZhbHVlLCBlbmNvZGVkIGluIFVURi04LgorLy8gICBidWZmZXIgICAgIC0gYnVmZmVyIGZvciBob2xkaW5nIHRoZSBzdHJpbmcgdmFsdWUgZW5jb2RlZCBpbiBVVEYxNi1MRS4KKy8vICAgYnVmbGVuICAgICAtIGxlbmd0aCBvZiB0aGUgYnVmZmVyLgorLy8KKy8vIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgZGljdGlvbmFyeSB2YWx1ZSBzdHJpbmcuCitGUERGX0VYUE9SVCB1bnNpZ25lZCBsb25nIEZQREZfQ0FMTENPTlYKK0ZQREZBdHRhY2htZW50X0dldFN0cmluZ1ZhbHVlKEZQREZfQVRUQUNITUVOVCBhdHRhY2htZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmbGVuKTsKKworLy8gRXhwZXJpbWVudGFsIEFQSS4KKy8vIFNldCB0aGUgZmlsZSBkYXRhIG9mIHxhdHRhY2htZW50fCwgb3ZlcndyaXRpbmcgdGhlIGV4aXN0aW5nIGZpbGUgZGF0YSBpZiBhbnkuCisvLyBUaGUgY3JlYXRpb24gZGF0ZSBhbmQgY2hlY2tzdW0gd2lsbCBiZSB1cGRhdGVkLCB3aGlsZSBhbGwgb3RoZXIgZGljdGlvbmFyeQorLy8gZW50cmllcyB3aWxsIGJlIGRlbGV0ZWQuIE5vdGUgdGhhdCBvbmx5IGNvbnRlbnRzIHdpdGggfGxlbnwgc21hbGxlciB0aGFuCisvLyBJTlRfTUFYIGlzIHN1cHBvcnRlZC4KKy8vCisvLyAgIGF0dGFjaG1lbnQgLSBoYW5kbGUgdG8gYW4gYXR0YWNobWVudC4KKy8vICAgY29udGVudHMgICAtIGJ1ZmZlciBob2xkaW5nIHRoZSBmaWxlIGRhdGEgdG8gYmUgd3JpdHRlbiBpbiByYXcgYnl0ZXMuCisvLyAgIGxlbiAgICAgICAgLSBsZW5ndGggb2YgZmlsZSBkYXRhLgorLy8KKy8vIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLgorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZBdHRhY2htZW50X1NldEZpbGUoRlBERl9BVFRBQ0hNRU5UIGF0dGFjaG1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nIGxlbik7CisKKy8vIEV4cGVyaW1lbnRhbCBBUEkuCisvLyBHZXQgdGhlIGZpbGUgZGF0YSBvZiB8YXR0YWNobWVudHwuIHxidWZmZXJ8IGlzIG9ubHkgbW9kaWZpZWQgaWYgfGJ1ZmxlbnwgaXMKKy8vIGxvbmdlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGZpbGUuIE9uIGVycm9ycywgfGJ1ZmZlcnwgaXMgdW5tb2RpZmllZCBhbmQgdGhlCisvLyByZXR1cm5lZCBsZW5ndGggaXMgMC4KKy8vCisvLyAgIGF0dGFjaG1lbnQgLSBoYW5kbGUgdG8gYW4gYXR0YWNobWVudC4KKy8vICAgYnVmZmVyICAgICAtIGJ1ZmZlciBmb3IgaG9sZGluZyB0aGUgZmlsZSBkYXRhIGluIHJhdyBieXRlcy4KKy8vICAgYnVmbGVuICAgICAtIGxlbmd0aCBvZiB0aGUgYnVmZmVyLgorLy8KKy8vIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgZmlsZS4KK0ZQREZfRVhQT1JUIHVuc2lnbmVkIGxvbmcgRlBERl9DQUxMQ09OVgorRlBERkF0dGFjaG1lbnRfR2V0RmlsZShGUERGX0FUVEFDSE1FTlQgYXR0YWNobWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1Zmxlbik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgLy8gZXh0ZXJuICJDIgorI2VuZGlmICAvLyBfX2NwbHVzcGx1cworCisjZW5kaWYgIC8vIFBVQkxJQ19GUERGX0FUVEFDSE1FTlRfSF8KZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX2NhdGFsb2cuaCBiL3B1YmxpYy9mcGRmX2NhdGFsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGQyNzc1Ci0tLSAvZGV2L251bGwKKysrIGIvcHVibGljL2ZwZGZfY2F0YWxvZy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBQVUJMSUNfRlBERl9DQVRBTE9HX0hfCisjZGVmaW5lIFBVQkxJQ19GUERGX0NBVEFMT0dfSF8KKworLy8gTk9MSU5UTkVYVExJTkUoYnVpbGQvaW5jbHVkZSkKKyNpbmNsdWRlICJmcGRmdmlldy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmICAvLyBfX2NwbHVzcGx1cworCisvKioKKyAqIEV4cGVyaW1lbnRhbCBBUEkuCisgKgorICogRGV0ZXJtaW5lIGlmIHxkb2N1bWVudHwgcmVwcmVzZW50cyBhIHRhZ2dlZCBQREYuCisgKgorICogRm9yIHRoZSBkZWZpbml0aW9uIG9mIHRhZ2dlZCBQREYsIFNlZSAoc2VlIDEwLjcgIlRhZ2dlZCBQREYiIGluIFBERgorICogUmVmZXJlbmNlIDEuNykuCisgKgorICogICBkb2N1bWVudCAtIGhhbmRsZSB0byBhIGRvY3VtZW50LgorICoKKyAqIFJldHVybnMgfHRydWV8IGlmZiB8ZG9jdW1lbnR8IGlzIGEgdGFnZ2VkIFBERi4KKyAqLworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZDYXRhbG9nX0lzVGFnZ2VkKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gIC8vIGV4dGVybiAiQyIKKyNlbmRpZiAgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmICAvLyBQVUJMSUNfRlBERl9DQVRBTE9HX0hfCmRpZmYgLS1naXQgYS9wdWJsaWMvZnBkZl9kYXRhYXZhaWwuaCBiL3B1YmxpYy9mcGRmX2RhdGFhdmFpbC5oCmluZGV4IDI0MTNlMmIuLjNjZTkyMTEgMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmX2RhdGFhdmFpbC5oCisrKyBiL3B1YmxpYy9mcGRmX2RhdGFhdmFpbC5oCkBAIC02MCwxMyArNjAsMTMgQEAKIC8vIFJldHVybnMgYSBoYW5kbGUgdG8gdGhlIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciwgb3IgTlVMTCBvbiBlcnJvci4KIC8vCiAvLyB8RlBERkF2YWlsX0Rlc3Ryb3l8IG11c3QgYmUgY2FsbGVkIHdoZW4gZG9uZSB3aXRoIHRoZSBhdmFpbGFiaWxpdHkgcHJvdmlkZXIuCi1ETExFWFBPUlQgRlBERl9BVkFJTCBTVERDQUxMIEZQREZBdmFpbF9DcmVhdGUoRlhfRklMRUFWQUlMKiBmaWxlX2F2YWlsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRklMRUFDQ0VTUyogZmlsZSk7CitGUERGX0VYUE9SVCBGUERGX0FWQUlMIEZQREZfQ0FMTENPTlYgRlBERkF2YWlsX0NyZWF0ZShGWF9GSUxFQVZBSUwqIGZpbGVfYXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZJTEVBQ0NFU1MqIGZpbGUpOwogCiAvLyBEZXN0cm95IHRoZSB8YXZhaWx8IGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlci4KIC8vCiAvLyAgIGF2YWlsIC0gaGFuZGxlIHRvIGRvY3VtZW50IGF2YWlsYWJpbGl0eSBwcm92aWRlciB0byBiZSBkZXN0cm95ZWQuCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZBdmFpbF9EZXN0cm95KEZQREZfQVZBSUwgYXZhaWwpOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZBdmFpbF9EZXN0cm95KEZQREZfQVZBSUwgYXZhaWwpOwogCiAvLyBEb3dubG9hZCBoaW50cyBpbnRlcmZhY2UuIFVzZWQgdG8gcmVjZWl2ZSBoaW50cyBmb3IgZnVydGhlciBkb3dubG9hZGluZy4KIHR5cGVkZWYgc3RydWN0IF9GWF9ET1dOTE9BREhJTlRTIHsKQEAgLTEwMywxMSArMTAzLDEyIEBACiAvLyBBcHBsaWNhdGlvbnMgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuZXZlciBuZXcgZGF0YSBhcnJpdmVzLCBhbmQgcHJvY2VzcwogLy8gYWxsIHRoZSBnZW5lcmF0ZWQgZG93bmxvYWQgaGludHMsIGlmIGFueSwgdW50aWwgdGhlIGZ1bmN0aW9uIHJldHVybnMKIC8vIHxQREZfREFUQV9FUlJPUnwgb3IgfFBERl9EQVRBX0FWQUlMfC4KKy8vIGlmIGhpbnRzIGlzIG51bGxwdHIsIHRoZSBmdW5jdGlvbiBqdXN0IGNoZWNrIGN1cnJlbnQgZG9jdW1lbnQgYXZhaWxhYmlsaXR5LgogLy8KIC8vIE9uY2UgYWxsIGRhdGEgaXMgYXZhaWxhYmxlLCBjYWxsIHxGUERGQXZhaWxfR2V0RG9jdW1lbnR8IHRvIGdldCBhIGRvY3VtZW50CiAvLyBoYW5kbGUuCi1ETExFWFBPUlQgaW50IFNURENBTEwKLUZQREZBdmFpbF9Jc0RvY0F2YWlsKEZQREZfQVZBSUwgYXZhaWwsIEZYX0RPV05MT0FESElOVFMqIGhpbnRzKTsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZBdmFpbF9Jc0RvY0F2YWlsKEZQREZfQVZBSUwgYXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ET1dOTE9BREhJTlRTKiBoaW50cyk7CiAKIC8vIEdldCBkb2N1bWVudCBmcm9tIHRoZSBhdmFpbGFiaWxpdHkgcHJvdmlkZXIuCiAvLwpAQCAtMTE4LDggKzExOSw4IEBACiAvLwogLy8gV2hlbiB8RlBERkF2YWlsX0lzRG9jQXZhaWx8IHJldHVybnMgVFJVRSwgY2FsbCB8RlBERkF2YWlsX0dldERvY3VtZW50fCB0bwogLy8gcmV0cmlldmUgdGhlIGRvY3VtZW50IGhhbmRsZS4KLURMTEVYUE9SVCBGUERGX0RPQ1VNRU5UIFNURENBTEwgRlBERkF2YWlsX0dldERvY3VtZW50KEZQREZfQVZBSUwgYXZhaWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpOworRlBERl9FWFBPUlQgRlBERl9ET0NVTUVOVCBGUERGX0NBTExDT05WCitGUERGQXZhaWxfR2V0RG9jdW1lbnQoRlBERl9BVkFJTCBhdmFpbCwgRlBERl9CWVRFU1RSSU5HIHBhc3N3b3JkKTsKIAogLy8gR2V0IHRoZSBwYWdlIG51bWJlciBmb3IgdGhlIGZpcnN0IGF2YWlsYWJsZSBwYWdlIGluIGEgbGluZWFyaXplZCBQREYuCiAvLwpAQCAtMTMwLDcgKzEzMSw3IEBACiAvLyBGb3IgbW9zdCBsaW5lYXJpemVkIFBERnMsIHRoZSBmaXJzdCBhdmFpbGFibGUgcGFnZSB3aWxsIGJlIHRoZSBmaXJzdCBwYWdlLAogLy8gaG93ZXZlciwgc29tZSBQREZzIG1pZ2h0IG1ha2UgYW5vdGhlciBwYWdlIHRoZSBmaXJzdCBhdmFpbGFibGUgcGFnZS4KIC8vIEZvciBub24tbGluZWFyaXplZCBQREZzLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYWx3YXlzIHJldHVybiB6ZXJvLgotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZBdmFpbF9HZXRGaXJzdFBhZ2VOdW0oRlBERl9ET0NVTUVOVCBkb2MpOworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERkF2YWlsX0dldEZpcnN0UGFnZU51bShGUERGX0RPQ1VNRU5UIGRvYyk7CiAKIC8vIENoZWNrIGlmIHxwYWdlX2luZGV4fCBpcyByZWFkeSBmb3IgbG9hZGluZywgaWYgbm90LCBnZXQgdGhlCiAvLyB8RlhfRE9XTkxPQURISU5UU3wuCkBAIC0xNTAsOSArMTUxLDExIEBACiAvLyBhbGwgdGhlIGdlbmVyYXRlZCBkb3dubG9hZCB8aGludHN8LCBpZiBhbnksIHVudGlsIHRoaXMgZnVuY3Rpb24gcmV0dXJucwogLy8gfFBERl9EQVRBX0VSUk9SfCBvciB8UERGX0RBVEFfQVZBSUx8LiBBcHBsaWNhdGlvbnMgY2FuIHRoZW4gcGVyZm9ybSBwYWdlCiAvLyBsb2FkaW5nLgotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZBdmFpbF9Jc1BhZ2VBdmFpbChGUERGX0FWQUlMIGF2YWlsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFnZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRE9XTkxPQURISU5UUyogaGludHMpOworLy8gaWYgaGludHMgaXMgbnVsbHB0ciwgdGhlIGZ1bmN0aW9uIGp1c3QgY2hlY2sgY3VycmVudCBhdmFpbGFiaWxpdHkgb2YKKy8vIHNwZWNpZmllZCBwYWdlLgorRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERkF2YWlsX0lzUGFnZUF2YWlsKEZQREZfQVZBSUwgYXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhZ2VfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRE9XTkxPQURISU5UUyogaGludHMpOwogCiAvLyBDaGVjayBpZiBmb3JtIGRhdGEgaXMgcmVhZHkgZm9yIGluaXRpYWxpemF0aW9uLCBpZiBub3QsIGdldCB0aGUKIC8vIHxGWF9ET1dOTE9BREhJTlRTfC4KQEAgLTE3MSwxMCArMTc0LDEyIEBACiAvLyBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuZXZlciBuZXcgZGF0YSBhcnJpdmVzIGFuZAogLy8gcHJvY2VzcyBhbGwgdGhlIGdlbmVyYXRlZCBkb3dubG9hZCB8aGludHN8LCBpZiBhbnksIHVudGlsIHRoZSBmdW5jdGlvbgogLy8gfFBERl9GT1JNX0VSUk9SfCwgfFBERl9GT1JNX0FWQUlMfCBvciB8UERGX0ZPUk1fTk9URVhJU1R8LgorLy8gaWYgaGludHMgaXMgbnVsbHB0ciwgdGhlIGZ1bmN0aW9uIGp1c3QgY2hlY2sgY3VycmVudCBmb3JtIGF2YWlsYWJpbGl0eS4KKy8vCiAvLyBBcHBsaWNhdGlvbnMgY2FuIHRoZW4gcGVyZm9ybSBwYWdlIGxvYWRpbmcuIEl0IGlzIHJlY29tbWVuZCB0byBjYWxsCiAvLyB8RlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudHwgd2hlbiB8UERGX0ZPUk1fQVZBSUx8IGlzIHJldHVybmVkLgotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZBdmFpbF9Jc0Zvcm1BdmFpbChGUERGX0FWQUlMIGF2YWlsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ET1dOTE9BREhJTlRTKiBoaW50cyk7CitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OViBGUERGQXZhaWxfSXNGb3JtQXZhaWwoRlBERl9BVkFJTCBhdmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ET1dOTE9BREhJTlRTKiBoaW50cyk7CiAKIC8vIENoZWNrIHdoZXRoZXIgYSBkb2N1bWVudCBpcyBhIGxpbmVhcml6ZWQgUERGLgogLy8KQEAgLTE4OSw3ICsxOTQsNyBAQAogLy8gd2hlbiB3ZSBoYXZlIDFrICBvZiBkYXRhLiBJZiB0aGUgZmlsZXMgc2l6ZSBsZXNzIHRoYW4gMWssIGl0IHJldHVybnMKIC8vIHxQREZfTElORUFSSVpBVElPTl9VTktOT1dOfCBhcyB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lCiAvLyBpZiB0aGUgUERGIGlzIGxpbmVhcmxpemVkLgotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZBdmFpbF9Jc0xpbmVhcml6ZWQoRlBERl9BVkFJTCBhdmFpbCk7CitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OViBGUERGQXZhaWxfSXNMaW5lYXJpemVkKEZQREZfQVZBSUwgYXZhaWwpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX2RvYy5oIGIvcHVibGljL2ZwZGZfZG9jLmgKaW5kZXggOWQ1NWEyZS4uYjUyMzU3NSAxMDA2NDQKLS0tIGEvcHVibGljL2ZwZGZfZG9jLmgKKysrIGIvcHVibGljL2ZwZGZfZG9jLmgKQEAgLTI1LDYgKzI1LDE3IEBACiAvLyBMYXVuY2ggYW4gYXBwbGljYXRpb24gb3Igb3BlbiBhIGZpbGUuCiAjZGVmaW5lIFBERkFDVElPTl9MQVVOQ0ggNAogCisvLyBWaWV3IGRlc3RpbmF0aW9uIGZpdCB0eXBlcy4gU2VlIHBkZm1hcmsgcmVmZXJlbmNlIHY5LCBwYWdlIDQ4LgorI2RlZmluZSBQREZERVNUX1ZJRVdfVU5LTk9XTl9NT0RFIDAKKyNkZWZpbmUgUERGREVTVF9WSUVXX1hZWiAxCisjZGVmaW5lIFBERkRFU1RfVklFV19GSVQgMgorI2RlZmluZSBQREZERVNUX1ZJRVdfRklUSCAzCisjZGVmaW5lIFBERkRFU1RfVklFV19GSVRWIDQKKyNkZWZpbmUgUERGREVTVF9WSUVXX0ZJVFIgNQorI2RlZmluZSBQREZERVNUX1ZJRVdfRklUQiA2CisjZGVmaW5lIFBERkRFU1RfVklFV19GSVRCSCA3CisjZGVmaW5lIFBERkRFU1RfVklFV19GSVRCViA4CisKIHR5cGVkZWYgc3RydWN0IF9GU19RVUFEUE9JTlRTRiB7CiAgIEZTX0ZMT0FUIHgxOwogICBGU19GTE9BVCB5MTsKQEAgLTQ0LDcgKzU1LDcgQEAKIC8vCiAvLyBSZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBmaXJzdCBjaGlsZCBvZiB8Ym9va21hcmt8IG9yIHRoZSBmaXJzdCB0b3AtbGV2ZWwKIC8vIGJvb2ttYXJrIGl0ZW0uIE5VTEwgaWYgbm8gY2hpbGQgb3IgdG9wLWxldmVsIGJvb2ttYXJrIGZvdW5kLgotRExMRVhQT1JUIEZQREZfQk9PS01BUksgU1REQ0FMTAorRlBERl9FWFBPUlQgRlBERl9CT09LTUFSSyBGUERGX0NBTExDT05WCiBGUERGQm9va21hcmtfR2V0Rmlyc3RDaGlsZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LCBGUERGX0JPT0tNQVJLIGJvb2ttYXJrKTsKIAogLy8gR2V0IHRoZSBuZXh0IHNpYmxpbmcgb2YgfGJvb2ttYXJrfC4KQEAgLTU0LDcgKzY1LDcgQEAKIC8vCiAvLyBSZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBuZXh0IHNpYmxpbmcgb2YgfGJvb2ttYXJrfCwgb3IgTlVMTCBpZiB0aGlzIGlzIHRoZQogLy8gbGFzdCBib29rbWFyayBhdCB0aGlzIGxldmVsLgotRExMRVhQT1JUIEZQREZfQk9PS01BUksgU1REQ0FMTAorRlBERl9FWFBPUlQgRlBERl9CT09LTUFSSyBGUERGX0NBTExDT05WCiBGUERGQm9va21hcmtfR2V0TmV4dFNpYmxpbmcoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9CT09LTUFSSyBib29rbWFyayk7CiAKIC8vIEdldCB0aGUgdGl0bGUgb2YgfGJvb2ttYXJrfC4KQEAgLTcwLDkgKzgxLDEwIEBACiAvLyBSZWdhcmRsZXNzIG9mIHRoZSBwbGF0Zm9ybSwgdGhlIHxidWZmZXJ8IGlzIGFsd2F5cyBpbiBVVEYtMTZMRSBlbmNvZGluZy4gVGhlCiAvLyBzdHJpbmcgaXMgdGVybWluYXRlZCBieSBhIFVURjE2IE5VTCBjaGFyYWN0ZXIuIElmIHxidWZsZW58IGlzIGxlc3MgdGhhbiB0aGUKIC8vIHJlcXVpcmVkIGxlbmd0aCwgb3IgfGJ1ZmZlcnwgaXMgTlVMTCwgfGJ1ZmZlcnwgd2lsbCBub3QgYmUgbW9kaWZpZWQuCi1ETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZCb29rbWFya19HZXRUaXRsZShGUERGX0JPT0tNQVJLIGJvb2ttYXJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZsZW4pOworRlBERl9FWFBPUlQgdW5zaWduZWQgbG9uZyBGUERGX0NBTExDT05WCitGUERGQm9va21hcmtfR2V0VGl0bGUoRlBERl9CT09LTUFSSyBib29rbWFyaywKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZsZW4pOwogCiAvLyBGaW5kIHRoZSBib29rbWFyayB3aXRoIHx0aXRsZXwgaW4gfGRvY3VtZW50fC4KIC8vCkBAIC04Myw4ICs5NSw4IEBACiAvLwogLy8gfEZQREZCb29rbWFya19GaW5kfCB3aWxsIGFsd2F5cyByZXR1cm4gdGhlIGZpcnN0IGJvb2ttYXJrIGZvdW5kIGV2ZW4gaWYKIC8vIG11bHRpcGxlIGJvb2ttYXJrcyBoYXZlIHRoZSBzYW1lIHx0aXRsZXwuCi1ETExFWFBPUlQgRlBERl9CT09LTUFSSyBTVERDQUxMIEZQREZCb29rbWFya19GaW5kKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyB0aXRsZSk7CitGUERGX0VYUE9SVCBGUERGX0JPT0tNQVJLIEZQREZfQ0FMTENPTlYKK0ZQREZCb29rbWFya19GaW5kKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfV0lERVNUUklORyB0aXRsZSk7CiAKIC8vIEdldCB0aGUgZGVzdGluYXRpb24gYXNzb2NpYXRlZCB3aXRoIHxib29rbWFya3wuCiAvLwpAQCAtOTMsOCArMTA1LDggQEAKIC8vCiAvLyBSZXR1cm5zIHRoZSBoYW5kbGUgdG8gdGhlIGRlc3RpbmF0aW9uIGRhdGEsICBOVUxMIGlmIG5vIGRlc3RpbmF0aW9uIGlzCiAvLyBhc3NvY2lhdGVkIHdpdGggfGJvb2ttYXJrfC4KLURMTEVYUE9SVCBGUERGX0RFU1QgU1REQ0FMTCBGUERGQm9va21hcmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PS01BUksgYm9va21hcmspOworRlBERl9FWFBPUlQgRlBERl9ERVNUIEZQREZfQ0FMTENPTlYKK0ZQREZCb29rbWFya19HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQk9PS01BUksgYm9va21hcmspOwogCiAvLyBHZXQgdGhlIGFjdGlvbiBhc3NvY2lhdGVkIHdpdGggfGJvb2ttYXJrfC4KIC8vCkBAIC0xMDMsNyArMTE1LDggQEAKIC8vIFJldHVybnMgdGhlIGhhbmRsZSB0byB0aGUgYWN0aW9uIGRhdGEsIG9yIE5VTEwgaWYgbm8gYWN0aW9uIGlzIGFzc29jaWF0ZWQKIC8vIHdpdGggfGJvb2ttYXJrfC4gV2hlbiBOVUxMIGlzIHJldHVybmVkLCB8RlBERkJvb2ttYXJrX0dldERlc3R8IHNob3VsZCBiZQogLy8gY2FsbGVkIHRvIGdldCB0aGUgfGJvb2ttYXJrfCBkZXN0aW5hdGlvbiBkYXRhLgotRExMRVhQT1JUIEZQREZfQUNUSU9OIFNURENBTEwgRlBERkJvb2ttYXJrX0dldEFjdGlvbihGUERGX0JPT0tNQVJLIGJvb2ttYXJrKTsKK0ZQREZfRVhQT1JUIEZQREZfQUNUSU9OIEZQREZfQ0FMTENPTlYKK0ZQREZCb29rbWFya19HZXRBY3Rpb24oRlBERl9CT09LTUFSSyBib29rbWFyayk7CiAKIC8vIEdldCB0aGUgdHlwZSBvZiB8YWN0aW9ufC4KIC8vCkBAIC0xMTUsNyArMTI4LDcgQEAKIC8vICAgUERGQUNUSU9OX1JFTU9URUdPVE8KIC8vICAgUERGQUNUSU9OX1VSSQogLy8gICBQREZBQ1RJT05fTEFVTkNICi1ETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZBY3Rpb25fR2V0VHlwZShGUERGX0FDVElPTiBhY3Rpb24pOworRlBERl9FWFBPUlQgdW5zaWduZWQgbG9uZyBGUERGX0NBTExDT05WIEZQREZBY3Rpb25fR2V0VHlwZShGUERGX0FDVElPTiBhY3Rpb24pOwogCiAvLyBHZXQgdGhlIGRlc3RpbmF0aW9uIG9mIHxhY3Rpb258LgogLy8KQEAgLTEyOCw4ICsxNDEsOCBAQAogLy8gSW4gdGhlIGNhc2Ugb2YgfFBERkFDVElPTl9SRU1PVEVHT1RPfCwgeW91IHNob3VsZCBmaXJzdCBjYWxsCiAvLyB8RlBERkFjdGlvbl9HZXRGaWxlUGF0aHwgdGhlbiBsb2FkIHRoYXQgZG9jdW1lbnQsIHRoZSBkb2N1bWVudCBoYW5kbGUgZnJvbQogLy8gdGhhdCBkb2N1bWVudCBzaG91bGQgcGFzcyBhcyB8ZG9jdW1lbnR8IHRvIHxGUERGQWN0aW9uX0dldERlc3R8LgotRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZBY3Rpb25fR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0FDVElPTiBhY3Rpb24pOworRlBERl9FWFBPUlQgRlBERl9ERVNUIEZQREZfQ0FMTENPTlYgRlBERkFjdGlvbl9HZXREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9BQ1RJT04gYWN0aW9uKTsKIAogLy8gR2V0IGZpbGUgcGF0aCBvZiBhIHxQREZBQ1RJT05fUkVNT1RFR09UT3wgfGFjdGlvbnwuCiAvLwpAQCAtMTM4LDEzICsxNTEsMTMgQEAKIC8vICAgYnVmZmVyIC0gYSBidWZmZXIgZm9yIG91dHB1dCB0aGUgcGF0aCBzdHJpbmcuIE1heSBiZSBOVUxMLgogLy8gICBidWZsZW4gLSB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIsIGluIGJ5dGVzLiBNYXkgYmUgMC4KIC8vCi0vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGZpbGUgcGF0aCwgaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBVVEYxNgotLy8gTlVMIGNoYXJhY3Rlci4KKy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgZmlsZSBwYXRoLCBpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIE5VTAorLy8gY2hhcmFjdGVyLgogLy8KLS8vIFJlZ2FyZGxlc3Mgb2YgdGhlIHBsYXRmb3JtLCB0aGUgfGJ1ZmZlcnwgaXMgYWx3YXlzIGluIFVURi0xNkxFIGVuY29kaW5nLgorLy8gUmVnYXJkbGVzcyBvZiB0aGUgcGxhdGZvcm0sIHRoZSB8YnVmZmVyfCBpcyBhbHdheXMgaW4gVVRGLTggZW5jb2RpbmcuCiAvLyBJZiB8YnVmbGVufCBpcyBsZXNzIHRoYW4gdGhlIHJldHVybmVkIGxlbmd0aCwgb3IgfGJ1ZmZlcnwgaXMgTlVMTCwgfGJ1ZmZlcnwKIC8vIHdpbGwgbm90IGJlIG1vZGlmaWVkLgotRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTAorRlBERl9FWFBPUlQgdW5zaWduZWQgbG9uZyBGUERGX0NBTExDT05WCiBGUERGQWN0aW9uX0dldEZpbGVQYXRoKEZQREZfQUNUSU9OIGFjdGlvbiwgdm9pZCogYnVmZmVyLCB1bnNpZ25lZCBsb25nIGJ1Zmxlbik7CiAKIC8vIEdldCB0aGUgVVJJIHBhdGggb2YgYSB8UERGQUNUSU9OX1VSSXwgfGFjdGlvbnwuCkBAIC0xNTgsMTAgKzE3MSwxMSBAQAogLy8KIC8vIFRoZSB8YnVmZmVyfCBpcyBhbHdheXMgZW5jb2RlZCBpbiA3LWJpdCBBU0NJSS4gSWYgfGJ1ZmxlbnwgaXMgbGVzcyB0aGFuIHRoZQogLy8gcmV0dXJuZWQgbGVuZ3RoLCBvciB8YnVmZmVyfCBpcyBOVUxMLCB8YnVmZmVyfCB3aWxsIG5vdCBiZSBtb2RpZmllZC4KLURMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERkFjdGlvbl9HZXRVUklQYXRoKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0FDVElPTiBhY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1Zmxlbik7CitGUERGX0VYUE9SVCB1bnNpZ25lZCBsb25nIEZQREZfQ0FMTENPTlYKK0ZQREZBY3Rpb25fR2V0VVJJUGF0aChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgIEZQREZfQUNUSU9OIGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZsZW4pOwogCiAvLyBHZXQgdGhlIHBhZ2UgaW5kZXggb2YgfGRlc3R8LgogLy8KQEAgLTE2OSw4ICsxODMsMjAgQEAKIC8vICAgZGVzdCAgICAgLSBoYW5kbGUgdG8gdGhlIGRlc3RpbmF0aW9uLgogLy8KIC8vIFJldHVybnMgdGhlIHBhZ2UgaW5kZXggY29udGFpbmluZyB8ZGVzdHwuIFBhZ2UgaW5kaWNlcyBzdGFydCBmcm9tIDAuCi1ETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZEZXN0X0dldFBhZ2VJbmRleChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9ERVNUIGRlc3QpOworRlBERl9FWFBPUlQgdW5zaWduZWQgbG9uZyBGUERGX0NBTExDT05WCitGUERGRGVzdF9HZXRQYWdlSW5kZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgRlBERl9ERVNUIGRlc3QpOworCisvLyBHZXQgdGhlIHZpZXcgKGZpdCB0eXBlKSBzcGVjaWZpZWQgYnkgfGRlc3R8LgorLy8gRXhwZXJpbWVudGFsIEFQSS4gU3ViamVjdCB0byBjaGFuZ2UuCisvLworLy8gICBkZXN0ICAgICAgICAgLSBoYW5kbGUgdG8gdGhlIGRlc3RpbmF0aW9uLgorLy8gICBwTnVtUGFyYW1zICAgLSByZWNlaXZlcyB0aGUgbnVtYmVyIG9mIHZpZXcgcGFyYW1ldGVycywgd2hpY2ggaXMgYXQgbW9zdCA0LgorLy8gICBwUGFyYW1zICAgICAgLSBidWZmZXIgdG8gd3JpdGUgdGhlIHZpZXcgcGFyYW1ldGVycy4gTXVzdCBiZSBhdCBsZWFzdCA0CisvLyAgICAgICAgICAgICAgICAgIEZTX0ZMT0FUcyBsb25nLgorLy8gUmV0dXJucyBvbmUgb2YgdGhlIFBERkRFU1RfVklFV18qIGNvbnN0YW50cywgUERGREVTVF9WSUVXX1VOS05PV05fTU9ERSBpZgorLy8gfGRlc3R8IGRvZXMgbm90IHNwZWNpZnkgYSB2aWV3LgorRlBERl9FWFBPUlQgdW5zaWduZWQgbG9uZyBGUERGX0NBTExDT05WCitGUERGRGVzdF9HZXRWaWV3KEZQREZfREVTVCBkZXN0LCB1bnNpZ25lZCBsb25nKiBwTnVtUGFyYW1zLCBGU19GTE9BVCogcFBhcmFtcyk7CiAKIC8vIEdldCB0aGUgKHgsIHksIHpvb20pIGxvY2F0aW9uIG9mIHxkZXN0fCBpbiB0aGUgZGVzdGluYXRpb24gcGFnZSwgaWYgdGhlCiAvLyBkZXN0aW5hdGlvbiBpcyBpbiBbcGFnZSAvWFlaIHggeSB6b29tXSBzeW50YXguCkBAIC0xODYsMTMgKzIxMiwxNCBAQAogLy8KIC8vIE5vdGUgdGhlIFt4LCB5LCB6b29tXSB2YWx1ZXMgYXJlIG9ubHkgc2V0IGlmIHRoZSBjb3JyZXNwb25kaW5nIGhhc1hWYWwsCiAvLyBoYXNZVmFsIG9yIGhhc1pvb21WYWwgZmxhZ3MgYXJlIHRydWUuCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkRlc3RfR2V0TG9jYXRpb25JblBhZ2UoRlBERl9ERVNUIGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MKiBoYXNYQ29vcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MKiBoYXNZQ29vcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MKiBoYXNab29tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX0ZMT0FUKiB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX0ZMT0FUKiB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX0ZMT0FUKiB6b29tKTsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCitGUERGRGVzdF9HZXRMb2NhdGlvbkluUGFnZShGUERGX0RFU1QgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCogaGFzWENvb3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MKiBoYXNZQ29vcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wqIGhhc1pvb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19GTE9BVCogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX0ZMT0FUKiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfRkxPQVQqIHpvb20pOwogCiAvLyBGaW5kIGEgbGluayBhdCBwb2ludCAofHh8LHx5fCkgb24gfHBhZ2V8LgogLy8KQEAgLTIwNCw5ICsyMzEsOSBAQAogLy8KIC8vIFlvdSBjYW4gY29udmVydCBjb29yZGluYXRlcyBmcm9tIHNjcmVlbiBjb29yZGluYXRlcyB0byBwYWdlIGNvb3JkaW5hdGVzIHVzaW5nCiAvLyB8RlBERl9EZXZpY2VUb1BhZ2V8LgotRExMRVhQT1JUIEZQREZfTElOSyBTVERDQUxMIEZQREZMaW5rX0dldExpbmtBdFBvaW50KEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB5KTsKK0ZQREZfRVhQT1JUIEZQREZfTElOSyBGUERGX0NBTExDT05WIEZQREZMaW5rX0dldExpbmtBdFBvaW50KEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeSk7CiAKIC8vIEZpbmQgdGhlIFotb3JkZXIgb2YgbGluayBhdCBwb2ludCAofHh8LHx5fCkgb24gfHBhZ2V8LgogLy8KQEAgLTIxOSw4ICsyNDYsOSBAQAogLy8KIC8vIFlvdSBjYW4gY29udmVydCBjb29yZGluYXRlcyBmcm9tIHNjcmVlbiBjb29yZGluYXRlcyB0byBwYWdlIGNvb3JkaW5hdGVzIHVzaW5nCiAvLyB8RlBERl9EZXZpY2VUb1BhZ2V8LgotRExMRVhQT1JUIGludCBTVERDQUxMCi1GUERGTGlua19HZXRMaW5rWk9yZGVyQXRQb2ludChGUERGX1BBR0UgcGFnZSwgZG91YmxlIHgsIGRvdWJsZSB5KTsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZMaW5rX0dldExpbmtaT3JkZXJBdFBvaW50KEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeSk7CiAKIC8vIEdldCBkZXN0aW5hdGlvbiBpbmZvIGZvciB8bGlua3wuCiAvLwpAQCAtMjMwLDE1ICsyNTgsMTUgQEAKIC8vIFJldHVybnMgYSBoYW5kbGUgdG8gdGhlIGRlc3RpbmF0aW9uLCBvciBOVUxMIGlmIHRoZXJlIGlzIG5vIGRlc3RpbmF0aW9uCiAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmsuIEluIHRoaXMgY2FzZSwgeW91IHNob3VsZCBjYWxsIHxGUERGTGlua19HZXRBY3Rpb258CiAvLyB0byByZXRyaWV2ZSB0aGUgYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB8bGlua3wuCi1ETExFWFBPUlQgRlBERl9ERVNUIFNURENBTEwgRlBERkxpbmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9MSU5LIGxpbmspOworRlBERl9FWFBPUlQgRlBERl9ERVNUIEZQREZfQ0FMTENPTlYgRlBERkxpbmtfR2V0RGVzdChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0xJTksgbGluayk7CiAKIC8vIEdldCBhY3Rpb24gaW5mbyBmb3IgfGxpbmt8LgogLy8KIC8vICAgbGluayAtIGhhbmRsZSB0byB0aGUgbGluay4KIC8vCiAvLyBSZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBhY3Rpb24gYXNzb2NpYXRlZCB0byB8bGlua3wsIG9yIE5VTEwgaWYgbm8gYWN0aW9uLgotRExMRVhQT1JUIEZQREZfQUNUSU9OIFNURENBTEwgRlBERkxpbmtfR2V0QWN0aW9uKEZQREZfTElOSyBsaW5rKTsKK0ZQREZfRVhQT1JUIEZQREZfQUNUSU9OIEZQREZfQ0FMTENPTlYgRlBERkxpbmtfR2V0QWN0aW9uKEZQREZfTElOSyBsaW5rKTsKIAogLy8gRW51bWVyYXRlcyBhbGwgdGhlIGxpbmsgYW5ub3RhdGlvbnMgaW4gfHBhZ2V8LgogLy8KQEAgLTI0OCw5ICsyNzYsOSBAQAogLy8gICBsaW5rQW5ub3QgLSB0aGUgbGluayBoYW5kbGUgZm9yIHxzdGFydFBvc3wuCiAvLwogLy8gUmV0dXJucyBUUlVFIG9uIHN1Y2Nlc3MuCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfRW51bWVyYXRlKEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0YXJ0UG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0xJTksqIGxpbmtBbm5vdCk7CitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGTGlua19FbnVtZXJhdGUoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzdGFydFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0xJTksqIGxpbmtBbm5vdCk7CiAKIC8vIEdldCB0aGUgcmVjdGFuZ2xlIGZvciB8bGlua0Fubm90fC4KIC8vCkBAIC0yNTgsMTUgKzI4NiwxNSBAQAogLy8gICByZWN0ICAgICAgLSB0aGUgYW5ub3RhdGlvbiByZWN0YW5nbGUuCiAvLwogLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERkxpbmtfR2V0QW5ub3RSZWN0KEZQREZfTElOSyBsaW5rQW5ub3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX1JFQ1RGKiByZWN0KTsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZMaW5rX0dldEFubm90UmVjdChGUERGX0xJTksgbGlua0Fubm90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTX1JFQ1RGKiByZWN0KTsKIAogLy8gR2V0IHRoZSBjb3VudCBvZiBxdWFkcmlsYXRlcmFsIHBvaW50cyB0byB0aGUgfGxpbmtBbm5vdHwuCiAvLwogLy8gICBsaW5rQW5ub3QgLSBoYW5kbGUgdG8gdGhlIGxpbmsgYW5ub3RhdGlvbi4KIC8vCiAvLyBSZXR1cm5zIHRoZSBjb3VudCBvZiBxdWFkcmlsYXRlcmFsIHBvaW50cy4KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGTGlua19Db3VudFF1YWRQb2ludHMoRlBERl9MSU5LIGxpbmtBbm5vdCk7CitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OViBGUERGTGlua19Db3VudFF1YWRQb2ludHMoRlBERl9MSU5LIGxpbmtBbm5vdCk7CiAKIC8vIEdldCB0aGUgcXVhZHJpbGF0ZXJhbCBwb2ludHMgZm9yIHRoZSBzcGVjaWZpZWQgfHF1YWRJbmRleHwgaW4gfGxpbmtBbm5vdHwuCiAvLwpAQCAtMjc1LDkgKzMwMywxMCBAQAogLy8gICBxdWFkUG9pbnRzIC0gcmVjZWl2ZXMgdGhlIHF1YWRyaWxhdGVyYWwgcG9pbnRzLgogLy8KIC8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZMaW5rX0dldFF1YWRQb2ludHMoRlBERl9MSU5LIGxpbmtBbm5vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFkSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19RVUFEUE9JTlRTRiogcXVhZFBvaW50cyk7CitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgorRlBERkxpbmtfR2V0UXVhZFBvaW50cyhGUERGX0xJTksgbGlua0Fubm90LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICBGU19RVUFEUE9JTlRTRiogcXVhZFBvaW50cyk7CiAKIC8vIEdldCBtZXRhLWRhdGEgfHRhZ3wgY29udGVudCBmcm9tIHxkb2N1bWVudHwuCiAvLwpAQCAtMjk2LDEwICszMjUsMTQgQEAKIC8vIFRoZSB8YnVmZmVyfCBpcyBhbHdheXMgZW5jb2RlZCBpbiBVVEYtMTZMRS4gVGhlIHxidWZmZXJ8IGlzIGZvbGxvd2VkIGJ5IHR3bwogLy8gYnl0ZXMgb2YgemVyb3MgaW5kaWNhdGluZyB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuICBJZiB8YnVmbGVufCBpcyBsZXNzIHRoYW4KIC8vIHRoZSByZXR1cm5lZCBsZW5ndGgsIG9yIHxidWZmZXJ8IGlzIE5VTEwsIHxidWZmZXJ8IHdpbGwgbm90IGJlIG1vZGlmaWVkLgotRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGX0dldE1ldGFUZXh0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIHRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZsZW4pOworLy8KKy8vIEZvciBsaW5lYXJpemVkIGZpbGVzLCBGUERGQXZhaWxfSXNGb3JtQXZhaWwgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoaXMsIGFuZAorLy8gaXQgbXVzdCBoYXZlIHJldHVybmVkIFBERl9GT1JNX0FWQUlMIG9yIFBERl9GT1JNX05PVEVYSVNULiBCZWZvcmUgdGhhdCwgdGhlcmUKKy8vIGlzIG5vIGd1YXJhbnRlZSB0aGUgbWV0YWRhdGEgaGFzIGJlZW4gbG9hZGVkLgorRlBERl9FWFBPUlQgdW5zaWduZWQgbG9uZyBGUERGX0NBTExDT05WIEZQREZfR2V0TWV0YVRleHQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1Zmxlbik7CiAKIC8vIEdldCB0aGUgcGFnZSBsYWJlbCBmb3IgfHBhZ2VfaW5kZXh8IGZyb20gfGRvY3VtZW50fC4KIC8vCkBAIC0zMTMsMTAgKzM0NiwxMSBAQAogLy8gVGhlIHxidWZmZXJ8IGlzIGFsd2F5cyBlbmNvZGVkIGluIFVURi0xNkxFLiBUaGUgfGJ1ZmZlcnwgaXMgZm9sbG93ZWQgYnkgdHdvCiAvLyBieXRlcyBvZiB6ZXJvcyBpbmRpY2F0aW5nIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gIElmIHxidWZsZW58IGlzIGxlc3MgdGhhbgogLy8gdGhlIHJldHVybmVkIGxlbmd0aCwgb3IgfGJ1ZmZlcnwgaXMgTlVMTCwgfGJ1ZmZlcnwgd2lsbCBub3QgYmUgbW9kaWZpZWQuCi1ETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZfR2V0UGFnZUxhYmVsKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWdlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmbGVuKTsKK0ZQREZfRVhQT1JUIHVuc2lnbmVkIGxvbmcgRlBERl9DQUxMQ09OVgorRlBERl9HZXRQYWdlTGFiZWwoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgIGludCBwYWdlX2luZGV4LAorICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZsZW4pOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX2VkaXQuaCBiL3B1YmxpYy9mcGRmX2VkaXQuaAppbmRleCAzMzUwYjVjLi42ODVmYmRkIDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl9lZGl0LmgKKysrIGIvcHVibGljL2ZwZGZfZWRpdC5oCkBAIC0yMCwxNiArMjAsNzEgQEAKICNkZWZpbmUgRlBERl9HZXRSVmFsdWUoYXJnYikgKCh1aW50OF90KSgoYXJnYikgPj4gMTYpKQogI2RlZmluZSBGUERGX0dldEFWYWx1ZShhcmdiKSAoKHVpbnQ4X3QpKChhcmdiKSA+PiAyNCkpCiAKKy8vIFJlZmVyIHRvIFBERiBSZWZlcmVuY2UgdmVyc2lvbiAxLjcgdGFibGUgNC4xMiBmb3IgYWxsIGNvbG9yIHNwYWNlIGZhbWlsaWVzLgorI2RlZmluZSBGUERGX0NPTE9SU1BBQ0VfVU5LTk9XTiAwCisjZGVmaW5lIEZQREZfQ09MT1JTUEFDRV9ERVZJQ0VHUkFZIDEKKyNkZWZpbmUgRlBERl9DT0xPUlNQQUNFX0RFVklDRVJHQiAyCisjZGVmaW5lIEZQREZfQ09MT1JTUEFDRV9ERVZJQ0VDTVlLIDMKKyNkZWZpbmUgRlBERl9DT0xPUlNQQUNFX0NBTEdSQVkgNAorI2RlZmluZSBGUERGX0NPTE9SU1BBQ0VfQ0FMUkdCIDUKKyNkZWZpbmUgRlBERl9DT0xPUlNQQUNFX0xBQiA2CisjZGVmaW5lIEZQREZfQ09MT1JTUEFDRV9JQ0NCQVNFRCA3CisjZGVmaW5lIEZQREZfQ09MT1JTUEFDRV9TRVBBUkFUSU9OIDgKKyNkZWZpbmUgRlBERl9DT0xPUlNQQUNFX0RFVklDRU4gOQorI2RlZmluZSBGUERGX0NPTE9SU1BBQ0VfSU5ERVhFRCAxMAorI2RlZmluZSBGUERGX0NPTE9SU1BBQ0VfUEFUVEVSTiAxMQorCiAvLyBUaGUgcGFnZSBvYmplY3QgY29uc3RhbnRzLgorI2RlZmluZSBGUERGX1BBR0VPQkpfVU5LTk9XTiAwCiAjZGVmaW5lIEZQREZfUEFHRU9CSl9URVhUIDEKICNkZWZpbmUgRlBERl9QQUdFT0JKX1BBVEggMgogI2RlZmluZSBGUERGX1BBR0VPQkpfSU1BR0UgMwogI2RlZmluZSBGUERGX1BBR0VPQkpfU0hBRElORyA0CiAjZGVmaW5lIEZQREZfUEFHRU9CSl9GT1JNIDUKIAorLy8gVGhlIHBhdGggc2VnbWVudCBjb25zdGFudHMuCisjZGVmaW5lIEZQREZfU0VHTUVOVF9VTktOT1dOIC0xCisjZGVmaW5lIEZQREZfU0VHTUVOVF9MSU5FVE8gMAorI2RlZmluZSBGUERGX1NFR01FTlRfQkVaSUVSVE8gMQorI2RlZmluZSBGUERGX1NFR01FTlRfTU9WRVRPIDIKKwogI2RlZmluZSBGUERGX0ZJTExNT0RFX0FMVEVSTkFURSAxCiAjZGVmaW5lIEZQREZfRklMTE1PREVfV0lORElORyAyCiAKKyNkZWZpbmUgRlBERl9GT05UX1RZUEUxIDEKKyNkZWZpbmUgRlBERl9GT05UX1RSVUVUWVBFIDIKKworI2RlZmluZSBGUERGX0xJTkVDQVBfQlVUVCAwCisjZGVmaW5lIEZQREZfTElORUNBUF9ST1VORCAxCisjZGVmaW5lIEZQREZfTElORUNBUF9QUk9KRUNUSU5HX1NRVUFSRSAyCisKKyNkZWZpbmUgRlBERl9MSU5FSk9JTl9NSVRFUiAwCisjZGVmaW5lIEZQREZfTElORUpPSU5fUk9VTkQgMQorI2RlZmluZSBGUERGX0xJTkVKT0lOX0JFVkVMIDIKKworI2RlZmluZSBGUERGX1BSSU5UTU9ERV9FTUYgMAorI2RlZmluZSBGUERGX1BSSU5UTU9ERV9URVhUT05MWSAxCisjZGVmaW5lIEZQREZfUFJJTlRNT0RFX1BPU1RTQ1JJUFQyIDIKKyNkZWZpbmUgRlBERl9QUklOVE1PREVfUE9TVFNDUklQVDMgMworCit0eXBlZGVmIHN0cnVjdCBGUERGX0lNQUdFT0JKX01FVEFEQVRBIHsKKyAgLy8gVGhlIGltYWdlIHdpZHRoIGluIHBpeGVscy4KKyAgdW5zaWduZWQgaW50IHdpZHRoOworICAvLyBUaGUgaW1hZ2UgaGVpZ2h0IGluIHBpeGVscy4KKyAgdW5zaWduZWQgaW50IGhlaWdodDsKKyAgLy8gVGhlIGltYWdlJ3MgaG9yaXpvbnRhbCBwaXhlbC1wZXItaW5jaC4KKyAgZmxvYXQgaG9yaXpvbnRhbF9kcGk7CisgIC8vIFRoZSBpbWFnZSdzIHZlcnRpY2FsIHBpeGVsLXBlci1pbmNoLgorICBmbG9hdCB2ZXJ0aWNhbF9kcGk7CisgIC8vIFRoZSBudW1iZXIgb2YgYml0cyB1c2VkIHRvIHJlcHJlc2VudCBlYWNoIHBpeGVsLgorICB1bnNpZ25lZCBpbnQgYml0c19wZXJfcGl4ZWw7CisgIC8vIFRoZSBpbWFnZSdzIGNvbG9yc3BhY2UuIFNlZSBhYm92ZSBmb3IgdGhlIGxpc3Qgb2YgRlBERl9DT0xPUlNQQUNFXyouCisgIGludCBjb2xvcnNwYWNlOworICAvLyBUaGUgaW1hZ2UncyBtYXJrZWQgY29udGVudCBJRC4gVXNlZnVsIGZvciBwYWlyaW5nIHdpdGggYXNzb2NpYXRlZCBhbHQtdGV4dC4KKyAgLy8gQSB2YWx1ZSBvZiAtMSBpbmRpY2F0ZXMgbm8gSUQuCisgIGludCBtYXJrZWRfY29udGVudF9pZDsKK30gRlBERl9JTUFHRU9CSl9NRVRBREFUQTsKKwogI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZiAgLy8gX19jcGx1c3BsdXMKQEAgLTM3LDcgKzkyLDcgQEAKIC8vIENyZWF0ZSBhIG5ldyBQREYgZG9jdW1lbnQuCiAvLwogLy8gUmV0dXJucyBhIGhhbmRsZSB0byBhIG5ldyBkb2N1bWVudCwgb3IgTlVMTCBvbiBmYWlsdXJlLgotRExMRVhQT1JUIEZQREZfRE9DVU1FTlQgU1REQ0FMTCBGUERGX0NyZWF0ZU5ld0RvY3VtZW50KCk7CitGUERGX0VYUE9SVCBGUERGX0RPQ1VNRU5UIEZQREZfQ0FMTENPTlYgRlBERl9DcmVhdGVOZXdEb2N1bWVudCgpOwogCiAvLyBDcmVhdGUgYSBuZXcgUERGIHBhZ2UuCiAvLwpAQCAtNTIsMTYgKzEwNywxNyBAQAogLy8KIC8vIFRoZSBwYWdlIHNob3VsZCBiZSBjbG9zZWQgd2l0aCBDUERGX0Nsb3NlUGFnZSgpIHdoZW4gZmluaXNoZWQgYXMKIC8vIHdpdGggYW55IG90aGVyIHBhZ2UgaW4gdGhlIGRvY3VtZW50LgotRExMRVhQT1JUIEZQREZfUEFHRSBTVERDQUxMIEZQREZQYWdlX05ldyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFnZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgaGVpZ2h0KTsKK0ZQREZfRVhQT1JUIEZQREZfUEFHRSBGUERGX0NBTExDT05WIEZQREZQYWdlX05ldyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWdlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgaGVpZ2h0KTsKIAogLy8gRGVsZXRlIHRoZSBwYWdlIGF0IHxwYWdlX2luZGV4fC4KIC8vCiAvLyAgIGRvY3VtZW50ICAgLSBoYW5kbGUgdG8gZG9jdW1lbnQuCiAvLyAgIHBhZ2VfaW5kZXggLSB0aGUgaW5kZXggb2YgdGhlIHBhZ2UgdG8gZGVsZXRlLgotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9EZWxldGUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwgaW50IHBhZ2VfaW5kZXgpOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZQYWdlX0RlbGV0ZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFnZV9pbmRleCk7CiAKIC8vIEdldCB0aGUgcm90YXRpb24gb2YgfHBhZ2V8LgogLy8KQEAgLTcyLDcgKzEyOCw3IEBACiAvLyAgIDEgLSBSb3RhdGVkIDkwIGRlZ3JlZXMgY2xvY2t3aXNlLgogLy8gICAyIC0gUm90YXRlZCAxODAgZGVncmVlcyBjbG9ja3dpc2UuCiAvLyAgIDMgLSBSb3RhdGVkIDI3MCBkZWdyZWVzIGNsb2Nrd2lzZS4KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGUGFnZV9HZXRSb3RhdGlvbihGUERGX1BBR0UgcGFnZSk7CitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OViBGUERGUGFnZV9HZXRSb3RhdGlvbihGUERGX1BBR0UgcGFnZSk7CiAKIC8vIFNldCByb3RhdGlvbiBmb3IgfHBhZ2V8LgogLy8KQEAgLTgyLDIyICsxMzgsMzEgQEAKIC8vICAgICAgICAgICAgICAxIC0gUm90YXRlZCA5MCBkZWdyZWVzIGNsb2Nrd2lzZS4KIC8vICAgICAgICAgICAgICAyIC0gUm90YXRlZCAxODAgZGVncmVlcyBjbG9ja3dpc2UuCiAvLyAgICAgICAgICAgICAgMyAtIFJvdGF0ZWQgMjcwIGRlZ3JlZXMgY2xvY2t3aXNlLgotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9TZXRSb3RhdGlvbihGUERGX1BBR0UgcGFnZSwgaW50IHJvdGF0ZSk7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRlBERlBhZ2VfU2V0Um90YXRpb24oRlBERl9QQUdFIHBhZ2UsIGludCByb3RhdGUpOwogCiAvLyBJbnNlcnQgfHBhZ2Vfb2JqfCBpbnRvIHxwYWdlfC4KIC8vCiAvLyAgIHBhZ2UgICAgIC0gaGFuZGxlIHRvIGEgcGFnZQogLy8gICBwYWdlX29iaiAtIGhhbmRsZSB0byBhIHBhZ2Ugb2JqZWN0LiBUaGUgfHBhZ2Vfb2JqfCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKIC8vICAgICAgICAgICAgICBmcmVlZC4KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlBhZ2VfSW5zZXJ0T2JqZWN0KEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFT0JKRUNUIHBhZ2Vfb2JqKTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGUGFnZV9JbnNlcnRPYmplY3QoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRU9CSkVDVCBwYWdlX29iaik7CiAKIC8vIEdldCBudW1iZXIgb2YgcGFnZSBvYmplY3RzIGluc2lkZSB8cGFnZXwuCiAvLwogLy8gICBwYWdlIC0gaGFuZGxlIHRvIGEgcGFnZS4KIC8vCiAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpbiB8cGFnZXwuCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlBhZ2VfQ291bnRPYmplY3QoRlBERl9QQUdFIHBhZ2UpOworLy8KKy8vIERFUFJFQ0FURUQuIFBsZWFzZSB1c2UgRlBERlBhZ2VfQ291bnRPYmplY3RzLgorRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERlBhZ2VfQ291bnRPYmplY3QoRlBERl9QQUdFIHBhZ2UpOworCisvLyBHZXQgbnVtYmVyIG9mIHBhZ2Ugb2JqZWN0cyBpbnNpZGUgfHBhZ2V8LgorLy8KKy8vICAgcGFnZSAtIGhhbmRsZSB0byBhIHBhZ2UuCisvLworLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG9iamVjdHMgaW4gfHBhZ2V8LgorRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERlBhZ2VfQ291bnRPYmplY3RzKEZQREZfUEFHRSBwYWdlKTsKIAogLy8gR2V0IG9iamVjdCBpbiB8cGFnZXwgYXQgfGluZGV4fC4KIC8vCkBAIC0xMDUsMTQgKzE3MCwxNSBAQAogLy8gICBpbmRleCAtIHRoZSBpbmRleCBvZiBhIHBhZ2Ugb2JqZWN0LgogLy8KIC8vIFJldHVybnMgdGhlIGhhbmRsZSB0byB0aGUgcGFnZSBvYmplY3QsIG9yIE5VTEwgb24gZmFpbGVkLgotRExMRVhQT1JUIEZQREZfUEFHRU9CSkVDVCBTVERDQUxMIEZQREZQYWdlX0dldE9iamVjdChGUERGX1BBR0UgcGFnZSwgaW50IGluZGV4KTsKK0ZQREZfRVhQT1JUIEZQREZfUEFHRU9CSkVDVCBGUERGX0NBTExDT05WIEZQREZQYWdlX0dldE9iamVjdChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOwogCiAvLyBDaGVja3MgaWYgfHBhZ2V8IGNvbnRhaW5zIHRyYW5zcGFyZW5jeS4KIC8vCiAvLyAgIHBhZ2UgLSBoYW5kbGUgdG8gYSBwYWdlLgogLy8KIC8vIFJldHVybnMgVFJVRSBpZiB8cGFnZXwgY29udGFpbnMgdHJhbnNwYXJlbmN5LgotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX0hhc1RyYW5zcGFyZW5jeShGUERGX1BBR0UgcGFnZSk7CitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGUGFnZV9IYXNUcmFuc3BhcmVuY3koRlBERl9QQUdFIHBhZ2UpOwogCiAvLyBHZW5lcmF0ZSB0aGUgY29udGVudCBvZiB8cGFnZXwuCiAvLwpAQCAtMTIyLDE3ICsxODgsMzQgQEAKIC8vCiAvLyBCZWZvcmUgeW91IHNhdmUgdGhlIHBhZ2UgdG8gYSBmaWxlLCBvciByZWxvYWQgdGhlIHBhZ2UsIHlvdSBtdXN0IGNhbGwKIC8vIHxGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnR8IG9yIGFueSBjaGFuZ2VzIHRvIHxwYWdlfCB3aWxsIGJlIGxvc3QuCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlBhZ2VfR2VuZXJhdGVDb250ZW50KEZQREZfUEFHRSBwYWdlKTsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZQYWdlX0dlbmVyYXRlQ29udGVudChGUERGX1BBR0UgcGFnZSk7CiAKLS8vIENoZWNrcyBpZiB8cGFnZU9iamVjdHwgY29udGFpbnMgdHJhbnNwYXJlbmN5LgorLy8gRGVzdHJveSB8cGFnZV9vYmp8IGJ5IHJlbGVhc2luZyBpdHMgcmVzb3VyY2VzLiB8cGFnZV9vYmp8IG11c3QgaGF2ZSBiZWVuCisvLyBjcmVhdGVkIGJ5IEZQREZQYWdlT2JqX0NyZWF0ZU5ld3tQYXRofFJlY3R9KCkgb3IKKy8vIEZQREZQYWdlT2JqX05ld3tUZXh0fEltYWdlfU9iaigpLiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIG9uCisvLyBuZXdseS1jcmVhdGVkIG9iamVjdHMgaWYgdGhleSBhcmUgbm90IGFkZGVkIHRvIGEgcGFnZSB0aHJvdWdoCisvLyBGUERGUGFnZV9JbnNlcnRPYmplY3QoKSBvciB0byBhbiBhbm5vdGF0aW9uIHRocm91Z2ggRlBERkFubm90X0FwcGVuZE9iamVjdCgpLgogLy8KLS8vICAgcGFnZU9iamVjdCAtIGhhbmRsZSB0byBhIHBhZ2Ugb2JqZWN0LgorLy8gICBwYWdlX29iaiAtIGhhbmRsZSB0byBhIHBhZ2Ugb2JqZWN0LgorRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZQYWdlT2JqX0Rlc3Ryb3koRlBERl9QQUdFT0JKRUNUIHBhZ2Vfb2JqKTsKKworLy8gQ2hlY2tzIGlmIHxwYWdlX29iamVjdHwgY29udGFpbnMgdHJhbnNwYXJlbmN5LgorLy8KKy8vICAgcGFnZV9vYmplY3QgLSBoYW5kbGUgdG8gYSBwYWdlIG9iamVjdC4KIC8vCiAvLyBSZXR1cm5zIFRSVUUgaWYgfHBhZ2VPYmplY3R8IGNvbnRhaW5zIHRyYW5zcGFyZW5jeS4KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTAotRlBERlBhZ2VPYmpfSGFzVHJhbnNwYXJlbmN5KEZQREZfUEFHRU9CSkVDVCBwYWdlT2JqZWN0KTsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCitGUERGUGFnZU9ial9IYXNUcmFuc3BhcmVuY3koRlBERl9QQUdFT0JKRUNUIHBhZ2Vfb2JqZWN0KTsKIAotLy8gVHJhbnNmb3JtIHxwYWdlT2JqZWN0fCBieSB0aGUgZ2l2ZW4gbWF0cml4LgorLy8gR2V0IHR5cGUgb2YgfHBhZ2Vfb2JqZWN0fC4KKy8vCisvLyAgIHBhZ2Vfb2JqZWN0IC0gaGFuZGxlIHRvIGEgcGFnZSBvYmplY3QuCisvLworLy8gUmV0dXJucyBvbmUgb2YgdGhlIEZQREZfUEFHRU9CSl8qIHZhbHVlcyBvbiBzdWNjZXNzLCBGUERGX1BBR0VPQkpfVU5LTk9XTiBvbgorLy8gZXJyb3IuCitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OViBGUERGUGFnZU9ial9HZXRUeXBlKEZQREZfUEFHRU9CSkVDVCBwYWdlX29iamVjdCk7CisKKy8vIFRyYW5zZm9ybSB8cGFnZV9vYmplY3R8IGJ5IHRoZSBnaXZlbiBtYXRyaXguCiAvLwogLy8gICBwYWdlX29iamVjdCAtIGhhbmRsZSB0byBhIHBhZ2Ugb2JqZWN0LgogLy8gICBhICAgICAgICAgICAtIG1hdHJpeCB2YWx1ZS4KQEAgLTE0NiwxMyArMjI5LDE0IEBACiAvLyAgIHxhIGMgZXwKIC8vICAgfGIgZCBmfAogLy8gYW5kIGNhbiBiZSB1c2VkIHRvIHNjYWxlLCByb3RhdGUsIHNoZWFyIGFuZCB0cmFuc2xhdGUgdGhlIHxwYWdlX29iamVjdHwuCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlT2JqX1RyYW5zZm9ybShGUERGX1BBR0VPQkpFQ1QgcGFnZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGYpOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WCitGUERGUGFnZU9ial9UcmFuc2Zvcm0oRlBERl9QQUdFT0JKRUNUIHBhZ2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhLAorICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiLAorICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjLAorICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkLAorICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlLAorICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmKTsKIAogLy8gVHJhbnNmb3JtIGFsbCBhbm5vdGF0aW9ucyBpbiB8cGFnZXwuCiAvLwpAQCAtMTY4LDIxICsyNTIsMjEgQEAKIC8vICAgfGEgYyBlfAogLy8gICB8YiBkIGZ8CiAvLyBhbmQgY2FuIGJlIHVzZWQgdG8gc2NhbGUsIHJvdGF0ZSwgc2hlYXIgYW5kIHRyYW5zbGF0ZSB0aGUgfHBhZ2V8IGFubm90YXRpb25zLgotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9UcmFuc2Zvcm1Bbm5vdHMoRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGYpOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZQYWdlX1RyYW5zZm9ybUFubm90cyhGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZik7CiAKIC8vIENyZWF0ZSBhIG5ldyBpbWFnZSBvYmplY3QuCiAvLwogLy8gICBkb2N1bWVudCAtIGhhbmRsZSB0byBhIGRvY3VtZW50LgogLy8KIC8vIFJldHVybnMgYSBoYW5kbGUgdG8gYSBuZXcgaW1hZ2Ugb2JqZWN0LgotRExMRVhQT1JUIEZQREZfUEFHRU9CSkVDVCBTVERDQUxMCi1GUERGUGFnZU9ial9OZXdJbWdlT2JqKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOworRlBERl9FWFBPUlQgRlBERl9QQUdFT0JKRUNUIEZQREZfQ0FMTENPTlYKK0ZQREZQYWdlT2JqX05ld0ltYWdlT2JqKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOwogCiAvLyBMb2FkIGFuIGltYWdlIGZyb20gYSBKUEVHIGltYWdlIGZpbGUgYW5kIHRoZW4gc2V0IGl0IGludG8gfGltYWdlX29iamVjdHwuCiAvLwpAQCAtMTk4LDcgKzI4Miw3IEBACiAvLyBmb3IgYWxsIHRoZSBsb2FkZWQgcGFnZXMuIFBhc3MgfHBhZ2VzfCBhbmQgcGFnZSBjb3VudCAofG5Db3VudHwpIHRvIHRoaXMgQVBJCiAvLyB0byBjbGVhciB0aGUgaW1hZ2UgY2FjaGUuIElmIHRoZSBpbWFnZSBpcyBub3QgcHJldmlvdXNseSBzaGFyZWQsIG9yIE5VTEwgaXMgYQogLy8gdmFsaWQgfHBhZ2VzfCB2YWx1ZS4KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTAorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKIEZQREZJbWFnZU9ial9Mb2FkSnBlZ0ZpbGUoRlBERl9QQUdFKiBwYWdlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5Db3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCwKQEAgLTIyMCw3ICszMDQsNyBAQAogLy8gdmFsaWQgfHBhZ2VzfCB2YWx1ZS4gVGhpcyBmdW5jdGlvbiBsb2FkcyB0aGUgSlBFRyBpbWFnZSBpbmxpbmUsIHNvIHRoZSBpbWFnZQogLy8gY29udGVudCBpcyBjb3BpZWQgdG8gdGhlIGZpbGUuIFRoaXMgYWxsb3dzIHxmaWxlQWNjZXNzfCBhbmQgaXRzIGFzc29jaWF0ZWQKIC8vIGRhdGEgdG8gYmUgZGVsZXRlZCBhZnRlciB0aGlzIGZ1bmN0aW9uIHJldHVybnMuCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCiBGUERGSW1hZ2VPYmpfTG9hZEpwZWdGaWxlSW5saW5lKEZQREZfUEFHRSogcGFnZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsCkBAIC0yNDIsMTMgKzMyNiwxNCBAQAogLy8gYW5kIGNhbiBiZSB1c2VkIHRvIHNjYWxlLCByb3RhdGUsIHNoZWFyIGFuZCB0cmFuc2xhdGUgdGhlIHxwYWdlfCBhbm5vdGF0aW9ucy4KIC8vCiAvLyBSZXR1cm5zIFRSVUUgb24gc3VjY2Vzcy4KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGSW1hZ2VPYmpfU2V0TWF0cml4KEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGYpOworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZJbWFnZU9ial9TZXRNYXRyaXgoRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGEsCisgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiLAorICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYywKKyAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGQsCisgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBlLAorICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZik7CiAKIC8vIFNldCB8Yml0bWFwfCB0byB8aW1hZ2Vfb2JqZWN0fC4KIC8vCkBAIC0yNTgsMTAgKzM0Myw5MSBAQAogLy8gICBiaXRtYXAgICAgICAgLSBoYW5kbGUgb2YgdGhlIGJpdG1hcC4KIC8vCiAvLyBSZXR1cm5zIFRSVUUgb24gc3VjY2Vzcy4KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGSW1hZ2VPYmpfU2V0Qml0bWFwKEZQREZfUEFHRSogcGFnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFT0JKRUNUIGltYWdlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQklUTUFQIGJpdG1hcCk7CitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgorRlBERkltYWdlT2JqX1NldEJpdG1hcChGUERGX1BBR0UqIHBhZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0VPQkpFQ1QgaW1hZ2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JJVE1BUCBiaXRtYXApOworCisvLyBHZXQgYSBiaXRtYXAgcmFzdGVyaXNhdGlvbiBvZiB8aW1hZ2Vfb2JqZWN0fC4gVGhlIHJldHVybmVkIGJpdG1hcCB3aWxsIGJlCisvLyBvd25lZCBieSB0aGUgY2FsbGVyLCBhbmQgRlBERkJpdG1hcF9EZXN0cm95KCkgbXVzdCBiZSBjYWxsZWQgb24gdGhlIHJldHVybmVkCisvLyBiaXRtYXAgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgorLy8KKy8vICAgaW1hZ2Vfb2JqZWN0IC0gaGFuZGxlIHRvIGFuIGltYWdlIG9iamVjdC4KKy8vCisvLyBSZXR1cm5zIHRoZSBiaXRtYXAuCitGUERGX0VYUE9SVCBGUERGX0JJVE1BUCBGUERGX0NBTExDT05WCitGUERGSW1hZ2VPYmpfR2V0Qml0bWFwKEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QpOworCisvLyBHZXQgdGhlIGRlY29kZWQgaW1hZ2UgZGF0YSBvZiB8aW1hZ2Vfb2JqZWN0fC4gVGhlIGRlY29kZWQgZGF0YSBpcyB0aGUKKy8vIHVuY29tcHJlc3NlZCBpbWFnZSBkYXRhLCBpLmUuIHRoZSByYXcgaW1hZ2UgZGF0YSBhZnRlciBoYXZpbmcgYWxsIGZpbHRlcnMKKy8vIGFwcGxpZWQuIHxidWZmZXJ8IGlzIG9ubHkgbW9kaWZpZWQgaWYgfGJ1ZmxlbnwgaXMgbG9uZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZgorLy8gdGhlIGRlY29kZWQgaW1hZ2UgZGF0YS4KKy8vCisvLyAgIGltYWdlX29iamVjdCAtIGhhbmRsZSB0byBhbiBpbWFnZSBvYmplY3QuCisvLyAgIGJ1ZmZlciAgICAgICAtIGJ1ZmZlciBmb3IgaG9sZGluZyB0aGUgZGVjb2RlZCBpbWFnZSBkYXRhIGluIHJhdyBieXRlcy4KKy8vICAgYnVmbGVuICAgICAgIC0gbGVuZ3RoIG9mIHRoZSBidWZmZXIuCisvLworLy8gUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBkZWNvZGVkIGltYWdlIGRhdGEuCitGUERGX0VYUE9SVCB1bnNpZ25lZCBsb25nIEZQREZfQ0FMTENPTlYKK0ZQREZJbWFnZU9ial9HZXRJbWFnZURhdGFEZWNvZGVkKEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGJ1Zmxlbik7CisKKy8vIEdldCB0aGUgcmF3IGltYWdlIGRhdGEgb2YgfGltYWdlX29iamVjdHwuIFRoZSByYXcgZGF0YSBpcyB0aGUgaW1hZ2UgZGF0YSBhcworLy8gc3RvcmVkIGluIHRoZSBQREYgd2l0aG91dCBhcHBseWluZyBhbnkgZmlsdGVycy4gfGJ1ZmZlcnwgaXMgb25seSBtb2RpZmllZCBpZgorLy8gfGJ1ZmxlbnwgaXMgbG9uZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgcmF3IGltYWdlIGRhdGEuCisvLworLy8gICBpbWFnZV9vYmplY3QgLSBoYW5kbGUgdG8gYW4gaW1hZ2Ugb2JqZWN0LgorLy8gICBidWZmZXIgICAgICAgLSBidWZmZXIgZm9yIGhvbGRpbmcgdGhlIHJhdyBpbWFnZSBkYXRhIGluIHJhdyBieXRlcy4KKy8vICAgYnVmbGVuICAgICAgIC0gbGVuZ3RoIG9mIHRoZSBidWZmZXIuCisvLworLy8gUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSByYXcgaW1hZ2UgZGF0YS4KK0ZQREZfRVhQT1JUIHVuc2lnbmVkIGxvbmcgRlBERl9DQUxMQ09OVgorRlBERkltYWdlT2JqX0dldEltYWdlRGF0YVJhdyhGUERGX1BBR0VPQkpFQ1QgaW1hZ2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmbGVuKTsKKworLy8gR2V0IHRoZSBudW1iZXIgb2YgZmlsdGVycyAoaS5lLiBkZWNvZGVycykgb2YgdGhlIGltYWdlIGluIHxpbWFnZV9vYmplY3R8LgorLy8KKy8vICAgaW1hZ2Vfb2JqZWN0IC0gaGFuZGxlIHRvIGFuIGltYWdlIG9iamVjdC4KKy8vCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgfGltYWdlX29iamVjdHwncyBmaWx0ZXJzLgorRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYKK0ZQREZJbWFnZU9ial9HZXRJbWFnZUZpbHRlckNvdW50KEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QpOworCisvLyBHZXQgdGhlIGZpbHRlciBhdCB8aW5kZXh8IG9mIHxpbWFnZV9vYmplY3R8J3MgbGlzdCBvZiBmaWx0ZXJzLiBOb3RlIHRoYXQgdGhlCisvLyBmaWx0ZXJzIG5lZWQgdG8gYmUgYXBwbGllZCBpbiBvcmRlciwgaS5lLiB0aGUgZmlyc3QgZmlsdGVyIHNob3VsZCBiZSBhcHBsaWVkCisvLyBmaXJzdCwgdGhlbiB0aGUgc2Vjb25kLCBldGMuIHxidWZmZXJ8IGlzIG9ubHkgbW9kaWZpZWQgaWYgfGJ1ZmxlbnwgaXMgbG9uZ2VyCisvLyB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIGZpbHRlciBzdHJpbmcuCisvLworLy8gICBpbWFnZV9vYmplY3QgLSBoYW5kbGUgdG8gYW4gaW1hZ2Ugb2JqZWN0LgorLy8gICBpbmRleCAgICAgICAgLSB0aGUgaW5kZXggb2YgdGhlIGZpbHRlciByZXF1ZXN0ZWQuCisvLyAgIGJ1ZmZlciAgICAgICAtIGJ1ZmZlciBmb3IgaG9sZGluZyBmaWx0ZXIgc3RyaW5nLCBlbmNvZGVkIGluIFVURi04LgorLy8gICBidWZsZW4gICAgICAgLSBsZW5ndGggb2YgdGhlIGJ1ZmZlci4KKy8vCisvLyBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGZpbHRlciBzdHJpbmcuCitGUERGX0VYUE9SVCB1bnNpZ25lZCBsb25nIEZQREZfQ0FMTENPTlYKK0ZQREZJbWFnZU9ial9HZXRJbWFnZUZpbHRlcihGUERGX1BBR0VPQkpFQ1QgaW1hZ2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZsZW4pOworCisvLyBHZXQgdGhlIGltYWdlIG1ldGFkYXRhIG9mIHxpbWFnZV9vYmplY3R8LCBpbmNsdWRpbmcgZGltZW5zaW9uLCBEUEksIGJpdHMgcGVyCisvLyBwaXhlbCwgYW5kIGNvbG9yc3BhY2UuIElmIHRoZSB8aW1hZ2Vfb2JqZWN0fCBpcyBub3QgYW4gaW1hZ2Ugb2JqZWN0IG9yIGlmIGl0CisvLyBkb2VzIG5vdCBoYXZlIGFuIGltYWdlLCB0aGVuIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBmYWxzZS4gT3RoZXJ3aXNlLAorLy8gZmFpbHVyZSB0byByZXRyaWV2ZSBhbnkgc3BlY2lmaWMgcGFyYW1ldGVyIHdvdWxkIHJlc3VsdCBpbiBpdHMgdmFsdWUgYmVpbmcgMC4KKy8vCisvLyAgIGltYWdlX29iamVjdCAtIGhhbmRsZSB0byBhbiBpbWFnZSBvYmplY3QuCisvLyAgIHBhZ2UgICAgICAgICAtIGhhbmRsZSB0byB0aGUgcGFnZSB0aGF0IHxpbWFnZV9vYmplY3R8IGlzIG9uLiBSZXF1aXJlZCBmb3IKKy8vICAgICAgICAgICAgICAgICAgcmV0cmlldmluZyB0aGUgaW1hZ2UncyBiaXRzIHBlciBwaXhlbCBhbmQgY29sb3JzcGFjZS4KKy8vICAgbWV0YWRhdGEgICAgIC0gcmVjZWl2ZXMgdGhlIGltYWdlIG1ldGFkYXRhOyBtdXN0IG5vdCBiZSBOVUxMLgorLy8KKy8vIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLgorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZJbWFnZU9ial9HZXRJbWFnZU1ldGFkYXRhKEZQREZfUEFHRU9CSkVDVCBpbWFnZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfSU1BR0VPQkpfTUVUQURBVEEqIG1ldGFkYXRhKTsKIAogLy8gQ3JlYXRlIGEgbmV3IHBhdGggb2JqZWN0IGF0IGFuIGluaXRpYWwgcG9zaXRpb24uCiAvLwpAQCAtMjY5LDcgKzQzNSw4IEBACiAvLyAgIHkgLSBpbml0aWFsIHZlcnRpY2FsIHBvc2l0aW9uLgogLy8KIC8vIFJldHVybnMgYSBoYW5kbGUgdG8gYSBuZXcgcGF0aCBvYmplY3QuCi1ETExFWFBPUlQgRlBERl9QQUdFT0JKRUNUIFNURENBTEwgRlBERlBhZ2VPYmpfQ3JlYXRlTmV3UGF0aChmbG9hdCB4LCBmbG9hdCB5KTsKK0ZQREZfRVhQT1JUIEZQREZfUEFHRU9CSkVDVCBGUERGX0NBTExDT05WIEZQREZQYWdlT2JqX0NyZWF0ZU5ld1BhdGgoZmxvYXQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeSk7CiAKIC8vIENyZWF0ZSBhIGNsb3NlZCBwYXRoIGNvbnNpc3Rpbmcgb2YgYSByZWN0YW5nbGUuCiAvLwpAQCAtMjc5LDEwICs0NDYsMzggQEAKIC8vICAgaCAtIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgogLy8KIC8vIFJldHVybnMgYSBoYW5kbGUgdG8gdGhlIG5ldyBwYXRoIG9iamVjdC4KLURMTEVYUE9SVCBGUERGX1BBR0VPQkpFQ1QgU1REQ0FMTCBGUERGUGFnZU9ial9DcmVhdGVOZXdSZWN0KGZsb2F0IHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGgpOworRlBERl9FWFBPUlQgRlBERl9QQUdFT0JKRUNUIEZQREZfQ0FMTENPTlYgRlBERlBhZ2VPYmpfQ3JlYXRlTmV3UmVjdChmbG9hdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBoKTsKKworLy8gR2V0IHRoZSBib3VuZGluZyBib3ggb2YgfHBhZ2Vfb2JqZWN0fC4KKy8vCisvLyBwYWdlX29iamVjdCAgLSBoYW5kbGUgdG8gYSBwYWdlIG9iamVjdC4KKy8vIGxlZnQgICAgICAgICAtIHBvaW50ZXIgd2hlcmUgdGhlIGxlZnQgY29vcmRpbmF0ZSB3aWxsIGJlIHN0b3JlZAorLy8gYm90dG9tICAgICAgIC0gcG9pbnRlciB3aGVyZSB0aGUgYm90dG9tIGNvb3JkaW5hdGUgd2lsbCBiZSBzdG9yZWQKKy8vIHJpZ2h0ICAgICAgICAtIHBvaW50ZXIgd2hlcmUgdGhlIHJpZ2h0IGNvb3JkaW5hdGUgd2lsbCBiZSBzdG9yZWQKKy8vIHRvcCAgICAgICAgICAtIHBvaW50ZXIgd2hlcmUgdGhlIHRvcCBjb29yZGluYXRlIHdpbGwgYmUgc3RvcmVkCisvLworLy8gUmV0dXJucyBUUlVFIG9uIHN1Y2Nlc3MuCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgorRlBERlBhZ2VPYmpfR2V0Qm91bmRzKEZQREZfUEFHRU9CSkVDVCBwYWdlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdG9wKTsKKworLy8gU2V0IHRoZSBibGVuZCBtb2RlIG9mIHxwYWdlX29iamVjdHwuCisvLworLy8gcGFnZV9vYmplY3QgIC0gaGFuZGxlIHRvIGEgcGFnZSBvYmplY3QuCisvLyBibGVuZF9tb2RlICAgLSBzdHJpbmcgY29udGFpbmluZyB0aGUgYmxlbmQgbW9kZS4KKy8vCisvLyBCbGVuZCBtb2RlIGNhbiBiZSBvbmUgb2YgZm9sbG93aW5nOiBDb2xvciwgQ29sb3JCdXJuLCBDb2xvckRvZGdlLCBEYXJrZW4sCisvLyBEaWZmZXJlbmNlLCBFeGNsdXNpb24sIEhhcmRMaWdodCwgSHVlLCBMaWdodGVuLCBMdW1pbm9zaXR5LCBNdWx0aXBseSwgTm9ybWFsLAorLy8gT3ZlcmxheSwgU2F0dXJhdGlvbiwgU2NyZWVuLCBTb2Z0TGlnaHQKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OVgorRlBERlBhZ2VPYmpfU2V0QmxlbmRNb2RlKEZQREZfUEFHRU9CSkVDVCBwYWdlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgYmxlbmRfbW9kZSk7CiAKIC8vIFNldCB0aGUgc3Ryb2tlIFJHQkEgb2YgYSBwYXRoLiBSYW5nZSBvZiB2YWx1ZXM6IDAgLSAyNTUuCiAvLwpAQCAtMjkzLDExICs0ODgsMjggQEAKIC8vIEEgICAgICAtIHRoZSBzdHJva2UgYWxwaGEgZm9yIHRoZSBwYXRoLgogLy8KIC8vIFJldHVybnMgVFJVRSBvbiBzdWNjZXNzLgotRExMRVhQT1JUIEZQREZfQk9PTCBGUERGUGF0aF9TZXRTdHJva2VDb2xvcihGUERGX1BBR0VPQkpFQ1QgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBHLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IEEpOworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZQYXRoX1NldFN0cm9rZUNvbG9yKEZQREZfUEFHRU9CSkVDVCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IFIsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBCLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IEEpOworCisvLyBHZXQgdGhlIHN0cm9rZSBSR0JBIG9mIGEgcGF0aC4gUmFuZ2Ugb2YgdmFsdWVzOiAwIC0gMjU1LgorLy8KKy8vIHBhdGggICAtIHRoZSBoYW5kbGUgdG8gdGhlIHBhdGggb2JqZWN0LgorLy8gUiAgICAgIC0gdGhlIHJlZCBjb21wb25lbnQgb2YgdGhlIHBhdGggc3Ryb2tlIGNvbG9yLgorLy8gRyAgICAgIC0gdGhlIGdyZWVuIGNvbXBvbmVudCBvZiB0aGUgcGF0aCBzdHJva2UgY29sb3IuCisvLyBCICAgICAgLSB0aGUgYmx1ZSBjb21wb25lbnQgb2YgdGhlIHBhdGggc3Ryb2tlIGNvbG9yLgorLy8gQSAgICAgIC0gdGhlIHN0cm9rZSBhbHBoYSBvZiB0aGUgcGF0aC4KKy8vCisvLyBSZXR1cm5zIFRSVUUgb24gc3VjY2Vzcy4KK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCitGUERGUGF0aF9HZXRTdHJva2VDb2xvcihGUERGX1BBR0VPQkpFQ1QgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCogUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCogRywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCogQiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCogQSk7CiAKIC8vIFNldCB0aGUgc3Ryb2tlIHdpZHRoIG9mIGEgcGF0aC4KIC8vCkBAIC0zMDUsNyArNTE3LDI4IEBACiAvLyB3aWR0aCAgLSB0aGUgd2lkdGggb2YgdGhlIHN0cm9rZS4KIC8vCiAvLyBSZXR1cm5zIFRSVUUgb24gc3VjY2VzcwotRExMRVhQT1JUIEZQREZfQk9PTCBGUERGUGF0aF9TZXRTdHJva2VXaWR0aChGUERGX1BBR0VPQkpFQ1QgcGF0aCwgZmxvYXQgd2lkdGgpOworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZQYXRoX1NldFN0cm9rZVdpZHRoKEZQREZfUEFHRU9CSkVDVCBwYXRoLCBmbG9hdCB3aWR0aCk7CisKKy8vIFNldCB0aGUgbGluZSBqb2luIG9mIHxwYWdlX29iamVjdHwuCisvLworLy8gcGFnZV9vYmplY3QgIC0gaGFuZGxlIHRvIGEgcGFnZSBvYmplY3QuCisvLyBsaW5lX2pvaW4gICAgLSBsaW5lIGpvaW4KKy8vCisvLyBMaW5lIGpvaW4gY2FuIGJlIG9uZSBvZiBmb2xsb3dpbmc6IEZQREZfTElORUpPSU5fTUlURVIsIEZQREZfTElORUpPSU5fUk9VTkQsCisvLyBGUERGX0xJTkVKT0lOX0JFVkVMCitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRlBERlBhdGhfU2V0TGluZUpvaW4oRlBERl9QQUdFT0JKRUNUIHBhZ2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lX2pvaW4pOworCisvLyBTZXQgdGhlIGxpbmUgY2FwIG9mIHxwYWdlX29iamVjdHwuCisvLworLy8gcGFnZV9vYmplY3QgLSBoYW5kbGUgdG8gYSBwYWdlIG9iamVjdC4KKy8vIGxpbmVfY2FwICAgIC0gbGluZSBjYXAKKy8vCisvLyBMaW5lIGNhcCBjYW4gYmUgb25lIG9mIGZvbGxvd2luZzogRlBERl9MSU5FQ0FQX0JVVFQsIEZQREZfTElORUNBUF9ST1VORCwKKy8vIEZQREZfTElORUNBUF9QUk9KRUNUSU5HX1NRVUFSRQorRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZQYXRoX1NldExpbmVDYXAoRlBERl9QQUdFT0JKRUNUIHBhZ2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfY2FwKTsKIAogLy8gU2V0IHRoZSBmaWxsIFJHQkEgb2YgYSBwYXRoLiBSYW5nZSBvZiB2YWx1ZXM6IDAgLSAyNTUuCiAvLwpAQCAtMzE2LDExICs1NDksNzYgQEAKIC8vIEEgICAgICAtIHRoZSBmaWxsIGFscGhhIGZvciB0aGUgcGF0aC4KIC8vCiAvLyBSZXR1cm5zIFRSVUUgb24gc3VjY2Vzcy4KLURMTEVYUE9SVCBGUERGX0JPT0wgRlBERlBhdGhfU2V0RmlsbENvbG9yKEZQREZfUEFHRU9CSkVDVCBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IEEpOworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRlBERlBhdGhfU2V0RmlsbENvbG9yKEZQREZfUEFHRU9CSkVDVCBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBBKTsKKworLy8gR2V0IHRoZSBmaWxsIFJHQkEgb2YgYSBwYXRoLiBSYW5nZSBvZiB2YWx1ZXM6IDAgLSAyNTUuCisvLworLy8gcGF0aCAgIC0gdGhlIGhhbmRsZSB0byB0aGUgcGF0aCBvYmplY3QuCisvLyBSICAgICAgLSB0aGUgcmVkIGNvbXBvbmVudCBvZiB0aGUgcGF0aCBmaWxsIGNvbG9yLgorLy8gRyAgICAgIC0gdGhlIGdyZWVuIGNvbXBvbmVudCBvZiB0aGUgcGF0aCBmaWxsIGNvbG9yLgorLy8gQiAgICAgIC0gdGhlIGJsdWUgY29tcG9uZW50IG9mIHRoZSBwYXRoIGZpbGwgY29sb3IuCisvLyBBICAgICAgLSB0aGUgZmlsbCBhbHBoYSBvZiB0aGUgcGF0aC4KKy8vCisvLyBSZXR1cm5zIFRSVUUgb24gc3VjY2Vzcy4KK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZQYXRoX0dldEZpbGxDb2xvcihGUERGX1BBR0VPQkpFQ1QgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQqIFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50KiBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCogQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQqIEEpOworCisvLyBFeHBlcmltZW50YWwgQVBJLgorLy8gR2V0IG51bWJlciBvZiBzZWdtZW50cyBpbnNpZGUgfHBhdGh8LgorLy8KKy8vICAgcGF0aCAtIGhhbmRsZSB0byBhIHBhdGguCisvLworLy8gQSBzZWdtZW50IGlzIGEgY29tbWFuZCwgY3JlYXRlZCBieSBlLmcuIEZQREZQYXRoX01vdmVUbygpLAorLy8gRlBERlBhdGhfTGluZVRvKCkgb3IgRlBERlBhdGhfQmV6aWVyVG8oKS4KKy8vCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpbiB8cGF0aHwgb3IgLTEgb24gZmFpbHVyZS4KK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZQYXRoX0NvdW50U2VnbWVudHMoRlBERl9QQUdFT0JKRUNUIHBhdGgpOworCisvLyBFeHBlcmltZW50YWwgQVBJLgorLy8gR2V0IHNlZ21lbnQgaW4gfHBhdGh8IGF0IHxpbmRleHwuCisvLworLy8gICBwYXRoICAtIGhhbmRsZSB0byBhIHBhdGguCisvLyAgIGluZGV4IC0gdGhlIGluZGV4IG9mIGEgc2VnbWVudC4KKy8vCisvLyBSZXR1cm5zIHRoZSBoYW5kbGUgdG8gdGhlIHNlZ21lbnQsIG9yIE5VTEwgb24gZmFpdXJlLgorRlBERl9FWFBPUlQgRlBERl9QQVRIU0VHTUVOVCBGUERGX0NBTExDT05WCitGUERGUGF0aF9HZXRQYXRoU2VnbWVudChGUERGX1BBR0VPQkpFQ1QgcGF0aCwgaW50IGluZGV4KTsKKworLy8gRXhwZXJpbWVudGFsIEFQSS4KKy8vIEdldCBjb29yZGluYXRlcyBvZiB8c2VnbWVudHwuCisvLworLy8gICBzZWdtZW50ICAtIGhhbmRsZSB0byBhIHNlZ21lbnQuCisvLyAgIHggICAgICAtIHRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBzZWdtZW50LgorLy8gICB5ICAgICAgLSB0aGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHNlZ21lbnQuCisvLworLy8gUmV0dXJucyBUUlVFIG9uIHN1Y2Nlc3MsIG90aGVyd2lzZSB8eHwgYW5kIHx5fCBpcyBub3Qgc2V0LgorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZQYXRoU2VnbWVudF9HZXRQb2ludChGUERGX1BBVEhTRUdNRU5UIHNlZ21lbnQsIGZsb2F0KiB4LCBmbG9hdCogeSk7CisKKy8vIEV4cGVyaW1lbnRhbCBBUEkuCisvLyBHZXQgdHlwZSBvZiB8c2VnbWVudHwuCisvLworLy8gICBzZWdtZW50IC0gaGFuZGxlIHRvIGEgc2VnbWVudC4KKy8vCisvLyBSZXR1cm5zIG9uZSBvZiB0aGUgRlBERl9TRUdNRU5UXyogdmFsdWVzIG9uIHN1Y2Nlc3MsCisvLyBGUERGX1NFR01FTlRfVU5LTk9XTiBvbiBlcnJvci4KK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZQYXRoU2VnbWVudF9HZXRUeXBlKEZQREZfUEFUSFNFR01FTlQgc2VnbWVudCk7CisKKy8vIEV4cGVyaW1lbnRhbCBBUEkuCisvLyBHZXRzIGlmIHRoZSB8c2VnbWVudHwgY2xvc2VzIHRoZSBjdXJyZW50IHN1YnBhdGggb2YgYSBnaXZlbiBwYXRoLgorLy8KKy8vICAgc2VnbWVudCAtIGhhbmRsZSB0byBhIHNlZ21lbnQuCisvLworLy8gUmV0dXJucyBjbG9zZSBmbGFnIGZvciBub24tTlVMTCBzZWdtZW50LCBGQUxTRSBvdGhlcndpc2UuCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgorRlBERlBhdGhTZWdtZW50X0dldENsb3NlKEZQREZfUEFUSFNFR01FTlQgc2VnbWVudCk7CiAKIC8vIE1vdmUgYSBwYXRoJ3MgY3VycmVudCBwb2ludC4KIC8vCkBAIC0zMzIsNyArNjMwLDkgQEAKIC8vIG5ldyBvbmUuCiAvLwogLy8gUmV0dXJucyBUUlVFIG9uIHN1Y2Nlc3MKLURMTEVYUE9SVCBGUERGX0JPT0wgRlBERlBhdGhfTW92ZVRvKEZQREZfUEFHRU9CSkVDVCBwYXRoLCBmbG9hdCB4LCBmbG9hdCB5KTsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZQYXRoX01vdmVUbyhGUERGX1BBR0VPQkpFQ1QgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHkpOwogCiAvLyBBZGQgYSBsaW5lIGJldHdlZW4gdGhlIGN1cnJlbnQgcG9pbnQgYW5kIGEgbmV3IHBvaW50IGluIHRoZSBwYXRoLgogLy8KQEAgLTM0Myw3ICs2NDMsOSBAQAogLy8gVGhlIHBhdGgncyBjdXJyZW50IHBvaW50IGlzIGNoYW5nZWQgdG8gKHgsIHkpLgogLy8KIC8vIFJldHVybnMgVFJVRSBvbiBzdWNjZXNzCi1ETExFWFBPUlQgRlBERl9CT09MIEZQREZQYXRoX0xpbmVUbyhGUERGX1BBR0VPQkpFQ1QgcGF0aCwgZmxvYXQgeCwgZmxvYXQgeSk7CitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGUGF0aF9MaW5lVG8oRlBERl9QQUdFT0JKRUNUIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5KTsKIAogLy8gQWRkIGEgY3ViaWMgQmV6aWVyIGN1cnZlIHRvIHRoZSBnaXZlbiBwYXRoLCBzdGFydGluZyBhdCB0aGUgY3VycmVudCBwb2ludC4KIC8vCkBAIC0zNTYsMTMgKzY1OCwxMyBAQAogLy8geTMgICAgIC0gdGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSBlbmRpbmcgcG9pbnQgb2YgdGhlIEJlemllciBjdXJ2ZS4KIC8vCiAvLyBSZXR1cm5zIFRSVUUgb24gc3VjY2VzcwotRExMRVhQT1JUIEZQREZfQk9PTCBGUERGUGF0aF9CZXppZXJUbyhGUERGX1BBR0VPQkpFQ1QgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5Myk7CitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGUGF0aF9CZXppZXJUbyhGUERGX1BBR0VPQkpFQ1QgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB5Myk7CiAKIC8vIENsb3NlIHRoZSBjdXJyZW50IHN1YnBhdGggb2YgYSBnaXZlbiBwYXRoLgogLy8KQEAgLTM3Miw3ICs2NzQsNyBAQAogLy8gc3VicGF0aCwgdGh1cyB0ZXJtaW5hdGluZyB0aGUgY3VycmVudCBzdWJwYXRoLgogLy8KIC8vIFJldHVybnMgVFJVRSBvbiBzdWNjZXNzCi1ETExFWFBPUlQgRlBERl9CT09MIEZQREZQYXRoX0Nsb3NlKEZQREZfUEFHRU9CSkVDVCBwYXRoKTsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZQYXRoX0Nsb3NlKEZQREZfUEFHRU9CSkVDVCBwYXRoKTsKIAogLy8gU2V0IHRoZSBkcmF3aW5nIG1vZGUgb2YgYSBwYXRoLgogLy8KQEAgLTM4Miw5ICs2ODQsOSBAQAogLy8gc3Ryb2tlICAgLSBhIGJvb2xlYW4gc3BlY2lmeWluZyBpZiB0aGUgcGF0aCBzaG91bGQgYmUgc3Ryb2tlZCBvciBub3QuCiAvLwogLy8gUmV0dXJucyBUUlVFIG9uIHN1Y2Nlc3MKLURMTEVYUE9SVCBGUERGX0JPT0wgRlBERlBhdGhfU2V0RHJhd01vZGUoRlBERl9QQUdFT0JKRUNUIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIHN0cm9rZSk7CitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGUGF0aF9TZXREcmF3TW9kZShGUERGX1BBR0VPQkpFQ1QgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWxsbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBzdHJva2UpOwogCiAvLyBDcmVhdGUgYSBuZXcgdGV4dCBvYmplY3QgdXNpbmcgb25lIG9mIHRoZSBzdGFuZGFyZCBQREYgZm9udHMuCiAvLwpAQCAtMzkzLDMwICs2OTUsNzEgQEAKIC8vIGZvbnRfc2l6ZSAgLSB0aGUgZm9udCBzaXplIGZvciB0aGUgbmV3IHRleHQgb2JqZWN0LgogLy8KIC8vIFJldHVybnMgYSBoYW5kbGUgdG8gYSBuZXcgdGV4dCBvYmplY3QsIG9yIE5VTEwgb24gZmFpbHVyZQotRExMRVhQT1JUIEZQREZfUEFHRU9CSkVDVCBTVERDQUxMIEZQREZQYWdlT2JqX05ld1RleHRPYmooRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBmb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZm9udF9zaXplKTsKK0ZQREZfRVhQT1JUIEZQREZfUEFHRU9CSkVDVCBGUERGX0NBTExDT05WCitGUERGUGFnZU9ial9OZXdUZXh0T2JqKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBmb250LAorICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmb250X3NpemUpOwogCiAvLyBTZXQgdGhlIHRleHQgZm9yIGEgdGV4dG9iamVjdC4gSWYgaXQgaGFkIHRleHQsIGl0IHdpbGwgYmUgcmVwbGFjZWQuCiAvLwogLy8gdGV4dF9vYmplY3QgIC0gaGFuZGxlIHRvIHRoZSB0ZXh0IG9iamVjdC4KLS8vIHRleHQgICAgICAgICAtIHN0cmluZyBjb250YWluaW5nIHRoZSB0ZXh0IHRvIGJlIGFkZGVkLgorLy8gdGV4dCAgICAgICAgIC0gdGhlIFVURi0xNkxFIGVuY29kZWQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHRleHQgdG8gYmUgYWRkZWQuCiAvLwogLy8gUmV0dXJucyBUUlVFIG9uIHN1Y2Nlc3MKLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGVGV4dF9TZXRUZXh0KEZQREZfUEFHRU9CSkVDVCB0ZXh0X29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyB0ZXh0KTsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCitGUERGVGV4dF9TZXRUZXh0KEZQREZfUEFHRU9CSkVDVCB0ZXh0X29iamVjdCwgRlBERl9XSURFU1RSSU5HIHRleHQpOwogCi0vLyBSZXR1cm5zIGEgdHlwZSAxIGZvbnQgb2JqZWN0IGxvYWRlZCBmcm9tIGEgc3RyZWFtIG9mIGRhdGEuIFRoZSBmb250IGlzIGxvYWRlZAotLy8gaW50byB0aGUgZG9jdW1lbnQuIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVlZCB0byBmcmVlIHRoZSByZXR1cm5lZCBvYmplY3QuCisvLyBSZXR1cm5zIGEgZm9udCBvYmplY3QgbG9hZGVkIGZyb20gYSBzdHJlYW0gb2YgZGF0YS4gVGhlIGZvbnQgaXMgbG9hZGVkCisvLyBpbnRvIHRoZSBkb2N1bWVudC4KIC8vCi0vLyBkb2N1bWVudCAtIGhhbmRsZSB0byB0aGUgZG9jdW1lbnQuCi0vLyBkYXRhICAgICAtIHRoZSBzdHJlYW0gb2YgZGF0YSwgd2hpY2ggd2lsbCBiZSBjb3BpZWQgYnkgdGhlIGZvbnQgb2JqZWN0LgotLy8gc2l6ZSAgICAgLSBzaXplIG9mIHRoZSBzdHJlYW0sIGluIGJ5dGVzLgorLy8gZG9jdW1lbnQgICAtIGhhbmRsZSB0byB0aGUgZG9jdW1lbnQuCisvLyBkYXRhICAgICAgIC0gdGhlIHN0cmVhbSBvZiBkYXRhLCB3aGljaCB3aWxsIGJlIGNvcGllZCBieSB0aGUgZm9udCBvYmplY3QuCisvLyBzaXplICAgICAgIC0gc2l6ZSBvZiB0aGUgc3RyZWFtLCBpbiBieXRlcy4KKy8vIGZvbnRfdHlwZSAgLSBGUERGX0ZPTlRfVFlQRTEgb3IgRlBERl9GT05UX1RSVUVUWVBFIGRlcGVuZGluZyBvbiB0aGUgZm9udAorLy8gdHlwZS4KKy8vIGNpZCAgICAgICAgLSBhIGJvb2xlYW4gc3BlY2lmeWluZyBpZiB0aGUgZm9udCBpcyBhIENJRCBmb250IG9yIG5vdC4KKy8vCisvLyBUaGUgbG9hZGVkIGZvbnQgY2FuIGJlIGNsb3NlZCB1c2luZyBGUERGX0ZvbnRfQ2xvc2UuCiAvLwogLy8gUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUKLURMTEVYUE9SVCBGUERGX0ZPTlQgU1REQ0FMTCBGUERGVGV4dF9Mb2FkVHlwZTFGb250KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSk7CitGUERGX0VYUE9SVCBGUERGX0ZPTlQgRlBERl9DQUxMQ09OViBGUERGVGV4dF9Mb2FkRm9udChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9udF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CT09MIGNpZCk7CisKKy8vIFNldCB0aGUgZmlsbCBSR0JBIG9mIGEgdGV4dCBvYmplY3QuIFJhbmdlIG9mIHZhbHVlczogMCAtIDI1NS4KKy8vCisvLyB0ZXh0X29iamVjdCAgLSBoYW5kbGUgdG8gdGhlIHRleHQgb2JqZWN0LgorLy8gUiAgICAgICAgICAgIC0gdGhlIHJlZCBjb21wb25lbnQgZm9yIHRoZSBwYXRoIGZpbGwgY29sb3IuCisvLyBHICAgICAgICAgICAgLSB0aGUgZ3JlZW4gY29tcG9uZW50IGZvciB0aGUgcGF0aCBmaWxsIGNvbG9yLgorLy8gQiAgICAgICAgICAgIC0gdGhlIGJsdWUgY29tcG9uZW50IGZvciB0aGUgcGF0aCBmaWxsIGNvbG9yLgorLy8gQSAgICAgICAgICAgIC0gdGhlIGZpbGwgYWxwaGEgZm9yIHRoZSBwYXRoLgorLy8KKy8vIFJldHVybnMgVFJVRSBvbiBzdWNjZXNzLgorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZUZXh0X1NldEZpbGxDb2xvcihGUERGX1BBR0VPQkpFQ1QgdGV4dF9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IFIsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IEcsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IEIsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IEEpOworCisvLyBDbG9zZSBhIGxvYWRlZCBQREYgZm9udC4KKy8vCisvLyBmb250ICAgLSBIYW5kbGUgdG8gdGhlIGxvYWRlZCBmb250LgorRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZGb250X0Nsb3NlKEZQREZfRk9OVCBmb250KTsKKworLy8gQ3JlYXRlIGEgbmV3IHRleHQgb2JqZWN0IHVzaW5nIGEgbG9hZGVkIGZvbnQuCisvLworLy8gZG9jdW1lbnQgICAtIGhhbmRsZSB0byB0aGUgZG9jdW1lbnQuCisvLyBmb250ICAgICAgIC0gaGFuZGxlIHRvIHRoZSBmb250IG9iamVjdC4KKy8vIGZvbnRfc2l6ZSAgLSB0aGUgZm9udCBzaXplIGZvciB0aGUgbmV3IHRleHQgb2JqZWN0LgorLy8KKy8vIFJldHVybnMgYSBoYW5kbGUgdG8gYSBuZXcgdGV4dCBvYmplY3QsIG9yIE5VTEwgb24gZmFpbHVyZQorRlBERl9FWFBPUlQgRlBERl9QQUdFT0JKRUNUIEZQREZfQ0FMTENPTlYKK0ZQREZQYWdlT2JqX0NyZWF0ZVRleHRPYmooRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GT05UIGZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZvbnRfc2l6ZSk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvcHVibGljL2ZwZGZfZXh0LmggYi9wdWJsaWMvZnBkZl9leHQuaAppbmRleCAzNDY1ODc4Li5lNDg4YzUyIDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl9leHQuaAorKysgYi9wdWJsaWMvZnBkZl9leHQuaApAQCAtNjQsNyArNjQsNyBAQAogLy8gICB1bnNwX2luZm8gLSBQb2ludGVyIHRvIGFuIFVOU1VQUE9SVF9JTkZPIHN0cnVjdHVyZS4KIC8vCiAvLyBSZXR1cm5zIFRSVUUgb24gc3VjY2Vzcy4KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTAorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKIEZTREtfU2V0VW5TcE9ialByb2Nlc3NIYW5kbGVyKFVOU1VQUE9SVF9JTkZPKiB1bnNwX2luZm8pOwogCiAvLyBVbmtub3duIHBhZ2UgbW9kZS4KQEAgLTg5LDcgKzg5LDcgQEAKIC8vIFJldHVybnMgb25lIG9mIHRoZSB8UEFHRU1PREVfKnwgZmxhZ3MgZGVmaW5lZCBhYm92ZS4KIC8vCiAvLyBUaGUgcGFnZSBtb2RlIGRlZmluZXMgaG93IHRoZSBkb2N1bWVudCBzaG91bGQgYmUgaW5pdGlhbGx5IGRpc3BsYXllZC4KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGRG9jX0dldFBhZ2VNb2RlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERkRvY19HZXRQYWdlTW9kZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS9wdWJsaWMvZnBkZl9mbGF0dGVuLmggYi9wdWJsaWMvZnBkZl9mbGF0dGVuLmgKaW5kZXggYzFlMzU0ZS4uNjE0NTQwZSAxMDA2NDQKLS0tIGEvcHVibGljL2ZwZGZfZmxhdHRlbi5oCisrKyBiL3B1YmxpYy9mcGRmX2ZsYXR0ZW4uaApAQCAtMzUsNyArMzUsNyBAQAogLy8KIC8vIEN1cnJlbnRseSwgYWxsIGZhaWx1cmVzIHJldHVybiB8RkxBVFRFTl9GQUlMfCB3aXRoIG5vIGluZGljYXRpb24gb2YgdGhlCiAvLyBjYXVzZS4KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGUGFnZV9GbGF0dGVuKEZQREZfUEFHRSBwYWdlLCBpbnQgbkZsYWcpOworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERlBhZ2VfRmxhdHRlbihGUERGX1BBR0UgcGFnZSwgaW50IG5GbGFnKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9ICAvLyBleHRlcm4gIkMiCmRpZmYgLS1naXQgYS9wdWJsaWMvZnBkZl9mb3JtZmlsbC5oIGIvcHVibGljL2ZwZGZfZm9ybWZpbGwuaAppbmRleCAwOWI4MGVhLi5jMmUyYmQ1IDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl9mb3JtZmlsbC5oCisrKyBiL3B1YmxpYy9mcGRmX2Zvcm1maWxsLmgKQEAgLTEyLDExICsxMiwxNCBAQAogCiB0eXBlZGVmIHZvaWQqIEZQREZfRk9STUhBTkRMRTsKIAotI2lmZGVmIFBERl9FTkFCTEVfWEZBCi0jZGVmaW5lIERPQ1RZUEVfUERGIDAgICAgICAgICAgLy8gTm9ybWFsIHBkZiBEb2N1bWVudAotI2RlZmluZSBET0NUWVBFX0RZTkFNSUNfWEZBIDEgIC8vIER5bmFtaWMgeGZhIERvY3VtZW50IFR5cGUKLSNkZWZpbmUgRE9DVFlQRV9TVEFUSUNfWEZBIDIgICAvLyBTdGF0aWMgeGZhIERvY3VtZW50IFR5cGUKLSNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKy8vIFRoZXNlIHZhbHVlcyBhcmUgcmV0dXJuIHZhbHVlcyBmb3IgYSBwdWJsaWMgQVBJLCBzbyBzaG91bGQgbm90IGJlIGNoYW5nZWQKKy8vIG90aGVyIHRoYW4gdGhlIGNvdW50IHdoZW4gYWRkaW5nIG5ldyB2YWx1ZXMuCisjZGVmaW5lIEZPUk1UWVBFX05PTkUgMCAgICAgICAvLyBEb2N1bWVudCBjb250YWlucyBubyBmb3JtcworI2RlZmluZSBGT1JNVFlQRV9BQ1JPX0ZPUk0gMSAgLy8gRm9ybXMgYXJlIHNwZWNpZmllZCB1c2luZyBBY3JvRm9ybSBzcGVjCisjZGVmaW5lIEZPUk1UWVBFX1hGQV9GVUxMIDIgICAvLyBGb3JtcyBhcmUgc3BlY2lmaWVkIHVzaW5nIHRoZSBlbnRpcmUgWEZBIHNwZWMKKyNkZWZpbmUgRk9STVRZUEVfWEZBX0ZPUkVHUk9VTkQgXAorICAzICAvLyBGb3JtcyBhcmUgc3BlY2lmaWVkIHVzaW5nIHRoZSBYRkFGIHN1YnNldCBvZiBYRkEgc3BlYworI2RlZmluZSBGT1JNVFlQRV9DT1VOVCA0ICAvLyBUaGUgbnVtYmVyIG9mIGZvcm0gdHlwZXMKIAogLy8gRXhwb3J0ZWQgRnVuY3Rpb25zCiAjaWZkZWYgX19jcGx1c3BsdXMKQEAgLTEwODEsNyArMTA4NCw3IEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBSZXR1cm4gaGFuZGxlciB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gTlVMTCBtZWFucyBmYWlscy4KICAqKi8KLURMTEVYUE9SVCBGUERGX0ZPUk1IQU5ETEUgU1REQ0FMTAorRlBERl9FWFBPUlQgRlBERl9GT1JNSEFORExFIEZQREZfQ0FMTENPTlYKIEZQREZET0NfSW5pdEZvcm1GaWxsRW52aXJvbm1lbnQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GT1JNRklMTElORk8qIGZvcm1JbmZvKTsKIApAQCAtMTA5NCw3ICsxMDk3LDggQEAKICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIE5VTEwuCiAgKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZET0NfRXhpdEZvcm1GaWxsRW52aXJvbm1lbnQoRlBERl9GT1JNSEFORExFIGhIYW5kbGUpOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WCitGUERGRE9DX0V4aXRGb3JtRmlsbEVudmlyb25tZW50KEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRk9STV9PbkFmdGVyTG9hZFBhZ2UKQEAgLTExMDgsOCArMTExMiw4IEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBOT05FLgogICoqLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGT1JNX09uQWZ0ZXJMb2FkUGFnZShGUERGX1BBR0UgcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GT1JNSEFORExFIGhIYW5kbGUpOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZPUk1fT25BZnRlckxvYWRQYWdlKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRk9STV9PbkJlZm9yZUNsb3NlUGFnZQpAQCAtMTEyNCw4ICsxMTI4LDggQEAKICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIE5PTkUuCiAgKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZPUk1fT25CZWZvcmVDbG9zZVBhZ2UoRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GT1JNSEFORExFIGhIYW5kbGUpOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZPUk1fT25CZWZvcmVDbG9zZVBhZ2UoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSk7CiAKIC8qKgogKiBGdW5jdGlvbjogRk9STV9Eb0RvY3VtZW50SlNBY3Rpb24KQEAgLTExNDIsNyArMTE0Niw3IEBACiAqZG9jdW1lbnQsIHRoaXMgbWV0aG9kIHdpbGwgZXhlY3V0ZSB0aGUgamF2YXNjcmlwdCBhY3Rpb247CiAqICAgICAgICAgICBvdGhlcndpc2UsIHRoZSBtZXRob2Qgd2lsbCBkbyBub3RoaW5nLgogKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZPUk1fRG9Eb2N1bWVudEpTQWN0aW9uKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGT1JNX0RvRG9jdW1lbnRKU0FjdGlvbihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSk7CiAKIC8qKgogKiBGdW5jdGlvbjogRk9STV9Eb0RvY3VtZW50T3BlbkFjdGlvbgpAQCAtMTE1Nyw3ICsxMTYxLDggQEAKICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZyBpZiB0aGVyZSBpcyBubyBvcGVuLWFjdGlvbnMgZW1iZWRkZWQgaW4KICp0aGUgZG9jdW1lbnQuCiAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRk9STV9Eb0RvY3VtZW50T3BlbkFjdGlvbihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSk7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYKK0ZPUk1fRG9Eb2N1bWVudE9wZW5BY3Rpb24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUpOwogCiAvLyBhZGRpdGlvbmFsIGFjdGlvbnMgdHlwZSBvZiBkb2N1bWVudC4KICNkZWZpbmUgRlBERkRPQ19BQUNUSU9OX1dDIFwKQEAgLTExODcsOCArMTE5Miw4IEBACiAqYWRkaXRpb25hbC1hY3Rpb24gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFhVHlwZS4KICoqLwogCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZPUk1fRG9Eb2N1bWVudEFBY3Rpb24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFhVHlwZSk7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRk9STV9Eb0RvY3VtZW50QUFjdGlvbihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhYVR5cGUpOwogCiAvLyBBZGRpdGlvbmFsLWFjdGlvbiB0eXBlcyBvZiBwYWdlIG9iamVjdAogI2RlZmluZSBGUERGUEFHRV9BQUNUSU9OX09QRU4gXApAQCAtMTIxMyw5ICsxMjE4LDkgQEAKICogICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgZG8gbm90aGluZyBpZiBubyBhZGRpdGlvbmFsLWFjdGlvbiBjb3JyZXNwb25kaW5nIHRvCiAqdGhlIHNwZWNpZmllZCBhYVR5cGUgZXhpc3RzLgogKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZPUk1fRG9QYWdlQUFjdGlvbihGUERGX1BBR0UgcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFhVHlwZSk7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRk9STV9Eb1BhZ2VBQWN0aW9uKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFhVHlwZSk7CiAKIC8qKgogICogRnVuY3Rpb246IEZPUk1fT25Nb3VzZU1vdmUKQEAgLTEyMzMsMTEgKzEyMzgsMzQgQEAKICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIFRSVUUgaW5kaWNhdGVzIHN1Y2Nlc3M7IG90aGVyd2lzZSBmYWxzZS4KICAqKi8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uTW91c2VNb3ZlKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSk7CitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGT1JNX09uTW91c2VNb3ZlKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV95KTsKKworLyoqCisgKiBGdW5jdGlvbjogRk9STV9PbkZvY3VzCisgKiAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGZvY3VzZXMgdGhlIGZvcm0gYW5ub3RhdGlvbiBhdCBhIGdpdmVuIHBvaW50LiBJZiB0aGUKKyAqICAgICAgICAgIGFubm90YXRpb24gYXQgdGhlIHBvaW50IGFscmVhZHkgaGFzIGZvY3VzLCBub3RoaW5nIGhhcHBlbnMuIElmIHRoZXJlCisgKiAgICAgICAgICBpcyBubyBhbm5vdGF0aW9uIGF0IHRoZSBwb2ludCwgcmVtb3ZlIGZvcm0gZm9jdXMuCisgKiBQYXJhbWV0ZXJzOgorICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorICogICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZS4KKyAqICAgICAgICAgIG1vZGlmaWVyICAgIC0gICBJbmRpY2F0ZXMgd2hldGhlciB2YXJpb3VzIHZpcnR1YWwga2V5cyBhcmUgZG93bi4KKyAqICAgICAgICAgIHBhZ2VfeCAgICAgIC0gICBTcGVjaWZpZXMgdGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgY3Vyc29yIGluIFBERiB1c2VyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2UuCisgKiAgICAgICAgICBwYWdlX3kgICAgICAtICAgU3BlY2lmaWVzIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGN1cnNvciBpbiBQREYgdXNlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlLgorICogUmV0dXJuIFZhbHVlOgorICogICAgICAgICAgVFJVRSBpZiB0aGVyZSBpcyBhbiBhbm5vdGF0aW9uIGF0IHRoZSBnaXZlbiBwb2ludCBhbmQgaXQgaGFzIGZvY3VzLgorICoqLworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRk9STV9PbkZvY3VzKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpOwogCiAvKioKICAqIEZ1bmN0aW9uOiBGT1JNX09uTEJ1dHRvbkRvd24KQEAgLTEyNTYsMTEgKzEyODQsMTEgQEAKICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIFRSVUUgaW5kaWNhdGVzIHN1Y2Nlc3M7IG90aGVyd2lzZSBmYWxzZS4KICAqKi8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uTEJ1dHRvbkRvd24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpOworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRk9STV9PbkxCdXR0b25Eb3duKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpOwogCiAvKioKICAqIEZ1bmN0aW9uOiBGT1JNX09uTEJ1dHRvblVwCkBAIC0xMjc3LDIzICsxMzA1LDIzIEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBUUlVFIGluZGljYXRlcyBzdWNjZXNzOyBvdGhlcndpc2UgZmFsc2UuCiAgKiovCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PbkxCdXR0b25VcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpOworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRk9STV9PbkxCdXR0b25VcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSk7CiAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25SQnV0dG9uRG93bihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSk7Ci1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9PblJCdXR0b25VcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpOworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRk9STV9PblJCdXR0b25Eb3duKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpOworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRk9STV9PblJCdXR0b25VcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSk7CiAjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKIC8qKgpAQCAtMTMxMCwxMCArMTMzOCwxMCBAQAogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhbHNlLgogICoqLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25LZXlEb3duKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuS2V5Q29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXIpOworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRk9STV9PbktleURvd24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuS2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RpZmllcik7CiAKIC8qKgogICogRnVuY3Rpb246IEZPUk1fT25LZXlVcApAQCAtMTMyOSwxMCArMTM1NywxMCBAQAogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzczsgb3RoZXJ3aXNlIGZhbHNlLgogICoqLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZPUk1fT25LZXlVcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuS2V5Q29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyKTsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZPUk1fT25LZXlVcChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbktleUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyKTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRk9STV9PbkNoYXIKQEAgLTEzNDksMTAgKzEzNzcsNTQgQEAKICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIFRSVUUgaW5kaWNhdGVzIHN1Y2Nlc3M7IG90aGVyd2lzZSBmYWxzZS4KICAqKi8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGT1JNX09uQ2hhcihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNoYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGlmaWVyKTsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZPUk1fT25DaGFyKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXIpOworCisvKioKKyAqIEZ1bmN0aW9uOiBGT1JNX0dldFNlbGVjdGVkVGV4dAorICogICAgICAgICAgWW91IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gb2J0YWluIHNlbGVjdGVkIHRleHQgd2l0aGluCisgKiAgICAgICAgICBhIGZvcm0gdGV4dCBmaWVsZCBvciBmb3JtIGNvbWJvYm94IHRleHQgZmllbGQuCisgKiBQYXJhbWV0ZXJzOgorICogICAgICAgICAgaEhhbmRsZSAgICAgLSAgIEhhbmRsZSB0byB0aGUgZm9ybSBmaWxsIG1vZHVsZS4gUmV0dXJuZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50LgorICogICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLgorICogICAgICAgICAgYnVmZmVyICAgICAgLSAgIEJ1ZmZlciBmb3IgaG9sZGluZyB0aGUgc2VsZWN0ZWQgdGV4dCwgZW5jb2RlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIFVURjE2LUxFLiBJZiBOVUxMLCB8YnVmZmVyfCBpcyBub3QgbW9kaWZpZWQuCisgKiAgICAgICAgICBidWZsZW4gICAgICAtICAgTGVuZ3RoIG9mIHxidWZmZXJ8IGluIGJ5dGVzLiBJZiB8YnVmbGVufAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGxlc3MgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBzZWxlY3RlZCB0ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLCB8YnVmZmVyfCBpcyBub3QgbW9kaWZpZWQuCisgKiBSZXR1cm4gVmFsdWU6CisgKiAgICAgICAgICBMZW5ndGggaW4gYnl0ZXMgb2Ygc2VsZWN0ZWQgdGV4dCBpbiBmb3JtIHRleHQgZmllbGQgb3IgZm9ybSBjb21ib2JveAorICogICAgICAgICAgdGV4dCBmaWVsZC4KKyAqKi8KK0ZQREZfRVhQT1JUIHVuc2lnbmVkIGxvbmcgRlBERl9DQUxMQ09OVgorRk9STV9HZXRTZWxlY3RlZFRleHQoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmbGVuKTsKKworLyoqCisgKiBGdW5jdGlvbjogRk9STV9SZXBsYWNlU2VsZWN0aW9uCisgKiAgICAgICAgICBZb3UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiB0byByZXBsYWNlIHRoZSBzZWxlY3RlZCB0ZXh0IGluIGEgZm9ybQorICogICAgICAgICAgdGV4dCBmaWVsZCBvciB1c2VyLWVkaXRhYmxlIGZvcm0gY29tYm9ib3ggdGV4dCBmaWVsZCB3aXRoIGFub3RoZXIKKyAqICAgICAgICAgIHRleHQgc3RyaW5nICh3aGljaCBjYW4gYmUgZW1wdHkgb3Igbm9uLWVtcHR5KS4gSWYgdGhlcmUgaXMgbm8KKyAqICAgICAgICAgIHNlbGVjdGVkIHRleHQsIHRoaXMgZnVuY3Rpb24gd2lsbCBhcHBlbmQgdGhlIHJlcGxhY2VtZW50IHRleHQgYWZ0ZXIKKyAqICAgICAgICAgIHRoZSBjdXJyZW50IGNhcmV0IHBvc2l0aW9uLgorICogUGFyYW1ldGVyczoKKyAqICAgICAgICAgIGhIYW5kbGUgICAgIC0gICBIYW5kbGUgdG8gdGhlIGZvcm0gZmlsbCBtb2R1bGUuIFJldHVybmVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudC4KKyAqICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4KKyAqICAgICAgICAgIHdzVGV4dCAgICAgIC0gICBUaGUgdGV4dCB0byBiZSBpbnNlcnRlZCwgaW4gVVRGLTE2TEUgZm9ybWF0LgorICogUmV0dXJuIFZhbHVlOgorICogICAgICAgICAgTm9uZS4KKyAqKi8KK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGT1JNX1JlcGxhY2VTZWxlY3Rpb24oRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgd3NUZXh0KTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRk9STV9Gb3JjZVRvS2lsbEZvY3VzLgpAQCAtMTM2Niw5ICsxNDM4LDEyIEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBUUlVFIGluZGljYXRlcyBzdWNjZXNzOyBvdGhlcndpc2UgZmFsc2UuCiAgKiovCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRk9STV9Gb3JjZVRvS2lsbEZvY3VzKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKTsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCitGT1JNX0ZvcmNlVG9LaWxsRm9jdXMoRlBERl9GT1JNSEFORExFIGhIYW5kbGUpOwogCi0vLyBGaWVsZCBUeXBlcworLy8gRm9ybSBGaWVsZCBUeXBlcworLy8gVGhlIG5hbWVzIG9mIHRoZSBkZWZpbmVzIGFyZSBzdGFibGUsIGJ1dCB0aGUgc3BlY2lmaWMgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aAorLy8gdGhlbSBhcmUgbm90LCBzbyBkbyBub3QgaGFyZGNvZGUgdGhlaXIgdmFsdWVzLgogI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9VTktOT1dOIDAgICAgICAvLyBVbmtub3duLgogI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9QVVNIQlVUVE9OIDEgICAvLyBwdXNoIGJ1dHRvbiB0eXBlLgogI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9DSEVDS0JPWCAyICAgICAvLyBjaGVjayBib3ggdHlwZS4KQEAgLTEzNzYsOCArMTQ1MSwzMyBAQAogI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9DT01CT0JPWCA0ICAgICAvLyBjb21ibyBib3ggdHlwZS4KICNkZWZpbmUgRlBERl9GT1JNRklFTERfTElTVEJPWCA1ICAgICAgLy8gbGlzdCBib3ggdHlwZS4KICNkZWZpbmUgRlBERl9GT1JNRklFTERfVEVYVEZJRUxEIDYgICAgLy8gdGV4dCBmaWVsZCB0eXBlLgorI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9TSUdOQVRVUkUgNyAgICAvLyB0ZXh0IGZpZWxkIHR5cGUuCiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKLSNkZWZpbmUgRlBERl9GT1JNRklFTERfWEZBIDcgICAgICAgICAgLy8gdGV4dCBmaWVsZCB0eXBlLgorI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9YRkEgOCAgICAgICAgICAgICAgLy8gR2VuZXJpYyBYRkEgdHlwZS4KKyNkZWZpbmUgRlBERl9GT1JNRklFTERfWEZBX0NIRUNLQk9YIDkgICAgIC8vIFhGQSBjaGVjayBib3ggdHlwZS4KKyNkZWZpbmUgRlBERl9GT1JNRklFTERfWEZBX0NPTUJPQk9YIDEwICAgIC8vIFhGQSBjb21ibyBib3ggdHlwZS4KKyNkZWZpbmUgRlBERl9GT1JNRklFTERfWEZBX0lNQUdFRklFTEQgMTEgIC8vIFhGQSBpbWFnZSBmaWVsZCB0eXBlLgorI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9YRkFfTElTVEJPWCAxMiAgICAgLy8gWEZBIGxpc3QgYm94IHR5cGUuCisjZGVmaW5lIEZQREZfRk9STUZJRUxEX1hGQV9QVVNIQlVUVE9OIDEzICAvLyBYRkEgcHVzaCBidXR0b24gdHlwZS4KKyNkZWZpbmUgRlBERl9GT1JNRklFTERfWEZBX1NJR05BVFVSRSAxNCAgIC8vIFhGQSBzaWdudHVyZSBmaWVsZCB0eXBlLgorI2RlZmluZSBGUERGX0ZPUk1GSUVMRF9YRkFfVEVYVEZJRUxEIDE1ICAgLy8gWEZBIHRleHQgZmllbGQgdHlwZS4KKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBERl9FTkFCTEVfWEZBCisKKyNpZm5kZWYgUERGX0VOQUJMRV9YRkEKKyNkZWZpbmUgRlBERl9GT1JNRklFTERfQ09VTlQgOAorI2Vsc2UKKyNkZWZpbmUgRlBERl9GT1JNRklFTERfQ09VTlQgMTYKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKKworI2lmZGVmIFBERl9FTkFCTEVfWEZBCisjZGVmaW5lIElTX1hGQV9GT1JNRklFTEQodHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoKHR5cGUgPT0gRlBERl9GT1JNRklFTERfWEZBKSB8fCAodHlwZSA9PSBGUERGX0ZPUk1GSUVMRF9YRkFfQ0hFQ0tCT1gpIHx8IFwKKyAgICh0eXBlID09IEZQREZfRk9STUZJRUxEX1hGQV9DT01CT0JPWCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAodHlwZSA9PSBGUERGX0ZPUk1GSUVMRF9YRkFfSU1BR0VGSUVMRCkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKHR5cGUgPT0gRlBERl9GT1JNRklFTERfWEZBX0xJU1RCT1gpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICh0eXBlID09IEZQREZfRk9STUZJRUxEX1hGQV9QVVNIQlVUVE9OKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAodHlwZSA9PSBGUERGX0ZPUk1GSUVMRF9YRkFfU0lHTkFUVVJFKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgKHR5cGUgPT0gRlBERl9GT1JNRklFTERfWEZBX1RFWFRGSUVMRCkpCiAjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKIC8qKgpAQCAtMTM5MywxOSArMTQ5MywxMSBAQAogICogICAgIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgZm9ybSBmaWVsZDsgLTEgaW5kaWNhdGVzIG5vIGZpZWxkLgogICogICAgIFNlZSBmaWVsZCB0eXBlcyBhYm92ZS4KICAqKi8KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGUGFnZV9IYXNGb3JtRmllbGRBdFBvaW50KEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSk7Ci0KLS8qKgotICogRnVuY3Rpb246IEZQRFBhZ2VfSGFzRm9ybUZpZWxkQXRQb2ludAotICogICAgIERFUFJFQ0FURUQuIFBsZWFzZSB1c2UgRlBERlBhZ2VfSGFzRm9ybUZpZWxkQXRQb2ludC4KLSAqKi8KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERQYWdlX0hhc0Zvcm1GaWVsZEF0UG9pbnQoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV95KTsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WCitGUERGUGFnZV9IYXNGb3JtRmllbGRBdFBvaW50KEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSk7CiAKIC8qKgogICogRnVuY3Rpb246IEZQREZQYWdlX0Zvcm1GaWVsZFpPcmRlckF0UG9pbnQKQEAgLTE0MjAsMTAgKzE1MTIsMTEgQEAKICAqICAgICBSZXR1cm4gdGhlIHotb3JkZXIgb2YgdGhlIGZvcm0gZmllbGQ7IC0xIGluZGljYXRlcyBubyBmaWVsZC4KICAqICAgICBIaWdoZXIgbnVtYmVycyBhcmUgY2xvc2VyIHRvIHRoZSBmcm9udC4KICAqKi8KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGUGFnZV9Gb3JtRmllbGRaT3JkZXJBdFBvaW50KEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSk7CitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OVgorRlBERlBhZ2VfRm9ybUZpZWxkWk9yZGVyQXRQb2ludChGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYWdlX3kpOwogCiAvKioKICAqIEZ1bmN0aW9uOiBGUERGX1NldEZvcm1GaWVsZEhpZ2hsaWdodENvbG9yCkBAIC0xNDQxLDE1ICsxNTM0LDE2IEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBOT05FLgogICogQ29tbWVudHM6Ci0gKiAgICAgICAgICBXaGVuIHRoZSBwYXJhbWV0ZXIgZmllbGRUeXBlIGlzIHNldCB0byB6ZXJvLCB0aGUgaGlnaGxpZ2h0IGNvbG9yCi0gKndpbGwgYmUgYXBwbGllZCB0byBhbGwgdGhlIGZvcm0gZmllbGRzIGluIHRoZQorICogICAgICAgICAgV2hlbiB0aGUgcGFyYW1ldGVyIGZpZWxkVHlwZSBpcyBzZXQgdG8gRlBERl9GT1JNRklFTERfVU5LTk9XTiwgdGhlCisgKiAgICAgICAgICBoaWdobGlnaHQgY29sb3Igd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgZm9ybSBmaWVsZHMgaW4gdGhlCiAgKiAgICAgICAgICBkb2N1bWVudC4KICAqICAgICAgICAgIFBsZWFzZSByZWZyZXNoIHRoZSBjbGllbnQgd2luZG93IHRvIHNob3cgdGhlIGhpZ2hsaWdodCBpbW1lZGlhdGVseQotICppZiBuZWNlc3NhcnkuCisgKiAgICAgICAgICBpZiBuZWNlc3NhcnkuCiAgKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0Q29sb3IoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGNvbG9yKTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OVgorRlBERl9TZXRGb3JtRmllbGRIaWdobGlnaHRDb2xvcihGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBjb2xvcik7CiAKIC8qKgogICogRnVuY3Rpb246IEZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0QWxwaGEKQEAgLTE0NjUsOCArMTU1OSw4IEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBOT05FLgogICoqLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1NldEZvcm1GaWVsZEhpZ2hsaWdodEFscGhhKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYWxwaGEpOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WCitGUERGX1NldEZvcm1GaWVsZEhpZ2hsaWdodEFscGhhKEZQREZfRk9STUhBTkRMRSBoSGFuZGxlLCB1bnNpZ25lZCBjaGFyIGFscGhhKTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRlBERl9SZW1vdmVGb3JtRmllbGRIaWdobGlnaHQKQEAgLTE0ODAsNyArMTU3NCw4IEBACiAgKiAgICAgICAgICBQbGVhc2UgcmVmcmVzaCB0aGUgY2xpZW50IHdpbmRvdyB0byByZW1vdmUgdGhlIGhpZ2hsaWdodCBpbW1lZGlhdGVseQogICppZiBuZWNlc3NhcnkuCiAgKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfUmVtb3ZlRm9ybUZpZWxkSGlnaGxpZ2h0KEZQREZfRk9STUhBTkRMRSBoSGFuZGxlKTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OVgorRlBERl9SZW1vdmVGb3JtRmllbGRIaWdobGlnaHQoRlBERl9GT1JNSEFORExFIGhIYW5kbGUpOwogCiAvKioKICogRnVuY3Rpb246IEZQREZfRkZMRHJhdwpAQCAtMTUyMCw0NSArMTYxNSw0NCBAQAogKmNhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciByZW5kZXJpbmcgZnVuY3Rpb25zLCBzdWNoIGFzIEZQREZfUmVuZGVyUGFnZUJpdG1hcCBvcgogKkZQREZfUmVuZGVyUGFnZUJpdG1hcF9TdGFydCwgZmluaXNoIHJlbmRlcmluZyB0aGUgcGFnZSBjb250ZW50cy4KICoqLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0ZGTERyYXcoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JJVE1BUCBiaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZfRkZMRHJhdyhGUERGX0ZPUk1IQU5ETEUgaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CSVRNQVAgYml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpOwogCiAjaWZkZWYgX1NLSUFfU1VQUE9SVF8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9GRkxSZWNvcmQoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUkVDT1JERVIgcmVjb3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRlBERl9GRkxSZWNvcmQoRlBERl9GT1JNSEFORExFIGhIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9SRUNPUkRFUiByZWNvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpOwogI2VuZGlmCiAKLSNpZmRlZiBQREZfRU5BQkxFX1hGQQogLyoqCi0gKiBGdW5jdGlvbjogRlBERl9IYXNYRkFGaWVsZAotICogICAgICAgICAgICAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgZGVzaWduZWQgdG8gY2hlY2sgd2hldGhlciBhIHBkZiBkb2N1bWVudAotICpoYXMgWEZBIGZpZWxkcy4KKyAqIEV4cGVyaW1lbnRhbCBBUEkKKyAqIEZ1bmN0aW9uOiBGUERGX0dldEZvcm1UeXBlCisgKiAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSB0eXBlIG9mIGZvcm0gY29udGFpbmVkIGluIHRoZSBQREYgZG9jdW1lbnQuCiAgKiBQYXJhbWV0ZXJzOgogICogICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQgICAgICAgICAgICAgICAgLSAgICAgICBIYW5kbGUgdG8gZG9jdW1lbnQuCiAgKlJldHVybmVkIGJ5IEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgogICogICAgICAgICAgICAgICAgICAgICAgZG9jVHlwZSAgICAgICAgICAgICAgICAgLSAgICAgICBEb2N1bWVudCB0eXBlIGRlZmluZWQgYXMKLSAqRE9DVFlQRV94eHguCisgKkZPUk1UWVBFX3h4eC4KICAqIFJldHVybiBWYWx1ZToKLSAqICAgICAgICAgICAgICAgICAgICAgIFRSVUUgaW5kaWNhdGVzIHRoYXQgdGhlIGlucHV0IGRvY3VtZW50IGhhcyBYRkEgZmllbGRzLAotICpvdGhlcndpc2UgRkFMU0UuCisgKiAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyBvbmUgb2YgdGhlIEZPUk1UWVBFX3h4eAorICp2YWx1ZXMuCiAgKiovCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9IYXNYRkFGaWVsZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkb2NUeXBlKTsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZfR2V0Rm9ybVR5cGUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7CiAKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQogLyoqCiAgKiBGdW5jdGlvbjogRlBERl9Mb2FkWEZBCiAgKiAgICAgICAgICBJZiB0aGUgZG9jdW1lbnQgY29uc2lzdHMgb2YgWEZBIGZpZWxkcywgdGhlcmUgc2hvdWxkIGNhbGwgdGhpcwpAQCAtMTU2OSw3ICsxNjYzLDcgQEAKICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIFRSVUUgaW5kaWNhdGVzIHN1Y2Nlc3Msb3RoZXJ3aXNlIEZBTFNFLgogICoqLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZfTG9hZFhGQShGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZfTG9hZFhGQShGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRlBERl9XaWRnZXRfVW5kbwpAQCAtMTU4Miw4ICsxNjc2LDggQEAKICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIE5vbmUuCiAgKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfV2lkZ2V0X1VuZG8oRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREdFVCBoV2lkZ2V0KTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGX1dpZGdldF9VbmRvKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREdFVCBoV2lkZ2V0KTsKIC8qKgogICogRnVuY3Rpb246IEZQREZfV2lkZ2V0X1JlZG8KICAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSByZWRvIGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhCkBAIC0xNTk1LDggKzE2ODksOCBAQAogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTm9uZS4KICAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfUmVkbyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQpOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZfV2lkZ2V0X1JlZG8oRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQpOwogLyoqCiAgKiBGdW5jdGlvbjogRlBERl9XaWRnZXRfU2VsZWN0QWxsCiAgKiAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGltcGxlbWVudCB0aGUgc2VsZWN0IGFsbCBmZWF0dXJlIGZvciB0aGUgc3BlY2lmaWVkCkBAIC0xNjA4LDggKzE3MDIsOCBAQAogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTm9uZS4KICAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfU2VsZWN0QWxsKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREdFVCBoV2lkZ2V0KTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGX1dpZGdldF9TZWxlY3RBbGwoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCk7CiAvKioKICAqIEZ1bmN0aW9uOiBGUERGX1dpZGdldF9Db3B5CiAgKiAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGltcGxlbWVudCB0aGUgY29weSBmZWF0dXJlIGZvciB0aGUgc3BlY2lmaWVkIHhmYQpAQCAtMTYyNCwxMCArMTcxOCwxMCBAQAogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTm9uZS4KICAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfQ29weShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHdzVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEKiBzaXplKTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGX1dpZGdldF9Db3B5KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREdFVCBoV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHdzVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQqIHNpemUpOwogLyoqCiAgKiBGdW5jdGlvbjogRlBERl9XaWRnZXRfQ3V0CiAgKiAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGltcGxlbWVudCB0aGUgY3V0IGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQgeGZhCkBAIC0xNjQyLDEwICsxNzM2LDEwIEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBOb25lLgogICoqLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1dpZGdldF9DdXQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgd3NUZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCogc2l6ZSk7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRlBERl9XaWRnZXRfQ3V0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lERVNUUklORyB3c1RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQqIHNpemUpOwogLyoqCiAgKiBGdW5jdGlvbjogRlBERl9XaWRnZXRfUGFzdGUKICAqICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgaW1wbGVtZW50IHRoZSBwYXN0ZSBmZWF0dXJlIGZvciB0aGUgc3BlY2lmaWVkIHhmYQpAQCAtMTY1OSwxMCArMTc1MywxMCBAQAogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgTm9uZS4KICAqKi8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9XaWRnZXRfUGFzdGUoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURHRVQgaFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHdzVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBzaXplKTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGX1dpZGdldF9QYXN0ZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIHdzVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEIHNpemUpOwogLyoqCiAgKiBGdW5jdGlvbjogRlBERl9XaWRnZXRfUmVwbGFjZVNwZWxsQ2hlY2tXb3JkCiAgKiAgICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGltcGxlbWVudCB0aGUgc3BlbGwgY2hlY2sgZmVhdHVyZSBmb3IgdGhlIHNwZWNpZmllZApAQCAtMTY3OCw3ICsxNzcyLDcgQEAKICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIE5vbmUuCiAgKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMCitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYKIEZQREZfV2lkZ2V0X1JlcGxhY2VTcGVsbENoZWNrV29yZChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwKQEAgLTE2ODcsMTkgKzE3ODEsMjAgQEAKIC8qKgogICogRnVuY3Rpb246IEZQREZfV2lkZ2V0X0dldFNwZWxsQ2hlY2tXb3JkcwogICogICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBpbXBsZW1lbnQgdGhlIHNwZWxsIGNoZWNrIGZlYXR1cmUgZm9yIHRoZSBzcGVjaWZpZWQKLSAqeGZhIGZpZWxkLgorICogICAgICAgICAgeGZhIGZpZWxkLgogICogUGFyYW1ldGVyczoKLSAqICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50LiBSZXR1cm5lZCBieQotICpGUERGX0xvYWREb2N1bWVudCBmdW5jdGlvbi4KKyAqICAgICAgICAgIGRvY3VtZW50ICAgICAgICAtICAgSGFuZGxlIHRvIGRvY3VtZW50IGFzIHJldHVybmVkIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfTG9hZERvY3VtZW50IGZ1bmN0aW9uLgogICogICAgICAgICAgaFdpZGdldCAgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHhmYSBmaWVsZC4KICAqICAgICAgICAgIHggICAgICAgICAgICAgICAtICAgVGhlIHggdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwb2ludC4KICAqICAgICAgICAgIHkgICAgICAgICAgICAgICAtICAgVGhlIHkgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwb2ludC4KICAqICAgICAgICAgIHN0cmluZ0hhbmRsZSAgICAtICAgUG9pbnRlciB0byBGUERGX1NUUklOR0hBTkRMRSB0byByZWNlaXZlIHRoZQotICpzcGVjayBjaGVjayB0ZXh0IGJ1ZmZlciwgaW4gVVRGLTE2TEUgZm9ybWF0LgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjayBjaGVjayB0ZXh0IGJ1ZmZlciwgaW4gVVRGLTE2TEUgZm9ybWF0LgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsZXIgbXVzdCBmcmVlIHVzaW5nIEZQREZfU3RyaW5nSGFuZGxlUmVsZWFzZS4KICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIE5vbmUuCiAgKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMCitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYKIEZQREZfV2lkZ2V0X0dldFNwZWxsQ2hlY2tXb3JkcyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfV0lER0VUIGhXaWRnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwKQEAgLTE3MTMsNyArMTgwOCw4IEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBOb25lLgogICoqLwotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfU3RyaW5nSGFuZGxlQ291bnRzKEZQREZfU1RSSU5HSEFORExFIHN0cmluZ0hhbmRsZSk7CitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OVgorRlBERl9TdHJpbmdIYW5kbGVDb3VudHMoRlBERl9TVFJJTkdIQU5ETEUgc3RyaW5nSGFuZGxlKTsKIC8qKgogICogRnVuY3Rpb246IEZQREZfU3RyaW5nSGFuZGxlR2V0U3RyaW5nQnlJbmRleAogICogICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBnZXQgdGhlIHNwZWNpZmllZCBpbmRleCBvZiB0aGUgdGV4dCBidWZmZXIuCkBAIC0xNzI2LDcgKzE4MjIsNyBAQAogICogUmV0dXJuIFZhbHVlOgogICogICAgICAgICAgVFJVRSBpbmRpY2F0ZXMgc3VjY2Vzcywgb3RoZXJ3aXNlIEZBTFNFLgogICoqLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OVgogRlBERl9TdHJpbmdIYW5kbGVHZXRTdHJpbmdCeUluZGV4KEZQREZfU1RSSU5HSEFORExFIHN0cmluZ0hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIGJzVGV4dCwKQEAgLTE3MzksNyArMTgzNSw4IEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBOb25lLgogICoqLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1N0cmluZ0hhbmRsZVJlbGVhc2UoRlBERl9TVFJJTkdIQU5ETEUgc3RyaW5nSGFuZGxlKTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OVgorRlBERl9TdHJpbmdIYW5kbGVSZWxlYXNlKEZQREZfU1RSSU5HSEFORExFIHN0cmluZ0hhbmRsZSk7CiAvKioKICAqIEZ1bmN0aW9uOiBGUERGX1N0cmluZ0hhbmRsZUFkZFN0cmluZwogICogICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBhZGQgdGhlIHNwZWNpZmllZCB0ZXh0IGJ1ZmZlci4KQEAgLTE3NTEsNyArMTg0OCw3IEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBUUlVFIGluZGljYXRlcyBzdWNjZXNzLCBvdGhlcndpc2UgRkFMU0UuCiAgKiovCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCiBGUERGX1N0cmluZ0hhbmRsZUFkZFN0cmluZyhGUERGX1NUUklOR0hBTkRMRSBzdHJpbmdIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgYnNUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBzaXplKTsKZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX3Bwby5oIGIvcHVibGljL2ZwZGZfcHBvLmgKaW5kZXggZDljODMwMC4uODhjMzE2MiAxMDA2NDQKLS0tIGEvcHVibGljL2ZwZGZfcHBvLmgKKysrIGIvcHVibGljL2ZwZGZfcHBvLmgKQEAgLTIzLDEwICsyMywxMCBAQAogLy8gICBpbmRleCAgICAgLSBUaGUgcGFnZSBpbmRleCB0byBpbnNlcnQgYXQuCiAvLwogLy8gUmV0dXJucyBUUlVFIG9uIHN1Y2Nlc3MuCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9JbXBvcnRQYWdlcyhGUERGX0RPQ1VNRU5UIGRlc3RfZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9ET0NVTUVOVCBzcmNfZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIHBhZ2VyYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCk7CitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGX0ltcG9ydFBhZ2VzKEZQREZfRE9DVU1FTlQgZGVzdF9kb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRE9DVU1FTlQgc3JjX2RvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIHBhZ2VyYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KTsKIAogLy8gQ29weSB0aGUgdmlld2VyIHByZWZlcmVuY2VzIGZyb20gfHNyY19kb2N8IGludG8gfGRlc3RfZG9jfC4KIC8vCkBAIC0zNCw4ICszNCw4IEBACiAvLyAgIHNyY19kb2MgIC0gRG9jdW1lbnQgdG8gcmVhZCB0aGUgdmlld2VyIHByZWZlcmVuY2VzIGZyb20uCiAvLwogLy8gUmV0dXJucyBUUlVFIG9uIHN1Y2Nlc3MuCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERl9Db3B5Vmlld2VyUHJlZmVyZW5jZXMoRlBERl9ET0NVTUVOVCBkZXN0X2RvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RPQ1VNRU5UIHNyY19kb2MpOworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZfQ29weVZpZXdlclByZWZlcmVuY2VzKEZQREZfRE9DVU1FTlQgZGVzdF9kb2MsIEZQREZfRE9DVU1FTlQgc3JjX2RvYyk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfSAgLy8gZXh0ZXJuICJDIgpkaWZmIC0tZ2l0IGEvcHVibGljL2ZwZGZfcHJvZ3Jlc3NpdmUuaCBiL3B1YmxpYy9mcGRmX3Byb2dyZXNzaXZlLmgKaW5kZXggMGMzZDUwMS4uM2YwYWUyOSAxMDA2NDQKLS0tIGEvcHVibGljL2ZwZGZfcHJvZ3Jlc3NpdmUuaAorKysgYi9wdWJsaWMvZnBkZl9wcm9ncmVzc2l2ZS5oCkBAIC0xMSw4ICsxMSwxMCBAQAogI2luY2x1ZGUgImZwZGZ2aWV3LmgiCiAKIC8vIEZsYWdzIGZvciBwcm9ncmVzc2l2ZSBwcm9jZXNzIHN0YXR1cy4KLSNkZWZpbmUgRlBERl9SRU5ERVJfUkVBREVSIDAKLSNkZWZpbmUgRlBERl9SRU5ERVJfVE9CRUNPVU5USU5VRUQgMQorI2RlZmluZSBGUERGX1JFTkRFUl9SRUFEWSAwCisjZGVmaW5lIEZQREZfUkVOREVSX1JFQURFUiAwICAvLyBEZXByZWNhdGVkCisjZGVmaW5lIEZQREZfUkVOREVSX1RPQkVDT05USU5VRUQgMQorI2RlZmluZSBGUERGX1JFTkRFUl9UT0JFQ09VTlRJTlVFRCAxICAvLyBEZXByZWNhdGVkLgogI2RlZmluZSBGUERGX1JFTkRFUl9ET05FIDIKICNkZWZpbmUgRlBERl9SRU5ERVJfRkFJTEVEIDMKIApAQCAtNzcsMTUgKzc5LDE1IEBACiAvLyAgICAgICAgICBSZW5kZXJpbmcgU3RhdHVzLiBTZWUgZmxhZ3MgZm9yIHByb2dyZXNzaXZlIHByb2Nlc3Mgc3RhdHVzIGZvciB0aGUKIC8vICAgICAgICAgIGRldGFpbHMuCiAvLwotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZUJpdG1hcF9TdGFydChGUERGX0JJVE1BUCBiaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZTREtfUEFVU0UqIHBhdXNlKTsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZfUmVuZGVyUGFnZUJpdG1hcF9TdGFydChGUERGX0JJVE1BUCBiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGU0RLX1BBVVNFKiBwYXVzZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX1JlbmRlclBhZ2VfQ29udGludWUKIC8vICAgICAgICAgIENvbnRpbnVlIHJlbmRlcmluZyBhIFBERiBwYWdlLgpAQCAtOTksOCArMTAxLDggQEAKIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSByZW5kZXJpbmcgc3RhdHVzLiBTZWUgZmxhZ3MgZm9yIHByb2dyZXNzaXZlIHByb2Nlc3Mgc3RhdHVzIGZvcgogLy8gICAgICAgICAgdGhlIGRldGFpbHMuCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERl9SZW5kZXJQYWdlX0NvbnRpbnVlKEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlNES19QQVVTRSogcGF1c2UpOworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERl9SZW5kZXJQYWdlX0NvbnRpbnVlKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGU0RLX1BBVVNFKiBwYXVzZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX1JlbmRlclBhZ2VfQ2xvc2UKIC8vICAgICAgICAgIFJlbGVhc2UgdGhlIHJlc291cmNlIGFsbG9jYXRlIGR1cmluZyBwYWdlIHJlbmRlcmluZy4gTmVlZCB0byBiZQpAQCAtMTExLDcgKzExMyw3IEBACiAvLyAgICAgICAgICBmdW5jdGlvbi4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5VTEwKLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9SZW5kZXJQYWdlX0Nsb3NlKEZQREZfUEFHRSBwYWdlKTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGX1JlbmRlclBhZ2VfQ2xvc2UoRlBERl9QQUdFIHBhZ2UpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX3NhdmUuaCBiL3B1YmxpYy9mcGRmX3NhdmUuaAppbmRleCBjMzRlMmJjLi42ZmZjYTUyIDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl9zYXZlLmgKKysrIGIvcHVibGljL2ZwZGZfc2F2ZS5oCkBAIC01OSw5ICs1OSw5IEBACiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUUlVFIGZvciBzdWNjZWVkLCBGQUxTRSBmb3IgZmFpbGVkLgogLy8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX1NhdmVBc0NvcHkoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GSUxFV1JJVEUqIHBGaWxlV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgZmxhZ3MpOworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRlBERl9TYXZlQXNDb3B5KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GSUxFV1JJVEUqIHBGaWxlV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9EV09SRCBmbGFncyk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX1NhdmVXaXRoVmVyc2lvbgogLy8gICAgICAgICAgU2FtZSBhcyBmdW5jdGlvbiA6OkZQREZfU2F2ZUFzQ29weSwgZXhjZXB0IHRoZSBmaWxlIHZlcnNpb24gb2YgdGhlCkBAIC03NSwxMCArNzUsMTEgQEAKIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRSVUUgaWYgc3VjY2VlZCwgRkFMU0UgaWYgZmFpbGVkLgogLy8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX1NhdmVXaXRoVmVyc2lvbihGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRklMRVdSSVRFKiBwRmlsZVdyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGVWZXJzaW9uKTsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCitGUERGX1NhdmVXaXRoVmVyc2lvbihGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgRlBERl9GSUxFV1JJVEUqIHBGaWxlV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICBGUERGX0RXT1JEIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgaW50IGZpbGVWZXJzaW9uKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9wdWJsaWMvZnBkZl9zZWFyY2hleC5oIGIvcHVibGljL2ZwZGZfc2VhcmNoZXguaAppbmRleCA3YzFiMzE4Li4yMDdjMTA0IDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl9zZWFyY2hleC5oCisrKyBiL3B1YmxpYy9mcGRmX3NlYXJjaGV4LmgKQEAgLTIwLDkgKzIwLDE4IEBACiAvLyAgIG5UZXh0SW5kZXggLSBpbmRleCBvZiB0aGUgdGV4dCByZXR1cm5lZCBmcm9tIHxGUERGVGV4dF9HZXRUZXh0fC4KIC8vCiAvLyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIGluIGludGVybmFsIGNoYXJhY3RlciBsaXN0LiAtMSBmb3IgZXJyb3IuCi1ETExFWFBPUlQgaW50IFNURENBTEwKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WCiBGUERGVGV4dF9HZXRDaGFySW5kZXhGcm9tVGV4dEluZGV4KEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLCBpbnQgblRleHRJbmRleCk7CiAKKy8vIEdldCB0aGUgdGV4dCBpbmRleCBpbiB8dGV4dF9wYWdlfCBpbnRlcm5hbCBjaGFyYWN0ZXIgbGlzdC4KKy8vCisvLyAgIHRleHRfcGFnZSAgLSBhIHRleHQgcGFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisvLyAgIG5DaGFySW5kZXggLSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIGluIGludGVybmFsIGNoYXJhY3RlciBsaXN0LgorLy8KKy8vIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSB0ZXh0IHJldHVybmVkIGZyb20gfEZQREZUZXh0X0dldFRleHR8LiAtMSBmb3IgZXJyb3IuCitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OVgorRlBERlRleHRfR2V0VGV4dEluZGV4RnJvbUNoYXJJbmRleChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwgaW50IG5DaGFySW5kZXgpOworCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0gIC8vIGV4dGVybiAiQyIKICNlbmRpZiAgLy8gX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX3N0cnVjdHRyZWUuaCBiL3B1YmxpYy9mcGRmX3N0cnVjdHRyZWUuaAppbmRleCAzZDRkYTQwLi4yZTg2YWU2IDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl9zdHJ1Y3R0cmVlLmgKKysrIGIvcHVibGljL2ZwZGZfc3RydWN0dHJlZS5oCkBAIC0yMSw3ICsyMSw4IEBACiAvLyAgICAgICAgICBmdW5jdGlvbi4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIEEgaGFuZGxlIHRvIHRoZSBzdHJ1Y3R1cmUgdHJlZSBvciBOVUxMIG9uIGVycm9yLgotRExMRVhQT1JUIEZQREZfU1RSVUNUVFJFRSBTVERDQUxMIEZQREZfU3RydWN0VHJlZV9HZXRGb3JQYWdlKEZQREZfUEFHRSBwYWdlKTsKK0ZQREZfRVhQT1JUIEZQREZfU1RSVUNUVFJFRSBGUERGX0NBTExDT05WCitGUERGX1N0cnVjdFRyZWVfR2V0Rm9yUGFnZShGUERGX1BBR0UgcGFnZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX1N0cnVjdFRyZWVfQ2xvc2UKIC8vICAgICAgICAgIFJlbGVhc2UgdGhlIHJlc291cmNlIGFsbG9jYXRlIGJ5IEZQREZfU3RydWN0VHJlZV9HZXRGb3JQYWdlLgpAQCAtMzAsNyArMzEsOCBAQAogLy8gICAgICAgICAgRlBERl9TdHJ1Y3RUcmVlX0xvYWRQYWdlIGZ1bmN0aW9uLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTlVMTAotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1N0cnVjdFRyZWVfQ2xvc2UoRlBERl9TVFJVQ1RUUkVFIHN0cnVjdF90cmVlKTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OVgorRlBERl9TdHJ1Y3RUcmVlX0Nsb3NlKEZQREZfU1RSVUNUVFJFRSBzdHJ1Y3RfdHJlZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX1N0cnVjdFRyZWVfQ291bnRDaGlsZHJlbgogLy8gICAgICAgICAgQ291bnQgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBmb3IgdGhlIHN0cnVjdHVyZSB0cmVlLgpAQCAtMzksNyArNDEsNyBAQAogLy8gICAgICAgICAgRlBERl9TdHJ1Y3RUcmVlX0xvYWRQYWdlIGZ1bmN0aW9uLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVGhlIG51bWJlciBvZiBjaGlsZHJlbiwgb3IgLTEgb24gZXJyb3IuCi1ETExFWFBPUlQgaW50IFNURENBTEwKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WCiBGUERGX1N0cnVjdFRyZWVfQ291bnRDaGlsZHJlbihGUERGX1NUUlVDVFRSRUUgc3RydWN0X3RyZWUpOwogCiAvLyBGdW5jdGlvbjogRlBERl9TdHJ1Y3RUcmVlX0dldENoaWxkQXRJbmRleApAQCAtNTAsNyArNTIsNyBAQAogLy8gICAgICAgICAgaW5kZXggICAgICAgLSAgIFRoZSBpbmRleCBmb3IgdGhlIGNoaWxkLCAwLWJhc2VkLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVGhlIGNoaWxkIGF0IHRoZSBuLXRoIGluZGV4IG9yIE5VTEwgb24gZXJyb3IuCi1ETExFWFBPUlQgRlBERl9TVFJVQ1RFTEVNRU5UIFNURENBTEwKK0ZQREZfRVhQT1JUIEZQREZfU1RSVUNURUxFTUVOVCBGUERGX0NBTExDT05WCiBGUERGX1N0cnVjdFRyZWVfR2V0Q2hpbGRBdEluZGV4KEZQREZfU1RSVUNUVFJFRSBzdHJ1Y3RfdHJlZSwgaW50IGluZGV4KTsKIAogLy8gRnVuY3Rpb246IEZQREZfU3RydWN0RWxlbWVudF9HZXRBbHRUZXh0CkBAIC02OCwxOCArNzAsNjggQEAKIC8vICAgICAgICAgIGVuY29kaW5nLiBUaGUgc3RyaW5nIGlzIHRlcm1pbmF0ZWQgYnkgYSBVVEYxNiBOVUwgY2hhcmFjdGVyLiBJZgogLy8gICAgICAgICAgfGJ1ZmxlbnwgaXMgbGVzcyB0aGFuIHRoZSByZXF1aXJlZCBsZW5ndGgsIG9yIHxidWZmZXJ8IGlzIE5VTEwsCiAvLyAgICAgICAgICB8YnVmZmVyfCB3aWxsIG5vdCBiZSBtb2RpZmllZC4KLURMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwKK0ZQREZfRVhQT1JUIHVuc2lnbmVkIGxvbmcgRlBERl9DQUxMQ09OVgogRlBERl9TdHJ1Y3RFbGVtZW50X0dldEFsdFRleHQoRlBERl9TVFJVQ1RFTEVNRU5UIHN0cnVjdF9lbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZsZW4pOwogCisvLyBGdW5jdGlvbjogRlBERl9TdHJ1Y3RFbGVtZW50X0dldE1hcmtlZENvbnRlbnRJRAorLy8gICAgICAgICAgR2V0IHRoZSBtYXJrZWQgY29udGVudCBJRCBmb3IgYSBnaXZlbiBlbGVtZW50LgorLy8gUGFyYW1ldGVyczoKKy8vICAgICAgICAgIHN0cnVjdF9lbGVtZW50IC0gICBIYW5kbGUgdG8gdGhlIHN0cnVjdCBlbGVtZW50LgorLy8gUmV0dXJuIHZhbHVlOgorLy8gICAgICAgICAgVGhlIG1hcmtlZCBjb250ZW50IElEIG9mIHRoZSBlbGVtZW50LiBJZiBubyBJRCBleGlzdHMsIHJldHVybnMKKy8vICAgICAgICAgIC0xLgorRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYKK0ZQREZfU3RydWN0RWxlbWVudF9HZXRNYXJrZWRDb250ZW50SUQoRlBERl9TVFJVQ1RFTEVNRU5UIHN0cnVjdF9lbGVtZW50KTsKKworLy8gRnVuY3Rpb246IEZQREZfU3RydWN0RWxlbWVudF9HZXRUeXBlCisvLyAgICAgICAgICAgR2V0IHRoZSB0eXBlICgvUykgZm9yIGEgZ2l2ZW4gZWxlbWVudC4KKy8vIFBhcmFtZXRlcnM6CisvLyAgICAgICAgICAgc3RydWN0X2VsZW1lbnQgLSBIYW5kbGUgdG8gdGhlIHN0cnVjdCBlbGVtZW50LgorLy8gICAgICAgICAgIGJ1ZmZlciAgICAgICAgLSBBIGJ1ZmZlciBmb3Igb3V0cHV0LiBNYXkgYmUgTlVMTC4KKy8vICAgICAgICAgICBidWZsZW4gICAgICAgIC0gVGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyLCBpbiBieXRlcy4gTWF5IGJlIDAuCisvLyBSZXR1cm4gdmFsdWU6CisvLyAgICAgICAgICAgVGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgdHlwZSwgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBOVUwKKy8vICAgICAgICAgICBjaGFyYWN0ZXIuIFRoZSBudW1iZXIgb2YgYnl0ZXMgaXMgcmV0dXJuZWQgcmVnYXJkbGVzcyBvZiB0aGUKKy8vICAgICAgICAgICB8YnVmZmVyfCBhbmQgfGJ1ZmxlbnwgcGFyYW1ldGVycy4KKy8vIENvbW1lbnRzOgorLy8gICAgICAgICAgIFJlZ2FyZGxlc3Mgb2YgdGhlIHBsYXRmb3JtLCB0aGUgfGJ1ZmZlcnwgaXMgYWx3YXlzIGluIFVURi0xNkxFCisvLyAgICAgICAgICAgZW5jb2RpbmcuIFRoZSBzdHJpbmcgaXMgdGVybWluYXRlZCBieSBhIFVURjE2IE5VTCBjaGFyYWN0ZXIuIElmCisvLyAgICAgICAgICAgfGJ1ZmxlbnwgaXMgbGVzcyB0aGFuIHRoZSByZXF1aXJlZCBsZW5ndGgsIG9yIHxidWZmZXJ8IGlzIE5VTEwsCisvLyAgICAgICAgICAgfGJ1ZmZlcnwgd2lsbCBub3QgYmUgbW9kaWZpZWQuCitGUERGX0VYUE9SVCB1bnNpZ25lZCBsb25nIEZQREZfQ0FMTENPTlYKK0ZQREZfU3RydWN0RWxlbWVudF9HZXRUeXBlKEZQREZfU1RSVUNURUxFTUVOVCBzdHJ1Y3RfZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmbGVuKTsKKworLy8gRnVuY3Rpb246IEZQREZfU3RydWN0RWxlbWVudF9HZXRUaXRsZQorLy8gICAgICAgICAgIEdldCB0aGUgdGl0bGUgKC9UKSBmb3IgYSBnaXZlbiBlbGVtZW50LgorLy8gUGFyYW1ldGVyczoKKy8vICAgICAgICAgICBzdHJ1Y3RfZWxlbWVudCAtIEhhbmRsZSB0byB0aGUgc3RydWN0IGVsZW1lbnQuCisvLyAgICAgICAgICAgYnVmZmVyICAgICAgICAgLSBBIGJ1ZmZlciBmb3Igb3V0cHV0LiBNYXkgYmUgTlVMTC4KKy8vICAgICAgICAgICBidWZsZW4gICAgICAgICAtIFRoZSBsZW5ndGggb2YgdGhlIGJ1ZmZlciwgaW4gYnl0ZXMuIE1heSBiZSAwLgorLy8gUmV0dXJuIHZhbHVlOgorLy8gICAgICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHRpdGxlLCBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIE5VTAorLy8gICAgICAgICAgIGNoYXJhY3Rlci4gVGhlIG51bWJlciBvZiBieXRlcyBpcyByZXR1cm5lZCByZWdhcmRsZXNzIG9mIHRoZQorLy8gICAgICAgICAgIHxidWZmZXJ8IGFuZCB8YnVmbGVufCBwYXJhbWV0ZXJzLgorLy8gQ29tbWVudHM6CisvLyAgICAgICAgICAgUmVnYXJkbGVzcyBvZiB0aGUgcGxhdGZvcm0sIHRoZSB8YnVmZmVyfCBpcyBhbHdheXMgaW4gVVRGLTE2TEUKKy8vICAgICAgICAgICBlbmNvZGluZy4gVGhlIHN0cmluZyBpcyB0ZXJtaW5hdGVkIGJ5IGEgVVRGMTYgTlVMIGNoYXJhY3Rlci4gSWYKKy8vICAgICAgICAgICB8YnVmbGVufCBpcyBsZXNzIHRoYW4gdGhlIHJlcXVpcmVkIGxlbmd0aCwgb3IgfGJ1ZmZlcnwgaXMgTlVMTCwKKy8vICAgICAgICAgICB8YnVmZmVyfCB3aWxsIG5vdCBiZSBtb2RpZmllZC4KK0ZQREZfRVhQT1JUIHVuc2lnbmVkIGxvbmcgRlBERl9DQUxMQ09OVgorRlBERl9TdHJ1Y3RFbGVtZW50X0dldFRpdGxlKEZQREZfU1RSVUNURUxFTUVOVCBzdHJ1Y3RfZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBidWZsZW4pOworCiAvLyBGdW5jdGlvbjogRlBERl9TdHJ1Y3RFbGVtZW50X0NvdW50Q2hpbGRyZW4KIC8vICAgICAgICAgIENvdW50IHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gZm9yIHRoZSBzdHJ1Y3R1cmUgZWxlbWVudC4KIC8vIFBhcmFtZXRlcnM6CiAvLyAgICAgICAgICBzdHJ1Y3RfZWxlbWVudCAtICAgSGFuZGxlIHRvIHRoZSBzdHJ1Y3QgZWxlbWVudC4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSBudW1iZXIgb2YgY2hpbGRyZW4sIG9yIC0xIG9uIGVycm9yLgotRExMRVhQT1JUIGludCBTVERDQUxMCitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OVgogRlBERl9TdHJ1Y3RFbGVtZW50X0NvdW50Q2hpbGRyZW4oRlBERl9TVFJVQ1RFTEVNRU5UIHN0cnVjdF9lbGVtZW50KTsKIAogLy8gRnVuY3Rpb246IEZQREZfU3RydWN0RWxlbWVudF9HZXRDaGlsZEF0SW5kZXgKQEAgLTkyLDEyICsxNDQsMTIgQEAKIC8vIENvbW1lbnRzOgogLy8gICAgICAgICAgSWYgdGhlIGNoaWxkIGV4aXN0cyBidXQgaXMgbm90IGFuIGVsZW1lbnQsIHRoZW4gdGhpcyBmdW5jdGlvbiB3aWxsCiAvLyAgICAgICAgICByZXR1cm4gTlVMTC4gVGhpcyB3aWxsIGFsc28gcmV0dXJuIE5VTEwgZm9yIG91dCBvZiBib3VuZHMgaW5kaWNlcy4KLURMTEVYUE9SVCBGUERGX1NUUlVDVEVMRU1FTlQgU1REQ0FMTAorRlBERl9FWFBPUlQgRlBERl9TVFJVQ1RFTEVNRU5UIEZQREZfQ0FMTENPTlYKIEZQREZfU3RydWN0RWxlbWVudF9HZXRDaGlsZEF0SW5kZXgoRlBERl9TVFJVQ1RFTEVNRU5UIHN0cnVjdF9lbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKLX0KK30gIC8vIGV4dGVybiAiQyIKICNlbmRpZgogCiAjZW5kaWYgIC8vIFBVQkxJQ19GUERGX1NUUlVDVFRSRUVfSF8KZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX3N5c2ZvbnRpbmZvLmggYi9wdWJsaWMvZnBkZl9zeXNmb250aW5mby5oCmluZGV4IGEwZWRmZmYuLjQ5MzAyYzggMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmX3N5c2ZvbnRpbmZvLmgKKysrIGIvcHVibGljL2ZwZGZfc3lzZm9udGluZm8uaApAQCAtMjAsNyArMjAsNyBAQAogI2RlZmluZSBGWEZPTlRfQ0hJTkVTRUJJRzVfQ0hBUlNFVCAxMzYKIAogLyogRm9udCBwaXRjaCBhbmQgZmFtaWx5IGZsYWdzICovCi0jZGVmaW5lIEZYRk9OVF9GRl9GSVhFRFBJVENIIDEKKyNkZWZpbmUgRlhGT05UX0ZGX0ZJWEVEUElUQ0ggKDEgPDwgMCkKICNkZWZpbmUgRlhGT05UX0ZGX1JPTUFOICgxIDw8IDQpCiAjZGVmaW5lIEZYRk9OVF9GRl9TQ1JJUFQgKDQgPDwgNCkKIApAQCAtMTA2LDEwICsxMDYsNyBAQAogICAgKmNvbnN0YW50cy4KICAgICogICAgICAgICAgZmFjZSAgICAgICAgLSAgIFR5cGVmYWNlIG5hbWUuIEN1cnJlbnRseSB1c2Ugc3lzdGVtIGxvY2FsIGVuY29kaW5nCiAgICAqb25seS4KLSAgICogICAgICAgICAgYkV4YWN0ICAgICAgLSAgIFBvaW50ZXIgdG8gYSBib29sZWFuIHZhbHVlIHJlY2VpdmluZyB0aGUgaW5kaWNhdG9yCi0gICAqd2hldGhlciBtYXBwZXIgZm91bmQgdGhlIGV4YWN0IG1hdGNoLgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgbWFwcGVyIGlzIG5vdCBzdXJlIHdoZXRoZXIgaXQncyBleGFjdCBtYXRjaCwKLSAgICppZ25vcmUgdGhpcyBwYXJhbXRlci4KKyAgICogICAgICAgICAgYkV4YWN0ICAgICAgLSAgIE9ic29sZXRlOiB0aGlzIHBhcmFtZXRlciBpcyBub3cgaWdub3JlZC4KICAgICogUmV0dXJuIFZhbHVlOgogICAgKiAgICAgICAgICBBbiBvcGFxdWUgcG9pbnRlciBmb3IgZm9udCBoYW5kbGUsIG9yIE5VTEwgaWYgc3lzdGVtIG1hcHBpbmcgaXMKICAgICpub3Qgc3VwcG9ydGVkLgpAQCAtMjQ0LDcgKzI0MSw3IEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgUG9pbnRlciB0byB0aGUgQ2hhcnNldCBGb250IE1hcC4KICAqKi8KLURMTEVYUE9SVCBjb25zdCBGUERGX0NoYXJzZXRGb250TWFwKiBTVERDQUxMIEZQREZfR2V0RGVmYXVsdFRURk1hcCgpOworRlBERl9FWFBPUlQgY29uc3QgRlBERl9DaGFyc2V0Rm9udE1hcCogRlBERl9DQUxMQ09OViBGUERGX0dldERlZmF1bHRUVEZNYXAoKTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRlBERl9BZGRJbnN0YWxsZWRGb250CkBAIC0yNTksOSArMjU2LDkgQEAKICAqIFJldHVybiBWYWx1ZToKICAqICAgICAgICAgIE5vbmUuCiAgKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfQWRkSW5zdGFsbGVkRm9udCh2b2lkKiBtYXBwZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYXJzZXQpOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZfQWRkSW5zdGFsbGVkRm9udCh2b2lkKiBtYXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFyc2V0KTsKIAogLyoqCiAgKiBGdW5jdGlvbjogRlBERl9TZXRTeXN0ZW1Gb250SW5mbwpAQCAtMjc1LDcgKzI3Miw4IEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBOb25lCiAgKiovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfU2V0U3lzdGVtRm9udEluZm8oRlBERl9TWVNGT05USU5GTyogcEZvbnRJbmZvKTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OVgorRlBERl9TZXRTeXN0ZW1Gb250SW5mbyhGUERGX1NZU0ZPTlRJTkZPKiBwRm9udEluZm8pOwogCiAvKioKICAqIEZ1bmN0aW9uOiBGUERGX0dldERlZmF1bHRTeXN0ZW1Gb250SW5mbwpAQCAtMjk0LDcgKzI5Miw3IEBACiAgKiAgICAgICAgICBBcHBsaWNhdGlvbiBzaG91bGQgY2FsbCBGUERGX0ZyZWVEZWZhdWx0U3lzdGVtRm9udEluZm8gdG8gZnJlZSB0aGUKICAqcmV0dXJuZWQgcG9pbnRlci4KICAqKi8KLURMTEVYUE9SVCBGUERGX1NZU0ZPTlRJTkZPKiBTVERDQUxMIEZQREZfR2V0RGVmYXVsdFN5c3RlbUZvbnRJbmZvKCk7CitGUERGX0VYUE9SVCBGUERGX1NZU0ZPTlRJTkZPKiBGUERGX0NBTExDT05WIEZQREZfR2V0RGVmYXVsdFN5c3RlbUZvbnRJbmZvKCk7CiAKIC8qKgogICogRnVuY3Rpb246IEZQREZfRnJlZURlZmF1bHRTeXN0ZW1Gb250SW5mbwpAQCAtMzA3LDcgKzMwNSw4IEBACiAgKiBSZXR1cm4gVmFsdWU6CiAgKiAgICAgICAgICBOb25lCiAgKiovCi1ETExFWFBPUlQgdm9pZCBGUERGX0ZyZWVEZWZhdWx0U3lzdGVtRm9udEluZm8oRlBERl9TWVNGT05USU5GTyogcEZvbnRJbmZvKTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OVgorRlBERl9GcmVlRGVmYXVsdFN5c3RlbUZvbnRJbmZvKEZQREZfU1lTRk9OVElORk8qIHBGb250SW5mbyk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvcHVibGljL2ZwZGZfdGV4dC5oIGIvcHVibGljL2ZwZGZfdGV4dC5oCmluZGV4IDVjMjQxNTIuLjA0M2RjMTYgMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmX3RleHQuaAorKysgYi9wdWJsaWMvZnBkZl90ZXh0LmgKQEAgLTI3LDcgKzI3LDcgQEAKIC8vICAgICAgICAgIEFwcGxpY2F0aW9uIG11c3QgY2FsbCBGUERGVGV4dF9DbG9zZVBhZ2UgdG8gcmVsZWFzZSB0aGUgdGV4dCBwYWdlCiAvLyAgICAgICAgICBpbmZvcm1hdGlvbi4KIC8vCi1ETExFWFBPUlQgRlBERl9URVhUUEFHRSBTVERDQUxMIEZQREZUZXh0X0xvYWRQYWdlKEZQREZfUEFHRSBwYWdlKTsKK0ZQREZfRVhQT1JUIEZQREZfVEVYVFBBR0UgRlBERl9DQUxMQ09OViBGUERGVGV4dF9Mb2FkUGFnZShGUERGX1BBR0UgcGFnZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9DbG9zZVBhZ2UKIC8vICAgICAgICAgIFJlbGVhc2UgYWxsIHJlc291cmNlcyBhbGxvY2F0ZWQgZm9yIGEgdGV4dCBwYWdlIGluZm9ybWF0aW9uCkBAIC0zOCw3ICszOCw3IEBACiAvLyBSZXR1cm4gVmFsdWU6CiAvLyAgICAgICAgICBOb25lLgogLy8KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERlRleHRfQ2xvc2VQYWdlKEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlKTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGVGV4dF9DbG9zZVBhZ2UoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UpOwogCiAvLyBGdW5jdGlvbjogRlBERlRleHRfQ291bnRDaGFycwogLy8gICAgICAgICAgR2V0IG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGEgcGFnZS4KQEAgLTU2LDcgKzU2LDcgQEAKIC8vICAgICAgICAgIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgcGFnZQogLy8gICAgICAgICAgaGFzIGFuIGluZGV4IHZhbHVlIG9mIHplcm8uCiAvLwotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZUZXh0X0NvdW50Q2hhcnMoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UpOworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERlRleHRfQ291bnRDaGFycyhGUERGX1RFWFRQQUdFIHRleHRfcGFnZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9HZXRVbmljb2RlCiAvLyAgICAgICAgICBHZXQgVW5pY29kZSBvZiBhIGNoYXJhY3RlciBpbiBhIHBhZ2UuCkBAIC03MCw4ICs3MCw4IEBACiAvLyAgICAgICAgICBjb252ZXJ0IHRvIFVuaWNvZGUsCiAvLyAgICAgICAgICB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgemVyby4KIC8vCi1ETExFWFBPUlQgdW5zaWduZWQgaW50IFNURENBTEwgRlBERlRleHRfR2V0VW5pY29kZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCk7CitGUERGX0VYUE9SVCB1bnNpZ25lZCBpbnQgRlBERl9DQUxMQ09OVgorRlBERlRleHRfR2V0VW5pY29kZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwgaW50IGluZGV4KTsKIAogLy8gRnVuY3Rpb246IEZQREZUZXh0X0dldEZvbnRTaXplCiAvLyAgICAgICAgICBHZXQgdGhlIGZvbnQgc2l6ZSBvZiBhIHBhcnRpY3VsYXIgY2hhcmFjdGVyLgpAQCAtODQsOCArODQsOCBAQAogLy8gICAgICAgICAgMS83MiBpbmNoKS4KIC8vICAgICAgICAgIFRoaXMgaXMgdGhlIHR5cG9ncmFwaGljIHNpemUgb2YgdGhlIGZvbnQgKHNvIGNhbGxlZCAiZW0gc2l6ZSIpLgogLy8KLURMTEVYUE9SVCBkb3VibGUgU1REQ0FMTCBGUERGVGV4dF9HZXRGb250U2l6ZShGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOworRlBERl9FWFBPUlQgZG91YmxlIEZQREZfQ0FMTENPTlYgRlBERlRleHRfR2V0Rm9udFNpemUoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOwogCiAvLyBGdW5jdGlvbjogRlBERlRleHRfR2V0Q2hhckJveAogLy8gICAgICAgICAgR2V0IGJvdW5kaW5nIGJveCBvZiBhIHBhcnRpY3VsYXIgY2hhcmFjdGVyLgpAQCAtMTAyLDE2ICsxMDIsMzkgQEAKIC8vICAgICAgICAgIHRvcCAgICAgICAgIC0gICBQb2ludGVyIHRvIGEgZG91YmxlIG51bWJlciByZWNlaXZpbmcgdG9wIHBvc2l0aW9uIG9mCiAvLyAgICAgICAgICB0aGUgY2hhcmFjdGVyIGJveC4KIC8vIFJldHVybiBWYWx1ZToKLS8vICAgICAgICAgIE5vbmUuCisvLyAgICAgICAgICBPbiBzdWNjZXNzLCByZXR1cm4gVFJVRSBhbmQgZmlsbCBpbiB8bGVmdHwsIHxyaWdodHwsIHxib3R0b218LCBhbmQKKy8vICAgICAgICAgIHx0b3B8LiBJZiB8dGV4dF9wYWdlfCBpcyBpbnZhbGlkLCBvciBpZiB8aW5kZXh8IGlzIG91dCBvZiBib3VuZHMsCisvLyAgICAgICAgICB0aGVuIHJldHVybiBGQUxTRSwgYW5kIHRoZSBvdXQgcGFyYW1ldGVycyByZW1haW4gdW5tb2RpZmllZC4KIC8vIENvbW1lbnRzOgogLy8gICAgICAgICAgQWxsIHBvc2l0aW9ucyBhcmUgbWVhc3VyZWQgaW4gUERGICJ1c2VyIHNwYWNlIi4KIC8vCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZUZXh0X0dldENoYXJCb3goRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdG9wKTsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZUZXh0X0dldENoYXJCb3goRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0b3ApOworCisvLyBGdW5jdGlvbjogRlBERlRleHRfR2V0Q2hhck9yaWdpbgorLy8gICAgICAgICAgR2V0IG9yaWdpbiBvZiBhIHBhcnRpY3VsYXIgY2hhcmFjdGVyLgorLy8gUGFyYW1ldGVyczoKKy8vICAgICAgICAgIHRleHRfcGFnZSAgIC0gICBIYW5kbGUgdG8gYSB0ZXh0IHBhZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlLgorLy8gICAgICAgICAgUmV0dXJuZWQgYnkgRlBERlRleHRfTG9hZFBhZ2UgZnVuY3Rpb24uCisvLyAgICAgICAgICBpbmRleCAgICAgICAtICAgWmVyby1iYXNlZCBpbmRleCBvZiB0aGUgY2hhcmFjdGVyLgorLy8gICAgICAgICAgeCAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgbnVtYmVyIHJlY2VpdmluZyB4IGNvb3JkaW5hdGUgb2YKKy8vICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgb3JpZ2luLgorLy8gICAgICAgICAgeSAgICAgICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgbnVtYmVyIHJlY2VpdmluZyB5IGNvb3JkaW5hdGUgb2YKKy8vICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgb3JpZ2luLgorLy8gUmV0dXJuIFZhbHVlOgorLy8gICAgICAgICAgV2hldGhlciB0aGUgY2FsbCBzdWNjZWVkZWQuIElmIGZhbHNlLCB4IGFuZCB5IGFyZSB1bmNoYW5nZWQuCisvLyBDb21tZW50czoKKy8vICAgICAgICAgIEFsbCBwb3NpdGlvbnMgYXJlIG1lYXN1cmVkIGluIFBERiAidXNlciBzcGFjZSIuCisvLworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZUZXh0X0dldENoYXJPcmlnaW4oRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB4LAorICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHkpOwogCiAvLyBGdW5jdGlvbjogRlBERlRleHRfR2V0Q2hhckluZGV4QXRQb3MKIC8vICAgICAgICAgIEdldCB0aGUgaW5kZXggb2YgYSBjaGFyYWN0ZXIgYXQgb3IgbmVhcmJ5IGEgY2VydGFpbiBwb3NpdGlvbiBvbiB0aGUKQEAgLTEzMSwxMSArMTU0LDEyIEBACiAvLyAgICAgICAgICBiZSAtMS4KIC8vICAgICAgICAgIElmIGFuIGVycm9yIG9jY3VycywgLTMgd2lsbCBiZSByZXR1cm5lZC4KIC8vCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfR2V0Q2hhckluZGV4QXRQb3MoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHhUb2xlcmFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHlUb2xlcmFuY2UpOworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYKK0ZQREZUZXh0X0dldENoYXJJbmRleEF0UG9zKEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4VG9sZXJhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHlUb2xlcmFuY2UpOwogCiAvLyBGdW5jdGlvbjogRlBERlRleHRfR2V0VGV4dAogLy8gICAgICAgICAgRXh0cmFjdCB1bmljb2RlIHRleHQgc3RyaW5nIGZyb20gdGhlIHBhZ2UuCkBAIC0xNTQsMTAgKzE3OCwxMCBAQAogLy8gQ29tbWVudHM6CiAvLyAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlnbm9yZXMgY2hhcmFjdGVycyB3aXRob3V0IHVuaWNvZGUgaW5mb3JtYXRpb24uCiAvLwotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZUZXh0X0dldFRleHQoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCogcmVzdWx0KTsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZUZXh0X0dldFRleHQoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCogcmVzdWx0KTsKIAogLy8gRnVuY3Rpb246IEZQREZUZXh0X0NvdW50UmVjdHMKIC8vICAgICAgICAgIENvdW50IG51bWJlciBvZiByZWN0YW5ndWxhciBhcmVhcyBvY2N1cGllZCBieSBhIHNlZ21lbnQgb2YgdGV4dHMuCkBAIC0xNzcsOSArMjAxLDkgQEAKIC8vICAgICAgICAgIG9uZSBpZiB0aG9zZSBjaGFyYWN0ZXJzCiAvLyAgICAgICAgICBhcmUgb24gdGhlIHNhbWUgbGluZSBhbmQgdXNlIHNhbWUgZm9udCBzZXR0aW5ncy4KIC8vCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfQ291bnRSZWN0cyhGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCk7CitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OViBGUERGVGV4dF9Db3VudFJlY3RzKEZQREZfVEVYVFBBR0UgdGV4dF9wYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9HZXRSZWN0CiAvLyAgICAgICAgICBHZXQgYSByZWN0YW5ndWxhciBhcmVhIGZyb20gdGhlIHJlc3VsdCBnZW5lcmF0ZWQgYnkKQEAgLTE5NywxNCArMjIxLDE4IEBACiAvLyAgICAgICAgICBib3R0b20gICAgICAtICAgUG9pbnRlciB0byBhIGRvdWJsZSB2YWx1ZSByZWNlaXZpbmcgdGhlIHJlY3RhbmdsZQogLy8gICAgICAgICAgYm90dG9tIGJvdW5kYXJ5LgogLy8gUmV0dXJuIFZhbHVlOgotLy8gICAgICAgICAgTm9uZS4KKy8vICAgICAgICAgIE9uIHN1Y2Nlc3MsIHJldHVybiBUUlVFIGFuZCBmaWxsIGluIHxsZWZ0fCwgfHRvcHwsIHxyaWdodHwsIGFuZAorLy8gICAgICAgICAgfGJvdHRvbXwuIElmIHxsaW5rX3BhZ2V8IGlzIGludmFsaWQgdGhlbiByZXR1cm4gRkFMU0UsIGFuZCB0aGUgb3V0CisvLyAgICAgICAgICBwYXJhbWV0ZXJzIHJlbWFpbiB1bm1vZGlmaWVkLiBJZiB8bGlua19wYWdlfCBpcyB2YWxpZCBidXQKKy8vICAgICAgICAgIHxsaW5rX2luZGV4fCBpcyBvdXQgb2YgYm91bmRzLCB0aGVuIHJldHVybiBGQUxTRSBhbmQgc2V0IHRoZSBvdXQKKy8vICAgICAgICAgIHBhcmFtZXRlcnMgdG8gMC4KIC8vCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZUZXh0X0dldFJlY3QoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlY3RfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBib3R0b20pOworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRlBERlRleHRfR2V0UmVjdChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlY3RfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYm90dG9tKTsKIAogLy8gRnVuY3Rpb246IEZQREZUZXh0X0dldEJvdW5kZWRUZXh0CiAvLyAgICAgICAgICBFeHRyYWN0IHVuaWNvZGUgdGV4dCB3aXRoaW4gYSByZWN0YW5ndWxhciBib3VuZGFyeSBvbiB0aGUgcGFnZS4KQEAgLTIzMiwxMyArMjYwLDEzIEBACiAvLyAgICAgICAgICBJZiB0aGUgYnVmZmVyIGlzIHRvbyBzbWFsbCwgYXMgbXVjaCB0ZXh0IGFzIHdpbGwgZml0IGlzIGNvcGllZCBpbnRvCiAvLyAgICAgICAgICBpdC4KIC8vCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfR2V0Qm91bmRlZFRleHQoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZsZW4pOworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERlRleHRfR2V0Qm91bmRlZFRleHQoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZsZW4pOwogCiAvLyBGbGFncyB1c2VkIGJ5IEZQREZUZXh0X0ZpbmRTdGFydCBmdW5jdGlvbi4KICNkZWZpbmUgRlBERl9NQVRDSENBU0UgXApAQCAtMjU4LDEwICsyODYsMTEgQEAKIC8vICAgICAgICAgIEEgaGFuZGxlIGZvciB0aGUgc2VhcmNoIGNvbnRleHQuIEZQREZUZXh0X0ZpbmRDbG9zZSBtdXN0IGJlIGNhbGxlZAogLy8gICAgICAgICAgdG8gcmVsZWFzZSB0aGlzIGhhbmRsZS4KIC8vCi1ETExFWFBPUlQgRlBERl9TQ0hIQU5ETEUgU1REQ0FMTCBGUERGVGV4dF9GaW5kU3RhcnQoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9XSURFU1RSSU5HIGZpbmR3aGF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2luZGV4KTsKK0ZQREZfRVhQT1JUIEZQREZfU0NISEFORExFIEZQREZfQ0FMTENPTlYKK0ZQREZUZXh0X0ZpbmRTdGFydChGUERGX1RFWFRQQUdFIHRleHRfcGFnZSwKKyAgICAgICAgICAgICAgICAgICBGUERGX1dJREVTVFJJTkcgZmluZHdoYXQsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFncywKKyAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfaW5kZXgpOwogCiAvLyBGdW5jdGlvbjogRlBERlRleHRfRmluZE5leHQKIC8vICAgICAgICAgIFNlYXJjaCBpbiB0aGUgZGlyZWN0aW9uIGZyb20gcGFnZSBzdGFydCB0byBlbmQuCkBAIC0yNzEsNyArMzAwLDcgQEAKIC8vIFJldHVybiBWYWx1ZToKIC8vICAgICAgICAgIFdoZXRoZXIgYSBtYXRjaCBpcyBmb3VuZC4KIC8vCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwgRlBERlRleHRfRmluZE5leHQoRlBERl9TQ0hIQU5ETEUgaGFuZGxlKTsKK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WIEZQREZUZXh0X0ZpbmROZXh0KEZQREZfU0NISEFORExFIGhhbmRsZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9GaW5kUHJldgogLy8gICAgICAgICAgU2VhcmNoIGluIHRoZSBkaXJlY3Rpb24gZnJvbSBwYWdlIGVuZCB0byBzdGFydC4KQEAgLTI4MSw3ICszMTAsNyBAQAogLy8gUmV0dXJuIFZhbHVlOgogLy8gICAgICAgICAgV2hldGhlciBhIG1hdGNoIGlzIGZvdW5kLgogLy8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGVGV4dF9GaW5kUHJldihGUERGX1NDSEhBTkRMRSBoYW5kbGUpOworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRlBERlRleHRfRmluZFByZXYoRlBERl9TQ0hIQU5ETEUgaGFuZGxlKTsKIAogLy8gRnVuY3Rpb246IEZQREZUZXh0X0dldFNjaFJlc3VsdEluZGV4CiAvLyAgICAgICAgICBHZXQgdGhlIHN0YXJ0aW5nIGNoYXJhY3RlciBpbmRleCBvZiB0aGUgc2VhcmNoIHJlc3VsdC4KQEAgLTI5MSw3ICszMjAsNyBAQAogLy8gUmV0dXJuIFZhbHVlOgogLy8gICAgICAgICAgSW5kZXggZm9yIHRoZSBzdGFydGluZyBjaGFyYWN0ZXIuCiAvLwotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZUZXh0X0dldFNjaFJlc3VsdEluZGV4KEZQREZfU0NISEFORExFIGhhbmRsZSk7CitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OViBGUERGVGV4dF9HZXRTY2hSZXN1bHRJbmRleChGUERGX1NDSEhBTkRMRSBoYW5kbGUpOwogCiAvLyBGdW5jdGlvbjogRlBERlRleHRfR2V0U2NoQ291bnQKIC8vICAgICAgICAgIEdldCB0aGUgbnVtYmVyIG9mIG1hdGNoZWQgY2hhcmFjdGVycyBpbiB0aGUgc2VhcmNoIHJlc3VsdC4KQEAgLTMwMSw3ICszMzAsNyBAQAogLy8gUmV0dXJuIFZhbHVlOgogLy8gICAgICAgICAgTnVtYmVyIG9mIG1hdGNoZWQgY2hhcmFjdGVycy4KIC8vCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERlRleHRfR2V0U2NoQ291bnQoRlBERl9TQ0hIQU5ETEUgaGFuZGxlKTsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZUZXh0X0dldFNjaENvdW50KEZQREZfU0NISEFORExFIGhhbmRsZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGVGV4dF9GaW5kQ2xvc2UKIC8vICAgICAgICAgIFJlbGVhc2UgYSBzZWFyY2ggY29udGV4dC4KQEAgLTMxMSw3ICszNDAsNyBAQAogLy8gUmV0dXJuIFZhbHVlOgogLy8gICAgICAgICAgTm9uZS4KIC8vCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZUZXh0X0ZpbmRDbG9zZShGUERGX1NDSEhBTkRMRSBoYW5kbGUpOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZUZXh0X0ZpbmRDbG9zZShGUERGX1NDSEhBTkRMRSBoYW5kbGUpOwogCiAvLyBGdW5jdGlvbjogRlBERkxpbmtfTG9hZFdlYkxpbmtzCiAvLyAgICAgICAgICBQcmVwYXJlIGluZm9ybWF0aW9uIGFib3V0IHdlYmxpbmtzIGluIGEgcGFnZS4KQEAgLTMzNiw3ICszNjUsOCBAQAogLy8KIC8vICAgICAgICAgIEZQREZMaW5rX0Nsb3NlV2ViTGlua3MgbXVzdCBiZSBjYWxsZWQgdG8gcmVsZWFzZSByZXNvdXJjZXMuCiAvLwotRExMRVhQT1JUIEZQREZfUEFHRUxJTksgU1REQ0FMTCBGUERGTGlua19Mb2FkV2ViTGlua3MoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UpOworRlBERl9FWFBPUlQgRlBERl9QQUdFTElOSyBGUERGX0NBTExDT05WCitGUERGTGlua19Mb2FkV2ViTGlua3MoRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UpOwogCiAvLyBGdW5jdGlvbjogRlBERkxpbmtfQ291bnRXZWJMaW5rcwogLy8gICAgICAgICAgQ291bnQgbnVtYmVyIG9mIGRldGVjdGVkIHdlYiBsaW5rcy4KQEAgLTM0NSw3ICszNzUsNyBAQAogLy8gUmV0dXJuIFZhbHVlOgogLy8gICAgICAgICAgTnVtYmVyIG9mIGRldGVjdGVkIHdlYiBsaW5rcy4KIC8vCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERkxpbmtfQ291bnRXZWJMaW5rcyhGUERGX1BBR0VMSU5LIGxpbmtfcGFnZSk7CitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OViBGUERGTGlua19Db3VudFdlYkxpbmtzKEZQREZfUEFHRUxJTksgbGlua19wYWdlKTsKIAogLy8gRnVuY3Rpb246IEZQREZMaW5rX0dldFVSTAogLy8gICAgICAgICAgRmV0Y2ggdGhlIFVSTCBpbmZvcm1hdGlvbiBmb3IgYSBkZXRlY3RlZCB3ZWIgbGluay4KQEAgLTM2NiwxMCArMzk2LDEwIEBACiAvLyAgICAgICAgICBJZiB8bGlua19pbmRleHwgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHZhbGlkIGxpbmssIHRoZW4gdGhlIHJlc3VsdAogLy8gICAgICAgICAgaXMgYW4gZW1wdHkgc3RyaW5nLgogLy8KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGTGlua19HZXRVUkwoRlBERl9QQUdFTElOSyBsaW5rX3BhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5rX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVmbGVuKTsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZMaW5rX0dldFVSTChGUERGX1BBR0VMSU5LIGxpbmtfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGlua19pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWZsZW4pOwogCiAvLyBGdW5jdGlvbjogRlBERkxpbmtfQ291bnRSZWN0cwogLy8gICAgICAgICAgQ291bnQgbnVtYmVyIG9mIHJlY3Rhbmd1bGFyIGFyZWFzIGZvciB0aGUgbGluay4KQEAgLTM4MCw4ICs0MTAsOCBAQAogLy8gICAgICAgICAgTnVtYmVyIG9mIHJlY3Rhbmd1bGFyIGFyZWFzIGZvciB0aGUgbGluay4gIElmIHxsaW5rX2luZGV4fCBkb2VzCiAvLyAgICAgICAgICBub3QgY29ycmVzcG9uZCB0byBhIHZhbGlkIGxpbmssIHRoZW4gMCBpcyByZXR1cm5lZC4KIC8vCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERkxpbmtfQ291bnRSZWN0cyhGUERGX1BBR0VMSU5LIGxpbmtfcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5rX2luZGV4KTsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZMaW5rX0NvdW50UmVjdHMoRlBERl9QQUdFTElOSyBsaW5rX3BhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5rX2luZGV4KTsKIAogLy8gRnVuY3Rpb246IEZQREZMaW5rX0dldFJlY3QKIC8vICAgICAgICAgIEZldGNoIHRoZSBib3VuZGFyaWVzIG9mIGEgcmVjdGFuZ2xlIGZvciBhIGxpbmsuCkBAIC0zOTgsMTYgKzQyOCwxOCBAQAogLy8gICAgICAgICAgYm90dG9tICAgICAgLSAgIFBvaW50ZXIgdG8gYSBkb3VibGUgdmFsdWUgcmVjZWl2aW5nIHRoZSByZWN0YW5nbGUKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBib3R0b20gYm91bmRhcnkuCiAvLyBSZXR1cm4gVmFsdWU6Ci0vLyAgICAgICAgICBOb25lLiAgSWYgfGxpbmtfaW5kZXh8IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSB2YWxpZCBsaW5rLCB0aGVuCi0vLyAgICAgICAgICB8bGVmdHwsIHx0b3B8LCB8cmlnaHR8LCBhbmQgfGJvdHRvbXwgcmVtYWluIHVubW9kaWZpZWQuCisvLyAgICAgICAgICBPbiBzdWNjZXNzLCByZXR1cm4gVFJVRSBhbmQgZmlsbCBpbiB8bGVmdHwsIHx0b3B8LCB8cmlnaHR8LCBhbmQKKy8vICAgICAgICAgIHxib3R0b218LiBJZiB8bGlua19wYWdlfCBpcyBpbnZhbGlkIG9yIGlmIHxsaW5rX2luZGV4fCBkb2VzIG5vdAorLy8gICAgICAgICAgY29ycmVzcG9uZCB0byBhIHZhbGlkIGxpbmssIHRoZW4gcmV0dXJuIEZBTFNFLCBhbmQgdGhlIG91dAorLy8gICAgICAgICAgcGFyYW1ldGVycyByZW1haW4gdW5tb2RpZmllZC4KIC8vCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZMaW5rX0dldFJlY3QoRlBERl9QQUdFTElOSyBsaW5rX3BhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmtfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlY3RfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBib3R0b20pOworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRlBERkxpbmtfR2V0UmVjdChGUERGX1BBR0VMSU5LIGxpbmtfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmtfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWN0X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGJvdHRvbSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGTGlua19DbG9zZVdlYkxpbmtzCiAvLyAgICAgICAgICBSZWxlYXNlIHJlc291cmNlcyB1c2VkIGJ5IHdlYmxpbmsgZmVhdHVyZS4KQEAgLTQxNiw3ICs0NDgsNyBAQAogLy8gUmV0dXJuIFZhbHVlOgogLy8gICAgICAgICAgTm9uZS4KIC8vCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZMaW5rX0Nsb3NlV2ViTGlua3MoRlBERl9QQUdFTElOSyBsaW5rX3BhZ2UpOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZMaW5rX0Nsb3NlV2ViTGlua3MoRlBERl9QQUdFTElOSyBsaW5rX3BhZ2UpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KZGlmZiAtLWdpdCBhL3B1YmxpYy9mcGRmX3RyYW5zZm9ybXBhZ2UuaCBiL3B1YmxpYy9mcGRmX3RyYW5zZm9ybXBhZ2UuaAppbmRleCA2NjI3MWZjLi5hNmVkMDRhIDEwMDY0NAotLS0gYS9wdWJsaWMvZnBkZl90cmFuc2Zvcm1wYWdlLmgKKysrIGIvcHVibGljL2ZwZGZfdHJhbnNmb3JtcGFnZS5oCkBAIC0yNiwxMSArMjYsMTEgQEAKICogQHBhcmFtW2luXSB0b3AgICAgLSBUaGUgdG9wIG9mIHRoZSByZWN0YW5nbGUuCiAqIEByZXR2YWwgTm9uZS4KICovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX1NldE1lZGlhQm94KEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0b3ApOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZQYWdlX1NldE1lZGlhQm94KEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYm90dG9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRvcCk7CiAKIC8qKgogKiAgU2V0ICJDcm9wQm94IiBlbnRyeSB0byB0aGUgcGFnZSBkaWN0aW9uYXJ5LgpAQCAtNDEsMTEgKzQxLDExIEBACiAqIEBwYXJhbVtpbl0gdG9wICAgIC0gVGhlIHRvcCBvZiB0aGUgcmVjdGFuZ2xlLgogKiBAcmV0dmFsIE5vbmUuCiAqLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGUGFnZV9TZXRDcm9wQm94KEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRvcCk7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRlBERlBhZ2VfU2V0Q3JvcEJveChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRvcCk7CiAKIC8qKiAgR2V0ICJNZWRpYUJveCIgZW50cnkgZnJvbSB0aGUgcGFnZSBkaWN0aW9uYXJ5LgogKiBAcGFyYW1baW5dIHBhZ2UgICAtIEhhbmRsZSB0byBhIHBhZ2UuCkBAIC01OSwxMSArNTksMTEgQEAKICogcmVjdGFuZ2xlLgogKiBAcmV0dmFsIFRydWUgaWYgc3VjY2VzcyxlbHNlIGZhaWwuCiAqLwotRExMRVhQT1JUIEZQREZfQk9PTCBTVERDQUxMIEZQREZQYWdlX0dldE1lZGlhQm94KEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB0b3ApOworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRlBERlBhZ2VfR2V0TWVkaWFCb3goRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdG9wKTsKIAogLyoqICBHZXQgIkNyb3BCb3giIGVudHJ5IGZyb20gdGhlIHBhZ2UgZGljdGlvbmFyeS4KICogQHBhcmFtW2luXSBwYWdlICAgLSBIYW5kbGUgdG8gYSBwYWdlLgpAQCAtNzcsMjUgKzc3LDMwIEBACiAqIHJlY3RhbmdsZS4KICogQHJldHZhbCBUcnVlIGlmIHN1Y2Nlc3MsZWxzZSBmYWlsLgogKi8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9HZXRDcm9wQm94KEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYm90dG9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHRvcCk7CitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGUGFnZV9HZXRDcm9wQm94KEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogdG9wKTsKIAogLyoqCi0qIFRyYW5zZm9ybSB0aGUgd2hvbGUgcGFnZSB3aXRoIGEgc3BlY2lmaWVkIG1hdHJpeCwgdGhlbiBjbGlwIHRoZSBwYWdlIGNvbnRlbnQKLSogcmVnaW9uLgotKgotKiBAcGFyYW1baW5dIHBhZ2UgICAgICAgIC0gQSBwYWdlIGhhbmRsZS4KLSogQHBhcmFtW2luXSBtYXRyaXggICAgICAtIFRoZSB0cmFuc2Zvcm0gbWF0cml4LgotKiBAcGFyYW1baW5dIGNsaXBSZWN0ICAgIC0gQSByZWN0YW5nbGUgcGFnZSBhcmVhIHRvIGJlIGNsaXBwZWQuCi0qIEBOb3RlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdHJhbnNmb3JtIHRoZSB3aG9sZSBwYWdlLCBhbmQgd291bGQgdGFrZSBlZmZlY3QgdG8KLSogYWxsIHRoZSBvYmplY3RzIGluIHRoZSBwYWdlLgotKi8KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGUGFnZV9UcmFuc0Zvcm1XaXRoQ2xpcChGUERGX1BBR0UgcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19NQVRSSVgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19SRUNURiogY2xpcFJlY3QpOworICogQXBwbHkgdHJhbnNmb3JtcyB0byB8cGFnZXwuCisgKgorICogSWYgfG1hdHJpeHwgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRyYW5zZm9ybSB0aGUgcGFnZS4KKyAqIElmIHxjbGlwUmVjdHwgaXMgcHJvdmlkZWQgaXQgd2lsbCBiZSB1c2VkIHRvIGNsaXAgdGhlIHJlc3VsdGluZyBwYWdlLgorICogSWYgbmVpdGhlciB8bWF0cml4fCBvciB8Y2xpcFJlY3R8IGFyZSBwcm92aWRlZCB0aGlzIG1ldGhvZCByZXR1cm5zIHxmYWxzZXwuCisgKiBSZXR1cm5zIHx0cnVlfCBpZiB0cmFuc2Zvcm1zIGFyZSBhcHBsaWVkLgorICoKKyAqIEBwYXJhbVtpbl0gcGFnZSAgICAgICAgLSBQYWdlIGhhbmRsZS4KKyAqIEBwYXJhbVtpbl0gbWF0cml4ICAgICAgLSBUcmFuc2Zvcm0gbWF0cml4LgorICogQHBhcmFtW2luXSBjbGlwUmVjdCAgICAtIENsaXBwaW5nIHJlY3RhbmdsZS4KKyAqIEBOb3RlLiBUaGlzIGZ1bmN0aW9uIHdpbGwgdHJhbnNmb3JtIHRoZSB3aG9sZSBwYWdlLCBhbmQgd291bGQgdGFrZSBlZmZlY3QgdG8KKyAqIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgcGFnZS4KKyAqLworRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKK0ZQREZQYWdlX1RyYW5zRm9ybVdpdGhDbGlwKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNfTUFUUklYKiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19SRUNURiogY2xpcFJlY3QpOwogCiAvKioKICogVHJhbnNmb3JtIChzY2FsZSwgcm90YXRlLCBzaGVhciwgbW92ZSkgdGhlIGNsaXAgcGF0aCBvZiBwYWdlIG9iamVjdC4KQEAgLTEwOSw3ICsxMTQsNyBAQAogKiBAcGFyYW1baW5dIGYgIC0gVGhlIGNvZWZmaWNpZW50ICJmIiBvZiB0aGUgbWF0cml4LgogKiBAcmV0dmFsIE5vbmUuCiAqLwotRExMRVhQT1JUIHZvaWQgU1REQ0FMTAorRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WCiBGUERGUGFnZU9ial9UcmFuc2Zvcm1DbGlwUGF0aChGUERGX1BBR0VPQkpFQ1QgcGFnZV9vYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiLApAQCAtMTI3LDEwICsxMzIsMTAgQEAKICogQHBhcmFtW2luXSB0b3AgICAgLSBUaGUgdG9wIG9mIHRoZSBjbGlwIGJveC4KICogQHJldHZhbCBhIGhhbmRsZSB0byB0aGUgY2xpcCBwYXRoLgogKi8KLURMTEVYUE9SVCBGUERGX0NMSVBQQVRIIFNURENBTEwgRlBERl9DcmVhdGVDbGlwUGF0aChmbG9hdCBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0b3ApOworRlBERl9FWFBPUlQgRlBERl9DTElQUEFUSCBGUERGX0NBTExDT05WIEZQREZfQ3JlYXRlQ2xpcFBhdGgoZmxvYXQgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdG9wKTsKIAogLyoqCiAqIERlc3Ryb3kgdGhlIGNsaXAgcGF0aC4KQEAgLTEzOSw3ICsxNDQsNyBAQAogKiBEZXN0cm95IHRoZSBjbGlwIHBhdGguCiAqIEByZXR2YWwgTm9uZS4KICovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfRGVzdHJveUNsaXBQYXRoKEZQREZfQ0xJUFBBVEggY2xpcFBhdGgpOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZfRGVzdHJveUNsaXBQYXRoKEZQREZfQ0xJUFBBVEggY2xpcFBhdGgpOwogCiAvKioKICogQ2xpcCB0aGUgcGFnZSBjb250ZW50LCB0aGUgcGFnZSBjb250ZW50IHRoYXQgb3V0c2lkZSB0aGUgY2xpcHBpbmcgcmVnaW9uCkBAIC0xNTEsOCArMTU2LDggQEAKICogYXJyYXkuIEluIHRoaXMgd2F5LCB0aGUgcGFnZSBjb250ZW50IHdpbGwgYmUgY2xpcHBlZAogKiBieSB0aGlzIGNsaXAgcGF0aC4KICovCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZQYWdlX0luc2VydENsaXBQYXRoKEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0NMSVBQQVRIIGNsaXBQYXRoKTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGUGFnZV9JbnNlcnRDbGlwUGF0aChGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0NMSVBQQVRIIGNsaXBQYXRoKTsKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CmRpZmYgLS1naXQgYS9wdWJsaWMvZnBkZnZpZXcuaCBiL3B1YmxpYy9mcGRmdmlldy5oCmluZGV4IDFjNDdhMzYuLmZmYTQ2NzggMTAwNjQ0Ci0tLSBhL3B1YmxpYy9mcGRmdmlldy5oCisrKyBiL3B1YmxpYy9mcGRmdmlldy5oCkBAIC0yMCwyOCArMjAsMzkgQEAKICNkZWZpbmUgUERGX1VTRV9YRkEKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAorLy8gUERGIG9iamVjdCB0eXBlcworI2RlZmluZSBGUERGX09CSkVDVF9VTktOT1dOIDAKKyNkZWZpbmUgRlBERl9PQkpFQ1RfQk9PTEVBTiAxCisjZGVmaW5lIEZQREZfT0JKRUNUX05VTUJFUiAyCisjZGVmaW5lIEZQREZfT0JKRUNUX1NUUklORyAzCisjZGVmaW5lIEZQREZfT0JKRUNUX05BTUUgNAorI2RlZmluZSBGUERGX09CSkVDVF9BUlJBWSA1CisjZGVmaW5lIEZQREZfT0JKRUNUX0RJQ1RJT05BUlkgNgorI2RlZmluZSBGUERGX09CSkVDVF9TVFJFQU0gNworI2RlZmluZSBGUERGX09CSkVDVF9OVUxMT0JKIDgKKyNkZWZpbmUgRlBERl9PQkpFQ1RfUkVGRVJFTkNFIDkKKwogLy8gUERGIHR5cGVzCiB0eXBlZGVmIHZvaWQqIEZQREZfQUNUSU9OOwordHlwZWRlZiB2b2lkKiBGUERGX0FOTk9UQVRJT047Cit0eXBlZGVmIHZvaWQqIEZQREZfQVRUQUNITUVOVDsKIHR5cGVkZWYgdm9pZCogRlBERl9CSVRNQVA7CiB0eXBlZGVmIHZvaWQqIEZQREZfQk9PS01BUks7CiB0eXBlZGVmIHZvaWQqIEZQREZfQ0xJUFBBVEg7CiB0eXBlZGVmIHZvaWQqIEZQREZfREVTVDsKLXR5cGVkZWYgdm9pZCogRlBERl9ET0NTQ0hIQU5ETEU7CiB0eXBlZGVmIHZvaWQqIEZQREZfRE9DVU1FTlQ7CiB0eXBlZGVmIHZvaWQqIEZQREZfRk9OVDsKLXR5cGVkZWYgdm9pZCogRlBERl9ITU9EVUxFOwogdHlwZWRlZiB2b2lkKiBGUERGX0xJTks7Ci10eXBlZGVmIHZvaWQqIEZQREZfTU9EVUxFTUdSOwogdHlwZWRlZiB2b2lkKiBGUERGX1BBR0U7CiB0eXBlZGVmIHZvaWQqIEZQREZfUEFHRUxJTks7CiB0eXBlZGVmIHZvaWQqIEZQREZfUEFHRU9CSkVDVDsgIC8vIFBhZ2Ugb2JqZWN0KHRleHQsIHBhdGgsIGV0YykKIHR5cGVkZWYgdm9pZCogRlBERl9QQUdFUkFOR0U7Ci10eXBlZGVmIHZvaWQqIEZQREZfUEFUSDsKIHR5cGVkZWYgdm9pZCogRlBERl9SRUNPUkRFUjsKIHR5cGVkZWYgdm9pZCogRlBERl9TQ0hIQU5ETEU7CiB0eXBlZGVmIHZvaWQqIEZQREZfU1RSVUNURUxFTUVOVDsKIHR5cGVkZWYgdm9pZCogRlBERl9TVFJVQ1RUUkVFOwogdHlwZWRlZiB2b2lkKiBGUERGX1RFWFRQQUdFOwordHlwZWRlZiB2b2lkIGNvbnN0KiBGUERGX1BBVEhTRUdNRU5UOwogCiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKIHR5cGVkZWYgdm9pZCogRlBERl9TVFJJTkdIQU5ETEU7CkBAIC0xMDEsNyArMTEyLDE0IEBACiAvLyBzeXN0ZW0gd2lkZSBzdHJpbmcgYnkgeW91cnNlbGYuCiB0eXBlZGVmIGNvbnN0IGNoYXIqIEZQREZfU1RSSU5HOwogCi0vLyBNYXRyaXggZm9yIHRyYW5zZm9ybWF0aW9uLgorLy8gTWF0cml4IGZvciB0cmFuc2Zvcm1hdGlvbiwgaW4gdGhlIGZvcm0gW2EgYiBjIGQgZSBmXSwgZXF1aXZhbGVudCB0bzoKKy8vIHwgYSAgYiAgMCB8CisvLyB8IGMgIGQgIDAgfAorLy8gfCBlICBmICAxIHwKKy8vCisvLyBUcmFuc2xhdGlvbiBpcyBwZXJmb3JtZWQgd2l0aCBbMSAwIDAgMSB0eCB0eV0uCisvLyBTY2FsaW5nIGlzIHBlcmZvcm1lZCB3aXRoIFtzeCAwIDAgc3kgMCAwXS4KKy8vIFNlZSBQREYgUmVmZXJlbmNlIDEuNywgNC4yLjIgQ29tbW9uIFRyYW5zZm9ybWF0aW9ucyBmb3IgbW9yZS4KIHR5cGVkZWYgc3RydWN0IF9GU19NQVRSSVhfIHsKICAgZmxvYXQgYTsKICAgZmxvYXQgYjsKQEAgLTEyNiwxMyArMTQ0LDIwIEBACiAvLyBDb25zdCBQb2ludGVyIHRvIEZTX1JFQ1RGIHN0cnVjdHVyZS4KIHR5cGVkZWYgY29uc3QgRlNfUkVDVEYqIEZTX0xQQ1JFQ1RGOwogCisvLyBBbm5vdGF0aW9uIGVudW1zLgordHlwZWRlZiBpbnQgRlBERl9BTk5PVEFUSU9OX1NVQlRZUEU7Cit0eXBlZGVmIGludCBGUERGX0FOTk9UX0FQUEVBUkFOQ0VNT0RFOworCisvLyBEaWN0aW9uYXJ5IHZhbHVlIHR5cGVzLgordHlwZWRlZiBpbnQgRlBERl9PQkpFQ1RfVFlQRTsKKwogI2lmIGRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkKEZQREZTREtfRVhQT1JUUykKIC8vIE9uIFdpbmRvd3Mgc3lzdGVtLCBmdW5jdGlvbnMgYXJlIGV4cG9ydGVkIGluIGEgRExMCi0jZGVmaW5lIERMTEVYUE9SVCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSNkZWZpbmUgU1REQ0FMTCBfX3N0ZGNhbGwKKyNkZWZpbmUgRlBERl9FWFBPUlQgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjZGVmaW5lIEZQREZfQ0FMTENPTlYgX19zdGRjYWxsCiAjZWxzZQotI2RlZmluZSBETExFWFBPUlQKLSNkZWZpbmUgU1REQ0FMTAorI2RlZmluZSBGUERGX0VYUE9SVAorI2RlZmluZSBGUERGX0NBTExDT05WCiAjZW5kaWYKIAogLy8gRXhwb3J0ZWQgRnVuY3Rpb25zCkBAIC0xNDksNyArMTc0LDcgQEAKIC8vIENvbW1lbnRzOgogLy8gICAgICAgICAgQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY2FsbCBGUERGX0luaXRMaWJyYXJ5V2l0aENvbmZpZygpIGZvcgogLy8gICAgICAgICAgYmFja3dhcmRzIGNvbWF0aWJpbGl0eSBwdXJwb3Nlcy4KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9Jbml0TGlicmFyeSgpOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZfSW5pdExpYnJhcnkoKTsKIAogLy8gUHJvY2Vzcy13aWRlIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyB0aGUgbGlicmFyeS4KIHR5cGVkZWYgc3RydWN0IEZQREZfTElCUkFSWV9DT05GSUdfIHsKQEAgLTE4Myw4ICsyMDgsOCBAQAogLy8gQ29tbWVudHM6CiAvLyAgICAgICAgICBZb3UgaGF2ZSB0byBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIHlvdSBjYW4gY2FsbCBhbnkgUERGCiAvLyAgICAgICAgICBwcm9jZXNzaW5nIGZ1bmN0aW9ucy4KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9Jbml0TGlicmFyeVdpdGhDb25maWcoCi0gICAgY29uc3QgRlBERl9MSUJSQVJZX0NPTkZJRyogY29uZmlnKTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OVgorRlBERl9Jbml0TGlicmFyeVdpdGhDb25maWcoY29uc3QgRlBERl9MSUJSQVJZX0NPTkZJRyogY29uZmlnKTsKIAogLy8gRnVuY3Rpb246IEZQREZfRGVzdHJveUxpYmFyeQogLy8gICAgICAgICAgUmVsZWFzZSBhbGwgcmVzb3VyY2VzIGFsbG9jYXRlZCBieSB0aGUgRlBERlNESyBsaWJyYXJ5LgpAQCAtMTk3LDcgKzIyMiw3IEBACiAvLyAgICAgICAgICB0aGUgbGlicmFyeS4KIC8vICAgICAgICAgIEFmdGVyIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCB5b3Ugc2hvdWxkIG5vdCBjYWxsIGFueSBQREYKIC8vICAgICAgICAgIHByb2Nlc3NpbmcgZnVuY3Rpb25zLgotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0Rlc3Ryb3lMaWJyYXJ5KCk7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRlBERl9EZXN0cm95TGlicmFyeSgpOwogCiAvLyBQb2xpY3kgZm9yIGFjY2Vzc2luZyB0aGUgbG9jYWwgbWFjaGluZSB0aW1lLgogI2RlZmluZSBGUERGX1BPTElDWV9NQUNISU5FVElNRV9BQ0NFU1MgMApAQCAtMjEwLDggKzIzNSw4IEBACiAvLyAgICAgICAgICBlbmFibGUgLSAgIFRydWUgdG8gZW5hYmxlLCBmYWxzZSB0byBkaXNhYmxlIHRoZSBwb2xpY3kuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb25lLgotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1NldFNhbmRCb3hQb2xpY3koRlBERl9EV09SRCBwb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JPT0wgZW5hYmxlKTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGX1NldFNhbmRCb3hQb2xpY3koRlBERl9EV09SRCBwb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQk9PTCBlbmFibGUpOwogCiAjaWYgZGVmaW5lZChfV0lOMzIpCiAjaWYgZGVmaW5lZChQREZJVU1fUFJJTlRfVEVYVF9XSVRIX0dESSkKQEAgLTIyOSw3ICsyNTQsNyBAQAogLy8gICAgICAgICAgZnVuYyAtICAgQSBmdW5jdGlvbiBwb2ludGVyLiBTZWUgZGVzY3JpcHRpb24gYWJvdmUuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb25lLgotRExMRVhQT1JUIHZvaWQgU1REQ0FMTAorRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WCiBGUERGX1NldFR5cGVmYWNlQWNjZXNzaWJsZUZ1bmMoUERGaXVtRW5zdXJlVHlwZWZhY2VDaGFyYWN0ZXJzQWNjZXNzaWJsZSBmdW5jKTsKIAogLy8gRnVuY3Rpb246IEZQREZfU2V0UHJpbnRUZXh0V2l0aEdESQpAQCAtMjM5LDIxICsyNjQsMzQgQEAKIC8vICAgICAgICAgIHVzZV9nZGkgLSAgIFNldCB0byB0cnVlIHRvIGVuYWJsZSBwcmludGluZyB0ZXh0IHdpdGggR0RJLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTm9uZS4KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9TZXRQcmludFRleHRXaXRoR0RJKEZQREZfQk9PTCB1c2VfZ2RpKTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGX1NldFByaW50VGV4dFdpdGhHREkoRlBERl9CT09MIHVzZV9nZGkpOwogI2VuZGlmICAvLyBQREZJVU1fUFJJTlRfVEVYVF9XSVRIX0dESQogCiAvLyBGdW5jdGlvbjogRlBERl9TZXRQcmludFBvc3RzY3JpcHRMZXZlbAogLy8gICAgICAgICAgU2V0IHBvc3RzY3JpcHQgcHJpbnRpbmcgbGV2ZWwgd2hlbiBwcmludGluZyBvbiBXaW5kb3dzLgogLy8gICAgICAgICAgRXhwZXJpbWVudGFsIEFQSS4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBwb3N0c2NyaXB0X2xldmVsIC0gIDAgdG8gZGlzYWJsZSBwb3N0c2NyaXB0IHByaW50aW5nLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIHRvIHByaW50IHdpdGggcG9zdHNjcmlwdCBsZXZlbCAyLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzIHRvIHByaW50IHdpdGggcG9zdHNjcmlwdCBsZXZlbCAzLgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgb3RoZXIgdmFsdWVzIGFyZSBpbnZhbGlkLgorLy8gICAgICAgICAgcG9zdHNjcmlwdF9sZXZlbC0gMCB0byBkaXNhYmxlIHBvc3RzY3JpcHQgcHJpbnRpbmcsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIHRvIHByaW50IHdpdGggcG9zdHNjcmlwdCBsZXZlbCAyLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgMyB0byBwcmludCB3aXRoIHBvc3RzY3JpcHQgbGV2ZWwgMy4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBvdGhlciB2YWx1ZXMgYXJlIGludmFsaWQuCiAvLyBSZXR1cm4gdmFsdWU6Ci0vLyAgICAgICAgICBUcnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIGlmIHVuc3VjZXNzZnVsICh0eXBpY2FsbHkgaW52YWxpZCBpbnB1dCkuCi1ETExFWFBPUlQgRlBERl9CT09MIFNURENBTEwKLUZQREZfU2V0UHJpbnRQb3N0c2NyaXB0TGV2ZWwoRlBERl9CT09MIHBvc3RzY3JpcHRfbGV2ZWwpOworLy8gICAgICAgICAgVHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBpZiB1bnN1Y2Nlc3NmdWwgKHR5cGljYWxseSBpbnZhbGlkIGlucHV0KS4KK0ZQREZfRVhQT1JUIEZQREZfQk9PTCBGUERGX0NBTExDT05WCitGUERGX1NldFByaW50UG9zdHNjcmlwdExldmVsKGludCBwb3N0c2NyaXB0X2xldmVsKTsKKworLy8gRnVuY3Rpb246IEZQREZfU2V0UHJpbnRNb2RlCisvLyAgICAgICAgICBTZXQgcHJpbnRpbmcgbW9kZSB3aGVuIHByaW50aW5nIG9uIFdpbmRvd3MuCisvLyAgICAgICAgICBFeHBlcmltZW50YWwgQVBJLgorLy8gUGFyYW1ldGVyczoKKy8vICAgICAgICAgIG1vZGUgLSBGUERGX1BSSU5UTU9ERV9FTUYgdG8gb3V0cHV0IEVNRiAoZGVmYXVsdCkKKy8vICAgICAgICAgICAgICAgICBGUERGX1BSSU5UTU9ERV9URVhUT05MWSB0byBvdXRwdXQgdGV4dCBvbmx5IChmb3IgY2hhcnN0cmVhbQorLy8gICAgICAgICAgICAgICAgIGRldmljZXMpCisvLyAgICAgICAgICAgICAgICAgRlBERl9QUklOVE1PREVfUE9TVFNDUklQVDIgdG8gb3V0cHV0IGxldmVsIDIgcG9zdHNjcmlwdAorLy8gICAgICAgICAgICAgICAgIEZQREZfUFJJTlRNT0RFX1BPU1RTQ1JJUFQzIHRvIG91dHB1dCBsZXZlbCAzIHBvc3RzY3JpcHQKKy8vIFJldHVybiB2YWx1ZToKKy8vICAgICAgICAgIFRydWUgaWYgc3VjY2Vzc2Z1bCwgZmFsc2UgaWYgdW5zdWNjZXNzZnVsICh0eXBpY2FsbHkgaW52YWxpZCBpbnB1dCkuCitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGX1NldFByaW50TW9kZShpbnQgbW9kZSk7CiAjZW5kaWYgIC8vIGRlZmluZWQoX1dJTjMyKQogCiAvLyBGdW5jdGlvbjogRlBERl9Mb2FkRG9jdW1lbnQKQEAgLTI2OCw4ICszMDYsOCBAQAogLy8gICAgICAgICAgTG9hZGVkIGRvY3VtZW50IGNhbiBiZSBjbG9zZWQgYnkgRlBERl9DbG9zZURvY3VtZW50KCkuCiAvLyAgICAgICAgICBJZiB0aGlzIGZ1bmN0aW9uIGZhaWxzLCB5b3UgY2FuIHVzZSBGUERGX0dldExhc3RFcnJvcigpIHRvIHJldHJpZXZlCiAvLyAgICAgICAgICB0aGUgcmVhc29uIHdoeSBpdCBmYWlsZWQuCi1ETExFWFBPUlQgRlBERl9ET0NVTUVOVCBTVERDQUxMIEZQREZfTG9hZERvY3VtZW50KEZQREZfU1RSSU5HIGZpbGVfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIHBhc3N3b3JkKTsKK0ZQREZfRVhQT1JUIEZQREZfRE9DVU1FTlQgRlBERl9DQUxMQ09OVgorRlBERl9Mb2FkRG9jdW1lbnQoRlBERl9TVFJJTkcgZmlsZV9wYXRoLCBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpOwogCiAvLyBGdW5jdGlvbjogRlBERl9Mb2FkTWVtRG9jdW1lbnQKIC8vICAgICAgICAgIE9wZW4gYW5kIGxvYWQgYSBQREYgZG9jdW1lbnQgZnJvbSBtZW1vcnkuCkBAIC0yODksOSArMzI3LDggQEAKIC8vICAgICAgICAgIElmIFBERml1bSBpcyBidWlsdCB3aXRoIHRoZSBYRkEgbW9kdWxlLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGNhbGwKIC8vICAgICAgICAgIEZQREZfTG9hZFhGQSgpIGZ1bmN0aW9uIGFmdGVyIHRoZSBQREYgZG9jdW1lbnQgbG9hZGVkIHRvIHN1cHBvcnQgWEZBCiAvLyAgICAgICAgICBmaWVsZHMgZGVmaW5lZCBpbiB0aGUgZnBkZmZvcm1maWxsLmggZmlsZS4KLURMTEVYUE9SVCBGUERGX0RPQ1VNRU5UIFNURENBTEwgRlBERl9Mb2FkTWVtRG9jdW1lbnQoY29uc3Qgdm9pZCogZGF0YV9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcgcGFzc3dvcmQpOworRlBERl9FWFBPUlQgRlBERl9ET0NVTUVOVCBGUERGX0NBTExDT05WCitGUERGX0xvYWRNZW1Eb2N1bWVudChjb25zdCB2b2lkKiBkYXRhX2J1ZiwgaW50IHNpemUsIEZQREZfQllURVNUUklORyBwYXNzd29yZCk7CiAKIC8vIFN0cnVjdHVyZSBmb3IgY3VzdG9tIGZpbGUgYWNjZXNzLgogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtNDE2LDcgKzQ1Myw3IEBACiAvLyAgICAgICAgICBJZiBQREZpdW0gaXMgYnVpbHQgd2l0aCB0aGUgWEZBIG1vZHVsZSwgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBjYWxsCiAvLyAgICAgICAgICBGUERGX0xvYWRYRkEoKSBmdW5jdGlvbiBhZnRlciB0aGUgUERGIGRvY3VtZW50IGxvYWRlZCB0byBzdXBwb3J0IFhGQQogLy8gICAgICAgICAgZmllbGRzIGRlZmluZWQgaW4gdGhlIGZwZGZmb3JtZmlsbC5oIGZpbGUuCi1ETExFWFBPUlQgRlBERl9ET0NVTUVOVCBTVERDQUxMCitGUERGX0VYUE9SVCBGUERGX0RPQ1VNRU5UIEZQREZfQ0FMTENPTlYKIEZQREZfTG9hZEN1c3RvbURvY3VtZW50KEZQREZfRklMRUFDQ0VTUyogcEZpbGVBY2Nlc3MsIEZQREZfQllURVNUUklORyBwYXNzd29yZCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX0dldEZpbGVWZXJzaW9uCkBAIC00MzAsOCArNDY3LDggQEAKIC8vIENvbW1lbnRzOgogLy8gICAgICAgICAgSWYgdGhlIGRvY3VtZW50IHdhcyBjcmVhdGVkIGJ5IEZQREZfQ3JlYXRlTmV3RG9jdW1lbnQsCiAvLyAgICAgICAgICB0aGVuIHRoaXMgZnVuY3Rpb24gd2lsbCBhbHdheXMgZmFpbC4KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTCBGUERGX0dldEZpbGVWZXJzaW9uKEZQREZfRE9DVU1FTlQgZG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBmaWxlVmVyc2lvbik7CitGUERGX0VYUE9SVCBGUERGX0JPT0wgRlBERl9DQUxMQ09OViBGUERGX0dldEZpbGVWZXJzaW9uKEZQREZfRE9DVU1FTlQgZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGZpbGVWZXJzaW9uKTsKIAogI2RlZmluZSBGUERGX0VSUl9TVUNDRVNTIDAgICAgLy8gTm8gZXJyb3IuCiAjZGVmaW5lIEZQREZfRVJSX1VOS05PV04gMSAgICAvLyBVbmtub3duIGVycm9yLgpAQCAtNDU0LDcgKzQ5MSw3IEBACiAvLyBDb21tZW50czoKIC8vICAgICAgICAgIElmIHRoZSBwcmV2aW91cyBTREsgY2FsbCBzdWNjZWVkZWQsIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcwogLy8gICAgICAgICAgZnVuY3Rpb24gaXMgbm90IGRlZmluZWQuCi1ETExFWFBPUlQgdW5zaWduZWQgbG9uZyBTVERDQUxMIEZQREZfR2V0TGFzdEVycm9yKCk7CitGUERGX0VYUE9SVCB1bnNpZ25lZCBsb25nIEZQREZfQ0FMTENPTlYgRlBERl9HZXRMYXN0RXJyb3IoKTsKIAogLy8gRnVuY3Rpb246IEZQREZfR2V0RG9jUGVybWlzc2lvbgogLy8gICAgICAgICAgR2V0IGZpbGUgcGVybWlzc2lvbiBmbGFncyBvZiB0aGUgZG9jdW1lbnQuCkBAIC00NjQsNyArNTAxLDggQEAKIC8vICAgICAgICAgIEEgMzItYml0IGludGVnZXIgaW5kaWNhdGluZyBwZXJtaXNzaW9uIGZsYWdzLiBQbGVhc2UgcmVmZXIgdG8gdGhlCiAvLyAgICAgICAgICBQREYgUmVmZXJlbmNlIGZvciBkZXRhaWxlZCBkZXNjcmlwdGlvbnMuIElmIHRoZSBkb2N1bWVudCBpcyBub3QKIC8vICAgICAgICAgIHByb3RlY3RlZCwgMHhmZmZmZmZmZiB3aWxsIGJlIHJldHVybmVkLgotRExMRVhQT1JUIHVuc2lnbmVkIGxvbmcgU1REQ0FMTCBGUERGX0dldERvY1Blcm1pc3Npb25zKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOworRlBERl9FWFBPUlQgdW5zaWduZWQgbG9uZyBGUERGX0NBTExDT05WCitGUERGX0dldERvY1Blcm1pc3Npb25zKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOwogCiAvLyBGdW5jdGlvbjogRlBERl9HZXRTZWN1cml0eUhhbmRsZXJSZXZpc2lvbgogLy8gICAgICAgICAgR2V0IHRoZSByZXZpc2lvbiBmb3IgdGhlIHNlY3VyaXR5IGhhbmRsZXIuCkBAIC00NzQsNyArNTEyLDggQEAKIC8vICAgICAgICAgIFRoZSBzZWN1cml0eSBoYW5kbGVyIHJldmlzaW9uIG51bWJlci4gUGxlYXNlIHJlZmVyIHRvIHRoZSBQREYKIC8vICAgICAgICAgIFJlZmVyZW5jZSBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbi4gSWYgdGhlIGRvY3VtZW50IGlzIG5vdAogLy8gICAgICAgICAgcHJvdGVjdGVkLCAtMSB3aWxsIGJlIHJldHVybmVkLgotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfR2V0U2VjdXJpdHlIYW5kbGVyUmV2aXNpb24oRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7CitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OVgorRlBERl9HZXRTZWN1cml0eUhhbmRsZXJSZXZpc2lvbihGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKIAogLy8gRnVuY3Rpb246IEZQREZfR2V0UGFnZUNvdW50CiAvLyAgICAgICAgICBHZXQgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIGluIHRoZSBkb2N1bWVudC4KQEAgLTQ4Miw3ICs1MjEsNyBAQAogLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byBkb2N1bWVudC4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkRG9jdW1lbnQuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUb3RhbCBudW1iZXIgb2YgcGFnZXMgaW4gdGhlIGRvY3VtZW50LgotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZfR2V0UGFnZUNvdW50KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERl9HZXRQYWdlQ291bnQoRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX0xvYWRQYWdlCiAvLyAgICAgICAgICBMb2FkIGEgcGFnZSBpbnNpZGUgdGhlIGRvY3VtZW50LgpAQCAtNDk0LDggKzUzMyw4IEBACiAvLyBDb21tZW50czoKIC8vICAgICAgICAgIFRoZSBsb2FkZWQgcGFnZSBjYW4gYmUgcmVuZGVyZWQgdG8gZGV2aWNlcyB1c2luZyBGUERGX1JlbmRlclBhZ2UuCiAvLyAgICAgICAgICBUaGUgbG9hZGVkIHBhZ2UgY2FuIGJlIGNsb3NlZCB1c2luZyBGUERGX0Nsb3NlUGFnZS4KLURMTEVYUE9SVCBGUERGX1BBR0UgU1REQ0FMTCBGUERGX0xvYWRQYWdlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFnZV9pbmRleCk7CitGUERGX0VYUE9SVCBGUERGX1BBR0UgRlBERl9DQUxMQ09OViBGUERGX0xvYWRQYWdlKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWdlX2luZGV4KTsKIAogLy8gRnVuY3Rpb246IEZQREZfR2V0UGFnZVdpZHRoCiAvLyAgICAgICAgICBHZXQgcGFnZSB3aWR0aC4KQEAgLTUwNCw3ICs1NDMsNyBAQAogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgUGFnZSB3aWR0aCAoZXhjbHVkaW5nIG5vbi1kaXNwbGF5YWJsZSBhcmVhKSBtZWFzdXJlZCBpbiBwb2ludHMuCiAvLyAgICAgICAgICBPbmUgcG9pbnQgaXMgMS83MiBpbmNoIChhcm91bmQgMC4zNTI4IG1tKS4KLURMTEVYUE9SVCBkb3VibGUgU1REQ0FMTCBGUERGX0dldFBhZ2VXaWR0aChGUERGX1BBR0UgcGFnZSk7CitGUERGX0VYUE9SVCBkb3VibGUgRlBERl9DQUxMQ09OViBGUERGX0dldFBhZ2VXaWR0aChGUERGX1BBR0UgcGFnZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX0dldFBhZ2VIZWlnaHQKIC8vICAgICAgICAgIEdldCBwYWdlIGhlaWdodC4KQEAgLTUxMyw3ICs1NTIsMjAgQEAKIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFBhZ2UgaGVpZ2h0IChleGNsdWRpbmcgbm9uLWRpc3BsYXlhYmxlIGFyZWEpIG1lYXN1cmVkIGluIHBvaW50cy4KIC8vICAgICAgICAgIE9uZSBwb2ludCBpcyAxLzcyIGluY2ggKGFyb3VuZCAwLjM1MjggbW0pCi1ETExFWFBPUlQgZG91YmxlIFNURENBTEwgRlBERl9HZXRQYWdlSGVpZ2h0KEZQREZfUEFHRSBwYWdlKTsKK0ZQREZfRVhQT1JUIGRvdWJsZSBGUERGX0NBTExDT05WIEZQREZfR2V0UGFnZUhlaWdodChGUERGX1BBR0UgcGFnZSk7CisKKy8vIEV4cGVyaW1lbnRhbCBBUEkuCisvLyBGdW5jdGlvbjogRlBERl9HZXRQYWdlQm91bmRpbmdCb3gKKy8vICAgICAgICAgIEdldCB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBwYWdlLiBUaGlzIGlzIHRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbgorLy8gICAgICAgICAgaXRzIG1lZGlhIGJveCBhbmQgaXRzIGNyb3AgYm94LgorLy8gUGFyYW1ldGVyczoKKy8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UuCisvLyAgICAgICAgICByZWN0ICAgICAgICAtICAgUG9pbnRlciB0byBhIHJlY3QgdG8gcmVjZWl2ZSB0aGUgcGFnZSBib3VuZGluZyBib3guCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgT24gYW4gZXJyb3IsIHxyZWN0fCB3b24ndCBiZSBmaWxsZWQuCisvLyBSZXR1cm4gdmFsdWU6CisvLyAgICAgICAgICBUcnVlIGZvciBzdWNjZXNzLgorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYgRlBERl9HZXRQYWdlQm91bmRpbmdCb3goRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU19SRUNURiogcmVjdCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX0dldFBhZ2VTaXplQnlJbmRleAogLy8gICAgICAgICAgR2V0IHRoZSBzaXplIG9mIHRoZSBwYWdlIGF0IHRoZSBnaXZlbiBpbmRleC4KQEAgLTUyNiwxMCArNTc4LDEwIEBACiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgKGluIHBvaW50cykuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBOb24temVybyBmb3Igc3VjY2Vzcy4gMCBmb3IgZXJyb3IgKGRvY3VtZW50IG9yIHBhZ2Ugbm90IGZvdW5kKS4KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGX0dldFBhZ2VTaXplQnlJbmRleChGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWdlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBoZWlnaHQpOworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERl9HZXRQYWdlU2l6ZUJ5SW5kZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWdlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogaGVpZ2h0KTsKIAogLy8gUGFnZSByZW5kZXJpbmcgZmxhZ3MuIFRoZXkgY2FuIGJlIGNvbWJpbmVkIHdpdGggYml0LXdpc2UgT1IuCiAvLwpAQCAtNTgzLDE0ICs2MzUsMTQgQEAKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGFib3ZlLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTm9uZS4KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9SZW5kZXJQYWdlKEhEQyBkYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRlBERl9SZW5kZXJQYWdlKEhEQyBkYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKICNlbmRpZgogCiAvLyBGdW5jdGlvbjogRlBERl9SZW5kZXJQYWdlQml0bWFwCkBAIC01OTgsNyArNjUwLDggQEAKIC8vIFBhcmFtZXRlcnM6CiAvLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBkZXZpY2UgaW5kZXBlbmRlbnQgYml0bWFwIChhcyB0aGUKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgYnVmZmVyKS4gVGhlIGJpdG1hcCBoYW5kbGUgY2FuIGJlIGNyZWF0ZWQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICBieSBGUERGQml0bWFwX0NyZWF0ZS4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBieSBGUERGQml0bWFwX0NyZWF0ZSBvciByZXRyaWV2ZWQgZnJvbSBhbiBpbWFnZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBieSBGUERGSW1hZ2VPYmpfR2V0Qml0bWFwLgogLy8gICAgICAgICAgcGFnZSAgICAgICAgLSAgIEhhbmRsZSB0byB0aGUgcGFnZS4gUmV0dXJuZWQgYnkgRlBERl9Mb2FkUGFnZQogLy8gICAgICAgICAgc3RhcnRfeCAgICAgLSAgIExlZnQgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGRpc3BsYXkgYXJlYSBpbgogLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcCBjb29yZGluYXRlcy4KQEAgLTYxOCw0MSArNjcxLDQ0IEBACiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0IGFuZCBwb3B1cCBhbm5vdGF0aW9ucy4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5vbmUuCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfUmVuZGVyUGFnZUJpdG1hcChGUERGX0JJVE1BUCBiaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZfUmVuZGVyUGFnZUJpdG1hcChGUERGX0JJVE1BUCBiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX1JlbmRlclBhZ2VCaXRtYXBXaXRoTWF0cml4CiAvLyAgICAgICAgICBSZW5kZXIgY29udGVudHMgb2YgYSBwYWdlIHRvIGEgZGV2aWNlIGluZGVwZW5kZW50IGJpdG1hcC4KIC8vIFBhcmFtZXRlcnM6CiAvLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBkZXZpY2UgaW5kZXBlbmRlbnQgYml0bWFwIChhcyB0aGUKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgYnVmZmVyKS4gVGhlIGJpdG1hcCBoYW5kbGUgY2FuIGJlIGNyZWF0ZWQKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICBieSBGUERGQml0bWFwX0NyZWF0ZS4KLS8vICAgICAgICAgIHBhZ2UgICAgICAgIC0gICBIYW5kbGUgdG8gdGhlIHBhZ2UuIFJldHVybmVkIGJ5IEZQREZfTG9hZFBhZ2UKLS8vICAgICAgICAgIG1hdHJpeCAgICAgIC0gICBUaGUgdHJhbnNmb3JtIG1hdHJpeC4KLS8vICAgICAgICAgIGNsaXBwaW5nICAgIC0gICBUaGUgcmVjdCB0byBjbGlwIHRvLgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IEZQREZCaXRtYXBfQ3JlYXRlIG9yIHJldHJpZXZlZCBieQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZJbWFnZU9ial9HZXRCaXRtYXAuCisvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBwYWdlLiBSZXR1cm5lZCBieSBGUERGX0xvYWRQYWdlLgorLy8gICAgICAgICAgbWF0cml4ICAgICAgLSAgIFRoZSB0cmFuc2Zvcm0gbWF0cml4LCB3aGljaCBtdXN0IGJlIGludmVydGlibGUuCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIFBERiBSZWZlcmVuY2UgMS43LCA0LjIuMiBDb21tb24gVHJhbnNmb3JtYXRpb25zLgorLy8gICAgICAgICAgY2xpcHBpbmcgICAgLSAgIFRoZSByZWN0IHRvIGNsaXAgdG8gaW4gZGV2aWNlIGNvb3Jkcy4KIC8vICAgICAgICAgIGZsYWdzICAgICAgIC0gICAwIGZvciBub3JtYWwgZGlzcGxheSwgb3IgY29tYmluYXRpb24gb2YgdGhlIFBhZ2UKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJpbmcgZmxhZ3MgZGVmaW5lZCBhYm92ZS4gV2l0aCB0aGUgRlBERl9BTk5PVAogLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcsIGl0IHJlbmRlcnMgYWxsIGFubm90YXRpb25zIHRoYXQgZG8gbm90IHJlcXVpcmUKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLWludGVyYWN0aW9uLCB3aGljaCBhcmUgYWxsIGFubm90YXRpb25zIGV4Y2VwdAogLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldCBhbmQgcG9wdXAgYW5ub3RhdGlvbnMuCiAvLyBSZXR1cm4gdmFsdWU6Ci0vLyAgICAgICAgICBOb25lLgotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX1JlbmRlclBhZ2VCaXRtYXBXaXRoTWF0cml4KEZQREZfQklUTUFQIGJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGU19NQVRSSVgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGU19SRUNURiogY2xpcHBpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKKy8vICAgICAgICAgIE5vbmUuIE5vdGUgdGhhdCBiZWhhdmlvciBpcyB1bmRlZmluZWQgaWYgZGV0IG9mIHxtYXRyaXh8IGlzIDAuCitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYKK0ZQREZfUmVuZGVyUGFnZUJpdG1hcFdpdGhNYXRyaXgoRlBERl9CSVRNQVAgYml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlNfTUFUUklYKiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZTX1JFQ1RGKiBjbGlwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKIAogI2lmZGVmIF9TS0lBX1NVUFBPUlRfCi1ETExFWFBPUlQgRlBERl9SRUNPUkRFUiBTVERDQUxMIEZQREZfUmVuZGVyUGFnZVNrcChGUERGX1BBR0UgcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95KTsKK0ZQREZfRVhQT1JUIEZQREZfUkVDT1JERVIgRlBERl9DQUxMQ09OViBGUERGX1JlbmRlclBhZ2VTa3AoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3kpOwogI2VuZGlmCiAKIC8vIEZ1bmN0aW9uOiBGUERGX0Nsb3NlUGFnZQpAQCAtNjYxLDcgKzcxNyw3IEBACiAvLyAgICAgICAgICBwYWdlICAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBsb2FkZWQgcGFnZS4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5vbmUuCi1ETExFWFBPUlQgdm9pZCBTVERDQUxMIEZQREZfQ2xvc2VQYWdlKEZQREZfUEFHRSBwYWdlKTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGX0Nsb3NlUGFnZShGUERGX1BBR0UgcGFnZSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX0Nsb3NlRG9jdW1lbnQKIC8vICAgICAgICAgIENsb3NlIGEgbG9hZGVkIFBERiBkb2N1bWVudC4KQEAgLTY2OSw3ICs3MjUsNyBAQAogLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgbG9hZGVkIGRvY3VtZW50LgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTm9uZS4KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9DbG9zZURvY3VtZW50KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZfQ2xvc2VEb2N1bWVudChGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKIAogLy8gRnVuY3Rpb246IEZQREZfRGV2aWNlVG9QYWdlCiAvLyAgICAgICAgICBDb252ZXJ0IHRoZSBzY3JlZW4gY29vcmRpbmF0ZXMgb2YgYSBwb2ludCB0byBwYWdlIGNvb3JkaW5hdGVzLgpAQCAtNzExLDE2ICs3NjcsMTYgQEAKIC8vICAgICAgICAgIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUgc3RhcnRfeCwgc3RhcnRfeSwgc2l6ZV94LCBzaXplX3kKIC8vICAgICAgICAgIGFuZCByb3RhdGUgcGFyYW1ldGVycyBoYXZlIGV4YWN0bHkgc2FtZSB2YWx1ZXMgYXMgeW91IHVzZWQgaW4KIC8vICAgICAgICAgIHRoZSBGUERGX1JlbmRlclBhZ2UoKSBmdW5jdGlvbiBjYWxsLgotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGX0RldmljZVRvUGFnZShGUERGX1BBR0UgcGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGV2aWNlX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXZpY2VfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBwYWdlX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcGFnZV95KTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGX0RldmljZVRvUGFnZShGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGV2aWNlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRldmljZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcGFnZV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcGFnZV95KTsKIAogLy8gRnVuY3Rpb246IEZQREZfUGFnZVRvRGV2aWNlCiAvLyAgICAgICAgICBDb252ZXJ0IHRoZSBwYWdlIGNvb3JkaW5hdGVzIG9mIGEgcG9pbnQgdG8gc2NyZWVuIGNvb3JkaW5hdGVzLgpAQCAtNzQ3LDE2ICs4MDMsMTYgQEAKIC8vICAgICAgICAgIE5vbmUuCiAvLyBDb21tZW50czoKIC8vICAgICAgICAgIFNlZSBjb21tZW50cyBmb3IgRlBERl9EZXZpY2VUb1BhZ2UoKS4KLURMTEVYUE9SVCB2b2lkIFNURENBTEwgRlBERl9QYWdlVG9EZXZpY2UoRlBERl9QQUdFIHBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZXZpY2VfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZXZpY2VfeSk7CitGUERGX0VYUE9SVCB2b2lkIEZQREZfQ0FMTENPTlYgRlBERl9QYWdlVG9EZXZpY2UoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhZ2VfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFnZV95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZGV2aWNlX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZXZpY2VfeSk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGQml0bWFwX0NyZWF0ZQogLy8gICAgICAgICAgQ3JlYXRlIGEgZGV2aWNlIGluZGVwZW5kZW50IGJpdG1hcCAoRlhESUIpLgpAQCAtNzg3LDExICs4NDMsMTMgQEAKIC8vICAgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGVub3VnaCBtZW1vcnkgZm9yIGhvbGRpbmcgYWxsIHBpeGVscyBpbiB0aGUKIC8vICAgICAgICAgIGJpdG1hcCwgYnV0IGl0IGRvZXNuJ3QgaW5pdGlhbGl6ZSB0aGUgYnVmZmVyLiBBcHBsaWNhdGlvbnMgY2FuIHVzZQogLy8gICAgICAgICAgRlBERkJpdG1hcF9GaWxsUmVjdCB0byBmaWxsIHRoZSBiaXRtYXAgdXNpbmcgYW55IGNvbG9yLgotRExMRVhQT1JUIEZQREZfQklUTUFQIFNURENBTEwgRlBERkJpdG1hcF9DcmVhdGUoaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHBoYSk7CitGUERGX0VYUE9SVCBGUERGX0JJVE1BUCBGUERGX0NBTExDT05WIEZQREZCaXRtYXBfQ3JlYXRlKGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhKTsKIAogLy8gTW9yZSBESUIgZm9ybWF0cworLy8gVW5rbm93biBvciB1bnN1cHBvcnRlZCBmb3JtYXQuCisjZGVmaW5lIEZQREZCaXRtYXBfVW5rbm93biAwCiAvLyBHcmF5IHNjYWxlIGJpdG1hcCwgb25lIGJ5dGUgcGVyIHBpeGVsLgogI2RlZmluZSBGUERGQml0bWFwX0dyYXkgMQogLy8gMyBieXRlcyBwZXIgcGl4ZWwsIGJ5dGUgb3JkZXI6IGJsdWUsIGdyZWVuLCByZWQuCkBAIC04MjYsMTEgKzg4NCwyMyBAQAogLy8gICAgICAgICAgSWYgYW4gZXh0ZXJuYWwgYnVmZmVyIGlzIHVzZWQsIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBkZXN0cm95CiAvLyAgICAgICAgICB0aGUgYnVmZmVyIGJ5IGl0c2VsZi4gRlBERkJpdG1hcF9EZXN0cm95IGZ1bmN0aW9uIHdpbGwgbm90IGRlc3Ryb3kKIC8vICAgICAgICAgIHRoZSBidWZmZXIuCi1ETExFWFBPUlQgRlBERl9CSVRNQVAgU1REQ0FMTCBGUERGQml0bWFwX0NyZWF0ZUV4KGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZmlyc3Rfc2NhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSk7CitGUERGX0VYUE9SVCBGUERGX0JJVE1BUCBGUERGX0NBTExDT05WIEZQREZCaXRtYXBfQ3JlYXRlRXgoaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBmaXJzdF9zY2FuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpOworCisvLyBGdW5jdGlvbjogRlBERkJpdG1hcF9HZXRGb3JtYXQKKy8vICAgICAgICAgIEdldCB0aGUgZm9ybWF0IG9mIHRoZSBiaXRtYXAuCisvLyBQYXJhbWV0ZXJzOgorLy8gICAgICAgICAgYml0bWFwICAgICAgLSAgIEhhbmRsZSB0byB0aGUgYml0bWFwLiBSZXR1cm5lZCBieSBGUERGQml0bWFwX0NyZWF0ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIG9yIEZQREZJbWFnZU9ial9HZXRCaXRtYXAuCisvLyBSZXR1cm4gdmFsdWU6CisvLyAgICAgICAgICBUaGUgZm9ybWF0IG9mIHRoZSBiaXRtYXAuCisvLyBDb21tZW50czoKKy8vICAgICAgICAgIE9ubHkgZm9ybWF0cyBzdXBwb3J0ZWQgYnkgRlBERkJpdG1hcF9DcmVhdGVFeCBhcmUgc3VwcG9ydGVkIGJ5IHRoaXMKKy8vICAgICAgICAgIGZ1bmN0aW9uOyBzZWUgdGhlIGxpc3Qgb2Ygc3VjaCBmb3JtYXRzIGFib3ZlLgorRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERkJpdG1hcF9HZXRGb3JtYXQoRlBERl9CSVRNQVAgYml0bWFwKTsKIAogLy8gRnVuY3Rpb246IEZQREZCaXRtYXBfRmlsbFJlY3QKIC8vICAgICAgICAgIEZpbGwgYSByZWN0YW5nbGUgaW4gYSBiaXRtYXAuCkBAIC04NTYsMTcgKzkyNiwxOCBAQAogLy8gICAgICAgICAgYmFja2dyb3VuZCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBzb3VyY2UgY29sb3IgYW5kIHRoZSBhbHBoYS4KIC8vCiAvLyAgICAgICAgICBJZiB0aGUgYWxwaGEgY2hhbm5lbCBpcyBub3QgdXNlZCwgdGhlIGFscGhhIHBhcmFtZXRlciBpcyBpZ25vcmVkLgotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGQml0bWFwX0ZpbGxSZWN0KEZQREZfQklUTUFQIGJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgY29sb3IpOworRlBERl9FWFBPUlQgdm9pZCBGUERGX0NBTExDT05WIEZQREZCaXRtYXBfRmlsbFJlY3QoRlBERl9CSVRNQVAgYml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRFdPUkQgY29sb3IpOwogCiAvLyBGdW5jdGlvbjogRlBERkJpdG1hcF9HZXRCdWZmZXIKIC8vICAgICAgICAgIEdldCBkYXRhIGJ1ZmZlciBvZiBhIGJpdG1hcC4KIC8vIFBhcmFtZXRlcnM6Ci0vLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBiaXRtYXAuIFJldHVybmVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlLgorLy8gICAgICAgICAgYml0bWFwICAgICAgLSAgIEhhbmRsZSB0byB0aGUgYml0bWFwLiBSZXR1cm5lZCBieSBGUERGQml0bWFwX0NyZWF0ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIG9yIEZQREZJbWFnZU9ial9HZXRCaXRtYXAuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUaGUgcG9pbnRlciB0byB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgYml0bWFwIGJ1ZmZlci4KIC8vIENvbW1lbnRzOgpAQCAtODc4LDQ0ICs5NDksNDggQEAKIC8vCiAvLyAgICAgICAgICBUaGUgZGF0YSBpcyBpbiBCR1JBIGZvcm1hdC4gV2hlcmUgdGhlIEEgbWF5YmUgdW51c2VkIGlmIGFscGhhIHdhcwogLy8gICAgICAgICAgbm90IHNwZWNpZmllZC4KLURMTEVYUE9SVCB2b2lkKiBTVERDQUxMIEZQREZCaXRtYXBfR2V0QnVmZmVyKEZQREZfQklUTUFQIGJpdG1hcCk7CitGUERGX0VYUE9SVCB2b2lkKiBGUERGX0NBTExDT05WIEZQREZCaXRtYXBfR2V0QnVmZmVyKEZQREZfQklUTUFQIGJpdG1hcCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGQml0bWFwX0dldFdpZHRoCiAvLyAgICAgICAgICBHZXQgd2lkdGggb2YgYSBiaXRtYXAuCiAvLyBQYXJhbWV0ZXJzOgotLy8gICAgICAgICAgYml0bWFwICAgICAgLSAgIEhhbmRsZSB0byB0aGUgYml0bWFwLiBSZXR1cm5lZCBieSBGUERGQml0bWFwX0NyZWF0ZS4KKy8vICAgICAgICAgIGJpdG1hcCAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGJpdG1hcC4gUmV0dXJuZWQgYnkgRlBERkJpdG1hcF9DcmVhdGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBvciBGUERGSW1hZ2VPYmpfR2V0Qml0bWFwLgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVGhlIHdpZHRoIG9mIHRoZSBiaXRtYXAgaW4gcGl4ZWxzLgotRExMRVhQT1JUIGludCBTVERDQUxMIEZQREZCaXRtYXBfR2V0V2lkdGgoRlBERl9CSVRNQVAgYml0bWFwKTsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZCaXRtYXBfR2V0V2lkdGgoRlBERl9CSVRNQVAgYml0bWFwKTsKIAogLy8gRnVuY3Rpb246IEZQREZCaXRtYXBfR2V0SGVpZ2h0CiAvLyAgICAgICAgICBHZXQgaGVpZ2h0IG9mIGEgYml0bWFwLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGJpdG1hcCAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGJpdG1hcC4gUmV0dXJuZWQgYnkgRlBERkJpdG1hcF9DcmVhdGUuCisvLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBiaXRtYXAuIFJldHVybmVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgRlBERkltYWdlT2JqX0dldEJpdG1hcC4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSBoZWlnaHQgb2YgdGhlIGJpdG1hcCBpbiBwaXhlbHMuCi1ETExFWFBPUlQgaW50IFNURENBTEwgRlBERkJpdG1hcF9HZXRIZWlnaHQoRlBERl9CSVRNQVAgYml0bWFwKTsKK0ZQREZfRVhQT1JUIGludCBGUERGX0NBTExDT05WIEZQREZCaXRtYXBfR2V0SGVpZ2h0KEZQREZfQklUTUFQIGJpdG1hcCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGQml0bWFwX0dldFN0cmlkZQogLy8gICAgICAgICAgR2V0IG51bWJlciBvZiBieXRlcyBmb3IgZWFjaCBsaW5lIGluIHRoZSBiaXRtYXAgYnVmZmVyLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGJpdG1hcCAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGJpdG1hcC4gUmV0dXJuZWQgYnkgRlBERkJpdG1hcF9DcmVhdGUuCisvLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBiaXRtYXAuIFJldHVybmVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgRlBERkltYWdlT2JqX0dldEJpdG1hcC4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgZm9yIGVhY2ggbGluZSBpbiB0aGUgYml0bWFwIGJ1ZmZlci4KIC8vIENvbW1lbnRzOgogLy8gICAgICAgICAgVGhlIHN0cmlkZSBtYXkgYmUgbW9yZSB0aGFuIHdpZHRoICogbnVtYmVyIG9mIGJ5dGVzIHBlciBwaXhlbC4KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGQml0bWFwX0dldFN0cmlkZShGUERGX0JJVE1BUCBiaXRtYXApOworRlBERl9FWFBPUlQgaW50IEZQREZfQ0FMTENPTlYgRlBERkJpdG1hcF9HZXRTdHJpZGUoRlBERl9CSVRNQVAgYml0bWFwKTsKIAogLy8gRnVuY3Rpb246IEZQREZCaXRtYXBfRGVzdHJveQogLy8gICAgICAgICAgRGVzdHJveSBhIGJpdG1hcCBhbmQgcmVsZWFzZSBhbGwgcmVsYXRlZCBidWZmZXJzLgogLy8gUGFyYW1ldGVyczoKLS8vICAgICAgICAgIGJpdG1hcCAgICAgIC0gICBIYW5kbGUgdG8gdGhlIGJpdG1hcC4gUmV0dXJuZWQgYnkgRlBERkJpdG1hcF9DcmVhdGUuCisvLyAgICAgICAgICBiaXRtYXAgICAgICAtICAgSGFuZGxlIHRvIHRoZSBiaXRtYXAuIFJldHVybmVkIGJ5IEZQREZCaXRtYXBfQ3JlYXRlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgRlBERkltYWdlT2JqX0dldEJpdG1hcC4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIE5vbmUuCiAvLyBDb21tZW50czoKIC8vICAgICAgICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBub3QgZGVzdHJveSBhbnkgZXh0ZXJuYWwgYnVmZmVycyBwcm92aWRlZCB3aGVuCiAvLyAgICAgICAgICB0aGUgYml0bWFwIHdhcyBjcmVhdGVkLgotRExMRVhQT1JUIHZvaWQgU1REQ0FMTCBGUERGQml0bWFwX0Rlc3Ryb3koRlBERl9CSVRNQVAgYml0bWFwKTsKK0ZQREZfRVhQT1JUIHZvaWQgRlBERl9DQUxMQ09OViBGUERGQml0bWFwX0Rlc3Ryb3koRlBERl9CSVRNQVAgYml0bWFwKTsKIAogLy8gRnVuY3Rpb246IEZQREZfVklFV0VSUkVGX0dldFByaW50U2NhbGluZwogLy8gICAgICAgICAgV2hldGhlciB0aGUgUERGIGRvY3VtZW50IHByZWZlcnMgdG8gYmUgc2NhbGVkIG9yIG5vdC4KQEAgLTkyMyw3ICs5OTgsNyBAQAogLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgbG9hZGVkIGRvY3VtZW50LgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgTm9uZS4KLURMTEVYUE9SVCBGUERGX0JPT0wgU1REQ0FMTAorRlBERl9FWFBPUlQgRlBERl9CT09MIEZQREZfQ0FMTENPTlYKIEZQREZfVklFV0VSUkVGX0dldFByaW50U2NhbGluZyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKIAogLy8gRnVuY3Rpb246IEZQREZfVklFV0VSUkVGX0dldE51bUNvcGllcwpAQCAtOTMyLDcgKzEwMDcsOCBAQAogLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgbG9hZGVkIGRvY3VtZW50LgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVGhlIG51bWJlciBvZiBjb3BpZXMgdG8gYmUgcHJpbnRlZC4KLURMTEVYUE9SVCBpbnQgU1REQ0FMTCBGUERGX1ZJRVdFUlJFRl9HZXROdW1Db3BpZXMoRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7CitGUERGX0VYUE9SVCBpbnQgRlBERl9DQUxMQ09OVgorRlBERl9WSUVXRVJSRUZfR2V0TnVtQ29waWVzKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQpOwogCiAvLyBGdW5jdGlvbjogRlBERl9WSUVXRVJSRUZfR2V0UHJpbnRQYWdlUmFuZ2UKIC8vICAgICAgICAgIFBhZ2UgbnVtYmVycyB0byBpbml0aWFsaXplIHByaW50IGRpYWxvZyBib3ggd2hlbiBmaWxlIGlzIHByaW50ZWQuCkBAIC05NDAsNyArMTAxNiw3IEBACiAvLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIHRoZSBsb2FkZWQgZG9jdW1lbnQuCiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUaGUgcHJpbnQgcGFnZSByYW5nZSB0byBiZSB1c2VkIGZvciBwcmludGluZy4KLURMTEVYUE9SVCBGUERGX1BBR0VSQU5HRSBTVERDQUxMCitGUERGX0VYUE9SVCBGUERGX1BBR0VSQU5HRSBGUERGX0NBTExDT05WCiBGUERGX1ZJRVdFUlJFRl9HZXRQcmludFBhZ2VSYW5nZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKIAogLy8gRnVuY3Rpb246IEZQREZfVklFV0VSUkVGX0dldER1cGxleApAQCAtOTUwLDcgKzEwMjYsNyBAQAogLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byB0aGUgbG9hZGVkIGRvY3VtZW50LgogLy8gUmV0dXJuIHZhbHVlOgogLy8gICAgICAgICAgVGhlIHBhcGVyIGhhbmRsaW5nIG9wdGlvbiB0byBiZSB1c2VkIHdoZW4gcHJpbnRpbmcuCi1ETExFWFBPUlQgRlBERl9EVVBMRVhUWVBFIFNURENBTEwKK0ZQREZfRVhQT1JUIEZQREZfRFVQTEVYVFlQRSBGUERGX0NBTExDT05WCiBGUERGX1ZJRVdFUlJFRl9HZXREdXBsZXgoRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX1ZJRVdFUlJFRl9HZXROYW1lCkBAIC05NTgsNyArMTAzNCw4IEBACiAvLyAgICAgICAgICBiZSBvZiB0eXBlICJuYW1lIi4KIC8vIFBhcmFtZXRlcnM6CiAvLyAgICAgICAgICBkb2N1bWVudCAgICAtICAgSGFuZGxlIHRvIHRoZSBsb2FkZWQgZG9jdW1lbnQuCi0vLyAgICAgICAgICBrZXkgICAgICAgICAtICAgTmFtZSBvZiB0aGUga2V5IGluIHRoZSB2aWV3ZXIgcHJlZiBkaWN0aW9uYXJ5LgorLy8gICAgICAgICAga2V5ICAgICAgICAgLSAgIE5hbWUgb2YgdGhlIGtleSBpbiB0aGUgdmlld2VyIHByZWYgZGljdGlvbmFyeSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkIGluIFVURi04LgogLy8gICAgICAgICAgYnVmZmVyICAgICAgLSAgIEEgc3RyaW5nIHRvIHdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGUga2V5IHRvLgogLy8gICAgICAgICAgbGVuZ3RoICAgICAgLSAgIExlbmd0aCBvZiB0aGUgYnVmZmVyLgogLy8gUmV0dXJuIHZhbHVlOgpAQCAtOTY3LDEwICsxMDQ0LDExIEBACiAvLyAgICAgICAgICBhcyB3aGVuIHxkb2N1bWVudHwgaXMgaW52YWxpZCBvciB8YnVmZmVyfCBpcyBOVUxMLiBJZiB8bGVuZ3RofCBpcwogLy8gICAgICAgICAgbGVzcyB0aGFuIHRoZSByZXR1cm5lZCBsZW5ndGgsIG9yIHxidWZmZXJ8IGlzIE5VTEwsIHxidWZmZXJ8IHdpbGwKIC8vICAgICAgICAgIG5vdCBiZSBtb2RpZmllZC4KLURMTEVYUE9SVCB1bnNpZ25lZCBsb25nIFNURENBTEwgRlBERl9WSUVXRVJSRUZfR2V0TmFtZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfQllURVNUUklORyBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKTsKK0ZQREZfRVhQT1JUIHVuc2lnbmVkIGxvbmcgRlBERl9DQUxMQ09OVgorRlBERl9WSUVXRVJSRUZfR2V0TmFtZShGUERGX0RPQ1VNRU5UIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICBGUERGX0JZVEVTVFJJTkcga2V5LAorICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKTsKIAogLy8gRnVuY3Rpb246IEZQREZfQ291bnROYW1lZERlc3RzCiAvLyAgICAgICAgICBHZXQgdGhlIGNvdW50IG9mIG5hbWVkIGRlc3RpbmF0aW9ucyBpbiB0aGUgUERGIGRvY3VtZW50LgpAQCAtOTc4LDcgKzEwNTYsOCBAQAogLy8gICAgICAgICAgZG9jdW1lbnQgICAgLSAgIEhhbmRsZSB0byBhIGRvY3VtZW50CiAvLyBSZXR1cm4gdmFsdWU6CiAvLyAgICAgICAgICBUaGUgY291bnQgb2YgbmFtZWQgZGVzdGluYXRpb25zLgotRExMRVhQT1JUIEZQREZfRFdPUkQgU1REQ0FMTCBGUERGX0NvdW50TmFtZWREZXN0cyhGUERGX0RPQ1VNRU5UIGRvY3VtZW50KTsKK0ZQREZfRVhQT1JUIEZQREZfRFdPUkQgRlBERl9DQUxMQ09OVgorRlBERl9Db3VudE5hbWVkRGVzdHMoRlBERl9ET0NVTUVOVCBkb2N1bWVudCk7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX0dldE5hbWVkRGVzdEJ5TmFtZQogLy8gICAgICAgICAgR2V0IGEgdGhlIGRlc3RpbmF0aW9uIGhhbmRsZSBmb3IgdGhlIGdpdmVuIG5hbWUuCkBAIC05ODcsOCArMTA2Niw4IEBACiAvLyAgICAgICAgICBuYW1lICAgICAgICAtICAgVGhlIG5hbWUgb2YgYSBkZXN0aW5hdGlvbi4KIC8vIFJldHVybiB2YWx1ZToKIC8vICAgICAgICAgIFRoZSBoYW5kbGUgdG8gdGhlIGRlc3RpbmF0aW9uLgotRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZfR2V0TmFtZWREZXN0QnlOYW1lKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9CWVRFU1RSSU5HIG5hbWUpOworRlBERl9FWFBPUlQgRlBERl9ERVNUIEZQREZfQ0FMTENPTlYKK0ZQREZfR2V0TmFtZWREZXN0QnlOYW1lKEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsIEZQREZfQllURVNUUklORyBuYW1lKTsKIAogLy8gRnVuY3Rpb246IEZQREZfR2V0TmFtZWREZXN0CiAvLyAgICAgICAgICBHZXQgdGhlIG5hbWVkIGRlc3RpbmF0aW9uIGJ5IGluZGV4LgpAQCAtMTAxMSwyNSArMTA5MCwyNSBAQAogLy8KIC8vICAgICAgICAgSWYgYnVmbGVuIGlzIG5vdCBzdWZmaWNpZW50bHkgbGFyZ2UsIGl0IHdpbGwgYmUgc2V0IHRvIC0xIHVwb24KIC8vICAgICAgICAgcmV0dXJuLgotRExMRVhQT1JUIEZQREZfREVTVCBTVERDQUxMIEZQREZfR2V0TmFtZWREZXN0KEZQREZfRE9DVU1FTlQgZG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nKiBidWZsZW4pOworRlBERl9FWFBPUlQgRlBERl9ERVNUIEZQREZfQ0FMTENPTlYgRlBERl9HZXROYW1lZERlc3QoRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcqIGJ1Zmxlbik7CiAKICNpZmRlZiBQREZfRU5BQkxFX1hGQQogLy8gRnVuY3Rpb246IEZQREZfQlN0cl9Jbml0CiAvLyAgICAgICAgICBIZWxwZXIgZnVuY3Rpb24gdG8gaW5pdGlhbGl6ZSBhIGJ5dGUgc3RyaW5nLgotRExMRVhQT1JUIEZQREZfUkVTVUxUIFNURENBTEwgRlBERl9CU3RyX0luaXQoRlBERl9CU1RSKiBzdHIpOworRlBERl9FWFBPUlQgRlBERl9SRVNVTFQgRlBERl9DQUxMQ09OViBGUERGX0JTdHJfSW5pdChGUERGX0JTVFIqIHN0cik7CiAKIC8vIEZ1bmN0aW9uOiBGUERGX0JTdHJfU2V0CiAvLyAgICAgICAgICBIZWxwZXIgZnVuY3Rpb24gdG8gc2V0IHN0cmluZyBkYXRhLgotRExMRVhQT1JUIEZQREZfUkVTVUxUIFNURENBTEwgRlBERl9CU3RyX1NldChGUERGX0JTVFIqIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9MUENTVFIgYnN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCk7CitGUERGX0VYUE9SVCBGUERGX1JFU1VMVCBGUERGX0NBTExDT05WIEZQREZfQlN0cl9TZXQoRlBERl9CU1RSKiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9MUENTVFIgYnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKTsKIAogLy8gRnVuY3Rpb246IEZQREZfQlN0cl9DbGVhcgogLy8gICAgICAgICAgSGVscGVyIGZ1bmN0aW9uIHRvIGNsZWFyIGEgYnl0ZSBzdHJpbmcuCi1ETExFWFBPUlQgRlBERl9SRVNVTFQgU1REQ0FMTCBGUERGX0JTdHJfQ2xlYXIoRlBERl9CU1RSKiBzdHIpOworRlBERl9FWFBPUlQgRlBERl9SRVNVTFQgRlBERl9DQUxMQ09OViBGUERGX0JTdHJfQ2xlYXIoRlBERl9CU1RSKiBzdHIpOwogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL3NhbXBsZXMvQlVJTEQuZ24gYi9zYW1wbGVzL0JVSUxELmduCmluZGV4IDIzZjRkMGMuLjY2YjAyZjYgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvQlVJTEQuZ24KKysrIGIvc2FtcGxlcy9CVUlMRC5nbgpAQCAtOCw3ICs4LDYgQEAKIGdyb3VwKCJzYW1wbGVzIikgewogICB0ZXN0b25seSA9IHRydWUKICAgZGVwcyA9IFsKLSAgICAiOnBkZml1bV9kaWZmIiwKICAgICAiOnBkZml1bV90ZXN0IiwKICAgXQogfQpAQCAtMzMsNiArMzIsMTEgQEAKICAgaWYgKGlzX2FzYW4pIHsKICAgICBkZWZpbmVzICs9IFsgIlBERl9FTkFCTEVfQVNBTiIgXQogICB9CisKKyAgaWYgKGVuYWJsZV9jYWxsZ3JpbmQpIHsKKyAgICBkZWZpbmVzICs9IFsgIkVOQUJMRV9DQUxMR1JJTkQiIF0KKyAgfQorCiAgIGlmICh1c2VfY292ZXJhZ2UgJiYgaXNfY2xhbmcpIHsKICAgICBjZmxhZ3MgKz0gWwogICAgICAgIi0tY292ZXJhZ2UiLApAQCAtNDYsMjQgKzUwLDE3IEBACiBleGVjdXRhYmxlKCJwZGZpdW1fdGVzdCIpIHsKICAgdGVzdG9ubHkgPSB0cnVlCiAgIHNvdXJjZXMgPSBbCi0gICAgImltYWdlX2RpZmZfcG5nLmNjIiwKLSAgICAiaW1hZ2VfZGlmZl9wbmcuaCIsCiAgICAgInBkZml1bV90ZXN0LmNjIiwKICAgXQogICBkZXBzID0gWworICAgICIuLi86aW1hZ2VfZGlmZiIsCiAgICAgIi4uLzpwZGZpdW0iLAogICAgICIuLi86dGVzdF9zdXBwb3J0IiwKLSAgICAiLy9idWlsZC9jb25maWcvc2FuaXRpemVyczpkZXBzIiwKKyAgICAiLy9idWlsZC9jb25maWc6ZXhlX2FuZF9zaGxpYl9kZXBzIiwKICAgICAiLy9idWlsZC93aW46ZGVmYXVsdF9leGVfbWFuaWZlc3QiLAotCi0gICAgIyBSZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGxpYnJhcnkgc2hpcHMgYWdhaW5zdCBzeXN0ZW0gZnJlZXR5cGUsCi0gICAgIyBhbHdheXMgbGluayB0aGlzIGJpbmFyeSBhZ2FpbnN0IHRoZSBidW5kbGVkIG9uZSBmb3IgY29uc2lzdGVuY3kKLSAgICAjIG9mIHJlc3VsdHMgYWNyb3NzIHBsYXRmb3Jtcy4KLSAgICAiLi4vdGhpcmRfcGFydHk6ZnhfZnJlZXR5cGUiLAogICBdCi0gIGlmICghcGRmX2VuYWJsZV94ZmEpIHsKLSAgICBkZXBzICs9IFsgIi4uL3RoaXJkX3BhcnR5OmZ4X2xwbmciIF0KLSAgfQorICBjb25maWdzICs9IFsgIjpwZGZpdW1fc2FtcGxlc19jb25maWciIF0KKwogICBpZiAocGRmX2VuYWJsZV92OCkgewogICAgIGRlcHMgKz0gWyAiLy92ODp2OF9saWJwbGF0Zm9ybSIgXQogICAgIGluY2x1ZGVfZGlycyA9IFsKQEAgLTc1LDI3ICs3Miw0IEBACiAgIGlmIChwZGZfdXNlX3NraWEgfHwgcGRmX3VzZV9za2lhX3BhdGhzKSB7CiAgICAgZGVwcyArPSBbICIvL3NraWEiIF0KICAgfQotICBjb25maWdzICs9IFsgIjpwZGZpdW1fc2FtcGxlc19jb25maWciIF0KLX0KLQotZXhlY3V0YWJsZSgicGRmaXVtX2RpZmYiKSB7Ci0gIHRlc3Rvbmx5ID0gdHJ1ZQotICBzb3VyY2VzID0gWwotICAgICJpbWFnZV9kaWZmLmNjIiwKLSAgICAiaW1hZ2VfZGlmZl9wbmcuY2MiLAotICAgICJpbWFnZV9kaWZmX3BuZy5oIiwKLSAgXQotICBkZXBzID0gWwotICAgICIuLi86cGRmaXVtIiwKLSAgICAiLy9idWlsZC9jb25maWcvc2FuaXRpemVyczpkZXBzIiwKLSAgICAiLy9idWlsZC93aW46ZGVmYXVsdF9leGVfbWFuaWZlc3QiLAotICBdCi0gIGlmICghcGRmX2VuYWJsZV94ZmEpIHsKLSAgICBkZXBzICs9IFsgIi4uL3RoaXJkX3BhcnR5OmZ4X2xwbmciIF0KLSAgfQotICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KLSAgY29uZmlncyArPSBbCi0gICAgIjpwZGZpdW1fc2FtcGxlc19jb25maWciLAotICAgICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpub19jaHJvbWl1bV9jb2RlIiwKLSAgXQogfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9ERVBTIGIvc2FtcGxlcy9ERVBTCmluZGV4IDRhOTI2YTcuLjI2ZjllZTIgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvREVQUworKysgYi9zYW1wbGVzL0RFUFMKQEAgLTEsOCArMSw1IEBACiBpbmNsdWRlX3J1bGVzID0gWwogICAnK3B1YmxpYycsCi0gICcrdGhpcmRfcGFydHkvbGlicG5nMTYnLAogICAnK3RoaXJkX3BhcnR5L3NraWEvaW5jbHVkZScsCi0gICcrdGhpcmRfcGFydHkvemxpYl92MTI4JywKICAgJyt2OCcsCi0gICcrY29yZS9mZHJtL2NyeXB0by9meF9jcnlwdC5oJywKIF0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvaW1hZ2VfZGlmZi5jYyBiL3NhbXBsZXMvaW1hZ2VfZGlmZi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FhNjI2Yi4uMDAwMDAwMAotLS0gYS9zYW1wbGVzL2ltYWdlX2RpZmYuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gVGhpcyBmaWxlIGlucHV0IGZvcm1hdCBpcyBiYXNlZCBsb29zZWx5IG9uCi0vLyBUb29scy9EdW1wUmVuZGVyVHJlZS9JbWFnZURpZmYubQotCi0vLyBUaGUgZXhhY3QgZm9ybWF0IG9mIHRoaXMgdG9vbCdzIG91dHB1dCB0byBzdGRvdXQgaXMgaW1wb3J0YW50LCB0byBtYXRjaAotLy8gd2hhdCB0aGUgcnVuLXdlYmtpdC10ZXN0cyBzY3JpcHQgZXhwZWN0cy4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJzYW1wbGVzL2ltYWdlX2RpZmZfcG5nLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX2NvbnZlcnNpb25zLmgiCi0KLSNpZiBkZWZpbmVkKE9TX1dJTikKLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYKLQotLy8gUmV0dXJuIGNvZGVzIHVzZWQgYnkgdGhpcyB1dGlsaXR5Lgotc3RhdGljIGNvbnN0IGludCBrU3RhdHVzU2FtZSA9IDA7Ci1zdGF0aWMgY29uc3QgaW50IGtTdGF0dXNEaWZmZXJlbnQgPSAxOwotc3RhdGljIGNvbnN0IGludCBrU3RhdHVzRXJyb3IgPSAyOwotCi0vLyBDb2xvciBjb2Rlcy4KLXN0YXRpYyBjb25zdCB1aW50MzJfdCBSR0JBX1JFRCA9IDB4MDAwMDAwZmY7Ci1zdGF0aWMgY29uc3QgdWludDMyX3QgUkdCQV9BTFBIQSA9IDB4ZmYwMDAwMDA7Ci0KLWNsYXNzIEltYWdlIHsKLSBwdWJsaWM6Ci0gIEltYWdlKCkgOiB3XygwKSwgaF8oMCkgewotICB9Ci0KLSAgSW1hZ2UoY29uc3QgSW1hZ2UmIGltYWdlKQotICAgICAgOiB3XyhpbWFnZS53XyksCi0gICAgICAgIGhfKGltYWdlLmhfKSwKLSAgICAgICAgZGF0YV8oaW1hZ2UuZGF0YV8pIHsKLSAgfQotCi0gIGJvb2wgaGFzX2ltYWdlKCkgY29uc3QgewotICAgIHJldHVybiB3XyA+IDAgJiYgaF8gPiAwOwotICB9Ci0KLSAgaW50IHcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHdfOwotICB9Ci0KLSAgaW50IGgoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGhfOwotICB9Ci0KLSAgY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSgpIGNvbnN0IHsKLSAgICByZXR1cm4gJmRhdGFfLmZyb250KCk7Ci0gIH0KLQotICAvLyBDcmVhdGVzIHRoZSBpbWFnZSBmcm9tIHRoZSBnaXZlbiBmaWxlbmFtZSBvbiBkaXNrLCBhbmQgcmV0dXJucyB0cnVlIG9uCi0gIC8vIHN1Y2Nlc3MuCi0gIGJvb2wgQ3JlYXRlRnJvbUZpbGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7Ci0gICAgRklMRSogZiA9IGZvcGVuKHBhdGguY19zdHIoKSwgInJiIik7Ci0gICAgaWYgKCFmKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4gY29tcHJlc3NlZDsKLSAgICBjb25zdCBzaXplX3Qga0J1ZlNpemUgPSAxMDI0OwotICAgIHVuc2lnbmVkIGNoYXIgYnVmW2tCdWZTaXplXTsKLSAgICBzaXplX3QgbnVtX3JlYWQgPSAwOwotICAgIHdoaWxlICgobnVtX3JlYWQgPSBmcmVhZChidWYsIDEsIGtCdWZTaXplLCBmKSkgPiAwKSB7Ci0gICAgICBjb21wcmVzc2VkLmluc2VydChjb21wcmVzc2VkLmVuZCgpLCBidWYsIGJ1ZiArIG51bV9yZWFkKTsKLSAgICB9Ci0KLSAgICBmY2xvc2UoZik7Ci0KLSAgICBpZiAoIWltYWdlX2RpZmZfcG5nOjpEZWNvZGVQTkcoY29tcHJlc3NlZC5kYXRhKCksIGNvbXByZXNzZWQuc2l6ZSgpLCAmZGF0YV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3XywgJmhfKSkgewotICAgICAgQ2xlYXIoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2b2lkIENsZWFyKCkgewotICAgIHdfID0gaF8gPSAwOwotICAgIGRhdGFfLmNsZWFyKCk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBSR0JBIHZhbHVlIG9mIHRoZSBwaXhlbCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24KLSAgdWludDMyX3QgcGl4ZWxfYXQoaW50IHgsIGludCB5KSBjb25zdCB7Ci0gICAgaWYgKCFwaXhlbF9pbl9ib3VuZHMoeCwgeSkpCi0gICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPigmKGRhdGFfW3BpeGVsX2FkZHJlc3MoeCwgeSldKSk7Ci0gIH0KLQotICB2b2lkIHNldF9waXhlbF9hdChpbnQgeCwgaW50IHksIHVpbnQzMl90IGNvbG9yKSB7Ci0gICAgaWYgKCFwaXhlbF9pbl9ib3VuZHMoeCwgeSkpCi0gICAgICByZXR1cm47Ci0KLSAgICB2b2lkKiBhZGRyID0gJmRhdGFfW3BpeGVsX2FkZHJlc3MoeCwgeSldOwotICAgICpyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oYWRkcikgPSBjb2xvcjsKLSAgfQotCi0gcHJpdmF0ZToKLSAgYm9vbCBwaXhlbF9pbl9ib3VuZHMoaW50IHgsIGludCB5KSBjb25zdCB7Ci0gICAgcmV0dXJuIHggPj0gMCAmJiB4IDwgd18gJiYgeSA+PSAwICYmIHkgPCBoXzsKLSAgfQotCi0gIHNpemVfdCBwaXhlbF9hZGRyZXNzKGludCB4LCBpbnQgeSkgY29uc3QgeyByZXR1cm4gKHkgKiB3XyArIHgpICogNDsgfQotCi0gIC8vIFBpeGVsIGRpbWVuc2lvbnMgb2YgdGhlIGltYWdlLgotICBpbnQgd187Ci0gIGludCBoXzsKLQotICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiBkYXRhXzsKLX07Ci0KLWZsb2F0IENhbGN1bGF0ZURpZmZlcmVuY2VQZXJjZW50YWdlKGNvbnN0IEltYWdlJiBhY3R1YWwsIGludCBwaXhlbHNfZGlmZmVyZW50KSB7Ci0gIC8vIExpa2UgdGhlIFdlYktpdCBJbWFnZURpZmYgdG9vbCwgd2UgZGVmaW5lIHBlcmNlbnRhZ2UgZGlmZmVyZW50IGluIHRlcm1zCi0gIC8vIG9mIHRoZSBzaXplIG9mIHRoZSAnYWN0dWFsJyBiaXRtYXAuCi0gIGZsb2F0IHRvdGFsX3BpeGVscyA9Ci0gICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oYWN0dWFsLncoKSkgKiBzdGF0aWNfY2FzdDxmbG9hdD4oYWN0dWFsLmgoKSk7Ci0gIGlmICh0b3RhbF9waXhlbHMgPT0gMCkgewotICAgIC8vIFdoZW4gdGhlIGJpdG1hcCBpcyBlbXB0eSwgdGhleSBhcmUgMTAwJSBkaWZmZXJlbnQuCi0gICAgcmV0dXJuIDEwMC4wZjsKLSAgfQotICByZXR1cm4gMTAwLjBmICogcGl4ZWxzX2RpZmZlcmVudCAvIHRvdGFsX3BpeGVsczsKLX0KLQotdm9pZCBDb3VudEltYWdlU2l6ZU1pc21hdGNoQXNQaXhlbERpZmZlcmVuY2UoY29uc3QgSW1hZ2UmIGJhc2VsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW1hZ2UmIGFjdHVhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcGl4ZWxzX2RpZmZlcmVudCkgewotICBpbnQgdyA9IHN0ZDo6bWluKGJhc2VsaW5lLncoKSwgYWN0dWFsLncoKSk7Ci0gIGludCBoID0gc3RkOjptaW4oYmFzZWxpbmUuaCgpLCBhY3R1YWwuaCgpKTsKLQotICAvLyBDb3VudCBwaXhlbHMgdGhhdCBhcmUgYSBkaWZmZXJlbmNlIGluIHNpemUgYXMgYWxzbyBiZWluZyBkaWZmZXJlbnQuCi0gIGludCBtYXhfdyA9IHN0ZDo6bWF4KGJhc2VsaW5lLncoKSwgYWN0dWFsLncoKSk7Ci0gIGludCBtYXhfaCA9IHN0ZDo6bWF4KGJhc2VsaW5lLmgoKSwgYWN0dWFsLmgoKSk7Ci0gIC8vIFRoZXNlIHBpeGVscyBhcmUgb2ZmIHRoZSByaWdodCBzaWRlLCBub3QgaW5jbHVkaW5nIHRoZSBsb3dlciByaWdodCBjb3JuZXIuCi0gICpwaXhlbHNfZGlmZmVyZW50ICs9IChtYXhfdyAtIHcpICogaDsKLSAgLy8gVGhlc2UgcGl4ZWxzIGFyZSBhbG9uZyB0aGUgYm90dG9tLCBpbmNsdWRpbmcgdGhlIGxvd2VyIHJpZ2h0IGNvcm5lci4KLSAgKnBpeGVsc19kaWZmZXJlbnQgKz0gKG1heF9oIC0gaCkgKiBtYXhfdzsKLX0KLQotZmxvYXQgUGVyY2VudGFnZURpZmZlcmVudChjb25zdCBJbWFnZSYgYmFzZWxpbmUsIGNvbnN0IEltYWdlJiBhY3R1YWwpIHsKLSAgaW50IHcgPSBzdGQ6Om1pbihiYXNlbGluZS53KCksIGFjdHVhbC53KCkpOwotICBpbnQgaCA9IHN0ZDo6bWluKGJhc2VsaW5lLmgoKSwgYWN0dWFsLmgoKSk7Ci0KLSAgLy8gQ29tcHV0ZSBwaXhlbHMgZGlmZmVyZW50IGluIHRoZSBvdmVybGFwLgotICBpbnQgcGl4ZWxzX2RpZmZlcmVudCA9IDA7Ci0gIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgKyt5KSB7Ci0gICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyArK3gpIHsKLSAgICAgIGlmIChiYXNlbGluZS5waXhlbF9hdCh4LCB5KSAhPSBhY3R1YWwucGl4ZWxfYXQoeCwgeSkpCi0gICAgICAgICsrcGl4ZWxzX2RpZmZlcmVudDsKLSAgICB9Ci0gIH0KLQotICBDb3VudEltYWdlU2l6ZU1pc21hdGNoQXNQaXhlbERpZmZlcmVuY2UoYmFzZWxpbmUsIGFjdHVhbCwgJnBpeGVsc19kaWZmZXJlbnQpOwotICByZXR1cm4gQ2FsY3VsYXRlRGlmZmVyZW5jZVBlcmNlbnRhZ2UoYWN0dWFsLCBwaXhlbHNfZGlmZmVyZW50KTsKLX0KLQotLy8gRklYTUU6IFJlcGxhY2Ugd2l0aCB1bm9yZGVyZWRfbWFwIHdoZW4gYXZhaWxhYmxlLgotdHlwZWRlZiBzdGQ6Om1hcDx1aW50MzJfdCwgaW50MzJfdD4gUmdiYVRvQ291bnRNYXA7Ci0KLWZsb2F0IEhpc3RvZ3JhbVBlcmNlbnRhZ2VEaWZmZXJlbnQoY29uc3QgSW1hZ2UmIGJhc2VsaW5lLCBjb25zdCBJbWFnZSYgYWN0dWFsKSB7Ci0gIC8vIFRPRE8oam9obm1lKTogQ29uc2lkZXIgdXNpbmcgYSBqb2ludCBoaXN0b2dyYW0gaW5zdGVhZCwgYXMgZGVzY3JpYmVkIGluCi0gIC8vICJDb21wYXJpbmcgSW1hZ2VzIFVzaW5nIEpvaW50IEhpc3RvZ3JhbXMiIGJ5IFBhc3MgJiBaYWJpaAotICAvLyBodHRwOi8vd3d3LmNzLmNvcm5lbGwuZWR1L35yZHovcGFwZXJzL3B6LWptczk5LnBkZgotCi0gIGludCB3ID0gc3RkOjptaW4oYmFzZWxpbmUudygpLCBhY3R1YWwudygpKTsKLSAgaW50IGggPSBzdGQ6Om1pbihiYXNlbGluZS5oKCksIGFjdHVhbC5oKCkpOwotCi0gIC8vIENvdW50IG9jY3VyZW5jZXMgb2YgZWFjaCBSR0JBIHBpeGVsIHZhbHVlIG9mIGJhc2VsaW5lIGluIHRoZSBvdmVybGFwLgotICBSZ2JhVG9Db3VudE1hcCBiYXNlbGluZV9oaXN0b2dyYW07Ci0gIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgKyt5KSB7Ci0gICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyArK3gpIHsKLSAgICAgIC8vIGhhc2hfbWFwIG9wZXJhdG9yW10gaW5zZXJ0cyBhIDAgKGRlZmF1bHQgY29uc3RydWN0b3IpIGlmIGtleSBub3QgZm91bmQuCi0gICAgICArK2Jhc2VsaW5lX2hpc3RvZ3JhbVtiYXNlbGluZS5waXhlbF9hdCh4LCB5KV07Ci0gICAgfQotICB9Ci0KLSAgLy8gQ29tcHV0ZSBwaXhlbHMgZGlmZmVyZW50IGluIHRoZSBoaXN0b2dyYW0gb2YgdGhlIG92ZXJsYXAuCi0gIGludCBwaXhlbHNfZGlmZmVyZW50ID0gMDsKLSAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyArK3kpIHsKLSAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7ICsreCkgewotICAgICAgdWludDMyX3QgYWN0dWFsX3JnYmEgPSBhY3R1YWwucGl4ZWxfYXQoeCwgeSk7Ci0gICAgICBSZ2JhVG9Db3VudE1hcDo6aXRlcmF0b3IgaXQgPSBiYXNlbGluZV9oaXN0b2dyYW0uZmluZChhY3R1YWxfcmdiYSk7Ci0gICAgICBpZiAoaXQgIT0gYmFzZWxpbmVfaGlzdG9ncmFtLmVuZCgpICYmIGl0LT5zZWNvbmQgPiAwKQotICAgICAgICAtLWl0LT5zZWNvbmQ7Ci0gICAgICBlbHNlCi0gICAgICAgICsrcGl4ZWxzX2RpZmZlcmVudDsKLSAgICB9Ci0gIH0KLQotICBDb3VudEltYWdlU2l6ZU1pc21hdGNoQXNQaXhlbERpZmZlcmVuY2UoYmFzZWxpbmUsIGFjdHVhbCwgJnBpeGVsc19kaWZmZXJlbnQpOwotICByZXR1cm4gQ2FsY3VsYXRlRGlmZmVyZW5jZVBlcmNlbnRhZ2UoYWN0dWFsLCBwaXhlbHNfZGlmZmVyZW50KTsKLX0KLQotdm9pZCBQcmludEhlbHAoKSB7Ci0gIGZwcmludGYoc3RkZXJyLAotICAgICJVc2FnZTpcbiIKLSAgICAiICBpbWFnZV9kaWZmIFstLWhpc3RvZ3JhbV0gPGNvbXBhcmUgZmlsZT4gPHJlZmVyZW5jZSBmaWxlPlxuIgotICAgICIgICAgQ29tcGFyZXMgdHdvIGZpbGVzIG9uIGRpc2ssIHJldHVybmluZyAwIHdoZW4gdGhleSBhcmUgdGhlIHNhbWU7XG4iCi0gICAgIiAgICBwYXNzaW5nIFwiLS1oaXN0b2dyYW1cIiBhZGRpdGlvbmFsbHkgY2FsY3VsYXRlcyBhIGRpZmYgb2YgdGhlXG4iCi0gICAgIiAgICBSR0JBIHZhbHVlIGhpc3RvZ3JhbXMgKHdoaWNoIGlzIHJlc2lzdGFudCB0byBzaGlmdHMgaW4gbGF5b3V0KVxuIgotICAgICIgIGltYWdlX2RpZmYgLS1kaWZmIDxjb21wYXJlIGZpbGU+IDxyZWZlcmVuY2UgZmlsZT4gPG91dHB1dCBmaWxlPlxuIgotICAgICIgICAgQ29tcGFyZXMgdHdvIGZpbGVzIG9uIGRpc2ssIG91dHB1dHMgYW4gaW1hZ2UgdGhhdCB2aXN1YWxpemVzIHRoZVxuIgotICAgICIgICAgZGlmZmVyZW5jZSB0byA8b3V0cHV0IGZpbGU+XG4iKTsKLX0KLQotaW50IENvbXBhcmVJbWFnZXMoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUxLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUyLAotICAgICAgICAgICAgICAgICAgYm9vbCBjb21wYXJlX2hpc3RvZ3JhbXMpIHsKLSAgSW1hZ2UgYWN0dWFsX2ltYWdlOwotICBJbWFnZSBiYXNlbGluZV9pbWFnZTsKLQotICBpZiAoIWFjdHVhbF9pbWFnZS5DcmVhdGVGcm9tRmlsZW5hbWUoZmlsZTEpKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJpbWFnZV9kaWZmOiBVbmFibGUgdG8gb3BlbiBmaWxlIFwiJXNcIlxuIiwgZmlsZTEuY19zdHIoKSk7Ci0gICAgcmV0dXJuIGtTdGF0dXNFcnJvcjsKLSAgfQotICBpZiAoIWJhc2VsaW5lX2ltYWdlLkNyZWF0ZUZyb21GaWxlbmFtZShmaWxlMikpIHsKLSAgICBmcHJpbnRmKHN0ZGVyciwgImltYWdlX2RpZmY6IFVuYWJsZSB0byBvcGVuIGZpbGUgXCIlc1wiXG4iLCBmaWxlMi5jX3N0cigpKTsKLSAgICByZXR1cm4ga1N0YXR1c0Vycm9yOwotICB9Ci0KLSAgaWYgKGNvbXBhcmVfaGlzdG9ncmFtcykgewotICAgIGZsb2F0IHBlcmNlbnQgPSBIaXN0b2dyYW1QZXJjZW50YWdlRGlmZmVyZW50KGFjdHVhbF9pbWFnZSwgYmFzZWxpbmVfaW1hZ2UpOwotICAgIGNvbnN0IGNoYXIqIHBhc3NlZCA9IHBlcmNlbnQgPiAwLjAgPyAiZmFpbGVkIiA6ICJwYXNzZWQiOwotICAgIHByaW50ZigiaGlzdG9ncmFtIGRpZmY6ICUwMS4yZiUlICVzXG4iLCBwZXJjZW50LCBwYXNzZWQpOwotICB9Ci0KLSAgY29uc3QgY2hhciogY29uc3QgZGlmZl9uYW1lID0gY29tcGFyZV9oaXN0b2dyYW1zID8gImV4YWN0IGRpZmYiIDogImRpZmYiOwotICBmbG9hdCBwZXJjZW50ID0gUGVyY2VudGFnZURpZmZlcmVudChhY3R1YWxfaW1hZ2UsIGJhc2VsaW5lX2ltYWdlKTsKLSAgY29uc3QgY2hhciogY29uc3QgcGFzc2VkID0gcGVyY2VudCA+IDAuMCA/ICJmYWlsZWQiIDogInBhc3NlZCI7Ci0gIHByaW50ZigiJXM6ICUwMS4yZiUlICVzXG4iLCBkaWZmX25hbWUsIHBlcmNlbnQsIHBhc3NlZCk7Ci0KLSAgaWYgKHBlcmNlbnQgPiAwLjApIHsKLSAgICAvLyBmYWlsdXJlOiBUaGUgV2ViS2l0IHZlcnNpb24gYWxzbyB3cml0ZXMgdGhlIGRpZmZlcmVuY2UgaW1hZ2UgdG8KLSAgICAvLyBzdGRvdXQsIHdoaWNoIHNlZW1zIGV4Y2Vzc2l2ZSBmb3Igb3VyIG5lZWRzLgotICAgIHJldHVybiBrU3RhdHVzRGlmZmVyZW50OwotICB9Ci0gIC8vIHN1Y2Nlc3MKLSAgcmV0dXJuIGtTdGF0dXNTYW1lOwotfQotCi1ib29sIENyZWF0ZUltYWdlRGlmZihjb25zdCBJbWFnZSYgaW1hZ2UxLCBjb25zdCBJbWFnZSYgaW1hZ2UyLCBJbWFnZSogb3V0KSB7Ci0gIGludCB3ID0gc3RkOjptaW4oaW1hZ2UxLncoKSwgaW1hZ2UyLncoKSk7Ci0gIGludCBoID0gc3RkOjptaW4oaW1hZ2UxLmgoKSwgaW1hZ2UyLmgoKSk7Ci0gICpvdXQgPSBJbWFnZShpbWFnZTEpOwotICBib29sIHNhbWUgPSAoaW1hZ2UxLncoKSA9PSBpbWFnZTIudygpKSAmJiAoaW1hZ2UxLmgoKSA9PSBpbWFnZTIuaCgpKTsKLQotICAvLyBUT0RPKGVzdGFkZSk6IGRvIHNvbWV0aGluZyB3aXRoIHRoZSBleHRyYSBwaXhlbHMgaWYgdGhlIGltYWdlIHNpemVzCi0gIC8vIGFyZSBkaWZmZXJlbnQuCi0gIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgKyt5KSB7Ci0gICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyArK3gpIHsKLSAgICAgIHVpbnQzMl90IGJhc2VfcGl4ZWwgPSBpbWFnZTEucGl4ZWxfYXQoeCwgeSk7Ci0gICAgICBpZiAoYmFzZV9waXhlbCAhPSBpbWFnZTIucGl4ZWxfYXQoeCwgeSkpIHsKLSAgICAgICAgLy8gU2V0IGRpZmZlcmluZyBwaXhlbHMgcmVkLgotICAgICAgICBvdXQtPnNldF9waXhlbF9hdCh4LCB5LCBSR0JBX1JFRCB8IFJHQkFfQUxQSEEpOwotICAgICAgICBzYW1lID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBTZXQgc2FtZSBwaXhlbHMgYXMgZmFkZWQuCi0gICAgICAgIHVpbnQzMl90IGFscGhhID0gYmFzZV9waXhlbCAmIFJHQkFfQUxQSEE7Ci0gICAgICAgIHVpbnQzMl90IG5ld19waXhlbCA9IGJhc2VfcGl4ZWwgLSAoKGFscGhhIC8gMikgJiBSR0JBX0FMUEhBKTsKLSAgICAgICAgb3V0LT5zZXRfcGl4ZWxfYXQoeCwgeSwgbmV3X3BpeGVsKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gc2FtZTsKLX0KLQotaW50IERpZmZJbWFnZXMoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUxLAotICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGUyLAotICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG91dF9maWxlKSB7Ci0gIEltYWdlIGFjdHVhbF9pbWFnZTsKLSAgSW1hZ2UgYmFzZWxpbmVfaW1hZ2U7Ci0KLSAgaWYgKCFhY3R1YWxfaW1hZ2UuQ3JlYXRlRnJvbUZpbGVuYW1lKGZpbGUxKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiaW1hZ2VfZGlmZjogVW5hYmxlIHRvIG9wZW4gZmlsZSBcIiVzXCJcbiIsIGZpbGUxLmNfc3RyKCkpOwotICAgIHJldHVybiBrU3RhdHVzRXJyb3I7Ci0gIH0KLSAgaWYgKCFiYXNlbGluZV9pbWFnZS5DcmVhdGVGcm9tRmlsZW5hbWUoZmlsZTIpKSB7Ci0gICAgZnByaW50ZihzdGRlcnIsICJpbWFnZV9kaWZmOiBVbmFibGUgdG8gb3BlbiBmaWxlIFwiJXNcIlxuIiwgZmlsZTIuY19zdHIoKSk7Ci0gICAgcmV0dXJuIGtTdGF0dXNFcnJvcjsKLSAgfQotCi0gIEltYWdlIGRpZmZfaW1hZ2U7Ci0gIGJvb2wgc2FtZSA9IENyZWF0ZUltYWdlRGlmZihiYXNlbGluZV9pbWFnZSwgYWN0dWFsX2ltYWdlLCAmZGlmZl9pbWFnZSk7Ci0gIGlmIChzYW1lKQotICAgIHJldHVybiBrU3RhdHVzU2FtZTsKLQotICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiBwbmdfZW5jb2Rpbmc7Ci0gIGltYWdlX2RpZmZfcG5nOjpFbmNvZGVSR0JBUE5HKAotICAgICAgZGlmZl9pbWFnZS5kYXRhKCksIGRpZmZfaW1hZ2UudygpLCBkaWZmX2ltYWdlLmgoKSwKLSAgICAgIGRpZmZfaW1hZ2UudygpICogNCwgJnBuZ19lbmNvZGluZyk7Ci0KLSAgRklMRSogZiA9IGZvcGVuKG91dF9maWxlLmNfc3RyKCksICJ3YiIpOwotICBpZiAoIWYpCi0gICAgcmV0dXJuIGtTdGF0dXNFcnJvcjsKLQotICBzaXplX3Qgc2l6ZSA9IHBuZ19lbmNvZGluZy5zaXplKCk7Ci0gIGNoYXIqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZwbmdfZW5jb2RpbmcuZnJvbnQoKSk7Ci0gIGlmIChmd3JpdGUocHRyLCAxLCBzaXplLCBmKSAhPSBzaXplKQotICAgIHJldHVybiBrU3RhdHVzRXJyb3I7Ci0KLSAgcmV0dXJuIGtTdGF0dXNEaWZmZXJlbnQ7Ci19Ci0KLWludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiBhcmd2W10pIHsKLSAgYm9vbCBoaXN0b2dyYW1zID0gZmFsc2U7Ci0gIGJvb2wgcHJvZHVjZV9kaWZmX2ltYWdlID0gZmFsc2U7Ci0gIHN0ZDo6c3RyaW5nIGZpbGVuYW1lMTsKLSAgc3RkOjpzdHJpbmcgZmlsZW5hbWUyOwotICBzdGQ6OnN0cmluZyBkaWZmX2ZpbGVuYW1lOwotCi0gIGludCBpOwotICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgKytpKSB7Ci0gICAgY29uc3QgY2hhciogYXJnID0gYXJndltpXTsKLSAgICBpZiAoc3Ryc3RyKGFyZywgIi0tIikgIT0gYXJnKQotICAgICAgYnJlYWs7Ci0gICAgaWYgKHN0cmNtcChhcmcsICItLWhpc3RvZ3JhbSIpID09IDApIHsKLSAgICAgIGhpc3RvZ3JhbXMgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKGFyZywgIi0tZGlmZiIpID09IDApIHsKLSAgICAgIHByb2R1Y2VfZGlmZl9pbWFnZSA9IHRydWU7Ci0gICAgfQotICB9Ci0gIGlmIChpIDwgYXJnYykKLSAgICBmaWxlbmFtZTEgPSBhcmd2W2krK107Ci0gIGlmIChpIDwgYXJnYykKLSAgICBmaWxlbmFtZTIgPSBhcmd2W2krK107Ci0gIGlmIChpIDwgYXJnYykKLSAgICBkaWZmX2ZpbGVuYW1lID0gYXJndltpKytdOwotCi0gIGlmIChwcm9kdWNlX2RpZmZfaW1hZ2UpIHsKLSAgICBpZiAoIWRpZmZfZmlsZW5hbWUuZW1wdHkoKSkgewotICAgICAgcmV0dXJuIERpZmZJbWFnZXMoZmlsZW5hbWUxLCBmaWxlbmFtZTIsIGRpZmZfZmlsZW5hbWUpOwotICAgIH0KLSAgfSBlbHNlIGlmICghZmlsZW5hbWUyLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gQ29tcGFyZUltYWdlcyhmaWxlbmFtZTEsIGZpbGVuYW1lMiwgaGlzdG9ncmFtcyk7Ci0gIH0KLQotICBQcmludEhlbHAoKTsKLSAgcmV0dXJuIGtTdGF0dXNFcnJvcjsKLX0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvaW1hZ2VfZGlmZl9wbmcuY2MgYi9zYW1wbGVzL2ltYWdlX2RpZmZfcG5nLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODc1M2UyLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvaW1hZ2VfZGlmZl9wbmcuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NDQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBUaGlzIGlzIGEgZHVwbGljYXRlIG9mIGNocm9taXVtJ3Mgc3JjL3Rvb2xzL2ltYWdlZGlmZi9pbWFnZV9kaWZmX3BuZy5jYwotLy8gdGhhdCBoYXMgYmVlbiBtb2RpZmllZCB0byBidWlsZCBpbiBhIHBkZml1bSBlbnZpcm9ubWVudCwgd2hpY2ggaXRzZWxmCi0vLyB3YXMgZHVwbGljYXRlZCBhcyBmb2xsb3dzOgotCi0vLyBUaGlzIGlzIGEgZHVwbGljYXRlIG9mIHVpL2dmeC9jb2RlYy9wbmdfY29kZWMuY2MsIGFmdGVyIHJlbW92aW5nIGNvZGUgcmVsYXRlZAotLy8gdG8gU2tpYSwgdGhhdCB3ZSBjYW4gdXNlIHdoZW4gcnVubmluZyBsYXlvdXQgdGVzdHMgd2l0aCBtaW5pbWFsIGRlcGVuZGVuY2llcy4KLQotI2luY2x1ZGUgInNhbXBsZXMvaW1hZ2VfZGlmZl9wbmcuaCIKLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9sb2dnaW5nLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbGlicG5nMTYvcG5nLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvemxpYl92MTI4L3psaWIuaCIKLQotbmFtZXNwYWNlIGltYWdlX2RpZmZfcG5nIHsKLQotbmFtZXNwYWNlIHsKLQotZW51bSBDb2xvckZvcm1hdCB7Ci0gIC8vIDMgYnl0ZXMgcGVyIHBpeGVsIChwYWNrZWQpLCBpbiBSR0Igb3JkZXIgcmVnYXJkbGVzcyBvZiBlbmRpYW5uZXNzLgotICAvLyBUaGlzIGlzIHRoZSBuYXRpdmUgSlBFRyBmb3JtYXQuCi0gIEZPUk1BVF9SR0IsCi0KLSAgLy8gNCBieXRlcyBwZXIgcGl4ZWwsIGluIFJHQkEgb3JkZXIgaW4gbWVtb3J5IHJlZ2FyZGxlc3Mgb2YgZW5kaWFubmVzcy4KLSAgRk9STUFUX1JHQkEsCi0KLSAgLy8gNCBieXRlcyBwZXIgcGl4ZWwsIGluIEJHUkEgb3JkZXIgaW4gbWVtb3J5IHJlZ2FyZGxlc3Mgb2YgZW5kaWFubmVzcy4KLSAgLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCBXaW5kb3dzIERJQiBvcmRlci4KLSAgRk9STUFUX0JHUkEsCi19OwotCi0vLyBSZXByZXNlbnRzIGEgY29tbWVudCBpbiB0aGUgdEVYdCBhbmNpbGxhcnkgY2h1bmsgb2YgdGhlIHBuZy4KLXN0cnVjdCBDb21tZW50IHsKLSAgc3RkOjpzdHJpbmcga2V5OwotICBzdGQ6OnN0cmluZyB0ZXh0OwotfTsKLQotLy8gQ29udmVydHMgQkdSQS0+UkdCQSBhbmQgUkdCQS0+QkdSQS4KLXZvaWQgQ29udmVydEJldHdlZW5CR1JBYW5kUkdCQShjb25zdCB1bnNpZ25lZCBjaGFyKiBpbnB1dCwgaW50IHBpeGVsX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIG91dHB1dCwgYm9vbCogaXNfb3BhcXVlKSB7Ci0gIGZvciAoaW50IHggPSAwOyB4IDwgcGl4ZWxfd2lkdGg7IHgrKykgewotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHBpeGVsX2luID0gJmlucHV0W3ggKiA0XTsKLSAgICB1bnNpZ25lZCBjaGFyKiBwaXhlbF9vdXQgPSAmb3V0cHV0W3ggKiA0XTsKLSAgICBwaXhlbF9vdXRbMF0gPSBwaXhlbF9pblsyXTsKLSAgICBwaXhlbF9vdXRbMV0gPSBwaXhlbF9pblsxXTsKLSAgICBwaXhlbF9vdXRbMl0gPSBwaXhlbF9pblswXTsKLSAgICBwaXhlbF9vdXRbM10gPSBwaXhlbF9pblszXTsKLSAgfQotfQotCi12b2lkIENvbnZlcnRSR0JBdG9SR0IoY29uc3QgdW5zaWduZWQgY2hhciogcmdiYSwgaW50IHBpeGVsX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHJnYiwgYm9vbCogaXNfb3BhcXVlKSB7Ci0gIGZvciAoaW50IHggPSAwOyB4IDwgcGl4ZWxfd2lkdGg7IHgrKykgewotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHBpeGVsX2luID0gJnJnYmFbeCAqIDRdOwotICAgIHVuc2lnbmVkIGNoYXIqIHBpeGVsX291dCA9ICZyZ2JbeCAqIDNdOwotICAgIHBpeGVsX291dFswXSA9IHBpeGVsX2luWzBdOwotICAgIHBpeGVsX291dFsxXSA9IHBpeGVsX2luWzFdOwotICAgIHBpeGVsX291dFsyXSA9IHBpeGVsX2luWzJdOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBEZWNvZGVyCi0vLwotLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIFdlYktpdCBsaWJwbmcgaW50ZXJmYWNlIChQTkdJbWFnZURlY29kZXIpLCB3aGljaCBpcwotLy8gaW4gdHVybiBiYXNlZCBvbiB0aGUgTW96aWxsYSBwbmcgZGVjb2Rlci4KLQotbmFtZXNwYWNlIHsKLQotLy8gR2FtbWEgY29uc3RhbnRzOiBXZSBhc3N1bWUgd2UncmUgb24gV2luZG93cyB3aGljaCB1c2VzIGEgZ2FtbWEgb2YgMi4yLgotY29uc3QgZG91YmxlIGtNYXhHYW1tYSA9IDIxNDc0LjgzOyAgLy8gTWF4aW11bSBnYW1tYSBhY2NlcHRlZCBieSBwbmcgbGlicmFyeS4KLWNvbnN0IGRvdWJsZSBrRGVmYXVsdEdhbW1hID0gMi4yOwotY29uc3QgZG91YmxlIGtJbnZlcnNlR2FtbWEgPSAxLjAgLyBrRGVmYXVsdEdhbW1hOwotCi1jbGFzcyBQbmdEZWNvZGVyU3RhdGUgewotIHB1YmxpYzoKLSAgLy8gT3V0cHV0IGlzIGEgdmVjdG9yPHVuc2lnbmVkIGNoYXI+LgotICBQbmdEZWNvZGVyU3RhdGUoQ29sb3JGb3JtYXQgb2ZtdCwgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4qIG8pCi0gICAgICA6IG91dHB1dF9mb3JtYXQob2ZtdCksCi0gICAgICAgIG91dHB1dF9jaGFubmVscygwKSwKLSAgICAgICAgaXNfb3BhcXVlKHRydWUpLAotICAgICAgICBvdXRwdXQobyksCi0gICAgICAgIHJvd19jb252ZXJ0ZXIoTlVMTCksCi0gICAgICAgIHdpZHRoKDApLAotICAgICAgICBoZWlnaHQoMCksCi0gICAgICAgIGRvbmUoZmFsc2UpIHsKLSAgfQotCi0gIENvbG9yRm9ybWF0IG91dHB1dF9mb3JtYXQ7Ci0gIGludCBvdXRwdXRfY2hhbm5lbHM7Ci0KLSAgLy8gVXNlZCBkdXJpbmcgdGhlIHJlYWRpbmcgb2YgYW4gU2tCaXRtYXAuIERlZmF1bHRzIHRvIHRydWUgdW50aWwgd2Ugc2VlIGEKLSAgLy8gcGl4ZWwgd2l0aCBhbnl0aGluZyBvdGhlciB0aGFuIGFuIGFscGhhIG9mIDI1NS4KLSAgYm9vbCBpc19vcGFxdWU7Ci0KLSAgLy8gQW4gaW50ZXJtZWRpYXJ5IGJ1ZmZlciBmb3IgZGVjb2RlIG91dHB1dC4KLSAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4qIG91dHB1dDsKLQotICAvLyBDYWxsZWQgdG8gY29udmVydCBhIHJvdyBmcm9tIHRoZSBsaWJyYXJ5IHRvIHRoZSBjb3JyZWN0IG91dHB1dCBmb3JtYXQuCi0gIC8vIFdoZW4gTlVMTCwgbm8gY29udmVyc2lvbiBpcyBuZWNlc3NhcnkuCi0gIHZvaWQgKCpyb3dfY29udmVydGVyKShjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwgaW50IHcsIHVuc2lnbmVkIGNoYXIqIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGlzX29wYXF1ZSk7Ci0KLSAgLy8gU2l6ZSBvZiB0aGUgaW1hZ2UsIHNldCBpbiB0aGUgaW5mbyBjYWxsYmFjay4KLSAgaW50IHdpZHRoOwotICBpbnQgaGVpZ2h0OwotCi0gIC8vIFNldCB0byB0cnVlIHdoZW4gd2UndmUgZm91bmQgdGhlIGVuZCBvZiB0aGUgZGF0YS4KLSAgYm9vbCBkb25lOwotfTsKLQotdm9pZCBDb252ZXJ0UkdCdG9SR0JBKGNvbnN0IHVuc2lnbmVkIGNoYXIqIHJnYiwgaW50IHBpeGVsX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHJnYmEsIGJvb2wqIGlzX29wYXF1ZSkgewotICBmb3IgKGludCB4ID0gMDsgeCA8IHBpeGVsX3dpZHRoOyB4KyspIHsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBwaXhlbF9pbiA9ICZyZ2JbeCAqIDNdOwotICAgIHVuc2lnbmVkIGNoYXIqIHBpeGVsX291dCA9ICZyZ2JhW3ggKiA0XTsKLSAgICBwaXhlbF9vdXRbMF0gPSBwaXhlbF9pblswXTsKLSAgICBwaXhlbF9vdXRbMV0gPSBwaXhlbF9pblsxXTsKLSAgICBwaXhlbF9vdXRbMl0gPSBwaXhlbF9pblsyXTsKLSAgICBwaXhlbF9vdXRbM10gPSAweGZmOwotICB9Ci19Ci0KLXZvaWQgQ29udmVydFJHQnRvQkdSQShjb25zdCB1bnNpZ25lZCBjaGFyKiByZ2IsIGludCBwaXhlbF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBiZ3JhLCBib29sKiBpc19vcGFxdWUpIHsKLSAgZm9yIChpbnQgeCA9IDA7IHggPCBwaXhlbF93aWR0aDsgeCsrKSB7Ci0gICAgY29uc3QgdW5zaWduZWQgY2hhciogcGl4ZWxfaW4gPSAmcmdiW3ggKiAzXTsKLSAgICB1bnNpZ25lZCBjaGFyKiBwaXhlbF9vdXQgPSAmYmdyYVt4ICogNF07Ci0gICAgcGl4ZWxfb3V0WzBdID0gcGl4ZWxfaW5bMl07Ci0gICAgcGl4ZWxfb3V0WzFdID0gcGl4ZWxfaW5bMV07Ci0gICAgcGl4ZWxfb3V0WzJdID0gcGl4ZWxfaW5bMF07Ci0gICAgcGl4ZWxfb3V0WzNdID0gMHhmZjsKLSAgfQotfQotCi0vLyBDYWxsZWQgd2hlbiB0aGUgcG5nIGhlYWRlciBoYXMgYmVlbiByZWFkLiBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIFdlYktpdAotLy8gUE5HSW1hZ2VEZWNvZGVyCi12b2lkIERlY29kZUluZm9DYWxsYmFjayhwbmdfc3RydWN0KiBwbmdfcHRyLCBwbmdfaW5mbyogaW5mb19wdHIpIHsKLSAgUG5nRGVjb2RlclN0YXRlKiBzdGF0ZSA9IHN0YXRpY19jYXN0PFBuZ0RlY29kZXJTdGF0ZSo+KAotICAgICAgcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocG5nX3B0cikpOwotCi0gIGludCBiaXRfZGVwdGgsIGNvbG9yX3R5cGUsIGludGVybGFjZV90eXBlLCBjb21wcmVzc2lvbl90eXBlOwotICBpbnQgZmlsdGVyX3R5cGUsIGNoYW5uZWxzOwotICBwbmdfdWludF8zMiB3LCBoOwotICBwbmdfZ2V0X0lIRFIocG5nX3B0ciwgaW5mb19wdHIsICZ3LCAmaCwgJmJpdF9kZXB0aCwgJmNvbG9yX3R5cGUsCi0gICAgICAgICAgICAgICAmaW50ZXJsYWNlX3R5cGUsICZjb21wcmVzc2lvbl90eXBlLCAmZmlsdGVyX3R5cGUpOwotCi0gIC8vIEJvdW5kcyBjaGVjay4gV2hlbiB0aGUgaW1hZ2UgaXMgdW5yZWFzb25hYmx5IGJpZywgd2UnbGwgZXJyb3Igb3V0IGFuZAotICAvLyBlbmQgdXAgYmFjayBhdCB0aGUgc2V0am1wIGNhbGwgd2hlbiB3ZSBzZXQgdXAgZGVjb2RpbmcuICAiVW5yZWFzb25hYmx5IGJpZyIKLSAgLy8gbWVhbnMgImJpZyBlbm91Z2ggdGhhdCB3ICogaCAqIDMyYnBwIG1pZ2h0IG92ZXJmbG93IGFuIGludCI7IHdlIGNob29zZSB0aGlzCi0gIC8vIHRocmVzaG9sZCB0byBtYXRjaCBXZWJLaXQgYW5kIGJlY2F1c2UgYSBudW1iZXIgb2YgcGxhY2VzIGluIGNvZGUgYXNzdW1lCi0gIC8vIHRoYXQgYW4gaW1hZ2UncyBzaXplIChpbiBieXRlcykgZml0cyBpbiBhIChzaWduZWQpIGludC4KLSAgdW5zaWduZWQgbG9uZyBsb25nIHRvdGFsX3NpemUgPQotICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPih3KSAqIHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oaCk7Ci0gIGlmICh0b3RhbF9zaXplID4gKCgxIDw8IDI5KSAtIDEpKQotICAgIGxvbmdqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSwgMSk7Ci0gIHN0YXRlLT53aWR0aCA9IHN0YXRpY19jYXN0PGludD4odyk7Ci0gIHN0YXRlLT5oZWlnaHQgPSBzdGF0aWNfY2FzdDxpbnQ+KGgpOwotCi0gIC8vIEV4cGFuZCB0byBlbnN1cmUgd2UgdXNlIDI0LWJpdCBmb3IgUkdCIGFuZCAzMi1iaXQgZm9yIFJHQkEuCi0gIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgfHwKLSAgICAgIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgJiYgYml0X2RlcHRoIDwgOCkpCi0gICAgcG5nX3NldF9leHBhbmQocG5nX3B0cik7Ci0KLSAgLy8gVHJhbnNwYXJlbmN5IGZvciBwYWxldHRlZCBpbWFnZXMuCi0gIGlmIChwbmdfZ2V0X3ZhbGlkKHBuZ19wdHIsIGluZm9fcHRyLCBQTkdfSU5GT190Uk5TKSkKLSAgICBwbmdfc2V0X2V4cGFuZChwbmdfcHRyKTsKLQotICAvLyBDb252ZXJ0IDE2LWJpdCB0byA4LWJpdC4KLSAgaWYgKGJpdF9kZXB0aCA9PSAxNikKLSAgICBwbmdfc2V0X3N0cmlwXzE2KHBuZ19wdHIpOwotCi0gIC8vIEV4cGFuZCBncmF5c2NhbGUgdG8gUkdCLgotICBpZiAoY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZIHx8Ci0gICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEpCi0gICAgcG5nX3NldF9ncmF5X3RvX3JnYihwbmdfcHRyKTsKLQotICAvLyBEZWFsIHdpdGggZ2FtbWEgYW5kIGtlZXAgaXQgdW5kZXIgb3VyIGNvbnRyb2wuCi0gIGRvdWJsZSBnYW1tYTsKLSAgaWYgKHBuZ19nZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgJmdhbW1hKSkgewotICAgIGlmIChnYW1tYSA8PSAwLjAgfHwgZ2FtbWEgPiBrTWF4R2FtbWEpIHsKLSAgICAgIGdhbW1hID0ga0ludmVyc2VHYW1tYTsKLSAgICAgIHBuZ19zZXRfZ0FNQShwbmdfcHRyLCBpbmZvX3B0ciwgZ2FtbWEpOwotICAgIH0KLSAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIGtEZWZhdWx0R2FtbWEsIGdhbW1hKTsKLSAgfSBlbHNlIHsKLSAgICBwbmdfc2V0X2dhbW1hKHBuZ19wdHIsIGtEZWZhdWx0R2FtbWEsIGtJbnZlcnNlR2FtbWEpOwotICB9Ci0KLSAgLy8gVGVsbCBsaWJwbmcgdG8gc2VuZCB1cyByb3dzIGZvciBpbnRlcmxhY2VkIHBuZ3MuCi0gIGlmIChpbnRlcmxhY2VfdHlwZSA9PSBQTkdfSU5URVJMQUNFX0FEQU03KQotICAgIHBuZ19zZXRfaW50ZXJsYWNlX2hhbmRsaW5nKHBuZ19wdHIpOwotCi0gIC8vIFVwZGF0ZSBvdXIgaW5mbyBub3cKLSAgcG5nX3JlYWRfdXBkYXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOwotICBjaGFubmVscyA9IHBuZ19nZXRfY2hhbm5lbHMocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gIC8vIFBpY2sgb3VyIHJvdyBmb3JtYXQgY29udmVydGVyIG5lY2Vzc2FyeSBmb3IgdGhpcyBkYXRhLgotICBpZiAoY2hhbm5lbHMgPT0gMykgewotICAgIHN3aXRjaCAoc3RhdGUtPm91dHB1dF9mb3JtYXQpIHsKLSAgICAgIGNhc2UgRk9STUFUX1JHQjoKLSAgICAgICAgc3RhdGUtPnJvd19jb252ZXJ0ZXIgPSBOVUxMOyAgLy8gbm8gY29udmVyc2lvbiBuZWNlc3NhcnkKLSAgICAgICAgc3RhdGUtPm91dHB1dF9jaGFubmVscyA9IDM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGT1JNQVRfUkdCQToKLSAgICAgICAgc3RhdGUtPnJvd19jb252ZXJ0ZXIgPSAmQ29udmVydFJHQnRvUkdCQTsKLSAgICAgICAgc3RhdGUtPm91dHB1dF9jaGFubmVscyA9IDQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGT1JNQVRfQkdSQToKLSAgICAgICAgc3RhdGUtPnJvd19jb252ZXJ0ZXIgPSAmQ29udmVydFJHQnRvQkdSQTsKLSAgICAgICAgc3RhdGUtPm91dHB1dF9jaGFubmVscyA9IDQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgTk9UUkVBQ0hFRCgpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoY2hhbm5lbHMgPT0gNCkgewotICAgIHN3aXRjaCAoc3RhdGUtPm91dHB1dF9mb3JtYXQpIHsKLSAgICAgIGNhc2UgRk9STUFUX1JHQjoKLSAgICAgICAgc3RhdGUtPnJvd19jb252ZXJ0ZXIgPSAmQ29udmVydFJHQkF0b1JHQjsKLSAgICAgICAgc3RhdGUtPm91dHB1dF9jaGFubmVscyA9IDM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGT1JNQVRfUkdCQToKLSAgICAgICAgc3RhdGUtPnJvd19jb252ZXJ0ZXIgPSBOVUxMOyAgLy8gbm8gY29udmVyc2lvbiBuZWNlc3NhcnkKLSAgICAgICAgc3RhdGUtPm91dHB1dF9jaGFubmVscyA9IDQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGT1JNQVRfQkdSQToKLSAgICAgICAgc3RhdGUtPnJvd19jb252ZXJ0ZXIgPSAmQ29udmVydEJldHdlZW5CR1JBYW5kUkdCQTsKLSAgICAgICAgc3RhdGUtPm91dHB1dF9jaGFubmVscyA9IDQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgTk9UUkVBQ0hFRCgpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIGxvbmdqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSwgMSk7Ci0gIH0KLQotICBzdGF0ZS0+b3V0cHV0LT5yZXNpemUoCi0gICAgICBzdGF0ZS0+d2lkdGggKiBzdGF0ZS0+b3V0cHV0X2NoYW5uZWxzICogc3RhdGUtPmhlaWdodCk7Ci19Ci0KLXZvaWQgRGVjb2RlUm93Q2FsbGJhY2socG5nX3N0cnVjdCogcG5nX3B0ciwgcG5nX2J5dGUqIG5ld19yb3csCi0gICAgICAgICAgICAgICAgICAgICAgIHBuZ191aW50XzMyIHJvd19udW0sIGludCBwYXNzKSB7Ci0gIFBuZ0RlY29kZXJTdGF0ZSogc3RhdGUgPSBzdGF0aWNfY2FzdDxQbmdEZWNvZGVyU3RhdGUqPigKLSAgICAgIHBuZ19nZXRfcHJvZ3Jlc3NpdmVfcHRyKHBuZ19wdHIpKTsKLQotICBpZiAoc3RhdGljX2Nhc3Q8aW50Pihyb3dfbnVtKSA+IHN0YXRlLT5oZWlnaHQpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdW5zaWduZWQgY2hhciogYmFzZSA9IE5VTEw7Ci0gIGJhc2UgPSAmc3RhdGUtPm91dHB1dC0+ZnJvbnQoKTsKLQotICB1bnNpZ25lZCBjaGFyKiBkZXN0ID0gJmJhc2Vbc3RhdGUtPndpZHRoICogc3RhdGUtPm91dHB1dF9jaGFubmVscyAqIHJvd19udW1dOwotICBpZiAoc3RhdGUtPnJvd19jb252ZXJ0ZXIpCi0gICAgc3RhdGUtPnJvd19jb252ZXJ0ZXIobmV3X3Jvdywgc3RhdGUtPndpZHRoLCBkZXN0LCAmc3RhdGUtPmlzX29wYXF1ZSk7Ci0gIGVsc2UKLSAgICBtZW1jcHkoZGVzdCwgbmV3X3Jvdywgc3RhdGUtPndpZHRoICogc3RhdGUtPm91dHB1dF9jaGFubmVscyk7Ci19Ci0KLXZvaWQgRGVjb2RlRW5kQ2FsbGJhY2socG5nX3N0cnVjdCogcG5nX3B0ciwgcG5nX2luZm8qIGluZm8pIHsKLSAgUG5nRGVjb2RlclN0YXRlKiBzdGF0ZSA9IHN0YXRpY19jYXN0PFBuZ0RlY29kZXJTdGF0ZSo+KAotICAgICAgcG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocG5nX3B0cikpOwotCi0gIC8vIE1hcmsgdGhlIGltYWdlIGFzIGNvbXBsZXRlLCB0aGlzIHdpbGwgdGVsbCB0aGUgRGVjb2RlIGZ1bmN0aW9uIHRoYXQgd2UKLSAgLy8gaGF2ZSBzdWNjZXNzZnVsbHkgZm91bmQgdGhlIGVuZCBvZiB0aGUgZGF0YS4KLSAgc3RhdGUtPmRvbmUgPSB0cnVlOwotfQotCi0vLyBBdXRvbWF0aWNhbGx5IGRlc3Ryb3lzIHRoZSBnaXZlbiByZWFkIHN0cnVjdHMgb24gZGVzdHJ1Y3Rpb24gdG8gbWFrZQotLy8gY2xlYW51cCBhbmQgZXJyb3IgaGFuZGxpbmcgY29kZSBjbGVhbmVyLgotY2xhc3MgUG5nUmVhZFN0cnVjdERlc3Ryb3llciB7Ci0gcHVibGljOgotICBQbmdSZWFkU3RydWN0RGVzdHJveWVyKHBuZ19zdHJ1Y3QqKiBwcywgcG5nX2luZm8qKiBwaSkgOiBwc18ocHMpLCBwaV8ocGkpIHsKLSAgfQotICB+UG5nUmVhZFN0cnVjdERlc3Ryb3llcigpIHsKLSAgICBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdChwc18sIHBpXywgTlVMTCk7Ci0gIH0KLSBwcml2YXRlOgotICBwbmdfc3RydWN0KiogcHNfOwotICBwbmdfaW5mbyoqIHBpXzsKLX07Ci0KLWJvb2wgQnVpbGRQTkdTdHJ1Y3QoY29uc3QgdW5zaWduZWQgY2hhciogaW5wdXQsIHNpemVfdCBpbnB1dF9zaXplLAotICAgICAgICAgICAgICAgICAgICBwbmdfc3RydWN0KiogcG5nX3B0ciwgcG5nX2luZm8qKiBpbmZvX3B0cikgewotICBpZiAoaW5wdXRfc2l6ZSA8IDgpCi0gICAgcmV0dXJuIGZhbHNlOyAgLy8gSW5wdXQgZGF0YSB0b28gc21hbGwgdG8gYmUgYSBwbmcKLQotICAvLyBIYXZlIGxpYnBuZyBjaGVjayB0aGUgc2lnbmF0dXJlLCBpdCBsaWtlcyB0aGUgZmlyc3QgOCBieXRlcy4KLSAgaWYgKHBuZ19zaWdfY21wKGNvbnN0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KGlucHV0KSwgMCwgOCkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKnBuZ19wdHIgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gIGlmICghKnBuZ19wdHIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICppbmZvX3B0ciA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QoKnBuZ19wdHIpOwotICBpZiAoISppbmZvX3B0cikgewotICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KHBuZ19wdHIsIE5VTEwsIE5VTEwpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1ib29sIERlY29kZShjb25zdCB1bnNpZ25lZCBjaGFyKiBpbnB1dCwgc2l6ZV90IGlucHV0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgQ29sb3JGb3JtYXQgZm9ybWF0LCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgIGludCogdywgaW50KiBoKSB7Ci0gIHBuZ19zdHJ1Y3QqIHBuZ19wdHIgPSBOVUxMOwotICBwbmdfaW5mbyogaW5mb19wdHIgPSBOVUxMOwotICBpZiAoIUJ1aWxkUE5HU3RydWN0KGlucHV0LCBpbnB1dF9zaXplLCAmcG5nX3B0ciwgJmluZm9fcHRyKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgUG5nUmVhZFN0cnVjdERlc3Ryb3llciBkZXN0cm95ZXIoJnBuZ19wdHIsICZpbmZvX3B0cik7Ci0gIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpIHsKLSAgICAvLyBUaGUgZGVzdHJveWVyIHdpbGwgZW5zdXJlIHRoYXQgdGhlIHN0cnVjdHVyZXMgYXJlIGNsZWFuZWQgdXAgaW4gdGhpcwotICAgIC8vIGNhc2UsIGV2ZW4gdGhvdWdoIHdlIG1heSBnZXQgaGVyZSBhcyBhIGp1bXAgZnJvbSByYW5kb20gcGFydHMgb2YgdGhlCi0gICAgLy8gUE5HIGxpYnJhcnkgY2FsbGVkIGJlbG93LgotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIFBuZ0RlY29kZXJTdGF0ZSBzdGF0ZShmb3JtYXQsIG91dHB1dCk7Ci0KLSAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKHBuZ19wdHIsICZzdGF0ZSwgJkRlY29kZUluZm9DYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEZWNvZGVSb3dDYWxsYmFjaywgJkRlY29kZUVuZENhbGxiYWNrKTsKLSAgcG5nX3Byb2Nlc3NfZGF0YShwbmdfcHRyLAotICAgICAgICAgICAgICAgICAgIGluZm9fcHRyLAotICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KGlucHV0KSwKLSAgICAgICAgICAgICAgICAgICBpbnB1dF9zaXplKTsKLQotICBpZiAoIXN0YXRlLmRvbmUpIHsKLSAgICAvLyBGZWQgaXQgYWxsIHRoZSBkYXRhIGJ1dCB0aGUgbGlicmFyeSBkaWRuJ3QgdGhpbmsgd2UgZ290IGFsbCB0aGUgZGF0YSwgc28KLSAgICAvLyB0aGlzIGZpbGUgbXVzdCBiZSB0cnVuY2F0ZWQuCi0gICAgb3V0cHV0LT5jbGVhcigpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICp3ID0gc3RhdGUud2lkdGg7Ci0gICpoID0gc3RhdGUuaGVpZ2h0OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gRW5jb2RlcgotLy8KLS8vIFRoaXMgc2VjdGlvbiBvZiB0aGUgY29kZSBpcyBiYXNlZCBvbiBuc1BOR0VuY29kZXIuY3BwIGluIE1vemlsbGEKLS8vIChDb3B5cmlnaHQgMjAwNSBHb29nbGUgSW5jLikKLQotbmFtZXNwYWNlIHsKLQotLy8gUGFzc2VkIGFyb3VuZCBhcyB0aGUgaW9fcHRyIGluIHRoZSBwbmcgc3RydWN0cyBzbyBvdXIgY2FsbGJhY2tzIGtub3cgd2hlcmUKLS8vIHRvIHdyaXRlIGRhdGEuCi1zdHJ1Y3QgUG5nRW5jb2RlclN0YXRlIHsKLSAgZXhwbGljaXQgUG5nRW5jb2RlclN0YXRlKHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+KiBvKSA6IG91dChvKSB7fQotICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiogb3V0OwotfTsKLQotLy8gQ2FsbGVkIGJ5IGxpYnBuZyB0byBmbHVzaCBpdHMgaW50ZXJuYWwgYnVmZmVyIHRvIG91cnMuCi12b2lkIEVuY29kZXJXcml0ZUNhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZywgcG5nX2J5dGVwIGRhdGEsIHBuZ19zaXplX3Qgc2l6ZSkgewotICBQbmdFbmNvZGVyU3RhdGUqIHN0YXRlID0gc3RhdGljX2Nhc3Q8UG5nRW5jb2RlclN0YXRlKj4ocG5nX2dldF9pb19wdHIocG5nKSk7Ci0gIHNpemVfdCBvbGRfc2l6ZSA9IHN0YXRlLT5vdXQtPnNpemUoKTsKLSAgc3RhdGUtPm91dC0+cmVzaXplKG9sZF9zaXplICsgc2l6ZSk7Ci0gIG1lbWNweSgmKCpzdGF0ZS0+b3V0KVtvbGRfc2l6ZV0sIGRhdGEsIHNpemUpOwotfQotCi12b2lkIEZha2VGbHVzaENhbGxiYWNrKHBuZ19zdHJ1Y3RwIHBuZykgewotICAvLyBXZSBkb24ndCBuZWVkIHRvIHBlcmZvcm0gYW55IGZsdXNoaW5nIHNpbmNlIHdlIGFyZW4ndCBkb2luZyByZWFsIElPLCBidXQKLSAgLy8gd2UncmUgcmVxdWlyZWQgdG8gcHJvdmlkZSB0aGlzIGZ1bmN0aW9uIGJ5IGxpYnBuZy4KLX0KLQotdm9pZCBDb252ZXJ0QkdSQXRvUkdCKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGJncmEsIGludCBwaXhlbF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiByZ2IsIGJvb2wqIGlzX29wYXF1ZSkgewotICBmb3IgKGludCB4ID0gMDsgeCA8IHBpeGVsX3dpZHRoOyB4KyspIHsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBwaXhlbF9pbiA9ICZiZ3JhW3ggKiA0XTsKLSAgICB1bnNpZ25lZCBjaGFyKiBwaXhlbF9vdXQgPSAmcmdiW3ggKiAzXTsKLSAgICBwaXhlbF9vdXRbMF0gPSBwaXhlbF9pblsyXTsKLSAgICBwaXhlbF9vdXRbMV0gPSBwaXhlbF9pblsxXTsKLSAgICBwaXhlbF9vdXRbMl0gPSBwaXhlbF9pblswXTsKLSAgfQotfQotCi0jaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECi0KLWlubGluZSBjaGFyKiBzdHJkdXAoY29uc3QgY2hhciogc3RyKSB7Ci0jaWYgZGVmaW5lZChPU19XSU4pCi0gIHJldHVybiBfc3RyZHVwKHN0cik7Ci0jZWxzZQotICByZXR1cm4gOjpzdHJkdXAoc3RyKTsKLSNlbmRpZgotfQotCi1jbGFzcyBDb21tZW50V3JpdGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENvbW1lbnRXcml0ZXIoY29uc3Qgc3RkOjp2ZWN0b3I8Q29tbWVudD4mIGNvbW1lbnRzKQotICAgICAgOiBjb21tZW50c18oY29tbWVudHMpLAotICAgICAgICBwbmdfdGV4dF8obmV3IHBuZ190ZXh0W2NvbW1lbnRzLnNpemUoKV0pIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbW1lbnRzLnNpemUoKTsgKytpKQotICAgICAgQWRkQ29tbWVudChpLCBjb21tZW50c1tpXSk7Ci0gIH0KLQotICB+Q29tbWVudFdyaXRlcigpIHsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbW1lbnRzXy5zaXplKCk7ICsraSkgewotICAgICAgZnJlZShwbmdfdGV4dF9baV0ua2V5KTsKLSAgICAgIGZyZWUocG5nX3RleHRfW2ldLnRleHQpOwotICAgIH0KLSAgICBkZWxldGUgW10gcG5nX3RleHRfOwotICB9Ci0KLSAgYm9vbCBIYXNDb21tZW50cygpIHsKLSAgICByZXR1cm4gIWNvbW1lbnRzXy5lbXB0eSgpOwotICB9Ci0KLSAgcG5nX3RleHQqIGdldF9wbmdfdGV4dCgpIHsKLSAgICByZXR1cm4gcG5nX3RleHRfOwotICB9Ci0KLSAgaW50IHNpemUoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oY29tbWVudHNfLnNpemUoKSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHZvaWQgQWRkQ29tbWVudChzaXplX3QgcG9zLCBjb25zdCBDb21tZW50JiBjb21tZW50KSB7Ci0gICAgcG5nX3RleHRfW3Bvc10uY29tcHJlc3Npb24gPSBQTkdfVEVYVF9DT01QUkVTU0lPTl9OT05FOwotICAgIC8vIEEgUE5HIGNvbW1lbnQncyBrZXkgY2FuIG9ubHkgYmUgNzkgY2hhcmFjdGVycyBsb25nLgotICAgIGlmIChjb21tZW50LmtleS5sZW5ndGgoKSA+IDc5KQotICAgICAgcmV0dXJuOwotICAgIHBuZ190ZXh0X1twb3NdLmtleSA9IHN0cmR1cChjb21tZW50LmtleS5zdWJzdHIoMCwgNzgpLmNfc3RyKCkpOwotICAgIHBuZ190ZXh0X1twb3NdLnRleHQgPSBzdHJkdXAoY29tbWVudC50ZXh0LmNfc3RyKCkpOwotICAgIHBuZ190ZXh0X1twb3NdLnRleHRfbGVuZ3RoID0gY29tbWVudC50ZXh0Lmxlbmd0aCgpOwotI2lmZGVmIFBOR19pVFh0X1NVUFBPUlRFRAotICAgIHBuZ190ZXh0X1twb3NdLml0eHRfbGVuZ3RoID0gMDsKLSAgICBwbmdfdGV4dF9bcG9zXS5sYW5nID0gMDsKLSAgICBwbmdfdGV4dF9bcG9zXS5sYW5nX2tleSA9IDA7Ci0jZW5kaWYKLSAgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPENvbW1lbnQ+IGNvbW1lbnRzXzsKLSAgcG5nX3RleHQqIHBuZ190ZXh0XzsKLX07Ci0jZW5kaWYgIC8vIFBOR19URVhUX1NVUFBPUlRFRAotCi0vLyBUaGUgdHlwZSBvZiBmdW5jdGlvbnMgdXNhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gcGl4ZWwgZm9ybWF0cy4KLXR5cGVkZWYgdm9pZCAoKkZvcm1hdENvbnZlcnRlcikoY29uc3QgdW5zaWduZWQgY2hhciogaW4sIGludCB3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBvdXQsIGJvb2wqIGlzX29wYXF1ZSk7Ci0KLS8vIGxpYnBuZyB1c2VzIGEgd2Fja3kgc2V0am1wLWJhc2VkIEFQSSwgd2hpY2ggbWFrZXMgdGhlIGNvbXBpbGVyIG5lcnZvdXMuCi0vLyBXZSBjb25zdHJhaW4gYWxsIG9mIHRoZSBjYWxscyB3ZSBtYWtlIHRvIGxpYnBuZyB3aGVyZSB0aGUgc2V0am1wKCkgaXMgaW4KLS8vIHBsYWNlIHRvIHRoaXMgZnVuY3Rpb24uCi0vLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KLWJvb2wgRG9MaWJwbmdXcml0ZShwbmdfc3RydWN0KiBwbmdfcHRyLCBwbmdfaW5mbyogaW5mb19wdHIsCi0gICAgICAgICAgICAgICAgICAgUG5nRW5jb2RlclN0YXRlKiBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCByb3dfYnl0ZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbnB1dCwgaW50IGNvbXByZXNzaW9uX2xldmVsLAotICAgICAgICAgICAgICAgICAgIGludCBwbmdfb3V0cHV0X2NvbG9yX3R5cGUsIGludCBvdXRwdXRfY29sb3JfY29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICBGb3JtYXRDb252ZXJ0ZXIgY29udmVydGVyLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvbW1lbnQ+JiBjb21tZW50cykgewotI2lmZGVmIFBOR19URVhUX1NVUFBPUlRFRAotICBDb21tZW50V3JpdGVyIGNvbW1lbnRfd3JpdGVyKGNvbW1lbnRzKTsKLSNlbmRpZgotICB1bnNpZ25lZCBjaGFyKiByb3dfYnVmZmVyID0gTlVMTDsKLQotICAvLyBNYWtlIHN1cmUgdG8gbm90IGRlY2xhcmUgYW55IGxvY2FscyBoZXJlIC0tIGxvY2FscyBpbiB0aGUgcHJlc2VuY2UKLSAgLy8gb2Ygc2V0am1wKCkgaW4gQysrIGNvZGUgbWFrZXMgZ2NjIGNvbXBsYWluLgotCi0gIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpIHsKLSAgICBkZWxldGVbXSByb3dfYnVmZmVyOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwocG5nX3B0ciwgY29tcHJlc3Npb25fbGV2ZWwpOwotCi0gIC8vIFNldCBvdXIgY2FsbGJhY2sgZm9yIGxpYnBuZyB0byBnaXZlIHVzIHRoZSBkYXRhLgotICBwbmdfc2V0X3dyaXRlX2ZuKHBuZ19wdHIsIHN0YXRlLCBFbmNvZGVyV3JpdGVDYWxsYmFjaywgRmFrZUZsdXNoQ2FsbGJhY2spOwotCi0gIHBuZ19zZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgd2lkdGgsIGhlaWdodCwgOCwgcG5nX291dHB1dF9jb2xvcl90eXBlLAotICAgICAgICAgICAgICAgUE5HX0lOVEVSTEFDRV9OT05FLCBQTkdfQ09NUFJFU1NJT05fVFlQRV9ERUZBVUxULAotICAgICAgICAgICAgICAgUE5HX0ZJTFRFUl9UWVBFX0RFRkFVTFQpOwotCi0jaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECi0gIGlmIChjb21tZW50X3dyaXRlci5IYXNDb21tZW50cygpKSB7Ci0gICAgcG5nX3NldF90ZXh0KHBuZ19wdHIsIGluZm9fcHRyLCBjb21tZW50X3dyaXRlci5nZXRfcG5nX3RleHQoKSwKLSAgICAgICAgICAgICAgICAgY29tbWVudF93cml0ZXIuc2l6ZSgpKTsKLSAgfQotI2VuZGlmCi0KLSAgcG5nX3dyaXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOwotCi0gIGlmICghY29udmVydGVyKSB7Ci0gICAgLy8gTm8gY29udmVyc2lvbiBuZWVkZWQsIGdpdmUgdGhlIGRhdGEgZGlyZWN0bHkgdG8gbGlicG5nLgotICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICsrKSB7Ci0gICAgICBwbmdfd3JpdGVfcm93KHBuZ19wdHIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KCZpbnB1dFt5ICogcm93X2J5dGVfd2lkdGhdKSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIE5lZWRzIGNvbnZlcnNpb24gdXNpbmcgYSBzZXBhcmF0ZSBidWZmZXIuCi0gICAgcm93X2J1ZmZlciA9IG5ldyB1bnNpZ25lZCBjaGFyW3dpZHRoICogb3V0cHV0X2NvbG9yX2NvbXBvbmVudHNdOwotICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICsrKSB7Ci0gICAgICBjb252ZXJ0ZXIoJmlucHV0W3kgKiByb3dfYnl0ZV93aWR0aF0sIHdpZHRoLCByb3dfYnVmZmVyLCBOVUxMKTsKLSAgICAgIHBuZ193cml0ZV9yb3cocG5nX3B0ciwgcm93X2J1ZmZlcik7Ci0gICAgfQotICAgIGRlbGV0ZVtdIHJvd19idWZmZXI7Ci0gIH0KLQotICBwbmdfd3JpdGVfZW5kKHBuZ19wdHIsIGluZm9fcHRyKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLWJvb2wgRW5jb2RlV2l0aENvbXByZXNzaW9uTGV2ZWwoY29uc3QgdW5zaWduZWQgY2hhciogaW5wdXQsIENvbG9yRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHdpZHRoLCBjb25zdCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X2J5dGVfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGlzY2FyZF90cmFuc3BhcmVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvbW1lbnQ+JiBjb21tZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXByZXNzaW9uX2xldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiogb3V0cHV0KSB7Ci0gIC8vIFJ1biB0byBjb252ZXJ0IGFuIGlucHV0IHJvdyBpbnRvIHRoZSBvdXRwdXQgcm93IGZvcm1hdCwgTlVMTCBtZWFucyBubwotICAvLyBjb252ZXJzaW9uIGlzIG5lY2Vzc2FyeS4KLSAgRm9ybWF0Q29udmVydGVyIGNvbnZlcnRlciA9IE5VTEw7Ci0KLSAgaW50IGlucHV0X2NvbG9yX2NvbXBvbmVudHMsIG91dHB1dF9jb2xvcl9jb21wb25lbnRzOwotICBpbnQgcG5nX291dHB1dF9jb2xvcl90eXBlOwotICBzd2l0Y2ggKGZvcm1hdCkgewotICAgIGNhc2UgRk9STUFUX1JHQjoKLSAgICAgIGlucHV0X2NvbG9yX2NvbXBvbmVudHMgPSAzOwotICAgICAgb3V0cHV0X2NvbG9yX2NvbXBvbmVudHMgPSAzOwotICAgICAgcG5nX291dHB1dF9jb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCOwotICAgICAgZGlzY2FyZF90cmFuc3BhcmVuY3kgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGT1JNQVRfUkdCQToKLSAgICAgIGlucHV0X2NvbG9yX2NvbXBvbmVudHMgPSA0OwotICAgICAgaWYgKGRpc2NhcmRfdHJhbnNwYXJlbmN5KSB7Ci0gICAgICAgIG91dHB1dF9jb2xvcl9jb21wb25lbnRzID0gMzsKLSAgICAgICAgcG5nX291dHB1dF9jb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCOwotICAgICAgICBjb252ZXJ0ZXIgPSBDb252ZXJ0UkdCQXRvUkdCOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb3V0cHV0X2NvbG9yX2NvbXBvbmVudHMgPSA0OwotICAgICAgICBwbmdfb3V0cHV0X2NvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE7Ci0gICAgICAgIGNvbnZlcnRlciA9IE5VTEw7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRk9STUFUX0JHUkE6Ci0gICAgICBpbnB1dF9jb2xvcl9jb21wb25lbnRzID0gNDsKLSAgICAgIGlmIChkaXNjYXJkX3RyYW5zcGFyZW5jeSkgewotICAgICAgICBvdXRwdXRfY29sb3JfY29tcG9uZW50cyA9IDM7Ci0gICAgICAgIHBuZ19vdXRwdXRfY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQjsKLSAgICAgICAgY29udmVydGVyID0gQ29udmVydEJHUkF0b1JHQjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dHB1dF9jb2xvcl9jb21wb25lbnRzID0gNDsKLSAgICAgICAgcG5nX291dHB1dF9jb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOwotICAgICAgICBjb252ZXJ0ZXIgPSBDb252ZXJ0QmV0d2VlbkJHUkFhbmRSR0JBOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgTk9UUkVBQ0hFRCgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gUm93IHN0cmlkZSBzaG91bGQgYmUgYXQgbGVhc3QgYXMgbG9uZyBhcyB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhLgotICBpZiAoaW5wdXRfY29sb3JfY29tcG9uZW50cyAqIHdpZHRoIDwgcm93X2J5dGVfd2lkdGgpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHBuZ19zdHJ1Y3QqIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMKTsKLSAgaWYgKCFwbmdfcHRyKQotICAgIHJldHVybiBmYWxzZTsKLSAgcG5nX2luZm8qIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmdfcHRyKTsKLSAgaWYgKCFpbmZvX3B0cikgewotICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgTlVMTCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgUG5nRW5jb2RlclN0YXRlIHN0YXRlKG91dHB1dCk7Ci0gIGJvb2wgc3VjY2VzcyA9IERvTGlicG5nV3JpdGUocG5nX3B0ciwgaW5mb19wdHIsICZzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCByb3dfYnl0ZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgY29tcHJlc3Npb25fbGV2ZWwsIHBuZ19vdXRwdXRfY29sb3JfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfY29sb3JfY29tcG9uZW50cywgY29udmVydGVyLCBjb21tZW50cyk7Ci0gIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKLQotICByZXR1cm4gc3VjY2VzczsKLX0KLQotLy8gc3RhdGljCi1ib29sIEVuY29kZShjb25zdCB1bnNpZ25lZCBjaGFyKiBpbnB1dCwgQ29sb3JGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgY29uc3QgaW50IHdpZHRoLCBjb25zdCBpbnQgaGVpZ2h0LCBpbnQgcm93X2J5dGVfd2lkdGgsCi0gICAgICAgICAgICBib29sIGRpc2NhcmRfdHJhbnNwYXJlbmN5LAotICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29tbWVudD4mIGNvbW1lbnRzLAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4qIG91dHB1dCkgewotICByZXR1cm4gRW5jb2RlV2l0aENvbXByZXNzaW9uTGV2ZWwoaW5wdXQsIGZvcm1hdCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd19ieXRlX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY2FyZF90cmFuc3BhcmVuY3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50cywgWl9ERUZBVUxUX0NPTVBSRVNTSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KTsKLX0KLQotLy8gRGVjb2RlIGEgUE5HIGludG8gYW4gUkdCQSBwaXhlbCBhcnJheS4KLWJvb2wgRGVjb2RlUE5HKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGlucHV0LCBzaXplX3QgaW5wdXRfc2l6ZSwKLSAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+KiBvdXRwdXQsCi0gICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCkgewotICByZXR1cm4gRGVjb2RlKGlucHV0LCBpbnB1dF9zaXplLCBGT1JNQVRfUkdCQSwgb3V0cHV0LCB3aWR0aCwgaGVpZ2h0KTsKLX0KLQotLy8gRW5jb2RlIGFuIFJHQkEgcGl4ZWwgYXJyYXkgaW50byBhIFBORy4KLWJvb2wgRW5jb2RlUkdCQVBORyhjb25zdCB1bnNpZ25lZCBjaGFyKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICBpbnQgcm93X2J5dGVfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4qIG91dHB1dCkgewotICByZXR1cm4gRW5jb2RlKGlucHV0LCBGT1JNQVRfUkdCQSwKLSAgICAgIHdpZHRoLCBoZWlnaHQsIHJvd19ieXRlX3dpZHRoLCBmYWxzZSwKLSAgICAgIHN0ZDo6dmVjdG9yPENvbW1lbnQ+KCksIG91dHB1dCk7Ci19Ci0KLS8vIEVuY29kZSBhbiBCR1JBIHBpeGVsIGFycmF5IGludG8gYSBQTkcuCi1ib29sIEVuY29kZUJHUkFQTkcoY29uc3QgdW5zaWduZWQgY2hhciogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgaW50IHJvd19ieXRlX3dpZHRoLAotICAgICAgICAgICAgICAgICAgIGJvb2wgZGlzY2FyZF90cmFuc3BhcmVuY3ksCi0gICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4qIG91dHB1dCkgewotICByZXR1cm4gRW5jb2RlKGlucHV0LCBGT1JNQVRfQkdSQSwKLSAgICAgIHdpZHRoLCBoZWlnaHQsIHJvd19ieXRlX3dpZHRoLCBkaXNjYXJkX3RyYW5zcGFyZW5jeSwKLSAgICAgIHN0ZDo6dmVjdG9yPENvbW1lbnQ+KCksIG91dHB1dCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbWFnZV9kaWZmX3BuZwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9pbWFnZV9kaWZmX3BuZy5oIGIvc2FtcGxlcy9pbWFnZV9kaWZmX3BuZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmIzOTVhLi4wMDAwMDAwCi0tLSBhL3NhbXBsZXMvaW1hZ2VfZGlmZl9wbmcuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2lmbmRlZiBTQU1QTEVTX0lNQUdFX0RJRkZfUE5HX0hfCi0jZGVmaW5lIFNBTVBMRVNfSU1BR0VfRElGRl9QTkdfSF8KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gZm9yIHNpemVfdC4KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotbmFtZXNwYWNlIGltYWdlX2RpZmZfcG5nIHsKLQotLy8gRGVjb2RlIGEgUE5HIGludG8gYW4gUkdCQSBwaXhlbCBhcnJheS4KLWJvb2wgRGVjb2RlUE5HKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGlucHV0LAotICAgICAgICAgICAgICAgc2l6ZV90IGlucHV0X3NpemUsCi0gICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiogb3V0cHV0LAotICAgICAgICAgICAgICAgaW50KiB3aWR0aCwKLSAgICAgICAgICAgICAgIGludCogaGVpZ2h0KTsKLQotLy8gRW5jb2RlIGFuIFJHQkEgcGl4ZWwgYXJyYXkgaW50byBhIFBORy4KLWJvb2wgRW5jb2RlUkdCQVBORyhjb25zdCB1bnNpZ25lZCBjaGFyKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICBpbnQgcm93X2J5dGVfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4qIG91dHB1dCk7Ci0KLS8vIEVuY29kZSBhbiBCR1JBIHBpeGVsIGFycmF5IGludG8gYSBQTkcuCi1ib29sIEVuY29kZUJHUkFQTkcoY29uc3QgdW5zaWduZWQgY2hhciogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgaW50IHJvd19ieXRlX3dpZHRoLAotICAgICAgICAgICAgICAgICAgIGJvb2wgZGlzY2FyZF90cmFuc3BhcmVuY3ksCi0gICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4qIG91dHB1dCk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbWFnZV9kaWZmX3BuZwotCi0jZW5kaWYgIC8vIFNBTVBMRVNfSU1BR0VfRElGRl9QTkdfSF8KZGlmZiAtLWdpdCBhL3NhbXBsZXMvcGRmaXVtX3Rlc3QuY2MgYi9zYW1wbGVzL3BkZml1bV90ZXN0LmNjCmluZGV4IGEwYWZkNGQuLjE1NDliZDcgMTAwNjQ0Ci0tLSBhL3NhbXBsZXMvcGRmaXVtX3Rlc3QuY2MKKysrIGIvc2FtcGxlcy9wZGZpdW1fdGVzdC5jYwpAQCAtNyw3ICs3LDEwIEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CiAjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx1dGlsaXR5PgpAQCAtMTcsMTUgKzIwLDIwIEBACiAjZGVmaW5lIF9TS0lBX1NVUFBPUlRfCiAjZW5kaWYKIAotI2luY2x1ZGUgImNvcmUvZmRybS9jcnlwdG8vZnhfY3J5cHQuaCIKKyNpbmNsdWRlICJwdWJsaWMvY3BwL2ZwZGZfZGVsZXRlcnMuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9hbm5vdC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2F0dGFjaG1lbnQuaCIKICNpbmNsdWRlICJwdWJsaWMvZnBkZl9kYXRhYXZhaWwuaCIKICNpbmNsdWRlICJwdWJsaWMvZnBkZl9lZGl0LmgiCiAjaW5jbHVkZSAicHVibGljL2ZwZGZfZXh0LmgiCiAjaW5jbHVkZSAicHVibGljL2ZwZGZfZm9ybWZpbGwuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9wcm9ncmVzc2l2ZS5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX3N0cnVjdHRyZWUuaCIKICNpbmNsdWRlICJwdWJsaWMvZnBkZl90ZXh0LmgiCiAjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCi0jaW5jbHVkZSAic2FtcGxlcy9pbWFnZV9kaWZmX3BuZy5oIgorI2luY2x1ZGUgInRlc3RpbmcvaW1hZ2VfZGlmZi9pbWFnZV9kaWZmX3BuZy5oIgogI2luY2x1ZGUgInRlc3RpbmcvdGVzdF9zdXBwb3J0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9sb2dnaW5nLmgiCiAKICNpZmRlZiBfV0lOMzIKICNpbmNsdWRlIDxpby5oPgpAQCAtMzMsNiArNDEsMTAgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNlbmRpZgogCisjaWZkZWYgRU5BQkxFX0NBTExHUklORAorI2luY2x1ZGUgPHZhbGdyaW5kL2NhbGxncmluZC5oPgorI2VuZGlmICAvLyBFTkFCTEVfQ0FMTEdSSU5ECisKICNpZmRlZiBQREZfRU5BQkxFX1Y4CiAjaW5jbHVkZSAidjgvaW5jbHVkZS9saWJwbGF0Zm9ybS9saWJwbGF0Zm9ybS5oIgogI2luY2x1ZGUgInY4L2luY2x1ZGUvdjguaCIKQEAgLTUxLDI4ICs2Myw0OSBAQAogCiBlbnVtIE91dHB1dEZvcm1hdCB7CiAgIE9VVFBVVF9OT05FLAorICBPVVRQVVRfU1RSVUNUVVJFLAogICBPVVRQVVRfVEVYVCwKICAgT1VUUFVUX1BQTSwKICAgT1VUUFVUX1BORywKKyAgT1VUUFVUX0FOTk9ULAogI2lmZGVmIF9XSU4zMgogICBPVVRQVVRfQk1QLAogICBPVVRQVVRfRU1GLAorICBPVVRQVVRfUFMyLAorICBPVVRQVVRfUFMzLAogI2VuZGlmCiAjaWZkZWYgUERGX0VOQUJMRV9TS0lBCiAgIE9VVFBVVF9TS1AsCiAjZW5kaWYKIH07CiAKK25hbWVzcGFjZSB7CisKIHN0cnVjdCBPcHRpb25zIHsKICAgT3B0aW9ucygpCiAgICAgICA6IHNob3dfY29uZmlnKGZhbHNlKSwKKyAgICAgICAgc2hvd19tZXRhZGF0YShmYWxzZSksCiAgICAgICAgIHNlbmRfZXZlbnRzKGZhbHNlKSwKKyAgICAgICAgcmVuZGVyX29uZXNob3QoZmFsc2UpLAorICAgICAgICBzYXZlX2F0dGFjaG1lbnRzKGZhbHNlKSwKKyAgICAgICAgc2F2ZV9pbWFnZXMoZmFsc2UpLAorI2lmZGVmIEVOQUJMRV9DQUxMR1JJTkQKKyAgICAgICAgY2FsbGdyaW5kX2RlbGltaXRlcnMoZmFsc2UpLAorI2VuZGlmICAvLyBFTkFCTEVfQ0FMTEdSSU5ECiAgICAgICAgIHBhZ2VzKGZhbHNlKSwKICAgICAgICAgbWQ1KGZhbHNlKSwKLSAgICAgICAgb3V0cHV0X2Zvcm1hdChPVVRQVVRfTk9ORSkge30KKyAgICAgICAgb3V0cHV0X2Zvcm1hdChPVVRQVVRfTk9ORSkgeworICB9CiAKICAgYm9vbCBzaG93X2NvbmZpZzsKKyAgYm9vbCBzaG93X21ldGFkYXRhOwogICBib29sIHNlbmRfZXZlbnRzOworICBib29sIHJlbmRlcl9vbmVzaG90OworICBib29sIHNhdmVfYXR0YWNobWVudHM7CisgIGJvb2wgc2F2ZV9pbWFnZXM7CisjaWZkZWYgRU5BQkxFX0NBTExHUklORAorICBib29sIGNhbGxncmluZF9kZWxpbWl0ZXJzOworI2VuZGlmICAvLyBFTkFCTEVfQ0FMTEdSSU5ECiAgIGJvb2wgcGFnZXM7CiAgIGJvb2wgbWQ1OwogICBPdXRwdXRGb3JtYXQgb3V0cHV0X2Zvcm1hdDsKQEAgLTg4LDIzICsxMjEsMTkgQEAKIHN0cnVjdCBGUERGX0ZPUk1GSUxMSU5GT19QREZpdW1UZXN0IDogcHVibGljIEZQREZfRk9STUZJTExJTkZPIHsKICAgLy8gSG9sZCBhIG1hcCBvZiB0aGUgY3VycmVudGx5IGxvYWRlZCBwYWdlcyBpbiBvcmRlciB0byBhdm9pZCB0aGVtCiAgIC8vIHRvIGdldCBsb2FkZWQgdHdpY2UuCi0gIHN0ZDo6bWFwPGludCwgRlBERl9QQUdFPiBsb2FkZWRfcGFnZXM7CisgIHN0ZDo6bWFwPGludCwgc3RkOjp1bmlxdWVfcHRyPHZvaWQsIEZQREZQYWdlRGVsZXRlcj4+IGxvYWRlZF9wYWdlczsKIAogICAvLyBIb2xkIGEgcG9pbnRlciBvZiBGUERGX0ZPUk1IQU5ETEUgc28gdGhhdCBQREZpdW0gYXBwIGhvb2tzIGNhbgogICAvLyBtYWtlIHVzZSBvZiBpdC4KICAgRlBERl9GT1JNSEFORExFIGZvcm1faGFuZGxlOwogfTsKIAotc3RydWN0IEF2YWlsRGVsZXRlciB7Ci0gIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoRlBERl9BVkFJTCBhdmFpbCkgY29uc3QgeyBGUERGQXZhaWxfRGVzdHJveShhdmFpbCk7IH0KLX07Ci0KLXN0YXRpYyBGUERGX0ZPUk1GSUxMSU5GT19QREZpdW1UZXN0KiBUb1BERml1bVRlc3RGb3JtRmlsbEluZm8oCitGUERGX0ZPUk1GSUxMSU5GT19QREZpdW1UZXN0KiBUb1BERml1bVRlc3RGb3JtRmlsbEluZm8oCiAgICAgRlBERl9GT1JNRklMTElORk8qIGZvcm1fZmlsbF9pbmZvKSB7CiAgIHJldHVybiBzdGF0aWNfY2FzdDxGUERGX0ZPUk1GSUxMSU5GT19QREZpdW1UZXN0Kj4oZm9ybV9maWxsX2luZm8pOwogfQogCi1zdGF0aWMgYm9vbCBDaGVja0RpbWVuc2lvbnMoaW50IHN0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Citib29sIENoZWNrRGltZW5zaW9ucyhpbnQgc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKICAgaWYgKHN0cmlkZSA8IDAgfHwgd2lkdGggPCAwIHx8IGhlaWdodCA8IDApCiAgICAgcmV0dXJuIGZhbHNlOwogICBpZiAoaGVpZ2h0ID4gMCAmJiB3aWR0aCA+IElOVF9NQVggLyBoZWlnaHQpCkBAIC0xMTIsMjMgKzE0MSwyMCBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHZvaWQgT3V0cHV0TUQ1SGFzaChjb25zdCBjaGFyKiBmaWxlX25hbWUsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgaW50IGxlbikgewordm9pZCBPdXRwdXRNRDVIYXNoKGNvbnN0IGNoYXIqIGZpbGVfbmFtZSwgY29uc3QgY2hhciogYnVmZmVyLCBpbnQgbGVuKSB7CiAgIC8vIEdldCB0aGUgTUQ1IGhhc2ggYW5kIHdyaXRlIGl0IHRvIHN0ZG91dC4KLSAgdWludDhfdCBkaWdlc3RbMTZdOwotICBDUllQVF9NRDVHZW5lcmF0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIpLCBsZW4sIGRpZ2VzdCk7Ci0gIHByaW50ZigiTUQ1OiVzOiIsIGZpbGVfbmFtZSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKLSAgICBwcmludGYoIiUwMngiLCBkaWdlc3RbaV0pOwotICBwcmludGYoIlxuIik7CisgIHN0ZDo6c3RyaW5nIGhhc2ggPQorICAgICAgR2VuZXJhdGVNRDVCYXNlMTYocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyKSwgbGVuKTsKKyAgcHJpbnRmKCJNRDU6JXM6JXNcbiIsIGZpbGVfbmFtZSwgaGFzaC5jX3N0cigpKTsKIH0KIAotc3RhdGljIHN0ZDo6c3RyaW5nIFdyaXRlUHBtKGNvbnN0IGNoYXIqIHBkZl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogYnVmZmVyX3ZvaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkgewotICBjb25zdCBjaGFyKiBidWZmZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihidWZmZXJfdm9pZCk7CitzdGQ6OnN0cmluZyBXcml0ZVBwbShjb25zdCBjaGFyKiBwZGZfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBudW0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBidWZmZXJfdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KSB7CisgIGNvbnN0IGF1dG8qIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlcl92b2lkKTsKIAogICBpZiAoIUNoZWNrRGltZW5zaW9ucyhzdHJpZGUsIHdpZHRoLCBoZWlnaHQpKQogICAgIHJldHVybiAiIjsKQEAgLTE1OSw3ICsxODUsOCBAQAogICAgICAgZGVzdF9saW5lWyh3ICogMykgKyAyXSA9IHNyY19saW5lW3cgKiA0XTsKICAgICB9CiAgIH0KLSAgZndyaXRlKHJlc3VsdC5kYXRhKCksIG91dF9sZW4sIDEsIGZwKTsKKyAgaWYgKGZ3cml0ZShyZXN1bHQuZGF0YSgpLCBvdXRfbGVuLCAxLCBmcCkgIT0gMSkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byB3cml0ZSB0byAlc1xuIiwgZmlsZW5hbWUpOwogICBmY2xvc2UoZnApOwogICByZXR1cm4gc3RkOjpzdHJpbmcoZmlsZW5hbWUpOwogfQpAQCAtMTgyLDMwICsyMDksMjQ5IEBACiAKICAgLy8gT3V0cHV0IGluIFVURjMyLUxFLgogICB1aW50MzJfdCBib20gPSAweDAwMDBGRUZGOwotICBmd3JpdGUoJmJvbSwgc2l6ZW9mKGJvbSksIDEsIGZwKTsKLQotICBGUERGX1RFWFRQQUdFIHRleHRwYWdlID0gRlBERlRleHRfTG9hZFBhZ2UocGFnZSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgRlBERlRleHRfQ291bnRDaGFycyh0ZXh0cGFnZSk7IGkrKykgewotICAgIHVpbnQzMl90IGMgPSBGUERGVGV4dF9HZXRVbmljb2RlKHRleHRwYWdlLCBpKTsKLSAgICBmd3JpdGUoJmMsIHNpemVvZihjKSwgMSwgZnApOworICBpZiAoZndyaXRlKCZib20sIHNpemVvZihib20pLCAxLCBmcCkgIT0gMSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHdyaXRlIHRvICVzXG4iLCBmaWxlbmFtZSk7CisgICAgKHZvaWQpZmNsb3NlKGZwKTsKKyAgICByZXR1cm47CiAgIH0KIAotICBGUERGVGV4dF9DbG9zZVBhZ2UodGV4dHBhZ2UpOworICBzdGQ6OnVuaXF1ZV9wdHI8dm9pZCwgRlBERlRleHRQYWdlRGVsZXRlcj4gdGV4dHBhZ2UoRlBERlRleHRfTG9hZFBhZ2UocGFnZSkpOworICBmb3IgKGludCBpID0gMDsgaSA8IEZQREZUZXh0X0NvdW50Q2hhcnModGV4dHBhZ2UuZ2V0KCkpOyBpKyspIHsKKyAgICB1aW50MzJfdCBjID0gRlBERlRleHRfR2V0VW5pY29kZSh0ZXh0cGFnZS5nZXQoKSwgaSk7CisgICAgaWYgKGZ3cml0ZSgmYywgc2l6ZW9mKGMpLCAxLCBmcCkgIT0gMSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gd3JpdGUgdG8gJXNcbiIsIGZpbGVuYW1lKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAodm9pZClmY2xvc2UoZnApOworfQorCitjb25zdCBjaGFyKiBBbm5vdFN1YnR5cGVUb0NTdHJpbmcoRlBERl9BTk5PVEFUSU9OX1NVQlRZUEUgc3VidHlwZSkgeworICBpZiAoc3VidHlwZSA9PSBGUERGX0FOTk9UX1RFWFQpCisgICAgcmV0dXJuICJUZXh0IjsKKyAgaWYgKHN1YnR5cGUgPT0gRlBERl9BTk5PVF9MSU5LKQorICAgIHJldHVybiAiTGluayI7CisgIGlmIChzdWJ0eXBlID09IEZQREZfQU5OT1RfRlJFRVRFWFQpCisgICAgcmV0dXJuICJGcmVlVGV4dCI7CisgIGlmIChzdWJ0eXBlID09IEZQREZfQU5OT1RfTElORSkKKyAgICByZXR1cm4gIkxpbmUiOworICBpZiAoc3VidHlwZSA9PSBGUERGX0FOTk9UX1NRVUFSRSkKKyAgICByZXR1cm4gIlNxdWFyZSI7CisgIGlmIChzdWJ0eXBlID09IEZQREZfQU5OT1RfQ0lSQ0xFKQorICAgIHJldHVybiAiQ2lyY2xlIjsKKyAgaWYgKHN1YnR5cGUgPT0gRlBERl9BTk5PVF9QT0xZR09OKQorICAgIHJldHVybiAiUG9seWdvbiI7CisgIGlmIChzdWJ0eXBlID09IEZQREZfQU5OT1RfUE9MWUxJTkUpCisgICAgcmV0dXJuICJQb2x5TGluZSI7CisgIGlmIChzdWJ0eXBlID09IEZQREZfQU5OT1RfSElHSExJR0hUKQorICAgIHJldHVybiAiSGlnaGxpZ2h0IjsKKyAgaWYgKHN1YnR5cGUgPT0gRlBERl9BTk5PVF9VTkRFUkxJTkUpCisgICAgcmV0dXJuICJVbmRlcmxpbmUiOworICBpZiAoc3VidHlwZSA9PSBGUERGX0FOTk9UX1NRVUlHR0xZKQorICAgIHJldHVybiAiU3F1aWdnbHkiOworICBpZiAoc3VidHlwZSA9PSBGUERGX0FOTk9UX1NUUklLRU9VVCkKKyAgICByZXR1cm4gIlN0cmlrZU91dCI7CisgIGlmIChzdWJ0eXBlID09IEZQREZfQU5OT1RfU1RBTVApCisgICAgcmV0dXJuICJTdGFtcCI7CisgIGlmIChzdWJ0eXBlID09IEZQREZfQU5OT1RfQ0FSRVQpCisgICAgcmV0dXJuICJDYXJldCI7CisgIGlmIChzdWJ0eXBlID09IEZQREZfQU5OT1RfSU5LKQorICAgIHJldHVybiAiSW5rIjsKKyAgaWYgKHN1YnR5cGUgPT0gRlBERl9BTk5PVF9QT1BVUCkKKyAgICByZXR1cm4gIlBvcHVwIjsKKyAgaWYgKHN1YnR5cGUgPT0gRlBERl9BTk5PVF9GSUxFQVRUQUNITUVOVCkKKyAgICByZXR1cm4gIkZpbGVBdHRhY2htZW50IjsKKyAgaWYgKHN1YnR5cGUgPT0gRlBERl9BTk5PVF9TT1VORCkKKyAgICByZXR1cm4gIlNvdW5kIjsKKyAgaWYgKHN1YnR5cGUgPT0gRlBERl9BTk5PVF9NT1ZJRSkKKyAgICByZXR1cm4gIk1vdmllIjsKKyAgaWYgKHN1YnR5cGUgPT0gRlBERl9BTk5PVF9XSURHRVQpCisgICAgcmV0dXJuICJXaWRnZXQiOworICBpZiAoc3VidHlwZSA9PSBGUERGX0FOTk9UX1NDUkVFTikKKyAgICByZXR1cm4gIlNjcmVlbiI7CisgIGlmIChzdWJ0eXBlID09IEZQREZfQU5OT1RfUFJJTlRFUk1BUkspCisgICAgcmV0dXJuICJQcmludGVyTWFyayI7CisgIGlmIChzdWJ0eXBlID09IEZQREZfQU5OT1RfVFJBUE5FVCkKKyAgICByZXR1cm4gIlRyYXBOZXQiOworICBpZiAoc3VidHlwZSA9PSBGUERGX0FOTk9UX1dBVEVSTUFSSykKKyAgICByZXR1cm4gIldhdGVybWFyayI7CisgIGlmIChzdWJ0eXBlID09IEZQREZfQU5OT1RfVEhSRUVEKQorICAgIHJldHVybiAiM0QiOworICBpZiAoc3VidHlwZSA9PSBGUERGX0FOTk9UX1JJQ0hNRURJQSkKKyAgICByZXR1cm4gIlJpY2hNZWRpYSI7CisgIGlmIChzdWJ0eXBlID09IEZQREZfQU5OT1RfWEZBV0lER0VUKQorICAgIHJldHVybiAiWEZBV2lkZ2V0IjsKKyAgTk9UUkVBQ0hFRCgpOworICByZXR1cm4gIiI7Cit9CisKK3ZvaWQgQXBwZW5kRmxhZ1N0cmluZyhjb25zdCBjaGFyKiBmbGFnLCBzdGQ6OnN0cmluZyogb3V0cHV0KSB7CisgIGlmICghb3V0cHV0LT5lbXB0eSgpKQorICAgICpvdXRwdXQgKz0gIiwgIjsKKyAgKm91dHB1dCArPSBmbGFnOworfQorCitzdGQ6OnN0cmluZyBBbm5vdEZsYWdzVG9TdHJpbmcoaW50IGZsYWdzKSB7CisgIHN0ZDo6c3RyaW5nIHN0cjsKKyAgaWYgKGZsYWdzICYgRlBERl9BTk5PVF9GTEFHX0lOVklTSUJMRSkKKyAgICBBcHBlbmRGbGFnU3RyaW5nKCJJbnZpc2libGUiLCAmc3RyKTsKKyAgaWYgKGZsYWdzICYgRlBERl9BTk5PVF9GTEFHX0hJRERFTikKKyAgICBBcHBlbmRGbGFnU3RyaW5nKCJIaWRkZW4iLCAmc3RyKTsKKyAgaWYgKGZsYWdzICYgRlBERl9BTk5PVF9GTEFHX1BSSU5UKQorICAgIEFwcGVuZEZsYWdTdHJpbmcoIlByaW50IiwgJnN0cik7CisgIGlmIChmbGFncyAmIEZQREZfQU5OT1RfRkxBR19OT1pPT00pCisgICAgQXBwZW5kRmxhZ1N0cmluZygiTm9ab29tIiwgJnN0cik7CisgIGlmIChmbGFncyAmIEZQREZfQU5OT1RfRkxBR19OT1JPVEFURSkKKyAgICBBcHBlbmRGbGFnU3RyaW5nKCJOb1JvdGF0ZSIsICZzdHIpOworICBpZiAoZmxhZ3MgJiBGUERGX0FOTk9UX0ZMQUdfTk9WSUVXKQorICAgIEFwcGVuZEZsYWdTdHJpbmcoIk5vVmlldyIsICZzdHIpOworICBpZiAoZmxhZ3MgJiBGUERGX0FOTk9UX0ZMQUdfUkVBRE9OTFkpCisgICAgQXBwZW5kRmxhZ1N0cmluZygiUmVhZE9ubHkiLCAmc3RyKTsKKyAgaWYgKGZsYWdzICYgRlBERl9BTk5PVF9GTEFHX0xPQ0tFRCkKKyAgICBBcHBlbmRGbGFnU3RyaW5nKCJMb2NrZWQiLCAmc3RyKTsKKyAgaWYgKGZsYWdzICYgRlBERl9BTk5PVF9GTEFHX1RPR0dMRU5PVklFVykKKyAgICBBcHBlbmRGbGFnU3RyaW5nKCJUb2dnbGVOb1ZpZXciLCAmc3RyKTsKKyAgcmV0dXJuIHN0cjsKK30KKworY29uc3QgY2hhciogUGFnZU9iamVjdFR5cGVUb0NTdHJpbmcoaW50IHR5cGUpIHsKKyAgaWYgKHR5cGUgPT0gRlBERl9QQUdFT0JKX1RFWFQpCisgICAgcmV0dXJuICJUZXh0IjsKKyAgaWYgKHR5cGUgPT0gRlBERl9QQUdFT0JKX1BBVEgpCisgICAgcmV0dXJuICJQYXRoIjsKKyAgaWYgKHR5cGUgPT0gRlBERl9QQUdFT0JKX0lNQUdFKQorICAgIHJldHVybiAiSW1hZ2UiOworICBpZiAodHlwZSA9PSBGUERGX1BBR0VPQkpfU0hBRElORykKKyAgICByZXR1cm4gIlNoYWRpbmciOworICBpZiAodHlwZSA9PSBGUERGX1BBR0VPQkpfRk9STSkKKyAgICByZXR1cm4gIkZvcm0iOworICBOT1RSRUFDSEVEKCk7CisgIHJldHVybiAiIjsKK30KKwordm9pZCBXcml0ZUFubm90KEZQREZfUEFHRSBwYWdlLCBjb25zdCBjaGFyKiBwZGZfbmFtZSwgaW50IG51bSkgeworICAvLyBPcGVuIHRoZSBvdXRwdXQgdGV4dCBmaWxlLgorICBjaGFyIGZpbGVuYW1lWzI1Nl07CisgIGludCBjaGFyc19mb3JtYXR0ZWQgPQorICAgICAgc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIlcy4lZC5hbm5vdC50eHQiLCBwZGZfbmFtZSwgbnVtKTsKKyAgaWYgKGNoYXJzX2Zvcm1hdHRlZCA8IDAgfHwKKyAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4oY2hhcnNfZm9ybWF0dGVkKSA+PSBzaXplb2YoZmlsZW5hbWUpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJGaWxlbmFtZSAlcyBpcyB0b28gbG9uZ1xuIiwgZmlsZW5hbWUpOworICAgIHJldHVybjsKKyAgfQorICBGSUxFKiBmcCA9IGZvcGVuKGZpbGVuYW1lLCAidyIpOworICBpZiAoIWZwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gb3BlbiAlcyBmb3Igb3V0cHV0XG4iLCBmaWxlbmFtZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaW50IGFubm90X2NvdW50ID0gRlBERlBhZ2VfR2V0QW5ub3RDb3VudChwYWdlKTsKKyAgZnByaW50ZihmcCwgIk51bWJlciBvZiBhbm5vdGF0aW9uczogJWRcblxuIiwgYW5ub3RfY291bnQpOworCisgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgYW5ub3RhdGlvbnMgb24gdGhpcyBwYWdlLgorICBmb3IgKGludCBpID0gMDsgaSA8IGFubm90X2NvdW50OyArK2kpIHsKKyAgICAvLyBSZXRyaWV2ZSB0aGUgYW5ub3RhdGlvbiBvYmplY3QgYW5kIGl0cyBzdWJ0eXBlLgorICAgIGZwcmludGYoZnAsICJBbm5vdGF0aW9uICMlZDpcbiIsIGkgKyAxKTsKKyAgICBGUERGX0FOTk9UQVRJT04gYW5ub3QgPSBGUERGUGFnZV9HZXRBbm5vdChwYWdlLCBpKTsKKyAgICBpZiAoIWFubm90KSB7CisgICAgICBmcHJpbnRmKGZwLCAiRmFpbGVkIHRvIHJldHJpZXZlIGFubm90YXRpb24hXG5cbiIpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIEZQREZfQU5OT1RBVElPTl9TVUJUWVBFIHN1YnR5cGUgPSBGUERGQW5ub3RfR2V0U3VidHlwZShhbm5vdCk7CisgICAgZnByaW50ZihmcCwgIlN1YnR5cGU6ICVzXG4iLCBBbm5vdFN1YnR5cGVUb0NTdHJpbmcoc3VidHlwZSkpOworCisgICAgLy8gUmV0cmlldmUgdGhlIGFubm90YXRpb24gZmxhZ3MuCisgICAgZnByaW50ZihmcCwgIkZsYWdzIHNldDogJXNcbiIsCisgICAgICAgICAgICBBbm5vdEZsYWdzVG9TdHJpbmcoRlBERkFubm90X0dldEZsYWdzKGFubm90KSkuY19zdHIoKSk7CisKKyAgICAvLyBSZXRyaWV2ZSB0aGUgYW5ub3RhdGlvbidzIG9iamVjdCBjb3VudCBhbmQgb2JqZWN0IHR5cGVzLgorICAgIGNvbnN0IGludCBvYmpfY291bnQgPSBGUERGQW5ub3RfR2V0T2JqZWN0Q291bnQoYW5ub3QpOworICAgIGZwcmludGYoZnAsICJOdW1iZXIgb2Ygb2JqZWN0czogJWRcbiIsIG9ial9jb3VudCk7CisgICAgaWYgKG9ial9jb3VudCA+IDApIHsKKyAgICAgIGZwcmludGYoZnAsICJPYmplY3QgdHlwZXM6ICIpOworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBvYmpfY291bnQ7ICsraikgeworICAgICAgICBjb25zdCBjaGFyKiB0eXBlID0gUGFnZU9iamVjdFR5cGVUb0NTdHJpbmcoCisgICAgICAgICAgICBGUERGUGFnZU9ial9HZXRUeXBlKEZQREZBbm5vdF9HZXRPYmplY3QoYW5ub3QsIGopKSk7CisgICAgICAgIGZwcmludGYoZnAsICIlcyAgIiwgdHlwZSk7CisgICAgICB9CisgICAgICBmcHJpbnRmKGZwLCAiXG4iKTsKKyAgICB9CisKKyAgICAvLyBSZXRyaWV2ZSB0aGUgYW5ub3RhdGlvbidzIGNvbG9yIGFuZCBpbnRlcmlvciBjb2xvci4KKyAgICB1bnNpZ25lZCBpbnQgUjsKKyAgICB1bnNpZ25lZCBpbnQgRzsKKyAgICB1bnNpZ25lZCBpbnQgQjsKKyAgICB1bnNpZ25lZCBpbnQgQTsKKyAgICBpZiAoIUZQREZBbm5vdF9HZXRDb2xvcihhbm5vdCwgRlBERkFOTk9UX0NPTE9SVFlQRV9Db2xvciwgJlIsICZHLCAmQiwgJkEpKSB7CisgICAgICBmcHJpbnRmKGZwLCAiRmFpbGVkIHRvIHJldHJpZXZlIGNvbG9yLlxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGZwcmludGYoZnAsICJDb2xvciBpbiBSR0JBOiAlZCAlZCAlZCAlZFxuIiwgUiwgRywgQiwgQSk7CisgICAgfQorICAgIGlmICghRlBERkFubm90X0dldENvbG9yKGFubm90LCBGUERGQU5OT1RfQ09MT1JUWVBFX0ludGVyaW9yQ29sb3IsICZSLCAmRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQiwgJkEpKSB7CisgICAgICBmcHJpbnRmKGZwLCAiRmFpbGVkIHRvIHJldHJpZXZlIGludGVyaW9yIGNvbG9yLlxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGZwcmludGYoZnAsICJJbnRlcmlvciBjb2xvciBpbiBSR0JBOiAlZCAlZCAlZCAlZFxuIiwgUiwgRywgQiwgQSk7CisgICAgfQorCisgICAgLy8gUmV0cmlldmUgdGhlIGFubm90YXRpb24ncyBjb250ZW50cyBhbmQgYXV0aG9yLgorICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQ29udGVudHNLZXlbXSA9ICJDb250ZW50cyI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdXRob3JLZXlbXSA9ICJUIjsKKyAgICB1bnNpZ25lZCBsb25nIGxlbiA9CisgICAgICAgIEZQREZBbm5vdF9HZXRTdHJpbmdWYWx1ZShhbm5vdCwga0NvbnRlbnRzS2V5LCBudWxscHRyLCAwKTsKKyAgICBzdGQ6OnZlY3RvcjxjaGFyPiBidWYobGVuKTsKKyAgICBGUERGQW5ub3RfR2V0U3RyaW5nVmFsdWUoYW5ub3QsIGtDb250ZW50c0tleSwgYnVmLmRhdGEoKSwgbGVuKTsKKyAgICBmcHJpbnRmKGZwLCAiQ29udGVudDogJWxzXG4iLAorICAgICAgICAgICAgR2V0UGxhdGZvcm1XU3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgc2hvcnQqPihidWYuZGF0YSgpKSkKKyAgICAgICAgICAgICAgICAuY19zdHIoKSk7CisgICAgbGVuID0gRlBERkFubm90X0dldFN0cmluZ1ZhbHVlKGFubm90LCBrQXV0aG9yS2V5LCBudWxscHRyLCAwKTsKKyAgICBidWYuY2xlYXIoKTsKKyAgICBidWYucmVzaXplKGxlbik7CisgICAgRlBERkFubm90X0dldFN0cmluZ1ZhbHVlKGFubm90LCBrQXV0aG9yS2V5LCBidWYuZGF0YSgpLCBsZW4pOworICAgIGZwcmludGYoZnAsICJBdXRob3I6ICVsc1xuIiwKKyAgICAgICAgICAgIEdldFBsYXRmb3JtV1N0cmluZyhyZWludGVycHJldF9jYXN0PHVuc2lnbmVkIHNob3J0Kj4oYnVmLmRhdGEoKSkpCisgICAgICAgICAgICAgICAgLmNfc3RyKCkpOworCisgICAgLy8gUmV0cmlldmUgdGhlIGFubm90YXRpb24ncyBxdWFkcG9pbnRzIGlmIGl0IGlzIGEgbWFya3VwIGFubm90YXRpb24uCisgICAgaWYgKEZQREZBbm5vdF9IYXNBdHRhY2htZW50UG9pbnRzKGFubm90KSkgeworICAgICAgRlNfUVVBRFBPSU5UU0YgcXVhZHBvaW50czsKKyAgICAgIGlmIChGUERGQW5ub3RfR2V0QXR0YWNobWVudFBvaW50cyhhbm5vdCwgJnF1YWRwb2ludHMpKSB7CisgICAgICAgIGZwcmludGYoZnAsCisgICAgICAgICAgICAgICAgIlF1YWRwb2ludHM6ICglLjNmLCAlLjNmKSwgKCUuM2YsICUuM2YpLCAoJS4zZiwgJS4zZiksICglLjNmLCAiCisgICAgICAgICAgICAgICAgIiUuM2YpXG4iLAorICAgICAgICAgICAgICAgIHF1YWRwb2ludHMueDEsIHF1YWRwb2ludHMueTEsIHF1YWRwb2ludHMueDIsIHF1YWRwb2ludHMueTIsCisgICAgICAgICAgICAgICAgcXVhZHBvaW50cy54MywgcXVhZHBvaW50cy55MywgcXVhZHBvaW50cy54NCwgcXVhZHBvaW50cy55NCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKGZwLCAiRmFpbGVkIHRvIHJldHJpZXZlIHF1YWRwb2ludHMuXG4iKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZXRyaWV2ZSB0aGUgYW5ub3RhdGlvbidzIHJlY3RhbmdsZSBjb29yZGluYXRlcy4KKyAgICBGU19SRUNURiByZWN0OworICAgIGlmIChGUERGQW5ub3RfR2V0UmVjdChhbm5vdCwgJnJlY3QpKSB7CisgICAgICBmcHJpbnRmKGZwLCAiUmVjdGFuZ2xlOiBsIC0gJS4zZiwgYiAtICUuM2YsIHIgLSAlLjNmLCB0IC0gJS4zZlxuXG4iLAorICAgICAgICAgICAgICByZWN0LmxlZnQsIHJlY3QuYm90dG9tLCByZWN0LnJpZ2h0LCByZWN0LnRvcCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZwcmludGYoZnAsICJGYWlsZWQgdG8gcmV0cmlldmUgYW5ub3RhdGlvbiByZWN0YW5nbGUuXG4iKTsKKyAgICB9CisKKyAgICBGUERGUGFnZV9DbG9zZUFubm90KGFubm90KTsKKyAgfQogCiAgICh2b2lkKWZjbG9zZShmcCk7CiB9CiAKLXN0YXRpYyBzdGQ6OnN0cmluZyBXcml0ZVBuZyhjb25zdCBjaGFyKiBwZGZfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGJ1ZmZlcl92b2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQpIHsKK3N0ZDo6c3RyaW5nIFdyaXRlUG5nKGNvbnN0IGNoYXIqIHBkZl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgaW50IG51bSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGJ1ZmZlcl92b2lkLAorICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQpIHsKICAgaWYgKCFDaGVja0RpbWVuc2lvbnMoc3RyaWRlLCB3aWR0aCwgaGVpZ2h0KSkKICAgICByZXR1cm4gIiI7CiAKICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4gcG5nX2VuY29kaW5nOwotICBjb25zdCB1bnNpZ25lZCBjaGFyKiBidWZmZXIgPSBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oYnVmZmVyX3ZvaWQpOworICBjb25zdCBhdXRvKiBidWZmZXIgPSBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oYnVmZmVyX3ZvaWQpOwogICBpZiAoIWltYWdlX2RpZmZfcG5nOjpFbmNvZGVCR1JBUE5HKAogICAgICAgICAgIGJ1ZmZlciwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBmYWxzZSwgJnBuZ19lbmNvZGluZykpIHsKICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBjb252ZXJ0IGJpdG1hcCB0byBQTkdcbiIpOwpAQCAtMjMwLDE5ICs0NzYsMTkgQEAKICAgc2l6ZV90IGJ5dGVzX3dyaXR0ZW4gPSBmd3JpdGUoCiAgICAgICAmcG5nX2VuY29kaW5nLmZyb250KCksIDEsIHBuZ19lbmNvZGluZy5zaXplKCksIGZwKTsKICAgaWYgKGJ5dGVzX3dyaXR0ZW4gIT0gcG5nX2VuY29kaW5nLnNpemUoKSkKLSAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byB3cml0ZSB0byAgJXNcbiIsIGZpbGVuYW1lKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byB3cml0ZSB0byAlc1xuIiwgZmlsZW5hbWUpOwogCiAgICh2b2lkKWZjbG9zZShmcCk7CiAgIHJldHVybiBzdGQ6OnN0cmluZyhmaWxlbmFtZSk7CiB9CiAKICNpZmRlZiBfV0lOMzIKLXN0YXRpYyBzdGQ6OnN0cmluZyBXcml0ZUJtcChjb25zdCBjaGFyKiBwZGZfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KSB7CitzdGQ6OnN0cmluZyBXcml0ZUJtcChjb25zdCBjaGFyKiBwZGZfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBudW0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkgewogICBpZiAoIUNoZWNrRGltZW5zaW9ucyhzdHJpZGUsIHdpZHRoLCBoZWlnaHQpKQogICAgIHJldHVybiAiIjsKIApAQCAtMjcwLDIyICs1MTYsMjMgQEAKICAgZmlsZV9oZWFkZXIuYmZTaXplID0gc2l6ZW9mKGZpbGVfaGVhZGVyKSArIGJtaS5ibWlIZWFkZXIuYmlTaXplICsgb3V0X2xlbjsKICAgZmlsZV9oZWFkZXIuYmZPZmZCaXRzID0gZmlsZV9oZWFkZXIuYmZTaXplIC0gb3V0X2xlbjsKIAotICBmd3JpdGUoJmZpbGVfaGVhZGVyLCBzaXplb2YoZmlsZV9oZWFkZXIpLCAxLCBmcCk7Ci0gIGZ3cml0ZSgmYm1pLCBibWkuYm1pSGVhZGVyLmJpU2l6ZSwgMSwgZnApOwotICBmd3JpdGUoYnVmZmVyLCBvdXRfbGVuLCAxLCBmcCk7CisgIGlmIChmd3JpdGUoJmZpbGVfaGVhZGVyLCBzaXplb2YoZmlsZV9oZWFkZXIpLCAxLCBmcCkgIT0gMSB8fAorICAgICAgZndyaXRlKCZibWksIGJtaS5ibWlIZWFkZXIuYmlTaXplLCAxLCBmcCkgIT0gMSB8fAorICAgICAgZndyaXRlKGJ1ZmZlciwgb3V0X2xlbiwgMSwgZnApICE9IDEpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byB3cml0ZSB0byAlc1xuIiwgZmlsZW5hbWUpOworICB9CiAgIGZjbG9zZShmcCk7CiAgIHJldHVybiBzdGQ6OnN0cmluZyhmaWxlbmFtZSk7CiB9CiAKIHZvaWQgV3JpdGVFbWYoRlBERl9QQUdFIHBhZ2UsIGNvbnN0IGNoYXIqIHBkZl9uYW1lLCBpbnQgbnVtKSB7Ci0gIGludCB3aWR0aCA9IHN0YXRpY19jYXN0PGludD4oRlBERl9HZXRQYWdlV2lkdGgocGFnZSkpOwotICBpbnQgaGVpZ2h0ID0gc3RhdGljX2Nhc3Q8aW50PihGUERGX0dldFBhZ2VIZWlnaHQocGFnZSkpOwotCiAgIGNoYXIgZmlsZW5hbWVbMjU2XTsKICAgc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIlcy4lZC5lbWYiLCBwZGZfbmFtZSwgbnVtKTsKIAogICBIREMgZGMgPSBDcmVhdGVFbmhNZXRhRmlsZUEobnVsbHB0ciwgZmlsZW5hbWUsIG51bGxwdHIsIG51bGxwdHIpOwogCisgIGludCB3aWR0aCA9IHN0YXRpY19jYXN0PGludD4oRlBERl9HZXRQYWdlV2lkdGgocGFnZSkpOworICBpbnQgaGVpZ2h0ID0gc3RhdGljX2Nhc3Q8aW50PihGUERGX0dldFBhZ2VIZWlnaHQocGFnZSkpOwogICBIUkdOIHJnbiA9IENyZWF0ZVJlY3RSZ24oMCwgMCwgd2lkdGgsIGhlaWdodCk7CiAgIFNlbGVjdENsaXBSZ24oZGMsIHJnbik7CiAgIERlbGV0ZU9iamVjdChyZ24pOwpAQCAtMzAwLDEyICs1NDcsNTYgQEAKIAogICBEZWxldGVFbmhNZXRhRmlsZShDbG9zZUVuaE1ldGFGaWxlKGRjKSk7CiB9Ci0jZW5kaWYKKworaW50IENBTExCQUNLIEVuaE1ldGFGaWxlUHJvYyhIREMgaGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVUQUJMRSogaGFuZGxlX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFTkhNRVRBUkVDT1JEKiByZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvYmplY3RzX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gcGFyYW0pIHsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRU5ITUVUQVJFQ09SRCo+JiBpdGVtcyA9CisgICAgICAqcmVpbnRlcnByZXRfY2FzdDxzdGQ6OnZlY3Rvcjxjb25zdCBFTkhNRVRBUkVDT1JEKj4qPihwYXJhbSk7CisgIGl0ZW1zLnB1c2hfYmFjayhyZWNvcmQpOworICByZXR1cm4gMTsKK30KKwordm9pZCBXcml0ZVBTKEZQREZfUEFHRSBwYWdlLCBjb25zdCBjaGFyKiBwZGZfbmFtZSwgaW50IG51bSkgeworICBjaGFyIGZpbGVuYW1lWzI1Nl07CisgIHNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiJXMuJWQucHMiLCBwZGZfbmFtZSwgbnVtKTsKKyAgRklMRSogZnAgPSBmb3BlbihmaWxlbmFtZSwgIndiIik7CisgIGlmICghZnApCisgICAgcmV0dXJuOworCisgIEhEQyBkYyA9IENyZWF0ZUVuaE1ldGFGaWxlQShudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKTsKKworICBpbnQgd2lkdGggPSBzdGF0aWNfY2FzdDxpbnQ+KEZQREZfR2V0UGFnZVdpZHRoKHBhZ2UpKTsKKyAgaW50IGhlaWdodCA9IHN0YXRpY19jYXN0PGludD4oRlBERl9HZXRQYWdlSGVpZ2h0KHBhZ2UpKTsKKyAgRlBERl9SZW5kZXJQYWdlKGRjLCBwYWdlLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLAorICAgICAgICAgICAgICAgICAgRlBERl9BTk5PVCB8IEZQREZfUFJJTlRJTkcgfCBGUERGX05PX0NBVENIKTsKKworICBIRU5ITUVUQUZJTEUgZW1mID0gQ2xvc2VFbmhNZXRhRmlsZShkYyk7CisgIHN0ZDo6dmVjdG9yPGNvbnN0IEVOSE1FVEFSRUNPUkQqPiBpdGVtczsKKyAgRW51bUVuaE1ldGFGaWxlKG51bGxwdHIsIGVtZiwgJkVuaE1ldGFGaWxlUHJvYywgJml0ZW1zLCBudWxscHRyKTsKKyAgZm9yIChjb25zdCBFTkhNRVRBUkVDT1JEKiByZWNvcmQgOiBpdGVtcykgeworICAgIGlmIChyZWNvcmQtPmlUeXBlICE9IEVNUl9HRElDT01NRU5UKQorICAgICAgY29udGludWU7CisKKyAgICBjb25zdCBhdXRvKiBjb21tZW50ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFTVJHRElDT01NRU5UKj4ocmVjb3JkKTsKKyAgICBjb25zdCBjaGFyKiBkYXRhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oY29tbWVudC0+RGF0YSk7CisgICAgdWludDE2X3Qgc2l6ZSA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQxNl90Kj4oZGF0YSk7CisgICAgaWYgKGZ3cml0ZShkYXRhICsgc2l6ZW9mKHVpbnQxNl90KSwgc2l6ZSwgMSwgZnApICE9IDEpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHdyaXRlIHRvICVzXG4iLCBmaWxlbmFtZSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgZmNsb3NlKGZwKTsKKyAgRGVsZXRlRW5oTWV0YUZpbGUoZW1mKTsKK30KKyNlbmRpZiAgLy8gX1dJTjMyCiAKICNpZmRlZiBQREZfRU5BQkxFX1NLSUEKLXN0YXRpYyBzdGQ6OnN0cmluZyBXcml0ZVNrcChjb25zdCBjaGFyKiBwZGZfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrUGljdHVyZVJlY29yZGVyKiByZWNvcmRlcikgeworc3RkOjpzdHJpbmcgV3JpdGVTa3AoY29uc3QgY2hhciogcGRmX25hbWUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtLAorICAgICAgICAgICAgICAgICAgICAgU2tQaWN0dXJlUmVjb3JkZXIqIHJlY29yZGVyKSB7CiAgIGNoYXIgZmlsZW5hbWVbMjU2XTsKICAgaW50IGNoYXJzX2Zvcm1hdHRlZCA9CiAgICAgICBzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIiVzLiVkLnNrcCIsIHBkZl9uYW1lLCBudW0pOwpAQCAtMzUzLDcgKzY0NCw3IEBACiAgICAgICAgICBHZXRQbGF0Zm9ybVdTdHJpbmcobGFiZWwpLmNfc3RyKCksIGlzX3Bhc3N3b3JkLCBsZW5ndGgpOwogCiAgIC8vIFVURi0xNiwgYWx3YXlzIExFIHJlZ2FyZGxlc3Mgb2YgcGxhdGZvcm0uCi0gIHVpbnQ4X3QqIHB0ciA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihyZXNwb25zZSk7CisgIGF1dG8qIHB0ciA9IHN0YXRpY19jYXN0PHVpbnQ4X3QqPihyZXNwb25zZSk7CiAgIHB0clswXSA9ICdOJzsKICAgcHRyWzFdID0gMDsKICAgcHRyWzJdID0gJ28nOwpAQCAtNDM2LDggKzcyNywyMCBAQAogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjdXJfYXJnID0gYXJnc1tjdXJfaWR4XTsKICAgICBpZiAoY3VyX2FyZyA9PSAiLS1zaG93LWNvbmZpZyIpIHsKICAgICAgIG9wdGlvbnMtPnNob3dfY29uZmlnID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGN1cl9hcmcgPT0gIi0tc2hvdy1tZXRhZGF0YSIpIHsKKyAgICAgIG9wdGlvbnMtPnNob3dfbWV0YWRhdGEgPSB0cnVlOwogICAgIH0gZWxzZSBpZiAoY3VyX2FyZyA9PSAiLS1zZW5kLWV2ZW50cyIpIHsKICAgICAgIG9wdGlvbnMtPnNlbmRfZXZlbnRzID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGN1cl9hcmcgPT0gIi0tcmVuZGVyLW9uZXNob3QiKSB7CisgICAgICBvcHRpb25zLT5yZW5kZXJfb25lc2hvdCA9IHRydWU7CisgICAgfSBlbHNlIGlmIChjdXJfYXJnID09ICItLXNhdmUtYXR0YWNobWVudHMiKSB7CisgICAgICBvcHRpb25zLT5zYXZlX2F0dGFjaG1lbnRzID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGN1cl9hcmcgPT0gIi0tc2F2ZS1pbWFnZXMiKSB7CisgICAgICBvcHRpb25zLT5zYXZlX2ltYWdlcyA9IHRydWU7CisjaWZkZWYgRU5BQkxFX0NBTExHUklORAorICAgIH0gZWxzZSBpZiAoY3VyX2FyZyA9PSAiLS1jYWxsZ3JpbmQtZGVsaW0iKSB7CisgICAgICBvcHRpb25zLT5jYWxsZ3JpbmRfZGVsaW1pdGVycyA9IHRydWU7CisjZW5kaWYgIC8vIEVOQUJMRV9DQUxMR1JJTkQKICAgICB9IGVsc2UgaWYgKGN1cl9hcmcgPT0gIi0tcHBtIikgewogICAgICAgaWYgKG9wdGlvbnMtPm91dHB1dF9mb3JtYXQgIT0gT1VUUFVUX05PTkUpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJEdXBsaWNhdGUgb3IgY29uZmxpY3RpbmcgLS1wcG0gYXJndW1lbnRcbiIpOwpAQCAtNDU2LDYgKzc1OSwxMiBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICB9CiAgICAgICBvcHRpb25zLT5vdXRwdXRfZm9ybWF0ID0gT1VUUFVUX1RFWFQ7CisgICAgfSBlbHNlIGlmIChjdXJfYXJnID09ICItLWFubm90IikgeworICAgICAgaWYgKG9wdGlvbnMtPm91dHB1dF9mb3JtYXQgIT0gT1VUUFVUX05PTkUpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJEdXBsaWNhdGUgb3IgY29uZmxpY3RpbmcgLS1hbm5vdCBhcmd1bWVudFxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIG9wdGlvbnMtPm91dHB1dF9mb3JtYXQgPSBPVVRQVVRfQU5OT1Q7CiAjaWZkZWYgUERGX0VOQUJMRV9TS0lBCiAgICAgfSBlbHNlIGlmIChjdXJfYXJnID09ICItLXNrcCIpIHsKICAgICAgIGlmIChvcHRpb25zLT5vdXRwdXRfZm9ybWF0ICE9IE9VVFBVVF9OT05FKSB7CkBAIC00NzgsNiArNzg3LDE4IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIH0KICAgICAgIG9wdGlvbnMtPm91dHB1dF9mb3JtYXQgPSBPVVRQVVRfRU1GOworICAgIH0gZWxzZSBpZiAoY3VyX2FyZyA9PSAiLS1wczIiKSB7CisgICAgICBpZiAob3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCAhPSBPVVRQVVRfTk9ORSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkR1cGxpY2F0ZSBvciBjb25mbGljdGluZyAtLXBzMiBhcmd1bWVudFxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIG9wdGlvbnMtPm91dHB1dF9mb3JtYXQgPSBPVVRQVVRfUFMyOworICAgIH0gZWxzZSBpZiAoY3VyX2FyZyA9PSAiLS1wczMiKSB7CisgICAgICBpZiAob3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCAhPSBPVVRQVVRfTk9ORSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkR1cGxpY2F0ZSBvciBjb25mbGljdGluZyAtLXBzMyBhcmd1bWVudFxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIG9wdGlvbnMtPm91dHB1dF9mb3JtYXQgPSBPVVRQVVRfUFMzOwogICAgIH0gZWxzZSBpZiAoY3VyX2FyZyA9PSAiLS1ibXAiKSB7CiAgICAgICBpZiAob3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCAhPSBPVVRQVVRfTk9ORSkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkR1cGxpY2F0ZSBvciBjb25mbGljdGluZyAtLWJtcCBhcmd1bWVudFxuIik7CkBAIC01MDQsNiArODI1LDEyIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIH0KICAgICAgIG9wdGlvbnMtPnNjYWxlX2ZhY3Rvcl9hc19zdHJpbmcgPSBjdXJfYXJnLnN1YnN0cig4KTsKKyAgICB9IGVsc2UgaWYgKGN1cl9hcmcgPT0gIi0tc2hvdy1zdHJ1Y3R1cmUiKSB7CisgICAgICBpZiAob3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCAhPSBPVVRQVVRfTk9ORSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkR1cGxpY2F0ZSBvciBjb25mbGljdGluZyAtLXNob3ctc3RydWN0dXJlIGFyZ3VtZW50XG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgb3B0aW9ucy0+b3V0cHV0X2Zvcm1hdCA9IE9VVFBVVF9TVFJVQ1RVUkU7CiAgICAgfSBlbHNlIGlmIChjdXJfYXJnLnNpemUoKSA+IDggJiYgY3VyX2FyZy5jb21wYXJlKDAsIDgsICItLXBhZ2VzPSIpID09IDApIHsKICAgICAgIGlmIChvcHRpb25zLT5wYWdlcykgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkR1cGxpY2F0ZSAtLXBhZ2VzIGFyZ3VtZW50XG4iKTsKQEAgLTUzNiwxNCArODYzLDQ2IEBACiAgIHJldHVybiB0cnVlOwogfQogCit2b2lkIFByaW50TGFzdEVycm9yKCkgeworICB1bnNpZ25lZCBsb25nIGVyciA9IEZQREZfR2V0TGFzdEVycm9yKCk7CisgIGZwcmludGYoc3RkZXJyLCAiTG9hZCBwZGYgZG9jcyB1bnN1Y2Nlc3NmdWw6ICIpOworICBzd2l0Y2ggKGVycikgeworICAgIGNhc2UgRlBERl9FUlJfU1VDQ0VTUzoKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiU3VjY2VzcyIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUERGX0VSUl9VTktOT1dOOgorICAgICAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIGVycm9yIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZQREZfRVJSX0ZJTEU6CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZpbGUgbm90IGZvdW5kIG9yIGNvdWxkIG5vdCBiZSBvcGVuZWQiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlBERl9FUlJfRk9STUFUOgorICAgICAgZnByaW50ZihzdGRlcnIsICJGaWxlIG5vdCBpbiBQREYgZm9ybWF0IG9yIGNvcnJ1cHRlZCIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGUERGX0VSUl9QQVNTV09SRDoKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUGFzc3dvcmQgcmVxdWlyZWQgb3IgaW5jb3JyZWN0IHBhc3N3b3JkIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZQREZfRVJSX1NFQ1VSSVRZOgorICAgICAgZnByaW50ZihzdGRlcnIsICJVbnN1cHBvcnRlZCBzZWN1cml0eSBzY2hlbWUiKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlBERl9FUlJfUEFHRToKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUGFnZSBub3QgZm91bmQgb3IgY29udGVudCBlcnJvciIpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBlcnJvciAlbGQiLCBlcnIpOworICB9CisgIGZwcmludGYoc3RkZXJyLCAiLlxuIik7CisgIHJldHVybjsKK30KKwogRlBERl9CT09MIElzX0RhdGFfQXZhaWwoRlhfRklMRUFWQUlMKiBhdmFpbCwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgQWRkX1NlZ21lbnQoRlhfRE9XTkxPQURISU5UUyogaGludHMsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7fQogCi12b2lkIFNlbmRQYWdlRXZlbnRzKGNvbnN0IEZQREZfRk9STUhBTkRMRSYgZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRlBERl9QQUdFJiBwYWdlLAordm9pZCBTZW5kUGFnZUV2ZW50cyhGUERGX0ZPUk1IQU5ETEUgZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgRlBERl9QQUdFIHBhZ2UsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBldmVudHMpIHsKICAgYXV0byBsaW5lcyA9IFN0cmluZ1NwbGl0KGV2ZW50cywgJ1xuJyk7CiAgIGZvciAoYXV0byBsaW5lIDogbGluZXMpIHsKQEAgLTU1MSw3ICs5MTAsMTQgQEAKICAgICBpZiAoY29tbWFuZFswXS5lbXB0eSgpKQogICAgICAgY29udGludWU7CiAgICAgYXV0byB0b2tlbnMgPSBTdHJpbmdTcGxpdChjb21tYW5kWzBdLCAnLCcpOwotICAgIGlmICh0b2tlbnNbMF0gPT0gImtleWNvZGUiKSB7CisgICAgaWYgKHRva2Vuc1swXSA9PSAiY2hhcmNvZGUiKSB7CisgICAgICBpZiAodG9rZW5zLnNpemUoKSA9PSAyKSB7CisgICAgICAgIGludCBrZXljb2RlID0gYXRvaSh0b2tlbnNbMV0uY19zdHIoKSk7CisgICAgICAgIEZPUk1fT25DaGFyKGZvcm0sIHBhZ2UsIGtleWNvZGUsIDApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJjaGFyY29kZTogYmFkIGFyZ3NcbiIpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAodG9rZW5zWzBdID09ICJrZXljb2RlIikgewogICAgICAgaWYgKHRva2Vucy5zaXplKCkgPT0gMikgewogICAgICAgICBpbnQga2V5Y29kZSA9IGF0b2kodG9rZW5zWzFdLmNfc3RyKCkpOwogICAgICAgICBGT1JNX09uS2V5RG93bihmb3JtLCBwYWdlLCBrZXljb2RlLCAwKTsKQEAgLTU5Nyw2ICs5NjMsMTQgQEAKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibW91c2Vtb3ZlOiBiYWQgYXJnc1xuIik7CiAgICAgICB9CisgICAgfSBlbHNlIGlmICh0b2tlbnNbMF0gPT0gImZvY3VzIikgeworICAgICAgaWYgKHRva2Vucy5zaXplKCkgPT0gMykgeworICAgICAgICBpbnQgeCA9IGF0b2kodG9rZW5zWzFdLmNfc3RyKCkpOworICAgICAgICBpbnQgeSA9IGF0b2kodG9rZW5zWzJdLmNfc3RyKCkpOworICAgICAgICBGT1JNX09uRm9jdXMoZm9ybSwgcGFnZSwgMCwgeCwgeSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImZvY3VzOiBiYWQgYXJnc1xuIik7CisgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5yZWNvZ25pemVkIGV2ZW50OiAlc1xuIiwgdG9rZW5zWzBdLmNfc3RyKCkpOwogICAgIH0KQEAgLTYwOSw1OSArOTgzLDMwOSBAQAogICBGUERGX0ZPUk1GSUxMSU5GT19QREZpdW1UZXN0KiBmb3JtX2ZpbGxfaW5mbyA9CiAgICAgICBUb1BERml1bVRlc3RGb3JtRmlsbEluZm8ocGFyYW0pOwogICBhdXRvJiBsb2FkZWRfcGFnZXMgPSBmb3JtX2ZpbGxfaW5mby0+bG9hZGVkX3BhZ2VzOwotCiAgIGF1dG8gaXRlciA9IGxvYWRlZF9wYWdlcy5maW5kKGluZGV4KTsKICAgaWYgKGl0ZXIgIT0gbG9hZGVkX3BhZ2VzLmVuZCgpKQotICAgIHJldHVybiBpdGVyLT5zZWNvbmQ7CisgICAgcmV0dXJuIGl0ZXItPnNlY29uZC5nZXQoKTsKIAogICBGUERGX1BBR0UgcGFnZSA9IEZQREZfTG9hZFBhZ2UoZG9jLCBpbmRleCk7CiAgIGlmICghcGFnZSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAogICBGUERGX0ZPUk1IQU5ETEUmIGZvcm1faGFuZGxlID0gZm9ybV9maWxsX2luZm8tPmZvcm1faGFuZGxlOwotCiAgIEZPUk1fT25BZnRlckxvYWRQYWdlKHBhZ2UsIGZvcm1faGFuZGxlKTsKICAgRk9STV9Eb1BhZ2VBQWN0aW9uKHBhZ2UsIGZvcm1faGFuZGxlLCBGUERGUEFHRV9BQUNUSU9OX09QRU4pOwotCi0gIGxvYWRlZF9wYWdlc1tpbmRleF0gPSBwYWdlOworICBsb2FkZWRfcGFnZXNbaW5kZXhdLnJlc2V0KHBhZ2UpOwogICByZXR1cm4gcGFnZTsKIH0KIAorc3RkOjp3c3RyaW5nIENvbnZlcnRUb1dTdHJpbmcoY29uc3QgdW5zaWduZWQgc2hvcnQqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYnVmX3NpemUpIHsKKyAgc3RkOjp3c3RyaW5nIHJlc3VsdDsKKyAgcmVzdWx0LnJlc2VydmUoYnVmX3NpemUpOworICBzdGQ6OmNvcHkoYnVmLCBidWYgKyBidWZfc2l6ZSwgc3RkOjpiYWNrX2luc2VydGVyKHJlc3VsdCkpOworICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIER1bXBDaGlsZFN0cnVjdHVyZShGUERGX1NUUlVDVEVMRU1FTlQgY2hpbGQsIGludCBpbmRlbnQpIHsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrQnVmU2l6ZSA9IDEwMjQ7CisgIHVuc2lnbmVkIHNob3J0IGJ1ZltrQnVmU2l6ZV07CisgIHVuc2lnbmVkIGxvbmcgbGVuID0gRlBERl9TdHJ1Y3RFbGVtZW50X0dldFR5cGUoY2hpbGQsIGJ1Ziwga0J1ZlNpemUpOworICBwcmludGYoIiUqcyVscyIsIGluZGVudCAqIDIsICIiLCBDb252ZXJ0VG9XU3RyaW5nKGJ1ZiwgbGVuKS5jX3N0cigpKTsKKworICBtZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisgIGxlbiA9IEZQREZfU3RydWN0RWxlbWVudF9HZXRUaXRsZShjaGlsZCwgYnVmLCBrQnVmU2l6ZSk7CisgIGlmIChsZW4gPiAwKQorICAgIHByaW50ZigiOiAnJWxzJyIsIENvbnZlcnRUb1dTdHJpbmcoYnVmLCBsZW4pLmNfc3RyKCkpOworCisgIG1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKyAgbGVuID0gRlBERl9TdHJ1Y3RFbGVtZW50X0dldEFsdFRleHQoY2hpbGQsIGJ1Ziwga0J1ZlNpemUpOworICBpZiAobGVuID4gMCkKKyAgICBwcmludGYoIiAoJWxzKSIsIENvbnZlcnRUb1dTdHJpbmcoYnVmLCBsZW4pLmNfc3RyKCkpOworICBwcmludGYoIlxuIik7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBGUERGX1N0cnVjdEVsZW1lbnRfQ291bnRDaGlsZHJlbihjaGlsZCk7ICsraSkgeworICAgIEZQREZfU1RSVUNURUxFTUVOVCBzdWJfY2hpbGQgPSBGUERGX1N0cnVjdEVsZW1lbnRfR2V0Q2hpbGRBdEluZGV4KGNoaWxkLCBpKTsKKyAgICAvLyBJZiB0aGUgY2hpbGQgaXMgbm90IGFuIEVsZW1lbnQgdGhlbiB0aGlzIHdpbGwgcmV0dXJuIG51bGwuIFRoaXMgY2FuCisgICAgLy8gaGFwcGVuIGlmIHRoZSBlbGVtZW50IGlzIHRoaW5ncyBsaWtlIGFuIG9iamVjdCByZWZlcmVuY2Ugb3IgYSBzdHJlYW0uCisgICAgaWYgKCFzdWJfY2hpbGQpCisgICAgICBjb250aW51ZTsKKworICAgIER1bXBDaGlsZFN0cnVjdHVyZShzdWJfY2hpbGQsIGluZGVudCArIDEpOworICB9Cit9CisKK3ZvaWQgRHVtcFBhZ2VTdHJ1Y3R1cmUoRlBERl9QQUdFIHBhZ2UsIGNvbnN0IGludCBwYWdlX2lkeCkgeworICBzdGQ6OnVuaXF1ZV9wdHI8dm9pZCwgRlBERlN0cnVjdFRyZWVEZWxldGVyPiB0cmVlKAorICAgICAgRlBERl9TdHJ1Y3RUcmVlX0dldEZvclBhZ2UocGFnZSkpOworICBpZiAoIXRyZWUpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBsb2FkIHN0cnVjdCB0cmVlIGZvciBwYWdlICVkXG4iLCBwYWdlX2lkeCk7CisgICAgcmV0dXJuOworICB9CisKKyAgcHJpbnRmKCJTdHJ1Y3R1cmUgVHJlZSBmb3IgUGFnZSAlZFxuIiwgcGFnZV9pZHgpOworICBmb3IgKGludCBpID0gMDsgaSA8IEZQREZfU3RydWN0VHJlZV9Db3VudENoaWxkcmVuKHRyZWUuZ2V0KCkpOyArK2kpIHsKKyAgICBGUERGX1NUUlVDVEVMRU1FTlQgY2hpbGQgPSBGUERGX1N0cnVjdFRyZWVfR2V0Q2hpbGRBdEluZGV4KHRyZWUuZ2V0KCksIGkpOworICAgIGlmICghY2hpbGQpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGxvYWQgY2hpbGQgJWQgZm9yIHBhZ2UgJWRcbiIsIGksIHBhZ2VfaWR4KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBEdW1wQ2hpbGRTdHJ1Y3R1cmUoY2hpbGQsIDApOworICB9CisgIHByaW50ZigiXG5cbiIpOworfQorCit2b2lkIER1bXBNZXRhRGF0YShGUERGX0RPQ1VNRU5UIGRvYykgeworICBjb25zdGV4cHIgY29uc3QgY2hhciogbWV0YV90YWdzW10gPSB7IlRpdGxlIiwgICAgICAgICJBdXRob3IiLCAgIlN1YmplY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktleXdvcmRzIiwgICAgICJDcmVhdG9yIiwgIlByb2R1Y2VyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGlvbkRhdGUiLCAiTW9kRGF0ZSJ9OworICBmb3IgKGNvbnN0IGNoYXIqIG1ldGFfdGFnIDogbWV0YV90YWdzKSB7CisgICAgY2hhciBtZXRhX2J1ZmZlcls0MDk2XTsKKyAgICB1bnNpZ25lZCBsb25nIGxlbiA9CisgICAgICAgIEZQREZfR2V0TWV0YVRleHQoZG9jLCBtZXRhX3RhZywgbWV0YV9idWZmZXIsIHNpemVvZihtZXRhX2J1ZmZlcikpOworICAgIGlmICghbGVuKQorICAgICAgY29udGludWU7CisKKyAgICBhdXRvKiBtZXRhX3N0cmluZyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQgc2hvcnQqPihtZXRhX2J1ZmZlcik7CisgICAgcHJpbnRmKCIlLTEycyA9ICVscyAoJWx1IGJ5dGVzKVxuIiwgbWV0YV90YWcsCisgICAgICAgICAgIEdldFBsYXRmb3JtV1N0cmluZyhtZXRhX3N0cmluZykuY19zdHIoKSwgbGVuKTsKKyAgfQorfQorCit2b2lkIFNhdmVBdHRhY2htZW50cyhGUERGX0RPQ1VNRU5UIGRvYywgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBGUERGRG9jX0dldEF0dGFjaG1lbnRDb3VudChkb2MpOyArK2kpIHsKKyAgICBGUERGX0FUVEFDSE1FTlQgYXR0YWNobWVudCA9IEZQREZEb2NfR2V0QXR0YWNobWVudChkb2MsIGkpOworCisgICAgLy8gUmV0cmlldmUgdGhlIGF0dGFjaG1lbnQgZmlsZSBuYW1lLgorICAgIHN0ZDo6c3RyaW5nIGF0dGFjaG1lbnRfbmFtZTsKKyAgICB1bnNpZ25lZCBsb25nIGxlbiA9IEZQREZBdHRhY2htZW50X0dldE5hbWUoYXR0YWNobWVudCwgbnVsbHB0ciwgMCk7CisgICAgaWYgKGxlbikgeworICAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gYnVmKGxlbik7CisgICAgICB1bnNpZ25lZCBsb25nIGFjdHVhbF9sZW4gPQorICAgICAgICAgIEZQREZBdHRhY2htZW50X0dldE5hbWUoYXR0YWNobWVudCwgYnVmLmRhdGEoKSwgbGVuKTsKKyAgICAgIGlmIChhY3R1YWxfbGVuID09IGxlbikgeworICAgICAgICBhdHRhY2htZW50X25hbWUgPQorICAgICAgICAgICAgR2V0UGxhdGZvcm1TdHJpbmcocmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBzaG9ydCo+KGJ1Zi5kYXRhKCkpKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGF0dGFjaG1lbnRfbmFtZS5lbXB0eSgpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkF0dGFjaG1lbnQgIyVkIGhhcyBhbiBlbXB0eSBmaWxlIG5hbWUuXG4iLCBpICsgMSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBDYWxjdWxhdGUgdGhlIGZ1bGwgYXR0YWNobWVudCBmaWxlIG5hbWUuCisgICAgY2hhciBzYXZlX25hbWVbMjU2XTsKKyAgICBpbnQgY2hhcnNfZm9ybWF0dGVkID0KKyAgICAgICAgc25wcmludGYoc2F2ZV9uYW1lLCBzaXplb2Yoc2F2ZV9uYW1lKSwgIiVzLmF0dGFjaG1lbnQuJXMiLCBuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRfbmFtZS5jX3N0cigpKTsKKyAgICBpZiAoY2hhcnNfZm9ybWF0dGVkIDwgMCB8fAorICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KGNoYXJzX2Zvcm1hdHRlZCkgPj0gc2l6ZW9mKHNhdmVfbmFtZSkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRmlsZW5hbWUgJXMgaXMgdG9vIGxvbmdcbiIsIHNhdmVfbmFtZSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBSZXRyaWV2ZSB0aGUgYXR0YWNobWVudC4KKyAgICBsZW4gPSBGUERGQXR0YWNobWVudF9HZXRGaWxlKGF0dGFjaG1lbnQsIG51bGxwdHIsIDApOworICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGRhdGFfYnVmKGxlbik7CisgICAgaWYgKGxlbikgeworICAgICAgdW5zaWduZWQgbG9uZyBhY3R1YWxfbGVuID0KKyAgICAgICAgICBGUERGQXR0YWNobWVudF9HZXRGaWxlKGF0dGFjaG1lbnQsIGRhdGFfYnVmLmRhdGEoKSwgbGVuKTsKKyAgICAgIGlmIChhY3R1YWxfbGVuICE9IGxlbikKKyAgICAgICAgZGF0YV9idWYuY2xlYXIoKTsKKyAgICB9CisgICAgaWYgKGRhdGFfYnVmLmVtcHR5KCkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiQXR0YWNobWVudCBcIiVzXCIgaXMgZW1wdHkuXG4iLCBhdHRhY2htZW50X25hbWUuY19zdHIoKSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0aGUgYXR0YWNobWVudCBmaWxlLgorICAgIEZJTEUqIGZwID0gZm9wZW4oc2F2ZV9uYW1lLCAid2IiKTsKKyAgICBpZiAoIWZwKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBvcGVuICVzIGZvciBzYXZpbmcgYXR0YWNobWVudC5cbiIsIHNhdmVfbmFtZSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBzaXplX3Qgd3JpdHRlbl9sZW4gPSBmd3JpdGUoZGF0YV9idWYuZGF0YSgpLCAxLCBsZW4sIGZwKTsKKyAgICBpZiAod3JpdHRlbl9sZW4gPT0gbGVuKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNhdmVkIGF0dGFjaG1lbnQgXCIlc1wiIGFzOiAlcy5cbiIsCisgICAgICAgICAgICAgIGF0dGFjaG1lbnRfbmFtZS5jX3N0cigpLCBzYXZlX25hbWUpOworICAgIH0gZWxzZSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byB3cml0ZSB0byAlc1xuIiwgc2F2ZV9uYW1lKTsKKyAgICB9CisgICAgZmNsb3NlKGZwKTsKKyAgfQorfQorCit2b2lkIFNhdmVJbWFnZXMoRlBERl9QQUdFIHBhZ2UsIGNvbnN0IGNoYXIqIHBkZl9uYW1lLCBpbnQgcGFnZV9udW0pIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBGUERGUGFnZV9Db3VudE9iamVjdHMocGFnZSk7ICsraSkgeworICAgIEZQREZfUEFHRU9CSkVDVCBvYmogPSBGUERGUGFnZV9HZXRPYmplY3QocGFnZSwgaSk7CisgICAgaWYgKEZQREZQYWdlT2JqX0dldFR5cGUob2JqKSAhPSBGUERGX1BBR0VPQkpfSU1BR0UpCisgICAgICBjb250aW51ZTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjx2b2lkLCBGUERGQml0bWFwRGVsZXRlcj4gYml0bWFwKAorICAgICAgICBGUERGSW1hZ2VPYmpfR2V0Qml0bWFwKG9iaikpOworICAgIGlmICghYml0bWFwKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkltYWdlIG9iamVjdCAjJWQgb24gcGFnZSAjJWQgaGFzIGFuIGVtcHR5IGJpdG1hcC5cbiIsCisgICAgICAgICAgICAgIGkgKyAxLCBwYWdlX251bSArIDEpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaW50IGZvcm1hdCA9IEZQREZCaXRtYXBfR2V0Rm9ybWF0KGJpdG1hcC5nZXQoKSk7CisgICAgaWYgKGZvcm1hdCA9PSBGUERGQml0bWFwX1Vua25vd24pIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAiSW1hZ2Ugb2JqZWN0ICMlZCBvbiBwYWdlICMlZCBoYXMgYSBiaXRtYXAgb2YgdW5rbm93biBmb3JtYXQuXG4iLAorICAgICAgICAgICAgICBpICsgMSwgcGFnZV9udW0gKyAxKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+IHBuZ19lbmNvZGluZzsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBidWZmZXIgPQorICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oRlBERkJpdG1hcF9HZXRCdWZmZXIoYml0bWFwLmdldCgpKSk7CisgICAgaW50IHdpZHRoID0gRlBERkJpdG1hcF9HZXRXaWR0aChiaXRtYXAuZ2V0KCkpOworICAgIGludCBoZWlnaHQgPSBGUERGQml0bWFwX0dldEhlaWdodChiaXRtYXAuZ2V0KCkpOworICAgIGludCBzdHJpZGUgPSBGUERGQml0bWFwX0dldFN0cmlkZShiaXRtYXAuZ2V0KCkpOworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgIGNhc2UgRlBERkJpdG1hcF9HcmF5OgorICAgICAgICByZXQgPSBpbWFnZV9kaWZmX3BuZzo6RW5jb2RlR3JheVBORyhidWZmZXIsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBuZ19lbmNvZGluZyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGUERGQml0bWFwX0JHUjoKKyAgICAgICAgcmV0ID0gaW1hZ2VfZGlmZl9wbmc6OkVuY29kZUJHUlBORyhidWZmZXIsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG5nX2VuY29kaW5nKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZQREZCaXRtYXBfQkdSeDoKKyAgICAgICAgcmV0ID0gaW1hZ2VfZGlmZl9wbmc6OkVuY29kZUJHUkFQTkcoYnVmZmVyLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwbmdfZW5jb2RpbmcpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlBERkJpdG1hcF9CR1JBOgorICAgICAgICByZXQgPSBpbWFnZV9kaWZmX3BuZzo6RW5jb2RlQkdSQVBORyhidWZmZXIsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICZwbmdfZW5jb2RpbmcpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICB9CisgICAgaWYgKCFyZXQpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNvbnZlcnQgaW1hZ2Ugb2JqZWN0ICMlZCBvbiBwYWdlICMlZCB0byBwbmcuXG4iLCBpICsgMSwKKyAgICAgICAgICAgICAgcGFnZV9udW0gKyAxKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGNoYXIgZmlsZW5hbWVbMjU2XTsKKyAgICBpbnQgY2hhcnNfZm9ybWF0dGVkID0gc25wcmludGYoZmlsZW5hbWUsIHNpemVvZihmaWxlbmFtZSksICIlcy4lZC4lZC5wbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZGZfbmFtZSwgcGFnZV9udW0sIGkpOworICAgIGlmIChjaGFyc19mb3JtYXR0ZWQgPCAwIHx8CisgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4oY2hhcnNfZm9ybWF0dGVkKSA+PSBzaXplb2YoZmlsZW5hbWUpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZpbGVuYW1lICVzIGZvciBzYXZpbmcgaW1hZ2UgaXMgdG9vIGxvbmdcbiIsIGZpbGVuYW1lKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIEZJTEUqIGZwID0gZm9wZW4oZmlsZW5hbWUsICJ3YiIpOworICAgIGlmICghZnApIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIG9wZW4gJXMgZm9yIHNhdmluZyBpbWFnZS5cbiIsIGZpbGVuYW1lKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHNpemVfdCBieXRlc193cml0dGVuID0KKyAgICAgICAgZndyaXRlKCZwbmdfZW5jb2RpbmcuZnJvbnQoKSwgMSwgcG5nX2VuY29kaW5nLnNpemUoKSwgZnApOworICAgIGlmIChieXRlc193cml0dGVuICE9IHBuZ19lbmNvZGluZy5zaXplKCkpCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byB3cml0ZSB0byAlcy5cbiIsIGZpbGVuYW1lKTsKKyAgICBlbHNlCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlN1Y2Nlc3NmdWxseSB3cm90ZSBlbWJlZGRlZCBpbWFnZSAlcy5cbiIsIGZpbGVuYW1lKTsKKworICAgICh2b2lkKWZjbG9zZShmcCk7CisgIH0KK30KKworLy8gTm90ZSwgZm9yIGEgY2xpZW50IHVzaW5nIHByb2dyZXNzaXZlIHJlbmRlcmluZyB5b3UnZCB3YW50IHRvIGRldGVybWluZSBpZiB5b3UKKy8vIG5lZWQgdGhlIHJlbmRlcmluZyB0byBwYXVzZSBpbnN0ZWFkIG9mIGFsd2F5cyBzYXlpbmcgfHRydWV8LiBUaGlzIGlzIGZvcgorLy8gdGVzdGluZyB0byBmb3JjZSB0aGUgcmVuZGVyZXIgdG8gYnJlYWsgd2hlbmV2ZXIgcG9zc2libGUuCitGUERGX0JPT0wgTmVlZFRvUGF1c2VOb3coSUZTREtfUEFVU0UqIHApIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKIGJvb2wgUmVuZGVyUGFnZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICAgICBGUERGX0RPQ1VNRU5UIGRvYywKLSAgICAgICAgICAgICAgICBGUERGX0ZPUk1IQU5ETEUmIGZvcm0sCi0gICAgICAgICAgICAgICAgRlBERl9GT1JNRklMTElORk9fUERGaXVtVGVzdCYgZm9ybV9maWxsX2luZm8sCisgICAgICAgICAgICAgICAgRlBERl9GT1JNSEFORExFIGZvcm0sCisgICAgICAgICAgICAgICAgRlBERl9GT1JNRklMTElORk9fUERGaXVtVGVzdCogZm9ybV9maWxsX2luZm8sCiAgICAgICAgICAgICAgICAgY29uc3QgaW50IHBhZ2VfaW5kZXgsCiAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXZlbnRzKSB7Ci0gIEZQREZfUEFHRSBwYWdlID0gR2V0UGFnZUZvckluZGV4KCZmb3JtX2ZpbGxfaW5mbywgZG9jLCBwYWdlX2luZGV4KTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBHZXRQYWdlRm9ySW5kZXgoZm9ybV9maWxsX2luZm8sIGRvYywgcGFnZV9pbmRleCk7CiAgIGlmICghcGFnZSkKICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgRlBERl9URVhUUEFHRSB0ZXh0X3BhZ2UgPSBGUERGVGV4dF9Mb2FkUGFnZShwYWdlKTsKLQogICBpZiAob3B0aW9ucy5zZW5kX2V2ZW50cykKICAgICBTZW5kUGFnZUV2ZW50cyhmb3JtLCBwYWdlLCBldmVudHMpOworICBpZiAob3B0aW9ucy5zYXZlX2ltYWdlcykKKyAgICBTYXZlSW1hZ2VzKHBhZ2UsIG5hbWUuY19zdHIoKSwgcGFnZV9pbmRleCk7CisgIGlmIChvcHRpb25zLm91dHB1dF9mb3JtYXQgPT0gT1VUUFVUX1NUUlVDVFVSRSkgeworICAgIER1bXBQYWdlU3RydWN0dXJlKHBhZ2UsIHBhZ2VfaW5kZXgpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPHZvaWQsIEZQREZUZXh0UGFnZURlbGV0ZXI+IHRleHRfcGFnZShGUERGVGV4dF9Mb2FkUGFnZShwYWdlKSk7CiAKICAgZG91YmxlIHNjYWxlID0gMS4wOwogICBpZiAoIW9wdGlvbnMuc2NhbGVfZmFjdG9yX2FzX3N0cmluZy5lbXB0eSgpKQogICAgIHN0ZDo6c3RyaW5nc3RyZWFtKG9wdGlvbnMuc2NhbGVfZmFjdG9yX2FzX3N0cmluZykgPj4gc2NhbGU7CiAKLSAgaW50IHdpZHRoID0gc3RhdGljX2Nhc3Q8aW50PihGUERGX0dldFBhZ2VXaWR0aChwYWdlKSAqIHNjYWxlKTsKLSAgaW50IGhlaWdodCA9IHN0YXRpY19jYXN0PGludD4oRlBERl9HZXRQYWdlSGVpZ2h0KHBhZ2UpICogc2NhbGUpOworICBhdXRvIHdpZHRoID0gc3RhdGljX2Nhc3Q8aW50PihGUERGX0dldFBhZ2VXaWR0aChwYWdlKSAqIHNjYWxlKTsKKyAgYXV0byBoZWlnaHQgPSBzdGF0aWNfY2FzdDxpbnQ+KEZQREZfR2V0UGFnZUhlaWdodChwYWdlKSAqIHNjYWxlKTsKICAgaW50IGFscGhhID0gRlBERlBhZ2VfSGFzVHJhbnNwYXJlbmN5KHBhZ2UpID8gMSA6IDA7Ci0gIEZQREZfQklUTUFQIGJpdG1hcCA9IEZQREZCaXRtYXBfQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIGFscGhhKTsKKyAgc3RkOjp1bmlxdWVfcHRyPHZvaWQsIEZQREZCaXRtYXBEZWxldGVyPiBiaXRtYXAoCisgICAgICBGUERGQml0bWFwX0NyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBhbHBoYSkpOworCiAgIGlmIChiaXRtYXApIHsKICAgICBGUERGX0RXT1JEIGZpbGxfY29sb3IgPSBhbHBoYSA/IDB4MDAwMDAwMDAgOiAweEZGRkZGRkZGOwotICAgIEZQREZCaXRtYXBfRmlsbFJlY3QoYml0bWFwLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCBmaWxsX2NvbG9yKTsKLSAgICBGUERGX1JlbmRlclBhZ2VCaXRtYXAoYml0bWFwLCBwYWdlLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCBGUERGX0FOTk9UKTsKKyAgICBGUERGQml0bWFwX0ZpbGxSZWN0KGJpdG1hcC5nZXQoKSwgMCwgMCwgd2lkdGgsIGhlaWdodCwgZmlsbF9jb2xvcik7CiAKLSAgICBGUERGX0ZGTERyYXcoZm9ybSwgYml0bWFwLCBwYWdlLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCBGUERGX0FOTk9UKTsKLSAgICBpbnQgc3RyaWRlID0gRlBERkJpdG1hcF9HZXRTdHJpZGUoYml0bWFwKTsKKyAgICBpZiAob3B0aW9ucy5yZW5kZXJfb25lc2hvdCkgeworICAgICAgLy8gTm90ZSwgY2xpZW50IHByb2dyYW1zIHByb2JhYmx5IHdhbnQgdG8gdXNlIHRoaXMgbWV0aG9kIGluc3RlYWQgb2YgdGhlCisgICAgICAvLyBwcm9ncmVzc2l2ZSBjYWxscy4gVGhlIHByb2dyZXNzaXZlIGNhbGxzIGFyZSBpZiB5b3UgbmVlZCB0byBwYXVzZSB0aGUKKyAgICAgIC8vIHJlbmRlcmluZyB0byB1cGRhdGUgdGhlIFVJLCB0aGUgUERGIHJlbmRlcmVyIHdpbGwgYnJlYWsgd2hlbiBwb3NzaWJsZS4KKyAgICAgIEZQREZfUmVuZGVyUGFnZUJpdG1hcChiaXRtYXAuZ2V0KCksIHBhZ2UsIDAsIDAsIHdpZHRoLCBoZWlnaHQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9BTk5PVCk7CisgICAgfSBlbHNlIHsKKyAgICAgIElGU0RLX1BBVVNFIHBhdXNlOworICAgICAgcGF1c2UudmVyc2lvbiA9IDE7CisgICAgICBwYXVzZS5OZWVkVG9QYXVzZU5vdyA9ICZOZWVkVG9QYXVzZU5vdzsKKworICAgICAgaW50IHJ2ID0gRlBERl9SZW5kZXJQYWdlQml0bWFwX1N0YXJ0KGJpdG1hcC5nZXQoKSwgcGFnZSwgMCwgMCwgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCAwLCBGUERGX0FOTk9ULCAmcGF1c2UpOworICAgICAgd2hpbGUgKHJ2ID09IEZQREZfUkVOREVSX1RPQkVDT1VOVElOVUVEKQorICAgICAgICBydiA9IEZQREZfUmVuZGVyUGFnZV9Db250aW51ZShwYWdlLCAmcGF1c2UpOworICAgIH0KKworICAgIEZQREZfRkZMRHJhdyhmb3JtLCBiaXRtYXAuZ2V0KCksIHBhZ2UsIDAsIDAsIHdpZHRoLCBoZWlnaHQsIDAsIEZQREZfQU5OT1QpOworCisgICAgaWYgKCFvcHRpb25zLnJlbmRlcl9vbmVzaG90KQorICAgICAgRlBERl9SZW5kZXJQYWdlX0Nsb3NlKHBhZ2UpOworCisgICAgaW50IHN0cmlkZSA9IEZQREZCaXRtYXBfR2V0U3RyaWRlKGJpdG1hcC5nZXQoKSk7CiAgICAgY29uc3QgY2hhciogYnVmZmVyID0KLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oRlBERkJpdG1hcF9HZXRCdWZmZXIoYml0bWFwKSk7CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KEZQREZCaXRtYXBfR2V0QnVmZmVyKGJpdG1hcC5nZXQoKSkpOwogCi0gICAgc3RkOjpzdHJpbmcmJiBpbWFnZV9maWxlX25hbWUgPSAiIjsKKyAgICBzdGQ6OnN0cmluZyBpbWFnZV9maWxlX25hbWU7CiAgICAgc3dpdGNoIChvcHRpb25zLm91dHB1dF9mb3JtYXQpIHsKICNpZmRlZiBfV0lOMzIKICAgICAgIGNhc2UgT1VUUFVUX0JNUDoKQEAgLTY3MiwxMSArMTI5NiwyMCBAQAogICAgICAgY2FzZSBPVVRQVVRfRU1GOgogICAgICAgICBXcml0ZUVtZihwYWdlLCBuYW1lLmNfc3RyKCksIHBhZ2VfaW5kZXgpOwogICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBPVVRQVVRfUFMyOgorICAgICAgY2FzZSBPVVRQVVRfUFMzOgorICAgICAgICBXcml0ZVBTKHBhZ2UsIG5hbWUuY19zdHIoKSwgcGFnZV9pbmRleCk7CisgICAgICAgIGJyZWFrOwogI2VuZGlmCiAgICAgICBjYXNlIE9VVFBVVF9URVhUOgogICAgICAgICBXcml0ZVRleHQocGFnZSwgbmFtZS5jX3N0cigpLCBwYWdlX2luZGV4KTsKICAgICAgICAgYnJlYWs7CiAKKyAgICAgIGNhc2UgT1VUUFVUX0FOTk9UOgorICAgICAgICBXcml0ZUFubm90KHBhZ2UsIG5hbWUuY19zdHIoKSwgcGFnZV9pbmRleCk7CisgICAgICAgIGJyZWFrOworCiAgICAgICBjYXNlIE9VVFBVVF9QTkc6CiAgICAgICAgIGltYWdlX2ZpbGVfbmFtZSA9CiAgICAgICAgICAgICBXcml0ZVBuZyhuYW1lLmNfc3RyKCksIHBhZ2VfaW5kZXgsIGJ1ZmZlciwgc3RyaWRlLCB3aWR0aCwgaGVpZ2h0KTsKQEAgLTcwMiwyMCArMTMzNSwxNCBAQAogCiAgICAgLy8gV3JpdGUgdGhlIGZpbGVuYW1lIGFuZCB0aGUgTUQ1IG9mIHRoZSBidWZmZXIgdG8gc3Rkb3V0IGlmIHdlIHdyb3RlIGEKICAgICAvLyBmaWxlLgotICAgIGlmIChvcHRpb25zLm1kNSAmJiBpbWFnZV9maWxlX25hbWUgIT0gIiIpCisgICAgaWYgKG9wdGlvbnMubWQ1ICYmICFpbWFnZV9maWxlX25hbWUuZW1wdHkoKSkKICAgICAgIE91dHB1dE1ENUhhc2goaW1hZ2VfZmlsZV9uYW1lLmNfc3RyKCksIGJ1ZmZlciwgc3RyaWRlICogaGVpZ2h0KTsKLQotICAgIEZQREZCaXRtYXBfRGVzdHJveShiaXRtYXApOwogICB9IGVsc2UgewogICAgIGZwcmludGYoc3RkZXJyLCAiUGFnZSB3YXMgdG9vIGxhcmdlIHRvIGJlIHJlbmRlcmVkLlxuIik7CiAgIH0KIAotICBmb3JtX2ZpbGxfaW5mby5sb2FkZWRfcGFnZXMuZXJhc2UocGFnZV9pbmRleCk7Ci0KICAgRk9STV9Eb1BhZ2VBQWN0aW9uKHBhZ2UsIGZvcm0sIEZQREZQQUdFX0FBQ1RJT05fQ0xPU0UpOwogICBGT1JNX09uQmVmb3JlQ2xvc2VQYWdlKHBhZ2UsIGZvcm0pOwotICBGUERGVGV4dF9DbG9zZVBhZ2UodGV4dF9wYWdlKTsKLSAgRlBERl9DbG9zZVBhZ2UocGFnZSk7CiAgIHJldHVybiAhIWJpdG1hcDsKIH0KIApAQCAtNzI0LDE0ICsxMzUxLDE3IEBACiAgICAgICAgICAgICAgICBzaXplX3QgbGVuLAogICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBldmVudHMpIHsKLSAgSVBERl9KU1BMQVRGT1JNIHBsYXRmb3JtX2NhbGxiYWNrczsKLSAgbWVtc2V0KCZwbGF0Zm9ybV9jYWxsYmFja3MsICdcMCcsIHNpemVvZihwbGF0Zm9ybV9jYWxsYmFja3MpKTsKKyAgSVBERl9KU1BMQVRGT1JNIHBsYXRmb3JtX2NhbGxiYWNrcyA9IHt9OwogICBwbGF0Zm9ybV9jYWxsYmFja3MudmVyc2lvbiA9IDM7CiAgIHBsYXRmb3JtX2NhbGxiYWNrcy5hcHBfYWxlcnQgPSBFeGFtcGxlQXBwQWxlcnQ7CiAgIHBsYXRmb3JtX2NhbGxiYWNrcy5hcHBfcmVzcG9uc2UgPSBFeGFtcGxlQXBwUmVzcG9uc2U7CiAgIHBsYXRmb3JtX2NhbGxiYWNrcy5Eb2NfZ290b1BhZ2UgPSBFeGFtcGxlRG9jR290b1BhZ2U7CiAgIHBsYXRmb3JtX2NhbGxiYWNrcy5Eb2NfbWFpbCA9IEV4YW1wbGVEb2NNYWlsOwogCisgIC8vIFRoZSBwZGZfYXZhaWwgbXVzdCBvdXRsaXZlIGRvYy4KKyAgc3RkOjp1bmlxdWVfcHRyPHZvaWQsIEZQREZBdmFpbERlbGV0ZXI+IHBkZl9hdmFpbDsKKyAgLy8gVGhlIGRvY3VtZW50IG11c3Qgb3V0bGl2ZSB8Zm9ybV9jYWxsYmFja3MubG9hZGVkX3BhZ2VzfC4KKyAgc3RkOjp1bmlxdWVfcHRyPHZvaWQsIEZQREZEb2N1bWVudERlbGV0ZXI+IGRvYzsKICAgRlBERl9GT1JNRklMTElORk9fUERGaXVtVGVzdCBmb3JtX2NhbGxiYWNrcyA9IHt9OwogI2lmZGVmIFBERl9FTkFCTEVfWEZBCiAgIGZvcm1fY2FsbGJhY2tzLnZlcnNpb24gPSAyOwpAQCAtNzQyLDEwNSArMTM3Miw4NCBAQAogICBmb3JtX2NhbGxiYWNrcy5tX3BKc1BsYXRmb3JtID0gJnBsYXRmb3JtX2NhbGxiYWNrczsKIAogICBUZXN0TG9hZGVyIGxvYWRlcihwQnVmLCBsZW4pOwotICBGUERGX0ZJTEVBQ0NFU1MgZmlsZV9hY2Nlc3M7Ci0gIG1lbXNldCgmZmlsZV9hY2Nlc3MsICdcMCcsIHNpemVvZihmaWxlX2FjY2VzcykpOworICBGUERGX0ZJTEVBQ0NFU1MgZmlsZV9hY2Nlc3MgPSB7fTsKICAgZmlsZV9hY2Nlc3MubV9GaWxlTGVuID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZz4obGVuKTsKICAgZmlsZV9hY2Nlc3MubV9HZXRCbG9jayA9IFRlc3RMb2FkZXI6OkdldEJsb2NrOwogICBmaWxlX2FjY2Vzcy5tX1BhcmFtID0gJmxvYWRlcjsKIAotICBGWF9GSUxFQVZBSUwgZmlsZV9hdmFpbDsKLSAgbWVtc2V0KCZmaWxlX2F2YWlsLCAnXDAnLCBzaXplb2YoZmlsZV9hdmFpbCkpOworICBGWF9GSUxFQVZBSUwgZmlsZV9hdmFpbCA9IHt9OwogICBmaWxlX2F2YWlsLnZlcnNpb24gPSAxOwogICBmaWxlX2F2YWlsLklzRGF0YUF2YWlsID0gSXNfRGF0YV9BdmFpbDsKIAotICBGWF9ET1dOTE9BREhJTlRTIGhpbnRzOwotICBtZW1zZXQoJmhpbnRzLCAnXDAnLCBzaXplb2YoaGludHMpKTsKKyAgRlhfRE9XTkxPQURISU5UUyBoaW50cyA9IHt9OwogICBoaW50cy52ZXJzaW9uID0gMTsKICAgaGludHMuQWRkU2VnbWVudCA9IEFkZF9TZWdtZW50OwogCi0gIEZQREZfRE9DVU1FTlQgZG9jOwogICBpbnQgblJldCA9IFBERl9EQVRBX05PVEFWQUlMOwogICBib29sIGJJc0xpbmVhcml6ZWQgPSBmYWxzZTsKLSAgRlBERl9BVkFJTCBwZGZfYXZhaWwgPSBGUERGQXZhaWxfQ3JlYXRlKCZmaWxlX2F2YWlsLCAmZmlsZV9hY2Nlc3MpOwotICBzdGQ6OnVuaXF1ZV9wdHI8dm9pZCwgQXZhaWxEZWxldGVyPiBzY29wZWRfcGRmX2F2YWlsX2RlbGV0ZXIocGRmX2F2YWlsKTsKKyAgcGRmX2F2YWlsLnJlc2V0KEZQREZBdmFpbF9DcmVhdGUoJmZpbGVfYXZhaWwsICZmaWxlX2FjY2VzcykpOwogCi0gIGlmIChGUERGQXZhaWxfSXNMaW5lYXJpemVkKHBkZl9hdmFpbCkgPT0gUERGX0xJTkVBUklaRUQpIHsKLSAgICBkb2MgPSBGUERGQXZhaWxfR2V0RG9jdW1lbnQocGRmX2F2YWlsLCBudWxscHRyKTsKKyAgaWYgKEZQREZBdmFpbF9Jc0xpbmVhcml6ZWQocGRmX2F2YWlsLmdldCgpKSA9PSBQREZfTElORUFSSVpFRCkgeworICAgIGRvYy5yZXNldChGUERGQXZhaWxfR2V0RG9jdW1lbnQocGRmX2F2YWlsLmdldCgpLCBudWxscHRyKSk7CiAgICAgaWYgKGRvYykgewogICAgICAgd2hpbGUgKG5SZXQgPT0gUERGX0RBVEFfTk9UQVZBSUwpCi0gICAgICAgIG5SZXQgPSBGUERGQXZhaWxfSXNEb2NBdmFpbChwZGZfYXZhaWwsICZoaW50cyk7CisgICAgICAgIG5SZXQgPSBGUERGQXZhaWxfSXNEb2NBdmFpbChwZGZfYXZhaWwuZ2V0KCksICZoaW50cyk7CiAKICAgICAgIGlmIChuUmV0ID09IFBERl9EQVRBX0VSUk9SKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBlcnJvciBpbiBjaGVja2luZyBpZiBkb2Mgd2FzIGF2YWlsYWJsZS5cbiIpOwotICAgICAgICBGUERGX0Nsb3NlRG9jdW1lbnQoZG9jKTsKICAgICAgICAgcmV0dXJuOwogICAgICAgfQotICAgICAgblJldCA9IEZQREZBdmFpbF9Jc0Zvcm1BdmFpbChwZGZfYXZhaWwsICZoaW50cyk7CisgICAgICBuUmV0ID0gRlBERkF2YWlsX0lzRm9ybUF2YWlsKHBkZl9hdmFpbC5nZXQoKSwgJmhpbnRzKTsKICAgICAgIGlmIChuUmV0ID09IFBERl9GT1JNX0VSUk9SIHx8IG5SZXQgPT0gUERGX0ZPUk1fTk9UQVZBSUwpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsCiAgICAgICAgICAgICAgICAgIkVycm9yICVkIHdhcyByZXR1cm5lZCBpbiBjaGVja2luZyBpZiBmb3JtIHdhcyBhdmFpbGFibGUuXG4iLAogICAgICAgICAgICAgICAgIG5SZXQpOwotICAgICAgICBGUERGX0Nsb3NlRG9jdW1lbnQoZG9jKTsKICAgICAgICAgcmV0dXJuOwogICAgICAgfQogICAgICAgYklzTGluZWFyaXplZCA9IHRydWU7CiAgICAgfQogICB9IGVsc2UgewotICAgIGRvYyA9IEZQREZfTG9hZEN1c3RvbURvY3VtZW50KCZmaWxlX2FjY2VzcywgbnVsbHB0cik7CisgICAgZG9jLnJlc2V0KEZQREZfTG9hZEN1c3RvbURvY3VtZW50KCZmaWxlX2FjY2VzcywgbnVsbHB0cikpOwogICB9CiAKICAgaWYgKCFkb2MpIHsKLSAgICB1bnNpZ25lZCBsb25nIGVyciA9IEZQREZfR2V0TGFzdEVycm9yKCk7Ci0gICAgZnByaW50ZihzdGRlcnIsICJMb2FkIHBkZiBkb2NzIHVuc3VjY2Vzc2Z1bDogIik7Ci0gICAgc3dpdGNoIChlcnIpIHsKLSAgICAgIGNhc2UgRlBERl9FUlJfU1VDQ0VTUzoKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJTdWNjZXNzIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGUERGX0VSUl9VTktOT1dOOgotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gZXJyb3IiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZQREZfRVJSX0ZJTEU6Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmlsZSBub3QgZm91bmQgb3IgY291bGQgbm90IGJlIG9wZW5lZCIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRlBERl9FUlJfRk9STUFUOgotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZpbGUgbm90IGluIFBERiBmb3JtYXQgb3IgY29ycnVwdGVkIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGUERGX0VSUl9QQVNTV09SRDoKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJQYXNzd29yZCByZXF1aXJlZCBvciBpbmNvcnJlY3QgcGFzc3dvcmQiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZQREZfRVJSX1NFQ1VSSVRZOgotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuc3VwcG9ydGVkIHNlY3VyaXR5IHNjaGVtZSIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRlBERl9FUlJfUEFHRToKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJQYWdlIG5vdCBmb3VuZCBvciBjb250ZW50IGVycm9yIik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIGVycm9yICVsZCIsIGVycik7Ci0gICAgfQotICAgIGZwcmludGYoc3RkZXJyLCAiLlxuIik7Ci0KKyAgICBQcmludExhc3RFcnJvcigpOwogICAgIHJldHVybjsKICAgfQogCi0gICh2b2lkKUZQREZfR2V0RG9jUGVybWlzc2lvbnMoZG9jKTsKKyAgKHZvaWQpRlBERl9HZXREb2NQZXJtaXNzaW9ucyhkb2MuZ2V0KCkpOwogCi0gIEZQREZfRk9STUhBTkRMRSBmb3JtID0gRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudChkb2MsICZmb3JtX2NhbGxiYWNrcyk7Ci0gIGZvcm1fY2FsbGJhY2tzLmZvcm1faGFuZGxlID0gZm9ybTsKKyAgaWYgKG9wdGlvbnMuc2hvd19tZXRhZGF0YSkKKyAgICBEdW1wTWV0YURhdGEoZG9jLmdldCgpKTsKKworICBpZiAob3B0aW9ucy5zYXZlX2F0dGFjaG1lbnRzKQorICAgIFNhdmVBdHRhY2htZW50cyhkb2MuZ2V0KCksIG5hbWUpOworCisgIHN0ZDo6dW5pcXVlX3B0cjx2b2lkLCBGUERGRm9ybUhhbmRsZURlbGV0ZXI+IGZvcm0oCisgICAgICBGUERGRE9DX0luaXRGb3JtRmlsbEVudmlyb25tZW50KGRvYy5nZXQoKSwgJmZvcm1fY2FsbGJhY2tzKSk7CisgIGZvcm1fY2FsbGJhY2tzLmZvcm1faGFuZGxlID0gZm9ybS5nZXQoKTsKIAogI2lmZGVmIFBERl9FTkFCTEVfWEZBCi0gIGludCBkb2NfdHlwZSA9IERPQ1RZUEVfUERGOwotICBpZiAoRlBERl9IYXNYRkFGaWVsZChkb2MsICZkb2NfdHlwZSkgJiYgZG9jX3R5cGUgIT0gRE9DVFlQRV9QREYgJiYKLSAgICAgICFGUERGX0xvYWRYRkEoZG9jKSkgewotICAgIGZwcmludGYoc3RkZXJyLCAiTG9hZFhGQSB1bnN1Y2Nlc3NmdWwsIGNvbnRpbnVpbmcgYW55d2F5LlxuIik7CisgIGludCBkb2NfdHlwZSA9IEZQREZfR2V0Rm9ybVR5cGUoZG9jLmdldCgpKTsKKyAgaWYgKGRvY190eXBlID09IEZPUk1UWVBFX1hGQV9GVUxMIHx8IGRvY190eXBlID09IEZPUk1UWVBFX1hGQV9GT1JFR1JPVU5EKSB7CisgICAgaWYgKCFGUERGX0xvYWRYRkEoZG9jLmdldCgpKSkKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTG9hZFhGQSB1bnN1Y2Nlc3NmdWwsIGNvbnRpbnVpbmcgYW55d2F5LlxuIik7CiAgIH0KICNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKLSAgRlBERl9TZXRGb3JtRmllbGRIaWdobGlnaHRDb2xvcihmb3JtLCAwLCAweEZGRTRERCk7Ci0gIEZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0QWxwaGEoZm9ybSwgMTAwKTsKIAotICBGT1JNX0RvRG9jdW1lbnRKU0FjdGlvbihmb3JtKTsKLSAgRk9STV9Eb0RvY3VtZW50T3BlbkFjdGlvbihmb3JtKTsKKyAgRlBERl9TZXRGb3JtRmllbGRIaWdobGlnaHRDb2xvcihmb3JtLmdldCgpLCBGUERGX0ZPUk1GSUVMRF9VTktOT1dOLCAweEZGRTRERCk7CisgIEZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0QWxwaGEoZm9ybS5nZXQoKSwgMTAwKTsKKyAgRk9STV9Eb0RvY3VtZW50SlNBY3Rpb24oZm9ybS5nZXQoKSk7CisgIEZPUk1fRG9Eb2N1bWVudE9wZW5BY3Rpb24oZm9ybS5nZXQoKSk7CiAKLSAgaW50IHBhZ2VfY291bnQgPSBGUERGX0dldFBhZ2VDb3VudChkb2MpOworI2lmIF9XSU4zMgorICBpZiAob3B0aW9ucy5vdXRwdXRfZm9ybWF0ID09IE9VVFBVVF9QUzIpCisgICAgRlBERl9TZXRQcmludE1vZGUoRlBERl9QUklOVE1PREVfUE9TVFNDUklQVDIpOworICBlbHNlIGlmIChvcHRpb25zLm91dHB1dF9mb3JtYXQgPT0gT1VUUFVUX1BTMykKKyAgICBGUERGX1NldFByaW50TW9kZShGUERGX1BSSU5UTU9ERV9QT1NUU0NSSVBUMyk7CisjZW5kaWYKKworICBpbnQgcGFnZV9jb3VudCA9IEZQREZfR2V0UGFnZUNvdW50KGRvYy5nZXQoKSk7CiAgIGludCByZW5kZXJlZF9wYWdlcyA9IDA7CiAgIGludCBiYWRfcGFnZXMgPSAwOwogICBpbnQgZmlyc3RfcGFnZSA9IG9wdGlvbnMucGFnZXMgPyBvcHRpb25zLmZpcnN0X3BhZ2UgOiAwOwpAQCAtODQ5LDMzICsxNDU4LDI5IEBACiAgICAgaWYgKGJJc0xpbmVhcml6ZWQpIHsKICAgICAgIG5SZXQgPSBQREZfREFUQV9OT1RBVkFJTDsKICAgICAgIHdoaWxlIChuUmV0ID09IFBERl9EQVRBX05PVEFWQUlMKQotICAgICAgICBuUmV0ID0gRlBERkF2YWlsX0lzUGFnZUF2YWlsKHBkZl9hdmFpbCwgaSwgJmhpbnRzKTsKKyAgICAgICAgblJldCA9IEZQREZBdmFpbF9Jc1BhZ2VBdmFpbChwZGZfYXZhaWwuZ2V0KCksIGksICZoaW50cyk7CiAKICAgICAgIGlmIChuUmV0ID09IFBERl9EQVRBX0VSUk9SKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBlcnJvciBpbiBjaGVja2luZyBpZiBwYWdlICVkIGlzIGF2YWlsYWJsZS5cbiIsCiAgICAgICAgICAgICAgICAgaSk7Ci0gICAgICAgIEZQREZET0NfRXhpdEZvcm1GaWxsRW52aXJvbm1lbnQoZm9ybSk7Ci0gICAgICAgIEZQREZfQ2xvc2VEb2N1bWVudChkb2MpOwogICAgICAgICByZXR1cm47CiAgICAgICB9CiAgICAgfQotICAgIGlmIChSZW5kZXJQYWdlKG5hbWUsIGRvYywgZm9ybSwgZm9ybV9jYWxsYmFja3MsIGksIG9wdGlvbnMsIGV2ZW50cykpCisgICAgaWYgKFJlbmRlclBhZ2UobmFtZSwgZG9jLmdldCgpLCBmb3JtLmdldCgpLCAmZm9ybV9jYWxsYmFja3MsIGksIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgZXZlbnRzKSkgewogICAgICAgKytyZW5kZXJlZF9wYWdlczsKLSAgICBlbHNlCisgICAgfSBlbHNlIHsKICAgICAgICsrYmFkX3BhZ2VzOworICAgIH0KICAgfQogCi0gIEZPUk1fRG9Eb2N1bWVudEFBY3Rpb24oZm9ybSwgRlBERkRPQ19BQUNUSU9OX1dDKTsKLQotICBGUERGRE9DX0V4aXRGb3JtRmlsbEVudmlyb25tZW50KGZvcm0pOwotICBGUERGX0Nsb3NlRG9jdW1lbnQoZG9jKTsKLQorICBGT1JNX0RvRG9jdW1lbnRBQWN0aW9uKGZvcm0uZ2V0KCksIEZQREZET0NfQUFDVElPTl9XQyk7CiAgIGZwcmludGYoc3RkZXJyLCAiUmVuZGVyZWQgJWQgcGFnZXMuXG4iLCByZW5kZXJlZF9wYWdlcyk7CiAgIGlmIChiYWRfcGFnZXMpCiAgICAgZnByaW50ZihzdGRlcnIsICJTa2lwcGVkICVkIGJhZCBwYWdlcy5cbiIsIGJhZF9wYWdlcyk7CiB9CiAKLXN0YXRpYyB2b2lkIFNob3dDb25maWcoKSB7Cit2b2lkIFNob3dDb25maWcoKSB7CiAgIHN0ZDo6c3RyaW5nIGNvbmZpZzsKICAgc3RkOjpzdHJpbmcgbWF5YmVfY29tbWE7CiAjaWYgUERGX0VOQUJMRV9WOApAQCAtOTAxLDI3ICsxNTA2LDQ0IEBACiAgIHByaW50ZigiJXNcbiIsIGNvbmZpZy5jX3N0cigpKTsKIH0KIAotc3RhdGljIGNvbnN0IGNoYXIga1VzYWdlU3RyaW5nW10gPQorY29uc3RleHByIGNoYXIga1VzYWdlU3RyaW5nW10gPQogICAgICJVc2FnZTogcGRmaXVtX3Rlc3QgW09QVElPTl0gW0ZJTEVdLi4uXG4iCi0gICAgIiAgLS1zaG93LWNvbmZpZyAgICAgLSBwcmludCBidWlsZCBvcHRpb25zIGFuZCBleGl0XG4iCi0gICAgIiAgLS1zZW5kLWV2ZW50cyAgICAgLSBzZW5kIGlucHV0IGRlc2NyaWJlZCBieSAuZXZ0IGZpbGVcbiIKLSAgICAiICAtLWJpbi1kaXI9PHBhdGg+ICAtIG92ZXJyaWRlIHBhdGggdG8gdjggZXh0ZXJuYWwgZGF0YVxuIgotICAgICIgIC0tZm9udC1kaXI9PHBhdGg+IC0gb3ZlcnJpZGUgcGF0aCB0byBleHRlcm5hbCBmb250c1xuIgotICAgICIgIC0tc2NhbGU9PG51bWJlcj4gIC0gc2NhbGUgb3V0cHV0IHNpemUgYnkgbnVtYmVyIChlLmcuIDAuNSlcbiIKKyAgICAiICAtLXNob3ctY29uZmlnICAgICAgIC0gcHJpbnQgYnVpbGQgb3B0aW9ucyBhbmQgZXhpdFxuIgorICAgICIgIC0tc2hvdy1tZXRhZGF0YSAgICAgLSBwcmludCB0aGUgZmlsZSBtZXRhZGF0YVxuIgorICAgICIgIC0tc2hvdy1zdHJ1Y3R1cmUgICAgLSBwcmludCB0aGUgc3RydWN0dXJlIGVsZW1lbnRzIGZyb20gdGhlIGRvY3VtZW50XG4iCisgICAgIiAgLS1zZW5kLWV2ZW50cyAgICAgICAtIHNlbmQgaW5wdXQgZGVzY3JpYmVkIGJ5IC5ldnQgZmlsZVxuIgorICAgICIgIC0tcmVuZGVyLW9uZXNob3QgICAgLSByZW5kZXIgaW1hZ2Ugd2l0aG91dCB1c2luZyBwcm9ncmVzc2l2ZSByZW5kZXJlclxuIgorICAgICIgIC0tc2F2ZS1hdHRhY2htZW50cyAgLSB3cml0ZSBlbWJlZGRlZCBhdHRhY2htZW50cyAiCisgICAgIjxwZGYtbmFtZT4uYXR0YWNobWVudC48YXR0YWNobWVudC1uYW1lPlxuIgorICAgICIgIC0tc2F2ZS1pbWFnZXMgICAgICAgLSB3cml0ZSBlbWJlZGRlZCBpbWFnZXMgIgorICAgICI8cGRmLW5hbWU+LjxwYWdlLW51bWJlcj4uPG9iamVjdC1udW1iZXI+LnBuZ1xuIgorI2lmZGVmIEVOQUJMRV9DQUxMR1JJTkQKKyAgICAiICAtLWNhbGxncmluZC1kZWxpbSAgIC0gZGVsaW1pdCBpbnRlcmVzdGluZyBzZWN0aW9uIHdoZW4gdXNpbmcgY2FsbGdyaW5kXG4iCisjZW5kaWYgIC8vIEVOQUJMRV9DQUxMR1JJTkQKKyAgICAiICAtLWJpbi1kaXI9PHBhdGg+ICAgIC0gb3ZlcnJpZGUgcGF0aCB0byB2OCBleHRlcm5hbCBkYXRhXG4iCisgICAgIiAgLS1mb250LWRpcj08cGF0aD4gICAtIG92ZXJyaWRlIHBhdGggdG8gZXh0ZXJuYWwgZm9udHNcbiIKKyAgICAiICAtLXNjYWxlPTxudW1iZXI+ICAgIC0gc2NhbGUgb3V0cHV0IHNpemUgYnkgbnVtYmVyIChlLmcuIDAuNSlcbiIKICAgICAiICAtLXBhZ2VzPTxudW1iZXI+KC08bnVtYmVyPikgLSBvbmx5IHJlbmRlciB0aGUgZ2l2ZW4gMC1iYXNlZCBwYWdlKHMpXG4iCiAjaWZkZWYgX1dJTjMyCi0gICAgIiAgLS1ibXAgLSB3cml0ZSBwYWdlIGltYWdlcyA8cGRmLW5hbWU+LjxwYWdlLW51bWJlcj4uYm1wXG4iCi0gICAgIiAgLS1lbWYgLSB3cml0ZSBwYWdlIG1ldGEgZmlsZXMgPHBkZi1uYW1lPi48cGFnZS1udW1iZXI+LmVtZlxuIgorICAgICIgIC0tYm1wICAgLSB3cml0ZSBwYWdlIGltYWdlcyA8cGRmLW5hbWU+LjxwYWdlLW51bWJlcj4uYm1wXG4iCisgICAgIiAgLS1lbWYgICAtIHdyaXRlIHBhZ2UgbWV0YSBmaWxlcyA8cGRmLW5hbWU+LjxwYWdlLW51bWJlcj4uZW1mXG4iCisgICAgIiAgLS1wczIgICAtIHdyaXRlIHBhZ2UgcmF3IFBvc3RTY3JpcHQgKEx2bCAyKSAiCisgICAgIjxwZGYtbmFtZT4uPHBhZ2UtbnVtYmVyPi5wc1xuIgorICAgICIgIC0tcHMzICAgLSB3cml0ZSBwYWdlIHJhdyBQb3N0U2NyaXB0IChMdmwgMykgIgorICAgICI8cGRmLW5hbWU+LjxwYWdlLW51bWJlcj4ucHNcbiIKICNlbmRpZiAgLy8gX1dJTjMyCi0gICAgIiAgLS10eHQgLSB3cml0ZSBwYWdlIHRleHQgaW4gVVRGMzItTEUgPHBkZi1uYW1lPi48cGFnZS1udW1iZXI+LnR4dFxuIgotICAgICIgIC0tcG5nIC0gd3JpdGUgcGFnZSBpbWFnZXMgPHBkZi1uYW1lPi48cGFnZS1udW1iZXI+LnBuZ1xuIgotICAgICIgIC0tcHBtIC0gd3JpdGUgcGFnZSBpbWFnZXMgPHBkZi1uYW1lPi48cGFnZS1udW1iZXI+LnBwbVxuIgorICAgICIgIC0tdHh0ICAgLSB3cml0ZSBwYWdlIHRleHQgaW4gVVRGMzItTEUgPHBkZi1uYW1lPi48cGFnZS1udW1iZXI+LnR4dFxuIgorICAgICIgIC0tcG5nICAgLSB3cml0ZSBwYWdlIGltYWdlcyA8cGRmLW5hbWU+LjxwYWdlLW51bWJlcj4ucG5nXG4iCisgICAgIiAgLS1wcG0gICAtIHdyaXRlIHBhZ2UgaW1hZ2VzIDxwZGYtbmFtZT4uPHBhZ2UtbnVtYmVyPi5wcG1cbiIKKyAgICAiICAtLWFubm90IC0gd3JpdGUgYW5ub3RhdGlvbiBpbmZvIDxwZGYtbmFtZT4uPHBhZ2UtbnVtYmVyPi5hbm5vdC50eHRcbiIKICNpZmRlZiBQREZfRU5BQkxFX1NLSUEKLSAgICAiICAtLXNrcCAtIHdyaXRlIHBhZ2UgaW1hZ2VzIDxwZGYtbmFtZT4uPHBhZ2UtbnVtYmVyPi5za3BcbiIKKyAgICAiICAtLXNrcCAgIC0gd3JpdGUgcGFnZSBpbWFnZXMgPHBkZi1uYW1lPi48cGFnZS1udW1iZXI+LnNrcFxuIgogI2VuZGlmCi0gICAgIiAgLS1tZDUgLSB3cml0ZSBvdXRwdXQgaW1hZ2UgcGF0aHMgYW5kIHRoZWlyIG1kNSBoYXNoZXMgdG8gc3Rkb3V0LlxuIgorICAgICIgIC0tbWQ1ICAgLSB3cml0ZSBvdXRwdXQgaW1hZ2UgcGF0aHMgYW5kIHRoZWlyIG1kNSBoYXNoZXMgdG8gc3Rkb3V0LlxuIgogICAgICIiOwogCit9ICAvLyBuYW1lc3BhY2UKKwogaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGFyZ3ZbXSkgewogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gYXJncyhhcmd2LCBhcmd2ICsgYXJnYyk7CiAgIE9wdGlvbnMgb3B0aW9uczsKQEAgLTk2Nyw4ICsxNTg5LDcgQEAKICAgfQogICBGUERGX0luaXRMaWJyYXJ5V2l0aENvbmZpZygmY29uZmlnKTsKIAotICBVTlNVUFBPUlRfSU5GTyB1bnN1cHBvcnRlZF9pbmZvOwotICBtZW1zZXQoJnVuc3VwcG9ydGVkX2luZm8sICdcMCcsIHNpemVvZih1bnN1cHBvcnRlZF9pbmZvKSk7CisgIFVOU1VQUE9SVF9JTkZPIHVuc3VwcG9ydGVkX2luZm8gPSB7fTsKICAgdW5zdXBwb3J0ZWRfaW5mby52ZXJzaW9uID0gMTsKICAgdW5zdXBwb3J0ZWRfaW5mby5GU0RLX1VuU3VwcG9ydF9IYW5kbGVyID0gRXhhbXBsZVVuc3VwcG9ydGVkSGFuZGxlcjsKIApAQCAtOTgxLDYgKzE2MDIsMTIgQEAKICAgICBpZiAoIWZpbGVfY29udGVudHMpCiAgICAgICBjb250aW51ZTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIlJlbmRlcmluZyBQREYgZmlsZSAlcy5cbiIsIGZpbGVuYW1lLmNfc3RyKCkpOworCisjaWZkZWYgRU5BQkxFX0NBTExHUklORAorICAgIGlmIChvcHRpb25zLmNhbGxncmluZF9kZWxpbWl0ZXJzKQorICAgICAgQ0FMTEdSSU5EX1NUQVJUX0lOU1RSVU1FTlRBVElPTjsKKyNlbmRpZiAgLy8gRU5BQkxFX0NBTExHUklORAorCiAgICAgc3RkOjpzdHJpbmcgZXZlbnRzOwogICAgIGlmIChvcHRpb25zLnNlbmRfZXZlbnRzKSB7CiAgICAgICBzdGQ6OnN0cmluZyBldmVudF9maWxlbmFtZSA9IGZpbGVuYW1lOwpAQCAtMTAwMSw2ICsxNjI4LDExIEBACiAgICAgICB9CiAgICAgfQogICAgIFJlbmRlclBkZihmaWxlbmFtZSwgZmlsZV9jb250ZW50cy5nZXQoKSwgZmlsZV9sZW5ndGgsIG9wdGlvbnMsIGV2ZW50cyk7CisKKyNpZmRlZiBFTkFCTEVfQ0FMTEdSSU5ECisgICAgaWYgKG9wdGlvbnMuY2FsbGdyaW5kX2RlbGltaXRlcnMpCisgICAgICBDQUxMR1JJTkRfU1RPUF9JTlNUUlVNRU5UQVRJT047CisjZW5kaWYgIC8vIEVOQUJMRV9DQUxMR1JJTkQKICAgfQogCiAgIEZQREZfRGVzdHJveUxpYnJhcnkoKTsKZGlmZiAtLWdpdCBhL3NraWEvQlVJTEQuZ24gYi9za2lhL0JVSUxELmduCmluZGV4IDcyM2U4NzIuLjdjYTdjMTkgMTAwNjQ0Ci0tLSBhL3NraWEvQlVJTEQuZ24KKysrIGIvc2tpYS9CVUlMRC5nbgpAQCAtMjMsOSArMjMsMTEgQEAKICAgICAiY29uZmlnIiwKICAgICAiZXh0IiwKICAgICAiLy90aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvYyIsCisgICAgIi8vdGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2NvZGVjIiwKICAgICAiLy90aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29uZmlnIiwKICAgICAiLy90aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZSIsCiAgICAgIi8vdGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2VmZmVjdHMiLAorICAgICIvL3RoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9lbmNvZGUiLAogICAgICIvL3RoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9pbWFnZXMiLAogICAgICIvL3RoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9sYXp5IiwKICAgICAiLy90aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvcGF0aG9wcyIsCkBAIC0zMywxMyArMzUsMjIgQEAKICAgICAiLy90aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvcGlwZSIsCiAgICAgIi8vdGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL3BvcnRzIiwKICAgICAiLy90aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvdXRpbHMiLAotCi0gICAgIyBUT0RPKGRzaW5jbGFpcik6IFJpZ2h0IHdheSB0byB1c2UgLy90aGlyZF9wYXJ0eS9mcmVldHlwZT8KLSAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlIiwKKyAgICAiLy90aGlyZF9wYXJ0eS9za2lhL3RoaXJkX3BhcnR5L3Z1bGthbiIsCiAgIF0KIAogICBkZWZpbmVzID0gW10KIAorICBpZiAoaXNfd2luKSB7CisgICAgZGVmaW5lcyArPSBbICJTS19GUkVFVFlQRV9NSU5JTVVNX1JVTlRJTUVfVkVSU0lPTj0oKChGUkVFVFlQRV9NQUpPUikgKiAweDAxMDAwMDAwKSB8ICgoRlJFRVRZUEVfTUlOT1IpICogMHgwMDAxMDAwMCkgfCAoKEZSRUVUWVBFX1BBVENIKSAqIDB4MDAwMDAxMDApKSIgXQorICB9CisKKyAgaWYgKGlzX2NvbXBvbmVudF9idWlsZCkgeworICAgIGRlZmluZXMgKz0gWworICAgICAgIlNLSUFfRExMIiwKKyAgICAgICJHUl9HTF9JR05PUkVfRVMzX01TQUE9MCIsCisgICAgXQorICB9CisKICAgaWYgKHNraWFfc3VwcG9ydF9ncHUpIHsKICAgICBpbmNsdWRlX2RpcnMgKz0gWwogICAgICAgIi8vdGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2dwdSIsCkBAIC04MCw2ICs5MSw3IEBACiAgICAgIi8vdGhpcmRfcGFydHkvc2tpYS9zcmMvcGRmIiwKICAgICAiLy90aGlyZF9wYXJ0eS9za2lhL3NyYy9wb3J0cyIsCiAgICAgIi8vdGhpcmRfcGFydHkvc2tpYS9zcmMvc2ZudCIsCisgICAgIi8vdGhpcmRfcGFydHkvc2tpYS9zcmMvc2hhZGVycyIsCiAgICAgIi8vdGhpcmRfcGFydHkvc2tpYS9zcmMvc2tzbCIsCiAgICAgIi8vdGhpcmRfcGFydHkvc2tpYS9zcmMvdXRpbHMiLAogICAgICIvL3RoaXJkX3BhcnR5L3NraWEvc3JjL2xhenkiLApAQCAtOTMsNiArMTA1LDEwIEBACiAKICAgZGVmaW5lcyA9IFtdCiAKKyAgaWYgKGlzX2NvbXBvbmVudF9idWlsZCkgeworICAgIGRlZmluZXMgKz0gWyAiU0tJQV9JTVBMRU1FTlRBVElPTj0xIiBdCisgIH0KKwogICBpZiAoY3VycmVudF9jcHUgPT0gImFybSIpIHsKICAgICBpZiAoYXJtX3VzZV9uZW9uKSB7CiAgICAgICBkZWZpbmVzICs9IFsgIlNLX0FSTV9IQVNfTkVPTiIgXQpAQCAtMTcxLDcgKzE4Nyw3IEBACiAgICAgImV4dC9nb29nbGVfbG9nZ2luZy5jYyIsCiAgIF0KIAotICAjIFRoZSBza2lhIGd5cGkgdmFsdWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgc2tpYV9kaXIsIHNvIHdlIG5lZWQgdG8gcmViYXNlLgorICAjIFRoZSBza2lhIHNvdXJjZXMgdmFsdWVzIGFyZSByZWxhdGl2ZSB0byB0aGUgc2tpYV9kaXIsIHNvIHdlIG5lZWQgdG8gcmViYXNlLgogICBzb3VyY2VzICs9IHNraWFfY29yZV9zb3VyY2VzCiAgIHNvdXJjZXMgKz0gc2tpYV9lZmZlY3RzX3NvdXJjZXMKICAgc291cmNlcyArPSBza2lhX3Nrc2xfc291cmNlcwpAQCAtMTc5LDYgKzE5NSw3IEBACiAgIHNvdXJjZXMgKz0gWwogICAgICIvL3RoaXJkX3BhcnR5L3NraWEvc3JjL2ZvbnRzL1NrRm9udE1ncl9pbmRpcmVjdC5jcHAiLAogICAgICIvL3RoaXJkX3BhcnR5L3NraWEvc3JjL2ZvbnRzL1NrUmVtb3RhYmxlRm9udE1nci5jcHAiLAorICAgICIvL3RoaXJkX3BhcnR5L3NraWEvc3JjL2ltYWdlcy9Ta0ltYWdlRW5jb2Rlci5jcHAiLAogICAgICIvL3RoaXJkX3BhcnR5L3NraWEvc3JjL3BvcnRzL1NrRm9udEhvc3RfRnJlZVR5cGUuY3BwIiwKICAgICAiLy90aGlyZF9wYXJ0eS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRIb3N0X0ZyZWVUeXBlX2NvbW1vbi5jcHAiLAogICAgICIvL3RoaXJkX3BhcnR5L3NraWEvc3JjL3BvcnRzL1NrRm9udEhvc3Rfd2luLmNwcCIsCkBAIC0xODYsNyArMjAzLDYgQEAKICAgICAiLy90aGlyZF9wYXJ0eS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRNZ3JfYW5kcm9pZF9mYWN0b3J5LmNwcCIsCiAgICAgIi8vdGhpcmRfcGFydHkvc2tpYS9zcmMvcG9ydHMvU2tGb250TWdyX2FuZHJvaWRfcGFyc2VyLmNwcCIsCiAgICAgIi8vdGhpcmRfcGFydHkvc2tpYS9zcmMvcG9ydHMvU2tHbG9iYWxJbml0aWFsaXphdGlvbl9kZWZhdWx0LmNwcCIsCi0gICAgIi8vdGhpcmRfcGFydHkvc2tpYS9zcmMvcG9ydHMvU2tJbWFnZUVuY29kZXJfbm9uZS5jcHAiLAogICAgICIvL3RoaXJkX3BhcnR5L3NraWEvc3JjL3BvcnRzL1NrSW1hZ2VHZW5lcmF0b3Jfbm9uZS5jcHAiLAogICAgICIvL3RoaXJkX3BhcnR5L3NraWEvc3JjL3BvcnRzL1NrT1NGaWxlX3Bvc2l4LmNwcCIsCiAgICAgIi8vdGhpcmRfcGFydHkvc2tpYS9zcmMvcG9ydHMvU2tPU0ZpbGVfc3RkaW8uY3BwIiwKQEAgLTIyMywxNCArMjM5LDEyIEBACiAgICAgc291cmNlcyArPSBza2lhX251bGxfZ3B1X3NvdXJjZXMKICAgfQogCi0gICMgUmVtb3ZlIHVudXNlZCB1dGlsIGZpbGVzIGluY2x1ZGUgaW4gdXRpbHMuZ3lwaQorICAjIFJlbW92ZSB1bnVzZWQgdXRpbCBmaWxlcyBpbmNsdWRlIGluIHV0aWxzLmduaQogICBzb3VyY2VzIC09IFsKLSAgICAiLy90aGlyZF9wYXJ0eS9za2lhL3NyYy91dGlscy9Ta0JvdW5kYXJ5UGF0Y2guY3BwIiwKICAgICAiLy90aGlyZF9wYXJ0eS9za2lhL3NyYy91dGlscy9Ta0NhbWVyYS5jcHAiLAogICAgICIvL3RoaXJkX3BhcnR5L3NraWEvc3JjL3V0aWxzL1NrRHVtcENhbnZhcy5jcHAiLAogICAgICIvL3RoaXJkX3BhcnR5L3NraWEvc3JjL3V0aWxzL1NrRnJvbnRCdWZmZXJlZFN0cmVhbS5jcHAiLAogICAgICIvL3RoaXJkX3BhcnR5L3NraWEvc3JjL3V0aWxzL1NrSW50ZXJwb2xhdG9yLmNwcCIsCi0gICAgIi8vdGhpcmRfcGFydHkvc2tpYS9zcmMvdXRpbHMvU2tNZXNoVXRpbHMuY3BwIiwKICAgICAiLy90aGlyZF9wYXJ0eS9za2lhL3NyYy91dGlscy9Ta1BhcnNlUGF0aC5jcHAiLAogICBdCiAKQEAgLTMwNiw3ICszMjAsOCBAQAogCiAgIGRlcHMgPSBbCiAgICAgIjpza2lhX29wdHMiLAotICAgICIuLi90aGlyZF9wYXJ0eTpmeF96bGliIiwKKyAgICAiLi4vdGhpcmRfcGFydHk6emxpYiIsCisgICAgIi8vOmZyZWV0eXBlX2NvbW1vbiIsCiAgIF0KIAogICBpZiAoaXNfbGludXgpIHsKQEAgLTQ4Niw3ICs1MDEsNyBAQAogICAgIGNmbGFncyArPSBbICItZm9taXQtZnJhbWUtcG9pbnRlciIgXQogICAgIHNvdXJjZXMgPSBza2lhX29wdHMubm9uZV9zb3VyY2VzCiAgIH0gZWxzZSB7Ci0gICAgYXNzZXJ0KGZhbHNlLCAiTmVlZCB0byBwb3J0IGNwdSBzcGVjaWZpYyBzdHVmZiBmcm9tIHNraWFfbGlicmFyeV9vcHRzLmd5cCIpCisgICAgYXNzZXJ0KGZhbHNlLCAiTmVlZCB0byBwb3J0IGNwdSBzcGVjaWZpYyBzdHVmZiBmcm9tIGduL0JVSUxEQ09ORklHLmduIikKICAgfQogCiAgIGlmIChpc19hbmRyb2lkICYmICFpc19kZWJ1ZykgewpkaWZmIC0tZ2l0IGEvc2tpYS9jb25maWcvU2tVc2VyQ29uZmlnLmggYi9za2lhL2NvbmZpZy9Ta1VzZXJDb25maWcuaAppbmRleCBlMDlhMjM1Li5iYjk4NjJiIDEwMDY0NAotLS0gYS9za2lhL2NvbmZpZy9Ta1VzZXJDb25maWcuaAorKysgYi9za2lhL2NvbmZpZy9Ta1VzZXJDb25maWcuaApAQCAtMjM1LDcgKzIzNSw3IEBACiAjZGVmaW5lIFNLX1NVUFBPUlRfTEVHQUNZX0VWQUxfQ1VCSUMKICNlbmRpZgogCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEltcG9ydGVkIGZyb20gQlVJTEQuZ24gYW5kIHNraWFfY29tbW9uLmd5cGkKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSW1wb3J0ZWQgZnJvbSBCVUlMRC5nbgogCiAvKiBJbiBzb21lIHBsYWNlcyBTa2lhIGNhbiB1c2Ugc3RhdGljIGluaXRpYWxpemVycyBmb3IgZ2xvYmFsIGluaXRpYWxpemF0aW9uLAogICogIG9yIGZhbGwgYmFjayB0byBsYXp5IHJ1bnRpbWUgaW5pdGlhbGl6YXRpb24uIENocm9tZSBhbHdheXMgd2FudHMgdGhlIGxhdHRlci4KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvREVQUyBiL3Rlc3RpbmcvREVQUwppbmRleCA1YWRlYjQxLi5kMGRjMTcyIDEwMDY0NAotLS0gYS90ZXN0aW5nL0RFUFMKKysrIGIvdGVzdGluZy9ERVBTCkBAIC0xLDYgKzEsOCBAQAogaW5jbHVkZV9ydWxlcyA9IFsKICAgJytjb3JlJywKKyAgJytmcGRmc2RrJywKICAgJytmeGpzJywKICAgJytwdWJsaWMnLAogICAnK3Y4JywKKyAgJyt4ZmEnCiBdCmRpZmYgLS1naXQgYS90ZXN0aW5nL1NVUFBSRVNTSU9OUyBiL3Rlc3RpbmcvU1VQUFJFU1NJT05TCmluZGV4IDQ0N2M5ZmEuLjFlZGMxNTggMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvU1VQUFJFU1NJT05TCisrKyBiL3Rlc3RpbmcvU1VQUFJFU1NJT05TCkBAIC0xOSwxMSArMTksNiBAQAogIyBUcnkgdG8ga2VlcCB0aGUgZmlsZSBhbHBoYWJldGl6ZWQgd2l0aGluIGVhY2ggY2F0ZWdvcnkgb2YgdGVzdC4KIAogIwotIyBQaXhlbCB0ZXN0cwotIwotZm9udF9zaXplLmluIG1hYyAqICoKLQotIwogIyBDb3JwdXMgdGVzdHMKICMKIDA1MF9leHRyYV9tLnBkZiBtYWMsd2luICogKgpAQCAtNTAsMjE5ICs0NSwyOCBAQAogOC4yX25hbWVfZGVzdF9mX2Rlc3QucGRmIG1hYyAqICoKIDguMl9vdXRsaW5lLnBkZiBtYWMgKiAqCiA4LjNfcHJlc2VudGF0aW9uLnBkZiBtYWMgKiAqCi1GUkNfMTBfOC4yLjJfUHJldl9yZW1vdmVfYWxsLnBkZiBtYWMgKiAqCiBGUkNfMTBfOC4yLjJfX1Q4LjNfb3JpZ2luYWxfZmlsZS5wZGYgKiAqICoKLUZSQ18xMF84LjIuNF9WaWV3X0MucGRmIG1hYyAqICoKLUZSQ18xMF84LjIuNF9fcmVtb3ZlX01vZERhdGVfdmFsdWUucGRmIG1hYyAqICoKLUZSQ18xMV84LjIuMl9QcmV2X3JlbW92ZV9vYmoucGRmIG1hYyAqICoKIEZSQ18xMV84LjIuMl9fVDguM19maXJzdF9sYXN0X2V4Y2hhbmdlLnBkZiAqICogKgotRlJDXzExXzguMi40X1ZpZXdfZWRpdC5wZGYgbWFjICogKgotRlJDXzExXzguMi40X19yZW1vdmVfTW9kRGF0ZV9hbGwucGRmIG1hYyAqICoKLUZSQ18xMl84LjIuMl9fTmV4dF9yZW1vdmVfdmFsdWUucGRmIG1hYyAqICoKIEZSQ18xMl84LjIuMl9fVDguM19maXJzdF9vdXRsaW5lX29ial9JRC5wZGYgKiAqICoKLUZSQ18xMl84LjIuNF9WaWV3X3JlbW92ZV9hbGwucGRmIG1hYyAqICoKLUZSQ18xMl84LjIuNF9fcmVtb3ZlX01vZERhdGVfb2JqXy5wZGYgbWFjICogKgotRlJDXzEzXzguMi4yX19OZXh0X3JlbW92ZV9hbGwucGRmIG1hYyAqICoKIEZSQ18xM184LjIuMl9fVDguM19Db3VudF9lZGl0MzAwLnBkZiAqICogKgotRlJDXzEzXzguMi40X1ZpZXdfcmVtb3ZlX3ZhbHVlLnBkZiBtYWMgKiAqCi1GUkNfMTNfOC4yLjRfcmVtb3ZlX1NpemVfdmFsdWUucGRmIG1hYyAqICoKLUZSQ18xNF84LjIuMl9fTmV4dF9yZW1vdmVfb2JqLnBkZiBtYWMgKiAqCiBGUkNfMTRfOC4yLjJfX1Q4LjNfQ291bnRfZWRpdDAucGRmICogKiAqCi1GUkNfMTRfOC4yLjRfU29ydF9yZW1vdmVfYWxsLnBkZiBtYWMgKiAqCi1GUkNfMTRfOC4yLjRfcmVtb3ZlX1NpemVfYWxsLnBkZiBtYWMgKiAqCi1GUkNfMTVfOC4yLjJfX05leHRfZXhjaGFuZ2UucGRmIG1hYyAqICoKIEZSQ18xNV84LjIuMl9fVDguM19Db3VudF9lZGl0MS5wZGYgKiAqICoKLUZSQ18xNV84LjIuNF9Tb3J0X3JlbW92ZV92YWx1ZS5wZGYgbWFjICogKgotRlJDXzE1XzguMi40X3JlbW92ZV9TaXplX29iai5wZGYgbWFjICogKgotRlJDXzE2XzguMi4yX19OZXh0X2FkZC5wZGYgbWFjICogKgogRlJDXzE2XzguMi4yX19UOC4zX0NvdW50X2VkaXRfMS5wZGYgKiAqICoKLUZSQ18xNl84LjIuNF9fcmVtb3ZlX0NvbXByZXNzZWRTaXplX192YWx1ZS5wZGYgbWFjICogKgotRlJDXzE3XzguMi4yX19UOC40X0ZpcnN0X3JlbW92ZV92YWx1ZS5wZGYgbWFjICogKgotRlJDXzE3XzguMi40X19yZW1vdmVfQ29tcHJlc3NlZFNpemVfX2FsbC5wZGYgbWFjICogKgotRlJDXzE4XzguMi4yX19UOC40X0ZpcnN0X3JlbW92ZV9hbGwucGRmIG1hYyAqICoKLUZSQ18xOF84LjIuNF9fcmVtb3ZlX0NvbXByZXNzZWRTaXplX19vYmoucGRmIG1hYyAqICoKLUZSQ18xOV84LjIuMl9fVDguNF9GaXJzdF9yZW1vdmVfb2JqLnBkZiBtYWMgKiAqCi1GUkNfMTlfOC4yLjRfX3JlbW92ZV9DcmVhdGlvbkRhdGVfdmFsdWUucGRmIG1hYyAqICoKIEZSQ18xXzguMi4yX19UOC4zX0ZpcnN0X2VtcHR5LnBkZiAqICogKgotRlJDXzFfOC4yLjJfX1RpdGxlX2VkaXQucGRmIG1hYyAqICoKLUZSQ18xXzguMi40X1R5cGVfOC42Xy5wZGYgbWFjICogKgotRlJDXzFfOC4yLjRfX29yaWdpbmFsLnBkZiBtYWMgKiAqCi1GUkNfMjBfOC4yLjJfX1Q4LjRfRmlyc3RfcmVtb3ZlX3ZhbHVlMi5wZGYgbWFjICogKgotRlJDXzIwXzguMi40X19yZW1vdmVfQ3JlYXRpb25EYXRlX2FsbC5wZGYgbWFjICogKgotRlJDXzIxXzguMi4yX19UOC40X0ZpcnN0X3JlbW92ZV9hbGwyLnBkZiBtYWMgKiAqCi1GUkNfMjFfOC4yLjRfX3JlbW92ZV9DcmVhdGlvbkRhdGVfb2JqLnBkZiBtYWMgKiAqCi1GUkNfMjJfOC4yLjJfX1Q4LjRfRmlyc3RfcmVtb3ZlX29iajIucGRmIG1hYyAqICoKLUZSQ18yMl84LjIuNF9fcmVtb3ZlX09yZGVyX3ZhbHVlLnBkZiBtYWMgKiAqCi1GUkNfMjNfOC4yLjJfX1Q4LjRfTGFzdF9yZW1vdmVfdmFsdWUucGRmIG1hYyAqICoKLUZSQ18yM184LjIuNF9fcmVtb3ZlX09yZGVyX2FsbC5wZGYgbWFjICogKgotRlJDXzI0XzguMi4yX19UOC40X0xhc3RfcmVtb3ZlX2FsbC5wZGYgbWFjICogKgotRlJDXzI0XzguMi40X19yZW1vdmVfT3JkZXJfb2JqLnBkZiBtYWMgKiAqCi1GUkNfMjVfOC4yLjJfX1Q4LjRfTGFzdF9yZW1vdmVfb2JqLnBkZiBtYWMgKiAqCi1GUkNfMjZfOC4yLjJfX1Q4LjRfTGFzdF9yZW1vdmVfdmFsdWUyLnBkZiBtYWMgKiAqCi1GUkNfMjdfOC4yLjJfX1Q4LjRfTGFzdF9yZW1vdmVfYWxsMi5wZGYgbWFjICogKgotRlJDXzI4XzguMi4yX19UOC40X0xhc3RfcmVtb3ZlX29iajIucGRmIG1hYyAqICoKLUZSQ18yOV84LjIuMl9fVDguNF9GaXJzdF9MYXN0X2V4Y2hhbmdlLnBkZiBtYWMgKiAqCiBGUkNfMl84LjIuMl9fVDguM19MYXN0X2VtcHR5LnBkZiAqICogKgotRlJDXzJfOC4yLjJfX1RpdGxlX3JlbW92ZV92YWx1ZS5wZGYgbWFjICogKgotRlJDXzJfOC4yLjRfVHlwZV84LjZfX3JlbW92ZV92YWx1ZS5wZGYgbWFjICogKgotRlJDXzJfOC4yLjRfX2FkZF90eXBlXy5wZGYgbWFjICogKgotRlJDXzMuNV9BdXRoRXZlbnRfRUZPcGVuLnBkZiBtYWMgKiAqCi1GUkNfMy41X0NGTV9BRVNWMl9fRW5jcnlwdE1ldGFkYXRhX0YucGRmIG1hYyAqICoKLUZSQ18zLjVfQ0ZfRUZGX1N0ZENGX1N0cmZfU3RtZl9JZGVudGl0eS5wZGYgbWFjICogKgotRlJDXzMuNV9DRl9TdHJmX3N0bWZfU3RkQ0YucGRmIG1hYyAqICoKLUZSQ18zLjVfRW5jcnlwdE1ldGFkYXRhX05vbmUucGRmIG1hYyAqICoKLUZSQ18zLjVfUF80X1Bhc3N3b3JkXzEucGRmIG1hYyAqICoKLUZSQ18zLjVfUF9fMTg1Ml9QYXNzd29yZF8xLnBkZiBtYWMgKiAqCi1GUkNfMy41X1BfXzI1ODRfUGFzc3dvcmRfMS5wZGYgbWFjICogKgotRlJDXzMuNV9QX18yNjE2X1Bhc3N3b3JkXzEucGRmIG1hYyAqICoKLUZSQ18zLjVfUF9fMjg4MF9QYXNzd29yZF8xLnBkZiBtYWMgKiAqCi1GUkNfMy41X1BfXzMzNzZfUGFzc3dvcmRfMS5wZGYgbWFjICogKgotRlJDXzMuNV9QX18zMzkyX1Bhc3N3b3JkXzEucGRmIG1hYyAqICoKLUZSQ18zLjVfUF9fMzYwOF9QYXNzd29yZF8xLnBkZiBtYWMgKiAqCi1GUkNfMy41X1BfXzM2MTZfUGFzc3dvcmRfMS5wZGYgbWFjLHdpbiAqICoKLUZSQ18zLjVfUF9fMzY0OF9QYXNzd29yZF8xLnBkZiBtYWMgKiAqCi1GUkNfMy41X1BfXzM5MDBfUGFzc3dvcmRfMS5wZGYgbWFjICogKgotRlJDXzMuNV9WXzRfQ0ZNX1YyXy5wZGYgbWFjICogKgotRlJDXzMuNV9WXzVfQ0ZNX0FFU1YzLnBkZiBtYWMgKiAqCi1GUkNfMy41X3ZfMV9sZW5ndGhfNDBfRmlsdGVyX3N0YW5kYXJkLnBkZiBtYWMgKiAqCi1GUkNfMy41X3ZfMl9sZW5ndGhfMTI4X0F1dGhFdmVudF9Eb2NPcGVuXy5wZGYgbWFjICogKgotRlJDXzMxXzguMi4yX2FkZF9kZXN0X2VudHJ5LnBkZiBtYWMgKiAqCi1GUkNfMzJfOC4yLjJfQV9TdXBwb3J0X2FjdGlvbi5wZGYgbWFjICogKgotRlJDXzMzXzguMi4yX0FfZW1wdHkucGRmIG1hYyAqICoKLUZSQ18zNF84LjIuMl9BX3JlbW92ZS5wZGYgbWFjICogKgotRlJDXzM1XzguMi4yX0FfcmVtb3ZlX0FfaXRlbS5wZGYgbWFjICogKgotRlJDXzM2XzguMi4yX0Rlc3QucGRmIG1hYyAqICoKLUZSQ18zN184LjIuMl9EZXN0X2VtcHR5LnBkZiBtYWMgKiAqCi1GUkNfMzhfOC4yLjJfRGVzdF9yZW1vdmUucGRmIG1hYyAqICoKLUZSQ18zOV84LjIuMl9DX2VkaXQucGRmIG1hYyAqICoKK0ZSQ18zLjVfUF9fMzYxNl9QYXNzd29yZF8xLnBkZiAqICogKgogRlJDXzNfOC4yLjJfVHlwZV9lbXB0eS5wZGYgKiAqICoKLUZSQ18zXzguMi4yX19UaXRsZV9yZW1vdmVfYWxsLnBkZiBtYWMgKiAqCi1GUkNfM184LjIuNF9UeXBlXzguNl9fZWRpdF8ucGRmIG1hYyAqICoKLUZSQ18zXzguMi40X19hZGRfdHlwZV92YWx1ZS5wZGYgbWFjICogKgotRlJDXzQuNS4zX0RldmljZUNNWUtfay5wZGYgbWFjICogKgotRlJDXzQuNS4zX0RldmljZUdyYXlfZy5wZGYgbWFjICogKgotRlJDXzQuNS4zX0RldmljZVJHQl9yZy5wZGYgbWFjICogKgotRlJDXzQuNS40X0NhbEdyYXlfZ2FtbWEucGRmIG1hYyAqICoKLUZSQ180LjUuNF9DYWxHcmF5X3doaXRlcG9pbnQucGRmIG1hYyAqICoKLUZSQ180LjUuNF9DYWxSR0JfZ2FtbWEucGRmIG1hYyAqICoKLUZSQ180LjUuNF9DYWxSR0JfbWF0cml4LnBkZiBtYWMgKiAqCi1GUkNfNC41LjRfQ2FsUkdCX3doaXRlcG9pbnQucGRmIG1hYyAqICoKLUZSQ180LjUuNF9JQ0NCYXNlZC5wZGYgbWFjICogKgotRlJDXzQuNS40X0xhYi5wZGYgbWFjICogKgotRlJDXzQuNS40X1JJX0Fic29sdXRlLnBkZiBtYWMgKiAqCi1GUkNfNC41LjRfUklfUGVyY2VwdHVhbC5wZGYgbWFjICogKgotRlJDXzQuNS40X1JJX1JlbGF0aXZlLnBkZiBtYWMgKiAqCi1GUkNfNC41LjRfUklfU2F0dXJhdGlvbi5wZGYgbWFjICogKgotRlJDXzQuNS40X1NlcGFyYXRpb24ucGRmIG1hYyAqICoKLUZSQ180LjUuNV9EZXZpY2VOLnBkZiBtYWMgKiAqCi1GUkNfNC41LjVfSW5kZXhlZC5wZGYgbWFjICogKgotRlJDXzQuNS41X1BhdHRlcm5fdGlsaW5nLnBkZiBtYWMgKiAqCi1GUkNfNDBfOC4yLjJfQ19lbXB0eTEucGRmIG1hYyAqICoKLUZSQ180MV84LjIuMl9DX2VtcHR5Mi5wZGYgbWFjICogKgotRlJDXzQyXzguMi4yX0NfZW1wdHkzLnBkZiBtYWMgKiAqCi1GUkNfNDNfOC4yLjJfQ19lbXB0eS5wZGYgbWFjICogKgotRlJDXzQ0XzguMi4yX0NfcmVtb3ZlLnBkZiBtYWMgKiAqCi1GUkNfNDVfOC4yLjJfRl9lZGl0X0ZfMV8yXzMucGRmIG1hYyAqICoKLUZSQ180Nl84LjIuMl9GX2VkaXRfRl9fMV9fMl9fMy5wZGYgbWFjICogKgotRlJDXzQ3XzguMi4yX0ZfZWRpdF9GXzMyX18zMi5wZGYgbWFjICogKgotRlJDXzQ4XzguMi4yX0ZfZWRpdF9GXzEwMF9fMTAwLnBkZiBtYWMgKiAqCi1GUkNfNDlfOC4yLjJfRl9lbXB0eS5wZGYgbWFjICogKgotRlJDXzRfOC4yLjJfUGFyZW50X2VkaXQyLnBkZiBtYWMgKiAqCiBGUkNfNF84LjIuMl9fVDguM19Db3VudF9lbXB0eS5wZGYgKiAqICoKLUZSQ180XzguMi40X1NjaGVtYV84LjZfX3JlbW92ZV9hbGwucGRmIG1hYyAqICoKLUZSQ180XzguMi40X19yZW1vdmVfRmlsZU5hbWVfdmFsdWUucGRmIG1hYyAqICoKLUZSQ181MF84LjIuMl9GX3JlbW92ZS5wZGYgbWFjICogKgotRlJDXzUxXzguMi4yX1RfOC40X19Db3VudF9lZGl0X2NvdW50XzEwMC5wZGYgbWFjICogKgotRlJDXzUyXzguMi4yX1RfOC40X19Db3VudF9lZGl0X2NvdW50XzAucGRmIG1hYyAqICoKLUZSQ181M184LjIuMl9UXzguNF9fQ291bnRfZW1wdHkucGRmIG1hYyAqICoKLUZSQ181NF84LjIuMl9UXzguNF9fQ291bnRfZW1wdHkxLnBkZiBtYWMgKiAqCi1GUkNfNTVfOC4yLjJfVF84LjRfX0NvdW50X3JlbW92ZS5wZGYgbWFjICogKgotRlJDXzU2XzguMi4yX0NfZWRpdF9DX18xLnBkZiBtYWMgKiAqCi1GUkNfNTdfOC4yLjJfQ19lZGl0X0NfMi5wZGYgbWFjICogKgotRlJDXzU4XzguMi4yX0NvdW50X2VkaXRfY291bnRfXzIucGRmIG1hYyAqICoKLUZSQ181XzguMi4yX1BhcmVudF9yZW1vdmVfdmFsdWUucGRmIG1hYyAqICoKIEZSQ181XzguMi4yX19UOC4zX0ZpcnN0X3JlbW92ZS5wZGYgKiAqICoKLUZSQ181XzguMi40X1NjaGVtYV84LjZfX3JlbW92ZV92YWx1ZS5wZGYgbWFjICogKgotRlJDXzVfOC4yLjRfX3JlbW92ZV9GaWxlTmFtZV9hbGwucGRmIG1hYyAqICoKLUZSQ182XzguMi4yX1BhcmVudF9yZW1vdmVfYWxsLnBkZiBtYWMgKiAqCiBGUkNfNl84LjIuMl9fVDguM19MYXN0X3JlbW92ZS5wZGYgKiAqICoKLUZSQ182XzguMi40X1NjaGVtYV84LjZfX3JlbW92ZV9vYmoucGRmIG1hYyAqICoKLUZSQ182XzguMi40X19yZW1vdmVfRmlsZU5hbWVfb2JqLnBkZiBtYWMgKiAqCi1GUkNfN184LjIuMl9QYXJlbnRfcmVtb3ZlX29iai5wZGYgbWFjICogKgogRlJDXzdfOC4yLjJfVHlwZV9yZW1vdmUucGRmICogKiAqCi1GUkNfN184LjIuNF9WaWV3X0gucGRmIG1hYyAqICoKLUZSQ183XzguMi40X19yZW1vdmVfRGVzY3JpcHRpb25fdmFsdWUucGRmIG1hYyAqICoKLUZSQ184LjQuMV9Bbm5vdGF0aW9uc19BUF9OXy5wZGYgbWFjICogKgotRlJDXzguNC4xX0Fubm90YXRpb25zX0FQX05fUi5EXy5wZGYgbWFjICogKgotRlJDXzguNC4xX0Fubm90YXRpb25zX0FQX05fUl8ucGRmIG1hYyAqICoKLUZSQ184LjQuMV9Bbm5vdGF0aW9uc19BU19PZmZfLnBkZiBtYWMgKiAqCi1GUkNfOC40LjFfQW5ub3RhdGlvbnNfQVNfWWVzXy5wZGYgbWFjICogKgotRlJDXzguNC4xX0Fubm90YXRpb25zX0JvcmRlci5wZGYgbWFjICogKgotRlJDXzguNC4xX0Fubm90YXRpb25zX0MucGRmIG1hYyAqICoKIEZSQ184LjQuMV9Bbm5vdGF0aW9uc19NLnBkZiAqICogKgotRlJDXzguNC4xX0Fubm90YXRpb25zX01fdGV4dF9zdHJpbmdfLnBkZiBtYWMgKiAqCiBGUkNfOC40LjFfQW5ub3RhdGlvbnNfTk0ucGRmICogKiAqCi1GUkNfOC40LjFfQW5ub3RhdGlvbnNfUC5wZGYgbWFjICogKgotRlJDXzguNC4xX0Fubm90YXRpb25zX1JlY3QucGRmIG1hYyAqICoKLUZSQ184LjQuMV9Bbm5vdGF0aW9uc19UeXBlLnBkZiBtYWMgKiAqCi1GUkNfOC40LjJfQW5ub3RhdGlvbl9GbGFnc19GX0hpZGRlbi5wZGYgbWFjICogKgotRlJDXzguNC4yX0Fubm90YXRpb25fRmxhZ3NfRl9JbnZpc2libGUucGRmIG1hYyAqICoKLUZSQ184LjQuMl9Bbm5vdGF0aW9uX0ZsYWdzX0ZfTG9ja2VkLnBkZiBtYWMgKiAqCi1GUkNfOC40LjJfQW5ub3RhdGlvbl9GbGFnc19GX0xvY2tlZENvbnRlbnRzLnBkZiBtYWMgKiAqCi1GUkNfOC40LjJfQW5ub3RhdGlvbl9GbGFnc19GX05vUm90YXRlLnBkZiBtYWMgKiAqCi1GUkNfOC40LjJfQW5ub3RhdGlvbl9GbGFnc19GX05vVmlldy5wZGYgbWFjICogKgotRlJDXzguNC4yX0Fubm90YXRpb25fRmxhZ3NfRl9Ob1pvb20ucGRmIG1hYyAqICoKLUZSQ184LjQuMl9Bbm5vdGF0aW9uX0ZsYWdzX0ZfUHJpbnQucGRmIG1hYyAqICoKLUZSQ184LjQuMl9Bbm5vdGF0aW9uX0ZsYWdzX0ZfUmVhZE9ubHkucGRmIG1hYyAqICoKLUZSQ184LjQuMl9Bbm5vdGF0aW9uX0ZsYWdzX0ZfVG9nZ2xlTm9WaWV3LnBkZiBtYWMgKiAqCi1GUkNfOC40LjNfQm9yZGVyX1N0eXBlc19EX2RpZmZlcmVudF92YWx1ZXMucGRmIG1hYyAqICoKLUZSQ184LjQuM19Cb3JkZXJfU3R5cGVzX0RfcmVtb3ZlLnBkZiBtYWMgKiAqCi1GUkNfOC40LjNfQm9yZGVyX1N0eXBlc19JX2RpZmZlcmVudF92YWx1ZXMucGRmIG1hYyAqICoKLUZSQ184LjQuM19Cb3JkZXJfU3R5cGVzX0lfcmVtb3ZlLnBkZiBtYWMgKiAqCi1GUkNfOC40LjNfQm9yZGVyX1N0eXBlc19TX2RpZmZlcmVudF92YWx1ZXNfQkVfLnBkZiBtYWMgKiAqCi1GUkNfOC40LjNfQm9yZGVyX1N0eXBlc19TX2RpZmZlcmVudF92YWx1ZXNfQlNfLnBkZiBtYWMgKiAqCi1GUkNfOC40LjNfQm9yZGVyX1N0eXBlc19TX25vdF9leGlzdF9CU18ucGRmIG1hYyAqICoKLUZSQ184LjQuM19Cb3JkZXJfU3R5cGVzX1NfcmVtb3ZlX0JFXy5wZGYgbWFjICogKgotRlJDXzguNC4zX0JvcmRlcl9TdHlwZXNfU19yZW1vdmVfQlNfLnBkZiBtYWMgKiAqCi1GUkNfOC40LjNfQm9yZGVyX1N0eXBlc19UeXBlX2FkZC5wZGYgbWFjICogKgotRlJDXzguNC4zX0JvcmRlcl9TdHlwZXNfVHlwZV9ub3RfZXhpc3RfZGVmYXVsdF8ucGRmIG1hYyAqICoKLUZSQ184LjQuM19Cb3JkZXJfU3R5cGVzX1dfZGlmZmVyZW50X3ZhbHVlcy5wZGYgbWFjICogKgotRlJDXzguNC4zX0JvcmRlcl9TdHlwZXNfV19yZW1vdmUucGRmIG1hYyAqICoKLUZSQ184LjVfQmxfSGlkZS5wZGYgbWFjICogKgotRlJDXzguNV9DYXRhbG9nX09wZW5BY3Rpb24ucGRmIG1hYyAqICoKLUZSQ184LjVfQ2F0YWxvZ19XQy5wZGYgbWFjICogKgotRlJDXzguNV9EUC5wZGYgbWFjICogKgotRlJDXzguNV9EUy5wZGYgbWFjICogKgotRlJDXzguNV9FX0dvVG9fRC5wZGYgbWFjICogKgotRlJDXzguNV9Gb19VUklfQmFzZS5wZGYgbWFjICogKgotRlJDXzguNV9MaW5rX1VSTC5wZGYgbWFjICogKgotRlJDXzguNV9PdXRsaW5lX0EucGRmIG1hYyAqICoKIEZSQ184LjVfUGFnZV9DX1N1Ym1pdEZvcm0ucGRmICogKiAqCi1GUkNfOC41X1BhZ2VfT19VUkkucGRmIG1hYyAqICoKIEZSQ184LjVfUGFnZV9QSV9SZXNldEZvcm1fUGhhbnRvbS5wZGYgKiAqICoKLUZSQ184LjVfUGFnZV9QVl9OYW1lZF9QaGFudG9tLnBkZiBtYWMgKiAqCi1GUkNfOC41X1NjcmVlbl9Gb19KYXZhU2NyaXB0LnBkZiBtYWMgKiAqCi1GUkNfOC41X1NjcmVlbl9JbWdfRF9MYXVuY2gucGRmIG1hYyAqICoKLUZSQ184LjVfU2NyZWVuX1JlbmRpdGlvbi5wZGYgbWFjICogKgotRlJDXzguNV9VUklfSXNNYXAucGRmIG1hYyAqICoKLUZSQ184LjVfVV9Hb1RvUl9OZXdXaW5kb3cucGRmIG1hYyAqICoKLUZSQ184LjVfVV9Hb1RvUl9OZXdXaW5kb3dfMi5wZGYgbWFjICogKgotRlJDXzguNV9XUC5wZGYgbWFjICogKgotRlJDXzguNV9XUy5wZGYgbWFjICogKgotRlJDXzguNV9XaWRnZXRfQy5wZGYgbWFjICogKgotRlJDXzguNV9XaWRnZXRfRi5wZGYgbWFjICogKgogRlJDXzguNV9XaWRnZXRfRi5wZGYgKiBub3Y4ICoKLUZSQ184LjVfV2lkZ2V0X0sucGRmIG1hYyAqICoKLUZSQ184LjVfV2lkZ2V0X1YucGRmIG1hYyAqICoKLUZSQ184LjVfWF9Hb1RvUl9ELnBkZiBtYWMgKiAqCi1GUkNfOF84LjIuMl9QYXJlbnRfZWRpdC5wZGYgbWFjICogKgogRlJDXzhfOC4yLjJfX1Q4LjNfQ291bnRfcmVtb3ZlLnBkZiAqICogKgotRlJDXzhfOC4yLjRfVmlld19ELnBkZiBtYWMgKiAqCi1GUkNfOF84LjIuNF9fcmVtb3ZlX19EZXNjcmlwdGlvbl9hbGwucGRmIG1hYyAqICoKLUZSQ185XzguMi4yX1ByZXZfcmVtb3ZlX3ZhbHVlLnBkZiBtYWMgKiAqCiBGUkNfOV84LjIuMl9fVDguM19yZW1vdmVfZmlyc3RfaXRlbS5wZGYgKiAqICoKLUZSQ185XzguMi40X1ZpZXdfVC5wZGYgbWFjICogKgotRlJDXzlfOC4yLjRfX3JlbW92ZV9fRGVzY3JpcHRpb25fb2JqLnBkZiBtYWMgKiAqCiBhY3Rpb24ucGRmICogKiAqCiBhY3Rpb25fZXhlY3V0ZV9hX21lbnVfaXRlbS5wZGYgbWFjICogKgogYWN0aW9uX2hpZGVfc2hvd19mb3JtLnBkZiBtYWMgKiAqCkBAIC0yODgsOCArOTIsNiBAQAogYm9va21hcmtnZXRjb2xvci5wZGYgbWFjICogKgogYnVnXzBfbGVuZ3RoX2xpbmUucGRmIG1hYyAqICoKIGJ1Z18wX3dpZHRoX2xpbmUucGRmIG1hYyAqICoKLWJ1Z180MzQucGRmICogKiBub3hmYQotYnVnXzQzNC5wZGYgd2luICogeGZhCiBidWdfNDQwMTMyLnBkZiBtYWMgKiAqCiBidWdfd2hpdGVfc3BhY2UucGRmIG1hYyAqICoKIGNhbGNvcmRlcmluZGV4X3Rlc3QucGRmICogKiAqCkBAIC0zMzAsMTIgKzEzMiwxMiBAQAogZXhhbXBsZV8wMDcucGRmIG1hYyAqICoKIGV4YW1wbGVfMDA4LnBkZiBtYWMgKiAqCiBleGFtcGxlXzAwOS5wZGYgbWFjICogKgotZXhhbXBsZV8wMTAucGRmIG1hYyx3aW4gKiAqCitleGFtcGxlXzAxMC5wZGYgbWFjICogKgogZXhhbXBsZV8wMTEucGRmIG1hYyAqICoKIGV4YW1wbGVfMDEyLnBkZiBtYWMgKiAqCiBleGFtcGxlXzAxMy5wZGYgbWFjICogKgogZXhhbXBsZV8wMTQucGRmIG1hYyAqICoKLWV4YW1wbGVfMDE1LnBkZiBtYWMsd2luICogKgorZXhhbXBsZV8wMTUucGRmIG1hYyAqICoKIGV4YW1wbGVfMDE2LnBkZiBtYWMgKiAqCiBleGFtcGxlXzAxNy5wZGYgbWFjICogKgogZXhhbXBsZV8wMTgucGRmIG1hYyAqICoKQEAgLTM0Myw3ICsxNDUsNyBAQAogZXhhbXBsZV8wMjAucGRmIG1hYyAqICoKIGV4YW1wbGVfMDIxLnBkZiBtYWMgKiAqCiBleGFtcGxlXzAyMi5wZGYgbWFjICogKgotZXhhbXBsZV8wMjMucGRmIG1hYyx3aW4gKiAqCitleGFtcGxlXzAyMy5wZGYgbWFjICogKgogZXhhbXBsZV8wMjQucGRmIG1hYyAqICoKIGV4YW1wbGVfMDI1LnBkZiBtYWMgKiAqCiBleGFtcGxlXzAyNi5wZGYgbWFjICogKgpAQCAtMzczLDcgKzE3NSw3IEBACiBleGFtcGxlXzA1MC5wZGYgbWFjICogKgogZXhhbXBsZV8wNTEucGRmIG1hYyAqICoKIGV4YW1wbGVfMDUyLnBkZiBtYWMgKiAqCi1leGFtcGxlXzA1My5wZGYgbWFjLHdpbiAqICoKK2V4YW1wbGVfMDUzLnBkZiBtYWMgKiAqCiBleGFtcGxlXzA1NC5wZGYgbWFjICogKgogZXhhbXBsZV8wNTUucGRmIG1hYyx3aW4gKiAqCiBleGFtcGxlXzA1Ni5wZGYgbWFjICogKgpAQCAtNDg0LDI5ICsyODYsMzggQEAKIHpoX2Z1bmN0aW9uX2xpc3QucGRmIG1hYyAqICoKIHpoX3NoYXJlZF9kb2N1bWVudC5wZGYgbWFjICogKgogCi1idWdfNjc5NjQzLmluICogKiBub3hmYQotYnVnXzY3OTY0Mi5pbiAqICogbm94ZmEKKyMgVE9ETyhobmFrYXNoaW1hKTogVGhlc2UgbWlnaHQgbmV2ZXIgaGF2ZSBiZWVuIHJ1bi4gR28gb3ZlciB0aGVtIGFuZCBmaXguCiAKLSMjIyBUT0RPKGRzaW5jbGFpcik6IFRoZXNlIG5lZWQgdG8gYmUgZml4ZWQgLi4uLgotVGVzdF9EYXRlRmllbGRfbG9jYWxlX2VuX0NBLnBkZiBhc2FuICogKgotVGVzdF9EYXRlRmllbGRfbG9jYWxlX2VuX0dCLnBkZiBhc2FuICogKgotVGVzdF9EYXRlRmllbGRfbG9jYWxlX2VuX1VTLnBkZiBhc2FuICogKgotVGVzdF9EYXRlRmllbGRfbG9jYWxlX2ZyX0NBLnBkZiBhc2FuICogKgotVGVzdF9EYXRlRmllbGRfbG9jYWxlX2ZyX0ZSLnBkZiBhc2FuICogKgotVGVzdF9EYXRlRmllbGRfbG9jYWxlX25sX05MLnBkZiBhc2FuICogKgotVGVzdF9EYXRlRmllbGRfbG9jYWxlX3poX0NOLnBkZiBhc2FuICogKgotVGVzdF9EYXRlRmllbGRfbG9jYWxlX3poX0hLLnBkZiBhc2FuICogKgotVGVzdF9QYXNzd29yZEZpZWxkLnBkZiBhc2FuICogKgotZm9ybWF0X2N1c3RvbV9mb3JtYXQucGRmIGFzYW4gKiAqCitGUkNfOC41X0UmWC5wZGYgKiAqICoKK0ZSQ184LjVfTyZQT19Hb1RvRS5wZGYgKiAqICoKK0ZSQ184LjVfT3BlbkFjdGlvbiZPX1VSSS5wZGYgKiAqICoKK0ZSQ184LjVfUEMmQ19Hb1RvRV9UX1QucGRmICogKiAqCitGUkNfOC41X1BDX0dvVG9FX1RfUiZQJkEucGRmICogKiAqCitGUkNfOC41X1BPX0dvVG9FX1RfUiZOLnBkZiAqICogKgogCi0jCiAjIHhmYV9zcGVjaWZpYwotIworCiBDaG9vc2UucGRmICogKiAqCiBkYXRhX2JpbmRpbmcucGRmICogKiAqCiBEYXRlX0Zvcm1DYWxlLnBkZiAqICogKgorIyBUT0RPKG5wbSk6IEFkZCBwcm9wZXIgZXZ0IGZvciBNb3VzZUV2ZW50cy4KK01vdXNlRXZlbnRzX2VudGVyLnBkZiAqICogKgorTW91c2VFdmVudHNfZXhpdC5wZGYgKiAqICoKK09uZW9mMy5wZGYgKiAqICoKIFN1bS5wZGYgKiAqICoKIFRpbWVGaWVsZC5wZGYgd2luLGxpbnV4ICogKgogVGVzdF9DaGVja0JveC5wZGYgKiAqICoKIFRlc3RfRGF0ZUZpZWxkX2xvY2FsZV96aF9ISy5wZGYgbWFjLHdpbiAqICoKIAorIworIyBKYXZhU2NyaXB0IHRlc3RzCisjCitidWdfNjc5NjQyLmluICogKiBub3hmYQorYnVnXzY3OTY0My5pbiAqICogbm94ZmEKK2J1Z183MzU5MTIuaW4gKiAqIG5veGZhCisKKyMKKyMgUGl4ZWwgdGVzdHMKKyMKK2J1Z180OTIuaW4gKiBub3Y4ICoKKwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9TVVBQUkVTU0lPTlNfSU1BR0VfRElGRiBiL3Rlc3RpbmcvU1VQUFJFU1NJT05TX0lNQUdFX0RJRkYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiMmQ2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvU1VQUFJFU1NJT05TX0lNQUdFX0RJRkYKQEAgLTAsMCArMSwzMiBAQAorIyBDb3B5cmlnaHQgMjAxNyBUaGUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKyMgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKyMKKyMgTGlzdCBvZiB0ZXN0cyB0byBoYXZlIGltYWdlIGRpZmYgdGVzdHMgc2tpcHBlZCwgb25lIHBlciBsaW5lLgorIyBUaGVyZSBhcmUgZm91ciBzcGFjZS1zZXBhcmF0ZWQgY29sdW1ucyBwZXIgbGluZQorIyBFYWNoIGNvbHVtbiAoZXhjZXB0IGNvbHVtbiAwKSBjYW4gY29udGFpbiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHZhbHVlcy4KKyMKKyMgQ29sdW1uIDA6IHRlc3QgZmlsZSBuYW1lCisjIENvbHVtbiAxOiBwbGF0Zm9ybTogKiwgd2luLCBtYWMsIGxpbnV4CisjIENvbHVtbiAyOiB2OCBzdXBwb3J0OiAqLCBub3Y4LCB2OAorIyBDb2x1bW4gMzogeGZhIHN1cHBvcnQ6ICosIG5veGZhLCB4ZmEKKyMKKyMgQWxsIGNvbHVtbnMgb24gYSBsaW5lIG9uIGEgbGluZSBtdXN0IG1hdGNoLCBidXQgZmlsZW5hbWVzIG1heSBiZSByZXBlYXRlZAorIyBvbiBzdWJzZXF1ZW50IGxpbmVzIHRvIHN1cHByZXNzIG1vcmUgY2FzZXMuICBXaXRoaW4gZWFjaCBjb2x1bW4sIGFueSBvbmUgb2YKKyMgdGhlIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMgbXVzdCBtYXRjaCBpbiBvcmRlciBmb3IgdGhlIGNvbHVtIHRvICJtYXRjaCIuCisjIFRoZSBmaWxlbmFtZXMgYW5kIGtleXdvcmRzIGFyZSBjYXNlLXNlbnNpdGl2ZS4KKyMKKyMgVHJ5IHRvIGtlZXAgdGhlIGZpbGUgYWxwaGFiZXRpemVkIHdpdGhpbiBlYWNoIGNhdGVnb3J5IG9mIHRlc3QuCisKKyMKKyMgQ29ycHVzIHRlc3RzCisjCitGUkNfMy41X0NGX1N0cmZfc3RtZl9EZWZhdWx0Q3J5cHRGaWx0ZXIucGRmICogKiAqCitGUkNfMy41X0VuY3J5cHRNZXRhZGF0YV9ULnBkZiAqICogKgorRlJDXzMuNV9FbmNyeXB0X2lzX2RhbWFnZS5wZGYgKiAqICoKK0ZSQ18zLjVfRmlsdGVyX1B1YlNlY19TdWJGaWx0ZXJfczUucGRmICogKiAqCitGUkNfMy41X0ZpbHRlcl9QdWJTZWNfU3ViX1N1YkZpbHRlcl9zNC5wZGYgKiAqICoKK01vdXNlRXZlbnRzLnBkZiAqICogKgorT25lb2YucGRmICogKiAqCitidWdfNjUxMzA0LnBkZiAqICogKgorb3V0bGluZS5wZGYgKiAqICoKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvX19pbml0X18ucHkgYi90ZXN0aW5nL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS90ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuY3BwIGIvdGVzdGluZy9lbWJlZGRlcl90ZXN0LmNwcAppbmRleCA3OTA3NDE1Li5iNDM0MzUzIDEwMDY0NAotLS0gYS90ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuY3BwCisrKyBiL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdC5jcHAKQEAgLTYsNiArNiw3IEBACiAKICNpbmNsdWRlIDxsaW1pdHMuaD4KIAorI2luY2x1ZGUgPGZzdHJlYW0+CiAjaW5jbHVkZSA8bGlzdD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dXRpbGl0eT4KQEAgLTE3LDggKzE4LDEwIEBACiAjaW5jbHVkZSAicHVibGljL2ZwZGZfdGV4dC5oIgogI2luY2x1ZGUgInB1YmxpYy9mcGRmdmlldy5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgorI2luY2x1ZGUgInRlc3RpbmcvaW1hZ2VfZGlmZi9pbWFnZV9kaWZmX3BuZy5oIgogI2luY2x1ZGUgInRlc3RpbmcvdGVzdF9zdXBwb3J0LmgiCiAjaW5jbHVkZSAidGVzdGluZy91dGlscy9wYXRoX3NlcnZpY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKICNpZmRlZiBQREZfRU5BQkxFX1Y4CiAjaW5jbHVkZSAidjgvaW5jbHVkZS92OC1wbGF0Zm9ybS5oIgpAQCAtMjcsMzEgKzMwLDIwIEBACiAKIG5hbWVzcGFjZSB7CiAKLWNvbnN0IGNoYXIqIGdfZXhlX3BhdGggPSBudWxscHRyOwotCi0jaWZkZWYgUERGX0VOQUJMRV9WOAotI2lmZGVmIFY4X1VTRV9FWFRFUk5BTF9TVEFSVFVQX0RBVEEKLXY4OjpTdGFydHVwRGF0YSogZ192OF9uYXRpdmVzID0gbnVsbHB0cjsKLXY4OjpTdGFydHVwRGF0YSogZ192OF9zbmFwc2hvdCA9IG51bGxwdHI7Ci0jZW5kaWYgIC8vIFY4X1VTRV9FWFRFUk5BTF9TVEFSVFVQX0RBVEEKLSNlbmRpZiAgLy8gUERGX0VOQUJMRV9WOAotCi1GUERGX0JPT0wgSXNfRGF0YV9BdmFpbChGWF9GSUxFQVZBSUwqIHBUaGlzLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBBZGRfU2VnbWVudChGWF9ET1dOTE9BREhJTlRTKiBwVGhpcywgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIHt9Ci0KLXN0ZDo6c3RyaW5nIENSWVBUX1RvQmFzZTE2KGNvbnN0IHVpbnQ4X3QqIGRpZ2VzdCkgewotICBzdGF0aWMgY2hhciBjb25zdCB6RW5jb2RlW10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7Ci0gIHN0ZDo6c3RyaW5nIHJldDsKLSAgcmV0LnJlc2l6ZSgzMik7Ci0gIGZvciAoaW50IGkgPSAwLCBqID0gMDsgaSA8IDE2OyBpKyssIGogKz0gMikgewotICAgIHVpbnQ4X3QgYSA9IGRpZ2VzdFtpXTsKLSAgICByZXRbal0gPSB6RW5jb2RlWyhhID4+IDQpICYgMHhmXTsKLSAgICByZXRbaiArIDFdID0gekVuY29kZVthICYgMHhmXTsKK2ludCBHZXRCaXRtYXBCeXRlc1BlclBpeGVsKEZQREZfQklUTUFQIGJpdG1hcCkgeworICBjb25zdCBpbnQgZm9ybWF0ID0gRlBERkJpdG1hcF9HZXRGb3JtYXQoYml0bWFwKTsKKyAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIEZQREZCaXRtYXBfR3JheToKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgRlBERkJpdG1hcF9CR1I6CisgICAgICByZXR1cm4gMzsKKyAgICBjYXNlIEZQREZCaXRtYXBfQkdSeDoKKyAgICBjYXNlIEZQREZCaXRtYXBfQkdSQToKKyAgICAgIHJldHVybiA0OworICAgIGRlZmF1bHQ6CisgICAgICBBU1NFUlQoZmFsc2UpOworICAgICAgcmV0dXJuIDA7CiAgIH0KLSAgcmV0dXJuIHJldDsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCkBAIC02NSwzNCArNTcsMTQgQEAKICAgICAgIGxvYWRlcl8obnVsbHB0ciksCiAgICAgICBmaWxlX2xlbmd0aF8oMCksCiAgICAgICBmaWxlX2NvbnRlbnRzXyhudWxscHRyKSB7Ci0gIG1lbXNldCgmaGludHNfLCAwLCBzaXplb2YoaGludHNfKSk7CiAgIG1lbXNldCgmZmlsZV9hY2Nlc3NfLCAwLCBzaXplb2YoZmlsZV9hY2Nlc3NfKSk7Ci0gIG1lbXNldCgmZmlsZV9hdmFpbF8sIDAsIHNpemVvZihmaWxlX2F2YWlsXykpOwogICBkZWxlZ2F0ZV8gPSBkZWZhdWx0X2RlbGVnYXRlXy5nZXQoKTsKIAotI2lmZGVmIFBERl9FTkFCTEVfVjgKLSNpZmRlZiBWOF9VU0VfRVhURVJOQUxfU1RBUlRVUF9EQVRBCi0gIGlmIChnX3Y4X25hdGl2ZXMgJiYgZ192OF9zbmFwc2hvdCkgewotICAgIEluaXRpYWxpemVWOEZvclBERml1bShnX2V4ZV9wYXRoLCBzdGQ6OnN0cmluZygpLCBudWxscHRyLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmcGxhdGZvcm1fKTsKLSAgfSBlbHNlIHsKLSAgICBnX3Y4X25hdGl2ZXMgPSBuZXcgdjg6OlN0YXJ0dXBEYXRhOwotICAgIGdfdjhfc25hcHNob3QgPSBuZXcgdjg6OlN0YXJ0dXBEYXRhOwotICAgIEluaXRpYWxpemVWOEZvclBERml1bShnX2V4ZV9wYXRoLCBzdGQ6OnN0cmluZygpLCBnX3Y4X25hdGl2ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdfdjhfc25hcHNob3QsICZwbGF0Zm9ybV8pOwotICB9Ci0jZWxzZQotICBJbml0aWFsaXplVjhGb3JQREZpdW0oZ19leGVfcGF0aCwgJnBsYXRmb3JtXyk7Ci0jZW5kaWYgIC8vIFY4X1VTRV9FWFRFUk5BTF9TVEFSVFVQX0RBVEEKLSNlbmRpZiAgLy8gRlBERl9FTkFCTEVfVjgKKyAgRlBERl9GSUxFV1JJVEU6OnZlcnNpb24gPSAxOworICBGUERGX0ZJTEVXUklURTo6V3JpdGVCbG9jayA9IFdyaXRlQmxvY2tDYWxsYmFjazsKIH0KIAotRW1iZWRkZXJUZXN0Ojp+RW1iZWRkZXJUZXN0KCkgewotI2lmZGVmIFBERl9FTkFCTEVfVjgKLSAgdjg6OlY4OjpTaHV0ZG93blBsYXRmb3JtKCk7Ci0gIGRlbGV0ZSBwbGF0Zm9ybV87Ci0jZW5kaWYgIC8vIFBERl9FTkFCTEVfVjgKLX0KK0VtYmVkZGVyVGVzdDo6fkVtYmVkZGVyVGVzdCgpIHt9CiAKIHZvaWQgRW1iZWRkZXJUZXN0OjpTZXRVcCgpIHsKICAgRlBERl9MSUJSQVJZX0NPTkZJRyBjb25maWc7CkBAIC0xMDcsNiArNzksOCBAQAogICBpbmZvLT52ZXJzaW9uID0gMTsKICAgaW5mby0+RlNES19VblN1cHBvcnRfSGFuZGxlciA9IFVuc3VwcG9ydGVkSGFuZGxlclRyYW1wb2xpbmU7CiAgIEZTREtfU2V0VW5TcE9ialByb2Nlc3NIYW5kbGVyKGluZm8pOworCisgIG1fU2F2ZWREb2N1bWVudCA9IG51bGxwdHI7CiB9CiAKIHZvaWQgRW1iZWRkZXJUZXN0OjpUZWFyRG93bigpIHsKQEAgLTExOCw3ICs5Miw2IEBACiAKICAgRlBERkF2YWlsX0Rlc3Ryb3koYXZhaWxfKTsKICAgRlBERl9EZXN0cm95TGlicmFyeSgpOwotCiAgIGRlbGV0ZSBsb2FkZXJfOwogfQogCkBAIC0xMjcsMTMgKzEwMCwyNiBAQAogICBpZiAoIWRvY3VtZW50XykKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgU2V0dXBGb3JtRmlsbEVudmlyb25tZW50KCk7CisgIGZvcm1faGFuZGxlXyA9IFNldHVwRm9ybUZpbGxFbnZpcm9ubWVudChkb2N1bWVudF8pOwogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBFbWJlZGRlclRlc3Q6Ok9wZW5Eb2N1bWVudChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG11c3RfbGluZWFyaXplKSB7Citib29sIEVtYmVkZGVyVGVzdDo6T3BlbkRvY3VtZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSkgeworICByZXR1cm4gT3BlbkRvY3VtZW50V2l0aE9wdGlvbnMoZmlsZW5hbWUsIG51bGxwdHIsIGZhbHNlKTsKK30KKworYm9vbCBFbWJlZGRlclRlc3Q6Ok9wZW5Eb2N1bWVudExpbmVhcml6ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7CisgIHJldHVybiBPcGVuRG9jdW1lbnRXaXRoT3B0aW9ucyhmaWxlbmFtZSwgbnVsbHB0ciwgdHJ1ZSk7Cit9CisKK2Jvb2wgRW1iZWRkZXJUZXN0OjpPcGVuRG9jdW1lbnRXaXRoUGFzc3dvcmQoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXNzd29yZCkgeworICByZXR1cm4gT3BlbkRvY3VtZW50V2l0aE9wdGlvbnMoZmlsZW5hbWUsIHBhc3N3b3JkLCBmYWxzZSk7Cit9CisKK2Jvb2wgRW1iZWRkZXJUZXN0OjpPcGVuRG9jdW1lbnRXaXRoT3B0aW9ucyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtdXN0X2xpbmVhcml6ZSkgewogICBzdGQ6OnN0cmluZyBmaWxlX3BhdGg7CiAgIGlmICghUGF0aFNlcnZpY2U6OkdldFRlc3RGaWxlUGF0aChmaWxlbmFtZSwgJmZpbGVfcGF0aCkpCiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTQ2LDY5ICsxMzIsODEgQEAKICAgZmlsZV9hY2Nlc3NfLm1fRmlsZUxlbiA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KGZpbGVfbGVuZ3RoXyk7CiAgIGZpbGVfYWNjZXNzXy5tX0dldEJsb2NrID0gVGVzdExvYWRlcjo6R2V0QmxvY2s7CiAgIGZpbGVfYWNjZXNzXy5tX1BhcmFtID0gbG9hZGVyXzsKKyAgZmFrZV9maWxlX2FjY2Vzc18gPSBwZGZpdW06Ok1ha2VVbmlxdWU8RmFrZUZpbGVBY2Nlc3M+KCZmaWxlX2FjY2Vzc18pOworICByZXR1cm4gT3BlbkRvY3VtZW50SGVscGVyKHBhc3N3b3JkLCBtdXN0X2xpbmVhcml6ZSwgZmFrZV9maWxlX2FjY2Vzc18uZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRvY3VtZW50XywgJmF2YWlsXywgJmZvcm1faGFuZGxlXyk7Cit9CiAKLSAgZmlsZV9hdmFpbF8udmVyc2lvbiA9IDE7Ci0gIGZpbGVfYXZhaWxfLklzRGF0YUF2YWlsID0gSXNfRGF0YV9BdmFpbDsKLQotICBoaW50c18udmVyc2lvbiA9IDE7Ci0gIGhpbnRzXy5BZGRTZWdtZW50ID0gQWRkX1NlZ21lbnQ7Ci0KLSAgYXZhaWxfID0gRlBERkF2YWlsX0NyZWF0ZSgmZmlsZV9hdmFpbF8sICZmaWxlX2FjY2Vzc18pOwotCi0gIGlmIChGUERGQXZhaWxfSXNMaW5lYXJpemVkKGF2YWlsXykgPT0gUERGX0xJTkVBUklaRUQpIHsKLSAgICBkb2N1bWVudF8gPSBGUERGQXZhaWxfR2V0RG9jdW1lbnQoYXZhaWxfLCBwYXNzd29yZCk7Ci0gICAgaWYgKCFkb2N1bWVudF8pIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Citib29sIEVtYmVkZGVyVGVzdDo6T3BlbkRvY3VtZW50SGVscGVyKGNvbnN0IGNoYXIqIHBhc3N3b3JkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG11c3RfbGluZWFyaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWtlRmlsZUFjY2VzcyogbmV0d29ya19zaW11bGF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRE9DVU1FTlQqIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0FWQUlMKiBhdmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9GT1JNSEFORExFKiBmb3JtX2hhbmRsZSkgeworICBuZXR3b3JrX3NpbXVsYXRvci0+QWRkU2VnbWVudCgwLCAxMDI0KTsKKyAgbmV0d29ya19zaW11bGF0b3ItPlNldFJlcXVlc3RlZERhdGFBdmFpbGFibGUoKTsKKyAgKmF2YWlsID0gRlBERkF2YWlsX0NyZWF0ZShuZXR3b3JrX3NpbXVsYXRvci0+R2V0RmlsZUF2YWlsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya19zaW11bGF0b3ItPkdldEZpbGVBY2Nlc3MoKSk7CisgIGlmIChGUERGQXZhaWxfSXNMaW5lYXJpemVkKCphdmFpbCkgPT0gUERGX0xJTkVBUklaRUQpIHsKICAgICBpbnQzMl90IG5SZXQgPSBQREZfREFUQV9OT1RBVkFJTDsKICAgICB3aGlsZSAoblJldCA9PSBQREZfREFUQV9OT1RBVkFJTCkgewotICAgICAgblJldCA9IEZQREZBdmFpbF9Jc0RvY0F2YWlsKGF2YWlsXywgJmhpbnRzXyk7CisgICAgICBuZXR3b3JrX3NpbXVsYXRvci0+U2V0UmVxdWVzdGVkRGF0YUF2YWlsYWJsZSgpOworICAgICAgblJldCA9CisgICAgICAgICAgRlBERkF2YWlsX0lzRG9jQXZhaWwoKmF2YWlsLCBuZXR3b3JrX3NpbXVsYXRvci0+R2V0RG93bmxvYWRIaW50cygpKTsKICAgICB9Ci0gICAgaWYgKG5SZXQgPT0gUERGX0RBVEFfRVJST1IpIHsKKyAgICBpZiAoblJldCA9PSBQREZfREFUQV9FUlJPUikKICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgblJldCA9IEZQREZBdmFpbF9Jc0Zvcm1BdmFpbChhdmFpbF8sICZoaW50c18pOwotICAgIGlmIChuUmV0ID09IFBERl9GT1JNX0VSUk9SIHx8IG5SZXQgPT0gUERGX0ZPUk1fTk9UQVZBSUwpIHsKKworICAgICpkb2N1bWVudCA9IEZQREZBdmFpbF9HZXREb2N1bWVudCgqYXZhaWwsIHBhc3N3b3JkKTsKKyAgICBpZiAoISpkb2N1bWVudCkKICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIG5SZXQgPSBQREZfREFUQV9OT1RBVkFJTDsKKyAgICB3aGlsZSAoblJldCA9PSBQREZfREFUQV9OT1RBVkFJTCkgeworICAgICAgbmV0d29ya19zaW11bGF0b3ItPlNldFJlcXVlc3RlZERhdGFBdmFpbGFibGUoKTsKKyAgICAgIG5SZXQgPQorICAgICAgICAgIEZQREZBdmFpbF9Jc0Zvcm1BdmFpbCgqYXZhaWwsIG5ldHdvcmtfc2ltdWxhdG9yLT5HZXREb3dubG9hZEhpbnRzKCkpOwogICAgIH0KLSAgICBpbnQgcGFnZV9jb3VudCA9IEZQREZfR2V0UGFnZUNvdW50KGRvY3VtZW50Xyk7CisgICAgaWYgKG5SZXQgPT0gUERGX0ZPUk1fRVJST1IpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpbnQgcGFnZV9jb3VudCA9IEZQREZfR2V0UGFnZUNvdW50KCpkb2N1bWVudCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlX2NvdW50OyArK2kpIHsKICAgICAgIG5SZXQgPSBQREZfREFUQV9OT1RBVkFJTDsKICAgICAgIHdoaWxlIChuUmV0ID09IFBERl9EQVRBX05PVEFWQUlMKSB7Ci0gICAgICAgIG5SZXQgPSBGUERGQXZhaWxfSXNQYWdlQXZhaWwoYXZhaWxfLCBpLCAmaGludHNfKTsKKyAgICAgICAgbmV0d29ya19zaW11bGF0b3ItPlNldFJlcXVlc3RlZERhdGFBdmFpbGFibGUoKTsKKyAgICAgICAgblJldCA9IEZQREZBdmFpbF9Jc1BhZ2VBdmFpbCgqYXZhaWwsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0d29ya19zaW11bGF0b3ItPkdldERvd25sb2FkSGludHMoKSk7CiAgICAgICB9Ci0gICAgICBpZiAoblJldCA9PSBQREZfREFUQV9FUlJPUikgeworCisgICAgICBpZiAoblJldCA9PSBQREZfREFUQV9FUlJPUikKICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQogICAgIH0KICAgfSBlbHNlIHsKLSAgICBpZiAobXVzdF9saW5lYXJpemUpIHsKKyAgICBpZiAobXVzdF9saW5lYXJpemUpCiAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGRvY3VtZW50XyA9IEZQREZfTG9hZEN1c3RvbURvY3VtZW50KCZmaWxlX2FjY2Vzc18sIHBhc3N3b3JkKTsKLSAgICBpZiAoIWRvY3VtZW50XykgeworICAgIG5ldHdvcmtfc2ltdWxhdG9yLT5TZXRXaG9sZUZpbGVBdmFpbGFibGUoKTsKKyAgICAqZG9jdW1lbnQgPQorICAgICAgICBGUERGX0xvYWRDdXN0b21Eb2N1bWVudChuZXR3b3JrX3NpbXVsYXRvci0+R2V0RmlsZUFjY2VzcygpLCBwYXNzd29yZCk7CisgICAgaWYgKCEqZG9jdW1lbnQpCiAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQogICB9Ci0KKyAgKmZvcm1faGFuZGxlID0gU2V0dXBGb3JtRmlsbEVudmlyb25tZW50KCpkb2N1bWVudCk7CiAjaWZkZWYgUERGX0VOQUJMRV9YRkEKLSAgaW50IGRvY1R5cGUgPSBET0NUWVBFX1BERjsKLSAgaWYgKEZQREZfSGFzWEZBRmllbGQoZG9jdW1lbnRfLCAmZG9jVHlwZSkpIHsKLSAgICBpZiAoZG9jVHlwZSAhPSBET0NUWVBFX1BERikKLSAgICAgICh2b2lkKUZQREZfTG9hZFhGQShkb2N1bWVudF8pOwotICB9CisgIGludCBkb2NfdHlwZSA9IEZQREZfR2V0Rm9ybVR5cGUoKmRvY3VtZW50KTsKKyAgaWYgKGRvY190eXBlID09IEZPUk1UWVBFX1hGQV9GVUxMIHx8IGRvY190eXBlID09IEZPUk1UWVBFX1hGQV9GT1JFR1JPVU5EKQorICAgIEZQREZfTG9hZFhGQSgqZG9jdW1lbnQpOwogI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQotCi0gICh2b2lkKUZQREZfR2V0RG9jUGVybWlzc2lvbnMoZG9jdW1lbnRfKTsKLSAgU2V0dXBGb3JtRmlsbEVudmlyb25tZW50KCk7CisgICh2b2lkKUZQREZfR2V0RG9jUGVybWlzc2lvbnMoKmRvY3VtZW50KTsKICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgRW1iZWRkZXJUZXN0OjpTZXR1cEZvcm1GaWxsRW52aXJvbm1lbnQoKSB7CitGUERGX0ZPUk1IQU5ETEUgRW1iZWRkZXJUZXN0OjpTZXR1cEZvcm1GaWxsRW52aXJvbm1lbnQoRlBERl9ET0NVTUVOVCBkb2MpIHsKICAgSVBERl9KU1BMQVRGT1JNKiBwbGF0Zm9ybSA9IHN0YXRpY19jYXN0PElQREZfSlNQTEFURk9STSo+KHRoaXMpOwotICBtZW1zZXQocGxhdGZvcm0sIDAsIHNpemVvZihJUERGX0pTUExBVEZPUk0pKTsKKyAgbWVtc2V0KHBsYXRmb3JtLCAnXDAnLCBzaXplb2YoSVBERl9KU1BMQVRGT1JNKSk7CiAgIHBsYXRmb3JtLT52ZXJzaW9uID0gMjsKICAgcGxhdGZvcm0tPmFwcF9hbGVydCA9IEFsZXJ0VHJhbXBvbGluZTsKKyAgcGxhdGZvcm0tPm1faXNvbGF0ZSA9IGV4dGVybmFsX2lzb2xhdGVfOwogCiAgIEZQREZfRk9STUZJTExJTkZPKiBmb3JtZmlsbGluZm8gPSBzdGF0aWNfY2FzdDxGUERGX0ZPUk1GSUxMSU5GTyo+KHRoaXMpOwogICBtZW1zZXQoZm9ybWZpbGxpbmZvLCAwLCBzaXplb2YoRlBERl9GT1JNRklMTElORk8pKTsKQEAgLTIyMSw0MSArMjE5LDQ2IEBACiAgIGZvcm1maWxsaW5mby0+RkZJX0tpbGxUaW1lciA9IEtpbGxUaW1lclRyYW1wb2xpbmU7CiAgIGZvcm1maWxsaW5mby0+RkZJX0dldFBhZ2UgPSBHZXRQYWdlVHJhbXBvbGluZTsKICAgZm9ybWZpbGxpbmZvLT5tX3BKc1BsYXRmb3JtID0gcGxhdGZvcm07Ci0KLSAgZm9ybV9oYW5kbGVfID0gRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudChkb2N1bWVudF8sIGZvcm1maWxsaW5mbyk7Ci0gIEZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0Q29sb3IoZm9ybV9oYW5kbGVfLCAwLCAweEZGRTRERCk7Ci0gIEZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0QWxwaGEoZm9ybV9oYW5kbGVfLCAxMDApOworICBGUERGX0ZPUk1IQU5ETEUgZm9ybV9oYW5kbGUgPQorICAgICAgRlBERkRPQ19Jbml0Rm9ybUZpbGxFbnZpcm9ubWVudChkb2MsIGZvcm1maWxsaW5mbyk7CisgIEZQREZfU2V0Rm9ybUZpZWxkSGlnaGxpZ2h0Q29sb3IoZm9ybV9oYW5kbGUsIEZQREZfRk9STUZJRUxEX1VOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkU0REQpOworICBGUERGX1NldEZvcm1GaWVsZEhpZ2hsaWdodEFscGhhKGZvcm1faGFuZGxlLCAxMDApOworICByZXR1cm4gZm9ybV9oYW5kbGU7CiB9CiAKIHZvaWQgRW1iZWRkZXJUZXN0OjpEb09wZW5BY3Rpb25zKCkgeworICBBU1NFUlQoZm9ybV9oYW5kbGVfKTsKICAgRk9STV9Eb0RvY3VtZW50SlNBY3Rpb24oZm9ybV9oYW5kbGVfKTsKICAgRk9STV9Eb0RvY3VtZW50T3BlbkFjdGlvbihmb3JtX2hhbmRsZV8pOwogfQogCiBpbnQgRW1iZWRkZXJUZXN0OjpHZXRGaXJzdFBhZ2VOdW0oKSB7CiAgIGludCBmaXJzdF9wYWdlID0gRlBERkF2YWlsX0dldEZpcnN0UGFnZU51bShkb2N1bWVudF8pOwotICAodm9pZClGUERGQXZhaWxfSXNQYWdlQXZhaWwoYXZhaWxfLCBmaXJzdF9wYWdlLCAmaGludHNfKTsKKyAgKHZvaWQpRlBERkF2YWlsX0lzUGFnZUF2YWlsKGF2YWlsXywgZmlyc3RfcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZha2VfZmlsZV9hY2Nlc3NfLT5HZXREb3dubG9hZEhpbnRzKCkpOwogICByZXR1cm4gZmlyc3RfcGFnZTsKIH0KIAogaW50IEVtYmVkZGVyVGVzdDo6R2V0UGFnZUNvdW50KCkgewogICBpbnQgcGFnZV9jb3VudCA9IEZQREZfR2V0UGFnZUNvdW50KGRvY3VtZW50Xyk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgcGFnZV9jb3VudDsgKytpKSB7Ci0gICAgKHZvaWQpRlBERkF2YWlsX0lzUGFnZUF2YWlsKGF2YWlsXywgaSwgJmhpbnRzXyk7Ci0gIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlX2NvdW50OyArK2kpCisgICAgKHZvaWQpRlBERkF2YWlsX0lzUGFnZUF2YWlsKGF2YWlsXywgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFrZV9maWxlX2FjY2Vzc18tPkdldERvd25sb2FkSGludHMoKSk7CiAgIHJldHVybiBwYWdlX2NvdW50OwogfQogCiBGUERGX1BBR0UgRW1iZWRkZXJUZXN0OjpMb2FkUGFnZShpbnQgcGFnZV9udW1iZXIpIHsKKyAgQVNTRVJUKGZvcm1faGFuZGxlXyk7CiAgIC8vIEZpcnN0IGNoZWNrIHdoZXRoZXIgaXQgaXMgbG9hZGVkIGFscmVhZHkuCiAgIGF1dG8gaXQgPSBwYWdlX21hcF8uZmluZChwYWdlX251bWJlcik7CiAgIGlmIChpdCAhPSBwYWdlX21hcF8uZW5kKCkpCiAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CiAKICAgRlBERl9QQUdFIHBhZ2UgPSBGUERGX0xvYWRQYWdlKGRvY3VtZW50XywgcGFnZV9udW1iZXIpOwotICBpZiAoIXBhZ2UpIHsKKyAgaWYgKCFwYWdlKQogICAgIHJldHVybiBudWxscHRyOwotICB9CisKICAgRk9STV9PbkFmdGVyTG9hZFBhZ2UocGFnZSwgZm9ybV9oYW5kbGVfKTsKICAgRk9STV9Eb1BhZ2VBQWN0aW9uKHBhZ2UsIGZvcm1faGFuZGxlXywgRlBERlBBR0VfQUFDVElPTl9PUEVOKTsKICAgLy8gQ2FjaGUgdGhlIHBhZ2UuCkBAIC0yNjUsMTggKzI2OCwyNSBAQAogfQogCiBGUERGX0JJVE1BUCBFbWJlZGRlclRlc3Q6OlJlbmRlclBhZ2UoRlBERl9QQUdFIHBhZ2UpIHsKKyAgcmV0dXJuIFJlbmRlclBhZ2VXaXRoRmxhZ3MocGFnZSwgZm9ybV9oYW5kbGVfLCAwKTsKK30KKworRlBERl9CSVRNQVAgRW1iZWRkZXJUZXN0OjpSZW5kZXJQYWdlV2l0aEZsYWdzKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRk9STUhBTkRMRSBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKSB7CiAgIGludCB3aWR0aCA9IHN0YXRpY19jYXN0PGludD4oRlBERl9HZXRQYWdlV2lkdGgocGFnZSkpOwogICBpbnQgaGVpZ2h0ID0gc3RhdGljX2Nhc3Q8aW50PihGUERGX0dldFBhZ2VIZWlnaHQocGFnZSkpOwogICBpbnQgYWxwaGEgPSBGUERGUGFnZV9IYXNUcmFuc3BhcmVuY3kocGFnZSkgPyAxIDogMDsKICAgRlBERl9CSVRNQVAgYml0bWFwID0gRlBERkJpdG1hcF9DcmVhdGUod2lkdGgsIGhlaWdodCwgYWxwaGEpOwogICBGUERGX0RXT1JEIGZpbGxfY29sb3IgPSBhbHBoYSA/IDB4MDAwMDAwMDAgOiAweEZGRkZGRkZGOwogICBGUERGQml0bWFwX0ZpbGxSZWN0KGJpdG1hcCwgMCwgMCwgd2lkdGgsIGhlaWdodCwgZmlsbF9jb2xvcik7Ci0gIEZQREZfUmVuZGVyUGFnZUJpdG1hcChiaXRtYXAsIHBhZ2UsIDAsIDAsIHdpZHRoLCBoZWlnaHQsIDAsIDApOwotICBGUERGX0ZGTERyYXcoZm9ybV9oYW5kbGVfLCBiaXRtYXAsIHBhZ2UsIDAsIDAsIHdpZHRoLCBoZWlnaHQsIDAsIDApOworICBGUERGX1JlbmRlclBhZ2VCaXRtYXAoYml0bWFwLCBwYWdlLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCAwLCBmbGFncyk7CisgIEZQREZfRkZMRHJhdyhoYW5kbGUsIGJpdG1hcCwgcGFnZSwgMCwgMCwgd2lkdGgsIGhlaWdodCwgMCwgZmxhZ3MpOwogICByZXR1cm4gYml0bWFwOwogfQogCiB2b2lkIEVtYmVkZGVyVGVzdDo6VW5sb2FkUGFnZShGUERGX1BBR0UgcGFnZSkgeworICBBU1NFUlQoZm9ybV9oYW5kbGVfKTsKICAgRk9STV9Eb1BhZ2VBQWN0aW9uKHBhZ2UsIGZvcm1faGFuZGxlXywgRlBERlBBR0VfQUFDVElPTl9DTE9TRSk7CiAgIEZPUk1fT25CZWZvcmVDbG9zZVBhZ2UocGFnZSwgZm9ybV9oYW5kbGVfKTsKICAgRlBERl9DbG9zZVBhZ2UocGFnZSk7CkBAIC0yODksNiArMjk5LDc3IEBACiAgIHBhZ2VfcmV2ZXJzZV9tYXBfLmVyYXNlKGl0KTsKIH0KIAorRlBERl9ET0NVTUVOVCBFbWJlZGRlclRlc3Q6Ok9wZW5TYXZlZERvY3VtZW50KGNvbnN0IGNoYXIqIHBhc3N3b3JkKSB7CisgIG1lbXNldCgmc2F2ZWRfZmlsZV9hY2Nlc3NfLCAwLCBzaXplb2Yoc2F2ZWRfZmlsZV9hY2Nlc3NfKSk7CisgIHNhdmVkX2ZpbGVfYWNjZXNzXy5tX0ZpbGVMZW4gPSBtX1N0cmluZy5zaXplKCk7CisgIHNhdmVkX2ZpbGVfYWNjZXNzXy5tX0dldEJsb2NrID0gR2V0QmxvY2tGcm9tU3RyaW5nOworICBzYXZlZF9maWxlX2FjY2Vzc18ubV9QYXJhbSA9ICZtX1N0cmluZzsKKworICBzYXZlZF9mYWtlX2ZpbGVfYWNjZXNzXyA9CisgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8RmFrZUZpbGVBY2Nlc3M+KCZzYXZlZF9maWxlX2FjY2Vzc18pOworCisgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudEhlbHBlcihwYXNzd29yZCwgZmFsc2UsIHNhdmVkX2Zha2VfZmlsZV9hY2Nlc3NfLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1fU2F2ZWREb2N1bWVudCwgJm1fU2F2ZWRBdmFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX1NhdmVkRm9ybSkpOworICByZXR1cm4gbV9TYXZlZERvY3VtZW50OworfQorCit2b2lkIEVtYmVkZGVyVGVzdDo6Q2xvc2VTYXZlZERvY3VtZW50KCkgeworICBBU1NFUlQobV9TYXZlZERvY3VtZW50KTsKKworICBGUERGRE9DX0V4aXRGb3JtRmlsbEVudmlyb25tZW50KG1fU2F2ZWRGb3JtKTsKKyAgRlBERl9DbG9zZURvY3VtZW50KG1fU2F2ZWREb2N1bWVudCk7CisgIEZQREZBdmFpbF9EZXN0cm95KG1fU2F2ZWRBdmFpbCk7CisKKyAgbV9TYXZlZEZvcm0gPSBudWxscHRyOworICBtX1NhdmVkRG9jdW1lbnQgPSBudWxscHRyOworICBtX1NhdmVkQXZhaWwgPSBudWxscHRyOworfQorCitGUERGX1BBR0UgRW1iZWRkZXJUZXN0OjpMb2FkU2F2ZWRQYWdlKGludCBwYWdlX251bWJlcikgeworICBBU1NFUlQobV9TYXZlZERvY3VtZW50KTsKKworICBFWFBFQ1RfTFQocGFnZV9udW1iZXIsIEZQREZfR2V0UGFnZUNvdW50KG1fU2F2ZWREb2N1bWVudCkpOworICBGUERGX1BBR0UgcGFnZSA9IEZQREZfTG9hZFBhZ2UobV9TYXZlZERvY3VtZW50LCBwYWdlX251bWJlcik7CisKKyAgQVNTRVJUKHBhZ2UpOworICByZXR1cm4gcGFnZTsKK30KKworRlBERl9CSVRNQVAgRW1iZWRkZXJUZXN0OjpSZW5kZXJTYXZlZFBhZ2UoRlBERl9QQUdFIHBhZ2UpIHsKKyAgcmV0dXJuIFJlbmRlclBhZ2VXaXRoRmxhZ3MocGFnZSwgbV9TYXZlZEZvcm0sIDApOworfQorCit2b2lkIEVtYmVkZGVyVGVzdDo6Q2xvc2VTYXZlZFBhZ2UoRlBERl9QQUdFIHBhZ2UpIHsKKyAgQVNTRVJUKHBhZ2UpOworICBGUERGX0Nsb3NlUGFnZShwYWdlKTsKK30KKwordm9pZCBFbWJlZGRlclRlc3Q6OlZlcmlmeVNhdmVkUmVuZGVyaW5nKEZQREZfUEFHRSBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1kNSkgeworICBBU1NFUlQobV9TYXZlZERvY3VtZW50KTsKKyAgQVNTRVJUKHBhZ2UpOworCisgIEZQREZfQklUTUFQIG5ld19iaXRtYXAgPSBSZW5kZXJQYWdlV2l0aEZsYWdzKHBhZ2UsIG1fU2F2ZWRGb3JtLCBGUERGX0FOTk9UKTsKKyAgQ29tcGFyZUJpdG1hcChuZXdfYml0bWFwLCB3aWR0aCwgaGVpZ2h0LCBtZDUpOworICBGUERGQml0bWFwX0Rlc3Ryb3kobmV3X2JpdG1hcCk7Cit9CisKK3ZvaWQgRW1iZWRkZXJUZXN0OjpWZXJpZnlTYXZlZERvY3VtZW50KGludCB3aWR0aCwgaW50IGhlaWdodCwgY29uc3QgY2hhciogbWQ1KSB7CisgIE9wZW5TYXZlZERvY3VtZW50KCk7CisgIEZQREZfUEFHRSBwYWdlID0gTG9hZFNhdmVkUGFnZSgwKTsKKyAgVmVyaWZ5U2F2ZWRSZW5kZXJpbmcocGFnZSwgd2lkdGgsIGhlaWdodCwgbWQ1KTsKKyAgQ2xvc2VTYXZlZFBhZ2UocGFnZSk7CisgIENsb3NlU2F2ZWREb2N1bWVudCgpOworfQorCit2b2lkIEVtYmVkZGVyVGVzdDo6U2V0V2hvbGVGaWxlQXZhaWxhYmxlKCkgeworICBBU1NFUlQoZmFrZV9maWxlX2FjY2Vzc18pOworICBmYWtlX2ZpbGVfYWNjZXNzXy0+U2V0V2hvbGVGaWxlQXZhaWxhYmxlKCk7Cit9CisKIEZQREZfUEFHRSBFbWJlZGRlclRlc3Q6OkRlbGVnYXRlOjpHZXRQYWdlKEZQREZfRk9STUZJTExJTkZPKiBpbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYWdlX2luZGV4KSB7CkBAIC0zMzcsNDAgKzQxOCw4NCBAQAogfQogCiAvLyBzdGF0aWMKK3N0ZDo6c3RyaW5nIEVtYmVkZGVyVGVzdDo6SGFzaEJpdG1hcChGUERGX0JJVE1BUCBiaXRtYXApIHsKKyAgdWludDhfdCBkaWdlc3RbMTZdOworICBDUllQVF9NRDVHZW5lcmF0ZShzdGF0aWNfY2FzdDx1aW50OF90Kj4oRlBERkJpdG1hcF9HZXRCdWZmZXIoYml0bWFwKSksCisgICAgICAgICAgICAgICAgICAgIEZQREZCaXRtYXBfR2V0V2lkdGgoYml0bWFwKSAqCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRCaXRtYXBCeXRlc1BlclBpeGVsKGJpdG1hcCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgRlBERkJpdG1hcF9HZXRIZWlnaHQoYml0bWFwKSwKKyAgICAgICAgICAgICAgICAgICAgZGlnZXN0KTsKKyAgcmV0dXJuIENyeXB0VG9CYXNlMTYoZGlnZXN0KTsKK30KKworI2lmbmRlZiBOREVCVUcKKy8vIHN0YXRpYwordm9pZCBFbWJlZGRlclRlc3Q6OldyaXRlQml0bWFwVG9QbmcoRlBERl9CSVRNQVAgYml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lKSB7CisgIGNvbnN0IGludCBzdHJpZGUgPSBGUERGQml0bWFwX0dldFN0cmlkZShiaXRtYXApOworICBjb25zdCBpbnQgd2lkdGggPSBGUERGQml0bWFwX0dldFdpZHRoKGJpdG1hcCk7CisgIGNvbnN0IGludCBoZWlnaHQgPSBGUERGQml0bWFwX0dldEhlaWdodChiaXRtYXApOworICBjb25zdCBhdXRvKiBidWZmZXIgPQorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KEZQREZCaXRtYXBfR2V0QnVmZmVyKGJpdG1hcCkpOworCisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+IHBuZ19lbmNvZGluZzsKKyAgYm9vbCBlbmNvZGVkID0gaW1hZ2VfZGlmZl9wbmc6OkVuY29kZUJHUkFQTkcoYnVmZmVyLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAmcG5nX2VuY29kaW5nKTsKKworICBBU1NFUlRfVFJVRShlbmNvZGVkKTsKKyAgQVNTRVJUX0xUKGZpbGVuYW1lLnNpemUoKSwgMjU2dSk7CisKKyAgc3RkOjpvZnN0cmVhbSBwbmdfZmlsZTsKKyAgcG5nX2ZpbGUub3BlbihmaWxlbmFtZSwgc3RkOjppb3NfYmFzZTo6b3V0IHwgc3RkOjppb3NfYmFzZTo6YmluYXJ5KTsKKyAgcG5nX2ZpbGUud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJnBuZ19lbmNvZGluZy5mcm9udCgpKSwKKyAgICAgICAgICAgICAgICAgcG5nX2VuY29kaW5nLnNpemUoKSk7CisgIEFTU0VSVF9UUlVFKHBuZ19maWxlLmdvb2QoKSk7CisgIHBuZ19maWxlLmNsb3NlKCk7Cit9CisjZW5kaWYKKworLy8gc3RhdGljCiB2b2lkIEVtYmVkZGVyVGVzdDo6Q29tcGFyZUJpdG1hcChGUERGX0JJVE1BUCBiaXRtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRfd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWRfbWQ1c3VtKSB7CiAgIEFTU0VSVF9FUShleHBlY3RlZF93aWR0aCwgRlBERkJpdG1hcF9HZXRXaWR0aChiaXRtYXApKTsKICAgQVNTRVJUX0VRKGV4cGVjdGVkX2hlaWdodCwgRlBERkJpdG1hcF9HZXRIZWlnaHQoYml0bWFwKSk7Ci0gIGNvbnN0IGludCBleHBlY3RlZF9zdHJpZGUgPSBleHBlY3RlZF93aWR0aCAqIDQ7CisKKyAgLy8gVGhlIGV4cGVjdGVkIHN0cmlkZSBpcyBjYWxjdWxhdGVkIHVzaW5nIHRoZSBzYW1lIGZvcm11bGEgYXMgaW4KKyAgLy8gQ0ZYX0RJQml0bWFwOjpDYWxjdWxhdGVQaXRjaEFuZFNpemUoKSwgd2hpY2ggc2V0cyB0aGUgYml0bWFwIHN0cmlkZS4KKyAgY29uc3QgaW50IGV4cGVjdGVkX3N0cmlkZSA9CisgICAgICAoZXhwZWN0ZWRfd2lkdGggKiBHZXRCaXRtYXBCeXRlc1BlclBpeGVsKGJpdG1hcCkgKiA4ICsgMzEpIC8gMzIgKiA0OwogICBBU1NFUlRfRVEoZXhwZWN0ZWRfc3RyaWRlLCBGUERGQml0bWFwX0dldFN0cmlkZShiaXRtYXApKTsKIAogICBpZiAoIWV4cGVjdGVkX21kNXN1bSkKICAgICByZXR1cm47CiAKLSAgdWludDhfdCBkaWdlc3RbMTZdOwotICBDUllQVF9NRDVHZW5lcmF0ZShzdGF0aWNfY2FzdDx1aW50OF90Kj4oRlBERkJpdG1hcF9HZXRCdWZmZXIoYml0bWFwKSksCi0gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3N0cmlkZSAqIGV4cGVjdGVkX2hlaWdodCwgZGlnZXN0KTsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX21kNXN1bSwgQ1JZUFRfVG9CYXNlMTYoZGlnZXN0KSk7CisgIEVYUEVDVF9FUShleHBlY3RlZF9tZDVzdW0sIEhhc2hCaXRtYXAoYml0bWFwKSk7CiB9CiAKLS8vIENhbid0IHVzZSBndGVzdC1wcm92aWRlZCBtYWluIHNpbmNlIHdlIG5lZWQgdG8gc3Rhc2ggdGhlIHBhdGggdG8gdGhlCi0vLyBleGVjdXRhYmxlIGluIG9yZGVyIHRvIGZpbmQgdGhlIGV4dGVybmFsIFY4IGJpbmFyeSBkYXRhIGZpbGVzLgotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gIGdfZXhlX3BhdGggPSBhcmd2WzBdOwotICB0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7Ci0gIHRlc3Rpbmc6OkluaXRHb29nbGVNb2NrKCZhcmdjLCBhcmd2KTsKLSAgaW50IHJldF92YWwgPSBSVU5fQUxMX1RFU1RTKCk7CisvLyBzdGF0aWMKK2ludCBFbWJlZGRlclRlc3Q6OldyaXRlQmxvY2tDYWxsYmFjayhGUERGX0ZJTEVXUklURSogcEZpbGVXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkgeworICBFbWJlZGRlclRlc3QqIHBUaGlzID0gc3RhdGljX2Nhc3Q8RW1iZWRkZXJUZXN0Kj4ocEZpbGVXcml0ZSk7CisgIHBUaGlzLT5tX1N0cmluZy5hcHBlbmQoc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KGRhdGEpLCBzaXplKTsKKyAgcmV0dXJuIDE7Cit9CiAKLSNpZmRlZiBQREZfRU5BQkxFX1Y4Ci0jaWZkZWYgVjhfVVNFX0VYVEVSTkFMX1NUQVJUVVBfREFUQQotICBpZiAoZ192OF9uYXRpdmVzKQotICAgIGZyZWUoY29uc3RfY2FzdDxjaGFyKj4oZ192OF9uYXRpdmVzLT5kYXRhKSk7Ci0gIGlmIChnX3Y4X3NuYXBzaG90KQotICAgIGZyZWUoY29uc3RfY2FzdDxjaGFyKj4oZ192OF9zbmFwc2hvdC0+ZGF0YSkpOwotI2VuZGlmICAvLyBWOF9VU0VfRVhURVJOQUxfU1RBUlRVUF9EQVRBCi0jZW5kaWYgIC8vIFBERl9FTkFCTEVfVjgKKy8vIHN0YXRpYworaW50IEVtYmVkZGVyVGVzdDo6R2V0QmxvY2tGcm9tU3RyaW5nKHZvaWQqIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpIHsKKyAgc3RkOjpzdHJpbmcqIG5ld19maWxlID0gc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmcqPihwYXJhbSk7CisgIGlmICghbmV3X2ZpbGUgfHwgcG9zICsgc2l6ZSA8IHBvcykKKyAgICByZXR1cm4gMDsKIAotICByZXR1cm4gcmV0X3ZhbDsKKyAgdW5zaWduZWQgbG9uZyBmaWxlX3NpemUgPSBuZXdfZmlsZS0+c2l6ZSgpOworICBpZiAocG9zICsgc2l6ZSA+IGZpbGVfc2l6ZSkKKyAgICByZXR1cm4gMDsKKworICBtZW1jcHkoYnVmLCBuZXdfZmlsZS0+ZGF0YSgpICsgcG9zLCBzaXplKTsKKyAgcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS90ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuaCBiL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdC5oCmluZGV4IGNjMGNhZWMuLjk4NDMyZTMgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdC5oCisrKyBiL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdC5oCkBAIC0xMiw3ICsxMiw5IEBACiAjaW5jbHVkZSAicHVibGljL2ZwZGZfZGF0YWF2YWlsLmgiCiAjaW5jbHVkZSAicHVibGljL2ZwZGZfZXh0LmgiCiAjaW5jbHVkZSAicHVibGljL2ZwZGZfZm9ybWZpbGwuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9zYXZlLmgiCiAjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCisjaW5jbHVkZSAidGVzdGluZy9mYWtlX2ZpbGVfYWNjZXNzLmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCiAjaW5jbHVkZSAidGVzdGluZy90ZXN0X3N1cHBvcnQuaCIKIApAQCAtMjcsNyArMjksOCBAQAogY2xhc3MgRW1iZWRkZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCwKICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBVTlNVUFBPUlRfSU5GTywKICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJUERGX0pTUExBVEZPUk0sCi0gICAgICAgICAgICAgICAgICAgICBwdWJsaWMgRlBERl9GT1JNRklMTElORk8geworICAgICAgICAgICAgICAgICAgICAgcHVibGljIEZQREZfRk9STUZJTExJTkZPLAorICAgICAgICAgICAgICAgICAgICAgcHVibGljIEZQREZfRklMRVdSSVRFIHsKICBwdWJsaWM6CiAgIGNsYXNzIERlbGVnYXRlIHsKICAgIHB1YmxpYzoKQEAgLTc4LDMyICs4MSw2NCBAQAogCiAgIC8vIENyZWF0ZSBhbiBlbXB0eSBkb2N1bWVudCwgYW5kIGl0cyBmb3JtIGZpbGwgZW52aXJvbm1lbnQuIFJldHVybnMgdHJ1ZQogICAvLyBvbiBzdWNjZXNzIG9yIGZhbHNlIG9uIGZhaWx1cmUuCi0gIHZpcnR1YWwgYm9vbCBDcmVhdGVFbXB0eURvY3VtZW50KCk7CisgIGJvb2wgQ3JlYXRlRW1wdHlEb2N1bWVudCgpOwogCiAgIC8vIE9wZW4gdGhlIGRvY3VtZW50IHNwZWNpZmllZCBieSB8ZmlsZW5hbWV8LCBhbmQgY3JlYXRlIGl0cyBmb3JtIGZpbGwKICAgLy8gZW52aXJvbm1lbnQsIG9yIHJldHVybiBmYWxzZSBvbiBmYWlsdXJlLgogICAvLyBUaGUgZmlsZW5hbWUgaXMgcmVsYXRpdmUgdG8gdGhlIHRlc3QgZGF0YSBkaXJlY3Rvcnkgd2hlcmUgd2Ugc3RvcmUgYWxsIHRoZQogICAvLyB0ZXN0IGZpbGVzLgotICB2aXJ0dWFsIGJvb2wgT3BlbkRvY3VtZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXNzd29yZCA9IG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtdXN0X2xpbmVhcml6ZSA9IGZhbHNlKTsKKyAgLy8gfHBhc3N3b3JkfCBjYW4gYmUgbnVsbHB0ciBpZiB0aGVyZSBpcyBub25lLgorICB2aXJ0dWFsIGJvb2wgT3BlbkRvY3VtZW50V2l0aE9wdGlvbnMoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG11c3RfbGluZWFyaXplKTsKKworICAvLyBWYXJpYW50cyBwcm92aWRlZCBmb3IgY29udmVuaWVuY2UuCisgIGJvb2wgT3BlbkRvY3VtZW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSk7CisgIGJvb2wgT3BlbkRvY3VtZW50TGluZWFyaXplZChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUpOworICBib29sIE9wZW5Eb2N1bWVudFdpdGhQYXNzd29yZChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhc3N3b3JkKTsKIAogICAvLyBQZXJmb3JtIEphdmFTY3JpcHQgYWN0aW9ucyB0aGF0IGFyZSB0byBydW4gYXQgZG9jdW1lbnQgb3BlbiB0aW1lLgotICB2aXJ0dWFsIHZvaWQgRG9PcGVuQWN0aW9ucygpOworICB2b2lkIERvT3BlbkFjdGlvbnMoKTsKIAogICAvLyBEZXRlcm1pbmUgdGhlIHBhZ2UgbnVtYmVycyBwcmVzZW50IGluIHRoZSBkb2N1bWVudC4KLSAgdmlydHVhbCBpbnQgR2V0Rmlyc3RQYWdlTnVtKCk7Ci0gIHZpcnR1YWwgaW50IEdldFBhZ2VDb3VudCgpOworICBpbnQgR2V0Rmlyc3RQYWdlTnVtKCk7CisgIGludCBHZXRQYWdlQ291bnQoKTsKIAogICAvLyBMb2FkIGEgc3BlY2lmaWMgcGFnZSBvZiB0aGUgb3BlbiBkb2N1bWVudC4KLSAgdmlydHVhbCBGUERGX1BBR0UgTG9hZFBhZ2UoaW50IHBhZ2VfbnVtYmVyKTsKKyAgRlBERl9QQUdFIExvYWRQYWdlKGludCBwYWdlX251bWJlcik7CiAKICAgLy8gQ29udmVydCBhIGxvYWRlZCBwYWdlIGludG8gYSBiaXRtYXAuCi0gIHZpcnR1YWwgRlBERl9CSVRNQVAgUmVuZGVyUGFnZShGUERGX1BBR0UgcGFnZSk7CisgIEZQREZfQklUTUFQIFJlbmRlclBhZ2UoRlBERl9QQUdFIHBhZ2UpOworCisgIC8vIENvbnZlcnQgYSBsb2FkZWQgcGFnZSBpbnRvIGEgYml0bWFwIHdpdGggcGFnZSByZW5kZXJpbmcgZmxhZ3Mgc3BlY2lmaWVkLgorICAvLyBTZWUgcHVibGljL2ZwZGZ2aWV3LmggZm9yIGEgbGlzdCBvZiBwYWdlIHJlbmRlcmluZyBmbGFncy4KKyAgRlBERl9CSVRNQVAgUmVuZGVyUGFnZVdpdGhGbGFncyhGUERGX1BBR0UgcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0ZPUk1IQU5ETEUgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7CiAKICAgLy8gUmVsZXNlIHRoZSByZXNvdXJjZXMgb2J0YWluZWQgZnJvbSBMb2FkUGFnZSgpLiBGdXJ0aGVyIHVzZSBvZiB8cGFnZXwKICAgLy8gaXMgcHJvaGliaXRlZCBhZnRlciB0aGlzIGNhbGwgaXMgbWFkZS4KLSAgdmlydHVhbCB2b2lkIFVubG9hZFBhZ2UoRlBERl9QQUdFIHBhZ2UpOworICB2b2lkIFVubG9hZFBhZ2UoRlBERl9QQUdFIHBhZ2UpOworCisgcHJvdGVjdGVkOgorICBib29sIE9wZW5Eb2N1bWVudEhlbHBlcihjb25zdCBjaGFyKiBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtdXN0X2xpbmVhcml6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRmFrZUZpbGVBY2Nlc3MqIG5ldHdvcmtfc2ltdWxhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGUERGX0RPQ1VNRU5UKiBkb2N1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9BVkFJTCogYXZhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZQREZfRk9STUhBTkRMRSogZm9ybV9oYW5kbGUpOworCisgIEZQREZfRk9STUhBTkRMRSBTZXR1cEZvcm1GaWxsRW52aXJvbm1lbnQoRlBERl9ET0NVTUVOVCBkb2MpOworCisgIC8vIFJldHVybiB0aGUgaGFzaCBvZiB8Yml0bWFwfC4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIEhhc2hCaXRtYXAoRlBERl9CSVRNQVAgYml0bWFwKTsKKworI2lmbmRlZiBOREVCVUcKKyAgLy8gRm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyAgLy8gV3JpdGUgfGJpdG1hcHwgdG8gYSBwbmcgZmlsZS4KKyAgc3RhdGljIHZvaWQgV3JpdGVCaXRtYXBUb1BuZyhGUERGX0JJVE1BUCBiaXRtYXAsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlbmFtZSk7CisjZW5kaWYKIAogICAvLyBDaGVjayB8Yml0bWFwfCB0byBtYWtlIHN1cmUgaXQgaGFzIHRoZSByaWdodCBkaW1lbnNpb25zIGFuZCBjb250ZW50LgogICBzdGF0aWMgdm9pZCBDb21wYXJlQml0bWFwKEZQREZfQklUTUFQIGJpdG1hcCwKQEAgLTExMSwyNiArMTQ2LDQ2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkX2hlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9tZDVzdW0pOwogCi0gcHJvdGVjdGVkOgotICB2b2lkIFNldHVwRm9ybUZpbGxFbnZpcm9ubWVudCgpOworICB2b2lkIENsZWFyU3RyaW5nKCkgeyBtX1N0cmluZy5jbGVhcigpOyB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nJiBHZXRTdHJpbmcoKSBjb25zdCB7IHJldHVybiBtX1N0cmluZzsgfQorCisgIHN0YXRpYyBpbnQgR2V0QmxvY2tGcm9tU3RyaW5nKHZvaWQqIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpOworCisgIEZQREZfRE9DVU1FTlQgT3BlblNhdmVkRG9jdW1lbnQoY29uc3QgY2hhciogcGFzc3dvcmQgPSBudWxscHRyKTsKKyAgdm9pZCBDbG9zZVNhdmVkRG9jdW1lbnQoKTsKKyAgRlBERl9QQUdFIExvYWRTYXZlZFBhZ2UoaW50IHBhZ2VfbnVtYmVyKTsKKyAgRlBERl9CSVRNQVAgUmVuZGVyU2F2ZWRQYWdlKEZQREZfUEFHRSBwYWdlKTsKKyAgdm9pZCBDbG9zZVNhdmVkUGFnZShGUERGX1BBR0UgcGFnZSk7CisgIHZvaWQgVmVyaWZ5U2F2ZWRSZW5kZXJpbmcoRlBERl9QQUdFIHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWQ1KTsKKyAgdm9pZCBWZXJpZnlTYXZlZERvY3VtZW50KGludCB3aWR0aCwgaW50IGhlaWdodCwgY29uc3QgY2hhciogbWQ1KTsKKworICB2b2lkIFNldFdob2xlRmlsZUF2YWlsYWJsZSgpOwogCiAgIERlbGVnYXRlKiBkZWxlZ2F0ZV87CiAgIHN0ZDo6dW5pcXVlX3B0cjxEZWxlZ2F0ZT4gZGVmYXVsdF9kZWxlZ2F0ZV87CiAgIEZQREZfRE9DVU1FTlQgZG9jdW1lbnRfOwogICBGUERGX0ZPUk1IQU5ETEUgZm9ybV9oYW5kbGVfOwogICBGUERGX0FWQUlMIGF2YWlsXzsKLSAgRlhfRE9XTkxPQURISU5UUyBoaW50c187Ci0gIEZQREZfRklMRUFDQ0VTUyBmaWxlX2FjY2Vzc187Ci0gIEZYX0ZJTEVBVkFJTCBmaWxlX2F2YWlsXzsKLSNpZmRlZiBQREZfRU5BQkxFX1Y4Ci0gIHY4OjpQbGF0Zm9ybSogcGxhdGZvcm1fOwotI2VuZGlmICAvLyBQREZfRU5BQkxFX1Y4CisgIEZQREZfRklMRUFDQ0VTUyBmaWxlX2FjY2Vzc187ICAvLyBtdXN0IG91dGxpdmUgYXZhaWxfLgogICB2b2lkKiBleHRlcm5hbF9pc29sYXRlXzsKICAgVGVzdExvYWRlciogbG9hZGVyXzsKICAgc2l6ZV90IGZpbGVfbGVuZ3RoXzsKICAgc3RkOjp1bmlxdWVfcHRyPGNoYXIsIHBkZml1bTo6RnJlZURlbGV0ZXI+IGZpbGVfY29udGVudHNfOwogICBzdGQ6Om1hcDxpbnQsIEZQREZfUEFHRT4gcGFnZV9tYXBfOwogICBzdGQ6Om1hcDxGUERGX1BBR0UsIGludD4gcGFnZV9yZXZlcnNlX21hcF87CisgIEZQREZfRE9DVU1FTlQgbV9TYXZlZERvY3VtZW50OworICBGUERGX0ZPUk1IQU5ETEUgbV9TYXZlZEZvcm07CisgIEZQREZfQVZBSUwgbV9TYXZlZEF2YWlsOworICBGUERGX0ZJTEVBQ0NFU1Mgc2F2ZWRfZmlsZV9hY2Nlc3NfOyAgLy8gbXVzdCBvdXRsaXZlIG1fU2F2ZWRBdmFpbC4KKyAgc3RkOjp1bmlxdWVfcHRyPEZha2VGaWxlQWNjZXNzPiBmYWtlX2ZpbGVfYWNjZXNzXzsgIC8vIG11c3Qgb3V0bGl2ZSBhdmFpbF8uCisgIHN0ZDo6dW5pcXVlX3B0cjxGYWtlRmlsZUFjY2Vzcz4KKyAgICAgIHNhdmVkX2Zha2VfZmlsZV9hY2Nlc3NfOyAgLy8gbXVzdCBvdXRsaXZlIG1fU2F2ZWRBdmFpbC4KIAogIHByaXZhdGU6CiAgIHN0YXRpYyB2b2lkIFVuc3VwcG9ydGVkSGFuZGxlclRyYW1wb2xpbmUoVU5TVVBQT1JUX0lORk8qLCBpbnQgdHlwZSk7CkBAIC0xNDYsNiArMjAxLDExIEBACiAgIHN0YXRpYyBGUERGX1BBR0UgR2V0UGFnZVRyYW1wb2xpbmUoRlBERl9GT1JNRklMTElORk8qIGluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBERl9ET0NVTUVOVCBkb2N1bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFnZV9pbmRleCk7CisgIHN0YXRpYyBpbnQgV3JpdGVCbG9ja0NhbGxiYWNrKEZQREZfRklMRVdSSVRFKiBwRmlsZVdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpOworCisgIHN0ZDo6c3RyaW5nIG1fU3RyaW5nOwogfTsKIAogI2VuZGlmICAvLyBURVNUSU5HX0VNQkVEREVSX1RFU1RfSF8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdF9tYWluLmNwcCBiL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdF9tYWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGU2MTE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9lbWJlZGRlcl90ZXN0X21haW4uY3BwCkBAIC0wLDAgKzEsOTQgQEAKKy8vIENvcHlyaWdodCAyMDE4IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCisjaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy90ZXN0X3N1cHBvcnQuaCIKKworI2lmZGVmIFBERl9FTkFCTEVfVjgKKyNpbmNsdWRlICJ2OC9pbmNsdWRlL3Y4LXBsYXRmb3JtLmgiCisjaW5jbHVkZSAidjgvaW5jbHVkZS92OC5oIgorI2VuZGlmICAvLyBQREZfRU5BQkxFX3Y4CisKK25hbWVzcGFjZSB7CisKK2NvbnN0IGNoYXIqIGdfZXhlX3BhdGggPSBudWxscHRyOworCisjaWZkZWYgUERGX0VOQUJMRV9WOAorI2lmZGVmIFY4X1VTRV9FWFRFUk5BTF9TVEFSVFVQX0RBVEEKK3Y4OjpTdGFydHVwRGF0YSogZ192OF9uYXRpdmVzID0gbnVsbHB0cjsKK3Y4OjpTdGFydHVwRGF0YSogZ192OF9zbmFwc2hvdCA9IG51bGxwdHI7CisjZW5kaWYgIC8vIFY4X1VTRV9FWFRFUk5BTF9TVEFSVFVQX0RBVEEKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9WOAorCisvLyBUaGUgbG9hZGluZyB0aW1lIG9mIHRoZSBDRkdBU19Gb250TWdyIGlzIGxpbmVhciBpbiB0aGUgbnVtYmVyIG9mIHRpbWVzIGl0IGlzCisvLyBsb2FkZWQuIFNvLCBpZiBhIHRlc3Qgc3VpdGUgaGFzIGEgbG90IG9mIHRlc3RzIHRoYXQgbmVlZCBhIGZvbnQgbWFuYWdlciB0aGV5CisvLyBjYW4gZW5kIHVwIGV4ZWN1dGluZyB2ZXJ5LCB2ZXJ5IHNsb3dseS4KK2NsYXNzIEVudmlyb25tZW50IDogcHVibGljIHRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyBwdWJsaWM6CisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisjaWZkZWYgUERGX0VOQUJMRV9WOAorI2lmZGVmIFY4X1VTRV9FWFRFUk5BTF9TVEFSVFVQX0RBVEEKKyAgICBpZiAoZ192OF9uYXRpdmVzICYmIGdfdjhfc25hcHNob3QpIHsKKyAgICAgIEluaXRpYWxpemVWOEZvclBERml1bShnX2V4ZV9wYXRoLCBzdGQ6OnN0cmluZygpLCBudWxscHRyLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwbGF0Zm9ybV8pOworICAgIH0gZWxzZSB7CisgICAgICBnX3Y4X25hdGl2ZXMgPSBuZXcgdjg6OlN0YXJ0dXBEYXRhOworICAgICAgZ192OF9zbmFwc2hvdCA9IG5ldyB2ODo6U3RhcnR1cERhdGE7CisgICAgICBJbml0aWFsaXplVjhGb3JQREZpdW0oZ19leGVfcGF0aCwgc3RkOjpzdHJpbmcoKSwgZ192OF9uYXRpdmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfdjhfc25hcHNob3QsICZwbGF0Zm9ybV8pOworICAgIH0KKyNlbHNlCisgICAgSW5pdGlhbGl6ZVY4Rm9yUERGaXVtKGdfZXhlX3BhdGgsICZwbGF0Zm9ybV8pOworI2VuZGlmICAvLyBWOF9VU0VfRVhURVJOQUxfU1RBUlRVUF9EQVRBCisjZW5kaWYgIC8vIEZQREZfRU5BQkxFX1Y4CisgIH0KKworICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworI2lmZGVmIFBERl9FTkFCTEVfVjgKKyAgICB2ODo6Vjg6OlNodXRkb3duUGxhdGZvcm0oKTsKKyAgICBkZWxldGUgcGxhdGZvcm1fOworI2VuZGlmICAvLyBQREZfRU5BQkxFX1Y4CisgIH0KKworIHByaXZhdGU6CisjaWZkZWYgUERGX0VOQUJMRV9WOAorICB2ODo6UGxhdGZvcm0qIHBsYXRmb3JtXzsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9WOAorfTsKKworRW52aXJvbm1lbnQqIGVudl8gPSBudWxscHRyOworCit9ICAvLyBuYW1lc3BhY2UKKworLy8gQ2FuJ3QgdXNlIGd0ZXN0LXByb3ZpZGVkIG1haW4gc2luY2Ugd2UgbmVlZCB0byBzdGFzaCB0aGUgcGF0aCB0byB0aGUKKy8vIGV4ZWN1dGFibGUgaW4gb3JkZXIgdG8gZmluZCB0aGUgZXh0ZXJuYWwgVjggYmluYXJ5IGRhdGEgZmlsZXMuCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgZ19leGVfcGF0aCA9IGFyZ3ZbMF07CisKKyAgRlhNRU1fSW5pdGlhbGl6ZVBhcnRpdGlvbkFsbG9jKCk7CisKKyAgZW52XyA9IG5ldyBFbnZpcm9ubWVudCgpOworICAvLyBUaGUgZW52IHdpbGwgYmUgZGVsZXRlZCBieSBndGVzdC4KKyAgQWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGVudl8pOworCisgIHRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgdGVzdGluZzo6SW5pdEdvb2dsZU1vY2soJmFyZ2MsIGFyZ3YpOworCisgIGludCByZXRfdmFsID0gUlVOX0FMTF9URVNUUygpOworCisjaWZkZWYgUERGX0VOQUJMRV9WOAorI2lmZGVmIFY4X1VTRV9FWFRFUk5BTF9TVEFSVFVQX0RBVEEKKyAgaWYgKGdfdjhfbmF0aXZlcykKKyAgICBmcmVlKGNvbnN0X2Nhc3Q8Y2hhcio+KGdfdjhfbmF0aXZlcy0+ZGF0YSkpOworICBpZiAoZ192OF9zbmFwc2hvdCkKKyAgICBmcmVlKGNvbnN0X2Nhc3Q8Y2hhcio+KGdfdjhfc25hcHNob3QtPmRhdGEpKTsKKyNlbmRpZiAgLy8gVjhfVVNFX0VYVEVSTkFMX1NUQVJUVVBfREFUQQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1Y4CisKKyAgcmV0dXJuIHJldF92YWw7Cit9CmRpZmYgLS1naXQgYS90ZXN0aW5nL2Zha2VfZmlsZV9hY2Nlc3MuY3BwIGIvdGVzdGluZy9mYWtlX2ZpbGVfYWNjZXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjlmMjc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9mYWtlX2ZpbGVfYWNjZXNzLmNwcApAQCAtMCwwICsxLDExNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAidGVzdGluZy9mYWtlX2ZpbGVfYWNjZXNzLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NsYXNzIEZpbGVBY2Nlc3NXcmFwcGVyIDogcHVibGljIEZQREZfRklMRUFDQ0VTUyB7CisgcHVibGljOgorICBleHBsaWNpdCBGaWxlQWNjZXNzV3JhcHBlcihGYWtlRmlsZUFjY2Vzcyogc2ltdWxhdG9yKQorICAgICAgOiBzaW11bGF0b3JfKHNpbXVsYXRvcikgeworICAgIG1fRmlsZUxlbiA9IHNpbXVsYXRvcl8tPkdldEZpbGVTaXplKCk7CisgICAgbV9HZXRCbG9jayA9ICZHZXRCbG9ja0ltcGw7CisgICAgbV9QYXJhbSA9IHRoaXM7CisgIH0KKworICBzdGF0aWMgaW50IEdldEJsb2NrSW1wbCh2b2lkKiBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogcEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzaXplKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEZpbGVBY2Nlc3NXcmFwcGVyKj4ocGFyYW0pLT5zaW11bGF0b3JfLT5HZXRCbG9jaygKKyAgICAgICAgcG9zaXRpb24sIHBCdWYsIHNpemUpOworICB9CisKKyBwcml2YXRlOgorICBmeGNydDo6VW5vd25lZFB0cjxGYWtlRmlsZUFjY2Vzcz4gc2ltdWxhdG9yXzsKK307CisKK2NsYXNzIEZpbGVBdmFpbEltcGwgOiBwdWJsaWMgRlhfRklMRUFWQUlMIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEZpbGVBdmFpbEltcGwoRmFrZUZpbGVBY2Nlc3MqIHNpbXVsYXRvcikgOiBzaW11bGF0b3JfKHNpbXVsYXRvcikgeworICAgIHZlcnNpb24gPSAxOworICAgIElzRGF0YUF2YWlsID0gJklzRGF0YUF2YWlsSW1wbDsKKyAgfQorCisgIHN0YXRpYyBGUERGX0JPT0wgSXNEYXRhQXZhaWxJbXBsKEZYX0ZJTEVBVkFJTCogcFRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEZpbGVBdmFpbEltcGwqPihwVGhpcyktPnNpbXVsYXRvcl8tPklzRGF0YUF2YWlsKG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisgIH0KKworIHByaXZhdGU6CisgIGZ4Y3J0OjpVbm93bmVkUHRyPEZha2VGaWxlQWNjZXNzPiBzaW11bGF0b3JfOworfTsKKworY2xhc3MgRG93bmxvYWRIaW50c0ltcGwgOiBwdWJsaWMgRlhfRE9XTkxPQURISU5UUyB7CisgcHVibGljOgorICBleHBsaWNpdCBEb3dubG9hZEhpbnRzSW1wbChGYWtlRmlsZUFjY2Vzcyogc2ltdWxhdG9yKQorICAgICAgOiBzaW11bGF0b3JfKHNpbXVsYXRvcikgeworICAgIHZlcnNpb24gPSAxOworICAgIEFkZFNlZ21lbnQgPSAmQWRkU2VnbWVudEltcGw7CisgIH0KKworICBzdGF0aWMgdm9pZCBBZGRTZWdtZW50SW1wbChGWF9ET1dOTE9BREhJTlRTKiBwVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RG93bmxvYWRIaW50c0ltcGwqPihwVGhpcyktPnNpbXVsYXRvcl8tPkFkZFNlZ21lbnQoCisgICAgICAgIG9mZnNldCwgc2l6ZSk7CisgIH0KKworIHByaXZhdGU6CisgIGZ4Y3J0OjpVbm93bmVkUHRyPEZha2VGaWxlQWNjZXNzPiBzaW11bGF0b3JfOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK0Zha2VGaWxlQWNjZXNzOjpGYWtlRmlsZUFjY2VzcyhGUERGX0ZJTEVBQ0NFU1MqIGZpbGVfYWNjZXNzKQorICAgIDogZmlsZV9hY2Nlc3NfKGZpbGVfYWNjZXNzKSwKKyAgICAgIGZpbGVfYWNjZXNzX3dyYXBwZXJfKHBkZml1bTo6TWFrZVVuaXF1ZTxGaWxlQWNjZXNzV3JhcHBlcj4odGhpcykpLAorICAgICAgZmlsZV9hdmFpbF8ocGRmaXVtOjpNYWtlVW5pcXVlPEZpbGVBdmFpbEltcGw+KHRoaXMpKSwKKyAgICAgIGRvd25sb2FkX2hpbnRzXyhwZGZpdW06Ok1ha2VVbmlxdWU8RG93bmxvYWRIaW50c0ltcGw+KHRoaXMpKSB7CisgIEFTU0VSVChmaWxlX2FjY2Vzc18pOworfQorCitGYWtlRmlsZUFjY2Vzczo6fkZha2VGaWxlQWNjZXNzKCkge30KKworRlBERl9CT09MIEZha2VGaWxlQWNjZXNzOjpJc0RhdGFBdmFpbChzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgY29uc3QgeworICByZXR1cm4gYXZhaWxhYmxlX2RhdGFfLkNvbnRhaW5zKFJhbmdlU2V0OjpSYW5nZShvZmZzZXQsIG9mZnNldCArIHNpemUpKTsKK30KKwordm9pZCBGYWtlRmlsZUFjY2Vzczo6QWRkU2VnbWVudChzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICByZXF1ZXN0ZWRfZGF0YV8uVW5pb24oUmFuZ2VTZXQ6OlJhbmdlKG9mZnNldCwgb2Zmc2V0ICsgc2l6ZSkpOworfQorCit1bnNpZ25lZCBsb25nIEZha2VGaWxlQWNjZXNzOjpHZXRGaWxlU2l6ZSgpIHsKKyAgcmV0dXJuIGZpbGVfYWNjZXNzXy0+bV9GaWxlTGVuOworfQorCitpbnQgRmFrZUZpbGVBY2Nlc3M6OkdldEJsb2NrKHVuc2lnbmVkIGxvbmcgcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkgeworICBpZiAoIUlzRGF0YUF2YWlsKHN0YXRpY19jYXN0PHNpemVfdD4ocG9zaXRpb24pLCBzdGF0aWNfY2FzdDxzaXplX3Q+KHNpemUpKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBmaWxlX2FjY2Vzc18tPm1fR2V0QmxvY2soZmlsZV9hY2Nlc3NfLT5tX1BhcmFtLCBwb3NpdGlvbiwgcEJ1Ziwgc2l6ZSk7Cit9CisKK3ZvaWQgRmFrZUZpbGVBY2Nlc3M6OlNldFJlcXVlc3RlZERhdGFBdmFpbGFibGUoKSB7CisgIGF2YWlsYWJsZV9kYXRhXy5VbmlvbihyZXF1ZXN0ZWRfZGF0YV8pOworICByZXF1ZXN0ZWRfZGF0YV8uQ2xlYXIoKTsKK30KKwordm9pZCBGYWtlRmlsZUFjY2Vzczo6U2V0V2hvbGVGaWxlQXZhaWxhYmxlKCkgeworICBhdmFpbGFibGVfZGF0YV8uVW5pb24oUmFuZ2VTZXQ6OlJhbmdlKDAsIHN0YXRpY19jYXN0PHNpemVfdD4oR2V0RmlsZVNpemUoKSkpKTsKKyAgcmVxdWVzdGVkX2RhdGFfLkNsZWFyKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0aW5nL2Zha2VfZmlsZV9hY2Nlc3MuaCBiL3Rlc3RpbmcvZmFrZV9maWxlX2FjY2Vzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMjhiMTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL2Zha2VfZmlsZV9hY2Nlc3MuaApAQCAtMCwwICsxLDQyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgVEVTVElOR19GQUtFX0ZJTEVfQUNDRVNTX0hfCisjZGVmaW5lIFRFU1RJTkdfRkFLRV9GSUxFX0FDQ0VTU19IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2RhdGFhdmFpbC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmdmlldy5oIgorI2luY2x1ZGUgInRlc3RpbmcvcmFuZ2Vfc2V0LmgiCisKK2NsYXNzIEZha2VGaWxlQWNjZXNzIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEZha2VGaWxlQWNjZXNzKEZQREZfRklMRUFDQ0VTUyogZmlsZV9hY2Nlc3MpOworICB+RmFrZUZpbGVBY2Nlc3MoKTsKKworICBGUERGX0ZJTEVBQ0NFU1MqIEdldEZpbGVBY2Nlc3MoKSBjb25zdCB7IHJldHVybiBmaWxlX2FjY2Vzc193cmFwcGVyXy5nZXQoKTsgfQorICBGWF9GSUxFQVZBSUwqIEdldEZpbGVBdmFpbCgpIGNvbnN0IHsgcmV0dXJuIGZpbGVfYXZhaWxfLmdldCgpOyB9CisgIEZYX0RPV05MT0FESElOVFMqIEdldERvd25sb2FkSGludHMoKSBjb25zdCB7IHJldHVybiBkb3dubG9hZF9oaW50c18uZ2V0KCk7IH0KKworICBGUERGX0JPT0wgSXNEYXRhQXZhaWwoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIGNvbnN0OworICB2b2lkIEFkZFNlZ21lbnQoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpOworCisgIHVuc2lnbmVkIGxvbmcgR2V0RmlsZVNpemUoKTsKKworICBpbnQgR2V0QmxvY2sodW5zaWduZWQgbG9uZyBwb3NpdGlvbiwgdW5zaWduZWQgY2hhciogcEJ1ZiwgdW5zaWduZWQgbG9uZyBzaXplKTsKKyAgdm9pZCBTZXRSZXF1ZXN0ZWREYXRhQXZhaWxhYmxlKCk7CisgIHZvaWQgU2V0V2hvbGVGaWxlQXZhaWxhYmxlKCk7CisKKyBwcml2YXRlOgorICBmeGNydDo6VW5vd25lZFB0cjxGUERGX0ZJTEVBQ0NFU1M+IGZpbGVfYWNjZXNzXzsKKyAgc3RkOjp1bmlxdWVfcHRyPEZQREZfRklMRUFDQ0VTUz4gZmlsZV9hY2Nlc3Nfd3JhcHBlcl87CisgIHN0ZDo6dW5pcXVlX3B0cjxGWF9GSUxFQVZBSUw+IGZpbGVfYXZhaWxfOworICBzdGQ6OnVuaXF1ZV9wdHI8RlhfRE9XTkxPQURISU5UUz4gZG93bmxvYWRfaGludHNfOworICBSYW5nZVNldCBhdmFpbGFibGVfZGF0YV87CisgIFJhbmdlU2V0IHJlcXVlc3RlZF9kYXRhXzsKK307CisKKyNlbmRpZiAgLy8gVEVTVElOR19GQUtFX0ZJTEVfQUNDRVNTX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2Z4X3N0cmluZ190ZXN0aGVscGVycy5jcHAgYi90ZXN0aW5nL2Z4X3N0cmluZ190ZXN0aGVscGVycy5jcHAKaW5kZXggOTM0ZGQ2OC4uNDQzY2M4OSAxMDA2NDQKLS0tIGEvdGVzdGluZy9meF9zdHJpbmdfdGVzdGhlbHBlcnMuY3BwCisrKyBiL3Rlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmNwcApAQCAtNiw0MyArNiwxMyBAQAogCiAjaW5jbHVkZSA8aW9tYW5pcD4KICNpbmNsdWRlIDxpb3M+CisjaW5jbHVkZSA8c3RyaW5nPgogCi1uYW1lc3BhY2UgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0ZDo6b3N0cmVhbSYgb3V0cHV0X3N0cmluZyhzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgVCYgc3RyKSB7Ci0gIG91dCA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNldGZpbGwoJzAnKSA8PCAnIic7Ci0gIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgRlggc3RyaW5ncyB3aG9zZSBsZW5ndGggaXMgZGVmaW5lZCBhcyBpbnQuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLkdldExlbmd0aCgpOyArK2kpIHsKLSAgICB1bnNpZ25lZCBpbnQgYyA9IHN0ci5HZXRBdChpKTsKLSAgICBpZiAoYyA+PSAweDIwICYmIGMgPCAweDdGKSB7Ci0gICAgICBvdXQgPDwgc3RhdGljX2Nhc3Q8Y2hhcj4oYyk7Ci0gICAgfSBlbHNlIGlmIChzaXplb2YodHlwZW5hbWUgVDo6Q2hhclR5cGUpID09IDEpIHsKLSAgICAgIG91dCA8PCAiXFx4IiA8PCBzdGQ6OnNldHcoMikgPDwgYyA8PCBzdGQ6OnNldHcoMCk7Ci0gICAgfSBlbHNlIGlmIChjIDwgMHgxMDAwMCkgewotICAgICAgb3V0IDw8ICJcXHUiIDw8IHN0ZDo6c2V0dyg0KSA8PCBjIDw8IHN0ZDo6c2V0dygwKTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICI8aW52YWxpZD4iOwotICAgIH0KLSAgfQotICBvdXQgPDwgJyInIDw8IHN0ZDo6ZGVjIDw8IHN0ZDo6c2V0ZmlsbCgnICcpOwotICByZXR1cm4gb3V0OwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cikgewotICByZXR1cm4gb3V0cHV0X3N0cmluZyhvdXQsIHN0cik7Ci19Ci0KLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0cikgewotICByZXR1cm4gb3V0cHV0X3N0cmluZyhvdXQsIHN0cik7Ci19Ci0KLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIpIHsKLSAgcmV0dXJuIG91dHB1dF9zdHJpbmcob3V0LCBzdHIpOwotfQotCi1zdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvdXQsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKLSAgcmV0dXJuIG91dHB1dF9zdHJpbmcob3V0LCBzdHIpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IENGWF9EYXRlVGltZSYgZHQpIHsKKyAgb3MgPDwgZHQuR2V0WWVhcigpIDw8ICItIiA8PCBzdGQ6OnRvX3N0cmluZyhkdC5HZXRNb250aCgpKSA8PCAiLSIKKyAgICAgPDwgc3RkOjp0b19zdHJpbmcoZHQuR2V0RGF5KCkpIDw8ICIgIiA8PCBzdGQ6OnRvX3N0cmluZyhkdC5HZXRIb3VyKCkpCisgICAgIDw8ICI6IiA8PCBzdGQ6OnRvX3N0cmluZyhkdC5HZXRNaW51dGUoKSkgPDwgIjoiCisgICAgIDw8IHN0ZDo6dG9fc3RyaW5nKGR0LkdldFNlY29uZCgpKSA8PCAiLiIKKyAgICAgPDwgc3RkOjp0b19zdHJpbmcoZHQuR2V0TWlsbGlzZWNvbmQoKSk7CisgIHJldHVybiBvczsKIH0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmggYi90ZXN0aW5nL2Z4X3N0cmluZ190ZXN0aGVscGVycy5oCmluZGV4IDgyNTUyZDcuLjVhMjY5YTMgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvZnhfc3RyaW5nX3Rlc3RoZWxwZXJzLmgKKysrIGIvdGVzdGluZy9meF9zdHJpbmdfdGVzdGhlbHBlcnMuaApAQCAtNywxMiArNyw1OSBAQAogCiAjaW5jbHVkZSA8b3N0cmVhbT4KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfZGF0ZXRpbWUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmVhbS5oIgogCi0vLyBPdXRwdXQgc3RyZWFtIG9wZXJhdG9yIHNvIEdURVNUIG1hY3JvcyB3b3JrIHdpdGggRlggc3RyaW5ncy4KLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzdHIpOwotc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyKTsKLXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG91dCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIpOwotc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3V0LCBjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKTsKKy8vIE91dHB1dCBzdHJlYW0gb3BlcmF0b3Igc28gR1RFU1QgbWFjcm9zIHdvcmsgd2l0aCBDRlhfRGF0ZVRpbWUgb2JqZWN0cy4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDRlhfRGF0ZVRpbWUmIGR0KTsKKworY2xhc3MgQ0ZYX0ludmFsaWRTZWVrYWJsZVJlYWRTdHJlYW0gOiBwdWJsaWMgSUZYX1NlZWthYmxlUmVhZFN0cmVhbSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KKyAgZnJpZW5kIFJldGFpblB0cjxUPiBwZGZpdW06Ok1ha2VSZXRhaW4oQXJncyYmLi4uIGFyZ3MpOworCisgIC8vIElGWF9TZWVrYWJsZVJlYWRTdHJlYW0gb3ZlcnJpZGVzOgorICBib29sIFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgRlhfRklMRVNJWkUgR2V0U2l6ZSgpIG92ZXJyaWRlIHsgcmV0dXJuIGRhdGFfc2l6ZV87IH0KKworIHByaXZhdGU6CisgIGV4cGxpY2l0IENGWF9JbnZhbGlkU2Vla2FibGVSZWFkU3RyZWFtKEZYX0ZJTEVTSVpFIGRhdGFfc2l6ZSkKKyAgICAgIDogZGF0YV9zaXplXyhkYXRhX3NpemUpIHt9CisKKyAgRlhfRklMRVNJWkUgZGF0YV9zaXplXzsKK307CisKK2NsYXNzIENGWF9CdWZmZXJTZWVrYWJsZVJlYWRTdHJlYW0gOiBwdWJsaWMgSUZYX1NlZWthYmxlUmVhZFN0cmVhbSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KKyAgZnJpZW5kIFJldGFpblB0cjxUPiBwZGZpdW06Ok1ha2VSZXRhaW4oQXJncyYmLi4uIGFyZ3MpOworCisgIC8vIElGWF9TZWVrYWJsZVJlYWRTdHJlYW06CisgIGJvb2wgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGUgeworICAgIGlmIChvZmZzZXQgPCAwIHx8IHN0YXRpY19jYXN0PHNpemVfdD4ob2Zmc2V0KSA+PSBkYXRhX3NpemVfKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4ob2Zmc2V0KSArIHNpemUgPiBkYXRhX3NpemVfKQorICAgICAgc2l6ZSA9IGRhdGFfc2l6ZV8gLSBzdGF0aWNfY2FzdDxzaXplX3Q+KG9mZnNldCk7CisgICAgaWYgKHNpemUgPT0gMCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIG1lbWNweShidWZmZXIsIGRhdGFfICsgb2Zmc2V0LCBzaXplKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEZYX0ZJTEVTSVpFIEdldFNpemUoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihkYXRhX3NpemVfKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgQ0ZYX0J1ZmZlclNlZWthYmxlUmVhZFN0cmVhbShjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmMsIHNpemVfdCBzcmNfc2l6ZSkKKyAgICAgIDogZGF0YV8oc3JjKSwgZGF0YV9zaXplXyhzcmNfc2l6ZSkge30KKworICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhXzsKKyAgc2l6ZV90IGRhdGFfc2l6ZV87Cit9OwogCiAjZW5kaWYgIC8vIFRFU1RJTkdfRlhfU1RSSU5HX1RFU1RIRUxQRVJTX0hfCmRpZmYgLS1naXQgYS90ZXN0aW5nL2ltYWdlX2RpZmYvREVQUyBiL3Rlc3RpbmcvaW1hZ2VfZGlmZi9ERVBTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZDIzMzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL2ltYWdlX2RpZmYvREVQUwpAQCAtMCwwICsxLDUgQEAKK2luY2x1ZGVfcnVsZXMgPSBbCisgICcrdGhpcmRfcGFydHkvbGlicG5nMTYnLAorICAnK3RoaXJkX3BhcnR5L3psaWInLAorXQorCmRpZmYgLS1naXQgYS90ZXN0aW5nL2ltYWdlX2RpZmYvaW1hZ2VfZGlmZi5jcHAgYi90ZXN0aW5nL2ltYWdlX2RpZmYvaW1hZ2VfZGlmZi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA2ZTBjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvaW1hZ2VfZGlmZi9pbWFnZV9kaWZmLmNwcApAQCAtMCwwICsxLDMzNiBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVGhpcyBmaWxlIGlucHV0IGZvcm1hdCBpcyBiYXNlZCBsb29zZWx5IG9uCisvLyBUb29scy9EdW1wUmVuZGVyVHJlZS9JbWFnZURpZmYubQorCisvLyBUaGUgZXhhY3QgZm9ybWF0IG9mIHRoaXMgdG9vbCdzIG91dHB1dCB0byBzdGRvdXQgaXMgaW1wb3J0YW50LCB0byBtYXRjaAorLy8gd2hhdCB0aGUgcnVuLXdlYmtpdC10ZXN0cyBzY3JpcHQgZXhwZWN0cy4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgorI2luY2x1ZGUgInRlc3RpbmcvaW1hZ2VfZGlmZi9pbWFnZV9kaWZmX3BuZy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9jb252ZXJzaW9ucy5oIgorCisjaWYgZGVmaW5lZChPU19XSU4pCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKy8vIFJldHVybiBjb2RlcyB1c2VkIGJ5IHRoaXMgdXRpbGl0eS4KK3N0YXRpYyBjb25zdCBpbnQga1N0YXR1c1NhbWUgPSAwOworc3RhdGljIGNvbnN0IGludCBrU3RhdHVzRGlmZmVyZW50ID0gMTsKK3N0YXRpYyBjb25zdCBpbnQga1N0YXR1c0Vycm9yID0gMjsKKworLy8gQ29sb3IgY29kZXMuCitzdGF0aWMgY29uc3QgdWludDMyX3QgUkdCQV9SRUQgPSAweDAwMDAwMGZmOworc3RhdGljIGNvbnN0IHVpbnQzMl90IFJHQkFfQUxQSEEgPSAweGZmMDAwMDAwOworCitjbGFzcyBJbWFnZSB7CisgcHVibGljOgorICBJbWFnZSgpIDogd18oMCksIGhfKDApIHt9CisgIEltYWdlKGNvbnN0IEltYWdlJiBpbWFnZSkgOiB3XyhpbWFnZS53XyksIGhfKGltYWdlLmhfKSwgZGF0YV8oaW1hZ2UuZGF0YV8pIHt9CisKKyAgYm9vbCBoYXNfaW1hZ2UoKSBjb25zdCB7IHJldHVybiB3XyA+IDAgJiYgaF8gPiAwOyB9CisgIGludCB3KCkgY29uc3QgeyByZXR1cm4gd187IH0KKyAgaW50IGgoKSBjb25zdCB7IHJldHVybiBoXzsgfQorICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gJmRhdGFfLmZyb250KCk7IH0KKworICAvLyBDcmVhdGVzIHRoZSBpbWFnZSBmcm9tIHRoZSBnaXZlbiBmaWxlbmFtZSBvbiBkaXNrLCBhbmQgcmV0dXJucyB0cnVlIG9uCisgIC8vIHN1Y2Nlc3MuCisgIGJvb2wgQ3JlYXRlRnJvbUZpbGVuYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CisgICAgRklMRSogZiA9IGZvcGVuKHBhdGguY19zdHIoKSwgInJiIik7CisgICAgaWYgKCFmKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4gY29tcHJlc3NlZDsKKyAgICBjb25zdCBzaXplX3Qga0J1ZlNpemUgPSAxMDI0OworICAgIHVuc2lnbmVkIGNoYXIgYnVmW2tCdWZTaXplXTsKKyAgICBzaXplX3QgbnVtX3JlYWQgPSAwOworICAgIHdoaWxlICgobnVtX3JlYWQgPSBmcmVhZChidWYsIDEsIGtCdWZTaXplLCBmKSkgPiAwKSB7CisgICAgICBjb21wcmVzc2VkLmluc2VydChjb21wcmVzc2VkLmVuZCgpLCBidWYsIGJ1ZiArIG51bV9yZWFkKTsKKyAgICB9CisKKyAgICBmY2xvc2UoZik7CisKKyAgICBpZiAoIWltYWdlX2RpZmZfcG5nOjpEZWNvZGVQTkcoY29tcHJlc3NlZC5kYXRhKCksIGNvbXByZXNzZWQuc2l6ZSgpLCAmZGF0YV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3XywgJmhfKSkgeworICAgICAgQ2xlYXIoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB2b2lkIENsZWFyKCkgeworICAgIHdfID0gaF8gPSAwOworICAgIGRhdGFfLmNsZWFyKCk7CisgIH0KKworICAvLyBSZXR1cm5zIHRoZSBSR0JBIHZhbHVlIG9mIHRoZSBwaXhlbCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24KKyAgdWludDMyX3QgcGl4ZWxfYXQoaW50IHgsIGludCB5KSBjb25zdCB7CisgICAgaWYgKCFwaXhlbF9pbl9ib3VuZHMoeCwgeSkpCisgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPigmKGRhdGFfW3BpeGVsX2FkZHJlc3MoeCwgeSldKSk7CisgIH0KKworICB2b2lkIHNldF9waXhlbF9hdChpbnQgeCwgaW50IHksIHVpbnQzMl90IGNvbG9yKSB7CisgICAgaWYgKCFwaXhlbF9pbl9ib3VuZHMoeCwgeSkpCisgICAgICByZXR1cm47CisKKyAgICB2b2lkKiBhZGRyID0gJmRhdGFfW3BpeGVsX2FkZHJlc3MoeCwgeSldOworICAgICpyZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oYWRkcikgPSBjb2xvcjsKKyAgfQorCisgcHJpdmF0ZToKKyAgYm9vbCBwaXhlbF9pbl9ib3VuZHMoaW50IHgsIGludCB5KSBjb25zdCB7CisgICAgcmV0dXJuIHggPj0gMCAmJiB4IDwgd18gJiYgeSA+PSAwICYmIHkgPCBoXzsKKyAgfQorCisgIHNpemVfdCBwaXhlbF9hZGRyZXNzKGludCB4LCBpbnQgeSkgY29uc3QgeyByZXR1cm4gKHkgKiB3XyArIHgpICogNDsgfQorCisgIC8vIFBpeGVsIGRpbWVuc2lvbnMgb2YgdGhlIGltYWdlLgorICBpbnQgd187CisgIGludCBoXzsKKworICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiBkYXRhXzsKK307CisKK2Zsb2F0IENhbGN1bGF0ZURpZmZlcmVuY2VQZXJjZW50YWdlKGNvbnN0IEltYWdlJiBhY3R1YWwsIGludCBwaXhlbHNfZGlmZmVyZW50KSB7CisgIC8vIExpa2UgdGhlIFdlYktpdCBJbWFnZURpZmYgdG9vbCwgd2UgZGVmaW5lIHBlcmNlbnRhZ2UgZGlmZmVyZW50IGluIHRlcm1zCisgIC8vIG9mIHRoZSBzaXplIG9mIHRoZSAnYWN0dWFsJyBiaXRtYXAuCisgIGZsb2F0IHRvdGFsX3BpeGVscyA9CisgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oYWN0dWFsLncoKSkgKiBzdGF0aWNfY2FzdDxmbG9hdD4oYWN0dWFsLmgoKSk7CisgIGlmICh0b3RhbF9waXhlbHMgPT0gMCkgeworICAgIC8vIFdoZW4gdGhlIGJpdG1hcCBpcyBlbXB0eSwgdGhleSBhcmUgMTAwJSBkaWZmZXJlbnQuCisgICAgcmV0dXJuIDEwMC4wZjsKKyAgfQorICByZXR1cm4gMTAwLjBmICogcGl4ZWxzX2RpZmZlcmVudCAvIHRvdGFsX3BpeGVsczsKK30KKwordm9pZCBDb3VudEltYWdlU2l6ZU1pc21hdGNoQXNQaXhlbERpZmZlcmVuY2UoY29uc3QgSW1hZ2UmIGJhc2VsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW1hZ2UmIGFjdHVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcGl4ZWxzX2RpZmZlcmVudCkgeworICBpbnQgdyA9IHN0ZDo6bWluKGJhc2VsaW5lLncoKSwgYWN0dWFsLncoKSk7CisgIGludCBoID0gc3RkOjptaW4oYmFzZWxpbmUuaCgpLCBhY3R1YWwuaCgpKTsKKworICAvLyBDb3VudCBwaXhlbHMgdGhhdCBhcmUgYSBkaWZmZXJlbmNlIGluIHNpemUgYXMgYWxzbyBiZWluZyBkaWZmZXJlbnQuCisgIGludCBtYXhfdyA9IHN0ZDo6bWF4KGJhc2VsaW5lLncoKSwgYWN0dWFsLncoKSk7CisgIGludCBtYXhfaCA9IHN0ZDo6bWF4KGJhc2VsaW5lLmgoKSwgYWN0dWFsLmgoKSk7CisgIC8vIFRoZXNlIHBpeGVscyBhcmUgb2ZmIHRoZSByaWdodCBzaWRlLCBub3QgaW5jbHVkaW5nIHRoZSBsb3dlciByaWdodCBjb3JuZXIuCisgICpwaXhlbHNfZGlmZmVyZW50ICs9IChtYXhfdyAtIHcpICogaDsKKyAgLy8gVGhlc2UgcGl4ZWxzIGFyZSBhbG9uZyB0aGUgYm90dG9tLCBpbmNsdWRpbmcgdGhlIGxvd2VyIHJpZ2h0IGNvcm5lci4KKyAgKnBpeGVsc19kaWZmZXJlbnQgKz0gKG1heF9oIC0gaCkgKiBtYXhfdzsKK30KKworZmxvYXQgUGVyY2VudGFnZURpZmZlcmVudChjb25zdCBJbWFnZSYgYmFzZWxpbmUsIGNvbnN0IEltYWdlJiBhY3R1YWwpIHsKKyAgaW50IHcgPSBzdGQ6Om1pbihiYXNlbGluZS53KCksIGFjdHVhbC53KCkpOworICBpbnQgaCA9IHN0ZDo6bWluKGJhc2VsaW5lLmgoKSwgYWN0dWFsLmgoKSk7CisKKyAgLy8gQ29tcHV0ZSBwaXhlbHMgZGlmZmVyZW50IGluIHRoZSBvdmVybGFwLgorICBpbnQgcGl4ZWxzX2RpZmZlcmVudCA9IDA7CisgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgKyt5KSB7CisgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyArK3gpIHsKKyAgICAgIGlmIChiYXNlbGluZS5waXhlbF9hdCh4LCB5KSAhPSBhY3R1YWwucGl4ZWxfYXQoeCwgeSkpCisgICAgICAgICsrcGl4ZWxzX2RpZmZlcmVudDsKKyAgICB9CisgIH0KKworICBDb3VudEltYWdlU2l6ZU1pc21hdGNoQXNQaXhlbERpZmZlcmVuY2UoYmFzZWxpbmUsIGFjdHVhbCwgJnBpeGVsc19kaWZmZXJlbnQpOworICByZXR1cm4gQ2FsY3VsYXRlRGlmZmVyZW5jZVBlcmNlbnRhZ2UoYWN0dWFsLCBwaXhlbHNfZGlmZmVyZW50KTsKK30KKworZmxvYXQgSGlzdG9ncmFtUGVyY2VudGFnZURpZmZlcmVudChjb25zdCBJbWFnZSYgYmFzZWxpbmUsIGNvbnN0IEltYWdlJiBhY3R1YWwpIHsKKyAgLy8gVE9ETyhqb2hubWUpOiBDb25zaWRlciB1c2luZyBhIGpvaW50IGhpc3RvZ3JhbSBpbnN0ZWFkLCBhcyBkZXNjcmliZWQgaW4KKyAgLy8gIkNvbXBhcmluZyBJbWFnZXMgVXNpbmcgSm9pbnQgSGlzdG9ncmFtcyIgYnkgUGFzcyAmIFphYmloCisgIC8vIGh0dHA6Ly93d3cuY3MuY29ybmVsbC5lZHUvfnJkei9wYXBlcnMvcHotam1zOTkucGRmCisKKyAgaW50IHcgPSBzdGQ6Om1pbihiYXNlbGluZS53KCksIGFjdHVhbC53KCkpOworICBpbnQgaCA9IHN0ZDo6bWluKGJhc2VsaW5lLmgoKSwgYWN0dWFsLmgoKSk7CisKKyAgLy8gQ291bnQgb2NjdXJlbmNlcyBvZiBlYWNoIFJHQkEgcGl4ZWwgdmFsdWUgb2YgYmFzZWxpbmUgaW4gdGhlIG92ZXJsYXAuCisgIHN0ZDo6bWFwPHVpbnQzMl90LCBpbnQzMl90PiBiYXNlbGluZV9oaXN0b2dyYW07CisgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgKyt5KSB7CisgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyArK3gpIHsKKyAgICAgIC8vIGhhc2hfbWFwIG9wZXJhdG9yW10gaW5zZXJ0cyBhIDAgKGRlZmF1bHQgY29uc3RydWN0b3IpIGlmIGtleSBub3QgZm91bmQuCisgICAgICArK2Jhc2VsaW5lX2hpc3RvZ3JhbVtiYXNlbGluZS5waXhlbF9hdCh4LCB5KV07CisgICAgfQorICB9CisKKyAgLy8gQ29tcHV0ZSBwaXhlbHMgZGlmZmVyZW50IGluIHRoZSBoaXN0b2dyYW0gb2YgdGhlIG92ZXJsYXAuCisgIGludCBwaXhlbHNfZGlmZmVyZW50ID0gMDsKKyAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyArK3kpIHsKKyAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7ICsreCkgeworICAgICAgdWludDMyX3QgYWN0dWFsX3JnYmEgPSBhY3R1YWwucGl4ZWxfYXQoeCwgeSk7CisgICAgICBhdXRvIGl0ID0gYmFzZWxpbmVfaGlzdG9ncmFtLmZpbmQoYWN0dWFsX3JnYmEpOworICAgICAgaWYgKGl0ICE9IGJhc2VsaW5lX2hpc3RvZ3JhbS5lbmQoKSAmJiBpdC0+c2Vjb25kID4gMCkKKyAgICAgICAgLS1pdC0+c2Vjb25kOworICAgICAgZWxzZQorICAgICAgICArK3BpeGVsc19kaWZmZXJlbnQ7CisgICAgfQorICB9CisKKyAgQ291bnRJbWFnZVNpemVNaXNtYXRjaEFzUGl4ZWxEaWZmZXJlbmNlKGJhc2VsaW5lLCBhY3R1YWwsICZwaXhlbHNfZGlmZmVyZW50KTsKKyAgcmV0dXJuIENhbGN1bGF0ZURpZmZlcmVuY2VQZXJjZW50YWdlKGFjdHVhbCwgcGl4ZWxzX2RpZmZlcmVudCk7Cit9CisKK3ZvaWQgUHJpbnRIZWxwKCkgeworICBmcHJpbnRmKAorICAgICAgc3RkZXJyLAorICAgICAgIlVzYWdlOlxuIgorICAgICAgIiAgaW1hZ2VfZGlmZiBbLS1oaXN0b2dyYW1dIDxjb21wYXJlIGZpbGU+IDxyZWZlcmVuY2UgZmlsZT5cbiIKKyAgICAgICIgICAgQ29tcGFyZXMgdHdvIGZpbGVzIG9uIGRpc2ssIHJldHVybmluZyAwIHdoZW4gdGhleSBhcmUgdGhlIHNhbWU7XG4iCisgICAgICAiICAgIHBhc3NpbmcgXCItLWhpc3RvZ3JhbVwiIGFkZGl0aW9uYWxseSBjYWxjdWxhdGVzIGEgZGlmZiBvZiB0aGVcbiIKKyAgICAgICIgICAgUkdCQSB2YWx1ZSBoaXN0b2dyYW1zICh3aGljaCBpcyByZXNpc3RhbnQgdG8gc2hpZnRzIGluIGxheW91dClcbiIKKyAgICAgICIgIGltYWdlX2RpZmYgLS1kaWZmIDxjb21wYXJlIGZpbGU+IDxyZWZlcmVuY2UgZmlsZT4gPG91dHB1dCBmaWxlPlxuIgorICAgICAgIiAgICBDb21wYXJlcyB0d28gZmlsZXMgb24gZGlzaywgb3V0cHV0cyBhbiBpbWFnZSB0aGF0IHZpc3VhbGl6ZXMgdGhlXG4iCisgICAgICAiICAgIGRpZmZlcmVuY2UgdG8gPG91dHB1dCBmaWxlPlxuIik7Cit9CisKK2ludCBDb21wYXJlSW1hZ2VzKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlMSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlMiwKKyAgICAgICAgICAgICAgICAgIGJvb2wgY29tcGFyZV9oaXN0b2dyYW1zKSB7CisgIEltYWdlIGFjdHVhbF9pbWFnZTsKKyAgSW1hZ2UgYmFzZWxpbmVfaW1hZ2U7CisKKyAgaWYgKCFhY3R1YWxfaW1hZ2UuQ3JlYXRlRnJvbUZpbGVuYW1lKGZpbGUxKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiaW1hZ2VfZGlmZjogVW5hYmxlIHRvIG9wZW4gZmlsZSBcIiVzXCJcbiIsIGZpbGUxLmNfc3RyKCkpOworICAgIHJldHVybiBrU3RhdHVzRXJyb3I7CisgIH0KKyAgaWYgKCFiYXNlbGluZV9pbWFnZS5DcmVhdGVGcm9tRmlsZW5hbWUoZmlsZTIpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJpbWFnZV9kaWZmOiBVbmFibGUgdG8gb3BlbiBmaWxlIFwiJXNcIlxuIiwgZmlsZTIuY19zdHIoKSk7CisgICAgcmV0dXJuIGtTdGF0dXNFcnJvcjsKKyAgfQorCisgIGlmIChjb21wYXJlX2hpc3RvZ3JhbXMpIHsKKyAgICBmbG9hdCBwZXJjZW50ID0gSGlzdG9ncmFtUGVyY2VudGFnZURpZmZlcmVudChhY3R1YWxfaW1hZ2UsIGJhc2VsaW5lX2ltYWdlKTsKKyAgICBjb25zdCBjaGFyKiBwYXNzZWQgPSBwZXJjZW50ID4gMC4wID8gImZhaWxlZCIgOiAicGFzc2VkIjsKKyAgICBwcmludGYoImhpc3RvZ3JhbSBkaWZmOiAlMDEuMmYlJSAlc1xuIiwgcGVyY2VudCwgcGFzc2VkKTsKKyAgfQorCisgIGNvbnN0IGNoYXIqIGNvbnN0IGRpZmZfbmFtZSA9IGNvbXBhcmVfaGlzdG9ncmFtcyA/ICJleGFjdCBkaWZmIiA6ICJkaWZmIjsKKyAgZmxvYXQgcGVyY2VudCA9IFBlcmNlbnRhZ2VEaWZmZXJlbnQoYWN0dWFsX2ltYWdlLCBiYXNlbGluZV9pbWFnZSk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IHBhc3NlZCA9IHBlcmNlbnQgPiAwLjAgPyAiZmFpbGVkIiA6ICJwYXNzZWQiOworICBwcmludGYoIiVzOiAlMDEuMmYlJSAlc1xuIiwgZGlmZl9uYW1lLCBwZXJjZW50LCBwYXNzZWQpOworCisgIGlmIChwZXJjZW50ID4gMC4wKSB7CisgICAgLy8gZmFpbHVyZTogVGhlIFdlYktpdCB2ZXJzaW9uIGFsc28gd3JpdGVzIHRoZSBkaWZmZXJlbmNlIGltYWdlIHRvCisgICAgLy8gc3Rkb3V0LCB3aGljaCBzZWVtcyBleGNlc3NpdmUgZm9yIG91ciBuZWVkcy4KKyAgICByZXR1cm4ga1N0YXR1c0RpZmZlcmVudDsKKyAgfQorICAvLyBzdWNjZXNzCisgIHJldHVybiBrU3RhdHVzU2FtZTsKK30KKworYm9vbCBDcmVhdGVJbWFnZURpZmYoY29uc3QgSW1hZ2UmIGltYWdlMSwgY29uc3QgSW1hZ2UmIGltYWdlMiwgSW1hZ2UqIG91dCkgeworICBpbnQgdyA9IHN0ZDo6bWluKGltYWdlMS53KCksIGltYWdlMi53KCkpOworICBpbnQgaCA9IHN0ZDo6bWluKGltYWdlMS5oKCksIGltYWdlMi5oKCkpOworICAqb3V0ID0gSW1hZ2UoaW1hZ2UxKTsKKyAgYm9vbCBzYW1lID0gKGltYWdlMS53KCkgPT0gaW1hZ2UyLncoKSkgJiYgKGltYWdlMS5oKCkgPT0gaW1hZ2UyLmgoKSk7CisKKyAgLy8gVE9ETyhlc3RhZGUpOiBkbyBzb21ldGhpbmcgd2l0aCB0aGUgZXh0cmEgcGl4ZWxzIGlmIHRoZSBpbWFnZSBzaXplcworICAvLyBhcmUgZGlmZmVyZW50LgorICBmb3IgKGludCB5ID0gMDsgeSA8IGg7ICsreSkgeworICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgKyt4KSB7CisgICAgICB1aW50MzJfdCBiYXNlX3BpeGVsID0gaW1hZ2UxLnBpeGVsX2F0KHgsIHkpOworICAgICAgaWYgKGJhc2VfcGl4ZWwgIT0gaW1hZ2UyLnBpeGVsX2F0KHgsIHkpKSB7CisgICAgICAgIC8vIFNldCBkaWZmZXJpbmcgcGl4ZWxzIHJlZC4KKyAgICAgICAgb3V0LT5zZXRfcGl4ZWxfYXQoeCwgeSwgUkdCQV9SRUQgfCBSR0JBX0FMUEhBKTsKKyAgICAgICAgc2FtZSA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU2V0IHNhbWUgcGl4ZWxzIGFzIGZhZGVkLgorICAgICAgICB1aW50MzJfdCBhbHBoYSA9IGJhc2VfcGl4ZWwgJiBSR0JBX0FMUEhBOworICAgICAgICB1aW50MzJfdCBuZXdfcGl4ZWwgPSBiYXNlX3BpeGVsIC0gKChhbHBoYSAvIDIpICYgUkdCQV9BTFBIQSk7CisgICAgICAgIG91dC0+c2V0X3BpeGVsX2F0KHgsIHksIG5ld19waXhlbCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHNhbWU7Cit9CisKK2ludCBEaWZmSW1hZ2VzKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlMSwKKyAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlMiwKKyAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBvdXRfZmlsZSkgeworICBJbWFnZSBhY3R1YWxfaW1hZ2U7CisgIEltYWdlIGJhc2VsaW5lX2ltYWdlOworCisgIGlmICghYWN0dWFsX2ltYWdlLkNyZWF0ZUZyb21GaWxlbmFtZShmaWxlMSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImltYWdlX2RpZmY6IFVuYWJsZSB0byBvcGVuIGZpbGUgXCIlc1wiXG4iLCBmaWxlMS5jX3N0cigpKTsKKyAgICByZXR1cm4ga1N0YXR1c0Vycm9yOworICB9CisgIGlmICghYmFzZWxpbmVfaW1hZ2UuQ3JlYXRlRnJvbUZpbGVuYW1lKGZpbGUyKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiaW1hZ2VfZGlmZjogVW5hYmxlIHRvIG9wZW4gZmlsZSBcIiVzXCJcbiIsIGZpbGUyLmNfc3RyKCkpOworICAgIHJldHVybiBrU3RhdHVzRXJyb3I7CisgIH0KKworICBJbWFnZSBkaWZmX2ltYWdlOworICBib29sIHNhbWUgPSBDcmVhdGVJbWFnZURpZmYoYmFzZWxpbmVfaW1hZ2UsIGFjdHVhbF9pbWFnZSwgJmRpZmZfaW1hZ2UpOworICBpZiAoc2FtZSkKKyAgICByZXR1cm4ga1N0YXR1c1NhbWU7CisKKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4gcG5nX2VuY29kaW5nOworICBpbWFnZV9kaWZmX3BuZzo6RW5jb2RlUkdCQVBORyhkaWZmX2ltYWdlLmRhdGEoKSwgZGlmZl9pbWFnZS53KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZfaW1hZ2UuaCgpLCBkaWZmX2ltYWdlLncoKSAqIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwbmdfZW5jb2RpbmcpOworCisgIEZJTEUqIGYgPSBmb3BlbihvdXRfZmlsZS5jX3N0cigpLCAid2IiKTsKKyAgaWYgKCFmKQorICAgIHJldHVybiBrU3RhdHVzRXJyb3I7CisKKyAgc2l6ZV90IHNpemUgPSBwbmdfZW5jb2Rpbmcuc2l6ZSgpOworICBjaGFyKiBwdHIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPigmcG5nX2VuY29kaW5nLmZyb250KCkpOworICBpZiAoZndyaXRlKHB0ciwgMSwgc2l6ZSwgZikgIT0gc2l6ZSkKKyAgICByZXR1cm4ga1N0YXR1c0Vycm9yOworCisgIHJldHVybiBrU3RhdHVzRGlmZmVyZW50OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciogYXJndltdKSB7CisgIEZYTUVNX0luaXRpYWxpemVQYXJ0aXRpb25BbGxvYygpOworCisgIGJvb2wgaGlzdG9ncmFtcyA9IGZhbHNlOworICBib29sIHByb2R1Y2VfZGlmZl9pbWFnZSA9IGZhbHNlOworICBzdGQ6OnN0cmluZyBmaWxlbmFtZTE7CisgIHN0ZDo6c3RyaW5nIGZpbGVuYW1lMjsKKyAgc3RkOjpzdHJpbmcgZGlmZl9maWxlbmFtZTsKKworICBpbnQgaTsKKyAgZm9yIChpID0gMTsgaSA8IGFyZ2M7ICsraSkgeworICAgIGNvbnN0IGNoYXIqIGFyZyA9IGFyZ3ZbaV07CisgICAgaWYgKHN0cnN0cihhcmcsICItLSIpICE9IGFyZykKKyAgICAgIGJyZWFrOworICAgIGlmIChzdHJjbXAoYXJnLCAiLS1oaXN0b2dyYW0iKSA9PSAwKSB7CisgICAgICBoaXN0b2dyYW1zID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKHN0cmNtcChhcmcsICItLWRpZmYiKSA9PSAwKSB7CisgICAgICBwcm9kdWNlX2RpZmZfaW1hZ2UgPSB0cnVlOworICAgIH0KKyAgfQorICBpZiAoaSA8IGFyZ2MpCisgICAgZmlsZW5hbWUxID0gYXJndltpKytdOworICBpZiAoaSA8IGFyZ2MpCisgICAgZmlsZW5hbWUyID0gYXJndltpKytdOworICBpZiAoaSA8IGFyZ2MpCisgICAgZGlmZl9maWxlbmFtZSA9IGFyZ3ZbaSsrXTsKKworICBpZiAocHJvZHVjZV9kaWZmX2ltYWdlKSB7CisgICAgaWYgKCFkaWZmX2ZpbGVuYW1lLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBEaWZmSW1hZ2VzKGZpbGVuYW1lMSwgZmlsZW5hbWUyLCBkaWZmX2ZpbGVuYW1lKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoIWZpbGVuYW1lMi5lbXB0eSgpKSB7CisgICAgcmV0dXJuIENvbXBhcmVJbWFnZXMoZmlsZW5hbWUxLCBmaWxlbmFtZTIsIGhpc3RvZ3JhbXMpOworICB9CisKKyAgUHJpbnRIZWxwKCk7CisgIHJldHVybiBrU3RhdHVzRXJyb3I7Cit9CmRpZmYgLS1naXQgYS90ZXN0aW5nL2ltYWdlX2RpZmYvaW1hZ2VfZGlmZl9wbmcuY3BwIGIvdGVzdGluZy9pbWFnZV9kaWZmL2ltYWdlX2RpZmZfcG5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGI1YWUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9pbWFnZV9kaWZmL2ltYWdlX2RpZmZfcG5nLmNwcApAQCAtMCwwICsxLDcxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUaGlzIGlzIGEgZHVwbGljYXRlIG9mIGNocm9taXVtJ3Mgc3JjL3Rvb2xzL2ltYWdlZGlmZi9pbWFnZV9kaWZmX3BuZy5jYworLy8gdGhhdCBoYXMgYmVlbiBtb2RpZmllZCB0byBidWlsZCBpbiBhIHBkZml1bSBlbnZpcm9ubWVudCwgd2hpY2ggaXRzZWxmCisvLyB3YXMgZHVwbGljYXRlZCBhcyBmb2xsb3dzOgorCisvLyBUaGlzIGlzIGEgZHVwbGljYXRlIG9mIHVpL2dmeC9jb2RlYy9wbmdfY29kZWMuY2MsIGFmdGVyIHJlbW92aW5nIGNvZGUgcmVsYXRlZAorLy8gdG8gU2tpYSwgdGhhdCB3ZSBjYW4gdXNlIHdoZW4gcnVubmluZyBsYXlvdXQgdGVzdHMgd2l0aCBtaW5pbWFsIGRlcGVuZGVuY2llcy4KKworI2luY2x1ZGUgInRlc3RpbmcvaW1hZ2VfZGlmZi9pbWFnZV9kaWZmX3BuZy5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS96bGliL3psaWIuaCIKKworI2lmZGVmIFVTRV9TWVNURU1fTElCUE5HCisjaW5jbHVkZSA8cG5nLmg+CisjZWxzZQorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2xpYnBuZzE2L3BuZy5oIgorI2VuZGlmCisKK25hbWVzcGFjZSBpbWFnZV9kaWZmX3BuZyB7CisKK25hbWVzcGFjZSB7CisKK2VudW0gQ29sb3JGb3JtYXQgeworICAvLyAzIGJ5dGVzIHBlciBwaXhlbCAocGFja2VkKSwgaW4gUkdCIG9yZGVyIHJlZ2FyZGxlc3Mgb2YgZW5kaWFubmVzcy4KKyAgLy8gVGhpcyBpcyB0aGUgbmF0aXZlIEpQRUcgZm9ybWF0LgorICBGT1JNQVRfUkdCLAorCisgIC8vIDMgYnl0ZXMgcGVyIHBpeGVsLCBpbiBCR1Igb3JkZXIgcmVnYXJkbGVzcyBvZiBlbmRpYW5uZXNzLgorICBGT1JNQVRfQkdSLAorCisgIC8vIDQgYnl0ZXMgcGVyIHBpeGVsLCBpbiBSR0JBIG9yZGVyIGluIG1lbW9yeSByZWdhcmRsZXNzIG9mIGVuZGlhbm5lc3MuCisgIEZPUk1BVF9SR0JBLAorCisgIC8vIDQgYnl0ZXMgcGVyIHBpeGVsLCBpbiBCR1JBIG9yZGVyIGluIG1lbW9yeSByZWdhcmRsZXNzIG9mIGVuZGlhbm5lc3MuCisgIC8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgV2luZG93cyBESUIgb3JkZXIuCisgIEZPUk1BVF9CR1JBLAorCisgIC8vIDEgYnl0ZSBwZXIgcGl4ZWwuCisgIEZPUk1BVF9HUkFZLAorfTsKKworLy8gUmVwcmVzZW50cyBhIGNvbW1lbnQgaW4gdGhlIHRFWHQgYW5jaWxsYXJ5IGNodW5rIG9mIHRoZSBwbmcuCitzdHJ1Y3QgQ29tbWVudCB7CisgIHN0ZDo6c3RyaW5nIGtleTsKKyAgc3RkOjpzdHJpbmcgdGV4dDsKK307CisKKy8vIENvbnZlcnRzIEJHUkEtPlJHQkEgYW5kIFJHQkEtPkJHUkEuCit2b2lkIENvbnZlcnRCZXR3ZWVuQkdSQWFuZFJHQkEoY29uc3QgdW5zaWduZWQgY2hhciogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBpc19vcGFxdWUpIHsKKyAgZm9yIChpbnQgeCA9IDA7IHggPCBwaXhlbF93aWR0aDsgeCsrKSB7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciogcGl4ZWxfaW4gPSAmaW5wdXRbeCAqIDRdOworICAgIHVuc2lnbmVkIGNoYXIqIHBpeGVsX291dCA9ICZvdXRwdXRbeCAqIDRdOworICAgIHBpeGVsX291dFswXSA9IHBpeGVsX2luWzJdOworICAgIHBpeGVsX291dFsxXSA9IHBpeGVsX2luWzFdOworICAgIHBpeGVsX291dFsyXSA9IHBpeGVsX2luWzBdOworICAgIHBpeGVsX291dFszXSA9IHBpeGVsX2luWzNdOworICB9Cit9CisKK3ZvaWQgQ29udmVydEJHUnRvUkdCKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGJnciwKKyAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGlzX29wYXF1ZSkgeworICBmb3IgKGludCB4ID0gMDsgeCA8IHBpeGVsX3dpZHRoOyB4KyspIHsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBwaXhlbF9pbiA9ICZiZ3JbeCAqIDNdOworICAgIHVuc2lnbmVkIGNoYXIqIHBpeGVsX291dCA9ICZyZ2JbeCAqIDNdOworICAgIHBpeGVsX291dFswXSA9IHBpeGVsX2luWzJdOworICAgIHBpeGVsX291dFsxXSA9IHBpeGVsX2luWzFdOworICAgIHBpeGVsX291dFsyXSA9IHBpeGVsX2luWzBdOworICB9Cit9CisKK3ZvaWQgQ29udmVydFJHQkF0b1JHQihjb25zdCB1bnNpZ25lZCBjaGFyKiByZ2JhLAorICAgICAgICAgICAgICAgICAgICAgIGludCBwaXhlbF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCogaXNfb3BhcXVlKSB7CisgIGZvciAoaW50IHggPSAwOyB4IDwgcGl4ZWxfd2lkdGg7IHgrKykgeworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHBpeGVsX2luID0gJnJnYmFbeCAqIDRdOworICAgIHVuc2lnbmVkIGNoYXIqIHBpeGVsX291dCA9ICZyZ2JbeCAqIDNdOworICAgIHBpeGVsX291dFswXSA9IHBpeGVsX2luWzBdOworICAgIHBpeGVsX291dFsxXSA9IHBpeGVsX2luWzFdOworICAgIHBpeGVsX291dFsyXSA9IHBpeGVsX2luWzJdOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBEZWNvZGVyCisvLworLy8gVGhpcyBjb2RlIGlzIGJhc2VkIG9uIFdlYktpdCBsaWJwbmcgaW50ZXJmYWNlIChQTkdJbWFnZURlY29kZXIpLCB3aGljaCBpcworLy8gaW4gdHVybiBiYXNlZCBvbiB0aGUgTW96aWxsYSBwbmcgZGVjb2Rlci4KKworbmFtZXNwYWNlIHsKKworLy8gR2FtbWEgY29uc3RhbnRzOiBXZSBhc3N1bWUgd2UncmUgb24gV2luZG93cyB3aGljaCB1c2VzIGEgZ2FtbWEgb2YgMi4yLgorY29uc3QgZG91YmxlIGtNYXhHYW1tYSA9IDIxNDc0LjgzOyAgLy8gTWF4aW11bSBnYW1tYSBhY2NlcHRlZCBieSBwbmcgbGlicmFyeS4KK2NvbnN0IGRvdWJsZSBrRGVmYXVsdEdhbW1hID0gMi4yOworY29uc3QgZG91YmxlIGtJbnZlcnNlR2FtbWEgPSAxLjAgLyBrRGVmYXVsdEdhbW1hOworCitjbGFzcyBQbmdEZWNvZGVyU3RhdGUgeworIHB1YmxpYzoKKyAgLy8gT3V0cHV0IGlzIGEgdmVjdG9yPHVuc2lnbmVkIGNoYXI+LgorICBQbmdEZWNvZGVyU3RhdGUoQ29sb3JGb3JtYXQgb2ZtdCwgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4qIG8pCisgICAgICA6IG91dHB1dF9mb3JtYXQob2ZtdCksCisgICAgICAgIG91dHB1dF9jaGFubmVscygwKSwKKyAgICAgICAgaXNfb3BhcXVlKHRydWUpLAorICAgICAgICBvdXRwdXQobyksCisgICAgICAgIHJvd19jb252ZXJ0ZXIobnVsbHB0ciksCisgICAgICAgIHdpZHRoKDApLAorICAgICAgICBoZWlnaHQoMCksCisgICAgICAgIGRvbmUoZmFsc2UpIHt9CisKKyAgQ29sb3JGb3JtYXQgb3V0cHV0X2Zvcm1hdDsKKyAgaW50IG91dHB1dF9jaGFubmVsczsKKworICAvLyBVc2VkIGR1cmluZyB0aGUgcmVhZGluZyBvZiBhbiBTa0JpdG1hcC4gRGVmYXVsdHMgdG8gdHJ1ZSB1bnRpbCB3ZSBzZWUgYQorICAvLyBwaXhlbCB3aXRoIGFueXRoaW5nIG90aGVyIHRoYW4gYW4gYWxwaGEgb2YgMjU1LgorICBib29sIGlzX29wYXF1ZTsKKworICAvLyBBbiBpbnRlcm1lZGlhcnkgYnVmZmVyIGZvciBkZWNvZGUgb3V0cHV0LgorICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiogb3V0cHV0OworCisgIC8vIENhbGxlZCB0byBjb252ZXJ0IGEgcm93IGZyb20gdGhlIGxpYnJhcnkgdG8gdGhlIGNvcnJlY3Qgb3V0cHV0IGZvcm1hdC4KKyAgLy8gV2hlbiBOVUxMLCBubyBjb252ZXJzaW9uIGlzIG5lY2Vzc2FyeS4KKyAgdm9pZCAoKnJvd19jb252ZXJ0ZXIpKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBpc19vcGFxdWUpOworCisgIC8vIFNpemUgb2YgdGhlIGltYWdlLCBzZXQgaW4gdGhlIGluZm8gY2FsbGJhY2suCisgIGludCB3aWR0aDsKKyAgaW50IGhlaWdodDsKKworICAvLyBTZXQgdG8gdHJ1ZSB3aGVuIHdlJ3ZlIGZvdW5kIHRoZSBlbmQgb2YgdGhlIGRhdGEuCisgIGJvb2wgZG9uZTsKK307CisKK3ZvaWQgQ29udmVydFJHQnRvUkdCQShjb25zdCB1bnNpZ25lZCBjaGFyKiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHBpeGVsX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIHJnYmEsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCogaXNfb3BhcXVlKSB7CisgIGZvciAoaW50IHggPSAwOyB4IDwgcGl4ZWxfd2lkdGg7IHgrKykgeworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHBpeGVsX2luID0gJnJnYlt4ICogM107CisgICAgdW5zaWduZWQgY2hhciogcGl4ZWxfb3V0ID0gJnJnYmFbeCAqIDRdOworICAgIHBpeGVsX291dFswXSA9IHBpeGVsX2luWzBdOworICAgIHBpeGVsX291dFsxXSA9IHBpeGVsX2luWzFdOworICAgIHBpeGVsX291dFsyXSA9IHBpeGVsX2luWzJdOworICAgIHBpeGVsX291dFszXSA9IDB4ZmY7CisgIH0KK30KKwordm9pZCBDb252ZXJ0UkdCdG9CR1JBKGNvbnN0IHVuc2lnbmVkIGNoYXIqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogYmdyYSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sKiBpc19vcGFxdWUpIHsKKyAgZm9yIChpbnQgeCA9IDA7IHggPCBwaXhlbF93aWR0aDsgeCsrKSB7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciogcGl4ZWxfaW4gPSAmcmdiW3ggKiAzXTsKKyAgICB1bnNpZ25lZCBjaGFyKiBwaXhlbF9vdXQgPSAmYmdyYVt4ICogNF07CisgICAgcGl4ZWxfb3V0WzBdID0gcGl4ZWxfaW5bMl07CisgICAgcGl4ZWxfb3V0WzFdID0gcGl4ZWxfaW5bMV07CisgICAgcGl4ZWxfb3V0WzJdID0gcGl4ZWxfaW5bMF07CisgICAgcGl4ZWxfb3V0WzNdID0gMHhmZjsKKyAgfQorfQorCisvLyBDYWxsZWQgd2hlbiB0aGUgcG5nIGhlYWRlciBoYXMgYmVlbiByZWFkLiBUaGlzIGNvZGUgaXMgYmFzZWQgb24gdGhlIFdlYktpdAorLy8gUE5HSW1hZ2VEZWNvZGVyCit2b2lkIERlY29kZUluZm9DYWxsYmFjayhwbmdfc3RydWN0KiBwbmdfcHRyLCBwbmdfaW5mbyogaW5mb19wdHIpIHsKKyAgUG5nRGVjb2RlclN0YXRlKiBzdGF0ZSA9CisgICAgICBzdGF0aWNfY2FzdDxQbmdEZWNvZGVyU3RhdGUqPihwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwbmdfcHRyKSk7CisKKyAgaW50IGJpdF9kZXB0aCwgY29sb3JfdHlwZSwgaW50ZXJsYWNlX3R5cGUsIGNvbXByZXNzaW9uX3R5cGU7CisgIGludCBmaWx0ZXJfdHlwZSwgY2hhbm5lbHM7CisgIHBuZ191aW50XzMyIHcsIGg7CisgIHBuZ19nZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgJncsICZoLCAmYml0X2RlcHRoLCAmY29sb3JfdHlwZSwKKyAgICAgICAgICAgICAgICZpbnRlcmxhY2VfdHlwZSwgJmNvbXByZXNzaW9uX3R5cGUsICZmaWx0ZXJfdHlwZSk7CisKKyAgLy8gQm91bmRzIGNoZWNrLiBXaGVuIHRoZSBpbWFnZSBpcyB1bnJlYXNvbmFibHkgYmlnLCB3ZSdsbCBlcnJvciBvdXQgYW5kCisgIC8vIGVuZCB1cCBiYWNrIGF0IHRoZSBzZXRqbXAgY2FsbCB3aGVuIHdlIHNldCB1cCBkZWNvZGluZy4gICJVbnJlYXNvbmFibHkgYmlnIgorICAvLyBtZWFucyAiYmlnIGVub3VnaCB0aGF0IHcgKiBoICogMzJicHAgbWlnaHQgb3ZlcmZsb3cgYW4gaW50Ijsgd2UgY2hvb3NlIHRoaXMKKyAgLy8gdGhyZXNob2xkIHRvIG1hdGNoIFdlYktpdCBhbmQgYmVjYXVzZSBhIG51bWJlciBvZiBwbGFjZXMgaW4gY29kZSBhc3N1bWUKKyAgLy8gdGhhdCBhbiBpbWFnZSdzIHNpemUgKGluIGJ5dGVzKSBmaXRzIGluIGEgKHNpZ25lZCkgaW50LgorICB1bnNpZ25lZCBsb25nIGxvbmcgdG90YWxfc2l6ZSA9CisgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KHcpICogc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPihoKTsKKyAgaWYgKHRvdGFsX3NpemUgPiAoKDEgPDwgMjkpIC0gMSkpCisgICAgbG9uZ2ptcChwbmdfam1wYnVmKHBuZ19wdHIpLCAxKTsKKyAgc3RhdGUtPndpZHRoID0gc3RhdGljX2Nhc3Q8aW50Pih3KTsKKyAgc3RhdGUtPmhlaWdodCA9IHN0YXRpY19jYXN0PGludD4oaCk7CisKKyAgLy8gRXhwYW5kIHRvIGVuc3VyZSB3ZSB1c2UgMjQtYml0IGZvciBSR0IgYW5kIDMyLWJpdCBmb3IgUkdCQS4KKyAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUEFMRVRURSB8fAorICAgICAgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSAmJiBiaXRfZGVwdGggPCA4KSkKKyAgICBwbmdfc2V0X2V4cGFuZChwbmdfcHRyKTsKKworICAvLyBUcmFuc3BhcmVuY3kgZm9yIHBhbGV0dGVkIGltYWdlcy4KKyAgaWYgKHBuZ19nZXRfdmFsaWQocG5nX3B0ciwgaW5mb19wdHIsIFBOR19JTkZPX3RSTlMpKQorICAgIHBuZ19zZXRfZXhwYW5kKHBuZ19wdHIpOworCisgIC8vIENvbnZlcnQgMTYtYml0IHRvIDgtYml0LgorICBpZiAoYml0X2RlcHRoID09IDE2KQorICAgIHBuZ19zZXRfc3RyaXBfMTYocG5nX3B0cik7CisKKyAgLy8gRXhwYW5kIGdyYXlzY2FsZSB0byBSR0IuCisgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgfHwKKyAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWV9BTFBIQSkKKyAgICBwbmdfc2V0X2dyYXlfdG9fcmdiKHBuZ19wdHIpOworCisgIC8vIERlYWwgd2l0aCBnYW1tYSBhbmQga2VlcCBpdCB1bmRlciBvdXIgY29udHJvbC4KKyAgZG91YmxlIGdhbW1hOworICBpZiAocG5nX2dldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCAmZ2FtbWEpKSB7CisgICAgaWYgKGdhbW1hIDw9IDAuMCB8fCBnYW1tYSA+IGtNYXhHYW1tYSkgeworICAgICAgZ2FtbWEgPSBrSW52ZXJzZUdhbW1hOworICAgICAgcG5nX3NldF9nQU1BKHBuZ19wdHIsIGluZm9fcHRyLCBnYW1tYSk7CisgICAgfQorICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwga0RlZmF1bHRHYW1tYSwgZ2FtbWEpOworICB9IGVsc2UgeworICAgIHBuZ19zZXRfZ2FtbWEocG5nX3B0ciwga0RlZmF1bHRHYW1tYSwga0ludmVyc2VHYW1tYSk7CisgIH0KKworICAvLyBUZWxsIGxpYnBuZyB0byBzZW5kIHVzIHJvd3MgZm9yIGludGVybGFjZWQgcG5ncy4KKyAgaWYgKGludGVybGFjZV90eXBlID09IFBOR19JTlRFUkxBQ0VfQURBTTcpCisgICAgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nX3B0cik7CisKKyAgLy8gVXBkYXRlIG91ciBpbmZvIG5vdworICBwbmdfcmVhZF91cGRhdGVfaW5mbyhwbmdfcHRyLCBpbmZvX3B0cik7CisgIGNoYW5uZWxzID0gcG5nX2dldF9jaGFubmVscyhwbmdfcHRyLCBpbmZvX3B0cik7CisKKyAgLy8gUGljayBvdXIgcm93IGZvcm1hdCBjb252ZXJ0ZXIgbmVjZXNzYXJ5IGZvciB0aGlzIGRhdGEuCisgIGlmIChjaGFubmVscyA9PSAzKSB7CisgICAgc3dpdGNoIChzdGF0ZS0+b3V0cHV0X2Zvcm1hdCkgeworICAgICAgY2FzZSBGT1JNQVRfUkdCOgorICAgICAgICBzdGF0ZS0+cm93X2NvbnZlcnRlciA9IG51bGxwdHI7ICAvLyBubyBjb252ZXJzaW9uIG5lY2Vzc2FyeQorICAgICAgICBzdGF0ZS0+b3V0cHV0X2NoYW5uZWxzID0gMzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZPUk1BVF9SR0JBOgorICAgICAgICBzdGF0ZS0+cm93X2NvbnZlcnRlciA9ICZDb252ZXJ0UkdCdG9SR0JBOworICAgICAgICBzdGF0ZS0+b3V0cHV0X2NoYW5uZWxzID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZPUk1BVF9CR1JBOgorICAgICAgICBzdGF0ZS0+cm93X2NvbnZlcnRlciA9ICZDb252ZXJ0UkdCdG9CR1JBOworICAgICAgICBzdGF0ZS0+b3V0cHV0X2NoYW5uZWxzID0gNDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZPUk1BVF9HUkFZOgorICAgICAgICBzdGF0ZS0+cm93X2NvbnZlcnRlciA9IG51bGxwdHI7CisgICAgICAgIHN0YXRlLT5vdXRwdXRfY2hhbm5lbHMgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgaWYgKGNoYW5uZWxzID09IDQpIHsKKyAgICBzd2l0Y2ggKHN0YXRlLT5vdXRwdXRfZm9ybWF0KSB7CisgICAgICBjYXNlIEZPUk1BVF9SR0I6CisgICAgICAgIHN0YXRlLT5yb3dfY29udmVydGVyID0gJkNvbnZlcnRSR0JBdG9SR0I7CisgICAgICAgIHN0YXRlLT5vdXRwdXRfY2hhbm5lbHMgPSAzOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk9STUFUX1JHQkE6CisgICAgICAgIHN0YXRlLT5yb3dfY29udmVydGVyID0gbnVsbHB0cjsgIC8vIG5vIGNvbnZlcnNpb24gbmVjZXNzYXJ5CisgICAgICAgIHN0YXRlLT5vdXRwdXRfY2hhbm5lbHMgPSA0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRk9STUFUX0JHUkE6CisgICAgICAgIHN0YXRlLT5yb3dfY29udmVydGVyID0gJkNvbnZlcnRCZXR3ZWVuQkdSQWFuZFJHQkE7CisgICAgICAgIHN0YXRlLT5vdXRwdXRfY2hhbm5lbHMgPSA0OworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICBsb25nam1wKHBuZ19qbXBidWYocG5nX3B0ciksIDEpOworICB9CisKKyAgc3RhdGUtPm91dHB1dC0+cmVzaXplKHN0YXRlLT53aWR0aCAqIHN0YXRlLT5vdXRwdXRfY2hhbm5lbHMgKiBzdGF0ZS0+aGVpZ2h0KTsKK30KKwordm9pZCBEZWNvZGVSb3dDYWxsYmFjayhwbmdfc3RydWN0KiBwbmdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZSogbmV3X3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgcm93X251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhc3MpIHsKKyAgUG5nRGVjb2RlclN0YXRlKiBzdGF0ZSA9CisgICAgICBzdGF0aWNfY2FzdDxQbmdEZWNvZGVyU3RhdGUqPihwbmdfZ2V0X3Byb2dyZXNzaXZlX3B0cihwbmdfcHRyKSk7CisKKyAgaWYgKHN0YXRpY19jYXN0PGludD4ocm93X251bSkgPiBzdGF0ZS0+aGVpZ2h0KSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybjsKKyAgfQorCisgIHVuc2lnbmVkIGNoYXIqIGJhc2UgPSBOVUxMOworICBiYXNlID0gJnN0YXRlLT5vdXRwdXQtPmZyb250KCk7CisKKyAgdW5zaWduZWQgY2hhciogZGVzdCA9ICZiYXNlW3N0YXRlLT53aWR0aCAqIHN0YXRlLT5vdXRwdXRfY2hhbm5lbHMgKiByb3dfbnVtXTsKKyAgaWYgKHN0YXRlLT5yb3dfY29udmVydGVyKQorICAgIHN0YXRlLT5yb3dfY29udmVydGVyKG5ld19yb3csIHN0YXRlLT53aWR0aCwgZGVzdCwgJnN0YXRlLT5pc19vcGFxdWUpOworICBlbHNlCisgICAgbWVtY3B5KGRlc3QsIG5ld19yb3csIHN0YXRlLT53aWR0aCAqIHN0YXRlLT5vdXRwdXRfY2hhbm5lbHMpOworfQorCit2b2lkIERlY29kZUVuZENhbGxiYWNrKHBuZ19zdHJ1Y3QqIHBuZ19wdHIsIHBuZ19pbmZvKiBpbmZvKSB7CisgIFBuZ0RlY29kZXJTdGF0ZSogc3RhdGUgPQorICAgICAgc3RhdGljX2Nhc3Q8UG5nRGVjb2RlclN0YXRlKj4ocG5nX2dldF9wcm9ncmVzc2l2ZV9wdHIocG5nX3B0cikpOworCisgIC8vIE1hcmsgdGhlIGltYWdlIGFzIGNvbXBsZXRlLCB0aGlzIHdpbGwgdGVsbCB0aGUgRGVjb2RlIGZ1bmN0aW9uIHRoYXQgd2UKKyAgLy8gaGF2ZSBzdWNjZXNzZnVsbHkgZm91bmQgdGhlIGVuZCBvZiB0aGUgZGF0YS4KKyAgc3RhdGUtPmRvbmUgPSB0cnVlOworfQorCisvLyBBdXRvbWF0aWNhbGx5IGRlc3Ryb3lzIHRoZSBnaXZlbiByZWFkIHN0cnVjdHMgb24gZGVzdHJ1Y3Rpb24gdG8gbWFrZQorLy8gY2xlYW51cCBhbmQgZXJyb3IgaGFuZGxpbmcgY29kZSBjbGVhbmVyLgorY2xhc3MgUG5nUmVhZFN0cnVjdERlc3Ryb3llciB7CisgcHVibGljOgorICBQbmdSZWFkU3RydWN0RGVzdHJveWVyKHBuZ19zdHJ1Y3QqKiBwcywgcG5nX2luZm8qKiBwaSkgOiBwc18ocHMpLCBwaV8ocGkpIHt9CisgIH5QbmdSZWFkU3RydWN0RGVzdHJveWVyKCkgeyBwbmdfZGVzdHJveV9yZWFkX3N0cnVjdChwc18sIHBpXywgTlVMTCk7IH0KKworIHByaXZhdGU6CisgIHBuZ19zdHJ1Y3QqKiBwc187CisgIHBuZ19pbmZvKiogcGlfOworfTsKKworYm9vbCBCdWlsZFBOR1N0cnVjdChjb25zdCB1bnNpZ25lZCBjaGFyKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGlucHV0X3NpemUsCisgICAgICAgICAgICAgICAgICAgIHBuZ19zdHJ1Y3QqKiBwbmdfcHRyLAorICAgICAgICAgICAgICAgICAgICBwbmdfaW5mbyoqIGluZm9fcHRyKSB7CisgIGlmIChpbnB1dF9zaXplIDwgOCkKKyAgICByZXR1cm4gZmFsc2U7ICAvLyBJbnB1dCBkYXRhIHRvbyBzbWFsbCB0byBiZSBhIHBuZworCisgIC8vIEhhdmUgbGlicG5nIGNoZWNrIHRoZSBzaWduYXR1cmUsIGl0IGxpa2VzIHRoZSBmaXJzdCA4IGJ5dGVzLgorICBpZiAocG5nX3NpZ19jbXAoY29uc3RfY2FzdDx1bnNpZ25lZCBjaGFyKj4oaW5wdXQpLCAwLCA4KSAhPSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICAqcG5nX3B0ciA9IHBuZ19jcmVhdGVfcmVhZF9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyAgaWYgKCEqcG5nX3B0cikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgKmluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdCgqcG5nX3B0cik7CisgIGlmICghKmluZm9fcHRyKSB7CisgICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QocG5nX3B0ciwgTlVMTCwgTlVMTCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK2Jvb2wgRGVjb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGlucHV0LAorICAgICAgICAgICAgc2l6ZV90IGlucHV0X3NpemUsCisgICAgICAgICAgICBDb2xvckZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiogb3V0cHV0LAorICAgICAgICAgICAgaW50KiB3LAorICAgICAgICAgICAgaW50KiBoKSB7CisgIHBuZ19zdHJ1Y3QqIHBuZ19wdHIgPSBOVUxMOworICBwbmdfaW5mbyogaW5mb19wdHIgPSBOVUxMOworICBpZiAoIUJ1aWxkUE5HU3RydWN0KGlucHV0LCBpbnB1dF9zaXplLCAmcG5nX3B0ciwgJmluZm9fcHRyKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgUG5nUmVhZFN0cnVjdERlc3Ryb3llciBkZXN0cm95ZXIoJnBuZ19wdHIsICZpbmZvX3B0cik7CisgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpIHsKKyAgICAvLyBUaGUgZGVzdHJveWVyIHdpbGwgZW5zdXJlIHRoYXQgdGhlIHN0cnVjdHVyZXMgYXJlIGNsZWFuZWQgdXAgaW4gdGhpcworICAgIC8vIGNhc2UsIGV2ZW4gdGhvdWdoIHdlIG1heSBnZXQgaGVyZSBhcyBhIGp1bXAgZnJvbSByYW5kb20gcGFydHMgb2YgdGhlCisgICAgLy8gUE5HIGxpYnJhcnkgY2FsbGVkIGJlbG93LgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIFBuZ0RlY29kZXJTdGF0ZSBzdGF0ZShmb3JtYXQsIG91dHB1dCk7CisKKyAgcG5nX3NldF9wcm9ncmVzc2l2ZV9yZWFkX2ZuKHBuZ19wdHIsICZzdGF0ZSwgJkRlY29kZUluZm9DYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEZWNvZGVSb3dDYWxsYmFjaywgJkRlY29kZUVuZENhbGxiYWNrKTsKKyAgcG5nX3Byb2Nlc3NfZGF0YShwbmdfcHRyLCBpbmZvX3B0ciwgY29uc3RfY2FzdDx1bnNpZ25lZCBjaGFyKj4oaW5wdXQpLAorICAgICAgICAgICAgICAgICAgIGlucHV0X3NpemUpOworCisgIGlmICghc3RhdGUuZG9uZSkgeworICAgIC8vIEZlZCBpdCBhbGwgdGhlIGRhdGEgYnV0IHRoZSBsaWJyYXJ5IGRpZG4ndCB0aGluayB3ZSBnb3QgYWxsIHRoZSBkYXRhLCBzbworICAgIC8vIHRoaXMgZmlsZSBtdXN0IGJlIHRydW5jYXRlZC4KKyAgICBvdXRwdXQtPmNsZWFyKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKncgPSBzdGF0ZS53aWR0aDsKKyAgKmggPSBzdGF0ZS5oZWlnaHQ7CisgIHJldHVybiB0cnVlOworfQorCisvLyBFbmNvZGVyCisvLworLy8gVGhpcyBzZWN0aW9uIG9mIHRoZSBjb2RlIGlzIGJhc2VkIG9uIG5zUE5HRW5jb2Rlci5jcHAgaW4gTW96aWxsYQorLy8gKENvcHlyaWdodCAyMDA1IEdvb2dsZSBJbmMuKQorCituYW1lc3BhY2UgeworCisvLyBQYXNzZWQgYXJvdW5kIGFzIHRoZSBpb19wdHIgaW4gdGhlIHBuZyBzdHJ1Y3RzIHNvIG91ciBjYWxsYmFja3Mga25vdyB3aGVyZQorLy8gdG8gd3JpdGUgZGF0YS4KK3N0cnVjdCBQbmdFbmNvZGVyU3RhdGUgeworICBleHBsaWNpdCBQbmdFbmNvZGVyU3RhdGUoc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4qIG8pIDogb3V0KG8pIHt9CisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+KiBvdXQ7Cit9OworCisvLyBDYWxsZWQgYnkgbGlicG5nIHRvIGZsdXNoIGl0cyBpbnRlcm5hbCBidWZmZXIgdG8gb3Vycy4KK3ZvaWQgRW5jb2RlcldyaXRlQ2FsbGJhY2socG5nX3N0cnVjdHAgcG5nLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBzaXplKSB7CisgIFBuZ0VuY29kZXJTdGF0ZSogc3RhdGUgPSBzdGF0aWNfY2FzdDxQbmdFbmNvZGVyU3RhdGUqPihwbmdfZ2V0X2lvX3B0cihwbmcpKTsKKyAgc2l6ZV90IG9sZF9zaXplID0gc3RhdGUtPm91dC0+c2l6ZSgpOworICBzdGF0ZS0+b3V0LT5yZXNpemUob2xkX3NpemUgKyBzaXplKTsKKyAgbWVtY3B5KCYoKnN0YXRlLT5vdXQpW29sZF9zaXplXSwgZGF0YSwgc2l6ZSk7Cit9CisKK3ZvaWQgRmFrZUZsdXNoQ2FsbGJhY2socG5nX3N0cnVjdHAgcG5nKSB7CisgIC8vIFdlIGRvbid0IG5lZWQgdG8gcGVyZm9ybSBhbnkgZmx1c2hpbmcgc2luY2Ugd2UgYXJlbid0IGRvaW5nIHJlYWwgSU8sIGJ1dAorICAvLyB3ZSdyZSByZXF1aXJlZCB0byBwcm92aWRlIHRoaXMgZnVuY3Rpb24gYnkgbGlicG5nLgorfQorCit2b2lkIENvbnZlcnRCR1JBdG9SR0IoY29uc3QgdW5zaWduZWQgY2hhciogYmdyYSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogcmdiLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGlzX29wYXF1ZSkgeworICBmb3IgKGludCB4ID0gMDsgeCA8IHBpeGVsX3dpZHRoOyB4KyspIHsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBwaXhlbF9pbiA9ICZiZ3JhW3ggKiA0XTsKKyAgICB1bnNpZ25lZCBjaGFyKiBwaXhlbF9vdXQgPSAmcmdiW3ggKiAzXTsKKyAgICBwaXhlbF9vdXRbMF0gPSBwaXhlbF9pblsyXTsKKyAgICBwaXhlbF9vdXRbMV0gPSBwaXhlbF9pblsxXTsKKyAgICBwaXhlbF9vdXRbMl0gPSBwaXhlbF9pblswXTsKKyAgfQorfQorCisjaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECisKK2lubGluZSBjaGFyKiBzdHJkdXAoY29uc3QgY2hhciogc3RyKSB7CisjaWYgZGVmaW5lZChPU19XSU4pCisgIHJldHVybiBfc3RyZHVwKHN0cik7CisjZWxzZQorICByZXR1cm4gOjpzdHJkdXAoc3RyKTsKKyNlbmRpZgorfQorCitjbGFzcyBDb21tZW50V3JpdGVyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENvbW1lbnRXcml0ZXIoY29uc3Qgc3RkOjp2ZWN0b3I8Q29tbWVudD4mIGNvbW1lbnRzKQorICAgICAgOiBjb21tZW50c18oY29tbWVudHMpLCBwbmdfdGV4dF8obmV3IHBuZ190ZXh0W2NvbW1lbnRzLnNpemUoKV0pIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbW1lbnRzLnNpemUoKTsgKytpKQorICAgICAgQWRkQ29tbWVudChpLCBjb21tZW50c1tpXSk7CisgIH0KKworICB+Q29tbWVudFdyaXRlcigpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbW1lbnRzXy5zaXplKCk7ICsraSkgeworICAgICAgZnJlZShwbmdfdGV4dF9baV0ua2V5KTsKKyAgICAgIGZyZWUocG5nX3RleHRfW2ldLnRleHQpOworICAgIH0KKyAgICBkZWxldGVbXSBwbmdfdGV4dF87CisgIH0KKworICBib29sIEhhc0NvbW1lbnRzKCkgeyByZXR1cm4gIWNvbW1lbnRzXy5lbXB0eSgpOyB9CisKKyAgcG5nX3RleHQqIGdldF9wbmdfdGV4dCgpIHsgcmV0dXJuIHBuZ190ZXh0XzsgfQorCisgIGludCBzaXplKCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pihjb21tZW50c18uc2l6ZSgpKTsgfQorCisgcHJpdmF0ZToKKyAgdm9pZCBBZGRDb21tZW50KHNpemVfdCBwb3MsIGNvbnN0IENvbW1lbnQmIGNvbW1lbnQpIHsKKyAgICBwbmdfdGV4dF9bcG9zXS5jb21wcmVzc2lvbiA9IFBOR19URVhUX0NPTVBSRVNTSU9OX05PTkU7CisgICAgLy8gQSBQTkcgY29tbWVudCdzIGtleSBjYW4gb25seSBiZSA3OSBjaGFyYWN0ZXJzIGxvbmcuCisgICAgaWYgKGNvbW1lbnQua2V5Lmxlbmd0aCgpID4gNzkpCisgICAgICByZXR1cm47CisgICAgcG5nX3RleHRfW3Bvc10ua2V5ID0gc3RyZHVwKGNvbW1lbnQua2V5LnN1YnN0cigwLCA3OCkuY19zdHIoKSk7CisgICAgcG5nX3RleHRfW3Bvc10udGV4dCA9IHN0cmR1cChjb21tZW50LnRleHQuY19zdHIoKSk7CisgICAgcG5nX3RleHRfW3Bvc10udGV4dF9sZW5ndGggPSBjb21tZW50LnRleHQubGVuZ3RoKCk7CisjaWZkZWYgUE5HX2lUWHRfU1VQUE9SVEVECisgICAgcG5nX3RleHRfW3Bvc10uaXR4dF9sZW5ndGggPSAwOworICAgIHBuZ190ZXh0X1twb3NdLmxhbmcgPSAwOworICAgIHBuZ190ZXh0X1twb3NdLmxhbmdfa2V5ID0gMDsKKyNlbmRpZgorICB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29tbWVudD4gY29tbWVudHNfOworICBwbmdfdGV4dCogcG5nX3RleHRfOworfTsKKyNlbmRpZiAgLy8gUE5HX1RFWFRfU1VQUE9SVEVECisKKy8vIFRoZSB0eXBlIG9mIGZ1bmN0aW9ucyB1c2FibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBwaXhlbCBmb3JtYXRzLgordHlwZWRlZiB2b2lkICgqRm9ybWF0Q29udmVydGVyKShjb25zdCB1bnNpZ25lZCBjaGFyKiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogaXNfb3BhcXVlKTsKKworLy8gbGlicG5nIHVzZXMgYSB3YWNreSBzZXRqbXAtYmFzZWQgQVBJLCB3aGljaCBtYWtlcyB0aGUgY29tcGlsZXIgbmVydm91cy4KKy8vIFdlIGNvbnN0cmFpbiBhbGwgb2YgdGhlIGNhbGxzIHdlIG1ha2UgdG8gbGlicG5nIHdoZXJlIHRoZSBzZXRqbXAoKSBpcyBpbgorLy8gcGxhY2UgdG8gdGhpcyBmdW5jdGlvbi4KKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgorYm9vbCBEb0xpYnBuZ1dyaXRlKHBuZ19zdHJ1Y3QqIHBuZ19wdHIsCisgICAgICAgICAgICAgICAgICAgcG5nX2luZm8qIGluZm9fcHRyLAorICAgICAgICAgICAgICAgICAgIFBuZ0VuY29kZXJTdGF0ZSogc3RhdGUsCisgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgaW50IHJvd19ieXRlX3dpZHRoLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGlucHV0LAorICAgICAgICAgICAgICAgICAgIGludCBjb21wcmVzc2lvbl9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICBpbnQgcG5nX291dHB1dF9jb2xvcl90eXBlLAorICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXRfY29sb3JfY29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICBGb3JtYXRDb252ZXJ0ZXIgY29udmVydGVyLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENvbW1lbnQ+JiBjb21tZW50cykgeworI2lmZGVmIFBOR19URVhUX1NVUFBPUlRFRAorICBDb21tZW50V3JpdGVyIGNvbW1lbnRfd3JpdGVyKGNvbW1lbnRzKTsKKyNlbmRpZgorICB1bnNpZ25lZCBjaGFyKiByb3dfYnVmZmVyID0gTlVMTDsKKworICAvLyBNYWtlIHN1cmUgdG8gbm90IGRlY2xhcmUgYW55IGxvY2FscyBoZXJlIC0tIGxvY2FscyBpbiB0aGUgcHJlc2VuY2UKKyAgLy8gb2Ygc2V0am1wKCkgaW4gQysrIGNvZGUgbWFrZXMgZ2NjIGNvbXBsYWluLgorCisgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmdfcHRyKSkpIHsKKyAgICBkZWxldGVbXSByb3dfYnVmZmVyOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHBuZ19zZXRfY29tcHJlc3Npb25fbGV2ZWwocG5nX3B0ciwgY29tcHJlc3Npb25fbGV2ZWwpOworCisgIC8vIFNldCBvdXIgY2FsbGJhY2sgZm9yIGxpYnBuZyB0byBnaXZlIHVzIHRoZSBkYXRhLgorICBwbmdfc2V0X3dyaXRlX2ZuKHBuZ19wdHIsIHN0YXRlLCBFbmNvZGVyV3JpdGVDYWxsYmFjaywgRmFrZUZsdXNoQ2FsbGJhY2spOworCisgIHBuZ19zZXRfSUhEUihwbmdfcHRyLCBpbmZvX3B0ciwgd2lkdGgsIGhlaWdodCwgOCwgcG5nX291dHB1dF9jb2xvcl90eXBlLAorICAgICAgICAgICAgICAgUE5HX0lOVEVSTEFDRV9OT05FLCBQTkdfQ09NUFJFU1NJT05fVFlQRV9ERUZBVUxULAorICAgICAgICAgICAgICAgUE5HX0ZJTFRFUl9UWVBFX0RFRkFVTFQpOworCisjaWZkZWYgUE5HX1RFWFRfU1VQUE9SVEVECisgIGlmIChjb21tZW50X3dyaXRlci5IYXNDb21tZW50cygpKSB7CisgICAgcG5nX3NldF90ZXh0KHBuZ19wdHIsIGluZm9fcHRyLCBjb21tZW50X3dyaXRlci5nZXRfcG5nX3RleHQoKSwKKyAgICAgICAgICAgICAgICAgY29tbWVudF93cml0ZXIuc2l6ZSgpKTsKKyAgfQorI2VuZGlmCisKKyAgcG5nX3dyaXRlX2luZm8ocG5nX3B0ciwgaW5mb19wdHIpOworCisgIGlmICghY29udmVydGVyKSB7CisgICAgLy8gTm8gY29udmVyc2lvbiBuZWVkZWQsIGdpdmUgdGhlIGRhdGEgZGlyZWN0bHkgdG8gbGlicG5nLgorICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKKyAgICAgIHBuZ193cml0ZV9yb3cocG5nX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDx1bnNpZ25lZCBjaGFyKj4oJmlucHV0W3kgKiByb3dfYnl0ZV93aWR0aF0pKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gTmVlZHMgY29udmVyc2lvbiB1c2luZyBhIHNlcGFyYXRlIGJ1ZmZlci4KKyAgICByb3dfYnVmZmVyID0gbmV3IHVuc2lnbmVkIGNoYXJbd2lkdGggKiBvdXRwdXRfY29sb3JfY29tcG9uZW50c107CisgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgY29udmVydGVyKCZpbnB1dFt5ICogcm93X2J5dGVfd2lkdGhdLCB3aWR0aCwgcm93X2J1ZmZlciwgTlVMTCk7CisgICAgICBwbmdfd3JpdGVfcm93KHBuZ19wdHIsIHJvd19idWZmZXIpOworICAgIH0KKyAgICBkZWxldGVbXSByb3dfYnVmZmVyOworICB9CisKKyAgcG5nX3dyaXRlX2VuZChwbmdfcHRyLCBpbmZvX3B0cik7CisgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitib29sIEVuY29kZVdpdGhDb21wcmVzc2lvbkxldmVsKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvckZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd19ieXRlX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRpc2NhcmRfdHJhbnNwYXJlbmN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDb21tZW50PiYgY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wcmVzc2lvbl9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4qIG91dHB1dCkgeworICAvLyBSdW4gdG8gY29udmVydCBhbiBpbnB1dCByb3cgaW50byB0aGUgb3V0cHV0IHJvdyBmb3JtYXQsIE5VTEwgbWVhbnMgbm8KKyAgLy8gY29udmVyc2lvbiBpcyBuZWNlc3NhcnkuCisgIEZvcm1hdENvbnZlcnRlciBjb252ZXJ0ZXIgPSBudWxscHRyOworCisgIGludCBpbnB1dF9jb2xvcl9jb21wb25lbnRzLCBvdXRwdXRfY29sb3JfY29tcG9uZW50czsKKyAgaW50IHBuZ19vdXRwdXRfY29sb3JfdHlwZTsKKyAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIEZPUk1BVF9CR1I6CisgICAgICBjb252ZXJ0ZXIgPSBDb252ZXJ0QkdSdG9SR0I7CisKKyAgICBjYXNlIEZPUk1BVF9SR0I6CisgICAgICBpbnB1dF9jb2xvcl9jb21wb25lbnRzID0gMzsKKyAgICAgIG91dHB1dF9jb2xvcl9jb21wb25lbnRzID0gMzsKKyAgICAgIHBuZ19vdXRwdXRfY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQjsKKyAgICAgIGRpc2NhcmRfdHJhbnNwYXJlbmN5ID0gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGNhc2UgRk9STUFUX1JHQkE6CisgICAgICBpbnB1dF9jb2xvcl9jb21wb25lbnRzID0gNDsKKyAgICAgIGlmIChkaXNjYXJkX3RyYW5zcGFyZW5jeSkgeworICAgICAgICBvdXRwdXRfY29sb3JfY29tcG9uZW50cyA9IDM7CisgICAgICAgIHBuZ19vdXRwdXRfY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQjsKKyAgICAgICAgY29udmVydGVyID0gQ29udmVydFJHQkF0b1JHQjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG91dHB1dF9jb2xvcl9jb21wb25lbnRzID0gNDsKKyAgICAgICAgcG5nX291dHB1dF9jb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBOworICAgICAgICBjb252ZXJ0ZXIgPSBudWxscHRyOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZPUk1BVF9CR1JBOgorICAgICAgaW5wdXRfY29sb3JfY29tcG9uZW50cyA9IDQ7CisgICAgICBpZiAoZGlzY2FyZF90cmFuc3BhcmVuY3kpIHsKKyAgICAgICAgb3V0cHV0X2NvbG9yX2NvbXBvbmVudHMgPSAzOworICAgICAgICBwbmdfb3V0cHV0X2NvbG9yX3R5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0I7CisgICAgICAgIGNvbnZlcnRlciA9IENvbnZlcnRCR1JBdG9SR0I7CisgICAgICB9IGVsc2UgeworICAgICAgICBvdXRwdXRfY29sb3JfY29tcG9uZW50cyA9IDQ7CisgICAgICAgIHBuZ19vdXRwdXRfY29sb3JfdHlwZSA9IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQTsKKyAgICAgICAgY29udmVydGVyID0gQ29udmVydEJldHdlZW5CR1JBYW5kUkdCQTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBGT1JNQVRfR1JBWToKKyAgICAgIGlucHV0X2NvbG9yX2NvbXBvbmVudHMgPSAxOworICAgICAgb3V0cHV0X2NvbG9yX2NvbXBvbmVudHMgPSAxOworICAgICAgcG5nX291dHB1dF9jb2xvcl90eXBlID0gUE5HX0NPTE9SX1RZUEVfR1JBWTsKKyAgICAgIGRpc2NhcmRfdHJhbnNwYXJlbmN5ID0gZmFsc2U7CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBSb3cgc3RyaWRlIHNob3VsZCBiZSBhdCBsZWFzdCBhcyBsb25nIGFzIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEuCisgIGlmIChyb3dfYnl0ZV93aWR0aCA8IGlucHV0X2NvbG9yX2NvbXBvbmVudHMgKiB3aWR0aCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcG5nX3N0cnVjdCogcG5nX3B0ciA9CisgICAgICBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdChQTkdfTElCUE5HX1ZFUl9TVFJJTkcsIE5VTEwsIE5VTEwsIE5VTEwpOworICBpZiAoIXBuZ19wdHIpCisgICAgcmV0dXJuIGZhbHNlOworICBwbmdfaW5mbyogaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ19wdHIpOworICBpZiAoIWluZm9fcHRyKSB7CisgICAgcG5nX2Rlc3Ryb3lfd3JpdGVfc3RydWN0KCZwbmdfcHRyLCBOVUxMKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBQbmdFbmNvZGVyU3RhdGUgc3RhdGUob3V0cHV0KTsKKyAgYm9vbCBzdWNjZXNzID0KKyAgICAgIERvTGlicG5nV3JpdGUocG5nX3B0ciwgaW5mb19wdHIsICZzdGF0ZSwgd2lkdGgsIGhlaWdodCwgcm93X2J5dGVfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGlucHV0LCBjb21wcmVzc2lvbl9sZXZlbCwgcG5nX291dHB1dF9jb2xvcl90eXBlLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRfY29sb3JfY29tcG9uZW50cywgY29udmVydGVyLCBjb21tZW50cyk7CisgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nX3B0ciwgJmluZm9fcHRyKTsKKworICByZXR1cm4gc3VjY2VzczsKK30KKworLy8gc3RhdGljCitib29sIEVuY29kZShjb25zdCB1bnNpZ25lZCBjaGFyKiBpbnB1dCwKKyAgICAgICAgICAgIENvbG9yRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IGludCB3aWR0aCwKKyAgICAgICAgICAgIGNvbnN0IGludCBoZWlnaHQsCisgICAgICAgICAgICBpbnQgcm93X2J5dGVfd2lkdGgsCisgICAgICAgICAgICBib29sIGRpc2NhcmRfdHJhbnNwYXJlbmN5LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29tbWVudD4mIGNvbW1lbnRzLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4qIG91dHB1dCkgeworICByZXR1cm4gRW5jb2RlV2l0aENvbXByZXNzaW9uTGV2ZWwoaW5wdXQsIGZvcm1hdCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd19ieXRlX3dpZHRoLCBkaXNjYXJkX3RyYW5zcGFyZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzLCBaX0RFRkFVTFRfQ09NUFJFU1NJT04sIG91dHB1dCk7Cit9CisKKy8vIERlY29kZSBhIFBORyBpbnRvIGFuIFJHQkEgcGl4ZWwgYXJyYXkuCitib29sIERlY29kZVBORyhjb25zdCB1bnNpZ25lZCBjaGFyKiBpbnB1dCwKKyAgICAgICAgICAgICAgIHNpemVfdCBpbnB1dF9zaXplLAorICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4qIG91dHB1dCwKKyAgICAgICAgICAgICAgIGludCogd2lkdGgsCisgICAgICAgICAgICAgICBpbnQqIGhlaWdodCkgeworICByZXR1cm4gRGVjb2RlKGlucHV0LCBpbnB1dF9zaXplLCBGT1JNQVRfUkdCQSwgb3V0cHV0LCB3aWR0aCwgaGVpZ2h0KTsKK30KKworLy8gRW5jb2RlIGEgQkdSIHBpeGVsIGFycmF5IGludG8gYSBQTkcuCitib29sIEVuY29kZUJHUlBORyhjb25zdCB1bnNpZ25lZCBjaGFyKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICBpbnQgcm93X2J5dGVfd2lkdGgsCisgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiogb3V0cHV0KSB7CisgIHJldHVybiBFbmNvZGUoaW5wdXQsIEZPUk1BVF9CR1IsIHdpZHRoLCBoZWlnaHQsIHJvd19ieXRlX3dpZHRoLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDb21tZW50PigpLCBvdXRwdXQpOworfQorCisvLyBFbmNvZGUgYW4gUkdCQSBwaXhlbCBhcnJheSBpbnRvIGEgUE5HLgorYm9vbCBFbmNvZGVSR0JBUE5HKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGlucHV0LAorICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIGludCByb3dfYnl0ZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiogb3V0cHV0KSB7CisgIHJldHVybiBFbmNvZGUoaW5wdXQsIEZPUk1BVF9SR0JBLCB3aWR0aCwgaGVpZ2h0LCByb3dfYnl0ZV93aWR0aCwgZmFsc2UsCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q29tbWVudD4oKSwgb3V0cHV0KTsKK30KKworLy8gRW5jb2RlIGFuIEJHUkEgcGl4ZWwgYXJyYXkgaW50byBhIFBORy4KK2Jvb2wgRW5jb2RlQkdSQVBORyhjb25zdCB1bnNpZ25lZCBjaGFyKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICBpbnQgcm93X2J5dGVfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgYm9vbCBkaXNjYXJkX3RyYW5zcGFyZW5jeSwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiogb3V0cHV0KSB7CisgIHJldHVybiBFbmNvZGUoaW5wdXQsIEZPUk1BVF9CR1JBLCB3aWR0aCwgaGVpZ2h0LCByb3dfYnl0ZV93aWR0aCwKKyAgICAgICAgICAgICAgICBkaXNjYXJkX3RyYW5zcGFyZW5jeSwgc3RkOjp2ZWN0b3I8Q29tbWVudD4oKSwgb3V0cHV0KTsKK30KKworLy8gRW5jb2RlIGEgZ3JheXNjYWxlIHBpeGVsIGFycmF5IGludG8gYSBQTkcuCitib29sIEVuY29kZUdyYXlQTkcoY29uc3QgdW5zaWduZWQgY2hhciogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgaW50IHJvd19ieXRlX3dpZHRoLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+KiBvdXRwdXQpIHsKKyAgcmV0dXJuIEVuY29kZShpbnB1dCwgRk9STUFUX0dSQVksIHdpZHRoLCBoZWlnaHQsIHJvd19ieXRlX3dpZHRoLCBmYWxzZSwKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDb21tZW50PigpLCBvdXRwdXQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW1hZ2VfZGlmZl9wbmcKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvaW1hZ2VfZGlmZi9pbWFnZV9kaWZmX3BuZy5oIGIvdGVzdGluZy9pbWFnZV9kaWZmL2ltYWdlX2RpZmZfcG5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMzNGIyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvaW1hZ2VfZGlmZi9pbWFnZV9kaWZmX3BuZy5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBURVNUSU5HX0lNQUdFX0RJRkZfSU1BR0VfRElGRl9QTkdfSF8KKyNkZWZpbmUgVEVTVElOR19JTUFHRV9ESUZGX0lNQUdFX0RJRkZfUE5HX0hfCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4gIC8vIGZvciBzaXplX3QuCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBpbWFnZV9kaWZmX3BuZyB7CisKKy8vIERlY29kZSBhIFBORyBpbnRvIGFuIFJHQkEgcGl4ZWwgYXJyYXkuCitib29sIERlY29kZVBORyhjb25zdCB1bnNpZ25lZCBjaGFyKiBpbnB1dCwKKyAgICAgICAgICAgICAgIHNpemVfdCBpbnB1dF9zaXplLAorICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4qIG91dHB1dCwKKyAgICAgICAgICAgICAgIGludCogd2lkdGgsCisgICAgICAgICAgICAgICBpbnQqIGhlaWdodCk7CisKKy8vIEVuY29kZSBhIEJHUiBwaXhlbCBhcnJheSBpbnRvIGEgUE5HLgorYm9vbCBFbmNvZGVCR1JQTkcoY29uc3QgdW5zaWduZWQgY2hhciogaW5wdXQsCisgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgaW50IHJvd19ieXRlX3dpZHRoLAorICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4qIG91dHB1dCk7CisKKy8vIEVuY29kZSBhbiBSR0JBIHBpeGVsIGFycmF5IGludG8gYSBQTkcuCitib29sIEVuY29kZVJHQkFQTkcoY29uc3QgdW5zaWduZWQgY2hhciogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgaW50IHJvd19ieXRlX3dpZHRoLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+KiBvdXRwdXQpOworCisvLyBFbmNvZGUgYW4gQkdSQSBwaXhlbCBhcnJheSBpbnRvIGEgUE5HLgorYm9vbCBFbmNvZGVCR1JBUE5HKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGlucHV0LAorICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIGludCByb3dfYnl0ZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICBib29sIGRpc2NhcmRfdHJhbnNwYXJlbmN5LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+KiBvdXRwdXQpOworCisvLyBFbmNvZGUgYSBncmF5c2NhbGUgcGl4ZWwgYXJyYXkgaW50byBhIFBORy4KK2Jvb2wgRW5jb2RlR3JheVBORyhjb25zdCB1bnNpZ25lZCBjaGFyKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICBpbnQgcm93X2J5dGVfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4qIG91dHB1dCk7CisKK30gIC8vIG5hbWVzcGFjZSBpbWFnZV9kaWZmX3BuZworCisjZW5kaWYgIC8vIFRFU1RJTkdfSU1BR0VfRElGRl9JTUFHRV9ESUZGX1BOR19IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9qc19lbWJlZGRlcl90ZXN0LmNwcCBiL3Rlc3RpbmcvanNfZW1iZWRkZXJfdGVzdC5jcHAKaW5kZXggMDY0YTk2MS4uZTllYjcwZCAxMDA2NDQKLS0tIGEvdGVzdGluZy9qc19lbWJlZGRlcl90ZXN0LmNwcAorKysgYi90ZXN0aW5nL2pzX2VtYmVkZGVyX3Rlc3QuY3BwCkBAIC0zLDExICszLDEyIEBACiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCiAjaW5jbHVkZSAidGVzdGluZy9qc19lbWJlZGRlcl90ZXN0LmgiCisKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKIEpTRW1iZWRkZXJUZXN0OjpKU0VtYmVkZGVyVGVzdCgpCi0gICAgOiBtX3BBcnJheUJ1ZmZlckFsbG9jYXRvcihuZXcgRlhKU19BcnJheUJ1ZmZlckFsbG9jYXRvciksCi0gICAgICBtX3BJc29sYXRlKG51bGxwdHIpIHt9CisgICAgOiBtX3BBcnJheUJ1ZmZlckFsbG9jYXRvcihwZGZpdW06Ok1ha2VVbmlxdWU8RlhKU19BcnJheUJ1ZmZlckFsbG9jYXRvcj4oKSkgeworfQogCiBKU0VtYmVkZGVyVGVzdDo6fkpTRW1iZWRkZXJUZXN0KCkge30KIApkaWZmIC0tZ2l0IGEvdGVzdGluZy9qc19lbWJlZGRlcl90ZXN0LmggYi90ZXN0aW5nL2pzX2VtYmVkZGVyX3Rlc3QuaAppbmRleCBmYmVjMGVhLi4xZjI3ZGJlIDEwMDY0NAotLS0gYS90ZXN0aW5nL2pzX2VtYmVkZGVyX3Rlc3QuaAorKysgYi90ZXN0aW5nL2pzX2VtYmVkZGVyX3Rlc3QuaApAQCAtNiw3ICs2LDYgQEAKICNkZWZpbmUgVEVTVElOR19KU19FTUJFRERFUl9URVNUX0hfCiAKICNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAiZnhqcy9meGpzX3Y4LmgiCiAjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCkBAIC0yNSw3ICsyNCw3IEBACiAKICBwcml2YXRlOgogICBzdGQ6OnVuaXF1ZV9wdHI8RlhKU19BcnJheUJ1ZmZlckFsbG9jYXRvcj4gbV9wQXJyYXlCdWZmZXJBbGxvY2F0b3I7Ci0gIHY4OjpJc29sYXRlKiBtX3BJc29sYXRlOworICB2ODo6SXNvbGF0ZSogbV9wSXNvbGF0ZSA9IG51bGxwdHI7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU19FbmdpbmU+IG1fRW5naW5lOwogfTsKIApkaWZmIC0tZ2l0IGEvdGVzdGluZy9saWJmdXp6ZXIvQlVJTEQuZ24gYi90ZXN0aW5nL2xpYmZ1enplci9CVUlMRC5nbgppbmRleCA5YmE4ZTMyLi4yMGM2NGQ5IDEwMDY0NAotLS0gYS90ZXN0aW5nL2xpYmZ1enplci9CVUlMRC5nbgorKysgYi90ZXN0aW5nL2xpYmZ1enplci9CVUlMRC5nbgpAQCAtMjEsMTQgKzIxLDQ3IEBACiB9CiAKIGdyb3VwKCJsaWJmdXp6ZXIiKSB7CisgIHRlc3Rvbmx5ID0gdHJ1ZQorICBkZXBzID0gWworICAgICI6cGRmX2NtYXBfZnV6emVyIiwKKyAgICAiOnBkZl9jb2RlY19hODVfZnV6emVyIiwKKyAgICAiOnBkZl9jb2RlY19mYXhfZnV6emVyIiwKKyAgICAiOnBkZl9jb2RlY19pY2NfZnV6emVyIiwKKyAgICAiOnBkZl9jb2RlY19qYmlnMl9mdXp6ZXIiLAorICAgICI6cGRmX2NvZGVjX3JsZV9mdXp6ZXIiLAorICAgICI6cGRmX2ZvbnRfZnV6emVyIiwKKyAgICAiOnBkZl9oaW50X3RhYmxlX2Z1enplciIsCisgICAgIjpwZGZfanB4X2Z1enplciIsCisgICAgIjpwZGZfcHNlbmdpbmVfZnV6emVyIiwKKyAgICAiOnBkZl9zdHJlYW1wYXJzZXJfZnV6emVyIiwKKyAgXQorICBpZiAocGRmX2VuYWJsZV94ZmEpIHsKKyAgICBkZXBzICs9IFsKKyAgICAgICI6cGRmX2NmeF9iYXJjb2RlX2Z1enplciIsCisgICAgICAiOnBkZl9jZnhfc2F4cmVhZGVyX2Z1enplciIsCisgICAgICAiOnBkZl9jb2RlY19ibXBfZnV6emVyIiwKKyAgICAgICI6cGRmX2NvZGVjX2dpZl9mdXp6ZXIiLAorICAgICAgIjpwZGZfY29kZWNfanBlZ19mdXp6ZXIiLAorICAgICAgIjpwZGZfY29kZWNfcG5nX2Z1enplciIsCisgICAgICAiOnBkZl9jb2RlY190aWZmX2Z1enplciIsCisgICAgICAiOnBkZl9jc3NfZnV6emVyIiwKKyAgICAgICI6cGRmX2ZtMmpzX2Z1enplciIsCisgICAgICAiOnBkZl9mb3JtY2FsY19mdXp6ZXIiLAorICAgICAgIjpwZGZfbHp3X2Z1enplciIsCisgICAgICAiOnBkZl94bWxfZnV6emVyIiwKKyAgICBdCisgIH0KIH0KIAogdGVtcGxhdGUoInBkZml1bV9mdXp6ZXIiKSB7CiAgIHNvdXJjZV9zZXQodGFyZ2V0X25hbWUpIHsKLSAgICBzb3VyY2VzID0gaW52b2tlci5zb3VyY2VzCisgICAgc291cmNlcyA9IGludm9rZXIuc291cmNlcyArIFsgInBkZl9mdXp6ZXJfaW5pdC5jYyIgXQogICAgIGRlcHMgPSBbCiAgICAgICAiLi4vLi46cGRmaXVtIiwKICAgICBdCisgICAgaWYgKGRlZmluZWQoaW52b2tlci5kZXBzKSkgeworICAgICAgZGVwcyArPSBpbnZva2VyLmRlcHMKKyAgICB9CiAgICAgdGVzdG9ubHkgPSB0cnVlCiAgICAgY29uZmlncyAtPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpjaHJvbWl1bV9jb2RlIiBdCiAgICAgY29uZmlncyArPSBbCkBAIC0zOSw2ICs3MiwxMiBAQAogfQogCiBpZiAocGRmX2VuYWJsZV94ZmEpIHsKKyAgcGRmaXVtX2Z1enplcigicGRmX2NmeF9iYXJjb2RlX2Z1enplciIpIHsKKyAgICBzb3VyY2VzID0gWworICAgICAgInBkZl9jZnhfYmFyY29kZV9mdXp6ZXIuY2MiLAorICAgIF0KKyAgfQorCiAgIHBkZml1bV9mdXp6ZXIoInBkZl9jZnhfc2F4cmVhZGVyX2Z1enplciIpIHsKICAgICBzb3VyY2VzID0gWwogICAgICAgInBkZl9jZnhfc2F4cmVhZGVyX2Z1enplci5jYyIsCkBAIC05Miw2ICsxMzEsMTggQEAKICAgICBdCiAgIH0KIAorICBwZGZpdW1fZnV6emVyKCJwZGZfZm9ybWNhbGNfZnV6emVyIikgeworICAgIHNvdXJjZXMgPSBbCisgICAgICAicGRmX2Zvcm1jYWxjX2Z1enplci5jYyIsCisgICAgXQorICB9CisKKyAgcGRmaXVtX2Z1enplcigicGRmX2x6d19mdXp6ZXIiKSB7CisgICAgc291cmNlcyA9IFsKKyAgICAgICJwZGZfbHp3X2Z1enplci5jYyIsCisgICAgXQorICB9CisKICAgcGRmaXVtX2Z1enplcigicGRmX3htbF9mdXp6ZXIiKSB7CiAgICAgc291cmNlcyA9IFsKICAgICAgICJwZGZfeG1sX2Z1enplci5jYyIsCkBAIC0xMTgsNiArMTY5LDkgQEAKIH0KIAogcGRmaXVtX2Z1enplcigicGRmX2NvZGVjX2ljY19mdXp6ZXIiKSB7CisgIGRlcHMgPSBbCisgICAgIi4uLy4uL3RoaXJkX3BhcnR5LzpsY21zMiIsCisgIF0KICAgc291cmNlcyA9IFsKICAgICAicGRmX2NvZGVjX2ljY19mdXp6ZXIuY2MiLAogICBdCkBAIC0xMzUsNiArMTg5LDEyIEBACiAgIF0KIH0KIAorcGRmaXVtX2Z1enplcigicGRmX2ZvbnRfZnV6emVyIikgeworICBzb3VyY2VzID0gWworICAgICJwZGZfZm9udF9mdXp6ZXIuY2MiLAorICBdCit9CisKIHBkZml1bV9mdXp6ZXIoInBkZl9oaW50X3RhYmxlX2Z1enplciIpIHsKICAgc291cmNlcyA9IFsKICAgICAicGRmX2hpbnRfdGFibGVfZnV6emVyLmNjIiwKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvbGliZnV6emVyL3BkZl9jZnhfYmFyY29kZV9mdXp6ZXIuY2MgYi90ZXN0aW5nL2xpYmZ1enplci9wZGZfY2Z4X2JhcmNvZGVfZnV6emVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMzRlODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL2xpYmZ1enplci9wZGZfY2Z4X2JhcmNvZGVfZnV6emVyLmNjCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDE3IFRoZSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgInhmYS9md2wvY2Z4X2JhcmNvZGUuaCIKKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoc2l6ZSA8IDIgKiBzaXplb2Yod2NoYXJfdCkpCisgICAgcmV0dXJuIDA7CisKKyAgQkNfVFlQRSB0eXBlID0gc3RhdGljX2Nhc3Q8QkNfVFlQRT4oZGF0YVswXSAlIChCQ19EQVRBTUFUUklYICsgMSkpOworCisgIC8vIE9ubHkgdXNlZCBvbmUgYnl0ZSwgYnV0IGFsaWduIHdpdGggd2NoYXJfdCBmb3Igc3RyaW5nIGJlbG93LgorICBkYXRhICs9IHNpemVvZih3Y2hhcl90KTsKKyAgc2l6ZSAtPSBzaXplb2Yod2NoYXJfdCk7CisKKyAgQ0ZYX0JhcmNvZGUgYmFyY29kZTsKKyAgaWYgKCFiYXJjb2RlLkNyZWF0ZSh0eXBlKSkKKyAgICByZXR1cm4gMDsKKworICAvLyBUT0RPKHRzZXBleik6IFNldHVwIG1vcmUgb3B0aW9ucyBmcm9tIHxkYXRhfC4KKyAgYmFyY29kZS5TZXRNb2R1bGVIZWlnaHQoMzAwKTsKKyAgYmFyY29kZS5TZXRNb2R1bGVXaWR0aCg0MjApOworICBiYXJjb2RlLlNldEhlaWdodCgyOTgpOworICBiYXJjb2RlLlNldFdpZHRoKDQxOCk7CisKKyAgV2lkZVN0cmluZ1ZpZXcgY29udGVudChyZWludGVycHJldF9jYXN0PGNvbnN0IHdjaGFyX3QqPihkYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIC8gc2l6ZW9mKHdjaGFyX3QpKTsKKworICBpZiAoIWJhcmNvZGUuRW5jb2RlKGNvbnRlbnQpKQorICAgIHJldHVybiAwOworCisgIC8vIFRPRE8odHNlcGV6KTogT3V0cHV0IHRvIGRldmljZS4KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90ZXN0aW5nL2xpYmZ1enplci9wZGZfY2Z4X3NheHJlYWRlcl9mdXp6ZXIuY2MgYi90ZXN0aW5nL2xpYmZ1enplci9wZGZfY2Z4X3NheHJlYWRlcl9mdXp6ZXIuY2MKaW5kZXggZDk5NDU3ZC4uYTgxMWE4ZSAxMDA2NDQKLS0tIGEvdGVzdGluZy9saWJmdXp6ZXIvcGRmX2NmeF9zYXhyZWFkZXJfZnV6emVyLmNjCisrKyBiL3Rlc3RpbmcvbGliZnV6emVyL3BkZl9jZnhfc2F4cmVhZGVyX2Z1enplci5jYwpAQCAtNCwyOSArNCwyMSBAQAogCiAjaW5jbHVkZSA8bWVtb3J5PgogCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfcmV0YWluX3B0ci5oIgotI2luY2x1ZGUgInhmYS9mZGUveG1sL2NmeF9zYXhyZWFkZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZmdhcy9jcnQvZmdhc19zdHJlYW0uaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV93aWRldGV4dHJlYWQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9tZW1vcnlzdHJlYW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9zZWVrYWJsZXN0cmVhbXByb3h5LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3NheHJlYWRlci5oIgogCiBleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7Ci0gIENGWF9XaWRlU3RyaW5nIGlucHV0ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KAotICAgICAgQ0ZYX0J5dGVTdHJpbmdDKGRhdGEsIHN0YXRpY19jYXN0PEZYX1NUUlNJWkU+KHNpemUpKSk7Ci0gIGF1dG8gc3RyZWFtID0gcGRmaXVtOjpNYWtlUmV0YWluPENYRkFfV2lkZVRleHRSZWFkPihpbnB1dCk7Ci0gIGlmICghc3RyZWFtKQotICAgIHJldHVybiAwOwotCi0gIENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gZmlsZVJlYWQgPQotICAgICAgc3RyZWFtLT5NYWtlU2Vla2FibGVSZWFkU3RyZWFtKCk7Ci0gIGlmICghZmlsZVJlYWQpCi0gICAgcmV0dXJuIDA7Ci0KICAgQ0ZYX1NBWFJlYWRlciByZWFkZXI7Ci0gIGlmIChyZWFkZXIuU3RhcnRQYXJzZShmaWxlUmVhZCwgMCwgLTEsIENGWF9TYXhQYXJzZU1vZGVfTm90U2tpcFNwYWNlKSA8IDApCisgIGlmIChyZWFkZXIuU3RhcnRQYXJzZShwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX01lbW9yeVN0cmVhbT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDx1aW50OF90Kj4oZGF0YSksIHNpemUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIC0xLCBDRlhfU2F4UGFyc2VNb2RlX05vdFNraXBTcGFjZSkgPCAwKSB7CiAgICAgcmV0dXJuIDA7CisgIH0KIAogICB3aGlsZSAoMSkgewotICAgIGludDMyX3QgcmV0ID0gcmVhZGVyLkNvbnRpbnVlUGFyc2UobnVsbHB0cik7CisgICAgaW50MzJfdCByZXQgPSByZWFkZXIuQ29udGludWVQYXJzZSgpOwogICAgIGlmIChyZXQgPCAwIHx8IHJldCA+IDk5KQogICAgICAgYnJlYWs7CiAgIH0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvbGliZnV6emVyL3BkZl9jbWFwX2Z1enplci5jYyBiL3Rlc3RpbmcvbGliZnV6emVyL3BkZl9jbWFwX2Z1enplci5jYwppbmRleCAxZTFhZGU3Li5iMGU0MWQ1IDEwMDY0NAotLS0gYS90ZXN0aW5nL2xpYmZ1enplci9wZGZfY21hcF9mdXp6ZXIuY2MKKysrIGIvdGVzdGluZy9saWJmdXp6ZXIvcGRmX2NtYXBfZnV6emVyLmNjCkBAIC00LDEwICs0LDExIEBACiAKICNpbmNsdWRlIDxjc3RkaW50PgogCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvZm9udF9pbnQuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2NtYXAuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKIGV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgQ1BERl9DTWFwIGNtYXA7Ci0gIGNtYXAuTG9hZEVtYmVkZGVkKGRhdGEsIHNpemUpOworICBhdXRvIGNtYXAgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERl9DTWFwPigpOworICBjbWFwLT5Mb2FkRW1iZWRkZWQoZGF0YSwgc2l6ZSk7CiAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9saWJmdXp6ZXIvcGRmX2NvZGVjX2ljY19mdXp6ZXIuY2MgYi90ZXN0aW5nL2xpYmZ1enplci9wZGZfY29kZWNfaWNjX2Z1enplci5jYwppbmRleCBkN2JmZGJhLi43MDIxMDE3IDEwMDY0NAotLS0gYS90ZXN0aW5nL2xpYmZ1enplci9wZGZfY29kZWNfaWNjX2Z1enplci5jYworKysgYi90ZXN0aW5nL2xpYmZ1enplci9wZGZfY29kZWNfaWNjX2Z1enplci5jYwpAQCAtOSwxNiArOSwxNiBAQAogZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewogICBDQ29kZWNfSWNjTW9kdWxlIGljY19tb2R1bGU7CiAgIHVpbnQzMl90IG5Db21wb25lbnQgPSAwOwotICB2b2lkKiB0cmFuc2Zvcm0gPSBpY2NfbW9kdWxlLkNyZWF0ZVRyYW5zZm9ybV9zUkdCKGRhdGEsIHNpemUsIG5Db21wb25lbnQpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0xjbXNDbW0+IHRyYW5zZm9ybSA9CisgICAgICBpY2NfbW9kdWxlLkNyZWF0ZVRyYW5zZm9ybV9zUkdCKGRhdGEsIHNpemUsICZuQ29tcG9uZW50KTsKIAogICBpZiAodHJhbnNmb3JtKSB7Ci0gICAgRlhfRkxPQVQgc3JjWzRdOwotICAgIEZYX0ZMT0FUIGRzdFs0XTsKKyAgICBmbG9hdCBzcmNbNF07CisgICAgZmxvYXQgZHN0WzRdOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKQogICAgICAgc3JjW2ldID0gMC41ZjsKICAgICBpY2NfbW9kdWxlLlNldENvbXBvbmVudHMobkNvbXBvbmVudCk7Ci0gICAgaWNjX21vZHVsZS5UcmFuc2xhdGUodHJhbnNmb3JtLCBzcmMsIGRzdCk7Ci0gICAgaWNjX21vZHVsZS5EZXN0cm95VHJhbnNmb3JtKHRyYW5zZm9ybSk7CisgICAgaWNjX21vZHVsZS5UcmFuc2xhdGUodHJhbnNmb3JtLmdldCgpLCBzcmMsIGRzdCk7CiAgIH0KIAogICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvbGliZnV6emVyL3BkZl9jb2RlY19qYmlnMl9mdXp6ZXIuY2MgYi90ZXN0aW5nL2xpYmZ1enplci9wZGZfY29kZWNfamJpZzJfZnV6emVyLmNjCmluZGV4IDFkYjM5NzUuLjdiOGUyYWEgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvbGliZnV6emVyL3BkZl9jb2RlY19qYmlnMl9mdXp6ZXIuY2MKKysrIGIvdGVzdGluZy9saWJmdXp6ZXIvcGRmX2NvZGVjX2piaWcyX2Z1enplci5jYwpAQCAtOSw3ICs5LDEwIEBACiAjaW5jbHVkZSAiY29yZS9meGNvZGVjL0pCaWcyX0RvY3VtZW50Q29udGV4dC5oIgogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfamJpZzJtb2R1bGUuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvamJpZzIvSkJpZzJfQ29udGV4dC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc2FmZV90eXBlcy5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2RpYml0bWFwLmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAogc3RhdGljIHVpbnQzMl90IEdldEludGVnZXIoY29uc3QgdWludDhfdCogZGF0YSkgewogICByZXR1cm4gZGF0YVswXSB8IGRhdGFbMV0gPDwgOCB8IGRhdGFbMl0gPDwgMTYgfCBkYXRhWzNdIDw8IDI0OwpAQCAtMjUsMjAgKzI4LDI5IEBACiAgIHNpemUgLT0ga1BhcmFtZXRlclNpemU7CiAgIGRhdGEgKz0ga1BhcmFtZXRlclNpemU7CiAKLSAgc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gYml0bWFwKG5ldyBDRlhfRElCaXRtYXApOworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNZW1MaW1pdCA9IDUxMjAwMDAwMDsgICAvLyA1MTIgTUIKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrMWJwcFJnYkNvbXBvbmVudHMgPSA0OyAgLy8gRnJvbSBDRlhfRElCaXRtYXAgaW1wbC4KKyAgRlhfU0FGRV9VSU5UMzIgbWVtID0gd2lkdGg7CisgIG1lbSAqPSBoZWlnaHQ7CisgIG1lbSAqPSBrMWJwcFJnYkNvbXBvbmVudHM7CisgIGlmICghbWVtLklzVmFsaWQoKSB8fCBtZW0uVmFsdWVPckRpZSgpID4ga01lbUxpbWl0KQorICAgIHJldHVybiAwOworCisgIGF1dG8gYml0bWFwID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKTsKICAgaWYgKCFiaXRtYXAtPkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl8xYnBwUmdiKSkKICAgICByZXR1cm4gMDsKIAotICBzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9PYmplY3Q+IHN0cmVhbShuZXcgQ1BERl9TdHJlYW0pOworICBhdXRvIHN0cmVhbSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmVhbT4oKTsKICAgc3RyZWFtLT5Bc1N0cmVhbSgpLT5TZXREYXRhKGRhdGEsIHNpemUpOwotICBDUERGX1N0cmVhbUFjYyBzcmNfc3RyZWFtOwotICBzcmNfc3RyZWFtLkxvYWRBbGxEYXRhKHN0cmVhbS0+QXNTdHJlYW0oKSwgdHJ1ZSk7CisKKyAgYXV0byBzcmNfc3RyZWFtID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfU3RyZWFtQWNjPihzdHJlYW0tPkFzU3RyZWFtKCkpOworICBzcmNfc3RyZWFtLT5Mb2FkQWxsRGF0YVJhdygpOwogCiAgIENDb2RlY19KYmlnMk1vZHVsZSBtb2R1bGU7CiAgIENDb2RlY19KYmlnMkNvbnRleHQgamJpZzJfY29udGV4dDsKICAgc3RkOjp1bmlxdWVfcHRyPEpCaWcyX0RvY3VtZW50Q29udGV4dD4gZG9jdW1lbnRfY29udGV4dDsKICAgRlhDT0RFQ19TVEFUVVMgc3RhdHVzID0gbW9kdWxlLlN0YXJ0RGVjb2RlKAotICAgICAgJmpiaWcyX2NvbnRleHQsICZkb2N1bWVudF9jb250ZXh0LCB3aWR0aCwgaGVpZ2h0LCAmc3JjX3N0cmVhbSwgbnVsbHB0ciwKKyAgICAgICZqYmlnMl9jb250ZXh0LCAmZG9jdW1lbnRfY29udGV4dCwgd2lkdGgsIGhlaWdodCwgc3JjX3N0cmVhbSwgbnVsbHB0ciwKICAgICAgIGJpdG1hcC0+R2V0QnVmZmVyKCksIGJpdG1hcC0+R2V0UGl0Y2goKSwgbnVsbHB0cik7CiAKICAgd2hpbGUgKHN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9saWJmdXp6ZXIvcGRmX2Nzc19mdXp6ZXIuY2MgYi90ZXN0aW5nL2xpYmZ1enplci9wZGZfY3NzX2Z1enplci5jYwppbmRleCBmMDJmMDA2Li43Y2Q5MjRlIDEwMDY0NAotLS0gYS90ZXN0aW5nL2xpYmZ1enplci9wZGZfY3NzX2Z1enplci5jYworKysgYi90ZXN0aW5nL2xpYmZ1enplci9wZGZfY3NzX2Z1enplci5jYwpAQCAtNCwyOCArNCwyNSBAQAogCiAjaW5jbHVkZSA8bWVtb3J5PgogCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfcmV0YWluX3B0ci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3NlZWthYmxlc3RyZWFtcHJveHkuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3N5bnRheHBhcnNlci5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NzeW50YXhwYXJzZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9mZGVfY3NzLmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvY3J0L2ZnYXNfc3RyZWFtLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2lkZXRleHRyZWFkLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCiAKIGV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgaW5wdXQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoCi0gICAgICBDRlhfQnl0ZVN0cmluZ0MoZGF0YSwgc3RhdGljX2Nhc3Q8RlhfU1RSU0laRT4oc2l6ZSkpKTsKKyAgV2lkZVN0cmluZyBpbnB1dCA9CisgICAgICBXaWRlU3RyaW5nOjpGcm9tVVRGOChCeXRlU3RyaW5nVmlldyhkYXRhLCBzdGF0aWNfY2FzdDxzaXplX3Q+KHNpemUpKSk7CiAKICAgLy8gSWYgd2UgY29udmVydCB0aGUgaW5wdXQgaW50byBhbiBlbXB0eSBzdHJpbmcgYmFpbCBvdXQuCiAgIGlmIChpbnB1dC5HZXRMZW5ndGgoKSA9PSAwKQogICAgIHJldHVybiAwOwogCi0gIENGREVfQ1NTU3ludGF4UGFyc2VyIHBhcnNlcjsKLSAgcGFyc2VyLkluaXQoaW5wdXQuY19zdHIoKSwgaW5wdXQuR2V0TGVuZ3RoKCkpOwotCi0gIEZERV9DU1NTeW50YXhTdGF0dXMgc3RhdHVzOworICBDRlhfQ1NTU3ludGF4UGFyc2VyIHBhcnNlcihpbnB1dC5jX3N0cigpLCBpbnB1dC5HZXRMZW5ndGgoKSk7CisgIENGWF9DU1NTeW50YXhTdGF0dXMgc3RhdHVzOwogICBkbyB7CiAgICAgc3RhdHVzID0gcGFyc2VyLkRvU3ludGF4UGFyc2UoKTsKLSAgfSB3aGlsZSAoc3RhdHVzICE9IEZERV9DU1NTeW50YXhTdGF0dXM6OkVycm9yICYmCi0gICAgICAgICAgIHN0YXR1cyAhPSBGREVfQ1NTU3ludGF4U3RhdHVzOjpFT1MpOworICB9IHdoaWxlIChzdGF0dXMgIT0gQ0ZYX0NTU1N5bnRheFN0YXR1czo6RXJyb3IgJiYKKyAgICAgICAgICAgc3RhdHVzICE9IENGWF9DU1NTeW50YXhTdGF0dXM6OkVPUyk7CiAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9saWJmdXp6ZXIvcGRmX2ZtMmpzX2Z1enplci5jYyBiL3Rlc3RpbmcvbGliZnV6emVyL3BkZl9mbTJqc19mdXp6ZXIuY2MKaW5kZXggOWFmYWE5MS4uMjU0MWRmYiAxMDA2NDQKLS0tIGEvdGVzdGluZy9saWJmdXp6ZXIvcGRmX2ZtMmpzX2Z1enplci5jYworKysgYi90ZXN0aW5nL2xpYmZ1enplci9wZGZfZm0yanNfZnV6emVyLmNjCkBAIC01LDIzICs1LDE5IEBACiAjaW5jbHVkZSA8Y3N0ZGRlZj4KICNpbmNsdWRlIDxjc3RkaW50PgogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3dpZGV0ZXh0YnVmLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9mbTJqcy94ZmFfcHJvZ3JhbS5oIgorI2luY2x1ZGUgImZ4anMvY2Z4anNlX2Zvcm1jYWxjX2NvbnRleHQuaCIKIAogZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBGWF9TQUZFX1NUUlNJWkUgc2FmZV9zaXplID0gc2l6ZTsKKyAgRlhfU0FGRV9TSVpFX1Qgc2FmZV9zaXplID0gc2l6ZTsKICAgaWYgKCFzYWZlX3NpemUuSXNWYWxpZCgpKQogICAgIHJldHVybiAwOwogCi0gIENGWF9XaWRlU3RyaW5nIGlucHV0ID0KLSAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChDRlhfQnl0ZVN0cmluZ0MoZGF0YSwgc2FmZV9zaXplLlZhbHVlT3JEaWUoKSkpOwotICBDWEZBX0ZNUHJvZ3JhbSBwcm9ncmFtKGlucHV0LkFzU3RyaW5nQygpKTsKLSAgaWYgKHByb2dyYW0uUGFyc2VQcm9ncmFtKCkpCi0gICAgcmV0dXJuIDA7Ci0KICAgQ0ZYX1dpZGVUZXh0QnVmIGpzOwotICBwcm9ncmFtLlRyYW5zbGF0ZVByb2dyYW0oanMpOworICBXaWRlU3RyaW5nIGlucHV0ID0KKyAgICAgIFdpZGVTdHJpbmc6OkZyb21VVEY4KEJ5dGVTdHJpbmdWaWV3KGRhdGEsIHNhZmVfc2l6ZS5WYWx1ZU9yRGllKCkpKTsKKyAgQ0ZYSlNFX0Zvcm1DYWxjQ29udGV4dDo6VHJhbnNsYXRlKGlucHV0LkFzU3RyaW5nVmlldygpLCAmanMpOwogICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvbGliZnV6emVyL3BkZl9mb250X2Z1enplci5jYyBiL3Rlc3RpbmcvbGliZnV6emVyL3BkZl9mb250X2Z1enplci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWQ2NjYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9saWJmdXp6ZXIvcGRmX2ZvbnRfZnV6emVyLmNjCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFRoZSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgInB1YmxpYy9jcHAvZnBkZl9kZWxldGVycy5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2VkaXQuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZnZpZXcuaCIKKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoc2l6ZSA8IDIpCisgICAgcmV0dXJuIDA7CisKKyAgc3RkOjp1bmlxdWVfcHRyPHZvaWQsIEZQREZEb2N1bWVudERlbGV0ZXI+IGRvYyhGUERGX0NyZWF0ZU5ld0RvY3VtZW50KCkpOworICBzdGQ6OnVuaXF1ZV9wdHI8dm9pZCwgRlBERlBhZ2VEZWxldGVyPiBwYWdlKAorICAgICAgRlBERlBhZ2VfTmV3KGRvYy5nZXQoKSwgMCwgNjEyLCA3OTIpKTsKKyAgaW50IGZvbnRfdHlwZSA9IGRhdGFbMF07CisgIEZQREZfQk9PTCBjaWQgPSBkYXRhWzFdOworICBkYXRhICs9IDI7CisgIHNpemUgLT0gMjsKKyAgc3RkOjp1bmlxdWVfcHRyPHZvaWQsIEZQREZGb250RGVsZXRlcj4gZm9udCgKKyAgICAgIEZQREZUZXh0X0xvYWRGb250KGRvYy5nZXQoKSwgZGF0YSwgc2l6ZSwgZm9udF90eXBlLCBjaWQpKTsKKyAgaWYgKCFmb250KQorICAgIHJldHVybiAwOworCisgIEZQREZfUEFHRU9CSkVDVCB0ZXh0X29iamVjdCA9CisgICAgICBGUERGUGFnZU9ial9DcmVhdGVUZXh0T2JqKGRvYy5nZXQoKSwgZm9udC5nZXQoKSwgMTIuMGYpOworICBGUERGUGFnZV9JbnNlcnRPYmplY3QocGFnZS5nZXQoKSwgdGV4dF9vYmplY3QpOworICBGUERGUGFnZV9HZW5lcmF0ZUNvbnRlbnQocGFnZS5nZXQoKSk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9saWJmdXp6ZXIvcGRmX2Zvcm1jYWxjX2Z1enplci5jYyBiL3Rlc3RpbmcvbGliZnV6emVyL3BkZl9mb3JtY2FsY19mdXp6ZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhlMjJiYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvbGliZnV6emVyL3BkZl9mb3JtY2FsY19mdXp6ZXIuY2MKQEAgLTAsMCArMSwxNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgVGhlIFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3dpZGV0ZXh0YnVmLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9mbTJqcy9jeGZhX2ZtcGFyc2VyLmgiCisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgV2lkZVN0cmluZyBpbnB1dCA9IFdpZGVTdHJpbmc6OkZyb21VVEY4KEJ5dGVTdHJpbmdWaWV3KGRhdGEsIHNpemUpKTsKKworICBDWEZBX0ZNUGFyc2VyIHBhcnNlcihpbnB1dC5Bc1N0cmluZ1ZpZXcoKSk7CisgIHBhcnNlci5QYXJzZSgpOworCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9saWJmdXp6ZXIvcGRmX2Z1enplcl9pbml0LmNjIGIvdGVzdGluZy9saWJmdXp6ZXIvcGRmX2Z1enplcl9pbml0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOTc5MGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL2xpYmZ1enplci9wZGZfZnV6emVyX2luaXQuY2MKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgVGhlIFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCisKKy8vIEluaXRpYWxpemUgdGhlIGxpYnJhcnkgb25jZSBmb3IgYWxsIHJ1bnMgb2YgdGhlIGZ1enplci4KK3N0cnVjdCBUZXN0Q2FzZSB7CisgIFRlc3RDYXNlKCkgeworICAgIG1lbXNldCgmY29uZmlnLCAnXDAnLCBzaXplb2YoY29uZmlnKSk7CisgICAgY29uZmlnLnZlcnNpb24gPSAyOworICAgIGNvbmZpZy5tX3BVc2VyRm9udFBhdGhzID0gbnVsbHB0cjsKKyAgICBjb25maWcubV9wSXNvbGF0ZSA9IG51bGxwdHI7CisgICAgY29uZmlnLm1fdjhFbWJlZGRlclNsb3QgPSAwOworICAgIEZQREZfSW5pdExpYnJhcnlXaXRoQ29uZmlnKCZjb25maWcpOworICB9CisgIEZQREZfTElCUkFSWV9DT05GSUcgY29uZmlnOworfTsKK3N0YXRpYyBUZXN0Q2FzZSogdGVzdENhc2UgPSBuZXcgVGVzdENhc2UoKTsKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvbGliZnV6emVyL3BkZl9oaW50X3RhYmxlX2Z1enplci5jYyBiL3Rlc3RpbmcvbGliZnV6emVyL3BkZl9oaW50X3RhYmxlX2Z1enplci5jYwppbmRleCBiMzFkNTZlLi5lZTUxZTI1IDEwMDY0NAotLS0gYS90ZXN0aW5nL2xpYmZ1enplci9wZGZfaGludF90YWJsZV9mdXp6ZXIuY2MKKysrIGIvdGVzdGluZy9saWJmdXp6ZXIvcGRmX2hpbnRfdGFibGVfZnV6emVyLmNjCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2hpbnRfdGFibGVzLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2xpbmVhcml6ZWRfaGVhZGVyLmgiCiAjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX251bWJlci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X2JpdHN0cmVhbS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAogaW50MzJfdCBHZXREYXRhKGNvbnN0IGludDMyX3QqKiBkYXRhMzIsIGNvbnN0IHVpbnQ4X3QqKiBkYXRhLCBzaXplX3QqIHNpemUpIHsKQEAgLTM1LDggKzM2LDcgQEAKICAgICBpZiAoc2l6ZSA8IHN0YXRpY19jYXN0PHNpemVfdD4oc2hhcmVkX2hpbnRfdGFibGVfb2Zmc2V0XykpCiAgICAgICByZXR1cm47CiAKLSAgICBDRlhfQml0U3RyZWFtIGJzOwotICAgIGJzLkluaXQoZGF0YSwgc2l6ZSk7CisgICAgQ0ZYX0JpdFN0cmVhbSBicyhkYXRhLCBzaXplKTsKICAgICBpZiAoIVJlYWRQYWdlSGludFRhYmxlKCZicykpCiAgICAgICByZXR1cm47CiAgICAgUmVhZFNoYXJlZE9iakhpbnRUYWJsZSgmYnMsIHNoYXJlZF9oaW50X3RhYmxlX29mZnNldF8pOwpAQCAtNDksNyArNDksNyBAQAogY2xhc3MgRmFrZUxpbmVhcml6ZWQgOiBwdWJsaWMgQ1BERl9MaW5lYXJpemVkSGVhZGVyIHsKICBwdWJsaWM6CiAgIGV4cGxpY2l0IEZha2VMaW5lYXJpemVkKENQREZfRGljdGlvbmFyeSogbGluZWFyaXplZF9kaWN0KQotICAgICAgOiBDUERGX0xpbmVhcml6ZWRIZWFkZXIobGluZWFyaXplZF9kaWN0KSB7fQorICAgICAgOiBDUERGX0xpbmVhcml6ZWRIZWFkZXIobGluZWFyaXplZF9kaWN0LCAwKSB7fQogfTsKIAogZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewpkaWZmIC0tZ2l0IGEvdGVzdGluZy9saWJmdXp6ZXIvcGRmX2pweF9mdXp6ZXIuY2MgYi90ZXN0aW5nL2xpYmZ1enplci9wZGZfanB4X2Z1enplci5jYwppbmRleCBiZWE3YmEyLi5kYTY1YmMyIDEwMDY0NAotLS0gYS90ZXN0aW5nL2xpYmZ1enplci9wZGZfanB4X2Z1enplci5jYworKysgYi90ZXN0aW5nL2xpYmZ1enplci9wZGZfanB4X2Z1enplci5jYwpAQCAtNiwxOCArNiwxNyBAQAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY29kZWNfaW50LmgiCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY19qcHhtb2R1bGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2pweF9kZWNvZGVyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfZGliaXRtYXAuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCiAKIENDb2RlY19KcHhNb2R1bGUgZ19tb2R1bGU7CiAKLXN0cnVjdCBEZWNvZGVyRGVsZXRlciB7Ci0gIHZvaWQgb3BlcmF0b3IoKShDSlBYX0RlY29kZXIqIGRlY29kZXIpIHsgZ19tb2R1bGUuRGVzdHJveURlY29kZXIoZGVjb2Rlcik7IH0KLX07Ci0KIGV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPENKUFhfRGVjb2RlciwgRGVjb2RlckRlbGV0ZXI+IGRlY29kZXIoCi0gICAgICBnX21vZHVsZS5DcmVhdGVEZWNvZGVyKGRhdGEsIHNpemUsIG51bGxwdHIpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENKUFhfRGVjb2Rlcj4gZGVjb2RlciA9CisgICAgICBnX21vZHVsZS5DcmVhdGVEZWNvZGVyKGRhdGEsIHNpemUsIG51bGxwdHIpOwogICBpZiAoIWRlY29kZXIpCiAgICAgcmV0dXJuIDA7CiAKQEAgLTI2LDYgKzI1LDEzIEBACiAgIHVpbnQzMl90IGNvbXBvbmVudHM7CiAgIGdfbW9kdWxlLkdldEltYWdlSW5mbyhkZWNvZGVyLmdldCgpLCAmd2lkdGgsICZoZWlnaHQsICZjb21wb25lbnRzKTsKIAorICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNZW1MaW1pdCA9IDEwMjQgKiAxMDI0ICogMTAyNDsgIC8vIDEgR0IuCisgIEZYX1NBRkVfVUlOVDMyIG1lbSA9IHdpZHRoOworICBtZW0gKj0gaGVpZ2h0OworICBtZW0gKj0gY29tcG9uZW50czsKKyAgaWYgKCFtZW0uSXNWYWxpZCgpIHx8IG1lbS5WYWx1ZU9yRGllKCkgPiBrTWVtTGltaXQpCisgICAgcmV0dXJuIDA7CisKICAgRlhESUJfRm9ybWF0IGZvcm1hdDsKICAgaWYgKGNvbXBvbmVudHMgPT0gMSkgewogICAgIGZvcm1hdCA9IEZYRElCXzhicHBSZ2I7CkBAIC0zNyw4ICs0Myw3IEBACiAgICAgd2lkdGggPSAod2lkdGggKiBjb21wb25lbnRzICsgMikgLyAzOwogICAgIGZvcm1hdCA9IEZYRElCX1JnYjsKICAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IGJpdG1hcChuZXcgQ0ZYX0RJQml0bWFwKTsKKyAgYXV0byBiaXRtYXAgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOwogICBpZiAoIWJpdG1hcC0+Q3JlYXRlKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCkpCiAgICAgcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvbGliZnV6emVyL3BkZl9sendfZnV6emVyLmNjIGIvdGVzdGluZy9saWJmdXp6ZXIvcGRmX2x6d19mdXp6ZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjMjU4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvbGliZnV6emVyL3BkZl9sendfZnV6emVyLmNjCkBAIC0wLDAgKzEsNTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFRoZSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvZ2lmL2NmeF9sendkZWNvbXByZXNzb3IuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfY29udmVyc2lvbnMuaCIKKworLy8gQmV0d2VlbiAyeCBhbmQgNXggaXMgYSBzdGFuZGFyZCByYW5nZSBmb3IgTFpXIGFjY29yZGluZyB0byBhIHF1aWNrCisvLyBzZWFyY2ggb2YgcGFwZXJzLiBSdW5uaW5nIHVwIHRvIDEweCB0byBjYXRjaCBhbnkgbmljaGUgY2FzZXMuCitjb25zdGV4cHIgdWludDMyX3Qga01pbkNvbXByZXNzaW9uUmF0aW8gPSAyOworY29uc3RleHByIHVpbnQzMl90IGtNYXhDb21wcmVzc2lvblJhdGlvID0gMTA7CisKK3ZvaWQgTFpXRnV6eihjb25zdCB1aW50OF90KiBzcmNfYnVmLAorICAgICAgICAgICAgIHNpemVfdCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICB1aW50OF90IGNvbG9yX2V4cCwKKyAgICAgICAgICAgICB1aW50OF90IGNvZGVfZXhwKSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfTFpXRGVjb21wcmVzc29yPiBkZWNvbXByZXNzb3IgPQorICAgICAgQ0ZYX0xaV0RlY29tcHJlc3Nvcjo6Q3JlYXRlKGNvbG9yX2V4cCwgY29kZV9leHApOworICBpZiAoIWRlY29tcHJlc3NvcikKKyAgICByZXR1cm47CisKKyAgZm9yICh1aW50MzJfdCBjb21wcmVzc2lvbnNfcmF0aW8gPSBrTWluQ29tcHJlc3Npb25SYXRpbzsKKyAgICAgICBjb21wcmVzc2lvbnNfcmF0aW8gPD0ga01heENvbXByZXNzaW9uUmF0aW87IGNvbXByZXNzaW9uc19yYXRpbysrKSB7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGVzX2J1Zihjb21wcmVzc2lvbnNfcmF0aW8gKiBzcmNfc2l6ZSk7CisgICAgLy8gVGhpcyBjYXN0IHNob3VsZCBiZSBzYWZlIHNpbmNlIHRoZSBjYWxsZXIgaXMgY2hlY2tpbmcgZm9yIG92ZXJmbG93IG9uCisgICAgLy8gdGhlIGluaXRpYWwgZGF0YS4KKyAgICB1aW50MzJfdCBkZXNfc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkZXNfYnVmLnNpemUoKSk7CisgICAgaWYgKENGWF9HaWZEZWNvZGVTdGF0dXM6Okluc3VmZmljaWVudERlc3RTaXplICE9CisgICAgICAgIGRlY29tcHJlc3Nvci0+RGVjb2RlKGNvbnN0X2Nhc3Q8dWludDhfdCo+KHNyY19idWYpLCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzX2J1Zi5kYXRhKCksICZkZXNfc2l6ZSkpCisgICAgICByZXR1cm47CisgIH0KK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAvLyBOZWVkIGF0IGxlYXN0IDMgYnl0ZXMgdG8gZG8gYW55dGhpbmcuCisgIGlmIChzaXplIDwgMykKKyAgICByZXR1cm4gMDsKKworICAvLyBOb3JtYWxseSB0aGUgR0lGIHdvdWxkIHByb3ZpZGUgdGhlIGNvZGUgYW5kIGNvbG9yIHNpemVzLCBpbnN0ZWFkLCBnb2luZworICAvLyB0byBhc3N1bWUgdGhleSBhcmUgdGhlIGZpcnN0IHR3byBieXRlcyBvZiBkYXRhIHByb3ZpZGVkLgorICB1aW50OF90IGNvbG9yX2V4cCA9IGRhdGFbMF07CisgIHVpbnQ4X3QgY29kZV9leHAgPSBkYXRhWzFdOworICBjb25zdCB1aW50OF90KiBsendfZGF0YSA9IGRhdGEgKyAyOworICB1aW50MzJfdCBsendfZGF0YV9zaXplID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNpemUgLSAyKTsKKyAgLy8gQ2hlY2sgdGhhdCB0aGVyZSBpc24ndCBnb2luZyB0byBiZSBhbiBvdmVyZmxvdyBpbiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCisgIC8vIHNpemUuCisgIGlmIChsendfZGF0YV9zaXplID4KKyAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSAvIGtNYXhDb21wcmVzc2lvblJhdGlvKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBMWldGdXp6KGx6d19kYXRhLCBsendfZGF0YV9zaXplLCBjb2xvcl9leHAsIGNvZGVfZXhwKTsKKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvbGliZnV6emVyL3BkZl94bWxfZnV6emVyLmNjIGIvdGVzdGluZy9saWJmdXp6ZXIvcGRmX3htbF9mdXp6ZXIuY2MKaW5kZXggZTNjZDI1NC4uZDgwMTBmOSAxMDA2NDQKLS0tIGEvdGVzdGluZy9saWJmdXp6ZXIvcGRmX3htbF9mdXp6ZXIuY2MKKysrIGIvdGVzdGluZy9saWJmdXp6ZXIvcGRmX3htbF9mdXp6ZXIuY2MKQEAgLTYsMzMgKzYsMzMgQEAKICNpbmNsdWRlIDxjc3RkaW50PgogI2luY2x1ZGUgPG1lbW9yeT4KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9zZWVrYWJsZXN0cmVhbXByb3h5LmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sZG9jLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbG5vZGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1scGFyc2VyLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotI2luY2x1ZGUgInhmYS9mZGUveG1sL2ZkZV94bWxfaW1wLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeG1sX3BhcnNlci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3dpZGV0ZXh0cmVhZC5oIgogCiBuYW1lc3BhY2UgewogCi1DRkRFX1hNTE5vZGUqIFhGQV9GREVFeHRlbnNpb25fR2V0RG9jdW1lbnROb2RlKAotICAgIENGREVfWE1MRG9jKiBwWE1MRG9jLAorQ0ZYX1hNTE5vZGUqIFhGQV9GREVFeHRlbnNpb25fR2V0RG9jdW1lbnROb2RlKAorICAgIENGWF9YTUxEb2MqIHBYTUxEb2MsCiAgICAgYm9vbCBiVmVyaWZ5V2VsbEZvcm1uZXNzID0gZmFsc2UpIHsKICAgaWYgKCFwWE1MRG9jKSB7CiAgICAgcmV0dXJuIG51bGxwdHI7CiAgIH0KLSAgQ0ZERV9YTUxOb2RlKiBwWE1MRmFrZVJvb3QgPSBwWE1MRG9jLT5HZXRSb290KCk7Ci0gIGZvciAoQ0ZERV9YTUxOb2RlKiBwWE1MTm9kZSA9Ci0gICAgICAgICAgIHBYTUxGYWtlUm9vdC0+R2V0Tm9kZUl0ZW0oQ0ZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsKLSAgICAgICBwWE1MTm9kZTsgcFhNTE5vZGUgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsKLSAgICBpZiAocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7CisgIENGWF9YTUxOb2RlKiBwWE1MRmFrZVJvb3QgPSBwWE1MRG9jLT5HZXRSb290KCk7CisgIGZvciAoQ0ZYX1hNTE5vZGUqIHBYTUxOb2RlID0KKyAgICAgICAgICAgcFhNTEZha2VSb290LT5HZXROb2RlSXRlbShDRlhfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7CisgICAgICAgcFhNTE5vZGU7IHBYTUxOb2RlID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpOZXh0U2libGluZykpIHsKKyAgICBpZiAocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGWF9YTUxOT0RFX0VsZW1lbnQpIHsKICAgICAgIGlmIChiVmVyaWZ5V2VsbEZvcm1uZXNzKSB7Ci0gICAgICAgIGZvciAoQ0ZERV9YTUxOb2RlKiBwTmV4dE5vZGUgPQotICAgICAgICAgICAgICAgICBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZERV9YTUxOb2RlOjpOZXh0U2libGluZyk7CisgICAgICAgIGZvciAoQ0ZYX1hNTE5vZGUqIHBOZXh0Tm9kZSA9CisgICAgICAgICAgICAgICAgIHBYTUxOb2RlLT5HZXROb2RlSXRlbShDRlhfWE1MTm9kZTo6TmV4dFNpYmxpbmcpOwogICAgICAgICAgICAgIHBOZXh0Tm9kZTsKLSAgICAgICAgICAgICBwTmV4dE5vZGUgPSBwTmV4dE5vZGUtPkdldE5vZGVJdGVtKENGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7Ci0gICAgICAgICAgaWYgKHBOZXh0Tm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsKKyAgICAgICAgICAgICBwTmV4dE5vZGUgPSBwTmV4dE5vZGUtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpOZXh0U2libGluZykpIHsKKyAgICAgICAgICBpZiAocE5leHROb2RlLT5HZXRUeXBlKCkgPT0gRlhfWE1MTk9ERV9FbGVtZW50KSB7CiAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQ2LDIxICs0NiwxOCBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIGV4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgRlhfU0FGRV9TVFJTSVpFIHNhZmVfc2l6ZSA9IHNpemU7CisgIEZYX1NBRkVfU0laRV9UIHNhZmVfc2l6ZSA9IHNpemU7CiAgIGlmICghc2FmZV9zaXplLklzVmFsaWQoKSkKICAgICByZXR1cm4gMDsKIAotICBDRlhfV2lkZVN0cmluZyBpbnB1dCA9Ci0gICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoQ0ZYX0J5dGVTdHJpbmdDKGRhdGEsIHNhZmVfc2l6ZS5WYWx1ZU9yRGllKCkpKTsKLSAgYXV0byBzdHJlYW0gPSBwZGZpdW06Ok1ha2VSZXRhaW48Q1hGQV9XaWRlVGV4dFJlYWQ+KGlucHV0KTsKLSAgaWYgKCFzdHJlYW0pCisgIFJldGFpblB0cjxDRlhfU2Vla2FibGVTdHJlYW1Qcm94eT4gc3RyZWFtID0KKyAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDRlhfU2Vla2FibGVTdHJlYW1Qcm94eT4oY29uc3RfY2FzdDx1aW50OF90Kj4oZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOworICBhdXRvIGRvYyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfWE1MRG9jPigpOworICBpZiAoIWRvYy0+TG9hZFhNTChwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX1hNTFBhcnNlcj4oZG9jLT5HZXRSb290KCksIHN0cmVhbSkpKQogICAgIHJldHVybiAwOwogCi0gIGF1dG8gZG9jID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGREVfWE1MRG9jPigpOwotICBpZiAoIWRvYy0+TG9hZFhNTChwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9YTUxQYXJzZXI+KGRvYy0+R2V0Um9vdCgpLCBzdHJlYW0pKSkKLSAgICByZXR1cm4gMDsKLQotICBpZiAoZG9jLT5Eb0xvYWQobnVsbHB0cikgPCAxMDApCisgIGlmIChkb2MtPkRvTG9hZCgpIDwgMTAwKQogICAgIHJldHVybiAwOwogCiAgICh2b2lkKVhGQV9GREVFeHRlbnNpb25fR2V0RG9jdW1lbnROb2RlKGRvYy5nZXQoKSk7CmRpZmYgLS1naXQgYS90ZXN0aW5nL2xpYmZ1enplci94ZmFfY29kZWNfZnV6emVyLmggYi90ZXN0aW5nL2xpYmZ1enplci94ZmFfY29kZWNfZnV6emVyLmgKaW5kZXggOWE4YjIzZS4uYjFkODg4ZiAxMDA2NDQKLS0tIGEvdGVzdGluZy9saWJmdXp6ZXIveGZhX2NvZGVjX2Z1enplci5oCisrKyBiL3Rlc3RpbmcvbGliZnV6emVyL3hmYV9jb2RlY19mdXp6ZXIuaApAQCAtMTMsOSArMTMsMTQgQEAKICNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX3Byb2dyZXNzaXZlZGVjb2Rlci5oIgogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfdGlmZm1vZHVsZS5oIgogI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9meF9jb2RlYy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfZGliaXRtYXAuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2Z4X3N0cmluZ190ZXN0aGVscGVycy5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAorLy8gU3VwcG9ydCB1cCB0byA2NCBNQi4gVGhpcyBwcmV2ZW50cyB0cml2aWFsIE9PTSB3aGVuIE1TQU4gaXMgb24gYW5kCisvLyB0aW1lIG91dHMuCitjb25zdCBpbnQga1hGQUNvZGVjRnV6emVyUGl4ZWxMaW1pdCA9IDY0MDAwMDAwOworCiBjbGFzcyBYRkFDb2RlY0Z1enplciB7CiAgcHVibGljOgogICBzdGF0aWMgaW50IEZ1enooY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUsIEZYQ09ERUNfSU1BR0VfVFlQRSB0eXBlKSB7CkBAIC0yNyw1MSArMzIsMzYgQEAKIAogICAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyPiBkZWNvZGVyID0KICAgICAgICAgbWdyLT5DcmVhdGVQcm9ncmVzc2l2ZURlY29kZXIoKTsKLSAgICBDRlhfUmV0YWluUHRyPFJlYWRlcj4gc291cmNlKG5ldyBSZWFkZXIoZGF0YSwgc2l6ZSkpOworICAgIGF1dG8gc291cmNlID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9CdWZmZXJTZWVrYWJsZVJlYWRTdHJlYW0+KGRhdGEsIHNpemUpOwogICAgIEZYQ09ERUNfU1RBVFVTIHN0YXR1cyA9IGRlY29kZXItPkxvYWRJbWFnZUluZm8oc291cmNlLCB0eXBlLCBudWxscHRyLCB0cnVlKTsKICAgICBpZiAoc3RhdHVzICE9IEZYQ09ERUNfU1RBVFVTX0ZSQU1FX1JFQURZKQogICAgICAgcmV0dXJuIDA7CiAKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBiaXRtYXAobmV3IENGWF9ESUJpdG1hcCk7CisgICAgLy8gU2tpcHBpbmcgdmVyeSBsYXJnZSBpbWFnZXMsIHNpbmNlIHRoZXkgd2lsbCB0YWtlIGEgbG9uZyB0aW1lIGFuZCBtYXkgbGVhZAorICAgIC8vIHRvIE9PTS4KKyAgICBGWF9TQUZFX1VJTlQzMiBiaXRtYXBfc2l6ZSA9IGRlY29kZXItPkdldEhlaWdodCgpOworICAgIGJpdG1hcF9zaXplICo9IGRlY29kZXItPkdldFdpZHRoKCk7CisgICAgYml0bWFwX3NpemUgKj0gNDsgIC8vIEZyb20gQ0ZYX0RJQml0bWFwIGltcGwuCisgICAgaWYgKCFiaXRtYXBfc2l6ZS5Jc1ZhbGlkKCkgfHwKKyAgICAgICAgYml0bWFwX3NpemUuVmFsdWVPckRpZSgpID4ga1hGQUNvZGVjRnV6emVyUGl4ZWxMaW1pdCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYXV0byBiaXRtYXAgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOwogICAgIGJpdG1hcC0+Q3JlYXRlKGRlY29kZXItPkdldFdpZHRoKCksIGRlY29kZXItPkdldEhlaWdodCgpLCBGWERJQl9BcmdiKTsKIAotICAgIGludDMyX3QgZnJhbWVzOwotICAgIGlmIChkZWNvZGVyLT5HZXRGcmFtZXMoZnJhbWVzKSAhPSBGWENPREVDX1NUQVRVU19ERUNPREVfUkVBRFkgfHwKLSAgICAgICAgZnJhbWVzID09IDApCisgICAgc2l6ZV90IGZyYW1lczsKKyAgICBzdGQ6OnRpZShzdGF0dXMsIGZyYW1lcykgPSBkZWNvZGVyLT5HZXRGcmFtZXMoKTsKKyAgICBpZiAoc3RhdHVzICE9IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9SRUFEWSB8fCBmcmFtZXMgPT0gMCkKICAgICAgIHJldHVybiAwOwogCi0gICAgc3RhdHVzID0gZGVjb2Rlci0+U3RhcnREZWNvZGUoYml0bWFwLmdldCgpLCAwLCAwLCBiaXRtYXAtPkdldFdpZHRoKCksCisgICAgc3RhdHVzID0gZGVjb2Rlci0+U3RhcnREZWNvZGUoYml0bWFwLCAwLCAwLCBiaXRtYXAtPkdldFdpZHRoKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwLT5HZXRIZWlnaHQoKSk7CiAgICAgd2hpbGUgKHN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19ERUNPREVfVE9CRUNPTlRJTlVFKQogICAgICAgc3RhdHVzID0gZGVjb2Rlci0+Q29udGludWVEZWNvZGUoKTsKIAogICAgIHJldHVybiAwOwogICB9Ci0KLSBwcml2YXRlOgotICBjbGFzcyBSZWFkZXIgOiBwdWJsaWMgSUZYX1NlZWthYmxlUmVhZFN0cmVhbSB7Ci0gICBwdWJsaWM6Ci0gICAgUmVhZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSA6IG1fZGF0YShkYXRhKSwgbV9zaXplKHNpemUpIHt9Ci0gICAgflJlYWRlcigpIHt9Ci0KLSAgICBib29sIFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlIHsKLSAgICAgIGlmIChvZmZzZXQgPCAwIHx8IHN0YXRpY19jYXN0PHNpemVfdD4ob2Zmc2V0KSA+PSBtX3NpemUpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChvZmZzZXQgKyBzaXplID4gbV9zaXplKQotICAgICAgICBzaXplID0gbV9zaXplIC0gb2Zmc2V0OwotICAgICAgaWYgKHNpemUgPT0gMCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICBtZW1jcHkoYnVmZmVyLCBtX2RhdGEgKyBvZmZzZXQsIHNpemUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgRlhfRklMRVNJWkUgR2V0U2l6ZSgpIG92ZXJyaWRlIHsgcmV0dXJuIHN0YXRpY19jYXN0PEZYX0ZJTEVTSVpFPihtX3NpemUpOyB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgY29uc3QgdWludDhfdCogY29uc3QgbV9kYXRhOwotICAgIHNpemVfdCBtX3NpemU7Ci0gIH07CiB9OwogCiAjZW5kaWYgIC8vIFRFU1RJTkdfTElCRlVaWkVSX1hGQV9DT0RFQ19GVVpaRVJfSF8KZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmFuZ2Vfc2V0LmNwcCBiL3Rlc3RpbmcvcmFuZ2Vfc2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmM1NDBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yYW5nZV9zZXQuY3BwCkBAIC0wLDAgKzEsNzQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInRlc3RpbmcvcmFuZ2Vfc2V0LmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorCitSYW5nZVNldDo6UmFuZ2VTZXQoKSB7fQorUmFuZ2VTZXQ6On5SYW5nZVNldCgpIHt9CisKK2Jvb2wgUmFuZ2VTZXQ6OkNvbnRhaW5zKGNvbnN0IFJhbmdlJiByYW5nZSkgY29uc3QgeworICBpZiAoSXNFbXB0eVJhbmdlKHJhbmdlKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY29uc3QgUmFuZ2UgZml4ZWRfcmFuZ2UgPSBGaXhEaXJlY3Rpb24ocmFuZ2UpOworICBhdXRvIGl0ID0gcmFuZ2VzKCkudXBwZXJfYm91bmQoZml4ZWRfcmFuZ2UpOworCisgIGlmIChpdCA9PSByYW5nZXMoKS5iZWdpbigpKQorICAgIHJldHVybiBmYWxzZTsgIC8vIE5vIHJhbmdlcyBpbmNsdWRlcyByYW5nZS5maXJzdC4KKworICAtLWl0OyAgLy8gTm93IGl0IHN0YXJ0cyBlcXVhbCBvciBiZWZvcmUgcmFuZ2UuZmlyc3QuCisgIHJldHVybiBpdC0+c2Vjb25kID49IGZpeGVkX3JhbmdlLnNlY29uZDsKK30KKwordm9pZCBSYW5nZVNldDo6VW5pb24oY29uc3QgUmFuZ2UmIHJhbmdlKSB7CisgIGlmIChJc0VtcHR5UmFuZ2UocmFuZ2UpKQorICAgIHJldHVybjsKKworICBSYW5nZSBmaXhlZF9yYW5nZSA9IEZpeERpcmVjdGlvbihyYW5nZSk7CisgIGlmIChJc0VtcHR5KCkpIHsKKyAgICByYW5nZXNfLmluc2VydChmaXhlZF9yYW5nZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgYXV0byBzdGFydCA9IHJhbmdlc18udXBwZXJfYm91bmQoZml4ZWRfcmFuZ2UpOworICBpZiAoc3RhcnQgIT0gcmFuZ2VzXy5iZWdpbigpKQorICAgIC0tc3RhcnQ7ICAvLyBzdGFydCBub3cgcG9pbnRzIHRvIHRoZSBrZXkgZXF1YWwgb3IgbG93ZXIgdGhhbiBvZmZzZXQuCisKKyAgaWYgKHN0YXJ0LT5zZWNvbmQgPCBmaXhlZF9yYW5nZS5maXJzdCkKKyAgICArK3N0YXJ0OyAgLy8gc3RhcnQgZWxlbWVudCBpcyBlbnRpcmVseSBiZWZvcmUgY3VycmVudCByYW5nZSwgc2tpcCBpdC4KKworICBhdXRvIGVuZCA9IHJhbmdlc18udXBwZXJfYm91bmQoUmFuZ2UoZml4ZWRfcmFuZ2Uuc2Vjb25kLCBmaXhlZF9yYW5nZS5zZWNvbmQpKTsKKworICBpZiAoc3RhcnQgPT0gZW5kKSB7ICAvLyBObyByYW5nZXMgdG8gbWVyZ2UuCisgICAgcmFuZ2VzXy5pbnNlcnQoZml4ZWRfcmFuZ2UpOworICAgIHJldHVybjsKKyAgfQorCisgIC0tZW5kOworCisgIGNvbnN0IGludCBuZXdfc3RhcnQgPSBzdGQ6Om1pbjxzaXplX3Q+KHN0YXJ0LT5maXJzdCwgZml4ZWRfcmFuZ2UuZmlyc3QpOworICBjb25zdCBpbnQgbmV3X2VuZCA9IHN0ZDo6bWF4KGVuZC0+c2Vjb25kLCBmaXhlZF9yYW5nZS5zZWNvbmQpOworCisgIHJhbmdlc18uZXJhc2Uoc3RhcnQsICsrZW5kKTsKKyAgcmFuZ2VzXy5pbnNlcnQoUmFuZ2UobmV3X3N0YXJ0LCBuZXdfZW5kKSk7Cit9CisKK3ZvaWQgUmFuZ2VTZXQ6OlVuaW9uKGNvbnN0IFJhbmdlU2V0JiByYW5nZV9zZXQpIHsKKyAgQVNTRVJUKCZyYW5nZV9zZXQgIT0gdGhpcyk7CisgIGZvciAoY29uc3QgYXV0byYgaXQgOiByYW5nZV9zZXQucmFuZ2VzKCkpCisgICAgVW5pb24oaXQpOworfQorCitSYW5nZVNldDo6UmFuZ2UgUmFuZ2VTZXQ6OkZpeERpcmVjdGlvbihjb25zdCBSYW5nZSYgcmFuZ2UpIGNvbnN0IHsKKyAgcmV0dXJuIHJhbmdlLmZpcnN0IDw9IHJhbmdlLnNlY29uZCA/IHJhbmdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBSYW5nZShyYW5nZS5zZWNvbmQgKyAxLCByYW5nZS5maXJzdCArIDEpOworfQorCitib29sIFJhbmdlU2V0OjpJc0VtcHR5UmFuZ2UoY29uc3QgUmFuZ2UmIHJhbmdlKSBjb25zdCB7CisgIHJldHVybiByYW5nZS5maXJzdCA9PSByYW5nZS5zZWNvbmQ7Cit9CmRpZmYgLS1naXQgYS90ZXN0aW5nL3JhbmdlX3NldC5oIGIvdGVzdGluZy9yYW5nZV9zZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWQyNGJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yYW5nZV9zZXQuaApAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgVEVTVElOR19SQU5HRV9TRVRfSF8KKyNkZWZpbmUgVEVTVElOR19SQU5HRV9TRVRfSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK2NsYXNzIFJhbmdlU2V0IHsKKyBwdWJsaWM6CisgIHVzaW5nIFJhbmdlID0gc3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PjsKKworICBSYW5nZVNldCgpOworICB+UmFuZ2VTZXQoKTsKKworICBib29sIENvbnRhaW5zKGNvbnN0IFJhbmdlJiByYW5nZSkgY29uc3Q7CisKKyAgdm9pZCBVbmlvbihjb25zdCBSYW5nZSYgcmFuZ2UpOworCisgIHZvaWQgVW5pb24oY29uc3QgUmFuZ2VTZXQmIHJhbmdlX3NldCk7CisKKyAgYm9vbCBJc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gcmFuZ2VzKCkuZW1wdHkoKTsgfQorCisgIHZvaWQgQ2xlYXIoKSB7IHJhbmdlc18uY2xlYXIoKTsgfQorCisgIHN0cnVjdCByYW5nZV9jb21wYXJlIHsKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgUmFuZ2UmIGx2YWwsIGNvbnN0IFJhbmdlJiBydmFsKSBjb25zdCB7CisgICAgICByZXR1cm4gbHZhbC5maXJzdCA8IHJ2YWwuZmlyc3Q7CisgICAgfQorICB9OworCisgIHVzaW5nIFJhbmdlc0NvbnRhaW5lciA9IHN0ZDo6c2V0PFJhbmdlLCByYW5nZV9jb21wYXJlPjsKKyAgY29uc3QgUmFuZ2VzQ29udGFpbmVyJiByYW5nZXMoKSBjb25zdCB7IHJldHVybiByYW5nZXNfOyB9CisKKyBwcml2YXRlOgorICBSYW5nZSBGaXhEaXJlY3Rpb24oY29uc3QgUmFuZ2UmIHJhbmdlKSBjb25zdDsKKworICBib29sIElzRW1wdHlSYW5nZShjb25zdCBSYW5nZSYgcmFuZ2UpIGNvbnN0OworCisgIFJhbmdlc0NvbnRhaW5lciByYW5nZXNfOworfTsKKworI2VuZGlmICAvLyBURVNUSU5HX1JBTkdFX1NFVF9IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYW5ub3RhdGlvbl9oaWdobGlnaHRfbG9uZ19jb250ZW50LnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2Fubm90YXRpb25faGlnaGxpZ2h0X2xvbmdfY29udGVudC5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkOTEwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2Fubm90YXRpb25faGlnaGxpZ2h0X2xvbmdfY29udGVudC5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYW5ub3RhdGlvbl9oaWdobGlnaHRfcm9sbG92ZXJfYXAuaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9hbm5vdGF0aW9uX2hpZ2hsaWdodF9yb2xsb3Zlcl9hcC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjZlZDg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYW5ub3RhdGlvbl9oaWdobGlnaHRfcm9sbG92ZXJfYXAuaW4KQEAgLTAsMCArMSw4NiBAQAore3toZWFkZXJ9fQore3tvYmplY3QgMSAwfX0gPDwKKyAgL1R5cGUgL0NhdGFsb2cKKyAgL1BhZ2VzIDIgMCBSCisgIC9PcGVuQWN0aW9uIDIwIDAgUgorPj4KK2VuZG9iagore3tvYmplY3QgMiAwfX0gPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9Db3VudCAxCisgIC9LaWRzIFsKKyAgICAzIDAgUgorICBdCis+PgorZW5kb2JqCislIFBhZ2UgbnVtYmVyIDAuCit7e29iamVjdCAzIDB9fSA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCisgIC9Bbm5vdHMgWworICAgIDQgMCBSCisgIF0KKyAgL1RhYnMgL1IKKz4+CitlbmRvYmoKKwore3tvYmplY3QgNCAwfX0gPDwKKyAgL1R5cGUgL0Fubm90CisgIC9TdWJ0eXBlIC9IaWdobGlnaHQKKyAgL1JlY3QgWyA3NSA2ODEgNTEyIDY5MCBdCisgIC9OTSAoQW5ub3QtMSkKKyAgL0YgNAorICAvUXVhZFBvaW50cyBbIDc1IDY4OCA1MTIgNjg4IDc1IDY3OSA1MTIgNjc5IF0KKyAgL0MgWyAwLjAwMDExMDg2NDYgMC4wMDE3NjAyNDQgMC45OTgyMTg0IF0KKyAgL0NvbnRlbnRzICgpCisgIC9BUCA8PAorICAgIC9SIDUgMCBSCisgID4+Cis+PgorZW5kb2JqCisKK3t7b2JqZWN0IDUgMH19IDw8CisgIC9CQm94IFsKKyAgICA2Ny43Mjk5CisgICAgNzA0LjI5NgorICAgIDEzNi4zMjUKKyAgICA3MjEuMjkyCisgIF0KKyAgL0Zvcm1UeXBlIDEKKyAgL01hdHJpeCBbCisgICAgMS4wCisgICAgMC4wCisgICAgMC4wCisgICAgMS4wCisgICAgLTY3LjcyOTkKKyAgICAtNzA0LjI5NgorICBdCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvUHJvY1NldCBbCisgICAgICAvUERGCisgICAgXQorICA+PgorICAvU3VidHlwZSAvRm9ybQorICAvVHlwZSAvWE9iamVjdAorICAvTGVuZ3RoIDE2NQorPj4KK3N0cmVhbQorMSAwLjgxOTYxMSAwIHJnCiswLjk5OTcgdworNzIgNzA0Ljc5NjEgbQorNjguMjI5OCA3MDguNTY2MyA2OC4yMjk4IDcxNy4wMjE2IDcyIDcyMC43OTE4IGMKKzEzMi4wNTUxIDcyMC43OTE4IGwKKzEzNS44MjUzIDcxNy4wMjE2IDEzNS44MjUzIDcwOC41NjYzIDEzMi4wNTUxIDcwNC43OTYxIGMKK2YKK2VuZHN0cmVhbQorPj4KK2VuZG9iagorCit7e3hyZWZ9fQordHJhaWxlciA8PAorICAvUm9vdCAxIDAgUgorICAvU2l6ZSA2Cis+Pgore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2Fubm90YXRpb25faGlnaGxpZ2h0X3JvbGxvdmVyX2FwLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2Fubm90YXRpb25faGlnaGxpZ2h0X3JvbGxvdmVyX2FwLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzYzYjJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYW5ub3RhdGlvbl9oaWdobGlnaHRfcm9sbG92ZXJfYXAucGRmCkBAIC0wLDAgKzEsOTUgQEAKKyVQREYtMS43CisloPKk9AorMSAwIG9iaiA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKyAgL09wZW5BY3Rpb24gMjAgMCBSCis+PgorZW5kb2JqCisyIDAgb2JqIDw8CisgIC9UeXBlIC9QYWdlcworICAvQ291bnQgMQorICAvS2lkcyBbCisgICAgMyAwIFIKKyAgXQorPj4KK2VuZG9iagorJSBQYWdlIG51bWJlciAwLgorMyAwIG9iaiA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCisgIC9Bbm5vdHMgWworICAgIDQgMCBSCisgIF0KKyAgL1RhYnMgL1IKKz4+CitlbmRvYmoKKworNCAwIG9iaiA8PAorICAvVHlwZSAvQW5ub3QKKyAgL1N1YnR5cGUgL0hpZ2hsaWdodAorICAvUmVjdCBbIDc1IDY4MSA1MTIgNjkwIF0KKyAgL05NIChBbm5vdC0xKQorICAvRiA0CisgIC9RdWFkUG9pbnRzIFsgNzUgNjg4IDUxMiA2ODggNzUgNjc5IDUxMiA2NzkgXQorICAvQyBbIDAuMDAwMTEwODY0NiAwLjAwMTc2MDI0NCAwLjk5ODIxODQgXQorICAvQ29udGVudHMgKCkKKyAgL0FQIDw8CisgICAgL1IgNSAwIFIKKyAgPj4KKz4+CitlbmRvYmoKKworNSAwIG9iaiA8PAorICAvQkJveCBbCisgICAgNjcuNzI5OQorICAgIDcwNC4yOTYKKyAgICAxMzYuMzI1CisgICAgNzIxLjI5MgorICBdCisgIC9Gb3JtVHlwZSAxCisgIC9NYXRyaXggWworICAgIDEuMAorICAgIDAuMAorICAgIDAuMAorICAgIDEuMAorICAgIC02Ny43Mjk5CisgICAgLTcwNC4yOTYKKyAgXQorICAvUmVzb3VyY2VzIDw8CisgICAgL1Byb2NTZXQgWworICAgICAgL1BERgorICAgIF0KKyAgPj4KKyAgL1N1YnR5cGUgL0Zvcm0KKyAgL1R5cGUgL1hPYmplY3QKKyAgL0xlbmd0aCAxNjUKKz4+CitzdHJlYW0KKzEgMC44MTk2MTEgMCByZworMC45OTk3IHcKKzcyIDcwNC43OTYxIG0KKzY4LjIyOTggNzA4LjU2NjMgNjguMjI5OCA3MTcuMDIxNiA3MiA3MjAuNzkxOCBjCisxMzIuMDU1MSA3MjAuNzkxOCBsCisxMzUuODI1MyA3MTcuMDIxNiAxMzUuODI1MyA3MDguNTY2MyAxMzIuMDU1MSA3MDQuNzk2MSBjCitmCitlbmRzdHJlYW0KKz4+CitlbmRvYmoKKworeHJlZgorMCA2CiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDE1IDAwMDAwIG4gCiswMDAwMDAwMDg5IDAwMDAwIG4gCiswMDAwMDAwMTc3IDAwMDAwIG4gCiswMDAwMDAwMjkyIDAwMDAwIG4gCiswMDAwMDAwNTM1IDAwMDAwIG4gCit0cmFpbGVyIDw8CisgIC9Sb290IDEgMCBSCisgIC9TaXplIDYKKz4+CitzdGFydHhyZWYKKzk5MworJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2Fubm90YXRpb25faGlnaGxpZ2h0X3NxdWFyZV93aXRoX2FwLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2Fubm90YXRpb25faGlnaGxpZ2h0X3NxdWFyZV93aXRoX2FwLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGQ1YzQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYW5ub3RhdGlvbl9oaWdobGlnaHRfc3F1YXJlX3dpdGhfYXAucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2Fubm90YXRpb25faW5rX211bHRpcGxlLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2Fubm90YXRpb25faW5rX211bHRpcGxlLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzNkNGEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYW5ub3RhdGlvbl9pbmtfbXVsdGlwbGUucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2Fubm90YXRpb25fc3RhbXBfd2l0aF9hcC5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy9hbm5vdGF0aW9uX3N0YW1wX3dpdGhfYXAucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxODFjOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9hbm5vdGF0aW9uX3N0YW1wX3dpdGhfYXAucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2Fubm90aXRlci5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2Fubm90aXRlci5pbgppbmRleCA0ZGMyYTRlLi4yMWU3YjQ1IDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy9hbm5vdGl0ZXIuaW4KKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYW5ub3RpdGVyLmluCkBAIC0xMjIsOCArMTIyLDYgQEAKID4+CiBlbmRvYmoKIHt7eHJlZn19Ci10cmFpbGVyIDw8Ci0gIC9Sb290IDEgMCBSCi0+Pgore3t0cmFpbGVyfX0KIHt7c3RhcnR4cmVmfX0KICUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9hbm5vdGl0ZXIucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMvYW5ub3RpdGVyLnBkZgppbmRleCAyY2I2ZDM5Li5mZWI3OTA5IDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy9hbm5vdGl0ZXIucGRmCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2Fubm90aXRlci5wZGYKQEAgLTE1MCw5ICsxNTAsNyBAQAogMDAwMDAwMTE2MCAwMDAwMCBuIAogMDAwMDAwMTI4OCAwMDAwMCBuIAogMDAwMDAwMTQxNSAwMDAwMCBuIAotdHJhaWxlciA8PAotICAvUm9vdCAxIDAgUgotPj4KK3RyYWlsZXI8PCAvUm9vdCAxIDAgUiAvU2l6ZSAyNiA+Pgogc3RhcnR4cmVmCiAxNTQ2CiAlJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYm9va21hcmtzLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvYm9va21hcmtzLmluCmluZGV4IGRmYTZlMTQuLjc5M2Y2YWUgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvcmVzb3VyY2VzL2Jvb2ttYXJrcy5pbgorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9ib29rbWFya3MuaW4KQEAgLTkwLDkgKzkwLDYgQEAKIGVuZHN0cmVhbQogZW5kb2JqCiB7e3hyZWZ9fQotdHJhaWxlciA8PAotICAvU2l6ZSA2Ci0gIC9Sb290IDEgMCBSCi0+Pgore3t0cmFpbGVyfX0KIHt7c3RhcnR4cmVmfX0KICUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9ib29rbWFya3MucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMvYm9va21hcmtzLnBkZgppbmRleCA4MjRjZTc4Li44YzJlYjVhIDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy9ib29rbWFya3MucGRmCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2Jvb2ttYXJrcy5wZGYKQEAgLTExNSwxMCArMTE1LDcgQEAKIDAwMDAwMDAwMDAgNjU1MzUgZiAKIDAwMDAwMDA5MjQgMDAwMDAgbiAKIDAwMDAwMDEwMzQgMDAwMDAgbiAKLXRyYWlsZXIgPDwKLSAgL1NpemUgNgotICAvUm9vdCAxIDAgUgotPj4KK3RyYWlsZXI8PCAvUm9vdCAxIDAgUiAvU2l6ZSAyMyA+Pgogc3RhcnR4cmVmCiAxMTIyCiAlJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYm9va21hcmtzX2NpcmN1bGFyLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvYm9va21hcmtzX2NpcmN1bGFyLmluCmluZGV4IDQ4YTU2OTUuLjFiMDVmMzYgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvcmVzb3VyY2VzL2Jvb2ttYXJrc19jaXJjdWxhci5pbgorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9ib29rbWFya3NfY2lyY3VsYXIuaW4KQEAgLTkwLDkgKzkwLDYgQEAKIGVuZHN0cmVhbQogZW5kb2JqCiB7e3hyZWZ9fQotdHJhaWxlciA8PAotICAvU2l6ZSA2Ci0gIC9Sb290IDEgMCBSCi0+Pgore3t0cmFpbGVyfX0KIHt7c3RhcnR4cmVmfX0KICUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9ib29rbWFya3NfY2lyY3VsYXIucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMvYm9va21hcmtzX2NpcmN1bGFyLnBkZgppbmRleCBlN2ViNjI0Li4wZTRlZjg2IDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy9ib29rbWFya3NfY2lyY3VsYXIucGRmCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2Jvb2ttYXJrc19jaXJjdWxhci5wZGYKQEAgLTExNSwxMCArMTE1LDcgQEAKIDAwMDAwMDAwMDAgNjU1MzUgZiAKIDAwMDAwMDA5MjQgMDAwMDAgbiAKIDAwMDAwMDEwMzQgMDAwMDAgbiAKLXRyYWlsZXIgPDwKLSAgL1NpemUgNgotICAvUm9vdCAxIDAgUgotPj4KK3RyYWlsZXI8PCAvUm9vdCAxIDAgUiAvU2l6ZSAyMyA+Pgogc3RhcnR4cmVmCiAxMTIyCiAlJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzY1MC5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNjUwLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTQ2MDMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzY1MC5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzcwNzY3My5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNzA3NjczLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjQxMmJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzcwNzY3My5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzcwOTc5My5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z183MDk3OTMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlmZTA4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z183MDk3OTMuaW4KQEAgLTAsMCArMSwyMiBAQAore3toZWFkZXJ9fQore3tvYmplY3QgMSAwfX0gPDwKKyAgL1BhZ2VzIDMgMCBSCisgIC9BY3JvRm9ybSA8PAorICAgIC9YRkEgNyAwIFIKKyAgPj4KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDMgMH19IDw8Cis+PgorZW5kb2JqCit7e29iamVjdCA3IDB9fSA8PAorPj5zdHJlYW0KKzx4ZHA6eGRwIHhtbG5zOnhkcD0iaHR0cDovL25zLmFkb2JlLmNvbS94ZHAvIj48Y29uZmlnPjxmb3JtLz48Lz48Lz4KK2VuZHN0cmVhbQorZW5kb2JqCit7e3hyZWZ9fQordHJhaWxlciA8PAorICAvUm9vdCAxIDAgUgorPj4KK3t7c3RhcnR4cmVmfX0KKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9idWdfNzA5NzkzLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z183MDk3OTMucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwM2M3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNzA5NzkzLnBkZgpAQCAtMCwwICsxLDMzIEBACislUERGLTEuNworJaDypPQKKzEgMCBvYmogPDwKKyAgL1BhZ2VzIDMgMCBSCisgIC9BY3JvRm9ybSA8PAorICAgIC9YRkEgNyAwIFIKKyAgPj4KKz4+CitlbmRvYmoKKzMgMCBvYmogPDwKKz4+CitlbmRvYmoKKzcgMCBvYmogPDwKKz4+c3RyZWFtCis8eGRwOnhkcCB4bWxuczp4ZHA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGRwLyI+PGNvbmZpZz48Zm9ybS8+PC8+PC8+CitlbmRzdHJlYW0KK2VuZG9iagoreHJlZgorMCA4CiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDE1IDAwMDAwIG4gCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDg2IDAwMDAwIG4gCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMTA3IDAwMDAwIG4gCit0cmFpbGVyIDw8CisgIC9Sb290IDEgMCBSCis+Pgorc3RhcnR4cmVmCisyMTIKKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9idWdfNzEzMTk3LmluIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzcxMzE5Ny5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWVhZWUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzcxMzE5Ny5pbgpAQCAtMCwwICsxLDI3IEBACit7e2hlYWRlcn19DQore3tvYmplY3QgMSAwfX0gPDwNCisgIC9UeXBlIC9DYXRhbG9nDQorICAvUGFnZXMgMiAwIFINCis+Pg0KK2VuZG9iag0KK3t7b2JqZWN0IDIgMH19PDwNCisgIC9UeXBlIC9QYWdlcw0KKyAgL01lZGlhQm94IFswIDAgNjAwIDgwMF0NCisgIC9Db3VudCAxDQorICAvS2lkcyBbIDMgMCBSIF0NCis+Pg0KK2VuZG9iag0KK3t7b2JqZWN0IDMgMH19PDwNCisgIC9UeXBlIC9QYWdlDQorICAvUGFyZW50IDIgMCBSDQorICAvUmVzb3VyY2VzIDw8Pj4NCisgIC9Sb3RhdGUgLTkwDQorPj4NCitlbmRvYmoNCit7e3hyZWZ9fQ0KK3RyYWlsZXIgPDwNCisgIC9TaXplIDQNCisgIC9Sb290IDEgMCBSDQorPj4NCit7e3N0YXJ0eHJlZn19DQorJSVFT0YNCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9idWdfNzEzMTk3LnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z183MTMxOTcucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MWNkZTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNzEzMTk3LnBkZgpAQCAtMCwwICsxLDM0IEBACislUERGLTEuNworJaDypPQNCisxIDAgb2JqIDw8DQorICAvVHlwZSAvQ2F0YWxvZw0KKyAgL1BhZ2VzIDIgMCBSDQorPj4NCitlbmRvYmoNCisyIDAgb2JqPDwNCisgIC9UeXBlIC9QYWdlcw0KKyAgL01lZGlhQm94IFswIDAgNjAwIDgwMF0NCisgIC9Db3VudCAxDQorICAvS2lkcyBbIDMgMCBSIF0NCis+Pg0KK2VuZG9iag0KKzMgMCBvYmo8PA0KKyAgL1R5cGUgL1BhZ2UNCisgIC9QYXJlbnQgMiAwIFINCisgIC9SZXNvdXJjZXMgPDw+Pg0KKyAgL1JvdGF0ZSAtOTANCis+Pg0KK2VuZG9iag0KK3hyZWYKKzAgNAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAxNiAwMDAwMCBuIAorMDAwMDAwMDA3NCAwMDAwMCBuIAorMDAwMDAwMDE3MSAwMDAwMCBuIAordHJhaWxlciA8PA0KKyAgL1NpemUgNA0KKyAgL1Jvb3QgMSAwIFINCis+Pg0KK3N0YXJ0eHJlZgorMjYwDQorJSVFT0YNCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9idWdfNzE3LnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z183MTcucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYWJkMDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNzE3LnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9idWdfNzUwNTY4LmluIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzc1MDU2OC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDcyMDkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzc1MDU2OC5pbgpAQCAtMCwwICsxLDc3IEBACit7e2hlYWRlcn19Cit7e29iamVjdCAxIDB9fSA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDIgMH19IDw8CisgIC9UeXBlIC9QYWdlcworICAvTWVkaWFCb3ggWyAwIDAgMjAwIDIwMCBdCisgIC9Db3VudCA0CisgIC9LaWRzIFsgMyAwIFIgNCAwIFIgNSAwIFIgNiAwIFIgXQorPj4KK2VuZG9iagore3tvYmplY3QgMyAwfX0gPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvQ29udGVudHMgNyAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDQgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL0NvbnRlbnRzIDggMCBSCis+PgorZW5kb2JqCit7e29iamVjdCA1IDB9fSA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9Db250ZW50cyA5IDAgUgorPj4KK2VuZG9iagore3tvYmplY3QgNiAwfX0gPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvQ29udGVudHMgMTAgMCBSCis+PgorZW5kb2JqCit7e29iamVjdCA3IDB9fSA8PAorPj4KK3N0cmVhbQorcQorMCAwIDAgcmcKKzEwIDgwIDUwIDMwIHJlIEIqCitRCitlbmRzdHJlYW0KK2VuZG9iagore3tvYmplY3QgOCAwfX0gPDwKKz4+CitzdHJlYW0KK3EKKzAgMCAxIHJnCis3MCAxMzUgNTAgMzAgcmUgQioKK1EKK2VuZHN0cmVhbQorZW5kb2JqCit7e29iamVjdCA5IDB9fSA8PAorPj4KK3N0cmVhbQorcQorMCAxIDAgcmcKKzEzMCA4MCA1MCAzMCByZSBCKgorUQorZW5kc3RyZWFtCitlbmRvYmoKK3t7b2JqZWN0IDEwIDB9fSA8PAorPj4KK3N0cmVhbQorcQorMSAwIDAgcmcKKzcwIDI1IDUwIDMwIHJlIEIqCitRCitlbmRzdHJlYW0KK2VuZG9iagore3t4cmVmfX0KK3t7dHJhaWxlcn19Cit7e3N0YXJ0eHJlZn19CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzc1MDU2OC5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNzUwNTY4LnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmI2MDE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzc1MDU2OC5wZGYKQEAgLTAsMCArMSw5MSBAQAorJVBERi0xLjcKKyWg8qT0CisxIDAgb2JqIDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorPj4KK2VuZG9iagorMiAwIG9iaiA8PAorICAvVHlwZSAvUGFnZXMKKyAgL01lZGlhQm94IFsgMCAwIDIwMCAyMDAgXQorICAvQ291bnQgNAorICAvS2lkcyBbIDMgMCBSIDQgMCBSIDUgMCBSIDYgMCBSIF0KKz4+CitlbmRvYmoKKzMgMCBvYmogPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvQ29udGVudHMgNyAwIFIKKz4+CitlbmRvYmoKKzQgMCBvYmogPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvQ29udGVudHMgOCAwIFIKKz4+CitlbmRvYmoKKzUgMCBvYmogPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvQ29udGVudHMgOSAwIFIKKz4+CitlbmRvYmoKKzYgMCBvYmogPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvQ29udGVudHMgMTAgMCBSCis+PgorZW5kb2JqCis3IDAgb2JqIDw8Cis+Pgorc3RyZWFtCitxCiswIDAgMCByZworMTAgODAgNTAgMzAgcmUgQioKK1EKK2VuZHN0cmVhbQorZW5kb2JqCis4IDAgb2JqIDw8Cis+Pgorc3RyZWFtCitxCiswIDAgMSByZworNzAgMTM1IDUwIDMwIHJlIEIqCitRCitlbmRzdHJlYW0KK2VuZG9iagorOSAwIG9iaiA8PAorPj4KK3N0cmVhbQorcQorMCAxIDAgcmcKKzEzMCA4MCA1MCAzMCByZSBCKgorUQorZW5kc3RyZWFtCitlbmRvYmoKKzEwIDAgb2JqIDw8Cis+Pgorc3RyZWFtCitxCisxIDAgMCByZworNzAgMjUgNTAgMzAgcmUgQioKK1EKK2VuZHN0cmVhbQorZW5kb2JqCit4cmVmCiswIDExCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDE1IDAwMDAwIG4gCiswMDAwMDAwMDY4IDAwMDAwIG4gCiswMDAwMDAwMTc5IDAwMDAwIG4gCiswMDAwMDAwMjQ4IDAwMDAwIG4gCiswMDAwMDAwMzE3IDAwMDAwIG4gCiswMDAwMDAwMzg2IDAwMDAwIG4gCiswMDAwMDAwNDU2IDAwMDAwIG4gCiswMDAwMDAwNTI1IDAwMDAwIG4gCiswMDAwMDAwNTk1IDAwMDAwIG4gCiswMDAwMDAwNjY1IDAwMDAwIG4gCit0cmFpbGVyPDwgL1Jvb3QgMSAwIFIgL1NpemUgMTEgPj4KK3N0YXJ0eHJlZgorNzM1CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzc1NzcwNS5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNzU3NzA1LnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjdkOTZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzc1NzcwNS5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzc2NTM4NC5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z183NjUzODQuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdlNDZjNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z183NjUzODQuaW4KQEAgLTAsMCArMSw5OCBAQAore3toZWFkZXJ9fQore3tvYmplY3QgMSAwfX0gPDwKKyAgL1R5cGUgL0NhdGFsb2cKKyAgL1BhZ2VzIDIgMCBSCisgIC9BY3JvRm9ybSA0IDAgUgorICAvT3BlbkFjdGlvbiAxMCAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDIgMH19IDw8CisgIC9UeXBlIC9QYWdlcworICAvQ291bnQgMQorICAvS2lkcyBbCisgICAgMyAwIFIKKyAgXQorPj4KK2VuZG9iagorJSBQYWdlIG51bWJlciAwLgore3tvYmplY3QgMyAwfX0gPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvQW5ub3RzIFsKKyAgICA4IDAgUgorICAgIDkgMCBSCisgICAgXQorPj4KK2VuZG9iagorJSBGb3Jtcwore3tvYmplY3QgNCAwfX0gPDwKKyAgL1hGQSBbCisgICAgKHhkcDp4ZHApIDQzIDAgUgorICAgIChmb3JtKSA0OSAwIFIKKyAgICAoPC94ZHA6eGRwPikgNTAgMCBSCisgIF0KKyAgL0ZpZWxkcyBbCisgICAgOCAwIFIKKyAgICA5IDAgUgorICAgIF0KKz4+CitlbmRvYmoKKyUgRmllbGRzCit7e29iamVjdCA4IDB9fSA8PAorICAvRlQgL0NoCisgIC9GZiAwCisgIC9UIChNeUZpZWxkKQorICAvVHlwZSAvQW5ub3QKKyAgL1N1YnR5cGUgL1dpZGdldAorICAvUmVjdCBbMCAwIDgwMCA4MDBdCisgIC9PcHQgWyh0ZXN0IDEpICh0ZXN0IDIpXQorICAvQUEgPDwgL0sgMjAgMCBSID4+Cis+PgorZW5kb2JqCislIEZpZWxkcwore3tvYmplY3QgOSAwfX0gPDwKKyAgL0ZUIC9UeAorICAvVCAoTXlGaWVsZDIpCisgIC9UeXBlIC9Bbm5vdAorICAvU3VidHlwZSAvV2lkZ2V0CisgIC9WIChteWZpZWxkXzIpCisgIC9SZWN0IFswIDAgMSAxXQorPj4KK2VuZG9iagorJSBKUyBBY3Rpb24KK3t7b2JqZWN0IDIwIDB9fSA8PAorICAvVHlwZSAvQWN0aW9uCisgIC9TIC9KYXZhU2NyaXB0CisgIC9KUyAyMSAwIFIKKz4+CitlbmRvYmoKKyUgSlMgcHJvZ3JhbSB0byBleGV4dXRlCit7e29iamVjdCAyMSAwfX0gPDwKKz4+CitzdHJlYW0KK3RoaXMuZ2V0RmllbGQoIk15RmllbGQyIikuc2V0Rm9jdXMoKTsKK3RoaXMuZ2V0RmllbGQoIk15RmllbGQiKS5ib3JkZXJTdHlsZT0iZGFzaGVkIjsKK3RoaXMuZ2V0RmllbGQoIk15RmllbGQiKS5zZXRGb2N1cygpOworZW5kc3RyZWFtCitlbmRvYmoKK3t7b2JqZWN0IDQzIDB9fSA8PAorPj5zdHJlYW0KKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8eGRwOnhkcCB4bWxuczp4ZHA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGRwLyI+CitlbmRzdHJlYW0KK2VuZG9iagore3tvYmplY3QgNDkgMH19IDw8Cis+PnN0cmVhbQorPGNvbmZpZz48L2NvbmZpZz4KKzx0ZW1wbGF0ZT48L3RlbXBsYXRlPgorZW5kc3RyZWFtCitlbmRvYmoKK3t7b2JqZWN0IDUwIDB9fSA8PAorPj5zdHJlYW0KKzwveGRwOnhkcD4KK2VuZHN0cmVhbQorZW5kb2JqCit7e3hyZWZ9fQore3t0cmFpbGVyfX0KK3t7c3RhcnR4cmVmfX0KKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9idWdfNzY1Mzg0LnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z183NjUzODQucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MjBmY2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNzY1Mzg0LnBkZgpAQCAtMCwwICsxLDE1MiBAQAorJVBERi0xLjcKKyWg8qT0CisxIDAgb2JqIDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorICAvQWNyb0Zvcm0gNCAwIFIKKyAgL09wZW5BY3Rpb24gMTAgMCBSCis+PgorZW5kb2JqCisyIDAgb2JqIDw8CisgIC9UeXBlIC9QYWdlcworICAvQ291bnQgMQorICAvS2lkcyBbCisgICAgMyAwIFIKKyAgXQorPj4KK2VuZG9iagorJSBQYWdlIG51bWJlciAwLgorMyAwIG9iaiA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9Bbm5vdHMgWworICAgIDggMCBSCisgICAgOSAwIFIKKyAgICBdCis+PgorZW5kb2JqCislIEZvcm1zCis0IDAgb2JqIDw8CisgIC9YRkEgWworICAgICh4ZHA6eGRwKSA0MyAwIFIKKyAgICAoZm9ybSkgNDkgMCBSCisgICAgKDwveGRwOnhkcD4pIDUwIDAgUgorICBdCisgIC9GaWVsZHMgWworICAgIDggMCBSCisgICAgOSAwIFIKKyAgICBdCis+PgorZW5kb2JqCislIEZpZWxkcworOCAwIG9iaiA8PAorICAvRlQgL0NoCisgIC9GZiAwCisgIC9UIChNeUZpZWxkKQorICAvVHlwZSAvQW5ub3QKKyAgL1N1YnR5cGUgL1dpZGdldAorICAvUmVjdCBbMCAwIDgwMCA4MDBdCisgIC9PcHQgWyh0ZXN0IDEpICh0ZXN0IDIpXQorICAvQUEgPDwgL0sgMjAgMCBSID4+Cis+PgorZW5kb2JqCislIEZpZWxkcworOSAwIG9iaiA8PAorICAvRlQgL1R4CisgIC9UIChNeUZpZWxkMikKKyAgL1R5cGUgL0Fubm90CisgIC9TdWJ0eXBlIC9XaWRnZXQKKyAgL1YgKG15ZmllbGRfMikKKyAgL1JlY3QgWzAgMCAxIDFdCis+PgorZW5kb2JqCislIEpTIEFjdGlvbgorMjAgMCBvYmogPDwKKyAgL1R5cGUgL0FjdGlvbgorICAvUyAvSmF2YVNjcmlwdAorICAvSlMgMjEgMCBSCis+PgorZW5kb2JqCislIEpTIHByb2dyYW0gdG8gZXhleHV0ZQorMjEgMCBvYmogPDwKKz4+CitzdHJlYW0KK3RoaXMuZ2V0RmllbGQoIk15RmllbGQyIikuc2V0Rm9jdXMoKTsKK3RoaXMuZ2V0RmllbGQoIk15RmllbGQiKS5ib3JkZXJTdHlsZT0iZGFzaGVkIjsKK3RoaXMuZ2V0RmllbGQoIk15RmllbGQiKS5zZXRGb2N1cygpOworZW5kc3RyZWFtCitlbmRvYmoKKzQzIDAgb2JqIDw8Cis+PnN0cmVhbQorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx4ZHA6eGRwIHhtbG5zOnhkcD0iaHR0cDovL25zLmFkb2JlLmNvbS94ZHAvIj4KK2VuZHN0cmVhbQorZW5kb2JqCis0OSAwIG9iaiA8PAorPj5zdHJlYW0KKzxjb25maWc+PC9jb25maWc+Cis8dGVtcGxhdGU+PC90ZW1wbGF0ZT4KK2VuZHN0cmVhbQorZW5kb2JqCis1MCAwIG9iaiA8PAorPj5zdHJlYW0KKzwveGRwOnhkcD4KK2VuZHN0cmVhbQorZW5kb2JqCit4cmVmCiswIDUxCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDE1IDAwMDAwIG4gCiswMDAwMDAwMTA3IDAwMDAwIG4gCiswMDAwMDAwMTk1IDAwMDAwIG4gCiswMDAwMDAwMjkyIDAwMDAwIG4gCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwNDM2IDAwMDAwIG4gCiswMDAwMDAwNjA0IDAwMDAwIG4gCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwNzMyIDAwMDAwIG4gCiswMDAwMDAwODI0IDAwMDAwIG4gCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwOTg1IDAwMDAwIG4gCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAxMTA5IDAwMDAwIG4gCiswMDAwMDAxMTg3IDAwMDAwIG4gCit0cmFpbGVyPDwgL1Jvb3QgMSAwIFIgL1NpemUgNTEgPj4KK3N0YXJ0eHJlZgorMTIzNgorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z183NzkuaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNzc5LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZTIxYTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNzc5LmluCkBAIC0wLDAgKzEsNTAgQEAKK3t7aGVhZGVyfX0KK3t7b2JqZWN0IDEgMH19IDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorPj4KK2VuZG9iagore3tvYmplY3QgMiAwfX0gPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9NZWRpYUJveCBbIDAgMCA2MTIgNzkyIF0KKyAgL0NvdW50IDEKKyAgL0tpZHMgWyAzIDAgUiBdCis+PgorZW5kb2JqCit7e29iamVjdCAzIDB9fSA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9Db250ZW50cyA0IDAgUgorICAvUmVzb3VyY2VzIDUgMCBSCis+PgorZW5kb2JqCit7e29iamVjdCA0IDB9fSA8PAorPj4KK3N0cmVhbQorMSAwIDAgLTEgMCA3OTIgY20KKzAgMCAyNTUgUkcKKzI1NSAwIDAgcmcKKzUgdworL0dTMSBncworcQorMTAwIDEwMCBtCisyMDAgMjAwIGwKKzIwMCAzMDAgbAorYioKK2VuZHN0cmVhbQorZW5kb2JqCit7e29iamVjdCA1IDB9fSA8PAorICAvRXh0R1N0YXRlIDw8CisgICAgL0dTMSA2IDAgUgorICA+PgorPj4KK2VuZG9iagore3tvYmplY3QgNiAwfX0gPDwKKyAgL1R5cGUgL0V4dEdTdGF0ZQorICAvQ0EgMC4zCisgIC9jYSAwLjMKKz4+Cit7e3hyZWZ9fQore3t0cmFpbGVyfX0KK3t7c3RhcnR4cmVmfX0KKyUlRU9GClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzc3OS5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNzc5LnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDYwOTA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzc3OS5wZGYKQEAgLTAsMCArMSw2MCBAQAorJVBERi0xLjcKKyWg8qT0CisxIDAgb2JqIDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorPj4KK2VuZG9iagorMiAwIG9iaiA8PAorICAvVHlwZSAvUGFnZXMKKyAgL01lZGlhQm94IFsgMCAwIDYxMiA3OTIgXQorICAvQ291bnQgMQorICAvS2lkcyBbIDMgMCBSIF0KKz4+CitlbmRvYmoKKzMgMCBvYmogPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvQ29udGVudHMgNCAwIFIKKyAgL1Jlc291cmNlcyA1IDAgUgorPj4KK2VuZG9iagorNCAwIG9iaiA8PAorPj4KK3N0cmVhbQorMSAwIDAgLTEgMCA3OTIgY20KKzAgMCAyNTUgUkcKKzI1NSAwIDAgcmcKKzUgdworL0dTMSBncworcQorMTAwIDEwMCBtCisyMDAgMjAwIGwKKzIwMCAzMDAgbAorYioKK2VuZHN0cmVhbQorZW5kb2JqCis1IDAgb2JqIDw8CisgIC9FeHRHU3RhdGUgPDwKKyAgICAvR1MxIDYgMCBSCisgID4+Cis+PgorZW5kb2JqCis2IDAgb2JqIDw8CisgIC9UeXBlIC9FeHRHU3RhdGUKKyAgL0NBIDAuMworICAvY2EgMC4zCis+PgoreHJlZgorMCA3CiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDE1IDAwMDAwIG4gCiswMDAwMDAwMDY4IDAwMDAwIG4gCiswMDAwMDAwMTYxIDAwMDAwIG4gCiswMDAwMDAwMjQ5IDAwMDAwIG4gCiswMDAwMDAwMzc0IDAwMDAwIG4gCiswMDAwMDAwNDMxIDAwMDAwIG4gCit0cmFpbGVyPDwgL1Jvb3QgMSAwIFIgL1NpemUgNyA+Pgorc3RhcnR4cmVmCis0ODQKKyUlRU9GClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzc4MTgwNC5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNzgxODA0LnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTMwNGYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzc4MTgwNC5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzc4MjU5Ni5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy9idWdfNzgyNTk2LnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjhkODk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzc4MjU5Ni5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzkyMS5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z185MjEuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM0OGIyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z185MjEuaW4KQEAgLTAsMCArMSw2NCBAQAore3toZWFkZXJ9fQore3tvYmplY3QgMSAwfX0gPDwKKyAgL1R5cGUgL0NhdGFsb2cKKyAgL1BhZ2VzIDIgMCBSCis+PgorZW5kb2JqCit7e29iamVjdCAyIDB9fSA8PAorICAvVHlwZSAvUGFnZXMKKyAgL01lZGlhQm94IFsgMCAwIDYxMiA3OTIgXQorICAvQ291bnQgMQorICAvS2lkcyBbIDMgMCBSIF0KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDMgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA8PAorICAgIC9Gb250IDw8CisgICAgICAvRjAgNCAwIFIKKyAgICA+PgorICA+PgorICAvQ29udGVudHMgNiAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDQgMH19IDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMAorICAvQmFzZUZvbnQgL0Zvb0ZvbnQKKyAgL0VuY29kaW5nIC9JZGVudGl0eS1ICisgIC9EZXNjZW5kYW50Rm9udHMgWzUgMCBSXQorPj4KK2VuZG9iagore3tvYmplY3QgNSAwfX0gPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL0NJREZvbnRUeXBlMgorICAvRFcgNTAwCisgIC9CYXNlRm9udCAvRm9vRm9udAorICAvQ0lEU3lzdGVtSW5mbyA8PAorICAgIC9PcmRlcmluZyAoSWRlbnRpdHkpCisgICAgL1JlZ2lzdHJ5IChBZG9iZSkKKyAgICAvU3VwcGxlbWVudCAwCisgID4+Cis+PgorZW5kb2JqCit7e29iamVjdCA2IDB9fSA8PAorL0xlbmd0aCAyNzg0Cis+Pgorc3RyZWFtCitCVAorMyBUcgorL0YwIDggVGYKKzEuMDAgLTAuMDAgMC4wMCAxLjAwIDI1OC4yIDk5LjYgVG0gMTk4LjAgVHogWyA8MDQxOD4gXSBUSiAxMS4zIDAuMCBUZCAxMjEuMiBUeiBbIDwwNDQwPjwwNDMwPjwwNDM3PjwwNDMyPjwwNDM1PiBdIFRKIDI3LjggMC4wIFRkIDEyNi4wIFR6IFsgPDA0M0Q+PDA0MzU+IF0gVEogMTQuMiAwLjAgVGQgMTI5LjAgVHogWyA8MDQzMj48MDQ0Qj48MDQ0MD48MDQzMD48MDQzNj48MDQzMD48MDQzNT48MDQ0Mj4gXSBUSiA0NS4xIDAuMCBUZCAxMTguMCBUeiBbIDwwNDMzPjwwNDNCPjwwNDQzPjwwNDMxPjwwNDNFPjwwNDNBPjwwNDNFPjwwNDMzPjwwNDNFPiBdIFRKIDQ2LjMgMC4wIFRkIDExOS4wIFR6IFsgPDA0NDc+PDA0MzU+PDA0M0I+PDA0M0U+PDA0MzI+PDA0MzU+IF0gVEogL0YwIDkgVGYKKy0xNjEuOCAtMTAuMyBUZCAxMDIuMSBUeiBbIDwwNDQ3PjwwNDM1PjwwNDQxPjwwNDNBPjwwNDNFPjwwNDMzPjwwNDNFPiBdIFRKIDM2LjcgMC4wIFRkIDEwNC4zIFR6IFsgPDA0NDE+PDA0NDI+PDA0NDA+PDA0MzA+PDA0MzQ+PDA0MzA+PDA0M0Q+PDA0Mzg+PDA0NEY+IF0gVEogNDYuOCAwLjAgVGQgMTE4LjcgVHogWyA8MDQzQj48MDQzOD48MDQ0Nj48MDQzRT4gXSBUSiAyNS40IDAuMCBUZCAxMTYuNCBUeiBbIDwwNDFFPjwwNDQyPjwwNDM1PjwwNDNCPjwwNDNCPjwwNDNFPiBdIFRKIDM0LjggMC4wIFRkIDI1MC43IFR6IFsgPDIwMTQ+IF0gVEogMTUuNCAwLjAgVGQgMTEzLjggVHogWyA8MDQxRj48MDQzRT48MDQzQj48MDQ0Rj48MDQzQT48MDQzRT4gXSBUSiAvRjAgOCBUZgorLTE1Ny43IC0xMC4zIFRkIDEwMi4wIFR6IFsgPDA0MzI+PDA0MzA+PDAwMkM+IF0gVEogMTguMCAwLjAgVGQgMTIyLjQgVHogWyA8MDQzQT48MDQzRT48MDQzMz48MDQzND48MDQzMD4gXSBUSiAzMC4wIDAuMCBUZCAxMjkuMCBUeiBbIDwwNDNFPjwwNDNEPiBdIFRKIDE2LjYgMC4wIFRkIDExNC44IFR6IFsgPDA0MzM+PDA0M0U+PDA0MzI+PDA0M0U+PDA0NDA+PDA0Mzg+PDA0NDI+PDAwM0E+IF0gVEogNDEuMCAwLjAgVGQgMTI5LjQgVHogWyA8MDBBQj48MDQyMT48MDQzNT48MDQ0MD48MDQzND48MDQ0Nj48MDQzNT4gXSBUSiA0MC44IDAuMCBUZCAxMzguMCBUeiBbIDwwNDNDPjwwNDNFPjwwNDM1PiBdIFRKIDIyLjMgMC4wIFRkIDEyMC4wIFR6IFsgPDA0M0U+PDA0MzE+PDA0NDA+PDA0MzA+IF0gVEogL0YwIDkgVGYKKy0xNjguMiAtMTAuOCBUZCAxMDQuOSBUeiBbIDwwNDQyPjwwNDM4PjwwNDNCPjwwNDNFPjwwNDQxPjwwNDRDPiBdIFRKIDMxLjkgMC4wIFRkIDEyOC4wIFR6IFsgPDA0MzI+IF0gVEogMTAuOCAwLjAgVGQgMTAyLjkgVHogWyA8MDQzQT48MDQzMD48MDQzQz48MDQzNT48MDQzRD48MDQ0Qz48MDAyMT4gXSBUSiAzNi4wIDAuMCBUZCAxMTkuMSBUeiBbIDwwNDIzPjwwNDM0PjwwNDMwPjwwNDQwPjwwNDM4PjwwNDMyPiBdIFRKIDM3LjAgMC4wIFRkIDEyNS4zIFR6IFsgPDA0M0Y+PDA0M0U+IF0gVEogMTUuOCAwLjAgVGQgMTAxLjMgVHogWyA8MDQzRD48MDQzNT48MDQzQz48MDAyQz4gXSBUSiAyMi4xIDAuMCBUZCAxMTcuMyBUeiBbIDwwNDRGPiBdIFRKIDguOSAwLjAgVGQgMTI0LjggVHogWyA8MDQ0Mz48MDQ0OD48MDQzOD48MDQzMT48MDQ0Mz4gXSBUSiAvRjAgOCBUZgorLTE2Mi41IC0xMC42IFRkIDExNS41IFR6IFsgPDA0NDE+PDA0MzU+PDA0MzE+PDA0MzU+IF0gVEogMjEuNiAwLjAgVGQgMTIwLjAgVHogWyA8MDQ0MD48MDQ0Mz48MDQzQT48MDQ0Mz48MDAyRT4gXSBUSiAyOS4wIDAuMCBUZCAxNTYuMCBUeiBbIDwwNDFEPjwwNDNFPiBdIFRKIDE3LjAgMC4wIFRkIDEwNy4yIFR6IFsgPDA0MzI+PDA0NDE+PDA0MzU+PDAwMkQ+PDA0NDI+PDA0MzA+PDA0M0E+PDA0Mzg+IF0gVEogNDAuNiAwLjAgVGQgMTM2LjAgVHogWyA8MDQzQz48MDQzOD48MDQ0MD4gXSBUSiAyMC45IDAuMCBUZCAxMzIuMCBUeiBbIDwwNDNEPjwwNDM1PiBdIFRKIDE1LjEgMC4wIFRkIDEyMC4wIFR6IFsgPDA0MzI+PDA0Mzg+PDA0MzQ+PDA0MzA+PDA0M0I+IF0gVEogMjkuOCAwLjAgVGQgMTEyLjAgVHogWyA8MDQ0MT48MDQzRT48MDQzNz4gXSBUSiAtMTc1LjQgLTEwLjYgVGQgMTIwLjAgVHogWyA8MDQzND48MDQzMD48MDQzRD48MDQ0Qz48MDQ0Rj4gXSBUSiAzMC43IDAuMCBUZCAxMDQuMSBUeiBbIDwwNDNGPjwwNDQwPjwwNDM1PjwwNDNCPjwwNDM1PjwwNDQxPjwwNDQyPjwwNDNEPjwwNDM1PjwwNDM5PjwwMDIxPjwwMDJFPjwwMDJFPjwwMEJCPiBdIFRKIDY0LjEgMC4wIFRkIDIwNC4wIFR6IFsgPDA0MTg+IF0gVEogMTYuNiAwLjAgVGQgMTIyLjQgVHogWyA8MDQzMj48MDQzRD48MDQzRT48MDQzMj48MDQ0Qz4gXSBUSiAzMy4xIDAuMCBUZCAxNTYuMCBUeiBbIDwwNDNDPjwwNDRCPiBdIFRKIDIxLjggMC4wIFRkIDEyNi4wIFR6IFsgPDA0MzI+PDA0Mzg+PDA0MzQ+PDA0Mzg+PDA0M0M+IF0gVEogL0YwIDkgVGYKKy0xNjQuOSAtMTEuMCBUZCAxMDYuNyBUeiBbIDwwNDMzPjwwNDNCPjwwNDQzPjwwNDMxPjwwNDNFPjwwNDNBPjwwNDNFPjwwNDM1PiBdIFRKIDQzLjkgMC4wIFRkIDEwNC45IFR6IFsgPDA0NDc+PDA0MzU+PDA0M0I+PDA0M0U+PDA0MzI+PDA0MzU+PDA0NDc+PDA0MzU+PDA0NDE+PDA0M0E+PDA0M0U+PDA0MzU+IF0gVEogNjIuNCAwLjAgVGQgOTkuMiBUeiBbIDwwNDQxPjwwNDQyPjwwNDQwPjwwNDMwPjwwNDM0PjwwNDMwPjwwNDNEPjwwNDM4PjwwNDM1PjwwMDJFPiBdIFRKIDUwLjkgMC4wIFRkIDExMi4wIFR6IFsgPDA0MUY+PDA0M0U+PDA0NDA+PDA0NDM+PDA0MzM+PDA0MzA+IF0gVEogCitFVAorZW5kc3RyZWFtCitlbmRvYmoKK3t7eHJlZn19Cit7e3RyYWlsZXJ9fQore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z185MjEucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMvYnVnXzkyMS5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzOTUwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2J1Z185MjEucGRmCkBAIC0wLDAgKzEsNzQgQEAKKyVQREYtMS43CisloPKk9AorMSAwIG9iaiA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKz4+CitlbmRvYmoKKzIgMCBvYmogPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9NZWRpYUJveCBbIDAgMCA2MTIgNzkyIF0KKyAgL0NvdW50IDEKKyAgL0tpZHMgWyAzIDAgUiBdCis+PgorZW5kb2JqCiszIDAgb2JqIDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA8PAorICAgIC9Gb250IDw8CisgICAgICAvRjAgNCAwIFIKKyAgICA+PgorICA+PgorICAvQ29udGVudHMgNiAwIFIKKz4+CitlbmRvYmoKKzQgMCBvYmogPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUwCisgIC9CYXNlRm9udCAvRm9vRm9udAorICAvRW5jb2RpbmcgL0lkZW50aXR5LUgKKyAgL0Rlc2NlbmRhbnRGb250cyBbNSAwIFJdCis+PgorZW5kb2JqCis1IDAgb2JqIDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9DSURGb250VHlwZTIKKyAgL0RXIDUwMAorICAvQmFzZUZvbnQgL0Zvb0ZvbnQKKyAgL0NJRFN5c3RlbUluZm8gPDwKKyAgICAvT3JkZXJpbmcgKElkZW50aXR5KQorICAgIC9SZWdpc3RyeSAoQWRvYmUpCisgICAgL1N1cHBsZW1lbnQgMAorICA+PgorPj4KK2VuZG9iagorNiAwIG9iaiA8PAorL0xlbmd0aCAyNzg0Cis+Pgorc3RyZWFtCitCVAorMyBUcgorL0YwIDggVGYKKzEuMDAgLTAuMDAgMC4wMCAxLjAwIDI1OC4yIDk5LjYgVG0gMTk4LjAgVHogWyA8MDQxOD4gXSBUSiAxMS4zIDAuMCBUZCAxMjEuMiBUeiBbIDwwNDQwPjwwNDMwPjwwNDM3PjwwNDMyPjwwNDM1PiBdIFRKIDI3LjggMC4wIFRkIDEyNi4wIFR6IFsgPDA0M0Q+PDA0MzU+IF0gVEogMTQuMiAwLjAgVGQgMTI5LjAgVHogWyA8MDQzMj48MDQ0Qj48MDQ0MD48MDQzMD48MDQzNj48MDQzMD48MDQzNT48MDQ0Mj4gXSBUSiA0NS4xIDAuMCBUZCAxMTguMCBUeiBbIDwwNDMzPjwwNDNCPjwwNDQzPjwwNDMxPjwwNDNFPjwwNDNBPjwwNDNFPjwwNDMzPjwwNDNFPiBdIFRKIDQ2LjMgMC4wIFRkIDExOS4wIFR6IFsgPDA0NDc+PDA0MzU+PDA0M0I+PDA0M0U+PDA0MzI+PDA0MzU+IF0gVEogL0YwIDkgVGYKKy0xNjEuOCAtMTAuMyBUZCAxMDIuMSBUeiBbIDwwNDQ3PjwwNDM1PjwwNDQxPjwwNDNBPjwwNDNFPjwwNDMzPjwwNDNFPiBdIFRKIDM2LjcgMC4wIFRkIDEwNC4zIFR6IFsgPDA0NDE+PDA0NDI+PDA0NDA+PDA0MzA+PDA0MzQ+PDA0MzA+PDA0M0Q+PDA0Mzg+PDA0NEY+IF0gVEogNDYuOCAwLjAgVGQgMTE4LjcgVHogWyA8MDQzQj48MDQzOD48MDQ0Nj48MDQzRT4gXSBUSiAyNS40IDAuMCBUZCAxMTYuNCBUeiBbIDwwNDFFPjwwNDQyPjwwNDM1PjwwNDNCPjwwNDNCPjwwNDNFPiBdIFRKIDM0LjggMC4wIFRkIDI1MC43IFR6IFsgPDIwMTQ+IF0gVEogMTUuNCAwLjAgVGQgMTEzLjggVHogWyA8MDQxRj48MDQzRT48MDQzQj48MDQ0Rj48MDQzQT48MDQzRT4gXSBUSiAvRjAgOCBUZgorLTE1Ny43IC0xMC4zIFRkIDEwMi4wIFR6IFsgPDA0MzI+PDA0MzA+PDAwMkM+IF0gVEogMTguMCAwLjAgVGQgMTIyLjQgVHogWyA8MDQzQT48MDQzRT48MDQzMz48MDQzND48MDQzMD4gXSBUSiAzMC4wIDAuMCBUZCAxMjkuMCBUeiBbIDwwNDNFPjwwNDNEPiBdIFRKIDE2LjYgMC4wIFRkIDExNC44IFR6IFsgPDA0MzM+PDA0M0U+PDA0MzI+PDA0M0U+PDA0NDA+PDA0Mzg+PDA0NDI+PDAwM0E+IF0gVEogNDEuMCAwLjAgVGQgMTI5LjQgVHogWyA8MDBBQj48MDQyMT48MDQzNT48MDQ0MD48MDQzND48MDQ0Nj48MDQzNT4gXSBUSiA0MC44IDAuMCBUZCAxMzguMCBUeiBbIDwwNDNDPjwwNDNFPjwwNDM1PiBdIFRKIDIyLjMgMC4wIFRkIDEyMC4wIFR6IFsgPDA0M0U+PDA0MzE+PDA0NDA+PDA0MzA+IF0gVEogL0YwIDkgVGYKKy0xNjguMiAtMTAuOCBUZCAxMDQuOSBUeiBbIDwwNDQyPjwwNDM4PjwwNDNCPjwwNDNFPjwwNDQxPjwwNDRDPiBdIFRKIDMxLjkgMC4wIFRkIDEyOC4wIFR6IFsgPDA0MzI+IF0gVEogMTAuOCAwLjAgVGQgMTAyLjkgVHogWyA8MDQzQT48MDQzMD48MDQzQz48MDQzNT48MDQzRD48MDQ0Qz48MDAyMT4gXSBUSiAzNi4wIDAuMCBUZCAxMTkuMSBUeiBbIDwwNDIzPjwwNDM0PjwwNDMwPjwwNDQwPjwwNDM4PjwwNDMyPiBdIFRKIDM3LjAgMC4wIFRkIDEyNS4zIFR6IFsgPDA0M0Y+PDA0M0U+IF0gVEogMTUuOCAwLjAgVGQgMTAxLjMgVHogWyA8MDQzRD48MDQzNT48MDQzQz48MDAyQz4gXSBUSiAyMi4xIDAuMCBUZCAxMTcuMyBUeiBbIDwwNDRGPiBdIFRKIDguOSAwLjAgVGQgMTI0LjggVHogWyA8MDQ0Mz48MDQ0OD48MDQzOD48MDQzMT48MDQ0Mz4gXSBUSiAvRjAgOCBUZgorLTE2Mi41IC0xMC42IFRkIDExNS41IFR6IFsgPDA0NDE+PDA0MzU+PDA0MzE+PDA0MzU+IF0gVEogMjEuNiAwLjAgVGQgMTIwLjAgVHogWyA8MDQ0MD48MDQ0Mz48MDQzQT48MDQ0Mz48MDAyRT4gXSBUSiAyOS4wIDAuMCBUZCAxNTYuMCBUeiBbIDwwNDFEPjwwNDNFPiBdIFRKIDE3LjAgMC4wIFRkIDEwNy4yIFR6IFsgPDA0MzI+PDA0NDE+PDA0MzU+PDAwMkQ+PDA0NDI+PDA0MzA+PDA0M0E+PDA0Mzg+IF0gVEogNDAuNiAwLjAgVGQgMTM2LjAgVHogWyA8MDQzQz48MDQzOD48MDQ0MD4gXSBUSiAyMC45IDAuMCBUZCAxMzIuMCBUeiBbIDwwNDNEPjwwNDM1PiBdIFRKIDE1LjEgMC4wIFRkIDEyMC4wIFR6IFsgPDA0MzI+PDA0Mzg+PDA0MzQ+PDA0MzA+PDA0M0I+IF0gVEogMjkuOCAwLjAgVGQgMTEyLjAgVHogWyA8MDQ0MT48MDQzRT48MDQzNz4gXSBUSiAtMTc1LjQgLTEwLjYgVGQgMTIwLjAgVHogWyA8MDQzND48MDQzMD48MDQzRD48MDQ0Qz48MDQ0Rj4gXSBUSiAzMC43IDAuMCBUZCAxMDQuMSBUeiBbIDwwNDNGPjwwNDQwPjwwNDM1PjwwNDNCPjwwNDM1PjwwNDQxPjwwNDQyPjwwNDNEPjwwNDM1PjwwNDM5PjwwMDIxPjwwMDJFPjwwMDJFPjwwMEJCPiBdIFRKIDY0LjEgMC4wIFRkIDIwNC4wIFR6IFsgPDA0MTg+IF0gVEogMTYuNiAwLjAgVGQgMTIyLjQgVHogWyA8MDQzMj48MDQzRD48MDQzRT48MDQzMj48MDQ0Qz4gXSBUSiAzMy4xIDAuMCBUZCAxNTYuMCBUeiBbIDwwNDNDPjwwNDRCPiBdIFRKIDIxLjggMC4wIFRkIDEyNi4wIFR6IFsgPDA0MzI+PDA0Mzg+PDA0MzQ+PDA0Mzg+PDA0M0M+IF0gVEogL0YwIDkgVGYKKy0xNjQuOSAtMTEuMCBUZCAxMDYuNyBUeiBbIDwwNDMzPjwwNDNCPjwwNDQzPjwwNDMxPjwwNDNFPjwwNDNBPjwwNDNFPjwwNDM1PiBdIFRKIDQzLjkgMC4wIFRkIDEwNC45IFR6IFsgPDA0NDc+PDA0MzU+PDA0M0I+PDA0M0U+PDA0MzI+PDA0MzU+PDA0NDc+PDA0MzU+PDA0NDE+PDA0M0E+PDA0M0U+PDA0MzU+IF0gVEogNjIuNCAwLjAgVGQgOTkuMiBUeiBbIDwwNDQxPjwwNDQyPjwwNDQwPjwwNDMwPjwwNDM0PjwwNDMwPjwwNDNEPjwwNDM4PjwwNDM1PjwwMDJFPiBdIFRKIDUwLjkgMC4wIFRkIDExMi4wIFR6IFsgPDA0MUY+PDA0M0U+PDA0NDA+PDA0NDM+PDA0MzM+PDA0MzA+IF0gVEogCitFVAorZW5kc3RyZWFtCitlbmRvYmoKK3hyZWYKKzAgNworMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAxNSAwMDAwMCBuIAorMDAwMDAwMDA2OCAwMDAwMCBuIAorMDAwMDAwMDE2MSAwMDAwMCBuIAorMDAwMDAwMDI4NyAwMDAwMCBuIAorMDAwMDAwMDQxMiAwMDAwMCBuIAorMDAwMDAwMDU5MyAwMDAwMCBuIAordHJhaWxlcjw8IC9Sb290IDEgMCBSIC9TaXplIDcgPj4KK3N0YXJ0eHJlZgorMzQyOAorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2NpcmN1bGFyX3ZpZXdlcl9yZWYuaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9jaXJjdWxhcl92aWV3ZXJfcmVmLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZTc4MDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9jaXJjdWxhcl92aWV3ZXJfcmVmLmluCkBAIC0wLDAgKzEsMjQgQEAKK3t7aGVhZGVyfX0KK3t7b2JqZWN0IDEgMH19Cis8PC9OYW1lcyAxIDAgUgorICAvVmlld2VyUHJlZmVyZW5jZXM8PAorICAvTmFtZXMgMSAwIFIKKyAgL1ZpZXdlclByZWZlcmVuY2VzPDwKKyAgL05hbWVzIDEgMCBSCisgIC9WaWV3ZXJQcmVmZXJlbmNlczw8Pj4KKyAgPj4+PgorPj4KK2VuZG9iagorCit7e29iamVjdCAyIDB9fQorPDwvTmFtZXNbKDApIDcgMCBSXT4+CitlbmRvYmoKKwore3tvYmplY3QgNyAwfX0KKzw8L0pTKHRoaXMucHJpbnRcKHtiVUk6dHJ1ZSxiU2lsZW50OmZhbHNlLGJTaHJpbmtUb0ZpdDp0cnVlfVwpOykvUy9KYXZhU2NyaXB0Pj4KK2VuZG9iagorCit7e3hyZWZ9fQore3t0cmFpbGVyfX0KK3t7c3RhcnR4cmVmfX0KKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9jaXJjdWxhcl92aWV3ZXJfcmVmLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2NpcmN1bGFyX3ZpZXdlcl9yZWYucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5N2QwNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9jaXJjdWxhcl92aWV3ZXJfcmVmLnBkZgpAQCAtMCwwICsxLDM1IEBACislUERGLTEuNworJaDypPQKKzEgMCBvYmoKKzw8L05hbWVzIDEgMCBSCisgIC9WaWV3ZXJQcmVmZXJlbmNlczw8CisgIC9OYW1lcyAxIDAgUgorICAvVmlld2VyUHJlZmVyZW5jZXM8PAorICAvTmFtZXMgMSAwIFIKKyAgL1ZpZXdlclByZWZlcmVuY2VzPDw+PgorICA+Pj4+Cis+PgorZW5kb2JqCisKKzIgMCBvYmoKKzw8L05hbWVzWygwKSA3IDAgUl0+PgorZW5kb2JqCisKKzcgMCBvYmoKKzw8L0pTKHRoaXMucHJpbnRcKHtiVUk6dHJ1ZSxiU2lsZW50OmZhbHNlLGJTaHJpbmtUb0ZpdDp0cnVlfVwpOykvUy9KYXZhU2NyaXB0Pj4KK2VuZG9iagorCit4cmVmCiswIDgKKzAwMDAwMDAwMDAgNjU1MzUgZiAKKzAwMDAwMDAwMTUgMDAwMDAgbiAKKzAwMDAwMDAxNTcgMDAwMDAgbiAKKzAwMDAwMDAwMDAgNjU1MzUgZiAKKzAwMDAwMDAwMDAgNjU1MzUgZiAKKzAwMDAwMDAwMDAgNjU1MzUgZiAKKzAwMDAwMDAwMDAgNjU1MzUgZiAKKzAwMDAwMDAxOTUgMDAwMDAgbiAKK3RyYWlsZXI8PCAvUm9vdCAxIDAgUiAvU2l6ZSA4ID4+CitzdGFydHhyZWYKKzI5MQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2NvbWJvYm94X2Zvcm0uaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9jb21ib2JveF9mb3JtLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOWY5MTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9jb21ib2JveF9mb3JtLmluCkBAIC0wLDAgKzEsODYgQEAKK3t7aGVhZGVyfX0KK3t7b2JqZWN0IDEgMH19Cis8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKyAgL0Fjcm9Gb3JtIDw8IC9GaWVsZHMgWyA4IDAgUiA5IDAgUiAxMCAwIFIgXSAvRFIgNCAwIFIgPj4KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDIgMH19Cis8PCAvQ291bnQgMSAvS2lkcyBbIDMgMCBSIF0gL1R5cGUgL1BhZ2VzID4+CitlbmRvYmoKK3t7b2JqZWN0IDMgMH19Cis8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgNCAwIFIKKyAgL01lZGlhQm94IFsgMCAwIDMwMCAzMDAgXQorICAvQ29udGVudHMgNyAwIFIKKyAgL0Fubm90cyBbIDggMCBSIDkgMCBSIDEwIDAgUiBdCis+PgorZW5kb2JqCit7e29iamVjdCA0IDB9fQorPDwgL0ZvbnQgNSAwIFIgPj4KK2VuZG9iagore3tvYmplY3QgNSAwfX0KKzw8IC9GMSA2IDAgUiA+PgorZW5kb2JqCit7e29iamVjdCA2IDB9fQorPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvSGVsdmV0aWNhCis+PgorZW5kb2JqCit7e29iamVjdCA3IDB9fQorPDwgL0xlbmd0aCA1MSA+Pgorc3RyZWFtCitCVAorMCAwIDAgcmcKKy9GMSAxMiBUZgorMTAwIDE1MCBUZAorKFRlc3QgRm9ybSkgVGoKK0VUCitlbmRzdHJlYW0KK2VuZG9iagore3tvYmplY3QgOCAwfX0KKzw8CisgIC9UeXBlIC9Bbm5vdAorICAvRlQgL0NoCisgIC9GZiAzOTMyMTYKKyAgL1QgKENvbWJvX0VkaXRhYmxlKQorICAvREEgKDAgMCAwIHJnIC9GMSAxMiBUZikKKyAgL1JlY3QgWyAxMDAgNTAgMjAwIDgwIF0KKyAgL1N1YnR5cGUgL1dpZGdldAorICAvT3B0IFtbKGZvbykgKEZvbyldIFsoYmFyKSAoQmFyKV0gWyhxdXgpIChRdXgpXV0KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDkgMH19Cis8PAorICAvVHlwZSAvQW5ub3QKKyAgL0ZUIC9DaAorICAvRmYgMTMxMDcyCisgIC9UIChDb21ibzEpCisgIC9EQSAoMCAwIDAgcmcgL0YxIDEyIFRmKQorICAvUmVjdCBbIDEwMCAxMDAgMjAwIDEzMCBdCisgIC9TdWJ0eXBlIC9XaWRnZXQKKyAgL09wdCBbKEFwcGxlKSAoQmFuYW5hKSAoQ2hlcnJ5KV0KKyAgL1YgKEJhbmFuYSkKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDEwIDB9fQorPDwKKyAgL1R5cGUgL0Fubm90CisgIC9GVCAvQ2gKKyAgL0ZmIDEzMTA3MworICAvVCAoQ29tYm9fUmVhZE9ubHkpCisgIC9EQSAoMCAwIDAgcmcgL0YxIDEyIFRmKQorICAvUmVjdCBbIDEwMCAyMDAgMjAwIDIzMCBdCisgIC9TdWJ0eXBlIC9XaWRnZXQKKyAgL09wdCBbKERvZykgKEVsZXBoYW50KSAoRnJvZyldCis+PgorZW5kb2JqCit7e3hyZWZ9fQore3t0cmFpbGVyfX0KK3t7c3RhcnR4cmVmfX0KKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9jb21ib2JveF9mb3JtLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2NvbWJvYm94X2Zvcm0ucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNDkyNzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9jb21ib2JveF9mb3JtLnBkZgpAQCAtMCwwICsxLDEwMCBAQAorJVBERi0xLjcKKyWg8qT0CisxIDAgb2JqCis8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKyAgL0Fjcm9Gb3JtIDw8IC9GaWVsZHMgWyA4IDAgUiA5IDAgUiAxMCAwIFIgXSAvRFIgNCAwIFIgPj4KKz4+CitlbmRvYmoKKzIgMCBvYmoKKzw8IC9Db3VudCAxIC9LaWRzIFsgMyAwIFIgXSAvVHlwZSAvUGFnZXMgPj4KK2VuZG9iagorMyAwIG9iagorPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvUmVzb3VyY2VzIDQgMCBSCisgIC9NZWRpYUJveCBbIDAgMCAzMDAgMzAwIF0KKyAgL0NvbnRlbnRzIDcgMCBSCisgIC9Bbm5vdHMgWyA4IDAgUiA5IDAgUiAxMCAwIFIgXQorPj4KK2VuZG9iagorNCAwIG9iagorPDwgL0ZvbnQgNSAwIFIgPj4KK2VuZG9iagorNSAwIG9iagorPDwgL0YxIDYgMCBSID4+CitlbmRvYmoKKzYgMCBvYmoKKzw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL0hlbHZldGljYQorPj4KK2VuZG9iagorNyAwIG9iagorPDwgL0xlbmd0aCA1MSA+Pgorc3RyZWFtCitCVAorMCAwIDAgcmcKKy9GMSAxMiBUZgorMTAwIDE1MCBUZAorKFRlc3QgRm9ybSkgVGoKK0VUCitlbmRzdHJlYW0KK2VuZG9iagorOCAwIG9iagorPDwKKyAgL1R5cGUgL0Fubm90CisgIC9GVCAvQ2gKKyAgL0ZmIDM5MzIxNgorICAvVCAoQ29tYm9fRWRpdGFibGUpCisgIC9EQSAoMCAwIDAgcmcgL0YxIDEyIFRmKQorICAvUmVjdCBbIDEwMCA1MCAyMDAgODAgXQorICAvU3VidHlwZSAvV2lkZ2V0CisgIC9PcHQgW1soZm9vKSAoRm9vKV0gWyhiYXIpIChCYXIpXSBbKHF1eCkgKFF1eCldXQorPj4KK2VuZG9iagorOSAwIG9iagorPDwKKyAgL1R5cGUgL0Fubm90CisgIC9GVCAvQ2gKKyAgL0ZmIDEzMTA3MgorICAvVCAoQ29tYm8xKQorICAvREEgKDAgMCAwIHJnIC9GMSAxMiBUZikKKyAgL1JlY3QgWyAxMDAgMTAwIDIwMCAxMzAgXQorICAvU3VidHlwZSAvV2lkZ2V0CisgIC9PcHQgWyhBcHBsZSkgKEJhbmFuYSkgKENoZXJyeSldCisgIC9WIChCYW5hbmEpCis+PgorZW5kb2JqCisxMCAwIG9iagorPDwKKyAgL1R5cGUgL0Fubm90CisgIC9GVCAvQ2gKKyAgL0ZmIDEzMTA3MworICAvVCAoQ29tYm9fUmVhZE9ubHkpCisgIC9EQSAoMCAwIDAgcmcgL0YxIDEyIFRmKQorICAvUmVjdCBbIDEwMCAyMDAgMjAwIDIzMCBdCisgIC9TdWJ0eXBlIC9XaWRnZXQKKyAgL09wdCBbKERvZykgKEVsZXBoYW50KSAoRnJvZyldCis+PgorZW5kb2JqCit4cmVmCiswIDExCiswMDAwMDAwMDAwIDY1NTM1IGYgCiswMDAwMDAwMDE1IDAwMDAwIG4gCiswMDAwMDAwMTI3IDAwMDAwIG4gCiswMDAwMDAwMTg2IDAwMDAwIG4gCiswMDAwMDAwMzM1IDAwMDAwIG4gCiswMDAwMDAwMzY4IDAwMDAwIG4gCiswMDAwMDAwMzk5IDAwMDAwIG4gCiswMDAwMDAwNDc1IDAwMDAwIG4gCiswMDAwMDAwNTc1IDAwMDAwIG4gCiswMDAwMDAwNzc5IDAwMDAwIG4gCiswMDAwMDAwOTc1IDAwMDAwIG4gCit0cmFpbGVyPDwgL1Jvb3QgMSAwIFIgL1NpemUgMTEgPj4KK3N0YXJ0eHJlZgorMTE2NAorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2NvbnRyb2xfY2hhcmFjdGVycy5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2NvbnRyb2xfY2hhcmFjdGVycy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTc4MjdmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvY29udHJvbF9jaGFyYWN0ZXJzLmluCkBAIC0wLDAgKzEsNTQgQEAKK3t7aGVhZGVyfX0KK3t7b2JqZWN0IDEgMH19IDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorPj4KK2VuZG9iagore3tvYmplY3QgMiAwfX0gPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9NZWRpYUJveCBbIDAgMCAyMDAgMjAwIF0KKyAgL0NvdW50IDEKKyAgL0tpZHMgWyAzIDAgUiBdCis+PgorZW5kb2JqCit7e29iamVjdCAzIDB9fSA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvRm9udCA8PAorICAgICAgL0YxIDQgMCBSCisgICAgICAvRjIgNSAwIFIKKyAgICA+PgorICA+PgorICAvQ29udGVudHMgNiAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDQgMH19IDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL1RpbWVzLVJvbWFuCis+PgorZW5kb2JqCit7e29iamVjdCA1IDB9fSA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9IZWx2ZXRpY2EKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDYgMH19IDw8Cis+Pgorc3RyZWFtCitCVAorMjAgNTAgVGQKKy9GMSAxMiBUZgorKEhlbGxvXDJcMywgd29ybGQhKSBUagorMCA1MCBUZAorL0YyIDE2IFRmCisoR29vZGJ5ZSwgd29ybGQhKSBUagorRVQKK2VuZHN0cmVhbQorZW5kb2JqCit7e3hyZWZ9fQore3t0cmFpbGVyfX0KK3t7c3RhcnR4cmVmfX0KKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9jb250cm9sX2NoYXJhY3RlcnMucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMvY29udHJvbF9jaGFyYWN0ZXJzLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzUwMDk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvY29udHJvbF9jaGFyYWN0ZXJzLnBkZgpAQCAtMCwwICsxLDY0IEBACislUERGLTEuNworJaDypPQKKzEgMCBvYmogPDwKKyAgL1R5cGUgL0NhdGFsb2cKKyAgL1BhZ2VzIDIgMCBSCis+PgorZW5kb2JqCisyIDAgb2JqIDw8CisgIC9UeXBlIC9QYWdlcworICAvTWVkaWFCb3ggWyAwIDAgMjAwIDIwMCBdCisgIC9Db3VudCAxCisgIC9LaWRzIFsgMyAwIFIgXQorPj4KK2VuZG9iagorMyAwIG9iaiA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvRm9udCA8PAorICAgICAgL0YxIDQgMCBSCisgICAgICAvRjIgNSAwIFIKKyAgICA+PgorICA+PgorICAvQ29udGVudHMgNiAwIFIKKz4+CitlbmRvYmoKKzQgMCBvYmogPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvVGltZXMtUm9tYW4KKz4+CitlbmRvYmoKKzUgMCBvYmogPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvSGVsdmV0aWNhCis+PgorZW5kb2JqCis2IDAgb2JqIDw8Cis+Pgorc3RyZWFtCitCVAorMjAgNTAgVGQKKy9GMSAxMiBUZgorKEhlbGxvXDJcMywgd29ybGQhKSBUagorMCA1MCBUZAorL0YyIDE2IFRmCisoR29vZGJ5ZSwgd29ybGQhKSBUagorRVQKK2VuZHN0cmVhbQorZW5kb2JqCit4cmVmCiswIDcKKzAwMDAwMDAwMDAgNjU1MzUgZiAKKzAwMDAwMDAwMTUgMDAwMDAgbiAKKzAwMDAwMDAwNjggMDAwMDAgbiAKKzAwMDAwMDAxNjEgMDAwMDAgbiAKKzAwMDAwMDAzMDMgMDAwMDAgbiAKKzAwMDAwMDAzODEgMDAwMDAgbiAKKzAwMDAwMDA0NTcgMDAwMDAgbiAKK3RyYWlsZXI8PCAvUm9vdCAxIDAgUiAvU2l6ZSA3ID4+CitzdGFydHhyZWYKKzU4MgorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2VtYmVkZGVkX2F0dGFjaG1lbnRzLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2VtYmVkZGVkX2F0dGFjaG1lbnRzLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZThmZWNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvZW1iZWRkZWRfYXR0YWNobWVudHMucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2VtYmVkZGVkX2ltYWdlcy5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy9lbWJlZGRlZF9pbWFnZXMucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYWRiZWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9lbWJlZGRlZF9pbWFnZXMucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2hlbGxvX3dvcmxkLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvaGVsbG9fd29ybGQuaW4KaW5kZXggMTlmY2UwYy4uZDNjZjI2NSAxMDA2NDQKLS0tIGEvdGVzdGluZy9yZXNvdXJjZXMvaGVsbG9fd29ybGQuaW4KKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvaGVsbG9fd29ybGQuaW4KQEAgLTMsNiArMyw3IEBACiAgIC9UeXBlIC9DYXRhbG9nCiAgIC9QYWdlcyAyIDAgUgogPj4KK2VuZG9iagoge3tvYmplY3QgMiAwfX0gPDwKICAgL1R5cGUgL1BhZ2VzCiAgIC9NZWRpYUJveCBbIDAgMCAyMDAgMjAwIF0KQEAgLTQ4LDkgKzQ5LDYgQEAKIGVuZHN0cmVhbQogZW5kb2JqCiB7e3hyZWZ9fQotdHJhaWxlciA8PAotICAvU2l6ZSA2Ci0gIC9Sb290IDEgMCBSCi0+Pgore3t0cmFpbGVyfX0KIHt7c3RhcnR4cmVmfX0KICUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9oZWxsb193b3JsZC5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy9oZWxsb193b3JsZC5wZGYKaW5kZXggYmI0ZjBhOC4uZGNkZThmNyAxMDA2NDQKLS0tIGEvdGVzdGluZy9yZXNvdXJjZXMvaGVsbG9fd29ybGQucGRmCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2hlbGxvX3dvcmxkLnBkZgpAQCAtNCw2ICs0LDcgQEAKICAgL1R5cGUgL0NhdGFsb2cKICAgL1BhZ2VzIDIgMCBSCiA+PgorZW5kb2JqCiAyIDAgb2JqIDw8CiAgIC9UeXBlIC9QYWdlcwogICAvTWVkaWFCb3ggWyAwIDAgMjAwIDIwMCBdCkBAIC01MiwxNSArNTMsMTIgQEAKIDAgNwogMDAwMDAwMDAwMCA2NTUzNSBmIAogMDAwMDAwMDAxNSAwMDAwMCBuIAotMDAwMDAwMDA2MSAwMDAwMCBuIAotMDAwMDAwMDE1NCAwMDAwMCBuIAotMDAwMDAwMDI5NiAwMDAwMCBuIAotMDAwMDAwMDM3NCAwMDAwMCBuIAotMDAwMDAwMDQ1MCAwMDAwMCBuIAotdHJhaWxlciA8PAotICAvU2l6ZSA2Ci0gIC9Sb290IDEgMCBSCi0+PgorMDAwMDAwMDA2OCAwMDAwMCBuIAorMDAwMDAwMDE2MSAwMDAwMCBuIAorMDAwMDAwMDMwMyAwMDAwMCBuIAorMDAwMDAwMDM4MSAwMDAwMCBuIAorMDAwMDAwMDQ1NyAwMDAwMCBuIAordHJhaWxlcjw8IC9Sb290IDEgMCBSIC9TaXplIDcgPj4KIHN0YXJ0eHJlZgotNTcxCis1NzgKICUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2FycmF5X2J1ZmZlci5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvYXJyYXlfYnVmZmVyLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmM2UzMmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2FycmF5X2J1ZmZlci5pbgpAQCAtMCwwICsxLDY4IEBACit7e2hlYWRlcn19Cit7e29iamVjdCAxIDB9fSA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKyAgL09wZW5BY3Rpb24gMTAgMCBSCis+PgorZW5kb2JqCit7e29iamVjdCAyIDB9fSA8PAorICAvVHlwZSAvUGFnZXMKKyAgL0NvdW50IDEKKyAgL0tpZHMgWworICAgIDMgMCBSCisgIF0KKz4+CitlbmRvYmoKKyUgUGFnZSBudW1iZXIgMC4KK3t7b2JqZWN0IDMgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA8PAorICAgIC9Gb250IDw8L0YxIDE1IDAgUj4+CisgID4+CisgIC9Db250ZW50cyBbMjEgMCBSXQorICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQorPj4KKyUgT3BlbkFjdGlvbiBhY3Rpb24KK3t7b2JqZWN0IDEwIDB9fSA8PAorICAvVHlwZSAvQWN0aW9uCisgIC9TIC9KYXZhU2NyaXB0CisgIC9KUyAxMSAwIFIKKz4+CitlbmRvYmoKKyUgSlMgcHJvZ3JhbSB0byBleGV4dXRlCit7e29iamVjdCAxMSAwfX0gPDwKKz4+CitzdHJlYW0KK2FwcC5hbGVydCgiVGhpcyB0ZXN0IGF0dGVtcHRzIHRvIG1ha2UgYXJyYXkgYnVmZmVycyB1bnRpbCBleGhhdXN0ZWQiKTsKKworZnVuY3Rpb24gdGVzdChzaXplKSB7CisgIHZhciBpLCBhYiwgaWE7CisgIGFwcC5hbGVydCgiVHJ5aW5nIHNpemUgIiArIHNpemUpOworICBhYiA9IG5ldyBBcnJheUJ1ZmZlcihzaXplKTsKKyAgaWEgPSBuZXcgSW50MzJBcnJheShhYik7CisgIGZvciAoaSA9IDA7IGkgPCBzaXplIC8gNDsgKytpKSB7CisgICAgaWFbaV0gPSBpOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBzaXplIC8gNDsgKytpKSB7CisgICAgaWYgKGlhW2ldICE9IGkpIHsKKyAgICAgIHRocm93KCdhYWFhYWFhaCcpOworICAgIH0KKyAgfQorfQorCit0cnkgeworICB0ZXN0KDEwMDApOworICB0ZXN0KDIwMDAwMDApOworICB0ZXN0KDQwMDAwMDAwMDApOworfSBjYXRjaCAoZSkgeworICBhcHAuYWxlcnQoIkNhdWdodCBlcnJvciAiICsgZSk7Cit9CitlbmRzdHJlYW0KK2VuZG9iagore3t4cmVmfX0KK3RyYWlsZXIgPDwKKyAgL1Jvb3QgMSAwIFIKKz4+Cit7e3N0YXJ0eHJlZn19CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9hcnJheV9idWZmZXJfZXhwZWN0ZWQudHh0IGIvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9hcnJheV9idWZmZXJfZXhwZWN0ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZjNiZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2FycmF5X2J1ZmZlcl9leHBlY3RlZC50eHQKQEAgLTAsMCArMSw1IEBACitBbGVydDogVGhpcyB0ZXN0IGF0dGVtcHRzIHRvIG1ha2UgYXJyYXkgYnVmZmVycyB1bnRpbCBleGhhdXN0ZWQKK0FsZXJ0OiBUcnlpbmcgc2l6ZSAxMDAwCitBbGVydDogVHJ5aW5nIHNpemUgMjAwMDAwMAorQWxlcnQ6IFRyeWluZyBzaXplIDQwMDAwMDAwMDAKK0FsZXJ0OiBDYXVnaHQgZXJyb3IgUmFuZ2VFcnJvcjogQXJyYXkgYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2J1Z183MzU5MTIuaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L2J1Z183MzU5MTIuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y0MmQxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvYnVnXzczNTkxMi5pbgpAQCAtMCwwICsxLDExNSBAQAore3toZWFkZXJ9fQore3tvYmplY3QgMSAwfX0gPDwKKyAgL1R5cGUgL0NhdGFsb2cKKyAgL1BhZ2VzIDIgMCBSCisgIC9BY3JvRm9ybSA0IDAgUgorICAvT3BlbkFjdGlvbiAzMCAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDIgMH19IDw8CisgIC9UeXBlIC9QYWdlcworICAvQ291bnQgMQorICAvS2lkcyBbCisgICAgMyAwIFIKKyAgXQorPj4KK2VuZG9iagorJSBQYWdlIG51bWJlciAwLgore3tvYmplY3QgMyAwfX0gPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvQW5ub3RzIFsKKyAgICA4IDAgUgorICAgIF0KKyAgL0FBIDw8IC9DIDM2IDAgUiA+PgorPj4KK2VuZG9iagorJSBGb3Jtcwore3tvYmplY3QgNCAwfX0gPDwKKyAgL1hGQSBbCisgICAgKHhkcDp4ZHApIDQzIDAgUgorICAgIChmb3JtKSA0OSAwIFIKKyAgICAoPC94ZHA6eGRwPikgNTAgMCBSCisgIF0KKyAgL0ZpZWxkcyBbCisgICAgOCAwIFIKKyAgICBdCis+PgorZW5kb2JqCislIEZpZWxkcwore3tvYmplY3QgOCAwfX0gPDwKKyAgL0ZUIC9UeAorICAvVCAoTXlGaWVsZCkKKyAgL1R5cGUgL0Fubm90CisgIC9TdWJ0eXBlIC9XaWRnZXQKKyAgL1JlY3QgWzEwMCAzMDAgNTAwIDQwMF0KKyAgL0FBIDw8IC9CbCAzNCAwIFIgPj4KKz4+CitlbmRvYmoKKyUgSlMgQWN0aW9uCit7e29iamVjdCAzMCAwfX0gPDwKKyAgL1R5cGUgL0FjdGlvbgorICAvUyAvSmF2YVNjcmlwdAorICAvSlMgMzEgMCBSCis+PgorZW5kb2JqCislIEpTIHByb2dyYW0gdG8gZXhleHV0ZQore3tvYmplY3QgMzEgMH19IDw8Cis+Pgorc3RyZWFtCit0aGlzLmdldEZpZWxkKCJNeUZpZWxkIikuc2V0Rm9jdXMoKTsKK2FwcC5hbGVydCgiZm9jdXNlZCIpOworZW5kc3RyZWFtCitlbmRvYmoKKyUgTG9zdCBGb2N1cyBBQWN0aW9uIE15RmllbGQKK3t7b2JqZWN0IDM0IDB9fSA8PAorICAvVHlwZSAvQWN0aW9uCisgIC9TIC9KYXZhU2NyaXB0CisgIC9KUyAzNSAwIFIKKz4+CitlbmRvYmoKKyUgSlMgcHJvZ3JhbSB0byBleGV4dXRlCit7e29iamVjdCAzNSAwfX0gPDwKKz4+CitzdHJlYW0KK3RoaXMucmVtb3ZlRmllbGQoIk15RmllbGQiKTsKK2FwcC5hbGVydCgicmVtb3ZlZCIpOworZW5kc3RyZWFtCitlbmRvYmoKKyUgQ2xvc2luZyBQYWdlIDAKK3t7b2JqZWN0IDM2IDB9fSA8PAorICAvVHlwZSAvQWN0aW9uCisgIC9TIC9KYXZhU2NyaXB0CisgIC9KUyAzNyAwIFIKKz4+CitlbmRvYmoKKyUgSlMgcHJvZ3JhbSB0byBleGV4dXRlCit7e29iamVjdCAzNyAwfX0gPDwKKz4+CitzdHJlYW0KK3RoaXMucmVtb3ZlRmllbGQoIk15RmllbGQiKTsKK2VuZHN0cmVhbQorZW5kb2JqCit7e29iamVjdCA0MyAwfX0gPDwKKz4+c3RyZWFtCis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHhkcDp4ZHAgeG1sbnM6eGRwPSJodHRwOi8vbnMuYWRvYmUuY29tL3hkcC8iPgorZW5kc3RyZWFtCitlbmRvYmoKK3t7b2JqZWN0IDQ5IDB9fSA8PAorPj5zdHJlYW0KKzxjb25maWc+PC9jb25maWc+Cis8dGVtcGxhdGU+PC90ZW1wbGF0ZT4KK2VuZHN0cmVhbQorZW5kb2JqCit7e29iamVjdCA1MCAwfX0gPDwKKz4+c3RyZWFtCis8L3hkcDp4ZHA+CitlbmRzdHJlYW0KK2VuZG9iagore3t4cmVmfX0KK3RyYWlsZXIgPDwKKyAgL1Jvb3QgMSAwIFIKKz4+Cit7e3N0YXJ0eHJlZn19CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9idWdfNzM1OTEyX2V4cGVjdGVkLnR4dCBiL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvYnVnXzczNTkxMl9leHBlY3RlZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QwZjQyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvYnVnXzczNTkxMl9leHBlY3RlZC50eHQKQEAgLTAsMCArMSwyIEBACitBbGVydDogcmVtb3ZlZAorQWxlcnQ6IGZvY3VzZWQKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvYnVnXzc0MDE2Ni5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvYnVnXzc0MDE2Ni5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTJlYjkxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9idWdfNzQwMTY2LmluCkBAIC0wLDAgKzEsNjEgQEAKK3t7aGVhZGVyfX0KK3t7b2JqZWN0IDEgMH19IDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorICAvQWNyb0Zvcm0gNCAwIFIKKyAgL09wZW5BY3Rpb24gMTAgMCBSCis+PgorZW5kb2JqCit7e29iamVjdCAyIDB9fSA8PAorICAvVHlwZSAvUGFnZXMKKyAgL0NvdW50IDEKKyAgL0tpZHMgWworICAgIDMgMCBSCisgIF0KKz4+CitlbmRvYmoKKyUgUGFnZSBudW1iZXIgMC4KK3t7b2JqZWN0IDMgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA8PAorICAgIC9Gb250IDw8L0YxIDE1IDAgUj4+CisgID4+CisgIC9Db250ZW50cyBbMjEgMCBSXQorICAvTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQorPj4KKyUgRm9ybXMKK3t7b2JqZWN0IDQgMH19IDw8CisgIC9GaWVsZHMgWzUgMCBSXQorPj4KKyUgRmllbGQKK3t7b2JqZWN0IDUgMH19IDw8CisgL0ZUIC9UeAorIC9UIChNeUZpZWxkKQorIC9UeXBlIC9Bbm5vdAorIC9TdWJ0eXBlIC9XaWRnZXQKKyAvUmVjdCBbMTAwIDIwMCAxNTAgMjUwXQorPj4KKyUgT3BlbkFjdGlvbiBhY3Rpb24KK3t7b2JqZWN0IDEwIDB9fSA8PAorICAvVHlwZSAvQWN0aW9uCisgIC9TIC9KYXZhU2NyaXB0CisgIC9KUyAxMSAwIFIKKz4+CitlbmRvYmoKKyUgSlMgcHJvZ3JhbSB0byBleGV4dXRlCit7e29iamVjdCAxMSAwfX0gPDwKKz4+CitzdHJlYW0KK2FwcC5hbGVydCh1dGlsLnByaW50ZigiVmFsdWVzID0gJTAuMXggLjk5OTkgJXgiLCAxLCAyKSk7CithcHAuYWxlcnQodXRpbC5wcmludGYoIlZhbHVlcyA9ICUwLjEweCAuOTk5OSAleCIsIDEsIDIpKTsKK2FwcC5hbGVydCh1dGlsLnByaW50ZigiVmFsdWVzID0gJTAuMTAweCAuOTk5OSAleCIsIDEsIDIpKTsKK2FwcC5hbGVydCh1dGlsLnByaW50ZigiVmFsdWVzID0gJTAuMTAwMHggLjk5OTkgJXgiLCAxLCAyKSk7CitlbmRzdHJlYW0KK2VuZG9iagore3t4cmVmfX0KK3RyYWlsZXIgPDwKKyAgL1Jvb3QgMSAwIFIKKz4+Cit7e3N0YXJ0eHJlZn19CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9idWdfNzQwMTY2X2V4cGVjdGVkLnR4dCBiL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvYnVnXzc0MDE2Nl9leHBlY3RlZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNlY2UzYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvYnVnXzc0MDE2Nl9leHBlY3RlZC50eHQKQEAgLTAsMCArMSw0IEBACitBbGVydDogVmFsdWVzID0gMSAuOTk5OSAyCitBbGVydDogVmFsdWVzID0gMDAwMDAwMDAwMSAuOTk5OSAyCitBbGVydDogVmFsdWVzID0gJTAuMTAweCAuOTk5OSAyCitBbGVydDogVmFsdWVzID0gJTAuMTAwMHggLjk5OTkgMgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9tb3VzZV9ldmVudHMuZXZ0IGIvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9tb3VzZV9ldmVudHMuZXZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MTA1MDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L21vdXNlX2V2ZW50cy5ldnQKQEAgLTAsMCArMSwxOSBAQAorIyBNb3VzZSBpbiwgbW91c2Ugb3V0LgorbW91c2Vtb3ZlLDEyNSwyMjUKK21vdXNlbW92ZSwxMjUsMTAwCisjIE1vdXNlIGluLCBjbGljayBpbiBmaWVsZC4KK21vdXNlbW92ZSwxMjUsMjI1Cittb3VzZWRvd24sbGVmdCwxMjUsMjI1Cittb3VzZXVwLGxlZnQsMTI1LDIyNQorIyBNb3VzZSBvdXQsIGNsaWNrIGVsc2V3aGVyZS4KKyMgVGhpcyBzaG91bGQgdHJpZ2dlciBhbiBPbiBCbHVyIGV2ZW50LiAoQnVnIDg4MSkKK21vdXNlbW92ZSwxMjUsMTAwCittb3VzZWRvd24sbGVmdCwxMjUsMTAwCittb3VzZXVwLGxlZnQsMTI1LDEwMAorIyBNb3VzZSBpbiwgZm9jdXMuCittb3VzZW1vdmUsMTI1LDIyNQorZm9jdXMsMTI1LDIyNQorIyBNb3VzZSBvdXQsIHVuZm9jdXMuCisjIFRoaXMgc2hvdWxkIHRyaWdnZXIgYW4gT24gQmx1ciBldmVudC4gKEJ1ZyA4ODEpCittb3VzZW1vdmUsMTI1LDEwMAorZm9jdXMsMTI1LDEwMApkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9tb3VzZV9ldmVudHMuaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L21vdXNlX2V2ZW50cy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzIxNjJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9tb3VzZV9ldmVudHMuaW4KQEAgLTAsMCArMSw5MiBAQAore3toZWFkZXJ9fQore3tvYmplY3QgMSAwfX0gPDwKKyAgL1R5cGUgL0NhdGFsb2cKKyAgL1BhZ2VzIDIgMCBSCisgIC9BY3JvRm9ybSA0IDAgUgorPj4KK2VuZG9iagore3tvYmplY3QgMiAwfX0gPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9Db3VudCAxCisgIC9LaWRzIFsKKyAgICAzIDAgUgorICBdCis+PgorZW5kb2JqCislIFBhZ2UgbnVtYmVyIDAuCit7e29iamVjdCAzIDB9fSA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvRm9udCA8PC9GMSAyMCAwIFI+PgorICA+PgorICAvQW5ub3RzIFsgNSAwIFIgXQorICAvQ29udGVudHMgWzIxIDAgUl0KKyAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KKz4+CislIEZvcm1zCit7e29iamVjdCA0IDB9fSA8PAorICAvRmllbGRzIFs1IDAgUl0KKz4+CislIEZpZWxkIHdpdGggYWN0aW9uczoKKyUgQ3Vyc29yIGVudGVyOiBFCislIEN1cnNvciBleGl0OiBYCislIE1vdXNlIGRvd246IEQKKyUgTW91c2UgdXA6IFUKKyUgRm9jdXM6IEZvCislIEJsdXI6IEJsCit7e29iamVjdCA1IDB9fSA8PAorIC9GVCAvVHgKKyAvVCAoTXlGaWVsZCkKKyAvVHlwZSAvQW5ub3QKKyAvU3VidHlwZSAvV2lkZ2V0CisgL1JlY3QgWzEwMCAyMDAgMTUwIDI1MF0KKyAvQUEgPDwKKyAgIC9FIDEwIDAgUgorICAgL1ggMTEgMCBSCisgICAvRCAxMiAwIFIKKyAgIC9VIDEzIDAgUgorICAgL0ZvIDE0IDAgUgorICAgL0JsIDE1IDAgUgorID4+Cis+Pgore3tvYmplY3QgMTAgMH19IDw8CisgIC9UeXBlIC9BY3Rpb24KKyAgL1MgL0phdmFTY3JpcHQKKyAgL0pTIChhcHAuYWxlcnRcKCJlbnRlciJcKTspCis+PgorZW5kb2JqCit7e29iamVjdCAxMSAwfX0gPDwKKyAgL1R5cGUgL0FjdGlvbgorICAvUyAvSmF2YVNjcmlwdAorICAvSlMgKGFwcC5hbGVydFwoImV4aXQiXCk7KQorPj4KK2VuZG9iagore3tvYmplY3QgMTIgMH19IDw8CisgIC9UeXBlIC9BY3Rpb24KKyAgL1MgL0phdmFTY3JpcHQKKyAgL0pTIChhcHAuYWxlcnRcKCJkb3duIlwpOykKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDEzIDB9fSA8PAorICAvVHlwZSAvQWN0aW9uCisgIC9TIC9KYXZhU2NyaXB0CisgIC9KUyAoYXBwLmFsZXJ0XCgidXAiXCk7KQorPj4KK2VuZG9iagore3tvYmplY3QgMTQgMH19IDw8CisgIC9UeXBlIC9BY3Rpb24KKyAgL1MgL0phdmFTY3JpcHQKKyAgL0pTIChhcHAuYWxlcnRcKCJmb2N1cyJcKTspCis+PgorZW5kb2JqCit7e29iamVjdCAxNSAwfX0gPDwKKyAgL1R5cGUgL0FjdGlvbgorICAvUyAvSmF2YVNjcmlwdAorICAvSlMgKGFwcC5hbGVydFwoImJsdXIiXCk7KQorPj4KK2VuZG9iagore3t4cmVmfX0KK3t7dHJhaWxlcn19Cit7e3N0YXJ0eHJlZn19CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9tb3VzZV9ldmVudHNfZXhwZWN0ZWQudHh0IGIvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC9tb3VzZV9ldmVudHNfZXhwZWN0ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOWI4YjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L21vdXNlX2V2ZW50c19leHBlY3RlZC50eHQKQEAgLTAsMCArMSwxMCBAQAorQWxlcnQ6IGVudGVyCitBbGVydDogZXhpdAorQWxlcnQ6IGVudGVyCitBbGVydDogZG93bgorQWxlcnQ6IGZvY3VzCitBbGVydDogdXAKK0FsZXJ0OiBleGl0CitBbGVydDogZW50ZXIKK0FsZXJ0OiBmb2N1cworQWxlcnQ6IGV4aXQKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvdXRpbF9wcmludGQuaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L3V0aWxfcHJpbnRkLmluCmluZGV4IGYwOTgxODcuLjRkODYxMGQgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvcmVzb3VyY2VzL2phdmFzY3JpcHQvdXRpbF9wcmludGQuaW4KKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC91dGlsX3ByaW50ZC5pbgpAQCAtOTQsNiArOTQsMzggQEAKIFRlc3RPbmVGb3JtYXQoWyJjbGFtcyIsIDNdLCBkMSk7CiBUZXN0T25lWEZBRm9ybWF0KCJtbSIsIGQxLCBmYWxzZSk7CiBUZXN0T25lWEZBRm9ybWF0KCJtbSIsIGQxLCB0cnVlKTsKKworLy8gRGF0ZSB3aXRoIHllYXIgMC4KKy8vIFRPRE8odGhlc3RpZyk6IFdoeSBpcyB0aGUgb3V0cHV0IGRpZmZlcmVudCBmcm9tIEFjcm9iYXQ/CitUZXN0T25lRm9ybWF0KCJtbS9kZC95eXl5IEhIOk1NOnNzIiwgbmV3IERhdGUoMCwgMDYsIDA0LCAxNSwgNTksIDU4KSk7CisvLyBEYXRlIHdpdGggbW9udGggMjAuCitUZXN0T25lRm9ybWF0KCJtbS9kZC95eXl5IEhIOk1NOnNzIiwgbmV3IERhdGUoMjAxNCwgMjAsIDA0LCAxNSwgNTksIDU4KSk7CisvLyBEYXRlIHdpdGggZGF5IDEwMC4KK1Rlc3RPbmVGb3JtYXQoIm1tL2RkL3l5eXkgSEg6TU06c3MiLCBuZXcgRGF0ZSgyMDE0LCAyMCwgMTAwLCAxNSwgNTksIDU4KSk7CisvLyBEYXRlIHdpdGggaG91ciA1MAorVGVzdE9uZUZvcm1hdCgibW0vZGQveXl5eSBISDpNTTpzcyIsIG5ldyBEYXRlKDIwMTQsIDA2LCAwNCwgNTAsIDU5LCA1OCkpOworLy8gRGF0ZSB3aXRoIG1pbnV0ZSAxMjM0LgorVGVzdE9uZUZvcm1hdCgibW0vZGQveXl5eSBISDpNTTpzcyIsIG5ldyBEYXRlKDIwMTQsIDA2LCAwNCwgMTUsIDEyMzQsIDU4KSk7CisvLyBEYXRlIHdpdGggc2Vjb25kIDY1LgorVGVzdE9uZUZvcm1hdCgibW0vZGQveXl5eSBISDpNTTpzcyIsIG5ldyBEYXRlKDIwMTQsIDA2LCAwNCwgMTUsIDU5LCA2NSkpOworLy8gRGF0ZSB3aXRoIEFwcmlsIDMxdGguCitUZXN0T25lRm9ybWF0KCJtbS9kZC95eXl5IEhIOk1NOnNzIiwgbmV3IERhdGUoMjAxNCwgMDMsIDMxLCAxNSwgNTksIDU4KSk7CisvLyBEYXRlIHdpdGggRmVicnVhcnkgMzB0aC4KK1Rlc3RPbmVGb3JtYXQoIm1tL2RkL3l5eXkgSEg6TU06c3MiLCBuZXcgRGF0ZSgyMDE0LCAwMSwgMzAsIDE1LCA1OSwgNTgpKTsKKy8vIERhdGUgd2l0aCBuZWdhdGl2ZSB5ZWFyLgorLy8gQWNyb2JhdCBwcmludHMgb3V0ICIwNy8wNC8tMDAxIDE1OjU5OjU4IiBidXQgaGFuZGxpbmcgdGhpcyByYXJlbHkgdXNlZCBjYXNlCisvLyBvdXRzaWRlIG9mIEZYU1lTX3djc2Z0aW1lKCkgaXMgYSBsb3Qgb2Ygd29yay4KK1Rlc3RPbmVGb3JtYXQoIm1tL2RkL3l5eXkgSEg6TU06c3MiLCBuZXcgRGF0ZSgtMSwgMDYsIDA0LCAxNSwgNTksIDU4KSk7CisvLyBEYXRlIHdpdGggbmVnYXRpdmUgbW9udGguCitUZXN0T25lRm9ybWF0KCJtbS9kZC95eXl5IEhIOk1NOnNzIiwgbmV3IERhdGUoMjAxNCwgLTEsIDMwLCAxNSwgNTksIDU4KSk7CisvLyBEYXRlIHdpdGggbmVnYXRpdmUgZGF5LgorVGVzdE9uZUZvcm1hdCgibW0vZGQveXl5eSBISDpNTTpzcyIsIG5ldyBEYXRlKDIwMTQsIDA2LCAtMSwgMTUsIDU5LCA1OCkpOworLy8gRGF0ZSB3aXRoIG5lZ2F0aXZlIGhvdXIuCitUZXN0T25lRm9ybWF0KCJtbS9kZC95eXl5IEhIOk1NOnNzIiwgbmV3IERhdGUoMjAxNCwgMDYsIDA0LCAtMSwgNTksIDU4KSk7CisvLyBEYXRlIHdpdGggbmVnYXRpdmUgbWludXRlLgorVGVzdE9uZUZvcm1hdCgibW0vZGQveXl5eSBISDpNTTpzcyIsIG5ldyBEYXRlKDIwMTQsIDA2LCAwNCwgMTUsIC0xLCA1OCkpOworLy8gRGF0ZSB3aXRoIG5lZ2F0aXZlIHNlY29uZC4KK1Rlc3RPbmVGb3JtYXQoIm1tL2RkL3l5eXkgSEg6TU06c3MiLCBuZXcgRGF0ZSgyMDE0LCAwNiwgMDQsIDE1LCA1OSwgLTEpKTsKIGVuZHN0cmVhbQogZW5kb2JqCiB7e3hyZWZ9fQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvamF2YXNjcmlwdC91dGlsX3ByaW50ZF9leHBlY3RlZC50eHQgYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L3V0aWxfcHJpbnRkX2V4cGVjdGVkLnR4dAppbmRleCA0N2FiYjJmLi43NmVkZTcxIDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L3V0aWxfcHJpbnRkX2V4cGVjdGVkLnR4dAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9qYXZhc2NyaXB0L3V0aWxfcHJpbnRkX2V4cGVjdGVkLnR4dApAQCAtMzgsMyArMzgsMTcgQEAKIEFsZXJ0OiBjbGFtcywzOiBDYXVnaHQgZXJyb3I6IHV0aWwucHJpbnRkOiBJbmNvcnJlY3QgcGFyYW1ldGVyIHR5cGUuCiBBbGVydDogbW06IDA3CiBBbGVydDogbW06IENhdWdodCBlcnJvcjogdXRpbC5wcmludGQ6IE9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkLgorQWxlcnQ6IG1tL2RkL3l5eXkgSEg6TU06c3M6IDA3LzAzLzE5MDAgMTQ6NTk6NTgKK0FsZXJ0OiBtbS9kZC95eXl5IEhIOk1NOnNzOiAwOS8wNC8yMDE1IDE1OjU5OjU4CitBbGVydDogbW0vZGQveXl5eSBISDpNTTpzczogMTIvMDkvMjAxNSAxNTo1OTo1OAorQWxlcnQ6IG1tL2RkL3l5eXkgSEg6TU06c3M6IDA3LzA2LzIwMTQgMDI6NTk6NTgKK0FsZXJ0OiBtbS9kZC95eXl5IEhIOk1NOnNzOiAwNy8wNS8yMDE0IDExOjM0OjU4CitBbGVydDogbW0vZGQveXl5eSBISDpNTTpzczogMDcvMDQvMjAxNCAxNjowMDowNQorQWxlcnQ6IG1tL2RkL3l5eXkgSEg6TU06c3M6IDA1LzAxLzIwMTQgMTU6NTk6NTgKK0FsZXJ0OiBtbS9kZC95eXl5IEhIOk1NOnNzOiAwMy8wMi8yMDE0IDE1OjU5OjU4CitBbGVydDogbW0vZGQveXl5eSBISDpNTTpzczogQ2F1Z2h0IGVycm9yOiB1dGlsLnByaW50ZDogSW5jb3JyZWN0IHBhcmFtZXRlciB2YWx1ZS4KK0FsZXJ0OiBtbS9kZC95eXl5IEhIOk1NOnNzOiAxMi8zMC8yMDEzIDE1OjU5OjU4CitBbGVydDogbW0vZGQveXl5eSBISDpNTTpzczogMDYvMjkvMjAxNCAxNTo1OTo1OAorQWxlcnQ6IG1tL2RkL3l5eXkgSEg6TU06c3M6IDA3LzAzLzIwMTQgMjM6NTk6NTgKK0FsZXJ0OiBtbS9kZC95eXl5IEhIOk1NOnNzOiAwNy8wNC8yMDE0IDE0OjU5OjU4CitBbGVydDogbW0vZGQveXl5eSBISDpNTTpzczogMDcvMDQvMjAxNCAxNTo1ODo1OQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvbGF1bmNoX2FjdGlvbi5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2xhdW5jaF9hY3Rpb24uaW4KaW5kZXggYzk4NTM5Zi4uMDA1NjllNCAxMDA2NDQKLS0tIGEvdGVzdGluZy9yZXNvdXJjZXMvbGF1bmNoX2FjdGlvbi5pbgorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9sYXVuY2hfYWN0aW9uLmluCkBAIC0zLDYgKzMsNyBAQAogICAvVHlwZSAvQ2F0YWxvZwogICAvUGFnZXMgMiAwIFIKID4+CitlbmRvYmoKIHt7b2JqZWN0IDIgMH19IDw8CiAgIC9UeXBlIC9QYWdlcwogICAvTWVkaWFCb3ggWyAwIDAgMjAwIDIwMCBdCkBAIC00MCwxNSArNDEsMTMgQEAKICAgL0YgNiAwIFIKICAgL1MgL0xhdW5jaAogPj4KK2VuZG9iagoge3tvYmplY3QgNiAwfX0gPDwKICAgL0YgKHRlc3QucGRmKQogICAvVHlwZSAvIEZpbGVzcGVjCiA+PgogZW5kb2JqCiB7e3hyZWZ9fQotdHJhaWxlciA8PAotICAvU2l6ZSA2Ci0gIC9Sb290IDEgMCBSCi0+Pgore3t0cmFpbGVyfX0KIHt7c3RhcnR4cmVmfX0KICUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9sYXVuY2hfYWN0aW9uLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL2xhdW5jaF9hY3Rpb24ucGRmCmluZGV4IDk5YTQyOTIuLjMyN2M4NjMgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvcmVzb3VyY2VzL2xhdW5jaF9hY3Rpb24ucGRmCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2xhdW5jaF9hY3Rpb24ucGRmCkBAIC00LDYgKzQsNyBAQAogICAvVHlwZSAvQ2F0YWxvZwogICAvUGFnZXMgMiAwIFIKID4+CitlbmRvYmoKIDIgMCBvYmogPDwKICAgL1R5cGUgL1BhZ2VzCiAgIC9NZWRpYUJveCBbIDAgMCAyMDAgMjAwIF0KQEAgLTQxLDYgKzQyLDcgQEAKICAgL0YgNiAwIFIKICAgL1MgL0xhdW5jaAogPj4KK2VuZG9iagogNiAwIG9iaiA8PAogICAvRiAodGVzdC5wZGYpCiAgIC9UeXBlIC8gRmlsZXNwZWMKQEAgLTUwLDE1ICs1MiwxMiBAQAogMCA3CiAwMDAwMDAwMDAwIDY1NTM1IGYgCiAwMDAwMDAwMDE1IDAwMDAwIG4gCi0wMDAwMDAwMDYxIDAwMDAwIG4gCi0wMDAwMDAwMTU0IDAwMDAwIG4gCi0wMDAwMDAwMjIzIDAwMDAwIG4gCi0wMDAwMDAwNDg5IDAwMDAwIG4gCi0wMDAwMDAwNTI3IDAwMDAwIG4gCi10cmFpbGVyIDw8Ci0gIC9TaXplIDYKLSAgL1Jvb3QgMSAwIFIKLT4+CiswMDAwMDAwMDY4IDAwMDAwIG4gCiswMDAwMDAwMTYxIDAwMDAwIG4gCiswMDAwMDAwMjMwIDAwMDAwIG4gCiswMDAwMDAwNDk2IDAwMDAwIG4gCiswMDAwMDAwNTQxIDAwMDAwIG4gCit0cmFpbGVyPDwgL1Jvb3QgMSAwIFIgL1NpemUgNyA+Pgogc3RhcnR4cmVmCi01ODMKKzU5NwogJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL2xpbmVhcml6ZWQucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMvbGluZWFyaXplZC5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyZDNhMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL2xpbmVhcml6ZWQucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL21hcmtlZF9jb250ZW50X2lkLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL21hcmtlZF9jb250ZW50X2lkLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGJmMTFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvbWFya2VkX2NvbnRlbnRfaWQucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL25hbWVkX2Rlc3RzLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvbmFtZWRfZGVzdHMuaW4KaW5kZXggNTMwOWVlMi4uYTk3YWViZSAxMDA2NDQKLS0tIGEvdGVzdGluZy9yZXNvdXJjZXMvbmFtZWRfZGVzdHMuaW4KKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvbmFtZWRfZGVzdHMuaW4KQEAgLTEwMSw5ICsxMDEsNiBAQAogZW5kc3RyZWFtCiBlbmRvYmoKIHt7eHJlZn19Ci10cmFpbGVyIDw8Ci0gIC9TaXplIDYKLSAgL1Jvb3QgMSAwIFIKLT4+Cit7e3RyYWlsZXJ9fQoge3tzdGFydHhyZWZ9fQogJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL25hbWVkX2Rlc3RzLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL25hbWVkX2Rlc3RzLnBkZgppbmRleCAyZTBlNWNlLi5iOTljZWFkIDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy9uYW1lZF9kZXN0cy5wZGYKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvbmFtZWRfZGVzdHMucGRmCkBAIC0xMjYsMTAgKzEyNiw3IEBACiAwMDAwMDAwMDAwIDY1NTM1IGYgCiAwMDAwMDAxMjgzIDAwMDAwIG4gCiAwMDAwMDAxMzkzIDAwMDAwIG4gCi10cmFpbGVyIDw8Ci0gIC9TaXplIDYKLSAgL1Jvb3QgMSAwIFIKLT4+Cit0cmFpbGVyPDwgL1Jvb3QgMSAwIFIgL1NpemUgMjMgPj4KIHN0YXJ0eHJlZgogMTQ4MQogJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z18xMTM5MTAuZXZ0IGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzExMzkxMC5ldnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E4ODIxZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z18xMTM5MTAuZXZ0CkBAIC0wLDAgKzEsOCBAQAorbW91c2Vtb3ZlLDE1MCwxMjAKK21vdXNlZG93bixsZWZ0LDE1MCwxMjAKK21vdXNldXAsbGVmdCwxNTAsMTIwCitjaGFyY29kZSw0OQorY2hhcmNvZGUsNTAKK2NoYXJjb2RlLDUxCitjaGFyY29kZSw1MgorY2hhcmNvZGUsMTMKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z18xMTM5MTAuaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfMTEzOTEwLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZmNjNTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfMTEzOTEwLmluCkBAIC0wLDAgKzEsNjYgQEAKK3t7aGVhZGVyfX0KK3t7b2JqZWN0IDEgMH19Cis8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKyAgL0Fjcm9Gb3JtIDw8IC9GaWVsZHMgWyA0IDAgUiAxMCAwIFIgXSAvRFIgNSAwIFIgPj4KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDIgMH19Cis8PCAvQ291bnQgMSAvS2lkcyBbIDMgMCBSIF0gL1R5cGUgL1BhZ2VzID4+CitlbmRvYmoKK3t7b2JqZWN0IDMgMH19Cis8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgNSAwIFIKKyAgL01lZGlhQm94IFsgMCAwIDMwMCAyMDAgXQorICAvQ29udGVudHMgOCAwIFIKKyAgL0Fubm90cyBbIDQgMCBSIDEwIDAgUiBdCis+PgorZW5kb2JqCit7e29iamVjdCA0IDB9fQorPDwKKyAgL1R5cGUgL0Fubm90CisgIC9GVCAvVHgKKyAgL1QgKFRleHQgQm94KQorICAvREEgKDAgMCAwIHJnIC9GMSAxMiBUZikKKyAgL1JlY3QgWyAxMDAgMTAwIDIwMCAxMzAgXQorICAvU3VidHlwZSAvV2lkZ2V0CisgIC9BQSA8PCAvRiA5IDAgUiA+PgorPj4KK2VuZG9iagore3tvYmplY3QgNSAwfX0KKzw8IC9Gb250IDYgMCBSID4+CitlbmRvYmoKK3t7b2JqZWN0IDYgMH19Cis8PCAvRjEgNyAwIFIgPj4KK2VuZG9iagore3tvYmplY3QgNyAwfX0gPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvSGVsdmV0aWNhCis+PgorZW5kb2JqCit7e29iamVjdCA4IDB9fTw8Cis+Pgorc3RyZWFtCitlbmRzdHJlYW0KK2VuZG9iagore3tvYmplY3QgOSAwfX0KKzw8IC9KUyAoQUZOdW1iZXJfRm9ybWF0XCgwLCAxLCAwLCAwLCAiIiwgZmFsc2VcKTspIC9TIC9KYXZhU2NyaXB0ID4+CitlbmRvYmoKK3t7b2JqZWN0IDEwIDB9fQorPDwKKyAgL1R5cGUgL0Fubm90CisgIC9GVCAvVHgKKyAgL1QgKFRleHQyKQorICAvREEgKDAgMCAwIHJnIC9GMSAxMiBUZikKKyAgL1JlY3QgWyAxMDAgNDAgMjAwIDcwIF0KKyAgL1N1YnR5cGUgL1dpZGdldAorPj4KK2VuZG9iagore3t4cmVmfX0KK3RyYWlsZXI8PCAvUm9vdCAxIDAgUiA+Pgore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z18xMTM5MTBfZXhwZWN0ZWQucGRmLjAucG5nIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzExMzkxMF9leHBlY3RlZC5wZGYuMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjNmYwOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z18xMTM5MTBfZXhwZWN0ZWQucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z18xMTM5MTBfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z18xMTM5MTBfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjIxZjVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzExMzkxMF9leHBlY3RlZF9tYWMucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z180OTFfaW52aXNpYmxlLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzQ5MV9pbnZpc2libGUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzViN2U1OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z180OTFfaW52aXNpYmxlLmluCkBAIC0wLDAgKzEsNzUgQEAKK3t7aGVhZGVyfX0KK3t7b2JqZWN0IDEgMH19IDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorICAvT0NQcm9wZXJ0aWVzIDw8CisgICAgL09DR3MgWworICAgICAgOCAwIFIKKyAgICBdCisgICAgL0QgPDwKKyAgICAgIC9CYXNlU3RhdGUgL09GRgorICAgID4+CisgID4+Cis+Pgore3tvYmplY3QgMiAwfX0gPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9NZWRpYUJveCBbIDAgMCAyMDAgMjAwIF0KKyAgL0NvdW50IDEKKyAgL0tpZHMgWyAzIDAgUiBdCis+PgorZW5kb2JqCit7e29iamVjdCAzIDB9fSA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvRm9udCA8PAorICAgICAgL0YxIDQgMCBSCisgICAgICAvRjIgNSAwIFIKKyAgICA+PgorICAgIC9Qcm9wZXJ0aWVzIDw8CisgICAgICAvT0MwIDcgMCBSCisgICAgPj4KKyAgPj4KKyAgL0NvbnRlbnRzIDYgMCBSCis+PgorZW5kb2JqCit7e29iamVjdCA0IDB9fSA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9UaW1lcy1Sb21hbgorPj4KK2VuZG9iagore3tvYmplY3QgNSAwfX0gPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvSGVsdmV0aWNhCis+PgorZW5kb2JqCit7e29iamVjdCA2IDB9fSA8PAorPj4KK3N0cmVhbQorMTYgOTYgMzIgMzIgcmUgQgorL09DIC9PQzAgQkRDCis2NCA5NiAzMiAzMiByZSBCCitFTUMKK2VuZHN0cmVhbQorZW5kb2JqCit7e29iamVjdCA3IDB9fSA8PAorICAvT0NHcyBbCisgICAgOCAwIFIKKyAgXQorICAvVHlwZSAvT0NNRAorPj4KK2VuZG9iagore3tvYmplY3QgOCAwfX0gPDwKKyAgL1R5cGUgL09DRworICAvTmFtZSAoU2hvdyBUZXh0KQorPj4KK2VuZG9iagore3t4cmVmfX0KK3RyYWlsZXIgPDwKKyAgL1NpemUgOQorICAvUm9vdCAxIDAgUgorPj4KK3t7c3RhcnR4cmVmfX0KKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNDkxX2ludmlzaWJsZV9leHBlY3RlZC5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNDkxX2ludmlzaWJsZV9leHBlY3RlZC5wZGYuMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY3Y2EyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z180OTFfaW52aXNpYmxlX2V4cGVjdGVkLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNDkxX3Vuc3BlY2lmaWVkLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzQ5MV91bnNwZWNpZmllZC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWU3MzEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzQ5MV91bnNwZWNpZmllZC5pbgpAQCAtMCwwICsxLDc0IEBACit7e2hlYWRlcn19Cit7e29iamVjdCAxIDB9fSA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKyAgL09DUHJvcGVydGllcyA8PAorICAgIC9PQ0dzIFsKKyAgICAgIDggMCBSCisgICAgXQorICAgIC9EIDw8CisgICAgICAvQmFzZVN0YXRlIC9PRkYKKyAgICA+PgorICA+PgorPj4KK3t7b2JqZWN0IDIgMH19IDw8CisgIC9UeXBlIC9QYWdlcworICAvTWVkaWFCb3ggWyAwIDAgMjAwIDIwMCBdCisgIC9Db3VudCAxCisgIC9LaWRzIFsgMyAwIFIgXQorPj4KK2VuZG9iagore3tvYmplY3QgMyAwfX0gPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvUmVzb3VyY2VzIDw8CisgICAgL0ZvbnQgPDwKKyAgICAgIC9GMSA0IDAgUgorICAgICAgL0YyIDUgMCBSCisgICAgPj4KKyAgICAvUHJvcGVydGllcyA8PAorICAgICAgL09DMCA3IDAgUgorICAgID4+CisgID4+CisgIC9Db250ZW50cyA2IDAgUgorPj4KK2VuZG9iagore3tvYmplY3QgNCAwfX0gPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvVGltZXMtUm9tYW4KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDUgMH19IDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL0hlbHZldGljYQorPj4KK2VuZG9iagore3tvYmplY3QgNiAwfX0gPDwKKz4+CitzdHJlYW0KKzE2IDk2IDMyIDMyIHJlIEIKKy9PQyAvT0MwIEJEQworNjQgOTYgMzIgMzIgcmUgQgorRU1DCitlbmRzdHJlYW0KK2VuZG9iagore3tvYmplY3QgNyAwfX0gPDwKKyAgL09DR3MgWworICBdCisgIC9UeXBlIC9PQ01ECis+PgorZW5kb2JqCit7e29iamVjdCA4IDB9fSA8PAorICAvVHlwZSAvT0NHCisgIC9OYW1lIChTaG93IFRleHQpCis+PgorZW5kb2JqCit7e3hyZWZ9fQordHJhaWxlciA8PAorICAvU2l6ZSA5CisgIC9Sb290IDEgMCBSCis+Pgore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z180OTFfdW5zcGVjaWZpZWRfZXhwZWN0ZWQucGRmLjAucG5nIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzQ5MV91bnNwZWNpZmllZF9leHBlY3RlZC5wZGYuMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmExYjM3YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z180OTFfdW5zcGVjaWZpZWRfZXhwZWN0ZWQucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z180OTFfdmlzaWJsZS5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z180OTFfdmlzaWJsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTIxYjZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzQ5MV92aXNpYmxlLmluCkBAIC0wLDAgKzEsNzUgQEAKK3t7aGVhZGVyfX0KK3t7b2JqZWN0IDEgMH19IDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorICAvT0NQcm9wZXJ0aWVzIDw8CisgICAgL09DR3MgWworICAgICAgOCAwIFIKKyAgICBdCisgICAgL0QgPDwKKyAgICAgIC9CYXNlU3RhdGUgL09OCisgICAgPj4KKyAgPj4KKz4+Cit7e29iamVjdCAyIDB9fSA8PAorICAvVHlwZSAvUGFnZXMKKyAgL01lZGlhQm94IFsgMCAwIDIwMCAyMDAgXQorICAvQ291bnQgMQorICAvS2lkcyBbIDMgMCBSIF0KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDMgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA8PAorICAgIC9Gb250IDw8CisgICAgICAvRjEgNCAwIFIKKyAgICAgIC9GMiA1IDAgUgorICAgID4+CisgICAgL1Byb3BlcnRpZXMgPDwKKyAgICAgIC9PQzAgNyAwIFIKKyAgICA+PgorICA+PgorICAvQ29udGVudHMgNiAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDQgMH19IDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL1RpbWVzLVJvbWFuCis+PgorZW5kb2JqCit7e29iamVjdCA1IDB9fSA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9IZWx2ZXRpY2EKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDYgMH19IDw8Cis+Pgorc3RyZWFtCisxNiA5NiAzMiAzMiByZSBCCisvT0MgL09DMCBCREMKKzY0IDk2IDMyIDMyIHJlIEIKK0VNQworZW5kc3RyZWFtCitlbmRvYmoKK3t7b2JqZWN0IDcgMH19IDw8CisgIC9PQ0dzIFsKKyAgICA4IDAgUgorICBdCisgIC9UeXBlIC9PQ01ECis+PgorZW5kb2JqCit7e29iamVjdCA4IDB9fSA8PAorICAvVHlwZSAvT0NHCisgIC9OYW1lIChTaG93IFRleHQpCis+PgorZW5kb2JqCit7e3hyZWZ9fQordHJhaWxlciA8PAorICAvU2l6ZSA5CisgIC9Sb290IDEgMCBSCis+Pgore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z180OTFfdmlzaWJsZV9leHBlY3RlZC5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNDkxX3Zpc2libGVfZXhwZWN0ZWQucGRmLjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMWIzN2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNDkxX3Zpc2libGVfZXhwZWN0ZWQucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z180OTIucGRmLjAucG5nIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzQ5Mi5wZGYuMC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkYzRiNTMuLjAwMDAwMDAKLS0tIGEvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzQ5Mi5wZGYuMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNDkyX2V4cGVjdGVkLnBkZi4wLnBuZyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z180OTJfZXhwZWN0ZWQucGRmLjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YjZjOWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNDkyX2V4cGVjdGVkLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzFfZXhwZWN0ZWQucGRmLjAucG5nIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M18xX2V4cGVjdGVkLnBkZi4wLnBuZwppbmRleCBhMDQ0YmIwLi5lYWJmOTU3IDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzFfZXhwZWN0ZWQucGRmLjAucG5nCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfMV9leHBlY3RlZC5wZGYuMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M18xX2V4cGVjdGVkX21hYy5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzFfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwppbmRleCBlNGQ1NzEwLi5iODViOWQwIDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzFfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZworKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzFfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzJfZXhwZWN0ZWQucGRmLjAucG5nIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M18yX2V4cGVjdGVkLnBkZi4wLnBuZwppbmRleCAxOWRlNTJhLi4wNDMwNGZlIDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzJfZXhwZWN0ZWQucGRmLjAucG5nCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfMl9leHBlY3RlZC5wZGYuMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M18yX2V4cGVjdGVkX21hYy5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzJfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwppbmRleCAxMTM2MDEzLi5lY2VkZTdkIDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzJfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZworKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzJfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzNfZXhwZWN0ZWQucGRmLjAucG5nIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M18zX2V4cGVjdGVkLnBkZi4wLnBuZwppbmRleCBhMDQ0YmIwLi5lYWJmOTU3IDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzNfZXhwZWN0ZWQucGRmLjAucG5nCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfM19leHBlY3RlZC5wZGYuMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M18zX2V4cGVjdGVkX21hYy5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzNfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwppbmRleCBlNGQ1NzEwLi5iODViOWQwIDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzNfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZworKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzNfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzRfZXhwZWN0ZWQucGRmLjAucG5nIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M180X2V4cGVjdGVkLnBkZi4wLnBuZwppbmRleCBhMDQ0YmIwLi5lYWJmOTU3IDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzRfZXhwZWN0ZWQucGRmLjAucG5nCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfNF9leHBlY3RlZC5wZGYuMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M180X2V4cGVjdGVkX21hYy5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzRfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwppbmRleCBlNGQ1NzEwLi5iODViOWQwIDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzRfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZworKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzRfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzVfZXhwZWN0ZWQucGRmLjAucG5nIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M181X2V4cGVjdGVkLnBkZi4wLnBuZwppbmRleCBhMDQ0YmIwLi5lYWJmOTU3IDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzVfZXhwZWN0ZWQucGRmLjAucG5nCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfNV9leHBlY3RlZC5wZGYuMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M181X2V4cGVjdGVkX21hYy5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzVfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwppbmRleCBlNGQ1NzEwLi5iODViOWQwIDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzVfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZworKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzVfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzdfZXhwZWN0ZWQucGRmLjAucG5nIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M183X2V4cGVjdGVkLnBkZi4wLnBuZwppbmRleCAxOWRlNTJhLi4wNDMwNGZlIDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzdfZXhwZWN0ZWQucGRmLjAucG5nCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjQwNDNfN19leHBlY3RlZC5wZGYuMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyNDA0M183X2V4cGVjdGVkX21hYy5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzdfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwppbmRleCAxMTM2MDEzLi5lY2VkZTdkIDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzdfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZworKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI0MDQzXzdfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTI4MTAzLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyODEwMy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjIzYjBiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyODEwMy5pbgpAQCAtMCwwICsxLDQ3IEBACit7e2hlYWRlcn19Cit7e29iamVjdCAxIDB9fSA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDIgMH19IDw8CisgIC9UeXBlIC9QYWdlcworICAvTWVkaWFCb3ggWyAwIDAgNTAwIDEwMCBdCisgIC9Db3VudCAxCisgIC9LaWRzIFsgMyAwIFIgXQorPj4KK2VuZG9iagore3tvYmplY3QgMyAwfX0gPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvUmVzb3VyY2VzIDw8CisgICAgL0ZvbnQgPDwKKyAgICAgIC9GMSA0IDAgUgorICAgID4+CisgID4+CisgIC9Db250ZW50cyA1IDAgUgorPj4KK2VuZG9iagore3tvYmplY3QgNCAwfX0gPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvQXJpYWwKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDUgMH19IDw8Cis+Pgorc3RyZWFtCitCVAorMTUwIFR6CisxMDAgNTAgVEQgL0YxIDEyIFRmIFsoSW50ZW50aW9uYWxseSldIFRKCisxMCAwIFREIFstNTAwMChOb25vdmVybGFwcGluZyldIFRKCisxMCAwIFREIFstMTIwMDAoVGV4dCldIFRKCitFVAorZW5kc3RyZWFtCitlbmRvYmoKK3t7eHJlZn19Cit0cmFpbGVyIDw8CisgIC9Sb290IDEgMCBSCis+Pgore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjgxMDNfZXhwZWN0ZWQucGRmLjAucG5nIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyODEwM19leHBlY3RlZC5wZGYuMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMwYzI1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjgxMDNfZXhwZWN0ZWQucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjgxMDNfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjgxMDNfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjAyOGY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyODEwM19leHBlY3RlZF9tYWMucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjgxMDNfZXhwZWN0ZWRfd2luLnBkZi4wLnBuZyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181MjgxMDNfZXhwZWN0ZWRfd2luLnBkZi4wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2EwNjA2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzUyODEwM19leHBlY3RlZF93aW4ucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NDMwMThfMV9leHBlY3RlZC5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTQzMDE4XzFfZXhwZWN0ZWQucGRmLjAucG5nCmluZGV4IGEwNDRiYjAuLmVhYmY5NTcgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NDMwMThfMV9leHBlY3RlZC5wZGYuMC5wbmcKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzU0MzAxOF8xX2V4cGVjdGVkLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTQzMDE4XzFfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NDMwMThfMV9leHBlY3RlZF9tYWMucGRmLjAucG5nCmluZGV4IGU0ZDU3MTAuLmI4NWI5ZDAgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NDMwMThfMV9leHBlY3RlZF9tYWMucGRmLjAucG5nCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NDMwMThfMV9leHBlY3RlZF9tYWMucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NDMwMThfMl9leHBlY3RlZC5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTQzMDE4XzJfZXhwZWN0ZWQucGRmLjAucG5nCmluZGV4IGEwNDRiYjAuLmVhYmY5NTcgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NDMwMThfMl9leHBlY3RlZC5wZGYuMC5wbmcKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzU0MzAxOF8yX2V4cGVjdGVkLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTQzMDE4XzJfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NDMwMThfMl9leHBlY3RlZF9tYWMucGRmLjAucG5nCmluZGV4IGU0ZDU3MTAuLmI4NWI5ZDAgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NDMwMThfMl9leHBlY3RlZF9tYWMucGRmLjAucG5nCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NDMwMThfMl9leHBlY3RlZF9tYWMucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NTEyNThfMV9leHBlY3RlZC5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTUxMjU4XzFfZXhwZWN0ZWQucGRmLjAucG5nCmluZGV4IGEwNDRiYjAuLmVhYmY5NTcgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NTEyNThfMV9leHBlY3RlZC5wZGYuMC5wbmcKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzU1MTI1OF8xX2V4cGVjdGVkLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNTUxMjU4XzFfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NTEyNThfMV9leHBlY3RlZF9tYWMucGRmLjAucG5nCmluZGV4IGU0ZDU3MTAuLmI4NWI5ZDAgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NTEyNThfMV9leHBlY3RlZF9tYWMucGRmLjAucG5nCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z181NTEyNThfMV9leHBlY3RlZF9tYWMucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z182NjU0NjcuaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNjY1NDY3LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZjJjMWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNjY1NDY3LmluCkBAIC0wLDAgKzEsOTkgQEAKK3t7aGVhZGVyfX0KK3t7b2JqZWN0IDEgMH19IDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorPj4KK2VuZG9iagorCit7e29iamVjdCAyIDB9fSA8PAorICAvVHlwZSAvUGFnZXMKKyAgL01lZGlhQm94IFsgMCAwIDEwMCAxMDAgXQorICAvQ291bnQgMQorICAvS2lkcyBbIDMgMCBSIF0KKz4+CitlbmRvYmoKKwore3tvYmplY3QgMyAwfX0gPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvUmVzb3VyY2VzCisgIDw8CisgICAgL0ZvbnQgPDwgL0YxIDQgMCBSID4+CisgID4+CisgIC9Db250ZW50cyA4IDAgUgorPj4KK2VuZG9iagorCit7e29iamVjdCA0IDB9fSA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHJ1ZVR5cGUKKyAgL0Jhc2VGb250IC9DaHJvbWVTYW5zTU0KKyAgL0VuY29kaW5nIDUgMCBSCisgIC9GaXJzdENoYXIgMzIKKyAgL0xhc3RDaGFyIDI1NQorICAvTmFtZSAvRjEKKyAgL1RvVW5pY29kZSA2IDAgUgorICAvRm9udERlc2NyaXB0b3IgNyAwIFIKKz4+CitlbmRvYmoKKwore3tvYmplY3QgNSAwfX0gPDwKKyAgL0RpZmZlcmVuY2VzIFsgMTYxIC9zb21ldW5rbm93bm5hbWUgXQorICAvVHlwZSAvRW5jb2RpbmcKKz4+CitlbmRvYmoKKwore3tvYmplY3QgNiAwfX0gPDwKKz4+CitzdHJlYW0KKy9DSURJbml0IC9Qcm9jU2V0IGZpbmRyZXNvdXJjZSBiZWdpbgorMTIgZGljdCBiZWdpbgorYmVnaW5jbWFwCisvQ0lEU3lzdGVtSW5mbworPDwvUmVnaXN0cnkgKEFkb2JlKQorL09yZGVyaW5nIChJZGVudGl0eSkKKy9TdXBwbGVtZW50IDAKKz4+IGRlZgorL0NNYXBOYW1lIC9BZG9iZS1JZGVudGl0eS1IIGRlZgorQ01hcFR5cGUgMiBkZWYKKzEgYmVnaW5jb2Rlc3BhY2VyYW5nZQorPDAwPiA8RkY+CitlbmRjb2Rlc3BhY2VyYW5nZQorMSBiZWdpbmJmY2hhcgorPEExPiA8MDQzQj4KK2VuZGJmY2hhcgorZW5kY21hcAorQ01hcE5hbWUgY3VycmVudGRpY3QgL0NNYXAgZGVmaW5lcmVzb3VyY2UgcG9wCitlbmQKK2VuZAorZW5kc3RyZWFtCitlbmRvYmoKKwore3tvYmplY3QgNyAwfX0gPDwKKyAgPDwgL0FzY2VudCAxMDAwCisgIC9DYXBIZWlnaHQgMAorICAvRGVzY2VudCAtMjAwCisgIC9GbGFncyAzMgorICAvRm9udEJCb3ggWyAtNTk5IC0yMDcgMTMzOCAxMDM0IF0KKyAgL0ZvbnROYW1lIC9DaHJvbWVTYW5zTU0KKyAgL0l0YWxpY0FuZ2xlIDAKKyAgL1N0ZW1WIDAKKyAgL1R5cGUgL0ZvbnREZXNjcmlwdG9yCis+PgorZW5kb2JqCisKK3t7b2JqZWN0IDggMH19IDw8Cis+Pgorc3RyZWFtCitCVAorNTAgNTAgVGQgL0YxIDE1IFRmIDxBMT4gVGoKK0VUCitlbmRzdHJlYW0KK2VuZG9iagorCit7e3hyZWZ9fQordHJhaWxlciA8PAorICAvUm9vdCAxIDAgUgorPj4KK3t7c3RhcnR4cmVmfX0KKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNjY1NDY3X2V4cGVjdGVkLnBkZi4wLnBuZyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z182NjU0NjdfZXhwZWN0ZWQucGRmLjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYjM3YjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNjY1NDY3X2V4cGVjdGVkLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNjY1NDY3X2V4cGVjdGVkX21hYy5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNjY1NDY3X2V4cGVjdGVkX21hYy5wZGYuMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY1MWRjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z182NjU0NjdfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzE0MTg3LmluIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzcxNDE4Ny5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWMyMzk1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzcxNDE4Ny5pbgpAQCAtMCwwICsxLDY4IEBACit7e2hlYWRlcn19CisKK3t7b2JqZWN0IDIgMH19IDw8CisgIC9UeXBlIC9QYWdlcworICAvUm90YXRlIDkwCisgIC9LaWRzICBbIDMgMCBSIF0KKyAgL0NvdW50IDEKKz4+CitlbmRvYmoKKwore3tvYmplY3QgMSAwfX0gPDwKKyAgL1R5cGUgL0NhdGFsb2cKKyAgL1BhZ2VzIDIgMCBSCis+PgorZW5kb2JqCisKK3t7b2JqZWN0IDMgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL0NvbnRlbnRzIDQgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvWE9iamVjdCA8PAorICAgICAgL1M1IDUgMCBSCisgICAgPj4KKyAgPj4KKz4+CitlbmRvYmoKKwore3tvYmplY3QgNCAwfX0gPDwKKyAgL0xlbmd0aCAxODcKKz4+CitzdHJlYW0KK3EKKzAgMSAtMSAwIDAgMCBjbQorMSAwIDAgLTEgMCAwIGNtCiswLjA3MiAwIDAgMC4wNzIgMCAwIGNtCisxIDAgMCAwLjk1OTg2MDM4MzkgMCAyNzUgY20KKzEuMCAwIDAgMS4wIDI1MCA4NTAgY20KKzEuMCAwIDAgMS4wIDIyODMuNTE1NjI1IDg0NS41MjUgY20KKzAuMDAwNTIwODMzMyAwIDAgLTAuMDAwNTQyNjEzNiAwIDAgY20KKy9TNSBEbworUQorCitlbmRzdHJlYW0KK2VuZG9iagorCit7e29iamVjdCA1IDB9fSA8PAorICAvVHlwZSAvWE9iamVjdAorICAvU3VidHlwZSAvRm9ybQorICAvRm9ybVR5cGUgMQorICAvQkJveCBbIDI0MzIwIC03MDQxMjggNTI0MjI0IC0xMjE4NTYgXQorICAvTGVuZ3RoIDY4Cis+Pgorc3RyZWFtCis1MjQyMTMgLTQxMTM0NiBtCisxMDk3MTkgLTEyMTkxNCAyNDM4MiAtMjYzNzI3IDI0MzgyIC00MTYzMjIgYworaAorZgorCitlbmRzdHJlYW0KK2VuZG9iagorCit7e3hyZWZ9fQordHJhaWxlciA8PAorICAvUm9vdCAxIDAgUgorPj4KK3t7c3RhcnR4cmVmfX0KKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzE0MTg3X2V4cGVjdGVkLnBkZi4wLnBuZyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MTQxODdfZXhwZWN0ZWQucGRmLjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NWRhZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzE0MTg3X2V4cGVjdGVkLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzE4NzYyLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzcxODc2Mi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDU5ZGMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzcxODc2Mi5pbgpAQCAtMCwwICsxLDY3IEBACit7e2hlYWRlcn19Cit7e29iamVjdCAxIDB9fSA8PAorICAvVHlwZSAvUGFnZXMKKyAgL0NvdW50IDEKKyAgL0tpZHNbIDMgMCBSIF0KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDIgMH19IDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAxIDAgUgorPj4KK2VuZG9iagore3tvYmplY3QgMyAwfX0gPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAxIDAgUgorICAvUmVzb3VyY2VzIDYgMCBSCisgIC9NZWRpYUJveFsgMCAwIDY0IDY0XQorICAvQ29udGVudHNbIDUgMCBSIF0KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDQgMH19IDw8CisgIC9UeXBlIC9YT2JqZWN0CisgIC9TdWJ0eXBlIC9JbWFnZQorICAvTmFtZSAvSTEKKyAgL1dpZHRoIDUwMDAKKyAgL0hlaWdodCA1MDAwCisgIC9CaXRzUGVyQ29tcG9uZW50IDgKKyAgL0NvbG9yU3BhY2UgL0RldmljZUNNWUsKKyAgL0ZpbHRlciBbL0FTQ0lJSGV4RGVjb2RlIC9GbGF0ZURlY29kZSAvRENURGVjb2RlXQorICAvRGVjb2RlIFsxLjAgMC4wIDEuMCAwLjAgMS4wIDAuMCAxLjAgMC4wXQorICAvTGVuZ3RoIDczNAorPj4KK3N0cmVhbQorNzg5Y2VkY2QzZDRlYzIwMDE4MDZlMDBmNjgwNTI5ZDQxNjVhNjQzNjcxZjExMmM2OTAxMDk1YjA5ODM4YjAxOTgzODk5YmQ3ZTAyYzllYworMmMxNDNmOGIzNzgwMmFmNTBjYmE4MTc3MDc5OWVlZjlkZGViY2M5ZDdiYzM1NWY1MTVjMmZhZjk2ZDFlOTc0ZTJiMmJkNjhiZTIzYmZkOAorM2VkZDNmYzQzNmY2OWFjZjU4NDRhZmRiZGRhNzk1YjQ0OTA3Njk5YTI0ZTliMGRmM2YxODhjODZhMzUxMzZjY2IyNzEzZTI5YzY3OTk5NgorNzU5MzEyYmNhNjk1NWQ3ZjVlOGU4NzgzZWFiZTY5M2FhYWU5YTk3YTgwNmQzZGQ3NDk3MmM0ZTYyNWRjNmE2OGM1NTE5Y2Q2YmQ0ZWRlMworZjhlZGIwYWRhYmUyNmYxYmNkNDdlNGM5MjJkNmIxODk1NWM0NzkzY2RmOWRkZWRjOWUzZGZlOWQwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZmM4MzVlZgorM2ZlMDNjZTJlMWViYQorZW5kc3RyZWFtCitlbmRvYmoKK3t7b2JqZWN0IDUgMH19IDw8CisvTGVuZ3RoIDI4Cis+Pgorc3RyZWFtCitxCis2NCAwIDAgNjQgMCAwIGNtCisvSTEgRG8KK1EKK2VuZHN0cmVhbQorZW5kb2JqCit7e29iamVjdCA2IDB9fSA8PAorICAvUHJvY1NldCBbL1BERiAvSW1hZ2VDXQorICAvWE9iamVjdDw8L0kxIDQgMCBSID4+Cis+PgorZW5kb2JqCit7e3hyZWZ9fQordHJhaWxlciA8PAorICAvU2l6ZSA3CisgIC9Sb290IDIgMCBSCis+Pgore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MTg3NjJfZXhwZWN0ZWQucGRmLjAucG5nIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzcxODc2Ml9leHBlY3RlZC5wZGYuMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwNjlmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MTg3NjJfZXhwZWN0ZWQucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MzM1MjguaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzMzNTI4LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MDJjM2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzMzNTI4LmluCkBAIC0wLDAgKzEsNzIgQEAKK3t7aGVhZGVyfX0KK3t7b2JqZWN0IDEgMH19IDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorICAvQWNyb0Zvcm0gPDwKKyAgICAvRmllbGRzIFsgNCAwIFIgOSAwIFIgXQorICAgIC9EUiA1IDAgUgorICAgIC9OZWVkQXBwZWFyYW5jZXMgdHJ1ZQorICA+PgorPj4KK2VuZG9iagore3tvYmplY3QgMiAwfX0gPDwKKyAgL0NvdW50IDEKKyAgL0tpZHMgWyAzIDAgUiBdCisgIC9UeXBlIC9QYWdlcworPj4KK2VuZG9iagore3tvYmplY3QgMyAwfX0gPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvUmVzb3VyY2VzIDUgMCBSCisgIC9NZWRpYUJveCBbIDAgMCAzMDAgMjAwIF0KKyAgL0NvbnRlbnRzIDggMCBSCisgIC9Bbm5vdHMgWyA0IDAgUiA5IDAgUiBdCis+PgorZW5kb2JqCit7e29iamVjdCA0IDB9fSA8PAorICAvVHlwZSAvQW5ub3QKKyAgL0ZUIC9UeAorICAvVCAoU2hhcmVkRmllbGQpCisgIC9EQSAoMCAwIDAgcmcgL0YxIDEyIFRmKQorICAvUmVjdCBbIDEwMCAxMDAgMjAwIDEzMCBdCisgIC9TdWJ0eXBlIC9XaWRnZXQKKyAgL1YgKEhlbGxvLCB3b3JsZCkKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDUgMH19IDw8CisgIC9Gb250IDYgMCBSCis+PgorZW5kb2JqCit7e29iamVjdCA2IDB9fSA8PAorICAvRjEgNyAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDcgMH19IDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL0hlbHZldGljYQorPj4KK2VuZG9iagore3tvYmplY3QgOCAwfX0gPDwKKz4+CitzdHJlYW0KK2VuZHN0cmVhbQorZW5kb2JqCit7e29iamVjdCA5IDB9fSA8PAorICAvVHlwZSAvQW5ub3QKKyAgL0ZUIC9UeAorICAvVCAoU2hhcmVkRmllbGQpCisgIC9EQSAoMCAwIDAgcmcgL0YxIDEyIFRmKQorICAvUmVjdCBbIDEwMCA0MCAyMDAgNzAgXQorICAvU3VidHlwZSAvV2lkZ2V0CisgIC9WICgpCis+PgorZW5kb2JqCit7e3hyZWZ9fQordHJhaWxlciA8PAorICAvUm9vdCAxIDAgUgorICAvU2l6ZSAxMAorPj4KK3t7c3RhcnR4cmVmfX0KKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzMzNTI4X2V4cGVjdGVkLnBkZi4wLnBuZyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MzM1MjhfZXhwZWN0ZWQucGRmLjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZjQ4YjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzMzNTI4X2V4cGVjdGVkLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzMzNTI4X2V4cGVjdGVkX21hYy5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzMzNTI4X2V4cGVjdGVkX21hYy5wZGYuMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdjODMwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MzM1MjhfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzM2Njk1XzEuaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzM2Njk1XzEuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVhNmQ3NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MzY2OTVfMS5pbgpAQCAtMCwwICsxLDYwIEBACit7e2hlYWRlcn19CisKK3t7b2JqZWN0IDEgMH19Cis8PAorICAvQWNyb0Zvcm0gPDwgL0ZpZWxkcyBbIDkgMCBSIF0gPj4KKyAgL1BhZ2VzIDIyIDAgUgorICAvVHlwZSAvQ2F0YWxvZworPj4KK2VuZG9iagorCit7e29iamVjdCA5IDB9fQorPDwKKyAgL0YgNAorICAvRlQgL0NoCisgIC9GZiAzOTMyMTYKKyAgL09wdCBbIDxmZWZmMDA1MzAwNzAwMDYxMDA2OTAwNmU+IDxmZWZmMDA1MzAwNzcwMDY1MDA2NDAwNjUwMDZlPiBdCisgIC9QIDIxIDAgUgorICAvUmVjdCBbIDE2NS43IDMxNS45IDMxNS43IDMzMC4xIF0KKyAgL1N1YnR5cGUgL1dpZGdldAorICAvVCAoQ291bnRyeSBCb3gpCisgIC9UeXBlIC9Bbm5vdAorPj4KK2VuZG9iagorCit7e29iamVjdCAyMSAwfX0KKzw8CisgIC9Bbm5vdHMgWyA5IDAgUiBdCisgIC9Db250ZW50cyA0OSAwIFIKKyAgL01lZGlhQm94IFsgMCAwIDU5NSAzNDIgXQorICAvUGFyZW50IDIyIDAgUgorICAvVHlwZSAvUGFnZQorPj4KK2VuZG9iagorCit7e29iamVjdCAyMiAwfX0KKzw8CisgIC9Db3VudCAxCisgIC9LaWRzIFsgMjEgMCBSIF0KKyAgL01lZGlhQm94IFsgMCAwIDU5NSA4NDIgXQorICAvVHlwZSAvUGFnZXMKKz4+CitlbmRvYmoKKwore3tvYmplY3QgNDkgMH19Cis8PCAvTGVuZ3RoIDg4ID4+CitzdHJlYW0KKzAuMSB3CiswIDAgMCBSRworMSAxIDEgcmcKK3EgMCAwLjEgNTk1LjIgODQxLjggcmUKK1cqIG4KKzE2My4xIDMxMy4xIDE1NS4zIDE5LjkgcmUgQioKK1EKK2VuZHN0cmVhbQorZW5kb2JqCisKK3t7eHJlZn19Cit0cmFpbGVyPDwgL1Jvb3QgMSAwIFIgPj4KK3t7c3RhcnR4cmVmfX0KKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzM2Njk1XzFfZXhwZWN0ZWQucGRmLjAucG5nIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzczNjY5NV8xX2V4cGVjdGVkLnBkZi4wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWQ3YmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzczNjY5NV8xX2V4cGVjdGVkLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzM2Njk1XzIuZXZ0IGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzczNjY5NV8yLmV2dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTRkYmYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzczNjY5NV8yLmV2dApAQCAtMCwwICsxLDQgQEAKKyMgT3BlbiB0aGUgZHJvcGRvd24gdG8gbWFrZSBzdXJlIGl0IGRpc3BsYXlzIGNvcnJlY3RseS4KK21vdXNlbW92ZSwzMTIsMzI0Cittb3VzZWRvd24sbGVmdCwzMTIsMzI0Cittb3VzZXVwLGxlZnQsMzEyLDMyNApkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzczNjY5NV8yLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzczNjY5NV8yLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YTZkNzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzM2Njk1XzIuaW4KQEAgLTAsMCArMSw2MCBAQAore3toZWFkZXJ9fQorCit7e29iamVjdCAxIDB9fQorPDwKKyAgL0Fjcm9Gb3JtIDw8IC9GaWVsZHMgWyA5IDAgUiBdID4+CisgIC9QYWdlcyAyMiAwIFIKKyAgL1R5cGUgL0NhdGFsb2cKKz4+CitlbmRvYmoKKwore3tvYmplY3QgOSAwfX0KKzw8CisgIC9GIDQKKyAgL0ZUIC9DaAorICAvRmYgMzkzMjE2CisgIC9PcHQgWyA8ZmVmZjAwNTMwMDcwMDA2MTAwNjkwMDZlPiA8ZmVmZjAwNTMwMDc3MDA2NTAwNjQwMDY1MDA2ZT4gXQorICAvUCAyMSAwIFIKKyAgL1JlY3QgWyAxNjUuNyAzMTUuOSAzMTUuNyAzMzAuMSBdCisgIC9TdWJ0eXBlIC9XaWRnZXQKKyAgL1QgKENvdW50cnkgQm94KQorICAvVHlwZSAvQW5ub3QKKz4+CitlbmRvYmoKKwore3tvYmplY3QgMjEgMH19Cis8PAorICAvQW5ub3RzIFsgOSAwIFIgXQorICAvQ29udGVudHMgNDkgMCBSCisgIC9NZWRpYUJveCBbIDAgMCA1OTUgMzQyIF0KKyAgL1BhcmVudCAyMiAwIFIKKyAgL1R5cGUgL1BhZ2UKKz4+CitlbmRvYmoKKwore3tvYmplY3QgMjIgMH19Cis8PAorICAvQ291bnQgMQorICAvS2lkcyBbIDIxIDAgUiBdCisgIC9NZWRpYUJveCBbIDAgMCA1OTUgODQyIF0KKyAgL1R5cGUgL1BhZ2VzCis+PgorZW5kb2JqCisKK3t7b2JqZWN0IDQ5IDB9fQorPDwgL0xlbmd0aCA4OCA+Pgorc3RyZWFtCiswLjEgdworMCAwIDAgUkcKKzEgMSAxIHJnCitxIDAgMC4xIDU5NS4yIDg0MS44IHJlCitXKiBuCisxNjMuMSAzMTMuMSAxNTUuMyAxOS45IHJlIEIqCitRCitlbmRzdHJlYW0KK2VuZG9iagorCit7e3hyZWZ9fQordHJhaWxlcjw8IC9Sb290IDEgMCBSID4+Cit7e3N0YXJ0eHJlZn19CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzczNjY5NV8yX2V4cGVjdGVkLnBkZi4wLnBuZyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MzY2OTVfMl9leHBlY3RlZC5wZGYuMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNlYTA3NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MzY2OTVfMl9leHBlY3RlZC5wZGYuMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzczNjY5NV8yX2V4cGVjdGVkX21hYy5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzM2Njk1XzJfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmM3MDg1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzczNjY5NV8yX2V4cGVjdGVkX21hYy5wZGYuMC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzczNjY5NV8zLmV2dCBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MzY2OTVfMy5ldnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0ZDU5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MzY2OTVfMy5ldnQKQEAgLTAsMCArMSw5IEBACisjIE9wZW4gZHJvcGRvd24KK21vdXNlbW92ZSwzMTIsMzI0Cittb3VzZWRvd24sbGVmdCwzMTIsMzI0Cittb3VzZXVwLGxlZnQsMzEyLDMyNAorCisjIFNlbGVjdCBpdGVtCittb3VzZW1vdmUsMzEyLDMxMAorbW91c2Vkb3duLGxlZnQsMzEyLDMxMAorbW91c2V1cCxsZWZ0LDMxMiwzMTAKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MzY2OTVfMy5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MzY2OTVfMy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWE2ZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzczNjY5NV8zLmluCkBAIC0wLDAgKzEsNjAgQEAKK3t7aGVhZGVyfX0KKwore3tvYmplY3QgMSAwfX0KKzw8CisgIC9BY3JvRm9ybSA8PCAvRmllbGRzIFsgOSAwIFIgXSA+PgorICAvUGFnZXMgMjIgMCBSCisgIC9UeXBlIC9DYXRhbG9nCis+PgorZW5kb2JqCisKK3t7b2JqZWN0IDkgMH19Cis8PAorICAvRiA0CisgIC9GVCAvQ2gKKyAgL0ZmIDM5MzIxNgorICAvT3B0IFsgPGZlZmYwMDUzMDA3MDAwNjEwMDY5MDA2ZT4gPGZlZmYwMDUzMDA3NzAwNjUwMDY0MDA2NTAwNmU+IF0KKyAgL1AgMjEgMCBSCisgIC9SZWN0IFsgMTY1LjcgMzE1LjkgMzE1LjcgMzMwLjEgXQorICAvU3VidHlwZSAvV2lkZ2V0CisgIC9UIChDb3VudHJ5IEJveCkKKyAgL1R5cGUgL0Fubm90Cis+PgorZW5kb2JqCisKK3t7b2JqZWN0IDIxIDB9fQorPDwKKyAgL0Fubm90cyBbIDkgMCBSIF0KKyAgL0NvbnRlbnRzIDQ5IDAgUgorICAvTWVkaWFCb3ggWyAwIDAgNTk1IDM0MiBdCisgIC9QYXJlbnQgMjIgMCBSCisgIC9UeXBlIC9QYWdlCis+PgorZW5kb2JqCisKK3t7b2JqZWN0IDIyIDB9fQorPDwKKyAgL0NvdW50IDEKKyAgL0tpZHMgWyAyMSAwIFIgXQorICAvTWVkaWFCb3ggWyAwIDAgNTk1IDg0MiBdCisgIC9UeXBlIC9QYWdlcworPj4KK2VuZG9iagorCit7e29iamVjdCA0OSAwfX0KKzw8IC9MZW5ndGggODggPj4KK3N0cmVhbQorMC4xIHcKKzAgMCAwIFJHCisxIDEgMSByZworcSAwIDAuMSA1OTUuMiA4NDEuOCByZQorVyogbgorMTYzLjEgMzEzLjEgMTU1LjMgMTkuOSByZSBCKgorUQorZW5kc3RyZWFtCitlbmRvYmoKKwore3t4cmVmfX0KK3RyYWlsZXI8PCAvUm9vdCAxIDAgUiA+Pgore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MzY2OTVfM19leHBlY3RlZC5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzM2Njk1XzNfZXhwZWN0ZWQucGRmLjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZmZlMGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzM2Njk1XzNfZXhwZWN0ZWQucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MzY2OTVfM19leHBlY3RlZF9tYWMucGRmLjAucG5nIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzczNjY5NV8zX2V4cGVjdGVkX21hYy5wZGYuMC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFiY2QxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MzY2OTVfM19leHBlY3RlZF9tYWMucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MzY2OTVfNC5ldnQgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzM2Njk1XzQuZXZ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNTkxY2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzM2Njk1XzQuZXZ0CkBAIC0wLDAgKzEsMTIgQEAKKyMgT3BlbiBkcm9wZG93bgorbW91c2Vtb3ZlLDMxMiwzMjQKK21vdXNlZG93bixsZWZ0LDMxMiwzMjQKK21vdXNldXAsbGVmdCwzMTIsMzI0CisKKyMgSG92ZXIgaXRlbQorbW91c2Vtb3ZlLDMxMiwzMTAKKworIyBTZWxlY3Qgb2ZmCittb3VzZW1vdmUsNiw2Cittb3VzZWRvd24sbGVmdCw2LDYKK21vdXNldXAsbGVmdCw2LDYKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MzY2OTVfNC5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MzY2OTVfNC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWE2ZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvYnVnXzczNjY5NV80LmluCkBAIC0wLDAgKzEsNjAgQEAKK3t7aGVhZGVyfX0KKwore3tvYmplY3QgMSAwfX0KKzw8CisgIC9BY3JvRm9ybSA8PCAvRmllbGRzIFsgOSAwIFIgXSA+PgorICAvUGFnZXMgMjIgMCBSCisgIC9UeXBlIC9DYXRhbG9nCis+PgorZW5kb2JqCisKK3t7b2JqZWN0IDkgMH19Cis8PAorICAvRiA0CisgIC9GVCAvQ2gKKyAgL0ZmIDM5MzIxNgorICAvT3B0IFsgPGZlZmYwMDUzMDA3MDAwNjEwMDY5MDA2ZT4gPGZlZmYwMDUzMDA3NzAwNjUwMDY0MDA2NTAwNmU+IF0KKyAgL1AgMjEgMCBSCisgIC9SZWN0IFsgMTY1LjcgMzE1LjkgMzE1LjcgMzMwLjEgXQorICAvU3VidHlwZSAvV2lkZ2V0CisgIC9UIChDb3VudHJ5IEJveCkKKyAgL1R5cGUgL0Fubm90Cis+PgorZW5kb2JqCisKK3t7b2JqZWN0IDIxIDB9fQorPDwKKyAgL0Fubm90cyBbIDkgMCBSIF0KKyAgL0NvbnRlbnRzIDQ5IDAgUgorICAvTWVkaWFCb3ggWyAwIDAgNTk1IDM0MiBdCisgIC9QYXJlbnQgMjIgMCBSCisgIC9UeXBlIC9QYWdlCis+PgorZW5kb2JqCisKK3t7b2JqZWN0IDIyIDB9fQorPDwKKyAgL0NvdW50IDEKKyAgL0tpZHMgWyAyMSAwIFIgXQorICAvTWVkaWFCb3ggWyAwIDAgNTk1IDg0MiBdCisgIC9UeXBlIC9QYWdlcworPj4KK2VuZG9iagorCit7e29iamVjdCA0OSAwfX0KKzw8IC9MZW5ndGggODggPj4KK3N0cmVhbQorMC4xIHcKKzAgMCAwIFJHCisxIDEgMSByZworcSAwIDAuMSA1OTUuMiA4NDEuOCByZQorVyogbgorMTYzLjEgMzEzLjEgMTU1LjMgMTkuOSByZSBCKgorUQorZW5kc3RyZWFtCitlbmRvYmoKKwore3t4cmVmfX0KK3RyYWlsZXI8PCAvUm9vdCAxIDAgUiA+Pgore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2J1Z183MzY2OTVfNF9leHBlY3RlZC5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzM2Njk1XzRfZXhwZWN0ZWQucGRmLjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZDdiZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9idWdfNzM2Njk1XzRfZXhwZWN0ZWQucGRmLjAucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2ZvbnRfc2l6ZV9leHBlY3RlZC5wZGYuMC5wbmcgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9mb250X3NpemVfZXhwZWN0ZWQucGRmLjAucG5nCmluZGV4IGExNGRmMzYuLmI0NTA2ZTAgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2ZvbnRfc2l6ZV9leHBlY3RlZC5wZGYuMC5wbmcKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcGl4ZWwvZm9udF9zaXplX2V4cGVjdGVkLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9mb250X3NpemVfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3BpeGVsL2ZvbnRfc2l6ZV9leHBlY3RlZF9tYWMucGRmLjAucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZDA2OTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy9waXhlbC9mb250X3NpemVfZXhwZWN0ZWRfbWFjLnBkZi4wLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy9yZWN0YW5nbGVzLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvcmVjdGFuZ2xlcy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTkzMmZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcmVjdGFuZ2xlcy5pbgpAQCAtMCwwICsxLDQyIEBACit7e2hlYWRlcn19Cit7e29iamVjdCAxIDB9fSA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDIgMH19IDw8CisgIC9UeXBlIC9QYWdlcworICAvTWVkaWFCb3ggWyAwIDAgMjAwIDMwMCBdCisgIC9Db3VudCAxCisgIC9LaWRzIFsgMyAwIFIgXQorPj4KK2VuZG9iagore3tvYmplY3QgMyAwfX0gPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvQ29udGVudHMgNCAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDQgMH19IDw8Cis+Pgorc3RyZWFtCitxCiswIDAgMCByZworMCAyOTAgMTAgMTAgcmUgQioKKzEwIDE1MCA1MCAzMCByZSBCKgorMCAwIDEgcmcKKzE5MCAyOTAgMTAgMTAgcmUgQioKKzcwIDIzMiA1MCAzMCByZSBCKgorMCAxIDAgcmcKKzE5MCAwIDEwIDEwIHJlIEIqCisxMzAgMTUwIDUwIDMwIHJlIEIqCisxIDAgMCByZworMCAwIDEwIDEwIHJlIEIqCis3MCA2NyA1MCAzMCByZSBCKgorUQorZW5kc3RyZWFtCitlbmRvYmoKK3t7eHJlZn19Cit7e3RyYWlsZXJ9fQore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3JlY3RhbmdsZXMucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMvcmVjdGFuZ2xlcy5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhZDI1MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3JlY3RhbmdsZXMucGRmCkBAIC0wLDAgKzEsNTAgQEAKKyVQREYtMS43CisloPKk9AorMSAwIG9iaiA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKz4+CitlbmRvYmoKKzIgMCBvYmogPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9NZWRpYUJveCBbIDAgMCAyMDAgMzAwIF0KKyAgL0NvdW50IDEKKyAgL0tpZHMgWyAzIDAgUiBdCis+PgorZW5kb2JqCiszIDAgb2JqIDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL0NvbnRlbnRzIDQgMCBSCis+PgorZW5kb2JqCis0IDAgb2JqIDw8Cis+Pgorc3RyZWFtCitxCiswIDAgMCByZworMCAyOTAgMTAgMTAgcmUgQioKKzEwIDE1MCA1MCAzMCByZSBCKgorMCAwIDEgcmcKKzE5MCAyOTAgMTAgMTAgcmUgQioKKzcwIDIzMiA1MCAzMCByZSBCKgorMCAxIDAgcmcKKzE5MCAwIDEwIDEwIHJlIEIqCisxMzAgMTUwIDUwIDMwIHJlIEIqCisxIDAgMCByZworMCAwIDEwIDEwIHJlIEIqCis3MCA2NyA1MCAzMCByZSBCKgorUQorZW5kc3RyZWFtCitlbmRvYmoKK3hyZWYKKzAgNQorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAxNSAwMDAwMCBuIAorMDAwMDAwMDA2OCAwMDAwMCBuIAorMDAwMDAwMDE2MSAwMDAwMCBuIAorMDAwMDAwMDIzMCAwMDAwMCBuIAordHJhaWxlcjw8IC9Sb290IDEgMCBSIC9TaXplIDUgPj4KK3N0YXJ0eHJlZgorNDU2CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvcmVwZWF0X3ZpZXdlcl9yZWYuaW4gYi90ZXN0aW5nL3Jlc291cmNlcy9yZXBlYXRfdmlld2VyX3JlZi5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWExN2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcmVwZWF0X3ZpZXdlcl9yZWYuaW4KQEAgLTAsMCArMSwxOSBAQAore3toZWFkZXJ9fQore3tvYmplY3QgMSAwfX0KKzw8L05hbWVzPDwvSmF2YVNjcmlwdCAyIDAgUj4+L1ZpZXdlclByZWZlcmVuY2VzPDwKKzw8L05hbWVzPDwvSmF2YVNjcmlwdCAyIDAgUj4+L1ZpZXdlclByZWZlcmVuY2VzPDwKKzw8L05hbWVzPDwvSmF2YVNjcmlwdCAyIDAgUj4+L1ZpZXdlclByZWZlcmVuY2VzPDw+PgorZW5kb2JqCisKK3t7b2JqZWN0IDIgMH19Cis8PC9OYW1lc1soMCkgNyAwIFJdPj4KK2VuZG9iagorCit7e29iamVjdCA3IDB9fQorPDwvSlModGhpcy5wcmludFwoe2JVSTp0cnVlLGJTaWxlbnQ6ZmFsc2UsYlNocmlua1RvRml0OnRydWV9XCk7KS9TL0phdmFTY3JpcHQ+PgorZW5kb2JqCisKK3t7eHJlZn19Cit7e3RyYWlsZXJ9fQore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3JlcGVhdF92aWV3ZXJfcmVmLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3JlcGVhdF92aWV3ZXJfcmVmLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmJkN2U0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvcmVwZWF0X3ZpZXdlcl9yZWYucGRmCkBAIC0wLDAgKzEsMzAgQEAKKyVQREYtMS43CisloPKk9AorMSAwIG9iagorPDwvTmFtZXM8PC9KYXZhU2NyaXB0IDIgMCBSPj4vVmlld2VyUHJlZmVyZW5jZXM8PAorPDwvTmFtZXM8PC9KYXZhU2NyaXB0IDIgMCBSPj4vVmlld2VyUHJlZmVyZW5jZXM8PAorPDwvTmFtZXM8PC9KYXZhU2NyaXB0IDIgMCBSPj4vVmlld2VyUHJlZmVyZW5jZXM8PD4+CitlbmRvYmoKKworMiAwIG9iagorPDwvTmFtZXNbKDApIDcgMCBSXT4+CitlbmRvYmoKKworNyAwIG9iagorPDwvSlModGhpcy5wcmludFwoe2JVSTp0cnVlLGJTaWxlbnQ6ZmFsc2UsYlNocmlua1RvRml0OnRydWV9XCk7KS9TL0phdmFTY3JpcHQ+PgorZW5kb2JqCisKK3hyZWYKKzAgOAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAxNSAwMDAwMCBuIAorMDAwMDAwMDE4MyAwMDAwMCBuIAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDIyMSAwMDAwMCBuIAordHJhaWxlcjw8IC9Sb290IDEgMCBSIC9TaXplIDggPj4KK3N0YXJ0eHJlZgorMzE3CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdC94ZmFfbm9kZV9jYXB0aW9uLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3NpbXBsZV94ZmEucGRmCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gdGVzdC94ZmFfbm9kZV9jYXB0aW9uLnBkZgpjb3B5IHRvIHRlc3RpbmcvcmVzb3VyY2VzL3NpbXBsZV94ZmEucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3RleHRfZm9ybS5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3RleHRfZm9ybS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzBmMGJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvdGV4dF9mb3JtLmluCkBAIC0wLDAgKzEsNTggQEAKK3t7aGVhZGVyfX0KK3t7b2JqZWN0IDEgMH19Cis8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKyAgL0Fjcm9Gb3JtIDw8IC9GaWVsZHMgWyA0IDAgUiBdIC9EUiA1IDAgUiA+PgorPj4KK2VuZG9iagore3tvYmplY3QgMiAwfX0KKzw8IC9Db3VudCAxIC9LaWRzIFsgMyAwIFIgXSAvVHlwZSAvUGFnZXMgPj4KK2VuZG9iagore3tvYmplY3QgMyAwfX0KKzw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA1IDAgUgorICAvTWVkaWFCb3ggWyAwIDAgMzAwIDMwMCBdCisgIC9Db250ZW50cyA4IDAgUgorICAvQW5ub3RzIFsgNCAwIFIgXQorPj4KK2VuZG9iagore3tvYmplY3QgNCAwfX0KKzw8CisgIC9UeXBlIC9Bbm5vdAorICAvRlQgL1R4CisgIC9UIChUZXh0IEJveCkKKyAgL0RBICgwIDAgMCByZyAvRjEgMTIgVGYpCisgIC9SZWN0IFsgMTAwIDEwMCAyMDAgMTMwIF0KKyAgL1N1YnR5cGUgL1dpZGdldAorPj4KK2VuZG9iagore3tvYmplY3QgNSAwfX0KKzw8IC9Gb250IDYgMCBSID4+CitlbmRvYmoKK3t7b2JqZWN0IDYgMH19Cis8PCAvRjEgNyAwIFIgPj4KK2VuZG9iagore3tvYmplY3QgNyAwfX0gPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvSGVsdmV0aWNhCis+PgorZW5kb2JqCit7e29iamVjdCA4IDB9fQorPDwgL0xlbmd0aCA1MSA+Pgorc3RyZWFtCitCVAorMCAwIDAgcmcKKy9GMSAxMiBUZgorMTAwIDE1MCBUZAorKFRlc3QgRm9ybSkgVGoKK0VUCitlbmRzdHJlYW0KK2VuZG9iagore3t4cmVmfX0KK3t7dHJhaWxlcn19Cit7e3N0YXJ0eHJlZn19CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvdGV4dF9mb3JtLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3RleHRfZm9ybS5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYzYWI4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3RleHRfZm9ybS5wZGYKQEAgLTAsMCArMSw3MCBAQAorJVBERi0xLjcKKyWg8qT0CisxIDAgb2JqCis8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKyAgL0Fjcm9Gb3JtIDw8IC9GaWVsZHMgWyA0IDAgUiBdIC9EUiA1IDAgUiA+PgorPj4KK2VuZG9iagorMiAwIG9iagorPDwgL0NvdW50IDEgL0tpZHMgWyAzIDAgUiBdIC9UeXBlIC9QYWdlcyA+PgorZW5kb2JqCiszIDAgb2JqCis8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgNSAwIFIKKyAgL01lZGlhQm94IFsgMCAwIDMwMCAzMDAgXQorICAvQ29udGVudHMgOCAwIFIKKyAgL0Fubm90cyBbIDQgMCBSIF0KKz4+CitlbmRvYmoKKzQgMCBvYmoKKzw8CisgIC9UeXBlIC9Bbm5vdAorICAvRlQgL1R4CisgIC9UIChUZXh0IEJveCkKKyAgL0RBICgwIDAgMCByZyAvRjEgMTIgVGYpCisgIC9SZWN0IFsgMTAwIDEwMCAyMDAgMTMwIF0KKyAgL1N1YnR5cGUgL1dpZGdldAorPj4KK2VuZG9iagorNSAwIG9iagorPDwgL0ZvbnQgNiAwIFIgPj4KK2VuZG9iagorNiAwIG9iagorPDwgL0YxIDcgMCBSID4+CitlbmRvYmoKKzcgMCBvYmogPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvSGVsdmV0aWNhCis+PgorZW5kb2JqCis4IDAgb2JqCis8PCAvTGVuZ3RoIDUxID4+CitzdHJlYW0KK0JUCiswIDAgMCByZworL0YxIDEyIFRmCisxMDAgMTUwIFRkCisoVGVzdCBGb3JtKSBUagorRVQKK2VuZHN0cmVhbQorZW5kb2JqCit4cmVmCiswIDkKKzAwMDAwMDAwMDAgNjU1MzUgZiAKKzAwMDAwMDAwMTUgMDAwMDAgbiAKKzAwMDAwMDAxMTQgMDAwMDAgbiAKKzAwMDAwMDAxNzMgMDAwMDAgbiAKKzAwMDAwMDAzMDkgMDAwMDAgbiAKKzAwMDAwMDA0NDUgMDAwMDAgbiAKKzAwMDAwMDA0NzggMDAwMDAgbiAKKzAwMDAwMDA1MDkgMDAwMDAgbiAKKzAwMDAwMDA1ODUgMDAwMDAgbiAKK3RyYWlsZXI8PCAvUm9vdCAxIDAgUiAvU2l6ZSA5ID4+CitzdGFydHhyZWYKKzY4NQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3RleHRfZm9ybV9tdWx0aXBsZS5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3RleHRfZm9ybV9tdWx0aXBsZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzZlMTU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvdGV4dF9mb3JtX211bHRpcGxlLmluCkBAIC0wLDAgKzEsODEgQEAKK3t7aGVhZGVyfX0KK3t7b2JqZWN0IDEgMH19Cis8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKyAgL0Fjcm9Gb3JtIDw8IC9GaWVsZHMgWyA0IDAgUiA5IDAgUiAxMCAwIFIgXSAvRFIgNSAwIFIgPj4KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDIgMH19Cis8PCAvQ291bnQgMSAvS2lkcyBbIDMgMCBSIF0gL1R5cGUgL1BhZ2VzID4+CitlbmRvYmoKK3t7b2JqZWN0IDMgMH19Cis8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgNSAwIFIKKyAgL01lZGlhQm94IFsgMCAwIDMwMCAzMDAgXQorICAvQ29udGVudHMgOCAwIFIKKyAgL0Fubm90cyBbIDQgMCBSIDkgMCBSIDEwIDAgUiBdCis+PgorZW5kb2JqCit7e29iamVjdCA0IDB9fQorPDwKKyAgL1R5cGUgL0Fubm90CisgIC9GVCAvVHgKKyAgL1QgKFRleHQgQm94KQorICAvREEgKDAgMCAwIHJnIC9GMSAxMiBUZikKKyAgL1JlY3QgWyAxMDAgMTAwIDIwMCAxMzAgXQorICAvU3VidHlwZSAvV2lkZ2V0Cis+PgorZW5kb2JqCit7e29iamVjdCA1IDB9fQorPDwgL0ZvbnQgNiAwIFIgPj4KK2VuZG9iagore3tvYmplY3QgNiAwfX0KKzw8IC9GMSA3IDAgUiA+PgorZW5kb2JqCit7e29iamVjdCA3IDB9fSA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9IZWx2ZXRpY2EKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDggMH19Cis8PCAvTGVuZ3RoIDUxID4+CitzdHJlYW0KK0JUCiswIDAgMCByZworL0YxIDEyIFRmCisxMDAgMTUwIFRkCisoVGVzdCBGb3JtKSBUagorRVQKK2VuZHN0cmVhbQorZW5kb2JqCit7e29iamVjdCA5IDB9fQorPDwKKyAgL1R5cGUgL0Fubm90CisgIC9GVCAvVHgKKyAgL0ZmIDEKKyAgL1QgKFJlYWRPbmx5KQorICAvREEgKDAgMCAwIHJnIC9GMSAxMiBUZikKKyAgL1JlY3QgWyAxMDAgMjAwIDIwMCAyMzAgXQorICAvU3VidHlwZSAvV2lkZ2V0Cis+PgorZW5kb2JqCit7e29iamVjdCAxMCAwfX0KKzw8CisgIC9UeXBlIC9Bbm5vdAorICAvRlQgL1R4CisgIC9UIChDaGFyTGltaXQpCisgIC9NYXhMZW4gMTAKKyAgL0RBICgwIDAgMCByZyAvRjEgMTIgVGYpCisgIC9WIChFbGVwaGFudCkKKyAgL1JlY3QgWyAxMDAgNTAgMjAwIDc1IF0KKyAgL1N1YnR5cGUgL1dpZGdldAorPj4KK2VuZG9iagore3t4cmVmfX0KK3t7dHJhaWxlcn19Cit7e3N0YXJ0eHJlZn19CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvdGV4dF9mb3JtX211bHRpcGxlLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3RleHRfZm9ybV9tdWx0aXBsZS5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcyYWI1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3RleHRfZm9ybV9tdWx0aXBsZS5wZGYKQEAgLTAsMCArMSw5NSBAQAorJVBERi0xLjcKKyWg8qT0CisxIDAgb2JqCis8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKyAgL0Fjcm9Gb3JtIDw8IC9GaWVsZHMgWyA0IDAgUiA5IDAgUiAxMCAwIFIgXSAvRFIgNSAwIFIgPj4KKz4+CitlbmRvYmoKKzIgMCBvYmoKKzw8IC9Db3VudCAxIC9LaWRzIFsgMyAwIFIgXSAvVHlwZSAvUGFnZXMgPj4KK2VuZG9iagorMyAwIG9iagorPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvUmVzb3VyY2VzIDUgMCBSCisgIC9NZWRpYUJveCBbIDAgMCAzMDAgMzAwIF0KKyAgL0NvbnRlbnRzIDggMCBSCisgIC9Bbm5vdHMgWyA0IDAgUiA5IDAgUiAxMCAwIFIgXQorPj4KK2VuZG9iagorNCAwIG9iagorPDwKKyAgL1R5cGUgL0Fubm90CisgIC9GVCAvVHgKKyAgL1QgKFRleHQgQm94KQorICAvREEgKDAgMCAwIHJnIC9GMSAxMiBUZikKKyAgL1JlY3QgWyAxMDAgMTAwIDIwMCAxMzAgXQorICAvU3VidHlwZSAvV2lkZ2V0Cis+PgorZW5kb2JqCis1IDAgb2JqCis8PCAvRm9udCA2IDAgUiA+PgorZW5kb2JqCis2IDAgb2JqCis8PCAvRjEgNyAwIFIgPj4KK2VuZG9iagorNyAwIG9iaiA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9IZWx2ZXRpY2EKKz4+CitlbmRvYmoKKzggMCBvYmoKKzw8IC9MZW5ndGggNTEgPj4KK3N0cmVhbQorQlQKKzAgMCAwIHJnCisvRjEgMTIgVGYKKzEwMCAxNTAgVGQKKyhUZXN0IEZvcm0pIFRqCitFVAorZW5kc3RyZWFtCitlbmRvYmoKKzkgMCBvYmoKKzw8CisgIC9UeXBlIC9Bbm5vdAorICAvRlQgL1R4CisgIC9GZiAxCisgIC9UIChSZWFkT25seSkKKyAgL0RBICgwIDAgMCByZyAvRjEgMTIgVGYpCisgIC9SZWN0IFsgMTAwIDIwMCAyMDAgMjMwIF0KKyAgL1N1YnR5cGUgL1dpZGdldAorPj4KK2VuZG9iagorMTAgMCBvYmoKKzw8CisgIC9UeXBlIC9Bbm5vdAorICAvRlQgL1R4CisgIC9UIChDaGFyTGltaXQpCisgIC9NYXhMZW4gMTAKKyAgL0RBICgwIDAgMCByZyAvRjEgMTIgVGYpCisgIC9WIChFbGVwaGFudCkKKyAgL1JlY3QgWyAxMDAgNTAgMjAwIDc1IF0KKyAgL1N1YnR5cGUgL1dpZGdldAorPj4KK2VuZG9iagoreHJlZgorMCAxMQorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAxNSAwMDAwMCBuIAorMDAwMDAwMDEyNyAwMDAwMCBuIAorMDAwMDAwMDE4NiAwMDAwMCBuIAorMDAwMDAwMDMzNSAwMDAwMCBuIAorMDAwMDAwMDQ3MSAwMDAwMCBuIAorMDAwMDAwMDUwNCAwMDAwMCBuIAorMDAwMDAwMDUzNSAwMDAwMCBuIAorMDAwMDAwMDYxMSAwMDAwMCBuIAorMDAwMDAwMDcxMSAwMDAwMCBuIAorMDAwMDAwMDg1NSAwMDAwMCBuIAordHJhaWxlcjw8IC9Sb290IDEgMCBSIC9TaXplIDExID4+CitzdGFydHhyZWYKKzEwMjAKKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy91bnN1cHBvcnRlZF9mZWF0dXJlLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvdW5zdXBwb3J0ZWRfZmVhdHVyZS5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzA4MDUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvdW5zdXBwb3J0ZWRfZmVhdHVyZS5pbgpAQCAtMCwwICsxLDMwIEBACit7e2hlYWRlcn19Cit7e29iamVjdCAxIDB9fSA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKyAgL0NvbGxlY3Rpb24gL1Rlc3QKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDIgMH19IDw8CisgIC9UeXBlIC9QYWdlcworICAvQ291bnQgMworICAvS2lkcyBbCisgICAgMyAwIFIKKyAgXQorPj4KK2VuZG9iagorJSBQYWdlIG51bWJlciAwLgore3tvYmplY3QgMyAwfX0gPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvUmVzb3VyY2VzIDw8CisgICAgL0ZvbnQgPDwvRjEgMTUgMCBSPj4KKyAgPj4KKyAgL01lZGlhQm94IFswIDAgNjEyIDc5Ml0KKyAgL1RhYnMgL1IKKz4+CitlbmRvYmoKK3t7eHJlZn19Cit7e3RyYWlsZXJ9fQore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3Vuc3VwcG9ydGVkX2ZlYXR1cmUucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMvdW5zdXBwb3J0ZWRfZmVhdHVyZS5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI3ZWUwOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3Vuc3VwcG9ydGVkX2ZlYXR1cmUucGRmCkBAIC0wLDAgKzEsMzcgQEAKKyVQREYtMS43CisloPKk9AorMSAwIG9iaiA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKyAgL0NvbGxlY3Rpb24gL1Rlc3QKKz4+CitlbmRvYmoKKzIgMCBvYmogPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9Db3VudCAzCisgIC9LaWRzIFsKKyAgICAzIDAgUgorICBdCis+PgorZW5kb2JqCislIFBhZ2UgbnVtYmVyIDAuCiszIDAgb2JqIDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA8PAorICAgIC9Gb250IDw8L0YxIDE1IDAgUj4+CisgID4+CisgIC9NZWRpYUJveCBbMCAwIDYxMiA3OTJdCisgIC9UYWJzIC9SCis+PgorZW5kb2JqCit4cmVmCiswIDQKKzAwMDAwMDAwMDAgNjU1MzUgZiAKKzAwMDAwMDAwMTUgMDAwMDAgbiAKKzAwMDAwMDAwODggMDAwMDAgbiAKKzAwMDAwMDAxNzYgMDAwMDAgbiAKK3RyYWlsZXI8PCAvUm9vdCAxIDAgUiAvU2l6ZSA0ID4+CitzdGFydHhyZWYKKzMxMAorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3VzZV9vdXRsaW5lcy5pbiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3VzZV9vdXRsaW5lcy5pbgppbmRleCBiMzQ0MTQzLi43YjA5ZmY5IDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy91c2Vfb3V0bGluZXMuaW4KKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvdXNlX291dGxpbmVzLmluCkBAIC00LDYgKzQsNyBAQAogICAvUGFnZXMgMiAwIFIKICAgL1BhZ2VNb2RlIC9Vc2VPdXRsaW5lcwogPj4KK2VuZG9iagoge3tvYmplY3QgMiAwfX0gPDwKICAgL1R5cGUgL1BhZ2VzCiAgIC9NZWRpYUJveCBbIDAgMCAyMDAgMjAwIF0KQEAgLTQ5LDkgKzUwLDYgQEAKIGVuZHN0cmVhbQogZW5kb2JqCiB7e3hyZWZ9fQotdHJhaWxlciA8PAotICAvU2l6ZSA2Ci0gIC9Sb290IDEgMCBSCi0+Pgore3t0cmFpbGVyfX0KIHt7c3RhcnR4cmVmfX0KICUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy91c2Vfb3V0bGluZXMucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMvdXNlX291dGxpbmVzLnBkZgppbmRleCAzNzFmZjQwLi44MWIwMWNhIDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy91c2Vfb3V0bGluZXMucGRmCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3VzZV9vdXRsaW5lcy5wZGYKQEAgLTUsNiArNSw3IEBACiAgIC9QYWdlcyAyIDAgUgogICAvUGFnZU1vZGUgL1VzZU91dGxpbmVzCiA+PgorZW5kb2JqCiAyIDAgb2JqIDw8CiAgIC9UeXBlIC9QYWdlcwogICAvTWVkaWFCb3ggWyAwIDAgMjAwIDIwMCBdCkBAIC01MywxNSArNTQsMTIgQEAKIDAgNwogMDAwMDAwMDAwMCA2NTUzNSBmIAogMDAwMDAwMDAxNSAwMDAwMCBuIAotMDAwMDAwMDA4NiAwMDAwMCBuIAotMDAwMDAwMDE3OSAwMDAwMCBuIAotMDAwMDAwMDMyMSAwMDAwMCBuIAotMDAwMDAwMDM5OSAwMDAwMCBuIAotMDAwMDAwMDQ3NSAwMDAwMCBuIAotdHJhaWxlciA8PAotICAvU2l6ZSA2Ci0gIC9Sb290IDEgMCBSCi0+PgorMDAwMDAwMDA5MyAwMDAwMCBuIAorMDAwMDAwMDE4NiAwMDAwMCBuIAorMDAwMDAwMDMyOCAwMDAwMCBuIAorMDAwMDAwMDQwNiAwMDAwMCBuIAorMDAwMDAwMDQ4MiAwMDAwMCBuIAordHJhaWxlcjw8IC9Sb290IDEgMCBSIC9TaXplIDcgPj4KIHN0YXJ0eHJlZgotNTk2Cis2MDMKICUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy92aWV3ZXJfcmVmLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvdmlld2VyX3JlZi5pbgppbmRleCA2MmFlMzcyLi43MDRlOWQzIDEwMDY0NAotLS0gYS90ZXN0aW5nL3Jlc291cmNlcy92aWV3ZXJfcmVmLmluCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3ZpZXdlcl9yZWYuaW4KQEAgLTQ5LDkgKzQ5LDYgQEAKIGVuZHN0cmVhbQogZW5kb2JqCiB7e3hyZWZ9fQotdHJhaWxlciA8PAotICAvU2l6ZSA2Ci0gIC9Sb290IDEgMCBSCi0+Pgore3t0cmFpbGVyfX0KIHt7c3RhcnR4cmVmfX0KICUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy92aWV3ZXJfcmVmLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3ZpZXdlcl9yZWYucGRmCmluZGV4IGZiNzIxMDcuLjg1MWVhMjcgMTAwNjQ0Ci0tLSBhL3Rlc3RpbmcvcmVzb3VyY2VzL3ZpZXdlcl9yZWYucGRmCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3ZpZXdlcl9yZWYucGRmCkBAIC03MywxMCArNzMsNyBAQAogMDAwMDAwMDAwMCA2NTUzNSBmIAogMDAwMDAwMDAwMCA2NTUzNSBmIAogMDAwMDAwMDUzNyAwMDAwMCBuIAotdHJhaWxlciA8PAotICAvU2l6ZSA2Ci0gIC9Sb290IDEgMCBSCi0+PgordHJhaWxlcjw8IC9Sb290IDEgMCBSIC9TaXplIDIyID4+CiBzdGFydHhyZWYKIDYyNQogJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3dlYmxpbmtzLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvd2VibGlua3MuaW4KaW5kZXggZWQyMGIyZS4uODE4ZTY3NiAxMDA2NDQKLS0tIGEvdGVzdGluZy9yZXNvdXJjZXMvd2VibGlua3MuaW4KKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvd2VibGlua3MuaW4KQEAgLTMsNiArMyw3IEBACiAgIC9UeXBlIC9DYXRhbG9nCiAgIC9QYWdlcyAyIDAgUgogPj4KK2VuZG9iagoge3tvYmplY3QgMiAwfX0gPDwKICAgL1R5cGUgL1BhZ2VzCiAgIC9NZWRpYUJveCBbIDAgMCA2MDAgNjAwIF0KQEAgLTU4LDkgKzU5LDYgQEAKIGVuZHN0cmVhbQogZW5kb2JqCiB7e3hyZWZ9fQotdHJhaWxlciA8PAotICAvU2l6ZSA2Ci0gIC9Sb290IDEgMCBSCi0+Pgore3t0cmFpbGVyfX0KIHt7c3RhcnR4cmVmfX0KICUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy93ZWJsaW5rcy5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy93ZWJsaW5rcy5wZGYKaW5kZXggMGQyMDFhNC4uMjYzOWJlOCAxMDA2NDQKLS0tIGEvdGVzdGluZy9yZXNvdXJjZXMvd2VibGlua3MucGRmCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3dlYmxpbmtzLnBkZgpAQCAtNCw2ICs0LDcgQEAKICAgL1R5cGUgL0NhdGFsb2cKICAgL1BhZ2VzIDIgMCBSCiA+PgorZW5kb2JqCiAyIDAgb2JqIDw8CiAgIC9UeXBlIC9QYWdlcwogICAvTWVkaWFCb3ggWyAwIDAgNjAwIDYwMCBdCkBAIC02MiwxNSArNjMsMTIgQEAKIDAgNwogMDAwMDAwMDAwMCA2NTUzNSBmIAogMDAwMDAwMDAxNSAwMDAwMCBuIAotMDAwMDAwMDA2MSAwMDAwMCBuIAotMDAwMDAwMDE1NCAwMDAwMCBuIAotMDAwMDAwMDM3NCAwMDAwMCBuIAorMDAwMDAwMDA2OCAwMDAwMCBuIAorMDAwMDAwMDE2MSAwMDAwMCBuIAorMDAwMDAwMDM4MSAwMDAwMCBuIAogMDAwMDAwMDAwMCA2NTUzNSBmIAotMDAwMDAwMDQ1MCAwMDAwMCBuIAotdHJhaWxlciA8PAotICAvU2l6ZSA2Ci0gIC9Sb290IDEgMCBSCi0+PgorMDAwMDAwMDQ1NyAwMDAwMCBuIAordHJhaWxlcjw8IC9Sb290IDEgMCBSIC9TaXplIDcgPj4KIHN0YXJ0eHJlZgotOTYzCis5NzAKICUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy93ZWJsaW5rc19hY3Jvc3NfbGluZXMuaW4gYi90ZXN0aW5nL3Jlc291cmNlcy93ZWJsaW5rc19hY3Jvc3NfbGluZXMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc3MTUzNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3dlYmxpbmtzX2Fjcm9zc19saW5lcy5pbgpAQCAtMCwwICsxLDcyIEBACit7e2hlYWRlcn19Cit7e29iamVjdCAxIDB9fSA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDIgMH19IDw8CisgIC9UeXBlIC9QYWdlcworICAvTWVkaWFCb3ggWyAwIDAgNjAwIDYwMCBdCisgIC9Db3VudCAxCisgIC9LaWRzIFsgMyAwIFIgXQorPj4KK2VuZG9iagore3tvYmplY3QgMyAwfX0gPDwKKyAgL1R5cGUgL1BhZ2UKKyAgL1BhcmVudCAyIDAgUgorICAvUmVzb3VyY2VzIDw8CisgICAgL0ZvbnQgPDwKKyAgICAgIC9GMSA0IDAgUgorICAgICAgL0YyIDUgMCBSCisgICAgPj4KKyAgPj4KKyAgL0NvbnRlbnRzIDYgMCBSCis+PgorZW5kb2JqCit7e29iamVjdCA0IDB9fSA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9UaW1lcy1Sb21hbgorPj4KK2VuZG9iagore3tvYmplY3QgNSAwfX0gPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvSGVsdmV0aWNhCis+PgorZW5kb2JqCit7e29iamVjdCA2IDB9fSA8PAorPj4KK3N0cmVhbQorQlQKKy9GMSAxMiBUZgorNTAgNTAgVGQKKyhIZWxsbywgd29ybGQhIFRoaXMgaXMgbm90IGEgbGluay4pIFRqCiswIDUwIFRkCisoSXMgdGhpcyBodHRwOi8vZXhhbXBsZS5jb20/KSBUagorMCA1MCBUZAorKGZvbyBhIGxpbms/KSBUagorL0YyIDE0IFRmCiswIDUwIFRkCisoSG93IGFib3V0IHRoaXMgaHR0cDovL2V4YW1wbGUuY29tLykgVGoKKzAgNTAgVGQKKyhmb28gYSBsaW5rPykgVGoKKzAgNTAgVGQKKyhJcyB0aGlzIGh0dHA6Ly9leGFtcGxlLmNvbS90ZXN0LSkgVGoKKzAgNTAgVGQKKyhmb28gYSBsaW5rPykgVGoKKyhJcyB0aGlzIGh0dHA6Ly9hYmMuY29tL3Rlc3QtKSBUagorMCA1MCBUZAorMCA1MCBUZAorKGZvbyBhIGxpbms/KSBUagorMCA1MCBUZAorKEFuZCB0aGlzIGh0dHA6Ly9leGFtcGxlLmNvbS8pIFRqCiswIDUwIFRkCisoaHR0cDovL3d3dy5hYmMuY29tIGEgbGluaz8pIFRqCitFVAorZW5kc3RyZWFtCitlbmRvYmoKK3t7eHJlZn19Cit7e3RyYWlsZXJ9fQore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3dlYmxpbmtzX2Fjcm9zc19saW5lcy5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy93ZWJsaW5rc19hY3Jvc3NfbGluZXMucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MDkxMGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy93ZWJsaW5rc19hY3Jvc3NfbGluZXMucGRmCkBAIC0wLDAgKzEsODIgQEAKKyVQREYtMS43CisloPKk9AorMSAwIG9iaiA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKz4+CitlbmRvYmoKKzIgMCBvYmogPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9NZWRpYUJveCBbIDAgMCA2MDAgNjAwIF0KKyAgL0NvdW50IDEKKyAgL0tpZHMgWyAzIDAgUiBdCis+PgorZW5kb2JqCiszIDAgb2JqIDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA8PAorICAgIC9Gb250IDw8CisgICAgICAvRjEgNCAwIFIKKyAgICAgIC9GMiA1IDAgUgorICAgID4+CisgID4+CisgIC9Db250ZW50cyA2IDAgUgorPj4KK2VuZG9iagorNCAwIG9iaiA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9UaW1lcy1Sb21hbgorPj4KK2VuZG9iagorNSAwIG9iaiA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9IZWx2ZXRpY2EKKz4+CitlbmRvYmoKKzYgMCBvYmogPDwKKz4+CitzdHJlYW0KK0JUCisvRjEgMTIgVGYKKzUwIDUwIFRkCisoSGVsbG8sIHdvcmxkISBUaGlzIGlzIG5vdCBhIGxpbmsuKSBUagorMCA1MCBUZAorKElzIHRoaXMgaHR0cDovL2V4YW1wbGUuY29tPykgVGoKKzAgNTAgVGQKKyhmb28gYSBsaW5rPykgVGoKKy9GMiAxNCBUZgorMCA1MCBUZAorKEhvdyBhYm91dCB0aGlzIGh0dHA6Ly9leGFtcGxlLmNvbS8pIFRqCiswIDUwIFRkCisoZm9vIGEgbGluaz8pIFRqCiswIDUwIFRkCisoSXMgdGhpcyBodHRwOi8vZXhhbXBsZS5jb20vdGVzdC0pIFRqCiswIDUwIFRkCisoZm9vIGEgbGluaz8pIFRqCisoSXMgdGhpcyBodHRwOi8vYWJjLmNvbS90ZXN0LSkgVGoKKzAgNTAgVGQKKzAgNTAgVGQKKyhmb28gYSBsaW5rPykgVGoKKzAgNTAgVGQKKyhBbmQgdGhpcyBodHRwOi8vZXhhbXBsZS5jb20vKSBUagorMCA1MCBUZAorKGh0dHA6Ly93d3cuYWJjLmNvbSBhIGxpbms/KSBUagorRVQKK2VuZHN0cmVhbQorZW5kb2JqCit4cmVmCiswIDcKKzAwMDAwMDAwMDAgNjU1MzUgZiAKKzAwMDAwMDAwMTUgMDAwMDAgbiAKKzAwMDAwMDAwNjggMDAwMDAgbiAKKzAwMDAwMDAxNjEgMDAwMDAgbiAKKzAwMDAwMDAzMDMgMDAwMDAgbiAKKzAwMDAwMDAzODEgMDAwMDAgbiAKKzAwMDAwMDA0NTcgMDAwMDAgbiAKK3RyYWlsZXI8PCAvUm9vdCAxIDAgUiAvU2l6ZSA3ID4+CitzdGFydHhyZWYKKzkyOAorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3QvYmFyY29kZV90ZXN0LnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3hmYS9iYXJjb2RlX3Rlc3QucGRmCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0L2JhcmNvZGVfdGVzdC5wZGYKcmVuYW1lIHRvIHRlc3RpbmcvcmVzb3VyY2VzL3hmYS9iYXJjb2RlX3Rlc3QucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZHluYW1pY19saXN0X2JveF9hbGxvd19tdWx0aXBsZV9zZWxlY3Rpb24ucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMveGZhL2R5bmFtaWNfbGlzdF9ib3hfYWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uLnBkZgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9keW5hbWljX2xpc3RfYm94X2FsbG93X211bHRpcGxlX3NlbGVjdGlvbi5wZGYKcmVuYW1lIHRvIHRlc3RpbmcvcmVzb3VyY2VzL3hmYS9keW5hbWljX2xpc3RfYm94X2FsbG93X211bHRpcGxlX3NlbGVjdGlvbi5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9keW5hbWljX3Bhc3N3b3JkX2ZpZWxkX2JhY2tncm91bmRfZmlsbC5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy94ZmEvZHluYW1pY19wYXNzd29yZF9maWVsZF9iYWNrZ3JvdW5kX2ZpbGwucGRmCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0L2R5bmFtaWNfcGFzc3dvcmRfZmllbGRfYmFja2dyb3VuZF9maWxsLnBkZgpyZW5hbWUgdG8gdGVzdGluZy9yZXNvdXJjZXMveGZhL2R5bmFtaWNfcGFzc3dvcmRfZmllbGRfYmFja2dyb3VuZF9maWxsLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L2R5bmFtaWNfdGFibGVfY29sb3JfYW5kX3dpZHRoLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3hmYS9keW5hbWljX3RhYmxlX2NvbG9yX2FuZF93aWR0aC5wZGYKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3QvZHluYW1pY190YWJsZV9jb2xvcl9hbmRfd2lkdGgucGRmCnJlbmFtZSB0byB0ZXN0aW5nL3Jlc291cmNlcy94ZmEvZHluYW1pY190YWJsZV9jb2xvcl9hbmRfd2lkdGgucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3QvZW1haWxfcmVjb21tZW5kZWQucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMveGZhL2VtYWlsX3JlY29tbWVuZGVkLnBkZgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9lbWFpbF9yZWNvbW1lbmRlZC5wZGYKcmVuYW1lIHRvIHRlc3RpbmcvcmVzb3VyY2VzL3hmYS9lbWFpbF9yZWNvbW1lbmRlZC5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC9yZXNvbHZlX25vZGVzLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3hmYS9yZXNvbHZlX25vZGVzLnBkZgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdC9yZXNvbHZlX25vZGVzLnBkZgpyZW5hbWUgdG8gdGVzdGluZy9yZXNvdXJjZXMveGZhL3Jlc29sdmVfbm9kZXMucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3Qvc3RhbmRhcmRfc3ltYm9scy5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy94ZmEvc3RhbmRhcmRfc3ltYm9scy5wZGYKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3Qvc3RhbmRhcmRfc3ltYm9scy5wZGYKcmVuYW1lIHRvIHRlc3RpbmcvcmVzb3VyY2VzL3hmYS9zdGFuZGFyZF9zeW1ib2xzLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L3N0YXRpY19saXN0X2JveF9jYXB0aW9uLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3hmYS9zdGF0aWNfbGlzdF9ib3hfY2FwdGlvbi5wZGYKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3Qvc3RhdGljX2xpc3RfYm94X2NhcHRpb24ucGRmCnJlbmFtZSB0byB0ZXN0aW5nL3Jlc291cmNlcy94ZmEvc3RhdGljX2xpc3RfYm94X2NhcHRpb24ucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3Qvc3RhdGljX3Bhc3N3b3JkX2ZpZWxkX3JvdGF0ZS5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy94ZmEvc3RhdGljX3Bhc3N3b3JkX2ZpZWxkX3JvdGF0ZS5wZGYKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3Qvc3RhdGljX3Bhc3N3b3JkX2ZpZWxkX3JvdGF0ZS5wZGYKcmVuYW1lIHRvIHRlc3RpbmcvcmVzb3VyY2VzL3hmYS9zdGF0aWNfcGFzc3dvcmRfZmllbGRfcm90YXRlLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0L3hmYV9ub2RlX2NhcHRpb24ucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMveGZhL3hmYV9ub2RlX2NhcHRpb24ucGRmCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0L3hmYV9ub2RlX2NhcHRpb24ucGRmCnJlbmFtZSB0byB0ZXN0aW5nL3Jlc291cmNlcy94ZmEveGZhX25vZGVfY2FwdGlvbi5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvemVyb19sZW5ndGhfc3RyZWFtLmluIGIvdGVzdGluZy9yZXNvdXJjZXMvemVyb19sZW5ndGhfc3RyZWFtLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MjAzNDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy96ZXJvX2xlbmd0aF9zdHJlYW0uaW4KQEAgLTAsMCArMSw2MCBAQAore3toZWFkZXJ9fQore3tvYmplY3QgMSAwfX0gPDwKKyAgL1R5cGUgL0NhdGFsb2cKKyAgL1BhZ2VzIDIgMCBSCis+Pgore3tvYmplY3QgMiAwfX0gPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9NZWRpYUJveCBbIDAgMCAyMDAgMjAwIF0KKyAgL0NvdW50IDEKKyAgL0tpZHMgWyAzIDAgUiBdCis+PgorZW5kb2JqCit7e29iamVjdCAzIDB9fSA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvRm9udCA8PAorICAgICAgL0YxIDQgMCBSCisgICAgICAvRjIgNSAwIFIKKyAgICA+PgorICA+PgorICAvQ29udGVudHMgWzYgMCBSIDcgMCBSXQorPj4KK2VuZG9iagore3tvYmplY3QgNCAwfX0gPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvVGltZXMtUm9tYW4KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDUgMH19IDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL0hlbHZldGljYQorPj4KK2VuZG9iagore3tvYmplY3QgNiAwfX0gPDwKKyAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKKyAgL0xlbmd0aCAwCis+Pgorc3RyZWFtCitlbmRzdHJlYW0KK2VuZG9iagore3tvYmplY3QgNyAwfX0gPDwKKz4+CitzdHJlYW0KK0JUCisyMCA1MCBUZAorL0YxIDEyIFRmCisoSGVsbG8sIHdvcmxkISkgVGoKKzAgNTAgVGQKKy9GMiAxNiBUZgorKEdvb2RieWUsIHdvcmxkISkgVGoKK0VUCitlbmRzdHJlYW0KK2VuZG9iagore3t4cmVmfX0KK3t7dHJhaWxlcn19Cit7e3N0YXJ0eHJlZn19CislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy9yZXNvdXJjZXMvemVyb19sZW5ndGhfc3RyZWFtLnBkZiBiL3Rlc3RpbmcvcmVzb3VyY2VzL3plcm9fbGVuZ3RoX3N0cmVhbS5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMxN2MzZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3plcm9fbGVuZ3RoX3N0cmVhbS5wZGYKQEAgLTAsMCArMSw3MSBAQAorJVBERi0xLjcKKyWg8qT0CisxIDAgb2JqIDw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorPj4KKzIgMCBvYmogPDwKKyAgL1R5cGUgL1BhZ2VzCisgIC9NZWRpYUJveCBbIDAgMCAyMDAgMjAwIF0KKyAgL0NvdW50IDEKKyAgL0tpZHMgWyAzIDAgUiBdCis+PgorZW5kb2JqCiszIDAgb2JqIDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA8PAorICAgIC9Gb250IDw8CisgICAgICAvRjEgNCAwIFIKKyAgICAgIC9GMiA1IDAgUgorICAgID4+CisgID4+CisgIC9Db250ZW50cyBbNiAwIFIgNyAwIFJdCis+PgorZW5kb2JqCis0IDAgb2JqIDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL1RpbWVzLVJvbWFuCis+PgorZW5kb2JqCis1IDAgb2JqIDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL0hlbHZldGljYQorPj4KK2VuZG9iagorNiAwIG9iaiA8PAorICAvRmlsdGVyIC9GbGF0ZURlY29kZQorICAvTGVuZ3RoIDAKKz4+CitzdHJlYW0KK2VuZHN0cmVhbQorZW5kb2JqCis3IDAgb2JqIDw8Cis+Pgorc3RyZWFtCitCVAorMjAgNTAgVGQKKy9GMSAxMiBUZgorKEhlbGxvLCB3b3JsZCEpIFRqCiswIDUwIFRkCisvRjIgMTYgVGYKKyhHb29kYnllLCB3b3JsZCEpIFRqCitFVAorZW5kc3RyZWFtCitlbmRvYmoKK3hyZWYKKzAgOAorMDAwMDAwMDAwMCA2NTUzNSBmIAorMDAwMDAwMDAxNSAwMDAwMCBuIAorMDAwMDAwMDA2MSAwMDAwMCBuIAorMDAwMDAwMDE1NCAwMDAwMCBuIAorMDAwMDAwMDMwNCAwMDAwMCBuIAorMDAwMDAwMDM4MiAwMDAwMCBuIAorMDAwMDAwMDQ1OCAwMDAwMCBuIAorMDAwMDAwMDUzMSAwMDAwMCBuIAordHJhaWxlcjw8IC9Sb290IDEgMCBSIC9TaXplIDggPj4KK3N0YXJ0eHJlZgorNjUyCislJUVPRgpkaWZmIC0tZ2l0IGEvdGVzdGluZy90ZXN0LmduaSBiL3Rlc3RpbmcvdGVzdC5nbmkKaW5kZXggYjY2NzdkNC4uM2I5ZWRkYyAxMDA2NDQKLS0tIGEvdGVzdGluZy90ZXN0LmduaQorKysgYi90ZXN0aW5nL3Rlc3QuZ25pCkBAIC0xNSw3ICsxNSw2IEBACiAgIGlmIChpc19hbmRyb2lkKSB7CiAgICAgaW1wb3J0KCIvL2J1aWxkL2NvbmZpZy9hbmRyb2lkL2NvbmZpZy5nbmkiKQogICAgIGltcG9ydCgiLy9idWlsZC9jb25maWcvYW5kcm9pZC9ydWxlcy5nbmkiKQotICAgIGltcG9ydCgiLy9idWlsZC9jb25maWcvc2FuaXRpemVycy9zYW5pdGl6ZXJzLmduaSIpCiAKICAgICBfdXNlX3Jhd19hbmRyb2lkX2V4ZWN1dGFibGUgPSBkZWZpbmVkKGludm9rZXIudXNlX3Jhd19hbmRyb2lkX2V4ZWN1dGFibGUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlci51c2VfcmF3X2FuZHJvaWRfZXhlY3V0YWJsZQpAQCAtNTQsOSArNTMsMTIgQEAKICAgICAgICAgIyB0aGUgZGVmYXVsdCBzaGFyZWRfbGlicmFyeSBjb25maWdzIHJhdGhlciB0aGFuIGV4ZWN1dGFibGUgY29uZmlncy4KICAgICAgICAgY29uZmlncyAtPSBbCiAgICAgICAgICAgIi8vYnVpbGQvY29uZmlnOnNoYXJlZF9saWJyYXJ5X2NvbmZpZyIsCi0gICAgICAgICAgIi8vYnVpbGQvY29uZmlnL2FuZHJvaWQ6aGlkZV9uYXRpdmVfam5pX2V4cG9ydHMiLAorICAgICAgICAgICIvL2J1aWxkL2NvbmZpZy9hbmRyb2lkOmhpZGVfYWxsX2J1dF9qbmlfb25sb2FkIiwKICAgICAgICAgXQotICAgICAgICBjb25maWdzICs9IFsgIi8vYnVpbGQvY29uZmlnOmV4ZWN1dGFibGVfY29uZmlnIiBdCisgICAgICAgIGNvbmZpZ3MgKz0gWworICAgICAgICAgICIvL2J1aWxkL2NvbmZpZzpleGVjdXRhYmxlX2NvbmZpZyIsCisgICAgICAgICAgIi8vYnVpbGQvY29uZmlnL2FuZHJvaWQ6aGlkZV9hbGxfYnV0X2puaSIsCisgICAgICAgIF0KIAogICAgICAgICAjIERvbid0IG91dHB1dCB0byB0aGUgcm9vdCBvciBlbHNlIGNvbmZsaWN0IHdpdGggdGhlIGdyb3VwKCkgYmVsb3cuCiAgICAgICAgIG91dHB1dF9uYW1lID0gcmViYXNlX3BhdGgoX2V4ZWNfb3V0cHV0LCByb290X291dF9kaXIpCkBAIC0xODUsMTUgKzE4Nyw2IEBACiAgICAgICAgIGRlcHMgKz0gWyAiOiRfYXBrX3RhcmdldCIgXQogICAgICAgfQogICAgIH0KLQotICAgICMgVE9ETyhHWVBfR09ORSk6IERlbGV0ZSB0aGlzIGFmdGVyIHdlJ3ZlIGNvbnZlcnRlZCBldmVyeXRoaW5nIHRvIEdOLgotICAgICMgVGhlIF9ydW4gdGFyZ2V0cyBleGlzdCBvbmx5IGZvciBjb21wYXRpYmlsaXR5IHcvIEdZUC4KLSAgICBncm91cCgiJHt0YXJnZXRfbmFtZX1fYXBrX3J1biIpIHsKLSAgICAgIHRlc3Rvbmx5ID0gdHJ1ZQotICAgICAgZGVwcyA9IFsKLSAgICAgICAgIjoke2ludm9rZXIudGFyZ2V0X25hbWV9IiwKLSAgICAgIF0KLSAgICB9CiAgIH0gZWxzZSBpZiAoaXNfaW9zKSB7CiAgICAgaW1wb3J0KCIvL2J1aWxkL2NvbmZpZy9pb3MvcnVsZXMuZ25pIikKIApAQCAtMjM3LDExICsyMzAsNyBAQAogICAgICAgaWYgKCFkZWZpbmVkKGRlcHMpKSB7CiAgICAgICAgIGRlcHMgPSBbXQogICAgICAgfQotICAgICAgZGVwcyArPSBbCi0gICAgICAgICMgQWxsIHNoYXJlZCBsaWJyYXJpZXMgbXVzdCBoYXZlIHRoZSBzYW5pdGl6ZXIgZGVwcyB0byBwcm9wZXJseSBsaW5rIGluCi0gICAgICAgICMgYXNhbiBtb2RlICh0aGlzIHRhcmdldCB3aWxsIGJlIGVtcHR5IGluIG90aGVyIGNhc2VzKS4KLSAgICAgICAgIi8vYnVpbGQvY29uZmlnL3Nhbml0aXplcnM6ZGVwcyIsCi0gICAgICBdCisgICAgICBkZXBzICs9IFsgIi8vYnVpbGQvY29uZmlnOmV4ZV9hbmRfc2hsaWJfZGVwcyIgXQogICAgICAgaWYgKCFkZWZpbmVkKGJ1bmRsZV9kZXBzKSkgewogICAgICAgICBidW5kbGVfZGVwcyA9IFtdCiAgICAgICB9CkBAIC0yNTQsMjQgKzI0MywxMyBAQAogCiAgICAgICB0ZXN0b25seSA9IHRydWUKICAgICAgIGRlcHMgKz0gWwotICAgICAgICAjIEFsbCBzaGFyZWQgbGlicmFyaWVzIG11c3QgaGF2ZSB0aGUgc2FuaXRpemVyIGRlcHMgdG8gcHJvcGVybHkgbGluayBpbgotICAgICAgICAjIGFzYW4gbW9kZSAodGhpcyB0YXJnZXQgd2lsbCBiZSBlbXB0eSBpbiBvdGhlciBjYXNlcykuCi0gICAgICAgICIvL2J1aWxkL2NvbmZpZy9zYW5pdGl6ZXJzOmRlcHMiLAorICAgICAgICAiLy9idWlsZC9jb25maWc6ZXhlX2FuZF9zaGxpYl9kZXBzIiwKIAogICAgICAgICAjIEdpdmUgdGVzdHMgdGhlIGRlZmF1bHQgbWFuaWZlc3Qgb24gV2luZG93cyAoYSBuby1vcCBlbHNld2hlcmUpLgogICAgICAgICAiLy9idWlsZC93aW46ZGVmYXVsdF9leGVfbWFuaWZlc3QiLAogICAgICAgXQogICAgIH0KIAotICAgICMgVE9ETyhHWVBfR09ORSk6IERlbGV0ZSB0aGlzIGFmdGVyIHdlJ3ZlIGNvbnZlcnRlZCBldmVyeXRoaW5nIHRvIEdOLgotICAgICMgVGhlIF9ydW4gdGFyZ2V0cyBleGlzdCBvbmx5IGZvciBjb21wYXRpYmlsaXR5IHdpdGggR1lQLgotICAgIGdyb3VwKCIke3RhcmdldF9uYW1lfV9ydW4iKSB7Ci0gICAgICB0ZXN0b25seSA9IHRydWUKLSAgICAgIGRlcHMgPSBbCi0gICAgICAgICI6JHtpbnZva2VyLnRhcmdldF9uYW1lfSIsCi0gICAgICBdCi0gICAgfQotCiAgICAgaWYgKGRlZmluZWQoaW52b2tlci5vdXRwdXRfbmFtZSkgJiYgdGFyZ2V0X25hbWUgIT0gaW52b2tlci5vdXRwdXRfbmFtZSkgewogICAgICAgZ3JvdXAoIiR7aW52b2tlci5vdXRwdXRfbmFtZX1fcnVuIikgewogICAgICAgICB0ZXN0b25seSA9IHRydWUKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvdGVzdF9zdXBwb3J0LmNwcCBiL3Rlc3RpbmcvdGVzdF9zdXBwb3J0LmNwcAppbmRleCBhNTMwYjNlLi5iMzJlYzdkIDEwMDY0NAotLS0gYS90ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5jcHAKKysrIGIvdGVzdGluZy90ZXN0X3N1cHBvcnQuY3BwCkBAIC03LDEyICs3LDE0IEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIAotI2luY2x1ZGUgPHN0cmluZz4KLQorI2luY2x1ZGUgImNvcmUvZmRybS9jcnlwdG8vZnhfY3J5cHQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCiAjaW5jbHVkZSAidGVzdGluZy91dGlscy9wYXRoX3NlcnZpY2UuaCIKIAogI2lmZGVmIFBERl9FTkFCTEVfVjgKICNpbmNsdWRlICJ2OC9pbmNsdWRlL2xpYnBsYXRmb3JtL2xpYnBsYXRmb3JtLmgiCisjaW5jbHVkZSAidjgvaW5jbHVkZS92OC5oIgogI2VuZGlmCiAKIG5hbWVzcGFjZSB7CkBAIC0xMDIsNiArMTA0LDEyIEBACiAgIHJldHVybiBidWZmZXI7CiB9CiAKK3N0ZDo6c3RyaW5nIEdldFBsYXRmb3JtU3RyaW5nKEZQREZfV0lERVNUUklORyB3c3RyKSB7CisgIFdpZGVTdHJpbmcgd2lkZV9zdHJpbmcgPQorICAgICAgV2lkZVN0cmluZzo6RnJvbVVURjE2TEUod3N0ciwgV2lkZVN0cmluZzo6V1N0cmluZ0xlbmd0aCh3c3RyKSk7CisgIHJldHVybiBzdGQ6OnN0cmluZyh3aWRlX3N0cmluZy5VVEY4RW5jb2RlKCkuY19zdHIoKSk7Cit9CisKIHN0ZDo6d3N0cmluZyBHZXRQbGF0Zm9ybVdTdHJpbmcoRlBERl9XSURFU1RSSU5HIHdzdHIpIHsKICAgaWYgKCF3c3RyKQogICAgIHJldHVybiBudWxscHRyOwpAQCAtMTQ5LDYgKzE1NywyNCBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCitzdGQ6OnN0cmluZyBDcnlwdFRvQmFzZTE2KGNvbnN0IHVpbnQ4X3QqIGRpZ2VzdCkgeworICBzdGF0aWMgY2hhciBjb25zdCB6RW5jb2RlW10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisgIHN0ZDo6c3RyaW5nIHJldDsKKyAgcmV0LnJlc2l6ZSgzMik7CisgIGZvciAoaW50IGkgPSAwLCBqID0gMDsgaSA8IDE2OyBpKyssIGogKz0gMikgeworICAgIHVpbnQ4X3QgYSA9IGRpZ2VzdFtpXTsKKyAgICByZXRbal0gPSB6RW5jb2RlWyhhID4+IDQpICYgMHhmXTsKKyAgICByZXRbaiArIDFdID0gekVuY29kZVthICYgMHhmXTsKKyAgfQorICByZXR1cm4gcmV0OworfQorCitzdGQ6OnN0cmluZyBHZW5lcmF0ZU1ENUJhc2UxNihjb25zdCB1aW50OF90KiBkYXRhLCB1aW50MzJfdCBzaXplKSB7CisgIHVpbnQ4X3QgZGlnZXN0WzE2XTsKKyAgQ1JZUFRfTUQ1R2VuZXJhdGUoZGF0YSwgc2l6ZSwgZGlnZXN0KTsKKyAgcmV0dXJuIENyeXB0VG9CYXNlMTYoZGlnZXN0KTsKK30KKwogI2lmZGVmIFBERl9FTkFCTEVfVjgKICNpZmRlZiBWOF9VU0VfRVhURVJOQUxfU1RBUlRVUF9EQVRBCiBib29sIEluaXRpYWxpemVWOEZvclBERml1bShjb25zdCBzdGQ6OnN0cmluZyYgZXhlX3BhdGgsCkBAIC0xOTIsMjEgKzIxOCwzIEBACiAgIG1lbWNweShwQnVmLCBwTG9hZGVyLT5tX3BCdWYgKyBwb3MsIHNpemUpOwogICByZXR1cm4gMTsKIH0KLQotVGVzdFNhdmVyOjpUZXN0U2F2ZXIoKSB7Ci0gIEZQREZfRklMRVdSSVRFOjp2ZXJzaW9uID0gMTsKLSAgRlBERl9GSUxFV1JJVEU6OldyaXRlQmxvY2sgPSBXcml0ZUJsb2NrQ2FsbGJhY2s7Ci19Ci0KLXZvaWQgVGVzdFNhdmVyOjpDbGVhclN0cmluZygpIHsKLSAgbV9TdHJpbmcuY2xlYXIoKTsKLX0KLQotLy8gc3RhdGljCi1pbnQgVGVzdFNhdmVyOjpXcml0ZUJsb2NrQ2FsbGJhY2soRlBERl9GSUxFV1JJVEUqIHBGaWxlV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpIHsKLSAgVGVzdFNhdmVyKiBwVGhpcyA9IHN0YXRpY19jYXN0PFRlc3RTYXZlcio+KHBGaWxlV3JpdGUpOwotICBwVGhpcy0+bV9TdHJpbmcuYXBwZW5kKHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihkYXRhKSwgc2l6ZSk7Ci0gIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvdGVzdGluZy90ZXN0X3N1cHBvcnQuaCBiL3Rlc3RpbmcvdGVzdF9zdXBwb3J0LmgKaW5kZXggNDExMWNhNi4uZWM0YjRhZSAxMDA2NDQKLS0tIGEvdGVzdGluZy90ZXN0X3N1cHBvcnQuaAorKysgYi90ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5oCkBAIC02LDQ2ICs2LDQ3IEBACiAjZGVmaW5lIFRFU1RJTkdfVEVTVF9TVVBQT1JUX0hfCiAKICNpbmNsdWRlIDxzdGRsaWIuaD4KKwogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSAicHVibGljL2ZwZGZfc2F2ZS5oIgogI2luY2x1ZGUgInB1YmxpYy9mcGRmdmlldy5oIgogCi0jaWZkZWYgUERGX0VOQUJMRV9WOAotI2luY2x1ZGUgInY4L2luY2x1ZGUvdjguaCIKLSNlbmRpZiAgLy8gUERGX0VOQUJMRV9WOAorI2lmIFBERl9FTkFCTEVfWEZBCisjaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9jZmdhc19mb250bWdyLmgiCisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCiAKIG5hbWVzcGFjZSBwZGZpdW0gewogCi0jZGVmaW5lIFNUUl9JTl9URVNUX0NBU0UoaW5wdXRfbGl0ZXJhbCwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBpbnB1dF9saXRlcmFsLCBzaXplb2YoaW5wdXRfbGl0ZXJhbCkgLSAxLCBcCi0gICAgICAgIF9fVkFfQVJHU19fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIFNUUl9JTl9URVNUX0NBU0UoaW5wdXRfbGl0ZXJhbCwgLi4uKSAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGlucHV0X2xpdGVyYWwpLCBcCisgICAgICAgIHNpemVvZihpbnB1dF9saXRlcmFsKSAtIDEsIF9fVkFfQVJHU19fICAgICAgICAgICAgIFwKICAgfQogCi0jZGVmaW5lIFNUUl9JTl9PVVRfQ0FTRShpbnB1dF9saXRlcmFsLCBleHBlY3RlZF9saXRlcmFsLCAuLi4pICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSBpbnB1dF9saXRlcmFsLCBzaXplb2YoaW5wdXRfbGl0ZXJhbCkgLSAxLCAgICAgICAgICBcCi0gICAgICAgIChjb25zdCB1bnNpZ25lZCBjaGFyKilleHBlY3RlZF9saXRlcmFsLCBzaXplb2YoZXhwZWN0ZWRfbGl0ZXJhbCkgLSAxLCBcCi0gICAgICAgIF9fVkFfQVJHU19fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIFNUUl9JTl9PVVRfQ0FTRShpbnB1dF9saXRlcmFsLCBleHBlY3RlZF9saXRlcmFsLCAuLi4pICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oaW5wdXRfbGl0ZXJhbCksICAgICAgICBcCisgICAgICAgIHNpemVvZihpbnB1dF9saXRlcmFsKSAtIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGV4cGVjdGVkX2xpdGVyYWwpLCBcCisgICAgICAgIHNpemVvZihleHBlY3RlZF9saXRlcmFsKSAtIDEsIF9fVkFfQVJHU19fICAgICAgICAgICAgICAgICBcCiAgIH0KIAogc3RydWN0IFN0ckZ1bmNUZXN0RGF0YSB7CiAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGlucHV0OwotICB1bnNpZ25lZCBpbnQgaW5wdXRfc2l6ZTsKKyAgdWludDMyX3QgaW5wdXRfc2l6ZTsKICAgY29uc3QgdW5zaWduZWQgY2hhciogZXhwZWN0ZWQ7Ci0gIHVuc2lnbmVkIGludCBleHBlY3RlZF9zaXplOworICB1aW50MzJfdCBleHBlY3RlZF9zaXplOwogfTsKIAogc3RydWN0IERlY29kZVRlc3REYXRhIHsKICAgY29uc3QgdW5zaWduZWQgY2hhciogaW5wdXQ7Ci0gIHVuc2lnbmVkIGludCBpbnB1dF9zaXplOworICB1aW50MzJfdCBpbnB1dF9zaXplOwogICBjb25zdCB1bnNpZ25lZCBjaGFyKiBleHBlY3RlZDsKLSAgdW5zaWduZWQgaW50IGV4cGVjdGVkX3NpemU7CisgIHVpbnQzMl90IGV4cGVjdGVkX3NpemU7CiAgIC8vIFRoZSBzaXplIG9mIGlucHV0IHN0cmluZyBiZWluZyBwcm9jZXNzZWQuCi0gIHVuc2lnbmVkIGludCBwcm9jZXNzZWRfc2l6ZTsKKyAgdWludDMyX3QgcHJvY2Vzc2VkX3NpemU7CiB9OwogCiBzdHJ1Y3QgTnVsbFRlcm1Xc3RyRnVuY1Rlc3REYXRhIHsKQEAgLTY2LDE3ICs2NywzMCBAQAogCiBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gU3RyaW5nU3BsaXQoY29uc3Qgc3RkOjpzdHJpbmcmIHN0ciwgY2hhciBkZWxpbWl0ZXIpOwogCisvLyBDb252ZXJ0cyBhIEZQREZfV0lERVNUUklORyB0byBhIHN0ZDo6c3RyaW5nLgorLy8gRGVhbHMgd2l0aCBkaWZmZXJlbmNlcyBiZXR3ZWVuIFVURjE2TEUgYW5kIFVURjguCitzdGQ6OnN0cmluZyBHZXRQbGF0Zm9ybVN0cmluZyhGUERGX1dJREVTVFJJTkcgd3N0cik7CisKIC8vIENvbnZlcnRzIGEgRlBERl9XSURFU1RSSU5HIHRvIGEgc3RkOjp3c3RyaW5nLgogLy8gRGVhbHMgd2l0aCBkaWZmZXJlbmNlcyBiZXR3ZWVuIFVURjE2TEUgYW5kIHdjaGFyX3QuCi1zdGQ6OndzdHJpbmcgR2V0UGxhdGZvcm1XU3RyaW5nKGNvbnN0IEZQREZfV0lERVNUUklORyB3c3RyKTsKK3N0ZDo6d3N0cmluZyBHZXRQbGF0Zm9ybVdTdHJpbmcoRlBERl9XSURFU1RSSU5HIHdzdHIpOwogCiAvLyBSZXR1cm5zIGEgbmV3bHkgYWxsb2NhdGVkIEZQREZfV0lERVNUUklORy4KIC8vIERlYWxzIHdpdGggZGlmZmVyZW5jZXMgYmV0d2VlbiBVVEYxNkxFIGFuZCB3Y2hhcl90Lgogc3RkOjp1bmlxdWVfcHRyPHVuc2lnbmVkIHNob3J0LCBwZGZpdW06OkZyZWVEZWxldGVyPiBHZXRGUERGV2lkZVN0cmluZygKICAgICBjb25zdCBzdGQ6OndzdHJpbmcmIHdzdHIpOwogCitzdGQ6OnN0cmluZyBDcnlwdFRvQmFzZTE2KGNvbnN0IHVpbnQ4X3QqIGRpZ2VzdCk7CitzdGQ6OnN0cmluZyBHZW5lcmF0ZU1ENUJhc2UxNihjb25zdCB1aW50OF90KiBkYXRhLCB1aW50MzJfdCBzaXplKTsKKwogI2lmZGVmIFBERl9FTkFCTEVfVjgKK25hbWVzcGFjZSB2OCB7CitjbGFzcyBQbGF0Zm9ybTsKK30KICNpZmRlZiBWOF9VU0VfRVhURVJOQUxfU1RBUlRVUF9EQVRBCituYW1lc3BhY2UgdjggeworY2xhc3MgU3RhcnR1cERhdGE7Cit9CiBib29sIEluaXRpYWxpemVWOEZvclBERml1bShjb25zdCBzdGQ6OnN0cmluZyYgZXhlX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgYmluX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpTdGFydHVwRGF0YSogbmF0aXZlc19ibG9iLApAQCAtMTAxLDE5ICsxMTUsOCBAQAogICBjb25zdCBzaXplX3QgbV9MZW47CiB9OwogCi1jbGFzcyBUZXN0U2F2ZXIgOiBwdWJsaWMgRlBERl9GSUxFV1JJVEUgewotIHB1YmxpYzoKLSAgVGVzdFNhdmVyKCk7Ci0KLSAgdm9pZCBDbGVhclN0cmluZygpOwotICBjb25zdCBzdGQ6OnN0cmluZyYgR2V0U3RyaW5nKCkgY29uc3QgeyByZXR1cm4gbV9TdHJpbmc7IH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBpbnQgV3JpdGVCbG9ja0NhbGxiYWNrKEZQREZfRklMRVdSSVRFKiBwRmlsZVdyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNpemUpOwotCi0gIHN0ZDo6c3RyaW5nIG1fU3RyaW5nOwotfTsKKyNpZiBQREZfRU5BQkxFX1hGQQorQ0ZHQVNfRm9udE1nciogR2V0R2xvYmFsRm9udE1hbmFnZXIoKTsKKyNlbmRpZiAgLy8gUERGX0VOQUJMRV9YRkEKIAogI2VuZGlmICAvLyBURVNUSU5HX1RFU1RfU1VQUE9SVF9IXwpkaWZmIC0tZ2l0IGEvdGVzdGluZy90b29scy9fX2luaXRfXy5weSBiL3Rlc3RpbmcvdG9vbHMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvdG9vbHMvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvdG9vbHMvYXBpX2NoZWNrLnB5IGIvdGVzdGluZy90b29scy9hcGlfY2hlY2sucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWU3NjliYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvdG9vbHMvYXBpX2NoZWNrLnB5CkBAIC0wLDAgKzEsMTM4IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IDIwMTcgVGhlIFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyIiIlZlcmlmaWVzIGV4cG9ydGVkIGZ1bmN0aW9ucyBpbiBwdWJsaWMvKi5oIGFyZSBpbiBmcGRmdmlld19jX2FwaV90ZXN0LmMuCisKK1RoaXMgc2NyaXB0IGdhdGhlcnMgYSBsaXN0IG9mIGZ1bmN0aW9ucyBmcm9tIHB1YmxpYy8qLmggdGhhdCBjb250YWluCitGUERGX0VYUE9SVC4gSXQgdGhlbiBnYXRoZXJzIGEgbGlzdCBvZiBmdW5jdGlvbnMgZnJvbQorZnBkZnNkay9mcGRmdmlld19jX2FwaV90ZXN0LmMuIEl0IHRoZW4gdmVyaWZpZXMgYm90aCBsaXN0cyBkbyBub3QgY29udGFpbgorZHVwbGljYXRlcywgYW5kIHRoZXkgbWF0Y2ggZWFjaCBvdGhlci4KKworIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3lzCisKK2RlZiBfSXNWYWxpZEZ1bmN0aW9uTmFtZShmdW5jdGlvbiwgZmlsZW5hbWUpOgorICBpZiBmdW5jdGlvbi5zdGFydHN3aXRoKCdGUERGJyk6CisgICAgcmV0dXJuIFRydWUKKyAgaWYgZnVuY3Rpb24gPT0gJ0ZTREtfU2V0VW5TcE9ialByb2Nlc3NIYW5kbGVyJyBhbmQgZmlsZW5hbWUgPT0gJ2ZwZGZfZXh0LmgnOgorICAgIHJldHVybiBUcnVlCisgIGlmIGZ1bmN0aW9uLnN0YXJ0c3dpdGgoJ0ZPUk1fJykgYW5kIGZpbGVuYW1lID09ICdmcGRmX2Zvcm1maWxsLmgnOgorICAgIHJldHVybiBUcnVlCisgIHJldHVybiBGYWxzZQorCisKK2RlZiBfRmluZEZ1bmN0aW9uKGZ1bmN0aW9uX3NuaXBwZXQsIGZpbGVuYW1lKToKKyAgZnVuY3Rpb25fc3BsaXQgPSBmdW5jdGlvbl9zbmlwcGV0LnNwbGl0KCcoJykKKyAgYXNzZXJ0IGxlbihmdW5jdGlvbl9zcGxpdCkgPT0gMgorICBmdW5jdGlvbiA9IGZ1bmN0aW9uX3NwbGl0WzBdCisgIGFzc2VydCBfSXNWYWxpZEZ1bmN0aW9uTmFtZShmdW5jdGlvbiwgZmlsZW5hbWUpCisgIHJldHVybiBmdW5jdGlvbgorCisKK2RlZiBfR2V0RXhwb3J0c0Zyb21IZWFkZXIoZGlybmFtZSwgZmlsZW5hbWUpOgorICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGRpcm5hbWUsIGZpbGVuYW1lKSkgYXMgZjoKKyAgICBjb250ZW50cyA9IGYucmVhZGxpbmVzKCkKKyAgICBsb29rX2Zvcl9mdW5jdGlvbl9uYW1lID0gRmFsc2UKKyAgICBmdW5jdGlvbnMgPSBbXQorICAgIGZvciBsaW5lIGluIGNvbnRlbnRzOgorICAgICAgaWYgbG9va19mb3JfZnVuY3Rpb25fbmFtZToKKyAgICAgICAgbG9va19mb3JfZnVuY3Rpb25fbmFtZSA9IEZhbHNlCisgICAgICAgIHNwbGl0X2xpbmUgPSBsaW5lLnJzdHJpcCgpLnNwbGl0KCcgJykKKyAgICAgICAgZnVuY3Rpb25zLmFwcGVuZChfRmluZEZ1bmN0aW9uKHNwbGl0X2xpbmVbMF0sIGZpbGVuYW1lKSkKKyAgICAgICAgY29udGludWUKKworICAgICAgaWYgbm90IGxpbmUuc3RhcnRzd2l0aCgnRlBERl9FWFBPUlQgJyk6CisgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICMgRm9ybWF0IHNob3VsZCBiZTogRlBERl9FWFBPUlQgcmV0dXJuX3R5cGUgRlBERl9DQUxMQ09OVgorICAgICAgc3BsaXRfbGluZSA9IGxpbmUucnN0cmlwKCkuc3BsaXQoJyAnKQorICAgICAgY2FsbGNvbnZfaW5kZXggPSBzcGxpdF9saW5lLmluZGV4KCdGUERGX0NBTExDT05WJykKKyAgICAgIGFzc2VydCBjYWxsY29udl9pbmRleCA+PSAyCisgICAgICBpZiBjYWxsY29udl9pbmRleCArIDEgPT0gbGVuKHNwbGl0X2xpbmUpOgorICAgICAgICBsb29rX2Zvcl9mdW5jdGlvbl9uYW1lID0gVHJ1ZQorICAgICAgICBjb250aW51ZQorCisgICAgICBmdW5jdGlvbnMuYXBwZW5kKF9GaW5kRnVuY3Rpb24oc3BsaXRfbGluZVtjYWxsY29udl9pbmRleCArIDFdLCBmaWxlbmFtZSkpCisgICAgcmV0dXJuIGZ1bmN0aW9ucworCisKK2RlZiBfR2V0RnVuY3Rpb25zRnJvbVB1YmxpY0hlYWRlcnMoc3JjX3BhdGgpOgorICBwdWJsaWNfcGF0aCA9IG9zLnBhdGguam9pbihzcmNfcGF0aCwgJ3B1YmxpYycpCisgIGZ1bmN0aW9ucyA9IFtdCisgIGZvciBmaWxlbmFtZSBpbiBvcy5saXN0ZGlyKHB1YmxpY19wYXRoKToKKyAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aCgnLmgnKToKKyAgICAgIGZ1bmN0aW9ucy5leHRlbmQoX0dldEV4cG9ydHNGcm9tSGVhZGVyKHB1YmxpY19wYXRoLCBmaWxlbmFtZSkpCisgIHJldHVybiBmdW5jdGlvbnMKKworCitkZWYgX0dldEZ1bmN0aW9uc0Zyb21UZXN0KGFwaV90ZXN0X3BhdGgpOgorICBjaGtfcmVnZXggPSByZS5jb21waWxlKCdeICAgIENIS1woKC4qKVwpO1xuJCcpCisgIHdpdGggb3BlbihhcGlfdGVzdF9wYXRoKSBhcyBmOgorICAgIGNvbnRlbnRzID0gZi5yZWFkbGluZXMoKQorICAgIGZ1bmN0aW9ucyA9IFtdCisgICAgZm9yIGxpbmUgaW4gY29udGVudHM6CisgICAgICBtYXRjaCA9IGNoa19yZWdleC5tYXRjaChsaW5lKQorICAgICAgaWYgbWF0Y2g6CisgICAgICAgIGZ1bmN0aW9ucy5hcHBlbmQobWF0Y2guZ3JvdXBzKClbMF0pCisgICAgcmV0dXJuIGZ1bmN0aW9ucworCisKK2RlZiBfRmluZER1cGxpY2F0ZXMoZnVuY3Rpb25zKToKKyAgcmV0dXJuIHNldChbZiBmb3IgZiBpbiBmdW5jdGlvbnMgaWYgZnVuY3Rpb25zLmNvdW50KGYpID4gMV0pCisKKworZGVmIF9DaGVja0FuZFByaW50RmFpbHVyZXMoZmFpbHVyZV9saXN0LCBmYWlsdXJlX21lc3NhZ2UpOgorICBpZiBub3QgZmFpbHVyZV9saXN0OgorICAgIHJldHVybiBUcnVlCisKKyAgcHJpbnQgJyVzOicgJSBmYWlsdXJlX21lc3NhZ2UKKyAgZm9yIGYgaW4gc29ydGVkKGZhaWx1cmVfbGlzdCk6CisgICAgcHJpbnQgZgorICByZXR1cm4gRmFsc2UKKworCitkZWYgbWFpbigpOgorICBzY3JpcHRfYWJzcGF0aCA9IG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykKKyAgc3JjX3BhdGggPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShzY3JpcHRfYWJzcGF0aCkpKQorICBwdWJsaWNfZnVuY3Rpb25zID0gX0dldEZ1bmN0aW9uc0Zyb21QdWJsaWNIZWFkZXJzKHNyY19wYXRoKQorCisgIGFwaV90ZXN0X3JlbGF0aXZlX3BhdGggPSBvcy5wYXRoLmpvaW4oJ2ZwZGZzZGsnLCAnZnBkZnZpZXdfY19hcGlfdGVzdC5jJykKKyAgYXBpX3Rlc3RfcGF0aCA9IG9zLnBhdGguam9pbihzcmNfcGF0aCwgYXBpX3Rlc3RfcmVsYXRpdmVfcGF0aCkKKyAgdGVzdF9mdW5jdGlvbnMgPSBfR2V0RnVuY3Rpb25zRnJvbVRlc3QoYXBpX3Rlc3RfcGF0aCkKKworICByZXN1bHQgPSBUcnVlCisgIGR1cGxpY2F0ZV9wdWJsaWNfZnVuY3Rpb25zID0gX0ZpbmREdXBsaWNhdGVzKHB1YmxpY19mdW5jdGlvbnMpCisgIGNoZWNrID0gX0NoZWNrQW5kUHJpbnRGYWlsdXJlcyhkdXBsaWNhdGVfcHVibGljX2Z1bmN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ZvdW5kIGR1cGxpY2F0ZSBmdW5jdGlvbnMgaW4gcHVibGljIGhlYWRlcnMnKQorICByZXN1bHQgPSByZXN1bHQgYW5kIGNoZWNrCisKKyAgZHVwbGljYXRlX3Rlc3RfZnVuY3Rpb25zID0gX0ZpbmREdXBsaWNhdGVzKHRlc3RfZnVuY3Rpb25zKQorICBjaGVjayA9IF9DaGVja0FuZFByaW50RmFpbHVyZXMoZHVwbGljYXRlX3Rlc3RfZnVuY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRm91bmQgZHVwbGljYXRlIGZ1bmN0aW9ucyBpbiBBUEkgdGVzdCcpCisgIHJlc3VsdCA9IHJlc3VsdCBhbmQgY2hlY2sKKworICBwdWJsaWNfZnVuY3Rpb25zX3NldCA9IHNldChwdWJsaWNfZnVuY3Rpb25zKQorICB0ZXN0X2Z1bmN0aW9uc19zZXQgPSBzZXQodGVzdF9mdW5jdGlvbnMpCisgIG5vdF90ZXN0ZWQgPSBwdWJsaWNfZnVuY3Rpb25zX3NldC5kaWZmZXJlbmNlKHRlc3RfZnVuY3Rpb25zX3NldCkKKyAgY2hlY2sgPSBfQ2hlY2tBbmRQcmludEZhaWx1cmVzKG5vdF90ZXN0ZWQsICdGdW5jdGlvbnMgbm90IHRlc3RlZCcpCisgIHJlc3VsdCA9IHJlc3VsdCBhbmQgY2hlY2sKKyAgbm9uX2V4aXN0ZW50ID0gdGVzdF9mdW5jdGlvbnNfc2V0LmRpZmZlcmVuY2UocHVibGljX2Z1bmN0aW9uc19zZXQpCisgIGNoZWNrID0gX0NoZWNrQW5kUHJpbnRGYWlsdXJlcyhub25fZXhpc3RlbnQsICdUZXN0ZWQgZnVuY3Rpb25zIGRvIG5vdCBleGlzdCcpCisgIHJlc3VsdCA9IHJlc3VsdCBhbmQgY2hlY2sKKworICBpZiBub3QgcmVzdWx0OgorICAgIHByaW50ICgnU29tZSBjaGVja3MgZmFpbGVkLiBNYWtlIHN1cmUgJXMgaXMgaW4gc3luYyB3aXRoIHRoZSBwdWJsaWMgQVBJICcKKyAgICAgICAgICAgJ2hlYWRlcnMuJworICAgICAgICAgICAlIGFwaV90ZXN0X3JlbGF0aXZlX3BhdGgpOworICAgIHJldHVybiAxCisKKyAgcmV0dXJuIDAKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBzeXMuZXhpdChtYWluKCkpCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Rvb2xzL2NvbW1vbi5weSBiL3Rlc3RpbmcvdG9vbHMvY29tbW9uLnB5CmluZGV4IGI2ZTRhN2QuLmZjMTYwMDQgMTAwNzU1Ci0tLSBhL3Rlc3RpbmcvdG9vbHMvY29tbW9uLnB5CisrKyBiL3Rlc3RpbmcvdG9vbHMvY29tbW9uLnB5CkBAIC0zLDggKzMsMTAgQEAKICMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCitpbXBvcnQgZGF0ZXRpbWUKIGltcG9ydCBnbG9iCiBpbXBvcnQgb3MKK2ltcG9ydCByZQogaW1wb3J0IHN1YnByb2Nlc3MKIGltcG9ydCBzeXMKIApAQCAtMjUsNiArMjcsMzggQEAKICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yIGFzIGU6CiAgICAgcmV0dXJuIGUKIAorCitkZWYgUnVuQ29tbWFuZFByb3BhZ2F0ZUVycihjbWQsIHN0ZG91dF9oYXNfZXJyb3JzPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdF9zdGF0dXNfb25fZXJyb3I9Tm9uZSk6CisgICIiIlJ1biBhIGNvbW1hbmQgYXMgYSBzdWJwcm9jZXNzLgorCisgIEVycm9ycyBpbiB0aGF0IHN1YnByb2Nlc3MgYXJlIHByaW50ZWQgb3V0IGlmIGl0IHJldHVybnMgYW4gZXJyb3IgZXhpdCBjb2RlLgorCisgIEFyZ3M6CisgICAgY21kOiBDb21tYW5kIHRvIHJ1biBhcyBhIGxpc3Qgb2Ygc3RyaW5ncy4KKyAgICBzdGRvdXRfaGFzX2Vycm9yczogV2hldGhlciB0byBwcmludCBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIgb24gYW4gZXJyb3IKKyAgICAgICAgZXhpdC4KKyAgICBleGl0X3N0YXR1c19vbl9lcnJvcjogSWYgc3BlY2lmaWVkLCB1cG9uIGFuIGVycm9yIGluIHRoZSBzdWJwcm9jZXNzIHRoZQorICAgICAgICBjYWxsZXIgc2NyaXB0IGV4aXRzIGltbWVkaWF0ZWx5IHdpdGggdGhlIGdpdmVuIHN0YXR1cy4KKyAgIiIiCisgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgb3V0cHV0LCBlcnIgPSBwLmNvbW11bmljYXRlKCkKKworICBpZiBwLnJldHVybmNvZGU6CisgICAgUHJpbnRFcnIoJ1xuRXJyb3Igd2hlbiBpbnZva2luZyAiJXMiJyAlICcgJy5qb2luKGNtZCkpCisgICAgaWYgc3Rkb3V0X2hhc19lcnJvcnM6CisgICAgICBQcmludEVycihvdXRwdXQpCisKKyAgICBQcmludEVycihlcnIpCisKKyAgICBpZiBleGl0X3N0YXR1c19vbl9lcnJvciBpcyBub3QgTm9uZToKKyAgICAgIHN5cy5leGl0KGV4aXRfc3RhdHVzX29uX2Vycm9yKQorCisgICAgcmV0dXJuIE5vbmUKKworICByZXR1cm4gb3V0cHV0CisKKwogIyBSdW5Db21tYW5kRXh0cmFjdEhhc2hlZEZpbGVzIHJldHVybnMgYSB0dXBsZTogKHJhaXNlZF9leGNlcHRpb24sIGhhc2hlZF9maWxlcykKICMgSXQgcnVucyB0aGUgZ2l2ZW4gY29tbWFuZC4gSWYgaXQgZmFpbHMgaXQgd2lsbCByZXR1cm4gYW4gZXhjZXB0aW9uIGFuZCBOb25lLgogIyBJZiBpdCBzdWNjZWVkcyBpdCB3aWxsIHJldHVybiBOb25lIGFuZCB0aGUgbGlzdCBvZiBwcm9jZXNzZWQgZmlsZXMgZXh0cmFjdGVkCkBAIC05NiwzICsxMzAsMjcgQEAKICAgICBpZiBvdGhlcl9jb21wb25lbnRzOgogICAgICAgcmVzdWx0ID0gb3MucGF0aC5qb2luKHJlc3VsdCwgb3RoZXJfY29tcG9uZW50cykKICAgICByZXR1cm4gcmVzdWx0CisKKworZGVmIEdldEJvb2xlYW5HbkFyZyhhcmdfbmFtZSwgYnVpbGRfZGlyLCB2ZXJib3NlPUZhbHNlKToKKyAgJycnRXh0cmFjdCB0aGUgdmFsdWUgb2YgYSBib29sZWFuIGZsYWcgaW4gYXJncy5nbicnJworICBjd2QgPSBvcy5nZXRjd2QoKQorICBvcy5jaGRpcihidWlsZF9kaXIpCisgIGduX2FyZ3Nfb3V0cHV0ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoCisgICAgICBbJ2duJywgJ2FyZ3MnLCAnLicsICctLWxpc3Q9JXMnICUgYXJnX25hbWUsICctLXNob3J0J10pCisgIG9zLmNoZGlyKGN3ZCkKKyAgYXJnX21hdGNoX291dHB1dCA9IHJlLnNlYXJjaCgnJXMgPSAoLiopJyAlIGFyZ19uYW1lLCBnbl9hcmdzX291dHB1dCkuZ3JvdXAoMSkKKyAgaWYgdmVyYm9zZToKKyAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiRm91bmQgJyVzJyBmb3IgdmFsdWUgb2YgJXMiICUgKGFyZ19tYXRjaF9vdXRwdXQsIGFyZykKKyAgcmV0dXJuIGFyZ19tYXRjaF9vdXRwdXQgPT0gJ3RydWUnCisKKworZGVmIFByaW50V2l0aFRpbWUocyk6CisgICIiIlByaW50cyBzIHByZXBlbmRlZCBieSBhIHRpbWVzdGFtcC4iIiIKKyAgcHJpbnQgJ1slc10gJXMnICUgKGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpLnN0cmZ0aW1lKCIlWSVtJWQgJUg6JU06JVMiKSwKKyAgICAgICAgICAgICAgICAgICAgIHMpCisKKworZGVmIFByaW50RXJyKHMpOgorICAiIiJQcmludHMgcyB0byBzdGRlcnIuIiIiCisgIHByaW50ID4+IHN5cy5zdGRlcnIsIHMKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvdG9vbHMvY292ZXJhZ2UvY292ZXJhZ2VfcmVwb3J0LnB5IGIvdGVzdGluZy90b29scy9jb3ZlcmFnZS9jb3ZlcmFnZV9yZXBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTVjODhiZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvdG9vbHMvY292ZXJhZ2UvY292ZXJhZ2VfcmVwb3J0LnB5CkBAIC0wLDAgKzEsMzkzIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IDIwMTcgVGhlIFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyIiIkdlbmVyYXRlcyBhIGNvdmVyYWdlIHJlcG9ydCBmb3IgZ2l2ZW4gYmluYXJpZXMgdXNpbmcgbGx2bS1nY292ICYgbGNvdi4KKworUmVxdWlyZXMgbGx2bS1jb3YgMy41IG9yIGxhdGVyLgorUmVxdWlyZXMgbGNvdiAxLjExIG9yIGxhdGVyLgorUmVxdWlyZXMgdGhhdCAndXNlX2NvdmVyYWdlID0gdHJ1ZScgaXMgc2V0IGluIGFyZ3MuZ24uCisiIiIKKworaW1wb3J0IGFyZ3BhcnNlCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCitpbXBvcnQgb3MKK2ltcG9ydCBwcHJpbnQKK2ltcG9ydCByZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKKworCisjIEFkZCBzcmMgZGlyIHRvIHBhdGggdG8gYXZvaWQgaGF2aW5nIHRvIHNldCBQWVRIT05QQVRILgorc3lzLnBhdGguYXBwZW5kKAorICAgIG9zLnBhdGguYWJzcGF0aCgKKyAgICAgICBvcy5wYXRoLmpvaW4oCisgICAgICAgICAgb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwKKyAgICAgICAgICBvcy5wYXRoLnBhcmRpciwKKyAgICAgICAgICBvcy5wYXRoLnBhcmRpciwKKyAgICAgICAgICBvcy5wYXRoLnBhcmRpcikpKQorCitmcm9tIHRlc3RpbmcudG9vbHMuY29tbW9uIGltcG9ydCBHZXRCb29sZWFuR25BcmcKKworCisjICdiaW5hcnknIGlzIHRoZSBmaWxlIHRoYXQgaXMgdG8gYmUgcnVuIGZvciB0aGUgdGVzdC4KKyMgJ3VzZV90ZXN0X3J1bm5lcicgaW5kaWNhdGVzIGlmICdiaW5hcnknIGRlcGVuZHMgb24gdGVzdF9ydW5uZXIucHkgYW5kIHRodXMKKyMgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZy4KK1Rlc3RTcGVjID0gbmFtZWR0dXBsZSgnVGVzdFNwZWMnLCAnYmluYXJ5LCB1c2VfdGVzdF9ydW5uZXInKQorCisjIEFsbCBvZiB0aGUgY292ZXJhZ2UgdGVzdHMgdGhhdCB0aGUgc2NyaXB0IGtub3dzIGhvdyB0byBydW4uCitDT1ZFUkFHRV9URVNUUyA9IHsKKyAgICAncGRmaXVtX3VuaXR0ZXN0cyc6IFRlc3RTcGVjKCdwZGZpdW1fdW5pdHRlc3RzJywgRmFsc2UpLAorICAgICdwZGZpdW1fZW1iZWRkZXJ0ZXN0cyc6IFRlc3RTcGVjKCdwZGZpdW1fZW1iZWRkZXJ0ZXN0cycsIEZhbHNlKSwKKyAgICAnY29ycHVzX3Rlc3RzJzogVGVzdFNwZWMoJ3J1bl9jb3JwdXNfdGVzdHMucHknLCBUcnVlKSwKKyAgICAnamF2YXNjcmlwdF90ZXN0cyc6IFRlc3RTcGVjKCdydW5famF2YXNjcmlwdF90ZXN0cy5weScsIFRydWUpLAorICAgICdwaXhlbF90ZXN0cyc6IFRlc3RTcGVjKCdydW5fcGl4ZWxfdGVzdHMucHknLCBUcnVlKSwKK30KKworIyBDb3ZlcmFnZSB0ZXN0cyB0aGF0IGFyZSBrbm93biB0byB0YWtlIGEgbG9uZyB0aW1lIHRvIHJ1biwgc28gYXJlIG5vdCBpbiB0aGUKKyMgZGVmYXVsdCBzZXQuIFRoZSB1c2VyIG11c3QgZWl0aGVyIGV4cGxpY2l0bHkgaW52b2tlIHRoZXNlIHRlc3RzIG9yIHBhc3MgaW4KKyMgLS1zbG93LgorU0xPV19URVNUUyA9IFsnY29ycHVzX3Rlc3RzJywgJ2phdmFzY3JpcHRfdGVzdHMnLCAncGl4ZWxfdGVzdHMnXQorCitjbGFzcyBDb3ZlcmFnZUV4ZWN1dG9yKG9iamVjdCk6CisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlciwgYXJncyk6CisgICAgIiIiSW5pdGlhbGl6ZSBleGVjdXRvciBiYXNlZCBvbiB0aGUgY3VycmVudCBzY3JpcHQgZW52aXJvbm1lbnQKKworICAgIEFyZ3M6CisgICAgICAgIHBhcnNlcjogYXJncGFyc2UuQXJndW1lbnRQYXJzZXIgZm9yIGhhbmRsaW5nIGltcHJvcGVyIGlucHV0cy4KKyAgICAgICAgYXJnczogRGljdGlvbmFyeSBvZiBhcmd1bWVudHMgcGFzc2VkIGludG8gdGhlIGNhbGxpbmcgc2NyaXB0LgorICAgICIiIgorICAgIHNlbGYuZHJ5X3J1biA9IGFyZ3NbJ2RyeV9ydW4nXQorICAgIHNlbGYudmVyYm9zZSA9IGFyZ3NbJ3ZlcmJvc2UnXQorCisgICAgbGx2bV9jb3YgPSBzZWxmLmRldGVybWluZV9wcm9wZXJfbGx2bV9jb3YoKQorICAgIGlmIG5vdCBsbHZtX2NvdjoKKyAgICAgIHByaW50ICdVbmFibGUgdG8gZmluZCBhcHByb3ByaWF0ZSBsbHZtLWNvdiB0byB1c2UnCisgICAgICBzeXMuZXhpdCgxKQorICAgIHNlbGYubGNvdl9lbnYgPSBvcy5lbnZpcm9uCisgICAgc2VsZi5sY292X2VudlsnTExWTV9DT1ZfQklOJ10gPSBsbHZtX2NvdgorCisgICAgc2VsZi5sY292ID0gc2VsZi5kZXRlcm1pbmVfcHJvcGVyX2xjb3YoKQorICAgIGlmIG5vdCBzZWxmLmxjb3Y6CisgICAgICBwcmludCAnVW5hYmxlIHRvIGZpbmQgYXBwcm9wcmlhdGUgbGNvdiB0byB1c2UnCisgICAgICBzeXMuZXhpdCgxKQorCisgICAgc2VsZi5jb3ZlcmFnZV9maWxlcyA9IHNldCgpCisgICAgc2VsZi5zb3VyY2VfZGlyZWN0b3J5ID0gYXJnc1snc291cmNlX2RpcmVjdG9yeSddCisgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoc2VsZi5zb3VyY2VfZGlyZWN0b3J5KToKKyAgICAgIHBhcnNlci5lcnJvcigiJyVzJyBuZWVkcyB0byBiZSBhIGRpcmVjdG9yeSIgJSBzZWxmLnNvdXJjZV9kaXJlY3RvcnkpCisKKyAgICBzZWxmLmJ1aWxkX2RpcmVjdG9yeSA9IGFyZ3NbJ2J1aWxkX2RpcmVjdG9yeSddCisgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoc2VsZi5idWlsZF9kaXJlY3RvcnkpOgorICAgICAgcGFyc2VyLmVycm9yKCInJXMnIG5lZWRzIHRvIGJlIGEgZGlyZWN0b3J5IiAlIHNlbGYuYnVpbGRfZGlyZWN0b3J5KQorCisgICAgc2VsZi5jb3ZlcmFnZV90ZXN0cyA9IHNlbGYuY2FsY3VsYXRlX2NvdmVyYWdlX3Rlc3RzKGFyZ3MpCisgICAgaWYgbm90IHNlbGYuY292ZXJhZ2VfdGVzdHM6CisgICAgICBwYXJzZXIuZXJyb3IoCisgICAgICAgICAgJ05vIHZhbGlkIHRlc3RzIGluIHNldCB0byBiZSBydW4uIFRoaXMgaXMgbGlrZWx5IGR1ZSB0byBiYWQgY29tbWFuZCAnCisgICAgICAgICAgJ2xpbmUgYXJndW1lbnRzJykKKworICAgIGlmIG5vdCBHZXRCb29sZWFuR25BcmcoJ3VzZV9jb3ZlcmFnZScsIHNlbGYuYnVpbGRfZGlyZWN0b3J5LCBzZWxmLnZlcmJvc2UpOgorICAgICAgcGFyc2VyLmVycm9yKAorICAgICAgICAgICd1c2VfY292ZXJhZ2UgZG9lcyBub3QgYXBwZWFyIHRvIGJlIHNldCB0byB0cnVlIGZvciBidWlsZCwgYnV0IGlzICcKKyAgICAgICAgICAnbmVlZGVkJykKKworICAgIHNlbGYudXNlX2dvbWEgPSBHZXRCb29sZWFuR25BcmcoJ3VzZV9nb21hJywgc2VsZi5idWlsZF9kaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZlcmJvc2UpCisKKyAgICBzZWxmLm91dHB1dF9kaXJlY3RvcnkgPSBhcmdzWydvdXRwdXRfZGlyZWN0b3J5J10KKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5vdXRwdXRfZGlyZWN0b3J5KToKKyAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgIG9zLm1ha2VkaXJzKHNlbGYub3V0cHV0X2RpcmVjdG9yeSkKKyAgICBlbGlmIG5vdCBvcy5wYXRoLmlzZGlyKHNlbGYub3V0cHV0X2RpcmVjdG9yeSk6CisgICAgICBwYXJzZXIuZXJyb3IoJyVzIGV4aXN0cywgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeScgJSBzZWxmLm91dHB1dF9kaXJlY3RvcnkpCisgICAgc2VsZi5jb3ZlcmFnZV90b3RhbHNfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLm91dHB1dF9kaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGRmaXVtX3RvdGFscy5pbmZvJykKKworICBkZWYgY2hlY2tfb3V0cHV0KHNlbGYsIGFyZ3MsIGRyeV9ydW49RmFsc2UsIGVudj1Ob25lKToKKyAgICAiIiJEcnkgcnVuIGF3YXJlIHdyYXBwZXIgb2Ygc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoKSIiIgorICAgIGlmIGRyeV9ydW46CisgICAgICBwcmludCAiV291bGQgaGF2ZSBydW4gJyVzJyIgJSAnICcuam9pbihhcmdzKQorICAgICAgcmV0dXJuICcnCisKKyAgICBvdXRwdXQgPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dChhcmdzLCBlbnY9ZW52KQorCisgICAgaWYgc2VsZi52ZXJib3NlOgorICAgICAgcHJpbnQgImNoZWNrX291dHB1dCglcykgcmV0dXJuZWQgJyVzJyIgJSAoYXJncywgb3V0cHV0KQorICAgIHJldHVybiBvdXRwdXQKKworICBkZWYgY2FsbChzZWxmLCBhcmdzLCBkcnlfcnVuPUZhbHNlLCBlbnY9Tm9uZSk6CisgICAgIiIiRHJ5IHJ1biBhd2FyZSB3cmFwcGVyIG9mIHN1YnByb2Nlc3MuY2FsbCgpIiIiCisgICAgaWYgZHJ5X3J1bjoKKyAgICAgIHByaW50ICJXb3VsZCBoYXZlIHJ1biAnJXMnIiAlICcgJy5qb2luKGFyZ3MpCisgICAgICByZXR1cm4gMAorCisgICAgb3V0cHV0ID0gc3VicHJvY2Vzcy5jYWxsKGFyZ3MsIGVudj1lbnYpCisKKyAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICBwcmludCAnY2FsbCglcykgcmV0dXJuZWQgJXMnICUgKGFyZ3MsIG91dHB1dCkKKyAgICByZXR1cm4gb3V0cHV0CisKKyAgZGVmIGNhbGxfbGNvdihzZWxmLCBhcmdzLCBkcnlfcnVuPUZhbHNlLCBuZWVkc19kaXJlY3Rvcnk9VHJ1ZSk6CisgICAgIiIiV3JhcHBlciB0byBjYWxsIGxjb3YgdGhhdCBhZGRzIGFwcHJvcHJpYXRlIGFyZ3VtZW50cyBhcyBuZWVkZWQuIiIiCisgICAgbGNvdl9hcmdzID0gWworICAgICAgICBzZWxmLmxjb3YsICctLWNvbmZpZy1maWxlJywKKyAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuc291cmNlX2RpcmVjdG9yeSwgJ3Rlc3RpbmcnLCAndG9vbHMnLCAnY292ZXJhZ2UnLAorICAgICAgICAgICAgICAgICAgICAgJ2xjb3ZyYycpLAorICAgICAgICAnLS1nY292LXRvb2wnLAorICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5zb3VyY2VfZGlyZWN0b3J5LCAndGVzdGluZycsICd0b29scycsICdjb3ZlcmFnZScsCisgICAgICAgICAgICAgICAgICAgICAnbGx2bS1nY292JykKKyAgICBdCisgICAgaWYgbmVlZHNfZGlyZWN0b3J5OgorICAgICAgbGNvdl9hcmdzLmV4dGVuZChbJy0tZGlyZWN0b3J5Jywgc2VsZi5zb3VyY2VfZGlyZWN0b3J5XSkKKyAgICBpZiBub3Qgc2VsZi52ZXJib3NlOgorICAgICAgbGNvdl9hcmdzLmFwcGVuZCgnLS1xdWlldCcpCisgICAgbGNvdl9hcmdzLmV4dGVuZChhcmdzKQorICAgIHJldHVybiBzZWxmLmNhbGwobGNvdl9hcmdzLCBkcnlfcnVuPWRyeV9ydW4sIGVudj1zZWxmLmxjb3ZfZW52KQorCisgIGRlZiBjYWxjdWxhdGVfY292ZXJhZ2VfdGVzdHMoc2VsZiwgYXJncyk6CisgICAgIiIiRGV0ZXJtaW5lIHdoaWNoIHRlc3RzIHNob3VsZCBiZSBydW4uIiIiCisgICAgdGVzdGluZ190b29sc19kaXJlY3RvcnkgPSBvcy5wYXRoLmpvaW4oc2VsZi5zb3VyY2VfZGlyZWN0b3J5LCAndGVzdGluZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rvb2xzJykKKyAgICBjb3ZlcmFnZV90ZXN0cyA9IHt9CisgICAgZm9yIG5hbWUgaW4gQ09WRVJBR0VfVEVTVFMua2V5cygpOgorICAgICAgdGVzdF9zcGVjID0gQ09WRVJBR0VfVEVTVFNbbmFtZV0KKyAgICAgIGlmIHRlc3Rfc3BlYy51c2VfdGVzdF9ydW5uZXI6CisgICAgICAgIGJpbmFyeV9wYXRoID0gb3MucGF0aC5qb2luKHRlc3RpbmdfdG9vbHNfZGlyZWN0b3J5LCB0ZXN0X3NwZWMuYmluYXJ5KQorICAgICAgZWxzZToKKyAgICAgICAgYmluYXJ5X3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9kaXJlY3RvcnksIHRlc3Rfc3BlYy5iaW5hcnkpCisgICAgICBjb3ZlcmFnZV90ZXN0c1tuYW1lXSA9IFRlc3RTcGVjKGJpbmFyeV9wYXRoLCB0ZXN0X3NwZWMudXNlX3Rlc3RfcnVubmVyKQorCisgICAgaWYgYXJnc1sndGVzdHMnXToKKyAgICAgIHJldHVybiB7bmFtZTogc3BlYworICAgICAgICBmb3IgbmFtZSwgc3BlYyBpbiBjb3ZlcmFnZV90ZXN0cy5pdGVyaXRlbXMoKSBpZiBuYW1lIGluIGFyZ3NbJ3Rlc3RzJ119CisgICAgZWxpZiBub3QgYXJnc1snc2xvdyddOgorICAgICAgcmV0dXJuIHtuYW1lOiBzcGVjCisgICAgICAgIGZvciBuYW1lLCBzcGVjIGluIGNvdmVyYWdlX3Rlc3RzLml0ZXJpdGVtcygpIGlmIG5hbWUgbm90IGluIFNMT1dfVEVTVFN9CisgICAgZWxzZToKKyAgICAgIHJldHVybiBjb3ZlcmFnZV90ZXN0cworCisgIGRlZiBmaW5kX2FjY2VwdGFibGVfYmluYXJ5KHNlbGYsIGJpbmFyeV9uYW1lLCB2ZXJzaW9uX3JlZ2V4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fbWFqb3JfdmVyc2lvbiwgbWluX21pbm9yX3ZlcnNpb24pOgorICAgICIiIkZpbmQgdGhlIG5ld2VzdCB2ZXJzaW9uIG9mIGJpbmFyeSB0aGF0IG1lZXRzIHRoZSBtaW4gdmVyc2lvbi4iIiIKKyAgICBtaW5fdmVyc2lvbiA9IChtaW5fbWFqb3JfdmVyc2lvbiwgbWluX21pbm9yX3ZlcnNpb24pCisgICAgcGFyc2VkX3ZlcnNpb25zID0ge30KKyAgICAjIFdoZW4gY2FsbGluZyBCYXNoIGJ1aWx0aW5zIGxpa2UgdGhpcyB0aGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIG11c3QgYmUKKyAgICAjIHBhc3NlZCBpbiBhcyBhIHNpbmdsZSBzdHJpbmcgaW5zdGVhZCBvZiBhcyBzZXBhcmF0ZSBsaXN0IG1lbWJlcnMuCisgICAgcG90ZW50aWFsX2JpbmFyaWVzID0gc2VsZi5jaGVja19vdXRwdXQoCisgICAgICAgIFsnYmFzaCcsICctYycsICdjb21wZ2VuIC1hYmNrICVzJyAlIGJpbmFyeV9uYW1lXSkuc3BsaXRsaW5lcygpCisgICAgZm9yIGJpbmFyeSBpbiBwb3RlbnRpYWxfYmluYXJpZXM6CisgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgIHByaW50ICdUZXN0aW5nIGxsdm0tY292IGJpbmFyeSwgJXMnICUgYmluYXJ5CisgICAgICAjIEFzc3VtaW5nIHRoYXQgc2NyaXB0cyB0aGF0IGRvbid0IHJlc3BvbmQgdG8gLS12ZXJzaW9uIGNvcnJlY3RseSBhcmUgbm90CisgICAgICAjIHZhbGlkIGJpbmFyaWVzIGFuZCBqdXN0IGhhcHBlbmVkIHRvIGdldCBnbG9iYmVkIGluLiBUaGlzIGlzIHRydWUgZm9yCisgICAgICAjIGxjb3YgYW5kIGxsdm0tY292CisgICAgICB0cnk6CisgICAgICAgIHZlcnNpb25fb3V0cHV0ID0gc2VsZi5jaGVja19vdXRwdXQoW2JpbmFyeSwgJy0tdmVyc2lvbiddKS5zcGxpdGxpbmVzKCkKKyAgICAgIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcjoKKyAgICAgICAgaWYgc2VsZi52ZXJib3NlOgorICAgICAgICAgIHByaW50ICctLXZlcnNpb24gcmV0dXJuZWQgZmFpbHVyZSBzdGF0dXMgMSwgc28gaWdub3JpbmcnCisgICAgICAgIGNvbnRpbnVlCisKKyAgICAgIGZvciBsaW5lIGluIHZlcnNpb25fb3V0cHV0OgorICAgICAgICBtYXRjaGVyID0gcmUubWF0Y2godmVyc2lvbl9yZWdleCwgbGluZSkKKyAgICAgICAgaWYgbWF0Y2hlcjoKKyAgICAgICAgICBwYXJzZWRfdmVyc2lvbiA9IChpbnQobWF0Y2hlci5ncm91cCgxKSksIGludChtYXRjaGVyLmdyb3VwKDIpKSkKKyAgICAgICAgICBpZiBwYXJzZWRfdmVyc2lvbiA+PSBtaW5fdmVyc2lvbjoKKyAgICAgICAgICAgIHBhcnNlZF92ZXJzaW9uc1twYXJzZWRfdmVyc2lvbl0gPSBiaW5hcnkKKyAgICAgICAgICBicmVhaworCisgICAgaWYgbm90IHBhcnNlZF92ZXJzaW9uczoKKyAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuIHBhcnNlZF92ZXJzaW9uc1ttYXgocGFyc2VkX3ZlcnNpb25zKV0KKworICBkZWYgZGV0ZXJtaW5lX3Byb3Blcl9sbHZtX2NvdihzZWxmKToKKyAgICAiIiJGaW5kIGEgdmVyc2lvbiBvZiBsbHZtX2NvdiB0aGF0IHdpbGwgd29yayB3aXRoIHRoZSBzY3JpcHQuIiIiCisgICAgdmVyc2lvbl9yZWdleCA9IHJlLmNvbXBpbGUoJy4qTExWTSB2ZXJzaW9uIChbXGRdKylcLihbXGRdKykuKicpCisgICAgcmV0dXJuIHNlbGYuZmluZF9hY2NlcHRhYmxlX2JpbmFyeSgnbGx2bS1jb3YnLCB2ZXJzaW9uX3JlZ2V4LCAzLCA1KQorCisgIGRlZiBkZXRlcm1pbmVfcHJvcGVyX2xjb3Yoc2VsZik6CisgICAgIiIiRmluZCBhIHZlcnNpb24gb2YgbGNvdiB0aGF0IHdpbGwgd29yayB3aXRoIHRoZSBzY3JpcHQuIiIiCisgICAgdmVyc2lvbl9yZWdleCA9IHJlLmNvbXBpbGUoJy4qTENPViB2ZXJzaW9uIChbXGRdKylcLihbXGRdKykuKicpCisgICAgcmV0dXJuIHNlbGYuZmluZF9hY2NlcHRhYmxlX2JpbmFyeSgnbGNvdicsIHZlcnNpb25fcmVnZXgsIDEsIDExKQorCisgIGRlZiBidWlsZF9iaW5hcmllcyhzZWxmKToKKyAgICAiIiJCdWlsZCBhbGwgdGhlIGJpbmFyaWVzIHRoYXQgYXJlIGdvaW5nIHRvIGJlIG5lZWRlZCBmb3IgY292ZXJhZ2UKKyAgICBnZW5lcmF0aW9uLiIiIgorICAgIGNhbGxfYXJncyA9IFsnbmluamEnXQorICAgIGlmIHNlbGYudXNlX2dvbWE6CisgICAgICBjYWxsX2FyZ3MuZXh0ZW5kKFsnLWonLCAnMjUwJ10pCisgICAgY2FsbF9hcmdzLmV4dGVuZChbJy1DJywgc2VsZi5idWlsZF9kaXJlY3RvcnldKQorICAgIHJldHVybiBzZWxmLmNhbGwoY2FsbF9hcmdzLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikgPT0gMAorCisgIGRlZiBnZW5lcmF0ZV9jb3ZlcmFnZShzZWxmLCBuYW1lLCBzcGVjKToKKyAgICAiIiJHZW5lcmF0ZSB0aGUgY292ZXJhZ2UgZGF0YSBmb3IgYSB0ZXN0CisKKyAgICBBcmdzOgorICAgICAgICBuYW1lOiBOYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGVzdCB0byBiZSBydW4uIFRoaXMgaXMgdXNlZCBhcyBhIGxhYmVsCisgICAgICAgICAgICAgIGluIHRoZSBjb3ZlcmFnZSBkYXRhLCBzbyBzaG91bGQgYmUgdW5pcXVlIGFjcm9zcyBhbGwgb2YgdGhlIHRlc3RzCisgICAgICAgICAgICAgIGJlaW5nIHJ1bi4KKyAgICAgICAgc3BlYzogVHVwbGUgY29udGFpbmluZyB0aGUgcGF0aCB0byB0aGUgYmluYXJ5IHRvIHJ1biwgYW5kIGlmIHRoaXMgdGVzdAorICAgICAgICAgICAgICB1c2VzIHRlc3RfcnVubmVyLnB5LgorICAgICIiIgorICAgIGlmIHNlbGYudmVyYm9zZToKKyAgICAgIHByaW50ICJHZW5lcmF0aW5nIGNvdmVyYWdlIGZvciB0ZXN0ICclcycsIHVzaW5nIGRhdGEgJyVzJyIgJSAobmFtZSwgc3BlYykKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc3BlYy5iaW5hcnkpOgorICAgICAgcHJpbnQoJ1VuYWJsZSB0byBnZW5lcmF0ZSBjb3ZlcmFnZSBmb3IgJXMsIHNpbmNlIGl0IGFwcGVhcnMgdG8gbm90IGV4aXN0JworICAgICAgICAgICAgJyBAICVzJykgJSAobmFtZSwgc3BlYy5iaW5hcnkpCisgICAgICByZXR1cm4gRmFsc2UKKworICAgIGlmIHNlbGYuY2FsbF9sY292KFsnLS16ZXJvY291bnRlcnMnXSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pOgorICAgICAgcHJpbnQgJ1VuYWJsZSB0byBjbGVhciBjb3VudGVycyBmb3IgJXMnICUgbmFtZQorICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBiaW5hcnlfYXJncyA9IFtzcGVjLmJpbmFyeV0KKyAgICBpZiBzcGVjLnVzZV90ZXN0X3J1bm5lcjoKKyAgICAgICMgVGVzdCBydW5uZXIgcGVyZm9ybXMgbXVsdGktdGhyZWFkaW5nIGluIHRoZSB3cmFwcGVyIHNjcmlwdCwgbm90IHRoZSB0ZXN0CisgICAgICAjIGJpbmFyeSwgc28gbmVlZCAtaiAxLCBvdGhlcndpc2UgbXVsdGlwbGUgcHJvY2Vzc2VzIHdpbGwgYmUgd3JpdGluZyB0bworICAgICAgIyB0aGUgY29kZSBjb3ZlcmFnZSBmaWxlcywgaW52YWxpZGF0aW5nIHJlc3VsdHMuCisgICAgICAjIFRPRE8ocGRmaXVtOjgxMSk6IFJld3JpdGUgaG93IHRlc3QgcnVubmVyIHRlc3RzIHdvcmssIHNvIHRoYXQgdGhleSBjYW4KKyAgICAgICMgYmUgcnVuIGluIG11bHRpLXRocmVhZGVkIG1vZGUuCisgICAgICBiaW5hcnlfYXJncy5leHRlbmQoWyctaicsICcxJywgJy0tYnVpbGQtZGlyJywgc2VsZi5idWlsZF9kaXJlY3RvcnldKQorICAgIGlmIHNlbGYuY2FsbChiaW5hcnlfYXJncywgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pIGFuZCBzZWxmLnZlcmJvc2U6CisgICAgICBwcmludCgnUnVubmluZyAlcyBhcHBlYXJzIHRvIGhhdmUgZmFpbGVkLCB3aGljaCBtaWdodCBhZmZlY3QgJworICAgICAgICAgICAgJ3Jlc3VsdHMnKSAlIHNwZWMuYmluYXJ5CisKKyAgICBvdXRwdXRfcmF3X3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5vdXRwdXRfZGlyZWN0b3J5LCAnJXNfcmF3LmluZm8nICUgbmFtZSkKKyAgICBpZiBzZWxmLmNhbGxfbGNvdigKKyAgICAgICAgWyctLWNhcHR1cmUnLCAnLS10ZXN0LW5hbWUnLCBuYW1lLCAnLS1vdXRwdXQtZmlsZScsIG91dHB1dF9yYXdfcGF0aF0sCisgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuKToKKyAgICAgIHByaW50ICdVbmFibGUgdG8gY2FwdHVyZSBjb3ZlcmFnZSBkYXRhIGZvciAlcycgJSBuYW1lCisgICAgICByZXR1cm4gRmFsc2UKKworICAgIG91dHB1dF9maWx0ZXJlZF9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYub3V0cHV0X2RpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXNfZmlsdGVyZWQuaW5mbycgJSBuYW1lKQorICAgIG91dHB1dF9maWx0ZXJzID0gWworICAgICAgICAnL3Vzci9pbmNsdWRlLyonLCAnKnRoaXJkX3BhcnR5KicsICcqdGVzdGluZyonLCAnKl91bml0dGVzdC5jcHAnLAorICAgICAgICAnKl9lbWJlZGRlcnRlc3QuY3BwJworICAgIF0KKyAgICBpZiBzZWxmLmNhbGxfbGNvdigKKyAgICAgICAgWyctLXJlbW92ZScsIG91dHB1dF9yYXdfcGF0aF0gKyBvdXRwdXRfZmlsdGVycyArCisgICAgICAgIFsnLS1vdXRwdXQtZmlsZScsIG91dHB1dF9maWx0ZXJlZF9wYXRoXSwKKyAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4sCisgICAgICAgIG5lZWRzX2RpcmVjdG9yeT1GYWxzZSk6CisgICAgICBwcmludCAnVW5hYmxlIHRvIGZpbHRlciBjb3ZlcmFnZSBkYXRhIGZvciAlcycgJSBuYW1lCisgICAgICByZXR1cm4gRmFsc2UKKworICAgIHNlbGYuY292ZXJhZ2VfZmlsZXMuYWRkKG91dHB1dF9maWx0ZXJlZF9wYXRoKQorICAgIHJldHVybiBUcnVlCisKKyAgZGVmIG1lcmdlX2NvdmVyYWdlKHNlbGYpOgorICAgICIiIk1lcmdlIGFsbCBvZiB0aGUgY292ZXJhZ2UgZGF0YSBzZXRzIGludG8gb25lIGZvciByZXBvcnQgZ2VuZXJhdGlvbi4iIiIKKyAgICBtZXJnZV9hcmdzID0gW10KKyAgICBmb3IgY292ZXJhZ2VfZmlsZSBpbiBzZWxmLmNvdmVyYWdlX2ZpbGVzOgorICAgICAgbWVyZ2VfYXJncy5leHRlbmQoWyctLWFkZC10cmFjZWZpbGUnLCBjb3ZlcmFnZV9maWxlXSkKKworICAgIG1lcmdlX2FyZ3MuZXh0ZW5kKFsnLS1vdXRwdXQtZmlsZScsIHNlbGYuY292ZXJhZ2VfdG90YWxzX3BhdGhdKQorICAgIHJldHVybiBzZWxmLmNhbGxfbGNvdigKKyAgICAgICAgbWVyZ2VfYXJncywgZHJ5X3J1bj1zZWxmLmRyeV9ydW4sIG5lZWRzX2RpcmVjdG9yeT1GYWxzZSkgPT0gMAorCisgIGRlZiBnZW5lcmF0ZV9yZXBvcnQoc2VsZik6CisgICAgIiIiUHJvZHVjZSBIVE1MIGNvdmVyYWdlIHJlcG9ydCBiYXNlZCBvbiBjb21iaW5lZCBjb3ZlcmFnZSBkYXRhIHNldC4iIiIKKyAgICBjb25maWdfZmlsZSA9IG9zLnBhdGguam9pbigKKyAgICAgICAgc2VsZi5zb3VyY2VfZGlyZWN0b3J5LCAndGVzdGluZycsICd0b29scycsICdjb3ZlcmFnZScsICdsY292cmMnKQorCisgICAgbGNvdl9hcmdzID0gWydnZW5odG1sJywKKyAgICAgICctLWNvbmZpZy1maWxlJywgY29uZmlnX2ZpbGUsCisgICAgICAnLS1sZWdlbmQnLAorICAgICAgJy0tZGVtYW5nbGUtY3BwJywKKyAgICAgICctLXNob3ctZGV0YWlscycsCisgICAgICAnLS1wcmVmaXgnLCBzZWxmLnNvdXJjZV9kaXJlY3RvcnksCisgICAgICAnLS1pZ25vcmUtZXJyb3JzJywKKyAgICAgICdzb3VyY2UnLCBzZWxmLmNvdmVyYWdlX3RvdGFsc19wYXRoLAorICAgICAgJy0tb3V0cHV0LWRpcmVjdG9yeScsIHNlbGYub3V0cHV0X2RpcmVjdG9yeV0KKyAgICByZXR1cm4gc2VsZi5jYWxsKGxjb3ZfYXJncywgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pID09IDAKKworICBkZWYgcnVuKHNlbGYpOgorICAgICIiIlNldHVwIGVudmlyb25tZW50LCBleGVjdXRlIHRoZSB0ZXN0cyBhbmQgZ2VuZXJhdGUgY292ZXJhZ2UgcmVwb3J0IiIiCisgICAgaWYgbm90IHNlbGYuYnVpbGRfYmluYXJpZXMoKToKKyAgICAgIHByaW50ICdGYWlsZWQgdG8gc3VjY2Vzc2Z1bGx5IGJ1aWxkIGJpbmFyaWVzJworICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBmb3IgbmFtZSBpbiBzZWxmLmNvdmVyYWdlX3Rlc3RzLmtleXMoKToKKyAgICAgIGlmIG5vdCBzZWxmLmdlbmVyYXRlX2NvdmVyYWdlKG5hbWUsIHNlbGYuY292ZXJhZ2VfdGVzdHNbbmFtZV0pOgorICAgICAgICBwcmludCAnRmFpbGVkIHRvIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZSBjb3ZlcmFnZSBkYXRhJworICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGlmIG5vdCBzZWxmLm1lcmdlX2NvdmVyYWdlKCk6CisgICAgICBwcmludCAnRmFpbGVkIHRvIHN1Y2Nlc3NmdWxseSBtZXJnZSBnZW5lcmF0ZWQgY292ZXJhZ2UgZGF0YScKKyAgICAgIHJldHVybiBGYWxzZQorCisgICAgaWYgbm90IHNlbGYuZ2VuZXJhdGVfcmVwb3J0KCk6CisgICAgICBwcmludCAnRmFpbGVkIHRvIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQgY292ZXJhZ2UgcmVwb3J0JworICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICByZXR1cm4gVHJ1ZQorCisKK2RlZiBtYWluKCk6CisgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgcGFyc2VyLmZvcm1hdHRlcl9jbGFzcyA9IGFyZ3BhcnNlLlJhd0Rlc2NyaXB0aW9uSGVscEZvcm1hdHRlcgorICBwYXJzZXIuZGVzY3JpcHRpb24gPSAoJ0dlbmVyYXRlcyBhIGNvdmVyYWdlIHJlcG9ydCBmb3IgZ2l2ZW4gYmluYXJpZXMgdXNpbmcgJworICAgICAgICAgICAgICAgICAgICAgICAgJ2xsdm0tY292ICYgbGNvdi5cblxuJworICAgICAgICAgICAgICAgICAgICAgICAgJ1JlcXVpcmVzIGxsdm0tY292IDMuNSBvciBsYXRlci5cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICdSZXF1aXJlcyBsY292IDEuMTEgb3IgbGF0ZXIuXG5cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICdCeSBkZWZhdWx0IHJ1bnMgcGRmaXVtX3VuaXR0ZXN0cyBhbmQgJworICAgICAgICAgICAgICAgICAgICAgICAgJ3BkZml1bV9lbWJlZGRlcnRlc3RzLiBJZiAtLXNsb3cgaXMgcGFzc2VkIGluIHRoZW4gYWxsICcKKyAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0cyB3aWxsIGJlIHJ1bi4gSWYgYW55IG9mIHRoZSB0ZXN0cyBhcmUgc3BlY2lmaWVkICcKKyAgICAgICAgICAgICAgICAgICAgICAgICdvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGVuIG9ubHkgdGhvc2Ugd2lsbCBiZSBydW4uJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctcycsCisgICAgICAnLS1zb3VyY2VfZGlyZWN0b3J5JywKKyAgICAgIGhlbHA9J0xvY2F0aW9uIG9mIFBERml1bSBzb3VyY2UgZGlyZWN0b3J5LCBkZWZhdWx0cyB0byBDV0QnLAorICAgICAgZGVmYXVsdD1vcy5nZXRjd2QoKSkKKyAgYnVpbGRfZGVmYXVsdCA9IG9zLnBhdGguam9pbignb3V0JywgJ0NvdmVyYWdlJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctYicsCisgICAgICAnLS1idWlsZF9kaXJlY3RvcnknLAorICAgICAgaGVscD0KKyAgICAgICdMb2NhdGlvbiBvZiBQREZpdW0gYnVpbGQgZGlyZWN0b3J5IHdpdGggY292ZXJhZ2UgZW5hYmxlZCwgZGVmYXVsdHMgdG8gJworICAgICAgJyVzIHVuZGVyIENXRCcgJSBidWlsZF9kZWZhdWx0LAorICAgICAgZGVmYXVsdD1vcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksIGJ1aWxkX2RlZmF1bHQpKQorICBvdXRwdXRfZGVmYXVsdCA9ICdjb3ZlcmFnZV9yZXBvcnQnCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnLW8nLAorICAgICAgJy0tb3V0cHV0X2RpcmVjdG9yeScsCisgICAgICBoZWxwPSdMb2NhdGlvbiB0byB3cml0ZSBvdXQgY292ZXJhZ2UgcmVwb3J0IHRvLCBkZWZhdWx0cyB0byAlcyB1bmRlciBDV0QgJworICAgICAgJSBvdXRwdXRfZGVmYXVsdCwKKyAgICAgIGRlZmF1bHQ9b3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCBvdXRwdXRfZGVmYXVsdCkpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnLW4nLAorICAgICAgJy0tZHJ5LXJ1bicsCisgICAgICBoZWxwPSdPdXRwdXQgY29tbWFuZHMgaW5zdGVhZCBvZiBleGVjdXRpbmcgdGhlbScsCisgICAgICBhY3Rpb249J3N0b3JlX3RydWUnKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgJy12JywKKyAgICAgICctLXZlcmJvc2UnLAorICAgICAgaGVscD0nT3V0cHV0IGFkZGl0aW9uYWwgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbicsCisgICAgICBhY3Rpb249J3N0b3JlX3RydWUnKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgJy0tc2xvdycsCisgICAgICBoZWxwPSdSdW4gYWxsIHRlc3RzLCBldmVuIHRob3NlIGtub3duIHRvIHRha2UgYSBsb25nIHRpbWUuIElnbm9yZWQgaWYgJworICAgICAgJ3NwZWNpZmljIHRlc3RzIGFyZSBwYXNzZWQgaW4uJywKKyAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAndGVzdHMnLAorICAgICAgaGVscD0nVGVzdHMgdG8gYmUgcnVuLCBkZWZhdWx0cyB0byBhbGwuIFZhbGlkIGVudHJpZXMgYXJlICVzJyAlCisgICAgICBDT1ZFUkFHRV9URVNUUy5rZXlzKCksCisgICAgICBuYXJncz0nKicpCisKKyAgYXJncyA9IHZhcnMocGFyc2VyLnBhcnNlX2FyZ3MoKSkKKyAgaWYgYXJnc1sndmVyYm9zZSddOgorICAgIHBwcmludC5wcHJpbnQoYXJncykKKworICBleGVjdXRvciA9IENvdmVyYWdlRXhlY3V0b3IocGFyc2VyLCBhcmdzKQorICBpZiBleGVjdXRvci5ydW4oKToKKyAgICByZXR1cm4gMAorICByZXR1cm4gMQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHN5cy5leGl0KG1haW4oKSkKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvdG9vbHMvY292ZXJhZ2UvbGNvdnJjIGIvdGVzdGluZy90b29scy9jb3ZlcmFnZS9sY292cmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJkMzlkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvdG9vbHMvY292ZXJhZ2UvbGNvdnJjCkBAIC0wLDAgKzEsMTU2IEBACisjIFNwZWNpZnkgYW4gZXh0ZXJuYWwgc3R5bGUgc2hlZXQgZmlsZSAoc2FtZSBhcyAtLWNzcy1maWxlIG9wdGlvbiBvZiBnZW5odG1sKQorI2dlbmh0bWxfY3NzX2ZpbGUgPSBnY292LmNzcworCisjIFNwZWNpZnkgY292ZXJhZ2UgcmF0ZSBsaW1pdHMgKGluICUpIGZvciBjbGFzc2lmeWluZyBmaWxlIGVudHJpZXMKKyMgSEk6ICAgaGlfbGltaXQgPD0gcmF0ZSA8PSAxMDAgICAgICAgICBncmFwaCBjb2xvcjogZ3JlZW4KKyMgTUVEOiBtZWRfbGltaXQgPD0gcmF0ZSA8ICBoaV9saW1pdCAgICBncmFwaCBjb2xvcjogb3JhbmdlCisjIExPOiAgICAgICAgIDAgIDw9IHJhdGUgPCAgbWVkX2xpbWl0ICAgZ3JhcGggY29sb3I6IHJlZAorZ2VuaHRtbF9oaV9saW1pdCA9IDgwCitnZW5odG1sX21lZF9saW1pdCA9IDUwCisKKyMgV2lkdGggb2YgbGluZSBjb3ZlcmFnZSBmaWVsZCBpbiBzb3VyY2UgY29kZSB2aWV3CitnZW5odG1sX2xpbmVfZmllbGRfd2lkdGggPSAxMgorCisjIFdpZHRoIG9mIGJyYW5jaCBjb3ZlcmFnZSBmaWVsZCBpbiBzb3VyY2UgY29kZSB2aWV3CitnZW5odG1sX2JyYW5jaF9maWVsZF93aWR0aCA9IDE2CisKKyMgV2lkdGggb2Ygb3ZlcnZpZXcgaW1hZ2UgKHVzZWQgYnkgLS1mcmFtZXMgb3B0aW9uIG9mIGdlbmh0bWwpCitnZW5odG1sX292ZXJ2aWV3X3dpZHRoID0gODAKKworIyBSZXNvbHV0aW9uIG9mIG92ZXJ2aWV3IG5hdmlnYXRpb246IHRoaXMgbnVtYmVyIHNwZWNpZmllcyB0aGUgbWF4aW11bQorIyBkaWZmZXJlbmNlIGluIGxpbmVzIGJldHdlZW4gdGhlIHBvc2l0aW9uIGEgdXNlciBzZWxlY3RlZCBmcm9tIHRoZSBvdmVydmlldworIyBhbmQgdGhlIHBvc2l0aW9uIHRoZSBzb3VyY2UgY29kZSB3aW5kb3cgaXMgc2Nyb2xsZWQgdG8gKHVzZWQgYnkgLS1mcmFtZXMKKyMgb3B0aW9uIG9mIGdlbmh0bWwpCitnZW5odG1sX25hdl9yZXNvbHV0aW9uID0gNAorCisjIENsaWNraW5nIGEgbGluZSBpbiB0aGUgb3ZlcnZpZXcgaW1hZ2Ugc2hvdWxkIHNob3cgdGhlIHNvdXJjZSBjb2RlIHZpZXcgYXQKKyMgYSBwb3NpdGlvbiBhIGJpdCBmdXJ0aGVyIHVwIHNvIHRoYXQgdGhlIHJlcXVlc3RlZCBsaW5lIGlzIG5vdCB0aGUgZmlyc3QKKyMgbGluZSBpbiB0aGUgd2luZG93LiBUaGlzIG51bWJlciBzcGVjaWZpZXMgdGhhdCBvZmZzZXQgaW4gbGluZXMgKHVzZWQgYnkKKyMgLS1mcmFtZXMgb3B0aW9uIG9mIGdlbmh0bWwpCitnZW5odG1sX25hdl9vZmZzZXQgPSAxMAorCisjIERvIG5vdCByZW1vdmUgdW51c2VkIHRlc3QgZGVzY3JpcHRpb25zIGlmIG5vbi16ZXJvIChzYW1lIGFzCisjIC0ta2VlcC1kZXNjcmlwdGlvbnMgb3B0aW9uIG9mIGdlbmh0bWwpCitnZW5odG1sX2tlZXBfZGVzY3JpcHRpb25zID0gMAorCisjIERvIG5vdCByZW1vdmUgcHJlZml4IGZyb20gZGlyZWN0b3J5IG5hbWVzIGlmIG5vbi16ZXJvIChzYW1lIGFzIC0tbm8tcHJlZml4CisjIG9wdGlvbiBvZiBnZW5odG1sKQorZ2VuaHRtbF9ub19wcmVmaXggPSAwCisKKyMgRG8gbm90IGNyZWF0ZSBzb3VyY2UgY29kZSB2aWV3IGlmIG5vbi16ZXJvIChzYW1lIGFzIC0tbm8tc291cmNlIG9wdGlvbiBvZgorIyBnZW5odG1sKQorZ2VuaHRtbF9ub19zb3VyY2UgPSAwCisKKyMgUmVwbGFjZSB0YWJzIHdpdGggbnVtYmVyIG9mIHNwYWNlcyBpbiBzb3VyY2UgdmlldyAoc2FtZSBhcyAtLW51bS1zcGFjZXMKKyMgb3B0aW9uIG9mIGdlbmh0bWwpCitnZW5odG1sX251bV9zcGFjZXMgPSA4CisKKyMgSGlnaGxpZ2h0IGxpbmVzIHdpdGggY29udmVydGVkLW9ubHkgZGF0YSBpZiBub24temVybyAoc2FtZSBhcyAtLWhpZ2hsaWdodAorIyBvcHRpb24gb2YgZ2VuaHRtbCkKK2dlbmh0bWxfaGlnaGxpZ2h0ID0gMAorCisjIEluY2x1ZGUgY29sb3IgbGVnZW5kIGluIEhUTUwgb3V0cHV0IGlmIG5vbi16ZXJvIChzYW1lIGFzIC0tbGVnZW5kIG9wdGlvbiBvZgorIyBnZW5odG1sKQorZ2VuaHRtbF9sZWdlbmQgPSAwCisKKyMgVXNlIEZJTEUgYXMgSFRNTCBwcm9sb2cgZm9yIGdlbmVyYXRlZCBwYWdlcyAoc2FtZSBhcyAtLWh0bWwtcHJvbG9nIG9wdGlvbiBvZgorIyBnZW5odG1sKQorI2dlbmh0bWxfaHRtbF9wcm9sb2cgPSBGSUxFCisKKyMgVXNlIEZJTEUgYXMgSFRNTCBlcGlsb2cgZm9yIGdlbmVyYXRlZCBwYWdlcyAoc2FtZSBhcyAtLWh0bWwtZXBpbG9nIG9wdGlvbiBvZgorIyBnZW5odG1sKQorI2dlbmh0bWxfaHRtbF9lcGlsb2cgPSBGSUxFCisKKyMgVXNlIGN1c3RvbSBmaWxlbmFtZSBleHRlbnNpb24gZm9yIHBhZ2VzIChzYW1lIGFzIC0taHRtbC1leHRlbnNpb24gb3B0aW9uIG9mCisjIGdlbmh0bWwpCisjZ2VuaHRtbF9odG1sX2V4dGVuc2lvbiA9IGh0bWwKKworIyBDb21wcmVzcyBhbGwgZ2VuZXJhdGVkIGh0bWwgZmlsZXMgd2l0aCBnemlwLgorI2dlbmh0bWxfaHRtbF9nemlwID0gMQorCisjIEluY2x1ZGUgc29ydGVkIG92ZXJ2aWV3IHBhZ2VzIChjYW4gYmUgZGlzYWJsZWQgYnkgdGhlIC0tbm8tc29ydCBvcHRpb24gb2YKKyMgZ2VuaHRtbCkKK2dlbmh0bWxfc29ydCA9IDEKKworIyBJbmNsdWRlIGZ1bmN0aW9uIGNvdmVyYWdlIGRhdGEgZGlzcGxheSAoY2FuIGJlIGRpc2FibGVkIGJ5IHRoZQorIyAtLW5vLWZ1bmMtY292ZXJhZ2Ugb3B0aW9uIG9mIGdlbmh0bWwpCitnZW5odG1sX2Z1bmN0aW9uX2NvdmVyYWdlID0gMQorCisjIEluY2x1ZGUgYnJhbmNoIGNvdmVyYWdlIGRhdGEgZGlzcGxheSAoY2FuIGJlIGRpc2FibGVkIGJ5IHRoZQorIyAtLW5vLWJyYW5jaC1jb3ZlcmFnZSBvcHRpb24gb2YgZ2VuaHRtbCkKK2dlbmh0bWxfYnJhbmNoX2NvdmVyYWdlID0gMQorCisjIFNwZWNpZnkgdGhlIGNoYXJhY3RlciBzZXQgb2YgYWxsIGdlbmVyYXRlZCBIVE1MIHBhZ2VzCitnZW5odG1sX2NoYXJzZXQ9VVRGLTgKKworIyBBbGxvdyBIVE1MIG1hcmt1cCBpbiB0ZXN0IGNhc2UgZGVzY3JpcHRpb24gdGV4dCBpZiBub24temVybworZ2VuaHRtbF9kZXNjX2h0bWw9MAorCisjIFNwZWNpZnkgdGhlIHByZWNpc2lvbiBmb3IgY292ZXJhZ2UgcmF0ZXMKKyNnZW5odG1sX3ByZWNpc2lvbj0xCisKKyMgTG9jYXRpb24gb2YgdGhlIGdjb3YgdG9vbCAoc2FtZSBhcyAtLWdjb3YtaW5mbyBvcHRpb24gb2YgZ2VuaW5mbykKKyNnZW5pbmZvX2djb3ZfdG9vbCA9IGxsdm0tZ2NvdgorCisjIEFkanVzdCB0ZXN0IG5hbWVzIHRvIGluY2x1ZGUgb3BlcmF0aW5nIHN5c3RlbSBpbmZvcm1hdGlvbiBpZiBub24temVybworI2dlbmluZm9fYWRqdXN0X3Rlc3RuYW1lID0gMAorCisjIENhbGN1bGF0ZSBjaGVja3N1bSBmb3IgZWFjaCBzb3VyY2UgY29kZSBsaW5lIGlmIG5vbi16ZXJvIChzYW1lIGFzIC0tY2hlY2tzdW0KKyMgb3B0aW9uIG9mIGdlbmluZm8gaWYgbm9uLXplcm8sIHNhbWUgYXMgLS1uby1jaGVja3N1bSBpZiB6ZXJvKQorI2dlbmluZm9fY2hlY2tzdW0gPSAxCisKKyMgU3BlY2lmeSB3aGV0aGVyIHRvIGNhcHR1cmUgY292ZXJhZ2UgZGF0YSBmb3IgZXh0ZXJuYWwgc291cmNlIGZpbGVzIChjYW4KKyMgYmUgb3ZlcnJpZGRlbiBieSB0aGUgLS1leHRlcm5hbCBhbmQgLS1uby1leHRlcm5hbCBvcHRpb25zIG9mIGdlbmluZm8vbGNvdikKK2dlbmluZm9fZXh0ZXJuYWwgPSAxCisKKyMgRW5hYmxlIGxpYnRvb2wgY29tcGF0aWJpbGl0eSBtb2RlIGlmIG5vbi16ZXJvIChzYW1lIGFzIC0tY29tcGF0LWxpYnRvb2wgb3B0aW9uCisjIG9mIGdlbmluZm8gaWYgbm9uLXplcm8sIHNhbWUgYXMgLS1uby1jb21wYXQtbGlidG9vbCBpZiB6ZXJvKQorI2dlbmluZm9fY29tcGF0X2xpYnRvb2wgPSAwCisKKyMgVXNlIGdjb3YncyAtLWFsbC1ibG9ja3Mgb3B0aW9uIGlmIG5vbi16ZXJvCisjZ2VuaW5mb19nY292X2FsbF9ibG9ja3MgPSAxCisKKyMgU3BlY2lmeSBjb21wYXRpYmxpdHkgbW9kZXMgKHNhbWUgYXMgLS1jb21wYXQgb3B0aW9uIG9mIGdlbmluZm8pLgorI2dlbmluZm9fY29tcGF0ID0gbGlidG9vbD1vbiwgaGFtbWVyPWF1dG8sIHNwbGl0X2NyYz1hdXRvCisKKyMgQWRqdXN0IHBhdGggdG8gc291cmNlIGZpbGVzIGJ5IHJlbW92aW5nIG9yIGNoYW5naW5nIHBhdGggY29tcG9uZW50cyB0aGF0CisjIG1hdGNoIHRoZSBzcGVjaWZpZWQgcGF0dGVybiAoUGVybCByZWd1bGFyIGV4cHJlc3Npb24gZm9ybWF0KQorI2dlbmluZm9fYWRqdXN0X3NyY19wYXRoID0gL3RtcC9idWlsZCA9PiAvdXNyL3NyYworCisjIFNwZWNpZnkgaWYgZ2VuaW5mbyBzaG91bGQgdHJ5IHRvIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHRoZSBiYXNlLWRpcmVjdG9yeQorIyB3aGVuIGNvbGxlY3RpbmcgY292ZXJhZ2UgZGF0YS4KK2dlbmluZm9fYXV0b19iYXNlID0gMQorCisjIERpcmVjdG9yeSBjb250YWluaW5nIGdjb3Yga2VybmVsIGZpbGVzCisjIGxjb3ZfZ2Nvdl9kaXIgPSAvcHJvYy9nY292CisKKyMgTG9jYXRpb24gb2YgdGhlIGluc21vZCB0b29sCitsY292X2luc21vZF90b29sID0gL3NiaW4vaW5zbW9kCisKKyMgTG9jYXRpb24gb2YgdGhlIG1vZHByb2JlIHRvb2wKK2xjb3ZfbW9kcHJvYmVfdG9vbCA9IC9zYmluL21vZHByb2JlCisKKyMgTG9jYXRpb24gb2YgdGhlIHJtbW9kIHRvb2wKK2xjb3Zfcm1tb2RfdG9vbCA9IC9zYmluL3JtbW9kCisKKyMgTG9jYXRpb24gZm9yIHRlbXBvcmFyeSBkaXJlY3RvcmllcworbGNvdl90bXBfZGlyID0gL3RtcAorCisjIFNob3cgZnVsbCBwYXRocyBkdXJpbmcgbGlzdCBvcGVyYXRpb24gaWYgbm9uLXplcm8gKHNhbWUgYXMgLS1saXN0LWZ1bGwtcGF0aAorIyBvcHRpb24gb2YgbGNvdikKK2xjb3ZfbGlzdF9mdWxsX3BhdGggPSAwCisKKyMgU3BlY2lmeSB0aGUgbWF4aW11bSB3aWR0aCBmb3IgbGlzdCBvdXRwdXQuIFRoaXMgdmFsdWUgaXMgaWdub3JlZCB3aGVuCisjIGxjb3ZfbGlzdF9mdWxsX3BhdGggaXMgbm9uLXplcm8uCitsY292X2xpc3Rfd2lkdGggPSA4MAorCisjIFNwZWNpZnkgdGhlIG1heGltdW0gcGVyY2VudGFnZSBvZiBmaWxlIG5hbWVzIHdoaWNoIG1heSBiZSB0cnVuY2F0ZWQgd2hlbgorIyBjaG9vc2luZyBhIGRpcmVjdG9yeSBwcmVmaXggaW4gbGlzdCBvdXRwdXQuIFRoaXMgdmFsdWUgaXMgaWdub3JlZCB3aGVuCisjIGxjb3ZfbGlzdF9mdWxsX3BhdGggaXMgbm9uLXplcm8uCitsY292X2xpc3RfdHJ1bmNhdGVfbWF4ID0gMjAKKworIyBTcGVjaWZ5IGlmIGZ1bmN0aW9uIGNvdmVyYWdlIGRhdGEgc2hvdWxkIGJlIGNvbGxlY3RlZCBhbmQgcHJvY2Vzc2VkLgorbGNvdl9mdW5jdGlvbl9jb3ZlcmFnZSA9IDEKKworIyBTcGVjaWZ5IGlmIGJyYW5jaCBjb3ZlcmFnZSBkYXRhIHNob3VsZCBiZSBjb2xsZWN0ZWQgYW5kIHByb2Nlc3NlZC4KK2xjb3ZfYnJhbmNoX2NvdmVyYWdlID0gMQpkaWZmIC0tZ2l0IGEvdGVzdGluZy90b29scy9jb3ZlcmFnZS9sbHZtLWdjb3YgYi90ZXN0aW5nL3Rvb2xzL2NvdmVyYWdlL2xsdm0tZ2NvdgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MTQxZTdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy90b29scy9jb3ZlcmFnZS9sbHZtLWdjb3YKQEAgLTAsMCArMSwxNSBAQAorIyEvYmluL2Jhc2gKKyMgQ29weXJpZ2h0IDIwMTcgVGhlIFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyMgV3JhcHBlciBzY3JpcHQgdG8gbWFrZSBsbHZtLWNvdiBiZWhhdmUgbGlrZSBnY292LCBzbyBpdCBjYW4gYmUgcGFzc2VkIGluIGFzIHRoZSAtLWdjb3YtdG9vbAorIyBwYXJhbWV0ZXIgd2hlbiB1c2luZyBsY292LiBTcGVjaWZpY2FsbHkgYWRkcyB0aGUga2V5d29yZCAnZ2NvdicgdG8gdGhlIGFyZ3VtZW50cyBiZWluZyBwYXNzZWQgaW4sCisjIHRvIHRlbGwgbGx2bS1jb3YgdG8gb3BlcmF0ZSBpbiBnY292IGNvbXBhdGliaWxpdHkgbW9kZS4KKyMKKyMgTExWTV9DT1ZfQklOIG5lZWRzIHRvIGJlIHNldCBieSBjYWxsZXIgYW5kIHNob3VsZCB0aGUgcGF0aCB0bworIyBhIGxsdm0tY292IGJpbmFyeSB3aXRoIGEgdmVyc2lvbiBvZiAzLjUgb3IgZ3JlYXRlci4KKworc2V0IC1lCisKK2V4ZWMgJHtMTFZNX0NPVl9CSU59IGdjb3YgJCoKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvdG9vbHMvZml4dXBfcGRmX3RlbXBsYXRlLnB5IGIvdGVzdGluZy90b29scy9maXh1cF9wZGZfdGVtcGxhdGUucHkKaW5kZXggODBhNzEyZi4uMTBjYTI0MSAxMDA3NTUKLS0tIGEvdGVzdGluZy90b29scy9maXh1cF9wZGZfdGVtcGxhdGUucHkKKysrIGIvdGVzdGluZy90b29scy9maXh1cF9wZGZfdGVtcGxhdGUucHkKQEAgLTEwLDggKzEwLDEwIEBACiAKICAge3toZWFkZXJ9fSAgICAgLSBleHBhbmRzIHRvIHRoZSBoZWFkZXIgY29tbWVudCByZXF1aXJlZCBmb3IgUERGIGZpbGVzLgogICB7e3hyZWZ9fSAgICAgICAtIGV4cGFuZHMgdG8gYSBnZW5lcmF0ZWQgeHJlZiB0YWJsZSwgbm90aW5nIHRoZSBvZmZzZXQuCisgIHt7dHJhaWxlcn19ICAgIC0gZXhwYW5kcyB0byBhIHN0YW5kYXJkIHRyYWlsZXIgd2l0aCAiMSAwIFIiIGFzIHRoZSAvUm9vdC4KICAge3tzdGFydHhyZWZ9ICAgLSBleHBhbmRzIHRvIGEgc3RhcnR4cmVmIGRpcmVjdGl2ZSBmb2xsb3dlZCBieSBjb3JyZWN0IG9mZnNldC4KLSAge3tvYmplY3QgeCB5fX0gLSBleHBhbmRzIHRvIHx4IHkgb2JqfCBkZWNsYXJhdGlvbiwgbm90aW5nIHRoZSBvZmZzZXQuIiIiCisgIHt7b2JqZWN0IHggeX19IC0gZXhwYW5kcyB0byB8eCB5IG9ianwgZGVjbGFyYXRpb24sIG5vdGluZyB0aGUgb2Zmc2V0LgorIiIiCiAKIGltcG9ydCBvcHRwYXJzZQogaW1wb3J0IG9zCkBAIC0xOSwxNSArMjEsMTkgQEAKIGltcG9ydCBzeXMKIAogY2xhc3MgVGVtcGxhdGVQcm9jZXNzb3I6Ci0gIEhFQURFUl9UT0tFTiA9ICAne3toZWFkZXJ9fScKKyAgSEVBREVSX1RPS0VOID0gJ3t7aGVhZGVyfX0nCiAgIEhFQURFUl9SRVBMQUNFTUVOVCA9ICclUERGLTEuN1xuJVx4YTBceGYyXHhhNFx4ZjQnCiAKICAgWFJFRl9UT0tFTiA9ICd7e3hyZWZ9fScKICAgWFJFRl9SRVBMQUNFTUVOVCA9ICd4cmVmXG4lZCAlZFxuJwogCi0gICMgWFJFRiByb3dzIG11c3QgYmUgZXhhY3RseSAyMCBieXRlcyAtIHNwYWNlIHJlcXVpcmVkLgogICBYUkVGX1JFUExBQ0VNRU5UX04gPSAnJTAxMGQgJTA1ZCBuIFxuJwogICBYUkVGX1JFUExBQ0VNRU5UX0YgPSAnMDAwMDAwMDAwMCA2NTUzNSBmIFxuJworICAjIFhSRUYgcm93cyBtdXN0IGJlIGV4YWN0bHkgMjAgYnl0ZXMgLSBzcGFjZSByZXF1aXJlZC4KKyAgYXNzZXJ0KGxlbihYUkVGX1JFUExBQ0VNRU5UX0YpID09IDIwKQorCisgIFRSQUlMRVJfVE9LRU4gPSAne3t0cmFpbGVyfX0nCisgIFRSQUlMRVJfUkVQTEFDRU1FTlQgPSAndHJhaWxlcjw8IC9Sb290IDEgMCBSIC9TaXplICVkID4+JwogCiAgIFNUQVJUWFJFRl9UT0tFTj0gJ3t7c3RhcnR4cmVmfX0nCiAgIFNUQVJUWFJFRl9SRVBMQUNFTUVOVCA9ICdzdGFydHhyZWZcbiVkJwpAQCAtNjAsNiArNjYsOSBAQAogICAgIGlmIHNlbGYuWFJFRl9UT0tFTiBpbiBsaW5lOgogICAgICAgc2VsZi54cmVmX29mZnNldCA9IHNlbGYub2Zmc2V0CiAgICAgICBsaW5lID0gc2VsZi5nZW5lcmF0ZV94cmVmX3RhYmxlKCkKKyAgICBpZiBzZWxmLlRSQUlMRVJfVE9LRU4gaW4gbGluZToKKyAgICAgIHJlcGxhY2VtZW50ID0gc2VsZi5UUkFJTEVSX1JFUExBQ0VNRU5UICUgKHNlbGYubWF4X29iamVjdF9udW1iZXIgKyAxKQorICAgICAgbGluZSA9IGxpbmUucmVwbGFjZShzZWxmLlRSQUlMRVJfVE9LRU4sIHJlcGxhY2VtZW50KQogICAgIGlmIHNlbGYuU1RBUlRYUkVGX1RPS0VOIGluIGxpbmU6CiAgICAgICByZXBsYWNlbWVudCA9IHNlbGYuU1RBUlRYUkVGX1JFUExBQ0VNRU5UICUgc2VsZi54cmVmX29mZnNldAogICAgICAgbGluZSA9IGxpbmUucmVwbGFjZShzZWxmLlNUQVJUWFJFRl9UT0tFTiwgcmVwbGFjZW1lbnQpCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Rvb2xzL2dpdGhlbHBlci5weSBiL3Rlc3RpbmcvdG9vbHMvZ2l0aGVscGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlOTQxOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Rvb2xzL2dpdGhlbHBlci5weQpAQCAtMCwwICsxLDY2IEBACisjIENvcHlyaWdodCAyMDE3IFRoZSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisiIiJDbGFzc2VzIGZvciBkZWFsaW5nIHdpdGggZ2l0LiIiIgorCitpbXBvcnQgc3VicHJvY2VzcworCitmcm9tIGNvbW1vbiBpbXBvcnQgUnVuQ29tbWFuZFByb3BhZ2F0ZUVycgorCisKK2NsYXNzIEdpdEhlbHBlcihvYmplY3QpOgorICAiIiJJc3N1ZXMgZ2l0IGNvbW1hbmRzLiBTdGF0ZWZ1bC4iIiIKKworICBkZWYgX19pbml0X18oc2VsZik6CisgICAgc2VsZi5zdGFzaGVkID0gMAorCisgIGRlZiBDaGVja291dChzZWxmLCBicmFuY2gpOgorICAgICIiIkNoZWNrcyBvdXQgYSBicmFuY2guIiIiCisgICAgUnVuQ29tbWFuZFByb3BhZ2F0ZUVycihbJ2dpdCcsICdjaGVja291dCcsIGJyYW5jaF0sIGV4aXRfc3RhdHVzX29uX2Vycm9yPTEpCisKKyAgZGVmIEZldGNoT3JpZ2luTWFzdGVyKHNlbGYpOgorICAgICIiIkZldGNoZXMgbmV3IGNoYW5nZXMgb24gb3JpZ2luL21hc3Rlci4iIiIKKyAgICBSdW5Db21tYW5kUHJvcGFnYXRlRXJyKFsnZ2l0JywgJ2ZldGNoJywgJ29yaWdpbicsICdtYXN0ZXInXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRfc3RhdHVzX29uX2Vycm9yPTEpCisKKyAgZGVmIFN0YXNoUHVzaChzZWxmKToKKyAgICAiIiJTdGFzaGVzIHVuY29tbWl0dGVkIGNoYW5nZXMuIiIiCisgICAgb3V0cHV0ID0gUnVuQ29tbWFuZFByb3BhZ2F0ZUVycihbJ2dpdCcsICdzdGFzaCcsICctLWluY2x1ZGUtdW50cmFja2VkJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0X3N0YXR1c19vbl9lcnJvcj0xKQorICAgIGlmICdObyBsb2NhbCBjaGFuZ2VzIHRvIHNhdmUnIGluIG91dHB1dDoKKyAgICAgIHJldHVybiBGYWxzZQorCisgICAgc2VsZi5zdGFzaGVkICs9IDEKKyAgICByZXR1cm4gVHJ1ZQorCisgIGRlZiBTdGFzaFBvcEFsbChzZWxmKToKKyAgICAiIiJQb3BzIGFzIG1hbnkgY2hhbmdlcyBhcyB0aGlzIGluc3RhbmNlIHN0YXNoZWQuIiIiCisgICAgd2hpbGUgc2VsZi5zdGFzaGVkID4gMDoKKyAgICAgIFJ1bkNvbW1hbmRQcm9wYWdhdGVFcnIoWydnaXQnLCAnc3Rhc2gnLCAncG9wJ10sIGV4aXRfc3RhdHVzX29uX2Vycm9yPTEpCisgICAgICBzZWxmLnN0YXNoZWQgLT0gMQorCisgIGRlZiBHZXRDdXJyZW50QnJhbmNoTmFtZShzZWxmKToKKyAgICAiIiJSZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIGN1cnJlbnQgYnJhbmNoIG5hbWUuIiIiCisgICAgcmV0dXJuIFJ1bkNvbW1hbmRQcm9wYWdhdGVFcnIoCisgICAgICAgIFsnZ2l0JywgJ3Jldi1wYXJzZScsICctLWFiYnJldi1yZWYnLCAnSEVBRCddLAorICAgICAgICBleGl0X3N0YXR1c19vbl9lcnJvcj0xKS5zdHJpcCgpCisKKyAgZGVmIEdldEN1cnJlbnRCcmFuY2hIYXNoKHNlbGYpOgorICAgIHJldHVybiBSdW5Db21tYW5kUHJvcGFnYXRlRXJyKAorICAgICAgICBbJ2dpdCcsICdyZXYtcGFyc2UnLCAnSEVBRCddLCBleGl0X3N0YXR1c19vbl9lcnJvcj0xKS5zdHJpcCgpCisKKyAgZGVmIElzQ3VycmVudEJyYW5jaENsZWFuKHNlbGYpOgorICAgIG91dHB1dCA9IFJ1bkNvbW1hbmRQcm9wYWdhdGVFcnIoWydnaXQnLCAnc3RhdHVzJywgJy0tcG9yY2VsYWluJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0X3N0YXR1c19vbl9lcnJvcj0xKQorICAgIHJldHVybiBub3Qgb3V0cHV0CisKKyAgZGVmIEJyYW5jaEV4aXN0cyhzZWxmLCBicmFuY2hfbmFtZSk6CisgICAgIiIiUmV0dXJuIHdoZXRoZXIgYSBicmFuY2ggd2l0aCB0aGUgZ2l2ZW4gbmFtZSBleGlzdHMuIiIiCisgICAgb3V0cHV0ID0gUnVuQ29tbWFuZFByb3BhZ2F0ZUVycihbJ2dpdCcsICdyZXYtcGFyc2UnLCAnLS12ZXJpZnknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5jaF9uYW1lXSkKKyAgICByZXR1cm4gb3V0cHV0IGlzIG5vdCBOb25lCisKKyAgZGVmIENsb25lTG9jYWwoc2VsZiwgc291cmNlX3JlcG8sIG5ld19yZXBvKToKKyAgICBSdW5Db21tYW5kUHJvcGFnYXRlRXJyKFsnZ2l0JywgJ2Nsb25lJywgc291cmNlX3JlcG8sIG5ld19yZXBvXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRfc3RhdHVzX29uX2Vycm9yPTEpCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Rvb2xzL2dvbGQucHkgYi90ZXN0aW5nL3Rvb2xzL2dvbGQucHkKaW5kZXggZGIzYmY4MS4uYTgyMjIzNyAxMDA2NDQKLS0tIGEvdGVzdGluZy90b29scy9nb2xkLnB5CisrKyBiL3Rlc3RpbmcvdG9vbHMvZ29sZC5weQpAQCAtNyw2ICs3LDEzMiBAQAogaW1wb3J0IG9zCiBpbXBvcnQgc2hsZXgKIGltcG9ydCBzaHV0aWwKK2ltcG9ydCB1cmxsaWIyCisKKworZGVmIF9QYXJzZUtleVZhbHVlUGFpcnMoa3Zfc3RyKToKKyAgIiIiCisgIFBhcnNlcyBhIHN0cmluZyBvZiB0aGUgdHlwZSAna2V5MSB2YWx1ZTEga2V5MiB2YWx1ZTInIGludG8gYSBkaWN0LgorICAiIiIKKyAga3ZfcGFpcnMgPSBzaGxleC5zcGxpdChrdl9zdHIpCisgIGlmIGxlbihrdl9wYWlycykgJSAyOgorICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuZXZlbiBudW1iZXIgb2Yga2V5L3ZhbHVlIHBhaXJzLiBHb3QgJXMnICUga3Zfc3RyKQorICByZXR1cm4geyBrdl9wYWlyc1tpXTprdl9wYWlyc1tpICsgMV0gZm9yIGkgaW4geHJhbmdlKDAsIGxlbihrdl9wYWlycyksIDIpIH0KKworCisjIFRoaXMgbW9kdWxlIGRvd25sb2FkcyBhIGpzb24gcHJvdmlkZWQgYnkgU2tpYSBHb2xkIHdpdGggdGhlIGV4cGVjdGVkIGJhc2VsaW5lcworIyBmb3IgZWFjaCB0ZXN0IGZpbGUuCisjCisjIFRoZSBleHBlY3RlZCBmb3JtYXQgZm9yIHRoZSBqc29uIGlzOgorIyB7CisjICAgImNvbW1pdCI6IHsKKyMgICAgICJhdXRob3IiOiAiSm9obiBEb2UgKGpkb2VAY2hyb21pdW0ub3JnKSIsCisjICAgICAiY29tbWl0X3RpbWUiOiAxNTEwNTk4MTIzLAorIyAgICAgImhhc2giOiAiY2VlMzllNmU5MGMyMTljYzkxZjJjOTRhOTEyYTA2OTc3ZjQ0NjFhMCIKKyMgICB9LAorIyAgICJtYXN0ZXIiOiB7CisjICAgICAiYWJjLnBkZi4xIjogeworIyAgICAgICAiMGVjM2Q4NmY1NDUwNTJhY2Q3YzlhMTZmZGU4Y2E5ZDQiOiAxLAorIyAgICAgICAiODA0NTViNzE2NzNiZWNjOWZiYzEwMGQ2ZGE1NmNhNjUiOiAxLAorIyAgICAgICAiYjY4ZTJlY2I4MDA5MGI0NTAyZWM4OWFkMWJlMjMyMmMiOiAxCisjICAgICAgfSwKKyMgICAgICJkZWZnaC5wZGYuMCI6IHsKKyMgICAgICAgIjAxZTAyMGNkNGNkMDVjNjczOGU0NzlhNDZhNTA2MDQ0IjogMSwKKyMgICAgICAgImI2OGUyZWNiODAwOTBiNDUwMmVjODlhZDFiZTIzMjJjIjogMQorIyAgICAgfQorIyAgIH0sCisjICAgImNoYW5nZUxpc3RzIjogeworIyAgICAgIjE4NDk5IiA6IHsKKyMgICAgICAgImFiYy5wZGYuMSI6IHsKKyMgICAgICAgICAiZDVkZDY0OTEyNGNmMTc3OTE1MjI1M2RjOGZiMjM5YzUiOiAxLAorIyAgICAgICAgICI0MmEyNzA1ODE5MzA1NzljZGIwZjI4Njc0OTcyZmIxYSI6IDEsCisjICAgICAgIH0KKyMgICAgIH0KKyMgICB9CisjIH0KK2NsYXNzIEdvbGRCYXNlbGluZShvYmplY3QpOgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9wZXJ0aWVzX3N0cik6CisgICAgIiIiCisgICAgcHJvcGVydGllc19zdHIgaXMgYSBzdHJpbmcgd2l0aCBzcGFjZSBzZXBhcmF0ZWQga2V5L3ZhbHVlIHBhaXJzIHRoYXQKKyAgICAgICAgICAgICAgIGlzIHVzZWQgdG8gZmluZCB0aGUgY2wgbnVtYmVyIGZvciB3aGljaCB0byBiYXNlbGluZQorICAgICIiIgorICAgIHNlbGYuX3Byb3BlcnRpZXMgPSBfUGFyc2VLZXlWYWx1ZVBhaXJzKHByb3BlcnRpZXNfc3RyKQorICAgIHNlbGYuX2Jhc2VsaW5lcyA9IHNlbGYuX0xvYWRTa2lhR29sZEJhc2VsaW5lcygpCisKKyAgZGVmIF9Mb2FkU2tpYUdvbGRCYXNlbGluZXMoc2VsZik6CisgICAgIiIiCisgICAgRG93bmxvYWQgdGhlIGJhc2VsaW5lIGpzb24gYW5kIHJldHVybiBhIGxpc3Qgb2YgdGhlIHR3byBiYXNlbGluZXMgdGhhdAorICAgIHNob3VsZCBiZSB1c2VkIHRvIG1hdGNoIGhhc2hlcyAobWFzdGVyIGFuZCBjbCMpLgorICAgICIiIgorICAgIEdPTERfQkFTRUxJTkVfVVJMID0gKCdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vc2tpYS1pbmZyYS1nbS8nCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2hhc2hfZmlsZXMvZ29sZC1wZGZpdW0tYmFzZWxpbmUuanNvbicpCisgICAgdHJ5OgorICAgICAgcmVzcG9uc2UgPSB1cmxsaWIyLnVybG9wZW4oR09MRF9CQVNFTElORV9VUkwpCisgICAgICBqc29uX2RhdGEgPSByZXNwb25zZS5yZWFkKCkKKyAgICBleGNlcHQgKHVybGxpYjIuSFRUUEVycm9yLCB1cmxsaWIyLlVSTEVycm9yKSBhcyBlOgorICAgICAgcHJpbnQgKCdFcnJvcjogVW5hYmxlIHRvIHJlYWQgc2tpYSBnb2xkIGpzb24gZnJvbSAlczogJXMnCisgICAgICAgICAgICAgJSAoR09MRF9CQVNFTElORV9VUkwsIGUpKQorICAgICAgcmV0dXJuIE5vbmUKKworICAgIHRyeToKKyAgICAgIGRhdGEgPSBqc29uLmxvYWRzKGpzb25fZGF0YSkKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgIHByaW50ICdFcnJvcjogTWFsZm9ybWVkIGpzb24gcmVhZCBmcm9tICVzOiAlcycgJSAoR09MRF9CQVNFTElORV9VUkwsIGUpCisgICAgICByZXR1cm4gTm9uZQorCisgICAgdHJ5OgorICAgICAgbWFzdGVyX2Jhc2VsaW5lID0gZGF0YVsnbWFzdGVyJ10KKyAgICBleGNlcHQgKEtleUVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgcHJpbnQgKCdFcnJvcjogIm1hc3RlciIga2V5IG5vdCBpbiBqc29uIHJlYWQgZnJvbSAlczogJXMnCisgICAgICAgICAgICAgJSAoR09MRF9CQVNFTElORV9VUkwsIGUpKQorICAgICAgcmV0dXJuIE5vbmUKKworICAgIGNsX251bWJlcl9zdHIgPSBzZWxmLl9wcm9wZXJ0aWVzLmdldCgnaXNzdWUnKQorICAgIGlmIGNsX251bWJlcl9zdHIgaXMgTm9uZToKKyAgICAgIHJldHVybiBbbWFzdGVyX2Jhc2VsaW5lXQorCisgICAgdHJ5OgorICAgICAgY2xfYmFzZWxpbmUgPSBkYXRhWydjaGFuZ2VMaXN0cyddW2NsX251bWJlcl9zdHJdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgcmV0dXJuIFttYXN0ZXJfYmFzZWxpbmVdCisKKyAgICByZXR1cm4gW2NsX2Jhc2VsaW5lLCBtYXN0ZXJfYmFzZWxpbmVdCisKKyAgIyBSZXR1cm4gdmFsdWVzIGZvciBNYXRjaExvY2FsUmVzdWx0KCkuCisgIE1BVENIID0gJ21hdGNoJworICBNSVNNQVRDSCA9ICdtaXNtYXRjaCcKKyAgTk9fQkFTRUxJTkUgPSAnbm9fYmFzZWxpbmUnCisgIEJBU0VMSU5FX0RPV05MT0FEX0ZBSUxFRCA9ICdiYXNlbGluZV9kb3dubG9hZF9mYWlsZWQnCisKKyAgZGVmIE1hdGNoTG9jYWxSZXN1bHQoc2VsZiwgdGVzdF9uYW1lLCBtZDVfaGFzaCk6CisgICAgIiIiCisgICAgTWF0Y2ggYSBsb2NhbGx5IGdlbmVyYXRlZCBoYXNoIG9mIGEgdGVzdCBjYXNlcyByZW5kZXJlZCBpbWFnZSB3aXRoIHRoZQorICAgIGV4cGVjdGVkIGhhc2hlcyBkb3dubG9hZGVkIGluIHRoZSBiYXNlbGluZXMganNvbi4KKworICAgIEVhY2ggYmFzZWxpbmUgaXMgYSBkaWN0IG1hcHBpbmcgdGhlIHRlc3QgY2FzZSBuYW1lIHRvIGEgZGljdCB3aXRoIHRoZQorICAgIGV4cGVjdGVkIGhhc2hlcyBhcyBrZXlzLiBUaGVyZWZvcmUsIHRoaXMgbGlzdCBvZiBiYXNlbGluZXMgc2hvdWxkIGJlCisgICAgc2VhcmNoZWQgdW50aWwgdGhlIHRlc3QgY2FzZSBuYW1lIGlzIGZvdW5kLCB0aGVuIHRoZSBoYXNoIHNob3VsZCBiZSBtYXRjaGVkCisgICAgd2l0aCB0aGUgb3B0aW9ucyBpbiB0aGF0IGRpY3QuIElmIHRoZSBoYXNoZXMgZG9uJ3QgbWF0Y2gsIGl0IHNob3VsZCBiZQorICAgIGNvbnNpZGVyZWQgYSBmYWlsdXJlIGFuZCB3ZSBzaG91bGQgbm90IGNvbnRpbnVlIHNlYXJjaGluZyB0aGUgYmFzZWxpbmUgbGlzdC4KKworICAgIFJldHVybnMgTUFUQ0ggaWYgdGhlIG1kNSBwcm92aWRlZCBtYXRjaGVzIHRoZSBvbmVzIGluIHRoZSBiYXNlbGluZSBqc29uLAorICAgIE1JU01BVENIIGlmIGl0IGRvZXMgbm90LCBOT19CQVNFTElORSBpZiB0aGUgdGVzdCBjYXNlIGhhcyBubyBiYXNlbGluZSwgb3IKKyAgICBCQVNFTElORV9ET1dOTE9BRF9GQUlMRUQgaWYgdGhlIGJhc2VsaW5lIGNvdWxkIG5vdCBiZSBkb3dubG9hZGVkIGFuZCBwYXJzZWQuCisgICAgIiIiCisgICAgaWYgc2VsZi5fYmFzZWxpbmVzIGlzIE5vbmU6CisgICAgICByZXR1cm4gR29sZEJhc2VsaW5lLkJBU0VMSU5FX0RPV05MT0FEX0ZBSUxFRAorCisgICAgZm91bmRfdGVzdF9jYXNlID0gRmFsc2UKKyAgICBmb3IgYmFzZWxpbmUgaW4gc2VsZi5fYmFzZWxpbmVzOgorICAgICAgaWYgdGVzdF9uYW1lIGluIGJhc2VsaW5lOgorICAgICAgICBmb3VuZF90ZXN0X2Nhc2UgPSBUcnVlCisgICAgICAgIGlmIG1kNV9oYXNoIGluIGJhc2VsaW5lW3Rlc3RfbmFtZV06CisgICAgICAgICAgcmV0dXJuIEdvbGRCYXNlbGluZS5NQVRDSAorCisgICAgcmV0dXJuIChHb2xkQmFzZWxpbmUuTUlTTUFUQ0ggaWYgZm91bmRfdGVzdF9jYXNlCisgICAgICAgICAgICBlbHNlIEdvbGRCYXNlbGluZS5OT19CQVNFTElORSkKKwogCiAjIFRoaXMgbW9kdWxlIGNvbGxlY3RzIGFuZCB3cml0ZXMgb3V0cHV0IGluIGEgZm9ybWF0IGV4cGVjdGVkIGJ5IHRoZQogIyBHb2xkIGJhc2VsaW5lIHRvb2wuIEJhc2VkIG9uIG1ldGEgZGF0YSBwcm92aWRlZCBleHBsaWNpdGx5IGFuZCBieQpAQCAtNTYsNyArMTgyLDggQEAKICAgICAiIiIKICAgICBzb3VyY2VfdHlwZSBpcyB0aGUgc291cmNlX3R5cGUgKD1jb3JwdXMpIGZpZWxkIHVzZWQgZm9yIGFsbCByZXN1bHRzLgogICAgIG91dHB1dF9kaXIgaXMgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgcmVzdWx0aW5nIGltYWdlcyBhcmUgY29waWVkIGFuZAotICAgICAgICAgICAgICAgdGhlIGRtLmpzb24gZmlsZSBpcyB3cml0dGVuLgorICAgICAgICAgICAgICAgdGhlIGRtLmpzb24gZmlsZSBpcyB3cml0dGVuLiBJZiB0aGUgZGlyZWN0b3J5IGV4aXN0cyBpdCB3aWxsCisgICAgICAgICAgICAgICBiZSByZW1vdmVkIGFuZCByZWNyZWF0ZWQuCiAgICAgcHJvcGVydGllc1N0ciBpcyBhIHN0cmluZyB3aXRoIHNwYWNlIHNlcGFyYXRlZCBrZXkvdmFsdWUgcGFpcnMgdGhhdAogICAgICAgICAgICAgICAgaXMgdXNlZCB0byBzZXQgdGhlIHRvcCBsZXZlbCBmaWVsZHMgaW4gdGhlIG91dHB1dCBKU09OIGZpbGUuCiAgICAga2V5U3RyIGlzIGEgc3RyaW5nIHdpdGggc3BhY2Ugc2VwYXJhdGVkIGtleS92YWx1ZSBwYWlycyB0aGF0CkBAIC02NSwxNCArMTkyLDE1IEBACiAgICAgICAgICAgICAgICB0aGF0IHNob3VsZCBiZSBpZ25vcmVkLgogICAgICIiIgogICAgIHNlbGYuX3NvdXJjZV90eXBlID0gc291cmNlX3R5cGUKLSAgICBzZWxmLl9wcm9wZXJ0aWVzID0gc2VsZi5fcGFyc2VLZXlWYWx1ZVBhaXJzKHByb3BlcnRpZXNTdHIpCi0gICAgc2VsZi5fcHJvcGVydGllc1sia2V5Il0gPSBzZWxmLl9wYXJzZUtleVZhbHVlUGFpcnMoa2V5U3RyKQorICAgIHNlbGYuX3Byb3BlcnRpZXMgPSBfUGFyc2VLZXlWYWx1ZVBhaXJzKHByb3BlcnRpZXNTdHIpCisgICAgc2VsZi5fcHJvcGVydGllc1sia2V5Il0gPSBfUGFyc2VLZXlWYWx1ZVBhaXJzKGtleVN0cikKICAgICBzZWxmLl9yZXN1bHRzID0gIFtdCiAgICAgc2VsZi5fb3V0cHV0RGlyID0gb3V0cHV0RGlyCiAKLSAgICAjIG1ha2Ugc3VyZSB0aGUgb3V0cHV0IGRpcmVjdG9yeSBleGlzdHMuCi0gICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG91dHB1dERpcik6Ci0gICAgICBvcy5tYWtlZGlycyhvdXRwdXREaXIpCisgICAgIyBtYWtlIHN1cmUgdGhlIG91dHB1dCBkaXJlY3RvcnkgZXhpc3RzIGFuZCBpcyBlbXB0eS4KKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhvdXRwdXREaXIpOgorICAgICAgc2h1dGlsLnJtdHJlZShvdXRwdXREaXIsIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKKyAgICBvcy5tYWtlZGlycyhvdXRwdXREaXIpCiAKICAgICBzZWxmLl9pZ25vcmVfaGFzaGVzID0gc2V0KCkKICAgICBpZiBpZ25vcmVfaGFzaGVzX2ZpbGU6CkBAIC0xMDQsMTIgKzIzMiw2IEBACiAgICAgICB9CiAgICAgfSkKIAotICBkZWYgX3BhcnNlS2V5VmFsdWVQYWlycyhzZWxmLCBrdlN0cik6Ci0gICAga3ZQYWlycyA9IHNobGV4LnNwbGl0KGt2U3RyKQotICAgIGlmIGxlbihrdlBhaXJzKSAlIDI6Ci0gICAgICByYWlzZSBWYWx1ZUVycm9yKCJVbmV2ZW4gbnVtYmVyIG9mIGtleS92YWx1ZSBwYWlycy4gR290ICVzIiAlIGt2U3RyKQotICAgIHJldHVybiB7IGt2UGFpcnNbaV06a3ZQYWlyc1tpKzFdIGZvciBpIGluIHJhbmdlKDAsIGxlbihrdlBhaXJzKSwgMikgfQotCiAgIGRlZiBXcml0ZVJlc3VsdHMoc2VsZik6CiAgICAgc2VsZi5fcHJvcGVydGllcy51cGRhdGUoewogICAgICAgInJlc3VsdHMiOiBzZWxmLl9yZXN1bHRzCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Rvb2xzL3BuZ2RpZmZlci5weSBiL3Rlc3RpbmcvdG9vbHMvcG5nZGlmZmVyLnB5CmluZGV4IGExNTMzYjguLmE5YmM5ZDYgMTAwNzU1Ci0tLSBhL3Rlc3RpbmcvdG9vbHMvcG5nZGlmZmVyLnB5CisrKyBiL3Rlc3RpbmcvdG9vbHMvcG5nZGlmZmVyLnB5CkBAIC00LDMyICs0LDI2IEBACiAjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKIGltcG9ydCBvcworaW1wb3J0IHNodXRpbAogaW1wb3J0IHN5cwogCiBpbXBvcnQgY29tbW9uCiAKIGNsYXNzIFBOR0RpZmZlcigpOgotICBBQ1RVQUxfVEVNUExBVEUgPSAnLnBkZi4lZC5wbmcnCi0gIEVYUEVDVEVEX1RFTVBMQVRFID0gJ19leHBlY3RlZCcgKyBBQ1RVQUxfVEVNUExBVEUKLSAgUExBVEZPUk1fRVhQRUNURURfVEVNUExBVEUgPSAnX2V4cGVjdGVkXyVzJyArIEFDVFVBTF9URU1QTEFURQotCiAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaW5kZXIpOgogICAgIHNlbGYucGRmaXVtX2RpZmZfcGF0aCA9IGZpbmRlci5FeGVjdXRhYmxlUGF0aCgncGRmaXVtX2RpZmYnKQogICAgIHNlbGYub3NfbmFtZSA9IGZpbmRlci5vc19uYW1lCiAKICAgZGVmIEdldEFjdHVhbEZpbGVzKHNlbGYsIGlucHV0X2ZpbGVuYW1lLCBzb3VyY2VfZGlyLCB3b3JraW5nX2Rpcik6CiAgICAgYWN0dWFsX3BhdGhzID0gW10KLSAgICB0ZW1wbGF0ZV9wYXRocyA9IHNlbGYuX0dldFRlbXBsYXRlUGF0aHMoCi0gICAgICAgIGlucHV0X2ZpbGVuYW1lLCBzb3VyY2VfZGlyLCB3b3JraW5nX2RpcikKLSAgICBhY3R1YWxfcGF0aF90ZW1wbGF0ZSA9IHRlbXBsYXRlX3BhdGhzWzBdOwotICAgIGV4cGVjdGVkX3BhdGhfdGVtcGxhdGUgPSB0ZW1wbGF0ZV9wYXRoc1sxXQotICAgIHBsYXRmb3JtX2V4cGVjdGVkX3BhdGhfdGVtcGxhdGUgPSB0ZW1wbGF0ZV9wYXRoc1syXQorICAgIHBhdGhfdGVtcGxhdGVzID0gUGF0aFRlbXBsYXRlcyhpbnB1dF9maWxlbmFtZSwgc291cmNlX2Rpciwgd29ya2luZ19kaXIpCisKICAgICBpID0gMAogICAgIHdoaWxlIFRydWU6Ci0gICAgICBhY3R1YWxfcGF0aCA9IGFjdHVhbF9wYXRoX3RlbXBsYXRlICUgaQotICAgICAgZXhwZWN0ZWRfcGF0aCA9IGV4cGVjdGVkX3BhdGhfdGVtcGxhdGUgJSBpCi0gICAgICBwbGF0Zm9ybV9leHBlY3RlZF9wYXRoID0gKAotICAgICAgICAgIHBsYXRmb3JtX2V4cGVjdGVkX3BhdGhfdGVtcGxhdGUgJSAoc2VsZi5vc19uYW1lLCBpKSkKKyAgICAgIGFjdHVhbF9wYXRoID0gcGF0aF90ZW1wbGF0ZXMuR2V0QWN0dWFsUGF0aChpKQorICAgICAgZXhwZWN0ZWRfcGF0aCA9IHBhdGhfdGVtcGxhdGVzLkdldEV4cGVjdGVkUGF0aChpKQorICAgICAgcGxhdGZvcm1fZXhwZWN0ZWRfcGF0aCA9IHBhdGhfdGVtcGxhdGVzLkdldFBsYXRmb3JtRXhwZWN0ZWRQYXRoKAorICAgICAgICAgIHNlbGYub3NfbmFtZSwgaSkKICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBsYXRmb3JtX2V4cGVjdGVkX3BhdGgpOgogICAgICAgICBleHBlY3RlZF9wYXRoID0gcGxhdGZvcm1fZXhwZWN0ZWRfcGF0aAogICAgICAgZWxpZiBub3Qgb3MucGF0aC5leGlzdHMoZXhwZWN0ZWRfcGF0aCk6CkBAIC0zOSwxOSArMzMsMTYgQEAKICAgICByZXR1cm4gYWN0dWFsX3BhdGhzCiAKICAgZGVmIEhhc0RpZmZlcmVuY2VzKHNlbGYsIGlucHV0X2ZpbGVuYW1lLCBzb3VyY2VfZGlyLCB3b3JraW5nX2Rpcik6Ci0gICAgdGVtcGxhdGVfcGF0aHMgPSBzZWxmLl9HZXRUZW1wbGF0ZVBhdGhzKAotICAgICAgICBpbnB1dF9maWxlbmFtZSwgc291cmNlX2Rpciwgd29ya2luZ19kaXIpCi0gICAgYWN0dWFsX3BhdGhfdGVtcGxhdGUgPSB0ZW1wbGF0ZV9wYXRoc1swXTsKLSAgICBleHBlY3RlZF9wYXRoX3RlbXBsYXRlID0gdGVtcGxhdGVfcGF0aHNbMV0KLSAgICBwbGF0Zm9ybV9leHBlY3RlZF9wYXRoX3RlbXBsYXRlID0gdGVtcGxhdGVfcGF0aHNbMl0KKyAgICBwYXRoX3RlbXBsYXRlcyA9IFBhdGhUZW1wbGF0ZXMoaW5wdXRfZmlsZW5hbWUsIHNvdXJjZV9kaXIsIHdvcmtpbmdfZGlyKQorCiAgICAgaSA9IDAKICAgICB3aGlsZSBUcnVlOgotICAgICAgYWN0dWFsX3BhdGggPSBhY3R1YWxfcGF0aF90ZW1wbGF0ZSAlIGkKLSAgICAgIGV4cGVjdGVkX3BhdGggPSBleHBlY3RlZF9wYXRoX3RlbXBsYXRlICUgaQorICAgICAgYWN0dWFsX3BhdGggPSBwYXRoX3RlbXBsYXRlcy5HZXRBY3R1YWxQYXRoKGkpCisgICAgICBleHBlY3RlZF9wYXRoID0gcGF0aF90ZW1wbGF0ZXMuR2V0RXhwZWN0ZWRQYXRoKGkpCiAgICAgICAjIFBERml1bSB0ZXN0cyBzaG91bGQgYmUgcGxhdGZvcm0gaW5kZXBlbmRlbnQuIFBsYXRmb3JtIGJhc2VkIHJlc3VsdHMgYXJlCiAgICAgICAjIHVzZWQgdG8gY2FwdHVyZSBwbGF0Zm9ybSBkZXBlbmRlbnQgaW1wbGVtZW50YXRpb25zLgotICAgICAgcGxhdGZvcm1fZXhwZWN0ZWRfcGF0aCA9ICgKLSAgICAgICAgICBwbGF0Zm9ybV9leHBlY3RlZF9wYXRoX3RlbXBsYXRlICUgKHNlbGYub3NfbmFtZSwgaSkpCisgICAgICBwbGF0Zm9ybV9leHBlY3RlZF9wYXRoID0gcGF0aF90ZW1wbGF0ZXMuR2V0UGxhdGZvcm1FeHBlY3RlZFBhdGgoCisgICAgICAgICAgc2VsZi5vc19uYW1lLCBpKQogICAgICAgaWYgKG5vdCBvcy5wYXRoLmV4aXN0cyhleHBlY3RlZF9wYXRoKSBhbmQKICAgICAgICAgICBub3Qgb3MucGF0aC5leGlzdHMocGxhdGZvcm1fZXhwZWN0ZWRfcGF0aCkpOgogICAgICAgICBpZiBpID09IDA6CkBAIC03NSwxMSArNjYsNTcgQEAKICAgICAgIGkgKz0gMQogICAgIHJldHVybiBGYWxzZQogCi0gIGRlZiBfR2V0VGVtcGxhdGVQYXRocyhzZWxmLCBpbnB1dF9maWxlbmFtZSwgc291cmNlX2Rpciwgd29ya2luZ19kaXIpOgorICBkZWYgUmVnZW5lcmF0ZShzZWxmLCBpbnB1dF9maWxlbmFtZSwgc291cmNlX2Rpciwgd29ya2luZ19kaXIsIHBsYXRmb3JtX29ubHkpOgorICAgIHBhdGhfdGVtcGxhdGVzID0gUGF0aFRlbXBsYXRlcyhpbnB1dF9maWxlbmFtZSwgc291cmNlX2Rpciwgd29ya2luZ19kaXIpCisKKyAgICBwYWdlID0gMAorICAgIHdoaWxlIFRydWU6CisgICAgICAjIExvb3AgdGhyb3VnaCB0aGUgZ2VuZXJhdGVkIHBhZ2UgaW1hZ2VzLiBTdG9wIHdoZW4gdGhlcmUgaXMgYSBwYWdlCisgICAgICAjIG1pc3NpbmcgYSBwbmcsIHdoaWNoIG1lYW5zIHRoZSBkb2N1bWVudCBlbmRlZC4KKyAgICAgIGFjdHVhbF9wYXRoID0gcGF0aF90ZW1wbGF0ZXMuR2V0QWN0dWFsUGF0aChwYWdlKQorICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKGFjdHVhbF9wYXRoKToKKyAgICAgICAgYnJlYWsKKworICAgICAgcGxhdGZvcm1fZXhwZWN0ZWRfcGF0aCA9IHBhdGhfdGVtcGxhdGVzLkdldFBsYXRmb3JtRXhwZWN0ZWRQYXRoKAorICAgICAgICAgIHNlbGYub3NfbmFtZSwgcGFnZSkKKworICAgICAgIyBJZiB0aGVyZSBpcyBhIHBsYXRmb3JtIGV4cGVjdGVkIHBuZywgd2Ugd2lsbCBvdmVyd3JpdGUgaXQuIE90aGVyd2lzZSwKKyAgICAgICMgb3ZlcndyaXRlIHRoZSBnZW5lcmljIHBuZyBpbiAiYWxsIiBtb2RlLCBvciBkbyBub3RoaW5nIGluICJwbGF0Zm9ybSIKKyAgICAgICMgbW9kZS4KKyAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBsYXRmb3JtX2V4cGVjdGVkX3BhdGgpOgorICAgICAgICBleHBlY3RlZF9wYXRoID0gcGxhdGZvcm1fZXhwZWN0ZWRfcGF0aAorICAgICAgZWxpZiBub3QgcGxhdGZvcm1fb25seToKKyAgICAgICAgZXhwZWN0ZWRfcGF0aCA9IHBhdGhfdGVtcGxhdGVzLkdldEV4cGVjdGVkUGF0aChwYWdlKQorICAgICAgZWxzZToKKyAgICAgICAgZXhwZWN0ZWRfcGF0aCA9IE5vbmUKKworICAgICAgaWYgZXhwZWN0ZWRfcGF0aCBpcyBub3QgTm9uZSBhbmQgb3MucGF0aC5leGlzdHMoZXhwZWN0ZWRfcGF0aCk6CisgICAgICAgIHNodXRpbC5jb3B5ZmlsZShhY3R1YWxfcGF0aCwgZXhwZWN0ZWRfcGF0aCkKKworICAgICAgcGFnZSArPSAxCisKKworQUNUVUFMX1RFTVBMQVRFID0gJy5wZGYuJWQucG5nJworRVhQRUNURURfVEVNUExBVEUgPSAnX2V4cGVjdGVkJyArIEFDVFVBTF9URU1QTEFURQorUExBVEZPUk1fRVhQRUNURURfVEVNUExBVEUgPSAnX2V4cGVjdGVkXyVzJyArIEFDVFVBTF9URU1QTEFURQorCisKK2NsYXNzIFBhdGhUZW1wbGF0ZXMob2JqZWN0KToKKworICBkZWYgX19pbml0X18oc2VsZiwgaW5wdXRfZmlsZW5hbWUsIHNvdXJjZV9kaXIsIHdvcmtpbmdfZGlyKToKICAgICBpbnB1dF9yb290LCBfID0gb3MucGF0aC5zcGxpdGV4dChpbnB1dF9maWxlbmFtZSkKLSAgICBhY3R1YWxfcGF0aCA9IG9zLnBhdGguam9pbih3b3JraW5nX2RpciwgaW5wdXRfcm9vdCArIHNlbGYuQUNUVUFMX1RFTVBMQVRFKQotICAgIGV4cGVjdGVkX3BhdGggPSBvcy5wYXRoLmpvaW4oCi0gICAgICAgIHNvdXJjZV9kaXIsIGlucHV0X3Jvb3QgKyBzZWxmLkVYUEVDVEVEX1RFTVBMQVRFKQotICAgIHBsYXRmb3JtX2V4cGVjdGVkX3BhdGggPSBvcy5wYXRoLmpvaW4oCi0gICAgICAgIHNvdXJjZV9kaXIsIGlucHV0X3Jvb3QgKyBzZWxmLlBMQVRGT1JNX0VYUEVDVEVEX1RFTVBMQVRFKQotICAgIHJldHVybiAoYWN0dWFsX3BhdGgsIGV4cGVjdGVkX3BhdGgsIHBsYXRmb3JtX2V4cGVjdGVkX3BhdGgpCisgICAgc2VsZi5hY3R1YWxfcGF0aF90ZW1wbGF0ZSA9IG9zLnBhdGguam9pbih3b3JraW5nX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3Jvb3QgKyBBQ1RVQUxfVEVNUExBVEUpCisgICAgc2VsZi5leHBlY3RlZF9wYXRoID0gb3MucGF0aC5qb2luKAorICAgICAgICBzb3VyY2VfZGlyLCBpbnB1dF9yb290ICsgRVhQRUNURURfVEVNUExBVEUpCisgICAgc2VsZi5wbGF0Zm9ybV9leHBlY3RlZF9wYXRoID0gb3MucGF0aC5qb2luKAorICAgICAgICBzb3VyY2VfZGlyLCBpbnB1dF9yb290ICsgUExBVEZPUk1fRVhQRUNURURfVEVNUExBVEUpCisKKyAgZGVmIEdldEFjdHVhbFBhdGgoc2VsZiwgcGFnZSk6CisgICAgcmV0dXJuIHNlbGYuYWN0dWFsX3BhdGhfdGVtcGxhdGUgJSBwYWdlCisKKyAgZGVmIEdldEV4cGVjdGVkUGF0aChzZWxmLCBwYWdlKToKKyAgICByZXR1cm4gc2VsZi5leHBlY3RlZF9wYXRoICUgcGFnZQorCisgIGRlZiBHZXRQbGF0Zm9ybUV4cGVjdGVkUGF0aChzZWxmLCBwbGF0Zm9ybSwgcGFnZSk6CisgICAgcmV0dXJuIHNlbGYucGxhdGZvcm1fZXhwZWN0ZWRfcGF0aCAlIChwbGF0Zm9ybSwgcGFnZSkKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvdG9vbHMvcnVuX2NvcnB1c190ZXN0cy5weSBiL3Rlc3RpbmcvdG9vbHMvcnVuX2NvcnB1c190ZXN0cy5weQppbmRleCA0OTQyNDA2Li4xMTc1ZGU0IDEwMDc1NQotLS0gYS90ZXN0aW5nL3Rvb2xzL3J1bl9jb3JwdXNfdGVzdHMucHkKKysrIGIvdGVzdGluZy90b29scy9ydW5fY29ycHVzX3Rlc3RzLnB5CkBAIC05LDYgKzksOCBAQAogCiBkZWYgbWFpbigpOgogICBydW5uZXIgPSB0ZXN0X3J1bm5lci5UZXN0UnVubmVyKCdjb3JwdXMnKQorICBydW5uZXIuU2V0RW5mb3JjZUV4cGVjdGVkSW1hZ2VzKFRydWUpCisgIHJ1bm5lci5TZXRPbmVTaG90UmVuZGVyZXIoVHJ1ZSkKICAgcmV0dXJuIHJ1bm5lci5SdW4oKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgpkaWZmIC0tZ2l0IGEvdGVzdGluZy90b29scy9ydW5fcGl4ZWxfdGVzdHMucHkgYi90ZXN0aW5nL3Rvb2xzL3J1bl9waXhlbF90ZXN0cy5weQppbmRleCBhYWQzOWM1Li4xZDYxOTY2IDEwMDc1NQotLS0gYS90ZXN0aW5nL3Rvb2xzL3J1bl9waXhlbF90ZXN0cy5weQorKysgYi90ZXN0aW5nL3Rvb2xzL3J1bl9waXhlbF90ZXN0cy5weQpAQCAtOSw2ICs5LDcgQEAKIAogZGVmIG1haW4oKToKICAgcnVubmVyID0gdGVzdF9ydW5uZXIuVGVzdFJ1bm5lcigncGl4ZWwnKQorICBydW5uZXIuU2V0RW5mb3JjZUV4cGVjdGVkSW1hZ2VzKFRydWUpCiAgIHJldHVybiBydW5uZXIuUnVuKCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvdG9vbHMvc2FmZXR5bmV0X2NvbXBhcmUucHkgYi90ZXN0aW5nL3Rvb2xzL3NhZmV0eW5ldF9jb21wYXJlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBjZjFhZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Rvb2xzL3NhZmV0eW5ldF9jb21wYXJlLnB5CkBAIC0wLDAgKzEsNjgwIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IDIwMTcgVGhlIFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyIiIkNvbXBhcmVzIHRoZSBwZXJmb3JtYW5jZSBvZiB0d28gdmVyc2lvbnMgb2YgdGhlIHBkZml1bSBjb2RlLiIiIgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBmdW5jdG9vbHMKK2ltcG9ydCBqc29uCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHNodXRpbAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQorCitmcm9tIGNvbW1vbiBpbXBvcnQgR2V0Qm9vbGVhbkduQXJnCitmcm9tIGNvbW1vbiBpbXBvcnQgUHJpbnRFcnIKK2Zyb20gY29tbW9uIGltcG9ydCBSdW5Db21tYW5kUHJvcGFnYXRlRXJyCitmcm9tIGdpdGhlbHBlciBpbXBvcnQgR2l0SGVscGVyCitmcm9tIHNhZmV0eW5ldF9jb25jbHVzaW9ucyBpbXBvcnQgQ29tcGFyaXNvbkNvbmNsdXNpb25zCitmcm9tIHNhZmV0eW5ldF9jb25jbHVzaW9ucyBpbXBvcnQgUHJpbnRDb25jbHVzaW9uc0RpY3RIdW1hblJlYWRhYmxlCitmcm9tIHNhZmV0eW5ldF9jb25jbHVzaW9ucyBpbXBvcnQgUkFUSU5HX0lNUFJPVkVNRU5UCitmcm9tIHNhZmV0eW5ldF9jb25jbHVzaW9ucyBpbXBvcnQgUkFUSU5HX1JFR1JFU1NJT04KKworCitkZWYgUnVuU2luZ2xlVGVzdENhc2VQYXJhbGxlbCh0aGlzLCBydW5fbGFiZWwsIGJ1aWxkX2RpciwgdGVzdF9jYXNlKToKKyAgcmVzdWx0ID0gdGhpcy5SdW5TaW5nbGVUZXN0Q2FzZShydW5fbGFiZWwsIGJ1aWxkX2RpciwgdGVzdF9jYXNlKQorICByZXR1cm4gKHRlc3RfY2FzZSwgcmVzdWx0KQorCisKK2NsYXNzIENvbXBhcmVSdW4ob2JqZWN0KToKKyAgIiIiQSBjb21wYXJpc29uIGJldHdlZW4gdHdvIGJyYW5jaGVzIG9mIHBkZml1bS4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgYXJncyk6CisgICAgc2VsZi5naXQgPSBHaXRIZWxwZXIoKQorICAgIHNlbGYuYXJncyA9IGFyZ3MKKyAgICBzZWxmLl9Jbml0UGF0aHMoKQorCisgIGRlZiBfSW5pdFBhdGhzKHNlbGYpOgorICAgIGlmIHNlbGYuYXJncy50aGlzX3JlcG86CisgICAgICBzZWxmLnNhZmVfc2NyaXB0X2RpciA9IHNlbGYuYXJncy5idWlsZF9kaXIKKyAgICBlbHNlOgorICAgICAgc2VsZi5zYWZlX3NjcmlwdF9kaXIgPSBvcy5wYXRoLmpvaW4oJ3Rlc3RpbmcnLCAndG9vbHMnKQorCisgICAgc2VsZi5zYWZlX21lYXN1cmVfc2NyaXB0X3BhdGggPSBvcy5wYXRoLmFic3BhdGgoCisgICAgICAgIG9zLnBhdGguam9pbihzZWxmLnNhZmVfc2NyaXB0X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICdzYWZldHluZXRfbWVhc3VyZS5weScpKQorCisgICAgaW5wdXRfZmlsZV9yZSA9IHJlLmNvbXBpbGUoJ14uK1suXXBkZiQnKQorICAgIHNlbGYudGVzdF9jYXNlcyA9IFtdCisgICAgZm9yIGlucHV0X3BhdGggaW4gc2VsZi5hcmdzLmlucHV0X3BhdGhzOgorICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoaW5wdXRfcGF0aCk6CisgICAgICAgIHNlbGYudGVzdF9jYXNlcy5hcHBlbmQoaW5wdXRfcGF0aCkKKyAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihpbnB1dF9wYXRoKToKKyAgICAgICAgZm9yIGZpbGVfZGlyLCBfLCBmaWxlbmFtZV9saXN0IGluIG9zLndhbGsoaW5wdXRfcGF0aCk6CisgICAgICAgICAgZm9yIGlucHV0X2ZpbGVuYW1lIGluIGZpbGVuYW1lX2xpc3Q6CisgICAgICAgICAgICBpZiBpbnB1dF9maWxlX3JlLm1hdGNoKGlucHV0X2ZpbGVuYW1lKToKKyAgICAgICAgICAgICAgZmlsZV9wYXRoID0gb3MucGF0aC5qb2luKGZpbGVfZGlyLCBpbnB1dF9maWxlbmFtZSkKKyAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZmlsZV9wYXRoKToKKyAgICAgICAgICAgICAgICBzZWxmLnRlc3RfY2FzZXMuYXBwZW5kKGZpbGVfcGF0aCkKKworICAgIHNlbGYuYWZ0ZXJfYnVpbGRfZGlyID0gc2VsZi5hcmdzLmJ1aWxkX2RpcgorICAgIGlmIHNlbGYuYXJncy5idWlsZF9kaXJfYmVmb3JlOgorICAgICAgc2VsZi5iZWZvcmVfYnVpbGRfZGlyID0gc2VsZi5hcmdzLmJ1aWxkX2Rpcl9iZWZvcmUKKyAgICBlbHNlOgorICAgICAgc2VsZi5iZWZvcmVfYnVpbGRfZGlyID0gc2VsZi5hZnRlcl9idWlsZF9kaXIKKworICBkZWYgUnVuKHNlbGYpOgorICAgICIiIlJ1bnMgY29tcGFyaXNvbiBieSBjaGVja2luZyBvdXQgYnJhbmNoZXMsIGJ1aWxkaW5nIGFuZCBtZWFzdXJpbmcgdGhlbS4KKworICAgIFJldHVybnM6CisgICAgICBFeGl0IGNvZGUgZm9yIHRoZSBzY3JpcHQuCisgICAgIiIiCisgICAgaWYgc2VsZi5hcmdzLnRoaXNfcmVwbzoKKyAgICAgIHNlbGYuX0ZyZWV6ZU1lYXN1cmVTY3JpcHQoKQorCisgICAgaWYgc2VsZi5hcmdzLmJyYW5jaF9hZnRlcjoKKyAgICAgIGlmIHNlbGYuYXJncy50aGlzX3JlcG86CisgICAgICAgIGJlZm9yZSwgYWZ0ZXIgPSBzZWxmLl9Qcm9maWxlVHdvT3RoZXJCcmFuY2hlc0luVGhpc1JlcG8oCisgICAgICAgICAgICBzZWxmLmFyZ3MuYnJhbmNoX2JlZm9yZSwKKyAgICAgICAgICAgIHNlbGYuYXJncy5icmFuY2hfYWZ0ZXIpCisgICAgICBlbHNlOgorICAgICAgICBiZWZvcmUsIGFmdGVyID0gc2VsZi5fUHJvZmlsZVR3b090aGVyQnJhbmNoZXMoCisgICAgICAgICAgICBzZWxmLmFyZ3MuYnJhbmNoX2JlZm9yZSwKKyAgICAgICAgICAgIHNlbGYuYXJncy5icmFuY2hfYWZ0ZXIpCisgICAgZWxpZiBzZWxmLmFyZ3MuYnJhbmNoX2JlZm9yZToKKyAgICAgIGlmIHNlbGYuYXJncy50aGlzX3JlcG86CisgICAgICAgIGJlZm9yZSwgYWZ0ZXIgPSBzZWxmLl9Qcm9maWxlQ3VycmVudEFuZE90aGVyQnJhbmNoSW5UaGlzUmVwbygKKyAgICAgICAgICAgIHNlbGYuYXJncy5icmFuY2hfYmVmb3JlKQorICAgICAgZWxzZToKKyAgICAgICAgYmVmb3JlLCBhZnRlciA9IHNlbGYuX1Byb2ZpbGVDdXJyZW50QW5kT3RoZXJCcmFuY2goCisgICAgICAgICAgICBzZWxmLmFyZ3MuYnJhbmNoX2JlZm9yZSkKKyAgICBlbHNlOgorICAgICAgaWYgc2VsZi5hcmdzLnRoaXNfcmVwbzoKKyAgICAgICAgYmVmb3JlLCBhZnRlciA9IHNlbGYuX1Byb2ZpbGVMb2NhbENoYW5nZXNBbmRDdXJyZW50QnJhbmNoSW5UaGlzUmVwbygpCisgICAgICBlbHNlOgorICAgICAgICBiZWZvcmUsIGFmdGVyID0gc2VsZi5fUHJvZmlsZUxvY2FsQ2hhbmdlc0FuZEN1cnJlbnRCcmFuY2goKQorCisgICAgY29uY2x1c2lvbnMgPSBzZWxmLl9EcmF3Q29uY2x1c2lvbnMoYmVmb3JlLCBhZnRlcikKKyAgICBjb25jbHVzaW9uc19kaWN0ID0gY29uY2x1c2lvbnMuR2V0T3V0cHV0RGljdCgpCisgICAgY29uY2x1c2lvbnNfZGljdC5zZXRkZWZhdWx0KCdtZXRhZGF0YScsIHt9KVsncHJvZmlsZXInXSA9IHNlbGYuYXJncy5wcm9maWxlcgorCisgICAgc2VsZi5fUHJpbnRDb25jbHVzaW9ucyhjb25jbHVzaW9uc19kaWN0KQorCisgICAgc2VsZi5fQ2xlYW5VcChjb25jbHVzaW9ucykKKworICAgIHJldHVybiAwCisKKyAgZGVmIF9GcmVlemVNZWFzdXJlU2NyaXB0KHNlbGYpOgorICAgICIiIkZyZWV6ZXMgYSB2ZXJzaW9uIG9mIHRoZSBtZWFzdXJpbmcgc2NyaXB0LgorCisgICAgVGhpcyBpcyBuZWVkZWQgdG8gbWFrZSBzdXJlIHdlIGFyZSBjb21wYXJpbmcgdGhlIHBkZml1bSBsaWJyYXJ5IGNoYW5nZXMgYW5kCisgICAgbm90IHNjcmlwdCBjaGFuZ2VzIHRoYXQgbWF5IGhhcHBlbiBiZXR3ZWVuIHRoZSB0d28gYnJhbmNoZXMuCisgICAgIiIiCisgICAgc2VsZi5fX0ZyZWV6ZUZpbGUob3MucGF0aC5qb2luKCd0ZXN0aW5nJywgJ3Rvb2xzJywgJ3NhZmV0eW5ldF9tZWFzdXJlLnB5JykpCisgICAgc2VsZi5fX0ZyZWV6ZUZpbGUob3MucGF0aC5qb2luKCd0ZXN0aW5nJywgJ3Rvb2xzJywgJ2NvbW1vbi5weScpKQorCisgIGRlZiBfX0ZyZWV6ZUZpbGUoc2VsZiwgZmlsZSk6CisgICAgUnVuQ29tbWFuZFByb3BhZ2F0ZUVycihbJ2NwJywgZmlsZSwgc2VsZi5zYWZlX3NjcmlwdF9kaXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdF9zdGF0dXNfb25fZXJyb3I9MSkKKworICBkZWYgX1Byb2ZpbGVUd29PdGhlckJyYW5jaGVzSW5UaGlzUmVwbyhzZWxmLCBiZWZvcmVfYnJhbmNoLCBhZnRlcl9icmFuY2gpOgorICAgICIiIlByb2ZpbGVzIHR3byBicmFuY2hlcyB0aGF0IGFyZSBub3QgdGhlIGN1cnJlbnQgYnJhbmNoLgorCisgICAgVGhpcyBpcyBkb25lIGluIHRoZSBsb2NhbCByZXBvc2l0b3J5IGFuZCBjaGFuZ2VzIG1heSBub3QgYmUgcmVzdG9yZWQgaWYgdGhlCisgICAgc2NyaXB0IGZhaWxzIG9yIGlzIGludGVycnVwdGVkLgorCisgICAgYWZ0ZXJfYnJhbmNoIGRvZXMgbm90IG5lZWQgdG8gZGVzY2VuZCBmcm9tIGJlZm9yZV9icmFuY2gsIHRoZXkgd2lsbCBiZQorICAgIG1lYXN1cmVkIHRoZSBzYW1lIHdheQorCisgICAgQXJnczoKKyAgICAgIGJlZm9yZV9icmFuY2g6IE9uZSBicmFuY2ggdG8gcHJvZmlsZS4KKyAgICAgIGFmdGVyX2JyYW5jaDogT3RoZXIgYnJhbmNoIHRvIHByb2ZpbGUuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSB0dXBsZSAoYmVmb3JlLCBhZnRlciksIHdoZXJlIGVhY2ggb2YgYmVmb3JlIGFuZCBhZnRlciBpcyBhIGRpY3QKKyAgICAgIG1hcHBpbmcgYSB0ZXN0IGNhc2UgbmFtZSB0byB0aGUgcHJvZmlsaW5nIHZhbHVlcyBmb3IgdGhhdCB0ZXN0IGNhc2UKKyAgICAgIGluIHRoZSBnaXZlbiBicmFuY2guCisgICAgIiIiCisgICAgYnJhbmNoX3RvX3Jlc3RvcmUgPSBzZWxmLmdpdC5HZXRDdXJyZW50QnJhbmNoTmFtZSgpCisKKyAgICBzZWxmLl9TdGFzaExvY2FsQ2hhbmdlcygpCisKKyAgICBzZWxmLl9DaGVja291dEJyYW5jaChhZnRlcl9icmFuY2gpCisgICAgc2VsZi5fQnVpbGRDdXJyZW50QnJhbmNoKHNlbGYuYWZ0ZXJfYnVpbGRfZGlyKQorICAgIGFmdGVyID0gc2VsZi5fTWVhc3VyZUN1cnJlbnRCcmFuY2goJ2FmdGVyJywgc2VsZi5hZnRlcl9idWlsZF9kaXIpCisKKyAgICBzZWxmLl9DaGVja291dEJyYW5jaChiZWZvcmVfYnJhbmNoKQorICAgIHNlbGYuX0J1aWxkQ3VycmVudEJyYW5jaChzZWxmLmJlZm9yZV9idWlsZF9kaXIpCisgICAgYmVmb3JlID0gc2VsZi5fTWVhc3VyZUN1cnJlbnRCcmFuY2goJ2JlZm9yZScsIHNlbGYuYmVmb3JlX2J1aWxkX2RpcikKKworICAgIHNlbGYuX0NoZWNrb3V0QnJhbmNoKGJyYW5jaF90b19yZXN0b3JlKQorICAgIHNlbGYuX1Jlc3RvcmVMb2NhbENoYW5nZXMoKQorCisgICAgcmV0dXJuIGJlZm9yZSwgYWZ0ZXIKKworICBkZWYgX1Byb2ZpbGVUd29PdGhlckJyYW5jaGVzKHNlbGYsIGJlZm9yZV9icmFuY2gsIGFmdGVyX2JyYW5jaCk6CisgICAgIiIiUHJvZmlsZXMgdHdvIGJyYW5jaGVzIHRoYXQgYXJlIG5vdCB0aGUgY3VycmVudCBicmFuY2guCisKKyAgICBUaGlzIGlzIGRvbmUgaW4gbmV3LCBjbG9uZWQgcmVwb3NpdG9yaWVzLCB0aGVyZWZvcmUgaXQgaXMgc2FmZXIgYnV0IHNsb3dlcgorICAgIGFuZCByZXF1aXJlcyBkb3dubG9hZHMuCisKKyAgICBhZnRlcl9icmFuY2ggZG9lcyBub3QgbmVlZCB0byBkZXNjZW5kIGZyb20gYmVmb3JlX2JyYW5jaCwgdGhleSB3aWxsIGJlCisgICAgbWVhc3VyZWQgdGhlIHNhbWUgd2F5CisKKyAgICBBcmdzOgorICAgICAgYmVmb3JlX2JyYW5jaDogT25lIGJyYW5jaCB0byBwcm9maWxlLgorICAgICAgYWZ0ZXJfYnJhbmNoOiBPdGhlciBicmFuY2ggdG8gcHJvZmlsZS4KKworICAgIFJldHVybnM6CisgICAgICBBIHR1cGxlIChiZWZvcmUsIGFmdGVyKSwgd2hlcmUgZWFjaCBvZiBiZWZvcmUgYW5kIGFmdGVyIGlzIGEgZGljdAorICAgICAgbWFwcGluZyBhIHRlc3QgY2FzZSBuYW1lIHRvIHRoZSBwcm9maWxpbmcgdmFsdWVzIGZvciB0aGF0IHRlc3QgY2FzZQorICAgICAgaW4gdGhlIGdpdmVuIGJyYW5jaC4KKyAgICAiIiIKKyAgICBhZnRlciA9IHNlbGYuX1Byb2ZpbGVTZXBhcmF0ZVJlcG8oJ2FmdGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlcl9idWlsZF9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyX2JyYW5jaCkKKyAgICBiZWZvcmUgPSBzZWxmLl9Qcm9maWxlU2VwYXJhdGVSZXBvKCdiZWZvcmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5iZWZvcmVfYnVpbGRfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlX2JyYW5jaCkKKyAgICByZXR1cm4gYmVmb3JlLCBhZnRlcgorCisgIGRlZiBfUHJvZmlsZUN1cnJlbnRBbmRPdGhlckJyYW5jaEluVGhpc1JlcG8oc2VsZiwgb3RoZXJfYnJhbmNoKToKKyAgICAiIiJQcm9maWxlcyB0aGUgY3VycmVudCBicmFuY2ggKHdpdGggdW5jb21taXR0ZWQgY2hhbmdlcykgYW5kIGFub3RoZXIgb25lLgorCisgICAgVGhpcyBpcyBkb25lIGluIHRoZSBsb2NhbCByZXBvc2l0b3J5IGFuZCBjaGFuZ2VzIG1heSBub3QgYmUgcmVzdG9yZWQgaWYgdGhlCisgICAgc2NyaXB0IGZhaWxzIG9yIGlzIGludGVycnVwdGVkLgorCisgICAgVGhlIGN1cnJlbnQgYnJhbmNoIGRvZXMgbm90IG5lZWQgdG8gZGVzY2VuZCBmcm9tIG90aGVyX2JyYW5jaC4KKworICAgIEFyZ3M6CisgICAgICBvdGhlcl9icmFuY2g6IE90aGVyIGJyYW5jaCB0byBwcm9maWxlIHRoYXQgaXMgbm90IHRoZSBjdXJyZW50LgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgdHVwbGUgKGJlZm9yZSwgYWZ0ZXIpLCB3aGVyZSBlYWNoIG9mIGJlZm9yZSBhbmQgYWZ0ZXIgaXMgYSBkaWN0CisgICAgICBtYXBwaW5nIGEgdGVzdCBjYXNlIG5hbWUgdG8gdGhlIHByb2ZpbGluZyB2YWx1ZXMgZm9yIHRoYXQgdGVzdCBjYXNlCisgICAgICBpbiB0aGUgZ2l2ZW4gYnJhbmNoLiBUaGUgY3VycmVudCBicmFuY2ggaXMgY29uc2lkZXJlZCB0byBiZSAiYWZ0ZXIiIGFuZAorICAgICAgdGhlIG90aGVyIGJyYW5jaCBpcyBjb25zaWRlcmVkIHRvIGJlICJiZWZvcmUiLgorICAgICIiIgorICAgIGJyYW5jaF90b19yZXN0b3JlID0gc2VsZi5naXQuR2V0Q3VycmVudEJyYW5jaE5hbWUoKQorCisgICAgc2VsZi5fQnVpbGRDdXJyZW50QnJhbmNoKHNlbGYuYWZ0ZXJfYnVpbGRfZGlyKQorICAgIGFmdGVyID0gc2VsZi5fTWVhc3VyZUN1cnJlbnRCcmFuY2goJ2FmdGVyJywgc2VsZi5hZnRlcl9idWlsZF9kaXIpCisKKyAgICBzZWxmLl9TdGFzaExvY2FsQ2hhbmdlcygpCisKKyAgICBzZWxmLl9DaGVja291dEJyYW5jaChvdGhlcl9icmFuY2gpCisgICAgc2VsZi5fQnVpbGRDdXJyZW50QnJhbmNoKHNlbGYuYmVmb3JlX2J1aWxkX2RpcikKKyAgICBiZWZvcmUgPSBzZWxmLl9NZWFzdXJlQ3VycmVudEJyYW5jaCgnYmVmb3JlJywgc2VsZi5iZWZvcmVfYnVpbGRfZGlyKQorCisgICAgc2VsZi5fQ2hlY2tvdXRCcmFuY2goYnJhbmNoX3RvX3Jlc3RvcmUpCisgICAgc2VsZi5fUmVzdG9yZUxvY2FsQ2hhbmdlcygpCisKKyAgICByZXR1cm4gYmVmb3JlLCBhZnRlcgorCisgIGRlZiBfUHJvZmlsZUN1cnJlbnRBbmRPdGhlckJyYW5jaChzZWxmLCBvdGhlcl9icmFuY2gpOgorICAgICIiIlByb2ZpbGVzIHRoZSBjdXJyZW50IGJyYW5jaCAod2l0aCB1bmNvbW1pdHRlZCBjaGFuZ2VzKSBhbmQgYW5vdGhlciBvbmUuCisKKyAgICBUaGlzIGlzIGRvbmUgaW4gbmV3LCBjbG9uZWQgcmVwb3NpdG9yaWVzLCB0aGVyZWZvcmUgaXQgaXMgc2FmZXIgYnV0IHNsb3dlcgorICAgIGFuZCByZXF1aXJlcyBkb3dubG9hZHMuCisKKyAgICBUaGUgY3VycmVudCBicmFuY2ggZG9lcyBub3QgbmVlZCB0byBkZXNjZW5kIGZyb20gb3RoZXJfYnJhbmNoLgorCisgICAgQXJnczoKKyAgICAgIG90aGVyX2JyYW5jaDogT3RoZXIgYnJhbmNoIHRvIHByb2ZpbGUgdGhhdCBpcyBub3QgdGhlIGN1cnJlbnQuIE5vbmUgd2lsbAorICAgICAgICAgIGNvbXBhcmUgdG8gdGhlIHNhbWUgYnJhbmNoLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgdHVwbGUgKGJlZm9yZSwgYWZ0ZXIpLCB3aGVyZSBlYWNoIG9mIGJlZm9yZSBhbmQgYWZ0ZXIgaXMgYSBkaWN0CisgICAgICBtYXBwaW5nIGEgdGVzdCBjYXNlIG5hbWUgdG8gdGhlIHByb2ZpbGluZyB2YWx1ZXMgZm9yIHRoYXQgdGVzdCBjYXNlCisgICAgICBpbiB0aGUgZ2l2ZW4gYnJhbmNoLiBUaGUgY3VycmVudCBicmFuY2ggaXMgY29uc2lkZXJlZCB0byBiZSAiYWZ0ZXIiIGFuZAorICAgICAgdGhlIG90aGVyIGJyYW5jaCBpcyBjb25zaWRlcmVkIHRvIGJlICJiZWZvcmUiLgorICAgICIiIgorICAgIHNlbGYuX0J1aWxkQ3VycmVudEJyYW5jaChzZWxmLmFmdGVyX2J1aWxkX2RpcikKKyAgICBhZnRlciA9IHNlbGYuX01lYXN1cmVDdXJyZW50QnJhbmNoKCdhZnRlcicsIHNlbGYuYWZ0ZXJfYnVpbGRfZGlyKQorCisgICAgYmVmb3JlID0gc2VsZi5fUHJvZmlsZVNlcGFyYXRlUmVwbygnYmVmb3JlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYmVmb3JlX2J1aWxkX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX2JyYW5jaCkKKworICAgIHJldHVybiBiZWZvcmUsIGFmdGVyCisKKyAgZGVmIF9Qcm9maWxlTG9jYWxDaGFuZ2VzQW5kQ3VycmVudEJyYW5jaEluVGhpc1JlcG8oc2VsZik6CisgICAgIiIiUHJvZmlsZXMgdGhlIGN1cnJlbnQgYnJhbmNoIHdpdGggYW5kIHdpdGhvdXQgdW5jb21taXR0ZWQgY2hhbmdlcy4KKworICAgIFRoaXMgaXMgZG9uZSBpbiB0aGUgbG9jYWwgcmVwb3NpdG9yeSBhbmQgY2hhbmdlcyBtYXkgbm90IGJlIHJlc3RvcmVkIGlmIHRoZQorICAgIHNjcmlwdCBmYWlscyBvciBpcyBpbnRlcnJ1cHRlZC4KKworICAgIFJldHVybnM6CisgICAgICBBIHR1cGxlIChiZWZvcmUsIGFmdGVyKSwgd2hlcmUgZWFjaCBvZiBiZWZvcmUgYW5kIGFmdGVyIGlzIGEgZGljdAorICAgICAgbWFwcGluZyBhIHRlc3QgY2FzZSBuYW1lIHRvIHRoZSBwcm9maWxpbmcgdmFsdWVzIGZvciB0aGF0IHRlc3QgY2FzZQorICAgICAgdXNpbmcgdGhlIGdpdmVuIHZlcnNpb24uIFRoZSBjdXJyZW50IGJyYW5jaCB3aXRob3V0IHVuY29tbWl0dGVkIGNoYW5nZXMgaXMKKyAgICAgIGNvbnNpZGVyZWQgdG8gYmUgImJlZm9yZSIgYW5kIHdpdGggdW5jb21taXR0ZWQgY2hhbmdlcyBpcyBjb25zaWRlcmVkIHRvIGJlCisgICAgICAiYWZ0ZXIiLgorICAgICIiIgorICAgIHNlbGYuX0J1aWxkQ3VycmVudEJyYW5jaChzZWxmLmFmdGVyX2J1aWxkX2RpcikKKyAgICBhZnRlciA9IHNlbGYuX01lYXN1cmVDdXJyZW50QnJhbmNoKCdhZnRlcicsIHNlbGYuYWZ0ZXJfYnVpbGRfZGlyKQorCisgICAgcHVzaGVkID0gc2VsZi5fU3Rhc2hMb2NhbENoYW5nZXMoKQorICAgIGlmIG5vdCBwdXNoZWQgYW5kIG5vdCBzZWxmLmFyZ3MuYnVpbGRfZGlyX2JlZm9yZToKKyAgICAgIFByaW50RXJyKCdXYXJuaW5nOiBObyBsb2NhbCBjaGFuZ2VzIHRvIGNvbXBhcmUnKQorCisgICAgYmVmb3JlX2J1aWxkX2RpciA9IHNlbGYuYmVmb3JlX2J1aWxkX2RpcgorCisgICAgc2VsZi5fQnVpbGRDdXJyZW50QnJhbmNoKGJlZm9yZV9idWlsZF9kaXIpCisgICAgYmVmb3JlID0gc2VsZi5fTWVhc3VyZUN1cnJlbnRCcmFuY2goJ2JlZm9yZScsIGJlZm9yZV9idWlsZF9kaXIpCisKKyAgICBzZWxmLl9SZXN0b3JlTG9jYWxDaGFuZ2VzKCkKKworICAgIHJldHVybiBiZWZvcmUsIGFmdGVyCisKKyAgZGVmIF9Qcm9maWxlTG9jYWxDaGFuZ2VzQW5kQ3VycmVudEJyYW5jaChzZWxmKToKKyAgICAiIiJQcm9maWxlcyB0aGUgY3VycmVudCBicmFuY2ggd2l0aCBhbmQgd2l0aG91dCB1bmNvbW1pdHRlZCBjaGFuZ2VzLgorCisgICAgVGhpcyBpcyBkb25lIGluIG5ldywgY2xvbmVkIHJlcG9zaXRvcmllcywgdGhlcmVmb3JlIGl0IGlzIHNhZmVyIGJ1dCBzbG93ZXIKKyAgICBhbmQgcmVxdWlyZXMgZG93bmxvYWRzLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgdHVwbGUgKGJlZm9yZSwgYWZ0ZXIpLCB3aGVyZSBlYWNoIG9mIGJlZm9yZSBhbmQgYWZ0ZXIgaXMgYSBkaWN0CisgICAgICBtYXBwaW5nIGEgdGVzdCBjYXNlIG5hbWUgdG8gdGhlIHByb2ZpbGluZyB2YWx1ZXMgZm9yIHRoYXQgdGVzdCBjYXNlCisgICAgICB1c2luZyB0aGUgZ2l2ZW4gdmVyc2lvbi4gVGhlIGN1cnJlbnQgYnJhbmNoIHdpdGhvdXQgdW5jb21taXR0ZWQgY2hhbmdlcyBpcworICAgICAgY29uc2lkZXJlZCB0byBiZSAiYmVmb3JlIiBhbmQgd2l0aCB1bmNvbW1pdHRlZCBjaGFuZ2VzIGlzIGNvbnNpZGVyZWQgdG8gYmUKKyAgICAgICJhZnRlciIuCisgICAgIiIiCisgICAgcmV0dXJuIHNlbGYuX1Byb2ZpbGVDdXJyZW50QW5kT3RoZXJCcmFuY2gob3RoZXJfYnJhbmNoPU5vbmUpCisKKyAgZGVmIF9Qcm9maWxlU2VwYXJhdGVSZXBvKHNlbGYsIHJ1bl9sYWJlbCwgcmVsYXRpdmVfYnVpbGRfZGlyLCBicmFuY2gpOgorICAgICIiIlByb2ZpbGVzIGEgYnJhbmNoIGluIGEgYSB0ZW1wb3JhcnkgZ2l0IHJlcG9zaXRvcnkuCisKKyAgICBBcmdzOgorICAgICAgcnVuX2xhYmVsOiBTdHJpbmcgdG8gZGlmZmVyZW50aWF0ZSB0aGlzIHZlcnNpb24gb2YgdGhlIGNvZGUgaW4gb3V0cHV0CisgICAgICAgICAgZmlsZXMgZnJvbSBvdGhlciB2ZXJzaW9ucy4KKyAgICAgIHJlbGF0aXZlX2J1aWxkX2RpcjogUGF0aCB0byB0aGUgYnVpbGQgZGlyIGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyIHRvCisgICAgICAgICAgY2xvbmUgYnVpbGQgYXJncyBmcm9tLgorICAgICAgYnJhbmNoOiBCcmFuY2ggdG8gY2hlY2tvdXQgaW4gdGhlIG5ldyByZXBvc2l0b3J5LiBOb25lIHdpbGwKKyAgICAgICAgICBwcm9maWxlIHRoZSBzYW1lIGJyYW5jaCBjaGVja2VkIG91dCBpbiB0aGUgb3JpZ2luYWwgcmVwby4KKyAgICBSZXR1cm5zOgorICAgICAgQSBkaWN0IG1hcHBpbmcgZWFjaCB0ZXN0IGNhc2UgbmFtZSB0byB0aGUgcHJvZmlsaW5nIHZhbHVlcyBmb3IgdGhhdAorICAgICAgdGVzdCBjYXNlLgorICAgICIiIgorICAgIGJ1aWxkX2RpciA9IHNlbGYuX0NyZWF0ZVRlbXBSZXBvKCdyZXBvXyVzJyAlIHJ1bl9sYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZV9idWlsZF9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmNoKQorCisgICAgc2VsZi5fQnVpbGRDdXJyZW50QnJhbmNoKGJ1aWxkX2RpcikKKyAgICByZXR1cm4gc2VsZi5fTWVhc3VyZUN1cnJlbnRCcmFuY2gocnVuX2xhYmVsLCBidWlsZF9kaXIpCisKKyAgZGVmIF9DcmVhdGVUZW1wUmVwbyhzZWxmLCBkaXJfbmFtZSwgcmVsYXRpdmVfYnVpbGRfZGlyLCBicmFuY2gpOgorICAgICIiIkNsb25lcyBhIHRlbXBvcmFyeSBnaXQgcmVwb3NpdG9yeSBvdXQgb2YgdGhlIGN1cnJlbnQgd29ya2luZyBkaXIuCisKKyAgICBBcmdzOgorICAgICAgZGlyX25hbWU6IE5hbWUgZm9yIHRoZSB0ZW1wb3JhcnkgcmVwb3NpdG9yeSBkaXJlY3RvcnkKKyAgICAgIHJlbGF0aXZlX2J1aWxkX2RpcjogUGF0aCB0byB0aGUgYnVpbGQgZGlyIGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyIHRvCisgICAgICAgICAgY2xvbmUgYnVpbGQgYXJncyBmcm9tLgorICAgICAgYnJhbmNoOiBCcmFuY2ggdG8gY2hlY2tvdXQgaW4gdGhlIG5ldyByZXBvc2l0b3J5LiBOb25lIHdpbGwga2VlcCBjaGVja2VkCisgICAgICAgICAgb3V0IHRoZSBzYW1lIGJyYW5jaCBhcyB0aGUgbG9jYWwgcmVwby4KKyAgICBSZXR1cm5zOgorICAgICAgUGF0aCB0byB0aGUgYnVpbGQgZGlyZWN0b3J5IG9mIHRoZSBuZXcgcmVwb3NpdG9yeS4KKyAgICAiIiIKKyAgICBjd2QgPSBvcy5nZXRjd2QoKQorCisgICAgcmVwb19kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKHN1ZmZpeD0nLSVzJyAlIGRpcl9uYW1lKQorICAgIHNyY19kaXIgPSBvcy5wYXRoLmpvaW4ocmVwb19kaXIsICdwZGZpdW0nKQorCisgICAgc2VsZi5naXQuQ2xvbmVMb2NhbChvcy5nZXRjd2QoKSwgc3JjX2RpcikKKworICAgIGlmIGJyYW5jaCBpcyBub3QgTm9uZToKKyAgICAgIG9zLmNoZGlyKHNyY19kaXIpCisgICAgICBzZWxmLmdpdC5DaGVja291dChicmFuY2gpCisKKyAgICBvcy5jaGRpcihyZXBvX2RpcikKKyAgICBQcmludEVycignU3luY2luZy4uLicpCisKKyAgICBjbWQgPSBbJ2djbGllbnQnLCAnY29uZmlnJywgJy0tdW5tYW5hZ2VkJywKKyAgICAgICAgICAgJ2h0dHBzOi8vcGRmaXVtLmdvb2dsZXNvdXJjZS5jb20vcGRmaXVtLmdpdCddCisgICAgaWYgc2VsZi5hcmdzLmNhY2hlX2RpcjoKKyAgICAgIGNtZC5hcHBlbmQoJy0tY2FjaGUtZGlyPSVzJyAlIHNlbGYuYXJncy5jYWNoZV9kaXIpCisgICAgUnVuQ29tbWFuZFByb3BhZ2F0ZUVycihjbWQsIGV4aXRfc3RhdHVzX29uX2Vycm9yPTEpCisKKyAgICBSdW5Db21tYW5kUHJvcGFnYXRlRXJyKFsnZ2NsaWVudCcsICdzeW5jJ10sIGV4aXRfc3RhdHVzX29uX2Vycm9yPTEpCisKKyAgICBQcmludEVycignRG9uZS4nKQorCisgICAgYnVpbGRfZGlyID0gb3MucGF0aC5qb2luKHNyY19kaXIsIHJlbGF0aXZlX2J1aWxkX2RpcikKKyAgICBvcy5tYWtlZGlycyhidWlsZF9kaXIpCisgICAgb3MuY2hkaXIoc3JjX2RpcikKKworICAgIHNvdXJjZV9nbl9hcmdzID0gb3MucGF0aC5qb2luKGN3ZCwgcmVsYXRpdmVfYnVpbGRfZGlyLCAnYXJncy5nbicpCisgICAgZGVzdF9nbl9hcmdzID0gb3MucGF0aC5qb2luKGJ1aWxkX2RpciwgJ2FyZ3MuZ24nKQorICAgIHNodXRpbC5jb3B5KHNvdXJjZV9nbl9hcmdzLCBkZXN0X2duX2FyZ3MpCisKKyAgICBSdW5Db21tYW5kUHJvcGFnYXRlRXJyKFsnZ24nLCAnZ2VuJywgcmVsYXRpdmVfYnVpbGRfZGlyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXRfc3RhdHVzX29uX2Vycm9yPTEpCisKKyAgICBvcy5jaGRpcihjd2QpCisKKyAgICByZXR1cm4gYnVpbGRfZGlyCisKKworICBkZWYgX0NoZWNrb3V0QnJhbmNoKHNlbGYsIGJyYW5jaCk6CisgICAgUHJpbnRFcnIoIkNoZWNraW5nIG91dCBicmFuY2ggJyVzJyIgJSBicmFuY2gpCisgICAgc2VsZi5naXQuQ2hlY2tvdXQoYnJhbmNoKQorCisgIGRlZiBfU3Rhc2hMb2NhbENoYW5nZXMoc2VsZik6CisgICAgUHJpbnRFcnIoJ1N0YXNoaW5nIGxvY2FsIGNoYW5nZXMnKQorICAgIHJldHVybiBzZWxmLmdpdC5TdGFzaFB1c2goKQorCisgIGRlZiBfUmVzdG9yZUxvY2FsQ2hhbmdlcyhzZWxmKToKKyAgICBQcmludEVycignUmVzdG9yaW5nIGxvY2FsIGNoYW5nZXMnKQorICAgIHNlbGYuZ2l0LlN0YXNoUG9wQWxsKCkKKworICBkZWYgX0J1aWxkQ3VycmVudEJyYW5jaChzZWxmLCBidWlsZF9kaXIpOgorICAgICIiIlN5bmNocm9uaXplcyBhbmQgYnVpbGRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgcGRmaXVtLgorCisgICAgQXJnczoKKyAgICAgIGJ1aWxkX2RpcjogU3RyaW5nIHdpdGggcGF0aCB0byBidWlsZCBkaXJlY3RvcnkKKyAgICAiIiIKKyAgICBQcmludEVycignU3luY2luZy4uLicpCisgICAgUnVuQ29tbWFuZFByb3BhZ2F0ZUVycihbJ2djbGllbnQnLCAnc3luYyddLCBleGl0X3N0YXR1c19vbl9lcnJvcj0xKQorICAgIFByaW50RXJyKCdEb25lLicpCisKKyAgICBQcmludEVycignQnVpbGRpbmcuLi4nKQorICAgIGNtZCA9IFsnbmluamEnLCAnLUMnLCBidWlsZF9kaXIsICdwZGZpdW1fdGVzdCddCisgICAgaWYgR2V0Qm9vbGVhbkduQXJnKCd1c2VfZ29tYScsIGJ1aWxkX2Rpcik6CisgICAgICBjbWQuZXh0ZW5kKFsnLWonLCAnMjUwJ10pCisgICAgUnVuQ29tbWFuZFByb3BhZ2F0ZUVycihjbWQsIHN0ZG91dF9oYXNfZXJyb3JzPVRydWUsIGV4aXRfc3RhdHVzX29uX2Vycm9yPTEpCisgICAgUHJpbnRFcnIoJ0RvbmUuJykKKworICBkZWYgX01lYXN1cmVDdXJyZW50QnJhbmNoKHNlbGYsIHJ1bl9sYWJlbCwgYnVpbGRfZGlyKToKKyAgICBQcmludEVycignTWVhc3VyaW5nLi4uJykKKyAgICBpZiBzZWxmLmFyZ3MubnVtX3dvcmtlcnMgPiAxIGFuZCBsZW4oc2VsZi50ZXN0X2Nhc2VzKSA+IDE6CisgICAgICByZXN1bHRzID0gc2VsZi5fUnVuQXN5bmMocnVuX2xhYmVsLCBidWlsZF9kaXIpCisgICAgZWxzZToKKyAgICAgIHJlc3VsdHMgPSBzZWxmLl9SdW5TeW5jKHJ1bl9sYWJlbCwgYnVpbGRfZGlyKQorICAgIFByaW50RXJyKCdEb25lLicpCisKKyAgICByZXR1cm4gcmVzdWx0cworCisgIGRlZiBfUnVuU3luYyhzZWxmLCBydW5fbGFiZWwsIGJ1aWxkX2Rpcik6CisgICAgIiIiUHJvZmlsZXMgdGhlIHRlc3QgY2FzZXMgc3luY2hyb25vdXNseS4KKworICAgIEFyZ3M6CisgICAgICBydW5fbGFiZWw6IFN0cmluZyB0byBkaWZmZXJlbnRpYXRlIHRoaXMgdmVyc2lvbiBvZiB0aGUgY29kZSBpbiBvdXRwdXQKKyAgICAgICAgICBmaWxlcyBmcm9tIG90aGVyIHZlcnNpb25zLgorICAgICAgYnVpbGRfZGlyOiBTdHJpbmcgd2l0aCBwYXRoIHRvIGJ1aWxkIGRpcmVjdG9yeQorCisgICAgUmV0dXJuczoKKyAgICAgIEEgZGljdCBtYXBwaW5nIGVhY2ggdGVzdCBjYXNlIG5hbWUgdG8gdGhlIHByb2ZpbGluZyB2YWx1ZXMgZm9yIHRoYXQKKyAgICAgIHRlc3QgY2FzZS4KKyAgICAiIiIKKyAgICByZXN1bHRzID0ge30KKworICAgIGZvciB0ZXN0X2Nhc2UgaW4gc2VsZi50ZXN0X2Nhc2VzOgorICAgICAgcmVzdWx0ID0gc2VsZi5SdW5TaW5nbGVUZXN0Q2FzZShydW5fbGFiZWwsIGJ1aWxkX2RpciwgdGVzdF9jYXNlKQorICAgICAgaWYgcmVzdWx0IGlzIG5vdCBOb25lOgorICAgICAgICByZXN1bHRzW3Rlc3RfY2FzZV0gPSByZXN1bHQKKworICAgIHJldHVybiByZXN1bHRzCisKKyAgZGVmIF9SdW5Bc3luYyhzZWxmLCBydW5fbGFiZWwsIGJ1aWxkX2Rpcik6CisgICAgIiIiUHJvZmlsZXMgdGhlIHRlc3QgY2FzZXMgYXN5bmNocm9ub3VzbHkuCisKKyAgICBVc2VzIGFzIG1hbnkgd29ya2VycyBhcyBjb25maWd1cmVkIGJ5IC0tbnVtLXdvcmtlcnMuCisKKyAgICBBcmdzOgorICAgICAgcnVuX2xhYmVsOiBTdHJpbmcgdG8gZGlmZmVyZW50aWF0ZSB0aGlzIHZlcnNpb24gb2YgdGhlIGNvZGUgaW4gb3V0cHV0CisgICAgICAgICAgZmlsZXMgZnJvbSBvdGhlciB2ZXJzaW9ucy4KKyAgICAgIGJ1aWxkX2RpcjogU3RyaW5nIHdpdGggcGF0aCB0byBidWlsZCBkaXJlY3RvcnkKKworICAgIFJldHVybnM6CisgICAgICBBIGRpY3QgbWFwcGluZyBlYWNoIHRlc3QgY2FzZSBuYW1lIHRvIHRoZSBwcm9maWxpbmcgdmFsdWVzIGZvciB0aGF0CisgICAgICB0ZXN0IGNhc2UuCisgICAgIiIiCisgICAgcmVzdWx0cyA9IHt9CisgICAgcG9vbCA9IG11bHRpcHJvY2Vzc2luZy5Qb29sKHNlbGYuYXJncy5udW1fd29ya2VycykKKyAgICB3b3JrZXJfZnVuYyA9IGZ1bmN0b29scy5wYXJ0aWFsKAorICAgICAgICBSdW5TaW5nbGVUZXN0Q2FzZVBhcmFsbGVsLCBzZWxmLCBydW5fbGFiZWwsIGJ1aWxkX2RpcikKKworICAgIHRyeToKKyAgICAgICMgVGhlIHRpbWVvdXQgaXMgYSB3b3JrYXJvdW5kIGZvciBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlODI5NgorICAgICAgIyB3aGljaCBwcmV2ZW50cyBLZXlib2FyZEludGVycnVwdCBmcm9tIHdvcmtpbmcuCisgICAgICBvbmVfeWVhcl9pbl9zZWNvbmRzID0gMzYwMCAqIDI0ICogMzY1CisgICAgICB3b3JrZXJfcmVzdWx0cyA9IChwb29sLm1hcF9hc3luYyh3b3JrZXJfZnVuYywgc2VsZi50ZXN0X2Nhc2VzKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldChvbmVfeWVhcl9pbl9zZWNvbmRzKSkKKyAgICAgIGZvciB3b3JrZXJfcmVzdWx0IGluIHdvcmtlcl9yZXN1bHRzOgorICAgICAgICB0ZXN0X2Nhc2UsIHJlc3VsdCA9IHdvcmtlcl9yZXN1bHQKKyAgICAgICAgaWYgcmVzdWx0IGlzIG5vdCBOb25lOgorICAgICAgICAgIHJlc3VsdHNbdGVzdF9jYXNlXSA9IHJlc3VsdAorICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgIHBvb2wudGVybWluYXRlKCkKKyAgICAgIHN5cy5leGl0KDEpCisgICAgZWxzZToKKyAgICAgIHBvb2wuY2xvc2UoKQorCisgICAgcG9vbC5qb2luKCkKKworICAgIHJldHVybiByZXN1bHRzCisKKyAgZGVmIFJ1blNpbmdsZVRlc3RDYXNlKHNlbGYsIHJ1bl9sYWJlbCwgYnVpbGRfZGlyLCB0ZXN0X2Nhc2UpOgorICAgICIiIlByb2ZpbGVzIGEgc2luZ2xlIHRlc3QgY2FzZS4KKworICAgIEFyZ3M6CisgICAgICBydW5fbGFiZWw6IFN0cmluZyB0byBkaWZmZXJlbnRpYXRlIHRoaXMgdmVyc2lvbiBvZiB0aGUgY29kZSBpbiBvdXRwdXQKKyAgICAgICAgICBmaWxlcyBmcm9tIG90aGVyIHZlcnNpb25zLgorICAgICAgYnVpbGRfZGlyOiBTdHJpbmcgd2l0aCBwYXRoIHRvIGJ1aWxkIGRpcmVjdG9yeQorICAgICAgdGVzdF9jYXNlOiBQYXRoIHRvIHRoZSB0ZXN0IGNhc2UuCisKKyAgICBSZXR1cm5zOgorICAgICAgVGhlIG1lYXN1cmVkIHByb2ZpbGluZyB2YWx1ZSBmb3IgdGhhdCB0ZXN0IGNhc2UuCisgICAgIiIiCisgICAgY29tbWFuZCA9IFtzZWxmLnNhZmVfbWVhc3VyZV9zY3JpcHRfcGF0aCwgdGVzdF9jYXNlLAorICAgICAgICAgICAgICAgJy0tYnVpbGQtZGlyPSVzJyAlIGJ1aWxkX2Rpcl0KKworICAgIGlmIHNlbGYuYXJncy5pbnRlcmVzdGluZ19zZWN0aW9uOgorICAgICAgY29tbWFuZC5hcHBlbmQoJy0taW50ZXJlc3Rpbmctc2VjdGlvbicpCisKKyAgICBpZiBzZWxmLmFyZ3MucHJvZmlsZXI6CisgICAgICBjb21tYW5kLmFwcGVuZCgnLS1wcm9maWxlcj0lcycgJSBzZWxmLmFyZ3MucHJvZmlsZXIpCisKKyAgICBwcm9maWxlX2ZpbGVfcGF0aCA9IHNlbGYuX0dldFByb2ZpbGVGaWxlUGF0aChydW5fbGFiZWwsIHRlc3RfY2FzZSkKKyAgICBpZiBwcm9maWxlX2ZpbGVfcGF0aDoKKyAgICAgIGNvbW1hbmQuYXBwZW5kKCctLW91dHB1dC1wYXRoPSVzJyAlIHByb2ZpbGVfZmlsZV9wYXRoKQorCisgICAgb3V0cHV0ID0gUnVuQ29tbWFuZFByb3BhZ2F0ZUVycihjb21tYW5kKQorCisgICAgaWYgb3V0cHV0IGlzIE5vbmU6CisgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBHZXQgdGhlIHRpbWUgbnVtYmVyIGFzIG91dHB1dCwgbWFraW5nIHN1cmUgaXQncyBqdXN0IGEgbnVtYmVyCisgICAgb3V0cHV0ID0gb3V0cHV0LnN0cmlwKCkKKyAgICBpZiByZS5tYXRjaCgnXlswLTldKyQnLCBvdXRwdXQpOgorICAgICAgcmV0dXJuIGludChvdXRwdXQpCisKKyAgICByZXR1cm4gTm9uZQorCisgIGRlZiBfR2V0UHJvZmlsZUZpbGVQYXRoKHNlbGYsIHJ1bl9sYWJlbCwgdGVzdF9jYXNlKToKKyAgICBpZiBzZWxmLmFyZ3Mub3V0cHV0X2RpcjoKKyAgICAgIG91dHB1dF9maWxlbmFtZSA9ICgnY2FsbGdyaW5kLm91dC4lcy4lcycKKyAgICAgICAgICAgICAgICAgICAgICAgICAlICh0ZXN0X2Nhc2UucmVwbGFjZSgnLycsICdfJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX2xhYmVsKSkKKyAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5hcmdzLm91dHB1dF9kaXIsIG91dHB1dF9maWxlbmFtZSkKKyAgICBlbHNlOgorICAgICAgcmV0dXJuIE5vbmUKKworICBkZWYgX0RyYXdDb25jbHVzaW9ucyhzZWxmLCB0aW1lc19iZWZvcmVfYnJhbmNoLCB0aW1lc19hZnRlcl9icmFuY2gpOgorICAgICIiIkRyYXdzIGNvbmNsdXNpb25zIGNvbXBhcmluZyByZXN1bHRzIG9mIHRlc3QgcnVucyBpbiB0d28gYnJhbmNoZXMuCisKKyAgICBBcmdzOgorICAgICAgdGltZXNfYmVmb3JlX2JyYW5jaDogQSBkaWN0IG1hcHBpbmcgZWFjaCB0ZXN0IGNhc2UgbmFtZSB0byB0aGUKKyAgICAgICAgICBwcm9maWxpbmcgdmFsdWVzIGZvciB0aGF0IHRlc3QgY2FzZSBpbiB0aGUgYnJhbmNoIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgICAgICBhcyB0aGUgYmFzZWxpbmUuCisgICAgICB0aW1lc19hZnRlcl9icmFuY2g6IEEgZGljdCBtYXBwaW5nIGVhY2ggdGVzdCBjYXNlIG5hbWUgdG8gdGhlCisgICAgICAgICAgcHJvZmlsaW5nIHZhbHVlcyBmb3IgdGhhdCB0ZXN0IGNhc2UgaW4gdGhlIGJyYW5jaCB0byBiZSBjb25zaWRlcmVkCisgICAgICAgICAgYXMgdGhlIG5ldyB2ZXJzaW9uLgorCisgICAgUmV0dXJuczoKKyAgICAgIENvbXBhcmlzb25Db25jbHVzaW9ucyB3aXRoIGFsbCB0ZXN0IGNhc2VzIHByb2Nlc3NlZC4KKyAgICAiIiIKKyAgICBjb25jbHVzaW9ucyA9IENvbXBhcmlzb25Db25jbHVzaW9ucyhzZWxmLmFyZ3MudGhyZXNob2xkX3NpZ25pZmljYW50KQorCisgICAgZm9yIHRlc3RfY2FzZSBpbiBzb3J0ZWQoc2VsZi50ZXN0X2Nhc2VzKToKKyAgICAgIGJlZm9yZSA9IHRpbWVzX2JlZm9yZV9icmFuY2guZ2V0KHRlc3RfY2FzZSkKKyAgICAgIGFmdGVyID0gdGltZXNfYWZ0ZXJfYnJhbmNoLmdldCh0ZXN0X2Nhc2UpCisgICAgICBjb25jbHVzaW9ucy5Qcm9jZXNzQ2FzZSh0ZXN0X2Nhc2UsIGJlZm9yZSwgYWZ0ZXIpCisKKyAgICByZXR1cm4gY29uY2x1c2lvbnMKKworICBkZWYgX1ByaW50Q29uY2x1c2lvbnMoc2VsZiwgY29uY2x1c2lvbnNfZGljdCk6CisgICAgIiIiUHJpbnRzIHRoZSBjb25jbHVzaW9ucyBhcyB0aGUgc2NyaXB0IG91dHB1dC4KKworICAgIERlcGVuZGluZyBvbiB0aGUgc2NyaXB0IGFyZ3MsIHRoaXMgY2FuIG91dHB1dCBhIGh1bWFuIG9yIGEgbWFjaGluZS1yZWFkYWJsZQorICAgIHZlcnNpb24gb2YgdGhlIGNvbmNsdXNpb25zLgorCisgICAgQXJnczoKKyAgICAgIGNvbmNsdXNpb25zX2RpY3Q6IERpY3QgdG8gcHJpbnQgcmV0dXJuZWQgZnJvbQorICAgICAgICAgIENvbXBhcmlzb25Db25jbHVzaW9ucy5HZXRPdXRwdXREaWN0KCkuCisgICAgIiIiCisgICAgaWYgc2VsZi5hcmdzLm1hY2hpbmVfcmVhZGFibGU6CisgICAgICBwcmludCBqc29uLmR1bXBzKGNvbmNsdXNpb25zX2RpY3QpCisgICAgZWxzZToKKyAgICAgIFByaW50Q29uY2x1c2lvbnNEaWN0SHVtYW5SZWFkYWJsZSgKKyAgICAgICAgICBjb25jbHVzaW9uc19kaWN0LCBjb2xvcmVkPVRydWUsIGtleT1zZWxmLmFyZ3MuY2FzZV9vcmRlcikKKworICBkZWYgX0NsZWFuVXAoc2VsZiwgY29uY2x1c2lvbnMpOgorICAgICIiIlJlbW92ZXMgcHJvZmlsZSBvdXRwdXQgZmlsZXMgZm9yIHVuaW50ZXJlc3RpbmcgY2FzZXMuCisKKyAgICBDYXNlcyB3aXRob3V0IHNpZ25pZmljYW50IHJlZ3Jlc3Npb25zIG9yIGltcHJvdmVtZW50cyBhbmQgY29uc2lkZXJlZAorICAgIHVuaW50ZXJlc3RpbmcuCisKKyAgICBBcmdzOgorICAgICAgY29uY2x1c2lvbnM6IEEgQ29tcGFyaXNvbkNvbmNsdXNpb25zLgorICAgICIiIgorICAgIGlmIG5vdCBzZWxmLmFyZ3Mub3V0cHV0X2RpcjoKKyAgICAgIHJldHVybgorCisgICAgaWYgc2VsZi5hcmdzLnByb2ZpbGVyICE9ICdjYWxsZ3JpbmQnOgorICAgICAgcmV0dXJuCisKKyAgICBmb3IgY2FzZV9yZXN1bHQgaW4gY29uY2x1c2lvbnMuR2V0Q2FzZVJlc3VsdHMoKS52YWx1ZXMoKToKKyAgICAgIGlmIGNhc2VfcmVzdWx0LnJhdGluZyBub3QgaW4gW1JBVElOR19SRUdSRVNTSU9OLCBSQVRJTkdfSU1QUk9WRU1FTlRdOgorICAgICAgICBzZWxmLl9DbGVhblVwT3V0cHV0RmlsZSgnYmVmb3JlJywgY2FzZV9yZXN1bHQuY2FzZV9uYW1lKQorICAgICAgICBzZWxmLl9DbGVhblVwT3V0cHV0RmlsZSgnYWZ0ZXInLCBjYXNlX3Jlc3VsdC5jYXNlX25hbWUpCisKKyAgZGVmIF9DbGVhblVwT3V0cHV0RmlsZShzZWxmLCBydW5fbGFiZWwsIGNhc2VfbmFtZSk6CisgICAgIiIiUmVtb3ZlcyBvbmUgcHJvZmlsZSBvdXRwdXQgZmlsZS4KKworICAgIElmIHRoZSBvdXRwdXQgZmlsZSBkb2VzIG5vdCBleGlzdCwgZmFpbHMgc2lsZW50bHkuCisKKyAgICBBcmdzOgorICAgICAgcnVuX2xhYmVsOiBTdHJpbmcgdG8gZGlmZmVyZW50aWF0ZSBhIHZlcnNpb24gb2YgdGhlIGNvZGUgaW4gb3V0cHV0CisgICAgICAgICAgZmlsZXMgZnJvbSBvdGhlciB2ZXJzaW9ucy4KKyAgICAgIGNhc2VfbmFtZTogU3RyaW5nIGlkZW50aWZ5aW5nIHRlc3QgY2FzZSBmb3Igd2hpY2ggdG8gcmVtb3ZlIHRoZSBvdXRwdXQKKyAgICAgICAgICBmaWxlLgorICAgICIiIgorICAgIHRyeToKKyAgICAgIG9zLnJlbW92ZShzZWxmLl9HZXRQcm9maWxlRmlsZVBhdGgocnVuX2xhYmVsLCBjYXNlX25hbWUpKQorICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgcGFzcworCisKK2RlZiBtYWluKCk6CisgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnaW5wdXRfcGF0aHMnLCBuYXJncz0nKycsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncGRmIGZpbGVzIG9yIGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3IgcGRmIGZpbGVzICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICd0byBydW4gYXMgdGVzdCBjYXNlcycpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tYnJhbmNoLWJlZm9yZScsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZ2l0IGJyYW5jaCB0byB1c2UgYXMgImJlZm9yZSIgZm9yIGNvbXBhcmlzb24uICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdPbWl0dGluZyB0aGlzIHdpbGwgdXNlIHRoZSBjdXJyZW50IGJyYW5jaCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2l0aG91dCB1bmNvbW1pdHRlZCBjaGFuZ2VzIGFzIHRoZSBiYXNlbGluZS4nKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWJyYW5jaC1hZnRlcicsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZ2l0IGJyYW5jaCB0byB1c2UgYXMgImFmdGVyIiBmb3IgY29tcGFyaXNvbi4gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09taXR0aW5nIHRoaXMgd2lsbCB1c2UgdGhlIGN1cnJlbnQgYnJhbmNoICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aXRoIHVuY29tbWl0dGVkIGNoYW5nZXMuJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1idWlsZC1kaXInLCBkZWZhdWx0PW9zLnBhdGguam9pbignb3V0JywgJ1JlbGVhc2UnKSwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdyZWxhdGl2ZSBwYXRoIGZyb20gdGhlIGJhc2Ugc291cmNlIGRpcmVjdG9yeSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAndG8gdGhlIGJ1aWxkIGRpcmVjdG9yeScpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tYnVpbGQtZGlyLWJlZm9yZScsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0ncmVsYXRpdmUgcGF0aCBmcm9tIHRoZSBiYXNlIHNvdXJjZSBkaXJlY3RvcnkgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RvIHRoZSBidWlsZCBkaXJlY3RvcnkgZm9yIHRoZSAiYmVmb3JlIiBicmFuY2gsIGlmICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaWZmZXJlbnQgZnJvbSB0aGUgYnVpbGQgZGlyZWN0b3J5IGZvciB0aGUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJyJhZnRlciIgYnJhbmNoJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1jYWNoZS1kaXInLCBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nZGlyZWN0b3J5IHdpdGggYSBuZXcgb3IgcHJlZXhpc3RpbmcgY2FjaGUgZm9yICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdkb3dubG9hZHMuIERlZmF1bHQgaXMgdG8gbm90IHVzZSBhIGNhY2hlLicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tdGhpcy1yZXBvJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSd1c2UgdGhlIHJlcG9zaXRvcnkgd2hlcmUgdGhlIHNjcmlwdCBpcyBpbnN0ZWFkIG9mICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdjaGVja2luZyBvdXQgYSB0ZW1wb3Jhcnkgb25lLiBUaGlzIGlzIGZhc3RlciBhbmQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RvZXMgbm90IHJlcXVpcmUgZG93bmxvYWRzLCBidXQgYWx0aG91Z2ggaXQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Jlc3RvcmVzIHRoZSBzdGF0ZSBvZiB0aGUgbG9jYWwgcmVwbywgaWYgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdzY3JpcHQgaXMga2lsbGVkIG9yIGNyYXNoZXMgdGhlIGNoYW5nZXMgY2FuIHJlbWFpbiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3Rhc2hlZCBhbmQgeW91IG1heSBiZSBvbiBhbm90aGVyIGJyYW5jaC4nKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXByb2ZpbGVyJywgZGVmYXVsdD0nY2FsbGdyaW5kJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSd3aGljaCBwcm9maWxlciB0byB1c2UuIFN1cHBvcnRzIGNhbGxncmluZCBhbmQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BlcmZzdGF0IGZvciBub3cuIERlZmF1bHQgaXMgY2FsbGdyaW5kLicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0taW50ZXJlc3Rpbmctc2VjdGlvbicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nd2hldGhlciB0byBtZWFzdXJlIGp1c3QgdGhlIGludGVyZXN0aW5nIHNlY3Rpb24gb3IgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoZSB3aG9sZSB0ZXN0IGhhcm5lc3MuIExpbWl0aW5nIHRvIG9ubHkgdGhlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnRlcmVzdGluZyBzZWN0aW9uIGRvZXMgbm90IHdvcmsgb24gUmVsZWFzZSBzaW5jZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAndGhlIGRlbGltaXRlcnMgYXJlIG9wdGltaXplZCBvdXQnKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW51bS13b3JrZXJzJywgZGVmYXVsdD1tdWx0aXByb2Nlc3NpbmcuY3B1X2NvdW50KCksCisgICAgICAgICAgICAgICAgICAgICAgdHlwZT1pbnQsIGhlbHA9J3J1biBOVU1fV09SS0VSUyBqb2JzIGluIHBhcmFsbGVsJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1vdXRwdXQtZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkaXJlY3RvcnkgdG8gd3JpdGUgdGhlIHByb2ZpbGUgZGF0YSBvdXRwdXQgZmlsZXMnKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXRocmVzaG9sZC1zaWduaWZpY2FudCcsIGRlZmF1bHQ9MC4wMiwgdHlwZT1mbG9hdCwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSd2YXJpYXRpb25zIGluIHBlcmZvcm1hbmNlIGFib3ZlIHRoaXMgZmFjdG9yIGFyZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29uc2lkZXJlZCBzaWduaWZpY2FudCcpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tbWFjaGluZS1yZWFkYWJsZScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nd2hldGhlciB0byBnZXQgb3V0cHV0IGZvciBtYWNoaW5lcy4gSWYgZW5hYmxlZCB0aGUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ291dHB1dCB3aWxsIGJlIGEganNvbiB3aXRoIHRoZSBmb3JtYXQgc3BlY2lmaWVkIGluICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb21wYXJpc29uQ29uY2x1c2lvbnMuR2V0T3V0cHV0RGljdCgpLiBEZWZhdWx0IGlzICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdodW1hbi1yZWFkYWJsZS4nKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWNhc2Utb3JkZXInLCBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nd2hhdCBrZXkgdG8gdXNlIHdoZW4gc29ydGluZyB0ZXN0IGNhc2VzIGluIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3V0cHV0LiBBY2NlcHRlZCB2YWx1ZXMgYXJlICJhZnRlciIsICJiZWZvcmUiLCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnInJhdGlvIiBhbmQgInJhdGluZyIuIERlZmF1bHQgaXMgc29ydGluZyBieSB0ZXN0ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYXNlIHBhdGguJykKKworICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgICMgQWx3YXlzIHN0YXJ0IGF0IHRoZSBwZGZpdW0gc3JjIGRpciwgd2hpY2ggaXMgYXNzdW1lZCB0byBiZSB0d28gbGV2ZWwgYWJvdmUKKyAgIyB0aGlzIHNjcmlwdC4KKyAgcGRmaXVtX3NyY19kaXIgPSBvcy5wYXRoLmpvaW4oCisgICAgICBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLAorICAgICAgb3MucGF0aC5wYXJkaXIsCisgICAgICBvcy5wYXRoLnBhcmRpcikKKyAgb3MuY2hkaXIocGRmaXVtX3NyY19kaXIpCisKKyAgZ2l0ID0gR2l0SGVscGVyKCkKKworICBpZiBhcmdzLmJyYW5jaF9hZnRlciBhbmQgbm90IGFyZ3MuYnJhbmNoX2JlZm9yZToKKyAgICBQcmludEVycignLS1icmFuY2gtYWZ0ZXIgcmVxdWlyZXMgLS1icmFuY2gtYmVmb3JlIHRvIGJlIHNwZWNpZmllZC4nKQorICAgIHJldHVybiAxCisKKyAgaWYgYXJncy5icmFuY2hfYWZ0ZXIgYW5kIG5vdCBnaXQuQnJhbmNoRXhpc3RzKGFyZ3MuYnJhbmNoX2FmdGVyKToKKyAgICBQcmludEVycignQnJhbmNoICIlcyIgZG9lcyBub3QgZXhpc3QnICUgYXJncy5icmFuY2hfYWZ0ZXIpCisgICAgcmV0dXJuIDEKKworICBpZiBhcmdzLmJyYW5jaF9iZWZvcmUgYW5kIG5vdCBnaXQuQnJhbmNoRXhpc3RzKGFyZ3MuYnJhbmNoX2JlZm9yZSk6CisgICAgUHJpbnRFcnIoJ0JyYW5jaCAiJXMiIGRvZXMgbm90IGV4aXN0JyAlIGFyZ3MuYnJhbmNoX2JlZm9yZSkKKyAgICByZXR1cm4gMQorCisgIGlmIGFyZ3Mub3V0cHV0X2RpcjoKKyAgICBhcmdzLm91dHB1dF9kaXIgPSBvcy5wYXRoLmV4cGFuZHVzZXIoYXJncy5vdXRwdXRfZGlyKQorICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGFyZ3Mub3V0cHV0X2Rpcik6CisgICAgICBQcmludEVycignIiVzIiBpcyBub3QgYSBkaXJlY3RvcnknICUgYXJncy5vdXRwdXRfZGlyKQorICAgICAgcmV0dXJuIDEKKworICBpZiBhcmdzLnRocmVzaG9sZF9zaWduaWZpY2FudCA8PSAwLjA6CisgICAgUHJpbnRFcnIoJy0tdGhyZXNob2xkLXNpZ25pZmljYW50IHNob3VsZCByZWNlaXZlIGEgcG9zaXRpdmUgZmxvYXQnKQorICAgIHJldHVybiAxCisKKyAgcnVuID0gQ29tcGFyZVJ1bihhcmdzKQorICByZXR1cm4gcnVuLlJ1bigpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgc3lzLmV4aXQobWFpbigpKQpkaWZmIC0tZ2l0IGEvdGVzdGluZy90b29scy9zYWZldHluZXRfY29uY2x1c2lvbnMucHkgYi90ZXN0aW5nL3Rvb2xzL3NhZmV0eW5ldF9jb25jbHVzaW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGJjMTBkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy90b29scy9zYWZldHluZXRfY29uY2x1c2lvbnMucHkKQEAgLTAsMCArMSwzMDAgQEAKKyMgQ29weXJpZ2h0IDIwMTcgVGhlIFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyIiIkNsYXNzZXMgdGhhdCBkcmF3IGNvbmNsdXNpb25zIG91dCBvZiBhIGNvbXBhcmlzb24gYW5kIHJlcHJlc2VudCB0aGVtLiIiIgorCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBDb3VudGVyCisKKworRk9STUFUX1JFRCA9ICdcMDMzWzAxOzMxbXswfVwwMzNbMDBtJworRk9STUFUX0dSRUVOID0gJ1wwMzNbMDE7MzJtezB9XDAzM1swMG0nCitGT1JNQVRfTUFHRU5UQSA9ICdcMDMzWzAxOzM1bXswfVwwMzNbMDBtJworRk9STUFUX0NZQU4gPSAnXDAzM1swMTszNm17MH1cMDMzWzAwbScKK0ZPUk1BVF9OT1JNQUwgPSAnezB9JworCitSQVRJTkdfRkFJTFVSRSA9ICdmYWlsdXJlJworUkFUSU5HX1JFR1JFU1NJT04gPSAncmVncmVzc2lvbicKK1JBVElOR19JTVBST1ZFTUVOVCA9ICdpbXByb3ZlbWVudCcKK1JBVElOR19OT19DSEFOR0UgPSAnbm9fY2hhbmdlJworUkFUSU5HX1NNQUxMX0NIQU5HRSA9ICdzbWFsbF9jaGFuZ2UnCisKK1JBVElOR1MgPSBbCisgICAgUkFUSU5HX0ZBSUxVUkUsCisgICAgUkFUSU5HX1JFR1JFU1NJT04sCisgICAgUkFUSU5HX0lNUFJPVkVNRU5ULAorICAgIFJBVElOR19OT19DSEFOR0UsCisgICAgUkFUSU5HX1NNQUxMX0NIQU5HRQorXQorCitSQVRJTkdfVE9fQ09MT1IgPSB7CisgICAgUkFUSU5HX0ZBSUxVUkU6IEZPUk1BVF9NQUdFTlRBLAorICAgIFJBVElOR19SRUdSRVNTSU9OOiBGT1JNQVRfUkVELAorICAgIFJBVElOR19JTVBST1ZFTUVOVDogRk9STUFUX0NZQU4sCisgICAgUkFUSU5HX05PX0NIQU5HRTogRk9STUFUX0dSRUVOLAorICAgIFJBVElOR19TTUFMTF9DSEFOR0U6IEZPUk1BVF9OT1JNQUwsCit9CisKKworY2xhc3MgQ29tcGFyaXNvbkNvbmNsdXNpb25zKG9iamVjdCk6CisgICIiIkFsbCBjb25jbHVzaW9ucyBkcmF3biBmcm9tIGEgY29tcGFyaXNvbi4KKworICBUaGlzIGlzIGluaXRpYWxpemVkIGVtcHR5IGFuZCB0aGVuIHByb2Nlc3NlcyBwYWlycyBvZiByZXN1bHRzIGZvciBlYWNoIHRlc3QKKyAgY2FzZSwgZGV0ZXJtaW5pbmcgdGhlIHJhdGluZyBmb3IgdGhhdCBjYXNlLCB3aGljaCBjYW4gYmU6CisgICJmYWlsdXJlIiBpZiBlaXRoZXIgb3IgYm90aCBydW5zIGZvciB0aGUgY2FzZSBmYWlsZWQuCisgICJyZWdyZXNzaW9uIiBpZiB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGluY3JlYXNlIGluIHRpbWUgZm9yIHRoZSB0ZXN0IGNhc2UuCisgICJpbXByb3ZlbWVudCIgaWYgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBkZWNyZWFzZSBpbiB0aW1lIGZvciB0aGUgdGVzdCBjYXNlLgorICAibm9fY2hhbmdlIiBpZiB0aGUgdGltZSBmb3IgdGhlIHRlc3QgY2FzZSBkaWQgbm90IGNoYW5nZSBhdCBhbGwuCisgICJzbWFsbF9jaGFuZ2UiIGlmIHRoZSB0aW1lIGZvciB0aGUgdGVzdCBjYXNlIGNoYW5nZWQgYnV0IHdpdGhpbiB0aGUgdGhyZXNob2xkLgorICAiIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgdGhyZXNob2xkX3NpZ25pZmljYW50KToKKyAgICAiIiJJbml0aWFsaXplcyBhbiBlbXB0eSBDb21wYXJpc29uQ29uY2x1c2lvbnMuCisKKyAgICBBcmdzOgorICAgICAgdGhyZXNob2xkX3NpZ25pZmljYW50OiBGbG9hdCB3aXRoIHRoZSB0b2xlcmFuY2UgYmV5b25kIHdoaWNoIGNoYW5nZXMgaW4KKyAgICAgICAgICBtZWFzdXJlbWVudHMgYXJlIGNvbnNpZGVyZWQgc2lnbmlmaWNhbnQuCisKKyAgICAgICAgICBUaGUgY2hhbmdlIGlzIGNvbnNpZGVyZWQgYXMgYSBtdWx0aXBsaWNhdGlvbiByYXRoZXIgdGhhbiBhbiBhZGRpdGlvbgorICAgICAgICAgIG9mIGEgZnJhY3Rpb24gb2YgdGhlIHByZXZpb3VzIG1lYXN1cmVtZW50LCB0aGF0IGlzLCBhCisgICAgICAgICAgdGhyZXNob2xkX3NpZ25pZmljYW50IG9mIDEuMCB3aWxsIGZsYWcgdGVzdCBjYXNlcyB0aGF0IGJlY2FtZSBvdmVyCisgICAgICAgICAgMTAwJSBzbG93ZXIgKD4gMjAwJSBvZiB0aGUgcHJldmlvdXMgdGltZSBtZWFzdXJlZCkgb3Igb3ZlciAxMDAlIGZhc3RlcgorICAgICAgICAgICg8IDUwJSBvZiB0aGUgcHJldmlvdXMgdGltZSBtZWFzdXJlZCkuCisKKyAgICAgICAgICB0aHJlc2hvbGRfc2lnbmlmaWNhbnQgMC4wMiAtPiA5OC4wNCUgdG8gMTAyJSBpcyBub3Qgc2lnbmlmaWNhbnQKKyAgICAgICAgICB0aHJlc2hvbGRfc2lnbmlmaWNhbnQgMC4xIC0+IDkwLjklIHRvIDExMCUgaXMgbm90IHNpZ25pZmljYW50CisgICAgICAgICAgdGhyZXNob2xkX3NpZ25pZmljYW50IDAuMjUgLT4gODAlIHRvIDEyNSUgaXMgbm90IHNpZ25pZmljYW50CisgICAgICAgICAgdGhyZXNob2xkX3NpZ25pZmljYW50IDEgLT4gNTAlIHRvIDIwMCUgaXMgbm90IHNpZ25pZmljYW50CisgICAgICAgICAgdGhyZXNob2xkX3NpZ25pZmljYW50IDQgLT4gMjAlIHRvIDUwMCUgaXMgbm90IHNpZ25pZmljYW50CisKKyAgICAiIiIKKyAgICBzZWxmLnRocmVzaG9sZF9zaWduaWZpY2FudCA9IHRocmVzaG9sZF9zaWduaWZpY2FudAorICAgIHNlbGYudGhyZXNob2xkX3NpZ25pZmljYW50X25lZ2F0aXZlID0gKDEgLyAoMSArIHRocmVzaG9sZF9zaWduaWZpY2FudCkpIC0gMQorCisgICAgc2VsZi5wYXJhbXMgPSB7J3RocmVzaG9sZCc6IHRocmVzaG9sZF9zaWduaWZpY2FudH0KKyAgICBzZWxmLnN1bW1hcnkgPSBDb21wYXJpc29uU3VtbWFyeSgpCisgICAgc2VsZi5jYXNlX3Jlc3VsdHMgPSB7fQorCisgIGRlZiBQcm9jZXNzQ2FzZShzZWxmLCBjYXNlX25hbWUsIGJlZm9yZSwgYWZ0ZXIpOgorICAgICIiIkZlZWRzIGEgdGVzdCBjYXNlIHJlc3VsdHMgdG8gdGhlIENvbXBhcmlzb25Db25jbHVzaW9ucy4KKworICAgIEFyZ3M6CisgICAgICBjYXNlX25hbWU6IFN0cmluZyBpZGVudGlmeWluZyB0aGUgY2FzZS4KKyAgICAgIGJlZm9yZTogTWVhc3VyZW1lbnQgZm9yIHRoZSAiYmVmb3JlIiB2ZXJzaW9uIG9mIHRoZSBjb2RlLgorICAgICAgYWZ0ZXI6IE1lYXN1cmVtZW50IGZvciB0aGUgImFmdGVyIiB2ZXJzaW9uIG9mIHRoZSBjb2RlLgorICAgICIiIgorCisgICAgIyBTd2l0Y2ggMCB0byBOb25lIHRvIHNpbXBsaWZ5IHRoZSBqc29uIGRpY3Qgb3V0cHV0LiBBbGwgemVyb3MgYXJlCisgICAgIyBjb25zaWRlcmVkIGZhaWxlZCBydW5zLCBzbyB0aGV5IHdpbGwgYmUgcmVwcmVzZW50ZWQgYnkgIm51bGwiLgorICAgIGlmIG5vdCBiZWZvcmU6CisgICAgICBiZWZvcmUgPSBOb25lCisgICAgaWYgbm90IGFmdGVyOgorICAgICAgYWZ0ZXIgPSBOb25lCisKKyAgICBpZiBub3QgYmVmb3JlIG9yIG5vdCBhZnRlcjoKKyAgICAgIHJhdGlvID0gTm9uZQorICAgICAgcmF0aW5nID0gUkFUSU5HX0ZBSUxVUkUKKyAgICBlbHNlOgorICAgICAgcmF0aW8gPSAoZmxvYXQoYWZ0ZXIpIC8gYmVmb3JlKSAtIDEuMAorICAgICAgaWYgcmF0aW8gPiBzZWxmLnRocmVzaG9sZF9zaWduaWZpY2FudDoKKyAgICAgICAgcmF0aW5nID0gUkFUSU5HX1JFR1JFU1NJT04KKyAgICAgIGVsaWYgcmF0aW8gPCBzZWxmLnRocmVzaG9sZF9zaWduaWZpY2FudF9uZWdhdGl2ZToKKyAgICAgICAgcmF0aW5nID0gUkFUSU5HX0lNUFJPVkVNRU5UCisgICAgICBlbGlmIHJhdGlvID09IDA6CisgICAgICAgIHJhdGluZyA9IFJBVElOR19OT19DSEFOR0UKKyAgICAgIGVsc2U6CisgICAgICAgIHJhdGluZyA9IFJBVElOR19TTUFMTF9DSEFOR0UKKworICAgIGNhc2VfcmVzdWx0ID0gQ2FzZVJlc3VsdChjYXNlX25hbWUsIGJlZm9yZSwgYWZ0ZXIsIHJhdGlvLCByYXRpbmcpCisKKyAgICBzZWxmLnN1bW1hcnkuUHJvY2Vzc0Nhc2VSZXN1bHQoY2FzZV9yZXN1bHQpCisgICAgc2VsZi5jYXNlX3Jlc3VsdHNbY2FzZV9uYW1lXSA9IGNhc2VfcmVzdWx0CisKKyAgZGVmIEdldFN1bW1hcnkoc2VsZik6CisgICAgIiIiR2V0cyB0aGUgQ29tcGFyaXNvblN1bW1hcnkgd2l0aCBjb25zb2xpZGF0ZWQgdG90YWxzLiIiIgorICAgIHJldHVybiBzZWxmLnN1bW1hcnkKKworICBkZWYgR2V0Q2FzZVJlc3VsdHMoc2VsZik6CisgICAgIiIiR2V0cyBhIGRpY3QgbWFwcGluZyBlYWNoIHRlc3QgY2FzZSBpZGVudGlmaWVyIHRvIGl0cyBDYXNlUmVzdWx0LiIiIgorICAgIHJldHVybiBzZWxmLmNhc2VfcmVzdWx0cworCisgIGRlZiBHZXRPdXRwdXREaWN0KHNlbGYpOgorICAgICIiIlJldHVybnMgYSBjb25jbHVzaW9ucyBkaWN0IHdpdGggYWxsIHRoZSBjb25jbHVzaW9ucyBkcmF3bi4KKworICAgIFJldHVybnM6CisgICAgICBBIHNlcmlhbGl6YWJsZSBkaWN0IHdpdGggdGhlIGZvcm1hdCBpbGx1c3RyYXRlZCBiZWxvdzoKKyAgICAgIHsKKyAgICAgICAgInZlcnNpb24iOiAxLAorICAgICAgICAicGFyYW1zIjogeworICAgICAgICAgICJ0aHJlc2hvbGQiOiAwLjAyCisgICAgICAgIH0sCisgICAgICAgICJzdW1tYXJ5IjogeworICAgICAgICAgICJ0b3RhbCI6IDEyMywKKyAgICAgICAgICAiZmFpbHVyZSI6IDEsCisgICAgICAgICAgInJlZ3Jlc3Npb24iOiAyLAorICAgICAgICAgICJpbXByb3ZlbWVudCI6IDEsCisgICAgICAgICAgIm5vX2NoYW5nZSI6IDEwMCwKKyAgICAgICAgICAic21hbGxfY2hhbmdlIjogMTkKKyAgICAgICAgfSwKKyAgICAgICAgImNvbXBhcmlzb25fYnlfY2FzZSI6IHsKKyAgICAgICAgICAidGVzdGluZy9yZXNvdXJjZXMvbmV3X3Rlc3QucGRmIjogeworICAgICAgICAgICAgImJlZm9yZSI6IE5vbmUsCisgICAgICAgICAgICAiYWZ0ZXIiOiAxMDAwLAorICAgICAgICAgICAgInJhdGlvIjogTm9uZSwKKyAgICAgICAgICAgICJyYXRpbmciOiAiZmFpbHVyZSIKKyAgICAgICAgICB9LAorICAgICAgICAgICJ0ZXN0aW5nL3Jlc291cmNlcy90ZXN0MS5wZGYiOiB7CisgICAgICAgICAgICAiYmVmb3JlIjogMTAwLAorICAgICAgICAgICAgImFmdGVyIjogMTIwLAorICAgICAgICAgICAgInJhdGlvIjogMC4yLAorICAgICAgICAgICAgInJhdGluZyI6ICJyZWdyZXNzaW9uIgorICAgICAgICAgIH0sCisgICAgICAgICAgInRlc3RpbmcvcmVzb3VyY2VzL3Rlc3QyLnBkZiI6IHsKKyAgICAgICAgICAgICJiZWZvcmUiOiAxMDAsCisgICAgICAgICAgICAiYWZ0ZXIiOiAyMDAwLAorICAgICAgICAgICAgInJhdGlvIjogMTkuMCwKKyAgICAgICAgICAgICJyYXRpbmciOiAicmVncmVzc2lvbiIKKyAgICAgICAgICB9LAorICAgICAgICAgICJ0ZXN0aW5nL3Jlc291cmNlcy90ZXN0My5wZGYiOiB7CisgICAgICAgICAgICAiYmVmb3JlIjogMTAwMCwKKyAgICAgICAgICAgICJhZnRlciI6IDEwMDUsCisgICAgICAgICAgICAicmF0aW8iOiAwLjAwNSwKKyAgICAgICAgICAgICJyYXRpbmciOiAic21hbGxfY2hhbmdlIgorICAgICAgICAgIH0sCisgICAgICAgICAgInRlc3RpbmcvcmVzb3VyY2VzL3Rlc3Q0LnBkZiI6IHsKKyAgICAgICAgICAgICJiZWZvcmUiOiAxMDAwLAorICAgICAgICAgICAgImFmdGVyIjogMTAwMCwKKyAgICAgICAgICAgICJyYXRpbyI6IDAuMCwKKyAgICAgICAgICAgICJyYXRpbmciOiAibm9fY2hhbmdlIgorICAgICAgICAgIH0sCisgICAgICAgICAgInRlc3RpbmcvcmVzb3VyY2VzL3Rlc3Q1LnBkZiI6IHsKKyAgICAgICAgICAgICJiZWZvcmUiOiAxMDAwLAorICAgICAgICAgICAgImFmdGVyIjogNjAwLAorICAgICAgICAgICAgInJhdGlvIjogLTAuNCwKKyAgICAgICAgICAgICJyYXRpbmciOiAiaW1wcm92ZW1lbnQiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgIiIiCisgICAgb3V0cHV0X2RpY3QgPSB7fQorICAgIG91dHB1dF9kaWN0Wyd2ZXJzaW9uJ10gPSAxCisgICAgb3V0cHV0X2RpY3RbJ3BhcmFtcyddID0geyd0aHJlc2hvbGQnOiBzZWxmLnRocmVzaG9sZF9zaWduaWZpY2FudH0KKyAgICBvdXRwdXRfZGljdFsnc3VtbWFyeSddID0gc2VsZi5zdW1tYXJ5LkdldE91dHB1dERpY3QoKQorICAgIG91dHB1dF9kaWN0Wydjb21wYXJpc29uX2J5X2Nhc2UnXSA9IHsKKyAgICAgICAgY3IuY2FzZV9uYW1lLmRlY29kZSgndXRmLTgnKTogY3IuR2V0T3V0cHV0RGljdCgpCisgICAgICAgIGZvciBjciBpbiBzZWxmLkdldENhc2VSZXN1bHRzKCkudmFsdWVzKCkKKyAgICB9CisgICAgcmV0dXJuIG91dHB1dF9kaWN0CisKKworY2xhc3MgQ29tcGFyaXNvblN1bW1hcnkob2JqZWN0KToKKyAgIiIiVG90YWxzIGNvbXB1dGVkIGZvciBhIGNvbXBhcmlzb24uIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgIHNlbGYucmF0aW5nX2NvdW50ZXIgPSBDb3VudGVyKCkKKworICBkZWYgUHJvY2Vzc0Nhc2VSZXN1bHQoc2VsZiwgY2FzZV9yZXN1bHQpOgorICAgIHNlbGYucmF0aW5nX2NvdW50ZXJbY2FzZV9yZXN1bHQucmF0aW5nXSArPSAxCisKKyAgZGVmIEdldFRvdGFsKHNlbGYpOgorICAgICIiIkdldHMgdGhlIG51bWJlciBvZiB0ZXN0IGNhc2VzIHByb2Nlc3NlZC4iIiIKKyAgICByZXR1cm4gc3VtKHNlbGYucmF0aW5nX2NvdW50ZXIudmFsdWVzKCkpCisKKyAgZGVmIEdldENvdW50KHNlbGYsIHJhdGluZyk6CisgICAgIiIiR2V0cyB0aGUgbnVtYmVyIG9mIHRlc3QgY2FzZXMgcHJvY2Vzc2VkIHdpdGggYSBnaXZlbiByYXRpbmcuIiIiCisgICAgcmV0dXJuIHNlbGYucmF0aW5nX2NvdW50ZXJbcmF0aW5nXQorCisgIGRlZiBHZXRPdXRwdXREaWN0KHNlbGYpOgorICAgICIiIlJldHVybnMgYSBkaWN0IHRoYXQgY2FuIGJlIHNlcmlhbGl6ZWQgd2l0aCBhbGwgdGhlIHRvdGFscy4iIiIKKyAgICByZXN1bHQgPSB7J3RvdGFsJzogc2VsZi5HZXRUb3RhbCgpfQorICAgIGZvciByYXRpbmcgaW4gUkFUSU5HUzoKKyAgICAgIHJlc3VsdFtyYXRpbmddID0gc2VsZi5HZXRDb3VudChyYXRpbmcpCisgICAgcmV0dXJuIHJlc3VsdAorCisKK2NsYXNzIENhc2VSZXN1bHQob2JqZWN0KToKKyAgIiIiVGhlIGNvbmNsdXNpb24gZm9yIHRoZSBjb21wYXJpc29uIG9mIGEgc2luZ2xlIHRlc3QgY2FzZS4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgY2FzZV9uYW1lLCBiZWZvcmUsIGFmdGVyLCByYXRpbywgcmF0aW5nKToKKyAgICAiIiJJbml0aWFsaXplcyBhbiBlbXB0eSBDb21wYXJpc29uQ29uY2x1c2lvbnMuCisKKyAgICBBcmdzOgorICAgICAgY2FzZV9uYW1lOiBTdHJpbmcgaWRlbnRpZnlpbmcgdGhlIGNhc2UuCisgICAgICBiZWZvcmU6IE1lYXN1cmVtZW50IGZvciB0aGUgImJlZm9yZSIgdmVyc2lvbiBvZiB0aGUgY29kZS4KKyAgICAgIGFmdGVyOiBNZWFzdXJlbWVudCBmb3IgdGhlICJhZnRlciIgdmVyc2lvbiBvZiB0aGUgY29kZS4KKyAgICAgIHJhdGlvOiBEaWZmZXJlbmNlIGJldHdlZW4gfGFmdGVyfCBhbmQgfGJlZm9yZXwgYXMgYSBmcmFjdGlvbiBvZiB8YmVmb3JlfC4KKyAgICAgIHJhdGluZzogUmF0aW5nIGZvciB0aGlzIHRlc3QgY2FzZS4KKyAgICAiIiIKKyAgICBzZWxmLmNhc2VfbmFtZSA9IGNhc2VfbmFtZQorICAgIHNlbGYuYmVmb3JlID0gYmVmb3JlCisgICAgc2VsZi5hZnRlciA9IGFmdGVyCisgICAgc2VsZi5yYXRpbyA9IHJhdGlvCisgICAgc2VsZi5yYXRpbmcgPSByYXRpbmcKKworICBkZWYgR2V0T3V0cHV0RGljdChzZWxmKToKKyAgICAiIiJSZXR1cm5zIGEgZGljdCB3aXRoIHRoZSB0ZXN0IGNhc2UncyBjb25jbHVzaW9ucy4iIiIKKyAgICByZXR1cm4geydiZWZvcmUnOiBzZWxmLmJlZm9yZSwKKyAgICAgICAgICAgICdhZnRlcic6IHNlbGYuYWZ0ZXIsCisgICAgICAgICAgICAncmF0aW8nOiBzZWxmLnJhdGlvLAorICAgICAgICAgICAgJ3JhdGluZyc6IHNlbGYucmF0aW5nfQorCisKK2RlZiBQcmludENvbmNsdXNpb25zRGljdEh1bWFuUmVhZGFibGUoY29uY2x1c2lvbnNfZGljdCwgY29sb3JlZCwga2V5PU5vbmUpOgorICAiIiJQcmludHMgYSBjb25jbHVzaW9ucyBkaWN0IGluIGEgaHVtYW4tcmVhZGFibGUgd2F5LgorCisgIEFyZ3M6CisgICAgY29uY2x1c2lvbnNfZGljdDogRGljdCB0byBwcmludC4KKyAgICBjb2xvcmVkOiBXaGV0aGVyIHRvIGNvbG9yIHRoZSBvdXRwdXQgdG8gaGlnaGxpZ2h0IHNpZ25pZmljYW50IGNoYW5nZXMuCisgICAga2V5OiBTdHJpbmcgd2l0aCB0aGUgQ2FzZVJlc3VsdCBkaWN0aW9uYXJ5IGtleSB0byBzb3J0IHRoZSBjYXNlcy4KKyAgIiIiCisgICMgUHJpbnQgaGVhZGVyCisgIHByaW50ICc9JyAqIDgwCisgIHByaW50ICd7MDo+MTFzfSB7MTo+MTVzfSAgezJ9JyAuZm9ybWF0KAorICAgICAgJyUgQ2hhbmdlJywKKyAgICAgICdUaW1lIGFmdGVyJywKKyAgICAgICdUZXN0IGNhc2UnKQorICBwcmludCAnLScgKiA4MAorCisgIGNvbG9yID0gRk9STUFUX05PUk1BTAorCisgICMgUHJpbnQgY2FzZXMKKyAgaWYga2V5IGlzIG5vdCBOb25lOgorICAgIGNhc2VfcGFpcnMgPSBzb3J0ZWQoY29uY2x1c2lvbnNfZGljdFsnY29tcGFyaXNvbl9ieV9jYXNlJ10uaXRlcml0ZW1zKCksCisgICAgICAgICAgICAgICAgICAgICAgICBrZXk9bGFtYmRhIGt2OiBrdlsxXVtrZXldKQorICBlbHNlOgorICAgIGNhc2VfcGFpcnMgPSBzb3J0ZWQoY29uY2x1c2lvbnNfZGljdFsnY29tcGFyaXNvbl9ieV9jYXNlJ10uaXRlcml0ZW1zKCkpCisKKyAgZm9yIGNhc2VfbmFtZSwgY2FzZV9kaWN0IGluIGNhc2VfcGFpcnM6CisgICAgaWYgY29sb3JlZDoKKyAgICAgIGNvbG9yID0gUkFUSU5HX1RPX0NPTE9SW2Nhc2VfZGljdFsncmF0aW5nJ11dCisKKyAgICBpZiBjYXNlX2RpY3RbJ3JhdGluZyddID09IFJBVElOR19GQUlMVVJFOgorICAgICAgcHJpbnQgdSd7fSB0byBtZWFzdXJlIHRpbWUgZm9yIHt9Jy5mb3JtYXQoCisgICAgICAgICAgY29sb3IuZm9ybWF0KCdGYWlsZWQnKSwKKyAgICAgICAgICBjYXNlX25hbWUpLmVuY29kZSgndXRmLTgnKQorICAgICAgY29udGludWUKKworICAgIHByaW50IHUnezB9IHsxOjE1LGR9ICB7Mn0nIC5mb3JtYXQoCisgICAgICAgIGNvbG9yLmZvcm1hdCgnezorMTEuNCV9Jy5mb3JtYXQoY2FzZV9kaWN0WydyYXRpbyddKSksCisgICAgICAgIGNhc2VfZGljdFsnYWZ0ZXInXSwKKyAgICAgICAgY2FzZV9uYW1lKS5lbmNvZGUoJ3V0Zi04JykKKworICAjIFByaW50IHRvdGFscworICB0b3RhbHMgPSBjb25jbHVzaW9uc19kaWN0WydzdW1tYXJ5J10KKyAgcHJpbnQgJz0nICogODAKKyAgcHJpbnQgJ1Rlc3QgY2FzZXMgcnVuOiAlZCcgJSB0b3RhbHNbJ3RvdGFsJ10KKworICBpZiBjb2xvcmVkOgorICAgIGNvbG9yID0gRk9STUFUX01BR0VOVEEgaWYgdG90YWxzW1JBVElOR19GQUlMVVJFXSBlbHNlIEZPUk1BVF9HUkVFTgorICBwcmludCAoJ0ZhaWxlZCB0byBtZWFzdXJlOiAlcycKKyAgICAgICAgICUgY29sb3IuZm9ybWF0KHRvdGFsc1tSQVRJTkdfRkFJTFVSRV0pKQorCisgIGlmIGNvbG9yZWQ6CisgICAgY29sb3IgPSBGT1JNQVRfUkVEIGlmIHRvdGFsc1tSQVRJTkdfUkVHUkVTU0lPTl0gZWxzZSBGT1JNQVRfR1JFRU4KKyAgcHJpbnQgKCdSZWdyZXNzaW9uczogJXMnCisgICAgICAgICAlIGNvbG9yLmZvcm1hdCh0b3RhbHNbUkFUSU5HX1JFR1JFU1NJT05dKSkKKworICBpZiBjb2xvcmVkOgorICAgIGNvbG9yID0gRk9STUFUX0NZQU4gaWYgdG90YWxzW1JBVElOR19JTVBST1ZFTUVOVF0gZWxzZSBGT1JNQVRfR1JFRU4KKyAgcHJpbnQgKCdJbXByb3ZlbWVudHM6ICVzJworICAgICAgICAgJSBjb2xvci5mb3JtYXQodG90YWxzW1JBVElOR19JTVBST1ZFTUVOVF0pKQpkaWZmIC0tZ2l0IGEvdGVzdGluZy90b29scy9zYWZldHluZXRfam9iLnB5IGIvdGVzdGluZy90b29scy9zYWZldHluZXRfam9iLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc0MTY1MzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Rvb2xzL3NhZmV0eW5ldF9qb2IucHkKQEAgLTAsMCArMSwyMzcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgMjAxNyBUaGUgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKyMgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworIiIiTG9va3MgZm9yIHBlcmZvcm1hbmNlIHJlZ3Jlc3Npb25zIG9uIGFsbCBwdXNoZXMgc2luY2UgdGhlIGxhc3QgcnVuLgorCitSdW4gdGhpcyBuaWdodGx5IHRvIGhhdmUgYSBwZXJpb2RpY2FsIGNoZWNrIGZvciBwZXJmb3JtYW5jZSByZWdyZXNzaW9ucy4KKworU3RvcmVzIHRoZSByZXN1bHRzIGZvciBlYWNoIHJ1biBhbmQgbGFzdCBjaGVja3BvaW50IGluIGEgcmVzdWx0cyBkaXJlY3RvcnkuCisiIiIKKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCBqc29uCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworZnJvbSBjb21tb24gaW1wb3J0IFByaW50V2l0aFRpbWUKK2Zyb20gY29tbW9uIGltcG9ydCBSdW5Db21tYW5kUHJvcGFnYXRlRXJyCitmcm9tIGdpdGhlbHBlciBpbXBvcnQgR2l0SGVscGVyCitmcm9tIHNhZmV0eW5ldF9jb25jbHVzaW9ucyBpbXBvcnQgUHJpbnRDb25jbHVzaW9uc0RpY3RIdW1hblJlYWRhYmxlCisKKworY2xhc3MgSm9iQ29udGV4dChvYmplY3QpOgorICAiIiJDb250ZXh0IGZvciBhIHNpbmdsZSBydW4sIGluY2x1ZGluZyBuYW1lIGFuZCBkaXJlY3RvcnkgcGF0aHMuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZ3MpOgorICAgIHNlbGYuZGF0ZXRpbWUgPSBkYXRldGltZS5kYXRldGltZS5ub3coKS5zdHJmdGltZSgnJVktJW0tJWQtJUgtJU0tJVMnKQorICAgIHNlbGYucmVzdWx0c19kaXIgPSBhcmdzLnJlc3VsdHNfZGlyCisgICAgc2VsZi5sYXN0X3JldmlzaW9uX2NvdmVyZWRfZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLnJlc3VsdHNfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xhc3RfcmV2aXNpb25fY292ZXJlZCcpCisgICAgc2VsZi5ydW5fb3V0cHV0X2RpciA9IG9zLnBhdGguam9pbihzZWxmLnJlc3VsdHNfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb2ZpbGVzXyVzJyAlIHNlbGYuZGF0ZXRpbWUpCisgICAgc2VsZi5ydW5fb3V0cHV0X2xvZ19maWxlID0gb3MucGF0aC5qb2luKHNlbGYucmVzdWx0c19kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclcy5sb2cnICUgc2VsZi5kYXRldGltZSkKKworCitjbGFzcyBKb2JSdW4ob2JqZWN0KToKKyAgIiIiQSBzaW5nbGUgcnVuIGxvb2tpbmcgZm9yIHJlZ3Jlc3Npb25zIHNpbmNlIHRoZSBsYXN0IG9uZS4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgYXJncywgY29udGV4dCk6CisgICAgIiIiQ29uc3RydWN0b3IuCisKKyAgICBBcmdzOgorICAgICAgYXJnczogTmFtZXNwYWNlIHdpdGggYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgc2NyaXB0LgorICAgICAgY29udGV4dDogSm9iQ29udGV4dCBmb3IgdGhpcyBydW4uCisgICAgIiIiCisgICAgc2VsZi5naXQgPSBHaXRIZWxwZXIoKQorICAgIHNlbGYuYXJncyA9IGFyZ3MKKyAgICBzZWxmLmNvbnRleHQgPSBjb250ZXh0CisKKyAgZGVmIFJ1bihzZWxmKToKKyAgICAiIiJTZWFyY2hlcyBmb3IgcmVncmVzc2lvbnMuCisKKyAgICBXaWxsIG9ubHkgd3JpdGUgYSBjaGVja3BvaW50IHdoZW4gZmlyc3QgcnVuLCBhbmQgb24gYWxsIHN1YnNlcXVlbnQgcnVucworICAgIGEgY29tcGFyaXNvbiBpcyBkb25lIGFnYWluc3QgdGhlIGxhc3QgY2hlY2twb2ludC4KKworICAgIFJldHVybnM6CisgICAgICBFeGl0IGNvZGUgZm9yIHRoZSBzY3JpcHQ6IDAgaWYgbm8gc2lnbmlmaWNhbnQgY2hhbmdlcyBhcmUgZm91bmQ7IDEgaWYKKyAgICAgIHRoZXJlIHdhcyBhbiBlcnJvciBpbiB0aGUgY29tcGFyaXNvbjsgMyBpZiB0aGVyZSB3YXMgYSByZWdyZXNzaW9uOyA0IGlmCisgICAgICB0aGVyZSB3YXMgYW4gaW1wcm92ZW1lbnQgYW5kIG5vIHJlZ3Jlc3Npb24uCisgICAgIiIiCisgICAgcGRmaXVtX3NyY19kaXIgPSBvcy5wYXRoLmpvaW4oCisgICAgICAgIG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksCisgICAgICAgIG9zLnBhdGgucGFyZGlyLAorICAgICAgICBvcy5wYXRoLnBhcmRpcikKKyAgICBvcy5jaGRpcihwZGZpdW1fc3JjX2RpcikKKworICAgIGlmIG5vdCBzZWxmLmdpdC5Jc0N1cnJlbnRCcmFuY2hDbGVhbigpIGFuZCBub3Qgc2VsZi5hcmdzLm5vX2NoZWNrb3V0OgorICAgICAgUHJpbnRXaXRoVGltZSgnQ3VycmVudCBicmFuY2ggaXMgbm90IGNsZWFuLCBhYm9ydGluZycpCisgICAgICByZXR1cm4gMQorCisgICAgYnJhbmNoX3RvX3Jlc3RvcmUgPSBzZWxmLmdpdC5HZXRDdXJyZW50QnJhbmNoTmFtZSgpCisKKyAgICBpZiBub3Qgc2VsZi5hcmdzLm5vX2NoZWNrb3V0OgorICAgICAgc2VsZi5naXQuRmV0Y2hPcmlnaW5NYXN0ZXIoKQorICAgICAgc2VsZi5naXQuQ2hlY2tvdXQoJ29yaWdpbi9tYXN0ZXInKQorCisgICAgIyBNYWtlIHN1cmUgcmVzdWx0cyBkaXIgZXhpc3RzCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuY29udGV4dC5yZXN1bHRzX2Rpcik6CisgICAgICBvcy5tYWtlZGlycyhzZWxmLmNvbnRleHQucmVzdWx0c19kaXIpCisKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5jb250ZXh0Lmxhc3RfcmV2aXNpb25fY292ZXJlZF9maWxlKToKKyAgICAgIHJlc3VsdCA9IHNlbGYuX0luaXRpYWxSdW4oKQorICAgIGVsc2U6CisgICAgICB3aXRoIG9wZW4oc2VsZi5jb250ZXh0Lmxhc3RfcmV2aXNpb25fY292ZXJlZF9maWxlKSBhcyBmOgorICAgICAgICBsYXN0X3JldmlzaW9uX2NvdmVyZWQgPSBmLnJlYWQoKS5zdHJpcCgpCisgICAgICByZXN1bHQgPSBzZWxmLl9JbmNyZW1lbnRhbFJ1bihsYXN0X3JldmlzaW9uX2NvdmVyZWQpCisKKyAgICBzZWxmLmdpdC5DaGVja291dChicmFuY2hfdG9fcmVzdG9yZSkKKyAgICByZXR1cm4gcmVzdWx0CisKKyAgZGVmIF9Jbml0aWFsUnVuKHNlbGYpOgorICAgICIiIkluaXRpYWwgcnVuLCBqdXN0IHdyaXRlIGEgY2hlY2twb2ludC4KKworICAgIFJldHVybnM6CisgICAgICBFeGl0IGNvZGUgZm9yIHRoZSBzY3JpcHQuCisgICAgIiIiCisgICAgY3VycmVudCA9IHNlbGYuZ2l0LkdldEN1cnJlbnRCcmFuY2hIYXNoKCkKKworICAgIFByaW50V2l0aFRpbWUoJ0luaXRpYWwgcnVuLCBjdXJyZW50IGlzICVzJyAlIGN1cnJlbnQpCisKKyAgICBzZWxmLl9Xcml0ZUNoZWNrcG9pbnQoY3VycmVudCkKKworICAgIFByaW50V2l0aFRpbWUoJ0FsbCBzZXQgdXAsIG5leHQgcnVucyB3aWxsIGJlIGluY3JlbWVudGFsIGFuZCBwZXJmb3JtICcKKyAgICAgICAgICAgICAgICAgICdjb21wYXJpc29ucycpCisgICAgcmV0dXJuIDAKKworICBkZWYgX0luY3JlbWVudGFsUnVuKHNlbGYsIGxhc3RfcmV2aXNpb25fY292ZXJlZCk6CisgICAgIiIiSW5jcmVtZW50YWwgcnVuLCBjb21wYXJlIGFnYWluc3QgbGFzdCBjaGVja3BvaW50IGFuZCB1cGRhdGUgaXQuCisKKyAgICBBcmdzOgorICAgICAgbGFzdF9yZXZpc2lvbl9jb3ZlcmVkOiBTdHJpbmcgd2l0aCBoYXNoIGZvciBsYXN0IGNoZWNrcG9pbnQuCisKKyAgICBSZXR1cm5zOgorICAgICAgRXhpdCBjb2RlIGZvciB0aGUgc2NyaXB0LgorICAgICIiIgorICAgIGN1cnJlbnQgPSBzZWxmLmdpdC5HZXRDdXJyZW50QnJhbmNoSGFzaCgpCisKKyAgICBQcmludFdpdGhUaW1lKCdJbmNyZW1lbnRhbCBydW4sIGN1cnJlbnQgaXMgJXMsIGxhc3QgaXMgJXMnCisgICAgICAgICAgICAgICAgICAlIChjdXJyZW50LCBsYXN0X3JldmlzaW9uX2NvdmVyZWQpKQorCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuY29udGV4dC5ydW5fb3V0cHV0X2Rpcik6CisgICAgICBvcy5tYWtlZGlycyhzZWxmLmNvbnRleHQucnVuX291dHB1dF9kaXIpCisKKyAgICBpZiBjdXJyZW50ID09IGxhc3RfcmV2aXNpb25fY292ZXJlZDoKKyAgICAgIFByaW50V2l0aFRpbWUoJ05vIGNoYW5nZXMgc2VlbiwgZmluaXNoaW5nIGpvYicpCisgICAgICBvdXRwdXRfaW5mbyA9IHsKKyAgICAgICAgICAnbWV0YWRhdGEnOiBzZWxmLl9CdWlsZFJ1bk1ldGFkYXRhKGxhc3RfcmV2aXNpb25fY292ZXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWxzZSl9CisgICAgICBzZWxmLl9Xcml0ZVJhd0pzb24ob3V0cHV0X2luZm8pCisgICAgICByZXR1cm4gMAorCisgICAgIyBSdW4gY29tcGFyZQorICAgIGNtZCA9IFsndGVzdGluZy90b29scy9zYWZldHluZXRfY29tcGFyZS5weScsCisgICAgICAgICAgICctLXRoaXMtcmVwbycsCisgICAgICAgICAgICctLW1hY2hpbmUtcmVhZGFibGUnLAorICAgICAgICAgICAnLS1icmFuY2gtYmVmb3JlPSVzJyAlIGxhc3RfcmV2aXNpb25fY292ZXJlZCwKKyAgICAgICAgICAgJy0tb3V0cHV0LWRpcj0lcycgJSBzZWxmLmNvbnRleHQucnVuX291dHB1dF9kaXJdCisgICAgY21kLmV4dGVuZChzZWxmLmFyZ3MuaW5wdXRfcGF0aHMpCisKKyAgICBqc29uX291dHB1dCA9IFJ1bkNvbW1hbmRQcm9wYWdhdGVFcnIoY21kKQorCisgICAgaWYganNvbl9vdXRwdXQgaXMgTm9uZToKKyAgICAgIHJldHVybiAxCisKKyAgICBvdXRwdXRfaW5mbyA9IGpzb24ubG9hZHMoanNvbl9vdXRwdXQpCisKKyAgICBydW5fbWV0YWRhdGEgPSBzZWxmLl9CdWlsZFJ1bk1ldGFkYXRhKGxhc3RfcmV2aXNpb25fY292ZXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlKQorICAgIG91dHB1dF9pbmZvLnNldGRlZmF1bHQoJ21ldGFkYXRhJywge30pLnVwZGF0ZShydW5fbWV0YWRhdGEpCisgICAgc2VsZi5fV3JpdGVSYXdKc29uKG91dHB1dF9pbmZvKQorCisgICAgUHJpbnRDb25jbHVzaW9uc0RpY3RIdW1hblJlYWRhYmxlKG91dHB1dF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcmVkPShub3Qgc2VsZi5hcmdzLm91dHB1dF90b19sb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBzZWxmLmFyZ3Mubm9fY29sb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9J2FmdGVyJykKKworICAgIHN0YXR1cyA9IDAKKworICAgIGlmIG91dHB1dF9pbmZvWydzdW1tYXJ5J11bJ2ltcHJvdmVtZW50J106CisgICAgICBQcmludFdpdGhUaW1lKCdJbXByb3ZlbWVudCBkZXRlY3RlZC4nKQorICAgICAgc3RhdHVzID0gNAorCisgICAgaWYgb3V0cHV0X2luZm9bJ3N1bW1hcnknXVsncmVncmVzc2lvbiddOgorICAgICAgUHJpbnRXaXRoVGltZSgnUmVncmVzc2lvbiBkZXRlY3RlZC4nKQorICAgICAgc3RhdHVzID0gMworCisgICAgaWYgc3RhdHVzID09IDA6CisgICAgICBQcmludFdpdGhUaW1lKCdOb3RoaW5nIGRldGVjdGVkLicpCisKKyAgICBzZWxmLl9Xcml0ZUNoZWNrcG9pbnQoY3VycmVudCkKKworICAgIHJldHVybiBzdGF0dXMKKworICBkZWYgX1dyaXRlUmF3SnNvbihzZWxmLCBvdXRwdXRfaW5mbyk6CisgICAganNvbl9vdXRwdXRfZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLmNvbnRleHQucnVuX291dHB1dF9kaXIsICdyYXcuanNvbicpCisgICAgd2l0aCBvcGVuKGpzb25fb3V0cHV0X2ZpbGUsICd3JykgYXMgZjoKKyAgICAgIGpzb24uZHVtcChvdXRwdXRfaW5mbywgZikKKworICBkZWYgX0J1aWxkUnVuTWV0YWRhdGEoc2VsZiwgcmV2aXNpb25fYmVmb3JlLCByZXZpc2lvbl9hZnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmlzb25fcGVyZm9ybWVkKToKKyAgICByZXR1cm4geworICAgICAgICAnZGF0ZXRpbWUnOiBzZWxmLmNvbnRleHQuZGF0ZXRpbWUsCisgICAgICAgICdyZXZpc2lvbl9iZWZvcmUnOiByZXZpc2lvbl9iZWZvcmUsCisgICAgICAgICdyZXZpc2lvbl9hZnRlcic6IHJldmlzaW9uX2FmdGVyLAorICAgICAgICAnY29tcGFyaXNvbl9wZXJmb3JtZWQnOiBjb21wYXJpc29uX3BlcmZvcm1lZCwKKyAgICB9CisKKyAgZGVmIF9Xcml0ZUNoZWNrcG9pbnQoc2VsZiwgY2hlY2twb2ludCk6CisgICAgaWYgbm90IHNlbGYuYXJncy5ub19jaGVja3BvaW50OgorICAgICAgd2l0aCBvcGVuKHNlbGYuY29udGV4dC5sYXN0X3JldmlzaW9uX2NvdmVyZWRfZmlsZSwgJ3cnKSBhcyBmOgorICAgICAgICBmLndyaXRlKGNoZWNrcG9pbnQgKyAnXG4nKQorCisKK2RlZiBtYWluKCk6CisgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgncmVzdWx0c19kaXInLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3doZXJlIHRvIHdyaXRlIHRoZSBqb2IgcmVzdWx0cycpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2lucHV0X3BhdGhzJywgbmFyZ3M9JysnLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3BkZiBmaWxlcyBvciBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIHBkZiBmaWxlcyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAndG8gcnVuIGFzIHRlc3QgY2FzZXMnKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW5vLWNoZWNrb3V0JywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSd3aGV0aGVyIHRvIHNraXAgY2hlY2tpbmcgb3V0IG9yaWdpbi9tYXN0ZXIuIFVzZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yIHNjcmlwdCBkZWJ1Z2dpbmcuJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1uby1jaGVja3BvaW50JywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSd3aGV0aGVyIHRvIHNraXAgd3JpdGluZyB0aGUgbmV3IGNoZWNrcG9pbnQuIFVzZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yIHNjcmlwdCBkZWJ1Z2dpbmcuJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1uby1jb2xvcicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nd2hldGhlciB0byB3cml0ZSBvdXRwdXQgd2l0aG91dCBjb2xvciBlc2NhcGUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvZGVzLicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tb3V0cHV0LXRvLWxvZycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nd2hldGhlciB0byB3cml0ZSBvdXRwdXQgdG8gYSBsb2cgZmlsZScpCisgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgam9iX2NvbnRleHQgPSBKb2JDb250ZXh0KGFyZ3MpCisKKyAgaWYgYXJncy5vdXRwdXRfdG9fbG9nOgorICAgIGxvZ19maWxlID0gb3Blbihqb2JfY29udGV4dC5ydW5fb3V0cHV0X2xvZ19maWxlLCAndycpCisgICAgc3lzLnN0ZG91dCA9IGxvZ19maWxlCisgICAgc3lzLnN0ZGVyciA9IGxvZ19maWxlCisKKyAgcnVuID0gSm9iUnVuKGFyZ3MsIGpvYl9jb250ZXh0KQorICByZXN1bHQgPSBydW4uUnVuKCkKKworICBpZiBhcmdzLm91dHB1dF90b19sb2c6CisgICAgbG9nX2ZpbGUuY2xvc2UoKQorCisgIHJldHVybiByZXN1bHQKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBzeXMuZXhpdChtYWluKCkpCisKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvdG9vbHMvc2FmZXR5bmV0X21lYXN1cmUucHkgYi90ZXN0aW5nL3Rvb2xzL3NhZmV0eW5ldF9tZWFzdXJlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdiNWJkNWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Rvb2xzL3NhZmV0eW5ldF9tZWFzdXJlLnB5CkBAIC0wLDAgKzEsMTU2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IDIwMTcgVGhlIFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisjIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyIiIk1lYXN1cmVzIHBlcmZvcm1hbmNlIGZvciByZW5kZXJpbmcgYSBzaW5nbGUgdGVzdCBjYXNlIHdpdGggcGRmaXVtLgorCitUaGUgb3V0cHV0IGlzIGEgbnVtYmVyIHRoYXQgaXMgYSBtZXRyaWMgd2hpY2ggZGVwZW5kcyBvbiB0aGUgcHJvZmlsZXIgc3BlY2lmaWVkLgorIiIiCisKK2ltcG9ydCBhcmdwYXJzZQoraW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCisKK2Zyb20gY29tbW9uIGltcG9ydCBQcmludEVycgorCisKK0NBTExHUklORF9QUk9GSUxFUiA9ICdjYWxsZ3JpbmQnCitQRVJGU1RBVF9QUk9GSUxFUiA9ICdwZXJmc3RhdCcKKworUERGSVVNX1RFU1QgPSAncGRmaXVtX3Rlc3QnCisKK2NsYXNzIFBlcmZvcm1hbmNlUnVuKG9iamVjdCk6CisgICIiIkEgc2luZ2xlIG1lYXN1cmVtZW50IG9mIGEgdGVzdCBjYXNlLiIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmdzKToKKyAgICBzZWxmLmFyZ3MgPSBhcmdzCisgICAgc2VsZi5wZGZpdW1fdGVzdF9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYuYXJncy5idWlsZF9kaXIsIFBERklVTV9URVNUKQorCisgIGRlZiBfQ2hlY2tUb29scyhzZWxmKToKKyAgICAiIiJSZXR1cm5zIHdoZXRoZXIgdGhlIHRvb2wgZmlsZSBwYXRocyBhcmUgc2FuZS4iIiIKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5wZGZpdW1fdGVzdF9wYXRoKToKKyAgICAgIFByaW50RXJyKCJGQUlMVVJFOiBDYW4ndCBmaW5kIHRlc3QgZXhlY3V0YWJsZSAnJXMnIgorICAgICAgICAgICAgICAgJSBzZWxmLnBkZml1bV90ZXN0X3BhdGgpCisgICAgICBQcmludEVycignVXNlIC0tYnVpbGQtZGlyIHRvIHNwZWNpZnkgaXRzIGxvY2F0aW9uLicpCisgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiBub3Qgb3MuYWNjZXNzKHNlbGYucGRmaXVtX3Rlc3RfcGF0aCwgb3MuWF9PSyk6CisgICAgICBQcmludEVycigiRkFJTFVSRTogVGVzdCBleGVjdXRhYmxlICclcycgbGFja3MgZXhlY3V0aW9uIHBlcm1pc3Npb25zIgorICAgICAgICAgICAgICAgJSBzZWxmLnBkZml1bV90ZXN0X3BhdGgpCisgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gVHJ1ZQorCisgIGRlZiBSdW4oc2VsZik6CisgICAgIiIiUnVucyB0ZXN0IGhhcm5lc3MgYW5kIG1lYXN1cmVzIHBlcmZvcm1hbmNlIHdpdGggdGhlIGdpdmVuIHByb2ZpbGVyLgorCisgICAgUmV0dXJuczoKKyAgICAgIEV4aXQgY29kZSBmb3IgdGhlIHNjcmlwdC4KKyAgICAiIiIKKyAgICBpZiBub3Qgc2VsZi5fQ2hlY2tUb29scygpOgorICAgICAgcmV0dXJuIDEKKworICAgIGlmIHNlbGYuYXJncy5wcm9maWxlciA9PSBDQUxMR1JJTkRfUFJPRklMRVI6CisgICAgICB0aW1lID0gc2VsZi5fUnVuQ2FsbGdyaW5kKCkKKyAgICBlbGlmIHNlbGYuYXJncy5wcm9maWxlciA9PSBQRVJGU1RBVF9QUk9GSUxFUjoKKyAgICAgIHRpbWUgPSBzZWxmLl9SdW5QZXJmU3RhdCgpCisgICAgZWxzZToKKyAgICAgIFByaW50RXJyKCdwcm9maWxlcj0lcyBub3Qgc3VwcG9ydGVkLCBhYm9ydGluZycgJSBzZWxmLmFyZ3MucHJvZmlsZXIpCisgICAgICByZXR1cm4gMQorCisgICAgaWYgdGltZSBpcyBOb25lOgorICAgICAgcmV0dXJuIDEKKworICAgIHByaW50IHRpbWUKKyAgICByZXR1cm4gMAorCisgIGRlZiBfUnVuQ2FsbGdyaW5kKHNlbGYpOgorICAgICIiIlJ1bnMgdGVzdCBoYXJuZXNzIGFuZCBtZWFzdXJlcyBwZXJmb3JtYW5jZSB3aXRoIGNhbGxncmluZC4KKworICAgIFJldHVybnM6CisgICAgICBpbnQgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBtZWFzdXJlbWVudCwgaW4gaW5zdHJ1Y3Rpb25zIG9yIHRpbWUuCisgICAgIiIiCisgICAgIyBXaGV0aGVyIHRvIHR1cm4gaW5zdHJ1bWVudCB0aGUgd2hvbGUgcnVuIG9yIHRvIHVzZSB0aGUgY2FsbGdyaW5kIG1hY3JvCisgICAgIyBkZWxpbWl0ZXJzIGluIHBkZml1bV90ZXN0LgorICAgIGluc3RydW1lbnRfYXRfc3RhcnQgPSAnbm8nIGlmIHNlbGYuYXJncy5pbnRlcmVzdGluZ19zZWN0aW9uIGVsc2UgJ3llcycKKyAgICBvdXRwdXRfcGF0aCA9IHNlbGYuYXJncy5vdXRwdXRfcGF0aCBvciAnL2Rldi9udWxsJworCisgICAgdmFsZ3JpbmRfY21kID0gKFsndmFsZ3JpbmQnLCAnLS10b29sPWNhbGxncmluZCcsCisgICAgICAgICAgICAgICAgICAgICAnLS1pbnN0ci1hdHN0YXJ0PSVzJyAlIGluc3RydW1lbnRfYXRfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAnLS1jYWxsZ3JpbmQtb3V0LWZpbGU9JXMnICUgb3V0cHV0X3BhdGhdCisgICAgICAgICAgICAgICAgICAgICsgc2VsZi5fQnVpbGRUZXN0SGFybmVzc0NvbW1hbmQoKSkKKyAgICBvdXRwdXQgPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dCh2YWxncmluZF9jbWQsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKKworICAgICMgTWF0Y2ggdGhlIGxpbmUgd2l0aCB0aGUgaW5zdHJ1Y3Rpb24gY291bnQsIGVnLgorICAgICMgJz09OTg3NjU9PSBDb2xsZWN0ZWQgOiAxMjM0NScKKyAgICByZXR1cm4gc2VsZi5fRXh0cmFjdElyQ291bnQocidcYkNvbGxlY3RlZFxiICo6ICpcYihcZCspJywgb3V0cHV0KQorCisgIGRlZiBfUnVuUGVyZlN0YXQoc2VsZik6CisgICAgIiIiUnVucyB0ZXN0IGhhcm5lc3MgYW5kIG1lYXN1cmVzIHBlcmZvcm1hbmNlIHdpdGggcGVyZiBzdGF0LgorCisgICAgUmV0dXJuczoKKyAgICAgIGludCB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIG1lYXN1cmVtZW50LCBpbiBpbnN0cnVjdGlvbnMgb3IgdGltZS4KKyAgICAiIiIKKyAgICAjIC0tbm8tYmlnLW51bTogZG8gbm90IGFkZCB0aG91c2FuZHMgc2VwYXJhdG9ycworICAgICMgLWVpbnN0cnVjdGlvbnM6IHByaW50IG9ubHkgaW5zdHJ1Y3Rpb24gY291bnQKKyAgICBjbWRfdG9fcnVuID0gKFsncGVyZicsICdzdGF0JywgJy0tbm8tYmlnLW51bScsICctZWluc3RydWN0aW9ucyddCisgICAgICAgICAgICAgICAgICArIHNlbGYuX0J1aWxkVGVzdEhhcm5lc3NDb21tYW5kKCkpCisgICAgb3V0cHV0ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoY21kX3RvX3J1biwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKQorCisgICAgIyBNYXRjaCB0aGUgbGluZSB3aXRoIHRoZSBpbnN0cnVjdGlvbiBjb3VudCwgZWcuCisgICAgIyAnICAgICAgICAxMjM0NSAgICAgIGluc3RydWN0aW9ucycKKyAgICByZXR1cm4gc2VsZi5fRXh0cmFjdElyQ291bnQocidcYihcZCspXGIuKlxiaW5zdHJ1Y3Rpb25zXGInLCBvdXRwdXQpCisKKyAgZGVmIF9CdWlsZFRlc3RIYXJuZXNzQ29tbWFuZChzZWxmKToKKyAgICAiIiJCdWlsZHMgY29tbWFuZCB0byBydW4gdGhlIHRlc3QgaGFybmVzcy4iIiIKKyAgICBjbWQgPSBbc2VsZi5wZGZpdW1fdGVzdF9wYXRoLCAnLS1zZW5kLWV2ZW50cyddCisgICAgaWYgc2VsZi5hcmdzLmludGVyZXN0aW5nX3NlY3Rpb246CisgICAgICBjbWQuYXBwZW5kKCctLWNhbGxncmluZC1kZWxpbScpCisgICAgY21kLmFwcGVuZChzZWxmLmFyZ3MucGRmX3BhdGgpCisgICAgcmV0dXJuIGNtZAorCisgIGRlZiBfRXh0cmFjdElyQ291bnQoc2VsZiwgcmVnZXgsIG91dHB1dCk6CisgICAgIiIiRXh0cmFjdHMgYSBudW1iZXIgZnJvbSB0aGUgb3V0cHV0IHdpdGggYSByZWdleC4iIiIKKyAgICBtYXRjaGVkID0gcmUuc2VhcmNoKHJlZ2V4LCBvdXRwdXQpCisKKyAgICBpZiBub3QgbWF0Y2hlZDoKKyAgICAgIHJldHVybiBOb25lCisKKyAgICAjIEdyb3VwIDEgaXMgdGhlIGluc3RydWN0aW9uIG51bWJlciwgZWcuIDEyMzQ1CisgICAgcmV0dXJuIGludChtYXRjaGVkLmdyb3VwKDEpKQorCisKK2RlZiBtYWluKCk6CisgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgncGRmX3BhdGgnLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3Rlc3QgY2FzZSB0byBtZWFzdXJlIGxvYWQgYW5kIHJlbmRlcmluZyB0aW1lJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1idWlsZC1kaXInLCBkZWZhdWx0PW9zLnBhdGguam9pbignb3V0JywgJ1JlbGVhc2UnKSwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdyZWxhdGl2ZSBwYXRoIHRvIHRoZSBidWlsZCBkaXJlY3Rvcnkgd2l0aCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMnICUgUERGSVVNX1RFU1QpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tcHJvZmlsZXInLCBkZWZhdWx0PUNBTExHUklORF9QUk9GSUxFUiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSd3aGljaCBwcm9maWxlciB0byB1c2UuIFN1cHBvcnRzIGNhbGxncmluZCBhbmQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BlcmZzdGF0IGZvciBub3cuJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1pbnRlcmVzdGluZy1zZWN0aW9uJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSd3aGV0aGVyIHRvIG1lYXN1cmUganVzdCB0aGUgaW50ZXJlc3Rpbmcgc2VjdGlvbiBvciAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAndGhlIHdob2xlIHRlc3QgaGFybmVzcy4gVGhlIGludGVyZXN0aW5nIHNlY3Rpb24gaXMgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BkZml1bSByZWFkaW5nIGEgcGRmIGZyb20gbWVtb3J5IGFuZCByZW5kZXJpbmcgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2l0LCB3aGljaCBvbWl0cyBsb2FkaW5nIHRoZSB0aW1lIHRvIGxvYWQgdGhlIGZpbGUsICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbml0aWFsaXplIHRoZSBsaWJyYXJ5LCB0ZXJtaW5hdGUgaXQsIGV0Yy4gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xpbWl0aW5nIHRvIG9ubHkgdGhlIGludGVyZXN0aW5nIHNlY3Rpb24gZG9lcyBub3QgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dvcmsgb24gUmVsZWFzZSBzaW5jZSB0aGUgZGVsaW1pdGVycyBhcmUgb3B0aW1pemVkICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdvdXQuIENhbGxncmluZCBvbmx5LicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tb3V0cHV0LXBhdGgnLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J3doZXJlIHRvIHdyaXRlIHRoZSBwcm9maWxlIGRhdGEgb3V0cHV0IGZpbGUnKQorICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisgIGlmIGFyZ3MuaW50ZXJlc3Rpbmdfc2VjdGlvbiBhbmQgYXJncy5wcm9maWxlciAhPSBDQUxMR1JJTkRfUFJPRklMRVI6CisgICAgUHJpbnRFcnIoJy0taW50ZXJlc3Rpbmctc2VjdGlvbiByZXF1aXJlcyBwcm9maWxlciB0byBiZSBjYWxsZ3JpbmQuJykKKyAgICByZXR1cm4gMQorCisgIHJ1biA9IFBlcmZvcm1hbmNlUnVuKGFyZ3MpCisgIHJldHVybiBydW4uUnVuKCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICBzeXMuZXhpdChtYWluKCkpCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Rvb2xzL3N1cHByZXNzb3IucHkgYi90ZXN0aW5nL3Rvb2xzL3N1cHByZXNzb3IucHkKaW5kZXggODZkMjY2OC4uMmI0YjVkMyAxMDA3NTUKLS0tIGEvdGVzdGluZy90b29scy9zdXBwcmVzc29yLnB5CisrKyBiL3Rlc3RpbmcvdG9vbHMvc3VwcHJlc3Nvci5weQpAQCAtMTIsMTIgKzEyLDE2IEBACiAgICAgZmVhdHVyZV92ZWN0b3IgPSBmZWF0dXJlX3N0cmluZy5zdHJpcCgpLnNwbGl0KCIsIikKICAgICBzZWxmLmhhc192OCA9ICJWOCIgaW4gZmVhdHVyZV92ZWN0b3IKICAgICBzZWxmLmhhc194ZmEgPSAiWEZBIiBpbiBmZWF0dXJlX3ZlY3RvcgotICAgIHNlbGYuaXNfYXNhbiA9ICJBU0FOIiBpbiBmZWF0dXJlX3ZlY3RvcgorICAgIHNlbGYuc3VwcHJlc3Npb25fc2V0ID0gc2VsZi5fTG9hZFN1cHByZXNzZWRTZXQoJ1NVUFBSRVNTSU9OUycsIGZpbmRlcikKKyAgICBzZWxmLmltYWdlX3N1cHByZXNzaW9uX3NldCA9IHNlbGYuX0xvYWRTdXBwcmVzc2VkU2V0KAorICAgICAgICAnU1VQUFJFU1NJT05TX0lNQUdFX0RJRkYnLAorICAgICAgICBmaW5kZXIpCisKKyAgZGVmIF9Mb2FkU3VwcHJlc3NlZFNldChzZWxmLCBzdXBwcmVzc2lvbnNfZmlsZW5hbWUsIGZpbmRlcik6CiAgICAgdjhfb3B0aW9uID0gInY4IiBpZiBzZWxmLmhhc192OCBlbHNlICJub3Y4IgogICAgIHhmYV9vcHRpb24gPSAieGZhIiBpZiBzZWxmLmhhc194ZmEgZWxzZSAibm94ZmEiCi0KLSAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGZpbmRlci5UZXN0aW5nRGlyKCksICdTVVBQUkVTU0lPTlMnKSkgYXMgZjoKLSAgICAgIHNlbGYuc3VwcHJlc3Npb25fc2V0ID0gc2V0KHNlbGYuX0ZpbHRlclN1cHByZXNzaW9ucygKKyAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKGZpbmRlci5UZXN0aW5nRGlyKCksIHN1cHByZXNzaW9uc19maWxlbmFtZSkpIGFzIGY6CisgICAgICByZXR1cm4gc2V0KHNlbGYuX0ZpbHRlclN1cHByZXNzaW9ucygKICAgICAgICAgY29tbW9uLm9zX25hbWUoKSwgdjhfb3B0aW9uLCB4ZmFfb3B0aW9uLCBzZWxmLl9FeHRyYWN0U3VwcHJlc3Npb25zKGYpKSkKIAogICBkZWYgX0V4dHJhY3RTdXBwcmVzc2lvbnMoc2VsZiwgZik6CkBAIC0zMyw4ICszNyw2IEBACiAgICAgb3NfY29sdW1uID0gaXRlbVsxXS5zcGxpdCgiLCIpOwogICAgIGpzX2NvbHVtbiA9IGl0ZW1bMl0uc3BsaXQoIiwiKTsKICAgICB4ZmFfY29sdW1uID0gaXRlbVszXS5zcGxpdCgiLCIpOwotICAgIGlmIHNlbGYuaXNfYXNhbiBhbmQgJ2FzYW4nIGluIG9zX2NvbHVtbjoKLSAgICAgIHJldHVybiBUcnVlCiAgICAgcmV0dXJuICgoJyonIGluIG9zX2NvbHVtbiBvciBvcyBpbiBvc19jb2x1bW4pIGFuZAogICAgICAgICAgICAgKCcqJyBpbiBqc19jb2x1bW4gb3IganMgaW4ganNfY29sdW1uKSBhbmQKICAgICAgICAgICAgICgnKicgaW4geGZhX2NvbHVtbiBvciB4ZmEgaW4geGZhX2NvbHVtbikpCkBAIC01MCwzICs1Miw5IEBACiAgICAgICBwcmludCAiJXMgZXhlY3V0aW9uIGlzIHN1cHByZXNzZWQiICUgaW5wdXRfZmlsZXBhdGgKICAgICAgIHJldHVybiBUcnVlCiAgICAgcmV0dXJuIEZhbHNlCisKKyAgZGVmIElzSW1hZ2VEaWZmU3VwcHJlc3NlZChzZWxmLCBpbnB1dF9maWxlbmFtZSk6CisgICAgaWYgaW5wdXRfZmlsZW5hbWUgaW4gc2VsZi5pbWFnZV9zdXBwcmVzc2lvbl9zZXQ6CisgICAgICBwcmludCAiJXMgaW1hZ2UgZGlmZiBjb21wYXJpc29uIGlzIHN1cHByZXNzZWQiICUgaW5wdXRfZmlsZW5hbWUKKyAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Rvb2xzL3Rlc3RfcnVubmVyLnB5IGIvdGVzdGluZy90b29scy90ZXN0X3J1bm5lci5weQppbmRleCA2Y2QzYTZjLi5lODk1NTUyIDEwMDY0NAotLS0gYS90ZXN0aW5nL3Rvb2xzL3Rlc3RfcnVubmVyLnB5CisrKyBiL3Rlc3RpbmcvdG9vbHMvdGVzdF9ydW5uZXIucHkKQEAgLTM5LDYgKzM5LDggQEAKIGNsYXNzIFRlc3RSdW5uZXI6CiAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaXJuYW1lKToKICAgICBzZWxmLnRlc3RfZGlyID0gZGlybmFtZQorICAgIHNlbGYuZW5mb3JjZV9leHBlY3RlZF9pbWFnZXMgPSBGYWxzZQorICAgIHNlbGYub25lc2hvdF9yZW5kZXJlciA9IEZhbHNlCiAKICAgIyBHZW5lcmF0ZUFuZFRlc3QgcmV0dXJucyBhIHR1cGxlIDxzdWNjZXNzLCBvdXRwdXRmaWxlcz4gd2hlcmUKICAgIyBzdWNjZXNzIGlzIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHRlc3RzIHBhc3NlZCBjb21wYXJpc29uCkBAIC02Miw4ICs2NCw4IEBACiAgICAgcmFpc2VkX2V4Y2VwdGlvbiA9IHNlbGYuR2VuZXJhdGUoc291cmNlX2RpciwgaW5wdXRfZmlsZW5hbWUsIGlucHV0X3Jvb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGRmX3BhdGgpCiAKLSAgICBpZiByYWlzZWRfZXhjZXB0aW9uICE9IE5vbmU6Ci0gICAgICBwcmludCAiRkFJTFVSRTogIiArIGlucHV0X2ZpbGVuYW1lICsgIjsgIiArIHN0cihyYWlzZWRfZXhjZXB0aW9uKQorICAgIGlmIHJhaXNlZF9leGNlcHRpb24gaXMgbm90IE5vbmU6CisgICAgICBwcmludCAnRkFJTFVSRTogJXM7ICVzJyAlIChpbnB1dF9maWxlbmFtZSwgcmFpc2VkX2V4Y2VwdGlvbikKICAgICAgIHJldHVybiBGYWxzZSwgW10KIAogICAgIHJlc3VsdHMgPSBbXQpAQCAtNzIsMjMgKzc0LDM1IEBACiAgICAgZWxzZToKICAgICAgIHJhaXNlZF9leGNlcHRpb24sIHJlc3VsdHMgPSBzZWxmLlRlc3RQaXhlbChpbnB1dF9yb290LCBwZGZfcGF0aCkKIAotICAgIGlmIHJhaXNlZF9leGNlcHRpb24gIT0gTm9uZToKLSAgICAgIHByaW50ICJGQUlMVVJFOiAiICsgaW5wdXRfZmlsZW5hbWUgKyAiOyAiICsgc3RyKHJhaXNlZF9leGNlcHRpb24pCisgICAgaWYgcmFpc2VkX2V4Y2VwdGlvbiBpcyBub3QgTm9uZToKKyAgICAgIHByaW50ICdGQUlMVVJFOiAlczsgJXMnICUgKGlucHV0X2ZpbGVuYW1lLCByYWlzZWRfZXhjZXB0aW9uKQogICAgICAgcmV0dXJuIEZhbHNlLCByZXN1bHRzCiAKLSAgICBpZiBsZW4oYWN0dWFsX2ltYWdlcyk6CisgICAgaWYgYWN0dWFsX2ltYWdlczoKICAgICAgIGlmIHNlbGYuaW1hZ2VfZGlmZmVyLkhhc0RpZmZlcmVuY2VzKGlucHV0X2ZpbGVuYW1lLCBzb3VyY2VfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53b3JraW5nX2Rpcik6CisgICAgICAgIGlmIChzZWxmLm9wdGlvbnMucmVnZW5lcmF0ZV9leHBlY3RlZAorICAgICAgICAgICAgYW5kIG5vdCBzZWxmLnRlc3Rfc3VwcHJlc3Nvci5Jc1Jlc3VsdFN1cHByZXNzZWQoaW5wdXRfZmlsZW5hbWUpCisgICAgICAgICAgICBhbmQgbm90IHNlbGYudGVzdF9zdXBwcmVzc29yLklzSW1hZ2VEaWZmU3VwcHJlc3NlZChpbnB1dF9maWxlbmFtZSkpOgorICAgICAgICAgIHBsYXRmb3JtX29ubHkgPSAoc2VsZi5vcHRpb25zLnJlZ2VuZXJhdGVfZXhwZWN0ZWQgPT0gJ3BsYXRmb3JtJykKKyAgICAgICAgICBzZWxmLmltYWdlX2RpZmZlci5SZWdlbmVyYXRlKGlucHV0X2ZpbGVuYW1lLCBzb3VyY2VfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53b3JraW5nX2RpciwgcGxhdGZvcm1fb25seSkKICAgICAgICAgcmV0dXJuIEZhbHNlLCByZXN1bHRzCisgICAgZWxzZToKKyAgICAgIGlmIChzZWxmLmVuZm9yY2VfZXhwZWN0ZWRfaW1hZ2VzCisgICAgICAgICAgYW5kIG5vdCBzZWxmLnRlc3Rfc3VwcHJlc3Nvci5Jc0ltYWdlRGlmZlN1cHByZXNzZWQoaW5wdXRfZmlsZW5hbWUpKToKKyAgICAgICAgcHJpbnQgJ0ZBSUxVUkU6ICVzOyBNaXNzaW5nIGV4cGVjdGVkIGltYWdlcycgJSBpbnB1dF9maWxlbmFtZQorICAgICAgICByZXR1cm4gRmFsc2UsIHJlc3VsdHMKKwogICAgIHJldHVybiBUcnVlLCByZXN1bHRzCiAKICAgZGVmIEdlbmVyYXRlKHNlbGYsIHNvdXJjZV9kaXIsIGlucHV0X2ZpbGVuYW1lLCBpbnB1dF9yb290LCBwZGZfcGF0aCk6CiAgICAgb3JpZ2luYWxfcGF0aCA9IG9zLnBhdGguam9pbihzb3VyY2VfZGlyLCBpbnB1dF9maWxlbmFtZSkKICAgICBpbnB1dF9wYXRoID0gb3MucGF0aC5qb2luKHNvdXJjZV9kaXIsIGlucHV0X3Jvb3QgKyAnLmluJykKIAotICAgIGlucHV0X2V2ZW50X3BhdGggPSBvcy5wYXRoLmpvaW4oc291cmNlX2RpciwgaW5wdXRfcm9vdCArICIuZXZ0IikKKyAgICBpbnB1dF9ldmVudF9wYXRoID0gb3MucGF0aC5qb2luKHNvdXJjZV9kaXIsIGlucHV0X3Jvb3QgKyAnLmV2dCcpCiAgICAgaWYgb3MucGF0aC5leGlzdHMoaW5wdXRfZXZlbnRfcGF0aCk6Ci0gICAgICBvdXRwdXRfZXZlbnRfcGF0aCA9IG9zLnBhdGguc3BsaXRleHQocGRmX3BhdGgpWzBdICsgIi5ldnQiCisgICAgICBvdXRwdXRfZXZlbnRfcGF0aCA9IG9zLnBhdGguc3BsaXRleHQocGRmX3BhdGgpWzBdICsgJy5ldnQnCiAgICAgICBzaHV0aWwuY29weWZpbGUoaW5wdXRfZXZlbnRfcGF0aCwgb3V0cHV0X2V2ZW50X3BhdGgpCiAKICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoaW5wdXRfcGF0aCk6CkBAIC0xMDIsNDIgKzExNiw1MSBAQAogICAgICAgICBbc3lzLmV4ZWN1dGFibGUsIHNlbGYuZml4dXBfcGF0aCwgJy0tb3V0cHV0LWRpcj0nICsgc2VsZi53b3JraW5nX2RpciwKICAgICAgICAgICAgIGlucHV0X3BhdGhdKQogCi0KICAgZGVmIFRlc3RUZXh0KHNlbGYsIGlucHV0X3Jvb3QsIGV4cGVjdGVkX3R4dF9wYXRoLCBwZGZfcGF0aCk6CiAgICAgdHh0X3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi53b3JraW5nX2RpciwgaW5wdXRfcm9vdCArICcudHh0JykKIAogICAgIHdpdGggb3Blbih0eHRfcGF0aCwgJ3cnKSBhcyBvdXRmaWxlOgotICAgICAgY21kX3RvX3J1biA9IFtzZWxmLnBkZml1bV90ZXN0X3BhdGgsIHBkZl9wYXRoXQorICAgICAgY21kX3RvX3J1biA9IFtzZWxmLnBkZml1bV90ZXN0X3BhdGgsICctLXNlbmQtZXZlbnRzJywgcGRmX3BhdGhdCiAgICAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoY21kX3RvX3J1biwgc3Rkb3V0PW91dGZpbGUpCiAKICAgICBjbWQgPSBbc3lzLmV4ZWN1dGFibGUsIHNlbGYudGV4dF9kaWZmX3BhdGgsIGV4cGVjdGVkX3R4dF9wYXRoLCB0eHRfcGF0aF0KICAgICByZXR1cm4gY29tbW9uLlJ1bkNvbW1hbmQoY21kKQogCi0KICAgZGVmIFRlc3RQaXhlbChzZWxmLCBpbnB1dF9yb290LCBwZGZfcGF0aCk6Ci0gICAgY21kX3RvX3J1biA9IFtzZWxmLnBkZml1bV90ZXN0X3BhdGgsICctLXNlbmQtZXZlbnRzJywgJy0tcG5nJ10KLSAgICBpZiBzZWxmLmdvbGRfcmVzdWx0czoKLSAgICAgIGNtZF90b19ydW4uYXBwZW5kKCctLW1kNScpCisgICAgY21kX3RvX3J1biA9IFtzZWxmLnBkZml1bV90ZXN0X3BhdGgsICctLXNlbmQtZXZlbnRzJywgJy0tcG5nJywgJy0tbWQ1J10KKyAgICBpZiBzZWxmLm9uZXNob3RfcmVuZGVyZXI6CisgICAgICBjbWRfdG9fcnVuLmFwcGVuZCgnLS1yZW5kZXItb25lc2hvdCcpCiAgICAgY21kX3RvX3J1bi5hcHBlbmQocGRmX3BhdGgpCiAgICAgcmV0dXJuIGNvbW1vbi5SdW5Db21tYW5kRXh0cmFjdEhhc2hlZEZpbGVzKGNtZF90b19ydW4pCiAKICAgZGVmIEhhbmRsZVJlc3VsdChzZWxmLCBpbnB1dF9maWxlbmFtZSwgaW5wdXRfcGF0aCwgcmVzdWx0KToKICAgICBzdWNjZXNzLCBpbWFnZV9wYXRocyA9IHJlc3VsdAotICAgIGlmIHNlbGYuZ29sZF9yZXN1bHRzOgotICAgICAgaWYgaW1hZ2VfcGF0aHM6Ci0gICAgICAgIGZvciBpbWdfcGF0aCwgbWQ1X2hhc2ggaW4gaW1hZ2VfcGF0aHM6Ci0gICAgICAgICAgIyB0aGUgb3V0cHV0IGZpbGVuYW1lICh3aXRob3V0IGV4dGVuc2lvbiBiZWNvbWVzIHRoZSB0ZXN0IG5hbWUpCi0gICAgICAgICAgdGVzdF9uYW1lID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLnNwbGl0KGltZ19wYXRoKVsxXSlbMF0KKworICAgIGlmIGltYWdlX3BhdGhzOgorICAgICAgZm9yIGltZ19wYXRoLCBtZDVfaGFzaCBpbiBpbWFnZV9wYXRoczoKKyAgICAgICAgIyBUaGUgb3V0cHV0IGZpbGVuYW1lIHdpdGhvdXQgaW1hZ2UgZXh0ZW5zaW9uIGJlY29tZXMgdGhlIHRlc3QgbmFtZS4KKyAgICAgICAgIyBGb3IgZXhhbXBsZSwgIi9wYXRoL3RvLy4uLi90ZXN0aW5nL2NvcnB1cy9leGFtcGxlXzAwNS5wZGYuMC5wbmciCisgICAgICAgICMgYmVjb21lcyAiZXhhbXBsZV8wMDUucGRmLjAiLgorICAgICAgICB0ZXN0X25hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguc3BsaXQoaW1nX3BhdGgpWzFdKVswXQorCisgICAgICAgIGlmIG5vdCBzZWxmLnRlc3Rfc3VwcHJlc3Nvci5Jc1Jlc3VsdFN1cHByZXNzZWQoaW5wdXRfZmlsZW5hbWUpOgorICAgICAgICAgIG1hdGNoZWQgPSBzZWxmLmdvbGRfYmFzZWxpbmUuTWF0Y2hMb2NhbFJlc3VsdCh0ZXN0X25hbWUsIG1kNV9oYXNoKQorICAgICAgICAgIGlmIG1hdGNoZWQgPT0gZ29sZC5Hb2xkQmFzZWxpbmUuTUlTTUFUQ0g6CisgICAgICAgICAgICBwcmludCAnU2tpYSBHb2xkIGhhc2ggbWlzbWF0Y2ggZm9yIHRlc3QgY2FzZTogJXMnICUgdGVzdF9uYW1lCisgICAgICAgICAgZWxpZiBtYXRjaGVkID09ICBnb2xkLkdvbGRCYXNlbGluZS5OT19CQVNFTElORToKKyAgICAgICAgICAgIHByaW50ICdObyBTa2lhIEdvbGQgYmFzZWxpbmUgZm91bmQgZm9yIHRlc3QgY2FzZTogJXMnICUgdGVzdF9uYW1lCisKKyAgICAgICAgaWYgc2VsZi5nb2xkX3Jlc3VsdHM6CiAgICAgICAgICAgc2VsZi5nb2xkX3Jlc3VsdHMuQWRkVGVzdFJlc3VsdCh0ZXN0X25hbWUsIG1kNV9oYXNoLCBpbWdfcGF0aCkKIAogICAgIGlmIHNlbGYudGVzdF9zdXBwcmVzc29yLklzUmVzdWx0U3VwcHJlc3NlZChpbnB1dF9maWxlbmFtZSk6CisgICAgICBzZWxmLnJlc3VsdF9zdXBwcmVzc2VkX2Nhc2VzLmFwcGVuZChpbnB1dF9maWxlbmFtZSkKICAgICAgIGlmIHN1Y2Nlc3M6CiAgICAgICAgIHNlbGYuc3VycHJpc2VzLmFwcGVuZChpbnB1dF9wYXRoKQogICAgIGVsc2U6CiAgICAgICBpZiBub3Qgc3VjY2VzczoKICAgICAgICAgc2VsZi5mYWlsdXJlcy5hcHBlbmQoaW5wdXRfcGF0aCkKIAotCiAgIGRlZiBSdW4oc2VsZik6CiAgICAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKCkKIApAQCAtMTQ5LDIzICsxNzIsNDEgQEAKICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdydW4gTlVNX1dPUktFUlMgam9icyBpbiBwYXJhbGxlbCcpCiAKICAgICBwYXJzZXIuYWRkX29wdGlvbignLS1nb2xkX3Byb3BlcnRpZXMnLCBkZWZhdWx0PScnLCBkZXN0PSJnb2xkX3Byb3BlcnRpZXMiLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0tleSB2YWx1ZSBwYWlycyB0aGF0IGFyZSB3cml0dGVuIHRvIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIEpTT04gZmlsZSB0aGF0IGlzIGluZ2VzdGVkIGJ5IEdvbGQuJykKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdLZXkgdmFsdWUgcGFpcnMgdGhhdCBhcmUgd3JpdHRlbiB0byB0aGUgdG9wIGxldmVsICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdvZiB0aGUgSlNPTiBmaWxlIHRoYXQgaXMgaW5nZXN0ZWQgYnkgR29sZC4nKQogCiAgICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tZ29sZF9rZXknLCBkZWZhdWx0PScnLCBkZXN0PSJnb2xkX2tleSIsCi0gICAgICAgICAgICAgICAgICAgICAgaGVscD0nS2V5IHZhbHVlIHBhaXJzIHRoYXQgYXJlIGFkZGVkIHRvIHRoZSAia2V5IiBmaWVsZCBvZiB0aGUgSlNPTiBmaWxlIHRoYXQgaXMgaW5nZXN0ZWQgYnkgR29sZC4nKQorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0tleSB2YWx1ZSBwYWlycyB0aGF0IGFyZSBhZGRlZCB0byB0aGUgImtleSIgZmllbGQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29mIHRoZSBKU09OIGZpbGUgdGhhdCBpcyBpbmdlc3RlZCBieSBHb2xkLicpCiAKICAgICBwYXJzZXIuYWRkX29wdGlvbignLS1nb2xkX291dHB1dF9kaXInLCBkZWZhdWx0PScnLCBkZXN0PSJnb2xkX291dHB1dF9kaXIiLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1BhdGggb2Ygd2hlcmUgdG8gd3JpdGUgdGhlIEpTT04gb3V0cHV0IHRvIGJlIHVwbG9hZGVkIHRvIEdvbGQuJykKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQYXRoIG9mIHdoZXJlIHRvIHdyaXRlIHRoZSBKU09OIG91dHB1dCB0byBiZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAndXBsb2FkZWQgdG8gR29sZC4nKQogCi0gICAgcGFyc2VyLmFkZF9vcHRpb24oJy0tZ29sZF9pZ25vcmVfaGFzaGVzJywgZGVmYXVsdD0nJywgZGVzdD0iZ29sZF9pZ25vcmVfaGFzaGVzIiwKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1nb2xkX2lnbm9yZV9oYXNoZXMnLCBkZWZhdWx0PScnLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9ImdvbGRfaWdub3JlX2hhc2hlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUGF0aCB0byBhIGZpbGUgd2l0aCBNRDUgaGFzaGVzIHdlIHdpc2ggdG8gaWdub3JlLicpCiAKLSAgICBwYXJzZXIuYWRkX29wdGlvbignLS1pZ25vcmVfZXJyb3JzJywgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVzdD0iaWdub3JlX2Vycm9ycyIsCi0gICAgICAgICAgICAgICAgICAgICAgaGVscD0nUHJldmVudHMgdGhlIHJldHVybiB2YWx1ZSBmcm9tIGJlaW5nIG5vbi16ZXJvIHdoZW4gaW1hZ2UgY29tcGFyaXNvbiBmYWlscy4nKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctLXJlZ2VuZXJhdGVfZXhwZWN0ZWQnLCBkZWZhdWx0PScnLAorICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InJlZ2VuZXJhdGVfZXhwZWN0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1JlZ2VuZXJhdGVzIGV4cGVjdGVkIGltYWdlcy4gVmFsaWQgdmFsdWVzIGFyZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnImFsbCIgdG8gcmVnZW5lcmF0ZSBhbGwgZXhwZWN0ZWQgcG5ncywgYW5kICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICcicGxhdGZvcm0iIHRvIHJlZ2VuZXJhdGUgb25seSBwbGF0Zm9ybS1zcGVjaWZpYyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwZWN0ZWQgcG5ncy4nKQogCi0gICAgb3B0aW9ucywgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLS1pZ25vcmVfZXJyb3JzJywgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJpZ25vcmVfZXJyb3JzIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQcmV2ZW50cyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gYmVpbmcgbm9uLXplcm8gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3doZW4gaW1hZ2UgY29tcGFyaXNvbiBmYWlscy4nKQogCi0gICAgZmluZGVyID0gY29tbW9uLkRpcmVjdG9yeUZpbmRlcihvcHRpb25zLmJ1aWxkX2RpcikKKyAgICBzZWxmLm9wdGlvbnMsIHNlbGYuYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKworICAgIGlmIChzZWxmLm9wdGlvbnMucmVnZW5lcmF0ZV9leHBlY3RlZAorICAgICAgICBhbmQgc2VsZi5vcHRpb25zLnJlZ2VuZXJhdGVfZXhwZWN0ZWQgbm90IGluIFsnYWxsJywgJ3BsYXRmb3JtJ10pIDoKKyAgICAgIHByaW50ICdGQUlMVVJFOiAtLXJlZ2VuZXJhdGVfZXhwZWN0ZWQgbXVzdCBiZSAiYWxsIiBvciAicGxhdGZvcm0iJworICAgICAgcmV0dXJuIDEKKworICAgIGZpbmRlciA9IGNvbW1vbi5EaXJlY3RvcnlGaW5kZXIoc2VsZi5vcHRpb25zLmJ1aWxkX2RpcikKICAgICBzZWxmLmZpeHVwX3BhdGggPSBmaW5kZXIuU2NyaXB0UGF0aCgnZml4dXBfcGRmX3RlbXBsYXRlLnB5JykKICAgICBzZWxmLnRleHRfZGlmZl9wYXRoID0gZmluZGVyLlNjcmlwdFBhdGgoJ3RleHRfZGlmZi5weScpCiAKQEAgLTE3OCw3ICsyMTksNyBAQAogICAgIHNlbGYucGRmaXVtX3Rlc3RfcGF0aCA9IGZpbmRlci5FeGVjdXRhYmxlUGF0aCgncGRmaXVtX3Rlc3QnKQogICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnBkZml1bV90ZXN0X3BhdGgpOgogICAgICAgcHJpbnQgIkZBSUxVUkU6IENhbid0IGZpbmQgdGVzdCBleGVjdXRhYmxlICclcyciICUgc2VsZi5wZGZpdW1fdGVzdF9wYXRoCi0gICAgICBwcmludCAiVXNlIC0tYnVpbGQtZGlyIHRvIHNwZWNpZnkgaXRzIGxvY2F0aW9uLiIKKyAgICAgIHByaW50ICdVc2UgLS1idWlsZC1kaXIgdG8gc3BlY2lmeSBpdHMgbG9jYXRpb24uJwogICAgICAgcmV0dXJuIDEKIAogICAgIHNlbGYud29ya2luZ19kaXIgPSBmaW5kZXIuV29ya2luZ0Rpcihvcy5wYXRoLmpvaW4oJ3Rlc3RpbmcnLCBzZWxmLnRlc3RfZGlyKSkKQEAgLTE5MCw0NyArMjMxLDUzIEBACiAgICAgc2VsZi50ZXN0X3N1cHByZXNzb3IgPSBzdXBwcmVzc29yLlN1cHByZXNzb3IoZmluZGVyLCBzZWxmLmZlYXR1cmVfc3RyaW5nKQogICAgIHNlbGYuaW1hZ2VfZGlmZmVyID0gcG5nZGlmZmVyLlBOR0RpZmZlcihmaW5kZXIpCiAKKyAgICBzZWxmLmdvbGRfYmFzZWxpbmUgPSBnb2xkLkdvbGRCYXNlbGluZShzZWxmLm9wdGlvbnMuZ29sZF9wcm9wZXJ0aWVzKQorCiAgICAgd2Fsa19mcm9tX2RpciA9IGZpbmRlci5UZXN0aW5nRGlyKHRlc3RfZGlyKTsKIAotICAgIHRlc3RfY2FzZXMgPSBbXQotICAgIGlucHV0X2ZpbGVfcmUgPSByZS5jb21waWxlKCdeW2EtekEtWjAtOV8uXStbLl0oaW58cGRmKSQnKQotICAgIGlmIGxlbihhcmdzKToKLSAgICAgIGZvciBmaWxlX25hbWUgaW4gYXJnczoKLSAgICAgICAgZmlsZV9uYW1lLnJlcGxhY2UoIi5wZGYiLCAiLmluIikKKyAgICBzZWxmLnRlc3RfY2FzZXMgPSBbXQorICAgIHNlbGYuZXhlY3V0aW9uX3N1cHByZXNzZWRfY2FzZXMgPSBbXQorICAgIGlucHV0X2ZpbGVfcmUgPSByZS5jb21waWxlKCdeLitbLl0oaW58cGRmKSQnKQorICAgIGlmIHNlbGYuYXJnczoKKyAgICAgIGZvciBmaWxlX25hbWUgaW4gc2VsZi5hcmdzOgorICAgICAgICBmaWxlX25hbWUucmVwbGFjZSgnLnBkZicsICcuaW4nKQogICAgICAgICBpbnB1dF9wYXRoID0gb3MucGF0aC5qb2luKHdhbGtfZnJvbV9kaXIsIGZpbGVfbmFtZSkKICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKGlucHV0X3BhdGgpOgogICAgICAgICAgIHByaW50ICJDYW4ndCBmaW5kIHRlc3QgZmlsZSAnJXMnIiAlIGZpbGVfbmFtZQogICAgICAgICAgIHJldHVybiAxCiAKLSAgICAgICAgdGVzdF9jYXNlcy5hcHBlbmQoKG9zLnBhdGguYmFzZW5hbWUoaW5wdXRfcGF0aCksCisgICAgICAgIHNlbGYudGVzdF9jYXNlcy5hcHBlbmQoKG9zLnBhdGguYmFzZW5hbWUoaW5wdXRfcGF0aCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUoaW5wdXRfcGF0aCkpKQogICAgIGVsc2U6CiAgICAgICBmb3IgZmlsZV9kaXIsIF8sIGZpbGVuYW1lX2xpc3QgaW4gb3Mud2Fsayh3YWxrX2Zyb21fZGlyKToKICAgICAgICAgZm9yIGlucHV0X2ZpbGVuYW1lIGluIGZpbGVuYW1lX2xpc3Q6CiAgICAgICAgICAgaWYgaW5wdXRfZmlsZV9yZS5tYXRjaChpbnB1dF9maWxlbmFtZSk6CiAgICAgICAgICAgICBpbnB1dF9wYXRoID0gb3MucGF0aC5qb2luKGZpbGVfZGlyLCBpbnB1dF9maWxlbmFtZSkKLSAgICAgICAgICAgIGlmIG5vdCBzZWxmLnRlc3Rfc3VwcHJlc3Nvci5Jc0V4ZWN1dGlvblN1cHByZXNzZWQoaW5wdXRfcGF0aCk6CisgICAgICAgICAgICBpZiBzZWxmLnRlc3Rfc3VwcHJlc3Nvci5Jc0V4ZWN1dGlvblN1cHByZXNzZWQoaW5wdXRfcGF0aCk6CisgICAgICAgICAgICAgIHNlbGYuZXhlY3V0aW9uX3N1cHByZXNzZWRfY2FzZXMuYXBwZW5kKGlucHV0X3BhdGgpCisgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShpbnB1dF9wYXRoKToKLSAgICAgICAgICAgICAgICB0ZXN0X2Nhc2VzLmFwcGVuZCgoaW5wdXRfZmlsZW5hbWUsIGZpbGVfZGlyKSkKKyAgICAgICAgICAgICAgICBzZWxmLnRlc3RfY2FzZXMuYXBwZW5kKChpbnB1dF9maWxlbmFtZSwgZmlsZV9kaXIpKQogCiAgICAgc2VsZi5mYWlsdXJlcyA9IFtdCiAgICAgc2VsZi5zdXJwcmlzZXMgPSBbXQorICAgIHNlbGYucmVzdWx0X3N1cHByZXNzZWRfY2FzZXMgPSBbXQogCiAgICAgIyBDb2xsZWN0IEdvbGQgcmVzdWx0cyBpZiBhbiBvdXRwdXQgZGlyZWN0b3J5IHdhcyBuYW1lZC4KICAgICBzZWxmLmdvbGRfcmVzdWx0cyA9IE5vbmUKLSAgICBpZiBvcHRpb25zLmdvbGRfb3V0cHV0X2RpcjoKLSAgICAgIHNlbGYuZ29sZF9yZXN1bHRzID0gZ29sZC5Hb2xkUmVzdWx0cygicGRmaXVtIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmdvbGRfb3V0cHV0X2RpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmdvbGRfcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmdvbGRfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuZ29sZF9pZ25vcmVfaGFzaGVzKQorICAgIGlmIHNlbGYub3B0aW9ucy5nb2xkX291dHB1dF9kaXI6CisgICAgICBzZWxmLmdvbGRfcmVzdWx0cyA9IGdvbGQuR29sZFJlc3VsdHMoJ3BkZml1bScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25zLmdvbGRfb3V0cHV0X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZ29sZF9wcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9ucy5nb2xkX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMuZ29sZF9pZ25vcmVfaGFzaGVzKQogCi0gICAgaWYgb3B0aW9ucy5udW1fd29ya2VycyA+IDEgYW5kIGxlbih0ZXN0X2Nhc2VzKSA+IDE6CisgICAgaWYgc2VsZi5vcHRpb25zLm51bV93b3JrZXJzID4gMSBhbmQgbGVuKHNlbGYudGVzdF9jYXNlcykgPiAxOgogICAgICAgdHJ5OgotICAgICAgICBwb29sID0gbXVsdGlwcm9jZXNzaW5nLlBvb2wob3B0aW9ucy5udW1fd29ya2VycykKKyAgICAgICAgcG9vbCA9IG11bHRpcHJvY2Vzc2luZy5Qb29sKHNlbGYub3B0aW9ucy5udW1fd29ya2VycykKICAgICAgICAgd29ya2VyX2Z1bmMgPSBmdW5jdG9vbHMucGFydGlhbChUZXN0T25lRmlsZVBhcmFsbGVsLCBzZWxmKQogCi0gICAgICAgIHdvcmtlcl9yZXN1bHRzID0gcG9vbC5pbWFwKHdvcmtlcl9mdW5jLCB0ZXN0X2Nhc2VzKQorICAgICAgICB3b3JrZXJfcmVzdWx0cyA9IHBvb2wuaW1hcCh3b3JrZXJfZnVuYywgc2VsZi50ZXN0X2Nhc2VzKQogICAgICAgICBmb3Igd29ya2VyX3Jlc3VsdCBpbiB3b3JrZXJfcmVzdWx0czoKICAgICAgICAgICByZXN1bHQsIGlucHV0X2ZpbGVuYW1lLCBzb3VyY2VfZGlyID0gd29ya2VyX3Jlc3VsdAogICAgICAgICAgIGlucHV0X3BhdGggPSBvcy5wYXRoLmpvaW4oc291cmNlX2RpciwgaW5wdXRfZmlsZW5hbWUpCkBAIC0yNDMsNyArMjkwLDcgQEAKICAgICAgICAgcG9vbC5jbG9zZSgpCiAgICAgICAgIHBvb2wuam9pbigpCiAgICAgZWxzZToKLSAgICAgIGZvciB0ZXN0X2Nhc2UgaW4gdGVzdF9jYXNlczoKKyAgICAgIGZvciB0ZXN0X2Nhc2UgaW4gc2VsZi50ZXN0X2Nhc2VzOgogICAgICAgICBpbnB1dF9maWxlbmFtZSwgaW5wdXRfZmlsZV9kaXIgPSB0ZXN0X2Nhc2UKICAgICAgICAgcmVzdWx0ID0gc2VsZi5HZW5lcmF0ZUFuZFRlc3QoaW5wdXRfZmlsZW5hbWUsIGlucHV0X2ZpbGVfZGlyKQogICAgICAgICBzZWxmLkhhbmRsZVJlc3VsdChpbnB1dF9maWxlbmFtZSwKQEAgLTI1Niw3ICszMDMsNyBAQAogICAgICAgc2VsZi5zdXJwcmlzZXMuc29ydCgpCiAgICAgICBwcmludCAnXG5cblVuZXhwZWN0ZWQgU3VjY2Vzc2VzOicKICAgICAgIGZvciBzdXJwcmlzZSBpbiBzZWxmLnN1cnByaXNlczoKLSAgICAgICAgcHJpbnQgc3VycHJpc2U7CisgICAgICAgIHByaW50IHN1cnByaXNlCiAKICAgICBpZiBzZWxmLmZhaWx1cmVzOgogICAgICAgc2VsZi5mYWlsdXJlcy5zb3J0KCkKQEAgLTI2NCw2ICszMTEsMzMgQEAKICAgICAgIGZvciBmYWlsdXJlIGluIHNlbGYuZmFpbHVyZXM6CiAgICAgICAgIHByaW50IGZhaWx1cmUKIAotICAgICAgaWYgbm90IG9wdGlvbnMuaWdub3JlX2Vycm9yczoKKyAgICBzZWxmLl9QcmludFN1bW1hcnkoKQorCisgICAgaWYgc2VsZi5mYWlsdXJlczoKKyAgICAgIGlmIG5vdCBzZWxmLm9wdGlvbnMuaWdub3JlX2Vycm9yczoKICAgICAgICAgcmV0dXJuIDEKKwogICAgIHJldHVybiAwCisKKyAgZGVmIF9QcmludFN1bW1hcnkoc2VsZik6CisgICAgbnVtYmVyX3Rlc3RfY2FzZXMgPSBsZW4oc2VsZi50ZXN0X2Nhc2VzKQorICAgIG51bWJlcl9mYWlsdXJlcyA9IGxlbihzZWxmLmZhaWx1cmVzKQorICAgIG51bWJlcl9zdXBwcmVzc2VkID0gbGVuKHNlbGYucmVzdWx0X3N1cHByZXNzZWRfY2FzZXMpCisgICAgbnVtYmVyX3N1Y2Nlc3NlcyA9IG51bWJlcl90ZXN0X2Nhc2VzIC0gbnVtYmVyX2ZhaWx1cmVzIC0gbnVtYmVyX3N1cHByZXNzZWQKKyAgICBudW1iZXJfc3VycHJpc2VzID0gbGVuKHNlbGYuc3VycHJpc2VzKQorICAgIHByaW50CisgICAgcHJpbnQgJ1Rlc3QgY2FzZXMgZXhlY3V0ZWQ6ICVkJyAlIG51bWJlcl90ZXN0X2Nhc2VzCisgICAgcHJpbnQgJyAgU3VjY2Vzc2VzOiAlZCcgJSBudW1iZXJfc3VjY2Vzc2VzCisgICAgcHJpbnQgJyAgU3VwcHJlc3NlZDogJWQnICUgbnVtYmVyX3N1cHByZXNzZWQKKyAgICBwcmludCAnICAgIFN1cnByaXNlczogJWQnICUgbnVtYmVyX3N1cnByaXNlcworICAgIHByaW50ICcgIEZhaWx1cmVzOiAlZCcgJSBudW1iZXJfZmFpbHVyZXMKKyAgICBwcmludAorICAgIHByaW50ICdUZXN0IGNhc2VzIG5vdCBleGVjdXRlZDogJWQnICUgbGVuKHNlbGYuZXhlY3V0aW9uX3N1cHByZXNzZWRfY2FzZXMpCisKKyAgZGVmIFNldEVuZm9yY2VFeHBlY3RlZEltYWdlcyhzZWxmLCBuZXdfdmFsdWUpOgorICAgICIiIlNldCB3aGV0aGVyIHRvIGVuZm9yY2UgdGhhdCBlYWNoIHRlc3QgY2FzZSBwcm92aWRlIGFuIGV4cGVjdGVkIGltYWdlLiIiIgorICAgIHNlbGYuZW5mb3JjZV9leHBlY3RlZF9pbWFnZXMgPSBuZXdfdmFsdWUKKworICBkZWYgU2V0T25lU2hvdFJlbmRlcmVyKHNlbGYsIG5ld192YWx1ZSk6CisgICAgIiIiU2V0IHdoZXRoZXIgdG8gdXNlIHRoZSBvbmVzaG90IHJlbmRlcmVyLiAiIiIKKyAgICBzZWxmLm9uZXNob3RfcmVuZGVyZXIgPSBuZXdfdmFsdWUKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvdW5pdF90ZXN0X21haW4uY3BwIGIvdGVzdGluZy91bml0X3Rlc3RfbWFpbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiMTI5OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvdW5pdF90ZXN0X21haW4uY3BwCkBAIC0wLDAgKzEsNjcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCisjaW5jbHVkZSAidGVzdGluZy9nbW9jay9pbmNsdWRlL2dtb2NrL2dtb2NrLmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKKyNpZiBQREZfRU5BQkxFX1hGQQorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZm9udG1nci5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZ2Vtb2R1bGUuaCIKKyNpbmNsdWRlICJ4ZmEvZmdhcy9mb250L2NmZ2FzX2ZvbnRtZ3IuaCIKKyNpbmNsdWRlICJ4ZmEvZmdhcy9mb250L2NmZ2FzX2dlZm9udC5oIgorCituYW1lc3BhY2UgeworCisvLyBUaGUgbG9hZGluZyB0aW1lIG9mIHRoZSBDRkdBU19Gb250TWdyIGlzIGxpbmVhciBpbiB0aGUgbnVtYmVyIG9mIHRpbWVzIGl0IGlzCisvLyBsb2FkZWQuIFNvLCBpZiBhIHRlc3Qgc3VpdGUgaGFzIGEgbG90IG9mIHRlc3RzIHRoYXQgbmVlZCBhIGZvbnQgbWFuYWdlciB0aGV5CisvLyBjYW4gZW5kIHVwIGV4ZWN1dGluZyB2ZXJ5LCB2ZXJ5IHNsb3dseS4KK2NsYXNzIEVudmlyb25tZW50IDogcHVibGljIHRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyBwdWJsaWM6CisgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgLy8gVE9ETyhkc2luY2xhaXIpOiBUaGlzIGZvbnQgbG9hZGluZyBpcyBzbG93LiBXZSBzaG91bGQgbWFrZSBhIHRlc3QgZm9udAorICAgIC8vIGxvYWRlciB3aGljaCBsb2FkcyB1cCBhIHNpbmdsZSBmb250IHdlIHVzZSBpbiBhbGwgdGVzdHMuCisgICAgQ0ZYX0dFTW9kdWxlOjpHZXQoKS0+R2V0Rm9udE1ncigpLT5TZXRTeXN0ZW1Gb250SW5mbygKKyAgICAgICAgSUZYX1N5c3RlbUZvbnRJbmZvOjpDcmVhdGVEZWZhdWx0KG51bGxwdHIpKTsKKworICAgIGZvbnRfbWdyXyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRkdBU19Gb250TWdyPigpOworICAgIGlmICghZm9udF9tZ3JfLT5FbnVtRm9udHMoKSkKKyAgICAgIGZvbnRfbWdyXyA9IG51bGxwdHI7CisgIH0KKworICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIGZvbnRfbWdyXy5yZXNldCgpOworICB9CisgIENGR0FTX0ZvbnRNZ3IqIEZvbnRNYW5hZ2VyKCkgY29uc3QgeyByZXR1cm4gZm9udF9tZ3JfLmdldCgpOyB9CisKKyBwcml2YXRlOgorICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZHQVNfRm9udE1ncj4gZm9udF9tZ3JfOworfTsKKworRW52aXJvbm1lbnQqIGVudl8gPSBudWxscHRyOworCit9ICAvLyBuYW1lc3BhY2UKKworQ0ZHQVNfRm9udE1nciogR2V0R2xvYmFsRm9udE1hbmFnZXIoKSB7CisgIHJldHVybiBlbnZfLT5Gb250TWFuYWdlcigpOworfQorI2VuZGlmICAvLyBQREZfRU5BQkxFX1hGQQorCisvLyBDYW4ndCB1c2UgZ3Rlc3QtcHJvdmlkZWQgbWFpbiBzaW5jZSB3ZSBuZWVkIHRvIGluaXRpYWxpemUgcGFydGl0aW9uCisvLyBhbGxvYyBiZWZvcmUgaW52b2tpbmcgYW55IHRlc3QuCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgRlhNRU1fSW5pdGlhbGl6ZVBhcnRpdGlvbkFsbG9jKCk7CisKKyNpZiBQREZfRU5BQkxFX1hGQQorICBlbnZfID0gbmV3IEVudmlyb25tZW50KCk7CisgIC8vIFRoZSBlbnYgd2lsbCBiZSBkZWxldGVkIGJ5IGd0ZXN0LgorICBBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZW52Xyk7CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisKKyAgdGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICB0ZXN0aW5nOjpJbml0R29vZ2xlTW9jaygmYXJnYywgYXJndik7CisgIHJldHVybiBSVU5fQUxMX1RFU1RTKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0aW5nL3hmYV9qc19lbWJlZGRlcl90ZXN0LmNwcCBiL3Rlc3RpbmcveGZhX2pzX2VtYmVkZGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMDdjODcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3hmYV9qc19lbWJlZGRlcl90ZXN0LmNwcApAQCAtMCwwICsxLDgxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJ0ZXN0aW5nL3hmYV9qc19lbWJlZGRlcl90ZXN0LmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJmcGRmc2RrL2ZwZGZ4ZmEvY3BkZnhmYV9jb250ZXh0LmgiCisjaW5jbHVkZSAiZnBkZnNkay9mc2RrX2RlZmluZS5oIgorI2luY2x1ZGUgImZ4anMvY2Z4anNlX2VuZ2luZS5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworWEZBSlNFbWJlZGRlclRlc3Q6OlhGQUpTRW1iZWRkZXJUZXN0KCkKKyAgICA6IGFycmF5X2J1ZmZlcl9hbGxvY2F0b3JfKHBkZml1bTo6TWFrZVVuaXF1ZTxGWEpTX0FycmF5QnVmZmVyQWxsb2NhdG9yPigpKSB7Cit9CisKK1hGQUpTRW1iZWRkZXJUZXN0Ojp+WEZBSlNFbWJlZGRlclRlc3QoKSB7fQorCit2b2lkIFhGQUpTRW1iZWRkZXJUZXN0OjpTZXRVcCgpIHsKKyAgdjg6Oklzb2xhdGU6OkNyZWF0ZVBhcmFtcyBwYXJhbXM7CisgIHBhcmFtcy5hcnJheV9idWZmZXJfYWxsb2NhdG9yID0gYXJyYXlfYnVmZmVyX2FsbG9jYXRvcl8uZ2V0KCk7CisgIGlzb2xhdGVfID0gdjg6Oklzb2xhdGU6Ok5ldyhwYXJhbXMpOworICBBU1NFUlRfVFJVRShpc29sYXRlXyk7CisKKyAgRW1iZWRkZXJUZXN0OjpTZXRFeHRlcm5hbElzb2xhdGUoaXNvbGF0ZV8pOworICBFbWJlZGRlclRlc3Q6OlNldFVwKCk7Cit9CisKK3ZvaWQgWEZBSlNFbWJlZGRlclRlc3Q6OlRlYXJEb3duKCkgeworICB2YWx1ZV8ucmVzZXQoKTsKKyAgc2NyaXB0X2NvbnRleHRfID0gbnVsbHB0cjsKKworICBFbWJlZGRlclRlc3Q6OlRlYXJEb3duKCk7CisKKyAgaXNvbGF0ZV8tPkRpc3Bvc2UoKTsKKyAgaXNvbGF0ZV8gPSBudWxscHRyOworfQorCitDWEZBX0RvY3VtZW50KiBYRkFKU0VtYmVkZGVyVGVzdDo6R2V0WEZBRG9jdW1lbnQoKSB7CisgIHJldHVybiBVbmRlcmx5aW5nRnJvbUZQREZEb2N1bWVudChkb2N1bWVudCgpKS0+R2V0WEZBRG9jKCktPkdldFhGQURvYygpOworfQorCitib29sIFhGQUpTRW1iZWRkZXJUZXN0OjpPcGVuRG9jdW1lbnRXaXRoT3B0aW9ucyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbXVzdF9saW5lYXJpemUpIHsKKyAgaWYgKCFFbWJlZGRlclRlc3Q6Ok9wZW5Eb2N1bWVudFdpdGhPcHRpb25zKGZpbGVuYW1lLCBwYXNzd29yZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3RfbGluZWFyaXplKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc2NyaXB0X2NvbnRleHRfID0gR2V0WEZBRG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBYRkFKU0VtYmVkZGVyVGVzdDo6RXhlY3V0ZShjb25zdCBCeXRlU3RyaW5nVmlldyYgaW5wdXQpIHsKKyAgaWYgKEV4ZWN1dGVIZWxwZXIoaW5wdXQpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBDRlhKU0VfVmFsdWUgbXNnKEdldElzb2xhdGUoKSk7CisgIHZhbHVlXy0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgxLCAmbXNnKTsKKyAgZnByaW50ZihzdGRlcnIsICJKUzogJS4qc1xuIiwgc3RhdGljX2Nhc3Q8aW50PihpbnB1dC5HZXRMZW5ndGgoKSksCisgICAgICAgICAgaW5wdXQudW50ZXJtaW5hdGVkX2Nfc3RyKCkpOworICAvLyBJZiB0aGUgcGFyc2luZyBvZiB0aGUgaW5wdXQgZmFpbHMsIHRoZW4gdjggd2lsbCBub3QgcnVuLCBzbyB0aGVyZSB3aWxsIGJlCisgIC8vIG5vIHZhbHVlIGhlcmUgdG8gcHJpbnQuCisgIGlmIChtc2cuSXNTdHJpbmcoKSAmJiAhbXNnLlRvV2lkZVN0cmluZygpLklzRW1wdHkoKSkKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkpTIEVSUk9SOiAlbHNcbiIsIG1zZy5Ub1dpZGVTdHJpbmcoKS5jX3N0cigpKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFhGQUpTRW1iZWRkZXJUZXN0OjpFeGVjdXRlU2lsZW5jZUZhaWx1cmUoY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGlucHV0KSB7CisgIHJldHVybiBFeGVjdXRlSGVscGVyKGlucHV0KTsKK30KKworYm9vbCBYRkFKU0VtYmVkZGVyVGVzdDo6RXhlY3V0ZUhlbHBlcihjb25zdCBCeXRlU3RyaW5nVmlldyYgaW5wdXQpIHsKKyAgdmFsdWVfID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4oR2V0SXNvbGF0ZSgpKTsKKyAgcmV0dXJuIHNjcmlwdF9jb250ZXh0Xy0+UnVuU2NyaXB0KENYRkFfU2NyaXB0OjpUeXBlOjpGb3JtY2FsYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmc6OkZyb21VVEY4KGlucHV0KS5Bc1N0cmluZ1ZpZXcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlXy5nZXQoKSwgR2V0WEZBRG9jdW1lbnQoKS0+R2V0Um9vdCgpKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RpbmcveGZhX2pzX2VtYmVkZGVyX3Rlc3QuaCBiL3Rlc3RpbmcveGZhX2pzX2VtYmVkZGVyX3Rlc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjQ1NDk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy94ZmFfanNfZW1iZWRkZXJfdGVzdC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBURVNUSU5HX1hGQV9KU19FTUJFRERFUl9URVNUX0hfCisjZGVmaW5lIFRFU1RJTkdfWEZBX0pTX0VNQkVEREVSX1RFU1RfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV92YWx1ZS5oIgorI2luY2x1ZGUgImZ4anMvZnhqc192OC5oIgorI2luY2x1ZGUgInRlc3RpbmcvZW1iZWRkZXJfdGVzdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX29iamVjdC5oIgorCitjbGFzcyBDRlhKU0VfRW5naW5lOworCitjbGFzcyBYRkFKU0VtYmVkZGVyVGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3QgeworIHB1YmxpYzoKKyAgWEZBSlNFbWJlZGRlclRlc3QoKTsKKyAgflhGQUpTRW1iZWRkZXJUZXN0KCkgb3ZlcnJpZGU7CisKKyAgLy8gRW1iZWRkZXJUZXN0OgorICB2b2lkIFNldFVwKCkgb3ZlcnJpZGU7CisgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZTsKKyAgYm9vbCBPcGVuRG9jdW1lbnRXaXRoT3B0aW9ucyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtdXN0X2xpbmVhcml6ZSkgb3ZlcnJpZGU7CisKKyAgdjg6Oklzb2xhdGUqIEdldElzb2xhdGUoKSBjb25zdCB7IHJldHVybiBpc29sYXRlXzsgfQorICBDWEZBX0RvY3VtZW50KiBHZXRYRkFEb2N1bWVudCgpOworCisgIGJvb2wgRXhlY3V0ZShjb25zdCBCeXRlU3RyaW5nVmlldyYgaW5wdXQpOworICBib29sIEV4ZWN1dGVTaWxlbmNlRmFpbHVyZShjb25zdCBCeXRlU3RyaW5nVmlldyYgaW5wdXQpOworCisgIENGWEpTRV9WYWx1ZSogR2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV8uZ2V0KCk7IH0KKworIHByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxGWEpTX0FycmF5QnVmZmVyQWxsb2NhdG9yPiBhcnJheV9idWZmZXJfYWxsb2NhdG9yXzsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gdmFsdWVfOworICB2ODo6SXNvbGF0ZSogaXNvbGF0ZV8gPSBudWxscHRyOworICBDRlhKU0VfRW5naW5lKiBzY3JpcHRfY29udGV4dF8gPSBudWxscHRyOworCisgIGJvb2wgRXhlY3V0ZUhlbHBlcihjb25zdCBCeXRlU3RyaW5nVmlldyYgaW5wdXQpOworfTsKKworI2VuZGlmICAvLyBURVNUSU5HX1hGQV9KU19FTUJFRERFUl9URVNUX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9BbmRyb2lkLmJwIGIvdGhpcmRfcGFydHkvQW5kcm9pZC5icAppbmRleCBmZTk5NDg3Li4yZDI5NGUwIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9BbmRyb2lkLmJwCisrKyBiL3RoaXJkX3BhcnR5L0FuZHJvaWQuYnAKQEAgLTEsOCArMSwxNCBAQAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJwZGZpdW0tdGhpcmQtcGFydHkiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJwZGZpdW0tY29tbW9uIgorICAgIF0sCit9CisKIGJ1aWxkID0gWwotICAgICJwZGZpdW1hZ2cyMy5icCIsCisgICAgInBkZml1bWZ4X2FnZy5icCIsCiAgICAgInBkZml1bWJpZ2ludC5icCIsCi0gICAgInBkZml1bWxjbXMuYnAiLAotICAgICJwZGZpdW1qcGVnLmJwIiwKLSAgICAicGRmaXVtb3BlbmpwZWcuYnAiLAotICAgICJwZGZpdW16bGliLmJwIiwKKyAgICAicGRmaXVtbGNtczIuYnAiLAorICAgICJwZGZpdW1wZGZpdW1iYXNlLmJwIiwKKyAgICAicGRmaXVtZnhfbGlib3BlbmpwZWcuYnAiLAogXQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvQlVJTEQuZ24gYi90aGlyZF9wYXJ0eS9CVUlMRC5nbgppbmRleCA1MGFiNzA3Li4xY2ZlZTc3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9CVUlMRC5nbgorKysgYi90aGlyZF9wYXJ0eS9CVUlMRC5nbgpAQCAtMywxNSArMywxOSBAQAogIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCiBpbXBvcnQoIi8vYnVpbGQvY29uZmlnL2FybS5nbmkiKQoraW1wb3J0KCIvL2J1aWxkL2NvbmZpZy9qdW1iby5nbmkiKQoraW1wb3J0KCIvL2J1aWxkL2NvbmZpZy9saW51eC9wa2dfY29uZmlnLmduaSIpCiBpbXBvcnQoIi8vYnVpbGRfb3ZlcnJpZGVzL2J1aWxkLmduaSIpCiBpbXBvcnQoIi4uL3BkZml1bS5nbmkiKQogCiBncm91cCgidGhpcmRfcGFydHkiKSB7CiAgIGRlcHMgPSBbCiAgICAgIjpiaWdpbnQiLAotICAgICI6ZnhfZnJlZXR5cGUiLAogICAgICI6cGRmaXVtX2Jhc2UiLAogICBdCisgIGlmIChwZGZfYnVuZGxlX2ZyZWV0eXBlKSB7CisgICAgZGVwcyArPSBbICI6ZnhfZnJlZXR5cGUiIF0KKyAgfQogfQogCiBjb25maWcoInBkZml1bV90aGlyZF9wYXJ0eV9jb25maWciKSB7CkBAIC0zOCw2NCArNDIsMTUyIEBACiAgIF0KIH0KIAotY29uZmlnKCJmeF9mcmVldHlwZV93YXJuaW5ncyIpIHsKLSAgdmlzaWJpbGl0eSA9IFsgIjoqIiBdCi0gIGlmIChpc19jbGFuZykgewotICAgICMgb3Blbl9mYWNlX1BTX2Zyb21fc2ZudF9zdHJlYW0oKSBhbmQgb3Blbl9mYWNlX2Zyb21fYnVmZmVyKCkgaW4KLSAgICAjIGZ0YmFzZS5oIGFyZSB1bnVzZWQuCi0gICAgY2ZsYWdzID0gWyAiLVduby11bnVzZWQtZnVuY3Rpb24iIF0KK2lmIChwZGZfYnVuZGxlX2ZyZWV0eXBlKSB7CisgIGNvbmZpZygiZnhfZnJlZXR5cGVfd2FybmluZ3MiKSB7CisgICAgdmlzaWJpbGl0eSA9IFsgIjoqIiBdCisgICAgaWYgKGlzX2NsYW5nKSB7CisgICAgICAjIG9wZW5fZmFjZV9QU19mcm9tX3NmbnRfc3RyZWFtKCkgYW5kIG9wZW5fZmFjZV9mcm9tX2J1ZmZlcigpIGluCisgICAgICAjIGZ0YmFzZS5oIGFyZSB1bnVzZWQuCisgICAgICAjCisgICAgICAjIHR0Z2xvYWQuYyBjYXN0cyBmcm9tIHVuc2lnbmVkIGludCB0byB1bnNpZ25lZCBsb25nIHRvIHZvaWQqLgorICAgICAgY2ZsYWdzID0gWworICAgICAgICAiLVduby11bnVzZWQtZnVuY3Rpb24iLAorICAgICAgICAiLVduby1pbnQtdG8tdm9pZC1wb2ludGVyLWNhc3QiLAorICAgICAgXQorICAgIH0KICAgfQotfQogCi0jIFRlc3RzIG1heSBsaW5rIGFnYWluc3QgdGhpcyBldmVuIGlmIHRoZSBwcm9kdWN0aW9uIGxpYnJhcnkgZG9lc24ndCwKLSMgc28gaXQgbmVlZHMgdG8gYmUgc2VwYXJhdGUgZnJvbSBpdC4KLXN0YXRpY19saWJyYXJ5KCJmeF9mcmVldHlwZSIpIHsKLSAgY29uZmlncyAtPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpjaHJvbWl1bV9jb2RlIiBdCi0gIGNvbmZpZ3MgKz0gWwotICAgICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpub19jaHJvbWl1bV9jb2RlIiwKLSAgICAiOnBkZml1bV90aGlyZF9wYXJ0eV9jb25maWciLAotCi0gICAgIyBNdXN0IGJlIGFmdGVyIG5vX2Nocm9taXVtX2NvZGUgZm9yIHdhcm5pbmcgZmxhZ3MgdG8gYmUgb3JkZXJlZCBjb3JyZWN0bHkuCi0gICAgIjpmeF9mcmVldHlwZV93YXJuaW5ncyIsCi0gIF0KLSAgZGVmaW5lcyA9IFsgIkZUMl9CVUlMRF9MSUJSQVJZIiBdCi0gIHNvdXJjZXMgPSBbCi0gICAgImZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCIsCi0gICAgImZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRtbS5oIiwKLSAgICAiZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdG90dmFsLmgiLAotICAgICJmcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0b3V0bG4uaCIsCi0gICAgImZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmgiLAotICAgICJmcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmgiLAotICAgICJmcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCIsCi0gICAgImZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvdHR0YWJsZXMuaCIsCi0gICAgImZyZWV0eXBlL2luY2x1ZGUvZnQyYnVpbGQuaCIsCi0gICAgImZyZWV0eXBlL3NyYy9iYXNlL2Z0YmFzZS5jIiwKLSAgICAiZnJlZXR5cGUvc3JjL2Jhc2UvZnRiYXNlLmgiLAotICAgICJmcmVldHlwZS9zcmMvYmFzZS9mdGJpdG1hcC5jIiwKLSAgICAiZnJlZXR5cGUvc3JjL2Jhc2UvZnRnbHlwaC5jIiwKLSAgICAiZnJlZXR5cGUvc3JjL2Jhc2UvZnRpbml0LmMiLAotICAgICJmcmVldHlwZS9zcmMvYmFzZS9mdGxjZGZpbC5jIiwKLSAgICAiZnJlZXR5cGUvc3JjL2Jhc2UvZnRtbS5jIiwKLSAgICAiZnJlZXR5cGUvc3JjL2Jhc2UvZnRzeXN0ZW0uYyIsCi0gICAgImZyZWV0eXBlL3NyYy9jZmYvY2ZmLmMiLAotICAgICJmcmVldHlwZS9zcmMvY2ZmL2NmZm9ianMuaCIsCi0gICAgImZyZWV0eXBlL3NyYy9jZmYvY2ZmdHlwZXMuaCIsCi0gICAgImZyZWV0eXBlL3NyYy9jaWQvdHlwZTFjaWQuYyIsCi0gICAgImZyZWV0eXBlL3NyYy9wc2F1eC9wc2F1eC5jIiwKLSAgICAiZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaGludGVyLmMiLAotICAgICJmcmVldHlwZS9zcmMvcHNuYW1lcy9wc21vZHVsZS5jIiwKLSAgICAiZnJlZXR5cGUvc3JjL3Jhc3Rlci9yYXN0ZXIuYyIsCi0gICAgImZyZWV0eXBlL3NyYy9zZm50L3NmbnQuYyIsCi0gICAgImZyZWV0eXBlL3NyYy9zbW9vdGgvc21vb3RoLmMiLAotICAgICJmcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHJ1ZXR5cGUuYyIsCi0gICAgImZyZWV0eXBlL3NyYy90eXBlMS90eXBlMS5jIiwKLSAgXQotICBpZiAocGRmX3VzZV9za2lhIHx8IHBkZl91c2Vfc2tpYV9wYXRocykgewotICAgIHNvdXJjZXMgKz0gWwotICAgICAgImZyZWV0eXBlL3NyYy9iYXNlL2Z0Zm50Zm10LmMiLAotICAgICAgImZyZWV0eXBlL3NyYy9iYXNlL2Z0ZnN0eXBlLmMiLAotICAgICAgImZyZWV0eXBlL3NyYy9iYXNlL2Z0dHlwZTEuYyIsCisgIGNvbmZpZygiZnJlZXR5cGVfcHVibGljX2luY2x1ZGVzX2NvbmZpZyIpIHsKKyAgICAjIFRoZSByZWxhdGl2ZSBmcmVldHlwZS9pbmNsdWRlIHBhdGggcG9pbnRzIHRvIFBERml1bSdzIGN1c3RvbSBjb25maWcuCisgICAgIyBUaGUgYWJzb2x1dGUgcGF0aCBwb2ludHMgdG8gd2hhdGV2ZXIgY29weSBvZiBGcmVlVHlwZSBpcyBpbgorICAgICMgLy90aGlyZF9wYXJ0eS9mcmVldHlwZS4KKyAgICBpbmNsdWRlX2RpcnMgPSBbCisgICAgICAiZnJlZXR5cGUvaW5jbHVkZSIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZSIsCiAgICAgXQorICAgIGRlZmluZXMgPSBbCisgICAgICAjIEdOIGN1cnJlbnRseSBkb2VzIG5vdCBlc2NhcGUgJzwnIGFuZCAnPicgd2hlbiBnZW5lcmF0aW5nIHhtbCBiYXNlZAorICAgICAgIyBWaXN1YWwgU3R1ZGlvIHByb2plY3QgZmlsZXMuIEFzIGEgcmVzdWx0LCB1c2UgcXVvdGVzIGluc3RlYWQgb2YgcG9pbnR5CisgICAgICAjIGJyYWNrZXRzIGluIHRoZXNlIGRlZmluZXMuCisgICAgICAiRlRfQ09ORklHX01PRFVMRVNfSD1cImZyZWV0eXBlLWN1c3RvbS1jb25maWcvZnRtb2R1bGUuaFwiIiwKKyAgICAgICJGVF9DT05GSUdfT1BUSU9OU19IPVwiZnJlZXR5cGUtY3VzdG9tLWNvbmZpZy9mdG9wdGlvbi5oXCIiLAorICAgIF0KKyAgfQorCisgICMgVGVzdHMgbWF5IGxpbmsgYWdhaW5zdCB0aGlzIGV2ZW4gaWYgdGhlIHByb2R1Y3Rpb24gbGlicmFyeSBkb2Vzbid0LAorICAjIHNvIGl0IG5lZWRzIHRvIGJlIHNlcGFyYXRlIGZyb20gaXQuCisgIGp1bWJvX3N0YXRpY19saWJyYXJ5KCJmeF9mcmVldHlwZSIpIHsKKyAgICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KKyAgICBjb25maWdzICs9IFsKKyAgICAgICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpub19jaHJvbWl1bV9jb2RlIiwKKyAgICAgICI6cGRmaXVtX3RoaXJkX3BhcnR5X2NvbmZpZyIsCisKKyAgICAgICMgTXVzdCBiZSBhZnRlciBub19jaHJvbWl1bV9jb2RlIGZvciB3YXJuaW5nIGZsYWdzIHRvIGJlIG9yZGVyZWQgY29ycmVjdGx5LgorICAgICAgIjpmeF9mcmVldHlwZV93YXJuaW5ncyIsCisgICAgXQorCisgICAgcHVibGljX2NvbmZpZ3MgPSBbICI6ZnJlZXR5cGVfcHVibGljX2luY2x1ZGVzX2NvbmZpZyIgXQorCisgICAgZGVmaW5lcyA9IFsgIkZUMl9CVUlMRF9MSUJSQVJZIiBdCisgICAgc291cmNlcyA9IFsKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvcHN0YWJsZXMuaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRoZWFkZXIuaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRzdGRsaWIuaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9mcmVldHlwZS5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2Z0YWR2YW5jLmgiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2luY2x1ZGUvZnJlZXR5cGUvZnRiaXRtYXAuaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9mdGNmZmRydi5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2Z0ZXJyZGVmLmgiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2luY2x1ZGUvZnJlZXR5cGUvZnRlcnJvcnMuaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9mdGZudGZtdC5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z2x5cGguaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9mdGd6aXAuaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmgiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2luY2x1ZGUvZnJlZXR5cGUvZnRpbmNyZW0uaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9mdGxjZGZpbC5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2Z0bGlzdC5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2Z0bW0uaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9mdG1vZGFwaS5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2Z0bW9kZXJyb3IuaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9mdG9ianMuaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9mdG90dmFsLmgiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2luY2x1ZGUvZnJlZXR5cGUvZnRvdXRsbi5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2Z0cmVuZGVyLmgiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2luY2x1ZGUvZnJlZXR5cGUvZnRzaXplcy5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2Z0c25hbWVzLmgiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2luY2x1ZGUvZnJlZXR5cGUvZnRzdHJlYW0uaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9mdHN5c3RlbS5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2Z0dHJpZ29uLmgiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2luY2x1ZGUvZnJlZXR5cGUvZnR0dGRydi5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2Z0dHlwZXMuaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9hdXRvaGludC5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRyaXZlci5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Z2xvYWRyLmgiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRoYXNoLmgiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRtZW1vcnkuaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG9ianMuaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHBpYy5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0cmZvcmsuaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHN0cmVhbS5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dmFsaWQuaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9pbnRlcm5hbC5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmgiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNoaW50cy5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Y2lkLmgiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZmbnRmbXQuaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmdsZGljdC5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2a2Vybi5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2bWV0cmljLmgiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZtbS5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cG9zdG5tLmgiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwcm9wLmgiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2NtYXAuaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzaW5mby5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2c2ZudC5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRjbWFwLmgiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGVuZy5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRnbHlmLmgiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90dHR5cGVzLmgiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2luY2x1ZGUvZnJlZXR5cGUvdDF0YWJsZXMuaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvaW5jbHVkZS9mcmVldHlwZS90dG5hbWVpZC5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9pbmNsdWRlL2ZyZWV0eXBlL3R0dGFibGVzLmgiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2luY2x1ZGUvZnJlZXR5cGUvdHR0YWdzLmgiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2luY2x1ZGUvZnQyYnVpbGQuaCIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc3JjL2Jhc2UvZnRiYXNlLmMiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NyYy9iYXNlL2Z0YmFzZS5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zcmMvYmFzZS9mdGJpdG1hcC5jIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zcmMvYmFzZS9mdGZudGZtdC5jIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zcmMvYmFzZS9mdGdseXBoLmMiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NyYy9iYXNlL2Z0aW5pdC5jIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zcmMvYmFzZS9mdGxjZGZpbC5jIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zcmMvYmFzZS9mdG1tLmMiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NyYy9iYXNlL2Z0c3lzdGVtLmMiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NyYy9jZmYvY2ZmLmMiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NyYy9jZmYvY2Zmb2Jqcy5oIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zcmMvY2ZmL2NmZnR5cGVzLmgiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NyYy9jaWQvdHlwZTFjaWQuYyIsCisgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc3JjL3BzYXV4L3BzYXV4LmMiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NyYy9wc2hpbnRlci9wc2hpbnRlci5jIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zcmMvcHNuYW1lcy9wc21vZHVsZS5jIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zcmMvcmFzdGVyL3Jhc3Rlci5jIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zcmMvc2ZudC9zZm50LmMiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NyYy9zbW9vdGgvc21vb3RoLmMiLAorICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NyYy90cnVldHlwZS90cnVldHlwZS5jIiwKKyAgICAgICIvL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zcmMvdHlwZTEvdHlwZTEuYyIsCisgICAgXQorICAgIGlmIChwZGZfdXNlX3NraWEgfHwgcGRmX3VzZV9za2lhX3BhdGhzKSB7CisgICAgICBzb3VyY2VzICs9IFsKKyAgICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2luY2x1ZGUvZnJlZXR5cGUvZnRzeW50aC5oIiwKKyAgICAgICAgIi8vdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NyYy9iYXNlL2Z0ZnN0eXBlLmMiLAorICAgICAgICAiLy90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc3JjL2Jhc2UvZnR0eXBlMS5jIiwKKyAgICAgIF0KKyAgICB9CiAgIH0KIH0KIApAQCAtMTA4LDcgKzIwMCw3IEBACiAgICAgfQogICB9CiAKLSAgc3RhdGljX2xpYnJhcnkoImZ4X2FnZyIpIHsKKyAganVtYm9fc3RhdGljX2xpYnJhcnkoImZ4X2FnZyIpIHsKICAgICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KICAgICBjb25maWdzICs9IFsKICAgICAgICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpub19jaHJvbWl1bV9jb2RlIiwKQEAgLTE1OCwxMTkgKzI1MCwxMTEgQEAKICAgY29uZmlncyAtPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpjaHJvbWl1bV9jb2RlIiBdCiAgIGNvbmZpZ3MgKz0gWwogICAgICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpub19jaHJvbWl1bV9jb2RlIiwKKyAgICAiLy9idWlsZC9jb25maWcvc2FuaXRpemVyczpjZmlfaWNhbGxfZ2VuZXJhbGl6ZV9wb2ludGVycyIsCiAgICAgIjpwZGZpdW1fdGhpcmRfcGFydHlfY29uZmlnIiwKIAogICAgICMgTXVzdCBiZSBhZnRlciBub19jaHJvbWl1bV9jb2RlIGZvciB3YXJuaW5nIGZsYWdzIHRvIGJlIG9yZGVyZWQgY29ycmVjdGx5LgogICAgICI6ZnhfbGNtczJfd2FybmluZ3MiLAogICBdCiAgIHNvdXJjZXMgPSBbCi0gICAgImxjbXMyLTIuNi9pbmNsdWRlL2xjbXMyLmgiLAotICAgICJsY21zMi0yLjYvaW5jbHVkZS9sY21zMl9wbHVnaW4uaCIsCi0gICAgImxjbXMyLTIuNi9zcmMvY21zY2FtMDIuYyIsCi0gICAgImxjbXMyLTIuNi9zcmMvY21zY2dhdHMuYyIsCi0gICAgImxjbXMyLTIuNi9zcmMvY21zY252cnQuYyIsCi0gICAgImxjbXMyLTIuNi9zcmMvY21zZXJyLmMiLAotICAgICJsY21zMi0yLjYvc3JjL2Ntc2dhbW1hLmMiLAotICAgICJsY21zMi0yLjYvc3JjL2Ntc2dtdC5jIiwKLSAgICAibGNtczItMi42L3NyYy9jbXNoYWxmLmMiLAotICAgICJsY21zMi0yLjYvc3JjL2Ntc2ludHJwLmMiLAotICAgICJsY21zMi0yLjYvc3JjL2Ntc2lvMC5jIiwKLSAgICAibGNtczItMi42L3NyYy9jbXNpbzEuYyIsCi0gICAgImxjbXMyLTIuNi9zcmMvY21zbHV0LmMiLAotICAgICJsY21zMi0yLjYvc3JjL2Ntc21kNS5jIiwKLSAgICAibGNtczItMi42L3NyYy9jbXNtdHJ4LmMiLAotICAgICJsY21zMi0yLjYvc3JjL2Ntc25hbWVkLmMiLAotICAgICJsY21zMi0yLjYvc3JjL2Ntc29wdC5jIiwKLSAgICAibGNtczItMi42L3NyYy9jbXNwYWNrLmMiLAotICAgICJsY21zMi0yLjYvc3JjL2Ntc3Bjcy5jIiwKLSAgICAibGNtczItMi42L3NyYy9jbXNwbHVnaW4uYyIsCi0gICAgImxjbXMyLTIuNi9zcmMvY21zcHMyLmMiLAotICAgICJsY21zMi0yLjYvc3JjL2Ntc3NhbXAuYyIsCi0gICAgImxjbXMyLTIuNi9zcmMvY21zc20uYyIsCi0gICAgImxjbXMyLTIuNi9zcmMvY21zdHlwZXMuYyIsCi0gICAgImxjbXMyLTIuNi9zcmMvY21zdmlydC5jIiwKLSAgICAibGNtczItMi42L3NyYy9jbXN3dHBudC5jIiwKLSAgICAibGNtczItMi42L3NyYy9jbXN4Zm9ybS5jIiwKKyAgICAibGNtcy9pbmNsdWRlL2xjbXMyLmgiLAorICAgICJsY21zL2luY2x1ZGUvbGNtczJfcGx1Z2luLmgiLAorICAgICJsY21zL3NyYy9jbXNhbHBoYS5jIiwKKyAgICAibGNtcy9zcmMvY21zY2FtMDIuYyIsCisgICAgImxjbXMvc3JjL2Ntc2NnYXRzLmMiLAorICAgICJsY21zL3NyYy9jbXNjbnZydC5jIiwKKyAgICAibGNtcy9zcmMvY21zZXJyLmMiLAorICAgICJsY21zL3NyYy9jbXNnYW1tYS5jIiwKKyAgICAibGNtcy9zcmMvY21zZ210LmMiLAorICAgICJsY21zL3NyYy9jbXNoYWxmLmMiLAorICAgICJsY21zL3NyYy9jbXNpbnRycC5jIiwKKyAgICAibGNtcy9zcmMvY21zaW8wLmMiLAorICAgICJsY21zL3NyYy9jbXNpbzEuYyIsCisgICAgImxjbXMvc3JjL2Ntc2x1dC5jIiwKKyAgICAibGNtcy9zcmMvY21zbWQ1LmMiLAorICAgICJsY21zL3NyYy9jbXNtdHJ4LmMiLAorICAgICJsY21zL3NyYy9jbXNuYW1lZC5jIiwKKyAgICAibGNtcy9zcmMvY21zb3B0LmMiLAorICAgICJsY21zL3NyYy9jbXNwYWNrLmMiLAorICAgICJsY21zL3NyYy9jbXNwY3MuYyIsCisgICAgImxjbXMvc3JjL2Ntc3BsdWdpbi5jIiwKKyAgICAibGNtcy9zcmMvY21zcHMyLmMiLAorICAgICJsY21zL3NyYy9jbXNzYW1wLmMiLAorICAgICJsY21zL3NyYy9jbXNzbS5jIiwKKyAgICAibGNtcy9zcmMvY21zdHlwZXMuYyIsCisgICAgImxjbXMvc3JjL2Ntc3ZpcnQuYyIsCisgICAgImxjbXMvc3JjL2Ntc3d0cG50LmMiLAorICAgICJsY21zL3NyYy9jbXN4Zm9ybS5jIiwKICAgXQogfQogCi0jIFRoaXMgaXMgb25seSB1c2VkIGZvciBzdGFuZGFsb25lIGJ1aWxkcy4KLWNvbmZpZygianBlZ193YXJuaW5ncyIpIHsKLSAgdmlzaWJpbGl0eSA9IFsgIjoqIiBdCi0gIGlmIChpc19jbGFuZykgewotICAgIGNmbGFncyA9IFsgIi1Xbm8tc2hpZnQtbmVnYXRpdmUtdmFsdWUiIF0KK2lmICghYnVpbGRfd2l0aF9jaHJvbWl1bSkgeworICBkZWNsYXJlX2FyZ3MoKSB7CisgICAgIyBVc2VzIHN5c3RlbSBsaWJqcGVnLiBJZiB0cnVlLCBvdmVycmlkZXMgdXNlX2xpYmpwZWdfdHVyYm8uCisgICAgdXNlX3N5c3RlbV9saWJqcGVnID0gZmFsc2UKKworICAgICMgVXNlcyBsaWJqcGVnX3R1cmJvIGFzIHRoZSBqcGVnIGltcGxlbWVudGF0aW9uLiBIYXMgbm8gZWZmZWN0IGlmCisgICAgIyB1c2Vfc3lzdGVtX2xpYmpwZWcgaXMgc2V0LgorICAgIHVzZV9saWJqcGVnX3R1cmJvID0gdHJ1ZQorICB9CisKKyAgY29uZmlnKCJzeXN0ZW1fbGlianBlZ19jb25maWciKSB7CisgICAgbGlicyA9IFsgImpwZWciIF0KKyAgICBkZWZpbmVzID0gWyAiVVNFX1NZU1RFTV9MSUJKUEVHIiBdCisgIH0KKworICBjb25maWcoImxpYmpwZWdfdHVyYm9fY29uZmlnIikgeworICAgIGRlZmluZXMgPSBbICJVU0VfTElCSlBFR19UVVJCTz0xIiBdCisgIH0KKworICAjIFRoaXMgaXMgYSBtZXRhIHRhcmdldCB0aGF0IGZvcndhcmRzIHRvIHRoZSBzeXN0ZW0ncyBsaWJqcGVnLAorICAjIHRoaXJkX3BhcnR5L2xpYmpwZWcsIG9yIHRoaXJkX3BhcnR5L2xpYmpwZWdfdHVyYm8gZGVwZW5kaW5nIG9uIHRoZSBidWlsZCBhcmdzCisgICMgZGVjbGFyZWQgaW4gdGhpcyBmaWxlLgorICBncm91cCgianBlZyIpIHsKKyAgICBpZiAodXNlX3N5c3RlbV9saWJqcGVnKSB7CisgICAgICBwdWJsaWNfY29uZmlncyA9IFsgIjpzeXN0ZW1fbGlianBlZ19jb25maWciIF0KKyAgICB9IGVsc2UgaWYgKHVzZV9saWJqcGVnX3R1cmJvKSB7CisgICAgICBwdWJsaWNfZGVwcyA9IFsKKyAgICAgICAgIi8vdGhpcmRfcGFydHkvbGlianBlZ190dXJibzpsaWJqcGVnIiwKKyAgICAgIF0KKyAgICAgIHB1YmxpY19jb25maWdzID0gWyAiOmxpYmpwZWdfdHVyYm9fY29uZmlnIiBdCisgICAgfSBlbHNlIHsKKyAgICAgIHB1YmxpY19kZXBzID0gWworICAgICAgICAiLy90aGlyZF9wYXJ0eS9saWJqcGVnOmxpYmpwZWciLAorICAgICAgXQorICAgIH0KICAgfQogfQogCi1zdGF0aWNfbGlicmFyeSgianBlZyIpIHsKLSAgY29uZmlncyAtPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpjaHJvbWl1bV9jb2RlIiBdCi0gIGNvbmZpZ3MgKz0gWwotICAgICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpub19jaHJvbWl1bV9jb2RlIiwKLSAgICAiOnBkZml1bV90aGlyZF9wYXJ0eV9jb25maWciLAorY29uZmlnKCJzeXN0ZW1femxpYl9jb25maWciKSB7CisgIGxpYnMgPSBbICJ6IiBdCisgIGRlZmluZXMgPSBbICJVU0VfU1lTVEVNX1pMSUIiIF0KK30KIAotICAgICMgTXVzdCBiZSBhZnRlciBub19jaHJvbWl1bV9jb2RlIGZvciB3YXJuaW5nIGZsYWdzIHRvIGJlIG9yZGVyZWQgY29ycmVjdGx5LgotICAgICI6anBlZ193YXJuaW5ncyIsCi0gIF0KLSAgc291cmNlcyA9IFsKLSAgICAibGlianBlZy9jZGVycm9yLmgiLAotICAgICJsaWJqcGVnL2NkanBlZy5oIiwKLSAgICAibGlianBlZy9mcGRmYXBpX2pjYXBpbWluLmMiLAotICAgICJsaWJqcGVnL2ZwZGZhcGlfamNhcGlzdGQuYyIsCi0gICAgImxpYmpwZWcvZnBkZmFwaV9qY2NvZWZjdC5jIiwKLSAgICAibGlianBlZy9mcGRmYXBpX2pjY29sb3IuYyIsCi0gICAgImxpYmpwZWcvZnBkZmFwaV9qY2RjdG1nci5jIiwKLSAgICAibGlianBlZy9mcGRmYXBpX2pjaHVmZi5jIiwKLSAgICAibGlianBlZy9mcGRmYXBpX2pjaW5pdC5jIiwKLSAgICAibGlianBlZy9mcGRmYXBpX2pjbWFpbmN0LmMiLAotICAgICJsaWJqcGVnL2ZwZGZhcGlfamNtYXJrZXIuYyIsCi0gICAgImxpYmpwZWcvZnBkZmFwaV9qY21hc3Rlci5jIiwKLSAgICAibGlianBlZy9mcGRmYXBpX2pjb21hcGkuYyIsCi0gICAgImxpYmpwZWcvZnBkZmFwaV9qY3BhcmFtLmMiLAotICAgICJsaWJqcGVnL2ZwZGZhcGlfamNwaHVmZi5jIiwKLSAgICAibGlianBlZy9mcGRmYXBpX2pjcHJlcGN0LmMiLAotICAgICJsaWJqcGVnL2ZwZGZhcGlfamNzYW1wbGUuYyIsCi0gICAgImxpYmpwZWcvZnBkZmFwaV9qY3RyYW5zLmMiLAotICAgICJsaWJqcGVnL2ZwZGZhcGlfamRhcGltaW4uYyIsCi0gICAgImxpYmpwZWcvZnBkZmFwaV9qZGFwaXN0ZC5jIiwKLSAgICAibGlianBlZy9mcGRmYXBpX2pkY29lZmN0LmMiLAotICAgICJsaWJqcGVnL2ZwZGZhcGlfamRjb2xvci5jIiwKLSAgICAibGlianBlZy9mcGRmYXBpX2pkZGN0bWdyLmMiLAotICAgICJsaWJqcGVnL2ZwZGZhcGlfamRodWZmLmMiLAotICAgICJsaWJqcGVnL2ZwZGZhcGlfamRpbnB1dC5jIiwKLSAgICAibGlianBlZy9mcGRmYXBpX2pkbWFpbmN0LmMiLAotICAgICJsaWJqcGVnL2ZwZGZhcGlfamRtYXJrZXIuYyIsCi0gICAgImxpYmpwZWcvZnBkZmFwaV9qZG1hc3Rlci5jIiwKLSAgICAibGlianBlZy9mcGRmYXBpX2pkbWVyZ2UuYyIsCi0gICAgImxpYmpwZWcvZnBkZmFwaV9qZHBodWZmLmMiLAotICAgICJsaWJqcGVnL2ZwZGZhcGlfamRwb3N0Y3QuYyIsCi0gICAgImxpYmpwZWcvZnBkZmFwaV9qZHNhbXBsZS5jIiwKLSAgICAibGlianBlZy9mcGRmYXBpX2pkdHJhbnMuYyIsCi0gICAgImxpYmpwZWcvZnBkZmFwaV9qZXJyb3IuYyIsCi0gICAgImxpYmpwZWcvZnBkZmFwaV9qZmRjdGZzdC5jIiwKLSAgICAibGlianBlZy9mcGRmYXBpX2pmZGN0aW50LmMiLAotICAgICJsaWJqcGVnL2ZwZGZhcGlfamlkY3Rmc3QuYyIsCi0gICAgImxpYmpwZWcvZnBkZmFwaV9qaWRjdGludC5jIiwKLSAgICAibGlianBlZy9mcGRmYXBpX2ppZGN0cmVkLmMiLAotICAgICJsaWJqcGVnL2ZwZGZhcGlfam1lbW1nci5jIiwKLSAgICAibGlianBlZy9mcGRmYXBpX2ptZW1ub2JzLmMiLAotICAgICJsaWJqcGVnL2ZwZGZhcGlfanV0aWxzLmMiLAotICAgICJsaWJqcGVnL2pjaHVmZi5oIiwKLSAgICAibGlianBlZy9qY29uZmlnLmgiLAotICAgICJsaWJqcGVnL2pkY3QuaCIsCi0gICAgImxpYmpwZWcvamRodWZmLmgiLAotICAgICJsaWJqcGVnL2plcnJvci5oIiwKLSAgICAibGlianBlZy9qaW5jbHVkZS5oIiwKLSAgICAibGlianBlZy9qbWVtc3lzLmgiLAotICAgICJsaWJqcGVnL2ptb3JlY2ZnLmgiLAotICAgICJsaWJqcGVnL2pwZWdpbnQuaCIsCi0gICAgImxpYmpwZWcvanBlZ2xpYi5oIiwKLSAgICAibGlianBlZy9qdmVyc2lvbi5oIiwKLSAgICAibGlianBlZy9tYWtlZmlsZSIsCi0gICAgImxpYmpwZWcvdHJhbnN1cHAuaCIsCi0gIF0KLSAgZGVwcyA9IFsKLSAgICAiLi46ZnhjcnQiLAotICBdCitncm91cCgiemxpYiIpIHsKKyAgaWYgKHVzZV9zeXN0ZW1femxpYikgeworICAgIHB1YmxpY19jb25maWdzID0gWyAiOnN5c3RlbV96bGliX2NvbmZpZyIgXQorICB9IGVsc2UgeworICAgIHB1YmxpY19kZXBzID0gWworICAgICAgIi8vdGhpcmRfcGFydHkvemxpYiIsCisgICAgXQorICB9Cit9CisKK2lmICh1c2Vfc3lzdGVtX2xjbXMyKSB7CisgIHBrZ19jb25maWcoImxjbXMyX2Zyb21fcGtnY29uZmlnIikgeworICAgIGRlZmluZXMgPSBbICJVU0VfU1lTVEVNX0xDTVMyIiBdCisgICAgcGFja2FnZXMgPSBbICJsY21zMiIgXQorICB9Cit9Citncm91cCgibGNtczIiKSB7CisgIGlmICh1c2Vfc3lzdGVtX2xjbXMyKSB7CisgICAgcHVibGljX2NvbmZpZ3MgPSBbICI6bGNtczJfZnJvbV9wa2djb25maWciIF0KKyAgfSBlbHNlIHsKKyAgICBwdWJsaWNfZGVwcyA9IFsKKyAgICAgICI6ZnhfbGNtczIiLAorICAgIF0KKyAgfQogfQogCiBjb25maWcoImZ4X2xpYm9wZW5qcGVnX3dhcm5pbmdzIikgewpAQCAtMzA3LDE1ICszOTEsMzIgQEAKICAgICAibGlib3BlbmpwZWcyMC9vcGVuanBlZy5jIiwKICAgICAibGlib3BlbmpwZWcyMC9vcGpfY2xvY2suYyIsCiAgICAgImxpYm9wZW5qcGVnMjAvcGkuYyIsCi0gICAgImxpYm9wZW5qcGVnMjAvcmF3LmMiLAorICAgICJsaWJvcGVuanBlZzIwL3NwYXJzZV9hcnJheS5jIiwKKyAgICAibGlib3BlbmpwZWcyMC9zcGFyc2VfYXJyYXkuaCIsCiAgICAgImxpYm9wZW5qcGVnMjAvdDEuYyIsCiAgICAgImxpYm9wZW5qcGVnMjAvdDIuYyIsCiAgICAgImxpYm9wZW5qcGVnMjAvdGNkLmMiLAogICAgICJsaWJvcGVuanBlZzIwL3RndC5jIiwKKyAgICAibGlib3BlbmpwZWcyMC90aHJlYWQuYyIsCiAgIF0KIH0KIAotc3RhdGljX2xpYnJhcnkoImZ4X2xwbmciKSB7Citjb25maWcoInN5c3RlbV9saWJwbmdfY29uZmlnIikgeworICBsaWJzID0gWyAicG5nIiBdCisgIGRlZmluZXMgPSBbICJVU0VfU1lTVEVNX0xJQlBORyIgXQorfQorCitncm91cCgicG5nIikgeworICBpZiAodXNlX3N5c3RlbV9saWJwbmcpIHsKKyAgICBwdWJsaWNfY29uZmlncyA9IFsgIjpzeXN0ZW1fbGlicG5nX2NvbmZpZyIgXQorICB9IGVsc2UgeworICAgIHB1YmxpY19kZXBzID0gWworICAgICAgIjpmeF9scG5nIiwKKyAgICBdCisgIH0KK30KKworanVtYm9fc3RhdGljX2xpYnJhcnkoImZ4X2xwbmciKSB7CiAgIGNvbmZpZ3MgLT0gWyAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6Y2hyb21pdW1fY29kZSIgXQogICBjb25maWdzICs9IFsKICAgICAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6bm9fY2hyb21pdW1fY29kZSIsCkBAIC0zNDksNiArNDUwLDkgQEAKIAogICBkZWZpbmVzID0gW10KICAgY2ZsYWdzID0gW10KKyAgZGVwcyA9IFsKKyAgICAiOnpsaWIiLAorICBdCiAKICAgaWYgKGN1cnJlbnRfY3B1ID09ICJ4ODYiIHx8IGN1cnJlbnRfY3B1ID09ICJ4NjQiKSB7CiAgICAgc291cmNlcyArPSBbCkBAIC0zODYsNiArNDkwLDcgQEAKICAgICAgIGNvbmZpZ3MgLT0gWyAiLy9idWlsZC9jb25maWcvd2luOmxlYW5fYW5kX21lYW4iIF0KICAgICB9CiAgICAgZGVwcyA9IFsKKyAgICAgICI6emxpYiIsCiAgICAgICAiLy90aGlyZF9wYXJ0eTpqcGVnIiwKICAgICBdCiAgICAgc291cmNlcyA9IFsKQEAgLTQzMCw1NyArNTM1LDM2IEBACiAgIH0KIH0KIAotIyBUT0RPKGRzaW5jbGFpcik6IFJlbW92ZSBpZiBmaXhlZCB1cHN0cmVhbS4gaHR0cHM6Ly9jcmJ1Zy5jb20vNTA3NzEyCi1jb25maWcoImZ4X3psaWJfd2FybmluZ3MiKSB7Ci0gIHZpc2liaWxpdHkgPSBbICI6KiIgXQotICBpZiAoaXNfY2xhbmcpIHsKLSAgICBjZmxhZ3MgPSBbICItV25vLXNoaWZ0LW5lZ2F0aXZlLXZhbHVlIiBdCi0gIH0KLX0KLQotc3RhdGljX2xpYnJhcnkoImZ4X3psaWIiKSB7Ci0gIGNvbmZpZ3MgLT0gWyAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6Y2hyb21pdW1fY29kZSIgXQotICBjb25maWdzICs9IFsKLSAgICAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6bm9fY2hyb21pdW1fY29kZSIsCi0gICAgIjpwZGZpdW1fdGhpcmRfcGFydHlfY29uZmlnIiwKLQotICAgICMgTXVzdCBiZSBhZnRlciBub19jaHJvbWl1bV9jb2RlIGZvciB3YXJuaW5nIGZsYWdzIHRvIGJlIG9yZGVyZWQgY29ycmVjdGx5LgotICAgICI6ZnhfemxpYl93YXJuaW5ncyIsCi0gIF0KLSAgc291cmNlcyA9IFsKLSAgICAiemxpYl92MTI4L2FkbGVyMzIuYyIsCi0gICAgInpsaWJfdjEyOC9jb21wcmVzcy5jIiwKLSAgICAiemxpYl92MTI4L2NyYzMyLmMiLAotICAgICJ6bGliX3YxMjgvZGVmbGF0ZS5jIiwKLSAgICAiemxpYl92MTI4L2d6Y2xvc2UuYyIsCi0gICAgInpsaWJfdjEyOC9nemxpYi5jIiwKLSAgICAiemxpYl92MTI4L2d6cmVhZC5jIiwKLSAgICAiemxpYl92MTI4L2d6d3JpdGUuYyIsCi0gICAgInpsaWJfdjEyOC9pbmZiYWNrLmMiLAotICAgICJ6bGliX3YxMjgvaW5mZmFzdC5jIiwKLSAgICAiemxpYl92MTI4L2luZmxhdGUuYyIsCi0gICAgInpsaWJfdjEyOC9pbmZ0cmVlcy5jIiwKLSAgICAiemxpYl92MTI4L3RyZWVzLmMiLAotICAgICJ6bGliX3YxMjgvdW5jb21wci5jIiwKLSAgICAiemxpYl92MTI4L3p1dGlsLmMiLAotICBdCi19Ci0KLSMgQ2FuIG5vdCBiZSBhIHN0YXRpYyBsaWJyYXJ5IGR1ZSB0byBsYWNrIG9mIC5jYyBmaWxlcy4KLXNvdXJjZV9zZXQoInBkZml1bV9iYXNlIikgeworanVtYm9fc291cmNlX3NldCgicGRmaXVtX2Jhc2UiKSB7CiAgIGNvbmZpZ3MgLT0gWyAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6Y2hyb21pdW1fY29kZSIgXQogICBjb25maWdzICs9IFsKICAgICAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6bm9fY2hyb21pdW1fY29kZSIsCiAgICAgIjpwZGZpdW1fdGhpcmRfcGFydHlfY29uZmlnIiwKICAgXQogICBzb3VyY2VzID0gWworICAgICJiYXNlL2FsbG9jYXRvci9wYXJ0aXRpb25fYWxsb2NhdG9yL2FkZHJlc3Nfc3BhY2VfcmFuZG9taXphdGlvbi5jYyIsCisgICAgImJhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvYWRkcmVzc19zcGFjZV9yYW5kb21pemF0aW9uLmgiLAorICAgICJiYXNlL2FsbG9jYXRvci9wYXJ0aXRpb25fYWxsb2NhdG9yL29vbS5oIiwKKyAgICAiYmFzZS9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jYXRvci9wYWdlX2FsbG9jYXRvci5jYyIsCisgICAgImJhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvcGFnZV9hbGxvY2F0b3IuaCIsCisgICAgImJhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jLmNjIiwKKyAgICAiYmFzZS9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jYXRvci9wYXJ0aXRpb25fYWxsb2MuaCIsCisgICAgImJhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3Ivc3Bpbl9sb2NrLmNjIiwKKyAgICAiYmFzZS9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jYXRvci9zcGluX2xvY2suaCIsCisgICAgImJhc2UvYmFzZV9leHBvcnQuaCIsCisgICAgImJhc2UvYml0cy5oIiwKKyAgICAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIiwKICAgICAiYmFzZS9sb2dnaW5nLmgiLAogICAgICJiYXNlL21hY3Jvcy5oIiwKICAgICAiYmFzZS9udW1lcmljcy9zYWZlX2NvbnZlcnNpb25zLmgiLAogICAgICJiYXNlL251bWVyaWNzL3NhZmVfY29udmVyc2lvbnNfaW1wbC5oIiwKICAgICAiYmFzZS9udW1lcmljcy9zYWZlX21hdGguaCIsCiAgICAgImJhc2UvbnVtZXJpY3Mvc2FmZV9tYXRoX2ltcGwuaCIsCisgICAgImJhc2Uvb3B0aW9uYWwuaCIsCiAgICAgImJhc2UvcHRyX3V0aWwuaCIsCiAgICAgImJhc2Uvc3RsX3V0aWwuaCIsCisgICAgImJhc2Uvc3lzX2J5dGVvcmRlci5oIiwKKyAgICAiYmFzZS90ZW1wbGF0ZV91dGlsLmgiLAorICAgICJidWlsZC9idWlsZF9jb25maWcuaCIsCiAgIF0KIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L0RFUFMgYi90aGlyZF9wYXJ0eS9ERVBTCmluZGV4IGMyYTNhZGQuLjkzY2ExYTAgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L0RFUFMKKysrIGIvdGhpcmRfcGFydHkvREVQUwpAQCAtMSw3ICsxLDcgQEAKIGluY2x1ZGVfcnVsZXMgPSBbCiAgICMgQSBsb3Qgb2YgdGhpcmRfcGFydHkgY29kZSBoYXMgYmVlbiBtb2RpZmllZCB0byB1c2UgZnhjcnQuCi0gICcrY29yZS9meGNydC9meF9iYXNpYy5oJywKICAgJytjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgnLAogICAnK2NvcmUvZnhjcnQvZnhfbWVtb3J5LmgnLAogICAnK2NvcmUvZnhjcnQvZnhfc3lzdGVtLmgnLAorICAnK2J1aWxkJywKIF0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FnZzIzLzAwMDAtYnVnLTQ2Ni5wYXRjaCBiL3RoaXJkX3BhcnR5L2FnZzIzLzAwMDAtYnVnLTQ2Ni5wYXRjaAppbmRleCAzMjE3YjM4Li5lNzYxMTk4IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hZ2cyMy8wMDAwLWJ1Zy00NjYucGF0Y2gKKysrIGIvdGhpcmRfcGFydHkvYWdnMjMvMDAwMC1idWctNDY2LnBhdGNoCkBAIC00LDcgKzQsNyBAQAogKysrIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX21hdGhfc3Ryb2tlLmgKIEBAIC02MCwyOCArNjAsMzAgQEAgdm9pZCBzdHJva2VfY2FsY19hcmMoVmVydGV4Q29uc3VtZXImIG91dF92ZXJ0aWNlcywKICAgICAgfQotICAgICBkYSA9IEZYU1lTX2Fjb3Mod2lkdGggLyAod2lkdGggKyAoKDEuMGYgLyA4KSAvIGFwcHJveGltYXRpb25fc2NhbGUpKSkgKiAyOworICAgICBkYSA9IGFjb3Mod2lkdGggLyAod2lkdGggKyAoKDEuMGYgLyA4KSAvIGFwcHJveGltYXRpb25fc2NhbGUpKSkgKiAyOwogICAgICBvdXRfdmVydGljZXMuYWRkKGNvb3JkX3R5cGUoeCArIGR4MSwgeSArIGR5MSkpOwogLSAgICBpZighY2N3KSB7CiAtICAgICAgICBpZihhMSA+IGEyKSB7CkBAIC0xOCw4ICsxOCw4IEBACiAgICAgICAgICBhMSArPSBkYTsKIC0gICAgICAgIHdoaWxlKGExIDwgYTIpIHsKICsgICAgICAgIHdoaWxlIChhMSA8IGEyKSB7Ci0gICAgICAgICAgIG91dF92ZXJ0aWNlcy5hZGQoY29vcmRfdHlwZSh4ICsgKHdpZHRoICogRlhTWVNfY29zKGExKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ICsgKHdpZHRoICogRlhTWVNfc2luKGExKSkpKTsKKyAgICAgICAgICAgb3V0X3ZlcnRpY2VzLmFkZChjb29yZF90eXBlKHggKyAod2lkdGggKiBjb3MoYTEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgKyAod2lkdGggKiBzaW4oYTEpKSkpOwogLSAgICAgICAgICAgIGExICs9IGRhOwogKyAgICAgICAgICBhMSArPSBkYTsKICAgICAgICAgIH0KQEAgLTM0LDggKzM0LDggQEAKICAgICAgICAgIGExIC09IGRhOwogLSAgICAgICAgd2hpbGUoYTEgPiBhMikgewogKyAgICAgICAgd2hpbGUgKGExID4gYTIpIHsKLSAgICAgICAgICAgb3V0X3ZlcnRpY2VzLmFkZChjb29yZF90eXBlKHggKyAod2lkdGggKiBGWFNZU19jb3MoYTEpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgKyAod2lkdGggKiBGWFNZU19zaW4oYTEpKSkpOworICAgICAgICAgICBvdXRfdmVydGljZXMuYWRkKGNvb3JkX3R5cGUoeCArICh3aWR0aCAqIGNvcyhhMSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSArICh3aWR0aCAqIHNpbihhMSkpKSk7CiAtICAgICAgICAgICAgYTEgLT0gZGE7CiArICAgICAgICAgIGExIC09IGRhOwogICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWdnMjMvMDAwMS1nY2Mtd2FybmluZy5wYXRjaCBiL3RoaXJkX3BhcnR5L2FnZzIzLzAwMDEtZ2NjLXdhcm5pbmcucGF0Y2gKaW5kZXggNzU5Njk2ZS4uM2JkY2U2NSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWdnMjMvMDAwMS1nY2Mtd2FybmluZy5wYXRjaAorKysgYi90aGlyZF9wYXJ0eS9hZ2cyMy8wMDAxLWdjYy13YXJuaW5nLnBhdGNoCkBAIC00LDcgKzQsNyBAQAogKysrIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX3BhdGhfc3RvcmFnZS5oCiBAQCAtMzgsOSArMzgsOSBAQCBwdWJsaWM6CiAgICAgICAgICB9Ci0gICAgICAgICB1bnNpZ25lZCB2ZXJ0ZXgoRlhfRkxPQVQqIHgsIEZYX0ZMT0FUKiB5KQorICAgICAgICAgdW5zaWduZWQgdmVydGV4KGZsb2F0KiB4LCBmbG9hdCogeSkKICAgICAgICAgIHsKIC0gICAgICAgICAgICByZXR1cm4gKG1fdmVydGV4X2lkeCA8IG1fcGF0aC0+dG90YWxfdmVydGljZXMoKSkgPwogLSAgICAgICAgICAgICAgICAgICBtX3BhdGgtPnZlcnRleChtX3ZlcnRleF9pZHgrKywgeCwgeSkgOgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWdnMjMvMDAwMi11YnNhbi1lcnJvci1maXhlcy5wYXRjaCBiL3RoaXJkX3BhcnR5L2FnZzIzLzAwMDItdWJzYW4tZXJyb3ItZml4ZXMucGF0Y2gKaW5kZXggMDBjZWQwMC4uNThiMTdkYyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWdnMjMvMDAwMi11YnNhbi1lcnJvci1maXhlcy5wYXRjaAorKysgYi90aGlyZF9wYXJ0eS9hZ2cyMy8wMDAyLXVic2FuLWVycm9yLWZpeGVzLnBhdGNoCkBAIC0xMywyMSArMTMsMjEgQEAKIEBAIC0zNiw4ICszNywxOCBAQCBpbmxpbmUgdW5zaWduZWQgY2xpcF9saWFuZ19iYXJza3koVCB4MSwgVCB5MSwgVCB4MiwgVCB5MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCogeCwgVCogeSkKICB7Ci0gICAgIGNvbnN0IEZYX0ZMT0FUIG5lYXJ6ZXJvID0gMWUtMzBmOwotLSAgICBGWF9GTE9BVCBkZWx0YXggPSAoRlhfRkxPQVQpKHgyIC0geDEpOwotLSAgICBGWF9GTE9BVCBkZWx0YXkgPSAoRlhfRkxPQVQpKHkyIC0geTEpOworICAgICBjb25zdCBmbG9hdCBuZWFyemVybyA9IDFlLTMwZjsKKy0gICAgZmxvYXQgZGVsdGF4ID0gKGZsb2F0KSh4MiAtIHgxKTsKKy0gICAgZmxvYXQgZGVsdGF5ID0gKGZsb2F0KSh5MiAtIHkxKTsKICsKLSsgICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxGWF9GTE9BVD4gd2lkdGggPSB4MjsKKysgICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxmbG9hdD4gd2lkdGggPSB4MjsKICsgICAgd2lkdGggLT0geDE7CiArICAgIGlmICghd2lkdGguSXNWYWxpZCgpKQogKyAgICAgICAgcmV0dXJuIDA7Ci0rICAgIHBkZml1bTo6YmFzZTo6Q2hlY2tlZE51bWVyaWM8RlhfRkxPQVQ+IGhlaWdodCA9IHkyOworKyAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPGZsb2F0PiBoZWlnaHQgPSB5MjsKICsgICAgaGVpZ2h0IC09IHkxOwogKyAgICBpZiAoIWhlaWdodC5Jc1ZhbGlkKCkpCiArICAgICAgICByZXR1cm4gMDsKICsKLSsgICAgRlhfRkxPQVQgZGVsdGF4ID0gd2lkdGguVmFsdWVPckRlZmF1bHQoMCk7Ci0rICAgIEZYX0ZMT0FUIGRlbHRheSA9IGhlaWdodC5WYWx1ZU9yRGVmYXVsdCgwKTsKKysgICAgZmxvYXQgZGVsdGF4ID0gd2lkdGguVmFsdWVPckRlZmF1bHQoMCk7CisrICAgIGZsb2F0IGRlbHRheSA9IGhlaWdodC5WYWx1ZU9yRGVmYXVsdCgwKTsKICAgICAgdW5zaWduZWQgbnAgPSAwOwogICAgICBpZihkZWx0YXggPT0gMCkgewogICAgICAgICAgZGVsdGF4ID0gKHgxID4gY2xpcF9ib3gueDEpID8gLW5lYXJ6ZXJvIDogbmVhcnplcm87CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfYXJyYXkuaCBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19hcnJheS5oCmluZGV4IDIwNGFlMmUuLmQ1MjFiMDQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19hcnJheS5oCisrKyBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19hcnJheS5oCkBAIC00MCwxMCArNDAsNyBAQAogICAgIH0KICAgICB2b2lkIGFsbG9jYXRlKHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIGV4dHJhX3RhaWwgPSAwKTsKICAgICB2b2lkIHJlc2l6ZSh1bnNpZ25lZCBuZXdfc2l6ZSk7Ci0gICAgdm9pZCB6ZXJvKCkKLSAgICB7Ci0gICAgICAgIEZYU1lTX21lbXNldChtX2FycmF5LCAwLCBzaXplb2YoVCkgKiBtX3NpemUpOwotICAgIH0KKyAgICB2b2lkIHplcm8oKSB7IG1lbXNldChtX2FycmF5LCAwLCBzaXplb2YoVCkgKiBtX3NpemUpOyB9CiAgICAgdm9pZCBhZGQoY29uc3QgVCYgdikKICAgICB7CiAgICAgICAgIG1fYXJyYXlbbV9zaXplKytdID0gdjsKQEAgLTEzMCw3ICsxMjcsNyBAQAogICAgIGlmKG5ld19zaXplID4gbV9zaXplKSB7CiAgICAgICAgIGlmKG5ld19zaXplID4gbV9jYXBhY2l0eSkgewogICAgICAgICAgICAgVCogZGF0YSA9IEZYX0FsbG9jKFQsIG5ld19zaXplKTsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShkYXRhLCBtX2FycmF5LCBtX3NpemUgKiBzaXplb2YoVCkpOworICAgICAgICAgICAgbWVtY3B5KGRhdGEsIG1fYXJyYXksIG1fc2l6ZSAqIHNpemVvZihUKSk7CiAgICAgICAgICAgICBGWF9GcmVlKG1fYXJyYXkpOwogICAgICAgICAgICAgbV9hcnJheSA9IGRhdGE7CiAgICAgICAgIH0KQEAgLTE0NSwxNCArMTQyLDE0IEBACiAgICAgbV9jYXBhY2l0eSh2Lm1fY2FwYWNpdHkpLAogICAgIG1fYXJyYXkodi5tX2NhcGFjaXR5ID8gRlhfQWxsb2MoVCwgdi5tX2NhcGFjaXR5KSA6IDApCiB7Ci0gICAgRlhTWVNfbWVtY3B5KG1fYXJyYXksIHYubV9hcnJheSwgc2l6ZW9mKFQpICogdi5tX3NpemUpOworICBtZW1jcHkobV9hcnJheSwgdi5tX2FycmF5LCBzaXplb2YoVCkgKiB2Lm1fc2l6ZSk7CiB9CiB0ZW1wbGF0ZTxjbGFzcyBUPiBjb25zdCBwb2RfYXJyYXk8VD4mCiBwb2RfYXJyYXk8VD46Om9wZXJhdG9yID0gKGNvbnN0IHBvZF9hcnJheTxUPiZ2KQogewogICAgIGFsbG9jYXRlKHYubV9zaXplKTsKICAgICBpZih2Lm1fc2l6ZSkgewotICAgICAgICBGWFNZU19tZW1jcHkobV9hcnJheSwgdi5tX2FycmF5LCBzaXplb2YoVCkgKiB2Lm1fc2l6ZSk7CisgICAgICBtZW1jcHkobV9hcnJheSwgdi5tX2FycmF5LCBzaXplb2YoVCkgKiB2Lm1fc2l6ZSk7CiAgICAgfQogICAgIHJldHVybiAqdGhpczsKIH0KQEAgLTMyMiw3ICszMTksNyBAQAogICAgIHVuc2lnbmVkIGk7CiAgICAgZm9yKGkgPSAwOyBpIDwgdi5tX251bV9ibG9ja3M7ICsraSkgewogICAgICAgICBtX2Jsb2Nrc1tpXSA9IEZYX0FsbG9jKFQsIGJsb2NrX3NpemUpOwotICAgICAgICBGWFNZU19tZW1jcHkobV9ibG9ja3NbaV0sIHYubV9ibG9ja3NbaV0sIGJsb2NrX3NpemUgKiBzaXplb2YoVCkpOworICAgICAgICBtZW1jcHkobV9ibG9ja3NbaV0sIHYubV9ibG9ja3NbaV0sIGJsb2NrX3NpemUgKiBzaXplb2YoVCkpOwogICAgIH0KIH0KIHRlbXBsYXRlPGNsYXNzIFQsIHVuc2lnbmVkIFM+CkBAIC0zMzMsNyArMzMwLDcgQEAKICAgICAgICAgYWxsb2NhdGVfYmxvY2soaSk7CiAgICAgfQogICAgIGZvcihpID0gMDsgaSA8IHYubV9udW1fYmxvY2tzOyArK2kpIHsKLSAgICAgICAgRlhTWVNfbWVtY3B5KG1fYmxvY2tzW2ldLCB2Lm1fYmxvY2tzW2ldLCBibG9ja19zaXplICogc2l6ZW9mKFQpKTsKKyAgICAgIG1lbWNweShtX2Jsb2Nrc1tpXSwgdi5tX2Jsb2Nrc1tpXSwgYmxvY2tfc2l6ZSAqIHNpemVvZihUKSk7CiAgICAgfQogICAgIG1fc2l6ZSA9IHYubV9zaXplOwogICAgIHJldHVybiAqdGhpczsKQEAgLTM0NCwxMCArMzQxLDggQEAKICAgICBpZihuYiA+PSBtX21heF9ibG9ja3MpIHsKICAgICAgICAgVCoqIG5ld19ibG9ja3MgPSBGWF9BbGxvYyhUKiwgbV9tYXhfYmxvY2tzICsgbV9ibG9ja19wdHJfaW5jKTsKICAgICAgICAgaWYobV9ibG9ja3MpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShuZXdfYmxvY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1fYmxvY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1fbnVtX2Jsb2NrcyAqIHNpemVvZihUKikpOwotICAgICAgICAgICAgRlhfRnJlZShtX2Jsb2Nrcyk7CisgICAgICAgICAgbWVtY3B5KG5ld19ibG9ja3MsIG1fYmxvY2tzLCBtX251bV9ibG9ja3MgKiBzaXplb2YoVCopKTsKKyAgICAgICAgICBGWF9GcmVlKG1fYmxvY2tzKTsKICAgICAgICAgfQogICAgICAgICBtX2Jsb2NrcyA9IG5ld19ibG9ja3M7CiAgICAgICAgIG1fbWF4X2Jsb2NrcyArPSBtX2Jsb2NrX3B0cl9pbmM7CkBAIC00NzYsMTAgKzQ3MSw4IEBACiAgICAgICAgIGlmKG1fbnVtX2Jsb2NrcyA+PSBtX21heF9ibG9ja3MpIHsKICAgICAgICAgICAgIGludDh1KiogbmV3X2Jsb2NrcyA9IEZYX0FsbG9jKGludDh1KiwgbV9tYXhfYmxvY2tzICsgbV9ibG9ja19wdHJfaW5jKTsKICAgICAgICAgICAgIGlmKG1fYmxvY2tzKSB7Ci0gICAgICAgICAgICAgICAgRlhTWVNfbWVtY3B5KG5ld19ibG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYmxvY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX251bV9ibG9ja3MgKiBzaXplb2YoaW50OHUqKSk7Ci0gICAgICAgICAgICAgICAgRlhfRnJlZShtX2Jsb2Nrcyk7CisgICAgICAgICAgICAgIG1lbWNweShuZXdfYmxvY2tzLCBtX2Jsb2NrcywgbV9udW1fYmxvY2tzICogc2l6ZW9mKGludDh1KikpOworICAgICAgICAgICAgICBGWF9GcmVlKG1fYmxvY2tzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1fYmxvY2tzID0gbmV3X2Jsb2NrczsKICAgICAgICAgICAgIG1fbWF4X2Jsb2NrcyArPSBtX2Jsb2NrX3B0cl9pbmM7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfYmFzaWNzLmggYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfYmFzaWNzLmgKaW5kZXggNTJhNjU4ZS4uZmMxNTU1NiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWdnMjMvYWdnX2Jhc2ljcy5oCisrKyBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19iYXNpY3MuaApAQCAtNDEsNyArNDEsNyBAQAogI2VuZGlmCiAjZGVmaW5lIEFHR19JTkxJTkUgaW5saW5lCiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIiAgLy8gRm9yIEZYX0ZMT0FUCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKIAogbmFtZXNwYWNlIGFnZwogewpAQCAtMTQzLDcgKzE0Myw3IEBACiAgICAgcmV0dXJuIHI7CiB9CiB0eXBlZGVmIHJlY3RfYmFzZTxpbnQ+ICAgIHJlY3Q7Ci10eXBlZGVmIHJlY3RfYmFzZTxGWF9GTE9BVD4gcmVjdF9kOwordHlwZWRlZiByZWN0X2Jhc2U8ZmxvYXQ+IHJlY3RfZDsKIGVudW0gcGF0aF9jb21tYW5kc19lIHsKICAgICBwYXRoX2NtZF9zdG9wICAgICA9IDAsCiAgICAgcGF0aF9jbWRfbW92ZV90byAgPSAxLApAQCAtMjYxLDEwICsyNjEsMTAgQEAKICAgICByZXR1cm4gY2xlYXJfb3JpZW50YXRpb24oYykgfCBvOwogfQogc3RydWN0IHBvaW50X3R5cGUgIHsKLSAgICBGWF9GTE9BVCB4LCB5OworICAgIGZsb2F0IHgsIHk7CiAgICAgdW5zaWduZWQgZmxhZzsKICAgICBwb2ludF90eXBlKCkge30KLSAgICBwb2ludF90eXBlKEZYX0ZMT0FUIHhfLCBGWF9GTE9BVCB5XywgdW5zaWduZWQgZmxhZ18gPSAwKSA6IHgoeF8pLCB5KHlfKSwgZmxhZyhmbGFnXykge30KKyAgICBwb2ludF90eXBlKGZsb2F0IHhfLCBmbG9hdCB5XywgdW5zaWduZWQgZmxhZ18gPSAwKSA6IHgoeF8pLCB5KHlfKSwgZmxhZyhmbGFnXykge30KIH07CiBzdHJ1Y3QgcG9pbnRfdHlwZV9mbGFnIDogcHVibGljIHBvaW50X3R5cGUgewogICAgIHVuc2lnbmVkIGZsYWc7CkBAIC0yNzIsMTMgKzI3MiwxMyBAQAogICAgIHsKICAgICAgICAgZmxhZyA9IDA7CiAgICAgfQotICAgIHBvaW50X3R5cGVfZmxhZyhGWF9GTE9BVCB4XywgRlhfRkxPQVQgeV8sIHVuc2lnbmVkIGZsYWdfID0gMCkgOiBwb2ludF90eXBlKHhfLCB5XyksIGZsYWcoZmxhZ18pIHt9CisgICAgcG9pbnRfdHlwZV9mbGFnKGZsb2F0IHhfLCBmbG9hdCB5XywgdW5zaWduZWQgZmxhZ18gPSAwKSA6IHBvaW50X3R5cGUoeF8sIHlfKSwgZmxhZyhmbGFnXykge30KIH07CiBzdHJ1Y3QgdmVydGV4X3R5cGUgIHsKLSAgICBGWF9GTE9BVCAgIHgsIHk7CisgICAgZmxvYXQgICB4LCB5OwogICAgIHVuc2lnbmVkIGNtZDsKICAgICB2ZXJ0ZXhfdHlwZSgpIHt9Ci0gICAgdmVydGV4X3R5cGUoRlhfRkxPQVQgeF8sIEZYX0ZMT0FUIHlfLCB1bnNpZ25lZCBjbWRfKSA6CisgICAgdmVydGV4X3R5cGUoZmxvYXQgeF8sIGZsb2F0IHlfLCB1bnNpZ25lZCBjbWRfKSA6CiAgICAgICAgIHgoeF8pLCB5KHlfKSwgY21kKGNtZF8pIHt9CiB9OwogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWdnMjMvYWdnX2NsaXBfbGlhbmdfYmFyc2t5LmggYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfY2xpcF9saWFuZ19iYXJza3kuaAppbmRleCA1YjEyNjFmLi4zMWIzNWZlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfY2xpcF9saWFuZ19iYXJza3kuaAorKysgYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfY2xpcF9saWFuZ19iYXJza3kuaApAQCAtMzYsNDUgKzM2LDQ1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjdF9iYXNlPFQ+JiBjbGlwX2JveCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUKiB4LCBUKiB5KQogewotICAgIGNvbnN0IEZYX0ZMT0FUIG5lYXJ6ZXJvID0gMWUtMzBmOworICAgIGNvbnN0IGZsb2F0IG5lYXJ6ZXJvID0gMWUtMzBmOwogCi0gICAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxGWF9GTE9BVD4gd2lkdGggPSB4MjsKKyAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPGZsb2F0PiB3aWR0aCA9IHgyOwogICAgIHdpZHRoIC09IHgxOwogICAgIGlmICghd2lkdGguSXNWYWxpZCgpKQogICAgICAgICByZXR1cm4gMDsKLSAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPEZYX0ZMT0FUPiBoZWlnaHQgPSB5MjsKKyAgICBwZGZpdW06OmJhc2U6OkNoZWNrZWROdW1lcmljPGZsb2F0PiBoZWlnaHQgPSB5MjsKICAgICBoZWlnaHQgLT0geTE7CiAgICAgaWYgKCFoZWlnaHQuSXNWYWxpZCgpKQogICAgICAgICByZXR1cm4gMDsKIAotICAgIEZYX0ZMT0FUIGRlbHRheCA9IHdpZHRoLlZhbHVlT3JEZWZhdWx0KDApOwotICAgIEZYX0ZMT0FUIGRlbHRheSA9IGhlaWdodC5WYWx1ZU9yRGVmYXVsdCgwKTsKKyAgICBmbG9hdCBkZWx0YXggPSB3aWR0aC5WYWx1ZU9yRGVmYXVsdCgwKTsKKyAgICBmbG9hdCBkZWx0YXkgPSBoZWlnaHQuVmFsdWVPckRlZmF1bHQoMCk7CiAgICAgdW5zaWduZWQgbnAgPSAwOwogICAgIGlmKGRlbHRheCA9PSAwKSB7CiAgICAgICAgIGRlbHRheCA9ICh4MSA+IGNsaXBfYm94LngxKSA/IC1uZWFyemVybyA6IG5lYXJ6ZXJvOwogICAgIH0KLSAgICBGWF9GTE9BVCB4aW4sIHhvdXQ7CisgICAgZmxvYXQgeGluLCB4b3V0OwogICAgIGlmKGRlbHRheCA+IDApIHsKLSAgICAgICAgeGluICA9IChGWF9GTE9BVCljbGlwX2JveC54MTsKLSAgICAgICAgeG91dCA9IChGWF9GTE9BVCljbGlwX2JveC54MjsKKyAgICAgICAgeGluICA9IChmbG9hdCljbGlwX2JveC54MTsKKyAgICAgICAgeG91dCA9IChmbG9hdCljbGlwX2JveC54MjsKICAgICB9IGVsc2UgewotICAgICAgICB4aW4gID0gKEZYX0ZMT0FUKWNsaXBfYm94LngyOwotICAgICAgICB4b3V0ID0gKEZYX0ZMT0FUKWNsaXBfYm94LngxOworICAgICAgICB4aW4gID0gKGZsb2F0KWNsaXBfYm94LngyOworICAgICAgICB4b3V0ID0gKGZsb2F0KWNsaXBfYm94LngxOwogICAgIH0KLSAgICBGWF9GTE9BVCB0aW54ID0gKHhpbiAtIHgxKSAvIGRlbHRheDsKKyAgICBmbG9hdCB0aW54ID0gKHhpbiAtIHgxKSAvIGRlbHRheDsKICAgICBpZihkZWx0YXkgPT0gMCkgewogICAgICAgICBkZWx0YXkgPSAoeTEgPiBjbGlwX2JveC55MSkgPyAtbmVhcnplcm8gOiBuZWFyemVybzsKICAgICB9Ci0gICAgRlhfRkxPQVQgeWluLCB5b3V0OworICAgIGZsb2F0IHlpbiwgeW91dDsKICAgICBpZihkZWx0YXkgPiAwKSB7Ci0gICAgICAgIHlpbiAgPSAoRlhfRkxPQVQpY2xpcF9ib3gueTE7Ci0gICAgICAgIHlvdXQgPSAoRlhfRkxPQVQpY2xpcF9ib3gueTI7CisgICAgICAgIHlpbiAgPSAoZmxvYXQpY2xpcF9ib3gueTE7CisgICAgICAgIHlvdXQgPSAoZmxvYXQpY2xpcF9ib3gueTI7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgeWluICA9IChGWF9GTE9BVCljbGlwX2JveC55MjsKLSAgICAgICAgeW91dCA9IChGWF9GTE9BVCljbGlwX2JveC55MTsKKyAgICAgICAgeWluICA9IChmbG9hdCljbGlwX2JveC55MjsKKyAgICAgICAgeW91dCA9IChmbG9hdCljbGlwX2JveC55MTsKICAgICB9Ci0gICAgRlhfRkxPQVQgdGlueSA9ICh5aW4gLSB5MSkgLyBkZWx0YXk7Ci0gICAgRlhfRkxPQVQgdGluMSwgdGluMjsKKyAgICBmbG9hdCB0aW55ID0gKHlpbiAtIHkxKSAvIGRlbHRheTsKKyAgICBmbG9hdCB0aW4xLCB0aW4yOwogICAgIGlmICh0aW54IDwgdGlueSkgewogICAgICAgICB0aW4xID0gdGlueDsKICAgICAgICAgdGluMiA9IHRpbnk7CkBAIC04OSw5ICs4OSw5IEBACiAgICAgICAgICAgICArK25wOwogICAgICAgICB9CiAgICAgICAgIGlmKHRpbjIgPD0gMS4wZikgewotICAgICAgICAgIEZYX0ZMT0FUIHRvdXR4ID0gKHhvdXQgLSB4MSkgLyBkZWx0YXg7Ci0gICAgICAgICAgRlhfRkxPQVQgdG91dHkgPSAoeW91dCAtIHkxKSAvIGRlbHRheTsKLSAgICAgICAgICBGWF9GTE9BVCB0b3V0MSA9ICh0b3V0eCA8IHRvdXR5KSA/IHRvdXR4IDogdG91dHk7CisgICAgICAgICAgZmxvYXQgdG91dHggPSAoeG91dCAtIHgxKSAvIGRlbHRheDsKKyAgICAgICAgICBmbG9hdCB0b3V0eSA9ICh5b3V0IC0geTEpIC8gZGVsdGF5OworICAgICAgICAgIGZsb2F0IHRvdXQxID0gKHRvdXR4IDwgdG91dHkpID8gdG91dHggOiB0b3V0eTsKICAgICAgICAgICBpZiAodGluMiA+IDAgfHwgdG91dDEgPiAwKSB7CiAgICAgICAgICAgICAgICAgaWYodGluMiA8PSB0b3V0MSkgewogICAgICAgICAgICAgICAgICAgICBpZih0aW4yID4gMCkgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWdnMjMvYWdnX2NvbnZfYWRhcHRvcl92Y2dlbi5oIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX2NvbnZfYWRhcHRvcl92Y2dlbi5oCmluZGV4IDBkOGQ2ZmYuLmJlNGRjMmQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19jb252X2FkYXB0b3JfdmNnZW4uaAorKysgYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfY29udl9hZGFwdG9yX3ZjZ2VuLmgKQEAgLTIwLDEwICsyMCwxMCBAQAogewogc3RydWN0IG51bGxfbWFya2VycyAgewogICAgIHZvaWQgcmVtb3ZlX2FsbCgpIHt9Ci0gICAgdm9pZCBhZGRfdmVydGV4KEZYX0ZMT0FULCBGWF9GTE9BVCwgdW5zaWduZWQpIHt9CisgICAgdm9pZCBhZGRfdmVydGV4KGZsb2F0LCBmbG9hdCwgdW5zaWduZWQpIHt9CiAgICAgdm9pZCBwcmVwYXJlX3NyYygpIHt9CiAgICAgdm9pZCByZXdpbmQodW5zaWduZWQpIHt9Ci0gICAgdW5zaWduZWQgdmVydGV4KEZYX0ZMT0FUKiwgRlhfRkxPQVQqKQorICAgIHVuc2lnbmVkIHZlcnRleChmbG9hdCosIGZsb2F0KikKICAgICB7CiAgICAgICAgIHJldHVybiBwYXRoX2NtZF9zdG9wOwogICAgIH0KQEAgLTY3LDcgKzY3LDcgQEAKICAgICAgICAgbV9zb3VyY2UtPnJld2luZChwYXRoX2lkKTsKICAgICAgICAgbV9zdGF0dXMgPSBpbml0aWFsOwogICAgIH0KLSAgICB1bnNpZ25lZCB2ZXJ0ZXgoRlhfRkxPQVQqIHgsIEZYX0ZMT0FUKiB5KTsKKyAgICB1bnNpZ25lZCB2ZXJ0ZXgoZmxvYXQqIHgsIGZsb2F0KiB5KTsKIHByaXZhdGU6CiAgICAgY29udl9hZGFwdG9yX3ZjZ2VuKGNvbnN0IGNvbnZfYWRhcHRvcl92Y2dlbjxWZXJ0ZXhTb3VyY2UsIEdlbmVyYXRvciwgTWFya2Vycz4mKTsKICAgICBjb25zdCBjb252X2FkYXB0b3JfdmNnZW48VmVydGV4U291cmNlLCBHZW5lcmF0b3IsIE1hcmtlcnM+JgpAQCAtNzcsMTEgKzc3LDExIEBACiAgICAgTWFya2VycyAgICAgICBtX21hcmtlcnM7CiAgICAgc3RhdHVzICAgICAgICBtX3N0YXR1czsKICAgICB1bnNpZ25lZCAgICAgIG1fbGFzdF9jbWQ7Ci0gICAgRlhfRkxPQVQgICAgICAgIG1fc3RhcnRfeDsKLSAgICBGWF9GTE9BVCAgICAgICAgbV9zdGFydF95OworICAgIGZsb2F0ICAgICAgICBtX3N0YXJ0X3g7CisgICAgZmxvYXQgICAgICAgIG1fc3RhcnRfeTsKIH07CiB0ZW1wbGF0ZTxjbGFzcyBWZXJ0ZXhTb3VyY2UsIGNsYXNzIEdlbmVyYXRvciwgY2xhc3MgTWFya2Vycz4KLXVuc2lnbmVkIGNvbnZfYWRhcHRvcl92Y2dlbjxWZXJ0ZXhTb3VyY2UsIEdlbmVyYXRvciwgTWFya2Vycz46OnZlcnRleChGWF9GTE9BVCogeCwgRlhfRkxPQVQqIHkpCit1bnNpZ25lZCBjb252X2FkYXB0b3JfdmNnZW48VmVydGV4U291cmNlLCBHZW5lcmF0b3IsIE1hcmtlcnM+Ojp2ZXJ0ZXgoZmxvYXQqIHgsIGZsb2F0KiB5KQogewogICAgIHVuc2lnbmVkIGNtZCA9IHBhdGhfY21kX3N0b3A7CiAgICAgYm9vbCBkb25lID0gZmFsc2U7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfY29udl9kYXNoLmggYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfY29udl9kYXNoLmgKaW5kZXggNjNiMjAxOS4uZjg3ZWNjYyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWdnMjMvYWdnX2NvbnZfZGFzaC5oCisrKyBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19jb252X2Rhc2guaApAQCAtMzYsMTUgKzM2LDE1IEBACiAgICAgewogICAgICAgICBiYXNlX3R5cGU6OmdlbmVyYXRvcigpLnJlbW92ZV9hbGxfZGFzaGVzKCk7CiAgICAgfQotICAgIHZvaWQgYWRkX2Rhc2goRlhfRkxPQVQgZGFzaF9sZW4sIEZYX0ZMT0FUIGdhcF9sZW4pCisgICAgdm9pZCBhZGRfZGFzaChmbG9hdCBkYXNoX2xlbiwgZmxvYXQgZ2FwX2xlbikKICAgICB7CiAgICAgICAgIGJhc2VfdHlwZTo6Z2VuZXJhdG9yKCkuYWRkX2Rhc2goZGFzaF9sZW4sIGdhcF9sZW4pOwogICAgIH0KLSAgICB2b2lkIGRhc2hfc3RhcnQoRlhfRkxPQVQgZHMpCisgICAgdm9pZCBkYXNoX3N0YXJ0KGZsb2F0IGRzKQogICAgIHsKICAgICAgICAgYmFzZV90eXBlOjpnZW5lcmF0b3IoKS5kYXNoX3N0YXJ0KGRzKTsKICAgICB9Ci0gICAgdm9pZCBzaG9ydGVuKEZYX0ZMT0FUIHMpCisgICAgdm9pZCBzaG9ydGVuKGZsb2F0IHMpCiAgICAgewogICAgICAgICBiYXNlX3R5cGU6OmdlbmVyYXRvcigpLnNob3J0ZW4ocyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWdnMjMvYWdnX2NvbnZfc3Ryb2tlLmggYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfY29udl9zdHJva2UuaAppbmRleCA1YTM2YmQ3Li44MjI2OGRkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfY29udl9zdHJva2UuaAorKysgYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfY29udl9zdHJva2UuaApAQCAtNTcsNDcgKzU3LDQ3IEBACiAgICAgewogICAgICAgICByZXR1cm4gYmFzZV90eXBlOjpnZW5lcmF0b3IoKS5pbm5lcl9qb2luKCk7CiAgICAgfQotICAgIHZvaWQgd2lkdGgoRlhfRkxPQVQgdykKKyAgICB2b2lkIHdpZHRoKGZsb2F0IHcpCiAgICAgewogICAgICAgICBiYXNlX3R5cGU6OmdlbmVyYXRvcigpLndpZHRoKHcpOwogICAgIH0KLSAgICB2b2lkIG1pdGVyX2xpbWl0KEZYX0ZMT0FUIG1sKQorICAgIHZvaWQgbWl0ZXJfbGltaXQoZmxvYXQgbWwpCiAgICAgewogICAgICAgICBiYXNlX3R5cGU6OmdlbmVyYXRvcigpLm1pdGVyX2xpbWl0KG1sKTsKICAgICB9Ci0gICAgdm9pZCBtaXRlcl9saW1pdF90aGV0YShGWF9GTE9BVCB0KQorICAgIHZvaWQgbWl0ZXJfbGltaXRfdGhldGEoZmxvYXQgdCkKICAgICB7CiAgICAgICAgIGJhc2VfdHlwZTo6Z2VuZXJhdG9yKCkubWl0ZXJfbGltaXRfdGhldGEodCk7CiAgICAgfQotICAgIHZvaWQgaW5uZXJfbWl0ZXJfbGltaXQoRlhfRkxPQVQgbWwpCisgICAgdm9pZCBpbm5lcl9taXRlcl9saW1pdChmbG9hdCBtbCkKICAgICB7CiAgICAgICAgIGJhc2VfdHlwZTo6Z2VuZXJhdG9yKCkuaW5uZXJfbWl0ZXJfbGltaXQobWwpOwogICAgIH0KLSAgICB2b2lkIGFwcHJveGltYXRpb25fc2NhbGUoRlhfRkxPQVQgYXMpCisgICAgdm9pZCBhcHByb3hpbWF0aW9uX3NjYWxlKGZsb2F0IGFzKQogICAgIHsKICAgICAgICAgYmFzZV90eXBlOjpnZW5lcmF0b3IoKS5hcHByb3hpbWF0aW9uX3NjYWxlKGFzKTsKICAgICB9Ci0gICAgRlhfRkxPQVQgd2lkdGgoKSBjb25zdAorICAgIGZsb2F0IHdpZHRoKCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBiYXNlX3R5cGU6OmdlbmVyYXRvcigpLndpZHRoKCk7CiAgICAgfQotICAgIEZYX0ZMT0FUIG1pdGVyX2xpbWl0KCkgY29uc3QKKyAgICBmbG9hdCBtaXRlcl9saW1pdCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gYmFzZV90eXBlOjpnZW5lcmF0b3IoKS5taXRlcl9saW1pdCgpOwogICAgIH0KLSAgICBGWF9GTE9BVCBpbm5lcl9taXRlcl9saW1pdCgpIGNvbnN0CisgICAgZmxvYXQgaW5uZXJfbWl0ZXJfbGltaXQoKSBjb25zdAogICAgIHsKICAgICAgICAgcmV0dXJuIGJhc2VfdHlwZTo6Z2VuZXJhdG9yKCkuaW5uZXJfbWl0ZXJfbGltaXQoKTsKICAgICB9Ci0gICAgRlhfRkxPQVQgYXBwcm94aW1hdGlvbl9zY2FsZSgpIGNvbnN0CisgICAgZmxvYXQgYXBwcm94aW1hdGlvbl9zY2FsZSgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gYmFzZV90eXBlOjpnZW5lcmF0b3IoKS5hcHByb3hpbWF0aW9uX3NjYWxlKCk7CiAgICAgfQotICAgIHZvaWQgc2hvcnRlbihGWF9GTE9BVCBzKQorICAgIHZvaWQgc2hvcnRlbihmbG9hdCBzKQogICAgIHsKICAgICAgICAgYmFzZV90eXBlOjpnZW5lcmF0b3IoKS5zaG9ydGVuKHMpOwogICAgIH0KLSAgICBGWF9GTE9BVCBzaG9ydGVuKCkgY29uc3QKKyAgICBmbG9hdCBzaG9ydGVuKCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBiYXNlX3R5cGU6OmdlbmVyYXRvcigpLnNob3J0ZW4oKTsKICAgICB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfY3VydmVzLmNwcCBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19jdXJ2ZXMuY3BwCmluZGV4IGI4NmNmNjMuLjQxOTAwYzggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19jdXJ2ZXMuY3BwCisrKyBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19jdXJ2ZXMuY3BwCkBAIC0yMSwxNiArMjEsMTUgQEAKIAogI2luY2x1ZGUgImFnZ19jdXJ2ZXMuaCIKICNpbmNsdWRlICJhZ2dfbWF0aC5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKIAogbmFtZXNwYWNlIGFnZwogewotY29uc3QgRlhfRkxPQVQgY3VydmVfY29sbGluZWFyaXR5X2Vwc2lsb24gICAgICAgICAgICAgID0gMWUtMzBmOworY29uc3QgZmxvYXQgY3VydmVfY29sbGluZWFyaXR5X2Vwc2lsb24gICAgICAgICAgICAgID0gMWUtMzBmOwogZW51bSBjdXJ2ZV9yZWN1cnNpb25fbGltaXRfZSB7IGN1cnZlX3JlY3Vyc2lvbl9saW1pdCA9IDE2IH07Ci12b2lkIGN1cnZlNF9kaXY6OmluaXQoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwKLSAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MywgRlhfRkxPQVQgeTMsCi0gICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDQsIEZYX0ZMT0FUIHk0KQordm9pZCBjdXJ2ZTRfZGl2Ojppbml0KGZsb2F0IHgxLCBmbG9hdCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MiwgZmxvYXQgeTIsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCkKIHsKICAgICBtX3BvaW50cy5yZW1vdmVfYWxsKCk7CiAgICAgbV9kaXN0YW5jZV90b2xlcmFuY2Vfc3F1YXJlID0gMS4wZiAvIDQ7CkBAIC0zOCw0MCArMzcsMzkgQEAKICAgICBiZXppZXIoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0KTsKICAgICBtX2NvdW50ID0gMDsKIH0KLXZvaWQgY3VydmU0X2Rpdjo6cmVjdXJzaXZlX2JlemllcihGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgzLCBGWF9GTE9BVCB5MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4NCwgRlhfRkxPQVQgeTQsCit2b2lkIGN1cnZlNF9kaXY6OnJlY3Vyc2l2ZV9iZXppZXIoZmxvYXQgeDEsIGZsb2F0IHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxldmVsKQogewogICAgIGlmKGxldmVsID4gY3VydmVfcmVjdXJzaW9uX2xpbWl0KSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgRlhfRkxPQVQgeDEyICAgPSAoeDEgKyB4MikgLyAyOwotICAgIEZYX0ZMT0FUIHkxMiAgID0gKHkxICsgeTIpIC8gMjsKLSAgICBGWF9GTE9BVCB4MjMgICA9ICh4MiArIHgzKSAvIDI7Ci0gICAgRlhfRkxPQVQgeTIzICAgPSAoeTIgKyB5MykgLyAyOwotICAgIEZYX0ZMT0FUIHgzNCAgID0gKHgzICsgeDQpIC8gMjsKLSAgICBGWF9GTE9BVCB5MzQgICA9ICh5MyArIHk0KSAvIDI7Ci0gICAgRlhfRkxPQVQgeDEyMyAgPSAoeDEyICsgeDIzKSAvIDI7Ci0gICAgRlhfRkxPQVQgeTEyMyAgPSAoeTEyICsgeTIzKSAvIDI7Ci0gICAgRlhfRkxPQVQgeDIzNCAgPSAoeDIzICsgeDM0KSAvIDI7Ci0gICAgRlhfRkxPQVQgeTIzNCAgPSAoeTIzICsgeTM0KSAvIDI7Ci0gICAgRlhfRkxPQVQgeDEyMzQgPSAoeDEyMyArIHgyMzQpIC8gMjsKLSAgICBGWF9GTE9BVCB5MTIzNCA9ICh5MTIzICsgeTIzNCkgLyAyOwotICAgIEZYX0ZMT0FUIGR4ID0geDQgLSB4MTsKLSAgICBGWF9GTE9BVCBkeSA9IHk0IC0geTE7Ci0gICAgRlhfRkxPQVQgZDIgPSBGWFNZU19mYWJzKCgoeDIgLSB4NCkgKiBkeSkgLSAoKHkyIC0geTQpICogZHgpKTsKLSAgICBGWF9GTE9BVCBkMyA9IEZYU1lTX2ZhYnMoKCh4MyAtIHg0KSAqIGR5KSAtICgoeTMgLSB5NCkgKiBkeCkpOworICAgIGZsb2F0IHgxMiAgID0gKHgxICsgeDIpIC8gMjsKKyAgICBmbG9hdCB5MTIgICA9ICh5MSArIHkyKSAvIDI7CisgICAgZmxvYXQgeDIzICAgPSAoeDIgKyB4MykgLyAyOworICAgIGZsb2F0IHkyMyAgID0gKHkyICsgeTMpIC8gMjsKKyAgICBmbG9hdCB4MzQgICA9ICh4MyArIHg0KSAvIDI7CisgICAgZmxvYXQgeTM0ICAgPSAoeTMgKyB5NCkgLyAyOworICAgIGZsb2F0IHgxMjMgID0gKHgxMiArIHgyMykgLyAyOworICAgIGZsb2F0IHkxMjMgID0gKHkxMiArIHkyMykgLyAyOworICAgIGZsb2F0IHgyMzQgID0gKHgyMyArIHgzNCkgLyAyOworICAgIGZsb2F0IHkyMzQgID0gKHkyMyArIHkzNCkgLyAyOworICAgIGZsb2F0IHgxMjM0ID0gKHgxMjMgKyB4MjM0KSAvIDI7CisgICAgZmxvYXQgeTEyMzQgPSAoeTEyMyArIHkyMzQpIC8gMjsKKyAgICBmbG9hdCBkeCA9IHg0IC0geDE7CisgICAgZmxvYXQgZHkgPSB5NCAtIHkxOworICAgIGZsb2F0IGQyID0gZmFicygoKHgyIC0geDQpICogZHkpIC0gKCh5MiAtIHk0KSAqIGR4KSk7CisgICAgZmxvYXQgZDMgPSBmYWJzKCgoeDMgLSB4NCkgKiBkeSkgLSAoKHkzIC0geTQpICogZHgpKTsKICAgICBzd2l0Y2goKGludChkMiA+IGN1cnZlX2NvbGxpbmVhcml0eV9lcHNpbG9uKSA8PCAxKSArCiAgICAgICAgICAgICBpbnQoZDMgPiBjdXJ2ZV9jb2xsaW5lYXJpdHlfZXBzaWxvbikpIHsKICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgaWYoRlhTWVNfZmFicyh4MSArIHgzIC0geDIgLSB4MikgKwotICAgICAgICAgICAgICAgICAgICBGWFNZU19mYWJzKHkxICsgeTMgLSB5MiAtIHkyKSArCi0gICAgICAgICAgICAgICAgICAgIEZYU1lTX2ZhYnMoeDIgKyB4NCAtIHgzIC0geDMpICsKLSAgICAgICAgICAgICAgICAgICAgRlhTWVNfZmFicyh5MiArIHk0IC0geTMgLSB5MykgPD0gbV9kaXN0YW5jZV90b2xlcmFuY2VfbWFuaGF0dGFuKSB7Ci0gICAgICAgICAgICAgICAgbV9wb2ludHMuYWRkKHBvaW50X3R5cGUoeDEyMzQsIHkxMjM0LCBwYXRoX2ZsYWdzX2pyKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIGlmIChmYWJzKHgxICsgeDMgLSB4MiAtIHgyKSArIGZhYnMoeTEgKyB5MyAtIHkyIC0geTIpICsKKyAgICAgICAgICAgICAgICAgIGZhYnMoeDIgKyB4NCAtIHgzIC0geDMpICsgZmFicyh5MiArIHk0IC0geTMgLSB5MykgPD0KKyAgICAgICAgICAgICAgbV9kaXN0YW5jZV90b2xlcmFuY2VfbWFuaGF0dGFuKSB7CisgICAgICAgICAgICBtX3BvaW50cy5hZGQocG9pbnRfdHlwZSh4MTIzNCwgeTEyMzQsIHBhdGhfZmxhZ3NfanIpKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIDE6CkBAIC05OSwxMCArOTcsMTAgQEAKICAgICByZWN1cnNpdmVfYmV6aWVyKHgxLCB5MSwgeDEyLCB5MTIsIHgxMjMsIHkxMjMsIHgxMjM0LCB5MTIzNCwgbGV2ZWwgKyAxKTsKICAgICByZWN1cnNpdmVfYmV6aWVyKHgxMjM0LCB5MTIzNCwgeDIzNCwgeTIzNCwgeDM0LCB5MzQsIHg0LCB5NCwgbGV2ZWwgKyAxKTsKIH0KLXZvaWQgY3VydmU0X2Rpdjo6YmV6aWVyKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgzLCBGWF9GTE9BVCB5MywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHg0LCBGWF9GTE9BVCB5NCkKK3ZvaWQgY3VydmU0X2Rpdjo6YmV6aWVyKGZsb2F0IHgxLCBmbG9hdCB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCkKIHsKICAgICBtX3BvaW50cy5hZGQocG9pbnRfdHlwZSh4MSwgeTEpKTsKICAgICByZWN1cnNpdmVfYmV6aWVyKHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NCwgMCk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfY3VydmVzLmggYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfY3VydmVzLmgKaW5kZXggNDk1ZjdhNi4uNDg4ZGI0YSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWdnMjMvYWdnX2N1cnZlcy5oCisrKyBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19jdXJ2ZXMuaApAQCAtMjAsMTIgKzIwLDEyIEBACiBuYW1lc3BhY2UgYWdnCiB7CiBzdHJ1Y3QgY3VydmU0X3BvaW50cyAgewotICAgIEZYX0ZMT0FUIGNwWzhdOworICAgIGZsb2F0IGNwWzhdOwogICAgIGN1cnZlNF9wb2ludHMoKSB7fQotICAgIGN1cnZlNF9wb2ludHMoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLAotICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLAotICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDMsIEZYX0ZMT0FUIHkzLAotICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDQsIEZYX0ZMT0FUIHk0KQorICAgIGN1cnZlNF9wb2ludHMoZmxvYXQgeDEsIGZsb2F0IHkxLAorICAgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLAorICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLAorICAgICAgICAgICAgICAgICAgZmxvYXQgeDQsIGZsb2F0IHk0KQogICAgIHsKICAgICAgICAgY3BbMF0gPSB4MTsKICAgICAgICAgY3BbMV0gPSB5MTsKQEAgLTM2LDEwICszNiwxMCBAQAogICAgICAgICBjcFs2XSA9IHg0OwogICAgICAgICBjcFs3XSA9IHk0OwogICAgIH0KLSAgICB2b2lkIGluaXQoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLAotICAgICAgICAgICAgICBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUIHgzLCBGWF9GTE9BVCB5MywKLSAgICAgICAgICAgICAgRlhfRkxPQVQgeDQsIEZYX0ZMT0FUIHk0KQorICAgIHZvaWQgaW5pdChmbG9hdCB4MSwgZmxvYXQgeTEsCisgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwKKyAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLAorICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQpCiAgICAgewogICAgICAgICBjcFswXSA9IHgxOwogICAgICAgICBjcFsxXSA9IHkxOwpAQCAtNTAsMTEgKzUwLDExIEBACiAgICAgICAgIGNwWzZdID0geDQ7CiAgICAgICAgIGNwWzddID0geTQ7CiAgICAgfQotICAgIEZYX0ZMT0FUICBvcGVyYXRvciBbXSAodW5zaWduZWQgaSkgY29uc3QKKyAgICBmbG9hdCAgb3BlcmF0b3IgW10gKHVuc2lnbmVkIGkpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gY3BbaV07CiAgICAgfQotICAgIEZYX0ZMT0FUJiBvcGVyYXRvciBbXSAodW5zaWduZWQgaSkKKyAgICBmbG9hdCYgb3BlcmF0b3IgW10gKHVuc2lnbmVkIGkpCiAgICAgewogICAgICAgICByZXR1cm4gY3BbaV07CiAgICAgfQpAQCAtNjUsMTAgKzY1LDEwIEBACiAgICAgY3VydmU0X2RpdigpIDoKICAgICAgICAgbV9jb3VudCgwKQogICAgIHt9Ci0gICAgY3VydmU0X2RpdihGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsCi0gICAgICAgICAgICAgICBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsCi0gICAgICAgICAgICAgICBGWF9GTE9BVCB4MywgRlhfRkxPQVQgeTMsCi0gICAgICAgICAgICAgICBGWF9GTE9BVCB4NCwgRlhfRkxPQVQgeTQpIDoKKyAgICBjdXJ2ZTRfZGl2KGZsb2F0IHgxLCBmbG9hdCB5MSwKKyAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwKKyAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywKKyAgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCkgOgogICAgICAgICBtX2NvdW50KDApCiAgICAgewogICAgICAgICBpbml0KHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NCk7CkBAIC04MywxMCArODMsMTAgQEAKICAgICAgICAgbV9wb2ludHMucmVtb3ZlX2FsbCgpOwogICAgICAgICBtX2NvdW50ID0gMDsKICAgICB9Ci0gICAgdm9pZCBpbml0KEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwKLSAgICAgICAgICAgICAgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLAotICAgICAgICAgICAgICBGWF9GTE9BVCB4MywgRlhfRkxPQVQgeTMsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUIHg0LCBGWF9GTE9BVCB5NCk7CisgICAgdm9pZCBpbml0KGZsb2F0IHgxLCBmbG9hdCB5MSwKKyAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLAorICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMsCisgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCk7CiAgICAgdm9pZCBpbml0KGNvbnN0IGN1cnZlNF9wb2ludHMmIGNwKQogICAgIHsKICAgICAgICAgaW5pdChjcFswXSwgY3BbMV0sIGNwWzJdLCBjcFszXSwgY3BbNF0sIGNwWzVdLCBjcFs2XSwgY3BbN10pOwpAQCAtOTUsNyArOTUsNyBAQAogICAgIHsKICAgICAgICAgbV9jb3VudCA9IDA7CiAgICAgfQotICAgIHVuc2lnbmVkIHZlcnRleChGWF9GTE9BVCogeCwgRlhfRkxPQVQqIHkpCisgICAgdW5zaWduZWQgdmVydGV4KGZsb2F0KiB4LCBmbG9hdCogeSkKICAgICB7CiAgICAgICAgIGlmKG1fY291bnQgPj0gbV9wb2ludHMuc2l6ZSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gcGF0aF9jbWRfc3RvcDsKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgICAgICAqeSA9IHAueTsKICAgICAgICAgcmV0dXJuIChtX2NvdW50ID09IDEpID8gcGF0aF9jbWRfbW92ZV90byA6IHBhdGhfY21kX2xpbmVfdG87CiAgICAgfQotICAgIHVuc2lnbmVkIHZlcnRleF9mbGFnKEZYX0ZMT0FUKiB4LCBGWF9GTE9BVCogeSwgaW50JiBmbGFnKQorICAgIHVuc2lnbmVkIHZlcnRleF9mbGFnKGZsb2F0KiB4LCBmbG9hdCogeSwgaW50JiBmbGFnKQogICAgIHsKICAgICAgICAgaWYobV9jb3VudCA+PSBtX3BvaW50cy5zaXplKCkpIHsKICAgICAgICAgICAgIHJldHVybiBwYXRoX2NtZF9zdG9wOwpAQCAtMTIxLDE3ICsxMjEsMTcgQEAKICAgICAgICAgcmV0dXJuIG1fcG9pbnRzLnNpemUoKTsKICAgICB9CiBwcml2YXRlOgotICAgIHZvaWQgYmV6aWVyKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQgeDMsIEZYX0ZMT0FUIHkzLAotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHg0LCBGWF9GTE9BVCB5NCk7Ci0gICAgdm9pZCByZWN1cnNpdmVfYmV6aWVyKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4MywgRlhfRkxPQVQgeTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHg0LCBGWF9GTE9BVCB5NCwKKyAgICB2b2lkIGJlemllcihmbG9hdCB4MSwgZmxvYXQgeTEsCisgICAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLAorICAgICAgICAgICAgICAgIGZsb2F0IHgzLCBmbG9hdCB5MywKKyAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQpOworICAgIHZvaWQgcmVjdXJzaXZlX2JlemllcihmbG9hdCB4MSwgZmxvYXQgeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxldmVsKTsKLSAgICBGWF9GTE9BVCAgICBtX2Rpc3RhbmNlX3RvbGVyYW5jZV9zcXVhcmU7Ci0gICAgRlhfRkxPQVQgICAgbV9kaXN0YW5jZV90b2xlcmFuY2VfbWFuaGF0dGFuOworICAgIGZsb2F0ICAgIG1fZGlzdGFuY2VfdG9sZXJhbmNlX3NxdWFyZTsKKyAgICBmbG9hdCAgICBtX2Rpc3RhbmNlX3RvbGVyYW5jZV9tYW5oYXR0YW47CiAgICAgdW5zaWduZWQgICAgICAgICAgICAgIG1fY291bnQ7CiAgICAgcG9kX2RlcXVlPHBvaW50X3R5cGU+IG1fcG9pbnRzOwogfTsKQEAgLTEzOSwxMCArMTM5LDEwIEBACiB7CiBwdWJsaWM6CiAgICAgY3VydmU0KCkge30KLSAgICBjdXJ2ZTQoRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLAotICAgICAgICAgICBGWF9GTE9BVCB4MiwgRlhfRkxPQVQgeTIsCi0gICAgICAgICAgIEZYX0ZMT0FUIHgzLCBGWF9GTE9BVCB5MywKLSAgICAgICAgICAgRlhfRkxPQVQgeDQsIEZYX0ZMT0FUIHk0KQorICAgIGN1cnZlNChmbG9hdCB4MSwgZmxvYXQgeTEsCisgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwKKyAgICAgICAgICAgZmxvYXQgeDMsIGZsb2F0IHkzLAorICAgICAgICAgICBmbG9hdCB4NCwgZmxvYXQgeTQpCiAgICAgewogICAgICAgICBpbml0KHgxLCB5MSwgeDIsIHkyLCB4MywgeTMsIHg0LCB5NCk7CiAgICAgfQpAQCAtMTU0LDEwICsxNTQsMTAgQEAKICAgICB7CiAgICAgICAgIG1fY3VydmVfZGl2LnJlc2V0KCk7CiAgICAgfQotICAgIHZvaWQgaW5pdChGWF9GTE9BVCB4MSwgRlhfRkxPQVQgeTEsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwKLSAgICAgICAgICAgICAgRlhfRkxPQVQgeDMsIEZYX0ZMT0FUIHkzLAotICAgICAgICAgICAgICBGWF9GTE9BVCB4NCwgRlhfRkxPQVQgeTQpCisgICAgdm9pZCBpbml0KGZsb2F0IHgxLCBmbG9hdCB5MSwKKyAgICAgICAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLAorICAgICAgICAgICAgICBmbG9hdCB4MywgZmxvYXQgeTMsCisgICAgICAgICAgICAgIGZsb2F0IHg0LCBmbG9hdCB5NCkKICAgICB7CiAgICAgICAgIG1fY3VydmVfZGl2LmluaXQoeDEsIHkxLCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0KTsKICAgICB9CkBAIC0xNjksMTEgKzE2OSwxMSBAQAogICAgIHsKICAgICAgICAgbV9jdXJ2ZV9kaXYucmV3aW5kKHBhdGhfaWQpOwogICAgIH0KLSAgICB1bnNpZ25lZCB2ZXJ0ZXgoRlhfRkxPQVQqIHgsIEZYX0ZMT0FUKiB5KQorICAgIHVuc2lnbmVkIHZlcnRleChmbG9hdCogeCwgZmxvYXQqIHkpCiAgICAgewogICAgICAgICByZXR1cm4gbV9jdXJ2ZV9kaXYudmVydGV4KHgsIHkpOwogICAgIH0KLSAgICB1bnNpZ25lZCB2ZXJ0ZXhfY3VydmVfZmxhZyhGWF9GTE9BVCogeCwgRlhfRkxPQVQqIHksIGludCYgZmxhZykKKyAgICB1bnNpZ25lZCB2ZXJ0ZXhfY3VydmVfZmxhZyhmbG9hdCogeCwgZmxvYXQqIHksIGludCYgZmxhZykKICAgICB7CiAgICAgICAgIHJldHVybiBtX2N1cnZlX2Rpdi52ZXJ0ZXhfZmxhZyh4LCB5LCBmbGFnKTsKICAgICB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfbWF0aC5oIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX21hdGguaAppbmRleCBlMDAzMjk3Li42ZDVlMzlhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfbWF0aC5oCisrKyBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19tYXRoLmgKQEAgLTIxLDM5ICsyMSwzOSBAQAogI2luY2x1ZGUgImFnZ19iYXNpY3MuaCIKIG5hbWVzcGFjZSBhZ2cKIHsKLWNvbnN0IEZYX0ZMT0FUIGludGVyc2VjdGlvbl9lcHNpbG9uID0gMS4wZS0zMGY7Ci1BR0dfSU5MSU5FIEZYX0ZMT0FUIGNhbGNfcG9pbnRfbG9jYXRpb24oRlhfRkxPQVQgeDEsIEZYX0ZMT0FUIHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgyLCBGWF9GTE9BVCB5MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4LCAgRlhfRkxPQVQgeSkKK2NvbnN0IGZsb2F0IGludGVyc2VjdGlvbl9lcHNpbG9uID0gMS4wZS0zMGY7CitBR0dfSU5MSU5FIGZsb2F0IGNhbGNfcG9pbnRfbG9jYXRpb24oZmxvYXQgeDEsIGZsb2F0IHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgyLCBmbG9hdCB5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LCAgZmxvYXQgeSkKIHsKICAgcmV0dXJuICgoeCAtIHgyKSAqICh5MiAtIHkxKSkgLSAoKHkgLSB5MikgKiAoeDIgLSB4MSkpOwogfQotQUdHX0lOTElORSBGWF9GTE9BVCBjYWxjX2Rpc3RhbmNlKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyKQorQUdHX0lOTElORSBmbG9hdCBjYWxjX2Rpc3RhbmNlKGZsb2F0IHgxLCBmbG9hdCB5MSwgZmxvYXQgeDIsIGZsb2F0IHkyKQogewotICAgIEZYX0ZMT0FUIGR4ID0geDIgLSB4MTsKLSAgICBGWF9GTE9BVCBkeSA9IHkyIC0geTE7CisgICAgZmxvYXQgZHggPSB4MiAtIHgxOworICAgIGZsb2F0IGR5ID0geTIgLSB5MTsKICAgICByZXR1cm4gRlhTWVNfc3FydDIoZHgsIGR5KTsKIH0KLUFHR19JTkxJTkUgRlhfRkxPQVQgY2FsY19saW5lX3BvaW50X2Rpc3RhbmNlKEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwKLSAgICAgICAgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyLAotICAgICAgICBGWF9GTE9BVCB4LCAgRlhfRkxPQVQgeSkKK0FHR19JTkxJTkUgZmxvYXQgY2FsY19saW5lX3BvaW50X2Rpc3RhbmNlKGZsb2F0IHgxLCBmbG9hdCB5MSwKKyAgICAgICAgZmxvYXQgeDIsIGZsb2F0IHkyLAorICAgICAgICBmbG9hdCB4LCAgZmxvYXQgeSkKIHsKLSAgICBGWF9GTE9BVCBkeCA9IHgyIC0geDE7Ci0gICAgRlhfRkxPQVQgZHkgPSB5MiAtIHkxOwotICAgIEZYX0ZMT0FUIGQgPSBGWFNZU19zcXJ0MihkeCwgZHkpOworICAgIGZsb2F0IGR4ID0geDIgLSB4MTsKKyAgICBmbG9hdCBkeSA9IHkyIC0geTE7CisgICAgZmxvYXQgZCA9IEZYU1lTX3NxcnQyKGR4LCBkeSk7CiAgICAgaWYoZCA8IGludGVyc2VjdGlvbl9lcHNpbG9uKSB7CiAgICAgICAgIHJldHVybiBjYWxjX2Rpc3RhbmNlKHgxLCB5MSwgeCwgeSk7CiAgICAgfQogICAgIHJldHVybiAoKHggLSB4MikgKiBkeSAvIGQpIC0gKCh5IC0geTIpICogZHggLyBkKTsKIH0KLUFHR19JTkxJTkUgYm9vbCBjYWxjX2ludGVyc2VjdGlvbihGWF9GTE9BVCBheCwgRlhfRkxPQVQgYXksIEZYX0ZMT0FUIGJ4LCBGWF9GTE9BVCBieSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBjeCwgRlhfRkxPQVQgY3ksIEZYX0ZMT0FUIGR4LCBGWF9GTE9BVCBkeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogeCwgRlhfRkxPQVQqIHkpCitBR0dfSU5MSU5FIGJvb2wgY2FsY19pbnRlcnNlY3Rpb24oZmxvYXQgYXgsIGZsb2F0IGF5LCBmbG9hdCBieCwgZmxvYXQgYnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgY3gsIGZsb2F0IGN5LCBmbG9hdCBkeCwgZmxvYXQgZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHgsIGZsb2F0KiB5KQogewotICBGWF9GTE9BVCBudW0gPSAoKGF5IC0gY3kpICogKGR4IC0gY3gpKSAtICgoYXggLSBjeCkgKiAoZHkgLSBjeSkpOwotICBGWF9GTE9BVCBkZW4gPSAoKGJ4IC0gYXgpICogKGR5IC0gY3kpKSAtICgoYnkgLSBheSkgKiAoZHggLSBjeCkpOwotICAgIGlmIChGWFNZU19mYWJzKGRlbikgPCBpbnRlcnNlY3Rpb25fZXBzaWxvbikgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgIGZsb2F0IG51bSA9ICgoYXkgLSBjeSkgKiAoZHggLSBjeCkpIC0gKChheCAtIGN4KSAqIChkeSAtIGN5KSk7CisgIGZsb2F0IGRlbiA9ICgoYnggLSBheCkgKiAoZHkgLSBjeSkpIC0gKChieSAtIGF5KSAqIChkeCAtIGN4KSk7CisgIGlmIChmYWJzKGRlbikgPCBpbnRlcnNlY3Rpb25fZXBzaWxvbikgeworICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgKnggPSBheCArICgoYnggLSBheCkgKiBudW0gLyBkZW4pOwogICAgICp5ID0gYXkgKyAoKGJ5IC0gYXkpICogbnVtIC8gZGVuKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19tYXRoX3N0cm9rZS5oIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX21hdGhfc3Ryb2tlLmgKaW5kZXggMmIwNmIxYi4uODJkZjgwOCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWdnMjMvYWdnX21hdGhfc3Ryb2tlLmgKKysrIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX21hdGhfc3Ryb2tlLmgKQEAgLTQxLDI0ICs0MSwyNCBAQAogICAgIGlubmVyX2phZywKICAgICBpbm5lcl9yb3VuZAogfTsKLWNvbnN0IEZYX0ZMT0FUIHN0cm9rZV90aGV0YSA9IDEuMGYgLyAxMDAwLjBmOworY29uc3QgZmxvYXQgc3Ryb2tlX3RoZXRhID0gMS4wZiAvIDEwMDAuMGY7CiB0ZW1wbGF0ZTxjbGFzcyBWZXJ0ZXhDb25zdW1lcj4KIHZvaWQgc3Ryb2tlX2NhbGNfYXJjKFZlcnRleENvbnN1bWVyJiBvdXRfdmVydGljZXMsCi0gICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4LCAgIEZYX0ZMT0FUIHksCi0gICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkeDEsIEZYX0ZMT0FUIGR5MSwKLSAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGR4MiwgRlhfRkxPQVQgZHkyLAotICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBhcHByb3hpbWF0aW9uX3NjYWxlKQorICAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgICBmbG9hdCB5LAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZHgxLCBmbG9hdCBkeTEsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkeDIsIGZsb2F0IGR5MiwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYXBwcm94aW1hdGlvbl9zY2FsZSkKIHsKICAgICB0eXBlZGVmIHR5cGVuYW1lIFZlcnRleENvbnN1bWVyOjp2YWx1ZV90eXBlIGNvb3JkX3R5cGU7Ci0gICAgRlhfRkxPQVQgYTEgPSBGWFNZU19hdGFuMihkeTEsIGR4MSk7Ci0gICAgRlhfRkxPQVQgYTIgPSBGWFNZU19hdGFuMihkeTIsIGR4Mik7Ci0gICAgRlhfRkxPQVQgZGEgPSBhMSAtIGEyOworICAgIGZsb2F0IGExID0gYXRhbjIoZHkxLCBkeDEpOworICAgIGZsb2F0IGEyID0gYXRhbjIoZHkyLCBkeDIpOworICAgIGZsb2F0IGRhID0gYTEgLSBhMjsKICAgICBib29sIGNjdyA9IGRhID4gMCAmJiBkYSA8IEZYX1BJOwogICAgIGlmKHdpZHRoIDwgMCkgewogICAgICAgICB3aWR0aCA9IC13aWR0aDsKICAgICB9Ci0gICAgZGEgPSBGWFNZU19hY29zKHdpZHRoIC8gKHdpZHRoICsgKCgxLjBmIC8gOCkgLyBhcHByb3hpbWF0aW9uX3NjYWxlKSkpICogMjsKKyAgICBkYSA9IGFjb3Mod2lkdGggLyAod2lkdGggKyAoKDEuMGYgLyA4KSAvIGFwcHJveGltYXRpb25fc2NhbGUpKSkgKiAyOwogICAgIG91dF92ZXJ0aWNlcy5hZGQoY29vcmRfdHlwZSh4ICsgZHgxLCB5ICsgZHkxKSk7CiAgICAgaWYgKGRhID4gMCkgewogICAgICAgaWYgKCFjY3cpIHsKQEAgLTY4LDggKzY4LDggQEAKICAgICAgICAgYTIgLT0gZGEgLyA0OwogICAgICAgICBhMSArPSBkYTsKICAgICAgICAgd2hpbGUgKGExIDwgYTIpIHsKLSAgICAgICAgICBvdXRfdmVydGljZXMuYWRkKGNvb3JkX3R5cGUoeCArICh3aWR0aCAqIEZYU1lTX2NvcyhhMSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ICsgKHdpZHRoICogRlhTWVNfc2luKGExKSkpKTsKKyAgICAgICAgICBvdXRfdmVydGljZXMuYWRkKAorICAgICAgICAgICAgICBjb29yZF90eXBlKHggKyAod2lkdGggKiBjb3MoYTEpKSwgeSArICh3aWR0aCAqIHNpbihhMSkpKSk7CiAgICAgICAgICAgYTEgKz0gZGE7CiAgICAgICAgIH0KICAgICAgIH0gZWxzZSB7CkBAIC03OSw4ICs3OSw4IEBACiAgICAgICAgIGEyICs9IGRhIC8gNDsKICAgICAgICAgYTEgLT0gZGE7CiAgICAgICAgIHdoaWxlIChhMSA+IGEyKSB7Ci0gICAgICAgICAgb3V0X3ZlcnRpY2VzLmFkZChjb29yZF90eXBlKHggKyAod2lkdGggKiBGWFNZU19jb3MoYTEpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSArICh3aWR0aCAqIEZYU1lTX3NpbihhMSkpKSk7CisgICAgICAgICAgb3V0X3ZlcnRpY2VzLmFkZCgKKyAgICAgICAgICAgICAgY29vcmRfdHlwZSh4ICsgKHdpZHRoICogY29zKGExKSksIHkgKyAod2lkdGggKiBzaW4oYTEpKSkpOwogICAgICAgICAgIGExIC09IGRhOwogICAgICAgICB9CiAgICAgICB9CkBAIC05MiwzMSArOTIsMzEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVydGV4X2Rpc3QmIHYwLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0ZXhfZGlzdCYgdjEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRleF9kaXN0JiB2MiwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZHgxLCBGWF9GTE9BVCBkeTEsCi0gICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGR4MiwgRlhfRkxPQVQgZHkyLAotICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZHgxLCBmbG9hdCBkeTEsCisgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGR4MiwgZmxvYXQgZHkyLAorICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9qb2luX2UgbGluZV9qb2luLAotICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBtaXRlcl9saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYXBwcm94aW1hdGlvbl9zY2FsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWl0ZXJfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFwcHJveGltYXRpb25fc2NhbGUpCiB7CiAgICAgdHlwZWRlZiB0eXBlbmFtZSBWZXJ0ZXhDb25zdW1lcjo6dmFsdWVfdHlwZSBjb29yZF90eXBlOwotICAgIEZYX0ZMT0FUIHhpID0gdjEueDsKLSAgICBGWF9GTE9BVCB5aSA9IHYxLnk7CisgICAgZmxvYXQgeGkgPSB2MS54OworICAgIGZsb2F0IHlpID0gdjEueTsKICAgICBib29sIG1pdGVyX2xpbWl0X2V4Y2VlZGVkID0gdHJ1ZTsKICAgICBpZihjYWxjX2ludGVyc2VjdGlvbih2MC54ICsgZHgxLCB2MC55IC0gZHkxLAogICAgICAgICAgICAgICAgICAgICAgICAgIHYxLnggKyBkeDEsIHYxLnkgLSBkeTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdjEueCArIGR4MiwgdjEueSAtIGR5MiwKICAgICAgICAgICAgICAgICAgICAgICAgICB2Mi54ICsgZHgyLCB2Mi55IC0gZHkyLAogICAgICAgICAgICAgICAgICAgICAgICAgICZ4aSwgJnlpKSkgewotICAgICAgICBGWF9GTE9BVCBkMSA9IGNhbGNfZGlzdGFuY2UodjEueCwgdjEueSwgeGksIHlpKTsKLSAgICAgICAgRlhfRkxPQVQgbGltID0gd2lkdGggKiBtaXRlcl9saW1pdDsKKyAgICAgICAgZmxvYXQgZDEgPSBjYWxjX2Rpc3RhbmNlKHYxLngsIHYxLnksIHhpLCB5aSk7CisgICAgICAgIGZsb2F0IGxpbSA9IHdpZHRoICogbWl0ZXJfbGltaXQ7CiAgICAgICAgIGlmKGQxIDw9IGxpbSkgewogICAgICAgICAgICAgb3V0X3ZlcnRpY2VzLmFkZChjb29yZF90eXBlKHhpLCB5aSkpOwogICAgICAgICAgICAgbWl0ZXJfbGltaXRfZXhjZWVkZWQgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYX0ZMT0FUIHgyID0gdjEueCArIGR4MTsKLSAgICAgICAgRlhfRkxPQVQgeTIgPSB2MS55IC0gZHkxOworICAgICAgICBmbG9hdCB4MiA9IHYxLnggKyBkeDE7CisgICAgICAgIGZsb2F0IHkyID0gdjEueSAtIGR5MTsKICAgICAgICAgaWYgKCgoKHgyIC0gdjAueCkgKiBkeTEpIC0gKCh2MC55IC0geTIpICogZHgxKSA8IDApICE9CiAgICAgICAgICAgICAoKCh4MiAtIHYyLngpICogZHkxKSAtICgodjIueSAtIHkyKSAqIGR4MSkgPCAwKSkgewogICAgICAgICAgICAgb3V0X3ZlcnRpY2VzLmFkZChjb29yZF90eXBlKHYxLnggKyBkeDEsIHYxLnkgLSBkeTEpKTsKQEAgLTE0NywxNyArMTQ3LDE3IEBACiB2b2lkIHN0cm9rZV9jYWxjX2NhcChWZXJ0ZXhDb25zdW1lciYgb3V0X3ZlcnRpY2VzLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVydGV4X2Rpc3QmIHYwLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVydGV4X2Rpc3QmIHYxLAotICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGVuLAogICAgICAgICAgICAgICAgICAgICAgbGluZV9jYXBfZSBsaW5lX2NhcCwKLSAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgYXBwcm94aW1hdGlvbl9zY2FsZSkKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYXBwcm94aW1hdGlvbl9zY2FsZSkKIHsKICAgICB0eXBlZGVmIHR5cGVuYW1lIFZlcnRleENvbnN1bWVyOjp2YWx1ZV90eXBlIGNvb3JkX3R5cGU7CiAgICAgb3V0X3ZlcnRpY2VzLnJlbW92ZV9hbGwoKTsKLSAgICBGWF9GTE9BVCBkeDEgPSAodjEueSAtIHYwLnkpIC8gbGVuOwotICAgIEZYX0ZMT0FUIGR5MSA9ICh2MS54IC0gdjAueCkgLyBsZW47Ci0gICAgRlhfRkxPQVQgZHgyID0gMDsKLSAgICBGWF9GTE9BVCBkeTIgPSAwOworICAgIGZsb2F0IGR4MSA9ICh2MS55IC0gdjAueSkgLyBsZW47CisgICAgZmxvYXQgZHkxID0gKHYxLnggLSB2MC54KSAvIGxlbjsKKyAgICBmbG9hdCBkeDIgPSAwOworICAgIGZsb2F0IGR5MiA9IDA7CiAgICAgZHgxID0gZHgxICogd2lkdGg7CiAgICAgZHkxID0gZHkxICogd2lkdGg7CiAgICAgaWYobGluZV9jYXAgIT0gcm91bmRfY2FwKSB7CkBAIC0xNjgsMTggKzE2OCwxNiBAQAogICAgICAgICBvdXRfdmVydGljZXMuYWRkKGNvb3JkX3R5cGUodjAueCAtIGR4MSAtIGR4MiwgdjAueSArIGR5MSAtIGR5MikpOwogICAgICAgICBvdXRfdmVydGljZXMuYWRkKGNvb3JkX3R5cGUodjAueCArIGR4MSAtIGR4MiwgdjAueSAtIGR5MSAtIGR5MikpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEZYX0ZMT0FUIGExID0gRlhTWVNfYXRhbjIoZHkxLCAtZHgxKTsKLSAgICAgICAgRlhfRkxPQVQgYTIgPSBhMSArIEZYX1BJOwotICAgICAgICBGWF9GTE9BVCBkYSA9Ci0gICAgICAgICAgICBGWFNZU19hY29zKHdpZHRoIC8gKHdpZHRoICsgKCgxLjBmIC8gOCkgLyBhcHByb3hpbWF0aW9uX3NjYWxlKSkpICoKLSAgICAgICAgICAgIDI7Ci0gICAgICAgIG91dF92ZXJ0aWNlcy5hZGQoY29vcmRfdHlwZSh2MC54IC0gZHgxLCB2MC55ICsgZHkxKSk7CisgICAgICBmbG9hdCBhMSA9IGF0YW4yKGR5MSwgLWR4MSk7CisgICAgICBmbG9hdCBhMiA9IGExICsgRlhfUEk7CisgICAgICBmbG9hdCBkYSA9IGFjb3Mod2lkdGggLyAod2lkdGggKyAoKDEuMGYgLyA4KSAvIGFwcHJveGltYXRpb25fc2NhbGUpKSkgKiAyOworICAgICAgb3V0X3ZlcnRpY2VzLmFkZChjb29yZF90eXBlKHYwLnggLSBkeDEsIHYwLnkgKyBkeTEpKTsKKyAgICAgIGExICs9IGRhOworICAgICAgYTIgLT0gZGEgLyA0OworICAgICAgd2hpbGUgKGExIDwgYTIpIHsKKyAgICAgICAgb3V0X3ZlcnRpY2VzLmFkZCgKKyAgICAgICAgICAgIGNvb3JkX3R5cGUodjAueCArICh3aWR0aCAqIGNvcyhhMSkpLCB2MC55ICsgKHdpZHRoICogc2luKGExKSkpKTsKICAgICAgICAgYTEgKz0gZGE7Ci0gICAgICAgIGEyIC09IGRhIC8gNDsKLSAgICAgICAgd2hpbGUoYTEgPCBhMikgewotICAgICAgICAgIG91dF92ZXJ0aWNlcy5hZGQoY29vcmRfdHlwZSh2MC54ICsgKHdpZHRoICogRlhTWVNfY29zKGExKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYwLnkgKyAod2lkdGggKiBGWFNZU19zaW4oYTEpKSkpOwotICAgICAgICAgICAgYTEgKz0gZGE7CiAgICAgICAgIH0KICAgICAgICAgb3V0X3ZlcnRpY2VzLmFkZChjb29yZF90eXBlKHYwLnggKyBkeDEsIHYwLnkgLSBkeTEpKTsKICAgICB9CkBAIC0xODksMTcgKzE4NywxNyBAQAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlcnRleF9kaXN0JiB2MCwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0ZXhfZGlzdCYgdjEsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVydGV4X2Rpc3QmIHYyLAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGxlbjEsCi0gICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbGVuMiwKLSAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZW4xLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxlbjIsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgbGluZV9qb2luX2UgbGluZV9qb2luLAogICAgICAgICAgICAgICAgICAgICAgIGlubmVyX2pvaW5fZSBpbm5lcl9qb2luLAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIG1pdGVyX2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGlubmVyX21pdGVyX2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGFwcHJveGltYXRpb25fc2NhbGUpCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWl0ZXJfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaW5uZXJfbWl0ZXJfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYXBwcm94aW1hdGlvbl9zY2FsZSkKIHsKICAgICB0eXBlZGVmIHR5cGVuYW1lIFZlcnRleENvbnN1bWVyOjp2YWx1ZV90eXBlIGNvb3JkX3R5cGU7Ci0gICAgRlhfRkxPQVQgZHgxLCBkeTEsIGR4MiwgZHkyOworICAgIGZsb2F0IGR4MSwgZHkxLCBkeDIsIGR5MjsKICAgICBkeDEgPSB3aWR0aCAqICh2MS55IC0gdjAueSkgLyBsZW4xOwogICAgIGR5MSA9IHdpZHRoICogKHYxLnggLSB2MC54KSAvIGxlbjE7CiAgICAgZHgyID0gd2lkdGggKiAodjIueSAtIHYxLnkpIC8gbGVuMjsKQEAgLTIyMSw3ICsyMTksNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBpbm5lcl9qYWc6CiAgICAgICAgICAgICBjYXNlIGlubmVyX3JvdW5kOiB7Ci0gICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGQgPSAoZHgxIC0gZHgyKSAqIChkeDEgLSBkeDIpICsgKGR5MSAtIGR5MikgKiAoZHkxIC0gZHkyKTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgZCA9IChkeDEgLSBkeDIpICogKGR4MSAtIGR4MikgKyAoZHkxIC0gZHkyKSAqIChkeTEgLSBkeTIpOwogICAgICAgICAgICAgICAgICAgICBpZihkIDwgbGVuMSAqIGxlbjEgJiYgZCA8IGxlbjIgKiBsZW4yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VfY2FsY19taXRlcihvdXRfdmVydGljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MCwgdjEsIHYyLCBkeDEsIGR5MSwgZHgyLCBkeTIsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfcGF0aF9zdG9yYWdlLmNwcCBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19wYXRoX3N0b3JhZ2UuY3BwCmluZGV4IDk2ODc0NjcuLjA2M2VjZTUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19wYXRoX3N0b3JhZ2UuY3BwCisrKyBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19wYXRoX3N0b3JhZ2UuY3BwCkBAIC0yMywxNiArMjMsMTcgQEAKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotI2luY2x1ZGUgImFnZ19tYXRoLmgiCiAjaW5jbHVkZSAiYWdnX3BhdGhfc3RvcmFnZS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKKworI2luY2x1ZGUgImFnZ19tYXRoLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9tZW1vcnkuaCIKIAogbmFtZXNwYWNlIGFnZwogewogcGF0aF9zdG9yYWdlOjp+cGF0aF9zdG9yYWdlKCkKIHsKICAgICBpZihtX3RvdGFsX2Jsb2NrcykgewotICAgICAgICBGWF9GTE9BVCoqIGNvb3JkX2JsayA9IG1fY29vcmRfYmxvY2tzICsgbV90b3RhbF9ibG9ja3MgLSAxOworICAgICAgICBmbG9hdCoqIGNvb3JkX2JsayA9IG1fY29vcmRfYmxvY2tzICsgbV90b3RhbF9ibG9ja3MgLSAxOwogICAgICAgICB3aGlsZShtX3RvdGFsX2Jsb2Nrcy0tKSB7CiAgICAgICAgICAgICBGWF9GcmVlKCpjb29yZF9ibGspOwogICAgICAgICAgICAgLS1jb29yZF9ibGs7CkBAIC01MiwyNyArNTMsMjMgQEAKIHZvaWQgcGF0aF9zdG9yYWdlOjphbGxvY2F0ZV9ibG9jayh1bnNpZ25lZCBuYikKIHsKICAgICBpZihuYiA+PSBtX21heF9ibG9ja3MpIHsKLSAgICAgICAgRlhfRkxPQVQqKiBuZXdfY29vcmRzID0KLSAgICAgICAgICAgIEZYX0FsbG9jMkQoRlhfRkxPQVQqLCBtX21heF9ibG9ja3MgKyBibG9ja19wb29sLCAyKTsKKyAgICAgICAgZmxvYXQqKiBuZXdfY29vcmRzID0KKyAgICAgICAgICAgIEZYX0FsbG9jMkQoZmxvYXQqLCBtX21heF9ibG9ja3MgKyBibG9ja19wb29sLCAyKTsKICAgICAgICAgdW5zaWduZWQgY2hhcioqIG5ld19jbWRzID0KICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyKiopKG5ld19jb29yZHMgKyBtX21heF9ibG9ja3MgKyBibG9ja19wb29sKTsKICAgICAgICAgaWYobV9jb29yZF9ibG9ja3MpIHsKLSAgICAgICAgICAgIEZYU1lTX21lbWNweShuZXdfY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb29yZF9ibG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX21heF9ibG9ja3MgKiBzaXplb2YoRlhfRkxPQVQqKSk7Ci0gICAgICAgICAgICBGWFNZU19tZW1jcHkobmV3X2NtZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NtZF9ibG9ja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX21heF9ibG9ja3MgKiBzaXplb2YodW5zaWduZWQgY2hhciopKTsKLSAgICAgICAgICAgIEZYX0ZyZWUobV9jb29yZF9ibG9ja3MpOworICAgICAgICAgIG1lbWNweShuZXdfY29vcmRzLCBtX2Nvb3JkX2Jsb2NrcywgbV9tYXhfYmxvY2tzICogc2l6ZW9mKGZsb2F0KikpOworICAgICAgICAgIG1lbWNweShuZXdfY21kcywgbV9jbWRfYmxvY2tzLCBtX21heF9ibG9ja3MgKiBzaXplb2YodW5zaWduZWQgY2hhciopKTsKKyAgICAgICAgICBGWF9GcmVlKG1fY29vcmRfYmxvY2tzKTsKICAgICAgICAgfQogICAgICAgICBtX2Nvb3JkX2Jsb2NrcyA9IG5ld19jb29yZHM7CiAgICAgICAgIG1fY21kX2Jsb2NrcyA9IG5ld19jbWRzOwogICAgICAgICBtX21heF9ibG9ja3MgKz0gYmxvY2tfcG9vbDsKICAgICB9CiAgICAgbV9jb29yZF9ibG9ja3NbbmJdID0KLSAgICAgICAgRlhfQWxsb2MoIEZYX0ZMT0FULCBibG9ja19zaXplICogMiArCisgICAgICAgIEZYX0FsbG9jKCBmbG9hdCwgYmxvY2tfc2l6ZSAqIDIgKwogICAgICAgICAgICAgICAgICAgYmxvY2tfc2l6ZSAvCi0gICAgICAgICAgICAgICAgICAoc2l6ZW9mKEZYX0ZMT0FUKSAvIHNpemVvZih1bnNpZ25lZCBjaGFyKSkpOworICAgICAgICAgICAgICAgICAgKHNpemVvZihmbG9hdCkgLyBzaXplb2YodW5zaWduZWQgY2hhcikpKTsKICAgICBtX2NtZF9ibG9ja3NbbmJdICA9CiAgICAgICAgICh1bnNpZ25lZCBjaGFyKikobV9jb29yZF9ibG9ja3NbbmJdICsgYmxvY2tfc2l6ZSAqIDIpOwogICAgIG1fdG90YWxfYmxvY2tzKys7CkBAIC04MSw5ICs3OCw5IEBACiB7CiAgICAgbV9pdGVyYXRvciA9IHBhdGhfaWQ7CiB9Ci12b2lkIHBhdGhfc3RvcmFnZTo6Y3VydmU0KEZYX0ZMT0FUIHhfY3RybDEsIEZYX0ZMT0FUIHlfY3RybDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHhfY3RybDIsIEZYX0ZMT0FUIHlfY3RybDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHhfdG8sICAgIEZYX0ZMT0FUIHlfdG8pCit2b2lkIHBhdGhfc3RvcmFnZTo6Y3VydmU0KGZsb2F0IHhfY3RybDEsIGZsb2F0IHlfY3RybDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHhfY3RybDIsIGZsb2F0IHlfY3RybDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHhfdG8sICAgIGZsb2F0IHlfdG8pCiB7CiAgICAgYWRkX3ZlcnRleCh4X2N0cmwxLCB5X2N0cmwxLCBwYXRoX2NtZF9jdXJ2ZTQpOwogICAgIGFkZF92ZXJ0ZXgoeF9jdHJsMiwgeV9jdHJsMiwgcGF0aF9jbWRfY3VydmU0KTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19wYXRoX3N0b3JhZ2UuaCBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19wYXRoX3N0b3JhZ2UuaAppbmRleCA3ZjIxYmFjLi4xN2U4MmQ3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfcGF0aF9zdG9yYWdlLmgKKysrIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX3BhdGhfc3RvcmFnZS5oCkBAIC0zNiw3ICszNiw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIG1fdmVydGV4X2lkeCA9IHBhdGhfaWQ7CiAgICAgICAgIH0KLSAgICAgICAgdW5zaWduZWQgdmVydGV4KEZYX0ZMT0FUKiB4LCBGWF9GTE9BVCogeSkKKyAgICAgICAgdW5zaWduZWQgdmVydGV4KGZsb2F0KiB4LCBmbG9hdCogeSkKICAgICAgICAgewogICAgICAgICAgIHJldHVybiAobV92ZXJ0ZXhfaWR4IDwgbV9wYXRoLT50b3RhbF92ZXJ0aWNlcygpKQogICAgICAgICAgICAgICAgICAgICAgPyBtX3BhdGgtPnZlcnRleChtX3ZlcnRleF9pZHgrKywgeCwgeSkKQEAgLTQ4LDE5ICs0OCwxOSBAQAogICAgIH07CiAgICAgfnBhdGhfc3RvcmFnZSgpOwogICAgIHBhdGhfc3RvcmFnZSgpOwotICAgIHVuc2lnbmVkIGxhc3RfdmVydGV4KEZYX0ZMT0FUKiB4LCBGWF9GTE9BVCogeSkgY29uc3Q7Ci0gICAgdW5zaWduZWQgcHJldl92ZXJ0ZXgoRlhfRkxPQVQqIHgsIEZYX0ZMT0FUKiB5KSBjb25zdDsKLSAgICB2b2lkIG1vdmVfdG8oRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSk7Ci0gICAgdm9pZCBsaW5lX3RvKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpOwotICAgIHZvaWQgY3VydmU0KEZYX0ZMT0FUIHhfY3RybDEsIEZYX0ZMT0FUIHlfY3RybDEsCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQgeF9jdHJsMiwgRlhfRkxPQVQgeV9jdHJsMiwKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCB4X3RvLCAgICBGWF9GTE9BVCB5X3RvKTsKKyAgICB1bnNpZ25lZCBsYXN0X3ZlcnRleChmbG9hdCogeCwgZmxvYXQqIHkpIGNvbnN0OworICAgIHVuc2lnbmVkIHByZXZfdmVydGV4KGZsb2F0KiB4LCBmbG9hdCogeSkgY29uc3Q7CisgICAgdm9pZCBtb3ZlX3RvKGZsb2F0IHgsIGZsb2F0IHkpOworICAgIHZvaWQgbGluZV90byhmbG9hdCB4LCBmbG9hdCB5KTsKKyAgICB2b2lkIGN1cnZlNChmbG9hdCB4X2N0cmwxLCBmbG9hdCB5X2N0cmwxLAorICAgICAgICAgICAgICAgIGZsb2F0IHhfY3RybDIsIGZsb2F0IHlfY3RybDIsCisgICAgICAgICAgICAgICAgZmxvYXQgeF90bywgICAgZmxvYXQgeV90byk7CiAgICAgdGVtcGxhdGU8Y2xhc3MgVmVydGV4U291cmNlPgogICAgIHZvaWQgYWRkX3BhdGgoVmVydGV4U291cmNlJiB2cywKICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBhdGhfaWQgPSAwLAogICAgICAgICAgICAgICAgICAgYm9vbCBzb2xpZF9wYXRoID0gdHJ1ZSkKICAgICB7Ci0gICAgICAgIEZYX0ZMT0FUIHgsIHk7CisgICAgICAgIGZsb2F0IHgsIHk7CiAgICAgICAgIHVuc2lnbmVkIGNtZDsKICAgICAgICAgdnMucmV3aW5kKHBhdGhfaWQpOwogICAgICAgICB3aGlsZSghaXNfc3RvcChjbWQgPSB2cy52ZXJ0ZXgoJngsICZ5KSkpIHsKQEAgLTc1LDcgKzc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBhdGhfaWQgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzb2xpZF9wYXRoID0gdHJ1ZSkKICAgICB7Ci0gICAgICAgIEZYX0ZMT0FUIHgsIHk7CisgICAgICAgIGZsb2F0IHgsIHk7CiAgICAgICAgIHVuc2lnbmVkIGNtZDsKICAgICAgICAgaW50IGZsYWc7CiAgICAgICAgIHZzLnJld2luZChwYXRoX2lkKTsKQEAgLTkwLDEwICs5MCwxMCBAQAogICAgIHsKICAgICAgICAgcmV0dXJuIG1fdG90YWxfdmVydGljZXM7CiAgICAgfQotICAgIHVuc2lnbmVkIHZlcnRleCh1bnNpZ25lZCBpZHgsIEZYX0ZMT0FUKiB4LCBGWF9GTE9BVCogeSkgY29uc3QKKyAgICB1bnNpZ25lZCB2ZXJ0ZXgodW5zaWduZWQgaWR4LCBmbG9hdCogeCwgZmxvYXQqIHkpIGNvbnN0CiAgICAgewogICAgICAgICB1bnNpZ25lZCBuYiA9IGlkeCA+PiBibG9ja19zaGlmdDsKLSAgICAgICAgY29uc3QgRlhfRkxPQVQqIHB2ID0gbV9jb29yZF9ibG9ja3NbbmJdICsgKChpZHggJiBibG9ja19tYXNrKSA8PCAxKTsKKyAgICAgICAgY29uc3QgZmxvYXQqIHB2ID0gbV9jb29yZF9ibG9ja3NbbmJdICsgKChpZHggJiBibG9ja19tYXNrKSA8PCAxKTsKICAgICAgICAgKnggPSAqcHYrKzsKICAgICAgICAgKnkgPSAqcHY7CiAgICAgICAgIHJldHVybiBtX2NtZF9ibG9ja3NbbmJdW2lkeCAmIGJsb2NrX21hc2tdOwpAQCAtMTA3LDQyICsxMDcsNDIgQEAKICAgICAgICAgcmV0dXJuIG1fY21kX2Jsb2Nrc1tpZHggPj4gYmxvY2tfc2hpZnRdW2lkeCAmIGJsb2NrX21hc2tdICYgcGF0aF9mbGFnc19qcjsKICAgICB9CiAgICAgdm9pZCAgICAgcmV3aW5kKHVuc2lnbmVkIHBhdGhfaWQpOwotICAgIHVuc2lnbmVkIHZlcnRleChGWF9GTE9BVCogeCwgRlhfRkxPQVQqIHkpOwotICAgIHZvaWQgYWRkX3ZlcnRleChGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCB1bnNpZ25lZCBjbWQpOworICAgIHVuc2lnbmVkIHZlcnRleChmbG9hdCogeCwgZmxvYXQqIHkpOworICAgIHZvaWQgYWRkX3ZlcnRleChmbG9hdCB4LCBmbG9hdCB5LCB1bnNpZ25lZCBjbWQpOwogICAgIHZvaWQgZW5kX3BvbHkoKTsKIHByaXZhdGU6CiAgICAgdm9pZCBhbGxvY2F0ZV9ibG9jayh1bnNpZ25lZCBuYik7Ci0gICAgdW5zaWduZWQgY2hhciogc3RvcmFnZV9wdHJzKEZYX0ZMT0FUKiogeHlfcHRyKTsKKyAgICB1bnNpZ25lZCBjaGFyKiBzdG9yYWdlX3B0cnMoZmxvYXQqKiB4eV9wdHIpOwogcHJpdmF0ZToKICAgICB1bnNpZ25lZCAgICAgICAgbV90b3RhbF92ZXJ0aWNlczsKICAgICB1bnNpZ25lZCAgICAgICAgbV90b3RhbF9ibG9ja3M7CiAgICAgdW5zaWduZWQgICAgICAgIG1fbWF4X2Jsb2NrczsKLSAgICBGWF9GTE9BVCoqICAgbV9jb29yZF9ibG9ja3M7CisgICAgZmxvYXQqKiAgIG1fY29vcmRfYmxvY2tzOwogICAgIHVuc2lnbmVkIGNoYXIqKiBtX2NtZF9ibG9ja3M7CiAgICAgdW5zaWduZWQgICAgICAgIG1faXRlcmF0b3I7CiB9OwotaW5saW5lIHVuc2lnbmVkIHBhdGhfc3RvcmFnZTo6dmVydGV4KEZYX0ZMT0FUKiB4LCBGWF9GTE9BVCogeSkKK2lubGluZSB1bnNpZ25lZCBwYXRoX3N0b3JhZ2U6OnZlcnRleChmbG9hdCogeCwgZmxvYXQqIHkpCiB7CiAgICAgaWYobV9pdGVyYXRvciA+PSBtX3RvdGFsX3ZlcnRpY2VzKSB7CiAgICAgICAgIHJldHVybiBwYXRoX2NtZF9zdG9wOwogICAgIH0KICAgICByZXR1cm4gdmVydGV4KG1faXRlcmF0b3IrKywgeCwgeSk7CiB9Ci1pbmxpbmUgdW5zaWduZWQgcGF0aF9zdG9yYWdlOjpwcmV2X3ZlcnRleChGWF9GTE9BVCogeCwgRlhfRkxPQVQqIHkpIGNvbnN0CitpbmxpbmUgdW5zaWduZWQgcGF0aF9zdG9yYWdlOjpwcmV2X3ZlcnRleChmbG9hdCogeCwgZmxvYXQqIHkpIGNvbnN0CiB7CiAgICAgaWYobV90b3RhbF92ZXJ0aWNlcyA+IDEpIHsKICAgICAgICAgcmV0dXJuIHZlcnRleChtX3RvdGFsX3ZlcnRpY2VzIC0gMiwgeCwgeSk7CiAgICAgfQogICAgIHJldHVybiBwYXRoX2NtZF9zdG9wOwogfQotaW5saW5lIHVuc2lnbmVkIHBhdGhfc3RvcmFnZTo6bGFzdF92ZXJ0ZXgoRlhfRkxPQVQqIHgsIEZYX0ZMT0FUKiB5KSBjb25zdAoraW5saW5lIHVuc2lnbmVkIHBhdGhfc3RvcmFnZTo6bGFzdF92ZXJ0ZXgoZmxvYXQqIHgsIGZsb2F0KiB5KSBjb25zdAogewogICAgIGlmKG1fdG90YWxfdmVydGljZXMpIHsKICAgICAgICAgcmV0dXJuIHZlcnRleChtX3RvdGFsX3ZlcnRpY2VzIC0gMSwgeCwgeSk7CiAgICAgfQogICAgIHJldHVybiBwYXRoX2NtZF9zdG9wOwogfQotaW5saW5lIHVuc2lnbmVkIGNoYXIqIHBhdGhfc3RvcmFnZTo6c3RvcmFnZV9wdHJzKEZYX0ZMT0FUKiogeHlfcHRyKQoraW5saW5lIHVuc2lnbmVkIGNoYXIqIHBhdGhfc3RvcmFnZTo6c3RvcmFnZV9wdHJzKGZsb2F0KiogeHlfcHRyKQogewogICAgIHVuc2lnbmVkIG5iID0gbV90b3RhbF92ZXJ0aWNlcyA+PiBibG9ja19zaGlmdDsKICAgICBpZihuYiA+PSBtX3RvdGFsX2Jsb2NrcykgewpAQCAtMTUxLDIwICsxNTEsMjAgQEAKICAgICAqeHlfcHRyID0gbV9jb29yZF9ibG9ja3NbbmJdICsgKChtX3RvdGFsX3ZlcnRpY2VzICYgYmxvY2tfbWFzaykgPDwgMSk7CiAgICAgcmV0dXJuIG1fY21kX2Jsb2Nrc1tuYl0gKyAobV90b3RhbF92ZXJ0aWNlcyAmIGJsb2NrX21hc2spOwogfQotaW5saW5lIHZvaWQgcGF0aF9zdG9yYWdlOjphZGRfdmVydGV4KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIHVuc2lnbmVkIGNtZCkKK2lubGluZSB2b2lkIHBhdGhfc3RvcmFnZTo6YWRkX3ZlcnRleChmbG9hdCB4LCBmbG9hdCB5LCB1bnNpZ25lZCBjbWQpCiB7Ci0gICAgRlhfRkxPQVQqIGNvb3JkX3B0ciA9IDA7CisgICAgZmxvYXQqIGNvb3JkX3B0ciA9IDA7CiAgICAgdW5zaWduZWQgY2hhciogY21kX3B0ciA9IHN0b3JhZ2VfcHRycygmY29vcmRfcHRyKTsKICAgICAqY21kX3B0ciA9ICh1bnNpZ25lZCBjaGFyKWNtZDsKICAgICAqY29vcmRfcHRyKysgPSB4OwogICAgICpjb29yZF9wdHIgICA9IHk7CiAgICAgbV90b3RhbF92ZXJ0aWNlcysrOwogfQotaW5saW5lIHZvaWQgcGF0aF9zdG9yYWdlOjptb3ZlX3RvKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpCitpbmxpbmUgdm9pZCBwYXRoX3N0b3JhZ2U6Om1vdmVfdG8oZmxvYXQgeCwgZmxvYXQgeSkKIHsKICAgICBhZGRfdmVydGV4KHgsIHksIHBhdGhfY21kX21vdmVfdG8pOwogfQotaW5saW5lIHZvaWQgcGF0aF9zdG9yYWdlOjpsaW5lX3RvKEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHkpCitpbmxpbmUgdm9pZCBwYXRoX3N0b3JhZ2U6OmxpbmVfdG8oZmxvYXQgeCwgZmxvYXQgeSkKIHsKICAgICBhZGRfdmVydGV4KHgsIHksIHBhdGhfY21kX2xpbmVfdG8pOwogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWdnMjMvYWdnX3Jhc3Rlcml6ZXJfc2NhbmxpbmVfYWEuY3BwIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX3Jhc3Rlcml6ZXJfc2NhbmxpbmVfYWEuY3BwCmluZGV4IGFmNmRkNTguLmM5MGJkYWYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19yYXN0ZXJpemVyX3NjYW5saW5lX2FhLmNwcAorKysgYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfcmFzdGVyaXplcl9zY2FubGluZV9hYS5jcHAKQEAgLTExOCw4ICsxMTgsOCBAQAogICAgICAgICBpZihtX251bV9ibG9ja3MgPj0gbV9tYXhfYmxvY2tzKSB7CiAgICAgICAgICAgICBjZWxsX2FhKiogbmV3X2NlbGxzID0gRlhfQWxsb2MoIGNlbGxfYWEqLCBtX21heF9ibG9ja3MgKyBjZWxsX2Jsb2NrX3Bvb2wpOwogICAgICAgICAgICAgaWYobV9jZWxscykgewotICAgICAgICAgICAgICAgIEZYU1lTX21lbWNweShuZXdfY2VsbHMsIG1fY2VsbHMsIG1fbWF4X2Jsb2NrcyAqIHNpemVvZihjZWxsX2FhKikpOwotICAgICAgICAgICAgICAgIEZYX0ZyZWUobV9jZWxscyk7CisgICAgICAgICAgICAgIG1lbWNweShuZXdfY2VsbHMsIG1fY2VsbHMsIG1fbWF4X2Jsb2NrcyAqIHNpemVvZihjZWxsX2FhKikpOworICAgICAgICAgICAgICBGWF9GcmVlKG1fY2VsbHMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbV9jZWxscyA9IG5ld19jZWxsczsKICAgICAgICAgICAgIG1fbWF4X2Jsb2NrcyArPSBjZWxsX2Jsb2NrX3Bvb2w7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfcmFzdGVyaXplcl9zY2FubGluZV9hYS5oIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX3Jhc3Rlcml6ZXJfc2NhbmxpbmVfYWEuaAppbmRleCBmYzI4MjkwLi5jNzQ3ZWUzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfcmFzdGVyaXplcl9zY2FubGluZV9hYS5oCisrKyBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19yYXN0ZXJpemVyX3NjYW5saW5lX2FhLmgKQEAgLTQ1LDcgKzQ1LDcgQEAKICAgICBwb2x5X2Jhc2Vfc2l6ZSAgPSAxIDw8IHBvbHlfYmFzZV9zaGlmdCwKICAgICBwb2x5X2Jhc2VfbWFzayAgPSBwb2x5X2Jhc2Vfc2l6ZSAtIDEKIH07Ci1pbmxpbmUgaW50IHBvbHlfY29vcmQoRlhfRkxPQVQgYykKK2lubGluZSBpbnQgcG9seV9jb29yZChmbG9hdCBjKQogewogICAgIHJldHVybiBpbnQoYyAqIHBvbHlfYmFzZV9zaXplKTsKIH0KQEAgLTIxOSwxNCArMjE5LDE0IEBACiAgICAgICAgIG1fb3V0bGluZS5yZXNldCgpOwogICAgICAgICBtX3N0YXR1cyA9IHN0YXR1c19pbml0aWFsOwogICAgIH0KLSAgICB2b2lkIGNsaXBfYm94KEZYX0ZMT0FUIHgxLCBGWF9GTE9BVCB5MSwgRlhfRkxPQVQgeDIsIEZYX0ZMT0FUIHkyKQorICAgIHZvaWQgY2xpcF9ib3goZmxvYXQgeDEsIGZsb2F0IHkxLCBmbG9hdCB4MiwgZmxvYXQgeTIpCiAgICAgewogICAgICAgICBtX2NsaXBfYm94ID0gcmVjdChwb2x5X2Nvb3JkKHgxKSwgcG9seV9jb29yZCh5MSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbHlfY29vcmQoeDIpLCBwb2x5X2Nvb3JkKHkyKSk7CiAgICAgICAgIG1fY2xpcF9ib3gubm9ybWFsaXplKCk7CiAgICAgICAgIG1fY2xpcHBpbmcgPSB0cnVlOwogICAgIH0KLSAgICB2b2lkIGFkZF92ZXJ0ZXgoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgdW5zaWduZWQgY21kKQorICAgIHZvaWQgYWRkX3ZlcnRleChmbG9hdCB4LCBmbG9hdCB5LCB1bnNpZ25lZCBjbWQpCiAgICAgewogICAgICAgICBpZihpc19jbG9zZShjbWQpKSB7CiAgICAgICAgICAgICBjbG9zZV9wb2x5Z29uKCk7CkBAIC0zNzQsOCArMzc0LDggQEAKICAgICB0ZW1wbGF0ZTxjbGFzcyBWZXJ0ZXhTb3VyY2U+CiAgICAgdm9pZCBhZGRfcGF0aChWZXJ0ZXhTb3VyY2UmIHZzLCB1bnNpZ25lZCBwYXRoX2lkID0gMCkKICAgICB7Ci0gICAgICAgIEZYX0ZMT0FUIHg7Ci0gICAgICAgIEZYX0ZMT0FUIHk7CisgICAgICAgIGZsb2F0IHg7CisgICAgICAgIGZsb2F0IHk7CiAgICAgICAgIHVuc2lnbmVkIGNtZDsKICAgICAgICAgdnMucmV3aW5kKHBhdGhfaWQpOwogICAgICAgICB3aGlsZSghaXNfc3RvcChjbWQgPSB2cy52ZXJ0ZXgoJngsICZ5KSkpIHsKQEAgLTM4NSw4ICszODUsOCBAQAogICAgIHRlbXBsYXRlPGNsYXNzIFZlcnRleFNvdXJjZT4KICAgICB2b2lkIGFkZF9wYXRoX3RyYW5zZm9ybWVkKFZlcnRleFNvdXJjZSYgdnMsIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgsIHVuc2lnbmVkIHBhdGhfaWQgPSAwKQogICAgIHsKLSAgICAgICAgRlhfRkxPQVQgeDsKLSAgICAgICAgRlhfRkxPQVQgeTsKKyAgICAgICAgZmxvYXQgeDsKKyAgICAgICAgZmxvYXQgeTsKICAgICAgICAgdW5zaWduZWQgY21kOwogICAgICAgICB2cy5yZXdpbmQocGF0aF9pZCk7CiAgICAgICAgIHdoaWxlKCFpc19zdG9wKGNtZCA9IHZzLnZlcnRleCgmeCwgJnkpKSkgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYWdnMjMvYWdnX3NjYW5saW5lX3UuaCBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19zY2FubGluZV91LmgKaW5kZXggMjEwMDExNS4uODQ0ZGM5YSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWdnMjMvYWdnX3NjYW5saW5lX3UuaAorKysgYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfc2NhbmxpbmVfdS5oCkBAIC04Myw3ICs4Myw3IEBACiAgICAgdm9pZCBhZGRfY2VsbHMoaW50IHgsIHVuc2lnbmVkIGxlbiwgY29uc3QgQ292ZXJUKiBjb3ZlcnMpCiAgICAgewogICAgICAgICB4IC09IG1fbWluX3g7Ci0gICAgICAgIEZYU1lTX21lbWNweShtX2NvdmVycyArIHgsIGNvdmVycywgbGVuICogc2l6ZW9mKENvdmVyVCkpOworICAgICAgICBtZW1jcHkobV9jb3ZlcnMgKyB4LCBjb3ZlcnMsIGxlbiAqIHNpemVvZihDb3ZlclQpKTsKICAgICAgICAgaWYoeCA9PSBtX2xhc3RfeCArIDEpIHsKICAgICAgICAgICAgIG1fY3VyX3NwYW4tPmxlbiArPSAoY29vcmRfdHlwZSlsZW47CiAgICAgICAgIH0gZWxzZSB7CkBAIC05Nyw3ICs5Nyw3IEBACiAgICAgdm9pZCBhZGRfc3BhbihpbnQgeCwgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBjb3ZlcikKICAgICB7CiAgICAgICAgIHggLT0gbV9taW5feDsKLSAgICAgICAgRlhTWVNfbWVtc2V0KG1fY292ZXJzICsgeCwgY292ZXIsIGxlbik7CisgICAgICAgIG1lbXNldChtX2NvdmVycyArIHgsIGNvdmVyLCBsZW4pOwogICAgICAgICBpZih4ID09IG1fbGFzdF94ICsgMSkgewogICAgICAgICAgICAgbV9jdXJfc3Bhbi0+bGVuICs9IChjb29yZF90eXBlKWxlbjsKICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19zaG9ydGVuX3BhdGguaCBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ19zaG9ydGVuX3BhdGguaAppbmRleCBkN2ViNGJlLi4yZjYyZWM1IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfc2hvcnRlbl9wYXRoLmgKKysrIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX3Nob3J0ZW5fcGF0aC5oCkBAIC0yMCwxMSArMjAsMTEgQEAKIG5hbWVzcGFjZSBhZ2cKIHsKIHRlbXBsYXRlPGNsYXNzIFZlcnRleFNlcXVlbmNlPgotdm9pZCBzaG9ydGVuX3BhdGgoVmVydGV4U2VxdWVuY2UmIHZzLCBGWF9GTE9BVCBzLCB1bnNpZ25lZCBjbG9zZWQgPSAwKQordm9pZCBzaG9ydGVuX3BhdGgoVmVydGV4U2VxdWVuY2UmIHZzLCBmbG9hdCBzLCB1bnNpZ25lZCBjbG9zZWQgPSAwKQogewogICAgIHR5cGVkZWYgdHlwZW5hbWUgVmVydGV4U2VxdWVuY2U6OnZhbHVlX3R5cGUgdmVydGV4X3R5cGU7CiAgICAgaWYocyA+IDAgJiYgdnMuc2l6ZSgpID4gMSkgewotICAgICAgICBGWF9GTE9BVCBkOworICAgICAgICBmbG9hdCBkOwogICAgICAgICBpbnQgbiA9IGludCh2cy5zaXplKCkgLSAyKTsKICAgICAgICAgd2hpbGUobikgewogICAgICAgICAgICAgZCA9IHZzW25dLmRpc3Q7CkBAIC00Miw4ICs0Miw4IEBACiAgICAgICAgICAgICB2ZXJ0ZXhfdHlwZSYgcHJldiA9IHZzW24gLSAxXTsKICAgICAgICAgICAgIHZlcnRleF90eXBlJiBsYXN0ID0gdnNbbl07CiAgICAgICAgICAgICBkID0gKHByZXYuZGlzdCAtIHMpIC8gcHJldi5kaXN0OwotICAgICAgICAgICAgRlhfRkxPQVQgeCA9IHByZXYueCArIChsYXN0LnggLSBwcmV2LngpICogZDsKLSAgICAgICAgICAgIEZYX0ZMT0FUIHkgPSBwcmV2LnkgKyAobGFzdC55IC0gcHJldi55KSAqIGQ7CisgICAgICAgICAgICBmbG9hdCB4ID0gcHJldi54ICsgKGxhc3QueCAtIHByZXYueCkgKiBkOworICAgICAgICAgICAgZmxvYXQgeSA9IHByZXYueSArIChsYXN0LnkgLSBwcmV2LnkpICogZDsKICAgICAgICAgICAgIGxhc3QueCA9IHg7CiAgICAgICAgICAgICBsYXN0LnkgPSB5OwogICAgICAgICAgICAgaWYoIXByZXYobGFzdCkpIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ192Y2dlbl9kYXNoLmNwcCBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ192Y2dlbl9kYXNoLmNwcAppbmRleCBiZDVhMjEyLi5mZGJkMmFhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfdmNnZW5fZGFzaC5jcHAKKysrIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX3ZjZ2VuX2Rhc2guY3BwCkBAIC0yMCw3ICsyMCw2IEBACiAKICNpbmNsdWRlICJhZ2dfc2hvcnRlbl9wYXRoLmgiCiAjaW5jbHVkZSAiYWdnX3ZjZ2VuX2Rhc2guaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCiAKIG5hbWVzcGFjZSBhZ2cKIHsKQEAgLTQ0LDcgKzQzLDcgQEAKICAgICBtX2N1cnJfZGFzaF9zdGFydCA9IDA7CiAgICAgbV9jdXJyX2Rhc2ggPSAwOwogfQotdm9pZCB2Y2dlbl9kYXNoOjphZGRfZGFzaChGWF9GTE9BVCBkYXNoX2xlbiwgRlhfRkxPQVQgZ2FwX2xlbikKK3ZvaWQgdmNnZW5fZGFzaDo6YWRkX2Rhc2goZmxvYXQgZGFzaF9sZW4sIGZsb2F0IGdhcF9sZW4pCiB7CiAgICAgaWYobV9udW1fZGFzaGVzIDwgbWF4X2Rhc2hlcykgewogICAgICAgICBtX3RvdGFsX2Rhc2hfbGVuICs9IGRhc2hfbGVuICsgZ2FwX2xlbjsKQEAgLTUyLDEyICs1MSwxMiBAQAogICAgICAgICBtX2Rhc2hlc1ttX251bV9kYXNoZXMrK10gPSBnYXBfbGVuOwogICAgIH0KIH0KLXZvaWQgdmNnZW5fZGFzaDo6ZGFzaF9zdGFydChGWF9GTE9BVCBkcykKK3ZvaWQgdmNnZW5fZGFzaDo6ZGFzaF9zdGFydChmbG9hdCBkcykKIHsKICAgICBtX2Rhc2hfc3RhcnQgPSBkczsKLSAgICBjYWxjX2Rhc2hfc3RhcnQoRlhTWVNfZmFicyhkcykpOworICAgIGNhbGNfZGFzaF9zdGFydChmYWJzKGRzKSk7CiB9Ci12b2lkIHZjZ2VuX2Rhc2g6OmNhbGNfZGFzaF9zdGFydChGWF9GTE9BVCBkcykKK3ZvaWQgdmNnZW5fZGFzaDo6Y2FsY19kYXNoX3N0YXJ0KGZsb2F0IGRzKQogewogICAgIG1fY3Vycl9kYXNoID0gMDsKICAgICBtX2N1cnJfZGFzaF9zdGFydCA9IDA7CkBAIC04MSw3ICs4MCw3IEBACiAgICAgbV9zcmNfdmVydGljZXMucmVtb3ZlX2FsbCgpOwogICAgIG1fY2xvc2VkID0gMDsKIH0KLXZvaWQgdmNnZW5fZGFzaDo6YWRkX3ZlcnRleChGWF9GTE9BVCB4LCBGWF9GTE9BVCB5LCB1bnNpZ25lZCBjbWQpCit2b2lkIHZjZ2VuX2Rhc2g6OmFkZF92ZXJ0ZXgoZmxvYXQgeCwgZmxvYXQgeSwgdW5zaWduZWQgY21kKQogewogICAgIG1fc3RhdHVzID0gaW5pdGlhbDsKICAgICBpZihpc19tb3ZlX3RvKGNtZCkpIHsKQEAgLTEwMyw3ICsxMDIsNyBAQAogICAgIG1fc3RhdHVzID0gcmVhZHk7CiAgICAgbV9zcmNfdmVydGV4ID0gMDsKIH0KLXVuc2lnbmVkIHZjZ2VuX2Rhc2g6OnZlcnRleChGWF9GTE9BVCogeCwgRlhfRkxPQVQqIHkpCit1bnNpZ25lZCB2Y2dlbl9kYXNoOjp2ZXJ0ZXgoZmxvYXQqIHgsIGZsb2F0KiB5KQogewogICAgIHVuc2lnbmVkIGNtZCA9IHBhdGhfY21kX21vdmVfdG87CiAgICAgd2hpbGUoIWlzX3N0b3AoY21kKSkgewpAQCAtMTI3LDcgKzEyNiw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBwYXRoX2NtZF9tb3ZlX3RvOwogICAgICAgICAgICAgY2FzZSBwb2x5bGluZTogewotICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBkYXNoX3Jlc3QgPSBtX2Rhc2hlc1ttX2N1cnJfZGFzaF0gLSBtX2N1cnJfZGFzaF9zdGFydDsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGFzaF9yZXN0ID0gbV9kYXNoZXNbbV9jdXJyX2Rhc2hdIC0gbV9jdXJyX2Rhc2hfc3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNtZCA9IChtX2N1cnJfZGFzaCAmIDEpID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF9jbWRfbW92ZV90byA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhfY21kX2xpbmVfdG87CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfdmNnZW5fZGFzaC5oIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX3ZjZ2VuX2Rhc2guaAppbmRleCA5YzNhYTYzLi43NzAyZmE3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfdmNnZW5fZGFzaC5oCisrKyBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ192Y2dlbl9kYXNoLmgKQEAgLTM4LDkgKzM4LDkgQEAKICAgICB0eXBlZGVmIHZlcnRleF9zZXF1ZW5jZTx2ZXJ0ZXhfZGlzdCwgNj4gdmVydGV4X3N0b3JhZ2U7CiAgICAgdmNnZW5fZGFzaCgpOwogICAgIHZvaWQgcmVtb3ZlX2FsbF9kYXNoZXMoKTsKLSAgICB2b2lkIGFkZF9kYXNoKEZYX0ZMT0FUIGRhc2hfbGVuLCBGWF9GTE9BVCBnYXBfbGVuKTsKLSAgICB2b2lkIGRhc2hfc3RhcnQoRlhfRkxPQVQgZHMpOwotICAgIHZvaWQgc2hvcnRlbihGWF9GTE9BVCBzKQorICAgIHZvaWQgYWRkX2Rhc2goZmxvYXQgZGFzaF9sZW4sIGZsb2F0IGdhcF9sZW4pOworICAgIHZvaWQgZGFzaF9zdGFydChmbG9hdCBkcyk7CisgICAgdm9pZCBzaG9ydGVuKGZsb2F0IHMpCiAgICAgewogICAgICAgICBtX3Nob3J0ZW4gPSBzOwogICAgIH0KQEAgLTQ5LDIxICs0OSwyMSBAQAogICAgICAgICByZXR1cm4gbV9zaG9ydGVuOwogICAgIH0KICAgICB2b2lkIHJlbW92ZV9hbGwoKTsKLSAgICB2b2lkIGFkZF92ZXJ0ZXgoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgdW5zaWduZWQgY21kKTsKKyAgICB2b2lkIGFkZF92ZXJ0ZXgoZmxvYXQgeCwgZmxvYXQgeSwgdW5zaWduZWQgY21kKTsKICAgICB2b2lkICAgICByZXdpbmQodW5zaWduZWQgcGF0aF9pZCk7Ci0gICAgdW5zaWduZWQgdmVydGV4KEZYX0ZMT0FUKiB4LCBGWF9GTE9BVCogeSk7CisgICAgdW5zaWduZWQgdmVydGV4KGZsb2F0KiB4LCBmbG9hdCogeSk7CiBwcml2YXRlOgogICAgIHZjZ2VuX2Rhc2goY29uc3QgdmNnZW5fZGFzaCYpOwogICAgIGNvbnN0IHZjZ2VuX2Rhc2gmIG9wZXJhdG9yID0gKGNvbnN0IHZjZ2VuX2Rhc2gmKTsKLSAgICB2b2lkIGNhbGNfZGFzaF9zdGFydChGWF9GTE9BVCBkcyk7Ci0gICAgRlhfRkxPQVQgICAgIG1fZGFzaGVzW21heF9kYXNoZXNdOwotICAgIEZYX0ZMT0FUCQltX3RvdGFsX2Rhc2hfbGVuOworICAgIHZvaWQgY2FsY19kYXNoX3N0YXJ0KGZsb2F0IGRzKTsKKyAgICBmbG9hdCAgICAgbV9kYXNoZXNbbWF4X2Rhc2hlc107CisgICAgZmxvYXQJCW1fdG90YWxfZGFzaF9sZW47CiAgICAgdW5zaWduZWQgICAgICAgIG1fbnVtX2Rhc2hlczsKLSAgICBGWF9GTE9BVCAgICAgbV9kYXNoX3N0YXJ0OwotICAgIEZYX0ZMT0FUICAgICBtX3Nob3J0ZW47Ci0gICAgRlhfRkxPQVQgICAgIG1fY3Vycl9kYXNoX3N0YXJ0OworICAgIGZsb2F0ICAgICBtX2Rhc2hfc3RhcnQ7CisgICAgZmxvYXQgICAgIG1fc2hvcnRlbjsKKyAgICBmbG9hdCAgICAgbV9jdXJyX2Rhc2hfc3RhcnQ7CiAgICAgdW5zaWduZWQgICAgICAgIG1fY3Vycl9kYXNoOwotICAgIEZYX0ZMT0FUICAgICBtX2N1cnJfcmVzdDsKKyAgICBmbG9hdCAgICAgbV9jdXJyX3Jlc3Q7CiAgICAgY29uc3QgdmVydGV4X2Rpc3QqIG1fdjE7CiAgICAgY29uc3QgdmVydGV4X2Rpc3QqIG1fdjI7CiAgICAgdmVydGV4X3N0b3JhZ2UgbV9zcmNfdmVydGljZXM7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfdmNnZW5fc3Ryb2tlLmNwcCBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ192Y2dlbl9zdHJva2UuY3BwCmluZGV4IDAzMjI1YjEuLjNlOTdhMzEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ192Y2dlbl9zdHJva2UuY3BwCisrKyBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ192Y2dlbl9zdHJva2UuY3BwCkBAIC0yNCw3ICsyNCw2IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogI2luY2x1ZGUgImFnZ192Y2dlbl9zdHJva2UuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCiAKIG5hbWVzcGFjZSBhZ2cKIHsKQEAgLTUxLDcgKzUwLDcgQEAKICAgICBtX2Nsb3NlZCA9IDA7CiAgICAgbV9zdGF0dXMgPSBpbml0aWFsOwogfQotdm9pZCB2Y2dlbl9zdHJva2U6OmFkZF92ZXJ0ZXgoRlhfRkxPQVQgeCwgRlhfRkxPQVQgeSwgdW5zaWduZWQgY21kKQordm9pZCB2Y2dlbl9zdHJva2U6OmFkZF92ZXJ0ZXgoZmxvYXQgeCwgZmxvYXQgeSwgdW5zaWduZWQgY21kKQogewogICAgIG1fc3RhdHVzID0gaW5pdGlhbDsKICAgICBpZihpc19tb3ZlX3RvKGNtZCkpIHsKQEAgLTY0LDEzICs2MywxMyBAQAogICAgICAgICB9CiAgICAgfQogfQotc3RhdGljIGlubGluZSB2b2lkIGNhbGNfYnV0dF9jYXAoRlhfRkxPQVQqIGNhcCwKK3N0YXRpYyBpbmxpbmUgdm9pZCBjYWxjX2J1dHRfY2FwKGZsb2F0KiBjYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0ZXhfZGlzdCYgdjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZXJ0ZXhfZGlzdCYgdjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB3aWR0aCkgewotICBGWF9GTE9BVCBkeCA9ICh2MS55IC0gdjAueSkgKiB3aWR0aCAvIGxlbjsKLSAgRlhfRkxPQVQgZHkgPSAodjEueCAtIHYwLngpICogd2lkdGggLyBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWR0aCkgeworICBmbG9hdCBkeCA9ICh2MS55IC0gdjAueSkgKiB3aWR0aCAvIGxlbjsKKyAgZmxvYXQgZHkgPSAodjEueCAtIHYwLngpICogd2lkdGggLyBsZW47CiAgIGNhcFswXSA9IHYwLnggLSBkeDsKICAgY2FwWzFdID0gdjAueSArIGR5OwogICBjYXBbMl0gPSB2MC54ICsgZHg7CkBAIC04OCw3ICs4Nyw3IEBACiAgICAgbV9zcmNfdmVydGV4ID0gMDsKICAgICBtX291dF92ZXJ0ZXggPSAwOwogfQotdW5zaWduZWQgdmNnZW5fc3Ryb2tlOjp2ZXJ0ZXgoRlhfRkxPQVQqIHgsIEZYX0ZMT0FUKiB5KQordW5zaWduZWQgdmNnZW5fc3Ryb2tlOjp2ZXJ0ZXgoZmxvYXQqIHgsIGZsb2F0KiB5KQogewogICAgIHVuc2lnbmVkIGNtZCA9IHBhdGhfY21kX2xpbmVfdG87CiAgICAgbGluZV9qb2luX2UgY3VyajsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ192Y2dlbl9zdHJva2UuaCBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ192Y2dlbl9zdHJva2UuaAppbmRleCA4NGZhZGQ2Li4yMzE0MmQzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfdmNnZW5fc3Ryb2tlLmgKKysrIGIvdGhpcmRfcGFydHkvYWdnMjMvYWdnX3ZjZ2VuX3N0cm9rZS5oCkBAIC02MSw1MiArNjEsNTIgQEAKICAgICB7CiAgICAgICAgIHJldHVybiBtX2lubmVyX2pvaW47CiAgICAgfQotICAgIHZvaWQgd2lkdGgoRlhfRkxPQVQgdykKKyAgICB2b2lkIHdpZHRoKGZsb2F0IHcpCiAgICAgewogICAgICAgICBtX3dpZHRoID0gdyAvIDI7CiAgICAgfQotICAgIHZvaWQgbWl0ZXJfbGltaXQoRlhfRkxPQVQgbWwpCisgICAgdm9pZCBtaXRlcl9saW1pdChmbG9hdCBtbCkKICAgICB7CiAgICAgICAgIG1fbWl0ZXJfbGltaXQgPSBtbDsKICAgICB9Ci0gICAgdm9pZCBtaXRlcl9saW1pdF90aGV0YShGWF9GTE9BVCB0KTsKLSAgICB2b2lkIGlubmVyX21pdGVyX2xpbWl0KEZYX0ZMT0FUIG1sKQorICAgIHZvaWQgbWl0ZXJfbGltaXRfdGhldGEoZmxvYXQgdCk7CisgICAgdm9pZCBpbm5lcl9taXRlcl9saW1pdChmbG9hdCBtbCkKICAgICB7CiAgICAgICAgIG1faW5uZXJfbWl0ZXJfbGltaXQgPSBtbDsKICAgICB9Ci0gICAgdm9pZCBhcHByb3hpbWF0aW9uX3NjYWxlKEZYX0ZMT0FUIGFzKQorICAgIHZvaWQgYXBwcm94aW1hdGlvbl9zY2FsZShmbG9hdCBhcykKICAgICB7CiAgICAgICAgIG1fYXBwcm94X3NjYWxlID0gYXM7CiAgICAgfQotICAgIEZYX0ZMT0FUIHdpZHRoKCkgY29uc3QKKyAgICBmbG9hdCB3aWR0aCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV93aWR0aCAqIDI7CiAgICAgfQotICAgIEZYX0ZMT0FUIG1pdGVyX2xpbWl0KCkgY29uc3QKKyAgICBmbG9hdCBtaXRlcl9saW1pdCgpIGNvbnN0CiAgICAgewogICAgICAgICByZXR1cm4gbV9taXRlcl9saW1pdDsKICAgICB9Ci0gICAgRlhfRkxPQVQgaW5uZXJfbWl0ZXJfbGltaXQoKSBjb25zdAorICAgIGZsb2F0IGlubmVyX21pdGVyX2xpbWl0KCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX2lubmVyX21pdGVyX2xpbWl0OwogICAgIH0KLSAgICBGWF9GTE9BVCBhcHByb3hpbWF0aW9uX3NjYWxlKCkgY29uc3QKKyAgICBmbG9hdCBhcHByb3hpbWF0aW9uX3NjYWxlKCkgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtX2FwcHJveF9zY2FsZTsKICAgICB9CiAgICAgdm9pZCByZW1vdmVfYWxsKCk7Ci0gICAgdm9pZCBhZGRfdmVydGV4KEZYX0ZMT0FUIHgsIEZYX0ZMT0FUIHksIHVuc2lnbmVkIGNtZCk7CisgICAgdm9pZCBhZGRfdmVydGV4KGZsb2F0IHgsIGZsb2F0IHksIHVuc2lnbmVkIGNtZCk7CiAgICAgdm9pZCAgICAgcmV3aW5kKHVuc2lnbmVkIHBhdGhfaWQpOwotICAgIHVuc2lnbmVkIHZlcnRleChGWF9GTE9BVCogeCwgRlhfRkxPQVQqIHkpOworICAgIHVuc2lnbmVkIHZlcnRleChmbG9hdCogeCwgZmxvYXQqIHkpOwogcHJpdmF0ZToKICAgICB2Y2dlbl9zdHJva2UoY29uc3QgdmNnZW5fc3Ryb2tlJik7CiAgICAgY29uc3QgdmNnZW5fc3Ryb2tlJiBvcGVyYXRvciA9IChjb25zdCB2Y2dlbl9zdHJva2UmKTsKICAgICB2ZXJ0ZXhfc3RvcmFnZSBtX3NyY192ZXJ0aWNlczsKICAgICBjb29yZF9zdG9yYWdlICBtX291dF92ZXJ0aWNlczsKLSAgICBGWF9GTE9BVCAgICAgICAgIG1fd2lkdGg7Ci0gICAgRlhfRkxPQVQgICAgICAgICBtX21pdGVyX2xpbWl0OwotICAgIEZYX0ZMT0FUICAgICAgICAgbV9pbm5lcl9taXRlcl9saW1pdDsKLSAgICBGWF9GTE9BVCAgICAgICAgIG1fYXBwcm94X3NjYWxlOworICAgIGZsb2F0ICAgICAgICAgbV93aWR0aDsKKyAgICBmbG9hdCAgICAgICAgIG1fbWl0ZXJfbGltaXQ7CisgICAgZmxvYXQgICAgICAgICBtX2lubmVyX21pdGVyX2xpbWl0OworICAgIGZsb2F0ICAgICAgICAgbV9hcHByb3hfc2NhbGU7CiAgICAgbGluZV9jYXBfZSAgICAgbV9saW5lX2NhcDsKICAgICBsaW5lX2pvaW5fZSAgICBtX2xpbmVfam9pbjsKICAgICBpbm5lcl9qb2luX2UgICBtX2lubmVyX2pvaW47CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfdmVydGV4X3NlcXVlbmNlLmggYi90aGlyZF9wYXJ0eS9hZ2cyMy9hZ2dfdmVydGV4X3NlcXVlbmNlLmgKaW5kZXggNjYwMGJmMi4uNDQ4ZTU3YiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYWdnMjMvYWdnX3ZlcnRleF9zZXF1ZW5jZS5oCisrKyBiL3RoaXJkX3BhcnR5L2FnZzIzL2FnZ192ZXJ0ZXhfc2VxdWVuY2UuaApAQCAtNjksMTMgKzY5LDEzIEBACiAgICAgICAgIH0KICAgICB9CiB9Ci1jb25zdCBGWF9GTE9BVCB2ZXJ0ZXhfZGlzdF9lcHNpbG9uID0gMWUtMTRmOworY29uc3QgZmxvYXQgdmVydGV4X2Rpc3RfZXBzaWxvbiA9IDFlLTE0ZjsKIHN0cnVjdCB2ZXJ0ZXhfZGlzdCAgewotICAgIEZYX0ZMT0FUICAgeDsKLSAgICBGWF9GTE9BVCAgIHk7Ci0gICAgRlhfRkxPQVQgICBkaXN0OworICAgIGZsb2F0ICAgeDsKKyAgICBmbG9hdCAgIHk7CisgICAgZmxvYXQgICBkaXN0OwogICAgIHZlcnRleF9kaXN0KCkge30KLSAgICB2ZXJ0ZXhfZGlzdChGWF9GTE9BVCB4XywgRlhfRkxPQVQgeV8pIDoKKyAgICB2ZXJ0ZXhfZGlzdChmbG9hdCB4XywgZmxvYXQgeV8pIDoKICAgICAgICAgeCh4XyksCiAgICAgICAgIHkoeV8pLAogICAgICAgICBkaXN0KDApCkBAIC05MCw3ICs5MCw3IEBACiBzdHJ1Y3QgdmVydGV4X2Rpc3RfY21kIDogcHVibGljIHZlcnRleF9kaXN0IHsKICAgICB1bnNpZ25lZCBjbWQ7CiAgICAgdmVydGV4X2Rpc3RfY21kKCkge30KLSAgICB2ZXJ0ZXhfZGlzdF9jbWQoRlhfRkxPQVQgeF8sIEZYX0ZMT0FUIHlfLCB1bnNpZ25lZCBjbWRfKSA6CisgICAgdmVydGV4X2Rpc3RfY21kKGZsb2F0IHhfLCBmbG9hdCB5XywgdW5zaWduZWQgY21kXykgOgogICAgICAgICB2ZXJ0ZXhfZGlzdCh4XywgeV8pLAogICAgICAgICBjbWQoY21kXykKICAgICB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9iYXNlL2FsbG9jYXRvci9wYXJ0aXRpb25fYWxsb2NhdG9yL2FkZHJlc3Nfc3BhY2VfcmFuZG9taXphdGlvbi5jYyBiL3RoaXJkX3BhcnR5L2Jhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvYWRkcmVzc19zcGFjZV9yYW5kb21pemF0aW9uLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZjIyYmUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9iYXNlL2FsbG9jYXRvci9wYXJ0aXRpb25fYWxsb2NhdG9yL2FkZHJlc3Nfc3BhY2VfcmFuZG9taXphdGlvbi5jYwpAQCAtMCwwICsxLDE0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jYXRvci9hZGRyZXNzX3NwYWNlX3JhbmRvbWl6YXRpb24uaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvcGFnZV9hbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2FsbG9jYXRvci9wYXJ0aXRpb25fYWxsb2NhdG9yL3NwaW5fbG9jay5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2J1aWxkL2J1aWxkX2NvbmZpZy5oIgorCisjaWYgZGVmaW5lZChPU19XSU4pCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKy8vIFZlcnNpb25IZWxwZXJzLmggbXVzdCBiZSBpbmNsdWRlZCBhZnRlciB3aW5kb3dzLmguCisjaWYgZGVmaW5lZChPU19XSU4pCisjaW5jbHVkZSA8VmVyc2lvbkhlbHBlcnMuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgcGRmaXVtIHsKK25hbWVzcGFjZSBiYXNlIHsKKworbmFtZXNwYWNlIHsKKworLy8gVGhpcyBpcyB0aGUgc2FtZSBQUk5HIGFzIHVzZWQgYnkgdGNtYWxsb2MgZm9yIG1hcHBpbmcgYWRkcmVzcyByYW5kb21uZXNzOworLy8gc2VlIGh0dHA6Ly9idXJ0bGVidXJ0bGUubmV0L2JvYi9yYW5kL3NtYWxscHJuZy5odG1sCitzdHJ1Y3QgcmFuY3R4IHsKKyAgc3VidGxlOjpTcGluTG9jayBsb2NrOworICBib29sIGluaXRpYWxpemVkOworICB1aW50MzJfdCBhOworICB1aW50MzJfdCBiOworICB1aW50MzJfdCBjOworICB1aW50MzJfdCBkOworfTsKKworI2RlZmluZSByb3QoeCwgaykgKCgoeCkgPDwgKGspKSB8ICgoeCkgPj4gKDMyIC0gKGspKSkpCisKK3VpbnQzMl90IHJhbnZhbEludGVybmFsKHJhbmN0eCogeCkgeworICB1aW50MzJfdCBlID0geC0+YSAtIHJvdCh4LT5iLCAyNyk7CisgIHgtPmEgPSB4LT5iIF4gcm90KHgtPmMsIDE3KTsKKyAgeC0+YiA9IHgtPmMgKyB4LT5kOworICB4LT5jID0geC0+ZCArIGU7CisgIHgtPmQgPSBlICsgeC0+YTsKKyAgcmV0dXJuIHgtPmQ7Cit9CisKKyN1bmRlZiByb3QKKwordWludDMyX3QgcmFudmFsKHJhbmN0eCogeCkgeworICBzdWJ0bGU6OlNwaW5Mb2NrOjpHdWFyZCBndWFyZCh4LT5sb2NrKTsKKyAgaWYgKFVOTElLRUxZKCF4LT5pbml0aWFsaXplZCkpIHsKKyAgICB4LT5pbml0aWFsaXplZCA9IHRydWU7CisgICAgY2hhciBjOworICAgIHVpbnQzMl90IHNlZWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KCZjKSk7CisgICAgdWludDMyX3QgcGlkOworICAgIHVpbnQzMl90IHVzZWM7CisjaWYgZGVmaW5lZChPU19XSU4pCisgICAgcGlkID0gR2V0Q3VycmVudFByb2Nlc3NJZCgpOworICAgIFNZU1RFTVRJTUUgc3Q7CisgICAgR2V0U3lzdGVtVGltZSgmc3QpOworICAgIHVzZWMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3Qud01pbGxpc2Vjb25kcyAqIDEwMDApOworI2Vsc2UKKyAgICBwaWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZ2V0cGlkKCkpOworICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgIGdldHRpbWVvZmRheSgmdHYsIDApOworICAgIHVzZWMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odHYudHZfdXNlYyk7CisjZW5kaWYKKyAgICBzZWVkIF49IHBpZDsKKyAgICBzZWVkIF49IHVzZWM7CisgICAgeC0+YSA9IDB4ZjFlYTVlZWQ7CisgICAgeC0+YiA9IHgtPmMgPSB4LT5kID0gc2VlZDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyArK2kpIHsKKyAgICAgICh2b2lkKXJhbnZhbEludGVybmFsKHgpOworICAgIH0KKyAgfQorICB1aW50MzJfdCByZXQgPSByYW52YWxJbnRlcm5hbCh4KTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCByYW5jdHggc19yYW5jdHg7CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBDYWxjdWxhdGVzIGEgcmFuZG9tIHByZWZlcnJlZCBtYXBwaW5nIGFkZHJlc3MuIEluIGNhbGN1bGF0aW5nIGFuIGFkZHJlc3MsIHdlCisvLyBiYWxhbmNlIGdvb2QgQVNMUiBhZ2FpbnN0IG5vdCBmcmFnbWVudGluZyB0aGUgYWRkcmVzcyBzcGFjZSB0b28gYmFkbHkuCit2b2lkKiBHZXRSYW5kb21QYWdlQmFzZSgpIHsKKyAgdWludHB0cl90IHJhbmRvbTsKKyAgcmFuZG9tID0gc3RhdGljX2Nhc3Q8dWludHB0cl90PihyYW52YWwoJnNfcmFuY3R4KSk7CisjaWYgZGVmaW5lZChBUkNIX0NQVV9YODZfNjQpCisgIHJhbmRvbSA8PD0gMzJVTDsKKyAgcmFuZG9tIHw9IHN0YXRpY19jYXN0PHVpbnRwdHJfdD4ocmFudmFsKCZzX3JhbmN0eCkpOworLy8gVGhpcyBhZGRyZXNzIG1hc2sgZ2l2ZXMgYSBsb3cgbGlrZWxpaG9vZCBvZiBhZGRyZXNzIHNwYWNlIGNvbGxpc2lvbnMuIFdlCisvLyBoYW5kbGUgdGhlIHNpdHVhdGlvbiBncmFjZWZ1bGx5IGlmIHRoZXJlIGlzIGEgY29sbGlzaW9uLgorI2lmIGRlZmluZWQoT1NfV0lOKQorICByYW5kb20gJj0gMHgzZmZmZmZmZmZmZlVMOworICAvLyBXaW5kb3dzID49IDguMSBoYXMgdGhlIGZ1bGwgNDcgYml0cy4gVXNlIHRoZW0gd2hlcmUgYXZhaWxhYmxlLgorICBzdGF0aWMgYm9vbCB3aW5kb3dzXzgxID0gZmFsc2U7CisgIHN0YXRpYyBib29sIHdpbmRvd3NfODFfaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgaWYgKCF3aW5kb3dzXzgxX2luaXRpYWxpemVkKSB7CisgICAgd2luZG93c184MSA9IElzV2luZG93czhQb2ludDFPckdyZWF0ZXIoKTsKKyAgICB3aW5kb3dzXzgxX2luaXRpYWxpemVkID0gdHJ1ZTsKKyAgfQorICBpZiAoIXdpbmRvd3NfODEpIHsKKyAgICByYW5kb20gKz0gMHgxMDAwMDAwMDAwMFVMOworICB9CisjZWxpZiBkZWZpbmVkKE1FTU9SWV9UT09MX1JFUExBQ0VTX0FMTE9DQVRPUikKKyAgLy8gVGhpcyByYW5nZSBpcyBjb3BpZWQgZnJvbSB0aGUgVFNhbiBzb3VyY2UsIGJ1dCB3b3JrcyBmb3IgYWxsIHRvb2xzLgorICByYW5kb20gJj0gMHgwMDdmZmZmZmZmZmZVTDsKKyAgcmFuZG9tICs9IDB4N2U4MDAwMDAwMDAwVUw7CisjZWxzZQorICAvLyBMaW51eCBhbmQgT1MgWCBzdXBwb3J0IHRoZSBmdWxsIDQ3LWJpdCB1c2VyIHNwYWNlIG9mIHg2NCBwcm9jZXNzb3JzLgorICByYW5kb20gJj0gMHgzZmZmZmZmZmZmZmZVTDsKKyNlbmRpZgorI2VsaWYgZGVmaW5lZChBUkNIX0NQVV9BUk02NCkKKyAgLy8gQVJNNjQgb24gTGludXggaGFzIDM5LWJpdCB1c2VyIHNwYWNlLgorICByYW5kb20gJj0gMHgzZmZmZmZmZmZmVUw7CisgIHJhbmRvbSArPSAweDEwMDAwMDAwMDBVTDsKKyNlbHNlICAvLyAhZGVmaW5lZChBUkNIX0NQVV9YODZfNjQpICYmICFkZWZpbmVkKEFSQ0hfQ1BVX0FSTTY0KQorI2lmIGRlZmluZWQoT1NfV0lOKQorICAvLyBPbiB3aW4zMiBob3N0IHN5c3RlbXMgdGhlIHJhbmRvbWl6YXRpb24gcGx1cyBodWdlIGFsaWdubWVudCBjYXVzZXMKKyAgLy8gZXhjZXNzaXZlIGZyYWdtZW50YXRpb24uIFBsdXMgbW9zdCBvZiB0aGVzZSBzeXN0ZW1zIGxhY2sgQVNMUiwgc28gdGhlCisgIC8vIHJhbmRvbWl6YXRpb24gaXNuJ3QgYnV5aW5nIGFueXRoaW5nLiBJbiB0aGF0IGNhc2Ugd2UganVzdCBza2lwIGl0LgorICAvLyBUT0RPKGpzY2h1aCk6IEp1c3QgZHVtcCB0aGUgcmFuZG9taXphdGlvbiB3aGVuIEhFLUFTTFIgaXMgcHJlc2VudC4KKyAgc3RhdGljIEJPT0wgaXNXb3c2NCA9IC0xOworICBpZiAoaXNXb3c2NCA9PSAtMSAmJiAhSXNXb3c2NFByb2Nlc3MoR2V0Q3VycmVudFByb2Nlc3MoKSwgJmlzV293NjQpKQorICAgIGlzV293NjQgPSBGQUxTRTsKKyAgaWYgKCFpc1dvdzY0KQorICAgIHJldHVybiBudWxscHRyOworI2VuZGlmICAvLyBkZWZpbmVkKE9TX1dJTikKKyAgLy8gVGhpcyBpcyBhIGdvb2QgcmFuZ2Ugb24gV2luZG93cywgTGludXggYW5kIE1hYy4KKyAgLy8gQWxsb2NhdGVzIGluIHRoZSAwLjUtMS41R0IgcmVnaW9uLgorICByYW5kb20gJj0gMHgzZmZmZmZmZjsKKyAgcmFuZG9tICs9IDB4MjAwMDAwMDA7CisjZW5kaWYgIC8vIGRlZmluZWQoQVJDSF9DUFVfWDg2XzY0KQorICByYW5kb20gJj0ga1BhZ2VBbGxvY2F0aW9uR3JhbnVsYXJpdHlCYXNlTWFzazsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHJhbmRvbSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgcGRmaXVtCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9iYXNlL2FsbG9jYXRvci9wYXJ0aXRpb25fYWxsb2NhdG9yL2FkZHJlc3Nfc3BhY2VfcmFuZG9taXphdGlvbi5oIGIvdGhpcmRfcGFydHkvYmFzZS9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jYXRvci9hZGRyZXNzX3NwYWNlX3JhbmRvbWl6YXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2M1ZjYwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYmFzZS9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jYXRvci9hZGRyZXNzX3NwYWNlX3JhbmRvbWl6YXRpb24uaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgQkFTRV9BTExPQ0FUT1JfUEFSVElUSU9OX0FMTE9DQVRPUl9BRERSRVNTX1NQQUNFX1JBTkRPTUlaQVRJT04KKyNkZWZpbmUgQkFTRV9BTExPQ0FUT1JfUEFSVElUSU9OX0FMTE9DQVRPUl9BRERSRVNTX1NQQUNFX1JBTkRPTUlaQVRJT04KKworbmFtZXNwYWNlIHBkZml1bSB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIENhbGN1bGF0ZXMgYSByYW5kb20gcHJlZmVycmVkIG1hcHBpbmcgYWRkcmVzcy4gSW4gY2FsY3VsYXRpbmcgYW4gYWRkcmVzcywgd2UKKy8vIGJhbGFuY2UgZ29vZCBBU0xSIGFnYWluc3Qgbm90IGZyYWdtZW50aW5nIHRoZSBhZGRyZXNzIHNwYWNlIHRvbyBiYWRseS4KK3ZvaWQqIEdldFJhbmRvbVBhZ2VCYXNlKCk7CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgcGRmaXVtCisKKyNlbmRpZiAgLy8gQkFTRV9BTExPQ0FUT1JfUEFSVElUSU9OX0FMTE9DQVRPUl9BRERSRVNTX1NQQUNFX1JBTkRPTUlaQVRJT04KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3Ivb29tLmggYi90aGlyZF9wYXJ0eS9iYXNlL2FsbG9jYXRvci9wYXJ0aXRpb25fYWxsb2NhdG9yL29vbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZjI5YjUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9iYXNlL2FsbG9jYXRvci9wYXJ0aXRpb25fYWxsb2NhdG9yL29vbS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxNiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgQkFTRV9BTExPQ0FUT1JfT09NX0gKKyNkZWZpbmUgQkFTRV9BTExPQ0FUT1JfT09NX0gKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgorCisjaWYgZGVmaW5lZChPU19XSU4pCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2VuZGlmCisKKy8vIERvIG5vdCB3YW50IHRyaXZpYWwgZW50cnkgcG9pbnRzIGp1c3QgY2FsbGluZyBPT01fQ1JBU0goKSB0byBiZQorLy8gY29tbW9uZWQgdXAgYnkgbGlua2VyIGljZi9jb21kYXQgZm9sZGluZy4KKyNkZWZpbmUgT09NX0NSQVNIX1BSRVZFTlRfSUNGKCkgICAgICAgICAgICAgICAgICBcCisgIHZvbGF0aWxlIGludCBvb21fY3Jhc2hfaW5oaWJpdF9pY2YgPSBfX0xJTkVfXzsgXAorICBBTExPV19VTlVTRURfTE9DQUwob29tX2NyYXNoX2luaGliaXRfaWNmKQorCisvLyBPT01fQ1JBU0goKSAtIFNwZWNpYWxpemF0aW9uIG9mIElNTUVESUFURV9DUkFTSCB3aGljaCB3aWxsIHJhaXNlIGEgY3VzdG9tCisvLyBleGNlcHRpb24gb24gV2luZG93cyB0byBzaWduYWwgdGhpcyBpcyBPT00gYW5kIG5vdCBhIG5vcm1hbCBhc3NlcnQuCisjaWYgZGVmaW5lZChPU19XSU4pCisjZGVmaW5lIE9PTV9DUkFTSCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT09NX0NSQVNIX1BSRVZFTlRfSUNGKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOjpSYWlzZUV4Y2VwdGlvbigweEUwMDAwMDA4LCBFWENFUFRJT05fTk9OQ09OVElOVUFCTEUsIDAsIG51bGxwdHIpOyBcCisgICAgSU1NRURJQVRFX0NSQVNIKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBPT01fQ1JBU0goKSAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPT01fQ1JBU0hfUFJFVkVOVF9JQ0YoKTsgXAorICAgIElNTUVESUFURV9DUkFTSCgpOyAgICAgICBcCisgIH0gd2hpbGUgKDApCisjZW5kaWYKKworI2VuZGlmICAvLyBCQVNFX0FMTE9DQVRPUl9PT01fSApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmFzZS9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jYXRvci9wYWdlX2FsbG9jYXRvci5jYyBiL3RoaXJkX3BhcnR5L2Jhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvcGFnZV9hbGxvY2F0b3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlMTU5YgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvcGFnZV9hbGxvY2F0b3IuY2MKQEAgLTAsMCArMSwyODEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2FsbG9jYXRvci9wYXJ0aXRpb25fYWxsb2NhdG9yL3BhZ2VfYWxsb2NhdG9yLmgiCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKworI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvYWRkcmVzc19zcGFjZV9yYW5kb21pemF0aW9uLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9iYXNlX2V4cG9ydC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2J1aWxkL2J1aWxkX2NvbmZpZy5oIgorCisjaWYgZGVmaW5lZChPU19QT1NJWCkKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2lmbmRlZiBNQURWX0ZSRUUKKyNkZWZpbmUgTUFEVl9GUkVFIE1BRFZfRE9OVE5FRUQKKyNlbmRpZgorCisjaWZuZGVmIE1BUF9BTk9OWU1PVVMKKyNkZWZpbmUgTUFQX0FOT05ZTU9VUyBNQVBfQU5PTgorI2VuZGlmCisKKy8vIE9uIFBPU0lYIHxtbWFwfCB1c2VzIGEgbmVhcmJ5IGFkZHJlc3MgaWYgdGhlIGhpbnQgYWRkcmVzcyBpcyBibG9ja2VkLgorc3RhdGljIGNvbnN0IGJvb2wga0hpbnRJc0Fkdmlzb3J5ID0gdHJ1ZTsKK3N0YXRpYyBzdGQ6OmF0b21pYzxpbnQzMl90PiBzX2FsbG9jUGFnZUVycm9yQ29kZXswfTsKKworI2VsaWYgZGVmaW5lZChPU19XSU4pCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKy8vIHxWaXJ0dWFsQWxsb2N8IHdpbGwgZmFpbCBpZiBhbGxvY2F0aW9uIGF0IHRoZSBoaW50IGFkZHJlc3MgaXMgYmxvY2tlZC4KK3N0YXRpYyBjb25zdCBib29sIGtIaW50SXNBZHZpc29yeSA9IGZhbHNlOworc3RhdGljIHN0ZDo6YXRvbWljPGludDMyX3Q+IHNfYWxsb2NQYWdlRXJyb3JDb2Rle0VSUk9SX1NVQ0NFU1N9OworCisjZWxzZQorI2Vycm9yIFVua25vd24gT1MKKyNlbmRpZiAgLy8gZGVmaW5lZChPU19QT1NJWCkKKworbmFtZXNwYWNlIHBkZml1bSB7CituYW1lc3BhY2UgYmFzZSB7CisKKy8vIFRoaXMgaW50ZXJuYWwgZnVuY3Rpb24gd3JhcHMgdGhlIE9TLXNwZWNpZmljIHBhZ2UgYWxsb2NhdGlvbiBjYWxsOgorLy8gfFZpcnR1YWxBbGxvY3wgb24gV2luZG93cywgYW5kIHxtbWFwfCBvbiBQT1NJWC4KK3N0YXRpYyB2b2lkKiBTeXN0ZW1BbGxvY1BhZ2VzKAorICAgIHZvaWQqIGhpbnQsCisgICAgc2l6ZV90IGxlbmd0aCwKKyAgICBQYWdlQWNjZXNzaWJpbGl0eUNvbmZpZ3VyYXRpb24gcGFnZV9hY2Nlc3NpYmlsaXR5KSB7CisgIERDSEVDSyghKGxlbmd0aCAmIGtQYWdlQWxsb2NhdGlvbkdyYW51bGFyaXR5T2Zmc2V0TWFzaykpOworICBEQ0hFQ0soIShyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oaGludCkgJgorICAgICAgICAgICBrUGFnZUFsbG9jYXRpb25HcmFudWxhcml0eU9mZnNldE1hc2spKTsKKyAgdm9pZCogcmV0OworI2lmIGRlZmluZWQoT1NfV0lOKQorICBEV09SRCBhY2Nlc3NfZmxhZyA9CisgICAgICBwYWdlX2FjY2Vzc2liaWxpdHkgPT0gUGFnZUFjY2Vzc2libGUgPyBQQUdFX1JFQURXUklURSA6IFBBR0VfTk9BQ0NFU1M7CisgIHJldCA9IFZpcnR1YWxBbGxvYyhoaW50LCBsZW5ndGgsIE1FTV9SRVNFUlZFIHwgTUVNX0NPTU1JVCwgYWNjZXNzX2ZsYWcpOworICBpZiAoIXJldCkKKyAgICBzX2FsbG9jUGFnZUVycm9yQ29kZSA9IEdldExhc3RFcnJvcigpOworI2Vsc2UKKyAgaW50IGFjY2Vzc19mbGFnID0gcGFnZV9hY2Nlc3NpYmlsaXR5ID09IFBhZ2VBY2Nlc3NpYmxlCisgICAgICAgICAgICAgICAgICAgICAgICA/IChQUk9UX1JFQUQgfCBQUk9UX1dSSVRFKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBQUk9UX05PTkU7CisgIHJldCA9IG1tYXAoaGludCwgbGVuZ3RoLCBhY2Nlc3NfZmxhZywgTUFQX0FOT05ZTU9VUyB8IE1BUF9QUklWQVRFLCAtMSwgMCk7CisgIGlmIChyZXQgPT0gTUFQX0ZBSUxFRCkgeworICAgIHNfYWxsb2NQYWdlRXJyb3JDb2RlID0gZXJybm87CisgICAgcmV0ID0gMDsKKyAgfQorI2VuZGlmCisgIHJldHVybiByZXQ7Cit9CisKKy8vIFRyaW1zIGJhc2UgdG8gZ2l2ZW4gbGVuZ3RoIGFuZCBhbGlnbm1lbnQuIFdpbmRvd3MgcmV0dXJucyBudWxsIG9uIGZhaWx1cmUgYW5kCisvLyBmcmVlcyBiYXNlLgorc3RhdGljIHZvaWQqIFRyaW1NYXBwaW5nKHZvaWQqIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJhc2VfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0cmltX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgUGFnZUFjY2Vzc2liaWxpdHlDb25maWd1cmF0aW9uIHBhZ2VfYWNjZXNzaWJpbGl0eSkgeworICBzaXplX3QgcHJlX3NsYWNrID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGJhc2UpICYgKGFsaWduIC0gMSk7CisgIGlmIChwcmVfc2xhY2spCisgICAgcHJlX3NsYWNrID0gYWxpZ24gLSBwcmVfc2xhY2s7CisgIHNpemVfdCBwb3N0X3NsYWNrID0gYmFzZV9sZW5ndGggLSBwcmVfc2xhY2sgLSB0cmltX2xlbmd0aDsKKyAgRENIRUNLKGJhc2VfbGVuZ3RoID49IHRyaW1fbGVuZ3RoIHx8IHByZV9zbGFjayB8fCBwb3N0X3NsYWNrKTsKKyAgRENIRUNLKHByZV9zbGFjayA8IGJhc2VfbGVuZ3RoKTsKKyAgRENIRUNLKHBvc3Rfc2xhY2sgPCBiYXNlX2xlbmd0aCk7CisgIHZvaWQqIHJldCA9IGJhc2U7CisKKyNpZiBkZWZpbmVkKE9TX1BPU0lYKSAgLy8gT24gUE9TSVggd2UgY2FuIHJlc2l6ZSB0aGUgYWxsb2NhdGlvbiBydW4uCisgICh2b2lkKXBhZ2VfYWNjZXNzaWJpbGl0eTsKKyAgaWYgKHByZV9zbGFjaykgeworICAgIGludCByZXMgPSBtdW5tYXAoYmFzZSwgcHJlX3NsYWNrKTsKKyAgICBDSEVDSyghcmVzKTsKKyAgICByZXQgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihiYXNlKSArIHByZV9zbGFjazsKKyAgfQorICBpZiAocG9zdF9zbGFjaykgeworICAgIGludCByZXMgPSBtdW5tYXAocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ocmV0KSArIHRyaW1fbGVuZ3RoLCBwb3N0X3NsYWNrKTsKKyAgICBDSEVDSyghcmVzKTsKKyAgfQorI2Vsc2UgIC8vIE9uIFdpbmRvd3Mgd2UgY2FuJ3QgcmVzaXplIHRoZSBhbGxvY2F0aW9uIHJ1bi4KKyAgaWYgKHByZV9zbGFjayB8fCBwb3N0X3NsYWNrKSB7CisgICAgcmV0ID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYmFzZSkgKyBwcmVfc2xhY2s7CisgICAgRnJlZVBhZ2VzKGJhc2UsIGJhc2VfbGVuZ3RoKTsKKyAgICByZXQgPSBTeXN0ZW1BbGxvY1BhZ2VzKHJldCwgdHJpbV9sZW5ndGgsIHBhZ2VfYWNjZXNzaWJpbGl0eSk7CisgIH0KKyNlbmRpZgorCisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQqIEFsbG9jUGFnZXModm9pZCogYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgc2l6ZV90IGFsaWduLAorICAgICAgICAgICAgICAgICBQYWdlQWNjZXNzaWJpbGl0eUNvbmZpZ3VyYXRpb24gcGFnZV9hY2Nlc3NpYmlsaXR5KSB7CisgIERDSEVDSyhsZW5ndGggPj0ga1BhZ2VBbGxvY2F0aW9uR3JhbnVsYXJpdHkpOworICBEQ0hFQ0soIShsZW5ndGggJiBrUGFnZUFsbG9jYXRpb25HcmFudWxhcml0eU9mZnNldE1hc2spKTsKKyAgRENIRUNLKGFsaWduID49IGtQYWdlQWxsb2NhdGlvbkdyYW51bGFyaXR5KTsKKyAgRENIRUNLKCEoYWxpZ24gJiBrUGFnZUFsbG9jYXRpb25HcmFudWxhcml0eU9mZnNldE1hc2spKTsKKyAgRENIRUNLKCEocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGFkZHJlc3MpICYKKyAgICAgICAgICAga1BhZ2VBbGxvY2F0aW9uR3JhbnVsYXJpdHlPZmZzZXRNYXNrKSk7CisgIHVpbnRwdHJfdCBhbGlnbl9vZmZzZXRfbWFzayA9IGFsaWduIC0gMTsKKyAgdWludHB0cl90IGFsaWduX2Jhc2VfbWFzayA9IH5hbGlnbl9vZmZzZXRfbWFzazsKKyAgRENIRUNLKCEocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGFkZHJlc3MpICYgYWxpZ25fb2Zmc2V0X21hc2spKTsKKworICAvLyBJZiB0aGUgY2xpZW50IHBhc3NlZCBudWxsIGFzIHRoZSBhZGRyZXNzLCBjaG9vc2UgYSBnb29kIG9uZS4KKyAgaWYgKCFhZGRyZXNzKSB7CisgICAgYWRkcmVzcyA9IEdldFJhbmRvbVBhZ2VCYXNlKCk7CisgICAgYWRkcmVzcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihhZGRyZXNzKSAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduX2Jhc2VfbWFzayk7CisgIH0KKworICAvLyBGaXJzdCB0cnkgdG8gZm9yY2UgYW4gZXhhY3Qtc2l6ZSwgYWxpZ25lZCBhbGxvY2F0aW9uIGZyb20gb3VyIHJhbmRvbSBiYXNlLgorICBmb3IgKGludCBjb3VudCA9IDA7IGNvdW50IDwgMzsgKytjb3VudCkgeworICAgIHZvaWQqIHJldCA9IFN5c3RlbUFsbG9jUGFnZXMoYWRkcmVzcywgbGVuZ3RoLCBwYWdlX2FjY2Vzc2liaWxpdHkpOworICAgIGlmIChrSGludElzQWR2aXNvcnkgfHwgcmV0KSB7CisgICAgICAvLyBJZiB0aGUgYWxpZ25tZW50IGlzIHRvIG91ciBsaWtpbmcsIHdlJ3JlIGRvbmUuCisgICAgICBpZiAoIShyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ocmV0KSAmIGFsaWduX29mZnNldF9tYXNrKSkKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgIEZyZWVQYWdlcyhyZXQsIGxlbmd0aCk7CisjaWYgZGVmaW5lZChBUkNIX0NQVV8zMl9CSVRTKQorICAgICAgYWRkcmVzcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KAorICAgICAgICAgIChyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ocmV0KSArIGFsaWduKSAmIGFsaWduX2Jhc2VfbWFzayk7CisjZW5kaWYKKyAgICB9IGVsc2UgaWYgKCFhZGRyZXNzKSB7ICAvLyBXZSBrbm93IHdlJ3JlIE9PTSB3aGVuIGFuIHVuaGludGVkIGFsbG9jYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWlscy4KKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0gZWxzZSB7CisjaWYgZGVmaW5lZChBUkNIX0NQVV8zMl9CSVRTKQorICAgICAgYWRkcmVzcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFkZHJlc3MpICsgYWxpZ247CisjZW5kaWYKKyAgICB9CisKKyNpZiAhZGVmaW5lZChBUkNIX0NQVV8zMl9CSVRTKQorICAgIC8vIEtlZXAgdHJ5aW5nIHJhbmRvbSBhZGRyZXNzZXMgb24gc3lzdGVtcyB0aGF0IGhhdmUgYSBsYXJnZSBhZGRyZXNzIHNwYWNlLgorICAgIGFkZHJlc3MgPSBHZXRSYW5kb21QYWdlQmFzZSgpOworICAgIGFkZHJlc3MgPSByZWludGVycHJldF9jYXN0PHZvaWQqPihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oYWRkcmVzcykgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbl9iYXNlX21hc2spOworI2VuZGlmCisgIH0KKworICAvLyBNYXAgYSBsYXJnZXIgYWxsb2NhdGlvbiBzbyB3ZSBjYW4gZm9yY2UgYWxpZ25tZW50LCBidXQgY29udGludWUgcmFuZG9taXppbmcKKyAgLy8gb25seSBvbiA2NC1iaXQgUE9TSVguCisgIHNpemVfdCB0cnlfbGVuZ3RoID0gbGVuZ3RoICsgKGFsaWduIC0ga1BhZ2VBbGxvY2F0aW9uR3JhbnVsYXJpdHkpOworICBDSEVDSyh0cnlfbGVuZ3RoID49IGxlbmd0aCk7CisgIHZvaWQqIHJldDsKKworICBkbyB7CisgICAgLy8gRG9uJ3QgY29udGludWUgdG8gYnVybiBjeWNsZXMgb24gbWFuZGF0b3J5IGhpbnRzIChXaW5kb3dzKS4KKyAgICBhZGRyZXNzID0ga0hpbnRJc0Fkdmlzb3J5ID8gR2V0UmFuZG9tUGFnZUJhc2UoKSA6IG51bGxwdHI7CisgICAgcmV0ID0gU3lzdGVtQWxsb2NQYWdlcyhhZGRyZXNzLCB0cnlfbGVuZ3RoLCBwYWdlX2FjY2Vzc2liaWxpdHkpOworICAgIC8vIFRoZSByZXRyaWVzIGFyZSBmb3IgV2luZG93cywgd2hlcmUgYSByYWNlIGNhbiBzdGVhbCBvdXIgbWFwcGluZyBvbgorICAgIC8vIHJlc2l6ZS4KKyAgfSB3aGlsZSAocmV0ICYmCisgICAgICAgICAgIChyZXQgPSBUcmltTWFwcGluZyhyZXQsIHRyeV9sZW5ndGgsIGxlbmd0aCwgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlX2FjY2Vzc2liaWxpdHkpKSA9PSBudWxscHRyKTsKKworICByZXR1cm4gcmV0OworfQorCit2b2lkIEZyZWVQYWdlcyh2b2lkKiBhZGRyZXNzLCBzaXplX3QgbGVuZ3RoKSB7CisgIERDSEVDSyghKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihhZGRyZXNzKSAmCisgICAgICAgICAgIGtQYWdlQWxsb2NhdGlvbkdyYW51bGFyaXR5T2Zmc2V0TWFzaykpOworICBEQ0hFQ0soIShsZW5ndGggJiBrUGFnZUFsbG9jYXRpb25HcmFudWxhcml0eU9mZnNldE1hc2spKTsKKyNpZiBkZWZpbmVkKE9TX1BPU0lYKQorICBpbnQgcmV0ID0gbXVubWFwKGFkZHJlc3MsIGxlbmd0aCk7CisgIENIRUNLKCFyZXQpOworI2Vsc2UKKyAgQk9PTCByZXQgPSBWaXJ0dWFsRnJlZShhZGRyZXNzLCAwLCBNRU1fUkVMRUFTRSk7CisgIENIRUNLKHJldCk7CisjZW5kaWYKK30KKwordm9pZCBTZXRTeXN0ZW1QYWdlc0luYWNjZXNzaWJsZSh2b2lkKiBhZGRyZXNzLCBzaXplX3QgbGVuZ3RoKSB7CisgIERDSEVDSyghKGxlbmd0aCAmIGtTeXN0ZW1QYWdlT2Zmc2V0TWFzaykpOworI2lmIGRlZmluZWQoT1NfUE9TSVgpCisgIGludCByZXQgPSBtcHJvdGVjdChhZGRyZXNzLCBsZW5ndGgsIFBST1RfTk9ORSk7CisgIENIRUNLKCFyZXQpOworI2Vsc2UKKyAgQk9PTCByZXQgPSBWaXJ0dWFsRnJlZShhZGRyZXNzLCBsZW5ndGgsIE1FTV9ERUNPTU1JVCk7CisgIENIRUNLKHJldCk7CisjZW5kaWYKK30KKworYm9vbCBTZXRTeXN0ZW1QYWdlc0FjY2Vzc2libGUodm9pZCogYWRkcmVzcywgc2l6ZV90IGxlbmd0aCkgeworICBEQ0hFQ0soIShsZW5ndGggJiBrU3lzdGVtUGFnZU9mZnNldE1hc2spKTsKKyNpZiBkZWZpbmVkKE9TX1BPU0lYKQorICByZXR1cm4gIW1wcm90ZWN0KGFkZHJlc3MsIGxlbmd0aCwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSk7CisjZWxzZQorICByZXR1cm4gISFWaXJ0dWFsQWxsb2MoYWRkcmVzcywgbGVuZ3RoLCBNRU1fQ09NTUlULCBQQUdFX1JFQURXUklURSk7CisjZW5kaWYKK30KKwordm9pZCBEZWNvbW1pdFN5c3RlbVBhZ2VzKHZvaWQqIGFkZHJlc3MsIHNpemVfdCBsZW5ndGgpIHsKKyAgRENIRUNLKCEobGVuZ3RoICYga1N5c3RlbVBhZ2VPZmZzZXRNYXNrKSk7CisjaWYgZGVmaW5lZChPU19QT1NJWCkKKyAgaW50IHJldCA9IG1hZHZpc2UoYWRkcmVzcywgbGVuZ3RoLCBNQURWX0ZSRUUpOworICBpZiAocmV0ICE9IDAgJiYgZXJybm8gPT0gRUlOVkFMKSB7CisgICAgLy8gTUFEVl9GUkVFIG9ubHkgd29ya3Mgb24gTGludXggNC41KyAuIElmIHJlcXVlc3QgZmFpbGVkLAorICAgIC8vIHJldHJ5IHdpdGggb2xkZXIgTUFEVl9ET05UTkVFRCAuIE5vdGUgdGhhdCBNQURWX0ZSRUUKKyAgICAvLyBiZWluZyBkZWZpbmVkIGF0IGNvbXBpbGUgdGltZSBkb2Vzbid0IGltcGx5IHJ1bnRpbWUgc3VwcG9ydC4KKyAgICByZXQgPSBtYWR2aXNlKGFkZHJlc3MsIGxlbmd0aCwgTUFEVl9ET05UTkVFRCk7CisgIH0KKyAgQ0hFQ0soIXJldCk7CisjZWxzZQorICBTZXRTeXN0ZW1QYWdlc0luYWNjZXNzaWJsZShhZGRyZXNzLCBsZW5ndGgpOworI2VuZGlmCit9CisKK3ZvaWQgUmVjb21taXRTeXN0ZW1QYWdlcyh2b2lkKiBhZGRyZXNzLCBzaXplX3QgbGVuZ3RoKSB7CisgIERDSEVDSyghKGxlbmd0aCAmIGtTeXN0ZW1QYWdlT2Zmc2V0TWFzaykpOworI2lmIGRlZmluZWQoT1NfUE9TSVgpCisgICh2b2lkKWFkZHJlc3M7CisjZWxzZQorICBDSEVDSyhTZXRTeXN0ZW1QYWdlc0FjY2Vzc2libGUoYWRkcmVzcywgbGVuZ3RoKSk7CisjZW5kaWYKK30KKwordm9pZCBEaXNjYXJkU3lzdGVtUGFnZXModm9pZCogYWRkcmVzcywgc2l6ZV90IGxlbmd0aCkgeworICBEQ0hFQ0soIShsZW5ndGggJiBrU3lzdGVtUGFnZU9mZnNldE1hc2spKTsKKyNpZiBkZWZpbmVkKE9TX1BPU0lYKQorICAvLyBPbiBQT1NJWCwgdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbCBpcyB0aGF0IGRpc2NhcmQgYW5kIGRlY29tbWl0IGFyZSB0aGUKKyAgLy8gc2FtZSwgYW5kIGxlYWQgdG8gcGFnZXMgdGhhdCBhcmUgcmV0dXJuZWQgdG8gdGhlIHN5c3RlbSBpbW1lZGlhdGVseSBhbmQKKyAgLy8gZ2V0IHJlcGxhY2VkIHdpdGggemVyb2VkIHBhZ2VzIHdoZW4gdG91Y2hlZC4gU28gd2UganVzdCBjYWxsCisgIC8vIERlY29tbWl0U3lzdGVtUGFnZXMoKSBoZXJlIHRvIGF2b2lkIGNvZGUgZHVwbGljYXRpb24uCisgIERlY29tbWl0U3lzdGVtUGFnZXMoYWRkcmVzcywgbGVuZ3RoKTsKKyNlbHNlCisgIC8vIE9uIFdpbmRvd3MgZGlzY2FyZGVkIHBhZ2VzIGFyZSBub3QgcmV0dXJuZWQgdG8gdGhlIHN5c3RlbSBpbW1lZGlhdGVseSBhbmQKKyAgLy8gbm90IGd1YXJhbnRlZWQgdG8gYmUgemVyb2VkIHdoZW4gcmV0dXJuZWQgdG8gdGhlIGFwcGxpY2F0aW9uLgorICB1c2luZyBEaXNjYXJkVmlydHVhbE1lbW9yeUZ1bmN0aW9uID0KKyAgICAgIERXT1JEKFdJTkFQSSopKFBWT0lEIHZpcnR1YWxBZGRyZXNzLCBTSVpFX1Qgc2l6ZSk7CisgIHN0YXRpYyBEaXNjYXJkVmlydHVhbE1lbW9yeUZ1bmN0aW9uIGRpc2NhcmRfdmlydHVhbF9tZW1vcnkgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxEaXNjYXJkVmlydHVhbE1lbW9yeUZ1bmN0aW9uPigtMSk7CisgIGlmIChkaXNjYXJkX3ZpcnR1YWxfbWVtb3J5ID09CisgICAgICByZWludGVycHJldF9jYXN0PERpc2NhcmRWaXJ0dWFsTWVtb3J5RnVuY3Rpb24+KC0xKSkKKyAgICBkaXNjYXJkX3ZpcnR1YWxfbWVtb3J5ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxEaXNjYXJkVmlydHVhbE1lbW9yeUZ1bmN0aW9uPihHZXRQcm9jQWRkcmVzcygKKyAgICAgICAgICAgIEdldE1vZHVsZUhhbmRsZShMIktlcm5lbDMyLmRsbCIpLCAiRGlzY2FyZFZpcnR1YWxNZW1vcnkiKSk7CisgIC8vIFVzZSBEaXNjYXJkVmlydHVhbE1lbW9yeSB3aGVuIGF2YWlsYWJsZSBiZWNhdXNlIGl0IHJlbGVhc2VzIGZhc3RlciB0aGFuCisgIC8vIE1FTV9SRVNFVC4KKyAgRFdPUkQgcmV0ID0gMTsKKyAgaWYgKGRpc2NhcmRfdmlydHVhbF9tZW1vcnkpCisgICAgcmV0ID0gZGlzY2FyZF92aXJ0dWFsX21lbW9yeShhZGRyZXNzLCBsZW5ndGgpOworICAvLyBEaXNjYXJkVmlydHVhbE1lbW9yeSBpcyBidWdneSBpbiBXaW4xMCBTUDAsIHNvIGZhbGwgYmFjayB0byBNRU1fUkVTRVQgb24KKyAgLy8gZmFpbHVyZS4KKyAgaWYgKHJldCkgeworICAgIHZvaWQqIHJldCA9IFZpcnR1YWxBbGxvYyhhZGRyZXNzLCBsZW5ndGgsIE1FTV9SRVNFVCwgUEFHRV9SRUFEV1JJVEUpOworICAgIENIRUNLKHJldCk7CisgIH0KKyNlbmRpZgorfQorCit1aW50MzJfdCBHZXRBbGxvY1BhZ2VFcnJvckNvZGUoKSB7CisgIHJldHVybiBzX2FsbG9jUGFnZUVycm9yQ29kZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBwZGZpdW0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvcGFnZV9hbGxvY2F0b3IuaCBiL3RoaXJkX3BhcnR5L2Jhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvcGFnZV9hbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWUyNTMyCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYmFzZS9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jYXRvci9wYWdlX2FsbG9jYXRvci5oCkBAIC0wLDAgKzEsMTMzIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIEJBU0VfQUxMT0NBVE9SX1BBUlRJVElPTl9BTExPQ0FUT1JfUEFHRV9BTExPQ0FUT1JfSAorI2RlZmluZSBCQVNFX0FMTE9DQVRPUl9QQVJUSVRJT05fQUxMT0NBVE9SX1BBR0VfQUxMT0NBVE9SX0gKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvYmFzZV9leHBvcnQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYnVpbGQvYnVpbGRfY29uZmlnLmgiCisKK25hbWVzcGFjZSBwZGZpdW0geworbmFtZXNwYWNlIGJhc2UgeworCisjaWYgZGVmaW5lZChPU19XSU4pCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtQYWdlQWxsb2NhdGlvbkdyYW51bGFyaXR5U2hpZnQgPSAxNjsgIC8vIDY0S0IKKyNlbGlmIGRlZmluZWQoX01JUFNfQVJDSF9MT09OR1NPTikKK3N0YXRpYyBjb25zdCBzaXplX3Qga1BhZ2VBbGxvY2F0aW9uR3JhbnVsYXJpdHlTaGlmdCA9IDE0OyAgLy8gMTZLQgorI2Vsc2UKK3N0YXRpYyBjb25zdCBzaXplX3Qga1BhZ2VBbGxvY2F0aW9uR3JhbnVsYXJpdHlTaGlmdCA9IDEyOyAgLy8gNEtCCisjZW5kaWYKK3N0YXRpYyBjb25zdCBzaXplX3Qga1BhZ2VBbGxvY2F0aW9uR3JhbnVsYXJpdHkgPQorICAgIDEgPDwga1BhZ2VBbGxvY2F0aW9uR3JhbnVsYXJpdHlTaGlmdDsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1BhZ2VBbGxvY2F0aW9uR3JhbnVsYXJpdHlPZmZzZXRNYXNrID0KKyAgICBrUGFnZUFsbG9jYXRpb25HcmFudWxhcml0eSAtIDE7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtQYWdlQWxsb2NhdGlvbkdyYW51bGFyaXR5QmFzZU1hc2sgPQorICAgIH5rUGFnZUFsbG9jYXRpb25HcmFudWxhcml0eU9mZnNldE1hc2s7CisKKy8vIEFsbCBCbGluay1zdXBwb3J0ZWQgc3lzdGVtcyBoYXZlIDQwOTYgc2l6ZWQgc3lzdGVtIHBhZ2VzIGFuZCBjYW4gaGFuZGxlCisvLyBwZXJtaXNzaW9ucyBhbmQgY29tbWl0IC8gZGVjb21taXQgYXQgdGhpcyBncmFudWxhcml0eS4KKy8vIExvb25nc29uIGhhdmUgMTYzODQgc2l6ZWQgc3lzdGVtIHBhZ2VzLgorI2lmIGRlZmluZWQoX01JUFNfQVJDSF9MT09OR1NPTikKK3N0YXRpYyBjb25zdCBzaXplX3Qga1N5c3RlbVBhZ2VTaXplID0gMTYzODQ7CisjZWxzZQorc3RhdGljIGNvbnN0IHNpemVfdCBrU3lzdGVtUGFnZVNpemUgPSA0MDk2OworI2VuZGlmCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtTeXN0ZW1QYWdlT2Zmc2V0TWFzayA9IGtTeXN0ZW1QYWdlU2l6ZSAtIDE7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtTeXN0ZW1QYWdlQmFzZU1hc2sgPSB+a1N5c3RlbVBhZ2VPZmZzZXRNYXNrOworCitlbnVtIFBhZ2VBY2Nlc3NpYmlsaXR5Q29uZmlndXJhdGlvbiB7CisgIFBhZ2VBY2Nlc3NpYmxlLAorICBQYWdlSW5hY2Nlc3NpYmxlLAorfTsKKworLy8gQWxsb2NhdGUgb25lIG9yIG1vcmUgcGFnZXMuCisvLyBUaGUgcmVxdWVzdGVkIGFkZHJlc3MgaXMganVzdCBhIGhpbnQ7IHRoZSBhY3R1YWwgYWRkcmVzcyByZXR1cm5lZCBtYXkKKy8vIGRpZmZlci4gVGhlIHJldHVybmVkIGFkZHJlc3Mgd2lsbCBiZSBhbGlnbmVkIGF0IGxlYXN0IHRvIGFsaWduIGJ5dGVzLgorLy8gbGVuIGlzIGluIGJ5dGVzLCBhbmQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIGtQYWdlQWxsb2NhdGlvbkdyYW51bGFyaXR5LgorLy8gYWxpZ24gaXMgaW4gYnl0ZXMsIGFuZCBtdXN0IGJlIGEgcG93ZXItb2YtdHdvIG11bHRpcGxlIG9mCisvLyBrUGFnZUFsbG9jYXRpb25HcmFudWxhcml0eS4KKy8vIElmIGFkZHIgaXMgbnVsbCwgdGhlbiBhIHN1aXRhYmxlIGFuZCByYW5kb21pemVkIGFkZHJlc3Mgd2lsbCBiZSBjaG9zZW4KKy8vIGF1dG9tYXRpY2FsbHkuCisvLyBQYWdlQWNjZXNzaWJpbGl0eUNvbmZpZ3VyYXRpb24gY29udHJvbHMgdGhlIHBlcm1pc3Npb24gb2YgdGhlCisvLyBhbGxvY2F0ZWQgcGFnZXMuCisvLyBUaGlzIGNhbGwgd2lsbCByZXR1cm4gbnVsbCBpZiB0aGUgYWxsb2NhdGlvbiBjYW5ub3QgYmUgc2F0aXNmaWVkLgorQkFTRV9FWFBPUlQgdm9pZCogQWxsb2NQYWdlcyh2b2lkKiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2VBY2Nlc3NpYmlsaXR5Q29uZmlndXJhdGlvbik7CisKKy8vIEZyZWUgb25lIG9yIG1vcmUgcGFnZXMuCisvLyBhZGRyIGFuZCBsZW4gbXVzdCBtYXRjaCBhIHByZXZpb3VzIGNhbGwgdG8gYWxsb2NQYWdlcygpLgorQkFTRV9FWFBPUlQgdm9pZCBGcmVlUGFnZXModm9pZCogYWRkcmVzcywgc2l6ZV90IGxlbmd0aCk7CisKKy8vIE1hcmsgb25lIG9yIG1vcmUgc3lzdGVtIHBhZ2VzIGFzIGJlaW5nIGluYWNjZXNzaWJsZS4KKy8vIFN1YnNlcXVlbnRseSBhY2Nlc3NpbmcgYW55IGFkZHJlc3MgaW4gdGhlIHJhbmdlIHdpbGwgZmF1bHQsIGFuZCB0aGUKKy8vIGFkZHJlc3NlcyB3aWxsIG5vdCBiZSByZS11c2VkIGJ5IGZ1dHVyZSBhbGxvY2F0aW9ucy4KKy8vIGxlbiBtdXN0IGJlIGEgbXVsdGlwbGUgb2Yga1N5c3RlbVBhZ2VTaXplIGJ5dGVzLgorQkFTRV9FWFBPUlQgdm9pZCBTZXRTeXN0ZW1QYWdlc0luYWNjZXNzaWJsZSh2b2lkKiBhZGRyZXNzLCBzaXplX3QgbGVuZ3RoKTsKKworLy8gTWFyayBvbmUgb3IgbW9yZSBzeXN0ZW0gcGFnZXMgYXMgYmVpbmcgYWNjZXNzaWJsZS4KKy8vIFRoZSBwYWdlcyB3aWxsIGJlIHJlYWRhYmxlIGFuZCB3cml0ZWFibGUuCisvLyBsZW4gbXVzdCBiZSBhIG11bHRpcGxlIG9mIGtTeXN0ZW1QYWdlU2l6ZSBieXRlcy4KKy8vIFRoZSByZXN1bHQgYm9vbCB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgcGVybWlzc2lvbgorLy8gY2hhbmdlIHN1Y2NlZWRlZCBvciBub3QuIFlvdSBtdXN0IGNoZWNrIHRoZSByZXN1bHQKKy8vIChpbiBtb3N0IGNhc2VzIHlvdSBuZWVkIHRvIENIRUNLIHRoYXQgaXQgaXMgdHJ1ZSkuCitCQVNFX0VYUE9SVCBXQVJOX1VOVVNFRF9SRVNVTFQgYm9vbCBTZXRTeXN0ZW1QYWdlc0FjY2Vzc2libGUodm9pZCogYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKTsKKworLy8gRGVjb21taXQgb25lIG9yIG1vcmUgc3lzdGVtIHBhZ2VzLiBEZWNvbW1pdHRlZCBtZWFucyB0aGF0IHRoZSBwaHlzaWNhbCBtZW1vcnkKKy8vIGlzIHJlbGVhc2VkIHRvIHRoZSBzeXN0ZW0sIGJ1dCB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlIHJlbWFpbnMgcmVzZXJ2ZWQuCisvLyBTeXN0ZW0gcGFnZXMgYXJlIHJlLWNvbW1pdHRlZCBieSBjYWxsaW5nIHJlY29tbWl0U3lzdGVtUGFnZXMoKS4gVG91Y2hpbmcKKy8vIGEgZGVjb21taXR0ZWQgcGFnZSBfbWF5XyBmYXVsdC4KKy8vIENsaWVudHMgc2hvdWxkIG5vdCBtYWtlIGFueSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgY29udGVudHMgb2YgZGVjb21taXR0ZWQKKy8vIHN5c3RlbSBwYWdlcywgYmVmb3JlIG9yIGFmdGVyIHRoZXkgd3JpdGUgdG8gdGhlIHBhZ2UuIFRoZSBvbmx5IGd1YXJhbnRlZQorLy8gcHJvdmlkZWQgaXMgdGhhdCB0aGUgY29udGVudHMgb2YgdGhlIHN5c3RlbSBwYWdlIHdpbGwgYmUgZGV0ZXJtaW5pc3RpYyBhZ2FpbgorLy8gYWZ0ZXIgcmVjb21taXR0aW5nIGFuZCB3cml0aW5nIHRvIGl0LiBJbiBwYXJ0aWNsYXIgbm90ZSB0aGF0IHN5c3RlbSBwYWdlcyBhcmUKKy8vIG5vdCBndWFyYW50ZWVkIHRvIGJlIHplcm8tZmlsbGVkIHVwb24gcmUtY29tbWl0LiBsZW4gbXVzdCBiZSBhIG11bHRpcGxlIG9mCisvLyBrU3lzdGVtUGFnZVNpemUgYnl0ZXMuCitCQVNFX0VYUE9SVCB2b2lkIERlY29tbWl0U3lzdGVtUGFnZXModm9pZCogYWRkcmVzcywgc2l6ZV90IGxlbmd0aCk7CisKKy8vIFJlY29tbWl0IG9uZSBvciBtb3JlIHN5c3RlbSBwYWdlcy4gRGVjb21taXR0ZWQgc3lzdGVtIHBhZ2VzIG11c3QgYmUKKy8vIHJlY29tbWl0dGVkIGJlZm9yZSB0aGV5IGFyZSByZWFkIGFyZSB3cml0dGVuIGFnYWluLgorLy8gTm90ZSB0aGF0IHRoaXMgb3BlcmF0aW9uIG1heSBiZSBhIG5vLW9wIG9uIHNvbWUgcGxhdGZvcm1zLgorLy8gbGVuIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBrU3lzdGVtUGFnZVNpemUgYnl0ZXMuCitCQVNFX0VYUE9SVCB2b2lkIFJlY29tbWl0U3lzdGVtUGFnZXModm9pZCogYWRkcmVzcywgc2l6ZV90IGxlbmd0aCk7CisKKy8vIERpc2NhcmQgb25lIG9yIG1vcmUgc3lzdGVtIHBhZ2VzLiBEaXNjYXJkaW5nIGlzIGEgaGludCB0byB0aGUgc3lzdGVtIHRoYXQKKy8vIHRoZSBwYWdlIGlzIG5vIGxvbmdlciByZXF1aXJlZC4gVGhlIGhpbnQgbWF5OgorLy8gLSBEbyBub3RoaW5nLgorLy8gLSBEaXNjYXJkIHRoZSBwYWdlIGltbWVkaWF0ZWx5LCBmcmVlaW5nIHVwIHBoeXNpY2FsIHBhZ2VzLgorLy8gLSBEaXNjYXJkIHRoZSBwYWdlIGF0IHNvbWUgdGltZSBpbiB0aGUgZnV0dXJlIGluIHJlc3BvbnNlIHRvIG1lbW9yeSBwcmVzc3VyZS4KKy8vIE9ubHkgY29tbWl0dGVkIHBhZ2VzIHNob3VsZCBiZSBkaXNjYXJkZWQuIERpc2NhcmRpbmcgYSBwYWdlIGRvZXMgbm90CisvLyBkZWNvbW1pdCBpdCwgYW5kIGl0IGlzIHZhbGlkIHRvIGRpc2NhcmQgYW4gYWxyZWFkeS1kaXNjYXJkZWQgcGFnZS4KKy8vIEEgcmVhZCBvciB3cml0ZSB0byBhIGRpc2NhcmRlZCBwYWdlIHdpbGwgbm90IGZhdWx0LgorLy8gUmVhZGluZyBmcm9tIGEgZGlzY2FyZGVkIHBhZ2UgbWF5IHJldHVybiB0aGUgb3JpZ2luYWwgcGFnZSBjb250ZW50LCBvciBhCisvLyBwYWdlIGZ1bGwgb2YgemVyb2VzLgorLy8gV3JpdGluZyB0byBhIGRpc2NhcmRlZCBwYWdlIGlzIHRoZSBvbmx5IGd1YXJhbnRlZWQgd2F5IHRvIHRlbGwgdGhlIHN5c3RlbQorLy8gdGhhdCB0aGUgcGFnZSBpcyByZXF1aXJlZCBhZ2Fpbi4gT25jZSB3cml0dGVuIHRvLCB0aGUgY29udGVudCBvZiB0aGUgcGFnZSBpcworLy8gZ3VhcmFudGVlZCBzdGFibGUgb25jZSBtb3JlLiBBZnRlciBiZWluZyB3cml0dGVuIHRvLCB0aGUgcGFnZSBjb250ZW50IG1heSBiZQorLy8gYmFzZWQgb24gdGhlIG9yaWdpbmFsIHBhZ2UgY29udGVudCwgb3IgYSBwYWdlIG9mIHplcm9lcy4KKy8vIGxlbiBtdXN0IGJlIGEgbXVsdGlwbGUgb2Yga1N5c3RlbVBhZ2VTaXplIGJ5dGVzLgorQkFTRV9FWFBPUlQgdm9pZCBEaXNjYXJkU3lzdGVtUGFnZXModm9pZCogYWRkcmVzcywgc2l6ZV90IGxlbmd0aCk7CisKK0FMV0FZU19JTkxJTkUgdWludHB0cl90IFJvdW5kVXBUb1N5c3RlbVBhZ2UodWludHB0cl90IGFkZHJlc3MpIHsKKyAgcmV0dXJuIChhZGRyZXNzICsga1N5c3RlbVBhZ2VPZmZzZXRNYXNrKSAmIGtTeXN0ZW1QYWdlQmFzZU1hc2s7Cit9CisKK0FMV0FZU19JTkxJTkUgdWludHB0cl90IFJvdW5kRG93blRvU3lzdGVtUGFnZSh1aW50cHRyX3QgYWRkcmVzcykgeworICByZXR1cm4gYWRkcmVzcyAmIGtTeXN0ZW1QYWdlQmFzZU1hc2s7Cit9CisKKy8vIFJldHVybnMgZXJybm8gKG9yIEdldExhc3RFcnJvciBjb2RlKSB3aGVuIG1tYXAgKG9yIFZpcnR1YWxBbGxvYykgZmFpbHMuCitCQVNFX0VYUE9SVCB1aW50MzJfdCBHZXRBbGxvY1BhZ2VFcnJvckNvZGUoKTsKKworfSAgLy8gbmFtZXNwYWNlIGJhc2UKK30gIC8vIG5hbWVzcGFjZSBwZGZpdW0KKworI2VuZGlmICAvLyBCQVNFX0FMTE9DQVRPUl9QQVJUSVRJT05fQUxMT0NBVE9SX1BBR0VfQUxMT0NBVE9SX0gKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jLmNjIGIvdGhpcmRfcGFydHkvYmFzZS9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jYXRvci9wYXJ0aXRpb25fYWxsb2MuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYzNjZiOAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jLmNjCkBAIC0wLDAgKzEsMTQ0NCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3Ivb29tLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jYXRvci9zcGluX2xvY2suaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCisKKy8vIFR3byBwYXJ0aXRpb24gcGFnZXMgYXJlIHVzZWQgYXMgZ3VhcmQgLyBtZXRhZGF0YSBwYWdlIHNvIG1ha2Ugc3VyZSB0aGUgc3VwZXIKKy8vIHBhZ2Ugc2l6ZSBpcyBiaWdnZXIuCitzdGF0aWNfYXNzZXJ0KHBkZml1bTo6YmFzZTo6a1BhcnRpdGlvblBhZ2VTaXplICogNCA8PQorICAgICAgICAgICAgICAgICAgcGRmaXVtOjpiYXNlOjprU3VwZXJQYWdlU2l6ZSwKKyAgICAgICAgICAgICAgIm9rIHN1cGVyIHBhZ2Ugc2l6ZSIpOworc3RhdGljX2Fzc2VydCghKHBkZml1bTo6YmFzZTo6a1N1cGVyUGFnZVNpemUgJQorICAgICAgICAgICAgICAgIHBkZml1bTo6YmFzZTo6a1BhcnRpdGlvblBhZ2VTaXplKSwKKyAgICAgICAgICAgICAgIm9rIHN1cGVyIHBhZ2UgbXVsdGlwbGUiKTsKKy8vIEZvdXIgc3lzdGVtIHBhZ2VzIGdpdmVzIHVzIHJvb20gdG8gaGFjayBvdXQgYSBzdGlsbC1ndWFyZC1wYWdlZCBwaWVjZQorLy8gb2YgbWV0YWRhdGEgaW4gdGhlIG1pZGRsZSBvZiBhIGd1YXJkIHBhcnRpdGlvbiBwYWdlLgorc3RhdGljX2Fzc2VydChwZGZpdW06OmJhc2U6OmtTeXN0ZW1QYWdlU2l6ZSAqIDQgPD0KKyAgICAgICAgICAgICAgICAgIHBkZml1bTo6YmFzZTo6a1BhcnRpdGlvblBhZ2VTaXplLAorICAgICAgICAgICAgICAib2sgcGFydGl0aW9uIHBhZ2Ugc2l6ZSIpOworc3RhdGljX2Fzc2VydCghKHBkZml1bTo6YmFzZTo6a1BhcnRpdGlvblBhZ2VTaXplICUKKyAgICAgICAgICAgICAgICBwZGZpdW06OmJhc2U6OmtTeXN0ZW1QYWdlU2l6ZSksCisgICAgICAgICAgICAgICJvayBwYXJ0aXRpb24gcGFnZSBtdWx0aXBsZSIpOworc3RhdGljX2Fzc2VydChzaXplb2YocGRmaXVtOjpiYXNlOjpQYXJ0aXRpb25QYWdlKSA8PQorICAgICAgICAgICAgICAgICAgcGRmaXVtOjpiYXNlOjprUGFnZU1ldGFkYXRhU2l6ZSwKKyAgICAgICAgICAgICAgIlBhcnRpdGlvblBhZ2Ugc2hvdWxkIG5vdCBiZSB0b28gYmlnIik7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihwZGZpdW06OmJhc2U6OlBhcnRpdGlvbkJ1Y2tldCkgPD0KKyAgICAgICAgICAgICAgICAgIHBkZml1bTo6YmFzZTo6a1BhZ2VNZXRhZGF0YVNpemUsCisgICAgICAgICAgICAgICJQYXJ0aXRpb25CdWNrZXQgc2hvdWxkIG5vdCBiZSB0b28gYmlnIik7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihwZGZpdW06OmJhc2U6OlBhcnRpdGlvblN1cGVyUGFnZUV4dGVudEVudHJ5KSA8PQorICAgICAgICAgICAgICAgICAgcGRmaXVtOjpiYXNlOjprUGFnZU1ldGFkYXRhU2l6ZSwKKyAgICAgICAgICAgICAgIlBhcnRpdGlvblN1cGVyUGFnZUV4dGVudEVudHJ5IHNob3VsZCBub3QgYmUgdG9vIGJpZyIpOworc3RhdGljX2Fzc2VydChwZGZpdW06OmJhc2U6OmtQYWdlTWV0YWRhdGFTaXplICoKKyAgICAgICAgICAgICAgICAgICAgICBwZGZpdW06OmJhc2U6OmtOdW1QYXJ0aXRpb25QYWdlc1BlclN1cGVyUGFnZSA8PQorICAgICAgICAgICAgICAgICAgcGRmaXVtOjpiYXNlOjprU3lzdGVtUGFnZVNpemUsCisgICAgICAgICAgICAgICJwYWdlIG1ldGFkYXRhIGZpdHMgaW4gaG9sZSIpOworLy8gQ2hlY2sgdGhhdCBzb21lIG9mIG91ciB6YW5pZXIgY2FsY3VsYXRpb25zIHdvcmtlZCBvdXQgYXMgZXhwZWN0ZWQuCitzdGF0aWNfYXNzZXJ0KHBkZml1bTo6YmFzZTo6a0dlbmVyaWNTbWFsbGVzdEJ1Y2tldCA9PSA4LAorICAgICAgICAgICAgICAiZ2VuZXJpYyBzbWFsbGVzdCBidWNrZXQiKTsKK3N0YXRpY19hc3NlcnQocGRmaXVtOjpiYXNlOjprR2VuZXJpY01heEJ1Y2tldGVkID09IDk4MzA0MCwKKyAgICAgICAgICAgICAgImdlbmVyaWMgbWF4IGJ1Y2tldGVkIik7CitzdGF0aWNfYXNzZXJ0KHBkZml1bTo6YmFzZTo6a01heFN5c3RlbVBhZ2VzUGVyU2xvdFNwYW4gPCAoMSA8PCA4KSwKKyAgICAgICAgICAgICAgIlN5c3RlbSBwYWdlcyBwZXIgc2xvdCBzcGFuIG11c3QgYmUgbGVzcyB0aGFuIDEyOC4iKTsKKworbmFtZXNwYWNlIHBkZml1bSB7CituYW1lc3BhY2UgYmFzZSB7CisKK3N1YnRsZTo6U3BpbkxvY2sgUGFydGl0aW9uUm9vdEJhc2U6OmdJbml0aWFsaXplZExvY2s7Citib29sIFBhcnRpdGlvblJvb3RCYXNlOjpnSW5pdGlhbGl6ZWQgPSBmYWxzZTsKK1BhcnRpdGlvblBhZ2UgUGFydGl0aW9uUm9vdEJhc2U6OmdTZWVkUGFnZTsKK1BhcnRpdGlvbkJ1Y2tldCBQYXJ0aXRpb25Sb290QmFzZTo6Z1BhZ2VkQnVja2V0Owordm9pZCAoKlBhcnRpdGlvblJvb3RCYXNlOjpnT29tSGFuZGxpbmdGdW5jdGlvbikoKSA9IG51bGxwdHI7CitQYXJ0aXRpb25BbGxvY0hvb2tzOjpBbGxvY2F0aW9uSG9vayogUGFydGl0aW9uQWxsb2NIb29rczo6YWxsb2NhdGlvbl9ob29rXyA9CisgICAgbnVsbHB0cjsKK1BhcnRpdGlvbkFsbG9jSG9va3M6OkZyZWVIb29rKiBQYXJ0aXRpb25BbGxvY0hvb2tzOjpmcmVlX2hvb2tfID0gbnVsbHB0cjsKKworc3RhdGljIHVpbnQ4X3QgUGFydGl0aW9uQnVja2V0TnVtU3lzdGVtUGFnZXMoc2l6ZV90IHNpemUpIHsKKyAgLy8gVGhpcyB3b3JrcyBvdXQgcmVhc29uYWJseSBmb3IgdGhlIGN1cnJlbnQgYnVja2V0IHNpemVzIG9mIHRoZSBnZW5lcmljCisgIC8vIGFsbG9jYXRvciwgYW5kIHRoZSBjdXJyZW50IHZhbHVlcyBvZiBwYXJ0aXRpb24gcGFnZSBzaXplIGFuZCBjb25zdGFudHMuCisgIC8vIFNwZWNpZmljYWxseSwgd2UgaGF2ZSBlbm91Z2ggcm9vbSB0byBhbHdheXMgcGFjayB0aGUgc2xvdHMgcGVyZmVjdGx5IGludG8KKyAgLy8gc29tZSBudW1iZXIgb2Ygc3lzdGVtIHBhZ2VzLiBUaGUgb25seSB3YXN0ZSBpcyB0aGUgd2FzdGUgYXNzb2NpYXRlZCB3aXRoCisgIC8vIHVuZmF1bHRlZCBwYWdlcyAoaS5lLiB3YXN0ZWQgYWRkcmVzcyBzcGFjZSkuCisgIC8vIFRPRE86IHdlIGVuZCB1cCB1c2luZyBhIGxvdCBvZiBzeXN0ZW0gcGFnZXMgZm9yIHZlcnkgc21hbGwgc2l6ZXMuIEZvcgorICAvLyBleGFtcGxlLCB3ZSdsbCB1c2UgMTIgc3lzdGVtIHBhZ2VzIGZvciBzbG90IHNpemUgMjQuIFRoZSBzbG90IHNpemUgaXMKKyAgLy8gc28gc21hbGwgdGhhdCB0aGUgd2FzdGUgd291bGQgYmUgdGlueSB3aXRoIGp1c3QgNCwgb3IgMSwgc3lzdGVtIHBhZ2VzLgorICAvLyBMYXRlciwgd2UgY2FuIGludmVzdGlnYXRlIHdoZXRoZXIgdGhlcmUgYXJlIGFudGktZnJhZ21lbnRhdGlvbiBiZW5lZml0cworICAvLyB0byB1c2luZyBmZXdlciBzeXN0ZW0gcGFnZXMuCisgIGRvdWJsZSBiZXN0X3dhc3RlX3JhdGlvID0gMS4wZjsKKyAgdWludDE2X3QgYmVzdF9wYWdlcyA9IDA7CisgIGlmIChzaXplID4ga01heFN5c3RlbVBhZ2VzUGVyU2xvdFNwYW4gKiBrU3lzdGVtUGFnZVNpemUpIHsKKyAgICBEQ0hFQ0soIShzaXplICUga1N5c3RlbVBhZ2VTaXplKSk7CisgICAgYmVzdF9wYWdlcyA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihzaXplIC8ga1N5c3RlbVBhZ2VTaXplKTsKKyAgICBDSEVDSyhiZXN0X3BhZ2VzIDwgKDEgPDwgOCkpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50OF90PihiZXN0X3BhZ2VzKTsKKyAgfQorICBEQ0hFQ0soc2l6ZSA8PSBrTWF4U3lzdGVtUGFnZXNQZXJTbG90U3BhbiAqIGtTeXN0ZW1QYWdlU2l6ZSk7CisgIGZvciAodWludDE2X3QgaSA9IGtOdW1TeXN0ZW1QYWdlc1BlclBhcnRpdGlvblBhZ2UgLSAxOworICAgICAgIGkgPD0ga01heFN5c3RlbVBhZ2VzUGVyU2xvdFNwYW47ICsraSkgeworICAgIHNpemVfdCBwYWdlX3NpemUgPSBrU3lzdGVtUGFnZVNpemUgKiBpOworICAgIHNpemVfdCBudW1fc2xvdHMgPSBwYWdlX3NpemUgLyBzaXplOworICAgIHNpemVfdCB3YXN0ZSA9IHBhZ2Vfc2l6ZSAtIChudW1fc2xvdHMgKiBzaXplKTsKKyAgICAvLyBMZWF2aW5nIGEgcGFnZSB1bmZhdWx0ZWQgaXMgbm90IGZyZWU7IHRoZSBwYWdlIHdpbGwgb2NjdXB5IGFuIGVtcHR5IHBhZ2UKKyAgICAvLyB0YWJsZSBlbnRyeS4gIE1ha2UgYSBzaW1wbGUgYXR0ZW1wdCB0byBhY2NvdW50IGZvciB0aGF0LgorICAgIHNpemVfdCBudW1fcmVtYWluZGVyX3BhZ2VzID0gaSAmIChrTnVtU3lzdGVtUGFnZXNQZXJQYXJ0aXRpb25QYWdlIC0gMSk7CisgICAgc2l6ZV90IG51bV91bmZhdWx0ZWRfcGFnZXMgPQorICAgICAgICBudW1fcmVtYWluZGVyX3BhZ2VzCisgICAgICAgICAgICA/IChrTnVtU3lzdGVtUGFnZXNQZXJQYXJ0aXRpb25QYWdlIC0gbnVtX3JlbWFpbmRlcl9wYWdlcykKKyAgICAgICAgICAgIDogMDsKKyAgICB3YXN0ZSArPSBzaXplb2Yodm9pZCopICogbnVtX3VuZmF1bHRlZF9wYWdlczsKKyAgICBkb3VibGUgd2FzdGVfcmF0aW8gPSAoZG91YmxlKXdhc3RlIC8gKGRvdWJsZSlwYWdlX3NpemU7CisgICAgaWYgKHdhc3RlX3JhdGlvIDwgYmVzdF93YXN0ZV9yYXRpbykgeworICAgICAgYmVzdF93YXN0ZV9yYXRpbyA9IHdhc3RlX3JhdGlvOworICAgICAgYmVzdF9wYWdlcyA9IGk7CisgICAgfQorICB9CisgIERDSEVDSyhiZXN0X3BhZ2VzID4gMCk7CisgIENIRUNLKGJlc3RfcGFnZXMgPD0ga01heFN5c3RlbVBhZ2VzUGVyU2xvdFNwYW4pOworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDhfdD4oYmVzdF9wYWdlcyk7Cit9CisKK3N0YXRpYyB2b2lkIFBhcnRpdGlvbkFsbG9jQmFzZUluaXQoUGFydGl0aW9uUm9vdEJhc2UqIHJvb3QpIHsKKyAgRENIRUNLKCFyb290LT5pbml0aWFsaXplZCk7CisgIHsKKyAgICBzdWJ0bGU6OlNwaW5Mb2NrOjpHdWFyZCBndWFyZChQYXJ0aXRpb25Sb290QmFzZTo6Z0luaXRpYWxpemVkTG9jayk7CisgICAgaWYgKCFQYXJ0aXRpb25Sb290QmFzZTo6Z0luaXRpYWxpemVkKSB7CisgICAgICBQYXJ0aXRpb25Sb290QmFzZTo6Z0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgIC8vIFdlIG1hcmsgdGhlIHNlZWQgcGFnZSBhcyBmcmVlIHRvIG1ha2Ugc3VyZSBpdCBpcyBza2lwcGVkIGJ5IG91cgorICAgICAgLy8gbG9naWMgdG8gZmluZCBhIG5ldyBhY3RpdmUgcGFnZS4KKyAgICAgIFBhcnRpdGlvblJvb3RCYXNlOjpnUGFnZWRCdWNrZXQuYWN0aXZlX3BhZ2VzX2hlYWQgPQorICAgICAgICAgICZQYXJ0aXRpb25Sb290R2VuZXJpYzo6Z1NlZWRQYWdlOworICAgIH0KKyAgfQorCisgIHJvb3QtPmluaXRpYWxpemVkID0gdHJ1ZTsKKyAgcm9vdC0+dG90YWxfc2l6ZV9vZl9jb21taXR0ZWRfcGFnZXMgPSAwOworICByb290LT50b3RhbF9zaXplX29mX3N1cGVyX3BhZ2VzID0gMDsKKyAgcm9vdC0+dG90YWxfc2l6ZV9vZl9kaXJlY3RfbWFwcGVkX3BhZ2VzID0gMDsKKyAgcm9vdC0+bmV4dF9zdXBlcl9wYWdlID0gMDsKKyAgcm9vdC0+bmV4dF9wYXJ0aXRpb25fcGFnZSA9IDA7CisgIHJvb3QtPm5leHRfcGFydGl0aW9uX3BhZ2VfZW5kID0gMDsKKyAgcm9vdC0+Zmlyc3RfZXh0ZW50ID0gMDsKKyAgcm9vdC0+Y3VycmVudF9leHRlbnQgPSAwOworICByb290LT5kaXJlY3RfbWFwX2xpc3QgPSAwOworCisgIG1lbXNldCgmcm9vdC0+Z2xvYmFsX2VtcHR5X3BhZ2VfcmluZywgJ1wwJywKKyAgICAgICAgIHNpemVvZihyb290LT5nbG9iYWxfZW1wdHlfcGFnZV9yaW5nKSk7CisgIHJvb3QtPmdsb2JhbF9lbXB0eV9wYWdlX3JpbmdfaW5kZXggPSAwOworCisgIC8vIFRoaXMgaXMgYSAibWFnaWMiIHZhbHVlIHNvIHdlIGNhbiB0ZXN0IGlmIGEgcm9vdCBwb2ludGVyIGlzIHZhbGlkLgorICByb290LT5pbnZlcnRlZF9zZWxmID0gfnJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pihyb290KTsKK30KKworc3RhdGljIHZvaWQgUGFydGl0aW9uQnVja2V0SW5pdEJhc2UoUGFydGl0aW9uQnVja2V0KiBidWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aXRpb25Sb290QmFzZSogcm9vdCkgeworICBidWNrZXQtPmFjdGl2ZV9wYWdlc19oZWFkID0gJlBhcnRpdGlvblJvb3RHZW5lcmljOjpnU2VlZFBhZ2U7CisgIGJ1Y2tldC0+ZW1wdHlfcGFnZXNfaGVhZCA9IDA7CisgIGJ1Y2tldC0+ZGVjb21taXR0ZWRfcGFnZXNfaGVhZCA9IDA7CisgIGJ1Y2tldC0+bnVtX2Z1bGxfcGFnZXMgPSAwOworICBidWNrZXQtPm51bV9zeXN0ZW1fcGFnZXNfcGVyX3Nsb3Rfc3BhbiA9CisgICAgICBQYXJ0aXRpb25CdWNrZXROdW1TeXN0ZW1QYWdlcyhidWNrZXQtPnNsb3Rfc2l6ZSk7Cit9CisKK3ZvaWQgUGFydGl0aW9uQWxsb2NHbG9iYWxJbml0KHZvaWQgKCpvb21faGFuZGxpbmdfZnVuY3Rpb24pKCkpIHsKKyAgRENIRUNLKG9vbV9oYW5kbGluZ19mdW5jdGlvbik7CisgIFBhcnRpdGlvblJvb3RCYXNlOjpnT29tSGFuZGxpbmdGdW5jdGlvbiA9IG9vbV9oYW5kbGluZ19mdW5jdGlvbjsKK30KKwordm9pZCBQYXJ0aXRpb25BbGxvY0luaXQoUGFydGl0aW9uUm9vdCogcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fYnVja2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtYXhfYWxsb2NhdGlvbikgeworICBQYXJ0aXRpb25BbGxvY0Jhc2VJbml0KHJvb3QpOworCisgIHJvb3QtPm51bV9idWNrZXRzID0gbnVtX2J1Y2tldHM7CisgIHJvb3QtPm1heF9hbGxvY2F0aW9uID0gbWF4X2FsbG9jYXRpb247CisgIHNpemVfdCBpOworICBmb3IgKGkgPSAwOyBpIDwgcm9vdC0+bnVtX2J1Y2tldHM7ICsraSkgeworICAgIFBhcnRpdGlvbkJ1Y2tldCogYnVja2V0ID0gJnJvb3QtPmJ1Y2tldHMoKVtpXTsKKyAgICBpZiAoIWkpCisgICAgICBidWNrZXQtPnNsb3Rfc2l6ZSA9IGtBbGxvY2F0aW9uR3JhbnVsYXJpdHk7CisgICAgZWxzZQorICAgICAgYnVja2V0LT5zbG90X3NpemUgPSBpIDw8IGtCdWNrZXRTaGlmdDsKKyAgICBQYXJ0aXRpb25CdWNrZXRJbml0QmFzZShidWNrZXQsIHJvb3QpOworICB9Cit9CisKK3ZvaWQgUGFydGl0aW9uQWxsb2NHZW5lcmljSW5pdChQYXJ0aXRpb25Sb290R2VuZXJpYyogcm9vdCkgeworICBzdWJ0bGU6OlNwaW5Mb2NrOjpHdWFyZCBndWFyZChyb290LT5sb2NrKTsKKworICBQYXJ0aXRpb25BbGxvY0Jhc2VJbml0KHJvb3QpOworCisgIC8vIFByZWNhbGN1bGF0ZSBzb21lIHNoaWZ0IGFuZCBtYXNrIGNvbnN0YW50cyB1c2VkIGluIHRoZSBob3QgcGF0aC4KKyAgLy8gRXhhbXBsZTogbWFsbG9jKDQxKSA9PSAxMDEwMDEgYmluYXJ5LgorICAvLyBPcmRlciBpcyA2ICgxIDw8IDYtMSkgPT0gMzIgaXMgaGlnaGVzdCBiaXQgc2V0LgorICAvLyBvcmRlcl9pbmRleCBpcyB0aGUgbmV4dCB0aHJlZSBNU0IgPT0gMDEwID09IDIuCisgIC8vIHN1Yl9vcmRlcl9pbmRleF9tYXNrIGlzIGEgbWFzayBmb3IgdGhlIHJlbWFpbmluZyBiaXRzID09IDExIChtYXNraW5nIHRvIDAxCisgIC8vIGZvcgorICAvLyB0aGUgc3ViX29yZGVyX2luZGV4KS4KKyAgc2l6ZV90IG9yZGVyOworICBmb3IgKG9yZGVyID0gMDsgb3JkZXIgPD0ga0JpdHNQZXJTaXplVDsgKytvcmRlcikgeworICAgIHNpemVfdCBvcmRlcl9pbmRleF9zaGlmdDsKKyAgICBpZiAob3JkZXIgPCBrR2VuZXJpY051bUJ1Y2tldHNQZXJPcmRlckJpdHMgKyAxKQorICAgICAgb3JkZXJfaW5kZXhfc2hpZnQgPSAwOworICAgIGVsc2UKKyAgICAgIG9yZGVyX2luZGV4X3NoaWZ0ID0gb3JkZXIgLSAoa0dlbmVyaWNOdW1CdWNrZXRzUGVyT3JkZXJCaXRzICsgMSk7CisgICAgcm9vdC0+b3JkZXJfaW5kZXhfc2hpZnRzW29yZGVyXSA9IG9yZGVyX2luZGV4X3NoaWZ0OworICAgIHNpemVfdCBzdWJfb3JkZXJfaW5kZXhfbWFzazsKKyAgICBpZiAob3JkZXIgPT0ga0JpdHNQZXJTaXplVCkgeworICAgICAgLy8gVGhpcyBhdm9pZHMgaW52b2tpbmcgdW5kZWZpbmVkIGJlaGF2aW9yIGZvciBhbiBleGNlc3NpdmUgc2hpZnQuCisgICAgICBzdWJfb3JkZXJfaW5kZXhfbWFzayA9CisgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PigtMSkgPj4gKGtHZW5lcmljTnVtQnVja2V0c1Blck9yZGVyQml0cyArIDEpOworICAgIH0gZWxzZSB7CisgICAgICBzdWJfb3JkZXJfaW5kZXhfbWFzayA9ICgoc3RhdGljX2Nhc3Q8c2l6ZV90PigxKSA8PCBvcmRlcikgLSAxKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa0dlbmVyaWNOdW1CdWNrZXRzUGVyT3JkZXJCaXRzICsgMSk7CisgICAgfQorICAgIHJvb3QtPm9yZGVyX3N1Yl9pbmRleF9tYXNrc1tvcmRlcl0gPSBzdWJfb3JkZXJfaW5kZXhfbWFzazsKKyAgfQorCisgIC8vIFNldCB1cCB0aGUgYWN0dWFsIHVzYWJsZSBidWNrZXRzIGZpcnN0LgorICAvLyBOb3RlIHRoYXQgdHlwaWNhbCB2YWx1ZXMgKGkuZS4gbWluIGFsbG9jYXRpb24gc2l6ZSBvZiA4KSB3aWxsIHJlc3VsdCBpbgorICAvLyBwc2V1ZG8gYnVja2V0cyAoc2l6ZT09OSBldGMuIG9yIG1vcmUgZ2VuZXJhbGx5LCBzaXplIGlzIG5vdCBhIG11bHRpcGxlCisgIC8vIG9mIHRoZSBzbWFsbGVzdCBhbGxvY2F0aW9uIGdyYW51bGFyaXR5KS4KKyAgLy8gV2UgYXZvaWQgdGhlbSBpbiB0aGUgYnVja2V0IGxvb2t1cCBtYXAsIGJ1dCB3ZSB0b2xlcmF0ZSB0aGVtIHRvIGtlZXAgdGhlCisgIC8vIGNvZGUgc2ltcGxlciBhbmQgdGhlIHN0cnVjdHVyZXMgbW9yZSBnZW5lcmljLgorICBzaXplX3QgaSwgajsKKyAgc2l6ZV90IGN1cnJlbnRfc2l6ZSA9IGtHZW5lcmljU21hbGxlc3RCdWNrZXQ7CisgIHNpemVfdCBjdXJyZW50SW5jcmVtZW50ID0KKyAgICAgIGtHZW5lcmljU21hbGxlc3RCdWNrZXQgPj4ga0dlbmVyaWNOdW1CdWNrZXRzUGVyT3JkZXJCaXRzOworICBQYXJ0aXRpb25CdWNrZXQqIGJ1Y2tldCA9ICZyb290LT5idWNrZXRzWzBdOworICBmb3IgKGkgPSAwOyBpIDwga0dlbmVyaWNOdW1CdWNrZXRlZE9yZGVyczsgKytpKSB7CisgICAgZm9yIChqID0gMDsgaiA8IGtHZW5lcmljTnVtQnVja2V0c1Blck9yZGVyOyArK2opIHsKKyAgICAgIGJ1Y2tldC0+c2xvdF9zaXplID0gY3VycmVudF9zaXplOworICAgICAgUGFydGl0aW9uQnVja2V0SW5pdEJhc2UoYnVja2V0LCByb290KTsKKyAgICAgIC8vIERpc2FibGUgcHN1ZWRvIGJ1Y2tldHMgc28gdGhhdCB0b3VjaGluZyB0aGVtIGZhdWx0cy4KKyAgICAgIGlmIChjdXJyZW50X3NpemUgJSBrR2VuZXJpY1NtYWxsZXN0QnVja2V0KQorICAgICAgICBidWNrZXQtPmFjdGl2ZV9wYWdlc19oZWFkID0gMDsKKyAgICAgIGN1cnJlbnRfc2l6ZSArPSBjdXJyZW50SW5jcmVtZW50OworICAgICAgKytidWNrZXQ7CisgICAgfQorICAgIGN1cnJlbnRJbmNyZW1lbnQgPDw9IDE7CisgIH0KKyAgRENIRUNLKGN1cnJlbnRfc2l6ZSA9PSAxIDw8IGtHZW5lcmljTWF4QnVja2V0ZWRPcmRlcik7CisgIERDSEVDSyhidWNrZXQgPT0gJnJvb3QtPmJ1Y2tldHNbMF0gKyBrR2VuZXJpY051bUJ1Y2tldHMpOworCisgIC8vIFRoZW4gc2V0IHVwIHRoZSBmYXN0IHNpemUgLT4gYnVja2V0IGxvb2t1cCB0YWJsZS4KKyAgYnVja2V0ID0gJnJvb3QtPmJ1Y2tldHNbMF07CisgIFBhcnRpdGlvbkJ1Y2tldCoqIGJ1Y2tldFB0ciA9ICZyb290LT5idWNrZXRfbG9va3Vwc1swXTsKKyAgZm9yIChvcmRlciA9IDA7IG9yZGVyIDw9IGtCaXRzUGVyU2l6ZVQ7ICsrb3JkZXIpIHsKKyAgICBmb3IgKGogPSAwOyBqIDwga0dlbmVyaWNOdW1CdWNrZXRzUGVyT3JkZXI7ICsraikgeworICAgICAgaWYgKG9yZGVyIDwga0dlbmVyaWNNaW5CdWNrZXRlZE9yZGVyKSB7CisgICAgICAgIC8vIFVzZSB0aGUgYnVja2V0IG9mIHRoZSBmaW5lc3QgZ3JhbnVsYXJpdHkgZm9yIG1hbGxvYygwKSBldGMuCisgICAgICAgICpidWNrZXRQdHIrKyA9ICZyb290LT5idWNrZXRzWzBdOworICAgICAgfSBlbHNlIGlmIChvcmRlciA+IGtHZW5lcmljTWF4QnVja2V0ZWRPcmRlcikgeworICAgICAgICAqYnVja2V0UHRyKysgPSAmUGFydGl0aW9uUm9vdEdlbmVyaWM6OmdQYWdlZEJ1Y2tldDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFBhcnRpdGlvbkJ1Y2tldCogdmFsaWRCdWNrZXQgPSBidWNrZXQ7CisgICAgICAgIC8vIFNraXAgb3ZlciBpbnZhbGlkIGJ1Y2tldHMuCisgICAgICAgIHdoaWxlICh2YWxpZEJ1Y2tldC0+c2xvdF9zaXplICUga0dlbmVyaWNTbWFsbGVzdEJ1Y2tldCkKKyAgICAgICAgICB2YWxpZEJ1Y2tldCsrOworICAgICAgICAqYnVja2V0UHRyKysgPSB2YWxpZEJ1Y2tldDsKKyAgICAgICAgYnVja2V0Kys7CisgICAgICB9CisgICAgfQorICB9CisgIERDSEVDSyhidWNrZXQgPT0gJnJvb3QtPmJ1Y2tldHNbMF0gKyBrR2VuZXJpY051bUJ1Y2tldHMpOworICBEQ0hFQ0soYnVja2V0UHRyID09CisgICAgICAgICAmcm9vdC0+YnVja2V0X2xvb2t1cHNbMF0gKworICAgICAgICAgICAgICgoa0JpdHNQZXJTaXplVCArIDEpICoga0dlbmVyaWNOdW1CdWNrZXRzUGVyT3JkZXIpKTsKKyAgLy8gQW5kIHRoZXJlJ3Mgb25lIGxhc3QgYnVja2V0IGxvb2t1cCB0aGF0IHdpbGwgYmUgaGl0IGZvciBlLmcuIG1hbGxvYygtMSksCisgIC8vIHdoaWNoIHRyaWVzIHRvIG92ZXJmbG93IHRvIGEgbm9uLWV4aXN0YW50IG9yZGVyLgorICAqYnVja2V0UHRyID0gJlBhcnRpdGlvblJvb3RHZW5lcmljOjpnUGFnZWRCdWNrZXQ7Cit9CisKKyNpZiAhZGVmaW5lZChBUkNIX0NQVV82NF9CSVRTKQorc3RhdGljIE5PSU5MSU5FIHZvaWQgUGFydGl0aW9uT3V0T2ZNZW1vcnlXaXRoTG90c09mVW5jb21taXRlZFBhZ2VzKCkgeworICBPT01fQ1JBU0goKTsKK30KKyNlbmRpZgorCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBQYXJ0aXRpb25PdXRPZk1lbW9yeShjb25zdCBQYXJ0aXRpb25Sb290QmFzZSogcm9vdCkgeworI2lmICFkZWZpbmVkKEFSQ0hfQ1BVXzY0X0JJVFMpCisgIC8vIENoZWNrIHdoZXRoZXIgdGhpcyBPT00gaXMgZHVlIHRvIGEgbG90IG9mIHN1cGVyIHBhZ2VzIHRoYXQgYXJlIGFsbG9jYXRlZAorICAvLyBidXQgbm90IGNvbW1pdHRlZCwgcHJvYmFibHkgZHVlIHRvIGh0dHA6Ly9jcmJ1Zy5jb20vNDIxMzg3LgorICBpZiAocm9vdC0+dG90YWxfc2l6ZV9vZl9zdXBlcl9wYWdlcyArCisgICAgICAgICAgcm9vdC0+dG90YWxfc2l6ZV9vZl9kaXJlY3RfbWFwcGVkX3BhZ2VzIC0KKyAgICAgICAgICByb290LT50b3RhbF9zaXplX29mX2NvbW1pdHRlZF9wYWdlcyA+CisgICAgICBrUmVhc29uYWJsZVNpemVPZlVudXNlZFBhZ2VzKSB7CisgICAgUGFydGl0aW9uT3V0T2ZNZW1vcnlXaXRoTG90c09mVW5jb21taXRlZFBhZ2VzKCk7CisgIH0KKyNlbmRpZgorICBpZiAoUGFydGl0aW9uUm9vdEJhc2U6OmdPb21IYW5kbGluZ0Z1bmN0aW9uKQorICAgICgqUGFydGl0aW9uUm9vdEJhc2U6OmdPb21IYW5kbGluZ0Z1bmN0aW9uKSgpOworICBPT01fQ1JBU0goKTsKK30KKworc3RhdGljIE5PSU5MSU5FIHZvaWQgUGFydGl0aW9uRXhjZXNzaXZlQWxsb2NhdGlvblNpemUoKSB7CisgIE9PTV9DUkFTSCgpOworfQorCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBQYXJ0aXRpb25CdWNrZXRGdWxsKCkgeworICBPT01fQ1JBU0goKTsKK30KKworLy8gcGFydGl0aW9uUGFnZVN0YXRlSXMqCisvLyBOb3RlIHRoYXQgaXQncyBvbmx5IHZhbGlkIHRvIGNhbGwgdGhlc2UgZnVuY3Rpb25zIG9uIHBhZ2VzIGZvdW5kIG9uIG9uZSBvZgorLy8gdGhlIHBhZ2UgbGlzdHMuIFNwZWNpZmljYWxseSwgeW91IGNhbid0IGNhbGwgdGhlc2UgZnVuY3Rpb25zIG9uIGZ1bGwgcGFnZXMKKy8vIHRoYXQgd2VyZSBkZXRhY2hlZCBmcm9tIHRoZSBhY3RpdmUgbGlzdC4KK3N0YXRpYyBib29sIEFMV0FZU19JTkxJTkUKK1BhcnRpdGlvblBhZ2VTdGF0ZUlzQWN0aXZlKGNvbnN0IFBhcnRpdGlvblBhZ2UqIHBhZ2UpIHsKKyAgRENIRUNLKHBhZ2UgIT0gJlBhcnRpdGlvblJvb3RHZW5lcmljOjpnU2VlZFBhZ2UpOworICBEQ0hFQ0soIXBhZ2UtPnBhZ2Vfb2Zmc2V0KTsKKyAgcmV0dXJuIChwYWdlLT5udW1fYWxsb2NhdGVkX3Nsb3RzID4gMCAmJgorICAgICAgICAgIChwYWdlLT5mcmVlbGlzdF9oZWFkIHx8IHBhZ2UtPm51bV91bnByb3Zpc2lvbmVkX3Nsb3RzKSk7Cit9CisKK3N0YXRpYyBib29sIEFMV0FZU19JTkxJTkUgUGFydGl0aW9uUGFnZVN0YXRlSXNGdWxsKGNvbnN0IFBhcnRpdGlvblBhZ2UqIHBhZ2UpIHsKKyAgRENIRUNLKHBhZ2UgIT0gJlBhcnRpdGlvblJvb3RHZW5lcmljOjpnU2VlZFBhZ2UpOworICBEQ0hFQ0soIXBhZ2UtPnBhZ2Vfb2Zmc2V0KTsKKyAgYm9vbCByZXQgPSAocGFnZS0+bnVtX2FsbG9jYXRlZF9zbG90cyA9PSBQYXJ0aXRpb25CdWNrZXRTbG90cyhwYWdlLT5idWNrZXQpKTsKKyAgaWYgKHJldCkgeworICAgIERDSEVDSyghcGFnZS0+ZnJlZWxpc3RfaGVhZCk7CisgICAgRENIRUNLKCFwYWdlLT5udW1fdW5wcm92aXNpb25lZF9zbG90cyk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGJvb2wgQUxXQVlTX0lOTElORSBQYXJ0aXRpb25QYWdlU3RhdGVJc0VtcHR5KGNvbnN0IFBhcnRpdGlvblBhZ2UqIHBhZ2UpIHsKKyAgRENIRUNLKHBhZ2UgIT0gJlBhcnRpdGlvblJvb3RHZW5lcmljOjpnU2VlZFBhZ2UpOworICBEQ0hFQ0soIXBhZ2UtPnBhZ2Vfb2Zmc2V0KTsKKyAgcmV0dXJuICghcGFnZS0+bnVtX2FsbG9jYXRlZF9zbG90cyAmJiBwYWdlLT5mcmVlbGlzdF9oZWFkKTsKK30KKworc3RhdGljIGJvb2wgQUxXQVlTX0lOTElORQorUGFydGl0aW9uUGFnZVN0YXRlSXNEZWNvbW1pdHRlZChjb25zdCBQYXJ0aXRpb25QYWdlKiBwYWdlKSB7CisgIERDSEVDSyhwYWdlICE9ICZQYXJ0aXRpb25Sb290R2VuZXJpYzo6Z1NlZWRQYWdlKTsKKyAgRENIRUNLKCFwYWdlLT5wYWdlX29mZnNldCk7CisgIGJvb2wgcmV0ID0gKCFwYWdlLT5udW1fYWxsb2NhdGVkX3Nsb3RzICYmICFwYWdlLT5mcmVlbGlzdF9oZWFkKTsKKyAgaWYgKHJldCkgeworICAgIERDSEVDSyghcGFnZS0+bnVtX3VucHJvdmlzaW9uZWRfc2xvdHMpOworICAgIERDSEVDSyhwYWdlLT5lbXB0eV9jYWNoZV9pbmRleCA9PSAtMSk7CisgIH0KKyAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgUGFydGl0aW9uSW5jcmVhc2VDb21taXR0ZWRQYWdlcyhQYXJ0aXRpb25Sb290QmFzZSogcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbikgeworICByb290LT50b3RhbF9zaXplX29mX2NvbW1pdHRlZF9wYWdlcyArPSBsZW47CisgIERDSEVDSyhyb290LT50b3RhbF9zaXplX29mX2NvbW1pdHRlZF9wYWdlcyA8PQorICAgICAgICAgcm9vdC0+dG90YWxfc2l6ZV9vZl9zdXBlcl9wYWdlcyArCisgICAgICAgICAgICAgcm9vdC0+dG90YWxfc2l6ZV9vZl9kaXJlY3RfbWFwcGVkX3BhZ2VzKTsKK30KKworc3RhdGljIHZvaWQgUGFydGl0aW9uRGVjcmVhc2VDb21taXR0ZWRQYWdlcyhQYXJ0aXRpb25Sb290QmFzZSogcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbikgeworICByb290LT50b3RhbF9zaXplX29mX2NvbW1pdHRlZF9wYWdlcyAtPSBsZW47CisgIERDSEVDSyhyb290LT50b3RhbF9zaXplX29mX2NvbW1pdHRlZF9wYWdlcyA8PQorICAgICAgICAgcm9vdC0+dG90YWxfc2l6ZV9vZl9zdXBlcl9wYWdlcyArCisgICAgICAgICAgICAgcm9vdC0+dG90YWxfc2l6ZV9vZl9kaXJlY3RfbWFwcGVkX3BhZ2VzKTsKK30KKworc3RhdGljIEFMV0FZU19JTkxJTkUgdm9pZCBQYXJ0aXRpb25EZWNvbW1pdFN5c3RlbVBhZ2VzKFBhcnRpdGlvblJvb3RCYXNlKiByb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkgeworICBEZWNvbW1pdFN5c3RlbVBhZ2VzKGFkZHJlc3MsIGxlbmd0aCk7CisgIFBhcnRpdGlvbkRlY3JlYXNlQ29tbWl0dGVkUGFnZXMocm9vdCwgbGVuZ3RoKTsKK30KKworc3RhdGljIEFMV0FZU19JTkxJTkUgdm9pZCBQYXJ0aXRpb25SZWNvbW1pdFN5c3RlbVBhZ2VzKFBhcnRpdGlvblJvb3RCYXNlKiByb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkgeworICBSZWNvbW1pdFN5c3RlbVBhZ2VzKGFkZHJlc3MsIGxlbmd0aCk7CisgIFBhcnRpdGlvbkluY3JlYXNlQ29tbWl0dGVkUGFnZXMocm9vdCwgbGVuZ3RoKTsKK30KKworc3RhdGljIEFMV0FZU19JTkxJTkUgdm9pZCogUGFydGl0aW9uQWxsb2NQYXJ0aXRpb25QYWdlcygKKyAgICBQYXJ0aXRpb25Sb290QmFzZSogcm9vdCwKKyAgICBpbnQgZmxhZ3MsCisgICAgdWludDE2X3QgbnVtX3BhcnRpdGlvbl9wYWdlcykgeworICBEQ0hFQ0soIShyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ocm9vdC0+bmV4dF9wYXJ0aXRpb25fcGFnZSkgJQorICAgICAgICAgICBrUGFydGl0aW9uUGFnZVNpemUpKTsKKyAgRENIRUNLKCEocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHJvb3QtPm5leHRfcGFydGl0aW9uX3BhZ2VfZW5kKSAlCisgICAgICAgICAgIGtQYXJ0aXRpb25QYWdlU2l6ZSkpOworICBEQ0hFQ0sobnVtX3BhcnRpdGlvbl9wYWdlcyA8PSBrTnVtUGFydGl0aW9uUGFnZXNQZXJTdXBlclBhZ2UpOworICBzaXplX3QgdG90YWxfc2l6ZSA9IGtQYXJ0aXRpb25QYWdlU2l6ZSAqIG51bV9wYXJ0aXRpb25fcGFnZXM7CisgIHNpemVfdCBudW1fcGFydGl0aW9uX3BhZ2VzX2xlZnQgPQorICAgICAgKHJvb3QtPm5leHRfcGFydGl0aW9uX3BhZ2VfZW5kIC0gcm9vdC0+bmV4dF9wYXJ0aXRpb25fcGFnZSkgPj4KKyAgICAgIGtQYXJ0aXRpb25QYWdlU2hpZnQ7CisgIGlmIChMSUtFTFkobnVtX3BhcnRpdGlvbl9wYWdlc19sZWZ0ID49IG51bV9wYXJ0aXRpb25fcGFnZXMpKSB7CisgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBjYW4gc3RpbGwgaGFuZCBvdXQgcGFnZXMgZnJvbSB0aGUgY3VycmVudCBzdXBlciBwYWdlCisgICAgLy8gYWxsb2NhdGlvbi4KKyAgICBjaGFyKiByZXQgPSByb290LT5uZXh0X3BhcnRpdGlvbl9wYWdlOworICAgIHJvb3QtPm5leHRfcGFydGl0aW9uX3BhZ2UgKz0gdG90YWxfc2l6ZTsKKyAgICBQYXJ0aXRpb25JbmNyZWFzZUNvbW1pdHRlZFBhZ2VzKHJvb3QsIHRvdGFsX3NpemUpOworICAgIHJldHVybiByZXQ7CisgIH0KKworICAvLyBOZWVkIGEgbmV3IHN1cGVyIHBhZ2UuIFdlIHdhbnQgdG8gYWxsb2NhdGUgc3VwZXIgcGFnZXMgaW4gYSBjb250aW5ndW91cworICAvLyBhZGRyZXNzIHJlZ2lvbiBhcyBtdWNoIGFzIHBvc3NpYmxlLiBUaGlzIGlzIGltcG9ydGFudCBmb3Igbm90IGNhdXNpbmcKKyAgLy8gcGFnZSB0YWJsZSBibG9hdCBhbmQgbm90IGZyYWdtZW50aW5nIGFkZHJlc3Mgc3BhY2VzIGluIDMyIGJpdAorICAvLyBhcmNoaXRlY3R1cmVzLgorICBjaGFyKiByZXF1ZXN0ZWRBZGRyZXNzID0gcm9vdC0+bmV4dF9zdXBlcl9wYWdlOworICBjaGFyKiBzdXBlcl9wYWdlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oQWxsb2NQYWdlcygKKyAgICAgIHJlcXVlc3RlZEFkZHJlc3MsIGtTdXBlclBhZ2VTaXplLCBrU3VwZXJQYWdlU2l6ZSwgUGFnZUFjY2Vzc2libGUpKTsKKyAgaWYgKFVOTElLRUxZKCFzdXBlcl9wYWdlKSkKKyAgICByZXR1cm4gMDsKKworICByb290LT50b3RhbF9zaXplX29mX3N1cGVyX3BhZ2VzICs9IGtTdXBlclBhZ2VTaXplOworICBQYXJ0aXRpb25JbmNyZWFzZUNvbW1pdHRlZFBhZ2VzKHJvb3QsIHRvdGFsX3NpemUpOworCisgIHJvb3QtPm5leHRfc3VwZXJfcGFnZSA9IHN1cGVyX3BhZ2UgKyBrU3VwZXJQYWdlU2l6ZTsKKyAgY2hhciogcmV0ID0gc3VwZXJfcGFnZSArIGtQYXJ0aXRpb25QYWdlU2l6ZTsKKyAgcm9vdC0+bmV4dF9wYXJ0aXRpb25fcGFnZSA9IHJldCArIHRvdGFsX3NpemU7CisgIHJvb3QtPm5leHRfcGFydGl0aW9uX3BhZ2VfZW5kID0gcm9vdC0+bmV4dF9zdXBlcl9wYWdlIC0ga1BhcnRpdGlvblBhZ2VTaXplOworICAvLyBNYWtlIHRoZSBmaXJzdCBwYXJ0aXRpb24gcGFnZSBpbiB0aGUgc3VwZXIgcGFnZSBhIGd1YXJkIHBhZ2UsIGJ1dCBsZWF2ZSBhCisgIC8vIGhvbGUgaW4gdGhlIG1pZGRsZS4KKyAgLy8gVGhpcyBpcyB3aGVyZSB3ZSBwdXQgcGFnZSBtZXRhZGF0YSBhbmQgYWxzbyBhIHRpbnkgYW1vdW50IG9mIGV4dGVudAorICAvLyBtZXRhZGF0YS4KKyAgU2V0U3lzdGVtUGFnZXNJbmFjY2Vzc2libGUoc3VwZXJfcGFnZSwga1N5c3RlbVBhZ2VTaXplKTsKKyAgU2V0U3lzdGVtUGFnZXNJbmFjY2Vzc2libGUoc3VwZXJfcGFnZSArIChrU3lzdGVtUGFnZVNpemUgKiAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1BhcnRpdGlvblBhZ2VTaXplIC0gKGtTeXN0ZW1QYWdlU2l6ZSAqIDIpKTsKKyAgLy8gQWxzbyBtYWtlIHRoZSBsYXN0IHBhcnRpdGlvbiBwYWdlIGEgZ3VhcmQgcGFnZS4KKyAgU2V0U3lzdGVtUGFnZXNJbmFjY2Vzc2libGUoc3VwZXJfcGFnZSArIChrU3VwZXJQYWdlU2l6ZSAtIGtQYXJ0aXRpb25QYWdlU2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtQYXJ0aXRpb25QYWdlU2l6ZSk7CisKKyAgLy8gSWYgd2Ugd2VyZSBhZnRlciBhIHNwZWNpZmljIGFkZHJlc3MsIGJ1dCBkaWRuJ3QgZ2V0IGl0LCBhc3N1bWUgdGhhdAorICAvLyB0aGUgc3lzdGVtIGNob3NlIGEgbG91c3kgYWRkcmVzcy4gSGVyZSBtb3N0IE9TJ2VzIGhhdmUgYSBkZWZhdWx0CisgIC8vIGFsZ29yaXRobSB0aGF0IGlzbid0IHJhbmRvbWl6ZWQuIEZvciBleGFtcGxlLCBtb3N0IExpbnV4CisgIC8vIGRpc3RyaWJ1dGlvbnMgd2lsbCBhbGxvY2F0ZSB0aGUgbWFwcGluZyBkaXJlY3RseSBiZWZvcmUgdGhlIGxhc3QKKyAgLy8gc3VjY2Vzc2Z1bCBtYXBwaW5nLCB3aGljaCBpcyBmYXIgZnJvbSByYW5kb20uIFNvIHdlIGp1c3QgZ2V0IGZyZXNoCisgIC8vIHJhbmRvbW5lc3MgZm9yIHRoZSBuZXh0IG1hcHBpbmcgYXR0ZW1wdC4KKyAgaWYgKHJlcXVlc3RlZEFkZHJlc3MgJiYgcmVxdWVzdGVkQWRkcmVzcyAhPSBzdXBlcl9wYWdlKQorICAgIHJvb3QtPm5leHRfc3VwZXJfcGFnZSA9IDA7CisKKyAgLy8gV2UgYWxsb2NhdGVkIGEgbmV3IHN1cGVyIHBhZ2Ugc28gdXBkYXRlIHN1cGVyIHBhZ2UgbWV0YWRhdGEuCisgIC8vIEZpcnN0IGNoZWNrIGlmIHRoaXMgaXMgYSBuZXcgZXh0ZW50IG9yIG5vdC4KKyAgUGFydGl0aW9uU3VwZXJQYWdlRXh0ZW50RW50cnkqIGxhdGVzdF9leHRlbnQgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxQYXJ0aXRpb25TdXBlclBhZ2VFeHRlbnRFbnRyeSo+KAorICAgICAgICAgIFBhcnRpdGlvblN1cGVyUGFnZVRvTWV0YWRhdGFBcmVhKHN1cGVyX3BhZ2UpKTsKKyAgLy8gQnkgc3RvcmluZyB0aGUgcm9vdCBpbiBldmVyeSBleHRlbnQgbWV0YWRhdGEgb2JqZWN0LCB3ZSBoYXZlIGEgZmFzdCB3YXkKKyAgLy8gdG8gZ28gZnJvbSBhIHBvaW50ZXIgd2l0aGluIHRoZSBwYXJ0aXRpb24gdG8gdGhlIHJvb3Qgb2JqZWN0LgorICBsYXRlc3RfZXh0ZW50LT5yb290ID0gcm9vdDsKKyAgLy8gTW9zdCBuZXcgZXh0ZW50cyB3aWxsIGJlIHBhcnQgb2YgYSBsYXJnZXIgZXh0ZW50LCBhbmQgdGhlc2UgdGhyZWUgZmllbGRzCisgIC8vIGFyZSB1bnVzZWQsIGJ1dCB3ZSBpbml0aWFsaXplIHRoZW0gdG8gMCBzbyB0aGF0IHdlIGdldCBhIGNsZWFyIHNpZ25hbAorICAvLyBpbiBjYXNlIHRoZXkgYXJlIGFjY2lkZW50YWxseSB1c2VkLgorICBsYXRlc3RfZXh0ZW50LT5zdXBlcl9wYWdlX2Jhc2UgPSAwOworICBsYXRlc3RfZXh0ZW50LT5zdXBlcl9wYWdlc19lbmQgPSAwOworICBsYXRlc3RfZXh0ZW50LT5uZXh0ID0gMDsKKworICBQYXJ0aXRpb25TdXBlclBhZ2VFeHRlbnRFbnRyeSogY3VycmVudF9leHRlbnQgPSByb290LT5jdXJyZW50X2V4dGVudDsKKyAgYm9vbCBpc05ld0V4dGVudCA9IChzdXBlcl9wYWdlICE9IHJlcXVlc3RlZEFkZHJlc3MpOworICBpZiAoVU5MSUtFTFkoaXNOZXdFeHRlbnQpKSB7CisgICAgaWYgKFVOTElLRUxZKCFjdXJyZW50X2V4dGVudCkpIHsKKyAgICAgIERDSEVDSyghcm9vdC0+Zmlyc3RfZXh0ZW50KTsKKyAgICAgIHJvb3QtPmZpcnN0X2V4dGVudCA9IGxhdGVzdF9leHRlbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgIERDSEVDSyhjdXJyZW50X2V4dGVudC0+c3VwZXJfcGFnZV9iYXNlKTsKKyAgICAgIGN1cnJlbnRfZXh0ZW50LT5uZXh0ID0gbGF0ZXN0X2V4dGVudDsKKyAgICB9CisgICAgcm9vdC0+Y3VycmVudF9leHRlbnQgPSBsYXRlc3RfZXh0ZW50OworICAgIGxhdGVzdF9leHRlbnQtPnN1cGVyX3BhZ2VfYmFzZSA9IHN1cGVyX3BhZ2U7CisgICAgbGF0ZXN0X2V4dGVudC0+c3VwZXJfcGFnZXNfZW5kID0gc3VwZXJfcGFnZSArIGtTdXBlclBhZ2VTaXplOworICB9IGVsc2UgeworICAgIC8vIFdlIGFsbG9jYXRlZCBuZXh0IHRvIGFuIGV4aXN0aW5nIGV4dGVudCBzbyBqdXN0IG51ZGdlIHRoZSBzaXplIHVwIGEKKyAgICAvLyBsaXR0bGUuCisgICAgRENIRUNLKGN1cnJlbnRfZXh0ZW50LT5zdXBlcl9wYWdlc19lbmQpOworICAgIGN1cnJlbnRfZXh0ZW50LT5zdXBlcl9wYWdlc19lbmQgKz0ga1N1cGVyUGFnZVNpemU7CisgICAgRENIRUNLKHJldCA+PSBjdXJyZW50X2V4dGVudC0+c3VwZXJfcGFnZV9iYXNlICYmCisgICAgICAgICAgIHJldCA8IGN1cnJlbnRfZXh0ZW50LT5zdXBlcl9wYWdlc19lbmQpOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHVpbnQxNl90CitQYXJ0aXRpb25CdWNrZXRQYXJ0aXRpb25QYWdlcyhjb25zdCBQYXJ0aXRpb25CdWNrZXQqIGJ1Y2tldCkgeworICByZXR1cm4gKGJ1Y2tldC0+bnVtX3N5c3RlbV9wYWdlc19wZXJfc2xvdF9zcGFuICsKKyAgICAgICAgICAoa051bVN5c3RlbVBhZ2VzUGVyUGFydGl0aW9uUGFnZSAtIDEpKSAvCisgICAgICAgICBrTnVtU3lzdGVtUGFnZXNQZXJQYXJ0aXRpb25QYWdlOworfQorCitzdGF0aWMgQUxXQVlTX0lOTElORSB2b2lkIFBhcnRpdGlvblBhZ2VSZXNldChQYXJ0aXRpb25QYWdlKiBwYWdlKSB7CisgIERDSEVDSyhQYXJ0aXRpb25QYWdlU3RhdGVJc0RlY29tbWl0dGVkKHBhZ2UpKTsKKworICBwYWdlLT5udW1fdW5wcm92aXNpb25lZF9zbG90cyA9IFBhcnRpdGlvbkJ1Y2tldFNsb3RzKHBhZ2UtPmJ1Y2tldCk7CisgIERDSEVDSyhwYWdlLT5udW1fdW5wcm92aXNpb25lZF9zbG90cyk7CisKKyAgcGFnZS0+bmV4dF9wYWdlID0gbnVsbHB0cjsKK30KKworc3RhdGljIEFMV0FZU19JTkxJTkUgdm9pZCBQYXJ0aXRpb25QYWdlU2V0dXAoUGFydGl0aW9uUGFnZSogcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvbkJ1Y2tldCogYnVja2V0KSB7CisgIC8vIFRoZSBidWNrZXQgbmV2ZXIgY2hhbmdlcy4gV2Ugc2V0IGl0IHVwIG9uY2UuCisgIHBhZ2UtPmJ1Y2tldCA9IGJ1Y2tldDsKKyAgcGFnZS0+ZW1wdHlfY2FjaGVfaW5kZXggPSAtMTsKKworICBQYXJ0aXRpb25QYWdlUmVzZXQocGFnZSk7CisKKyAgLy8gSWYgdGhpcyBwYWdlIGhhcyBqdXN0IGEgc2luZ2xlIHNsb3QsIGRvIG5vdCBzZXQgdXAgcGFnZSBvZmZzZXRzIGZvciBhbnkKKyAgLy8gcGFnZSBtZXRhZGF0YSBvdGhlciB0aGFuIHRoZSBmaXJzdCBvbmUuIFRoaXMgZW5zdXJlcyB0aGF0IGF0dGVtcHRzIHRvCisgIC8vIHRvdWNoIGludmFsaWQgcGFnZSBtZXRhZGF0YSBmYWlsLgorICBpZiAocGFnZS0+bnVtX3VucHJvdmlzaW9uZWRfc2xvdHMgPT0gMSkKKyAgICByZXR1cm47CisKKyAgdWludDE2X3QgbnVtX3BhcnRpdGlvbl9wYWdlcyA9IFBhcnRpdGlvbkJ1Y2tldFBhcnRpdGlvblBhZ2VzKGJ1Y2tldCk7CisgIGNoYXIqIHBhZ2VfY2hhcl9wdHIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihwYWdlKTsKKyAgZm9yICh1aW50MTZfdCBpID0gMTsgaSA8IG51bV9wYXJ0aXRpb25fcGFnZXM7ICsraSkgeworICAgIHBhZ2VfY2hhcl9wdHIgKz0ga1BhZ2VNZXRhZGF0YVNpemU7CisgICAgUGFydGl0aW9uUGFnZSogc2Vjb25kYXJ5X3BhZ2UgPQorICAgICAgICByZWludGVycHJldF9jYXN0PFBhcnRpdGlvblBhZ2UqPihwYWdlX2NoYXJfcHRyKTsKKyAgICBzZWNvbmRhcnlfcGFnZS0+cGFnZV9vZmZzZXQgPSBpOworICB9Cit9CisKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIGNoYXIqIFBhcnRpdGlvblBhZ2VBbGxvY0FuZEZpbGxGcmVlbGlzdCgKKyAgICBQYXJ0aXRpb25QYWdlKiBwYWdlKSB7CisgIERDSEVDSyhwYWdlICE9ICZQYXJ0aXRpb25Sb290R2VuZXJpYzo6Z1NlZWRQYWdlKTsKKyAgdWludDE2X3QgbnVtX3Nsb3RzID0gcGFnZS0+bnVtX3VucHJvdmlzaW9uZWRfc2xvdHM7CisgIERDSEVDSyhudW1fc2xvdHMpOworICBQYXJ0aXRpb25CdWNrZXQqIGJ1Y2tldCA9IHBhZ2UtPmJ1Y2tldDsKKyAgLy8gV2Ugc2hvdWxkIG9ubHkgZ2V0IGhlcmUgd2hlbiBfZXZlcnlfIHNsb3QgaXMgZWl0aGVyIHVzZWQgb3IgdW5wcm92aXNpb25lZC4KKyAgLy8gKFRoZSB0aGlyZCBzdGF0ZSBpcyAib24gdGhlIGZyZWVsaXN0Ii4gSWYgd2UgaGF2ZSBhIG5vbi1lbXB0eSBmcmVlbGlzdCwgd2UKKyAgLy8gc2hvdWxkIG5vdCBnZXQgaGVyZS4pCisgIERDSEVDSyhudW1fc2xvdHMgKyBwYWdlLT5udW1fYWxsb2NhdGVkX3Nsb3RzID09IFBhcnRpdGlvbkJ1Y2tldFNsb3RzKGJ1Y2tldCkpOworICAvLyBTaW1pbGFybHksIG1ha2UgZXhwbGljaXRseSBzdXJlIHRoYXQgdGhlIGZyZWVsaXN0IGlzIGVtcHR5LgorICBEQ0hFQ0soIXBhZ2UtPmZyZWVsaXN0X2hlYWQpOworICBEQ0hFQ0socGFnZS0+bnVtX2FsbG9jYXRlZF9zbG90cyA+PSAwKTsKKworICBzaXplX3Qgc2l6ZSA9IGJ1Y2tldC0+c2xvdF9zaXplOworICBjaGFyKiBiYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oUGFydGl0aW9uUGFnZVRvUG9pbnRlcihwYWdlKSk7CisgIGNoYXIqIHJldHVybl9vYmplY3QgPSBiYXNlICsgKHNpemUgKiBwYWdlLT5udW1fYWxsb2NhdGVkX3Nsb3RzKTsKKyAgY2hhciogZmlyc3RGcmVlbGlzdFBvaW50ZXIgPSByZXR1cm5fb2JqZWN0ICsgc2l6ZTsKKyAgY2hhciogZmlyc3RGcmVlbGlzdFBvaW50ZXJFeHRlbnQgPQorICAgICAgZmlyc3RGcmVlbGlzdFBvaW50ZXIgKyBzaXplb2YoUGFydGl0aW9uRnJlZWxpc3RFbnRyeSopOworICAvLyBPdXIgZ29hbCBpcyB0byBmYXVsdCBhcyBmZXcgc3lzdGVtIHBhZ2VzIGFzIHBvc3NpYmxlLiBXZSBjYWxjdWxhdGUgdGhlCisgIC8vIHBhZ2UgY29udGFpbmluZyB0aGUgImVuZCIgb2YgdGhlIHJldHVybmVkIHNsb3QsIGFuZCB0aGVuIGFsbG93IGZyZWVsaXN0CisgIC8vIHBvaW50ZXJzIHRvIGJlIHdyaXR0ZW4gdXAgdG8gdGhlIGVuZCBvZiB0aGF0IHBhZ2UuCisgIGNoYXIqIHN1Yl9wYWdlX2xpbWl0ID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oCisgICAgICBSb3VuZFVwVG9TeXN0ZW1QYWdlKHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90PihmaXJzdEZyZWVsaXN0UG9pbnRlcikpKTsKKyAgY2hhciogc2xvdHNfbGltaXQgPSByZXR1cm5fb2JqZWN0ICsgKHNpemUgKiBudW1fc2xvdHMpOworICBjaGFyKiBmcmVlbGlzdF9saW1pdCA9IHN1Yl9wYWdlX2xpbWl0OworICBpZiAoVU5MSUtFTFkoc2xvdHNfbGltaXQgPCBmcmVlbGlzdF9saW1pdCkpCisgICAgZnJlZWxpc3RfbGltaXQgPSBzbG90c19saW1pdDsKKworICB1aW50MTZfdCBudW1fbmV3X2ZyZWVsaXN0X2VudHJpZXMgPSAwOworICBpZiAoTElLRUxZKGZpcnN0RnJlZWxpc3RQb2ludGVyRXh0ZW50IDw9IGZyZWVsaXN0X2xpbWl0KSkgeworICAgIC8vIE9ubHkgY29uc2lkZXIgdXNlZCBzcGFjZSBpbiB0aGUgc2xvdCBzcGFuLiBJZiB3ZSBjb25zaWRlciB3YXN0ZWQKKyAgICAvLyBzcGFjZSwgd2UgbWF5IGdldCBhbiBvZmYtYnktb25lIHdoZW4gYSBmcmVlbGlzdCBwb2ludGVyIGZpdHMgaW4gdGhlCisgICAgLy8gd2FzdGVkIHNwYWNlLCBidXQgYSBzbG90IGRvZXMgbm90LgorICAgIC8vIFdlIGtub3cgd2UgY2FuIGZpdCBhdCBsZWFzdCBvbmUgZnJlZWxpc3QgcG9pbnRlci4KKyAgICBudW1fbmV3X2ZyZWVsaXN0X2VudHJpZXMgPSAxOworICAgIC8vIEFueSBmdXJ0aGVyIGVudHJpZXMgcmVxdWlyZSBzcGFjZSBmb3IgdGhlIHdob2xlIHNsb3Qgc3Bhbi4KKyAgICBudW1fbmV3X2ZyZWVsaXN0X2VudHJpZXMgKz0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KAorICAgICAgICAoZnJlZWxpc3RfbGltaXQgLSBmaXJzdEZyZWVsaXN0UG9pbnRlckV4dGVudCkgLyBzaXplKTsKKyAgfQorCisgIC8vIFdlIGFsd2F5cyByZXR1cm4gYW4gb2JqZWN0IHNsb3QgLS0gdGhhdCdzIHRoZSArMSBiZWxvdy4KKyAgLy8gV2UgZG8gbm90IG5lY2Nlc3NhcmlseSBjcmVhdGUgYW55IG5ldyBmcmVlbGlzdCBlbnRyaWVzLCBiZWNhdXNlIHdlIGNyb3NzCisgIC8vIHN1YiBwYWdlIGJvdW5kYXJpZXMgZnJlcXVlbnRseSBmb3IgbGFyZ2UgYnVja2V0IHNpemVzLgorICBEQ0hFQ0sobnVtX25ld19mcmVlbGlzdF9lbnRyaWVzICsgMSA8PSBudW1fc2xvdHMpOworICBudW1fc2xvdHMgLT0gKG51bV9uZXdfZnJlZWxpc3RfZW50cmllcyArIDEpOworICBwYWdlLT5udW1fdW5wcm92aXNpb25lZF9zbG90cyA9IG51bV9zbG90czsKKyAgcGFnZS0+bnVtX2FsbG9jYXRlZF9zbG90cysrOworCisgIGlmIChMSUtFTFkobnVtX25ld19mcmVlbGlzdF9lbnRyaWVzKSkgeworICAgIGNoYXIqIGZyZWVsaXN0X3BvaW50ZXIgPSBmaXJzdEZyZWVsaXN0UG9pbnRlcjsKKyAgICBQYXJ0aXRpb25GcmVlbGlzdEVudHJ5KiBlbnRyeSA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UGFydGl0aW9uRnJlZWxpc3RFbnRyeSo+KGZyZWVsaXN0X3BvaW50ZXIpOworICAgIHBhZ2UtPmZyZWVsaXN0X2hlYWQgPSBlbnRyeTsKKyAgICB3aGlsZSAoLS1udW1fbmV3X2ZyZWVsaXN0X2VudHJpZXMpIHsKKyAgICAgIGZyZWVsaXN0X3BvaW50ZXIgKz0gc2l6ZTsKKyAgICAgIFBhcnRpdGlvbkZyZWVsaXN0RW50cnkqIG5leHRfZW50cnkgPQorICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UGFydGl0aW9uRnJlZWxpc3RFbnRyeSo+KGZyZWVsaXN0X3BvaW50ZXIpOworICAgICAgZW50cnktPm5leHQgPSBQYXJ0aXRpb25GcmVlbGlzdE1hc2sobmV4dF9lbnRyeSk7CisgICAgICBlbnRyeSA9IG5leHRfZW50cnk7CisgICAgfQorICAgIGVudHJ5LT5uZXh0ID0gUGFydGl0aW9uRnJlZWxpc3RNYXNrKDApOworICB9IGVsc2UgeworICAgIHBhZ2UtPmZyZWVsaXN0X2hlYWQgPSAwOworICB9CisgIHJldHVybiByZXR1cm5fb2JqZWN0OworfQorCisvLyBUaGlzIGhlbHBlciBmdW5jdGlvbiBzY2FucyBhIGJ1Y2tldCdzIGFjdGl2ZSBwYWdlIGxpc3QgZm9yIGEgc3VpdGFibGUgbmV3CisvLyBhY3RpdmUgcGFnZS4KKy8vIFdoZW4gaXQgZmluZHMgYSBzdWl0YWJsZSBuZXcgYWN0aXZlIHBhZ2UgKG9uZSB0aGF0IGhhcyBmcmVlIHNsb3RzIGFuZCBpcyBub3QKKy8vIGVtcHR5KSwgaXQgaXMgc2V0IGFzIHRoZSBuZXcgYWN0aXZlIHBhZ2UuIElmIHRoZXJlIGlzIG5vIHN1aXRhYmxlIG5ldworLy8gYWN0aXZlIHBhZ2UsIHRoZSBjdXJyZW50IGFjdGl2ZSBwYWdlIGlzIHNldCB0byB0aGUgc2VlZCBwYWdlLgorLy8gQXMgcG90ZW50aWFsIHBhZ2VzIGFyZSBzY2FubmVkLCB0aGV5IGFyZSB0aWRpZWQgdXAgYWNjb3JkaW5nIHRvIHRoZWlyIHN0YXRlLgorLy8gRW1wdHkgcGFnZXMgYXJlIHN3ZXB0IG9uIHRvIHRoZSBlbXB0eSBwYWdlIGxpc3QsIGRlY29tbWl0dGVkIHBhZ2VzIG9uIHRvIHRoZQorLy8gZGVjb21taXR0ZWQgcGFnZSBsaXN0IGFuZCBmdWxsIHBhZ2VzIGFyZSB1bmxpbmtlZCBmcm9tIGFueSBsaXN0Lgorc3RhdGljIGJvb2wgUGFydGl0aW9uU2V0TmV3QWN0aXZlUGFnZShQYXJ0aXRpb25CdWNrZXQqIGJ1Y2tldCkgeworICBQYXJ0aXRpb25QYWdlKiBwYWdlID0gYnVja2V0LT5hY3RpdmVfcGFnZXNfaGVhZDsKKyAgaWYgKHBhZ2UgPT0gJlBhcnRpdGlvblJvb3RCYXNlOjpnU2VlZFBhZ2UpCisgICAgcmV0dXJuIGZhbHNlOworCisgIFBhcnRpdGlvblBhZ2UqIG5leHRfcGFnZTsKKworICBmb3IgKDsgcGFnZTsgcGFnZSA9IG5leHRfcGFnZSkgeworICAgIG5leHRfcGFnZSA9IHBhZ2UtPm5leHRfcGFnZTsKKyAgICBEQ0hFQ0socGFnZS0+YnVja2V0ID09IGJ1Y2tldCk7CisgICAgRENIRUNLKHBhZ2UgIT0gYnVja2V0LT5lbXB0eV9wYWdlc19oZWFkKTsKKyAgICBEQ0hFQ0socGFnZSAhPSBidWNrZXQtPmRlY29tbWl0dGVkX3BhZ2VzX2hlYWQpOworCisgICAgLy8gRGVhbCB3aXRoIGVtcHR5IGFuZCBkZWNvbW1pdHRlZCBwYWdlcy4KKyAgICBpZiAoTElLRUxZKFBhcnRpdGlvblBhZ2VTdGF0ZUlzQWN0aXZlKHBhZ2UpKSkgeworICAgICAgLy8gVGhpcyBwYWdlIGlzIHVzYWJsZSBiZWNhdXNlIGl0IGhhcyBmcmVlbGlzdCBlbnRyaWVzLCBvciBoYXMKKyAgICAgIC8vIHVucHJvdmlzaW9uZWQgc2xvdHMgd2UgY2FuIGNyZWF0ZSBmcmVlbGlzdCBlbnRyaWVzIGZyb20uCisgICAgICBidWNrZXQtPmFjdGl2ZV9wYWdlc19oZWFkID0gcGFnZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoTElLRUxZKFBhcnRpdGlvblBhZ2VTdGF0ZUlzRW1wdHkocGFnZSkpKSB7CisgICAgICBwYWdlLT5uZXh0X3BhZ2UgPSBidWNrZXQtPmVtcHR5X3BhZ2VzX2hlYWQ7CisgICAgICBidWNrZXQtPmVtcHR5X3BhZ2VzX2hlYWQgPSBwYWdlOworICAgIH0gZWxzZSBpZiAoTElLRUxZKFBhcnRpdGlvblBhZ2VTdGF0ZUlzRGVjb21taXR0ZWQocGFnZSkpKSB7CisgICAgICBwYWdlLT5uZXh0X3BhZ2UgPSBidWNrZXQtPmRlY29tbWl0dGVkX3BhZ2VzX2hlYWQ7CisgICAgICBidWNrZXQtPmRlY29tbWl0dGVkX3BhZ2VzX2hlYWQgPSBwYWdlOworICAgIH0gZWxzZSB7CisgICAgICBEQ0hFQ0soUGFydGl0aW9uUGFnZVN0YXRlSXNGdWxsKHBhZ2UpKTsKKyAgICAgIC8vIElmIHdlIGdldCBoZXJlLCB3ZSBmb3VuZCBhIGZ1bGwgcGFnZS4gU2tpcCBvdmVyIGl0IHRvbywgYW5kIGFsc28KKyAgICAgIC8vIHRhZyBpdCBhcyBmdWxsICh2aWEgYSBuZWdhdGl2ZSB2YWx1ZSkuIFdlIG5lZWQgaXQgdGFnZ2VkIHNvIHRoYXQKKyAgICAgIC8vIGZyZWUnaW5nIGNhbiB0ZWxsLCBhbmQgbW92ZSBpdCBiYWNrIGludG8gdGhlIGFjdGl2ZSBwYWdlIGxpc3QuCisgICAgICBwYWdlLT5udW1fYWxsb2NhdGVkX3Nsb3RzID0gLXBhZ2UtPm51bV9hbGxvY2F0ZWRfc2xvdHM7CisgICAgICArK2J1Y2tldC0+bnVtX2Z1bGxfcGFnZXM7CisgICAgICAvLyBudW1fZnVsbF9wYWdlcyBpcyBhIHVpbnQxNl90IGZvciBlZmZpY2llbnQgcGFja2luZyBzbyBndWFyZCBhZ2FpbnN0CisgICAgICAvLyBvdmVyZmxvdyB0byBiZSBzYWZlLgorICAgICAgaWYgKFVOTElLRUxZKCFidWNrZXQtPm51bV9mdWxsX3BhZ2VzKSkKKyAgICAgICAgUGFydGl0aW9uQnVja2V0RnVsbCgpOworICAgICAgLy8gTm90IG5lY2Vzc2FyeSBidXQgbWlnaHQgaGVscCBzdG9wIGFjY2lkZW50cy4KKyAgICAgIHBhZ2UtPm5leHRfcGFnZSA9IDA7CisgICAgfQorICB9CisKKyAgYnVja2V0LT5hY3RpdmVfcGFnZXNfaGVhZCA9ICZQYXJ0aXRpb25Sb290R2VuZXJpYzo6Z1NlZWRQYWdlOworICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIFBhcnRpdGlvbkRpcmVjdE1hcEV4dGVudCogcGFydGl0aW9uUGFnZVRvRGlyZWN0TWFwRXh0ZW50KAorICAgIFBhcnRpdGlvblBhZ2UqIHBhZ2UpIHsKKyAgRENIRUNLKFBhcnRpdGlvbkJ1Y2tldElzRGlyZWN0TWFwcGVkKHBhZ2UtPmJ1Y2tldCkpOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQYXJ0aXRpb25EaXJlY3RNYXBFeHRlbnQqPigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHBhZ2UpICsgMyAqIGtQYWdlTWV0YWRhdGFTaXplKTsKK30KKworc3RhdGljIEFMV0FZU19JTkxJTkUgdm9pZCBQYXJ0aXRpb25QYWdlU2V0UmF3U2l6ZShQYXJ0aXRpb25QYWdlKiBwYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgeworICBzaXplX3QqIHJhd19zaXplX3B0ciA9IFBhcnRpdGlvblBhZ2VHZXRSYXdTaXplUHRyKHBhZ2UpOworICBpZiAoVU5MSUtFTFkocmF3X3NpemVfcHRyICE9IG51bGxwdHIpKQorICAgICpyYXdfc2l6ZV9wdHIgPSBzaXplOworfQorCitzdGF0aWMgQUxXQVlTX0lOTElORSBQYXJ0aXRpb25QYWdlKiBQYXJ0aXRpb25EaXJlY3RNYXAoUGFydGl0aW9uUm9vdEJhc2UqIHJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByYXdfc2l6ZSkgeworICBzaXplX3Qgc2l6ZSA9IFBhcnRpdGlvbkRpcmVjdE1hcFNpemUocmF3X3NpemUpOworCisgIC8vIEJlY2F1c2Ugd2UgbmVlZCB0byBmYWtlIGxvb2tpbmcgbGlrZSBhIHN1cGVyIHBhZ2UsIHdlIG5lZWQgdG8gYWxsb2NhdGUKKyAgLy8gYSBidW5jaCBvZiBzeXN0ZW0gcGFnZXMgbW9yZSB0aGFuICJzaXplIjoKKyAgLy8gLSBUaGUgZmlyc3QgZmV3IHN5c3RlbSBwYWdlcyBhcmUgdGhlIHBhcnRpdGlvbiBwYWdlIGluIHdoaWNoIHRoZSBzdXBlcgorICAvLyBwYWdlIG1ldGFkYXRhIGlzIHN0b3JlZC4gV2UgZmF1bHQganVzdCBvbmUgc3lzdGVtIHBhZ2Ugb3V0IG9mIGEgcGFydGl0aW9uCisgIC8vIHBhZ2Ugc2l6ZWQgY2x1bXAuCisgIC8vIC0gV2UgYWRkIGEgdHJhaWxpbmcgZ3VhcmQgcGFnZSBvbiAzMi1iaXQgKG9uIDY0LWJpdCB3ZSByZWx5IG9uIHRoZQorICAvLyBtYXNzaXZlIGFkZHJlc3Mgc3BhY2UgcGx1cyByYW5kb21pemF0aW9uIGluc3RlYWQpLgorICBzaXplX3QgbWFwX3NpemUgPSBzaXplICsga1BhcnRpdGlvblBhZ2VTaXplOworI2lmICFkZWZpbmVkKEFSQ0hfQ1BVXzY0X0JJVFMpCisgIG1hcF9zaXplICs9IGtTeXN0ZW1QYWdlU2l6ZTsKKyNlbmRpZgorICAvLyBSb3VuZCB1cCB0byB0aGUgYWxsb2NhdGlvbiBncmFudWxhcml0eS4KKyAgbWFwX3NpemUgKz0ga1BhZ2VBbGxvY2F0aW9uR3JhbnVsYXJpdHlPZmZzZXRNYXNrOworICBtYXBfc2l6ZSAmPSBrUGFnZUFsbG9jYXRpb25HcmFudWxhcml0eUJhc2VNYXNrOworCisgIC8vIFRPRE86IHRoZXNlIHBhZ2VzIHdpbGwgYmUgemVyby1maWxsZWQuIENvbnNpZGVyIGludGVybmFsaXppbmcgYW4KKyAgLy8gYWxsb2NaZXJvZWQoKSBBUEkgc28gd2UgY2FuIGF2b2lkIGEgbWVtc2V0KCkgZW50aXJlbHkgaW4gdGhpcyBjYXNlLgorICBjaGFyKiBwdHIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPigKKyAgICAgIEFsbG9jUGFnZXMoMCwgbWFwX3NpemUsIGtTdXBlclBhZ2VTaXplLCBQYWdlQWNjZXNzaWJsZSkpOworICBpZiAoVU5MSUtFTFkoIXB0cikpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgc2l6ZV90IGNvbW1pdHRlZF9wYWdlX3NpemUgPSBzaXplICsga1N5c3RlbVBhZ2VTaXplOworICByb290LT50b3RhbF9zaXplX29mX2RpcmVjdF9tYXBwZWRfcGFnZXMgKz0gY29tbWl0dGVkX3BhZ2Vfc2l6ZTsKKyAgUGFydGl0aW9uSW5jcmVhc2VDb21taXR0ZWRQYWdlcyhyb290LCBjb21taXR0ZWRfcGFnZV9zaXplKTsKKworICBjaGFyKiBzbG90ID0gcHRyICsga1BhcnRpdGlvblBhZ2VTaXplOworICBTZXRTeXN0ZW1QYWdlc0luYWNjZXNzaWJsZShwdHIgKyAoa1N5c3RlbVBhZ2VTaXplICogMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtQYXJ0aXRpb25QYWdlU2l6ZSAtIChrU3lzdGVtUGFnZVNpemUgKiAyKSk7CisjaWYgIWRlZmluZWQoQVJDSF9DUFVfNjRfQklUUykKKyAgU2V0U3lzdGVtUGFnZXNJbmFjY2Vzc2libGUocHRyLCBrU3lzdGVtUGFnZVNpemUpOworICBTZXRTeXN0ZW1QYWdlc0luYWNjZXNzaWJsZShzbG90ICsgc2l6ZSwga1N5c3RlbVBhZ2VTaXplKTsKKyNlbmRpZgorCisgIFBhcnRpdGlvblN1cGVyUGFnZUV4dGVudEVudHJ5KiBleHRlbnQgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxQYXJ0aXRpb25TdXBlclBhZ2VFeHRlbnRFbnRyeSo+KAorICAgICAgICAgIFBhcnRpdGlvblN1cGVyUGFnZVRvTWV0YWRhdGFBcmVhKHB0cikpOworICBleHRlbnQtPnJvb3QgPSByb290OworICAvLyBUaGUgbmV3IHN0cnVjdHVyZXMgYXJlIGFsbCBsb2NhdGVkIGluc2lkZSBhIGZyZXNoIHN5c3RlbSBwYWdlIHNvIHRoZXkKKyAgLy8gd2lsbCBhbGwgYmUgemVyb2VkIG91dC4gVGhlc2UgRENIRUNLcyBhcmUgZm9yIGRvY3VtZW50YXRpb24uCisgIERDSEVDSyghZXh0ZW50LT5zdXBlcl9wYWdlX2Jhc2UpOworICBEQ0hFQ0soIWV4dGVudC0+c3VwZXJfcGFnZXNfZW5kKTsKKyAgRENIRUNLKCFleHRlbnQtPm5leHQpOworICBQYXJ0aXRpb25QYWdlKiBwYWdlID0gUGFydGl0aW9uUG9pbnRlclRvUGFnZU5vQWxpZ25tZW50Q2hlY2soc2xvdCk7CisgIFBhcnRpdGlvbkJ1Y2tldCogYnVja2V0ID0gcmVpbnRlcnByZXRfY2FzdDxQYXJ0aXRpb25CdWNrZXQqPigKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHBhZ2UpICsgKGtQYWdlTWV0YWRhdGFTaXplICogMikpOworICBEQ0hFQ0soIXBhZ2UtPm5leHRfcGFnZSk7CisgIERDSEVDSyghcGFnZS0+bnVtX2FsbG9jYXRlZF9zbG90cyk7CisgIERDSEVDSyghcGFnZS0+bnVtX3VucHJvdmlzaW9uZWRfc2xvdHMpOworICBEQ0hFQ0soIXBhZ2UtPnBhZ2Vfb2Zmc2V0KTsKKyAgRENIRUNLKCFwYWdlLT5lbXB0eV9jYWNoZV9pbmRleCk7CisgIHBhZ2UtPmJ1Y2tldCA9IGJ1Y2tldDsKKyAgcGFnZS0+ZnJlZWxpc3RfaGVhZCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGFydGl0aW9uRnJlZWxpc3RFbnRyeSo+KHNsb3QpOworICBQYXJ0aXRpb25GcmVlbGlzdEVudHJ5KiBuZXh0X2VudHJ5ID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UGFydGl0aW9uRnJlZWxpc3RFbnRyeSo+KHNsb3QpOworICBuZXh0X2VudHJ5LT5uZXh0ID0gUGFydGl0aW9uRnJlZWxpc3RNYXNrKDApOworCisgIERDSEVDSyghYnVja2V0LT5hY3RpdmVfcGFnZXNfaGVhZCk7CisgIERDSEVDSyghYnVja2V0LT5lbXB0eV9wYWdlc19oZWFkKTsKKyAgRENIRUNLKCFidWNrZXQtPmRlY29tbWl0dGVkX3BhZ2VzX2hlYWQpOworICBEQ0hFQ0soIWJ1Y2tldC0+bnVtX3N5c3RlbV9wYWdlc19wZXJfc2xvdF9zcGFuKTsKKyAgRENIRUNLKCFidWNrZXQtPm51bV9mdWxsX3BhZ2VzKTsKKyAgYnVja2V0LT5zbG90X3NpemUgPSBzaXplOworCisgIFBhcnRpdGlvbkRpcmVjdE1hcEV4dGVudCogbWFwX2V4dGVudCA9IHBhcnRpdGlvblBhZ2VUb0RpcmVjdE1hcEV4dGVudChwYWdlKTsKKyAgbWFwX2V4dGVudC0+bWFwX3NpemUgPSBtYXBfc2l6ZSAtIGtQYXJ0aXRpb25QYWdlU2l6ZSAtIGtTeXN0ZW1QYWdlU2l6ZTsKKyAgbWFwX2V4dGVudC0+YnVja2V0ID0gYnVja2V0OworCisgIC8vIE1haW50YWluIHRoZSBkb3VibHktbGlua2VkIGxpc3Qgb2YgYWxsIGRpcmVjdCBtYXBwaW5ncy4KKyAgbWFwX2V4dGVudC0+bmV4dF9leHRlbnQgPSByb290LT5kaXJlY3RfbWFwX2xpc3Q7CisgIGlmIChtYXBfZXh0ZW50LT5uZXh0X2V4dGVudCkKKyAgICBtYXBfZXh0ZW50LT5uZXh0X2V4dGVudC0+cHJldl9leHRlbnQgPSBtYXBfZXh0ZW50OworICBtYXBfZXh0ZW50LT5wcmV2X2V4dGVudCA9IG51bGxwdHI7CisgIHJvb3QtPmRpcmVjdF9tYXBfbGlzdCA9IG1hcF9leHRlbnQ7CisKKyAgcmV0dXJuIHBhZ2U7Cit9CisKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHZvaWQgUGFydGl0aW9uRGlyZWN0VW5tYXAoUGFydGl0aW9uUGFnZSogcGFnZSkgeworICBQYXJ0aXRpb25Sb290QmFzZSogcm9vdCA9IFBhcnRpdGlvblBhZ2VUb1Jvb3QocGFnZSk7CisgIGNvbnN0IFBhcnRpdGlvbkRpcmVjdE1hcEV4dGVudCogZXh0ZW50ID0gcGFydGl0aW9uUGFnZVRvRGlyZWN0TWFwRXh0ZW50KHBhZ2UpOworICBzaXplX3QgdW5tYXBfc2l6ZSA9IGV4dGVudC0+bWFwX3NpemU7CisKKyAgLy8gTWFpbnRhaW4gdGhlIGRvdWJseS1saW5rZWQgbGlzdCBvZiBhbGwgZGlyZWN0IG1hcHBpbmdzLgorICBpZiAoZXh0ZW50LT5wcmV2X2V4dGVudCkgeworICAgIERDSEVDSyhleHRlbnQtPnByZXZfZXh0ZW50LT5uZXh0X2V4dGVudCA9PSBleHRlbnQpOworICAgIGV4dGVudC0+cHJldl9leHRlbnQtPm5leHRfZXh0ZW50ID0gZXh0ZW50LT5uZXh0X2V4dGVudDsKKyAgfSBlbHNlIHsKKyAgICByb290LT5kaXJlY3RfbWFwX2xpc3QgPSBleHRlbnQtPm5leHRfZXh0ZW50OworICB9CisgIGlmIChleHRlbnQtPm5leHRfZXh0ZW50KSB7CisgICAgRENIRUNLKGV4dGVudC0+bmV4dF9leHRlbnQtPnByZXZfZXh0ZW50ID09IGV4dGVudCk7CisgICAgZXh0ZW50LT5uZXh0X2V4dGVudC0+cHJldl9leHRlbnQgPSBleHRlbnQtPnByZXZfZXh0ZW50OworICB9CisKKyAgLy8gQWRkIG9uIHRoZSBzaXplIG9mIHRoZSB0cmFpbGluZyBndWFyZCBwYWdlIGFuZCBwcmVjZWVkaW5nIHBhcnRpdGlvbgorICAvLyBwYWdlLgorICB1bm1hcF9zaXplICs9IGtQYXJ0aXRpb25QYWdlU2l6ZSArIGtTeXN0ZW1QYWdlU2l6ZTsKKworICBzaXplX3QgdW5jb21taXR0ZWRfcGFnZV9zaXplID0gcGFnZS0+YnVja2V0LT5zbG90X3NpemUgKyBrU3lzdGVtUGFnZVNpemU7CisgIFBhcnRpdGlvbkRlY3JlYXNlQ29tbWl0dGVkUGFnZXMocm9vdCwgdW5jb21taXR0ZWRfcGFnZV9zaXplKTsKKyAgRENIRUNLKHJvb3QtPnRvdGFsX3NpemVfb2ZfZGlyZWN0X21hcHBlZF9wYWdlcyA+PSB1bmNvbW1pdHRlZF9wYWdlX3NpemUpOworICByb290LT50b3RhbF9zaXplX29mX2RpcmVjdF9tYXBwZWRfcGFnZXMgLT0gdW5jb21taXR0ZWRfcGFnZV9zaXplOworCisgIERDSEVDSyghKHVubWFwX3NpemUgJiBrUGFnZUFsbG9jYXRpb25HcmFudWxhcml0eU9mZnNldE1hc2spKTsKKworICBjaGFyKiBwdHIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihQYXJ0aXRpb25QYWdlVG9Qb2ludGVyKHBhZ2UpKTsKKyAgLy8gQWNjb3VudCBmb3IgdGhlIG1hcHBpbmcgc3RhcnRpbmcgYSBwYXJ0aXRpb24gcGFnZSBiZWZvcmUgdGhlIGFjdHVhbAorICAvLyBhbGxvY2F0aW9uIGFkZHJlc3MuCisgIHB0ciAtPSBrUGFydGl0aW9uUGFnZVNpemU7CisKKyAgRnJlZVBhZ2VzKHB0ciwgdW5tYXBfc2l6ZSk7Cit9CisKK3ZvaWQqIFBhcnRpdGlvbkFsbG9jU2xvd1BhdGgoUGFydGl0aW9uUm9vdEJhc2UqIHJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvbkJ1Y2tldCogYnVja2V0KSB7CisgIC8vIFRoZSBzbG93IHBhdGggaXMgY2FsbGVkIHdoZW4gdGhlIGZyZWVsaXN0IGlzIGVtcHR5LgorICBEQ0hFQ0soIWJ1Y2tldC0+YWN0aXZlX3BhZ2VzX2hlYWQtPmZyZWVsaXN0X2hlYWQpOworCisgIFBhcnRpdGlvblBhZ2UqIG5ld19wYWdlID0gbnVsbHB0cjsKKworICAvLyBGb3IgdGhlIFBhcnRpdGlvbkFsbG9jR2VuZXJpYyBBUEksIHdlIGhhdmUgYSBidW5jaCBvZiBidWNrZXRzIG1hcmtlZAorICAvLyBhcyBzcGVjaWFsIGNhc2VzLiBXZSBib3VuY2UgdGhlbSB0aHJvdWdoIHRvIHRoZSBzbG93IHBhdGggc28gdGhhdCB3ZQorICAvLyBjYW4gc3RpbGwgaGF2ZSBhIGJsYXppbmcgZmFzdCBob3QgcGF0aCBkdWUgdG8gbGFjayBvZiBjb3JuZXItY2FzZQorICAvLyBicmFuY2hlcy4KKyAgYm9vbCByZXR1cm5OdWxsID0gZmxhZ3MgJiBQYXJ0aXRpb25BbGxvY1JldHVybk51bGw7CisgIGlmIChVTkxJS0VMWShQYXJ0aXRpb25CdWNrZXRJc0RpcmVjdE1hcHBlZChidWNrZXQpKSkgeworICAgIERDSEVDSyhzaXplID4ga0dlbmVyaWNNYXhCdWNrZXRlZCk7CisgICAgRENIRUNLKGJ1Y2tldCA9PSAmUGFydGl0aW9uUm9vdEJhc2U6OmdQYWdlZEJ1Y2tldCk7CisgICAgRENIRUNLKGJ1Y2tldC0+YWN0aXZlX3BhZ2VzX2hlYWQgPT0gJlBhcnRpdGlvblJvb3RHZW5lcmljOjpnU2VlZFBhZ2UpOworICAgIGlmIChzaXplID4ga0dlbmVyaWNNYXhEaXJlY3RNYXBwZWQpIHsKKyAgICAgIGlmIChyZXR1cm5OdWxsKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIFBhcnRpdGlvbkV4Y2Vzc2l2ZUFsbG9jYXRpb25TaXplKCk7CisgICAgfQorICAgIG5ld19wYWdlID0gUGFydGl0aW9uRGlyZWN0TWFwKHJvb3QsIGZsYWdzLCBzaXplKTsKKyAgfSBlbHNlIGlmIChMSUtFTFkoUGFydGl0aW9uU2V0TmV3QWN0aXZlUGFnZShidWNrZXQpKSkgeworICAgIC8vIEZpcnN0LCBkaWQgd2UgZmluZCBhbiBhY3RpdmUgcGFnZSBpbiB0aGUgYWN0aXZlIHBhZ2VzIGxpc3Q/CisgICAgbmV3X3BhZ2UgPSBidWNrZXQtPmFjdGl2ZV9wYWdlc19oZWFkOworICAgIERDSEVDSyhQYXJ0aXRpb25QYWdlU3RhdGVJc0FjdGl2ZShuZXdfcGFnZSkpOworICB9IGVsc2UgaWYgKExJS0VMWShidWNrZXQtPmVtcHR5X3BhZ2VzX2hlYWQgIT0gbnVsbHB0cikgfHwKKyAgICAgICAgICAgICBMSUtFTFkoYnVja2V0LT5kZWNvbW1pdHRlZF9wYWdlc19oZWFkICE9IG51bGxwdHIpKSB7CisgICAgLy8gU2Vjb25kLCBsb29rIGluIG91ciBsaXN0cyBvZiBlbXB0eSBhbmQgZGVjb21taXR0ZWQgcGFnZXMuCisgICAgLy8gQ2hlY2sgZW1wdHkgcGFnZXMgZmlyc3QsIHdoaWNoIGFyZSBwcmVmZXJyZWQsIGJ1dCBiZXdhcmUgdGhhdCBhbgorICAgIC8vIGVtcHR5IHBhZ2UgbWlnaHQgaGF2ZSBiZWVuIGRlY29tbWl0dGVkLgorICAgIHdoaWxlIChMSUtFTFkoKG5ld19wYWdlID0gYnVja2V0LT5lbXB0eV9wYWdlc19oZWFkKSAhPSBudWxscHRyKSkgeworICAgICAgRENIRUNLKG5ld19wYWdlLT5idWNrZXQgPT0gYnVja2V0KTsKKyAgICAgIERDSEVDSyhQYXJ0aXRpb25QYWdlU3RhdGVJc0VtcHR5KG5ld19wYWdlKSB8fAorICAgICAgICAgICAgIFBhcnRpdGlvblBhZ2VTdGF0ZUlzRGVjb21taXR0ZWQobmV3X3BhZ2UpKTsKKyAgICAgIGJ1Y2tldC0+ZW1wdHlfcGFnZXNfaGVhZCA9IG5ld19wYWdlLT5uZXh0X3BhZ2U7CisgICAgICAvLyBBY2NlcHQgdGhlIGVtcHR5IHBhZ2UgdW5sZXNzIGl0IGdvdCBkZWNvbW1pdHRlZC4KKyAgICAgIGlmIChuZXdfcGFnZS0+ZnJlZWxpc3RfaGVhZCkgeworICAgICAgICBuZXdfcGFnZS0+bmV4dF9wYWdlID0gbnVsbHB0cjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBEQ0hFQ0soUGFydGl0aW9uUGFnZVN0YXRlSXNEZWNvbW1pdHRlZChuZXdfcGFnZSkpOworICAgICAgbmV3X3BhZ2UtPm5leHRfcGFnZSA9IGJ1Y2tldC0+ZGVjb21taXR0ZWRfcGFnZXNfaGVhZDsKKyAgICAgIGJ1Y2tldC0+ZGVjb21taXR0ZWRfcGFnZXNfaGVhZCA9IG5ld19wYWdlOworICAgIH0KKyAgICBpZiAoVU5MSUtFTFkoIW5ld19wYWdlKSAmJgorICAgICAgICBMSUtFTFkoYnVja2V0LT5kZWNvbW1pdHRlZF9wYWdlc19oZWFkICE9IG51bGxwdHIpKSB7CisgICAgICBuZXdfcGFnZSA9IGJ1Y2tldC0+ZGVjb21taXR0ZWRfcGFnZXNfaGVhZDsKKyAgICAgIERDSEVDSyhuZXdfcGFnZS0+YnVja2V0ID09IGJ1Y2tldCk7CisgICAgICBEQ0hFQ0soUGFydGl0aW9uUGFnZVN0YXRlSXNEZWNvbW1pdHRlZChuZXdfcGFnZSkpOworICAgICAgYnVja2V0LT5kZWNvbW1pdHRlZF9wYWdlc19oZWFkID0gbmV3X3BhZ2UtPm5leHRfcGFnZTsKKyAgICAgIHZvaWQqIGFkZHIgPSBQYXJ0aXRpb25QYWdlVG9Qb2ludGVyKG5ld19wYWdlKTsKKyAgICAgIFBhcnRpdGlvblJlY29tbWl0U3lzdGVtUGFnZXMocm9vdCwgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uQnVja2V0Qnl0ZXMobmV3X3BhZ2UtPmJ1Y2tldCkpOworICAgICAgUGFydGl0aW9uUGFnZVJlc2V0KG5ld19wYWdlKTsKKyAgICB9CisgICAgRENIRUNLKG5ld19wYWdlKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBUaGlyZC4gSWYgd2UgZ2V0IGhlcmUsIHdlIG5lZWQgYSBicmFuZCBuZXcgcGFnZS4KKyAgICB1aW50MTZfdCBudW1fcGFydGl0aW9uX3BhZ2VzID0gUGFydGl0aW9uQnVja2V0UGFydGl0aW9uUGFnZXMoYnVja2V0KTsKKyAgICB2b2lkKiByYXdQYWdlcyA9CisgICAgICAgIFBhcnRpdGlvbkFsbG9jUGFydGl0aW9uUGFnZXMocm9vdCwgZmxhZ3MsIG51bV9wYXJ0aXRpb25fcGFnZXMpOworICAgIGlmIChMSUtFTFkocmF3UGFnZXMgIT0gbnVsbHB0cikpIHsKKyAgICAgIG5ld19wYWdlID0gUGFydGl0aW9uUG9pbnRlclRvUGFnZU5vQWxpZ25tZW50Q2hlY2socmF3UGFnZXMpOworICAgICAgUGFydGl0aW9uUGFnZVNldHVwKG5ld19wYWdlLCBidWNrZXQpOworICAgIH0KKyAgfQorCisgIC8vIEJhaWwgaWYgd2UgaGFkIGEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4KKyAgaWYgKFVOTElLRUxZKCFuZXdfcGFnZSkpIHsKKyAgICBEQ0hFQ0soYnVja2V0LT5hY3RpdmVfcGFnZXNfaGVhZCA9PSAmUGFydGl0aW9uUm9vdEdlbmVyaWM6OmdTZWVkUGFnZSk7CisgICAgaWYgKHJldHVybk51bGwpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBQYXJ0aXRpb25PdXRPZk1lbW9yeShyb290KTsKKyAgfQorCisgIGJ1Y2tldCA9IG5ld19wYWdlLT5idWNrZXQ7CisgIERDSEVDSyhidWNrZXQgIT0gJlBhcnRpdGlvblJvb3RCYXNlOjpnUGFnZWRCdWNrZXQpOworICBidWNrZXQtPmFjdGl2ZV9wYWdlc19oZWFkID0gbmV3X3BhZ2U7CisgIFBhcnRpdGlvblBhZ2VTZXRSYXdTaXplKG5ld19wYWdlLCBzaXplKTsKKworICAvLyBJZiB3ZSBmb3VuZCBhbiBhY3RpdmUgcGFnZSB3aXRoIGZyZWUgc2xvdHMsIG9yIGFuIGVtcHR5IHBhZ2UsIHdlIGhhdmUgYQorICAvLyB1c2FibGUgZnJlZWxpc3QgaGVhZC4KKyAgaWYgKExJS0VMWShuZXdfcGFnZS0+ZnJlZWxpc3RfaGVhZCAhPSBudWxscHRyKSkgeworICAgIFBhcnRpdGlvbkZyZWVsaXN0RW50cnkqIGVudHJ5ID0gbmV3X3BhZ2UtPmZyZWVsaXN0X2hlYWQ7CisgICAgUGFydGl0aW9uRnJlZWxpc3RFbnRyeSogbmV3X2hlYWQgPSBQYXJ0aXRpb25GcmVlbGlzdE1hc2soZW50cnktPm5leHQpOworICAgIG5ld19wYWdlLT5mcmVlbGlzdF9oZWFkID0gbmV3X2hlYWQ7CisgICAgbmV3X3BhZ2UtPm51bV9hbGxvY2F0ZWRfc2xvdHMrKzsKKyAgICByZXR1cm4gZW50cnk7CisgIH0KKyAgLy8gT3RoZXJ3aXNlLCB3ZSBuZWVkIHRvIGJ1aWxkIHRoZSBmcmVlbGlzdC4KKyAgRENIRUNLKG5ld19wYWdlLT5udW1fdW5wcm92aXNpb25lZF9zbG90cyk7CisgIHJldHVybiBQYXJ0aXRpb25QYWdlQWxsb2NBbmRGaWxsRnJlZWxpc3QobmV3X3BhZ2UpOworfQorCitzdGF0aWMgQUxXQVlTX0lOTElORSB2b2lkIFBhcnRpdGlvbkRlY29tbWl0UGFnZShQYXJ0aXRpb25Sb290QmFzZSogcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvblBhZ2UqIHBhZ2UpIHsKKyAgRENIRUNLKFBhcnRpdGlvblBhZ2VTdGF0ZUlzRW1wdHkocGFnZSkpOworICBEQ0hFQ0soIVBhcnRpdGlvbkJ1Y2tldElzRGlyZWN0TWFwcGVkKHBhZ2UtPmJ1Y2tldCkpOworICB2b2lkKiBhZGRyID0gUGFydGl0aW9uUGFnZVRvUG9pbnRlcihwYWdlKTsKKyAgUGFydGl0aW9uRGVjb21taXRTeXN0ZW1QYWdlcyhyb290LCBhZGRyLCBQYXJ0aXRpb25CdWNrZXRCeXRlcyhwYWdlLT5idWNrZXQpKTsKKworICAvLyBXZSBhY3R1YWxseSBsZWF2ZSB0aGUgZGVjb21taXR0ZWQgcGFnZSBpbiB0aGUgYWN0aXZlIGxpc3QuIFdlJ2xsIHN3ZWVwCisgIC8vIGl0IG9uIHRvIHRoZSBkZWNvbW1pdHRlZCBwYWdlIGxpc3Qgd2hlbiB3ZSBuZXh0IHdhbGsgdGhlIGFjdGl2ZSBwYWdlCisgIC8vIGxpc3QuCisgIC8vIFB1bGxpbmcgdGhpcyB0cmljayBlbmFibGVzIHVzIHRvIHVzZSBhIHNpbmdseS1saW5rZWQgcGFnZSBsaXN0IGZvciBhbGwKKyAgLy8gY2FzZXMsIHdoaWNoIGlzIGNyaXRpY2FsIGluIGtlZXBpbmcgdGhlIHBhZ2UgbWV0YWRhdGEgc3RydWN0dXJlIGRvd24gdG8KKyAgLy8gMzIgYnl0ZXMgaW4gc2l6ZS4KKyAgcGFnZS0+ZnJlZWxpc3RfaGVhZCA9IDA7CisgIHBhZ2UtPm51bV91bnByb3Zpc2lvbmVkX3Nsb3RzID0gMDsKKyAgRENIRUNLKFBhcnRpdGlvblBhZ2VTdGF0ZUlzRGVjb21taXR0ZWQocGFnZSkpOworfQorCitzdGF0aWMgdm9pZCBQYXJ0aXRpb25EZWNvbW1pdFBhZ2VJZlBvc3NpYmxlKFBhcnRpdGlvblJvb3RCYXNlKiByb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aXRpb25QYWdlKiBwYWdlKSB7CisgIERDSEVDSyhwYWdlLT5lbXB0eV9jYWNoZV9pbmRleCA+PSAwKTsKKyAgRENIRUNLKHN0YXRpY19jYXN0PHVuc2lnbmVkPihwYWdlLT5lbXB0eV9jYWNoZV9pbmRleCkgPCBrTWF4RnJlZWFibGVTcGFucyk7CisgIERDSEVDSyhwYWdlID09IHJvb3QtPmdsb2JhbF9lbXB0eV9wYWdlX3JpbmdbcGFnZS0+ZW1wdHlfY2FjaGVfaW5kZXhdKTsKKyAgcGFnZS0+ZW1wdHlfY2FjaGVfaW5kZXggPSAtMTsKKyAgaWYgKFBhcnRpdGlvblBhZ2VTdGF0ZUlzRW1wdHkocGFnZSkpCisgICAgUGFydGl0aW9uRGVjb21taXRQYWdlKHJvb3QsIHBhZ2UpOworfQorCitzdGF0aWMgQUxXQVlTX0lOTElORSB2b2lkIFBhcnRpdGlvblJlZ2lzdGVyRW1wdHlQYWdlKFBhcnRpdGlvblBhZ2UqIHBhZ2UpIHsKKyAgRENIRUNLKFBhcnRpdGlvblBhZ2VTdGF0ZUlzRW1wdHkocGFnZSkpOworICBQYXJ0aXRpb25Sb290QmFzZSogcm9vdCA9IFBhcnRpdGlvblBhZ2VUb1Jvb3QocGFnZSk7CisKKyAgLy8gSWYgdGhlIHBhZ2UgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGFzIGVtcHR5LCBnaXZlIGl0IGFub3RoZXIgbGlmZS4KKyAgaWYgKHBhZ2UtPmVtcHR5X2NhY2hlX2luZGV4ICE9IC0xKSB7CisgICAgRENIRUNLKHBhZ2UtPmVtcHR5X2NhY2hlX2luZGV4ID49IDApOworICAgIERDSEVDSyhzdGF0aWNfY2FzdDx1bnNpZ25lZD4ocGFnZS0+ZW1wdHlfY2FjaGVfaW5kZXgpIDwga01heEZyZWVhYmxlU3BhbnMpOworICAgIERDSEVDSyhyb290LT5nbG9iYWxfZW1wdHlfcGFnZV9yaW5nW3BhZ2UtPmVtcHR5X2NhY2hlX2luZGV4XSA9PSBwYWdlKTsKKyAgICByb290LT5nbG9iYWxfZW1wdHlfcGFnZV9yaW5nW3BhZ2UtPmVtcHR5X2NhY2hlX2luZGV4XSA9IDA7CisgIH0KKworICBpbnQxNl90IGN1cnJlbnRfaW5kZXggPSByb290LT5nbG9iYWxfZW1wdHlfcGFnZV9yaW5nX2luZGV4OworICBQYXJ0aXRpb25QYWdlKiBwYWdlVG9EZWNvbW1pdCA9IHJvb3QtPmdsb2JhbF9lbXB0eV9wYWdlX3JpbmdbY3VycmVudF9pbmRleF07CisgIC8vIFRoZSBwYWdlIG1pZ2h0IHdlbGwgaGF2ZSBiZWVuIHJlLWFjdGl2YXRlZCwgZmlsbGVkIHVwLCBldGMuIGJlZm9yZSB3ZSBnZXQKKyAgLy8gYXJvdW5kIHRvIGxvb2tpbmcgYXQgaXQgaGVyZS4KKyAgaWYgKHBhZ2VUb0RlY29tbWl0KQorICAgIFBhcnRpdGlvbkRlY29tbWl0UGFnZUlmUG9zc2libGUocm9vdCwgcGFnZVRvRGVjb21taXQpOworCisgIC8vIFdlIHB1dCB0aGUgZW1wdHkgc2xvdCBzcGFuIG9uIG91ciBnbG9iYWwgbGlzdCBvZiAicGFnZXMgdGhhdCB3ZXJlIG9uY2UKKyAgLy8gZW1wdHkiLiB0aHVzIHByb3ZpZGluZyBpdCBhIGJpdCBvZiBicmVhdGhpbmcgcm9vbSB0byBnZXQgcmUtdXNlZCBiZWZvcmUKKyAgLy8gd2UgcmVhbGx5IGZyZWUgaXQuIFRoaXMgaW1wcm92ZXMgcGVyZm9ybWFuY2UsIHBhcnRpY3VsYXJseSBvbiBNYWMgT1MgWAorICAvLyB3aGljaCBoYXMgc3VicGFyIG1lbW9yeSBtYW5hZ2VtZW50IHBlcmZvcm1hbmNlLgorICByb290LT5nbG9iYWxfZW1wdHlfcGFnZV9yaW5nW2N1cnJlbnRfaW5kZXhdID0gcGFnZTsKKyAgcGFnZS0+ZW1wdHlfY2FjaGVfaW5kZXggPSBjdXJyZW50X2luZGV4OworICArK2N1cnJlbnRfaW5kZXg7CisgIGlmIChjdXJyZW50X2luZGV4ID09IGtNYXhGcmVlYWJsZVNwYW5zKQorICAgIGN1cnJlbnRfaW5kZXggPSAwOworICByb290LT5nbG9iYWxfZW1wdHlfcGFnZV9yaW5nX2luZGV4ID0gY3VycmVudF9pbmRleDsKK30KKworc3RhdGljIHZvaWQgUGFydGl0aW9uRGVjb21taXRFbXB0eVBhZ2VzKFBhcnRpdGlvblJvb3RCYXNlKiByb290KSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heEZyZWVhYmxlU3BhbnM7ICsraSkgeworICAgIFBhcnRpdGlvblBhZ2UqIHBhZ2UgPSByb290LT5nbG9iYWxfZW1wdHlfcGFnZV9yaW5nW2ldOworICAgIGlmIChwYWdlKQorICAgICAgUGFydGl0aW9uRGVjb21taXRQYWdlSWZQb3NzaWJsZShyb290LCBwYWdlKTsKKyAgICByb290LT5nbG9iYWxfZW1wdHlfcGFnZV9yaW5nW2ldID0gbnVsbHB0cjsKKyAgfQorfQorCit2b2lkIFBhcnRpdGlvbkZyZWVTbG93UGF0aChQYXJ0aXRpb25QYWdlKiBwYWdlKSB7CisgIFBhcnRpdGlvbkJ1Y2tldCogYnVja2V0ID0gcGFnZS0+YnVja2V0OworICBEQ0hFQ0socGFnZSAhPSAmUGFydGl0aW9uUm9vdEdlbmVyaWM6OmdTZWVkUGFnZSk7CisgIGlmIChMSUtFTFkocGFnZS0+bnVtX2FsbG9jYXRlZF9zbG90cyA9PSAwKSkgeworICAgIC8vIFBhZ2UgYmVjYW1lIGZ1bGx5IHVudXNlZC4KKyAgICBpZiAoVU5MSUtFTFkoUGFydGl0aW9uQnVja2V0SXNEaXJlY3RNYXBwZWQoYnVja2V0KSkpIHsKKyAgICAgIFBhcnRpdGlvbkRpcmVjdFVubWFwKHBhZ2UpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBJZiBpdCdzIHRoZSBjdXJyZW50IGFjdGl2ZSBwYWdlLCBjaGFuZ2UgaXQuIFdlIGJvdW5jZSB0aGUgcGFnZSB0bworICAgIC8vIHRoZSBlbXB0eSBsaXN0IGFzIGEgZm9yY2UgdG93YXJkcyBkZWZyYWdtZW50YXRpb24uCisgICAgaWYgKExJS0VMWShwYWdlID09IGJ1Y2tldC0+YWN0aXZlX3BhZ2VzX2hlYWQpKQorICAgICAgKHZvaWQpUGFydGl0aW9uU2V0TmV3QWN0aXZlUGFnZShidWNrZXQpOworICAgIERDSEVDSyhidWNrZXQtPmFjdGl2ZV9wYWdlc19oZWFkICE9IHBhZ2UpOworCisgICAgUGFydGl0aW9uUGFnZVNldFJhd1NpemUocGFnZSwgMCk7CisgICAgRENIRUNLKCFQYXJ0aXRpb25QYWdlR2V0UmF3U2l6ZShwYWdlKSk7CisKKyAgICBQYXJ0aXRpb25SZWdpc3RlckVtcHR5UGFnZShwYWdlKTsKKyAgfSBlbHNlIHsKKyAgICBEQ0hFQ0soIVBhcnRpdGlvbkJ1Y2tldElzRGlyZWN0TWFwcGVkKGJ1Y2tldCkpOworICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBwYWdlIGlzIGZ1bGwuIFRoYXQncyB0aGUgb25seSB2YWxpZCBjYXNlIGlmIHdlCisgICAgLy8gYXJyaXZlIGhlcmUuCisgICAgRENIRUNLKHBhZ2UtPm51bV9hbGxvY2F0ZWRfc2xvdHMgPCAwKTsKKyAgICAvLyBBIHRyYW5zaXRpb24gb2YgbnVtX2FsbG9jYXRlZF9zbG90cyBmcm9tIDAgdG8gLTEgaXMgbm90IGxlZ2FsLCBhbmQKKyAgICAvLyBsaWtlbHkgaW5kaWNhdGVzIGEgZG91YmxlLWZyZWUuCisgICAgQ0hFQ0socGFnZS0+bnVtX2FsbG9jYXRlZF9zbG90cyAhPSAtMSk7CisgICAgcGFnZS0+bnVtX2FsbG9jYXRlZF9zbG90cyA9IC1wYWdlLT5udW1fYWxsb2NhdGVkX3Nsb3RzIC0gMjsKKyAgICBEQ0hFQ0socGFnZS0+bnVtX2FsbG9jYXRlZF9zbG90cyA9PSBQYXJ0aXRpb25CdWNrZXRTbG90cyhidWNrZXQpIC0gMSk7CisgICAgLy8gRnVsbHkgdXNlZCBwYWdlIGJlY2FtZSBwYXJ0aWFsbHkgdXNlZC4gSXQgbXVzdCBiZSBwdXQgYmFjayBvbiB0aGUKKyAgICAvLyBub24tZnVsbCBwYWdlIGxpc3QuIEFsc28gbWFrZSBpdCB0aGUgY3VycmVudCBwYWdlIHRvIGluY3JlYXNlIHRoZQorICAgIC8vIGNoYW5jZXMgb2YgaXQgYmVpbmcgZmlsbGVkIHVwIGFnYWluLiBUaGUgb2xkIGN1cnJlbnQgcGFnZSB3aWxsIGJlCisgICAgLy8gdGhlIG5leHQgcGFnZS4KKyAgICBEQ0hFQ0soIXBhZ2UtPm5leHRfcGFnZSk7CisgICAgaWYgKExJS0VMWShidWNrZXQtPmFjdGl2ZV9wYWdlc19oZWFkICE9ICZQYXJ0aXRpb25Sb290R2VuZXJpYzo6Z1NlZWRQYWdlKSkKKyAgICAgIHBhZ2UtPm5leHRfcGFnZSA9IGJ1Y2tldC0+YWN0aXZlX3BhZ2VzX2hlYWQ7CisgICAgYnVja2V0LT5hY3RpdmVfcGFnZXNfaGVhZCA9IHBhZ2U7CisgICAgLS1idWNrZXQtPm51bV9mdWxsX3BhZ2VzOworICAgIC8vIFNwZWNpYWwgY2FzZTogZm9yIGEgcGFydGl0aW9uIHBhZ2Ugd2l0aCBqdXN0IGEgc2luZ2xlIHNsb3QsIGl0IG1heQorICAgIC8vIG5vdyBiZSBlbXB0eSBhbmQgd2Ugd2FudCB0byBydW4gaXQgdGhyb3VnaCB0aGUgZW1wdHkgbG9naWMuCisgICAgaWYgKFVOTElLRUxZKHBhZ2UtPm51bV9hbGxvY2F0ZWRfc2xvdHMgPT0gMCkpCisgICAgICBQYXJ0aXRpb25GcmVlU2xvd1BhdGgocGFnZSk7CisgIH0KK30KKworYm9vbCBwYXJ0aXRpb25SZWFsbG9jRGlyZWN0TWFwcGVkSW5QbGFjZShQYXJ0aXRpb25Sb290R2VuZXJpYyogcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uUGFnZSogcGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJhd19zaXplKSB7CisgIERDSEVDSyhQYXJ0aXRpb25CdWNrZXRJc0RpcmVjdE1hcHBlZChwYWdlLT5idWNrZXQpKTsKKworICByYXdfc2l6ZSA9IFBhcnRpdGlvbkNvb2tpZVNpemVBZGp1c3RBZGQocmF3X3NpemUpOworCisgIC8vIE5vdGUgdGhhdCB0aGUgbmV3IHNpemUgbWlnaHQgYmUgYSBidWNrZXRlZCBzaXplOyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAorICAvLyB3aGVuZXZlciB3ZSdyZSByZWFsbG9jYXRpbmcgYSBkaXJlY3QgbWFwcGVkIGFsbG9jYXRpb24uCisgIHNpemVfdCBuZXdfc2l6ZSA9IFBhcnRpdGlvbkRpcmVjdE1hcFNpemUocmF3X3NpemUpOworICBpZiAobmV3X3NpemUgPCBrR2VuZXJpY01pbkRpcmVjdE1hcHBlZERvd25zaXplKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBidWNrZXQtPnNsb3Rfc2l6ZSBpcyB0aGUgY3VycmVudCBzaXplIG9mIHRoZSBhbGxvY2F0aW9uLgorICBzaXplX3QgY3VycmVudF9zaXplID0gcGFnZS0+YnVja2V0LT5zbG90X3NpemU7CisgIGlmIChuZXdfc2l6ZSA9PSBjdXJyZW50X3NpemUpCisgICAgcmV0dXJuIHRydWU7CisKKyAgY2hhciogY2hhcl9wdHIgPSBzdGF0aWNfY2FzdDxjaGFyKj4oUGFydGl0aW9uUGFnZVRvUG9pbnRlcihwYWdlKSk7CisKKyAgaWYgKG5ld19zaXplIDwgY3VycmVudF9zaXplKSB7CisgICAgc2l6ZV90IG1hcF9zaXplID0gcGFydGl0aW9uUGFnZVRvRGlyZWN0TWFwRXh0ZW50KHBhZ2UpLT5tYXBfc2l6ZTsKKworICAgIC8vIERvbid0IHJlYWxsb2NhdGUgaW4tcGxhY2UgaWYgbmV3IHNpemUgaXMgbGVzcyB0aGFuIDgwICUgb2YgdGhlIGZ1bGwKKyAgICAvLyBtYXAgc2l6ZSwgdG8gYXZvaWQgaG9sZGluZyBvbiB0byB0b28gbXVjaCB1bnVzZWQgYWRkcmVzcyBzcGFjZS4KKyAgICBpZiAoKG5ld19zaXplIC8ga1N5c3RlbVBhZ2VTaXplKSAqIDUgPCAobWFwX3NpemUgLyBrU3lzdGVtUGFnZVNpemUpICogNCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFNocmluayBieSBkZWNvbW1pdHRpbmcgdW5uZWVkZWQgcGFnZXMgYW5kIG1ha2luZyB0aGVtIGluYWNjZXNzaWJsZS4KKyAgICBzaXplX3QgZGVjb21taXRTaXplID0gY3VycmVudF9zaXplIC0gbmV3X3NpemU7CisgICAgUGFydGl0aW9uRGVjb21taXRTeXN0ZW1QYWdlcyhyb290LCBjaGFyX3B0ciArIG5ld19zaXplLCBkZWNvbW1pdFNpemUpOworICAgIFNldFN5c3RlbVBhZ2VzSW5hY2Nlc3NpYmxlKGNoYXJfcHRyICsgbmV3X3NpemUsIGRlY29tbWl0U2l6ZSk7CisgIH0gZWxzZSBpZiAobmV3X3NpemUgPD0gcGFydGl0aW9uUGFnZVRvRGlyZWN0TWFwRXh0ZW50KHBhZ2UpLT5tYXBfc2l6ZSkgeworICAgIC8vIEdyb3cgd2l0aGluIHRoZSBhY3R1YWxseSBhbGxvY2F0ZWQgbWVtb3J5LiBKdXN0IG5lZWQgdG8gbWFrZSB0aGUKKyAgICAvLyBwYWdlcyBhY2Nlc3NpYmxlIGFnYWluLgorICAgIHNpemVfdCByZWNvbW1pdF9zaXplID0gbmV3X3NpemUgLSBjdXJyZW50X3NpemU7CisgICAgYm9vbCByZXQgPSBTZXRTeXN0ZW1QYWdlc0FjY2Vzc2libGUoY2hhcl9wdHIgKyBjdXJyZW50X3NpemUsIHJlY29tbWl0X3NpemUpOworICAgIENIRUNLKHJldCk7CisgICAgUGFydGl0aW9uUmVjb21taXRTeXN0ZW1QYWdlcyhyb290LCBjaGFyX3B0ciArIGN1cnJlbnRfc2l6ZSwgcmVjb21taXRfc2l6ZSk7CisKKyNpZiBEQ0hFQ0tfSVNfT04oKQorICAgIG1lbXNldChjaGFyX3B0ciArIGN1cnJlbnRfc2l6ZSwga1VuaW5pdGlhbGl6ZWRCeXRlLCByZWNvbW1pdF9zaXplKTsKKyNlbmRpZgorICB9IGVsc2UgeworICAgIC8vIFdlIGNhbid0IHBlcmZvcm0gdGhlIHJlYWxsb2MgaW4tcGxhY2UuCisgICAgLy8gVE9ETzogc3VwcG9ydCB0aGlzIHRvbyB3aGVuIHBvc3NpYmxlLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisjaWYgRENIRUNLX0lTX09OKCkKKyAgLy8gV3JpdGUgYSBuZXcgdHJhaWxpbmcgY29va2llLgorICBQYXJ0aXRpb25Db29raWVXcml0ZVZhbHVlKGNoYXJfcHRyICsgcmF3X3NpemUgLSBrQ29va2llU2l6ZSk7CisjZW5kaWYKKworICBQYXJ0aXRpb25QYWdlU2V0UmF3U2l6ZShwYWdlLCByYXdfc2l6ZSk7CisgIERDSEVDSyhQYXJ0aXRpb25QYWdlR2V0UmF3U2l6ZShwYWdlKSA9PSByYXdfc2l6ZSk7CisKKyAgcGFnZS0+YnVja2V0LT5zbG90X3NpemUgPSBuZXdfc2l6ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQqIFBhcnRpdGlvblJlYWxsb2NHZW5lcmljKFBhcnRpdGlvblJvb3RHZW5lcmljKiByb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5ld19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdHlwZV9uYW1lKSB7CisjaWYgZGVmaW5lZChNRU1PUllfVE9PTF9SRVBMQUNFU19BTExPQ0FUT1IpCisgIHJldHVybiByZWFsbG9jKHB0ciwgbmV3X3NpemUpOworI2Vsc2UKKyAgaWYgKFVOTElLRUxZKCFwdHIpKQorICAgIHJldHVybiBQYXJ0aXRpb25BbGxvY0dlbmVyaWMocm9vdCwgbmV3X3NpemUsIHR5cGVfbmFtZSk7CisgIGlmIChVTkxJS0VMWSghbmV3X3NpemUpKSB7CisgICAgUGFydGl0aW9uRnJlZUdlbmVyaWMocm9vdCwgcHRyKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChuZXdfc2l6ZSA+IGtHZW5lcmljTWF4RGlyZWN0TWFwcGVkKQorICAgIFBhcnRpdGlvbkV4Y2Vzc2l2ZUFsbG9jYXRpb25TaXplKCk7CisKKyAgRENIRUNLKFBhcnRpdGlvblBvaW50ZXJJc1ZhbGlkKFBhcnRpdGlvbkNvb2tpZUZyZWVQb2ludGVyQWRqdXN0KHB0cikpKTsKKworICBQYXJ0aXRpb25QYWdlKiBwYWdlID0KKyAgICAgIFBhcnRpdGlvblBvaW50ZXJUb1BhZ2UoUGFydGl0aW9uQ29va2llRnJlZVBvaW50ZXJBZGp1c3QocHRyKSk7CisKKyAgaWYgKFVOTElLRUxZKFBhcnRpdGlvbkJ1Y2tldElzRGlyZWN0TWFwcGVkKHBhZ2UtPmJ1Y2tldCkpKSB7CisgICAgLy8gV2UgbWF5IGJlIGFibGUgdG8gcGVyZm9ybSB0aGUgcmVhbGxvYyBpbiBwbGFjZSBieSBjaGFuZ2luZyB0aGUKKyAgICAvLyBhY2Nlc3NpYmlsaXR5IG9mIG1lbW9yeSBwYWdlcyBhbmQsIGlmIHJlZHVjaW5nIHRoZSBzaXplLCBkZWNvbW1pdHRpbmcKKyAgICAvLyB0aGVtLgorICAgIGlmIChwYXJ0aXRpb25SZWFsbG9jRGlyZWN0TWFwcGVkSW5QbGFjZShyb290LCBwYWdlLCBuZXdfc2l6ZSkpIHsKKyAgICAgIFBhcnRpdGlvbkFsbG9jSG9va3M6OlJlYWxsb2NIb29rSWZFbmFibGVkKHB0ciwgcHRyLCBuZXdfc2l6ZSwgdHlwZV9uYW1lKTsKKyAgICAgIHJldHVybiBwdHI7CisgICAgfQorICB9CisKKyAgc2l6ZV90IGFjdHVhbF9uZXdfc2l6ZSA9IFBhcnRpdGlvbkFsbG9jQWN0dWFsU2l6ZShyb290LCBuZXdfc2l6ZSk7CisgIHNpemVfdCBhY3R1YWxfb2xkX3NpemUgPSBQYXJ0aXRpb25BbGxvY0dldFNpemUocHRyKTsKKworICAvLyBUT0RPOiBub3RlIHRoYXQgdGNtYWxsb2Mgd2lsbCAiaWdub3JlIiBhIGRvd25zaXppbmcgcmVhbGxvYygpIHVubGVzcyB0aGUKKyAgLy8gbmV3IHNpemUgaXMgYSBzaWduaWZpY2FudCBwZXJjZW50YWdlIHNtYWxsZXIuIFdlIGNvdWxkIGRvIHRoZSBzYW1lIGlmIHdlCisgIC8vIGRldGVybWluZSBpdCBpcyBhIHdpbi4KKyAgaWYgKGFjdHVhbF9uZXdfc2l6ZSA9PSBhY3R1YWxfb2xkX3NpemUpIHsKKyAgICAvLyBUcnlpbmcgdG8gYWxsb2NhdGUgYSBibG9jayBvZiBzaXplIG5ld19zaXplIHdvdWxkIGdpdmUgdXMgYSBibG9jayBvZgorICAgIC8vIHRoZSBzYW1lIHNpemUgYXMgdGhlIG9uZSB3ZSd2ZSBhbHJlYWR5IGdvdCwgc28gcmUtdXNlIHRoZSBhbGxvY2F0aW9uCisgICAgLy8gYWZ0ZXIgdXBkYXRpbmcgc3RhdGlzdGljcyAoYW5kIGNvb2tpZXMsIGlmIHByZXNlbnQpLgorICAgIFBhcnRpdGlvblBhZ2VTZXRSYXdTaXplKHBhZ2UsIFBhcnRpdGlvbkNvb2tpZVNpemVBZGp1c3RBZGQobmV3X3NpemUpKTsKKyNpZiBEQ0hFQ0tfSVNfT04oKQorICAgIC8vIFdyaXRlIGEgbmV3IHRyYWlsaW5nIGNvb2tpZSB3aGVuIGl0IGlzIHBvc3NpYmxlIHRvIGtlZXAgdHJhY2sgb2YKKyAgICAvLyB8bmV3X3NpemV8IHZpYSB0aGUgcmF3IHNpemUgcG9pbnRlci4KKyAgICBpZiAoUGFydGl0aW9uUGFnZUdldFJhd1NpemVQdHIocGFnZSkpCisgICAgICBQYXJ0aXRpb25Db29raWVXcml0ZVZhbHVlKHN0YXRpY19jYXN0PGNoYXIqPihwdHIpICsgbmV3X3NpemUpOworI2VuZGlmCisgICAgcmV0dXJuIHB0cjsKKyAgfQorCisgIC8vIFRoaXMgcmVhbGxvYyBjYW5ub3QgYmUgcmVzaXplZCBpbi1wbGFjZS4gU2FkbmVzcy4KKyAgdm9pZCogcmV0ID0gUGFydGl0aW9uQWxsb2NHZW5lcmljKHJvb3QsIG5ld19zaXplLCB0eXBlX25hbWUpOworICBzaXplX3QgY29weV9zaXplID0gYWN0dWFsX29sZF9zaXplOworICBpZiAobmV3X3NpemUgPCBjb3B5X3NpemUpCisgICAgY29weV9zaXplID0gbmV3X3NpemU7CisKKyAgbWVtY3B5KHJldCwgcHRyLCBjb3B5X3NpemUpOworICBQYXJ0aXRpb25GcmVlR2VuZXJpYyhyb290LCBwdHIpOworICByZXR1cm4gcmV0OworI2VuZGlmCit9CisKK3N0YXRpYyBzaXplX3QgUGFydGl0aW9uUHVyZ2VQYWdlKFBhcnRpdGlvblBhZ2UqIHBhZ2UsIGJvb2wgZGlzY2FyZCkgeworICBjb25zdCBQYXJ0aXRpb25CdWNrZXQqIGJ1Y2tldCA9IHBhZ2UtPmJ1Y2tldDsKKyAgc2l6ZV90IHNsb3Rfc2l6ZSA9IGJ1Y2tldC0+c2xvdF9zaXplOworICBpZiAoc2xvdF9zaXplIDwga1N5c3RlbVBhZ2VTaXplIHx8ICFwYWdlLT5udW1fYWxsb2NhdGVkX3Nsb3RzKQorICAgIHJldHVybiAwOworCisgIHNpemVfdCBidWNrZXRfbnVtX3Nsb3RzID0gUGFydGl0aW9uQnVja2V0U2xvdHMoYnVja2V0KTsKKyAgc2l6ZV90IGRpc2NhcmRhYmxlX2J5dGVzID0gMDsKKworICBzaXplX3QgcmF3X3NpemUgPSBQYXJ0aXRpb25QYWdlR2V0UmF3U2l6ZShjb25zdF9jYXN0PFBhcnRpdGlvblBhZ2UqPihwYWdlKSk7CisgIGlmIChyYXdfc2l6ZSkgeworICAgIHVpbnQzMl90IHVzZWRCeXRlcyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihSb3VuZFVwVG9TeXN0ZW1QYWdlKHJhd19zaXplKSk7CisgICAgZGlzY2FyZGFibGVfYnl0ZXMgPSBidWNrZXQtPnNsb3Rfc2l6ZSAtIHVzZWRCeXRlczsKKyAgICBpZiAoZGlzY2FyZGFibGVfYnl0ZXMgJiYgZGlzY2FyZCkgeworICAgICAgY2hhciogcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oUGFydGl0aW9uUGFnZVRvUG9pbnRlcihwYWdlKSk7CisgICAgICBwdHIgKz0gdXNlZEJ5dGVzOworICAgICAgRGlzY2FyZFN5c3RlbVBhZ2VzKHB0ciwgZGlzY2FyZGFibGVfYnl0ZXMpOworICAgIH0KKyAgICByZXR1cm4gZGlzY2FyZGFibGVfYnl0ZXM7CisgIH0KKworICBjb25zdCBzaXplX3QgbWF4X3Nsb3RfY291bnQgPQorICAgICAgKGtQYXJ0aXRpb25QYWdlU2l6ZSAqIGtNYXhQYXJ0aXRpb25QYWdlc1BlclNsb3RTcGFuKSAvIGtTeXN0ZW1QYWdlU2l6ZTsKKyAgRENIRUNLKGJ1Y2tldF9udW1fc2xvdHMgPD0gbWF4X3Nsb3RfY291bnQpOworICBEQ0hFQ0socGFnZS0+bnVtX3VucHJvdmlzaW9uZWRfc2xvdHMgPCBidWNrZXRfbnVtX3Nsb3RzKTsKKyAgc2l6ZV90IG51bV9zbG90cyA9IGJ1Y2tldF9udW1fc2xvdHMgLSBwYWdlLT5udW1fdW5wcm92aXNpb25lZF9zbG90czsKKyAgY2hhciBzbG90X3VzYWdlW21heF9zbG90X2NvdW50XTsKKyAgc2l6ZV90IGxhc3Rfc2xvdCA9IHN0YXRpY19jYXN0PHNpemVfdD4oLTEpOworICBtZW1zZXQoc2xvdF91c2FnZSwgMSwgbnVtX3Nsb3RzKTsKKyAgY2hhciogcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oUGFydGl0aW9uUGFnZVRvUG9pbnRlcihwYWdlKSk7CisgIFBhcnRpdGlvbkZyZWVsaXN0RW50cnkqIGVudHJ5ID0gcGFnZS0+ZnJlZWxpc3RfaGVhZDsKKyAgLy8gRmlyc3QsIHdhbGsgdGhlIGZyZWVsaXN0IGZvciB0aGlzIHBhZ2UgYW5kIG1ha2UgYSBiaXRtYXAgb2Ygd2hpY2ggc2xvdHMKKyAgLy8gYXJlIG5vdCBpbiB1c2UuCisgIHdoaWxlIChlbnRyeSkgeworICAgIHNpemVfdCBzbG90SW5kZXggPSAocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZW50cnkpIC0gcHRyKSAvIHNsb3Rfc2l6ZTsKKyAgICBEQ0hFQ0soc2xvdEluZGV4IDwgbnVtX3Nsb3RzKTsKKyAgICBzbG90X3VzYWdlW3Nsb3RJbmRleF0gPSAwOworICAgIGVudHJ5ID0gUGFydGl0aW9uRnJlZWxpc3RNYXNrKGVudHJ5LT5uZXh0KTsKKyAgICAvLyBJZiB3ZSBoYXZlIGEgc2xvdCB3aGVyZSB0aGUgbWFza2VkIGZyZWVsaXN0IGVudHJ5IGlzIDAsIHdlIGNhbgorICAgIC8vIGFjdHVhbGx5IGRpc2NhcmQgdGhhdCBmcmVlbGlzdCBlbnRyeSBiZWNhdXNlIHRvdWNoaW5nIGEgZGlzY2FyZGVkCisgICAgLy8gcGFnZSBpcyBndWFyYW50ZWVkIHRvIHJldHVybiBvcmlnaW5hbCBjb250ZW50IG9yIDAuCisgICAgLy8gKE5vdGUgdGhhdCB0aGlzIG9wdGltaXphdGlvbiB3b24ndCBmaXJlIG9uIGJpZyBlbmRpYW4gbWFjaGluZXMKKyAgICAvLyBiZWNhdXNlIHRoZSBtYXNraW5nIGZ1bmN0aW9uIGlzIG5lZ2F0aW9uLikKKyAgICBpZiAoIVBhcnRpdGlvbkZyZWVsaXN0TWFzayhlbnRyeSkpCisgICAgICBsYXN0X3Nsb3QgPSBzbG90SW5kZXg7CisgIH0KKworICAvLyBJZiB0aGUgc2xvdChzKSBhdCB0aGUgZW5kIG9mIHRoZSBzbG90IHNwYW4gYXJlIG5vdCBpbiB1c2VkLCB3ZSBjYW4KKyAgLy8gdHJ1bmNhdGUgdGhlbSBlbnRpcmVseSBhbmQgcmV3cml0ZSB0aGUgZnJlZWxpc3QuCisgIHNpemVfdCB0cnVuY2F0ZWRfc2xvdHMgPSAwOworICB3aGlsZSAoIXNsb3RfdXNhZ2VbbnVtX3Nsb3RzIC0gMV0pIHsKKyAgICB0cnVuY2F0ZWRfc2xvdHMrKzsKKyAgICBudW1fc2xvdHMtLTsKKyAgICBEQ0hFQ0sobnVtX3Nsb3RzKTsKKyAgfQorICAvLyBGaXJzdCwgZG8gdGhlIHdvcmsgb2YgY2FsY3VsYXRpbmcgdGhlIGRpc2NhcmRhYmxlIGJ5dGVzLiBEb24ndCBhY3R1YWxseQorICAvLyBkaXNjYXJkIGFueXRoaW5nIHVubGVzcyB0aGUgZGlzY2FyZCBmbGFnIHdhcyBwYXNzZWQgaW4uCisgIGNoYXIqIGJlZ2luX3B0ciA9IG51bGxwdHI7CisgIGNoYXIqIGVuZF9wdHIgPSBudWxscHRyOworICBzaXplX3QgdW5wcm92aXNpb25lZF9ieXRlcyA9IDA7CisgIGlmICh0cnVuY2F0ZWRfc2xvdHMpIHsKKyAgICBiZWdpbl9wdHIgPSBwdHIgKyAobnVtX3Nsb3RzICogc2xvdF9zaXplKTsKKyAgICBlbmRfcHRyID0gYmVnaW5fcHRyICsgKHNsb3Rfc2l6ZSAqIHRydW5jYXRlZF9zbG90cyk7CisgICAgYmVnaW5fcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oCisgICAgICAgIFJvdW5kVXBUb1N5c3RlbVBhZ2UocmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KGJlZ2luX3B0cikpKTsKKyAgICAvLyBXZSByb3VuZCB0aGUgZW5kIHBvaW50ZXIgaGVyZSB1cCBhbmQgbm90IGRvd24gYmVjYXVzZSB3ZSdyZSBhdCB0aGUKKyAgICAvLyBlbmQgb2YgYSBzbG90IHNwYW4sIHNvIHdlICJvd24iIGFsbCB0aGUgd2F5IHVwIHRoZSBwYWdlIGJvdW5kYXJ5LgorICAgIGVuZF9wdHIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPigKKyAgICAgICAgUm91bmRVcFRvU3lzdGVtUGFnZShyZWludGVycHJldF9jYXN0PHNpemVfdD4oZW5kX3B0cikpKTsKKyAgICBEQ0hFQ0soZW5kX3B0ciA8PSBwdHIgKyBQYXJ0aXRpb25CdWNrZXRCeXRlcyhidWNrZXQpKTsKKyAgICBpZiAoYmVnaW5fcHRyIDwgZW5kX3B0cikgeworICAgICAgdW5wcm92aXNpb25lZF9ieXRlcyA9IGVuZF9wdHIgLSBiZWdpbl9wdHI7CisgICAgICBkaXNjYXJkYWJsZV9ieXRlcyArPSB1bnByb3Zpc2lvbmVkX2J5dGVzOworICAgIH0KKyAgfQorICBpZiAodW5wcm92aXNpb25lZF9ieXRlcyAmJiBkaXNjYXJkKSB7CisgICAgRENIRUNLKHRydW5jYXRlZF9zbG90cyA+IDApOworICAgIHNpemVfdCBudW1fbmV3X2VudHJpZXMgPSAwOworICAgIHBhZ2UtPm51bV91bnByb3Zpc2lvbmVkX3Nsb3RzICs9IHN0YXRpY19jYXN0PHVpbnQxNl90Pih0cnVuY2F0ZWRfc2xvdHMpOworICAgIC8vIFJld3JpdGUgdGhlIGZyZWVsaXN0LgorICAgIFBhcnRpdGlvbkZyZWVsaXN0RW50cnkqKiBlbnRyeV9wdHIgPSAmcGFnZS0+ZnJlZWxpc3RfaGVhZDsKKyAgICBmb3IgKHNpemVfdCBzbG90SW5kZXggPSAwOyBzbG90SW5kZXggPCBudW1fc2xvdHM7ICsrc2xvdEluZGV4KSB7CisgICAgICBpZiAoc2xvdF91c2FnZVtzbG90SW5kZXhdKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIFBhcnRpdGlvbkZyZWVsaXN0RW50cnkqIGVudHJ5ID0gcmVpbnRlcnByZXRfY2FzdDxQYXJ0aXRpb25GcmVlbGlzdEVudHJ5Kj4oCisgICAgICAgICAgcHRyICsgKHNsb3Rfc2l6ZSAqIHNsb3RJbmRleCkpOworICAgICAgKmVudHJ5X3B0ciA9IFBhcnRpdGlvbkZyZWVsaXN0TWFzayhlbnRyeSk7CisgICAgICBlbnRyeV9wdHIgPSByZWludGVycHJldF9jYXN0PFBhcnRpdGlvbkZyZWVsaXN0RW50cnkqKj4oZW50cnkpOworICAgICAgbnVtX25ld19lbnRyaWVzKys7CisgICAgfQorICAgIC8vIFRlcm1pbmF0ZSB0aGUgZnJlZWxpc3QgY2hhaW4uCisgICAgKmVudHJ5X3B0ciA9IG51bGxwdHI7CisgICAgLy8gVGhlIGZyZWVsaXN0IGhlYWQgaXMgc3RvcmVkIHVubWFza2VkLgorICAgIHBhZ2UtPmZyZWVsaXN0X2hlYWQgPSBQYXJ0aXRpb25GcmVlbGlzdE1hc2socGFnZS0+ZnJlZWxpc3RfaGVhZCk7CisgICAgRENIRUNLKG51bV9uZXdfZW50cmllcyA9PSBudW1fc2xvdHMgLSBwYWdlLT5udW1fYWxsb2NhdGVkX3Nsb3RzKTsKKyAgICAvLyBEaXNjYXJkIHRoZSBtZW1vcnkuCisgICAgRGlzY2FyZFN5c3RlbVBhZ2VzKGJlZ2luX3B0ciwgdW5wcm92aXNpb25lZF9ieXRlcyk7CisgIH0KKworICAvLyBOZXh0LCB3YWxrIHRoZSBzbG90cyBhbmQgZm9yIGFueSBub3QgaW4gdXNlLCBjb25zaWRlciB3aGVyZSB0aGUgc3lzdGVtCisgIC8vIHBhZ2UgYm91bmRhcmllcyBvY2N1ci4gV2UgY2FuIHJlbGVhc2UgYW55IHN5c3RlbSBwYWdlcyBiYWNrIHRvIHRoZQorICAvLyBzeXN0ZW0gYXMgbG9uZyBhcyB3ZSBkb24ndCBpbnRlcmZlcmUgd2l0aCBhIGZyZWVsaXN0IHBvaW50ZXIgb3IgYW4KKyAgLy8gYWRqYWNlbnQgc2xvdC4KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fc2xvdHM7ICsraSkgeworICAgIGlmIChzbG90X3VzYWdlW2ldKQorICAgICAgY29udGludWU7CisgICAgLy8gVGhlIGZpcnN0IGFkZHJlc3Mgd2UgY2FuIHNhZmVseSBkaXNjYXJkIGlzIGp1c3QgYWZ0ZXIgdGhlIGZyZWVsaXN0CisgICAgLy8gcG9pbnRlci4gVGhlcmUncyBvbmUgcXVpcms6IGlmIHRoZSBmcmVlbGlzdCBwb2ludGVyIGlzIGFjdHVhbGx5IGEKKyAgICAvLyBudWxsLCB3ZSBjYW4gZGlzY2FyZCB0aGF0IHBvaW50ZXIgdmFsdWUgdG9vLgorICAgIGNoYXIqIGJlZ2luX3B0ciA9IHB0ciArIChpICogc2xvdF9zaXplKTsKKyAgICBjaGFyKiBlbmRfcHRyID0gYmVnaW5fcHRyICsgc2xvdF9zaXplOworICAgIGlmIChpICE9IGxhc3Rfc2xvdCkKKyAgICAgIGJlZ2luX3B0ciArPSBzaXplb2YoUGFydGl0aW9uRnJlZWxpc3RFbnRyeSk7CisgICAgYmVnaW5fcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oCisgICAgICAgIFJvdW5kVXBUb1N5c3RlbVBhZ2UocmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KGJlZ2luX3B0cikpKTsKKyAgICBlbmRfcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oCisgICAgICAgIFJvdW5kRG93blRvU3lzdGVtUGFnZShyZWludGVycHJldF9jYXN0PHNpemVfdD4oZW5kX3B0cikpKTsKKyAgICBpZiAoYmVnaW5fcHRyIDwgZW5kX3B0cikgeworICAgICAgc2l6ZV90IHBhcnRpYWxfc2xvdF9ieXRlcyA9IGVuZF9wdHIgLSBiZWdpbl9wdHI7CisgICAgICBkaXNjYXJkYWJsZV9ieXRlcyArPSBwYXJ0aWFsX3Nsb3RfYnl0ZXM7CisgICAgICBpZiAoZGlzY2FyZCkKKyAgICAgICAgRGlzY2FyZFN5c3RlbVBhZ2VzKGJlZ2luX3B0ciwgcGFydGlhbF9zbG90X2J5dGVzKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGRpc2NhcmRhYmxlX2J5dGVzOworfQorCitzdGF0aWMgdm9pZCBQYXJ0aXRpb25QdXJnZUJ1Y2tldChQYXJ0aXRpb25CdWNrZXQqIGJ1Y2tldCkgeworICBpZiAoYnVja2V0LT5hY3RpdmVfcGFnZXNfaGVhZCAhPSAmUGFydGl0aW9uUm9vdEdlbmVyaWM6OmdTZWVkUGFnZSkgeworICAgIGZvciAoUGFydGl0aW9uUGFnZSogcGFnZSA9IGJ1Y2tldC0+YWN0aXZlX3BhZ2VzX2hlYWQ7IHBhZ2U7CisgICAgICAgICBwYWdlID0gcGFnZS0+bmV4dF9wYWdlKSB7CisgICAgICBEQ0hFQ0socGFnZSAhPSAmUGFydGl0aW9uUm9vdEdlbmVyaWM6OmdTZWVkUGFnZSk7CisgICAgICAodm9pZClQYXJ0aXRpb25QdXJnZVBhZ2UocGFnZSwgdHJ1ZSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgUGFydGl0aW9uUHVyZ2VNZW1vcnkoUGFydGl0aW9uUm9vdCogcm9vdCwgaW50IGZsYWdzKSB7CisgIGlmIChmbGFncyAmIFBhcnRpdGlvblB1cmdlRGVjb21taXRFbXB0eVBhZ2VzKQorICAgIFBhcnRpdGlvbkRlY29tbWl0RW1wdHlQYWdlcyhyb290KTsKKyAgLy8gV2UgZG9uJ3QgY3VycmVudGx5IGRvIGFueXRoaW5nIGZvciBQYXJ0aXRpb25QdXJnZURpc2NhcmRVbnVzZWRTeXN0ZW1QYWdlcworICAvLyBoZXJlIGJlY2F1c2UgdGhhdCBmbGFnIGlzIG9ubHkgdXNlZnVsIGZvciBhbGxvY2F0aW9ucyA+PSBzeXN0ZW0gcGFnZQorICAvLyBzaXplLiBXZSBvbmx5IGhhdmUgYWxsb2NhdGlvbnMgdGhhdCBsYXJnZSBpbnNpZGUgZ2VuZXJpYyBwYXJ0aXRpb25zCisgIC8vIGF0IHRoZSBtb21lbnQuCit9CisKK3ZvaWQgUGFydGl0aW9uUHVyZ2VNZW1vcnlHZW5lcmljKFBhcnRpdGlvblJvb3RHZW5lcmljKiByb290LCBpbnQgZmxhZ3MpIHsKKyAgc3VidGxlOjpTcGluTG9jazo6R3VhcmQgZ3VhcmQocm9vdC0+bG9jayk7CisgIGlmIChmbGFncyAmIFBhcnRpdGlvblB1cmdlRGVjb21taXRFbXB0eVBhZ2VzKQorICAgIFBhcnRpdGlvbkRlY29tbWl0RW1wdHlQYWdlcyhyb290KTsKKyAgaWYgKGZsYWdzICYgUGFydGl0aW9uUHVyZ2VEaXNjYXJkVW51c2VkU3lzdGVtUGFnZXMpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtHZW5lcmljTnVtQnVja2V0czsgKytpKSB7CisgICAgICBQYXJ0aXRpb25CdWNrZXQqIGJ1Y2tldCA9ICZyb290LT5idWNrZXRzW2ldOworICAgICAgaWYgKGJ1Y2tldC0+c2xvdF9zaXplID49IGtTeXN0ZW1QYWdlU2l6ZSkKKyAgICAgICAgUGFydGl0aW9uUHVyZ2VCdWNrZXQoYnVja2V0KTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgUGFydGl0aW9uRHVtcFBhZ2VTdGF0cyhQYXJ0aXRpb25CdWNrZXRNZW1vcnlTdGF0cyogc3RhdHNfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJ0aXRpb25QYWdlKiBwYWdlKSB7CisgIHVpbnQxNl90IGJ1Y2tldF9udW1fc2xvdHMgPSBQYXJ0aXRpb25CdWNrZXRTbG90cyhwYWdlLT5idWNrZXQpOworCisgIGlmIChQYXJ0aXRpb25QYWdlU3RhdGVJc0RlY29tbWl0dGVkKHBhZ2UpKSB7CisgICAgKytzdGF0c19vdXQtPm51bV9kZWNvbW1pdHRlZF9wYWdlczsKKyAgICByZXR1cm47CisgIH0KKworICBzdGF0c19vdXQtPmRpc2NhcmRhYmxlX2J5dGVzICs9CisgICAgICBQYXJ0aXRpb25QdXJnZVBhZ2UoY29uc3RfY2FzdDxQYXJ0aXRpb25QYWdlKj4ocGFnZSksIGZhbHNlKTsKKworICBzaXplX3QgcmF3X3NpemUgPSBQYXJ0aXRpb25QYWdlR2V0UmF3U2l6ZShjb25zdF9jYXN0PFBhcnRpdGlvblBhZ2UqPihwYWdlKSk7CisgIGlmIChyYXdfc2l6ZSkKKyAgICBzdGF0c19vdXQtPmFjdGl2ZV9ieXRlcyArPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocmF3X3NpemUpOworICBlbHNlCisgICAgc3RhdHNfb3V0LT5hY3RpdmVfYnl0ZXMgKz0KKyAgICAgICAgKHBhZ2UtPm51bV9hbGxvY2F0ZWRfc2xvdHMgKiBzdGF0c19vdXQtPmJ1Y2tldF9zbG90X3NpemUpOworCisgIHNpemVfdCBwYWdlX2J5dGVzX3Jlc2lkZW50ID0KKyAgICAgIFJvdW5kVXBUb1N5c3RlbVBhZ2UoKGJ1Y2tldF9udW1fc2xvdHMgLSBwYWdlLT5udW1fdW5wcm92aXNpb25lZF9zbG90cykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0c19vdXQtPmJ1Y2tldF9zbG90X3NpemUpOworICBzdGF0c19vdXQtPnJlc2lkZW50X2J5dGVzICs9IHBhZ2VfYnl0ZXNfcmVzaWRlbnQ7CisgIGlmIChQYXJ0aXRpb25QYWdlU3RhdGVJc0VtcHR5KHBhZ2UpKSB7CisgICAgc3RhdHNfb3V0LT5kZWNvbW1pdHRhYmxlX2J5dGVzICs9IHBhZ2VfYnl0ZXNfcmVzaWRlbnQ7CisgICAgKytzdGF0c19vdXQtPm51bV9lbXB0eV9wYWdlczsKKyAgfSBlbHNlIGlmIChQYXJ0aXRpb25QYWdlU3RhdGVJc0Z1bGwocGFnZSkpIHsKKyAgICArK3N0YXRzX291dC0+bnVtX2Z1bGxfcGFnZXM7CisgIH0gZWxzZSB7CisgICAgRENIRUNLKFBhcnRpdGlvblBhZ2VTdGF0ZUlzQWN0aXZlKHBhZ2UpKTsKKyAgICArK3N0YXRzX291dC0+bnVtX2FjdGl2ZV9wYWdlczsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBQYXJ0aXRpb25EdW1wQnVja2V0U3RhdHMoUGFydGl0aW9uQnVja2V0TWVtb3J5U3RhdHMqIHN0YXRzX291dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJ0aXRpb25CdWNrZXQqIGJ1Y2tldCkgeworICBEQ0hFQ0soIVBhcnRpdGlvbkJ1Y2tldElzRGlyZWN0TWFwcGVkKGJ1Y2tldCkpOworICBzdGF0c19vdXQtPmlzX3ZhbGlkID0gZmFsc2U7CisgIC8vIElmIHRoZSBhY3RpdmUgcGFnZSBsaXN0IGlzIGVtcHR5ICg9PSAmUGFydGl0aW9uUm9vdEdlbmVyaWM6OmdTZWVkUGFnZSksCisgIC8vIHRoZSBidWNrZXQgbWlnaHQgc3RpbGwgbmVlZCB0byBiZSByZXBvcnRlZCBpZiBpdCBoYXMgYSBsaXN0IG9mIGVtcHR5LAorICAvLyBkZWNvbW1pdHRlZCBvciBmdWxsIHBhZ2VzLgorICBpZiAoYnVja2V0LT5hY3RpdmVfcGFnZXNfaGVhZCA9PSAmUGFydGl0aW9uUm9vdEdlbmVyaWM6OmdTZWVkUGFnZSAmJgorICAgICAgIWJ1Y2tldC0+ZW1wdHlfcGFnZXNfaGVhZCAmJiAhYnVja2V0LT5kZWNvbW1pdHRlZF9wYWdlc19oZWFkICYmCisgICAgICAhYnVja2V0LT5udW1fZnVsbF9wYWdlcykKKyAgICByZXR1cm47CisKKyAgbWVtc2V0KHN0YXRzX291dCwgJ1wwJywgc2l6ZW9mKCpzdGF0c19vdXQpKTsKKyAgc3RhdHNfb3V0LT5pc192YWxpZCA9IHRydWU7CisgIHN0YXRzX291dC0+aXNfZGlyZWN0X21hcCA9IGZhbHNlOworICBzdGF0c19vdXQtPm51bV9mdWxsX3BhZ2VzID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihidWNrZXQtPm51bV9mdWxsX3BhZ2VzKTsKKyAgc3RhdHNfb3V0LT5idWNrZXRfc2xvdF9zaXplID0gYnVja2V0LT5zbG90X3NpemU7CisgIHVpbnQxNl90IGJ1Y2tldF9udW1fc2xvdHMgPSBQYXJ0aXRpb25CdWNrZXRTbG90cyhidWNrZXQpOworICBzaXplX3QgYnVja2V0X3VzZWZ1bF9zdG9yYWdlID0gc3RhdHNfb3V0LT5idWNrZXRfc2xvdF9zaXplICogYnVja2V0X251bV9zbG90czsKKyAgc3RhdHNfb3V0LT5hbGxvY2F0ZWRfcGFnZV9zaXplID0gUGFydGl0aW9uQnVja2V0Qnl0ZXMoYnVja2V0KTsKKyAgc3RhdHNfb3V0LT5hY3RpdmVfYnl0ZXMgPSBidWNrZXQtPm51bV9mdWxsX3BhZ2VzICogYnVja2V0X3VzZWZ1bF9zdG9yYWdlOworICBzdGF0c19vdXQtPnJlc2lkZW50X2J5dGVzID0KKyAgICAgIGJ1Y2tldC0+bnVtX2Z1bGxfcGFnZXMgKiBzdGF0c19vdXQtPmFsbG9jYXRlZF9wYWdlX3NpemU7CisKKyAgZm9yIChjb25zdCBQYXJ0aXRpb25QYWdlKiBwYWdlID0gYnVja2V0LT5lbXB0eV9wYWdlc19oZWFkOyBwYWdlOworICAgICAgIHBhZ2UgPSBwYWdlLT5uZXh0X3BhZ2UpIHsKKyAgICBEQ0hFQ0soUGFydGl0aW9uUGFnZVN0YXRlSXNFbXB0eShwYWdlKSB8fAorICAgICAgICAgICBQYXJ0aXRpb25QYWdlU3RhdGVJc0RlY29tbWl0dGVkKHBhZ2UpKTsKKyAgICBQYXJ0aXRpb25EdW1wUGFnZVN0YXRzKHN0YXRzX291dCwgcGFnZSk7CisgIH0KKyAgZm9yIChjb25zdCBQYXJ0aXRpb25QYWdlKiBwYWdlID0gYnVja2V0LT5kZWNvbW1pdHRlZF9wYWdlc19oZWFkOyBwYWdlOworICAgICAgIHBhZ2UgPSBwYWdlLT5uZXh0X3BhZ2UpIHsKKyAgICBEQ0hFQ0soUGFydGl0aW9uUGFnZVN0YXRlSXNEZWNvbW1pdHRlZChwYWdlKSk7CisgICAgUGFydGl0aW9uRHVtcFBhZ2VTdGF0cyhzdGF0c19vdXQsIHBhZ2UpOworICB9CisKKyAgaWYgKGJ1Y2tldC0+YWN0aXZlX3BhZ2VzX2hlYWQgIT0gJlBhcnRpdGlvblJvb3RHZW5lcmljOjpnU2VlZFBhZ2UpIHsKKyAgICBmb3IgKGNvbnN0IFBhcnRpdGlvblBhZ2UqIHBhZ2UgPSBidWNrZXQtPmFjdGl2ZV9wYWdlc19oZWFkOyBwYWdlOworICAgICAgICAgcGFnZSA9IHBhZ2UtPm5leHRfcGFnZSkgeworICAgICAgRENIRUNLKHBhZ2UgIT0gJlBhcnRpdGlvblJvb3RHZW5lcmljOjpnU2VlZFBhZ2UpOworICAgICAgUGFydGl0aW9uRHVtcFBhZ2VTdGF0cyhzdGF0c19vdXQsIHBhZ2UpOworICAgIH0KKyAgfQorfQorCit2b2lkIFBhcnRpdGlvbkR1bXBTdGF0c0dlbmVyaWMoUGFydGl0aW9uUm9vdEdlbmVyaWMqIHBhcnRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJ0aXRpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2xpZ2h0X2R1bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uU3RhdHNEdW1wZXIqIGR1bXBlcikgeworICBQYXJ0aXRpb25NZW1vcnlTdGF0cyBzdGF0cyA9IHswfTsKKyAgc3RhdHMudG90YWxfbW1hcHBlZF9ieXRlcyA9IHBhcnRpdGlvbi0+dG90YWxfc2l6ZV9vZl9zdXBlcl9wYWdlcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24tPnRvdGFsX3NpemVfb2ZfZGlyZWN0X21hcHBlZF9wYWdlczsKKyAgc3RhdHMudG90YWxfY29tbWl0dGVkX2J5dGVzID0gcGFydGl0aW9uLT50b3RhbF9zaXplX29mX2NvbW1pdHRlZF9wYWdlczsKKworICBzaXplX3QgZGlyZWN0X21hcHBlZF9hbGxvY2F0aW9uc190b3RhbF9zaXplID0gMDsKKworICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhSZXBvcnRhYmxlRGlyZWN0TWFwcyA9IDQwOTY7CisKKyAgLy8gQWxsb2NhdGUgb24gdGhlIGhlYXAgcmF0aGVyIHRoYW4gb24gdGhlIHN0YWNrIHRvIGF2b2lkIHN0YWNrIG92ZXJmbG93CisgIC8vIHNraXJtaXNoZXMgKG9uIFdpbmRvd3MsIGluIHBhcnRpY3VsYXIpLgorICBzdGQ6OnVuaXF1ZV9wdHI8dWludDMyX3RbXT4gZGlyZWN0X21hcF9sZW5ndGhzID0gbnVsbHB0cjsKKyAgaWYgKCFpc19saWdodF9kdW1wKSB7CisgICAgZGlyZWN0X21hcF9sZW5ndGhzID0KKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQzMl90W10+KG5ldyB1aW50MzJfdFtrTWF4UmVwb3J0YWJsZURpcmVjdE1hcHNdKTsKKyAgfQorCisgIFBhcnRpdGlvbkJ1Y2tldE1lbW9yeVN0YXRzIGJ1Y2tldF9zdGF0c1trR2VuZXJpY051bUJ1Y2tldHNdOworICBzaXplX3QgbnVtX2RpcmVjdF9tYXBwZWRfYWxsb2NhdGlvbnMgPSAwOworICB7CisgICAgc3VidGxlOjpTcGluTG9jazo6R3VhcmQgZ3VhcmQocGFydGl0aW9uLT5sb2NrKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga0dlbmVyaWNOdW1CdWNrZXRzOyArK2kpIHsKKyAgICAgIGNvbnN0IFBhcnRpdGlvbkJ1Y2tldCogYnVja2V0ID0gJnBhcnRpdGlvbi0+YnVja2V0c1tpXTsKKyAgICAgIC8vIERvbid0IHJlcG9ydCB0aGUgcHNldWRvIGJ1Y2tldHMgdGhhdCB0aGUgZ2VuZXJpYyBhbGxvY2F0b3Igc2V0cyB1cCBpbgorICAgICAgLy8gb3JkZXIgdG8gcHJlc2VydmUgYSBmYXN0IHNpemUtPmJ1Y2tldCBtYXAgKHNlZQorICAgICAgLy8gUGFydGl0aW9uQWxsb2NHZW5lcmljSW5pdCBmb3IgZGV0YWlscykuCisgICAgICBpZiAoIWJ1Y2tldC0+YWN0aXZlX3BhZ2VzX2hlYWQpCisgICAgICAgIGJ1Y2tldF9zdGF0c1tpXS5pc192YWxpZCA9IGZhbHNlOworICAgICAgZWxzZQorICAgICAgICBQYXJ0aXRpb25EdW1wQnVja2V0U3RhdHMoJmJ1Y2tldF9zdGF0c1tpXSwgYnVja2V0KTsKKyAgICAgIGlmIChidWNrZXRfc3RhdHNbaV0uaXNfdmFsaWQpIHsKKyAgICAgICAgc3RhdHMudG90YWxfcmVzaWRlbnRfYnl0ZXMgKz0gYnVja2V0X3N0YXRzW2ldLnJlc2lkZW50X2J5dGVzOworICAgICAgICBzdGF0cy50b3RhbF9hY3RpdmVfYnl0ZXMgKz0gYnVja2V0X3N0YXRzW2ldLmFjdGl2ZV9ieXRlczsKKyAgICAgICAgc3RhdHMudG90YWxfZGVjb21taXR0YWJsZV9ieXRlcyArPSBidWNrZXRfc3RhdHNbaV0uZGVjb21taXR0YWJsZV9ieXRlczsKKyAgICAgICAgc3RhdHMudG90YWxfZGlzY2FyZGFibGVfYnl0ZXMgKz0gYnVja2V0X3N0YXRzW2ldLmRpc2NhcmRhYmxlX2J5dGVzOworICAgICAgfQorICAgIH0KKworICAgIGZvciAoUGFydGl0aW9uRGlyZWN0TWFwRXh0ZW50ICpleHRlbnQgPSBwYXJ0aXRpb24tPmRpcmVjdF9tYXBfbGlzdDsKKyAgICAgICAgIGV4dGVudCAmJiBudW1fZGlyZWN0X21hcHBlZF9hbGxvY2F0aW9ucyA8IGtNYXhSZXBvcnRhYmxlRGlyZWN0TWFwczsKKyAgICAgICAgIGV4dGVudCA9IGV4dGVudC0+bmV4dF9leHRlbnQsICsrbnVtX2RpcmVjdF9tYXBwZWRfYWxsb2NhdGlvbnMpIHsKKyAgICAgIERDSEVDSyghZXh0ZW50LT5uZXh0X2V4dGVudCB8fAorICAgICAgICAgICAgIGV4dGVudC0+bmV4dF9leHRlbnQtPnByZXZfZXh0ZW50ID09IGV4dGVudCk7CisgICAgICBzaXplX3Qgc2xvdF9zaXplID0gZXh0ZW50LT5idWNrZXQtPnNsb3Rfc2l6ZTsKKyAgICAgIGRpcmVjdF9tYXBwZWRfYWxsb2NhdGlvbnNfdG90YWxfc2l6ZSArPSBzbG90X3NpemU7CisgICAgICBpZiAoaXNfbGlnaHRfZHVtcCkKKyAgICAgICAgY29udGludWU7CisgICAgICBkaXJlY3RfbWFwX2xlbmd0aHNbbnVtX2RpcmVjdF9tYXBwZWRfYWxsb2NhdGlvbnNdID0gc2xvdF9zaXplOworICAgIH0KKyAgfQorCisgIGlmICghaXNfbGlnaHRfZHVtcCkgeworICAgIC8vIENhbGwgfFBhcnRpdGlvbnNEdW1wQnVja2V0U3RhdHN8IGFmdGVyIGNvbGxlY3Rpbmcgc3RhdHMgYmVjYXVzZSBpdCBjYW4KKyAgICAvLyB0cnkgdG8gYWxsb2NhdGUgdXNpbmcgfFBhcnRpdGlvbkFsbG9jR2VuZXJpY3wgYW5kIGl0IGNhbid0IG9idGFpbiB0aGUKKyAgICAvLyBsb2NrLgorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga0dlbmVyaWNOdW1CdWNrZXRzOyArK2kpIHsKKyAgICAgIGlmIChidWNrZXRfc3RhdHNbaV0uaXNfdmFsaWQpCisgICAgICAgIGR1bXBlci0+UGFydGl0aW9uc0R1bXBCdWNrZXRTdGF0cyhwYXJ0aXRpb25fbmFtZSwgJmJ1Y2tldF9zdGF0c1tpXSk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fZGlyZWN0X21hcHBlZF9hbGxvY2F0aW9uczsgKytpKSB7CisgICAgICB1aW50MzJfdCBzaXplID0gZGlyZWN0X21hcF9sZW5ndGhzW2ldOworCisgICAgICBQYXJ0aXRpb25CdWNrZXRNZW1vcnlTdGF0cyBzdGF0czsKKyAgICAgIG1lbXNldCgmc3RhdHMsICdcMCcsIHNpemVvZihzdGF0cykpOworICAgICAgc3RhdHMuaXNfdmFsaWQgPSB0cnVlOworICAgICAgc3RhdHMuaXNfZGlyZWN0X21hcCA9IHRydWU7CisgICAgICBzdGF0cy5udW1fZnVsbF9wYWdlcyA9IDE7CisgICAgICBzdGF0cy5hbGxvY2F0ZWRfcGFnZV9zaXplID0gc2l6ZTsKKyAgICAgIHN0YXRzLmJ1Y2tldF9zbG90X3NpemUgPSBzaXplOworICAgICAgc3RhdHMuYWN0aXZlX2J5dGVzID0gc2l6ZTsKKyAgICAgIHN0YXRzLnJlc2lkZW50X2J5dGVzID0gc2l6ZTsKKyAgICAgIGR1bXBlci0+UGFydGl0aW9uc0R1bXBCdWNrZXRTdGF0cyhwYXJ0aXRpb25fbmFtZSwgJnN0YXRzKTsKKyAgICB9CisgIH0KKworICBzdGF0cy50b3RhbF9yZXNpZGVudF9ieXRlcyArPSBkaXJlY3RfbWFwcGVkX2FsbG9jYXRpb25zX3RvdGFsX3NpemU7CisgIHN0YXRzLnRvdGFsX2FjdGl2ZV9ieXRlcyArPSBkaXJlY3RfbWFwcGVkX2FsbG9jYXRpb25zX3RvdGFsX3NpemU7CisgIGR1bXBlci0+UGFydGl0aW9uRHVtcFRvdGFscyhwYXJ0aXRpb25fbmFtZSwgJnN0YXRzKTsKK30KKwordm9pZCBQYXJ0aXRpb25EdW1wU3RhdHMoUGFydGl0aW9uUm9vdCogcGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFydGl0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2xpZ2h0X2R1bXAsCisgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aXRpb25TdGF0c0R1bXBlciogZHVtcGVyKSB7CisgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heFJlcG9ydGFibGVCdWNrZXRzID0gNDA5NiAvIHNpemVvZih2b2lkKik7CisgIFBhcnRpdGlvbkJ1Y2tldE1lbW9yeVN0YXRzIG1lbW9yeV9zdGF0c1trTWF4UmVwb3J0YWJsZUJ1Y2tldHNdOworICBjb25zdCBzaXplX3QgcGFydGl0aW9uTnVtQnVja2V0cyA9IHBhcnRpdGlvbi0+bnVtX2J1Y2tldHM7CisgIERDSEVDSyhwYXJ0aXRpb25OdW1CdWNrZXRzIDw9IGtNYXhSZXBvcnRhYmxlQnVja2V0cyk7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJ0aXRpb25OdW1CdWNrZXRzOyArK2kpCisgICAgUGFydGl0aW9uRHVtcEJ1Y2tldFN0YXRzKCZtZW1vcnlfc3RhdHNbaV0sICZwYXJ0aXRpb24tPmJ1Y2tldHMoKVtpXSk7CisKKyAgLy8gUGFydGl0aW9uc0R1bXBCdWNrZXRTdGF0cyBpcyBjYWxsZWQgYWZ0ZXIgY29sbGVjdGluZyBzdGF0cyBiZWNhdXNlIGl0CisgIC8vIGNhbiB1c2UgUGFydGl0aW9uQWxsb2MgdG8gYWxsb2NhdGUgYW5kIHRoaXMgY2FuIGFmZmVjdCB0aGUgc3RhdGlzdGljcy4KKyAgUGFydGl0aW9uTWVtb3J5U3RhdHMgc3RhdHMgPSB7MH07CisgIHN0YXRzLnRvdGFsX21tYXBwZWRfYnl0ZXMgPSBwYXJ0aXRpb24tPnRvdGFsX3NpemVfb2Zfc3VwZXJfcGFnZXM7CisgIHN0YXRzLnRvdGFsX2NvbW1pdHRlZF9ieXRlcyA9IHBhcnRpdGlvbi0+dG90YWxfc2l6ZV9vZl9jb21taXR0ZWRfcGFnZXM7CisgIERDSEVDSyghcGFydGl0aW9uLT50b3RhbF9zaXplX29mX2RpcmVjdF9tYXBwZWRfcGFnZXMpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcnRpdGlvbk51bUJ1Y2tldHM7ICsraSkgeworICAgIGlmIChtZW1vcnlfc3RhdHNbaV0uaXNfdmFsaWQpIHsKKyAgICAgIHN0YXRzLnRvdGFsX3Jlc2lkZW50X2J5dGVzICs9IG1lbW9yeV9zdGF0c1tpXS5yZXNpZGVudF9ieXRlczsKKyAgICAgIHN0YXRzLnRvdGFsX2FjdGl2ZV9ieXRlcyArPSBtZW1vcnlfc3RhdHNbaV0uYWN0aXZlX2J5dGVzOworICAgICAgc3RhdHMudG90YWxfZGVjb21taXR0YWJsZV9ieXRlcyArPSBtZW1vcnlfc3RhdHNbaV0uZGVjb21taXR0YWJsZV9ieXRlczsKKyAgICAgIHN0YXRzLnRvdGFsX2Rpc2NhcmRhYmxlX2J5dGVzICs9IG1lbW9yeV9zdGF0c1tpXS5kaXNjYXJkYWJsZV9ieXRlczsKKyAgICAgIGlmICghaXNfbGlnaHRfZHVtcCkKKyAgICAgICAgZHVtcGVyLT5QYXJ0aXRpb25zRHVtcEJ1Y2tldFN0YXRzKHBhcnRpdGlvbl9uYW1lLCAmbWVtb3J5X3N0YXRzW2ldKTsKKyAgICB9CisgIH0KKyAgZHVtcGVyLT5QYXJ0aXRpb25EdW1wVG90YWxzKHBhcnRpdGlvbl9uYW1lLCAmc3RhdHMpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIHBkZml1bQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmFzZS9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jYXRvci9wYXJ0aXRpb25fYWxsb2MuaCBiL3RoaXJkX3BhcnR5L2Jhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U4NDE1YwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jLmgKQEAgLTAsMCArMSw5MTEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMyBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgQkFTRV9BTExPQ0FUT1JfUEFSVElUSU9OX0FMTE9DQVRPUl9QQVJUSVRJT05fQUxMT0NfSAorI2RlZmluZSBCQVNFX0FMTE9DQVRPUl9QQVJUSVRJT05fQUxMT0NBVE9SX1BBUlRJVElPTl9BTExPQ19ICisKKy8vIERFU0NSSVBUSU9OCisvLyBwYXJ0aXRpb25BbGxvYygpIC8gUGFydGl0aW9uQWxsb2NHZW5lcmljKCkgYW5kIFBhcnRpdGlvbkZyZWUoKSAvCisvLyBQYXJ0aXRpb25GcmVlR2VuZXJpYygpIGFyZSBhcHByb3hpbWF0ZWx5IGFuYWxhZ291cyB0byBtYWxsb2MoKSBhbmQgZnJlZSgpLgorLy8KKy8vIFRoZSBtYWluIGRpZmZlcmVuY2UgaXMgdGhhdCBhIFBhcnRpdGlvblJvb3QgLyBQYXJ0aXRpb25Sb290R2VuZXJpYyBvYmplY3QKKy8vIG11c3QgYmUgc3VwcGxpZWQgdG8gdGhlc2UgZnVuY3Rpb25zLCByZXByZXNlbnRpbmcgYSBzcGVjaWZpYyAiaGVhcCBwYXJ0aXRpb24iCisvLyB0aGF0IHdpbGwgYmUgdXNlZCB0byBzYXRpc2Z5IHRoZSBhbGxvY2F0aW9uLiBEaWZmZXJlbnQgcGFydGl0aW9ucyBhcmUKKy8vIGd1YXJhbnRlZWQgdG8gZXhpc3QgaW4gc2VwYXJhdGUgYWRkcmVzcyBzcGFjZXMsIGluY2x1ZGluZyBiZWluZyBzZXBhcmF0ZSBmcm9tCisvLyB0aGUgbWFpbiBzeXN0ZW0gaGVhcC4gSWYgdGhlIGNvbnRhaW5lZCBvYmplY3RzIGFyZSBhbGwgZnJlZWQsIHBoeXNpY2FsIG1lbW9yeQorLy8gaXMgcmV0dXJuZWQgdG8gdGhlIHN5c3RlbSBidXQgdGhlIGFkZHJlc3Mgc3BhY2UgcmVtYWlucyByZXNlcnZlZC4KKy8vIFNlZSBQYXJ0aXRpb25BbGxvYy5tZCBmb3Igb3RoZXIgc2VjdXJpdHkgcHJvcGVydGllcyBQYXJ0aXRpb25BbGxvYyBwcm92aWRlcy4KKy8vCisvLyBUSEUgT05MWSBMRUdJVElNQVRFIFdBWSBUTyBPQlRBSU4gQSBQYXJ0aXRpb25Sb290IElTIFRIUk9VR0ggVEhFCisvLyBTaXplU3BlY2lmaWNQYXJ0aXRpb25BbGxvY2F0b3IgLyBQYXJ0aXRpb25BbGxvY2F0b3JHZW5lcmljIGNsYXNzZXMuIFRvCisvLyBtaW5pbWl6ZSB0aGUgaW5zdHJ1Y3Rpb24gY291bnQgdG8gdGhlIGZ1bGxlc3QgZXh0ZW50IHBvc3NpYmxlLCB0aGUKKy8vIFBhcnRpdGlvblJvb3QgaXMgcmVhbGx5IGp1c3QgYSBoZWFkZXIgYWRqYWNlbnQgdG8gb3RoZXIgZGF0YSBhcmVhcyBwcm92aWRlZAorLy8gYnkgdGhlIGFsbG9jYXRvciBjbGFzcy4KKy8vCisvLyBUaGUgcGFydGl0aW9uQWxsb2MoKSB2YXJpYW50IG9mIHRoZSBBUEkgaGFzIHRoZSBmb2xsb3dpbmcgY2F2ZWF0czoKKy8vIC0gQWxsb2NhdGlvbnMgYW5kIGZyZWVzIGFnYWluc3QgYSBzaW5nbGUgcGFydGl0aW9uIG11c3QgYmUgc2luZ2xlIHRocmVhZGVkLgorLy8gLSBBbGxvY2F0aW9ucyBtdXN0IG5vdCBleGNlZWQgYSBtYXggc2l6ZSwgY2hvc2VuIGF0IGNvbXBpbGUtdGltZSB2aWEgYQorLy8gdGVtcGxhdGVkIHBhcmFtZXRlciB0byBQYXJ0aXRpb25BbGxvY2F0b3IuCisvLyAtIEFsbG9jYXRpb24gc2l6ZXMgbXVzdCBiZSBhbGlnbmVkIHRvIHRoZSBzeXN0ZW0gcG9pbnRlciBzaXplLgorLy8gLSBBbGxvY2F0aW9ucyBhcmUgYnVja2V0ZWQgZXhhY3RseSBhY2NvcmRpbmcgdG8gc2l6ZS4KKy8vCisvLyBBbmQgZm9yIFBhcnRpdGlvbkFsbG9jR2VuZXJpYygpOgorLy8gLSBNdWx0aS10aHJlYWRlZCB1c2UgYWdhaW5zdCBhIHNpbmdsZSBwYXJ0aXRpb24gaXMgb2s7IGxvY2tpbmcgaXMgaGFuZGxlZC4KKy8vIC0gQWxsb2NhdGlvbnMgb2YgYW55IGFyYml0cmFyeSBzaXplIGNhbiBiZSBoYW5kbGVkIChzdWJqZWN0IHRvIGEgbGltaXQgb2YKKy8vIElOVF9NQVggYnl0ZXMgZm9yIHNlY3VyaXR5IHJlYXNvbnMpLgorLy8gLSBCdWNrZXRpbmcgaXMgYnkgYXBwcm94aW1hdGUgc2l6ZSwgZm9yIGV4YW1wbGUgYW4gYWxsb2NhdGlvbiBvZiA0MDAwIGJ5dGVzCisvLyBtaWdodCBiZSBwbGFjZWQgaW50byBhIDQwOTYtYnl0ZSBidWNrZXQuIEJ1Y2tldCBzaXplcyBhcmUgY2hvc2VuIHRvIHRyeSBhbmQKKy8vIGtlZXAgd29yc3QtY2FzZSB3YXN0ZSB0byB+MTAlLgorLy8KKy8vIFRoZSBhbGxvY2F0b3JzIGFyZSBkZXNpZ25lZCB0byBiZSBleHRyZW1lbHkgZmFzdCwgdGhhbmtzIHRvIHRoZSBmb2xsb3dpbmcKKy8vIHByb3BlcnRpZXMgYW5kIGRlc2lnbjoKKy8vIC0gSnVzdCB0d28gc2luZ2xlIChyZWFzb25hYmx5IHByZWRpY2F0YWJsZSkgYnJhbmNoZXMgaW4gdGhlIGhvdCAvIGZhc3QgcGF0aAorLy8gICBmb3IgYm90aCBhbGxvY2F0aW5nIGFuZCAoc2lnbmlmaWNhbnRseSkgZnJlZWluZy4KKy8vIC0gQSBtaW5pbWFsIG51bWJlciBvZiBvcGVyYXRpb25zIGluIHRoZSBob3QgLyBmYXN0IHBhdGgsIHdpdGggdGhlIHNsb3cgcGF0aHMKKy8vICAgaW4gc2VwYXJhdGUgZnVuY3Rpb25zLCBsZWFkaW5nIHRvIHRoZSBwb3NzaWJpbGl0eSBvZiBpbmxpbmluZy4KKy8vIC0gRWFjaCBwYXJ0aXRpb24gcGFnZSAod2hpY2ggaXMgdXN1YWxseSBtdWx0aXBsZSBwaHlzaWNhbCBwYWdlcykgaGFzIGEKKy8vICAgbWV0YWRhdGEgc3RydWN0dXJlIHdoaWNoIGFsbG93cyBmYXN0IG1hcHBpbmcgb2YgZnJlZSgpIGFkZHJlc3MgdG8gYW4KKy8vICAgdW5kZXJseWluZyBidWNrZXQuCisvLyAtIFN1cHBvcnRzIGEgbG9jay1mcmVlIEFQSSBmb3IgZmFzdCBwZXJmb3JtYW5jZSBpbiBzaW5nbGUtdGhyZWFkZWQgY2FzZXMuCisvLyAtIFRoZSBmcmVlbGlzdCBmb3IgYSBnaXZlbiBidWNrZXQgaXMgc3BsaXQgYWNyb3NzIGEgbnVtYmVyIG9mIHBhcnRpdGlvbgorLy8gICBwYWdlcywgZW5hYmxpbmcgdmFyaW91cyBzaW1wbGUgdHJpY2tzIHRvIHRyeSBhbmQgbWluaW1pemUgZnJhZ21lbnRhdGlvbi4KKy8vIC0gRmluZS1ncmFpbmVkIGJ1Y2tldCBzaXplcyBsZWFkaW5nIHRvIGxlc3Mgd2FzdGUgYW5kIGJldHRlciBwYWNraW5nLgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgc2VjdXJpdHkgcHJvcGVydGllcyBjb3VsZCBiZSBpbnZlc3RpZ2F0ZWQgaW4gdGhlIGZ1dHVyZToKKy8vIC0gUGVyLW9iamVjdCBidWNrZXRpbmcgKGluc3RlYWQgb2YgcGVyLXNpemUpIGlzIG1vc3RseSBhdmFpbGFibGUgYXQgdGhlIEFQSSwKKy8vIGJ1dCBub3QgdXNlZCB5ZXQuCisvLyAtIE5vIHJhbmRvbW5lc3Mgb2YgZnJlZWxpc3QgZW50cmllcyBvciBidWNrZXQgcG9zaXRpb24uCisvLyAtIEJldHRlciBjaGVja2luZyBmb3Igd2lsZCBwb2ludGVycyBpbiBmcmVlKCkuCisvLyAtIEJldHRlciBmcmVlbGlzdCBtYXNraW5nIGZ1bmN0aW9uIHRvIGd1YXJhbnRlZSBmYXVsdCBvbiAzMi1iaXQuCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvcGFnZV9hbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2FsbG9jYXRvci9wYXJ0aXRpb25fYWxsb2NhdG9yL3NwaW5fbG9jay5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvYml0cy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvY29tcGlsZXJfc3BlY2lmaWMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N5c19ieXRlb3JkZXIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9idWlsZC9idWlsZF9jb25maWcuaCIKKworI2lmIGRlZmluZWQoTUVNT1JZX1RPT0xfUkVQTEFDRVNfQUxMT0NBVE9SKQorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBwZGZpdW0geworbmFtZXNwYWNlIGJhc2UgeworCisvLyBBbGxvY2F0aW9uIGdyYW51bGFyaXR5IG9mIHNpemVvZih2b2lkKikgYnl0ZXMuCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtBbGxvY2F0aW9uR3JhbnVsYXJpdHkgPSBzaXplb2Yodm9pZCopOworc3RhdGljIGNvbnN0IHNpemVfdCBrQWxsb2NhdGlvbkdyYW51bGFyaXR5TWFzayA9IGtBbGxvY2F0aW9uR3JhbnVsYXJpdHkgLSAxOworc3RhdGljIGNvbnN0IHNpemVfdCBrQnVja2V0U2hpZnQgPSAoa0FsbG9jYXRpb25HcmFudWxhcml0eSA9PSA4KSA/IDMgOiAyOworCisvLyBVbmRlcmx5aW5nIHBhcnRpdGlvbiBzdG9yYWdlIHBhZ2VzIGFyZSBhIHBvd2VyLW9mLXR3byBzaXplLiBJdCBpcyB0eXBpY2FsCisvLyBmb3IgYSBwYXJ0aXRpb24gcGFnZSB0byBiZSBiYXNlZCBvbiBtdWx0aXBsZSBzeXN0ZW0gcGFnZXMuIE1vc3QgcmVmZXJlbmNlcyB0bworLy8gInBhZ2UiIHJlZmVyIHRvIHBhcnRpdGlvbiBwYWdlcy4KKy8vIFdlIGFsc28gaGF2ZSB0aGUgY29uY2VwdCBvZiAic3VwZXIgcGFnZXMiIC0tIHRoZXNlIGFyZSB0aGUgdW5kZXJseWluZyBzeXN0ZW0KKy8vIGFsbG9jYXRpb25zIHdlIG1ha2UuIFN1cGVyIHBhZ2VzIGNvbnRhaW4gbXVsdGlwbGUgcGFydGl0aW9uIHBhZ2VzIGluc2lkZSB0aGVtCisvLyBhbmQgaW5jbHVkZSBzcGFjZSBmb3IgYSBzbWFsbCBhbW91bnQgb2YgbWV0YWRhdGEgcGVyIHBhcnRpdGlvbiBwYWdlLgorLy8gSW5zaWRlIHN1cGVyIHBhZ2VzLCB3ZSBzdG9yZSAic2xvdCBzcGFucyIuIEEgc2xvdCBzcGFuIGlzIGEgY29udGluZ3VvdXMgcmFuZ2UKKy8vIG9mIG9uZSBvciBtb3JlIHBhcnRpdGlvbiBwYWdlcyB0aGF0IHN0b3JlcyBhbGxvY2F0aW9ucyBvZiB0aGUgc2FtZSBzaXplLgorLy8gU2xvdCBzcGFuIHNpemVzIGFyZSBhZGp1c3RlZCBkZXBlbmRpbmcgb24gdGhlIGFsbG9jYXRpb24gc2l6ZSwgdG8gbWFrZSBzdXJlCisvLyB0aGUgcGFja2luZyBkb2VzIG5vdCBsZWFkIHRvIHVudXNlZCAod2FzdGVkKSBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0CisvLyBzeXN0ZW0gcGFnZSBvZiB0aGUgc3Bhbi4gRm9yIG91ciBjdXJyZW50IG1heCBzbG90IHNwYW4gc2l6ZSBvZiA2NGsgYW5kIG90aGVyCisvLyBjb25zdGFudCB2YWx1ZXMsIHdlIHBhY2sgX2FsbF8gUGFydGl0aW9uQWxsb2NHZW5lcmljKCkgc2l6ZXMgcGVyZmVjdGx5IHVwCisvLyBhZ2FpbnN0IHRoZSBlbmQgb2YgYSBzeXN0ZW0gcGFnZS4KKyNpZiBkZWZpbmVkKF9NSVBTX0FSQ0hfTE9PTkdTT04pCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtQYXJ0aXRpb25QYWdlU2hpZnQgPSAxNjsgIC8vIDY0S0IKKyNlbHNlCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtQYXJ0aXRpb25QYWdlU2hpZnQgPSAxNDsgIC8vIDE2S0IKKyNlbmRpZgorc3RhdGljIGNvbnN0IHNpemVfdCBrUGFydGl0aW9uUGFnZVNpemUgPSAxIDw8IGtQYXJ0aXRpb25QYWdlU2hpZnQ7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtQYXJ0aXRpb25QYWdlT2Zmc2V0TWFzayA9IGtQYXJ0aXRpb25QYWdlU2l6ZSAtIDE7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtQYXJ0aXRpb25QYWdlQmFzZU1hc2sgPSB+a1BhcnRpdGlvblBhZ2VPZmZzZXRNYXNrOworc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4UGFydGl0aW9uUGFnZXNQZXJTbG90U3BhbiA9IDQ7CisKKy8vIFRvIGF2b2lkIGZyYWdtZW50YXRpb24gdmlhIG5ldmVyLXVzZWQgZnJlZWxpc3QgZW50cmllcywgd2UgaGFuZCBvdXQgcGFydGl0aW9uCisvLyBmcmVlbGlzdCBzZWN0aW9ucyBncmFkdWFsbHksIGluIHVuaXRzIG9mIHRoZSBkb21pbmFudCBzeXN0ZW0gcGFnZSBzaXplLgorLy8gV2hhdCB3ZSdyZSBhY3R1YWxseSBkb2luZyBpcyBhdm9pZGluZyBmaWxsaW5nIHRoZSBmdWxsIHBhcnRpdGlvbiBwYWdlICgxNiBLQikKKy8vIHdpdGggZnJlZWxpc3QgcG9pbnRlcnMgcmlnaHQgYXdheS4gV3JpdGluZyBmcmVlbGlzdCBwb2ludGVycyB3aWxsIGZhdWx0IGFuZAorLy8gZGlydHkgYSBwcml2YXRlIHBhZ2UsIHdoaWNoIGlzIHZlcnkgd2FzdGVmdWwgaWYgd2UgbmV2ZXIgYWN0dWFsbHkgc3RvcmUKKy8vIG9iamVjdHMgdGhlcmUuCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1TeXN0ZW1QYWdlc1BlclBhcnRpdGlvblBhZ2UgPQorICAgIGtQYXJ0aXRpb25QYWdlU2l6ZSAvIGtTeXN0ZW1QYWdlU2l6ZTsKK3N0YXRpYyBjb25zdCBzaXplX3Qga01heFN5c3RlbVBhZ2VzUGVyU2xvdFNwYW4gPQorICAgIGtOdW1TeXN0ZW1QYWdlc1BlclBhcnRpdGlvblBhZ2UgKiBrTWF4UGFydGl0aW9uUGFnZXNQZXJTbG90U3BhbjsKKworLy8gV2UgcmVzZXJ2ZSB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UgaW4gMk1CIGNodW5rcyAoYWxpZ25lZCB0byAyTUIgYXMgd2VsbCkuCisvLyBUaGVzZSBjaHVua3MgYXJlIGNhbGxlZCAic3VwZXIgcGFnZXMiLiBXZSBkbyB0aGlzIHNvIHRoYXQgd2UgY2FuIHN0b3JlCisvLyBtZXRhZGF0YSBpbiB0aGUgZmlyc3QgZmV3IHBhZ2VzIG9mIGVhY2ggMk1CIGFsaWduZWQgc2VjdGlvbi4gVGhpcyBsZWFkcyB0bworLy8gYSB2ZXJ5IGZhc3QgZnJlZSgpLiBXZSBzcGVjaWZpY2FsbHkgY2hvb3NlIDJNQiBiZWNhdXNlIHRoaXMgdmlydHVhbCBhZGRyZXNzCisvLyBibG9jayByZXByZXNlbnRzIGEgZnVsbCBidXQgc2luZ2xlIFBURSBhbGxvY2F0aW9uIG9uIEFSTSwgaWEzMiBhbmQgeDY0LgorLy8KKy8vIFRoZSBsYXlvdXQgb2YgdGhlIHN1cGVyIHBhZ2UgaXMgYXMgZm9sbG93cy4gVGhlIHNpemVzIGJlbG93IGFyZSB0aGUgc2FtZQorLy8gZm9yIDMyIGJpdCBhbmQgNjQgYml0LgorLy8KKy8vICAgfCBHdWFyZCBwYWdlICg0S0IpICAgIHwKKy8vICAgfCBNZXRhZGF0YSBwYWdlICg0S0IpIHwKKy8vICAgfCBHdWFyZCBwYWdlcyAoOEtCKSAgIHwKKy8vICAgfCBTbG90IHNwYW4gICAgICAgICAgIHwKKy8vICAgfCBTbG90IHNwYW4gICAgICAgICAgIHwKKy8vICAgfCAuLi4gICAgICAgICAgICAgICAgIHwKKy8vICAgfCBTbG90IHNwYW4gICAgICAgICAgIHwKKy8vICAgfCBHdWFyZCBwYWdlICg0S0IpICAgIHwKKy8vCisvLyAgIC0gRWFjaCBzbG90IHNwYW4gaXMgYSBjb250aWd1b3VzIHJhbmdlIG9mIG9uZSBvciBtb3JlIFBhcnRpdGlvblBhZ2VzLgorLy8gICAtIFRoZSBtZXRhZGF0YSBwYWdlIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdC4gTm90ZSB0aGF0IHRoZSBQYXJ0aXRpb25QYWdlCisvLyAgICAgdGhhdCBpcyBub3QgYXQgdGhlIGhlYWQgb2YgYSBzbG90IHNwYW4gaXMgInVudXNlZCIuIEluIG90aGVyIHdvcmRzLAorLy8gICAgIHRoZSBtZXRhZGF0YSBmb3IgdGhlIHNsb3Qgc3BhbiBpcyBzdG9yZWQgb25seSBpbiB0aGUgZmlyc3QgUGFydGl0aW9uUGFnZQorLy8gICAgIG9mIHRoZSBzbG90IHNwYW4uIE1ldGFkYXRhIGFjY2Vzc2VzIHRvIG90aGVyIFBhcnRpdGlvblBhZ2VzIGFyZQorLy8gICAgIHJlZGlyZWN0ZWQgdG8gdGhlIGZpcnN0IFBhcnRpdGlvblBhZ2UuCisvLworLy8gICAgIHwgU3VwZXJQYWdlRXh0ZW50RW50cnkgKDMyQikgICAgICAgICAgICAgICAgIHwKKy8vICAgICB8IFBhcnRpdGlvblBhZ2Ugb2Ygc2xvdCBzcGFuIDEgKDMyQiwgdXNlZCkgICB8CisvLyAgICAgfCBQYXJ0aXRpb25QYWdlIG9mIHNsb3Qgc3BhbiAxICgzMkIsIHVudXNlZCkgfAorLy8gICAgIHwgUGFydGl0aW9uUGFnZSBvZiBzbG90IHNwYW4gMSAoMzJCLCB1bnVzZWQpIHwKKy8vICAgICB8IFBhcnRpdGlvblBhZ2Ugb2Ygc2xvdCBzcGFuIDIgKDMyQiwgdXNlZCkgICB8CisvLyAgICAgfCBQYXJ0aXRpb25QYWdlIG9mIHNsb3Qgc3BhbiAzICgzMkIsIHVzZWQpICAgfAorLy8gICAgIHwgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy8vICAgICB8IFBhcnRpdGlvblBhZ2Ugb2Ygc2xvdCBzcGFuIE4gKDMyQiwgdW51c2VkKSB8CisvLworLy8gQSBkaXJlY3QgbWFwcGVkIHBhZ2UgaGFzIGEgc2ltaWxhciBsYXlvdXQgdG8gZmFrZSBpdCBsb29raW5nIGxpa2UgYSBzdXBlcgorLy8gcGFnZToKKy8vCisvLyAgICAgfCBHdWFyZCBwYWdlICg0S0IpICAgICB8CisvLyAgICAgfCBNZXRhZGF0YSBwYWdlICg0S0IpICB8CisvLyAgICAgfCBHdWFyZCBwYWdlcyAoOEtCKSAgICB8CisvLyAgICAgfCBEaXJlY3QgbWFwcGVkIG9iamVjdCB8CisvLyAgICAgfCBHdWFyZCBwYWdlICg0S0IpICAgICB8CisvLworLy8gICAgLSBUaGUgbWV0YWRhdGEgcGFnZSBoYXMgdGhlIGZvbGxvd2luZyBsYXlvdXQ6CisvLworLy8gICAgIHwgU3VwZXJQYWdlRXh0ZW50RW50cnkgKDMyQikgICAgfAorLy8gICAgIHwgUGFydGl0aW9uUGFnZSAoMzJCKSAgICAgICAgICAgfAorLy8gICAgIHwgUGFydGl0aW9uQnVja2V0ICgzMkIpICAgICAgICAgfAorLy8gICAgIHwgUGFydGl0aW9uRGlyZWN0TWFwRXh0ZW50ICg4QikgfAorc3RhdGljIGNvbnN0IHNpemVfdCBrU3VwZXJQYWdlU2hpZnQgPSAyMTsgIC8vIDJNQgorc3RhdGljIGNvbnN0IHNpemVfdCBrU3VwZXJQYWdlU2l6ZSA9IDEgPDwga1N1cGVyUGFnZVNoaWZ0Oworc3RhdGljIGNvbnN0IHNpemVfdCBrU3VwZXJQYWdlT2Zmc2V0TWFzayA9IGtTdXBlclBhZ2VTaXplIC0gMTsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1N1cGVyUGFnZUJhc2VNYXNrID0gfmtTdXBlclBhZ2VPZmZzZXRNYXNrOworc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtUGFydGl0aW9uUGFnZXNQZXJTdXBlclBhZ2UgPQorICAgIGtTdXBlclBhZ2VTaXplIC8ga1BhcnRpdGlvblBhZ2VTaXplOworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtQYWdlTWV0YWRhdGFTaGlmdCA9IDU7ICAvLyAzMiBieXRlcyBwZXIgcGFydGl0aW9uIHBhZ2UuCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtQYWdlTWV0YWRhdGFTaXplID0gMSA8PCBrUGFnZU1ldGFkYXRhU2hpZnQ7CisKKy8vIFRoZSBmb2xsb3dpbmcga0dlbmVyaWMqIGNvbnN0YW50cyBhcHBseSB0byB0aGUgZ2VuZXJpYyB2YXJpYW50cyBvZiB0aGUgQVBJLgorLy8gVGhlICJvcmRlciIgb2YgYW4gYWxsb2NhdGlvbiBpcyBjbG9zZWx5IHJlbGF0ZWQgdG8gdGhlIHBvd2VyLW9mLXR3byBzaXplIG9mCisvLyB0aGUgYWxsb2NhdGlvbi4gTW9yZSBwcmVjaXNlbHksIHRoZSBvcmRlciBpcyB0aGUgYml0IGluZGV4IG9mIHRoZQorLy8gbW9zdC1zaWduaWZpY2FudC1iaXQgaW4gdGhlIGFsbG9jYXRpb24gc2l6ZSwgd2hlcmUgdGhlIGJpdCBudW1iZXJzIHN0YXJ0cworLy8gYXQgaW5kZXggMSBmb3IgdGhlIGxlYXN0LXNpZ25pZmljYW50LWJpdC4KKy8vIEluIHRlcm1zIG9mIGFsbG9jYXRpb24gc2l6ZXMsIG9yZGVyIDAgY292ZXJzIDAsIG9yZGVyIDEgY292ZXJzIDEsIG9yZGVyIDIKKy8vIGNvdmVycyAyLT4zLCBvcmRlciAzIGNvdmVycyA0LT43LCBvcmRlciA0IGNvdmVycyA4LT4xNS4KK3N0YXRpYyBjb25zdCBzaXplX3Qga0dlbmVyaWNNaW5CdWNrZXRlZE9yZGVyID0gNDsgIC8vIDggYnl0ZXMuCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtHZW5lcmljTWF4QnVja2V0ZWRPcmRlciA9CisgICAgMjA7ICAvLyBMYXJnZXN0IGJ1Y2tldGVkIG9yZGVyIGlzIDE8PCgyMC0xKSAoc3RvcmluZyA1MTJLQiAtPiBhbG1vc3QgMU1CKQorc3RhdGljIGNvbnN0IHNpemVfdCBrR2VuZXJpY051bUJ1Y2tldGVkT3JkZXJzID0KKyAgICAoa0dlbmVyaWNNYXhCdWNrZXRlZE9yZGVyIC0ga0dlbmVyaWNNaW5CdWNrZXRlZE9yZGVyKSArIDE7CisvLyBFaWdodCBidWNrZXRzIHBlciBvcmRlciAoZm9yIHRoZSBoaWdoZXIgb3JkZXJzKSwgZS5nLiBvcmRlciA4IGlzIDEyOCwgMTQ0LAorLy8gMTYwLCAuLi4sIDI0MDoKK3N0YXRpYyBjb25zdCBzaXplX3Qga0dlbmVyaWNOdW1CdWNrZXRzUGVyT3JkZXJCaXRzID0gMzsKK3N0YXRpYyBjb25zdCBzaXplX3Qga0dlbmVyaWNOdW1CdWNrZXRzUGVyT3JkZXIgPQorICAgIDEgPDwga0dlbmVyaWNOdW1CdWNrZXRzUGVyT3JkZXJCaXRzOworc3RhdGljIGNvbnN0IHNpemVfdCBrR2VuZXJpY051bUJ1Y2tldHMgPQorICAgIGtHZW5lcmljTnVtQnVja2V0ZWRPcmRlcnMgKiBrR2VuZXJpY051bUJ1Y2tldHNQZXJPcmRlcjsKK3N0YXRpYyBjb25zdCBzaXplX3Qga0dlbmVyaWNTbWFsbGVzdEJ1Y2tldCA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IChrR2VuZXJpY01pbkJ1Y2tldGVkT3JkZXIgLSAxKTsKK3N0YXRpYyBjb25zdCBzaXplX3Qga0dlbmVyaWNNYXhCdWNrZXRTcGFjaW5nID0KKyAgICAxIDw8ICgoa0dlbmVyaWNNYXhCdWNrZXRlZE9yZGVyIC0gMSkgLSBrR2VuZXJpY051bUJ1Y2tldHNQZXJPcmRlckJpdHMpOworc3RhdGljIGNvbnN0IHNpemVfdCBrR2VuZXJpY01heEJ1Y2tldGVkID0KKyAgICAoMSA8PCAoa0dlbmVyaWNNYXhCdWNrZXRlZE9yZGVyIC0gMSkpICsKKyAgICAoKGtHZW5lcmljTnVtQnVja2V0c1Blck9yZGVyIC0gMSkgKiBrR2VuZXJpY01heEJ1Y2tldFNwYWNpbmcpOworc3RhdGljIGNvbnN0IHNpemVfdCBrR2VuZXJpY01pbkRpcmVjdE1hcHBlZERvd25zaXplID0KKyAgICBrR2VuZXJpY01heEJ1Y2tldGVkICsKKyAgICAxOyAgLy8gTGltaXQgd2hlbiBkb3duc2l6aW5nIGEgZGlyZWN0IG1hcHBpbmcgdXNpbmcgcmVhbGxvYygpLgorc3RhdGljIGNvbnN0IHNpemVfdCBrR2VuZXJpY01heERpcmVjdE1hcHBlZCA9IElOVF9NQVggLSBrU3lzdGVtUGFnZVNpemU7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtCaXRzUGVyU2l6ZVQgPSBzaXplb2Yodm9pZCopICogQ0hBUl9CSVQ7CisKKy8vIENvbnN0YW50cyBmb3IgdGhlIG1lbW9yeSByZWNsYWltIGxvZ2ljLgorc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4RnJlZWFibGVTcGFucyA9IDE2OworCisvLyBJZiB0aGUgdG90YWwgc2l6ZSBpbiBieXRlcyBvZiBhbGxvY2F0ZWQgYnV0IG5vdCBjb21taXR0ZWQgcGFnZXMgZXhjZWVkcyB0aGlzCisvLyB2YWx1ZSAocHJvYmFibHkgaXQgaXMgYSAib3V0IG9mIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSIgY3Jhc2gpLAorLy8gYSBzcGVjaWFsIGNyYXNoIHN0YWNrIHRyYWNlIGlzIGdlbmVyYXRlZCBhdCB8cGFydGl0aW9uT3V0T2ZNZW1vcnl8LgorLy8gVGhpcyBpcyB0byBkaXN0aW5ndWlzaCAib3V0IG9mIHZpcnR1YWwgYWRkcmVzcyBzcGFjZSIgZnJvbQorLy8gIm91dCBvZiBwaHlzaWNhbCBtZW1vcnkiIGluIGNyYXNoIHJlcG9ydHMuCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtSZWFzb25hYmxlU2l6ZU9mVW51c2VkUGFnZXMgPSAxMDI0ICogMTAyNCAqIDEwMjQ7ICAvLyAxR2lCCisKKyNpZiBEQ0hFQ0tfSVNfT04oKQorLy8gVGhlc2UgdHdvIGJ5dGUgdmFsdWVzIG1hdGNoIHRjbWFsbG9jLgorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga1VuaW5pdGlhbGl6ZWRCeXRlID0gMHhBQjsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtGcmVlZEJ5dGUgPSAweENEOworc3RhdGljIGNvbnN0IHNpemVfdCBrQ29va2llU2l6ZSA9CisgICAgMTY7ICAvLyBIYW5kbGVzIGFsaWdubWVudCB1cCB0byBYTU0gaW5zdHJ1Y3Rpb25zIG9uIEludGVsLgorc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIga0Nvb2tpZVZhbHVlW2tDb29raWVTaXplXSA9IHsKKyAgICAweERFLCAweEFELCAweEJFLCAweEVGLCAweENBLCAweEZFLCAweEQwLCAweDBELAorICAgIDB4MTMsIDB4MzcsIDB4RjAsIDB4MDUsIDB4QkEsIDB4MTEsIDB4QUIsIDB4MUV9OworI2VuZGlmCisKK3N0cnVjdCBQYXJ0aXRpb25CdWNrZXQ7CitzdHJ1Y3QgUGFydGl0aW9uUm9vdEJhc2U7CisKK3N0cnVjdCBQYXJ0aXRpb25GcmVlbGlzdEVudHJ5IHsKKyAgUGFydGl0aW9uRnJlZWxpc3RFbnRyeSogbmV4dDsKK307CisKKy8vIFNvbWUgbm90ZXMgb24gcGFnZSBzdGF0ZXMuIEEgcGFnZSBjYW4gYmUgaW4gb25lIG9mIGZvdXIgbWFqb3Igc3RhdGVzOgorLy8gMSkgQWN0aXZlLgorLy8gMikgRnVsbC4KKy8vIDMpIEVtcHR5LgorLy8gNCkgRGVjb21taXR0ZWQuCisvLyBBbiBhY3RpdmUgcGFnZSBoYXMgYXZhaWxhYmxlIGZyZWUgc2xvdHMuIEEgZnVsbCBwYWdlIGhhcyBubyBmcmVlIHNsb3RzLiBBbgorLy8gZW1wdHkgcGFnZSBoYXMgbm8gZnJlZSBzbG90cywgYW5kIGEgZGVjb21taXR0ZWQgcGFnZSBpcyBhbiBlbXB0eSBwYWdlIHRoYXQKKy8vIGhhZCBpdHMgYmFja2luZyBtZW1vcnkgcmVsZWFzZWQgYmFjayB0byB0aGUgc3lzdGVtLgorLy8gVGhlcmUgYXJlIHR3byBsaW5rZWQgbGlzdHMgdHJhY2tpbmcgdGhlIHBhZ2VzLiBUaGUgImFjdGl2ZSBwYWdlIiBsaXN0IGlzIGFuCisvLyBhcHByb3hpbWF0aW9uIG9mIGEgbGlzdCBvZiBhY3RpdmUgcGFnZXMuIEl0IGlzIGFuIGFwcHJveGltYXRpb24gYmVjYXVzZQorLy8gZnVsbCwgZW1wdHkgYW5kIGRlY29tbWl0dGVkIHBhZ2VzIG1heSBicmllZmx5IGJlIHByZXNlbnQgaW4gdGhlIGxpc3QgdW50aWwKKy8vIHdlIG5leHQgZG8gYSBzY2FuIG92ZXIgaXQuCisvLyBUaGUgImVtcHR5IHBhZ2UiIGxpc3QgaXMgYW4gYWNjdXJhdGUgbGlzdCBvZiBwYWdlcyB3aGljaCBhcmUgZWl0aGVyIGVtcHR5CisvLyBvciBkZWNvbW1pdHRlZC4KKy8vCisvLyBUaGUgc2lnbmlmaWNhbnQgcGFnZSB0cmFuc2l0aW9ucyBhcmU6CisvLyAtIGZyZWUoKSB3aWxsIGRldGVjdCB3aGVuIGEgZnVsbCBwYWdlIGhhcyBhIHNsb3QgZnJlZSgpJ2QgYW5kIGltbWVkaWF0ZWx5CisvLyByZXR1cm4gdGhlIHBhZ2UgdG8gdGhlIGhlYWQgb2YgdGhlIGFjdGl2ZSBsaXN0LgorLy8gLSBmcmVlKCkgd2lsbCBkZXRlY3Qgd2hlbiBhIHBhZ2UgaXMgZnVsbHkgZW1wdGllZC4gSXQgX21heV8gYWRkIGl0IHRvIHRoZQorLy8gZW1wdHkgbGlzdCBvciBpdCBfbWF5XyBsZWF2ZSBpdCBvbiB0aGUgYWN0aXZlIGxpc3QgdW50aWwgYSBmdXR1cmUgbGlzdCBzY2FuLgorLy8gLSBtYWxsb2MoKSBfbWF5XyBzY2FuIHRoZSBhY3RpdmUgcGFnZSBsaXN0IGluIG9yZGVyIHRvIGZ1bGZpbCB0aGUgcmVxdWVzdC4KKy8vIElmIGl0IGRvZXMgdGhpcywgZnVsbCwgZW1wdHkgYW5kIGRlY29tbWl0dGVkIHBhZ2VzIGVuY291bnRlcmVkIHdpbGwgYmUKKy8vIGJvb3RlZCBvdXQgb2YgdGhlIGFjdGl2ZSBsaXN0LiBJZiB0aGVyZSBhcmUgbm8gc3VpdGFibGUgYWN0aXZlIHBhZ2VzIGZvdW5kLAorLy8gYW4gZW1wdHkgb3IgZGVjb21taXR0ZWQgcGFnZSAoaWYgb25lIGV4aXN0cykgd2lsbCBiZSBwdWxsZWQgZnJvbSB0aGUgZW1wdHkKKy8vIGxpc3Qgb24gdG8gdGhlIGFjdGl2ZSBsaXN0Lgorc3RydWN0IFBhcnRpdGlvblBhZ2UgeworICBQYXJ0aXRpb25GcmVlbGlzdEVudHJ5KiBmcmVlbGlzdF9oZWFkOworICBQYXJ0aXRpb25QYWdlKiBuZXh0X3BhZ2U7CisgIFBhcnRpdGlvbkJ1Y2tldCogYnVja2V0OworICAvLyBEZWxpYmVyYXRlbHkgc2lnbmVkLCAwIGZvciBlbXB0eSBvciBkZWNvbW1pdHRlZCBwYWdlLCAtbiBmb3IgZnVsbCBwYWdlczoKKyAgaW50MTZfdCBudW1fYWxsb2NhdGVkX3Nsb3RzOworICB1aW50MTZfdCBudW1fdW5wcm92aXNpb25lZF9zbG90czsKKyAgdWludDE2X3QgcGFnZV9vZmZzZXQ7CisgIGludDE2X3QgZW1wdHlfY2FjaGVfaW5kZXg7ICAvLyAtMSBpZiBub3QgaW4gdGhlIGVtcHR5IGNhY2hlLgorfTsKKworc3RydWN0IFBhcnRpdGlvbkJ1Y2tldCB7CisgIFBhcnRpdGlvblBhZ2UqIGFjdGl2ZV9wYWdlc19oZWFkOyAgLy8gQWNjZXNzZWQgbW9zdCBpbiBob3QgcGF0aCA9PiBnb2VzIGZpcnN0LgorICBQYXJ0aXRpb25QYWdlKiBlbXB0eV9wYWdlc19oZWFkOworICBQYXJ0aXRpb25QYWdlKiBkZWNvbW1pdHRlZF9wYWdlc19oZWFkOworICB1aW50MzJfdCBzbG90X3NpemU7CisgIHVuc2lnbmVkIG51bV9zeXN0ZW1fcGFnZXNfcGVyX3Nsb3Rfc3BhbiA6IDg7CisgIHVuc2lnbmVkIG51bV9mdWxsX3BhZ2VzIDogMjQ7Cit9OworCisvLyBBbiAiZXh0ZW50IiBpcyBhIHNwYW4gb2YgY29uc2VjdXRpdmUgc3VwZXJwYWdlcy4gV2UgbGluayB0byB0aGUgcGFydGl0aW9uJ3MKKy8vIG5leHQgZXh0ZW50IChpZiB0aGVyZSBpcyBvbmUpIGF0IHRoZSB2ZXJ5IHN0YXJ0IG9mIGEgc3VwZXJwYWdlJ3MgbWV0YWRhdGEKKy8vIGFyZWEuCitzdHJ1Y3QgUGFydGl0aW9uU3VwZXJQYWdlRXh0ZW50RW50cnkgeworICBQYXJ0aXRpb25Sb290QmFzZSogcm9vdDsKKyAgY2hhciogc3VwZXJfcGFnZV9iYXNlOworICBjaGFyKiBzdXBlcl9wYWdlc19lbmQ7CisgIFBhcnRpdGlvblN1cGVyUGFnZUV4dGVudEVudHJ5KiBuZXh0OworfTsKKworc3RydWN0IFBhcnRpdGlvbkRpcmVjdE1hcEV4dGVudCB7CisgIFBhcnRpdGlvbkRpcmVjdE1hcEV4dGVudCogbmV4dF9leHRlbnQ7CisgIFBhcnRpdGlvbkRpcmVjdE1hcEV4dGVudCogcHJldl9leHRlbnQ7CisgIFBhcnRpdGlvbkJ1Y2tldCogYnVja2V0OworICBzaXplX3QgbWFwX3NpemU7ICAvLyBNYXBwZWQgc2l6ZSwgbm90IGluY2x1ZGluZyBndWFyZCBwYWdlcyBhbmQgbWV0YS1kYXRhLgorfTsKKworc3RydWN0IEJBU0VfRVhQT1JUIFBhcnRpdGlvblJvb3RCYXNlIHsKKyAgc2l6ZV90IHRvdGFsX3NpemVfb2ZfY29tbWl0dGVkX3BhZ2VzOworICBzaXplX3QgdG90YWxfc2l6ZV9vZl9zdXBlcl9wYWdlczsKKyAgc2l6ZV90IHRvdGFsX3NpemVfb2ZfZGlyZWN0X21hcHBlZF9wYWdlczsKKyAgLy8gSW52YXJpYW50OiB0b3RhbF9zaXplX29mX2NvbW1pdHRlZF9wYWdlcyA8PQorICAvLyAgICAgICAgICAgICAgICB0b3RhbF9zaXplX29mX3N1cGVyX3BhZ2VzICsKKyAgLy8gICAgICAgICAgICAgICAgdG90YWxfc2l6ZV9vZl9kaXJlY3RfbWFwcGVkX3BhZ2VzLgorICB1bnNpZ25lZCBudW1fYnVja2V0czsKKyAgdW5zaWduZWQgbWF4X2FsbG9jYXRpb247CisgIGJvb2wgaW5pdGlhbGl6ZWQ7CisgIGNoYXIqIG5leHRfc3VwZXJfcGFnZTsKKyAgY2hhciogbmV4dF9wYXJ0aXRpb25fcGFnZTsKKyAgY2hhciogbmV4dF9wYXJ0aXRpb25fcGFnZV9lbmQ7CisgIFBhcnRpdGlvblN1cGVyUGFnZUV4dGVudEVudHJ5KiBjdXJyZW50X2V4dGVudDsKKyAgUGFydGl0aW9uU3VwZXJQYWdlRXh0ZW50RW50cnkqIGZpcnN0X2V4dGVudDsKKyAgUGFydGl0aW9uRGlyZWN0TWFwRXh0ZW50KiBkaXJlY3RfbWFwX2xpc3Q7CisgIFBhcnRpdGlvblBhZ2UqIGdsb2JhbF9lbXB0eV9wYWdlX3Jpbmdba01heEZyZWVhYmxlU3BhbnNdOworICBpbnQxNl90IGdsb2JhbF9lbXB0eV9wYWdlX3JpbmdfaW5kZXg7CisgIHVpbnRwdHJfdCBpbnZlcnRlZF9zZWxmOworCisgIHN0YXRpYyBzdWJ0bGU6OlNwaW5Mb2NrIGdJbml0aWFsaXplZExvY2s7CisgIHN0YXRpYyBib29sIGdJbml0aWFsaXplZDsKKyAgLy8gZ1NlZWRQYWdlIGlzIHVzZWQgYXMgYSBzZW50aW5lbCB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIG5vIHBhZ2UKKyAgLy8gaW4gdGhlIGFjdGl2ZSBwYWdlIGxpc3QuIFdlIGNhbiB1c2UgbnVsbHB0ciwgYnV0IGluIHRoYXQgY2FzZSB3ZSBuZWVkCisgIC8vIHRvIGFkZCBhIG51bGwtY2hlY2sgYnJhbmNoIHRvIHRoZSBob3QgYWxsb2NhdGlvbiBwYXRoLiBXZSB3YW50IHRvIGF2b2lkCisgIC8vIHRoYXQuCisgIHN0YXRpYyBQYXJ0aXRpb25QYWdlIGdTZWVkUGFnZTsKKyAgc3RhdGljIFBhcnRpdGlvbkJ1Y2tldCBnUGFnZWRCdWNrZXQ7CisgIC8vIGdPb21IYW5kbGluZ0Z1bmN0aW9uIGlzIGludm9rZWQgd2hlbiBQYXJpdGlvbkFsbG9jIGhpdHMgT3V0T2ZNZW1vcnkuCisgIHN0YXRpYyB2b2lkICgqZ09vbUhhbmRsaW5nRnVuY3Rpb24pKCk7Cit9OworCisvLyBOZXZlciBpbnN0YW50aWF0ZSBhIFBhcnRpdGlvblJvb3QgZGlyZWN0bHksIGluc3RlYWQgdXNlIFBhcnRpdGlvbkFsbG9jLgorc3RydWN0IFBhcnRpdGlvblJvb3QgOiBwdWJsaWMgUGFydGl0aW9uUm9vdEJhc2UgeworICAvLyBUaGUgUGFydGl0aW9uQWxsb2MgdGVtcGxhdGVkIGNsYXNzIGVuc3VyZXMgdGhlIGZvbGxvd2luZyBpcyBjb3JyZWN0LgorICBBTFdBWVNfSU5MSU5FIFBhcnRpdGlvbkJ1Y2tldCogYnVja2V0cygpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQYXJ0aXRpb25CdWNrZXQqPih0aGlzICsgMSk7CisgIH0KKyAgQUxXQVlTX0lOTElORSBjb25zdCBQYXJ0aXRpb25CdWNrZXQqIGJ1Y2tldHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUGFydGl0aW9uQnVja2V0Kj4odGhpcyArIDEpOworICB9Cit9OworCisvLyBOZXZlciBpbnN0YW50aWF0ZSBhIFBhcnRpdGlvblJvb3RHZW5lcmljIGRpcmVjdGx5LCBpbnN0ZWFkIHVzZQorLy8gUGFydGl0aW9uQWxsb2NhdG9yR2VuZXJpYy4KK3N0cnVjdCBQYXJ0aXRpb25Sb290R2VuZXJpYyA6IHB1YmxpYyBQYXJ0aXRpb25Sb290QmFzZSB7CisgIHN1YnRsZTo6U3BpbkxvY2sgbG9jazsKKyAgLy8gU29tZSBwcmUtY29tcHV0ZWQgY29uc3RhbnRzLgorICBzaXplX3Qgb3JkZXJfaW5kZXhfc2hpZnRzW2tCaXRzUGVyU2l6ZVQgKyAxXTsKKyAgc2l6ZV90IG9yZGVyX3N1Yl9pbmRleF9tYXNrc1trQml0c1BlclNpemVUICsgMV07CisgIC8vIFRoZSBidWNrZXQgbG9va3VwIHRhYmxlIGxldHMgdXMgbWFwIGEgc2l6ZV90IHRvIGEgYnVja2V0IHF1aWNrbHkuCisgIC8vIFRoZSB0cmFpbGluZyArMSBjYXRlcnMgZm9yIHRoZSBvdmVyZmxvdyBjYXNlIGZvciB2ZXJ5IGxhcmdlIGFsbG9jYXRpb24KKyAgLy8gc2l6ZXMuICBJdCBpcyBvbmUgZmxhdCBhcnJheSBpbnN0ZWFkIG9mIGEgMkQgYXJyYXkgYmVjYXVzZSBpbiB0aGUgMkQKKyAgLy8gd29ybGQsIHdlJ2QgbmVlZCB0byBpbmRleCBhcnJheVtibGFoXVttYXgrMV0gd2hpY2ggcmlza3MgdW5kZWZpbmVkCisgIC8vIGJlaGF2aW9yLgorICBQYXJ0aXRpb25CdWNrZXQqCisgICAgICBidWNrZXRfbG9va3Vwc1soKGtCaXRzUGVyU2l6ZVQgKyAxKSAqIGtHZW5lcmljTnVtQnVja2V0c1Blck9yZGVyKSArIDFdOworICBQYXJ0aXRpb25CdWNrZXQgYnVja2V0c1trR2VuZXJpY051bUJ1Y2tldHNdOworfTsKKworLy8gRmxhZ3MgZm9yIFBhcnRpdGlvbkFsbG9jR2VuZXJpY0ZsYWdzLgorZW51bSBQYXJ0aXRpb25BbGxvY0ZsYWdzIHsKKyAgUGFydGl0aW9uQWxsb2NSZXR1cm5OdWxsID0gMSA8PCAwLAorfTsKKworLy8gU3RydWN0IHVzZWQgdG8gcmV0cmlldmUgdG90YWwgbWVtb3J5IHVzYWdlIG9mIGEgcGFydGl0aW9uLiBVc2VkIGJ5CisvLyBQYXJ0aXRpb25TdGF0c0R1bXBlciBpbXBsZW1lbnRhdGlvbi4KK3N0cnVjdCBQYXJ0aXRpb25NZW1vcnlTdGF0cyB7CisgIHNpemVfdCB0b3RhbF9tbWFwcGVkX2J5dGVzOyAgICAvLyBUb3RhbCBieXRlcyBtbWFwZWQgZnJvbSB0aGUgc3lzdGVtLgorICBzaXplX3QgdG90YWxfY29tbWl0dGVkX2J5dGVzOyAgLy8gVG90YWwgc2l6ZSBvZiBjb21tbWl0dGVkIHBhZ2VzLgorICBzaXplX3QgdG90YWxfcmVzaWRlbnRfYnl0ZXM7ICAgLy8gVG90YWwgYnl0ZXMgcHJvdmlzaW9uZWQgYnkgdGhlIHBhcnRpdGlvbi4KKyAgc2l6ZV90IHRvdGFsX2FjdGl2ZV9ieXRlczsgICAgIC8vIFRvdGFsIGFjdGl2ZSBieXRlcyBpbiB0aGUgcGFydGl0aW9uLgorICBzaXplX3QgdG90YWxfZGVjb21taXR0YWJsZV9ieXRlczsgIC8vIFRvdGFsIGJ5dGVzIHRoYXQgY291bGQgYmUgZGVjb21taXR0ZWQuCisgIHNpemVfdCB0b3RhbF9kaXNjYXJkYWJsZV9ieXRlczsgICAgLy8gVG90YWwgYnl0ZXMgdGhhdCBjb3VsZCBiZSBkaXNjYXJkZWQuCit9OworCisvLyBTdHJ1Y3QgdXNlZCB0byByZXRyaWV2ZSBtZW1vcnkgc3RhdGlzdGljcyBhYm91dCBhIHBhcnRpdGlvbiBidWNrZXQuIFVzZWQgYnkKKy8vIFBhcnRpdGlvblN0YXRzRHVtcGVyIGltcGxlbWVudGF0aW9uLgorc3RydWN0IFBhcnRpdGlvbkJ1Y2tldE1lbW9yeVN0YXRzIHsKKyAgYm9vbCBpc192YWxpZDsgICAgICAgLy8gVXNlZCB0byBjaGVjayBpZiB0aGUgc3RhdHMgaXMgdmFsaWQuCisgIGJvb2wgaXNfZGlyZWN0X21hcDsgIC8vIFRydWUgaWYgdGhpcyBpcyBhIGRpcmVjdCBtYXBwaW5nOyBzaXplIHdpbGwgbm90IGJlCisgICAgICAgICAgICAgICAgICAgICAgIC8vIHVuaXF1ZS4KKyAgdWludDMyX3QgYnVja2V0X3Nsb3Rfc2l6ZTsgICAgIC8vIFRoZSBzaXplIG9mIHRoZSBzbG90IGluIGJ5dGVzLgorICB1aW50MzJfdCBhbGxvY2F0ZWRfcGFnZV9zaXplOyAgLy8gVG90YWwgc2l6ZSB0aGUgcGFydGl0aW9uIHBhZ2UgYWxsb2NhdGVkIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzeXN0ZW0uCisgIHVpbnQzMl90IGFjdGl2ZV9ieXRlczsgICAgICAgICAvLyBUb3RhbCBhY3RpdmUgYnl0ZXMgdXNlZCBpbiB0aGUgYnVja2V0LgorICB1aW50MzJfdCByZXNpZGVudF9ieXRlczsgICAgICAgLy8gVG90YWwgYnl0ZXMgcHJvdmlzaW9uZWQgaW4gdGhlIGJ1Y2tldC4KKyAgdWludDMyX3QgZGVjb21taXR0YWJsZV9ieXRlczsgIC8vIFRvdGFsIGJ5dGVzIHRoYXQgY291bGQgYmUgZGVjb21taXR0ZWQuCisgIHVpbnQzMl90IGRpc2NhcmRhYmxlX2J5dGVzOyAgICAvLyBUb3RhbCBieXRlcyB0aGF0IGNvdWxkIGJlIGRpc2NhcmRlZC4KKyAgdWludDMyX3QgbnVtX2Z1bGxfcGFnZXM7ICAgICAgIC8vIE51bWJlciBvZiBwYWdlcyB3aXRoIGFsbCBzbG90cyBhbGxvY2F0ZWQuCisgIHVpbnQzMl90IG51bV9hY3RpdmVfcGFnZXM7ICAgICAvLyBOdW1iZXIgb2YgcGFnZXMgdGhhdCBoYXZlIGF0IGxlYXN0IG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvdmlzaW9uZWQgc2xvdC4KKyAgdWludDMyX3QgbnVtX2VtcHR5X3BhZ2VzOyAgICAgIC8vIE51bWJlciBvZiBwYWdlcyB0aGF0IGFyZSBlbXB0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IG5vdCBkZWNvbW1pdHRlZC4KKyAgdWludDMyX3QgbnVtX2RlY29tbWl0dGVkX3BhZ2VzOyAgLy8gTnVtYmVyIG9mIHBhZ2VzIHRoYXQgYXJlIGVtcHR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBkZWNvbW1pdHRlZC4KK307CisKKy8vIEludGVyZmFjZSB0aGF0IGlzIHBhc3NlZCB0byBQYXJ0aXRpb25EdW1wU3RhdHMgYW5kCisvLyBQYXJ0aXRpb25EdW1wU3RhdHNHZW5lcmljIGZvciB1c2luZyB0aGUgbWVtb3J5IHN0YXRpc3RpY3MuCitjbGFzcyBCQVNFX0VYUE9SVCBQYXJ0aXRpb25TdGF0c0R1bXBlciB7CisgcHVibGljOgorICAvLyBDYWxsZWQgdG8gZHVtcCB0b3RhbCBtZW1vcnkgdXNlZCBieSBwYXJ0aXRpb24sIG9uY2UgcGVyIHBhcnRpdGlvbi4KKyAgdmlydHVhbCB2b2lkIFBhcnRpdGlvbkR1bXBUb3RhbHMoY29uc3QgY2hhciogcGFydGl0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcnRpdGlvbk1lbW9yeVN0YXRzKikgPSAwOworCisgIC8vIENhbGxlZCB0byBkdW1wIHN0YXRzIGFib3V0IGJ1Y2tldHMsIGZvciBlYWNoIGJ1Y2tldC4KKyAgdmlydHVhbCB2b2lkIFBhcnRpdGlvbnNEdW1wQnVja2V0U3RhdHMoY29uc3QgY2hhciogcGFydGl0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcnRpdGlvbkJ1Y2tldE1lbW9yeVN0YXRzKikgPSAwOworfTsKKworQkFTRV9FWFBPUlQgdm9pZCBQYXJ0aXRpb25BbGxvY0dsb2JhbEluaXQodm9pZCAoKm9vbV9oYW5kbGluZ19mdW5jdGlvbikoKSk7CitCQVNFX0VYUE9SVCB2b2lkIFBhcnRpdGlvbkFsbG9jSW5pdChQYXJ0aXRpb25Sb290KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1fYnVja2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBtYXhfYWxsb2NhdGlvbik7CitCQVNFX0VYUE9SVCB2b2lkIFBhcnRpdGlvbkFsbG9jR2VuZXJpY0luaXQoUGFydGl0aW9uUm9vdEdlbmVyaWMqKTsKKworZW51bSBQYXJ0aXRpb25QdXJnZUZsYWdzIHsKKyAgLy8gRGVjb21taXR0aW5nIHRoZSByaW5nIGxpc3Qgb2YgZW1wdHkgcGFnZXMgaXMgcmVhc29uYWJseSBmYXN0LgorICBQYXJ0aXRpb25QdXJnZURlY29tbWl0RW1wdHlQYWdlcyA9IDEgPDwgMCwKKyAgLy8gRGlzY2FyZGluZyB1bnVzZWQgc3lzdGVtIHBhZ2VzIGlzIHNsb3dlciwgYmVjYXVzZSBpdCBpbnZvbHZlcyB3YWxraW5nIGFsbAorICAvLyBmcmVlbGlzdHMgaW4gYWxsIGFjdGl2ZSBwYXJ0aXRpb24gcGFnZXMgb2YgYWxsIGJ1Y2tldHMgPj0gc3lzdGVtIHBhZ2UKKyAgLy8gc2l6ZS4gSXQgb2Z0ZW4gZnJlZXMgYSBzaW1pbGFyIGFtb3VudCBvZiBtZW1vcnkgdG8gZGVjb21taXR0aW5nIHRoZSBlbXB0eQorICAvLyBwYWdlcywgdGhvdWdoLgorICBQYXJ0aXRpb25QdXJnZURpc2NhcmRVbnVzZWRTeXN0ZW1QYWdlcyA9IDEgPDwgMSwKK307CisKK0JBU0VfRVhQT1JUIHZvaWQgUGFydGl0aW9uUHVyZ2VNZW1vcnkoUGFydGl0aW9uUm9vdCosIGludCk7CitCQVNFX0VYUE9SVCB2b2lkIFBhcnRpdGlvblB1cmdlTWVtb3J5R2VuZXJpYyhQYXJ0aXRpb25Sb290R2VuZXJpYyosIGludCk7CisKK0JBU0VfRVhQT1JUIE5PSU5MSU5FIHZvaWQqIFBhcnRpdGlvbkFsbG9jU2xvd1BhdGgoUGFydGl0aW9uUm9vdEJhc2UqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uQnVja2V0Kik7CitCQVNFX0VYUE9SVCBOT0lOTElORSB2b2lkIFBhcnRpdGlvbkZyZWVTbG93UGF0aChQYXJ0aXRpb25QYWdlKik7CitCQVNFX0VYUE9SVCBOT0lOTElORSB2b2lkKiBQYXJ0aXRpb25SZWFsbG9jR2VuZXJpYyhQYXJ0aXRpb25Sb290R2VuZXJpYyosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHR5cGVfbmFtZSk7CisKK0JBU0VfRVhQT1JUIHZvaWQgUGFydGl0aW9uRHVtcFN0YXRzKFBhcnRpdGlvblJvb3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFydGl0aW9uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2xpZ2h0X2R1bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aXRpb25TdGF0c0R1bXBlciopOworQkFTRV9FWFBPUlQgdm9pZCBQYXJ0aXRpb25EdW1wU3RhdHNHZW5lcmljKFBhcnRpdGlvblJvb3RHZW5lcmljKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJ0aXRpb25fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2xpZ2h0X2R1bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uU3RhdHNEdW1wZXIqKTsKKworY2xhc3MgQkFTRV9FWFBPUlQgUGFydGl0aW9uQWxsb2NIb29rcyB7CisgcHVibGljOgorICB0eXBlZGVmIHZvaWQgQWxsb2NhdGlvbkhvb2sodm9pZCogYWRkcmVzcywgc2l6ZV90LCBjb25zdCBjaGFyKiB0eXBlX25hbWUpOworICB0eXBlZGVmIHZvaWQgRnJlZUhvb2sodm9pZCogYWRkcmVzcyk7CisKKyAgc3RhdGljIHZvaWQgU2V0QWxsb2NhdGlvbkhvb2soQWxsb2NhdGlvbkhvb2sqIGhvb2spIHsKKyAgICBhbGxvY2F0aW9uX2hvb2tfID0gaG9vazsKKyAgfQorICBzdGF0aWMgdm9pZCBTZXRGcmVlSG9vayhGcmVlSG9vayogaG9vaykgeyBmcmVlX2hvb2tfID0gaG9vazsgfQorCisgIHN0YXRpYyB2b2lkIEFsbG9jYXRpb25Ib29rSWZFbmFibGVkKHZvaWQqIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0eXBlX25hbWUpIHsKKyAgICBBbGxvY2F0aW9uSG9vayogaG9vayA9IGFsbG9jYXRpb25faG9va187CisgICAgaWYgKFVOTElLRUxZKGhvb2sgIT0gbnVsbHB0cikpCisgICAgICBob29rKGFkZHJlc3MsIHNpemUsIHR5cGVfbmFtZSk7CisgIH0KKworICBzdGF0aWMgdm9pZCBGcmVlSG9va0lmRW5hYmxlZCh2b2lkKiBhZGRyZXNzKSB7CisgICAgRnJlZUhvb2sqIGhvb2sgPSBmcmVlX2hvb2tfOworICAgIGlmIChVTkxJS0VMWShob29rICE9IG51bGxwdHIpKQorICAgICAgaG9vayhhZGRyZXNzKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFJlYWxsb2NIb29rSWZFbmFibGVkKHZvaWQqIG9sZF9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBuZXdfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHR5cGVfbmFtZSkgeworICAgIC8vIFJlcG9ydCBhIHJlYWxsb2NhdGlvbiBhcyBhIGZyZWUgZm9sbG93ZWQgYnkgYW4gYWxsb2NhdGlvbi4KKyAgICBBbGxvY2F0aW9uSG9vayogYWxsb2NhdGlvbl9ob29rID0gYWxsb2NhdGlvbl9ob29rXzsKKyAgICBGcmVlSG9vayogZnJlZV9ob29rID0gZnJlZV9ob29rXzsKKyAgICBpZiAoVU5MSUtFTFkoYWxsb2NhdGlvbl9ob29rICYmIGZyZWVfaG9vaykpIHsKKyAgICAgIGZyZWVfaG9vayhvbGRfYWRkcmVzcyk7CisgICAgICBhbGxvY2F0aW9uX2hvb2sobmV3X2FkZHJlc3MsIHNpemUsIHR5cGVfbmFtZSk7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICAvLyBQb2ludGVycyB0byBob29rIGZ1bmN0aW9ucyB0aGF0IFBhcnRpdGlvbkFsbG9jIHdpbGwgY2FsbCBvbiBhbGxvY2F0aW9uIGFuZAorICAvLyBmcmVlIGlmIHRoZSBwb2ludGVycyBhcmUgbm9uLW51bGwuCisgIHN0YXRpYyBBbGxvY2F0aW9uSG9vayogYWxsb2NhdGlvbl9ob29rXzsKKyAgc3RhdGljIEZyZWVIb29rKiBmcmVlX2hvb2tfOworfTsKKworQUxXQVlTX0lOTElORSBQYXJ0aXRpb25GcmVlbGlzdEVudHJ5KiBQYXJ0aXRpb25GcmVlbGlzdE1hc2soCisgICAgUGFydGl0aW9uRnJlZWxpc3RFbnRyeSogcHRyKSB7CisvLyBXZSB1c2UgYnN3YXAgb24gbGl0dGxlIGVuZGlhbiBhcyBhIGZhc3QgbWFzayBmb3IgdHdvIHJlYXNvbnM6CisvLyAxKSBJZiBhbiBvYmplY3QgaXMgZnJlZWQgYW5kIGl0cyB2dGFibGUgdXNlZCB3aGVyZSB0aGUgYXR0YWNrZXIgZG9lc24ndAorLy8gZ2V0IHRoZSBjaGFuY2UgdG8gcnVuIGFsbG9jYXRpb25zIGJldHdlZW4gdGhlIGZyZWUgYW5kIHVzZSwgdGhlIHZ0YWJsZQorLy8gZGVyZWZlcmVuY2UgaXMgbGlrZWx5IHRvIGZhdWx0LgorLy8gMikgSWYgdGhlIGF0dGFja2VyIGhhcyBhIGxpbmVhciBidWZmZXIgb3ZlcmZsb3cgYW5kIGVsZWN0cyB0byB0cnkgYW5kCisvLyBjb3JydXB0IGEgZnJlZWxpc3QgcG9pbnRlciwgcGFydGlhbCBwb2ludGVyIG92ZXJ3cml0ZSBhdHRhY2tzIGFyZQorLy8gdGh3YXJ0ZWQuCisvLyBGb3IgYmlnIGVuZGlhbiwgc2ltaWxhciBndWFyYW50ZWVzIGFyZSBhcnJpdmVkIGF0IHdpdGggYSBuZWdhdGlvbi4KKyNpZiBkZWZpbmVkKEFSQ0hfQ1BVX0JJR19FTkRJQU4pCisgIHVpbnRwdHJfdCBtYXNrZWQgPSB+cmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHB0cik7CisjZWxzZQorICB1aW50cHRyX3QgbWFza2VkID0gQnl0ZVN3YXBVaW50UHRyVChyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ocHRyKSk7CisjZW5kaWYKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UGFydGl0aW9uRnJlZWxpc3RFbnRyeSo+KG1hc2tlZCk7Cit9CisKK0FMV0FZU19JTkxJTkUgc2l6ZV90IFBhcnRpdGlvbkNvb2tpZVNpemVBZGp1c3RBZGQoc2l6ZV90IHNpemUpIHsKKyNpZiBEQ0hFQ0tfSVNfT04oKQorICAvLyBBZGQgc3BhY2UgZm9yIGNvb2tpZXMsIGNoZWNraW5nIGZvciBpbnRlZ2VyIG92ZXJmbG93LiBUT0RPKHBhbG1lcik6CisgIC8vIEludmVzdGlnYXRlIHRoZSBwZXJmb3JtYW5jZSBhbmQgY29kZSBzaXplIGltcGxpY2F0aW9ucyBvZiB1c2luZworICAvLyBDaGVja2VkTnVtZXJpYyB0aHJvdWdob3V0IFBBLgorICBEQ0hFQ0soc2l6ZSArICgyICoga0Nvb2tpZVNpemUpID4gc2l6ZSk7CisgIHNpemUgKz0gMiAqIGtDb29raWVTaXplOworI2VuZGlmCisgIHJldHVybiBzaXplOworfQorCitBTFdBWVNfSU5MSU5FIHNpemVfdCBQYXJ0aXRpb25Db29raWVTaXplQWRqdXN0U3VidHJhY3Qoc2l6ZV90IHNpemUpIHsKKyNpZiBEQ0hFQ0tfSVNfT04oKQorICAvLyBSZW1vdmUgc3BhY2UgZm9yIGNvb2tpZXMuCisgIERDSEVDSyhzaXplID49IDIgKiBrQ29va2llU2l6ZSk7CisgIHNpemUgLT0gMiAqIGtDb29raWVTaXplOworI2VuZGlmCisgIHJldHVybiBzaXplOworfQorCitBTFdBWVNfSU5MSU5FIHZvaWQqIFBhcnRpdGlvbkNvb2tpZUZyZWVQb2ludGVyQWRqdXN0KHZvaWQqIHB0cikgeworI2lmIERDSEVDS19JU19PTigpCisgIC8vIFRoZSB2YWx1ZSBnaXZlbiB0byB0aGUgYXBwbGljYXRpb24gaXMgYWN0dWFsbHkganVzdCBhZnRlciB0aGUgY29va2llLgorICBwdHIgPSBzdGF0aWNfY2FzdDxjaGFyKj4ocHRyKSAtIGtDb29raWVTaXplOworI2VuZGlmCisgIHJldHVybiBwdHI7Cit9CisKK0FMV0FZU19JTkxJTkUgdm9pZCBQYXJ0aXRpb25Db29raWVXcml0ZVZhbHVlKHZvaWQqIHB0cikgeworI2lmIERDSEVDS19JU19PTigpCisgIGF1dG8qIGNvb2tpZV9wdHIgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPihwdHIpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtDb29raWVTaXplOyArK2ksICsrY29va2llX3B0cikKKyAgICAqY29va2llX3B0ciA9IGtDb29raWVWYWx1ZVtpXTsKKyNlbmRpZgorfQorCitBTFdBWVNfSU5MSU5FIHZvaWQgUGFydGl0aW9uQ29va2llQ2hlY2tWYWx1ZSh2b2lkKiBwdHIpIHsKKyNpZiBEQ0hFQ0tfSVNfT04oKQorICBhdXRvKiBjb29raWVfcHRyID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4ocHRyKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrQ29va2llU2l6ZTsgKytpLCArK2Nvb2tpZV9wdHIpCisgICAgRENIRUNLKCpjb29raWVfcHRyID09IGtDb29raWVWYWx1ZVtpXSk7CisjZW5kaWYKK30KKworQUxXQVlTX0lOTElORSBjaGFyKiBQYXJ0aXRpb25TdXBlclBhZ2VUb01ldGFkYXRhQXJlYShjaGFyKiBwdHIpIHsKKyAgYXV0byBwb2ludGVyX2FzX3VpbnQgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ocHRyKTsKKyAgRENIRUNLKCEocG9pbnRlcl9hc191aW50ICYga1N1cGVyUGFnZU9mZnNldE1hc2spKTsKKyAgLy8gVGhlIG1ldGFkYXRhIGFyZWEgaXMgZXhhY3RseSBvbmUgc3lzdGVtIHBhZ2UgKHRoZSBndWFyZCBwYWdlKSBpbnRvIHRoZQorICAvLyBzdXBlciBwYWdlLgorICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ocG9pbnRlcl9hc191aW50ICsga1N5c3RlbVBhZ2VTaXplKTsKK30KKworQUxXQVlTX0lOTElORSBQYXJ0aXRpb25QYWdlKiBQYXJ0aXRpb25Qb2ludGVyVG9QYWdlTm9BbGlnbm1lbnRDaGVjayh2b2lkKiBwdHIpIHsKKyAgYXV0byBwb2ludGVyX2FzX3VpbnQgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ocHRyKTsKKyAgYXV0byogc3VwZXJfcGFnZV9wdHIgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ocG9pbnRlcl9hc191aW50ICYga1N1cGVyUGFnZUJhc2VNYXNrKTsKKyAgdWludHB0cl90IHBhcnRpdGlvbl9wYWdlX2luZGV4ID0KKyAgICAgIChwb2ludGVyX2FzX3VpbnQgJiBrU3VwZXJQYWdlT2Zmc2V0TWFzaykgPj4ga1BhcnRpdGlvblBhZ2VTaGlmdDsKKyAgLy8gSW5kZXggMCBpcyBpbnZhbGlkIGJlY2F1c2UgaXQgaXMgdGhlIG1ldGFkYXRhIGFuZCBndWFyZCBhcmVhIGFuZAorICAvLyB0aGUgbGFzdCBpbmRleCBpcyBpbnZhbGlkIGJlY2F1c2UgaXQgaXMgYSBndWFyZCBwYWdlLgorICBEQ0hFQ0socGFydGl0aW9uX3BhZ2VfaW5kZXgpOworICBEQ0hFQ0socGFydGl0aW9uX3BhZ2VfaW5kZXggPCBrTnVtUGFydGl0aW9uUGFnZXNQZXJTdXBlclBhZ2UgLSAxKTsKKyAgYXV0byogcGFnZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UGFydGl0aW9uUGFnZSo+KAorICAgICAgUGFydGl0aW9uU3VwZXJQYWdlVG9NZXRhZGF0YUFyZWEoc3VwZXJfcGFnZV9wdHIpICsKKyAgICAgIChwYXJ0aXRpb25fcGFnZV9pbmRleCA8PCBrUGFnZU1ldGFkYXRhU2hpZnQpKTsKKyAgLy8gUGFydGl0aW9uIHBhZ2VzIGluIHRoZSBzYW1lIHNsb3Qgc3BhbiBjYW4gc2hhcmUgdGhlIHNhbWUgcGFnZSBvYmplY3QuCisgIC8vIEFkanVzdCBmb3IgdGhhdC4KKyAgc2l6ZV90IGRlbHRhID0gcGFnZS0+cGFnZV9vZmZzZXQgPDwga1BhZ2VNZXRhZGF0YVNoaWZ0OworICBwYWdlID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UGFydGl0aW9uUGFnZSo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHBhZ2UpIC0gZGVsdGEpOworICByZXR1cm4gcGFnZTsKK30KKworQUxXQVlTX0lOTElORSB2b2lkKiBQYXJ0aXRpb25QYWdlVG9Qb2ludGVyKGNvbnN0IFBhcnRpdGlvblBhZ2UqIHBhZ2UpIHsKKyAgYXV0byBwb2ludGVyX2FzX3VpbnQgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ocGFnZSk7CisgIHVpbnRwdHJfdCBzdXBlcl9wYWdlX29mZnNldCA9IChwb2ludGVyX2FzX3VpbnQgJiBrU3VwZXJQYWdlT2Zmc2V0TWFzayk7CisgIERDSEVDSyhzdXBlcl9wYWdlX29mZnNldCA+IGtTeXN0ZW1QYWdlU2l6ZSk7CisgIERDSEVDSyhzdXBlcl9wYWdlX29mZnNldCA8IGtTeXN0ZW1QYWdlU2l6ZSArIChrTnVtUGFydGl0aW9uUGFnZXNQZXJTdXBlclBhZ2UgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1BhZ2VNZXRhZGF0YVNpemUpKTsKKyAgdWludHB0cl90IHBhcnRpdGlvbl9wYWdlX2luZGV4ID0KKyAgICAgIChzdXBlcl9wYWdlX29mZnNldCAtIGtTeXN0ZW1QYWdlU2l6ZSkgPj4ga1BhZ2VNZXRhZGF0YVNoaWZ0OworICAvLyBJbmRleCAwIGlzIGludmFsaWQgYmVjYXVzZSBpdCBpcyB0aGUgbWV0YWRhdGEgYXJlYSBhbmQgdGhlIGxhc3QgaW5kZXggaXMKKyAgLy8gaW52YWxpZCBiZWNhdXNlIGl0IGlzIGEgZ3VhcmQgcGFnZS4KKyAgRENIRUNLKHBhcnRpdGlvbl9wYWdlX2luZGV4KTsKKyAgRENIRUNLKHBhcnRpdGlvbl9wYWdlX2luZGV4IDwga051bVBhcnRpdGlvblBhZ2VzUGVyU3VwZXJQYWdlIC0gMSk7CisgIHVpbnRwdHJfdCBzdXBlcl9wYWdlX2Jhc2UgPSAocG9pbnRlcl9hc191aW50ICYga1N1cGVyUGFnZUJhc2VNYXNrKTsKKyAgYXV0byogcmV0ID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oCisgICAgICBzdXBlcl9wYWdlX2Jhc2UgKyAocGFydGl0aW9uX3BhZ2VfaW5kZXggPDwga1BhcnRpdGlvblBhZ2VTaGlmdCkpOworICByZXR1cm4gcmV0OworfQorCitBTFdBWVNfSU5MSU5FIFBhcnRpdGlvblBhZ2UqIFBhcnRpdGlvblBvaW50ZXJUb1BhZ2Uodm9pZCogcHRyKSB7CisgIFBhcnRpdGlvblBhZ2UqIHBhZ2UgPSBQYXJ0aXRpb25Qb2ludGVyVG9QYWdlTm9BbGlnbm1lbnRDaGVjayhwdHIpOworICAvLyBDaGVja3MgdGhhdCB0aGUgcG9pbnRlciBpcyBhIG11bHRpcGxlIG9mIGJ1Y2tldCBzaXplLgorICBEQ0hFQ0soISgocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHB0cikgLQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFBhcnRpdGlvblBhZ2VUb1BvaW50ZXIocGFnZSkpKSAlCisgICAgICAgICAgIHBhZ2UtPmJ1Y2tldC0+c2xvdF9zaXplKSk7CisgIHJldHVybiBwYWdlOworfQorCitBTFdBWVNfSU5MSU5FIGJvb2wgUGFydGl0aW9uQnVja2V0SXNEaXJlY3RNYXBwZWQoCisgICAgY29uc3QgUGFydGl0aW9uQnVja2V0KiBidWNrZXQpIHsKKyAgcmV0dXJuICFidWNrZXQtPm51bV9zeXN0ZW1fcGFnZXNfcGVyX3Nsb3Rfc3BhbjsKK30KKworQUxXQVlTX0lOTElORSBzaXplX3QgUGFydGl0aW9uQnVja2V0Qnl0ZXMoY29uc3QgUGFydGl0aW9uQnVja2V0KiBidWNrZXQpIHsKKyAgcmV0dXJuIGJ1Y2tldC0+bnVtX3N5c3RlbV9wYWdlc19wZXJfc2xvdF9zcGFuICoga1N5c3RlbVBhZ2VTaXplOworfQorCitBTFdBWVNfSU5MSU5FIHVpbnQxNl90IFBhcnRpdGlvbkJ1Y2tldFNsb3RzKGNvbnN0IFBhcnRpdGlvbkJ1Y2tldCogYnVja2V0KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTZfdD4oUGFydGl0aW9uQnVja2V0Qnl0ZXMoYnVja2V0KSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVja2V0LT5zbG90X3NpemUpOworfQorCitBTFdBWVNfSU5MSU5FIHNpemVfdCogUGFydGl0aW9uUGFnZUdldFJhd1NpemVQdHIoUGFydGl0aW9uUGFnZSogcGFnZSkgeworICAvLyBGb3Igc2luZ2xlLXNsb3QgYnVja2V0cyB3aGljaCBzcGFuIG1vcmUgdGhhbiBvbmUgcGFydGl0aW9uIHBhZ2UsIHdlCisgIC8vIGhhdmUgc29tZSBzcGFyZSBtZXRhZGF0YSBzcGFjZSB0byBzdG9yZSB0aGUgcmF3IGFsbG9jYXRpb24gc2l6ZS4gV2UKKyAgLy8gY2FuIHVzZSB0aGlzIHRvIHJlcG9ydCBiZXR0ZXIgc3RhdGlzdGljcy4KKyAgUGFydGl0aW9uQnVja2V0KiBidWNrZXQgPSBwYWdlLT5idWNrZXQ7CisgIGlmIChidWNrZXQtPnNsb3Rfc2l6ZSA8PSBrTWF4U3lzdGVtUGFnZXNQZXJTbG90U3BhbiAqIGtTeXN0ZW1QYWdlU2l6ZSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBEQ0hFQ0soKGJ1Y2tldC0+c2xvdF9zaXplICUga1N5c3RlbVBhZ2VTaXplKSA9PSAwKTsKKyAgRENIRUNLKFBhcnRpdGlvbkJ1Y2tldElzRGlyZWN0TWFwcGVkKGJ1Y2tldCkgfHwKKyAgICAgICAgIFBhcnRpdGlvbkJ1Y2tldFNsb3RzKGJ1Y2tldCkgPT0gMSk7CisgIHBhZ2UrKzsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90Kj4oJnBhZ2UtPmZyZWVsaXN0X2hlYWQpOworfQorCitBTFdBWVNfSU5MSU5FIHNpemVfdCBQYXJ0aXRpb25QYWdlR2V0UmF3U2l6ZShQYXJ0aXRpb25QYWdlKiBwYWdlKSB7CisgIHNpemVfdCogcmF3X3NpemVfcHRyID0gUGFydGl0aW9uUGFnZUdldFJhd1NpemVQdHIocGFnZSk7CisgIGlmIChVTkxJS0VMWShyYXdfc2l6ZV9wdHIgIT0gbnVsbHB0cikpCisgICAgcmV0dXJuICpyYXdfc2l6ZV9wdHI7CisgIHJldHVybiAwOworfQorCitBTFdBWVNfSU5MSU5FIFBhcnRpdGlvblJvb3RCYXNlKiBQYXJ0aXRpb25QYWdlVG9Sb290KFBhcnRpdGlvblBhZ2UqIHBhZ2UpIHsKKyAgYXV0byogZXh0ZW50X2VudHJ5ID0gcmVpbnRlcnByZXRfY2FzdDxQYXJ0aXRpb25TdXBlclBhZ2VFeHRlbnRFbnRyeSo+KAorICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHBhZ2UpICYga1N5c3RlbVBhZ2VCYXNlTWFzayk7CisgIHJldHVybiBleHRlbnRfZW50cnktPnJvb3Q7Cit9CisKK0FMV0FZU19JTkxJTkUgYm9vbCBQYXJ0aXRpb25Qb2ludGVySXNWYWxpZCh2b2lkKiBwdHIpIHsKKyAgUGFydGl0aW9uUGFnZSogcGFnZSA9IFBhcnRpdGlvblBvaW50ZXJUb1BhZ2UocHRyKTsKKyAgUGFydGl0aW9uUm9vdEJhc2UqIHJvb3QgPSBQYXJ0aXRpb25QYWdlVG9Sb290KHBhZ2UpOworICByZXR1cm4gcm9vdC0+aW52ZXJ0ZWRfc2VsZiA9PSB+cmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHJvb3QpOworfQorCitBTFdBWVNfSU5MSU5FIHZvaWQqIFBhcnRpdGlvbkJ1Y2tldEFsbG9jKFBhcnRpdGlvblJvb3RCYXNlKiByb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJ0aXRpb25CdWNrZXQqIGJ1Y2tldCkgeworICBQYXJ0aXRpb25QYWdlKiBwYWdlID0gYnVja2V0LT5hY3RpdmVfcGFnZXNfaGVhZDsKKyAgLy8gQ2hlY2sgdGhhdCB0aGlzIHBhZ2UgaXMgbmVpdGhlciBmdWxsIG5vciBmcmVlZC4KKyAgRENIRUNLKHBhZ2UtPm51bV9hbGxvY2F0ZWRfc2xvdHMgPj0gMCk7CisgIHZvaWQqIHJldCA9IHBhZ2UtPmZyZWVsaXN0X2hlYWQ7CisgIGlmIChMSUtFTFkocmV0KSkgeworICAgIC8vIElmIHRoZXNlIGFzc2VydHMgZmlyZSwgeW91IHByb2JhYmx5IGNvcnJ1cHRlZCBtZW1vcnkuCisgICAgRENIRUNLKFBhcnRpdGlvblBvaW50ZXJJc1ZhbGlkKHJldCkpOworICAgIC8vIEFsbCBsYXJnZSBhbGxvY2F0aW9ucyBtdXN0IGdvIHRocm91Z2ggdGhlIHNsb3cgcGF0aCB0byBjb3JyZWN0bHkKKyAgICAvLyB1cGRhdGUgdGhlIHNpemUgbWV0YWRhdGEuCisgICAgRENIRUNLKFBhcnRpdGlvblBhZ2VHZXRSYXdTaXplKHBhZ2UpID09IDApOworICAgIFBhcnRpdGlvbkZyZWVsaXN0RW50cnkqIG5ld19oZWFkID0KKyAgICAgICAgUGFydGl0aW9uRnJlZWxpc3RNYXNrKHN0YXRpY19jYXN0PFBhcnRpdGlvbkZyZWVsaXN0RW50cnkqPihyZXQpLT5uZXh0KTsKKyAgICBwYWdlLT5mcmVlbGlzdF9oZWFkID0gbmV3X2hlYWQ7CisgICAgcGFnZS0+bnVtX2FsbG9jYXRlZF9zbG90cysrOworICB9IGVsc2UgeworICAgIHJldCA9IFBhcnRpdGlvbkFsbG9jU2xvd1BhdGgocm9vdCwgZmxhZ3MsIHNpemUsIGJ1Y2tldCk7CisgICAgRENIRUNLKCFyZXQgfHwgUGFydGl0aW9uUG9pbnRlcklzVmFsaWQocmV0KSk7CisgIH0KKyNpZiBEQ0hFQ0tfSVNfT04oKQorICBpZiAoIXJldCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgLy8gRmlsbCB0aGUgdW5pbml0aWFsaXplZCBwYXR0ZXJuLCBhbmQgd3JpdGUgdGhlIGNvb2tpZXMuCisgIHBhZ2UgPSBQYXJ0aXRpb25Qb2ludGVyVG9QYWdlKHJldCk7CisgIHNpemVfdCBzbG90X3NpemUgPSBwYWdlLT5idWNrZXQtPnNsb3Rfc2l6ZTsKKyAgc2l6ZV90IHJhd19zaXplID0gUGFydGl0aW9uUGFnZUdldFJhd1NpemUocGFnZSk7CisgIGlmIChyYXdfc2l6ZSkgeworICAgIERDSEVDSyhyYXdfc2l6ZSA9PSBzaXplKTsKKyAgICBzbG90X3NpemUgPSByYXdfc2l6ZTsKKyAgfQorICBzaXplX3Qgbm9fY29va2llX3NpemUgPSBQYXJ0aXRpb25Db29raWVTaXplQWRqdXN0U3VidHJhY3Qoc2xvdF9zaXplKTsKKyAgYXV0byogY2hhcl9yZXQgPSBzdGF0aWNfY2FzdDxjaGFyKj4ocmV0KTsKKyAgLy8gVGhlIHZhbHVlIGdpdmVuIHRvIHRoZSBhcHBsaWNhdGlvbiBpcyBhY3R1YWxseSBqdXN0IGFmdGVyIHRoZSBjb29raWUuCisgIHJldCA9IGNoYXJfcmV0ICsga0Nvb2tpZVNpemU7CisgIG1lbXNldChyZXQsIGtVbmluaXRpYWxpemVkQnl0ZSwgbm9fY29va2llX3NpemUpOworICBQYXJ0aXRpb25Db29raWVXcml0ZVZhbHVlKGNoYXJfcmV0KTsKKyAgUGFydGl0aW9uQ29va2llV3JpdGVWYWx1ZShjaGFyX3JldCArIGtDb29raWVTaXplICsgbm9fY29va2llX3NpemUpOworI2VuZGlmCisgIHJldHVybiByZXQ7Cit9CisKK0FMV0FZU19JTkxJTkUgdm9pZCogUGFydGl0aW9uQWxsb2MoUGFydGl0aW9uUm9vdCogcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHR5cGVfbmFtZSkgeworI2lmIGRlZmluZWQoTUVNT1JZX1RPT0xfUkVQTEFDRVNfQUxMT0NBVE9SKQorICB2b2lkKiByZXN1bHQgPSBtYWxsb2Moc2l6ZSk7CisgIENIRUNLKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7CisjZWxzZQorICBzaXplX3QgcmVxdWVzdGVkX3NpemUgPSBzaXplOworICBzaXplID0gUGFydGl0aW9uQ29va2llU2l6ZUFkanVzdEFkZChzaXplKTsKKyAgRENIRUNLKHJvb3QtPmluaXRpYWxpemVkKTsKKyAgc2l6ZV90IGluZGV4ID0gc2l6ZSA+PiBrQnVja2V0U2hpZnQ7CisgIERDSEVDSyhpbmRleCA8IHJvb3QtPm51bV9idWNrZXRzKTsKKyAgRENIRUNLKHNpemUgPT0gaW5kZXggPDwga0J1Y2tldFNoaWZ0KTsKKyAgUGFydGl0aW9uQnVja2V0KiBidWNrZXQgPSAmcm9vdC0+YnVja2V0cygpW2luZGV4XTsKKyAgdm9pZCogcmVzdWx0ID0gUGFydGl0aW9uQnVja2V0QWxsb2Mocm9vdCwgMCwgc2l6ZSwgYnVja2V0KTsKKyAgUGFydGl0aW9uQWxsb2NIb29rczo6QWxsb2NhdGlvbkhvb2tJZkVuYWJsZWQocmVzdWx0LCByZXF1ZXN0ZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9uYW1lKTsKKyAgcmV0dXJuIHJlc3VsdDsKKyNlbmRpZiAgLy8gZGVmaW5lZChNRU1PUllfVE9PTF9SRVBMQUNFU19BTExPQ0FUT1IpCit9CisKK0FMV0FZU19JTkxJTkUgdm9pZCBQYXJ0aXRpb25GcmVlV2l0aFBhZ2Uodm9pZCogcHRyLCBQYXJ0aXRpb25QYWdlKiBwYWdlKSB7CisvLyBJZiB0aGVzZSBhc3NlcnRzIGZpcmUsIHlvdSBwcm9iYWJseSBjb3JydXB0ZWQgbWVtb3J5LgorI2lmIERDSEVDS19JU19PTigpCisgIHNpemVfdCBzbG90X3NpemUgPSBwYWdlLT5idWNrZXQtPnNsb3Rfc2l6ZTsKKyAgc2l6ZV90IHJhd19zaXplID0gUGFydGl0aW9uUGFnZUdldFJhd1NpemUocGFnZSk7CisgIGlmIChyYXdfc2l6ZSkKKyAgICBzbG90X3NpemUgPSByYXdfc2l6ZTsKKyAgUGFydGl0aW9uQ29va2llQ2hlY2tWYWx1ZShwdHIpOworICBQYXJ0aXRpb25Db29raWVDaGVja1ZhbHVlKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHB0cikgKyBzbG90X3NpemUgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtDb29raWVTaXplKTsKKyAgbWVtc2V0KHB0ciwga0ZyZWVkQnl0ZSwgc2xvdF9zaXplKTsKKyNlbmRpZgorICBEQ0hFQ0socGFnZS0+bnVtX2FsbG9jYXRlZF9zbG90cyk7CisgIFBhcnRpdGlvbkZyZWVsaXN0RW50cnkqIGZyZWVsaXN0X2hlYWQgPSBwYWdlLT5mcmVlbGlzdF9oZWFkOworICBEQ0hFQ0soIWZyZWVsaXN0X2hlYWQgfHwgUGFydGl0aW9uUG9pbnRlcklzVmFsaWQoZnJlZWxpc3RfaGVhZCkpOworICBDSEVDSyhwdHIgIT0gZnJlZWxpc3RfaGVhZCk7ICAvLyBDYXRjaGVzIGFuIGltbWVkaWF0ZSBkb3VibGUgZnJlZS4KKyAgLy8gTG9vayBmb3IgZG91YmxlIGZyZWUgb25lIGxldmVsIGRlZXBlciBpbiBkZWJ1Zy4KKyAgRENIRUNLKCFmcmVlbGlzdF9oZWFkIHx8IHB0ciAhPSBQYXJ0aXRpb25GcmVlbGlzdE1hc2soZnJlZWxpc3RfaGVhZC0+bmV4dCkpOworICBhdXRvKiBlbnRyeSA9IHN0YXRpY19jYXN0PFBhcnRpdGlvbkZyZWVsaXN0RW50cnkqPihwdHIpOworICBlbnRyeS0+bmV4dCA9IFBhcnRpdGlvbkZyZWVsaXN0TWFzayhmcmVlbGlzdF9oZWFkKTsKKyAgcGFnZS0+ZnJlZWxpc3RfaGVhZCA9IGVudHJ5OworICAtLXBhZ2UtPm51bV9hbGxvY2F0ZWRfc2xvdHM7CisgIGlmIChVTkxJS0VMWShwYWdlLT5udW1fYWxsb2NhdGVkX3Nsb3RzIDw9IDApKSB7CisgICAgUGFydGl0aW9uRnJlZVNsb3dQYXRoKHBhZ2UpOworICB9IGVsc2UgeworICAgIC8vIEFsbCBzaW5nbGUtc2xvdCBhbGxvY2F0aW9ucyBtdXN0IGdvIHRocm91Z2ggdGhlIHNsb3cgcGF0aCB0bworICAgIC8vIGNvcnJlY3RseSB1cGRhdGUgdGhlIHNpemUgbWV0YWRhdGEuCisgICAgRENIRUNLKFBhcnRpdGlvblBhZ2VHZXRSYXdTaXplKHBhZ2UpID09IDApOworICB9Cit9CisKK0FMV0FZU19JTkxJTkUgdm9pZCBQYXJ0aXRpb25GcmVlKHZvaWQqIHB0cikgeworI2lmIGRlZmluZWQoTUVNT1JZX1RPT0xfUkVQTEFDRVNfQUxMT0NBVE9SKQorICBmcmVlKHB0cik7CisjZWxzZQorICBQYXJ0aXRpb25BbGxvY0hvb2tzOjpGcmVlSG9va0lmRW5hYmxlZChwdHIpOworICBwdHIgPSBQYXJ0aXRpb25Db29raWVGcmVlUG9pbnRlckFkanVzdChwdHIpOworICBEQ0hFQ0soUGFydGl0aW9uUG9pbnRlcklzVmFsaWQocHRyKSk7CisgIFBhcnRpdGlvblBhZ2UqIHBhZ2UgPSBQYXJ0aXRpb25Qb2ludGVyVG9QYWdlKHB0cik7CisgIFBhcnRpdGlvbkZyZWVXaXRoUGFnZShwdHIsIHBhZ2UpOworI2VuZGlmCit9CisKK0FMV0FZU19JTkxJTkUgUGFydGl0aW9uQnVja2V0KiBQYXJ0aXRpb25HZW5lcmljU2l6ZVRvQnVja2V0KAorICAgIFBhcnRpdGlvblJvb3RHZW5lcmljKiByb290LAorICAgIHNpemVfdCBzaXplKSB7CisgIHNpemVfdCBvcmRlciA9IGtCaXRzUGVyU2l6ZVQgLSBiaXRzOjpDb3VudExlYWRpbmdaZXJvQml0c1NpemVUKHNpemUpOworICAvLyBUaGUgb3JkZXIgaW5kZXggaXMgc2ltcGx5IHRoZSBuZXh0IGZldyBiaXRzIGFmdGVyIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdC4KKyAgc2l6ZV90IG9yZGVyX2luZGV4ID0gKHNpemUgPj4gcm9vdC0+b3JkZXJfaW5kZXhfc2hpZnRzW29yZGVyXSkgJgorICAgICAgICAgICAgICAgICAgICAgICAoa0dlbmVyaWNOdW1CdWNrZXRzUGVyT3JkZXIgLSAxKTsKKyAgLy8gQW5kIGlmIHRoZSByZW1haW5pbmcgYml0cyBhcmUgbm9uLXplcm8gd2UgbXVzdCBidW1wIHRoZSBidWNrZXQgdXAuCisgIHNpemVfdCBzdWJfb3JkZXJfaW5kZXggPSBzaXplICYgcm9vdC0+b3JkZXJfc3ViX2luZGV4X21hc2tzW29yZGVyXTsKKyAgUGFydGl0aW9uQnVja2V0KiBidWNrZXQgPQorICAgICAgcm9vdC0+YnVja2V0X2xvb2t1cHNbKG9yZGVyIDw8IGtHZW5lcmljTnVtQnVja2V0c1Blck9yZGVyQml0cykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJfaW5kZXggKyAhIXN1Yl9vcmRlcl9pbmRleF07CisgIERDSEVDSyghYnVja2V0LT5zbG90X3NpemUgfHwgYnVja2V0LT5zbG90X3NpemUgPj0gc2l6ZSk7CisgIERDSEVDSyghKGJ1Y2tldC0+c2xvdF9zaXplICUga0dlbmVyaWNTbWFsbGVzdEJ1Y2tldCkpOworICByZXR1cm4gYnVja2V0OworfQorCitBTFdBWVNfSU5MSU5FIHZvaWQqIFBhcnRpdGlvbkFsbG9jR2VuZXJpY0ZsYWdzKFBhcnRpdGlvblJvb3RHZW5lcmljKiByb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0eXBlX25hbWUpIHsKKyNpZiBkZWZpbmVkKE1FTU9SWV9UT09MX1JFUExBQ0VTX0FMTE9DQVRPUikKKyAgdm9pZCogcmVzdWx0ID0gbWFsbG9jKHNpemUpOworICBDSEVDSyhyZXN1bHQgfHwgZmxhZ3MgJiBQYXJ0aXRpb25BbGxvY1JldHVybk51bGwpOworICByZXR1cm4gcmVzdWx0OworI2Vsc2UKKyAgRENIRUNLKHJvb3QtPmluaXRpYWxpemVkKTsKKyAgc2l6ZV90IHJlcXVlc3RlZF9zaXplID0gc2l6ZTsKKyAgc2l6ZSA9IFBhcnRpdGlvbkNvb2tpZVNpemVBZGp1c3RBZGQoc2l6ZSk7CisgIFBhcnRpdGlvbkJ1Y2tldCogYnVja2V0ID0gUGFydGl0aW9uR2VuZXJpY1NpemVUb0J1Y2tldChyb290LCBzaXplKTsKKyAgdm9pZCogcmV0ID0gbnVsbHB0cjsKKyAgeworICAgIHN1YnRsZTo6U3BpbkxvY2s6Okd1YXJkIGd1YXJkKHJvb3QtPmxvY2spOworICAgIHJldCA9IFBhcnRpdGlvbkJ1Y2tldEFsbG9jKHJvb3QsIGZsYWdzLCBzaXplLCBidWNrZXQpOworICB9CisgIFBhcnRpdGlvbkFsbG9jSG9va3M6OkFsbG9jYXRpb25Ib29rSWZFbmFibGVkKHJldCwgcmVxdWVzdGVkX3NpemUsIHR5cGVfbmFtZSk7CisgIHJldHVybiByZXQ7CisjZW5kaWYKK30KKworQUxXQVlTX0lOTElORSB2b2lkKiBQYXJ0aXRpb25BbGxvY0dlbmVyaWMoUGFydGl0aW9uUm9vdEdlbmVyaWMqIHJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHR5cGVfbmFtZSkgeworICByZXR1cm4gUGFydGl0aW9uQWxsb2NHZW5lcmljRmxhZ3Mocm9vdCwgMCwgc2l6ZSwgdHlwZV9uYW1lKTsKK30KKworQUxXQVlTX0lOTElORSB2b2lkIFBhcnRpdGlvbkZyZWVHZW5lcmljKFBhcnRpdGlvblJvb3RHZW5lcmljKiByb290LCB2b2lkKiBwdHIpIHsKKyNpZiBkZWZpbmVkKE1FTU9SWV9UT09MX1JFUExBQ0VTX0FMTE9DQVRPUikKKyAgZnJlZShwdHIpOworI2Vsc2UKKyAgRENIRUNLKHJvb3QtPmluaXRpYWxpemVkKTsKKworICBpZiAoVU5MSUtFTFkoIXB0cikpCisgICAgcmV0dXJuOworCisgIFBhcnRpdGlvbkFsbG9jSG9va3M6OkZyZWVIb29rSWZFbmFibGVkKHB0cik7CisgIHB0ciA9IFBhcnRpdGlvbkNvb2tpZUZyZWVQb2ludGVyQWRqdXN0KHB0cik7CisgIERDSEVDSyhQYXJ0aXRpb25Qb2ludGVySXNWYWxpZChwdHIpKTsKKyAgUGFydGl0aW9uUGFnZSogcGFnZSA9IFBhcnRpdGlvblBvaW50ZXJUb1BhZ2UocHRyKTsKKyAgeworICAgIHN1YnRsZTo6U3BpbkxvY2s6Okd1YXJkIGd1YXJkKHJvb3QtPmxvY2spOworICAgIFBhcnRpdGlvbkZyZWVXaXRoUGFnZShwdHIsIHBhZ2UpOworICB9CisjZW5kaWYKK30KKworQUxXQVlTX0lOTElORSBzaXplX3QgUGFydGl0aW9uRGlyZWN0TWFwU2l6ZShzaXplX3Qgc2l6ZSkgeworICAvLyBDYWxsZXIgbXVzdCBjaGVjayB0aGF0IHRoZSBzaXplIGlzIG5vdCBhYm92ZSB0aGUga0dlbmVyaWNNYXhEaXJlY3RNYXBwZWQKKyAgLy8gbGltaXQgYmVmb3JlIGNhbGxpbmcuIFRoaXMgYWxzbyBndWFyZHMgYWdhaW5zdCBpbnRlZ2VyIG92ZXJmbG93IGluIHRoZQorICAvLyBjYWxjdWxhdGlvbiBoZXJlLgorICBEQ0hFQ0soc2l6ZSA8PSBrR2VuZXJpY01heERpcmVjdE1hcHBlZCk7CisgIHJldHVybiAoc2l6ZSArIGtTeXN0ZW1QYWdlT2Zmc2V0TWFzaykgJiBrU3lzdGVtUGFnZUJhc2VNYXNrOworfQorCitBTFdBWVNfSU5MSU5FIHNpemVfdCBQYXJ0aXRpb25BbGxvY0FjdHVhbFNpemUoUGFydGl0aW9uUm9vdEdlbmVyaWMqIHJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHsKKyNpZiBkZWZpbmVkKE1FTU9SWV9UT09MX1JFUExBQ0VTX0FMTE9DQVRPUikKKyAgcmV0dXJuIHNpemU7CisjZWxzZQorICBEQ0hFQ0socm9vdC0+aW5pdGlhbGl6ZWQpOworICBzaXplID0gUGFydGl0aW9uQ29va2llU2l6ZUFkanVzdEFkZChzaXplKTsKKyAgUGFydGl0aW9uQnVja2V0KiBidWNrZXQgPSBQYXJ0aXRpb25HZW5lcmljU2l6ZVRvQnVja2V0KHJvb3QsIHNpemUpOworICBpZiAoTElLRUxZKCFQYXJ0aXRpb25CdWNrZXRJc0RpcmVjdE1hcHBlZChidWNrZXQpKSkgeworICAgIHNpemUgPSBidWNrZXQtPnNsb3Rfc2l6ZTsKKyAgfSBlbHNlIGlmIChzaXplID4ga0dlbmVyaWNNYXhEaXJlY3RNYXBwZWQpIHsKKyAgICAvLyBUb28gbGFyZ2UgdG8gYWxsb2NhdGUgPT4gcmV0dXJuIHRoZSBzaXplIHVuY2hhbmdlZC4KKyAgfSBlbHNlIHsKKyAgICBEQ0hFQ0soYnVja2V0ID09ICZQYXJ0aXRpb25Sb290QmFzZTo6Z1BhZ2VkQnVja2V0KTsKKyAgICBzaXplID0gUGFydGl0aW9uRGlyZWN0TWFwU2l6ZShzaXplKTsKKyAgfQorICByZXR1cm4gUGFydGl0aW9uQ29va2llU2l6ZUFkanVzdFN1YnRyYWN0KHNpemUpOworI2VuZGlmCit9CisKK0FMV0FZU19JTkxJTkUgYm9vbCBQYXJ0aXRpb25BbGxvY1N1cHBvcnRzR2V0U2l6ZSgpIHsKKyNpZiBkZWZpbmVkKE1FTU9SWV9UT09MX1JFUExBQ0VTX0FMTE9DQVRPUikKKyAgcmV0dXJuIGZhbHNlOworI2Vsc2UKKyAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30KKworQUxXQVlTX0lOTElORSBzaXplX3QgUGFydGl0aW9uQWxsb2NHZXRTaXplKHZvaWQqIHB0cikgeworICAvLyBObyBuZWVkIHRvIGxvY2sgaGVyZS4gT25seSB8cHRyfCBiZWluZyBmcmVlZCBieSBhbm90aGVyIHRocmVhZCBjb3VsZAorICAvLyBjYXVzZSB0cm91YmxlLCBhbmQgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgdGhhdCBub3QgaGFwcGVuaW5nLgorICBEQ0hFQ0soUGFydGl0aW9uQWxsb2NTdXBwb3J0c0dldFNpemUoKSk7CisgIHB0ciA9IFBhcnRpdGlvbkNvb2tpZUZyZWVQb2ludGVyQWRqdXN0KHB0cik7CisgIERDSEVDSyhQYXJ0aXRpb25Qb2ludGVySXNWYWxpZChwdHIpKTsKKyAgUGFydGl0aW9uUGFnZSogcGFnZSA9IFBhcnRpdGlvblBvaW50ZXJUb1BhZ2UocHRyKTsKKyAgc2l6ZV90IHNpemUgPSBwYWdlLT5idWNrZXQtPnNsb3Rfc2l6ZTsKKyAgcmV0dXJuIFBhcnRpdGlvbkNvb2tpZVNpemVBZGp1c3RTdWJ0cmFjdChzaXplKTsKK30KKworLy8gTiAob3IgbW9yZSBhY2N1cmF0ZWx5LCBOIC0gc2l6ZW9mKHZvaWQqKSkgcmVwcmVzZW50cyB0aGUgbGFyZ2VzdCBzaXplIGluCisvLyBieXRlcyB0aGF0IHdpbGwgYmUgaGFuZGxlZCBieSBhIFNpemVTcGVjaWZpY1BhcnRpdGlvbkFsbG9jYXRvci4KKy8vIEF0dGVtcHRzIHRvIHBhcnRpdGlvbkFsbG9jKCkgbW9yZSB0aGFuIHRoaXMgYW1vdW50IHdpbGwgZmFpbC4KK3RlbXBsYXRlIDxzaXplX3QgTj4KK2NsYXNzIFNpemVTcGVjaWZpY1BhcnRpdGlvbkFsbG9jYXRvciB7CisgcHVibGljOgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhBbGxvY2F0aW9uID0gTiAtIGtBbGxvY2F0aW9uR3JhbnVsYXJpdHk7CisgIHN0YXRpYyBjb25zdCBzaXplX3Qga051bUJ1Y2tldHMgPSBOIC8ga0FsbG9jYXRpb25HcmFudWxhcml0eTsKKyAgdm9pZCBpbml0KCkgeworICAgIFBhcnRpdGlvbkFsbG9jSW5pdCgmcGFydGl0aW9uX3Jvb3RfLCBrTnVtQnVja2V0cywga01heEFsbG9jYXRpb24pOworICB9CisgIEFMV0FZU19JTkxJTkUgUGFydGl0aW9uUm9vdCogcm9vdCgpIHsgcmV0dXJuICZwYXJ0aXRpb25fcm9vdF87IH0KKworIHByaXZhdGU6CisgIFBhcnRpdGlvblJvb3QgcGFydGl0aW9uX3Jvb3RfOworICBQYXJ0aXRpb25CdWNrZXQgYWN0dWFsX2J1Y2tldHNfW2tOdW1CdWNrZXRzXTsKK307CisKK2NsYXNzIFBhcnRpdGlvbkFsbG9jYXRvckdlbmVyaWMgeworIHB1YmxpYzoKKyAgdm9pZCBpbml0KCkgeyBQYXJ0aXRpb25BbGxvY0dlbmVyaWNJbml0KCZwYXJ0aXRpb25fcm9vdF8pOyB9CisgIEFMV0FZU19JTkxJTkUgUGFydGl0aW9uUm9vdEdlbmVyaWMqIHJvb3QoKSB7IHJldHVybiAmcGFydGl0aW9uX3Jvb3RfOyB9CisKKyBwcml2YXRlOgorICBQYXJ0aXRpb25Sb290R2VuZXJpYyBwYXJ0aXRpb25fcm9vdF87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIHBkZml1bQorCisjZW5kaWYgIC8vIEJBU0VfQUxMT0NBVE9SX1BBUlRJVElPTl9BTExPQ0FUT1JfUEFSVElUSU9OX0FMTE9DX0gKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3Ivc3Bpbl9sb2NrLmNjIGIvdGhpcmRfcGFydHkvYmFzZS9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jYXRvci9zcGluX2xvY2suY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ3MTUxYQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3Ivc3Bpbl9sb2NrLmNjCkBAIC0wLDAgKzEsODQgQEAKKy8vIENvcHlyaWdodCAyMDE1IFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3Ivc3Bpbl9sb2NrLmgiCisKKyNpZiBkZWZpbmVkKE9TX1dJTikKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZWxpZiBkZWZpbmVkKE9TX1BPU0lYKQorI2luY2x1ZGUgPHNjaGVkLmg+CisjZW5kaWYKKworLy8gVGhlIFlJRUxEX1BST0NFU1NPUiBtYWNybyB3cmFwcyBhbiBhcmNoaXRlY3R1cmUgc3BlY2lmaWMtaW5zdHJ1Y3Rpb24gdGhhdAorLy8gaW5mb3JtcyB0aGUgcHJvY2Vzc29yIHdlJ3JlIGluIGEgYnVzeSB3YWl0LCBzbyBpdCBjYW4gaGFuZGxlIHRoZSBicmFuY2ggbW9yZQorLy8gaW50ZWxsaWdlbnRseSBhbmQgZS5nLiByZWR1Y2UgcG93ZXIgdG8gb3VyIGNvcmUgb3IgZ2l2ZSBtb3JlIHJlc291cmNlcyB0byB0aGUKKy8vIG90aGVyIGh5cGVyLXRocmVhZCBvbiB0aGlzIGNvcmUuIFNlZSB0aGUgZm9sbG93aW5nIGZvciBjb250ZXh0OgorLy8gaHR0cHM6Ly9zb2Z0d2FyZS5pbnRlbC5jb20vZW4tdXMvYXJ0aWNsZXMvYmVuZWZpdHRpbmctcG93ZXItYW5kLXBlcmZvcm1hbmNlLXNsZWVwLWxvb3BzCisvLworLy8gVGhlIFlJRUxEX1RIUkVBRCBtYWNybyB0ZWxscyB0aGUgT1MgdG8gcmVsaW5xdWlzaCBvdXIgcXVhbnR1bS4gVGhpcyBpcworLy8gYmFzaWNhbGx5IGEgd29yc3QtY2FzZSBmYWxsYmFjaywgYW5kIGlmIHlvdSdyZSBoaXR0aW5nIGl0IHdpdGggYW55IGZyZXF1ZW5jeQorLy8geW91IHJlYWxseSBzaG91bGQgYmUgdXNpbmcgYSBwcm9wZXIgbG9jayAoc3VjaCBhcyB8YmFzZTo6TG9ja3wpcmF0aGVyIHRoYW4KKy8vIHRoZXNlIHNwaW5sb2Nrcy4KKyNpZiBkZWZpbmVkKE9TX1dJTikKKyNkZWZpbmUgWUlFTERfUFJPQ0VTU09SIFlpZWxkUHJvY2Vzc29yKCkKKyNkZWZpbmUgWUlFTERfVEhSRUFEIFN3aXRjaFRvVGhyZWFkKCkKKyNlbGlmIGRlZmluZWQoQ09NUElMRVJfR0NDKSB8fCBkZWZpbmVkKF9fY2xhbmdfXykKKyNpZiBkZWZpbmVkKEFSQ0hfQ1BVX1g4Nl82NCkgfHwgZGVmaW5lZChBUkNIX0NQVV9YODYpCisjZGVmaW5lIFlJRUxEX1BST0NFU1NPUiBfX2FzbV9fIF9fdm9sYXRpbGVfXygicGF1c2UiKQorI2VsaWYgKGRlZmluZWQoQVJDSF9DUFVfQVJNRUwpICYmIF9fQVJNX0FSQ0ggPj0gNikgfHwgZGVmaW5lZChBUkNIX0NQVV9BUk02NCkKKyNkZWZpbmUgWUlFTERfUFJPQ0VTU09SIF9fYXNtX18gX192b2xhdGlsZV9fKCJ5aWVsZCIpCisjZWxpZiBkZWZpbmVkKEFSQ0hfQ1BVX01JUFNFTCkKKy8vIFRoZSBNSVBTMzIgZG9jcyBzdGF0ZSB0aGF0IHRoZSBQQVVTRSBpbnN0cnVjdGlvbiBpcyBhIG5vLW9wIG9uIG9sZGVyCisvLyBhcmNoaXRlY3R1cmVzIChmaXJzdCBhZGRlZCBpbiBNSVBTMzJyMikuIFRvIGF2b2lkIGFzc2VtYmxlciBlcnJvcnMgd2hlbgorLy8gdGFyZ2V0aW5nIHByZS1yMiwgd2UgbXVzdCBlbmNvZGUgdGhlIGluc3RydWN0aW9uIG1hbnVhbGx5LgorI2RlZmluZSBZSUVMRF9QUk9DRVNTT1IgX19hc21fXyBfX3ZvbGF0aWxlX18oIi53b3JkIDB4MDAwMDAxNDAiKQorI2VsaWYgZGVmaW5lZChBUkNIX0NQVV9NSVBTNjRFTCkgJiYgX19taXBzX2lzYV9yZXYgPj0gMgorLy8gRG9uJ3QgYm90aGVyIGRvaW5nIHVzaW5nIC53b3JkIGhlcmUgc2luY2UgcjIgaXMgdGhlIGxvd2VzdCBzdXBwb3J0ZWQgbWlwczY0CisvLyB0aGF0IENocm9taXVtIHN1cHBvcnRzLgorI2RlZmluZSBZSUVMRF9QUk9DRVNTT1IgX19hc21fXyBfX3ZvbGF0aWxlX18oInBhdXNlIikKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgWUlFTERfUFJPQ0VTU09SCisjd2FybmluZyAiUHJvY2Vzc29yIHlpZWxkIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBhcmNoaXRlY3R1cmUuIgorI2RlZmluZSBZSUVMRF9QUk9DRVNTT1IgKCh2b2lkKTApCisjZW5kaWYKKworI2lmbmRlZiBZSUVMRF9USFJFQUQKKyNpZiBkZWZpbmVkKE9TX1BPU0lYKQorI2RlZmluZSBZSUVMRF9USFJFQUQgc2NoZWRfeWllbGQoKQorI2Vsc2UKKyN3YXJuaW5nICJUaHJlYWQgeWllbGQgbm90IHN1cHBvcnRlZCBvbiB0aGlzIE9TLiIKKyNkZWZpbmUgWUlFTERfVEhSRUFEICgodm9pZCkwKQorI2VuZGlmCisjZW5kaWYKKworbmFtZXNwYWNlIHBkZml1bSB7CituYW1lc3BhY2UgYmFzZSB7CituYW1lc3BhY2Ugc3VidGxlIHsKKwordm9pZCBTcGluTG9jazo6TG9ja1Nsb3coKSB7CisgIC8vIFRoZSB2YWx1ZSBvZiB8a1lpZWxkUHJvY2Vzc29yVHJpZXN8IGlzIGNhcmdvIGN1bHRlZCBmcm9tIFRDTWFsbG9jLCBXaW5kb3dzCisgIC8vIGNyaXRpY2FsIHNlY3Rpb24gZGVmYXVsdHMsIGFuZCB2YXJpb3VzIG90aGVyIHJlY29tbWVuZGF0aW9ucy4KKyAgLy8gVE9ETyhqc2NodWgpOiBGdXJ0aGVyIHR1bmluZyBtYXkgYmUgd2FycmFudGVkLgorICBzdGF0aWMgY29uc3QgaW50IGtZaWVsZFByb2Nlc3NvclRyaWVzID0gMTAwMDsKKyAgZG8geworICAgIGRvIHsKKyAgICAgIGZvciAoaW50IGNvdW50ID0gMDsgY291bnQgPCBrWWllbGRQcm9jZXNzb3JUcmllczsgKytjb3VudCkgeworICAgICAgICAvLyBMZXQgdGhlIHByb2Nlc3NvciBrbm93IHdlJ3JlIHNwaW5uaW5nLgorICAgICAgICBZSUVMRF9QUk9DRVNTT1I7CisgICAgICAgIGlmICghbG9ja18ubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSAmJgorICAgICAgICAgICAgTElLRUxZKCFsb2NrXy5leGNoYW5nZSh0cnVlLCBzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKSkpCisgICAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICAvLyBHaXZlIHRoZSBPUyBhIGNoYW5jZSB0byBzY2hlZHVsZSBzb21ldGhpbmcgb24gdGhpcyBjb3JlLgorICAgICAgWUlFTERfVEhSRUFEOworICAgIH0gd2hpbGUgKGxvY2tfLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpOworICB9IHdoaWxlIChVTkxJS0VMWShsb2NrXy5leGNoYW5nZSh0cnVlLCBzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKSkpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc3VidGxlCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIHBkZml1bQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmFzZS9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jYXRvci9zcGluX2xvY2suaCBiL3RoaXJkX3BhcnR5L2Jhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3Ivc3Bpbl9sb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0MmEyOQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3Ivc3Bpbl9sb2NrLmgKQEAgLTAsMCArMSw1NCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBCQVNFX0FMTE9DQVRPUl9QQVJUSVRJT05fQUxMT0NBVE9SX1NQSU5fTE9DS19ICisjZGVmaW5lIEJBU0VfQUxMT0NBVE9SX1BBUlRJVElPTl9BTExPQ0FUT1JfU1BJTl9MT0NLX0gKKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2Jhc2VfZXhwb3J0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgorCisvLyBTcGlubG9jayBpcyBhIHNpbXBsZSBzcGlubG9jayBjbGFzcyBiYXNlZCBvbiB0aGUgc3RhbmRhcmQgQ1BVIHByaW1pdGl2ZSBvZgorLy8gYXRvbWljIGluY3JlbWVudCBhbmQgZGVjcmVtZW50IG9mIGFuIGludCBhdCBhIGdpdmVuIG1lbW9yeSBhZGRyZXNzLiBUaGVzZSBhcmUKKy8vIGludGVuZGVkIG9ubHkgZm9yIHZlcnkgc2hvcnQgZHVyYXRpb24gbG9ja3MgYW5kIGFzc3VtZSBhIHN5c3RlbSB3aXRoIG11bHRpcGxlCisvLyBjb3Jlcy4gRm9yIGFueSBwb3RlbnRpYWxseSBsb25nZXIgd2FpdCB5b3Ugc2hvdWxkIHVzZSBhIHJlYWwgbG9jaywgc3VjaCBhcworLy8gfGJhc2U6OkxvY2t8LgorLy8KKy8vIHxTcGluTG9ja3xzIE1VU1QgYmUgZ2xvYmFscy4gVXNpbmcgdGhlbSBhcyAoZS5nLikgc3RydWN0L2NsYXNzIG1lbWJlcnMgd2lsbAorLy8gcmVzdWx0IGluIGFuIHVuaW5pdGlhbGl6ZWQgbG9jaywgd2hpY2ggaXMgZGFuZ2Vyb3VzbHkgaW5jb3JyZWN0LgorCituYW1lc3BhY2UgcGRmaXVtIHsKK25hbWVzcGFjZSBiYXNlIHsKK25hbWVzcGFjZSBzdWJ0bGUgeworCitjbGFzcyBTcGluTG9jayB7CisgcHVibGljOgorICB1c2luZyBHdWFyZCA9IHN0ZDo6bG9ja19ndWFyZDxTcGluTG9jaz47CisKKyAgQUxXQVlTX0lOTElORSB2b2lkIGxvY2soKSB7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YobG9ja18pID09IHNpemVvZihpbnQpLAorICAgICAgICAgICAgICAgICAgImludCBhbmQgbG9ja18gYXJlIGRpZmZlcmVudCBzaXplcyIpOworICAgIGlmIChMSUtFTFkoIWxvY2tfLmV4Y2hhbmdlKHRydWUsIHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpKSkKKyAgICAgIHJldHVybjsKKyAgICBMb2NrU2xvdygpOworICB9CisKKyAgQUxXQVlTX0lOTElORSB2b2lkIHVubG9jaygpIHsgbG9ja18uc3RvcmUoZmFsc2UsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UpOyB9CisKKyBwcml2YXRlOgorICAvLyBUaGlzIGlzIGNhbGxlZCBpZiB0aGUgaW5pdGlhbCBhdHRlbXB0IHRvIGFjcXVpcmUgdGhlIGxvY2sgZmFpbHMuIEl0J3MKKyAgLy8gc2xvd2VyLCBidXQgaGFzIGEgbXVjaCBiZXR0ZXIgc2NoZWR1bGluZyBhbmQgcG93ZXIgY29uc3VtcHRpb24gYmVoYXZpb3IuCisgIEJBU0VfRVhQT1JUIHZvaWQgTG9ja1Nsb3coKTsKKworICBzdGQ6OmF0b21pY19pbnQgbG9ja187Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc3VidGxlCit9ICAvLyBuYW1lc3BhY2UgYmFzZQorfSAgLy8gbmFtZXNwYWNlIHBkZml1bQorCisjZW5kaWYgIC8vIEJBU0VfQUxMT0NBVE9SX1BBUlRJVElPTl9BTExPQ0FUT1JfU1BJTl9MT0NLX0gKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jhc2UvYmFzZV9leHBvcnQuaCBiL3RoaXJkX3BhcnR5L2Jhc2UvYmFzZV9leHBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGQ2ZDliCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYmFzZS9iYXNlX2V4cG9ydC5oCkBAIC0wLDAgKzEsMyBAQAorI2lmbmRlZiBCQVNFX0VYUE9SVAorI2RlZmluZSBCQVNFX0VYUE9SVAorI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9iYXNlL2JpdHMuaCBiL3RoaXJkX3BhcnR5L2Jhc2UvYml0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMGJlNGIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9iYXNlL2JpdHMuaApAQCAtMCwwICsxLDExNCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gVGhpcyBmaWxlIGRlZmluZXMgc29tZSBiaXQgdXRpbGl0aWVzLgorCisjaWZuZGVmIEJBU0VfQklUU19IXworI2RlZmluZSBCQVNFX0JJVFNfSF8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgorCisjaWYgZGVmaW5lZChDT01QSUxFUl9NU1ZDKQorI2luY2x1ZGUgPGludHJpbi5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBwZGZpdW0geworbmFtZXNwYWNlIGJhc2UgeworbmFtZXNwYWNlIGJpdHMgeworCisvLyBSZXR1cm5zIHRoZSBpbnRlZ2VyIGkgc3VjaCBhcyAyXmkgPD0gbiA8IDJeKGkrMSkKK2lubGluZSBpbnQgTG9nMkZsb29yKHVpbnQzMl90IG4pIHsKKyAgaWYgKG4gPT0gMCkKKyAgICByZXR1cm4gLTE7CisgIGludCBsb2cgPSAwOworICB1aW50MzJfdCB2YWx1ZSA9IG47CisgIGZvciAoaW50IGkgPSA0OyBpID49IDA7IC0taSkgeworICAgIGludCBzaGlmdCA9ICgxIDw8IGkpOworICAgIHVpbnQzMl90IHggPSB2YWx1ZSA+PiBzaGlmdDsKKyAgICBpZiAoeCAhPSAwKSB7CisgICAgICB2YWx1ZSA9IHg7CisgICAgICBsb2cgKz0gc2hpZnQ7CisgICAgfQorICB9CisgIERDSEVDS19FUSh2YWx1ZSwgMXUpOworICByZXR1cm4gbG9nOworfQorCisvLyBSZXR1cm5zIHRoZSBpbnRlZ2VyIGkgc3VjaCBhcyAyXihpLTEpIDwgbiA8PSAyXmkKK2lubGluZSBpbnQgTG9nMkNlaWxpbmcodWludDMyX3QgbikgeworICBpZiAobiA9PSAwKSB7CisgICAgcmV0dXJuIC0xOworICB9IGVsc2UgeworICAgIC8vIExvZzJGbG9vciByZXR1cm5zIC0xIGZvciAwLCBzbyB0aGUgZm9sbG93aW5nIHdvcmtzIGNvcnJlY3RseSBmb3Igbj0xLgorICAgIHJldHVybiAxICsgTG9nMkZsb29yKG4gLSAxKTsKKyAgfQorfQorCisvLyBSb3VuZCB1cCB8c2l6ZXwgdG8gYSBtdWx0aXBsZSBvZiBhbGlnbm1lbnQsIHdoaWNoIG11c3QgYmUgYSBwb3dlciBvZiB0d28uCitpbmxpbmUgc2l6ZV90IEFsaWduKHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ25tZW50KSB7CisgIERDSEVDS19FUShhbGlnbm1lbnQgJiAoYWxpZ25tZW50IC0gMSksIDB1KTsKKyAgcmV0dXJuIChzaXplICsgYWxpZ25tZW50IC0gMSkgJiB+KGFsaWdubWVudCAtIDEpOworfQorCisvLyBUaGVzZSBmdW5jdGlvbnMgY291bnQgdGhlIG51bWJlciBvZiBsZWFkaW5nIHplcm9zIGluIGEgYmluYXJ5IHZhbHVlLCBzdGFydGluZworLy8gd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQuIEMgZG9lcyBub3QgaGF2ZSBhbiBvcGVyYXRvciB0byBkbyB0aGlzLCBidXQKKy8vIGZvcnR1bmF0ZWx5IHRoZSB2YXJpb3VzIGNvbXBpbGVycyBoYXZlIGJ1aWx0LWlucyB0aGF0IG1hcCB0byBmYXN0IHVuZGVybHlpbmcKKy8vIHByb2Nlc3NvciBpbnN0cnVjdGlvbnMuCisjaWYgZGVmaW5lZChDT01QSUxFUl9NU1ZDKQorCitBTFdBWVNfSU5MSU5FIHVpbnQzMl90IENvdW50TGVhZGluZ1plcm9CaXRzMzIodWludDMyX3QgeCkgeworICB1bnNpZ25lZCBsb25nIGluZGV4OworICByZXR1cm4gTElLRUxZKF9CaXRTY2FuUmV2ZXJzZSgmaW5kZXgsIHgpKSA/ICgzMSAtIGluZGV4KSA6IDMyOworfQorCisjaWYgZGVmaW5lZChBUkNIX0NQVV82NF9CSVRTKQorCisvLyBNU1ZDIG9ubHkgc3VwcGxpZXMgX0JpdFNjYW5Gb3J3YXJkNjQgd2hlbiBidWlsZGluZyBmb3IgYSA2NC1iaXQgdGFyZ2V0LgorQUxXQVlTX0lOTElORSB1aW50NjRfdCBDb3VudExlYWRpbmdaZXJvQml0czY0KHVpbnQ2NF90IHgpIHsKKyAgdW5zaWduZWQgbG9uZyBpbmRleDsKKyAgcmV0dXJuIExJS0VMWShfQml0U2NhblJldmVyc2U2NCgmaW5kZXgsIHgpKSA/ICg2MyAtIGluZGV4KSA6IDY0OworfQorCisjZW5kaWYKKworI2VsaWYgZGVmaW5lZChDT01QSUxFUl9HQ0MpCisKKy8vIFRoaXMgaXMgdmVyeSBhbm5veWluZy4gX19idWlsdGluX2NseiBoYXMgdW5kZWZpbmVkIGJlaGF2aW91ciBmb3IgYW4gaW5wdXQgb2YKKy8vIDAsIGV2ZW4gdGhvdWdoIHRoZXJlJ3MgY2xlYXJseSBhIHJldHVybiB2YWx1ZSB0aGF0IG1ha2VzIHNlbnNlLCBhbmQgZXZlbgorLy8gdGhvdWdoIHNvbWUgcHJvY2Vzc29yIGNseiBpbnN0cnVjdGlvbnMgaGF2ZSBkZWZpbmVkIGJlaGF2aW91ciBmb3IgMC4gV2UgY291bGQKKy8vIGRyb3AgdG8gcmF3IF9fYXNtX18gdG8gZG8gYmV0dGVyLCBidXQgd2UnbGwgYXZvaWQgZG9pbmcgdGhhdCB1bmxlc3Mgd2Ugc2VlCisvLyBwcm9vZiB0aGF0IHdlIG5lZWQgdG8uCitBTFdBWVNfSU5MSU5FIHVpbnQzMl90IENvdW50TGVhZGluZ1plcm9CaXRzMzIodWludDMyX3QgeCkgeworICByZXR1cm4gTElLRUxZKHgpID8gX19idWlsdGluX2Nseih4KSA6IDMyOworfQorCitBTFdBWVNfSU5MSU5FIHVpbnQ2NF90IENvdW50TGVhZGluZ1plcm9CaXRzNjQodWludDY0X3QgeCkgeworICByZXR1cm4gTElLRUxZKHgpID8gX19idWlsdGluX2NsemxsKHgpIDogNjQ7Cit9CisKKyNlbmRpZgorCisjaWYgZGVmaW5lZChBUkNIX0NQVV82NF9CSVRTKQorCitBTFdBWVNfSU5MSU5FIHNpemVfdCBDb3VudExlYWRpbmdaZXJvQml0c1NpemVUKHNpemVfdCB4KSB7CisgIHJldHVybiBDb3VudExlYWRpbmdaZXJvQml0czY0KHgpOworfQorCisjZWxzZQorCitBTFdBWVNfSU5MSU5FIHNpemVfdCBDb3VudExlYWRpbmdaZXJvQml0c1NpemVUKHNpemVfdCB4KSB7CisgIHJldHVybiBDb3VudExlYWRpbmdaZXJvQml0czMyKHgpOworfQorCisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIGJpdHMKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgcGRmaXVtCisKKyNlbmRpZiAgLy8gQkFTRV9CSVRTX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9iYXNlL2NvbXBpbGVyX3NwZWNpZmljLmggYi90aGlyZF9wYXJ0eS9iYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RiZDFhYgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jhc2UvY29tcGlsZXJfc3BlY2lmaWMuaApAQCAtMCwwICsxLDIzMyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBCQVNFX0NPTVBJTEVSX1NQRUNJRklDX0hfCisjZGVmaW5lIEJBU0VfQ09NUElMRVJfU1BFQ0lGSUNfSF8KKworI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgorCisjaWYgZGVmaW5lZChDT01QSUxFUl9NU1ZDKQorCisvLyBGb3IgX1ByaW50Zl9mb3JtYXRfc3RyaW5nXy4KKyNpbmNsdWRlIDxzYWwuaD4KKworLy8gTWFjcm9zIGZvciBzdXBwcmVzc2luZyBhbmQgZGlzYWJsaW5nIHdhcm5pbmdzIG9uIE1TVkMuCisvLworLy8gV2FybmluZyBudW1iZXJzIGFyZSBlbnVtZXJhdGVkIGF0OgorLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5Lzh4NXg0M2s3KFZTLjgwKS5hc3B4CisvLworLy8gVGhlIHdhcm5pbmcgcHJhZ21hOgorLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5LzJjOGY3NjZlKFZTLjgwKS5hc3B4CisvLworLy8gVXNpbmcgX19wcmFnbWEgaW5zdGVhZCBvZiAjcHJhZ21hIGluc2lkZSBtYWNyb3M6CisvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZDl4MXM4MDUuYXNweAorCisvLyBNU1ZDX1NVUFBSRVNTX1dBUk5JTkcgZGlzYWJsZXMgd2FybmluZyB8bnwgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIGxpbmUgYW5kCisvLyBmb3IgdGhlIG5leHQgbGluZSBvZiB0aGUgc291cmNlIGZpbGUuCisjZGVmaW5lIE1TVkNfU1VQUFJFU1NfV0FSTklORyhuKSBfX3ByYWdtYSh3YXJuaW5nKHN1cHByZXNzIDogbikpCisKKy8vIE1TVkNfUFVTSF9ESVNBQkxFX1dBUk5JTkcgcHVzaGVzIHxufCBvbnRvIGEgc3RhY2sgb2Ygd2FybmluZ3MgdG8gYmUgZGlzYWJsZWQuCisvLyBUaGUgd2FybmluZyByZW1haW5zIGRpc2FibGVkIHVudGlsIHBvcHBlZCBieSBNU1ZDX1BPUF9XQVJOSU5HLgorI2RlZmluZSBNU1ZDX1BVU0hfRElTQUJMRV9XQVJOSU5HKG4pIFwKKyAgX19wcmFnbWEod2FybmluZyhwdXNoKSkgX19wcmFnbWEod2FybmluZyhkaXNhYmxlIDogbikpCisKKy8vIE1TVkNfUFVTSF9XQVJOSU5HX0xFVkVMIHB1c2hlcyB8bnwgYXMgdGhlIGdsb2JhbCB3YXJuaW5nIGxldmVsLiAgVGhlIGxldmVsCisvLyByZW1haW5zIGluIGVmZmVjdCB1bnRpbCBwb3BwZWQgYnkgTVNWQ19QT1BfV0FSTklORygpLiAgVXNlIDAgdG8gZGlzYWJsZSBhbGwKKy8vIHdhcm5pbmdzLgorI2RlZmluZSBNU1ZDX1BVU0hfV0FSTklOR19MRVZFTChuKSBfX3ByYWdtYSh3YXJuaW5nKHB1c2gsIG4pKQorCisvLyBQb3AgZWZmZWN0cyBvZiBpbm5lcm1vc3QgTVNWQ19QVVNIXyogbWFjcm8uCisjZGVmaW5lIE1TVkNfUE9QX1dBUk5JTkcoKSBfX3ByYWdtYSh3YXJuaW5nKHBvcCkpCisKKyNkZWZpbmUgTVNWQ19ESVNBQkxFX09QVElNSVpFKCkgX19wcmFnbWEob3B0aW1pemUoIiIsIG9mZikpCisjZGVmaW5lIE1TVkNfRU5BQkxFX09QVElNSVpFKCkgX19wcmFnbWEob3B0aW1pemUoIiIsIG9uKSkKKworLy8gQWxsb3dzIGV4cG9ydGluZyBhIGNsYXNzIHRoYXQgaW5oZXJpdHMgZnJvbSBhIG5vbi1leHBvcnRlZCBiYXNlIGNsYXNzLgorLy8gVGhpcyB1c2VzIHN1cHByZXNzIGluc3RlYWQgb2YgcHVzaC9wb3AgYmVjYXVzZSB0aGUgZGVsaW1pdGVyIGFmdGVyIHRoZQorLy8gZGVjbGFyYXRpb24gKGVpdGhlciAiLCIgb3IgInsiKSBoYXMgdG8gYmUgcGxhY2VkIGJlZm9yZSB0aGUgcG9wIG1hY3JvLgorLy8KKy8vIEV4YW1wbGUgdXNhZ2U6CisvLyBjbGFzcyBFWFBPUlRfQVBJIEZvbyA6IE5PTl9FWFBPUlRFRF9CQVNFKHB1YmxpYyBCYXIpIHsKKy8vCisvLyBNU1ZDIENvbXBpbGVyIHdhcm5pbmcgQzQyNzU6CisvLyBub24gZGxsLWludGVyZmFjZSBjbGFzcyAnQmFyJyB1c2VkIGFzIGJhc2UgZm9yIGRsbC1pbnRlcmZhY2UgY2xhc3MgJ0ZvbycuCisvLyBOb3RlIHRoYXQgdGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9ubHkgd2hlbiBubyBhY2Nlc3MgdG8gdGhlIGJhc2UgY2xhc3MnCisvLyBzdGF0aWMgZGF0YSBpcyBkb25lIHRocm91Z2ggZGVyaXZlZCBjbGFzc2VzIG9yIGlubGluZSBtZXRob2RzLiBGb3IgbW9yZSBpbmZvLAorLy8gc2VlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS8zdGRiNDcxcyhWUy44MCkuYXNweAorI2RlZmluZSBOT05fRVhQT1JURURfQkFTRShjb2RlKSBcCisgIE1TVkNfU1VQUFJFU1NfV0FSTklORyg0Mjc1KSAgIFwKKyAgY29kZQorCisjZWxzZSAgLy8gTm90IE1TVkMKKworI2RlZmluZSBfUHJpbnRmX2Zvcm1hdF9zdHJpbmdfCisjZGVmaW5lIE1TVkNfU1VQUFJFU1NfV0FSTklORyhuKQorI2RlZmluZSBNU1ZDX1BVU0hfRElTQUJMRV9XQVJOSU5HKG4pCisjZGVmaW5lIE1TVkNfUFVTSF9XQVJOSU5HX0xFVkVMKG4pCisjZGVmaW5lIE1TVkNfUE9QX1dBUk5JTkcoKQorI2RlZmluZSBNU1ZDX0RJU0FCTEVfT1BUSU1JWkUoKQorI2RlZmluZSBNU1ZDX0VOQUJMRV9PUFRJTUlaRSgpCisjZGVmaW5lIE5PTl9FWFBPUlRFRF9CQVNFKGNvZGUpIGNvZGUKKworI2VuZGlmICAvLyBDT01QSUxFUl9NU1ZDCisKKy8vIEFubm90YXRlIGEgdmFyaWFibGUgaW5kaWNhdGluZyBpdCdzIG9rIGlmIHRoZSB2YXJpYWJsZSBpcyBub3QgdXNlZC4KKy8vIChUeXBpY2FsbHkgdXNlZCB0byBzaWxlbmNlIGEgY29tcGlsZXIgd2FybmluZyB3aGVuIHRoZSBhc3NpZ25tZW50CisvLyBpcyBpbXBvcnRhbnQgZm9yIHNvbWUgb3RoZXIgcmVhc29uLikKKy8vIFVzZSBsaWtlOgorLy8gICBpbnQgeCA9IC4uLjsKKy8vICAgQUxMT1dfVU5VU0VEX0xPQ0FMKHgpOworI2RlZmluZSBBTExPV19VTlVTRURfTE9DQUwoeCkgZmFsc2UgPyAodm9pZCl4IDogKHZvaWQpMAorCisvLyBBbm5vdGF0ZSBhIHR5cGVkZWYgb3IgZnVuY3Rpb24gaW5kaWNhdGluZyBpdCdzIG9rIGlmIGl0J3Mgbm90IHVzZWQuCisvLyBVc2UgbGlrZToKKy8vICAgdHlwZWRlZiBGb28gQmFyIEFMTE9XX1VOVVNFRF9UWVBFOworI2lmIGRlZmluZWQoQ09NUElMRVJfR0NDKSB8fCBkZWZpbmVkKF9fY2xhbmdfXykKKyNkZWZpbmUgQUxMT1dfVU5VU0VEX1RZUEUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKyNlbHNlCisjZGVmaW5lIEFMTE9XX1VOVVNFRF9UWVBFCisjZW5kaWYKKworLy8gQW5ub3RhdGUgYSBmdW5jdGlvbiBpbmRpY2F0aW5nIGl0IHNob3VsZCBub3QgYmUgaW5saW5lZC4KKy8vIFVzZSBsaWtlOgorLy8gICBOT0lOTElORSB2b2lkIERvU3R1ZmYoKSB7IC4uLiB9CisjaWYgZGVmaW5lZChDT01QSUxFUl9HQ0MpCisjZGVmaW5lIE5PSU5MSU5FIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKKyNlbGlmIGRlZmluZWQoQ09NUElMRVJfTVNWQykKKyNkZWZpbmUgTk9JTkxJTkUgX19kZWNsc3BlYyhub2lubGluZSkKKyNlbHNlCisjZGVmaW5lIE5PSU5MSU5FCisjZW5kaWYKKworI2lmIENPTVBJTEVSX0dDQyAmJiBkZWZpbmVkKE5ERUJVRykKKyNkZWZpbmUgQUxXQVlTX0lOTElORSBpbmxpbmUgX19hdHRyaWJ1dGVfXygoX19hbHdheXNfaW5saW5lX18pKQorI2VsaWYgQ09NUElMRVJfTVNWQyAmJiBkZWZpbmVkKE5ERUJVRykKKyNkZWZpbmUgQUxXQVlTX0lOTElORSBfX2ZvcmNlaW5saW5lCisjZWxzZQorI2RlZmluZSBBTFdBWVNfSU5MSU5FIGlubGluZQorI2VuZGlmCisKKy8vIFNwZWNpZnkgbWVtb3J5IGFsaWdubWVudCBmb3Igc3RydWN0cywgY2xhc3NlcywgZXRjLgorLy8gVXNlIGxpa2U6CisvLyAgIGNsYXNzIEFMSUdOQVMoMTYpIE15Q2xhc3MgeyAuLi4gfQorLy8gICBBTElHTkFTKDE2KSBpbnQgYXJyYXlbNF07CisjaWYgZGVmaW5lZChDT01QSUxFUl9NU1ZDKQorI2RlZmluZSBBTElHTkFTKGJ5dGVfYWxpZ25tZW50KSBfX2RlY2xzcGVjKGFsaWduKGJ5dGVfYWxpZ25tZW50KSkKKyNlbGlmIGRlZmluZWQoQ09NUElMRVJfR0NDKQorI2RlZmluZSBBTElHTkFTKGJ5dGVfYWxpZ25tZW50KSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKGJ5dGVfYWxpZ25tZW50KSkpCisjZW5kaWYKKworLy8gUmV0dXJuIHRoZSBieXRlIGFsaWdubWVudCBvZiB0aGUgZ2l2ZW4gdHlwZSAoYXZhaWxhYmxlIGF0IGNvbXBpbGUgdGltZSkuCisvLyBVc2UgbGlrZToKKy8vICAgQUxJR05PRihpbnQzMl90KSAgLy8gdGhpcyB3b3VsZCBiZSA0CisjaWYgZGVmaW5lZChDT01QSUxFUl9NU1ZDKQorI2RlZmluZSBBTElHTk9GKHR5cGUpIF9fYWxpZ25vZih0eXBlKQorI2VsaWYgZGVmaW5lZChDT01QSUxFUl9HQ0MpCisjZGVmaW5lIEFMSUdOT0YodHlwZSkgX19hbGlnbm9mX18odHlwZSkKKyNlbmRpZgorCisvLyBBbm5vdGF0ZSBhIGZ1bmN0aW9uIGluZGljYXRpbmcgdGhlIGNhbGxlciBtdXN0IGV4YW1pbmUgdGhlIHJldHVybiB2YWx1ZS4KKy8vIFVzZSBsaWtlOgorLy8gICBpbnQgZm9vKCkgV0FSTl9VTlVTRURfUkVTVUxUOworLy8gVG8gZXhwbGljaXRseSBpZ25vcmUgYSByZXN1bHQsIHNlZSB8aWdub3JlX3Jlc3VsdCgpfCBpbiBiYXNlL21hY3Jvcy5oLgorI3VuZGVmIFdBUk5fVU5VU0VEX1JFU1VMVAorI2lmIGRlZmluZWQoQ09NUElMRVJfR0NDKSB8fCBkZWZpbmVkKF9fY2xhbmdfXykKKyNkZWZpbmUgV0FSTl9VTlVTRURfUkVTVUxUIF9fYXR0cmlidXRlX18oKHdhcm5fdW51c2VkX3Jlc3VsdCkpCisjZWxzZQorI2RlZmluZSBXQVJOX1VOVVNFRF9SRVNVTFQKKyNlbmRpZgorCisvLyBUZWxsIHRoZSBjb21waWxlciBhIGZ1bmN0aW9uIGlzIHVzaW5nIGEgcHJpbnRmLXN0eWxlIGZvcm1hdCBzdHJpbmcuCisvLyB8Zm9ybWF0X3BhcmFtfCBpcyB0aGUgb25lLWJhc2VkIGluZGV4IG9mIHRoZSBmb3JtYXQgc3RyaW5nIHBhcmFtZXRlcjsKKy8vIHxkb3RzX3BhcmFtfCBpcyB0aGUgb25lLWJhc2VkIGluZGV4IG9mIHRoZSAiLi4uIiBwYXJhbWV0ZXIuCisvLyBGb3IgdipwcmludGYgZnVuY3Rpb25zICh3aGljaCB0YWtlIGEgdmFfbGlzdCksIHBhc3MgMCBmb3IgZG90c19wYXJhbS4KKy8vIChUaGlzIGlzIHVuZG9jdW1lbnRlZCBidXQgbWF0Y2hlcyB3aGF0IHRoZSBzeXN0ZW0gQyBoZWFkZXJzIGRvLikKKyNpZiBkZWZpbmVkKENPTVBJTEVSX0dDQykgfHwgZGVmaW5lZChfX2NsYW5nX18pCisjZGVmaW5lIFBSSU5URl9GT1JNQVQoZm9ybWF0X3BhcmFtLCBkb3RzX3BhcmFtKSBcCisgIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsIGZvcm1hdF9wYXJhbSwgZG90c19wYXJhbSkpKQorI2Vsc2UKKyNkZWZpbmUgUFJJTlRGX0ZPUk1BVChmb3JtYXRfcGFyYW0sIGRvdHNfcGFyYW0pCisjZW5kaWYKKworLy8gV1BSSU5URl9GT1JNQVQgaXMgdGhlIHNhbWUsIGJ1dCBmb3Igd2lkZSBmb3JtYXQgc3RyaW5ncy4KKy8vIFRoaXMgZG9lc24ndCBhcHBlYXIgdG8geWV0IGJlIGltcGxlbWVudGVkIGluIGFueSBjb21waWxlci4KKy8vIFNlZSBodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM4MzA4IC4KKyNkZWZpbmUgV1BSSU5URl9GT1JNQVQoZm9ybWF0X3BhcmFtLCBkb3RzX3BhcmFtKQorLy8gSWYgYXZhaWxhYmxlLCBpdCB3b3VsZCBsb29rIGxpa2U6CisvLyAgIF9fYXR0cmlidXRlX18oKGZvcm1hdCh3cHJpbnRmLCBmb3JtYXRfcGFyYW0sIGRvdHNfcGFyYW0pKSkKKworLy8gU2FuaXRpemVycyBhbm5vdGF0aW9ucy4KKyNpZiBkZWZpbmVkKF9faGFzX2F0dHJpYnV0ZSkKKyNpZiBfX2hhc19hdHRyaWJ1dGUobm9fc2FuaXRpemUpCisjZGVmaW5lIE5PX1NBTklUSVpFKHdoYXQpIF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKHdoYXQpKSkKKyNlbmRpZgorI2VuZGlmCisjaWYgIWRlZmluZWQoTk9fU0FOSVRJWkUpCisjZGVmaW5lIE5PX1NBTklUSVpFKHdoYXQpCisjZW5kaWYKKworLy8gTWVtb3J5U2FuaXRpemVyIGFubm90YXRpb25zLgorI2lmIGRlZmluZWQoTUVNT1JZX1NBTklUSVpFUikgJiYgIWRlZmluZWQoT1NfTkFDTCkKKyNpbmNsdWRlIDxzYW5pdGl6ZXIvbXNhbl9pbnRlcmZhY2UuaD4KKworLy8gTWFyayBhIG1lbW9yeSByZWdpb24gZnVsbHkgaW5pdGlhbGl6ZWQuCisvLyBVc2UgdGhpcyB0byBhbm5vdGF0ZSBjb2RlIHRoYXQgZGVsaWJlcmF0ZWx5IHJlYWRzIHVuaW5pdGlhbGl6ZWQgZGF0YSwgZm9yCisvLyBleGFtcGxlIGEgR0Mgc2NhdmVuZ2luZyByb290IHNldCBwb2ludGVycyBmcm9tIHRoZSBzdGFjay4KKyNkZWZpbmUgTVNBTl9VTlBPSVNPTihwLCBzaXplKSBfX21zYW5fdW5wb2lzb24ocCwgc2l6ZSkKKworLy8gQ2hlY2sgYSBtZW1vcnkgcmVnaW9uIGZvciBpbml0aWFsaXplZG5lc3MsIGFzIGlmIGl0IHdhcyBiZWluZyB1c2VkIGhlcmUuCisvLyBJZiBhbnkgYml0cyBhcmUgdW5pbml0aWFsaXplZCwgY3Jhc2ggd2l0aCBhbiBNU2FuIHJlcG9ydC4KKy8vIFVzZSB0aGlzIHRvIHNhbml0aXplIGRhdGEgd2hpY2ggTVNhbiB3b24ndCBiZSBhYmxlIHRvIHRyYWNrLCBlLmcuIGJlZm9yZQorLy8gcGFzc2luZyBkYXRhIHRvIGFub3RoZXIgcHJvY2VzcyB2aWEgc2hhcmVkIG1lbW9yeS4KKyNkZWZpbmUgTVNBTl9DSEVDS19NRU1fSVNfSU5JVElBTElaRUQocCwgc2l6ZSkgXAorICBfX21zYW5fY2hlY2tfbWVtX2lzX2luaXRpYWxpemVkKHAsIHNpemUpCisjZWxzZSAgLy8gTUVNT1JZX1NBTklUSVpFUgorI2RlZmluZSBNU0FOX1VOUE9JU09OKHAsIHNpemUpCisjZGVmaW5lIE1TQU5fQ0hFQ0tfTUVNX0lTX0lOSVRJQUxJWkVEKHAsIHNpemUpCisjZW5kaWYgIC8vIE1FTU9SWV9TQU5JVElaRVIKKworLy8gRElTQUJMRV9DRklfUEVSRiAtLSBEaXNhYmxlIENvbnRyb2wgRmxvdyBJbnRlZ3JpdHkgZm9yIHBlcmYgcmVhc29ucy4KKyNpZiAhZGVmaW5lZChESVNBQkxFX0NGSV9QRVJGKQorI2lmIGRlZmluZWQoX19jbGFuZ19fKSAmJiBkZWZpbmVkKE9GRklDSUFMX0JVSUxEKQorI2RlZmluZSBESVNBQkxFX0NGSV9QRVJGIF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJjZmkiKSkpCisjZWxzZQorI2RlZmluZSBESVNBQkxFX0NGSV9QRVJGCisjZW5kaWYKKyNlbmRpZgorCisvLyBNYWNybyB1c2VmdWwgZm9yIHdyaXRpbmcgY3Jvc3MtcGxhdGZvcm0gZnVuY3Rpb24gcG9pbnRlcnMuCisjaWYgIWRlZmluZWQoQ0RFQ0wpCisjaWYgZGVmaW5lZChPU19XSU4pCisjZGVmaW5lIENERUNMIF9fY2RlY2wKKyNlbHNlICAvLyBkZWZpbmVkKE9TX1dJTikKKyNkZWZpbmUgQ0RFQ0wKKyNlbmRpZiAgLy8gZGVmaW5lZChPU19XSU4pCisjZW5kaWYgIC8vICFkZWZpbmVkKENERUNMKQorCisvLyBNYWNybyBmb3IgaGludGluZyB0aGF0IGFuIGV4cHJlc3Npb24gaXMgbGlrZWx5IHRvIGJlIGZhbHNlLgorI2lmICFkZWZpbmVkKFVOTElLRUxZKQorI2lmIGRlZmluZWQoQ09NUElMRVJfR0NDKQorI2RlZmluZSBVTkxJS0VMWSh4KSBfX2J1aWx0aW5fZXhwZWN0KCEhKHgpLCAwKQorI2Vsc2UKKyNkZWZpbmUgVU5MSUtFTFkoeCkgKHgpCisjZW5kaWYgIC8vIGRlZmluZWQoQ09NUElMRVJfR0NDKQorI2VuZGlmICAvLyAhZGVmaW5lZChVTkxJS0VMWSkKKworI2lmICFkZWZpbmVkKExJS0VMWSkKKyNpZiBkZWZpbmVkKENPTVBJTEVSX0dDQykKKyNkZWZpbmUgTElLRUxZKHgpIF9fYnVpbHRpbl9leHBlY3QoISEoeCksIDEpCisjZWxzZQorI2RlZmluZSBMSUtFTFkoeCkgKHgpCisjZW5kaWYgIC8vIGRlZmluZWQoQ09NUElMRVJfR0NDKQorI2VuZGlmICAvLyAhZGVmaW5lZChMSUtFTFkpCisKKy8vIENvbXBpbGVyIGZlYXR1cmUtZGV0ZWN0aW9uLgorLy8gY2xhbmcubGx2bS5vcmcvZG9jcy9MYW5ndWFnZUV4dGVuc2lvbnMuaHRtbCNoYXMtZmVhdHVyZS1hbmQtaGFzLWV4dGVuc2lvbgorI2lmIGRlZmluZWQoX19oYXNfZmVhdHVyZSkKKyNkZWZpbmUgSEFTX0ZFQVRVUkUoRkVBVFVSRSkgX19oYXNfZmVhdHVyZShGRUFUVVJFKQorI2Vsc2UKKyNkZWZpbmUgSEFTX0ZFQVRVUkUoRkVBVFVSRSkgMAorI2VuZGlmCisKKyNlbmRpZiAgLy8gQkFTRV9DT01QSUxFUl9TUEVDSUZJQ19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmFzZS9sb2dnaW5nLmggYi90aGlyZF9wYXJ0eS9iYXNlL2xvZ2dpbmcuaAppbmRleCBiZjRmYWVhLi4zOGIwZGQ5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9iYXNlL2xvZ2dpbmcuaAorKysgYi90aGlyZF9wYXJ0eS9iYXNlL2xvZ2dpbmcuaApAQCAtMjEsNiArMjEsMTkgQEAKICAgICBOVUxMX0RFUkVGX0lGX1BPU1NJQkxFIFwKICAgfQogCisvLyBUT0RPKHBhbG1lcik6IFRoZXNlIGFyZSBxdWljayBoYWNrcyB0byBpbXBvcnQgUGFydGl0aW9uQWxsb2Mgd2l0aCBtaW5pbXVtCisvLyBoYXNzbGUuIExvb2sgaW50byBwdWxsaW5nIGluIHRoZSByZWFsIERDSEVDSyBkZWZpbml0aW9uLiBJdCBtaWdodCBiZSBtb3JlCisvLyB0aGFuIHdlIG5lZWQsIG9yIGhhdmUgbW9yZSBkZXBlbmRlbmNpZXMgdGhhbiB3ZSB3YW50LiBJbiB0aGUgbWVhbnRpbWUsIHRoaXMKKy8vIGlzIHNhZmUsIGF0IHRoZSBjb3N0IG9mIHNvbWUgcGVyZm9ybWFuY2UuCisjZGVmaW5lIERDSEVDSyBDSEVDSworI2RlZmluZSBEQ0hFQ0tfRVEoeCwgeSkgQ0hFQ0soKHgpID09ICh5KSkKKyNkZWZpbmUgRENIRUNLX0lTX09OKCkgdHJ1ZQorCisvLyBUT0RPKHBhbG1lcik6IEFsc28gYSBxdWljayBoYWNrLiBJTU1FRElBVEVfQ1JBU0ggdXNlZCB0byBiZSBzaW1wbGUgaW4KKy8vIENocm9taXVtIGJhc2UvLCBidXQgaXQgZ290IHdheSBtb3JlIGNvbXBsaWNhdGVkIGFuZCBoYXMgbG90cyBvZiBiYXNlLworLy8gZGVwZW5kZW5jaWVzIG5vdy4gU2FkIQorI2RlZmluZSBJTU1FRElBVEVfQ1JBU0goKSBhYm9ydCgpOworCiAjZGVmaW5lIE5PVFJFQUNIRUQoKSBhc3NlcnQoZmFsc2UpCiAKICNlbmRpZiAgLy8gUERGSVVNX1RISVJEX1BBUlRZX0JBU0VfTE9HR0lOR19IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYmFzZS9tYWNyb3MuaCBiL3RoaXJkX3BhcnR5L2Jhc2UvbWFjcm9zLmgKaW5kZXggMDVjMzEzMi4uYjZlYzE2MSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmFzZS9tYWNyb3MuaAorKysgYi90aGlyZF9wYXJ0eS9iYXNlL21hY3Jvcy5oCkBAIC0yOCw0ICsyOCwxMCBAQAogI3VuZGVmIENPTVBJTEVfQVNTRVJUCiAjZGVmaW5lIENPTVBJTEVfQVNTRVJUKGV4cHIsIG1zZykgc3RhdGljX2Fzc2VydChleHByLCAjbXNnKQogCisvLyBBIG1hY3JvIHRvIGRpc2FsbG93IHRoZSBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0gZnVuY3Rpb25zLgorLy8gVGhpcyBzaG91bGQgYmUgdXNlZCBpbiB0aGUgcHJpdmF0ZTogZGVjbGFyYXRpb25zIGZvciBhIGNsYXNzLgorI2RlZmluZSBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVHlwZU5hbWUpIFwKKyAgVHlwZU5hbWUoY29uc3QgVHlwZU5hbWUmKSA9IGRlbGV0ZTsgICAgICBcCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFR5cGVOYW1lJikgPSBkZWxldGUKKwogI2VuZGlmICAvLyBQREZJVU1fVEhJUkRfUEFSVFlfQkFTRV9NQUNST1NfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9jb252ZXJzaW9uc19pbXBsLmggYi90aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfY29udmVyc2lvbnNfaW1wbC5oCmluZGV4IDJhN2NlMTQuLjQwNzdiMjggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9jb252ZXJzaW9uc19pbXBsLmgKKysrIGIvdGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX2NvbnZlcnNpb25zX2ltcGwuaApAQCAtMTQzLDcgKzE0Myw3IEBACiAgcHVibGljOgogICBjb25zdGV4cHIgUmFuZ2VDaGVjayhib29sIGlzX2luX2xvd2VyX2JvdW5kLCBib29sIGlzX2luX3VwcGVyX2JvdW5kKQogICAgICAgOiBpc191bmRlcmZsb3dfKCFpc19pbl9sb3dlcl9ib3VuZCksIGlzX292ZXJmbG93XyghaXNfaW5fdXBwZXJfYm91bmQpIHt9Ci0gIGNvbnN0ZXhwciBSYW5nZUNoZWNrKCkgOiBpc191bmRlcmZsb3dfKDApLCBpc19vdmVyZmxvd18oMCkge30KKyAgY29uc3RleHByIFJhbmdlQ2hlY2soKSA6IGlzX3VuZGVyZmxvd18oZmFsc2UpLCBpc19vdmVyZmxvd18oZmFsc2UpIHt9CiAgIGNvbnN0ZXhwciBib29sIElzVmFsaWQoKSBjb25zdCB7IHJldHVybiAhaXNfb3ZlcmZsb3dfICYmICFpc191bmRlcmZsb3dfOyB9CiAgIGNvbnN0ZXhwciBib29sIElzSW52YWxpZCgpIGNvbnN0IHsgcmV0dXJuIGlzX292ZXJmbG93XyAmJiBpc191bmRlcmZsb3dfOyB9CiAgIGNvbnN0ZXhwciBib29sIElzT3ZlcmZsb3coKSBjb25zdCB7IHJldHVybiBpc19vdmVyZmxvd18gJiYgIWlzX3VuZGVyZmxvd187IH0KQEAgLTcyNSw3ICs3MjUsNyBAQAogICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEJpZ1R5cGU+KHN0YXRpY19jYXN0PFI+KHJocykpKQogICAgICAgICAgICAgIC8vIExldCB0aGUgdGVtcGxhdGUgZnVuY3Rpb25zIGZpZ3VyZSBpdCBvdXQgZm9yIG1peGVkIHR5cGVzLgogICAgICAgICAgICAgIDogQzxMLCBSPjo6VGVzdChsaHMsIHJocyk7Ci19OworfQogCiB9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKIH0gIC8vIG5hbWVzcGFjZSBiYXNlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfbWF0aC5oIGIvdGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX21hdGguaAppbmRleCBhMGM0MWE0Li5mMjRiYTAyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfbWF0aC5oCisrKyBiL3RoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9tYXRoLmgKQEAgLTEwMCw3ICsxMDAsNyBAQAogIHB1YmxpYzoKICAgdXNpbmcgdHlwZSA9IFQ7CiAKLSAgY29uc3RleHByIENoZWNrZWROdW1lcmljKCkge30KKyAgY29uc3RleHByIENoZWNrZWROdW1lcmljKCkgPSBkZWZhdWx0OwogCiAgIC8vIENvcHkgY29uc3RydWN0b3IuCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBTcmM+CkBAIC00MTksNyArNDE5LDcgQEAKICAgYXV0byB0bXAgPSBDaGtNYXRoT3A8TT4obGhzLCByaHMpOwogICByZXR1cm4gdG1wLklzVmFsaWQoKSA/IENoa01hdGhPcDxNPih0bXAsIGFyZ3MuLi4pCiAgICAgICAgICAgICAgICAgICAgICAgIDogZGVjbHR5cGUoQ2hrTWF0aE9wPE0+KHRtcCwgYXJncy4uLikpKHRtcCk7Ci19OworfQogCiAvLyBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUganVzdCBib2lsZXJwbGF0ZSBmb3IgdGhlIHN0YW5kYXJkIGFyaXRobWV0aWMKIC8vIG9wZXJhdG9yIG92ZXJsb2FkcyBhbmQgdmFyaWFkaWMgZnVuY3Rpb24gdGVtcGxhdGVzLiBBIG1hY3JvIGlzbid0IHRoZSBuaWNlc3QKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9tYXRoX2ltcGwuaCBiL3RoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9tYXRoX2ltcGwuaAppbmRleCA1YWQ3OWNlLi40YmNjNjcxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfbWF0aF9pbXBsLmgKKysrIGIvdGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX21hdGhfaW1wbC5oCkBAIC01OSw5ICs1OSw5IEBACiAgIC8vIGl0IHVzaW5nIHRoZSB1bnNpZ25lZCB0eXBlIG9mIHRoZSBzYW1lIHNpemUuCiAgIHVzaW5nIFVuc2lnbmVkRHN0ID0gdHlwZW5hbWUgc3RkOjptYWtlX3Vuc2lnbmVkPFQ+Ojp0eXBlOwogICB1c2luZyBTaWduZWREc3QgPSB0eXBlbmFtZSBzdGQ6Om1ha2Vfc2lnbmVkPFQ+Ojp0eXBlOwotICBVbnNpZ25lZERzdCB1eCA9IHN0YXRpY19jYXN0PFVuc2lnbmVkRHN0Pih4KTsKLSAgVW5zaWduZWREc3QgdXkgPSBzdGF0aWNfY2FzdDxVbnNpZ25lZERzdD4oeSk7Ci0gIFVuc2lnbmVkRHN0IHVyZXN1bHQgPSBzdGF0aWNfY2FzdDxVbnNpZ25lZERzdD4odXggKyB1eSk7CisgIGF1dG8gdXggPSBzdGF0aWNfY2FzdDxVbnNpZ25lZERzdD4oeCk7CisgIGF1dG8gdXkgPSBzdGF0aWNfY2FzdDxVbnNpZ25lZERzdD4oeSk7CisgIGF1dG8gdXJlc3VsdCA9IHN0YXRpY19jYXN0PFVuc2lnbmVkRHN0Pih1eCArIHV5KTsKICAgKnJlc3VsdCA9IHN0YXRpY19jYXN0PFQ+KHVyZXN1bHQpOwogICAvLyBBZGRpdGlvbiBpcyB2YWxpZCBpZiB0aGUgc2lnbiBvZiAoeCArIHkpIGlzIGVxdWFsIHRvIGVpdGhlciB0aGF0IG9mIHggb3IKICAgLy8gdGhhdCBvZiB5LgpAQCAtMTEwLDkgKzExMCw5IEBACiAgIC8vIGl0IHVzaW5nIHRoZSB1bnNpZ25lZCB0eXBlIG9mIHRoZSBzYW1lIHNpemUuCiAgIHVzaW5nIFVuc2lnbmVkRHN0ID0gdHlwZW5hbWUgc3RkOjptYWtlX3Vuc2lnbmVkPFQ+Ojp0eXBlOwogICB1c2luZyBTaWduZWREc3QgPSB0eXBlbmFtZSBzdGQ6Om1ha2Vfc2lnbmVkPFQ+Ojp0eXBlOwotICBVbnNpZ25lZERzdCB1eCA9IHN0YXRpY19jYXN0PFVuc2lnbmVkRHN0Pih4KTsKLSAgVW5zaWduZWREc3QgdXkgPSBzdGF0aWNfY2FzdDxVbnNpZ25lZERzdD4oeSk7Ci0gIFVuc2lnbmVkRHN0IHVyZXN1bHQgPSBzdGF0aWNfY2FzdDxVbnNpZ25lZERzdD4odXggLSB1eSk7CisgIGF1dG8gdXggPSBzdGF0aWNfY2FzdDxVbnNpZ25lZERzdD4oeCk7CisgIGF1dG8gdXkgPSBzdGF0aWNfY2FzdDxVbnNpZ25lZERzdD4oeSk7CisgIGF1dG8gdXJlc3VsdCA9IHN0YXRpY19jYXN0PFVuc2lnbmVkRHN0Pih1eCAtIHV5KTsKICAgKnJlc3VsdCA9IHN0YXRpY19jYXN0PFQ+KHVyZXN1bHQpOwogICAvLyBTdWJ0cmFjdGlvbiBpcyB2YWxpZCBpZiBlaXRoZXIgeCBhbmQgeSBoYXZlIHNhbWUgc2lnbiwgb3IgKHgteSkgYW5kIHggaGF2ZQogICAvLyB0aGUgc2FtZSBzaWduLgpAQCAtMTYzLDcgKzE2Myw3IEBACiAgIHVzaW5nIFNpZ25lZERzdCA9IHR5cGVuYW1lIHN0ZDo6bWFrZV9zaWduZWQ8VD46OnR5cGU7CiAgIGNvbnN0IFVuc2lnbmVkRHN0IHV4ID0gU2FmZVVuc2lnbmVkQWJzKHgpOwogICBjb25zdCBVbnNpZ25lZERzdCB1eSA9IFNhZmVVbnNpZ25lZEFicyh5KTsKLSAgVW5zaWduZWREc3QgdXJlc3VsdCA9IHN0YXRpY19jYXN0PFVuc2lnbmVkRHN0Pih1eCAqIHV5KTsKKyAgYXV0byB1cmVzdWx0ID0gc3RhdGljX2Nhc3Q8VW5zaWduZWREc3Q+KHV4ICogdXkpOwogICBjb25zdCBib29sIGlzX25lZ2F0aXZlID0KICAgICAgIHN0ZDo6aXNfc2lnbmVkPFQ+Ojp2YWx1ZSAmJiBzdGF0aWNfY2FzdDxTaWduZWREc3Q+KHggXiB5KSA8IDA7CiAgICpyZXN1bHQgPSBpc19uZWdhdGl2ZSA/IDAgLSB1cmVzdWx0IDogdXJlc3VsdDsKQEAgLTMwOCw3ICszMDgsNyBAQAogICBzdGF0aWMgYm9vbCBEbyhUIHgsIFUgc2hpZnQsIFYqIHJlc3VsdCkgewogICAgIHVzaW5nIFNoaWZ0VHlwZSA9IHR5cGVuYW1lIHN0ZDo6bWFrZV91bnNpZ25lZDxUPjo6dHlwZTsKICAgICBzdGF0aWMgY29uc3QgU2hpZnRUeXBlIGtCaXRXaWR0aCA9IEludGVnZXJCaXRzUGx1c1NpZ248VD46OnZhbHVlOwotICAgIGNvbnN0IFNoaWZ0VHlwZSByZWFsX3NoaWZ0ID0gc3RhdGljX2Nhc3Q8U2hpZnRUeXBlPihzaGlmdCk7CisgICAgY29uc3QgYXV0byByZWFsX3NoaWZ0ID0gc3RhdGljX2Nhc3Q8U2hpZnRUeXBlPihzaGlmdCk7CiAgICAgLy8gU2lnbmVkIHNoaWZ0IGlzIG5vdCBsZWdhbCBvbiBuZWdhdGl2ZSB2YWx1ZXMuCiAgICAgaWYgKCFJc1ZhbHVlTmVnYXRpdmUoeCkgJiYgcmVhbF9zaGlmdCA8IGtCaXRXaWR0aCkgewogICAgICAgLy8gSnVzdCB1c2UgYSBtdWx0aXBsaWNhdGlvbiBiZWNhdXNlIGl0J3MgZWFzeS4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jhc2Uvb3B0aW9uYWwuaCBiL3RoaXJkX3BhcnR5L2Jhc2Uvb3B0aW9uYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTIxMDFjCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYmFzZS9vcHRpb25hbC5oCkBAIC0wLDAgKzEsNTA5IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgUERGSVVNX1RISVJEX1BBUlRZX0JBU0VfT1BUSU9OQUxfSF8KKyNkZWZpbmUgUERGSVVNX1RISVJEX1BBUlRZX0JBU0VfT1BUSU9OQUxfSF8KKworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9sb2dnaW5nLmgiCisKK25hbWVzcGFjZSBwZGZpdW0geworCisvLyBTcGVjaWZpY2F0aW9uOgorLy8gaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvdXRpbGl0eS9vcHRpb25hbC9pbl9wbGFjZV90CitzdHJ1Y3QgaW5fcGxhY2VfdCB7fTsKKworLy8gU3BlY2lmaWNhdGlvbjoKKy8vIGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL3V0aWxpdHkvb3B0aW9uYWwvbnVsbG9wdF90CitzdHJ1Y3QgbnVsbG9wdF90IHsKKyAgY29uc3RleHByIGV4cGxpY2l0IG51bGxvcHRfdChpbnQpIHt9Cit9OworCisvLyBTcGVjaWZpY2F0aW9uOgorLy8gaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvdXRpbGl0eS9vcHRpb25hbC9pbl9wbGFjZQorY29uc3RleHByIGluX3BsYWNlX3QgaW5fcGxhY2UgPSB7fTsKKworLy8gU3BlY2lmaWNhdGlvbjoKKy8vIGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL3V0aWxpdHkvb3B0aW9uYWwvbnVsbG9wdAorY29uc3RleHByIG51bGxvcHRfdCBudWxsb3B0KDApOworCituYW1lc3BhY2UgaW50ZXJuYWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgYm9vbCA9IHN0ZDo6aXNfdHJpdmlhbGx5X2Rlc3RydWN0aWJsZTxUPjo6dmFsdWU+CitzdHJ1Y3QgT3B0aW9uYWxTdG9yYWdlIHsKKyAgLy8gSW5pdGlhbGl6aW5nIHxlbXB0eV98IGhlcmUgaW5zdGVhZCBvZiB1c2luZyBkZWZhdWx0IG1lbWJlciBpbml0aWFsaXppbmcKKyAgLy8gdG8gYXZvaWQgZXJyb3JzIGluIGcrKyA0LjguCisgIGNvbnN0ZXhwciBPcHRpb25hbFN0b3JhZ2UoKSA6IGVtcHR5XygnXDAnKSB7fQorCisgIGNvbnN0ZXhwciBleHBsaWNpdCBPcHRpb25hbFN0b3JhZ2UoY29uc3QgVCYgdmFsdWUpCisgICAgICA6IGlzX251bGxfKGZhbHNlKSwgdmFsdWVfKHZhbHVlKSB7fQorCisgIC8vIFRPRE8oYWxzaGFiYWxpbik6IENhbid0IHVzZSAnY29uc3RleHByJyB3aXRoIHN0ZDo6bW92ZSB1bnRpbCBDKysxNC4KKyAgZXhwbGljaXQgT3B0aW9uYWxTdG9yYWdlKFQmJiB2YWx1ZSkKKyAgICAgIDogaXNfbnVsbF8oZmFsc2UpLCB2YWx1ZV8oc3RkOjptb3ZlKHZhbHVlKSkge30KKworICAvLyBUT0RPKGFsc2hhYmFsaW4pOiBDYW4ndCB1c2UgJ2NvbnN0ZXhwcicgd2l0aCBzdGQ6OmZvcndhcmQgdW50aWwgQysrMTQuCisgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgorICBleHBsaWNpdCBPcHRpb25hbFN0b3JhZ2UoaW5fcGxhY2VfdCwgQXJncyYmLi4uIGFyZ3MpCisgICAgICA6IGlzX251bGxfKGZhbHNlKSwgdmFsdWVfKHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLikge30KKworICAvLyBXaGVuIFQgaXMgbm90IHRyaXZpYWxseSBkZXN0cnVjdGlibGUgd2UgbXVzdCBjYWxsIGl0cworICAvLyBkZXN0cnVjdG9yIGJlZm9yZSBkZWFsbG9jYXRpbmcgaXRzIG1lbW9yeS4KKyAgfk9wdGlvbmFsU3RvcmFnZSgpIHsKKyAgICBpZiAoIWlzX251bGxfKQorICAgICAgdmFsdWVfLn5UKCk7CisgIH0KKworICBib29sIGlzX251bGxfID0gdHJ1ZTsKKyAgdW5pb24geworICAgIC8vIHxlbXB0eV98IGV4aXN0cyBzbyB0aGF0IHRoZSB1bmlvbiB3aWxsIGFsd2F5cyBiZSBpbml0aWFsaXplZCwgZXZlbiB3aGVuCisgICAgLy8gaXQgZG9lc24ndCBjb250YWluIGEgdmFsdWUuIFVuaW9uIG1lbWJlcnMgbXVzdCBiZSBpbml0aWFsaXplZCBmb3IgdGhlCisgICAgLy8gY29uc3RydWN0b3IgdG8gYmUgJ2NvbnN0ZXhwcicuCisgICAgY2hhciBlbXB0eV87CisgICAgVCB2YWx1ZV87CisgIH07Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBPcHRpb25hbFN0b3JhZ2U8VCwgdHJ1ZT4geworICAvLyBJbml0aWFsaXppbmcgfGVtcHR5X3wgaGVyZSBpbnN0ZWFkIG9mIHVzaW5nIGRlZmF1bHQgbWVtYmVyIGluaXRpYWxpemluZworICAvLyB0byBhdm9pZCBlcnJvcnMgaW4gZysrIDQuOC4KKyAgY29uc3RleHByIE9wdGlvbmFsU3RvcmFnZSgpIDogZW1wdHlfKCdcMCcpIHt9CisKKyAgY29uc3RleHByIGV4cGxpY2l0IE9wdGlvbmFsU3RvcmFnZShjb25zdCBUJiB2YWx1ZSkKKyAgICAgIDogaXNfbnVsbF8oZmFsc2UpLCB2YWx1ZV8odmFsdWUpIHt9CisKKyAgLy8gVE9ETyhhbHNoYWJhbGluKTogQ2FuJ3QgdXNlICdjb25zdGV4cHInIHdpdGggc3RkOjptb3ZlIHVudGlsIEMrKzE0LgorICBleHBsaWNpdCBPcHRpb25hbFN0b3JhZ2UoVCYmIHZhbHVlKQorICAgICAgOiBpc19udWxsXyhmYWxzZSksIHZhbHVlXyhzdGQ6Om1vdmUodmFsdWUpKSB7fQorCisgIC8vIFRPRE8oYWxzaGFiYWxpbik6IENhbid0IHVzZSAnY29uc3RleHByJyB3aXRoIHN0ZDo6Zm9yd2FyZCB1bnRpbCBDKysxNC4KKyAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+CisgIGV4cGxpY2l0IE9wdGlvbmFsU3RvcmFnZShpbl9wbGFjZV90LCBBcmdzJiYuLi4gYXJncykKKyAgICAgIDogaXNfbnVsbF8oZmFsc2UpLCB2YWx1ZV8oc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSB7fQorCisgIC8vIFdoZW4gVCBpcyB0cml2aWFsbHkgZGVzdHJ1Y3RpYmxlIChpLmUuIGl0cyBkZXN0cnVjdG9yIGRvZXMgbm90aGluZykgdGhlcmUKKyAgLy8gaXMgbm8gbmVlZCB0byBjYWxsIGl0LiBFeHBsaWNpdGx5IGRlZmF1bHRpbmcgdGhlIGRlc3RydWN0b3IgbWVhbnMgaXQncyBub3QKKyAgLy8gdXNlci1wcm92aWRlZC4gVGhvc2UgdHdvIHRvZ2V0aGVyIG1ha2UgdGhpcyBkZXN0cnVjdG9yIHRyaXZpYWwuCisgIH5PcHRpb25hbFN0b3JhZ2UoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBpc19udWxsXyA9IHRydWU7CisgIHVuaW9uIHsKKyAgICAvLyB8ZW1wdHlffCBleGlzdHMgc28gdGhhdCB0aGUgdW5pb24gd2lsbCBhbHdheXMgYmUgaW5pdGlhbGl6ZWQsIGV2ZW4gd2hlbgorICAgIC8vIGl0IGRvZXNuJ3QgY29udGFpbiBhIHZhbHVlLiBVbmlvbiBtZW1iZXJzIG11c3QgYmUgaW5pdGlhbGl6ZWQgZm9yIHRoZQorICAgIC8vIGNvbnN0cnVjdG9yIHRvIGJlICdjb25zdGV4cHInLgorICAgIGNoYXIgZW1wdHlfOworICAgIFQgdmFsdWVfOworICB9OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIHBkZml1bTo6T3B0aW9uYWwgaXMgYSBQREZpdW0gdmVyc2lvbiBvZiB0aGUgQysrMTcgb3B0aW9uYWwgY2xhc3MsCisvLyBiYXNlZCBvbiB0aGUgQ2hyb21pdW0gdmVyc2lvbjoKKy8vIHN0ZDo6b3B0aW9uYWwgZG9jdW1lbnRhdGlvbjoKKy8vIGh0dHA6Ly9lbi5jcHByZWZlcmVuY2UuY29tL3cvY3BwL3V0aWxpdHkvb3B0aW9uYWwKKy8vIENocm9taXVtIGRvY3VtZW50YXRpb246CisvLyBodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjLysvbWFzdGVyL2RvY3Mvb3B0aW9uYWwubWQKKy8vCisvLyBUaGVzZSBhcmUgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHNwZWNpZmljYXRpb24gYW5kIHRoZSBpbXBsZW1lbnRhdGlvbjoKKy8vIC0gVGhlIGNvbnN0cnVjdG9yIGFuZCBlbXBsYWNlIG1ldGhvZCB1c2luZyBpbml0aWFsaXplcl9saXN0IGFyZSBub3QKKy8vICAgaW1wbGVtZW50ZWQgYmVjYXVzZSAnaW5pdGlhbGl6ZXJfbGlzdCcgaXMgYmFubmVkIGZyb20gQ2hyb21pdW0uCisvLyAtIENvbnN0cnVjdG9ycyBkbyBub3QgdXNlICdjb25zdGV4cHInIGFzIGl0IGlzIGEgQysrMTQgZXh0ZW5zaW9uLgorLy8gLSAnY29uc3RleHByJyBtaWdodCBiZSBtaXNzaW5nIGluIHNvbWUgcGxhY2VzIGZvciByZWFzb25zIHNwZWNpZmllZCBsb2NhbGx5LgorLy8gLSBObyBleGNlcHRpb25zIGFyZSB0aHJvd24sIGJlY2F1c2UgdGhleSBhcmUgYmFubmVkIGZyb20gQ2hyb21pdW0uCisvLyAtIEFsbCB0aGUgbm9uLW1lbWJlcnMgYXJlIGluIHRoZSAncGRpZnVtJyBuYW1lc3BhY2UgaW5zdGVhZCBvZiAnc3RkJy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgT3B0aW9uYWwgeworIHB1YmxpYzoKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IFQ7CisKKyAgY29uc3RleHByIE9wdGlvbmFsKCkgPSBkZWZhdWx0OworCisgIGNvbnN0ZXhwciBPcHRpb25hbChudWxsb3B0X3QpIHt9CisKKyAgT3B0aW9uYWwoY29uc3QgT3B0aW9uYWwmIG90aGVyKSB7CisgICAgaWYgKCFvdGhlci5zdG9yYWdlXy5pc19udWxsXykKKyAgICAgIEluaXQob3RoZXIudmFsdWUoKSk7CisgIH0KKworICBPcHRpb25hbChPcHRpb25hbCYmIG90aGVyKSB7CisgICAgaWYgKCFvdGhlci5zdG9yYWdlXy5pc19udWxsXykKKyAgICAgIEluaXQoc3RkOjptb3ZlKG90aGVyLnZhbHVlKCkpKTsKKyAgfQorCisgIGNvbnN0ZXhwciBPcHRpb25hbChjb25zdCBUJiB2YWx1ZSkgOiBzdG9yYWdlXyh2YWx1ZSkge30KKworICAvLyBUT0RPKGFsc2hhYmFsaW4pOiBDYW4ndCB1c2UgJ2NvbnN0ZXhwcicgd2l0aCBzdGQ6Om1vdmUgdW50aWwgQysrMTQuCisgIE9wdGlvbmFsKFQmJiB2YWx1ZSkgOiBzdG9yYWdlXyhzdGQ6Om1vdmUodmFsdWUpKSB7fQorCisgIC8vIFRPRE8oYWxzaGFiYWxpbik6IENhbid0IHVzZSAnY29uc3RleHByJyB3aXRoIHN0ZDo6Zm9yd2FyZCB1bnRpbCBDKysxNC4KKyAgdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+CisgIGV4cGxpY2l0IE9wdGlvbmFsKGluX3BsYWNlX3QsIEFyZ3MmJi4uLiBhcmdzKQorICAgICAgOiBzdG9yYWdlXyhpbl9wbGFjZSwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKSB7fQorCisgIH5PcHRpb25hbCgpID0gZGVmYXVsdDsKKworICBPcHRpb25hbCYgb3BlcmF0b3I9KG51bGxvcHRfdCkgeworICAgIEZyZWVJZk5lZWRlZCgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIE9wdGlvbmFsJiBvcGVyYXRvcj0oY29uc3QgT3B0aW9uYWwmIG90aGVyKSB7CisgICAgaWYgKG90aGVyLnN0b3JhZ2VfLmlzX251bGxfKSB7CisgICAgICBGcmVlSWZOZWVkZWQoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbml0T3JBc3NpZ24ob3RoZXIudmFsdWUoKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgT3B0aW9uYWwmIG9wZXJhdG9yPShPcHRpb25hbCYmIG90aGVyKSB7CisgICAgaWYgKG90aGVyLnN0b3JhZ2VfLmlzX251bGxfKSB7CisgICAgICBGcmVlSWZOZWVkZWQoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJbml0T3JBc3NpZ24oc3RkOjptb3ZlKG90aGVyLnZhbHVlKCkpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVT4KKyAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19zYW1lPHN0ZDo6ZGVjYXk8VT4sIFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwmPjo6dHlwZQorICBvcGVyYXRvcj0oVSYmIHZhbHVlKSB7CisgICAgSW5pdE9yQXNzaWduKHN0ZDo6Zm9yd2FyZDxVPih2YWx1ZSkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIFRPRE8obWxhbW91cmkpOiBjYW4ndCB1c2UgJ2NvbnN0ZXhwcicgd2l0aCBEQ0hFQ0suCisgIGNvbnN0IFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7CisgICAgRENIRUNLKCFzdG9yYWdlXy5pc19udWxsXyk7CisgICAgcmV0dXJuICZ2YWx1ZSgpOworICB9CisKKyAgLy8gVE9ETyhtbGFtb3VyaSk6IHVzaW5nICdjb25zdGV4cHInIGhlcmUgYnJlYWtzIGNvbXBpbGVyIHRoYXQgYXNzdW1lIGl0IHdhcworICAvLyBtZWFudCB0byBiZSAnY29uc3RleHByIGNvbnN0Jy4KKyAgVCogb3BlcmF0b3ItPigpIHsKKyAgICBEQ0hFQ0soIXN0b3JhZ2VfLmlzX251bGxfKTsKKyAgICByZXR1cm4gJnZhbHVlKCk7CisgIH0KKworICBjb25zdGV4cHIgY29uc3QgVCYgb3BlcmF0b3IqKCkgY29uc3QmIHsgcmV0dXJuIHZhbHVlKCk7IH0KKworICAvLyBUT0RPKG1sYW1vdXJpKTogdXNpbmcgJ2NvbnN0ZXhwcicgaGVyZSBicmVha3MgY29tcGlsZXIgdGhhdCBhc3N1bWUgaXQgd2FzCisgIC8vIG1lYW50IHRvIGJlICdjb25zdGV4cHIgY29uc3QnLgorICBUJiBvcGVyYXRvciooKSAmIHsgcmV0dXJuIHZhbHVlKCk7IH0KKworICBjb25zdGV4cHIgY29uc3QgVCYmIG9wZXJhdG9yKigpIGNvbnN0JiYgeyByZXR1cm4gc3RkOjptb3ZlKHZhbHVlKCkpOyB9CisKKyAgLy8gVE9ETyhtbGFtb3VyaSk6IHVzaW5nICdjb25zdGV4cHInIGhlcmUgYnJlYWtzIGNvbXBpbGVyIHRoYXQgYXNzdW1lIGl0IHdhcworICAvLyBtZWFudCB0byBiZSAnY29uc3RleHByIGNvbnN0Jy4KKyAgVCYmIG9wZXJhdG9yKigpICYmIHsgcmV0dXJuIHN0ZDo6bW92ZSh2YWx1ZSgpKTsgfQorCisgIGNvbnN0ZXhwciBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gIXN0b3JhZ2VfLmlzX251bGxfOyB9CisKKyAgY29uc3RleHByIGJvb2wgaGFzX3ZhbHVlKCkgY29uc3QgeyByZXR1cm4gIXN0b3JhZ2VfLmlzX251bGxfOyB9CisKKyAgLy8gVE9ETyhtbGFtb3VyaSk6IHVzaW5nICdjb25zdGV4cHInIGhlcmUgYnJlYWtzIGNvbXBpbGVyIHRoYXQgYXNzdW1lIGl0IHdhcworICAvLyBtZWFudCB0byBiZSAnY29uc3RleHByIGNvbnN0Jy4KKyAgVCYgdmFsdWUoKSAmIHsKKyAgICBEQ0hFQ0soIXN0b3JhZ2VfLmlzX251bGxfKTsKKyAgICByZXR1cm4gc3RvcmFnZV8udmFsdWVfOworICB9CisKKyAgLy8gVE9ETyhtbGFtb3VyaSk6IGNhbid0IHVzZSAnY29uc3RleHByJyB3aXRoIERDSEVDSy4KKyAgY29uc3QgVCYgdmFsdWUoKSBjb25zdCYgeworICAgIERDSEVDSyghc3RvcmFnZV8uaXNfbnVsbF8pOworICAgIHJldHVybiBzdG9yYWdlXy52YWx1ZV87CisgIH0KKworICAvLyBUT0RPKG1sYW1vdXJpKTogdXNpbmcgJ2NvbnN0ZXhwcicgaGVyZSBicmVha3MgY29tcGlsZXIgdGhhdCBhc3N1bWUgaXQgd2FzCisgIC8vIG1lYW50IHRvIGJlICdjb25zdGV4cHIgY29uc3QnLgorICBUJiYgdmFsdWUoKSAmJiB7CisgICAgRENIRUNLKCFzdG9yYWdlXy5pc19udWxsXyk7CisgICAgcmV0dXJuIHN0ZDo6bW92ZShzdG9yYWdlXy52YWx1ZV8pOworICB9CisKKyAgLy8gVE9ETyhtbGFtb3VyaSk6IGNhbid0IHVzZSAnY29uc3RleHByJyB3aXRoIERDSEVDSy4KKyAgY29uc3QgVCYmIHZhbHVlKCkgY29uc3QmJiB7CisgICAgRENIRUNLKCFzdG9yYWdlXy5pc19udWxsXyk7CisgICAgcmV0dXJuIHN0ZDo6bW92ZShzdG9yYWdlXy52YWx1ZV8pOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFU+CisgIGNvbnN0ZXhwciBUIHZhbHVlX29yKFUmJiBkZWZhdWx0X3ZhbHVlKSBjb25zdCYgeworICAgIC8vIFRPRE8obWxhbW91cmkpOiBhZGQgdGhlIGZvbGxvd2luZyBhc3NlcnQgd2hlbiBwb3NzaWJsZToKKyAgICAvLyBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfY29weV9jb25zdHJ1Y3RpYmxlPFQ+Ojp2YWx1ZSwKKyAgICAvLyAgICAgICAgICAgICAgICJUIG11c3QgYmUgY29weSBjb25zdHJ1Y3RpYmxlIik7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2NvbnZlcnRpYmxlPFUsIFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJVIG11c3QgYmUgY29udmVydGlibGUgdG8gVCIpOworICAgIHJldHVybiBzdG9yYWdlXy5pc19udWxsXyA/IHN0YXRpY19jYXN0PFQ+KHN0ZDo6Zm9yd2FyZDxVPihkZWZhdWx0X3ZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZSgpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFU+CisgIFQgdmFsdWVfb3IoVSYmIGRlZmF1bHRfdmFsdWUpICYmIHsKKyAgICAvLyBUT0RPKG1sYW1vdXJpKTogYWRkIHRoZSBmb2xsb3dpbmcgYXNzZXJ0IHdoZW4gcG9zc2libGU6CisgICAgLy8gc3RhdGljX2Fzc2VydChzdGQ6OmlzX21vdmVfY29uc3RydWN0aWJsZTxUPjo6dmFsdWUsCisgICAgLy8gICAgICAgICAgICAgICAiVCBtdXN0IGJlIG1vdmUgY29uc3RydWN0aWJsZSIpOworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19jb252ZXJ0aWJsZTxVLCBUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiVSBtdXN0IGJlIGNvbnZlcnRpYmxlIHRvIFQiKTsKKyAgICByZXR1cm4gc3RvcmFnZV8uaXNfbnVsbF8gPyBzdGF0aWNfY2FzdDxUPihzdGQ6OmZvcndhcmQ8VT4oZGVmYXVsdF92YWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3RkOjptb3ZlKHZhbHVlKCkpOworICB9CisKKyAgdm9pZCBzd2FwKE9wdGlvbmFsJiBvdGhlcikgeworICAgIGlmIChzdG9yYWdlXy5pc19udWxsXyAmJiBvdGhlci5zdG9yYWdlXy5pc19udWxsXykKKyAgICAgIHJldHVybjsKKworICAgIGlmIChzdG9yYWdlXy5pc19udWxsXyAhPSBvdGhlci5zdG9yYWdlXy5pc19udWxsXykgeworICAgICAgaWYgKHN0b3JhZ2VfLmlzX251bGxfKSB7CisgICAgICAgIEluaXQoc3RkOjptb3ZlKG90aGVyLnN0b3JhZ2VfLnZhbHVlXykpOworICAgICAgICBvdGhlci5GcmVlSWZOZWVkZWQoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG90aGVyLkluaXQoc3RkOjptb3ZlKHN0b3JhZ2VfLnZhbHVlXykpOworICAgICAgICBGcmVlSWZOZWVkZWQoKTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBEQ0hFQ0soIXN0b3JhZ2VfLmlzX251bGxfICYmICFvdGhlci5zdG9yYWdlXy5pc19udWxsXyk7CisgICAgdXNpbmcgc3RkOjpzd2FwOworICAgIHN3YXAoKip0aGlzLCAqb3RoZXIpOworICB9CisKKyAgdm9pZCByZXNldCgpIHsKKyAgICBGcmVlSWZOZWVkZWQoKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdzPgorICB2b2lkIGVtcGxhY2UoQXJncyYmLi4uIGFyZ3MpIHsKKyAgICBGcmVlSWZOZWVkZWQoKTsKKyAgICBJbml0KHN0ZDo6Zm9yd2FyZDxBcmdzPihhcmdzKS4uLik7CisgIH0KKworIHByaXZhdGU6CisgIHZvaWQgSW5pdChjb25zdCBUJiB2YWx1ZSkgeworICAgIERDSEVDSyhzdG9yYWdlXy5pc19udWxsXyk7CisgICAgbmV3ICgmc3RvcmFnZV8udmFsdWVfKSBUKHZhbHVlKTsKKyAgICBzdG9yYWdlXy5pc19udWxsXyA9IGZhbHNlOworICB9CisKKyAgdm9pZCBJbml0KFQmJiB2YWx1ZSkgeworICAgIERDSEVDSyhzdG9yYWdlXy5pc19udWxsXyk7CisgICAgbmV3ICgmc3RvcmFnZV8udmFsdWVfKSBUKHN0ZDo6bW92ZSh2YWx1ZSkpOworICAgIHN0b3JhZ2VfLmlzX251bGxfID0gZmFsc2U7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJncz4KKyAgdm9pZCBJbml0KEFyZ3MmJi4uLiBhcmdzKSB7CisgICAgRENIRUNLKHN0b3JhZ2VfLmlzX251bGxfKTsKKyAgICBuZXcgKCZzdG9yYWdlXy52YWx1ZV8pIFQoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKKyAgICBzdG9yYWdlXy5pc19udWxsXyA9IGZhbHNlOworICB9CisKKyAgdm9pZCBJbml0T3JBc3NpZ24oY29uc3QgVCYgdmFsdWUpIHsKKyAgICBpZiAoc3RvcmFnZV8uaXNfbnVsbF8pCisgICAgICBJbml0KHZhbHVlKTsKKyAgICBlbHNlCisgICAgICBzdG9yYWdlXy52YWx1ZV8gPSB2YWx1ZTsKKyAgfQorCisgIHZvaWQgSW5pdE9yQXNzaWduKFQmJiB2YWx1ZSkgeworICAgIGlmIChzdG9yYWdlXy5pc19udWxsXykKKyAgICAgIEluaXQoc3RkOjptb3ZlKHZhbHVlKSk7CisgICAgZWxzZQorICAgICAgc3RvcmFnZV8udmFsdWVfID0gc3RkOjptb3ZlKHZhbHVlKTsKKyAgfQorCisgIHZvaWQgRnJlZUlmTmVlZGVkKCkgeworICAgIGlmIChzdG9yYWdlXy5pc19udWxsXykKKyAgICAgIHJldHVybjsKKyAgICBzdG9yYWdlXy52YWx1ZV8uflQoKTsKKyAgICBzdG9yYWdlXy5pc19udWxsXyA9IHRydWU7CisgIH0KKworICBpbnRlcm5hbDo6T3B0aW9uYWxTdG9yYWdlPFQ+IHN0b3JhZ2VfOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+Citjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE9wdGlvbmFsPFQ+JiBsaHMsIGNvbnN0IE9wdGlvbmFsPFQ+JiByaHMpIHsKKyAgcmV0dXJuICEhbGhzICE9ICEhcmhzID8gZmFsc2UgOiBsaHMgPT0gbnVsbG9wdCB8fCAoKmxocyA9PSAqcmhzKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Citjb25zdGV4cHIgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE9wdGlvbmFsPFQ+JiBsaHMsIGNvbnN0IE9wdGlvbmFsPFQ+JiByaHMpIHsKKyAgcmV0dXJuICEobGhzID09IHJocyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3RleHByIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE9wdGlvbmFsPFQ+JiBsaHMsIGNvbnN0IE9wdGlvbmFsPFQ+JiByaHMpIHsKKyAgcmV0dXJuIHJocyA9PSBudWxsb3B0ID8gZmFsc2UgOiAobGhzID09IG51bGxvcHQgPyB0cnVlIDogKmxocyA8ICpyaHMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yPD0oY29uc3QgT3B0aW9uYWw8VD4mIGxocywgY29uc3QgT3B0aW9uYWw8VD4mIHJocykgeworICByZXR1cm4gIShyaHMgPCBsaHMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yPihjb25zdCBPcHRpb25hbDxUPiYgbGhzLCBjb25zdCBPcHRpb25hbDxUPiYgcmhzKSB7CisgIHJldHVybiByaHMgPCBsaHM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3RleHByIGJvb2wgb3BlcmF0b3I+PShjb25zdCBPcHRpb25hbDxUPiYgbGhzLCBjb25zdCBPcHRpb25hbDxUPiYgcmhzKSB7CisgIHJldHVybiAhKGxocyA8IHJocyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShjb25zdCBPcHRpb25hbDxUPiYgb3B0LCBudWxsb3B0X3QpIHsKKyAgcmV0dXJuICFvcHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3RleHByIGJvb2wgb3BlcmF0b3I9PShudWxsb3B0X3QsIGNvbnN0IE9wdGlvbmFsPFQ+JiBvcHQpIHsKKyAgcmV0dXJuICFvcHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3RleHByIGJvb2wgb3BlcmF0b3IhPShjb25zdCBPcHRpb25hbDxUPiYgb3B0LCBudWxsb3B0X3QpIHsKKyAgcmV0dXJuICEhb3B0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0obnVsbG9wdF90LCBjb25zdCBPcHRpb25hbDxUPiYgb3B0KSB7CisgIHJldHVybiAhIW9wdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Citjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwoY29uc3QgT3B0aW9uYWw8VD4mIG9wdCwgbnVsbG9wdF90KSB7CisgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Citjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwobnVsbG9wdF90LCBjb25zdCBPcHRpb25hbDxUPiYgb3B0KSB7CisgIHJldHVybiAhIW9wdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Citjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IE9wdGlvbmFsPFQ+JiBvcHQsIG51bGxvcHRfdCkgeworICByZXR1cm4gIW9wdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Citjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjw9KG51bGxvcHRfdCwgY29uc3QgT3B0aW9uYWw8VD4mIG9wdCkgeworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Citjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj4oY29uc3QgT3B0aW9uYWw8VD4mIG9wdCwgbnVsbG9wdF90KSB7CisgIHJldHVybiAhIW9wdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Citjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj4obnVsbG9wdF90LCBjb25zdCBPcHRpb25hbDxUPiYgb3B0KSB7CisgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Citjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj49KGNvbnN0IE9wdGlvbmFsPFQ+JiBvcHQsIG51bGxvcHRfdCkgeworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Citjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj49KG51bGxvcHRfdCwgY29uc3QgT3B0aW9uYWw8VD4mIG9wdCkgeworICByZXR1cm4gIW9wdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Citjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE9wdGlvbmFsPFQ+JiBvcHQsIGNvbnN0IFQmIHZhbHVlKSB7CisgIHJldHVybiBvcHQgIT0gbnVsbG9wdCA/ICpvcHQgPT0gdmFsdWUgOiBmYWxzZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Citjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFQmIHZhbHVlLCBjb25zdCBPcHRpb25hbDxUPiYgb3B0KSB7CisgIHJldHVybiBvcHQgPT0gdmFsdWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3RleHByIGJvb2wgb3BlcmF0b3IhPShjb25zdCBPcHRpb25hbDxUPiYgb3B0LCBjb25zdCBUJiB2YWx1ZSkgeworICByZXR1cm4gIShvcHQgPT0gdmFsdWUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgVCYgdmFsdWUsIGNvbnN0IE9wdGlvbmFsPFQ+JiBvcHQpIHsKKyAgcmV0dXJuICEob3B0ID09IHZhbHVlKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Citjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwoY29uc3QgT3B0aW9uYWw8VD4mIG9wdCwgY29uc3QgVCYgdmFsdWUpIHsKKyAgcmV0dXJuIG9wdCAhPSBudWxsb3B0ID8gKm9wdCA8IHZhbHVlIDogdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Citjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwoY29uc3QgVCYgdmFsdWUsIGNvbnN0IE9wdGlvbmFsPFQ+JiBvcHQpIHsKKyAgcmV0dXJuIG9wdCAhPSBudWxsb3B0ID8gdmFsdWUgPCAqb3B0IDogZmFsc2U7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3RleHByIGJvb2wgb3BlcmF0b3I8PShjb25zdCBPcHRpb25hbDxUPiYgb3B0LCBjb25zdCBUJiB2YWx1ZSkgeworICByZXR1cm4gIShvcHQgPiB2YWx1ZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3RleHByIGJvb2wgb3BlcmF0b3I8PShjb25zdCBUJiB2YWx1ZSwgY29uc3QgT3B0aW9uYWw8VD4mIG9wdCkgeworICByZXR1cm4gISh2YWx1ZSA+IG9wdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3RleHByIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE9wdGlvbmFsPFQ+JiBvcHQsIGNvbnN0IFQmIHZhbHVlKSB7CisgIHJldHVybiB2YWx1ZSA8IG9wdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Citjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj4oY29uc3QgVCYgdmFsdWUsIGNvbnN0IE9wdGlvbmFsPFQ+JiBvcHQpIHsKKyAgcmV0dXJuIG9wdCA8IHZhbHVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yPj0oY29uc3QgT3B0aW9uYWw8VD4mIG9wdCwgY29uc3QgVCYgdmFsdWUpIHsKKyAgcmV0dXJuICEob3B0IDwgdmFsdWUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yPj0oY29uc3QgVCYgdmFsdWUsIGNvbnN0IE9wdGlvbmFsPFQ+JiBvcHQpIHsKKyAgcmV0dXJuICEodmFsdWUgPCBvcHQpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NvbnN0ZXhwciBPcHRpb25hbDx0eXBlbmFtZSBzdGQ6OmRlY2F5PFQ+Ojp0eXBlPiBtYWtlX29wdGlvbmFsKFQmJiB2YWx1ZSkgeworICByZXR1cm4gT3B0aW9uYWw8dHlwZW5hbWUgc3RkOjpkZWNheTxUPjo6dHlwZT4oc3RkOjpmb3J3YXJkPFQ+KHZhbHVlKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgordm9pZCBzd2FwKE9wdGlvbmFsPFQ+JiBsaHMsIE9wdGlvbmFsPFQ+JiByaHMpIHsKKyAgbGhzLnN3YXAocmhzKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHBkZml1bQorCituYW1lc3BhY2Ugc3RkIHsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitzdHJ1Y3QgaGFzaDxwZGZpdW06Ok9wdGlvbmFsPFQ+PiB7CisgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IHBkZml1bTo6T3B0aW9uYWw8VD4mIG9wdCkgY29uc3QgeworICAgIHJldHVybiBvcHQgPT0gcGRmaXVtOjpudWxsb3B0ID8gMCA6IHN0ZDo6aGFzaDxUPigpKCpvcHQpOworICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc3RkCisKK3RlbXBsYXRlIDxjbGFzcyBUPgordXNpbmcgT3B0aW9uYWwgPSBwZGZpdW06Ok9wdGlvbmFsPFQ+OworCisjZW5kaWYgIC8vIFBERklVTV9USElSRF9QQVJUWV9CQVNFX09QVElPTkFMX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmggYi90aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgKaW5kZXggNzk1NDE0Yi4uNmMzNmRkYyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oCisrKyBiL3RoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaApAQCAtNiw2ICs2LDcgQEAKICNkZWZpbmUgUERGSVVNX1RISVJEX1BBUlRZX0JBU0VfU1RMX1VUSUxfSF8KIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8c2V0PgogCkBAIC0yNCw4ICsyNSw4IEBACiAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIGlzIGluIHRoZSBjb2xsZWN0aW9uLgogdGVtcGxhdGUgPHR5cGVuYW1lIENvbGxlY3Rpb24sIHR5cGVuYW1lIFZhbHVlPgogYm9vbCBDb250YWluc1ZhbHVlKGNvbnN0IENvbGxlY3Rpb24mIGNvbGxlY3Rpb24sIGNvbnN0IFZhbHVlJiB2YWx1ZSkgewotICByZXR1cm4gc3RkOjpmaW5kKGNvbGxlY3Rpb24uYmVnaW4oKSwgY29sbGVjdGlvbi5lbmQoKSwgdmFsdWUpICE9Ci0gICAgICAgICBjb2xsZWN0aW9uLmVuZCgpOworICByZXR1cm4gc3RkOjpmaW5kKHN0ZDo6YmVnaW4oY29sbGVjdGlvbiksIHN0ZDo6ZW5kKGNvbGxlY3Rpb24pLCB2YWx1ZSkgIT0KKyAgICAgICAgIHN0ZDo6ZW5kKGNvbGxlY3Rpb24pOwogfQogCiAvLyBNZWFucyBvZiBnZW5lcmF0aW5nIGEga2V5IGZvciBzZWFyY2hpbmcgU1RMIGNvbGxlY3Rpb25zIG9mIHN0ZDo6dW5pcXVlX3B0cgpAQCAtNDQsNiArNDUsMTMgQEAKICAgcmV0dXJuIHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PFJlc3VsdFR5cGU+KGNvbGxlY3Rpb24uc2l6ZSgpKTsKIH0KIAorLy8gQ29udmVuaWVuY2Ugcm91dGluZSBmb3IgImludC1mZWN0ZWQiIGNvZGUsIHRvIGhhbmRsZSBzaWduZWQgaW5kaWNpZXMuIFRoZQorLy8gY29tcGlsZXIgY2FuIGRlZHVjZSB0aGUgdHlwZSwgbWFraW5nIHRoaXMgbW9yZSBjb252ZW5pZW50IHRoYW4gdGhlIGFib3ZlLgordGVtcGxhdGUgPHR5cGVuYW1lIEluZGV4VHlwZSwgdHlwZW5hbWUgQ29sbGVjdGlvbj4KK2Jvb2wgSW5kZXhJbkJvdW5kcyhjb25zdCBDb2xsZWN0aW9uJiBjb2xsZWN0aW9uLCBJbmRleFR5cGUgaW5kZXgpIHsKKyAgcmV0dXJuIGluZGV4ID49IDAgJiYgaW5kZXggPCBDb2xsZWN0aW9uU2l6ZTxJbmRleFR5cGU+KGNvbGxlY3Rpb24pOworfQorCiAvLyBUcmFjayB0aGUgYWRkaXRpb24gb2YgYW4gb2JqZWN0IHRvIGEgc2V0LCByZW1vdmluZyBpdCBhdXRvbWF0aWNhbGx5IHdoZW4KIC8vIHRoZSBTY29wZWRTZXRJbnNlcnRpb24gZ29lcyBvdXQgb2Ygc2NvcGUuCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KQEAgLTYwLDYgKzY4LDEyIEBACiAgIGNvbnN0IFQgbV9FbnRyeTsKIH07CiAKKy8vIHN0ZDo6Y2xhbXAoKSwgc29tZSBkYXkuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NvbnN0ZXhwciBjb25zdCBUJiBjbGFtcChjb25zdCBUJiB2LCBjb25zdCBUJiBsbywgY29uc3QgVCYgaGkpIHsKKyAgcmV0dXJuIHN0ZDo6bWluKHN0ZDo6bWF4KHYsIGxvKSwgaGkpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgcGRmaXVtCiAKICNlbmRpZiAgLy8gUERGSVVNX1RISVJEX1BBUlRZX0JBU0VfU1RMX1VUSUxfSF8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2Jhc2Uvc3lzX2J5dGVvcmRlci5oIGIvdGhpcmRfcGFydHkvYmFzZS9zeXNfYnl0ZW9yZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkzYWJlMQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2Jhc2Uvc3lzX2J5dGVvcmRlci5oCkBAIC0wLDAgKzEsMTQxIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBUaGlzIGhlYWRlciBkZWZpbmVzIGNyb3NzLXBsYXRmb3JtIEJ5dGVTd2FwKCkgaW1wbGVtZW50YXRpb25zIGZvciAxNiwgMzIgYW5kCisvLyA2NC1iaXQgdmFsdWVzLCBhbmQgTmV0VG9Ib3N0WFgoKSAvIEhvc3RUb05leHRYWCgpIGZ1bmN0aW9ucyBlcXVpdmFsZW50IHRvCisvLyB0aGUgdHJhZGl0aW9uYWwgbnRvaFgoKSBhbmQgaHRvblgoKSBmdW5jdGlvbnMuCisvLyBVc2UgdGhlIGZ1bmN0aW9ucyBkZWZpbmVkIGhlcmUgcmF0aGVyIHRoYW4gdXNpbmcgdGhlIHBsYXRmb3JtLXNwZWNpZmljCisvLyBmdW5jdGlvbnMgZGlyZWN0bHkuCisKKyNpZm5kZWYgQkFTRV9TWVNfQllURU9SREVSX0hfCisjZGVmaW5lIEJBU0VfU1lTX0JZVEVPUkRFUl9IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9idWlsZC9idWlsZF9jb25maWcuaCIKKworI2lmIGRlZmluZWQoQ09NUElMRVJfTVNWQykKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCituYW1lc3BhY2UgcGRmaXVtIHsKK25hbWVzcGFjZSBiYXNlIHsKKworLy8gUmV0dXJucyBhIHZhbHVlIHdpdGggYWxsIGJ5dGVzIGluIHx4fCBzd2FwcGVkLCBpLmUuIHJldmVyc2VzIHRoZSBlbmRpYW5uZXNzLgoraW5saW5lIHVpbnQxNl90IEJ5dGVTd2FwKHVpbnQxNl90IHgpIHsKKyNpZiBkZWZpbmVkKENPTVBJTEVSX01TVkMpCisgIHJldHVybiBfYnl0ZXN3YXBfdXNob3J0KHgpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9ic3dhcDE2KHgpOworI2VuZGlmCit9CisKK2lubGluZSB1aW50MzJfdCBCeXRlU3dhcCh1aW50MzJfdCB4KSB7CisjaWYgZGVmaW5lZChDT01QSUxFUl9NU1ZDKQorICByZXR1cm4gX2J5dGVzd2FwX3Vsb25nKHgpOworI2Vsc2UKKyAgcmV0dXJuIF9fYnVpbHRpbl9ic3dhcDMyKHgpOworI2VuZGlmCit9CisKK2lubGluZSB1aW50NjRfdCBCeXRlU3dhcCh1aW50NjRfdCB4KSB7CisjaWYgZGVmaW5lZChDT01QSUxFUl9NU1ZDKQorICByZXR1cm4gX2J5dGVzd2FwX3VpbnQ2NCh4KTsKKyNlbHNlCisgIHJldHVybiBfX2J1aWx0aW5fYnN3YXA2NCh4KTsKKyNlbmRpZgorfQorCitpbmxpbmUgdWludHB0cl90IEJ5dGVTd2FwVWludFB0clQodWludHB0cl90IHgpIHsKKyAgLy8gV2UgZG8gaXQgdGhpcyB3YXkgYmVjYXVzZSBzb21lIGJ1aWxkIGNvbmZpZ3VyYXRpb25zIGFyZSBJTFAzMiBldmVuIHdoZW4KKyAgLy8gZGVmaW5lZChBUkNIX0NQVV82NF9CSVRTKS4gVW5mb3J0dW5hdGVseSwgd2UgY2FuJ3QgdXNlIHNpemVvZiBpbiAjaWZzLiBCdXQsCisgIC8vIGJlY2F1c2UgdGhlc2UgY29uZGl0aW9uYWxzIGFyZSBjb25zdGV4cHJzLCB0aGUgaXJyZWxldmFudCBicmFuY2hlcyB3aWxsCisgIC8vIGxpa2VseSBiZSBvcHRpbWl6ZWQgYXdheSwgc28gdGhpcyBjb25zdHJ1Y3Rpb24gc2hvdWxkIG5vdCByZXN1bHQgaW4gY29kZQorICAvLyBibG9hdC4KKyAgaWYgKHNpemVvZih1aW50cHRyX3QpID09IDQpIHsKKyAgICByZXR1cm4gQnl0ZVN3YXAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHgpKTsKKyAgfSBlbHNlIGlmIChzaXplb2YodWludHB0cl90KSA9PSA4KSB7CisgICAgcmV0dXJuIEJ5dGVTd2FwKHN0YXRpY19jYXN0PHVpbnQ2NF90Pih4KSk7CisgIH0gZWxzZSB7CisgICAgTk9UUkVBQ0hFRCgpOworICB9Cit9CisKKy8vIENvbnZlcnRzIHRoZSBieXRlcyBpbiB8eHwgZnJvbSBob3N0IG9yZGVyIChlbmRpYW5uZXNzKSB0byBsaXR0bGUgZW5kaWFuLCBhbmQKKy8vIHJldHVybnMgdGhlIHJlc3VsdC4KK2lubGluZSB1aW50MTZfdCBCeXRlU3dhcFRvTEUxNih1aW50MTZfdCB4KSB7CisjaWYgZGVmaW5lZChBUkNIX0NQVV9MSVRUTEVfRU5ESUFOKQorICByZXR1cm4geDsKKyNlbHNlCisgIHJldHVybiBCeXRlU3dhcCh4KTsKKyNlbmRpZgorfQoraW5saW5lIHVpbnQzMl90IEJ5dGVTd2FwVG9MRTMyKHVpbnQzMl90IHgpIHsKKyNpZiBkZWZpbmVkKEFSQ0hfQ1BVX0xJVFRMRV9FTkRJQU4pCisgIHJldHVybiB4OworI2Vsc2UKKyAgcmV0dXJuIEJ5dGVTd2FwKHgpOworI2VuZGlmCit9CitpbmxpbmUgdWludDY0X3QgQnl0ZVN3YXBUb0xFNjQodWludDY0X3QgeCkgeworI2lmIGRlZmluZWQoQVJDSF9DUFVfTElUVExFX0VORElBTikKKyAgcmV0dXJuIHg7CisjZWxzZQorICByZXR1cm4gQnl0ZVN3YXAoeCk7CisjZW5kaWYKK30KKworLy8gQ29udmVydHMgdGhlIGJ5dGVzIGluIHx4fCBmcm9tIG5ldHdvcmsgdG8gaG9zdCBvcmRlciAoZW5kaWFubmVzcyksIGFuZAorLy8gcmV0dXJucyB0aGUgcmVzdWx0LgoraW5saW5lIHVpbnQxNl90IE5ldFRvSG9zdDE2KHVpbnQxNl90IHgpIHsKKyNpZiBkZWZpbmVkKEFSQ0hfQ1BVX0xJVFRMRV9FTkRJQU4pCisgIHJldHVybiBCeXRlU3dhcCh4KTsKKyNlbHNlCisgIHJldHVybiB4OworI2VuZGlmCit9CitpbmxpbmUgdWludDMyX3QgTmV0VG9Ib3N0MzIodWludDMyX3QgeCkgeworI2lmIGRlZmluZWQoQVJDSF9DUFVfTElUVExFX0VORElBTikKKyAgcmV0dXJuIEJ5dGVTd2FwKHgpOworI2Vsc2UKKyAgcmV0dXJuIHg7CisjZW5kaWYKK30KK2lubGluZSB1aW50NjRfdCBOZXRUb0hvc3Q2NCh1aW50NjRfdCB4KSB7CisjaWYgZGVmaW5lZChBUkNIX0NQVV9MSVRUTEVfRU5ESUFOKQorICByZXR1cm4gQnl0ZVN3YXAoeCk7CisjZWxzZQorICByZXR1cm4geDsKKyNlbmRpZgorfQorCisvLyBDb252ZXJ0cyB0aGUgYnl0ZXMgaW4gfHh8IGZyb20gaG9zdCB0byBuZXR3b3JrIG9yZGVyIChlbmRpYW5uZXNzKSwgYW5kCisvLyByZXR1cm5zIHRoZSByZXN1bHQuCitpbmxpbmUgdWludDE2X3QgSG9zdFRvTmV0MTYodWludDE2X3QgeCkgeworI2lmIGRlZmluZWQoQVJDSF9DUFVfTElUVExFX0VORElBTikKKyAgcmV0dXJuIEJ5dGVTd2FwKHgpOworI2Vsc2UKKyAgcmV0dXJuIHg7CisjZW5kaWYKK30KK2lubGluZSB1aW50MzJfdCBIb3N0VG9OZXQzMih1aW50MzJfdCB4KSB7CisjaWYgZGVmaW5lZChBUkNIX0NQVV9MSVRUTEVfRU5ESUFOKQorICByZXR1cm4gQnl0ZVN3YXAoeCk7CisjZWxzZQorICByZXR1cm4geDsKKyNlbmRpZgorfQoraW5saW5lIHVpbnQ2NF90IEhvc3RUb05ldDY0KHVpbnQ2NF90IHgpIHsKKyNpZiBkZWZpbmVkKEFSQ0hfQ1BVX0xJVFRMRV9FTkRJQU4pCisgIHJldHVybiBCeXRlU3dhcCh4KTsKKyNlbHNlCisgIHJldHVybiB4OworI2VuZGlmCit9CisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCit9ICAvLyBuYW1lc3BhY2UgcGRmaXVtCisKKyNlbmRpZiAgLy8gQkFTRV9TWVNfQllURU9SREVSX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9iYXNlL3RlbXBsYXRlX3V0aWwuaCBiL3RoaXJkX3BhcnR5L2Jhc2UvdGVtcGxhdGVfdXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNDYzMjIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9iYXNlL3RlbXBsYXRlX3V0aWwuaApAQCAtMCwwICsxLDIwMyBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBCQVNFX1RFTVBMQVRFX1VUSUxfSF8KKyNkZWZpbmUgQkFTRV9URU1QTEFURV9VVElMX0hfCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2J1aWxkL2J1aWxkX2NvbmZpZy5oIgorCisvLyBUaGlzIGhhY2tzIGFyb3VuZCBsaWJzdGRjKysgNC42IG1pc3Npbmcgc3R1ZmYgaW4gdHlwZV90cmFpdHMsIHdoaWxlIHdlIG5lZWQKKy8vIHRvIHN1cHBvcnQgaXQuCisjZGVmaW5lIENSX0dMSUJDWFhfNF83XzAgMjAxMjAzMjIKKyNkZWZpbmUgQ1JfR0xJQkNYWF80XzVfNCAyMDEyMDcwMgorI2RlZmluZSBDUl9HTElCQ1hYXzRfNl80IDIwMTIxMTI3CisjaWYgZGVmaW5lZChfX0dMSUJDWFhfXykgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoX19HTElCQ1hYX18gPCBDUl9HTElCQ1hYXzRfN18wIHx8IF9fR0xJQkNYWF9fID09IENSX0dMSUJDWFhfNF81XzQgfHwgXAorICAgICBfX0dMSUJDWFhfXyA9PSBDUl9HTElCQ1hYXzRfNl80KQorI2RlZmluZSBDUl9VU0VfRkFMTEJBQ0tTX0ZPUl9PTERfR0xJQkNYWAorI2VuZGlmCisKKy8vIFNvbWUgdmVyc2lvbnMgb2YgbGlic3RkYysrIGhhdmUgcGFydGlhbCBzdXBwb3J0IGZvciB0eXBlX3RyYWl0cywgYnV0IG1pc3NlcworLy8gYSBzbWFsbGVyIHN1YnNldCB3aGlsZSByZW1vdmluZyBzb21lIG9mIHRoZSBvbGRlciBub24tc3RhbmRhcmQgc3R1ZmYuIEFzc3VtZQorLy8gdGhhdCBhbGwgdmVyc2lvbnMgYmVsb3cgNS4wIGZhbGwgaW4gdGhpcyBjYXRlZ29yeSwgYWxvbmcgd2l0aCBvbmUgNS4wCisvLyBleHBlcmltZW50YWwgcmVsZWFzZS4gVGVzdCBmb3IgdGhpcyBieSBjb25zdWx0aW5nIGNvbXBpbGVyIG1ham9yIHZlcnNpb24sCisvLyB0aGUgb25seSByZWxpYWJsZSBvcHRpb24gYXZhaWxhYmxlLCBzbyB0aGVvcmV0aWNhbGx5IHRoaXMgY291bGQgZmFpbCBzaG91bGQKKy8vIHlvdSBhdHRlbXB0IHRvIG1peCBhbiBlYXJsaWVyIHZlcnNpb24gb2YgbGlic3RkYysrIHdpdGggPj0gR0NDNS4gQnV0CisvLyB0aGF0J3MgdW5saWtlbHkgdG8gd29yayBvdXQsIGVzcGVjaWFsbHkgYXMgR0NDNSBjaGFuZ2VkIEFCSS4KKyNkZWZpbmUgQ1JfR0xJQkNYWF81XzBfMCAyMDE1MDEyMworI2lmIChkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA8IDUpIHx8IFwKKyAgICAoZGVmaW5lZChfX0dMSUJDWFhfXykgJiYgX19HTElCQ1hYX18gPT0gQ1JfR0xJQkNYWF81XzBfMCkKKyNkZWZpbmUgQ1JfVVNFX0ZBTExCQUNLU19GT1JfT0xEX0VYUEVSSU1FTlRBTF9HTElCQ1hYCisjZW5kaWYKKworLy8gVGhpcyBoYWNrcyBhcm91bmQgdXNpbmcgZ2NjIHdpdGggbGliYysrIHdoaWNoIGhhcyBzb21lIGluY29tcGF0aWJpbGllcy4KKy8vIC0gaXNfdHJpdmlhbGx5XyogZG9lc24ndCB3b3JrOiBodHRwczovL2xsdm0ub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTI3NTM4CisvLyBUT0RPKGRhbmFraik6IFJlbW92ZSB0aGlzIHdoZW4gYW5kcm9pZCBidWlsZGVycyBhcmUgYWxsIHVzaW5nIGEgbmV3ZXIgdmVyc2lvbgorLy8gb2YgZ2NjLCBvciB0aGUgYW5kcm9pZCBuZGsgaXMgdXBkYXRlZCB0byBhIG5ld2VyIGxpYmMrKyB0aGF0IHdvcmtzIHdpdGggb2xkZXIKKy8vIGdjYyB2ZXJzaW9ucy4KKyNpZiAhZGVmaW5lZChfX2NsYW5nX18pICYmIGRlZmluZWQoX0xJQkNQUF9WRVJTSU9OKQorI2RlZmluZSBDUl9VU0VfRkFMTEJBQ0tTX0ZPUl9HQ0NfV0lUSF9MSUJDWFgKKyNlbmRpZgorCituYW1lc3BhY2UgYmFzZSB7CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IGlzX25vbl9jb25zdF9yZWZlcmVuY2UgOiBzdGQ6OmZhbHNlX3R5cGUge307Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBpc19ub25fY29uc3RfcmVmZXJlbmNlPFQmPiA6IHN0ZDo6dHJ1ZV90eXBlIHt9OwordGVtcGxhdGUgPGNsYXNzIFQ+CitzdHJ1Y3QgaXNfbm9uX2NvbnN0X3JlZmVyZW5jZTxjb25zdCBUJj4gOiBzdGQ6OmZhbHNlX3R5cGUge307CisKKy8vIGlzX2Fzc2lnbmFibGUKKworbmFtZXNwYWNlIGludGVybmFsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0LCB0eXBlbmFtZSBTZWNvbmQ+CitzdHJ1Y3QgU2VsZWN0U2Vjb25kIHsKKyAgdXNpbmcgdHlwZSA9IFNlY29uZDsKK307CisKK3N0cnVjdCBBbnkgeworICBBbnkoLi4uKTsKK307CisKKy8vIFRydWUgY2FzZTogSWYgfEx2YWx1ZXwgY2FuIGJlIGFzc2lnbmVkIHRvIGZyb20gfFJ2YWx1ZXwsIHRoZW4gdGhlIHJldHVybgorLy8gdmFsdWUgaXMgYSB0cnVlX3R5cGUuCit0ZW1wbGF0ZSA8Y2xhc3MgTHZhbHVlLCBjbGFzcyBSdmFsdWU+Cit0eXBlbmFtZSBpbnRlcm5hbDo6U2VsZWN0U2Vjb25kPAorICAgIGRlY2x0eXBlKChzdGQ6OmRlY2x2YWw8THZhbHVlPigpID0gc3RkOjpkZWNsdmFsPFJ2YWx1ZT4oKSkpLAorICAgIHN0ZDo6dHJ1ZV90eXBlPjo6dHlwZQorSXNBc3NpZ25hYmxlVGVzdChMdmFsdWUmJiwgUnZhbHVlJiYpOworCisvLyBGYWxzZSBjYXNlOiBPdGhlcndpc2UgdGhlIHJldHVybiB2YWx1ZSBpcyBhIGZhbHNlX3R5cGUuCit0ZW1wbGF0ZSA8Y2xhc3MgUnZhbHVlPgorc3RkOjpmYWxzZV90eXBlIElzQXNzaWduYWJsZVRlc3QoaW50ZXJuYWw6OkFueSwgUnZhbHVlJiYpOworCisvLyBEZWZhdWx0IGNhc2U6IE5laXRoZXIgTHZhbHVlIG5vciBSdmFsdWUgaXMgdm9pZC4gVXNlcyBJc0Fzc2lnbmFibGVUZXN0IHRvCisvLyBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgSXNBc3NpZ25hYmxlSW1wbC4KK3RlbXBsYXRlIDxjbGFzcyBMdmFsdWUsCisgICAgICAgICAgY2xhc3MgUnZhbHVlLAorICAgICAgICAgIGJvb2wgPSBzdGQ6OmlzX3ZvaWQ8THZhbHVlPjo6dmFsdWUgfHwgc3RkOjppc192b2lkPFJ2YWx1ZT46OnZhbHVlPgorc3RydWN0IElzQXNzaWduYWJsZUltcGwKKyAgICA6IHB1YmxpYyBzdGQ6OmNvbW1vbl90eXBlPGRlY2x0eXBlKAorICAgICAgICAgIGludGVybmFsOjpJc0Fzc2lnbmFibGVUZXN0KHN0ZDo6ZGVjbHZhbDxMdmFsdWU+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpkZWNsdmFsPFJ2YWx1ZT4oKSkpPjo6dHlwZSB7fTsKKworLy8gVm9pZCBjYXNlOiBFaXRoZXIgTHZhbHVlIG9yIFJ2YWx1ZSBpcyB2b2lkLiBUaGVuIHRoZSB0eXBlIG9mIElzQXNzaWduYWJsZVRlc3QKKy8vIGlzIGZhbHNlX3R5cGUuCit0ZW1wbGF0ZSA8Y2xhc3MgTHZhbHVlLCBjbGFzcyBSdmFsdWU+CitzdHJ1Y3QgSXNBc3NpZ25hYmxlSW1wbDxMdmFsdWUsIFJ2YWx1ZSwgdHJ1ZT4gOiBwdWJsaWMgc3RkOjpmYWxzZV90eXBlIHt9OworCisvLyBVc2VzIGV4cHJlc3Npb24gU0ZJTkFFIHRvIGRldGVjdCB3aGV0aGVyIHVzaW5nIG9wZXJhdG9yPDwgd291bGQgd29yay4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSA9IHZvaWQ+CitzdHJ1Y3QgU3VwcG9ydHNPc3RyZWFtT3BlcmF0b3IgOiBzdGQ6OmZhbHNlX3R5cGUge307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBTdXBwb3J0c09zdHJlYW1PcGVyYXRvcjxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2x0eXBlKHZvaWQoc3RkOjpkZWNsdmFsPHN0ZDo6b3N0cmVhbSY+KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjbHZhbDxUPigpKSk+CisgICAgOiBzdGQ6OnRydWVfdHlwZSB7fTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIFRPRE8oY3JidWcuY29tLzU1NDI5Myk6IFJlbW92ZSB0aGlzIHdoZW4gYWxsIHBsYXRmb3JtcyBoYXZlIHRoaXMgaW4gdGhlIHN0ZAorLy8gbmFtZXNwYWNlLgordGVtcGxhdGUgPGNsYXNzIEx2YWx1ZSwgY2xhc3MgUnZhbHVlPgorc3RydWN0IGlzX2Fzc2lnbmFibGUgOiBwdWJsaWMgaW50ZXJuYWw6OklzQXNzaWduYWJsZUltcGw8THZhbHVlLCBSdmFsdWU+IHt9OworCisvLyBpc19jb3B5X2Fzc2lnbmFibGUgaXMgdHJ1ZSBpZiBhIFQgY29uc3QmIGlzIGFzc2lnbmFibGUgdG8gYSBUJi4KKy8vIFRPRE8oY3JidWcuY29tLzU1NDI5Myk6IFJlbW92ZSB0aGlzIHdoZW4gYWxsIHBsYXRmb3JtcyBoYXZlIHRoaXMgaW4gdGhlIHN0ZAorLy8gbmFtZXNwYWNlLgordGVtcGxhdGUgPGNsYXNzIFQ+CitzdHJ1Y3QgaXNfY29weV9hc3NpZ25hYmxlCisgICAgOiBwdWJsaWMgaXNfYXNzaWduYWJsZTx0eXBlbmFtZSBzdGQ6OmFkZF9sdmFsdWVfcmVmZXJlbmNlPFQ+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjphZGRfbHZhbHVlX3JlZmVyZW5jZTwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmFkZF9jb25zdDxUPjo6dHlwZT46OnR5cGU+IHt9OworCisvLyBpc19tb3ZlX2Fzc2lnbmFibGUgaXMgdHJ1ZSBpZiBhIFQmJiBpcyBhc3NpZ25hYmxlIHRvIGEgVCYuCisvLyBUT0RPKGNyYnVnLmNvbS81NTQyOTMpOiBSZW1vdmUgdGhpcyB3aGVuIGFsbCBwbGF0Zm9ybXMgaGF2ZSB0aGlzIGluIHRoZSBzdGQKKy8vIG5hbWVzcGFjZS4KK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IGlzX21vdmVfYXNzaWduYWJsZQorICAgIDogcHVibGljIGlzX2Fzc2lnbmFibGU8dHlwZW5hbWUgc3RkOjphZGRfbHZhbHVlX3JlZmVyZW5jZTxUPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIHN0ZDo6YWRkX3J2YWx1ZV9yZWZlcmVuY2U8VD46OnR5cGU+IHsKK307CisKKy8vIHVuZGVybHlpbmdfdHlwZSBwcm9kdWNlcyB0aGUgaW50ZWdlciB0eXBlIGJhY2tpbmcgYW4gZW51bSB0eXBlLgorLy8gVE9ETyhjcmJ1Zy5jb20vNTU0MjkzKTogUmVtb3ZlIHRoaXMgd2hlbiBhbGwgcGxhdGZvcm1zIGhhdmUgdGhpcyBpbiB0aGUgc3RkCisvLyBuYW1lc3BhY2UuCisjaWYgZGVmaW5lZChDUl9VU0VfRkFMTEJBQ0tTX0ZPUl9PTERfR0xJQkNYWCkKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IHVuZGVybHlpbmdfdHlwZSB7CisgIHVzaW5nIHR5cGUgPSBfX3VuZGVybHlpbmdfdHlwZShUKTsKK307CisjZWxzZQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit1c2luZyB1bmRlcmx5aW5nX3R5cGUgPSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxUPjsKKyNlbmRpZgorCisvLyBUT0RPKGNyYnVnLmNvbS81NTQyOTMpOiBSZW1vdmUgdGhpcyB3aGVuIGFsbCBwbGF0Zm9ybXMgaGF2ZSB0aGlzIGluIHRoZSBzdGQKKy8vIG5hbWVzcGFjZS4KKyNpZiBkZWZpbmVkKENSX1VTRV9GQUxMQkFDS1NfRk9SX09MRF9HTElCQ1hYKQordGVtcGxhdGUgPGNsYXNzIFQ+Cit1c2luZyBpc190cml2aWFsbHlfZGVzdHJ1Y3RpYmxlID0gc3RkOjpoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPFQ+OworI2Vsc2UKK3RlbXBsYXRlIDxjbGFzcyBUPgordXNpbmcgaXNfdHJpdmlhbGx5X2Rlc3RydWN0aWJsZSA9IHN0ZDo6aXNfdHJpdmlhbGx5X2Rlc3RydWN0aWJsZTxUPjsKKyNlbmRpZgorCisvLyBpc190cml2aWFsbHlfY29weWFibGUgaXMgZXNwZWNpYWxseSBoYXJkIHRvIGdldCByaWdodC4KKy8vIC0gT2xkZXIgdmVyc2lvbnMgb2YgbGlic3RkYysrIHdpbGwgZmFpbCB0byBoYXZlIGl0IGxpa2UgdGhleSBkbyBmb3Igb3RoZXIKKy8vICAgdHlwZSB0cmFpdHMuIEluIHRoaXMgY2FzZSB3ZSBzaG91bGQgcHJvdmlkZSBpdCBiYXNlZCBvbiBjb21waWxlcgorLy8gICBpbnRyaW5zaWNzLiBUaGlzIGlzIGNvdmVyZWQgYnkgdGhlIENSX1VTRV9GQUxMQkFDS1NfRk9SX09MRF9HTElCQ1hYIGRlZmluZS4KKy8vIC0gQW4gZXhwZXJpbWVudGFsIHJlbGVhc2Ugb2YgZ2NjIGluY2x1ZGVzIG1vc3Qgb2YgdHlwZV90cmFpdHMgYnV0IG1pc3NlcworLy8gICBpc190cml2aWFsbHlfY29weWFibGUsIHNvIHdlIHN0aWxsIGhhdmUgdG8gYXZvaWQgdXNpbmcgbGlic3RkYysrIGluIHRoaXMKKy8vICAgY2FzZSwgd2hpY2ggaXMgY292ZXJlZCBieSBDUl9VU0VfRkFMTEJBQ0tTX0ZPUl9PTERfRVhQRVJJTUVOVEFMX0dMSUJDWFguCisvLyAtIFdoZW4gY29tcGlsaW5nIGxpYmMrKyBmcm9tIGJlZm9yZSByMjM5NjUzLCB3aXRoIGEgZ2NjIGNvbXBpbGVyLCB0aGUKKy8vICAgc3RkOjppc190cml2aWFsbHlfY29weWFibGUgY2FuIGZhaWwuIFNvIHdlIG5lZWQgdG8gd29yayBhcm91bmQgdGhhdCBieSBub3QKKy8vICAgdXNpbmcgdGhlIG9uZSBpbiBsaWJjKysgaW4gdGhpcyBjYXNlLiBUaGlzIGlzIGNvdmVyZWQgYnkgdGhlCisvLyAgIENSX1VTRV9GQUxMQkFDS1NfRk9SX0dDQ19XSVRIX0xJQkNYWCBkZWZpbmUsIGFuZCBpcyBkaXNjdXNzZWQgaW4KKy8vICAgaHR0cHM6Ly9sbHZtLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzUzOCNjMSB3aGVyZSB0aGV5IHBvaW50IG91dCB0aGF0CisvLyAgIGluIGxpYmMrKydzIGNvbW1pdCByMjM5NjUzIHRoaXMgaXMgZml4ZWQgYnkgbGliYysrIGNoZWNraW5nIGZvciBnY2MgNS4xLgorLy8gLSBJbiBib3RoIG9mIHRoZSBhYm92ZSBjYXNlcyB3ZSBhcmUgdXNpbmcgdGhlIGdjYyBjb21waWxlci4gV2hlbiBkZWZpbmluZworLy8gICB0aGlzIG91cnNlbHZlcyBvbiBjb21waWxlciBpbnRyaW5zaWNzLCB0aGUgX19pc190cml2aWFsbHlfY29weWFibGUoKQorLy8gICBpbnRyaW5zaWMgaXMgbm90IGF2YWlsYWJsZSBvbiBnY2MgYmVmb3JlIHZlcnNpb24gNS4xIChzZWUgdGhlIGRpc2N1c3Npb24gaW4KKy8vICAgaHR0cHM6Ly9sbHZtLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yNzUzOCNjMSBhZ2FpbiksIHNvIHdlIG11c3QgY2hlY2sgZm9yCisvLyAgIHRoYXQgdmVyc2lvbi4KKy8vIC0gV2hlbiBfX2lzX3RyaXZpYWxseV9jb3B5YWJsZSgpIGlzIG5vdCBhdmFpbGFibGUgYmVjYXVzZSB3ZSBhcmUgb24gZ2NjIG9sZGVyCisvLyAgIHRoYW4gNS4xLCB3ZSBuZWVkIHRvIGZhbGwgYmFjayB0byBzb21ldGhpbmcsIHNvIHdlIHVzZSBfX2hhc190cml2aWFsX2NvcHkoKQorLy8gICBpbnN0ZWFkIGJhc2VkIG9uIHdoYXQgd2FzIGRvbmUgb25lLW9mZiBpbiBiaXRfY2FzdCgpIHByZXZpb3VzbHkuCisKKy8vIFRPRE8oY3JidWcuY29tLzU1NDI5Myk6IFJlbW92ZSB0aGlzIHdoZW4gYWxsIHBsYXRmb3JtcyBoYXZlIHRoaXMgaW4gdGhlIHN0ZAorLy8gbmFtZXNwYWNlIGFuZCBpdCB3b3JrcyB3aXRoIGdjYyBhcyBuZWVkZWQuCisjaWYgZGVmaW5lZChDUl9VU0VfRkFMTEJBQ0tTX0ZPUl9PTERfR0xJQkNYWCkgfHwgICAgICAgICAgICAgIFwKKyAgICBkZWZpbmVkKENSX1VTRV9GQUxMQkFDS1NfRk9SX09MRF9FWFBFUklNRU5UQUxfR0xJQkNYWCkgfHwgXAorICAgIGRlZmluZWQoQ1JfVVNFX0ZBTExCQUNLU19GT1JfR0NDX1dJVEhfTElCQ1hYKQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaXNfdHJpdmlhbGx5X2NvcHlhYmxlIHsKKy8vIFRPRE8oZGFuYWtqKTogUmVtb3ZlIHRoaXMgd2hlbiBhbmRyb2lkIGJ1aWxkZXJzIGFyZSBhbGwgdXNpbmcgYSBuZXdlciB2ZXJzaW9uCisvLyBvZiBnY2MsIG9yIHRoZSBhbmRyb2lkIG5kayBpcyB1cGRhdGVkIHRvIGEgbmV3ZXIgbGliYysrIHRoYXQgZG9lcyB0aGlzIGZvcgorLy8gdXMuCisjaWYgX0dOVUNfVkVSID49IDUwMQorICBzdGF0aWMgY29uc3RleHByIGJvb2wgdmFsdWUgPSBfX2lzX3RyaXZpYWxseV9jb3B5YWJsZShUKTsKKyNlbHNlCisgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCB2YWx1ZSA9IF9faGFzX3RyaXZpYWxfY29weShUKTsKKyNlbmRpZgorfTsKKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3VzaW5nIGlzX3RyaXZpYWxseV9jb3B5YWJsZSA9IHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlPFQ+OworI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBiYXNlCisKKyN1bmRlZiBDUl9VU0VfRkFMTEJBQ0tTX0ZPUl9PTERfR0xJQkNYWAorI3VuZGVmIENSX1VTRV9GQUxMQkFDS1NfRk9SX0dDQ19XSVRIX0xJQkNYWAorI3VuZGVmIENSX1VTRV9GQUxMQkFDS1NfRk9SX09MRF9FWFBFUklNRU5UQUxfR0xJQkNYWAorCisjZW5kaWYgIC8vIEJBU0VfVEVNUExBVEVfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvYnVpbGQvYnVpbGRfY29uZmlnLmggYi90aGlyZF9wYXJ0eS9idWlsZC9idWlsZF9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGM2NmUwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvYnVpbGQvYnVpbGRfY29uZmlnLmgKQEAgLTAsMCArMSwxOTQgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRoaXMgZmlsZSBhZGRzIGRlZmluZXMgYWJvdXQgdGhlIHBsYXRmb3JtIHdlJ3JlIGN1cnJlbnRseSBidWlsZGluZyBvbi4KKy8vICBPcGVyYXRpbmcgU3lzdGVtOgorLy8gICAgT1NfV0lOIC8gT1NfTUFDT1NYIC8gT1NfTElOVVggLyBPU19QT1NJWCAoTUFDT1NYIG9yIExJTlVYKSAvCisvLyAgICBPU19OQUNMIChOQUNMX1NGSSBvciBOQUNMX05PTlNGSSkgLyBPU19OQUNMX1NGSSAvIE9TX05BQ0xfTk9OU0ZJCisvLyAgICBPU19DSFJPTUVPUyBpcyBzZXQgYnkgdGhlIGJ1aWxkIHN5c3RlbQorLy8gIENvbXBpbGVyOgorLy8gICAgQ09NUElMRVJfTVNWQyAvIENPTVBJTEVSX0dDQworLy8gIFByb2Nlc3NvcjoKKy8vICAgIEFSQ0hfQ1BVX1g4NiAvIEFSQ0hfQ1BVX1g4Nl82NCAvIEFSQ0hfQ1BVX1g4Nl9GQU1JTFkgKFg4NiBvciBYODZfNjQpCisvLyAgICBBUkNIX0NQVV8zMl9CSVRTIC8gQVJDSF9DUFVfNjRfQklUUworCisjaWZuZGVmIEJVSUxEX0JVSUxEX0NPTkZJR19IXworI2RlZmluZSBCVUlMRF9CVUlMRF9DT05GSUdfSF8KKworLy8gQSBzZXQgb2YgbWFjcm9zIHRvIHVzZSBmb3IgcGxhdGZvcm0gZGV0ZWN0aW9uLgorI2lmIGRlZmluZWQoX19uYXRpdmVfY2xpZW50X18pCisvLyBfX25hdGl2ZV9jbGllbnRfXyBtdXN0IGJlIGZpcnN0LCBzbyB0aGF0IG90aGVyIE9TXyBkZWZpbmVzIGFyZSBub3Qgc2V0LgorI2RlZmluZSBPU19OQUNMIDEKKy8vIE9TX05BQ0wgY29tZXMgaW4gdHdvIHNhbmRib3hpbmcgdGVjaG5vbG9neSBmbGF2b3JzLCBTRkkgb3IgTm9uLVNGSS4KKy8vIFBOYUNsIHRvb2xjaGFpbiBkZWZpbmVzIF9fbmF0aXZlX2NsaWVudF9ub25zZmlfXyBtYWNybyBpbiBOb24tU0ZJIGJ1aWxkCisvLyBtb2RlLCB3aGlsZSBpdCBkb2VzIG5vdCBpbiBTRkkgYnVpbGQgbW9kZS4KKyNpZiBkZWZpbmVkKF9fbmF0aXZlX2NsaWVudF9ub25zZmlfXykKKyNkZWZpbmUgT1NfTkFDTF9OT05TRkkKKyNlbHNlCisjZGVmaW5lIE9TX05BQ0xfU0ZJCisjZW5kaWYKKyNlbGlmIGRlZmluZWQoQU5EUk9JRCkKKyNkZWZpbmUgT1NfQU5EUk9JRCAxCisjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKKy8vIG9ubHkgaW5jbHVkZSBUYXJnZXRDb25kaXRpb25zIGFmdGVyIHRlc3RpbmcgQU5EUk9JRCBhcyBzb21lIGFuZHJvaWQgYnVpbGRzCisvLyBvbiBtYWMgZG9uJ3QgaGF2ZSB0aGlzIGhlYWRlciBhdmFpbGFibGUgYW5kIGl0J3Mgbm90IG5lZWRlZCB1bmxlc3MgdGhlIHRhcmdldAorLy8gaXMgcmVhbGx5IG1hYy9pb3MuCisjaW5jbHVkZSA8VGFyZ2V0Q29uZGl0aW9uYWxzLmg+CisjZGVmaW5lIE9TX01BQ09TWCAxCisjaWYgZGVmaW5lZChUQVJHRVRfT1NfSVBIT05FKSAmJiBUQVJHRVRfT1NfSVBIT05FCisjZGVmaW5lIE9TX0lPUyAxCisjZW5kaWYgIC8vIGRlZmluZWQoVEFSR0VUX09TX0lQSE9ORSkgJiYgVEFSR0VUX09TX0lQSE9ORQorI2VsaWYgZGVmaW5lZChfX2xpbnV4X18pCisjZGVmaW5lIE9TX0xJTlVYIDEKKy8vIGluY2x1ZGUgYSBzeXN0ZW0gaGVhZGVyIHRvIHB1bGwgaW4gZmVhdHVyZXMuaCBmb3IgZ2xpYmMvdWNsaWJjIG1hY3Jvcy4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpZiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgIWRlZmluZWQoX19VQ0xJQkNfXykKKy8vIHdlIHJlYWxseSBhcmUgdXNpbmcgZ2xpYmMsIG5vdCB1Q2xpYmMgcHJldGVuZGluZyB0byBiZSBnbGliYworI2RlZmluZSBMSUJDX0dMSUJDIDEKKyNlbmRpZgorI2VsaWYgZGVmaW5lZChfV0lOMzIpCisjZGVmaW5lIE9TX1dJTiAxCisjZWxpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKQorI2RlZmluZSBPU19GUkVFQlNEIDEKKyNlbGlmIGRlZmluZWQoX19OZXRCU0RfXykKKyNkZWZpbmUgT1NfTkVUQlNEIDEKKyNlbGlmIGRlZmluZWQoX19PcGVuQlNEX18pCisjZGVmaW5lIE9TX09QRU5CU0QgMQorI2VsaWYgZGVmaW5lZChfX3N1bikKKyNkZWZpbmUgT1NfU09MQVJJUyAxCisjZWxpZiBkZWZpbmVkKF9fUU5YTlRPX18pCisjZGVmaW5lIE9TX1FOWCAxCisjZWxzZQorI2Vycm9yIFBsZWFzZSBhZGQgc3VwcG9ydCBmb3IgeW91ciBwbGF0Zm9ybSBpbiBidWlsZC9idWlsZF9jb25maWcuaAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFVTRV9PUEVOU1NMX0NFUlRTKSAmJiBkZWZpbmVkKFVTRV9OU1NfQ0VSVFMpCisjZXJyb3IgQ2Fubm90IHVzZSBib3RoIE9wZW5TU0wgYW5kIE5TUyBmb3IgY2VydGlmaWNhdGVzCisjZW5kaWYKKworLy8gRm9yIGFjY2VzcyB0byBzdGFuZGFyZCBCU0QgZmVhdHVyZXMsIHVzZSBPU19CU0QgaW5zdGVhZCBvZiBhCisvLyBtb3JlIHNwZWNpZmljIG1hY3JvLgorI2lmIGRlZmluZWQoT1NfRlJFRUJTRCkgfHwgZGVmaW5lZChPU19ORVRCU0QpIHx8IGRlZmluZWQoT1NfT1BFTkJTRCkKKyNkZWZpbmUgT1NfQlNEIDEKKyNlbmRpZgorCisvLyBGb3IgYWNjZXNzIHRvIHN0YW5kYXJkIFBPU0lYaXNoIGZlYXR1cmVzLCB1c2UgT1NfUE9TSVggaW5zdGVhZCBvZiBhCisvLyBtb3JlIHNwZWNpZmljIG1hY3JvLgorI2lmIGRlZmluZWQoT1NfTUFDT1NYKSB8fCBkZWZpbmVkKE9TX0xJTlVYKSB8fCBkZWZpbmVkKE9TX0ZSRUVCU0QpIHx8ICAgIFwKKyAgICBkZWZpbmVkKE9TX05FVEJTRCkgfHwgZGVmaW5lZChPU19PUEVOQlNEKSB8fCBkZWZpbmVkKE9TX1NPTEFSSVMpIHx8ICBcCisgICAgZGVmaW5lZChPU19BTkRST0lEKSB8fCBkZWZpbmVkKE9TX09QRU5CU0QpIHx8IGRlZmluZWQoT1NfU09MQVJJUykgfHwgXAorICAgIGRlZmluZWQoT1NfQU5EUk9JRCkgfHwgZGVmaW5lZChPU19OQUNMKSB8fCBkZWZpbmVkKE9TX1FOWCkKKyNkZWZpbmUgT1NfUE9TSVggMQorI2VuZGlmCisKKy8vIFVzZSB0Y21hbGxvYworI2lmIChkZWZpbmVkKE9TX1dJTikgfHwgZGVmaW5lZChPU19MSU5VWCkgfHwgZGVmaW5lZChPU19BTkRST0lEKSkgJiYgXAorICAgICFkZWZpbmVkKE5PX1RDTUFMTE9DKQorI2RlZmluZSBVU0VfVENNQUxMT0MgMQorI2VuZGlmCisKKy8vIENvbXBpbGVyIGRldGVjdGlvbi4KKyNpZiBkZWZpbmVkKF9fR05VQ19fKQorI2RlZmluZSBDT01QSUxFUl9HQ0MgMQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgQ09NUElMRVJfTVNWQyAxCisjZWxzZQorI2Vycm9yIFBsZWFzZSBhZGQgc3VwcG9ydCBmb3IgeW91ciBjb21waWxlciBpbiBidWlsZC9idWlsZF9jb25maWcuaAorI2VuZGlmCisKKy8vIFByb2Nlc3NvciBhcmNoaXRlY3R1cmUgZGV0ZWN0aW9uLiAgRm9yIG1vcmUgaW5mbyBvbiB3aGF0J3MgZGVmaW5lZCwgc2VlOgorLy8gICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvYjAwODRrYXkuYXNweAorLy8gICBodHRwOi8vd3d3LmFnbmVyLm9yZy9vcHRpbWl6ZS9jYWxsaW5nX2NvbnZlbnRpb25zLnBkZgorLy8gICBvciB3aXRoIGdjYywgcnVuOiAiZWNobyB8IGdjYyAtRSAtZE0gLSIKKyNpZiBkZWZpbmVkKF9NX1g2NCkgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorI2RlZmluZSBBUkNIX0NQVV9YODZfRkFNSUxZIDEKKyNkZWZpbmUgQVJDSF9DUFVfWDg2XzY0IDEKKyNkZWZpbmUgQVJDSF9DUFVfNjRfQklUUyAxCisjZGVmaW5lIEFSQ0hfQ1BVX0xJVFRMRV9FTkRJQU4gMQorI2VsaWYgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKQorI2RlZmluZSBBUkNIX0NQVV9YODZfRkFNSUxZIDEKKyNkZWZpbmUgQVJDSF9DUFVfWDg2IDEKKyNkZWZpbmUgQVJDSF9DUFVfMzJfQklUUyAxCisjZGVmaW5lIEFSQ0hfQ1BVX0xJVFRMRV9FTkRJQU4gMQorI2VsaWYgZGVmaW5lZChfX3MzOTB4X18pCisjZGVmaW5lIEFSQ0hfQ1BVX1MzOTBfRkFNSUxZIDEKKyNkZWZpbmUgQVJDSF9DUFVfUzM5MFggMQorI2RlZmluZSBBUkNIX0NQVV82NF9CSVRTIDEKKyNkZWZpbmUgQVJDSF9DUFVfQklHX0VORElBTiAxCisjZWxpZiBkZWZpbmVkKF9fczM5MF9fKQorI2RlZmluZSBBUkNIX0NQVV9TMzkwX0ZBTUlMWSAxCisjZGVmaW5lIEFSQ0hfQ1BVX1MzOTAgMQorI2RlZmluZSBBUkNIX0NQVV8zMV9CSVRTIDEKKyNkZWZpbmUgQVJDSF9DUFVfQklHX0VORElBTiAxCisjZWxpZiBkZWZpbmVkKF9fUFBDNjRfXykgJiYgZGVmaW5lZChfX0JJR19FTkRJQU5fXykKKyNkZWZpbmUgQVJDSF9DUFVfUFBDNjRfRkFNSUxZIDEKKyNkZWZpbmUgQVJDSF9DUFVfUFBDNjQgMQorI2RlZmluZSBBUkNIX0NQVV82NF9CSVRTIDEKKyNkZWZpbmUgQVJDSF9DUFVfQklHX0VORElBTiAxCisjZWxpZiBkZWZpbmVkKF9fUFBDNjRfXykgJiYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fXykKKyNkZWZpbmUgQVJDSF9DUFVfUFBDNjRfRkFNSUxZIDEKKyNkZWZpbmUgQVJDSF9DUFVfUFBDNjQgMQorI2RlZmluZSBBUkNIX0NQVV82NF9CSVRTIDEKKyNkZWZpbmUgQVJDSF9DUFVfTElUVExFX0VORElBTiAxCisjZWxpZiBkZWZpbmVkKF9fUFBDX18pCisjZGVmaW5lIEFSQ0hfQ1BVX1BQQ19GQU1JTFkgMQorI2RlZmluZSBBUkNIX0NQVV9QUEMgMQorI2RlZmluZSBBUkNIX0NQVV8zMl9CSVRTIDEKKyNkZWZpbmUgQVJDSF9DUFVfQklHX0VORElBTiAxCisjZWxpZiBkZWZpbmVkKF9fQVJNRUxfXykKKyNkZWZpbmUgQVJDSF9DUFVfQVJNX0ZBTUlMWSAxCisjZGVmaW5lIEFSQ0hfQ1BVX0FSTUVMIDEKKyNkZWZpbmUgQVJDSF9DUFVfMzJfQklUUyAxCisjZGVmaW5lIEFSQ0hfQ1BVX0xJVFRMRV9FTkRJQU4gMQorI2VsaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKKyNkZWZpbmUgQVJDSF9DUFVfQVJNX0ZBTUlMWSAxCisjZGVmaW5lIEFSQ0hfQ1BVX0FSTTY0IDEKKyNkZWZpbmUgQVJDSF9DUFVfNjRfQklUUyAxCisjZGVmaW5lIEFSQ0hfQ1BVX0xJVFRMRV9FTkRJQU4gMQorI2VsaWYgZGVmaW5lZChfX3BuYWNsX18pCisjZGVmaW5lIEFSQ0hfQ1BVXzMyX0JJVFMgMQorI2RlZmluZSBBUkNIX0NQVV9MSVRUTEVfRU5ESUFOIDEKKyNlbGlmIGRlZmluZWQoX19NSVBTRUxfXykKKyNpZiBkZWZpbmVkKF9fTFA2NF9fKQorI2RlZmluZSBBUkNIX0NQVV9NSVBTX0ZBTUlMWSAxCisjZGVmaW5lIEFSQ0hfQ1BVX01JUFM2NEVMIDEKKyNkZWZpbmUgQVJDSF9DUFVfNjRfQklUUyAxCisjZGVmaW5lIEFSQ0hfQ1BVX0xJVFRMRV9FTkRJQU4gMQorI2Vsc2UKKyNkZWZpbmUgQVJDSF9DUFVfTUlQU19GQU1JTFkgMQorI2RlZmluZSBBUkNIX0NQVV9NSVBTRUwgMQorI2RlZmluZSBBUkNIX0NQVV8zMl9CSVRTIDEKKyNkZWZpbmUgQVJDSF9DUFVfTElUVExFX0VORElBTiAxCisjZW5kaWYKKyNlbHNlCisjZXJyb3IgUGxlYXNlIGFkZCBzdXBwb3J0IGZvciB5b3VyIGFyY2hpdGVjdHVyZSBpbiBidWlsZC9idWlsZF9jb25maWcuaAorI2VuZGlmCisKKy8vIFR5cGUgZGV0ZWN0aW9uIGZvciB3Y2hhcl90LgorI2lmIGRlZmluZWQoT1NfV0lOKQorI2RlZmluZSBXQ0hBUl9UX0lTX1VURjE2CisjZWxpZiBkZWZpbmVkKE9TX1BPU0lYKSAmJiBkZWZpbmVkKENPTVBJTEVSX0dDQykgJiYgZGVmaW5lZChfX1dDSEFSX01BWF9fKSAmJiBcCisgICAgKF9fV0NIQVJfTUFYX18gPT0gMHg3ZmZmZmZmZiB8fCBfX1dDSEFSX01BWF9fID09IDB4ZmZmZmZmZmYpCisjZGVmaW5lIFdDSEFSX1RfSVNfVVRGMzIKKyNlbGlmIGRlZmluZWQoT1NfUE9TSVgpICYmIGRlZmluZWQoQ09NUElMRVJfR0NDKSAmJiBkZWZpbmVkKF9fV0NIQVJfTUFYX18pICYmIFwKKyAgICAoX19XQ0hBUl9NQVhfXyA9PSAweDdmZmYgfHwgX19XQ0hBUl9NQVhfXyA9PSAweGZmZmYpCisvLyBPbiBQb3NpeCwgd2UnbGwgZGV0ZWN0IHNob3J0IHdjaGFyX3QsIGJ1dCBwcm9qZWN0cyBhcmVuJ3QgZ3VhcmFudGVlZCB0bworLy8gY29tcGlsZSBpbiB0aGlzIG1vZGUgKGluIHBhcnRpY3VsYXIsIENocm9tZSBkb2Vzbid0KS4gVGhpcyBpcyBpbnRlbmRlZCBmb3IKKy8vIG90aGVyIHByb2plY3RzIHVzaW5nIGJhc2Ugd2hvIG1hbmFnZSB0aGVpciBvd24gZGVwZW5kZW5jaWVzIGFuZCBtYWtlIHN1cmUKKy8vIHNob3J0IHdjaGFyIHdvcmtzIGZvciB0aGVtLgorI2RlZmluZSBXQ0hBUl9UX0lTX1VURjE2CisjZWxzZQorI2Vycm9yIFBsZWFzZSBhZGQgc3VwcG9ydCBmb3IgeW91ciBjb21waWxlciBpbiBidWlsZC9idWlsZF9jb25maWcuaAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKE9TX0FORFJPSUQpCisvLyBUaGUgY29tcGlsZXIgdGhpbmtzIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBhbmQgImNvbnN0IGNoYXIqIiBhcmUKKy8vIGVxdWl2YWxlbnQgdHlwZXMuCisjZGVmaW5lIFNURF9TVFJJTkdfSVRFUkFUT1JfSVNfQ0hBUl9QT0lOVEVSCisvLyBUaGUgY29tcGlsZXIgdGhpbmtzIGJhc2U6OnN0cmluZzE2Ojpjb25zdF9pdGVyYXRvciBhbmQgImNoYXIxNioiIGFyZQorLy8gZXF1aXZhbGVudCB0eXBlcy4KKyNkZWZpbmUgQkFTRV9TVFJJTkcxNl9JVEVSQVRPUl9JU19DSEFSMTZfUE9JTlRFUgorI2VuZGlmCisKKyNlbmRpZiAgLy8gQlVJTERfQlVJTERfQ09ORklHX0hfCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9ldS1zdHJpcC9SRUFETUUucGRmaXVtIGIvdGhpcmRfcGFydHkvZXUtc3RyaXAvUkVBRE1FLnBkZml1bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODQ5NzRkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZXUtc3RyaXAvUkVBRE1FLnBkZml1bQpAQCAtMCwwICsxLDI0IEBACitOYW1lOiBldS1zdHJpcAorVVJMOiBodHRwczovL3NvdXJjZXdhcmUub3JnL2VsZnV0aWxzLworVmVyc2lvbjogMC4xNTgKK1NlY3VyaXR5IENyaXRpY2FsOiBubworTGljZW5zZTogTEdQTCAzCitMaWNlbnNlIEZpbGU6IE5PVF9TSElQUEVECisKK0Rlc2NyaXB0aW9uOgorCitQYXRjaGVkIGV1LXN0cmlwIGZyb20gZWxmdXRpbHMuCisKK0J1aWxkIGluc3RydWN0aW9ucyAob24gVHJ1c3R5OyBub3RlIHRoYXQgdGhpcyB3aWxsIGJ1aWxkIHRoZQorVWJ1bnR1LXBhdGNoZWQgdmVyc2lvbiBvZiBlbGZ1dGlscyk6CiskIG1rZGlyIGVsZnV0aWxzCiskIGNkIGVsZnV0aWxzCiskIGFwdC1nZXQgc291cmNlIGVsZnV0aWxzCiskIGNkIGVsZnV0aWxzLTAuMTU4CitbIEVkaXQgbGliZWxmL2VsZl9lbmQuYyBhbmQgcmVtb3ZlIHRoZSBmcmVlKCkgb24gbGluZSAxNjQuIF0KKyQgLi9jb25maWd1cmUKKyQgbWFrZQorJCBnY2MgLXN0ZD1nbnU5OSAtV2FsbCAtV3NoYWRvdyAtV3VudXNlZCAtV2V4dHJhIC1mZ251ODktaW5saW5lCisgIC1XZm9ybWF0PTIgLVdlcnJvciAtZyAtTzIgLVdsLC1ycGF0aC1saW5rLGxpYmVsZjpsaWJkdyAtbyBldS1zdHJpcAorICBzcmMvc3RyaXAubyBsaWJlYmwvbGliZWJsLmEgbGliZWxmL2xpYmVsZi5hIGxpYi9saWJldS5hIC1sZGwKKyQgZXUtc3RyaXAgLi9ldS1zdHJpcCAgIyBLZWVwIHRoZSBiaW5hcnkgc21hbGwsIHBsZWFzZS4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2V1LXN0cmlwL2Jpbi9ldS1zdHJpcCBiL3RoaXJkX3BhcnR5L2V1LXN0cmlwL2Jpbi9ldS1zdHJpcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45OTRlMjI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZXUtc3RyaXAvYmluL2V1LXN0cmlwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlLzAwMDAtaW5jbHVkZS5wYXRjaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlLzAwMDAtaW5jbHVkZS5wYXRjaAppbmRleCBkNzQ3OGU3Li5kNmM4Mzc0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS8wMDAwLWluY2x1ZGUucGF0Y2gKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvMDAwMC1pbmNsdWRlLnBhdGNoCkBAIC0xLDI4ICsxLDYgQEAKLWRpZmYgLXJ1IGZyZWV0eXBlLTIuNi4xL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0bW9kdWxlLmggaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaAotLS0tIGZyZWV0eXBlLTIuNi4xL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0bW9kdWxlLmgJMjAxNS0xMS0wNSAxMzo1MjozNi43MzQ3MzMxODYgLTA4MDAKLSsrKyBpbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oCTIwMTUtMTEtMDUgMTM6NDQ6NTQuNDQ1NDc5ODIyIC0wODAwCi1AQCAtMSwzICsxLDIwIEBACi0rLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSsvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotKy8qICBmdG1vZHVsZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0rLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSsvKiAgICBGcmVlVHlwZSBtb2R1bGVzIHB1YmxpYyBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAqLwotKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0rLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSsvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0rLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLSsvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0rLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLSsvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0rLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSsKLSAvKgotICAqICBUaGlzIGZpbGUgcmVnaXN0ZXJzIHRoZSBGcmVlVHlwZSBtb2R1bGVzIGNvbXBpbGVkIGludG8gdGhlIGxpYnJhcnkuCi0gICoKLUBAIC0xMCwxNSArMjcsMTUgQEAKKy0tLSB0aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oCTIwMTctMDMtMDcgMjA6MTU6NTIuNzgxNjM2NTI0IC0wODAwCisrKysgdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaAkyMDE3LTAzLTIyIDIyOjU3OjU4LjUzNjIzMzA3MSAtMDcwMAorQEAgLTEwLDE1ICsxMCwxNSBAQAogICAqCiAgICovCiAgCkBAIC00Myw3ICsyMSw3IEBACiAgRlRfVVNFX01PRFVMRSggRlRfTW9kdWxlX0NsYXNzLCBwc2F1eF9tb2R1bGVfY2xhc3MgKQogIEZUX1VTRV9NT0RVTEUoIEZUX01vZHVsZV9DbGFzcywgcHNuYW1lc19tb2R1bGVfY2xhc3MgKQogIEZUX1VTRV9NT0RVTEUoIEZUX01vZHVsZV9DbGFzcywgcHNoaW50ZXJfbW9kdWxlX2NsYXNzICkKLUBAIC0yNyw2ICs0NCw2IEBACitAQCAtMjcsNiArMjcsNiBAQAogIEZUX1VTRV9NT0RVTEUoIEZUX1JlbmRlcmVyX0NsYXNzLCBmdF9zbW9vdGhfcmVuZGVyZXJfY2xhc3MgKQogIEZUX1VTRV9NT0RVTEUoIEZUX1JlbmRlcmVyX0NsYXNzLCBmdF9zbW9vdGhfbGNkX3JlbmRlcmVyX2NsYXNzICkKICBGVF9VU0VfTU9EVUxFKCBGVF9SZW5kZXJlcl9DbGFzcywgZnRfc21vb3RoX2xjZHZfcmVuZGVyZXJfY2xhc3MgKQpAQCAtNTEsMTAgKzI5LDkgQEAKICsvL0ZUX1VTRV9NT0RVTEUoIEZUX0RyaXZlcl9DbGFzc1JlYywgYmRmX2RyaXZlcl9jbGFzcyApCiAgCiAgLyogRU9GICovCi1kaWZmIC1ydSBmcmVldHlwZS0yLjYuMS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oIGluY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgKLS0tLSBmcmVldHlwZS0yLjYuMS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oCTIwMTUtMTEtMDUgMTM6NTI6MzYuNzM0NzMzMTg2IC0wODAwCi0rKysgaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaAkyMDE1LTExLTA1IDEzOjQ0OjU0LjQ0NTQ3OTgyMiAtMDgwMAotQEAgLTkyLDcgKzkyLDcgQEAKKy0tLSB0aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oCTIwMTctMDMtMDcgMjA6MTU6NTIuNzgxNjM2NTI0IC0wODAwCisrKysgdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaAkyMDE3LTAzLTIyIDIyOjU3OjU4LjUzMjIzMzA5NSAtMDcwMAorQEAgLTEyMiw3ICsxMjIsNyBAQAogICAgLyogVGhpcyBpcyBkb25lIHRvIGFsbG93IEZyZWVUeXBlIGNsaWVudHMgdG8gcnVuIHVubW9kaWZpZWQsIGZvcmNpbmcgICAgICovCiAgICAvKiB0aGVtIHRvIGRpc3BsYXkgbm9ybWFsIGdyYXktbGV2ZWwgYW50aS1hbGlhc2VkIGdseXBocy4gICAgICAgICAgICAgICAgKi8KICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjMsMTYgKzQwLDE2IEBACiAgCiAgCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUBAIC0xNjMsNyArMTYzLDcgQEAKK0BAIC0xOTMsNyArMTkzLDcgQEAKICAgIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgYGZlYXR1cmUnLiAgU2VlIGFsc28gICAqLwogICAgLyogICB0aGUgbWFjcm8gRlRfQ09ORklHX09QVElPTl9TWVNURU1fWkxJQiBiZWxvdy4gICAgICAgICAgICAgICAgICAgICAgICovCiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC0jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fVVNFX1pMSUIKLSsvLyNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9VU0VfWkxJQgorKyN1bmRlZiBGVF9DT05GSUdfT1BUSU9OX1VTRV9aTElCCiAgCiAgCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUBAIC0zMzYsNyArMzM2LDcgQEAKK0BAIC0zNjYsNyArMzY2LDcgQEAKICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgLyogICBOb3RlIHRoYXQgdGhlIGBGT05EJyByZXNvdXJjZSBpc24ndCBjaGVja2VkLiAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTgxLDcgKzU4LDcgQEAKICAKICAKICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotQEAgLTUxMiw3ICs1MTIsNyBAQAorQEAgLTU1Niw3ICs1NTYsNyBAQAogICAgLyogZW1iZWRkZWQgYml0bWFwcyBpbiBhbGwgZm9ybWF0cyB1c2luZyB0aGUgU0ZOVCBtb2R1bGUgKG5hbWVseSAgICAgICAgICovCiAgICAvKiBUcnVlVHlwZSAmIE9wZW5UeXBlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtOTAsNyArNjcsNyBAQAogIAogIAogICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1AQCAtNjgxLDcgKzY4MSw3IEBACitAQCAtNzA1LDcgKzcwNSw3IEBACiAgICAvKiBhbmQgYXZhciB0YWJsZXMpLiAgVGhpcyBoYXMgbWFueSBzaW1pbGFyaXRpZXMgdG8gVHlwZSAxIE11bHRpcGxlICAgICAgKi8KICAgIC8qIE1hc3RlcnMgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC05OSw3ICs3Niw3IEBACiAgCiAgCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUBAIC02ODksNyArNjg5LDcgQEAKK0BAIC03MTMsNyArNzEzLDcgQEAKICAgIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX0JERiBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHN1cHBvcnQgZm9yICAgICAgICAqLwogICAgLyogYW4gZW1iZWRkZWQgYEJERiAnIHRhYmxlIHdpdGhpbiBTRk5ULWJhc2VkIGJpdG1hcCBmb3JtYXRzLiAgICAgICAgICAgICovCiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEwOCw3ICs4NSw3IEBACiAgCiAgCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUBAIC03MjUsNyArNzI1LDcgQEAKK0BAIC03NjcsNyArNzY3LDcgQEAKICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgLyogVGhlIENoaW5lc2UgZm9udCBNaW5nVGlFRy1NZWRpdW0gKENOUyAxMTY0MyBjaGFyYWN0ZXIgc2V0KSBuZWVkcyAyNTYuICovCiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTExNyw0ICs5NCwzIEBACiAgCiAgCiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLU9ubHkgaW4gZnJlZXR5cGUtMi42LjEvaW5jbHVkZS9mcmVldHlwZTogZnRjaGFwdGVycy5oCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9SRUFETUUucGRmaXVtIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvUkVBRE1FLnBkZml1bQppbmRleCBmOGZhZDZmLi4zZTlhYTY5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9SRUFETUUucGRmaXVtCisrKyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL1JFQURNRS5wZGZpdW0KQEAgLTEsNiArMSw3IEBACiBOYW1lOiBGcmVlVHlwZQogVVJMOiBodHRwOi8vd3d3LmZyZWV0eXBlLm9yZy8KLVZlcnNpb246IDIuNi4xCitWZXJzaW9uOiBWRVItMi04LTEtMTQ1CitSZXZpc2lvbjogMmMwNDhhOGE2MjJlOWY0NGYyNTVhYTMzMTYwMjZmMTI0YWM5ZWNiYwogU2VjdXJpdHkgQ3JpdGljYWw6IHllcwogTGljZW5zZTogRnJlZVR5cGUgTGljZW5zZSAoRlRMKQogTGljZW5zZSBGaWxlOiBGVEwuVFhUCkBAIC0xMCwyNSArMTEsMTAgQEAKIAogTG9jYWwgTW9kaWZpY2F0aW9uczoKIAoraW5jbHVkZS9wc3RhYmxlcy5oOiBBIGNvcHkgb2YgZnJlZXR5cGUvc3JjL3BzbmFtZXMvcHN0YWJsZXMuaC4gIFRoaXMgZmlsZSBpcyBub3QKK3BhcnQgb2YgdGhlIHB1YmxpYyBGcmVldHlwZSBBUEksIGJ1dCBwZGZpdW0gbmVlZHMgaXQuICBTaW5jZSBpdCB3b24ndCBiZQorYXZpbGFibGUgd2hlbiBidWlsZGluZyB3aXRoIHRoZSBzeXN0ZW0gRnJlZXR5cGUsIHdlIHByb3ZpZGUgaXQgYXMgYSBjb252ZW5pZW5jZS4KKwogMDAwMC1pbmNsdWRlLnBhdGNoOiBNb2RpZmljYXRpb25zIHRvIGNvbmZpZ3VyYXRpb24gaGVhZGVyIGZpbGVzLgogCi1pbmNsdWRlL2ZyZWV0eXBlL2Z0Y2hhcGVycy5oIGlzIG5vdCBpbmNsdWRlZC4KLQotVGhlIGZvbGxvd2luZyBkaXJlY3RvcmllcyBpbiBzcmMvIGFyZSBub3QgaW5jbHVkZWQgZnJvbQotdXBzdHJlYW0gRnJlZVR5cGUgYXMgdGhleSBhcmUgbmV2ZXIgdXNlZDoKLQotYXV0b2ZpdAotYmRmCi1iemlwMgotY2FjaGUKLWd4dmFsaWQKLWd6aXAKLUphbWZpbGUKLWx6dwotb3R2YWxpZAotcGNmCi1wZnIKLXRvb2xzCi10eXBlNDIKLXdpbmZvbnRzCi0KK01vc3Qgb2YgdGhlIHVwZGF0aW5nIGNhbiBiZSBhdXRvbWF0ZWQgd2lsbCByb2xsLWZyZWV0eXBlLnNoLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS1jdXN0b20tY29uZmlnL2Z0bW9kdWxlLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlLWN1c3RvbS1jb25maWcvZnRtb2R1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDMxY2U2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS1jdXN0b20tY29uZmlnL2Z0bW9kdWxlLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqICBUaGlzIGZpbGUgcmVnaXN0ZXJzIHRoZSBGcmVlVHlwZSBtb2R1bGVzIGNvbXBpbGVkIGludG8gdGhlIGxpYnJhcnkuCisgKgorICogIElmIHlvdSB1c2UgR05VIG1ha2UsIHRoaXMgZmlsZSBJUyBOT1QgVVNFRCEgIEluc3RlYWQsIGl0IGlzIGNyZWF0ZWQgaW4KKyAqICB0aGUgb2JqZWN0cyBkaXJlY3RvcnkgKG5vcm1hbGx5IGA8dG9wZGlyPi9vYmpzLycpIGJhc2VkIG9uIGluZm9ybWF0aW9uCisgKiAgZnJvbSBgPHRvcGRpcj4vbW9kdWxlcy5jZmcnLgorICoKKyAqICBQbGVhc2UgcmVhZCBgZG9jcy9JTlNUQUxMLkFOWScgYW5kIGBkb2NzL0NVU1RPTUlaRScgaG93IHRvIGNvbXBpbGUKKyAqICBGcmVlVHlwZSB3aXRob3V0IEdOVSBtYWtlLgorICoKKyAqLworCisvL0ZUX1VTRV9NT0RVTEUoIEZUX01vZHVsZV9DbGFzcywgYXV0b2ZpdF9tb2R1bGVfY2xhc3MgKQorRlRfVVNFX01PRFVMRSggRlRfRHJpdmVyX0NsYXNzUmVjLCB0dF9kcml2ZXJfY2xhc3MgKQorRlRfVVNFX01PRFVMRSggRlRfRHJpdmVyX0NsYXNzUmVjLCB0MV9kcml2ZXJfY2xhc3MgKQorRlRfVVNFX01PRFVMRSggRlRfRHJpdmVyX0NsYXNzUmVjLCBjZmZfZHJpdmVyX2NsYXNzICkKK0ZUX1VTRV9NT0RVTEUoIEZUX0RyaXZlcl9DbGFzc1JlYywgdDFjaWRfZHJpdmVyX2NsYXNzICkKKy8vRlRfVVNFX01PRFVMRSggRlRfRHJpdmVyX0NsYXNzUmVjLCBwZnJfZHJpdmVyX2NsYXNzICkKKy8vRlRfVVNFX01PRFVMRSggRlRfRHJpdmVyX0NsYXNzUmVjLCB0NDJfZHJpdmVyX2NsYXNzICkKKy8vRlRfVVNFX01PRFVMRSggRlRfRHJpdmVyX0NsYXNzUmVjLCB3aW5mbnRfZHJpdmVyX2NsYXNzICkKKy8vRlRfVVNFX01PRFVMRSggRlRfRHJpdmVyX0NsYXNzUmVjLCBwY2ZfZHJpdmVyX2NsYXNzICkKK0ZUX1VTRV9NT0RVTEUoIEZUX01vZHVsZV9DbGFzcywgcHNhdXhfbW9kdWxlX2NsYXNzICkKK0ZUX1VTRV9NT0RVTEUoIEZUX01vZHVsZV9DbGFzcywgcHNuYW1lc19tb2R1bGVfY2xhc3MgKQorRlRfVVNFX01PRFVMRSggRlRfTW9kdWxlX0NsYXNzLCBwc2hpbnRlcl9tb2R1bGVfY2xhc3MgKQorRlRfVVNFX01PRFVMRSggRlRfUmVuZGVyZXJfQ2xhc3MsIGZ0X3Jhc3RlcjFfcmVuZGVyZXJfY2xhc3MgKQorRlRfVVNFX01PRFVMRSggRlRfTW9kdWxlX0NsYXNzLCBzZm50X21vZHVsZV9jbGFzcyApCitGVF9VU0VfTU9EVUxFKCBGVF9SZW5kZXJlcl9DbGFzcywgZnRfc21vb3RoX3JlbmRlcmVyX2NsYXNzICkKK0ZUX1VTRV9NT0RVTEUoIEZUX1JlbmRlcmVyX0NsYXNzLCBmdF9zbW9vdGhfbGNkX3JlbmRlcmVyX2NsYXNzICkKK0ZUX1VTRV9NT0RVTEUoIEZUX1JlbmRlcmVyX0NsYXNzLCBmdF9zbW9vdGhfbGNkdl9yZW5kZXJlcl9jbGFzcyApCisvL0ZUX1VTRV9NT0RVTEUoIEZUX0RyaXZlcl9DbGFzc1JlYywgYmRmX2RyaXZlcl9jbGFzcyApCisKKy8qIEVPRiAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS1jdXN0b20tY29uZmlnL2Z0b3B0aW9uLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlLWN1c3RvbS1jb25maWcvZnRvcHRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTg2NDczCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS1jdXN0b20tY29uZmlnL2Z0b3B0aW9uLmgKQEAgLTAsMCArMSw5ODIgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGZ0b3B0aW9uLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBVc2VyLXNlbGVjdGFibGUgY29uZmlndXJhdGlvbiBtYWNyb3MgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3B5cmlnaHQgMTk5Ni0yMDE3IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCisvKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLworLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KKy8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCisvKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2lmbmRlZiBGVE9QVElPTl9IXworI2RlZmluZSBGVE9QVElPTl9IXworCisKKyNpbmNsdWRlIDxmdDJidWlsZC5oPgorCisKK0ZUX0JFR0lOX0hFQURFUgorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgIFVTRVItU0VMRUNUQUJMRSBDT05GSUdVUkFUSU9OIE1BQ1JPUyAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBtYWNybyBkZWZpbml0aW9ucyBmb3IgICAgKi8KKyAgLyogYSBzdGFuZGFyZCBidWlsZCBvZiB0aGUgRnJlZVR5cGUgbGlicmFyeS4gIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvICAgICovCisgIC8qIHVzZSB0aGlzIGZpbGUgdG8gYnVpbGQgcHJvamVjdC1zcGVjaWZpYyB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeTogICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogIC0gWW91IGNhbiBtb2RpZnkgdGhpcyBmaWxlIGJ5IGhhbmQsIGJ1dCB0aGlzIGlzIG5vdCByZWNvbW1lbmRlZCBpbiAgICovCisgIC8qICAgIGNhc2VzIHdoZXJlIHlvdSB3b3VsZCBsaWtlIHRvIGJ1aWxkIHNldmVyYWwgdmVyc2lvbnMgb2YgdGhlICAgICAgICAqLworICAvKiAgICBsaWJyYXJ5IGZyb20gYSBzaW5nbGUgc291cmNlIGRpcmVjdG9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIFlvdSBjYW4gcHV0IGEgY29weSBvZiB0aGlzIGZpbGUgaW4geW91ciBidWlsZCBkaXJlY3RvcnksIG1vcmUgICAgICAqLworICAvKiAgICBwcmVjaXNlbHkgaW4gYCRCVUlMRC9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaCcsIHdoZXJlIGAkQlVJTEQnICAgKi8KKyAgLyogICAgaXMgdGhlIG5hbWUgb2YgYSBkaXJlY3RvcnkgdGhhdCBpcyBpbmNsdWRlZCBfYmVmb3JlXyB0aGUgRnJlZVR5cGUgICovCisgIC8qICAgIGluY2x1ZGUgcGF0aCBkdXJpbmcgY29tcGlsYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgVGhlIGRlZmF1bHQgRnJlZVR5cGUgTWFrZWZpbGVzIGFuZCBKYW1maWxlcyB1c2UgdGhlIGJ1aWxkICAgICAgICAgICovCisgIC8qICAgIGRpcmVjdG9yeSBgYnVpbGRzLzxzeXN0ZW0+JyBieSBkZWZhdWx0LCBidXQgeW91IGNhbiBlYXNpbHkgY2hhbmdlICAqLworICAvKiAgICB0aGF0IGZvciB5b3VyIG93biBwcm9qZWN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAtIENvcHkgdGhlIGZpbGUgPGZ0MmJ1aWxkLmg+IHRvIGAkQlVJTEQvZnQyYnVpbGQuaCcgYW5kIG1vZGlmeSBpdCAgICAqLworICAvKiAgICBzbGlnaHRseSB0byBwcmUtZGVmaW5lIHRoZSBtYWNybyBGVF9DT05GSUdfT1BUSU9OU19IIHVzZWQgdG8gICAgICAgKi8KKyAgLyogICAgbG9jYXRlIHRoaXMgZmlsZSBkdXJpbmcgdGhlIGJ1aWxkLiAgRm9yIGV4YW1wbGUsICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICNkZWZpbmUgRlRfQ09ORklHX09QVElPTlNfSCAgPG15ZnRvcHRpb25zLmg+ICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAjaW5jbHVkZSA8ZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmg+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICB3aWxsIHVzZSBgJEJVSUxEL215ZnRvcHRpb25zLmgnIGluc3RlYWQgb2YgdGhpcyBmaWxlIGZvciBtYWNybyAgICAgKi8KKyAgLyogICAgZGVmaW5pdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICBOb3RlIGFsc28gdGhhdCB5b3UgY2FuIHNpbWlsYXJseSBwcmUtZGVmaW5lIHRoZSBtYWNybyAgICAgICAgICAgICAgKi8KKyAgLyogICAgRlRfQ09ORklHX01PRFVMRVNfSCB1c2VkIHRvIGxvY2F0ZSB0aGUgZmlsZSBsaXN0aW5nIG9mIHRoZSBtb2R1bGVzICovCisgIC8qICAgIHRoYXQgYXJlIHN0YXRpY2FsbHkgbGlua2VkIHRvIHRoZSBsaWJyYXJ5IGF0IGNvbXBpbGUgdGltZS4gIEJ5ICAgICAqLworICAvKiAgICBkZWZhdWx0LCB0aGlzIGZpbGUgaXMgPGZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oPi4gICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFdlIGhpZ2hseSByZWNvbW1lbmQgdXNpbmcgdGhlIHRoaXJkIG1ldGhvZCB3aGVuZXZlciBwb3NzaWJsZS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiBHIEUgTiBFIFIgQSBMICAgRiBSIEUgRSBUIFkgUCBFICAgMiAgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4gKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSWYgeW91IGVuYWJsZSB0aGlzIGNvbmZpZ3VyYXRpb24gb3B0aW9uLCBGcmVlVHlwZSByZWNvZ25pemVzIGFuICAgICAgICovCisgIC8qIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbGxlZCBgRlJFRVRZUEVfUFJPUEVSVElFUycsIHdoaWNoIGNhbiBiZSB1c2VkICAqLworICAvKiB0byBjb250cm9sIHRoZSB2YXJpb3VzIGZvbnQgZHJpdmVycyBhbmQgbW9kdWxlcy4gIFRoZSBjb250cm9sbGFibGUgICAgKi8KKyAgLyogcHJvcGVydGllcyBhcmUgbGlzdGVkIGluIHRoZSBzZWN0aW9uIGBDb250cm9sbGluZyBGcmVlVHlwZSBNb2R1bGVzJyAgICovCisgIC8qIGluIHRoZSByZWZlcmVuY2UncyB0YWJsZSBvZiBjb250ZW50czsgY3VycmVudGx5IHRoZXJlIGFyZSBwcm9wZXJ0aWVzICAqLworICAvKiBmb3IgdGhlIGF1dG8taGludGVyIChmaWxlIGBmdGF1dG9oLmgnKSwgQ0ZGIChmaWxlIGBmdGNmZmRydi5oJyksICAgICAgKi8KKyAgLyogVHJ1ZVR5cGUgKGZpbGUgYGZ0dHRkcnYuaCcpLCBhbmQgUENGIChmaWxlIGBmdHBjZmRydi5oJykuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBgRlJFRVRZUEVfUFJPUEVSVElFUycgaGFzIHRoZSBmb2xsb3dpbmcgc3ludGF4IGZvcm0gKGJyb2tlbiBoZXJlIGludG8gKi8KKyAgLyogbXVsdGlwbGUgbGluZXMgZm9yIGJldHRlciByZWFkYWJpbGl0eSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIDxvcHRpb25hbCB3aGl0ZXNwYWNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICA8bW9kdWxlLW5hbWUxPiAnOicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgPHByb3BlcnR5LW5hbWUxPiAnPScgPHByb3BlcnR5LXZhbHVlMT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIDx3aGl0ZXNwYWNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICA8bW9kdWxlLW5hbWUyPiAnOicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgPHByb3BlcnR5LW5hbWUyPiAnPScgPHByb3BlcnR5LXZhbHVlMj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEV4YW1wbGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBGUkVFVFlQRV9QUk9QRVJUSUVTPXRydWV0eXBlOmludGVycHJldGVyLXZlcnNpb249MzUgXCAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICBjZmY6bm8tc3RlbS1kYXJrZW5pbmc9MSBcICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgYXV0b2ZpdHRlcjp3YXJwaW5nPTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fRU5WSVJPTk1FTlRfUFJPUEVSVElFUworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBVbmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cgaWYgeW91IHdhbnQgdG8gYWN0aXZhdGUgc3ViLXBpeGVsIHJlbmRlcmluZyAgKi8KKyAgLyogKGEuay5hLiBMQ0QgcmVuZGVyaW5nLCBvciBDbGVhclR5cGUpIGluIHRoaXMgYnVpbGQgb2YgdGhlIGxpYnJhcnkuICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIGNvdmVyZWQgYnkgc2V2ZXJhbCBNaWNyb3NvZnQgcGF0ZW50cyAgICAgICAgKi8KKyAgLyogYW5kIHNob3VsZCBub3QgYmUgYWN0aXZhdGVkIGluIGFueSBkZWZhdWx0IGJ1aWxkIG9mIHRoZSBsaWJyYXJ5LiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGlzIG1hY3JvIGhhcyBubyBpbXBhY3Qgb24gdGhlIEZyZWVUeXBlIEFQSSwgb25seSBvbiBpdHMgICAgICAgICAgICAgKi8KKyAgLyogX2ltcGxlbWVudGF0aW9uXy4gIEZvciBleGFtcGxlLCB1c2luZyBGVF9SRU5ERVJfTU9ERV9MQ0Qgd2hlbiBjYWxsaW5nICovCisgIC8qIEZUX1JlbmRlcl9HbHlwaCBzdGlsbCBnZW5lcmF0ZXMgYSBiaXRtYXAgdGhhdCBpcyAzIHRpbWVzIHdpZGVyIHRoYW4gICAqLworICAvKiB0aGUgb3JpZ2luYWwgc2l6ZSBpbiBjYXNlIHRoaXMgbWFjcm8gaXNuJ3QgZGVmaW5lZDsgaG93ZXZlciwgZWFjaCAgICAgKi8KKyAgLyogdHJpcGxldCBvZiBzdWJwaXhlbHMgaGFzIFI9Rz1CLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGlzIGlzIGRvbmUgdG8gYWxsb3cgRnJlZVR5cGUgY2xpZW50cyB0byBydW4gdW5tb2RpZmllZCwgZm9yY2luZyAgICAgKi8KKyAgLyogdGhlbSB0byBkaXNwbGF5IG5vcm1hbCBncmF5LWxldmVsIGFudGktYWxpYXNlZCBnbHlwaHMuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBNYW55IGNvbXBpbGVycyBwcm92aWRlIGEgbm9uLUFOU0kgNjQtYml0IGRhdGEgdHlwZSB0aGF0IGNhbiBiZSB1c2VkICAgKi8KKyAgLyogYnkgRnJlZVR5cGUgdG8gc3BlZWQgdXAgc29tZSBjb21wdXRhdGlvbnMuICBIb3dldmVyLCB0aGlzIHdpbGwgY3JlYXRlICovCisgIC8qIHNvbWUgcHJvYmxlbXMgd2hlbiBjb21waWxpbmcgdGhlIGxpYnJhcnkgaW4gc3RyaWN0IEFOU0kgbW9kZS4gICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRm9yIHRoaXMgcmVhc29uLCB0aGUgdXNlIG9mIDY0LWJpdCBpbnRlZ2VycyBpcyBub3JtYWxseSBkaXNhYmxlZCB3aGVuICovCisgIC8qIHRoZSBfX1NURENfXyBtYWNybyBpcyBkZWZpbmVkLiAgWW91IGNhbiBob3dldmVyIGRpc2FibGUgdGhpcyBieSAgICAgICAqLworICAvKiBkZWZpbmluZyB0aGUgbWFjcm8gRlRfQ09ORklHX09QVElPTl9GT1JDRV9JTlQ2NCBoZXJlLiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEZvciBtb3N0IGNvbXBpbGVycywgdGhpcyB3aWxsIG9ubHkgY3JlYXRlIGNvbXBpbGF0aW9uIHdhcm5pbmdzIHdoZW4gICAqLworICAvKiBidWlsZGluZyB0aGUgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9iTm90ZTogVGhlIGNvbXBpbGVyLXNwZWNpZmljIDY0LWJpdCBpbnRlZ2VycyBhcmUgZGV0ZWN0ZWQgaW4gdGhlICAgICAqLworICAvKiAgICAgICAgIGZpbGUgYGZ0Y29uZmlnLmgnIGVpdGhlciBzdGF0aWNhbGx5IG9yIHRocm91Z2ggdGhlICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICBgY29uZmlndXJlJyBzY3JpcHQgb24gc3VwcG9ydGVkIHBsYXRmb3Jtcy4gICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmIEZUX0NPTkZJR19PUFRJT05fRk9SQ0VfSU5UNjQKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCBkbyBub3QgdHJ5IHRvIHVzZSBhbiBhc3NlbWJsZXIgdmVyc2lvbiBvZiAgICovCisgIC8qIHBlcmZvcm1hbmNlLWNyaXRpY2FsIGZ1bmN0aW9ucyAoZS5nLiBGVF9NdWxGaXgpLiAgWW91IHNob3VsZCBvbmx5IGRvICAqLworICAvKiB0aGF0IHRvIHZlcmlmeSB0aGF0IHRoZSBhc3NlbWJsZXIgZnVuY3Rpb24gd29ya3MgcHJvcGVybHksIG9yIHRvICAgICAgKi8KKyAgLyogZXhlY3V0ZSBiZW5jaG1hcmsgdGVzdHMgb2YgdGhlIHZhcmlvdXMgaW1wbGVtZW50YXRpb25zLiAgICAgICAgICAgICAgICovCisvKiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fTk9fQVNTRU1CTEVSICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIElmIHRoaXMgbWFjcm8gaXMgZGVmaW5lZCwgdHJ5IHRvIHVzZSBhbiBpbmxpbmVkIGFzc2VtYmxlciB2ZXJzaW9uIG9mICAqLworICAvKiB0aGUgYEZUX011bEZpeCcgZnVuY3Rpb24sIHdoaWNoIGlzIGEgYGhvdHNwb3QnIHdoZW4gbG9hZGluZyBhbmQgICAgICAgKi8KKyAgLyogaGludGluZyBnbHlwaHMsIGFuZCB3aGljaCBzaG91bGQgYmUgZXhlY3V0ZWQgYXMgZmFzdCBhcyBwb3NzaWJsZS4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBOb3RlIHRoYXQgaWYgeW91ciBjb21waWxlciBvciBDUFUgaXMgbm90IHN1cHBvcnRlZCwgdGhpcyB3aWxsIGRlZmF1bHQgKi8KKyAgLyogdG8gdGhlIHN0YW5kYXJkIGFuZCBwb3J0YWJsZSBpbXBsZW1lbnRhdGlvbiBmb3VuZCBpbiBgZnRjYWxjLmMnLiAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX0lOTElORV9NVUxGSVgKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTFpXLWNvbXByZXNzZWQgZmlsZSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEZyZWVUeXBlIG5vdyBoYW5kbGVzIGZvbnQgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY29tcHJlc3NlZCB3aXRoIHRoZSAgKi8KKyAgLyogICBgY29tcHJlc3MnIHByb2dyYW0uICBUaGlzIGlzIG1vc3RseSB1c2VkIHRvIHBhcnNlIG1hbnkgb2YgdGhlIFBDRiAgICovCisgIC8qICAgZmlsZXMgdGhhdCBjb21lIHdpdGggdmFyaW91cyBYMTEgZGlzdHJpYnV0aW9ucy4gIFRoZSBpbXBsZW1lbnRhdGlvbiAqLworICAvKiAgIHVzZXMgTmV0QlNEJ3MgYHpvcGVuJyB0byBwYXJ0aWFsbHkgdW5jb21wcmVzcyB0aGUgZmlsZSBvbiB0aGUgZmx5ICAgKi8KKyAgLyogICAoc2VlIHNyYy9sencvZnRnemlwLmMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIERlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzIGBmZWF0dXJlJy4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fVVNFX0xaVworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBHemlwLWNvbXByZXNzZWQgZmlsZSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRnJlZVR5cGUgbm93IGhhbmRsZXMgZm9udCBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjb21wcmVzc2VkIHdpdGggdGhlICAqLworICAvKiAgIGBnemlwJyBwcm9ncmFtLiAgVGhpcyBpcyBtb3N0bHkgdXNlZCB0byBwYXJzZSBtYW55IG9mIHRoZSBQQ0YgZmlsZXMgKi8KKyAgLyogICB0aGF0IGNvbWUgd2l0aCBYRnJlZTg2LiAgVGhlIGltcGxlbWVudGF0aW9uIHVzZXMgYHpsaWInIHRvICAgICAgICAgICovCisgIC8qICAgcGFydGlhbGx5IHVuY29tcHJlc3MgdGhlIGZpbGUgb24gdGhlIGZseSAoc2VlIHNyYy9nemlwL2Z0Z3ppcC5jKS4gICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBEZWZpbmUgdGhpcyBtYWNybyBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhpcyBgZmVhdHVyZScuICBTZWUgYWxzbyAgICovCisgIC8qICAgdGhlIG1hY3JvIEZUX0NPTkZJR19PUFRJT05fU1lTVEVNX1pMSUIgYmVsb3cuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyN1bmRlZiBGVF9DT05GSUdfT1BUSU9OX1VTRV9aTElCCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFpMaWIgbGlicmFyeSBzZWxlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBUaGlzIG1hY3JvIGlzIG9ubHkgdXNlZCB3aGVuIEZUX0NPTkZJR19PUFRJT05fVVNFX1pMSUIgaXMgZGVmaW5lZC4gICovCisgIC8qICAgSXQgYWxsb3dzIEZyZWVUeXBlJ3MgYGZ0Z3ppcCcgY29tcG9uZW50IHRvIGxpbmsgdG8gdGhlIHN5c3RlbSdzICAgICAqLworICAvKiAgIGluc3RhbGxhdGlvbiBvZiB0aGUgWkxpYiBsaWJyYXJ5LiAgVGhpcyBpcyB1c2VmdWwgb24gc3lzdGVtcyBsaWtlICAgKi8KKyAgLyogICBVbml4IG9yIFZNUyB3aGVyZSBpdCBnZW5lcmFsbHkgaXMgYWxyZWFkeSBhdmFpbGFibGUuICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIElmIHlvdSBsZXQgaXQgdW5kZWZpbmVkLCB0aGUgY29tcG9uZW50IHdpbGwgdXNlIGl0cyBvd24gY29weSAgICAgICAgKi8KKyAgLyogICBvZiB0aGUgemxpYiBzb3VyY2VzIGluc3RlYWQuICBUaGVzZSBoYXZlIGJlZW4gbW9kaWZpZWQgdG8gYmUgICAgICAgICovCisgIC8qICAgaW5jbHVkZWQgZGlyZWN0bHkgd2l0aGluIHRoZSBjb21wb25lbnQgYW5kICpub3QqIGV4cG9ydCBleHRlcm5hbCAgICAqLworICAvKiAgIGZ1bmN0aW9uIG5hbWVzLiAgVGhpcyBhbGxvd3MgeW91IHRvIGxpbmsgYW55IHByb2dyYW0gd2l0aCBGcmVlVHlwZSAgKi8KKyAgLyogICBfYW5kXyBaTGliIHdpdGhvdXQgbGlua2luZyBjb25mbGljdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIERvIG5vdCAjdW5kZWYgdGhpcyBtYWNybyBoZXJlIHNpbmNlIHRoZSBidWlsZCBzeXN0ZW0gbWlnaHQgZGVmaW5lICAgKi8KKyAgLyogICBpdCBmb3IgY2VydGFpbiBjb25maWd1cmF0aW9ucyBvbmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1NZU1RFTV9aTElCICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEJ6aXAyLWNvbXByZXNzZWQgZmlsZSBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBGcmVlVHlwZSBub3cgaGFuZGxlcyBmb250IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNvbXByZXNzZWQgd2l0aCB0aGUgICovCisgIC8qICAgYGJ6aXAyJyBwcm9ncmFtLiAgVGhpcyBpcyBtb3N0bHkgdXNlZCB0byBwYXJzZSBtYW55IG9mIHRoZSBQQ0YgICAgICAqLworICAvKiAgIGZpbGVzIHRoYXQgY29tZSB3aXRoIFhGcmVlODYuICBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyBgbGliYnoyJyB0byAgKi8KKyAgLyogICBwYXJ0aWFsbHkgdW5jb21wcmVzcyB0aGUgZmlsZSBvbiB0aGUgZmx5IChzZWUgc3JjL2J6aXAyL2Z0YnppcDIuYykuICovCisgIC8qICAgQ29udHJhcnkgdG8gZ3ppcCwgYnppcDIgY3VycmVudGx5IGlzIG5vdCBpbmNsdWRlZCBhbmQgbmVlZCB0byB1c2UgICAqLworICAvKiAgIHRoZSBzeXN0ZW0gYXZhaWxhYmxlIGJ6aXAyIGltcGxlbWVudGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgYGZlYXR1cmUnLiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9VU0VfQlpJUDIgKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRGVmaW5lIHRvIGRpc2FibGUgdGhlIHVzZSBvZiBmaWxlIHN0cmVhbSBmdW5jdGlvbnMgYW5kIHR5cGVzLCBGSUxFLCAgICovCisgIC8qIGZvcGVuKCkgZXRjLiAgRW5hYmxlcyB0aGUgdXNlIG9mIHNtYWxsZXIgc3lzdGVtIGxpYnJhcmllcyBvbiBlbWJlZGRlZCAqLworICAvKiBzeXN0ZW1zIHRoYXQgaGF2ZSBtdWx0aXBsZSBzeXN0ZW0gbGlicmFyaWVzLCBzb21lIHdpdGggb3Igd2l0aG91dCAgICAgKi8KKyAgLyogZmlsZSBzdHJlYW0gc3VwcG9ydCwgaW4gdGhlIGNhc2VzIHdoZXJlIGZpbGUgc3RyZWFtIHN1cHBvcnQgaXMgbm90ICAgICovCisgIC8qIG5lY2Vzc2FyeSBzdWNoIGFzIG1lbW9yeSBsb2FkaW5nIG9mIGZvbnQgZmlsZXMuICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9ESVNBQkxFX1NUUkVBTV9TVVBQT1JUICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFBORyBiaXRtYXAgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBGcmVlVHlwZSBub3cgaGFuZGxlcyBsb2FkaW5nIGNvbG9yIGJpdG1hcCBnbHlwaHMgaW4gdGhlIFBORyBmb3JtYXQuICovCisgIC8qICAgVGhpcyByZXF1aXJlcyBoZWxwIGZyb20gdGhlIGV4dGVybmFsIGxpYnBuZyBsaWJyYXJ5LiAgVW5jb21wcmVzc2VkICAqLworICAvKiAgIGNvbG9yIGJpdG1hcHMgZG8gbm90IG5lZWQgYW55IGV4dGVybmFsIGxpYnJhcmllcyBhbmQgd2lsbCBiZSAgICAgICAgKi8KKyAgLyogICBzdXBwb3J0ZWQgcmVnYXJkbGVzcyBvZiB0aGlzIGNvbmZpZ3VyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIERlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzIGBmZWF0dXJlJy4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fVVNFX1BORyAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBIYXJmQnV6eiBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRnJlZVR5cGUgdXNlcyB0aGUgSGFyZkJ1enogbGlicmFyeSB0byBpbXByb3ZlIGF1dG8taGludGluZyBvZiAgICAgICAqLworICAvKiAgIE9wZW5UeXBlIGZvbnRzLiAgSWYgYXZhaWxhYmxlLCBtYW55IGdseXBocyBub3QgZGlyZWN0bHkgYWRkcmVzc2FibGUgKi8KKyAgLyogICBieSBhIGZvbnQncyBjaGFyYWN0ZXIgbWFwIHdpbGwgYmUgaGludGVkIGFsc28uICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIERlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzIGBmZWF0dXJlJy4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fVVNFX0hBUkZCVVpaICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIERMTCBleHBvcnQgY29tcGlsYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBXaGVuIGNvbXBpbGluZyBGcmVlVHlwZSBhcyBhIERMTCwgc29tZSBzeXN0ZW1zL2NvbXBpbGVycyBuZWVkIGEgICAgICovCisgIC8qICAgc3BlY2lhbCBrZXl3b3JkIGluIGZyb250IE9SIGFmdGVyIHRoZSByZXR1cm4gdHlwZSBvZiBmdW5jdGlvbiAgICAgICAqLworICAvKiAgIGRlY2xhcmF0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVHdvIG1hY3JvcyBhcmUgdXNlZCB3aXRoaW4gdGhlIEZyZWVUeXBlIHNvdXJjZSBjb2RlIHRvIGRlZmluZSAgICAgICAqLworICAvKiAgIGV4cG9ydGVkIGxpYnJhcnkgZnVuY3Rpb25zOiBGVF9FWFBPUlQgYW5kIEZUX0VYUE9SVF9ERUYuICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBGVF9FWFBPUlQoIHJldHVybl90eXBlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgaXMgdXNlZCBpbiBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uLCBhcyBpbiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgIEZUX0VYUE9SVCggRlRfRXJyb3IgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICBGVF9Jbml0X0ZyZWVUeXBlKCBGVF9MaWJyYXJ5KiAgYWxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIEZUX0VYUE9SVF9ERUYoIHJldHVybl90eXBlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICBpcyB1c2VkIGluIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiwgYXMgaW4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgIEZUX0luaXRfRnJlZVR5cGUoIEZUX0xpYnJhcnkqICBhbGlicmFyeSApICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFlvdSBjYW4gcHJvdmlkZSB5b3VyIG93biBpbXBsZW1lbnRhdGlvbiBvZiBGVF9FWFBPUlQgYW5kICAgICAgICAgICAgKi8KKyAgLyogICBGVF9FWFBPUlRfREVGIGhlcmUgaWYgeW91IHdhbnQuICBJZiB5b3UgbGVhdmUgdGhlbSB1bmRlZmluZWQsIHRoZXkgICovCisgIC8qICAgd2lsbCBiZSBsYXRlciBhdXRvbWF0aWNhbGx5IGRlZmluZWQgYXMgYGV4dGVybiByZXR1cm5fdHlwZScgdG8gICAgICAqLworICAvKiAgIGFsbG93IG5vcm1hbCBjb21waWxhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRG8gbm90ICN1bmRlZiB0aGVzZSBtYWNyb3MgaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAqLworICAvKiAgIHRoZW0gZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAjZGVmaW5lIEZUX0VYUE9SVCh4KSAgICAgIGV4dGVybiB4ICovCisvKiAjZGVmaW5lIEZUX0VYUE9SVF9ERUYoeCkgIHggKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogR2x5cGggUG9zdHNjcmlwdCBOYW1lcyBoYW5kbGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEJ5IGRlZmF1bHQsIEZyZWVUeXBlIDIgaXMgY29tcGlsZWQgd2l0aCB0aGUgYHBzbmFtZXMnIG1vZHVsZS4gIFRoaXMgKi8KKyAgLyogICBtb2R1bGUgaXMgaW4gY2hhcmdlIG9mIGNvbnZlcnRpbmcgYSBnbHlwaCBuYW1lIHN0cmluZyBpbnRvIGEgICAgICAgICovCisgIC8qICAgVW5pY29kZSB2YWx1ZSwgb3IgcmV0dXJuIGEgTWFjaW50b3NoIHN0YW5kYXJkIGdseXBoIG5hbWUgZm9yIHRoZSAgICAqLworICAvKiAgIHVzZSB3aXRoIHRoZSBUcnVlVHlwZSBgcG9zdCcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgVW5kZWZpbmUgdGhpcyBtYWNybyBpZiB5b3UgZG8gbm90IHdhbnQgYHBzbmFtZXMnIGNvbXBpbGVkIGluIHlvdXIgICAqLworICAvKiAgIGJ1aWxkIG9mIEZyZWVUeXBlLiAgVGhpcyBoYXMgdGhlIGZvbGxvd2luZyBlZmZlY3RzOiAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgLSBUaGUgVHJ1ZVR5cGUgZHJpdmVyIHdpbGwgcHJvdmlkZSBpdHMgb3duIHNldCBvZiBnbHlwaCBuYW1lcywgICAgICAqLworICAvKiAgICAgaWYgeW91IGJ1aWxkIGl0IHRvIHN1cHBvcnQgcG9zdHNjcmlwdCBuYW1lcyBpbiB0aGUgVHJ1ZVR5cGUgICAgICAgKi8KKyAgLyogICAgIGBwb3N0JyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIC0gVGhlIFR5cGUgMSBkcml2ZXIgd2lsbCBub3QgYmUgYWJsZSB0byBzeW50aGVzaXplIGEgVW5pY29kZSAgICAgICAgKi8KKyAgLyogICAgIGNoYXJtYXAgb3V0IG9mIHRoZSBnbHlwaHMgZm91bmQgaW4gdGhlIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFlvdSB3b3VsZCBub3JtYWxseSB1bmRlZmluZSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFjcm8gd2hlbiBidWlsZGluZyAgKi8KKyAgLyogICBhIHZlcnNpb24gb2YgRnJlZVR5cGUgdGhhdCBkb2Vzbid0IGNvbnRhaW4gYSBUeXBlIDEgb3IgQ0ZGIGRyaXZlci4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUG9zdHNjcmlwdCBOYW1lcyB0byBVbmljb2RlIFZhbHVlcyBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEJ5IGRlZmF1bHQsIEZyZWVUeXBlIDIgaXMgYnVpbHQgd2l0aCB0aGUgYFBTTmFtZXMnIG1vZHVsZSBjb21waWxlZCAgKi8KKyAgLyogICBpbi4gIEFtb25nIG90aGVyIHRoaW5ncywgdGhlIG1vZHVsZSBpcyB1c2VkIHRvIGNvbnZlcnQgYSBnbHlwaCBuYW1lICovCisgIC8qICAgaW50byBhIFVuaWNvZGUgdmFsdWUuICBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGluIG9yZGVyIHRvICAgICAgICAqLworICAvKiAgIHN5bnRoZXNpemUgb24gdGhlIGZseSBhIFVuaWNvZGUgY2hhcm1hcCBmcm9tIHRoZSBDRkYvVHlwZSAxIGRyaXZlciAgKi8KKyAgLyogICB0aHJvdWdoIGEgYmlnIHRhYmxlIG5hbWVkIHRoZSBgQWRvYmUgR2x5cGggTGlzdCcgKEFHTCkuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFVuZGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IGRvIG5vdCB3YW50IHRoZSBBZG9iZSBHbHlwaCBMaXN0ICAgICAgICAgKi8KKyAgLyogICBjb21waWxlZCBpbiB5b3VyIGBQU05hbWVzJyBtb2R1bGUuICBUaGUgVHlwZSAxIGRyaXZlciB3aWxsIG5vdCBiZSAgICovCisgIC8qICAgYWJsZSB0byBzeW50aGVzaXplIGEgVW5pY29kZSBjaGFybWFwIG91dCBvZiB0aGUgZ2x5cGhzIGZvdW5kIGluIHRoZSAqLworICAvKiAgIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fQURPQkVfR0xZUEhfTElTVAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBTdXBwb3J0IGZvciBNYWMgZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgc3VwcG9ydCBmb3Igb3V0bGluZSBmb250cyBpbiBNYWMgICAgICAqLworICAvKiAgIGZvcm1hdCAobWFjIGRmb250LCBtYWMgcmVzb3VyY2UsIG1hY2JpbmFyeSBjb250YWluaW5nIGEgbWFjICAgICAgICAgKi8KKyAgLyogICByZXNvdXJjZSkgb24gbm9uLU1hYyBwbGF0Zm9ybXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIE5vdGUgdGhhdCB0aGUgYEZPTkQnIHJlc291cmNlIGlzbid0IGNoZWNrZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgRlRfQ09ORklHX09QVElPTl9NQUNfRk9OVFMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogR3Vlc3NpbmcgbWV0aG9kcyB0byBhY2Nlc3MgZW1iZWRkZWQgcmVzb3VyY2UgZm9ya3MgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEVuYWJsZSBleHRyYSBNYWMgZm9udHMgc3VwcG9ydCBvbiBub24tTWFjIHBsYXRmb3JtcyAoZS5nLiAgICAgICAgICAgKi8KKyAgLyogICBHTlUvTGludXgpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFJlc291cmNlIGZvcmtzIHdoaWNoIGluY2x1ZGUgZm9udHMgZGF0YSBhcmUgc3RvcmVkIHNvbWV0aW1lcyBpbiAgICAgKi8KKyAgLyogICBsb2NhdGlvbnMgd2hpY2ggdXNlcnMgb3IgZGV2ZWxvcGVycyBkb24ndCBleHBlY3RlZC4gIEluIHNvbWUgY2FzZXMsICovCisgIC8qICAgcmVzb3VyY2UgZm9ya3Mgc3RhcnQgd2l0aCBzb21lIG9mZnNldCBmcm9tIHRoZSBoZWFkIG9mIGEgZmlsZS4gIEluICAqLworICAvKiAgIG90aGVyIGNhc2VzLCB0aGUgYWN0dWFsIHJlc291cmNlIGZvcmsgaXMgc3RvcmVkIGluIGZpbGUgZGlmZmVyZW50ICAgKi8KKyAgLyogICBmcm9tIHdoYXQgdGhlIHVzZXIgc3BlY2lmaWVzLiAgSWYgdGhpcyBvcHRpb24gaXMgYWN0aXZhdGVkLCAgICAgICAgICovCisgIC8qICAgRnJlZVR5cGUgdHJpZXMgdG8gZ3Vlc3Mgd2hldGhlciBzdWNoIG9mZnNldHMgb3IgZGlmZmVyZW50IGZpbGUgICAgICAqLworICAvKiAgIG5hbWVzIG11c3QgYmUgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgTm90ZSB0aGF0IG5vcm1hbCwgZGlyZWN0IGFjY2VzcyBvZiByZXNvdXJjZSBmb3JrcyBpcyBjb250cm9sbGVkIHZpYSAqLworICAvKiAgIHRoZSBGVF9DT05GSUdfT1BUSU9OX01BQ19GT05UUyBvcHRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjaWZkZWYgRlRfQ09ORklHX09QVElPTl9NQUNfRk9OVFMKKyNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9HVUVTU0lOR19FTUJFRERFRF9SRk9SSworI2VuZGlmCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEFsbG93IHRoZSB1c2Ugb2YgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlIHRvIGxvYWQgdHlwZWZhY2VzIHRoYXQgICAgICAqLworICAvKiBjb250YWluIG5vIGdseXBoIGRhdGEsIGJ1dCBzdXBwbHkgaXQgdmlhIGEgY2FsbGJhY2sgZnVuY3Rpb24uICAgICAgICAgKi8KKyAgLyogVGhpcyBpcyByZXF1aXJlZCBieSBjbGllbnRzIHN1cHBvcnRpbmcgZG9jdW1lbnQgZm9ybWF0cyB3aGljaCAgICAgICAgICovCisgIC8qIHN1cHBseSBmb250IGRhdGEgaW5jcmVtZW50YWxseSBhcyB0aGUgZG9jdW1lbnQgaXMgcGFyc2VkLCBzdWNoICAgICAgICAqLworICAvKiBhcyB0aGUgR2hvc3RzY3JpcHQgaW50ZXJwcmV0ZXIgZm9yIHRoZSBQb3N0U2NyaXB0IGxhbmd1YWdlLiAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlbmRlciBwb29sIHVzZWQgYnkgdGhlIHNjYW4tbGluZSBjb252ZXJ0ZXIgICovCisgIC8qIHRvIGRvIGFsbCBvZiBpdHMgd29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfUkVOREVSX1BPT0xfU0laRSAgMTYzODRMCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEZUX01BWF9NT0RVTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBUaGUgbWF4aW11bSBudW1iZXIgb2YgbW9kdWxlcyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkIGluIGEgc2luZ2xlICAgICovCisgIC8qICAgRnJlZVR5cGUgbGlicmFyeSBvYmplY3QuICAzMiBpcyB0aGUgZGVmYXVsdC4gICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgRlRfTUFYX01PRFVMRVMgIDMyCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIERlYnVnIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBGcmVlVHlwZSBjYW4gYmUgY29tcGlsZWQgaW4gZGVidWcgb3IgdHJhY2UgbW9kZS4gIEluIGRlYnVnIG1vZGUsICAgICovCisgIC8qICAgZXJyb3JzIGFyZSByZXBvcnRlZCB0aHJvdWdoIHRoZSBgZnRkZWJ1ZycgY29tcG9uZW50LiAgSW4gdHJhY2UgICAgICAqLworICAvKiAgIG1vZGUsIGFkZGl0aW9uYWwgbWVzc2FnZXMgYXJlIHNlbnQgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCBkdXJpbmcgICAgKi8KKyAgLyogICBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIERlZmluZSBGVF9ERUJVR19MRVZFTF9FUlJPUiB0byBidWlsZCB0aGUgbGlicmFyeSBpbiBkZWJ1ZyBtb2RlLiAgICAgKi8KKyAgLyogICBEZWZpbmUgRlRfREVCVUdfTEVWRUxfVFJBQ0UgdG8gYnVpbGQgaXQgaW4gdHJhY2UgbW9kZS4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIERvbid0IGRlZmluZSBhbnkgb2YgdGhlc2UgbWFjcm9zIHRvIGNvbXBpbGUgaW4gYHJlbGVhc2UnIG1vZGUhICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRG8gbm90ICN1bmRlZiB0aGVzZSBtYWNyb3MgaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAqLworICAvKiAgIHRoZW0gZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAjZGVmaW5lIEZUX0RFQlVHX0xFVkVMX0VSUk9SICovCisvKiAjZGVmaW5lIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEF1dG9maXR0ZXIgZGVidWdnaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBJZiBGVF9ERUJVR19BVVRPRklUIGlzIGRlZmluZWQsIEZyZWVUeXBlIHByb3ZpZGVzIHNvbWUgbWVhbnMgdG8gICAgICovCisgIC8qICAgY29udHJvbCB0aGUgYXV0b2ZpdHRlciBiZWhhdmlvdXIgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyB3aXRoIGdsb2JhbCAqLworICAvKiAgIGJvb2xlYW4gdmFyaWFibGVzIChjb25zZXF1ZW50bHksIHlvdSBzaG91bGQgKm5ldmVyKiBlbmFibGUgdGhpcyAgICAgKi8KKyAgLyogICB3aGlsZSBjb21waWxpbmcgaW4gYHJlbGVhc2UnIG1vZGUpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgX2FmX2RlYnVnX2Rpc2FibGVfaG9yel9oaW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIF9hZl9kZWJ1Z19kaXNhYmxlX3ZlcnRfaGludHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBfYWZfZGVidWdfZGlzYWJsZV9ibHVlX2hpbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBBZGRpdGlvbmFsbHksIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHByb3ZpZGUgZHVtcHMgb2YgdmFyaW91cyAgICAgICovCisgIC8qICAgaW50ZXJuYWwgYXV0b2ZpdCBzdHJ1Y3R1cmVzIHRvIHN0ZG91dCAodXNpbmcgYHByaW50ZicpOiAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIGFmX2dseXBoX2hpbnRzX2R1bXBfcG9pbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBhZl9nbHlwaF9oaW50c19kdW1wX3NlZ21lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgYWZfZ2x5cGhfaGludHNfZHVtcF9lZGdlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIGFmX2dseXBoX2hpbnRzX2dldF9udW1fc2VnbWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBhZl9nbHlwaF9oaW50c19nZXRfc2VnbWVudF9vZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBBcyBhbiBhcmd1bWVudCwgdGhleSB1c2UgYW5vdGhlciBnbG9iYWwgdmFyaWFibGU6ICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgX2FmX2RlYnVnX2hpbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgUGxlYXNlIGhhdmUgYSBsb29rIGF0IHRoZSBgZnRncmlkJyBkZW1vIHByb2dyYW0gdG8gc2VlIGhvdyB0aG9zZSAgICAqLworICAvKiAgIHZhcmlhYmxlcyBhbmQgbWFjcm9zIHNob3VsZCBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRG8gbm90ICN1bmRlZiB0aGVzZSBtYWNyb3MgaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAqLworICAvKiAgIHRoZW0gZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAjZGVmaW5lIEZUX0RFQlVHX0FVVE9GSVQgKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogTWVtb3J5IERlYnVnZ2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEZyZWVUeXBlIG5vdyBjb21lcyB3aXRoIGFuIGludGVncmF0ZWQgbWVtb3J5IGRlYnVnZ2VyIHRoYXQgaXMgICAgICAgKi8KKyAgLyogICBjYXBhYmxlIG9mIGRldGVjdGluZyBzaW1wbGUgZXJyb3JzIGxpa2UgbWVtb3J5IGxlYWtzIG9yIGRvdWJsZSAgICAgICovCisgIC8qICAgZGVsZXRlcy4gIFRvIGNvbXBpbGUgaXQgd2l0aGluIHlvdXIgYnVpbGQgb2YgdGhlIGxpYnJhcnksIHlvdSAgICAgICAqLworICAvKiAgIHNob3VsZCBkZWZpbmUgRlRfREVCVUdfTUVNT1JZIGhlcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgTm90ZSB0aGF0IHRoZSBtZW1vcnkgZGVidWdnZXIgaXMgb25seSBhY3RpdmF0ZWQgYXQgcnVudGltZSB3aGVuICAgICAqLworICAvKiAgIHdoZW4gdGhlIF9lbnZpcm9ubWVudF8gdmFyaWFibGUgYEZUMl9ERUJVR19NRU1PUlknIGlzIGRlZmluZWQgYWxzbyEgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgRG8gbm90ICN1bmRlZiB0aGlzIG1hY3JvIGhlcmUgc2luY2UgdGhlIGJ1aWxkIHN5c3RlbSBtaWdodCBkZWZpbmUgICAqLworICAvKiAgIGl0IGZvciBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zIG9ubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAjZGVmaW5lIEZUX0RFQlVHX01FTU9SWSAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBNb2R1bGUgZXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgSWYgdGhpcyBtYWNybyBpcyBzZXQgKHdoaWNoIGlzIF9ub3RfIHRoZSBkZWZhdWx0KSwgdGhlIGhpZ2hlciBieXRlICAqLworICAvKiAgIG9mIGFuIGVycm9yIGNvZGUgZ2l2ZXMgdGhlIG1vZHVsZSBpbiB3aGljaCB0aGUgZXJyb3IgaGFzIG9jY3VycmVkLCAgKi8KKyAgLyogICB3aGlsZSB0aGUgbG93ZXIgYnl0ZSBpcyB0aGUgcmVhbCBlcnJvciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIFNldHRpbmcgdGhpcyBtYWNybyBtYWtlcyBzZW5zZSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHksIHNpbmNlICAgKi8KKyAgLyogICBpdCB3b3VsZCBicmVhayBzb3VyY2UgY29tcGF0aWJpbGl0eSBvZiBjZXJ0YWluIHByb2dyYW1zIHRoYXQgdXNlICAgICovCisgIC8qICAgRnJlZVR5cGUgMi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICBNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGluIHRoZSBmaWxlcyBmdG1vZGVyci5oIGFuZCBmdGVycm9ycy5oLiAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX01PRFVMRV9FUlJPUlMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIElmIHRoaXMgbWFjcm8gaXMgc2V0ICh3aGljaCBpcyBfbm90XyB0aGUgZGVmYXVsdCksIEZyZWVUeXBlMiB3aWxsICAgKi8KKyAgLyogICBhdm9pZCBjcmVhdGluZyBjb25zdGFudHMgdGhhdCByZXF1aXJlIGFkZHJlc3MgZml4dXBzLiAgSW5zdGVhZCB0aGUgICovCisgIC8qICAgY29uc3RhbnRzIHdpbGwgYmUgbW92ZWQgaW50byBhIHN0cnVjdCBhbmQgYWRkaXRpb25hbCBpbnRpYWxpemF0aW9uICAqLworICAvKiAgIGNvZGUgd2lsbCBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgU2V0dGluZyB0aGlzIG1hY3JvIGlzIG5lZWRlZCBmb3Igc3lzdGVtcyB0aGF0IHByb2hpYml0IGFkZHJlc3MgICAgICAqLworICAvKiAgIGZpeHVwcywgc3VjaCBhcyBCUkVXLiAgW05vdGUgdGhhdCBzdGFuZGFyZCBjb21waWxlcnMgbGlrZSBnY2Mgb3IgICAgKi8KKyAgLyogICBjbGFuZyBoYW5kbGUgUElDIGdlbmVyYXRpb24gYXV0b21hdGljYWxseTsgeW91IGRvbid0IGhhdmUgdG8gc2V0ICAgICovCisgIC8qICAgRlRfQ09ORklHX09QVElPTl9QSUMsIHdoaWNoIGlzIG9ubHkgbmVjZXNzYXJ5IGZvciB2ZXJ5IHNwZWNpYWwgICAgICAqLworICAvKiAgIGNvbXBpbGVycy5dICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgTm90ZSB0aGF0IEZUX0NPTkZJR19PUFRJT05fUElDIHN1cHBvcnQgaXMgbm90IGF2YWlsYWJsZSBmb3IgYWxsICAgICAqLworICAvKiAgIG1vZHVsZXMgKHNlZSBgbW9kdWxlcy5jZmcnIGZvciBhIGNvbXBsZXRlIGxpc3QpLiAgRm9yIGJ1aWxkaW5nIHdpdGggKi8KKyAgLyogICBGVF9DT05GSUdfT1BUSU9OX1BJQyBzdXBwb3J0LCBkbyB0aGUgZm9sbG93aW5nLiAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgMC4gQ2xvbmUgdGhlIHJlcG9zaXRvcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIDEuIERlZmluZSBGVF9DT05GSUdfT1BUSU9OX1BJQy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAyLiBSZW1vdmUgYWxsIHN1YmRpcmVjdG9yaWVzIGluIGBzcmMnIHRoYXQgZG9uJ3QgaGF2ZSAgICAgICAgICAgICAqLworICAvKiAgICAgICAgRlRfQ09ORklHX09QVElPTl9QSUMgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgIDMuIENvbW1lbnQgb3V0IHRoZSBjb3JyZXNwb25kaW5nIG1vZHVsZXMgaW4gYG1vZHVsZXMuY2ZnJy4gICAgICAgICovCisgIC8qICAgICA0LiBDb21waWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9QSUMgKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqICAgICAgICBTIEYgTiBUICAgRCBSIEkgViBFIFIgICAgQyBPIE4gRiBJIEcgVSBSIEEgVCBJIE8gTiAgICAgICAqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQgICAgICAgKi8KKyAgLyogZW1iZWRkZWQgYml0bWFwcyBpbiBhbGwgZm9ybWF0cyB1c2luZyB0aGUgU0ZOVCBtb2R1bGUgKG5hbWVseSAgICAgICAgICovCisgIC8qIFRydWVUeXBlICYgT3BlblR5cGUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyN1bmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUyBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvICAgICovCisgIC8qIGxvYWQgYW5kIGVudW1lcmF0ZSB0aGUgZ2x5cGggUG9zdHNjcmlwdCBuYW1lcyBpbiBhIFRydWVUeXBlIG9yICAgICAgICAqLworICAvKiBPcGVuVHlwZSBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE5vdGUgdGhhdCB3aGVuIHlvdSBkbyBub3QgY29tcGlsZSB0aGUgYFBTTmFtZXMnIG1vZHVsZSBieSB1bmRlZmluaW5nICAqLworICAvKiB0aGUgYWJvdmUgRlRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTLCB0aGUgYHNmbnQnIG1vZHVsZSB3aWxsICAgKi8KKyAgLyogY29udGFpbiBhZGRpdGlvbmFsIGNvZGUgdXNlZCB0byByZWFkIHRoZSBQUyBOYW1lcyB0YWJsZSBmcm9tIGEgZm9udC4gICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAoQnkgZGVmYXVsdCwgdGhlIG1vZHVsZSB1c2VzIGBQU05hbWVzJyB0byBleHRyYWN0IGdseXBoIG5hbWVzLikgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9TRk5UX05BTUVTIGlmIHlvdXIgYXBwbGljYXRpb25zIG5lZWQgdG8gICAgICAgKi8KKyAgLyogYWNjZXNzIHRoZSBpbnRlcm5hbCBuYW1lIHRhYmxlIGluIGEgU0ZOVC1iYXNlZCBmb3JtYXQgbGlrZSBUcnVlVHlwZSAgICovCisgIC8qIG9yIE9wZW5UeXBlLiAgVGhlIG5hbWUgdGFibGUgY29udGFpbnMgdmFyaW91cyBzdHJpbmdzIHVzZWQgdG8gICAgICAgICAqLworICAvKiBkZXNjcmliZSB0aGUgZm9udCwgbGlrZSBmYW1pbHkgbmFtZSwgY29weXJpZ2h0LCB2ZXJzaW9uLCBldGMuICBJdCAgICAgKi8KKyAgLyogZG9lcyBub3QgY29udGFpbiBhbnkgZ2x5cGggbmFtZSB0aG91Z2guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBBY2Nlc3NpbmcgU0ZOVCBuYW1lcyBpcyBkb25lIHRocm91Z2ggdGhlIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiAgICAgICAgKi8KKyAgLyogYGZ0c25hbWVzLmgnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX1NGTlRfTkFNRVMKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVHJ1ZVR5cGUgQ01hcCBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIEhlcmUgeW91IGNhbiBmaW5lLXR1bmUgd2hpY2ggVHJ1ZVR5cGUgQ01hcCB0YWJsZSBmb3JtYXQgc2hhbGwgYmUgICAgKi8KKyAgLyogICBzdXBwb3J0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8wCisjZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8yCisjZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF80CisjZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF82CisjZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF84CisjZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xMAorI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTIKKyNkZWZpbmUgVFRfQ09ORklHX0NNQVBfRk9STUFUXzEzCisjZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xNAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgVCBSIFUgRSBUIFkgUCBFICAgRCBSIEkgViBFIFIgICAgQyBPIE4gRiBJIEcgVSBSIEEgVCBJIE8gTiAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUiBpZiB5b3Ugd2FudCB0byBjb21waWxlICAgKi8KKyAgLyogYSBieXRlY29kZSBpbnRlcnByZXRlciBpbiB0aGUgVHJ1ZVR5cGUgZHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBCeSB1bmRlZmluaW5nIHRoaXMsIHlvdSB3aWxsIG9ubHkgY29tcGlsZSB0aGUgY29kZSBuZWNlc3NhcnkgdG8gbG9hZCAgKi8KKyAgLyogVHJ1ZVR5cGUgZ2x5cGhzIHdpdGhvdXQgaGludGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIERvIG5vdCAjdW5kZWYgdGhpcyBtYWNybyBoZXJlLCBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0ICAgICAgICAgKi8KKyAgLyogICBkZWZpbmUgaXQgZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgaWYgeW91IHdhbnQgdG8gY29tcGlsZSAgICAgICAqLworICAvKiBzdWJwaXhlbCBoaW50aW5nIHN1cHBvcnQgaW50byB0aGUgVHJ1ZVR5cGUgZHJpdmVyLiAgVGhpcyBtb2RpZmllcyB0aGUgKi8KKyAgLyogVHJ1ZVR5cGUgaGludGluZyBtZWNoYW5pc20gd2hlbiBhbnl0aGluZyBidXQgRlRfUkVOREVSX01PREVfTU9OTyBpcyAgICovCisgIC8qIHJlcXVlc3RlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSW4gcGFydGljdWxhciwgaXQgbW9kaWZpZXMgdGhlIGJ5dGVjb2RlIGludGVycHJldGVyIHRvIGludGVycHJldCAob3IgICovCisgIC8qIG5vdCkgaW5zdHJ1Y3Rpb25zIGluIGEgY2VydGFpbiB3YXkgc28gdGhhdCBhbGwgVHJ1ZVR5cGUgZm9udHMgbG9vayAgICAqLworICAvKiBsaWtlIHRoZXkgZG8gaW4gYSBXaW5kb3dzIENsZWFyVHlwZSAoRGlyZWN0V3JpdGUpIGVudmlyb25tZW50LiAgU2VlICAgKi8KKyAgLyogWzFdIGZvciBhIHRlY2huaWNhbCBvdmVydmlldyBvbiB3aGF0IHRoaXMgbWVhbnMuICBTZWUgYHR0aW50ZXJwLmgnICAgICovCisgIC8qIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIExFQU4gb3B0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlcmUgYXJlIHRocmVlIG9wdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAxLiBUaGlzIG9wdGlvbiBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGBJbmZpbmFsaXR5JyBtb25pa2VyLiAgICAgICAgICAgKi8KKyAgLyogICAgQ29udHJpYnV0ZWQgYnkgYW4gaW5kaXZpZHVhbCBuaWNrbmFtZWQgSW5maW5hbGl0eSB3aXRoIHRoZSBnb2FsIG9mICovCisgIC8qICAgIG1ha2luZyBUcnVlVHlwZSBmb250cyByZW5kZXIgYmV0dGVyIHRoYW4gb24gV2luZG93cy4gIEEgaGlnaCAgICAgICAqLworICAvKiAgICBhbW91bnQgb2YgY29uZmlndXJhYmlsaXR5IGFuZCBmbGV4aWJpbGl0eSwgZG93biB0byBydWxlcyBmb3IgICAgICAgKi8KKyAgLyogICAgc2luZ2xlIGdseXBocyBpbiBmb250cywgYnV0IGFsc28gdmVyeSBzbG93LiAgSXRzIGV4cGVyaW1lbnRhbCBhbmQgICovCisgIC8qICAgIHNsb3cgbmF0dXJlIGFuZCB0aGUgb3JpZ2luYWwgZGV2ZWxvcGVyIGxvc2luZyBpbnRlcmVzdCBtZWFudCB0aGF0ICAqLworICAvKiAgICB0aGlzIG9wdGlvbiB3YXMgbmV2ZXIgZW5hYmxlZCBpbiBkZWZhdWx0IGJ1aWxkcy4gICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIDIuIFRoZSBuZXcgZGVmYXVsdCBtb2RlIGZvciB0aGUgVHJ1ZVR5cGUgZHJpdmVyLiAgVGhlIEluZmluYWxpdHkgY29kZSAqLworICAvKiAgICBiYXNlIHdhcyBzdHJpcHBlZCB0byB0aGUgYmFyZSBtaW5pbXVtIGFuZCBhbGwgY29uZmlndXJhYmlsaXR5ICAgICAgKi8KKyAgLyogICAgcmVtb3ZlZCBpbiB0aGUgbmFtZSBvZiBzcGVlZCBhbmQgc2ltcGxpY2l0eS4gIFRoZSBjb25maWd1cmFiaWxpdHkgICovCisgIC8qICAgIHdhcyBtYWlubHkgYWltZWQgYXQgbGVnYWN5IGZvbnRzIGxpa2UgQXJpYWwsIFRpbWVzIE5ldyBSb21hbiwgb3IgICAqLworICAvKiAgICBDb3VyaWVyLiAgTGVnYWN5IGZvbnRzIGFyZSBmb250cyB0aGF0IG1vZGlmeSB2ZXJ0aWNhbCBzdGVtcyB0byAgICAgKi8KKyAgLyogICAgYWNoaWV2ZSBjbGVhbiBibGFjay1hbmQtd2hpdGUgYml0bWFwcy4gIFRoZSBuZXcgbW9kZSBmb2N1c2VzIG9uICAgICovCisgIC8qICAgIGFwcGx5aW5nIGEgbWluaW1hbCBzZXQgb2YgcnVsZXMgdG8gYWxsIGZvbnRzIGluZGlzY3JpbWluYXRlbHkgc28gICAqLworICAvKiAgICB0aGF0IG1vZGVybiBhbmQgd2ViIGZvbnRzIHJlbmRlciB3ZWxsIHdoaWxlIGxlZ2FjeSBmb250cyByZW5kZXIgICAgKi8KKyAgLyogICAgb2theS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAzLiBDb21waWxlIGJvdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEJ5IHVuZGVmaW5pbmcgdGhlc2UsIHlvdSBnZXQgcmVuZGVyaW5nIGJlaGF2aW9yIGxpa2Ugb24gV2luZG93cyAgICAgICAqLworICAvKiB3aXRob3V0IENsZWFyVHlwZSwgaS5lLiwgV2luZG93cyBYUCB3aXRob3V0IENsZWFyVHlwZSBlbmFibGVkIGFuZCAgICAgKi8KKyAgLyogV2luOXggKGludGVycHJldGVyIHZlcnNpb24gdjM1KS4gIE9yIG5vdCwgZGVwZW5kaW5nIG9uIGhvdyBtdWNoICAgICAgICovCisgIC8qIGhpbnRpbmcgYmxvb2QgYW5kIHRlc3RpbmcgdGVhcnMgdGhlIGZvbnQgZGVzaWduZXIgcHV0IGludG8gYSBnaXZlbiAgICAqLworICAvKiBmb250LiAgSWYgeW91IGRlZmluZSBvbmUgb3IgYm90aCBzdWJwaXhlbCBoaW50aW5nIG9wdGlvbnMsIHlvdSBjYW4gICAgKi8KKyAgLyogc3dpdGNoIGJldHdlZW4gYmV0d2VlbiB2MzUgYW5kIHRoZSBvbmVzIHlvdSBkZWZpbmUuICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBUaGlzIG9wdGlvbiByZXF1aXJlcyBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSIHRvIGJlICAgICAgKi8KKyAgLyogZGVmaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBbMV0gaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvY2xlYXJ0eXBlL3RydWV0eXBlY2xlYXJ0eXBlLmFzcHggKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAjZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAgMSAgICAgICAgICovCisjZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAgMgorLyogI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgICggMSB8IDIgKSAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9DT01QT05FTlRfT0ZGU0VUX1NDQUxFRCB0byBjb21waWxlIHRoZSAgICAgICAgKi8KKyAgLyogVHJ1ZVR5cGUgZ2x5cGggbG9hZGVyIHRvIHVzZSBBcHBsZSdzIGRlZmluaXRpb24gb2YgaG93IHRvIGhhbmRsZSAgICAgICovCisgIC8qIGNvbXBvbmVudCBvZmZzZXRzIGluIGNvbXBvc2l0ZSBnbHlwaHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQXBwbGUgYW5kIE1TIGRpc2FncmVlIG9uIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIGNvbXBvbmVudCBvZmZzZXRzICAgICovCisgIC8qIGluIGNvbXBvc2l0ZXMuICBBcHBsZSBzYXlzIHRoYXQgdGhleSBzaG91bGQgYmUgc2NhbGVkIGJ5IHRoZSBzY2FsaW5nICAqLworICAvKiBmYWN0b3JzIGluIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggKHJvdWdobHksIGl0J3MgbW9yZSBjb21wbGV4KSAgICAgKi8KKyAgLyogd2hpbGUgTVMgc2F5cyB0aGV5IHNob3VsZCBub3QuICBPcGVuVHlwZSBkZWZpbmVzIHR3byBiaXRzIGluIHRoZSAgICAgICovCisgIC8qIGNvbXBvc2l0ZSBmbGFncyBhcnJheSB3aGljaCBjYW4gYmUgdXNlZCB0byBkaXNhbWJpZ3VhdGUsIGJ1dCBvbGQgICAgICAqLworICAvKiBmb250cyB3aWxsIG5vdCBoYXZlIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvb3RzcGVjL2dseWYuaHRtICAgICAgICAgICAgICAgICAqLworICAvKiAgIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9mb250cy9UcnVlVHlwZS1SZWZlcmVuY2UtTWFudWFsL1JNMDYvQ2hhcDZnbHlmLmh0bWwgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgVFRfQ09ORklHX09QVElPTl9DT01QT05FTlRfT0ZGU0VUX1NDQUxFRAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVCBpZiB5b3Ugd2FudCB0byBpbmNsdWRlICAgICAgICAgKi8KKyAgLyogc3VwcG9ydCBmb3IgQXBwbGUncyBkaXN0b3J0YWJsZSBmb250IHRlY2hub2xvZ3kgKGZ2YXIsIGd2YXIsIGN2YXIsICAgICovCisgIC8qIGFuZCBhdmFyIHRhYmxlcykuICBUaGlzIGhhcyBtYW55IHNpbWlsYXJpdGllcyB0byBUeXBlIDEgTXVsdGlwbGUgICAgICAqLworICAvKiBNYXN0ZXJzIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9CREYgaWYgeW91IHdhbnQgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciAgICAgICAgKi8KKyAgLyogYW4gZW1iZWRkZWQgYEJERiAnIHRhYmxlIHdpdGhpbiBTRk5ULWJhc2VkIGJpdG1hcCBmb3JtYXRzLiAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI3VuZGVmIFRUX0NPTkZJR19PUFRJT05fQkRGCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIE9wdGlvbiBUVF9DT05GSUdfT1BUSU9OX01BWF9SVU5OQUJMRV9PUENPREVTIGNvbnRyb2xzIHRoZSBtYXhpbXVtICAgICAqLworICAvKiBudW1iZXIgb2YgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkIGZvciBhIHNpbmdsZSBydW4gb2YgdGhlICAgICAgKi8KKyAgLyogYnl0ZWNvZGUgaW50ZXJwcmV0ZXIsIG5lZWRlZCB0byBwcmV2ZW50IGluZmluaXRlIGxvb3BzLiAgWW91IGRvbid0ICAgICovCisgIC8qIHdhbnQgdG8gY2hhbmdlIHRoaXMgZXhjZXB0IGZvciB2ZXJ5IHNwZWNpYWwgc2l0dWF0aW9ucyAoZS5nLiwgbWFraW5nICAqLworICAvKiBhIGxpYnJhcnkgZnV6emVyIHNwZW5kIGxlc3MgdGltZSB0byBoYW5kbGUgYnJva2VuIGZvbnRzKS4gICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIEl0IGlzIG5vdCBleHBlY3RlZCB0aGF0IHRoaXMgdmFsdWUgaXMgZXZlciBtb2RpZmllZCBieSBhIGNvbmZpZ3VyaW5nICAqLworICAvKiBzY3JpcHQ7IGluc3RlYWQsIGl0IGdldHMgc3Vycm91bmRlZCB3aXRoICNpZm5kZWYgLi4uICNlbmRpZiBzbyB0aGF0ICAgKi8KKyAgLyogdGhlIHZhbHVlIGNhbiBiZSBzZXQgYXMgYSBwcmVwcm9jZXNzb3Igb3B0aW9uIG9uIHRoZSBjb21waWxlcidzICAgICAgICovCisgIC8qIGNvbW1hbmQgbGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZm5kZWYgVFRfQ09ORklHX09QVElPTl9NQVhfUlVOTkFCTEVfT1BDT0RFUworI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX01BWF9SVU5OQUJMRV9PUENPREVTICAxMDAwMDAwTAorI2VuZGlmCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgIFQgWSBQIEUgMSAgIEQgUiBJIFYgRSBSICAgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4gICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVDFfTUFYX0RJQ1RfREVQVEggaXMgdGhlIG1heGltdW0gZGVwdGggb2YgbmVzdCBkaWN0aW9uYXJpZXMgYW5kICAgICAgICovCisgIC8qIGFycmF5cyBpbiB0aGUgVHlwZSAxIHN0cmVhbSAoc2VlIHQxbG9hZC5jKS4gIEEgbWluaW11bSBvZiA0IGlzICAgICAgICAqLworICAvKiByZXF1aXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFQxX01BWF9ESUNUX0RFUFRIICA1CisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFQxX01BWF9TVUJSU19DQUxMUyBkZXRhaWxzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBuZXN0ZWQgc3ViLXJvdXRpbmUgICAqLworICAvKiBjYWxscyBkdXJpbmcgZ2x5cGggbG9hZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFQxX01BWF9TVUJSU19DQUxMUyAgMTYKKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVDFfTUFYX0NIQVJTVFJJTkdfT1BFUkFORFMgaXMgdGhlIGNoYXJzdHJpbmcgc3RhY2sncyBjYXBhY2l0eS4gIEEgICAgICovCisgIC8qIG1pbmltdW0gb2YgMTYgaXMgcmVxdWlyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhlIENoaW5lc2UgZm9udCBNaW5nVGlFRy1NZWRpdW0gKENOUyAxMTY0MyBjaGFyYWN0ZXIgc2V0KSBuZWVkcyAyNTYuICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBUMV9NQVhfQ0hBUlNUUklOR1NfT1BFUkFORFMgIDUxMgorCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBEZWZpbmUgdGhpcyBjb25maWd1cmF0aW9uIG1hY3JvIGlmIHlvdSB3YW50IHRvIHByZXZlbnQgdGhlICAgICAgICAgICAgKi8KKyAgLyogY29tcGlsYXRpb24gb2YgYHQxYWZtJywgd2hpY2ggaXMgaW4gY2hhcmdlIG9mIHJlYWRpbmcgVHlwZSAxIEFGTSAgICAgICovCisgIC8qIGZpbGVzIGludG8gYW4gZXhpc3RpbmcgZmFjZS4gIE5vdGUgdGhhdCBpZiBzZXQsIHRoZSBUMSBkcml2ZXIgd2lsbCBiZSAqLworICAvKiB1bmFibGUgdG8gcHJvZHVjZSBrZXJuaW5nIGRpc3RhbmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgVDFfQ09ORklHX09QVElPTl9OT19BRk0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogRGVmaW5lIHRoaXMgY29uZmlndXJhdGlvbiBtYWNybyBpZiB5b3Ugd2FudCB0byBwcmV2ZW50IHRoZSAgICAgICAgICAgICovCisgIC8qIGNvbXBpbGF0aW9uIG9mIHRoZSBNdWx0aXBsZSBNYXN0ZXJzIGZvbnQgc3VwcG9ydCBpbiB0aGUgVHlwZSAxICAgICAgICAqLworICAvKiBkcml2ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjdW5kZWYgVDFfQ09ORklHX09QVElPTl9OT19NTV9TVVBQT1JUCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKiAgICAgICAgIEMgRiBGICAgRCBSIEkgViBFIFIgICAgQyBPIE4gRiBJIEcgVSBSIEEgVCBJIE8gTiAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVXNpbmcgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl97WCxZfXsxLDIsMyw0fSBpdCBpcyAgICAgICovCisgIC8qIHBvc3NpYmxlIHRvIHNldCB1cCB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgdGhlIGZvdXIgY29udHJvbCBwb2ludHMgdGhhdCAqLworICAvKiBkZWZpbmUgdGhlIHN0ZW0gZGFya2VuaW5nIGJlaGF2aW91ciBvZiB0aGUgKG5ldykgQ0ZGIGVuZ2luZS4gIEZvciAgICAgKi8KKyAgLyogbW9yZSBkZXRhaWxzIHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIGBkYXJrZW5pbmctcGFyYW1ldGVycycgcHJvcGVydHkgb2YgdGhlIGNmZiBkcml2ZXIgbW9kdWxlIChmaWxlICAgICAgICAqLworICAvKiBgZnRjZmZkcnYuaCcpLCB3aGljaCBhbGxvd3MgdGhlIGNvbnRyb2wgYXQgcnVuLXRpbWUuICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIERvICpub3QqIHVuZGVmaW5lIHRoZXNlIG1hY3JvcyEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMSAgIDUwMAorI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kxICAgNDAwCisKKyNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMiAgMTAwMAorI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kyICAgMjc1CisKKyNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMyAgMTY2NworI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kzICAgMjc1CisKKyNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YNCAgMjMzMworI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1k0ICAgICAwCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUgY29udHJvbHMgd2hldGhlciB0aGUgcHJlLUFkb2JlIENGRiAgICAgICAqLworICAvKiBlbmdpbmUgZ2V0cyBjb21waWxlZCBpbnRvIEZyZWVUeXBlLiAgSWYgZGVmaW5lZCwgaXQgaXMgcG9zc2libGUgdG8gICAgKi8KKyAgLyogc3dpdGNoIGJldHdlZW4gdGhlIHR3byBlbmdpbmVzIHVzaW5nIHRoZSBgaGludGluZy1lbmdpbmUnIHByb3BlcnR5IG9mICovCisgIC8qIHRoZSBjZmYgZHJpdmVyIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICNkZWZpbmUgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORSAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgICAgICBQIEMgRiAgIEQgUiBJIFYgRSBSICAgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4gICAgICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZXJlIGFyZSBtYW55IFBDRiBmb250cyBqdXN0IGNhbGxlZCBgRml4ZWQnIHdoaWNoIGxvb2sgY29tcGxldGVseSAgICAqLworICAvKiBkaWZmZXJlbnQsIGFuZCB3aGljaCBoYXZlIG5vdGhpbmcgdG8gZG8gd2l0aCBlYWNoIG90aGVyLiAgV2hlbiAgICAgICAgKi8KKyAgLyogc2VsZWN0aW5nIGBGaXhlZCcgaW4gS0RFIG9yIEdub21lIG9uZSBnZXRzIHJlc3VsdHMgdGhhdCBhcHBlYXIgcmF0aGVyICovCisgIC8qIHJhbmRvbSwgdGhlIHN0eWxlIGNoYW5nZXMgb2Z0ZW4gaWYgb25lIGNoYW5nZXMgdGhlIHNpemUgYW5kIG9uZSAgICAgICAqLworICAvKiBjYW5ub3Qgc2VsZWN0IHNvbWUgZm9udHMgYXQgYWxsLiAgVGhpcyBvcHRpb24gbWFrZXMgdGhlIFBDRiBtb2R1bGUgICAgKi8KKyAgLyogcHJlcGVuZCB0aGUgZm91bmRyeSBuYW1lIChwbHVzIGEgc3BhY2UpIHRvIHRoZSBmYW1pbHkgbmFtZS4gICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBXZSBhbHNvIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBgd2lkZScgY2hhcmFjdGVyczsgYWxsIHB1dCB0b2dldGhlciwgd2UgKi8KKyAgLyogZ2V0IGZhbWlseSBuYW1lcyBsaWtlIGBTb255IEZpeGVkJyBvciBgTWlzYyBGaXhlZCBXaWRlJy4gICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBJZiB0aGlzIG9wdGlvbiBpcyBhY3RpdmF0ZWQsIGl0IGNhbiBiZSBjb250cm9sbGVkIHdpdGggdGhlICAgICAgICAgICAgKi8KKyAgLyogYG5vLWxvbmctZmFtaWx5LW5hbWVzJyBwcm9wZXJ0eSBvZiB0aGUgcGNmIGRyaXZlciBtb2R1bGUuICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogI2RlZmluZSBQQ0ZfQ09ORklHX09QVElPTl9MT05HX0ZBTUlMWV9OQU1FUyAqLworCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KKyAgLyoqKiogICAgQSBVIFQgTyBGIEkgVCAgIE0gTyBEIFUgTCBFICAgIEMgTyBOIEYgSSBHIFUgUiBBIFQgSSBPIE4gICAgICoqKiovCisgIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIENvbXBpbGUgYXV0b2ZpdCBtb2R1bGUgd2l0aCBDSksgKENoaW5lc2UsIEphcGFuZXNlLCBLb3JlYW4pIHNjcmlwdCAgICAqLworICAvKiBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEFGX0NPTkZJR19PUFRJT05fQ0pLCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiBDb21waWxlIGF1dG9maXQgbW9kdWxlIHdpdGggZmFsbGJhY2sgSW5kaWMgc2NyaXB0IHN1cHBvcnQsIGNvdmVyaW5nICAgKi8KKyAgLyogc29tZSBzY3JpcHRzIHRoYXQgdGhlIGBsYXRpbicgc3VibW9kdWxlIG9mIHRoZSBhdXRvZml0IG1vZHVsZSBkb2Vzbid0ICovCisgIC8qICh5ZXQpIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQUZfQ09ORklHX09QVElPTl9JTkRJQworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogQ29tcGlsZSBhdXRvZml0IG1vZHVsZSB3aXRoIHdhcnAgaGludGluZy4gIFRoZSBpZGVhIG9mIHRoZSB3YXJwaW5nICAgICovCisgIC8qIGNvZGUgaXMgdG8gc2xpZ2h0bHkgc2NhbGUgYW5kIHNoaWZ0IGEgZ2x5cGggd2l0aGluIGEgc2luZ2xlIGRpbWVuc2lvbiAqLworICAvKiBzbyB0aGF0IGFzIG11Y2ggb2YgaXRzIHNlZ21lbnRzIGFyZSBhbGlnbmVkIChtb3JlIG9yIGxlc3MpIG9uIHRoZSAgICAgKi8KKyAgLyogZ3JpZC4gIFRvIGZpbmQgb3V0IHRoZSBvcHRpbWFsIHNjYWxpbmcgYW5kIHNoaWZ0aW5nIHZhbHVlLCB2YXJpb3VzICAgICovCisgIC8qIHBhcmFtZXRlciBjb21iaW5hdGlvbnMgYXJlIHRyaWVkIGFuZCBzY29yZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhpcyBleHBlcmltZW50YWwgb3B0aW9uIGlzIGFjdGl2ZSBvbmx5IGlmIHRoZSByZW5kZXJpbmcgbW9kZSBpcyAgICAgICovCisgIC8qIEZUX1JFTkRFUl9NT0RFX0xJR0hUOyB5b3UgY2FuIHN3aXRjaCB3YXJwaW5nIG9uIGFuZCBvZmYgd2l0aCB0aGUgICAgICAqLworICAvKiBgd2FycGluZycgcHJvcGVydHkgb2YgdGhlIGF1dG8taGludGVyIChzZWUgZmlsZSBgZnRhdXRvaC5oJyBmb3IgbW9yZSAgKi8KKyAgLyogaW5mb3JtYXRpb247IGJ5IGRlZmF1bHQgaXQgaXMgc3dpdGNoZWQgb2ZmKS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVIKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFVzZSBUcnVlVHlwZS1saWtlIHNpemUgbWV0cmljcyBmb3IgYGxpZ2h0JyBhdXRvLWhpbnRpbmcuICAgICAgICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gYXZvaWQgdGhpcyBvcHRpb24sIHdoaWNoIGV4aXN0cyBvbmx5IHRvICovCisgIC8qIGhlbHAgc29tZSBsZWdhY3kgYXBwbGljYXRpb25zIHJldGFpbiBpdHMgYXBwZWFyYW5jZSBhbmQgYmVoYXZpb3VyICAgICAqLworICAvKiB3aXRoIHJlc3BlY3QgdG8gYXV0by1oaW50ZWQgVHJ1ZVR5cGUgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qIFRoZSB2ZXJ5IHJlYXNvbiB0aGlzIG9wdGlvbiBleGlzdHMgYXQgYWxsIGFyZSBHTlUvTGludXggZGlzdHJpYnV0aW9ucyAqLworICAvKiBsaWtlIEZlZG9yYSB0aGF0IGRpZCBub3QgdW4tcGF0Y2ggdGhlIGZvbGxvd2luZyBjaGFuZ2UgKHdoaWNoIHdhcyAgICAgKi8KKyAgLyogcHJlc2VudCBpbiBGcmVlVHlwZSBiZXR3ZWVuIHZlcnNpb25zIDIuNC42IGFuZCAyLjcuMSwgaW5jbHVzaXZlKS4gICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAvKiAgIDIwMTEtMDctMTYgIFN0ZXZlbiBDaHUgIDxzdGV2ZW4uZi5jaHVAZ21haWwuY29tPiAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgIC8qICAgICBbdHJ1ZXR5cGVdIEZpeCBtZXRyaWNzIG9uIHNpemUgcmVxdWVzdCBmb3Igc2NhbGFibGUgZm9udHMuICAgICAgICAqLworICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgLyogVGhpcyBwcm9ibGVtYXRpYyBjb21taXQgaXMgbm93IHJldmVydGVkIChtb3JlIG9yIGxlc3MpLiAgICAgICAgICAgICAgICovCisgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogI2RlZmluZSBBRl9DT05GSUdfT1BUSU9OX1RUX1NJWkVfTUVUUklDUyAqLworCisgIC8qICovCisKKworICAvKgorICAgKiBUaGlzIG1hY3JvIGlzIG9ic29sZXRlLiAgU3VwcG9ydCBoYXMgYmVlbiByZW1vdmVkIGluIEZyZWVUeXBlCisgICAqIHZlcnNpb24gMi41LgorICAgKi8KKy8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9PTERfSU5URVJOQUxTICovCisKKworICAvKgorICAgKiBUaGlzIG1hY3JvIGlzIGRlZmluZWQgaWYgbmF0aXZlIFRydWVUeXBlIGhpbnRpbmcgaXMgcmVxdWVzdGVkIGJ5IHRoZQorICAgKiBkZWZpbml0aW9ucyBhYm92ZS4KKyAgICovCisjaWZkZWYgVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUgorI2RlZmluZSAgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCisKKyNpZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgJiAxCisjZGVmaW5lICBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfSU5GSU5BTElUWQorI2VuZGlmCisKKyNpZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgJiAyCisjZGVmaW5lICBUVF9TVVBQT1JUX1NVQlBJWEVMX0hJTlRJTkdfTUlOSU1BTAorI2VuZGlmCisjZW5kaWYKKworCisgIC8qCisgICAqIENoZWNrIENGRiBkYXJrZW5pbmcgcGFyYW1ldGVycy4gIFRoZSBjaGVja3MgYXJlIHRoZSBzYW1lIGFzIGluIGZ1bmN0aW9uCisgICAqIGBjZmZfcHJvcGVydHlfc2V0JyBpbiBmaWxlIGBjZmZkcml2ci5jJy4KKyAgICovCisjaWYgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMSA8IDAgICB8fCBcCisgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMiA8IDAgICB8fCBcCisgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMyA8IDAgICB8fCBcCisgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YNCA8IDAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9ZMSA8IDAgICB8fCBcCisgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9ZMiA8IDAgICB8fCBcCisgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9ZMyA8IDAgICB8fCBcCisgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9ZNCA8IDAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMSA+ICAgICAgICBcCisgICAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gyICAgICB8fCBcCisgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMiA+ICAgICAgICBcCisgICAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gzICAgICB8fCBcCisgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMyA+ICAgICAgICBcCisgICAgICBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1g0ICAgICB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9ZMSA+IDUwMCB8fCBcCisgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9ZMiA+IDUwMCB8fCBcCisgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9ZMyA+IDUwMCB8fCBcCisgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9ZNCA+IDUwMAorI2Vycm9yICJJbnZhbGlkIENGRiBkYXJrZW5pbmcgcGFyYW1ldGVycyEiCisjZW5kaWYKKworRlRfRU5EX0hFQURFUgorCisKKyNlbmRpZiAvKiBGVE9QVElPTl9IXyAqLworCisKKy8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0ZDc5OTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRjb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNvbmZpZy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQU5TSS1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGZpbGUgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIGEgbnVtYmVyIG9mIG1hY3JvIGRlZmluaXRpb25zIHRoYXQgYXJlIHVzZWQgKi8KLSAgLyogYnkgdGhlIHJlc3Qgb2YgdGhlIGVuZ2luZS4gIE1vc3Qgb2YgdGhlIG1hY3JvcyBoZXJlIGFyZSBhdXRvbWF0aWNhbGx5ICovCi0gIC8qIGRldGVybWluZWQgYXQgY29tcGlsZSB0aW1lLCBhbmQgeW91IHNob3VsZCBub3QgbmVlZCB0byBjaGFuZ2UgaXQgdG8gICAqLwotICAvKiBwb3J0IEZyZWVUeXBlLCBleGNlcHQgdG8gY29tcGlsZSB0aGUgbGlicmFyeSB3aXRoIGEgbm9uLUFOU0kgICAgICAgICAgKi8KLSAgLyogY29tcGlsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlIGhvd2V2ZXIgdGhhdCBpZiBzb21lIHNwZWNpZmljIG1vZGlmaWNhdGlvbnMgYXJlIG5lZWRlZCwgd2UgICAgICAgKi8KLSAgLyogYWR2aXNlIHlvdSB0byBwbGFjZSBhIG1vZGlmaWVkIGNvcHkgaW4geW91ciBidWlsZCBkaXJlY3RvcnkuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgYnVpbGQgZGlyZWN0b3J5IGlzIHVzdWFsbHkgYGJ1aWxkcy88c3lzdGVtPicsIGFuZCBjb250YWlucyAgICAgICAgKi8KLSAgLyogc3lzdGVtLXNwZWNpZmljIGZpbGVzIHRoYXQgYXJlIGFsd2F5cyBpbmNsdWRlZCBmaXJzdCB3aGVuIGJ1aWxkaW5nICAgICovCi0gIC8qIHRoZSBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBBTlNJIHZlcnNpb24gc2hvdWxkIHN0YXkgaW4gYGluY2x1ZGUvY29uZmlnLycuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0ZUQ09ORklHX0hfXwotI2RlZmluZSBfX0ZUQ09ORklHX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NPTkZJR19PUFRJT05TX0gKLSNpbmNsdWRlIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBQTEFURk9STS1TUEVDSUZJQyBDT05GSUdVUkFUSU9OIE1BQ1JPUyAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVzZSBtYWNyb3MgY2FuIGJlIHRvZ2dsZWQgdG8gc3VpdCBhIHNwZWNpZmljIHN5c3RlbS4gIFRoZSBjdXJyZW50ICAgKi8KLSAgLyogb25lcyBhcmUgZGVmYXVsdHMgdXNlZCB0byBjb21waWxlIEZyZWVUeXBlIGluIGFuIEFOU0kgQyBlbnZpcm9ubWVudCAgICovCi0gIC8qICgxNmJpdCBjb21waWxlcnMgYXJlIGFsc28gc3VwcG9ydGVkKS4gIENvcHkgdGhpcyBmaWxlIHRvIHlvdXIgb3duICAgICAqLwotICAvKiBgYnVpbGRzLzxzeXN0ZW0+JyBkaXJlY3RvcnksIGFuZCBlZGl0IGl0IHRvIHBvcnQgdGhlIGVuZ2luZS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogVGhlcmUgYXJlIHN5c3RlbXMgKGxpa2UgdGhlIFRleGFzIEluc3RydW1lbnRzICdDNTR4KSB3aGVyZSBhIGBjaGFyJyAqLwotICAvKiBoYXMgMTYgYml0cy4gIEFOU0kgQyBzYXlzIHRoYXQgc2l6ZW9mKGNoYXIpIGlzIGFsd2F5cyAxLiAgU2luY2UgYW4gICovCi0gIC8qIGBpbnQnIGhhcyAxNiBiaXRzIGFsc28gZm9yIHRoaXMgc3lzdGVtLCBzaXplb2YoaW50KSBnaXZlcyAxIHdoaWNoICAgKi8KLSAgLyogaXMgcHJvYmFibHkgdW5leHBlY3RlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIGBDSEFSX0JJVCcgKGRlZmluZWQgaW4gbGltaXRzLmgpIGdpdmVzIHRoZSBudW1iZXIgb2YgYml0cyBpbiBhICAgICAgKi8KLSAgLyogYGNoYXInIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZuZGVmIEZUX0NIQVJfQklUCi0jZGVmaW5lIEZUX0NIQVJfQklUICBDSEFSX0JJVAotI2VuZGlmCi0KLQotICAvKiBUaGUgc2l6ZSBvZiBhbiBgaW50JyB0eXBlLiAgKi8KLSNpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJTlRfTUFYID09IDB4RkZGRlVMCi0jZGVmaW5lIEZUX1NJWkVPRl9JTlQgICgxNiAvIEZUX0NIQVJfQklUKQotI2VsaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUlOVF9NQVggPT0gMHhGRkZGRkZGRlVMCi0jZGVmaW5lIEZUX1NJWkVPRl9JTlQgICgzMiAvIEZUX0NIQVJfQklUKQotI2VsaWYgRlRfVUlOVF9NQVggPiAweEZGRkZGRkZGVUwgJiYgRlRfVUlOVF9NQVggPT0gMHhGRkZGRkZGRkZGRkZGRkZGVUwKLSNkZWZpbmUgRlRfU0laRU9GX0lOVCAgKDY0IC8gRlRfQ0hBUl9CSVQpCi0jZWxzZQotI2Vycm9yICJVbnN1cHBvcnRlZCBzaXplIG9mIGBpbnQnIHR5cGUhIgotI2VuZGlmCi0KLSAgLyogVGhlIHNpemUgb2YgYSBgbG9uZycgdHlwZS4gIEEgZml2ZS1ieXRlIGBsb25nJyAoYXMgdXNlZCBlLmcuIG9uIHRoZSAqLwotICAvKiBETTY0MikgaXMgcmVjb2duaXplZCBidXQgYXZvaWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxPTkdfTUFYID09IDB4RkZGRkZGRkZVTAotI2RlZmluZSBGVF9TSVpFT0ZfTE9ORyAgKDMyIC8gRlRfQ0hBUl9CSVQpCi0jZWxpZiBGVF9VTE9OR19NQVggPiAweEZGRkZGRkZGVUwgJiYgRlRfVUxPTkdfTUFYID09IDB4RkZGRkZGRkZGRlVMCi0jZGVmaW5lIEZUX1NJWkVPRl9MT05HICAoMzIgLyBGVF9DSEFSX0JJVCkKLSNlbGlmIEZUX1VMT05HX01BWCA+IDB4RkZGRkZGRkZVTCAmJiBGVF9VTE9OR19NQVggPT0gMHhGRkZGRkZGRkZGRkZGRkZGVUwKLSNkZWZpbmUgRlRfU0laRU9GX0xPTkcgICg2NCAvIEZUX0NIQVJfQklUKQotI2Vsc2UKLSNlcnJvciAiVW5zdXBwb3J0ZWQgc2l6ZSBvZiBgbG9uZycgdHlwZSEiCi0jZW5kaWYKLQotCi0gIC8qIEZUX1VOVVNFRCBpcyBhIG1hY3JvIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGdpdmVuIHBhcmFtZXRlciBpcyBub3QgICovCi0gIC8qIHVzZWQgLS0gdGhpcyBpcyBvbmx5IHVzZWQgdG8gZ2V0IHJpZCBvZiB1bnBsZWFzYW50IGNvbXBpbGVyIHdhcm5pbmdzICovCi0jaWZuZGVmIEZUX1VOVVNFRAotI2RlZmluZSBGVF9VTlVTRUQoIGFyZyApICAoIChhcmcpID0gKGFyZykgKQotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgQVVUT01BVElDIENPTkZJR1VSQVRJT04gTUFDUk9TICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlc2UgbWFjcm9zIGFyZSBjb21wdXRlZCBmcm9tIHRoZSBvbmVzIGRlZmluZWQgYWJvdmUuICBEb24ndCB0b3VjaCAgICovCi0gIC8qIHRoZWlyIGRlZmluaXRpb24sIHVubGVzcyB5b3Uga25vdyBwcmVjaXNlbHkgd2hhdCB5b3UgYXJlIGRvaW5nLiAgTm8gICAqLwotICAvKiBwb3J0ZXIgc2hvdWxkIG5lZWQgdG8gbWVzcyB3aXRoIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNYWMgc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhpcyBpcyB0aGUgb25seSBuZWNlc3NhcnkgY2hhbmdlLCBzbyBpdCBpcyBkZWZpbmVkIGhlcmUgaW5zdGVhZCAgICAqLwotICAvKiAgIHByb3ZpZGluZyBhIG5ldyBjb25maWd1cmF0aW9uIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWYgZGVmaW5lZCggX19BUFBMRV9fICkgfHwgKCBkZWZpbmVkKCBfX01XRVJLU19fICkgJiYgZGVmaW5lZCggbWFjaW50b3NoICkgKQotICAvKiBubyBDYXJib24gZnJhbWV3b3JrcyBmb3IgNjRiaXQgMTAuNC54ICovCi0gIC8qIEF2YWlsYWJpbGl0eU1hY3Jvcy5oIGlzIGF2YWlsYWJsZSBzaW5jZSBNYWMgT1MgWCAxMC4yLCAgICAgICAgKi8KLSAgLyogc28gZ3Vlc3MgdGhlIHN5c3RlbSB2ZXJzaW9uIGJ5IG1heGltdW0gZXJybm8gYmVmb3JlIGluY2x1c2lvbiAqLwotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaWZkZWYgRUNBTkNFTEVEIC8qIGRlZmluZWQgc2luY2UgMTAuMiAqLwotI2luY2x1ZGUgIkF2YWlsYWJpbGl0eU1hY3Jvcy5oIgotI2VuZGlmCi0jaWYgZGVmaW5lZCggX19MUDY0X18gKSAmJiBcCi0gICAgKCBNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA8PSBNQUNfT1NfWF9WRVJTSU9OXzEwXzQgKQotI3VuZGVmIEZUX01BQ0lOVE9TSAotI2VuZGlmCi0KLSNlbGlmIGRlZmluZWQoIF9fU0NfXyApIHx8IGRlZmluZWQoIF9fTVJDX18gKQotICAvKiBDbGFzc2ljIE1hY09TIGNvbXBpbGVycyAqLwotI2luY2x1ZGUgIkNvbmRpdGlvbmFsTWFjcm9zLmgiCi0jaWYgVEFSR0VUX09TX01BQwotI2RlZmluZSBGVF9NQUNJTlRPU0ggMQotI2VuZGlmCi0KLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzaWNfdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgYSAxNmJpdCBzaWduZWQgaW50ZWdlciB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzaWduZWQgc2hvcnQgIEZUX0ludDE2OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBhIDE2Yml0IHVuc2lnbmVkIGludGVnZXIgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBGVF9VSW50MTY7Ci0KLSAgLyogKi8KLQotCi0gIC8qIHRoaXMgI2lmIDAgLi4uICNlbmRpZiBjbGF1c2UgaXMgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMgKi8KLSNpZiAwCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBhIDMyYml0IHNpZ25lZCBpbnRlZ2VyIHR5cGUuICBUaGUgc2l6ZSBkZXBlbmRzIG9uICAgICovCi0gIC8qICAgIHRoZSBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzaWduZWQgWFhYICBGVF9JbnQzMjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBhIDMyYml0IHVuc2lnbmVkIGludGVnZXIgdHlwZS4gIFRoZSBzaXplIGRlcGVuZHMgb24gICovCi0gIC8qICAgIHRoZSBjb25maWd1cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB1bnNpZ25lZCBYWFggIEZUX1VJbnQzMjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ludDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBhIDY0Yml0IHNpZ25lZCBpbnRlZ2VyIHR5cGUuICBUaGUgc2l6ZSBkZXBlbmRzIG9uICAgICovCi0gIC8qICAgIHRoZSBjb25maWd1cmF0aW9uLiAgT25seSBkZWZpbmVkIGlmIHRoZXJlIGlzIHJlYWwgNjRiaXQgc3VwcG9ydDsgICAqLwotICAvKiAgICBvdGhlcndpc2UsIGl0IGdldHMgZW11bGF0ZWQgd2l0aCBhIHN0cnVjdHVyZSAoaWYgbmVjZXNzYXJ5KS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc2lnbmVkIFhYWCAgRlRfSW50NjQ7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VSW50NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgYSA2NGJpdCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUuICBUaGUgc2l6ZSBkZXBlbmRzIG9uICAqLwotICAvKiAgICB0aGUgY29uZmlndXJhdGlvbi4gIE9ubHkgZGVmaW5lZCBpZiB0aGVyZSBpcyByZWFsIDY0Yml0IHN1cHBvcnQ7ICAgKi8KLSAgLyogICAgb3RoZXJ3aXNlLCBpdCBnZXRzIGVtdWxhdGVkIHdpdGggYSBzdHJ1Y3R1cmUgKGlmIG5lY2Vzc2FyeSkuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHVuc2lnbmVkIFhYWCAgRlRfVUludDY0OwotCi0gIC8qICovCi0KLSNlbmRpZgotCi0jaWYgRlRfU0laRU9GX0lOVCA9PSAoMzIgLyBGVF9DSEFSX0JJVCkKLQotICB0eXBlZGVmIHNpZ25lZCBpbnQgICAgICBGVF9JbnQzMjsKLSAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgRlRfVUludDMyOwotCi0jZWxpZiBGVF9TSVpFT0ZfTE9ORyA9PSAoMzIgLyBGVF9DSEFSX0JJVCkKLQotICB0eXBlZGVmIHNpZ25lZCBsb25nICAgICBGVF9JbnQzMjsKLSAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgRlRfVUludDMyOwotCi0jZWxzZQotI2Vycm9yICJubyAzMmJpdCB0eXBlIGZvdW5kIC0tIHBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZXMiCi0jZW5kaWYKLQotCi0gIC8qIGxvb2sgdXAgYW4gaW50ZWdlciB0eXBlIHRoYXQgaXMgYXQgbGVhc3QgMzIgYml0cyAqLwotI2lmIEZUX1NJWkVPRl9JTlQgPj0gKDMyIC8gRlRfQ0hBUl9CSVQpCi0KLSAgdHlwZWRlZiBpbnQgICAgICAgICAgICBGVF9GYXN0OwotICB0eXBlZGVmIHVuc2lnbmVkIGludCAgIEZUX1VGYXN0OwotCi0jZWxpZiBGVF9TSVpFT0ZfTE9ORyA+PSAoMzIgLyBGVF9DSEFSX0JJVCkKLQotICB0eXBlZGVmIGxvbmcgICAgICAgICAgIEZUX0Zhc3Q7Ci0gIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgRlRfVUZhc3Q7Ci0KLSNlbmRpZgotCi0KLSAgLyogZGV0ZXJtaW5lIHdoZXRoZXIgd2UgaGF2ZSBhIDY0LWJpdCBpbnQgdHlwZSBmb3IgcGxhdGZvcm1zIHdpdGhvdXQgKi8KLSAgLyogQXV0b2NvbmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZiBGVF9TSVpFT0ZfTE9ORyA9PSAoNjQgLyBGVF9DSEFSX0JJVCkKLQotICAvKiBGVF9MT05HNjQgbXVzdCBiZSBkZWZpbmVkIGlmIGEgNjQtYml0IHR5cGUgaXMgYXZhaWxhYmxlICovCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgIGxvbmcKLSNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBsb25nCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIDY0LWJpdCBkYXRhIHR5cGUgbWF5IGNyZWF0ZSBjb21waWxhdGlvbiBwcm9ibGVtcyBpZiB5b3UgY29tcGlsZSAgICAgKi8KLSAgLyogaW4gc3RyaWN0IEFOU0kgbW9kZS4gIFRvIGF2b2lkIHRoZW0sIHdlIGRpc2FibGUgb3RoZXIgNjQtYml0IGRhdGEgICAgICovCi0gIC8qIHR5cGVzIGlmIF9fU1REQ19fIGlzIGRlZmluZWQuICBZb3UgY2FuIGhvd2V2ZXIgaWdub3JlIHRoaXMgcnVsZSAgICAgICAqLwotICAvKiBieSBkZWZpbmluZyB0aGUgRlRfQ09ORklHX09QVElPTl9GT1JDRV9JTlQ2NCBjb25maWd1cmF0aW9uIG1hY3JvLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZWxpZiAhZGVmaW5lZCggX19TVERDX18gKSB8fCBkZWZpbmVkKCBGVF9DT05GSUdfT1BUSU9OX0ZPUkNFX0lOVDY0ICkKLQotI2lmIGRlZmluZWQoIF9NU0NfVkVSICkgJiYgX01TQ19WRVIgPj0gOTAwICAvKiBWaXN1YWwgQysrIChhbmQgSW50ZWwgQysrKSAqLwotCi0gIC8qIHRoaXMgY29tcGlsZXIgcHJvdmlkZXMgdGhlIF9faW50NjQgdHlwZSAqLwotI2RlZmluZSBGVF9MT05HNjQKLSNkZWZpbmUgRlRfSU5UNjQgICBfX2ludDY0Ci0jZGVmaW5lIEZUX1VJTlQ2NCAgdW5zaWduZWQgX19pbnQ2NAotCi0jZWxpZiBkZWZpbmVkKCBfX0JPUkxBTkRDX18gKSAgLyogQm9ybGFuZCBDKysgKi8KLQotICAvKiBYWFhYOiBXZSBzaG91bGQgcHJvYmFibHkgY2hlY2sgdGhlIHZhbHVlIG9mIF9fQk9STEFORENfXyBpbiBvcmRlciAqLwotICAvKiAgICAgICB0byB0ZXN0IHRoZSBjb21waWxlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIHRoaXMgY29tcGlsZXIgcHJvdmlkZXMgdGhlIF9faW50NjQgdHlwZSAqLwotI2RlZmluZSBGVF9MT05HNjQKLSNkZWZpbmUgRlRfSU5UNjQgICBfX2ludDY0Ci0jZGVmaW5lIEZUX1VJTlQ2NCAgdW5zaWduZWQgX19pbnQ2NAotCi0jZWxpZiBkZWZpbmVkKCBfX1dBVENPTUNfXyApICAgLyogV2F0Y29tIEMrKyAqLwotCi0gIC8qIFdhdGNvbSBkb2Vzbid0IHByb3ZpZGUgNjQtYml0IGRhdGEgdHlwZXMgKi8KLQotI2VsaWYgZGVmaW5lZCggX19NV0VSS1NfXyApICAgIC8qIE1ldHJvd2Vya3MgQ29kZVdhcnJpb3IgKi8KLQotI2RlZmluZSBGVF9MT05HNjQKLSNkZWZpbmUgRlRfSU5UNjQgICBsb25nIGxvbmcgaW50Ci0jZGVmaW5lIEZUX1VJTlQ2NCAgdW5zaWduZWQgbG9uZyBsb25nIGludAotCi0jZWxpZiBkZWZpbmVkKCBfX0dOVUNfXyApCi0KLSAgLyogR0NDIHByb3ZpZGVzIHRoZSBgbG9uZyBsb25nJyB0eXBlICovCi0jZGVmaW5lIEZUX0xPTkc2NAotI2RlZmluZSBGVF9JTlQ2NCAgIGxvbmcgbG9uZyBpbnQKLSNkZWZpbmUgRlRfVUlOVDY0ICB1bnNpZ25lZCBsb25nIGxvbmcgaW50Ci0KLSNlbmRpZiAvKiBfTVNDX1ZFUiAqLwotCi0jZW5kaWYgLyogRlRfU0laRU9GX0xPTkcgPT0gKDY0IC8gRlRfQ0hBUl9CSVQpICovCi0KLSNpZmRlZiBGVF9MT05HNjQKLSAgdHlwZWRlZiBGVF9JTlQ2NCAgIEZUX0ludDY0OwotICB0eXBlZGVmIEZUX1VJTlQ2NCAgRlRfVUludDY0OwotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIG1pc2NlbGxhbmVvdXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBGVF9CRUdJTl9TVE1OVCAgZG8gewotI2RlZmluZSBGVF9FTkRfU1RNTlQgICAgfSB3aGlsZSAoIDAgKQotI2RlZmluZSBGVF9EVU1NWV9TVE1OVCAgRlRfQkVHSU5fU1RNTlQgRlRfRU5EX1NUTU5UCi0KLQotICAvKiB0eXBlb2YgY29uZGl0aW9uIHRha2VuIGZyb20gZ251bGliJ3MgYGludHByb3BzLmgnIGhlYWRlciBmaWxlICovCi0jaWYgKCBfX0dOVUNfXyA+PSAyICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKLSAgICAgIGRlZmluZWQoIF9fSUJNX19UWVBFT0ZfXyApICAgICAgICAgICAgfHwgXAotICAgICAgKCBfX1NVTlBST19DID49IDB4NTExMCAmJiAhX19TVERDX18gKSApCi0jZGVmaW5lIEZUX1RZUEVPRiggdHlwZSApICAoX190eXBlb2ZfXyAodHlwZSkpCi0jZWxzZQotI2RlZmluZSBGVF9UWVBFT0YoIHR5cGUgKSAgLyogZW1wdHkgKi8KLSNlbmRpZgotCi0KLSNpZmRlZiBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0KLSNkZWZpbmUgRlRfTE9DQUwoIHggKSAgICAgIHN0YXRpYyAgeAotI2RlZmluZSBGVF9MT0NBTF9ERUYoIHggKSAgc3RhdGljICB4Ci0KLSNlbHNlCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9MT0NBTCggeCApICAgICAgZXh0ZXJuICJDIiAgeAotI2RlZmluZSBGVF9MT0NBTF9ERUYoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfTE9DQUwoIHggKSAgICAgIGV4dGVybiAgeAotI2RlZmluZSBGVF9MT0NBTF9ERUYoIHggKSAgeAotI2VuZGlmCi0KLSNlbmRpZiAvKiBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUICovCi0KLSNkZWZpbmUgRlRfTE9DQUxfQVJSQVkoIHggKSAgICAgIGV4dGVybiBjb25zdCAgeAotI2RlZmluZSBGVF9MT0NBTF9BUlJBWV9ERUYoIHggKSAgY29uc3QgIHgKLQotCi0jaWZuZGVmIEZUX0JBU0UKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX0JBU0UoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfQkFTRSggeCApICBleHRlcm4gIHgKLSNlbmRpZgotCi0jZW5kaWYgLyogIUZUX0JBU0UgKi8KLQotCi0jaWZuZGVmIEZUX0JBU0VfREVGCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9CQVNFX0RFRiggeCApICB4Ci0jZWxzZQotI2RlZmluZSBGVF9CQVNFX0RFRiggeCApICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9CQVNFX0RFRiAqLwotCi0KLSNpZm5kZWYgRlRfRVhQT1JUCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9FWFBPUlQoIHggKSAgZXh0ZXJuICJDIiAgeAotI2Vsc2UKLSNkZWZpbmUgRlRfRVhQT1JUKCB4ICkgIGV4dGVybiAgeAotI2VuZGlmCi0KLSNlbmRpZiAvKiAhRlRfRVhQT1JUICovCi0KLQotI2lmbmRlZiBGVF9FWFBPUlRfREVGCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9FWFBPUlRfREVGKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0VYUE9SVF9ERUYoIHggKSAgZXh0ZXJuICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9FWFBPUlRfREVGICovCi0KLQotI2lmbmRlZiBGVF9FWFBPUlRfVkFSCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9FWFBPUlRfVkFSKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0VYUE9SVF9WQVIoIHggKSAgZXh0ZXJuICB4Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9FWFBPUlRfVkFSICovCi0KLSAgLyogVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIG5lZWRlZCB0byBjb21waWxlIHRoZSBsaWJyYXJ5IHdpdGggYSAgICovCi0gIC8qIEMrKyBjb21waWxlciBhbmQgd2l0aCAxNmJpdCBjb21waWxlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiBUaGlzIGlzIHNwZWNpYWwuICBXaXRoaW4gQysrLCB5b3UgbXVzdCBzcGVjaWZ5IGBleHRlcm4gIkMiJyBmb3IgKi8KLSAgLyogZnVuY3Rpb25zIHdoaWNoIGFyZSB1c2VkIHZpYSBmdW5jdGlvbiBwb2ludGVycywgYW5kIHlvdSBhbHNvICAgICovCi0gIC8qIG11c3QgZG8gdGhhdCBmb3Igc3RydWN0dXJlcyB3aGljaCBjb250YWluIGZ1bmN0aW9uIHBvaW50ZXJzIHRvICAqLwotICAvKiBhc3N1cmUgQyBsaW5rYWdlIC0tIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGhhdmUgKGxvY2FsKSBhbm9ueW1vdXMgKi8KLSAgLyogZnVuY3Rpb25zIHdoaWNoIGFyZSBhY2Nlc3NlZCBieSAoZ2xvYmFsKSBmdW5jdGlvbiBwb2ludGVycy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRlRfQ0FMTEJBQ0tfREVGIGlzIHVzZWQgdG8gX2RlZmluZV8gYSBjYWxsYmFjayBmdW5jdGlvbi4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9DQUxMQkFDS19UQUJMRSBpcyB1c2VkIHRvIF9kZWNsYXJlXyBhIGNvbnN0YW50IHZhcmlhYmxlIHRoYXQgKi8KLSAgLyogY29udGFpbnMgcG9pbnRlcnMgdG8gY2FsbGJhY2sgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9DQUxMQkFDS19UQUJMRV9ERUYgaXMgdXNlZCB0byBfZGVmaW5lXyBhIGNvbnN0YW50IHZhcmlhYmxlICAgKi8KLSAgLyogdGhhdCBjb250YWlucyBwb2ludGVycyB0byBjYWxsYmFjayBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU29tZSAxNmJpdCBjb21waWxlcnMgaGF2ZSB0byByZWRlZmluZSB0aGVzZSBtYWNyb3MgdG8gaW5zZXJ0ICAgICovCi0gIC8qIHRoZSBpbmZhbW91cyBgX2NkZWNsJyBvciBgX19mYXN0Y2FsbCcgZGVjbGFyYXRpb25zLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZm5kZWYgRlRfQ0FMTEJBQ0tfREVGCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfREVGKCB4ICkgIGV4dGVybiAiQyIgIHgKLSNlbHNlCi0jZGVmaW5lIEZUX0NBTExCQUNLX0RFRiggeCApICBzdGF0aWMgIHgKLSNlbmRpZgotI2VuZGlmIC8qIEZUX0NBTExCQUNLX0RFRiAqLwotCi0jaWZuZGVmIEZUX0NBTExCQUNLX1RBQkxFCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfVEFCTEUgICAgICBleHRlcm4gIkMiCi0jZGVmaW5lIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgZXh0ZXJuICJDIgotI2Vsc2UKLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfVEFCTEUgICAgICBleHRlcm4KLSNkZWZpbmUgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGICAvKiBub3RoaW5nICovCi0jZW5kaWYKLSNlbmRpZiAvKiBGVF9DQUxMQkFDS19UQUJMRSAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19GVENPTkZJR19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWY4MzNkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRoZWFkZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEJ1aWxkIG1hY3JvcyBvZiB0aGUgRnJlZVR5cGUgMiBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0ZUX0hFQURFUl9IX18KLSNkZWZpbmUgX19GVF9IRUFERVJfSF9fCi0KLQotICAvKkAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CRUdJTl9IRUFERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIG1hY3JvIGlzIHVzZWQgaW4gYXNzb2NpYXRpb24gd2l0aCBARlRfRU5EX0hFQURFUiBpbiBoZWFkZXIgICAgKi8KLSAgLyogICAgZmlsZXMgdG8gZW5zdXJlIHRoYXQgdGhlIGRlY2xhcmF0aW9ucyB3aXRoaW4gYXJlIHByb3Blcmx5ICAgICAgICAgICovCi0gIC8qICAgIGVuY2Fwc3VsYXRlZCBpbiBhbiBgZXh0ZXJuICJDIiB7IC4uIH0nIGJsb2NrIHdoZW4gaW5jbHVkZWQgZnJvbSBhICAqLwotICAvKiAgICBDKysgY29tcGlsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfQkVHSU5fSEVBREVSICBleHRlcm4gIkMiIHsKLSNlbHNlCi0jZGVmaW5lIEZUX0JFR0lOX0hFQURFUiAgLyogbm90aGluZyAqLwotI2VuZGlmCi0KLQotICAvKkAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkRfSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIG1hY3JvIGlzIHVzZWQgaW4gYXNzb2NpYXRpb24gd2l0aCBARlRfQkVHSU5fSEVBREVSIGluIGhlYWRlciAgKi8KLSAgLyogICAgZmlsZXMgdG8gZW5zdXJlIHRoYXQgdGhlIGRlY2xhcmF0aW9ucyB3aXRoaW4gYXJlIHByb3Blcmx5ICAgICAgICAgICovCi0gIC8qICAgIGVuY2Fwc3VsYXRlZCBpbiBhbiBgZXh0ZXJuICJDIiB7IC4uIH0nIGJsb2NrIHdoZW4gaW5jbHVkZWQgZnJvbSBhICAqLwotICAvKiAgICBDKysgY29tcGlsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfRU5EX0hFQURFUiAgfQotI2Vsc2UKLSNkZWZpbmUgRlRfRU5EX0hFQURFUiAgLyogbm90aGluZyAqLwotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFsaWFzZXMgZm9yIHRoZSBGcmVlVHlwZSAyIHB1YmxpYyBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVhZGVyX2ZpbGVfbWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSGVhZGVyIEZpbGUgTWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTWFjcm8gZGVmaW5pdGlvbnMgdXNlZCB0byAjaW5jbHVkZSBzcGVjaWZpYyBoZWFkZXIgZmlsZXMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIGRlZmluZWQgdG8gdGhlIG5hbWUgb2Ygc3BlY2lmaWMgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlfjIgaGVhZGVyIGZpbGVzLiAgVGhleSBjYW4gYmUgdXNlZCBkaXJlY3RseSBpbiAjaW5jbHVkZSAgICAqLwotICAvKiAgICBzdGF0ZW1lbnRzIGFzIGluOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICNpbmNsdWRlIEZUX0ZSRUVUWVBFX0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAjaW5jbHVkZSBGVF9NVUxUSVBMRV9NQVNURVJTX0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgI2luY2x1ZGUgRlRfR0xZUEhfSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZXJlIGFyZSBzZXZlcmFsIHJlYXNvbnMgd2h5IHdlIGFyZSBub3cgdXNpbmcgbWFjcm9zIHRvIG5hbWUgICAgICAqLwotICAvKiAgICBwdWJsaWMgaGVhZGVyIGZpbGVzLiAgVGhlIGZpcnN0IG9uZSBpcyB0aGF0IHN1Y2ggbWFjcm9zIGFyZSBub3QgICAgKi8KLSAgLyogICAgbGltaXRlZCB0byB0aGUgaW5mYW1vdXMgOC4zfm5hbWluZyBydWxlIHJlcXVpcmVkIGJ5IERPUyAoYW5kICAgICAgICovCi0gIC8qICAgIGBGVF9NVUxUSVBMRV9NQVNURVJTX0gnIGlzIGEgbG90IG1vcmUgbWVhbmluZ2Z1bCB0aGFuIGBmdG1tLmgnKS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHNlY29uZCByZWFzb24gaXMgdGhhdCBpdCBhbGxvd3MgZm9yIG1vcmUgZmxleGliaWxpdHkgaW4gdGhlICAgICovCi0gIC8qICAgIHdheSBGcmVlVHlwZX4yIGlzIGluc3RhbGxlZCBvbiBhIGdpdmVuIHN5c3RlbS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBjb25maWd1cmF0aW9uIGZpbGVzICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0NPTkZJR19DT05GSUdfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nCi0gICAqICAgRnJlZVR5cGV+MiBjb25maWd1cmF0aW9uIGRhdGEuCi0gICAqCi0gICAqLwotI2lmbmRlZiBGVF9DT05GSUdfQ09ORklHX0gKLSNkZWZpbmUgRlRfQ09ORklHX0NPTkZJR19IICA8ZnJlZXR5cGUvY29uZmlnL2Z0Y29uZmlnLmg+Ci0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9DT05GSUdfU1RBTkRBUkRfTElCUkFSWV9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcKLSAgICogICBGcmVlVHlwZX4yIGludGVyZmFjZSB0byB0aGUgc3RhbmRhcmQgQyBsaWJyYXJ5IGZ1bmN0aW9ucy4KLSAgICoKLSAgICovCi0jaWZuZGVmIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0gKLSNkZWZpbmUgRlRfQ09ORklHX1NUQU5EQVJEX0xJQlJBUllfSCAgPGZyZWV0eXBlL2NvbmZpZy9mdHN0ZGxpYi5oPgotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQ09ORklHX09QVElPTlNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nCi0gICAqICAgRnJlZVR5cGV+MiBwcm9qZWN0LXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KLSAgICoKLSAgICovCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05TX0gKLSNkZWZpbmUgRlRfQ09ORklHX09QVElPTlNfSCAgPGZyZWV0eXBlL2NvbmZpZy9mdG9wdGlvbi5oPgotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQ09ORklHX01PRFVMRVNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGxpc3Qgb2YgRnJlZVR5cGV+MiBtb2R1bGVzIHRoYXQgYXJlIHN0YXRpY2FsbHkgbGlua2VkIHRvIG5ldyBsaWJyYXJ5Ci0gICAqICAgaW5zdGFuY2VzIGluIEBGVF9Jbml0X0ZyZWVUeXBlLgotICAgKgotICAgKi8KLSNpZm5kZWYgRlRfQ09ORklHX01PRFVMRVNfSAotI2RlZmluZSBGVF9DT05GSUdfTU9EVUxFU19IICA8ZnJlZXR5cGUvY29uZmlnL2Z0bW9kdWxlLmg+Ci0jZW5kaWYKLQotICAvKiAqLwotCi0gIC8qIHB1YmxpYyBoZWFkZXJzICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0ZSRUVUWVBFX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBiYXNlIEZyZWVUeXBlfjIgQVBJLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfRlJFRVRZUEVfSCAgPGZyZWV0eXBlL2ZyZWV0eXBlLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfRVJST1JTX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBsaXN0IG9mIEZyZWVUeXBlfjIgZXJyb3IgY29kZXMgKGFuZCBtZXNzYWdlcykuCi0gICAqCi0gICAqICAgSXQgaXMgaW5jbHVkZWQgYnkgQEZUX0ZSRUVUWVBFX0guCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9FUlJPUlNfSCAgPGZyZWV0eXBlL2Z0ZXJyb3JzLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfTU9EVUxFX0VSUk9SU19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgbGlzdCBvZiBGcmVlVHlwZX4yIG1vZHVsZSBlcnJvciBvZmZzZXRzIChhbmQgbWVzc2FnZXMpLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfTU9EVUxFX0VSUk9SU19IICA8ZnJlZXR5cGUvZnRtb2RlcnIuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9TWVNURU1fSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEZyZWVUeXBlfjIgaW50ZXJmYWNlIHRvIGxvdy1sZXZlbCBvcGVyYXRpb25zIChpLmUuLCBtZW1vcnkgbWFuYWdlbWVudAotICAgKiAgIGFuZCBzdHJlYW0gaS9vKS4KLSAgICoKLSAgICogICBJdCBpcyBpbmNsdWRlZCBieSBARlRfRlJFRVRZUEVfSC4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX1NZU1RFTV9IICA8ZnJlZXR5cGUvZnRzeXN0ZW0uaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9JTUFHRV9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdHlwZQotICAgKiAgIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gZ2x5cGggaW1hZ2VzIChpLmUuLCBiaXRtYXBzLCBvdXRsaW5lcywKLSAgICogICBzY2FuLWNvbnZlcnRlciBwYXJhbWV0ZXJzKS4KLSAgICoKLSAgICogICBJdCBpcyBpbmNsdWRlZCBieSBARlRfRlJFRVRZUEVfSC4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0lNQUdFX0ggIDxmcmVldHlwZS9mdGltYWdlLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfVFlQRVNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGJhc2ljIGRhdGEgdHlwZXMgZGVmaW5lZCBieSBGcmVlVHlwZX4yLgotICAgKgotICAgKiAgIEl0IGlzIGluY2x1ZGVkIGJ5IEBGVF9GUkVFVFlQRV9ILgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfVFlQRVNfSCAgPGZyZWV0eXBlL2Z0dHlwZXMuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9MSVNUX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBsaXN0IG1hbmFnZW1lbnQgQVBJIG9mIEZyZWVUeXBlfjIuCi0gICAqCi0gICAqICAgKE1vc3QgYXBwbGljYXRpb25zIHdpbGwgbmV2ZXIgbmVlZCB0byBpbmNsdWRlIHRoaXMgZmlsZS4pCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9MSVNUX0ggIDxmcmVldHlwZS9mdGxpc3QuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9PVVRMSU5FX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBzY2FsYWJsZSBvdXRsaW5lIG1hbmFnZW1lbnQgQVBJIG9mIEZyZWVUeXBlfjIuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9PVVRMSU5FX0ggIDxmcmVldHlwZS9mdG91dGxuLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfU0laRVNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEFQSSB3aGljaCBtYW5hZ2VzIG11bHRpcGxlIEBGVF9TaXplIG9iamVjdHMgcGVyIGZhY2UuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9TSVpFU19IICA8ZnJlZXR5cGUvZnRzaXplcy5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX01PRFVMRV9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgbW9kdWxlIG1hbmFnZW1lbnQgQVBJIG9mIEZyZWVUeXBlfjIuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9NT0RVTEVfSCAgPGZyZWV0eXBlL2Z0bW9kYXBpLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfUkVOREVSX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICByZW5kZXJlciBtb2R1bGUgbWFuYWdlbWVudCBBUEkgb2YgRnJlZVR5cGV+Mi4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX1JFTkRFUl9IICA8ZnJlZXR5cGUvZnRyZW5kZXIuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9BVVRPSElOVEVSX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZwotICAgKiAgIHN0cnVjdHVyZXMgYW5kIG1hY3JvcyByZWxhdGVkIHRvIHRoZSBhdXRvLWhpbnRpbmcgbW9kdWxlLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQVVUT0hJTlRFUl9IICA8ZnJlZXR5cGUvZnRhdXRvaC5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0NGRl9EUklWRVJfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nCi0gICAqICAgc3RydWN0dXJlcyBhbmQgbWFjcm9zIHJlbGF0ZWQgdG8gdGhlIENGRiBkcml2ZXIgbW9kdWxlLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQ0ZGX0RSSVZFUl9IICA8ZnJlZXR5cGUvZnRjZmZkcnYuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9UUlVFVFlQRV9EUklWRVJfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nCi0gICAqICAgc3RydWN0dXJlcyBhbmQgbWFjcm9zIHJlbGF0ZWQgdG8gdGhlIFRydWVUeXBlIGRyaXZlciBtb2R1bGUuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9UUlVFVFlQRV9EUklWRVJfSCAgPGZyZWV0eXBlL2Z0dHRkcnYuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9UWVBFMV9UQUJMRVNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIHR5cGVzIGFuZCBBUEkgc3BlY2lmaWMgdG8gdGhlIFR5cGV+MSBmb3JtYXQuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9UWVBFMV9UQUJMRVNfSCAgPGZyZWV0eXBlL3QxdGFibGVzLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfVFJVRVRZUEVfSURTX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBlbnVtZXJhdGlvbiB2YWx1ZXMgd2hpY2ggaWRlbnRpZnkgbmFtZSBzdHJpbmdzLCBsYW5ndWFnZXMsIGVuY29kaW5ncywKLSAgICogICBldGMuICBUaGlzIGZpbGUgcmVhbGx5IGNvbnRhaW5zIGEgX2xhcmdlXyBzZXQgb2YgY29uc3RhbnQgbWFjcm8KLSAgICogICBkZWZpbml0aW9ucywgdGFrZW4gZnJvbSB0aGUgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIHNwZWNpZmljYXRpb25zLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfVFJVRVRZUEVfSURTX0ggIDxmcmVldHlwZS90dG5hbWVpZC5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX1RSVUVUWVBFX1RBQkxFU19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgdHlwZXMgYW5kIEFQSSBzcGVjaWZpYyB0byB0aGUgVHJ1ZVR5cGUgKGFzIHdlbGwgYXMgT3BlblR5cGUpIGZvcm1hdC4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX1RSVUVUWVBFX1RBQkxFU19IICA8ZnJlZXR5cGUvdHR0YWJsZXMuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9UUlVFVFlQRV9UQUdTX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBkZWZpbml0aW9ucyBvZiBUcnVlVHlwZSBmb3VyLWJ5dGUgYHRhZ3MnIHdoaWNoIGlkZW50aWZ5IGJsb2NrcyBpbgotICAgKiAgIFNGTlQtYmFzZWQgZm9udCBmb3JtYXRzIChpLmUuLCBUcnVlVHlwZSBhbmQgT3BlblR5cGUpLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfVFJVRVRZUEVfVEFHU19IICA8ZnJlZXR5cGUvdHR0YWdzLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQkRGX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBkZWZpbml0aW9ucyBvZiBhbiBBUEkgd2hpY2ggYWNjZXNzZXMgQkRGLXNwZWNpZmljIHN0cmluZ3MgZnJvbSBhCi0gICAqICAgZmFjZS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0JERl9IICA8ZnJlZXR5cGUvZnRiZGYuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9DSURfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGRlZmluaXRpb25zIG9mIGFuIEFQSSB3aGljaCBhY2Nlc3MgQ0lEIGZvbnQgaW5mb3JtYXRpb24gZnJvbSBhCi0gICAqICAgZmFjZS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0NJRF9IICA8ZnJlZXR5cGUvZnRjaWQuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9HWklQX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBkZWZpbml0aW9ucyBvZiBhbiBBUEkgd2hpY2ggc3VwcG9ydHMgZ3ppcC1jb21wcmVzc2VkIGZpbGVzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfR1pJUF9IICA8ZnJlZXR5cGUvZnRnemlwLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfTFpXX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBkZWZpbml0aW9ucyBvZiBhbiBBUEkgd2hpY2ggc3VwcG9ydHMgTFpXLWNvbXByZXNzZWQgZmlsZXMuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9MWldfSCAgPGZyZWV0eXBlL2Z0bHp3Lmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQlpJUDJfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGRlZmluaXRpb25zIG9mIGFuIEFQSSB3aGljaCBzdXBwb3J0cyBiemlwMi1jb21wcmVzc2VkIGZpbGVzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQlpJUDJfSCAgPGZyZWV0eXBlL2Z0YnppcDIuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9XSU5GT05UU19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgZGVmaW5pdGlvbnMgb2YgYW4gQVBJIHdoaWNoIHN1cHBvcnRzIFdpbmRvd3MgRk5UIGZpbGVzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfV0lORk9OVFNfSCAgIDxmcmVldHlwZS9mdHdpbmZudC5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0dMWVBIX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBBUEkgb2YgdGhlIG9wdGlvbmFsIGdseXBoIG1hbmFnZW1lbnQgY29tcG9uZW50LgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfR0xZUEhfSCAgPGZyZWV0eXBlL2Z0Z2x5cGguaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9CSVRNQVBfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEFQSSBvZiB0aGUgb3B0aW9uYWwgYml0bWFwIGNvbnZlcnNpb24gY29tcG9uZW50LgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQklUTUFQX0ggIDxmcmVldHlwZS9mdGJpdG1hcC5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0JCT1hfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEFQSSBvZiB0aGUgb3B0aW9uYWwgZXhhY3QgYm91bmRpbmcgYm94IGNvbXB1dGF0aW9uIHJvdXRpbmVzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQkJPWF9IICA8ZnJlZXR5cGUvZnRiYm94Lmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQ0FDSEVfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEFQSSBvZiB0aGUgb3B0aW9uYWwgRnJlZVR5cGV+MiBjYWNoZSBzdWItc3lzdGVtLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQ0FDSEVfSCAgPGZyZWV0eXBlL2Z0Y2FjaGUuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9DQUNIRV9JTUFHRV9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgYGdseXBoIGltYWdlJyBBUEkgb2YgdGhlIEZyZWVUeXBlfjIgY2FjaGUgc3ViLXN5c3RlbS4KLSAgICoKLSAgICogICBJdCBpcyB1c2VkIHRvIGRlZmluZSBhIGNhY2hlIGZvciBARlRfR2x5cGggZWxlbWVudHMuICBZb3UgY2FuIGFsc28KLSAgICogICB1c2UgdGhlIEFQSSBkZWZpbmVkIGluIEBGVF9DQUNIRV9TTUFMTF9CSVRNQVBTX0ggaWYgeW91IG9ubHkgbmVlZCB0bwotICAgKiAgIHN0b3JlIHNtYWxsIGdseXBoIGJpdG1hcHMsIGFzIGl0IHdpbGwgdXNlIGxlc3MgbWVtb3J5LgotICAgKgotICAgKiAgIFRoaXMgbWFjcm8gaXMgZGVwcmVjYXRlZC4gIFNpbXBseSBpbmNsdWRlIEBGVF9DQUNIRV9IIHRvIGhhdmUgYWxsCi0gICAqICAgZ2x5cGggaW1hZ2UtcmVsYXRlZCBjYWNoZSBkZWNsYXJhdGlvbnMuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9DQUNIRV9JTUFHRV9IICBGVF9DQUNIRV9ICi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQ0FDSEVfU01BTExfQklUTUFQU19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgYHNtYWxsIGJpdG1hcHMnIEFQSSBvZiB0aGUgRnJlZVR5cGV+MiBjYWNoZSBzdWItc3lzdGVtLgotICAgKgotICAgKiAgIEl0IGlzIHVzZWQgdG8gZGVmaW5lIGEgY2FjaGUgZm9yIHNtYWxsIGdseXBoIGJpdG1hcHMgaW4gYSByZWxhdGl2ZWx5Ci0gICAqICAgbWVtb3J5LWVmZmljaWVudCB3YXkuICBZb3UgY2FuIGFsc28gdXNlIHRoZSBBUEkgZGVmaW5lZCBpbgotICAgKiAgIEBGVF9DQUNIRV9JTUFHRV9IIGlmIHlvdSB3YW50IHRvIGNhY2hlIGFyYml0cmFyeSBnbHlwaCBpbWFnZXMsCi0gICAqICAgaW5jbHVkaW5nIHNjYWxhYmxlIG91dGxpbmVzLgotICAgKgotICAgKiAgIFRoaXMgbWFjcm8gaXMgZGVwcmVjYXRlZC4gIFNpbXBseSBpbmNsdWRlIEBGVF9DQUNIRV9IIHRvIGhhdmUgYWxsCi0gICAqICAgc21hbGwgYml0bWFwcy1yZWxhdGVkIGNhY2hlIGRlY2xhcmF0aW9ucy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0NBQ0hFX1NNQUxMX0JJVE1BUFNfSCAgRlRfQ0FDSEVfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0NBQ0hFX0NIQVJNQVBfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIGBjaGFybWFwJyBBUEkgb2YgdGhlIEZyZWVUeXBlfjIgY2FjaGUgc3ViLXN5c3RlbS4KLSAgICoKLSAgICogICBUaGlzIG1hY3JvIGlzIGRlcHJlY2F0ZWQuICBTaW1wbHkgaW5jbHVkZSBARlRfQ0FDSEVfSCB0byBoYXZlIGFsbAotICAgKiAgIGNoYXJtYXAtYmFzZWQgY2FjaGUgZGVjbGFyYXRpb25zLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQ0FDSEVfQ0hBUk1BUF9IICBGVF9DQUNIRV9ICi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfTUFDX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBNYWNpbnRvc2gtc3BlY2lmaWMgRnJlZVR5cGV+MiBBUEkuICBUaGUgbGF0dGVyIGlzIHVzZWQgdG8gYWNjZXNzCi0gICAqICAgZm9udHMgZW1iZWRkZWQgaW4gcmVzb3VyY2UgZm9ya3MuCi0gICAqCi0gICAqICAgVGhpcyBoZWFkZXIgZmlsZSBtdXN0IGJlIGV4cGxpY2l0bHkgaW5jbHVkZWQgYnkgY2xpZW50IGFwcGxpY2F0aW9ucwotICAgKiAgIGNvbXBpbGVkIG9uIHRoZSBNYWMgKG5vdGUgdGhhdCB0aGUgYmFzZSBBUEkgc3RpbGwgd29ya3MgdGhvdWdoKS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX01BQ19IICA8ZnJlZXR5cGUvZnRtYWMuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9NVUxUSVBMRV9NQVNURVJTX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBvcHRpb25hbCBtdWx0aXBsZS1tYXN0ZXJzIG1hbmFnZW1lbnQgQVBJIG9mIEZyZWVUeXBlfjIuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9NVUxUSVBMRV9NQVNURVJTX0ggIDxmcmVldHlwZS9mdG1tLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfU0ZOVF9OQU1FU19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgb3B0aW9uYWwgRnJlZVR5cGV+MiBBUEkgd2hpY2ggYWNjZXNzZXMgZW1iZWRkZWQgYG5hbWUnIHN0cmluZ3MgaW4KLSAgICogICBTRk5ULWJhc2VkIGZvbnQgZm9ybWF0cyAoaS5lLiwgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlKS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX1NGTlRfTkFNRVNfSCAgPGZyZWV0eXBlL2Z0c25hbWVzLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfT1BFTlRZUEVfVkFMSURBVEVfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIG9wdGlvbmFsIEZyZWVUeXBlfjIgQVBJIHdoaWNoIHZhbGlkYXRlcyBPcGVuVHlwZSB0YWJsZXMgKEJBU0UsIEdERUYsCi0gICAqICAgR1BPUywgR1NVQiwgSlNURikuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9PUEVOVFlQRV9WQUxJREFURV9IICA8ZnJlZXR5cGUvZnRvdHZhbC5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0dYX1ZBTElEQVRFX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBvcHRpb25hbCBGcmVlVHlwZX4yIEFQSSB3aGljaCB2YWxpZGF0ZXMgVHJ1ZVR5cGVHWC9BQVQgdGFibGVzIChmZWF0LAotICAgKiAgIG1vcnQsIG1vcngsIGJzbG4sIGp1c3QsIGtlcm4sIG9wYmQsIHRyYWssIHByb3ApLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfR1hfVkFMSURBVEVfSCAgPGZyZWV0eXBlL2Z0Z3h2YWwuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9QRlJfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEZyZWVUeXBlfjIgQVBJIHdoaWNoIGFjY2Vzc2VzIFBGUi1zcGVjaWZpYyBkYXRhLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfUEZSX0ggIDxmcmVldHlwZS9mdHBmci5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX1NUUk9LRVJfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEZyZWVUeXBlfjIgQVBJIHdoaWNoIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBzdHJva2Ugb3V0bGluZSBwYXRocy4KLSAgICovCi0jZGVmaW5lIEZUX1NUUk9LRVJfSCAgPGZyZWV0eXBlL2Z0c3Ryb2tlLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfU1lOVEhFU0lTX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBGcmVlVHlwZX4yIEFQSSB3aGljaCBwZXJmb3JtcyBhcnRpZmljaWFsIG9ibGlxdWluZyBhbmQgZW1ib2xkZW5pbmcuCi0gICAqLwotI2RlZmluZSBGVF9TWU5USEVTSVNfSCAgPGZyZWV0eXBlL2Z0c3ludGguaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9GT05UX0ZPUk1BVFNfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEZyZWVUeXBlfjIgQVBJIHdoaWNoIHByb3ZpZGVzIGZ1bmN0aW9ucyBzcGVjaWZpYyB0byBmb250IGZvcm1hdHMuCi0gICAqLwotI2RlZmluZSBGVF9GT05UX0ZPUk1BVFNfSCAgPGZyZWV0eXBlL2Z0Zm50Zm10Lmg+Ci0KLSAgLyogZGVwcmVjYXRlZCAqLwotI2RlZmluZSBGVF9YRlJFRTg2X0ggIEZUX0ZPTlRfRk9STUFUU19ICi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfVFJJR09OT01FVFJZX0gKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdXNlZCBpbiAjaW5jbHVkZSBzdGF0ZW1lbnRzIHRvIG5hbWUgdGhlIGZpbGUgY29udGFpbmluZyB0aGUKLSAgICogICBGcmVlVHlwZX4yIEFQSSB3aGljaCBwZXJmb3JtcyB0cmlnb25vbWV0cmljIGNvbXB1dGF0aW9ucyAoZS5nLiwKLSAgICogICBjb3NpbmVzIGFuZCBhcmMgdGFuZ2VudHMpLgotICAgKi8KLSNkZWZpbmUgRlRfVFJJR09OT01FVFJZX0ggIDxmcmVldHlwZS9mdHRyaWdvbi5oPgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0xDRF9GSUxURVJfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEZyZWVUeXBlfjIgQVBJIHdoaWNoIHBlcmZvcm1zIGNvbG9yIGZpbHRlcmluZyBmb3Igc3VicGl4ZWwgcmVuZGVyaW5nLgotICAgKi8KLSNkZWZpbmUgRlRfTENEX0ZJTFRFUl9IICA8ZnJlZXR5cGUvZnRsY2RmaWwuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9VTlBBVEVOVEVEX0hJTlRJTkdfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEZyZWVUeXBlfjIgQVBJIHdoaWNoIHBlcmZvcm1zIGNvbG9yIGZpbHRlcmluZyBmb3Igc3VicGl4ZWwgcmVuZGVyaW5nLgotICAgKi8KLSNkZWZpbmUgRlRfVU5QQVRFTlRFRF9ISU5USU5HX0ggIDxmcmVldHlwZS90dHVucGF0Lmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSU5DUkVNRU5UQUxfSAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB1c2VkIGluICNpbmNsdWRlIHN0YXRlbWVudHMgdG8gbmFtZSB0aGUgZmlsZSBjb250YWluaW5nIHRoZQotICAgKiAgIEZyZWVUeXBlfjIgQVBJIHdoaWNoIHBlcmZvcm1zIGNvbG9yIGZpbHRlcmluZyBmb3Igc3VicGl4ZWwgcmVuZGVyaW5nLgotICAgKi8KLSNkZWZpbmUgRlRfSU5DUkVNRU5UQUxfSCAgPGZyZWV0eXBlL2Z0aW5jcmVtLmg+Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfR0FTUF9ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgRnJlZVR5cGV+MiBBUEkgd2hpY2ggcmV0dXJucyBlbnRyaWVzIGZyb20gdGhlIFRydWVUeXBlIEdBU1AgdGFibGUuCi0gICAqLwotI2RlZmluZSBGVF9HQVNQX0ggIDxmcmVldHlwZS9mdGdhc3AuaD4KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9BRFZBTkNFU19ICi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHVzZWQgaW4gI2luY2x1ZGUgc3RhdGVtZW50cyB0byBuYW1lIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlCi0gICAqICAgRnJlZVR5cGV+MiBBUEkgd2hpY2ggcmV0dXJucyBpbmRpdmlkdWFsIGFuZCByYW5nZWQgZ2x5cGggYWR2YW5jZXMuCi0gICAqLwotI2RlZmluZSBGVF9BRFZBTkNFU19IICA8ZnJlZXR5cGUvZnRhZHZhbmMuaD4KLQotCi0gIC8qICovCi0KLSNkZWZpbmUgRlRfRVJST1JfREVGSU5JVElPTlNfSCAgPGZyZWV0eXBlL2Z0ZXJyZGVmLmg+Ci0KLQotICAvKiBUaGUgaW50ZXJuYWxzIG9mIHRoZSBjYWNoZSBzdWItc3lzdGVtIGFyZSBubyBsb25nZXIgZXhwb3NlZC4gIFdlICovCi0gIC8qIGRlZmF1bHQgdG8gRlRfQ0FDSEVfSCBhdCB0aGUgbW9tZW50IGp1c3QgaW4gY2FzZSwgYnV0IHdlIGtub3cgb2YgKi8KLSAgLyogbm8gcm9ndWUgY2xpZW50IHRoYXQgdXNlcyB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0NBQ0hFX01BTkFHRVJfSCAgICAgICAgICAgPGZyZWV0eXBlL2Z0Y2FjaGUuaD4KLSNkZWZpbmUgRlRfQ0FDSEVfSU5URVJOQUxfTVJVX0ggICAgICA8ZnJlZXR5cGUvZnRjYWNoZS5oPgotI2RlZmluZSBGVF9DQUNIRV9JTlRFUk5BTF9NQU5BR0VSX0ggIDxmcmVldHlwZS9mdGNhY2hlLmg+Ci0jZGVmaW5lIEZUX0NBQ0hFX0lOVEVSTkFMX0NBQ0hFX0ggICAgPGZyZWV0eXBlL2Z0Y2FjaGUuaD4KLSNkZWZpbmUgRlRfQ0FDSEVfSU5URVJOQUxfR0xZUEhfSCAgICA8ZnJlZXR5cGUvZnRjYWNoZS5oPgotI2RlZmluZSBGVF9DQUNIRV9JTlRFUk5BTF9JTUFHRV9IICAgIDxmcmVldHlwZS9mdGNhY2hlLmg+Ci0jZGVmaW5lIEZUX0NBQ0hFX0lOVEVSTkFMX1NCSVRTX0ggICAgPGZyZWV0eXBlL2Z0Y2FjaGUuaD4KLQotCi0jZGVmaW5lIEZUX0lOQ1JFTUVOVEFMX0ggICAgICAgICAgPGZyZWV0eXBlL2Z0aW5jcmVtLmg+Ci0KLSNkZWZpbmUgRlRfVFJVRVRZUEVfVU5QQVRFTlRFRF9IICA8ZnJlZXR5cGUvdHR1bnBhdC5oPgotCi0KLSAgLyoKLSAgICogSW5jbHVkZSBpbnRlcm5hbCBoZWFkZXJzIGRlZmluaXRpb25zIGZyb20gPGludGVybmFsLy4uLj4KLSAgICogb25seSB3aGVuIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5LgotICAgKi8KLSNpZmRlZiBGVDJfQlVJTERfTElCUkFSWQotI2RlZmluZSAgRlRfSU5URVJOQUxfSU5URVJOQUxfSCAgPGZyZWV0eXBlL2ludGVybmFsL2ludGVybmFsLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9JTlRFUk5BTF9ICi0jZW5kaWYgLyogRlQyX0JVSUxEX0xJQlJBUlkgKi8KLQotCi0jZW5kaWYgLyogX19GVDJfQlVJTERfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIyNTU3NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRtb2R1bGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIG1vZHVsZXMgcHVibGljIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqICBUaGlzIGZpbGUgcmVnaXN0ZXJzIHRoZSBGcmVlVHlwZSBtb2R1bGVzIGNvbXBpbGVkIGludG8gdGhlIGxpYnJhcnkuCi0gKgotICogIElmIHlvdSB1c2UgR05VIG1ha2UsIHRoaXMgZmlsZSBJUyBOT1QgVVNFRCEgIEluc3RlYWQsIGl0IGlzIGNyZWF0ZWQgaW4KLSAqICB0aGUgb2JqZWN0cyBkaXJlY3RvcnkgKG5vcm1hbGx5IGA8dG9wZGlyPi9vYmpzLycpIGJhc2VkIG9uIGluZm9ybWF0aW9uCi0gKiAgZnJvbSBgPHRvcGRpcj4vbW9kdWxlcy5jZmcnLgotICoKLSAqICBQbGVhc2UgcmVhZCBgZG9jcy9JTlNUQUxMLkFOWScgYW5kIGBkb2NzL0NVU1RPTUlaRScgaG93IHRvIGNvbXBpbGUKLSAqICBGcmVlVHlwZSB3aXRob3V0IEdOVSBtYWtlLgotICoKLSAqLwotCi0vL0ZUX1VTRV9NT0RVTEUoIEZUX01vZHVsZV9DbGFzcywgYXV0b2ZpdF9tb2R1bGVfY2xhc3MgKQotRlRfVVNFX01PRFVMRSggRlRfRHJpdmVyX0NsYXNzUmVjLCB0dF9kcml2ZXJfY2xhc3MgKQotRlRfVVNFX01PRFVMRSggRlRfRHJpdmVyX0NsYXNzUmVjLCB0MV9kcml2ZXJfY2xhc3MgKQotRlRfVVNFX01PRFVMRSggRlRfRHJpdmVyX0NsYXNzUmVjLCBjZmZfZHJpdmVyX2NsYXNzICkKLUZUX1VTRV9NT0RVTEUoIEZUX0RyaXZlcl9DbGFzc1JlYywgdDFjaWRfZHJpdmVyX2NsYXNzICkKLS8vRlRfVVNFX01PRFVMRSggRlRfRHJpdmVyX0NsYXNzUmVjLCBwZnJfZHJpdmVyX2NsYXNzICkKLS8vRlRfVVNFX01PRFVMRSggRlRfRHJpdmVyX0NsYXNzUmVjLCB0NDJfZHJpdmVyX2NsYXNzICkKLS8vRlRfVVNFX01PRFVMRSggRlRfRHJpdmVyX0NsYXNzUmVjLCB3aW5mbnRfZHJpdmVyX2NsYXNzICkKLS8vRlRfVVNFX01PRFVMRSggRlRfRHJpdmVyX0NsYXNzUmVjLCBwY2ZfZHJpdmVyX2NsYXNzICkKLUZUX1VTRV9NT0RVTEUoIEZUX01vZHVsZV9DbGFzcywgcHNhdXhfbW9kdWxlX2NsYXNzICkKLUZUX1VTRV9NT0RVTEUoIEZUX01vZHVsZV9DbGFzcywgcHNuYW1lc19tb2R1bGVfY2xhc3MgKQotRlRfVVNFX01PRFVMRSggRlRfTW9kdWxlX0NsYXNzLCBwc2hpbnRlcl9tb2R1bGVfY2xhc3MgKQotRlRfVVNFX01PRFVMRSggRlRfUmVuZGVyZXJfQ2xhc3MsIGZ0X3Jhc3RlcjFfcmVuZGVyZXJfY2xhc3MgKQotRlRfVVNFX01PRFVMRSggRlRfTW9kdWxlX0NsYXNzLCBzZm50X21vZHVsZV9jbGFzcyApCi1GVF9VU0VfTU9EVUxFKCBGVF9SZW5kZXJlcl9DbGFzcywgZnRfc21vb3RoX3JlbmRlcmVyX2NsYXNzICkKLUZUX1VTRV9NT0RVTEUoIEZUX1JlbmRlcmVyX0NsYXNzLCBmdF9zbW9vdGhfbGNkX3JlbmRlcmVyX2NsYXNzICkKLUZUX1VTRV9NT0RVTEUoIEZUX1JlbmRlcmVyX0NsYXNzLCBmdF9zbW9vdGhfbGNkdl9yZW5kZXJlcl9jbGFzcyApCi0vL0ZUX1VTRV9NT0RVTEUoIEZUX0RyaXZlcl9DbGFzc1JlYywgYmRmX2RyaXZlcl9jbGFzcyApCi0KLS8qIEVPRiAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NmU2NGUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9jb25maWcvZnRvcHRpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDg4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG9wdGlvbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVXNlci1zZWxlY3RhYmxlIGNvbmZpZ3VyYXRpb24gbWFjcm9zIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVE9QVElPTl9IX18KLSNkZWZpbmUgX19GVE9QVElPTl9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBVU0VSLVNFTEVDVEFCTEUgQ09ORklHVVJBVElPTiBNQUNST1MgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gbWFjcm8gZGVmaW5pdGlvbnMgZm9yICAgICovCi0gIC8qIGEgc3RhbmRhcmQgYnVpbGQgb2YgdGhlIEZyZWVUeXBlIGxpYnJhcnkuICBUaGVyZSBhcmUgdGhyZWUgd2F5cyB0byAgICAqLwotICAvKiB1c2UgdGhpcyBmaWxlIHRvIGJ1aWxkIHByb2plY3Qtc3BlY2lmaWMgdmVyc2lvbnMgb2YgdGhlIGxpYnJhcnk6ICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAtIFlvdSBjYW4gbW9kaWZ5IHRoaXMgZmlsZSBieSBoYW5kLCBidXQgdGhpcyBpcyBub3QgcmVjb21tZW5kZWQgaW4gICAqLwotICAvKiAgICBjYXNlcyB3aGVyZSB5b3Ugd291bGQgbGlrZSB0byBidWlsZCBzZXZlcmFsIHZlcnNpb25zIG9mIHRoZSAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSBmcm9tIGEgc2luZ2xlIHNvdXJjZSBkaXJlY3RvcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSBZb3UgY2FuIHB1dCBhIGNvcHkgb2YgdGhpcyBmaWxlIGluIHlvdXIgYnVpbGQgZGlyZWN0b3J5LCBtb3JlICAgICAgKi8KLSAgLyogICAgcHJlY2lzZWx5IGluIGAkQlVJTEQvZnJlZXR5cGUvY29uZmlnL2Z0b3B0aW9uLmgnLCB3aGVyZSBgJEJVSUxEJyAgICovCi0gIC8qICAgIGlzIHRoZSBuYW1lIG9mIGEgZGlyZWN0b3J5IHRoYXQgaXMgaW5jbHVkZWQgX2JlZm9yZV8gdGhlIEZyZWVUeXBlICAqLwotICAvKiAgICBpbmNsdWRlIHBhdGggZHVyaW5nIGNvbXBpbGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBkZWZhdWx0IEZyZWVUeXBlIE1ha2VmaWxlcyBhbmQgSmFtZmlsZXMgdXNlIHRoZSBidWlsZCAgICAgICAgICAqLwotICAvKiAgICBkaXJlY3RvcnkgYGJ1aWxkcy88c3lzdGVtPicgYnkgZGVmYXVsdCwgYnV0IHlvdSBjYW4gZWFzaWx5IGNoYW5nZSAgKi8KLSAgLyogICAgdGhhdCBmb3IgeW91ciBvd24gcHJvamVjdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSBDb3B5IHRoZSBmaWxlIDxmdDJidWlsZC5oPiB0byBgJEJVSUxEL2Z0MmJ1aWxkLmgnIGFuZCBtb2RpZnkgaXQgICAgKi8KLSAgLyogICAgc2xpZ2h0bHkgdG8gcHJlLWRlZmluZSB0aGUgbWFjcm8gRlRfQ09ORklHX09QVElPTlNfSCB1c2VkIHRvICAgICAgICovCi0gIC8qICAgIGxvY2F0ZSB0aGlzIGZpbGUgZHVyaW5nIHRoZSBidWlsZC4gIEZvciBleGFtcGxlLCAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05TX0ggIDxteWZ0b3B0aW9ucy5oPiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgI2luY2x1ZGUgPGZyZWV0eXBlL2NvbmZpZy9mdGhlYWRlci5oPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lsbCB1c2UgYCRCVUlMRC9teWZ0b3B0aW9ucy5oJyBpbnN0ZWFkIG9mIHRoaXMgZmlsZSBmb3IgbWFjcm8gICAgICovCi0gIC8qICAgIGRlZmluaXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSBhbHNvIHRoYXQgeW91IGNhbiBzaW1pbGFybHkgcHJlLWRlZmluZSB0aGUgbWFjcm8gICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NPTkZJR19NT0RVTEVTX0ggdXNlZCB0byBsb2NhdGUgdGhlIGZpbGUgbGlzdGluZyBvZiB0aGUgbW9kdWxlcyAqLwotICAvKiAgICB0aGF0IGFyZSBzdGF0aWNhbGx5IGxpbmtlZCB0byB0aGUgbGlicmFyeSBhdCBjb21waWxlIHRpbWUuICBCeSAgICAgKi8KLSAgLyogICAgZGVmYXVsdCwgdGhpcyBmaWxlIGlzIDxmcmVldHlwZS9jb25maWcvZnRtb2R1bGUuaD4uICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXZSBoaWdobHkgcmVjb21tZW5kIHVzaW5nIHRoZSB0aGlyZCBtZXRob2Qgd2hlbmV2ZXIgcG9zc2libGUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogRyBFIE4gRSBSIEEgTCAgIEYgUiBFIEUgVCBZIFAgRSAgIDIgICBDIE8gTiBGIEkgRyBVIFIgQSBUIEkgTyBOICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyBpZiB5b3Ugd2FudCB0byBhY3RpdmF0ZSBzdWItcGl4ZWwgcmVuZGVyaW5nICAqLwotICAvKiAoYS5rLmEuIExDRCByZW5kZXJpbmcsIG9yIENsZWFyVHlwZSkgaW4gdGhpcyBidWlsZCBvZiB0aGUgbGlicmFyeS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgY292ZXJlZCBieSBzZXZlcmFsIE1pY3Jvc29mdCBwYXRlbnRzICAgICAgICAqLwotICAvKiBhbmQgc2hvdWxkIG5vdCBiZSBhY3RpdmF0ZWQgaW4gYW55IGRlZmF1bHQgYnVpbGQgb2YgdGhlIGxpYnJhcnkuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgbWFjcm8gaGFzIG5vIGltcGFjdCBvbiB0aGUgRnJlZVR5cGUgQVBJLCBvbmx5IG9uIGl0cyAgICAgICAgICAgICAqLwotICAvKiBfaW1wbGVtZW50YXRpb25fLiAgRm9yIGV4YW1wbGUsIHVzaW5nIEZUX1JFTkRFUl9NT0RFX0xDRCB3aGVuIGNhbGxpbmcgKi8KLSAgLyogRlRfUmVuZGVyX0dseXBoIHN0aWxsIGdlbmVyYXRlcyBhIGJpdG1hcCB0aGF0IGlzIDMgdGltZXMgd2lkZXIgdGhhbiAgICovCi0gIC8qIHRoZSBvcmlnaW5hbCBzaXplIGluIGNhc2UgdGhpcyBtYWNybyBpc24ndCBkZWZpbmVkOyBob3dldmVyLCBlYWNoICAgICAqLwotICAvKiB0cmlwbGV0IG9mIHN1YnBpeGVscyBoYXMgUj1HPUIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgaXMgZG9uZSB0byBhbGxvdyBGcmVlVHlwZSBjbGllbnRzIHRvIHJ1biB1bm1vZGlmaWVkLCBmb3JjaW5nICAgICAqLwotICAvKiB0aGVtIHRvIGRpc3BsYXkgbm9ybWFsIGdyYXktbGV2ZWwgYW50aS1hbGlhc2VkIGdseXBocy4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1hbnkgY29tcGlsZXJzIHByb3ZpZGUgYSBub24tQU5TSSA2NC1iaXQgZGF0YSB0eXBlIHRoYXQgY2FuIGJlIHVzZWQgICAqLwotICAvKiBieSBGcmVlVHlwZSB0byBzcGVlZCB1cCBzb21lIGNvbXB1dGF0aW9ucy4gIEhvd2V2ZXIsIHRoaXMgd2lsbCBjcmVhdGUgKi8KLSAgLyogc29tZSBwcm9ibGVtcyB3aGVuIGNvbXBpbGluZyB0aGUgbGlicmFyeSBpbiBzdHJpY3QgQU5TSSBtb2RlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGb3IgdGhpcyByZWFzb24sIHRoZSB1c2Ugb2YgNjQtYml0IGludGVnZXJzIGlzIG5vcm1hbGx5IGRpc2FibGVkIHdoZW4gKi8KLSAgLyogdGhlIF9fU1REQ19fIG1hY3JvIGlzIGRlZmluZWQuICBZb3UgY2FuIGhvd2V2ZXIgZGlzYWJsZSB0aGlzIGJ5ICAgICAgICovCi0gIC8qIGRlZmluaW5nIHRoZSBtYWNybyBGVF9DT05GSUdfT1BUSU9OX0ZPUkNFX0lOVDY0IGhlcmUuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRm9yIG1vc3QgY29tcGlsZXJzLCB0aGlzIHdpbGwgb25seSBjcmVhdGUgY29tcGlsYXRpb24gd2FybmluZ3Mgd2hlbiAgICovCi0gIC8qIGJ1aWxkaW5nIHRoZSBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT2JOb3RlOiBUaGUgY29tcGlsZXItc3BlY2lmaWMgNjQtYml0IGludGVnZXJzIGFyZSBkZXRlY3RlZCBpbiB0aGUgICAgICovCi0gIC8qICAgICAgICAgZmlsZSBgZnRjb25maWcuaCcgZWl0aGVyIHN0YXRpY2FsbHkgb3IgdGhyb3VnaCB0aGUgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIGBjb25maWd1cmUnIHNjcmlwdCBvbiBzdXBwb3J0ZWQgcGxhdGZvcm1zLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgRlRfQ09ORklHX09QVElPTl9GT1JDRV9JTlQ2NAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJZiB0aGlzIG1hY3JvIGlzIGRlZmluZWQsIGRvIG5vdCB0cnkgdG8gdXNlIGFuIGFzc2VtYmxlciB2ZXJzaW9uIG9mICAgKi8KLSAgLyogcGVyZm9ybWFuY2UtY3JpdGljYWwgZnVuY3Rpb25zIChlLmcuIEZUX011bEZpeCkuICBZb3Ugc2hvdWxkIG9ubHkgZG8gICovCi0gIC8qIHRoYXQgdG8gdmVyaWZ5IHRoYXQgdGhlIGFzc2VtYmxlciBmdW5jdGlvbiB3b3JrcyBwcm9wZXJseSwgb3IgdG8gICAgICAqLwotICAvKiBleGVjdXRlIGJlbmNobWFyayB0ZXN0cyBvZiB0aGUgdmFyaW91cyBpbXBsZW1lbnRhdGlvbnMuICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9OT19BU1NFTUJMRVIgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSWYgdGhpcyBtYWNybyBpcyBkZWZpbmVkLCB0cnkgdG8gdXNlIGFuIGlubGluZWQgYXNzZW1ibGVyIHZlcnNpb24gb2YgICovCi0gIC8qIHRoZSBgRlRfTXVsRml4JyBmdW5jdGlvbiwgd2hpY2ggaXMgYSBgaG90c3BvdCcgd2hlbiBsb2FkaW5nIGFuZCAgICAgICAqLwotICAvKiBoaW50aW5nIGdseXBocywgYW5kIHdoaWNoIHNob3VsZCBiZSBleGVjdXRlZCBhcyBmYXN0IGFzIHBvc3NpYmxlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCBpZiB5b3VyIGNvbXBpbGVyIG9yIENQVSBpcyBub3Qgc3VwcG9ydGVkLCB0aGlzIHdpbGwgZGVmYXVsdCAqLwotICAvKiB0byB0aGUgc3RhbmRhcmQgYW5kIHBvcnRhYmxlIGltcGxlbWVudGF0aW9uIGZvdW5kIGluIGBmdGNhbGMuYycuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fSU5MSU5FX01VTEZJWAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBMWlctY29tcHJlc3NlZCBmaWxlIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRnJlZVR5cGUgbm93IGhhbmRsZXMgZm9udCBmaWxlcyB0aGF0IGhhdmUgYmVlbiBjb21wcmVzc2VkIHdpdGggdGhlICAqLwotICAvKiAgIGBjb21wcmVzcycgcHJvZ3JhbS4gIFRoaXMgaXMgbW9zdGx5IHVzZWQgdG8gcGFyc2UgbWFueSBvZiB0aGUgUENGICAgKi8KLSAgLyogICBmaWxlcyB0aGF0IGNvbWUgd2l0aCB2YXJpb3VzIFgxMSBkaXN0cmlidXRpb25zLiAgVGhlIGltcGxlbWVudGF0aW9uICovCi0gIC8qICAgdXNlcyBOZXRCU0QncyBgem9wZW4nIHRvIHBhcnRpYWxseSB1bmNvbXByZXNzIHRoZSBmaWxlIG9uIHRoZSBmbHkgICAqLwotICAvKiAgIChzZWUgc3JjL2x6dy9mdGd6aXAuYykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgYGZlYXR1cmUnLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9VU0VfTFpXCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEd6aXAtY29tcHJlc3NlZCBmaWxlIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGcmVlVHlwZSBub3cgaGFuZGxlcyBmb250IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGNvbXByZXNzZWQgd2l0aCB0aGUgICovCi0gIC8qICAgYGd6aXAnIHByb2dyYW0uICBUaGlzIGlzIG1vc3RseSB1c2VkIHRvIHBhcnNlIG1hbnkgb2YgdGhlIFBDRiBmaWxlcyAqLwotICAvKiAgIHRoYXQgY29tZSB3aXRoIFhGcmVlODYuICBUaGUgaW1wbGVtZW50YXRpb24gdXNlcyBgemxpYicgdG8gICAgICAgICAgKi8KLSAgLyogICBwYXJ0aWFsbHkgdW5jb21wcmVzcyB0aGUgZmlsZSBvbiB0aGUgZmx5IChzZWUgc3JjL2d6aXAvZnRnemlwLmMpLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSB3YW50IHRvIGVuYWJsZSB0aGlzIGBmZWF0dXJlJy4gIFNlZSBhbHNvICAgKi8KLSAgLyogICB0aGUgbWFjcm8gRlRfQ09ORklHX09QVElPTl9TWVNURU1fWkxJQiBiZWxvdy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLy8jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fVVNFX1pMSUIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogWkxpYiBsaWJyYXJ5IHNlbGVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoaXMgbWFjcm8gaXMgb25seSB1c2VkIHdoZW4gRlRfQ09ORklHX09QVElPTl9VU0VfWkxJQiBpcyBkZWZpbmVkLiAgKi8KLSAgLyogICBJdCBhbGxvd3MgRnJlZVR5cGUncyBgZnRnemlwJyBjb21wb25lbnQgdG8gbGluayB0byB0aGUgc3lzdGVtJ3MgICAgICovCi0gIC8qICAgaW5zdGFsbGF0aW9uIG9mIHRoZSBaTGliIGxpYnJhcnkuICBUaGlzIGlzIHVzZWZ1bCBvbiBzeXN0ZW1zIGxpa2UgICAqLwotICAvKiAgIFVuaXggb3IgVk1TIHdoZXJlIGl0IGdlbmVyYWxseSBpcyBhbHJlYWR5IGF2YWlsYWJsZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSWYgeW91IGxldCBpdCB1bmRlZmluZWQsIHRoZSBjb21wb25lbnQgd2lsbCB1c2UgaXRzIG93biBjb3B5ICAgICAgICAqLwotICAvKiAgIG9mIHRoZSB6bGliIHNvdXJjZXMgaW5zdGVhZC4gIFRoZXNlIGhhdmUgYmVlbiBtb2RpZmllZCB0byBiZSAgICAgICAgKi8KLSAgLyogICBpbmNsdWRlZCBkaXJlY3RseSB3aXRoaW4gdGhlIGNvbXBvbmVudCBhbmQgKm5vdCogZXhwb3J0IGV4dGVybmFsICAgICovCi0gIC8qICAgZnVuY3Rpb24gbmFtZXMuICBUaGlzIGFsbG93cyB5b3UgdG8gbGluayBhbnkgcHJvZ3JhbSB3aXRoIEZyZWVUeXBlICAqLwotICAvKiAgIF9hbmRfIFpMaWIgd2l0aG91dCBsaW5raW5nIGNvbmZsaWN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRG8gbm90ICN1bmRlZiB0aGlzIG1hY3JvIGhlcmUgc2luY2UgdGhlIGJ1aWxkIHN5c3RlbSBtaWdodCBkZWZpbmUgICAqLwotICAvKiAgIGl0IGZvciBjZXJ0YWluIGNvbmZpZ3VyYXRpb25zIG9ubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fU1lTVEVNX1pMSUIgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQnppcDItY29tcHJlc3NlZCBmaWxlIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZyZWVUeXBlIG5vdyBoYW5kbGVzIGZvbnQgZmlsZXMgdGhhdCBoYXZlIGJlZW4gY29tcHJlc3NlZCB3aXRoIHRoZSAgKi8KLSAgLyogICBgYnppcDInIHByb2dyYW0uICBUaGlzIGlzIG1vc3RseSB1c2VkIHRvIHBhcnNlIG1hbnkgb2YgdGhlIFBDRiAgICAgICovCi0gIC8qICAgZmlsZXMgdGhhdCBjb21lIHdpdGggWEZyZWU4Ni4gIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGBsaWJiejInIHRvICAqLwotICAvKiAgIHBhcnRpYWxseSB1bmNvbXByZXNzIHRoZSBmaWxlIG9uIHRoZSBmbHkgKHNlZSBzcmMvYnppcDIvZnRiemlwMi5jKS4gKi8KLSAgLyogICBDb250cmFyeSB0byBnemlwLCBiemlwMiBjdXJyZW50bHkgaXMgbm90IGluY2x1ZGVkIGFuZCBuZWVkIHRvIHVzZSAgICovCi0gIC8qICAgdGhlIHN5c3RlbSBhdmFpbGFibGUgYnppcDIgaW1wbGVtZW50YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEZWZpbmUgdGhpcyBtYWNybyBpZiB5b3Ugd2FudCB0byBlbmFibGUgdGhpcyBgZmVhdHVyZScuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX1VTRV9CWklQMiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgdG8gZGlzYWJsZSB0aGUgdXNlIG9mIGZpbGUgc3RyZWFtIGZ1bmN0aW9ucyBhbmQgdHlwZXMsIEZJTEUsICAgKi8KLSAgLyogZm9wZW4oKSBldGMuICBFbmFibGVzIHRoZSB1c2Ugb2Ygc21hbGxlciBzeXN0ZW0gbGlicmFyaWVzIG9uIGVtYmVkZGVkICovCi0gIC8qIHN5c3RlbXMgdGhhdCBoYXZlIG11bHRpcGxlIHN5c3RlbSBsaWJyYXJpZXMsIHNvbWUgd2l0aCBvciB3aXRob3V0ICAgICAqLwotICAvKiBmaWxlIHN0cmVhbSBzdXBwb3J0LCBpbiB0aGUgY2FzZXMgd2hlcmUgZmlsZSBzdHJlYW0gc3VwcG9ydCBpcyBub3QgICAgKi8KLSAgLyogbmVjZXNzYXJ5IHN1Y2ggYXMgbWVtb3J5IGxvYWRpbmcgb2YgZm9udCBmaWxlcy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX0RJU0FCTEVfU1RSRUFNX1NVUFBPUlQgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUE5HIGJpdG1hcCBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZyZWVUeXBlIG5vdyBoYW5kbGVzIGxvYWRpbmcgY29sb3IgYml0bWFwIGdseXBocyBpbiB0aGUgUE5HIGZvcm1hdC4gKi8KLSAgLyogICBUaGlzIHJlcXVpcmVzIGhlbHAgZnJvbSB0aGUgZXh0ZXJuYWwgbGlicG5nIGxpYnJhcnkuICBVbmNvbXByZXNzZWQgICovCi0gIC8qICAgY29sb3IgYml0bWFwcyBkbyBub3QgbmVlZCBhbnkgZXh0ZXJuYWwgbGlicmFyaWVzIGFuZCB3aWxsIGJlICAgICAgICAqLwotICAvKiAgIHN1cHBvcnRlZCByZWdhcmRsZXNzIG9mIHRoaXMgY29uZmlndXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgYGZlYXR1cmUnLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9VU0VfUE5HICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEhhcmZCdXp6IHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGcmVlVHlwZSB1c2VzIHRoZSBIYXJmQnV6eiBsaWJyYXJ5IHRvIGltcHJvdmUgYXV0by1oaW50aW5nIG9mICAgICAgICovCi0gIC8qICAgT3BlblR5cGUgZm9udHMuICBJZiBhdmFpbGFibGUsIG1hbnkgZ2x5cGhzIG5vdCBkaXJlY3RseSBhZGRyZXNzYWJsZSAqLwotICAvKiAgIGJ5IGEgZm9udCdzIGNoYXJhY3RlciBtYXAgd2lsbCBiZSBoaW50ZWQgYWxzby4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRGVmaW5lIHRoaXMgbWFjcm8gaWYgeW91IHdhbnQgdG8gZW5hYmxlIHRoaXMgYGZlYXR1cmUnLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9VU0VfSEFSRkJVWlogKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRExMIGV4cG9ydCBjb21waWxhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFdoZW4gY29tcGlsaW5nIEZyZWVUeXBlIGFzIGEgRExMLCBzb21lIHN5c3RlbXMvY29tcGlsZXJzIG5lZWQgYSAgICAgKi8KLSAgLyogICBzcGVjaWFsIGtleXdvcmQgaW4gZnJvbnQgT1IgYWZ0ZXIgdGhlIHJldHVybiB0eXBlIG9mIGZ1bmN0aW9uICAgICAgICovCi0gIC8qICAgZGVjbGFyYXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUd28gbWFjcm9zIGFyZSB1c2VkIHdpdGhpbiB0aGUgRnJlZVR5cGUgc291cmNlIGNvZGUgdG8gZGVmaW5lICAgICAgICovCi0gIC8qICAgZXhwb3J0ZWQgbGlicmFyeSBmdW5jdGlvbnM6IEZUX0VYUE9SVCBhbmQgRlRfRVhQT1JUX0RFRi4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEZUX0VYUE9SVCggcmV0dXJuX3R5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBpcyB1c2VkIGluIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24sIGFzIGluICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgRlRfRVhQT1JUKCBGVF9FcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIEZUX0luaXRfRnJlZVR5cGUoIEZUX0xpYnJhcnkqICBhbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgRlRfRVhQT1JUX0RFRiggcmV0dXJuX3R5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIGlzIHVzZWQgaW4gYSBmdW5jdGlvbiBkZWZpbml0aW9uLCBhcyBpbiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgRlRfSW5pdF9GcmVlVHlwZSggRlRfTGlicmFyeSogIGFsaWJyYXJ5ICkgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgWW91IGNhbiBwcm92aWRlIHlvdXIgb3duIGltcGxlbWVudGF0aW9uIG9mIEZUX0VYUE9SVCBhbmQgICAgICAgICAgICAqLwotICAvKiAgIEZUX0VYUE9SVF9ERUYgaGVyZSBpZiB5b3Ugd2FudC4gIElmIHlvdSBsZWF2ZSB0aGVtIHVuZGVmaW5lZCwgdGhleSAgKi8KLSAgLyogICB3aWxsIGJlIGxhdGVyIGF1dG9tYXRpY2FsbHkgZGVmaW5lZCBhcyBgZXh0ZXJuIHJldHVybl90eXBlJyB0byAgICAgICovCi0gIC8qICAgYWxsb3cgbm9ybWFsIGNvbXBpbGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEbyBub3QgI3VuZGVmIHRoZXNlIG1hY3JvcyBoZXJlIHNpbmNlIHRoZSBidWlsZCBzeXN0ZW0gbWlnaHQgZGVmaW5lICovCi0gIC8qICAgdGhlbSBmb3IgY2VydGFpbiBjb25maWd1cmF0aW9ucyBvbmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfRVhQT1JUKHgpICAgICAgZXh0ZXJuIHggKi8KLS8qICNkZWZpbmUgRlRfRVhQT1JUX0RFRih4KSAgeCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHbHlwaCBQb3N0c2NyaXB0IE5hbWVzIGhhbmRsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQnkgZGVmYXVsdCwgRnJlZVR5cGUgMiBpcyBjb21waWxlZCB3aXRoIHRoZSBgcHNuYW1lcycgbW9kdWxlLiAgVGhpcyAqLwotICAvKiAgIG1vZHVsZSBpcyBpbiBjaGFyZ2Ugb2YgY29udmVydGluZyBhIGdseXBoIG5hbWUgc3RyaW5nIGludG8gYSAgICAgICAgKi8KLSAgLyogICBVbmljb2RlIHZhbHVlLCBvciByZXR1cm4gYSBNYWNpbnRvc2ggc3RhbmRhcmQgZ2x5cGggbmFtZSBmb3IgdGhlICAgICovCi0gIC8qICAgdXNlIHdpdGggdGhlIFRydWVUeXBlIGBwb3N0JyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBVbmRlZmluZSB0aGlzIG1hY3JvIGlmIHlvdSBkbyBub3Qgd2FudCBgcHNuYW1lcycgY29tcGlsZWQgaW4geW91ciAgICovCi0gIC8qICAgYnVpbGQgb2YgRnJlZVR5cGUuICBUaGlzIGhhcyB0aGUgZm9sbG93aW5nIGVmZmVjdHM6ICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAtIFRoZSBUcnVlVHlwZSBkcml2ZXIgd2lsbCBwcm92aWRlIGl0cyBvd24gc2V0IG9mIGdseXBoIG5hbWVzLCAgICAgICovCi0gIC8qICAgICBpZiB5b3UgYnVpbGQgaXQgdG8gc3VwcG9ydCBwb3N0c2NyaXB0IG5hbWVzIGluIHRoZSBUcnVlVHlwZSAgICAgICAqLwotICAvKiAgICAgYHBvc3QnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgLSBUaGUgVHlwZSAxIGRyaXZlciB3aWxsIG5vdCBiZSBhYmxlIHRvIHN5bnRoZXNpemUgYSBVbmljb2RlICAgICAgICAqLwotICAvKiAgICAgY2hhcm1hcCBvdXQgb2YgdGhlIGdseXBocyBmb3VuZCBpbiB0aGUgZm9udHMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgWW91IHdvdWxkIG5vcm1hbGx5IHVuZGVmaW5lIHRoaXMgY29uZmlndXJhdGlvbiBtYWNybyB3aGVuIGJ1aWxkaW5nICAqLwotICAvKiAgIGEgdmVyc2lvbiBvZiBGcmVlVHlwZSB0aGF0IGRvZXNuJ3QgY29udGFpbiBhIFR5cGUgMSBvciBDRkYgZHJpdmVyLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQb3N0c2NyaXB0IE5hbWVzIHRvIFVuaWNvZGUgVmFsdWVzIHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQnkgZGVmYXVsdCwgRnJlZVR5cGUgMiBpcyBidWlsdCB3aXRoIHRoZSBgUFNOYW1lcycgbW9kdWxlIGNvbXBpbGVkICAqLwotICAvKiAgIGluLiAgQW1vbmcgb3RoZXIgdGhpbmdzLCB0aGUgbW9kdWxlIGlzIHVzZWQgdG8gY29udmVydCBhIGdseXBoIG5hbWUgKi8KLSAgLyogICBpbnRvIGEgVW5pY29kZSB2YWx1ZS4gIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgaW4gb3JkZXIgdG8gICAgICAgICovCi0gIC8qICAgc3ludGhlc2l6ZSBvbiB0aGUgZmx5IGEgVW5pY29kZSBjaGFybWFwIGZyb20gdGhlIENGRi9UeXBlIDEgZHJpdmVyICAqLwotICAvKiAgIHRocm91Z2ggYSBiaWcgdGFibGUgbmFtZWQgdGhlIGBBZG9iZSBHbHlwaCBMaXN0JyAoQUdMKS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVW5kZWZpbmUgdGhpcyBtYWNybyBpZiB5b3UgZG8gbm90IHdhbnQgdGhlIEFkb2JlIEdseXBoIExpc3QgICAgICAgICAqLwotICAvKiAgIGNvbXBpbGVkIGluIHlvdXIgYFBTTmFtZXMnIG1vZHVsZS4gIFRoZSBUeXBlIDEgZHJpdmVyIHdpbGwgbm90IGJlICAgKi8KLSAgLyogICBhYmxlIHRvIHN5bnRoZXNpemUgYSBVbmljb2RlIGNoYXJtYXAgb3V0IG9mIHRoZSBnbHlwaHMgZm91bmQgaW4gdGhlICovCi0gIC8qICAgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9BRE9CRV9HTFlQSF9MSVNUCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN1cHBvcnQgZm9yIE1hYyBmb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEZWZpbmUgdGhpcyBtYWNybyBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBvdXRsaW5lIGZvbnRzIGluIE1hYyAgICAgICovCi0gIC8qICAgZm9ybWF0IChtYWMgZGZvbnQsIG1hYyByZXNvdXJjZSwgbWFjYmluYXJ5IGNvbnRhaW5pbmcgYSBtYWMgICAgICAgICAqLwotICAvKiAgIHJlc291cmNlKSBvbiBub24tTWFjIHBsYXRmb3Jtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTm90ZSB0aGF0IHRoZSBgRk9ORCcgcmVzb3VyY2UgaXNuJ3QgY2hlY2tlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiBGVF9DT05GSUdfT1BUSU9OX01BQ19GT05UUwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHdWVzc2luZyBtZXRob2RzIHRvIGFjY2VzcyBlbWJlZGRlZCByZXNvdXJjZSBmb3JrcyAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRW5hYmxlIGV4dHJhIE1hYyBmb250cyBzdXBwb3J0IG9uIG5vbi1NYWMgcGxhdGZvcm1zIChlLmcuICAgICAgICAgICAqLwotICAvKiAgIEdOVS9MaW51eCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgUmVzb3VyY2UgZm9ya3Mgd2hpY2ggaW5jbHVkZSBmb250cyBkYXRhIGFyZSBzdG9yZWQgc29tZXRpbWVzIGluICAgICAqLwotICAvKiAgIGxvY2F0aW9ucyB3aGljaCB1c2VycyBvciBkZXZlbG9wZXJzIGRvbid0IGV4cGVjdGVkLiAgSW4gc29tZSBjYXNlcywgKi8KLSAgLyogICByZXNvdXJjZSBmb3JrcyBzdGFydCB3aXRoIHNvbWUgb2Zmc2V0IGZyb20gdGhlIGhlYWQgb2YgYSBmaWxlLiAgSW4gICovCi0gIC8qICAgb3RoZXIgY2FzZXMsIHRoZSBhY3R1YWwgcmVzb3VyY2UgZm9yayBpcyBzdG9yZWQgaW4gZmlsZSBkaWZmZXJlbnQgICAqLwotICAvKiAgIGZyb20gd2hhdCB0aGUgdXNlciBzcGVjaWZpZXMuICBJZiB0aGlzIG9wdGlvbiBpcyBhY3RpdmF0ZWQsICAgICAgICAgKi8KLSAgLyogICBGcmVlVHlwZSB0cmllcyB0byBndWVzcyB3aGV0aGVyIHN1Y2ggb2Zmc2V0cyBvciBkaWZmZXJlbnQgZmlsZSAgICAgICovCi0gIC8qICAgbmFtZXMgbXVzdCBiZSB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOb3RlIHRoYXQgbm9ybWFsLCBkaXJlY3QgYWNjZXNzIG9mIHJlc291cmNlIGZvcmtzIGlzIGNvbnRyb2xsZWQgdmlhICovCi0gIC8qICAgdGhlIEZUX0NPTkZJR19PUFRJT05fTUFDX0ZPTlRTIG9wdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX01BQ19GT05UUwotI2RlZmluZSBGVF9DT05GSUdfT1BUSU9OX0dVRVNTSU5HX0VNQkVEREVEX1JGT1JLCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQWxsb3cgdGhlIHVzZSBvZiBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2UgdG8gbG9hZCB0eXBlZmFjZXMgdGhhdCAgICAgICovCi0gIC8qIGNvbnRhaW4gbm8gZ2x5cGggZGF0YSwgYnV0IHN1cHBseSBpdCB2aWEgYSBjYWxsYmFjayBmdW5jdGlvbi4gICAgICAgICAqLwotICAvKiBUaGlzIGlzIHJlcXVpcmVkIGJ5IGNsaWVudHMgc3VwcG9ydGluZyBkb2N1bWVudCBmb3JtYXRzIHdoaWNoICAgICAgICAgKi8KLSAgLyogc3VwcGx5IGZvbnQgZGF0YSBpbmNyZW1lbnRhbGx5IGFzIHRoZSBkb2N1bWVudCBpcyBwYXJzZWQsIHN1Y2ggICAgICAgICovCi0gIC8qIGFzIHRoZSBHaG9zdHNjcmlwdCBpbnRlcnByZXRlciBmb3IgdGhlIFBvc3RTY3JpcHQgbGFuZ3VhZ2UuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVuZGVyIHBvb2wgdXNlZCBieSB0aGUgc2Nhbi1saW5lIGNvbnZlcnRlciAgKi8KLSAgLyogdG8gZG8gYWxsIG9mIGl0cyB3b3JrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9SRU5ERVJfUE9PTF9TSVpFICAxNjM4NEwKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRlRfTUFYX01PRFVMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtb2R1bGVzIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQgaW4gYSBzaW5nbGUgICAgKi8KLSAgLyogICBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4gIDMyIGlzIHRoZSBkZWZhdWx0LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9NQVhfTU9EVUxFUyAgMzIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVidWcgbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEZyZWVUeXBlIGNhbiBiZSBjb21waWxlZCBpbiBkZWJ1ZyBvciB0cmFjZSBtb2RlLiAgSW4gZGVidWcgbW9kZSwgICAgKi8KLSAgLyogICBlcnJvcnMgYXJlIHJlcG9ydGVkIHRocm91Z2ggdGhlIGBmdGRlYnVnJyBjb21wb25lbnQuICBJbiB0cmFjZSAgICAgICovCi0gIC8qICAgbW9kZSwgYWRkaXRpb25hbCBtZXNzYWdlcyBhcmUgc2VudCB0byB0aGUgc3RhbmRhcmQgb3V0cHV0IGR1cmluZyAgICAqLwotICAvKiAgIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRGVmaW5lIEZUX0RFQlVHX0xFVkVMX0VSUk9SIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5IGluIGRlYnVnIG1vZGUuICAgICAqLwotICAvKiAgIERlZmluZSBGVF9ERUJVR19MRVZFTF9UUkFDRSB0byBidWlsZCBpdCBpbiB0cmFjZSBtb2RlLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRG9uJ3QgZGVmaW5lIGFueSBvZiB0aGVzZSBtYWNyb3MgdG8gY29tcGlsZSBpbiBgcmVsZWFzZScgbW9kZSEgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEbyBub3QgI3VuZGVmIHRoZXNlIG1hY3JvcyBoZXJlIHNpbmNlIHRoZSBidWlsZCBzeXN0ZW0gbWlnaHQgZGVmaW5lICovCi0gIC8qICAgdGhlbSBmb3IgY2VydGFpbiBjb25maWd1cmF0aW9ucyBvbmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfREVCVUdfTEVWRUxfRVJST1IgKi8KLS8qICNkZWZpbmUgRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQXV0b2ZpdHRlciBkZWJ1Z2dpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIElmIEZUX0RFQlVHX0FVVE9GSVQgaXMgZGVmaW5lZCwgRnJlZVR5cGUgcHJvdmlkZXMgc29tZSBtZWFucyB0byAgICAgKi8KLSAgLyogICBjb250cm9sIHRoZSBhdXRvZml0dGVyIGJlaGF2aW91ciBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIHdpdGggZ2xvYmFsICovCi0gIC8qICAgYm9vbGVhbiB2YXJpYWJsZXMgKGNvbnNlcXVlbnRseSwgeW91IHNob3VsZCAqbmV2ZXIqIGVuYWJsZSB0aGlzICAgICAqLwotICAvKiAgIHdoaWxlIGNvbXBpbGluZyBpbiBgcmVsZWFzZScgbW9kZSk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBfYWZfZGVidWdfZGlzYWJsZV9ob3J6X2hpbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgX2FmX2RlYnVnX2Rpc2FibGVfdmVydF9oaW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIF9hZl9kZWJ1Z19kaXNhYmxlX2JsdWVfaGludHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEFkZGl0aW9uYWxseSwgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgcHJvdmlkZSBkdW1wcyBvZiB2YXJpb3VzICAgICAgKi8KLSAgLyogICBpbnRlcm5hbCBhdXRvZml0IHN0cnVjdHVyZXMgdG8gc3Rkb3V0ICh1c2luZyBgcHJpbnRmJyk6ICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgYWZfZ2x5cGhfaGludHNfZHVtcF9wb2ludHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGFmX2dseXBoX2hpbnRzX2R1bXBfc2VnbWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBhZl9nbHlwaF9oaW50c19kdW1wX2VkZ2VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgYWZfZ2x5cGhfaGludHNfZ2V0X251bV9zZWdtZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGFmX2dseXBoX2hpbnRzX2dldF9zZWdtZW50X29mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEFzIGFuIGFyZ3VtZW50LCB0aGV5IHVzZSBhbm90aGVyIGdsb2JhbCB2YXJpYWJsZTogICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBfYWZfZGVidWdfaGludHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBQbGVhc2UgaGF2ZSBhIGxvb2sgYXQgdGhlIGBmdGdyaWQnIGRlbW8gcHJvZ3JhbSB0byBzZWUgaG93IHRob3NlICAgICovCi0gIC8qICAgdmFyaWFibGVzIGFuZCBtYWNyb3Mgc2hvdWxkIGJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEbyBub3QgI3VuZGVmIHRoZXNlIG1hY3JvcyBoZXJlIHNpbmNlIHRoZSBidWlsZCBzeXN0ZW0gbWlnaHQgZGVmaW5lICovCi0gIC8qICAgdGhlbSBmb3IgY2VydGFpbiBjb25maWd1cmF0aW9ucyBvbmx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfREVCVUdfQVVUT0ZJVCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNZW1vcnkgRGVidWdnaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRnJlZVR5cGUgbm93IGNvbWVzIHdpdGggYW4gaW50ZWdyYXRlZCBtZW1vcnkgZGVidWdnZXIgdGhhdCBpcyAgICAgICAqLwotICAvKiAgIGNhcGFibGUgb2YgZGV0ZWN0aW5nIHNpbXBsZSBlcnJvcnMgbGlrZSBtZW1vcnkgbGVha3Mgb3IgZG91YmxlICAgICAgKi8KLSAgLyogICBkZWxldGVzLiAgVG8gY29tcGlsZSBpdCB3aXRoaW4geW91ciBidWlsZCBvZiB0aGUgbGlicmFyeSwgeW91ICAgICAgICovCi0gIC8qICAgc2hvdWxkIGRlZmluZSBGVF9ERUJVR19NRU1PUlkgaGVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOb3RlIHRoYXQgdGhlIG1lbW9yeSBkZWJ1Z2dlciBpcyBvbmx5IGFjdGl2YXRlZCBhdCBydW50aW1lIHdoZW4gICAgICovCi0gIC8qICAgd2hlbiB0aGUgX2Vudmlyb25tZW50XyB2YXJpYWJsZSBgRlQyX0RFQlVHX01FTU9SWScgaXMgZGVmaW5lZCBhbHNvISAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBEbyBub3QgI3VuZGVmIHRoaXMgbWFjcm8gaGVyZSBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0IGRlZmluZSAgICovCi0gIC8qICAgaXQgZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfREVCVUdfTUVNT1JZICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1vZHVsZSBlcnJvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBJZiB0aGlzIG1hY3JvIGlzIHNldCAod2hpY2ggaXMgX25vdF8gdGhlIGRlZmF1bHQpLCB0aGUgaGlnaGVyIGJ5dGUgICovCi0gIC8qICAgb2YgYW4gZXJyb3IgY29kZSBnaXZlcyB0aGUgbW9kdWxlIGluIHdoaWNoIHRoZSBlcnJvciBoYXMgb2NjdXJyZWQsICAqLwotICAvKiAgIHdoaWxlIHRoZSBsb3dlciBieXRlIGlzIHRoZSByZWFsIGVycm9yIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgU2V0dGluZyB0aGlzIG1hY3JvIG1ha2VzIHNlbnNlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgb25seSwgc2luY2UgICAqLwotICAvKiAgIGl0IHdvdWxkIGJyZWFrIHNvdXJjZSBjb21wYXRpYmlsaXR5IG9mIGNlcnRhaW4gcHJvZ3JhbXMgdGhhdCB1c2UgICAgKi8KLSAgLyogICBGcmVlVHlwZSAyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE1vcmUgZGV0YWlscyBjYW4gYmUgZm91bmQgaW4gdGhlIGZpbGVzIGZ0bW9kZXJyLmggYW5kIGZ0ZXJyb3JzLmguICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgRlRfQ09ORklHX09QVElPTl9VU0VfTU9EVUxFX0VSUk9SUwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSWYgdGhpcyBtYWNybyBpcyBzZXQgKHdoaWNoIGlzIF9ub3RfIHRoZSBkZWZhdWx0KSwgRnJlZVR5cGUyIHdpbGwgICAqLwotICAvKiAgIGF2b2lkIGNyZWF0aW5nIGNvbnN0YW50cyB0aGF0IHJlcXVpcmUgYWRkcmVzcyBmaXh1cHMuICBJbnN0ZWFkIHRoZSAgKi8KLSAgLyogICBjb25zdGFudHMgd2lsbCBiZSBtb3ZlZCBpbnRvIGEgc3RydWN0IGFuZCBhZGRpdGlvbmFsIGludGlhbGl6YXRpb24gICovCi0gIC8qICAgY29kZSB3aWxsIGJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBTZXR0aW5nIHRoaXMgbWFjcm8gaXMgbmVlZGVkIGZvciBzeXN0ZW1zIHRoYXQgcHJvaGliaXQgYWRkcmVzcyAgICAgICovCi0gIC8qICAgZml4dXBzLCBzdWNoIGFzIEJSRVcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICBTIEYgTiBUICAgRCBSIEkgViBFIFIgICAgQyBPIE4gRiBJIEcgVSBSIEEgVCBJIE8gTiAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQgICAgICAgKi8KLSAgLyogZW1iZWRkZWQgYml0bWFwcyBpbiBhbGwgZm9ybWF0cyB1c2luZyB0aGUgU0ZOVCBtb2R1bGUgKG5hbWVseSAgICAgICAgICovCi0gIC8qIFRydWVUeXBlICYgT3BlblR5cGUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUyBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvICAgICovCi0gIC8qIGxvYWQgYW5kIGVudW1lcmF0ZSB0aGUgZ2x5cGggUG9zdHNjcmlwdCBuYW1lcyBpbiBhIFRydWVUeXBlIG9yICAgICAgICAqLwotICAvKiBPcGVuVHlwZSBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCB3aGVuIHlvdSBkbyBub3QgY29tcGlsZSB0aGUgYFBTTmFtZXMnIG1vZHVsZSBieSB1bmRlZmluaW5nICAqLwotICAvKiB0aGUgYWJvdmUgRlRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTLCB0aGUgYHNmbnQnIG1vZHVsZSB3aWxsICAgKi8KLSAgLyogY29udGFpbiBhZGRpdGlvbmFsIGNvZGUgdXNlZCB0byByZWFkIHRoZSBQUyBOYW1lcyB0YWJsZSBmcm9tIGEgZm9udC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAoQnkgZGVmYXVsdCwgdGhlIG1vZHVsZSB1c2VzIGBQU05hbWVzJyB0byBleHRyYWN0IGdseXBoIG5hbWVzLikgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9TRk5UX05BTUVTIGlmIHlvdXIgYXBwbGljYXRpb25zIG5lZWQgdG8gICAgICAgKi8KLSAgLyogYWNjZXNzIHRoZSBpbnRlcm5hbCBuYW1lIHRhYmxlIGluIGEgU0ZOVC1iYXNlZCBmb3JtYXQgbGlrZSBUcnVlVHlwZSAgICovCi0gIC8qIG9yIE9wZW5UeXBlLiAgVGhlIG5hbWUgdGFibGUgY29udGFpbnMgdmFyaW91cyBzdHJpbmdzIHVzZWQgdG8gICAgICAgICAqLwotICAvKiBkZXNjcmliZSB0aGUgZm9udCwgbGlrZSBmYW1pbHkgbmFtZSwgY29weXJpZ2h0LCB2ZXJzaW9uLCBldGMuICBJdCAgICAgKi8KLSAgLyogZG9lcyBub3QgY29udGFpbiBhbnkgZ2x5cGggbmFtZSB0aG91Z2guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBY2Nlc3NpbmcgU0ZOVCBuYW1lcyBpcyBkb25lIHRocm91Z2ggdGhlIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiAgICAgICAgKi8KLSAgLyogYGZ0c25hbWVzLmgnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX1NGTlRfTkFNRVMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVHJ1ZVR5cGUgQ01hcCBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEhlcmUgeW91IGNhbiBmaW5lLXR1bmUgd2hpY2ggVHJ1ZVR5cGUgQ01hcCB0YWJsZSBmb3JtYXQgc2hhbGwgYmUgICAgKi8KLSAgLyogICBzdXBwb3J0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8wCi0jZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8yCi0jZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF80Ci0jZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF82Ci0jZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF84Ci0jZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xMAotI2RlZmluZSBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTIKLSNkZWZpbmUgVFRfQ09ORklHX0NNQVBfRk9STUFUXzEzCi0jZGVmaW5lIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xNAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgVCBSIFUgRSBUIFkgUCBFICAgRCBSIEkgViBFIFIgICAgQyBPIE4gRiBJIEcgVSBSIEEgVCBJIE8gTiAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUiBpZiB5b3Ugd2FudCB0byBjb21waWxlICAgKi8KLSAgLyogYSBieXRlY29kZSBpbnRlcnByZXRlciBpbiB0aGUgVHJ1ZVR5cGUgZHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBCeSB1bmRlZmluaW5nIHRoaXMsIHlvdSB3aWxsIG9ubHkgY29tcGlsZSB0aGUgY29kZSBuZWNlc3NhcnkgdG8gbG9hZCAgKi8KLSAgLyogVHJ1ZVR5cGUgZ2x5cGhzIHdpdGhvdXQgaGludGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIERvIG5vdCAjdW5kZWYgdGhpcyBtYWNybyBoZXJlLCBzaW5jZSB0aGUgYnVpbGQgc3lzdGVtIG1pZ2h0ICAgICAgICAgKi8KLSAgLyogICBkZWZpbmUgaXQgZm9yIGNlcnRhaW4gY29uZmlndXJhdGlvbnMgb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgaWYgeW91IHdhbnQgdG8gY29tcGlsZSAgICAgICAqLwotICAvKiBFWFBFUklNRU5UQUwgc3VicGl4ZWwgaGludGluZyBzdXBwb3J0IGludG8gdGhlIFRydWVUeXBlIGRyaXZlci4gIFRoaXMgKi8KLSAgLyogcmVwbGFjZXMgdGhlIG5hdGl2ZSBUcnVlVHlwZSBoaW50aW5nIG1lY2hhbmlzbSB3aGVuIGFueXRoaW5nIGJ1dCAgICAgICovCi0gIC8qIEZUX1JFTkRFUl9NT0RFX01PTk8gaXMgcmVxdWVzdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRW5hYmxpbmcgdGhpcyBjYXVzZXMgdGhlIFRydWVUeXBlIGRyaXZlciB0byBpZ25vcmUgaW5zdHJ1Y3Rpb25zIHVuZGVyICovCi0gIC8qIGNlcnRhaW4gY29uZGl0aW9ucy4gIFRoaXMgaXMgZG9uZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGd1aWRlIGhlcmUsICAqLwotICAvKiB3aXRoIHNvbWUgbWlub3IgZGlmZmVyZW5jZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9jbGVhcnR5cGUvdHJ1ZXR5cGVjbGVhcnR5cGUuYXNweCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQnkgdW5kZWZpbmluZyB0aGlzLCB5b3Ugb25seSBjb21waWxlIHRoZSBjb2RlIG5lY2Vzc2FyeSB0byBoaW50ICAgICAgICovCi0gIC8qIFRydWVUeXBlIGdseXBocyB3aXRoIG5hdGl2ZSBUVCBoaW50aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGlzIG9wdGlvbiByZXF1aXJlcyBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSIHRvIGJlICAgICovCi0gIC8qICAgZGVmaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICNkZWZpbmUgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElmIHlvdSBkZWZpbmUgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcsIGEgc3BlY2lhbCB2ZXJzaW9uICAqLwotICAvKiBvZiB0aGUgVHJ1ZVR5cGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgaXMgdXNlZCB0aGF0IGRvZXNuJ3QgaW1wbGVtZW50ICAgKi8KLSAgLyogYW55IG9mIHRoZSBwYXRlbnRlZCBvcGNvZGVzIGFuZCBhbGdvcml0aG1zLiAgVGhlIHBhdGVudHMgcmVsYXRlZCB0byAgICovCi0gIC8qIFRydWVUeXBlIGhpbnRpbmcgaGF2ZSBleHBpcmVkIHdvcmxkd2lkZSBzaW5jZSBNYXkgMjAxMDsgdGhpcyBvcHRpb24gICAqLwotICAvKiBpcyBub3cgZGVwcmVjYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCB0aGUgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcgbWFjcm8gaXMgKmlnbm9yZWQqICAqLwotICAvKiBpZiB5b3UgZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVI7IGluIG90aGVyIHdvcmRzLCAgKi8KLSAgLyogZWl0aGVyIGRlZmluZSBUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSIG9yICAgICAgICAgICAgICAgICovCi0gIC8qIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HIGJ1dCBub3QgYm90aCBhdCB0aGUgc2FtZSB0aW1lLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBtYWNybyBpcyBvbmx5IHVzZWZ1bCBmb3IgYSBzbWFsbCBudW1iZXIgb2YgZm9udCBmaWxlcyAobW9zdGx5ICAgICovCi0gIC8qIGZvciBBc2lhbiBzY3JpcHRzKSB0aGF0IHJlcXVpcmUgYnl0ZWNvZGUgaW50ZXJwcmV0YXRpb24gdG8gcHJvcGVybHkgICAqLwotICAvKiBsb2FkIGdseXBocy4gIEZvciBhbGwgb3RoZXIgZm9udHMsIHRoaXMgcHJvZHVjZXMgdW5wbGVhc2FudCByZXN1bHRzLCAgKi8KLSAgLyogdGh1cyB0aGUgdW5wYXRlbnRlZCBpbnRlcnByZXRlciBpcyBuZXZlciB1c2VkIHRvIGxvYWQgZ2x5cGhzIGZyb20gICAgICovCi0gIC8qIFRydWVUeXBlIGZvbnRzIHVubGVzcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB0d28gb3B0aW9ucyBpcyB1c2VkLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAtIFRoZSB1bnBhdGVudGVkIGludGVycHJldGVyIGlzIGV4cGxpY2l0bHkgYWN0aXZhdGVkIGJ5IHRoZSB1c2VyICAgICovCi0gIC8qICAgICB0aHJvdWdoIHRoZSBGVF9QQVJBTV9UQUdfVU5QQVRFTlRFRF9ISU5USU5HIHBhcmFtZXRlciB0YWcgICAgICAgICAqLwotICAvKiAgICAgd2hlbiBvcGVuaW5nIHRoZSBGVF9GYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgLSBGcmVlVHlwZSBkZXRlY3RzIHRoYXQgdGhlIEZUX0ZhY2UgY29ycmVzcG9uZHMgdG8gb25lIG9mIHRoZSAgICAgICAqLwotICAvKiAgICAgYHRyaWNrJyBmb250cyAoZS5nLiwgYE1pbmdsaXUnKSBpdCBrbm93cyBhYm91dC4gIFRoZSBmb250IGVuZ2luZSAgKi8KLSAgLyogICAgIGNvbnRhaW5zIGEgaGFyZC1jb2RlZCBsaXN0IG9mIGZvbnQgbmFtZXMgYW5kIG90aGVyIG1hdGNoaW5nICAgICAgICovCi0gIC8qICAgICBwYXJhbWV0ZXJzIChzZWUgZnVuY3Rpb24gYHR0X2ZhY2VfaW5pdCcgaW4gZmlsZSAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgYHNyYy90cnVldHlwZS90dG9ianMuYycpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEhlcmUgYSBzYW1wbGUgY29kZSBzbmlwcGV0IGZvciB1c2luZyBGVF9QQVJBTV9UQUdfVU5QQVRFTlRFRF9ISU5USU5HLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBGVF9QYXJhbWV0ZXIgIHBhcmFtZXRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgRlRfT3Blbl9BcmdzICBvcGVuX2FyZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgcGFyYW1ldGVyLnRhZyA9IEZUX1BBUkFNX1RBR19VTlBBVEVOVEVEX0hJTlRJTkc7ICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBvcGVuX2FyZ3MuZmxhZ3MgICAgICA9IEZUX09QRU5fUEFUSE5BTUUgfCBGVF9PUEVOX1BBUkFNUzsgICAgICAgICAqLwotICAvKiAgICAgb3Blbl9hcmdzLnBhdGhuYW1lICAgPSBteV9mb250X3BhdGhuYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIG9wZW5fYXJncy5udW1fcGFyYW1zID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBvcGVuX2FyZ3MucGFyYW1zICAgICA9ICZwYXJhbWV0ZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGVycm9yID0gRlRfT3Blbl9GYWNlKCBsaWJyYXJ5LCAmb3Blbl9hcmdzLCBpbmRleCwgJmZhY2UgKTsgICAgICAgICovCi0gIC8qICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX0NPTVBPTkVOVF9PRkZTRVRfU0NBTEVEIHRvIGNvbXBpbGUgdGhlICAgICAgICAqLwotICAvKiBUcnVlVHlwZSBnbHlwaCBsb2FkZXIgdG8gdXNlIEFwcGxlJ3MgZGVmaW5pdGlvbiBvZiBob3cgdG8gaGFuZGxlICAgICAgKi8KLSAgLyogY29tcG9uZW50IG9mZnNldHMgaW4gY29tcG9zaXRlIGdseXBocy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBcHBsZSBhbmQgTVMgZGlzYWdyZWUgb24gdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgY29tcG9uZW50IG9mZnNldHMgICAgKi8KLSAgLyogaW4gY29tcG9zaXRlcy4gIEFwcGxlIHNheXMgdGhhdCB0aGV5IHNob3VsZCBiZSBzY2FsZWQgYnkgdGhlIHNjYWxpbmcgICovCi0gIC8qIGZhY3RvcnMgaW4gdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCAocm91Z2hseSwgaXQncyBtb3JlIGNvbXBsZXgpICAgICAqLwotICAvKiB3aGlsZSBNUyBzYXlzIHRoZXkgc2hvdWxkIG5vdC4gIE9wZW5UeXBlIGRlZmluZXMgdHdvIGJpdHMgaW4gdGhlICAgICAgKi8KLSAgLyogY29tcG9zaXRlIGZsYWdzIGFycmF5IHdoaWNoIGNhbiBiZSB1c2VkIHRvIGRpc2FtYmlndWF0ZSwgYnV0IG9sZCAgICAgICovCi0gIC8qIGZvbnRzIHdpbGwgbm90IGhhdmUgdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9vdHNwZWMvZ2x5Zi5odG0gICAgICAgICAgICAgICAgICovCi0gIC8qICAgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2ZvbnRzL1RydWVUeXBlLVJlZmVyZW5jZS1NYW51YWwvUk0wNi9DaGFwNmdseWYuaHRtbCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiBUVF9DT05GSUdfT1BUSU9OX0NPTVBPTkVOVF9PRkZTRVRfU0NBTEVECi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgICAgICAgICAqLwotICAvKiBzdXBwb3J0IGZvciBBcHBsZSdzIGRpc3RvcnRhYmxlIGZvbnQgdGVjaG5vbG9neSAoZnZhciwgZ3ZhciwgY3ZhciwgICAgKi8KLSAgLyogYW5kIGF2YXIgdGFibGVzKS4gIFRoaXMgaGFzIG1hbnkgc2ltaWxhcml0aWVzIHRvIFR5cGUgMSBNdWx0aXBsZSAgICAgICovCi0gIC8qIE1hc3RlcnMgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSBUVF9DT05GSUdfT1BUSU9OX0JERiBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIHN1cHBvcnQgZm9yICAgICAgICAqLwotICAvKiBhbiBlbWJlZGRlZCBgQkRGICcgdGFibGUgd2l0aGluIFNGTlQtYmFzZWQgYml0bWFwIGZvcm1hdHMuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgVFRfQ09ORklHX09QVElPTl9CREYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgVCBZIFAgRSAxICAgRCBSIEkgViBFIFIgICAgQyBPIE4gRiBJIEcgVSBSIEEgVCBJIE8gTiAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUMV9NQVhfRElDVF9ERVBUSCBpcyB0aGUgbWF4aW11bSBkZXB0aCBvZiBuZXN0IGRpY3Rpb25hcmllcyBhbmQgICAgICAgKi8KLSAgLyogYXJyYXlzIGluIHRoZSBUeXBlIDEgc3RyZWFtIChzZWUgdDFsb2FkLmMpLiAgQSBtaW5pbXVtIG9mIDQgaXMgICAgICAgICovCi0gIC8qIHJlcXVpcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVDFfTUFYX0RJQ1RfREVQVEggIDUKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVDFfTUFYX1NVQlJTX0NBTExTIGRldGFpbHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5lc3RlZCBzdWItcm91dGluZSAgICovCi0gIC8qIGNhbGxzIGR1cmluZyBnbHlwaCBsb2FkaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVDFfTUFYX1NVQlJTX0NBTExTICAxNgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUMV9NQVhfQ0hBUlNUUklOR19PUEVSQU5EUyBpcyB0aGUgY2hhcnN0cmluZyBzdGFjaydzIGNhcGFjaXR5LiAgQSAgICAgKi8KLSAgLyogbWluaW11bSBvZiAxNiBpcyByZXF1aXJlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgQ2hpbmVzZSBmb250IE1pbmdUaUVHLU1lZGl1bSAoQ05TIDExNjQzIGNoYXJhY3RlciBzZXQpIG5lZWRzIDI1Ni4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFQxX01BWF9DSEFSU1RSSU5HU19PUEVSQU5EUyAgNTEyCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSB0aGlzIGNvbmZpZ3VyYXRpb24gbWFjcm8gaWYgeW91IHdhbnQgdG8gcHJldmVudCB0aGUgICAgICAgICAgICAqLwotICAvKiBjb21waWxhdGlvbiBvZiBgdDFhZm0nLCB3aGljaCBpcyBpbiBjaGFyZ2Ugb2YgcmVhZGluZyBUeXBlIDEgQUZNICAgICAgKi8KLSAgLyogZmlsZXMgaW50byBhbiBleGlzdGluZyBmYWNlLiAgTm90ZSB0aGF0IGlmIHNldCwgdGhlIFQxIGRyaXZlciB3aWxsIGJlICovCi0gIC8qIHVuYWJsZSB0byBwcm9kdWNlIGtlcm5pbmcgZGlzdGFuY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX0FGTQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgdGhpcyBjb25maWd1cmF0aW9uIG1hY3JvIGlmIHlvdSB3YW50IHRvIHByZXZlbnQgdGhlICAgICAgICAgICAgKi8KLSAgLyogY29tcGlsYXRpb24gb2YgdGhlIE11bHRpcGxlIE1hc3RlcnMgZm9udCBzdXBwb3J0IGluIHRoZSBUeXBlIDEgICAgICAgICovCi0gIC8qIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX01NX1NVUFBPUlQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgQyBGIEYgICBEIFIgSSBWIEUgUiAgICBDIE8gTiBGIEkgRyBVIFIgQSBUIEkgTyBOICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBVc2luZyBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX3tYLFl9ezEsMiwzLDR9IGl0IGlzICAgICAgKi8KLSAgLyogcG9zc2libGUgdG8gc2V0IHVwIHRoZSBkZWZhdWx0IHZhbHVlcyBvZiB0aGUgZm91ciBjb250cm9sIHBvaW50cyB0aGF0ICovCi0gIC8qIGRlZmluZSB0aGUgc3RlbSBkYXJrZW5pbmcgYmVoYXZpb3VyIG9mIHRoZSAobmV3KSBDRkYgZW5naW5lLiAgRm9yICAgICAqLwotICAvKiBtb3JlIGRldGFpbHMgcGxlYXNlIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogYGRhcmtlbmluZy1wYXJhbWV0ZXJzJyBwcm9wZXJ0eSBvZiB0aGUgY2ZmIGRyaXZlciBtb2R1bGUgKGZpbGUgICAgICAgICovCi0gIC8qIGBmdGNmZmRydi5oJyksIHdoaWNoIGFsbG93cyB0aGUgY29udHJvbCBhdCBydW4tdGltZS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRG8gKm5vdCogdW5kZWZpbmUgdGhlc2UgbWFjcm9zISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gxICAgNTAwCi0jZGVmaW5lIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTEgICA0MDAKLQotI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gyICAxMDAwCi0jZGVmaW5lIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTIgICAyNzUKLQotI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gzICAxNjY3Ci0jZGVmaW5lIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTMgICAyNzUKLQotI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1g0ICAyMzMzCi0jZGVmaW5lIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTQgICAgIDAKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORSBjb250cm9scyB3aGV0aGVyIHRoZSBwcmUtQWRvYmUgQ0ZGICAgICAgICovCi0gIC8qIGVuZ2luZSBnZXRzIGNvbXBpbGVkIGludG8gRnJlZVR5cGUuICBJZiBkZWZpbmVkLCBpdCBpcyBwb3NzaWJsZSB0byAgICAqLwotICAvKiBzd2l0Y2ggYmV0d2VlbiB0aGUgdHdvIGVuZ2luZXMgdXNpbmcgdGhlIGBoaW50aW5nLWVuZ2luZScgcHJvcGVydHkgb2YgKi8KLSAgLyogdGhlIGNmZiBkcml2ZXIgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogI2RlZmluZSBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICBBIFUgVCBPIEYgSSBUICAgTSBPIEQgVSBMIEUgICAgQyBPIE4gRiBJIEcgVSBSIEEgVCBJIE8gTiAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ29tcGlsZSBhdXRvZml0IG1vZHVsZSB3aXRoIENKSyAoQ2hpbmVzZSwgSmFwYW5lc2UsIEtvcmVhbikgc2NyaXB0ICAgICovCi0gIC8qIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQUZfQ09ORklHX09QVElPTl9DSksKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIENvbXBpbGUgYXV0b2ZpdCBtb2R1bGUgd2l0aCBJbmRpYyBzY3JpcHQgc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQUZfQ09ORklHX09QVElPTl9JTkRJQwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ29tcGlsZSBhdXRvZml0IG1vZHVsZSB3aXRoIHdhcnAgaGludGluZy4gIFRoZSBpZGVhIG9mIHRoZSB3YXJwaW5nICAgICovCi0gIC8qIGNvZGUgaXMgdG8gc2xpZ2h0bHkgc2NhbGUgYW5kIHNoaWZ0IGEgZ2x5cGggd2l0aGluIGEgc2luZ2xlIGRpbWVuc2lvbiAqLwotICAvKiBzbyB0aGF0IGFzIG11Y2ggb2YgaXRzIHNlZ21lbnRzIGFyZSBhbGlnbmVkIChtb3JlIG9yIGxlc3MpIG9uIHRoZSAgICAgKi8KLSAgLyogZ3JpZC4gIFRvIGZpbmQgb3V0IHRoZSBvcHRpbWFsIHNjYWxpbmcgYW5kIHNoaWZ0aW5nIHZhbHVlLCB2YXJpb3VzICAgICovCi0gIC8qIHBhcmFtZXRlciBjb21iaW5hdGlvbnMgYXJlIHRyaWVkIGFuZCBzY29yZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBleHBlcmltZW50YWwgb3B0aW9uIGlzIGFjdGl2ZSBvbmx5IGlmIHRoZSByZW5kZXJpbmcgbW9kZSBpcyAgICAgICovCi0gIC8qIEZUX1JFTkRFUl9NT0RFX0xJR0hUOyB5b3UgY2FuIHN3aXRjaCB3YXJwaW5nIG9uIGFuZCBvZmYgd2l0aCB0aGUgICAgICAqLwotICAvKiBgd2FycGluZycgcHJvcGVydHkgb2YgdGhlIGF1dG8taGludGVyIChzZWUgZmlsZSBgZnRhdXRvaC5oJyBmb3IgbW9yZSAgKi8KLSAgLyogaW5mb3JtYXRpb247IGJ5IGRlZmF1bHQgaXQgaXMgc3dpdGNoZWQgb2ZmKS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVIKLQotICAvKiAqLwotCi0KLSAgLyoKLSAgICogVGhpcyBtYWNybyBpcyBvYnNvbGV0ZS4gIFN1cHBvcnQgaGFzIGJlZW4gcmVtb3ZlZCBpbiBGcmVlVHlwZQotICAgKiB2ZXJzaW9uIDIuNS4KLSAgICovCi0vKiAjZGVmaW5lIEZUX0NPTkZJR19PUFRJT05fT0xEX0lOVEVSTkFMUyAqLwotCi0KLSAgLyoKLSAgICogVGhpcyBtYWNybyBpcyBkZWZpbmVkIGlmIGVpdGhlciB1bnBhdGVudGVkIG9yIG5hdGl2ZSBUcnVlVHlwZQotICAgKiBoaW50aW5nIGlzIHJlcXVlc3RlZCBieSB0aGUgZGVmaW5pdGlvbnMgYWJvdmUuCi0gICAqLwotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIKLSNkZWZpbmUgIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotI3VuZGVmICAgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSNlbGlmIGRlZmluZWQgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSNkZWZpbmUgIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotI2VuZGlmCi0KLQotICAvKgotICAgKiBDaGVjayBDRkYgZGFya2VuaW5nIHBhcmFtZXRlcnMuICBUaGUgY2hlY2tzIGFyZSB0aGUgc2FtZSBhcyBpbiBmdW5jdGlvbgotICAgKiBgY2ZmX3Byb3BlcnR5X3NldCcgaW4gZmlsZSBgY2ZmZHJpdnIuYycuCi0gICAqLwotI2lmIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDEgPCAwICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDIgPCAwICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDMgPCAwICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDQgPCAwICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTEgPCAwICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTIgPCAwICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTMgPCAwICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTQgPCAwICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDEgPiAgICAgICAgXAotICAgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMiAgICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDIgPiAgICAgICAgXAotICAgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMyAgICAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDMgPiAgICAgICAgXAotICAgICAgQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YNCAgICAgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTEgPiA1MDAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTIgPiA1MDAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTMgPiA1MDAgfHwgXAotICAgIENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTQgPiA1MDAKLSNlcnJvciAiSW52YWxpZCBDRkYgZGFya2VuaW5nIHBhcmFtZXRlcnMhIgotI2VuZGlmCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19GVE9QVElPTl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0c3RkbGliLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2NvbmZpZy9mdHN0ZGxpYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjQ3MWQ0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvY29uZmlnL2Z0c3RkbGliLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzdGRsaWIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFOU0ktc3BlY2lmaWMgbGlicmFyeSBhbmQgaGVhZGVyIGNvbmZpZ3VyYXRpb24gZmlsZSAoc3BlY2lmaWNhdGlvbiAgICovCi0vKiAgICBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGdyb3VwIGFsbCAjaW5jbHVkZXMgdG8gdGhlIEFOU0kgQyBsaWJyYXJ5IHRoYXQgICAqLwotICAvKiBGcmVlVHlwZSBub3JtYWxseSByZXF1aXJlcy4gIEl0IGFsc28gZGVmaW5lcyBtYWNyb3MgdG8gcmVuYW1lIHRoZSAgICAgKi8KLSAgLyogc3RhbmRhcmQgZnVuY3Rpb25zIHdpdGhpbiB0aGUgRnJlZVR5cGUgc291cmNlIGNvZGUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBMb2FkIGEgZmlsZSB3aGljaCBkZWZpbmVzIF9fRlRTVERMSUJfSF9fIGJlZm9yZSB0aGlzIG9uZSB0byBvdmVycmlkZSAgKi8KLSAgLyogaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRTVERMSUJfSF9fCi0jZGVmaW5lIF9fRlRTVERMSUJfSF9fCi0KLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jZGVmaW5lIGZ0X3B0cmRpZmZfdCAgcHRyZGlmZl90Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZWdlciBsaW1pdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVUlOVF9NQVggYW5kIFVMT05HX01BWCBhcmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGNvbXB1dGUgdGhlIHNpemUgICovCi0gIC8qIG9mIGBpbnQnIGFuZCBgbG9uZycgaW4gYnl0ZXMgYXQgY29tcGlsZS10aW1lLiAgU28gZmFyLCB0aGlzIHdvcmtzICAqLwotICAvKiBmb3IgYWxsIHBsYXRmb3JtcyB0aGUgbGlicmFyeSBoYXMgYmVlbiB0ZXN0ZWQgb24uICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCBvbiB0aGUgZXh0cmVtZWx5IHJhcmUgcGxhdGZvcm1zIHRoYXQgZG8gbm90IHByb3ZpZGUgICAgICAqLwotICAvKiBpbnRlZ2VyIHR5cGVzIHRoYXQgYXJlIF9leGFjdGx5XyAxNiBhbmQgMzIgYml0cyB3aWRlIChlLmcuIHNvbWUgICAgKi8KLSAgLyogb2xkIENyYXlzIHdoZXJlIGBpbnQnIGlzIDM2IGJpdHMpLCB3ZSBkbyBub3QgbWFrZSBhbnkgZ3VhcmFudGVlICAgICovCi0gIC8qIGFib3V0IHRoZSBjb3JyZWN0IGJlaGF2aW91ciBvZiBGVDIgd2l0aCBhbGwgZm9udHMuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSW4gdGhlc2UgY2FzZSwgYGZ0Y29uZmlnLmgnIHdpbGwgcmVmdXNlIHRvIGNvbXBpbGUgYW55d2F5IHdpdGggYSAgICovCi0gIC8qIG1lc3NhZ2UgbGlrZSBgY291bGRuJ3QgZmluZCAzMi1iaXQgdHlwZScgb3Igc29tZXRoaW5nIHNpbWlsYXIuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGxpbWl0cy5oPgotCi0jZGVmaW5lIEZUX0NIQVJfQklUICAgIENIQVJfQklUCi0jZGVmaW5lIEZUX1VTSE9SVF9NQVggIFVTSFJUX01BWAotI2RlZmluZSBGVF9JTlRfTUFYICAgICBJTlRfTUFYCi0jZGVmaW5lIEZUX0lOVF9NSU4gICAgIElOVF9NSU4KLSNkZWZpbmUgRlRfVUlOVF9NQVggICAgVUlOVF9NQVgKLSNkZWZpbmUgRlRfTE9OR19NQVggICAgTE9OR19NQVgKLSNkZWZpbmUgRlRfVUxPTkdfTUFYICAgVUxPTkdfTUFYCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgYW5kIHN0cmluZyBwcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIGZ0X21lbWNociAgIG1lbWNocgotI2RlZmluZSBmdF9tZW1jbXAgICBtZW1jbXAKLSNkZWZpbmUgZnRfbWVtY3B5ICAgbWVtY3B5Ci0jZGVmaW5lIGZ0X21lbW1vdmUgIG1lbW1vdmUKLSNkZWZpbmUgZnRfbWVtc2V0ICAgbWVtc2V0Ci0jZGVmaW5lIGZ0X3N0cmNhdCAgIHN0cmNhdAotI2RlZmluZSBmdF9zdHJjbXAgICBzdHJjbXAKLSNkZWZpbmUgZnRfc3RyY3B5ICAgc3RyY3B5Ci0jZGVmaW5lIGZ0X3N0cmxlbiAgIHN0cmxlbgotI2RlZmluZSBmdF9zdHJuY21wICBzdHJuY21wCi0jZGVmaW5lIGZ0X3N0cm5jcHkgIHN0cm5jcHkKLSNkZWZpbmUgZnRfc3RycmNociAgc3RycmNocgotI2RlZmluZSBmdF9zdHJzdHIgICBzdHJzdHIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGhhbmRsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2RlZmluZSBGVF9GSUxFICAgICBGSUxFCi0jZGVmaW5lIGZ0X2ZjbG9zZSAgIGZjbG9zZQotI2RlZmluZSBmdF9mb3BlbiAgICBmb3BlbgotI2RlZmluZSBmdF9mcmVhZCAgICBmcmVhZAotI2RlZmluZSBmdF9mc2VlayAgICBmc2VlawotI2RlZmluZSBmdF9mdGVsbCAgICBmdGVsbAotI2RlZmluZSBmdF9zcHJpbnRmICBzcHJpbnRmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jZGVmaW5lIGZ0X3Fzb3J0ICBxc29ydAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSBhbGxvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgZnRfc2NhbGxvYyAgIGNhbGxvYwotI2RlZmluZSBmdF9zZnJlZSAgICAgZnJlZQotI2RlZmluZSBmdF9zbWFsbG9jICAgbWFsbG9jCi0jZGVmaW5lIGZ0X3NyZWFsbG9jICByZWFsbG9jCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNjZWxsYW5lb3VzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBmdF9hdG9sICBhdG9sCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbiBjb250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPHNldGptcC5oPgotCi0jZGVmaW5lIGZ0X2ptcF9idWYgICAgIGptcF9idWYgIC8qIG5vdGU6IHRoaXMgY2Fubm90IGJlIGEgdHlwZWRlZiBzaW5jZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgICBqbXBfYnVmIGlzIGRlZmluZWQgYXMgYSBtYWNybyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICAgb24gY2VydGFpbiBwbGF0Zm9ybXMgICAgICAgICAgICovCi0KLSNkZWZpbmUgZnRfbG9uZ2ptcCAgICAgbG9uZ2ptcAotI2RlZmluZSBmdF9zZXRqbXAoIGIgKSBzZXRqbXAoICooZnRfam1wX2J1ZiopICYoYikgKSAvKiBzYW1lIHRoaW5nIGhlcmUgKi8KLQotCi0gIC8qIHRoZSBmb2xsb3dpbmcgaXMgb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIGkuZS4sIGlmICovCi0gIC8qIEZUX0RFQlVHX0xFVkVMX0VSUk9SIG9yIEZUX0RFQlVHX0xFVkVMX1RSQUNFIGFyZSBkZWZpbmVkICAgICovCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotCi0jZW5kaWYgLyogX19GVFNURExJQl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnJlZXR5cGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYyNDdmNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ZyZWV0eXBlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MjA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZyZWV0eXBlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBoaWdoLWxldmVsIEFQSSBhbmQgY29tbW9uIHR5cGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZSRUVUWVBFX0hfXwotI2RlZmluZSBfX0ZSRUVUWVBFX0hfXwotCi0KLSNpZm5kZWYgRlRfRlJFRVRZUEVfSAotI2Vycm9yICJgZnQyYnVpbGQuaCcgaGFzbid0IGJlZW4gaW5jbHVkZWQgeWV0ISIKLSNlcnJvciAiUGxlYXNlIGFsd2F5cyB1c2UgbWFjcm9zIHRvIGluY2x1ZGUgRnJlZVR5cGUgaGVhZGVyIGZpbGVzLiIKLSNlcnJvciAiRXhhbXBsZToiCi0jZXJyb3IgIiAgI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+IgotI2Vycm9yICIgICNpbmNsdWRlIEZUX0ZSRUVUWVBFX0giCi0jZW5kaWYKLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfVFlQRVNfSAotI2luY2x1ZGUgRlRfRVJST1JTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVhZGVyX2luY2x1c2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUncyBoZWFkZXIgaW5jbHVzaW9uIHNjaGVtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSG93IGNsaWVudCBhcHBsaWNhdGlvbnMgc2hvdWxkIGluY2x1ZGUgRnJlZVR5cGUgaGVhZGVyIGZpbGVzLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVG8gYmUgYXMgZmxleGlibGUgYXMgcG9zc2libGUgKGFuZCBmb3IgaGlzdG9yaWNhbCByZWFzb25zKSwgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIHVzZXMgYSB2ZXJ5IHNwZWNpYWwgaW5jbHVzaW9uIHNjaGVtZSB0byBsb2FkIGhlYWRlciAgICAgICAqLwotICAvKiAgICBmaWxlcywgZm9yIGV4YW1wbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICNpbmNsdWRlIDxmdDJidWlsZC5oPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgI2luY2x1ZGUgRlRfRlJFRVRZUEVfSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICNpbmNsdWRlIEZUX09VVExJTkVfSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGNvbXBpbGVyIGFuZCBpdHMgcHJlcHJvY2Vzc29yIG9ubHkgbmVlZHMgYW4gaW5jbHVkZSBwYXRoIHRvIGZpbmQgKi8KLSAgLyogICAgdGhlIGZpbGUgYGZ0MmJ1aWxkLmgnOyB0aGUgZXhhY3QgbG9jYXRpb25zIGFuZCBuYW1lcyBvZiB0aGUgb3RoZXIgICovCi0gIC8qICAgIEZyZWVUeXBlIGhlYWRlciBmaWxlcyBhcmUgaGlkZGVuIGJ5IHByZXByb2Nlc3NvciBtYWNybyBuYW1lcywgICAgICAqLwotICAvKiAgICBsb2FkZWQgYnkgYGZ0MmJ1aWxkLmgnLiAgVGhlIEFQSSBkb2N1bWVudGF0aW9uIGFsd2F5cyBnaXZlcyB0aGUgICAgKi8KLSAgLyogICAgaGVhZGVyIG1hY3JvIG5hbWUgbmVlZGVkIGZvciBhIHBhcnRpY3VsYXIgZnVuY3Rpb24uICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXJfYWxsb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZXIgYWxsb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEhvdyBjbGllbnQgYXBwbGljYXRpb25zIHNob3VsZCBhbGxvY2F0ZSBGcmVlVHlwZSBkYXRhIHN0cnVjdHVyZXMuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGFzc3VtZXMgdGhhdCBzdHJ1Y3R1cmVzIGFsbG9jYXRlZCBieSB0aGUgdXNlciBhbmQgcGFzc2VkICAqLwotICAvKiAgICBhcyBhcmd1bWVudHMgYXJlIHplcm9lZCBvdXQgZXhjZXB0IGZvciB0aGUgYWN0dWFsIGRhdGEuICBJbiBvdGhlciAgKi8KLSAgLyogICAgd29yZHMsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgY2FsbG9jJyAob3IgdmFyaWFudHMgb2YgaXQpICAgICAgICovCi0gIC8qICAgIGluc3RlYWQgb2YgYG1hbGxvYycgZm9yIGFsbG9jYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgQiBBIFMgSSBDICAgVCBZIFAgRSBTICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzZV9pbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQmFzZSBJbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIEZyZWVUeXBlfjIgYmFzZSBmb250IGludGVyZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbW9zdCBpbXBvcnRhbnQgcHVibGljIGhpZ2gtbGV2ZWwgQVBJICAgICovCi0gIC8qICAgIGZ1bmN0aW9ucyBvZiBGcmVlVHlwZX4yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE9yZGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoU2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9DaGFyTWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRW5jb2RpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ19UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfU0NBTEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0ZJWEVEX1NJWkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfSE9SSVpPTlRBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX1ZFUlRJQ0FMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfU0ZOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0NJRF9LRVlFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19UUklDS1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfS0VSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX01VTFRJUExFX01BU1RFUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19HTFlQSF9OQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfRVhURVJOQUxfU1RSRUFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0hJTlRFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19UUklDS1kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSEFTX0hPUklaT05UQUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0hBU19WRVJUSUNBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9IQVNfS0VSTklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSEFTX0ZJWEVEX1NJWkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0hBU19HTFlQSF9OQU1FUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9IQVNfTVVMVElQTEVfTUFTVEVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSEFTX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JU19TRk5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSVNfU0NBTEFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0lTX0ZJWEVEX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JU19DSURfS0VZRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSVNfVFJJQ0tZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TVFlMRV9GTEFHX0JPTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU1RZTEVfRkxBR19JVEFMSUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaXplUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaFNsb3RSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhfTWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1N1YkdseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Jbml0X0ZyZWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9GcmVlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlZmVyZW5jZV9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfTWVtb3J5X0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3Blbl9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09wZW5fQXJncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QYXJhbWV0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQXR0YWNoX0ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0F0dGFjaF9TdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X0NoYXJfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9QaXhlbF9TaXplcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZXF1ZXN0X1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2VsZWN0X1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemVfUmVxdWVzdF9UeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaXplX1JlcXVlc3RSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9SZXF1ZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9UcmFuc2Zvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Mb2FkX0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0NoYXJfSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9GaXJzdF9DaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfTmV4dF9DaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X05hbWVfSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xvYWRfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1BFTl9NRU1PUlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09QRU5fU1RSRUFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PUEVOX1BBVEhOQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1BFTl9EUklWRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09QRU5fUEFSQU1TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfUkVOREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX01PTk9DSFJPTUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9MSU5FQVJfREVTSUdOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfTk9fU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX05PX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9OT19CSVRNQVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfTk9fQVVUT0hJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX0NPTE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX0lHTk9SRV9UUkFOU0ZPUk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9GT1JDRV9BVVRPSElOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfTk9fUkVDVVJTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX1BFREFOVElDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfVEFSR0VUX05PUk1BTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX1RBUkdFVF9MSUdIVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9UQVJHRVRfTU9OTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfVEFSR0VUX0xDRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX1RBUkdFVF9MQ0RfViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xPQURfVEFSR0VUX01PREUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVuZGVyX0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlbmRlcl9Nb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfS2VybmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfS2VybmluZ19Nb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9UcmFja19LZXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfR2x5cGhfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9DaGFyTWFwUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2VsZWN0X0NoYXJtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9DaGFybWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfQ2hhcm1hcF9JbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9GU1R5cGVfRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfU3ViR2x5cGhfSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfSW50ZXJuYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaXplX0ludGVybmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2xvdF9JbnRlcm5hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU1RZTEVfRkxBR19YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09QRU5fWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MT0FEX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTE9BRF9UQVJHRVRfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NVQkdMWVBIX0ZMQUdfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GU1RZUEVfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0hBU19GQVNUX0dMWVBIUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaF9NZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIHRoZSBtZXRyaWNzIG9mIGEgc2luZ2xlIGdseXBoLiAgVGhlICAgICAgKi8KLSAgLyogICAgdmFsdWVzIGFyZSBleHByZXNzZWQgaW4gMjYuNiBmcmFjdGlvbmFsIHBpeGVsIGZvcm1hdDsgaWYgdGhlIGZsYWcgICovCi0gIC8qICAgIEBGVF9MT0FEX05PX1NDQUxFIGhhcyBiZWVuIHVzZWQgd2hpbGUgbG9hZGluZyB0aGUgZ2x5cGgsIHZhbHVlcyAgICAqLwotICAvKiAgICBhcmUgZXhwcmVzc2VkIGluIGZvbnQgdW5pdHMgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB3aWR0aCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZ2x5cGgncyB3aWR0aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWlnaHQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZ2x5cGgncyBoZWlnaHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBob3JpQmVhcmluZ1ggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBMZWZ0IHNpZGUgYmVhcmluZyBmb3IgaG9yaXpvbnRhbCBsYXlvdXQuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBob3JpQmVhcmluZ1kgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUb3Agc2lkZSBiZWFyaW5nIGZvciBob3Jpem9udGFsIGxheW91dC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBob3JpQWR2YW5jZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBZHZhbmNlIHdpZHRoIGZvciBob3Jpem9udGFsIGxheW91dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0QmVhcmluZ1ggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBMZWZ0IHNpZGUgYmVhcmluZyBmb3IgdmVydGljYWwgbGF5b3V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0QmVhcmluZ1kgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUb3Agc2lkZSBiZWFyaW5nIGZvciB2ZXJ0aWNhbCBsYXlvdXQuICBMYXJnZXIgcG9zaXRpdmUgdmFsdWVzICAgICovCi0gIC8qICAgICAgbWVhbiBmdXJ0aGVyIGJlbG93IHRoZSB2ZXJ0aWNhbCBnbHlwaCBvcmlnaW4uICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydEFkdmFuY2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQWR2YW5jZSBoZWlnaHQgZm9yIHZlcnRpY2FsIGxheW91dC4gIFBvc2l0aXZlIHZhbHVlcyBtZWFuIHRoZSAgICAqLwotICAvKiAgICAgIGdseXBoIGhhcyBhIHBvc2l0aXZlIGFkdmFuY2UgZG93bndhcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBub3QgZGlzYWJsZWQgd2l0aCBARlRfTE9BRF9OT19ISU5USU5HLCB0aGUgdmFsdWVzIHJlcHJlc2VudCAgICAgKi8KLSAgLyogICAgZGltZW5zaW9ucyBvZiB0aGUgaGludGVkIGdseXBoIChpbiBjYXNlIGhpbnRpbmcgaXMgYXBwbGljYWJsZSkuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTdHJva2luZyBhIGdseXBoIHdpdGggYW4gb3V0c2lkZSBib3JkZXIgZG9lcyBub3QgaW5jcmVhc2UgICAgICAgICAgKi8KLSAgLyogICAgYGhvcmlBZHZhbmNlJyBvciBgdmVydEFkdmFuY2UnOyB5b3UgaGF2ZSB0byBtYW51YWxseSBhZGp1c3QgdGhlc2UgICovCi0gIC8qICAgIHZhbHVlcyB0byBhY2NvdW50IGZvciB0aGUgYWRkZWQgd2lkdGggYW5kIGhlaWdodC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0dseXBoX01ldHJpY3NfCi0gIHsKLSAgICBGVF9Qb3MgIHdpZHRoOwotICAgIEZUX1BvcyAgaGVpZ2h0OwotCi0gICAgRlRfUG9zICBob3JpQmVhcmluZ1g7Ci0gICAgRlRfUG9zICBob3JpQmVhcmluZ1k7Ci0gICAgRlRfUG9zICBob3JpQWR2YW5jZTsKLQotICAgIEZUX1BvcyAgdmVydEJlYXJpbmdYOwotICAgIEZUX1BvcyAgdmVydEJlYXJpbmdZOwotICAgIEZUX1BvcyAgdmVydEFkdmFuY2U7Ci0KLSAgfSBGVF9HbHlwaF9NZXRyaWNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgbW9kZWxzIHRoZSBtZXRyaWNzIG9mIGEgYml0bWFwIHN0cmlrZSAoaS5lLiwgYSBzZXQgICovCi0gIC8qICAgIG9mIGdseXBocyBmb3IgYSBnaXZlbiBwb2ludCBzaXplIGFuZCByZXNvbHV0aW9uKSBpbiBhIGJpdG1hcCBmb250LiAqLwotICAvKiAgICBJdCBpcyB1c2VkIGZvciB0aGUgYGF2YWlsYWJsZV9zaXplcycgZmllbGQgb2YgQEZUX0ZhY2UuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWlnaHQgOjogVGhlIHZlcnRpY2FsIGRpc3RhbmNlLCBpbiBwaXhlbHMsIGJldHdlZW4gdHdvICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIGNvbnNlY3V0aXZlIGJhc2VsaW5lcy4gIEl0IGlzIGFsd2F5cyBwb3NpdGl2ZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB3aWR0aCAgOjogVGhlIGF2ZXJhZ2Ugd2lkdGgsIGluIHBpeGVscywgb2YgYWxsIGdseXBocyBpbiB0aGUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIHN0cmlrZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgOjogVGhlIG5vbWluYWwgc2l6ZSBvZiB0aGUgc3RyaWtlIGluIDI2LjYgZnJhY3Rpb25hbCAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIHBvaW50cy4gIFRoaXMgZmllbGQgaXMgbm90IHZlcnkgdXNlZnVsLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4X3BwZW0gOjogVGhlIGhvcml6b250YWwgcHBlbSAobm9taW5hbCB3aWR0aCkgaW4gMjYuNiBmcmFjdGlvbmFsICAgKi8KLSAgLyogICAgICAgICAgICAgIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5X3BwZW0gOjogVGhlIHZlcnRpY2FsIHBwZW0gKG5vbWluYWwgaGVpZ2h0KSBpbiAyNi42IGZyYWN0aW9uYWwgICAgKi8KLSAgLyogICAgICAgICAgICAgIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2luZG93cyBGTlQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIG5vbWluYWwgc2l6ZSBnaXZlbiBpbiBhIEZOVCBmb250IGlzIG5vdCByZWxpYWJsZS4gIFRodXMgd2hlbiAqLwotICAvKiAgICAgIHRoZSBkcml2ZXIgZmluZHMgaXQgaW5jb3JyZWN0LCBpdCBzZXRzIGBzaXplJyB0byBzb21lIGNhbGN1bGF0ZWQgKi8KLSAgLyogICAgICB2YWx1ZXMgYW5kIHNldHMgYHhfcHBlbScgYW5kIGB5X3BwZW0nIHRvIHRoZSBwaXhlbCB3aWR0aCBhbmQgICAgICovCi0gIC8qICAgICAgaGVpZ2h0IGdpdmVuIGluIHRoZSBmb250LCByZXNwZWN0aXZlbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVHJ1ZVR5cGUgZW1iZWRkZWQgYml0bWFwczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgYHNpemUnLCBgd2lkdGgnLCBhbmQgYGhlaWdodCcgdmFsdWVzIGFyZSBub3QgY29udGFpbmVkIGluIHRoZSAgICAqLwotICAvKiAgICAgIGJpdG1hcCBzdHJpa2UgaXRzZWxmLiAgVGhleSBhcmUgY29tcHV0ZWQgZnJvbSB0aGUgZ2xvYmFsIGZvbnQgICAgKi8KLSAgLyogICAgICBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfQml0bWFwX1NpemVfCi0gIHsKLSAgICBGVF9TaG9ydCAgaGVpZ2h0OwotICAgIEZUX1Nob3J0ICB3aWR0aDsKLQotICAgIEZUX1BvcyAgICBzaXplOwotCi0gICAgRlRfUG9zICAgIHhfcHBlbTsKLSAgICBGVF9Qb3MgICAgeV9wcGVtOwotCi0gIH0gRlRfQml0bWFwX1NpemU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIE8gQiBKIEUgQyBUICAgQyBMIEEgUyBTIEUgUyAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIEZyZWVUeXBlIGxpYnJhcnkgaW5zdGFuY2UuICBFYWNoIGBsaWJyYXJ5JyBpcyAgICAgICAgKi8KLSAgLyogICAgY29tcGxldGVseSBpbmRlcGVuZGVudCBmcm9tIHRoZSBvdGhlcnM7IGl0IGlzIHRoZSBgcm9vdCcgb2YgYSBzZXQgICovCi0gIC8qICAgIG9mIG9iamVjdHMgbGlrZSBmb250cywgZmFjZXMsIHNpemVzLCBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSXQgYWxzbyBlbWJlZHMgYSBtZW1vcnkgbWFuYWdlciAoc2VlIEBGVF9NZW1vcnkpLCBhcyB3ZWxsIGFzIGEgICAgICovCi0gIC8qICAgIHNjYW4tbGluZSBjb252ZXJ0ZXIgb2JqZWN0IChzZWUgQEZUX1Jhc3RlcikuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW4gbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb25zIGl0IGlzIGVhc2llc3QgdG8gdXNlIG9uZSAgICAgICAgICAgICovCi0gIC8qICAgIGBGVF9MaWJyYXJ5JyBvYmplY3QgcGVyIHRocmVhZC4gIEluIGNhc2UgdGhpcyBpcyB0b28gY3VtYmVyc29tZSwgICAqLwotICAvKiAgICBhIHNpbmdsZSBgRlRfTGlicmFyeScgb2JqZWN0IGFjcm9zcyB0aHJlYWRzIGlzIHBvc3NpYmxlIGFsc28gICAgICAgKi8KLSAgLyogICAgKHNpbmNlIEZyZWVUeXBlIHZlcnNpb24gMi41LjYpLCBhcyBsb25nIGFzIGEgbXV0ZXggbG9jayBpcyB1c2VkICAgICovCi0gIC8qICAgIGFyb3VuZCBARlRfTmV3X0ZhY2UgYW5kIEBGVF9Eb25lX0ZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExpYnJhcnkgb2JqZWN0cyBhcmUgbm9ybWFsbHkgY3JlYXRlZCBieSBARlRfSW5pdF9GcmVlVHlwZSwgYW5kICAgICAqLwotICAvKiAgICBkZXN0cm95ZWQgd2l0aCBARlRfRG9uZV9GcmVlVHlwZS4gIElmIHlvdSBuZWVkIHJlZmVyZW5jZS1jb3VudGluZyAgKi8KLSAgLyogICAgKGNmLiBARlRfUmVmZXJlbmNlX0xpYnJhcnkpLCB1c2UgQEZUX05ld19MaWJyYXJ5IGFuZCAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9Eb25lX0xpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfTGlicmFyeVJlY18gICpGVF9MaWJyYXJ5OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX21hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIGdpdmVuIEZyZWVUeXBlIG1vZHVsZSBvYmplY3QuICBFYWNoIG1vZHVsZSBjYW4gYmUgYSAgKi8KLSAgLyogICAgZm9udCBkcml2ZXIsIGEgcmVuZGVyZXIsIG9yIGFueXRoaW5nIGVsc2UgdGhhdCBwcm92aWRlcyBzZXJ2aWNlcyAgICovCi0gIC8qICAgIHRvIHRoZSBmb3JtZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfTW9kdWxlUmVjXyogIEZUX01vZHVsZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RyaXZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgZ2l2ZW4gRnJlZVR5cGUgZm9udCBkcml2ZXIgb2JqZWN0LiAgRWFjaCBmb250IGRyaXZlciAqLwotICAvKiAgICBpcyBhIHNwZWNpYWwgbW9kdWxlIGNhcGFibGUgb2YgY3JlYXRpbmcgZmFjZXMgZnJvbSBmb250IGZpbGVzLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX0RyaXZlclJlY18qICBGVF9Ecml2ZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZW5kZXJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIGdpdmVuIEZyZWVUeXBlIHJlbmRlcmVyLiAgQSByZW5kZXJlciBpcyBhIHNwZWNpYWwgICAgKi8KLSAgLyogICAgbW9kdWxlIGluIGNoYXJnZSBvZiBjb252ZXJ0aW5nIGEgZ2x5cGggaW1hZ2UgdG8gYSBiaXRtYXAsIHdoZW4gICAgICovCi0gIC8qICAgIG5lY2Vzc2FyeS4gIEVhY2ggcmVuZGVyZXIgc3VwcG9ydHMgYSBnaXZlbiBnbHlwaCBpbWFnZSBmb3JtYXQsIGFuZCAqLwotICAvKiAgICBvbmUgb3IgbW9yZSB0YXJnZXQgc3VyZmFjZSBkZXB0aHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX1JlbmRlcmVyUmVjXyogIEZUX1JlbmRlcmVyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzZV9pbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIGdpdmVuIHR5cG9ncmFwaGljIGZhY2Ugb2JqZWN0LiAgQSBmYWNlIG9iamVjdCBtb2RlbHMgKi8KLSAgLyogICAgYSBnaXZlbiB0eXBlZmFjZSwgaW4gYSBnaXZlbiBzdHlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRWFjaCBmYWNlIG9iamVjdCBhbHNvIG93bnMgYSBzaW5nbGUgQEZUX0dseXBoU2xvdCBvYmplY3QsIGFzIHdlbGwgICovCi0gIC8qICAgIGFzIG9uZSBvciBtb3JlIEBGVF9TaXplIG9iamVjdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlIEBGVF9OZXdfRmFjZSBvciBARlRfT3Blbl9GYWNlIHRvIGNyZWF0ZSBhIG5ldyBmYWNlIG9iamVjdCBmcm9tICovCi0gIC8qICAgIGEgZ2l2ZW4gZmlsZXBhdGhuYW1lIG9yIGEgY3VzdG9tIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlIEBGVF9Eb25lX0ZhY2UgdG8gZGVzdHJveSBpdCAoYWxvbmcgd2l0aCBpdHMgc2xvdCBhbmQgc2l6ZXMpLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBgRlRfRmFjZScgb2JqZWN0IGNhbiBvbmx5IGJlIHNhZmVseSB1c2VkIGZyb20gb25lIHRocmVhZCBhdCBhICAgKi8KLSAgLyogICAgdGltZS4gIFNpbWlsYXJseSwgY3JlYXRpb24gYW5kIGRlc3RydWN0aW9uIG9mIGBGVF9GYWNlJyB3aXRoIHRoZSAgICovCi0gIC8qICAgIHNhbWUgQEZUX0xpYnJhcnkgb2JqZWN0IGNhbiBvbmx5IGJlIGRvbmUgZnJvbSBvbmUgdGhyZWFkIGF0IGEgICAgICAqLwotICAvKiAgICB0aW1lLiAgT24gdGhlIG90aGVyIGhhbmQsIGZ1bmN0aW9ucyBsaWtlIEBGVF9Mb2FkX0dseXBoIGFuZCBpdHMgICAgKi8KLSAgLyogICAgc2libGluZ3MgYXJlIHRocmVhZC1zYWZlIGFuZCBkbyBub3QgbmVlZCB0aGUgbG9jayB0byBiZSBoZWxkIGFzICAgICovCi0gIC8qICAgIGxvbmcgYXMgdGhlIHNhbWUgYEZUX0ZhY2UnIG9iamVjdCBpcyBub3QgdXNlZCBmcm9tIG11bHRpcGxlICAgICAgICAqLwotICAvKiAgICB0aHJlYWRzIGF0IHRoZSBzYW1lIHRpbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBbHNvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWUgQEZUX0ZhY2VSZWMgZm9yIHRoZSBwdWJsaWNseSBhY2Nlc3NpYmxlIGZpZWxkcyBvZiBhIGdpdmVuIGZhY2UgKi8KLSAgLyogICAgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9GYWNlUmVjXyogIEZUX0ZhY2U7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhbiBvYmplY3QgdXNlZCB0byBtb2RlbCBhIGZhY2Ugc2NhbGVkIHRvIGEgZ2l2ZW4gICAgICAgKi8KLSAgLyogICAgY2hhcmFjdGVyIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRWFjaCBARlRfRmFjZSBoYXMgYW4gX2FjdGl2ZV8gQEZUX1NpemUgb2JqZWN0IHRoYXQgaXMgdXNlZCBieSAgICAgICovCi0gIC8qICAgIGZ1bmN0aW9ucyBsaWtlIEBGVF9Mb2FkX0dseXBoIHRvIGRldGVybWluZSB0aGUgc2NhbGluZyAgICAgICAgICAgICAqLwotICAvKiAgICB0cmFuc2Zvcm1hdGlvbiB0aGF0IGluIHR1cm4gaXMgdXNlZCB0byBsb2FkIGFuZCBoaW50IGdseXBocyBhbmQgICAgKi8KLSAgLyogICAgbWV0cmljcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3UgY2FuIHVzZSBARlRfU2V0X0NoYXJfU2l6ZSwgQEZUX1NldF9QaXhlbF9TaXplcywgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX1JlcXVlc3RfU2l6ZSBvciBldmVuIEBGVF9TZWxlY3RfU2l6ZSB0byBjaGFuZ2UgdGhlIGNvbnRlbnQgICAgICovCi0gIC8qICAgIChpLmUuLCB0aGUgc2NhbGluZyB2YWx1ZXMpIG9mIHRoZSBhY3RpdmUgQEZUX1NpemUuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWW91IGNhbiB1c2UgQEZUX05ld19TaXplIHRvIGNyZWF0ZSBhZGRpdGlvbmFsIHNpemUgb2JqZWN0cyBmb3IgYSAgICovCi0gIC8qICAgIGdpdmVuIEBGVF9GYWNlLCBidXQgdGhleSB3b24ndCBiZSB1c2VkIGJ5IG90aGVyIGZ1bmN0aW9ucyB1bnRpbCAgICAqLwotICAvKiAgICB5b3UgYWN0aXZhdGUgaXQgdGhyb3VnaCBARlRfQWN0aXZhdGVfU2l6ZS4gIE9ubHkgb25lIHNpemUgY2FuIGJlICAgKi8KLSAgLyogICAgYWN0aXZhdGVkIGF0IGFueSBnaXZlbiB0aW1lIHBlciBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWxzbz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlIEBGVF9TaXplUmVjIGZvciB0aGUgcHVibGljbHkgYWNjZXNzaWJsZSBmaWVsZHMgb2YgYSBnaXZlbiBzaXplICovCi0gIC8qICAgIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfU2l6ZVJlY18qICBGVF9TaXplOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhTbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBnaXZlbiBgZ2x5cGggc2xvdCcuICBBIHNsb3QgaXMgYSBjb250YWluZXIgd2hlcmUgaXQgICovCi0gIC8qICAgIGlzIHBvc3NpYmxlIHRvIGxvYWQgYW55IG9mIHRoZSBnbHlwaHMgY29udGFpbmVkIGluIGl0cyBwYXJlbnQgICAgICAqLwotICAvKiAgICBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluIG90aGVyIHdvcmRzLCBlYWNoIHRpbWUgeW91IGNhbGwgQEZUX0xvYWRfR2x5cGggb3IgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfTG9hZF9DaGFyLCB0aGUgc2xvdCdzIGNvbnRlbnQgaXMgZXJhc2VkIGJ5IHRoZSBuZXcgZ2x5cGggZGF0YSwgKi8KLSAgLyogICAgaS5lLiwgdGhlIGdseXBoJ3MgbWV0cmljcywgaXRzIGltYWdlIChiaXRtYXAgb3Igb3V0bGluZSksIGFuZCAgICAgICovCi0gIC8qICAgIG90aGVyIGNvbnRyb2wgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFsc28+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZSBARlRfR2x5cGhTbG90UmVjIGZvciB0aGUgcHVibGljbHkgYWNjZXNzaWJsZSBnbHlwaCBmaWVsZHMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfR2x5cGhTbG90UmVjXyogIEZUX0dseXBoU2xvdDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NoYXJNYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgZ2l2ZW4gY2hhcmFjdGVyIG1hcC4gIEEgY2hhcm1hcCBpcyB1c2VkIHRvIHRyYW5zbGF0ZSAqLwotICAvKiAgICBjaGFyYWN0ZXIgY29kZXMgaW4gYSBnaXZlbiBlbmNvZGluZyBpbnRvIGdseXBoIGluZGV4ZXMgZm9yIGl0cyAgICAgKi8KLSAgLyogICAgcGFyZW50J3MgZmFjZS4gIFNvbWUgZm9udCBmb3JtYXRzIG1heSBwcm92aWRlIHNldmVyYWwgY2hhcm1hcHMgcGVyICovCi0gIC8qICAgIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRWFjaCBmYWNlIG9iamVjdCBvd25zIHplcm8gb3IgbW9yZSBjaGFybWFwcywgYnV0IG9ubHkgb25lIG9mIHRoZW0gICovCi0gIC8qICAgIGNhbiBiZSBgYWN0aXZlJyBhbmQgdXNlZCBieSBARlRfR2V0X0NoYXJfSW5kZXggb3IgQEZUX0xvYWRfQ2hhci4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNoYXJtYXBzIGluIGEgZmFjZSBpcyBhdmFpbGFibGUgdGhyb3VnaCB0aGUgICovCi0gIC8qICAgIGBmYWNlLT5udW1fY2hhcm1hcHMnIGFuZCBgZmFjZS0+Y2hhcm1hcHMnIGZpZWxkcyBvZiBARlRfRmFjZVJlYy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGN1cnJlbnRseSBhY3RpdmUgY2hhcm1hcCBpcyBhdmFpbGFibGUgYXMgYGZhY2UtPmNoYXJtYXAnLiAgICAgICovCi0gIC8qICAgIFlvdSBzaG91bGQgY2FsbCBARlRfU2V0X0NoYXJtYXAgdG8gY2hhbmdlIGl0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gYSBuZXcgZmFjZSBpcyBjcmVhdGVkIChlaXRoZXIgdGhyb3VnaCBARlRfTmV3X0ZhY2Ugb3IgICAgICAgICAqLwotICAvKiAgICBARlRfT3Blbl9GYWNlKSwgdGhlIGxpYnJhcnkgbG9va3MgZm9yIGEgVW5pY29kZSBjaGFybWFwIHdpdGhpbiAgICAgKi8KLSAgLyogICAgdGhlIGxpc3QgYW5kIGF1dG9tYXRpY2FsbHkgYWN0aXZhdGVzIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWxzbz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlIEBGVF9DaGFyTWFwUmVjIGZvciB0aGUgcHVibGljbHkgYWNjZXNzaWJsZSBmaWVsZHMgb2YgYSBnaXZlbiAgICovCi0gIC8qICAgIGNoYXJhY3RlciBtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfQ2hhck1hcFJlY18qICBGVF9DaGFyTWFwOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBtYWNybyBjb252ZXJ0cyBmb3VyLWxldHRlciB0YWdzIGludG8gYW4gdW5zaWduZWQgbG9uZy4gIEl0IGlzICovCi0gIC8qICAgIHVzZWQgdG8gZGVmaW5lIGBlbmNvZGluZycgaWRlbnRpZmllcnMgKHNlZSBARlRfRW5jb2RpbmcpLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNpbmNlIG1hbnkgMTYtYml0IGNvbXBpbGVycyBkb24ndCBsaWtlIDMyLWJpdCBlbnVtZXJhdGlvbnMsIHlvdSAgICAqLwotICAvKiAgICBzaG91bGQgcmVkZWZpbmUgdGhpcyBtYWNybyBpbiBjYXNlIG9mIHByb2JsZW1zIHRvIHNvbWV0aGluZyBsaWtlICAgKi8KLSAgLyogICAgdGhpczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAjZGVmaW5lIEZUX0VOQ19UQUcoIHZhbHVlLCBhLCBiLCBjLCBkICkgIHZhbHVlICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG8gZ2V0IGEgc2ltcGxlIGVudW1lcmF0aW9uIHdpdGhvdXQgYXNzaWduaW5nIHNwZWNpYWwgbnVtYmVycy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZuZGVmIEZUX0VOQ19UQUcKLSNkZWZpbmUgRlRfRU5DX1RBRyggdmFsdWUsIGEsIGIsIGMsIGQgKSAgICAgICAgIFwKLSAgICAgICAgICB2YWx1ZSA9ICggKCAoRlRfVUludDMyKShhKSA8PCAyNCApIHwgIFwKLSAgICAgICAgICAgICAgICAgICAgKCAoRlRfVUludDMyKShiKSA8PCAxNiApIHwgIFwKLSAgICAgICAgICAgICAgICAgICAgKCAoRlRfVUludDMyKShjKSA8PCAgOCApIHwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludDMyKShkKSAgICAgICAgICkKLQotI2VuZGlmIC8qIEZUX0VOQ19UQUcgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VuY29kaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGVudW1lcmF0aW9uIHVzZWQgdG8gc3BlY2lmeSBjaGFyYWN0ZXIgc2V0cyBzdXBwb3J0ZWQgYnkgICAgICAgICAqLwotICAvKiAgICBjaGFybWFwcy4gIFVzZWQgaW4gdGhlIEBGVF9TZWxlY3RfQ2hhcm1hcCBBUEkgZnVuY3Rpb24uICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXNwaXRlIHRoZSBuYW1lLCB0aGlzIGVudW1lcmF0aW9uIGxpc3RzIHNwZWNpZmljIGNoYXJhY3RlciAgICAgICAgKi8KLSAgLyogICAgcmVwZXJ0b3JpZXMgKGkuZS4sIGNoYXJzZXRzKSwgYW5kIG5vdCB0ZXh0IGVuY29kaW5nIG1ldGhvZHMgKGUuZy4sICovCi0gIC8qICAgIFVURi04LCBVVEYtMTYsIGV0Yy4pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT3RoZXIgZW5jb2RpbmdzIG1pZ2h0IGJlIGRlZmluZWQgaW4gdGhlIGZ1dHVyZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfTk9ORSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGVuY29kaW5nIHZhbHVlfjAgaXMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfVU5JQ09ERSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQ29ycmVzcG9uZHMgdG8gdGhlIFVuaWNvZGUgY2hhcmFjdGVyIHNldC4gIFRoaXMgdmFsdWUgY292ZXJzICAgICAqLwotICAvKiAgICAgIGFsbCB2ZXJzaW9ucyBvZiB0aGUgVW5pY29kZSByZXBlcnRvaXJlLCBpbmNsdWRpbmcgQVNDSUkgYW5kICAgICAgKi8KLSAgLyogICAgICBMYXRpbi0xLiAgTW9zdCBmb250cyBpbmNsdWRlIGEgVW5pY29kZSBjaGFybWFwLCBidXQgbm90IGFsbCAgICAgICovCi0gIC8qICAgICAgb2YgdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gYWNjZXNzIFVuaWNvZGUgdmFsdWUgVSsxRjAyOCAoYW5kICAgICovCi0gIC8qICAgICAgdGhlIGZvbnQgY29udGFpbnMgaXQpLCB1c2UgdmFsdWUgMHgxRjAyOCBhcyB0aGUgaW5wdXQgdmFsdWUgZm9yICAqLwotICAvKiAgICAgIEBGVF9HZXRfQ2hhcl9JbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX01TX1NZTUJPTCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIENvcnJlc3BvbmRzIHRvIHRoZSBNaWNyb3NvZnQgU3ltYm9sIGVuY29kaW5nLCB1c2VkIHRvIGVuY29kZSAgICAgKi8KLSAgLyogICAgICBtYXRoZW1hdGljYWwgc3ltYm9scyBhbmQgd2luZ2RpbmdzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSAgICovCi0gIC8qICAgICAgYGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90eXBvZ3JhcGh5L290c3BlYy9yZWNvbS5odG0nLCAgICAgICAgICAqLwotICAvKiAgICAgIGBodHRwOi8vd3d3Lmtvc3Rpcy5uZXQvY2hhcnNldHMvc3ltYm9sLmh0bScsIGFuZCAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBgaHR0cDovL3d3dy5rb3N0aXMubmV0L2NoYXJzZXRzL3dpbmdkaW5nLmh0bScuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoaXMgZW5jb2RpbmcgdXNlcyBjaGFyYWN0ZXIgY29kZXMgZnJvbSB0aGUgUFVBIChQcml2YXRlIFVuaWNvZGUgKi8KLSAgLyogICAgICBBcmVhKSBpbiB0aGUgcmFuZ2UgVStGMDIwLVUrRjBGRi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19TSklTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBDb3JyZXNwb25kcyB0byBKYXBhbmVzZSBTSklTIGVuY29kaW5nLiAgTW9yZSBpbmZvIGF0ICAgICAgICAgICAgICovCi0gIC8qICAgICAgYXQgYGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2hpZnRfSklTJy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFNlZSBub3RlIG9uIG11bHRpLWJ5dGUgZW5jb2RpbmdzIGJlbG93LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX0dCMjMxMiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIENvcnJlc3BvbmRzIHRvIGFuIGVuY29kaW5nIHN5c3RlbSBmb3IgU2ltcGxpZmllZCBDaGluZXNlIGFzIHVzZWQgKi8KLSAgLyogICAgICB1c2VkIGluIG1haW5sYW5kIENoaW5hLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19CSUc1IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBDb3JyZXNwb25kcyB0byBhbiBlbmNvZGluZyBzeXN0ZW0gZm9yIFRyYWRpdGlvbmFsIENoaW5lc2UgYXMgICAgICovCi0gIC8qICAgICAgdXNlZCBpbiBUYWl3YW4gYW5kIEhvbmcgS29uZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfV0FOU1VORyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQ29ycmVzcG9uZHMgdG8gdGhlIEtvcmVhbiBlbmNvZGluZyBzeXN0ZW0ga25vd24gYXMgV2Fuc3VuZy4gICAgICAqLwotICAvKiAgICAgIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBgaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tVVMvZ29nbG9iYWwvY2MzMDUxNTQnLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19KT0hBQiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgS29yZWFuIHN0YW5kYXJkIGNoYXJhY3RlciBzZXQgKEtTfkMgNTYwMS0xOTkyKSwgd2hpY2ggICAgICAgICovCi0gIC8qICAgICAgY29ycmVzcG9uZHMgdG8gTVMgV2luZG93cyBjb2RlIHBhZ2UgMTM2MS4gIFRoaXMgY2hhcmFjdGVyIHNldCAgICAqLwotICAvKiAgICAgIGluY2x1ZGVzIGFsbCBwb3NzaWJsZSBIYW5nZXVsIGNoYXJhY3RlciBjb21iaW5hdGlvbnMuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX0FET0JFX0xBVElOXzEgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIENvcnJlc3BvbmRzIHRvIGEgTGF0aW4tMSBlbmNvZGluZyBhcyBkZWZpbmVkIGluIGEgVHlwZX4xICAgICAgICAgKi8KLSAgLyogICAgICBQb3N0U2NyaXB0IGZvbnQuICBJdCBpcyBsaW1pdGVkIHRvIDI1NiBjaGFyYWN0ZXIgY29kZXMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19BRE9CRV9TVEFOREFSRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBDb3JyZXNwb25kcyB0byB0aGUgQWRvYmUgU3RhbmRhcmQgZW5jb2RpbmcsIGFzIGZvdW5kIGluIFR5cGV+MSwgICovCi0gIC8qICAgICAgQ0ZGLCBhbmQgT3BlblR5cGUvQ0ZGIGZvbnRzLiAgSXQgaXMgbGltaXRlZCB0byAyNTYgY2hhcmFjdGVyICAgICAqLwotICAvKiAgICAgIGNvZGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX0FET0JFX0VYUEVSVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIENvcnJlc3BvbmRzIHRvIHRoZSBBZG9iZSBFeHBlcnQgZW5jb2RpbmcsIGFzIGZvdW5kIGluIFR5cGV+MSwgICAgKi8KLSAgLyogICAgICBDRkYsIGFuZCBPcGVuVHlwZS9DRkYgZm9udHMuICBJdCBpcyBsaW1pdGVkIHRvIDI1NiBjaGFyYWN0ZXIgICAgICovCi0gIC8qICAgICAgY29kZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfQURPQkVfQ1VTVE9NIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQ29ycmVzcG9uZHMgdG8gYSBjdXN0b20gZW5jb2RpbmcsIGFzIGZvdW5kIGluIFR5cGV+MSwgQ0ZGLCBhbmQgICAqLwotICAvKiAgICAgIE9wZW5UeXBlL0NGRiBmb250cy4gIEl0IGlzIGxpbWl0ZWQgdG8gMjU2IGNoYXJhY3RlciBjb2Rlcy4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX0FQUExFX1JPTUFOIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIENvcnJlc3BvbmRzIHRvIHRoZSA4LWJpdCBBcHBsZSByb21hbiBlbmNvZGluZy4gIE1hbnkgVHJ1ZVR5cGUgICAgKi8KLSAgLyogICAgICBhbmQgT3BlblR5cGUgZm9udHMgY29udGFpbiBhIGNoYXJtYXAgZm9yIHRoaXMgZW5jb2RpbmcsIHNpbmNlICAgICovCi0gIC8qICAgICAgb2xkZXIgdmVyc2lvbnMgb2YgTWFjIE9TIGFyZSBhYmxlIHRvIHVzZSBpdC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfT0xEX0xBVElOXzIgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhpcyB2YWx1ZSBpcyBkZXByZWNhdGVkIGFuZCB3YXMgbmV2ZXIgdXNlZCBub3IgcmVwb3J0ZWQgYnkgICAgICAqLwotICAvKiAgICAgIEZyZWVUeXBlLiAgRG9uJ3QgdXNlIG9yIHRlc3QgZm9yIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX01TX1NKSVMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFNhbWUgYXMgRlRfRU5DT0RJTkdfU0pJUy4gIERlcHJlY2F0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX01TX0dCMjMxMiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFNhbWUgYXMgRlRfRU5DT0RJTkdfR0IyMzEyLiAgRGVwcmVjYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX01TX0JJRzUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFNhbWUgYXMgRlRfRU5DT0RJTkdfQklHNS4gIERlcHJlY2F0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX01TX1dBTlNVTkcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFNhbWUgYXMgRlRfRU5DT0RJTkdfV0FOU1VORy4gIERlcHJlY2F0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX01TX0pPSEFCIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFNhbWUgYXMgRlRfRU5DT0RJTkdfSk9IQUIuICBEZXByZWNhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCeSBkZWZhdWx0LCBGcmVlVHlwZSBhdXRvbWF0aWNhbGx5IHN5bnRoZXNpemVzIGEgVW5pY29kZSBjaGFybWFwICAgKi8KLSAgLyogICAgZm9yIFBvc3RTY3JpcHQgZm9udHMsIHVzaW5nIHRoZWlyIGdseXBoIG5hbWVzIGRpY3Rpb25hcmllcy4gICAgICAgICovCi0gIC8qICAgIEhvd2V2ZXIsIGl0IGFsc28gcmVwb3J0cyB0aGUgZW5jb2RpbmdzIGRlZmluZWQgZXhwbGljaXRseSBpbiB0aGUgICAqLwotICAvKiAgICBmb250IGZpbGUsIGZvciB0aGUgY2FzZXMgd2hlbiB0aGV5IGFyZSBuZWVkZWQsIHdpdGggdGhlIEFkb2JlICAgICAgKi8KLSAgLyogICAgdmFsdWVzIGFzIHdlbGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9FTkNPRElOR19OT05FIGlzIHNldCBieSB0aGUgQkRGIGFuZCBQQ0YgZHJpdmVycyBpZiB0aGUgY2hhcm1hcCAgKi8KLSAgLyogICAgaXMgbmVpdGhlciBVbmljb2RlIG5vciBJU08tODg1OS0xIChvdGhlcndpc2UgaXQgaXMgc2V0IHRvICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX1VOSUNPREUpLiAgVXNlIEBGVF9HZXRfQkRGX0NoYXJzZXRfSUQgdG8gZmluZCBvdXQgICAgICAqLwotICAvKiAgICB3aGljaCBlbmNvZGluZyBpcyByZWFsbHkgcHJlc2VudC4gIElmLCBmb3IgZXhhbXBsZSwgdGhlICAgICAgICAgICAgKi8KLSAgLyogICAgYGNzX3JlZ2lzdHJ5JyBmaWVsZCBpcyBgS09JOCcgYW5kIHRoZSBgY3NfZW5jb2RpbmcnIGZpZWxkIGlzIGBSJywgICovCi0gIC8qICAgIHRoZSBmb250IGlzIGVuY29kZWQgaW4gS09JOC1SLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfTk9ORSBpcyBhbHdheXMgc2V0ICh3aXRoIGEgc2luZ2xlIGV4Y2VwdGlvbikgYnkgdGhlICAgICovCi0gIC8qICAgIHdpbmZvbnRzIGRyaXZlci4gIFVzZSBARlRfR2V0X1dpbkZOVF9IZWFkZXIgYW5kIGV4YW1pbmUgdGhlICAgICAgICAqLwotICAvKiAgICBgY2hhcnNldCcgZmllbGQgb2YgdGhlIEBGVF9XaW5GTlRfSGVhZGVyUmVjIHN0cnVjdHVyZSB0byBmaW5kIG91dCAgKi8KLSAgLyogICAgd2hpY2ggZW5jb2RpbmcgaXMgcmVhbGx5IHByZXNlbnQuICBGb3IgZXhhbXBsZSwgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9XaW5GTlRfSURfQ1AxMjUxICgyMDQpIG1lYW5zIFdpbmRvd3MgY29kZSBwYWdlIDEyNTEgKGZvciAgICAgICAqLwotICAvKiAgICBSdXNzaWFuKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0VOQ09ESU5HX05PTkUgaXMgc2V0IGlmIGBwbGF0Zm9ybV9pZCcgaXMgQFRUX1BMQVRGT1JNX01BQ0lOVE9TSCAqLwotICAvKiAgICBhbmQgYGVuY29kaW5nX2lkJyBpcyBub3QgQFRUX01BQ19JRF9ST01BTiAob3RoZXJ3aXNlIGl0IGlzIHNldCB0byAgKi8KLSAgLyogICAgRlRfRU5DT0RJTkdfQVBQTEVfUk9NQU4pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgcGxhdGZvcm1faWQnIGlzIEBUVF9QTEFURk9STV9NQUNJTlRPU0gsIHVzZSB0aGUgZnVuY3Rpb24gICAgICAgKi8KLSAgLyogICAgQEZUX0dldF9DTWFwX0xhbmd1YWdlX0lEIHRvIHF1ZXJ5IHRoZSBNYWMgbGFuZ3VhZ2UgSUQgdGhhdCBtYXkgICAgICovCi0gIC8qICAgIGJlIG5lZWRlZCB0byBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoIEFwcGxlIGVuY29kaW5nIHZhcmlhbnRzLiAgU2VlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9WRU5ET1JTL0FQUExFL1JlYWRtZS50eHQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0byBnZXQgYW4gaWRlYSBob3cgdG8gZG8gdGhhdC4gIEJhc2ljYWxseSwgaWYgdGhlIGxhbmd1YWdlIElEICAgICAgKi8KLSAgLyogICAgaXN+MCwgZG9uJ3QgdXNlIGl0LCBvdGhlcndpc2Ugc3VidHJhY3QgMSBmcm9tIHRoZSBsYW5ndWFnZSBJRC4gICAgICovCi0gIC8qICAgIFRoZW4gZXhhbWluZSBgZW5jb2RpbmdfaWQnLiAgSWYsIGZvciBleGFtcGxlLCBgZW5jb2RpbmdfaWQnIGlzICAgICAqLwotICAvKiAgICBAVFRfTUFDX0lEX1JPTUFOIGFuZCB0aGUgbGFuZ3VhZ2UgSUQgKG1pbnVzfjEpIGlzICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYFRUX01BQ19MQU5HSURfR1JFRUsnLCBpdCBpcyB0aGUgR3JlZWsgZW5jb2RpbmcsIG5vdCBSb21hbi4gICAgICAgICovCi0gIC8qICAgIEBUVF9NQUNfSURfQVJBQklDIHdpdGggYFRUX01BQ19MQU5HSURfRkFSU0knIG1lYW5zIHRoZSBGYXJzaSAgICAgICAqLwotICAvKiAgICB2YXJpYW50IHRoZSBBcmFiaWMgZW5jb2RpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZW51bSAgRlRfRW5jb2RpbmdfCi0gIHsKLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19OT05FLCAwLCAwLCAwLCAwICksCi0KLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19NU19TWU1CT0wsICdzJywgJ3knLCAnbScsICdiJyApLAotICAgIEZUX0VOQ19UQUcoIEZUX0VOQ09ESU5HX1VOSUNPREUsICAgJ3UnLCAnbicsICdpJywgJ2MnICksCi0KLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19TSklTLCAgICAncycsICdqJywgJ2knLCAncycgKSwKLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19HQjIzMTIsICAnZycsICdiJywgJyAnLCAnICcgKSwKLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19CSUc1LCAgICAnYicsICdpJywgJ2cnLCAnNScgKSwKLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19XQU5TVU5HLCAndycsICdhJywgJ24nLCAncycgKSwKLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19KT0hBQiwgICAnaicsICdvJywgJ2gnLCAnYScgKSwKLQotICAgIC8qIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLwotICAgIEZUX0VOQ09ESU5HX01TX1NKSVMgICAgPSBGVF9FTkNPRElOR19TSklTLAotICAgIEZUX0VOQ09ESU5HX01TX0dCMjMxMiAgPSBGVF9FTkNPRElOR19HQjIzMTIsCi0gICAgRlRfRU5DT0RJTkdfTVNfQklHNSAgICA9IEZUX0VOQ09ESU5HX0JJRzUsCi0gICAgRlRfRU5DT0RJTkdfTVNfV0FOU1VORyA9IEZUX0VOQ09ESU5HX1dBTlNVTkcsCi0gICAgRlRfRU5DT0RJTkdfTVNfSk9IQUIgICA9IEZUX0VOQ09ESU5HX0pPSEFCLAotCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfQURPQkVfU1RBTkRBUkQsICdBJywgJ0QnLCAnTycsICdCJyApLAotICAgIEZUX0VOQ19UQUcoIEZUX0VOQ09ESU5HX0FET0JFX0VYUEVSVCwgICAnQScsICdEJywgJ0InLCAnRScgKSwKLSAgICBGVF9FTkNfVEFHKCBGVF9FTkNPRElOR19BRE9CRV9DVVNUT00sICAgJ0EnLCAnRCcsICdCJywgJ0MnICksCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfQURPQkVfTEFUSU5fMSwgICdsJywgJ2EnLCAndCcsICcxJyApLAotCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfT0xEX0xBVElOXzIsICdsJywgJ2EnLCAndCcsICcyJyApLAotCi0gICAgRlRfRU5DX1RBRyggRlRfRU5DT0RJTkdfQVBQTEVfUk9NQU4sICdhJywgJ3InLCAnbScsICduJyApCi0KLSAgfSBGVF9FbmNvZGluZzsKLQotCi0gIC8qIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nIGBGVF9FbmNvZGluZycgKi8KLSAgLyogdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBmdF9lbmNvZGluZ19ub25lICAgICAgICAgICAgRlRfRU5DT0RJTkdfTk9ORQotI2RlZmluZSBmdF9lbmNvZGluZ191bmljb2RlICAgICAgICAgRlRfRU5DT0RJTkdfVU5JQ09ERQotI2RlZmluZSBmdF9lbmNvZGluZ19zeW1ib2wgICAgICAgICAgRlRfRU5DT0RJTkdfTVNfU1lNQk9MCi0jZGVmaW5lIGZ0X2VuY29kaW5nX2xhdGluXzEgICAgICAgICBGVF9FTkNPRElOR19BRE9CRV9MQVRJTl8xCi0jZGVmaW5lIGZ0X2VuY29kaW5nX2xhdGluXzIgICAgICAgICBGVF9FTkNPRElOR19PTERfTEFUSU5fMgotI2RlZmluZSBmdF9lbmNvZGluZ19zamlzICAgICAgICAgICAgRlRfRU5DT0RJTkdfU0pJUwotI2RlZmluZSBmdF9lbmNvZGluZ19nYjIzMTIgICAgICAgICAgRlRfRU5DT0RJTkdfR0IyMzEyCi0jZGVmaW5lIGZ0X2VuY29kaW5nX2JpZzUgICAgICAgICAgICBGVF9FTkNPRElOR19CSUc1Ci0jZGVmaW5lIGZ0X2VuY29kaW5nX3dhbnN1bmcgICAgICAgICBGVF9FTkNPRElOR19XQU5TVU5HCi0jZGVmaW5lIGZ0X2VuY29kaW5nX2pvaGFiICAgICAgICAgICBGVF9FTkNPRElOR19KT0hBQgotCi0jZGVmaW5lIGZ0X2VuY29kaW5nX2Fkb2JlX3N0YW5kYXJkICBGVF9FTkNPRElOR19BRE9CRV9TVEFOREFSRAotI2RlZmluZSBmdF9lbmNvZGluZ19hZG9iZV9leHBlcnQgICAgRlRfRU5DT0RJTkdfQURPQkVfRVhQRVJUCi0jZGVmaW5lIGZ0X2VuY29kaW5nX2Fkb2JlX2N1c3RvbSAgICBGVF9FTkNPRElOR19BRE9CRV9DVVNUT00KLSNkZWZpbmUgZnRfZW5jb2RpbmdfYXBwbGVfcm9tYW4gICAgIEZUX0VOQ09ESU5HX0FQUExFX1JPTUFOCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9DaGFyTWFwUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYmFzZSBjaGFybWFwIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgcGFyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGVuY29kaW5nICAgIDo6IEFuIEBGVF9FbmNvZGluZyB0YWcgaWRlbnRpZnlpbmcgdGhlIGNoYXJtYXAuICBVc2UgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB0aGlzIHdpdGggQEZUX1NlbGVjdF9DaGFybWFwLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBsYXRmb3JtX2lkIDo6IEFuIElEIG51bWJlciBkZXNjcmliaW5nIHRoZSBwbGF0Zm9ybSBmb3IgdGhlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBmb2xsb3dpbmcgZW5jb2RpbmcgSUQuICBUaGlzIGNvbWVzIGRpcmVjdGx5IGZyb20gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgdGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24gYW5kIHNob3VsZCBiZSBlbXVsYXRlZCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGZvciBvdGhlciBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZW5jb2RpbmdfaWQgOjogQSBwbGF0Zm9ybSBzcGVjaWZpYyBlbmNvZGluZyBudW1iZXIuICBUaGlzIGFsc28gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGNvbWVzIGZyb20gdGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24gYW5kIHNob3VsZCBiZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICBlbXVsYXRlZCBzaW1pbGFybHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9DaGFyTWFwUmVjXwotICB7Ci0gICAgRlRfRmFjZSAgICAgIGZhY2U7Ci0gICAgRlRfRW5jb2RpbmcgIGVuY29kaW5nOwotICAgIEZUX1VTaG9ydCAgICBwbGF0Zm9ybV9pZDsKLSAgICBGVF9VU2hvcnQgICAgZW5jb2RpbmdfaWQ7Ci0KLSAgfSBGVF9DaGFyTWFwUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIEIgQSBTIEUgICBPIEIgSiBFIEMgVCAgIEMgTCBBIFMgUyBFIFMgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlX0ludGVybmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBvcGFxdWUgaGFuZGxlIHRvIGFuIGBGVF9GYWNlX0ludGVybmFsUmVjJyBzdHJ1Y3R1cmUsIHVzZWQgdG8gICAgKi8KLSAgLyogICAgbW9kZWwgcHJpdmF0ZSBkYXRhIG9mIGEgZ2l2ZW4gQEZUX0ZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHN0cnVjdHVyZSBtaWdodCBjaGFuZ2UgYmV0d2VlbiByZWxlYXNlcyBvZiBGcmVlVHlwZX4yIGFuZCBpcyAgKi8KLSAgLyogICAgbm90IGdlbmVyYWxseSBhdmFpbGFibGUgdG8gY2xpZW50IGFwcGxpY2F0aW9ucy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9GYWNlX0ludGVybmFsUmVjXyogIEZUX0ZhY2VfSW50ZXJuYWw7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSByb290IGZhY2UgY2xhc3Mgc3RydWN0dXJlLiAgQSBmYWNlIG9iamVjdCBtb2RlbHMgYSAgICAgICAgKi8KLSAgLyogICAgdHlwZWZhY2UgaW4gYSBmb250IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2ZhY2VzICAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGZhY2VzIGluIHRoZSBmb250IGZpbGUuICBTb21lICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udCBmb3JtYXRzIGNhbiBoYXZlIG11bHRpcGxlIGZhY2VzIGluICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaW5kZXggICAgICAgICAgOjogVGhpcyBmaWVsZCBob2xkcyB0d28gZGlmZmVyZW50IHZhbHVlcy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdHMgMC0xNSBhcmUgdGhlIGluZGV4IG9mIHRoZSBmYWNlIGluIHRoZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb250IGZpbGUgKHN0YXJ0aW5nIHdpdGggdmFsdWV+MCkuICBUaGV5ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIHNldCB0b34wIGlmIHRoZXJlIGlzIG9ubHkgb25lIGZhY2UgaW4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0cyAxNi0zMCBhcmUgcmVsZXZhbnQgdG8gR1ggdmFyaWF0aW9uICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRzIG9ubHksIGhvbGRpbmcgdGhlIG5hbWVkIGluc3RhbmNlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCBmb3IgdGhlIGN1cnJlbnQgZmFjZSBpbmRleCAoc3RhcnRpbmcgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB2YWx1ZX4xOyB2YWx1ZX4wIGluZGljYXRlcyBmb250IGFjY2VzcyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgR1ggdmFyaWF0aW9uIGRhdGEpLiAgRm9yIG5vbi1HWCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb250cywgYml0cyAxNi0zMCBhcmUgaWdub3JlZC4gIElmIHdlIGhhdmUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRoaXJkIG5hbWVkIGluc3RhbmNlIG9mIGZhY2V+NCwgc2F5LCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBmYWNlX2luZGV4JyBpcyBzZXQgdG8gMHgwMDAzMDAwNC4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0IDMxIGlzIGFsd2F5cyB6ZXJvICh0aGlzIGlzLCAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBmYWNlX2luZGV4JyBpcyBhbHdheXMgYSBwb3NpdGl2ZSB2YWx1ZSkuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfZmxhZ3MgICAgICAgICAgOjogQSBzZXQgb2YgYml0IGZsYWdzIHRoYXQgZ2l2ZSBpbXBvcnRhbnQgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmYWNlOyBzZWUgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBARlRfRkFDRV9GTEFHX1hYWCBmb3IgdGhlIGRldGFpbHMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHlsZV9mbGFncyAgICAgICAgIDo6IFRoZSBsb3dlciAxNn5iaXRzIGNvbnRhaW4gYSBzZXQgb2YgYml0ICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyBpbmRpY2F0aW5nIHRoZSBzdHlsZSBvZiB0aGUgZmFjZTsgc2VlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgQEZUX1NUWUxFX0ZMQUdfWFhYIGZvciB0aGUgZGV0YWlscy4gIEJpdHMgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2LTMwIGhvbGQgdGhlIG51bWJlciBvZiBuYW1lZCBpbnN0YW5jZXMgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgZm9yIHRoZSBjdXJyZW50IGZhY2UgaWYgd2UgaGF2ZSBhICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ggdmFyaWF0aW9uIChzdWIpZm9udC4gIEJpdCAzMSBpcyBhbHdheXMgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm8gKHRoaXMgaXMsIGBzdHlsZV9mbGFncycgaXMgYWx3YXlzIGEgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZSB2YWx1ZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fZ2x5cGhzICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgZ2x5cGhzIGluIHRoZSBmYWNlLiAgSWYgdGhlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlIGlzIHNjYWxhYmxlIGFuZCBoYXMgc2JpdHMgKHNlZSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYG51bV9maXhlZF9zaXplcycpLCBpdCBpcyBzZXQgdG8gdGhlIG51bWJlciAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIG91dGxpbmUgZ2x5cGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIENJRC1rZXllZCBmb250cywgdGhpcyB2YWx1ZSBnaXZlcyB0aGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hlc3QgQ0lEIHVzZWQgaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhbWlseV9uYW1lICAgICAgICAgOjogVGhlIGZhY2UncyBmYW1pbHkgbmFtZS4gIFRoaXMgaXMgYW4gQVNDSUkgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZywgdXN1YWxseSBpbiBFbmdsaXNoLCB0aGF0IGRlc2NyaWJlcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdHlwZWZhY2UncyBmYW1pbHkgKGxpa2UgYFRpbWVzIE5ldyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9tYW4nLCBgQm9kb25pJywgYEdhcmFtb25kJywgZXRjKS4gIFRoaXMgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGEgbGVhc3QgY29tbW9uIGRlbm9taW5hdG9yIHVzZWQgdG8gbGlzdCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb250cy4gIFNvbWUgZm9ybWF0cyAoVHJ1ZVR5cGUgJiBPcGVuVHlwZSkgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZSBsb2NhbGl6ZWQgYW5kIFVuaWNvZGUgdmVyc2lvbnMgb2YgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgc3RyaW5nLiAgQXBwbGljYXRpb25zIHNob3VsZCB1c2UgdGhlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgc3BlY2lmaWMgaW50ZXJmYWNlIHRvIGFjY2VzcyB0aGVtLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIE5VTEwgKGUuZy4sIGluIGZvbnRzIGVtYmVkZGVkIGluIGEgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBERiBmaWxlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gY2FzZSB0aGUgZm9udCBkb2Vzbid0IHByb3ZpZGUgYSBzcGVjaWZpYyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSBuYW1lIGVudHJ5LCBGcmVlVHlwZSB0cmllcyB0byAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50aGVzaXplIG9uZSwgZGVyaXZpbmcgaXQgZnJvbSBvdGhlciBuYW1lICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cmllcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3R5bGVfbmFtZSAgICAgICAgICA6OiBUaGUgZmFjZSdzIHN0eWxlIG5hbWUuICBUaGlzIGlzIGFuIEFTQ0lJICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLCB1c3VhbGx5IGluIEVuZ2xpc2gsIHRoYXQgZGVzY3JpYmVzICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0eXBlZmFjZSdzIHN0eWxlIChsaWtlIGBJdGFsaWMnLCAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBgQm9sZCcsIGBDb25kZW5zZWQnLCBldGMpLiAgTm90IGFsbCBmb250ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cyBwcm92aWRlIGEgc3R5bGUgbmFtZSwgc28gdGhpcyBmaWVsZCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG9wdGlvbmFsLCBhbmQgY2FuIGJlIHNldCB0byBOVUxMLiAgQXMgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYGZhbWlseV9uYW1lJywgc29tZSBmb3JtYXRzIHByb3ZpZGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxpemVkIGFuZCBVbmljb2RlIHZlcnNpb25zIG9mIHRoaXMgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZy4gIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIHRoZSBmb3JtYXQgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYyBpbnRlcmZhY2UgdG8gYWNjZXNzIHRoZW0uICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fZml4ZWRfc2l6ZXMgICAgIDo6IFRoZSBudW1iZXIgb2YgYml0bWFwIHN0cmlrZXMgaW4gdGhlIGZhY2UuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVuIGlmIHRoZSBmYWNlIGlzIHNjYWxhYmxlLCB0aGVyZSBtaWdodCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RpbGwgYmUgYml0bWFwIHN0cmlrZXMsIHdoaWNoIGFyZSBjYWxsZWQgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBzYml0cycgaW4gdGhhdCBjYXNlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGF2YWlsYWJsZV9zaXplcyAgICAgOjogQW4gYXJyYXkgb2YgQEZUX0JpdG1hcF9TaXplIGZvciBhbGwgYml0bWFwICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlrZXMgaW4gdGhlIGZhY2UuICBJdCBpcyBzZXQgdG8gTlVMTCBpZiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBiaXRtYXAgc3RyaWtlLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fY2hhcm1hcHMgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgY2hhcm1hcHMgaW4gdGhlIGZhY2UuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJtYXBzICAgICAgICAgICAgOjogQW4gYXJyYXkgb2YgdGhlIGNoYXJtYXBzIG9mIHRoZSBmYWNlLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2VuZXJpYyAgICAgICAgICAgICA6OiBBIGZpZWxkIHJlc2VydmVkIGZvciBjbGllbnQgdXNlcy4gIFNlZSB0aGUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0dlbmVyaWMgdHlwZSBkZXNjcmlwdGlvbi4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmJveCAgICAgICAgICAgICAgICA6OiBUaGUgZm9udCBib3VuZGluZyBib3guICBDb29yZGluYXRlcyBhcmUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2VkIGluIGZvbnQgdW5pdHMgKHNlZSAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGB1bml0c19wZXJfRU0nKS4gIFRoZSBib3ggaXMgbGFyZ2UgZW5vdWdoICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB0byBjb250YWluIGFueSBnbHlwaCBmcm9tIHRoZSBmb250LiAgVGh1cywgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgYGJib3gueU1heCcgY2FuIGJlIHNlZW4gYXMgdGhlIGBtYXhpbXVtICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzY2VuZGVyJywgYW5kIGBiYm94LnlNaW4nIGFzIHRoZSBgbWluaW11bSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjZW5kZXInLiAgT25seSByZWxldmFudCBmb3Igc2NhbGFibGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhlIGJvdW5kaW5nIGJveCBtaWdodCBiZSBvZmYgYnkgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF0IGxlYXN0KSBvbmUgcGl4ZWwgZm9yIGhpbnRlZCBmb250cy4gIFNlZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9TaXplX01ldHJpY3MgZm9yIGZ1cnRoZXIgZGlzY3Vzc2lvbi4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVuaXRzX3Blcl9FTSAgICAgICAgOjogVGhlIG51bWJlciBvZiBmb250IHVuaXRzIHBlciBFTSBzcXVhcmUgZm9yICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZmFjZS4gIFRoaXMgaXMgdHlwaWNhbGx5IDIwNDggZm9yICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlVHlwZSBmb250cywgYW5kIDEwMDAgZm9yIFR5cGV+MSBmb250cy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgT25seSByZWxldmFudCBmb3Igc2NhbGFibGUgZm9ybWF0cy4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXNjZW5kZXIgICAgICAgICAgICA6OiBUaGUgdHlwb2dyYXBoaWMgYXNjZW5kZXIgb2YgdGhlIGZhY2UsICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2VkIGluIGZvbnQgdW5pdHMuICBGb3IgZm9udCBmb3JtYXRzICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBoYXZpbmcgdGhpcyBpbmZvcm1hdGlvbiwgaXQgaXMgc2V0IHRvICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBgYmJveC55TWF4Jy4gIE9ubHkgcmVsZXZhbnQgZm9yIHNjYWxhYmxlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVzY2VuZGVyICAgICAgICAgICA6OiBUaGUgdHlwb2dyYXBoaWMgZGVzY2VuZGVyIG9mIHRoZSBmYWNlLCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2VkIGluIGZvbnQgdW5pdHMuICBGb3IgZm9udCBmb3JtYXRzICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBoYXZpbmcgdGhpcyBpbmZvcm1hdGlvbiwgaXQgaXMgc2V0IHRvICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBgYmJveC55TWluJy4gIE5vdGUgdGhhdCB0aGlzIGZpZWxkIGlzICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdXN1YWxseSBuZWdhdGl2ZS4gIE9ubHkgcmVsZXZhbnQgZm9yICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxhYmxlIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhlaWdodCAgICAgICAgICAgICAgOjogVGhpcyB2YWx1ZSBpcyB0aGUgdmVydGljYWwgZGlzdGFuY2UgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gdHdvIGNvbnNlY3V0aXZlIGJhc2VsaW5lcywgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzZWQgaW4gZm9udCB1bml0cy4gIEl0IGlzIGFsd2F5cyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmUuICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IHdhbnQgdGhlIGdsb2JhbCBnbHlwaCBoZWlnaHQsIHVzZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGBhc2NlbmRlciAtIGRlc2NlbmRlcicuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9hZHZhbmNlX3dpZHRoICAgOjogVGhlIG1heGltdW0gYWR2YW5jZSB3aWR0aCwgaW4gZm9udCB1bml0cywgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhbGwgZ2x5cGhzIGluIHRoaXMgZmFjZS4gIFRoaXMgY2FuIGJlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIG1ha2Ugd29yZCB3cmFwcGluZyBjb21wdXRhdGlvbnMgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFzdGVyLiAgT25seSByZWxldmFudCBmb3Igc2NhbGFibGUgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9hZHZhbmNlX2hlaWdodCAgOjogVGhlIG1heGltdW0gYWR2YW5jZSBoZWlnaHQsIGluIGZvbnQgdW5pdHMsICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhbGwgZ2x5cGhzIGluIHRoaXMgZmFjZS4gIFRoaXMgaXMgb25seSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICByZWxldmFudCBmb3IgdmVydGljYWwgbGF5b3V0cywgYW5kIGlzIHNldCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYGhlaWdodCcgZm9yIGZvbnRzIHRoYXQgZG8gbm90IHByb3ZpZGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIG1ldHJpY3MuICBPbmx5IHJlbGV2YW50IGZvciAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsYWJsZSBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1bmRlcmxpbmVfcG9zaXRpb24gIDo6IFRoZSBwb3NpdGlvbiwgaW4gZm9udCB1bml0cywgb2YgdGhlICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmxpbmUgbGluZSBmb3IgdGhpcyBmYWNlLiAgSXQgaXMgdGhlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyIG9mIHRoZSB1bmRlcmxpbmluZyBzdGVtLiAgT25seSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW50IGZvciBzY2FsYWJsZSBmb3JtYXRzLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVuZGVybGluZV90aGlja25lc3MgOjogVGhlIHRoaWNrbmVzcywgaW4gZm9udCB1bml0cywgb2YgdGhlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVybGluZSBmb3IgdGhpcyBmYWNlLiAgT25seSByZWxldmFudCBmb3IgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsYWJsZSBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaCAgICAgICAgICAgICAgIDo6IFRoZSBmYWNlJ3MgYXNzb2NpYXRlZCBnbHlwaCBzbG90KHMpLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgICAgICAgICAgICAgICAgOjogVGhlIGN1cnJlbnQgYWN0aXZlIHNpemUgZm9yIHRoaXMgZmFjZS4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcm1hcCAgICAgICAgICAgICA6OiBUaGUgY3VycmVudCBhY3RpdmUgY2hhcm1hcCBmb3IgdGhpcyBmYWNlLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmllbGRzIG1heSBiZSBjaGFuZ2VkIGFmdGVyIGEgY2FsbCB0byBARlRfQXR0YWNoX0ZpbGUgb3IgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9BdHRhY2hfU3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0ZhY2VSZWNfCi0gIHsKLSAgICBGVF9Mb25nICAgICAgICAgICBudW1fZmFjZXM7Ci0gICAgRlRfTG9uZyAgICAgICAgICAgZmFjZV9pbmRleDsKLQotICAgIEZUX0xvbmcgICAgICAgICAgIGZhY2VfZmxhZ3M7Ci0gICAgRlRfTG9uZyAgICAgICAgICAgc3R5bGVfZmxhZ3M7Ci0KLSAgICBGVF9Mb25nICAgICAgICAgICBudW1fZ2x5cGhzOwotCi0gICAgRlRfU3RyaW5nKiAgICAgICAgZmFtaWx5X25hbWU7Ci0gICAgRlRfU3RyaW5nKiAgICAgICAgc3R5bGVfbmFtZTsKLQotICAgIEZUX0ludCAgICAgICAgICAgIG51bV9maXhlZF9zaXplczsKLSAgICBGVF9CaXRtYXBfU2l6ZSogICBhdmFpbGFibGVfc2l6ZXM7Ci0KLSAgICBGVF9JbnQgICAgICAgICAgICBudW1fY2hhcm1hcHM7Ci0gICAgRlRfQ2hhck1hcCogICAgICAgY2hhcm1hcHM7Ci0KLSAgICBGVF9HZW5lcmljICAgICAgICBnZW5lcmljOwotCi0gICAgLyojIFRoZSBmb2xsb3dpbmcgbWVtYmVyIHZhcmlhYmxlcyAoZG93biB0byBgdW5kZXJsaW5lX3RoaWNrbmVzcycpICovCi0gICAgLyojIGFyZSBvbmx5IHJlbGV2YW50IHRvIHNjYWxhYmxlIG91dGxpbmVzOyBjZi4gQEZUX0JpdG1hcF9TaXplICAgICovCi0gICAgLyojIGZvciBiaXRtYXAgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfQkJveCAgICAgICAgICAgYmJveDsKLQotICAgIEZUX1VTaG9ydCAgICAgICAgIHVuaXRzX3Blcl9FTTsKLSAgICBGVF9TaG9ydCAgICAgICAgICBhc2NlbmRlcjsKLSAgICBGVF9TaG9ydCAgICAgICAgICBkZXNjZW5kZXI7Ci0gICAgRlRfU2hvcnQgICAgICAgICAgaGVpZ2h0OwotCi0gICAgRlRfU2hvcnQgICAgICAgICAgbWF4X2FkdmFuY2Vfd2lkdGg7Ci0gICAgRlRfU2hvcnQgICAgICAgICAgbWF4X2FkdmFuY2VfaGVpZ2h0OwotCi0gICAgRlRfU2hvcnQgICAgICAgICAgdW5kZXJsaW5lX3Bvc2l0aW9uOwotICAgIEZUX1Nob3J0ICAgICAgICAgIHVuZGVybGluZV90aGlja25lc3M7Ci0KLSAgICBGVF9HbHlwaFNsb3QgICAgICBnbHlwaDsKLSAgICBGVF9TaXplICAgICAgICAgICBzaXplOwotICAgIEZUX0NoYXJNYXAgICAgICAgIGNoYXJtYXA7Ci0KLSAgICAvKkBwcml2YXRlIGJlZ2luICovCi0KLSAgICBGVF9Ecml2ZXIgICAgICAgICBkcml2ZXI7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgbWVtb3J5OwotICAgIEZUX1N0cmVhbSAgICAgICAgIHN0cmVhbTsKLQotICAgIEZUX0xpc3RSZWMgICAgICAgIHNpemVzX2xpc3Q7Ci0KLSAgICBGVF9HZW5lcmljICAgICAgICBhdXRvaGludDsgICAvKiBmYWNlLXNwZWNpZmljIGF1dG8taGludGVyIGRhdGEgKi8KLSAgICB2b2lkKiAgICAgICAgICAgICBleHRlbnNpb25zOyAvKiB1bnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIEZUX0ZhY2VfSW50ZXJuYWwgIGludGVybmFsOwotCi0gICAgLypAcHJpdmF0ZSBlbmQgKi8KLQotICB9IEZUX0ZhY2VSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGxpc3Qgb2YgYml0IGZsYWdzIHVzZWQgaW4gdGhlIGBmYWNlX2ZsYWdzJyBmaWVsZCBvZiB0aGUgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0ZhY2VSZWMgc3RydWN0dXJlLiAgVGhleSBpbmZvcm0gY2xpZW50IGFwcGxpY2F0aW9ucyBvZiAgICAgICAgICovCi0gIC8qICAgIHByb3BlcnRpZXMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEluZGljYXRlcyB0aGF0IHRoZSBmYWNlIGNvbnRhaW5zIG91dGxpbmUgZ2x5cGhzLiAgVGhpcyBkb2Vzbid0ICAgKi8KLSAgLyogICAgICBwcmV2ZW50IGJpdG1hcCBzdHJpa2VzLCBpLmUuLCBhIGZhY2UgY2FuIGhhdmUgYm90aCB0aGlzIGFuZCAgICAgICovCi0gIC8qICAgICAgYW5kIEBGVF9GQUNFX0ZMQUdfRklYRURfU0laRVMgc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0ZJWEVEX1NJWkVTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSW5kaWNhdGVzIHRoYXQgdGhlIGZhY2UgY29udGFpbnMgYml0bWFwIHN0cmlrZXMuICBTZWUgYWxzbyB0aGUgICAqLwotICAvKiAgICAgIGBudW1fZml4ZWRfc2l6ZXMnIGFuZCBgYXZhaWxhYmxlX3NpemVzJyBmaWVsZHMgb2YgQEZUX0ZhY2VSZWMuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEluZGljYXRlcyB0aGF0IHRoZSBmYWNlIGNvbnRhaW5zIGZpeGVkLXdpZHRoIGNoYXJhY3RlcnMgKGxpa2UgICAgKi8KLSAgLyogICAgICBDb3VyaWVyLCBMdWNpZG8sIE1vbm9UeXBlLCBldGMuKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfU0ZOVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgZmFjZSB1c2VzIHRoZSBgc2ZudCcgc3RvcmFnZSBzY2hlbWUuICBGb3IgICAgICovCi0gIC8qICAgICAgbm93LCB0aGlzIG1lYW5zIFRydWVUeXBlIGFuZCBPcGVuVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0hPUklaT05UQUwgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSW5kaWNhdGVzIHRoYXQgdGhlIGZhY2UgY29udGFpbnMgaG9yaXpvbnRhbCBnbHlwaCBtZXRyaWNzLiAgVGhpcyAqLwotICAvKiAgICAgIHNob3VsZCBiZSBzZXQgZm9yIGFsbCBjb21tb24gZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19WRVJUSUNBTCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEluZGljYXRlcyB0aGF0IHRoZSBmYWNlIGNvbnRhaW5zIHZlcnRpY2FsIGdseXBoIG1ldHJpY3MuICBUaGlzICAgKi8KLSAgLyogICAgICBpcyBvbmx5IGF2YWlsYWJsZSBpbiBzb21lIGZvcm1hdHMsIG5vdCBhbGwgb2YgdGhlbS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfS0VSTklORyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgZmFjZSBjb250YWlucyBrZXJuaW5nIGluZm9ybWF0aW9uLiAgSWYgc2V0LCAgICovCi0gIC8qICAgICAgdGhlIGtlcm5pbmcgZGlzdGFuY2UgY2FuIGJlIHJldHJpZXZlZCB0aHJvdWdoIHRoZSBmdW5jdGlvbiAgICAgICAqLwotICAvKiAgICAgIEBGVF9HZXRfS2VybmluZy4gIE90aGVyd2lzZSB0aGUgZnVuY3Rpb24gYWx3YXlzIHJldHVybiB0aGUgICAgICAgKi8KLSAgLyogICAgICB2ZWN0b3IgKDAsMCkuICBOb3RlIHRoYXQgRnJlZVR5cGUgZG9lc24ndCBoYW5kbGUga2VybmluZyBkYXRhICAgICovCi0gIC8qICAgICAgZnJvbSB0aGUgYEdQT1MnIHRhYmxlIChhcyBwcmVzZW50IGluIHNvbWUgT3BlblR5cGUgZm9udHMpLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX0ZBU1RfR0xZUEhTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVEhJUyBGTEFHIElTIERFUFJFQ0FURUQuICBETyBOT1QgVVNFIE9SIFRFU1QgSVQuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX01VTFRJUExFX01BU1RFUlMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSW5kaWNhdGVzIHRoYXQgdGhlIGZvbnQgY29udGFpbnMgbXVsdGlwbGUgbWFzdGVycyBhbmQgaXMgY2FwYWJsZSAqLwotICAvKiAgICAgIG9mIGludGVycG9sYXRpbmcgYmV0d2VlbiB0aGVtLiAgU2VlIHRoZSBtdWx0aXBsZS1tYXN0ZXJzICAgICAgICAgKi8KLSAgLyogICAgICBzcGVjaWZpYyBBUEkgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfR0xZUEhfTkFNRVMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgZm9udCBjb250YWlucyBnbHlwaCBuYW1lcyB0aGF0IGNhbiBiZSAgICAgICAgICovCi0gIC8qICAgICAgcmV0cmlldmVkIHRocm91Z2ggQEZUX0dldF9HbHlwaF9OYW1lLiAgTm90ZSB0aGF0IHNvbWUgVHJ1ZVR5cGUgICAqLwotICAvKiAgICAgIGZvbnRzIGNvbnRhaW4gYnJva2VuIGdseXBoIG5hbWUgdGFibGVzLiAgVXNlIHRoZSBmdW5jdGlvbiAgICAgICAgKi8KLSAgLyogICAgICBARlRfSGFzX1BTX0dseXBoX05hbWVzIHdoZW4gbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GQUNFX0ZMQUdfRVhURVJOQUxfU1RSRUFNIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBVc2VkIGludGVybmFsbHkgYnkgRnJlZVR5cGUgdG8gaW5kaWNhdGUgdGhhdCBhIGZhY2UncyBzdHJlYW0gd2FzICovCi0gIC8qICAgICAgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBhcHBsaWNhdGlvbiBhbmQgc2hvdWxkIG5vdCBiZSBkZXN0cm95ZWQgICAqLwotICAvKiAgICAgIHdoZW4gQEZUX0RvbmVfRmFjZSBpcyBjYWxsZWQuICBEb24ndCByZWFkIG9yIHRlc3QgdGhpcyBmbGFnLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19ISU5URVIgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFNldCBpZiB0aGUgZm9udCBkcml2ZXIgaGFzIGEgaGludGluZyBtYWNoaW5lIG9mIGl0cyBvd24uICBGb3IgICAgKi8KLSAgLyogICAgICBleGFtcGxlLCB3aXRoIFRydWVUeXBlIGZvbnRzLCBpdCBtYWtlcyBzZW5zZSB0byB1c2UgZGF0YSBmcm9tICAgICovCi0gIC8qICAgICAgdGhlIFNGTlQgYGdhc3AnIHRhYmxlIG9ubHkgaWYgdGhlIG5hdGl2ZSBUcnVlVHlwZSBoaW50aW5nIGVuZ2luZSAqLwotICAvKiAgICAgICh3aXRoIHRoZSBieXRlY29kZSBpbnRlcnByZXRlcikgaXMgYXZhaWxhYmxlIGFuZCBhY3RpdmUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19DSURfS0VZRUQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFNldCBpZiB0aGUgZm9udCBpcyBDSUQta2V5ZWQuICBJbiB0aGF0IGNhc2UsIHRoZSBmb250IGlzIG5vdCAgICAgKi8KLSAgLyogICAgICBhY2Nlc3NlZCBieSBnbHlwaCBpbmRpY2VzIGJ1dCBieSBDSUQgdmFsdWVzLiAgRm9yIHN1YnNldHRlZCAgICAgICovCi0gIC8qICAgICAgQ0lELWtleWVkIGZvbnRzIHRoaXMgaGFzIHRoZSBjb25zZXF1ZW5jZSB0aGF0IG5vdCBhbGwgaW5kZXggICAgICAqLwotICAvKiAgICAgIHZhbHVlcyBhcmUgYSB2YWxpZCBhcmd1bWVudCB0byBGVF9Mb2FkX0dseXBoLiAgT25seSB0aGUgQ0lEICAgICAgKi8KLSAgLyogICAgICB2YWx1ZXMgZm9yIHdoaWNoIGNvcnJlc3BvbmRpbmcgZ2x5cGhzIGluIHRoZSBzdWJzZXR0ZWQgZm9udCAgICAgICovCi0gIC8qICAgICAgZXhpc3QgbWFrZSBGVF9Mb2FkX0dseXBoIHJldHVybiBzdWNjZXNzZnVsbHk7IGluIGFsbCBvdGhlciBjYXNlcyAqLwotICAvKiAgICAgIHlvdSBnZXQgYW4gYEZUX0Vycl9JbnZhbGlkX0FyZ3VtZW50JyBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgTm90ZSB0aGF0IENJRC1rZXllZCBmb250cyB0aGF0IGFyZSBpbiBhbiBTRk5UIHdyYXBwZXIgZG9uJ3QgICAgICAqLwotICAvKiAgICAgIGhhdmUgdGhpcyBmbGFnIHNldCBzaW5jZSB0aGUgZ2x5cGhzIGFyZSBhY2Nlc3NlZCBpbiB0aGUgbm9ybWFsICAgKi8KLSAgLyogICAgICB3YXkgKHVzaW5nIGNvbnRpZ3VvdXMgaW5kaWNlcyk7IHRoZSBgQ0lELW5lc3MnIGlzbid0IHZpc2libGUgdG8gICovCi0gIC8qICAgICAgdGhlIGFwcGxpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRkFDRV9GTEFHX1RSSUNLWSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgU2V0IGlmIHRoZSBmb250IGlzIGB0cmlja3knLCB0aGlzIGlzLCBpdCBhbHdheXMgbmVlZHMgdGhlICAgICAgICAqLwotICAvKiAgICAgIGZvbnQgZm9ybWF0J3MgbmF0aXZlIGhpbnRpbmcgZW5naW5lIHRvIGdldCBhIHJlYXNvbmFibGUgcmVzdWx0LiAgKi8KLSAgLyogICAgICBBIHR5cGljYWwgZXhhbXBsZSBpcyB0aGUgQ2hpbmVzZSBmb250IGBtaW5nbGkudHRmJyB0aGF0IHVzZXMgICAgICovCi0gIC8qICAgICAgVHJ1ZVR5cGUgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb25zIHRvIG1vdmUgYW5kIHNjYWxlIGFsbCBvZiBpdHMgICAgICAqLwotICAvKiAgICAgIHN1YmdseXBocy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIGF1dG8taGludCBzdWNoIGZvbnRzIHVzaW5nICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEBGVF9MT0FEX0ZPUkNFX0FVVE9ISU5UOyBpdCB3aWxsIGFsc28gaWdub3JlICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBARlRfTE9BRF9OT19ISU5USU5HLiAgWW91IGhhdmUgdG8gc2V0IGJvdGggQEZUX0xPQURfTk9fSElOVElORyAgICovCi0gIC8qICAgICAgYW5kIEBGVF9MT0FEX05PX0FVVE9ISU5UIHRvIHJlYWxseSBkaXNhYmxlIGhpbnRpbmc7IGhvd2V2ZXIsIHlvdSAqLwotICAvKiAgICAgIHByb2JhYmx5IG5ldmVyIHdhbnQgdGhpcyBleGNlcHQgZm9yIGRlbW9uc3RyYXRpb24gcHVycG9zZXMuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQ3VycmVudGx5LCB0aGVyZSBhcmUgYWJvdXQgYSBkb3plbiBUcnVlVHlwZSBmb250cyBpbiB0aGUgbGlzdCBvZiAqLwotICAvKiAgICAgIHRyaWNreSBmb250czsgdGhleSBhcmUgaGFyZC1jb2RlZCBpbiBmaWxlIGB0dG9ianMuYycuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZBQ0VfRkxBR19DT0xPUiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFNldCBpZiB0aGUgZm9udCBoYXMgY29sb3IgZ2x5cGggdGFibGVzLiAgVG8gYWNjZXNzIGNvbG9yIGdseXBocyAgKi8KLSAgLyogICAgICB1c2UgQEZUX0xPQURfQ09MT1IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9GQUNFX0ZMQUdfU0NBTEFCTEUgICAgICAgICAgKCAxTCA8PCAgMCApCi0jZGVmaW5lIEZUX0ZBQ0VfRkxBR19GSVhFRF9TSVpFUyAgICAgICAoIDFMIDw8ICAxICkKLSNkZWZpbmUgRlRfRkFDRV9GTEFHX0ZJWEVEX1dJRFRIICAgICAgICggMUwgPDwgIDIgKQotI2RlZmluZSBGVF9GQUNFX0ZMQUdfU0ZOVCAgICAgICAgICAgICAgKCAxTCA8PCAgMyApCi0jZGVmaW5lIEZUX0ZBQ0VfRkxBR19IT1JJWk9OVEFMICAgICAgICAoIDFMIDw8ICA0ICkKLSNkZWZpbmUgRlRfRkFDRV9GTEFHX1ZFUlRJQ0FMICAgICAgICAgICggMUwgPDwgIDUgKQotI2RlZmluZSBGVF9GQUNFX0ZMQUdfS0VSTklORyAgICAgICAgICAgKCAxTCA8PCAgNiApCi0jZGVmaW5lIEZUX0ZBQ0VfRkxBR19GQVNUX0dMWVBIUyAgICAgICAoIDFMIDw8ICA3ICkKLSNkZWZpbmUgRlRfRkFDRV9GTEFHX01VTFRJUExFX01BU1RFUlMgICggMUwgPDwgIDggKQotI2RlZmluZSBGVF9GQUNFX0ZMQUdfR0xZUEhfTkFNRVMgICAgICAgKCAxTCA8PCAgOSApCi0jZGVmaW5lIEZUX0ZBQ0VfRkxBR19FWFRFUk5BTF9TVFJFQU0gICAoIDFMIDw8IDEwICkKLSNkZWZpbmUgRlRfRkFDRV9GTEFHX0hJTlRFUiAgICAgICAgICAgICggMUwgPDwgMTEgKQotI2RlZmluZSBGVF9GQUNFX0ZMQUdfQ0lEX0tFWUVEICAgICAgICAgKCAxTCA8PCAxMiApCi0jZGVmaW5lIEZUX0ZBQ0VfRkxBR19UUklDS1kgICAgICAgICAgICAoIDFMIDw8IDEzICkKLSNkZWZpbmUgRlRfRkFDRV9GTEFHX0NPTE9SICAgICAgICAgICAgICggMUwgPDwgMTQgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0hBU19IT1JJWk9OVEFMKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucwotICAgKiAgIGhvcml6b250YWwgbWV0cmljcyAodGhpcyBpcyB0cnVlIGZvciBhbGwgZm9udCBmb3JtYXRzIHRob3VnaCkuCi0gICAqCi0gICAqIEBhbHNvOgotICAgKiAgIEBGVF9IQVNfVkVSVElDQUwgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZm9yIHZlcnRpY2FsIG1ldHJpY3MuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9IQVNfSE9SSVpPTlRBTCggZmFjZSApIFwKLSAgICAgICAgICAoIGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfSE9SSVpPTlRBTCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSEFTX1ZFUlRJQ0FMKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyByZWFsCi0gICAqICAgdmVydGljYWwgbWV0cmljcyAoYW5kIG5vdCBvbmx5IHN5bnRoZXNpemVkIG9uZXMpLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfSEFTX1ZFUlRJQ0FMKCBmYWNlICkgXAotICAgICAgICAgICggZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19WRVJUSUNBTCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSEFTX0tFUk5JTkcoIGZhY2UgKQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuZXZlciBhIGZhY2Ugb2JqZWN0IGNvbnRhaW5zIGtlcm5pbmcKLSAgICogICBkYXRhIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIHdpdGggQEZUX0dldF9LZXJuaW5nLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfSEFTX0tFUk5JTkcoIGZhY2UgKSBcCi0gICAgICAgICAgKCBmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX0tFUk5JTkcgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0lTX1NDQUxBQkxFKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyBhIHNjYWxhYmxlCi0gICAqICAgZm9udCBmYWNlICh0cnVlIGZvciBUcnVlVHlwZSwgVHlwZX4xLCBUeXBlfjQyLCBDSUQsIE9wZW5UeXBlL0NGRiwKLSAgICogICBhbmQgUEZSIGZvbnQgZm9ybWF0cy4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0lTX1NDQUxBQkxFKCBmYWNlICkgXAotICAgICAgICAgICggZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSVNfU0ZOVCggZmFjZSApCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMgYSBmb250Ci0gICAqICAgd2hvc2UgZm9ybWF0IGlzIGJhc2VkIG9uIHRoZSBTRk5UIHN0b3JhZ2Ugc2NoZW1lLiAgVGhpcyB1c3VhbGx5Ci0gICAqICAgbWVhbnM6IFRydWVUeXBlIGZvbnRzLCBPcGVuVHlwZSBmb250cywgYXMgd2VsbCBhcyBTRk5ULWJhc2VkIGVtYmVkZGVkCi0gICAqICAgYml0bWFwIGZvbnRzLgotICAgKgotICAgKiAgIElmIHRoaXMgbWFjcm8gaXMgdHJ1ZSwgYWxsIGZ1bmN0aW9ucyBkZWZpbmVkIGluIEBGVF9TRk5UX05BTUVTX0ggYW5kCi0gICAqICAgQEZUX1RSVUVUWVBFX1RBQkxFU19IIGFyZSBhdmFpbGFibGUuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9JU19TRk5UKCBmYWNlICkgXAotICAgICAgICAgICggZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19TRk5UICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9JU19GSVhFRF9XSURUSCggZmFjZSApCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMgYSBmb250IGZhY2UKLSAgICogICB0aGF0IGNvbnRhaW5zIGZpeGVkLXdpZHRoIChvciBgbW9ub3NwYWNlJywgYGZpeGVkLXBpdGNoJywgZXRjLikKLSAgICogICBnbHlwaHMuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9JU19GSVhFRF9XSURUSCggZmFjZSApIFwKLSAgICAgICAgICAoIGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfRklYRURfV0lEVEggKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0hBU19GSVhFRF9TSVpFUyggZmFjZSApCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1hY3JvIHRoYXQgcmV0dXJucyB0cnVlIHdoZW5ldmVyIGEgZmFjZSBvYmplY3QgY29udGFpbnMgc29tZQotICAgKiAgIGVtYmVkZGVkIGJpdG1hcHMuICBTZWUgdGhlIGBhdmFpbGFibGVfc2l6ZXMnIGZpZWxkIG9mIHRoZQotICAgKiAgIEBGVF9GYWNlUmVjIHN0cnVjdHVyZS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0hBU19GSVhFRF9TSVpFUyggZmFjZSApIFwKLSAgICAgICAgICAoIGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfRklYRURfU0laRVMgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0hBU19GQVNUX0dMWVBIUyggZmFjZSApCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBEZXByZWNhdGVkLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfSEFTX0ZBU1RfR0xZUEhTKCBmYWNlICkgIDAKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9IQVNfR0xZUEhfTkFNRVMoIGZhY2UgKQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuZXZlciBhIGZhY2Ugb2JqZWN0IGNvbnRhaW5zIHNvbWUgZ2x5cGgKLSAgICogICBuYW1lcyB0aGF0IGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoIEBGVF9HZXRfR2x5cGhfTmFtZS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0hBU19HTFlQSF9OQU1FUyggZmFjZSApIFwKLSAgICAgICAgICAoIGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfR0xZUEhfTkFNRVMgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0hBU19NVUxUSVBMRV9NQVNURVJTKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucyBzb21lCi0gICAqICAgbXVsdGlwbGUgbWFzdGVycy4gIFRoZSBmdW5jdGlvbnMgcHJvdmlkZWQgYnkgQEZUX01VTFRJUExFX01BU1RFUlNfSAotICAgKiAgIGFyZSB0aGVuIGF2YWlsYWJsZSB0byBjaG9vc2UgdGhlIGV4YWN0IGRlc2lnbiB5b3Ugd2FudC4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0hBU19NVUxUSVBMRV9NQVNURVJTKCBmYWNlICkgXAotICAgICAgICAgICggZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19NVUxUSVBMRV9NQVNURVJTICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9JU19DSURfS0VZRUQoIGZhY2UgKQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuZXZlciBhIGZhY2Ugb2JqZWN0IGNvbnRhaW5zIGEgQ0lELWtleWVkCi0gICAqICAgZm9udC4gIFNlZSB0aGUgZGlzY3Vzc2lvbiBvZiBARlRfRkFDRV9GTEFHX0NJRF9LRVlFRCBmb3IgbW9yZQotICAgKiAgIGRldGFpbHMuCi0gICAqCi0gICAqICAgSWYgdGhpcyBtYWNybyBpcyB0cnVlLCBhbGwgZnVuY3Rpb25zIGRlZmluZWQgaW4gQEZUX0NJRF9IIGFyZQotICAgKiAgIGF2YWlsYWJsZS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0lTX0NJRF9LRVlFRCggZmFjZSApIFwKLSAgICAgICAgICAoIGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfQ0lEX0tFWUVEICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9JU19UUklDS1koIGZhY2UgKQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtYWNybyB0aGF0IHJldHVybnMgdHJ1ZSB3aGVuZXZlciBhIGZhY2UgcmVwcmVzZW50cyBhIGB0cmlja3knIGZvbnQuCi0gICAqICAgU2VlIHRoZSBkaXNjdXNzaW9uIG9mIEBGVF9GQUNFX0ZMQUdfVFJJQ0tZIGZvciBtb3JlIGRldGFpbHMuCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9JU19UUklDS1koIGZhY2UgKSBcCi0gICAgICAgICAgKCBmYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1RSSUNLWSApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfSEFTX0NPTE9SKCBmYWNlICkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWFjcm8gdGhhdCByZXR1cm5zIHRydWUgd2hlbmV2ZXIgYSBmYWNlIG9iamVjdCBjb250YWlucwotICAgKiAgIHRhYmxlcyBmb3IgY29sb3IgZ2x5cGhzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfSEFTX0NPTE9SKCBmYWNlICkgXAotICAgICAgICAgICggZmFjZS0+ZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19DT0xPUiApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxDb25zdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TVFlMRV9GTEFHX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGxpc3Qgb2YgYml0IGZsYWdzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHN0eWxlIG9mIGEgZ2l2ZW4gZmFjZS4gICAgKi8KLSAgLyogICAgVGhlc2UgYXJlIHVzZWQgaW4gdGhlIGBzdHlsZV9mbGFncycgZmllbGQgb2YgQEZUX0ZhY2VSZWMuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU1RZTEVfRkxBR19JVEFMSUMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSW5kaWNhdGVzIHRoYXQgYSBnaXZlbiBmYWNlIHN0eWxlIGlzIGl0YWxpYyBvciBvYmxpcXVlLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU1RZTEVfRkxBR19CT0xEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSW5kaWNhdGVzIHRoYXQgYSBnaXZlbiBmYWNlIGlzIGJvbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzdHlsZSBpbmZvcm1hdGlvbiBhcyBwcm92aWRlZCBieSBGcmVlVHlwZSBpcyB2ZXJ5IGJhc2ljLiAgTW9yZSAqLwotICAvKiAgICBkZXRhaWxzIGFyZSBiZXlvbmQgdGhlIHNjb3BlIGFuZCBzaG91bGQgYmUgZG9uZSBvbiBhIGhpZ2hlciBsZXZlbCAgKi8KLSAgLyogICAgKGZvciBleGFtcGxlLCBieSBhbmFseXppbmcgdmFyaW91cyBmaWVsZHMgb2YgdGhlIGBPUy8yJyB0YWJsZSBpbiAgICovCi0gIC8qICAgIFNGTlQgYmFzZWQgZm9udHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfU1RZTEVfRkxBR19JVEFMSUMgICggMSA8PCAwICkKLSNkZWZpbmUgRlRfU1RZTEVfRkxBR19CT0xEICAgICggMSA8PCAxICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemVfSW50ZXJuYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIG9wYXF1ZSBoYW5kbGUgdG8gYW4gYEZUX1NpemVfSW50ZXJuYWxSZWMnIHN0cnVjdHVyZSwgdXNlZCB0byAgICAqLwotICAvKiAgICBtb2RlbCBwcml2YXRlIGRhdGEgb2YgYSBnaXZlbiBARlRfU2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX1NpemVfSW50ZXJuYWxSZWNfKiAgRlRfU2l6ZV9JbnRlcm5hbDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemVfTWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzaXplIG1ldHJpY3Mgc3RydWN0dXJlIGdpdmVzIHRoZSBtZXRyaWNzIG9mIGEgc2l6ZSBvYmplY3QuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHhfcHBlbSAgICAgICA6OiBUaGUgd2lkdGggb2YgdGhlIHNjYWxlZCBFTSBzcXVhcmUgaW4gcGl4ZWxzLCBoZW5jZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgdGhlIHRlcm0gYHBwZW0nIChwaXhlbHMgcGVyIEVNKS4gIEl0IGlzIGFsc28gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHJlZmVycmVkIHRvIGFzIGBub21pbmFsIHdpZHRoJy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5X3BwZW0gICAgICAgOjogVGhlIGhlaWdodCBvZiB0aGUgc2NhbGVkIEVNIHNxdWFyZSBpbiBwaXhlbHMsICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGhlbmNlIHRoZSB0ZXJtIGBwcGVtJyAocGl4ZWxzIHBlciBFTSkuICBJdCBpcyBhbHNvICovCi0gIC8qICAgICAgICAgICAgICAgICAgICByZWZlcnJlZCB0byBhcyBgbm9taW5hbCBoZWlnaHQnLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeF9zY2FsZSAgICAgIDo6IEEgMTYuMTYgZnJhY3Rpb25hbCBzY2FsaW5nIHZhbHVlIHVzZWQgdG8gY29udmVydCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsIG1ldHJpY3MgZnJvbSBmb250IHVuaXRzIHRvIDI2LjYgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25hbCBwaXhlbHMuICBPbmx5IHJlbGV2YW50IGZvciBzY2FsYWJsZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGZvbnQgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5X3NjYWxlICAgICAgOjogQSAxNi4xNiBmcmFjdGlvbmFsIHNjYWxpbmcgdmFsdWUgdXNlZCB0byBjb252ZXJ0ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIG1ldHJpY3MgZnJvbSBmb250IHVuaXRzIHRvIDI2LjYgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbmFsIHBpeGVscy4gIE9ubHkgcmVsZXZhbnQgZm9yIHNjYWxhYmxlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgZm9udCBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFzY2VuZGVyICAgICA6OiBUaGUgYXNjZW5kZXIgaW4gMjYuNiBmcmFjdGlvbmFsIHBpeGVscy4gIFNlZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgQEZUX0ZhY2VSZWMgZm9yIHRoZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlc2NlbmRlciAgICA6OiBUaGUgZGVzY2VuZGVyIGluIDI2LjYgZnJhY3Rpb25hbCBwaXhlbHMuICBTZWUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgQEZUX0ZhY2VSZWMgZm9yIHRoZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhlaWdodCAgICAgICA6OiBUaGUgaGVpZ2h0IGluIDI2LjYgZnJhY3Rpb25hbCBwaXhlbHMuICBTZWUgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgQEZUX0ZhY2VSZWMgZm9yIHRoZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9hZHZhbmNlICA6OiBUaGUgbWF4aW11bSBhZHZhbmNlIHdpZHRoIGluIDI2LjYgZnJhY3Rpb25hbCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgcGl4ZWxzLiAgU2VlIEBGVF9GYWNlUmVjIGZvciB0aGUgZGV0YWlscy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc2NhbGluZyB2YWx1ZXMsIGlmIHJlbGV2YW50LCBhcmUgZGV0ZXJtaW5lZCBmaXJzdCBkdXJpbmcgYSAgICAgKi8KLSAgLyogICAgc2l6ZSBjaGFuZ2luZyBvcGVyYXRpb24uICBUaGUgcmVtYWluaW5nIGZpZWxkcyBhcmUgdGhlbiBzZXQgYnkgdGhlICovCi0gIC8qICAgIGRyaXZlci4gIEZvciBzY2FsYWJsZSBmb3JtYXRzLCB0aGV5IGFyZSB1c3VhbGx5IHNldCB0byBzY2FsZWQgICAgICAqLwotICAvKiAgICB2YWx1ZXMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzIGluIEBGVF9GYWNlUmVjLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCBkdWUgdG8gZ2x5cGggaGludGluZywgdGhlc2UgdmFsdWVzIG1pZ2h0IG5vdCBiZSBleGFjdCAgICAqLwotICAvKiAgICBmb3IgY2VydGFpbiBmb250cy4gIFRodXMgdGhleSBtdXN0IGJlIHRyZWF0ZWQgYXMgdW5yZWxpYWJsZSAgICAgICAgKi8KLSAgLyogICAgd2l0aCBhbiBlcnJvciBtYXJnaW4gb2YgYXQgbGVhc3Qgb25lIHBpeGVsISAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbmRlZWQsIHRoZSBvbmx5IHdheSB0byBnZXQgdGhlIGV4YWN0IG1ldHJpY3MgaXMgdG8gcmVuZGVyIF9hbGxfICAgKi8KLSAgLyogICAgZ2x5cGhzLiAgQXMgdGhpcyB3b3VsZCBiZSBhIGRlZmluaXRlIHBlcmZvcm1hbmNlIGhpdCwgaXQgaXMgdXAgdG8gICovCi0gIC8qICAgIGNsaWVudCBhcHBsaWNhdGlvbnMgdG8gcGVyZm9ybSBzdWNoIGNvbXB1dGF0aW9ucy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIEZUX1NpemVfTWV0cmljcyBzdHJ1Y3R1cmUgaXMgdmFsaWQgZm9yIGJpdG1hcCBmb250cyBhbHNvLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfU2l6ZV9NZXRyaWNzXwotICB7Ci0gICAgRlRfVVNob3J0ICB4X3BwZW07ICAgICAgLyogaG9yaXpvbnRhbCBwaXhlbHMgcGVyIEVNICAgICAgICAgICAgICAgKi8KLSAgICBGVF9VU2hvcnQgIHlfcHBlbTsgICAgICAvKiB2ZXJ0aWNhbCBwaXhlbHMgcGVyIEVNICAgICAgICAgICAgICAgICAqLwotCi0gICAgRlRfRml4ZWQgICB4X3NjYWxlOyAgICAgLyogc2NhbGluZyB2YWx1ZXMgdXNlZCB0byBjb252ZXJ0IGZvbnQgICAgKi8KLSAgICBGVF9GaXhlZCAgIHlfc2NhbGU7ICAgICAvKiB1bml0cyB0byAyNi42IGZyYWN0aW9uYWwgcGl4ZWxzICAgICAgICAqLwotCi0gICAgRlRfUG9zICAgICBhc2NlbmRlcjsgICAgLyogYXNjZW5kZXIgaW4gMjYuNiBmcmFjLiBwaXhlbHMgICAgICAgICAgKi8KLSAgICBGVF9Qb3MgICAgIGRlc2NlbmRlcjsgICAvKiBkZXNjZW5kZXIgaW4gMjYuNiBmcmFjLiBwaXhlbHMgICAgICAgICAqLwotICAgIEZUX1BvcyAgICAgaGVpZ2h0OyAgICAgIC8qIHRleHQgaGVpZ2h0IGluIDI2LjYgZnJhYy4gcGl4ZWxzICAgICAgICovCi0gICAgRlRfUG9zICAgICBtYXhfYWR2YW5jZTsgLyogbWF4IGhvcml6b250YWwgYWR2YW5jZSwgaW4gMjYuNiBwaXhlbHMgKi8KLQotICB9IEZUX1NpemVfTWV0cmljczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIHJvb3Qgc2l6ZSBjbGFzcyBzdHJ1Y3R1cmUuICBBIHNpemUgb2JqZWN0IG1vZGVscyBhIGZhY2UgICAqLwotICAvKiAgICBvYmplY3QgYXQgYSBnaXZlbiBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgIDo6IEhhbmRsZSB0byB0aGUgcGFyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdlbmVyaWMgOjogQSB0eXBlbGVzcyBwb2ludGVyLCB1bnVzZWQgYnkgdGhlIEZyZWVUeXBlIGxpYnJhcnkgb3IgICAqLwotICAvKiAgICAgICAgICAgICAgIGFueSBvZiBpdHMgZHJpdmVycy4gIEl0IGNhbiBiZSB1c2VkIGJ5IGNsaWVudCAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBhcHBsaWNhdGlvbnMgdG8gbGluayB0aGVpciBvd24gZGF0YSB0byBlYWNoIHNpemUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWV0cmljcyA6OiBNZXRyaWNzIGZvciB0aGlzIHNpemUgb2JqZWN0LiAgVGhpcyBmaWVsZCBpcyByZWFkLW9ubHkuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfU2l6ZVJlY18KLSAgewotICAgIEZUX0ZhY2UgICAgICAgICAgIGZhY2U7ICAgICAgLyogcGFyZW50IGZhY2Ugb2JqZWN0ICAgICAgICAgICAgICAqLwotICAgIEZUX0dlbmVyaWMgICAgICAgIGdlbmVyaWM7ICAgLyogZ2VuZXJpYyBwb2ludGVyIGZvciBjbGllbnQgdXNlcyAqLwotICAgIEZUX1NpemVfTWV0cmljcyAgIG1ldHJpY3M7ICAgLyogc2l6ZSBtZXRyaWNzICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX1NpemVfSW50ZXJuYWwgIGludGVybmFsOwotCi0gIH0gRlRfU2l6ZVJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1N1YkdseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzdWJnbHlwaCBzdHJ1Y3R1cmUgaXMgYW4gaW50ZXJuYWwgb2JqZWN0IHVzZWQgdG8gZGVzY3JpYmUgICAgICAqLwotICAvKiAgICBzdWJnbHlwaHMgKGZvciBleGFtcGxlLCBpbiB0aGUgY2FzZSBvZiBjb21wb3NpdGVzKS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc3ViZ2x5cGggaW1wbGVtZW50YXRpb24gaXMgbm90IHBhcnQgb2YgdGhlIGhpZ2gtbGV2ZWwgQVBJLCAgICAgKi8KLSAgLyogICAgaGVuY2UgdGhlIGZvcndhcmQgc3RydWN0dXJlIGRlY2xhcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3UgY2FuIGhvd2V2ZXIgcmV0cmlldmUgc3ViZ2x5cGggaW5mb3JtYXRpb24gd2l0aCAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0dldF9TdWJHbHlwaF9JbmZvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9TdWJHbHlwaFJlY18qICBGVF9TdWJHbHlwaDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Nsb3RfSW50ZXJuYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIG9wYXF1ZSBoYW5kbGUgdG8gYW4gYEZUX1Nsb3RfSW50ZXJuYWxSZWMnIHN0cnVjdHVyZSwgdXNlZCB0byAgICAqLwotICAvKiAgICBtb2RlbCBwcml2YXRlIGRhdGEgb2YgYSBnaXZlbiBARlRfR2x5cGhTbG90IG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX1Nsb3RfSW50ZXJuYWxSZWNfKiAgRlRfU2xvdF9JbnRlcm5hbDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoU2xvdFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIHJvb3QgZ2x5cGggc2xvdCBjbGFzcyBzdHJ1Y3R1cmUuICBBIGdseXBoIHNsb3QgaXMgYSAgICAgICAqLwotICAvKiAgICBjb250YWluZXIgd2hlcmUgaW5kaXZpZHVhbCBnbHlwaHMgY2FuIGJlIGxvYWRlZCwgYmUgdGhleSBpbiAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSBvciBiaXRtYXAgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIEZyZWVUeXBlIGxpYnJhcnkgaW5zdGFuY2UgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgc2xvdCBiZWxvbmdzIHRvLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuZXh0ICAgICAgICAgICAgICA6OiBJbiBzb21lIGNhc2VzIChsaWtlIHNvbWUgZm9udCB0b29scyksIHNldmVyYWwgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGggc2xvdHMgcGVyIGZhY2Ugb2JqZWN0IGNhbiBiZSBhIGdvb2QgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLiAgQXMgdGhpcyBpcyByYXJlLCB0aGUgZ2x5cGggc2xvdHMgYXJlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZWQgdGhyb3VnaCBhIGRpcmVjdCwgc2luZ2xlLWxpbmtlZCBsaXN0ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgaXRzIGBuZXh0JyBmaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnZW5lcmljICAgICAgICAgICA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgdW51c2VkIGJ5IHRoZSBGcmVlVHlwZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeSBvciBhbnkgb2YgaXRzIGRyaXZlcnMuICBJdCBjYW4gYmUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgYnkgY2xpZW50IGFwcGxpY2F0aW9ucyB0byBsaW5rIHRoZWlyIG93biAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHRvIGVhY2ggZ2x5cGggc2xvdCBvYmplY3QuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1ldHJpY3MgICAgICAgICAgIDo6IFRoZSBtZXRyaWNzIG9mIHRoZSBsYXN0IGxvYWRlZCBnbHlwaCBpbiB0aGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBzbG90LiAgVGhlIHJldHVybmVkIHZhbHVlcyBkZXBlbmQgb24gdGhlIGxhc3QgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgbG9hZCBmbGFncyAoc2VlIHRoZSBARlRfTG9hZF9HbHlwaCBBUEkgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKSBhbmQgY2FuIGJlIGV4cHJlc3NlZCBlaXRoZXIgaW4gMjYuNiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbmFsIHBpeGVscyBvciBmb250IHVuaXRzLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBldmVuIHdoZW4gdGhlIGdseXBoIGltYWdlIGlzICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZCwgdGhlIG1ldHJpY3MgYXJlIG5vdC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpbmVhckhvcmlBZHZhbmNlIDo6IFRoZSBhZHZhbmNlIHdpZHRoIG9mIHRoZSB1bmhpbnRlZCBnbHlwaC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBJdHMgdmFsdWUgaXMgZXhwcmVzc2VkIGluIDE2LjE2IGZyYWN0aW9uYWwgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzLCB1bmxlc3MgQEZUX0xPQURfTElORUFSX0RFU0lHTiBpcyBzZXQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gbG9hZGluZyB0aGUgZ2x5cGguICBUaGlzIGZpZWxkIGNhbiBiZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRhbnQgdG8gcGVyZm9ybSBjb3JyZWN0IFdZU0lXWUcgbGF5b3V0LiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgT25seSByZWxldmFudCBmb3Igb3V0bGluZSBnbHlwaHMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaW5lYXJWZXJ0QWR2YW5jZSA6OiBUaGUgYWR2YW5jZSBoZWlnaHQgb2YgdGhlIHVuaGludGVkIGdseXBoLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgSXRzIHZhbHVlIGlzIGV4cHJlc3NlZCBpbiAxNi4xNiBmcmFjdGlvbmFsICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVscywgdW5sZXNzIEBGVF9MT0FEX0xJTkVBUl9ERVNJR04gaXMgc2V0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGxvYWRpbmcgdGhlIGdseXBoLiAgVGhpcyBmaWVsZCBjYW4gYmUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0YW50IHRvIHBlcmZvcm0gY29ycmVjdCBXWVNJV1lHIGxheW91dC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgcmVsZXZhbnQgZm9yIG91dGxpbmUgZ2x5cGhzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWR2YW5jZSAgICAgICAgICAgOjogVGhpcyBzaG9ydGhhbmQgaXMsIGRlcGVuZGluZyBvbiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9MT0FEX0lHTk9SRV9UUkFOU0ZPUk0sIHRoZSB0cmFuc2Zvcm1lZCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAoaGludGVkKSBhZHZhbmNlIHdpZHRoIGZvciB0aGUgZ2x5cGgsIGluIDI2LjYgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25hbCBwaXhlbCBmb3JtYXQuICBBcyBzcGVjaWZpZWQgd2l0aCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCwgaXQgdXNlcyBlaXRoZXIgdGhlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBgaG9yaUFkdmFuY2UnIG9yIHRoZSBgdmVydEFkdmFuY2UnIHZhbHVlIG9mICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgYG1ldHJpY3MnIGZpZWxkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb3JtYXQgICAgICAgICAgICA6OiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgZm9ybWF0IG9mIHRoZSBpbWFnZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVkIGluIHRoZSBnbHlwaCBzbG90LiAgVHlwaWNhbGx5ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9HTFlQSF9GT1JNQVRfQklUTUFQLCAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBARlRfR0xZUEhfRk9STUFUX09VVExJTkUsIG9yICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0dMWVBIX0ZPUk1BVF9DT01QT1NJVEUsIGJ1dCBvdGhlcnMgYXJlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYml0bWFwICAgICAgICAgICAgOjogVGhpcyBmaWVsZCBpcyB1c2VkIGFzIGEgYml0bWFwIGRlc2NyaXB0b3IgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIHNsb3QgZm9ybWF0IGlzICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBARlRfR0xZUEhfRk9STUFUX0JJVE1BUC4gIE5vdGUgdGhhdCB0aGUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyBhbmQgY29udGVudCBvZiB0aGUgYml0bWFwIGJ1ZmZlciBjYW4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZSBiZXR3ZWVuIGNhbGxzIG9mIEBGVF9Mb2FkX0dseXBoIGFuZCBhICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmZXcgb3RoZXIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJpdG1hcF9sZWZ0ICAgICAgIDo6IFRoZSBiaXRtYXAncyBsZWZ0IGJlYXJpbmcgZXhwcmVzc2VkIGluICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyIHBpeGVscy4gIE9ubHkgdmFsaWQgaWYgdGhlIGZvcm1hdCBpcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAsIHRoaXMgaXMsIGlmIHRoZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoIHNsb3QgY29udGFpbnMgYSBiaXRtYXAuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYml0bWFwX3RvcCAgICAgICAgOjogVGhlIGJpdG1hcCdzIHRvcCBiZWFyaW5nIGV4cHJlc3NlZCBpbiBpbnRlZ2VyICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVscy4gIFJlbWVtYmVyIHRoYXQgdGhpcyBpcyB0aGUgZGlzdGFuY2UgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBiYXNlbGluZSB0byB0aGUgdG9wLW1vc3QgZ2x5cGggICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmxpbmUsIHVwd2FyZHMgeX5jb29yZGluYXRlcyBiZWluZyAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICpwb3NpdGl2ZSouICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSAgICAgICAgICAgOjogVGhlIG91dGxpbmUgZGVzY3JpcHRvciBmb3IgdGhlIGN1cnJlbnQgZ2x5cGggICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIGlmIGl0cyBmb3JtYXQgaXMgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBARlRfR0xZUEhfRk9STUFUX09VVExJTkUuICBPbmNlIGEgZ2x5cGggaXMgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkLCBgb3V0bGluZScgY2FuIGJlIHRyYW5zZm9ybWVkLCAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RvcnRlZCwgZW1ib2xkZWQsIGV0Yy4gIEhvd2V2ZXIsIGl0IG11c3QgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYmUgZnJlZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9zdWJnbHlwaHMgICAgIDo6IFRoZSBudW1iZXIgb2Ygc3ViZ2x5cGhzIGluIGEgY29tcG9zaXRlIGdseXBoLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIGlzIG9ubHkgdmFsaWQgZm9yIHRoZSBjb21wb3NpdGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGggZm9ybWF0IHRoYXQgc2hvdWxkIG5vcm1hbGx5IG9ubHkgYmUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZCB3aXRoIHRoZSBARlRfTE9BRF9OT19SRUNVUlNFIGZsYWcuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3ViZ2x5cGhzICAgICAgICAgOjogQW4gYXJyYXkgb2Ygc3ViZ2x5cGggZGVzY3JpcHRvcnMgZm9yICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSBnbHlwaHMuICBUaGVyZSBhcmUgYG51bV9zdWJnbHlwaHMnICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyBpbiB0aGVyZS4gIEN1cnJlbnRseSBpbnRlcm5hbCB0byAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb250cm9sX2RhdGEgICAgICA6OiBDZXJ0YWluIGZvbnQgZHJpdmVycyBjYW4gYWxzbyByZXR1cm4gdGhlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCBkYXRhIGZvciBhIGdpdmVuIGdseXBoIGltYWdlIChlLmcuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlIGJ5dGVjb2RlLCBUeXBlfjEgY2hhcnN0cmluZ3MsIGV0Yy4pLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIGlzIGEgcG9pbnRlciB0byBzdWNoIGRhdGEuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbnRyb2xfbGVuICAgICAgIDo6IFRoaXMgaXMgdGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgY29udHJvbCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG90aGVyICAgICAgICAgICAgIDo6IFJlYWxseSB3aWNrZWQgZm9ybWF0cyBjYW4gdXNlIHRoaXMgcG9pbnRlciB0byAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50IHRoZWlyIG93biBnbHlwaCBpbWFnZSB0byBjbGllbnQgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25zLiAgTm90ZSB0aGF0IHRoZSBhcHBsaWNhdGlvbiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzIHRvIGtub3cgYWJvdXQgdGhlIGltYWdlIGZvcm1hdC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbHNiX2RlbHRhICAgICAgICAgOjogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBoaW50ZWQgYW5kIHVuaGludGVkICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgc2lkZSBiZWFyaW5nIHdoaWxlIGF1dG8taGludGluZyBpcyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmUuICBaZXJvIG90aGVyd2lzZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJzYl9kZWx0YSAgICAgICAgIDo6IFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gaGludGVkIGFuZCB1bmhpbnRlZCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCBzaWRlIGJlYXJpbmcgd2hpbGUgYXV0by1oaW50aW5nIGlzICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlLiAgWmVybyBvdGhlcndpc2UuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgQEZUX0xvYWRfR2x5cGggaXMgY2FsbGVkIHdpdGggZGVmYXVsdCBmbGFncyAoc2VlICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9MT0FEX0RFRkFVTFQpIHRoZSBnbHlwaCBpbWFnZSBpcyBsb2FkZWQgaW4gdGhlIGdseXBoIHNsb3QgaW4gICAqLwotICAvKiAgICBpdHMgbmF0aXZlIGZvcm1hdCAoZS5nLiwgYW4gb3V0bGluZSBnbHlwaCBmb3IgVHJ1ZVR5cGUgYW5kIFR5cGV+MSAgKi8KLSAgLyogICAgZm9ybWF0cykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGltYWdlIGNhbiBsYXRlciBiZSBjb252ZXJ0ZWQgaW50byBhIGJpdG1hcCBieSBjYWxsaW5nICAgICAgICAgKi8KLSAgLyogICAgQEZUX1JlbmRlcl9HbHlwaC4gIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIGN1cnJlbnQgcmVuZGVyZXIgZm9yICAgICovCi0gIC8qICAgIHRoZSBuYXRpdmUgaW1hZ2UncyBmb3JtYXQsIHRoZW4gaW52b2tlcyBpdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlbmRlcmVyIGlzIGluIGNoYXJnZSBvZiB0cmFuc2Zvcm1pbmcgdGhlIG5hdGl2ZSBpbWFnZSB0aHJvdWdoICovCi0gIC8qICAgIHRoZSBzbG90J3MgZmFjZSB0cmFuc2Zvcm1hdGlvbiBmaWVsZHMsIHRoZW4gY29udmVydGluZyBpdCBpbnRvIGEgICAqLwotICAvKiAgICBiaXRtYXAgdGhhdCBpcyByZXR1cm5lZCBpbiBgc2xvdC0+Yml0bWFwJy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCBgc2xvdC0+Yml0bWFwX2xlZnQnIGFuZCBgc2xvdC0+Yml0bWFwX3RvcCcgYXJlIGFsc28gdXNlZCAqLwotICAvKiAgICB0byBzcGVjaWZ5IHRoZSBwb3NpdGlvbiBvZiB0aGUgYml0bWFwIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHBlbiAgKi8KLSAgLyogICAgcG9zaXRpb24gKGUuZy4sIGNvb3JkaW5hdGVzICgwLDApIG9uIHRoZSBiYXNlbGluZSkuICBPZiBjb3Vyc2UsICAgICovCi0gIC8qICAgIGBzbG90LT5mb3JtYXQnIGlzIGFsc28gY2hhbmdlZCB0byBARlRfR0xZUEhfRk9STUFUX0JJVE1BUC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEhlcmUgaXMgYSBzbWFsbCBwc2V1ZG8gY29kZSBmcmFnbWVudCB0aGF0IHNob3dzIGhvdyB0byB1c2UgICAgICAgICAqLwotICAvKiAgICBgbHNiX2RlbHRhJyBhbmQgYHJzYl9kZWx0YSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEZUX1BvcyAgb3JpZ2luX3ggICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGVF9Qb3MgIHByZXZfcnNiX2RlbHRhID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBmb3IgYWxsIGdseXBocyBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICA8Y29tcHV0ZSBrZXJuIGJldHdlZW4gY3VycmVudCBhbmQgcHJldmlvdXMgZ2x5cGggYW5kIGFkZCBpdCB0byAqLwotICAvKiAgICAgICAgIGBvcmlnaW5feCc+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICA8bG9hZCBnbHlwaCB3aXRoIGBGVF9Mb2FkX0dseXBoJz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGlmICggcHJldl9yc2JfZGVsdGEgLSBmYWNlLT5nbHlwaC0+bHNiX2RlbHRhID49IDMyICkgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIG9yaWdpbl94IC09IDY0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgZWxzZSBpZiAoIHByZXZfcnNiX2RlbHRhIC0gZmFjZS0+Z2x5cGgtPmxzYl9kZWx0YSA8IC0zMiApICAgICAgKi8KLSAgLyogICAgICAgICAgb3JpZ2luX3ggKz0gNjQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgcHJldl9yc2JfZGVsdGEgPSBmYWNlLT5nbHlwaC0+cnNiX2RlbHRhOyAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICA8c2F2ZSBnbHlwaCBpbWFnZSwgb3IgcmVuZGVyIGdseXBoLCBvciAuLi4+ICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIG9yaWdpbl94ICs9IGZhY2UtPmdseXBoLT5hZHZhbmNlLng7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgZW5kZm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9HbHlwaFNsb3RSZWNfCi0gIHsKLSAgICBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5OwotICAgIEZUX0ZhY2UgICAgICAgICAgIGZhY2U7Ci0gICAgRlRfR2x5cGhTbG90ICAgICAgbmV4dDsKLSAgICBGVF9VSW50ICAgICAgICAgICByZXNlcnZlZDsgICAgICAgLyogcmV0YWluZWQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5ICovCi0gICAgRlRfR2VuZXJpYyAgICAgICAgZ2VuZXJpYzsKLQotICAgIEZUX0dseXBoX01ldHJpY3MgIG1ldHJpY3M7Ci0gICAgRlRfRml4ZWQgICAgICAgICAgbGluZWFySG9yaUFkdmFuY2U7Ci0gICAgRlRfRml4ZWQgICAgICAgICAgbGluZWFyVmVydEFkdmFuY2U7Ci0gICAgRlRfVmVjdG9yICAgICAgICAgYWR2YW5jZTsKLQotICAgIEZUX0dseXBoX0Zvcm1hdCAgIGZvcm1hdDsKLQotICAgIEZUX0JpdG1hcCAgICAgICAgIGJpdG1hcDsKLSAgICBGVF9JbnQgICAgICAgICAgICBiaXRtYXBfbGVmdDsKLSAgICBGVF9JbnQgICAgICAgICAgICBiaXRtYXBfdG9wOwotCi0gICAgRlRfT3V0bGluZSAgICAgICAgb3V0bGluZTsKLQotICAgIEZUX1VJbnQgICAgICAgICAgIG51bV9zdWJnbHlwaHM7Ci0gICAgRlRfU3ViR2x5cGggICAgICAgc3ViZ2x5cGhzOwotCi0gICAgdm9pZCogICAgICAgICAgICAgY29udHJvbF9kYXRhOwotICAgIGxvbmcgICAgICAgICAgICAgIGNvbnRyb2xfbGVuOwotCi0gICAgRlRfUG9zICAgICAgICAgICAgbHNiX2RlbHRhOwotICAgIEZUX1BvcyAgICAgICAgICAgIHJzYl9kZWx0YTsKLQotICAgIHZvaWQqICAgICAgICAgICAgIG90aGVyOwotCi0gICAgRlRfU2xvdF9JbnRlcm5hbCAgaW50ZXJuYWw7Ci0KLSAgfSBGVF9HbHlwaFNsb3RSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBGIFUgTiBDIFQgSSBPIE4gUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0luaXRfRnJlZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRpYWxpemUgYSBuZXcgRnJlZVR5cGUgbGlicmFyeSBvYmplY3QuICBUaGUgc2V0IG9mIG1vZHVsZXMgICAgICAqLwotICAvKiAgICB0aGF0IGFyZSByZWdpc3RlcmVkIGJ5IHRoaXMgZnVuY3Rpb24gaXMgZGV0ZXJtaW5lZCBhdCBidWlsZCB0aW1lLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbGlicmFyeSA6OiBBIGhhbmRsZSB0byBhIG5ldyBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbiBjYXNlIHlvdSB3YW50IHRvIHByb3ZpZGUgeW91ciBvd24gbWVtb3J5IGFsbG9jYXRpbmcgcm91dGluZXMsICAgKi8KLSAgLyogICAgdXNlIEBGVF9OZXdfTGlicmFyeSBpbnN0ZWFkLCBmb2xsb3dlZCBieSBhIGNhbGwgdG8gICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9BZGRfRGVmYXVsdF9Nb2R1bGVzIChvciBhIHNlcmllcyBvZiBjYWxscyB0byBARlRfQWRkX01vZHVsZSkuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIEBGVF9MaWJyYXJ5IGFuZCBARlRfRmFjZSBmb3IgICAgICAgICAgICAgICovCi0gIC8qICAgIG11bHRpLXRocmVhZGluZyBpc3N1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgeW91IG5lZWQgcmVmZXJlbmNlLWNvdW50aW5nIChjZi4gQEZUX1JlZmVyZW5jZV9MaWJyYXJ5KSwgdXNlICAgICovCi0gIC8qICAgIEBGVF9OZXdfTGlicmFyeSBhbmQgQEZUX0RvbmVfTGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0luaXRfRnJlZVR5cGUoIEZUX0xpYnJhcnkgICphbGlicmFyeSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9GcmVlVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzdHJveSBhIGdpdmVuIEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0IGFuZCBhbGwgb2YgaXRzIGNoaWxkcmVuLCAgICovCi0gIC8qICAgIGluY2x1ZGluZyByZXNvdXJjZXMsIGRyaXZlcnMsIGZhY2VzLCBzaXplcywgZXRjLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0RvbmVfRnJlZVR5cGUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09QRU5fWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgbGlzdCBvZiBiaXQgZmllbGQgY29uc3RhbnRzIHVzZWQgd2l0aGluIHRoZSBgZmxhZ3MnIGZpZWxkIG9mIHRoZSAqLwotICAvKiAgICBARlRfT3Blbl9BcmdzIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PUEVOX01FTU9SWSAgIDo6IFRoaXMgaXMgYSBtZW1vcnktYmFzZWQgc3RyZWFtLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09QRU5fU1RSRUFNICAgOjogQ29weSB0aGUgc3RyZWFtIGZyb20gdGhlIGBzdHJlYW0nIGZpZWxkLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1BFTl9QQVRITkFNRSA6OiBDcmVhdGUgYSBuZXcgaW5wdXQgc3RyZWFtIGZyb20gYSBDfnBhdGggICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1BFTl9EUklWRVIgICA6OiBVc2UgdGhlIGBkcml2ZXInIGZpZWxkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PUEVOX1BBUkFNUyAgIDo6IFVzZSB0aGUgYG51bV9wYXJhbXMnIGFuZCBgcGFyYW1zJyBmaWVsZHMuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYEZUX09QRU5fTUVNT1JZJywgYEZUX09QRU5fU1RSRUFNJywgYW5kIGBGVF9PUEVOX1BBVEhOQU1FJyAgICAgKi8KLSAgLyogICAgZmxhZ3MgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9PUEVOX01FTU9SWSAgICAweDEKLSNkZWZpbmUgRlRfT1BFTl9TVFJFQU0gICAgMHgyCi0jZGVmaW5lIEZUX09QRU5fUEFUSE5BTUUgIDB4NAotI2RlZmluZSBGVF9PUEVOX0RSSVZFUiAgICAweDgKLSNkZWZpbmUgRlRfT1BFTl9QQVJBTVMgICAgMHgxMAotCi0KLSAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgYEZUX09QRU5fWFhYJyAqLwotICAvKiB2YWx1ZXMgaW5zdGVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIGZ0X29wZW5fbWVtb3J5ICAgIEZUX09QRU5fTUVNT1JZCi0jZGVmaW5lIGZ0X29wZW5fc3RyZWFtICAgIEZUX09QRU5fU1RSRUFNCi0jZGVmaW5lIGZ0X29wZW5fcGF0aG5hbWUgIEZUX09QRU5fUEFUSE5BTUUKLSNkZWZpbmUgZnRfb3Blbl9kcml2ZXIgICAgRlRfT1BFTl9EUklWRVIKLSNkZWZpbmUgZnRfb3Blbl9wYXJhbXMgICAgRlRfT1BFTl9QQVJBTVMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BhcmFtZXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIHBhc3MgbW9yZSBvciBsZXNzIGdlbmVyaWMgcGFyYW1ldGVycyB0byAqLwotICAvKiAgICBARlRfT3Blbl9GYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWcgIDo6IEEgZm91ci1ieXRlIGlkZW50aWZpY2F0aW9uIHRhZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRhdGEgOjogQSBwb2ludGVyIHRvIHRoZSBwYXJhbWV0ZXIgZGF0YS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBJRCBhbmQgZnVuY3Rpb24gb2YgcGFyYW1ldGVycyBhcmUgZHJpdmVyLXNwZWNpZmljLiAgU2VlIHRoZSAgICAqLwotICAvKiAgICB2YXJpb3VzIEZUX1BBUkFNX1RBR19YWFggZmxhZ3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9QYXJhbWV0ZXJfCi0gIHsKLSAgICBGVF9VTG9uZyAgICB0YWc7Ci0gICAgRlRfUG9pbnRlciAgZGF0YTsKLQotICB9IEZUX1BhcmFtZXRlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09wZW5fQXJncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gaW5kaWNhdGUgaG93IHRvIG9wZW4gYSBuZXcgZm9udCBmaWxlIG9yICAgICAgICAqLwotICAvKiAgICBzdHJlYW0uICBBIHBvaW50ZXIgdG8gc3VjaCBhIHN0cnVjdHVyZSBjYW4gYmUgdXNlZCBhcyBhIHBhcmFtZXRlciAgKi8KLSAgLyogICAgZm9yIHRoZSBmdW5jdGlvbnMgQEZUX09wZW5fRmFjZSBhbmQgQEZUX0F0dGFjaF9TdHJlYW0uICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmxhZ3MgICAgICAgOjogQSBzZXQgb2YgYml0IGZsYWdzIGluZGljYXRpbmcgaG93IHRvIHVzZSB0aGUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5X2Jhc2UgOjogVGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGZpbGUgaW4gbWVtb3J5LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnlfc2l6ZSA6OiBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgZmlsZSBpbiBtZW1vcnkuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhdGhuYW1lICAgIDo6IEEgcG9pbnRlciB0byBhbiA4LWJpdCBmaWxlIHBhdGhuYW1lLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtICAgICAgOjogQSBoYW5kbGUgdG8gYSBzb3VyY2Ugc3RyZWFtIG9iamVjdC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkcml2ZXIgICAgICA6OiBUaGlzIGZpZWxkIGlzIGV4Y2x1c2l2ZWx5IHVzZWQgYnkgQEZUX09wZW5fRmFjZTsgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgaXQgc2ltcGx5IHNwZWNpZmllcyB0aGUgZm9udCBkcml2ZXIgdG8gdXNlIHRvIG9wZW4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHRoZSBmYWNlLiAgSWYgc2V0IHRvfjAsIEZyZWVUeXBlIHRyaWVzIHRvIGxvYWQgdGhlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBmYWNlIHdpdGggZWFjaCBvbmUgb2YgdGhlIGRyaXZlcnMgaW4gaXRzIGxpc3QuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9wYXJhbXMgIDo6IFRoZSBudW1iZXIgb2YgZXh0cmEgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFyYW1zICAgICAgOjogRXh0cmEgcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIGZvbnQgZHJpdmVyIHdoZW4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIG9wZW5pbmcgYSBuZXcgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzdHJlYW0gdHlwZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBjb250ZW50cyBvZiBgZmxhZ3MnIHRoYXQgICAgICAqLwotICAvKiAgICBhcmUgdGVzdGVkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgYnkgQEZUX09wZW5fRmFjZTogICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHRoZSBARlRfT1BFTl9NRU1PUlkgYml0IGlzIHNldCwgYXNzdW1lIHRoYXQgdGhpcyBpcyBhICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgZmlsZSBvZiBgbWVtb3J5X3NpemUnIGJ5dGVzLCBsb2NhdGVkIGF0IGBtZW1vcnlfYWRkcmVzcycuICAgKi8KLSAgLyogICAgVGhlIGRhdGEgYXJlIGFyZSBub3QgY29waWVkLCBhbmQgdGhlIGNsaWVudCBpcyByZXNwb25zaWJsZSBmb3IgICAgICovCi0gIC8qICAgIHJlbGVhc2luZyBhbmQgZGVzdHJveWluZyB0aGVtIF9hZnRlcl8gdGhlIGNvcnJlc3BvbmRpbmcgY2FsbCB0byAgICAqLwotICAvKiAgICBARlRfRG9uZV9GYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE90aGVyd2lzZSwgaWYgdGhlIEBGVF9PUEVOX1NUUkVBTSBiaXQgaXMgc2V0LCBhc3N1bWUgdGhhdCBhICAgICAgICAqLwotICAvKiAgICBjdXN0b20gaW5wdXQgc3RyZWFtIGBzdHJlYW0nIGlzIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE90aGVyd2lzZSwgaWYgdGhlIEBGVF9PUEVOX1BBVEhOQU1FIGJpdCBpcyBzZXQsIGFzc3VtZSB0aGF0IHRoaXMgICAqLwotICAvKiAgICBpcyBhIG5vcm1hbCBmaWxlIGFuZCB1c2UgYHBhdGhuYW1lJyB0byBvcGVuIGl0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHRoZSBARlRfT1BFTl9EUklWRVIgYml0IGlzIHNldCwgQEZUX09wZW5fRmFjZSBvbmx5IHRyaWVzIHRvICAgICAqLwotICAvKiAgICBvcGVuIHRoZSBmaWxlIHdpdGggdGhlIGRyaXZlciB3aG9zZSBoYW5kbGVyIGlzIGluIGBkcml2ZXInLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHRoZSBARlRfT1BFTl9QQVJBTVMgYml0IGlzIHNldCwgdGhlIHBhcmFtZXRlcnMgZ2l2ZW4gYnkgICAgICAgICAqLwotICAvKiAgICBgbnVtX3BhcmFtcycgYW5kIGBwYXJhbXMnIGlzIHVzZWQuICBUaGV5IGFyZSBpZ25vcmVkIG90aGVyd2lzZS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElkZWFsbHksIGJvdGggdGhlIGBwYXRobmFtZScgYW5kIGBwYXJhbXMnIGZpZWxkcyBzaG91bGQgYmUgdGFnZ2VkICAqLwotICAvKiAgICBhcyBgY29uc3QnOyB0aGlzIGlzIG1pc3NpbmcgZm9yIEFQSSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gIEluICAgKi8KLSAgLyogICAgb3RoZXIgd29yZHMsIGFwcGxpY2F0aW9ucyBzaG91bGQgdHJlYXQgdGhlbSBhcyByZWFkLW9ubHkuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfT3Blbl9BcmdzXwotICB7Ci0gICAgRlRfVUludCAgICAgICAgIGZsYWdzOwotICAgIGNvbnN0IEZUX0J5dGUqICBtZW1vcnlfYmFzZTsKLSAgICBGVF9Mb25nICAgICAgICAgbWVtb3J5X3NpemU7Ci0gICAgRlRfU3RyaW5nKiAgICAgIHBhdGhuYW1lOwotICAgIEZUX1N0cmVhbSAgICAgICBzdHJlYW07Ci0gICAgRlRfTW9kdWxlICAgICAgIGRyaXZlcjsKLSAgICBGVF9JbnQgICAgICAgICAgbnVtX3BhcmFtczsKLSAgICBGVF9QYXJhbWV0ZXIqICAgcGFyYW1zOwotCi0gIH0gRlRfT3Blbl9BcmdzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X0ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBjYWxscyBARlRfT3Blbl9GYWNlIHRvIG9wZW4gYSBmb250IGJ5IGl0cyBwYXRobmFtZS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGF0aG5hbWUgICA6OiBBIHBhdGggdG8gdGhlIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4IDo6IFNlZSBARlRfT3Blbl9GYWNlIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoaXMgKi8KLSAgLyogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWZhY2UgICAgICA6OiBBIGhhbmRsZSB0byBhIG5ldyBmYWNlIG9iamVjdC4gIElmIGBmYWNlX2luZGV4JyBpcyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm8sIGl0IG11c3QgYmUgbm9uLU5VTEwuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZSBARlRfRG9uZV9GYWNlIHRvIGRlc3Ryb3kgdGhlIGNyZWF0ZWQgQEZUX0ZhY2Ugb2JqZWN0IChhbG9uZyAgICAqLwotICAvKiAgICB3aXRoIGl0cyBzbG90IGFuZCBzaXplcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9OZXdfRmFjZSggRlRfTGlicmFyeSAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgZmlsZXBhdGhuYW1lLAotICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICBGVF9GYWNlICAgICAqYWZhY2UgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX05ld19NZW1vcnlfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gY2FsbHMgQEZUX09wZW5fRmFjZSB0byBvcGVuIGEgZm9udCB0aGF0IGhhcyBiZWVuICAgICAqLwotICAvKiAgICBsb2FkZWQgaW50byBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5ICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmaWxlX2Jhc2UgIDo6IEEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmb250IGRhdGEuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZpbGVfc2l6ZSAgOjogVGhlIHNpemUgb2YgdGhlIG1lbW9yeSBjaHVuayB1c2VkIGJ5IHRoZSBmb250IGRhdGEuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBTZWUgQEZUX09wZW5fRmFjZSBmb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGlzICovCi0gIC8qICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFmYWNlICAgICAgOjogQSBoYW5kbGUgdG8gYSBuZXcgZmFjZSBvYmplY3QuICBJZiBgZmFjZV9pbmRleCcgaXMgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvLCBpdCBtdXN0IGJlIG5vbi1OVUxMLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3UgbXVzdCBub3QgZGVhbGxvY2F0ZSB0aGUgbWVtb3J5IGJlZm9yZSBjYWxsaW5nIEBGVF9Eb25lX0ZhY2UuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9OZXdfTWVtb3J5X0ZhY2UoIEZUX0xpYnJhcnkgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBmaWxlX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgIGZpbGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICAqYWZhY2UgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09wZW5fRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENyZWF0ZSBhIGZhY2Ugb2JqZWN0IGZyb20gYSBnaXZlbiByZXNvdXJjZSBkZXNjcmliZWQgYnkgICAgICAgICAgICAqLwotICAvKiAgICBARlRfT3Blbl9BcmdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5ICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhcmdzICAgICAgIDo6IEEgcG9pbnRlciB0byBhbiBgRlRfT3Blbl9BcmdzJyBzdHJ1Y3R1cmUgdGhhdCBtdXN0ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBiZSBmaWxsZWQgYnkgdGhlIGNhbGxlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4IDo6IFRoaXMgZmllbGQgaG9sZHMgdHdvIGRpZmZlcmVudCB2YWx1ZXMuICBCaXRzIDAtMTUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBhcmUgdGhlIGluZGV4IG9mIHRoZSBmYWNlIGluIHRoZSBmb250IGZpbGUgKHN0YXJ0aW5nICovCi0gIC8qICAgICAgICAgICAgICAgICAgd2l0aCB2YWx1ZX4wKS4gIFNldCBpdCB0b34wIGlmIHRoZXJlIGlzIG9ubHkgb25lICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGZhY2UgaW4gdGhlIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgQml0cyAxNi0zMCBhcmUgcmVsZXZhbnQgdG8gR1ggdmFyaWF0aW9uIGZvbnRzIG9ubHksICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHNwZWNpZnlpbmcgdGhlIG5hbWVkIGluc3RhbmNlIGluZGV4IGZvciB0aGUgY3VycmVudCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBmYWNlIGluZGV4IChzdGFydGluZyB3aXRoIHZhbHVlfjE7IHZhbHVlfjAgbWFrZXMgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgRnJlZVR5cGUgaWdub3JlIG5hbWVkIGluc3RhbmNlcykuICBGb3Igbm9uLUdYIGZvbnRzLCAqLwotICAvKiAgICAgICAgICAgICAgICAgIGJpdHMgMTYtMzAgYXJlIGlnbm9yZWQuICBBc3N1bWluZyB0aGF0IHlvdSB3YW50IHRvICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBhY2Nlc3MgdGhlIHRoaXJkIG5hbWVkIGluc3RhbmNlIGluIGZhY2V+NCwgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgYGZhY2VfaW5kZXgnIHNob3VsZCBiZSBzZXQgdG8gMHgwMDAzMDAwNC4gIElmIHlvdSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHdhbnQgdG8gYWNjZXNzIGZhY2V+NCB3aXRob3V0IEdYIHZhcmlhdGlvbiBoYW5kbGluZywgKi8KLSAgLyogICAgICAgICAgICAgICAgICBzaW1wbHkgc2V0IGBmYWNlX2luZGV4JyB0byB2YWx1ZX40LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEZUX09wZW5fRmFjZSBhbmQgaXRzIHNpYmxpbmdzIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgKi8KLSAgLyogICAgICAgICAgICAgICAgICBjaGVjayB3aGV0aGVyIHRoZSBmb250IGZvcm1hdCBvZiBhIGdpdmVuIGZvbnQgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgaXMgc3VwcG9ydGVkIGJ5IEZyZWVUeXBlLiAgSW4gZ2VuZXJhbCwgaWYgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHRoZSBgZmFjZV9pbmRleCcgYXJndW1lbnQgaXMgbmVnYXRpdmUsIHRoZSAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBmdW5jdGlvbidzIHJldHVybiB2YWx1ZSBpc34wIGlmIHRoZSBmb250IGZvcm1hdCBpcyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgcmVjb2duaXplZCwgb3Igbm9uLXplcm8gb3RoZXJ3aXNlLiAgVGhlIGZ1bmN0aW9uICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGFsbG9jYXRlcyBhIG1vcmUgb3IgbGVzcyBlbXB0eSBmYWNlIGhhbmRsZSBpbiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBgKmFmYWNlJyAoaWYgYGFmYWNlJyBpc24ndCBOVUxMKTsgdGhlIG9ubHkgdHdvICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgdXNlZnVsIGZpZWxkcyBpbiB0aGlzIHNwZWNpYWwgY2FzZSBhcmUgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGBmYWNlLT5udW1fZmFjZXMnIGFuZCBgZmFjZS0+c3R5bGVfZmxhZ3MnLiAgRm9yIGFueSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBuZWdhdGl2ZSB2YWx1ZSBvZiBgZmFjZV9pbmRleCcsIGBmYWNlLT5udW1fZmFjZXMnICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZ2l2ZXMgdGhlIG51bWJlciBvZiBmYWNlcyB3aXRoaW4gdGhlIGZvbnQgZmlsZS4gIEZvciAqLwotICAvKiAgICAgICAgICAgICAgICAgIHRoZSBuZWdhdGl2ZSB2YWx1ZSBgLShOKzEpJyAod2l0aCBgTicgYSAxNi1iaXQgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB2YWx1ZSksIGJpdHMgMTYtMzAgaW4gYGZhY2UtPnN0eWxlX2ZsYWdzJyBnaXZlIHRoZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIG5hbWVkIGluc3RhbmNlcyBpbiBmYWNlIGBOJyBpZiB3ZSBoYXZlIGEgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEdYIHZhcmlhdGlvbiBmb250IChvciB6ZXJvIG90aGVyd2lzZSkuICBBZnRlciAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBleGFtaW5hdGlvbiwgdGhlIHJldHVybmVkIEBGVF9GYWNlIHN0cnVjdHVyZSBzaG91bGQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgYmUgZGVhbGxvY2F0ZWQgd2l0aCBhIGNhbGwgdG8gQEZUX0RvbmVfRmFjZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFmYWNlICAgICAgOjogQSBoYW5kbGUgdG8gYSBuZXcgZmFjZSBvYmplY3QuICBJZiBgZmFjZV9pbmRleCcgaXMgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB6ZXJvLCBpdCBtdXN0IGJlIG5vbi1OVUxMLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVbmxpa2UgRnJlZVR5cGUgMS54LCB0aGlzIGZ1bmN0aW9uIGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhIGdseXBoICAgKi8KLSAgLyogICAgc2xvdCBmb3IgdGhlIGZhY2Ugb2JqZWN0IHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IHRocm91Z2ggICAgICovCi0gIC8qICAgIGBmYWNlLT5nbHlwaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRWFjaCBuZXcgZmFjZSBvYmplY3QgY3JlYXRlZCB3aXRoIHRoaXMgZnVuY3Rpb24gYWxzbyBvd25zIGEgICAgICAgICovCi0gIC8qICAgIGRlZmF1bHQgQEZUX1NpemUgb2JqZWN0LCBhY2Nlc3NpYmxlIGFzIGBmYWNlLT5zaXplJy4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25lIEBGVF9MaWJyYXJ5IGluc3RhbmNlIGNhbiBoYXZlIG11bHRpcGxlIGZhY2Ugb2JqZWN0cywgdGhpcyBpcywgICovCi0gIC8qICAgIEBGVF9PcGVuX0ZhY2UgYW5kIGl0cyBzaWJsaW5ncyBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHVzaW5nICAqLwotICAvKiAgICB0aGUgc2FtZSBgbGlicmFyeScgYXJndW1lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZSB0aGUgZGlzY3Vzc2lvbiBvZiByZWZlcmVuY2UgY291bnRlcnMgaW4gdGhlIGRlc2NyaXB0aW9uIG9mICAgICAqLwotICAvKiAgICBARlRfUmVmZXJlbmNlX0ZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRvIGxvb3Agb3ZlciBhbGwgZmFjZXMsIHVzZSBjb2RlIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyBzbmlwcGV0ICAqLwotICAvKiAgICAob21pdHRpbmcgdGhlIGVycm9yIGhhbmRsaW5nKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGVF9GYWNlICBmYWNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRlRfTG9uZyAgaSwgbnVtX2ZhY2VzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgZXJyb3IgPSBGVF9PcGVuX0ZhY2UoIGxpYnJhcnksIGFyZ3MsIC0xLCAmZmFjZSApOyAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGlmICggZXJyb3IgKSB7IC4uLiB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgbnVtX2ZhY2VzID0gZmFjZS0+bnVtX2ZhY2VzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEZUX0RvbmVfRmFjZSggZmFjZSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgZm9yICggaSA9IDA7IGkgPCBudW1fZmFjZXM7IGkrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBlcnJvciA9IEZUX09wZW5fRmFjZSggbGlicmFyeSwgYXJncywgaSwgJmZhY2UgKTsgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIEZUX0RvbmVfRmFjZSggZmFjZSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUbyBsb29wIG92ZXIgYWxsIHZhbGlkIHZhbHVlcyBmb3IgYGZhY2VfaW5kZXgnLCB1c2Ugc29tZXRoaW5nICAgICAgKi8KLSAgLyogICAgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nIHNuaXBwZXQsIGFnYWluIHdpdGhvdXQgZXJyb3IgaGFuZGxpbmcuICAgICovCi0gIC8qICAgIFRoZSBjb2RlIGFjY2Vzc2VzIGFsbCBmYWNlcyBpbW1lZGlhdGVseSAodGh1cyBvbmx5IGEgc2luZ2xlIGNhbGwgICAqLwotICAvKiAgICBvZiBgRlRfT3Blbl9GYWNlJyB3aXRoaW4gdGhlIGRvLWxvb3ApLCB3aXRoIGFuZCB3aXRob3V0IG5hbWVkICAgICAgKi8KLSAgLyogICAgaW5zdGFuY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRlRfRmFjZSAgZmFjZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGVF9Mb25nICBudW1fZmFjZXMgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRlRfTG9uZyAgbnVtX2luc3RhbmNlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGVF9Mb25nICBmYWNlX2lkeCAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRlRfTG9uZyAgaW5zdGFuY2VfaWR4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIEZUX0xvbmcgIGlkID0gKCBpbnN0YW5jZV9pZHggPDwgMTYgKSArIGZhY2VfaWR4OyAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGVycm9yID0gRlRfT3Blbl9GYWNlKCBsaWJyYXJ5LCBhcmdzLCBpZCwgJmZhY2UgKTsgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBpZiAoIGVycm9yICkgeyAuLi4gfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIG51bV9mYWNlcyAgICAgPSBmYWNlLT5udW1fZmFjZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBudW1faW5zdGFuY2VzID0gZmFjZS0+c3R5bGVfZmxhZ3MgPj4gMTY7ICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgRlRfRG9uZV9GYWNlKCBmYWNlICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBpZiAoIGluc3RhbmNlX2lkeCA8IG51bV9pbnN0YW5jZXMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBpbnN0YW5jZV9pZHgrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBmYWNlX2lkeCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgaW5zdGFuY2VfaWR4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB9IHdoaWxlICggZmFjZV9pZHggPCBudW1fZmFjZXMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX09wZW5fRmFjZSggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICBjb25zdCBGVF9PcGVuX0FyZ3MqICBhcmdzLAotICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgICAgICAqYWZhY2UgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0F0dGFjaF9GaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gY2FsbHMgQEZUX0F0dGFjaF9TdHJlYW0gdG8gYXR0YWNoIGEgZmlsZS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgICA6OiBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZpbGVwYXRobmFtZSA6OiBUaGUgcGF0aG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0F0dGFjaF9GaWxlKCBGVF9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlcGF0aG5hbWUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0F0dGFjaF9TdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGBBdHRhY2gnIGRhdGEgdG8gYSBmYWNlIG9iamVjdC4gIE5vcm1hbGx5LCB0aGlzIGlzIHVzZWQgdG8gcmVhZCAgICAqLwotICAvKiAgICBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgZmFjZSBvYmplY3QuICBGb3IgZXhhbXBsZSwgeW91IGNhbiAgKi8KLSAgLyogICAgYXR0YWNoIGFuIEFGTSBmaWxlIHRoYXQgY29tZXMgd2l0aCBhIFR5cGV+MSBmb250IHRvIGdldCB0aGUgICAgICAgICovCi0gIC8qICAgIGtlcm5pbmcgdmFsdWVzIGFuZCBvdGhlciBtZXRyaWNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogVGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtZXRlcnMgOjogQSBwb2ludGVyIHRvIEBGVF9PcGVuX0FyZ3MgdGhhdCBtdXN0IGJlIGZpbGxlZCBieSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHRoZSBjYWxsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbWVhbmluZyBvZiB0aGUgYGF0dGFjaCcgKGkuZS4sIHdoYXQgcmVhbGx5IGhhcHBlbnMgd2hlbiB0aGUgICAgKi8KLSAgLyogICAgbmV3IGZpbGUgaXMgcmVhZCkgaXMgbm90IGZpeGVkIGJ5IEZyZWVUeXBlIGl0c2VsZi4gIEl0IHJlYWxseSAgICAgICovCi0gIC8qICAgIGRlcGVuZHMgb24gdGhlIGZvbnQgZm9ybWF0IChhbmQgdGh1cyB0aGUgZm9udCBkcml2ZXIpLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2xpZW50IGFwcGxpY2F0aW9ucyBhcmUgZXhwZWN0ZWQgdG8ga25vdyB3aGF0IHRoZXkgYXJlIGRvaW5nICAgICAgICovCi0gIC8qICAgIHdoZW4gaW52b2tpbmcgdGhpcyBmdW5jdGlvbi4gIE1vc3QgZHJpdmVycyBzaW1wbHkgZG8gbm90IGltcGxlbWVudCAqLwotICAvKiAgICBmaWxlIGF0dGFjaG1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9BdHRhY2hfU3RyZWFtKCBGVF9GYWNlICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9PcGVuX0FyZ3MqICBwYXJhbWV0ZXJzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZWZlcmVuY2VfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGNvdW50ZXIgZ2V0cyBpbml0aWFsaXplZCB0b34xIGF0IHRoZSB0aW1lIGFuIEBGVF9GYWNlIHN0cnVjdHVyZSAgKi8KLSAgLyogICAgaXMgY3JlYXRlZC4gIFRoaXMgZnVuY3Rpb24gaW5jcmVtZW50cyB0aGUgY291bnRlci4gIEBGVF9Eb25lX0ZhY2UgICovCi0gIC8qICAgIHRoZW4gb25seSBkZXN0cm95cyBhIGZhY2UgaWYgdGhlIGNvdW50ZXIgaXN+MSwgb3RoZXJ3aXNlIGl0IHNpbXBseSAqLwotICAvKiAgICBkZWNyZW1lbnRzIHRoZSBjb3VudGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaGVscHMgaW4gbWFuYWdpbmcgbGlmZS1jeWNsZXMgb2Ygc3RydWN0dXJlcyB0aGF0ICAgICAqLwotICAvKiAgICByZWZlcmVuY2UgQEZUX0ZhY2Ugb2JqZWN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjQuMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9SZWZlcmVuY2VfRmFjZSggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGlzY2FyZCBhIGdpdmVuIGZhY2Ugb2JqZWN0LCBhcyB3ZWxsIGFzIGFsbCBvZiBpdHMgY2hpbGQgc2xvdHMgYW5kICovCi0gIC8qICAgIHNpemVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gYSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZSB0aGUgZGlzY3Vzc2lvbiBvZiByZWZlcmVuY2UgY291bnRlcnMgaW4gdGhlIGRlc2NyaXB0aW9uIG9mICAgICAqLwotICAvKiAgICBARlRfUmVmZXJlbmNlX0ZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9Eb25lX0ZhY2UoIEZUX0ZhY2UgIGZhY2UgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NlbGVjdF9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlbGVjdCBhIGJpdG1hcCBzdHJpa2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgICA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmlrZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGJpdG1hcCBzdHJpa2UgaW4gdGhlICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgYGF2YWlsYWJsZV9zaXplcycgZmllbGQgb2YgQEZUX0ZhY2VSZWMgc3RydWN0dXJlLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TZWxlY3RfU2l6ZSggRlRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIEZUX0ludCAgIHN0cmlrZV9pbmRleCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9SZXF1ZXN0X1R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gZW51bWVyYXRpb24gdHlwZSB0aGF0IGxpc3RzIHRoZSBzdXBwb3J0ZWQgc2l6ZSByZXF1ZXN0IHR5cGVzLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfTk9NSU5BTCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIG5vbWluYWwgc2l6ZS4gIFRoZSBgdW5pdHNfcGVyX0VNJyBmaWVsZCBvZiBARlRfRmFjZVJlYyBpcyAgICAqLwotICAvKiAgICAgIHVzZWQgdG8gZGV0ZXJtaW5lIGJvdGggc2NhbGluZyB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NJWkVfUkVRVUVTVF9UWVBFX1JFQUxfRElNIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSByZWFsIGRpbWVuc2lvbi4gIFRoZSBzdW0gb2YgdGhlIHRoZSBgYXNjZW5kZXInIGFuZCAobWludXMgICAgKi8KLSAgLyogICAgICBvZikgdGhlIGBkZXNjZW5kZXInIGZpZWxkcyBvZiBARlRfRmFjZVJlYyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgICovCi0gIC8qICAgICAgYm90aCBzY2FsaW5nIHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfQkJPWCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGZvbnQgYm91bmRpbmcgYm94LiAgVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGBiYm94JyBmaWVsZCAqLwotICAvKiAgICAgIG9mIEBGVF9GYWNlUmVjIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgKi8KLSAgLyogICAgICBzY2FsaW5nIHZhbHVlLCByZXNwZWN0aXZlbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9DRUxMIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgYG1heF9hZHZhbmNlX3dpZHRoJyBmaWVsZCBvZiBARlRfRmFjZVJlYyBpcyB1c2VkIHRvICAgICAgICAgICovCi0gIC8qICAgICAgZGV0ZXJtaW5lIHRoZSBob3Jpem9udGFsIHNjYWxpbmcgdmFsdWU7IHRoZSB2ZXJ0aWNhbCBzY2FsaW5nICAgICAqLwotICAvKiAgICAgIHZhbHVlIGlzIGRldGVybWluZWQgdGhlIHNhbWUgd2F5IGFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBARlRfU0laRV9SRVFVRVNUX1RZUEVfUkVBTF9ESU0gZG9lcy4gIEZpbmFsbHksIGJvdGggc2NhbGluZyAgICAgICovCi0gIC8qICAgICAgdmFsdWVzIGFyZSBzZXQgdG8gdGhlIHNtYWxsZXIgb25lLiAgVGhpcyB0eXBlIGlzIHVzZWZ1bCBpZiB5b3UgICAqLwotICAvKiAgICAgIHdhbnQgdG8gc3BlY2lmeSB0aGUgZm9udCBzaXplIGZvciwgc2F5LCBhIHdpbmRvdyBvZiBhIGdpdmVuICAgICAgKi8KLSAgLyogICAgICBkaW1lbnNpb24gYW5kIDgweDI0IGNlbGxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9TQ0FMRVMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTcGVjaWZ5IHRoZSBzY2FsaW5nIHZhbHVlcyBkaXJlY3RseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGFib3ZlIGRlc2NyaXB0aW9ucyBvbmx5IGFwcGx5IHRvIHNjYWxhYmxlIGZvcm1hdHMuICBGb3IgYml0bWFwICovCi0gIC8qICAgIGZvcm1hdHMsIHRoZSBiZWhhdmlvdXIgaXMgdXAgdG8gdGhlIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlIHRoZSBub3RlIHNlY3Rpb24gb2YgQEZUX1NpemVfTWV0cmljcyBpZiB5b3Ugd29uZGVyIGhvdyBzaXplICAgICovCi0gIC8qICAgIHJlcXVlc3RpbmcgcmVsYXRlcyB0byBzY2FsaW5nIHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9TaXplX1JlcXVlc3RfVHlwZV8KLSAgewotICAgIEZUX1NJWkVfUkVRVUVTVF9UWVBFX05PTUlOQUwsCi0gICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfUkVBTF9ESU0sCi0gICAgRlRfU0laRV9SRVFVRVNUX1RZUEVfQkJPWCwKLSAgICBGVF9TSVpFX1JFUVVFU1RfVFlQRV9DRUxMLAotICAgIEZUX1NJWkVfUkVRVUVTVF9UWVBFX1NDQUxFUywKLQotICAgIEZUX1NJWkVfUkVRVUVTVF9UWVBFX01BWAotCi0gIH0gRlRfU2l6ZV9SZXF1ZXN0X1R5cGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TaXplX1JlcXVlc3RSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgc2l6ZSByZXF1ZXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0eXBlICAgICAgICAgICA6OiBTZWUgQEZUX1NpemVfUmVxdWVzdF9UeXBlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHdpZHRoICAgICAgICAgIDo6IFRoZSBkZXNpcmVkIHdpZHRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVpZ2h0ICAgICAgICAgOjogVGhlIGRlc2lyZWQgaGVpZ2h0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBob3JpUmVzb2x1dGlvbiA6OiBUaGUgaG9yaXpvbnRhbCByZXNvbHV0aW9uLiAgSWYgc2V0IHRvIHplcm8sICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgYHdpZHRoJyBpcyB0cmVhdGVkIGFzIGEgMjYuNiBmcmFjdGlvbmFsIHBpeGVsICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydFJlc29sdXRpb24gOjogVGhlIHZlcnRpY2FsIHJlc29sdXRpb24uICBJZiBzZXQgdG8gemVybywgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIGBoZWlnaHQnIGlzIHRyZWF0ZWQgYXMgYSAyNi42IGZyYWN0aW9uYWwgcGl4ZWwgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgd2lkdGgnIGlzIHplcm8sIHRoZW4gdGhlIGhvcml6b250YWwgc2NhbGluZyB2YWx1ZSBpcyBzZXQgZXF1YWwgKi8KLSAgLyogICAgdG8gdGhlIHZlcnRpY2FsIHNjYWxpbmcgdmFsdWUsIGFuZCB2aWNlIHZlcnNhLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfU2l6ZV9SZXF1ZXN0UmVjXwotICB7Ci0gICAgRlRfU2l6ZV9SZXF1ZXN0X1R5cGUgIHR5cGU7Ci0gICAgRlRfTG9uZyAgICAgICAgICAgICAgIHdpZHRoOwotICAgIEZUX0xvbmcgICAgICAgICAgICAgICBoZWlnaHQ7Ci0gICAgRlRfVUludCAgICAgICAgICAgICAgIGhvcmlSZXNvbHV0aW9uOwotICAgIEZUX1VJbnQgICAgICAgICAgICAgICB2ZXJ0UmVzb2x1dGlvbjsKLQotICB9IEZUX1NpemVfUmVxdWVzdFJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NpemVfUmVxdWVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgc2l6ZSByZXF1ZXN0IHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfU2l6ZV9SZXF1ZXN0UmVjXyAgKkZUX1NpemVfUmVxdWVzdDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlcXVlc3RfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlc2l6ZSB0aGUgc2NhbGUgb2YgdGhlIGFjdGl2ZSBARlRfU2l6ZSBvYmplY3QgaW4gYSBmYWNlLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gYSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlcSAgOjogQSBwb2ludGVyIHRvIGEgQEZUX1NpemVfUmVxdWVzdFJlYy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFsdGhvdWdoIGRyaXZlcnMgbWF5IHNlbGVjdCB0aGUgYml0bWFwIHN0cmlrZSBtYXRjaGluZyB0aGUgICAgICAgICAqLwotICAvKiAgICByZXF1ZXN0LCB5b3Ugc2hvdWxkIG5vdCByZWx5IG9uIHRoaXMgaWYgeW91IGludGVuZCB0byBzZWxlY3QgYSAgICAgKi8KLSAgLyogICAgcGFydGljdWxhciBiaXRtYXAgc3RyaWtlLiAgVXNlIEBGVF9TZWxlY3RfU2l6ZSBpbnN0ZWFkIGluIHRoYXQgICAgICovCi0gIC8qICAgIGNhc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlbGF0aW9uIGJldHdlZW4gdGhlIHJlcXVlc3RlZCBzaXplIGFuZCB0aGUgcmVzdWx0aW5nIGdseXBoICAgICovCi0gIC8qICAgIHNpemUgaXMgZGVwZW5kZW50IGVudGlyZWx5IG9uIGhvdyB0aGUgc2l6ZSBpcyBkZWZpbmVkIGluIHRoZSAgICAgICAqLwotICAvKiAgICBzb3VyY2UgZmFjZS4gIFRoZSBmb250IGRlc2lnbmVyIGNob29zZXMgdGhlIGZpbmFsIHNpemUgb2YgZWFjaCAgICAgKi8KLSAgLyogICAgZ2x5cGggcmVsYXRpdmUgdG8gdGhpcyBzaXplLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gcmVmZXIgdG8gICAgICAgICovCi0gIC8qICAgIGBodHRwOi8vd3d3LmZyZWV0eXBlLm9yZy9mcmVldHlwZTIvZG9jcy9nbHlwaHMvZ2x5cGhzLTIuaHRtbCcgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRG9uJ3QgdXNlIHRoaXMgZnVuY3Rpb24gaWYgeW91IGFyZSB1c2luZyB0aGUgRnJlZVR5cGUgY2FjaGUgQVBJLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfUmVxdWVzdF9TaXplKCBGVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9DaGFyX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gY2FsbHMgQEZUX1JlcXVlc3RfU2l6ZSB0byByZXF1ZXN0IHRoZSBub21pbmFsIHNpemUgICAqLwotICAvKiAgICAoaW4gcG9pbnRzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICAgICAgOjogQSBoYW5kbGUgdG8gYSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyX3dpZHRoICAgICAgOjogVGhlIG5vbWluYWwgd2lkdGgsIGluIDI2LjYgZnJhY3Rpb25hbCBwb2ludHMuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJfaGVpZ2h0ICAgICA6OiBUaGUgbm9taW5hbCBoZWlnaHQsIGluIDI2LjYgZnJhY3Rpb25hbCBwb2ludHMuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9yel9yZXNvbHV0aW9uIDo6IFRoZSBob3Jpem9udGFsIHJlc29sdXRpb24gaW4gZHBpLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0X3Jlc29sdXRpb24gOjogVGhlIHZlcnRpY2FsIHJlc29sdXRpb24gaW4gZHBpLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBlaXRoZXIgdGhlIGNoYXJhY3RlciB3aWR0aCBvciBoZWlnaHQgaXMgemVybywgaXQgaXMgc2V0IGVxdWFsICAgKi8KLSAgLyogICAgdG8gdGhlIG90aGVyIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBlaXRoZXIgdGhlIGhvcml6b250YWwgb3IgdmVydGljYWwgcmVzb2x1dGlvbiBpcyB6ZXJvLCBpdCBpcyBzZXQgKi8KLSAgLyogICAgZXF1YWwgdG8gdGhlIG90aGVyIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGNoYXJhY3RlciB3aWR0aCBvciBoZWlnaHQgc21hbGxlciB0aGFuIDFwdCBpcyBzZXQgdG8gMXB0OyBpZiAgICAgKi8KLSAgLyogICAgYm90aCByZXNvbHV0aW9uIHZhbHVlcyBhcmUgemVybywgdGhleSBhcmUgc2V0IHRvIDcyZHBpLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEb24ndCB1c2UgdGhpcyBmdW5jdGlvbiBpZiB5b3UgYXJlIHVzaW5nIHRoZSBGcmVlVHlwZSBjYWNoZSBBUEkuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TZXRfQ2hhcl9TaXplKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICBjaGFyX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICBjaGFyX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgaG9yel9yZXNvbHV0aW9uLAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICB2ZXJ0X3Jlc29sdXRpb24gKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9QaXhlbF9TaXplcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gY2FsbHMgQEZUX1JlcXVlc3RfU2l6ZSB0byByZXF1ZXN0IHRoZSBub21pbmFsIHNpemUgICAqLwotICAvKiAgICAoaW4gcGl4ZWxzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwaXhlbF93aWR0aCAgOjogVGhlIG5vbWluYWwgd2lkdGgsIGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBpeGVsX2hlaWdodCA6OiBUaGUgbm9taW5hbCBoZWlnaHQsIGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFlvdSBzaG91bGQgbm90IHJlbHkgb24gdGhlIHJlc3VsdGluZyBnbHlwaHMgbWF0Y2hpbmcsIG9yIGJlaW5nICAgICAqLwotICAvKiAgICBjb25zdHJhaW5lZCwgdG8gdGhpcyBwaXhlbCBzaXplLiAgUmVmZXIgdG8gQEZUX1JlcXVlc3RfU2l6ZSB0byAgICAgKi8KLSAgLyogICAgdW5kZXJzdGFuZCBob3cgcmVxdWVzdGVkIHNpemVzIHJlbGF0ZSB0byBhY3R1YWwgc2l6ZXMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEb24ndCB1c2UgdGhpcyBmdW5jdGlvbiBpZiB5b3UgYXJlIHVzaW5nIHRoZSBGcmVlVHlwZSBjYWNoZSBBUEkuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TZXRfUGl4ZWxfU2l6ZXMoIEZUX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgcGl4ZWxfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgcGl4ZWxfaGVpZ2h0ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Mb2FkX0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gbG9hZCBhIHNpbmdsZSBnbHlwaCBpbnRvIHRoZSBnbHlwaCBzbG90IG9mIGEgICAgKi8KLSAgLyogICAgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdCB3aGVyZSB0aGUgZ2x5cGggICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGlzIGxvYWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgZ2x5cGggaW4gdGhlIGZvbnQgZmlsZS4gIEZvciAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBDSUQta2V5ZWQgZm9udHMgKGVpdGhlciBpbiBQUyBvciBpbiBDRkYgZm9ybWF0KSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgdGhpcyBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIENJRCB2YWx1ZS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkX2ZsYWdzICA6OiBBIGZsYWcgaW5kaWNhdGluZyB3aGF0IHRvIGxvYWQgZm9yIHRoaXMgZ2x5cGguICBUaGUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgQEZUX0xPQURfWFhYIGNvbnN0YW50cyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGdseXBoIGxvYWRpbmcgcHJvY2VzcyAoZS5nLiwgd2hldGhlciB0aGUgb3V0bGluZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2NhbGVkLCB3aGV0aGVyIHRvIGxvYWQgYml0bWFwcyBvciBub3QsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgd2hldGhlciB0byBoaW50IHRoZSBvdXRsaW5lLCBldGMpLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGxvYWRlZCBnbHlwaCBtYXkgYmUgdHJhbnNmb3JtZWQuICBTZWUgQEZUX1NldF9UcmFuc2Zvcm0gZm9yICAgICovCi0gIC8qICAgIHRoZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRm9yIHN1YnNldHRlZCBDSUQta2V5ZWQgZm9udHMsIGBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudCcgaXMgICAgICAgICovCi0gIC8qICAgIHJldHVybmVkIGZvciBpbnZhbGlkIENJRCB2YWx1ZXMgKHRoaXMgaXMsIGZvciBDSUQgdmFsdWVzIHRoYXQgICAgICAqLwotICAvKiAgICBkb24ndCBoYXZlIGEgY29ycmVzcG9uZGluZyBnbHlwaCBpbiB0aGUgZm9udCkuICBTZWUgdGhlIGRpc2N1c3Npb24gKi8KLSAgLyogICAgb2YgdGhlIEBGVF9GQUNFX0ZMQUdfQ0lEX0tFWUVEIGZsYWcgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfTG9hZF9HbHlwaCggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgIEZUX1VJbnQgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgRlRfSW50MzIgIGxvYWRfZmxhZ3MgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xvYWRfQ2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBsb2FkIGEgc2luZ2xlIGdseXBoIGludG8gdGhlIGdseXBoIHNsb3Qgb2YgYSAgICAqLwotICAvKiAgICBmYWNlIG9iamVjdCwgYWNjb3JkaW5nIHRvIGl0cyBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBmYWNlIG9iamVjdCB3aGVyZSB0aGUgZ2x5cGggICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgaXMgbG9hZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcl9jb2RlICAgOjogVGhlIGdseXBoJ3MgY2hhcmFjdGVyIGNvZGUsIGFjY29yZGluZyB0byB0aGUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgY2hhcm1hcCB1c2VkIGluIHRoZSBmYWNlLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9mbGFncyAgOjogQSBmbGFnIGluZGljYXRpbmcgd2hhdCB0byBsb2FkIGZvciB0aGlzIGdseXBoLiAgVGhlICovCi0gIC8qICAgICAgICAgICAgICAgICAgIEBGVF9MT0FEX1hYWCBjb25zdGFudHMgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBnbHlwaCBsb2FkaW5nIHByb2Nlc3MgKGUuZy4sIHdoZXRoZXIgdGhlIG91dGxpbmUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIHNjYWxlZCwgd2hldGhlciB0byBsb2FkIGJpdG1hcHMgb3Igbm90LCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdG8gaGludCB0aGUgb3V0bGluZSwgZXRjKS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gc2ltcGx5IGNhbGxzIEBGVF9HZXRfQ2hhcl9JbmRleCBhbmQgQEZUX0xvYWRfR2x5cGguICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0xvYWRfQ2hhciggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgRlRfVUxvbmcgIGNoYXJfY29kZSwKLSAgICAgICAgICAgICAgICBGVF9JbnQzMiAgbG9hZF9mbGFncyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgRlRfTE9BRF9YWFgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbGlzdCBvZiBiaXQgZmllbGQgY29uc3RhbnRzIHVzZWQgd2l0aCBARlRfTG9hZF9HbHlwaCB0byBpbmRpY2F0ZQotICAgKiAgIHdoYXQga2luZCBvZiBvcGVyYXRpb25zIHRvIHBlcmZvcm0gZHVyaW5nIGdseXBoIGxvYWRpbmcuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgRlRfTE9BRF9ERUZBVUxUIDo6Ci0gICAqICAgICBDb3JyZXNwb25kaW5nIHRvfjAsIHRoaXMgdmFsdWUgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCBnbHlwaCBsb2FkCi0gICAqICAgICBvcGVyYXRpb24uICBJbiB0aGlzIGNhc2UsIHRoZSBmb2xsb3dpbmcgaGFwcGVuczoKLSAgICoKLSAgICogICAgIDEuIEZyZWVUeXBlIGxvb2tzIGZvciBhIGJpdG1hcCBmb3IgdGhlIGdseXBoIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICAqICAgICAgICBmYWNlJ3MgY3VycmVudCBzaXplLiAgSWYgb25lIGlzIGZvdW5kLCB0aGUgZnVuY3Rpb24gcmV0dXJucy4KLSAgICogICAgICAgIFRoZSBiaXRtYXAgZGF0YSBjYW4gYmUgYWNjZXNzZWQgZnJvbSB0aGUgZ2x5cGggc2xvdCAoc2VlIG5vdGUKLSAgICogICAgICAgIGJlbG93KS4KLSAgICoKLSAgICogICAgIDIuIElmIG5vIGVtYmVkZGVkIGJpdG1hcCBpcyBzZWFyY2hlZCBvciBmb3VuZCwgRnJlZVR5cGUgbG9va3MgZm9yIGEKLSAgICogICAgICAgIHNjYWxhYmxlIG91dGxpbmUuICBJZiBvbmUgaXMgZm91bmQsIGl0IGlzIGxvYWRlZCBmcm9tIHRoZSBmb250Ci0gICAqICAgICAgICBmaWxlLCBzY2FsZWQgdG8gZGV2aWNlIHBpeGVscywgdGhlbiBgaGludGVkJyB0byB0aGUgcGl4ZWwgZ3JpZAotICAgKiAgICAgICAgaW4gb3JkZXIgdG8gb3B0aW1pemUgaXQuICBUaGUgb3V0bGluZSBkYXRhIGNhbiBiZSBhY2Nlc3NlZCBmcm9tCi0gICAqICAgICAgICB0aGUgZ2x5cGggc2xvdCAoc2VlIG5vdGUgYmVsb3cpLgotICAgKgotICAgKiAgICAgTm90ZSB0aGF0IGJ5IGRlZmF1bHQsIHRoZSBnbHlwaCBsb2FkZXIgZG9lc24ndCByZW5kZXIgb3V0bGluZXMgaW50bwotICAgKiAgICAgYml0bWFwcy4gIFRoZSBmb2xsb3dpbmcgZmxhZ3MgYXJlIHVzZWQgdG8gbW9kaWZ5IHRoaXMgZGVmYXVsdAotICAgKiAgICAgYmVoYXZpb3VyIHRvIG1vcmUgc3BlY2lmaWMgYW5kIHVzZWZ1bCBjYXNlcy4KLSAgICoKLSAgICogICBGVF9MT0FEX05PX1NDQUxFIDo6Ci0gICAqICAgICBEb24ndCBzY2FsZSB0aGUgbG9hZGVkIG91dGxpbmUgZ2x5cGggYnV0IGtlZXAgaXQgaW4gZm9udCB1bml0cy4KLSAgICoKLSAgICogICAgIFRoaXMgZmxhZyBpbXBsaWVzIEBGVF9MT0FEX05PX0hJTlRJTkcgYW5kIEBGVF9MT0FEX05PX0JJVE1BUCwgYW5kCi0gICAqICAgICB1bnNldHMgQEZUX0xPQURfUkVOREVSLgotICAgKgotICAgKiAgICAgSWYgdGhlIGZvbnQgaXMgYHRyaWNreScgKHNlZSBARlRfRkFDRV9GTEFHX1RSSUNLWSBmb3IgbW9yZSksIHVzaW5nCi0gICAqICAgICBGVF9MT0FEX05PX1NDQUxFIHVzdWFsbHkgeWllbGRzIG1lYW5pbmdsZXNzIG91dGxpbmVzIGJlY2F1c2UgdGhlCi0gICAqICAgICBzdWJnbHlwaHMgbXVzdCBiZSBzY2FsZWQgYW5kIHBvc2l0aW9uZWQgd2l0aCBoaW50aW5nIGluc3RydWN0aW9ucy4KLSAgICogICAgIFRoaXMgY2FuIGJlIHNvbHZlZCBieSBsb2FkaW5nIHRoZSBmb250IHdpdGhvdXQgRlRfTE9BRF9OT19TQ0FMRSBhbmQKLSAgICogICAgIHNldHRpbmcgdGhlIGNoYXJhY3RlciBzaXplIHRvIGBmb250LT51bml0c19wZXJfRU0nLgotICAgKgotICAgKiAgIEZUX0xPQURfTk9fSElOVElORyA6OgotICAgKiAgICAgRGlzYWJsZSBoaW50aW5nLiAgVGhpcyBnZW5lcmFsbHkgZ2VuZXJhdGVzIGBibHVycmllcicgYml0bWFwIGdseXBocwotICAgKiAgICAgd2hlbiB0aGUgZ2x5cGggYXJlIHJlbmRlcmVkIGluIGFueSBvZiB0aGUgYW50aS1hbGlhc2VkIG1vZGVzLiAgU2VlCi0gICAqICAgICBhbHNvIHRoZSBub3RlIGJlbG93LgotICAgKgotICAgKiAgICAgVGhpcyBmbGFnIGlzIGltcGxpZWQgYnkgQEZUX0xPQURfTk9fU0NBTEUuCi0gICAqCi0gICAqICAgRlRfTE9BRF9SRU5ERVIgOjoKLSAgICogICAgIENhbGwgQEZUX1JlbmRlcl9HbHlwaCBhZnRlciB0aGUgZ2x5cGggaXMgbG9hZGVkLiAgQnkgZGVmYXVsdCwgdGhlCi0gICAqICAgICBnbHlwaCBpcyByZW5kZXJlZCBpbiBARlRfUkVOREVSX01PREVfTk9STUFMIG1vZGUuICBUaGlzIGNhbiBiZQotICAgKiAgICAgb3ZlcnJpZGRlbiBieSBARlRfTE9BRF9UQVJHRVRfWFhYIG9yIEBGVF9MT0FEX01PTk9DSFJPTUUuCi0gICAqCi0gICAqICAgICBUaGlzIGZsYWcgaXMgdW5zZXQgYnkgQEZUX0xPQURfTk9fU0NBTEUuCi0gICAqCi0gICAqICAgRlRfTE9BRF9OT19CSVRNQVAgOjoKLSAgICogICAgIElnbm9yZSBiaXRtYXAgc3RyaWtlcyB3aGVuIGxvYWRpbmcuICBCaXRtYXAtb25seSBmb250cyBpZ25vcmUgdGhpcwotICAgKiAgICAgZmxhZy4KLSAgICoKLSAgICogICAgIEBGVF9MT0FEX05PX1NDQUxFIGFsd2F5cyBzZXRzIHRoaXMgZmxhZy4KLSAgICoKLSAgICogICBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCA6OgotICAgKiAgICAgTG9hZCB0aGUgZ2x5cGggZm9yIHZlcnRpY2FsIHRleHQgbGF5b3V0LiAgSW4gcGFydGljdWxhciwgdGhlCi0gICAqICAgICBgYWR2YW5jZScgdmFsdWUgaW4gdGhlIEBGVF9HbHlwaFNsb3RSZWMgc3RydWN0dXJlIGlzIHNldCB0byB0aGUKLSAgICogICAgIGB2ZXJ0QWR2YW5jZScgdmFsdWUgb2YgdGhlIGBtZXRyaWNzJyBmaWVsZC4KLSAgICoKLSAgICogICAgIEluIGNhc2UgQEZUX0hBU19WRVJUSUNBTCBkb2Vzbid0IHJldHVybiB0cnVlLCB5b3Ugc2hvdWxkbid0IHVzZQotICAgKiAgICAgdGhpcyBmbGFnIGN1cnJlbnRseS4gIFJlYXNvbiBpcyB0aGF0IGluIHRoaXMgY2FzZSB2ZXJ0aWNhbCBtZXRyaWNzCi0gICAqICAgICBnZXQgc3ludGhlc2l6ZWQsIGFuZCB0aG9zZSB2YWx1ZXMgYXJlIG5vdCBhbHdheXMgY29uc2lzdGVudCBhY3Jvc3MKLSAgICogICAgIHZhcmlvdXMgZm9udCBmb3JtYXRzLgotICAgKgotICAgKiAgIEZUX0xPQURfRk9SQ0VfQVVUT0hJTlQgOjoKLSAgICogICAgIEluZGljYXRlcyB0aGF0IHRoZSBhdXRvLWhpbnRlciBpcyBwcmVmZXJyZWQgb3ZlciB0aGUgZm9udCdzIG5hdGl2ZQotICAgKiAgICAgaGludGVyLiAgU2VlIGFsc28gdGhlIG5vdGUgYmVsb3cuCi0gICAqCi0gICAqICAgRlRfTE9BRF9QRURBTlRJQyA6OgotICAgKiAgICAgSW5kaWNhdGVzIHRoYXQgdGhlIGZvbnQgZHJpdmVyIHNob3VsZCBwZXJmb3JtIHBlZGFudGljIHZlcmlmaWNhdGlvbnMKLSAgICogICAgIGR1cmluZyBnbHlwaCBsb2FkaW5nLiAgVGhpcyBpcyBtb3N0bHkgdXNlZCB0byBkZXRlY3QgYnJva2VuIGdseXBocwotICAgKiAgICAgaW4gZm9udHMuICBCeSBkZWZhdWx0LCBGcmVlVHlwZSB0cmllcyB0byBoYW5kbGUgYnJva2VuIGZvbnRzIGFsc28uCi0gICAqCi0gICAqICAgICBJbiBwYXJ0aWN1bGFyLCBlcnJvcnMgZnJvbSB0aGUgVHJ1ZVR5cGUgYnl0ZWNvZGUgZW5naW5lIGFyZSBub3QKLSAgICogICAgIHBhc3NlZCB0byB0aGUgYXBwbGljYXRpb24gaWYgdGhpcyBmbGFnIGlzIG5vdCBzZXQ7IHRoaXMgbWlnaHQKLSAgICogICAgIHJlc3VsdCBpbiBwYXJ0aWFsbHkgaGludGVkIG9yIGRpc3RvcnRlZCBnbHlwaHMgaW4gY2FzZSBhIGdseXBoJ3MKLSAgICogICAgIGJ5dGVjb2RlIGlzIGJ1Z2d5LgotICAgKgotICAgKiAgIEZUX0xPQURfTk9fUkVDVVJTRSA6OgotICAgKiAgICAgSW5kaWNhdGUgdGhhdCB0aGUgZm9udCBkcml2ZXIgc2hvdWxkIG5vdCBsb2FkIGNvbXBvc2l0ZSBnbHlwaHMKLSAgICogICAgIHJlY3Vyc2l2ZWx5LiAgSW5zdGVhZCwgaXQgc2hvdWxkIHNldCB0aGUgYG51bV9zdWJnbHlwaCcgYW5kCi0gICAqICAgICBgc3ViZ2x5cGhzJyB2YWx1ZXMgb2YgdGhlIGdseXBoIHNsb3QgYWNjb3JkaW5nbHksIGFuZCBzZXQKLSAgICogICAgIGBnbHlwaC0+Zm9ybWF0JyB0byBARlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURS4gIFRoZSBkZXNjcmlwdGlvbiBvZgotICAgKiAgICAgc3ViZ2x5cGhzIGNhbiB0aGVuIGJlIGFjY2Vzc2VkIHdpdGggQEZUX0dldF9TdWJHbHlwaF9JbmZvLgotICAgKgotICAgKiAgICAgVGhpcyBmbGFnIGltcGxpZXMgQEZUX0xPQURfTk9fU0NBTEUgYW5kIEBGVF9MT0FEX0lHTk9SRV9UUkFOU0ZPUk0uCi0gICAqCi0gICAqICAgRlRfTE9BRF9JR05PUkVfVFJBTlNGT1JNIDo6Ci0gICAqICAgICBJbmRpY2F0ZXMgdGhhdCB0aGUgdHJhbnNmb3JtIG1hdHJpeCBzZXQgYnkgQEZUX1NldF9UcmFuc2Zvcm0gc2hvdWxkCi0gICAqICAgICBiZSBpZ25vcmVkLgotICAgKgotICAgKiAgIEZUX0xPQURfTU9OT0NIUk9NRSA6OgotICAgKiAgICAgVGhpcyBmbGFnIGlzIHVzZWQgd2l0aCBARlRfTE9BRF9SRU5ERVIgdG8gaW5kaWNhdGUgdGhhdCB5b3Ugd2FudCB0bwotICAgKiAgICAgcmVuZGVyIGFuIG91dGxpbmUgZ2x5cGggdG8gYSAxLWJpdCBtb25vY2hyb21lIGJpdG1hcCBnbHlwaCwgd2l0aAotICAgKiAgICAgOH5waXhlbHMgcGFja2VkIGludG8gZWFjaCBieXRlIG9mIHRoZSBiaXRtYXAgZGF0YS4KLSAgICoKLSAgICogICAgIE5vdGUgdGhhdCB0aGlzIGhhcyBubyBlZmZlY3Qgb24gdGhlIGhpbnRpbmcgYWxnb3JpdGhtIHVzZWQuICBZb3UKLSAgICogICAgIHNob3VsZCByYXRoZXIgdXNlIEBGVF9MT0FEX1RBUkdFVF9NT05PIHNvIHRoYXQgdGhlCi0gICAqICAgICBtb25vY2hyb21lLW9wdGltaXplZCBoaW50aW5nIGFsZ29yaXRobSBpcyB1c2VkLgotICAgKgotICAgKiAgIEZUX0xPQURfTElORUFSX0RFU0lHTiA6OgotICAgKiAgICAgSW5kaWNhdGVzIHRoYXQgdGhlIGBsaW5lYXJIb3JpQWR2YW5jZScgYW5kIGBsaW5lYXJWZXJ0QWR2YW5jZScKLSAgICogICAgIGZpZWxkcyBvZiBARlRfR2x5cGhTbG90UmVjIHNob3VsZCBiZSBrZXB0IGluIGZvbnQgdW5pdHMuICBTZWUKLSAgICogICAgIEBGVF9HbHlwaFNsb3RSZWMgZm9yIGRldGFpbHMuCi0gICAqCi0gICAqICAgRlRfTE9BRF9OT19BVVRPSElOVCA6OgotICAgKiAgICAgRGlzYWJsZSBhdXRvLWhpbnRlci4gIFNlZSBhbHNvIHRoZSBub3RlIGJlbG93LgotICAgKgotICAgKiAgIEZUX0xPQURfQ09MT1IgOjoKLSAgICogICAgIFRoaXMgZmxhZyBpcyB1c2VkIHRvIHJlcXVlc3QgbG9hZGluZyBvZiBjb2xvciBlbWJlZGRlZC1iaXRtYXAKLSAgICogICAgIGltYWdlcy4gIFRoZSByZXN1bHRpbmcgY29sb3IgYml0bWFwcywgaWYgYXZhaWxhYmxlLCB3aWxsIGhhdmUgdGhlCi0gICAqICAgICBARlRfUElYRUxfTU9ERV9CR1JBIGZvcm1hdC4gIFdoZW4gdGhlIGZsYWcgaXMgbm90IHVzZWQgYW5kIGNvbG9yCi0gICAqICAgICBiaXRtYXBzIGFyZSBmb3VuZCwgdGhleSB3aWxsIGJlIGNvbnZlcnRlZCB0byAyNTYtbGV2ZWwgZ3JheQotICAgKiAgICAgYml0bWFwcyB0cmFuc3BhcmVudGx5LiAgVGhvc2UgYml0bWFwcyB3aWxsIGJlIGluIHRoZQotICAgKiAgICAgQEZUX1BJWEVMX01PREVfR1JBWSBmb3JtYXQuCi0gICAqCi0gICAqICAgRlRfTE9BRF9DT01QVVRFX01FVFJJQ1MgOjoKLSAgICogICAgIFRoaXMgZmxhZyBzZXRzIGNvbXB1dGluZyBnbHlwaCBtZXRyaWNzIHdpdGhvdXQgdGhlIHVzZSBvZiBidW5kbGVkCi0gICAqICAgICBtZXRyaWNzIHRhYmxlcyAoZm9yIGV4YW1wbGUsIHRoZSBgaGRteCcgdGFibGUgaW4gVHJ1ZVR5cGUgZm9udHMpLgotICAgKiAgICAgV2VsbC1iZWhhdmluZyBmb250cyBoYXZlIG9wdGltaXplZCBidW5kbGVkIG1ldHJpY3MgYW5kIHRoZXNlIHNob3VsZAotICAgKiAgICAgYmUgdXNlZC4gIFRoaXMgZmxhZyBpcyBtYWlubHkgdXNlZCBieSBmb250IHZhbGlkYXRpbmcgb3IgZm9udAotICAgKiAgICAgZWRpdGluZyBhcHBsaWNhdGlvbnMsIHdoaWNoIG5lZWQgdG8gaWdub3JlLCB2ZXJpZnksIG9yIGVkaXQgdGhvc2UKLSAgICogICAgIHRhYmxlcy4KLSAgICoKLSAgICogICAgIEN1cnJlbnRseSwgdGhpcyBmbGFnIGlzIG9ubHkgaW1wbGVtZW50ZWQgZm9yIFRydWVUeXBlIGZvbnRzLgotICAgKgotICAgKiAgIEZUX0xPQURfQ1JPUF9CSVRNQVAgOjoKLSAgICogICAgIElnbm9yZWQuICBEZXByZWNhdGVkLgotICAgKgotICAgKiAgIEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIIDo6Ci0gICAqICAgICBJZ25vcmVkLiAgRGVwcmVjYXRlZC4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgQnkgZGVmYXVsdCwgaGludGluZyBpcyBlbmFibGVkIGFuZCB0aGUgZm9udCdzIG5hdGl2ZSBoaW50ZXIgKHNlZQotICAgKiAgIEBGVF9GQUNFX0ZMQUdfSElOVEVSKSBpcyBwcmVmZXJyZWQgb3ZlciB0aGUgYXV0by1oaW50ZXIuICBZb3UgY2FuCi0gICAqICAgZGlzYWJsZSBoaW50aW5nIGJ5IHNldHRpbmcgQEZUX0xPQURfTk9fSElOVElORyBvciBjaGFuZ2UgdGhlCi0gICAqICAgcHJlY2VkZW5jZSBieSBzZXR0aW5nIEBGVF9MT0FEX0ZPUkNFX0FVVE9ISU5ULiAgWW91IGNhbiBhbHNvIHNldAotICAgKiAgIEBGVF9MT0FEX05PX0FVVE9ISU5UIGluIGNhc2UgeW91IGRvbid0IHdhbnQgdGhlIGF1dG8taGludGVyIHRvIGJlCi0gICAqICAgdXNlZCBhdCBhbGwuCi0gICAqCi0gICAqICAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBARlRfRkFDRV9GTEFHX1RSSUNLWSBmb3IgYSBzcGVjaWFsIGV4Y2VwdGlvbgotICAgKiAgIChhZmZlY3Rpbmcgb25seSBhIGhhbmRmdWwgb2YgQXNpYW4gZm9udHMpLgotICAgKgotICAgKiAgIEJlc2lkZXMgZGVjaWRpbmcgd2hpY2ggaGludGVyIHRvIHVzZSwgeW91IGNhbiBhbHNvIGRlY2lkZSB3aGljaAotICAgKiAgIGhpbnRpbmcgYWxnb3JpdGhtIHRvIHVzZS4gIFNlZSBARlRfTE9BRF9UQVJHRVRfWFhYIGZvciBkZXRhaWxzLgotICAgKgotICAgKiAgIE5vdGUgdGhhdCB0aGUgYXV0by1oaW50ZXIgbmVlZHMgYSB2YWxpZCBVbmljb2RlIGNtYXAgKGVpdGhlciBhIG5hdGl2ZQotICAgKiAgIG9uZSBvciBzeW50aGVzaXplZCBieSBGcmVlVHlwZSkgZm9yIHByb2R1Y2luZyBjb3JyZWN0IHJlc3VsdHMuICBJZiBhCi0gICAqICAgZm9udCBwcm92aWRlcyBhbiBpbmNvcnJlY3QgbWFwcGluZyAoZm9yIGV4YW1wbGUsIGFzc2lnbmluZyB0aGUKLSAgICogICBjaGFyYWN0ZXIgY29kZSBVKzAwNUEsIExBVElOIENBUElUQUwgTEVUVEVSIFosIHRvIGEgZ2x5cGggZGVwaWN0aW5nIGEKLSAgICogICBtYXRoZW1hdGljYWwgaW50ZWdyYWwgc2lnbiksIHRoZSBhdXRvLWhpbnRlciBtaWdodCBwcm9kdWNlIHVzZWxlc3MKLSAgICogICByZXN1bHRzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfTE9BRF9ERUZBVUxUICAgICAgICAgICAgICAgICAgICAgIDB4MAotI2RlZmluZSBGVF9MT0FEX05PX1NDQUxFICAgICAgICAgICAgICAgICAgICAgKCAxTCA8PCAwICkKLSNkZWZpbmUgRlRfTE9BRF9OT19ISU5USU5HICAgICAgICAgICAgICAgICAgICggMUwgPDwgMSApCi0jZGVmaW5lIEZUX0xPQURfUkVOREVSICAgICAgICAgICAgICAgICAgICAgICAoIDFMIDw8IDIgKQotI2RlZmluZSBGVF9MT0FEX05PX0JJVE1BUCAgICAgICAgICAgICAgICAgICAgKCAxTCA8PCAzICkKLSNkZWZpbmUgRlRfTE9BRF9WRVJUSUNBTF9MQVlPVVQgICAgICAgICAgICAgICggMUwgPDwgNCApCi0jZGVmaW5lIEZUX0xPQURfRk9SQ0VfQVVUT0hJTlQgICAgICAgICAgICAgICAoIDFMIDw8IDUgKQotI2RlZmluZSBGVF9MT0FEX0NST1BfQklUTUFQICAgICAgICAgICAgICAgICAgKCAxTCA8PCA2ICkKLSNkZWZpbmUgRlRfTE9BRF9QRURBTlRJQyAgICAgICAgICAgICAgICAgICAgICggMUwgPDwgNyApCi0jZGVmaW5lIEZUX0xPQURfSUdOT1JFX0dMT0JBTF9BRFZBTkNFX1dJRFRIICAoIDFMIDw8IDkgKQotI2RlZmluZSBGVF9MT0FEX05PX1JFQ1VSU0UgICAgICAgICAgICAgICAgICAgKCAxTCA8PCAxMCApCi0jZGVmaW5lIEZUX0xPQURfSUdOT1JFX1RSQU5TRk9STSAgICAgICAgICAgICAoIDFMIDw8IDExICkKLSNkZWZpbmUgRlRfTE9BRF9NT05PQ0hST01FICAgICAgICAgICAgICAgICAgICggMUwgPDwgMTIgKQotI2RlZmluZSBGVF9MT0FEX0xJTkVBUl9ERVNJR04gICAgICAgICAgICAgICAgKCAxTCA8PCAxMyApCi0jZGVmaW5lIEZUX0xPQURfTk9fQVVUT0hJTlQgICAgICAgICAgICAgICAgICAoIDFMIDw8IDE1ICkKLSAgLyogQml0cyAxNi4uMTkgYXJlIHVzZWQgYnkgYEZUX0xPQURfVEFSR0VUXycgKi8KLSNkZWZpbmUgRlRfTE9BRF9DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgICggMUwgPDwgMjAgKQotI2RlZmluZSBGVF9MT0FEX0NPTVBVVEVfTUVUUklDUyAgICAgICAgICAgICAgKCAxTCA8PCAyMSApCi0KLSAgLyogKi8KLQotICAvKiB1c2VkIGludGVybmFsbHkgb25seSBieSBjZXJ0YWluIGZvbnQgZHJpdmVycyEgKi8KLSNkZWZpbmUgRlRfTE9BRF9BRFZBTkNFX09OTFkgICAgICAgICAgICAgICAgICggMUwgPDwgOCApCi0jZGVmaW5lIEZUX0xPQURfU0JJVFNfT05MWSAgICAgICAgICAgICAgICAgICAoIDFMIDw8IDE0ICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICBGVF9MT0FEX1RBUkdFVF9YWFgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbGlzdCBvZiB2YWx1ZXMgdGhhdCBhcmUgdXNlZCB0byBzZWxlY3QgYSBzcGVjaWZpYyBoaW50aW5nIGFsZ29yaXRobQotICAgKiAgIHRvIHVzZSBieSB0aGUgaGludGVyLiAgWW91IHNob3VsZCBPUiBvbmUgb2YgdGhlc2UgdmFsdWVzIHRvIHlvdXIKLSAgICogICBgbG9hZF9mbGFncycgd2hlbiBjYWxsaW5nIEBGVF9Mb2FkX0dseXBoLgotICAgKgotICAgKiAgIE5vdGUgdGhhdCBmb250J3MgbmF0aXZlIGhpbnRlcnMgbWF5IGlnbm9yZSB0aGUgaGludGluZyBhbGdvcml0aG0geW91Ci0gICAqICAgaGF2ZSBzcGVjaWZpZWQgKGUuZy4sIHRoZSBUcnVlVHlwZSBieXRlY29kZSBpbnRlcnByZXRlcikuICBZb3UgY2FuIHNldAotICAgKiAgIEBGVF9MT0FEX0ZPUkNFX0FVVE9ISU5UIHRvIGVuc3VyZSB0aGF0IHRoZSBhdXRvLWhpbnRlciBpcyB1c2VkLgotICAgKgotICAgKiAgIEFsc28gbm90ZSB0aGF0IEBGVF9MT0FEX1RBUkdFVF9MSUdIVCBpcyBhbiBleGNlcHRpb24sIGluIHRoYXQgaXQKLSAgICogICBhbHdheXMgaW1wbGllcyBARlRfTE9BRF9GT1JDRV9BVVRPSElOVC4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBGVF9MT0FEX1RBUkdFVF9OT1JNQUwgOjoKLSAgICogICAgIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGRlZmF1bHQgaGludGluZyBhbGdvcml0aG0sIG9wdGltaXplZCBmb3IKLSAgICogICAgIHN0YW5kYXJkIGdyYXktbGV2ZWwgcmVuZGVyaW5nLiAgRm9yIG1vbm9jaHJvbWUgb3V0cHV0LCB1c2UKLSAgICogICAgIEBGVF9MT0FEX1RBUkdFVF9NT05PIGluc3RlYWQuCi0gICAqCi0gICAqICAgRlRfTE9BRF9UQVJHRVRfTElHSFQgOjoKLSAgICogICAgIEEgbGlnaHRlciBoaW50aW5nIGFsZ29yaXRobSBmb3Igbm9uLW1vbm9jaHJvbWUgbW9kZXMuICBNYW55Ci0gICAqICAgICBnZW5lcmF0ZWQgZ2x5cGhzIGFyZSBtb3JlIGZ1enp5IGJ1dCBiZXR0ZXIgcmVzZW1ibGUgaXRzIG9yaWdpbmFsCi0gICAqICAgICBzaGFwZS4gIEEgYml0IGxpa2UgcmVuZGVyaW5nIG9uIE1hYyBPU35YLgotICAgKgotICAgKiAgICAgQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgdGhpcyB0YXJnZXQgaW1wbGllcyBARlRfTE9BRF9GT1JDRV9BVVRPSElOVC4KLSAgICoKLSAgICogICBGVF9MT0FEX1RBUkdFVF9NT05PIDo6Ci0gICAqICAgICBTdHJvbmcgaGludGluZyBhbGdvcml0aG0gdGhhdCBzaG91bGQgb25seSBiZSB1c2VkIGZvciBtb25vY2hyb21lCi0gICAqICAgICBvdXRwdXQuICBUaGUgcmVzdWx0IGlzIHByb2JhYmx5IHVucGxlYXNhbnQgaWYgdGhlIGdseXBoIGlzIHJlbmRlcmVkCi0gICAqICAgICBpbiBub24tbW9ub2Nocm9tZSBtb2Rlcy4KLSAgICoKLSAgICogICBGVF9MT0FEX1RBUkdFVF9MQ0QgOjoKLSAgICogICAgIEEgdmFyaWFudCBvZiBARlRfTE9BRF9UQVJHRVRfTk9STUFMIG9wdGltaXplZCBmb3IgaG9yaXpvbnRhbGx5Ci0gICAqICAgICBkZWNpbWF0ZWQgTENEIGRpc3BsYXlzLgotICAgKgotICAgKiAgIEZUX0xPQURfVEFSR0VUX0xDRF9WIDo6Ci0gICAqICAgICBBIHZhcmlhbnQgb2YgQEZUX0xPQURfVEFSR0VUX05PUk1BTCBvcHRpbWl6ZWQgZm9yIHZlcnRpY2FsbHkKLSAgICogICAgIGRlY2ltYXRlZCBMQ0QgZGlzcGxheXMuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFlvdSBzaG91bGQgdXNlIG9ubHkgX29uZV8gb2YgdGhlIEZUX0xPQURfVEFSR0VUX1hYWCB2YWx1ZXMgaW4geW91cgotICAgKiAgIGBsb2FkX2ZsYWdzJy4gIFRoZXkgY2FuJ3QgYmUgT1JlZC4KLSAgICoKLSAgICogICBJZiBARlRfTE9BRF9SRU5ERVIgaXMgYWxzbyBzZXQsIHRoZSBnbHlwaCBpcyByZW5kZXJlZCBpbiB0aGUKLSAgICogICBjb3JyZXNwb25kaW5nIG1vZGUgKGkuZS4sIHRoZSBtb2RlIHRoYXQgbWF0Y2hlcyB0aGUgdXNlZCBhbGdvcml0aG0KLSAgICogICBiZXN0KS4gIEFuIGV4ZXB0aW9uIGlzIEZUX0xPQURfVEFSR0VUX01PTk8gc2luY2UgaXQgaW1wbGllcwotICAgKiAgIEBGVF9MT0FEX01PTk9DSFJPTUUuCi0gICAqCi0gICAqICAgWW91IGNhbiB1c2UgYSBoaW50aW5nIGFsZ29yaXRobSB0aGF0IGRvZXNuJ3QgY29ycmVzcG9uZCB0byB0aGUgc2FtZQotICAgKiAgIHJlbmRlcmluZyBtb2RlLiAgQXMgYW4gZXhhbXBsZSwgaXQgaXMgcG9zc2libGUgdG8gdXNlIHRoZSBgbGlnaHQnCi0gICAqICAgaGludGluZyBhbGdvcml0aG0gYW5kIGhhdmUgdGhlIHJlc3VsdHMgcmVuZGVyZWQgaW4gaG9yaXpvbnRhbCBMQ0QKLSAgICogICBwaXhlbCBtb2RlLCB3aXRoIGNvZGUgbGlrZQotICAgKgotICAgKiAgICAgewotICAgKiAgICAgICBGVF9Mb2FkX0dseXBoKCBmYWNlLCBnbHlwaF9pbmRleCwKLSAgICogICAgICAgICAgICAgICAgICAgICAgbG9hZF9mbGFncyB8IEZUX0xPQURfVEFSR0VUX0xJR0hUICk7Ci0gICAqCi0gICAqICAgICAgIEZUX1JlbmRlcl9HbHlwaCggZmFjZS0+Z2x5cGgsIEZUX1JFTkRFUl9NT0RFX0xDRCApOwotICAgKiAgICAgfQotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfTE9BRF9UQVJHRVRfKCB4ICkgICAoIChGVF9JbnQzMikoICh4KSAmIDE1ICkgPDwgMTYgKQotCi0jZGVmaW5lIEZUX0xPQURfVEFSR0VUX05PUk1BTCAgRlRfTE9BRF9UQVJHRVRfKCBGVF9SRU5ERVJfTU9ERV9OT1JNQUwgKQotI2RlZmluZSBGVF9MT0FEX1RBUkdFVF9MSUdIVCAgIEZUX0xPQURfVEFSR0VUXyggRlRfUkVOREVSX01PREVfTElHSFQgICkKLSNkZWZpbmUgRlRfTE9BRF9UQVJHRVRfTU9OTyAgICBGVF9MT0FEX1RBUkdFVF8oIEZUX1JFTkRFUl9NT0RFX01PTk8gICApCi0jZGVmaW5lIEZUX0xPQURfVEFSR0VUX0xDRCAgICAgRlRfTE9BRF9UQVJHRVRfKCBGVF9SRU5ERVJfTU9ERV9MQ0QgICAgKQotI2RlZmluZSBGVF9MT0FEX1RBUkdFVF9MQ0RfViAgIEZUX0xPQURfVEFSR0VUXyggRlRfUkVOREVSX01PREVfTENEX1YgICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfTE9BRF9UQVJHRVRfTU9ERQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUmV0dXJuIHRoZSBARlRfUmVuZGVyX01vZGUgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuCi0gICAqICAgQEZUX0xPQURfVEFSR0VUX1hYWCB2YWx1ZS4KLSAgICoKLSAgICovCi0jZGVmaW5lIEZUX0xPQURfVEFSR0VUX01PREUoIHggKSAgKCAoRlRfUmVuZGVyX01vZGUpKCAoICh4KSA+PiAxNiApICYgMTUgKSApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfVHJhbnNmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gc2V0IHRoZSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGlzIGFwcGxpZWQgdG8gZ2x5cGggKi8KLSAgLyogICAgaW1hZ2VzIHdoZW4gdGhleSBhcmUgbG9hZGVkIGludG8gYSBnbHlwaCBzbG90IHRocm91Z2ggICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9Mb2FkX0dseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hdHJpeCA6OiBBIHBvaW50ZXIgdG8gdGhlIHRyYW5zZm9ybWF0aW9uJ3MgMngyIG1hdHJpeC4gIFVzZX4wIGZvciAqLwotICAvKiAgICAgICAgICAgICAgdGhlIGlkZW50aXR5IG1hdHJpeC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVsdGEgIDo6IEEgcG9pbnRlciB0byB0aGUgdHJhbnNsYXRpb24gdmVjdG9yLiAgVXNlfjAgZm9yIHRoZSBudWxsICovCi0gIC8qICAgICAgICAgICAgICB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBvbmx5IGFwcGxpZWQgdG8gc2NhbGFibGUgaW1hZ2UgZm9ybWF0cyBhZnRlciAqLwotICAvKiAgICB0aGUgZ2x5cGggaGFzIGJlZW4gbG9hZGVkLiAgSXQgbWVhbnMgdGhhdCBoaW50aW5nIGlzIHVuYWx0ZXJlZCBieSAgKi8KLSAgLyogICAgdGhlIHRyYW5zZm9ybWF0aW9uIGFuZCBpcyBwZXJmb3JtZWQgb24gdGhlIGNoYXJhY3RlciBzaXplIGdpdmVuIGluICovCi0gIC8qICAgIHRoZSBsYXN0IGNhbGwgdG8gQEZUX1NldF9DaGFyX1NpemUgb3IgQEZUX1NldF9QaXhlbF9TaXplcy4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHRoaXMgYWxzbyB0cmFuc2Zvcm1zIHRoZSBgZmFjZS5nbHlwaC5hZHZhbmNlJyBmaWVsZCwgYnV0ICovCi0gIC8qICAgICpub3QqIHRoZSB2YWx1ZXMgaW4gYGZhY2UuZ2x5cGgubWV0cmljcycuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfU2V0X1RyYW5zZm9ybSggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfTWF0cml4KiAgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBkZWx0YSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVuZGVyX01vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gZW51bWVyYXRpb24gdHlwZSB0aGF0IGxpc3RzIHRoZSByZW5kZXIgbW9kZXMgc3VwcG9ydGVkIGJ5ICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlfjIuICBFYWNoIG1vZGUgY29ycmVzcG9uZHMgdG8gYSBzcGVjaWZpYyB0eXBlIG9mIHNjYW5saW5lICAqLwotICAvKiAgICBjb252ZXJzaW9uIHBlcmZvcm1lZCBvbiB0aGUgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZvciBiaXRtYXAgZm9udHMgYW5kIGVtYmVkZGVkIGJpdG1hcHMgdGhlIGBiaXRtYXAtPnBpeGVsX21vZGUnICAgICAqLwotICAvKiAgICBmaWVsZCBpbiB0aGUgQEZUX0dseXBoU2xvdFJlYyBzdHJ1Y3R1cmUgZ2l2ZXMgdGhlIGZvcm1hdCBvZiB0aGUgICAgKi8KLSAgLyogICAgcmV0dXJuZWQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbGwgbW9kZXMgZXhjZXB0IEBGVF9SRU5ERVJfTU9ERV9NT05PIHVzZSAyNTYgbGV2ZWxzIG9mIG9wYWNpdHkuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SRU5ERVJfTU9ERV9OT1JNQUwgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGlzIGlzIHRoZSBkZWZhdWx0IHJlbmRlciBtb2RlOyBpdCBjb3JyZXNwb25kcyB0byA4LWJpdCAgICAgICAgICovCi0gIC8qICAgICAgYW50aS1hbGlhc2VkIGJpdG1hcHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUkVOREVSX01PREVfTElHSFQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIEBGVF9SRU5ERVJfTU9ERV9OT1JNQUwuICBJdCBpcyBvbmx5ICAgICAgICAqLwotICAvKiAgICAgIGRlZmluZWQgYXMgYSBzZXBhcmF0ZSB2YWx1ZSBiZWNhdXNlIHJlbmRlciBtb2RlcyBhcmUgYWxzbyB1c2VkICAgKi8KLSAgLyogICAgICBpbmRpcmVjdGx5IHRvIGRlZmluZSBoaW50aW5nIGFsZ29yaXRobSBzZWxlY3RvcnMuICBTZWUgICAgICAgICAgICovCi0gIC8qICAgICAgQEZUX0xPQURfVEFSR0VUX1hYWCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUkVOREVSX01PREVfTU9OTyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhpcyBtb2RlIGNvcnJlc3BvbmRzIHRvIDEtYml0IGJpdG1hcHMgKHdpdGggMn5sZXZlbHMgb2YgICAgICAgICAqLwotICAvKiAgICAgIG9wYWNpdHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JFTkRFUl9NT0RFX0xDRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoaXMgbW9kZSBjb3JyZXNwb25kcyB0byBob3Jpem9udGFsIFJHQiBhbmQgQkdSIHN1Yi1waXhlbCAgICAgICAgKi8KLSAgLyogICAgICBkaXNwbGF5cyBsaWtlIExDRCBzY3JlZW5zLiAgSXQgcHJvZHVjZXMgOC1iaXQgYml0bWFwcyB0aGF0IGFyZSAgICovCi0gIC8qICAgICAgM350aW1lcyB0aGUgd2lkdGggb2YgdGhlIG9yaWdpbmFsIGdseXBoIG91dGxpbmUgaW4gcGl4ZWxzLCBhbmQgICAqLwotICAvKiAgICAgIHdoaWNoIHVzZSB0aGUgQEZUX1BJWEVMX01PREVfTENEIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JFTkRFUl9NT0RFX0xDRF9WIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoaXMgbW9kZSBjb3JyZXNwb25kcyB0byB2ZXJ0aWNhbCBSR0IgYW5kIEJHUiBzdWItcGl4ZWwgZGlzcGxheXMgKi8KLSAgLyogICAgICAobGlrZSBQREEgc2NyZWVucywgcm90YXRlZCBMQ0QgZGlzcGxheXMsIGV0Yy4pLiAgSXQgcHJvZHVjZXMgICAgICovCi0gIC8qICAgICAgOC1iaXQgYml0bWFwcyB0aGF0IGFyZSAzfnRpbWVzIHRoZSBoZWlnaHQgb2YgdGhlIG9yaWdpbmFsICAgICAgICAqLwotICAvKiAgICAgIGdseXBoIG91dGxpbmUgaW4gcGl4ZWxzIGFuZCB1c2UgdGhlIEBGVF9QSVhFTF9NT0RFX0xDRF9WIG1vZGUuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgTENELW9wdGltaXplZCBnbHlwaCBiaXRtYXBzIHByb2R1Y2VkIGJ5IEZUX1JlbmRlcl9HbHlwaCBjYW4gYmUgKi8KLSAgLyogICAgZmlsdGVyZWQgdG8gcmVkdWNlIGNvbG9yLWZyaW5nZXMgYnkgdXNpbmcgQEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyICovCi0gIC8qICAgIChub3QgYWN0aXZlIGluIHRoZSBkZWZhdWx0IGJ1aWxkcykuICBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvICAgICAqLwotICAvKiAgICBlaXRoZXIgY2FsbCBARlRfTGlicmFyeV9TZXRMY2RGaWx0ZXIgKGlmIGF2YWlsYWJsZSkgb3IgZG8gdGhlICAgICAgKi8KLSAgLyogICAgZmlsdGVyaW5nIGl0c2VsZi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc2VsZWN0ZWQgcmVuZGVyIG1vZGUgb25seSBhZmZlY3RzIHZlY3RvciBnbHlwaHMgb2YgYSBmb250LiAgICAgKi8KLSAgLyogICAgRW1iZWRkZWQgYml0bWFwcyBvZnRlbiBoYXZlIGEgZGlmZmVyZW50IHBpeGVsIG1vZGUgbGlrZSAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9QSVhFTF9NT0RFX01PTk8uICBZb3UgY2FuIHVzZSBARlRfQml0bWFwX0NvbnZlcnQgdG8gdHJhbnNmb3JtICAqLwotICAvKiAgICB0aGVtIGludG8gOC1iaXQgcGl4bWFwcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZW51bSAgRlRfUmVuZGVyX01vZGVfCi0gIHsKLSAgICBGVF9SRU5ERVJfTU9ERV9OT1JNQUwgPSAwLAotICAgIEZUX1JFTkRFUl9NT0RFX0xJR0hULAotICAgIEZUX1JFTkRFUl9NT0RFX01PTk8sCi0gICAgRlRfUkVOREVSX01PREVfTENELAotICAgIEZUX1JFTkRFUl9NT0RFX0xDRF9WLAotCi0gICAgRlRfUkVOREVSX01PREVfTUFYCi0KLSAgfSBGVF9SZW5kZXJfTW9kZTsKLQotCi0gIC8qIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nICovCi0gIC8qIGBGVF9SZW5kZXJfTW9kZScgdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIGZ0X3JlbmRlcl9tb2RlX25vcm1hbCAgRlRfUkVOREVSX01PREVfTk9STUFMCi0jZGVmaW5lIGZ0X3JlbmRlcl9tb2RlX21vbm8gICAgRlRfUkVOREVSX01PREVfTU9OTwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVuZGVyX0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29udmVydCBhIGdpdmVuIGdseXBoIGltYWdlIHRvIGEgYml0bWFwLiAgSXQgZG9lcyBzbyBieSBpbnNwZWN0aW5nICovCi0gIC8qICAgIHRoZSBnbHlwaCBpbWFnZSBmb3JtYXQsIGZpbmRpbmcgdGhlIHJlbGV2YW50IHJlbmRlcmVyLCBhbmQgICAgICAgICAqLwotICAvKiAgICBpbnZva2luZyBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzbG90ICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgZ2x5cGggc2xvdCBjb250YWluaW5nIHRoZSBpbWFnZSB0byAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgY29udmVydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVuZGVyX21vZGUgOjogVGhpcyBpcyB0aGUgcmVuZGVyIG1vZGUgdXNlZCB0byByZW5kZXIgdGhlIGdseXBoICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGltYWdlIGludG8gYSBiaXRtYXAuICBTZWUgQEZUX1JlbmRlcl9Nb2RlIGZvciBhICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUbyBnZXQgbWVhbmluZ2Z1bCByZXN1bHRzLCBmb250IHNjYWxpbmcgdmFsdWVzIG11c3QgYmUgc2V0IHdpdGggICAgKi8KLSAgLyogICAgZnVuY3Rpb25zIGxpa2UgQEZUX1NldF9DaGFyX1NpemUgYmVmb3JlIGNhbGxpbmcgRlRfUmVuZGVyX0dseXBoLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfUmVuZGVyX0dseXBoKCBGVF9HbHlwaFNsb3QgICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgcmVuZGVyX21vZGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0tlcm5pbmdfTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGVudW1lcmF0aW9uIHVzZWQgdG8gc3BlY2lmeSB3aGljaCBrZXJuaW5nIHZhbHVlcyB0byByZXR1cm4gaW4gICAqLwotICAvKiAgICBARlRfR2V0X0tlcm5pbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9LRVJOSU5HX0RFRkFVTFQgIDo6IFJldHVybiBncmlkLWZpdHRlZCBrZXJuaW5nIGRpc3RhbmNlcyBpbiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHMgKHZhbHVlIGlzfjApLiAgV2hldGhlciB0aGV5IGFyZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkIGRlcGVuZHMgb24gQEZUX0xPQURfTk9fU0NBTEUuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfS0VSTklOR19VTkZJVFRFRCA6OiBSZXR1cm4gdW4tZ3JpZC1maXR0ZWQga2VybmluZyBkaXN0YW5jZXMgaW4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgMjYuNiBmcmFjdGlvbmFsIHBpeGVscy4gIFdoZXRoZXIgdGhleSBhcmUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlZCBkZXBlbmRzIG9uIEBGVF9MT0FEX05PX1NDQUxFLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0tFUk5JTkdfVU5TQ0FMRUQgOjogUmV0dXJuIHRoZSBrZXJuaW5nIHZlY3RvciBpbiBvcmlnaW5hbCBmb250ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9LRVJOSU5HX0RFRkFVTFQgcmV0dXJucyBmdWxsIHBpeGVsIHZhbHVlczsgaXQgYWxzbyBtYWtlcyAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgaGV1cmlzdGljYWxseSBzY2FsZSBkb3duIGtlcm5pbmcgZGlzdGFuY2VzIGF0IHNtYWxsIHBwZW0gICovCi0gIC8qICAgIHZhbHVlcyBzbyB0aGF0IHRoZXkgZG9uJ3QgYmVjb21lIHRvbyBiaWcuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9LZXJuaW5nX01vZGVfCi0gIHsKLSAgICBGVF9LRVJOSU5HX0RFRkFVTFQgID0gMCwKLSAgICBGVF9LRVJOSU5HX1VORklUVEVELAotICAgIEZUX0tFUk5JTkdfVU5TQ0FMRUQKLQotICB9IEZUX0tlcm5pbmdfTW9kZTsKLQotCi0gIC8qIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nICovCi0gIC8qIGBGVF9LZXJuaW5nX01vZGUnIHZhbHVlcyBpbnN0ZWFkICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIGZ0X2tlcm5pbmdfZGVmYXVsdCAgIEZUX0tFUk5JTkdfREVGQVVMVAotI2RlZmluZSBmdF9rZXJuaW5nX3VuZml0dGVkICBGVF9LRVJOSU5HX1VORklUVEVECi0jZGVmaW5lIGZ0X2tlcm5pbmdfdW5zY2FsZWQgIEZUX0tFUk5JTkdfVU5TQ0FMRUQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9LZXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUga2VybmluZyB2ZWN0b3IgYmV0d2VlbiB0d28gZ2x5cGhzIG9mIGEgc2FtZSBmYWNlLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgIDo6IEEgaGFuZGxlIHRvIGEgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGVmdF9nbHlwaCAgOjogVGhlIGluZGV4IG9mIHRoZSBsZWZ0IGdseXBoIGluIHRoZSBrZXJuIHBhaXIuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByaWdodF9nbHlwaCA6OiBUaGUgaW5kZXggb2YgdGhlIHJpZ2h0IGdseXBoIGluIHRoZSBrZXJuIHBhaXIuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGtlcm5fbW9kZSAgIDo6IFNlZSBARlRfS2VybmluZ19Nb2RlIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBEZXRlcm1pbmVzIHRoZSBzY2FsZSBhbmQgZGltZW5zaW9uIG9mIHRoZSByZXR1cm5lZCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAga2VybmluZyB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWtlcm5pbmcgICAgOjogVGhlIGtlcm5pbmcgdmVjdG9yLiAgVGhpcyBpcyBlaXRoZXIgaW4gZm9udCB1bml0cywgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uYWwgcGl4ZWxzICgyNi42IGZvcm1hdCksIG9yIHBpeGVscyBmb3IgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzY2FsYWJsZSBmb3JtYXRzLCBhbmQgaW4gcGl4ZWxzIGZvciBmaXhlZC1zaXplcyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25seSBob3Jpem9udGFsIGxheW91dHMgKGxlZnQtdG8tcmlnaHQgJiByaWdodC10by1sZWZ0KSBhcmUgICAgICAgICovCi0gIC8qICAgIHN1cHBvcnRlZCBieSB0aGlzIG1ldGhvZC4gIE90aGVyIGxheW91dHMsIG9yIG1vcmUgc29waGlzdGljYXRlZCAgICAqLwotICAvKiAgICBrZXJuaW5ncywgYXJlIG91dCBvZiB0aGUgc2NvcGUgb2YgdGhpcyBBUEkgZnVuY3Rpb24gLS0gdGhleSBjYW4gYmUgKi8KLSAgLyogICAgaW1wbGVtZW50ZWQgdGhyb3VnaCBmb3JtYXQtc3BlY2lmaWMgaW50ZXJmYWNlcy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0tlcm5pbmcoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBsZWZ0X2dseXBoLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgcmlnaHRfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBrZXJuX21vZGUsCi0gICAgICAgICAgICAgICAgICBGVF9WZWN0b3IgICpha2VybmluZyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1RyYWNrX0tlcm5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIHRoZSB0cmFjayBrZXJuaW5nIGZvciBhIGdpdmVuIGZhY2Ugb2JqZWN0IGF0IGEgZ2l2ZW4gc2l6ZS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBBIGhhbmRsZSB0byBhIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb2ludF9zaXplIDo6IFRoZSBwb2ludCBzaXplIGluIDE2LjE2IGZyYWN0aW9uYWwgcG9pbnRzLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlZ3JlZSAgICAgOjogVGhlIGRlZ3JlZSBvZiB0aWdodG5lc3MuICBJbmNyZWFzaW5nbHkgbmVnYXRpdmUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHZhbHVlcyByZXByZXNlbnQgdGlnaHRlciB0cmFjayBrZXJuaW5nLCB3aGlsZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBpbmNyZWFzaW5nbHkgcG9zaXRpdmUgdmFsdWVzIHJlcHJlc2VudCBsb29zZXIgdHJhY2sgICovCi0gIC8qICAgICAgICAgICAgICAgICAga2VybmluZy4gIFZhbHVlIHplcm8gbWVhbnMgbm8gdHJhY2sga2VybmluZy4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFrZXJuaW5nICAgOjogVGhlIGtlcm5pbmcgaW4gMTYuMTYgZnJhY3Rpb25hbCBwb2ludHMsIHRvIGJlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHVuaWZvcm1seSBhcHBsaWVkIGJldHdlZW4gYWxsIGdseXBocy4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDdXJyZW50bHksIG9ubHkgdGhlIFR5cGV+MSBmb250IGRyaXZlciBzdXBwb3J0cyB0cmFjayBrZXJuaW5nLCAgICAgKi8KLSAgLyogICAgdXNpbmcgZGF0YSBmcm9tIEFGTSBmaWxlcyAoaWYgYXR0YWNoZWQgd2l0aCBARlRfQXR0YWNoX0ZpbGUgb3IgICAgICovCi0gIC8qICAgIEBGVF9BdHRhY2hfU3RyZWFtKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25seSB2ZXJ5IGZldyBBRk0gZmlsZXMgY29tZSB3aXRoIHRyYWNrIGtlcm5pbmcgZGF0YTsgcGxlYXNlIHJlZmVyICovCi0gIC8qICAgIHRvIHRoZSBBZG9iZSdzIEFGTSBzcGVjaWZpY2F0aW9uIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9UcmFja19LZXJuaW5nKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgIHBvaW50X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGRlZ3JlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgYWtlcm5pbmcgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9HbHlwaF9OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlIHRoZSBBU0NJSSBuYW1lIG9mIGEgZ2l2ZW4gZ2x5cGggaW4gYSBmYWNlLiAgVGhpcyBvbmx5ICAgICAqLwotICAvKiAgICB3b3JrcyBmb3IgdGhvc2UgZmFjZXMgd2hlcmUgQEZUX0hBU19HTFlQSF9OQU1FUyhmYWNlKSByZXR1cm5zfjEuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byBhIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2luZGV4IDo6IFRoZSBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnVmZmVyX21heCAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ1ZmZlciAgICAgIDo6IEEgcG9pbnRlciB0byBhIHRhcmdldCBidWZmZXIgd2hlcmUgdGhlIG5hbWUgaXMgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBjb3BpZWQgdG8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlcnJvciBpcyByZXR1cm5lZCBpZiB0aGUgZmFjZSBkb2Vzbid0IHByb3ZpZGUgZ2x5cGggbmFtZXMgb3IgaWYgKi8KLSAgLyogICAgdGhlIGdseXBoIGluZGV4IGlzIGludmFsaWQuICBJbiBhbGwgY2FzZXMgb2YgZmFpbHVyZSwgdGhlIGZpcnN0ICAgICovCi0gIC8qICAgIGJ5dGUgb2YgYGJ1ZmZlcicgaXMgc2V0IHRvfjAgdG8gaW5kaWNhdGUgYW4gZW1wdHkgbmFtZS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGdseXBoIG5hbWUgaXMgdHJ1bmNhdGVkIHRvIGZpdCB3aXRoaW4gdGhlIGJ1ZmZlciBpZiBpdCBpcyB0b28gICovCi0gIC8qICAgIGxvbmcuICBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIGFsd2F5cyB6ZXJvLXRlcm1pbmF0ZWQuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQmUgYXdhcmUgdGhhdCBGcmVlVHlwZSByZW9yZGVycyBnbHlwaCBpbmRpY2VzIGludGVybmFsbHkgc28gdGhhdCAgICovCi0gIC8qICAgIGdseXBoIGluZGV4fjAgYWx3YXlzIGNvcnJlc3BvbmRzIHRvIHRoZSBgbWlzc2luZyBnbHlwaCcgKGNhbGxlZCAgICAqLwotICAvKiAgICBgLm5vdGRlZicpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIGNvbmZpZyBtYWNybyAgICAgICAgICAqLwotICAvKiAgICBgRlRfQ09ORklHX09QVElPTl9OT19HTFlQSF9OQU1FUycgaXMgbm90IGRlZmluZWQgaW4gYGZ0b3B0aW9ucy5oJy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfR2x5cGhfTmFtZSggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgYnVmZmVyX21heCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgdGhlIEFTQ0lJIFBvc3RTY3JpcHQgbmFtZSBvZiBhIGdpdmVuIGZhY2UsIGlmIGF2YWlsYWJsZS4gICovCi0gIC8qICAgIFRoaXMgb25seSB3b3JrcyB3aXRoIFBvc3RTY3JpcHQgYW5kIFRydWVUeXBlIGZvbnRzLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgcG9pbnRlciB0byB0aGUgZmFjZSdzIFBvc3RTY3JpcHQgbmFtZS4gIE5VTEwgaWYgdW5hdmFpbGFibGUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXR1cm5lZCBwb2ludGVyIGlzIG93bmVkIGJ5IHRoZSBmYWNlIGFuZCBpcyBkZXN0cm95ZWQgd2l0aCAgICAqLwotICAvKiAgICBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggY29uc3QgY2hhciogKQotICBGVF9HZXRfUG9zdHNjcmlwdF9OYW1lKCBGVF9GYWNlICBmYWNlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZWxlY3RfQ2hhcm1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWxlY3QgYSBnaXZlbiBjaGFybWFwIGJ5IGl0cyBlbmNvZGluZyB0YWcgKGFzIGxpc3RlZCBpbiAgICAgICAgICAgKi8KLSAgLyogICAgYGZyZWV0eXBlLmgnKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZW5jb2RpbmcgOjogQSBoYW5kbGUgdG8gdGhlIHNlbGVjdGVkIGVuY29kaW5nLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIG5vIGNoYXJtYXAgaW4gdGhlIGZhY2UgICAgICAgICAgICovCi0gIC8qICAgIGNvcnJlc3BvbmRzIHRvIHRoZSBlbmNvZGluZyBxdWVyaWVkIGhlcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQmVjYXVzZSBtYW55IGZvbnRzIGNvbnRhaW4gbW9yZSB0aGFuIGEgc2luZ2xlIGNtYXAgZm9yIFVuaWNvZGUgICAgICovCi0gIC8qICAgIGVuY29kaW5nLCB0aGlzIGZ1bmN0aW9uIGhhcyBzb21lIHNwZWNpYWwgY29kZSB0byBzZWxlY3QgdGhlIG9uZSAgICAqLwotICAvKiAgICB0aGF0IGNvdmVycyBVbmljb2RlIGJlc3QgKGBiZXN0JyBpbiB0aGUgc2Vuc2UgdGhhdCBhIFVDUy00IGNtYXAgaXMgKi8KLSAgLyogICAgcHJlZmVycmVkIHRvIGEgVUNTLTIgY21hcCkuICBJdCBpcyB0aHVzIHByZWZlcmFibGUgdG8gICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9TZXRfQ2hhcm1hcCBpbiB0aGlzIGNhc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1NlbGVjdF9DaGFybWFwKCBGVF9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0VuY29kaW5nICBlbmNvZGluZyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X0NoYXJtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VsZWN0IGEgZ2l2ZW4gY2hhcm1hcCBmb3IgY2hhcmFjdGVyIGNvZGUgdG8gZ2x5cGggaW5kZXggbWFwcGluZy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcm1hcCA6OiBBIGhhbmRsZSB0byB0aGUgc2VsZWN0ZWQgY2hhcm1hcC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBjaGFybWFwIGlzIG5vdCBwYXJ0IG9mICAgICAgICovCi0gIC8qICAgIHRoZSBmYWNlIChpLmUuLCBpZiBpdCBpcyBub3QgbGlzdGVkIGluIHRoZSBgZmFjZS0+Y2hhcm1hcHMnICAgICAgICAqLwotICAvKiAgICB0YWJsZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEl0IGFsc28gZmFpbHMgaWYgYSB0eXBlfjE0IGNoYXJtYXAgaXMgc2VsZWN0ZWQuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1NldF9DaGFybWFwKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfQ2hhck1hcCAgY2hhcm1hcCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX0dldF9DaGFybWFwX0luZGV4Ci0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXRyaWV2ZSBpbmRleCBvZiBhIGdpdmVuIGNoYXJtYXAuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBjaGFybWFwIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byBhIGNoYXJtYXAuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgVGhlIGluZGV4IGludG8gdGhlIGFycmF5IG9mIGNoYXJhY3RlciBtYXBzIHdpdGhpbiB0aGUgZmFjZSB0byB3aGljaAotICAgKiAgIGBjaGFybWFwJyBiZWxvbmdzLiAgSWYgYW4gZXJyb3Igb2NjdXJzLCAtMSBpcyByZXR1cm5lZC4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfSW50ICkKLSAgRlRfR2V0X0NoYXJtYXBfSW5kZXgoIEZUX0NoYXJNYXAgIGNoYXJtYXAgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9DaGFyX0luZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgZ2x5cGggaW5kZXggb2YgYSBnaXZlbiBjaGFyYWN0ZXIgY29kZS4gIFRoaXMgZnVuY3Rpb24gICAqLwotICAvKiAgICB1c2VzIGEgY2hhcm1hcCBvYmplY3QgdG8gZG8gdGhlIG1hcHBpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJjb2RlIDo6IFRoZSBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBnbHlwaCBpbmRleC4gIDB+bWVhbnMgYHVuZGVmaW5lZCBjaGFyYWN0ZXIgY29kZScuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHlvdSB1c2UgRnJlZVR5cGUgdG8gbWFuaXB1bGF0ZSB0aGUgY29udGVudHMgb2YgZm9udCBmaWxlcyAgICAgICAqLwotICAvKiAgICBkaXJlY3RseSwgYmUgYXdhcmUgdGhhdCB0aGUgZ2x5cGggaW5kZXggcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiAgKi8KLSAgLyogICAgZG9lc24ndCBhbHdheXMgY29ycmVzcG9uZCB0byB0aGUgaW50ZXJuYWwgaW5kaWNlcyB1c2VkIHdpdGhpbiB0aGUgICovCi0gIC8qICAgIGZpbGUuICBUaGlzIGlzIGRvbmUgdG8gZW5zdXJlIHRoYXQgdmFsdWV+MCBhbHdheXMgY29ycmVzcG9uZHMgdG8gICAqLwotICAvKiAgICB0aGUgYG1pc3NpbmcgZ2x5cGgnLiAgSWYgdGhlIGZpcnN0IGdseXBoIGlzIG5vdCBuYW1lZCBgLm5vdGRlZicsICAgKi8KLSAgLyogICAgdGhlbiBmb3IgVHlwZX4xIGFuZCBUeXBlfjQyIGZvbnRzLCBgLm5vdGRlZicgd2lsbCBiZSBtb3ZlZCBpbnRvICAgICovCi0gIC8qICAgIHRoZSBnbHlwaCBJRH4wIHBvc2l0aW9uLCBhbmQgd2hhdGV2ZXIgd2FzIHRoZXJlIHdpbGwgYmUgbW92ZWQgdG8gICAqLwotICAvKiAgICB0aGUgcG9zaXRpb24gYC5ub3RkZWYnIGhhZC4gIEZvciBUeXBlfjEgZm9udHMsIGlmIHRoZXJlIGlzIG5vICAgICAgKi8KLSAgLyogICAgYC5ub3RkZWYnIGdseXBoIGF0IGFsbCwgdGhlbiBvbmUgd2lsbCBiZSBjcmVhdGVkIGF0IGluZGV4fjAgYW5kICAgICovCi0gIC8qICAgIHdoYXRldmVyIHdhcyB0aGVyZSB3aWxsIGJlIG1vdmVkIHRvIHRoZSBsYXN0IGluZGV4IC0tIFR5cGV+NDIgICAgICAqLwotICAvKiAgICBmb250cyBhcmUgY29uc2lkZXJlZCBpbnZhbGlkIHVuZGVyIHRoaXMgY29uZGl0aW9uLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfVUludCApCi0gIEZUX0dldF9DaGFyX0luZGV4KCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBjaGFyY29kZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0ZpcnN0X0NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHVybiB0aGUgZmlyc3QgY2hhcmFjdGVyIGNvZGUgaW4gdGhlICAgICovCi0gIC8qICAgIGN1cnJlbnQgY2hhcm1hcCBvZiBhIGdpdmVuIGZhY2UuICBJdCBhbHNvIHJldHVybnMgdGhlICAgICAgICAgICAgICAqLwotICAvKiAgICBjb3JyZXNwb25kaW5nIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZ2luZGV4IDo6IEdseXBoIGluZGV4IG9mIGZpcnN0IGNoYXJhY3RlciBjb2RlLiAgMH5pZiBjaGFybWFwIGlzICAgKi8KLSAgLyogICAgICAgICAgICAgICBlbXB0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGNoYXJtYXAncyBmaXJzdCBjaGFyYWN0ZXIgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWW91IHNob3VsZCB1c2UgdGhpcyBmdW5jdGlvbiB3aXRoIEBGVF9HZXRfTmV4dF9DaGFyIHRvIGJlIGFibGUgdG8gICovCi0gIC8qICAgIHBhcnNlIGFsbCBjaGFyYWN0ZXIgY29kZXMgYXZhaWxhYmxlIGluIGEgZ2l2ZW4gY2hhcm1hcC4gIFRoZSBjb2RlICAqLwotICAvKiAgICBzaG91bGQgbG9vayBsaWtlIHRoaXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEZUX1VMb25nICBjaGFyY29kZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBGVF9VSW50ICAgZ2luZGV4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBjaGFyY29kZSA9IEZUX0dldF9GaXJzdF9DaGFyKCBmYWNlLCAmZ2luZGV4ICk7ICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgd2hpbGUgKCBnaW5kZXggIT0gMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIC4uLiBkbyBzb21ldGhpbmcgd2l0aCAoY2hhcmNvZGUsZ2luZGV4KSBwYWlyIC4uLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgY2hhcmNvZGUgPSBGVF9HZXRfTmV4dF9DaGFyKCBmYWNlLCBjaGFyY29kZSwgJmdpbmRleCApOyAgICAgICAgKi8KLSAgLyogICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQmUgYXdhcmUgdGhhdCBjaGFyYWN0ZXIgY29kZXMgY2FuIGhhdmUgdmFsdWVzIHVwIHRvIDB4RkZGRkZGRkY7ICAgICovCi0gIC8qICAgIHRoaXMgbWlnaHQgaGFwcGVuIGZvciBub24tVW5pY29kZSBvciBtYWxmb3JtZWQgY21hcHMuICBIb3dldmVyLCAgICAqLwotICAvKiAgICBldmVuIHdpdGggcmVndWxhciBVbmljb2RlIGVuY29kaW5nLCBzby1jYWxsZWQgYGxhc3QgcmVzb3J0IGZvbnRzJyAgKi8KLSAgLyogICAgKHVzaW5nIFNGTlQgY21hcCBmb3JtYXQgMTMsIHNlZSBmdW5jdGlvbiBARlRfR2V0X0NNYXBfRm9ybWF0KSAgICAgICovCi0gIC8qICAgIG5vcm1hbGx5IGhhdmUgZW50cmllcyBmb3IgYWxsIFVuaWNvZGUgY2hhcmFjdGVycyB1cCB0byAweDFGRkZGRiwgICAqLwotICAvKiAgICB3aGljaCBjYW4gY2F1c2UgKmEgbG90KiBvZiBpdGVyYXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCBgKmFnaW5kZXgnIGlzIHNldCB0b34wIGlmIHRoZSBjaGFybWFwIGlzIGVtcHR5LiAgVGhlICAgICAqLwotICAvKiAgICByZXN1bHQgaXRzZWxmIGNhbiBiZX4wIGluIHR3byBjYXNlczogaWYgdGhlIGNoYXJtYXAgaXMgZW1wdHkgb3IgICAgKi8KLSAgLyogICAgaWYgdGhlIHZhbHVlfjAgaXMgdGhlIGZpcnN0IHZhbGlkIGNoYXJhY3RlciBjb2RlLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX1VMb25nICkKLSAgRlRfR2V0X0ZpcnN0X0NoYXIoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgKmFnaW5kZXggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9OZXh0X0NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byByZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyIGNvZGUgaW4gdGhlICAgICAqLwotICAvKiAgICBjdXJyZW50IGNoYXJtYXAgb2YgYSBnaXZlbiBmYWNlIGZvbGxvd2luZyB0aGUgdmFsdWUgYGNoYXJfY29kZScsICAgKi8KLSAgLyogICAgYXMgd2VsbCBhcyB0aGUgY29ycmVzcG9uZGluZyBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJfY29kZSA6OiBUaGUgc3RhcnRpbmcgY2hhcmFjdGVyIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFnaW5kZXggICA6OiBHbHlwaCBpbmRleCBvZiBuZXh0IGNoYXJhY3RlciBjb2RlLiAgMH5pZiBjaGFybWFwICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgaXMgZW1wdHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgY2hhcm1hcCdzIG5leHQgY2hhcmFjdGVyIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3Ugc2hvdWxkIHVzZSB0aGlzIGZ1bmN0aW9uIHdpdGggQEZUX0dldF9GaXJzdF9DaGFyIHRvIHdhbGsgICAgICAgKi8KLSAgLyogICAgb3ZlciBhbGwgY2hhcmFjdGVyIGNvZGVzIGF2YWlsYWJsZSBpbiBhIGdpdmVuIGNoYXJtYXAuICBTZWUgdGhlICAgICovCi0gIC8qICAgIG5vdGUgZm9yIHRoaXMgZnVuY3Rpb24gZm9yIGEgc2ltcGxlIGNvZGUgZXhhbXBsZS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IGAqYWdpbmRleCcgaXMgc2V0IHRvfjAgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBjb2RlcyBpbiAgICovCi0gIC8qICAgIHRoZSBjaGFybWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9VTG9uZyApCi0gIEZUX0dldF9OZXh0X0NoYXIoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBjaGFyX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAqYWdpbmRleCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X05hbWVfSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIHRoZSBnbHlwaCBpbmRleCBvZiBhIGdpdmVuIGdseXBoIG5hbWUuICBUaGlzIGZ1bmN0aW9uIHVzZXMgICovCi0gIC8qICAgIGRyaXZlciBzcGVjaWZpYyBvYmplY3RzIHRvIGRvIHRoZSB0cmFuc2xhdGlvbi4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfbmFtZSA6OiBUaGUgZ2x5cGggbmFtZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGdseXBoIGluZGV4LiAgMH5tZWFucyBgdW5kZWZpbmVkIGNoYXJhY3RlciBjb2RlJy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX1VJbnQgKQotICBGVF9HZXRfTmFtZV9JbmRleCggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmluZyogIGdseXBoX25hbWUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9TVUJHTFlQSF9GTEFHX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIGNvbnN0YW50cyB1c2VkIHRvIGRlc2NyaWJlIHN1YmdseXBocy4gIFBsZWFzZSByZWZlciB0byB0aGUKLSAgICogICBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBmbGFncy4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBGVF9TVUJHTFlQSF9GTEFHX0FSR1NfQVJFX1dPUkRTIDo6Ci0gICAqICAgRlRfU1VCR0xZUEhfRkxBR19BUkdTX0FSRV9YWV9WQUxVRVMgOjoKLSAgICogICBGVF9TVUJHTFlQSF9GTEFHX1JPVU5EX1hZX1RPX0dSSUQgOjoKLSAgICogICBGVF9TVUJHTFlQSF9GTEFHX1NDQUxFIDo6Ci0gICAqICAgRlRfU1VCR0xZUEhfRkxBR19YWV9TQ0FMRSA6OgotICAgKiAgIEZUX1NVQkdMWVBIX0ZMQUdfMlgyIDo6Ci0gICAqICAgRlRfU1VCR0xZUEhfRkxBR19VU0VfTVlfTUVUUklDUyA6OgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19BUkdTX0FSRV9XT1JEUyAgICAgICAgICAxCi0jZGVmaW5lIEZUX1NVQkdMWVBIX0ZMQUdfQVJHU19BUkVfWFlfVkFMVUVTICAgICAgMgotI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX1JPVU5EX1hZX1RPX0dSSUQgICAgICAgIDQKLSNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19TQ0FMRSAgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIEZUX1NVQkdMWVBIX0ZMQUdfWFlfU0NBTEUgICAgICAgICAgICAgMHg0MAotI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHXzJYMiAgICAgICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19VU0VfTVlfTUVUUklDUyAgICAgIDB4MjAwCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuYzoKLSAgICogICBGVF9HZXRfU3ViR2x5cGhfSW5mbwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUmV0cmlldmUgYSBkZXNjcmlwdGlvbiBvZiBhIGdpdmVuIHN1YmdseXBoLiAgT25seSB1c2UgaXQgaWYKLSAgICogICBgZ2x5cGgtPmZvcm1hdCcgaXMgQEZUX0dMWVBIX0ZPUk1BVF9DT01QT1NJVEU7IGFuIGVycm9yIGlzCi0gICAqICAgcmV0dXJuZWQgb3RoZXJ3aXNlLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgZ2x5cGggOjoKLSAgICogICAgIFRoZSBzb3VyY2UgZ2x5cGggc2xvdC4KLSAgICoKLSAgICogICBzdWJfaW5kZXggOjoKLSAgICogICAgIFRoZSBpbmRleCBvZiB0aGUgc3ViZ2x5cGguICBNdXN0IGJlIGxlc3MgdGhhbgotICAgKiAgICAgYGdseXBoLT5udW1fc3ViZ2x5cGhzJy4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICBwX2luZGV4IDo6Ci0gICAqICAgICBUaGUgZ2x5cGggaW5kZXggb2YgdGhlIHN1YmdseXBoLgotICAgKgotICAgKiAgIHBfZmxhZ3MgOjoKLSAgICogICAgIFRoZSBzdWJnbHlwaCBmbGFncywgc2VlIEBGVF9TVUJHTFlQSF9GTEFHX1hYWC4KLSAgICoKLSAgICogICBwX2FyZzEgOjoKLSAgICogICAgIFRoZSBzdWJnbHlwaCdzIGZpcnN0IGFyZ3VtZW50IChpZiBhbnkpLgotICAgKgotICAgKiAgIHBfYXJnMiA6OgotICAgKiAgICAgVGhlIHN1YmdseXBoJ3Mgc2Vjb25kIGFyZ3VtZW50IChpZiBhbnkpLgotICAgKgotICAgKiAgIHBfdHJhbnNmb3JtIDo6Ci0gICAqICAgICBUaGUgc3ViZ2x5cGggdHJhbnNmb3JtYXRpb24gKGlmIGFueSkuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhlIHZhbHVlcyBvZiBgKnBfYXJnMScsIGAqcF9hcmcyJywgYW5kIGAqcF90cmFuc2Zvcm0nIG11c3QgYmUKLSAgICogICBpbnRlcnByZXRlZCBkZXBlbmRpbmcgb24gdGhlIGZsYWdzIHJldHVybmVkIGluIGAqcF9mbGFncycuICBTZWUgdGhlCi0gICAqICAgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscy4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfU3ViR2x5cGhfSW5mbyggRlRfR2x5cGhTbG90ICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgc3ViX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICpwX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICpwX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICpwX2FyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgKnBfYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX01hdHJpeCAgICAqcF90cmFuc2Zvcm0gKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZTVFlQRV9YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgbGlzdCBvZiBiaXQgZmxhZ3MgdXNlZCBpbiB0aGUgYGZzVHlwZScgZmllbGQgb2YgdGhlIE9TLzIgdGFibGUgICAqLwotICAvKiAgICBpbiBhIFRydWVUeXBlIG9yIE9wZW5UeXBlIGZvbnQgYW5kIHRoZSBgRlNUeXBlJyBlbnRyeSBpbiBhICAgICAgICAgKi8KLSAgLyogICAgUG9zdFNjcmlwdCBmb250LiAgVGhlc2UgYml0IGZsYWdzIGFyZSByZXR1cm5lZCBieSAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9HZXRfRlNUeXBlX0ZsYWdzOyB0aGV5IGluZm9ybSBjbGllbnQgYXBwbGljYXRpb25zIG9mIGVtYmVkZGluZyAqLwotICAvKiAgICBhbmQgc3Vic2V0dGluZyByZXN0cmljdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgZm9udC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBodHRwOi8vd3d3LmFkb2JlLmNvbS9jb250ZW50L2RhbS9BZG9iZS9lbi9kZXZuZXQvYWNyb2JhdC9wZGZzL0ZvbnRQb2xpY2llcy5wZGYgKi8KLSAgLyogICAgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRlNUWVBFX0lOU1RBTExBQkxFX0VNQkVERElORyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRm9udHMgd2l0aCBubyBmc1R5cGUgYml0IHNldCBtYXkgYmUgZW1iZWRkZWQgYW5kIHBlcm1hbmVudGx5ICAgICAqLwotICAvKiAgICAgIGluc3RhbGxlZCBvbiB0aGUgcmVtb3RlIHN5c3RlbSBieSBhbiBhcHBsaWNhdGlvbi4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZTVFlQRV9SRVNUUklDVEVEX0xJQ0VOU0VfRU1CRURESU5HIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEZvbnRzIHRoYXQgaGF2ZSBvbmx5IHRoaXMgYml0IHNldCBtdXN0IG5vdCBiZSBtb2RpZmllZCwgZW1iZWRkZWQgKi8KLSAgLyogICAgICBvciBleGNoYW5nZWQgaW4gYW55IG1hbm5lciB3aXRob3V0IGZpcnN0IG9idGFpbmluZyBwZXJtaXNzaW9uIG9mICovCi0gIC8qICAgICAgdGhlIGZvbnQgc29mdHdhcmUgY29weXJpZ2h0IG93bmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRlNUWVBFX1BSRVZJRVdfQU5EX1BSSU5UX0VNQkVERElORyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGUgZm9udCBtYXkgYmUgZW1iZWRkZWQgYW5kIHRlbXBvcmFyaWx5ICAgICAqLwotICAvKiAgICAgIGxvYWRlZCBvbiB0aGUgcmVtb3RlIHN5c3RlbS4gIERvY3VtZW50cyBjb250YWluaW5nIFByZXZpZXcgJiAgICAgKi8KLSAgLyogICAgICBQcmludCBmb250cyBtdXN0IGJlIG9wZW5lZCBgcmVhZC1vbmx5Jzsgbm8gZWRpdHMgY2FuIGJlIGFwcGxpZWQgICovCi0gIC8qICAgICAgdG8gdGhlIGRvY3VtZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRlNUWVBFX0VESVRBQkxFX0VNQkVERElORyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGUgZm9udCBtYXkgYmUgZW1iZWRkZWQgYnV0IG11c3Qgb25seSBiZSAgICAqLwotICAvKiAgICAgIGluc3RhbGxlZCB0ZW1wb3JhcmlseSBvbiBvdGhlciBzeXN0ZW1zLiAgSW4gY29udHJhc3QgdG8gUHJldmlldyAgKi8KLSAgLyogICAgICAmIFByaW50IGZvbnRzLCBkb2N1bWVudHMgY29udGFpbmluZyBlZGl0YWJsZSBmb250cyBtYXkgYmUgb3BlbmVkICovCi0gIC8qICAgICAgZm9yIHJlYWRpbmcsIGVkaXRpbmcgaXMgcGVybWl0dGVkLCBhbmQgY2hhbmdlcyBtYXkgYmUgc2F2ZWQuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRlNUWVBFX05PX1NVQlNFVFRJTkcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgSWYgdGhpcyBiaXQgaXMgc2V0LCB0aGUgZm9udCBtYXkgbm90IGJlIHN1YnNldHRlZCBwcmlvciB0byAgICAgICAqLwotICAvKiAgICAgIGVtYmVkZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZTVFlQRV9CSVRNQVBfRU1CRURESU5HX09OTFkgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIElmIHRoaXMgYml0IGlzIHNldCwgb25seSBiaXRtYXBzIGNvbnRhaW5lZCBpbiB0aGUgZm9udCBtYXkgYmUgICAgKi8KLSAgLyogICAgICBlbWJlZGRlZDsgbm8gb3V0bGluZSBkYXRhIG1heSBiZSBlbWJlZGRlZC4gIElmIHRoZXJlIGFyZSBubyAgICAgICovCi0gIC8qICAgICAgYml0bWFwcyBhdmFpbGFibGUgaW4gdGhlIGZvbnQsIHRoZW4gdGhlIGZvbnQgaXMgdW5lbWJlZGRhYmxlLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmbGFncyBhcmUgT1JlZCB0b2dldGhlciwgdGh1cyBtb3JlIHRoYW4gYSBzaW5nbGUgdmFsdWUgY2FuIGJlICAqLwotICAvKiAgICByZXR1cm5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoaWxlIHRoZSBmc1R5cGUgZmxhZ3MgY2FuIGluZGljYXRlIHRoYXQgYSBmb250IG1heSBiZSBlbWJlZGRlZCwgYSAqLwotICAvKiAgICBsaWNlbnNlIHdpdGggdGhlIGZvbnQgdmVuZG9yIG1heSBiZSBzZXBhcmF0ZWx5IHJlcXVpcmVkIHRvIHVzZSB0aGUgKi8KLSAgLyogICAgZm9udCBpbiB0aGlzIHdheS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9GU1RZUEVfSU5TVEFMTEFCTEVfRU1CRURESU5HICAgICAgICAgMHgwMDAwCi0jZGVmaW5lIEZUX0ZTVFlQRV9SRVNUUklDVEVEX0xJQ0VOU0VfRU1CRURESU5HICAweDAwMDIKLSNkZWZpbmUgRlRfRlNUWVBFX1BSRVZJRVdfQU5EX1BSSU5UX0VNQkVERElORyAgIDB4MDAwNAotI2RlZmluZSBGVF9GU1RZUEVfRURJVEFCTEVfRU1CRURESU5HICAgICAgICAgICAgMHgwMDA4Ci0jZGVmaW5lIEZUX0ZTVFlQRV9OT19TVUJTRVRUSU5HICAgICAgICAgICAgICAgICAweDAxMDAKLSNkZWZpbmUgRlRfRlNUWVBFX0JJVE1BUF9FTUJFRERJTkdfT05MWSAgICAgICAgIDB4MDIwMAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0ZTVHlwZV9GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIHRoZSBmc1R5cGUgZmxhZ3MgZm9yIGEgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGZzVHlwZSBmbGFncywgQEZUX0ZTVFlQRV9YWFguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlIHRoaXMgZnVuY3Rpb24gcmF0aGVyIHRoYW4gZGlyZWN0bHkgcmVhZGluZyB0aGUgYGZzX3R5cGUnIGZpZWxkICovCi0gIC8qICAgIGluIHRoZSBAUFNfRm9udEluZm9SZWMgc3RydWN0dXJlLCB3aGljaCBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gICAgICAqLwotICAvKiAgICByZXR1cm4gdGhlIGNvcnJlY3QgcmVzdWx0cyBmb3IgVHlwZX4xIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjMuOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfVVNob3J0ICkKLSAgRlRfR2V0X0ZTVHlwZV9GbGFncyggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGhfdmFyaWFudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR2x5cGggVmFyaWFudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIEZyZWVUeXBlfjIgaW50ZXJmYWNlIHRvIFVuaWNvZGUgSWRlb2dyYXBoaWMgVmFyaWF0aW9uICAgICAgICAgICovCi0gIC8qICAgIFNlcXVlbmNlcyAoSVZTKSwgdXNpbmcgdGhlIFNGTlQgY21hcCBmb3JtYXR+MTQuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1hbnkgQ0pLIGNoYXJhY3RlcnMgaGF2ZSB2YXJpYW50IGZvcm1zLiAgVGhleSBhcmUgYSBzb3J0IG9mIGdyZXkgICAqLwotICAvKiAgICBhcmVhIHNvbWV3aGVyZSBiZXR3ZWVuIGJlaW5nIHRvdGFsbHkgaXJyZWxldmFudCBhbmQgc2VtYW50aWNhbGx5ICAgKi8KLSAgLyogICAgZGlzdGluY3Q7IGZvciB0aGlzIHJlYXNvbiwgdGhlIFVuaWNvZGUgY29uc29ydGl1bSBkZWNpZGVkIHRvICAgICAgICovCi0gIC8qICAgIGludHJvZHVjZSBJZGVvZ3JhcGhpYyBWYXJpYXRpb24gU2VxdWVuY2VzIChJVlMpLCBjb25zaXN0aW5nIG9mIGEgICAqLwotICAvKiAgICBVbmljb2RlIGJhc2UgY2hhcmFjdGVyIGFuZCBvbmUgb2YgMjQwIHZhcmlhbnQgc2VsZWN0b3JzICAgICAgICAgICAgKi8KLSAgLyogICAgKFUrRTAxMDAtVStFMDFFRiksIGluc3RlYWQgb2YgZnVydGhlciBleHRlbmRpbmcgdGhlIGFscmVhZHkgaHVnZSAgICovCi0gIC8qICAgIGNvZGUgcmFuZ2UgZm9yIENKSyBjaGFyYWN0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gSVZTIGlzIHJlZ2lzdGVyZWQgYW5kIHVuaXF1ZTsgZm9yIGZ1cnRoZXIgZGV0YWlscyBwbGVhc2UgcmVmZXIgICovCi0gIC8qICAgIHRvIFVuaWNvZGUgVGVjaG5pY2FsIFN0YW5kYXJkICMzNywgdGhlIElkZW9ncmFwaGljIFZhcmlhdGlvbiAgICAgICAqLwotICAvKiAgICBEYXRhYmFzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzcvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVG8gZGF0ZSAoTm92ZW1iZXIgMjAxNCksIHRoZSBjaGFyYWN0ZXIgd2l0aCB0aGUgbW9zdCB2YXJpYW50cyBpcyAgICovCi0gIC8qICAgIFUrOTA4OSwgaGF2aW5nIDMyIHN1Y2ggSVZTLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQWRvYmUgYW5kIE1TIGRlY2lkZWQgdG8gc3VwcG9ydCBJVlMgd2l0aCBhIG5ldyBjbWFwIHN1YnRhYmxlICAgICAgICovCi0gIC8qICAgIChmb3JtYXR+MTQpLiAgSXQgaXMgYW4gb2RkIHN1YnRhYmxlIGJlY2F1c2UgaXQgaXMgbm90IGEgbWFwcGluZyBvZiAqLwotICAvKiAgICBpbnB1dCBjb2RlIHBvaW50cyB0byBnbHlwaHMsIGJ1dCBjb250YWlucyBsaXN0cyBvZiBhbGwgdmFyaWFudHMgICAgKi8KLSAgLyogICAgc3VwcG9ydGVkIGJ5IHRoZSBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHZhcmlhbnQgbWF5IGJlIGVpdGhlciBgZGVmYXVsdCcgb3IgYG5vbi1kZWZhdWx0Jy4gIEEgZGVmYXVsdCAgICAgKi8KLSAgLyogICAgdmFyaWFudCBpcyB0aGUgb25lIHlvdSB3aWxsIGdldCBmb3IgdGhhdCBjb2RlIHBvaW50IGlmIHlvdSBsb29rIGl0ICovCi0gIC8qICAgIHVwIGluIHRoZSBzdGFuZGFyZCBVbmljb2RlIGNtYXAuICBBIG5vbi1kZWZhdWx0IHZhcmlhbnQgaXMgYSAgICAgICAqLwotICAvKiAgICBkaWZmZXJlbnQgZ2x5cGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZV9HZXRDaGFyVmFyaWFudEluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIHRoZSBnbHlwaCBpbmRleCBvZiBhIGdpdmVuIGNoYXJhY3RlciBjb2RlIGFzIG1vZGlmaWVkIGJ5ICAgICovCi0gIC8qICAgIHRoZSB2YXJpYXRpb24gc2VsZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJjb2RlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBjaGFyYWN0ZXIgY29kZSBwb2ludCBpbiBVbmljb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZhcmlhbnRTZWxlY3RvciA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBVbmljb2RlIGNvZGUgcG9pbnQgb2YgdGhlIHZhcmlhdGlvbiBzZWxlY3Rvci4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZ2x5cGggaW5kZXguICAwfm1lYW5zIGVpdGhlciBgdW5kZWZpbmVkIGNoYXJhY3RlciBjb2RlJywgb3IgICAgKi8KLSAgLyogICAgYHVuZGVmaW5lZCBzZWxlY3RvciBjb2RlJywgb3IgYG5vIHZhcmlhdGlvbiBzZWxlY3RvciBjbWFwICAgICAgICAgICovCi0gIC8qICAgIHN1YnRhYmxlJywgb3IgYGN1cnJlbnQgQ2hhck1hcCBpcyBub3QgVW5pY29kZScuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHlvdSB1c2UgRnJlZVR5cGUgdG8gbWFuaXB1bGF0ZSB0aGUgY29udGVudHMgb2YgZm9udCBmaWxlcyAgICAgICAqLwotICAvKiAgICBkaXJlY3RseSwgYmUgYXdhcmUgdGhhdCB0aGUgZ2x5cGggaW5kZXggcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiAgKi8KLSAgLyogICAgZG9lc24ndCBhbHdheXMgY29ycmVzcG9uZCB0byB0aGUgaW50ZXJuYWwgaW5kaWNlcyB1c2VkIHdpdGhpbiAgICAgICovCi0gIC8qICAgIHRoZSBmaWxlLiAgVGhpcyBpcyBkb25lIHRvIGVuc3VyZSB0aGF0IHZhbHVlfjAgYWx3YXlzIGNvcnJlc3BvbmRzICAqLwotICAvKiAgICB0byB0aGUgYG1pc3NpbmcgZ2x5cGgnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgb25seSBtZWFuaW5nZnVsIGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGEpIHRoZSBmb250IGhhcyBhIHZhcmlhdGlvbiBzZWxlY3RvciBjbWFwIHN1YiB0YWJsZSwgICAgICAgICAgICAgKi8KLSAgLyogICAgYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgYikgdGhlIGN1cnJlbnQgY2hhcm1hcCBoYXMgYSBVbmljb2RlIGVuY29kaW5nLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDIuMy42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9VSW50ICkKLSAgRlRfRmFjZV9HZXRDaGFyVmFyaWFudEluZGV4KCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgY2hhcmNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHZhcmlhbnRTZWxlY3RvciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZV9HZXRDaGFyVmFyaWFudElzRGVmYXVsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2hlY2sgd2hldGhlciB0aGlzIHZhcmlhbnQgb2YgdGhpcyBVbmljb2RlIGNoYXJhY3RlciBpcyB0aGUgb25lIHRvICovCi0gIC8qICAgIGJlIGZvdW5kIGluIHRoZSBgY21hcCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJjb2RlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBjaGFyYWN0ZXIgY29kZXBvaW50IGluIFVuaWNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZhcmlhbnRTZWxlY3RvciA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBVbmljb2RlIGNvZGVwb2ludCBvZiB0aGUgdmFyaWF0aW9uIHNlbGVjdG9yLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAxfmlmIGZvdW5kIGluIHRoZSBzdGFuZGFyZCAoVW5pY29kZSkgY21hcCwgMH5pZiBmb3VuZCBpbiB0aGUgICAgICAgKi8KLSAgLyogICAgdmFyaWF0aW9uIHNlbGVjdG9yIGNtYXAsIG9yIC0xIGlmIGl0IGlzIG5vdCBhIHZhcmlhbnQuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgdGhlIGZvbnQgaGFzIGEgdmFyaWF0aW9uICAgICAgICovCi0gIC8qICAgIHNlbGVjdG9yIGNtYXAgc3VidGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDIuMy42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9JbnQgKQotICBGVF9GYWNlX0dldENoYXJWYXJpYW50SXNEZWZhdWx0KCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIGNoYXJjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgdmFyaWFudFNlbGVjdG9yICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlX0dldFZhcmlhbnRTZWxlY3RvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gYSB6ZXJvLXRlcm1pbmF0ZWQgbGlzdCBvZiBVbmljb2RlIHZhcmlhbnQgc2VsZWN0b3JzIGZvdW5kICAgKi8KLSAgLyogICAgaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBzZWxlY3RvciBjb2RlIHBvaW50cywgb3IgTlVMTCBpZiB0aGVyZSBpcyAqLwotICAvKiAgICBubyB2YWxpZCB2YXJpYW50IHNlbGVjdG9yIGNtYXAgc3VidGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbGFzdCBpdGVtIGluIHRoZSBhcnJheSBpc34wOyB0aGUgYXJyYXkgaXMgb3duZWQgYnkgdGhlICAgICAgICAgKi8KLSAgLyogICAgQEZUX0ZhY2Ugb2JqZWN0IGJ1dCBjYW4gYmUgb3ZlcndyaXR0ZW4gb3IgcmVsZWFzZWQgb24gdGhlIG5leHQgICAgICovCi0gIC8qICAgIGNhbGwgdG8gYSBGcmVlVHlwZSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDIuMy42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9VSW50MzIqICkKLSAgRlRfRmFjZV9HZXRWYXJpYW50U2VsZWN0b3JzKCBGVF9GYWNlICBmYWNlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlX0dldFZhcmlhbnRzT2ZDaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gYSB6ZXJvLXRlcm1pbmF0ZWQgbGlzdCBvZiBVbmljb2RlIHZhcmlhbnQgc2VsZWN0b3JzIGZvdW5kICAgKi8KLSAgLyogICAgZm9yIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcmNvZGUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGNoYXJhY3RlciBjb2RlcG9pbnQgaW4gVW5pY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgcG9pbnRlciB0byBhbiBhcnJheSBvZiB2YXJpYW50IHNlbGVjdG9yIGNvZGUgcG9pbnRzIHRoYXQgYXJlICAgICAqLwotICAvKiAgICBhY3RpdmUgZm9yIHRoZSBnaXZlbiBjaGFyYWN0ZXIsIG9yIE5VTEwgaWYgdGhlIGNvcnJlc3BvbmRpbmcgbGlzdCAgKi8KLSAgLyogICAgaXMgZW1wdHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGxhc3QgaXRlbSBpbiB0aGUgYXJyYXkgaXN+MDsgdGhlIGFycmF5IGlzIG93bmVkIGJ5IHRoZSAgICAgICAgICovCi0gIC8qICAgIEBGVF9GYWNlIG9iamVjdCBidXQgY2FuIGJlIG92ZXJ3cml0dGVuIG9yIHJlbGVhc2VkIG9uIHRoZSBuZXh0ICAgICAqLwotICAvKiAgICBjYWxsIHRvIGEgRnJlZVR5cGUgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTaW5jZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAyLjMuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfVUludDMyKiApCi0gIEZUX0ZhY2VfR2V0VmFyaWFudHNPZkNoYXIoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgY2hhcmNvZGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZhY2VfR2V0Q2hhcnNPZlZhcmlhbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiBhIHplcm8tdGVybWluYXRlZCBsaXN0IG9mIFVuaWNvZGUgY2hhcmFjdGVyIGNvZGVzIGZvdW5kIGZvciAqLwotICAvKiAgICB0aGUgc3BlY2lmaWVkIHZhcmlhbnQgc2VsZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2YXJpYW50U2VsZWN0b3IgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgdmFyaWFudCBzZWxlY3RvciBjb2RlIHBvaW50IGluIFVuaWNvZGUuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBsaXN0IG9mIGFsbCB0aGUgY29kZSBwb2ludHMgdGhhdCBhcmUgc3BlY2lmaWVkIGJ5IHRoaXMgc2VsZWN0b3IgICovCi0gIC8qICAgIChib3RoIGRlZmF1bHQgYW5kIG5vbi1kZWZhdWx0IGNvZGVzIGFyZSByZXR1cm5lZCkgb3IgTlVMTCBpZiB0aGVyZSAqLwotICAvKiAgICBpcyBubyB2YWxpZCBjbWFwIG9yIHRoZSB2YXJpYW50IHNlbGVjdG9yIGlzIGludmFsaWQuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbGFzdCBpdGVtIGluIHRoZSBhcnJheSBpc34wOyB0aGUgYXJyYXkgaXMgb3duZWQgYnkgdGhlICAgICAgICAgKi8KLSAgLyogICAgQEZUX0ZhY2Ugb2JqZWN0IGJ1dCBjYW4gYmUgb3ZlcndyaXR0ZW4gb3IgcmVsZWFzZWQgb24gdGhlIG5leHQgICAgICovCi0gIC8qICAgIGNhbGwgdG8gYSBGcmVlVHlwZSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDIuMy42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9VSW50MzIqICkKLSAgRlRfRmFjZV9HZXRDaGFyc09mVmFyaWFudCggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICB2YXJpYW50U2VsZWN0b3IgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbXB1dGF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENydW5jaGluZyBmaXhlZCBudW1iZXJzIGFuZCB2ZWN0b3JzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB2YXJpb3VzIGZ1bmN0aW9ucyB1c2VkIHRvIHBlcmZvcm0gICAgICAgICAgICAqLwotICAvKiAgICBjb21wdXRhdGlvbnMgb24gMTYuMTYgZml4ZWQtZmxvYXQgbnVtYmVycyBvciAyZCB2ZWN0b3JzLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NdWxEaXYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTXVsRml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RpdkZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Sb3VuZEZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQ2VpbEZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0Zsb29yRml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9WZWN0b3JfVHJhbnNmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTWF0cml4X011bHRpcGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01hdHJpeF9JbnZlcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NdWxEaXYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHZlcnkgc2ltcGxlIGZ1bmN0aW9uIHVzZWQgdG8gcGVyZm9ybSB0aGUgY29tcHV0YXRpb24gYChhKmIpL2MnICAgKi8KLSAgLyogICAgd2l0aCBtYXhpbXVtIGFjY3VyYWN5IChpdCB1c2VzIGEgNjQtYml0IGludGVybWVkaWF0ZSBpbnRlZ2VyICAgICAgICovCi0gIC8qICAgIHdoZW5ldmVyIG5lY2Vzc2FyeSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpc24ndCBuZWNlc3NhcmlseSBhcyBmYXN0IGFzIHNvbWUgcHJvY2Vzc29yIHNwZWNpZmljICovCi0gIC8qICAgIG9wZXJhdGlvbnMsIGJ1dCBpcyBhdCBsZWFzdCBjb21wbGV0ZWx5IHBvcnRhYmxlLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGEgOjogVGhlIGZpcnN0IG11bHRpcGxpZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiIDo6IFRoZSBzZWNvbmQgbXVsdGlwbGllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYyA6OiBUaGUgZGl2aXNvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlc3VsdCBvZiBgKGEqYikvYycuICBUaGlzIGZ1bmN0aW9uIG5ldmVyIHRyYXBzIHdoZW4gdHJ5aW5nIHRvICovCi0gIC8qICAgIGRpdmlkZSBieSB6ZXJvOyBpdCBzaW1wbHkgcmV0dXJucyBgTWF4SW50JyBvciBgTWluSW50JyBkZXBlbmRpbmcgICAqLwotICAvKiAgICBvbiB0aGUgc2lnbnMgb2YgYGEnIGFuZCBgYicuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfTG9uZyApCi0gIEZUX011bERpdiggRlRfTG9uZyAgYSwKLSAgICAgICAgICAgICBGVF9Mb25nICBiLAotICAgICAgICAgICAgIEZUX0xvbmcgIGMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX011bEZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdmVyeSBzaW1wbGUgZnVuY3Rpb24gdXNlZCB0byBwZXJmb3JtIHRoZSBjb21wdXRhdGlvbiAgICAgICAgICAgICAqLwotICAvKiAgICBgKGEqYikvMHgxMDAwMCcgd2l0aCBtYXhpbXVtIGFjY3VyYWN5LiAgTW9zdCBvZiB0aGUgdGltZSB0aGlzIGlzICAgKi8KLSAgLyogICAgdXNlZCB0byBtdWx0aXBseSBhIGdpdmVuIHZhbHVlIGJ5IGEgMTYuMTYgZml4ZWQtcG9pbnQgZmFjdG9yLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYSA6OiBUaGUgZmlyc3QgbXVsdGlwbGllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGIgOjogVGhlIHNlY29uZCBtdWx0aXBsaWVyLiAgVXNlIGEgMTYuMTYgZmFjdG9yIGhlcmUgd2hlbmV2ZXIgICAgICAqLwotICAvKiAgICAgICAgIHBvc3NpYmxlIChzZWUgbm90ZSBiZWxvdykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVzdWx0IG9mIGAoYSpiKS8weDEwMDAwJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGhhcyBiZWVuIG9wdGltaXplZCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGFic29sdXRlICAgKi8KLSAgLyogICAgdmFsdWUgb2YgYGEnIGlzIGxlc3MgdGhhbiAyMDQ4LCBhbmQgYGInIGlzIGEgMTYuMTYgc2NhbGluZyBmYWN0b3IuICovCi0gIC8qICAgIEFzIHRoaXMgaGFwcGVucyBtYWlubHkgd2hlbiBzY2FsaW5nIGZyb20gbm90aW9uYWwgdW5pdHMgdG8gICAgICAgICAqLwotICAvKiAgICBmcmFjdGlvbmFsIHBpeGVscyBpbiBGcmVlVHlwZSwgaXQgcmVzdWx0ZWQgaW4gbm90aWNlYWJsZSBzcGVlZCAgICAgKi8KLSAgLyogICAgaW1wcm92ZW1lbnRzIGJldHdlZW4gdmVyc2lvbnMgMi54IGFuZCAxLnguICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBcyBhIGNvbmNsdXNpb24sIGFsd2F5cyB0cnkgdG8gcGxhY2UgYSAxNi4xNiBmYWN0b3IgYXMgdGhlICAgICAgICAgKi8KLSAgLyogICAgX3NlY29uZF8gYXJndW1lbnQgb2YgdGhpcyBmdW5jdGlvbjsgdGhpcyBjYW4gbWFrZSBhIGdyZWF0ICAgICAgICAgICovCi0gIC8qICAgIGRpZmZlcmVuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9Mb25nICkKLSAgRlRfTXVsRml4KCBGVF9Mb25nICBhLAotICAgICAgICAgICAgIEZUX0xvbmcgIGIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RpdkZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdmVyeSBzaW1wbGUgZnVuY3Rpb24gdXNlZCB0byBwZXJmb3JtIHRoZSBjb21wdXRhdGlvbiAgICAgICAgICAgICAqLwotICAvKiAgICBgKGEqMHgxMDAwMCkvYicgd2l0aCBtYXhpbXVtIGFjY3VyYWN5LiAgTW9zdCBvZiB0aGUgdGltZSwgdGhpcyBpcyAgKi8KLSAgLyogICAgdXNlZCB0byBkaXZpZGUgYSBnaXZlbiB2YWx1ZSBieSBhIDE2LjE2IGZpeGVkLXBvaW50IGZhY3Rvci4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYSA6OiBUaGUgbnVtZXJhdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGIgOjogVGhlIGRlbm9taW5hdG9yLiAgVXNlIGEgMTYuMTYgZmFjdG9yIGhlcmUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXN1bHQgb2YgYChhKjB4MTAwMDApL2InLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9Mb25nICkKLSAgRlRfRGl2Rml4KCBGVF9Mb25nICBhLAotICAgICAgICAgICAgIEZUX0xvbmcgIGIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JvdW5kRml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdmVyeSBzaW1wbGUgZnVuY3Rpb24gdXNlZCB0byByb3VuZCBhIDE2LjE2IGZpeGVkIG51bWJlci4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGEgOjogVGhlIG51bWJlciB0byBiZSByb3VuZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGBhJyByb3VuZGVkIHRvIG5lYXJlc3QgMTYuMTYgZml4ZWQgaW50ZWdlciwgaGFsZndheSBjYXNlcyBhd2F5ICAgICAqLwotICAvKiAgICBmcm9tIHplcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRml4ZWQgKQotICBGVF9Sb3VuZEZpeCggRlRfRml4ZWQgIGEgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NlaWxGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdmVyeSBzaW1wbGUgZnVuY3Rpb24gdXNlZCB0byBjb21wdXRlIHRoZSBjZWlsaW5nIGZ1bmN0aW9uIG9mIGEgICAqLwotICAvKiAgICAxNi4xNiBmaXhlZCBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhIDo6IFRoZSBudW1iZXIgZm9yIHdoaWNoIHRoZSBjZWlsaW5nIGZ1bmN0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBgYScgcm91bmRlZCB0b3dhcmRzIHBsdXMgaW5maW5pdHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRml4ZWQgKQotICBGVF9DZWlsRml4KCBGVF9GaXhlZCAgYSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmxvb3JGaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB2ZXJ5IHNpbXBsZSBmdW5jdGlvbiB1c2VkIHRvIGNvbXB1dGUgdGhlIGZsb29yIGZ1bmN0aW9uIG9mIGEgICAgICovCi0gIC8qICAgIDE2LjE2IGZpeGVkIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGEgOjogVGhlIG51bWJlciBmb3Igd2hpY2ggdGhlIGZsb29yIGZ1bmN0aW9uIGlzIHRvIGJlIGNvbXB1dGVkLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGBhJyByb3VuZGVkIHRvd2FyZHMgbWludXMgaW5maW5pdHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9GaXhlZCApCi0gIEZUX0Zsb29yRml4KCBGVF9GaXhlZCAgYSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVmVjdG9yX1RyYW5zZm9ybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVHJhbnNmb3JtIGEgc2luZ2xlIHZlY3RvciB0aHJvdWdoIGEgMngyIG1hdHJpeC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVjdG9yIDo6IFRoZSB0YXJnZXQgdmVjdG9yIHRvIHRyYW5zZm9ybS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF0cml4IDo6IEEgcG9pbnRlciB0byB0aGUgc291cmNlIDJ4MiBtYXRyaXguICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlc3VsdCBpcyB1bmRlZmluZWQgaWYgZWl0aGVyIGB2ZWN0b3InIG9yIGBtYXRyaXgnIGlzIGludmFsaWQuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9WZWN0b3JfVHJhbnNmb3JtKCBGVF9WZWN0b3IqICAgICAgICB2ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX01hdHJpeCogIG1hdHJpeCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnVuY3Rpb25zIGFuZCBtYWNyb3MgcmVsYXRlZCB0byBGcmVlVHlwZSB2ZXJzaW9ucy4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHRob3NlIGZ1bmN0aW9ucyBhbmQgbWFjcm9zIGFyZSBvZiBsaW1pdGVkIHVzZSBiZWNhdXNlICAgICovCi0gIC8qICAgIGV2ZW4gYSBuZXcgcmVsZWFzZSBvZiBGcmVlVHlwZSB3aXRoIG9ubHkgZG9jdW1lbnRhdGlvbiBjaGFuZ2VzICAgICAqLwotICAvKiAgICBpbmNyZWFzZXMgdGhlIHZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaWJyYXJ5X1ZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZSRUVUWVBFX01BSk9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGUkVFVFlQRV9NSU5PUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlJFRVRZUEVfUEFUQ0ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlX0NoZWNrVHJ1ZVR5cGVQYXRlbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZV9TZXRVbnBhdGVudGVkSGludGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGUkVFVFlQRV9YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgRlJFRVRZUEVfWFhYCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGVzZSB0aHJlZSBtYWNyb3MgaWRlbnRpZnkgdGhlIEZyZWVUeXBlIHNvdXJjZSBjb2RlIHZlcnNpb24uCi0gICAqICAgVXNlIEBGVF9MaWJyYXJ5X1ZlcnNpb24gdG8gYWNjZXNzIHRoZW0gYXQgcnVudGltZS4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBGUkVFVFlQRV9NQUpPUiA6OiBUaGUgbWFqb3IgdmVyc2lvbiBudW1iZXIuCi0gICAqICAgRlJFRVRZUEVfTUlOT1IgOjogVGhlIG1pbm9yIHZlcnNpb24gbnVtYmVyLgotICAgKiAgIEZSRUVUWVBFX1BBVENIIDo6IFRoZSBwYXRjaCBsZXZlbC4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhlIHZlcnNpb24gbnVtYmVyIG9mIEZyZWVUeXBlIGlmIGJ1aWx0IGFzIGEgZHluYW1pYyBsaW5rIGxpYnJhcnkKLSAgICogICB3aXRoIHRoZSBgbGlidG9vbCcgcGFja2FnZSBpcyBfbm90XyBjb250cm9sbGVkIGJ5IHRoZXNlIHRocmVlCi0gICAqICAgbWFjcm9zLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlJFRVRZUEVfTUFKT1IgIDIKLSNkZWZpbmUgRlJFRVRZUEVfTUlOT1IgIDYKLSNkZWZpbmUgRlJFRVRZUEVfUEFUQ0ggIDEKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpYnJhcnlfVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgRnJlZVR5cGUgbGlicmFyeSBiZWluZyB1c2VkLiAgVGhpcyBpcyAgICAqLwotICAvKiAgICB1c2VmdWwgd2hlbiBkeW5hbWljYWxseSBsaW5raW5nIHRvIHRoZSBsaWJyYXJ5LCBzaW5jZSBvbmUgY2Fubm90ICAgKi8KLSAgLyogICAgdXNlIHRoZSBtYWNyb3MgQEZSRUVUWVBFX01BSk9SLCBARlJFRVRZUEVfTUlOT1IsIGFuZCAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGUkVFVFlQRV9QQVRDSC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBzb3VyY2UgbGlicmFyeSBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFtYWpvciAgOjogVGhlIG1ham9yIHZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYW1pbm9yICA6OiBUaGUgbWlub3IgdmVyc2lvbiBudW1iZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhcGF0Y2ggIDo6IFRoZSBwYXRjaCB2ZXJzaW9uIG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVhc29uIHdoeSB0aGlzIGZ1bmN0aW9uIHRha2VzIGEgYGxpYnJhcnknIGFyZ3VtZW50IGlzIGJlY2F1c2UgKi8KLSAgLyogICAgY2VydGFpbiBwcm9ncmFtcyBpbXBsZW1lbnQgbGlicmFyeSBpbml0aWFsaXphdGlvbiBpbiBhIGN1c3RvbSB3YXkgICovCi0gIC8qICAgIHRoYXQgZG9lc24ndCB1c2UgQEZUX0luaXRfRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW4gc3VjaCBjYXNlcywgdGhlIGxpYnJhcnkgdmVyc2lvbiBtaWdodCBub3QgYmUgYXZhaWxhYmxlIGJlZm9yZSAgICovCi0gIC8qICAgIHRoZSBsaWJyYXJ5IG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfTGlicmFyeV9WZXJzaW9uKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAqYW1ham9yLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICphbWlub3IsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgKmFwYXRjaCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZV9DaGVja1RydWVUeXBlUGF0ZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUGFyc2UgYWxsIGJ5dGVjb2RlIGluc3RydWN0aW9ucyBvZiBhIFRydWVUeXBlIGZvbnQgZmlsZSB0byBjaGVjayAgICovCi0gIC8qICAgIHdoZXRoZXIgYW55IG9mIHRoZSBwYXRlbnRlZCBvcGNvZGVzIGFyZSB1c2VkLiAgVGhpcyBpcyBvbmx5IHVzZWZ1bCAqLwotICAvKiAgICBpZiB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHVzZSB0aGUgdW5wYXRlbnRlZCBoaW50ZXIgd2l0aCAgICAgICAgICAgKi8KLSAgLyogICAgZm9udHMgdGhhdCBkbyAqbm90KiB1c2UgdGhlc2Ugb3Bjb2Rlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBwYXJzZXMgKmFsbCogZ2x5cGggaW5zdHJ1Y3Rpb25zIGluIHRoZSAgICAgKi8KLSAgLyogICAgZm9udCBmaWxlLCB3aGljaCBtYXkgYmUgc2xvdy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBBIGZhY2UgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMX5pZiB0aGlzIGlzIGEgVHJ1ZVR5cGUgZm9udCB0aGF0IHVzZXMgb25lIG9mIHRoZSBwYXRlbnRlZCAgICAgICAgICovCi0gIC8qICAgIG9wY29kZXMsIDB+b3RoZXJ3aXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNpbmNlIE1heSAyMDEwLCBUcnVlVHlwZSBoaW50aW5nIGlzIG5vIGxvbmdlciBwYXRlbnRlZC4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNpbmNlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIDIuMy41ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9Cb29sICkKLSAgRlRfRmFjZV9DaGVja1RydWVUeXBlUGF0ZW50cyggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRmFjZV9TZXRVbnBhdGVudGVkSGludGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIHVucGF0ZW50ZWQgaGludGVyIGZvciBhIGdpdmVuIGZhY2UuICAgICAgICAgICovCi0gIC8qICAgIE9ubHkgZW5hYmxlIGl0IGlmIHlvdSBoYXZlIGRldGVybWluZWQgdGhhdCB0aGUgZmFjZSBkb2Vzbid0ICAgICAgICAqLwotICAvKiAgICB1c2UgYW55IHBhdGVudGVkIG9wY29kZXMgKHNlZSBARlRfRmFjZV9DaGVja1RydWVUeXBlUGF0ZW50cykuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICA6OiBBIGZhY2UgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZhbHVlIDo6IE5ldyBib29sZWFuIHNldHRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBvbGQgc2V0dGluZyB2YWx1ZS4gIFRoaXMgd2lsbCBhbHdheXMgYmUgZmFsc2UgaWYgdGhpcyBpcyBub3QgICAqLwotICAvKiAgICBhbiBTRk5UIGZvbnQsIG9yIGlmIHRoZSB1bnBhdGVudGVkIGhpbnRlciBpcyBub3QgY29tcGlsZWQgaW4gdGhpcyAgKi8KLSAgLyogICAgaW5zdGFuY2Ugb2YgdGhlIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2luY2UgTWF5IDIwMTAsIFRydWVUeXBlIGhpbnRpbmcgaXMgbm8gbG9uZ2VyIHBhdGVudGVkLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMi4zLjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Jvb2wgKQotICBGVF9GYWNlX1NldFVucGF0ZW50ZWRIaW50aW5nKCBGVF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICB2YWx1ZSApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GUkVFVFlQRV9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRhZHZhbmMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRhZHZhbmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRkMmFlZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0YWR2YW5jLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRhZHZhbmMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFF1aWNrIGNvbXB1dGF0aW9uIG9mIGFkdmFuY2Ugd2lkdGhzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA4LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRBRFZBTkNfSF9fCi0jZGVmaW5lIF9fRlRBRFZBTkNfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzZWN0aW9uOgotICAgKiAgIHF1aWNrX2FkdmFuY2UKLSAgICoKLSAgICogQHRpdGxlOgotICAgKiAgIFF1aWNrIHJldHJpZXZhbCBvZiBhZHZhbmNlIHZhbHVlcwotICAgKgotICAgKiBAYWJzdHJhY3Q6Ci0gICAqICAgUmV0cmlldmUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgYWR2YW5jZSB2YWx1ZXMgd2l0aG91dCBwcm9jZXNzaW5nCi0gICAqICAgZ2x5cGggb3V0bGluZXMsIGlmIHBvc3NpYmxlLgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGZ1bmN0aW9ucyB0byBxdWlja2x5IGV4dHJhY3QgYWR2YW5jZSB2YWx1ZXMKLSAgICogICB3aXRob3V0IGhhbmRsaW5nIGdseXBoIG91dGxpbmVzLCBpZiBwb3NzaWJsZS4KLSAgICoKLSAgICogQG9yZGVyOgotICAgKiAgIEZUX0dldF9BZHZhbmNlCi0gICAqICAgRlRfR2V0X0FkdmFuY2VzCi0gICAqCi0gICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Q29uc3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQURWQU5DRV9GTEFHX0ZBU1RfT05MWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBiaXQtZmxhZyB0byBiZSBPUi1lZCB3aXRoIHRoZSBgZmxhZ3MnIHBhcmFtZXRlciBvZiB0aGUgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9HZXRfQWR2YW5jZSBhbmQgQEZUX0dldF9BZHZhbmNlcyBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgc2V0LCBpdCBpbmRpY2F0ZXMgdGhhdCB5b3Ugd2FudCB0aGVzZSBmdW5jdGlvbnMgdG8gZmFpbCBpZiB0aGUgICovCi0gIC8qICAgIGNvcnJlc3BvbmRpbmcgaGludGluZyBtb2RlIG9yIGZvbnQgZHJpdmVyIGRvZXNuJ3QgYWxsb3cgZm9yIHZlcnkgICAqLwotICAvKiAgICBxdWljayBhZHZhbmNlIGNvbXB1dGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFR5cGljYWxseSwgZ2x5cGhzIHRoYXQgYXJlIGVpdGhlciB1bnNjYWxlZCwgdW5oaW50ZWQsIGJpdG1hcHBlZCwgICAqLwotICAvKiAgICBvciBsaWdodC1oaW50ZWQgY2FuIGhhdmUgdGhlaXIgYWR2YW5jZSB3aWR0aCBjb21wdXRlZCB2ZXJ5ICAgICAgICAgKi8KLSAgLyogICAgcXVpY2tseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3JtYWwgYW5kIGJ5dGVjb2RlIGhpbnRlZCBtb2RlcyB0aGF0IHJlcXVpcmUgbG9hZGluZywgc2NhbGluZywgICAgKi8KLSAgLyogICAgYW5kIGhpbnRpbmcgb2YgdGhlIGdseXBoIG91dGxpbmUsIGFyZSBleHRyZW1lbHkgc2xvdyBieSAgICAgICAgICAgICovCi0gIC8qICAgIGNvbXBhcmlzb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfQURWQU5DRV9GTEFHX0ZBU1RfT05MWSAgMHgyMDAwMDAwMEwKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9BZHZhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlIHRoZSBhZHZhbmNlIHZhbHVlIG9mIGEgZ2l2ZW4gZ2x5cGggb3V0bGluZSBpbiBhbiAgICAgICAgICAqLwotICAvKiAgICBARlRfRmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgIDo6IFRoZSBzb3VyY2UgQEZUX0ZhY2UgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdpbmRleCAgICAgOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9mbGFncyA6OiBBIHNldCBvZiBiaXQgZmxhZ3Mgc2ltaWxhciB0byB0aG9zZSB1c2VkIHdoZW4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgY2FsbGluZyBARlRfTG9hZF9HbHlwaCwgdXNlZCB0byBkZXRlcm1pbmUgd2hhdCBraW5kICAqLwotICAvKiAgICAgICAgICAgICAgICAgIG9mIGFkdmFuY2VzIHlvdSBuZWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhZHZhbmNlIDo6IFRoZSBhZHZhbmNlIHZhbHVlLiAgSWYgc2NhbGluZyBpcyBwZXJmb3JtZWQgKGJhc2VkIG9uICAqLwotICAvKiAgICAgICAgICAgICAgICB0aGUgdmFsdWUgb2YgYGxvYWRfZmxhZ3MnKSwgdGhlIGFkdmFuY2UgdmFsdWUgaXMgaW4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgMTYuMTYgZm9ybWF0LiAgT3RoZXJ3aXNlLCBpdCBpcyBpbiBmb250IHVuaXRzLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBJZiBARlRfTE9BRF9WRVJUSUNBTF9MQVlPVVQgaXMgc2V0LCB0aGlzIGlzIHRoZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgdmVydGljYWwgYWR2YW5jZSBjb3JyZXNwb25kaW5nIHRvIGEgdmVydGljYWwgbGF5b3V0LiAgICovCi0gIC8qICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgaXQgaXMgdGhlIGhvcml6b250YWwgYWR2YW5jZSBpbiBhICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBob3Jpem9udGFsIGxheW91dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIG1heSBmYWlsIGlmIHlvdSB1c2UgQEZUX0FEVkFOQ0VfRkxBR19GQVNUX09OTFkgYW5kICAgKi8KLSAgLyogICAgaWYgdGhlIGNvcnJlc3BvbmRpbmcgZm9udCBiYWNrZW5kIGRvZXNuJ3QgaGF2ZSBhIHF1aWNrIHdheSB0byAgICAgICovCi0gIC8qICAgIHJldHJpZXZlIHRoZSBhZHZhbmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzY2FsZWQgYWR2YW5jZSBpcyByZXR1cm5lZCBpbiAxNi4xNiBmb3JtYXQgYnV0IGlzbid0IHRyYW5zZm9ybWVkICovCi0gIC8qICAgIGJ5IHRoZSBhZmZpbmUgdHJhbnNmb3JtYXRpb24gc3BlY2lmaWVkIGJ5IEBGVF9TZXRfVHJhbnNmb3JtLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9BZHZhbmNlKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgbG9hZF9mbGFncywKLSAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAqcGFkdmFuY2UgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9BZHZhbmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlIHRoZSBhZHZhbmNlIHZhbHVlcyBvZiBzZXZlcmFsIGdseXBoIG91dGxpbmVzIGluIGFuICAgICAgICAqLwotICAvKiAgICBARlRfRmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICA6OiBUaGUgc291cmNlIEBGVF9GYWNlIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0YXJ0ICAgICAgIDo6IFRoZSBmaXJzdCBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY291bnQgICAgICAgOjogVGhlIG51bWJlciBvZiBhZHZhbmNlIHZhbHVlcyB5b3Ugd2FudCB0byByZXRyaWV2ZS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkX2ZsYWdzICA6OiBBIHNldCBvZiBiaXQgZmxhZ3Mgc2ltaWxhciB0byB0aG9zZSB1c2VkIHdoZW4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgY2FsbGluZyBARlRfTG9hZF9HbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFkdmFuY2UgOjogVGhlIGFkdmFuY2UgdmFsdWVzLiAgVGhpcyBhcnJheSwgdG8gYmUgcHJvdmlkZWQgYnkgdGhlICovCi0gIC8qICAgICAgICAgICAgICAgIGNhbGxlciwgbXVzdCBjb250YWluIGF0IGxlYXN0IGBjb3VudCcgZWxlbWVudHMuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgSWYgc2NhbGluZyBpcyBwZXJmb3JtZWQgKGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIGBsb2FkX2ZsYWdzJyksIHRoZSBhZHZhbmNlIHZhbHVlcyBhcmUgaW4gMTYuMTYgZm9ybWF0LiAqLwotICAvKiAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZXkgYXJlIGluIGZvbnQgdW5pdHMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIElmIEBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCBpcyBzZXQsIHRoZXNlIGFyZSB0aGUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICB2ZXJ0aWNhbCBhZHZhbmNlcyBjb3JyZXNwb25kaW5nIHRvIGEgdmVydGljYWwgbGF5b3V0LiAgKi8KLSAgLyogICAgICAgICAgICAgICAgT3RoZXJ3aXNlLCB0aGV5IGFyZSB0aGUgaG9yaXpvbnRhbCBhZHZhbmNlcyBpbiBhICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIGhvcml6b250YWwgbGF5b3V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gbWF5IGZhaWwgaWYgeW91IHVzZSBARlRfQURWQU5DRV9GTEFHX0ZBU1RfT05MWSBhbmQgICAqLwotICAvKiAgICBpZiB0aGUgY29ycmVzcG9uZGluZyBmb250IGJhY2tlbmQgZG9lc24ndCBoYXZlIGEgcXVpY2sgd2F5IHRvICAgICAgKi8KLSAgLyogICAgcmV0cmlldmUgdGhlIGFkdmFuY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTY2FsZWQgYWR2YW5jZXMgYXJlIHJldHVybmVkIGluIDE2LjE2IGZvcm1hdCBidXQgYXJlbid0ICAgICAgICAgICAgKi8KLSAgLyogICAgdHJhbnNmb3JtZWQgYnkgdGhlIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBzcGVjaWZpZWQgYnkgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9TZXRfVHJhbnNmb3JtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9BZHZhbmNlcyggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgIGxvYWRfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICpwYWR2YW5jZXMgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRBRFZBTkNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0YXV0b2guaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRhdXRvaC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjM5YzIxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRhdXRvaC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0YXV0b2guaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBBUEkgZm9yIGNvbnRyb2xsaW5nIHRoZSBhdXRvLWhpbnRlciAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUQVVUT0hfSF9fCi0jZGVmaW5lIF9fRlRBVVRPSF9IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzZWN0aW9uOgotICAgKiAgIGF1dG9faGludGVyCi0gICAqCi0gICAqIEB0aXRsZToKLSAgICogICBUaGUgYXV0by1oaW50ZXIKLSAgICoKLSAgICogQGFic3RyYWN0OgotICAgKiAgIENvbnRyb2xsaW5nIHRoZSBhdXRvLWhpbnRpbmcgbW9kdWxlLgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgV2hpbGUgRnJlZVR5cGUncyBhdXRvLWhpbnRlciBkb2Vzbid0IGV4cG9zZSBBUEkgZnVuY3Rpb25zIGJ5IGl0c2VsZiwKLSAgICogICBpdCBpcyBwb3NzaWJsZSB0byBjb250cm9sIGl0cyBiZWhhdmlvdXIgd2l0aCBARlRfUHJvcGVydHlfU2V0IGFuZAotICAgKiAgIEBGVF9Qcm9wZXJ0eV9HZXQuICBUaGUgZm9sbG93aW5nIGxpc3RzIHRoZSBhdmFpbGFibGUgcHJvcGVydGllcwotICAgKiAgIHRvZ2V0aGVyIHdpdGggdGhlIG5lY2Vzc2FyeSBtYWNyb3MgYW5kIHN0cnVjdHVyZXMuCi0gICAqCi0gICAqICAgTm90ZSB0aGF0IHRoZSBhdXRvLWhpbnRlcidzIG1vZHVsZSBuYW1lIGlzIGBhdXRvZml0dGVyJyBmb3IKLSAgICogICBoaXN0b3JpY2FsIHJlYXNvbnMuCi0gICAqCi0gICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBwcm9wZXJ0eToKLSAgICogICBnbHlwaC10by1zY3JpcHQtbWFwCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICAqRXhwZXJpbWVudGFsKiAqb25seSoKLSAgICoKLSAgICogICBUaGUgYXV0by1oaW50ZXIgcHJvdmlkZXMgdmFyaW91cyBzY3JpcHQgbW9kdWxlcyB0byBoaW50IGdseXBocy4KLSAgICogICBFeGFtcGxlcyBvZiBzdXBwb3J0ZWQgc2NyaXB0cyBhcmUgTGF0aW4gb3IgQ0pLLiAgQmVmb3JlIGEgZ2x5cGggaXMKLSAgICogICBhdXRvLWhpbnRlZCwgdGhlIFVuaWNvZGUgY2hhcmFjdGVyIG1hcCBvZiB0aGUgZm9udCBnZXRzIGV4YW1pbmVkLCBhbmQKLSAgICogICB0aGUgc2NyaXB0IGlzIHRoZW4gZGV0ZXJtaW5lZCBiYXNlZCBvbiBVbmljb2RlIGNoYXJhY3RlciByYW5nZXMsIHNlZQotICAgKiAgIGJlbG93LgotICAgKgotICAgKiAgIE9wZW5UeXBlIGZvbnRzLCBob3dldmVyLCBvZnRlbiBwcm92aWRlIG11Y2ggbW9yZSBnbHlwaHMgdGhhbgotICAgKiAgIGNoYXJhY3RlciBjb2RlcyAoc21hbGwgY2Fwcywgc3VwZXJzY3JpcHRzLCBsaWdhdHVyZXMsIHN3YXNoZXMsIGV0Yy4pLAotICAgKiAgIHRvIGJlIGNvbnRyb2xsZWQgYnkgc28tY2FsbGVkIGBmZWF0dXJlcycuICBIYW5kbGluZyBPcGVuVHlwZSBmZWF0dXJlcwotICAgKiAgIGNhbiBiZSBxdWl0ZSBjb21wbGljYXRlZCBhbmQgdGh1cyBuZWVkcyBhIHNlcGFyYXRlIGxpYnJhcnkgb24gdG9wIG9mCi0gICAqICAgRnJlZVR5cGUuCi0gICAqCi0gICAqICAgVGhlIG1hcHBpbmcgYmV0d2VlbiBnbHlwaCBpbmRpY2VzIGFuZCBzY3JpcHRzIChpbiB0aGUgYXV0by1oaW50ZXIKLSAgICogICBzZW5zZSwgc2VlIHRoZSBARlRfQVVUT0hJTlRFUl9TQ1JJUFRfWFhYIHZhbHVlcykgaXMgc3RvcmVkIGFzIGFuCi0gICAqICAgYXJyYXkgd2l0aCBgbnVtX2dseXBocycgZWxlbWVudHMsIGFzIGZvdW5kIGluIHRoZSBmb250J3MgQEZUX0ZhY2UKLSAgICogICBzdHJ1Y3R1cmUuICBUaGUgYGdseXBoLXRvLXNjcmlwdC1tYXAnIHByb3BlcnR5IHJldHVybnMgYSBwb2ludGVyIHRvCi0gICAqICAgdGhpcyBhcnJheSwgd2hpY2ggY2FuIGJlIG1vZGlmaWVkIGFzIG5lZWRlZC4gIE5vdGUgdGhhdCB0aGUKLSAgICogICBtb2RpZmljYXRpb24gc2hvdWxkIGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IGdseXBoIGdldHMgcHJvY2Vzc2VkIGJ5Ci0gICAqICAgdGhlIGF1dG8taGludGVyIHNvIHRoYXQgdGhlIGdsb2JhbCBhbmFseXNpcyBvZiB0aGUgZm9udCBzaGFwZXMKLSAgICogICBhY3R1YWxseSB1c2VzIHRoZSBtb2RpZmllZCBtYXBwaW5nLgotICAgKgotICAgKiAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjb2RlIGRlbW9uc3RyYXRlcyBob3cgdG8gYWNjZXNzIGl0IChvbWl0dGluZwotICAgKiAgIHRoZSBlcnJvciBoYW5kbGluZykuCi0gICAqCi0gICAqICAgewotICAgKiAgICAgRlRfTGlicmFyeSAgICAgICAgICAgICAgICBsaWJyYXJ5OwotICAgKiAgICAgRlRfRmFjZSAgICAgICAgICAgICAgICAgICBmYWNlOwotICAgKiAgICAgRlRfUHJvcF9HbHlwaFRvU2NyaXB0TWFwICBwcm9wOwotICAgKgotICAgKgotICAgKiAgICAgRlRfSW5pdF9GcmVlVHlwZSggJmxpYnJhcnkgKTsKLSAgICogICAgIEZUX05ld19GYWNlKCBsaWJyYXJ5LCAiZm9vLnR0ZiIsIDAsICZmYWNlICk7Ci0gICAqCi0gICAqICAgICBwcm9wLmZhY2UgPSBmYWNlOwotICAgKgotICAgKiAgICAgRlRfUHJvcGVydHlfR2V0KCBsaWJyYXJ5LCAiYXV0b2ZpdHRlciIsCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbHlwaC10by1zY3JpcHQtbWFwIiwgJnByb3AgKTsKLSAgICoKLSAgICogICAgIC8vIGFkanVzdCBgcHJvcC5tYXAnIGFzIG5lZWRlZCByaWdodCBoZXJlCi0gICAqCi0gICAqICAgICBGVF9Mb2FkX0dseXBoKCBmYWNlLCAuLi4sIEZUX0xPQURfRk9SQ0VfQVVUT0hJTlQgKTsKLSAgICogICB9Ci0gICAqCi0gICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIEZUX0FVVE9ISU5URVJfU0NSSVBUX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgKkV4cGVyaW1lbnRhbCogKm9ubHkqCi0gICAqCi0gICAqICAgQSBsaXN0IG9mIGNvbnN0YW50cyB1c2VkIGZvciB0aGUgQGdseXBoLXRvLXNjcmlwdC1tYXAgcHJvcGVydHkgdG8KLSAgICogICBzcGVjaWZ5IHRoZSBzY3JpcHQgc3VibW9kdWxlIHRoZSBhdXRvLWhpbnRlciBzaG91bGQgdXNlIGZvciBoaW50aW5nIGEKLSAgICogICBwYXJ0aWN1bGFyIGdseXBoLgotICAgKgotICAgKiBAdmFsdWVzOgotICAgKiAgIEZUX0FVVE9ISU5URVJfU0NSSVBUX05PTkUgOjoKLSAgICogICAgIERvbid0IGF1dG8taGludCB0aGlzIGdseXBoLgotICAgKgotICAgKiAgIEZUX0FVVE9ISU5URVJfU0NSSVBUX0xBVElOIDo6Ci0gICAqICAgICBBcHBseSB0aGUgbGF0aW4gYXV0by1oaW50ZXIuICBGb3IgdGhlIGF1dG8taGludGVyLCBgbGF0aW4nIGlzIGEKLSAgICogICAgIHZlcnkgYnJvYWQgdGVybSwgaW5jbHVkaW5nIEN5cmlsbGljIGFuZCBHcmVlayBhbHNvIHNpbmNlIGNoYXJhY3RlcnMKLSAgICogICAgIGZyb20gdGhvc2Ugc2NyaXB0cyBzaGFyZSB0aGUgc2FtZSBkZXNpZ24gY29uc3RyYWludHMuCi0gICAqCi0gICAqICAgICBCeSBkZWZhdWx0LCBjaGFyYWN0ZXJzIGZyb20gdGhlIGZvbGxvd2luZyBVbmljb2RlIHJhbmdlcyBhcmUKLSAgICogICAgIGFzc2lnbmVkIHRvIHRoaXMgc3VibW9kdWxlLgotICAgKgotICAgKiAgICAgewotICAgKiAgICAgICBVKzAwMjAgLSBVKzAwN0YgIC8vIEJhc2ljIExhdGluIChubyBjb250cm9sIGNoYXJhY3RlcnMpCi0gICAqICAgICAgIFUrMDBBMCAtIFUrMDBGRiAgLy8gTGF0aW4tMSBTdXBwbGVtZW50IChubyBjb250cm9sIGNoYXJhY3RlcnMpCi0gICAqICAgICAgIFUrMDEwMCAtIFUrMDE3RiAgLy8gTGF0aW4gRXh0ZW5kZWQtQQotICAgKiAgICAgICBVKzAxODAgLSBVKzAyNEYgIC8vIExhdGluIEV4dGVuZGVkLUIKLSAgICogICAgICAgVSswMjUwIC0gVSswMkFGICAvLyBJUEEgRXh0ZW5zaW9ucwotICAgKiAgICAgICBVKzAyQjAgLSBVKzAyRkYgIC8vIFNwYWNpbmcgTW9kaWZpZXIgTGV0dGVycwotICAgKiAgICAgICBVKzAzMDAgLSBVKzAzNkYgIC8vIENvbWJpbmluZyBEaWFjcml0aWNhbCBNYXJrcwotICAgKiAgICAgICBVKzAzNzAgLSBVKzAzRkYgIC8vIEdyZWVrIGFuZCBDb3B0aWMKLSAgICogICAgICAgVSswNDAwIC0gVSswNEZGICAvLyBDeXJpbGxpYwotICAgKiAgICAgICBVKzA1MDAgLSBVKzA1MkYgIC8vIEN5cmlsbGljIFN1cHBsZW1lbnQKLSAgICogICAgICAgVSsxRDAwIC0gVSsxRDdGICAvLyBQaG9uZXRpYyBFeHRlbnNpb25zCi0gICAqICAgICAgIFUrMUQ4MCAtIFUrMURCRiAgLy8gUGhvbmV0aWMgRXh0ZW5zaW9ucyBTdXBwbGVtZW50Ci0gICAqICAgICAgIFUrMURDMCAtIFUrMURGRiAgLy8gQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzIFN1cHBsZW1lbnQKLSAgICogICAgICAgVSsxRTAwIC0gVSsxRUZGICAvLyBMYXRpbiBFeHRlbmRlZCBBZGRpdGlvbmFsCi0gICAqICAgICAgIFUrMUYwMCAtIFUrMUZGRiAgLy8gR3JlZWsgRXh0ZW5kZWQKLSAgICogICAgICAgVSsyMDAwIC0gVSsyMDZGICAvLyBHZW5lcmFsIFB1bmN0dWF0aW9uCi0gICAqICAgICAgIFUrMjA3MCAtIFUrMjA5RiAgLy8gU3VwZXJzY3JpcHRzIGFuZCBTdWJzY3JpcHRzCi0gICAqICAgICAgIFUrMjBBMCAtIFUrMjBDRiAgLy8gQ3VycmVuY3kgU3ltYm9scwotICAgKiAgICAgICBVKzIxNTAgLSBVKzIxOEYgIC8vIE51bWJlciBGb3JtcwotICAgKiAgICAgICBVKzI0NjAgLSBVKzI0RkYgIC8vIEVuY2xvc2VkIEFscGhhbnVtZXJpY3MKLSAgICogICAgICAgVSsyQzYwIC0gVSsyQzdGICAvLyBMYXRpbiBFeHRlbmRlZC1DCi0gICAqICAgICAgIFUrMkRFMCAtIFUrMkRGRiAgLy8gQ3lyaWxsaWMgRXh0ZW5kZWQtQQotICAgKiAgICAgICBVKzJFMDAgLSBVKzJFN0YgIC8vIFN1cHBsZW1lbnRhbCBQdW5jdHVhdGlvbgotICAgKiAgICAgICBVK0E2NDAgLSBVK0E2OUYgIC8vIEN5cmlsbGljIEV4dGVuZGVkLUIKLSAgICogICAgICAgVStBNzIwIC0gVStBN0ZGICAvLyBMYXRpbiBFeHRlbmRlZC1ECi0gICAqICAgICAgIFUrRkIwMCAtIFUrRkIwNiAgLy8gQWxwaGFiLiBQcmVzZW50LiBGb3JtcyAoTGF0aW4gTGlnYXR1cmVzKQotICAgKiAgICAgIFUrMUQ0MDAgLSBVKzFEN0ZGIC8vIE1hdGhlbWF0aWNhbCBBbHBoYW51bWVyaWMgU3ltYm9scwotICAgKiAgICAgIFUrMUYxMDAgLSBVKzFGMUZGIC8vIEVuY2xvc2VkIEFscGhhbnVtZXJpYyBTdXBwbGVtZW50Ci0gICAqICAgICB9Ci0gICAqCi0gICAqICAgRlRfQVVUT0hJTlRFUl9TQ1JJUFRfQ0pLIDo6Ci0gICAqICAgICBBcHBseSB0aGUgQ0pLIGF1dG8taGludGVyLCBjb3ZlcmluZyBDaGluZXNlLCBKYXBhbmVzZSwgS29yZWFuLCBvbGQKLSAgICogICAgIFZpZXRuYW1lc2UsIGFuZCBzb21lIG90aGVyIHNjcmlwdHMuCi0gICAqCi0gICAqICAgICBCeSBkZWZhdWx0LCBjaGFyYWN0ZXJzIGZyb20gdGhlIGZvbGxvd2luZyBVbmljb2RlIHJhbmdlcyBhcmUKLSAgICogICAgIGFzc2lnbmVkIHRvIHRoaXMgc3VibW9kdWxlLgotICAgKgotICAgKiAgICAgewotICAgKiAgICAgICBVKzExMDAgLSBVKzExRkYgIC8vIEhhbmd1bCBKYW1vCi0gICAqICAgICAgIFUrMkU4MCAtIFUrMkVGRiAgLy8gQ0pLIFJhZGljYWxzIFN1cHBsZW1lbnQKLSAgICogICAgICAgVSsyRjAwIC0gVSsyRkRGICAvLyBLYW5neGkgUmFkaWNhbHMKLSAgICogICAgICAgVSsyRkYwIC0gVSsyRkZGICAvLyBJZGVvZ3JhcGhpYyBEZXNjcmlwdGlvbiBDaGFyYWN0ZXJzCi0gICAqICAgICAgIFUrMzAwMCAtIFUrMzAzRiAgLy8gQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uCi0gICAqICAgICAgIFUrMzA0MCAtIFUrMzA5RiAgLy8gSGlyYWdhbmEKLSAgICogICAgICAgVSszMEEwIC0gVSszMEZGICAvLyBLYXRha2FuYQotICAgKiAgICAgICBVKzMxMDAgLSBVKzMxMkYgIC8vIEJvcG9tb2ZvCi0gICAqICAgICAgIFUrMzEzMCAtIFUrMzE4RiAgLy8gSGFuZ3VsIENvbXBhdGliaWxpdHkgSmFtbwotICAgKiAgICAgICBVKzMxOTAgLSBVKzMxOUYgIC8vIEthbmJ1bgotICAgKiAgICAgICBVKzMxQTAgLSBVKzMxQkYgIC8vIEJvcG9tb2ZvIEV4dGVuZGVkCi0gICAqICAgICAgIFUrMzFDMCAtIFUrMzFFRiAgLy8gQ0pLIFN0cm9rZXMKLSAgICogICAgICAgVSszMUYwIC0gVSszMUZGICAvLyBLYXRha2FuYSBQaG9uZXRpYyBFeHRlbnNpb25zCi0gICAqICAgICAgIFUrMzIwMCAtIFUrMzJGRiAgLy8gRW5jbG9zZWQgQ0pLIExldHRlcnMgYW5kIE1vbnRocwotICAgKiAgICAgICBVKzMzMDAgLSBVKzMzRkYgIC8vIENKSyBDb21wYXRpYmlsaXR5Ci0gICAqICAgICAgIFUrMzQwMCAtIFUrNERCRiAgLy8gQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQQotICAgKiAgICAgICBVKzREQzAgLSBVKzRERkYgIC8vIFlpamluZyBIZXhhZ3JhbSBTeW1ib2xzCi0gICAqICAgICAgIFUrNEUwMCAtIFUrOUZGRiAgLy8gQ0pLIFVuaWZpZWQgSWRlb2dyYXBocwotICAgKiAgICAgICBVK0E5NjAgLSBVK0E5N0YgIC8vIEhhbmd1bCBKYW1vIEV4dGVuZGVkLUEKLSAgICogICAgICAgVStBQzAwIC0gVStEN0FGICAvLyBIYW5ndWwgU3lsbGFibGVzCi0gICAqICAgICAgIFUrRDdCMCAtIFUrRDdGRiAgLy8gSGFuZ3VsIEphbW8gRXh0ZW5kZWQtQgotICAgKiAgICAgICBVK0Y5MDAgLSBVK0ZBRkYgIC8vIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMKLSAgICogICAgICAgVStGRTEwIC0gVStGRTFGICAvLyBWZXJ0aWNhbCBmb3JtcwotICAgKiAgICAgICBVK0ZFMzAgLSBVK0ZFNEYgIC8vIENKSyBDb21wYXRpYmlsaXR5IEZvcm1zCi0gICAqICAgICAgIFUrRkYwMCAtIFUrRkZFRiAgLy8gSGFsZndpZHRoIGFuZCBGdWxsd2lkdGggRm9ybXMKLSAgICogICAgICBVKzFCMDAwIC0gVSsxQjBGRiAvLyBLYW5hIFN1cHBsZW1lbnQKLSAgICogICAgICBVKzFEMzAwIC0gVSsxRDM1RiAvLyBUYWkgWHVhbiBIaW5nIFN5bWJvbHMKLSAgICogICAgICBVKzFGMjAwIC0gVSsxRjJGRiAvLyBFbmNsb3NlZCBJZGVvZ3JhcGhpYyBTdXBwbGVtZW50Ci0gICAqICAgICAgVSsyMDAwMCAtIFUrMkE2REYgLy8gQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQgotICAgKiAgICAgIFUrMkE3MDAgLSBVKzJCNzNGIC8vIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEMKLSAgICogICAgICBVKzJCNzQwIC0gVSsyQjgxRiAvLyBDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBECi0gICAqICAgICAgVSsyRjgwMCAtIFUrMkZBMUYgLy8gQ0pLIENvbXBhdGliaWxpdHkgSWRlb2dyYXBocyBTdXBwbGVtZW50Ci0gICAqICAgICB9Ci0gICAqCi0gICAqICAgRlRfQVVUT0hJTlRFUl9TQ1JJUFRfSU5ESUMgOjoKLSAgICogICAgIEFwcGx5IHRoZSBpbmRpYyBhdXRvLWhpbnRlciwgY292ZXJpbmcgYWxsIG1ham9yIHNjcmlwdHMgZnJvbSB0aGUKLSAgICogICAgIEluZGlhbiBzdWItY29udGluZW50IGFuZCBzb21lIG90aGVyIHJlbGF0ZWQgc2NyaXB0cyBsaWtlIFRoYWksIExhbywKLSAgICogICAgIG9yIFRpYmV0YW4uCi0gICAqCi0gICAqICAgICBCeSBkZWZhdWx0LCBjaGFyYWN0ZXJzIGZyb20gdGhlIGZvbGxvd2luZyBVbmljb2RlIHJhbmdlcyBhcmUKLSAgICogICAgIGFzc2lnbmVkIHRvIHRoaXMgc3VibW9kdWxlLgotICAgKgotICAgKiAgICAgewotICAgKiAgICAgICBVKzA5MDAgLSBVKzBERkYgIC8vIEluZGljIFJhbmdlCi0gICAqICAgICAgIFUrMEYwMCAtIFUrMEZGRiAgLy8gVGliZXRhbgotICAgKiAgICAgICBVKzE5MDAgLSBVKzE5NEYgIC8vIExpbWJ1Ci0gICAqICAgICAgIFUrMUI4MCAtIFUrMUJCRiAgLy8gU3VuZGFuZXNlCi0gICAqICAgICAgIFUrMUM4MCAtIFUrMUNERiAgLy8gTWVldGVpIE1heWFrCi0gICAqICAgICAgIFUrQTgwMCAtIFUrQTgyRiAgLy8gU3lsb3RpIE5hZ3JpCi0gICAqICAgICAgVSsxMTgwMCAtIFUrMTE4REYgLy8gU2hhcmFkYQotICAgKiAgICAgfQotICAgKgotICAgKiAgICAgTm90ZSB0aGF0IGN1cnJlbnRseSBJbmRpYyBzdXBwb3J0IGlzIHJ1ZGltZW50YXJ5IG9ubHksIG1pc3NpbmcgYmx1ZQotICAgKiAgICAgem9uZSBzdXBwb3J0LgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQVVUT0hJTlRFUl9TQ1JJUFRfTk9ORSAgIDAKLSNkZWZpbmUgRlRfQVVUT0hJTlRFUl9TQ1JJUFRfTEFUSU4gIDEKLSNkZWZpbmUgRlRfQVVUT0hJTlRFUl9TQ1JJUFRfQ0pLICAgIDIKLSNkZWZpbmUgRlRfQVVUT0hJTlRFUl9TQ1JJUFRfSU5ESUMgIDMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc3RydWN0OgotICAgKiAgIEZUX1Byb3BfR2x5cGhUb1NjcmlwdE1hcAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgKkV4cGVyaW1lbnRhbCogKm9ubHkqCi0gICAqCi0gICAqICAgVGhlIGRhdGEgZXhjaGFuZ2Ugc3RydWN0dXJlIGZvciB0aGUgQGdseXBoLXRvLXNjcmlwdC1tYXAgcHJvcGVydHkuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfUHJvcF9HbHlwaFRvU2NyaXB0TWFwXwotICB7Ci0gICAgRlRfRmFjZSAgICAgZmFjZTsKLSAgICBGVF9VU2hvcnQqICBtYXA7Ci0KLSAgfSBGVF9Qcm9wX0dseXBoVG9TY3JpcHRNYXA7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHByb3BlcnR5OgotICAgKiAgIGZhbGxiYWNrLXNjcmlwdAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgKkV4cGVyaW1lbnRhbCogKm9ubHkqCi0gICAqCi0gICAqICAgSWYgbm8gYXV0by1oaW50ZXIgc2NyaXB0IG1vZHVsZSBjYW4gYmUgYXNzaWduZWQgdG8gYSBnbHlwaCwgYQotICAgKiAgIGZhbGxiYWNrIHNjcmlwdCBnZXRzIGFzc2lnbmVkIHRvIGl0IChzZWUgYWxzbyB0aGUKLSAgICogICBAZ2x5cGgtdG8tc2NyaXB0LW1hcCBwcm9wZXJ0eSkuICBCeSBkZWZhdWx0LCB0aGlzIGlzCi0gICAqICAgQEZUX0FVVE9ISU5URVJfU0NSSVBUX0NKSy4gIFVzaW5nIHRoZSBgZmFsbGJhY2stc2NyaXB0JyBwcm9wZXJ0eSwKLSAgICogICB0aGlzIGZhbGxiYWNrIHZhbHVlIGNhbiBiZSBjaGFuZ2VkLgotICAgKgotICAgKiAgIHsKLSAgICogICAgIEZUX0xpYnJhcnkgIGxpYnJhcnk7Ci0gICAqICAgICBGVF9VSW50ICAgICBmYWxsYmFja19zY3JpcHQgPSBGVF9BVVRPSElOVEVSX1NDUklQVF9OT05FOwotICAgKgotICAgKgotICAgKiAgICAgRlRfSW5pdF9GcmVlVHlwZSggJmxpYnJhcnkgKTsKLSAgICoKLSAgICogICAgIEZUX1Byb3BlcnR5X1NldCggbGlicmFyeSwgImF1dG9maXR0ZXIiLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFsbGJhY2stc2NyaXB0IiwgJmZhbGxiYWNrX3NjcmlwdCApOwotICAgKiAgIH0KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB3aXRoIEBGVF9Qcm9wZXJ0eV9HZXQgYWxzby4KLSAgICoKLSAgICogICBJdCdzIGltcG9ydGFudCB0byB1c2UgdGhlIHJpZ2h0IHRpbWluZyBmb3IgY2hhbmdpbmcgdGhpcyB2YWx1ZTogVGhlCi0gICAqICAgY3JlYXRpb24gb2YgdGhlIGdseXBoLXRvLXNjcmlwdCBtYXAgdGhhdCBldmVudHVhbGx5IHVzZXMgdGhlCi0gICAqICAgZmFsbGJhY2sgc2NyaXB0IHZhbHVlIGdldHMgdHJpZ2dlcmVkIGVpdGhlciBieSBzZXR0aW5nIG9yIHJlYWRpbmcgYQotICAgKiAgIGZhY2Utc3BlY2lmaWMgcHJvcGVydHkgbGlrZSBAZ2x5cGgtdG8tc2NyaXB0LW1hcCwgb3IgYnkgYXV0by1oaW50aW5nCi0gICAqICAgYW55IGdseXBoIGZyb20gdGhhdCBmYWNlLiAgSW4gcGFydGljdWxhciwgaWYgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkCi0gICAqICAgYW4gQEZUX0ZhY2Ugc3RydWN0dXJlIGJ1dCBub3QgbG9hZGVkIGFueSBnbHlwaCAodXNpbmcgdGhlCi0gICAqICAgYXV0by1oaW50ZXIpLCBhIGNoYW5nZSBvZiB0aGUgZmFsbGJhY2sgc2NyaXB0IHdpbGwgYWZmZWN0IHRoaXMgZmFjZS4KLSAgICoKLSAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHByb3BlcnR5OgotICAgKiAgIGRlZmF1bHQtc2NyaXB0Ci0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICAqRXhwZXJpbWVudGFsKiAqb25seSoKLSAgICoKLSAgICogICBJZiBGcmVlVHlwZSBnZXRzIGNvbXBpbGVkIHdpdGggRlRfQ09ORklHX09QVElPTl9VU0VfSEFSRkJVWlogdG8gbWFrZQotICAgKiAgIHRoZSBIYXJmQnV6eiBsaWJyYXJ5IGFjY2VzcyBPcGVuVHlwZSBmZWF0dXJlcyBmb3IgZ2V0dGluZyBiZXR0ZXIKLSAgICogICBnbHlwaCBjb3ZlcmFnZXMsIHRoaXMgcHJvcGVydHkgc2V0cyB0aGUgKGF1dG8tZml0dGVyKSBzY3JpcHQgdG8gYmUKLSAgICogICB1c2VkIGZvciB0aGUgZGVmYXVsdCAoT3BlblR5cGUpIHNjcmlwdCBkYXRhIG9mIGEgZm9udCdzIEdTVUIgdGFibGUuCi0gICAqICAgRmVhdHVyZXMgZm9yIHRoZSBkZWZhdWx0IHNjcmlwdCBhcmUgaW50ZW5kZWQgZm9yIGFsbCBzY3JpcHRzIG5vdAotICAgKiAgIGV4cGxpY2l0bHkgaGFuZGxlZCBpbiBHU1VCOyBhbiBleGFtcGxlIGlzIGEgYGRsaWcnIGZlYXR1cmUsCi0gICAqICAgY29udGFpbmluZyB0aGUgY29tYmluYXRpb24gb2YgdGhlIGNoYXJhY3RlcnMgYFQnLCBgRScsIGFuZCBgTCcgdG8KLSAgICogICBmb3JtIGEgYFRFTCcgbGlnYXR1cmUuCi0gICAqCi0gICAqICAgQnkgZGVmYXVsdCwgdGhpcyBpcyBARlRfQVVUT0hJTlRFUl9TQ1JJUFRfTEFUSU4uICBVc2luZyB0aGUKLSAgICogICBgZGVmYXVsdC1zY3JpcHQnIHByb3BlcnR5LCB0aGlzIGRlZmF1bHQgdmFsdWUgY2FuIGJlIGNoYW5nZWQuCi0gICAqCi0gICAqICAgewotICAgKiAgICAgRlRfTGlicmFyeSAgbGlicmFyeTsKLSAgICogICAgIEZUX1VJbnQgICAgIGRlZmF1bHRfc2NyaXB0ID0gRlRfQVVUT0hJTlRFUl9TQ1JJUFRfTk9ORTsKLSAgICoKLSAgICoKLSAgICogICAgIEZUX0luaXRfRnJlZVR5cGUoICZsaWJyYXJ5ICk7Ci0gICAqCi0gICAqICAgICBGVF9Qcm9wZXJ0eV9TZXQoIGxpYnJhcnksICJhdXRvZml0dGVyIiwKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQtc2NyaXB0IiwgJmRlZmF1bHRfc2NyaXB0ICk7Ci0gICAqICAgfQotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHdpdGggQEZUX1Byb3BlcnR5X0dldCBhbHNvLgotICAgKgotICAgKiAgIEl0J3MgaW1wb3J0YW50IHRvIHVzZSB0aGUgcmlnaHQgdGltaW5nIGZvciBjaGFuZ2luZyB0aGlzIHZhbHVlOiBUaGUKLSAgICogICBjcmVhdGlvbiBvZiB0aGUgZ2x5cGgtdG8tc2NyaXB0IG1hcCB0aGF0IGV2ZW50dWFsbHkgdXNlcyB0aGUKLSAgICogICBkZWZhdWx0IHNjcmlwdCB2YWx1ZSBnZXRzIHRyaWdnZXJlZCBlaXRoZXIgYnkgc2V0dGluZyBvciByZWFkaW5nIGEKLSAgICogICBmYWNlLXNwZWNpZmljIHByb3BlcnR5IGxpa2UgQGdseXBoLXRvLXNjcmlwdC1tYXAsIG9yIGJ5IGF1dG8taGludGluZwotICAgKiAgIGFueSBnbHlwaCBmcm9tIHRoYXQgZmFjZS4gIEluIHBhcnRpY3VsYXIsIGlmIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZAotICAgKiAgIGFuIEBGVF9GYWNlIHN0cnVjdHVyZSBidXQgbm90IGxvYWRlZCBhbnkgZ2x5cGggKHVzaW5nIHRoZQotICAgKiAgIGF1dG8taGludGVyKSwgYSBjaGFuZ2Ugb2YgdGhlIGRlZmF1bHQgc2NyaXB0IHdpbGwgYWZmZWN0IHRoaXMgZmFjZS4KLSAgICoKLSAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHByb3BlcnR5OgotICAgKiAgIGluY3JlYXNlLXgtaGVpZ2h0Ci0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBGb3IgcHBlbSB2YWx1ZXMgaW4gdGhlIHJhbmdlIDZ+PD0gcHBlbSA8PSBgaW5jcmVhc2UteC1oZWlnaHQnLCByb3VuZAotICAgKiAgIHVwIHRoZSBmb250J3MgeH5oZWlnaHQgbXVjaCBtb3JlIG9mdGVuIHRoYW4gbm9ybWFsbHkuICBJZiB0aGUgdmFsdWUKLSAgICogICBpcyBzZXQgdG9+MCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQsIHRoaXMgZmVhdHVyZSBpcyBzd2l0Y2hlZCBvZmYuICBVc2UKLSAgICogICB0aGlzIHByb3BlcnR5IHRvIGltcHJvdmUgdGhlIGxlZ2liaWxpdHkgb2Ygc21hbGwgZm9udCBzaXplcyBpZgotICAgKiAgIG5lY2Vzc2FyeS4KLSAgICoKLSAgICogICB7Ci0gICAqICAgICBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgbGlicmFyeTsKLSAgICogICAgIEZUX0ZhY2UgICAgICAgICAgICAgICAgICBmYWNlOwotICAgKiAgICAgRlRfUHJvcF9JbmNyZWFzZVhIZWlnaHQgIHByb3A7Ci0gICAqCi0gICAqCi0gICAqICAgICBGVF9Jbml0X0ZyZWVUeXBlKCAmbGlicmFyeSApOwotICAgKiAgICAgRlRfTmV3X0ZhY2UoIGxpYnJhcnksICJmb28udHRmIiwgMCwgJmZhY2UgKTsKLSAgICogICAgIEZUX1NldF9DaGFyX1NpemUoIGZhY2UsIDEwICogNjQsIDAsIDcyLCAwICk7Ci0gICAqCi0gICAqICAgICBwcm9wLmZhY2UgID0gZmFjZTsKLSAgICogICAgIHByb3AubGltaXQgPSAxNDsKLSAgICoKLSAgICogICAgIEZUX1Byb3BlcnR5X1NldCggbGlicmFyeSwgImF1dG9maXR0ZXIiLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jcmVhc2UteC1oZWlnaHQiLCAmcHJvcCApOwotICAgKiAgIH0KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB3aXRoIEBGVF9Qcm9wZXJ0eV9HZXQgYWxzby4KLSAgICoKLSAgICogICBTZXQgdGhpcyB2YWx1ZSByaWdodCBhZnRlciBjYWxsaW5nIEBGVF9TZXRfQ2hhcl9TaXplLCBidXQgYmVmb3JlCi0gICAqICAgbG9hZGluZyBhbnkgZ2x5cGggKHVzaW5nIHRoZSBhdXRvLWhpbnRlcikuCi0gICAqCi0gICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzdHJ1Y3Q6Ci0gICAqICAgRlRfUHJvcF9JbmNyZWFzZVhIZWlnaHQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoZSBkYXRhIGV4Y2hhbmdlIHN0cnVjdHVyZSBmb3IgdGhlIEBpbmNyZWFzZS14LWhlaWdodCBwcm9wZXJ0eS4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9Qcm9wX0luY3JlYXNlWEhlaWdodF8KLSAgewotICAgIEZUX0ZhY2UgIGZhY2U7Ci0gICAgRlRfVUludCAgbGltaXQ7Ci0KLSAgfSBGVF9Qcm9wX0luY3JlYXNlWEhlaWdodDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAcHJvcGVydHk6Ci0gICAqICAgd2FycGluZwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgKkV4cGVyaW1lbnRhbCogKm9ubHkqCi0gICAqCi0gICAqICAgSWYgRnJlZVR5cGUgZ2V0cyBjb21waWxlZCB3aXRoIG9wdGlvbiBBRl9DT05GSUdfT1BUSU9OX1VTRV9XQVJQRVIgdG8KLSAgICogICBhY3RpdmF0ZSB0aGUgd2FycCBoaW50aW5nIGNvZGUgaW4gdGhlIGF1dG8taGludGVyLCB0aGlzIHByb3BlcnR5Ci0gICAqICAgc3dpdGNoZXMgd2FycGluZyBvbiBhbmQgb2ZmLgotICAgKgotICAgKiAgIFdhcnBpbmcgb25seSB3b3JrcyBpbiBgbGlnaHQnIGF1dG8taGludGluZyBtb2RlLiAgVGhlIGlkZWEgb2YgdGhlCi0gICAqICAgY29kZSBpcyB0byBzbGlnaHRseSBzY2FsZSBhbmQgc2hpZnQgYSBnbHlwaCBhbG9uZyB0aGUgbm9uLWhpbnRlZAotICAgKiAgIGRpbWVuc2lvbiAod2hpY2ggaXMgdXN1YWxseSB0aGUgaG9yaXpvbnRhbCBheGlzKSBzbyB0aGF0IGFzIG11Y2ggb2YKLSAgICogICBpdHMgc2VnbWVudHMgYXJlIGFsaWduZWQgKG1vcmUgb3IgbGVzcykgdG8gdGhlIGdyaWQuICBUbyBmaW5kIG91dCBhCi0gICAqICAgZ2x5cGgncyBvcHRpbWFsIHNjYWxpbmcgYW5kIHNoaWZ0aW5nIHZhbHVlLCB2YXJpb3VzIHBhcmFtZXRlcgotICAgKiAgIGNvbWJpbmF0aW9ucyBhcmUgdHJpZWQgYW5kIHNjb3JlZC4KLSAgICoKLSAgICogICBCeSBkZWZhdWx0LCB3YXJwaW5nIGlzIG9mZi4gIFRoZSBleGFtcGxlIGJlbG93IHNob3dzIGhvdyB0byBzd2l0Y2ggb24KLSAgICogICB3YXJwaW5nIChvbWl0dGluZyB0aGUgZXJyb3IgaGFuZGxpbmcpLgotICAgKgotICAgKiAgIHsKLSAgICogICAgIEZUX0xpYnJhcnkgIGxpYnJhcnk7Ci0gICAqICAgICBGVF9Cb29sICAgICB3YXJwaW5nID0gMTsKLSAgICoKLSAgICoKLSAgICogICAgIEZUX0luaXRfRnJlZVR5cGUoICZsaWJyYXJ5ICk7Ci0gICAqCi0gICAqICAgICBGVF9Qcm9wZXJ0eV9TZXQoIGxpYnJhcnksICJhdXRvZml0dGVyIiwKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcnBpbmciLCAmd2FycGluZyApOwotICAgKiAgIH0KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB3aXRoIEBGVF9Qcm9wZXJ0eV9HZXQgYWxzby4KLSAgICoKLSAgICogICBUaGUgd2FycGluZyBjb2RlIGNhbiBhbHNvIGNoYW5nZSBhZHZhbmNlIHdpZHRocy4gIEhhdmUgYSBsb29rIGF0IHRoZQotICAgKiAgIGBsc2JfZGVsdGEnIGFuZCBgcnNiX2RlbHRhJyBmaWVsZHMgaW4gdGhlIEBGVF9HbHlwaFNsb3RSZWMgc3RydWN0dXJlCi0gICAqICAgZm9yIGRldGFpbHMgb24gaW1wcm92aW5nIGludGVyLWdseXBoIGRpc3RhbmNlcyB3aGlsZSByZW5kZXJpbmcuCi0gICAqCi0gICAqICAgU2luY2Ugd2FycGluZyBpcyBhIGdsb2JhbCBwcm9wZXJ0eSBvZiB0aGUgYXV0by1oaW50ZXIgaXQgaXMgYmVzdCB0bwotICAgKiAgIGNoYW5nZSBpdHMgdmFsdWUgYmVmb3JlIHJlbmRlcmluZyBhbnkgZmFjZS4gIE90aGVyd2lzZSwgeW91IHNob3VsZAotICAgKiAgIHJlbG9hZCBhbGwgZmFjZXMgdGhhdCBnZXQgYXV0by1oaW50ZWQgaW4gYGxpZ2h0JyBoaW50aW5nIG1vZGUuCi0gICAqCi0gICAqLwotCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUQVVUT0hfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0YmJveC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGJib3guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ5ZDA0MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0YmJveC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0YmJveC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBleGFjdCBiYm94IGNvbXB1dGF0aW9uIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgY29tcG9uZW50IGhhcyBhIF9zaW5nbGVfIHJvbGU6IHRvIGNvbXB1dGUgZXhhY3Qgb3V0bGluZSBib3VuZGluZyAqLwotICAvKiBib3hlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEl0IGlzIHNlcGFyYXRlZCBmcm9tIHRoZSByZXN0IG9mIHRoZSBlbmdpbmUgZm9yIHZhcmlvdXMgdGVjaG5pY2FsICAgICAqLwotICAvKiByZWFzb25zLiAgSXQgbWF5IHdlbGwgYmUgaW50ZWdyYXRlZCBpbiBgZnRvdXRsbicgbGF0ZXIuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVEJCT1hfSF9fCi0jZGVmaW5lIF9fRlRCQk9YX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmVfcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0dldF9CQm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlIHRoZSBleGFjdCBib3VuZGluZyBib3ggb2YgYW4gb3V0bGluZS4gIFRoaXMgaXMgc2xvd2VyICAgICAgKi8KLSAgLyogICAgdGhhbiBjb21wdXRpbmcgdGhlIGNvbnRyb2wgYm94LiAgSG93ZXZlciwgaXQgdXNlcyBhbiBhZHZhbmNlZCAgICAgICovCi0gIC8qICAgIGFsZ29yaXRobSB0aGF0IHJldHVybnMgX3ZlcnlfIHF1aWNrbHkgd2hlbiB0aGUgdHdvIGJveGVzICAgICAgICAgICAqLwotICAvKiAgICBjb2luY2lkZS4gIE90aGVyd2lzZSwgdGhlIG91dGxpbmUgQsOpemllciBhcmNzIGFyZSB0cmF2ZXJzZWQgdG8gICAgICovCi0gIC8qICAgIGV4dHJhY3QgdGhlaXIgZXh0cmVtYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2Ugb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFiYm94ICAgOjogVGhlIG91dGxpbmUncyBleGFjdCBib3VuZGluZyBib3guICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHRoZSBmb250IGlzIHRyaWNreSBhbmQgdGhlIGdseXBoIGhhcyBiZWVuIGxvYWRlZCB3aXRoICAgICAgICAgICAqLwotICAvKiAgICBARlRfTE9BRF9OT19TQ0FMRSwgdGhlIHJlc3VsdGluZyBCQm94IGlzIG1lYW5pbmdsZXNzLiAgVG8gZ2V0ICAgICAgKi8KLSAgLyogICAgcmVhc29uYWJsZSB2YWx1ZXMgZm9yIHRoZSBCQm94IGl0IGlzIG5lY2Vzc2FyeSB0byBsb2FkIHRoZSBnbHlwaCAgICovCi0gIC8qICAgIGF0IGEgbGFyZ2UgcHBlbSB2YWx1ZSAoc28gdGhhdCB0aGUgaGludGluZyBpbnN0cnVjdGlvbnMgY2FuICAgICAgICAqLwotICAvKiAgICBwcm9wZXJseSBzaGlmdCBhbmQgc2NhbGUgdGhlIHN1YmdseXBocyksIHRoZW4gZXh0cmFjdGluZyB0aGUgQkJveCwgKi8KLSAgLyogICAgd2hpY2ggY2FuIGJlIGV2ZW50dWFsbHkgY29udmVydGVkIGJhY2sgdG8gZm9udCB1bml0cy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9HZXRfQkJveCggRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0JCb3ggICAgICphYmJveCApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVEJCT1hfSF9fICovCi0KLQotLyogRU5EICovCi0KLQotLyogTG9jYWwgVmFyaWFibGVzOiAqLwotLyogY29kaW5nOiB1dGYtOCAgICAqLwotLyogRW5kOiAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGJkZi5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGJkZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmRhYmY0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRiZGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGJkZi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgQkRGLXNwZWNpZmljIHN0cmluZ3MgKHNwZWNpZmljYXRpb24pLiAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVEJERl9IX18KLSNkZWZpbmUgX19GVEJERl9IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmRmX2ZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQkRGIGFuZCBQQ0YgRmlsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQkRGIGFuZCBQQ0Ygc3BlY2lmaWMgQVBJLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBmdW5jdGlvbnMgc3BlY2lmaWMgdG8gQkRGICovCi0gIC8qICAgIGFuZCBQQ0YgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICAgQkRGX1Byb3BlcnR5VHlwZQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgIEEgbGlzdCBvZiBCREYgcHJvcGVydHkgdHlwZXMuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgIEJERl9QUk9QRVJUWV9UWVBFX05PTkUgOjoKLSAgICogICAgICBWYWx1ZX4wIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBtaXNzaW5nIHByb3BlcnR5LgotICAgKgotICAgKiAgICBCREZfUFJPUEVSVFlfVFlQRV9BVE9NIDo6Ci0gICAqICAgICAgUHJvcGVydHkgaXMgYSBzdHJpbmcgYXRvbS4KLSAgICoKLSAgICogICAgQkRGX1BST1BFUlRZX1RZUEVfSU5URUdFUiA6OgotICAgKiAgICAgIFByb3BlcnR5IGlzIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyLgotICAgKgotICAgKiAgICBCREZfUFJPUEVSVFlfVFlQRV9DQVJESU5BTCA6OgotICAgKiAgICAgIFByb3BlcnR5IGlzIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIuCi0gICAqLwotICB0eXBlZGVmIGVudW0gIEJERl9Qcm9wZXJ0eVR5cGVfCi0gIHsKLSAgICBCREZfUFJPUEVSVFlfVFlQRV9OT05FICAgICA9IDAsCi0gICAgQkRGX1BST1BFUlRZX1RZUEVfQVRPTSAgICAgPSAxLAotICAgIEJERl9QUk9QRVJUWV9UWVBFX0lOVEVHRVIgID0gMiwKLSAgICBCREZfUFJPUEVSVFlfVFlQRV9DQVJESU5BTCA9IDMKLQotICB9IEJERl9Qcm9wZXJ0eVR5cGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAdHlwZToKLSAgICogICAgQkRGX1Byb3BlcnR5Ci0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICAgQSBoYW5kbGUgdG8gYSBAQkRGX1Byb3BlcnR5UmVjIHN0cnVjdHVyZSB0byBtb2RlbCBhIGdpdmVuCi0gICAqICAgIEJERi9QQ0YgcHJvcGVydHkuCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCBCREZfUHJvcGVydHlSZWNfKiAgQkRGX1Byb3BlcnR5OwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQHN0cnVjdDoKLSAgKiAgICBCREZfUHJvcGVydHlSZWMKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBUaGlzIHN0cnVjdHVyZSBtb2RlbHMgYSBnaXZlbiBCREYvUENGIHByb3BlcnR5LgotICAqCi0gICogQGZpZWxkczoKLSAgKiAgICB0eXBlIDo6Ci0gICogICAgICBUaGUgcHJvcGVydHkgdHlwZS4KLSAgKgotICAqICAgIHUuYXRvbSA6OgotICAqICAgICAgVGhlIGF0b20gc3RyaW5nLCBpZiB0eXBlIGlzIEBCREZfUFJPUEVSVFlfVFlQRV9BVE9NLiAgTWF5IGJlCi0gICogICAgICBOVUxMLCBpbmRpY2F0aW5nIGFuIGVtcHR5IHN0cmluZy4KLSAgKgotICAqICAgIHUuaW50ZWdlciA6OgotICAqICAgICAgQSBzaWduZWQgaW50ZWdlciwgaWYgdHlwZSBpcyBAQkRGX1BST1BFUlRZX1RZUEVfSU5URUdFUi4KLSAgKgotICAqICAgIHUuY2FyZGluYWwgOjoKLSAgKiAgICAgIEFuIHVuc2lnbmVkIGludGVnZXIsIGlmIHR5cGUgaXMgQEJERl9QUk9QRVJUWV9UWVBFX0NBUkRJTkFMLgotICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQkRGX1Byb3BlcnR5UmVjXwotICB7Ci0gICAgQkRGX1Byb3BlcnR5VHlwZSAgdHlwZTsKLSAgICB1bmlvbiB7Ci0gICAgICBjb25zdCBjaGFyKiAgICAgYXRvbTsKLSAgICAgIEZUX0ludDMyICAgICAgICBpbnRlZ2VyOwotICAgICAgRlRfVUludDMyICAgICAgIGNhcmRpbmFsOwotCi0gICAgfSB1OwotCi0gIH0gQkRGX1Byb3BlcnR5UmVjOwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgIEZUX0dldF9CREZfQ2hhcnNldF9JRAotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFJldHJpZXZlIGEgQkRGIGZvbnQgY2hhcmFjdGVyIHNldCBpZGVudGl0eSwgYWNjb3JkaW5nIHRvCi0gICogICAgdGhlIEJERiBzcGVjaWZpY2F0aW9uLgotICAqCi0gICogQGlucHV0OgotICAqICAgIGZhY2UgOjoKLSAgKiAgICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KLSAgKgotICAqIEBvdXRwdXQ6Ci0gICogICAgYWNoYXJzZXRfZW5jb2RpbmcgOjoKLSAgKiAgICAgICBDaGFyc2V0IGVuY29kaW5nLCBhcyBhIEN+c3RyaW5nLCBvd25lZCBieSB0aGUgZmFjZS4KLSAgKgotICAqICAgIGFjaGFyc2V0X3JlZ2lzdHJ5IDo6Ci0gICogICAgICAgQ2hhcnNldCByZWdpc3RyeSwgYXMgYSBDfnN0cmluZywgb3duZWQgYnkgdGhlIGZhY2UuCi0gICoKLSAgKiBAcmV0dXJuOgotICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgKgotICAqIEBub3RlOgotICAqICAgVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIHdpdGggQkRGIGZhY2VzLCByZXR1cm5pbmcgYW4gZXJyb3Igb3RoZXJ3aXNlLgotICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0JERl9DaGFyc2V0X0lEKCBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICphY2hhcnNldF9lbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgKmFjaGFyc2V0X3JlZ2lzdHJ5ICk7Ci0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICAgRlRfR2V0X0JERl9Qcm9wZXJ0eQotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFJldHJpZXZlIGEgQkRGIHByb3BlcnR5IGZyb20gYSBCREYgb3IgUENGIGZvbnQgZmlsZS4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogICAgbmFtZSA6OiBUaGUgcHJvcGVydHkgbmFtZS4KLSAgKgotICAqIEBvdXRwdXQ6Ci0gICogICAgYXByb3BlcnR5IDo6IFRoZSBwcm9wZXJ0eS4KLSAgKgotICAqIEByZXR1cm46Ci0gICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAqCi0gICogQG5vdGU6Ci0gICogICBUaGlzIGZ1bmN0aW9uIHdvcmtzIHdpdGggQkRGIF9hbmRfIFBDRiBmb250cy4gIEl0IHJldHVybnMgYW4gZXJyb3IKLSAgKiAgIG90aGVyd2lzZS4gIEl0IGFsc28gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGluIHRoZQotICAqICAgZm9udC4KLSAgKgotICAqICAgQSBgcHJvcGVydHknIGlzIGEgZWl0aGVyIGtleS12YWx1ZSBwYWlyIHdpdGhpbiB0aGUgU1RBUlRQUk9QRVJUSUVTCi0gICogICAuLi4gRU5EUFJPUEVSVElFUyBibG9jayBvZiBhIEJERiBmb250IG9yIGEga2V5LXZhbHVlIHBhaXIgZnJvbSB0aGUKLSAgKiAgIGBpbmZvLT5wcm9wcycgYXJyYXkgd2l0aGluIGEgYEZvbnRSZWMnIHN0cnVjdHVyZSBvZiBhIFBDRiBmb250LgotICAqCi0gICogICBJbnRlZ2VyIHByb3BlcnRpZXMgYXJlIGFsd2F5cyBzdG9yZWQgYXMgYHNpZ25lZCcgd2l0aGluIFBDRiBmb250czsKLSAgKiAgIGNvbnNlcXVlbnRseSwgQEJERl9QUk9QRVJUWV9UWVBFX0NBUkRJTkFMIGlzIGEgcG9zc2libGUgcmV0dXJuIHZhbHVlCi0gICogICBmb3IgQkRGIGZvbnRzIG9ubHkuCi0gICoKLSAgKiAgIEluIGNhc2Ugb2YgZXJyb3IsIGBhcHJvcGVydHktPnR5cGUnIGlzIGFsd2F5cyBzZXQgdG8KLSAgKiAgIEBCREZfUFJPUEVSVFlfVFlQRV9OT05FLgotICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0JERl9Qcm9wZXJ0eSggRlRfRmFjZSAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICAgICAgcHJvcF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBCREZfUHJvcGVydHlSZWMgICphcHJvcGVydHkgKTsKLQotICAvKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUQkRGX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGJpdG1hcC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGJpdG1hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmNjNDdiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRiaXRtYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGJpdG1hcC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGJpdG1hcHMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVEJJVE1BUF9IX18KLSNkZWZpbmUgX19GVEJJVE1BUF9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaXRtYXBfaGFuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCaXRtYXAgSGFuZGxpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIYW5kbGluZyBGVF9CaXRtYXAgb2JqZWN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBARlRfQml0bWFwIG9iamVjdHMuICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IG5vbmUgb2YgdGhlIGZ1bmN0aW9ucyBjaGFuZ2VzIHRoZSBiaXRtYXAncyBgZmxvdycgKGFzICAgICovCi0gIC8qICAgIGluZGljYXRlZCBieSB0aGUgc2lnbiBvZiB0aGUgYHBpdGNoJyBmaWVsZCBpbiBgRlRfQml0bWFwJykuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CaXRtYXBfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbml0aWFsaXplIGEgcG9pbnRlciB0byBhbiBARlRfQml0bWFwIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhYml0bWFwIDo6IEEgcG9pbnRlciB0byB0aGUgYml0bWFwIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGRlcHJlY2F0ZWQgbmFtZSBmb3IgdGhlIHNhbWUgZnVuY3Rpb24gaXMgYEZUX0JpdG1hcF9OZXcnLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0JpdG1hcF9Jbml0KCBGVF9CaXRtYXAgICphYml0bWFwICk7Ci0KLQotICAvKiBkZXByZWNhdGVkICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0JpdG1hcF9OZXcoIEZUX0JpdG1hcCAgKmFiaXRtYXAgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0JpdG1hcF9Db3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvcHkgYSBiaXRtYXAgaW50byBhbm90aGVyIG9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gYSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc291cmNlICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFyZ2V0ICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfQml0bWFwX0NvcHkoIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICBjb25zdCBGVF9CaXRtYXAgICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICBGVF9CaXRtYXAgICAgICAgICp0YXJnZXQpOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQml0bWFwX0VtYm9sZGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRW1ib2xkZW4gYSBiaXRtYXAuICBUaGUgbmV3IGJpdG1hcCB3aWxsIGJlIGFib3V0IGB4U3RyZW5ndGgnICAgICAgICovCi0gIC8qICAgIHBpeGVscyB3aWRlciBhbmQgYHlTdHJlbmd0aCcgcGl4ZWxzIGhpZ2hlci4gIFRoZSBsZWZ0IGFuZCBib3R0b20gICAqLwotICAvKiAgICBib3JkZXJzIGFyZSBrZXB0IHVuY2hhbmdlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5ICAgOjogQSBoYW5kbGUgdG8gYSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHhTdHJlbmd0aCA6OiBIb3cgc3Ryb25nIHRoZSBnbHlwaCBpcyBlbWJvbGRlbmVkIGhvcml6b250YWxseS4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgRXhwcmVzc2VkIGluIDI2LjYgcGl4ZWwgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlTdHJlbmd0aCA6OiBIb3cgc3Ryb25nIHRoZSBnbHlwaCBpcyBlbWJvbGRlbmVkIHZlcnRpY2FsbHkuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgRXhwcmVzc2VkIGluIDI2LjYgcGl4ZWwgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaXRtYXAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiByZXN0cmljdHMgYHhTdHJlbmd0aCcgdG8gYmUgbGVzcyB0aGFuICAgKi8KLSAgLyogICAgb3IgZXF1YWwgdG9+OCBpZiBiaXRtYXAgaXMgb2YgcGl4ZWxfbW9kZSBARlRfUElYRUxfTU9ERV9NT05PLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB5b3Ugd2FudCB0byBlbWJvbGRlbiB0aGUgYml0bWFwIG93bmVkIGJ5IGEgQEZUX0dseXBoU2xvdFJlYywgICAgKi8KLSAgLyogICAgeW91IHNob3VsZCBjYWxsIEBGVF9HbHlwaFNsb3RfT3duX0JpdG1hcCBvbiB0aGUgc2xvdCBmaXJzdC4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCaXRtYXBzIGluIEBGVF9QSVhFTF9NT0RFX0dSQVkyIGFuZCBARlRfUElYRUxfTU9ERV9HUkFZQCBmb3JtYXQgICAgKi8KLSAgLyogICAgYXJlIGNvbnZlcnRlZCB0byBARlRfUElYRUxfTU9ERV9HUkFZIGZvcm1hdCAoaS5lLiwgOGJwcCkuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfQml0bWFwX0VtYm9sZGVuKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCogIGJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB4U3RyZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeVN0cmVuZ3RoICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CaXRtYXBfQ29udmVydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb252ZXJ0IGEgYml0bWFwIG9iamVjdCB3aXRoIGRlcHRoIDFicHAsIDJicHAsIDRicHAsIDhicHAgb3IgMzJicHAgKi8KLSAgLyogICAgdG8gYSBiaXRtYXAgb2JqZWN0IHdpdGggZGVwdGggOGJwcCwgbWFraW5nIHRoZSBudW1iZXIgb2YgdXNlZCAgICAgICovCi0gIC8qICAgIGJ5dGVzIGxpbmUgKGEuay5hLiB0aGUgYHBpdGNoJykgYSBtdWx0aXBsZSBvZiBgYWxpZ25tZW50Jy4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICA6OiBBIGhhbmRsZSB0byBhIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc291cmNlICAgIDo6IFRoZSBzb3VyY2UgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbGlnbm1lbnQgOjogVGhlIHBpdGNoIG9mIHRoZSBiaXRtYXAgaXMgYSBtdWx0aXBsZSBvZiB0aGlzICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIHBhcmFtZXRlci4gIENvbW1vbiB2YWx1ZXMgYXJlIDEsIDIsIG9yIDQuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFyZ2V0ICAgIDo6IFRoZSB0YXJnZXQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSXQgaXMgcG9zc2libGUgdG8gY2FsbCBARlRfQml0bWFwX0NvbnZlcnQgbXVsdGlwbGUgdGltZXMgd2l0aG91dCAgICovCi0gIC8qICAgIGNhbGxpbmcgQEZUX0JpdG1hcF9Eb25lICh0aGUgbWVtb3J5IGlzIHNpbXBseSByZWFsbG9jYXRlZCkuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlIEBGVF9CaXRtYXBfRG9uZSB0byBmaW5hbGx5IHJlbW92ZSB0aGUgYml0bWFwIG9iamVjdC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYGxpYnJhcnknIGFyZ3VtZW50IGlzIHRha2VuIHRvIGhhdmUgYWNjZXNzIHRvIEZyZWVUeXBlJ3MgICAgICAgKi8KLSAgLyogICAgbWVtb3J5IGhhbmRsaW5nIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfQml0bWFwX0NvbnZlcnQoIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CaXRtYXAgICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9CaXRtYXAgICAgICAgICp0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgICBhbGlnbm1lbnQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoU2xvdF9Pd25fQml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1ha2Ugc3VyZSB0aGF0IGEgZ2x5cGggc2xvdCBvd25zIGBzbG90LT5iaXRtYXAnLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNsb3QgOjogVGhlIGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdG8gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfQml0bWFwX0VtYm9sZGVuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HbHlwaFNsb3RfT3duX0JpdG1hcCggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CaXRtYXBfRG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXN0cm95IGEgYml0bWFwIG9iamVjdCBpbml0aWFsaXplZCB3aXRoIEBGVF9CaXRtYXBfSW5pdC4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJpdG1hcCAgOjogVGhlIGJpdG1hcCBvYmplY3QgdG8gYmUgZnJlZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBgbGlicmFyeScgYXJndW1lbnQgaXMgdGFrZW4gdG8gaGF2ZSBhY2Nlc3MgdG8gRnJlZVR5cGUncyAgICAgICAqLwotICAvKiAgICBtZW1vcnkgaGFuZGxpbmcgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9CaXRtYXBfRG9uZSggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCAgKmJpdG1hcCApOwotCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUQklUTUFQX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGJ6aXAyLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0YnppcDIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1Zjk0Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0YnppcDIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGJ6aXAyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQnppcDItY29tcHJlc3NlZCBzdHJlYW0gc3VwcG9ydC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTAtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEpvZWwgS2xpbmdoZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVEJaSVAyX0hfXwotI2RlZmluZSBfX0ZUQlpJUDJfSF9fCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiemlwMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCWklQMiBTdHJlYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2luZyBiemlwMi1jb21wcmVzc2VkIGZvbnQgZmlsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIEJ6aXAyLXNwZWNpZmljIGZ1bmN0aW9ucy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICBGVF9TdHJlYW1fT3BlbkJ6aXAyCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICBPcGVuIGEgbmV3IHN0cmVhbSB0byBwYXJzZSBiemlwMi1jb21wcmVzc2VkIGZvbnQgZmlsZXMuICBUaGlzIGlzCi0gICogICBtYWlubHkgdXNlZCB0byBzdXBwb3J0IHRoZSBjb21wcmVzc2VkIGAqLnBjZi5iejInIGZvbnRzIHRoYXQgY29tZQotICAqICAgd2l0aCBYRnJlZTg2LgotICAqCi0gICogQGlucHV0OgotICAqICAgc3RyZWFtIDo6Ci0gICogICAgIFRoZSB0YXJnZXQgZW1iZWRkaW5nIHN0cmVhbS4KLSAgKgotICAqICAgc291cmNlIDo6Ci0gICogICAgIFRoZSBzb3VyY2Ugc3RyZWFtLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoZSBzb3VyY2Ugc3RyZWFtIG11c3QgYmUgb3BlbmVkIF9iZWZvcmVfIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLSAgKgotICAqICAgQ2FsbGluZyB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gYEZUX1N0cmVhbV9DbG9zZScgb24gdGhlIG5ldyBzdHJlYW0gd2lsbAotICAqICAgKm5vdCogY2FsbCBgRlRfU3RyZWFtX0Nsb3NlJyBvbiB0aGUgc291cmNlIHN0cmVhbS4gIE5vbmUgb2YgdGhlIHN0cmVhbQotICAqICAgb2JqZWN0cyB3aWxsIGJlIHJlbGVhc2VkIHRvIHRoZSBoZWFwLgotICAqCi0gICogICBUaGUgc3RyZWFtIGltcGxlbWVudGF0aW9uIGlzIHZlcnkgYmFzaWMgYW5kIHJlc2V0cyB0aGUgZGVjb21wcmVzc2lvbgotICAqICAgcHJvY2VzcyBlYWNoIHRpbWUgc2Vla2luZyBiYWNrd2FyZHMgaXMgbmVlZGVkIHdpdGhpbiB0aGUgc3RyZWFtLgotICAqCi0gICogICBJbiBjZXJ0YWluIGJ1aWxkcyBvZiB0aGUgbGlicmFyeSwgYnppcDIgY29tcHJlc3Npb24gcmVjb2duaXRpb24gaXMKLSAgKiAgIGF1dG9tYXRpY2FsbHkgaGFuZGxlZCB3aGVuIGNhbGxpbmcgQEZUX05ld19GYWNlIG9yIEBGVF9PcGVuX0ZhY2UuCi0gICogICBUaGlzIG1lYW5zIHRoYXQgaWYgbm8gZm9udCBkcml2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyB0aGUgcmF3Ci0gICogICBjb21wcmVzc2VkIGZpbGUsIHRoZSBsaWJyYXJ5IHdpbGwgdHJ5IHRvIG9wZW4gYSBiemlwMiBjb21wcmVzc2VkIHN0cmVhbQotICAqICAgZnJvbSBpdCBhbmQgcmUtb3BlbiB0aGUgZmFjZSB3aXRoIGl0LgotICAqCi0gICogICBUaGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gYEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUnIGlmIHlvdXIgYnVpbGQKLSAgKiAgIG9mIEZyZWVUeXBlIHdhcyBub3QgY29tcGlsZWQgd2l0aCBiemlwMiBzdXBwb3J0LgotICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX09wZW5CemlwMiggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc291cmNlICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUQlpJUDJfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Y2FjaGUuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRjYWNoZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODUyNWJiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRjYWNoZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNhY2hlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQ2FjaGUgc3Vic3lzdGVtIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVENBQ0hFX0hfXwotI2RlZmluZSBfX0ZUQ0FDSEVfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9HTFlQSF9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiA8U2VjdGlvbj4KLSAgICogICAgY2FjaGVfc3Vic3lzdGVtCi0gICAqCi0gICAqIDxUaXRsZT4KLSAgICogICAgQ2FjaGUgU3ViLVN5c3RlbQotICAgKgotICAgKiA8QWJzdHJhY3Q+Ci0gICAqICAgIEhvdyB0byBjYWNoZSBmYWNlLCBzaXplLCBhbmQgZ2x5cGggZGF0YSB3aXRoIEZyZWVUeXBlfjIuCi0gICAqCi0gICAqIDxEZXNjcmlwdGlvbj4KLSAgICogICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBGcmVlVHlwZX4yIGNhY2hlIHN1Yi1zeXN0ZW0sIHdoaWNoIGlzIHVzZWQKLSAgICogICB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbnRseSBvcGVuZWQgQEZUX0ZhY2UgYW5kIEBGVF9TaXplCi0gICAqICAgb2JqZWN0cywgYXMgd2VsbCBhcyBjYWNoaW5nIGluZm9ybWF0aW9uIGxpa2UgY2hhcmFjdGVyIG1hcHMgYW5kIGdseXBoCi0gICAqICAgaW1hZ2VzIHdoaWxlIGxpbWl0aW5nIHRoZWlyIG1heGltdW0gbWVtb3J5IHVzYWdlLgotICAgKgotICAgKiAgIE5vdGUgdGhhdCBhbGwgdHlwZXMgYW5kIGZ1bmN0aW9ucyBiZWdpbiB3aXRoIHRoZSBgRlRDXycgcHJlZml4LgotICAgKgotICAgKiAgIFRoZSBjYWNoZSBpcyBoaWdobHkgcG9ydGFibGUgYW5kIHRodXMgZG9lc24ndCBrbm93IGFueXRoaW5nIGFib3V0IHRoZQotICAgKiAgIGZvbnRzIGluc3RhbGxlZCBvbiB5b3VyIHN5c3RlbSwgb3IgaG93IHRvIGFjY2VzcyB0aGVtLiAgVGhpcyBpbXBsaWVzCi0gICAqICAgdGhlIGZvbGxvd2luZyBzY2hlbWU6Ci0gICAqCi0gICAqICAgRmlyc3QsIGF2YWlsYWJsZSBvciBpbnN0YWxsZWQgZm9udCBmYWNlcyBhcmUgdW5pcXVlbHkgaWRlbnRpZmllZCBieQotICAgKiAgIEBGVENfRmFjZUlEIHZhbHVlcywgcHJvdmlkZWQgdG8gdGhlIGNhY2hlIGJ5IHRoZSBjbGllbnQuICBOb3RlIHRoYXQKLSAgICogICB0aGUgY2FjaGUgb25seSBzdG9yZXMgYW5kIGNvbXBhcmVzIHRoZXNlIHZhbHVlcywgYW5kIGRvZXNuJ3QgdHJ5IHRvCi0gICAqICAgaW50ZXJwcmV0IHRoZW0gaW4gYW55IHdheS4KLSAgICoKLSAgICogICBTZWNvbmQsIHRoZSBjYWNoZSBjYWxscywgb25seSB3aGVuIG5lZWRlZCwgYSBjbGllbnQtcHJvdmlkZWQgZnVuY3Rpb24KLSAgICogICB0byBjb252ZXJ0IGFuIEBGVENfRmFjZUlEIGludG8gYSBuZXcgQEZUX0ZhY2Ugb2JqZWN0LiAgVGhlIGxhdHRlciBpcwotICAgKiAgIHRoZW4gY29tcGxldGVseSBtYW5hZ2VkIGJ5IHRoZSBjYWNoZSwgaW5jbHVkaW5nIGl0cyB0ZXJtaW5hdGlvbgotICAgKiAgIHRocm91Z2ggQEZUX0RvbmVfRmFjZS4gIFRvIG1vbml0b3IgdGVybWluYXRpb24gb2YgZmFjZSBvYmplY3RzLCB0aGUKLSAgICogICBmaW5hbGl6ZXIgY2FsbGJhY2sgaW4gdGhlIGBnZW5lcmljJyBmaWVsZCBvZiB0aGUgQEZUX0ZhY2Ugb2JqZWN0IGNhbgotICAgKiAgIGJlIHVzZWQsIHdoaWNoIG1pZ2h0IGFsc28gYmUgdXNlZCB0byBzdG9yZSB0aGUgQEZUQ19GYWNlSUQgb2YgdGhlCi0gICAqICAgZmFjZS4KLSAgICoKLSAgICogICBDbGllbnRzIGFyZSBmcmVlIHRvIG1hcCBmYWNlIElEcyB0byBhbnl0aGluZyBlbHNlLiAgVGhlIG1vc3Qgc2ltcGxlCi0gICAqICAgdXNhZ2UgaXMgdG8gYXNzb2NpYXRlIHRoZW0gdG8gYSAocGF0aG5hbWUsZmFjZV9pbmRleCkgcGFpciB0aGF0IGlzCi0gICAqICAgdXNlZCB0byBjYWxsIEBGVF9OZXdfRmFjZS4gIEhvd2V2ZXIsIG1vcmUgY29tcGxleCBzY2hlbWVzIGFyZSBhbHNvCi0gICAqICAgcG9zc2libGUuCi0gICAqCi0gICAqICAgTm90ZSB0aGF0IGZvciB0aGUgY2FjaGUgdG8gd29yayBjb3JyZWN0bHksIHRoZSBmYWNlIElEIHZhbHVlcyBtdXN0IGJlCi0gICAqICAgKnBlcnNpc3RlbnQqLCB3aGljaCBtZWFucyB0aGF0IHRoZSBjb250ZW50cyB0aGV5IHBvaW50IHRvIHNob3VsZCBub3QKLSAgICogICBjaGFuZ2UgYXQgcnVudGltZSwgb3IgdGhhdCB0aGVpciB2YWx1ZSBzaG91bGQgbm90IGJlY29tZSBpbnZhbGlkLgotICAgKgotICAgKiAgIElmIHRoaXMgaXMgdW5hdm9pZGFibGUgKGUuZy4sIHdoZW4gYSBmb250IGlzIHVuaW5zdGFsbGVkIGF0IHJ1bnRpbWUpLAotICAgKiAgIHlvdSBzaG91bGQgY2FsbCBARlRDX01hbmFnZXJfUmVtb3ZlRmFjZUlEIGFzIHNvb24gYXMgcG9zc2libGUsIHRvIGxldAotICAgKiAgIHRoZSBjYWNoZSBnZXQgcmlkIG9mIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvbGQgQEZUQ19GYWNlSUQgaXQgbWF5Ci0gICAqICAga2VlcCBpbnRlcm5hbGx5LiAgRmFpbHVyZSB0byBkbyBzbyB3aWxsIGxlYWQgdG8gaW5jb3JyZWN0IGJlaGF2aW91cgotICAgKiAgIG9yIGV2ZW4gY3Jhc2hlcy4KLSAgICoKLSAgICogICBUbyB1c2UgdGhlIGNhY2hlLCBzdGFydCB3aXRoIGNhbGxpbmcgQEZUQ19NYW5hZ2VyX05ldyB0byBjcmVhdGUgYSBuZXcKLSAgICogICBARlRDX01hbmFnZXIgb2JqZWN0LCB3aGljaCBtb2RlbHMgYSBzaW5nbGUgY2FjaGUgaW5zdGFuY2UuICBZb3UgY2FuCi0gICAqICAgdGhlbiBsb29rIHVwIEBGVF9GYWNlIGFuZCBARlRfU2l6ZSBvYmplY3RzIHdpdGgKLSAgICogICBARlRDX01hbmFnZXJfTG9va3VwRmFjZSBhbmQgQEZUQ19NYW5hZ2VyX0xvb2t1cFNpemUsIHJlc3BlY3RpdmVseS4KLSAgICoKLSAgICogICBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIGNoYXJtYXAgY2FjaGluZywgY2FsbCBARlRDX0NNYXBDYWNoZV9OZXcsIHRoZW4KLSAgICogICBsYXRlciB1c2UgQEZUQ19DTWFwQ2FjaGVfTG9va3VwIHRvIHBlcmZvcm0gdGhlIGVxdWl2YWxlbnQgb2YKLSAgICogICBARlRfR2V0X0NoYXJfSW5kZXgsIG9ubHkgbXVjaCBmYXN0ZXIuCi0gICAqCi0gICAqICAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBARlRfR2x5cGggY2FjaGluZywgY2FsbCBARlRDX0ltYWdlQ2FjaGUsIHRoZW4KLSAgICogICBsYXRlciB1c2UgQEZUQ19JbWFnZUNhY2hlX0xvb2t1cCB0byByZXRyaWV2ZSB0aGUgY29ycmVzcG9uZGluZwotICAgKiAgIEBGVF9HbHlwaCBvYmplY3RzIGZyb20gdGhlIGNhY2hlLgotICAgKgotICAgKiAgIElmIHlvdSBuZWVkIGxvdHMgb2Ygc21hbGwgYml0bWFwcywgaXQgaXMgbXVjaCBtb3JlIG1lbW9yeSBlZmZpY2llbnQKLSAgICogICB0byBjYWxsIEBGVENfU0JpdENhY2hlX05ldyBmb2xsb3dlZCBieSBARlRDX1NCaXRDYWNoZV9Mb29rdXAuICBUaGlzCi0gICAqICAgcmV0dXJucyBARlRDX1NCaXRSZWMgc3RydWN0dXJlcywgd2hpY2ggYXJlIHVzZWQgdG8gc3RvcmUgc21hbGwKLSAgICogICBiaXRtYXBzIGRpcmVjdGx5LiAgKEEgc21hbGwgYml0bWFwIGlzIG9uZSB3aG9zZSBtZXRyaWNzIGFuZAotICAgKiAgIGRpbWVuc2lvbnMgYWxsIGZpdCBpbnRvIDgtYml0IGludGVnZXJzKS4KLSAgICoKLSAgICogICBXZSBob3BlIHRvIGFsc28gcHJvdmlkZSBhIGtlcm5pbmcgY2FjaGUgaW4gdGhlIG5lYXIgZnV0dXJlLgotICAgKgotICAgKgotICAgKiA8T3JkZXI+Ci0gICAqICAgRlRDX01hbmFnZXIKLSAgICogICBGVENfRmFjZUlECi0gICAqICAgRlRDX0ZhY2VfUmVxdWVzdGVyCi0gICAqCi0gICAqICAgRlRDX01hbmFnZXJfTmV3Ci0gICAqICAgRlRDX01hbmFnZXJfUmVzZXQKLSAgICogICBGVENfTWFuYWdlcl9Eb25lCi0gICAqICAgRlRDX01hbmFnZXJfTG9va3VwRmFjZQotICAgKiAgIEZUQ19NYW5hZ2VyX0xvb2t1cFNpemUKLSAgICogICBGVENfTWFuYWdlcl9SZW1vdmVGYWNlSUQKLSAgICoKLSAgICogICBGVENfTm9kZQotICAgKiAgIEZUQ19Ob2RlX1VucmVmCi0gICAqCi0gICAqICAgRlRDX0ltYWdlQ2FjaGUKLSAgICogICBGVENfSW1hZ2VDYWNoZV9OZXcKLSAgICogICBGVENfSW1hZ2VDYWNoZV9Mb29rdXAKLSAgICoKLSAgICogICBGVENfU0JpdAotICAgKiAgIEZUQ19TQml0Q2FjaGUKLSAgICogICBGVENfU0JpdENhY2hlX05ldwotICAgKiAgIEZUQ19TQml0Q2FjaGVfTG9va3VwCi0gICAqCi0gICAqICAgRlRDX0NNYXBDYWNoZQotICAgKiAgIEZUQ19DTWFwQ2FjaGVfTmV3Ci0gICAqICAgRlRDX0NNYXBDYWNoZV9Mb29rdXAKLSAgICoKLSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICBCQVNJQyBUWVBFIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6IEZUQ19GYWNlSUQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEFuIG9wYXF1ZSBwb2ludGVyIHR5cGUgdGhhdCBpcyB1c2VkIHRvIGlkZW50aXR5IGZhY2Ugb2JqZWN0cy4gIFRoZQotICAgKiAgIGNvbnRlbnRzIG9mIHN1Y2ggb2JqZWN0cyBpcyBhcHBsaWNhdGlvbi1kZXBlbmRlbnQuCi0gICAqCi0gICAqICAgVGhlc2UgcG9pbnRlcnMgYXJlIHR5cGljYWxseSB1c2VkIHRvIHBvaW50IHRvIGEgdXNlci1kZWZpbmVkCi0gICAqICAgc3RydWN0dXJlIGNvbnRhaW5pbmcgYSBmb250IGZpbGUgcGF0aCwgYW5kIGZhY2UgaW5kZXguCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIE5ldmVyIHVzZSBOVUxMIGFzIGEgdmFsaWQgQEZUQ19GYWNlSUQuCi0gICAqCi0gICAqICAgRmFjZSBJRHMgYXJlIHBhc3NlZCBieSB0aGUgY2xpZW50IHRvIHRoZSBjYWNoZSBtYW5hZ2VyIHRoYXQgY2FsbHMsCi0gICAqICAgd2hlbiBuZWVkZWQsIHRoZSBARlRDX0ZhY2VfUmVxdWVzdGVyIHRvIHRyYW5zbGF0ZSB0aGVtIGludG8gbmV3Ci0gICAqICAgQEZUX0ZhY2Ugb2JqZWN0cy4KLSAgICoKLSAgICogICBJZiB0aGUgY29udGVudCBvZiBhIGdpdmVuIGZhY2UgSUQgY2hhbmdlcyBhdCBydW50aW1lLCBvciBpZiB0aGUgdmFsdWUKLSAgICogICBiZWNvbWVzIGludmFsaWQgKGUuZy4sIHdoZW4gdW5pbnN0YWxsaW5nIGEgZm9udCksIHlvdSBzaG91bGQKLSAgICogICBpbW1lZGlhdGVseSBjYWxsIEBGVENfTWFuYWdlcl9SZW1vdmVGYWNlSUQgYmVmb3JlIGFueSBvdGhlciBjYWNoZQotICAgKiAgIGZ1bmN0aW9uLgotICAgKgotICAgKiAgIEZhaWx1cmUgdG8gZG8gc28gd2lsbCByZXN1bHQgaW4gaW5jb3JyZWN0IGJlaGF2aW91ciBvciBldmVuCi0gICAqICAgbWVtb3J5IGxlYWtzIGFuZCBjcmFzaGVzLgotICAgKi8KLSAgdHlwZWRlZiBGVF9Qb2ludGVyICBGVENfRmFjZUlEOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgRlRDX0ZhY2VfUmVxdWVzdGVyCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGNhbGxiYWNrIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IGNsaWVudCBhcHBsaWNhdGlvbnMuICBJdCBpcyB1c2VkIGJ5Ci0gICAqICAgdGhlIGNhY2hlIG1hbmFnZXIgdG8gdHJhbnNsYXRlIGEgZ2l2ZW4gQEZUQ19GYWNlSUQgaW50byBhIG5ldyB2YWxpZAotICAgKiAgIEBGVF9GYWNlIG9iamVjdCwgb24gZGVtYW5kLgotICAgKgotICAgKiA8SW5wdXQ+Ci0gICAqICAgZmFjZV9pZCA6OgotICAgKiAgICAgVGhlIGZhY2UgSUQgdG8gcmVzb2x2ZS4KLSAgICoKLSAgICogICBsaWJyYXJ5IDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byBhIEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0LgotICAgKgotICAgKiAgIHJlcV9kYXRhIDo6Ci0gICAqICAgICBBcHBsaWNhdGlvbi1wcm92aWRlZCByZXF1ZXN0IGRhdGEgKHNlZSBub3RlIGJlbG93KS4KLSAgICoKLSAgICogPE91dHB1dD4KLSAgICogICBhZmFjZSA6OgotICAgKiAgICAgQSBuZXcgQEZUX0ZhY2UgaGFuZGxlLgotICAgKgotICAgKiA8UmV0dXJuPgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIDxOb3RlPgotICAgKiAgIFRoZSB0aGlyZCBwYXJhbWV0ZXIgYHJlcV9kYXRhJyBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIHBhc3NlZCBieSB0aGUKLSAgICogICBjbGllbnQgd2hlbiBARlRDX01hbmFnZXJfTmV3IGlzIGNhbGxlZC4KLSAgICoKLSAgICogICBUaGUgZmFjZSByZXF1ZXN0ZXIgc2hvdWxkIG5vdCBwZXJmb3JtIGZ1bm55IHRoaW5ncyBvbiB0aGUgcmV0dXJuZWQKLSAgICogICBmYWNlIG9iamVjdCwgbGlrZSBjcmVhdGluZyBhIG5ldyBARlRfU2l6ZSBmb3IgaXQsIG9yIHNldHRpbmcgYQotICAgKiAgIHRyYW5zZm9ybWF0aW9uIHRocm91Z2ggQEZUX1NldF9UcmFuc2Zvcm0hCi0gICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRDX0ZhY2VfUmVxdWVzdGVyKSggRlRDX0ZhY2VJRCAgZmFjZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIHJlcV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UqICAgIGFmYWNlICk7Ci0KLSAgLyogKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgQ0FDSEUgTUFOQUdFUiBPQkpFQ1QgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfTWFuYWdlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIG9iamVjdCBjb3JyZXNwb25kcyB0byBvbmUgaW5zdGFuY2Ugb2YgdGhlIGNhY2hlLXN1YnN5c3RlbS4gICAgKi8KLSAgLyogICAgSXQgaXMgdXNlZCB0byBjYWNoZSBvbmUgb3IgbW9yZSBARlRfRmFjZSBvYmplY3RzLCBhbG9uZyB3aXRoICAgICAgICovCi0gIC8qICAgIGNvcnJlc3BvbmRpbmcgQEZUX1NpemUgb2JqZWN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG1hbmFnZXIgaW50ZW50aW9uYWxseSBsaW1pdHMgdGhlIHRvdGFsIG51bWJlciBvZiBvcGVuZWQgICAgICAgICovCi0gIC8qICAgIEBGVF9GYWNlIGFuZCBARlRfU2l6ZSBvYmplY3RzIHRvIGNvbnRyb2wgbWVtb3J5IHVzYWdlLiAgU2VlIHRoZSAgICAqLwotICAvKiAgICBgbWF4X2ZhY2VzJyBhbmQgYG1heF9zaXplcycgcGFyYW1ldGVycyBvZiBARlRDX01hbmFnZXJfTmV3LiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtYW5hZ2VyIGlzIGFsc28gdXNlZCB0byBjYWNoZSBgbm9kZXMnIG9mIHZhcmlvdXMgdHlwZXMgd2hpbGUgICAqLwotICAvKiAgICBsaW1pdGluZyB0aGVpciB0b3RhbCBtZW1vcnkgdXNhZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFsbCBsaW1pdGF0aW9ucyBhcmUgZW5mb3JjZWQgYnkga2VlcGluZyBsaXN0cyBvZiBtYW5hZ2VkIG9iamVjdHMgICAqLwotICAvKiAgICBpbiBtb3N0LXJlY2VudGx5LXVzZWQgb3JkZXIsIGFuZCBmbHVzaGluZyBvbGQgbm9kZXMgdG8gbWFrZSByb29tICAgKi8KLSAgLyogICAgZm9yIG5ldyBvbmVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVENfTWFuYWdlclJlY18qICBGVENfTWFuYWdlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19Ob2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIG9wYXF1ZSBoYW5kbGUgdG8gYSBjYWNoZSBub2RlIG9iamVjdC4gIEVhY2ggY2FjaGUgbm9kZSBpcyAgICAgICAqLwotICAvKiAgICByZWZlcmVuY2UtY291bnRlZC4gIEEgbm9kZSB3aXRoIGEgY291bnQgb2Z+MCBtaWdodCBiZSBmbHVzaGVkICAgICAgKi8KLSAgLyogICAgb3V0IG9mIGEgZnVsbCBjYWNoZSB3aGVuZXZlciBhIGxvb2t1cCByZXF1ZXN0IGlzIHBlcmZvcm1lZC4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB5b3UgbG9vayB1cCBub2RlcywgeW91IGhhdmUgdGhlIGFiaWxpdHkgdG8gYGFjcXVpcmUnIHRoZW0sICAgICAgKi8KLSAgLyogICAgaS5lLiwgdG8gaW5jcmVtZW50IHRoZWlyIHJlZmVyZW5jZSBjb3VudC4gIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSAgICovCi0gIC8qICAgIG5vZGUgZnJvbSBiZWluZyBmbHVzaGVkIG91dCBvZiB0aGUgY2FjaGUgdW50aWwgeW91IGV4cGxpY2l0bHkgICAgICAqLwotICAvKiAgICBgcmVsZWFzZScgaXQgKHNlZSBARlRDX05vZGVfVW5yZWYpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZSBhbHNvIEBGVENfU0JpdENhY2hlX0xvb2t1cCBhbmQgQEZUQ19JbWFnZUNhY2hlX0xvb2t1cC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRDX05vZGVSZWNfKiAgRlRDX05vZGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfTWFuYWdlcl9OZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDcmVhdGUgYSBuZXcgY2FjaGUgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5ICAgOjogVGhlIHBhcmVudCBGcmVlVHlwZSBsaWJyYXJ5IGhhbmRsZSB0byB1c2UuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9mYWNlcyA6OiBNYXhpbXVtIG51bWJlciBvZiBvcGVuZWQgQEZUX0ZhY2Ugb2JqZWN0cyBtYW5hZ2VkIGJ5ICAqLwotICAvKiAgICAgICAgICAgICAgICAgdGhpcyBjYWNoZSBpbnN0YW5jZS4gIFVzZX4wIGZvciBkZWZhdWx0cy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9zaXplcyA6OiBNYXhpbXVtIG51bWJlciBvZiBvcGVuZWQgQEZUX1NpemUgb2JqZWN0cyBtYW5hZ2VkIGJ5ICAqLwotICAvKiAgICAgICAgICAgICAgICAgdGhpcyBjYWNoZSBpbnN0YW5jZS4gIFVzZX4wIGZvciBkZWZhdWx0cy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9ieXRlcyA6OiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byB1c2UgZm9yIGNhY2hlZCBkYXRhIG5vZGVzLiAqLwotICAvKiAgICAgICAgICAgICAgICAgVXNlfjAgZm9yIGRlZmF1bHRzLiAgTm90ZSB0aGF0IHRoaXMgdmFsdWUgZG9lcyBub3QgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGFjY291bnQgZm9yIG1hbmFnZWQgQEZUX0ZhY2UgYW5kIEBGVF9TaXplIG9iamVjdHMuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZXF1ZXN0ZXIgOjogQW4gYXBwbGljYXRpb24tcHJvdmlkZWQgY2FsbGJhY2sgdXNlZCB0byB0cmFuc2xhdGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGZhY2UgSURzIGludG8gcmVhbCBARlRfRmFjZSBvYmplY3RzLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZXFfZGF0YSAgOjogQSBnZW5lcmljIHBvaW50ZXIgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIHJlcXVlc3RlciAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGVhY2ggdGltZSBpdCBpcyBjYWxsZWQgKHNlZSBARlRDX0ZhY2VfUmVxdWVzdGVyKS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYW1hbmFnZXIgIDo6IEEgaGFuZGxlIHRvIGEgbmV3IG1hbmFnZXIgb2JqZWN0LiAgMH5pbiBjYXNlIG9mICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBmYWlsdXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUQ19NYW5hZ2VyX05ldyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgbWF4X2ZhY2VzLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgbWF4X3NpemVzLAotICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAgICAgbWF4X2J5dGVzLAotICAgICAgICAgICAgICAgICAgIEZUQ19GYWNlX1JlcXVlc3RlciAgcmVxdWVzdGVyLAotICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICAgICAgICAgcmVxX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgRlRDX01hbmFnZXIgICAgICAgICphbWFuYWdlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX01hbmFnZXJfUmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRW1wdHkgYSBnaXZlbiBjYWNoZSBtYW5hZ2VyLiAgVGhpcyBzaW1wbHkgZ2V0cyByaWQgb2YgYWxsIHRoZSAgICAgICovCi0gIC8qICAgIGN1cnJlbnRseSBjYWNoZWQgQEZUX0ZhY2UgYW5kIEBGVF9TaXplIG9iamVjdHMgd2l0aGluIHRoZSBtYW5hZ2VyLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hbmFnZXIgOjogQSBoYW5kbGUgdG8gdGhlIG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRDX01hbmFnZXJfUmVzZXQoIEZUQ19NYW5hZ2VyICBtYW5hZ2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfTWFuYWdlcl9Eb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXN0cm95IGEgZ2l2ZW4gbWFuYWdlciBhZnRlciBlbXB0eWluZyBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYW5hZ2VyIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgY2FjaGUgbWFuYWdlciBvYmplY3QuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUQ19NYW5hZ2VyX0RvbmUoIEZUQ19NYW5hZ2VyICBtYW5hZ2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfTWFuYWdlcl9Mb29rdXBGYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXRyaWV2ZSB0aGUgQEZUX0ZhY2Ugb2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gYSBnaXZlbiBmYWNlIElEICAgKi8KLSAgLyogICAgdGhyb3VnaCBhIGNhY2hlIG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWFuYWdlciA6OiBBIGhhbmRsZSB0byB0aGUgY2FjaGUgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2lkIDo6IFRoZSBJRCBvZiB0aGUgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmV0dXJuZWQgQEZUX0ZhY2Ugb2JqZWN0IGlzIGFsd2F5cyBvd25lZCBieSB0aGUgbWFuYWdlci4gIFlvdSAgKi8KLSAgLyogICAgc2hvdWxkIG5ldmVyIHRyeSB0byBkaXNjYXJkIGl0IHlvdXJzZWxmLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgQEZUX0ZhY2Ugb2JqZWN0IGRvZXNuJ3QgbmVjZXNzYXJpbHkgaGF2ZSBhIGN1cnJlbnQgc2l6ZSBvYmplY3QgKi8KLSAgLyogICAgKGkuZS4sIGZhY2UtPnNpemUgY2FuIGJlfjApLiAgSWYgeW91IG5lZWQgYSBzcGVjaWZpYyBgZm9udCBzaXplJywgICovCi0gIC8qICAgIHVzZSBARlRDX01hbmFnZXJfTG9va3VwU2l6ZSBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTmV2ZXIgY2hhbmdlIHRoZSBmYWNlJ3MgdHJhbnNmb3JtYXRpb24gbWF0cml4IChpLmUuLCBuZXZlciBjYWxsICAgICovCi0gIC8qICAgIHRoZSBARlRfU2V0X1RyYW5zZm9ybSBmdW5jdGlvbikgb24gYSByZXR1cm5lZCBmYWNlISAgSWYgeW91IG5lZWQgICAqLwotICAvKiAgICB0byB0cmFuc2Zvcm0gZ2x5cGhzLCBkbyBpdCB5b3Vyc2VsZiBhZnRlciBnbHlwaCBsb2FkaW5nLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4geW91IHBlcmZvcm0gYSBsb29rdXAsIG91dC1vZi1tZW1vcnkgZXJyb3JzIGFyZSBkZXRlY3RlZCAgICAgICAqLwotICAvKiAgICBfd2l0aGluXyB0aGUgbG9va3VwIGFuZCBmb3JjZSBpbmNyZW1lbnRhbCBmbHVzaGVzIG9mIHRoZSBjYWNoZSAgICAgKi8KLSAgLyogICAgdW50aWwgZW5vdWdoIG1lbW9yeSBpcyByZWxlYXNlZCBmb3IgdGhlIGxvb2t1cCB0byBzdWNjZWVkLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBhIGxvb2t1cCBmYWlscyB3aXRoIGBGVF9FcnJfT3V0X09mX01lbW9yeScgdGhlIGNhY2hlIGhhcyAgICAgICAgKi8KLSAgLyogICAgYWxyZWFkeSBiZWVuIGNvbXBsZXRlbHkgZmx1c2hlZCwgYW5kIHN0aWxsIG5vIG1lbW9yeSB3YXMgYXZhaWxhYmxlICovCi0gIC8qICAgIGZvciB0aGUgb3BlcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUQ19NYW5hZ2VyX0xvb2t1cEZhY2UoIEZUQ19NYW5hZ2VyICBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfRmFjZUlEICAgZmFjZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgKmFmYWNlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfU2NhbGVyUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIGEgZ2l2ZW4gY2hhcmFjdGVyIHNpemUgaW4gZWl0aGVyICAgICAgKi8KLSAgLyogICAgcGl4ZWxzIG9yIHBvaW50cyB0byB0aGUgY2FjaGUgbWFuYWdlci4gIFNlZSAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVENfTWFuYWdlcl9Mb29rdXBTaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaWQgOjogVGhlIHNvdXJjZSBmYWNlIElELiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lkdGggICA6OiBUaGUgY2hhcmFjdGVyIHdpZHRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWlnaHQgIDo6IFRoZSBjaGFyYWN0ZXIgaGVpZ2h0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBpeGVsICAgOjogQSBCb29sZWFuLiAgSWYgMSwgdGhlIGB3aWR0aCcgYW5kIGBoZWlnaHQnIGZpZWxkcyBhcmUgICAqLwotICAvKiAgICAgICAgICAgICAgIGludGVycHJldGVkIGFzIGludGVnZXIgcGl4ZWwgY2hhcmFjdGVyIHNpemVzLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZXkgYXJlIGV4cHJlc3NlZCBhcyAxLzY0dGggb2YgcG9pbnRzLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4X3JlcyAgIDo6IE9ubHkgdXNlZCB3aGVuIGBwaXhlbCcgaXMgdmFsdWV+MCB0byBpbmRpY2F0ZSB0aGUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBob3Jpem9udGFsIHJlc29sdXRpb24gaW4gZHBpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5X3JlcyAgIDo6IE9ubHkgdXNlZCB3aGVuIGBwaXhlbCcgaXMgdmFsdWV+MCB0byBpbmRpY2F0ZSB0aGUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICB2ZXJ0aWNhbCByZXNvbHV0aW9uIGluIGRwaS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyB0eXBlIGlzIG1haW5seSB1c2VkIHRvIHJldHJpZXZlIEBGVF9TaXplIG9iamVjdHMgdGhyb3VnaCB0aGUgICovCi0gIC8qICAgIGNhY2hlIG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUQ19TY2FsZXJSZWNfCi0gIHsKLSAgICBGVENfRmFjZUlEICBmYWNlX2lkOwotICAgIEZUX1VJbnQgICAgIHdpZHRoOwotICAgIEZUX1VJbnQgICAgIGhlaWdodDsKLSAgICBGVF9JbnQgICAgICBwaXhlbDsKLSAgICBGVF9VSW50ICAgICB4X3JlczsKLSAgICBGVF9VSW50ICAgICB5X3JlczsKLQotICB9IEZUQ19TY2FsZXJSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfU2NhbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhbiBARlRDX1NjYWxlclJlYyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUQ19TY2FsZXJSZWNfKiAgRlRDX1NjYWxlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19NYW5hZ2VyX0xvb2t1cFNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlIHRoZSBARlRfU2l6ZSBvYmplY3QgdGhhdCBjb3JyZXNwb25kcyB0byBhIGdpdmVuICAgICAgICAgICAqLwotICAvKiAgICBARlRDX1NjYWxlclJlYyBwb2ludGVyIHRocm91Z2ggYSBjYWNoZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYW5hZ2VyIDo6IEEgaGFuZGxlIHRvIHRoZSBjYWNoZSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNjYWxlciAgOjogQSBzY2FsZXIgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFzaXplICAgOjogQSBoYW5kbGUgdG8gdGhlIHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXR1cm5lZCBARlRfU2l6ZSBvYmplY3QgaXMgYWx3YXlzIG93bmVkIGJ5IHRoZSBtYW5hZ2VyLiAgWW91ICAqLwotICAvKiAgICBzaG91bGQgbmV2ZXIgdHJ5IHRvIGRpc2NhcmQgaXQgYnkgeW91cnNlbGYuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFlvdSBjYW4gYWNjZXNzIHRoZSBwYXJlbnQgQEZUX0ZhY2Ugb2JqZWN0IHNpbXBseSBhcyBgc2l6ZS0+ZmFjZScgICAqLwotICAvKiAgICBpZiB5b3UgbmVlZCBpdC4gIE5vdGUgdGhhdCB0aGlzIG9iamVjdCBpcyBhbHNvIG93bmVkIGJ5IHRoZSAgICAgICAgKi8KLSAgLyogICAgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2hlbiB5b3UgcGVyZm9ybSBhIGxvb2t1cCwgb3V0LW9mLW1lbW9yeSBlcnJvcnMgYXJlIGRldGVjdGVkICAgICAgICovCi0gIC8qICAgIF93aXRoaW5fIHRoZSBsb29rdXAgYW5kIGZvcmNlIGluY3JlbWVudGFsIGZsdXNoZXMgb2YgdGhlIGNhY2hlICAgICAqLwotICAvKiAgICB1bnRpbCBlbm91Z2ggbWVtb3J5IGlzIHJlbGVhc2VkIGZvciB0aGUgbG9va3VwIHRvIHN1Y2NlZWQuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGEgbG9va3VwIGZhaWxzIHdpdGggYEZUX0Vycl9PdXRfT2ZfTWVtb3J5JyB0aGUgY2FjaGUgaGFzICAgICAgICAqLwotICAvKiAgICBhbHJlYWR5IGJlZW4gY29tcGxldGVseSBmbHVzaGVkLCBhbmQgc3RpbGwgbm8gbWVtb3J5IGlzIGF2YWlsYWJsZSAgKi8KLSAgLyogICAgZm9yIHRoZSBvcGVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRDX01hbmFnZXJfTG9va3VwU2l6ZSggRlRDX01hbmFnZXIgIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19TY2FsZXIgICBzY2FsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemUgICAgICphc2l6ZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX05vZGVfVW5yZWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVjcmVtZW50IGEgY2FjaGUgbm9kZSdzIGludGVybmFsIHJlZmVyZW5jZSBjb3VudC4gIFdoZW4gdGhlIGNvdW50ICovCi0gIC8qICAgIHJlYWNoZXMgMCwgaXQgaXMgbm90IGRlc3Ryb3llZCBidXQgYmVjb21lcyBlbGlnaWJsZSBmb3Igc3Vic2VxdWVudCAqLwotICAvKiAgICBjYWNoZSBmbHVzaGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBub2RlICAgIDo6IFRoZSBjYWNoZSBub2RlIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hbmFnZXIgOjogVGhlIGNhY2hlIG1hbmFnZXIgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRDX05vZGVfVW5yZWYoIEZUQ19Ob2RlICAgICBub2RlLAotICAgICAgICAgICAgICAgICAgRlRDX01hbmFnZXIgIG1hbmFnZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVENfTWFuYWdlcl9SZW1vdmVGYWNlSUQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgc3BlY2lhbCBmdW5jdGlvbiB1c2VkIHRvIGluZGljYXRlIHRvIHRoZSBjYWNoZSBtYW5hZ2VyIHRoYXQKLSAgICogICBhIGdpdmVuIEBGVENfRmFjZUlEIGlzIG5vIGxvbmdlciB2YWxpZCwgZWl0aGVyIGJlY2F1c2UgaXRzCi0gICAqICAgY29udGVudCBjaGFuZ2VkLCBvciBiZWNhdXNlIGl0IHdhcyBkZWFsbG9jYXRlZCBvciB1bmluc3RhbGxlZC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIG1hbmFnZXIgOjoKLSAgICogICAgIFRoZSBjYWNoZSBtYW5hZ2VyIGhhbmRsZS4KLSAgICoKLSAgICogICBmYWNlX2lkIDo6Ci0gICAqICAgICBUaGUgQEZUQ19GYWNlSUQgdG8gYmUgcmVtb3ZlZC4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhpcyBmdW5jdGlvbiBmbHVzaGVzIGFsbCBub2RlcyBmcm9tIHRoZSBjYWNoZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMKLSAgICogICBgZmFjZV9pZCcsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBub2RlcyB3aXRoIGEgbm9uLW51bGwgcmVmZXJlbmNlCi0gICAqICAgY291bnQuCi0gICAqCi0gICAqICAgU3VjaCBub2RlcyBhcmUgaG93ZXZlciBtb2RpZmllZCBpbnRlcm5hbGx5IHNvIGFzIHRvIG5ldmVyIGFwcGVhcgotICAgKiAgIGluIGxhdGVyIGxvb2t1cHMgd2l0aCB0aGUgc2FtZSBgZmFjZV9pZCcgdmFsdWUsIGFuZCB0byBiZSBpbW1lZGlhdGVseQotICAgKiAgIGRlc3Ryb3llZCB3aGVuIHJlbGVhc2VkIGJ5IGFsbCB0aGVpciB1c2Vycy4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUQ19NYW5hZ2VyX1JlbW92ZUZhY2VJRCggRlRDX01hbmFnZXIgIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0ZhY2VJRCAgIGZhY2VfaWQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhY2hlX3N1YnN5c3RlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgRlRDX0NNYXBDYWNoZQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQW4gb3BhcXVlIGhhbmRsZSB1c2VkIHRvIG1vZGVsIGEgY2hhcm1hcCBjYWNoZS4gIFRoaXMgY2FjaGUgaXMgdG8KLSAgICogICBob2xkIGNoYXJhY3RlciBjb2RlcyAtPiBnbHlwaCBpbmRpY2VzIG1hcHBpbmdzLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRDX0NNYXBDYWNoZVJlY18qICBGVENfQ01hcENhY2hlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUQ19DTWFwQ2FjaGVfTmV3Ci0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBDcmVhdGUgYSBuZXcgY2hhcm1hcCBjYWNoZS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIG1hbmFnZXIgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBjYWNoZSBtYW5hZ2VyLgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgIGFjYWNoZSA6OgotICAgKiAgICAgQSBuZXcgY2FjaGUgaGFuZGxlLiAgTlVMTCBpbiBjYXNlIG9mIGVycm9yLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIExpa2UgYWxsIG90aGVyIGNhY2hlcywgdGhpcyBvbmUgd2lsbCBiZSBkZXN0cm95ZWQgd2l0aCB0aGUgY2FjaGUKLSAgICogICBtYW5hZ2VyLgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUQ19DTWFwQ2FjaGVfTmV3KCBGVENfTWFuYWdlciAgICAgbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUQ19DTWFwQ2FjaGUgICphY2FjaGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUQ19DTWFwQ2FjaGVfTG9va3VwCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUcmFuc2xhdGUgYSBjaGFyYWN0ZXIgY29kZSBpbnRvIGEgZ2x5cGggaW5kZXgsIHVzaW5nIHRoZSBjaGFybWFwCi0gICAqICAgY2FjaGUuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBjYWNoZSA6OgotICAgKiAgICAgQSBjaGFybWFwIGNhY2hlIGhhbmRsZS4KLSAgICoKLSAgICogICBmYWNlX2lkIDo6Ci0gICAqICAgICBUaGUgc291cmNlIGZhY2UgSUQuCi0gICAqCi0gICAqICAgY21hcF9pbmRleCA6OgotICAgKiAgICAgVGhlIGluZGV4IG9mIHRoZSBjaGFybWFwIGluIHRoZSBzb3VyY2UgZmFjZS4gIEFueSBuZWdhdGl2ZSB2YWx1ZQotICAgKiAgICAgbWVhbnMgdG8gdXNlIHRoZSBjYWNoZSBARlRfRmFjZSdzIGRlZmF1bHQgY2hhcm1hcC4KLSAgICoKLSAgICogICBjaGFyX2NvZGUgOjoKLSAgICogICAgIFRoZSBjaGFyYWN0ZXIgY29kZSAoaW4gdGhlIGNvcnJlc3BvbmRpbmcgY2hhcm1hcCkuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgIEdseXBoIGluZGV4LiAgMH5tZWFucyBgbm8gZ2x5cGgnLgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9VSW50ICkKLSAgRlRDX0NNYXBDYWNoZV9Mb29rdXAoIEZUQ19DTWFwQ2FjaGUgIGNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0ZhY2VJRCAgICAgZmFjZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGNtYXBfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICAgICBjaGFyX2NvZGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhY2hlX3N1YnN5c3RlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICBJTUFHRSBDQUNIRSBPQkpFQ1QgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHN0cnVjdDoKLSAgICogICBGVENfSW1hZ2VUeXBlUmVjCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIHRoZSB0eXBlIG9mIGltYWdlcyBpbiBhIGdseXBoIGNhY2hlLgotICAgKgotICAgKiBAZmllbGRzOgotICAgKiAgIGZhY2VfaWQgOjoKLSAgICogICAgIFRoZSBmYWNlIElELgotICAgKgotICAgKiAgIHdpZHRoIDo6Ci0gICAqICAgICBUaGUgd2lkdGggaW4gcGl4ZWxzLgotICAgKgotICAgKiAgIGhlaWdodCA6OgotICAgKiAgICAgVGhlIGhlaWdodCBpbiBwaXhlbHMuCi0gICAqCi0gICAqICAgZmxhZ3MgOjoKLSAgICogICAgIFRoZSBsb2FkIGZsYWdzLCBhcyBpbiBARlRfTG9hZF9HbHlwaC4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVENfSW1hZ2VUeXBlUmVjXwotICB7Ci0gICAgRlRDX0ZhY2VJRCAgZmFjZV9pZDsKLSAgICBGVF9VSW50ICAgICB3aWR0aDsKLSAgICBGVF9VSW50ICAgICBoZWlnaHQ7Ci0gICAgRlRfSW50MzIgICAgZmxhZ3M7Ci0KLSAgfSBGVENfSW1hZ2VUeXBlUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgRlRDX0ltYWdlVHlwZQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBoYW5kbGUgdG8gYW4gQEZUQ19JbWFnZVR5cGVSZWMgc3RydWN0dXJlLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRDX0ltYWdlVHlwZVJlY18qICBGVENfSW1hZ2VUeXBlOwotCi0KLSAgLyogKi8KLQotCi0jZGVmaW5lIEZUQ19JTUFHRV9UWVBFX0NPTVBBUkUoIGQxLCBkMiApICAgICAgXAotICAgICAgICAgICggKGQxKS0+ZmFjZV9pZCA9PSAoZDIpLT5mYWNlX2lkICYmIFwKLSAgICAgICAgICAgIChkMSktPndpZHRoICAgPT0gKGQyKS0+d2lkdGggICAmJiBcCi0gICAgICAgICAgICAoZDEpLT5mbGFncyAgID09IChkMiktPmZsYWdzICAgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX0ltYWdlQ2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBnbHlwaCBpbWFnZSBjYWNoZSBvYmplY3QuICBUaGV5IGFyZSBkZXNpZ25lZCB0byAgICAgICovCi0gIC8qICAgIGhvbGQgbWFueSBkaXN0aW5jdCBnbHlwaCBpbWFnZXMgd2hpbGUgbm90IGV4Y2VlZGluZyBhIGNlcnRhaW4gICAgICAqLwotICAvKiAgICBtZW1vcnkgdGhyZXNob2xkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUQ19JbWFnZUNhY2hlUmVjXyogIEZUQ19JbWFnZUNhY2hlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX0ltYWdlQ2FjaGVfTmV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3JlYXRlIGEgbmV3IGdseXBoIGltYWdlIGNhY2hlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWFuYWdlciA6OiBUaGUgcGFyZW50IG1hbmFnZXIgZm9yIHRoZSBpbWFnZSBjYWNoZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWNhY2hlICA6OiBBIGhhbmRsZSB0byB0aGUgbmV3IGdseXBoIGltYWdlIGNhY2hlIG9iamVjdC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRDX0ltYWdlQ2FjaGVfTmV3KCBGVENfTWFuYWdlciAgICAgIG1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRDX0ltYWdlQ2FjaGUgICphY2FjaGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19JbWFnZUNhY2hlX0xvb2t1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlIGEgZ2l2ZW4gZ2x5cGggaW1hZ2UgZnJvbSBhIGdseXBoIGltYWdlIGNhY2hlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhY2hlICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGdseXBoIGltYWdlIGNhY2hlLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHlwZSAgIDo6IEEgcG9pbnRlciB0byBhIGdseXBoIGltYWdlIHR5cGUgZGVzY3JpcHRvci4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnaW5kZXggOjogVGhlIGdseXBoIGluZGV4IHRvIHJldHJpZXZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZ2x5cGggOjogVGhlIGNvcnJlc3BvbmRpbmcgQEZUX0dseXBoIG9iamVjdC4gIDB+aW4gY2FzZSBvZiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIGZhaWx1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbm9kZSAgOjogVXNlZCB0byByZXR1cm4gdGhlIGFkZHJlc3Mgb2Ygb2YgdGhlIGNvcnJlc3BvbmRpbmcgY2FjaGUgKi8KLSAgLyogICAgICAgICAgICAgIG5vZGUgYWZ0ZXIgaW5jcmVtZW50aW5nIGl0cyByZWZlcmVuY2UgY291bnQgKHNlZSBub3RlICAgICovCi0gIC8qICAgICAgICAgICAgICBiZWxvdykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXR1cm5lZCBnbHlwaCBpcyBvd25lZCBhbmQgbWFuYWdlZCBieSB0aGUgZ2x5cGggaW1hZ2UgY2FjaGUuICAqLwotICAvKiAgICBOZXZlciB0cnkgdG8gdHJhbnNmb3JtIG9yIGRpc2NhcmQgaXQgbWFudWFsbHkhICBZb3UgY2FuIGhvd2V2ZXIgICAgKi8KLSAgLyogICAgY3JlYXRlIGEgY29weSB3aXRoIEBGVF9HbHlwaF9Db3B5IGFuZCBtb2RpZnkgdGhlIG5ldyBvbmUuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgYW5vZGUnIGlzIF9ub3RfIE5VTEwsIGl0IHJlY2VpdmVzIHRoZSBhZGRyZXNzIG9mIHRoZSBjYWNoZSAgICAgKi8KLSAgLyogICAgbm9kZSBjb250YWluaW5nIHRoZSBnbHlwaCBpbWFnZSwgYWZ0ZXIgaW5jcmVhc2luZyBpdHMgcmVmZXJlbmNlICAgICovCi0gIC8qICAgIGNvdW50LiAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlIG5vZGUgKGFzIHdlbGwgYXMgdGhlIEBGVF9HbHlwaCkgd2lsbCAqLwotICAvKiAgICBhbHdheXMgYmUga2VwdCBpbiB0aGUgY2FjaGUgdW50aWwgeW91IGNhbGwgQEZUQ19Ob2RlX1VucmVmIHRvICAgICAgKi8KLSAgLyogICAgYHJlbGVhc2UnIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgYW5vZGUnIGlzIE5VTEwsIHRoZSBjYWNoZSBub2RlIGlzIGxlZnQgdW5jaGFuZ2VkLCB3aGljaCBtZWFucyAgKi8KLSAgLyogICAgdGhhdCB0aGUgQEZUX0dseXBoIGNvdWxkIGJlIGZsdXNoZWQgb3V0IG9mIHRoZSBjYWNoZSBvbiB0aGUgbmV4dCAgICovCi0gIC8qICAgIGNhbGwgdG8gb25lIG9mIHRoZSBjYWNoaW5nIHN1Yi1zeXN0ZW0gQVBJcy4gIERvbid0IGFzc3VtZSB0aGF0IGl0ICAqLwotICAvKiAgICBpcyBwZXJzaXN0ZW50ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVENfSW1hZ2VDYWNoZV9Mb29rdXAoIEZUQ19JbWFnZUNhY2hlICBjYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVENfSW1hZ2VUeXBlICAgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoICAgICAgICphZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRDX05vZGUgICAgICAgKmFub2RlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfSW1hZ2VDYWNoZV9Mb29rdXBTY2FsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHZhcmlhbnQgb2YgQEZUQ19JbWFnZUNhY2hlX0xvb2t1cCB0aGF0IHVzZXMgYW4gQEZUQ19TY2FsZXJSZWMgICAgKi8KLSAgLyogICAgdG8gc3BlY2lmeSB0aGUgZmFjZSBJRCBhbmQgaXRzIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FjaGUgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGdseXBoIGltYWdlIGNhY2hlLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzY2FsZXIgICAgIDo6IEEgcG9pbnRlciB0byBhIHNjYWxlciBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgOjogVGhlIGNvcnJlc3BvbmRpbmcgbG9hZCBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2luZGV4ICAgICA6OiBUaGUgZ2x5cGggaW5kZXggdG8gcmV0cmlldmUuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWdseXBoICAgICA6OiBUaGUgY29ycmVzcG9uZGluZyBARlRfR2x5cGggb2JqZWN0LiAgMH5pbiBjYXNlIG9mICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZmFpbHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYW5vZGUgICAgICA6OiBVc2VkIHRvIHJldHVybiB0aGUgYWRkcmVzcyBvZiBvZiB0aGUgY29ycmVzcG9uZGluZyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgY2FjaGUgbm9kZSBhZnRlciBpbmNyZW1lbnRpbmcgaXRzIHJlZmVyZW5jZSBjb3VudCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIChzZWUgbm90ZSBiZWxvdykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmV0dXJuZWQgZ2x5cGggaXMgb3duZWQgYW5kIG1hbmFnZWQgYnkgdGhlIGdseXBoIGltYWdlIGNhY2hlLiAgKi8KLSAgLyogICAgTmV2ZXIgdHJ5IHRvIHRyYW5zZm9ybSBvciBkaXNjYXJkIGl0IG1hbnVhbGx5ISAgWW91IGNhbiBob3dldmVyICAgICovCi0gIC8qICAgIGNyZWF0ZSBhIGNvcHkgd2l0aCBARlRfR2x5cGhfQ29weSBhbmQgbW9kaWZ5IHRoZSBuZXcgb25lLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgYGFub2RlJyBpcyBfbm90XyBOVUxMLCBpdCByZWNlaXZlcyB0aGUgYWRkcmVzcyBvZiB0aGUgY2FjaGUgICAgICovCi0gIC8qICAgIG5vZGUgY29udGFpbmluZyB0aGUgZ2x5cGggaW1hZ2UsIGFmdGVyIGluY3JlYXNpbmcgaXRzIHJlZmVyZW5jZSAgICAqLwotICAvKiAgICBjb3VudC4gIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBub2RlIChhcyB3ZWxsIGFzIHRoZSBARlRfR2x5cGgpIHdpbGwgKi8KLSAgLyogICAgYWx3YXlzIGJlIGtlcHQgaW4gdGhlIGNhY2hlIHVudGlsIHlvdSBjYWxsIEBGVENfTm9kZV9VbnJlZiB0byAgICAgICovCi0gIC8qICAgIGByZWxlYXNlJyBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgYGFub2RlJyBpcyBOVUxMLCB0aGUgY2FjaGUgbm9kZSBpcyBsZWZ0IHVuY2hhbmdlZCwgd2hpY2ggbWVhbnMgICovCi0gIC8qICAgIHRoYXQgdGhlIEBGVF9HbHlwaCBjb3VsZCBiZSBmbHVzaGVkIG91dCBvZiB0aGUgY2FjaGUgb24gdGhlIG5leHQgICAqLwotICAvKiAgICBjYWxsIHRvIG9uZSBvZiB0aGUgY2FjaGluZyBzdWItc3lzdGVtIEFQSXMuICBEb24ndCBhc3N1bWUgdGhhdCBpdCAgKi8KLSAgLyogICAgaXMgcGVyc2lzdGVudCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDYWxscyB0byBARlRfU2V0X0NoYXJfU2l6ZSBhbmQgZnJpZW5kcyBoYXZlIG5vIGVmZmVjdCBvbiBjYWNoZWQgICAgKi8KLSAgLyogICAgZ2x5cGhzOyB5b3Ugc2hvdWxkIGFsd2F5cyB1c2UgdGhlIEZyZWVUeXBlIGNhY2hlIEFQSSBpbnN0ZWFkLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRDX0ltYWdlQ2FjaGVfTG9va3VwU2NhbGVyKCBGVENfSW1hZ2VDYWNoZSAgY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX1NjYWxlciAgICAgIHNjYWxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgbG9hZF9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoICAgICAgICphZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX05vZGUgICAgICAgKmFub2RlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfU0JpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIHNtYWxsIGJpdG1hcCBkZXNjcmlwdG9yLiAgU2VlIHRoZSBARlRDX1NCaXRSZWMgICAgICAgKi8KLSAgLyogICAgc3RydWN0dXJlIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVENfU0JpdFJlY18qICBGVENfU0JpdDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19TQml0UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdmVyeSBjb21wYWN0IHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIGEgc21hbGwgZ2x5cGggYml0bWFwLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHdpZHRoICAgICA6OiBUaGUgYml0bWFwIHdpZHRoIGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVpZ2h0ICAgIDo6IFRoZSBiaXRtYXAgaGVpZ2h0IGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZWZ0ICAgICAgOjogVGhlIGhvcml6b250YWwgZGlzdGFuY2UgZnJvbSB0aGUgcGVuIHBvc2l0aW9uIHRvIHRoZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGxlZnQgYml0bWFwIGJvcmRlciAoYS5rLmEuIGBsZWZ0IHNpZGUgYmVhcmluZycsIG9yICAgICovCi0gIC8qICAgICAgICAgICAgICAgICBgbHNiJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG9wICAgICAgIDo6IFRoZSB2ZXJ0aWNhbCBkaXN0YW5jZSBmcm9tIHRoZSBwZW4gcG9zaXRpb24gKG9uIHRoZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICBiYXNlbGluZSkgdG8gdGhlIHVwcGVyIGJpdG1hcCBib3JkZXIgKGEuay5hLiBgdG9wICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgc2lkZSBiZWFyaW5nJykuICBUaGUgZGlzdGFuY2UgaXMgcG9zaXRpdmUgZm9yIHVwd2FyZHMgKi8KLSAgLyogICAgICAgICAgICAgICAgIHl+Y29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb3JtYXQgICAgOjogVGhlIGZvcm1hdCBvZiB0aGUgZ2x5cGggYml0bWFwIChtb25vY2hyb21lIG9yIGdyYXkpLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9ncmF5cyA6OiBNYXhpbXVtIGdyYXkgbGV2ZWwgdmFsdWUgKGluIHRoZSByYW5nZSAxIHRvfjI1NSkuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGl0Y2ggICAgIDo6IFRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIGJpdG1hcCBsaW5lLiAgTWF5IGJlIHBvc2l0aXZlICovCi0gIC8qICAgICAgICAgICAgICAgICBvciBuZWdhdGl2ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeGFkdmFuY2UgIDo6IFRoZSBob3Jpem9udGFsIGFkdmFuY2Ugd2lkdGggaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5YWR2YW5jZSAgOjogVGhlIHZlcnRpY2FsIGFkdmFuY2UgaGVpZ2h0IGluIHBpeGVscy4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ1ZmZlciAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIGJpdG1hcCBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUQ19TQml0UmVjXwotICB7Ci0gICAgRlRfQnl0ZSAgIHdpZHRoOwotICAgIEZUX0J5dGUgICBoZWlnaHQ7Ci0gICAgRlRfQ2hhciAgIGxlZnQ7Ci0gICAgRlRfQ2hhciAgIHRvcDsKLQotICAgIEZUX0J5dGUgICBmb3JtYXQ7Ci0gICAgRlRfQnl0ZSAgIG1heF9ncmF5czsKLSAgICBGVF9TaG9ydCAgcGl0Y2g7Ci0gICAgRlRfQ2hhciAgIHhhZHZhbmNlOwotICAgIEZUX0NoYXIgICB5YWR2YW5jZTsKLQotICAgIEZUX0J5dGUqICBidWZmZXI7Ci0KLSAgfSBGVENfU0JpdFJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUQ19TQml0Q2FjaGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgc21hbGwgYml0bWFwIGNhY2hlLiAgVGhlc2UgYXJlIHNwZWNpYWwgY2FjaGUgb2JqZWN0cyAqLwotICAvKiAgICB1c2VkIHRvIHN0b3JlIHNtYWxsIGdseXBoIGJpdG1hcHMgKGFuZCBhbnRpLWFsaWFzZWQgcGl4bWFwcykgaW4gYSAgKi8KLSAgLyogICAgbXVjaCBtb3JlIGVmZmljaWVudCB3YXkgdGhhbiB0aGUgdHJhZGl0aW9uYWwgZ2x5cGggaW1hZ2UgY2FjaGUgICAgICovCi0gIC8qICAgIGltcGxlbWVudGVkIGJ5IEBGVENfSW1hZ2VDYWNoZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRDX1NCaXRDYWNoZVJlY18qICBGVENfU0JpdENhY2hlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX1NCaXRDYWNoZV9OZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3JlYXRlIGEgbmV3IGNhY2hlIHRvIHN0b3JlIHNtYWxsIGdseXBoIGJpdG1hcHMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWFuYWdlciA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGNhY2hlIG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWNhY2hlICA6OiBBIGhhbmRsZSB0byB0aGUgbmV3IHNiaXQgY2FjaGUuICBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRDX1NCaXRDYWNoZV9OZXcoIEZUQ19NYW5hZ2VyICAgICBtYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgRlRDX1NCaXRDYWNoZSAgKmFjYWNoZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRDX1NCaXRDYWNoZV9Mb29rdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9vayB1cCBhIGdpdmVuIHNtYWxsIGdseXBoIGJpdG1hcCBpbiBhIGdpdmVuIHNiaXQgY2FjaGUgYW5kICAgICAgICovCi0gIC8qICAgIGBsb2NrJyBpdCB0byBwcmV2ZW50IGl0cyBmbHVzaGluZyBmcm9tIHRoZSBjYWNoZSB1bnRpbCBuZWVkZWQuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhY2hlICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIHNiaXQgY2FjaGUuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHlwZSAgIDo6IEEgcG9pbnRlciB0byB0aGUgZ2x5cGggaW1hZ2UgdHlwZSBkZXNjcmlwdG9yLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnaW5kZXggOjogVGhlIGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzYml0ICAgOjogQSBoYW5kbGUgdG8gYSBzbWFsbCBiaXRtYXAgZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFub2RlICA6OiBVc2VkIHRvIHJldHVybiB0aGUgYWRkcmVzcyBvZiBvZiB0aGUgY29ycmVzcG9uZGluZyBjYWNoZSAqLwotICAvKiAgICAgICAgICAgICAgbm9kZSBhZnRlciBpbmNyZW1lbnRpbmcgaXRzIHJlZmVyZW5jZSBjb3VudCAoc2VlIG5vdGUgICAgKi8KLSAgLyogICAgICAgICAgICAgIGJlbG93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHNtYWxsIGJpdG1hcCBkZXNjcmlwdG9yIGFuZCBpdHMgYml0IGJ1ZmZlciBhcmUgb3duZWQgYnkgdGhlICAgICovCi0gIC8qICAgIGNhY2hlIGFuZCBzaG91bGQgbmV2ZXIgYmUgZnJlZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiAgVGhleSBtaWdodCAgICAqLwotICAvKiAgICBhcyB3ZWxsIGRpc2FwcGVhciBmcm9tIG1lbW9yeSBvbiB0aGUgbmV4dCBjYWNoZSBsb29rdXAsIHNvIGRvbid0ICAgKi8KLSAgLyogICAgdHJlYXQgdGhlbSBhcyBwZXJzaXN0ZW50IGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZGVzY3JpcHRvcidzIGBidWZmZXInIGZpZWxkIGlzIHNldCB0b34wIHRvIGluZGljYXRlIGEgbWlzc2luZyAgKi8KLSAgLyogICAgZ2x5cGggYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgYW5vZGUnIGlzIF9ub3RfIE5VTEwsIGl0IHJlY2VpdmVzIHRoZSBhZGRyZXNzIG9mIHRoZSBjYWNoZSAgICAgKi8KLSAgLyogICAgbm9kZSBjb250YWluaW5nIHRoZSBiaXRtYXAsIGFmdGVyIGluY3JlYXNpbmcgaXRzIHJlZmVyZW5jZSBjb3VudC4gICovCi0gIC8qICAgIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBub2RlIChhcyB3ZWxsIGFzIHRoZSBpbWFnZSkgd2lsbCBhbHdheXMgYmUgICAqLwotICAvKiAgICBrZXB0IGluIHRoZSBjYWNoZSB1bnRpbCB5b3UgY2FsbCBARlRDX05vZGVfVW5yZWYgdG8gYHJlbGVhc2UnIGl0LiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGBhbm9kZScgaXMgTlVMTCwgdGhlIGNhY2hlIG5vZGUgaXMgbGVmdCB1bmNoYW5nZWQsIHdoaWNoIG1lYW5zICAqLwotICAvKiAgICB0aGF0IHRoZSBiaXRtYXAgY291bGQgYmUgZmx1c2hlZCBvdXQgb2YgdGhlIGNhY2hlIG9uIHRoZSBuZXh0ICAgICAgKi8KLSAgLyogICAgY2FsbCB0byBvbmUgb2YgdGhlIGNhY2hpbmcgc3ViLXN5c3RlbSBBUElzLiAgRG9uJ3QgYXNzdW1lIHRoYXQgaXQgICovCi0gIC8qICAgIGlzIHBlcnNpc3RlbnQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUQ19TQml0Q2FjaGVfTG9va3VwKCBGVENfU0JpdENhY2hlICAgIGNhY2hlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRDX0ltYWdlVHlwZSAgICB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVENfU0JpdCAgICAgICAgKnNiaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVENfTm9kZSAgICAgICAgKmFub2RlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVENfU0JpdENhY2hlX0xvb2t1cFNjYWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHZhcmlhbnQgb2YgQEZUQ19TQml0Q2FjaGVfTG9va3VwIHRoYXQgdXNlcyBhbiBARlRDX1NjYWxlclJlYyAgICAgKi8KLSAgLyogICAgdG8gc3BlY2lmeSB0aGUgZmFjZSBJRCBhbmQgaXRzIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2FjaGUgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIHNiaXQgY2FjaGUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzY2FsZXIgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgc2NhbGVyIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgOjogVGhlIGNvcnJlc3BvbmRpbmcgbG9hZCBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2luZGV4ICAgICA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2JpdCAgICAgICA6OiBBIGhhbmRsZSB0byBhIHNtYWxsIGJpdG1hcCBkZXNjcmlwdG9yLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbm9kZSAgICAgIDo6IFVzZWQgdG8gcmV0dXJuIHRoZSBhZGRyZXNzIG9mIG9mIHRoZSBjb3JyZXNwb25kaW5nICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBjYWNoZSBub2RlIGFmdGVyIGluY3JlbWVudGluZyBpdHMgcmVmZXJlbmNlIGNvdW50ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgKHNlZSBub3RlIGJlbG93KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBzbWFsbCBiaXRtYXAgZGVzY3JpcHRvciBhbmQgaXRzIGJpdCBidWZmZXIgYXJlIG93bmVkIGJ5IHRoZSAgICAqLwotICAvKiAgICBjYWNoZSBhbmQgc2hvdWxkIG5ldmVyIGJlIGZyZWVkIGJ5IHRoZSBhcHBsaWNhdGlvbi4gIFRoZXkgbWlnaHQgICAgKi8KLSAgLyogICAgYXMgd2VsbCBkaXNhcHBlYXIgZnJvbSBtZW1vcnkgb24gdGhlIG5leHQgY2FjaGUgbG9va3VwLCBzbyBkb24ndCAgICovCi0gIC8qICAgIHRyZWF0IHRoZW0gYXMgcGVyc2lzdGVudCBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGRlc2NyaXB0b3IncyBgYnVmZmVyJyBmaWVsZCBpcyBzZXQgdG9+MCB0byBpbmRpY2F0ZSBhIG1pc3NpbmcgICovCi0gIC8qICAgIGdseXBoIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgYGFub2RlJyBpcyBfbm90XyBOVUxMLCBpdCByZWNlaXZlcyB0aGUgYWRkcmVzcyBvZiB0aGUgY2FjaGUgICAgICovCi0gIC8qICAgIG5vZGUgY29udGFpbmluZyB0aGUgYml0bWFwLCBhZnRlciBpbmNyZWFzaW5nIGl0cyByZWZlcmVuY2UgY291bnQuICAqLwotICAvKiAgICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgbm9kZSAoYXMgd2VsbCBhcyB0aGUgaW1hZ2UpIHdpbGwgYWx3YXlzIGJlICAgKi8KLSAgLyogICAga2VwdCBpbiB0aGUgY2FjaGUgdW50aWwgeW91IGNhbGwgQEZUQ19Ob2RlX1VucmVmIHRvIGByZWxlYXNlJyBpdC4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiBgYW5vZGUnIGlzIE5VTEwsIHRoZSBjYWNoZSBub2RlIGlzIGxlZnQgdW5jaGFuZ2VkLCB3aGljaCBtZWFucyAgKi8KLSAgLyogICAgdGhhdCB0aGUgYml0bWFwIGNvdWxkIGJlIGZsdXNoZWQgb3V0IG9mIHRoZSBjYWNoZSBvbiB0aGUgbmV4dCAgICAgICovCi0gIC8qICAgIGNhbGwgdG8gb25lIG9mIHRoZSBjYWNoaW5nIHN1Yi1zeXN0ZW0gQVBJcy4gIERvbid0IGFzc3VtZSB0aGF0IGl0ICAqLwotICAvKiAgICBpcyBwZXJzaXN0ZW50ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVENfU0JpdENhY2hlX0xvb2t1cFNjYWxlciggRlRDX1NCaXRDYWNoZSAgY2FjaGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVENfU2NhbGVyICAgICBzY2FsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICBsb2FkX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRDX1NCaXQgICAgICAqc2JpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUQ19Ob2RlICAgICAgKmFub2RlICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUQ0FDSEVfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Y2ZmZHJ2LmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Y2ZmZHJ2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOGU0MTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGNmZmRydi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Y2ZmZHJ2LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBBUEkgZm9yIGNvbnRyb2xsaW5nIHRoZSBDRkYgZHJpdmVyIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMy0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUQ0ZGRFJWX0hfXwotI2RlZmluZSBfX0ZUQ0ZGRFJWX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHNlY3Rpb246Ci0gICAqICAgY2ZmX2RyaXZlcgotICAgKgotICAgKiBAdGl0bGU6Ci0gICAqICAgVGhlIENGRiBkcml2ZXIKLSAgICoKLSAgICogQGFic3RyYWN0OgotICAgKiAgIENvbnRyb2xsaW5nIHRoZSBDRkYgZHJpdmVyIG1vZHVsZS4KLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFdoaWxlIEZyZWVUeXBlJ3MgQ0ZGIGRyaXZlciBkb2Vzbid0IGV4cG9zZSBBUEkgZnVuY3Rpb25zIGJ5IGl0c2VsZiwKLSAgICogICBpdCBpcyBwb3NzaWJsZSB0byBjb250cm9sIGl0cyBiZWhhdmlvdXIgd2l0aCBARlRfUHJvcGVydHlfU2V0IGFuZAotICAgKiAgIEBGVF9Qcm9wZXJ0eV9HZXQuICBUaGUgbGlzdCBiZWxvdyBnaXZlcyB0aGUgYXZhaWxhYmxlIHByb3BlcnRpZXMKLSAgICogICB0b2dldGhlciB3aXRoIHRoZSBuZWNlc3NhcnkgbWFjcm9zIGFuZCBzdHJ1Y3R1cmVzLgotICAgKgotICAgKiAgIFRoZSBDRkYgZHJpdmVyJ3MgbW9kdWxlIG5hbWUgaXMgYGNmZicuCi0gICAqCi0gICAqICAgKkhpbnRpbmcqICphbmQqICphbnRpYWxpYXNpbmcqICpwcmluY2lwbGVzKiAqb2YqICp0aGUqICpuZXcqICplbmdpbmUqCi0gICAqCi0gICAqICAgVGhlIHJhc3Rlcml6ZXIgaXMgcG9zaXRpb25pbmcgaG9yaXpvbnRhbCBmZWF0dXJlcyAoZS5nLiwgYXNjZW5kZXIKLSAgICogICBoZWlnaHQgJiB4LWhlaWdodCwgb3IgY3Jvc3NiYXJzKSBvbiB0aGUgcGl4ZWwgZ3JpZCBhbmQgbWluaW1pemluZyB0aGUKLSAgICogICBhbW91bnQgb2YgYW50aWFsaWFzaW5nIGFwcGxpZWQgdG8gdGhlbSwgd2hpbGUgcGxhY2luZyB2ZXJ0aWNhbAotICAgKiAgIGZlYXR1cmVzICh2ZXJ0aWNhbCBzdGVtcykgb24gdGhlIHBpeGVsIGdyaWQgd2l0aG91dCBoaW50aW5nLCB0aHVzCi0gICAqICAgcmVwcmVzZW50aW5nIHRoZSBzdGVtIHBvc2l0aW9uIGFuZCB3ZWlnaHQgYWNjdXJhdGVseS4gIFNvbWV0aW1lcyB0aGUKLSAgICogICB2ZXJ0aWNhbCBzdGVtcyBtYXkgYmUgb25seSBwYXJ0aWFsbHkgYmxhY2suICBJbiB0aGlzIGNvbnRleHQsCi0gICAqICAgYGFudGlhbGlhc2luZycgbWVhbnMgdGhhdCBzdGVtcyBhcmUgbm90IHBvc2l0aW9uZWQgZXhhY3RseSBvbiBwaXhlbAotICAgKiAgIGJvcmRlcnMsIGNhdXNpbmcgYSBmdXp6eSBhcHBlYXJhbmNlLgotICAgKgotICAgKiAgIFRoZXJlIGFyZSB0d28gcHJpbmNpcGxlcyBiZWhpbmQgdGhpcyBhcHByb2FjaC4KLSAgICoKLSAgICogICAxKSBObyBoaW50aW5nIGluIHRoZSBob3Jpem9udGFsIGRpcmVjdGlvbjogVW5saWtlIGBzdXBlcmhpbnRlZCcKLSAgICogICBUcnVlVHlwZSwgd2hpY2ggY2hhbmdlcyBnbHlwaCB3aWR0aHMgdG8gYWNjb21tb2RhdGUgcmVndWxhcgotICAgKiAgIGludGVyLWdseXBoIHNwYWNpbmcsIEFkb2JlJ3MgYXBwcm9hY2ggaXMgYGZhaXRoZnVsIHRvIHRoZSBkZXNpZ24nIGluCi0gICAqICAgcmVwcmVzZW50aW5nIGJvdGggdGhlIGdseXBoIHdpZHRoIGFuZCB0aGUgaW50ZXItZ2x5cGggc3BhY2luZwotICAgKiAgIGRlc2lnbmVkIGZvciB0aGUgZm9udC4gIFRoaXMgbWFrZXMgdGhlIHNjcmVlbiBkaXNwbGF5IGFzIGNsb3NlIGFzIGl0Ci0gICAqICAgY2FuIGJlIHRvIHRoZSByZXN1bHQgb25lIHdvdWxkIGdldCB3aXRoIGluZmluaXRlIHJlc29sdXRpb24sIHdoaWxlCi0gICAqICAgcHJlc2VydmluZyB3aGF0IGlzIGNvbnNpZGVyZWQgdGhlIGtleSBjaGFyYWN0ZXJpc3RpY3Mgb2YgZWFjaCBnbHlwaC4KLSAgICogICBOb3RlIHRoYXQgdGhlIGRpc3RhbmNlcyBiZXR3ZWVuIHVuaGludGVkIGFuZCBncmlkLWZpdHRlZCBwb3NpdGlvbnMgYXQKLSAgICogICBzbWFsbCBzaXplcyBhcmUgY29tcGFyYWJsZSB0byBrZXJuaW5nIHZhbHVlcyBhbmQgdGh1cyB3b3VsZCBiZQotICAgKiAgIG5vdGljZWFibGUgKGFuZCBkaXN0cmFjdGluZykgd2hpbGUgcmVhZGluZyBpZiBoaW50aW5nIHdlcmUgYXBwbGllZC4KLSAgICoKLSAgICogICBPbmUgb2YgdGhlIHJlYXNvbnMgdG8gbm90IGhpbnQgaG9yaXpvbnRhbGx5IGlzIGFudGlhbGlhc2luZyBmb3IgTENECi0gICAqICAgc2NyZWVuczogVGhlIHBpeGVsIGdlb21ldHJ5IG9mIG1vZGVybiBkaXNwbGF5cyBzdXBwbGllcyB0aHJlZQotICAgKiAgIHZlcnRpY2FsIHN1Yi1waXhlbHMgYXMgdGhlIGV5ZSBtb3ZlcyBob3Jpem9udGFsbHkgYWNyb3NzIGVhY2ggdmlzaWJsZQotICAgKiAgIHBpeGVsLiAgT24gZGV2aWNlcyB3aGVyZSB3ZSBjYW4gYmUgY2VydGFpbiB0aGlzIGNoYXJhY3RlcmlzdGljIGlzCi0gICAqICAgcHJlc2VudCBhIHJhc3Rlcml6ZXIgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZSBzdWItcGl4ZWxzIHRvIGFkZAotICAgKiAgIGluY3JlbWVudHMgb2Ygd2VpZ2h0LiAgSW4gV2VzdGVybiB3cml0aW5nIHN5c3RlbXMgdGhpcyB0dXJucyBvdXQgdG8KLSAgICogICBiZSB0aGUgbW9yZSBjcml0aWNhbCBkaXJlY3Rpb24gYW55d2F5OyB0aGUgd2VpZ2h0cyBhbmQgc3BhY2luZyBvZgotICAgKiAgIHZlcnRpY2FsIHN0ZW1zIChzZWUgYWJvdmUpIGFyZSBjZW50cmFsIHRvIEFybWVuaWFuLCBDeXJpbGxpYywgR3JlZWssCi0gICAqICAgYW5kIExhdGluIHR5cGUgZGVzaWducy4gIEV2ZW4gd2hlbiB0aGUgcmFzdGVyaXplciB1c2VzIGdyZXlzY2FsZQotICAgKiAgIGFudGlhbGlhc2luZyBpbnN0ZWFkIG9mIGNvbG9yIChhIG5lY2Vzc2FyeSBjb21wcm9taXNlIHdoZW4gb25lCi0gICAqICAgZG9lc24ndCBrbm93IHRoZSBzY3JlZW4gY2hhcmFjdGVyaXN0aWNzKSwgdGhlIHVuaGludGVkIHZlcnRpY2FsCi0gICAqICAgZmVhdHVyZXMgcHJlc2VydmUgdGhlIGRlc2lnbidzIHdlaWdodCBhbmQgc3BhY2luZyBtdWNoIGJldHRlciB0aGFuCi0gICAqICAgYWxpYXNlZCB0eXBlIHdvdWxkLgotICAgKgotICAgKiAgIDIpIEFsaWdtZW50IGluIHRoZSB2ZXJ0aWNhbCBkaXJlY3Rpb246IFdlaWdodHMgYW5kIHNwYWNpbmcgYWxvbmcgdGhlCi0gICAqICAgeX5heGlzIGFyZSBsZXNzIGNyaXRpY2FsOyB3aGF0IGlzIG11Y2ggbW9yZSBpbXBvcnRhbnQgaXMgdGhlIHZpc3VhbAotICAgKiAgIGFsaWdubWVudCBvZiByZWxhdGVkIGZlYXR1cmVzIChsaWtlIGNhcC1oZWlnaHQgYW5kIHgtaGVpZ2h0KS4gIFRoZQotICAgKiAgIHNlbnNlIG9mIGFsaWdubWVudCBmb3IgdGhlc2UgaXMgZW5oYW5jZWQgYnkgdGhlIHNoYXJwbmVzcyBvZiBncmlkLWZpdAotICAgKiAgIGVkZ2VzLCB3aGlsZSB0aGUgY3J1ZGVyIHZlcnRpY2FsIHJlc29sdXRpb24gKGZ1bGwgcGl4ZWxzIGluc3RlYWQgb2YKLSAgICogICAxLzMgcGl4ZWxzKSBpcyBsZXNzIG9mIGEgcHJvYmxlbS4KLSAgICoKLSAgICogICBPbiB0aGUgdGVjaG5pY2FsIHNpZGUsIGhvcml6b250YWwgYWxpZ25tZW50IHpvbmVzIGZvciBhc2NlbmRlciwKLSAgICogICB4LWhlaWdodCwgYW5kIG90aGVyIGltcG9ydGFudCBoZWlnaHQgdmFsdWVzICh0cmFkaXRpb25hbGx5IGNhbGxlZAotICAgKiAgIGBibHVlIHpvbmVzJykgYXMgZGVmaW5lZCBpbiB0aGUgZm9udCBhcmUgcG9zaXRpb25lZCBpbmRlcGVuZGVudGx5LAotICAgKiAgIGVhY2ggYmVpbmcgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBwaXhlbCBlZGdlLCB0YWtpbmcgY2FyZSBvZgotICAgKiAgIG92ZXJzaG9vdCBzdXBwcmVzc2lvbiBhdCBzbWFsbCBzaXplcywgc3RlbSBkYXJrZW5pbmcsIGFuZCBzY2FsaW5nLgotICAgKgotICAgKiAgIEhzdGVtcyAodGhpcyBpcywgaGludCB2YWx1ZXMgZGVmaW5lZCBpbiB0aGUgZm9udCB0byBoZWxwIGFsaWduCi0gICAqICAgaG9yaXpvbnRhbCBmZWF0dXJlcykgdGhhdCBmYWxsIHdpdGhpbiBhIGJsdWUgem9uZSBhcmUgc2FpZCB0byBiZQotICAgKiAgIGBjYXB0dXJlZCcgYW5kIGFyZSBhbGlnbmVkIHRvIHRoYXQgem9uZS4gIFVuY2FwdHVyZWQgc3RlbXMgYXJlIG1vdmVkCi0gICAqICAgaW4gb25lIG9mIGZvdXIgd2F5cywgdG9wIGVkZ2UgdXAgb3IgZG93biwgYm90dG9tIGVkZ2UgdXAgb3IgZG93bi4KLSAgICogICBVbmxlc3MgdGhlcmUgYXJlIGNvbmZsaWN0aW5nIGhzdGVtcywgdGhlIHNtYWxsZXN0IG1vdmVtZW50IGlzIHRha2VuCi0gICAqICAgdG8gbWluaW1pemUgZGlzdG9ydGlvbi4KLSAgICoKLSAgICogQG9yZGVyOgotICAgKiAgIGhpbnRpbmctZW5naW5lCi0gICAqICAgbm8tc3RlbS1kYXJrZW5pbmcKLSAgICogICBkYXJrZW5pbmctcGFyYW1ldGVycwotICAgKgotICAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAcHJvcGVydHk6Ci0gICAqICAgaGludGluZy1lbmdpbmUKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoYW5rcyB0byBBZG9iZSwgd2hpY2ggY29udHJpYnV0ZWQgYSBuZXcgaGludGluZyAoYW5kIHBhcnNpbmcpCi0gICAqICAgZW5naW5lLCBhbiBhcHBsaWNhdGlvbiBjYW4gc2VsZWN0IGJldHdlZW4gYGZyZWV0eXBlJyBhbmQgYGFkb2JlJyBpZgotICAgKiAgIGNvbXBpbGVkIHdpdGggQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORS4gIElmIHRoaXMgY29uZmlndXJhdGlvbgotICAgKiAgIG1hY3JvIGlzbid0IGRlZmluZWQsIGBoaW50aW5nLWVuZ2luZScgZG9lcyBub3RoaW5nLgotICAgKgotICAgKiAgIFRoZSBkZWZhdWx0IGVuZ2luZSBpcyBgZnJlZXR5cGUnIGlmIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUgaXMKLSAgICogICBkZWZpbmVkLCBhbmQgYGFkb2JlJyBvdGhlcndpc2UuCi0gICAqCi0gICAqICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGNvZGUgZGVtb25zdHJhdGVzIGhvdyB0byBzZWxlY3QgQWRvYmUncyBoaW50aW5nCi0gICAqICAgZW5naW5lIChvbWl0dGluZyB0aGUgZXJyb3IgaGFuZGxpbmcpLgotICAgKgotICAgKiAgIHsKLSAgICogICAgIEZUX0xpYnJhcnkgIGxpYnJhcnk7Ci0gICAqICAgICBGVF9VSW50ICAgICBoaW50aW5nX2VuZ2luZSA9IEZUX0NGRl9ISU5USU5HX0FET0JFOwotICAgKgotICAgKgotICAgKiAgICAgRlRfSW5pdF9GcmVlVHlwZSggJmxpYnJhcnkgKTsKLSAgICoKLSAgICogICAgIEZUX1Byb3BlcnR5X1NldCggbGlicmFyeSwgImNmZiIsCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoaW50aW5nLWVuZ2luZSIsICZoaW50aW5nX2VuZ2luZSApOwotICAgKiAgIH0KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB3aXRoIEBGVF9Qcm9wZXJ0eV9HZXQgYWxzby4KLSAgICoKLSAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgRlRfQ0ZGX0hJTlRJTkdfWFhYCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgY29uc3RhbnRzIHVzZWQgZm9yIHRoZSBAaGludGluZy1lbmdpbmUgcHJvcGVydHkgdG8gc2VsZWN0Ci0gICAqICAgdGhlIGhpbnRpbmcgZW5naW5lIGZvciBDRkYgZm9udHMuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgRlRfQ0ZGX0hJTlRJTkdfRlJFRVRZUEUgOjoKLSAgICogICAgIFVzZSB0aGUgb2xkIEZyZWVUeXBlIGhpbnRpbmcgZW5naW5lLgotICAgKgotICAgKiAgIEZUX0NGRl9ISU5USU5HX0FET0JFIDo6Ci0gICAqICAgICBVc2UgdGhlIGhpbnRpbmcgZW5naW5lIGNvbnRyaWJ1dGVkIGJ5IEFkb2JlLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQ0ZGX0hJTlRJTkdfRlJFRVRZUEUgIDAKLSNkZWZpbmUgRlRfQ0ZGX0hJTlRJTkdfQURPQkUgICAgIDEKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAcHJvcGVydHk6Ci0gICAqICAgbm8tc3RlbS1kYXJrZW5pbmcKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEJ5IGRlZmF1bHQsIHRoZSBBZG9iZSBDRkYgZW5naW5lIGRhcmtlbnMgc3RlbXMgYXQgc21hbGxlciBzaXplcywKLSAgICogICByZWdhcmRsZXNzIG9mIGhpbnRpbmcsIHRvIGVuaGFuY2UgY29udHJhc3QuICBUaGlzIGZlYXR1cmUgcmVxdWlyZXMKLSAgICogICBhIHJlbmRlcmluZyBzeXN0ZW0gd2l0aCBwcm9wZXIgZ2FtbWEgY29ycmVjdGlvbi4gIFNldHRpbmcgdGhpcwotICAgKiAgIHByb3BlcnR5LCBzdGVtIGRhcmtlbmluZyBnZXRzIHN3aXRjaGVkIG9mZi4KLSAgICoKLSAgICogICBOb3RlIHRoYXQgc3RlbSBkYXJrZW5pbmcgaXMgbmV2ZXIgYXBwbGllZCBpZiBARlRfTE9BRF9OT19TQ0FMRSBpcyBzZXQuCi0gICAqCi0gICAqICAgewotICAgKiAgICAgRlRfTGlicmFyeSAgbGlicmFyeTsKLSAgICogICAgIEZUX0Jvb2wgICAgIG5vX3N0ZW1fZGFya2VuaW5nID0gVFJVRTsKLSAgICoKLSAgICoKLSAgICogICAgIEZUX0luaXRfRnJlZVR5cGUoICZsaWJyYXJ5ICk7Ci0gICAqCi0gICAqICAgICBGVF9Qcm9wZXJ0eV9TZXQoIGxpYnJhcnksICJjZmYiLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8tc3RlbS1kYXJrZW5pbmciLCAmbm9fc3RlbV9kYXJrZW5pbmcgKTsKLSAgICogICB9Ci0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgd2l0aCBARlRfUHJvcGVydHlfR2V0IGFsc28uCi0gICAqCi0gICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBwcm9wZXJ0eToKLSAgICogICBkYXJrZW5pbmctcGFyYW1ldGVycwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQnkgZGVmYXVsdCwgdGhlIEFkb2JlIENGRiBlbmdpbmUgZGFya2VucyBzdGVtcyBhcyBmb2xsb3dzIChpZiB0aGUKLSAgICogICBgbm8tc3RlbS1kYXJrZW5pbmcnIHByb3BlcnR5IGlzbid0IHNldCk6Ci0gICAqCi0gICAqICAgewotICAgKiAgICAgc3RlbSB3aWR0aCA8PSAwLjVweDogICBkYXJrZW5pbmcgYW1vdW50ID0gMC40cHgKLSAgICogICAgIHN0ZW0gd2lkdGggID0gMXB4OiAgICAgZGFya2VuaW5nIGFtb3VudCA9IDAuMjc1cHgKLSAgICogICAgIHN0ZW0gd2lkdGggID0gMS42NjdweDogZGFya2VuaW5nIGFtb3VudCA9IDAuMjc1cHgKLSAgICogICAgIHN0ZW0gd2lkdGggPj0gMi4zMzNweDogZGFya2VuaW5nIGFtb3VudCA9IDBweAotICAgKiAgIH0KLSAgICoKLSAgICogICBhbmQgcGllY2V3aXNlIGxpbmVhciBpbi1iZXR3ZWVuLiAgQXQgY29uZmlndXJhdGlvbiB0aW1lLCB0aGVzZSBmb3VyCi0gICAqICAgY29udHJvbCBwb2ludHMgY2FuIGJlIHNldCB3aXRoIHRoZSBtYWNybwotICAgKiAgIGBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSUycuICBBdCBydW50aW1lLCB0aGUgY29udHJvbAotICAgKiAgIHBvaW50cyBjYW4gYmUgY2hhbmdlZCB1c2luZyB0aGUgYGRhcmtlbmluZy1wYXJhbWV0ZXJzJyBwcm9wZXJ0eSwgYXMKLSAgICogICB0aGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGVzLgotICAgKgotICAgKiAgIHsKLSAgICogICAgIEZUX0xpYnJhcnkgIGxpYnJhcnk7Ci0gICAqICAgICBGVF9JbnQgICAgICBkYXJrZW5fcGFyYW1zWzhdID0geyAgNTAwLCAzMDAsICAgLy8geDEsIHkxCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwLCAyMDAsICAgLy8geDIsIHkyCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTAwLCAxMDAsICAgLy8geDMsIHkzCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAwLCAgIDAgfTsgLy8geDQsIHk0Ci0gICAqCi0gICAqCi0gICAqICAgICBGVF9Jbml0X0ZyZWVUeXBlKCAmbGlicmFyeSApOwotICAgKgotICAgKiAgICAgRlRfUHJvcGVydHlfU2V0KCBsaWJyYXJ5LCAiY2ZmIiwKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhcmtlbmluZy1wYXJhbWV0ZXJzIiwgZGFya2VuX3BhcmFtcyApOwotICAgKiAgIH0KLSAgICoKLSAgICogICBUaGUgeH52YWx1ZXMgZ2l2ZSB0aGUgc3RlbSB3aWR0aCwgYW5kIHRoZSB5fnZhbHVlcyB0aGUgZGFya2VuaW5nCi0gICAqICAgYW1vdW50LiAgVGhlIHVuaXQgaXMgMTAwMHRoIG9mIHBpeGVscy4gIEFsbCBjb29yZGluYXRlIHZhbHVlcyBtdXN0IGJlCi0gICAqICAgcG9zaXRpdmU7IHRoZSB4fnZhbHVlcyBtdXN0IGJlIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZzsgdGhlCi0gICAqICAgeX52YWx1ZXMgbXVzdCBiZSBtb25vdG9uaWNhbGx5IGRlY3JlYXNpbmcgYW5kIHNtYWxsZXIgdGhhbiBvcgotICAgKiAgIGVxdWFsIHRvIDUwMCAoY29ycmVzcG9uZGluZyB0byBoYWxmIGEgcGl4ZWwpOyB0aGUgc2xvcGUgb2YgZWFjaAotICAgKiAgIGxpbmVhciBwaWVjZSBtdXN0IGJlIHNoYWxsb3dlciB0aGFuIC0xIChlLmcuLCAtLjQpLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHdpdGggQEZUX1Byb3BlcnR5X0dldCBhbHNvLgotICAgKgotICAgKi8KLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19GVENGRkRSVl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRjaWQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRjaWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU3NDFjOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Y2lkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRjaWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgYWNjZXNzaW5nIENJRCBmb250IGluZm9ybWF0aW9uIChzcGVjaWZpY2F0aW9uKS4gICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEZXJlZyBDbGVnZyBhbmQgTWljaGFlbCBUb2Z0ZGFsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRDSURfSF9fCi0jZGVmaW5lIF9fRlRDSURfSF9fCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNpZF9mb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRCBGb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRC1rZXllZCBmb250IHNwZWNpZmljIEFQSS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgQ0lELWtleWVkIGZvbnQgc3BlY2lmaWMgICAqLwotICAvKiAgICBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgICBGVF9HZXRfQ0lEX1JlZ2lzdHJ5X09yZGVyaW5nX1N1cHBsZW1lbnQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBSZXRyaWV2ZSB0aGUgUmVnaXN0cnkvT3JkZXJpbmcvU3VwcGxlbWVudCB0cmlwbGUgKGFsc28ga25vd24gYXMgdGhlCi0gICAqICAgICJSL08vUyIpIGZyb20gYSBDSUQta2V5ZWQgZm9udC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgICBmYWNlIDo6Ci0gICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgICByZWdpc3RyeSA6OgotICAgKiAgICAgICBUaGUgcmVnaXN0cnksIGFzIGEgQ35zdHJpbmcsIG93bmVkIGJ5IHRoZSBmYWNlLgotICAgKgotICAgKiAgICBvcmRlcmluZyA6OgotICAgKiAgICAgICBUaGUgb3JkZXJpbmcsIGFzIGEgQ35zdHJpbmcsIG93bmVkIGJ5IHRoZSBmYWNlLgotICAgKgotICAgKiAgICBzdXBwbGVtZW50IDo6Ci0gICAqICAgICAgIFRoZSBzdXBwbGVtZW50LgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICAgVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIHdpdGggQ0lEIGZhY2VzLCByZXR1cm5pbmcgYW4gZXJyb3IKLSAgICogICAgb3RoZXJ3aXNlLgotICAgKgotICAgKiBAc2luY2U6Ci0gICAqICAgIDIuMy42Ci0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0NJRF9SZWdpc3RyeV9PcmRlcmluZ19TdXBwbGVtZW50KCBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICpyZWdpc3RyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgKm9yZGVyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAqc3VwcGxlbWVudCk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgIEZUX0dldF9DSURfSXNfSW50ZXJuYWxseV9DSURfS2V5ZWQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBSZXRyaWV2ZSB0aGUgdHlwZSBvZiB0aGUgaW5wdXQgZmFjZSwgQ0lEIGtleWVkIG9yIG5vdC4gIEluCi0gICAqICAgIGNvbnN0cmFzdCB0byB0aGUgQEZUX0lTX0NJRF9LRVlFRCBtYWNybyB0aGlzIGZ1bmN0aW9uIHJldHVybnMKLSAgICogICAgc3VjY2Vzc2Z1bGx5IGFsc28gZm9yIENJRC1rZXllZCBmb250cyBpbiBhbiBTTkZUIHdyYXBwZXIuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICAgZmFjZSA6OgotICAgKiAgICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICAgaXNfY2lkIDo6Ci0gICAqICAgICAgIFRoZSB0eXBlIG9mIHRoZSBmYWNlIGFzIGFuIEBGVF9Cb29sLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICAgVGhpcyBmdW5jdGlvbiBvbmx5IHdvcmtzIHdpdGggQ0lEIGZhY2VzIGFuZCBPcGVuVHlwZSBmb250cywKLSAgICogICAgcmV0dXJuaW5nIGFuIGVycm9yIG90aGVyd2lzZS4KLSAgICoKLSAgICogQHNpbmNlOgotICAgKiAgICAyLjMuOQotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9DSURfSXNfSW50ZXJuYWxseV9DSURfS2V5ZWQoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAqaXNfY2lkICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgIEZUX0dldF9DSURfRnJvbV9HbHlwaF9JbmRleAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgIFJldHJpZXZlIHRoZSBDSUQgb2YgdGhlIGlucHV0IGdseXBoIGluZGV4LgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgIGZhY2UgOjoKLSAgICogICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCi0gICAqCi0gICAqICAgIGdseXBoX2luZGV4IDo6Ci0gICAqICAgICAgIFRoZSBpbnB1dCBnbHlwaCBpbmRleC4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICAgY2lkIDo6Ci0gICAqICAgICAgIFRoZSBDSUQgYXMgYW4gQEZUX1VJbnQuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgICBUaGlzIGZ1bmN0aW9uIG9ubHkgd29ya3Mgd2l0aCBDSUQgZmFjZXMgYW5kIE9wZW5UeXBlIGZvbnRzLAotICAgKiAgICByZXR1cm5pbmcgYW4gZXJyb3Igb3RoZXJ3aXNlLgotICAgKgotICAgKiBAc2luY2U6Ci0gICAqICAgIDIuMy45Ci0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0NJRF9Gcm9tX0dseXBoX0luZGV4KCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgKmNpZCApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVENJRF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRlcnJkZWYuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRlcnJkZWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg2NWRhNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0ZXJyZGVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRlcnJkZWYuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZXJyb3JfY29kZV92YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRXJyb3IgQ29kZSBWYWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQWxsIHBvc3NpYmxlIGVycm9yIGNvZGVzIHJldHVybmVkIGJ5IEZyZWVUeXBlIGZ1bmN0aW9ucy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhlIGxpc3QgYmVsb3cgaXMgdGFrZW4gdmVyYmF0aW0gZnJvbSB0aGUgZmlsZSBgZnRlcnJkZWYuaCcgICAgICAgICAqLwotICAvKiAgIChsb2FkZWQgYXV0b21hdGljYWxseSBieSBpbmNsdWRpbmcgYEZUX0ZSRUVUWVBFX0gnKS4gIFRoZSBmaXJzdCAgICAgKi8KLSAgLyogICBhcmd1bWVudCBvZiB0aGUgYEZUX0VSUk9SX0RFRl8nIG1hY3JvIGlzIHRoZSBlcnJvciBsYWJlbDsgYnkgICAgICAgICovCi0gIC8qICAgZGVmYXVsdCwgdGhlIHByZWZpeCBgRlRfRXJyXycgZ2V0cyBhZGRlZCBzbyB0aGF0IHlvdSBnZXQgZXJyb3IgICAgICAqLwotICAvKiAgIG5hbWVzIGxpa2UgYEZUX0Vycl9DYW5ub3RfT3Blbl9SZXNvdXJjZScuICBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzICAgKi8KLSAgLyogICB0aGUgZXJyb3IgY29kZSwgYW5kIHRoZSBsYXN0IGFyZ3VtZW50IGFuIGVycm9yIHN0cmluZywgd2hpY2ggaXMgbm90ICovCi0gIC8qICAgdXNlZCBieSBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBXaXRoaW4geW91ciBhcHBsaWNhdGlvbiB5b3Ugc2hvdWxkICpvbmx5KiB1c2UgZXJyb3IgbmFtZXMgYW5kICAgICAgICovCi0gIC8qICAgKm5ldmVyKiBpdHMgbnVtZXJpYyB2YWx1ZXMhICBUaGUgbGF0dGVyIG1pZ2h0IChhbmQgYWN0dWFsbHkgZG8pICAgICAqLwotICAvKiAgIGNoYW5nZSBpbiBmb3J0aGNvbWluZyBGcmVlVHlwZSB2ZXJzaW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTWFjcm8gYEZUX05PRVJST1JERUZfJyBkZWZpbmVzIGBGVF9FcnJfT2snLCB3aGljaCBpcyBhbHdheXMgemVyby4gICAqLwotICAvKiAgIFNlZSB0aGUgYEVycm9yIEVudW1lcmF0aW9ucycgc3Vic2VjdGlvbiBob3cgdG8gYXV0b21hdGljYWxseSAgICAgICAgKi8KLSAgLyogICBnZW5lcmF0ZSBhIGxpc3Qgb2YgZXJyb3Igc3RyaW5ncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0Vycl9YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogZ2VuZXJpYyBlcnJvcnMgKi8KLQotICBGVF9OT0VSUk9SREVGXyggT2ssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAsCi0gICAgICAgICAgICAgICAgICAibm8gZXJyb3IiICkKLQotICBGVF9FUlJPUkRFRl8oIENhbm5vdF9PcGVuX1Jlc291cmNlLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEsCi0gICAgICAgICAgICAgICAgImNhbm5vdCBvcGVuIHJlc291cmNlIiApCi0gIEZUX0VSUk9SREVGXyggVW5rbm93bl9GaWxlX0Zvcm1hdCwgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMiwKLSAgICAgICAgICAgICAgICAidW5rbm93biBmaWxlIGZvcm1hdCIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfRmlsZV9Gb3JtYXQsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDMsCi0gICAgICAgICAgICAgICAgImJyb2tlbiBmaWxlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9WZXJzaW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNCwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBGcmVlVHlwZSB2ZXJzaW9uIiApCi0gIEZUX0VSUk9SREVGXyggTG93ZXJfTW9kdWxlX1ZlcnNpb24sICAgICAgICAgICAgICAgICAgICAgICAgMHgwNSwKLSAgICAgICAgICAgICAgICAibW9kdWxlIHZlcnNpb24gaXMgdG9vIGxvdyIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfQXJndW1lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYsCi0gICAgICAgICAgICAgICAgImludmFsaWQgYXJndW1lbnQiICkKLSAgRlRfRVJST1JERUZfKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUsICAgICAgICAgICAgICAgICAgICAgICAweDA3LAotICAgICAgICAgICAgICAgICJ1bmltcGxlbWVudGVkIGZlYXR1cmUiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1RhYmxlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4LAotICAgICAgICAgICAgICAgICJicm9rZW4gdGFibGUiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX09mZnNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA5LAotICAgICAgICAgICAgICAgICJicm9rZW4gb2Zmc2V0IHdpdGhpbiB0YWJsZSIgKQotICBGVF9FUlJPUkRFRl8oIEFycmF5X1Rvb19MYXJnZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEEsCi0gICAgICAgICAgICAgICAgImFycmF5IGFsbG9jYXRpb24gc2l6ZSB0b28gbGFyZ2UiICkKLSAgRlRfRVJST1JERUZfKCBNaXNzaW5nX01vZHVsZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBCLAotICAgICAgICAgICAgICAgICJtaXNzaW5nIG1vZHVsZSIgKQotICBGVF9FUlJPUkRFRl8oIE1pc3NpbmdfUHJvcGVydHksICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MEMsCi0gICAgICAgICAgICAgICAgIm1pc3NpbmcgcHJvcGVydHkiICkKLQotICAvKiBnbHlwaC9jaGFyYWN0ZXIgZXJyb3JzICovCi0KLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0dseXBoX0luZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAweDEwLAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGdseXBoIGluZGV4IiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9DaGFyYWN0ZXJfQ29kZSwgICAgICAgICAgICAgICAgICAgICAgMHgxMSwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBjaGFyYWN0ZXIgY29kZSIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfR2x5cGhfRm9ybWF0LCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIsCi0gICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIGdseXBoIGltYWdlIGZvcm1hdCIgKQotICBGVF9FUlJPUkRFRl8oIENhbm5vdF9SZW5kZXJfR2x5cGgsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTMsCi0gICAgICAgICAgICAgICAgImNhbm5vdCByZW5kZXIgdGhpcyBnbHlwaCBmb3JtYXQiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX091dGxpbmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIG91dGxpbmUiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0NvbXBvc2l0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGNvbXBvc2l0ZSBnbHlwaCIgKQotICBGVF9FUlJPUkRFRl8oIFRvb19NYW55X0hpbnRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTYsCi0gICAgICAgICAgICAgICAgInRvbyBtYW55IGhpbnRzIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9QaXhlbF9TaXplLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNywKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBwaXhlbCBzaXplIiApCi0KLSAgLyogaGFuZGxlIGVycm9ycyAqLwotCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9IYW5kbGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMCwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBvYmplY3QgaGFuZGxlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9MaWJyYXJ5X0hhbmRsZSwgICAgICAgICAgICAgICAgICAgICAgMHgyMSwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBsaWJyYXJ5IGhhbmRsZSIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfRHJpdmVyX0hhbmRsZSwgICAgICAgICAgICAgICAgICAgICAgIDB4MjIsCi0gICAgICAgICAgICAgICAgImludmFsaWQgbW9kdWxlIGhhbmRsZSIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfRmFjZV9IYW5kbGUsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjMsCi0gICAgICAgICAgICAgICAgImludmFsaWQgZmFjZSBoYW5kbGUiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1NpemVfSGFuZGxlLCAgICAgICAgICAgICAgICAgICAgICAgICAweDI0LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHNpemUgaGFuZGxlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9TbG90X0hhbmRsZSwgICAgICAgICAgICAgICAgICAgICAgICAgMHgyNSwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBnbHlwaCBzbG90IGhhbmRsZSIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfQ2hhck1hcF9IYW5kbGUsICAgICAgICAgICAgICAgICAgICAgIDB4MjYsCi0gICAgICAgICAgICAgICAgImludmFsaWQgY2hhcm1hcCBoYW5kbGUiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0NhY2hlX0hhbmRsZSwgICAgICAgICAgICAgICAgICAgICAgICAweDI3LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGNhY2hlIG1hbmFnZXIgaGFuZGxlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9TdHJlYW1fSGFuZGxlLCAgICAgICAgICAgICAgICAgICAgICAgMHgyOCwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBzdHJlYW0gaGFuZGxlIiApCi0KLSAgLyogZHJpdmVyIGVycm9ycyAqLwotCi0gIEZUX0VSUk9SREVGXyggVG9vX01hbnlfRHJpdmVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMCwKLSAgICAgICAgICAgICAgICAidG9vIG1hbnkgbW9kdWxlcyIgKQotICBGVF9FUlJPUkRFRl8oIFRvb19NYW55X0V4dGVuc2lvbnMsICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzEsCi0gICAgICAgICAgICAgICAgInRvbyBtYW55IGV4dGVuc2lvbnMiICkKLQotICAvKiBtZW1vcnkgZXJyb3JzICovCi0KLSAgRlRfRVJST1JERUZfKCBPdXRfT2ZfTWVtb3J5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwLAotICAgICAgICAgICAgICAgICJvdXQgb2YgbWVtb3J5IiApCi0gIEZUX0VSUk9SREVGXyggVW5saXN0ZWRfT2JqZWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MSwKLSAgICAgICAgICAgICAgICAidW5saXN0ZWQgb2JqZWN0IiApCi0KLSAgLyogc3RyZWFtIGVycm9ycyAqLwotCi0gIEZUX0VSUk9SREVGXyggQ2Fubm90X09wZW5fU3RyZWFtLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MSwKLSAgICAgICAgICAgICAgICAiY2Fubm90IG9wZW4gc3RyZWFtIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9TdHJlYW1fU2VlaywgICAgICAgICAgICAgICAgICAgICAgICAgMHg1MiwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBzdHJlYW0gc2VlayIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfU3RyZWFtX1NraXAsICAgICAgICAgICAgICAgICAgICAgICAgIDB4NTMsCi0gICAgICAgICAgICAgICAgImludmFsaWQgc3RyZWFtIHNraXAiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX1N0cmVhbV9SZWFkLCAgICAgICAgICAgICAgICAgICAgICAgICAweDU0LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIHN0cmVhbSByZWFkIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uLCAgICAgICAgICAgICAgICAgICAgMHg1NSwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBzdHJlYW0gb3BlcmF0aW9uIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9GcmFtZV9PcGVyYXRpb24sICAgICAgICAgICAgICAgICAgICAgMHg1NiwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBmcmFtZSBvcGVyYXRpb24iICkKLSAgRlRfRVJST1JERUZfKCBOZXN0ZWRfRnJhbWVfQWNjZXNzLCAgICAgICAgICAgICAgICAgICAgICAgICAweDU3LAotICAgICAgICAgICAgICAgICJuZXN0ZWQgZnJhbWUgYWNjZXNzIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9GcmFtZV9SZWFkLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1OCwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBmcmFtZSByZWFkIiApCi0KLSAgLyogcmFzdGVyIGVycm9ycyAqLwotCi0gIEZUX0VSUk9SREVGXyggUmFzdGVyX1VuaW5pdGlhbGl6ZWQsICAgICAgICAgICAgICAgICAgICAgICAgMHg2MCwKLSAgICAgICAgICAgICAgICAicmFzdGVyIHVuaW5pdGlhbGl6ZWQiICkKLSAgRlRfRVJST1JERUZfKCBSYXN0ZXJfQ29ycnVwdGVkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYxLAotICAgICAgICAgICAgICAgICJyYXN0ZXIgY29ycnVwdGVkIiApCi0gIEZUX0VSUk9SREVGXyggUmFzdGVyX092ZXJmbG93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MiwKLSAgICAgICAgICAgICAgICAicmFzdGVyIG92ZXJmbG93IiApCi0gIEZUX0VSUk9SREVGXyggUmFzdGVyX05lZ2F0aXZlX0hlaWdodCwgICAgICAgICAgICAgICAgICAgICAgMHg2MywKLSAgICAgICAgICAgICAgICAibmVnYXRpdmUgaGVpZ2h0IHdoaWxlIHJhc3RlcmluZyIgKQotCi0gIC8qIGNhY2hlIGVycm9ycyAqLwotCi0gIEZUX0VSUk9SREVGXyggVG9vX01hbnlfQ2FjaGVzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3MCwKLSAgICAgICAgICAgICAgICAidG9vIG1hbnkgcmVnaXN0ZXJlZCBjYWNoZXMiICkKLQotICAvKiBUcnVlVHlwZSBhbmQgU0ZOVCBlcnJvcnMgKi8KLQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfT3Bjb2RlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAsCi0gICAgICAgICAgICAgICAgImludmFsaWQgb3Bjb2RlIiApCi0gIEZUX0VSUk9SREVGXyggVG9vX0Zld19Bcmd1bWVudHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MSwKLSAgICAgICAgICAgICAgICAidG9vIGZldyBhcmd1bWVudHMiICkKLSAgRlRfRVJST1JERUZfKCBTdGFja19PdmVyZmxvdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgyLAotICAgICAgICAgICAgICAgICJzdGFjayBvdmVyZmxvdyIgKQotICBGVF9FUlJPUkRFRl8oIENvZGVfT3ZlcmZsb3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMsCi0gICAgICAgICAgICAgICAgImNvZGUgb3ZlcmZsb3ciICkKLSAgRlRfRVJST1JERUZfKCBCYWRfQXJndW1lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg0LAotICAgICAgICAgICAgICAgICJiYWQgYXJndW1lbnQiICkKLSAgRlRfRVJST1JERUZfKCBEaXZpZGVfQnlfWmVybywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg1LAotICAgICAgICAgICAgICAgICJkaXZpc2lvbiBieSB6ZXJvIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9SZWZlcmVuY2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4NiwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCByZWZlcmVuY2UiICkKLSAgRlRfRVJST1JERUZfKCBEZWJ1Z19PcENvZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg3LAotICAgICAgICAgICAgICAgICJmb3VuZCBkZWJ1ZyBvcGNvZGUiICkKLSAgRlRfRVJST1JERUZfKCBFTkRGX0luX0V4ZWNfU3RyZWFtLCAgICAgICAgICAgICAgICAgICAgICAgICAweDg4LAotICAgICAgICAgICAgICAgICJmb3VuZCBFTkRGIG9wY29kZSBpbiBleGVjdXRpb24gc3RyZWFtIiApCi0gIEZUX0VSUk9SREVGXyggTmVzdGVkX0RFRlMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4OSwKLSAgICAgICAgICAgICAgICAibmVzdGVkIERFRlMiICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0NvZGVSYW5nZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhBLAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGNvZGUgcmFuZ2UiICkKLSAgRlRfRVJST1JERUZfKCBFeGVjdXRpb25fVG9vX0xvbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAweDhCLAotICAgICAgICAgICAgICAgICJleGVjdXRpb24gY29udGV4dCB0b28gbG9uZyIgKQotICBGVF9FUlJPUkRFRl8oIFRvb19NYW55X0Z1bmN0aW9uX0RlZnMsICAgICAgICAgICAgICAgICAgICAgIDB4OEMsCi0gICAgICAgICAgICAgICAgInRvbyBtYW55IGZ1bmN0aW9uIGRlZmluaXRpb25zIiApCi0gIEZUX0VSUk9SREVGXyggVG9vX01hbnlfSW5zdHJ1Y3Rpb25fRGVmcywgICAgICAgICAgICAgICAgICAgMHg4RCwKLSAgICAgICAgICAgICAgICAidG9vIG1hbnkgaW5zdHJ1Y3Rpb24gZGVmaW5pdGlvbnMiICkKLSAgRlRfRVJST1JERUZfKCBUYWJsZV9NaXNzaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDhFLAotICAgICAgICAgICAgICAgICJTRk5UIGZvbnQgdGFibGUgbWlzc2luZyIgKQotICBGVF9FUlJPUkRFRl8oIEhvcml6X0hlYWRlcl9NaXNzaW5nLCAgICAgICAgICAgICAgICAgICAgICAgIDB4OEYsCi0gICAgICAgICAgICAgICAgImhvcml6b250YWwgaGVhZGVyIChoaGVhKSB0YWJsZSBtaXNzaW5nIiApCi0gIEZUX0VSUk9SREVGXyggTG9jYXRpb25zX01pc3NpbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MCwKLSAgICAgICAgICAgICAgICAibG9jYXRpb25zIChsb2NhKSB0YWJsZSBtaXNzaW5nIiApCi0gIEZUX0VSUk9SREVGXyggTmFtZV9UYWJsZV9NaXNzaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MSwKLSAgICAgICAgICAgICAgICAibmFtZSB0YWJsZSBtaXNzaW5nIiApCi0gIEZUX0VSUk9SREVGXyggQ01hcF9UYWJsZV9NaXNzaW5nLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5MiwKLSAgICAgICAgICAgICAgICAiY2hhcmFjdGVyIG1hcCAoY21hcCkgdGFibGUgbWlzc2luZyIgKQotICBGVF9FUlJPUkRFRl8oIEhtdHhfVGFibGVfTWlzc2luZywgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTMsCi0gICAgICAgICAgICAgICAgImhvcml6b250YWwgbWV0cmljcyAoaG10eCkgdGFibGUgbWlzc2luZyIgKQotICBGVF9FUlJPUkRFRl8oIFBvc3RfVGFibGVfTWlzc2luZywgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTQsCi0gICAgICAgICAgICAgICAgIlBvc3RTY3JpcHQgKHBvc3QpIHRhYmxlIG1pc3NpbmciICkKLSAgRlRfRVJST1JERUZfKCBJbnZhbGlkX0hvcml6X01ldHJpY3MsICAgICAgICAgICAgICAgICAgICAgICAweDk1LAotICAgICAgICAgICAgICAgICJpbnZhbGlkIGhvcml6b250YWwgbWV0cmljcyIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfQ2hhck1hcF9Gb3JtYXQsICAgICAgICAgICAgICAgICAgICAgIDB4OTYsCi0gICAgICAgICAgICAgICAgImludmFsaWQgY2hhcmFjdGVyIG1hcCAoY21hcCkgZm9ybWF0IiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9QUGVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5NywKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBwcGVtIHZhbHVlIiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9WZXJ0X01ldHJpY3MsICAgICAgICAgICAgICAgICAgICAgICAgMHg5OCwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCB2ZXJ0aWNhbCBtZXRyaWNzIiApCi0gIEZUX0VSUk9SREVGXyggQ291bGRfTm90X0ZpbmRfQ29udGV4dCwgICAgICAgICAgICAgICAgICAgICAgMHg5OSwKLSAgICAgICAgICAgICAgICAiY291bGQgbm90IGZpbmQgY29udGV4dCIgKQotICBGVF9FUlJPUkRFRl8oIEludmFsaWRfUG9zdF9UYWJsZV9Gb3JtYXQsICAgICAgICAgICAgICAgICAgIDB4OUEsCi0gICAgICAgICAgICAgICAgImludmFsaWQgUG9zdFNjcmlwdCAocG9zdCkgdGFibGUgZm9ybWF0IiApCi0gIEZUX0VSUk9SREVGXyggSW52YWxpZF9Qb3N0X1RhYmxlLCAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5QiwKLSAgICAgICAgICAgICAgICAiaW52YWxpZCBQb3N0U2NyaXB0IChwb3N0KSB0YWJsZSIgKQotCi0gIC8qIENGRiwgQ0lELCBhbmQgVHlwZSAxIGVycm9ycyAqLwotCi0gIEZUX0VSUk9SREVGXyggU3ludGF4X0Vycm9yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhBMCwKLSAgICAgICAgICAgICAgICAib3Bjb2RlIHN5bnRheCBlcnJvciIgKQotICBGVF9FUlJPUkRFRl8oIFN0YWNrX1VuZGVyZmxvdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTEsCi0gICAgICAgICAgICAgICAgImFyZ3VtZW50IHN0YWNrIHVuZGVyZmxvdyIgKQotICBGVF9FUlJPUkRFRl8oIElnbm9yZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTIsCi0gICAgICAgICAgICAgICAgImlnbm9yZSIgKQotICBGVF9FUlJPUkRFRl8oIE5vX1VuaWNvZGVfR2x5cGhfTmFtZSwgICAgICAgICAgICAgICAgICAgICAgIDB4QTMsCi0gICAgICAgICAgICAgICAgIm5vIFVuaWNvZGUgZ2x5cGggbmFtZSBmb3VuZCIgKQotICBGVF9FUlJPUkRFRl8oIEdseXBoX1Rvb19CaWcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QTQsCi0gICAgICAgICAgICAgICAgImdseXBoIHRvIGJpZyBmb3IgaGludGluZyIgKQotCi0gIC8qIEJERiBlcnJvcnMgKi8KLQotICBGVF9FUlJPUkRFRl8oIE1pc3NpbmdfU3RhcnRmb250X0ZpZWxkLCAgICAgICAgICAgICAgICAgICAgIDB4QjAsCi0gICAgICAgICAgICAgICAgImBTVEFSVEZPTlQnIGZpZWxkIG1pc3NpbmciICkKLSAgRlRfRVJST1JERUZfKCBNaXNzaW5nX0ZvbnRfRmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAweEIxLAotICAgICAgICAgICAgICAgICJgRk9OVCcgZmllbGQgbWlzc2luZyIgKQotICBGVF9FUlJPUkRFRl8oIE1pc3NpbmdfU2l6ZV9GaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjIsCi0gICAgICAgICAgICAgICAgImBTSVpFJyBmaWVsZCBtaXNzaW5nIiApCi0gIEZUX0VSUk9SREVGXyggTWlzc2luZ19Gb250Ym91bmRpbmdib3hfRmllbGQsICAgICAgICAgICAgICAgMHhCMywKLSAgICAgICAgICAgICAgICAiYEZPTlRCT1VORElOR0JPWCcgZmllbGQgbWlzc2luZyIgKQotICBGVF9FUlJPUkRFRl8oIE1pc3NpbmdfQ2hhcnNfRmllbGQsICAgICAgICAgICAgICAgICAgICAgICAgIDB4QjQsCi0gICAgICAgICAgICAgICAgImBDSEFSUycgZmllbGQgbWlzc2luZyIgKQotICBGVF9FUlJPUkRFRl8oIE1pc3NpbmdfU3RhcnRjaGFyX0ZpZWxkLCAgICAgICAgICAgICAgICAgICAgIDB4QjUsCi0gICAgICAgICAgICAgICAgImBTVEFSVENIQVInIGZpZWxkIG1pc3NpbmciICkKLSAgRlRfRVJST1JERUZfKCBNaXNzaW5nX0VuY29kaW5nX0ZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAweEI2LAotICAgICAgICAgICAgICAgICJgRU5DT0RJTkcnIGZpZWxkIG1pc3NpbmciICkKLSAgRlRfRVJST1JERUZfKCBNaXNzaW5nX0JieF9GaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAweEI3LAotICAgICAgICAgICAgICAgICJgQkJYJyBmaWVsZCBtaXNzaW5nIiApCi0gIEZUX0VSUk9SREVGXyggQmJ4X1Rvb19CaWcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhCOCwKLSAgICAgICAgICAgICAgICAiYEJCWCcgdG9vIGJpZyIgKQotICBGVF9FUlJPUkRFRl8oIENvcnJ1cHRlZF9Gb250X0hlYWRlciwgICAgICAgICAgICAgICAgICAgICAgIDB4QjksCi0gICAgICAgICAgICAgICAgIkZvbnQgaGVhZGVyIGNvcnJ1cHRlZCBvciBtaXNzaW5nIGZpZWxkcyIgKQotICBGVF9FUlJPUkRFRl8oIENvcnJ1cHRlZF9Gb250X0dseXBocywgICAgICAgICAgICAgICAgICAgICAgIDB4QkEsCi0gICAgICAgICAgICAgICAgIkZvbnQgZ2x5cGhzIGNvcnJ1cHRlZCBvciBtaXNzaW5nIGZpZWxkcyIgKQotCi0gIC8qICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0ZXJyb3JzLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0ZXJyb3JzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MDdiOWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGVycm9ycy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0ZXJyb3JzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlIGhhbmRsaW5nIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGVycm9yX2VudW1lcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEVycm9yIEVudW1lcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEhvdyB0byBoYW5kbGUgZXJyb3JzIGFuZCBlcnJvciBzdHJpbmdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoZSBoZWFkZXIgZmlsZSBgZnRlcnJvcnMuaCcgKHdoaWNoIGlzIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgYnkgICAgKi8KLSAgLyogICBgZnJlZXR5cGUuaCcgZGVmaW5lcyB0aGUgaGFuZGxpbmcgb2YgRnJlZVR5cGUncyBlbnVtZXJhdGlvbiAgICAgICAgICovCi0gIC8qICAgY29uc3RhbnRzLiAgSXQgY2FuIGFsc28gYmUgdXNlZCB0byBnZW5lcmF0ZSBlcnJvciBtZXNzYWdlIHN0cmluZ3MgICAqLwotICAvKiAgIHdpdGggYSBzbWFsbCBtYWNybyB0cmljayBleHBsYWluZWQgYmVsb3cuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgKkVycm9yKiAqRm9ybWF0cyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGUgY29uZmlndXJhdGlvbiBtYWNybyBGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTIGNhbiBiZSAgICovCi0gIC8qICAgZGVmaW5lZCBpbiBgZnRvcHRpb24uaCcgaW4gb3JkZXIgdG8gbWFrZSB0aGUgaGlnaGVyIGJ5dGUgaW5kaWNhdGUgICAqLwotICAvKiAgIHRoZSBtb2R1bGUgd2hlcmUgdGhlIGVycm9yIGhhcyBoYXBwZW5lZCAodGhpcyBpcyBub3QgY29tcGF0aWJsZSAgICAgKi8KLSAgLyogICB3aXRoIHN0YW5kYXJkIGJ1aWxkcyBvZiBGcmVlVHlwZSZuYnNwOzIsIGhvd2V2ZXIpLiAgU2VlIHRoZSBmaWxlICAgICovCi0gIC8qICAgYGZ0bW9kZXJyLmgnIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAqRXJyb3IqICpNZXNzYWdlKiAqU3RyaW5ncyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEVycm9yIGRlZmluaXRpb25zIGFyZSBzZXQgdXAgd2l0aCBzcGVjaWFsIG1hY3JvcyB0aGF0IGFsbG93IGNsaWVudCAgKi8KLSAgLyogICBhcHBsaWNhdGlvbnMgdG8gYnVpbGQgYSB0YWJsZSBvZiBlcnJvciBtZXNzYWdlIHN0cmluZ3MuICBUaGUgICAgICAgICovCi0gIC8qICAgc3RyaW5ncyBhcmUgbm90IGluY2x1ZGVkIGluIGEgbm9ybWFsIGJ1aWxkIG9mIEZyZWVUeXBlJm5ic3A7MiB0byAgICAqLwotICAvKiAgIHNhdmUgc3BhY2UgKG1vc3QgY2xpZW50IGFwcGxpY2F0aW9ucyBkbyBub3QgdXNlIHRoZW0pLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVG8gZG8gc28sIHlvdSBoYXZlIHRvIGRlZmluZSB0aGUgZm9sbG93aW5nIG1hY3JvcyBiZWZvcmUgaW5jbHVkaW5nICAqLwotICAvKiAgIHRoaXMgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgRlRfRVJST1JfU1RBUlRfTElTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoaXMgbWFjcm8gaXMgY2FsbGVkIGJlZm9yZSBhbnl0aGluZyBlbHNlIHRvIGRlZmluZSB0aGUgc3RhcnQgb2YgICAgKi8KLSAgLyogICB0aGUgZXJyb3IgbGlzdC4gIEl0IGlzIGZvbGxvd2VkIGJ5IHNldmVyYWwgRlRfRVJST1JfREVGIGNhbGxzLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEZUX0VSUk9SX0RFRiggZSwgdiwgcyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGlzIG1hY3JvIGlzIGNhbGxlZCB0byBkZWZpbmUgb25lIHNpbmdsZSBlcnJvci4gIGBlJyBpcyB0aGUgZXJyb3IgICovCi0gIC8qICAgY29kZSBpZGVudGlmaWVyIChlLmcuLCBgSW52YWxpZF9Bcmd1bWVudCcpLCBgdicgaXMgdGhlIGVycm9yJ3MgICAgICAqLwotICAvKiAgIG51bWVyaWNhbCB2YWx1ZSwgYW5kIGBzJyBpcyB0aGUgY29ycmVzcG9uZGluZyBlcnJvciBzdHJpbmcuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgRlRfRVJST1JfRU5EX0xJU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoaXMgbWFjcm8gZW5kcyB0aGUgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQWRkaXRpb25hbGx5LCB5b3UgaGF2ZSB0byB1bmRlZmluZSBgX19GVEVSUk9SU19IX18nIGJlZm9yZSAgICAgICAgICAqLwotICAvKiAgICNpbmNsdWRpbmcgdGhpcyBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAjdW5kZWYgX19GVEVSUk9SU19IX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgI2RlZmluZSBGVF9FUlJPUkRFRiggZSwgdiwgcyApICB7IGUsIHMgfSwgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICNkZWZpbmUgRlRfRVJST1JfU1RBUlRfTElTVCAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAjZGVmaW5lIEZUX0VSUk9SX0VORF9MSVNUICAgICAgIHsgMCwgTlVMTCB9IH07ICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGNvbnN0IHN0cnVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBpbnQgICAgICAgICAgZXJyX2NvZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgY29uc3QgY2hhciogIGVycl9tc2c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICB9IGZ0X2Vycm9yc1tdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICNpbmNsdWRlIEZUX0VSUk9SU19IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOb3RlIHRoYXQgYEZUX0Vycl9PaycgaXMgX25vdF8gZGVmaW5lZCB3aXRoIGBGVF9FUlJPUkRFRicgYnV0IHdpdGggICovCi0gIC8qICAgYEZUX05PRVJST1JERUYnOyBpdCBpcyBhbHdheXMgemVyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogKi8KLQotI2lmbmRlZiBfX0ZURVJST1JTX0hfXwotI2RlZmluZSBfX0ZURVJST1JTX0hfXwotCi0KLSAgLyogaW5jbHVkZSBtb2R1bGUgYmFzZSBlcnJvciBjb2RlcyAqLwotI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19ICi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgIFNFVFVQIE1BQ1JPUyAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jdW5kZWYgIEZUX05FRURfRVhURVJOX0MKLQotCi0gIC8qIEZUX0VSUl9QUkVGSVggaXMgdXNlZCBhcyBhIHByZWZpeCBmb3IgZXJyb3IgaWRlbnRpZmllcnMuICovCi0gIC8qIEJ5IGRlZmF1bHQsIHdlIHVzZSBgRlRfRXJyXycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZuZGVmIEZUX0VSUl9QUkVGSVgKLSNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgRlRfRXJyXwotI2VuZGlmCi0KLQotICAvKiBGVF9FUlJfQkFTRSBpcyB1c2VkIGFzIHRoZSBiYXNlIGZvciBtb2R1bGUtc3BlY2lmaWMgZXJyb3JzLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX01PRFVMRV9FUlJPUlMKLQotI2lmbmRlZiBGVF9FUlJfQkFTRQotI2RlZmluZSBGVF9FUlJfQkFTRSAgRlRfTW9kX0Vycl9CYXNlCi0jZW5kaWYKLQotI2Vsc2UKLQotI3VuZGVmIEZUX0VSUl9CQVNFCi0jZGVmaW5lIEZUX0VSUl9CQVNFICAwCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1VTRV9NT0RVTEVfRVJST1JTICovCi0KLQotICAvKiBJZiBGVF9FUlJPUkRFRiBpcyBub3QgZGVmaW5lZCwgd2UgbmVlZCB0byBkZWZpbmUgYSBzaW1wbGUgKi8KLSAgLyogZW51bWVyYXRpb24gdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9FUlJPUkRFRgotCi0jZGVmaW5lIEZUX0VSUk9SREVGKCBlLCB2LCBzICkgIGUgPSB2LAotI2RlZmluZSBGVF9FUlJPUl9TVEFSVF9MSVNUICAgICBlbnVtIHsKLSNkZWZpbmUgRlRfRVJST1JfRU5EX0xJU1QgICAgICAgRlRfRVJSX0NBVCggRlRfRVJSX1BSRUZJWCwgTWF4ICkgfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX05FRURfRVhURVJOX0MKLSAgZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9FUlJPUkRFRiAqLwotCi0KLSAgLyogdGhpcyBtYWNybyBpcyB1c2VkIHRvIGRlZmluZSBhbiBlcnJvciAqLwotI2RlZmluZSBGVF9FUlJPUkRFRl8oIGUsIHYsIHMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9FUlJPUkRFRiggRlRfRVJSX0NBVCggRlRfRVJSX1BSRUZJWCwgZSApLCB2ICsgRlRfRVJSX0JBU0UsIHMgKQotCi0gIC8qIHRoaXMgaXMgb25seSB1c2VkIGZvciA8bW9kdWxlPl9FcnJfT2ssIHdoaWNoIG11c3QgYmUgMCEgKi8KLSNkZWZpbmUgRlRfTk9FUlJPUkRFRl8oIGUsIHYsIHMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0VSUk9SREVGKCBGVF9FUlJfQ0FUKCBGVF9FUlJfUFJFRklYLCBlICksIHYsIHMgKQotCi0KLSNpZmRlZiBGVF9FUlJPUl9TVEFSVF9MSVNUCi0gIEZUX0VSUk9SX1NUQVJUX0xJU1QKLSNlbmRpZgotCi0KLSAgLyogbm93IGluY2x1ZGUgdGhlIGVycm9yIGNvZGVzICovCi0jaW5jbHVkZSBGVF9FUlJPUl9ERUZJTklUSU9OU19ICi0KLQotI2lmZGVmIEZUX0VSUk9SX0VORF9MSVNUCi0gIEZUX0VSUk9SX0VORF9MSVNUCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICBTSU1QTEUgQ0xFQU5VUCAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgRlRfTkVFRF9FWFRFUk5fQwotICB9Ci0jZW5kaWYKLQotI3VuZGVmIEZUX0VSUk9SX1NUQVJUX0xJU1QKLSN1bmRlZiBGVF9FUlJPUl9FTkRfTElTVAotCi0jdW5kZWYgRlRfRVJST1JERUYKLSN1bmRlZiBGVF9FUlJPUkRFRl8KLSN1bmRlZiBGVF9OT0VSUk9SREVGXwotCi0jdW5kZWYgRlRfTkVFRF9FWFRFUk5fQwotI3VuZGVmIEZUX0VSUl9CQVNFCi0KLSAgLyogRlRfRVJSX1BSRUZJWCBpcyBuZWVkZWQgaW50ZXJuYWxseSAqLwotI2lmbmRlZiBGVDJfQlVJTERfTElCUkFSWQotI3VuZGVmIEZUX0VSUl9QUkVGSVgKLSNlbmRpZgotCi0jZW5kaWYgLyogX19GVEVSUk9SU19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRmbnRmbXQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRmbnRmbXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY4ZmYyOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Zm50Zm10LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGZudGZtdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgU3VwcG9ydCBmdW5jdGlvbnMgZm9yIGZvbnQgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVEZOVEZNVF9IX18KLSNkZWZpbmUgX19GVEZOVEZNVF9IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmb250X2Zvcm1hdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGb250IEZvcm1hdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBHZXR0aW5nIHRoZSBmb250IGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGUgc2luZ2xlIGZ1bmN0aW9uIGluIHRoaXMgc2VjdGlvbiBjYW4gYmUgdXNlZCB0byBnZXQgdGhlIGZvbnQgICAgICovCi0gIC8qICAgZm9ybWF0LiAgTm90ZSB0aGF0IHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IG5lZWRlZCBub3JtYWxseTsgICAgICAgICAqLwotICAvKiAgIGhvd2V2ZXIsIHRoZXJlIGFyZSBzcGVjaWFsIGNhc2VzIChsaWtlIGluIFBERiBkZXZpY2VzKSB3aGVyZSBpdCBpcyAgKi8KLSAgLyogICBpbXBvcnRhbnQgdG8gZGlmZmVyZW50aWF0ZSwgaW4gc3BpdGUgb2YgRnJlZVR5cGUncyB1bmlmb3JtIEFQSS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfR2V0X0ZvbnRfRm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgUmV0dXJuIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGZvcm1hdCBvZiBhIGdpdmVuIGZhY2UuICBQb3NzaWJsZSAgICAqLwotICAvKiAgIHZhbHVlcyBhcmUgYFRydWVUeXBlJywgYFR5cGV+MScsIGBCREYnLCBgUENGJywgYFR5cGV+NDInLCAgICAgICAgICAgKi8KLSAgLyogICBgQ0lEflR5cGV+MScsIGBDRkYnLCBgUEZSJywgYW5kIGBXaW5kb3dzfkZOVCcuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoZSByZXR1cm4gdmFsdWUgaXMgc3VpdGFibGUgdG8gYmUgdXNlZCBhcyBhbiBYMTEgRk9OVF9QUk9QRVJUWS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGZhY2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIElucHV0IGZhY2UgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGb250IGZvcm1hdCBzdHJpbmcuICBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBBIGRlcHJlY2F0ZWQgbmFtZSBmb3IgdGhlIHNhbWUgZnVuY3Rpb24gaXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgYEZUX0dldF9YMTFfRm9udF9Gb3JtYXQnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBjb25zdCBjaGFyKiApCi0gIEZUX0dldF9Gb250X0Zvcm1hdCggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyogZGVwcmVjYXRlZCAqLwotICBGVF9FWFBPUlQoIGNvbnN0IGNoYXIqICkKLSAgRlRfR2V0X1gxMV9Gb250X0Zvcm1hdCggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZURk5URk1UX0hfXyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGdhc3AuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRnYXNwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOWI2MzIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGdhc3AuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGdhc3AuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWNjZXNzIG9mIFRydWVUeXBlJ3MgYGdhc3AnIHRhYmxlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX0ZUX0dBU1BfSF8KLSNkZWZpbmUgX0ZUX0dBU1BfSF8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc2VjdGlvbjoKLSAgICogICBnYXNwX3RhYmxlCi0gICAqCi0gICAqIEB0aXRsZToKLSAgICogICBHYXNwIFRhYmxlCi0gICAqCi0gICAqIEBhYnN0cmFjdDoKLSAgICogICBSZXRyaWV2aW5nIFRydWVUeXBlIGBnYXNwJyB0YWJsZSBlbnRyaWVzLgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhlIGZ1bmN0aW9uIEBGVF9HZXRfR2FzcCBjYW4gYmUgdXNlZCB0byBxdWVyeSBhIFRydWVUeXBlIG9yIE9wZW5UeXBlCi0gICAqICAgZm9udCBmb3Igc3BlY2lmaWMgZW50cmllcyBpbiBpdHMgYGdhc3AnIHRhYmxlLCBpZiBhbnkuICBUaGlzIGlzCi0gICAqICAgbWFpbmx5IHVzZWZ1bCB3aGVuIGltcGxlbWVudGluZyBuYXRpdmUgVHJ1ZVR5cGUgaGludGluZyB3aXRoIHRoZQotICAgKiAgIGJ5dGVjb2RlIGludGVycHJldGVyIHRvIGR1cGxpY2F0ZSB0aGUgV2luZG93cyB0ZXh0IHJlbmRlcmluZyByZXN1bHRzLgotICAgKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICBGVF9HQVNQX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIHZhbHVlcyBhbmQvb3IgYml0LWZsYWdzIHJldHVybmVkIGJ5IHRoZSBARlRfR2V0X0dhc3AKLSAgICogICBmdW5jdGlvbi4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBGVF9HQVNQX05PX1RBQkxFIDo6Ci0gICAqICAgICBUaGlzIHNwZWNpYWwgdmFsdWUgbWVhbnMgdGhhdCB0aGVyZSBpcyBubyBHQVNQIHRhYmxlIGluIHRoaXMgZmFjZS4KLSAgICogICAgIEl0IGlzIHVwIHRvIHRoZSBjbGllbnQgdG8gZGVjaWRlIHdoYXQgdG8gZG8uCi0gICAqCi0gICAqICAgRlRfR0FTUF9ET19HUklERklUIDo6Ci0gICAqICAgICBHcmlkLWZpdHRpbmcgYW5kIGhpbnRpbmcgc2hvdWxkIGJlIHBlcmZvcm1lZCBhdCB0aGUgc3BlY2lmaWVkIHBwZW0uCi0gICAqICAgICBUaGlzICpyZWFsbHkqIG1lYW5zIFRydWVUeXBlIGJ5dGVjb2RlIGludGVycHJldGF0aW9uLiAgSWYgdGhpcyBiaXQKLSAgICogICAgIGlzIG5vdCBzZXQsIG5vIGhpbnRpbmcgZ2V0cyBhcHBsaWVkLgotICAgKgotICAgKiAgIEZUX0dBU1BfRE9fR1JBWSA6OgotICAgKiAgICAgQW50aS1hbGlhc2VkIHJlbmRlcmluZyBzaG91bGQgYmUgcGVyZm9ybWVkIGF0IHRoZSBzcGVjaWZpZWQgcHBlbS4KLSAgICogICAgIElmIG5vdCBzZXQsIGRvIG1vbm9jaHJvbWUgcmVuZGVyaW5nLgotICAgKgotICAgKiAgIEZUX0dBU1BfU1lNTUVUUklDX1NNT09USElORyA6OgotICAgKiAgICAgSWYgc2V0LCBzbW9vdGhpbmcgYWxvbmcgbXVsdGlwbGUgYXhlcyBtdXN0IGJlIHVzZWQgd2l0aCBDbGVhclR5cGUuCi0gICAqCi0gICAqICAgRlRfR0FTUF9TWU1NRVRSSUNfR1JJREZJVCA6OgotICAgKiAgICAgR3JpZC1maXR0aW5nIG11c3QgYmUgdXNlZCB3aXRoIENsZWFyVHlwZSdzIHN5bW1ldHJpYyBzbW9vdGhpbmcuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoZSBiaXQtZmxhZ3MgYEZUX0dBU1BfRE9fR1JJREZJVCcgYW5kIGBGVF9HQVNQX0RPX0dSQVknIGFyZSB0byBiZQotICAgKiAgIHVzZWQgZm9yIHN0YW5kYXJkIGZvbnQgcmFzdGVyaXphdGlvbiBvbmx5LiAgSW5kZXBlbmRlbnRseSBvZiB0aGF0LAotICAgKiAgIGBGVF9HQVNQX1NZTU1FVFJJQ19TTU9PVEhJTkcnIGFuZCBgRlRfR0FTUF9TWU1NRVRSSUNfR1JJREZJVCcgYXJlIHRvCi0gICAqICAgYmUgdXNlZCBpZiBDbGVhclR5cGUgaXMgZW5hYmxlZCAoYW5kIGBGVF9HQVNQX0RPX0dSSURGSVQnIGFuZAotICAgKiAgIGBGVF9HQVNQX0RPX0dSQVknIGFyZSBjb25zZXF1ZW50bHkgaWdub3JlZCkuCi0gICAqCi0gICAqICAgYENsZWFyVHlwZScgaXMgTWljcm9zb2Z0J3MgaW1wbGVtZW50YXRpb24gb2YgTENEIHJlbmRlcmluZywgcGFydGx5Ci0gICAqICAgcHJvdGVjdGVkIGJ5IHBhdGVudHMuCi0gICAqCi0gICAqIEBzaW5jZToKLSAgICogICAyLjMuMAotICAgKi8KLSNkZWZpbmUgRlRfR0FTUF9OT19UQUJMRSAgICAgICAgICAgICAgIC0xCi0jZGVmaW5lIEZUX0dBU1BfRE9fR1JJREZJVCAgICAgICAgICAgMHgwMQotI2RlZmluZSBGVF9HQVNQX0RPX0dSQVkgICAgICAgICAgICAgIDB4MDIKLSNkZWZpbmUgRlRfR0FTUF9TWU1NRVRSSUNfU01PT1RISU5HICAweDA4Ci0jZGVmaW5lIEZUX0dBU1BfU1lNTUVUUklDX0dSSURGSVQgICAgMHgxMAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmM6Ci0gICAqICAgRlRfR2V0X0dhc3AKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFJlYWQgdGhlIGBnYXNwJyB0YWJsZSBmcm9tIGEgVHJ1ZVR5cGUgb3IgT3BlblR5cGUgZm9udCBmaWxlIGFuZAotICAgKiAgIHJldHVybiB0aGUgZW50cnkgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIGNoYXJhY3RlciBwaXhlbCBzaXplLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgZmFjZSA6OiBUaGUgc291cmNlIGZhY2UgaGFuZGxlLgotICAgKiAgIHBwZW0gOjogVGhlIHZlcnRpY2FsIGNoYXJhY3RlciBwaXhlbCBzaXplLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEJpdCBmbGFncyAoc2VlIEBGVF9HQVNQX1hYWCksIG9yIEBGVF9HQVNQX05PX1RBQkxFIGlmIHRoZXJlIGlzIG5vCi0gICAqICAgYGdhc3AnIHRhYmxlIGluIHRoZSBmYWNlLgotICAgKgotICAgKiBAc2luY2U6Ci0gICAqICAgMi4zLjAKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfSW50ICkKLSAgRlRfR2V0X0dhc3AoIEZUX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICBGVF9VSW50ICBwcGVtICk7Ci0KLSAgLyogKi8KLQotCi0jZW5kaWYgLyogX0ZUX0dBU1BfSF8gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRnbHlwaC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGdseXBoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwM2FkMzkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGdseXBoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRnbHlwaC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBoYW5kbGUgZ2x5cGhzIChzcGVjaWZpY2F0aW9uKS4gICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIG9mIHNldmVyYWwgY29udmVuaWVuY2UgZnVuY3Rpb25zICAgICovCi0gIC8qIHRoYXQgY2FuIGJlIHVzZWQgYnkgY2xpZW50IGFwcGxpY2F0aW9ucyB0byBlYXNpbHkgcmV0cmlldmUgZ2x5cGggICAgICAqLwotICAvKiBiaXRtYXBzIGFuZCBvdXRsaW5lcyBmcm9tIGEgZ2l2ZW4gZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgYmUgb3B0aW9uYWwgaWYgeW91IGFyZSB3cml0aW5nIGEgZm9udCBzZXJ2ZXIgICAqLwotICAvKiBvciB0ZXh0IGxheW91dCBlbmdpbmUgb24gdG9wIG9mIEZyZWVUeXBlLiAgSG93ZXZlciwgdGhleSBhcmUgcHJldHR5ICAgKi8KLSAgLyogaGFuZHkgZm9yIG1hbnkgb3RoZXIgc2ltcGxlIHVzZXMgb2YgdGhlIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRHTFlQSF9IX18KLSNkZWZpbmUgX19GVEdMWVBIX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX21hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdseXBoIE1hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdlbmVyaWMgaW50ZXJmYWNlIHRvIG1hbmFnZSBpbmRpdmlkdWFsIGdseXBoIGRhdGEuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyBkZWZpbml0aW9ucyB1c2VkIHRvIG1hbmFnZSBnbHlwaCBkYXRhICAgICAgICAqLwotICAvKiAgICB0aHJvdWdoIGdlbmVyaWMgRlRfR2x5cGggb2JqZWN0cy4gIEVhY2ggb2YgdGhlbSBjYW4gY29udGFpbiBhICAgICAgKi8KLSAgLyogICAgYml0bWFwLCBhIHZlY3RvciBvdXRsaW5lLCBvciBldmVuIGltYWdlcyBpbiBvdGhlciBmb3JtYXRzLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gdG8gYSBwcml2YXRlIHR5cGUgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfR2x5cGhfQ2xhc3NfICBGVF9HbHlwaF9DbGFzczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEhhbmRsZSB0byBhbiBvYmplY3QgdXNlZCB0byBtb2RlbCBnZW5lcmljIGdseXBoIGltYWdlcy4gIEl0IGlzIGEgICAqLwotICAvKiAgICBwb2ludGVyIHRvIHRoZSBARlRfR2x5cGhSZWMgc3RydWN0dXJlIGFuZCBjYW4gY29udGFpbiBhIGdseXBoICAgICAgKi8KLSAgLyogICAgYml0bWFwIG9yIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR2x5cGggb2JqZWN0cyBhcmUgbm90IG93bmVkIGJ5IHRoZSBsaWJyYXJ5LiAgWW91IG11c3QgdGh1cyByZWxlYXNlICovCi0gIC8qICAgIHRoZW0gbWFudWFsbHkgKHRocm91Z2ggQEZUX0RvbmVfR2x5cGgpIF9iZWZvcmVfIGNhbGxpbmcgICAgICAgICAgICAqLwotICAvKiAgICBARlRfRG9uZV9GcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX0dseXBoUmVjXyogIEZUX0dseXBoOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJvb3QgZ2x5cGggc3RydWN0dXJlIGNvbnRhaW5zIGEgZ2l2ZW4gZ2x5cGggaW1hZ2UgcGx1cyBpdHMgICAgICovCi0gIC8qICAgIGFkdmFuY2Ugd2lkdGggaW4gMTYuMTYgZml4ZWQtcG9pbnQgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gdGhlIEZyZWVUeXBlIGxpYnJhcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2xhenogICA6OiBBIHBvaW50ZXIgdG8gdGhlIGdseXBoJ3MgY2xhc3MuICBQcml2YXRlLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb3JtYXQgIDo6IFRoZSBmb3JtYXQgb2YgdGhlIGdseXBoJ3MgaW1hZ2UuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFkdmFuY2UgOjogQSAxNi4xNiB2ZWN0b3IgdGhhdCBnaXZlcyB0aGUgZ2x5cGgncyBhZHZhbmNlIHdpZHRoLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0dseXBoUmVjXwotICB7Ci0gICAgRlRfTGlicmFyeSAgICAgICAgICAgICBsaWJyYXJ5OwotICAgIGNvbnN0IEZUX0dseXBoX0NsYXNzKiAgY2xheno7Ci0gICAgRlRfR2x5cGhfRm9ybWF0ICAgICAgICBmb3JtYXQ7Ci0gICAgRlRfVmVjdG9yICAgICAgICAgICAgICBhZHZhbmNlOwotCi0gIH0gRlRfR2x5cGhSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CaXRtYXBHbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhbiBvYmplY3QgdXNlZCB0byBtb2RlbCBhIGJpdG1hcCBnbHlwaCBpbWFnZS4gIFRoaXMgaXMgKi8KLSAgLyogICAgYSBzdWItY2xhc3Mgb2YgQEZUX0dseXBoLCBhbmQgYSBwb2ludGVyIHRvIEBGVF9CaXRtYXBHbHlwaFJlYy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9CaXRtYXBHbHlwaFJlY18qICBGVF9CaXRtYXBHbHlwaDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0JpdG1hcEdseXBoUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgZm9yIGJpdG1hcCBnbHlwaCBpbWFnZXMuICBUaGlzIHJlYWxseSBpcyBhICAgICAgICAqLwotICAvKiAgICBgc3ViLWNsYXNzJyBvZiBARlRfR2x5cGhSZWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByb290ICAgOjogVGhlIHJvb3QgQEZUX0dseXBoIGZpZWxkcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlZnQgICA6OiBUaGUgbGVmdC1zaWRlIGJlYXJpbmcsIGkuZS4sIHRoZSBob3Jpem9udGFsIGRpc3RhbmNlICAgICAqLwotICAvKiAgICAgICAgICAgICAgZnJvbSB0aGUgY3VycmVudCBwZW4gcG9zaXRpb24gdG8gdGhlIGxlZnQgYm9yZGVyIG9mIHRoZSAgKi8KLSAgLyogICAgICAgICAgICAgIGdseXBoIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0b3AgICAgOjogVGhlIHRvcC1zaWRlIGJlYXJpbmcsIGkuZS4sIHRoZSB2ZXJ0aWNhbCBkaXN0YW5jZSBmcm9tICAgKi8KLSAgLyogICAgICAgICAgICAgIHRoZSBjdXJyZW50IHBlbiBwb3NpdGlvbiB0byB0aGUgdG9wIGJvcmRlciBvZiB0aGUgZ2x5cGggICovCi0gIC8qICAgICAgICAgICAgICBiaXRtYXAuICBUaGlzIGRpc3RhbmNlIGlzIHBvc2l0aXZlIGZvciB1cHdhcmRzfnkhICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYml0bWFwIDo6IEEgZGVzY3JpcHRvciBmb3IgdGhlIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWW91IGNhbiB0eXBlY2FzdCBhbiBARlRfR2x5cGggdG8gQEZUX0JpdG1hcEdseXBoIGlmIHlvdSBoYXZlICAgICAgICovCi0gIC8qICAgIGBnbHlwaC0+Zm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAnLiAgVGhpcyBsZXRzIHlvdSBhY2Nlc3MgICAqLwotICAvKiAgICB0aGUgYml0bWFwJ3MgY29udGVudHMgZWFzaWx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBjb3JyZXNwb25kaW5nIHBpeGVsIGJ1ZmZlciBpcyBhbHdheXMgb3duZWQgYnkgQEZUX0JpdG1hcEdseXBoICAqLwotICAvKiAgICBhbmQgaXMgdGh1cyBjcmVhdGVkIGFuZCBkZXN0cm95ZWQgd2l0aCBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9CaXRtYXBHbHlwaFJlY18KLSAgewotICAgIEZUX0dseXBoUmVjICByb290OwotICAgIEZUX0ludCAgICAgICBsZWZ0OwotICAgIEZUX0ludCAgICAgICB0b3A7Ci0gICAgRlRfQml0bWFwICAgIGJpdG1hcDsKLQotICB9IEZUX0JpdG1hcEdseXBoUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZUdseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYW4gb2JqZWN0IHVzZWQgdG8gbW9kZWwgYW4gb3V0bGluZSBnbHlwaCBpbWFnZS4gIFRoaXMgICovCi0gIC8qICAgIGlzIGEgc3ViLWNsYXNzIG9mIEBGVF9HbHlwaCwgYW5kIGEgcG9pbnRlciB0byBARlRfT3V0bGluZUdseXBoUmVjLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfT3V0bGluZUdseXBoUmVjXyogIEZUX091dGxpbmVHbHlwaDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVHbHlwaFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgZm9yIG91dGxpbmUgKHZlY3RvcmlhbCkgZ2x5cGggaW1hZ2VzLiAgVGhpcyAgICAgICAqLwotICAvKiAgICByZWFsbHkgaXMgYSBgc3ViLWNsYXNzJyBvZiBARlRfR2x5cGhSZWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByb290ICAgIDo6IFRoZSByb290IEBGVF9HbHlwaCBmaWVsZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgOjogQSBkZXNjcmlwdG9yIGZvciB0aGUgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFlvdSBjYW4gdHlwZWNhc3QgYW4gQEZUX0dseXBoIHRvIEBGVF9PdXRsaW5lR2x5cGggaWYgeW91IGhhdmUgICAgICAqLwotICAvKiAgICBgZ2x5cGgtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORScuICBUaGlzIGxldHMgeW91IGFjY2VzcyAgKi8KLSAgLyogICAgdGhlIG91dGxpbmUncyBjb250ZW50IGVhc2lseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBcyB0aGUgb3V0bGluZSBpcyBleHRyYWN0ZWQgZnJvbSBhIGdseXBoIHNsb3QsIGl0cyBjb29yZGluYXRlcyBhcmUgKi8KLSAgLyogICAgZXhwcmVzc2VkIG5vcm1hbGx5IGluIDI2LjYgcGl4ZWxzLCB1bmxlc3MgdGhlIGZsYWcgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9MT0FEX05PX1NDQUxFIHdhcyB1c2VkIGluIEBGVF9Mb2FkX0dseXBoKCkgb3IgQEZUX0xvYWRfQ2hhcigpLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG91dGxpbmUncyB0YWJsZXMgYXJlIGFsd2F5cyBvd25lZCBieSB0aGUgb2JqZWN0IGFuZCBhcmUgICAgICAgICovCi0gIC8qICAgIGRlc3Ryb3llZCB3aXRoIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX091dGxpbmVHbHlwaFJlY18KLSAgewotICAgIEZUX0dseXBoUmVjICByb290OwotICAgIEZUX091dGxpbmUgICBvdXRsaW5lOwotCi0gIH0gRlRfT3V0bGluZUdseXBoUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmdW5jdGlvbiB1c2VkIHRvIGV4dHJhY3QgYSBnbHlwaCBpbWFnZSBmcm9tIGEgc2xvdC4gIE5vdGUgdGhhdCAgICovCi0gIC8qICAgIHRoZSBjcmVhdGVkIEBGVF9HbHlwaCBvYmplY3QgbXVzdCBiZSByZWxlYXNlZCB3aXRoIEBGVF9Eb25lX0dseXBoLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNsb3QgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFnbHlwaCA6OiBBIGhhbmRsZSB0byB0aGUgZ2x5cGggb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9HbHlwaCggRlRfR2x5cGhTbG90ICBzbG90LAotICAgICAgICAgICAgICAgIEZUX0dseXBoICAgICAqYWdseXBoICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaF9Db3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gY29weSBhIGdseXBoIGltYWdlLiAgTm90ZSB0aGF0IHRoZSBjcmVhdGVkICAgICAgKi8KLSAgLyogICAgQEZUX0dseXBoIG9iamVjdCBtdXN0IGJlIHJlbGVhc2VkIHdpdGggQEZUX0RvbmVfR2x5cGguICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc291cmNlIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZ2x5cGggb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFyZ2V0IDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZ2x5cGggb2JqZWN0LiAgMH5pbiBjYXNlIG9mICAgICAgICovCi0gIC8qICAgICAgICAgICAgICBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dseXBoX0NvcHkoIEZUX0dseXBoICAgc291cmNlLAotICAgICAgICAgICAgICAgICBGVF9HbHlwaCAgKnRhcmdldCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhfVHJhbnNmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVHJhbnNmb3JtIGEgZ2x5cGggaW1hZ2UgaWYgaXRzIGZvcm1hdCBpcyBzY2FsYWJsZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGggIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZ2x5cGggb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF0cml4IDo6IEEgcG9pbnRlciB0byBhIDJ4MiBtYXRyaXggdG8gYXBwbHkuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZWx0YSAgOjogQSBwb2ludGVyIHRvIGEgMmQgdmVjdG9yIHRvIGFwcGx5LiAgQ29vcmRpbmF0ZXMgYXJlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIGV4cHJlc3NlZCBpbiAxLzY0dGggb2YgYSBwaXhlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZSAoaWYgbm90IDAsIHRoZSBnbHlwaCBmb3JtYXQgaXMgbm90IHNjYWxhYmxlKS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIDJ4MiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggaXMgYWxzbyBhcHBsaWVkIHRvIHRoZSBnbHlwaCdzICAgICAgICovCi0gIC8qICAgIGFkdmFuY2UgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dseXBoX1RyYW5zZm9ybSggRlRfR2x5cGggICAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTWF0cml4KiAgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGRlbHRhICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaF9CQm94X01vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbW9kZSBob3cgdGhlIHZhbHVlcyBvZiBARlRfR2x5cGhfR2V0X0NCb3ggYXJlIHJldHVybmVkLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HTFlQSF9CQk9YX1VOU0NBTEVEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBSZXR1cm4gdW5zY2FsZWQgZm9udCB1bml0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HTFlQSF9CQk9YX1NVQlBJWEVMUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBSZXR1cm4gdW5maXR0ZWQgMjYuNiBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HTFlQSF9CQk9YX0dSSURGSVQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBSZXR1cm4gZ3JpZC1maXR0ZWQgMjYuNiBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HTFlQSF9CQk9YX1RSVU5DQVRFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBSZXR1cm4gY29vcmRpbmF0ZXMgaW4gaW50ZWdlciBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HTFlQSF9CQk9YX1BJWEVMUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBSZXR1cm4gZ3JpZC1maXR0ZWQgcGl4ZWwgY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGVudW0gIEZUX0dseXBoX0JCb3hfTW9kZV8KLSAgewotICAgIEZUX0dMWVBIX0JCT1hfVU5TQ0FMRUQgID0gMCwKLSAgICBGVF9HTFlQSF9CQk9YX1NVQlBJWEVMUyA9IDAsCi0gICAgRlRfR0xZUEhfQkJPWF9HUklERklUICAgPSAxLAotICAgIEZUX0dMWVBIX0JCT1hfVFJVTkNBVEUgID0gMiwKLSAgICBGVF9HTFlQSF9CQk9YX1BJWEVMUyAgICA9IDMKLQotICB9IEZUX0dseXBoX0JCb3hfTW9kZTsKLQotCi0gIC8qIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nICovCi0gIC8qIGBGVF9HbHlwaF9CQm94X01vZGUnIHZhbHVlcyBpbnN0ZWFkICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIGZ0X2dseXBoX2Jib3hfdW5zY2FsZWQgICBGVF9HTFlQSF9CQk9YX1VOU0NBTEVECi0jZGVmaW5lIGZ0X2dseXBoX2Jib3hfc3VicGl4ZWxzICBGVF9HTFlQSF9CQk9YX1NVQlBJWEVMUwotI2RlZmluZSBmdF9nbHlwaF9iYm94X2dyaWRmaXQgICAgRlRfR0xZUEhfQkJPWF9HUklERklUCi0jZGVmaW5lIGZ0X2dseXBoX2Jib3hfdHJ1bmNhdGUgICBGVF9HTFlQSF9CQk9YX1RSVU5DQVRFCi0jZGVmaW5lIGZ0X2dseXBoX2Jib3hfcGl4ZWxzICAgICBGVF9HTFlQSF9CQk9YX1BJWEVMUwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhfR2V0X0NCb3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIGEgZ2x5cGgncyBgY29udHJvbCBib3gnLiAgVGhlIGNvbnRyb2wgYm94IGVuY2xvc2VzIGFsbCB0aGUgICovCi0gIC8qICAgIG91dGxpbmUncyBwb2ludHMsIGluY2x1ZGluZyBCw6l6aWVyIGNvbnRyb2wgcG9pbnRzLiAgVGhvdWdoIGl0ICAgICAgKi8KLSAgLyogICAgY29pbmNpZGVzIHdpdGggdGhlIGV4YWN0IGJvdW5kaW5nIGJveCBmb3IgbW9zdCBnbHlwaHMsIGl0IGNhbiBiZSAgICovCi0gIC8qICAgIHNsaWdodGx5IGxhcmdlciBpbiBzb21lIHNpdHVhdGlvbnMgKGxpa2Ugd2hlbiByb3RhdGluZyBhbiBvdXRsaW5lICAqLwotICAvKiAgICB0aGF0IGNvbnRhaW5zIELDqXppZXIgb3V0c2lkZSBhcmNzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRpbmcgdGhlIGNvbnRyb2wgYm94IGlzIHZlcnkgZmFzdCwgd2hpbGUgZ2V0dGluZyB0aGUgYm91bmRpbmcgKi8KLSAgLyogICAgYm94IGNhbiB0YWtlIG11Y2ggbW9yZSB0aW1lIGFzIGl0IG5lZWRzIHRvIHdhbGsgb3ZlciBhbGwgc2VnbWVudHMgICovCi0gIC8qICAgIGFuZCBhcmNzIGluIHRoZSBvdXRsaW5lLiAgVG8gZ2V0IHRoZSBsYXR0ZXIsIHlvdSBjYW4gdXNlIHRoZSAgICAgICAqLwotICAvKiAgICBgZnRiYm94JyBjb21wb25lbnQsIHdoaWNoIGlzIGRlZGljYXRlZCB0byB0aGlzIHNpbmdsZSB0YXNrLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaCA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGdseXBoIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZGUgIDo6IFRoZSBtb2RlIHRoYXQgaW5kaWNhdGVzIGhvdyB0byBpbnRlcnByZXQgdGhlIHJldHVybmVkICAgICAqLwotICAvKiAgICAgICAgICAgICBib3VuZGluZyBib3ggdmFsdWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhY2JveCA6OiBUaGUgZ2x5cGggY29vcmRpbmF0ZSBib3VuZGluZyBib3guICBDb29yZGluYXRlcyBhcmUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgZXhwcmVzc2VkIGluIDEvNjR0aCBvZiBwaXhlbHMgaWYgaXQgaXMgZ3JpZC1maXR0ZWQuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29vcmRpbmF0ZXMgYXJlIHJlbGF0aXZlIHRvIHRoZSBnbHlwaCBvcmlnaW4sIHVzaW5nIHRoZSB5fnVwd2FyZHMgICovCi0gIC8qICAgIGNvbnZlbnRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgdGhlIGdseXBoIGhhcyBiZWVuIGxvYWRlZCB3aXRoIEBGVF9MT0FEX05PX1NDQUxFLCBgYmJveF9tb2RlJyAgICovCi0gIC8qICAgIG11c3QgYmUgc2V0IHRvIEBGVF9HTFlQSF9CQk9YX1VOU0NBTEVEIHRvIGdldCB1bnNjYWxlZCBmb250ICAgICAgICAqLwotICAvKiAgICB1bml0cyBpbiAyNi42IHBpeGVsIGZvcm1hdC4gIFRoZSB2YWx1ZSBARlRfR0xZUEhfQkJPWF9TVUJQSVhFTFMgICAgKi8KLSAgLyogICAgaXMgYW5vdGhlciBuYW1lIGZvciB0aGlzIGNvbnN0YW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB0aGUgZm9udCBpcyB0cmlja3kgYW5kIHRoZSBnbHlwaCBoYXMgYmVlbiBsb2FkZWQgd2l0aCAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0xPQURfTk9fU0NBTEUsIHRoZSByZXN1bHRpbmcgQ0JveCBpcyBtZWFuaW5nbGVzcy4gIFRvIGdldCAgICAgICovCi0gIC8qICAgIHJlYXNvbmFibGUgdmFsdWVzIGZvciB0aGUgQ0JveCBpdCBpcyBuZWNlc3NhcnkgdG8gbG9hZCB0aGUgZ2x5cGggICAqLwotICAvKiAgICBhdCBhIGxhcmdlIHBwZW0gdmFsdWUgKHNvIHRoYXQgdGhlIGhpbnRpbmcgaW5zdHJ1Y3Rpb25zIGNhbiAgICAgICAgKi8KLSAgLyogICAgcHJvcGVybHkgc2hpZnQgYW5kIHNjYWxlIHRoZSBzdWJnbHlwaHMpLCB0aGVuIGV4dHJhY3RpbmcgdGhlIENCb3gsICovCi0gIC8qICAgIHdoaWNoIGNhbiBiZSBldmVudHVhbGx5IGNvbnZlcnRlZCBiYWNrIHRvIGZvbnQgdW5pdHMuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHRoZSBtYXhpbXVtIGNvb3JkaW5hdGVzIGFyZSBleGNsdXNpdmUsIHdoaWNoIG1lYW5zIHRoYXQgICovCi0gIC8qICAgIG9uZSBjYW4gY29tcHV0ZSB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgZ2x5cGggaW1hZ2UgKGJlIGl0IGluICAqLwotICAvKiAgICBpbnRlZ2VyIG9yIDI2LjYgcGl4ZWxzKSBhczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHdpZHRoICA9IGJib3gueE1heCAtIGJib3gueE1pbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBoZWlnaHQgPSBiYm94LnlNYXggLSBiYm94LnlNaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSBhbHNvIHRoYXQgZm9yIDI2LjYgY29vcmRpbmF0ZXMsIGlmIGBiYm94X21vZGUnIGlzIHNldCB0byAgICAgICovCi0gIC8qICAgIEBGVF9HTFlQSF9CQk9YX0dSSURGSVQsIHRoZSBjb29yZGluYXRlcyB3aWxsIGFsc28gYmUgZ3JpZC1maXR0ZWQsICAqLwotICAvKiAgICB3aGljaCBjb3JyZXNwb25kcyB0bzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGJib3gueE1pbiA9IEZMT09SKGJib3gueE1pbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBiYm94LnlNaW4gPSBGTE9PUihiYm94LnlNaW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgYmJveC54TWF4ID0gQ0VJTElORyhiYm94LnhNYXgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGJib3gueU1heCA9IENFSUxJTkcoYmJveC55TWF4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUbyBnZXQgdGhlIGJib3ggaW4gcGl4ZWwgY29vcmRpbmF0ZXMsIHNldCBgYmJveF9tb2RlJyB0byAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX0dMWVBIX0JCT1hfVFJVTkNBVEUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUbyBnZXQgdGhlIGJib3ggaW4gZ3JpZC1maXR0ZWQgcGl4ZWwgY29vcmRpbmF0ZXMsIHNldCBgYmJveF9tb2RlJyAgKi8KLSAgLyogICAgdG8gQEZUX0dMWVBIX0JCT1hfUElYRUxTLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9HbHlwaF9HZXRfQ0JveCggRlRfR2x5cGggIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGJib3hfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0JCb3ggICphY2JveCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2x5cGhfVG9fQml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29udmVydCBhIGdpdmVuIGdseXBoIG9iamVjdCB0byBhIGJpdG1hcCBnbHlwaCBvYmplY3QuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGhlX2dseXBoICAgOjogQSBwb2ludGVyIHRvIGEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZ2x5cGguICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVuZGVyX21vZGUgOjogQW4gZW51bWVyYXRpb24gdGhhdCBkZXNjcmliZXMgaG93IHRoZSBkYXRhIGlzICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3JpZ2luICAgICAgOjogQSBwb2ludGVyIHRvIGEgdmVjdG9yIHVzZWQgdG8gdHJhbnNsYXRlIHRoZSBnbHlwaCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGltYWdlIGJlZm9yZSByZW5kZXJpbmcuICBDYW4gYmV+MCAoaWYgbm8gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbikuICBUaGUgb3JpZ2luIGlzIGV4cHJlc3NlZCBpbiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgMjYuNiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZXN0cm95ICAgICA6OiBBIGJvb2xlYW4gdGhhdCBpbmRpY2F0ZXMgdGhhdCB0aGUgb3JpZ2luYWwgZ2x5cGggICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgaW1hZ2Ugc2hvdWxkIGJlIGRlc3Ryb3llZCBieSB0aGlzIGZ1bmN0aW9uLiAgSXQgaXMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIG5ldmVyIGRlc3Ryb3llZCBpbiBjYXNlIG9mIGVycm9yLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nIGlmIHRoZSBnbHlwaCBmb3JtYXQgaXNuJ3Qgc2NhbGFibGUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGdseXBoIGltYWdlIGlzIHRyYW5zbGF0ZWQgd2l0aCB0aGUgYG9yaWdpbicgdmVjdG9yIGJlZm9yZSAgICAgICovCi0gIC8qICAgIHJlbmRlcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gQEZUX0dseXBoIGhhbmRsZSwgdGhhdCB3aWxsICovCi0gIC8qICAgIGJlIF9yZXBsYWNlZF8gYnkgdGhpcyBmdW5jdGlvbiAod2l0aCBuZXdseSBhbGxvY2F0ZWQgZGF0YSkuICAgICAgICAqLwotICAvKiAgICBUeXBpY2FsbHksIHlvdSB3b3VsZCB1c2UgKG9taXR0aW5nIGVycm9yIGhhbmRsaW5nKTogICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIEZUX0dseXBoICAgICAgICBnbHlwaDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBGVF9CaXRtYXBHbHlwaCAgZ2x5cGhfYml0bWFwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAvLyBsb2FkIGdseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgZXJyb3IgPSBGVF9Mb2FkX0NoYXIoIGZhY2UsIGdseXBoX2luZGV4LCBGVF9MT0FEX0RFRkFVVCApOyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAvLyBleHRyYWN0IGdseXBoIGltYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgZXJyb3IgPSBGVF9HZXRfR2x5cGgoIGZhY2UtPmdseXBoLCAmZ2x5cGggKTsgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAvLyBjb252ZXJ0IHRvIGEgYml0bWFwIChkZWZhdWx0IHJlbmRlciBtb2RlICsgZGVzdHJveWluZyBvbGQpICAqLwotICAvKiAgICAgICAgaWYgKCBnbHlwaC0+Zm9ybWF0ICE9IEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAgKSAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIGVycm9yID0gRlRfR2x5cGhfVG9fQml0bWFwKCAmZ2x5cGgsIEZUX1JFTkRFUl9NT0RFX05PUk1BTCwgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgaWYgKCBlcnJvciApIC8vIGBnbHlwaCcgdW5jaGFuZ2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAvLyBhY2Nlc3MgYml0bWFwIGNvbnRlbnQgYnkgdHlwZWNhc3RpbmcgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgZ2x5cGhfYml0bWFwID0gKEZUX0JpdG1hcEdseXBoKWdseXBoOyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAvLyBkbyBmdW5ueSBzdHVmZiB3aXRoIGl0LCBsaWtlIGJsaXR0aW5nL2RyYXdpbmcgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAvLyBkaXNjYXJkIGdseXBoIGltYWdlIChiaXRtYXAgb3Igbm90KSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgRlRfRG9uZV9HbHlwaCggZ2x5cGggKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSGVyZSBhbm90aGVyIGV4YW1wbGUsIGFnYWluIHdpdGhvdXQgZXJyb3IgaGFuZGxpbmc6ICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICBGVF9HbHlwaCAgZ2x5cGhzW01BWF9HTFlQSFNdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGZvciAoIGlkeCA9IDA7IGkgPCBNQVhfR0xZUEhTOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIGVycm9yID0gRlRfTG9hZF9HbHlwaCggZmFjZSwgaWR4LCBGVF9MT0FEX0RFRkFVTFQgKSB8fCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEZUX0dldF9HbHlwaCAoIGZhY2UtPmdseXBoLCAmZ2x5cGhbaWR4XSApOyAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGZvciAoIGlkeCA9IDA7IGkgPCBNQVhfR0xZUEhTOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBGVF9HbHlwaCAgYml0bWFwID0gZ2x5cGhzW2lkeF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIC8vIGFmdGVyIHRoaXMgY2FsbCwgYGJpdG1hcCcgbm8gbG9uZ2VyIHBvaW50cyBpbnRvICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAvLyB0aGUgYGdseXBocycgYXJyYXkgKGFuZCB0aGUgb2xkIHZhbHVlIGlzbid0IGRlc3Ryb3llZCkgICAgKi8KLSAgLyogICAgICAgICAgRlRfR2x5cGhfVG9fQml0bWFwKCAmYml0bWFwLCBGVF9SRU5ERVJfTU9ERV9NT05PLCAwLCAwICk7ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIEZUX0RvbmVfR2x5cGgoIGJpdG1hcCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIGZvciAoIGlkeCA9IDA7IGkgPCBNQVhfR0xZUEhTOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIEZUX0RvbmVfR2x5cGgoIGdseXBoc1tpZHhdICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HbHlwaF9Ub19CaXRtYXAoIEZUX0dseXBoKiAgICAgICB0aGVfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIHJlbmRlcl9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogICAgICBvcmlnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgIGRlc3Ryb3kgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RvbmVfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc3Ryb3kgYSBnaXZlbiBnbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZ2x5cGggb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfRG9uZV9HbHlwaCggRlRfR2x5cGggIGdseXBoICk7Ci0KLSAgLyogKi8KLQotCi0gIC8qIG90aGVyIGhlbHBmdWwgZnVuY3Rpb25zICovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29tcHV0YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01hdHJpeF9NdWx0aXBseSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBlcmZvcm0gdGhlIG1hdHJpeCBvcGVyYXRpb24gYGIgPSBhKmInLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGEgOjogQSBwb2ludGVyIHRvIG1hdHJpeCBgYScuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGIgOjogQSBwb2ludGVyIHRvIG1hdHJpeCBgYicuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXN1bHQgaXMgdW5kZWZpbmVkIGlmIGVpdGhlciBgYScgb3IgYGInIGlzIHplcm8uICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfTWF0cml4X011bHRpcGx5KCBjb25zdCBGVF9NYXRyaXgqICBhLAotICAgICAgICAgICAgICAgICAgICAgIEZUX01hdHJpeCogICAgICAgIGIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01hdHJpeF9JbnZlcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEludmVydCBhIDJ4MiBtYXRyaXguICBSZXR1cm4gYW4gZXJyb3IgaWYgaXQgY2FuJ3QgYmUgaW52ZXJ0ZWQuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hdHJpeCA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBtYXRyaXguICBSZW1haW5zIHVudG91Y2hlZCBpbiAgICAqLwotICAvKiAgICAgICAgICAgICAgY2FzZSBvZiBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9NYXRyaXhfSW52ZXJ0KCBGVF9NYXRyaXgqICBtYXRyaXggKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRHTFlQSF9IX18gKi8KLQotCi0vKiBFTkQgKi8KLQotCi0vKiBMb2NhbCBWYXJpYWJsZXM6ICovCi0vKiBjb2Rpbmc6IHV0Zi04ICAgICovCi0vKiBFbmQ6ICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z3h2YWwuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRneHZhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTlhYzFkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRneHZhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Z3h2YWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBBUEkgZm9yIHZhbGlkYXRpbmcgVHJ1ZVR5cGVHWC9BQVQgdGFibGVzIChzcGVjaWZpY2F0aW9uKS4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTWFzYXRha2UgWUFNQVRPLCBSZWRoYXQgSy5LLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVEdYVkFMX0hfXwotI2RlZmluZSBfX0ZUR1hWQUxfSF9fCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGd4X3ZhbGlkYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlR1gvQUFUIFZhbGlkYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIEFQSSB0byB2YWxpZGF0ZSBUcnVlVHlwZUdYL0FBVCB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgZnVuY3Rpb25zIHRvIHZhbGlkYXRlICAgICAqLwotICAvKiAgICBzb21lIFRydWVUeXBlR1ggdGFibGVzIChmZWF0LCBtb3J0LCBtb3J4LCBic2xuLCBqdXN0LCBrZXJuLCBvcGJkLCAgKi8KLSAgLyogICAgdHJhaywgcHJvcCwgbGNhcikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVHJ1ZVR5cGVHWF9WYWxpZGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1RydWVUeXBlR1hfRnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQ2xhc3NpY0tlcm5fVmFsaWRhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NsYXNzaWNLZXJuX0ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVkFMSURBVEVfR1hfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1ZBTElEQVRFX0dYWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9WQUxJREFURV9DS0VSTlhYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFdhcm5pbmc6IFVzZSBGVF9WQUxJREFURV9YWFggdG8gdmFsaWRhdGUgYSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBGb2xsb3dpbmcgZGVmaW5pdGlvbnMgYXJlIGZvciBneHZhbGlkIGRldmVsb3BlcnMuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBGVF9WQUxJREFURV9mZWF0X0lOREVYICAgICAwCi0jZGVmaW5lIEZUX1ZBTElEQVRFX21vcnRfSU5ERVggICAgIDEKLSNkZWZpbmUgRlRfVkFMSURBVEVfbW9yeF9JTkRFWCAgICAgMgotI2RlZmluZSBGVF9WQUxJREFURV9ic2xuX0lOREVYICAgICAzCi0jZGVmaW5lIEZUX1ZBTElEQVRFX2p1c3RfSU5ERVggICAgIDQKLSNkZWZpbmUgRlRfVkFMSURBVEVfa2Vybl9JTkRFWCAgICAgNQotI2RlZmluZSBGVF9WQUxJREFURV9vcGJkX0lOREVYICAgICA2Ci0jZGVmaW5lIEZUX1ZBTElEQVRFX3RyYWtfSU5ERVggICAgIDcKLSNkZWZpbmUgRlRfVkFMSURBVEVfcHJvcF9JTkRFWCAgICAgOAotI2RlZmluZSBGVF9WQUxJREFURV9sY2FyX0lOREVYICAgICA5Ci0jZGVmaW5lIEZUX1ZBTElEQVRFX0dYX0xBU1RfSU5ERVggIEZUX1ZBTElEQVRFX2xjYXJfSU5ERVgKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9WQUxJREFURV9HWF9MRU5HVEgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoZSBudW1iZXIgb2YgdGFibGVzIGNoZWNrZWQgaW4gdGhpcyBtb2R1bGUuICBVc2UgaXQgYXMgYSBwYXJhbWV0ZXIKLSAgICogICBmb3IgdGhlIGB0YWJsZS1sZW5ndGgnIGFyZ3VtZW50IG9mIGZ1bmN0aW9uIEBGVF9UcnVlVHlwZUdYX1ZhbGlkYXRlLgotICAgKi8KLSNkZWZpbmUgRlRfVkFMSURBVEVfR1hfTEVOR1RIICAgICAoRlRfVkFMSURBVEVfR1hfTEFTVF9JTkRFWCArIDEpCi0KLSAgLyogKi8KLQotICAvKiBVcCB0byAweDEwMDAgaXMgdXNlZCBieSBvdHZhbGlkLgotICAgICBPeDJ4eHggaXMgcmVzZXJ2ZWQgZm9yIGZlYXR1cmUgT1QgZXh0ZW5zaW9uLiAqLwotI2RlZmluZSBGVF9WQUxJREFURV9HWF9TVEFSVCAweDQwMDAKLSNkZWZpbmUgRlRfVkFMSURBVEVfR1hfQklURklFTEQoIHRhZyApICAgICAgICAgICAgICAgICAgXAotICAoIEZUX1ZBTElEQVRFX0dYX1NUQVJUIDw8IEZUX1ZBTElEQVRFXyMjdGFnIyNfSU5ERVggKQotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGVudW06Ci0gICogICAgRlRfVkFMSURBVEVfR1hYWFgKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBBIGxpc3Qgb2YgYml0LWZpZWxkIGNvbnN0YW50cyB1c2VkIHdpdGggQEZUX1RydWVUeXBlR1hfVmFsaWRhdGUgdG8KLSAgKiAgICBpbmRpY2F0ZSB3aGljaCBUcnVlVHlwZUdYL0FBVCBUeXBlIHRhYmxlcyBzaG91bGQgYmUgdmFsaWRhdGVkLgotICAqCi0gICogQHZhbHVlczoKLSAgKiAgICBGVF9WQUxJREFURV9mZWF0IDo6Ci0gICogICAgICBWYWxpZGF0ZSBgZmVhdCcgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9tb3J0IDo6Ci0gICogICAgICBWYWxpZGF0ZSBgbW9ydCcgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9tb3J4IDo6Ci0gICogICAgICBWYWxpZGF0ZSBgbW9yeCcgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9ic2xuIDo6Ci0gICogICAgICBWYWxpZGF0ZSBgYnNsbicgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9qdXN0IDo6Ci0gICogICAgICBWYWxpZGF0ZSBganVzdCcgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9rZXJuIDo6Ci0gICogICAgICBWYWxpZGF0ZSBga2VybicgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9vcGJkIDo6Ci0gICogICAgICBWYWxpZGF0ZSBgb3BiZCcgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV90cmFrIDo6Ci0gICogICAgICBWYWxpZGF0ZSBgdHJhaycgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9wcm9wIDo6Ci0gICogICAgICBWYWxpZGF0ZSBgcHJvcCcgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9sY2FyIDo6Ci0gICogICAgICBWYWxpZGF0ZSBgbGNhcicgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9HWCA6OgotICAqICAgICAgVmFsaWRhdGUgYWxsIFRydWVUeXBlR1ggdGFibGVzIChmZWF0LCBtb3J0LCBtb3J4LCBic2xuLCBqdXN0LCBrZXJuLAotICAqICAgICAgb3BiZCwgdHJhaywgcHJvcCBhbmQgbGNhcikuCi0gICoKLSAgKi8KLQotI2RlZmluZSBGVF9WQUxJREFURV9mZWF0ICBGVF9WQUxJREFURV9HWF9CSVRGSUVMRCggZmVhdCApCi0jZGVmaW5lIEZUX1ZBTElEQVRFX21vcnQgIEZUX1ZBTElEQVRFX0dYX0JJVEZJRUxEKCBtb3J0ICkKLSNkZWZpbmUgRlRfVkFMSURBVEVfbW9yeCAgRlRfVkFMSURBVEVfR1hfQklURklFTEQoIG1vcnggKQotI2RlZmluZSBGVF9WQUxJREFURV9ic2xuICBGVF9WQUxJREFURV9HWF9CSVRGSUVMRCggYnNsbiApCi0jZGVmaW5lIEZUX1ZBTElEQVRFX2p1c3QgIEZUX1ZBTElEQVRFX0dYX0JJVEZJRUxEKCBqdXN0ICkKLSNkZWZpbmUgRlRfVkFMSURBVEVfa2VybiAgRlRfVkFMSURBVEVfR1hfQklURklFTEQoIGtlcm4gKQotI2RlZmluZSBGVF9WQUxJREFURV9vcGJkICBGVF9WQUxJREFURV9HWF9CSVRGSUVMRCggb3BiZCApCi0jZGVmaW5lIEZUX1ZBTElEQVRFX3RyYWsgIEZUX1ZBTElEQVRFX0dYX0JJVEZJRUxEKCB0cmFrICkKLSNkZWZpbmUgRlRfVkFMSURBVEVfcHJvcCAgRlRfVkFMSURBVEVfR1hfQklURklFTEQoIHByb3AgKQotI2RlZmluZSBGVF9WQUxJREFURV9sY2FyICBGVF9WQUxJREFURV9HWF9CSVRGSUVMRCggbGNhciApCi0KLSNkZWZpbmUgRlRfVkFMSURBVEVfR1ggICggRlRfVkFMSURBVEVfZmVhdCB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVkFMSURBVEVfbW9ydCB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVkFMSURBVEVfbW9yeCB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVkFMSURBVEVfYnNsbiB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVkFMSURBVEVfanVzdCB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVkFMSURBVEVfa2VybiB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVkFMSURBVEVfb3BiZCB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVkFMSURBVEVfdHJhayB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVkFMSURBVEVfcHJvcCB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVkFMSURBVEVfbGNhciApCi0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICAgRlRfVHJ1ZVR5cGVHWF9WYWxpZGF0ZQotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFZhbGlkYXRlIHZhcmlvdXMgVHJ1ZVR5cGVHWCB0YWJsZXMgdG8gYXNzdXJlIHRoYXQgYWxsIG9mZnNldHMgYW5kCi0gICogICAgaW5kaWNlcyBhcmUgdmFsaWQuICBUaGUgaWRlYSBpcyB0aGF0IGEgaGlnaGVyLWxldmVsIGxpYnJhcnkgdGhhdAotICAqICAgIGFjdHVhbGx5IGRvZXMgdGhlIHRleHQgbGF5b3V0IGNhbiBhY2Nlc3MgdGhvc2UgdGFibGVzIHdpdGhvdXQKLSAgKiAgICBlcnJvciBjaGVja2luZyAod2hpY2ggY2FuIGJlIHF1aXRlIHRpbWUgY29uc3VtaW5nKS4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgICBmYWNlIDo6Ci0gICogICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCi0gICoKLSAgKiAgICB2YWxpZGF0aW9uX2ZsYWdzIDo6Ci0gICogICAgICAgQSBiaXQgZmllbGQgdGhhdCBzcGVjaWZpZXMgdGhlIHRhYmxlcyB0byBiZSB2YWxpZGF0ZWQuICBTZWUKLSAgKiAgICAgICBARlRfVkFMSURBVEVfR1hYWFggZm9yIHBvc3NpYmxlIHZhbHVlcy4KLSAgKgotICAqICAgIHRhYmxlX2xlbmd0aCA6OgotICAqICAgICAgIFRoZSBzaXplIG9mIHRoZSBgdGFibGVzJyBhcnJheS4gIE5vcm1hbGx5LCBARlRfVkFMSURBVEVfR1hfTEVOR1RICi0gICogICAgICAgc2hvdWxkIGJlIHBhc3NlZC4KLSAgKgotICAqIEBvdXRwdXQ6Ci0gICogICAgdGFibGVzIDo6Ci0gICogICAgICAgVGhlIGFycmF5IHdoZXJlIGFsbCB2YWxpZGF0ZWQgc2ZudCB0YWJsZXMgYXJlIHN0b3JlZC4KLSAgKiAgICAgICBUaGUgYXJyYXkgaXRzZWxmIG11c3QgYmUgYWxsb2NhdGVkIGJ5IGEgY2xpZW50LgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyB3aXRoIFRydWVUeXBlR1ggZm9udHMsIHJldHVybmluZyBhbiBlcnJvcgotICAqICAgb3RoZXJ3aXNlLgotICAqCi0gICogICBBZnRlciB1c2UsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZGVhbGxvY2F0ZSB0aGUgYnVmZmVycyBwb2ludGVkIHRvIGJ5Ci0gICogICBlYWNoIGB0YWJsZXMnIGVsZW1lbnQsIGJ5IGNhbGxpbmcgQEZUX1RydWVUeXBlR1hfRnJlZS4gIEEgTlVMTCB2YWx1ZQotICAqICAgaW5kaWNhdGVzIHRoYXQgdGhlIHRhYmxlIGVpdGhlciBkb2Vzbid0IGV4aXN0IGluIHRoZSBmb250LCB0aGUKLSAgKiAgIGFwcGxpY2F0aW9uIGhhc24ndCBhc2tlZCBmb3IgdmFsaWRhdGlvbiwgb3IgdGhlIHZhbGlkYXRvciBkb2Vzbid0IGhhdmUKLSAgKiAgIHRoZSBhYmlsaXR5IHRvIHZhbGlkYXRlIHRoZSBzZm50IHRhYmxlLgotICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfVHJ1ZVR5cGVHWF9WYWxpZGF0ZSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICB2YWxpZGF0aW9uX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgdGFibGVzW0ZUX1ZBTElEQVRFX0dYX0xFTkdUSF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICB0YWJsZV9sZW5ndGggKTsKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9UcnVlVHlwZUdYX0ZyZWUKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBGcmVlIHRoZSBidWZmZXIgYWxsb2NhdGVkIGJ5IFRydWVUeXBlR1ggdmFsaWRhdG9yLgotICAqCi0gICogQGlucHV0OgotICAqICAgIGZhY2UgOjoKLSAgKiAgICAgICBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KLSAgKgotICAqICAgIHRhYmxlIDo6Ci0gICogICAgICAgVGhlIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgYnkKLSAgKiAgICAgICBARlRfVHJ1ZVR5cGVHWF9WYWxpZGF0ZS4KLSAgKgotICAqIEBub3RlOgotICAqICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgdG8gZnJlZSB0aGUgYnVmZmVyIGFsbG9jYXRlZCBieQotICAqICAgQEZUX1RydWVUeXBlR1hfVmFsaWRhdGUgb25seS4KLSAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfVHJ1ZVR5cGVHWF9GcmVlKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgdGFibGUgKTsKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBlbnVtOgotICAqICAgIEZUX1ZBTElEQVRFX0NLRVJOWFhYCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgQSBsaXN0IG9mIGJpdC1maWVsZCBjb25zdGFudHMgdXNlZCB3aXRoIEBGVF9DbGFzc2ljS2Vybl9WYWxpZGF0ZQotICAqICAgIHRvIGluZGljYXRlIHRoZSBjbGFzc2ljIGtlcm4gZGlhbGVjdCBvciBkaWFsZWN0cy4gIElmIHRoZSBzZWxlY3RlZAotICAqICAgIHR5cGUgZG9lc24ndCBmaXQsIEBGVF9DbGFzc2ljS2Vybl9WYWxpZGF0ZSByZWdhcmRzIHRoZSB0YWJsZSBhcwotICAqICAgIGludmFsaWQuCi0gICoKLSAgKiBAdmFsdWVzOgotICAqICAgIEZUX1ZBTElEQVRFX01TIDo6Ci0gICogICAgICBIYW5kbGUgdGhlIGBrZXJuJyB0YWJsZSBhcyBhIGNsYXNzaWMgTWljcm9zb2Z0IGtlcm4gdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9BUFBMRSA6OgotICAqICAgICAgSGFuZGxlIHRoZSBga2VybicgdGFibGUgYXMgYSBjbGFzc2ljIEFwcGxlIGtlcm4gdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9DS0VSTiA6OgotICAqICAgICAgSGFuZGxlIHRoZSBga2VybicgYXMgZWl0aGVyIGNsYXNzaWMgQXBwbGUgb3IgTWljcm9zb2Z0IGtlcm4gdGFibGUuCi0gICovCi0jZGVmaW5lIEZUX1ZBTElEQVRFX01TICAgICAoIEZUX1ZBTElEQVRFX0dYX1NUQVJUIDw8IDAgKQotI2RlZmluZSBGVF9WQUxJREFURV9BUFBMRSAgKCBGVF9WQUxJREFURV9HWF9TVEFSVCA8PCAxICkKLQotI2RlZmluZSBGVF9WQUxJREFURV9DS0VSTiAgKCBGVF9WQUxJREFURV9NUyB8IEZUX1ZBTElEQVRFX0FQUExFICkKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9DbGFzc2ljS2Vybl9WYWxpZGF0ZQotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFZhbGlkYXRlIGNsYXNzaWMgKDE2LWJpdCBmb3JtYXQpIGtlcm4gdGFibGUgdG8gYXNzdXJlIHRoYXQgdGhlIG9mZnNldHMKLSAgKiAgICBhbmQgaW5kaWNlcyBhcmUgdmFsaWQuICBUaGUgaWRlYSBpcyB0aGF0IGEgaGlnaGVyLWxldmVsIGxpYnJhcnkgdGhhdAotICAqICAgIGFjdHVhbGx5IGRvZXMgdGhlIHRleHQgbGF5b3V0IGNhbiBhY2Nlc3MgdGhvc2UgdGFibGVzIHdpdGhvdXQgZXJyb3IKLSAgKiAgICBjaGVja2luZyAod2hpY2ggY2FuIGJlIHF1aXRlIHRpbWUgY29uc3VtaW5nKS4KLSAgKgotICAqICAgIFRoZSBga2VybicgdGFibGUgdmFsaWRhdG9yIGluIEBGVF9UcnVlVHlwZUdYX1ZhbGlkYXRlIGRlYWxzIHdpdGggYm90aAotICAqICAgIHRoZSBuZXcgMzItYml0IGZvcm1hdCBhbmQgdGhlIGNsYXNzaWMgMTYtYml0IGZvcm1hdCwgd2hpbGUKLSAgKiAgICBGVF9DbGFzc2ljS2Vybl9WYWxpZGF0ZSBvbmx5IHN1cHBvcnRzIHRoZSBjbGFzc2ljIDE2LWJpdCBmb3JtYXQuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICAgZmFjZSA6OgotICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogICAgdmFsaWRhdGlvbl9mbGFncyA6OgotICAqICAgICAgIEEgYml0IGZpZWxkIHRoYXQgc3BlY2lmaWVzIHRoZSBkaWFsZWN0IHRvIGJlIHZhbGlkYXRlZC4gIFNlZQotICAqICAgICAgIEBGVF9WQUxJREFURV9DS0VSTlhYWCBmb3IgcG9zc2libGUgdmFsdWVzLgotICAqCi0gICogQG91dHB1dDoKLSAgKiAgICBja2Vybl90YWJsZSA6OgotICAqICAgICAgIEEgcG9pbnRlciB0byB0aGUga2VybiB0YWJsZS4KLSAgKgotICAqIEByZXR1cm46Ci0gICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAqCi0gICogQG5vdGU6Ci0gICogICBBZnRlciB1c2UsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZGVhbGxvY2F0ZSB0aGUgYnVmZmVycyBwb2ludGVkIHRvIGJ5Ci0gICogICBgY2tlcm5fdGFibGUnLCBieSBjYWxsaW5nIEBGVF9DbGFzc2ljS2Vybl9GcmVlLiAgQSBOVUxMIHZhbHVlCi0gICogICBpbmRpY2F0ZXMgdGhhdCB0aGUgdGFibGUgZG9lc24ndCBleGlzdCBpbiB0aGUgZm9udC4KLSAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHZhbGlkYXRpb25fZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgKmNrZXJuX3RhYmxlICk7Ci0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICAgRlRfQ2xhc3NpY0tlcm5fRnJlZQotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIEZyZWUgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgY2xhc3NpYyBLZXJuIHZhbGlkYXRvci4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgICBmYWNlIDo6Ci0gICogICAgICAgQSBoYW5kbGUgdG8gdGhlIGlucHV0IGZhY2UuCi0gICoKLSAgKiAgICB0YWJsZSA6OgotICAqICAgICAgIFRoZSBwb2ludGVyIHRvIHRoZSBidWZmZXIgdGhhdCBpcyBhbGxvY2F0ZWQgYnkKLSAgKiAgICAgICBARlRfQ2xhc3NpY0tlcm5fVmFsaWRhdGUuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIHRvIGZyZWUgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgYnkKLSAgKiAgIEBGVF9DbGFzc2ljS2Vybl9WYWxpZGF0ZSBvbmx5LgotICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9DbGFzc2ljS2Vybl9GcmVlKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgIHRhYmxlICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUR1hWQUxfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z3ppcC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGd6aXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNhNTMyZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0Z3ppcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Z3ppcC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBHemlwLWNvbXByZXNzZWQgc3RyZWFtIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUR1pJUF9IX18KLSNkZWZpbmUgX19GVEdaSVBfSF9fCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnemlwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHWklQIFN0cmVhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2luZyBnemlwLWNvbXByZXNzZWQgZm9udCBmaWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIEd6aXAtc3BlY2lmaWMgZnVuY3Rpb25zLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICBGVF9TdHJlYW1fT3Blbkd6aXAKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgIE9wZW4gYSBuZXcgc3RyZWFtIHRvIHBhcnNlIGd6aXAtY29tcHJlc3NlZCBmb250IGZpbGVzLiAgVGhpcyBpcwotICAqICAgbWFpbmx5IHVzZWQgdG8gc3VwcG9ydCB0aGUgY29tcHJlc3NlZCBgKi5wY2YuZ3onIGZvbnRzIHRoYXQgY29tZQotICAqICAgd2l0aCBYRnJlZTg2LgotICAqCi0gICogQGlucHV0OgotICAqICAgc3RyZWFtIDo6Ci0gICogICAgIFRoZSB0YXJnZXQgZW1iZWRkaW5nIHN0cmVhbS4KLSAgKgotICAqICAgc291cmNlIDo6Ci0gICogICAgIFRoZSBzb3VyY2Ugc3RyZWFtLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoZSBzb3VyY2Ugc3RyZWFtIG11c3QgYmUgb3BlbmVkIF9iZWZvcmVfIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLSAgKgotICAqICAgQ2FsbGluZyB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gYEZUX1N0cmVhbV9DbG9zZScgb24gdGhlIG5ldyBzdHJlYW0gd2lsbAotICAqICAgKm5vdCogY2FsbCBgRlRfU3RyZWFtX0Nsb3NlJyBvbiB0aGUgc291cmNlIHN0cmVhbS4gIE5vbmUgb2YgdGhlIHN0cmVhbQotICAqICAgb2JqZWN0cyB3aWxsIGJlIHJlbGVhc2VkIHRvIHRoZSBoZWFwLgotICAqCi0gICogICBUaGUgc3RyZWFtIGltcGxlbWVudGF0aW9uIGlzIHZlcnkgYmFzaWMgYW5kIHJlc2V0cyB0aGUgZGVjb21wcmVzc2lvbgotICAqICAgcHJvY2VzcyBlYWNoIHRpbWUgc2Vla2luZyBiYWNrd2FyZHMgaXMgbmVlZGVkIHdpdGhpbiB0aGUgc3RyZWFtLgotICAqCi0gICogICBJbiBjZXJ0YWluIGJ1aWxkcyBvZiB0aGUgbGlicmFyeSwgZ3ppcCBjb21wcmVzc2lvbiByZWNvZ25pdGlvbiBpcwotICAqICAgYXV0b21hdGljYWxseSBoYW5kbGVkIHdoZW4gY2FsbGluZyBARlRfTmV3X0ZhY2Ugb3IgQEZUX09wZW5fRmFjZS4KLSAgKiAgIFRoaXMgbWVhbnMgdGhhdCBpZiBubyBmb250IGRyaXZlciBpcyBjYXBhYmxlIG9mIGhhbmRsaW5nIHRoZSByYXcKLSAgKiAgIGNvbXByZXNzZWQgZmlsZSwgdGhlIGxpYnJhcnkgd2lsbCB0cnkgdG8gb3BlbiBhIGd6aXBwZWQgc3RyZWFtIGZyb20KLSAgKiAgIGl0IGFuZCByZS1vcGVuIHRoZSBmYWNlIHdpdGggaXQuCi0gICoKLSAgKiAgIFRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZScgaWYgeW91ciBidWlsZAotICAqICAgb2YgRnJlZVR5cGUgd2FzIG5vdCBjb21waWxlZCB3aXRoIHpsaWIgc3VwcG9ydC4KLSAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9PcGVuR3ppcCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzb3VyY2UgKTsKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgRlRfR3ppcF9VbmNvbXByZXNzCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICBEZWNvbXByZXNzIGEgemlwcGVkIGlucHV0IGJ1ZmZlciBpbnRvIGFuIG91dHB1dCBidWZmZXIuICBUaGlzIGZ1bmN0aW9uCi0gICogICBpcyBtb2RlbGVkIGFmdGVyIHpsaWIncyBgdW5jb21wcmVzcycgZnVuY3Rpb24uCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICBtZW1vcnkgOjoKLSAgKiAgICAgQSBGcmVlVHlwZSBtZW1vcnkgaGFuZGxlLgotICAqCi0gICogICBpbnB1dCA6OgotICAqICAgICBUaGUgaW5wdXQgYnVmZmVyLgotICAqCi0gICogICBpbnB1dF9sZW4gOjoKLSAgKiAgICAgVGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgYnVmZmVyLgotICAqCi0gICogQG91dHB1dDoKLSAgKiAgIG91dHB1dDo6Ci0gICogICAgIFRoZSBvdXRwdXQgYnVmZmVyLgotICAqCi0gICogQGlub3V0OgotICAqICAgb3V0cHV0X2xlbiA6OgotICAqICAgICBCZWZvcmUgY2FsbGluZyB0aGUgZnVuY3Rpb24sIHRoaXMgaXMgdGhlIHRoZSB0b3RhbCBzaXplIG9mIHRoZQotICAqICAgICBvdXRwdXQgYnVmZmVyLCB3aGljaCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBlbnRpcmUKLSAgKiAgICAgdW5jb21wcmVzc2VkIGRhdGEgKHNvIHRoZSBzaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBtdXN0IGJlCi0gICogICAgIGtub3duIGluIGFkdmFuY2UpLiAgQWZ0ZXIgY2FsbGluZyB0aGUgZnVuY3Rpb24sIGBvdXRwdXRfbGVuJyBpcyB0aGUKLSAgKiAgICAgc2l6ZSBvZiB0aGUgdXNlZCBkYXRhIGluIGBvdXRwdXQnLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZScgaWYgeW91ciBidWlsZAotICAqICAgb2YgRnJlZVR5cGUgd2FzIG5vdCBjb21waWxlZCB3aXRoIHpsaWIgc3VwcG9ydC4KLSAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0d6aXBfVW5jb21wcmVzcyggRlRfTWVtb3J5ICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgICAgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgICBvdXRwdXRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgaW5wdXRfbGVuICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUR1pJUF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZjI4NGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGltYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0aW1hZ2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBnbHlwaCBpbWFnZSBmb3JtYXRzIGFuZCBkZWZhdWx0IHJhc3RlciBpbnRlcmZhY2UgICAgICAgICAgICAqLwotLyogICAgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZTogQSBgcmFzdGVyJyBpcyBzaW1wbHkgYSBzY2FuLWxpbmUgY29udmVydGVyLCB1c2VkIHRvIHJlbmRlciAgICAgICovCi0gIC8qICAgICAgIEZUX091dGxpbmVzIGludG8gRlRfQml0bWFwcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUSU1BR0VfSF9fCi0jZGVmaW5lIF9fRlRJTUFHRV9IX18KLQotCi0gIC8qIF9TVEFOREFMT05FXyBpcyBmcm9tIGZ0Z3JheXMuYyAqLwotI2lmbmRlZiBfU1RBTkRBTE9ORV8KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYXNpY190eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUG9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHR5cGUgRlRfUG9zIGlzIHVzZWQgdG8gc3RvcmUgdmVjdG9yaWFsIGNvb3JkaW5hdGVzLiAgRGVwZW5kaW5nICovCi0gIC8qICAgIG9uIHRoZSBjb250ZXh0LCB0aGVzZSBjYW4gcmVwcmVzZW50IGRpc3RhbmNlcyBpbiBpbnRlZ2VyIGZvbnQgICAgICAqLwotICAvKiAgICB1bml0cywgb3IgMTYuMTYsIG9yIDI2LjYgZml4ZWQtcG9pbnQgcGl4ZWwgY29vcmRpbmF0ZXMuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc2lnbmVkIGxvbmcgIEZUX1BvczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1ZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGEgMkQgdmVjdG9yOyBjb29yZGluYXRlcyBhcmUgb2YgICAqLwotICAvKiAgICB0aGUgRlRfUG9zIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4IDo6IFRoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeSA6OiBUaGUgdmVydGljYWwgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfVmVjdG9yXwotICB7Ci0gICAgRlRfUG9zICB4OwotICAgIEZUX1BvcyAgeTsKLQotICB9IEZUX1ZlY3RvcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0JCb3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBhbiBvdXRsaW5lJ3MgYm91bmRpbmcgYm94LCBpLmUuLCB0aGUgICAgICAqLwotICAvKiAgICBjb29yZGluYXRlcyBvZiBpdHMgZXh0cmVtYSBpbiB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgICAgICAgICAgKi8KLSAgLyogICAgZGlyZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeE1pbiA6OiBUaGUgaG9yaXpvbnRhbCBtaW5pbXVtIChsZWZ0LW1vc3QpLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5TWluIDo6IFRoZSB2ZXJ0aWNhbCBtaW5pbXVtIChib3R0b20tbW9zdCkuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHhNYXggOjogVGhlIGhvcml6b250YWwgbWF4aW11bSAocmlnaHQtbW9zdCkuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeU1heCA6OiBUaGUgdmVydGljYWwgbWF4aW11bSAodG9wLW1vc3QpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGJvdW5kaW5nIGJveCBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGxvd2VyICAgICovCi0gIC8qICAgIGxlZnQgYW5kIHRoZSB1cHBlciByaWdodCBjb3JuZXIuICBJbiBQb3N0U2NyaXB0LCB0aG9zZSB2YWx1ZXMgYXJlICAqLwotICAvKiAgICBvZnRlbiBjYWxsZWQgKGxseCxsbHkpIGFuZCAodXJ4LHVyeSksIHJlc3BlY3RpdmVseS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIGB5TWluJyBpcyBuZWdhdGl2ZSwgdGhpcyB2YWx1ZSBnaXZlcyB0aGUgZ2x5cGgncyBkZXNjZW5kZXIuICAgICAqLwotICAvKiAgICBPdGhlcndpc2UsIHRoZSBnbHlwaCBkb2Vzbid0IGRlc2NlbmQgYmVsb3cgdGhlIGJhc2VsaW5lLiAgICAgICAgICAgKi8KLSAgLyogICAgU2ltaWxhcmx5LCBpZiBgeW1heCcgaXMgcG9zaXRpdmUsIHRoaXMgdmFsdWUgZ2l2ZXMgdGhlIGdseXBoJ3MgICAgICovCi0gIC8qICAgIGFzY2VuZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYHhNaW4nIGdpdmVzIHRoZSBob3Jpem9udGFsIGRpc3RhbmNlIGZyb20gdGhlIGdseXBoJ3Mgb3JpZ2luIHRvICAgICovCi0gIC8qICAgIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGdseXBoJ3MgYm91bmRpbmcgYm94LiAgSWYgYHhNaW4nIGlzIG5lZ2F0aXZlLCAqLwotICAvKiAgICB0aGUgZ2x5cGggZXh0ZW5kcyB0byB0aGUgbGVmdCBvZiB0aGUgb3JpZ2luLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9CQm94XwotICB7Ci0gICAgRlRfUG9zICB4TWluLCB5TWluOwotICAgIEZUX1BvcyAgeE1heCwgeU1heDsKLQotICB9IEZUX0JCb3g7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QaXhlbF9Nb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlbnVtZXJhdGlvbiB0eXBlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGZvcm1hdCBvZiBwaXhlbHMgaW4gYSAgICAgKi8KLSAgLyogICAgZ2l2ZW4gYml0bWFwLiAgTm90ZSB0aGF0IGFkZGl0aW9uYWwgZm9ybWF0cyBtYXkgYmUgYWRkZWQgaW4gdGhlICAgICovCi0gIC8qICAgIGZ1dHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BJWEVMX01PREVfTk9ORSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFZhbHVlfjAgaXMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BJWEVMX01PREVfTU9OTyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgbW9ub2Nocm9tZSBiaXRtYXAsIHVzaW5nIDF+Yml0IHBlciBwaXhlbC4gIE5vdGUgdGhhdCBwaXhlbHMgICAgKi8KLSAgLyogICAgICBhcmUgc3RvcmVkIGluIG1vc3Qtc2lnbmlmaWNhbnQgb3JkZXIgKE1TQiksIHdoaWNoIG1lYW5zIHRoYXQgICAgICovCi0gIC8qICAgICAgdGhlIGxlZnQtbW9zdCBwaXhlbCBpbiBhIGJ5dGUgaGFzIHZhbHVlIDEyOC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUElYRUxfTU9ERV9HUkFZIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQW4gOC1iaXQgYml0bWFwLCBnZW5lcmFsbHkgdXNlZCB0byByZXByZXNlbnQgYW50aS1hbGlhc2VkIGdseXBoICAqLwotICAvKiAgICAgIGltYWdlcy4gIEVhY2ggcGl4ZWwgaXMgc3RvcmVkIGluIG9uZSBieXRlLiAgTm90ZSB0aGF0IHRoZSBudW1iZXIgKi8KLSAgLyogICAgICBvZiBgZ3JheScgbGV2ZWxzIGlzIHN0b3JlZCBpbiB0aGUgYG51bV9ncmF5cycgZmllbGQgb2YgdGhlICAgICAgICovCi0gIC8qICAgICAgQEZUX0JpdG1hcCBzdHJ1Y3R1cmUgKGl0IGdlbmVyYWxseSBpcyAyNTYpLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUElYRUxfTU9ERV9HUkFZMiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSAyLWJpdCBwZXIgcGl4ZWwgYml0bWFwLCB1c2VkIHRvIHJlcHJlc2VudCBlbWJlZGRlZCAgICAgICAgICAgICAqLwotICAvKiAgICAgIGFudGktYWxpYXNlZCBiaXRtYXBzIGluIGZvbnQgZmlsZXMgYWNjb3JkaW5nIHRvIHRoZSBPcGVuVHlwZSAgICAgKi8KLSAgLyogICAgICBzcGVjaWZpY2F0aW9uLiAgV2UgaGF2ZW4ndCBmb3VuZCBhIHNpbmdsZSBmb250IHVzaW5nIHRoaXMgICAgICAgICovCi0gIC8qICAgICAgZm9ybWF0LCBob3dldmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUElYRUxfTU9ERV9HUkFZNCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSA0LWJpdCBwZXIgcGl4ZWwgYml0bWFwLCByZXByZXNlbnRpbmcgZW1iZWRkZWQgYW50aS1hbGlhc2VkICAgICAqLwotICAvKiAgICAgIGJpdG1hcHMgaW4gZm9udCBmaWxlcyBhY2NvcmRpbmcgdG8gdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uICAgKi8KLSAgLyogICAgICBXZSBoYXZlbid0IGZvdW5kIGEgc2luZ2xlIGZvbnQgdXNpbmcgdGhpcyBmb3JtYXQsIGhvd2V2ZXIuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QSVhFTF9NT0RFX0xDRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBbiA4LWJpdCBiaXRtYXAsIHJlcHJlc2VudGluZyBSR0Igb3IgQkdSIGRlY2ltYXRlZCBnbHlwaCBpbWFnZXMgICovCi0gIC8qICAgICAgdXNlZCBmb3IgZGlzcGxheSBvbiBMQ0QgZGlzcGxheXM7IHRoZSBiaXRtYXAgaXMgdGhyZWUgdGltZXMgICAgICAqLwotICAvKiAgICAgIHdpZGVyIHRoYW4gdGhlIG9yaWdpbmFsIGdseXBoIGltYWdlLiAgU2VlIGFsc28gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBARlRfUkVOREVSX01PREVfTENELiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QSVhFTF9NT0RFX0xDRF9WIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBbiA4LWJpdCBiaXRtYXAsIHJlcHJlc2VudGluZyBSR0Igb3IgQkdSIGRlY2ltYXRlZCBnbHlwaCBpbWFnZXMgICovCi0gIC8qICAgICAgdXNlZCBmb3IgZGlzcGxheSBvbiByb3RhdGVkIExDRCBkaXNwbGF5czsgdGhlIGJpdG1hcCBpcyB0aHJlZSAgICAqLwotICAvKiAgICAgIHRpbWVzIHRhbGxlciB0aGFuIHRoZSBvcmlnaW5hbCBnbHlwaCBpbWFnZS4gIFNlZSBhbHNvICAgICAgICAgICAgKi8KLSAgLyogICAgICBARlRfUkVOREVSX01PREVfTENEX1YuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9QSVhFTF9NT0RFX0JHUkEgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBbiBpbWFnZSB3aXRoIGZvdXIgOC1iaXQgY2hhbm5lbHMgcGVyIHBpeGVsLCByZXByZXNlbnRpbmcgYSAgICAgICovCi0gIC8qICAgICAgY29sb3IgaW1hZ2UgKHN1Y2ggYXMgZW1vdGljb25zKSB3aXRoIGFscGhhIGNoYW5uZWwuICBGb3IgZWFjaCAgICAqLwotICAvKiAgICAgIHBpeGVsLCB0aGUgZm9ybWF0IGlzIEJHUkEsIHdoaWNoIG1lYW5zLCB0aGUgYmx1ZSBjaGFubmVsIGNvbWVzICAgKi8KLSAgLyogICAgICBmaXJzdCBpbiBtZW1vcnkuICBUaGUgY29sb3IgY2hhbm5lbHMgYXJlIHByZS1tdWx0aXBsaWVkIGFuZCBpbiAgICovCi0gIC8qICAgICAgdGhlIHNSR0IgY29sb3JzcGFjZS4gIEZvciBleGFtcGxlLCBmdWxsIHJlZCBhdCBoYWxmLXRyYW5zbHVjZW50ICAqLwotICAvKiAgICAgIG9wYWNpdHkgd2lsbCBiZSByZXByZXNlbnRlZCBhcyBgMDAsMDAsODAsODAnLCBub3QgYDAwLDAwLEZGLDgwJy4gKi8KLSAgLyogICAgICBTZWUgYWxzbyBARlRfTE9BRF9DT0xPUi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGVudW0gIEZUX1BpeGVsX01vZGVfCi0gIHsKLSAgICBGVF9QSVhFTF9NT0RFX05PTkUgPSAwLAotICAgIEZUX1BJWEVMX01PREVfTU9OTywKLSAgICBGVF9QSVhFTF9NT0RFX0dSQVksCi0gICAgRlRfUElYRUxfTU9ERV9HUkFZMiwKLSAgICBGVF9QSVhFTF9NT0RFX0dSQVk0LAotICAgIEZUX1BJWEVMX01PREVfTENELAotICAgIEZUX1BJWEVMX01PREVfTENEX1YsCi0gICAgRlRfUElYRUxfTU9ERV9CR1JBLAotCi0gICAgRlRfUElYRUxfTU9ERV9NQVggICAgICAvKiBkbyBub3QgcmVtb3ZlICovCi0KLSAgfSBGVF9QaXhlbF9Nb2RlOwotCi0KLSAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgYEZUX1BpeGVsX01vZGUnICovCi0gIC8qIHZhbHVlcyBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBmdF9waXhlbF9tb2RlX25vbmUgICBGVF9QSVhFTF9NT0RFX05PTkUKLSNkZWZpbmUgZnRfcGl4ZWxfbW9kZV9tb25vICAgRlRfUElYRUxfTU9ERV9NT05PCi0jZGVmaW5lIGZ0X3BpeGVsX21vZGVfZ3JheXMgIEZUX1BJWEVMX01PREVfR1JBWQotI2RlZmluZSBmdF9waXhlbF9tb2RlX3BhbDIgICBGVF9QSVhFTF9NT0RFX0dSQVkyCi0jZGVmaW5lIGZ0X3BpeGVsX21vZGVfcGFsNCAgIEZUX1BJWEVMX01PREVfR1JBWTQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0JpdG1hcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgYSBiaXRtYXAgb3IgcGl4bWFwIHRvIHRoZSByYXN0ZXIuICAgICAqLwotICAvKiAgICBOb3RlIHRoYXQgd2Ugbm93IG1hbmFnZSBwaXhtYXBzIG9mIHZhcmlvdXMgZGVwdGhzIHRocm91Z2ggdGhlICAgICAgKi8KLSAgLyogICAgYHBpeGVsX21vZGUnIGZpZWxkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcm93cyAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgYml0bWFwIHJvd3MuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB3aWR0aCAgICAgICAgOjogVGhlIG51bWJlciBvZiBwaXhlbHMgaW4gYml0bWFwIHJvdy4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBpdGNoICAgICAgICA6OiBUaGUgcGl0Y2gncyBhYnNvbHV0ZSB2YWx1ZSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgdGFrZW4gYnkgb25lIGJpdG1hcCByb3csIGluY2x1ZGluZyBwYWRkaW5nLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIEhvd2V2ZXIsIHRoZSBwaXRjaCBpcyBwb3NpdGl2ZSB3aGVuIHRoZSBiaXRtYXAgaGFzICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBhIGBkb3duJyBmbG93LCBhbmQgbmVnYXRpdmUgd2hlbiBpdCBoYXMgYW4gYHVwJyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgZmxvdy4gIEluIGFsbCBjYXNlcywgdGhlIHBpdGNoIGlzIGFuIG9mZnNldCB0byBhZGQgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHRvIGEgYml0bWFwIHBvaW50ZXIgaW4gb3JkZXIgdG8gZ28gZG93biBvbmUgcm93LiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGBwYWRkaW5nJyBtZWFucyB0aGUgYWxpZ25tZW50IG9mIGEgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGJpdG1hcCB0byBhIGJ5dGUgYm9yZGVyLCBhbmQgRnJlZVR5cGUgZnVuY3Rpb25zICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBub3JtYWxseSBhbGlnbiB0byB0aGUgc21hbGxlc3QgcG9zc2libGUgaW50ZWdlciAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBGb3IgdGhlIEIvVyByYXN0ZXJpemVyLCBgcGl0Y2gnIGlzIGFsd2F5cyBhbiBldmVuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBUbyBjaGFuZ2UgdGhlIHBpdGNoIG9mIGEgYml0bWFwIChzYXksIHRvIG1ha2UgaXQgYSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgb2YgNCksIHVzZSBARlRfQml0bWFwX0NvbnZlcnQuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIEFsdGVybmF0aXZlbHksIHlvdSBtaWdodCB1c2UgY2FsbGJhY2sgZnVuY3Rpb25zIHRvICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBkaXJlY3RseSByZW5kZXIgdG8gdGhlIGFwcGxpY2F0aW9uJ3Mgc3VyZmFjZTsgc2VlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGUgYGV4YW1wbGUyLmNwcCcgaW4gdGhlIHR1dG9yaWFsIGZvciBhICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGRlbW9uc3RyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBidWZmZXIgICAgICAgOjogQSB0eXBlbGVzcyBwb2ludGVyIHRvIHRoZSBiaXRtYXAgYnVmZmVyLiAgVGhpcyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHZhbHVlIHNob3VsZCBiZSBhbGlnbmVkIG9uIDMyLWJpdCBib3VuZGFyaWVzIGluICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBtb3N0IGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2dyYXlzICAgIDo6IFRoaXMgZmllbGQgaXMgb25seSB1c2VkIHdpdGggICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBARlRfUElYRUxfTU9ERV9HUkFZOyBpdCBnaXZlcyB0aGUgbnVtYmVyIG9mIGdyYXkgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgbGV2ZWxzIHVzZWQgaW4gdGhlIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBpeGVsX21vZGUgICA6OiBUaGUgcGl4ZWwgbW9kZSwgaS5lLiwgaG93IHBpeGVsIGJpdHMgYXJlIHN0b3JlZC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgU2VlIEBGVF9QaXhlbF9Nb2RlIGZvciBwb3NzaWJsZSB2YWx1ZXMuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhbGV0dGVfbW9kZSA6OiBUaGlzIGZpZWxkIGlzIGludGVuZGVkIGZvciBwYWxldHRlZCBwaXhlbCBtb2RlczsgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgaXQgaW5kaWNhdGVzIGhvdyB0aGUgcGFsZXR0ZSBpcyBzdG9yZWQuICBOb3QgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHVzZWQgY3VycmVudGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwYWxldHRlICAgICAgOjogQSB0eXBlbGVzcyBwb2ludGVyIHRvIHRoZSBiaXRtYXAgcGFsZXR0ZTsgdGhpcyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGZpZWxkIGlzIGludGVuZGVkIGZvciBwYWxldHRlZCBwaXhlbCBtb2Rlcy4gIE5vdCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICB1c2VkIGN1cnJlbnRseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0JpdG1hcF8KLSAgewotICAgIHVuc2lnbmVkIGludCAgICByb3dzOwotICAgIHVuc2lnbmVkIGludCAgICB3aWR0aDsKLSAgICBpbnQgICAgICAgICAgICAgcGl0Y2g7Ci0gICAgdW5zaWduZWQgY2hhciogIGJ1ZmZlcjsKLSAgICB1bnNpZ25lZCBzaG9ydCAgbnVtX2dyYXlzOwotICAgIHVuc2lnbmVkIGNoYXIgICBwaXhlbF9tb2RlOwotICAgIHVuc2lnbmVkIGNoYXIgICBwYWxldHRlX21vZGU7Ci0gICAgdm9pZCogICAgICAgICAgIHBhbGV0dGU7Ci0KLSAgfSBGVF9CaXRtYXA7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lX3Byb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZXNjcmliZSBhbiBvdXRsaW5lIHRvIHRoZSBzY2FuLWxpbmUgICAgICovCi0gIC8qICAgIGNvbnZlcnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5fY29udG91cnMgOjogVGhlIG51bWJlciBvZiBjb250b3VycyBpbiB0aGUgb3V0bGluZS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbl9wb2ludHMgICA6OiBUaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgb3V0bGluZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb2ludHMgICAgIDo6IEEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBgbl9wb2ludHMnIEBGVF9WZWN0b3IgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBlbGVtZW50cywgZ2l2aW5nIHRoZSBvdXRsaW5lJ3MgcG9pbnQgY29vcmRpbmF0ZXMuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWdzICAgICAgIDo6IEEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBgbl9wb2ludHMnIGNoYXJzLCBnaXZpbmcgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBlYWNoIG91dGxpbmUgcG9pbnQncyB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIElmIGJpdH4wIGlzIHVuc2V0LCB0aGUgcG9pbnQgaXMgYG9mZicgdGhlIGN1cnZlLCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBpLmUuLCBhIELDqXppZXIgY29udHJvbCBwb2ludCwgd2hpbGUgaXQgaXMgYG9uJyBpZiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgQml0fjEgaXMgbWVhbmluZ2Z1bCBmb3IgYG9mZicgcG9pbnRzIG9ubHkuICBJZiBzZXQsICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGl0IGluZGljYXRlcyBhIHRoaXJkLW9yZGVyIELDqXppZXIgYXJjIGNvbnRyb2wgcG9pbnQ7ICovCi0gIC8qICAgICAgICAgICAgICAgICAgYW5kIGEgc2Vjb25kLW9yZGVyIGNvbnRyb2wgcG9pbnQgaWYgdW5zZXQuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBJZiBiaXR+MiBpcyBzZXQsIGJpdHMgNS03IGNvbnRhaW4gdGhlIGRyb3Atb3V0IG1vZGUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgKGFzIGRlZmluZWQgaW4gdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb247IHRoZSB2YWx1ZSAqLwotICAvKiAgICAgICAgICAgICAgICAgIGlzIHRoZSBzYW1lIGFzIHRoZSBhcmd1bWVudCB0byB0aGUgU0NBTk1PREUgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEJpdHMgMyBhbmR+NCBhcmUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHB1cnBvc2VzLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbnRvdXJzICAgOjogQW4gYXJyYXkgb2YgYG5fY29udG91cnMnIHNob3J0cywgZ2l2aW5nIHRoZSBlbmQgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHBvaW50IG9mIGVhY2ggY29udG91ciB3aXRoaW4gdGhlIG91dGxpbmUuICBGb3IgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBleGFtcGxlLCB0aGUgZmlyc3QgY29udG91ciBpcyBkZWZpbmVkIGJ5IHRoZSBwb2ludHMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgYDAnIHRvIGBjb250b3Vyc1swXScsIHRoZSBzZWNvbmQgb25lIGlzIGRlZmluZWQgYnkgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHRoZSBwb2ludHMgYGNvbnRvdXJzWzBdKzEnIHRvIGBjb250b3Vyc1sxXScsIGV0Yy4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZsYWdzICAgICAgOjogQSBzZXQgb2YgYml0IGZsYWdzIHVzZWQgdG8gY2hhcmFjdGVyaXplIHRoZSBvdXRsaW5lICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGFuZCBnaXZlIGhpbnRzIHRvIHRoZSBzY2FuLWNvbnZlcnRlciBhbmQgaGludGVyIG9uICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBob3cgdG8gY29udmVydC9ncmlkLWZpdCBpdC4gIFNlZSBARlRfT1VUTElORV9YWFguICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIEIvVyByYXN0ZXJpemVyIG9ubHkgY2hlY2tzIGJpdH4yIGluIHRoZSBgdGFncycgYXJyYXkgZm9yIHRoZSAgICovCi0gIC8qICAgIGZpcnN0IHBvaW50IG9mIGVhY2ggY29udG91ci4gIFRoZSBkcm9wLW91dCBtb2RlIGFzIGdpdmVuIHdpdGggICAgICAqLwotICAvKiAgICBARlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMsIEBGVF9PVVRMSU5FX1NNQVJUX0RST1BPVVRTLCBhbmQgICAgICAgKi8KLSAgLyogICAgQEZUX09VVExJTkVfSU5DTFVERV9TVFVCUyBpbiBgZmxhZ3MnIGlzIHRoZW4gb3ZlcnJpZGRlbi4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfT3V0bGluZV8KLSAgewotICAgIHNob3J0ICAgICAgIG5fY29udG91cnM7ICAgICAgLyogbnVtYmVyIG9mIGNvbnRvdXJzIGluIGdseXBoICAgICAgICAqLwotICAgIHNob3J0ICAgICAgIG5fcG9pbnRzOyAgICAgICAgLyogbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgZ2x5cGggICAgICAqLwotCi0gICAgRlRfVmVjdG9yKiAgcG9pbnRzOyAgICAgICAgICAvKiB0aGUgb3V0bGluZSdzIHBvaW50cyAgICAgICAgICAgICAgICovCi0gICAgY2hhciogICAgICAgdGFnczsgICAgICAgICAgICAvKiB0aGUgcG9pbnRzIGZsYWdzICAgICAgICAgICAgICAgICAgICovCi0gICAgc2hvcnQqICAgICAgY29udG91cnM7ICAgICAgICAvKiB0aGUgY29udG91ciBlbmQgcG9pbnRzICAgICAgICAgICAgICovCi0KLSAgICBpbnQgICAgICAgICBmbGFnczsgICAgICAgICAgIC8qIG91dGxpbmUgbWFza3MgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICB9IEZUX091dGxpbmU7Ci0KLSAgLyogKi8KLQotICAvKiBGb2xsb3dpbmcgbGltaXRzIG11c3QgYmUgY29uc2lzdGVudCB3aXRoICovCi0gIC8qIEZUX091dGxpbmUue25fY29udG91cnMsbl9wb2ludHN9ICAgICAgICAgKi8KLSNkZWZpbmUgRlRfT1VUTElORV9DT05UT1VSU19NQVggIFNIUlRfTUFYCi0jZGVmaW5lIEZUX09VVExJTkVfUE9JTlRTX01BWCAgICBTSFJUX01BWAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1VUTElORV9YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBsaXN0IG9mIGJpdC1maWVsZCBjb25zdGFudHMgdXNlIGZvciB0aGUgZmxhZ3MgaW4gYW4gb3V0bGluZSdzICAgICovCi0gIC8qICAgIGBmbGFncycgZmllbGQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09VVExJTkVfTk9ORSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFZhbHVlfjAgaXMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09VVExJTkVfT1dORVIgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIElmIHNldCwgdGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBvdXRsaW5lJ3MgZmllbGQgYXJyYXlzICAgICAgKi8KLSAgLyogICAgICAoaS5lLiwgYHBvaW50cycsIGBmbGFncycsIGFuZCBgY29udG91cnMnKSBhcmUgYG93bmVkJyBieSB0aGUgICAgICovCi0gIC8qICAgICAgb3V0bGluZSBvYmplY3QsIGFuZCBzaG91bGQgdGh1cyBiZSBmcmVlZCB3aGVuIGl0IGlzIGRlc3Ryb3llZC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1VUTElORV9FVkVOX09ERF9GSUxMIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQnkgZGVmYXVsdCwgb3V0bGluZXMgYXJlIGZpbGxlZCB1c2luZyB0aGUgbm9uLXplcm8gd2luZGluZyBydWxlLiAqLwotICAvKiAgICAgIElmIHNldCB0byAxLCB0aGUgb3V0bGluZSB3aWxsIGJlIGZpbGxlZCB1c2luZyB0aGUgZXZlbi1vZGQgZmlsbCAgKi8KLSAgLyogICAgICBydWxlIChvbmx5IHdvcmtzIHdpdGggdGhlIHNtb290aCByYXN0ZXJpemVyKS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PVVRMSU5FX1JFVkVSU0VfRklMTCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBCeSBkZWZhdWx0LCBvdXRzaWRlIGNvbnRvdXJzIG9mIGFuIG91dGxpbmUgYXJlIG9yaWVudGVkIGluICAgICAgICovCi0gIC8qICAgICAgY2xvY2std2lzZSBkaXJlY3Rpb24sIGFzIGRlZmluZWQgaW4gdGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24uICAqLwotICAvKiAgICAgIFRoaXMgZmxhZyBpcyBzZXQgaWYgdGhlIG91dGxpbmUgdXNlcyB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uICAgICAgKi8KLSAgLyogICAgICAodHlwaWNhbGx5IGZvciBUeXBlfjEgZm9udHMpLiAgVGhpcyBmbGFnIGlzIGlnbm9yZWQgYnkgdGhlIHNjYW4gICovCi0gIC8qICAgICAgY29udmVydGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQnkgZGVmYXVsdCwgdGhlIHNjYW4gY29udmVydGVyIHdpbGwgdHJ5IHRvIGRldGVjdCBkcm9wLW91dHMgaW4gICAqLwotICAvKiAgICAgIGFuIG91dGxpbmUgYW5kIGNvcnJlY3QgdGhlIGdseXBoIGJpdG1hcCB0byBlbnN1cmUgY29uc2lzdGVudCAgICAgKi8KLSAgLyogICAgICBzaGFwZSBjb250aW51aXR5LiAgSWYgc2V0LCB0aGlzIGZsYWcgaGludHMgdGhlIHNjYW4tbGluZSAgICAgICAgICovCi0gIC8qICAgICAgY29udmVydGVyIHRvIGlnbm9yZSBzdWNoIGNhc2VzLiAgU2VlIGJlbG93IGZvciBtb3JlIGluZm9ybWF0aW9uLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT1VUTElORV9TTUFSVF9EUk9QT1VUUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgU2VsZWN0IHNtYXJ0IGRyb3BvdXQgY29udHJvbC4gIElmIHVuc2V0LCB1c2Ugc2ltcGxlIGRyb3BvdXQgICAgICAqLwotICAvKiAgICAgIGNvbnRyb2wuICBJZ25vcmVkIGlmIEBGVF9PVVRMSU5FX0lHTk9SRV9EUk9QT1VUUyBpcyBzZXQuICBTZWUgICAgKi8KLSAgLyogICAgICBiZWxvdyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PVVRMSU5FX0lOQ0xVREVfU1RVQlMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBJZiBzZXQsIHR1cm4gcGl4ZWxzIG9uIGZvciBgc3R1YnMnLCBvdGhlcndpc2UgZXhjbHVkZSB0aGVtLiAgICAgICovCi0gIC8qICAgICAgSWdub3JlZCBpZiBARlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMgaXMgc2V0LiAgU2VlIGJlbG93IGZvciAgICAqLwotICAvKiAgICAgIG1vcmUgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09VVExJTkVfSElHSF9QUkVDSVNJT04gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgc2Nhbi1saW5lIGNvbnZlcnRlciBzaG91bGQgdHJ5IHRvICAgKi8KLSAgLyogICAgICBjb252ZXJ0IHRoaXMgb3V0bGluZSB0byBiaXRtYXBzIHdpdGggdGhlIGhpZ2hlc3QgcG9zc2libGUgICAgICAgICovCi0gIC8qICAgICAgcXVhbGl0eS4gIEl0IGlzIHR5cGljYWxseSBzZXQgZm9yIHNtYWxsIGNoYXJhY3RlciBzaXplcy4gIE5vdGUgICAqLwotICAvKiAgICAgIHRoYXQgdGhpcyBpcyBvbmx5IGEgaGludCB0aGF0IG1pZ2h0IGJlIGNvbXBsZXRlbHkgaWdub3JlZCBieSBhICAgKi8KLSAgLyogICAgICBnaXZlbiBzY2FuLWNvbnZlcnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PVVRMSU5FX1NJTkdMRV9QQVNTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGlzIGZsYWcgaXMgc2V0IHRvIGZvcmNlIGEgZ2l2ZW4gc2Nhbi1jb252ZXJ0ZXIgdG8gb25seSB1c2UgYSAgICovCi0gIC8qICAgICAgc2luZ2xlIHBhc3Mgb3ZlciB0aGUgb3V0bGluZSB0byByZW5kZXIgYSBiaXRtYXAgZ2x5cGggaW1hZ2UuICAgICAqLwotICAvKiAgICAgIE5vcm1hbGx5LCBpdCBpcyBzZXQgZm9yIHZlcnkgbGFyZ2UgY2hhcmFjdGVyIHNpemVzLiAgSXQgaXMgb25seSAgKi8KLSAgLyogICAgICBhIGhpbnQgdGhhdCBtaWdodCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQgYnkgYSBnaXZlbiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgc2Nhbi1jb252ZXJ0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmbGFncyBARlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMsIEBGVF9PVVRMSU5FX1NNQVJUX0RST1BPVVRTLCAqLwotICAvKiAgICBhbmQgQEZUX09VVExJTkVfSU5DTFVERV9TVFVCUyBhcmUgaWdub3JlZCBieSB0aGUgc21vb3RoICAgICAgICAgICAgKi8KLSAgLyogICAgcmFzdGVyaXplci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGVyZSBleGlzdHMgYSBzZWNvbmQgbWVjaGFuaXNtIHRvIHBhc3MgdGhlIGRyb3Atb3V0IG1vZGUgdG8gdGhlICAgKi8KLSAgLyogICAgQi9XIHJhc3Rlcml6ZXI7IHNlZSB0aGUgYHRhZ3MnIGZpZWxkIGluIEBGVF9PdXRsaW5lLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQbGVhc2UgcmVmZXIgdG8gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBgU0NBTlRZUEUnIGluc3RydWN0aW9uIGluICAgKi8KLSAgLyogICAgdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24gKGluIGZpbGUgYHR0aW5zdDEuZG9jJykgaG93IHNpbXBsZSAgICAgICovCi0gIC8qICAgIGRyb3Atb3V0cywgc21hcnQgZHJvcC1vdXRzLCBhbmQgc3R1YnMgYXJlIGRlZmluZWQuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfT1VUTElORV9OT05FICAgICAgICAgICAgIDB4MAotI2RlZmluZSBGVF9PVVRMSU5FX09XTkVSICAgICAgICAgICAgMHgxCi0jZGVmaW5lIEZUX09VVExJTkVfRVZFTl9PRERfRklMTCAgICAweDIKLSNkZWZpbmUgRlRfT1VUTElORV9SRVZFUlNFX0ZJTEwgICAgIDB4NAotI2RlZmluZSBGVF9PVVRMSU5FX0lHTk9SRV9EUk9QT1VUUyAgMHg4Ci0jZGVmaW5lIEZUX09VVExJTkVfU01BUlRfRFJPUE9VVFMgICAweDEwCi0jZGVmaW5lIEZUX09VVExJTkVfSU5DTFVERV9TVFVCUyAgICAweDIwCi0KLSNkZWZpbmUgRlRfT1VUTElORV9ISUdIX1BSRUNJU0lPTiAgIDB4MTAwCi0jZGVmaW5lIEZUX09VVExJTkVfU0lOR0xFX1BBU1MgICAgICAweDIwMAotCi0KLSAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgKi8KLSAgLyogYEZUX09VVExJTkVfWFhYJyB2YWx1ZXMgaW5zdGVhZCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgZnRfb3V0bGluZV9ub25lICAgICAgICAgICAgIEZUX09VVExJTkVfTk9ORQotI2RlZmluZSBmdF9vdXRsaW5lX293bmVyICAgICAgICAgICAgRlRfT1VUTElORV9PV05FUgotI2RlZmluZSBmdF9vdXRsaW5lX2V2ZW5fb2RkX2ZpbGwgICAgRlRfT1VUTElORV9FVkVOX09ERF9GSUxMCi0jZGVmaW5lIGZ0X291dGxpbmVfcmV2ZXJzZV9maWxsICAgICBGVF9PVVRMSU5FX1JFVkVSU0VfRklMTAotI2RlZmluZSBmdF9vdXRsaW5lX2lnbm9yZV9kcm9wb3V0cyAgRlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMKLSNkZWZpbmUgZnRfb3V0bGluZV9oaWdoX3ByZWNpc2lvbiAgIEZUX09VVExJTkVfSElHSF9QUkVDSVNJT04KLSNkZWZpbmUgZnRfb3V0bGluZV9zaW5nbGVfcGFzcyAgICAgIEZUX09VVExJTkVfU0lOR0xFX1BBU1MKLQotICAvKiAqLwotCi0jZGVmaW5lIEZUX0NVUlZFX1RBRyggZmxhZyApICAoIGZsYWcgJiAzICkKLQotI2RlZmluZSBGVF9DVVJWRV9UQUdfT04gICAgICAgICAgICAxCi0jZGVmaW5lIEZUX0NVUlZFX1RBR19DT05JQyAgICAgICAgIDAKLSNkZWZpbmUgRlRfQ1VSVkVfVEFHX0NVQklDICAgICAgICAgMgotCi0jZGVmaW5lIEZUX0NVUlZFX1RBR19IQVNfU0NBTk1PREUgIDQKLQotI2RlZmluZSBGVF9DVVJWRV9UQUdfVE9VQ0hfWCAgICAgICA4ICAvKiByZXNlcnZlZCBmb3IgdGhlIFRydWVUeXBlIGhpbnRlciAqLwotI2RlZmluZSBGVF9DVVJWRV9UQUdfVE9VQ0hfWSAgICAgIDE2ICAvKiByZXNlcnZlZCBmb3IgdGhlIFRydWVUeXBlIGhpbnRlciAqLwotCi0jZGVmaW5lIEZUX0NVUlZFX1RBR19UT1VDSF9CT1RIICAgICggRlRfQ1VSVkVfVEFHX1RPVUNIX1ggfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQ1VSVkVfVEFHX1RPVUNIX1kgKQotCi0jZGVmaW5lIEZUX0N1cnZlX1RhZ19PbiAgICAgICBGVF9DVVJWRV9UQUdfT04KLSNkZWZpbmUgRlRfQ3VydmVfVGFnX0NvbmljICAgIEZUX0NVUlZFX1RBR19DT05JQwotI2RlZmluZSBGVF9DdXJ2ZV9UYWdfQ3ViaWMgICAgRlRfQ1VSVkVfVEFHX0NVQklDCi0jZGVmaW5lIEZUX0N1cnZlX1RhZ19Ub3VjaF9YICBGVF9DVVJWRV9UQUdfVE9VQ0hfWAotI2RlZmluZSBGVF9DdXJ2ZV9UYWdfVG91Y2hfWSAgRlRfQ1VSVkVfVEFHX1RPVUNIX1kKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfTW92ZVRvRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gcG9pbnRlciB0eXBlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNpZ25hdHVyZSBvZiBhIGBtb3ZlICAqLwotICAvKiAgICB0bycgZnVuY3Rpb24gZHVyaW5nIG91dGxpbmUgd2Fsa2luZy9kZWNvbXBvc2l0aW9uLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgYG1vdmUgdG8nIGlzIGVtaXR0ZWQgdG8gc3RhcnQgYSBuZXcgY29udG91ciBpbiBhbiBvdXRsaW5lLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRvICAgOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgcG9pbnQgb2YgdGhlIGBtb3ZlIHRvJy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdXNlciA6OiBBIHR5cGVsZXNzIHBvaW50ZXIsIHdoaWNoIGlzIHBhc3NlZCBmcm9tIHRoZSBjYWxsZXIgb2YgdGhlICovCi0gIC8qICAgICAgICAgICAgZGVjb21wb3NpdGlvbiBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBpbnQKLSAgKCpGVF9PdXRsaW5lX01vdmVUb0Z1bmMpKCBjb25zdCBGVF9WZWN0b3IqICB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICB1c2VyICk7Ci0KLSNkZWZpbmUgRlRfT3V0bGluZV9Nb3ZlVG9fRnVuYyAgRlRfT3V0bGluZV9Nb3ZlVG9GdW5jCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0xpbmVUb0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzaWduYXR1cmUgb2YgYSBgbGluZSAgKi8KLSAgLyogICAgdG8nIGZ1bmN0aW9uIGR1cmluZyBvdXRsaW5lIHdhbGtpbmcvZGVjb21wb3NpdGlvbi4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGBsaW5lIHRvJyBpcyBlbWl0dGVkIHRvIGluZGljYXRlIGEgc2VnbWVudCBpbiB0aGUgb3V0bGluZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0byAgIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IHBvaW50IG9mIHRoZSBgbGluZSB0bycuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgOjogQSB0eXBlbGVzcyBwb2ludGVyLCB3aGljaCBpcyBwYXNzZWQgZnJvbSB0aGUgY2FsbGVyIG9mIHRoZSAqLwotICAvKiAgICAgICAgICAgIGRlY29tcG9zaXRpb24gZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgaW50Ci0gICgqRlRfT3V0bGluZV9MaW5lVG9GdW5jKSggY29uc3QgRlRfVmVjdG9yKiAgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgdXNlciApOwotCi0jZGVmaW5lIEZUX091dGxpbmVfTGluZVRvX0Z1bmMgIEZUX091dGxpbmVfTGluZVRvRnVuYwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9Db25pY1RvRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmdW5jdGlvbiBwb2ludGVyIHR5cGUgdXNlZCB0byBkZXNjcmliZSB0aGUgc2lnbmF0dXJlIG9mIGEgYGNvbmljICovCi0gIC8qICAgIHRvJyBmdW5jdGlvbiBkdXJpbmcgb3V0bGluZSB3YWxraW5nIG9yIGRlY29tcG9zaXRpb24uICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBgY29uaWMgdG8nIGlzIGVtaXR0ZWQgdG8gaW5kaWNhdGUgYSBzZWNvbmQtb3JkZXIgQsOpemllciBhcmMgaW4gICAqLwotICAvKiAgICB0aGUgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb250cm9sIDo6IEFuIGludGVybWVkaWF0ZSBjb250cm9sIHBvaW50IGJldHdlZW4gdGhlIGxhc3QgcG9zaXRpb24gKi8KLSAgLyogICAgICAgICAgICAgICBhbmQgdGhlIG5ldyB0YXJnZXQgaW4gYHRvJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0byAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IGVuZCBwb2ludCBvZiB0aGUgY29uaWMgYXJjLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgICAgOjogQSB0eXBlbGVzcyBwb2ludGVyLCB3aGljaCBpcyBwYXNzZWQgZnJvbSB0aGUgY2FsbGVyIG9mICAqLwotICAvKiAgICAgICAgICAgICAgIHRoZSBkZWNvbXBvc2l0aW9uIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgaW50Ci0gICgqRlRfT3V0bGluZV9Db25pY1RvRnVuYykoIGNvbnN0IEZUX1ZlY3RvciogIGNvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICB1c2VyICk7Ci0KLSNkZWZpbmUgRlRfT3V0bGluZV9Db25pY1RvX0Z1bmMgIEZUX091dGxpbmVfQ29uaWNUb0Z1bmMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfQ3ViaWNUb0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gcG9pbnRlciB0eXBlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHNpZ25hdHVyZSBvZiBhIGBjdWJpYyAqLwotICAvKiAgICB0bycgZnVuY3Rpb24gZHVyaW5nIG91dGxpbmUgd2Fsa2luZyBvciBkZWNvbXBvc2l0aW9uLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgYGN1YmljIHRvJyBpcyBlbWl0dGVkIHRvIGluZGljYXRlIGEgdGhpcmQtb3JkZXIgQsOpemllciBhcmMuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb250cm9sMSA6OiBBIHBvaW50ZXIgdG8gdGhlIGZpcnN0IELDqXppZXIgY29udHJvbCBwb2ludC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb250cm9sMiA6OiBBIHBvaW50ZXIgdG8gdGhlIHNlY29uZCBCw6l6aWVyIGNvbnRyb2wgcG9pbnQuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0byAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBlbmQgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgICAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciwgd2hpY2ggaXMgcGFzc2VkIGZyb20gdGhlIGNhbGxlciBvZiAqLwotICAvKiAgICAgICAgICAgICAgICB0aGUgZGVjb21wb3NpdGlvbiBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgaW50Ci0gICgqRlRfT3V0bGluZV9DdWJpY1RvRnVuYykoIGNvbnN0IEZUX1ZlY3RvciogIGNvbnRyb2wxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBjb250cm9sMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgIHVzZXIgKTsKLQotI2RlZmluZSBGVF9PdXRsaW5lX0N1YmljVG9fRnVuYyAgRlRfT3V0bGluZV9DdWJpY1RvRnVuYwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9GdW5jcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdG8gaG9sZCB2YXJpb3VzIGZ1bmN0aW9uIHBvaW50ZXJzIHVzZWQgZHVyaW5nIG91dGxpbmUgICovCi0gIC8qICAgIGRlY29tcG9zaXRpb24gaW4gb3JkZXIgdG8gZW1pdCBzZWdtZW50cywgY29uaWMsIGFuZCBjdWJpYyBCw6l6aWVycy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb3ZlX3RvICA6OiBUaGUgYG1vdmUgdG8nIGVtaXR0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpbmVfdG8gIDo6IFRoZSBzZWdtZW50IGVtaXR0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29uaWNfdG8gOjogVGhlIHNlY29uZC1vcmRlciBCw6l6aWVyIGFyYyBlbWl0dGVyLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY3ViaWNfdG8gOjogVGhlIHRoaXJkLW9yZGVyIELDqXppZXIgYXJjIGVtaXR0ZXIuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2hpZnQgICAgOjogVGhlIHNoaWZ0IHRoYXQgaXMgYXBwbGllZCB0byBjb29yZGluYXRlcyBiZWZvcmUgdGhleSAgICovCi0gIC8qICAgICAgICAgICAgICAgIGFyZSBzZW50IHRvIHRoZSBlbWl0dGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVsdGEgICAgOjogVGhlIGRlbHRhIHRoYXQgaXMgYXBwbGllZCB0byBjb29yZGluYXRlcyBiZWZvcmUgdGhleSAgICovCi0gIC8qICAgICAgICAgICAgICAgIGFyZSBzZW50IHRvIHRoZSBlbWl0dGVyLCBidXQgYWZ0ZXIgdGhlIHNoaWZ0LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBwb2ludCBjb29yZGluYXRlcyBzZW50IHRvIHRoZSBlbWl0dGVycyBhcmUgdGhlIHRyYW5zZm9ybWVkICAgICAqLwotICAvKiAgICB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbCBjb29yZGluYXRlcyAodGhpcyBpcyBpbXBvcnRhbnQgZm9yIGhpZ2ggICAgKi8KLSAgLyogICAgYWNjdXJhY3kgZHVyaW5nIHNjYW4tY29udmVyc2lvbikuICBUaGUgdHJhbnNmb3JtYXRpb24gaXMgc2ltcGxlOiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB4JyA9ICh4IDw8IHNoaWZ0KSAtIGRlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgeScgPSAoeCA8PCBzaGlmdCkgLSBkZWx0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNldCB0aGUgdmFsdWVzIG9mIGBzaGlmdCcgYW5kIGBkZWx0YScgdG9+MCB0byBnZXQgdGhlIG9yaWdpbmFsICAgICAqLwotICAvKiAgICBwb2ludCBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9PdXRsaW5lX0Z1bmNzXwotICB7Ci0gICAgRlRfT3V0bGluZV9Nb3ZlVG9GdW5jICAgbW92ZV90bzsKLSAgICBGVF9PdXRsaW5lX0xpbmVUb0Z1bmMgICBsaW5lX3RvOwotICAgIEZUX091dGxpbmVfQ29uaWNUb0Z1bmMgIGNvbmljX3RvOwotICAgIEZUX091dGxpbmVfQ3ViaWNUb0Z1bmMgIGN1YmljX3RvOwotCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgc2hpZnQ7Ci0gICAgRlRfUG9zICAgICAgICAgICAgICAgICAgZGVsdGE7Ci0KLSAgfSBGVF9PdXRsaW5lX0Z1bmNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzaWNfdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0lNQUdFX1RBRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgbWFjcm8gY29udmVydHMgZm91ci1sZXR0ZXIgdGFncyB0byBhbiB1bnNpZ25lZCBsb25nIHR5cGUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNpbmNlIG1hbnkgMTYtYml0IGNvbXBpbGVycyBkb24ndCBsaWtlIDMyLWJpdCBlbnVtZXJhdGlvbnMsIHlvdSAgICAqLwotICAvKiAgICBzaG91bGQgcmVkZWZpbmUgdGhpcyBtYWNybyBpbiBjYXNlIG9mIHByb2JsZW1zIHRvIHNvbWV0aGluZyBsaWtlICAgKi8KLSAgLyogICAgdGhpczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAjZGVmaW5lIEZUX0lNQUdFX1RBRyggdmFsdWUsIF94MSwgX3gyLCBfeDMsIF94NCApICB2YWx1ZSAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG8gZ2V0IGEgc2ltcGxlIGVudW1lcmF0aW9uIHdpdGhvdXQgYXNzaWduaW5nIHNwZWNpYWwgbnVtYmVycy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9JTUFHRV9UQUcKLSNkZWZpbmUgRlRfSU1BR0VfVEFHKCB2YWx1ZSwgX3gxLCBfeDIsIF94MywgX3g0ICkgIFwKLSAgICAgICAgICB2YWx1ZSA9ICggKCAodW5zaWduZWQgbG9uZylfeDEgPDwgMjQgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZylfeDIgPDwgMTYgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgKCAodW5zaWduZWQgbG9uZylfeDMgPDwgOCAgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylfeDQgICAgICAgICApCi0jZW5kaWYgLyogRlRfSU1BR0VfVEFHICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaF9Gb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlbnVtZXJhdGlvbiB0eXBlIHVzZWQgdG8gZGVzY3JpYmUgdGhlIGZvcm1hdCBvZiBhIGdpdmVuIGdseXBoICAgKi8KLSAgLyogICAgaW1hZ2UuICBOb3RlIHRoYXQgdGhpcyB2ZXJzaW9uIG9mIEZyZWVUeXBlIG9ubHkgc3VwcG9ydHMgdHdvIGltYWdlICovCi0gIC8qICAgIGZvcm1hdHMsIGV2ZW4gdGhvdWdoIGZ1dHVyZSBmb250IGRyaXZlcnMgd2lsbCBiZSBhYmxlIHRvIHJlZ2lzdGVyICAqLwotICAvKiAgICB0aGVpciBvd24gZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HTFlQSF9GT1JNQVRfTk9ORSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgdmFsdWV+MCBpcyByZXNlcnZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HTFlQSF9GT1JNQVRfQ09NUE9TSVRFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZ2x5cGggaW1hZ2UgaXMgYSBjb21wb3NpdGUgb2Ygc2V2ZXJhbCBvdGhlciBpbWFnZXMuICBUaGlzICAgICovCi0gIC8qICAgICAgZm9ybWF0IGlzIF9vbmx5XyB1c2VkIHdpdGggQEZUX0xPQURfTk9fUkVDVVJTRSwgYW5kIGlzIHVzZWQgdG8gICAqLwotICAvKiAgICAgIHJlcG9ydCBjb21wb3VuZCBnbHlwaHMgKGxpa2UgYWNjZW50ZWQgY2hhcmFjdGVycykuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBnbHlwaCBpbWFnZSBpcyBhIGJpdG1hcCwgYW5kIGNhbiBiZSBkZXNjcmliZWQgYXMgYW4gICAgICAgICAgKi8KLSAgLyogICAgICBARlRfQml0bWFwLiAgWW91IGdlbmVyYWxseSBuZWVkIHRvIGFjY2VzcyB0aGUgYGJpdG1hcCcgZmllbGQgb2YgICovCi0gIC8qICAgICAgdGhlIEBGVF9HbHlwaFNsb3RSZWMgc3RydWN0dXJlIHRvIHJlYWQgaXQuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR0xZUEhfRk9STUFUX09VVExJTkUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGdseXBoIGltYWdlIGlzIGEgdmVjdG9yaWFsIG91dGxpbmUgbWFkZSBvZiBsaW5lIHNlZ21lbnRzICAgICAqLwotICAvKiAgICAgIGFuZCBCw6l6aWVyIGFyY3M7IGl0IGNhbiBiZSBkZXNjcmliZWQgYXMgYW4gQEZUX091dGxpbmU7IHlvdSAgICAgICovCi0gIC8qICAgICAgZ2VuZXJhbGx5IHdhbnQgdG8gYWNjZXNzIHRoZSBgb3V0bGluZScgZmllbGQgb2YgdGhlICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEBGVF9HbHlwaFNsb3RSZWMgc3RydWN0dXJlIHRvIHJlYWQgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dMWVBIX0ZPUk1BVF9QTE9UVEVSIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBnbHlwaCBpbWFnZSBpcyBhIHZlY3RvcmlhbCBwYXRoIHdpdGggbm8gaW5zaWRlIGFuZCBvdXRzaWRlICAgKi8KLSAgLyogICAgICBjb250b3Vycy4gIFNvbWUgVHlwZX4xIGZvbnRzLCBsaWtlIHRob3NlIGluIHRoZSBIZXJzaGV5IGZhbWlseSwgICovCi0gIC8qICAgICAgY29udGFpbiBnbHlwaHMgaW4gdGhpcyBmb3JtYXQuICBUaGVzZSBhcmUgZGVzY3JpYmVkIGFzICAgICAgICAgICAqLwotICAvKiAgICAgIEBGVF9PdXRsaW5lLCBidXQgRnJlZVR5cGUgaXNuJ3QgY3VycmVudGx5IGNhcGFibGUgb2YgcmVuZGVyaW5nICAgKi8KLSAgLyogICAgICB0aGVtIGNvcnJlY3RseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGVudW0gIEZUX0dseXBoX0Zvcm1hdF8KLSAgewotICAgIEZUX0lNQUdFX1RBRyggRlRfR0xZUEhfRk9STUFUX05PTkUsIDAsIDAsIDAsIDAgKSwKLQotICAgIEZUX0lNQUdFX1RBRyggRlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURSwgJ2MnLCAnbycsICdtJywgJ3AnICksCi0gICAgRlRfSU1BR0VfVEFHKCBGVF9HTFlQSF9GT1JNQVRfQklUTUFQLCAgICAnYicsICdpJywgJ3QnLCAncycgKSwKLSAgICBGVF9JTUFHRV9UQUcoIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FLCAgICdvJywgJ3UnLCAndCcsICdsJyApLAotICAgIEZUX0lNQUdFX1RBRyggRlRfR0xZUEhfRk9STUFUX1BMT1RURVIsICAgJ3AnLCAnbCcsICdvJywgJ3QnICkKLQotICB9IEZUX0dseXBoX0Zvcm1hdDsKLQotCi0gIC8qIHRoZXNlIGNvbnN0YW50cyBhcmUgZGVwcmVjYXRlZDsgdXNlIHRoZSBjb3JyZXNwb25kaW5nICovCi0gIC8qIGBGVF9HbHlwaF9Gb3JtYXQnIHZhbHVlcyBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIGZ0X2dseXBoX2Zvcm1hdF9ub25lICAgICAgIEZUX0dMWVBIX0ZPUk1BVF9OT05FCi0jZGVmaW5lIGZ0X2dseXBoX2Zvcm1hdF9jb21wb3NpdGUgIEZUX0dMWVBIX0ZPUk1BVF9DT01QT1NJVEUKLSNkZWZpbmUgZnRfZ2x5cGhfZm9ybWF0X2JpdG1hcCAgICAgRlRfR0xZUEhfRk9STUFUX0JJVE1BUAotI2RlZmluZSBmdF9nbHlwaF9mb3JtYXRfb3V0bGluZSAgICBGVF9HTFlQSF9GT1JNQVRfT1VUTElORQotI2RlZmluZSBmdF9nbHlwaF9mb3JtYXRfcGxvdHRlciAgICBGVF9HTFlQSF9GT1JNQVRfUExPVFRFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgIFIgQSBTIFQgRSBSICAgRCBFIEYgSSBOIEkgVCBJIE8gTiBTICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSByYXN0ZXIgaXMgYSBzY2FuIGNvbnZlcnRlciwgaW4gY2hhcmdlIG9mIHJlbmRlcmluZyBhbiBvdXRsaW5lIGludG8gICovCi0gIC8qIGEgYSBiaXRtYXAuICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIHB1YmxpYyBBUEkgZm9yIHJhc3RlcnMuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSB0aGF0IGluIEZyZWVUeXBlIDIsIGFsbCByYXN0ZXJzIGFyZSBub3cgZW5jYXBzdWxhdGVkIHdpdGhpbiAgICAgICovCi0gIC8qIHNwZWNpZmljIG1vZHVsZXMgY2FsbGVkIGByZW5kZXJlcnMnLiAgU2VlIGBmdHJlbmRlci5oJyBmb3IgbW9yZSAgICAgICAqLwotICAvKiBkZXRhaWxzIG9uIHJlbmRlcmVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmFzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2NhbmxpbmUgQ29udmVydGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSG93IHZlY3RvcmlhbCBvdXRsaW5lcyBhcmUgY29udmVydGVkIGludG8gYml0bWFwcyBhbmQgcGl4bWFwcy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRlY2huaWNhbCBkZWZpbml0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NwYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TcGFuRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9QYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SQVNURVJfRkxBR19YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9OZXdGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfRG9uZUZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX1Jlc2V0RnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9TZXRNb2RlRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfUmVuZGVyRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX0Z1bmNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIG9wYXF1ZSBoYW5kbGUgKHBvaW50ZXIpIHRvIGEgcmFzdGVyIG9iamVjdC4gIEVhY2ggb2JqZWN0IGNhbiBiZSAqLwotICAvKiAgICB1c2VkIGluZGVwZW5kZW50bHkgdG8gY29udmVydCBhbiBvdXRsaW5lIGludG8gYSBiaXRtYXAgb3IgcGl4bWFwLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX1Jhc3RlclJlY18qICBGVF9SYXN0ZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TcGFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgc2luZ2xlIHNwYW4gb2YgZ3JheSBwaXhlbHMgd2hlbiAgICAgICAgKi8KLSAgLyogICAgcmVuZGVyaW5nIGFuIGFudGktYWxpYXNlZCBiaXRtYXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeCAgICAgICAgOjogVGhlIHNwYW4ncyBob3Jpem9udGFsIHN0YXJ0IHBvc2l0aW9uLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZW4gICAgICA6OiBUaGUgc3BhbidzIGxlbmd0aCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvdmVyYWdlIDo6IFRoZSBzcGFuIGNvbG9yL2NvdmVyYWdlLCByYW5naW5nIGZyb20gMCAoYmFja2dyb3VuZCkgICAqLwotICAvKiAgICAgICAgICAgICAgICB0byAyNTUgKGZvcmVncm91bmQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IHRoZSBzcGFuIGRyYXdpbmcgY2FsbGJhY2sgdHlwZSBuYW1lZCAgICAgKi8KLSAgLyogICAgQEZUX1NwYW5GdW5jIHRoYXQgdGFrZXMgdGhlIHl+Y29vcmRpbmF0ZSBvZiB0aGUgc3BhbiBhcyBhICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtZXRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGNvdmVyYWdlIHZhbHVlIGlzIGFsd2F5cyBiZXR3ZWVuIDAgYW5kIDI1NS4gIElmIHlvdSB3YW50IGxlc3MgICovCi0gIC8qICAgIGdyYXkgdmFsdWVzLCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gaGFzIHRvIHJlZHVjZSB0aGVtLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1NwYW5fCi0gIHsKLSAgICBzaG9ydCAgICAgICAgICAgeDsKLSAgICB1bnNpZ25lZCBzaG9ydCAgbGVuOwotICAgIHVuc2lnbmVkIGNoYXIgICBjb3ZlcmFnZTsKLQotICB9IEZUX1NwYW47Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TcGFuRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgYXMgYSBjYWxsLWJhY2sgYnkgdGhlIGFudGktYWxpYXNlZCByZW5kZXJlciBpbiAgICAgKi8KLSAgLyogICAgb3JkZXIgdG8gbGV0IGNsaWVudCBhcHBsaWNhdGlvbnMgZHJhdyB0aGVtc2VsdmVzIHRoZSBncmF5IHBpeGVsICAgICovCi0gIC8qICAgIHNwYW5zIG9uIGVhY2ggc2NhbiBsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHkgICAgIDo6IFRoZSBzY2FubGluZSdzIHl+Y29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY291bnQgOjogVGhlIG51bWJlciBvZiBzcGFucyB0byBkcmF3IG9uIHRoaXMgc2NhbmxpbmUuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzcGFucyA6OiBBIHRhYmxlIG9mIGBjb3VudCcgc3BhbnMgdG8gZHJhdyBvbiB0aGUgc2NhbmxpbmUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgIDo6IFVzZXItc3VwcGxpZWQgZGF0YSB0aGF0IGlzIHBhc3NlZCB0byB0aGUgY2FsbGJhY2suICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgY2FsbGJhY2sgYWxsb3dzIGNsaWVudCBhcHBsaWNhdGlvbnMgdG8gZGlyZWN0bHkgcmVuZGVyIHRoZSAgICAqLwotICAvKiAgICBncmF5IHNwYW5zIG9mIHRoZSBhbnRpLWFsaWFzZWQgYml0bWFwIHRvIGFueSBraW5kIG9mIHN1cmZhY2VzLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gd3JpdGUgYW50aS1hbGlhc2VkIG91dGxpbmVzIGRpcmVjdGx5IHRvIGEgICAgICAqLwotICAvKiAgICBnaXZlbiBiYWNrZ3JvdW5kIGJpdG1hcCwgYW5kIGV2ZW4gcGVyZm9ybSB0cmFuc2x1Y2VuY3kuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCB0aGUgYGNvdW50JyBmaWVsZCBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIGEgZml4ZWQgdmFsdWUgICAqLwotICAvKiAgICBkZWZpbmVkIGJ5IHRoZSBgRlRfTUFYX0dSQVlfU1BBTlMnIGNvbmZpZ3VyYXRpb24gbWFjcm8gaW4gICAgICAgICAgKi8KLSAgLyogICAgYGZ0b3B0aW9uLmgnLiAgQnkgZGVmYXVsdCwgdGhpcyB2YWx1ZSBpcyBzZXQgdG9+MzIsIHdoaWNoIG1lYW5zICAgICovCi0gIC8qICAgIHRoYXQgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiAzMn5zcGFucyBvbiBhIGdpdmVuIHNjYW5saW5lLCB0aGUgICAgICAqLwotICAvKiAgICBjYWxsYmFjayBpcyBjYWxsZWQgc2V2ZXJhbCB0aW1lcyB3aXRoIHRoZSBzYW1lIGB5JyBwYXJhbWV0ZXIgaW4gICAgKi8KLSAgLyogICAgb3JkZXIgdG8gZHJhdyBhbGwgY2FsbGJhY2tzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPdGhlcndpc2UsIHRoZSBjYWxsYmFjayBpcyBvbmx5IGNhbGxlZCBvbmNlIHBlciBzY2FuLWxpbmUsIGFuZCAgICAgKi8KLSAgLyogICAgb25seSBmb3IgdGhvc2Ugc2NhbmxpbmVzIHRoYXQgZG8gaGF2ZSBgZ3JheScgcGl4ZWxzIG9uIHRoZW0uICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9TcGFuRnVuYykoIGludCAgICAgICAgICAgICB5LAotICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3BhbiogIHNwYW5zLAotICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgIHVzZXIgKTsKLQotI2RlZmluZSBGVF9SYXN0ZXJfU3Bhbl9GdW5jICBGVF9TcGFuRnVuYwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX0JpdFRlc3RfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVwcmVjYXRlZCwgdW5pbXBsZW1lbnRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGludAotICAoKkZUX1Jhc3Rlcl9CaXRUZXN0X0Z1bmMpKCBpbnQgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICB1c2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfQml0U2V0X0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXByZWNhdGVkLCB1bmltcGxlbWVudGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX1Jhc3Rlcl9CaXRTZXRfRnVuYykoIGludCAgICB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICB1c2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SQVNURVJfRkxBR19YWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGxpc3Qgb2YgYml0IGZsYWcgY29uc3RhbnRzIGFzIHVzZWQgaW4gdGhlIGBmbGFncycgZmllbGQgb2YgYSAgICAgKi8KLSAgLyogICAgQEZUX1Jhc3Rlcl9QYXJhbXMgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUkFTVEVSX0ZMQUdfREVGQVVMVCA6OiBUaGlzIHZhbHVlIGlzIDAuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SQVNURVJfRkxBR19BQSAgICAgIDo6IFRoaXMgZmxhZyBpcyBzZXQgdG8gaW5kaWNhdGUgdGhhdCBhbiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnRpLWFsaWFzZWQgZ2x5cGggaW1hZ2Ugc2hvdWxkIGJlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVkLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIGJlICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbm9jaHJvbWUgKDEtYml0KS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JBU1RFUl9GTEFHX0RJUkVDVCAgOjogVGhpcyBmbGFnIGlzIHNldCB0byBpbmRpY2F0ZSBkaXJlY3QgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZy4gIEluIHRoaXMgbW9kZSwgY2xpZW50ICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbnMgbXVzdCBwcm92aWRlIHRoZWlyIG93biBzcGFuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suICBUaGlzIGxldHMgdGhlbSBkaXJlY3RseSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyYXcgb3IgY29tcG9zZSBvdmVyIGFuIGV4aXN0aW5nIGJpdG1hcC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIGJpdCBpcyBub3Qgc2V0LCB0aGUgdGFyZ2V0ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4bWFwJ3MgYnVmZmVyIF9tdXN0XyBiZSB6ZXJvZWQgYmVmb3JlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0IHJlbmRlcmluZyBpcyBvbmx5IHBvc3NpYmxlIHdpdGggICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFudGktYWxpYXNlZCBnbHlwaHMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JBU1RFUl9GTEFHX0NMSVAgICAgOjogVGhpcyBmbGFnIGlzIG9ubHkgdXNlZCBpbiBkaXJlY3QgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZyBtb2RlLiAgSWYgc2V0LCB0aGUgb3V0cHV0IHdpbGwgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjbGlwcGVkIHRvIGEgYm94IHNwZWNpZmllZCBpbiB0aGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGNsaXBfYm94JyBmaWVsZCBvZiB0aGUgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9SYXN0ZXJfUGFyYW1zIHN0cnVjdHVyZS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGJ5IGRlZmF1bHQsIHRoZSBnbHlwaCBiaXRtYXAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGNsaXBwZWQgdG8gdGhlIHRhcmdldCBwaXhtYXAsIGV4Y2VwdCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBkaXJlY3QgcmVuZGVyaW5nIG1vZGUgd2hlcmUgYWxsIHNwYW5zICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGdlbmVyYXRlZCBpZiBubyBjbGlwcGluZyBib3ggaXMgc2V0LiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfUkFTVEVSX0ZMQUdfREVGQVVMVCAgMHgwCi0jZGVmaW5lIEZUX1JBU1RFUl9GTEFHX0FBICAgICAgIDB4MQotI2RlZmluZSBGVF9SQVNURVJfRkxBR19ESVJFQ1QgICAweDIKLSNkZWZpbmUgRlRfUkFTVEVSX0ZMQUdfQ0xJUCAgICAgMHg0Ci0KLSAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgKi8KLSAgLyogYEZUX1JBU1RFUl9GTEFHX1hYWCcgdmFsdWVzIGluc3RlYWQgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgZnRfcmFzdGVyX2ZsYWdfZGVmYXVsdCAgRlRfUkFTVEVSX0ZMQUdfREVGQVVMVAotI2RlZmluZSBmdF9yYXN0ZXJfZmxhZ19hYSAgICAgICBGVF9SQVNURVJfRkxBR19BQQotI2RlZmluZSBmdF9yYXN0ZXJfZmxhZ19kaXJlY3QgICBGVF9SQVNURVJfRkxBR19ESVJFQ1QKLSNkZWZpbmUgZnRfcmFzdGVyX2ZsYWdfY2xpcCAgICAgRlRfUkFTVEVSX0ZMQUdfQ0xJUAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFzdGVyX1BhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdG8gaG9sZCB0aGUgYXJndW1lbnRzIHVzZWQgYnkgYSByYXN0ZXIncyByZW5kZXIgICAgICAgICovCi0gIC8qICAgIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhcmdldCAgICAgIDo6IFRoZSB0YXJnZXQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc291cmNlICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgZ2x5cGggaW1hZ2UgKGUuZy4sIGFuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIEBGVF9PdXRsaW5lKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmxhZ3MgICAgICAgOjogVGhlIHJlbmRlcmluZyBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBncmF5X3NwYW5zICA6OiBUaGUgZ3JheSBzcGFuIGRyYXdpbmcgY2FsbGJhY2suICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJsYWNrX3NwYW5zIDo6IFVudXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYml0X3Rlc3QgICAgOjogVW51c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaXRfc2V0ICAgICA6OiBVbnVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgICAgICAgIDo6IFVzZXItc3VwcGxpZWQgZGF0YSB0aGF0IGlzIHBhc3NlZCB0byBlYWNoIGRyYXdpbmcgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBjYWxsYmFjay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNsaXBfYm94ICAgIDo6IEFuIG9wdGlvbmFsIGNsaXBwaW5nIGJveC4gIEl0IGlzIG9ubHkgdXNlZCBpbiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBkaXJlY3QgcmVuZGVyaW5nIG1vZGUuICBOb3RlIHRoYXQgY29vcmRpbmF0ZXMgaGVyZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGV4cHJlc3NlZCBpbiBfaW50ZWdlcl8gcGl4ZWxzIChhbmQgbm90IGluICovCi0gIC8qICAgICAgICAgICAgICAgICAgIDI2LjYgZml4ZWQtcG9pbnQgdW5pdHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGFudGktYWxpYXNlZCBnbHlwaCBiaXRtYXAgaXMgZHJhd24gaWYgdGhlIEBGVF9SQVNURVJfRkxBR19BQSAgICAqLwotICAvKiAgICBiaXQgZmxhZyBpcyBzZXQgaW4gdGhlIGBmbGFncycgZmllbGQsIG90aGVyd2lzZSBhIG1vbm9jaHJvbWUgICAgICAgKi8KLSAgLyogICAgYml0bWFwIGlzIGdlbmVyYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJZiB0aGUgQEZUX1JBU1RFUl9GTEFHX0RJUkVDVCBiaXQgZmxhZyBpcyBzZXQgaW4gYGZsYWdzJywgdGhlICAgICAgKi8KLSAgLyogICAgcmFzdGVyIHdpbGwgY2FsbCB0aGUgYGdyYXlfc3BhbnMnIGNhbGxiYWNrIHRvIGRyYXcgZ3JheSBwaXhlbCAgICAgICovCi0gIC8qICAgIHNwYW5zLiAgVGhpcyBhbGxvd3MgZGlyZWN0IGNvbXBvc2l0aW9uIG92ZXIgYSBwcmUtZXhpc3RpbmcgYml0bWFwICAqLwotICAvKiAgICB0aHJvdWdoIHVzZXItcHJvdmlkZWQgY2FsbGJhY2tzIHRvIHBlcmZvcm0gdGhlIHNwYW4gZHJhd2luZyBhbmQgICAgKi8KLSAgLyogICAgY29tcG9zaXRpb24uICAgIE5vdCBzdXBwb3J0ZWQgYnkgdGhlIG1vbm9jaHJvbWUgcmFzdGVyaXplci4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfUmFzdGVyX1BhcmFtc18KLSAgewotICAgIGNvbnN0IEZUX0JpdG1hcCogICAgICAgIHRhcmdldDsKLSAgICBjb25zdCB2b2lkKiAgICAgICAgICAgICBzb3VyY2U7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgZmxhZ3M7Ci0gICAgRlRfU3BhbkZ1bmMgICAgICAgICAgICAgZ3JheV9zcGFuczsKLSAgICBGVF9TcGFuRnVuYyAgICAgICAgICAgICBibGFja19zcGFuczsgIC8qIHVudXNlZCAqLwotICAgIEZUX1Jhc3Rlcl9CaXRUZXN0X0Z1bmMgIGJpdF90ZXN0OyAgICAgLyogdW51c2VkICovCi0gICAgRlRfUmFzdGVyX0JpdFNldF9GdW5jICAgYml0X3NldDsgICAgICAvKiB1bnVzZWQgKi8KLSAgICB2b2lkKiAgICAgICAgICAgICAgICAgICB1c2VyOwotICAgIEZUX0JCb3ggICAgICAgICAgICAgICAgIGNsaXBfYm94OwotCi0gIH0gRlRfUmFzdGVyX1BhcmFtczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9OZXdGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBjcmVhdGUgYSBuZXcgcmFzdGVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSA6OiBBIGhhbmRsZSB0byB0aGUgbWVtb3J5IGFsbG9jYXRvci4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3RlciA6OiBBIGhhbmRsZSB0byB0aGUgbmV3IHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBgbWVtb3J5JyBwYXJhbWV0ZXIgaXMgYSB0eXBlbGVzcyBwb2ludGVyIGluIG9yZGVyIHRvIGF2b2lkICAgICAqLwotICAvKiAgICB1bi13YW50ZWQgZGVwZW5kZW5jaWVzIG9uIHRoZSByZXN0IG9mIHRoZSBGcmVlVHlwZSBjb2RlLiAgSW4gICAgICAgKi8KLSAgLyogICAgcHJhY3RpY2UsIGl0IGlzIGFuIEBGVF9NZW1vcnkgb2JqZWN0LCBpLmUuLCBhIGhhbmRsZSB0byB0aGUgICAgICAgICovCi0gIC8qICAgIHN0YW5kYXJkIEZyZWVUeXBlIG1lbW9yeSBhbGxvY2F0b3IuICBIb3dldmVyLCB0aGlzIGZpZWxkIGNhbiBiZSAgICAqLwotICAvKiAgICBjb21wbGV0ZWx5IGlnbm9yZWQgYnkgYSBnaXZlbiByYXN0ZXIgaW1wbGVtZW50YXRpb24uICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgaW50Ci0gICgqRlRfUmFzdGVyX05ld0Z1bmMpKCB2b2lkKiAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9SYXN0ZXIqICByYXN0ZXIgKTsKLQotI2RlZmluZSBGVF9SYXN0ZXJfTmV3X0Z1bmMgIEZUX1Jhc3Rlcl9OZXdGdW5jCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfRG9uZUZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gZGVzdHJveSBhIGdpdmVuIHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXIgOjogQSBoYW5kbGUgdG8gdGhlIHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX1Jhc3Rlcl9Eb25lRnVuYykoIEZUX1Jhc3RlciAgcmFzdGVyICk7Ci0KLSNkZWZpbmUgRlRfUmFzdGVyX0RvbmVfRnVuYyAgRlRfUmFzdGVyX0RvbmVGdW5jCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfUmVzZXRGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSB1c2VkIHRvIHByb3ZpZGUgYW4gYXJlYSBvZiBtZW1vcnkgY2FsbGVkIHRoZSBgcmVuZGVyICAgICAgKi8KLSAgLyogICAgcG9vbCcgYXZhaWxhYmxlIHRvIGFsbCByZWdpc3RlcmVkIHJhc3RlcnMuICBUaGlzIHdhcyBub3QgdGhyZWFkICAgICovCi0gIC8qICAgIHNhZmUgaG93ZXZlciBhbmQgbm93IEZyZWVUeXBlIG5ldmVyIGFsbG9jYXRlcyB0aGlzIHBvb2wuICBOVUxMICAgICAqLwotICAvKiAgICBpcyBhbHdheXMgcGFzc2VkIGluIGFzIHBvb2xfYmFzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGVhY2ggdGltZSB0aGUgcmVuZGVyIHBvb2wgY2hhbmdlcywgb3IganVzdCAqLwotICAvKiAgICBhZnRlciBhIG5ldyByYXN0ZXIgb2JqZWN0IGlzIGNyZWF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXIgICAgOjogQSBoYW5kbGUgdG8gdGhlIG5ldyByYXN0ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvb2xfYmFzZSA6OiBUaGUgYWRkcmVzcyBpbiBtZW1vcnkgb2YgdGhlIHJlbmRlciBwb29sLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9vbF9zaXplIDo6IFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSByZW5kZXIgcG9vbC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmFzdGVycyBzaG91bGQgaWdub3JlIHRoZSByZW5kZXIgcG9vbCBhbmQgcmVseSBvbiBkeW5hbWljIG9yIHN0YWNrICovCi0gIC8qICAgIGFsbG9jYXRpb24gaWYgdGhleSB3YW50IHRvIChhIGhhbmRsZSB0byB0aGUgbWVtb3J5IGFsbG9jYXRvciBpcyAgICAqLwotICAvKiAgICBwYXNzZWQgdG8gdGhlIHJhc3RlciBjb25zdHJ1Y3RvcikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX1Jhc3Rlcl9SZXNldEZ1bmMpKCBGVF9SYXN0ZXIgICAgICAgcmFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiAgcG9vbF9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgcG9vbF9zaXplICk7Ci0KLSNkZWZpbmUgRlRfUmFzdGVyX1Jlc2V0X0Z1bmMgIEZUX1Jhc3Rlcl9SZXNldEZ1bmMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9TZXRNb2RlRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgYSBnZW5lcmljIGZhY2lsaXR5IHRvIGNoYW5nZSBtb2RlcyBvciBhdHRyaWJ1dGVzICAqLwotICAvKiAgICBpbiBhIGdpdmVuIHJhc3Rlci4gIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgb3IgICAgKi8KLSAgLyogICAgc2ltcGx5IHRvIGFsbG93IGltcGxlbWVudGF0aW9uLXNwZWNpZmljIGBmZWF0dXJlcycgaW4gYSBnaXZlbiAgICAgICovCi0gIC8qICAgIHJhc3RlciBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3RlciA6OiBBIGhhbmRsZSB0byB0aGUgbmV3IHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kZSAgIDo6IEEgNC1ieXRlIHRhZyB1c2VkIHRvIG5hbWUgdGhlIG1vZGUgb3IgcHJvcGVydHkuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhcmdzICAgOjogQSBwb2ludGVyIHRvIHRoZSBuZXcgbW9kZS9wcm9wZXJ0eSB0byB1c2UuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgaW50Ci0gICgqRlRfUmFzdGVyX1NldE1vZGVGdW5jKSggRlRfUmFzdGVyICAgICAgcmFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgYXJncyApOwotCi0jZGVmaW5lIEZUX1Jhc3Rlcl9TZXRfTW9kZV9GdW5jICBGVF9SYXN0ZXJfU2V0TW9kZUZ1bmMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Jhc3Rlcl9SZW5kZXJGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEludm9rZSBhIGdpdmVuIHJhc3RlciB0byBzY2FuLWNvbnZlcnQgYSBnaXZlbiBnbHlwaCBpbWFnZSBpbnRvIGEgICAqLwotICAvKiAgICB0YXJnZXQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXIgOjogQSBoYW5kbGUgdG8gdGhlIHJhc3RlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtcyA6OiBBIHBvaW50ZXIgdG8gYW4gQEZUX1Jhc3Rlcl9QYXJhbXMgc3RydWN0dXJlIHVzZWQgdG8gICAgICAqLwotICAvKiAgICAgICAgICAgICAgc3RvcmUgdGhlIHJlbmRlcmluZyBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZXhhY3QgZm9ybWF0IG9mIHRoZSBzb3VyY2UgaW1hZ2UgZGVwZW5kcyBvbiB0aGUgcmFzdGVyJ3MgZ2x5cGggKi8KLSAgLyogICAgZm9ybWF0IGRlZmluZWQgaW4gaXRzIEBGVF9SYXN0ZXJfRnVuY3Mgc3RydWN0dXJlLiAgSXQgY2FuIGJlIGFuICAgICovCi0gIC8qICAgIEBGVF9PdXRsaW5lIG9yIGFueXRoaW5nIGVsc2UgaW4gb3JkZXIgdG8gc3VwcG9ydCBhIGxhcmdlIGFycmF5IG9mICAqLwotICAvKiAgICBnbHlwaCBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgYWxzbyB0aGF0IHRoZSByZW5kZXIgZnVuY3Rpb24gY2FuIGZhaWwgYW5kIHJldHVybiBhICAgICAgICAgICAqLwotICAvKiAgICBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZScgZXJyb3IgY29kZSBpZiB0aGUgcmFzdGVyIHVzZWQgZG9lcyAgKi8KLSAgLyogICAgbm90IHN1cHBvcnQgZGlyZWN0IGNvbXBvc2l0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBYWFg6IEZvciBub3csIHRoZSBzdGFuZGFyZCByYXN0ZXIgZG9lc24ndCBzdXBwb3J0IGRpcmVjdCAgICAgICAgICAgKi8KLSAgLyogICAgICAgICBjb21wb3NpdGlvbiBidXQgdGhpcyBzaG91bGQgY2hhbmdlIGZvciB0aGUgZmluYWwgcmVsZWFzZSAoc2VlICovCi0gIC8qICAgICAgICAgdGhlIGZpbGVzIGBkZW1vcy9zcmMvZnRncmF5cy5jJyBhbmQgYGRlbW9zL3NyYy9mdGdyYXlzMi5jJyAgICAqLwotICAvKiAgICAgICAgIGZvciBleGFtcGxlcyBvZiBkaXN0aW5jdCBpbXBsZW1lbnRhdGlvbnMgdGhhdCBzdXBwb3J0IGRpcmVjdCAgKi8KLSAgLyogICAgICAgICBjb21wb3NpdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGludAotICAoKkZUX1Jhc3Rlcl9SZW5kZXJGdW5jKSggRlRfUmFzdGVyICAgICAgICAgICAgICAgIHJhc3RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1Jhc3Rlcl9QYXJhbXMqICBwYXJhbXMgKTsKLQotI2RlZmluZSBGVF9SYXN0ZXJfUmVuZGVyX0Z1bmMgIEZUX1Jhc3Rlcl9SZW5kZXJGdW5jCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SYXN0ZXJfRnVuY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIEEgc3RydWN0dXJlIHVzZWQgdG8gZGVzY3JpYmUgYSBnaXZlbiByYXN0ZXIgY2xhc3MgdG8gdGhlIGxpYnJhcnkuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9mb3JtYXQgIDo6IFRoZSBzdXBwb3J0ZWQgZ2x5cGggZm9ybWF0IGZvciB0aGlzIHJhc3Rlci4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3Rlcl9uZXcgICAgOjogVGhlIHJhc3RlciBjb25zdHJ1Y3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmFzdGVyX3Jlc2V0ICA6OiBVc2VkIHRvIHJlc2V0IHRoZSByZW5kZXIgcG9vbCB3aXRoaW4gdGhlIHJhc3Rlci4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXJfcmVuZGVyIDo6IEEgZnVuY3Rpb24gdG8gcmVuZGVyIGEgZ2x5cGggaW50byBhIGdpdmVuIGJpdG1hcC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3Rlcl9kb25lICAgOjogVGhlIHJhc3RlciBkZXN0cnVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1Jhc3Rlcl9GdW5jc18KLSAgewotICAgIEZUX0dseXBoX0Zvcm1hdCAgICAgICAgZ2x5cGhfZm9ybWF0OwotICAgIEZUX1Jhc3Rlcl9OZXdGdW5jICAgICAgcmFzdGVyX25ldzsKLSAgICBGVF9SYXN0ZXJfUmVzZXRGdW5jICAgIHJhc3Rlcl9yZXNldDsKLSAgICBGVF9SYXN0ZXJfU2V0TW9kZUZ1bmMgIHJhc3Rlcl9zZXRfbW9kZTsKLSAgICBGVF9SYXN0ZXJfUmVuZGVyRnVuYyAgIHJhc3Rlcl9yZW5kZXI7Ci0gICAgRlRfUmFzdGVyX0RvbmVGdW5jICAgICByYXN0ZXJfZG9uZTsKLQotICB9IEZUX1Jhc3Rlcl9GdW5jczsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRJTUFHRV9IX18gKi8KLQotCi0vKiBFTkQgKi8KLQotCi0vKiBMb2NhbCBWYXJpYWJsZXM6ICovCi0vKiBjb2Rpbmc6IHV0Zi04ICAgICovCi0vKiBFbmQ6ICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0aW5jcmVtLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0aW5jcmVtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MGFmMjUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGluY3JlbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0aW5jcmVtLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBpbmNyZW1lbnRhbCBsb2FkaW5nIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUSU5DUkVNX0hfXwotI2RlZmluZSBfX0ZUSU5DUkVNX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc2VjdGlvbjoKLSAgICogICAgaW5jcmVtZW50YWwKLSAgICoKLSAgICogQHRpdGxlOgotICAgKiAgICBJbmNyZW1lbnRhbCBMb2FkaW5nCi0gICAqCi0gICAqIEBhYnN0cmFjdDoKLSAgICogICAgQ3VzdG9tIEdseXBoIExvYWRpbmcuCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdmFyaW91cyBmdW5jdGlvbnMgdXNlZCB0byBwZXJmb3JtIHNvLWNhbGxlZAotICAgKiAgIGBpbmNyZW1lbnRhbCcgZ2x5cGggbG9hZGluZy4gIFRoaXMgaXMgYSBtb2RlIHdoZXJlIGFsbCBnbHlwaHMgbG9hZGVkCi0gICAqICAgZnJvbSBhIGdpdmVuIEBGVF9GYWNlIGFyZSBwcm92aWRlZCBieSB0aGUgY2xpZW50IGFwcGxpY2F0aW9uLgotICAgKgotICAgKiAgIEFwYXJ0IGZyb20gdGhhdCwgYWxsIG90aGVyIHRhYmxlcyBhcmUgbG9hZGVkIG5vcm1hbGx5IGZyb20gdGhlIGZvbnQKLSAgICogICBmaWxlLiAgVGhpcyBtb2RlIGlzIHVzZWZ1bCB3aGVuIEZyZWVUeXBlIGlzIHVzZWQgd2l0aGluIGFub3RoZXIKLSAgICogICBlbmdpbmUsIGUuZy4sIGEgUG9zdFNjcmlwdCBJbWFnaW5nIFByb2Nlc3Nvci4KLSAgICoKLSAgICogICBUbyBlbmFibGUgdGhpcyBtb2RlLCB5b3UgbXVzdCB1c2UgQEZUX09wZW5fRmFjZSwgcGFzc2luZyBhbgotICAgKiAgIEBGVF9QYXJhbWV0ZXIgd2l0aCB0aGUgQEZUX1BBUkFNX1RBR19JTkNSRU1FTlRBTCB0YWcgYW5kIGFuCi0gICAqICAgQEZUX0luY3JlbWVudGFsX0ludGVyZmFjZSB2YWx1ZS4gIFNlZSB0aGUgY29tbWVudHMgZm9yCi0gICAqICAgQEZUX0luY3JlbWVudGFsX0ludGVyZmFjZVJlYyBmb3IgYW4gZXhhbXBsZS4KLSAgICoKLSAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOgotICAgKiAgIEZUX0luY3JlbWVudGFsCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBbiBvcGFxdWUgdHlwZSBkZXNjcmliaW5nIGEgdXNlci1wcm92aWRlZCBvYmplY3QgdXNlZCB0byBpbXBsZW1lbnQKLSAgICogICBgaW5jcmVtZW50YWwnIGdseXBoIGxvYWRpbmcgd2l0aGluIEZyZWVUeXBlLiAgVGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQKLSAgICogICBlbWJlZGRlZCBmb250cyBpbiBjZXJ0YWluIGVudmlyb25tZW50cyAoZS5nLiwgUG9zdFNjcmlwdCBpbnRlcnByZXRlcnMpLAotICAgKiAgIHdoZXJlIHRoZSBnbHlwaCBkYXRhIGlzbid0IGluIHRoZSBmb250IGZpbGUsIG9yIG11c3QgYmUgb3ZlcnJpZGRlbiBieQotICAgKiAgIGRpZmZlcmVudCB2YWx1ZXMuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIEl0IGlzIHVwIHRvIGNsaWVudCBhcHBsaWNhdGlvbnMgdG8gY3JlYXRlIGFuZCBpbXBsZW1lbnQgQEZUX0luY3JlbWVudGFsCi0gICAqICAgb2JqZWN0cywgYXMgbG9uZyBhcyB0aGV5IHByb3ZpZGUgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgbWV0aG9kcwotICAgKiAgIEBGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaERhdGFGdW5jLCBARlRfSW5jcmVtZW50YWxfRnJlZUdseXBoRGF0YUZ1bmMKLSAgICogICBhbmQgQEZUX0luY3JlbWVudGFsX0dldEdseXBoTWV0cmljc0Z1bmMuCi0gICAqCi0gICAqICAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBARlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjIHRvIHVuZGVyc3RhbmQgaG93Ci0gICAqICAgdG8gdXNlIGluY3JlbWVudGFsIG9iamVjdHMgd2l0aCBGcmVlVHlwZS4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX0luY3JlbWVudGFsUmVjXyogIEZUX0luY3JlbWVudGFsOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc3RydWN0OgotICAgKiAgIEZUX0luY3JlbWVudGFsX01ldHJpY3NSZWMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgc21hbGwgc3RydWN0dXJlIHVzZWQgdG8gY29udGFpbiB0aGUgYmFzaWMgZ2x5cGggbWV0cmljcyByZXR1cm5lZAotICAgKiAgIGJ5IHRoZSBARlRfSW5jcmVtZW50YWxfR2V0R2x5cGhNZXRyaWNzRnVuYyBtZXRob2QuCi0gICAqCi0gICAqIEBmaWVsZHM6Ci0gICAqICAgYmVhcmluZ194IDo6Ci0gICAqICAgICBMZWZ0IGJlYXJpbmcsIGluIGZvbnQgdW5pdHMuCi0gICAqCi0gICAqICAgYmVhcmluZ195IDo6Ci0gICAqICAgICBUb3AgYmVhcmluZywgaW4gZm9udCB1bml0cy4KLSAgICoKLSAgICogICBhZHZhbmNlIDo6Ci0gICAqICAgICBIb3Jpem9udGFsIGNvbXBvbmVudCBvZiBnbHlwaCBhZHZhbmNlLCBpbiBmb250IHVuaXRzLgotICAgKgotICAgKiAgIGFkdmFuY2VfdiA6OgotICAgKiAgICAgVmVydGljYWwgY29tcG9uZW50IG9mIGdseXBoIGFkdmFuY2UsIGluIGZvbnQgdW5pdHMuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoZXNlIGNvcnJlc3BvbmQgdG8gaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBtZXRyaWNzIGRlcGVuZGluZyBvbiB0aGUKLSAgICogICB2YWx1ZSBvZiB0aGUgYHZlcnRpY2FsJyBhcmd1bWVudCB0byB0aGUgZnVuY3Rpb24KLSAgICogICBARlRfSW5jcmVtZW50YWxfR2V0R2x5cGhNZXRyaWNzRnVuYy4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzUmVjXwotICB7Ci0gICAgRlRfTG9uZyAgYmVhcmluZ194OwotICAgIEZUX0xvbmcgIGJlYXJpbmdfeTsKLSAgICBGVF9Mb25nICBhZHZhbmNlOwotICAgIEZUX0xvbmcgIGFkdmFuY2VfdjsgICAgIC8qIHNpbmNlIDIuMy4xMiAqLwotCi0gIH0gRlRfSW5jcmVtZW50YWxfTWV0cmljc1JlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHN0cnVjdDoKLSAgICogICBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGhhbmRsZSB0byBhbiBARlRfSW5jcmVtZW50YWxfTWV0cmljc1JlYyBzdHJ1Y3R1cmUuCi0gICAqCi0gICAqLwotICAgdHlwZWRlZiBzdHJ1Y3QgRlRfSW5jcmVtZW50YWxfTWV0cmljc1JlY18qICBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAdHlwZToKLSAgICogICBGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaERhdGFGdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGZ1bmN0aW9uIGNhbGxlZCBieSBGcmVlVHlwZSB0byBhY2Nlc3MgYSBnaXZlbiBnbHlwaCdzIGRhdGEgYnl0ZXMKLSAgICogICBkdXJpbmcgQEZUX0xvYWRfR2x5cGggb3IgQEZUX0xvYWRfQ2hhciBpZiBpbmNyZW1lbnRhbCBsb2FkaW5nIGlzCi0gICAqICAgZW5hYmxlZC4KLSAgICoKLSAgICogICBOb3RlIHRoYXQgdGhlIGZvcm1hdCBvZiB0aGUgZ2x5cGgncyBkYXRhIGJ5dGVzIGRlcGVuZHMgb24gdGhlIGZvbnQKLSAgICogICBmaWxlIGZvcm1hdC4gIEZvciBUcnVlVHlwZSwgaXQgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSByYXcgYnl0ZXMgd2l0aGluCi0gICAqICAgdGhlIGBnbHlmJyB0YWJsZS4gIEZvciBQb3N0U2NyaXB0IGZvcm1hdHMsIGl0IG11c3QgY29ycmVzcG9uZCB0byB0aGUKLSAgICogICAqdW5lbmNyeXB0ZWQqIGNoYXJzdHJpbmcgYnl0ZXMsIHdpdGhvdXQgYW55IGBsZW5JVicgaGVhZGVyLiAgSXQgaXMKLSAgICogICB1bmRlZmluZWQgZm9yIGFueSBvdGhlciBmb3JtYXQuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBpbmNyZW1lbnRhbCA6OgotICAgKiAgICAgSGFuZGxlIHRvIGFuIG9wYXF1ZSBARlRfSW5jcmVtZW50YWwgaGFuZGxlIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQKLSAgICogICAgIGFwcGxpY2F0aW9uLgotICAgKgotICAgKiAgIGdseXBoX2luZGV4IDo6Ci0gICAqICAgICBJbmRleCBvZiByZWxldmFudCBnbHlwaC4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICBhZGF0YSA6OgotICAgKiAgICAgQSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgcmV0dXJuZWQgZ2x5cGggZGF0YSBieXRlcyAod2hpY2ggd2lsbCBiZQotICAgKiAgICAgYWNjZXNzZWQgYXMgYSByZWFkLW9ubHkgYnl0ZSBibG9jaykuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHN1Y2Nlc3NmdWxseSB0aGUgbWV0aG9kCi0gICAqICAgQEZUX0luY3JlbWVudGFsX0ZyZWVHbHlwaERhdGFGdW5jIHdpbGwgYmUgY2FsbGVkIGxhdGVyIHRvIHJlbGVhc2UKLSAgICogICB0aGUgZGF0YSBieXRlcy4KLSAgICoKLSAgICogICBOZXN0ZWQgY2FsbHMgdG8gQEZUX0luY3JlbWVudGFsX0dldEdseXBoRGF0YUZ1bmMgY2FuIGhhcHBlbiBmb3IKLSAgICogICBjb21wb3VuZCBnbHlwaHMuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfSW5jcmVtZW50YWxfR2V0R2x5cGhEYXRhRnVuYykoIEZUX0luY3JlbWVudGFsICBpbmNyZW1lbnRhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9EYXRhKiAgICAgICAgYWRhdGEgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgRlRfSW5jcmVtZW50YWxfRnJlZUdseXBoRGF0YUZ1bmMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgZnVuY3Rpb24gdXNlZCB0byByZWxlYXNlIHRoZSBnbHlwaCBkYXRhIGJ5dGVzIHJldHVybmVkIGJ5IGEKLSAgICogICBzdWNjZXNzZnVsIGNhbGwgdG8gQEZUX0luY3JlbWVudGFsX0dldEdseXBoRGF0YUZ1bmMuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBpbmNyZW1lbnRhbCA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gYW4gb3BhcXVlIEBGVF9JbmNyZW1lbnRhbCBoYW5kbGUgcHJvdmlkZWQgYnkgdGhlIGNsaWVudAotICAgKiAgICAgYXBwbGljYXRpb24uCi0gICAqCi0gICAqICAgZGF0YSA6OgotICAgKiAgICAgQSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgZ2x5cGggZGF0YSBieXRlcyAod2hpY2ggd2lsbCBiZSBhY2Nlc3NlZAotICAgKiAgICAgYXMgYSByZWFkLW9ubHkgYnl0ZSBibG9jaykuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9JbmNyZW1lbnRhbF9GcmVlR2x5cGhEYXRhRnVuYykoIEZUX0luY3JlbWVudGFsICBpbmNyZW1lbnRhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RhdGEqICAgICAgICBkYXRhICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOgotICAgKiAgIEZUX0luY3JlbWVudGFsX0dldEdseXBoTWV0cmljc0Z1bmMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgZnVuY3Rpb24gdXNlZCB0byByZXRyaWV2ZSB0aGUgYmFzaWMgbWV0cmljcyBvZiBhIGdpdmVuIGdseXBoIGluZGV4Ci0gICAqICAgYmVmb3JlIGFjY2Vzc2luZyBpdHMgZGF0YS4gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UsIGluIGNlcnRhaW4KLSAgICogICBmb3JtYXRzIGxpa2UgVHJ1ZVR5cGUsIHRoZSBtZXRyaWNzIGFyZSBzdG9yZWQgaW4gYSBkaWZmZXJlbnQgcGxhY2UgZnJvbQotICAgKiAgIHRoZSBnbHlwaCBpbWFnZXMgcHJvcGVyLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaW5jcmVtZW50YWwgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIGFuIG9wYXF1ZSBARlRfSW5jcmVtZW50YWwgaGFuZGxlIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQKLSAgICogICAgIGFwcGxpY2F0aW9uLgotICAgKgotICAgKiAgIGdseXBoX2luZGV4IDo6Ci0gICAqICAgICBJbmRleCBvZiByZWxldmFudCBnbHlwaC4KLSAgICoKLSAgICogICB2ZXJ0aWNhbCA6OgotICAgKiAgICAgSWYgdHJ1ZSwgcmV0dXJuIHZlcnRpY2FsIG1ldHJpY3MuCi0gICAqCi0gICAqICAgYW1ldHJpY3MgOjoKLSAgICogICAgIFRoaXMgcGFyYW1ldGVyIGlzIHVzZWQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dC4KLSAgICogICAgIFRoZSBvcmlnaW5hbCBnbHlwaCBtZXRyaWNzLCBpZiBhbnksIGluIGZvbnQgdW5pdHMuICBJZiBtZXRyaWNzIGFyZQotICAgKiAgICAgbm90IGF2YWlsYWJsZSBhbGwgdGhlIHZhbHVlcyBtdXN0IGJlIHNldCB0byB6ZXJvLgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgIGFtZXRyaWNzIDo6Ci0gICAqICAgICBUaGUgcmVwbGFjZW1lbnQgZ2x5cGggbWV0cmljcyBpbiBmb250IHVuaXRzLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0luY3JlbWVudGFsX0dldEdseXBoTWV0cmljc0Z1bmMpCi0gICAgICAgICAgICAgICAgICAgICAgKCBGVF9JbmNyZW1lbnRhbCAgICAgICAgICAgICAgaW5jcmVtZW50YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzUmVjICAqYW1ldHJpY3MgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc3RydWN0OgotICAgKiAgIEZUX0luY3JlbWVudGFsX0Z1bmNzUmVjCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIHRhYmxlIG9mIGZ1bmN0aW9ucyBmb3IgYWNjZXNzaW5nIGZvbnRzIHRoYXQgbG9hZCBkYXRhCi0gICAqICAgaW5jcmVtZW50YWxseS4gIFVzZWQgaW4gQEZUX0luY3JlbWVudGFsX0ludGVyZmFjZVJlYy4KLSAgICoKLSAgICogQGZpZWxkczoKLSAgICogICBnZXRfZ2x5cGhfZGF0YSA6OgotICAgKiAgICAgVGhlIGZ1bmN0aW9uIHRvIGdldCBnbHlwaCBkYXRhLiAgTXVzdCBub3QgYmUgbnVsbC4KLSAgICoKLSAgICogICBmcmVlX2dseXBoX2RhdGEgOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byByZWxlYXNlIGdseXBoIGRhdGEuICBNdXN0IG5vdCBiZSBudWxsLgotICAgKgotICAgKiAgIGdldF9nbHlwaF9tZXRyaWNzIDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gZ2V0IGdseXBoIG1ldHJpY3MuICBNYXkgYmUgbnVsbCBpZiB0aGUgZm9udCBkb2VzCi0gICAqICAgICBub3QgcHJvdmlkZSBvdmVycmlkaW5nIGdseXBoIG1ldHJpY3MuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfSW5jcmVtZW50YWxfRnVuY3NSZWNfCi0gIHsKLSAgICBGVF9JbmNyZW1lbnRhbF9HZXRHbHlwaERhdGFGdW5jICAgICBnZXRfZ2x5cGhfZGF0YTsKLSAgICBGVF9JbmNyZW1lbnRhbF9GcmVlR2x5cGhEYXRhRnVuYyAgICBmcmVlX2dseXBoX2RhdGE7Ci0gICAgRlRfSW5jcmVtZW50YWxfR2V0R2x5cGhNZXRyaWNzRnVuYyAgZ2V0X2dseXBoX21ldHJpY3M7Ci0KLSAgfSBGVF9JbmNyZW1lbnRhbF9GdW5jc1JlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHN0cnVjdDoKLSAgICogICBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2VSZWMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgc3RydWN0dXJlIHRvIGJlIHVzZWQgd2l0aCBARlRfT3Blbl9GYWNlIHRvIGluZGljYXRlIHRoYXQgdGhlIHVzZXIKLSAgICogICB3YW50cyB0byBzdXBwb3J0IGluY3JlbWVudGFsIGdseXBoIGxvYWRpbmcuICBZb3Ugc2hvdWxkIHVzZSBpdCB3aXRoCi0gICAqICAgQEZUX1BBUkFNX1RBR19JTkNSRU1FTlRBTCBhcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6Ci0gICAqCi0gICAqICAgICB7Ci0gICAqICAgICAgIEZUX0luY3JlbWVudGFsX0ludGVyZmFjZVJlYyAgaW5jX2ludDsKLSAgICogICAgICAgRlRfUGFyYW1ldGVyICAgICAgICAgICAgICAgICBwYXJhbWV0ZXI7Ci0gICAqICAgICAgIEZUX09wZW5fQXJncyAgICAgICAgICAgICAgICAgb3Blbl9hcmdzOwotICAgKgotICAgKgotICAgKiAgICAgICAvLyBzZXQgdXAgaW5jcmVtZW50YWwgZGVzY3JpcHRvcgotICAgKiAgICAgICBpbmNfaW50LmZ1bmNzICA9IG15X2Z1bmNzOwotICAgKiAgICAgICBpbmNfaW50Lm9iamVjdCA9IG15X29iamVjdDsKLSAgICoKLSAgICogICAgICAgLy8gc2V0IHVwIG9wdGlvbmFsIHBhcmFtZXRlcgotICAgKiAgICAgICBwYXJhbWV0ZXIudGFnICA9IEZUX1BBUkFNX1RBR19JTkNSRU1FTlRBTDsKLSAgICogICAgICAgcGFyYW1ldGVyLmRhdGEgPSAmaW5jX2ludDsKLSAgICoKLSAgICogICAgICAgLy8gc2V0IHVwIEZUX09wZW5fQXJncyBzdHJ1Y3R1cmUKLSAgICogICAgICAgb3Blbl9hcmdzLmZsYWdzICAgICAgPSBGVF9PUEVOX1BBVEhOQU1FIHwgRlRfT1BFTl9QQVJBTVM7Ci0gICAqICAgICAgIG9wZW5fYXJncy5wYXRobmFtZSAgID0gbXlfZm9udF9wYXRobmFtZTsKLSAgICogICAgICAgb3Blbl9hcmdzLm51bV9wYXJhbXMgPSAxOwotICAgKiAgICAgICBvcGVuX2FyZ3MucGFyYW1zICAgICA9ICZwYXJhbWV0ZXI7IC8vIHdlIHVzZSBvbmUgb3B0aW9uYWwgYXJndW1lbnQKLSAgICoKLSAgICogICAgICAgLy8gb3BlbiB0aGUgZm9udAotICAgKiAgICAgICBlcnJvciA9IEZUX09wZW5fRmFjZSggbGlicmFyeSwgJm9wZW5fYXJncywgaW5kZXgsICZmYWNlICk7Ci0gICAqICAgICAgIC4uLgotICAgKiAgICAgfQotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0luY3JlbWVudGFsX0ludGVyZmFjZVJlY18KLSAgewotICAgIGNvbnN0IEZUX0luY3JlbWVudGFsX0Z1bmNzUmVjKiAgZnVuY3M7Ci0gICAgRlRfSW5jcmVtZW50YWwgICAgICAgICAgICAgICAgICBvYmplY3Q7Ci0KLSAgfSBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2VSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOgotICAgKiAgIEZUX0luY3JlbWVudGFsX0ludGVyZmFjZQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBwb2ludGVyIHRvIGFuIEBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2VSZWMgc3RydWN0dXJlLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2VSZWMqICAgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAY29uc3RhbnQ6Ci0gICAqICAgRlRfUEFSQU1fVEFHX0lOQ1JFTUVOVEFMCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGNvbnN0YW50IHVzZWQgYXMgdGhlIHRhZyBvZiBARlRfUGFyYW1ldGVyIHN0cnVjdHVyZXMgdG8gaW5kaWNhdGUKLSAgICogICBhbiBpbmNyZW1lbnRhbCBsb2FkaW5nIG9iamVjdCB0byBiZSB1c2VkIGJ5IEZyZWVUeXBlLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfUEFSQU1fVEFHX0lOQ1JFTUVOVEFMICBGVF9NQUtFX1RBRyggJ2knLCAnbicsICdjJywgJ3InICkKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRJTkNSRU1fSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bGNkZmlsLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bGNkZmlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZDk5OWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGxjZGZpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0bGNkZmlsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBBUEkgZm9yIGNvbG9yIGZpbHRlcmluZyBvZiBzdWJwaXhlbCBiaXRtYXAgZ2x5cGhzICAgICAgICAgICAqLwotLyogICAgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVF9MQ0RfRklMVEVSX0hfXwotI2RlZmluZSBfX0ZUX0xDRF9GSUxURVJfSF9fCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzZWN0aW9uOgotICAgKiAgIGxjZF9maWx0ZXJpbmcKLSAgICoKLSAgICogQHRpdGxlOgotICAgKiAgIExDRCBGaWx0ZXJpbmcKLSAgICoKLSAgICogQGFic3RyYWN0OgotICAgKiAgIFJlZHVjZSBjb2xvciBmcmluZ2VzIG9mIExDRC1vcHRpbWl6ZWQgYml0bWFwcy4KLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoZSBARlRfTGlicmFyeV9TZXRMY2RGaWx0ZXIgQVBJIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsb3ctcGFzcwotICAgKiAgIGZpbHRlciwgd2hpY2ggaXMgdGhlbiBhcHBsaWVkIHRvIExDRC1vcHRpbWl6ZWQgYml0bWFwcyBnZW5lcmF0ZWQKLSAgICogICB0aHJvdWdoIEBGVF9SZW5kZXJfR2x5cGguICBUaGlzIGlzIHVzZWZ1bCB0byByZWR1Y2UgY29sb3IgZnJpbmdlcwotICAgKiAgIHRoYXQgd291bGQgb2NjdXIgd2l0aCB1bmZpbHRlcmVkIHJlbmRlcmluZy4KLSAgICoKLSAgICogICBOb3RlIHRoYXQgbm8gZmlsdGVyIGlzIGFjdGl2ZSBieSBkZWZhdWx0LCBhbmQgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzCi0gICAqICAgKm5vdCogaW1wbGVtZW50ZWQgaW4gZGVmYXVsdCBidWlsZHMgb2YgdGhlIGxpYnJhcnkuICBZb3UgbmVlZCB0bwotICAgKiAgICNkZWZpbmUgRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcgaW4geW91ciBgZnRvcHRpb24uaCcgZmlsZQotICAgKiAgIGluIG9yZGVyIHRvIGFjdGl2YXRlIGl0LgotICAgKgotICAgKiAgIEZyZWVUeXBlIGdlbmVyYXRlcyBhbHBoYSBjb3ZlcmFnZSBtYXBzLCB3aGljaCBhcmUgbGluZWFyIGJ5IG5hdHVyZS4KLSAgICogICBGb3IgaW5zdGFuY2UsIHRoZSB2YWx1ZSAweDgwIGluIGJpdG1hcCByZXByZXNlbnRhdGlvbiBtZWFucyB0aGF0Ci0gICAqICAgKHdpdGhpbiBudW1lcmljYWwgcHJlY2lzaW9uKSAweDgwLzB4RkYgZnJhY3Rpb24gb2YgdGhhdCBwaXhlbCBpcwotICAgKiAgIGNvdmVyZWQgYnkgdGhlIGdseXBoJ3Mgb3V0bGluZS4gIFRoZSBibGVuZGluZyBmdW5jdGlvbiBmb3IgcGxhY2luZwotICAgKiAgIHRleHQgb3ZlciBhIGJhY2tncm91bmQgaXMKLSAgICoKLSAgICogICB7Ci0gICAqICAgICBkc3QgPSBhbHBoYSAqIHNyYyArICgxIC0gYWxwaGEpICogZHN0ICAgICwKLSAgICogICB9Ci0gICAqCi0gICAqICAgd2hpY2ggaXMga25vd24gYXMgT1ZFUi4gIEhvd2V2ZXIsIHdoZW4gY2FsY3VsYXRpbmcgdGhlIG91dHB1dCBvZiB0aGUKLSAgICogICBPVkVSIG9wZXJhdG9yLCB0aGUgc291cmNlIGNvbG9ycyBzaG91bGQgZmlyc3QgYmUgdHJhbnNmb3JtZWQgdG8gYQotICAgKiAgIGxpbmVhciBjb2xvciBzcGFjZSwgdGhlbiBhbHBoYSBibGVuZGVkIGluIHRoYXQgc3BhY2UsIGFuZCB0cmFuc2Zvcm1lZAotICAgKiAgIGJhY2sgdG8gdGhlIG91dHB1dCBjb2xvciBzcGFjZS4KLSAgICoKLSAgICogICBXaGVuIGxpbmVhciBsaWdodCBibGVuZGluZyBpcyB1c2VkLCB0aGUgZGVmYXVsdCBGSVI1IGZpbHRlcmluZwotICAgKiAgIHdlaWdodHMgKGFzIGdpdmVuIGJ5IEZUX0xDRF9GSUxURVJfREVGQVVMVCkgYXJlIG5vIGxvbmdlciBvcHRpbWFsLCBhcwotICAgKiAgIHRoZXkgaGF2ZSBiZWVuIGRlc2lnbmVkIGZvciBibGFjayBvbiB3aGl0ZSByZW5kZXJpbmcgd2hpbGUgbGFja2luZwotICAgKiAgIGdhbW1hIGNvcnJlY3Rpb24uICBUbyBwcmVzZXJ2ZSBjb2xvciBuZXV0cmFsaXR5LCB3ZWlnaHRzIGZvciBhIEZJUjUKLSAgICogICBmaWx0ZXIgc2hvdWxkIGJlIGNob3NlbiBhY2NvcmRpbmcgdG8gdHdvIGZyZWUgcGFyYW1ldGVycyBgYScgYW5kIGBjJywKLSAgICogICBhbmQgdGhlIEZJUiB3ZWlnaHRzIHNob3VsZCBiZQotICAgKgotICAgKiAgIHsKLSAgICogICAgIFthIC0gYywgYSArIGMsIDIgKiBhLCBhICsgYywgYSAtIGNdICAgIC4KLSAgICogICB9Ci0gICAqCi0gICAqICAgVGhpcyBmb3JtdWxhIGdlbmVyYXRlcyBlcXVhbCB3ZWlnaHRzIGZvciBhbGwgdGhlIGNvbG9yIHByaW1hcmllcwotICAgKiAgIGFjcm9zcyB0aGUgZmlsdGVyIGtlcm5lbCwgd2hpY2ggbWFrZXMgaXQgY29sb3JsZXNzLiAgT25lIHN1Z2dlc3RlZAotICAgKiAgIHNldCBvZiB3ZWlnaHRzIGlzCi0gICAqCi0gICAqICAgewotICAgKiAgICAgWzB4MTAsIDB4NTAsIDB4NjAsIDB4NTAsIDB4MTBdICAgICwKLSAgICogICB9Ci0gICAqCi0gICAqICAgd2hlcmUgYGEnIGhhcyB2YWx1ZSAweDMwIGFuZCBgYicgdmFsdWUgMHgyMC4gIFRoZSB3ZWlnaHRzIGluIGZpbHRlcgotICAgKiAgIG1heSBoYXZlIGEgc3VtIGxhcmdlciB0aGFuIDB4MTAwLCB3aGljaCBpbmNyZWFzZXMgY29sb3JhdGlvbiBzbGlnaHRseQotICAgKiAgIGJ1dCBhbHNvIGltcHJvdmVzIGNvbnRyYXN0LgotICAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIEZUX0xjZEZpbHRlcgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIHZhbHVlcyB0byBpZGVudGlmeSB2YXJpb3VzIHR5cGVzIG9mIExDRCBmaWx0ZXJzLgotICAgKgotICAgKiBAdmFsdWVzOgotICAgKiAgIEZUX0xDRF9GSUxURVJfTk9ORSA6OgotICAgKiAgICAgRG8gbm90IHBlcmZvcm0gZmlsdGVyaW5nLiAgV2hlbiB1c2VkIHdpdGggc3VicGl4ZWwgcmVuZGVyaW5nLCB0aGlzCi0gICAqICAgICByZXN1bHRzIGluIHNvbWV0aW1lcyBzZXZlcmUgY29sb3IgZnJpbmdlcy4KLSAgICoKLSAgICogICBGVF9MQ0RfRklMVEVSX0RFRkFVTFQgOjoKLSAgICogICAgIFRoZSBkZWZhdWx0IGZpbHRlciByZWR1Y2VzIGNvbG9yIGZyaW5nZXMgY29uc2lkZXJhYmx5LCBhdCB0aGUgY29zdAotICAgKiAgICAgb2YgYSBzbGlnaHQgYmx1cnJpbmVzcyBpbiB0aGUgb3V0cHV0LgotICAgKgotICAgKiAgIEZUX0xDRF9GSUxURVJfTElHSFQgOjoKLSAgICogICAgIFRoZSBsaWdodCBmaWx0ZXIgaXMgYSB2YXJpYW50IHRoYXQgcHJvZHVjZXMgbGVzcyBibHVycmluZXNzIGF0IHRoZQotICAgKiAgICAgY29zdCBvZiBzbGlnaHRseSBtb3JlIGNvbG9yIGZyaW5nZXMgdGhhbiB0aGUgZGVmYXVsdCBvbmUuICBJdCBtaWdodAotICAgKiAgICAgYmUgYmV0dGVyLCBkZXBlbmRpbmcgb24gdGFzdGUsIHlvdXIgbW9uaXRvciwgb3IgeW91ciBwZXJzb25hbCB2aXNpb24uCi0gICAqCi0gICAqICAgRlRfTENEX0ZJTFRFUl9MRUdBQ1kgOjoKLSAgICogICAgIFRoaXMgZmlsdGVyIGNvcnJlc3BvbmRzIHRvIHRoZSBvcmlnaW5hbCBsaWJYZnQgY29sb3IgZmlsdGVyLiAgSXQKLSAgICogICAgIHByb3ZpZGVzIGhpZ2ggY29udHJhc3Qgb3V0cHV0IGJ1dCBjYW4gZXhoaWJpdCByZWFsbHkgYmFkIGNvbG9yCi0gICAqICAgICBmcmluZ2VzIGlmIGdseXBocyBhcmUgbm90IGV4dHJlbWVseSB3ZWxsIGhpbnRlZCB0byB0aGUgcGl4ZWwgZ3JpZC4KLSAgICogICAgIEluIG90aGVyIHdvcmRzLCBpdCBvbmx5IHdvcmtzIHdlbGwgaWYgdGhlIFRydWVUeXBlIGJ5dGVjb2RlCi0gICAqICAgICBpbnRlcnByZXRlciBpcyBlbmFibGVkICphbmQqIGhpZ2gtcXVhbGl0eSBoaW50ZWQgZm9udHMgYXJlIHVzZWQuCi0gICAqCi0gICAqICAgICBUaGlzIGZpbHRlciBpcyBvbmx5IHByb3ZpZGVkIGZvciBjb21wYXJpc29uIHB1cnBvc2VzLCBhbmQgbWlnaHQgYmUKLSAgICogICAgIGRpc2FibGVkIG9yIHN0YXkgdW5zdXBwb3J0ZWQgaW4gdGhlIGZ1dHVyZS4KLSAgICoKLSAgICogQHNpbmNlOgotICAgKiAgIDIuMy4wCi0gICAqLwotICB0eXBlZGVmIGVudW0gIEZUX0xjZEZpbHRlcl8KLSAgewotICAgIEZUX0xDRF9GSUxURVJfTk9ORSAgICA9IDAsCi0gICAgRlRfTENEX0ZJTFRFUl9ERUZBVUxUID0gMSwKLSAgICBGVF9MQ0RfRklMVEVSX0xJR0hUICAgPSAyLAotICAgIEZUX0xDRF9GSUxURVJfTEVHQUNZICA9IDE2LAotCi0gICAgRlRfTENEX0ZJTFRFUl9NQVggICAvKiBkbyBub3QgcmVtb3ZlICovCi0KLSAgfSBGVF9MY2RGaWx0ZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmM6Ci0gICAqICAgRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXIKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhcHBseSBjb2xvciBmaWx0ZXJpbmcgdG8gTENEIGRlY2ltYXRlZAotICAgKiAgIGJpdG1hcHMsIGxpa2UgdGhlIG9uZXMgdXNlZCB3aGVuIGNhbGxpbmcgQEZUX1JlbmRlcl9HbHlwaCB3aXRoCi0gICAqICAgQEZUX1JFTkRFUl9NT0RFX0xDRCBvciBARlRfUkVOREVSX01PREVfTENEX1YuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBsaWJyYXJ5IDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGxpYnJhcnkgaW5zdGFuY2UuCi0gICAqCi0gICAqICAgZmlsdGVyIDo6Ci0gICAqICAgICBUaGUgZmlsdGVyIHR5cGUuCi0gICAqCi0gICAqICAgICBZb3UgY2FuIHVzZSBARlRfTENEX0ZJTFRFUl9OT05FIGhlcmUgdG8gZGlzYWJsZSB0aGlzIGZlYXR1cmUsIG9yCi0gICAqICAgICBARlRfTENEX0ZJTFRFUl9ERUZBVUxUIHRvIHVzZSBhIGRlZmF1bHQgZmlsdGVyIHRoYXQgc2hvdWxkIHdvcmsKLSAgICogICAgIHdlbGwgb24gbW9zdCBMQ0Qgc2NyZWVucy4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGlzIGZlYXR1cmUgaXMgYWx3YXlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuICBDbGllbnRzIG11c3QgbWFrZSBhbgotICAgKiAgIGV4cGxpY2l0IGNhbGwgdG8gdGhpcyBmdW5jdGlvbiB3aXRoIGEgYGZpbHRlcicgdmFsdWUgb3RoZXIgdGhhbgotICAgKiAgIEBGVF9MQ0RfRklMVEVSX05PTkUgaW4gb3JkZXIgdG8gZW5hYmxlIGl0LgotICAgKgotICAgKiAgIER1ZSB0byAqUEFURU5UUyogY292ZXJpbmcgc3VicGl4ZWwgcmVuZGVyaW5nLCB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QKLSAgICogICBkbyBhbnl0aGluZyBleGNlcHQgcmV0dXJuaW5nIGBGVF9FcnJfVW5pbXBsZW1lbnRlZF9GZWF0dXJlJyBpZiB0aGUKLSAgICogICBjb25maWd1cmF0aW9uIG1hY3JvIEZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HIGlzIG5vdAotICAgKiAgIGRlZmluZWQgaW4geW91ciBidWlsZCBvZiB0aGUgbGlicmFyeSwgd2hpY2ggc2hvdWxkIGNvcnJlc3BvbmQgdG8gYWxsCi0gICAqICAgZGVmYXVsdCBidWlsZHMgb2YgRnJlZVR5cGUuCi0gICAqCi0gICAqICAgVGhlIGZpbHRlciBhZmZlY3RzIGdseXBoIGJpdG1hcHMgcmVuZGVyZWQgdGhyb3VnaCBARlRfUmVuZGVyX0dseXBoLAotICAgKiAgIEBGVF9PdXRsaW5lX0dldF9CaXRtYXAsIEBGVF9Mb2FkX0dseXBoLCBhbmQgQEZUX0xvYWRfQ2hhci4KLSAgICoKLSAgICogICBJdCBkb2VzIF9ub3RfIGFmZmVjdCB0aGUgb3V0cHV0IG9mIEBGVF9PdXRsaW5lX1JlbmRlciBhbmQKLSAgICogICBARlRfT3V0bGluZV9HZXRfQml0bWFwLgotICAgKgotICAgKiAgIElmIHRoaXMgZmVhdHVyZSBpcyBhY3RpdmF0ZWQsIHRoZSBkaW1lbnNpb25zIG9mIExDRCBnbHlwaCBiaXRtYXBzIGFyZQotICAgKiAgIGVpdGhlciBsYXJnZXIgb3IgdGFsbGVyIHRoYW4gdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICogICBvdXRsaW5lIHdpdGggcmVnYXJkcyB0byB0aGUgcGl4ZWwgZ3JpZC4gIEZvciBleGFtcGxlLCBmb3IKLSAgICogICBARlRfUkVOREVSX01PREVfTENELCB0aGUgZmlsdGVyIGFkZHMgdXAgdG8gM35waXhlbHMgdG8gdGhlIGxlZnQsIGFuZAotICAgKiAgIHVwIHRvIDN+cGl4ZWxzIHRvIHRoZSByaWdodC4KLSAgICoKLSAgICogICBUaGUgYml0bWFwIG9mZnNldCB2YWx1ZXMgYXJlIGFkanVzdGVkIGNvcnJlY3RseSwgc28gY2xpZW50cyBzaG91bGRuJ3QKLSAgICogICBuZWVkIHRvIG1vZGlmeSB0aGVpciBsYXlvdXQgYW5kIGdseXBoIHBvc2l0aW9uaW5nIGNvZGUgd2hlbiBlbmFibGluZwotICAgKiAgIHRoZSBmaWx0ZXIuCi0gICAqCi0gICAqIEBzaW5jZToKLSAgICogICAyLjMuMAotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyKCBGVF9MaWJyYXJ5ICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9MY2RGaWx0ZXIgIGZpbHRlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jOgotICAgKiAgIEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyV2VpZ2h0cwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVXNlIHRoaXMgZnVuY3Rpb24gdG8gb3ZlcnJpZGUgdGhlIGZpbHRlciB3ZWlnaHRzIHNlbGVjdGVkIGJ5Ci0gICAqICAgQEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyLiAgQnkgZGVmYXVsdCwgRnJlZVR5cGUgdXNlcyB0aGUgcXVpbnR1cGxlCi0gICAqICAgKDB4MDAsIDB4NTUsIDB4NTYsIDB4NTUsIDB4MDApIGZvciBGVF9MQ0RfRklMVEVSX0xJR0hULCBhbmQgKDB4MTAsCi0gICAqICAgMHg0MCwgMHg3MCwgMHg0MCwgMHgxMCkgZm9yIEZUX0xDRF9GSUxURVJfREVGQVVMVCBhbmQKLSAgICogICBGVF9MQ0RfRklMVEVSX0xFR0FDWS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGxpYnJhcnkgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgbGlicmFyeSBpbnN0YW5jZS4KLSAgICoKLSAgICogICB3ZWlnaHRzIDo6Ci0gICAqICAgICBBIHBvaW50ZXIgdG8gYW4gYXJyYXk7IHRoZSBmdW5jdGlvbiBjb3BpZXMgdGhlIGZpcnN0IGZpdmUgYnl0ZXMgYW5kCi0gICAqICAgICB1c2VzIHRoZW0gdG8gc3BlY2lmeSB0aGUgZmlsdGVyIHdlaWdodHMuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgRHVlIHRvICpQQVRFTlRTKiBjb3ZlcmluZyBzdWJwaXhlbCByZW5kZXJpbmcsIHRoaXMgZnVuY3Rpb24gZG9lc24ndAotICAgKiAgIGRvIGFueXRoaW5nIGV4Y2VwdCByZXR1cm5pbmcgYEZUX0Vycl9VbmltcGxlbWVudGVkX0ZlYXR1cmUnIGlmIHRoZQotICAgKiAgIGNvbmZpZ3VyYXRpb24gbWFjcm8gRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcgaXMgbm90Ci0gICAqICAgZGVmaW5lZCBpbiB5b3VyIGJ1aWxkIG9mIHRoZSBsaWJyYXJ5LCB3aGljaCBzaG91bGQgY29ycmVzcG9uZCB0byBhbGwKLSAgICogICBkZWZhdWx0IGJ1aWxkcyBvZiBGcmVlVHlwZS4KLSAgICoKLSAgICogICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFmdGVyIEBGVF9MaWJyYXJ5X1NldExjZEZpbHRlciB0byBoYXZlCi0gICAqICAgYW55IGVmZmVjdC4KLSAgICoKLSAgICogQHNpbmNlOgotICAgKiAgIDIuNC4wCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfTGlicmFyeV9TZXRMY2RGaWx0ZXJXZWlnaHRzKCBGVF9MaWJyYXJ5ICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICAqd2VpZ2h0cyApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVF9MQ0RfRklMVEVSX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGxpc3QuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRsaXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYjQ4YzcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdGxpc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGxpc3QuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgR2VuZXJpYyBsaXN0IHN1cHBvcnQgZm9yIEZyZWVUeXBlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhpcyBmaWxlIGltcGxlbWVudHMgZnVuY3Rpb25zIHJlbGF0aXZlIHRvIGxpc3QgcHJvY2Vzc2luZy4gIEl0cyAgICAgKi8KLSAgLyogIGRhdGEgc3RydWN0dXJlcyBhcmUgZGVmaW5lZCBpbiBgZnJlZXR5cGUuaCcuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRMSVNUX0hfXwotI2RlZmluZSBfX0ZUTElTVF9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaXN0X3Byb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMaXN0IFByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTaW1wbGUgbWFuYWdlbWVudCBvZiBsaXN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdmFyaW91cyBkZWZpbml0aW9ucyByZWxhdGVkIHRvIGxpc3QgICAgICAgICAgKi8KLSAgLyogICAgcHJvY2Vzc2luZyB1c2luZyBkb3VibHktbGlua2VkIG5vZGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3ROb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdE5vZGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0FkZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9JbnNlcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfRmluZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X1JlbW92ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9VcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfSXRlcmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0l0ZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9GaW5hbGl6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfRGVzdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0ZpbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5kIHRoZSBsaXN0IG5vZGUgZm9yIGEgZ2l2ZW4gbGlzdGVkIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaXN0IDo6IEEgcG9pbnRlciB0byB0aGUgcGFyZW50IGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGF0YSA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgbGlzdGVkIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTGlzdCBub2RlLiAgTlVMTCBpZiBpdCB3YXNuJ3QgZm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0xpc3ROb2RlICkKLSAgRlRfTGlzdF9GaW5kKCBGVF9MaXN0ICBsaXN0LAotICAgICAgICAgICAgICAgIHZvaWQqICAgIGRhdGEgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfQWRkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFwcGVuZCBhbiBlbGVtZW50IHRvIHRoZSBlbmQgb2YgYSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpc3QgOjogQSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBub2RlIDo6IFRoZSBub2RlIHRvIGFwcGVuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0xpc3RfQWRkKCBGVF9MaXN0ICAgICAgbGlzdCwKLSAgICAgICAgICAgICAgIEZUX0xpc3ROb2RlICBub2RlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0luc2VydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbnNlcnQgYW4gZWxlbWVudCBhdCB0aGUgaGVhZCBvZiBhIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaXN0IDo6IEEgcG9pbnRlciB0byBwYXJlbnQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbm9kZSA6OiBUaGUgbm9kZSB0byBpbnNlcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9MaXN0X0luc2VydCggRlRfTGlzdCAgICAgIGxpc3QsCi0gICAgICAgICAgICAgICAgICBGVF9MaXN0Tm9kZSAgbm9kZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTGlzdF9SZW1vdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVtb3ZlIGEgbm9kZSBmcm9tIGEgbGlzdC4gIFRoaXMgZnVuY3Rpb24gZG9lc24ndCBjaGVjayB3aGV0aGVyICAgICovCi0gIC8qICAgIHRoZSBub2RlIGlzIGluIHRoZSBsaXN0ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5vZGUgOjogVGhlIG5vZGUgdG8gcmVtb3ZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpc3QgOjogQSBwb2ludGVyIHRvIHRoZSBwYXJlbnQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfTGlzdF9SZW1vdmUoIEZUX0xpc3QgICAgICBsaXN0LAotICAgICAgICAgICAgICAgICAgRlRfTGlzdE5vZGUgIG5vZGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfVXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1vdmUgYSBub2RlIHRvIHRoZSBoZWFkL3RvcCBvZiBhIGxpc3QuICBVc2VkIHRvIG1haW50YWluIExSVSAgICAgICAqLwotICAvKiAgICBsaXN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaXN0IDo6IEEgcG9pbnRlciB0byB0aGUgcGFyZW50IGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbm9kZSA6OiBUaGUgbm9kZSB0byBtb3ZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9MaXN0X1VwKCBGVF9MaXN0ICAgICAgbGlzdCwKLSAgICAgICAgICAgICAgRlRfTGlzdE5vZGUgIG5vZGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3RfSXRlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIEZUX0xpc3QgaXRlcmF0b3IgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgZHVyaW5nIGEgbGlzdCBwYXJzZSAgICAqLwotICAvKiAgICBieSBARlRfTGlzdF9JdGVyYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBub2RlIDo6IFRoZSBjdXJyZW50IGl0ZXJhdGlvbiBsaXN0IG5vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgOjogQSB0eXBlbGVzcyBwb2ludGVyIHBhc3NlZCB0byBARlRfTGlzdF9JdGVyYXRlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgIENhbiBiZSB1c2VkIHRvIHBvaW50IHRvIHRoZSBpdGVyYXRpb24ncyBzdGF0ZS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9MaXN0X0l0ZXJhdG9yKSggRlRfTGlzdE5vZGUgIG5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICB1c2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0l0ZXJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQYXJzZSBhIGxpc3QgYW5kIGNhbGxzIGEgZ2l2ZW4gaXRlcmF0b3IgZnVuY3Rpb24gb24gZWFjaCBlbGVtZW50LiAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHBhcnNpbmcgaXMgc3RvcHBlZCBhcyBzb29uIGFzIG9uZSBvZiB0aGUgaXRlcmF0b3IgY2FsbHMgICovCi0gIC8qICAgIHJldHVybnMgYSBub24temVybyB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpc3QgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpdGVyYXRvciA6OiBBbiBpdGVyYXRvciBmdW5jdGlvbiwgY2FsbGVkIG9uIGVhY2ggbm9kZSBvZiB0aGUgbGlzdC4gKi8KLSAgLyogICAgdXNlciAgICAgOjogQSB1c2VyLXN1cHBsaWVkIGZpZWxkIHRoYXQgaXMgcGFzc2VkIGFzIHRoZSBzZWNvbmQgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIGFyZ3VtZW50IHRvIHRoZSBpdGVyYXRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSByZXN1bHQgKGEgRnJlZVR5cGUgZXJyb3IgY29kZSkgb2YgdGhlIGxhc3QgaXRlcmF0b3IgY2FsbC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0xpc3RfSXRlcmF0ZSggRlRfTGlzdCAgICAgICAgICAgbGlzdCwKLSAgICAgICAgICAgICAgICAgICBGVF9MaXN0X0l0ZXJhdG9yICBpdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICB1c2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0Rlc3RydWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBARlRfTGlzdCBpdGVyYXRvciBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBkdXJpbmcgYSBsaXN0ICAgICAgICAgKi8KLSAgLyogICAgZmluYWxpemF0aW9uIGJ5IEBGVF9MaXN0X0ZpbmFsaXplIHRvIGRlc3Ryb3kgYWxsIGVsZW1lbnRzIGluIGEgICAgICovCi0gIC8qICAgIGdpdmVuIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN5c3RlbSA6OiBUaGUgY3VycmVudCBzeXN0ZW0gb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGF0YSAgIDo6IFRoZSBjdXJyZW50IG9iamVjdCB0byBkZXN0cm95LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1c2VyICAgOjogQSB0eXBlbGVzcyBwb2ludGVyIHBhc3NlZCB0byBARlRfTGlzdF9JdGVyYXRlLiAgSXQgY2FuICAgKi8KLSAgLyogICAgICAgICAgICAgIGJlIHVzZWQgdG8gcG9pbnQgdG8gdGhlIGl0ZXJhdGlvbidzIHN0YXRlLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9MaXN0X0Rlc3RydWN0b3IpKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICB1c2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0X0ZpbmFsaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXN0cm95IGFsbCBlbGVtZW50cyBpbiB0aGUgbGlzdCBhcyB3ZWxsIGFzIHRoZSBsaXN0IGl0c2VsZi4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaXN0ICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlc3Ryb3kgOjogQSBsaXN0IGRlc3RydWN0b3IgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gZWFjaCBlbGVtZW50ICAqLwotICAvKiAgICAgICAgICAgICAgIG9mIHRoZSBsaXN0LiAgU2V0IHRoaXMgdG8gTlVMTCBpZiBub3QgbmVlZGVkLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSAgOjogVGhlIGN1cnJlbnQgbWVtb3J5IG9iamVjdCB0aGF0IGhhbmRsZXMgZGVhbGxvY2F0aW9uLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdXNlciAgICA6OiBBIHVzZXItc3VwcGxpZWQgZmllbGQgdGhhdCBpcyBwYXNzZWQgYXMgdGhlIGxhc3QgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgYXJndW1lbnQgdG8gdGhlIGRlc3RydWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gZXhwZWN0cyB0aGF0IGFsbCBub2RlcyBhZGRlZCBieSBARlRfTGlzdF9BZGQgb3IgICAgICAqLwotICAvKiAgICBARlRfTGlzdF9JbnNlcnQgaGF2ZSBiZWVuIGR5bmFtaWNhbGx5IGFsbG9jYXRlZC4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0xpc3RfRmluYWxpemUoIEZUX0xpc3QgICAgICAgICAgICAgbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgRlRfTGlzdF9EZXN0cnVjdG9yICBkZXN0cm95LAotICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICB1c2VyICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUTElTVF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRsencuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRsencuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlYzI4ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bHp3LmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGx6dy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgTFpXLWNvbXByZXNzZWQgc3RyZWFtIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDQtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVExaV19IX18KLSNkZWZpbmUgX19GVExaV19IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGx6dyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExaVyBTdHJlYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzaW5nIExaVy1jb21wcmVzc2VkIGZvbnQgZmlsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgTFpXLXNwZWNpZmljIGZ1bmN0aW9ucy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICBGVF9TdHJlYW1fT3BlbkxaVwotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgT3BlbiBhIG5ldyBzdHJlYW0gdG8gcGFyc2UgTFpXLWNvbXByZXNzZWQgZm9udCBmaWxlcy4gIFRoaXMgaXMKLSAgKiAgIG1haW5seSB1c2VkIHRvIHN1cHBvcnQgdGhlIGNvbXByZXNzZWQgYCoucGNmLlonIGZvbnRzIHRoYXQgY29tZQotICAqICAgd2l0aCBYRnJlZTg2LgotICAqCi0gICogQGlucHV0OgotICAqICAgc3RyZWFtIDo6IFRoZSB0YXJnZXQgZW1iZWRkaW5nIHN0cmVhbS4KLSAgKgotICAqICAgc291cmNlIDo6IFRoZSBzb3VyY2Ugc3RyZWFtLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoZSBzb3VyY2Ugc3RyZWFtIG11c3QgYmUgb3BlbmVkIF9iZWZvcmVfIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KLSAgKgotICAqICAgQ2FsbGluZyB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gYEZUX1N0cmVhbV9DbG9zZScgb24gdGhlIG5ldyBzdHJlYW0gd2lsbAotICAqICAgKm5vdCogY2FsbCBgRlRfU3RyZWFtX0Nsb3NlJyBvbiB0aGUgc291cmNlIHN0cmVhbS4gIE5vbmUgb2YgdGhlIHN0cmVhbQotICAqICAgb2JqZWN0cyB3aWxsIGJlIHJlbGVhc2VkIHRvIHRoZSBoZWFwLgotICAqCi0gICogICBUaGUgc3RyZWFtIGltcGxlbWVudGF0aW9uIGlzIHZlcnkgYmFzaWMgYW5kIHJlc2V0cyB0aGUgZGVjb21wcmVzc2lvbgotICAqICAgcHJvY2VzcyBlYWNoIHRpbWUgc2Vla2luZyBiYWNrd2FyZHMgaXMgbmVlZGVkIHdpdGhpbiB0aGUgc3RyZWFtCi0gICoKLSAgKiAgIEluIGNlcnRhaW4gYnVpbGRzIG9mIHRoZSBsaWJyYXJ5LCBMWlcgY29tcHJlc3Npb24gcmVjb2duaXRpb24gaXMKLSAgKiAgIGF1dG9tYXRpY2FsbHkgaGFuZGxlZCB3aGVuIGNhbGxpbmcgQEZUX05ld19GYWNlIG9yIEBGVF9PcGVuX0ZhY2UuCi0gICogICBUaGlzIG1lYW5zIHRoYXQgaWYgbm8gZm9udCBkcml2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyB0aGUgcmF3Ci0gICogICBjb21wcmVzc2VkIGZpbGUsIHRoZSBsaWJyYXJ5IHdpbGwgdHJ5IHRvIG9wZW4gYSBMWlcgc3RyZWFtIGZyb20gaXQKLSAgKiAgIGFuZCByZS1vcGVuIHRoZSBmYWNlIHdpdGggaXQuCi0gICoKLSAgKiAgIFRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZScgaWYgeW91ciBidWlsZAotICAqICAgb2YgRnJlZVR5cGUgd2FzIG5vdCBjb21waWxlZCB3aXRoIExaVyBzdXBwb3J0LgotICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX09wZW5MWlcoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzb3VyY2UgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRMWldfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bWFjLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bWFjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YzU1Y2YuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdG1hYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0bWFjLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBZGRpdGlvbmFsIE1hYy1zcGVjaWZpYyBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSnVzdCB2YW4gUm9zc3VtLCBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFOiBJbmNsdWRlIHRoaXMgZmlsZSBhZnRlciBGVF9GUkVFVFlQRV9IIGFuZCBhZnRlciBhbnkgICAgICAgICAgICAgICAqLwotLyogICAgICAgTWFjLXNwZWNpZmljIGhlYWRlcnMgKGJlY2F1c2UgdGhpcyBoZWFkZXIgdXNlcyBNYWMgdHlwZXMgc3VjaCBhcyAgKi8KLS8qICAgICAgIEhhbmRsZSwgRlNTcGVjLCBGU1JlZiwgZXRjLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRNQUNfSF9fCi0jZGVmaW5lIF9fRlRNQUNfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotLyogZ2NjLTMuNC4xIGFuZCBsYXRlciBjYW4gd2FybiBhYm91dCBmdW5jdGlvbnMgdGFnZ2VkIGFzIGRlcHJlY2F0ZWQgKi8KLSNpZm5kZWYgRlRfREVQUkVDQVRFRF9BVFRSSUJVVEUKLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgXAotICAgICgoX19HTlVDX18gPj0gNCkgfHwgKChfX0dOVUNfXyA9PSAzKSAmJiAoX19HTlVDX01JTk9SX18gPj0gMSkpKQotI2RlZmluZSBGVF9ERVBSRUNBVEVEX0FUVFJJQlVURSAgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpCi0jZWxzZQotI2RlZmluZSBGVF9ERVBSRUNBVEVEX0FUVFJJQlVURQotI2VuZGlmCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hY19zcGVjaWZpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1hYyBTcGVjaWZpYyBJbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9ubHkgYXZhaWxhYmxlIG9uIHRoZSBNYWNpbnRvc2guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGlmIEZyZWVUeXBlIGlzICAgICAgICAqLwotICAvKiAgICBjb21waWxlZCBvbiBhIE1hY2ludG9zaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X0ZhY2VfRnJvbV9GT05EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3JlYXRlIGEgbmV3IGZhY2Ugb2JqZWN0IGZyb20gYSBGT05EIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9uZCAgICAgICA6OiBBIEZPTkQgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4IDo6IE9ubHkgc3VwcG9ydGVkIGZvciB0aGUgLTEgYHNhbml0eSBjaGVjaycgc3BlY2lhbCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBjYXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWZhY2UgICAgICA6OiBBIGhhbmRsZSB0byBhIG5ldyBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgQEZUX0ZhY2Ugb2JqZWN0cyBmcm9tIGZvbnRzICAgICovCi0gIC8qICAgIHRoYXQgYXJlIGluc3RhbGxlZCBpbiB0aGUgc3lzdGVtIGFzIGZvbGxvd3MuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgZm9uZCA9IEdldFJlc291cmNlKCAnRk9ORCcsIGZvbnROYW1lICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGVycm9yID0gRlRfTmV3X0ZhY2VfRnJvbV9GT05EKCBsaWJyYXJ5LCBmb25kLCAwLCAmZmFjZSApOyAgICAgICAgKi8KLSAgLyogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfTmV3X0ZhY2VfRnJvbV9GT05EKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZSAgICAgIGZvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICphZmFjZSApCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0RFUFJFQ0FURURfQVRUUklCVVRFOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0RmlsZV9Gcm9tX01hY19OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIGFuIEZTU3BlYyBmb3IgdGhlIGRpc2sgZmlsZSBjb250YWluaW5nIHRoZSBuYW1lZCBmb250LiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9udE5hbWUgICA6OiBNYWMgT1MgbmFtZSBvZiB0aGUgZm9udCAoZS5nLiwgVGltZXMgTmV3IFJvbWFuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgQm9sZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhdGhTcGVjICAgOjogRlNTcGVjIHRvIHRoZSBmaWxlLiAgRm9yIHBhc3NpbmcgdG8gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaW5kZXggOjogSW5kZXggb2YgdGhlIGZhY2UuICBGb3IgcGFzc2luZyB0byAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRGaWxlX0Zyb21fTWFjX05hbWUoIGNvbnN0IGNoYXIqICBmb250TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGU1NwZWMqICAgICAgcGF0aFNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgIGZhY2VfaW5kZXggKQotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9ERVBSRUNBVEVEX0FUVFJJQlVURTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldEZpbGVfRnJvbV9NYWNfQVRTX05hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiBhbiBGU1NwZWMgZm9yIHRoZSBkaXNrIGZpbGUgY29udGFpbmluZyB0aGUgbmFtZWQgZm9udC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvbnROYW1lICAgOjogTWFjIE9TIG5hbWUgb2YgdGhlIGZvbnQgaW4gQVRTIGZyYW1ld29yay4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhdGhTcGVjICAgOjogRlNTcGVjIHRvIHRoZSBmaWxlLiBGb3IgcGFzc2luZyB0byAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2VfaW5kZXggOjogSW5kZXggb2YgdGhlIGZhY2UuIEZvciBwYXNzaW5nIHRvICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRGaWxlX0Zyb21fTWFjX0FUU19OYW1lKCBjb25zdCBjaGFyKiAgZm9udE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlYyogICAgICBwYXRoU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgIGZhY2VfaW5kZXggKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfREVQUkVDQVRFRF9BVFRSSUJVVEU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRGaWxlUGF0aF9Gcm9tX01hY19BVFNfTmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gYSBwYXRobmFtZSBvZiB0aGUgZGlzayBmaWxlIGFuZCBmYWNlIGluZGV4IGZvciBnaXZlbiBmb250ICAgKi8KLSAgLyogICAgbmFtZSB0aGF0IGlzIGhhbmRsZWQgYnkgQVRTIGZyYW1ld29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9udE5hbWUgICAgOjogTWFjIE9TIG5hbWUgb2YgdGhlIGZvbnQgaW4gQVRTIGZyYW1ld29yay4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGF0aCAgICAgICAgOjogQnVmZmVyIHRvIHN0b3JlIHBhdGhuYW1lIG9mIHRoZSBmaWxlLiAgRm9yIHBhc3NpbmcgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHRvIEBGVF9OZXdfRmFjZS4gIFRoZSBjbGllbnQgbXVzdCBhbGxvY2F0ZSB0aGlzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBidWZmZXIgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heFBhdGhTaXplIDo6IExlbmd0aHMgb2YgdGhlIGJ1ZmZlciBgcGF0aCcgdGhhdCBjbGllbnQgYWxsb2NhdGVkLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCAgOjogSW5kZXggb2YgdGhlIGZhY2UuICBGb3IgcGFzc2luZyB0byBARlRfTmV3X0ZhY2UuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0RmlsZVBhdGhfRnJvbV9NYWNfQVRTX05hbWUoIGNvbnN0IGNoYXIqICBmb250TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQ4KiAgICAgICBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUludDMyICAgICAgIG1heFBhdGhTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgIGZhY2VfaW5kZXggKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RFUFJFQ0FURURfQVRUUklCVVRFOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTmV3X0ZhY2VfRnJvbV9GU1NwZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3JlYXRlIGEgbmV3IGZhY2Ugb2JqZWN0IGZyb20gYSBnaXZlbiByZXNvdXJjZSBhbmQgdHlwZWZhY2UgaW5kZXggICovCi0gIC8qICAgIHVzaW5nIGFuIEZTU3BlYyB0byB0aGUgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNwZWMgICAgICAgOjogRlNTcGVjIHRvIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGZhY2Ugd2l0aGluIHRoZSByZXNvdXJjZS4gIFRoZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZmlyc3QgZmFjZSBoYXMgaW5kZXh+MC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWZhY2UgICAgICA6OiBBIGhhbmRsZSB0byBhIG5ldyBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQEZUX05ld19GYWNlX0Zyb21fRlNTcGVjIGlzIGlkZW50aWNhbCB0byBARlRfTmV3X0ZhY2UgZXhjZXB0ICAgICAgICovCi0gIC8qICAgIGl0IGFjY2VwdHMgYW4gRlNTcGVjIGluc3RlYWQgb2YgYSBwYXRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX05ld19GYWNlX0Zyb21fRlNTcGVjKCBGVF9MaWJyYXJ5ICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlNTcGVjICAqc3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICphZmFjZSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfREVQUkVDQVRFRF9BVFRSSUJVVEU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZV9Gcm9tX0ZTUmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDcmVhdGUgYSBuZXcgZmFjZSBvYmplY3QgZnJvbSBhIGdpdmVuIHJlc291cmNlIGFuZCB0eXBlZmFjZSBpbmRleCAgKi8KLSAgLyogICAgdXNpbmcgYW4gRlNSZWYgdG8gdGhlIGZvbnQgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSByZXNvdXJjZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3BlYyAgICAgICA6OiBGU1JlZiB0byB0aGUgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgZmFjZSB3aXRoaW4gdGhlIHJlc291cmNlLiAgVGhlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBmaXJzdCBmYWNlIGhhcyBpbmRleH4wLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZmFjZSAgICAgIDo6IEEgaGFuZGxlIHRvIGEgbmV3IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfTmV3X0ZhY2VfRnJvbV9GU1JlZiBpcyBpZGVudGljYWwgdG8gQEZUX05ld19GYWNlIGV4Y2VwdCAgICAgICAgKi8KLSAgLyogICAgaXQgYWNjZXB0cyBhbiBGU1JlZiBpbnN0ZWFkIG9mIGEgcGF0aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfTmV3X0ZhY2VfRnJvbV9GU1JlZiggRlRfTGlicmFyeSAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGU1JlZiAgKnJlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgKmFmYWNlICkKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RFUFJFQ0FURURfQVRUUklCVVRFOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX0ZUTUFDX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdG1tLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVmNDc5OC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDM3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG1tLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgTXVsdGlwbGUgTWFzdGVyIGZvbnQgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVE1NX0hfXwotI2RlZmluZSBfX0ZUTU1fSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9UWVBFMV9UQUJMRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbXVsdGlwbGVfbWFzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTXVsdGlwbGUgTWFzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSG93IHRvIG1hbmFnZSBNdWx0aXBsZSBNYXN0ZXJzIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGZvbGxvd2luZyB0eXBlcyBhbmQgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIG1hbmFnZSBNdWx0aXBsZSAgICAgICovCi0gIC8qICAgIE1hc3RlciBmb250cywgaS5lLiwgdGhlIHNlbGVjdGlvbiBvZiBzcGVjaWZpYyBkZXNpZ24gaW5zdGFuY2VzIGJ5ICAqLwotICAvKiAgICBzZXR0aW5nIGRlc2lnbiBheGlzIGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdlb3JnZSBXaWxsaWFtcyBoYXMgZXh0ZW5kZWQgdGhpcyBpbnRlcmZhY2UgdG8gbWFrZSBpdCB3b3JrIHdpdGggICAqLwotICAvKiAgICBib3RoIFR5cGV+MSBNdWx0aXBsZSBNYXN0ZXJzIGZvbnRzIGFuZCBHWCBkaXN0b3J0YWJsZSAodmFyKSAgICAgICAgKi8KLSAgLyogICAgZm9udHMuICBTb21lIG9mIHRoZXNlIHJvdXRpbmVzIG9ubHkgd29yayB3aXRoIE1NIGZvbnRzLCBvdGhlcnMgICAgICovCi0gIC8qICAgIHdpbGwgd29yayB3aXRoIGJvdGggdHlwZXMuICBUaGV5IGFyZSBzaW1pbGFyIGVub3VnaCB0aGF0IGEgICAgICAgICAqLwotICAvKiAgICBjb25zaXN0ZW50IGludGVyZmFjZSBtYWtlcyBzZW5zZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTU1fQXhpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBnaXZlbiBheGlzIGluIGRlc2lnbiBzcGFjZSBmb3IgICovCi0gIC8qICAgIE11bHRpcGxlIE1hc3RlcnMgZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgY2FuJ3QgYmUgdXNlZCBmb3IgR1ggdmFyIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmFtZSAgICA6OiBUaGUgYXhpcydzIG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW5pbXVtIDo6IFRoZSBheGlzJ3MgbWluaW11bSBkZXNpZ24gY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heGltdW0gOjogVGhlIGF4aXMncyBtYXhpbXVtIGRlc2lnbiBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX01NX0F4aXNfCi0gIHsKLSAgICBGVF9TdHJpbmcqICBuYW1lOwotICAgIEZUX0xvbmcgICAgIG1pbmltdW07Ci0gICAgRlRfTG9uZyAgICAgbWF4aW11bTsKLQotICB9IEZUX01NX0F4aXM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NdWx0aV9NYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIHRoZSBheGVzIGFuZCBzcGFjZSBvZiBhIE11bHRpcGxlIE1hc3RlcnMgKi8KLSAgLyogICAgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHN0cnVjdHVyZSBjYW4ndCBiZSB1c2VkIGZvciBHWCB2YXIgZm9udHMuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fYXhpcyAgICA6OiBOdW1iZXIgb2YgYXhlcy4gIENhbm5vdCBleGNlZWR+NC4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9kZXNpZ25zIDo6IE51bWJlciBvZiBkZXNpZ25zOyBzaG91bGQgYmUgbm9ybWFsbHkgMl5udW1fYXhpcyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBldmVuIHRob3VnaCB0aGUgVHlwZX4xIHNwZWNpZmljYXRpb24gc3RyYW5nZWx5ICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgYWxsb3dzIGZvciBpbnRlcm1lZGlhdGUgZGVzaWducyB0byBiZSBwcmVzZW50LiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIGNhbm5vdCBleGNlZWR+MTYuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXhpcyAgICAgICAgOjogQSB0YWJsZSBvZiBheGlzIGRlc2NyaXB0b3JzLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfTXVsdGlfTWFzdGVyXwotICB7Ci0gICAgRlRfVUludCAgICAgbnVtX2F4aXM7Ci0gICAgRlRfVUludCAgICAgbnVtX2Rlc2lnbnM7Ci0gICAgRlRfTU1fQXhpcyAgYXhpc1tUMV9NQVhfTU1fQVhJU107Ci0KLSAgfSBGVF9NdWx0aV9NYXN0ZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9WYXJfQXhpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIGdpdmVuIGF4aXMgaW4gZGVzaWduIHNwYWNlIGZvciAgKi8KLSAgLyogICAgTXVsdGlwbGUgTWFzdGVycyBhbmQgR1ggdmFyIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmFtZSAgICA6OiBUaGUgYXhpcydzIG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgTm90IGFsd2F5cyBtZWFuaW5nZnVsIGZvciBHWC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWluaW11bSA6OiBUaGUgYXhpcydzIG1pbmltdW0gZGVzaWduIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZWYgICAgIDo6IFRoZSBheGlzJ3MgZGVmYXVsdCBkZXNpZ24gY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBGcmVlVHlwZSBjb21wdXRlcyBtZWFuaW5nZnVsIGRlZmF1bHQgdmFsdWVzIGZvciBNTTsgaXQgICovCi0gIC8qICAgICAgICAgICAgICAgaXMgdGhlbiBhbiBpbnRlZ2VyIHZhbHVlLCBub3QgaW4gMTYuMTYgZm9ybWF0LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4aW11bSA6OiBUaGUgYXhpcydzIG1heGltdW0gZGVzaWduIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWcgICAgIDo6IFRoZSBheGlzJ3MgdGFnICh0aGUgR1ggZXF1aXZhbGVudCB0byBgbmFtZScpLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBGcmVlVHlwZSBwcm92aWRlcyBkZWZhdWx0IHZhbHVlcyBmb3IgTU0gaWYgcG9zc2libGUuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJpZCAgIDo6IFRoZSBlbnRyeSBpbiBgbmFtZScgdGFibGUgKGFub3RoZXIgR1ggdmVyc2lvbiBvZiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBgbmFtZScpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgTm90IG1lYW5pbmdmdWwgZm9yIE1NLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1Zhcl9BeGlzXwotICB7Ci0gICAgRlRfU3RyaW5nKiAgbmFtZTsKLQotICAgIEZUX0ZpeGVkICAgIG1pbmltdW07Ci0gICAgRlRfRml4ZWQgICAgZGVmOwotICAgIEZUX0ZpeGVkICAgIG1heGltdW07Ci0KLSAgICBGVF9VTG9uZyAgICB0YWc7Ci0gICAgRlRfVUludCAgICAgc3RyaWQ7Ci0KLSAgfSBGVF9WYXJfQXhpczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Zhcl9OYW1lZF9TdHlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2ltcGxlIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgbmFtZWQgc3R5bGUgaW4gYSBHWCB2YXIgZm9udC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgY2FuJ3QgYmUgdXNlZCBmb3IgTU0gZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29vcmRzIDo6IFRoZSBkZXNpZ24gY29vcmRpbmF0ZXMgZm9yIHRoaXMgc3R5bGUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICBUaGlzIGlzIGFuIGFycmF5IHdpdGggb25lIGVudHJ5IGZvciBlYWNoIGF4aXMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyaWQgIDo6IFRoZSBlbnRyeSBpbiBgbmFtZScgdGFibGUgaWRlbnRpZnlpbmcgdGhpcyBzdHlsZS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfVmFyX05hbWVkX1N0eWxlXwotICB7Ci0gICAgRlRfRml4ZWQqICBjb29yZHM7Ci0gICAgRlRfVUludCAgICBzdHJpZDsKLQotICB9IEZUX1Zhcl9OYW1lZF9TdHlsZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01NX1ZhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgdGhlIGF4ZXMgYW5kIHNwYWNlIG9mIGEgTXVsdGlwbGUgTWFzdGVycyAqLwotICAvKiAgICBvciBHWCB2YXIgZGlzdG9ydGFibGUgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNvbWUgZmllbGRzIGFyZSBzcGVjaWZpYyB0byBvbmUgZm9ybWF0IGFuZCBub3QgdG8gdGhlIG90aGVyLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9heGlzICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGF4ZXMuICBUaGUgbWF4aW11bSB2YWx1ZSBpc340IGZvciAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgTU07IG5vIGxpbWl0IGluIEdYLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9kZXNpZ25zICAgICA6OiBUaGUgbnVtYmVyIG9mIGRlc2lnbnM7IHNob3VsZCBiZSBub3JtYWxseSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgMl5udW1fYXhpcyBmb3IgTU0gZm9udHMuICBOb3QgbWVhbmluZ2Z1bCBmb3IgR1ggKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICh3aGVyZSBldmVyeSBnbHlwaCBjb3VsZCBoYXZlIGEgZGlmZmVyZW50ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgZGVzaWducykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX25hbWVkc3R5bGVzIDo6IFRoZSBudW1iZXIgb2YgbmFtZWQgc3R5bGVzOyBvbmx5IG1lYW5pbmdmdWwgZm9yICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBHWCB0aGF0IGFsbG93cyBjZXJ0YWluIGRlc2lnbiBjb29yZGluYXRlcyB0byAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSBhIHN0cmluZyBJRCAoaW4gdGhlIGBuYW1lJyB0YWJsZSkgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGVtLiAgVGhlIGZvbnQgY2FuIHRlbGwgdGhlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICB1c2VyIHRoYXQsIGZvciBleGFtcGxlLCBXZWlnaHQ9MS41IGlzIGBCb2xkJy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXhpcyAgICAgICAgICAgIDo6IEFuIGF4aXMgZGVzY3JpcHRvciB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBHWCBmb250cyBjb250YWluIHNsaWdodGx5IG1vcmUgZGF0YSB0aGFuIE1NLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmFtZWRzdHlsZSAgICAgIDo6IEEgbmFtZWQgc3R5bGUgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBPbmx5IG1lYW5pbmdmdWwgd2l0aCBHWC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX01NX1Zhcl8KLSAgewotICAgIEZUX1VJbnQgICAgICAgICAgICAgIG51bV9heGlzOwotICAgIEZUX1VJbnQgICAgICAgICAgICAgIG51bV9kZXNpZ25zOwotICAgIEZUX1VJbnQgICAgICAgICAgICAgIG51bV9uYW1lZHN0eWxlczsKLSAgICBGVF9WYXJfQXhpcyogICAgICAgICBheGlzOwotICAgIEZUX1Zhcl9OYW1lZF9TdHlsZSogIG5hbWVkc3R5bGU7Ci0KLSAgfSBGVF9NTV9WYXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfTXVsdGlfTWFzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXRyaWV2ZSB0aGUgTXVsdGlwbGUgTWFzdGVyIGRlc2NyaXB0b3Igb2YgYSBnaXZlbiBmb250LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gY2FuJ3QgYmUgdXNlZCB3aXRoIEdYIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFtYXN0ZXIgOjogVGhlIE11bHRpcGxlIE1hc3RlcnMgZGVzY3JpcHRvci4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9NdWx0aV9NYXN0ZXIoIEZUX0ZhY2UgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX011bHRpX01hc3RlciAgKmFtYXN0ZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9NTV9WYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHJpZXZlIHRoZSBNdWx0aXBsZSBNYXN0ZXIvR1ggdmFyIGRlc2NyaXB0b3Igb2YgYSBnaXZlbiBmb250LiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFtYXN0ZXIgOjogVGhlIE11bHRpcGxlIE1hc3RlcnMvR1ggdmFyIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIEFsbG9jYXRlcyBhIGRhdGEgc3RydWN0dXJlLCB3aGljaCB0aGUgdXNlciBtdXN0IGZyZWUuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfTU1fVmFyKCBGVF9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgRlRfTU1fVmFyKiAgKmFtYXN0ZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9NTV9EZXNpZ25fQ29vcmRpbmF0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZvciBNdWx0aXBsZSBNYXN0ZXJzIGZvbnRzLCBjaG9vc2UgYW4gaW50ZXJwb2xhdGVkIGZvbnQgZGVzaWduICAgICAqLwotICAvKiAgICB0aHJvdWdoIGRlc2lnbiBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gY2FuJ3QgYmUgdXNlZCB3aXRoIEdYIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9jb29yZHMgOjogVGhlIG51bWJlciBvZiBhdmFpbGFibGUgZGVzaWduIGNvb3JkaW5hdGVzLiAgSWYgaXQgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGlzIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcywgaWdub3JlIHRoZSBleGNlc3MgKi8KLSAgLyogICAgICAgICAgICAgICAgICB2YWx1ZXMuICBJZiBpdCBpcyBzbWFsbGVyIHRoYW4gdGhlIG51bWJlciBvZiBheGVzLCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgdXNlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgcmVtYWluaW5nIGF4ZXMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29vcmRzICAgICA6OiBBbiBhcnJheSBvZiBkZXNpZ24gY29vcmRpbmF0ZXMuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU2V0X01NX0Rlc2lnbl9Db29yZGluYXRlcyggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgY29vcmRzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGb3IgTXVsdGlwbGUgTWFzdGVyIG9yIEdYIFZhciBmb250cywgY2hvb3NlIGFuIGludGVycG9sYXRlZCBmb250ICAgKi8KLSAgLyogICAgZGVzaWduIHRocm91Z2ggZGVzaWduIGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2Nvb3JkcyA6OiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBkZXNpZ24gY29vcmRpbmF0ZXMuICBJZiBpdCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgaXMgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBheGVzLCBpZ25vcmUgdGhlIGV4Y2VzcyAqLwotICAvKiAgICAgICAgICAgICAgICAgIHZhbHVlcy4gIElmIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF4ZXMsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB1c2UgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSByZW1haW5pbmcgYXhlcy4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb29yZHMgICAgIDo6IEFuIGFycmF5IG9mIGRlc2lnbiBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TZXRfVmFyX0Rlc2lnbl9Db29yZGluYXRlcyggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9NTV9CbGVuZF9Db29yZGluYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZvciBNdWx0aXBsZSBNYXN0ZXJzIGFuZCBHWCB2YXIgZm9udHMsIGNob29zZSBhbiBpbnRlcnBvbGF0ZWQgZm9udCAqLwotICAvKiAgICBkZXNpZ24gdGhyb3VnaCBub3JtYWxpemVkIGJsZW5kIGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fY29vcmRzIDo6IFRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGRlc2lnbiBjb29yZGluYXRlcy4gIElmIGl0ICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBpcyBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF4ZXMsIGlnbm9yZSB0aGUgZXhjZXNzICovCi0gIC8qICAgICAgICAgICAgICAgICAgdmFsdWVzLiAgSWYgaXQgaXMgc21hbGxlciB0aGFuIHRoZSBudW1iZXIgb2YgYXhlcywgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHVzZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlIHJlbWFpbmluZyBheGVzLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvb3JkcyAgICAgOjogVGhlIGRlc2lnbiBjb29yZGluYXRlcyBhcnJheSAoZWFjaCBlbGVtZW50IG11c3QgYmUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGJldHdlZW4gMCBhbmQgMS4wKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TZXRfTU1fQmxlbmRfQ29vcmRpbmF0ZXMoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9WYXJfQmxlbmRfQ29vcmRpbmF0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgaXMgYW5vdGhlciBuYW1lIG9mIEBGVF9TZXRfTU1fQmxlbmRfQ29vcmRpbmF0ZXMuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1NldF9WYXJfQmxlbmRfQ29vcmRpbmF0ZXMoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVE1NX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdG1vZGFwaS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdG1vZGFwaS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDQyNzlhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRtb2RhcGkuaAorKysgL2Rldi9udWxsCkBAIC0xLDY2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG1vZGFwaS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgbW9kdWxlcyBwdWJsaWMgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVE1PREFQSV9IX18KLSNkZWZpbmUgX19GVE1PREFQSV9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGVfbWFuYWdlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBNb2R1bGUgTWFuYWdlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIb3cgdG8gYWRkLCB1cGdyYWRlLCByZW1vdmUsIGFuZCBjb250cm9sIG1vZHVsZXMgZnJvbSBGcmVlVHlwZS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZGVmaW5pdGlvbnMgYmVsb3cgYXJlIHVzZWQgdG8gbWFuYWdlIG1vZHVsZXMgd2l0aGluIEZyZWVUeXBlLiAgKi8KLSAgLyogICAgTW9kdWxlcyBjYW4gYmUgYWRkZWQsIHVwZ3JhZGVkLCBhbmQgcmVtb3ZlZCBhdCBydW50aW1lLiAgICAgICAgICAgICovCi0gIC8qICAgIEFkZGl0aW9uYWxseSwgc29tZSBtb2R1bGUgcHJvcGVydGllcyBjYW4gYmUgY29udHJvbGxlZCBhbHNvLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSGVyZSBpcyBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzIG9mIHRoZSBgbW9kdWxlX25hbWUnIGZpZWxkIGluICAgICovCi0gIC8qICAgIHRoZSBARlRfTW9kdWxlX0NsYXNzIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgYXV0b2ZpdHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGJkZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBjZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgZ3h2YWxpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIG90dmFsaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBwY2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgcGZyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHBzYXV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBwc2hpbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgcHNuYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHJhc3RlcjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBzZm50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgc21vb3RoLCBzbW9vdGgtbGNkLCBzbW9vdGgtbGNkdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHRydWV0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB0eXBlMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgdHlwZTQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHQxY2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICB3aW5mb250cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90ZSB0aGF0IHRoZSBGcmVlVHlwZSBDYWNoZSBzdWItc3lzdGVtIGlzIG5vdCBhIEZyZWVUeXBlIG1vZHVsZS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZV9Db25zdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGVfRGVzdHJ1Y3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTW9kdWxlX1JlcXVlc3RlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZV9DbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQWRkX01vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9Nb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZW1vdmVfTW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQWRkX0RlZmF1bHRfTW9kdWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Qcm9wZXJ0eV9TZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUHJvcGVydHlfR2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfTGlicmFyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9MaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlZmVyZW5jZV9MaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVuZGVyZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1JlbmRlcmVyX0NsYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1JlbmRlcmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NldF9SZW5kZXJlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X0RlYnVnX0hvb2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIG1vZHVsZSBiaXQgZmxhZ3MgKi8KLSNkZWZpbmUgRlRfTU9EVUxFX0ZPTlRfRFJJVkVSICAgICAgICAgMSAgLyogdGhpcyBtb2R1bGUgaXMgYSBmb250IGRyaXZlciAgKi8KLSNkZWZpbmUgRlRfTU9EVUxFX1JFTkRFUkVSICAgICAgICAgICAgMiAgLyogdGhpcyBtb2R1bGUgaXMgYSByZW5kZXJlciAgICAgKi8KLSNkZWZpbmUgRlRfTU9EVUxFX0hJTlRFUiAgICAgICAgICAgICAgNCAgLyogdGhpcyBtb2R1bGUgaXMgYSBnbHlwaCBoaW50ZXIgKi8KLSNkZWZpbmUgRlRfTU9EVUxFX1NUWUxFUiAgICAgICAgICAgICAgOCAgLyogdGhpcyBtb2R1bGUgaXMgYSBzdHlsZXIgICAgICAgKi8KLQotI2RlZmluZSBGVF9NT0RVTEVfRFJJVkVSX1NDQUxBQkxFICAgICAweDEwMCAgIC8qIHRoZSBkcml2ZXIgc3VwcG9ydHMgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNjYWxhYmxlIGZvbnRzICAgICAgICAgICAqLwotI2RlZmluZSBGVF9NT0RVTEVfRFJJVkVSX05PX09VVExJTkVTICAweDIwMCAgIC8qIHRoZSBkcml2ZXIgZG9lcyBub3QgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1cHBvcnQgdmVjdG9yIG91dGxpbmVzICAqLwotI2RlZmluZSBGVF9NT0RVTEVfRFJJVkVSX0hBU19ISU5URVIgICAweDQwMCAgIC8qIHRoZSBkcml2ZXIgcHJvdmlkZXMgaXRzICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG93biBoaW50ZXIgICAgICAgICAgICAgICAqLwotCi0KLSAgLyogZGVwcmVjYXRlZCB2YWx1ZXMgKi8KLSNkZWZpbmUgZnRfbW9kdWxlX2ZvbnRfZHJpdmVyICAgICAgICAgRlRfTU9EVUxFX0ZPTlRfRFJJVkVSCi0jZGVmaW5lIGZ0X21vZHVsZV9yZW5kZXJlciAgICAgICAgICAgIEZUX01PRFVMRV9SRU5ERVJFUgotI2RlZmluZSBmdF9tb2R1bGVfaGludGVyICAgICAgICAgICAgICBGVF9NT0RVTEVfSElOVEVSCi0jZGVmaW5lIGZ0X21vZHVsZV9zdHlsZXIgICAgICAgICAgICAgIEZUX01PRFVMRV9TVFlMRVIKLQotI2RlZmluZSBmdF9tb2R1bGVfZHJpdmVyX3NjYWxhYmxlICAgICBGVF9NT0RVTEVfRFJJVkVSX1NDQUxBQkxFCi0jZGVmaW5lIGZ0X21vZHVsZV9kcml2ZXJfbm9fb3V0bGluZXMgIEZUX01PRFVMRV9EUklWRVJfTk9fT1VUTElORVMKLSNkZWZpbmUgZnRfbW9kdWxlX2RyaXZlcl9oYXNfaGludGVyICAgRlRfTU9EVUxFX0RSSVZFUl9IQVNfSElOVEVSCi0KLQotICB0eXBlZGVmIEZUX1BvaW50ZXIgIEZUX01vZHVsZV9JbnRlcmZhY2U7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGVfQ29uc3RydWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gaW5pdGlhbGl6ZSAobm90IGNyZWF0ZSkgYSBuZXcgbW9kdWxlIG9iamVjdC4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGUgOjogVGhlIG1vZHVsZSB0byBpbml0aWFsaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9Nb2R1bGVfQ29uc3RydWN0b3IpKCBGVF9Nb2R1bGUgIG1vZHVsZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTW9kdWxlX0Rlc3RydWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBmdW5jdGlvbiB1c2VkIHRvIGZpbmFsaXplIChub3QgZGVzdHJveSkgYSBnaXZlbiBtb2R1bGUgb2JqZWN0LiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlIDo6IFRoZSBtb2R1bGUgdG8gZmluYWxpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9Nb2R1bGVfRGVzdHJ1Y3RvcikoIEZUX01vZHVsZSAgbW9kdWxlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGVfUmVxdWVzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gcXVlcnkgYSBnaXZlbiBtb2R1bGUgZm9yIGEgc3BlY2lmaWMgaW50ZXJmYWNlLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGUgOjogVGhlIG1vZHVsZSB0byBiZSBzZWFyY2hlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5hbWUgOjogICBUaGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIGluIHRoZSBtb2R1bGUuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9Nb2R1bGVfSW50ZXJmYWNlCi0gICgqRlRfTW9kdWxlX1JlcXVlc3RlcikoIEZUX01vZHVsZSAgICBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBuYW1lICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGVfQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbW9kdWxlIGNsYXNzIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGVfZmxhZ3MgICAgOjogQml0IGZsYWdzIGRlc2NyaWJpbmcgdGhlIG1vZHVsZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZV9zaXplICAgICA6OiBUaGUgc2l6ZSBvZiBvbmUgbW9kdWxlIG9iamVjdC9pbnN0YW5jZSBpbiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZV9uYW1lICAgICA6OiBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX3ZlcnNpb24gIDo6IFRoZSB2ZXJzaW9uLCBhcyBhIDE2LjE2IGZpeGVkIG51bWJlciAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAobWFqb3IubWlub3IpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX3JlcXVpcmVzIDo6IFRoZSB2ZXJzaW9uIG9mIEZyZWVUeXBlIHRoaXMgbW9kdWxlIHJlcXVpcmVzLCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBhcyBhIDE2LjE2IGZpeGVkIG51bWJlciAobWFqb3IubWlub3IpLiAgU3RhcnRzICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgYXQgdmVyc2lvbiAyLjAsIGkuZS4sIDB4MjAwMDAuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZV9pbml0ICAgICA6OiBUaGUgaW5pdGlhbGl6aW5nIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX2RvbmUgICAgIDo6IFRoZSBmaW5hbGl6aW5nIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnZXRfaW50ZXJmYWNlICAgOjogVGhlIGludGVyZmFjZSByZXF1ZXN0aW5nIGZ1bmN0aW9uLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9Nb2R1bGVfQ2xhc3NfCi0gIHsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgIG1vZHVsZV9mbGFnczsKLSAgICBGVF9Mb25nICAgICAgICAgICAgICAgIG1vZHVsZV9zaXplOwotICAgIGNvbnN0IEZUX1N0cmluZyogICAgICAgbW9kdWxlX25hbWU7Ci0gICAgRlRfRml4ZWQgICAgICAgICAgICAgICBtb2R1bGVfdmVyc2lvbjsKLSAgICBGVF9GaXhlZCAgICAgICAgICAgICAgIG1vZHVsZV9yZXF1aXJlczsKLQotICAgIGNvbnN0IHZvaWQqICAgICAgICAgICAgbW9kdWxlX2ludGVyZmFjZTsKLQotICAgIEZUX01vZHVsZV9Db25zdHJ1Y3RvciAgbW9kdWxlX2luaXQ7Ci0gICAgRlRfTW9kdWxlX0Rlc3RydWN0b3IgICBtb2R1bGVfZG9uZTsKLSAgICBGVF9Nb2R1bGVfUmVxdWVzdGVyICAgIGdldF9pbnRlcmZhY2U7Ci0KLSAgfSBGVF9Nb2R1bGVfQ2xhc3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BZGRfTW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBZGQgYSBuZXcgbW9kdWxlIHRvIGEgZ2l2ZW4gbGlicmFyeSBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjbGF6eiAgIDo6IEEgcG9pbnRlciB0byBjbGFzcyBkZXNjcmlwdG9yIGZvciB0aGUgbW9kdWxlLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgbW9kdWxlIGFscmVhZHkgZXhpc3RzIGJ5IHRoYXQgbmFtZSwgKi8KLSAgLyogICAgb3IgaWYgdGhlIG1vZHVsZSByZXF1aXJlcyBhIHZlcnNpb24gb2YgRnJlZVR5cGUgdGhhdCBpcyB0b28gZ3JlYXQuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfQWRkX01vZHVsZSggRlRfTGlicmFyeSAgICAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgY29uc3QgRlRfTW9kdWxlX0NsYXNzKiAgY2xhenogKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9Nb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmQgYSBtb2R1bGUgYnkgaXRzIG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX25hbWUgOjogVGhlIG1vZHVsZSdzIG5hbWUgKGFzIGFuIEFTQ0lJIHN0cmluZykuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBtb2R1bGUgaGFuZGxlLiAgMH5pZiBub25lIHdhcyBmb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUncyBpbnRlcm5hbCBtb2R1bGVzIGFyZW4ndCBkb2N1bWVudGVkIHZlcnkgd2VsbCwgYW5kIHlvdSAgICovCi0gIC8qICAgIHNob3VsZCBsb29rIHVwIHRoZSBzb3VyY2UgY29kZSBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9Nb2R1bGUgKQotICBGVF9HZXRfTW9kdWxlKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIG1vZHVsZV9uYW1lICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZW1vdmVfTW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZW1vdmUgYSBnaXZlbiBtb2R1bGUgZnJvbSBhIGxpYnJhcnkgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGUgIDo6IEEgaGFuZGxlIHRvIGEgbW9kdWxlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbW9kdWxlIG9iamVjdCBpcyBkZXN0cm95ZWQgYnkgdGhlIGZ1bmN0aW9uIGluIGNhc2Ugb2Ygc3VjY2Vzcy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9SZW1vdmVfTW9kdWxlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGUgICBtb2R1bGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICAgRlRfUHJvcGVydHlfU2V0Ci0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICAgU2V0IGEgcHJvcGVydHkgZm9yIGEgZ2l2ZW4gbW9kdWxlLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgIGxpYnJhcnkgOjoKLSAgICogICAgICAgQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgdGhlIG1vZHVsZSBpcyBwYXJ0IG9mLgotICAgKgotICAgKiAgICBtb2R1bGVfbmFtZSA6OgotICAgKiAgICAgICBUaGUgbW9kdWxlIG5hbWUuCi0gICAqCi0gICAqICAgIHByb3BlcnR5X25hbWUgOjoKLSAgICogICAgICAgVGhlIHByb3BlcnR5IG5hbWUuICBQcm9wZXJ0aWVzIGFyZSBkZXNjcmliZWQgaW4gdGhlIGBTeW5vcHNpcycKLSAgICogICAgICAgc3Vic2VjdGlvbiBvZiB0aGUgbW9kdWxlJ3MgZG9jdW1lbnRhdGlvbi4KLSAgICoKLSAgICogICAgICAgTm90ZSB0aGF0IG9ubHkgYSBmZXcgbW9kdWxlcyBoYXZlIHByb3BlcnRpZXMuCi0gICAqCi0gICAqICAgIHZhbHVlIDo6Ci0gICAqICAgICAgIEEgZ2VuZXJpYyBwb2ludGVyIHRvIGEgdmFyaWFibGUgb3Igc3RydWN0dXJlIHRoYXQgZ2l2ZXMgdGhlIG5ldwotICAgKiAgICAgICB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuICBUaGUgZXhhY3QgZGVmaW5pdGlvbiBvZiBgdmFsdWUnIGlzCi0gICAqICAgICAgIGRlcGVuZGVudCBvbiB0aGUgcHJvcGVydHk7IHNlZSB0aGUgYFN5bm9wc2lzJyBzdWJzZWN0aW9uIG9mIHRoZQotICAgKiAgICAgICBtb2R1bGUncyBkb2N1bWVudGF0aW9uLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgICBJZiBgbW9kdWxlX25hbWUnIGlzbid0IGEgdmFsaWQgbW9kdWxlIG5hbWUsIG9yIGBwcm9wZXJ0eV9uYW1lJwotICAgKiAgICBkb2Vzbid0IHNwZWNpZnkgYSB2YWxpZCBwcm9wZXJ0eSwgb3IgaWYgYHZhbHVlJyBkb2Vzbid0IHJlcHJlc2VudCBhCi0gICAqICAgIHZhbGlkIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHksIGFuIGVycm9yIGlzIHJldHVybmVkLgotICAgKgotICAgKiAgICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2V0cyBwcm9wZXJ0eSBgYmFyJyAoYSBzaW1wbGUgaW50ZWdlcikgaW4KLSAgICogICAgbW9kdWxlIGBmb28nIHRvIHZhbHVlfjEuCi0gICAqCi0gICAqICAgIHsKLSAgICogICAgICBGVF9VSW50ICBiYXI7Ci0gICAqCi0gICAqCi0gICAqICAgICAgYmFyID0gMTsKLSAgICogICAgICBGVF9Qcm9wZXJ0eV9TZXQoIGxpYnJhcnksICJmb28iLCAiYmFyIiwgJmJhciApOwotICAgKiAgICB9Ci0gICAqCi0gICAqICAgIE5vdGUgdGhhdCB0aGUgRnJlZVR5cGUgQ2FjaGUgc3ViLXN5c3RlbSBkb2Vzbid0IHJlY29nbml6ZSBtb2R1bGUKLSAgICogICAgcHJvcGVydHkgY2hhbmdlcy4gIFRvIGF2b2lkIGdseXBoIGxvb2t1cCBjb25mdXNpb24gd2l0aGluIHRoZSBjYWNoZQotICAgKiAgICB5b3Ugc2hvdWxkIGNhbGwgQEZUQ19NYW5hZ2VyX1Jlc2V0IHRvIGNvbXBsZXRlbHkgZmx1c2ggdGhlIGNhY2hlIGlmCi0gICAqICAgIGEgbW9kdWxlIHByb3BlcnR5IGdldHMgY2hhbmdlZCBhZnRlciBARlRDX01hbmFnZXJfTmV3IGhhcyBiZWVuCi0gICAqICAgIGNhbGxlZC4KLSAgICoKLSAgICogICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIHNldCBwcm9wZXJ0aWVzIG9mIHRoZSBGcmVlVHlwZSBDYWNoZQotICAgKiAgICBzdWItc3lzdGVtIGl0c2VsZiB3aXRoIEZUX1Byb3BlcnR5X1NldDsgdXNlIEBGVENfUHJvcGVydHlfU2V0Ci0gICAqICAgIGluc3RlYWQuCi0gICAqCi0gICAqICBAc2luY2U6Ci0gICAqICAgIDIuNC4xMQotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1Byb3BlcnR5X1NldCggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBtb2R1bGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBwcm9wZXJ0eV9uYW1lLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqICAgICAgIHZhbHVlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgIEZUX1Byb3BlcnR5X0dldAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgIEdldCBhIG1vZHVsZSdzIHByb3BlcnR5IHZhbHVlLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgIGxpYnJhcnkgOjoKLSAgICogICAgICAgQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgdGhlIG1vZHVsZSBpcyBwYXJ0IG9mLgotICAgKgotICAgKiAgICBtb2R1bGVfbmFtZSA6OgotICAgKiAgICAgICBUaGUgbW9kdWxlIG5hbWUuCi0gICAqCi0gICAqICAgIHByb3BlcnR5X25hbWUgOjoKLSAgICogICAgICAgVGhlIHByb3BlcnR5IG5hbWUuICBQcm9wZXJ0aWVzIGFyZSBkZXNjcmliZWQgaW4gdGhlIGBTeW5vcHNpcycKLSAgICogICAgICAgc3Vic2VjdGlvbiBvZiB0aGUgbW9kdWxlJ3MgZG9jdW1lbnRhdGlvbi4KLSAgICoKLSAgICogQGlub3V0OgotICAgKiAgICB2YWx1ZSA6OgotICAgKiAgICAgICBBIGdlbmVyaWMgcG9pbnRlciB0byBhIHZhcmlhYmxlIG9yIHN0cnVjdHVyZSB0aGF0IGdpdmVzIHRoZQotICAgKiAgICAgICB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuICBUaGUgZXhhY3QgZGVmaW5pdGlvbiBvZiBgdmFsdWUnIGlzCi0gICAqICAgICAgIGRlcGVuZGVudCBvbiB0aGUgcHJvcGVydHk7IHNlZSB0aGUgYFN5bm9wc2lzJyBzdWJzZWN0aW9uIG9mIHRoZQotICAgKiAgICAgICBtb2R1bGUncyBkb2N1bWVudGF0aW9uLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgICBJZiBgbW9kdWxlX25hbWUnIGlzbid0IGEgdmFsaWQgbW9kdWxlIG5hbWUsIG9yIGBwcm9wZXJ0eV9uYW1lJwotICAgKiAgICBkb2Vzbid0IHNwZWNpZnkgYSB2YWxpZCBwcm9wZXJ0eSwgb3IgaWYgYHZhbHVlJyBkb2Vzbid0IHJlcHJlc2VudCBhCi0gICAqICAgIHZhbGlkIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHksIGFuIGVycm9yIGlzIHJldHVybmVkLgotICAgKgotICAgKiAgICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZ2V0cyBwcm9wZXJ0eSBgYmF6JyAoYSByYW5nZSkgaW4gbW9kdWxlIGBmb28nLgotICAgKgotICAgKiAgICB7Ci0gICAqICAgICAgdHlwZWRlZiAgcmFuZ2VfCi0gICAqICAgICAgewotICAgKiAgICAgICAgRlRfSW50MzIgIG1pbjsKLSAgICogICAgICAgIEZUX0ludDMyICBtYXg7Ci0gICAqCi0gICAqICAgICAgfSByYW5nZTsKLSAgICoKLSAgICogICAgICByYW5nZSAgYmF6OwotICAgKgotICAgKgotICAgKiAgICAgIEZUX1Byb3BlcnR5X0dldCggbGlicmFyeSwgImZvbyIsICJiYXoiLCAmYmF6ICk7Ci0gICAqICAgIH0KLSAgICoKLSAgICogICAgSXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIHByb3BlcnRpZXMgb2YgdGhlIEZyZWVUeXBlIENhY2hlCi0gICAqICAgIHN1Yi1zeXN0ZW0gd2l0aCBGVF9Qcm9wZXJ0eV9HZXQ7IHVzZSBARlRDX1Byb3BlcnR5X0dldCBpbnN0ZWFkLgotICAgKgotICAgKiAgQHNpbmNlOgotICAgKiAgICAyLjQuMTEKLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9Qcm9wZXJ0eV9HZXQoIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgbW9kdWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgcHJvcGVydHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICB2YWx1ZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmVmZXJlbmNlX0xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBjb3VudGVyIGdldHMgaW5pdGlhbGl6ZWQgdG9+MSBhdCB0aGUgdGltZSBhbiBARlRfTGlicmFyeSAgICAgICAgICovCi0gIC8qICAgIHN0cnVjdHVyZSBpcyBjcmVhdGVkLiAgVGhpcyBmdW5jdGlvbiBpbmNyZW1lbnRzIHRoZSBjb3VudGVyLiAgICAgICAqLwotICAvKiAgICBARlRfRG9uZV9MaWJyYXJ5IHRoZW4gb25seSBkZXN0cm95cyBhIGxpYnJhcnkgaWYgdGhlIGNvdW50ZXIgaXN+MSwgKi8KLSAgLyogICAgb3RoZXJ3aXNlIGl0IHNpbXBseSBkZWNyZW1lbnRzIHRoZSBjb3VudGVyLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGhlbHBzIGluIG1hbmFnaW5nIGxpZmUtY3ljbGVzIG9mIHN0cnVjdHVyZXMgdGhhdCAgICAgKi8KLSAgLyogICAgcmVmZXJlbmNlIEBGVF9MaWJyYXJ5IG9iamVjdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2luY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgMi40LjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfUmVmZXJlbmNlX0xpYnJhcnkoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX05ld19MaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgRnJlZVR5cGUgbGlicmFyeSBpbnN0YW5jZSAgICAqLwotICAvKiAgICBmcm9tIGEgZ2l2ZW4gbWVtb3J5IG9iamVjdC4gIEl0IGlzIHRodXMgcG9zc2libGUgdG8gdXNlIGxpYnJhcmllcyAgKi8KLSAgLyogICAgd2l0aCBkaXN0aW5jdCBtZW1vcnkgYWxsb2NhdG9ycyB3aXRoaW4gdGhlIHNhbWUgcHJvZ3JhbS4gIE5vdGUsICAgICovCi0gIC8qICAgIGhvd2V2ZXIsIHRoYXQgdGhlIHVzZWQgQEZUX01lbW9yeSBzdHJ1Y3R1cmUgaXMgZXhwZWN0ZWQgdG8gcmVtYWluICAqLwotICAvKiAgICB2YWxpZCBmb3IgdGhlIGxpZmUgb2YgdGhlIEBGVF9MaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vcm1hbGx5LCB5b3Ugd291bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIChmb2xsb3dlZCBieSBhIGNhbGwgdG8gICAgICAqLwotICAvKiAgICBARlRfQWRkX0RlZmF1bHRfTW9kdWxlcyBvciBhIHNlcmllcyBvZiBjYWxscyB0byBARlRfQWRkX01vZHVsZSkgICAgKi8KLSAgLyogICAgaW5zdGVhZCBvZiBARlRfSW5pdF9GcmVlVHlwZSB0byBpbml0aWFsaXplIHRoZSBGcmVlVHlwZSBsaWJyYXJ5LiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEb24ndCB1c2UgQEZUX0RvbmVfRnJlZVR5cGUgYnV0IEBGVF9Eb25lX0xpYnJhcnkgdG8gZGVzdHJveSBhICAgICAgKi8KLSAgLyogICAgbGlicmFyeSBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgOjogQSBoYW5kbGUgdG8gdGhlIG9yaWdpbmFsIG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWxpYnJhcnkgOjogQSBwb2ludGVyIHRvIGhhbmRsZSBvZiBhIG5ldyBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlIHRoZSBkaXNjdXNzaW9uIG9mIHJlZmVyZW5jZSBjb3VudGVycyBpbiB0aGUgZGVzY3JpcHRpb24gb2YgICAgICovCi0gIC8qICAgIEBGVF9SZWZlcmVuY2VfTGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX05ld19MaWJyYXJ5KCBGVF9NZW1vcnkgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgRlRfTGlicmFyeSAgKmFsaWJyYXJ5ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Eb25lX0xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEaXNjYXJkIGEgZ2l2ZW4gbGlicmFyeSBvYmplY3QuICBUaGlzIGNsb3NlcyBhbGwgZHJpdmVycyBhbmQgICAgICAgKi8KLSAgLyogICAgZGlzY2FyZHMgYWxsIHJlc291cmNlIG9iamVjdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VlIHRoZSBkaXNjdXNzaW9uIG9mIHJlZmVyZW5jZSBjb3VudGVycyBpbiB0aGUgZGVzY3JpcHRpb24gb2YgICAgICovCi0gIC8qICAgIEBGVF9SZWZlcmVuY2VfTGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0RvbmVfTGlicmFyeSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0gIC8qICovCi0KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfRGVidWdIb29rX0Z1bmMpKCB2b2lkKiAgYXJnICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZXRfRGVidWdfSG9vayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZXQgYSBkZWJ1ZyBob29rIGZ1bmN0aW9uIGZvciBkZWJ1Z2dpbmcgdGhlIGludGVycHJldGVyIG9mIGEgZm9udCAgKi8KLSAgLyogICAgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9va19pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGRlYnVnIGhvb2suICBZb3Ugc2hvdWxkIHVzZSB0aGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgdmFsdWVzIGRlZmluZWQgaW4gYGZ0b2Jqcy5oJywgZS5nLiwgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGBGVF9ERUJVR19IT09LX1RSVUVUWVBFJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlYnVnX2hvb2sgOjogVGhlIGZ1bmN0aW9uIHVzZWQgdG8gZGVidWcgdGhlIGludGVycHJldGVyLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEN1cnJlbnRseSwgZm91ciBkZWJ1ZyBob29rIHNsb3RzIGFyZSBhdmFpbGFibGUsIGJ1dCBvbmx5IHR3byAoZm9yICAqLwotICAvKiAgICB0aGUgVHJ1ZVR5cGUgYW5kIHRoZSBUeXBlfjEgaW50ZXJwcmV0ZXIpIGFyZSBkZWZpbmVkLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNpbmNlIHRoZSBpbnRlcm5hbCBoZWFkZXJzIG9mIEZyZWVUeXBlIGFyZSBubyBsb25nZXIgaW5zdGFsbGVkLCAgICAqLwotICAvKiAgICB0aGUgc3ltYm9sIGBGVF9ERUJVR19IT09LX1RSVUVUWVBFJyBpc24ndCBhdmFpbGFibGUgcHVibGljbHkuICAgICAgKi8KLSAgLyogICAgVGhpcyBpcyBhIGJ1ZyBhbmQgd2lsbCBiZSBmaXhlZCBpbiBhIGZvcnRoY29taW5nIHJlbGVhc2UuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9TZXRfRGVidWdfSG9vayggRlRfTGlicmFyeSAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgaG9va19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0RlYnVnSG9va19GdW5jICBkZWJ1Z19ob29rICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BZGRfRGVmYXVsdF9Nb2R1bGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBZGQgdGhlIHNldCBvZiBkZWZhdWx0IGRyaXZlcnMgdG8gYSBnaXZlbiBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBpcyBvbmx5IHVzZWZ1bCB3aGVuIHlvdSBjcmVhdGUgYSBsaWJyYXJ5IG9iamVjdCB3aXRoICAgICAgICAgICovCi0gIC8qICAgIEBGVF9OZXdfTGlicmFyeSAodXN1YWxseSB0byBwbHVnIGEgY3VzdG9tIG1lbW9yeSBtYW5hZ2VyKS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gYSBuZXcgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfQWRkX0RlZmF1bHRfTW9kdWxlcyggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHNlY3Rpb246Ci0gICAqICAgdHJ1ZXR5cGVfZW5naW5lCi0gICAqCi0gICAqIEB0aXRsZToKLSAgICogICBUaGUgVHJ1ZVR5cGUgRW5naW5lCi0gICAqCi0gICAqIEBhYnN0cmFjdDoKLSAgICogICBUcnVlVHlwZSBieXRlY29kZSBzdXBwb3J0LgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGEgZnVuY3Rpb24gdXNlZCB0byBxdWVyeSB0aGUgbGV2ZWwgb2YgVHJ1ZVR5cGUKLSAgICogICBieXRlY29kZSBzdXBwb3J0IGNvbXBpbGVkIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4KLSAgICoKLSAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogIEBlbnVtOgotICAgKiAgICAgRlRfVHJ1ZVR5cGVFbmdpbmVUeXBlCi0gICAqCi0gICAqICBAZGVzY3JpcHRpb246Ci0gICAqICAgICBBIGxpc3Qgb2YgdmFsdWVzIGRlc2NyaWJpbmcgd2hpY2gga2luZCBvZiBUcnVlVHlwZSBieXRlY29kZQotICAgKiAgICAgZW5naW5lIGlzIGltcGxlbWVudGVkIGluIGEgZ2l2ZW4gRlRfTGlicmFyeSBpbnN0YW5jZS4gIEl0IGlzIHVzZWQKLSAgICogICAgIGJ5IHRoZSBARlRfR2V0X1RydWVUeXBlX0VuZ2luZV9UeXBlIGZ1bmN0aW9uLgotICAgKgotICAgKiAgQHZhbHVlczoKLSAgICogICAgIEZUX1RSVUVUWVBFX0VOR0lORV9UWVBFX05PTkUgOjoKLSAgICogICAgICAgVGhlIGxpYnJhcnkgZG9lc24ndCBpbXBsZW1lbnQgYW55IGtpbmQgb2YgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIuCi0gICAqCi0gICAqICAgICBGVF9UUlVFVFlQRV9FTkdJTkVfVFlQRV9VTlBBVEVOVEVEIDo6Ci0gICAqICAgICAgIFRoZSBsaWJyYXJ5IGltcGxlbWVudHMgYSBieXRlY29kZSBpbnRlcnByZXRlciB0aGF0IGRvZXNuJ3QKLSAgICogICAgICAgc3VwcG9ydCB0aGUgcGF0ZW50ZWQgb3BlcmF0aW9ucyBvZiB0aGUgVHJ1ZVR5cGUgdmlydHVhbCBtYWNoaW5lLgotICAgKgotICAgKiAgICAgICBJdHMgbWFpbiB1c2UgaXMgdG8gbG9hZCBjZXJ0YWluIEFzaWFuIGZvbnRzIHRoYXQgcG9zaXRpb24gYW5kCi0gICAqICAgICAgIHNjYWxlIGdseXBoIGNvbXBvbmVudHMgd2l0aCBieXRlY29kZSBpbnN0cnVjdGlvbnMuICBJdCBwcm9kdWNlcwotICAgKiAgICAgICBiYWQgb3V0cHV0IGZvciBtb3N0IG90aGVyIGZvbnRzLgotICAgKgotICAgKiAgICAgRlRfVFJVRVRZUEVfRU5HSU5FX1RZUEVfUEFURU5URUQgOjoKLSAgICogICAgICAgVGhlIGxpYnJhcnkgaW1wbGVtZW50cyBhIGJ5dGVjb2RlIGludGVycHJldGVyIHRoYXQgY292ZXJzCi0gICAqICAgICAgIHRoZSBmdWxsIGluc3RydWN0aW9uIHNldCBvZiB0aGUgVHJ1ZVR5cGUgdmlydHVhbCBtYWNoaW5lICh0aGlzCi0gICAqICAgICAgIHdhcyBnb3Zlcm5lZCBieSBwYXRlbnRzIHVudGlsIE1heSAyMDEwLCBoZW5jZSB0aGUgbmFtZSkuCi0gICAqCi0gICAqICBAc2luY2U6Ci0gICAqICAgICAyLjIKLSAgICoKLSAgICovCi0gIHR5cGVkZWYgZW51bSAgRlRfVHJ1ZVR5cGVFbmdpbmVUeXBlXwotICB7Ci0gICAgRlRfVFJVRVRZUEVfRU5HSU5FX1RZUEVfTk9ORSA9IDAsCi0gICAgRlRfVFJVRVRZUEVfRU5HSU5FX1RZUEVfVU5QQVRFTlRFRCwKLSAgICBGVF9UUlVFVFlQRV9FTkdJTkVfVFlQRV9QQVRFTlRFRAotCi0gIH0gRlRfVHJ1ZVR5cGVFbmdpbmVUeXBlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqICBAZnVuYzoKLSAgICogICAgIEZUX0dldF9UcnVlVHlwZV9FbmdpbmVfVHlwZQotICAgKgotICAgKiAgQGRlc2NyaXB0aW9uOgotICAgKiAgICAgUmV0dXJuIGFuIEBGVF9UcnVlVHlwZUVuZ2luZVR5cGUgdmFsdWUgdG8gaW5kaWNhdGUgd2hpY2ggbGV2ZWwgb2YKLSAgICogICAgIHRoZSBUcnVlVHlwZSB2aXJ0dWFsIG1hY2hpbmUgYSBnaXZlbiBsaWJyYXJ5IGluc3RhbmNlIHN1cHBvcnRzLgotICAgKgotICAgKiAgQGlucHV0OgotICAgKiAgICAgbGlicmFyeSA6OgotICAgKiAgICAgICBBIGxpYnJhcnkgaW5zdGFuY2UuCi0gICAqCi0gICAqICBAcmV0dXJuOgotICAgKiAgICAgQSB2YWx1ZSBpbmRpY2F0aW5nIHdoaWNoIGxldmVsIGlzIHN1cHBvcnRlZC4KLSAgICoKLSAgICogIEBzaW5jZToKLSAgICogICAgIDIuMgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9UcnVlVHlwZUVuZ2luZVR5cGUgKQotICBGVF9HZXRfVHJ1ZVR5cGVfRW5naW5lX1R5cGUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRNT0RBUElfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bW9kZXJyLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0bW9kZXJyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkN2Y5ODEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdG1vZGVyci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0bW9kZXJyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBtb2R1bGUgZXJyb3Igb2Zmc2V0cyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgRnJlZVR5cGUgbW9kdWxlIGVycm9yIGNvZGVzLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSWYgdGhlIG1hY3JvIEZUX0NPTkZJR19PUFRJT05fVVNFX01PRFVMRV9FUlJPUlMgaW4gYGZ0b3B0aW9uLmgnIGlzICAgICovCi0gIC8qIHNldCwgdGhlIGxvd2VyIGJ5dGUgb2YgYW4gZXJyb3IgdmFsdWUgaWRlbnRpZmllcyB0aGUgZXJyb3IgY29kZSBhcyAgICAqLwotICAvKiB1c3VhbC4gIEluIGFkZGl0aW9uLCB0aGUgaGlnaGVyIGJ5dGUgaWRlbnRpZmllcyB0aGUgbW9kdWxlLiAgRm9yICAgICAgKi8KLSAgLyogZXhhbXBsZSwgdGhlIGVycm9yIGBGVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdCcgaGFzIHZhbHVlIDB4MDAwMywgdGhlICovCi0gIC8qIGVycm9yIGBUVF9FcnJfSW52YWxpZF9GaWxlX0Zvcm1hdCcgaGFzIHZhbHVlIDB4MTMwMywgdGhlIGVycm9yICAgICAgICAqLwotICAvKiBgVDFfRXJyX0ludmFsaWRfRmlsZV9Gb3JtYXQnIGhhcyB2YWx1ZSAweDE0MDMsIGV0Yy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5vdGUgdGhhdCBgRlRfRXJyX09rJywgYFRUX0Vycl9PaycsIGV0Yy4gYXJlIGFsd2F5cyBlcXVhbCB0byB6ZXJvLCAgICAqLwotICAvKiBpbmNsdWRpbmcgdGhlIGhpZ2ggYnl0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElmIEZUX0NPTkZJR19PUFRJT05fVVNFX01PRFVMRV9FUlJPUlMgaXNuJ3Qgc2V0LCB0aGUgaGlnaGVyIGJ5dGUgb2YgICAqLwotICAvKiBhbiBlcnJvciB2YWx1ZSBpcyBzZXQgdG8gemVyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRvIGhpZGUgdGhlIHZhcmlvdXMgYFhYWF9FcnJfJyBwcmVmaXhlcyBpbiB0aGUgc291cmNlIGNvZGUsIEZyZWVUeXBlICAqLwotICAvKiBwcm92aWRlcyBzb21lIG1hY3JvcyBpbiBgZnR0eXBlcy5oJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRVJSKCBlcnIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgQWRkIGN1cnJlbnQgZXJyb3IgbW9kdWxlIHByZWZpeCAoYXMgZGVmaW5lZCB3aXRoIHRoZSAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGBGVF9FUlJfUFJFRklYJyBtYWNybykgdG8gYGVycicuICBGb3IgZXhhbXBsZSwgaW4gdGhlIEJERiBtb2R1bGUgICovCi0gIC8qICAgICB0aGUgbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgZXJyb3IgPSBGVF9FUlIoIEludmFsaWRfT3V0bGluZSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgZXhwYW5kcyB0byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIGVycm9yID0gQkRGX0Vycl9JbnZhbGlkX091dGxpbmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEZvciBzaW1wbGljaXR5LCB5b3UgY2FuIGFsd2F5cyB1c2UgYEZUX0Vycl9PaycgZGlyZWN0bHkgaW5zdGVhZCAgICovCi0gIC8qICAgICBvZiBgRlRfRVJSKCBPayApJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGVF9FUlJfRVEoIGVycmNvZGUsIGVyciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRVJSX05FUSggZXJyY29kZSwgZXJyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgQ29tcGFyZSBlcnJvciBjb2RlIGBlcnJjb2RlJyB3aXRoIHRoZSBlcnJvciBgZXJyJyBmb3IgZXF1YWxpdHkgICAgKi8KLSAgLyogICAgIGFuZCBpbmVxdWFsaXR5LCByZXNwZWN0aXZlbHkuICBFeGFtcGxlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBpZiAoIEZUX0VSUl9FUSggZXJyb3IsIEludmFsaWRfT3V0bGluZSApICkgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgVXNpbmcgdGhpcyBtYWNybyB5b3UgZG9uJ3QgaGF2ZSB0byB0aGluayBhYm91dCBlcnJvciBwcmVmaXhlcy4gICAgKi8KLSAgLyogICAgIE9mIGNvdXJzZSwgaWYgbW9kdWxlIGVycm9ycyBhcmUgbm90IGFjdGl2ZSwgdGhlIGFib3ZlIGV4YW1wbGUgaXMgICovCi0gIC8qICAgICB0aGUgc2FtZSBhcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgaWYgKCBlcnJvciA9PSBGVF9FcnJfSW52YWxpZF9PdXRsaW5lICkgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBGVF9FUlJPUl9CQVNFKCBlcnJjb2RlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgRlRfRVJST1JfTU9EVUxFKCBlcnJjb2RlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgR2V0IGJhc2UgZXJyb3IgYW5kIG1vZHVsZSBlcnJvciBjb2RlLCByZXNwZWN0aXZlbHkuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGNyZWF0ZSBhIG1vZHVsZSBlcnJvciBtZXNzYWdlIHRhYmxlIGVhc2lseSAgICAgKi8KLSAgLyogd2l0aCBzb21ldGhpbmcgbGlrZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICN1bmRlZiBfX0ZUTU9ERVJSX0hfXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAjZGVmaW5lIEZUX01PREVSUkRFRiggZSwgdiwgcyApICB7IEZUX01vZF9FcnJfICMjIGUsIHMgfSwgICAgICAgICAqLwotICAvKiAgICAgI2RlZmluZSBGVF9NT0RFUlJfU1RBUlRfTElTVCAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICNkZWZpbmUgRlRfTU9ERVJSX0VORF9MSVNUICAgICAgIHsgMCwgMCB9IH07ICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgY29uc3Qgc3RydWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIGludCAgICAgICAgICBtb2RfZXJyX29mZnNldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICBjb25zdCBjaGFyKiAgbW9kX2Vycl9tc2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIH0gZnRfbW9kX2Vycm9yc1tdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19IICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRNT0RFUlJfSF9fCi0jZGVmaW5lIF9fRlRNT0RFUlJfSF9fCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgIFNFVFVQIE1BQ1JPUyAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jdW5kZWYgIEZUX05FRURfRVhURVJOX0MKLQotI2lmbmRlZiBGVF9NT0RFUlJERUYKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX01PRFVMRV9FUlJPUlMKLSNkZWZpbmUgRlRfTU9ERVJSREVGKCBlLCB2LCBzICkgIEZUX01vZF9FcnJfICMjIGUgPSB2LAotI2Vsc2UKLSNkZWZpbmUgRlRfTU9ERVJSREVGKCBlLCB2LCBzICkgIEZUX01vZF9FcnJfICMjIGUgPSAwLAotI2VuZGlmCi0KLSNkZWZpbmUgRlRfTU9ERVJSX1NUQVJUX0xJU1QgIGVudW0gewotI2RlZmluZSBGVF9NT0RFUlJfRU5EX0xJU1QgICAgRlRfTW9kX0Vycl9NYXggfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIEZUX05FRURfRVhURVJOX0MKLSAgZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2VuZGlmIC8qICFGVF9NT0RFUlJERUYgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgIExJU1QgTU9EVUxFIEVSUk9SIEJBU0VTICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZmRlZiBGVF9NT0RFUlJfU1RBUlRfTElTVAotICBGVF9NT0RFUlJfU1RBUlRfTElTVAotI2VuZGlmCi0KLQotICBGVF9NT0RFUlJERUYoIEJhc2UsICAgICAgMHgwMDAsICJiYXNlIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIEF1dG9maXQsICAgMHgxMDAsICJhdXRvZml0dGVyIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIEJERiwgICAgICAgMHgyMDAsICJCREYgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggQnppcDIsICAgICAweDMwMCwgIkJ6aXAyIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIENhY2hlLCAgICAgMHg0MDAsICJjYWNoZSBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBDRkYsICAgICAgIDB4NTAwLCAiQ0ZGIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIENJRCwgICAgICAgMHg2MDAsICJDSUQgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggR3ppcCwgICAgICAweDcwMCwgIkd6aXAgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggTFpXLCAgICAgICAweDgwMCwgIkxaVyBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBPVHZhbGlkLCAgIDB4OTAwLCAiT3BlblR5cGUgdmFsaWRhdGlvbiBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBQQ0YsICAgICAgIDB4QTAwLCAiUENGIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIFBGUiwgICAgICAgMHhCMDAsICJQRlIgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggUFNhdXgsICAgICAweEMwMCwgIlBTIGF1eGlsaWFyeSBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBQU2hpbnRlciwgIDB4RDAwLCAiUFMgaGludGVyIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIFBTbmFtZXMsICAgMHhFMDAsICJQUyBuYW1lcyBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBSYXN0ZXIsICAgIDB4RjAwLCAicmFzdGVyIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIFNGTlQsICAgICAweDEwMDAsICJTRk5UIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIFNtb290aCwgICAweDExMDAsICJzbW9vdGggcmFzdGVyIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIFRydWVUeXBlLCAweDEyMDAsICJUcnVlVHlwZSBtb2R1bGUiICkKLSAgRlRfTU9ERVJSREVGKCBUeXBlMSwgICAgMHgxMzAwLCAiVHlwZSAxIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIFR5cGU0MiwgICAweDE0MDAsICJUeXBlIDQyIG1vZHVsZSIgKQotICBGVF9NT0RFUlJERUYoIFdpbmZvbnRzLCAweDE1MDAsICJXaW5kb3dzIEZPTi9GTlQgbW9kdWxlIiApCi0gIEZUX01PREVSUkRFRiggR1h2YWxpZCwgIDB4MTYwMCwgIkdYIHZhbGlkYXRpb24gbW9kdWxlIiApCi0KLQotI2lmZGVmIEZUX01PREVSUl9FTkRfTElTVAotICBGVF9NT0RFUlJfRU5EX0xJU1QKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgIENMRUFOVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmZGVmIEZUX05FRURfRVhURVJOX0MKLSAgfQotI2VuZGlmCi0KLSN1bmRlZiBGVF9NT0RFUlJfU1RBUlRfTElTVAotI3VuZGVmIEZUX01PREVSUl9FTkRfTElTVAotI3VuZGVmIEZUX01PREVSUkRFRgotI3VuZGVmIEZUX05FRURfRVhURVJOX0MKLQotCi0jZW5kaWYgLyogX19GVE1PREVSUl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRvdHZhbC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdG90dmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDRiNzEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdG90dmFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRvdHZhbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgdmFsaWRhdGluZyBPcGVuVHlwZSB0YWJsZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBXYXJuaW5nOiBUaGlzIG1vZHVsZSBtaWdodCBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCBsaWJyYXJ5IGluIHRoZSAgICAgICAqLwotLyogICAgICAgICAgZnV0dXJlIHRvIGF2b2lkIGEgdGlnaHQgZGVwZW5kZW5jeSBiZXR3ZWVuIEZyZWVUeXBlIGFuZCB0aGUgICAgKi8KLS8qICAgICAgICAgIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUT1RWQUxfSF9fCi0jZGVmaW5lIF9fRlRPVFZBTF9IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3RfdmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT3BlblR5cGUgVmFsaWRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gQVBJIHRvIHZhbGlkYXRlIE9wZW5UeXBlIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBmdW5jdGlvbnMgdG8gdmFsaWRhdGUgICAgICovCi0gIC8qICAgIHNvbWUgT3BlblR5cGUgdGFibGVzIChCQVNFLCBHREVGLCBHUE9TLCBHU1VCLCBKU1RGLCBNQVRIKS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE9yZGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09wZW5UeXBlX1ZhbGlkYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PcGVuVHlwZV9GcmVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1ZBTElEQVRFX09UWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZW51bToKLSAgKiAgICBGVF9WQUxJREFURV9PVFhYWAotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIEEgbGlzdCBvZiBiaXQtZmllbGQgY29uc3RhbnRzIHVzZWQgd2l0aCBARlRfT3BlblR5cGVfVmFsaWRhdGUgdG8KLSAgKiAgICBpbmRpY2F0ZSB3aGljaCBPcGVuVHlwZSB0YWJsZXMgc2hvdWxkIGJlIHZhbGlkYXRlZC4KLSAgKgotICAqIEB2YWx1ZXM6Ci0gICogICAgRlRfVkFMSURBVEVfQkFTRSA6OgotICAqICAgICAgVmFsaWRhdGUgQkFTRSB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX0dERUYgOjoKLSAgKiAgICAgIFZhbGlkYXRlIEdERUYgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9HUE9TIDo6Ci0gICogICAgICBWYWxpZGF0ZSBHUE9TIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfR1NVQiA6OgotICAqICAgICAgVmFsaWRhdGUgR1NVQiB0YWJsZS4KLSAgKgotICAqICAgIEZUX1ZBTElEQVRFX0pTVEYgOjoKLSAgKiAgICAgIFZhbGlkYXRlIEpTVEYgdGFibGUuCi0gICoKLSAgKiAgICBGVF9WQUxJREFURV9NQVRIIDo6Ci0gICogICAgICBWYWxpZGF0ZSBNQVRIIHRhYmxlLgotICAqCi0gICogICAgRlRfVkFMSURBVEVfT1QgOjoKLSAgKiAgICAgIFZhbGlkYXRlIGFsbCBPcGVuVHlwZSB0YWJsZXMgKEJBU0UsIEdERUYsIEdQT1MsIEdTVUIsIEpTVEYsIE1BVEgpLgotICAqCi0gICovCi0jZGVmaW5lIEZUX1ZBTElEQVRFX0JBU0UgIDB4MDEwMAotI2RlZmluZSBGVF9WQUxJREFURV9HREVGICAweDAyMDAKLSNkZWZpbmUgRlRfVkFMSURBVEVfR1BPUyAgMHgwNDAwCi0jZGVmaW5lIEZUX1ZBTElEQVRFX0dTVUIgIDB4MDgwMAotI2RlZmluZSBGVF9WQUxJREFURV9KU1RGICAweDEwMDAKLSNkZWZpbmUgRlRfVkFMSURBVEVfTUFUSCAgMHgyMDAwCi0KLSNkZWZpbmUgRlRfVkFMSURBVEVfT1QgIEZUX1ZBTElEQVRFX0JBU0UgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9HREVGIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVkFMSURBVEVfR1BPUyB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZBTElEQVRFX0dTVUIgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9KU1RGIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVkFMSURBVEVfTUFUSAotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9PcGVuVHlwZV9WYWxpZGF0ZQotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFZhbGlkYXRlIHZhcmlvdXMgT3BlblR5cGUgdGFibGVzIHRvIGFzc3VyZSB0aGF0IGFsbCBvZmZzZXRzIGFuZAotICAqICAgIGluZGljZXMgYXJlIHZhbGlkLiAgVGhlIGlkZWEgaXMgdGhhdCBhIGhpZ2hlci1sZXZlbCBsaWJyYXJ5IHRoYXQKLSAgKiAgICBhY3R1YWxseSBkb2VzIHRoZSB0ZXh0IGxheW91dCBjYW4gYWNjZXNzIHRob3NlIHRhYmxlcyB3aXRob3V0Ci0gICogICAgZXJyb3IgY2hlY2tpbmcgKHdoaWNoIGNhbiBiZSBxdWl0ZSB0aW1lIGNvbnN1bWluZykuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICAgZmFjZSA6OgotICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogICAgdmFsaWRhdGlvbl9mbGFncyA6OgotICAqICAgICAgIEEgYml0IGZpZWxkIHRoYXQgc3BlY2lmaWVzIHRoZSB0YWJsZXMgdG8gYmUgdmFsaWRhdGVkLiAgU2VlCi0gICogICAgICAgQEZUX1ZBTElEQVRFX09UWFhYIGZvciBwb3NzaWJsZSB2YWx1ZXMuCi0gICoKLSAgKiBAb3V0cHV0OgotICAqICAgIEJBU0VfdGFibGUgOjoKLSAgKiAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEJBU0UgdGFibGUuCi0gICoKLSAgKiAgICBHREVGX3RhYmxlIDo6Ci0gICogICAgICAgQSBwb2ludGVyIHRvIHRoZSBHREVGIHRhYmxlLgotICAqCi0gICogICAgR1BPU190YWJsZSA6OgotICAqICAgICAgIEEgcG9pbnRlciB0byB0aGUgR1BPUyB0YWJsZS4KLSAgKgotICAqICAgIEdTVUJfdGFibGUgOjoKLSAgKiAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEdTVUIgdGFibGUuCi0gICoKLSAgKiAgICBKU1RGX3RhYmxlIDo6Ci0gICogICAgICAgQSBwb2ludGVyIHRvIHRoZSBKU1RGIHRhYmxlLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyB3aXRoIE9wZW5UeXBlIGZvbnRzLCByZXR1cm5pbmcgYW4gZXJyb3IKLSAgKiAgIG90aGVyd2lzZS4KLSAgKgotICAqICAgQWZ0ZXIgdXNlLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGRlYWxsb2NhdGUgdGhlIGZpdmUgdGFibGVzIHdpdGgKLSAgKiAgIEBGVF9PcGVuVHlwZV9GcmVlLiAgQSBOVUxMIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSB0YWJsZSBlaXRoZXIKLSAgKiAgIGRvZXNuJ3QgZXhpc3QgaW4gdGhlIGZvbnQsIG9yIHRoZSBhcHBsaWNhdGlvbiBoYXNuJ3QgYXNrZWQgZm9yCi0gICogICB2YWxpZGF0aW9uLgotICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfT3BlblR5cGVfVmFsaWRhdGUoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgdmFsaWRhdGlvbl9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqQkFTRV90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqR0RFRl90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqR1BPU190YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqR1NVQl90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqSlNURl90YWJsZSApOwotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9PcGVuVHlwZV9GcmVlCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgRnJlZSB0aGUgYnVmZmVyIGFsbG9jYXRlZCBieSBPcGVuVHlwZSB2YWxpZGF0b3IuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICAgZmFjZSA6OgotICAqICAgICAgIEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogICAgdGFibGUgOjoKLSAgKiAgICAgICBUaGUgcG9pbnRlciB0byB0aGUgYnVmZmVyIHRoYXQgaXMgYWxsb2NhdGVkIGJ5Ci0gICogICAgICAgQEZUX09wZW5UeXBlX1ZhbGlkYXRlLgotICAqCi0gICogQG5vdGU6Ci0gICogICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCB0byBmcmVlIHRoZSBidWZmZXIgYWxsb2NhdGVkIGJ5Ci0gICogICBARlRfT3BlblR5cGVfVmFsaWRhdGUgb25seS4KLSAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfT3BlblR5cGVfRnJlZSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICB0YWJsZSApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVE9UVkFMX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdG91dGxuLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0b3V0bG4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZlYzcwZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0b3V0bG4uaAorKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG91dGxuLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgU3VwcG9ydCBmb3IgdGhlIEZUX091dGxpbmUgdHlwZSB1c2VkIHRvIHN0b3JlIGdseXBoIHNoYXBlcyBvZiAgICAgICAgKi8KLS8qICAgIG1vc3Qgc2NhbGFibGUgZm9udCBmb3JtYXRzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRPVVRMTl9IX18KLSNkZWZpbmUgX19GVE9VVExOX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmVfcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE91dGxpbmUgUHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZ1bmN0aW9ucyB0byBjcmVhdGUsIHRyYW5zZm9ybSwgYW5kIHJlbmRlciB2ZWN0b3JpYWwgZ2x5cGggaW1hZ2VzLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyByb3V0aW5lcyB1c2VkIHRvIGNyZWF0ZSBhbmQgZGVzdHJveSBzY2FsYWJsZSAqLwotICAvKiAgICBnbHlwaCBpbWFnZXMga25vd24gYXMgYG91dGxpbmVzJy4gIFRoZXNlIGNhbiBhbHNvIGJlIG1lYXN1cmVkLCAgICAgKi8KLSAgLyogICAgdHJhbnNmb3JtZWQsIGFuZCBjb252ZXJ0ZWQgaW50byBiaXRtYXBzIGFuZCBwaXhtYXBzLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3JkZXI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfTmV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0RvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9Db3B5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfVHJhbnNsYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX1RyYW5zZm9ybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9FbWJvbGRlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRW1ib2xkZW5YWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX1JldmVyc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9DaGVjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0dldF9DQm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9HZXRfQkJveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0dldF9CaXRtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9SZW5kZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRGVjb21wb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0Z1bmNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9Nb3ZlVG9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfTGluZVRvRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0NvbmljVG9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9DdWJpY1RvRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PcmllbnRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9HZXRfT3JpZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PVVRMSU5FX1hYWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9EZWNvbXBvc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2FsayBvdmVyIGFuIG91dGxpbmUncyBzdHJ1Y3R1cmUgdG8gZGVjb21wb3NlIGl0IGludG8gaW5kaXZpZHVhbCAgICovCi0gIC8qICAgIHNlZ21lbnRzIGFuZCBCw6l6aWVyIGFyY3MuICBUaGlzIGZ1bmN0aW9uIGFsc28gZW1pdHMgYG1vdmUgdG8nICAgICAgKi8KLSAgLyogICAgb3BlcmF0aW9ucyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgbmV3IGNvbnRvdXJzIGluIHRoZSBvdXRsaW5lLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSAgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgdGFyZ2V0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdW5jX2ludGVyZmFjZSA6OiBBIHRhYmxlIG9mIGBlbWl0dGVycycsIGkuZS4sIGZ1bmN0aW9uIHBvaW50ZXJzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIGR1cmluZyBkZWNvbXBvc2l0aW9uIHRvIGluZGljYXRlIHBhdGggICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgICAgICAgICAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciB0aGF0IGlzIHBhc3NlZCB0byBlYWNoICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICBlbWl0dGVyIGR1cmluZyB0aGUgZGVjb21wb3NpdGlvbi4gIEl0IGNhbiBiZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBzdG9yZSB0aGUgc3RhdGUgZHVyaW5nIHRoZSAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgY29udG91ciB0aGF0IGNvbnRhaW5zIGEgc2luZ2xlIHBvaW50IG9ubHkgaXMgcmVwcmVzZW50ZWQgYnkgYSAgICAqLwotICAvKiAgICBgbW92ZSB0bycgb3BlcmF0aW9uIGZvbGxvd2VkIGJ5IGBsaW5lIHRvJyB0byB0aGUgc2FtZSBwb2ludC4gIEluICAgKi8KLSAgLyogICAgbW9zdCBjYXNlcywgaXQgaXMgYmVzdCB0byBmaWx0ZXIgdGhpcyBvdXQgYmVmb3JlIHVzaW5nIHRoZSAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgZm9yIHN0cm9raW5nIHB1cnBvc2VzIChvdGhlcndpc2UgaXQgd291bGQgcmVzdWx0IGluIGEgICAgICAqLwotICAvKiAgICB2aXNpYmxlIGRvdCB3aGVuIHJvdW5kIGNhcHMgYXJlIHVzZWQpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX0RlY29tcG9zZSggRlRfT3V0bGluZSogICAgICAgICAgICAgIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9PdXRsaW5lX0Z1bmNzKiAgZnVuY19pbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgdXNlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9OZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3JlYXRlIGEgbmV3IG91dGxpbmUgb2YgYSBnaXZlbiBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIGxpYnJhcnkgb2JqZWN0IGZyb20gd2hlcmUgdGhlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIG91dGxpbmUgaXMgYWxsb2NhdGVkLiAgTm90ZSBob3dldmVyIHRoYXQgdGhlIG5ldyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBvdXRsaW5lIHdpbGwgKm5vdCogbmVjZXNzYXJpbHkgYmUgKmZyZWVkKiwgd2hlbiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZGVzdHJveWluZyB0aGUgbGlicmFyeSwgYnkgQEZUX0RvbmVfRnJlZVR5cGUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1Qb2ludHMgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcG9pbnRzIHdpdGhpbiB0aGUgb3V0bGluZS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgTXVzdCBiZSBzbWFsbGVyIHRoYW4gb3IgZXF1YWwgdG8gMHhGRkZGICg2NTUzNSkuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1Db250b3VycyA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29udG91cnMgd2l0aGluIHRoZSBvdXRsaW5lLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBtdXN0IGJlIGluIHRoZSByYW5nZSAwIHRvIGBudW1Qb2ludHMnLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYW5vdXRsaW5lICAgOjogQSBoYW5kbGUgdG8gdGhlIG5ldyBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlYXNvbiB3aHkgdGhpcyBmdW5jdGlvbiB0YWtlcyBhIGBsaWJyYXJ5JyBwYXJhbWV0ZXIgaXMgc2ltcGx5ICovCi0gIC8qICAgIHRvIHVzZSB0aGUgbGlicmFyeSdzIG1lbW9yeSBhbGxvY2F0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfTmV3KCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBudW1Qb2ludHMsCi0gICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgbnVtQ29udG91cnMsCi0gICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lICAqYW5vdXRsaW5lICk7Ci0KLQotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9OZXdfSW50ZXJuYWwoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbnVtUG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgIG51bUNvbnRvdXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSAgKmFub3V0bGluZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9Eb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzdHJveSBhbiBvdXRsaW5lIGNyZWF0ZWQgd2l0aCBARlRfT3V0bGluZV9OZXcuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiBBIGhhbmRsZSBvZiB0aGUgbGlicmFyeSBvYmplY3QgdXNlZCB0byBhbGxvY2F0ZSB0aGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIG91dGxpbmUgb2JqZWN0IHRvIGJlIGRpc2NhcmRlZC4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgdGhlIG91dGxpbmUncyBgb3duZXInIGZpZWxkIGlzIG5vdCBzZXQsIG9ubHkgdGhlIG91dGxpbmUgICAgICAgICovCi0gIC8qICAgIGRlc2NyaXB0b3Igd2lsbCBiZSByZWxlYXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlYXNvbiB3aHkgdGhpcyBmdW5jdGlvbiB0YWtlcyBhbiBgbGlicmFyeScgcGFyYW1ldGVyIGlzICAgICAgICovCi0gIC8qICAgIHNpbXBseSB0byB1c2UgZnRfbWVtX2ZyZWUoKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfRG9uZSggRlRfTGlicmFyeSAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogIG91dGxpbmUgKTsKLQotCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX0RvbmVfSW50ZXJuYWwoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogIG91dGxpbmUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfQ2hlY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENoZWNrIHRoZSBjb250ZW50cyBvZiBhbiBvdXRsaW5lIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgOjogQSBoYW5kbGUgdG8gYSBzb3VyY2Ugb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfQ2hlY2soIEZUX091dGxpbmUqICBvdXRsaW5lICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0dldF9DQm94ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm4gYW4gb3V0bGluZSdzIGBjb250cm9sIGJveCcuICBUaGUgY29udHJvbCBib3ggZW5jbG9zZXMgYWxsICAgKi8KLSAgLyogICAgdGhlIG91dGxpbmUncyBwb2ludHMsIGluY2x1ZGluZyBCw6l6aWVyIGNvbnRyb2wgcG9pbnRzLiAgVGhvdWdoIGl0ICAqLwotICAvKiAgICBjb2luY2lkZXMgd2l0aCB0aGUgZXhhY3QgYm91bmRpbmcgYm94IGZvciBtb3N0IGdseXBocywgaXQgY2FuIGJlICAgKi8KLSAgLyogICAgc2xpZ2h0bHkgbGFyZ2VyIGluIHNvbWUgc2l0dWF0aW9ucyAobGlrZSB3aGVuIHJvdGF0aW5nIGFuIG91dGxpbmUgICovCi0gIC8qICAgIHRoYXQgY29udGFpbnMgQsOpemllciBvdXRzaWRlIGFyY3MpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGluZyB0aGUgY29udHJvbCBib3ggaXMgdmVyeSBmYXN0LCB3aGlsZSBnZXR0aW5nIHRoZSBib3VuZGluZyAqLwotICAvKiAgICBib3ggY2FuIHRha2UgbXVjaCBtb3JlIHRpbWUgYXMgaXQgbmVlZHMgdG8gd2FsayBvdmVyIGFsbCBzZWdtZW50cyAgKi8KLSAgLyogICAgYW5kIGFyY3MgaW4gdGhlIG91dGxpbmUuICBUbyBnZXQgdGhlIGxhdHRlciwgeW91IGNhbiB1c2UgdGhlICAgICAgICovCi0gIC8qICAgIGBmdGJib3gnIGNvbXBvbmVudCwgd2hpY2ggaXMgZGVkaWNhdGVkIHRvIHRoaXMgc2luZ2xlIHRhc2suICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2Ugb3V0bGluZSBkZXNjcmlwdG9yLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFjYm94ICAgOjogVGhlIG91dGxpbmUncyBjb250cm9sIGJveC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZSBARlRfR2x5cGhfR2V0X0NCb3ggZm9yIGEgZGlzY3Vzc2lvbiBvZiB0cmlja3kgZm9udHMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfT3V0bGluZV9HZXRfQ0JveCggY29uc3QgRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0JCb3ggICAgICAgICAgICphY2JveCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9UcmFuc2xhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQXBwbHkgYSBzaW1wbGUgdHJhbnNsYXRpb24gdG8gdGhlIHBvaW50cyBvZiBhbiBvdXRsaW5lLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBvdXRsaW5lIGRlc2NyaXB0b3IuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeE9mZnNldCA6OiBUaGUgaG9yaXpvbnRhbCBvZmZzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5T2Zmc2V0IDo6IFRoZSB2ZXJ0aWNhbCBvZmZzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX091dGxpbmVfVHJhbnNsYXRlKCBjb25zdCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgICAgICB4T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICAgICAgIHlPZmZzZXQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfQ29weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvcHkgYW4gb3V0bGluZSBpbnRvIGFub3RoZXIgb25lLiAgQm90aCBvYmplY3RzIG11c3QgaGF2ZSB0aGUgICAgICAqLwotICAvKiAgICBzYW1lIHNpemVzIChudW1iZXIgb2YgcG9pbnRzICYgbnVtYmVyIG9mIGNvbnRvdXJzKSB3aGVuIHRoaXMgICAgICAgKi8KLSAgLyogICAgZnVuY3Rpb24gaXMgY2FsbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc291cmNlIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2Ugb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFyZ2V0IDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9Db3B5KCBjb25zdCBGVF9PdXRsaW5lKiAgc291cmNlLAotICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUgICAgICAgICp0YXJnZXQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfVHJhbnNmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFwcGx5IGEgc2ltcGxlIDJ4MiBtYXRyaXggdG8gYWxsIG9mIGFuIG91dGxpbmUncyBwb2ludHMuICBVc2VmdWwgICAqLwotICAvKiAgICBmb3IgYXBwbHlpbmcgcm90YXRpb25zLCBzbGFudGluZywgZmxpcHBpbmcsIGV0Yy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lIDo6IEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IG91dGxpbmUgZGVzY3JpcHRvci4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXRyaXggIDo6IEEgcG9pbnRlciB0byB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3UgY2FuIHVzZSBARlRfT3V0bGluZV9UcmFuc2xhdGUgaWYgeW91IG5lZWQgdG8gdHJhbnNsYXRlIHRoZSAgICAgKi8KLSAgLyogICAgb3V0bGluZSdzIHBvaW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9PdXRsaW5lX1RyYW5zZm9ybSggY29uc3QgRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9NYXRyaXgqICAgbWF0cml4ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0VtYm9sZGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFbWJvbGRlbiBhbiBvdXRsaW5lLiAgVGhlIG5ldyBvdXRsaW5lIHdpbGwgYmUgYXQgbW9zdCA0fnRpbWVzICAgICAgKi8KLSAgLyogICAgYHN0cmVuZ3RoJyBwaXhlbHMgd2lkZXIgYW5kIGhpZ2hlci4gIFlvdSBtYXkgdGhpbmsgb2YgdGhlIGxlZnQgYW5kICovCi0gIC8qICAgIGJvdHRvbSBib3JkZXJzIGFzIHVuY2hhbmdlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTmVnYXRpdmUgYHN0cmVuZ3RoJyB2YWx1ZXMgdG8gcmVkdWNlIHRoZSBvdXRsaW5lIHRoaWNrbmVzcyBhcmUgICAgICovCi0gIC8qICAgIHBvc3NpYmxlIGFsc28uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVuZ3RoIDo6IEhvdyBzdHJvbmcgdGhlIGdseXBoIGlzIGVtYm9sZGVuZWQuICBFeHByZXNzZWQgaW4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAyNi42IHBpeGVsIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgdXNlZCBhbGdvcml0aG0gdG8gaW5jcmVhc2Ugb3IgZGVjcmVhc2UgdGhlIHRoaWNrbmVzcyBvZiB0aGUgICAgKi8KLSAgLyogICAgZ2x5cGggZG9lc24ndCBjaGFuZ2UgdGhlIG51bWJlciBvZiBwb2ludHM7IHRoaXMgbWVhbnMgdGhhdCBjZXJ0YWluICovCi0gIC8qICAgIHNpdHVhdGlvbnMgbGlrZSBhY3V0ZSBhbmdsZXMgb3IgaW50ZXJzZWN0aW9ucyBhcmUgc29tZXRpbWVzICAgICAgICAqLwotICAvKiAgICBoYW5kbGVkIGluY29ycmVjdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElmIHlvdSBuZWVkIGBiZXR0ZXInIG1ldHJpY3MgdmFsdWVzIHlvdSBzaG91bGQgY2FsbCAgICAgICAgICAgICAgICAqLwotICAvKiAgICBARlRfT3V0bGluZV9HZXRfQ0JveCBvciBARlRfT3V0bGluZV9HZXRfQkJveC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEV4YW1wbGUgY2FsbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgRlRfTG9hZF9HbHlwaCggZmFjZSwgaW5kZXgsIEZUX0xPQURfREVGQVVMVCApOyAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIGlmICggZmFjZS0+Z2x5cGgtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSApICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIEZUX091dGxpbmVfRW1ib2xkZW4oICZmYWNlLT5nbHlwaC0+b3V0bGluZSwgc3RyZW5ndGggKTsgICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVG8gZ2V0IG1lYW5pbmdmdWwgcmVzdWx0cywgZm9udCBzY2FsaW5nIHZhbHVlcyBtdXN0IGJlIHNldCB3aXRoICAgICovCi0gIC8qICAgIGZ1bmN0aW9ucyBsaWtlIEBGVF9TZXRfQ2hhcl9TaXplIGJlZm9yZSBjYWxsaW5nIEZUX1JlbmRlcl9HbHlwaC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfRW1ib2xkZW4oIEZUX091dGxpbmUqICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgc3RyZW5ndGggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX091dGxpbmVfRW1ib2xkZW5YWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVtYm9sZGVuIGFuIG91dGxpbmUuICBUaGUgbmV3IG91dGxpbmUgd2lsbCBiZSBgeHN0cmVuZ3RoJyBwaXhlbHMgICAqLwotICAvKiAgICB3aWRlciBhbmQgYHlzdHJlbmd0aCcgcGl4ZWxzIGhpZ2hlci4gIE90aGVyd2lzZSwgaXQgaXMgc2ltaWxhciB0byAgKi8KLSAgLyogICAgQEZUX091dGxpbmVfRW1ib2xkZW4sIHdoaWNoIHVzZXMgdGhlIHNhbWUgc3RyZW5ndGggaW4gYm90aCAgICAgICAgICovCi0gIC8qICAgIGRpcmVjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfRW1ib2xkZW5YWSggRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgIHhzdHJlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgeXN0cmVuZ3RoICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX1JldmVyc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXZlcnNlIHRoZSBkcmF3aW5nIGRpcmVjdGlvbiBvZiBhbiBvdXRsaW5lLiAgVGhpcyBpcyB1c2VkIHRvICAgICAgKi8KLSAgLyogICAgZW5zdXJlIGNvbnNpc3RlbnQgZmlsbCBjb252ZW50aW9ucyBmb3IgbWlycm9yZWQgZ2x5cGhzLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBvdXRsaW5lIGRlc2NyaXB0b3IuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiB0b2dnbGVzIHRoZSBiaXQgZmxhZyBARlRfT1VUTElORV9SRVZFUlNFX0ZJTEwgaW4gICAgICovCi0gIC8qICAgIHRoZSBvdXRsaW5lJ3MgYGZsYWdzJyBmaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSXQgc2hvdWxkbid0IGJlIHVzZWQgYnkgYSBub3JtYWwgY2xpZW50IGFwcGxpY2F0aW9uLCB1bmxlc3MgaXQgICAgICovCi0gIC8qICAgIGtub3dzIHdoYXQgaXQgaXMgZG9pbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfT3V0bGluZV9SZXZlcnNlKCBGVF9PdXRsaW5lKiAgb3V0bGluZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9HZXRfQml0bWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVuZGVyIGFuIG91dGxpbmUgd2l0aGluIGEgYml0bWFwLiAgVGhlIG91dGxpbmUncyBpbWFnZSBpcyBzaW1wbHkgICovCi0gIC8qICAgIE9SLWVkIHRvIHRoZSB0YXJnZXQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gYSBGcmVlVHlwZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSA6OiBBIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBvdXRsaW5lIGRlc2NyaXB0b3IuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWJpdG1hcCA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBiaXRtYXAgZGVzY3JpcHRvci4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBkb2VzIE5PVCBDUkVBVEUgdGhlIGJpdG1hcCwgaXQgb25seSByZW5kZXJzIGFuICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgaW1hZ2Ugd2l0aGluIHRoZSBvbmUgeW91IHBhc3MgdG8gaXQhICBDb25zZXF1ZW50bHksIHRoZSAgICAqLwotICAvKiAgICB2YXJpb3VzIGZpZWxkcyBpbiBgYWJpdG1hcCcgc2hvdWxkIGJlIHNldCBhY2NvcmRpbmdseS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEl0IHdpbGwgdXNlIHRoZSByYXN0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZGVmYXVsdCBnbHlwaCBmb3JtYXQuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHZhbHVlIG9mIHRoZSBgbnVtX2dyYXlzJyBmaWVsZCBpbiBgYWJpdG1hcCcgaXMgaWdub3JlZC4gIElmICAgICovCi0gIC8qICAgIHlvdSBzZWxlY3QgdGhlIGdyYXktbGV2ZWwgcmFzdGVyaXplciwgYW5kIHlvdSB3YW50IGxlc3MgdGhhbiAyNTYgICAqLwotICAvKiAgICBncmF5IGxldmVscywgeW91IGhhdmUgdG8gdXNlIEBGVF9PdXRsaW5lX1JlbmRlciBkaXJlY3RseS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX0dldF9CaXRtYXAoIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CaXRtYXAgICphYml0bWFwICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX1JlbmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZW5kZXIgYW4gb3V0bGluZSB3aXRoaW4gYSBiaXRtYXAgdXNpbmcgdGhlIGN1cnJlbnQgc2Nhbi1jb252ZXJ0LiAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiB1c2VzIGFuIEBGVF9SYXN0ZXJfUGFyYW1zIHN0cnVjdHVyZSBhcyBhbiBhcmd1bWVudCwgICovCi0gIC8qICAgIGFsbG93aW5nIGFkdmFuY2VkIGZlYXR1cmVzIGxpa2UgZGlyZWN0IGNvbXBvc2l0aW9uLCB0cmFuc2x1Y2VuY3ksICAqLwotICAvKiAgICBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIGEgRnJlZVR5cGUgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dGxpbmUgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2Ugb3V0bGluZSBkZXNjcmlwdG9yLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtcyAgOjogQSBwb2ludGVyIHRvIGFuIEBGVF9SYXN0ZXJfUGFyYW1zIHN0cnVjdHVyZSB1c2VkIHRvICAgICAqLwotICAvKiAgICAgICAgICAgICAgIGRlc2NyaWJlIHRoZSByZW5kZXJpbmcgb3BlcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3Ugc2hvdWxkIGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nIGFuZCBob3cgQEZUX1Jhc3Rlcl9QYXJhbXMgd29ya3MgKi8KLSAgLyogICAgdG8gdXNlIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZmllbGQgYHBhcmFtcy5zb3VyY2UnIHdpbGwgYmUgc2V0IHRvIGBvdXRsaW5lJyBiZWZvcmUgdGhlIHNjYW4gKi8KLSAgLyogICAgY29udmVydGVyIGlzIGNhbGxlZCwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgdmFsdWUgeW91IGdpdmUgdG8gaXQgaXMgICovCi0gIC8qICAgIGFjdHVhbGx5IGlnbm9yZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGdyYXktbGV2ZWwgcmFzdGVyaXplciBhbHdheXMgdXNlcyAyNTYgZ3JheSBsZXZlbHMuICBJZiB5b3UgICAgICovCi0gIC8qICAgIHdhbnQgbGVzcyBncmF5IGxldmVscywgeW91IGhhdmUgdG8gcHJvdmlkZSB5b3VyIG93biBzcGFuIGNhbGxiYWNrLiAqLwotICAvKiAgICBTZWUgdGhlIEBGVF9SQVNURVJfRkxBR19ESVJFQ1QgdmFsdWUgb2YgdGhlIGBmbGFncycgZmllbGQgaW4gdGhlICAgKi8KLSAgLyogICAgQEZUX1Jhc3Rlcl9QYXJhbXMgc3RydWN0dXJlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9SZW5kZXIoIEZUX0xpYnJhcnkgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgICAgIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9SYXN0ZXJfUGFyYW1zKiAgcGFyYW1zICk7Ci0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGVudW06Ci0gICogICBGVF9PcmllbnRhdGlvbgotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgQSBsaXN0IG9mIHZhbHVlcyB1c2VkIHRvIGRlc2NyaWJlIGFuIG91dGxpbmUncyBjb250b3VyIG9yaWVudGF0aW9uLgotICAqCi0gICogICBUaGUgVHJ1ZVR5cGUgYW5kIFBvc3RTY3JpcHQgc3BlY2lmaWNhdGlvbnMgdXNlIGRpZmZlcmVudCBjb252ZW50aW9ucwotICAqICAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3V0bGluZSBjb250b3VycyBzaG91bGQgYmUgZmlsbGVkIG9yIHVuZmlsbGVkLgotICAqCi0gICogQHZhbHVlczoKLSAgKiAgIEZUX09SSUVOVEFUSU9OX1RSVUVUWVBFIDo6Ci0gICogICAgIEFjY29yZGluZyB0byB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiwgY2xvY2t3aXNlIGNvbnRvdXJzIG11c3QKLSAgKiAgICAgYmUgZmlsbGVkLCBhbmQgY291bnRlci1jbG9ja3dpc2Ugb25lcyBtdXN0IGJlIHVuZmlsbGVkLgotICAqCi0gICogICBGVF9PUklFTlRBVElPTl9QT1NUU0NSSVBUIDo6Ci0gICogICAgIEFjY29yZGluZyB0byB0aGUgUG9zdFNjcmlwdCBzcGVjaWZpY2F0aW9uLCBjb3VudGVyLWNsb2Nrd2lzZSBjb250b3VycwotICAqICAgICBtdXN0IGJlIGZpbGxlZCwgYW5kIGNsb2Nrd2lzZSBvbmVzIG11c3QgYmUgdW5maWxsZWQuCi0gICoKLSAgKiAgIEZUX09SSUVOVEFUSU9OX0ZJTExfUklHSFQgOjoKLSAgKiAgICAgVGhpcyBpcyBpZGVudGljYWwgdG8gQEZUX09SSUVOVEFUSU9OX1RSVUVUWVBFLCBidXQgaXMgdXNlZCB0bwotICAqICAgICByZW1lbWJlciB0aGF0IGluIFRydWVUeXBlLCBldmVyeXRoaW5nIHRoYXQgaXMgdG8gdGhlIHJpZ2h0IG9mCi0gICogICAgIHRoZSBkcmF3aW5nIGRpcmVjdGlvbiBvZiBhIGNvbnRvdXIgbXVzdCBiZSBmaWxsZWQuCi0gICoKLSAgKiAgIEZUX09SSUVOVEFUSU9OX0ZJTExfTEVGVCA6OgotICAqICAgICBUaGlzIGlzIGlkZW50aWNhbCB0byBARlRfT1JJRU5UQVRJT05fUE9TVFNDUklQVCwgYnV0IGlzIHVzZWQgdG8KLSAgKiAgICAgcmVtZW1iZXIgdGhhdCBpbiBQb3N0U2NyaXB0LCBldmVyeXRoaW5nIHRoYXQgaXMgdG8gdGhlIGxlZnQgb2YKLSAgKiAgICAgdGhlIGRyYXdpbmcgZGlyZWN0aW9uIG9mIGEgY29udG91ciBtdXN0IGJlIGZpbGxlZC4KLSAgKgotICAqICAgRlRfT1JJRU5UQVRJT05fTk9ORSA6OgotICAqICAgICBUaGUgb3JpZW50YXRpb24gY2Fubm90IGJlIGRldGVybWluZWQuICBUaGF0IGlzLCBkaWZmZXJlbnQgcGFydHMgb2YKLSAgKiAgICAgdGhlIGdseXBoIGhhdmUgZGlmZmVyZW50IG9yaWVudGF0aW9uLgotICAqCi0gICovCi0gIHR5cGVkZWYgZW51bSAgRlRfT3JpZW50YXRpb25fCi0gIHsKLSAgICBGVF9PUklFTlRBVElPTl9UUlVFVFlQRSAgID0gMCwKLSAgICBGVF9PUklFTlRBVElPTl9QT1NUU0NSSVBUID0gMSwKLSAgICBGVF9PUklFTlRBVElPTl9GSUxMX1JJR0hUID0gRlRfT1JJRU5UQVRJT05fVFJVRVRZUEUsCi0gICAgRlRfT1JJRU5UQVRJT05fRklMTF9MRUZUICA9IEZUX09SSUVOVEFUSU9OX1BPU1RTQ1JJUFQsCi0gICAgRlRfT1JJRU5UQVRJT05fTk9ORQotCi0gIH0gRlRfT3JpZW50YXRpb247Ci0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAqCi0gICogQGZ1bmN0aW9uOgotICAqICAgRlRfT3V0bGluZV9HZXRfT3JpZW50YXRpb24KLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgIFRoaXMgZnVuY3Rpb24gYW5hbHl6ZXMgYSBnbHlwaCBvdXRsaW5lIGFuZCB0cmllcyB0byBjb21wdXRlIGl0cwotICAqICAgZmlsbCBvcmllbnRhdGlvbiAoc2VlIEBGVF9PcmllbnRhdGlvbikuICBUaGlzIGlzIGRvbmUgYnkgaW50ZWdyYXRpbmcKLSAgKiAgIHRoZSB0b3RhbCBhcmVhIGNvdmVyZWQgYnkgdGhlIG91dGxpbmUuIFRoZSBwb3NpdGl2ZSBpbnRlZ3JhbAotICAqICAgY29ycmVzcG9uZHMgdG8gdGhlIGNsb2Nrd2lzZSBvcmllbnRhdGlvbiBhbmQgQEZUX09SSUVOVEFUSU9OX1BPU1RTQ1JJUFQKLSAgKiAgIGlzIHJldHVybmVkLiBUaGUgbmVnYXRpdmUgaW50ZWdyYWwgY29ycmVzcG9uZHMgdG8gdGhlIGNvdW50ZXItY2xvY2t3aXNlCi0gICogICBvcmllbnRhdGlvbiBhbmQgQEZUX09SSUVOVEFUSU9OX1RSVUVUWVBFIGlzIHJldHVybmVkLgotICAqCi0gICogICBOb3RlIHRoYXQgdGhpcyB3aWxsIHJldHVybiBARlRfT1JJRU5UQVRJT05fVFJVRVRZUEUgZm9yIGVtcHR5Ci0gICogICBvdXRsaW5lcy4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgIG91dGxpbmUgOjoKLSAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBvdXRsaW5lLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIFRoZSBvcmllbnRhdGlvbi4KLSAgKgotICAqLwotICBGVF9FWFBPUlQoIEZUX09yaWVudGF0aW9uICkKLSAgRlRfT3V0bGluZV9HZXRfT3JpZW50YXRpb24oIEZUX091dGxpbmUqICBvdXRsaW5lICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUT1VUTE5fSF9fICovCi0KLQotLyogRU5EICovCi0KLQotLyogTG9jYWwgVmFyaWFibGVzOiAqLwotLyogY29kaW5nOiB1dGYtOCAgICAqLwotLyogRW5kOiAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdHBmci5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdHBmci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWMwMmEyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRwZnIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHBmci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgUEZSLXNwZWNpZmljIGRhdGEgKHNwZWNpZmljYXRpb24gb25seSkuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVFBGUl9IX18KLSNkZWZpbmUgX19GVFBGUl9IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGZyX2ZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUEZSIEZvbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUEZSL1RydWVEb2Mgc3BlY2lmaWMgQVBJLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiBQRlItc3BlY2lmaWMgZnVuY3Rpb25zLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9HZXRfUEZSX01ldHJpY3MKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBSZXR1cm4gdGhlIG91dGxpbmUgYW5kIG1ldHJpY3MgcmVzb2x1dGlvbnMgb2YgYSBnaXZlbiBQRlIgZmFjZS4KLSAgKgotICAqIEBpbnB1dDoKLSAgKiAgICBmYWNlIDo6IEhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4gIEl0IGNhbiBiZSBhIG5vbi1QRlIgZmFjZS4KLSAgKgotICAqIEBvdXRwdXQ6Ci0gICogICAgYW91dGxpbmVfcmVzb2x1dGlvbiA6OgotICAqICAgICAgT3V0bGluZSByZXNvbHV0aW9uLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBmYWNlLT51bml0c19wZXJfRU0nCi0gICogICAgICBmb3Igbm9uLVBGUiBmb250cy4gIE9wdGlvbmFsIChwYXJhbWV0ZXIgY2FuIGJlIE5VTEwpLgotICAqCi0gICogICAgYW1ldHJpY3NfcmVzb2x1dGlvbiA6OgotICAqICAgICAgTWV0cmljcyByZXNvbHV0aW9uLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIGBvdXRsaW5lX3Jlc29sdXRpb24nCi0gICogICAgICBmb3Igbm9uLVBGUiBmb250cy4gIE9wdGlvbmFsIChwYXJhbWV0ZXIgY2FuIGJlIE5VTEwpLgotICAqCi0gICogICAgYW1ldHJpY3NfeF9zY2FsZSA6OgotICAqICAgICAgQSAxNi4xNiBmaXhlZC1wb2ludCBudW1iZXIgdXNlZCB0byBzY2FsZSBkaXN0YW5jZSBleHByZXNzZWQKLSAgKiAgICAgIGluIG1ldHJpY3MgdW5pdHMgdG8gZGV2aWNlIHN1Yi1waXhlbHMuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KLSAgKiAgICAgIGBmYWNlLT5zaXplLT54X3NjYWxlJywgYnV0IGZvciBtZXRyaWNzIG9ubHkuICBPcHRpb25hbCAocGFyYW1ldGVyCi0gICogICAgICBjYW4gYmUgTlVMTCkuCi0gICoKLSAgKiAgICBhbWV0cmljc195X3NjYWxlIDo6Ci0gICogICAgICBTYW1lIGFzIGBhbWV0cmljc194X3NjYWxlJyBidXQgZm9yIHRoZSB2ZXJ0aWNhbCBkaXJlY3Rpb24uCi0gICogICAgICBvcHRpb25hbCAocGFyYW1ldGVyIGNhbiBiZSBOVUxMKS4KLSAgKgotICAqIEByZXR1cm46Ci0gICogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgKgotICAqIEBub3RlOgotICAqICAgSWYgdGhlIGlucHV0IGZhY2UgaXMgbm90IGEgUEZSLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGFuIGVycm9yLgotICAqICAgSG93ZXZlciwgaW4gYWxsIGNhc2VzLCBpdCB3aWxsIHJldHVybiB2YWxpZCB2YWx1ZXMuCi0gICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfUEZSX01ldHJpY3MoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgKmFvdXRsaW5lX3Jlc29sdXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICphbWV0cmljc19yZXNvbHV0aW9uLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAqYW1ldHJpY3NfeF9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgKmFtZXRyaWNzX3lfc2NhbGUgKTsKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgICBGVF9HZXRfUEZSX0tlcm5pbmcKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgICBSZXR1cm4gdGhlIGtlcm5pbmcgcGFpciBjb3JyZXNwb25kaW5nIHRvIHR3byBnbHlwaHMgaW4gYSBQRlIgZmFjZS4KLSAgKiAgICBUaGUgZGlzdGFuY2UgaXMgZXhwcmVzc2VkIGluIG1ldHJpY3MgdW5pdHMsIHVubGlrZSB0aGUgcmVzdWx0IG9mCi0gICogICAgQEZUX0dldF9LZXJuaW5nLgotICAqCi0gICogQGlucHV0OgotICAqICAgIGZhY2UgIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBmYWNlLgotICAqCi0gICogICAgbGVmdCAgOjogSW5kZXggb2YgdGhlIGxlZnQgZ2x5cGguCi0gICoKLSAgKiAgICByaWdodCA6OiBJbmRleCBvZiB0aGUgcmlnaHQgZ2x5cGguCi0gICoKLSAgKiBAb3V0cHV0OgotICAqICAgIGF2ZWN0b3IgOjogQSBrZXJuaW5nIHZlY3Rvci4KLSAgKgotICAqIEByZXR1cm46Ci0gICogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgKgotICAqIEBub3RlOgotICAqICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHJldHVybiBkaXN0YW5jZXMgaW4gb3JpZ2luYWwgUEZSIG1ldHJpY3MKLSAgKiAgICB1bml0cy4gIFRoaXMgaXMgdW5saWtlIEBGVF9HZXRfS2VybmluZyB3aXRoIHRoZSBARlRfS0VSTklOR19VTlNDQUxFRAotICAqICAgIG1vZGUsIHdoaWNoIGFsd2F5cyByZXR1cm5zIGRpc3RhbmNlcyBjb252ZXJ0ZWQgdG8gb3V0bGluZSB1bml0cy4KLSAgKgotICAqICAgIFlvdSBjYW4gdXNlIHRoZSB2YWx1ZSBvZiB0aGUgYHhfc2NhbGUnIGFuZCBgeV9zY2FsZScgcGFyYW1ldGVycwotICAqICAgIHJldHVybmVkIGJ5IEBGVF9HZXRfUEZSX01ldHJpY3MgdG8gc2NhbGUgdGhlc2UgdG8gZGV2aWNlIHN1Yi1waXhlbHMuCi0gICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfUEZSX0tlcm5pbmcoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICByaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IgICphdmVjdG9yICk7Ci0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICAgRlRfR2V0X1BGUl9BZHZhbmNlCi0gICoKLSAgKiBAZGVzY3JpcHRpb246Ci0gICogICAgUmV0dXJuIGEgZ2l2ZW4gZ2x5cGggYWR2YW5jZSwgZXhwcmVzc2VkIGluIG9yaWdpbmFsIG1ldHJpY3MgdW5pdHMsCi0gICogICAgZnJvbSBhIFBGUiBmb250LgotICAqCi0gICogQGlucHV0OgotICAqICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KLSAgKgotICAqICAgIGdpbmRleCA6OiBUaGUgZ2x5cGggaW5kZXguCi0gICoKLSAgKiBAb3V0cHV0OgotICAqICAgIGFhZHZhbmNlIDo6IFRoZSBnbHlwaCBhZHZhbmNlIGluIG1ldHJpY3MgdW5pdHMuCi0gICoKLSAgKiBAcmV0dXJuOgotICAqICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgICBZb3UgY2FuIHVzZSB0aGUgYHhfc2NhbGUnIG9yIGB5X3NjYWxlJyByZXN1bHRzIG9mIEBGVF9HZXRfUEZSX01ldHJpY3MKLSAgKiAgICB0byBjb252ZXJ0IHRoZSBhZHZhbmNlIHRvIGRldmljZSBzdWItcGl4ZWxzIChpLmUuLCAxLzY0dGggb2YgcGl4ZWxzKS4KLSAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9QRlJfQWR2YW5jZSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAqYWFkdmFuY2UgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRQRlJfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0cmVuZGVyLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0cmVuZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOGRhNzAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdHJlbmRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cmVuZGVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSByZW5kZXJlciBtb2R1bGVzIHB1YmxpYyBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUUkVOREVSX0hfXwotI2RlZmluZSBfX0ZUUkVOREVSX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfTU9EVUxFX0gKLSNpbmNsdWRlIEZUX0dMWVBIX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZV9tYW5hZ2VtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBjcmVhdGUgYSBuZXcgZ2x5cGggb2JqZWN0ICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9HbHlwaF9Jbml0RnVuYykoIEZUX0dseXBoICAgICAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgIHNsb3QgKTsKLQotICAvKiBkZXN0cm95cyBhIGdpdmVuIGdseXBoIG9iamVjdCAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9HbHlwaF9Eb25lRnVuYykoIEZUX0dseXBoICBnbHlwaCApOwotCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX0dseXBoX1RyYW5zZm9ybUZ1bmMpKCBGVF9HbHlwaCAgICAgICAgICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfTWF0cml4KiAgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBkZWx0YSApOwotCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX0dseXBoX0dldEJCb3hGdW5jKSggRlRfR2x5cGggIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQkJveCogIGFiYm94ICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0dseXBoX0NvcHlGdW5jKSggRlRfR2x5cGggICBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaCAgIHRhcmdldCApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9HbHlwaF9QcmVwYXJlRnVuYykoIEZUX0dseXBoICAgICAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgIHNsb3QgKTsKLQotLyogZGVwcmVjYXRlZCAqLwotI2RlZmluZSBGVF9HbHlwaF9Jbml0X0Z1bmMgICAgICAgRlRfR2x5cGhfSW5pdEZ1bmMKLSNkZWZpbmUgRlRfR2x5cGhfRG9uZV9GdW5jICAgICAgIEZUX0dseXBoX0RvbmVGdW5jCi0jZGVmaW5lIEZUX0dseXBoX1RyYW5zZm9ybV9GdW5jICBGVF9HbHlwaF9UcmFuc2Zvcm1GdW5jCi0jZGVmaW5lIEZUX0dseXBoX0JCb3hfRnVuYyAgICAgICBGVF9HbHlwaF9HZXRCQm94RnVuYwotI2RlZmluZSBGVF9HbHlwaF9Db3B5X0Z1bmMgICAgICAgRlRfR2x5cGhfQ29weUZ1bmMKLSNkZWZpbmUgRlRfR2x5cGhfUHJlcGFyZV9GdW5jICAgIEZUX0dseXBoX1ByZXBhcmVGdW5jCi0KLQotICBzdHJ1Y3QgIEZUX0dseXBoX0NsYXNzXwotICB7Ci0gICAgRlRfTG9uZyAgICAgICAgICAgICAgICAgZ2x5cGhfc2l6ZTsKLSAgICBGVF9HbHlwaF9Gb3JtYXQgICAgICAgICBnbHlwaF9mb3JtYXQ7Ci0gICAgRlRfR2x5cGhfSW5pdEZ1bmMgICAgICAgZ2x5cGhfaW5pdDsKLSAgICBGVF9HbHlwaF9Eb25lRnVuYyAgICAgICBnbHlwaF9kb25lOwotICAgIEZUX0dseXBoX0NvcHlGdW5jICAgICAgIGdseXBoX2NvcHk7Ci0gICAgRlRfR2x5cGhfVHJhbnNmb3JtRnVuYyAgZ2x5cGhfdHJhbnNmb3JtOwotICAgIEZUX0dseXBoX0dldEJCb3hGdW5jICAgIGdseXBoX2Jib3g7Ci0gICAgRlRfR2x5cGhfUHJlcGFyZUZ1bmMgICAgZ2x5cGhfcHJlcGFyZTsKLSAgfTsKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9SZW5kZXJlcl9SZW5kZXJGdW5jKSggRlRfUmVuZGVyZXIgICAgICAgcmVuZGVyZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIG9yaWdpbiApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9SZW5kZXJlcl9UcmFuc2Zvcm1GdW5jKSggRlRfUmVuZGVyZXIgICAgICAgcmVuZGVyZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX01hdHJpeCogIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgZGVsdGEgKTsKLQotCi0gIHR5cGVkZWYgdm9pZAotICAoKkZUX1JlbmRlcmVyX0dldENCb3hGdW5jKSggRlRfUmVuZGVyZXIgICByZW5kZXJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JCb3gqICAgICAgY2JveCApOwotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1JlbmRlcmVyX1NldE1vZGVGdW5jKSggRlRfUmVuZGVyZXIgIHJlbmRlcmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgIG1vZGVfdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgIG1vZGVfcHRyICk7Ci0KLS8qIGRlcHJlY2F0ZWQgaWRlbnRpZmllcnMgKi8KLSNkZWZpbmUgRlRSZW5kZXJlcl9yZW5kZXIgIEZUX1JlbmRlcmVyX1JlbmRlckZ1bmMKLSNkZWZpbmUgRlRSZW5kZXJlcl90cmFuc2Zvcm0gIEZUX1JlbmRlcmVyX1RyYW5zZm9ybUZ1bmMKLSNkZWZpbmUgRlRSZW5kZXJlcl9nZXRDQm94ICBGVF9SZW5kZXJlcl9HZXRDQm94RnVuYwotI2RlZmluZSBGVFJlbmRlcmVyX3NldE1vZGUgIEZUX1JlbmRlcmVyX1NldE1vZGVGdW5jCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZW5kZXJlcl9DbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcmVuZGVyZXIgbW9kdWxlIGNsYXNzIGRlc2NyaXB0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByb290ICAgICAgICAgICAgOjogVGhlIHJvb3QgQEZUX01vZHVsZV9DbGFzcyBmaWVsZHMuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2Zvcm1hdCAgICA6OiBUaGUgZ2x5cGggaW1hZ2UgZm9ybWF0IHRoaXMgcmVuZGVyZXIgaGFuZGxlcy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVuZGVyX2dseXBoICAgIDo6IEEgbWV0aG9kIHVzZWQgdG8gcmVuZGVyIHRoZSBpbWFnZSB0aGF0IGlzIGluIGEgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiBnbHlwaCBzbG90IGludG8gYSBiaXRtYXAuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHJhbnNmb3JtX2dseXBoIDo6IEEgbWV0aG9kIHVzZWQgdG8gdHJhbnNmb3JtIHRoZSBpbWFnZSB0aGF0IGlzIGluICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBhIGdpdmVuIGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2V0X2dseXBoX2Nib3ggIDo6IEEgbWV0aG9kIHVzZWQgdG8gYWNjZXNzIHRoZSBnbHlwaCdzIGNib3guICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzZXRfbW9kZSAgICAgICAgOjogQSBtZXRob2QgdXNlZCB0byBwYXNzIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhc3Rlcl9jbGFzcyAgICA6OiBGb3IgQEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FIHJlbmRlcmVycyBvbmx5LiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIHBvaW50ZXIgdG8gaXRzIHJhc3RlcidzIGNsYXNzLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9SZW5kZXJlcl9DbGFzc18KLSAgewotICAgIEZUX01vZHVsZV9DbGFzcyAgICAgICAgICAgIHJvb3Q7Ci0KLSAgICBGVF9HbHlwaF9Gb3JtYXQgICAgICAgICAgICBnbHlwaF9mb3JtYXQ7Ci0KLSAgICBGVF9SZW5kZXJlcl9SZW5kZXJGdW5jICAgICByZW5kZXJfZ2x5cGg7Ci0gICAgRlRfUmVuZGVyZXJfVHJhbnNmb3JtRnVuYyAgdHJhbnNmb3JtX2dseXBoOwotICAgIEZUX1JlbmRlcmVyX0dldENCb3hGdW5jICAgIGdldF9nbHlwaF9jYm94OwotICAgIEZUX1JlbmRlcmVyX1NldE1vZGVGdW5jICAgIHNldF9tb2RlOwotCi0gICAgRlRfUmFzdGVyX0Z1bmNzKiAgICAgICAgICAgcmFzdGVyX2NsYXNzOwotCi0gIH0gRlRfUmVuZGVyZXJfQ2xhc3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfUmVuZGVyZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXRyaWV2ZSB0aGUgY3VycmVudCByZW5kZXJlciBmb3IgYSBnaXZlbiBnbHlwaCBmb3JtYXQuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvcm1hdCAgOjogVGhlIGdseXBoIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgcmVuZGVyZXIgaGFuZGxlLiAgMH5pZiBub25lIGZvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBtb2R1bGUgYWxyZWFkeSBleGlzdHMgYnkgdGhhdCBuYW1lLCAqLwotICAvKiAgICBvciBpZiB0aGUgbW9kdWxlIHJlcXVpcmVzIGEgdmVyc2lvbiBvZiBGcmVlVHlwZSB0aGF0IGlzIHRvbyBncmVhdC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRvIGFkZCBhIG5ldyByZW5kZXJlciwgc2ltcGx5IHVzZSBARlRfQWRkX01vZHVsZS4gIFRvIHJldHJpZXZlIGEgICAqLwotICAvKiAgICByZW5kZXJlciBieSBpdHMgbmFtZSwgdXNlIEBGVF9HZXRfTW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggRlRfUmVuZGVyZXIgKQotICBGVF9HZXRfUmVuZGVyZXIoIEZUX0xpYnJhcnkgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICBGVF9HbHlwaF9Gb3JtYXQgIGZvcm1hdCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2V0X1JlbmRlcmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2V0IHRoZSBjdXJyZW50IHJlbmRlcmVyIHRvIHVzZSwgYW5kIHNldCBhZGRpdGlvbmFsIG1vZGUuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSAgICA6OiBBIGhhbmRsZSB0byB0aGUgbGlicmFyeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVuZGVyZXIgICA6OiBBIGhhbmRsZSB0byB0aGUgcmVuZGVyZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fcGFyYW1zIDo6IFRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtZXRlcnMgOjogQWRkaXRpb25hbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluIGNhc2Ugb2Ygc3VjY2VzcywgdGhlIHJlbmRlcmVyIHdpbGwgYmUgdXNlZCB0byBjb252ZXJ0IGdseXBoICAgICAqLwotICAvKiAgICBpbWFnZXMgaW4gdGhlIHJlbmRlcmVyJ3Mga25vd24gZm9ybWF0IGludG8gYml0bWFwcy4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZG9lc24ndCBjaGFuZ2UgdGhlIGN1cnJlbnQgcmVuZGVyZXIgZm9yIG90aGVyIGZvcm1hdHMuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ3VycmVudGx5LCBubyBGcmVlVHlwZSByZW5kZXJlciBtb2R1bGUgdXNlcyBgcGFyYW1ldGVycyc7IHlvdSAgICAgICovCi0gIC8qICAgIHNob3VsZCB0aHVzIGFsd2F5cyBwYXNzIE5VTEwgYXMgdGhlIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1NldF9SZW5kZXJlciggRlRfTGlicmFyeSAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJlciAgICByZW5kZXJlciwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtZXRlcnMgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRSRU5ERVJfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0c2l6ZXMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRzaXplcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWY4NDI0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRzaXplcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c2l6ZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBzaXplIG9iamVjdHMgbWFuYWdlbWVudCAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFR5cGljYWwgYXBwbGljYXRpb24gd291bGQgbm9ybWFsbHkgbm90IG5lZWQgdG8gdXNlIHRoZXNlIGZ1bmN0aW9ucy4gICAqLwotICAvKiBIb3dldmVyLCB0aGV5IGhhdmUgYmVlbiBwbGFjZWQgaW4gYSBwdWJsaWMgQVBJIGZvciB0aGUgcmFyZSBjYXNlcyAgICAgKi8KLSAgLyogd2hlcmUgdGhleSBhcmUgbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRTSVpFU19IX18KLSNkZWZpbmUgX19GVFNJWkVTX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemVzX21hbmFnZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNpemUgTWFuYWdlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1hbmFnaW5nIG11bHRpcGxlIHNpemVzIHBlciBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gY3JlYXRpbmcgYSBuZXcgZmFjZSBvYmplY3QgKGUuZy4sIHdpdGggQEZUX05ld19GYWNlKSwgYW4gICAgICAqLwotICAvKiAgICBARlRfU2l6ZSBvYmplY3QgaXMgYXV0b21hdGljYWxseSBjcmVhdGVkIGFuZCB1c2VkIHRvIHN0b3JlIGFsbCAgICAgKi8KLSAgLyogICAgcGl4ZWwtc2l6ZSBkZXBlbmRlbnQgaW5mb3JtYXRpb24sIGF2YWlsYWJsZSBpbiB0aGUgYGZhY2UtPnNpemUnICAgICovCi0gIC8qICAgIGZpZWxkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSXQgaXMgaG93ZXZlciBwb3NzaWJsZSB0byBjcmVhdGUgbW9yZSBzaXplcyBmb3IgYSBnaXZlbiBmYWNlLCAgICAgICovCi0gIC8qICAgIG1vc3RseSBpbiBvcmRlciB0byBtYW5hZ2Ugc2V2ZXJhbCBjaGFyYWN0ZXIgcGl4ZWwgc2l6ZXMgb2YgdGhlICAgICAqLwotICAvKiAgICBzYW1lIGZvbnQgZmFtaWx5IGFuZCBzdHlsZS4gIFNlZSBARlRfTmV3X1NpemUgYW5kIEBGVF9Eb25lX1NpemUuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCBARlRfU2V0X1BpeGVsX1NpemVzIGFuZCBARlRfU2V0X0NoYXJfU2l6ZSBvbmx5ICAgICAgICAgICAqLwotICAvKiAgICBtb2RpZnkgdGhlIGNvbnRlbnRzIG9mIHRoZSBjdXJyZW50IGBhY3RpdmUnIHNpemU7IHlvdSB0aHVzIG5lZWQgICAgKi8KLSAgLyogICAgdG8gdXNlIEBGVF9BY3RpdmF0ZV9TaXplIHRvIGNoYW5nZSBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICA5OSUgb2YgYXBwbGljYXRpb25zIHdvbid0IG5lZWQgdGhlIGZ1bmN0aW9ucyBwcm92aWRlZCBoZXJlLCAgICAgICAgKi8KLSAgLyogICAgZXNwZWNpYWxseSBpZiB0aGV5IHVzZSB0aGUgY2FjaGluZyBzdWItc3lzdGVtLCBzbyBiZSBjYXV0aW91cyAgICAgICovCi0gIC8qICAgIHdoZW4gdXNpbmcgdGhlc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDcmVhdGUgYSBuZXcgc2l6ZSBvYmplY3QgZnJvbSBhIGdpdmVuIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIGEgcGFyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhc2l6ZSA6OiBBIGhhbmRsZSB0byBhIG5ldyBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBZb3UgbmVlZCB0byBjYWxsIEBGVF9BY3RpdmF0ZV9TaXplIGluIG9yZGVyIHRvIHNlbGVjdCB0aGUgbmV3IHNpemUgKi8KLSAgLyogICAgZm9yIHVwY29taW5nIGNhbGxzIHRvIEBGVF9TZXRfUGl4ZWxfU2l6ZXMsIEBGVF9TZXRfQ2hhcl9TaXplLCAgICAgICovCi0gIC8qICAgIEBGVF9Mb2FkX0dseXBoLCBARlRfTG9hZF9DaGFyLCBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX05ld19TaXplKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgIEZUX1NpemUqICBzaXplICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Eb25lX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEaXNjYXJkIGEgZ2l2ZW4gc2l6ZSBvYmplY3QuICBOb3RlIHRoYXQgQEZUX0RvbmVfRmFjZSAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXV0b21hdGljYWxseSBkaXNjYXJkcyBhbGwgc2l6ZSBvYmplY3RzIGFsbG9jYXRlZCB3aXRoICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9OZXdfU2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgOjogQSBoYW5kbGUgdG8gYSB0YXJnZXQgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0RvbmVfU2l6ZSggRlRfU2l6ZSAgc2l6ZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQWN0aXZhdGVfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRXZlbiB0aG91Z2ggaXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIHNldmVyYWwgc2l6ZSBvYmplY3RzIGZvciBhICAgICovCi0gIC8qICAgIGdpdmVuIGZhY2UgKHNlZSBARlRfTmV3X1NpemUgZm9yIGRldGFpbHMpLCBmdW5jdGlvbnMgbGlrZSAgICAgICAgICAqLwotICAvKiAgICBARlRfTG9hZF9HbHlwaCBvciBARlRfTG9hZF9DaGFyIG9ubHkgdXNlIHRoZSBvbmUgdGhhdCBoYXMgYmVlbiAgICAgKi8KLSAgLyogICAgYWN0aXZhdGVkIGxhc3QgdG8gZGV0ZXJtaW5lIHRoZSBgY3VycmVudCBjaGFyYWN0ZXIgcGl4ZWwgc2l6ZScuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGBhY3RpdmF0ZScgYSBwcmV2aW91c2x5IGNyZWF0ZWQgc2l6ZSAgKi8KLSAgLyogICAgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgYGZhY2UnIGlzIHRoZSBzaXplJ3MgcGFyZW50IGZhY2Ugb2JqZWN0LCB0aGlzIGZ1bmN0aW9uIGNoYW5nZXMgICovCi0gIC8qICAgIHRoZSB2YWx1ZSBvZiBgZmFjZS0+c2l6ZScgdG8gdGhlIGlucHV0IHNpemUgaGFuZGxlLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0FjdGl2YXRlX1NpemUoIEZUX1NpemUgIHNpemUgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRTSVpFU19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRzbmFtZXMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRzbmFtZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY3ZmJlMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0c25hbWVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzbmFtZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFNpbXBsZSBpbnRlcmZhY2UgdG8gYWNjZXNzIFNGTlQgbmFtZSB0YWJsZXMgKHdoaWNoIGFyZSB1c2VkICAgICAgICAgICovCi0vKiAgICB0byBob2xkIGZvbnQgbmFtZXMsIGNvcHlyaWdodCBpbmZvLCBub3RpY2VzLCBldGMuKSAoc3BlY2lmaWNhdGlvbikuICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoaXMgaXMgX25vdF8gdXNlZCB0byByZXRyaWV2ZSBnbHlwaCBuYW1lcyEgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRfU0ZOVF9OQU1FU19IX18KLSNkZWZpbmUgX19GVF9TRk5UX05BTUVTX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNmbnRfbmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNGTlQgTmFtZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFjY2VzcyB0aGUgbmFtZXMgZW1iZWRkZWQgaW4gVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGZpbGVzLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBUcnVlVHlwZSBhbmQgT3BlblR5cGUgc3BlY2lmaWNhdGlvbnMgYWxsb3cgdGhlIGluY2x1c2lvbiBvZiAgICAqLwotICAvKiAgICBhIHNwZWNpYWwgYG5hbWVzIHRhYmxlJyBpbiBmb250IGZpbGVzLiAgVGhpcyB0YWJsZSBjb250YWlucyAgICAgICAgKi8KLSAgLyogICAgdGV4dHVhbCAoYW5kIGludGVybmF0aW9uYWxpemVkKSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGZvbnQsICAgICovCi0gIC8qICAgIGxpa2UgZmFtaWx5IG5hbWUsIGNvcHlyaWdodCwgdmVyc2lvbiwgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGRlZmluaXRpb25zIGJlbG93IGFyZSB1c2VkIHRvIGFjY2VzcyB0aGVtIGlmIGF2YWlsYWJsZS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOb3RlIHRoYXQgdGhpcyBoYXMgbm90aGluZyB0byBkbyB3aXRoIGdseXBoIG5hbWVzISAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2ZudE5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhbiBTRk5UIGBuYW1lJyB0YWJsZSBlbnRyeS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGxhdGZvcm1faWQgOjogVGhlIHBsYXRmb3JtIElEIGZvciBgc3RyaW5nJy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBlbmNvZGluZ19pZCA6OiBUaGUgZW5jb2RpbmcgSUQgZm9yIGBzdHJpbmcnLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxhbmd1YWdlX2lkIDo6IFRoZSBsYW5ndWFnZSBJRCBmb3IgYHN0cmluZycuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmFtZV9pZCAgICAgOjogQW4gaWRlbnRpZmllciBmb3IgYHN0cmluZycuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJpbmcgICAgICA6OiBUaGUgYG5hbWUnIHN0cmluZy4gIE5vdGUgdGhhdCBpdHMgZm9ybWF0IGRpZmZlcnMgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHRoZSAocGxhdGZvcm0sZW5jb2RpbmcpIHBhaXIuICBJdCBjYW4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGJlIGEgUGFzY2FsIFN0cmluZywgYSBVVEYtMTYgb25lLCBldGMuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgR2VuZXJhbGx5IHNwZWFraW5nLCB0aGUgc3RyaW5nIGlzIG5vdCAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHplcm8tdGVybWluYXRlZC4gIFBsZWFzZSByZWZlciB0byB0aGUgVHJ1ZVR5cGUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmluZ19sZW4gIDo6IFRoZSBsZW5ndGggb2YgYHN0cmluZycgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBvc3NpYmxlIHZhbHVlcyBmb3IgYHBsYXRmb3JtX2lkJywgYGVuY29kaW5nX2lkJywgYGxhbmd1YWdlX2lkJywgICAqLwotICAvKiAgICBhbmQgYG5hbWVfaWQnIGFyZSBnaXZlbiBpbiB0aGUgZmlsZSBgdHRuYW1laWQuaCcuICBGb3IgZGV0YWlscyAgICAgKi8KLSAgLyogICAgcGxlYXNlIHJlZmVyIHRvIHRoZSBUcnVlVHlwZSBvciBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWUgYWxzbyBAVFRfUExBVEZPUk1fWFhYLCBAVFRfQVBQTEVfSURfWFhYLCBAVFRfTUFDX0lEX1hYWCwgICAgICAgKi8KLSAgLyogICAgQFRUX0lTT19JRF9YWFgsIGFuZCBAVFRfTVNfSURfWFhYLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfU2ZudE5hbWVfCi0gIHsKLSAgICBGVF9VU2hvcnQgIHBsYXRmb3JtX2lkOwotICAgIEZUX1VTaG9ydCAgZW5jb2RpbmdfaWQ7Ci0gICAgRlRfVVNob3J0ICBsYW5ndWFnZV9pZDsKLSAgICBGVF9VU2hvcnQgIG5hbWVfaWQ7Ci0KLSAgICBGVF9CeXRlKiAgIHN0cmluZzsgICAgICAvKiB0aGlzIHN0cmluZyBpcyAqbm90KiBudWxsLXRlcm1pbmF0ZWQhICovCi0gICAgRlRfVUludCAgICBzdHJpbmdfbGVuOyAgLyogaW4gYnl0ZXMgKi8KLQotICB9IEZUX1NmbnROYW1lOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1NmbnRfTmFtZV9Db3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0cmlldmUgdGhlIG51bWJlciBvZiBuYW1lIHN0cmluZ3MgaW4gdGhlIFNGTlQgYG5hbWUnIHRhYmxlLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG51bWJlciBvZiBzdHJpbmdzIGluIHRoZSBgbmFtZScgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX1VJbnQgKQotICBGVF9HZXRfU2ZudF9OYW1lX0NvdW50KCBGVF9GYWNlICBmYWNlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfU2ZudF9OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXRyaWV2ZSBhIHN0cmluZyBvZiB0aGUgU0ZOVCBgbmFtZScgdGFibGUgZm9yIGEgZ2l2ZW4gaW5kZXguICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGlkeCAgIDo6IFRoZSBpbmRleCBvZiB0aGUgYG5hbWUnIHN0cmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFuYW1lIDo6IFRoZSBpbmRleGVkIEBGVF9TZm50TmFtZSBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBgc3RyaW5nJyBhcnJheSByZXR1cm5lZCBpbiB0aGUgYGFuYW1lJyBzdHJ1Y3R1cmUgaXMgbm90ICAgICAgICAqLwotICAvKiAgICBudWxsLXRlcm1pbmF0ZWQuICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGRlYWxsb2NhdGUgaXQgaWYgaXQgaXMgbm8gKi8KLSAgLyogICAgbG9uZ2VyIGluIHVzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2UgQEZUX0dldF9TZm50X05hbWVfQ291bnQgdG8gZ2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgYXZhaWxhYmxlICAgKi8KLSAgLyogICAgYG5hbWUnIHRhYmxlIGVudHJpZXMsIHRoZW4gZG8gYSBsb29wIHVudGlsIHlvdSBnZXQgdGhlIHJpZ2h0ICAgICAgICovCi0gIC8qICAgIHBsYXRmb3JtLCBlbmNvZGluZywgYW5kIG5hbWUgSUQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9TZm50X05hbWUoIEZUX0ZhY2UgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgIEZUX1NmbnROYW1lICAqYW5hbWUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGNvbnN0YW50OgotICAgKiAgIEZUX1BBUkFNX1RBR19JR05PUkVfUFJFRkVSUkVEX0ZBTUlMWQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBjb25zdGFudCB1c2VkIGFzIHRoZSB0YWcgb2YgQEZUX1BhcmFtZXRlciBzdHJ1Y3R1cmVzIHRvIG1ha2UKLSAgICogICBGVF9PcGVuX0ZhY2UoKSBpZ25vcmUgcHJlZmVycmVkIGZhbWlseSBzdWJmYW1pbHkgbmFtZXMgaW4gYG5hbWUnCi0gICAqICAgdGFibGUgc2luY2UgT3BlblR5cGUgdmVyc2lvbiAxLjQuICBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aAotICAgKiAgIGxlZ2FjeSBzeXN0ZW1zIHRoYXQgaGF2ZSBhIDQtZmFjZS1wZXItZmFtaWx5IHJlc3RyaWN0aW9uLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfUEFSQU1fVEFHX0lHTk9SRV9QUkVGRVJSRURfRkFNSUxZICBGVF9NQUtFX1RBRyggJ2knLCAnZycsICdwJywgJ2YnICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGNvbnN0YW50OgotICAgKiAgIEZUX1BBUkFNX1RBR19JR05PUkVfUFJFRkVSUkVEX1NVQkZBTUlMWQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBjb25zdGFudCB1c2VkIGFzIHRoZSB0YWcgb2YgQEZUX1BhcmFtZXRlciBzdHJ1Y3R1cmVzIHRvIG1ha2UKLSAgICogICBGVF9PcGVuX0ZhY2UoKSBpZ25vcmUgcHJlZmVycmVkIHN1YmZhbWlseSBuYW1lcyBpbiBgbmFtZScgdGFibGUgc2luY2UKLSAgICogICBPcGVuVHlwZSB2ZXJzaW9uIDEuNC4gIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeQotICAgKiAgIHN5c3RlbXMgdGhhdCBoYXZlIGEgNC1mYWNlLXBlci1mYW1pbHkgcmVzdHJpY3Rpb24uCi0gICAqCi0gICAqLwotI2RlZmluZSBGVF9QQVJBTV9UQUdfSUdOT1JFX1BSRUZFUlJFRF9TVUJGQU1JTFkgIEZUX01BS0VfVEFHKCAnaScsICdnJywgJ3AnLCAncycgKQotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVF9TRk5UX05BTUVTX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdHN0cm9rZS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdHN0cm9rZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWJiMWU3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRzdHJva2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHN0cm9rZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgcGF0aCBzdHJva2VyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVF9TVFJPS0VfSF9fCi0jZGVmaW5lIF9fRlRfU1RST0tFX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX09VVExJTkVfSAotI2luY2x1ZGUgRlRfR0xZUEhfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAc2VjdGlvbjoKLSAgKiAgICBnbHlwaF9zdHJva2VyCi0gICoKLSAgKiBAdGl0bGU6Ci0gICogICAgR2x5cGggU3Ryb2tlcgotICAqCi0gICogQGFic3RyYWN0OgotICAqICAgIEdlbmVyYXRpbmcgYm9yZGVyZWQgYW5kIHN0cm9rZWQgZ2x5cGhzLgotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgIFRoaXMgY29tcG9uZW50IGdlbmVyYXRlcyBzdHJva2VkIG91dGxpbmVzIG9mIGEgZ2l2ZW4gdmVjdG9yaWFsCi0gICogICAgZ2x5cGguICBJdCBhbHNvIGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIGBvdXRzaWRlJyBhbmQvb3IgdGhlCi0gICogICAgYGluc2lkZScgYm9yZGVycyBvZiB0aGUgc3Ryb2tlLgotICAqCi0gICogICAgVGhpcyBjYW4gYmUgdXNlZnVsIHRvIGdlbmVyYXRlIGBib3JkZXJlZCcgZ2x5cGgsIGkuZS4sIGdseXBocwotICAqICAgIGRpc3BsYXllZCB3aXRoIGEgY29sb3VyZWQgKGFuZCBhbnRpLWFsaWFzZWQpIGJvcmRlciBhcm91bmQgdGhlaXIKLSAgKiAgICBzaGFwZS4KLSAgKgotICAqIEBvcmRlcjoKLSAgKiAgICBGVF9TdHJva2VyCi0gICoKLSAgKiAgICBGVF9TdHJva2VyX0xpbmVKb2luCi0gICogICAgRlRfU3Ryb2tlcl9MaW5lQ2FwCi0gICogICAgRlRfU3Ryb2tlckJvcmRlcgotICAqCi0gICogICAgRlRfT3V0bGluZV9HZXRJbnNpZGVCb3JkZXIKLSAgKiAgICBGVF9PdXRsaW5lX0dldE91dHNpZGVCb3JkZXIKLSAgKgotICAqICAgIEZUX0dseXBoX1N0cm9rZQotICAqICAgIEZUX0dseXBoX1N0cm9rZUJvcmRlcgotICAqCi0gICogICAgRlRfU3Ryb2tlcl9OZXcKLSAgKiAgICBGVF9TdHJva2VyX1NldAotICAqICAgIEZUX1N0cm9rZXJfUmV3aW5kCi0gICogICAgRlRfU3Ryb2tlcl9QYXJzZU91dGxpbmUKLSAgKiAgICBGVF9TdHJva2VyX0RvbmUKLSAgKgotICAqICAgIEZUX1N0cm9rZXJfQmVnaW5TdWJQYXRoCi0gICogICAgRlRfU3Ryb2tlcl9FbmRTdWJQYXRoCi0gICoKLSAgKiAgICBGVF9TdHJva2VyX0xpbmVUbwotICAqICAgIEZUX1N0cm9rZXJfQ29uaWNUbwotICAqICAgIEZUX1N0cm9rZXJfQ3ViaWNUbwotICAqCi0gICogICAgRlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMKLSAgKiAgICBGVF9TdHJva2VyX0V4cG9ydEJvcmRlcgotICAqICAgIEZUX1N0cm9rZXJfR2V0Q291bnRzCi0gICogICAgRlRfU3Ryb2tlcl9FeHBvcnQKLSAgKgotICAqLwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEB0eXBlOgotICAqICAgRlRfU3Ryb2tlcgotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgT3BhcXVlIGhhbmRsZSB0byBhIHBhdGggc3Ryb2tlciBvYmplY3QuCi0gICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX1N0cm9rZXJSZWNfKiAgRlRfU3Ryb2tlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICBGVF9TdHJva2VyX0xpbmVKb2luCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGVzZSB2YWx1ZXMgZGV0ZXJtaW5lIGhvdyB0d28gam9pbmluZyBsaW5lcyBhcmUgcmVuZGVyZWQKLSAgICogICBpbiBhIHN0cm9rZXIuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgRlRfU1RST0tFUl9MSU5FSk9JTl9ST1VORCA6OgotICAgKiAgICAgVXNlZCB0byByZW5kZXIgcm91bmRlZCBsaW5lIGpvaW5zLiAgQ2lyY3VsYXIgYXJjcyBhcmUgdXNlZAotICAgKiAgICAgdG8gam9pbiB0d28gbGluZXMgc21vb3RobHkuCi0gICAqCi0gICAqICAgRlRfU1RST0tFUl9MSU5FSk9JTl9CRVZFTCA6OgotICAgKiAgICAgVXNlZCB0byByZW5kZXIgYmV2ZWxlZCBsaW5lIGpvaW5zLiAgVGhlIG91dGVyIGNvcm5lciBvZgotICAgKiAgICAgdGhlIGpvaW5lZCBsaW5lcyBpcyBmaWxsZWQgYnkgZW5jbG9zaW5nIHRoZSB0cmlhbmd1bGFyCi0gICAqICAgICByZWdpb24gb2YgdGhlIGNvcm5lciB3aXRoIGEgc3RyYWlnaHQgbGluZSBiZXR3ZWVuIHRoZQotICAgKiAgICAgb3V0ZXIgY29ybmVycyBvZiBlYWNoIHN0cm9rZS4KLSAgICoKLSAgICogICBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSX0ZJWEVEIDo6Ci0gICAqICAgICBVc2VkIHRvIHJlbmRlciBtaXRlcmVkIGxpbmUgam9pbnMsIHdpdGggZml4ZWQgYmV2ZWxzIGlmIHRoZQotICAgKiAgICAgbWl0ZXIgbGltaXQgaXMgZXhjZWVkZWQuICBUaGUgb3V0ZXIgZWRnZXMgb2YgdGhlIHN0cm9rZXMKLSAgICogICAgIGZvciB0aGUgdHdvIHNlZ21lbnRzIGFyZSBleHRlbmRlZCB1bnRpbCB0aGV5IG1lZXQgYXQgYW4KLSAgICogICAgIGFuZ2xlLiAgSWYgdGhlIHNlZ21lbnRzIG1lZXQgYXQgdG9vIHNoYXJwIGFuIGFuZ2xlIChzdWNoCi0gICAqICAgICB0aGF0IHRoZSBtaXRlciB3b3VsZCBleHRlbmQgZnJvbSB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZQotICAgKiAgICAgc2VnbWVudHMgYSBkaXN0YW5jZSBncmVhdGVyIHRoYW4gdGhlIHByb2R1Y3Qgb2YgdGhlIG1pdGVyCi0gICAqICAgICBsaW1pdCB2YWx1ZSBhbmQgdGhlIGJvcmRlciByYWRpdXMpLCB0aGVuIGEgYmV2ZWwgam9pbiAoc2VlCi0gICAqICAgICBhYm92ZSkgaXMgdXNlZCBpbnN0ZWFkLiAgVGhpcyBwcmV2ZW50cyBsb25nIHNwaWtlcyBiZWluZwotICAgKiAgICAgY3JlYXRlZC4gIEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVJfRklYRUQgZ2VuZXJhdGVzIGEgbWl0ZXIKLSAgICogICAgIGxpbmUgam9pbiBhcyB1c2VkIGluIFBvc3RTY3JpcHQgYW5kIFBERi4KLSAgICoKLSAgICogICBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSX1ZBUklBQkxFIDo6Ci0gICAqICAgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUiA6OgotICAgKiAgICAgVXNlZCB0byByZW5kZXIgbWl0ZXJlZCBsaW5lIGpvaW5zLCB3aXRoIHZhcmlhYmxlIGJldmVscyBpZgotICAgKiAgICAgdGhlIG1pdGVyIGxpbWl0IGlzIGV4Y2VlZGVkLiAgVGhlIGludGVyc2VjdGlvbiBvZiB0aGUKLSAgICogICAgIHN0cm9rZXMgaXMgY2xpcHBlZCBhdCBhIGxpbmUgcGVycGVuZGljdWxhciB0byB0aGUgYmlzZWN0b3IKLSAgICogICAgIG9mIHRoZSBhbmdsZSBiZXR3ZWVuIHRoZSBzdHJva2VzLCBhdCB0aGUgZGlzdGFuY2UgZnJvbSB0aGUKLSAgICogICAgIGludGVyc2VjdGlvbiBvZiB0aGUgc2VnbWVudHMgZXF1YWwgdG8gdGhlIHByb2R1Y3Qgb2YgdGhlCi0gICAqICAgICBtaXRlciBsaW1pdCB2YWx1ZSBhbmQgdGhlIGJvcmRlciByYWRpdXMuICBUaGlzIHByZXZlbnRzCi0gICAqICAgICBsb25nIHNwaWtlcyBiZWluZyBjcmVhdGVkLgotICAgKiAgICAgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUl9WQVJJQUJMRSBnZW5lcmF0ZXMgYSBtaXRlcmVkIGxpbmUKLSAgICogICAgIGpvaW4gYXMgdXNlZCBpbiBYUFMuICBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSIGlzIGFuIGFsaWFzCi0gICAqICAgICBmb3IgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUl9WQVJJQUJMRSwgcmV0YWluZWQgZm9yCi0gICAqICAgICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KLSAgICovCi0gIHR5cGVkZWYgZW51bSAgRlRfU3Ryb2tlcl9MaW5lSm9pbl8KLSAgewotICAgIEZUX1NUUk9LRVJfTElORUpPSU5fUk9VTkQgICAgICAgICAgPSAwLAotICAgIEZUX1NUUk9LRVJfTElORUpPSU5fQkVWRUwgICAgICAgICAgPSAxLAotICAgIEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVJfVkFSSUFCTEUgPSAyLAotICAgIEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVIgICAgICAgICAgPSBGVF9TVFJPS0VSX0xJTkVKT0lOX01JVEVSX1ZBUklBQkxFLAotICAgIEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVJfRklYRUQgICAgPSAzCi0KLSAgfSBGVF9TdHJva2VyX0xpbmVKb2luOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIEZUX1N0cm9rZXJfTGluZUNhcAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhlc2UgdmFsdWVzIGRldGVybWluZSBob3cgdGhlIGVuZCBvZiBvcGVuZWQgc3ViLXBhdGhzIGFyZQotICAgKiAgIHJlbmRlcmVkIGluIGEgc3Ryb2tlLgotICAgKgotICAgKiBAdmFsdWVzOgotICAgKiAgIEZUX1NUUk9LRVJfTElORUNBUF9CVVRUIDo6Ci0gICAqICAgICBUaGUgZW5kIG9mIGxpbmVzIGlzIHJlbmRlcmVkIGFzIGEgZnVsbCBzdG9wIG9uIHRoZSBsYXN0Ci0gICAqICAgICBwb2ludCBpdHNlbGYuCi0gICAqCi0gICAqICAgRlRfU1RST0tFUl9MSU5FQ0FQX1JPVU5EIDo6Ci0gICAqICAgICBUaGUgZW5kIG9mIGxpbmVzIGlzIHJlbmRlcmVkIGFzIGEgaGFsZi1jaXJjbGUgYXJvdW5kIHRoZQotICAgKiAgICAgbGFzdCBwb2ludC4KLSAgICoKLSAgICogICBGVF9TVFJPS0VSX0xJTkVDQVBfU1FVQVJFIDo6Ci0gICAqICAgICBUaGUgZW5kIG9mIGxpbmVzIGlzIHJlbmRlcmVkIGFzIGEgc3F1YXJlIGFyb3VuZCB0aGUKLSAgICogICAgIGxhc3QgcG9pbnQuCi0gICAqLwotICB0eXBlZGVmIGVudW0gIEZUX1N0cm9rZXJfTGluZUNhcF8KLSAgewotICAgIEZUX1NUUk9LRVJfTElORUNBUF9CVVRUID0gMCwKLSAgICBGVF9TVFJPS0VSX0xJTkVDQVBfUk9VTkQsCi0gICAgRlRfU1RST0tFUl9MSU5FQ0FQX1NRVUFSRQotCi0gIH0gRlRfU3Ryb2tlcl9MaW5lQ2FwOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIEZUX1N0cm9rZXJCb3JkZXIKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCB0byBzZWxlY3QgYSBnaXZlbiBzdHJva2UgYm9yZGVyCi0gICAqICAgaW4gQEZUX1N0cm9rZXJfR2V0Qm9yZGVyQ291bnRzIGFuZCBARlRfU3Ryb2tlcl9FeHBvcnRCb3JkZXIuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgRlRfU1RST0tFUl9CT1JERVJfTEVGVCA6OgotICAgKiAgICAgU2VsZWN0IHRoZSBsZWZ0IGJvcmRlciwgcmVsYXRpdmUgdG8gdGhlIGRyYXdpbmcgZGlyZWN0aW9uLgotICAgKgotICAgKiAgIEZUX1NUUk9LRVJfQk9SREVSX1JJR0hUIDo6Ci0gICAqICAgICBTZWxlY3QgdGhlIHJpZ2h0IGJvcmRlciwgcmVsYXRpdmUgdG8gdGhlIGRyYXdpbmcgZGlyZWN0aW9uLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBBcHBsaWNhdGlvbnMgYXJlIGdlbmVyYWxseSBpbnRlcmVzdGVkIGluIHRoZSBgaW5zaWRlJyBhbmQgYG91dHNpZGUnCi0gICAqICAgYm9yZGVycy4gIEhvd2V2ZXIsIHRoZXJlIGlzIG5vIGRpcmVjdCBtYXBwaW5nIGJldHdlZW4gdGhlc2UgYW5kIHRoZQotICAgKiAgIGBsZWZ0JyBhbmQgYHJpZ2h0JyBvbmVzLCBzaW5jZSB0aGlzIHJlYWxseSBkZXBlbmRzIG9uIHRoZSBnbHlwaCdzCi0gICAqICAgZHJhd2luZyBvcmllbnRhdGlvbiwgd2hpY2ggdmFyaWVzIGJldHdlZW4gZm9udCBmb3JtYXRzLgotICAgKgotICAgKiAgIFlvdSBjYW4gaG93ZXZlciB1c2UgQEZUX091dGxpbmVfR2V0SW5zaWRlQm9yZGVyIGFuZAotICAgKiAgIEBGVF9PdXRsaW5lX0dldE91dHNpZGVCb3JkZXIgdG8gZ2V0IHRoZXNlLgotICAgKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9TdHJva2VyQm9yZGVyXwotICB7Ci0gICAgRlRfU1RST0tFUl9CT1JERVJfTEVGVCA9IDAsCi0gICAgRlRfU1RST0tFUl9CT1JERVJfUklHSFQKLQotICB9IEZUX1N0cm9rZXJCb3JkZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX091dGxpbmVfR2V0SW5zaWRlQm9yZGVyCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXRyaWV2ZSB0aGUgQEZUX1N0cm9rZXJCb3JkZXIgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUKLSAgICogICBgaW5zaWRlJyBib3JkZXJzIG9mIGEgZ2l2ZW4gb3V0bGluZS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIG91dGxpbmUgOjoKLSAgICogICAgIFRoZSBzb3VyY2Ugb3V0bGluZSBoYW5kbGUuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgVGhlIGJvcmRlciBpbmRleC4gIEBGVF9TVFJPS0VSX0JPUkRFUl9SSUdIVCBmb3IgZW1wdHkgb3IgaW52YWxpZAotICAgKiAgIG91dGxpbmVzLgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9TdHJva2VyQm9yZGVyICkKLSAgRlRfT3V0bGluZV9HZXRJbnNpZGVCb3JkZXIoIEZUX091dGxpbmUqICBvdXRsaW5lICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX091dGxpbmVfR2V0T3V0c2lkZUJvcmRlcgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUmV0cmlldmUgdGhlIEBGVF9TdHJva2VyQm9yZGVyIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICAqICAgYG91dHNpZGUnIGJvcmRlcnMgb2YgYSBnaXZlbiBvdXRsaW5lLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgb3V0bGluZSA6OgotICAgKiAgICAgVGhlIHNvdXJjZSBvdXRsaW5lIGhhbmRsZS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBUaGUgYm9yZGVyIGluZGV4LiAgQEZUX1NUUk9LRVJfQk9SREVSX0xFRlQgZm9yIGVtcHR5IG9yIGludmFsaWQKLSAgICogICBvdXRsaW5lcy4KLSAgICovCi0gIEZUX0VYUE9SVCggRlRfU3Ryb2tlckJvcmRlciApCi0gIEZUX091dGxpbmVfR2V0T3V0c2lkZUJvcmRlciggRlRfT3V0bGluZSogIG91dGxpbmUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9OZXcKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIENyZWF0ZSBhIG5ldyBzdHJva2VyIG9iamVjdC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGxpYnJhcnkgOjoKLSAgICogICAgIEZyZWVUeXBlIGxpYnJhcnkgaGFuZGxlLgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgIGFzdHJva2VyIDo6Ci0gICAqICAgICBBIG5ldyBzdHJva2VyIG9iamVjdCBoYW5kbGUuICBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU3Ryb2tlcl9OZXcoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgRlRfU3Ryb2tlciAgKmFzdHJva2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1N0cm9rZXJfU2V0Ci0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXNldCBhIHN0cm9rZXIgb2JqZWN0J3MgYXR0cmlidXRlcy4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHN0cm9rZXIgOjoKLSAgICogICAgIFRoZSB0YXJnZXQgc3Ryb2tlciBoYW5kbGUuCi0gICAqCi0gICAqICAgcmFkaXVzIDo6Ci0gICAqICAgICBUaGUgYm9yZGVyIHJhZGl1cy4KLSAgICoKLSAgICogICBsaW5lX2NhcCA6OgotICAgKiAgICAgVGhlIGxpbmUgY2FwIHN0eWxlLgotICAgKgotICAgKiAgIGxpbmVfam9pbiA6OgotICAgKiAgICAgVGhlIGxpbmUgam9pbiBzdHlsZS4KLSAgICoKLSAgICogICBtaXRlcl9saW1pdCA6OgotICAgKiAgICAgVGhlIG1pdGVyIGxpbWl0IGZvciB0aGUgRlRfU1RST0tFUl9MSU5FSk9JTl9NSVRFUl9GSVhFRCBhbmQKLSAgICogICAgIEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVJfVkFSSUFCTEUgbGluZSBqb2luIHN0eWxlcywKLSAgICogICAgIGV4cHJlc3NlZCBhcyAxNi4xNiBmaXhlZC1wb2ludCB2YWx1ZS4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhlIHJhZGl1cyBpcyBleHByZXNzZWQgaW4gdGhlIHNhbWUgdW5pdHMgYXMgdGhlIG91dGxpbmUKLSAgICogICBjb29yZGluYXRlcy4KLSAgICoKLSAgICogICBUaGlzIGZ1bmN0aW9uIGNhbGxzIEBGVF9TdHJva2VyX1Jld2luZCBhdXRvbWF0aWNhbGx5LgotICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfU3Ryb2tlcl9TZXQoIEZUX1N0cm9rZXIgICAgICAgICAgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICAgICAgICAgICByYWRpdXMsCi0gICAgICAgICAgICAgICAgICBGVF9TdHJva2VyX0xpbmVDYXAgICBsaW5lX2NhcCwKLSAgICAgICAgICAgICAgICAgIEZUX1N0cm9rZXJfTGluZUpvaW4gIGxpbmVfam9pbiwKLSAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICAgICAgICAgIG1pdGVyX2xpbWl0ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1N0cm9rZXJfUmV3aW5kCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXNldCBhIHN0cm9rZXIgb2JqZWN0IHdpdGhvdXQgY2hhbmdpbmcgaXRzIGF0dHJpYnV0ZXMuCi0gICAqICAgWW91IHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGJlZ2lubmluZyBhIG5ldwotICAgKiAgIHNlcmllcyBvZiBjYWxscyB0byBARlRfU3Ryb2tlcl9CZWdpblN1YlBhdGggb3IKLSAgICogICBARlRfU3Ryb2tlcl9FbmRTdWJQYXRoLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3Ryb2tlciA6OgotICAgKiAgICAgVGhlIHRhcmdldCBzdHJva2VyIGhhbmRsZS4KLSAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX1N0cm9rZXJfUmV3aW5kKCBGVF9TdHJva2VyICBzdHJva2VyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1N0cm9rZXJfUGFyc2VPdXRsaW5lCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHVzZWQgdG8gcGFyc2UgYSB3aG9sZSBvdXRsaW5lIHdpdGgKLSAgICogICB0aGUgc3Ryb2tlci4gIFRoZSByZXN1bHRpbmcgb3V0bGluZShzKSBjYW4gYmUgcmV0cmlldmVkCi0gICAqICAgbGF0ZXIgYnkgZnVuY3Rpb25zIGxpa2UgQEZUX1N0cm9rZXJfR2V0Q291bnRzIGFuZCBARlRfU3Ryb2tlcl9FeHBvcnQuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBzdHJva2VyIDo6Ci0gICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgotICAgKgotICAgKiAgIG91dGxpbmUgOjoKLSAgICogICAgIFRoZSBzb3VyY2Ugb3V0bGluZS4KLSAgICoKLSAgICogICBvcGVuZWQgOjoKLSAgICogICAgIEEgYm9vbGVhbi4gIElmfjEsIHRoZSBvdXRsaW5lIGlzIHRyZWF0ZWQgYXMgYW4gb3BlbiBwYXRoIGluc3RlYWQKLSAgICogICAgIG9mIGEgY2xvc2VkIG9uZS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBJZiBgb3BlbmVkJyBpc34wICh0aGUgZGVmYXVsdCksIHRoZSBvdXRsaW5lIGlzIHRyZWF0ZWQgYXMgYSBjbG9zZWQKLSAgICogICBwYXRoLCBhbmQgdGhlIHN0cm9rZXIgZ2VuZXJhdGVzIHR3byBkaXN0aW5jdCBgYm9yZGVyJyBvdXRsaW5lcy4KLSAgICoKLSAgICogICBJZiBgb3BlbmVkJyBpc34xLCB0aGUgb3V0bGluZSBpcyBwcm9jZXNzZWQgYXMgYW4gb3BlbiBwYXRoLCBhbmQgdGhlCi0gICAqICAgc3Ryb2tlciBnZW5lcmF0ZXMgYSBzaW5nbGUgYHN0cm9rZScgb3V0bGluZS4KLSAgICoKLSAgICogICBUaGlzIGZ1bmN0aW9uIGNhbGxzIEBGVF9TdHJva2VyX1Jld2luZCBhdXRvbWF0aWNhbGx5LgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfUGFyc2VPdXRsaW5lKCBGVF9TdHJva2VyICAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgIG9wZW5lZCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9TdHJva2VyX0JlZ2luU3ViUGF0aAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgU3RhcnQgYSBuZXcgc3ViLXBhdGggaW4gdGhlIHN0cm9rZXIuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBzdHJva2VyIDo6Ci0gICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgotICAgKgotICAgKiAgIHRvIDo6Ci0gICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IHZlY3Rvci4KLSAgICoKLSAgICogICBvcGVuIDo6Ci0gICAqICAgICBBIGJvb2xlYW4uICBJZn4xLCB0aGUgc3ViLXBhdGggaXMgdHJlYXRlZCBhcyBhbiBvcGVuIG9uZS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIHRvIHN0cm9rZSBhIHBhdGggdGhhdCBpcwotICAgKiAgIG5vdCBzdG9yZWQgYXMgYW4gQEZUX091dGxpbmUgb2JqZWN0LgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfQmVnaW5TdWJQYXRoKCBGVF9TdHJva2VyICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICBvcGVuICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1N0cm9rZXJfRW5kU3ViUGF0aAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQ2xvc2UgdGhlIGN1cnJlbnQgc3ViLXBhdGggaW4gdGhlIHN0cm9rZXIuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBzdHJva2VyIDo6Ci0gICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFlvdSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIEBGVF9TdHJva2VyX0JlZ2luU3ViUGF0aC4KLSAgICogICBJZiB0aGUgc3VicGF0aCB3YXMgbm90IGBvcGVuZWQnLCB0aGlzIGZ1bmN0aW9uIGBkcmF3cycgYQotICAgKiAgIHNpbmdsZSBsaW5lIHNlZ21lbnQgdG8gdGhlIHN0YXJ0IHBvc2l0aW9uIHdoZW4gbmVlZGVkLgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfRW5kU3ViUGF0aCggRlRfU3Ryb2tlciAgc3Ryb2tlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9TdHJva2VyX0xpbmVUbwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgYERyYXcnIGEgc2luZ2xlIGxpbmUgc2VnbWVudCBpbiB0aGUgc3Ryb2tlcidzIGN1cnJlbnQgc3ViLXBhdGgsCi0gICAqICAgZnJvbSB0aGUgbGFzdCBwb3NpdGlvbi4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHN0cm9rZXIgOjoKLSAgICogICAgIFRoZSB0YXJnZXQgc3Ryb2tlciBoYW5kbGUuCi0gICAqCi0gICAqICAgdG8gOjoKLSAgICogICAgIEEgcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gcG9pbnQuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgWW91IHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gYmV0d2VlbiBARlRfU3Ryb2tlcl9CZWdpblN1YlBhdGggYW5kCi0gICAqICAgQEZUX1N0cm9rZXJfRW5kU3ViUGF0aC4KLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TdHJva2VyX0xpbmVUbyggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1N0cm9rZXJfQ29uaWNUbwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgYERyYXcnIGEgc2luZ2xlIHF1YWRyYXRpYyBCw6l6aWVyIGluIHRoZSBzdHJva2VyJ3MgY3VycmVudCBzdWItcGF0aCwKLSAgICogICBmcm9tIHRoZSBsYXN0IHBvc2l0aW9uLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3Ryb2tlciA6OgotICAgKiAgICAgVGhlIHRhcmdldCBzdHJva2VyIGhhbmRsZS4KLSAgICoKLSAgICogICBjb250cm9sIDo6Ci0gICAqICAgICBBIHBvaW50ZXIgdG8gYSBCw6l6aWVyIGNvbnRyb2wgcG9pbnQuCi0gICAqCi0gICAqICAgdG8gOjoKLSAgICogICAgIEEgcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gcG9pbnQuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgWW91IHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gYmV0d2VlbiBARlRfU3Ryb2tlcl9CZWdpblN1YlBhdGggYW5kCi0gICAqICAgQEZUX1N0cm9rZXJfRW5kU3ViUGF0aC4KLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9TdHJva2VyX0NvbmljVG8oIEZUX1N0cm9rZXIgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgY29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICB0byApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9TdHJva2VyX0N1YmljVG8KLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIGBEcmF3JyBhIHNpbmdsZSBjdWJpYyBCw6l6aWVyIGluIHRoZSBzdHJva2VyJ3MgY3VycmVudCBzdWItcGF0aCwKLSAgICogICBmcm9tIHRoZSBsYXN0IHBvc2l0aW9uLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3Ryb2tlciA6OgotICAgKiAgICAgVGhlIHRhcmdldCBzdHJva2VyIGhhbmRsZS4KLSAgICoKLSAgICogICBjb250cm9sMSA6OgotICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSBmaXJzdCBCw6l6aWVyIGNvbnRyb2wgcG9pbnQuCi0gICAqCi0gICAqICAgY29udHJvbDIgOjoKLSAgICogICAgIEEgcG9pbnRlciB0byBzZWNvbmQgQsOpemllciBjb250cm9sIHBvaW50LgotICAgKgotICAgKiAgIHRvIDo6Ci0gICAqICAgICBBIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHBvaW50LgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFlvdSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIGJldHdlZW4gQEZUX1N0cm9rZXJfQmVnaW5TdWJQYXRoIGFuZAotICAgKiAgIEBGVF9TdHJva2VyX0VuZFN1YlBhdGguCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU3Ryb2tlcl9DdWJpY1RvKCBGVF9TdHJva2VyICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGNvbnRyb2wxLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGNvbnRyb2wyLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1N0cm9rZXJfR2V0Qm9yZGVyQ291bnRzCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBDYWxsIHRoaXMgZnVuY3Rpb24gb25jZSB5b3UgaGF2ZSBmaW5pc2hlZCBwYXJzaW5nIHlvdXIgcGF0aHMKLSAgICogICB3aXRoIHRoZSBzdHJva2VyLiAgSXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBvaW50cyBhbmQKLSAgICogICBjb250b3VycyBuZWNlc3NhcnkgdG8gZXhwb3J0IG9uZSBvZiB0aGUgYGJvcmRlcicgb3IgYHN0cm9rZScKLSAgICogICBvdXRsaW5lcyBnZW5lcmF0ZWQgYnkgdGhlIHN0cm9rZXIuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBzdHJva2VyIDo6Ci0gICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgotICAgKgotICAgKiAgIGJvcmRlciA6OgotICAgKiAgICAgVGhlIGJvcmRlciBpbmRleC4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICBhbnVtX3BvaW50cyA6OgotICAgKiAgICAgVGhlIG51bWJlciBvZiBwb2ludHMuCi0gICAqCi0gICAqICAgYW51bV9jb250b3VycyA6OgotICAgKiAgICAgVGhlIG51bWJlciBvZiBjb250b3Vycy4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBXaGVuIGFuIG91dGxpbmUsIG9yIGEgc3ViLXBhdGgsIGlzIGBjbG9zZWQnLCB0aGUgc3Ryb2tlciBnZW5lcmF0ZXMKLSAgICogICB0d28gaW5kZXBlbmRlbnQgYGJvcmRlcicgb3V0bGluZXMsIG5hbWVkIGBsZWZ0JyBhbmQgYHJpZ2h0Jy4KLSAgICoKLSAgICogICBXaGVuIHRoZSBvdXRsaW5lLCBvciBhIHN1Yi1wYXRoLCBpcyBgb3BlbmVkJywgdGhlIHN0cm9rZXIgbWVyZ2VzCi0gICAqICAgdGhlIGBib3JkZXInIG91dGxpbmVzIHdpdGggY2Fwcy4gIFRoZSBgbGVmdCcgYm9yZGVyIHJlY2VpdmVzIGFsbAotICAgKiAgIHBvaW50cywgd2hpbGUgdGhlIGByaWdodCcgYm9yZGVyIGJlY29tZXMgZW1wdHkuCi0gICAqCi0gICAqICAgVXNlIHRoZSBmdW5jdGlvbiBARlRfU3Ryb2tlcl9HZXRDb3VudHMgaW5zdGVhZCBpZiB5b3Ugd2FudCB0bwotICAgKiAgIHJldHJpZXZlIHRoZSBjb3VudHMgYXNzb2NpYXRlZCB0byBib3RoIGJvcmRlcnMuCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMoIEZUX1N0cm9rZXIgICAgICAgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJva2VyQm9yZGVyICBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICphbnVtX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgKmFudW1fY29udG91cnMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9FeHBvcnRCb3JkZXIKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIENhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciBARlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMgdG8KLSAgICogICBleHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgYm9yZGVyIHRvIHlvdXIgb3duIEBGVF9PdXRsaW5lCi0gICAqICAgc3RydWN0dXJlLgotICAgKgotICAgKiAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGFwcGVuZHMgdGhlIGJvcmRlciBwb2ludHMgYW5kCi0gICAqICAgY29udG91cnMgdG8geW91ciBvdXRsaW5lLCBidXQgZG9lcyBub3QgdHJ5IHRvIHJlc2l6ZSBpdHMKLSAgICogICBhcnJheXMuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBzdHJva2VyIDo6Ci0gICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgotICAgKgotICAgKiAgIGJvcmRlciA6OgotICAgKiAgICAgVGhlIGJvcmRlciBpbmRleC4KLSAgICoKLSAgICogICBvdXRsaW5lIDo6Ci0gICAqICAgICBUaGUgdGFyZ2V0IG91dGxpbmUgaGFuZGxlLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBBbHdheXMgY2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIEBGVF9TdHJva2VyX0dldEJvcmRlckNvdW50cyB0bwotICAgKiAgIGdldCBzdXJlIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4geW91ciBARlRfT3V0bGluZSBvYmplY3QgdG8KLSAgICogICByZWNlaXZlIGFsbCBuZXcgZGF0YS4KLSAgICoKLSAgICogICBXaGVuIGFuIG91dGxpbmUsIG9yIGEgc3ViLXBhdGgsIGlzIGBjbG9zZWQnLCB0aGUgc3Ryb2tlciBnZW5lcmF0ZXMKLSAgICogICB0d28gaW5kZXBlbmRlbnQgYGJvcmRlcicgb3V0bGluZXMsIG5hbWVkIGBsZWZ0JyBhbmQgYHJpZ2h0Jy4KLSAgICoKLSAgICogICBXaGVuIHRoZSBvdXRsaW5lLCBvciBhIHN1Yi1wYXRoLCBpcyBgb3BlbmVkJywgdGhlIHN0cm9rZXIgbWVyZ2VzCi0gICAqICAgdGhlIGBib3JkZXInIG91dGxpbmVzIHdpdGggY2Fwcy4gIFRoZSBgbGVmdCcgYm9yZGVyIHJlY2VpdmVzIGFsbAotICAgKiAgIHBvaW50cywgd2hpbGUgdGhlIGByaWdodCcgYm9yZGVyIGJlY29tZXMgZW1wdHkuCi0gICAqCi0gICAqICAgVXNlIHRoZSBmdW5jdGlvbiBARlRfU3Ryb2tlcl9FeHBvcnQgaW5zdGVhZCBpZiB5b3Ugd2FudCB0bwotICAgKiAgIHJldHJpZXZlIGFsbCBib3JkZXJzIGF0IG9uY2UuCi0gICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9TdHJva2VyX0V4cG9ydEJvcmRlciggRlRfU3Ryb2tlciAgICAgICAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cm9rZXJCb3JkZXIgIGJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICAgICAgIG91dGxpbmUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9HZXRDb3VudHMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIENhbGwgdGhpcyBmdW5jdGlvbiBvbmNlIHlvdSBoYXZlIGZpbmlzaGVkIHBhcnNpbmcgeW91ciBwYXRocwotICAgKiAgIHdpdGggdGhlIHN0cm9rZXIuICBJdCByZXR1cm5zIHRoZSBudW1iZXIgb2YgcG9pbnRzIGFuZAotICAgKiAgIGNvbnRvdXJzIG5lY2Vzc2FyeSB0byBleHBvcnQgYWxsIHBvaW50cy9ib3JkZXJzIGZyb20gdGhlIHN0cm9rZWQKLSAgICogICBvdXRsaW5lL3BhdGguCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBzdHJva2VyIDo6Ci0gICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgIGFudW1fcG9pbnRzIDo6Ci0gICAqICAgICBUaGUgbnVtYmVyIG9mIHBvaW50cy4KLSAgICoKLSAgICogICBhbnVtX2NvbnRvdXJzIDo6Ci0gICAqICAgICBUaGUgbnVtYmVyIG9mIGNvbnRvdXJzLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU3Ryb2tlcl9HZXRDb3VudHMoIEZUX1N0cm9rZXIgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICphbnVtX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgKmFudW1fY29udG91cnMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU3Ryb2tlcl9FeHBvcnQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIENhbGwgdGhpcyBmdW5jdGlvbiBhZnRlciBARlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMgdG8KLSAgICogICBleHBvcnQgYWxsIGJvcmRlcnMgdG8geW91ciBvd24gQEZUX091dGxpbmUgc3RydWN0dXJlLgotICAgKgotICAgKiAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGFwcGVuZHMgdGhlIGJvcmRlciBwb2ludHMgYW5kCi0gICAqICAgY29udG91cnMgdG8geW91ciBvdXRsaW5lLCBidXQgZG9lcyBub3QgdHJ5IHRvIHJlc2l6ZSBpdHMKLSAgICogICBhcnJheXMuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBzdHJva2VyIDo6Ci0gICAqICAgICBUaGUgdGFyZ2V0IHN0cm9rZXIgaGFuZGxlLgotICAgKgotICAgKiAgIG91dGxpbmUgOjoKLSAgICogICAgIFRoZSB0YXJnZXQgb3V0bGluZSBoYW5kbGUuCi0gICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9TdHJva2VyX0V4cG9ydCggRlRfU3Ryb2tlciAgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9TdHJva2VyX0RvbmUKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIERlc3Ryb3kgYSBzdHJva2VyIG9iamVjdC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHN0cm9rZXIgOjoKLSAgICogICAgIEEgc3Ryb2tlciBoYW5kbGUuICBDYW4gYmUgTlVMTC4KLSAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX1N0cm9rZXJfRG9uZSggRlRfU3Ryb2tlciAgc3Ryb2tlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9HbHlwaF9TdHJva2UKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFN0cm9rZSBhIGdpdmVuIG91dGxpbmUgZ2x5cGggb2JqZWN0IHdpdGggYSBnaXZlbiBzdHJva2VyLgotICAgKgotICAgKiBAaW5vdXQ6Ci0gICAqICAgcGdseXBoIDo6Ci0gICAqICAgICBTb3VyY2UgZ2x5cGggaGFuZGxlIG9uIGlucHV0LCBuZXcgZ2x5cGggaGFuZGxlIG9uIG91dHB1dC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHN0cm9rZXIgOjoKLSAgICogICAgIEEgc3Ryb2tlciBoYW5kbGUuCi0gICAqCi0gICAqICAgZGVzdHJveSA6OgotICAgKiAgICAgQSBCb29sZWFuLiAgSWZ+MSwgdGhlIHNvdXJjZSBnbHlwaCBvYmplY3QgaXMgZGVzdHJveWVkCi0gICAqICAgICBvbiBzdWNjZXNzLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGUgc291cmNlIGdseXBoIGlzIHVudG91Y2hlZCBpbiBjYXNlIG9mIGVycm9yLgotICAgKgotICAgKiAgIEFkZGluZyBzdHJva2UgbWF5IHlpZWxkIGEgc2lnbmlmaWNhbnRseSB3aWRlciBhbmQgdGFsbGVyIGdseXBoCi0gICAqICAgZGVwZW5kaW5nIG9uIGhvdyBsYXJnZSBvZiBhIHJhZGl1cyB3YXMgdXNlZCB0byBzdHJva2UgdGhlIGdseXBoLiAgWW91Ci0gICAqICAgbWF5IG5lZWQgdG8gbWFudWFsbHkgYWRqdXN0IGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGFkdmFuY2UgYW1vdW50cwotICAgKiAgIHRvIGFjY291bnQgZm9yIHRoaXMgYWRkZWQgc2l6ZS4KLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HbHlwaF9TdHJva2UoIEZUX0dseXBoICAgICpwZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgRlRfU3Ryb2tlciAgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgIGRlc3Ryb3kgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfR2x5cGhfU3Ryb2tlQm9yZGVyCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBTdHJva2UgYSBnaXZlbiBvdXRsaW5lIGdseXBoIG9iamVjdCB3aXRoIGEgZ2l2ZW4gc3Ryb2tlciwgYnV0Ci0gICAqICAgb25seSByZXR1cm4gZWl0aGVyIGl0cyBpbnNpZGUgb3Igb3V0c2lkZSBib3JkZXIuCi0gICAqCi0gICAqIEBpbm91dDoKLSAgICogICBwZ2x5cGggOjoKLSAgICogICAgIFNvdXJjZSBnbHlwaCBoYW5kbGUgb24gaW5wdXQsIG5ldyBnbHlwaCBoYW5kbGUgb24gb3V0cHV0LgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3Ryb2tlciA6OgotICAgKiAgICAgQSBzdHJva2VyIGhhbmRsZS4KLSAgICoKLSAgICogICBpbnNpZGUgOjoKLSAgICogICAgIEEgQm9vbGVhbi4gIElmfjEsIHJldHVybiB0aGUgaW5zaWRlIGJvcmRlciwgb3RoZXJ3aXNlCi0gICAqICAgICB0aGUgb3V0c2lkZSBib3JkZXIuCi0gICAqCi0gICAqICAgZGVzdHJveSA6OgotICAgKiAgICAgQSBCb29sZWFuLiAgSWZ+MSwgdGhlIHNvdXJjZSBnbHlwaCBvYmplY3QgaXMgZGVzdHJveWVkCi0gICAqICAgICBvbiBzdWNjZXNzLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGUgc291cmNlIGdseXBoIGlzIHVudG91Y2hlZCBpbiBjYXNlIG9mIGVycm9yLgotICAgKgotICAgKiAgIEFkZGluZyBzdHJva2UgbWF5IHlpZWxkIGEgc2lnbmlmaWNhbnRseSB3aWRlciBhbmQgdGFsbGVyIGdseXBoCi0gICAqICAgZGVwZW5kaW5nIG9uIGhvdyBsYXJnZSBvZiBhIHJhZGl1cyB3YXMgdXNlZCB0byBzdHJva2UgdGhlIGdseXBoLiAgWW91Ci0gICAqICAgbWF5IG5lZWQgdG8gbWFudWFsbHkgYWRqdXN0IGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGFkdmFuY2UgYW1vdW50cwotICAgKiAgIHRvIGFjY291bnQgZm9yIHRoaXMgYWRkZWQgc2l6ZS4KLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HbHlwaF9TdHJva2VCb3JkZXIoIEZUX0dseXBoICAgICpwZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3Ryb2tlciAgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgIGluc2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgZGVzdHJveSApOwotCi0gIC8qICovCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRfU1RST0tFX0hfXyAqLwotCi0KLS8qIEVORCAqLwotCi0KLS8qIExvY2FsIFZhcmlhYmxlczogKi8KLS8qIGNvZGluZzogdXRmLTggICAgKi8KLS8qIEVuZDogICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRzeW50aC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdHN5bnRoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiY2JhZDguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdHN5bnRoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHN5bnRoLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgc3ludGhlc2l6aW5nIGNvZGUgZm9yIGVtYm9sZGVuaW5nIGFuZCBzbGFudGluZyAgICAgICAgICAgICAgKi8KLS8qICAgIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAwLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKiogICAgICAgIFdBUk5JTkcsIFRISVMgSVMgQUxQSEEgQ09ERSEgIFRISVMgQVBJICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqICAgIElTIERVRSBUTyBDSEFOR0UgVU5USUwgU1RSSUNUTFkgTk9USUZJRUQgQlkgVEhFICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiAgICAgICAgICAgIEZSRUVUWVBFIERFVkVMT1BNRU5UIFRFQU0gICAgICAgICAgICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBNYWluIHJlYXNvbiBmb3Igbm90IGxpZnRpbmcgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSB0byBhICAqLwotICAvKiBgc3RhbmRhcmQnIEFQSSBpcyB0aGF0IHRoZSB1c2VkIHBhcmFtZXRlcnMgZm9yIGVtYm9sZGVuaW5nIGFuZCAqLwotICAvKiBzbGFudGluZyBhcmUgbm90IGNvbmZpZ3VyYWJsZS4gIENvbnNpZGVyIHRoZSBmdW5jdGlvbnMgYXMgYSAgICAqLwotICAvKiBjb2RlIHJlc291cmNlIHRoYXQgc2hvdWxkIGJlIGNvcGllZCBpbnRvIHRoZSBhcHBsaWNhdGlvbiBhbmQgICAqLwotICAvKiBhZGFwdGVkIHRvIHRoZSBwYXJ0aWN1bGFyIG5lZWRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0KLSNpZm5kZWYgX19GVFNZTlRIX0hfXwotI2RlZmluZSBfX0ZUU1lOVEhfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIC8qIEVtYm9sZGVuIGEgZ2x5cGggYnkgYSBgcmVhc29uYWJsZScgdmFsdWUgKHdoaWNoIGlzIGhpZ2hseSBhIG1hdHRlciBvZiAqLwotICAvKiB0YXN0ZSkuICBUaGlzIGZ1bmN0aW9uIGlzIGFjdHVhbGx5IGEgY29udmVuaWVuY2UgZnVuY3Rpb24sIHByb3ZpZGluZyAgKi8KLSAgLyogYSB3cmFwcGVyIGZvciBARlRfT3V0bGluZV9FbWJvbGRlbiBhbmQgQEZUX0JpdG1hcF9FbWJvbGRlbi4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGb3IgZW1ib2xkZW5lZCBvdXRsaW5lcyB0aGUgaGVpZ2h0LCB3aWR0aCwgYW5kIGFkdmFuY2UgbWV0cmljcyBhcmUgICAgKi8KLSAgLyogaW5jcmVhc2VkIGJ5IHRoZSBzdHJlbmd0aCBvZiB0aGUgZW1ib2xkZW5pbmcgLS0gdGhpcyBldmVuIGFmZmVjdHMgICAgICovCi0gIC8qIG1vbm8td2lkdGggZm9udHMhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogWW91IGNhbiBhbHNvIGNhbGwgQEZUX091dGxpbmVfR2V0X0NCb3ggdG8gZ2V0IHByZWNpc2UgdmFsdWVzLiAgICAgICAgICovCi0gIEZUX0VYUE9SVCggdm9pZCApCi0gIEZUX0dseXBoU2xvdF9FbWJvbGRlbiggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLSAgLyogU2xhbnQgYW4gb3V0bGluZSBnbHlwaCB0byB0aGUgcmlnaHQgYnkgYWJvdXQgMTIgZGVncmVlcy4gKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfR2x5cGhTbG90X09ibGlxdWUoIEZUX0dseXBoU2xvdCAgc2xvdCApOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVFNZTlRIX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdHN5c3RlbS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdHN5c3RlbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmM5OTk5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnRzeXN0ZW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDM1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHN5c3RlbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgbG93LWxldmVsIHN5c3RlbSBpbnRlcmZhY2UgZGVmaW5pdGlvbiAoc3BlY2lmaWNhdGlvbikuICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVFNZU1RFTV9IX18KLSNkZWZpbmUgX19GVFNZU1RFTV9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgc3lzdGVtX2ludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgU3lzdGVtIEludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgSG93IEZyZWVUeXBlIG1hbmFnZXMgbWVtb3J5IGFuZCBpL28uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHZhcmlvdXMgZGVmaW5pdGlvbnMgcmVsYXRlZCB0byBtZW1vcnkgICAgICAgICAqLwotICAvKiAgIG1hbmFnZW1lbnQgYW5kIGkvbyBhY2Nlc3MuICBZb3UgbmVlZCB0byB1bmRlcnN0YW5kIHRoaXMgICAgICAgICAgICAgKi8KLSAgLyogICBpbmZvcm1hdGlvbiBpZiB5b3Ugd2FudCB0byB1c2UgYSBjdXN0b20gbWVtb3J5IG1hbmFnZXIgb3IgeW91IG93biAgICovCi0gIC8qICAgaS9vIHN0cmVhbXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgTSBFIE0gTyBSIFkgICBNIEEgTiBBIEcgRSBNIEUgTiBUICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAdHlwZToKLSAgICogICBGVF9NZW1vcnkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgaGFuZGxlIHRvIGEgZ2l2ZW4gbWVtb3J5IG1hbmFnZXIgb2JqZWN0LCBkZWZpbmVkIHdpdGggYW4KLSAgICogICBARlRfTWVtb3J5UmVjIHN0cnVjdHVyZS4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX01lbW9yeVJlY18qICBGVF9NZW1vcnk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgRlRfQWxsb2NfRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIGFsbG9jYXRlIGBzaXplJyBieXRlcyBmcm9tIGBtZW1vcnknLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgbWVtb3J5IDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIG1lbW9yeSBtYW5hZ2VyLgotICAgKgotICAgKiAgIHNpemUgOjoKLSAgICogICAgIFRoZSBzaXplIGluIGJ5dGVzIHRvIGFsbG9jYXRlLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEFkZHJlc3Mgb2YgbmV3IG1lbW9yeSBibG9jay4gIDB+aW4gY2FzZSBvZiBmYWlsdXJlLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB2b2lkKgotICAoKkZUX0FsbG9jX0Z1bmMpKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICBzaXplICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgRlRfRnJlZV9GdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGZ1bmN0aW9uIHVzZWQgdG8gcmVsZWFzZSBhIGdpdmVuIGJsb2NrIG9mIG1lbW9yeS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIG1lbW9yeSA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBtZW1vcnkgbWFuYWdlci4KLSAgICoKLSAgICogICBibG9jayA6OgotICAgKiAgICAgVGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBtZW1vcnkgYmxvY2suCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9GcmVlX0Z1bmMpKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIGJsb2NrICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgRlRfUmVhbGxvY19GdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGZ1bmN0aW9uIHVzZWQgdG8gcmUtYWxsb2NhdGUgYSBnaXZlbiBibG9jayBvZiBtZW1vcnkuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBtZW1vcnkgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgbWVtb3J5IG1hbmFnZXIuCi0gICAqCi0gICAqICAgY3VyX3NpemUgOjoKLSAgICogICAgIFRoZSBibG9jaydzIGN1cnJlbnQgc2l6ZSBpbiBieXRlcy4KLSAgICoKLSAgICogICBuZXdfc2l6ZSA6OgotICAgKiAgICAgVGhlIGJsb2NrJ3MgcmVxdWVzdGVkIG5ldyBzaXplLgotICAgKgotICAgKiAgIGJsb2NrIDo6Ci0gICAqICAgICBUaGUgYmxvY2sncyBjdXJyZW50IGFkZHJlc3MuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgTmV3IGJsb2NrIGFkZHJlc3MuICAwfmluIGNhc2Ugb2YgbWVtb3J5IHNob3J0YWdlLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBJbiBjYXNlIG9mIGVycm9yLCB0aGUgb2xkIGJsb2NrIG11c3Qgc3RpbGwgYmUgYXZhaWxhYmxlLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB2b2lkKgotICAoKkZUX1JlYWxsb2NfRnVuYykoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgIGxvbmcgICAgICAgY3VyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICBuZXdfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgIGJsb2NrICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc3RydWN0OgotICAgKiAgIEZUX01lbW9yeVJlYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSBhIGdpdmVuIG1lbW9yeSBtYW5hZ2VyIHRvIEZyZWVUeXBlfjIuCi0gICAqCi0gICAqIEBmaWVsZHM6Ci0gICAqICAgdXNlciA6OgotICAgKiAgICAgQSBnZW5lcmljIHR5cGVsZXNzIHBvaW50ZXIgZm9yIHVzZXIgZGF0YS4KLSAgICoKLSAgICogICBhbGxvYyA6OgotICAgKiAgICAgQSBwb2ludGVyIHR5cGUgdG8gYW4gYWxsb2NhdGlvbiBmdW5jdGlvbi4KLSAgICoKLSAgICogICBmcmVlIDo6Ci0gICAqICAgICBBIHBvaW50ZXIgdHlwZSB0byBhbiBtZW1vcnkgZnJlZWluZyBmdW5jdGlvbi4KLSAgICoKLSAgICogICByZWFsbG9jIDo6Ci0gICAqICAgICBBIHBvaW50ZXIgdHlwZSB0byBhIHJlYWxsb2NhdGlvbiBmdW5jdGlvbi4KLSAgICoKLSAgICovCi0gIHN0cnVjdCAgRlRfTWVtb3J5UmVjXwotICB7Ci0gICAgdm9pZCogICAgICAgICAgICB1c2VyOwotICAgIEZUX0FsbG9jX0Z1bmMgICAgYWxsb2M7Ci0gICAgRlRfRnJlZV9GdW5jICAgICBmcmVlOwotICAgIEZUX1JlYWxsb2NfRnVuYyAgcmVhbGxvYzsKLSAgfTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIEkgLyBPICAgTSBBIE4gQSBHIEUgTSBFIE4gVCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOgotICAgKiAgIEZUX1N0cmVhbQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBoYW5kbGUgdG8gYW4gaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBAYWxzbzoKLSAgICogICBTZWUgQEZUX1N0cmVhbVJlYyBmb3IgdGhlIHB1YmxpY2x5IGFjY2Vzc2libGUgZmllbGRzIG9mIGEgZ2l2ZW4KLSAgICogICBzdHJlYW0gb2JqZWN0LgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfU3RyZWFtUmVjXyogIEZUX1N0cmVhbTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzdHJ1Y3Q6Ci0gICAqICAgRlRfU3RyZWFtRGVzYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSB1bmlvbiB0eXBlIHVzZWQgdG8gc3RvcmUgZWl0aGVyIGEgbG9uZyBvciBhIHBvaW50ZXIuICBUaGlzIGlzIHVzZWQKLSAgICogICB0byBzdG9yZSBhIGZpbGUgZGVzY3JpcHRvciBvciBhIGBGSUxFKicgaW4gYW4gaW5wdXQgc3RyZWFtLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB1bmlvbiAgRlRfU3RyZWFtRGVzY18KLSAgewotICAgIGxvbmcgICB2YWx1ZTsKLSAgICB2b2lkKiAgcG9pbnRlcjsKLQotICB9IEZUX1N0cmVhbURlc2M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgRlRfU3RyZWFtX0lvRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBmdW5jdGlvbiB1c2VkIHRvIHNlZWsgYW5kIHJlYWQgZGF0YSBmcm9tIGEgZ2l2ZW4gaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgc3RyZWFtIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIHN0cmVhbS4KLSAgICoKLSAgICogICBvZmZzZXQgOjoKLSAgICogICAgIFRoZSBvZmZzZXQgb2YgcmVhZCBpbiBzdHJlYW0gKGFsd2F5cyBmcm9tIHN0YXJ0KS4KLSAgICoKLSAgICogICBidWZmZXIgOjoKLSAgICogICAgIFRoZSBhZGRyZXNzIG9mIHRoZSByZWFkIGJ1ZmZlci4KLSAgICoKLSAgICogICBjb3VudCA6OgotICAgKiAgICAgVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIHN0cmVhbS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGVmZmVjdGl2ZWx5IHJlYWQgYnkgdGhlIHN0cmVhbS4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVGhpcyBmdW5jdGlvbiBtaWdodCBiZSBjYWxsZWQgdG8gcGVyZm9ybSBhIHNlZWsgb3Igc2tpcCBvcGVyYXRpb24KLSAgICogICB3aXRoIGEgYGNvdW50JyBvZn4wLiAgQSBub24temVybyByZXR1cm4gdmFsdWUgdGhlbiBpbmRpY2F0ZXMgYW4KLSAgICogICBlcnJvci4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgdW5zaWduZWQgbG9uZwotICAoKkZUX1N0cmVhbV9Jb0Z1bmMpKCBGVF9TdHJlYW0gICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgY291bnQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdHlwZToKLSAgICogICBGVF9TdHJlYW1fQ2xvc2VGdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGZ1bmN0aW9uIHVzZWQgdG8gY2xvc2UgYSBnaXZlbiBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogIHN0cmVhbSA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBzdHJlYW0uCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9TdHJlYW1fQ2xvc2VGdW5jKSggRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzdHJ1Y3Q6Ci0gICAqICAgRlRfU3RyZWFtUmVjCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIHN0cnVjdHVyZSB1c2VkIHRvIGRlc2NyaWJlIGFuIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGJhc2UgOjoKLSAgICogICAgIEZvciBtZW1vcnktYmFzZWQgc3RyZWFtcywgdGhpcyBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgc3RyZWFtCi0gICAqICAgICBieXRlIGluIG1lbW9yeS4gIFRoaXMgZmllbGQgc2hvdWxkIGFsd2F5cyBiZSBzZXQgdG8gTlVMTCBmb3IKLSAgICogICAgIGRpc2stYmFzZWQgc3RyZWFtcy4KLSAgICoKLSAgICogICBzaXplIDo6Ci0gICAqICAgICBUaGUgc3RyZWFtIHNpemUgaW4gYnl0ZXMuCi0gICAqCi0gICAqICAgICBJbiBjYXNlIG9mIGNvbXByZXNzZWQgc3RyZWFtcyB3aGVyZSB0aGUgc2l6ZSBpcyB1bmtub3duIGJlZm9yZQotICAgKiAgICAgYWN0dWFsbHkgZG9pbmcgdGhlIGRlY29tcHJlc3Npb24sIHRoZSB2YWx1ZSBpcyBzZXQgdG8gMHg3RkZGRkZGRi4gCi0gICAqICAgICAoTm90ZSB0aGF0IHRoaXMgc2l6ZSB2YWx1ZSBjYW4gb2NjdXIgZm9yIG5vcm1hbCBzdHJlYW1zIGFsc287IGl0IGlzCi0gICAqICAgICB0aHVzIGp1c3QgYSBoaW50LikKLSAgICoKLSAgICogICBwb3MgOjoKLSAgICogICAgIFRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgc3RyZWFtLgotICAgKgotICAgKiAgIGRlc2NyaXB0b3IgOjoKLSAgICogICAgIFRoaXMgZmllbGQgaXMgYSB1bmlvbiB0aGF0IGNhbiBob2xkIGFuIGludGVnZXIgb3IgYSBwb2ludGVyLiAgSXQgaXMKLSAgICogICAgIHVzZWQgYnkgc3RyZWFtIGltcGxlbWVudGF0aW9ucyB0byBzdG9yZSBmaWxlIGRlc2NyaXB0b3JzIG9yIGBGSUxFKicKLSAgICogICAgIHBvaW50ZXJzLgotICAgKgotICAgKiAgIHBhdGhuYW1lIDo6Ci0gICAqICAgICBUaGlzIGZpZWxkIGlzIGNvbXBsZXRlbHkgaWdub3JlZCBieSBGcmVlVHlwZS4gIEhvd2V2ZXIsIGl0IGlzIG9mdGVuCi0gICAqICAgICB1c2VmdWwgZHVyaW5nIGRlYnVnZ2luZyB0byB1c2UgaXQgdG8gc3RvcmUgdGhlIHN0cmVhbSdzIGZpbGVuYW1lCi0gICAqICAgICAod2hlcmUgYXZhaWxhYmxlKS4KLSAgICoKLSAgICogICByZWFkIDo6Ci0gICAqICAgICBUaGUgc3RyZWFtJ3MgaW5wdXQgZnVuY3Rpb24uCi0gICAqCi0gICAqICAgY2xvc2UgOjoKLSAgICogICAgIFRoZSBzdHJlYW0ncyBjbG9zZSBmdW5jdGlvbi4KLSAgICoKLSAgICogICBtZW1vcnkgOjoKLSAgICogICAgIFRoZSBtZW1vcnkgbWFuYWdlciB0byB1c2UgdG8gcHJlbG9hZCBmcmFtZXMuICBUaGlzIGlzIHNldAotICAgKiAgICAgaW50ZXJuYWxseSBieSBGcmVlVHlwZSBhbmQgc2hvdWxkbid0IGJlIHRvdWNoZWQgYnkgc3RyZWFtCi0gICAqICAgICBpbXBsZW1lbnRhdGlvbnMuCi0gICAqCi0gICAqICAgY3Vyc29yIDo6Ci0gICAqICAgICBUaGlzIGZpZWxkIGlzIHNldCBhbmQgdXNlZCBpbnRlcm5hbGx5IGJ5IEZyZWVUeXBlIHdoZW4gcGFyc2luZwotICAgKiAgICAgZnJhbWVzLgotICAgKgotICAgKiAgIGxpbWl0IDo6Ci0gICAqICAgICBUaGlzIGZpZWxkIGlzIHNldCBhbmQgdXNlZCBpbnRlcm5hbGx5IGJ5IEZyZWVUeXBlIHdoZW4gcGFyc2luZwotICAgKiAgICAgZnJhbWVzLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1N0cmVhbVJlY18KLSAgewotICAgIHVuc2lnbmVkIGNoYXIqICAgICAgIGJhc2U7Ci0gICAgdW5zaWduZWQgbG9uZyAgICAgICAgc2l6ZTsKLSAgICB1bnNpZ25lZCBsb25nICAgICAgICBwb3M7Ci0KLSAgICBGVF9TdHJlYW1EZXNjICAgICAgICBkZXNjcmlwdG9yOwotICAgIEZUX1N0cmVhbURlc2MgICAgICAgIHBhdGhuYW1lOwotICAgIEZUX1N0cmVhbV9Jb0Z1bmMgICAgIHJlYWQ7Ci0gICAgRlRfU3RyZWFtX0Nsb3NlRnVuYyAgY2xvc2U7Ci0KLSAgICBGVF9NZW1vcnkgICAgICAgICAgICBtZW1vcnk7Ci0gICAgdW5zaWduZWQgY2hhciogICAgICAgY3Vyc29yOwotICAgIHVuc2lnbmVkIGNoYXIqICAgICAgIGxpbWl0OwotCi0gIH0gRlRfU3RyZWFtUmVjOwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVFNZU1RFTV9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnR0cmlnb24uaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnR0cmlnb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg1ZWM1MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0dHJpZ29uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnR0cmlnb24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHRyaWdvbm9tZXRyaWMgZnVuY3Rpb25zIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRUUklHT05fSF9fCi0jZGVmaW5lIF9fRlRUUklHT05fSF9fCi0KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGNvbXB1dGF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQHR5cGU6Ci0gICAqICAgRlRfQW5nbGUKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoaXMgdHlwZSBpcyB1c2VkIHRvIG1vZGVsIGFuZ2xlIHZhbHVlcyBpbiBGcmVlVHlwZS4gIE5vdGUgdGhhdCB0aGUKLSAgICogICBhbmdsZSBpcyBhIDE2LjE2IGZpeGVkLXBvaW50IHZhbHVlIGV4cHJlc3NlZCBpbiBkZWdyZWVzLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBGVF9GaXhlZCAgRlRfQW5nbGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQU5HTEVfUEkKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoZSBhbmdsZSBwaSBleHByZXNzZWQgaW4gQEZUX0FuZ2xlIHVuaXRzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQU5HTEVfUEkgICggMTgwTCA8PCAxNiApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQU5HTEVfMlBJCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGUgYW5nbGUgMipwaSBleHByZXNzZWQgaW4gQEZUX0FuZ2xlIHVuaXRzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQU5HTEVfMlBJICAoIEZUX0FOR0xFX1BJICogMiApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQU5HTEVfUEkyCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGUgYW5nbGUgcGkvMiBleHByZXNzZWQgaW4gQEZUX0FuZ2xlIHVuaXRzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQU5HTEVfUEkyICAoIEZUX0FOR0xFX1BJIC8gMiApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfQU5HTEVfUEk0Ci0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGUgYW5nbGUgcGkvNCBleHByZXNzZWQgaW4gQEZUX0FuZ2xlIHVuaXRzLgotICAgKgotICAgKi8KLSNkZWZpbmUgRlRfQU5HTEVfUEk0ICAoIEZUX0FOR0xFX1BJIC8gNCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfU2luCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXR1cm4gdGhlIHNpbnVzIG9mIGEgZ2l2ZW4gYW5nbGUgaW4gZml4ZWQtcG9pbnQgZm9ybWF0LgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgYW5nbGUgOjoKLSAgICogICAgIFRoZSBpbnB1dCBhbmdsZS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBUaGUgc2ludXMgdmFsdWUuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIElmIHlvdSBuZWVkIGJvdGggdGhlIHNpbnVzIGFuZCBjb3NpbnVzIGZvciBhIGdpdmVuIGFuZ2xlLCB1c2UgdGhlCi0gICAqICAgZnVuY3Rpb24gQEZUX1ZlY3Rvcl9Vbml0LgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9GaXhlZCApCi0gIEZUX1NpbiggRlRfQW5nbGUgIGFuZ2xlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfQ29zCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXR1cm4gdGhlIGNvc2ludXMgb2YgYSBnaXZlbiBhbmdsZSBpbiBmaXhlZC1wb2ludCBmb3JtYXQuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBhbmdsZSA6OgotICAgKiAgICAgVGhlIGlucHV0IGFuZ2xlLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIFRoZSBjb3NpbnVzIHZhbHVlLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBJZiB5b3UgbmVlZCBib3RoIHRoZSBzaW51cyBhbmQgY29zaW51cyBmb3IgYSBnaXZlbiBhbmdsZSwgdXNlIHRoZQotICAgKiAgIGZ1bmN0aW9uIEBGVF9WZWN0b3JfVW5pdC4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRml4ZWQgKQotICBGVF9Db3MoIEZUX0FuZ2xlICBhbmdsZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX1RhbgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUmV0dXJuIHRoZSB0YW5nZW50IG9mIGEgZ2l2ZW4gYW5nbGUgaW4gZml4ZWQtcG9pbnQgZm9ybWF0LgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgYW5nbGUgOjoKLSAgICogICAgIFRoZSBpbnB1dCBhbmdsZS4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBUaGUgdGFuZ2VudCB2YWx1ZS4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRml4ZWQgKQotICBGVF9UYW4oIEZUX0FuZ2xlICBhbmdsZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX0F0YW4yCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSZXR1cm4gdGhlIGFyYy10YW5nZW50IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiB2ZWN0b3IgKHgseSkgaW4KLSAgICogICB0aGUgMmQgcGxhbmUuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICB4IDo6Ci0gICAqICAgICBUaGUgaG9yaXpvbnRhbCB2ZWN0b3IgY29vcmRpbmF0ZS4KLSAgICoKLSAgICogICB5IDo6Ci0gICAqICAgICBUaGUgdmVydGljYWwgdmVjdG9yIGNvb3JkaW5hdGUuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgVGhlIGFyYy10YW5nZW50IHZhbHVlIChpLmUuIGFuZ2xlKS4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfQW5nbGUgKQotICBGVF9BdGFuMiggRlRfRml4ZWQgIHgsCi0gICAgICAgICAgICBGVF9GaXhlZCAgeSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgIEZUX0FuZ2xlX0RpZmYKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBhbmdsZXMuICBUaGUgcmVzdWx0IGlzIGFsd2F5cwotICAgKiAgIGNvbnN0cmFpbmVkIHRvIHRoZSBdLVBJLi5QSV0gaW50ZXJ2YWwuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBhbmdsZTEgOjoKLSAgICogICAgIEZpcnN0IGFuZ2xlLgotICAgKgotICAgKiAgIGFuZ2xlMiA6OgotICAgKiAgICAgU2Vjb25kIGFuZ2xlLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIENvbnN0cmFpbmVkIHZhbHVlIG9mIGB2YWx1ZTItdmFsdWUxJy4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfQW5nbGUgKQotICBGVF9BbmdsZV9EaWZmKCBGVF9BbmdsZSAgYW5nbGUxLAotICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgYW5nbGUyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfVmVjdG9yX1VuaXQKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFJldHVybiB0aGUgdW5pdCB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIGFuZ2xlLiAgQWZ0ZXIgdGhlCi0gICAqICAgY2FsbCwgdGhlIHZhbHVlIG9mIGB2ZWMueCcgd2lsbCBiZSBgY29zKGFuZ2xlKScsIGFuZCB0aGUgdmFsdWUgb2YKLSAgICogICBgdmVjLnknIHdpbGwgYmUgYHNpbihhbmdsZSknLgotICAgKgotICAgKiAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHRvIHJldHJpZXZlIGJvdGggdGhlIHNpbnVzIGFuZCBjb3NpbnVzIG9mIGEKLSAgICogICBnaXZlbiBhbmdsZSBxdWlja2x5LgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgIHZlYyA6OgotICAgKiAgICAgVGhlIGFkZHJlc3Mgb2YgdGFyZ2V0IHZlY3Rvci4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGFuZ2xlIDo6Ci0gICAqICAgICBUaGUgaW5wdXQgYW5nbGUuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9WZWN0b3JfVW5pdCggRlRfVmVjdG9yKiAgdmVjLAotICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAgYW5nbGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9WZWN0b3JfUm90YXRlCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBSb3RhdGUgYSB2ZWN0b3IgYnkgYSBnaXZlbiBhbmdsZS4KLSAgICoKLSAgICogQGlub3V0OgotICAgKiAgIHZlYyA6OgotICAgKiAgICAgVGhlIGFkZHJlc3Mgb2YgdGFyZ2V0IHZlY3Rvci4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGFuZ2xlIDo6Ci0gICAqICAgICBUaGUgaW5wdXQgYW5nbGUuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9WZWN0b3JfUm90YXRlKCBGVF9WZWN0b3IqICB2ZWMsCi0gICAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgIGFuZ2xlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfVmVjdG9yX0xlbmd0aAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgUmV0dXJuIHRoZSBsZW5ndGggb2YgYSBnaXZlbiB2ZWN0b3IuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICB2ZWMgOjoKLSAgICogICAgIFRoZSBhZGRyZXNzIG9mIHRhcmdldCB2ZWN0b3IuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgVGhlIHZlY3RvciBsZW5ndGgsIGV4cHJlc3NlZCBpbiB0aGUgc2FtZSB1bml0cyB0aGF0IHRoZSBvcmlnaW5hbAotICAgKiAgIHZlY3RvciBjb29yZGluYXRlcy4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRml4ZWQgKQotICBGVF9WZWN0b3JfTGVuZ3RoKCBGVF9WZWN0b3IqICB2ZWMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICBGVF9WZWN0b3JfUG9sYXJpemUKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIENvbXB1dGUgYm90aCB0aGUgbGVuZ3RoIGFuZCBhbmdsZSBvZiBhIGdpdmVuIHZlY3Rvci4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIHZlYyA6OgotICAgKiAgICAgVGhlIGFkZHJlc3Mgb2Ygc291cmNlIHZlY3Rvci4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICBsZW5ndGggOjoKLSAgICogICAgIFRoZSB2ZWN0b3IgbGVuZ3RoLgotICAgKgotICAgKiAgIGFuZ2xlIDo6Ci0gICAqICAgICBUaGUgdmVjdG9yIGFuZ2xlLgotICAgKgotICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkICkKLSAgRlRfVmVjdG9yX1BvbGFyaXplKCBGVF9WZWN0b3IqICB2ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAqbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgKmFuZ2xlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIENvbXB1dGUgdmVjdG9yIGNvb3JkaW5hdGVzIGZyb20gYSBsZW5ndGggYW5kIGFuZ2xlLgotICAgKgotICAgKiBAb3V0cHV0OgotICAgKiAgIHZlYyA6OgotICAgKiAgICAgVGhlIGFkZHJlc3Mgb2Ygc291cmNlIHZlY3Rvci4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGxlbmd0aCA6OgotICAgKiAgICAgVGhlIHZlY3RvciBsZW5ndGguCi0gICAqCi0gICAqICAgYW5nbGUgOjoKLSAgICogICAgIFRoZSB2ZWN0b3IgYW5nbGUuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIHZvaWQgKQotICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggRlRfVmVjdG9yKiAgdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAgYW5nbGUgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRUUklHT05fSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0dHRkcnYuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnR0dGRydi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzAwODFhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnR0dGRydi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0dHRkcnYuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBBUEkgZm9yIGNvbnRyb2xsaW5nIHRoZSBUcnVlVHlwZSBkcml2ZXIgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVFRURFJWX0hfXwotI2RlZmluZSBfX0ZUVFREUlZfSF9fCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAc2VjdGlvbjoKLSAgICogICB0dF9kcml2ZXIKLSAgICoKLSAgICogQHRpdGxlOgotICAgKiAgIFRoZSBUcnVlVHlwZSBkcml2ZXIKLSAgICoKLSAgICogQGFic3RyYWN0OgotICAgKiAgIENvbnRyb2xsaW5nIHRoZSBUcnVlVHlwZSBkcml2ZXIgbW9kdWxlLgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgV2hpbGUgRnJlZVR5cGUncyBUcnVlVHlwZSBkcml2ZXIgZG9lc24ndCBleHBvc2UgQVBJIGZ1bmN0aW9ucyBieQotICAgKiAgIGl0c2VsZiwgaXQgaXMgcG9zc2libGUgdG8gY29udHJvbCBpdHMgYmVoYXZpb3VyIHdpdGggQEZUX1Byb3BlcnR5X1NldAotICAgKiAgIGFuZCBARlRfUHJvcGVydHlfR2V0LiAgVGhlIGZvbGxvd2luZyBsaXN0cyB0aGUgYXZhaWxhYmxlIHByb3BlcnRpZXMKLSAgICogICB0b2dldGhlciB3aXRoIHRoZSBuZWNlc3NhcnkgbWFjcm9zIGFuZCBzdHJ1Y3R1cmVzLgotICAgKgotICAgKiAgIFRoZSBUcnVlVHlwZSBkcml2ZXIncyBtb2R1bGUgbmFtZSBpcyBgdHJ1ZXR5cGUnLgotICAgKgotICAgKiAgIFdlIHN0YXJ0IHdpdGggYSBsaXN0IG9mIGRlZmluaXRpb25zLCBraW5kbHkgcHJvdmlkZWQgYnkgR3JlZwotICAgKiAgIEhpdGNoY29jay4KLSAgICoKLSAgICogICBfQmktTGV2ZWxfIF9SZW5kZXJpbmdfCi0gICAqCi0gICAqICAgTW9ub2Nocm9tYXRpYyByZW5kZXJpbmcsIGV4Y2x1c2l2ZWx5IHVzZWQgaW4gdGhlIGVhcmx5IGRheXMgb2YKLSAgICogICBUcnVlVHlwZSBieSBib3RoIEFwcGxlIGFuZCBNaWNyb3NvZnQuICBNaWNyb3NvZnQncyBHREkgaW50ZXJmYWNlCi0gICAqICAgc3VwcG9ydGVkIGhpbnRpbmcgb2YgdGhlIHJpZ2h0LXNpZGUgYmVhcmluZyBwb2ludCwgc3VjaCB0aGF0IHRoZQotICAgKiAgIGFkdmFuY2Ugd2lkdGggY291bGQgYmUgbm9uLWxpbmVhci4gIE1vc3Qgb2Z0ZW4gdGhpcyB3YXMgZG9uZSB0bwotICAgKiAgIGFjaGlldmUgc29tZSBsZXZlbCBvZiBnbHlwaCBzeW1tZXRyeS4gIFRvIGVuYWJsZSByZWFzb25hYmxlCi0gICAqICAgcGVyZm9ybWFuY2UgKGUuZy4sIG5vdCBoYXZpbmcgdG8gcnVuIGhpbnRpbmcgb24gYWxsIGdseXBocyBqdXN0IHRvCi0gICAqICAgZ2V0IHRoZSB3aWR0aHMpIHRoZXJlIHdhcyBhIGJpdCBpbiB0aGUgaGVhZCB0YWJsZSBpbmRpY2F0aW5nIGlmIHRoZQotICAgKiAgIHNpZGUgYmVhcmluZyB3YXMgaGludGVkLCBhbmQgYWRkaXRpb25hbCB0YWJsZXMsIGBoZG14JyBhbmQgYExUU0gnLCB0bwotICAgKiAgIGNhY2hlIGhpbnRpbmcgd2lkdGhzIGFjcm9zcyBtdWx0aXBsZSBzaXplcyBhbmQgZGV2aWNlIGFzcGVjdCByYXRpb3MuCi0gICAqCi0gICAqICAgX0ZvbnRfIF9TbW9vdGhpbmdfCi0gICAqCi0gICAqICAgTWljcm9zb2Z0J3MgR0RJIGltcGxlbWVudGF0aW9uIG9mIGFudGktYWxpYXNpbmcuICBOb3QgdHJhZGl0aW9uYWwKLSAgICogICBhbnRpLWFsaWFzaW5nIGFzIHRoZSBvdXRsaW5lcyB3ZXJlIGhpbnRlZCBiZWZvcmUgdGhlIHNhbXBsaW5nLiAgVGhlCi0gICAqICAgd2lkdGhzIG1hdGNoZWQgdGhlIGJpLWxldmVsIHJlbmRlcmluZy4KLSAgICoKLSAgICogICBfQ2xlYXJUeXBlXyBfUmVuZGVyaW5nXwotICAgKgotICAgKiAgIFRlY2huaXF1ZSB0aGF0IHVzZXMgcGh5c2ljYWwgc3VicGl4ZWxzIHRvIGltcHJvdmUgcmVuZGVyaW5nIG9uIExDRAotICAgKiAgIChhbmQgb3RoZXIpIGRpc3BsYXlzLiAgQmVjYXVzZSBvZiB0aGUgaGlnaGVyIHJlc29sdXRpb24sIG1hbnkgbWV0aG9kcwotICAgKiAgIG9mIGltcHJvdmluZyBzeW1tZXRyeSBpbiBnbHlwaHMgdGhyb3VnaCBoaW50aW5nIHRoZSByaWdodC1zaWRlCi0gICAqICAgYmVhcmluZyB3ZXJlIG5vIGxvbmdlciBuZWNlc3NhcnkuICBUaGlzIGxlYWQgdG8gd2hhdCBHREkgY2FsbHMKLSAgICogICBgbmF0dXJhbCB3aWR0aHMnIENsZWFyVHlwZSwgc2VlCi0gICAqICAgaHR0cDovL3d3dy5iZWF0c3RhbW0uY29tL3R5cG9ncmFwaHkvUlRSQ2g0Lmh0bSNTZWMyMS4gIFNpbmNlIGhpbnRpbmcKLSAgICogICBoYXMgZXh0cmEgcmVzb2x1dGlvbiwgbW9zdCBub24tbGluZWFyaXR5IHdlbnQgYXdheSwgYnV0IGl0IGlzIHN0aWxsCi0gICAqICAgcG9zc2libGUgZm9yIGhpbnRzIHRvIGNoYW5nZSB0aGUgYWR2YW5jZSB3aWR0aHMgaW4gdGhpcyBtb2RlLgotICAgKgotICAgKiAgIF9DbGVhclR5cGVfIF9Db21wYXRpYmxlXyBfV2lkdGhzXwotICAgKgotICAgKiAgIE9uZSBvZiB0aGUgZWFybGllc3QgY2hhbGxlbmdlcyB3aXRoIENsZWFyVHlwZSB3YXMgYWxsb3dpbmcgdGhlCi0gICAqICAgaW1wbGVtZW50YXRpb24gaW4gR0RJIHRvIGJlIHNlbGVjdGVkIHdpdGhvdXQgcmVxdWlyaW5nIGFsbCBVSSBhbmQKLSAgICogICBkb2N1bWVudHMgdG8gcmVmbG93LiAgVG8gYWRkcmVzcyB0aGlzLCBhIGNvbXBhdGlibGUgbWV0aG9kIG9mCi0gICAqICAgcmVuZGVyaW5nIENsZWFyVHlwZSB3YXMgYWRkZWQgd2hlcmUgdGhlIGZvbnQgaGludHMgYXJlIGV4ZWN1dGVkIG9uY2UKLSAgICogICB0byBkZXRlcm1pbmUgdGhlIHdpZHRoIGluIGJpLWxldmVsIHJlbmRlcmluZywgYW5kIHRoZW4gcmUtcnVuIGluCi0gICAqICAgQ2xlYXJUeXBlLCB3aXRoIHRoZSBkaWZmZXJlbmNlIGluIHdpZHRocyBiZWluZyBhYnNvcmJlZCBpbiB0aGUgZm9udAotICAgKiAgIGhpbnRzIGZvciBDbGVhclR5cGUgKG1vc3RseSBpbiB0aGUgd2hpdGUgc3BhY2Ugb2YgaGludHMpOyBzZWUKLSAgICogICBodHRwOi8vd3d3LmJlYXRzdGFtbS5jb20vdHlwb2dyYXBoeS9SVFJDaDQuaHRtI1NlYzIwLiAgU29tZXdoYXQgYnkKLSAgICogICBkZWZpbml0aW9uLCBjb21wYXRpYmxlIHdpZHRoIENsZWFyVHlwZSBhbGxvd3MgZm9yIG5vbi1saW5lYXIgd2lkdGhzLAotICAgKiAgIGJ1dCBvbmx5IHdoZW4gdGhlIGJpLWxldmVsIHZlcnNpb24gaGFzIG5vbi1saW5lYXIgd2lkdGhzLgotICAgKgotICAgKiAgIF9DbGVhclR5cGVfIF9TdWJwaXhlbF8gX1Bvc2l0aW9uaW5nXwotICAgKgotICAgKiAgIE9uZSBvZiB0aGUgbmljZSBiZW5lZml0cyBvZiBDbGVhclR5cGUgaXMgdGhlIGFiaWxpdHkgdG8gbW9yZSBjcmlzcGx5Ci0gICAqICAgZGlzcGxheSBmcmFjdGlvbmFsIHdpZHRoczsgdW5mb3J0dW5hdGVseSwgdGhlIEdESSBtb2RlbCBvZiBpbnRlZ2VyCi0gICAqICAgYml0bWFwcyBkaWQgbm90IHN1cHBvcnQgdGhpcy4gIEhvd2V2ZXIsIHRoZSBXUEYgYW5kIERpcmVjdCBXcml0ZQotICAgKiAgIGZyYW1ld29ya3MgZG8gc3VwcG9ydCBmcmFjdGlvbmFsIHdpZHRocy4gIERXcml0ZSBjYWxscyB0aGlzIGBuYXR1cmFsCi0gICAqICAgbW9kZScsIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIEdESSdzIGBuYXR1cmFsIHdpZHRocycuICBTdWJwaXhlbAotICAgKiAgIHBvc2l0aW9uaW5nLCBpbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBEaXJlY3QgV3JpdGUsCi0gICAqICAgdW5mb3J0dW5hdGVseSBkb2VzIG5vdCBzdXBwb3J0IGhpbnRlZCBhZHZhbmNlIHdpZHRocywgc2VlCi0gICAqICAgaHR0cDovL3d3dy5iZWF0c3RhbW0uY29tL3R5cG9ncmFwaHkvUlRSQ2g0Lmh0bSNTZWMyMi4gIE5vdGUgdGhhdCB0aGUKLSAgICogICBUcnVlVHlwZSBpbnRlcnByZXRlciBmdWxseSBhbGxvd3MgdGhlIGFkdmFuY2Ugd2lkdGggdG8gYmUgYWRqdXN0ZWQgaW4KLSAgICogICB0aGlzIG1vZGUsIGp1c3QgdGhlIERXcml0ZSBjbGllbnQgd2lsbCBpZ25vcmUgdGhvc2UgY2hhbmdlcy4KLSAgICoKLSAgICogICBfQ2xlYXJUeXBlXyBfQmFja3dhcmRzXyBfQ29tcGF0aWJpbGl0eV8KLSAgICoKLSAgICogICBUaGlzIGlzIGEgc2V0IG9mIGV4Y2VwdGlvbnMgbWFkZSBpbiB0aGUgVHJ1ZVR5cGUgaW50ZXJwcmV0ZXIgdG8KLSAgICogICBtaW5pbWl6ZSBoaW50aW5nIHRlY2huaXF1ZXMgdGhhdCB3ZXJlIHByb2JsZW1hdGljIHdpdGggdGhlIGV4dHJhCi0gICAqICAgcmVzb2x1dGlvbiBvZiBDbGVhclR5cGU7IHNlZQotICAgKiAgIGh0dHA6Ly93d3cuYmVhdHN0YW1tLmNvbS90eXBvZ3JhcGh5L1JUUkNoNC5odG0jU2VjMSBhbmQKLSAgICogICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vdHlwb2dyYXBoeS9jbGVhcnR5cGUvdHJ1ZXR5cGVjbGVhcnR5cGUuYXNweC4KLSAgICogICBUaGlzIHRlY2huaXF1ZSBpcyBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCBDbGVhclR5cGUgY29tcGF0aWJsZQotICAgKiAgIHdpZHRocy4gIENsZWFyVHlwZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBoYXMgbm8gZGlyZWN0IGltcGFjdCBvbgotICAgKiAgIGNoYW5naW5nIGFkdmFuY2Ugd2lkdGhzLCBidXQgdGhlcmUgbWlnaHQgYmUgYW4gaW5kaXJlY3QgaW1wYWN0IG9uCi0gICAqICAgZGlzYWJsaW5nIHNvbWUgZGVsdGFzLiAgVGhpcyBjb3VsZCBiZSB3b3JrZWQgYXJvdW5kIGluIGJhY2t3YXJkcwotICAgKiAgIGNvbXBhdGliaWxpdHkgbW9kZS4KLSAgICoKLSAgICogICBfTmF0aXZlXyBfQ2xlYXJUeXBlXyBfTW9kZV8KLSAgICoKLSAgICogICAoTm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggYG5hdHVyYWwgd2lkdGhzJy4pICBUaGlzIG1vZGUgcmVtb3ZlcyBhbGwKLSAgICogICB0aGUgZXhjZXB0aW9ucyBpbiB0aGUgVHJ1ZVR5cGUgaW50ZXJwcmV0ZXIgd2hlbiBydW5uaW5nIHdpdGgKLSAgICogICBDbGVhclR5cGUuICBBbnkgaXNzdWVzIG9uIHdpZHRocyB3b3VsZCBzdGlsbCBhcHBseSwgdGhvdWdoLgotICAgKgotICAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAcHJvcGVydHk6Ci0gICAqICAgaW50ZXJwcmV0ZXItdmVyc2lvbgotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQ3VycmVudGx5LCB0d28gdmVyc2lvbnMgYXJlIGF2YWlsYWJsZSwgcmVwcmVzZW50aW5nIHRoZSBieXRlY29kZQotICAgKiAgIGludGVycHJldGVyIHdpdGggYW5kIHdpdGhvdXQgc3VicGl4ZWwgaGludGluZyBzdXBwb3J0LAotICAgKiAgIHJlc3BlY3RpdmVseS4gIFRoZSBkZWZhdWx0IGlzIHN1YnBpeGVsIHN1cHBvcnQgaWYKLSAgICogICBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgaXMgZGVmaW5lZCwgYW5kIG5vIHN1YnBpeGVsCi0gICAqICAgc3VwcG9ydCBvdGhlcndpc2UgKHNpbmNlIGl0IGlzbid0IGF2YWlsYWJsZSB0aGVuKS4KLSAgICoKLSAgICogICBJZiBzdWJwaXhlbCBoaW50aW5nIGlzIG9uLCBtYW55IFRydWVUeXBlIGJ5dGVjb2RlIGluc3RydWN0aW9ucyBiZWhhdmUKLSAgICogICBkaWZmZXJlbnRseSBjb21wYXJlZCB0byBCL1cgb3IgZ3JheXNjYWxlIHJlbmRlcmluZyAoZXhjZXB0IGlmIGBuYXRpdmUKLSAgICogICBDbGVhclR5cGUnIGlzIHNlbGVjdGVkIGJ5IHRoZSBmb250KS4gIFRoZSBtYWluIGlkZWEgaXMgdG8gcmVuZGVyIGF0IGEKLSAgICogICBtdWNoIGluY3JlYXNlZCBob3Jpem9udGFsIHJlc29sdXRpb24sIHRoZW4gc2FtcGxpbmcgZG93biB0aGUgY3JlYXRlZAotICAgKiAgIG91dHB1dCB0byBzdWJwaXhlbCBwcmVjaXNpb24uICBIb3dldmVyLCBtYW55IG9sZGVyIGZvbnRzIGFyZSBub3QKLSAgICogICBzdWl0ZWQgdG8gdGhpcyBhbmQgbXVzdCBiZSBzcGVjaWFsbHkgdGFrZW4gY2FyZSBvZiBieSBhcHBseWluZwotICAgKiAgIChoYXJkY29kZWQpIGZvbnQtc3BlY2lmaWMgdHdlYWtzLgotICAgKgotICAgKiAgIERldGFpbHMgb24gc3VicGl4ZWwgaGludGluZyBhbmQgc29tZSBvZiB0aGUgbmVjZXNzYXJ5IHR3ZWFrcyBjYW4gYmUKLSAgICogICBmb3VuZCBpbiBHcmVnIEhpdGNoY29jaydzIHdoaXRlcGFwZXIgYXQKLSAgICogICBgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3R5cG9ncmFwaHkvY2xlYXJ0eXBlL3RydWV0eXBlY2xlYXJ0eXBlLmFzcHgnLgotICAgKgotICAgKiAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjb2RlIGRlbW9uc3RyYXRlcyBob3cgdG8gYWN0aXZhdGUgc3VicGl4ZWwKLSAgICogICBoaW50aW5nIChvbWl0dGluZyB0aGUgZXJyb3IgaGFuZGxpbmcpLgotICAgKgotICAgKiAgIHsKLSAgICogICAgIEZUX0xpYnJhcnkgIGxpYnJhcnk7Ci0gICAqICAgICBGVF9GYWNlICAgICBmYWNlOwotICAgKiAgICAgRlRfVUludCAgICAgaW50ZXJwcmV0ZXJfdmVyc2lvbiA9IFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fMzg7Ci0gICAqCi0gICAqCi0gICAqICAgICBGVF9Jbml0X0ZyZWVUeXBlKCAmbGlicmFyeSApOwotICAgKgotICAgKiAgICAgRlRfUHJvcGVydHlfU2V0KCBsaWJyYXJ5LCAidHJ1ZXR5cGUiLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJwcmV0ZXItdmVyc2lvbiIsCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcnByZXRlcl92ZXJzaW9uICk7Ci0gICAqICAgfQotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHdpdGggQEZUX1Byb3BlcnR5X0dldCBhbHNvLgotICAgKgotICAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIGNvbnN0YW50cyB1c2VkIGZvciB0aGUgQGludGVycHJldGVyLXZlcnNpb24gcHJvcGVydHkgdG8KLSAgICogICBzZWxlY3QgdGhlIGhpbnRpbmcgZW5naW5lIGZvciBUcnVldHlwZSBmb250cy4KLSAgICoKLSAgICogICBUaGUgbnVtZXJpYyB2YWx1ZSBpbiB0aGUgY29uc3RhbnQgbmFtZXMgcmVwcmVzZW50cyB0aGUgdmVyc2lvbgotICAgKiAgIG51bWJlciBhcyByZXR1cm5lZCBieSB0aGUgYEdFVElORk8nIGJ5dGVjb2RlIGluc3RydWN0aW9uLgotICAgKgotICAgKiBAdmFsdWVzOgotICAgKiAgIFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fMzUgOjoKLSAgICogICAgIFZlcnNpb25+MzUgY29ycmVzcG9uZHMgdG8gTVMgcmFzdGVyaXplciB2LjEuNyBhcyB1c2VkIGUuZy4gaW4KLSAgICogICAgIFdpbmRvd3N+OTg7IG9ubHkgZ3JheXNjYWxlIGFuZCBCL1cgcmFzdGVyaXppbmcgaXMgc3VwcG9ydGVkLgotICAgKgotICAgKiAgIFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fMzggOjoKLSAgICogICAgIFZlcnNpb25+MzggY29ycmVzcG9uZHMgdG8gTVMgcmFzdGVyaXplciB2LjEuOTsgaXQgaXMgcm91Z2hseQotICAgKiAgICAgZXF1aXZhbGVudCB0byB0aGUgaGludGluZyBwcm92aWRlZCBieSBEaXJlY3RXcml0ZSBDbGVhclR5cGUgKGFzCi0gICAqICAgICBjYW4gYmUgZm91bmQsIGZvciBleGFtcGxlLCBpbiB0aGUgSW50ZXJuZXQgRXhwbG9yZXJ+OSBydW5uaW5nIG9uCi0gICAqICAgICBXaW5kb3dzfjcpLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGlzIHByb3BlcnR5IGNvbnRyb2xzIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGJ5dGVjb2RlIGludGVycHJldGVyCi0gICAqICAgYW5kIHRodXMgaG93IG91dGxpbmVzIGdldCBoaW50ZWQuICBJdCBkb2VzICpub3QqIGNvbnRyb2wgaG93IGdseXBoCi0gICAqICAgZ2V0IHJhc3Rlcml6ZWQhICBJbiBwYXJ0aWN1bGFyLCBpdCBkb2VzIG5vdCBjb250cm9sIHN1YnBpeGVsIGNvbG9yCi0gICAqICAgZmlsdGVyaW5nLgotICAgKgotICAgKiAgIElmIEZyZWVUeXBlIGhhcyBub3QgYmVlbiBjb21waWxlZCB3aXRoIGNvbmZpZ3VyYXRpb24gb3B0aW9uCi0gICAqICAgRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HLCBzZWxlY3RpbmcgdmVyc2lvbn4zOCBjYXVzZXMgYW4KLSAgICogICBgRlRfRXJyX1VuaW1wbGVtZW50ZWRfRmVhdHVyZScgZXJyb3IuCi0gICAqCi0gICAqICAgRGVwZW5kaW5nIG9uIHRoZSBncmFwaGljcyBmcmFtZXdvcmssIE1pY3Jvc29mdCB1c2VzIGRpZmZlcmVudAotICAgKiAgIGJ5dGVjb2RlIGFuZCByZW5kZXJpbmcgZW5naW5lcy4gIEFzIGEgY29uc2VxdWVuY2UsIHRoZSB2ZXJzaW9uCi0gICAqICAgbnVtYmVycyByZXR1cm5lZCBieSBhIGNhbGwgdG8gdGhlIGBHRVRJTkZPJyBieXRlY29kZSBpbnN0cnVjdGlvbiBhcmUKLSAgICogICBtb3JlIGNvbnZvbHV0ZWQgdGhhbiBkZXNpcmVkLgotICAgKgotICAgKiAgIEhlcmUgYXJlIHR3byB0YWJsZXMgdGhhdCB0cnkgdG8gc2hlZCBzb21lIGxpZ2h0IG9uIHRoZSBwb3NzaWJsZQotICAgKiAgIHZhbHVlcyBmb3IgdGhlIE1TIHJhc3Rlcml6ZXIgZW5naW5lLCB0b2dldGhlciB3aXRoIHRoZSBhZGRpdGlvbmFsCi0gICAqICAgZmVhdHVyZXMgaW50cm9kdWNlZCBieSBpdC4KLSAgICoKLSAgICogICB7Ci0gICAqICAgICBHRVRJTkZPIGZyYW1ld29yayAgICAgICAgICAgICAgIHZlcnNpb24gZmVhdHVyZQotICAgKiAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgKiAgICAgICAgIDMgICBHREkgKFdpbiAzLjEpLCAgICAgICAgICAgIHYxLjAgIDE2LWJpdCwgZmlyc3QgdmVyc2lvbgotICAgKiAgICAgICAgICAgICBUcnVlSW1hZ2UKLSAgICogICAgICAgIDMzICAgR0RJIChXaW4gTlQgMy4xKSwgICAgICAgICB2MS41ICAzMi1iaXQKLSAgICogICAgICAgICAgICAgSFAgTGFzZXJqZXQKLSAgICogICAgICAgIDM0ICAgR0RJIChXaW4gOTUpICAgICAgICAgICAgICB2MS42ICBmb250IHNtb290aGluZywKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU0NBTlRZUEUgb3Bjb2RlCi0gICAqICAgICAgICAzNSAgIEdESSAoV2luIDk4LzIwMDApICAgICAgICAgdjEuNyAgKFVOKVNDQUxFRF9DT01QT05FTlRfT0ZGU0VUCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzIGluIGNvbXBvc2l0ZSBnbHlwaHMKLSAgICogICAgICAgIDM2ICAgTUdESSAoV2luIENFIDIpICAgICAgICAgICB2MS42KyBjbGFzc2ljIENsZWFyVHlwZQotICAgKiAgICAgICAgMzcgICBHREkgKFhQIGFuZCBsYXRlciksICAgICAgIHYxLjggIENsZWFyVHlwZQotICAgKiAgICAgICAgICAgICBHREkrIG9sZCAoYmVmb3JlIFZpc3RhKQotICAgKiAgICAgICAgMzggICBHREkrIG9sZCAoVmlzdGEsIFdpbiA3KSwgIHYxLjkgIHN1YnBpeGVsIENsZWFyVHlwZSwKLSAgICogICAgICAgICAgICAgV1BGICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZLWRpcmVjdGlvbiBDbGVhclR5cGUsCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbCBlcnJvciBjaGVja2luZwotICAgKiAgICAgICAgMzkgICBEV3JpdGUgKGJlZm9yZSBXaW4gOCkgICAgIHYyLjAgIHN1YnBpeGVsIENsZWFyVHlwZSBmbGFncwotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gR0VUSU5GTyBvcGNvZGUsCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVnIGZpeGVzCi0gICAqICAgICAgICA0MCAgIEdESSsgKGFmdGVyIFdpbiA3KSwgICAgICAgdjIuMSAgWS1kaXJlY3Rpb24gQ2xlYXJUeXBlIGZsYWcKLSAgICogICAgICAgICAgICAgRFdyaXRlIChXaW4gOCkgICAgICAgICAgICAgICAgICAgIGluIEdFVElORk8gb3Bjb2RlLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXkgQ2xlYXJUeXBlCi0gICAqICAgfQotICAgKgotICAgKiAgIFRoZSBgdmVyc2lvbicgZmllbGQgZ2l2ZXMgYSByb3VnaCBvcmllbnRhdGlvbiBvbmx5LCBzaW5jZSBzb21lCi0gICAqICAgYXBwbGljYXRpb25zIHByb3ZpZGVkIGNlcnRhaW4gZmVhdHVyZXMgbXVjaCBlYXJsaWVyIChhcyBhbiBleGFtcGxlLAotICAgKiAgIE1pY3Jvc29mdCBSZWFkZXIgdXNlZCBzdWJwaXhlbCBhbmQgWS1kaXJlY3Rpb24gQ2xlYXJUeXBlIGFscmVhZHkgaW4KLSAgICogICBXaW5kb3dzIDIwMDApLiAgU2ltaWxhcmx5LCB1cGRhdGVzIHRvIGEgZ2l2ZW4gZnJhbWV3b3JrIG1pZ2h0IGluY2x1ZGUKLSAgICogICBpbXByb3ZlZCBoaW50aW5nIHN1cHBvcnQuCi0gICAqCi0gICAqICAgewotICAgKiAgICAgIHZlcnNpb24gICBzYW1wbGluZyAgICAgICAgICByZW5kZXJpbmcgICAgICAgIGNvbW1lbnQKLSAgICogICAgICAgICAgICAgICB4ICAgICAgICB5ICAgICAgIHggICAgICAgICAgIHkKLSAgICogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAqICAgICAgIHYxLjAgICBub3JtYWwgIG5vcm1hbCAgQi9XICAgICAgICAgICBCL1cgICAgYmktbGV2ZWwKLSAgICogICAgICAgdjEuNiAgIGhpZ2ggICAgaGlnaCAgICBncmF5ICAgICAgICAgIGdyYXkgICBncmF5c2NhbGUKLSAgICogICAgICAgdjEuOCAgIGhpZ2ggICAgbm9ybWFsICBjb2xvci1maWx0ZXIgIEIvVyAgICAoR0RJKSBDbGVhclR5cGUKLSAgICogICAgICAgdjEuOSAgIGhpZ2ggICAgaGlnaCAgICBjb2xvci1maWx0ZXIgIGdyYXkgICBDb2xvciBDbGVhclR5cGUKLSAgICogICAgICAgdjIuMSAgIGhpZ2ggICAgbm9ybWFsICBncmF5ICAgICAgICAgIEIvVyAgICBHcmF5IENsZWFyVHlwZQotICAgKiAgICAgICB2Mi4xICAgaGlnaCAgICBoaWdoICAgIGdyYXkgICAgICAgICAgZ3JheSAgIEdyYXkgQ2xlYXJUeXBlCi0gICAqICAgfQotICAgKgotICAgKiAgIENvbG9yIGFuZCBHcmF5IENsZWFyVHlwZSBhcmUgdGhlIHR3byBhdmFpbGFibGUgdmFyaWFudHMgb2YKLSAgICogICBgWS1kaXJlY3Rpb24gQ2xlYXJUeXBlJywgbWVhbmluZyBncmF5c2NhbGUgcmFzdGVyaXphdGlvbiBhbG9uZyB0aGUKLSAgICogICBZLWRpcmVjdGlvbjsgdGhlIG5hbWUgdXNlZCBpbiB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiBmb3IgdGhpcwotICAgKiAgIGZlYXR1cmUgaXMgYHN5bW1ldHJpYyBzbW9vdGhpbmcnLiAgYENsYXNzaWMgQ2xlYXJUeXBlJyBpcyB0aGUKLSAgICogICBvcmlnaW5hbCBhbGdvcml0aG0gdXNlZCBiZWZvcmUgaW50cm9kdWNpbmcgYSBtb2RpZmllZCB2ZXJzaW9uIGluCi0gICAqICAgV2luflhQLiAgQW5vdGhlciBuYW1lIGZvciB2MS42J3MgZ3JheXNjYWxlIHJlbmRlcmluZyBpcyBgZm9udAotICAgKiAgIHNtb290aGluZycsIGFuZCBgQ29sb3IgQ2xlYXJUeXBlJyBpcyBzb21ldGltZXMgYWxzbyBjYWxsZWQgYERXcml0ZQotICAgKiAgIENsZWFyVHlwZScuICBUbyBkaWZmZXJlbnRpYXRlIGJldHdlZW4gdG9kYXkncyBDb2xvciBDbGVhclR5cGUgYW5kIHRoZQotICAgKiAgIGVhcmxpZXIgQ2xlYXJUeXBlIHZhcmlhbnQgd2l0aCBCL1cgcmVuZGVyaW5nIGFsb25nIHRoZSB2ZXJ0aWNhbCBheGlzLAotICAgKiAgIHRoZSBsYXR0ZXIgaXMgc29tZXRpbWVzIGNhbGxlZCBgR0RJIENsZWFyVHlwZScuCi0gICAqCi0gICAqICAgYE5vcm1hbCcgYW5kIGBoaWdoJyBzYW1wbGluZyBkZXNjcmliZSB0aGUgKHZpcnR1YWwpIHJlc29sdXRpb24gdG8KLSAgICogICBhY2Nlc3MgdGhlIHJhc3Rlcml6ZWQgb3V0bGluZSBhZnRlciB0aGUgaGludGluZyBwcm9jZXNzLiAgYE5vcm1hbCcKLSAgICogICBtZWFucyAxIHNhbXBsZSBwZXIgZ3JpZCBsaW5lIChpLmUuLCBCL1cpLiAgSW4gdGhlIGN1cnJlbnQgTWljcm9zb2Z0Ci0gICAqICAgaW1wbGVtZW50YXRpb24sIGBoaWdoJyBtZWFucyBhbiBleHRyYSB2aXJ0dWFsIHJlc29sdXRpb24gb2YgMTZ4MTYgKG9yCi0gICAqICAgMTZ4MSkgZ3JpZCBsaW5lcyBwZXIgcGl4ZWwgZm9yIGJ5dGVjb2RlIGluc3RydWN0aW9ucyBsaWtlIGBNSVJQJy4KLSAgICogICBBZnRlciBoaW50aW5nLCB0aGVzZSAxNiBncmlkIGxpbmVzIGFyZSBtYXBwZWQgdG8gNng1IChvciA2eDEpIGdyaWQKLSAgICogICBsaW5lcyBmb3IgY29sb3IgZmlsdGVyaW5nIGlmIENvbG9yIENsZWFyVHlwZSBpcyBhY3RpdmF0ZWQuCi0gICAqCi0gICAqICAgTm90ZSB0aGF0IGBHcmF5IENsZWFyVHlwZScgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdjEuNidzCi0gICAqICAgZ3JheXNjYWxlIHJlbmRlcmluZy4gIEhvd2V2ZXIsIHRoZSBHRVRJTkZPIGluc3RydWN0aW9uIGhhbmRsZXMgaXQKLSAgICogICBkaWZmZXJlbnRseTogdjEuNiByZXR1cm5zIGJpdH4xMiAoaGludGluZyBmb3IgZ3JheXNjYWxlKSwgd2hpbGUgdjIuMQotICAgKiAgIHJldHVybnMgYml0c34xMyAoaGludGluZyBmb3IgQ2xlYXJUeXBlKSwgMTggKHN5bW1ldHJpY2FsIHNtb290aGluZyksCi0gICAqICAgYW5kfjE5IChHcmF5IENsZWFyVHlwZSkuICBBbHNvLCB0aGlzIG1vZGUgcmVzcGVjdHMgYml0cyAyIGFuZH4zIGZvcgotICAgKiAgIHRoZSB2ZXJzaW9ufjEgZ2FzcCB0YWJsZSBleGNsdXNpdmVseSAobGlrZSBDb2xvciBDbGVhclR5cGUpLCB3aGlsZQotICAgKiAgIHYxLjYgb25seSByZXNwZWN0cyB0aGUgdmFsdWVzIG9mIHZlcnNpb25+MCAoYml0cyAwIGFuZH4xKS4KLSAgICoKLSAgICogICBGcmVlVHlwZSBkb2Vzbid0IHByb3ZpZGUgYWxsIGNhcGFiaWxpdGllcyBvZiB0aGUgbW9zdCByZWNlbnQKLSAgICogICBDbGVhclR5cGUgaW5jYXJuYXRpb24sIHRodXMgd2UgaWRlbnRpZnkgb3VyIHN1YnBpeGVsIHN1cHBvcnQgYXMKLSAgICogICB2ZXJzaW9ufjM4LgotICAgKgotICAgKi8KLSNkZWZpbmUgVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zNSAgMzUKLSNkZWZpbmUgVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zOCAgMzgKLQotIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX0ZUVFREUlZfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0dHlwZXMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnR0eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDZhMWJlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvZnR0eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0dHlwZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBzaW1wbGUgdHlwZXMgZGVmaW5pdGlvbnMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUVFlQRVNfSF9fCi0jZGVmaW5lIF9fRlRUWVBFU19IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfU1lTVEVNX0gKLSNpbmNsdWRlIEZUX0lNQUdFX0gKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzaWNfdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VGl0bGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQmFzaWMgRGF0YSBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8QWJzdHJhY3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGJhc2ljIGRhdGEgdHlwZXMgZGVmaW5lZCBieSB0aGUgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBiYXNpYyBkYXRhIHR5cGVzIGRlZmluZWQgYnkgRnJlZVR5cGV+MiwgICovCi0gIC8qICAgIHJhbmdpbmcgZnJvbSBzaW1wbGUgc2NhbGFyIHR5cGVzIHRvIGJpdG1hcCBkZXNjcmlwdG9ycy4gIE1vcmUgICAgICAqLwotICAvKiAgICBmb250LXNwZWNpZmljIHN0cnVjdHVyZXMgYXJlIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgc2VjdGlvbi4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CeXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0NoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VSW50MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VJbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9JbnQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUludDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1Nob3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VU2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VMb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Cb29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1B0ckRpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GaXhlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9WZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQkJveCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GV29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUZXb3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0YyRG90MTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Vbml0VmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRjI2RG90NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTUFLRV9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZW5lcmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2VuZXJpY19GaW5hbGl6ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CaXRtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUGl4ZWxfTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BhbGV0dGVfTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HbHlwaF9Gb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSU1BR0VfVEFHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0Jvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBvZiB1bnNpZ25lZCBjaGFyLCB1c2VkIGZvciBzaW1wbGUgYm9vbGVhbnMuICBBcyB1c3VhbCwgICAqLwotICAvKiAgICB2YWx1ZXMgMSBhbmR+MCByZXByZXNlbnQgdHJ1ZSBhbmQgZmFsc2UsIHJlc3BlY3RpdmVseS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgRlRfQm9vbDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ZXb3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHVzZWQgdG8gc3RvcmUgYSBkaXN0YW5jZSBpbiBvcmlnaW5hbCBmb250ICAqLwotICAvKiAgICB1bml0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc2lnbmVkIHNob3J0ICBGVF9GV29yZDsgICAvKiBkaXN0YW5jZSBpbiBGVW5pdHMgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1VGV29yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHVzZWQgdG8gc3RvcmUgYSBkaXN0YW5jZSBpbiBvcmlnaW5hbCAgICAqLwotICAvKiAgICBmb250IHVuaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIEZUX1VGV29yZDsgIC8qIHVuc2lnbmVkIGRpc3RhbmNlICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9DaGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSB0eXBlZGVmIGZvciB0aGUgX3NpZ25lZF8gY2hhciB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc2lnbmVkIGNoYXIgIEZUX0NoYXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9CeXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSB0eXBlZGVmIGZvciB0aGUgX3Vuc2lnbmVkXyBjaGFyIHR5cGUuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgRlRfQnl0ZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0J5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgY29uc3RhbnQgbWVtb3J5IGFyZWFzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBjb25zdCBGVF9CeXRlKiAgRlRfQnl0ZXM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9UYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIDMyLWJpdCB0YWdzIChhcyB1c2VkIGluIHRoZSBTRk5UIGZvcm1hdCkuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfVUludDMyICBGVF9UYWc7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSB0eXBlZGVmIGZvciB0aGUgY2hhciB0eXBlLCB1c3VhbGx5IHVzZWQgZm9yIHN0cmluZ3MuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgY2hhciAgRlRfU3RyaW5nOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBzaWduZWQgc2hvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBzaG9ydCAgRlRfU2hvcnQ7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VU2hvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIHVuc2lnbmVkIHNob3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgIEZUX1VTaG9ydDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgdHlwZWRlZiBmb3IgdGhlIGludCB0eXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzaWduZWQgaW50ICBGVF9JbnQ7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9VSW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHR5cGVkZWYgZm9yIHRoZSB1bnNpZ25lZCBpbnQgdHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdW5zaWduZWQgaW50ICBGVF9VSW50OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTG9uZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciBzaWduZWQgbG9uZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBsb25nICBGVF9Mb25nOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVUxvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlZGVmIGZvciB1bnNpZ25lZCBsb25nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgIEZUX1VMb25nOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRjJEb3QxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaWduZWQgMi4xNCBmaXhlZC1wb2ludCB0eXBlIHVzZWQgZm9yIHVuaXQgdmVjdG9ycy4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBzaG9ydCAgRlRfRjJEb3QxNDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0YyNkRvdDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2lnbmVkIDI2LjYgZml4ZWQtcG9pbnQgdHlwZSB1c2VkIGZvciB2ZWN0b3JpYWwgcGl4ZWwgICAgICAgICAgICAqLwotICAvKiAgICBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc2lnbmVkIGxvbmcgIEZUX0YyNkRvdDY7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GaXhlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHR5cGUgaXMgdXNlZCB0byBzdG9yZSAxNi4xNiBmaXhlZC1wb2ludCB2YWx1ZXMsIGxpa2Ugc2NhbGluZyAgKi8KLSAgLyogICAgdmFsdWVzIG9yIG1hdHJpeCBjb2VmZmljaWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpZ25lZCBsb25nICBGVF9GaXhlZDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBGcmVlVHlwZSBlcnJvciBjb2RlIHR5cGUuICBBIHZhbHVlIG9mfjAgaXMgYWx3YXlzIGludGVycHJldGVkICAqLwotICAvKiAgICBhcyBhIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgaW50ICBGVF9FcnJvcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1BvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc2ltcGxlIHR5cGVkZWYgZm9yIGEgdHlwZWxlc3MgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB2b2lkKiAgRlRfUG9pbnRlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX09mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgQU5TSX5DIGBzaXplX3QnIHR5cGUsIGkuZS4sIHRoZSBsYXJnZXN0ICAqLwotICAvKiAgICBfdW5zaWduZWRfIGludGVnZXIgdHlwZSB1c2VkIHRvIGV4cHJlc3MgYSBmaWxlIHNpemUgb3IgcG9zaXRpb24sICAgKi8KLSAgLyogICAgb3IgYSBtZW1vcnkgYmxvY2sgc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHNpemVfdCAgRlRfT2Zmc2V0OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUHRyRGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBBTlNJfkMgYHB0cmRpZmZfdCcgdHlwZSwgaS5lLiwgdGhlICAgICAgICovCi0gIC8qICAgIGxhcmdlc3QgX3NpZ25lZF8gaW50ZWdlciB0eXBlIHVzZWQgdG8gZXhwcmVzcyB0aGUgZGlzdGFuY2UgICAgICAgICAqLwotICAvKiAgICBiZXR3ZWVuIHR3byBwb2ludGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZnRfcHRyZGlmZl90ICBGVF9QdHJEaXN0OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfVW5pdFZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgYSAyRCB2ZWN0b3IgdW5pdCB2ZWN0b3IuICBVc2VzICAgICovCi0gIC8qICAgIEZUX0YyRG90MTQgdHlwZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHggOjogSG9yaXpvbnRhbCBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeSA6OiBWZXJ0aWNhbCBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfVW5pdFZlY3Rvcl8KLSAgewotICAgIEZUX0YyRG90MTQgIHg7Ci0gICAgRlRfRjJEb3QxNCAgeTsKLQotICB9IEZUX1VuaXRWZWN0b3I7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSBzdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBhIDJ4MiBtYXRyaXguICBDb2VmZmljaWVudHMgYXJlICAgKi8KLSAgLyogICAgaW4gMTYuMTYgZml4ZWQtcG9pbnQgZm9ybWF0LiAgVGhlIGNvbXB1dGF0aW9uIHBlcmZvcm1lZCBpczogICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgeCcgPSB4Knh4ICsgeSp4eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIHknID0geCp5eCArIHkqeXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4eCA6OiBNYXRyaXggY29lZmZpY2llbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHh5IDo6IE1hdHJpeCBjb2VmZmljaWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeXggOjogTWF0cml4IGNvZWZmaWNpZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5eSA6OiBNYXRyaXggY29lZmZpY2llbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9NYXRyaXhfCi0gIHsKLSAgICBGVF9GaXhlZCAgeHgsIHh5OwotICAgIEZUX0ZpeGVkICB5eCwgeXk7Ci0KLSAgfSBGVF9NYXRyaXg7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9EYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZWFkLW9ubHkgYmluYXJ5IGRhdGEgcmVwcmVzZW50ZWQgYXMgYSBwb2ludGVyIGFuZCBhIGxlbmd0aC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb2ludGVyIDo6IFRoZSBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlbmd0aCAgOjogVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0RhdGFfCi0gIHsKLSAgICBjb25zdCBGVF9CeXRlKiAgcG9pbnRlcjsKLSAgICBGVF9JbnQgICAgICAgICAgbGVuZ3RoOwotCi0gIH0gRlRfRGF0YTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dlbmVyaWNfRmluYWxpemVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlc2NyaWJlIGEgZnVuY3Rpb24gdXNlZCB0byBkZXN0cm95IHRoZSBgY2xpZW50JyBkYXRhIG9mIGFueSAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBvYmplY3QuICBTZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBARlRfR2VuZXJpYyB0eXBlIGZvciAgKi8KLSAgLyogICAgZGV0YWlscyBvZiB1c2FnZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGFkZHJlc3Mgb2YgdGhlIEZyZWVUeXBlIG9iamVjdCB0aGF0IGlzIHVuZGVyIGZpbmFsaXphdGlvbi4gICAgICovCi0gIC8qICAgIEl0cyBjbGllbnQgZGF0YSBpcyBhY2Nlc3NlZCB0aHJvdWdoIGl0cyBgZ2VuZXJpYycgZmllbGQuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB2b2lkICAoKkZUX0dlbmVyaWNfRmluYWxpemVyKSh2b2lkKiAgb2JqZWN0KTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dlbmVyaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENsaWVudCBhcHBsaWNhdGlvbnMgb2Z0ZW4gbmVlZCB0byBhc3NvY2lhdGUgdGhlaXIgb3duIGRhdGEgdG8gYSAgICAqLwotICAvKiAgICB2YXJpZXR5IG9mIEZyZWVUeXBlIGNvcmUgb2JqZWN0cy4gIEZvciBleGFtcGxlLCBhIHRleHQgbGF5b3V0IEFQSSAgKi8KLSAgLyogICAgbWlnaHQgd2FudCB0byBhc3NvY2lhdGUgYSBnbHlwaCBjYWNoZSB0byBhIGdpdmVuIHNpemUgb2JqZWN0LiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTb21lIEZyZWVUeXBlIG9iamVjdCBjb250YWlucyBhIGBnZW5lcmljJyBmaWVsZCwgb2YgdHlwZSAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2VuZXJpYywgd2hpY2ggdXNhZ2UgaXMgbGVmdCB0byBjbGllbnQgYXBwbGljYXRpb25zIGFuZCBmb250ICAgICovCi0gIC8qICAgIHNlcnZlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgYSBwb2ludGVyIHRvIGNsaWVudC1zcGVjaWZpYyBkYXRhLCBhcyB3ZWxsICovCi0gIC8qICAgIGFzIHRoZSBhZGRyZXNzIG9mIGEgYGZpbmFsaXplcicgZnVuY3Rpb24sIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGJ5ICAqLwotICAvKiAgICBGcmVlVHlwZSB3aGVuIHRoZSBvYmplY3QgaXMgZGVzdHJveWVkIChmb3IgZXhhbXBsZSwgdGhlIHByZXZpb3VzICAgKi8KLSAgLyogICAgY2xpZW50IGV4YW1wbGUgd291bGQgcHV0IHRoZSBhZGRyZXNzIG9mIHRoZSBnbHlwaCBjYWNoZSBkZXN0cnVjdG9yICovCi0gIC8qICAgIGluIHRoZSBgZmluYWxpemVyJyBmaWVsZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRhdGEgICAgICA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgdG8gYW55IGNsaWVudC1zcGVjaWZpZWQgZGF0YS4gVGhpcyAqLwotICAvKiAgICAgICAgICAgICAgICAgZmllbGQgaXMgY29tcGxldGVseSBpZ25vcmVkIGJ5IHRoZSBGcmVlVHlwZSBsaWJyYXJ5LiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZpbmFsaXplciA6OiBBIHBvaW50ZXIgdG8gYSBgZ2VuZXJpYyBmaW5hbGl6ZXInIGZ1bmN0aW9uLCB3aGljaCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZC4gIElmIHRoaXMgKi8KLSAgLyogICAgICAgICAgICAgICAgIGZpZWxkIGlzIHNldCB0byBOVUxMLCBubyBjb2RlIHdpbGwgYmUgY2FsbGVkLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfR2VuZXJpY18KLSAgewotICAgIHZvaWQqICAgICAgICAgICAgICAgICBkYXRhOwotICAgIEZUX0dlbmVyaWNfRmluYWxpemVyICBmaW5hbGl6ZXI7Ci0KLSAgfSBGVF9HZW5lcmljOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTUFLRV9UQUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBtYWNybyBjb252ZXJ0cyBmb3VyLWxldHRlciB0YWdzIHRoYXQgYXJlIHVzZWQgdG8gbGFiZWwgICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlIHRhYmxlcyBpbnRvIGFuIHVuc2lnbmVkIGxvbmcsIHRvIGJlIHVzZWQgd2l0aGluIEZyZWVUeXBlLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBwcm9kdWNlZCB2YWx1ZXMgKm11c3QqIGJlIDMyLWJpdCBpbnRlZ2Vycy4gIERvbid0IHJlZGVmaW5lICAgICAqLwotICAvKiAgICB0aGlzIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX01BS0VfVEFHKCBfeDEsIF94MiwgX3gzLCBfeDQgKSBcCi0gICAgICAgICAgKEZUX1RhZykgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoIChGVF9VTG9uZylfeDEgPDwgMjQgKSB8ICAgICBcCi0gICAgICAgICAgICAoIChGVF9VTG9uZylfeDIgPDwgMTYgKSB8ICAgICBcCi0gICAgICAgICAgICAoIChGVF9VTG9uZylfeDMgPDwgIDggKSB8ICAgICBcCi0gICAgICAgICAgICAgIChGVF9VTG9uZylfeDQgICAgICAgICApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgTCBJIFMgVCAgIE0gQSBOIEEgRyBFIE0gRSBOIFQgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpc3RfcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0Tm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgTWFueSBlbGVtZW50cyBhbmQgb2JqZWN0cyBpbiBGcmVlVHlwZSBhcmUgbGlzdGVkIHRocm91Z2ggYW4gICAgICAgKi8KLSAgLyogICAgIEBGVF9MaXN0IHJlY29yZCAoc2VlIEBGVF9MaXN0UmVjKS4gIEFzIGl0cyBuYW1lIHN1Z2dlc3RzLCBhbiAgICAgICovCi0gIC8qICAgICBGVF9MaXN0Tm9kZSBpcyBhIGhhbmRsZSB0byBhIHNpbmdsZSBsaXN0IGVsZW1lbnQuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfTGlzdE5vZGVSZWNfKiAgRlRfTGlzdE5vZGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIGxpc3QgcmVjb3JkIChzZWUgQEZUX0xpc3RSZWMpLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX0xpc3RSZWNfKiAgRlRfTGlzdDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpc3ROb2RlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gaG9sZCBhIHNpbmdsZSBsaXN0IGVsZW1lbnQuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHByZXYgOjogVGhlIHByZXZpb3VzIGVsZW1lbnQgaW4gdGhlIGxpc3QuICBOVUxMIGlmIGZpcnN0LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmV4dCA6OiBUaGUgbmV4dCBlbGVtZW50IGluIHRoZSBsaXN0LiAgTlVMTCBpZiBsYXN0LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkYXRhIDo6IEEgdHlwZWxlc3MgcG9pbnRlciB0byB0aGUgbGlzdGVkIG9iamVjdC4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9MaXN0Tm9kZVJlY18KLSAgewotICAgIEZUX0xpc3ROb2RlICBwcmV2OwotICAgIEZUX0xpc3ROb2RlICBuZXh0OwotICAgIHZvaWQqICAgICAgICBkYXRhOwotCi0gIH0gRlRfTGlzdE5vZGVSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9MaXN0UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgYSBzaW1wbGUgZG91Ymx5LWxpbmtlZCBsaXN0LiAgVGhlc2UgYXJlICAgKi8KLSAgLyogICAgdXNlZCBpbiBtYW55IHBhcnRzIG9mIEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGVhZCA6OiBUaGUgaGVhZCAoZmlyc3QgZWxlbWVudCkgb2YgZG91Ymx5LWxpbmtlZCBsaXN0LiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWlsIDo6IFRoZSB0YWlsIChsYXN0IGVsZW1lbnQpIG9mIGRvdWJseS1saW5rZWQgbGlzdC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9MaXN0UmVjXwotICB7Ci0gICAgRlRfTGlzdE5vZGUgIGhlYWQ7Ci0gICAgRlRfTGlzdE5vZGUgIHRhaWw7Ci0KLSAgfSBGVF9MaXN0UmVjOwotCi0gIC8qICovCi0KLQotI2RlZmluZSBGVF9JU19FTVBUWSggbGlzdCApICAoIChsaXN0KS5oZWFkID09IDAgKQotI2RlZmluZSBGVF9CT09MKCB4ICkgICggKEZUX0Jvb2wpKCB4ICkgKQotCi0gIC8qIGNvbmNhdGVuYXRlIEMgdG9rZW5zICovCi0jZGVmaW5lIEZUX0VSUl9YQ0FUKCB4LCB5ICkgIHggIyMgeQotI2RlZmluZSBGVF9FUlJfQ0FUKCB4LCB5ICkgICBGVF9FUlJfWENBVCggeCwgeSApCi0KLSAgLyogc2VlIGBmdG1vZGVyci5oJyBmb3IgZGVzY3JpcHRpb25zIG9mIHRoZSBmb2xsb3dpbmcgbWFjcm9zICovCi0KLSNkZWZpbmUgRlRfRVJSKCBlICkgIEZUX0VSUl9DQVQoIEZUX0VSUl9QUkVGSVgsIGUgKQotCi0jZGVmaW5lIEZUX0VSUk9SX0JBU0UoIHggKSAgICAoICh4KSAmIDB4RkYgKQotI2RlZmluZSBGVF9FUlJPUl9NT0RVTEUoIHggKSAgKCAoeCkgJiAweEZGMDBVICkKLQotI2RlZmluZSBGVF9FUlJfRVEoIHgsIGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBGVF9FUlJPUl9CQVNFKCB4ICkgPT0gRlRfRVJST1JfQkFTRSggRlRfRVJSKCBlICkgKSApCi0jZGVmaW5lIEZUX0VSUl9ORVEoIHgsIGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEZUX0VSUk9SX0JBU0UoIHggKSAhPSBGVF9FUlJPUl9CQVNFKCBGVF9FUlIoIGUgKSApICkKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUVFlQRVNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0d2luZm50LmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0d2luZm50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZWRhYTEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9mdHdpbmZudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0d2luZm50LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBBUEkgZm9yIGFjY2Vzc2luZyBXaW5kb3dzIGZudC1zcGVjaWZpYyBkYXRhLiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUV0lORk5UX0hfXwotI2RlZmluZSBfX0ZUV0lORk5UX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTZWN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB3aW5mbnRfZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUaXRsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXaW5kb3cgRk5UIEZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxBYnN0cmFjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXaW5kb3dzIEZOVCBzcGVjaWZpYyBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIFdpbmRvd3MgRk5UIHNwZWNpZmljICAgICAgKi8KLSAgLyogICAgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIEZUX1dpbkZOVF9JRF9YWFgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbGlzdCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgY2hhcnNldCcgYnl0ZSBpbgotICAgKiAgIEBGVF9XaW5GTlRfSGVhZGVyUmVjLiAgRXhhY3QgbWFwcGluZyB0YWJsZXMgZm9yIHRoZSB2YXJpb3VzIGNwWFhYWAotICAgKiAgIGVuY29kaW5ncyAoZXhjZXB0IGZvciBjcDEzNjEpIGNhbiBiZSBmb3VuZCBhdAotICAgKiAgIGZ0cDovL2Z0cC51bmljb2RlLm9yZy9QdWJsaWMgaW4gdGhlIE1BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MKLSAgICogICBzdWJkaXJlY3RvcnkuICBjcDEzNjEgaXMgcm91Z2hseSBhIHN1cGVyc2V0IG9mCi0gICAqICAgTUFQUElOR1MvT0JTT0xFVEUvRUFTVEFTSUEvS1NDL0pPSEFCLlRYVC4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBGVF9XaW5GTlRfSURfREVGQVVMVCA6OgotICAgKiAgICAgVGhpcyBpcyB1c2VkIGZvciBmb250IGVudW1lcmF0aW9uIGFuZCBmb250IGNyZWF0aW9uIGFzIGEKLSAgICogICAgIGBkb24ndCBjYXJlJyB2YWx1ZS4gIFZhbGlkIGZvbnQgZmlsZXMgZG9uJ3QgY29udGFpbiB0aGlzIHZhbHVlLgotICAgKiAgICAgV2hlbiBxdWVyeWluZyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlIGZvbnQKLSAgICogICAgIHRoYXQgaXMgY3VycmVudGx5IHNlbGVjdGVkIGludG8gYSBzcGVjaWZpZWQgZGV2aWNlIGNvbnRleHQsIHRoaXMKLSAgICogICAgIHJldHVybiB2YWx1ZSAob2YgdGhlIHJlbGF0ZWQgV2luZG93cyBBUEkpIHNpbXBseSBkZW5vdGVzIGZhaWx1cmUuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX1NZTUJPTCA6OgotICAgKiAgICAgVGhlcmUgaXMgbm8ga25vd24gbWFwcGluZyB0YWJsZSBhdmFpbGFibGUuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX01BQyA6OgotICAgKiAgICAgTWFjIFJvbWFuIGVuY29kaW5nLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9PRU0gOjoKLSAgICogICAgIEZyb20gTWljaGFlbCBQw7Z0dGdlbiA8bWljaGFlbEBwb2V0dGdlbi5kZT46Ci0gICAqCi0gICAqICAgICAgIFRoZSBgV2luZG93cyBGb250IE1hcHBpbmcnIGFydGljbGUgc2F5cyB0aGF0IEZUX1dpbkZOVF9JRF9PRU0KLSAgICogICAgICAgaXMgdXNlZCBmb3IgdGhlIGNoYXJzZXQgb2YgdmVjdG9yIGZvbnRzLCBsaWtlIGBtb2Rlcm4uZm9uJywKLSAgICogICAgICAgYHJvbWFuLmZvbicsIGFuZCBgc2NyaXB0LmZvbicgb24gV2luZG93cy4KLSAgICoKLSAgICogICAgICAgVGhlIGBDcmVhdGVGb250JyBkb2N1bWVudGF0aW9uIHNheXM6IFRoZSBGVF9XaW5GTlRfSURfT0VNIHZhbHVlCi0gICAqICAgICAgIHNwZWNpZmllcyBhIGNoYXJhY3RlciBzZXQgdGhhdCBpcyBvcGVyYXRpbmctc3lzdGVtIGRlcGVuZGVudC4KLSAgICoKLSAgICogICAgICAgVGhlIGBJRklNRVRSSUNTJyBkb2N1bWVudGF0aW9uIGZyb20gdGhlIGBXaW5kb3dzIERyaXZlcgotICAgKiAgICAgICBEZXZlbG9wbWVudCBLaXQnIHNheXM6IFRoaXMgZm9udCBzdXBwb3J0cyBhbiBPRU0tc3BlY2lmaWMKLSAgICogICAgICAgY2hhcmFjdGVyIHNldC4gIFRoZSBPRU0gY2hhcmFjdGVyIHNldCBpcyBzeXN0ZW0gZGVwZW5kZW50LgotICAgKgotICAgKiAgICAgICBJbiBnZW5lcmFsIE9FTSwgYXMgb3Bwb3NlZCB0byBBTlNJIChpLmUuLCBjcDEyNTIpLCBkZW5vdGVzIHRoZQotICAgKiAgICAgICBzZWNvbmQgZGVmYXVsdCBjb2RlcGFnZSB0aGF0IG1vc3QgaW50ZXJuYXRpb25hbCB2ZXJzaW9ucyBvZgotICAgKiAgICAgICBXaW5kb3dzIGhhdmUuICBJdCBpcyBvbmUgb2YgdGhlIE9FTSBjb2RlcGFnZXMgZnJvbQotICAgKgotICAgKiAgICAgICAgIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2dvZ2xvYmFsL2JiOTY0NjU1LAotICAgKgotICAgKiAgICAgICBhbmQgaXMgdXNlZCBmb3IgdGhlIGBET1MgYm94ZXMnLCB0byBzdXBwb3J0IGxlZ2FjeSBhcHBsaWNhdGlvbnMuCi0gICAqICAgICAgIEEgR2VybWFuIFdpbmRvd3MgdmVyc2lvbiBmb3IgZXhhbXBsZSB1c3VhbGx5IHVzZXMgQU5TSSBjb2RlcGFnZQotICAgKiAgICAgICAxMjUyIGFuZCBPRU0gY29kZXBhZ2UgODUwLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDg3NCA6OgotICAgKiAgICAgQSBzdXBlcnNldCBvZiBUaGFpIFRJUyA2MjAgYW5kIElTTyA4ODU5LTExLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDkzMiA6OgotICAgKiAgICAgQSBzdXBlcnNldCBvZiBKYXBhbmVzZSBTaGlmdC1KSVMgKHdpdGggbWlub3IgZGV2aWF0aW9ucykuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX0NQOTM2IDo6Ci0gICAqICAgICBBIHN1cGVyc2V0IG9mIHNpbXBsaWZpZWQgQ2hpbmVzZSBHQiAyMzEyLTE5ODAgKHdpdGggZGlmZmVyZW50Ci0gICAqICAgICBvcmRlcmluZyBhbmQgbWlub3IgZGV2aWF0aW9ucykuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX0NQOTQ5IDo6Ci0gICAqICAgICBBIHN1cGVyc2V0IG9mIEtvcmVhbiBIYW5ndWwgS1N+QyA1NjAxLTE5ODcgKHdpdGggZGlmZmVyZW50Ci0gICAqICAgICBvcmRlcmluZyBhbmQgbWlub3IgZGV2aWF0aW9ucykuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX0NQOTUwIDo6Ci0gICAqICAgICBBIHN1cGVyc2V0IG9mIHRyYWRpdGlvbmFsIENoaW5lc2UgQmlnfjUgRVRlbiAod2l0aCBkaWZmZXJlbnQKLSAgICogICAgIG9yZGVyaW5nIGFuZCBtaW5vciBkZXZpYXRpb25zKS4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfQ1AxMjUwIDo6Ci0gICAqICAgICBBIHN1cGVyc2V0IG9mIEVhc3QgRXVyb3BlYW4gSVNPIDg4NTktMiAod2l0aCBzbGlnaHRseSBkaWZmZXJlbnQKLSAgICogICAgIG9yZGVyaW5nKS4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfQ1AxMjUxIDo6Ci0gICAqICAgICBBIHN1cGVyc2V0IG9mIFJ1c3NpYW4gSVNPIDg4NTktNSAod2l0aCBkaWZmZXJlbnQgb3JkZXJpbmcpLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDEyNTIgOjoKLSAgICogICAgIEFOU0kgZW5jb2RpbmcuICBBIHN1cGVyc2V0IG9mIElTTyA4ODU5LTEuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX0NQMTI1MyA6OgotICAgKiAgICAgQSBzdXBlcnNldCBvZiBHcmVlayBJU08gODg1OS03ICh3aXRoIG1pbm9yIG1vZGlmaWNhdGlvbnMpLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDEyNTQgOjoKLSAgICogICAgIEEgc3VwZXJzZXQgb2YgVHVya2lzaCBJU08gODg1OS05LgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDEyNTUgOjoKLSAgICogICAgIEEgc3VwZXJzZXQgb2YgSGVicmV3IElTTyA4ODU5LTggKHdpdGggc29tZSBtb2RpZmljYXRpb25zKS4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfQ1AxMjU2IDo6Ci0gICAqICAgICBBIHN1cGVyc2V0IG9mIEFyYWJpYyBJU08gODg1OS02ICh3aXRoIGRpZmZlcmVudCBvcmRlcmluZykuCi0gICAqCi0gICAqICAgRlRfV2luRk5UX0lEX0NQMTI1NyA6OgotICAgKiAgICAgQSBzdXBlcnNldCBvZiBCYWx0aWMgSVNPIDg4NTktMTMgKHdpdGggc29tZSBkZXZpYXRpb25zKS4KLSAgICoKLSAgICogICBGVF9XaW5GTlRfSURfQ1AxMjU4IDo6Ci0gICAqICAgICBGb3IgVmlldG5hbWVzZS4gIFRoaXMgZW5jb2RpbmcgZG9lc24ndCBjb3ZlciBhbGwgbmVjZXNzYXJ5Ci0gICAqICAgICBjaGFyYWN0ZXJzLgotICAgKgotICAgKiAgIEZUX1dpbkZOVF9JRF9DUDEzNjEgOjoKLSAgICogICAgIEtvcmVhbiAoSm9oYWIpLgotICAgKi8KLQotI2RlZmluZSBGVF9XaW5GTlRfSURfQ1AxMjUyICAgIDAKLSNkZWZpbmUgRlRfV2luRk5UX0lEX0RFRkFVTFQgICAxCi0jZGVmaW5lIEZUX1dpbkZOVF9JRF9TWU1CT0wgICAgMgotI2RlZmluZSBGVF9XaW5GTlRfSURfTUFDICAgICAgNzcKLSNkZWZpbmUgRlRfV2luRk5UX0lEX0NQOTMyICAgMTI4Ci0jZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDk0OSAgIDEyOQotI2RlZmluZSBGVF9XaW5GTlRfSURfQ1AxMzYxICAxMzAKLSNkZWZpbmUgRlRfV2luRk5UX0lEX0NQOTM2ICAgMTM0Ci0jZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDk1MCAgIDEzNgotI2RlZmluZSBGVF9XaW5GTlRfSURfQ1AxMjUzICAxNjEKLSNkZWZpbmUgRlRfV2luRk5UX0lEX0NQMTI1NCAgMTYyCi0jZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDEyNTggIDE2MwotI2RlZmluZSBGVF9XaW5GTlRfSURfQ1AxMjU1ICAxNzcKLSNkZWZpbmUgRlRfV2luRk5UX0lEX0NQMTI1NiAgMTc4Ci0jZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDEyNTcgIDE4NgotI2RlZmluZSBGVF9XaW5GTlRfSURfQ1AxMjUxICAyMDQKLSNkZWZpbmUgRlRfV2luRk5UX0lEX0NQODc0ICAgMjIyCi0jZGVmaW5lIEZUX1dpbkZOVF9JRF9DUDEyNTAgIDIzOAotI2RlZmluZSBGVF9XaW5GTlRfSURfT0VNICAgICAyNTUKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1dpbkZOVF9IZWFkZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdpbmRvd3MgRk5UIEhlYWRlciBpbmZvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1dpbkZOVF9IZWFkZXJSZWNfCi0gIHsKLSAgICBGVF9VU2hvcnQgIHZlcnNpb247Ci0gICAgRlRfVUxvbmcgICBmaWxlX3NpemU7Ci0gICAgRlRfQnl0ZSAgICBjb3B5cmlnaHRbNjBdOwotICAgIEZUX1VTaG9ydCAgZmlsZV90eXBlOwotICAgIEZUX1VTaG9ydCAgbm9taW5hbF9wb2ludF9zaXplOwotICAgIEZUX1VTaG9ydCAgdmVydGljYWxfcmVzb2x1dGlvbjsKLSAgICBGVF9VU2hvcnQgIGhvcml6b250YWxfcmVzb2x1dGlvbjsKLSAgICBGVF9VU2hvcnQgIGFzY2VudDsKLSAgICBGVF9VU2hvcnQgIGludGVybmFsX2xlYWRpbmc7Ci0gICAgRlRfVVNob3J0ICBleHRlcm5hbF9sZWFkaW5nOwotICAgIEZUX0J5dGUgICAgaXRhbGljOwotICAgIEZUX0J5dGUgICAgdW5kZXJsaW5lOwotICAgIEZUX0J5dGUgICAgc3RyaWtlX291dDsKLSAgICBGVF9VU2hvcnQgIHdlaWdodDsKLSAgICBGVF9CeXRlICAgIGNoYXJzZXQ7Ci0gICAgRlRfVVNob3J0ICBwaXhlbF93aWR0aDsKLSAgICBGVF9VU2hvcnQgIHBpeGVsX2hlaWdodDsKLSAgICBGVF9CeXRlICAgIHBpdGNoX2FuZF9mYW1pbHk7Ci0gICAgRlRfVVNob3J0ICBhdmdfd2lkdGg7Ci0gICAgRlRfVVNob3J0ICBtYXhfd2lkdGg7Ci0gICAgRlRfQnl0ZSAgICBmaXJzdF9jaGFyOwotICAgIEZUX0J5dGUgICAgbGFzdF9jaGFyOwotICAgIEZUX0J5dGUgICAgZGVmYXVsdF9jaGFyOwotICAgIEZUX0J5dGUgICAgYnJlYWtfY2hhcjsKLSAgICBGVF9VU2hvcnQgIGJ5dGVzX3Blcl9yb3c7Ci0gICAgRlRfVUxvbmcgICBkZXZpY2Vfb2Zmc2V0OwotICAgIEZUX1VMb25nICAgZmFjZV9uYW1lX29mZnNldDsKLSAgICBGVF9VTG9uZyAgIGJpdHNfcG9pbnRlcjsKLSAgICBGVF9VTG9uZyAgIGJpdHNfb2Zmc2V0OwotICAgIEZUX0J5dGUgICAgcmVzZXJ2ZWQ7Ci0gICAgRlRfVUxvbmcgICBmbGFnczsKLSAgICBGVF9VU2hvcnQgIEFfc3BhY2U7Ci0gICAgRlRfVVNob3J0ICBCX3NwYWNlOwotICAgIEZUX1VTaG9ydCAgQ19zcGFjZTsKLSAgICBGVF9VU2hvcnQgIGNvbG9yX3RhYmxlX29mZnNldDsKLSAgICBGVF9VTG9uZyAgIHJlc2VydmVkMVs0XTsKLQotICB9IEZUX1dpbkZOVF9IZWFkZXJSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9XaW5GTlRfSGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhbiBARlRfV2luRk5UX0hlYWRlclJlYyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX1dpbkZOVF9IZWFkZXJSZWNfKiAgRlRfV2luRk5UX0hlYWRlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICAgRlRfR2V0X1dpbkZOVF9IZWFkZXIKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBSZXRyaWV2ZSBhIFdpbmRvd3MgRk5UIGZvbnQgaW5mbyBoZWFkZXIuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICAgZmFjZSAgICA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgZmFjZS4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICAgYWhlYWRlciA6OiBUaGUgV2luRk5UIGhlYWRlci4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGlzIGZ1bmN0aW9uIG9ubHkgd29ya3Mgd2l0aCBXaW5kb3dzIEZOVCBmYWNlcywgcmV0dXJuaW5nIGFuIGVycm9yCi0gICAqICAgb3RoZXJ3aXNlLgotICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIEZUX0dldF9XaW5GTlRfSGVhZGVyKCBGVF9GYWNlICAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1dpbkZOVF9IZWFkZXJSZWMgICphaGVhZGVyICk7Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUV0lORk5UX0hfXyAqLwotCi0KLS8qIEVORCAqLwotCi0KLS8qIExvY2FsIFZhcmlhYmxlczogKi8KLS8qIGNvZGluZzogdXRmLTggICAgKi8KLS8qIEVuZDogICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvYXV0b2hpbnQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvYXV0b2hpbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ1YTk3Ny4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2F1dG9oaW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYXV0b2hpbnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEhpZ2gtbGV2ZWwgYGF1dG9oaW50JyBtb2R1bGUtc3BlY2lmaWMgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGF1dG8taGludGVyIGlzIHVzZWQgdG8gbG9hZCBhbmQgYXV0b21hdGljYWxseSBoaW50IGdseXBocyBpZiBhICAgICovCi0gIC8qIGZvcm1hdC1zcGVjaWZpYyBoaW50ZXIgaXNuJ3QgYXZhaWxhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0FVVE9ISU5UX0hfXwotI2RlZmluZSBfX0FVVE9ISU5UX0hfXwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIHNtYWxsIHRlY2huaWNhbCBub3RlIHJlZ2FyZGluZyBhdXRvbWF0aWMgaGludGluZyBpbiBvcmRlciB0byAgICAgICAgKi8KLSAgLyogY2xhcmlmeSB0aGlzIG1vZHVsZSBpbnRlcmZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBbiBhdXRvbWF0aWMgaGludGVyIG1pZ2h0IGNvbXB1dGUgdHdvIGtpbmRzIG9mIGRhdGEgZm9yIGEgZ2l2ZW4gZmFjZTogKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gZ2xvYmFsIGhpbnRzOiBVc3VhbGx5IHNvbWUgbWV0cmljcyB0aGF0IGRlc2NyaWJlIGdsb2JhbCBwcm9wZXJ0aWVzICAqLwotICAvKiAgICAgICAgICAgICAgICAgb2YgdGhlIGZhY2UuICBJdCBpcyBjb21wdXRlZCBieSBzY2FubmluZyBtb3JlIG9yIGxlc3MgKi8KLSAgLyogICAgICAgICAgICAgICAgIGFnZ3Jlc3NpdmVseSB0aGUgZ2x5cGhzIGluIHRoZSBmYWNlLCBhbmQgdGh1cyBjYW4gYmUgICovCi0gIC8qICAgICAgICAgICAgICAgICB2ZXJ5IHNsb3cgdG8gY29tcHV0ZSAoZXZlbiBpZiB0aGUgc2l6ZSBvZiBnbG9iYWwgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgaGludHMgaXMgcmVhbGx5IHNtYWxsKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gZ2x5cGggaGludHM6ICBUaGVzZSBkZXNjcmliZSBzb21lIGltcG9ydGFudCBmZWF0dXJlcyBvZiB0aGUgZ2x5cGggICAqLwotICAvKiAgICAgICAgICAgICAgICAgb3V0bGluZSwgYXMgd2VsbCBhcyBob3cgdG8gYWxpZ24gdGhlbS4gIFRoZXkgYXJlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGdlbmVyYWxseSBtdWNoIGZhc3RlciB0byBjb21wdXRlIHRoYW4gZ2xvYmFsIGhpbnRzLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgY3VycmVudCBGcmVlVHlwZSBhdXRvLWhpbnRlciBkb2VzIGEgcHJldHR5IGdvb2Qgam9iIHdoaWxlICAgICAgICAgKi8KLSAgLyogcGVyZm9ybWluZyBmYXN0IGNvbXB1dGF0aW9ucyBmb3IgYm90aCBnbG9iYWwgYW5kIGdseXBoIGhpbnRzLiAgICAgICAgICovCi0gIC8qIEhvd2V2ZXIsIHdlIG1pZ2h0IGJlIGludGVyZXN0ZWQgaW4gaW50cm9kdWNpbmcgbW9yZSBjb21wbGV4IGFuZCAgICAgICAqLwotICAvKiBwb3dlcmZ1bCBhbGdvcml0aG1zIGluIHRoZSBmdXR1cmUsIGxpa2UgdGhlIG9uZSBkZXNjcmliZWQgaW4gdGhlIEpvaG4gKi8KLSAgLyogRC4gSG9iYnkgcGFwZXIsIHdoaWNoIHVuZm9ydHVuYXRlbHkgcmVxdWlyZXMgYSBsb3QgbW9yZSBob3JzZXBvd2VyLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBCZWNhdXNlIGEgc3VmZmljaWVudGx5IHNvcGhpc3RpY2F0ZWQgZm9udCBtYW5hZ2VtZW50IHN5c3RlbSB3b3VsZCAgICAgKi8KLSAgLyogdHlwaWNhbGx5IGltcGxlbWVudCBhbiBMUlUgY2FjaGUgb2Ygb3BlbmVkIGZhY2Ugb2JqZWN0cyB0byByZWR1Y2UgICAgICovCi0gIC8qIG1lbW9yeSB1c2FnZSwgaXQgaXMgYSBnb29kIGlkZWEgdG8gYmUgYWJsZSB0byBhdm9pZCByZWNvbXB1dGluZyAgICAgICAqLwotICAvKiBnbG9iYWwgaGludHMgZXZlcnkgdGltZSB0aGUgc2FtZSBmYWNlIGlzIHJlLW9wZW5lZC4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFdlIHRodXMgcHJvdmlkZSB0aGUgYWJpbGl0eSB0byBjYWNoZSBnbG9iYWwgaGludHMgb3V0c2lkZSBvZiB0aGUgZmFjZSAqLwotICAvKiBvYmplY3QsIGluIG9yZGVyIHRvIHNwZWVkIHVwIGZvbnQgcmUtb3BlbmluZyB0aW1lLiAgT2YgY291cnNlLCB0aGlzICAgKi8KLSAgLyogZmVhdHVyZSBpcyBwdXJlbHkgb3B0aW9uYWwsIHNvIG1vc3QgY2xpZW50IHByb2dyYW1zIHdvbid0IGV2ZW4gbm90aWNlICovCi0gIC8qIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSSBpbml0aWFsbHkgdGhvdWdodCB0aGF0IGl0IHdvdWxkIGJlIGEgZ29vZCBpZGVhIHRvIGNhY2hlIHRoZSBnbHlwaCAgICovCi0gIC8qIGhpbnRzIHRvby4gIEhvd2V2ZXIsIG15IGdlbmVyYWwgaWRlYSBub3cgaXMgdGhhdCBpZiB5b3UgcmVhbGx5IG5lZWQgICAqLwotICAvKiB0byBjYWNoZSB0aGVzZSB0b28sIHlvdSBhcmUgc2ltcGx5IGluIG5lZWQgb2YgYSBuZXcgZm9udCBmb3JtYXQsICAgICAgKi8KLSAgLyogd2hlcmUgYWxsIHRoaXMgaW5mb3JtYXRpb24gY291bGQgYmUgc3RvcmVkIHdpdGhpbiB0aGUgZm9udCBmaWxlIGFuZCAgICovCi0gIC8qIGRlY29kZWQgb24gdGhlIGZseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICB0eXBlZGVmIHN0cnVjdCBGVF9BdXRvSGludGVyUmVjXyAgKkZUX0F1dG9IaW50ZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BdXRvSGludGVyX0dsb2JhbEdldEZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXRyaWV2ZSB0aGUgZ2xvYmFsIGhpbnRzIGNvbXB1dGVkIGZvciBhIGdpdmVuIGZhY2Ugb2JqZWN0LiAgVGhlICAgKi8KLSAgLyogICAgcmVzdWx0aW5nIGRhdGEgaXMgZGlzc29jaWF0ZWQgZnJvbSB0aGUgZmFjZSBhbmQgd2lsbCBzdXJ2aXZlIGEgICAgICovCi0gIC8qICAgIGNhbGwgdG8gRlRfRG9uZV9GYWNlKCkuICBJdCBtdXN0IGJlIGRpc2NhcmRlZCB0aHJvdWdoIHRoZSBBUEkgICAgICAqLwotICAvKiAgICBGVF9BdXRvSGludGVyX0dsb2JhbERvbmVGdW5jKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoaW50ZXIgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBhdXRvLWhpbnRlci4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdsb2JhbF9oaW50cyA6OiBBIHR5cGVsZXNzIHBvaW50ZXIgdG8gdGhlIGdsb2JhbCBoaW50cy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2xvYmFsX2xlbiAgIDo6IFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBnbG9iYWwgaGludHMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9BdXRvSGludGVyX0dsb2JhbEdldEZ1bmMpKCBGVF9BdXRvSGludGVyICBoaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogICAgICAgICBnbG9iYWxfaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyogICAgICAgICAgZ2xvYmFsX2xlbiApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQXV0b0hpbnRlcl9HbG9iYWxEb25lRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGlzY2FyZCB0aGUgZ2xvYmFsIGhpbnRzIHJldHJpZXZlZCB0aHJvdWdoICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0F1dG9IaW50ZXJfR2xvYmFsR2V0RnVuYygpLiAgVGhpcyBpcyB0aGUgb25seSB3YXkgdGhlc2UgaGludHMgICAqLwotICAvKiAgICBhcmUgZnJlZWQgZnJvbSBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoaW50ZXIgOjogQSBoYW5kbGUgdG8gdGhlIGF1dG8taGludGVyIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdsb2JhbCA6OiBBIHBvaW50ZXIgdG8gcmV0cmlldmVkIGdsb2JhbCBoaW50cyB0byBkaXNjYXJkLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfQXV0b0hpbnRlcl9HbG9iYWxEb25lRnVuYykoIEZUX0F1dG9IaW50ZXIgIGhpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgZ2xvYmFsICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9BdXRvSGludGVyX0dsb2JhbFJlc2V0RnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVjb21wdXRlIHRoZSBnbG9iYWwgbWV0cmljcyBpbiBhIGdpdmVuICAgKi8KLSAgLyogICAgZm9udC4gIFRoaXMgaXMgdXNlZnVsIHdoZW4gZ2xvYmFsIGZvbnQgZGF0YSBjaGFuZ2VzIChlLmcuIE11bHRpcGxlICovCi0gIC8qICAgIE1hc3RlcnMgZm9udHMgd2hlcmUgYmxlbmQgY29vcmRpbmF0ZXMgY2hhbmdlKS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhpbnRlciA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGF1dG8taGludGVyLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9BdXRvSGludGVyX0dsb2JhbFJlc2V0RnVuYykoIEZUX0F1dG9IaW50ZXIgIGhpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgIGZhY2UgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0F1dG9IaW50ZXJfR2x5cGhMb2FkRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBsb2FkLCBzY2FsZSwgYW5kIGF1dG9tYXRpY2FsbHkgaGludCBhICAgICAqLwotICAvKiAgICBnbHlwaCBmcm9tIGEgZ2l2ZW4gZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2luZGV4IDo6IFRoZSBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9mbGFncyAgOjogVGhlIGxvYWQgZmxhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBjYXBhYmxlIG9mIGxvYWRpbmcgY29tcG9zaXRlIGdseXBocyBieSBoaW50aW5nICAgICovCi0gIC8qICAgIGVhY2ggc3ViLWdseXBoIGluZGVwZW5kZW50bHkgKHdoaWNoIGltcHJvdmVzIHF1YWxpdHkpLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSXQgd2lsbCBjYWxsIHRoZSBmb250IGRyaXZlciB3aXRoIEBGVF9Mb2FkX0dseXBoLCB3aXRoICAgICAgICAgICAgICovCi0gIC8qICAgIEBGVF9MT0FEX05PX1NDQUxFIHNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0F1dG9IaW50ZXJfR2x5cGhMb2FkRnVuYykoIEZUX0F1dG9IaW50ZXIgIGhpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemUgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICAgICAgbG9hZF9mbGFncyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfQXV0b0hpbnRlcl9JbnRlcmZhY2VSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGF1dG8taGludGVyIG1vZHVsZSdzIGludGVyZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfQXV0b0hpbnRlcl9JbnRlcmZhY2VSZWNfCi0gIHsKLSAgICBGVF9BdXRvSGludGVyX0dsb2JhbFJlc2V0RnVuYyAgcmVzZXRfZmFjZTsKLSAgICBGVF9BdXRvSGludGVyX0dsb2JhbEdldEZ1bmMgICAgZ2V0X2dsb2JhbF9oaW50czsKLSAgICBGVF9BdXRvSGludGVyX0dsb2JhbERvbmVGdW5jICAgZG9uZV9nbG9iYWxfaGludHM7Ci0gICAgRlRfQXV0b0hpbnRlcl9HbHlwaExvYWRGdW5jICAgIGxvYWRfZ2x5cGg7Ci0KLSAgfSBGVF9BdXRvSGludGVyX0ludGVyZmFjZVJlYywgKkZUX0F1dG9IaW50ZXJfSW50ZXJmYWNlOwotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9ERUZJTkVfQVVUT0hJTlRFUl9JTlRFUkZBQ0UoICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmVzZXRfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9nbG9iYWxfaGludHNfLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lX2dsb2JhbF9oaW50c18sICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9nbHlwaF8gKSAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgRlRfQXV0b0hpbnRlcl9JbnRlcmZhY2VSZWMgIGNsYXNzXyA9ICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJlc2V0X2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfZ2xvYmFsX2hpbnRzXywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG9uZV9nbG9iYWxfaGludHNfLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfZ2x5cGhfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfQVVUT0hJTlRFUl9JTlRFUkZBQ0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmVzZXRfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9nbG9iYWxfaGludHNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lX2dsb2JhbF9oaW50c18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9nbHlwaF8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgICAgIGxpYnJhcnksICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQXV0b0hpbnRlcl9JbnRlcmZhY2VSZWMqICBjbGF6eiApICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5yZXNldF9mYWNlICAgICAgICA9IHJlc2V0X2ZhY2VfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X2dsb2JhbF9oaW50cyAgPSBnZXRfZ2xvYmFsX2hpbnRzXzsgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmRvbmVfZ2xvYmFsX2hpbnRzID0gZG9uZV9nbG9iYWxfaGludHNfOyAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX2dseXBoICAgICAgICA9IGxvYWRfZ2x5cGhfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19BVVRPSElOVF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0Y2FsYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2FkZTdlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRjYWxjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRjYWxjLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFyaXRobWV0aWMgY29tcHV0YXRpb25zIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRDQUxDX0hfXwotI2RlZmluZSBfX0ZUQ0FMQ19IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRlRfTXVsRGl2KCkgYW5kIEZUX011bEZpeCgpIGFyZSBkZWNsYXJlZCBpbiBmcmVldHlwZS5oLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiAgRlRfQ09ORklHX09QVElPTl9OT19BU1NFTUJMRVIKLSAgLyogUHJvdmlkZSBhc3NlbWJsZXIgZnJhZ21lbnRzIGZvciBwZXJmb3JtYW5jZS1jcml0aWNhbCBmdW5jdGlvbnMuICovCi0gIC8qIFRoZXNlIG11c3QgYmUgZGVmaW5lZCBgc3RhdGljIF9faW5saW5lX18nIHdpdGggR0NDLiAgICAgICAgICAgICAqLwotCi0jaWYgZGVmaW5lZCggX19DQ19BUk0gKSB8fCBkZWZpbmVkKCBfX0FSTUNDX18gKSAgLyogUlZDVCAqLwotCi0jZGVmaW5lIEZUX01VTEZJWF9BU1NFTUJMRVIgIEZUX011bEZpeF9hcm0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBzdGF0aWMgX19pbmxpbmUgRlRfSW50MzIKLSAgRlRfTXVsRml4X2FybSggRlRfSW50MzIgIGEsCi0gICAgICAgICAgICAgICAgIEZUX0ludDMyICBiICkKLSAgewotICAgIHJlZ2lzdGVyIEZUX0ludDMyICB0LCB0MjsKLQotCi0gICAgX19hc20KLSAgICB7Ci0gICAgICBzbXVsbCB0MiwgdCwgIGIsICBhICAgICAgICAgICAvKiAobG89dDIsaGk9dCkgPSBhKmIgKi8KLSAgICAgIG1vdiAgIGEsICB0LCAgYXNyICMzMSAgICAgICAgIC8qIGEgICA9IChoaSA+PiAzMSkgKi8KLSAgICAgIGFkZCAgIGEsICBhLCAgIzB4ODAwMCAgICAgICAgIC8qIGEgICs9IDB4ODAwMCAqLwotICAgICAgYWRkcyAgdDIsIHQyLCBhICAgICAgICAgICAgICAgLyogdDIgKz0gYSAqLwotICAgICAgYWRjICAgdCwgIHQsICAjMCAgICAgICAgICAgICAgLyogdCAgKz0gY2FycnkgKi8KLSAgICAgIG1vdiAgIGEsICB0MiwgbHNyICMxNiAgICAgICAgIC8qIGEgICA9IHQyID4+IDE2ICovCi0gICAgICBvcnIgICBhLCAgYSwgIHQsICBsc2wgIzE2ICAgICAvKiBhICB8PSB0IDw8IDE2ICovCi0gICAgfQotICAgIHJldHVybiBhOwotICB9Ci0KLSNlbmRpZiAvKiBfX0NDX0FSTSB8fCBfX0FSTUNDX18gKi8KLQotCi0jaWZkZWYgX19HTlVDX18KLQotI2lmIGRlZmluZWQoIF9fYXJtX18gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFwKLSAgICAoICFkZWZpbmVkKCBfX3RodW1iX18gKSB8fCBkZWZpbmVkKCBfX3RodW1iMl9fICkgKSAmJiBcCi0gICAgISggZGVmaW5lZCggX19DQ19BUk0gKSB8fCBkZWZpbmVkKCBfX0FSTUNDX18gKSApCi0KLSNkZWZpbmUgRlRfTVVMRklYX0FTU0VNQkxFUiAgRlRfTXVsRml4X2FybQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIHN0YXRpYyBfX2lubGluZV9fIEZUX0ludDMyCi0gIEZUX011bEZpeF9hcm0oIEZUX0ludDMyICBhLAotICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgYiApCi0gIHsKLSAgICByZWdpc3RlciBGVF9JbnQzMiAgdCwgdDI7Ci0KLQotICAgIF9fYXNtX18gX192b2xhdGlsZV9fICgKLSAgICAgICJzbXVsbCAgJTEsICUyLCAlNCwgJTNcblx0IiAgICAgICAvKiAobG89JTEsaGk9JTIpID0gYSpiICovCi0gICAgICAibW92ICAgICUwLCAlMiwgYXNyICMzMVxuXHQiICAgICAgLyogJTAgID0gKGhpID4+IDMxKSAqLwotI2lmIGRlZmluZWQoIF9fY2xhbmdfXyApICYmIGRlZmluZWQoIF9fdGh1bWIyX18gKQotICAgICAgImFkZC53ICAlMCwgJTAsICMweDgwMDBcblx0IiAgICAgIC8qICUwICs9IDB4ODAwMCAqLwotI2Vsc2UKLSAgICAgICJhZGQgICAgJTAsICUwLCAjMHg4MDAwXG5cdCIgICAgICAvKiAlMCArPSAweDgwMDAgKi8KLSNlbmRpZgotICAgICAgImFkZHMgICAlMSwgJTEsICUwXG5cdCIgICAgICAgICAgIC8qICUxICs9ICUwICovCi0gICAgICAiYWRjICAgICUyLCAlMiwgIzBcblx0IiAgICAgICAgICAgLyogJTIgKz0gY2FycnkgKi8KLSAgICAgICJtb3YgICAgJTAsICUxLCBsc3IgIzE2XG5cdCIgICAgICAvKiAlMCAgPSAlMSA+PiAxNiAqLwotICAgICAgIm9yciAgICAlMCwgJTAsICUyLCBsc2wgIzE2XG5cdCIgIC8qICUwIHw9ICUyIDw8IDE2ICovCi0gICAgICA6ICI9ciIoYSksICI9JnIiKHQyKSwgIj0mciIodCkKLSAgICAgIDogInIiKGEpLCAiciIoYikKLSAgICAgIDogImNjIiApOwotICAgIHJldHVybiBhOwotICB9Ci0KLSNlbmRpZiAvKiBfX2FybV9fICAgICAgICAgICAgICAgICAgICAgICYmICovCi0gICAgICAgLyogKCBfX3RodW1iMl9fIHx8ICFfX3RodW1iX18gKSAmJiAqLwotICAgICAgIC8qICEoIF9fQ0NfQVJNIHx8IF9fQVJNQ0NfXyApICAgICAgKi8KLQotCi0jaWYgZGVmaW5lZCggX19pMzg2X18gKQotCi0jZGVmaW5lIEZUX01VTEZJWF9BU1NFTUJMRVIgIEZUX011bEZpeF9pMzg2Ci0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgc3RhdGljIF9faW5saW5lX18gRlRfSW50MzIKLSAgRlRfTXVsRml4X2kzODYoIEZUX0ludDMyICBhLAotICAgICAgICAgICAgICAgICAgRlRfSW50MzIgIGIgKQotICB7Ci0gICAgcmVnaXN0ZXIgRlRfSW50MzIgIHJlc3VsdDsKLQotCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgImltdWwgICUlZWR4XG4iCi0gICAgICAibW92bCAgJSVlZHgsICUlZWN4XG4iCi0gICAgICAic2FybCAgJDMxLCAlJWVjeFxuIgotICAgICAgImFkZGwgICQweDgwMDAsICUlZWN4XG4iCi0gICAgICAiYWRkbCAgJSVlY3gsICUlZWF4XG4iCi0gICAgICAiYWRjbCAgJDAsICUlZWR4XG4iCi0gICAgICAic2hybCAgJDE2LCAlJWVheFxuIgotICAgICAgInNobGwgICQxNiwgJSVlZHhcbiIKLSAgICAgICJhZGRsICAlJWVkeCwgJSVlYXhcbiIKLSAgICAgIDogIj1hIihyZXN1bHQpLCAiPWQiKGIpCi0gICAgICA6ICJhIihhKSwgImQiKGIpCi0gICAgICA6ICIlZWN4IiwgImNjIiApOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotI2VuZGlmIC8qIGkzODYgKi8KLQotI2VuZGlmIC8qIF9fR05VQ19fICovCi0KLQotI2lmZGVmIF9NU0NfVkVSIC8qIFZpc3VhbCBDKysgKi8KLQotI2lmZGVmIF9NX0lYODYKLQotI2RlZmluZSBGVF9NVUxGSVhfQVNTRU1CTEVSICBGVF9NdWxGaXhfaTM4NgotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIHN0YXRpYyBfX2lubGluZSBGVF9JbnQzMgotICBGVF9NdWxGaXhfaTM4NiggRlRfSW50MzIgIGEsCi0gICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgYiApCi0gIHsKLSAgICByZWdpc3RlciBGVF9JbnQzMiAgcmVzdWx0OwotCi0gICAgX19hc20KLSAgICB7Ci0gICAgICBtb3YgZWF4LCBhCi0gICAgICBtb3YgZWR4LCBiCi0gICAgICBpbXVsIGVkeAotICAgICAgbW92IGVjeCwgZWR4Ci0gICAgICBzYXIgZWN4LCAzMQotICAgICAgYWRkIGVjeCwgODAwMGgKLSAgICAgIGFkZCBlYXgsIGVjeAotICAgICAgYWRjIGVkeCwgMAotICAgICAgc2hyIGVheCwgMTYKLSAgICAgIHNobCBlZHgsIDE2Ci0gICAgICBhZGQgZWF4LCBlZHgKLSAgICAgIG1vdiByZXN1bHQsIGVheAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSNlbmRpZiAvKiBfTV9JWDg2ICovCi0KLSNlbmRpZiAvKiBfTVNDX1ZFUiAqLwotCi0KLSNpZiBkZWZpbmVkKCBfX0dOVUNfXyApICYmIGRlZmluZWQoIF9feDg2XzY0X18gKQotCi0jZGVmaW5lIEZUX01VTEZJWF9BU1NFTUJMRVIgIEZUX011bEZpeF94ODZfNjQKLQotICBzdGF0aWMgX19pbmxpbmVfXyBGVF9JbnQzMgotICBGVF9NdWxGaXhfeDg2XzY0KCBGVF9JbnQzMiAgYSwKLSAgICAgICAgICAgICAgICAgICAgRlRfSW50MzIgIGIgKQotICB7Ci0gICAgLyogVGVtcG9yYXJpbHkgZGlzYWJsZSB0aGUgd2FybmluZyB0aGF0IEM5MCBkb2Vzbid0IHN1cHBvcnQgKi8KLSAgICAvKiBgbG9uZyBsb25nJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmIF9fR05VQ19fID4gNCB8fCAoIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPj0gNiApCi0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdsb25nLWxvbmciCi0jZW5kaWYKLQotI2lmIDEKLSAgICAvKiBUZWNobmljYWxseSBub3QgYW4gYXNzZW1ibHkgZnJhZ21lbnQsIGJ1dCBHQ0MgZG9lcyBhIHJlYWxseSBnb29kICovCi0gICAgLyogam9iIGF0IGlubGluaW5nIGl0IGFuZCBnZW5lcmF0aW5nIGdvb2QgbWFjaGluZSBjb2RlIGZvciBpdC4gICAgICAqLwotICAgIGxvbmcgbG9uZyAgcmV0LCB0bXA7Ci0KLQotICAgIHJldCAgPSAobG9uZyBsb25nKWEgKiBiOwotICAgIHRtcCAgPSByZXQgPj4gNjM7Ci0gICAgcmV0ICs9IDB4ODAwMCArIHRtcDsKLQotICAgIHJldHVybiAoRlRfSW50MzIpKCByZXQgPj4gMTYgKTsKLSNlbHNlCi0KLSAgICAvKiBGb3Igc29tZSByZWFzb24sIEdDQyA0LjYgb24gVWJ1bnR1IDEyLjA0IGdlbmVyYXRlcyBpbnZhbGlkIG1hY2hpbmUgICovCi0gICAgLyogY29kZSBmcm9tIHRoZSBsaW5lcyBiZWxvdy4gIFRoZSBtYWluIGlzc3VlIGlzIHRoYXQgYHdpZGVfYScgaXMgbm90ICAqLwotICAgIC8qIHByb3Blcmx5IGluaXRpYWxpemVkIGJ5IHNpZ24tZXh0ZW5kaW5nIGBhJy4gIEluc3RlYWQsIHRoZSBnZW5lcmF0ZWQgKi8KLSAgICAvKiBtYWNoaW5lIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSByZWdpc3RlciB0aGF0IGNvbnRhaW5zIGBhJyBvbiBpbnB1dCAgICovCi0gICAgLyogY2FuIGJlIHVzZWQgZGlyZWN0bHkgYXMgYSA2NC1iaXQgdmFsdWUsIHdoaWNoIGlzIHdyb25nIG1vc3Qgb2YgdGhlICAqLwotICAgIC8qIHRpbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBsb25nIGxvbmcgIHdpZGVfYSA9IChsb25nIGxvbmcpYTsKLSAgICBsb25nIGxvbmcgIHdpZGVfYiA9IChsb25nIGxvbmcpYjsKLSAgICBsb25nIGxvbmcgIHJlc3VsdDsKLQotCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgImltdWwgJTIsICUxXG4iCi0gICAgICAibW92ICUxLCAlMFxuIgotICAgICAgInNhciAkNjMsICUwXG4iCi0gICAgICAibGVhIDB4ODAwMCglMSwgJTApLCAlMFxuIgotICAgICAgInNhciAkMTYsICUwXG4iCi0gICAgICA6ICI9JnIiKHJlc3VsdCksICI9JnIiKHdpZGVfYSkKLSAgICAgIDogInIiKHdpZGVfYikKLSAgICAgIDogImNjIiApOwotCi0gICAgcmV0dXJuIChGVF9JbnQzMilyZXN1bHQ7Ci0jZW5kaWYKLQotI2lmIF9fR05VQ19fID4gNCB8fCAoIF9fR05VQ19fID09IDQgJiYgX19HTlVDX01JTk9SX18gPj0gNiApCi0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAotI2VuZGlmCi0gIH0KLQotI2VuZGlmIC8qIF9fR05VQ19fICYmIF9feDg2XzY0X18gKi8KLQotI2VuZGlmIC8qICFGVF9DT05GSUdfT1BUSU9OX05PX0FTU0VNQkxFUiAqLwotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOTElORV9NVUxGSVgKLSNpZmRlZiBGVF9NVUxGSVhfQVNTRU1CTEVSCi0jZGVmaW5lIEZUX011bEZpeCggYSwgYiApICBGVF9NVUxGSVhfQVNTRU1CTEVSKCAoRlRfSW50MzIpKGEpLCAoRlRfSW50MzIpKGIpICkKLSNlbmRpZgotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9NdWxEaXZfTm9fUm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHZlcnkgc2ltcGxlIGZ1bmN0aW9uIHVzZWQgdG8gcGVyZm9ybSB0aGUgY29tcHV0YXRpb24gYChhKmIpL2MnICAgKi8KLSAgLyogICAgKHdpdGhvdXQgcm91bmRpbmcpIHdpdGggbWF4aW11bSBhY2N1cmFjeSAoaXQgdXNlcyBhIDY0LWJpdCAgICAgICAgICovCi0gIC8qICAgIGludGVybWVkaWF0ZSBpbnRlZ2VyIHdoZW5ldmVyIG5lY2Vzc2FyeSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpc24ndCBuZWNlc3NhcmlseSBhcyBmYXN0IGFzIHNvbWUgcHJvY2Vzc29yIHNwZWNpZmljICovCi0gIC8qICAgIG9wZXJhdGlvbnMsIGJ1dCBpcyBhdCBsZWFzdCBjb21wbGV0ZWx5IHBvcnRhYmxlLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGEgOjogVGhlIGZpcnN0IG11bHRpcGxpZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiIDo6IFRoZSBzZWNvbmQgbXVsdGlwbGllci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYyA6OiBUaGUgZGl2aXNvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlc3VsdCBvZiBgKGEqYikvYycuICBUaGlzIGZ1bmN0aW9uIG5ldmVyIHRyYXBzIHdoZW4gdHJ5aW5nIHRvICovCi0gIC8qICAgIGRpdmlkZSBieSB6ZXJvOyBpdCBzaW1wbHkgcmV0dXJucyBgTWF4SW50JyBvciBgTWluSW50JyBkZXBlbmRpbmcgICAqLwotICAvKiAgICBvbiB0aGUgc2lnbnMgb2YgYGEnIGFuZCBgYicuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIEZUX0xvbmcgKQotICBGVF9NdWxEaXZfTm9fUm91bmQoIEZUX0xvbmcgIGEsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgYiwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICBjICk7Ci0KLQotICAvKgotICAgKiAgQSB2YXJpYW50IG9mIEZUX01hdHJpeF9NdWx0aXBseSB3aGljaCBzY2FsZXMgaXRzIHJlc3VsdCBhZnRlcndhcmRzLgotICAgKiAgVGhlIGlkZWEgaXMgdGhhdCBib3RoIGBhJyBhbmQgYGInIGFyZSBzY2FsZWQgYnkgZmFjdG9ycyBvZiAxMCBzbyB0aGF0Ci0gICAqICB0aGUgdmFsdWVzIGFyZSBhcyBwcmVjaXNlIGFzIHBvc3NpYmxlIHRvIGdldCBhIGNvcnJlY3QgcmVzdWx0IGR1cmluZwotICAgKiAgdGhlIDY0Yml0IG11bHRpcGxpY2F0aW9uLiAgTGV0IGBzYScgYW5kIGBzYicgYmUgdGhlIHNjYWxpbmcgZmFjdG9ycyBvZgotICAgKiAgYGEnIGFuZCBgYicsIHJlc3BlY3RpdmVseSwgdGhlbiB0aGUgc2NhbGluZyBmYWN0b3Igb2YgdGhlIHJlc3VsdCBpcwotICAgKiAgYHNhKnNiJy4KLSAgICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9NYXRyaXhfTXVsdGlwbHlfU2NhbGVkKCBjb25zdCBGVF9NYXRyaXgqICBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NYXRyaXggICAgICAgICpiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICAgICBzY2FsaW5nICk7Ci0KLQotICAvKgotICAgKiAgQSB2YXJpYW50IG9mIEZUX1ZlY3Rvcl9UcmFuc2Zvcm0uICBTZWUgY29tbWVudHMgZm9yCi0gICAqICBGVF9NYXRyaXhfTXVsdGlwbHlfU2NhbGVkLgotICAgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX1ZlY3Rvcl9UcmFuc2Zvcm1fU2NhbGVkKCBGVF9WZWN0b3IqICAgICAgICB2ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9NYXRyaXgqICBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICAgICBzY2FsaW5nICk7Ci0KLQotICAvKgotICAgKiAgVGhpcyBmdW5jdGlvbiBub3JtYWxpemVzIGEgdmVjdG9yIGFuZCByZXR1cm5zIGl0cyBvcmlnaW5hbCBsZW5ndGguCi0gICAqICBUaGUgbm9ybWFsaXplZCB2ZWN0b3IgaXMgYSAxNi4xNiBmaXhlZC1wb2ludCB1bml0IHZlY3RvciB3aXRoIGxlbmd0aAotICAgKiAgY2xvc2UgdG8gMHgxMDAwMC4gIFRoZSBhY2N1cmFjeSBvZiB0aGUgcmV0dXJuZWQgbGVuZ3RoIGlzIGxpbWl0ZWQgdG8KLSAgICogIDE2IGJpdHMgYWxzby4gIFRoZSBmdW5jdGlvbiB1dGlsaXplcyBxdWljayBpbnZlcnNlIHNxdWFyZSByb290Ci0gICAqICBhcHByb3hpbWF0aW9uIHdpdGhvdXQgZGl2aXNpb25zIGFuZCBzcXVhcmUgcm9vdHMgcmVseWluZyBvbiBOZXd0b24ncwotICAgKiAgaXRlcmF0aW9ucyBpbnN0ZWFkLgotICAgKi8KLSAgRlRfQkFTRSggRlRfVUludDMyICkKLSAgRlRfVmVjdG9yX05vcm1MZW4oIEZUX1ZlY3RvciogIHZlY3RvciApOwotCi0KLSAgLyoKLSAgICogIFJldHVybiAtMSwgMCwgb3IgKzEsIGRlcGVuZGluZyBvbiB0aGUgb3JpZW50YXRpb24gb2YgYSBnaXZlbiBjb3JuZXIuCi0gICAqICBXZSB1c2UgdGhlIENhcnRlc2lhbiBjb29yZGluYXRlIHN5c3RlbSwgd2l0aCBwb3NpdGl2ZSB2ZXJ0aWNhbCB2YWx1ZXMKLSAgICogIGdvaW5nIHVwd2FyZHMuICBUaGUgZnVuY3Rpb24gcmV0dXJucyArMSBpZiB0aGUgY29ybmVyIHR1cm5zIHRvIHRoZQotICAgKiAgbGVmdCwgLTEgdG8gdGhlIHJpZ2h0LCBhbmQgMCBmb3IgdW5kZWNpZGFibGUgY2FzZXMuCi0gICAqLwotICBGVF9CQVNFKCBGVF9JbnQgKQotICBmdF9jb3JuZXJfb3JpZW50YXRpb24oIEZUX1BvcyAgaW5feCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIGluX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBvdXRfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIG91dF95ICk7Ci0KLQotICAvKgotICAgKiAgUmV0dXJuIFRSVUUgaWYgYSBjb3JuZXIgaXMgZmxhdCBvciBuZWFybHkgZmxhdC4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bwotICAgKiAgc2F5aW5nIHRoYXQgdGhlIGNvcm5lciBwb2ludCBpcyBjbG9zZSB0byBpdHMgbmVpZ2hib3JzLCBvciBpbnNpZGUgYW4KLSAgICogIGVsbGlwc2UgZGVmaW5lZCBieSB0aGUgbmVpZ2hib3IgZm9jYWwgcG9pbnRzIHRvIGJlIG1vcmUgcHJlY2lzZS4KLSAgICovCi0gIEZUX0JBU0UoIEZUX0ludCApCi0gIGZ0X2Nvcm5lcl9pc19mbGF0KCBGVF9Qb3MgIGluX3gsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIGluX3ksCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIG91dF94LAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBvdXRfeSApOwotCi0KLSAgLyoKLSAgICogIFJldHVybiB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgaW5kZXguCi0gICAqLwotCi0jaWZuZGVmICBGVF9DT05GSUdfT1BUSU9OX05PX0FTU0VNQkxFUgotI2lmIGRlZmluZWQoIF9fR05VQ19fICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBcCi0gICAgKCBfX0dOVUNfXyA+IDMgfHwgKCBfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDQgKSApCi0KLSNpZiBGVF9TSVpFT0ZfSU5UID09IDQKLQotI2RlZmluZSBGVF9NU0IoIHggKSAgKCAzMSAtIF9fYnVpbHRpbl9jbHooIHggKSApCi0KLSNlbGlmIEZUX1NJWkVPRl9MT05HID09IDQKLQotI2RlZmluZSBGVF9NU0IoIHggKSAgKCAzMSAtIF9fYnVpbHRpbl9jbHpsKCB4ICkgKQotCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fR05VQ19fICovCi0jZW5kaWYgLyogIUZUX0NPTkZJR19PUFRJT05fTk9fQVNTRU1CTEVSICovCi0KLSNpZm5kZWYgRlRfTVNCCi0KLSAgRlRfQkFTRSggRlRfSW50ICkKLSAgRlRfTVNCKCBGVF9VSW50MzIgIHogKTsKLQotI2VuZGlmCi0KLQotICAvKgotICAgKiAgUmV0dXJuIHNxcnQoeCp4K3kqeSksIHdoaWNoIGlzIHRoZSBzYW1lIGFzIGBGVF9WZWN0b3JfTGVuZ3RoJyBidXQgdXNlcwotICAgKiAgdHdvIGZpeGVkLXBvaW50IGFyZ3VtZW50cyBpbnN0ZWFkLgotICAgKi8KLSAgRlRfQkFTRSggRlRfRml4ZWQgKQotICBGVF9IeXBvdCggRlRfRml4ZWQgIHgsCi0gICAgICAgICAgICBGVF9GaXhlZCAgeSApOwotCi0KLSNpZiAwCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU3FydEZpeGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0ZXMgdGhlIHNxdWFyZSByb290IG9mIGEgMTYuMTYgZml4ZWQtcG9pbnQgdmFsdWUuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeCA6OiBUaGUgdmFsdWUgdG8gY29tcHV0ZSB0aGUgcm9vdCBmb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHJlc3VsdCBvZiBgc3FydCh4KScuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBub3QgdmVyeSBmYXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCBGVF9JbnQzMiApCi0gIEZUX1NxcnRGaXhlZCggRlRfSW50MzIgIHggKTsKLQotI2VuZGlmIC8qIDAgKi8KLQotCi0jZGVmaW5lIElOVF9UT19GMjZET1Q2KCB4ICkgICAgKCAoRlRfTG9uZykoeCkgPDwgNiAgKQotI2RlZmluZSBJTlRfVE9fRjJET1QxNCggeCApICAgICggKEZUX0xvbmcpKHgpIDw8IDE0ICkKLSNkZWZpbmUgSU5UX1RPX0ZJWEVEKCB4ICkgICAgICAoIChGVF9Mb25nKSh4KSA8PCAxNiApCi0jZGVmaW5lIEYyRE9UMTRfVE9fRklYRUQoIHggKSAgKCAoRlRfTG9uZykoeCkgPDwgMiAgKQotI2RlZmluZSBGTE9BVF9UT19GSVhFRCggeCApICAgICggKEZUX0xvbmcpKCB4ICogNjU1MzYuMCApICkKLSNkZWZpbmUgRklYRURfVE9fSU5UKCB4ICkgICAgICAoIEZUX1JvdW5kRml4KCB4ICkgPj4gMTYgKQotCi0jZGVmaW5lIFJPVU5EX0YyNkRPVDYoIHggKSAgICAgKCB4ID49IDAgPyAoICAgICggKHgpICsgMzIgKSAmIC02NCApICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoIC0oICggMzIgLSAoeCkgKSAmIC02NCApICkgKQotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRDQUxDX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRlYnVnLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE2YzczMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGRlYnVnLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRGVidWdnaW5nIGFuZCBsb2dnaW5nIGNvbXBvbmVudCAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIElNUE9SVEFOVDogQSBkZXNjcmlwdGlvbiBvZiBGcmVlVHlwZSdzIGRlYnVnZ2luZyBzdXBwb3J0IGNhbiBiZSAgICAgICAgKi8KLS8qICAgICAgICAgICAgIGZvdW5kIGluIGBkb2NzL0RFQlVHLlRYVCcuICBSZWFkIGl0IGlmIHlvdSBuZWVkIHRvIHVzZSBvciAgICovCi0vKiAgICAgICAgICAgICB1bmRlcnN0YW5kIHRoaXMgY29kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUREVCVUdfSF9fCi0jZGVmaW5lIF9fRlRERUJVR19IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyogZm9yY2UgdGhlIGRlZmluaXRpb24gb2YgRlRfREVCVUdfTEVWRUxfRVJST1IgaWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLSAgLyogaXMgYWxyZWFkeSBkZWZpbmVkOyB0aGlzIHNpbXBsaWZpZXMgdGhlIGZvbGxvd2luZyAjaWZkZWZzICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotI3VuZGVmICBGVF9ERUJVR19MRVZFTF9FUlJPUgotI2RlZmluZSBGVF9ERUJVR19MRVZFTF9FUlJPUgotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERlZmluZSB0aGUgdHJhY2UgZW51bXMgYXMgd2VsbCBhcyB0aGUgdHJhY2UgbGV2ZWxzIGFycmF5IHdoZW4gdGhleSAgICAqLwotICAvKiBhcmUgbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLQotI2RlZmluZSBGVF9UUkFDRV9ERUYoIHggKSAgdHJhY2VfICMjIHggLAotCi0gIC8qIGRlZmluaW5nIHRoZSBlbnVtZXJhdGlvbiAqLwotICB0eXBlZGVmIGVudW0gIEZUX1RyYWNlXwotICB7Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUkFDRV9ICi0gICAgdHJhY2VfY291bnQKLQotICB9IEZUX1RyYWNlOwotCi0KLSAgLyogZGVmaW5pbmcgdGhlIGFycmF5IG9mIHRyYWNlIGxldmVscywgcHJvdmlkZWQgYnkgYHNyYy9iYXNlL2Z0ZGVidWcuYycgKi8KLSAgZXh0ZXJuIGludCAgZnRfdHJhY2VfbGV2ZWxzW3RyYWNlX2NvdW50XTsKLQotI3VuZGVmIEZUX1RSQUNFX0RFRgotCi0jZW5kaWYgLyogRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lIHRoZSBGVF9UUkFDRSBtYWNybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJTVBPUlRBTlQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEVhY2ggY29tcG9uZW50IG11c3QgZGVmaW5lIHRoZSBtYWNybyBGVF9DT01QT05FTlQgdG8gYSB2YWxpZCBGVF9UcmFjZSAqLwotICAvKiB2YWx1ZSBiZWZvcmUgdXNpbmcgYW55IFRSQUNFIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLQotI2RlZmluZSBGVF9UUkFDRSggbGV2ZWwsIHZhcmZvcm1hdCApICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWYgKCBmdF90cmFjZV9sZXZlbHNbRlRfQ09NUE9ORU5UXSA+PSBsZXZlbCApIFwKLSAgICAgICAgICAgICAgRlRfTWVzc2FnZSB2YXJmb3JtYXQ7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgfSB3aGlsZSAoIDAgKQotCi0jZWxzZSAvKiAhRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotI2RlZmluZSBGVF9UUkFDRSggbGV2ZWwsIHZhcmZvcm1hdCApICBkbyB7IH0gd2hpbGUgKCAwICkgICAgICAvKiBub3RoaW5nICovCi0KLSNlbmRpZiAvKiAhRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1RyYWNlX0dldF9Db3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSB0cmFjZSBjb21wb25lbnRzLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBudW1iZXIgb2YgdHJhY2UgY29tcG9uZW50cy4gIDAgaWYgRnJlZVR5cGUgMiBpcyBub3QgYnVpbHQgd2l0aCAqLwotICAvKiAgICBGVF9ERUJVR19MRVZFTF9UUkFDRSBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gYWNjZXNzIGVsZW1lbnRzIG9mICAgICAgKi8KLSAgLyogICAgdGhlIGludGVybmFsIGBmdF90cmFjZV9sZXZlbHMnIGFycmF5IGJ5IGFuIGluZGV4LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCBGVF9JbnQgKQotICBGVF9UcmFjZV9HZXRfQ291bnQoIHZvaWQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1RyYWNlX0dldF9OYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgbmFtZSBvZiBhIHRyYWNlIGNvbXBvbmVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBpbmRleCBvZiB0aGUgdHJhY2UgY29tcG9uZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBuYW1lIG9mIHRoZSB0cmFjZSBjb21wb25lbnQuICBUaGlzIGlzIGEgc3RhdGljYWxseSBhbGxvY2F0ZWQgICAqLwotICAvKiAgICBDIHN0cmluZywgc28gZG8gbm90IGZyZWUgaXQgYWZ0ZXIgdXNlLiAgTlVMTCBpZiBGcmVlVHlwZSAyIGlzIG5vdCAgKi8KLSAgLyogICAgYnVpbHQgd2l0aCBGVF9ERUJVR19MRVZFTF9UUkFDRSBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlIEBGVF9UcmFjZV9HZXRfQ291bnQgdG8gZ2V0IHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIHRyYWNlICAgICAgICovCi0gIC8qICAgIGNvbXBvbmVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGNvbnRyb2wgRnJlZVR5cGUgMidzICAgICovCi0gIC8qICAgIGRlYnVnIGxldmVsIGluIHlvdXIgYXBwbGljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggY29uc3QgY2hhciogKQotICBGVF9UcmFjZV9HZXRfTmFtZSggRlRfSW50ICBpZHggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogWW91IG5lZWQgdHdvIG9wZW5pbmcgYW5kIGNsb3NpbmcgcGFyZW50aGVzZXMhICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBFeGFtcGxlOiBGVF9UUkFDRTAoKCAiVmFsdWUgaXMgJWkiLCBmb28gKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE91dHB1dCBvZiB0aGUgRlRfVFJBQ0VYIG1hY3JvcyBpcyBzZW50IHRvIHN0ZGVyci4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRlRfVFJBQ0UwKCB2YXJmb3JtYXQgKSAgRlRfVFJBQ0UoIDAsIHZhcmZvcm1hdCApCi0jZGVmaW5lIEZUX1RSQUNFMSggdmFyZm9ybWF0ICkgIEZUX1RSQUNFKCAxLCB2YXJmb3JtYXQgKQotI2RlZmluZSBGVF9UUkFDRTIoIHZhcmZvcm1hdCApICBGVF9UUkFDRSggMiwgdmFyZm9ybWF0ICkKLSNkZWZpbmUgRlRfVFJBQ0UzKCB2YXJmb3JtYXQgKSAgRlRfVFJBQ0UoIDMsIHZhcmZvcm1hdCApCi0jZGVmaW5lIEZUX1RSQUNFNCggdmFyZm9ybWF0ICkgIEZUX1RSQUNFKCA0LCB2YXJmb3JtYXQgKQotI2RlZmluZSBGVF9UUkFDRTUoIHZhcmZvcm1hdCApICBGVF9UUkFDRSggNSwgdmFyZm9ybWF0ICkKLSNkZWZpbmUgRlRfVFJBQ0U2KCB2YXJmb3JtYXQgKSAgRlRfVFJBQ0UoIDYsIHZhcmZvcm1hdCApCi0jZGVmaW5lIEZUX1RSQUNFNyggdmFyZm9ybWF0ICkgIEZUX1RSQUNFKCA3LCB2YXJmb3JtYXQgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgdGhlIEZUX0VSUk9SIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE91dHB1dCBvZiB0aGlzIG1hY3JvIGlzIHNlbnQgdG8gc3RkZXJyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9FUlJPUgotCi0jZGVmaW5lIEZUX0VSUk9SKCB2YXJmb3JtYXQgKSAgRlRfTWVzc2FnZSAgdmFyZm9ybWF0Ci0KLSNlbHNlICAvKiAhRlRfREVCVUdfTEVWRUxfRVJST1IgKi8KLQotI2RlZmluZSBGVF9FUlJPUiggdmFyZm9ybWF0ICkgIGRvIHsgfSB3aGlsZSAoIDAgKSAgICAgIC8qIG5vdGhpbmcgKi8KLQotI2VuZGlmIC8qICFGVF9ERUJVR19MRVZFTF9FUlJPUiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgdGhlIEZUX0FTU0VSVCBhbmQgRlRfVEhST1cgbWFjcm9zLiAgVGhlIGNhbGwgdG8gYEZUX1Rocm93JyAgICAgKi8KLSAgLyogbWFrZXMgaXQgcG9zc2libGUgdG8gZWFzaWx5IHNldCBhIGJyZWFrcG9pbnQgYXQgdGhpcyBmdW5jdGlvbi4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX0VSUk9SCi0KLSNkZWZpbmUgRlRfQVNTRVJUKCBjb25kaXRpb24gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGlmICggISggY29uZGl0aW9uICkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICBGVF9QYW5pYyggImFzc2VydGlvbiBmYWlsZWQgb24gbGluZSAlZCBvZiBmaWxlICVzXG4iLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgX19GSUxFX18gKTsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9IHdoaWxlICggMCApCi0KLSNkZWZpbmUgRlRfVEhST1coIGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggRlRfVGhyb3coIEZUX0VSUl9DQVQoIEZUX0VSUl9QUkVGSVgsIGUgKSwgICBcCi0gICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18sICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICBfX0ZJTEVfXyApICAgICAgICAgICAgICAgICAgICAgIHwgXAotICAgICAgICAgICAgRlRfRVJSX0NBVCggRlRfRVJSX1BSRUZJWCwgZSApICAgICAgICAgICAgKQotCi0jZWxzZSAvKiAhRlRfREVCVUdfTEVWRUxfRVJST1IgKi8KLQotI2RlZmluZSBGVF9BU1NFUlQoIGNvbmRpdGlvbiApICBkbyB7IH0gd2hpbGUgKCAwICkKLQotI2RlZmluZSBGVF9USFJPVyggZSApICBGVF9FUlJfQ0FUKCBGVF9FUlJfUFJFRklYLCBlICkKLQotI2VuZGlmIC8qICFGVF9ERUJVR19MRVZFTF9FUlJPUiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgYEZUX01lc3NhZ2UnIGFuZCBgRlRfUGFuaWMnIHdoZW4gbmVlZGVkLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfRVJST1IKLQotI2luY2x1ZGUgInN0ZGlvLmgiICAvKiBmb3IgdmZwcmludGYoKSAqLwotCi0gIC8qIHByaW50IGEgbWVzc2FnZSAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfTWVzc2FnZSggY29uc3QgY2hhciogIGZtdCwKLSAgICAgICAgICAgICAgLi4uICk7Ci0KLSAgLyogcHJpbnQgYSBtZXNzYWdlIGFuZCBleGl0ICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9QYW5pYyggY29uc3QgY2hhciogIGZtdCwKLSAgICAgICAgICAgIC4uLiApOwotCi0gIC8qIHJlcG9ydCBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIG9mIGFuIGVycm9yICovCi0gIEZUX0JBU0UoIGludCApCi0gIEZUX1Rocm93KCBGVF9FcnJvciAgICAgZXJyb3IsCi0gICAgICAgICAgICBpbnQgICAgICAgICAgbGluZSwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlICk7Ci0KLSNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9FUlJPUiAqLwotCi0KLSAgRlRfQkFTRSggdm9pZCApCi0gIGZ0X2RlYnVnX2luaXQoIHZvaWQgKTsKLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVERFQlVHX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRyaXZlci5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGRyaXZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjg1NmQzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRkcml2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGRyaXZlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgZm9udCBkcml2ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVERSSVZFUl9IX18KLSNkZWZpbmUgX19GVERSSVZFUl9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX01PRFVMRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfRmFjZV9Jbml0RnVuYykoIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgdHlwZWZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtZXRlcnMgKTsKLQotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9GYWNlX0RvbmVGdW5jKSggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1NpemVfSW5pdEZ1bmMpKCBGVF9TaXplICBzaXplICk7Ci0KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfU2l6ZV9Eb25lRnVuYykoIEZUX1NpemUgIHNpemUgKTsKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9TbG90X0luaXRGdW5jKSggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLSAgdHlwZWRlZiB2b2lkCi0gICgqRlRfU2xvdF9Eb25lRnVuYykoIEZUX0dseXBoU2xvdCAgc2xvdCApOwotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1NpemVfUmVxdWVzdEZ1bmMpKCBGVF9TaXplICAgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemVfUmVxdWVzdCAgcmVxICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1NpemVfU2VsZWN0RnVuYykoIEZUX1NpemUgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBzaXplX2luZGV4ICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1Nsb3RfTG9hZEZ1bmMpKCBGVF9HbHlwaFNsb3QgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemUgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICAgICBsb2FkX2ZsYWdzICk7Ci0KLQotICB0eXBlZGVmIEZUX1VJbnQKLSAgKCpGVF9DaGFyTWFwX0NoYXJJbmRleEZ1bmMpKCBGVF9DaGFyTWFwICBjaGFybWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIGNoYXJjb2RlICk7Ci0KLSAgdHlwZWRlZiBGVF9Mb25nCi0gICgqRlRfQ2hhck1hcF9DaGFyTmV4dEZ1bmMpKCBGVF9DaGFyTWFwICBjaGFybWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgY2hhcmNvZGUgKTsKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9GYWNlX0dldEtlcm5pbmdGdW5jKSggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgbGVmdF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgcmlnaHRfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGtlcm5pbmcgKTsKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9GYWNlX0F0dGFjaEZ1bmMpKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9GYWNlX0dldEFkdmFuY2VzRnVuYykoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgYWR2YW5jZXMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RyaXZlcl9DbGFzc1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmb250IGRyaXZlciBjbGFzcy4gIFRoaXMgc3RydWN0dXJlIG1vc3RseSBjb250YWlucyBwb2ludGVycyB0byAqLwotICAvKiAgICBkcml2ZXIgbWV0aG9kcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByb290ICAgICAgICAgICAgIDo6IFRoZSBwYXJlbnQgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2Vfb2JqZWN0X3NpemUgOjogVGhlIHNpemUgb2YgYSBmYWNlIG9iamVjdCBpbiBieXRlcy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZV9vYmplY3Rfc2l6ZSA6OiBUaGUgc2l6ZSBvZiBhIHNpemUgb2JqZWN0IGluIGJ5dGVzLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzbG90X29iamVjdF9zaXplIDo6IFRoZSBzaXplIG9mIGEgZ2x5cGggb2JqZWN0IGluIGJ5dGVzLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGluaXRfZmFjZSAgICAgICAgOjogVGhlIGZvcm1hdC1zcGVjaWZpYyBmYWNlIGNvbnN0cnVjdG9yLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZG9uZV9mYWNlICAgICAgICA6OiBUaGUgZm9ybWF0LXNwZWNpZmljIGZhY2UgZGVzdHJ1Y3Rvci4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpbml0X3NpemUgICAgICAgIDo6IFRoZSBmb3JtYXQtc3BlY2lmaWMgc2l6ZSBjb25zdHJ1Y3Rvci4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRvbmVfc2l6ZSAgICAgICAgOjogVGhlIGZvcm1hdC1zcGVjaWZpYyBzaXplIGRlc3RydWN0b3IuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW5pdF9zbG90ICAgICAgICA6OiBUaGUgZm9ybWF0LXNwZWNpZmljIHNsb3QgY29uc3RydWN0b3IuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkb25lX3Nsb3QgICAgICAgIDo6IFRoZSBmb3JtYXQtc3BlY2lmaWMgc2xvdCBkZXN0cnVjdG9yLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkX2dseXBoICAgICAgIDo6IEEgZnVuY3Rpb24gaGFuZGxlIHRvIGxvYWQgYSBnbHlwaCB0byBhIHNsb3QuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZpZWxkIGlzIG1hbmRhdG9yeSEgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnZXRfa2VybmluZyAgICAgIDo6IEEgZnVuY3Rpb24gaGFuZGxlIHRvIHJldHVybiB0aGUgdW5zY2FsZWQgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBrZXJuaW5nIGZvciBhIGdpdmVuIHBhaXIgb2YgZ2x5cGhzLiAgQ2FuIGJlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIDAgaWYgdGhlIGZvcm1hdCBkb2Vzbid0IHN1cHBvcnQgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5pbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGF0dGFjaF9maWxlICAgICAgOjogVGhpcyBmdW5jdGlvbiBoYW5kbGUgaXMgdXNlZCB0byByZWFkICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWwgZGF0YSBmb3IgYSBmYWNlIGZyb20gYW5vdGhlciAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBmaWxlL3N0cmVhbS4gIEZvciBleGFtcGxlLCB0aGlzIGNhbiBiZSB1c2VkIHRvICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgYWRkIGRhdGEgZnJvbSBBRk0gb3IgUEZNIGZpbGVzIG9uIGEgVHlwZSAxICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UsIG9yIGEgQ0lETWFwIG9uIGEgQ0lELWtleWVkIGZhY2UuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdldF9hZHZhbmNlcyAgICAgOjogQSBmdW5jdGlvbiBoYW5kbGUgdXNlZCB0byByZXR1cm4gYWR2YW5jZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocyBvZiBgY291bnQnIGdseXBocyAoaW4gZm9udCB1bml0cyksICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZyBhdCBgZmlyc3QnLiAgVGhlIGB2ZXJ0aWNhbCcgZmxhZyBtdXN0ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgYmUgc2V0IHRvIGdldCB2ZXJ0aWNhbCBhZHZhbmNlIGhlaWdodHMuICBUaGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGBhZHZhbmNlcycgYnVmZmVyIGlzIGNhbGxlci1hbGxvY2F0ZWQuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBUaGUgaWRlYSBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRvIGJlIGFibGUgdG8gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBkZXZpY2UtaW5kZXBlbmRlbnQgdGV4dCBsYXlvdXQgd2l0aG91dCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRpbmcgYSBzaW5nbGUgZ2x5cGggaW1hZ2UuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlcXVlc3Rfc2l6ZSAgICAgOjogQSBoYW5kbGUgdG8gYSBmdW5jdGlvbiB1c2VkIHRvIHJlcXVlc3QgdGhlIG5ldyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciBzaXplLiAgQ2FuIGJlIHNldCB0byAwIGlmIHRoZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBzY2FsaW5nIGRvbmUgaW4gdGhlIGJhc2UgbGF5ZXIgc3VmZmljZXMuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzZWxlY3Rfc2l6ZSAgICAgIDo6IEEgaGFuZGxlIHRvIGEgZnVuY3Rpb24gdXNlZCB0byBzZWxlY3QgYSBuZXcgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBmaXhlZCBzaXplLiAgSXQgaXMgdXNlZCBvbmx5IGlmICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0ZBQ0VfRkxBR19GSVhFRF9TSVpFUyBpcyBzZXQuICBDYW4gYmUgc2V0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIDAgaWYgdGhlIHNjYWxpbmcgZG9uZSBpbiB0aGUgYmFzZSBsYXllciAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBzdWZmaWNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBNb3N0IGZ1bmN0aW9uIHBvaW50ZXJzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgYGxvYWRfZ2x5cGgnLCBjYW4gYmUgKi8KLSAgLyogICAgc2V0IHRvIDAgdG8gaW5kaWNhdGUgYSBkZWZhdWx0IGJlaGF2aW91ci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfRHJpdmVyX0NsYXNzUmVjXwotICB7Ci0gICAgRlRfTW9kdWxlX0NsYXNzICAgICAgICAgIHJvb3Q7Ci0KLSAgICBGVF9Mb25nICAgICAgICAgICAgICAgICAgZmFjZV9vYmplY3Rfc2l6ZTsKLSAgICBGVF9Mb25nICAgICAgICAgICAgICAgICAgc2l6ZV9vYmplY3Rfc2l6ZTsKLSAgICBGVF9Mb25nICAgICAgICAgICAgICAgICAgc2xvdF9vYmplY3Rfc2l6ZTsKLQotICAgIEZUX0ZhY2VfSW5pdEZ1bmMgICAgICAgICBpbml0X2ZhY2U7Ci0gICAgRlRfRmFjZV9Eb25lRnVuYyAgICAgICAgIGRvbmVfZmFjZTsKLQotICAgIEZUX1NpemVfSW5pdEZ1bmMgICAgICAgICBpbml0X3NpemU7Ci0gICAgRlRfU2l6ZV9Eb25lRnVuYyAgICAgICAgIGRvbmVfc2l6ZTsKLQotICAgIEZUX1Nsb3RfSW5pdEZ1bmMgICAgICAgICBpbml0X3Nsb3Q7Ci0gICAgRlRfU2xvdF9Eb25lRnVuYyAgICAgICAgIGRvbmVfc2xvdDsKLQotICAgIEZUX1Nsb3RfTG9hZEZ1bmMgICAgICAgICBsb2FkX2dseXBoOwotCi0gICAgRlRfRmFjZV9HZXRLZXJuaW5nRnVuYyAgIGdldF9rZXJuaW5nOwotICAgIEZUX0ZhY2VfQXR0YWNoRnVuYyAgICAgICBhdHRhY2hfZmlsZTsKLSAgICBGVF9GYWNlX0dldEFkdmFuY2VzRnVuYyAgZ2V0X2FkdmFuY2VzOwotCi0gICAgLyogc2luY2UgdmVyc2lvbiAyLjIgKi8KLSAgICBGVF9TaXplX1JlcXVlc3RGdW5jICAgICAgcmVxdWVzdF9zaXplOwotICAgIEZUX1NpemVfU2VsZWN0RnVuYyAgICAgICBzZWxlY3Rfc2l6ZTsKLQotICB9IEZUX0RyaXZlcl9DbGFzc1JlYywgKkZUX0RyaXZlcl9DbGFzczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFQ0xBUkVfRFJJVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZWQgdG8gY3JlYXRlIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBhbiBGVF9Ecml2ZXJfQ2xhc3NSZWMgICAgICAqLwotICAvKiAgICBzdHJ1Y3QgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ERUZJTkVfRFJJVkVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2VkIHRvIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgRlRfRHJpdmVyX0NsYXNzUmVjIHN0cnVjdC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgZGVmaW5lZCBhIGBjcmVhdGUnIGZ1bmN0aW9uIGhhcyB0byBiZSAqLwotICAvKiAgICBjYWxsZWQgd2l0aCBhIHBvaW50ZXIgd2hlcmUgdGhlIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgaXMgcmV0dXJuZWQuICAgKi8KLSAgLyogICAgQW5kIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZCBhIGBkZXN0cm95JyBmdW5jdGlvbiBuZWVkcyB0byBiZSAgICovCi0gIC8qICAgIGNhbGxlZCB0byByZWxlYXNlIHRoYXQgYWxsb2NhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYGZjaW5pdC5jJyAoZnRfY3JlYXRlX2RlZmF1bHRfbW9kdWxlX2NsYXNzZXMpIGFscmVhZHkgY29udGFpbnMgYSAgICovCi0gIC8qICAgIG1lY2hhbmlzbSB0byBjYWxsIHRoZXNlIGZ1bmN0aW9ucyBmb3IgdGhlIGRlZmF1bHQgbW9kdWxlcyAgICAgICAgICAqLwotICAvKiAgICBkZXNjcmliZWQgaW4gYGZ0bW9kdWxlLmgnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGljZSB0aGF0IHRoZSBjcmVhdGVkIGBjcmVhdGUnIGFuZCBgZGVzdHJveScgZnVuY3Rpb25zIGNhbGwgICAgICAqLwotICAvKiAgICBgcGljX2luaXQnIGFuZCBgcGljX2ZyZWUnIHRvIGFsbG93IHlvdSB0byBtYW51YWxseSBhbGxvY2F0ZSBhbmQgICAgKi8KLSAgLyogICAgaW5pdGlhbGl6ZSBhbnkgYWRkaXRpb25hbCBnbG9iYWwgZGF0YSwgbGlrZSBhIG1vZHVsZSBzcGVjaWZpYyAgICAgICovCi0gIC8qICAgIGludGVyZmFjZSwgYW5kIHB1dCB0aGVtIGluIHRoZSBnbG9iYWwgcGljIGNvbnRhaW5lciBkZWZpbmVkIGluICAgICAqLwotICAvKiAgICBgZnRwaWMuaCcuICBJZiB5b3UgZG9uJ3QgbmVlZCB0aGVtIGp1c3QgaW1wbGVtZW50IHRoZSBmdW5jdGlvbnMgYXMgKi8KLSAgLyogICAgZW1wdHkgdG8gcmVzb2x2ZSB0aGUgbGluayBlcnJvci4gIEFsc28gdGhlIGBwaWNfaW5pdCcgYW5kICAgICAgICAgICovCi0gIC8qICAgIGBwaWNfZnJlZScgZnVuY3Rpb25zIHNob3VsZCBiZSBkZWNsYXJlZCBpbiBgcGljLmgnLCB0byBiZSByZWZlcnJlZCAqLwotICAvKiAgICBieSBkcml2ZXIgZGVmaW5pdGlvbiBjYWxsaW5nIGBGVF9ERUZJTkVfRFJJVkVSJyBpbiBmb2xsb3dpbmcuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgbm90IGRlZmluZWQgdGhlIHN0cnVjdCB3aWxsIGJlICAgICAgICAqLwotICAvKiAgICBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZSAob3IgdGhlIHNjb3BlIHdoZXJlIHRoZSBtYWNybyBpcyAgICAgKi8KLSAgLyogICAgdXNlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFQ0xBUkVfRFJJVkVSKCBjbGFzc18gKSAgXAotICBGVF9DQUxMQkFDS19UQUJMRSAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgRlRfRHJpdmVyX0NsYXNzUmVjICBjbGFzc187Ci0KLSNkZWZpbmUgRlRfREVGSU5FX0RSSVZFUiggICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmbGFnc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBuYW1lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB2ZXJzaW9uXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByZXF1aXJlc18sICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmYWNlX29iamVjdF9zaXplXywgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzaXplX29iamVjdF9zaXplXywgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzbG90X29iamVjdF9zaXplXywgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0X2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lX2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0X3NpemVfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lX3NpemVfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0X3Nsb3RfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lX3Nsb3RfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2dseXBoXywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfa2VybmluZ18sICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBhdHRhY2hfZmlsZV8sICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfYWR2YW5jZXNfLCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByZXF1ZXN0X3NpemVfLCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzZWxlY3Rfc2l6ZV8gKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgRlRfRHJpdmVyX0NsYXNzUmVjICBjbGFzc18gPSAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9ERUZJTkVfUk9PVF9NT0RVTEUoIGZsYWdzXywgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfLCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfLCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25fLCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzXywgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV8sICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfLCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9pbnRlcmZhY2VfICkgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmYWNlX29iamVjdF9zaXplXywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzaXplX29iamVjdF9zaXplXywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzbG90X29iamVjdF9zaXplXywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbml0X2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkb25lX2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbml0X3NpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkb25lX3NpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbml0X3Nsb3RfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkb25lX3Nsb3RfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsb2FkX2dseXBoXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfa2VybmluZ18sICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhdHRhY2hfZmlsZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfYWR2YW5jZXNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXF1ZXN0X3NpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzZWxlY3Rfc2l6ZV8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUNMQVJFX0RSSVZFUiggY2xhc3NfICkgIEZUX0RFQ0xBUkVfTU9EVUxFKCBjbGFzc18gKQotCi0jZGVmaW5lIEZUX0RFRklORV9EUklWRVIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZsYWdzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBuYW1lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHZlcnNpb25fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmVxdWlyZXNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZhY2Vfb2JqZWN0X3NpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2l6ZV9vYmplY3Rfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzbG90X29iamVjdF9zaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG9uZV9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0X3NpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF9zbG90XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lX3Nsb3RfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfZ2x5cGhfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X2tlcm5pbmdfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBhdHRhY2hfZmlsZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9hZHZhbmNlc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmVxdWVzdF9zaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzZWxlY3Rfc2l6ZV8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGVfQ2xhc3MqICBjbGF6eiApICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9Ecml2ZXJfQ2xhc3MgIGRjbGF6eiA9IChGVF9Ecml2ZXJfQ2xhc3MpY2xheno7ICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGFzc18gIyMgX3BpY19mcmVlKCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggZGNsYXp6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GUkVFKCBkY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9DcmVhdGVfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgIGxpYnJhcnksICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGVfQ2xhc3MqKiAgb3V0cHV0X2NsYXNzICkgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0RyaXZlcl9DbGFzcyAgY2xhenogID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggKmNsYXp6ICkgKSApICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlcnJvciA9IGNsYXNzXyAjIyBfcGljX2luaXQoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggZXJyb3IgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0RFRklORV9ST09UX01PRFVMRSggZmxhZ3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9pbnRlcmZhY2VfICkgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmZhY2Vfb2JqZWN0X3NpemUgPSBmYWNlX29iamVjdF9zaXplXzsgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+c2l6ZV9vYmplY3Rfc2l6ZSA9IHNpemVfb2JqZWN0X3NpemVfOyAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5zbG90X29iamVjdF9zaXplID0gc2xvdF9vYmplY3Rfc2l6ZV87ICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+aW5pdF9mYWNlICAgICAgICA9IGluaXRfZmFjZV87ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5kb25lX2ZhY2UgICAgICAgID0gZG9uZV9mYWNlXzsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+aW5pdF9zaXplICAgICAgICA9IGluaXRfc2l6ZV87ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5kb25lX3NpemUgICAgICAgID0gZG9uZV9zaXplXzsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+aW5pdF9zbG90ICAgICAgICA9IGluaXRfc2xvdF87ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5kb25lX3Nsb3QgICAgICAgID0gZG9uZV9zbG90XzsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9nbHlwaCAgICAgICA9IGxvYWRfZ2x5cGhfOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9rZXJuaW5nICAgICAgPSBnZXRfa2VybmluZ187ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+YXR0YWNoX2ZpbGUgICAgICA9IGF0dGFjaF9maWxlXzsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfYWR2YW5jZXMgICAgID0gZ2V0X2FkdmFuY2VzXzsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cmVxdWVzdF9zaXplICAgICA9IHJlcXVlc3Rfc2l6ZV87ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5zZWxlY3Rfc2l6ZSAgICAgID0gc2VsZWN0X3NpemVfOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqb3V0cHV0X2NsYXNzID0gKEZUX01vZHVsZV9DbGFzcyopY2xheno7ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZURFJJVkVSX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGdsb2Fkci5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdGdsb2Fkci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzBkZDcwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRnbG9hZHIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGdsb2Fkci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIGdseXBoIGxvYWRlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZyAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVEdMT0FEUl9IX18KLSNkZWZpbmUgX19GVEdMT0FEUl9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dseXBoTG9hZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBnbHlwaCBsb2FkZXIgaXMgYW4gaW50ZXJuYWwgb2JqZWN0IHVzZWQgdG8gbG9hZCBzZXZlcmFsIGdseXBocyAqLwotICAvKiAgICB0b2dldGhlciAoZm9yIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIGNvbXBvc2l0ZXMpLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZ2x5cGggbG9hZGVyIGltcGxlbWVudGF0aW9uIGlzIG5vdCBwYXJ0IG9mIHRoZSBoaWdoLWxldmVsIEFQSSwgKi8KLSAgLyogICAgaGVuY2UgdGhlIGZvcndhcmQgc3RydWN0dXJlIGRlY2xhcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBGVF9HbHlwaExvYWRlclJlY18qICBGVF9HbHlwaExvYWRlciA7Ci0KLQotI2lmIDAgIC8qIG1vdmVkIHRvIGZyZWV0eXBlLmggaW4gdmVyc2lvbiAyLjIgKi8KLSNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19BUkdTX0FSRV9XT1JEUyAgICAgICAgICAxCi0jZGVmaW5lIEZUX1NVQkdMWVBIX0ZMQUdfQVJHU19BUkVfWFlfVkFMVUVTICAgICAgMgotI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHX1JPVU5EX1hZX1RPX0dSSUQgICAgICAgIDQKLSNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19TQ0FMRSAgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIEZUX1NVQkdMWVBIX0ZMQUdfWFlfU0NBTEUgICAgICAgICAgICAgMHg0MAotI2RlZmluZSBGVF9TVUJHTFlQSF9GTEFHXzJYMiAgICAgICAgICAgICAgICAgIDB4ODAKLSNkZWZpbmUgRlRfU1VCR0xZUEhfRkxBR19VU0VfTVlfTUVUUklDUyAgICAgIDB4MjAwCi0jZW5kaWYKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9TdWJHbHlwaFJlY18KLSAgewotICAgIEZUX0ludCAgICAgaW5kZXg7Ci0gICAgRlRfVVNob3J0ICBmbGFnczsKLSAgICBGVF9JbnQgICAgIGFyZzE7Ci0gICAgRlRfSW50ICAgICBhcmcyOwotICAgIEZUX01hdHJpeCAgdHJhbnNmb3JtOwotCi0gIH0gRlRfU3ViR2x5cGhSZWM7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgRlRfR2x5cGhMb2FkUmVjXwotICB7Ci0gICAgRlRfT3V0bGluZSAgIG91dGxpbmU7ICAgICAgIC8qIG91dGxpbmUgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9WZWN0b3IqICAgZXh0cmFfcG9pbnRzOyAgLyogZXh0cmEgcG9pbnRzIHRhYmxlICAgICAgICAqLwotICAgIEZUX1ZlY3RvciogICBleHRyYV9wb2ludHMyOyAvKiBzZWNvbmQgZXh0cmEgcG9pbnRzIHRhYmxlICovCi0gICAgRlRfVUludCAgICAgIG51bV9zdWJnbHlwaHM7IC8qIG51bWJlciBvZiBzdWJnbHlwaHMgICAgICAgKi8KLSAgICBGVF9TdWJHbHlwaCAgc3ViZ2x5cGhzOyAgICAgLyogc3ViZ2x5cGhzICAgICAgICAgICAgICAgICAqLwotCi0gIH0gRlRfR2x5cGhMb2FkUmVjLCAqRlRfR2x5cGhMb2FkOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0dseXBoTG9hZGVyUmVjXwotICB7Ci0gICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnk7Ci0gICAgRlRfVUludCAgICAgICAgICBtYXhfcG9pbnRzOwotICAgIEZUX1VJbnQgICAgICAgICAgbWF4X2NvbnRvdXJzOwotICAgIEZUX1VJbnQgICAgICAgICAgbWF4X3N1YmdseXBoczsKLSAgICBGVF9Cb29sICAgICAgICAgIHVzZV9leHRyYTsKLQotICAgIEZUX0dseXBoTG9hZFJlYyAgYmFzZTsKLSAgICBGVF9HbHlwaExvYWRSZWMgIGN1cnJlbnQ7Ci0KLSAgICB2b2lkKiAgICAgICAgICAgIG90aGVyOyAgICAgICAgICAgIC8qIGZvciBwb3NzaWJsZSBmdXR1cmUgZXh0ZW5zaW9uPyAqLwotCi0gIH0gRlRfR2x5cGhMb2FkZXJSZWM7Ci0KLQotICAvKiBjcmVhdGUgbmV3IGVtcHR5IGdseXBoIGxvYWRlciAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX0dseXBoTG9hZGVyX05ldyggRlRfTWVtb3J5ICAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhMb2FkZXIgICphbG9hZGVyICk7Ci0KLSAgLyogYWRkIGFuIGV4dHJhIHBvaW50cyB0YWJsZSB0byBhIGdseXBoIGxvYWRlciAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX0dseXBoTG9hZGVyX0NyZWF0ZUV4dHJhKCBGVF9HbHlwaExvYWRlciAgbG9hZGVyICk7Ci0KLSAgLyogZGVzdHJveSBhIGdseXBoIGxvYWRlciAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfR2x5cGhMb2FkZXJfRG9uZSggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciApOwotCi0gIC8qIHJlc2V0IGEgZ2x5cGggbG9hZGVyIChmcmVlcyBldmVyeXRoaW5nIGludCBpdCkgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX0dseXBoTG9hZGVyX1Jlc2V0KCBGVF9HbHlwaExvYWRlciAgbG9hZGVyICk7Ci0KLSAgLyogcmV3aW5kIGEgZ2x5cGggbG9hZGVyICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9HbHlwaExvYWRlcl9SZXdpbmQoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgKTsKLQotICAvKiBjaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBzcGFjZSB0byBhZGQgYG5fcG9pbnRzJyBhbmQgYG5fY29udG91cnMnICovCi0gIC8qIHRvIHRoZSBnbHlwaCBsb2FkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9HbHlwaExvYWRlcl9DaGVja1BvaW50cyggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBuX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBuX2NvbnRvdXJzICk7Ci0KLQotI2RlZmluZSBGVF9HTFlQSExPQURFUl9DSEVDS19QKCBfbG9hZGVyLCBfY291bnQgKSAgICAgICBcCi0gICggKF9jb3VudCkgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFwKLSAgICAoIChGVF9VSW50KShfbG9hZGVyKS0+YmFzZS5vdXRsaW5lLm5fcG9pbnRzICAgICsgICAgXAotICAgICAgKEZUX1VJbnQpKF9sb2FkZXIpLT5jdXJyZW50Lm91dGxpbmUubl9wb2ludHMgKyAgICBcCi0gICAgICAoRlRfVUludCkoX2NvdW50KSApIDw9IChfbG9hZGVyKS0+bWF4X3BvaW50cyAgICkKLQotI2RlZmluZSBGVF9HTFlQSExPQURFUl9DSEVDS19DKCBfbG9hZGVyLCBfY291bnQgKSAgICAgICAgIFwKLSAgKCAoX2NvdW50KSA9PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBcCi0gICAgKCAoRlRfVUludCkoX2xvYWRlciktPmJhc2Uub3V0bGluZS5uX2NvbnRvdXJzICAgICsgICAgXAotICAgICAgKEZUX1VJbnQpKF9sb2FkZXIpLT5jdXJyZW50Lm91dGxpbmUubl9jb250b3VycyArICAgIFwKLSAgICAgIChGVF9VSW50KShfY291bnQpICkgPD0gKF9sb2FkZXIpLT5tYXhfY29udG91cnMgICApCi0KLSNkZWZpbmUgRlRfR0xZUEhMT0FERVJfQ0hFQ0tfUE9JTlRTKCBfbG9hZGVyLCBfcG9pbnRzLCBfY29udG91cnMgKSBcCi0gICggKCBGVF9HTFlQSExPQURFUl9DSEVDS19QKCBfbG9hZGVyLCBfcG9pbnRzICkgICAmJiAgICAgICAgICAgICAgXAotICAgICAgRlRfR0xZUEhMT0FERVJfQ0hFQ0tfQyggX2xvYWRlciwgX2NvbnRvdXJzICkgKSAgICAgICAgICAgICAgIFwKLSAgICA/IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgOiBGVF9HbHlwaExvYWRlcl9DaGVja1BvaW50cyggKF9sb2FkZXIpLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KShfcG9pbnRzKSwgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludCkoX2NvbnRvdXJzKSApICkKLQotCi0gIC8qIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIGFkZCBgbl9zdWJzJyBzdWItZ2x5cGhzIHRvICovCi0gIC8qIGEgZ2x5cGggbG9hZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhMb2FkZXJfQ2hlY2tTdWJHbHlwaHMoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgbl9zdWJzICk7Ci0KLSAgLyogcHJlcGFyZSBhIGdseXBoIGxvYWRlciwgaS5lLiBlbXB0eSB0aGUgY3VycmVudCBnbHlwaCAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfR2x5cGhMb2FkZXJfUHJlcGFyZSggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciApOwotCi0gIC8qIGFkZCB0aGUgY3VycmVudCBnbHlwaCB0byB0aGUgYmFzZSBnbHlwaCAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfR2x5cGhMb2FkZXJfQWRkKCBGVF9HbHlwaExvYWRlciAgbG9hZGVyICk7Ci0KLSAgLyogY29weSBwb2ludHMgZnJvbSBvbmUgZ2x5cGggbG9hZGVyIHRvIGFub3RoZXIgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9HbHlwaExvYWRlcl9Db3B5UG9pbnRzKCBGVF9HbHlwaExvYWRlciAgdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaExvYWRlciAgc291cmNlICk7Ci0KLSAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRHTE9BRFJfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0bWVtb3J5LmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0bWVtb3J5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYzU1M2IuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0bWVtb3J5LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgbWVtb3J5IG1hbmFnZW1lbnQgbWFjcm9zIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUTUVNT1JZX0hfXwotI2RlZmluZSBfX0ZUTUVNT1JZX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICi0jaW5jbHVkZSBGVF9UWVBFU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TRVRfRVJST1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gc2V0IGFuIGltcGxpY2l0IGBlcnJvcicgdmFyaWFibGUgdG8gYSBnaXZlbiAgKi8KLSAgLyogICAgZXhwcmVzc2lvbidzIHZhbHVlICh1c3VhbGx5IGEgZnVuY3Rpb24gY2FsbCksIGFuZCBjb252ZXJ0IGl0IHRvIGEgICovCi0gIC8qICAgIGJvb2xlYW4gd2hpY2ggaXMgc2V0IHdoZW5ldmVyIHRoZSB2YWx1ZSBpcyAhPSAwLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfU0VUX0VSUk9SCi0jZGVmaW5lIEZUX1NFVF9FUlJPUiggZXhwcmVzc2lvbiApIFwKLSAgICAgICAgICAoICggZXJyb3IgPSAoZXhwcmVzc2lvbikgKSAhPSAwICkKLQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgIE0gRSBNIE8gUiBZICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoKLSAgICogIEMrKyByZWZ1c2VzIHRvIGhhbmRsZSBzdGF0ZW1lbnRzIGxpa2UgcCA9ICh2b2lkKilhbnl0aGluZywgd2l0aCBgcCcgYQotICAgKiAgdHlwZWQgcG9pbnRlci4gIFNpbmNlIHdlIGRvbid0IGhhdmUgYSBgdHlwZW9mJyBvcGVyYXRvciBpbiBzdGFuZGFyZAotICAgKiAgQysrLCB3ZSBoYXZlIHRvIHVzZSBhIHRlbXBsYXRlIHRvIGVtdWxhdGUgaXQuCi0gICAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotICBleHRlcm4gIkMrKyIKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGlubGluZSBUKgotICBjcGx1c3BsdXNfdHlwZW9mKCAgICAgICAgVCosCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgICp2ICkKLSAgewotICAgIHJldHVybiBzdGF0aWNfY2FzdCA8VCo+ICggdiApOwotICB9Ci0KLSNkZWZpbmUgRlRfQVNTSUdOUCggcCwgdmFsICkgIChwKSA9IGNwbHVzcGx1c190eXBlb2YoIChwKSwgKHZhbCkgKQotCi0jZWxzZQotCi0jZGVmaW5lIEZUX0FTU0lHTlAoIHAsIHZhbCApICAocCkgPSAodmFsKQotCi0jZW5kaWYKLQotCi0KLSNpZmRlZiBGVF9ERUJVR19NRU1PUlkKLQotICBGVF9CQVNFKCBjb25zdCBjaGFyKiApICBfZnRfZGVidWdfZmlsZTsKLSAgRlRfQkFTRSggbG9uZyApICAgICAgICAgX2Z0X2RlYnVnX2xpbmVubzsKLQotI2RlZmluZSBGVF9ERUJVR19JTk5FUiggZXhwICkgICggX2Z0X2RlYnVnX2ZpbGUgICA9IF9fRklMRV9fLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZnRfZGVidWdfbGluZW5vID0gX19MSU5FX18sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHApICkKLQotI2RlZmluZSBGVF9BU1NJR05QX0lOTkVSKCBwLCBleHAgKSAgKCBfZnRfZGVidWdfZmlsZSAgID0gX19GSUxFX18sIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Z0X2RlYnVnX2xpbmVubyA9IF9fTElORV9fLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0FTU0lHTlAoIHAsIGV4cCApICkKLQotI2Vsc2UgLyogIUZUX0RFQlVHX01FTU9SWSAqLwotCi0jZGVmaW5lIEZUX0RFQlVHX0lOTkVSKCBleHAgKSAgICAgICAoZXhwKQotI2RlZmluZSBGVF9BU1NJR05QX0lOTkVSKCBwLCBleHAgKSAgRlRfQVNTSUdOUCggcCwgZXhwICkKLQotI2VuZGlmIC8qICFGVF9ERUJVR19NRU1PUlkgKi8KLQotCi0gIC8qCi0gICAqICBUaGUgYWxsb2NhdGlvbiBmdW5jdGlvbnMgcmV0dXJuIGEgcG9pbnRlciwgYW5kIHRoZSBlcnJvciBjb2RlCi0gICAqICBpcyB3cml0dGVuIHRvIHRocm91Z2ggdGhlIGBwX2Vycm9yJyBwYXJhbWV0ZXIuICBTZWUgYmVsb3cgZm9yCi0gICAqICBmb3IgZG9jdW1lbnRhdGlvbi4KLSAgICovCi0KLSAgRlRfQkFTRSggRlRfUG9pbnRlciApCi0gIGZ0X21lbV9hbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgICAgRlRfTG9uZyAgICBzaXplLAotICAgICAgICAgICAgICAgIEZUX0Vycm9yICAqcF9lcnJvciApOwotCi0gIEZUX0JBU0UoIEZUX1BvaW50ZXIgKQotICBmdF9tZW1fcWFsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBzaXplLAotICAgICAgICAgICAgICAgICBGVF9FcnJvciAgKnBfZXJyb3IgKTsKLQotICBGVF9CQVNFKCBGVF9Qb2ludGVyICkKLSAgZnRfbWVtX3JlYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBpdGVtX3NpemUsCi0gICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIGN1cl9jb3VudCwKLSAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgbmV3X2NvdW50LAotICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jaywKLSAgICAgICAgICAgICAgICAgIEZUX0Vycm9yICAqcF9lcnJvciApOwotCi0gIEZUX0JBU0UoIEZUX1BvaW50ZXIgKQotICBmdF9tZW1fcXJlYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgaXRlbV9zaXplLAotICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgY3VyX2NvdW50LAotICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgbmV3X2NvdW50LAotICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgRlRfRXJyb3IgICpwX2Vycm9yICk7Ci0KLSAgRlRfQkFTRSggdm9pZCApCi0gIGZ0X21lbV9mcmVlKCBGVF9NZW1vcnkgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogIFAgKTsKLQotCi0jZGVmaW5lIEZUX01FTV9BTExPQyggcHRyLCBzaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0FTU0lHTlBfSU5ORVIoIHB0ciwgZnRfbWVtX2FsbG9jKCBtZW1vcnksICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKHNpemUpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciApICkKLQotI2RlZmluZSBGVF9NRU1fRlJFRSggcHRyICkgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZnRfbWVtX2ZyZWUoIG1lbW9yeSwgKHB0cikgKTsgXAotICAgICAgICAgICAgKHB0cikgPSBOVUxMOyAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0VORF9TVE1OVAotCi0jZGVmaW5lIEZUX01FTV9ORVcoIHB0ciApICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9BTExPQyggcHRyLCBzaXplb2YgKCAqKHB0cikgKSApCi0KLSNkZWZpbmUgRlRfTUVNX1JFQUxMT0MoIHB0ciwgY3Vyc3osIG5ld3N6ICkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fcmVhbGxvYyggbWVtb3J5LCAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykoY3Vyc3opLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKG5ld3N6KSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIpLCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IgKSApCi0KLSNkZWZpbmUgRlRfTUVNX1FBTExPQyggcHRyLCBzaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0FTU0lHTlBfSU5ORVIoIHB0ciwgZnRfbWVtX3FhbGxvYyggbWVtb3J5LCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykoc2l6ZSksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciApICkKLQotI2RlZmluZSBGVF9NRU1fUU5FVyggcHRyICkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1FBTExPQyggcHRyLCBzaXplb2YgKCAqKHB0cikgKSApCi0KLSNkZWZpbmUgRlRfTUVNX1FSRUFMTE9DKCBwdHIsIGN1cnN6LCBuZXdzeiApICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0FTU0lHTlBfSU5ORVIoIHB0ciwgZnRfbWVtX3FyZWFsbG9jKCBtZW1vcnksICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKGN1cnN6KSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykobmV3c3opLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIpLCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICkgKQotCi0jZGVmaW5lIEZUX01FTV9BTExPQ19NVUxUKCBwdHIsIGNvdW50LCBpdGVtX3NpemUgKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9BU1NJR05QX0lOTkVSKCBwdHIsIGZ0X21lbV9yZWFsbG9jKCBtZW1vcnksICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShpdGVtX3NpemUpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykoY291bnQpLCAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICkgKQotCi0jZGVmaW5lIEZUX01FTV9SRUFMTE9DX01VTFQoIHB0ciwgb2xkY250LCBuZXdjbnQsIGl0bXN6ICkgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9BU1NJR05QX0lOTkVSKCBwdHIsIGZ0X21lbV9yZWFsbG9jKCBtZW1vcnksICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShpdG1zeiksICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKG9sZGNudCksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykobmV3Y250KSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIpLCAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICkgKQotCi0jZGVmaW5lIEZUX01FTV9RQUxMT0NfTVVMVCggcHRyLCBjb3VudCwgaXRlbV9zaXplICkgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fcXJlYWxsb2MoIG1lbW9yeSwgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShpdGVtX3NpemUpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShjb3VudCksICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciApICkKLQotI2RlZmluZSBGVF9NRU1fUVJFQUxMT0NfTVVMVCggcHRyLCBvbGRjbnQsIG5ld2NudCwgaXRtc3opICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0FTU0lHTlBfSU5ORVIoIHB0ciwgZnRfbWVtX3FyZWFsbG9jKCBtZW1vcnksICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykoaXRtc3opLCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykob2xkY250KSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykobmV3Y250KSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyKSwgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IgKSApCi0KLQotI2RlZmluZSBGVF9NRU1fU0VUX0VSUk9SKCBjb25kICkgICggKGNvbmQpLCBlcnJvciAhPSAwICkKLQotCi0jZGVmaW5lIEZUX01FTV9TRVQoIGRlc3QsIGJ5dGUsIGNvdW50ICkgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZnRfbWVtc2V0KCBkZXN0LCBieXRlLCAoRlRfT2Zmc2V0KShjb3VudCkgKQotCi0jZGVmaW5lIEZUX01FTV9DT1BZKCBkZXN0LCBzb3VyY2UsIGNvdW50ICkgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmdF9tZW1jcHkoIGRlc3QsIHNvdXJjZSwgKEZUX09mZnNldCkoY291bnQpICkKLQotI2RlZmluZSBGVF9NRU1fTU9WRSggZGVzdCwgc291cmNlLCBjb3VudCApICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZ0X21lbW1vdmUoIGRlc3QsIHNvdXJjZSwgKEZUX09mZnNldCkoY291bnQpICkKLQotCi0jZGVmaW5lIEZUX01FTV9aRVJPKCBkZXN0LCBjb3VudCApICBGVF9NRU1fU0VUKCBkZXN0LCAwLCBjb3VudCApCi0KLSNkZWZpbmUgRlRfWkVSTyggcCApICAgICAgICAgICAgICAgIEZUX01FTV9aRVJPKCBwLCBzaXplb2YgKCAqKHApICkgKQotCi0KLSNkZWZpbmUgRlRfQVJSQVlfWkVSTyggZGVzdCwgY291bnQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9aRVJPKCBkZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgIChGVF9PZmZzZXQpKGNvdW50KSAqIHNpemVvZiAoICooZGVzdCkgKSApCi0KLSNkZWZpbmUgRlRfQVJSQVlfQ09QWSggZGVzdCwgc291cmNlLCBjb3VudCApICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9DT1BZKCBkZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgKEZUX09mZnNldCkoY291bnQpICogc2l6ZW9mICggKihkZXN0KSApICkKLQotI2RlZmluZSBGVF9BUlJBWV9NT1ZFKCBkZXN0LCBzb3VyY2UsIGNvdW50ICkgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX01PVkUoIGRlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAoRlRfT2Zmc2V0KShjb3VudCkgKiBzaXplb2YgKCAqKGRlc3QpICkgKQotCi0KLSAgLyoKLSAgICogIFJldHVybiB0aGUgbWF4aW11bSBudW1iZXIgb2YgYWRkcmVzc2FibGUgZWxlbWVudHMgaW4gYW4gYXJyYXkuCi0gICAqICBXZSBsaW1pdCBvdXJzZWx2ZXMgdG8gSU5UX01BWCwgcmF0aGVyIHRoYW4gVUlOVF9NQVgsIHRvIGF2b2lkCi0gICAqICBhbnkgcHJvYmxlbXMuCi0gICAqLwotI2RlZmluZSBGVF9BUlJBWV9NQVgoIHB0ciApICAgICAgICAgICAoIEZUX0lOVF9NQVggLyBzaXplb2YgKCAqKHB0cikgKSApCi0KLSNkZWZpbmUgRlRfQVJSQVlfQ0hFQ0soIHB0ciwgY291bnQgKSAgKCAoY291bnQpIDw9IEZUX0FSUkFZX01BWCggcHRyICkgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBtYWNyb3MgZXhwZWN0IHRoYXQgdGhlaXIgcG9pbnRlciBhcmd1bWVudCBpcyAgKi8KLSAgLyogX3R5cGVkXyBpbiBvcmRlciB0byBhdXRvbWF0aWNhbGx5IGNvbXB1dGUgYXJyYXkgZWxlbWVudCBzaXplcy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIEZUX01FTV9ORVdfQVJSQVkoIHB0ciwgY291bnQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9BU1NJR05QX0lOTkVSKCBwdHIsIGZ0X21lbV9yZWFsbG9jKCBtZW1vcnksICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoICoocHRyKSApLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykoY291bnQpLCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICkgKQotCi0jZGVmaW5lIEZUX01FTV9SRU5FV19BUlJBWSggcHRyLCBjdXJzeiwgbmV3c3ogKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9BU1NJR05QX0lOTkVSKCBwdHIsIGZ0X21lbV9yZWFsbG9jKCBtZW1vcnksICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoICoocHRyKSApLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpKGN1cnN6KSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykobmV3c3opLCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHIpLCAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICkgKQotCi0jZGVmaW5lIEZUX01FTV9RTkVXX0FSUkFZKCBwdHIsIGNvdW50ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfQVNTSUdOUF9JTk5FUiggcHRyLCBmdF9tZW1fcXJlYWxsb2MoIG1lbW9yeSwgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoICoocHRyKSApLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKShjb3VudCksICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciApICkKLQotI2RlZmluZSBGVF9NRU1fUVJFTkVXX0FSUkFZKCBwdHIsIGN1cnN6LCBuZXdzeiApICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0FTU0lHTlBfSU5ORVIoIHB0ciwgZnRfbWVtX3FyZWFsbG9jKCBtZW1vcnksICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCAqKHB0cikgKSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykoY3Vyc3opLCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykobmV3c3opLCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRyKSwgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IgKSApCi0KLSNkZWZpbmUgRlRfQUxMT0MoIHB0ciwgc2l6ZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9BTExPQyggcHRyLCBzaXplICkgKQotCi0jZGVmaW5lIEZUX1JFQUxMT0MoIHB0ciwgY3Vyc3osIG5ld3N6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX1JFQUxMT0MoIHB0ciwgY3Vyc3osIG5ld3N6ICkgKQotCi0jZGVmaW5lIEZUX0FMTE9DX01VTFQoIHB0ciwgY291bnQsIGl0ZW1fc2l6ZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9BTExPQ19NVUxUKCBwdHIsIGNvdW50LCBpdGVtX3NpemUgKSApCi0KLSNkZWZpbmUgRlRfUkVBTExPQ19NVUxUKCBwdHIsIG9sZGNudCwgbmV3Y250LCBpdG1zeiApICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX1JFQUxMT0NfTVVMVCggcHRyLCBvbGRjbnQsICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2NudCwgaXRtc3ogKSApCi0KLSNkZWZpbmUgRlRfUUFMTE9DKCBwdHIsIHNpemUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fUUFMTE9DKCBwdHIsIHNpemUgKSApCi0KLSNkZWZpbmUgRlRfUVJFQUxMT0MoIHB0ciwgY3Vyc3osIG5ld3N6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX1FSRUFMTE9DKCBwdHIsIGN1cnN6LCBuZXdzeiApICkKLQotI2RlZmluZSBGVF9RQUxMT0NfTVVMVCggcHRyLCBjb3VudCwgaXRlbV9zaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX1FBTExPQ19NVUxUKCBwdHIsIGNvdW50LCBpdGVtX3NpemUgKSApCi0KLSNkZWZpbmUgRlRfUVJFQUxMT0NfTVVMVCggcHRyLCBvbGRjbnQsIG5ld2NudCwgaXRtc3ogKSAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9RUkVBTExPQ19NVUxUKCBwdHIsIG9sZGNudCwgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2NudCwgaXRtc3ogKSApCi0KLSNkZWZpbmUgRlRfRlJFRSggcHRyICkgIEZUX01FTV9GUkVFKCBwdHIgKQotCi0jZGVmaW5lIEZUX05FVyggcHRyICkgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9ORVcoIHB0ciApICkKLQotI2RlZmluZSBGVF9ORVdfQVJSQVkoIHB0ciwgY291bnQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fTkVXX0FSUkFZKCBwdHIsIGNvdW50ICkgKQotCi0jZGVmaW5lIEZUX1JFTkVXX0FSUkFZKCBwdHIsIGN1cmNudCwgbmV3Y250ICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX1JFTkVXX0FSUkFZKCBwdHIsIGN1cmNudCwgbmV3Y250ICkgKQotCi0jZGVmaW5lIEZUX1FORVcoIHB0ciApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9RTkVXKCBwdHIgKSApCi0KLSNkZWZpbmUgRlRfUU5FV19BUlJBWSggcHRyLCBjb3VudCApICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfTUVNX1NFVF9FUlJPUiggRlRfTUVNX05FV19BUlJBWSggcHRyLCBjb3VudCApICkKLQotI2RlZmluZSBGVF9RUkVORVdfQVJSQVkoIHB0ciwgY3VyY250LCBuZXdjbnQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9SRU5FV19BUlJBWSggcHRyLCBjdXJjbnQsIG5ld2NudCApICkKLQotCi0gIEZUX0JBU0UoIEZUX1BvaW50ZXIgKQotICBmdF9tZW1fc3RyZHVwKCBGVF9NZW1vcnkgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgc3RyLAotICAgICAgICAgICAgICAgICBGVF9FcnJvciAgICAqcF9lcnJvciApOwotCi0gIEZUX0JBU0UoIEZUX1BvaW50ZXIgKQotICBmdF9tZW1fZHVwKCBGVF9NZW1vcnkgICAgbWVtb3J5LAotICAgICAgICAgICAgICBjb25zdCB2b2lkKiAgYWRkcmVzcywKLSAgICAgICAgICAgICAgRlRfVUxvbmcgICAgIHNpemUsCi0gICAgICAgICAgICAgIEZUX0Vycm9yICAgICpwX2Vycm9yICk7Ci0KLQotI2RlZmluZSBGVF9NRU1fU1RSRFVQKCBkc3QsIHN0ciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKGRzdCkgPSAoY2hhciopZnRfbWVtX3N0cmR1cCggbWVtb3J5LCAoY29uc3QgY2hhciopKHN0ciksICZlcnJvciApCi0KLSNkZWZpbmUgRlRfU1RSRFVQKCBkc3QsIHN0ciApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX01FTV9TRVRfRVJST1IoIEZUX01FTV9TVFJEVVAoIGRzdCwgc3RyICkgKQotCi0jZGVmaW5lIEZUX01FTV9EVVAoIGRzdCwgYWRkcmVzcywgc2l6ZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIChkc3QpID0gZnRfbWVtX2R1cCggbWVtb3J5LCAoYWRkcmVzcyksIChGVF9VTG9uZykoc2l6ZSksICZlcnJvciApCi0KLSNkZWZpbmUgRlRfRFVQKCBkc3QsIGFkZHJlc3MsIHNpemUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9NRU1fU0VUX0VSUk9SKCBGVF9NRU1fRFVQKCBkc3QsIGFkZHJlc3MsIHNpemUgKSApCi0KLQotICAvKiBSZXR1cm4gPj0gMSBpZiBhIHRydW5jYXRpb24gb2NjdXJzLiAgICAgICAgICAgICovCi0gIC8qIFJldHVybiAwIGlmIHRoZSBzb3VyY2Ugc3RyaW5nIGZpdHMgdGhlIGJ1ZmZlci4gKi8KLSAgLyogVGhpcyBpcyAqbm90KiB0aGUgc2FtZSBhcyBzdHJsY3B5KCkuICAgICAgICAgICAqLwotICBGVF9CQVNFKCBGVF9JbnQgKQotICBmdF9tZW1fc3RyY3B5biggY2hhciogICAgICAgIGRzdCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBzcmMsCi0gICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgc2l6ZSApOwotCi0jZGVmaW5lIEZUX1NUUkNQWU4oIGRzdCwgc3JjLCBzaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmdF9tZW1fc3RyY3B5biggKGNoYXIqKWRzdCwgKGNvbnN0IGNoYXIqKShzcmMpLCAoRlRfVUxvbmcpKHNpemUpICkKLQotIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVE1FTU9SWV9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTU1ODJkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRvYmpzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0b2Jqcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcHJpdmF0ZSBiYXNlIGNsYXNzZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgYWxsIGludGVybmFsIEZyZWVUeXBlIGNsYXNzZXMuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUT0JKU19IX18KLSNkZWZpbmUgX19GVE9CSlNfSF9fCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfUkVOREVSX0gKLSNpbmNsdWRlIEZUX1NJWkVTX0gKLSNpbmNsdWRlIEZUX0xDRF9GSUxURVJfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfTUVNT1JZX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0dMWVBIX0xPQURFUl9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9EUklWRVJfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfQVVUT0hJTlRfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QSUNfSAotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotI2luY2x1ZGUgRlRfSU5DUkVNRU5UQUxfSAotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNvbWUgZ2VuZXJpYyBkZWZpbml0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZm5kZWYgVFJVRQotI2RlZmluZSBUUlVFICAxCi0jZW5kaWYKLQotI2lmbmRlZiBGQUxTRQotI2RlZmluZSBGQUxTRSAgMAotI2VuZGlmCi0KLSNpZm5kZWYgTlVMTAotI2RlZmluZSBOVUxMICAodm9pZCopMAotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtaW4gYW5kIG1heCBmdW5jdGlvbnMgbWlzc2luZyBpbiBDLiAgQXMgdXN1YWwsIGJlIGNhcmVmdWwgbm90IHRvICAqLwotICAvKiB3cml0ZSB0aGluZ3MgbGlrZSBGVF9NSU4oIGErKywgYisrICkgdG8gYXZvaWQgc2lkZSBlZmZlY3RzLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX01JTiggYSwgYiApICAoIChhKSA8IChiKSA/IChhKSA6IChiKSApCi0jZGVmaW5lIEZUX01BWCggYSwgYiApICAoIChhKSA+IChiKSA/IChhKSA6IChiKSApCi0KLSNkZWZpbmUgRlRfQUJTKCBhICkgICAgICggKGEpIDwgMCA/IC0oYSkgOiAoYSkgKQotCi0gIC8qCi0gICAqICBBcHByb3hpbWF0ZSBzcXJ0KHgqeCt5KnkpIHVzaW5nIHRoZSBgYWxwaGEgbWF4IHBsdXMgYmV0YSBtaW4nCi0gICAqICBhbGdvcml0aG0uICBXZSB1c2UgYWxwaGEgPSAxLCBiZXRhID0gMy84LCBnaXZpbmcgdXMgcmVzdWx0cyB3aXRoIGEKLSAgICogIGxhcmdlc3QgZXJyb3IgbGVzcyB0aGFuIDclIGNvbXBhcmVkIHRvIHRoZSBleGFjdCB2YWx1ZS4KLSAgICovCi0jZGVmaW5lIEZUX0hZUE9UKCB4LCB5ICkgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIHggPSBGVF9BQlMoIHggKSwgICAgICAgICAgICAgXAotICAgICAgICAgICAgeSA9IEZUX0FCUyggeSApLCAgICAgICAgICAgICBcCi0gICAgICAgICAgICB4ID4geSA/IHggKyAoIDMgKiB5ID4+IDMgKSAgIFwKLSAgICAgICAgICAgICAgICAgIDogeSArICggMyAqIHggPj4gMyApICkKLQotICAvKiB3ZSB1c2UgRlRfVFlQRU9GIHRvIHN1cHByZXNzIHNpZ25lZG5lc3MgY29tcGlsYXRpb24gd2FybmluZ3MgKi8KLSNkZWZpbmUgRlRfUEFEX0ZMT09SKCB4LCBuICkgICggKHgpICYgfkZUX1RZUEVPRiggeCApKCAobiktMSApICkKLSNkZWZpbmUgRlRfUEFEX1JPVU5EKCB4LCBuICkgIEZUX1BBRF9GTE9PUiggKHgpICsgKChuKS8yKSwgbiApCi0jZGVmaW5lIEZUX1BBRF9DRUlMKCB4LCBuICkgICBGVF9QQURfRkxPT1IoICh4KSArICgobiktMSksIG4gKQotCi0jZGVmaW5lIEZUX1BJWF9GTE9PUiggeCApICAgICAoICh4KSAmIH5GVF9UWVBFT0YoIHggKTYzICkKLSNkZWZpbmUgRlRfUElYX1JPVU5EKCB4ICkgICAgIEZUX1BJWF9GTE9PUiggKHgpICsgMzIgKQotI2RlZmluZSBGVF9QSVhfQ0VJTCggeCApICAgICAgRlRfUElYX0ZMT09SKCAoeCkgKyA2MyApCi0KLQotICAvKgotICAgKiAgY2hhcmFjdGVyIGNsYXNzaWZpY2F0aW9uIGZ1bmN0aW9ucyAtLSBzaW5jZSB0aGVzZSBhcmUgdXNlZCB0byBwYXJzZQotICAgKiAgZm9udCBmaWxlcywgd2UgbXVzdCBub3QgdXNlIHRob3NlIGluIDxjdHlwZXMuaD4gd2hpY2ggYXJlCi0gICAqICBsb2NhbGUtZGVwZW5kZW50Ci0gICAqLwotI2RlZmluZSAgZnRfaXNkaWdpdCggeCApICAgKCAoICh1bnNpZ25lZCkoeCkgLSAnMCcgKSA8IDEwVSApCi0KLSNkZWZpbmUgIGZ0X2lzeGRpZ2l0KCB4ICkgICggKCAodW5zaWduZWQpKHgpIC0gJzAnICkgPCAxMFUgfHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICh1bnNpZ25lZCkoeCkgLSAnYScgKSA8IDZVICB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKHVuc2lnbmVkKSh4KSAtICdBJyApIDwgNlUgICkKLQotICAvKiB0aGUgbmV4dCB0d28gbWFjcm9zIGFzc3VtZSBBU0NJSSByZXByZXNlbnRhdGlvbiAqLwotI2RlZmluZSAgZnRfaXN1cHBlciggeCApICAoICggKHVuc2lnbmVkKSh4KSAtICdBJyApIDwgMjZVICkKLSNkZWZpbmUgIGZ0X2lzbG93ZXIoIHggKSAgKCAoICh1bnNpZ25lZCkoeCkgLSAnYScgKSA8IDI2VSApCi0KLSNkZWZpbmUgIGZ0X2lzYWxwaGEoIHggKSAgKCBmdF9pc3VwcGVyKCB4ICkgfHwgZnRfaXNsb3dlciggeCApICkKLSNkZWZpbmUgIGZ0X2lzYWxudW0oIHggKSAgKCBmdF9pc2RpZ2l0KCB4ICkgfHwgZnRfaXNhbHBoYSggeCApICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgIEMgSCBBIFIgTSBBIFAgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBoYW5kbGUgdG8gaW50ZXJuYWwgY2hhcm1hcCBvYmplY3QgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfQ01hcFJlY18qICAgICAgICAgICAgICBGVF9DTWFwOwotCi0gIC8qIGhhbmRsZSB0byBjaGFybWFwIGNsYXNzIHN0cnVjdHVyZSAqLwotICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBGVF9DTWFwX0NsYXNzUmVjXyogIEZUX0NNYXBfQ2xhc3M7Ci0KLSAgLyogaW50ZXJuYWwgY2hhcm1hcCBvYmplY3Qgc3RydWN0dXJlICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9DTWFwUmVjXwotICB7Ci0gICAgRlRfQ2hhck1hcFJlYyAgY2hhcm1hcDsKLSAgICBGVF9DTWFwX0NsYXNzICBjbGF6ejsKLQotICB9IEZUX0NNYXBSZWM7Ci0KLSAgLyogdHlwZWNhc2UgYW55IHBvaW50ZXIgdG8gYSBjaGFybWFwIGhhbmRsZSAqLwotI2RlZmluZSBGVF9DTUFQKCB4ICkgICAgICAgICAgICAgICgoRlRfQ01hcCkoIHggKSkKLQotICAvKiBvYnZpb3VzIG1hY3JvcyAqLwotI2RlZmluZSBGVF9DTUFQX1BMQVRGT1JNX0lEKCB4ICkgIEZUX0NNQVAoIHggKS0+Y2hhcm1hcC5wbGF0Zm9ybV9pZAotI2RlZmluZSBGVF9DTUFQX0VOQ09ESU5HX0lEKCB4ICkgIEZUX0NNQVAoIHggKS0+Y2hhcm1hcC5lbmNvZGluZ19pZAotI2RlZmluZSBGVF9DTUFQX0VOQ09ESU5HKCB4ICkgICAgIEZUX0NNQVAoIHggKS0+Y2hhcm1hcC5lbmNvZGluZwotI2RlZmluZSBGVF9DTUFQX0ZBQ0UoIHggKSAgICAgICAgIEZUX0NNQVAoIHggKS0+Y2hhcm1hcC5mYWNlCi0KLQotICAvKiBjbGFzcyBtZXRob2QgZGVmaW5pdGlvbnMgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0NNYXBfSW5pdEZ1bmMpKCBGVF9DTWFwICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBpbml0X2RhdGEgKTsKLQotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9DTWFwX0RvbmVGdW5jKSggRlRfQ01hcCAgY21hcCApOwotCi0gIHR5cGVkZWYgRlRfVUludAotICAoKkZUX0NNYXBfQ2hhckluZGV4RnVuYykoIEZUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGNoYXJfY29kZSApOwotCi0gIHR5cGVkZWYgRlRfVUludAotICAoKkZUX0NNYXBfQ2hhck5leHRGdW5jKSggRlRfQ01hcCAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgKmFjaGFyX2NvZGUgKTsKLQotICB0eXBlZGVmIEZUX1VJbnQKLSAgKCpGVF9DTWFwX0NoYXJWYXJJbmRleEZ1bmMpKCBGVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQ01hcCAgICB1bmljb2RlX2NtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICBjaGFyX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICB2YXJpYW50X3NlbGVjdG9yICk7Ci0KLSAgdHlwZWRlZiBGVF9Cb29sCi0gICgqRlRfQ01hcF9DaGFyVmFySXNEZWZhdWx0RnVuYykoIEZUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICBjaGFyX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgdmFyaWFudF9zZWxlY3RvciApOwotCi0gIHR5cGVkZWYgRlRfVUludDMyICoKLSAgKCpGVF9DTWFwX1ZhcmlhbnRMaXN0RnVuYykoIEZUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtICk7Ci0KLSAgdHlwZWRlZiBGVF9VSW50MzIgKgotICAoKkZUX0NNYXBfQ2hhclZhcmlhbnRMaXN0RnVuYykoIEZUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGNoYXJfY29kZSApOwotCi0gIHR5cGVkZWYgRlRfVUludDMyICoKLSAgKCpGVF9DTWFwX1ZhcmlhbnRDaGFyTGlzdEZ1bmMpKCBGVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICB2YXJpYW50X3NlbGVjdG9yICk7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgRlRfQ01hcF9DbGFzc1JlY18KLSAgewotICAgIEZUX1VMb25nICAgICAgICAgICAgICAgc2l6ZTsKLSAgICBGVF9DTWFwX0luaXRGdW5jICAgICAgIGluaXQ7Ci0gICAgRlRfQ01hcF9Eb25lRnVuYyAgICAgICBkb25lOwotICAgIEZUX0NNYXBfQ2hhckluZGV4RnVuYyAgY2hhcl9pbmRleDsKLSAgICBGVF9DTWFwX0NoYXJOZXh0RnVuYyAgIGNoYXJfbmV4dDsKLQotICAgIC8qIFN1YnNlcXVlbnQgZW50cmllcyBhcmUgc3BlY2lhbCBvbmVzIGZvciBmb3JtYXQgMTQgLS0gdGhlIHZhcmlhbnQgKi8KLSAgICAvKiBzZWxlY3RvciBzdWJ0YWJsZSB3aGljaCBiZWhhdmVzIGxpa2Ugbm8gb3RoZXIgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBGVF9DTWFwX0NoYXJWYXJJbmRleEZ1bmMgICAgICBjaGFyX3Zhcl9pbmRleDsKLSAgICBGVF9DTWFwX0NoYXJWYXJJc0RlZmF1bHRGdW5jICBjaGFyX3Zhcl9kZWZhdWx0OwotICAgIEZUX0NNYXBfVmFyaWFudExpc3RGdW5jICAgICAgIHZhcmlhbnRfbGlzdDsKLSAgICBGVF9DTWFwX0NoYXJWYXJpYW50TGlzdEZ1bmMgICBjaGFydmFyaWFudF9saXN0OwotICAgIEZUX0NNYXBfVmFyaWFudENoYXJMaXN0RnVuYyAgIHZhcmlhbnRjaGFyX2xpc3Q7Ci0KLSAgfSBGVF9DTWFwX0NsYXNzUmVjOwotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9ERUNMQVJFX0NNQVBfQ0xBU1MoIGNsYXNzXyApICAgICAgICAgICAgICBcCi0gIEZUX0NBTExCQUNLX1RBQkxFIGNvbnN0ICBGVF9DTWFwX0NsYXNzUmVjIGNsYXNzXzsKLQotI2RlZmluZSBGVF9ERUZJTkVfQ01BUF9DTEFTUyggICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNoYXJfaW5kZXhfLCAgICAgICAgICAgICAgXAotICAgICAgICAgIGNoYXJfbmV4dF8sICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNoYXJfdmFyX2luZGV4XywgICAgICAgICAgXAotICAgICAgICAgIGNoYXJfdmFyX2RlZmF1bHRfLCAgICAgICAgXAotICAgICAgICAgIHZhcmlhbnRfbGlzdF8sICAgICAgICAgICAgXAotICAgICAgICAgIGNoYXJ2YXJpYW50X2xpc3RfLCAgICAgICAgXAotICAgICAgICAgIHZhcmlhbnRjaGFyX2xpc3RfICkgICAgICAgXAotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYgICAgICAgICAgICAgXAotICBjb25zdCBGVF9DTWFwX0NsYXNzUmVjICBjbGFzc18gPSAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXJfaW5kZXhfLCAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXJfbmV4dF8sICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXJfdmFyX2luZGV4XywgICAgICAgICAgICAgICAgXAotICAgIGNoYXJfdmFyX2RlZmF1bHRfLCAgICAgICAgICAgICAgXAotICAgIHZhcmlhbnRfbGlzdF8sICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXJ2YXJpYW50X2xpc3RfLCAgICAgICAgICAgICAgXAotICAgIHZhcmlhbnRjaGFyX2xpc3RfICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFQ0xBUkVfQ01BUF9DTEFTUyggY2xhc3NfICkgICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgIGxpYnJhcnksICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQ01hcF9DbGFzc1JlYyogIGNsYXp6ICk7Ci0KLSNkZWZpbmUgRlRfREVGSU5FX0NNQVBfQ0xBU1MoICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjaGFyX2luZGV4XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjaGFyX25leHRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjaGFyX3Zhcl9pbmRleF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjaGFyX3Zhcl9kZWZhdWx0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB2YXJpYW50X2xpc3RfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjaGFydmFyaWFudF9saXN0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB2YXJpYW50Y2hhcl9saXN0XyApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgbGlicmFyeSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9DTWFwX0NsYXNzUmVjKiAgY2xhenogKSAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+c2l6ZSAgICAgICAgICAgICA9IHNpemVfOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+aW5pdCAgICAgICAgICAgICA9IGluaXRfOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+ZG9uZSAgICAgICAgICAgICA9IGRvbmVfOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Y2hhcl9pbmRleCAgICAgICA9IGNoYXJfaW5kZXhfOyAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Y2hhcl9uZXh0ICAgICAgICA9IGNoYXJfbmV4dF87ICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Y2hhcl92YXJfaW5kZXggICA9IGNoYXJfdmFyX2luZGV4XzsgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Y2hhcl92YXJfZGVmYXVsdCA9IGNoYXJfdmFyX2RlZmF1bHRfOyAgICAgICAgIFwKLSAgICBjbGF6ei0+dmFyaWFudF9saXN0ICAgICA9IHZhcmlhbnRfbGlzdF87ICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Y2hhcnZhcmlhbnRfbGlzdCA9IGNoYXJ2YXJpYW50X2xpc3RfOyAgICAgICAgIFwKLSAgICBjbGF6ei0+dmFyaWFudGNoYXJfbGlzdCA9IHZhcmlhbnRjaGFyX2xpc3RfOyAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0gIC8qIGNyZWF0ZSBhIG5ldyBjaGFybWFwIGFuZCBhZGQgaXQgdG8gY2hhcm1hcC0+ZmFjZSAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX0NNYXBfTmV3KCBGVF9DTWFwX0NsYXNzICBjbGF6eiwKLSAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICAgIGluaXRfZGF0YSwKLSAgICAgICAgICAgICAgIEZUX0NoYXJNYXAgICAgIGNoYXJtYXAsCi0gICAgICAgICAgICAgICBGVF9DTWFwICAgICAgICphY21hcCApOwotCi0gIC8qIGRlc3Ryb3kgYSBjaGFybWFwIGFuZCByZW1vdmUgaXQgZnJvbSBmYWNlJ3MgbGlzdCAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfQ01hcF9Eb25lKCBGVF9DTWFwICBjbWFwICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9GYWNlX0ludGVybmFsUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHN0cnVjdHVyZSBjb250YWlucyB0aGUgaW50ZXJuYWwgZmllbGRzIG9mIGVhY2ggRlRfRmFjZSAgICAgICAgKi8KLSAgLyogICAgb2JqZWN0LiAgVGhlc2UgZmllbGRzIG1heSBjaGFuZ2UgYmV0d2VlbiBkaWZmZXJlbnQgcmVsZWFzZXMgb2YgICAgICovCi0gIC8qICAgIEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9wb2ludHMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBwb2ludHMgdXNlZCB0byBzdG9yZSB0aGUgdmVjdG9yaWFsIG91dGxpbmUgKi8KLSAgLyogICAgICBvZiBhbnkgZ2x5cGggaW4gdGhpcyBmYWNlLiAgSWYgdGhpcyB2YWx1ZSBjYW5ub3QgYmUga25vd24gaW4gICAgICovCi0gIC8qICAgICAgYWR2YW5jZSwgb3IgaWYgdGhlIGZhY2UgaXNuJ3Qgc2NhbGFibGUsIHRoaXMgc2hvdWxkIGJlIHNldCB0byAwLiAqLwotICAvKiAgICAgIE9ubHkgcmVsZXZhbnQgZm9yIHNjYWxhYmxlIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9jb250b3VycyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb250b3VycyB1c2VkIHRvIHN0b3JlIHRoZSB2ZWN0b3JpYWwgICAgICAgKi8KLSAgLyogICAgICBvdXRsaW5lIG9mIGFueSBnbHlwaCBpbiB0aGlzIGZhY2UuICBJZiB0aGlzIHZhbHVlIGNhbm5vdCBiZSAgICAgICovCi0gIC8qICAgICAga25vd24gaW4gYWR2YW5jZSwgb3IgaWYgdGhlIGZhY2UgaXNuJ3Qgc2NhbGFibGUsIHRoaXMgc2hvdWxkIGJlICAqLwotICAvKiAgICAgIHNldCB0byAwLiAgT25seSByZWxldmFudCBmb3Igc2NhbGFibGUgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRyYW5zZm9ybV9tYXRyaXggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgMngyIG1hdHJpeCBvZiAxNi4xNiBjb2VmZmljaWVudHMgdXNlZCB0byB0cmFuc2Zvcm0gZ2x5cGggICAgICAgKi8KLSAgLyogICAgICBvdXRsaW5lcyBhZnRlciB0aGV5IGFyZSBsb2FkZWQgZnJvbSB0aGUgZm9udC4gIE9ubHkgdXNlZCBieSB0aGUgICovCi0gIC8qICAgICAgY29udmVuaWVuY2UgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHJhbnNmb3JtX2RlbHRhIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSB0cmFuc2xhdGlvbiB2ZWN0b3IgdXNlZCB0byB0cmFuc2Zvcm0gZ2x5cGggb3V0bGluZXMgYWZ0ZXIgdGhleSAqLwotICAvKiAgICAgIGFyZSBsb2FkZWQgZnJvbSB0aGUgZm9udC4gIE9ubHkgdXNlZCBieSB0aGUgY29udmVuaWVuY2UgICAgICAgICAgKi8KLSAgLyogICAgICBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0cmFuc2Zvcm1fZmxhZ3MgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBTb21lIGZsYWdzIHVzZWQgdG8gY2xhc3NpZnkgdGhlIHRyYW5zZm9ybS4gIE9ubHkgdXNlZCBieSB0aGUgICAgICovCi0gIC8qICAgICAgY29udmVuaWVuY2UgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2VydmljZXMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBjYWNoZSBmb3IgZnJlcXVlbnRseSB1c2VkIHNlcnZpY2VzLiAgSXQgc2hvdWxkIGJlIG9ubHkgICAgICAgICAqLwotICAvKiAgICAgIGFjY2Vzc2VkIHdpdGggdGhlIG1hY3JvIGBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFJy4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGluY3JlbWVudGFsX2ludGVyZmFjZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIElmIG5vbi1udWxsLCB0aGUgaW50ZXJmYWNlIHRocm91Z2ggd2hpY2ggZ2x5cGggZGF0YSBhbmQgbWV0cmljcyAgKi8KLSAgLyogICAgICBhcmUgbG9hZGVkIGluY3JlbWVudGFsbHkgZm9yIGZhY2VzIHRoYXQgZG8gbm90IHByb3ZpZGUgYWxsIG9mICAgICovCi0gIC8qICAgICAgdGhpcyBkYXRhIHdoZW4gZmlyc3Qgb3BlbmVkLiAgVGhpcyBmaWVsZCBleGlzdHMgb25seSBpZiAgICAgICAgICAqLwotICAvKiAgICAgIEBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMIGlzIGRlZmluZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGlnbm9yZV91bnBhdGVudGVkX2hpbnRlciA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoaXMgYm9vbGVhbiBmbGFnIGluc3RydWN0cyB0aGUgZ2x5cGggbG9hZGVyIHRvIGlnbm9yZSB0aGUgICAgICAgKi8KLSAgLyogICAgICBuYXRpdmUgZm9udCBoaW50ZXIsIGlmIG9uZSBpcyBmb3VuZC4gIFRoaXMgaXMgZXhjbHVzaXZlbHkgdXNlZCAgICovCi0gIC8qICAgICAgaW4gdGhlIGNhc2Ugd2hlbiB0aGUgdW5wYXRlbnRlZCBoaW50ZXIgaXMgY29tcGlsZWQgd2l0aGluIHRoZSAgICAqLwotICAvKiAgICAgIGxpYnJhcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlZmNvdW50IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgY291bnRlciBpbml0aWFsaXplZCB0b34xIGF0IHRoZSB0aW1lIGFuIEBGVF9GYWNlIHN0cnVjdHVyZSBpcyAgKi8KLSAgLyogICAgICBjcmVhdGVkLiAgQEZUX1JlZmVyZW5jZV9GYWNlIGluY3JlbWVudHMgdGhpcyBjb3VudGVyLCBhbmQgICAgICAgICovCi0gIC8qICAgICAgQEZUX0RvbmVfRmFjZSBvbmx5IGRlc3Ryb3lzIGEgZmFjZSBpZiB0aGUgY291bnRlciBpc34xLCAgICAgICAgICAqLwotICAvKiAgICAgIG90aGVyd2lzZSBpdCBzaW1wbHkgZGVjcmVtZW50cyBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9GYWNlX0ludGVybmFsUmVjXwotICB7Ci0gICAgRlRfTWF0cml4ICAgICAgICAgICB0cmFuc2Zvcm1fbWF0cml4OwotICAgIEZUX1ZlY3RvciAgICAgICAgICAgdHJhbnNmb3JtX2RlbHRhOwotICAgIEZUX0ludCAgICAgICAgICAgICAgdHJhbnNmb3JtX2ZsYWdzOwotCi0gICAgRlRfU2VydmljZUNhY2hlUmVjICBzZXJ2aWNlczsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2VSZWMqICBpbmNyZW1lbnRhbF9pbnRlcmZhY2U7Ci0jZW5kaWYKLQotICAgIEZUX0Jvb2wgICAgICAgICAgICAgaWdub3JlX3VucGF0ZW50ZWRfaGludGVyOwotICAgIEZUX0ludCAgICAgICAgICAgICAgcmVmY291bnQ7Ci0KLSAgfSBGVF9GYWNlX0ludGVybmFsUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2xvdF9JbnRlcm5hbFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGludGVybmFsIGZpZWxkcyBvZiBlYWNoIEZUX0dseXBoU2xvdCAgICovCi0gIC8qICAgIG9iamVjdC4gIFRoZXNlIGZpZWxkcyBtYXkgY2hhbmdlIGJldHdlZW4gZGlmZmVyZW50IHJlbGVhc2VzIG9mICAgICAqLwotICAvKiAgICBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkZXIgICAgICAgICAgICA6OiBUaGUgZ2x5cGggbG9hZGVyIG9iamVjdCB1c2VkIHRvIGxvYWQgb3V0bGluZXMgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgaW50byB0aGUgZ2x5cGggc2xvdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmbGFncyAgICAgICAgICAgICA6OiBQb3NzaWJsZSB2YWx1ZXMgYXJlIHplcm8gb3IgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgRlRfR0xZUEhfT1dOX0JJVE1BUC4gIFRoZSBsYXR0ZXIgaW5kaWNhdGVzICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGhlIEZUX0dseXBoU2xvdCBzdHJ1Y3R1cmUgb3ducyB0aGUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXAgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX3RyYW5zZm9ybWVkIDo6IEJvb2xlYW4uICBTZXQgdG8gVFJVRSB3aGVuIHRoZSBsb2FkZWQgZ2x5cGggICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHRyYW5zZm9ybWVkIHRocm91Z2ggYSBzcGVjaWZpYyAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgZm9udCB0cmFuc2Zvcm1hdGlvbi4gIFRoaXMgaXMgX25vdF8gdGhlIHNhbWUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIGFzIHRoZSBmYWNlIHRyYW5zZm9ybSBzZXQgdGhyb3VnaCAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXRfVHJhbnNmb3JtKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX21hdHJpeCAgICAgIDo6IFRoZSAyeDIgbWF0cml4IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdseXBoICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbiwgaWYgbmVjZXNzYXJ5LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2RlbHRhICAgICAgIDo6IFRoZSAyZCB0cmFuc2xhdGlvbiB2ZWN0b3IgY29ycmVzcG9uZGluZyB0byAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZ2x5cGggdHJhbnNmb3JtYXRpb24sIGlmIG5lY2Vzc2FyeS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2hpbnRzICAgICAgIDo6IEZvcm1hdC1zcGVjaWZpYyBnbHlwaCBoaW50cyBtYW5hZ2VtZW50LiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBGVF9HTFlQSF9PV05fQklUTUFQICAweDFVCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1Nsb3RfSW50ZXJuYWxSZWNfCi0gIHsKLSAgICBGVF9HbHlwaExvYWRlciAgbG9hZGVyOwotICAgIEZUX1VJbnQgICAgICAgICBmbGFnczsKLSAgICBGVF9Cb29sICAgICAgICAgZ2x5cGhfdHJhbnNmb3JtZWQ7Ci0gICAgRlRfTWF0cml4ICAgICAgIGdseXBoX21hdHJpeDsKLSAgICBGVF9WZWN0b3IgICAgICAgZ2x5cGhfZGVsdGE7Ci0gICAgdm9pZCogICAgICAgICAgIGdseXBoX2hpbnRzOwotCi0gIH0gRlRfR2x5cGhTbG90X0ludGVybmFsUmVjOwotCi0KLSNpZiAwCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU2l6ZV9JbnRlcm5hbFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIGludGVybmFsIGZpZWxkcyBvZiBlYWNoIEZUX1NpemUgICAgICAgICovCi0gIC8qICAgIG9iamVjdC4gIEN1cnJlbnRseSwgaXQncyBlbXB0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1NpemVfSW50ZXJuYWxSZWNfCi0gIHsKLSAgICAvKiBlbXB0eSAqLwotCi0gIH0gRlRfU2l6ZV9JbnRlcm5hbFJlYzsKLQotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgIE0gTyBEIFUgTCBFIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIG1vZHVsZSBvYmplY3QgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjbGF6eiAgIDo6IEEgcG9pbnRlciB0byB0aGUgbW9kdWxlJ3MgY2xhc3MuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICA6OiBBIGhhbmRsZSB0byB0aGUgbWVtb3J5IG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgRlRfTW9kdWxlUmVjXwotICB7Ci0gICAgRlRfTW9kdWxlX0NsYXNzKiAgY2xheno7Ci0gICAgRlRfTGlicmFyeSAgICAgICAgbGlicmFyeTsKLSAgICBGVF9NZW1vcnkgICAgICAgICBtZW1vcnk7Ci0KLSAgfSBGVF9Nb2R1bGVSZWM7Ci0KLQotICAvKiB0eXBlY2FzdCBhbiBvYmplY3QgdG8gYW4gRlRfTW9kdWxlICovCi0jZGVmaW5lIEZUX01PRFVMRSggeCApICAgICAgICAgICgoRlRfTW9kdWxlKSggeCApKQotI2RlZmluZSBGVF9NT0RVTEVfQ0xBU1MoIHggKSAgICBGVF9NT0RVTEUoIHggKS0+Y2xhenoKLSNkZWZpbmUgRlRfTU9EVUxFX0xJQlJBUlkoIHggKSAgRlRfTU9EVUxFKCB4ICktPmxpYnJhcnkKLSNkZWZpbmUgRlRfTU9EVUxFX01FTU9SWSggeCApICAgRlRfTU9EVUxFKCB4ICktPm1lbW9yeQotCi0KLSNkZWZpbmUgRlRfTU9EVUxFX0lTX0RSSVZFUiggeCApICAoIEZUX01PRFVMRV9DTEFTUyggeCApLT5tb2R1bGVfZmxhZ3MgJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NT0RVTEVfRk9OVF9EUklWRVIgKQotCi0jZGVmaW5lIEZUX01PRFVMRV9JU19SRU5ERVJFUiggeCApICAoIEZUX01PRFVMRV9DTEFTUyggeCApLT5tb2R1bGVfZmxhZ3MgJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01PRFVMRV9SRU5ERVJFUiApCi0KLSNkZWZpbmUgRlRfTU9EVUxFX0lTX0hJTlRFUiggeCApICAoIEZUX01PRFVMRV9DTEFTUyggeCApLT5tb2R1bGVfZmxhZ3MgJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NT0RVTEVfSElOVEVSICkKLQotI2RlZmluZSBGVF9NT0RVTEVfSVNfU1RZTEVSKCB4ICkgICggRlRfTU9EVUxFX0NMQVNTKCB4ICktPm1vZHVsZV9mbGFncyAmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01PRFVMRV9TVFlMRVIgKQotCi0jZGVmaW5lIEZUX0RSSVZFUl9JU19TQ0FMQUJMRSggeCApICAoIEZUX01PRFVMRV9DTEFTUyggeCApLT5tb2R1bGVfZmxhZ3MgJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01PRFVMRV9EUklWRVJfU0NBTEFCTEUgKQotCi0jZGVmaW5lIEZUX0RSSVZFUl9VU0VTX09VVExJTkVTKCB4ICkgICEoIEZUX01PRFVMRV9DTEFTUyggeCApLT5tb2R1bGVfZmxhZ3MgJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01PRFVMRV9EUklWRVJfTk9fT1VUTElORVMgKQotCi0jZGVmaW5lIEZUX0RSSVZFUl9IQVNfSElOVEVSKCB4ICkgICggRlRfTU9EVUxFX0NMQVNTKCB4ICktPm1vZHVsZV9mbGFncyAmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NT0RVTEVfRFJJVkVSX0hBU19ISU5URVIgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X01vZHVsZV9JbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmluZHMgYSBtb2R1bGUgYW5kIHJldHVybnMgaXRzIHNwZWNpZmljIGludGVyZmFjZSBhcyBhIHR5cGVsZXNzICAgICovCi0gIC8qICAgIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBsaWJyYXJ5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbW9kdWxlX25hbWUgOjogVGhlIG1vZHVsZSdzIG5hbWUgKGFzIGFuIEFTQ0lJIHN0cmluZykuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBtb2R1bGUtc3BlY2lmaWMgaW50ZXJmYWNlIGlmIGF2YWlsYWJsZSwgMCBvdGhlcndpc2UuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgWW91IHNob3VsZCBiZXR0ZXIgYmUgZmFtaWxpYXIgd2l0aCBGcmVlVHlwZSBpbnRlcm5hbHMgdG8ga25vdyAgICAgICovCi0gIC8qICAgIHdoaWNoIG1vZHVsZSB0byBsb29rIGZvciwgYW5kIHdoYXQgaXRzIGludGVyZmFjZSBpcyA6LSkgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggY29uc3Qgdm9pZCogKQotICBGVF9HZXRfTW9kdWxlX0ludGVyZmFjZSggRlRfTGlicmFyeSAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgbW9kX25hbWUgKTsKLQotICBGVF9CQVNFKCBGVF9Qb2ludGVyICkKLSAgZnRfbW9kdWxlX2dldF9zZXJ2aWNlKCBGVF9Nb2R1bGUgICAgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBzZXJ2aWNlX2lkICk7Ci0KLSAgLyogKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICBGIEEgQyBFLCAgIFMgSSBaIEUgICAmICAgRyBMIFkgUCBIICAgUyBMIE8gVCAgIE8gQiBKIEUgQyBUIFMgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBhIGZldyBtYWNyb3MgdXNlZCB0byBwZXJmb3JtIGVhc3kgdHlwZWNhc3RzIHdpdGggbWluaW1hbCBicmFpbiBkYW1hZ2UgKi8KLQotI2RlZmluZSBGVF9GQUNFKCB4ICkgICAgICAgICAgKChGVF9GYWNlKSh4KSkKLSNkZWZpbmUgRlRfU0laRSggeCApICAgICAgICAgICgoRlRfU2l6ZSkoeCkpCi0jZGVmaW5lIEZUX1NMT1QoIHggKSAgICAgICAgICAoKEZUX0dseXBoU2xvdCkoeCkpCi0KLSNkZWZpbmUgRlRfRkFDRV9EUklWRVIoIHggKSAgIEZUX0ZBQ0UoIHggKS0+ZHJpdmVyCi0jZGVmaW5lIEZUX0ZBQ0VfTElCUkFSWSggeCApICBGVF9GQUNFX0RSSVZFUiggeCApLT5yb290LmxpYnJhcnkKLSNkZWZpbmUgRlRfRkFDRV9NRU1PUlkoIHggKSAgIEZUX0ZBQ0UoIHggKS0+bWVtb3J5Ci0jZGVmaW5lIEZUX0ZBQ0VfU1RSRUFNKCB4ICkgICBGVF9GQUNFKCB4ICktPnN0cmVhbQotCi0jZGVmaW5lIEZUX1NJWkVfRkFDRSggeCApICAgICBGVF9TSVpFKCB4ICktPmZhY2UKLSNkZWZpbmUgRlRfU0xPVF9GQUNFKCB4ICkgICAgIEZUX1NMT1QoIHggKS0+ZmFjZQotCi0jZGVmaW5lIEZUX0ZBQ0VfU0xPVCggeCApICAgICBGVF9GQUNFKCB4ICktPmdseXBoCi0jZGVmaW5lIEZUX0ZBQ0VfU0laRSggeCApICAgICBGVF9GQUNFKCB4ICktPnNpemUKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX05ld19HbHlwaFNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEl0IGlzIHNvbWV0aW1lcyB1c2VmdWwgdG8gaGF2ZSBtb3JlIHRoYW4gb25lIGdseXBoIHNsb3QgZm9yIGEgICAgICAqLwotICAvKiAgICBnaXZlbiBmYWNlIG9iamVjdC4gIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYWRkaXRpb25hbCAgICAgKi8KLSAgLyogICAgc2xvdHMuICBBbGwgb2YgdGhlbSBhcmUgYXV0b21hdGljYWxseSBkaXNjYXJkZWQgd2hlbiB0aGUgZmFjZSBpcyAgICovCi0gIC8qICAgIGRlc3Ryb3llZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgIDo6IEEgaGFuZGxlIHRvIGEgcGFyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFzbG90IDo6IEEgaGFuZGxlIHRvIGEgbmV3IGdseXBoIHNsb3Qgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9OZXdfR2x5cGhTbG90KCBGVF9GYWNlICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICphc2xvdCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9HbHlwaFNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzdHJveXMgYSBnaXZlbiBnbHlwaCBzbG90LiAgUmVtZW1iZXIgaG93ZXZlciB0aGF0IGFsbCBzbG90cyBhcmUgICovCi0gIC8qICAgIGF1dG9tYXRpY2FsbHkgZGVzdHJveWVkIHdpdGggaXRzIHBhcmVudC4gIFVzaW5nIHRoaXMgZnVuY3Rpb24gaXMgICAqLwotICAvKiAgICBub3QgYWx3YXlzIG1hbmRhdG9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzbG90IDo6IEEgaGFuZGxlIHRvIGEgdGFyZ2V0IGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9Eb25lX0dseXBoU2xvdCggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLSAvKiAqLwotCi0jZGVmaW5lIEZUX1JFUVVFU1RfV0lEVEgoIHJlcSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAocmVxKS0+aG9yaVJlc29sdXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgID8gKCAocmVxKS0+d2lkdGggKiAoRlRfUG9zKShyZXEpLT5ob3JpUmVzb2x1dGlvbiArIDM2ICkgLyA3MiBcCi0gICAgICAgICAgICAgIDogKHJlcSktPndpZHRoICkKLQotI2RlZmluZSBGVF9SRVFVRVNUX0hFSUdIVCggcmVxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChyZXEpLT52ZXJ0UmVzb2x1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgID8gKCAocmVxKS0+aGVpZ2h0ICogKEZUX1BvcykocmVxKS0+dmVydFJlc29sdXRpb24gKyAzNiApIC8gNzIgXAotICAgICAgICAgICAgICA6IChyZXEpLT5oZWlnaHQgKQotCi0KLSAgLyogU2V0IHRoZSBtZXRyaWNzIGFjY29yZGluZyB0byBhIGJpdG1hcCBzdHJpa2UuICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9TZWxlY3RfTWV0cmljcyggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgc3RyaWtlX2luZGV4ICk7Ci0KLQotICAvKiBTZXQgdGhlIG1ldHJpY3MgYWNjb3JkaW5nIHRvIGEgc2l6ZSByZXF1ZXN0LiAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfUmVxdWVzdF9NZXRyaWNzKCBGVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEgKTsKLQotCi0gIC8qIE1hdGNoIGEgc2l6ZSByZXF1ZXN0IGFnYWluc3QgYGF2YWlsYWJsZV9zaXplcycuICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfTWF0Y2hfU2l6ZSggRlRfRmFjZSAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSwKLSAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgICBpZ25vcmVfd2lkdGgsCi0gICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgICAgc2l6ZV9pbmRleCApOwotCi0KLSAgLyogVXNlIHRoZSBob3Jpem9udGFsIG1ldHJpY3MgdG8gc3ludGhlc2l6ZSB0aGUgdmVydGljYWwgbWV0cmljcy4gKi8KLSAgLyogSWYgYGFkdmFuY2UnIGlzIHplcm8sIGl0IGlzIGFsc28gc3ludGhlc2l6ZWQuICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIGZ0X3N5bnRoZXNpemVfdmVydGljYWxfbWV0cmljcyggRlRfR2x5cGhfTWV0cmljcyogIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICAgICAgIGFkdmFuY2UgKTsKLQotCi0gIC8qIEZyZWUgdGhlIGJpdG1hcCBvZiBhIGdpdmVuIGdseXBoc2xvdCB3aGVuIG5lZWRlZCAoaS5lLiwgb25seSB3aGVuIGl0ICovCi0gIC8qIHdhcyBhbGxvY2F0ZWQgd2l0aCBmdF9nbHlwaHNsb3RfYWxsb2NfYml0bWFwKS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBmdF9nbHlwaHNsb3RfZnJlZV9iaXRtYXAoIEZUX0dseXBoU2xvdCAgc2xvdCApOwotCi0KLSAgLyogQWxsb2NhdGUgYSBuZXcgYml0bWFwIGJ1ZmZlciBpbiBhIGdseXBoIHNsb3QuICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgZnRfZ2x5cGhzbG90X2FsbG9jX2JpdG1hcCggRlRfR2x5cGhTbG90ICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgIHNpemUgKTsKLQotCi0gIC8qIFNldCB0aGUgYml0bWFwIGJ1ZmZlciBpbiBhIGdseXBoIHNsb3QgdG8gYSBnaXZlbiBwb2ludGVyLiAgVGhlIGJ1ZmZlciAqLwotICAvKiB3aWxsIG5vdCBiZSBmcmVlZCBieSBhIGxhdGVyIGNhbGwgdG8gZnRfZ2x5cGhzbG90X2ZyZWVfYml0bWFwLiAgICAgICAgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIGZ0X2dseXBoc2xvdF9zZXRfYml0bWFwKCBGVF9HbHlwaFNsb3QgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgIGJ1ZmZlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgIFIgRSBOIEQgRSBSIEUgUiBTICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgRlRfUkVOREVSRVIoIHggKSAgICAgICgoRlRfUmVuZGVyZXIpKCB4ICkpCi0jZGVmaW5lIEZUX0dMWVBIKCB4ICkgICAgICAgICAoKEZUX0dseXBoKSggeCApKQotI2RlZmluZSBGVF9CSVRNQVBfR0xZUEgoIHggKSAgKChGVF9CaXRtYXBHbHlwaCkoIHggKSkKLSNkZWZpbmUgRlRfT1VUTElORV9HTFlQSCggeCApICgoRlRfT3V0bGluZUdseXBoKSggeCApKQotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1JlbmRlcmVyUmVjXwotICB7Ci0gICAgRlRfTW9kdWxlUmVjICAgICAgICAgICAgcm9vdDsKLSAgICBGVF9SZW5kZXJlcl9DbGFzcyogICAgICBjbGF6ejsKLSAgICBGVF9HbHlwaF9Gb3JtYXQgICAgICAgICBnbHlwaF9mb3JtYXQ7Ci0gICAgRlRfR2x5cGhfQ2xhc3MgICAgICAgICAgZ2x5cGhfY2xhc3M7Ci0KLSAgICBGVF9SYXN0ZXIgICAgICAgICAgICAgICByYXN0ZXI7Ci0gICAgRlRfUmFzdGVyX1JlbmRlcl9GdW5jICAgcmFzdGVyX3JlbmRlcjsKLSAgICBGVF9SZW5kZXJlcl9SZW5kZXJGdW5jICByZW5kZXI7Ci0KLSAgfSBGVF9SZW5kZXJlclJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgIEYgTyBOIFQgICBEIFIgSSBWIEUgUiBTICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIHR5cGVjYXN0IGEgbW9kdWxlIGludG8gYSBkcml2ZXIgZWFzaWx5ICovCi0jZGVmaW5lIEZUX0RSSVZFUiggeCApICAgICAgICAoKEZUX0RyaXZlcikoeCkpCi0KLSAgLyogdHlwZWNhc3QgYSBtb2R1bGUgYXMgYSBkcml2ZXIsIGFuZCBnZXQgaXRzIGRyaXZlciBjbGFzcyAqLwotI2RlZmluZSBGVF9EUklWRVJfQ0xBU1MoIHggKSAgRlRfRFJJVkVSKCB4ICktPmNsYXp6Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Ecml2ZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgcm9vdCBmb250IGRyaXZlciBjbGFzcy4gIEEgZm9udCBkcml2ZXIgaXMgcmVzcG9uc2libGUgZm9yICAgICAgKi8KLSAgLyogICAgbWFuYWdpbmcgYW5kIGxvYWRpbmcgZm9udCBmaWxlcyBvZiBhIGdpdmVuIGZvcm1hdC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIHJvb3QgICAgICAgICA6OiBDb250YWlucyB0aGUgZmllbGRzIG9mIHRoZSByb290IG1vZHVsZSBjbGFzcy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgY2xhenogICAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgZm9udCBkcml2ZXIncyBjbGFzcy4gIE5vdGUgdGhhdCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIE5PVCByb290LmNsYXp6LiAgYGNsYXNzJyB3YXNuJ3QgdXNlZCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgYXMgaXQgaXMgYSByZXNlcnZlZCB3b3JkIGluIEMrKy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGZhY2VzX2xpc3QgICA6OiBUaGUgbGlzdCBvZiBmYWNlcyBjdXJyZW50bHkgb3BlbmVkIGJ5IHRoaXMgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgZHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGdseXBoX2xvYWRlciA6OiBVbnVzZWQuICBVc2VkIHRvIGJlIGdseXBoIGxvYWRlciBmb3IgYWxsIGZhY2VzICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgbWFuYWdlZCBieSB0aGlzIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0RyaXZlclJlY18KLSAgewotICAgIEZUX01vZHVsZVJlYyAgICAgcm9vdDsKLSAgICBGVF9Ecml2ZXJfQ2xhc3MgIGNsYXp6OwotICAgIEZUX0xpc3RSZWMgICAgICAgZmFjZXNfbGlzdDsKLSAgICBGVF9HbHlwaExvYWRlciAgIGdseXBoX2xvYWRlcjsKLQotICB9IEZUX0RyaXZlclJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgIEwgSSBCIFIgQSBSIEkgRSBTICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIFRoaXMgaG9vayBpcyB1c2VkIGJ5IHRoZSBUcnVlVHlwZSBkZWJ1Z2dlci4gIEl0IG11c3QgYmUgc2V0IHRvIGFuICovCi0gIC8qIGFsdGVybmF0ZSB0cnVldHlwZSBieXRlY29kZSBpbnRlcnByZXRlciBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0RFQlVHX0hPT0tfVFJVRVRZUEUgICAgICAgICAgICAwCi0KLQotICAvKiBTZXQgdGhpcyBkZWJ1ZyBob29rIHRvIGEgbm9uLW51bGwgcG9pbnRlciB0byBmb3JjZSB1bnBhdGVudGVkIGhpbnRpbmcgKi8KLSAgLyogZm9yIGFsbCBmYWNlcyB3aGVuIGJvdGggVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSIGFuZCAgICAgICAgICAgICAgICovCi0gIC8qIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HIGFyZSBkZWZpbmVkLiAgVGhpcyBpcyBvbmx5IHVzZWQgICAqLwotICAvKiBkdXJpbmcgZGVidWdnaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRlRfREVCVUdfSE9PS19VTlBBVEVOVEVEX0hJTlRJTkcgIDEKLQotCi0gIHR5cGVkZWYgdm9pZCAgKCpGVF9CaXRtYXBfTGNkRmlsdGVyRnVuYykoIEZUX0JpdG1hcCogICAgICBiaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICByZW5kZXJfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTGlicmFyeSAgICAgIGxpYnJhcnkgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0xpYnJhcnlSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBGcmVlVHlwZSBsaWJyYXJ5IGNsYXNzLiAgVGhpcyBpcyB0aGUgcm9vdCBvZiBhbGwgRnJlZVR5cGUgICAgICAqLwotICAvKiAgICBkYXRhLiAgVXNlIEZUX05ld19MaWJyYXJ5KCkgdG8gY3JlYXRlIGEgbGlicmFyeSBvYmplY3QsIGFuZCAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9MaWJyYXJ5KCkgdG8gZGlzY2FyZCBpdCBhbmQgYWxsIGNoaWxkIG9iamVjdHMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgICAgICAgICA6OiBUaGUgbGlicmFyeSdzIG1lbW9yeSBvYmplY3QuICBNYW5hZ2VzIG1lbW9yeSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVyc2lvbl9tYWpvciAgICA6OiBUaGUgbWFqb3IgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGxpYnJhcnkuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJzaW9uX21pbm9yICAgIDo6IFRoZSBtaW5vciB2ZXJzaW9uIG51bWJlciBvZiB0aGUgbGlicmFyeS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnNpb25fcGF0Y2ggICAgOjogVGhlIGN1cnJlbnQgcGF0Y2ggbGV2ZWwgb2YgdGhlIGxpYnJhcnkuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX21vZHVsZXMgICAgICA6OiBUaGUgbnVtYmVyIG9mIG1vZHVsZXMgY3VycmVudGx5IHJlZ2lzdGVyZWQgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgd2l0aGluIHRoaXMgbGlicmFyeS4gIFRoaXMgaXMgc2V0IHRvIDAgZm9yIG5ldyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcy4gIE5ldyBtb2R1bGVzIGFyZSBhZGRlZCB0aHJvdWdoIHRoZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBGVF9BZGRfTW9kdWxlKCkgQVBJIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtb2R1bGVzICAgICAgICAgIDo6IEEgdGFibGUgdXNlZCB0byBzdG9yZSBoYW5kbGVzIHRvIHRoZSBjdXJyZW50bHkgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkIG1vZHVsZXMuIE5vdGUgdGhhdCBlYWNoIGZvbnQgZHJpdmVyICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgYSBsaXN0IG9mIGl0cyBvcGVuZWQgZmFjZXMuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVuZGVyZXJzICAgICAgICA6OiBUaGUgbGlzdCBvZiByZW5kZXJlcnMgY3VycmVudGx5IHJlZ2lzdGVyZWQgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgd2l0aGluIHRoZSBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY3VyX3JlbmRlcmVyICAgICA6OiBUaGUgY3VycmVudCBvdXRsaW5lIHJlbmRlcmVyLiAgVGhpcyBpcyBhICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRjdXQgdXNlZCB0byBhdm9pZCBwYXJzaW5nIHRoZSBsaXN0IG9uICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggY2FsbCB0byBGVF9PdXRsaW5lX1JlbmRlcigpLiAgSXQgaXMgYSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgdG8gdGhlIGN1cnJlbnQgcmVuZGVyZXIgZm9yIHRoZSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgRlRfR0xZUEhfRk9STUFUX09VVExJTkUgZm9ybWF0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXV0b19oaW50ZXIgICAgICA6OiBYWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXJfcG9vbCAgICAgIDo6IFRoZSByYXN0ZXIgb2JqZWN0J3MgcmVuZGVyIHBvb2wuICBUaGlzIGNhbiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBpZGVhbGx5IGJlIGNoYW5nZWQgZHluYW1pY2FsbHkgYXQgcnVuLXRpbWUuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYXN0ZXJfcG9vbF9zaXplIDo6IFRoZSBzaXplIG9mIHRoZSByZW5kZXIgcG9vbCBpbiBieXRlcy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlYnVnX2hvb2tzICAgICAgOjogWFhYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGNkX2ZpbHRlciAgICAgICA6OiBJZiBzdWJwaXhlbCByZW5kZXJpbmcgaXMgYWN0aXZhdGVkLCB0aGUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQgTENEIGZpbHRlciBtb2RlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGNkX2V4dHJhICAgICAgICA6OiBJZiBzdWJwaXhlbCByZW5kZXJpbmcgaXMgYWN0aXZhdGVkLCB0aGUgbnVtYmVyICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgb2YgZXh0cmEgcGl4ZWxzIG5lZWRlZCBmb3IgdGhlIExDRCBmaWx0ZXIuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGNkX3dlaWdodHMgICAgICA6OiBJZiBzdWJwaXhlbCByZW5kZXJpbmcgaXMgYWN0aXZhdGVkLCB0aGUgTENEICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyIHdlaWdodHMsIGlmIGFueS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGNkX2ZpbHRlcl9mdW5jICA6OiBJZiBzdWJwaXhlbCByZW5kZXJpbmcgaXMgYWN0aXZhdGVkLCB0aGUgTENEICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyaW5nIGNhbGxiYWNrIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGljX2NvbnRhaW5lciAgICA6OiBDb250YWlucyBnbG9iYWwgc3RydWN0cyBhbmQgdGFibGVzLCBpbnN0ZWFkICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgb2YgZGVmaW5pbmcgdGhlbSBnbG9iYWxsbHkuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVmY291bnQgICAgICAgICA6OiBBIGNvdW50ZXIgaW5pdGlhbGl6ZWQgdG9+MSBhdCB0aGUgdGltZSBhbiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgQEZUX0xpYnJhcnkgc3RydWN0dXJlIGlzIGNyZWF0ZWQuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIEBGVF9SZWZlcmVuY2VfTGlicmFyeSBpbmNyZW1lbnRzIHRoaXMgY291bnRlciwgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBhbmQgQEZUX0RvbmVfTGlicmFyeSBvbmx5IGRlc3Ryb3lzIGEgbGlicmFyeSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGNvdW50ZXIgaXN+MSwgb3RoZXJ3aXNlIGl0IHNpbXBseSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgIGRlY3JlbWVudHMgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9MaWJyYXJ5UmVjXwotICB7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeTsgICAgICAgICAgIC8qIGxpYnJhcnkncyBtZW1vcnkgbWFuYWdlciAqLwotCi0gICAgRlRfSW50ICAgICAgICAgICAgIHZlcnNpb25fbWFqb3I7Ci0gICAgRlRfSW50ICAgICAgICAgICAgIHZlcnNpb25fbWlub3I7Ci0gICAgRlRfSW50ICAgICAgICAgICAgIHZlcnNpb25fcGF0Y2g7Ci0KLSAgICBGVF9VSW50ICAgICAgICAgICAgbnVtX21vZHVsZXM7Ci0gICAgRlRfTW9kdWxlICAgICAgICAgIG1vZHVsZXNbRlRfTUFYX01PRFVMRVNdOyAgLyogbW9kdWxlIG9iamVjdHMgICovCi0KLSAgICBGVF9MaXN0UmVjICAgICAgICAgcmVuZGVyZXJzOyAgICAgICAgLyogbGlzdCBvZiByZW5kZXJlcnMgICAgICAgICovCi0gICAgRlRfUmVuZGVyZXIgICAgICAgIGN1cl9yZW5kZXJlcjsgICAgIC8qIGN1cnJlbnQgb3V0bGluZSByZW5kZXJlciAqLwotICAgIEZUX01vZHVsZSAgICAgICAgICBhdXRvX2hpbnRlcjsKLQotICAgIEZUX0J5dGUqICAgICAgICAgICByYXN0ZXJfcG9vbDsgICAgICAvKiBzY2FuLWxpbmUgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW5kZXIgcG9vbCAgICAgICAgICAqLwotICAgIEZUX1VMb25nICAgICAgICAgICByYXN0ZXJfcG9vbF9zaXplOyAvKiBzaXplIG9mIHJlbmRlciBwb29sIGluIGJ5dGVzICovCi0KLSAgICBGVF9EZWJ1Z0hvb2tfRnVuYyAgZGVidWdfaG9va3NbNF07Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORwotICAgIEZUX0xjZEZpbHRlciAgICAgICAgICAgICBsY2RfZmlsdGVyOwotICAgIEZUX0ludCAgICAgICAgICAgICAgICAgICBsY2RfZXh0cmE7ICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgcGl4ZWxzICovCi0gICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgIGxjZF93ZWlnaHRzWzddOyAgIC8qIGZpbHRlciB3ZWlnaHRzLCBpZiBhbnkgKi8KLSAgICBGVF9CaXRtYXBfTGNkRmlsdGVyRnVuYyAgbGNkX2ZpbHRlcl9mdW5jOyAgLyogZmlsdGVyaW5nIGNhbGxiYWNrICAgICAqLwotI2VuZGlmCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotICAgIEZUX1BJQ19Db250YWluZXIgICBwaWNfY29udGFpbmVyOwotI2VuZGlmCi0KLSAgICBGVF9JbnQgICAgICAgICAgICAgcmVmY291bnQ7Ci0KLSAgfSBGVF9MaWJyYXJ5UmVjOwotCi0KLSAgRlRfQkFTRSggRlRfUmVuZGVyZXIgKQotICBGVF9Mb29rdXBfUmVuZGVyZXIoIEZUX0xpYnJhcnkgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaF9Gb3JtYXQgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9MaXN0Tm9kZSogICAgIG5vZGUgKTsKLQotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX1JlbmRlcl9HbHlwaF9JbnRlcm5hbCggRlRfTGlicmFyeSAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIHJlbmRlcl9tb2RlICk7Ci0KLSAgdHlwZWRlZiBjb25zdCBjaGFyKgotICAoKkZUX0ZhY2VfR2V0UG9zdHNjcmlwdE5hbWVGdW5jKSggRlRfRmFjZSAgZmFjZSApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9GYWNlX0dldEdseXBoTmFtZUZ1bmMpKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBidWZmZXJfbWF4ICk7Ci0KLSAgdHlwZWRlZiBGVF9VSW50Ci0gICgqRlRfRmFjZV9HZXRHbHlwaE5hbWVJbmRleEZ1bmMpKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyaW5nKiAgZ2x5cGhfbmFtZSApOwotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9OT19ERUZBVUxUX1NZU1RFTQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX05ld19NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENyZWF0ZXMgYSBuZXcgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgcG9pbnRlciB0byB0aGUgbmV3IG1lbW9yeSBvYmplY3QuICAwIGluIGNhc2Ugb2YgZXJyb3IuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfTWVtb3J5ICkKLSAgRlRfTmV3X01lbW9yeSggdm9pZCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfRG9uZV9NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGlzY2FyZHMgbWVtb3J5IG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5IDo6IEEgaGFuZGxlIHRvIHRoZSBtZW1vcnkgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgRlRfRG9uZV9NZW1vcnkoIEZUX01lbW9yeSAgbWVtb3J5ICk7Ci0KLSNlbmRpZiAvKiAhRlRfQ09ORklHX09QVElPTl9OT19ERUZBVUxUX1NZU1RFTSAqLwotCi0KLSAgLyogRGVmaW5lIGRlZmF1bHQgcmFzdGVyJ3MgaW50ZXJmYWNlLiAgVGhlIGRlZmF1bHQgcmFzdGVyIGlzIGxvY2F0ZWQgaW4gICovCi0gIC8qIGBzcmMvYmFzZS9mdHJhc3Rlci5jJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ2xpZW50IGFwcGxpY2F0aW9ucyBjYW4gcmVnaXN0ZXIgbmV3IHJhc3RlcnMgdGhyb3VnaCB0aGUgICAgICAgICAgICAgICovCi0gIC8qIEZUX1NldF9SYXN0ZXIoKSBBUEkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZuZGVmIEZUX05PX0RFRkFVTFRfUkFTVEVSCi0gIEZUX0VYUE9SVF9WQVIoIEZUX1Jhc3Rlcl9GdW5jcyApICBmdF9kZWZhdWx0X3Jhc3RlcjsKLSNlbmRpZgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICBQIEkgQyAgIFMgVSBQIFAgTyBSIFQgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogUElDIHN1cHBvcnQgbWFjcm9zIGZvciBmdGltYWdlLmggKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9PVVRMSU5FX0ZVTkNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBGVF9PdXRsaW5lX0Z1bmNzIHN0cnVjdC4gICAgICAgICAqLwotICAvKiAgICBXaGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQgYW4gaW5pdCBmdW50aW9uIHdpbGwgbmVlZCB0byAgKi8KLSAgLyogICAgYmUgY2FsbGVkIHdpdGggYSBwcmUtYWxsb2NhdGVkIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQuICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgbm90IGRlZmluZWQgdGhlIHN0cnVjdCB3aWxsIGJlICAgICAgICAqLwotICAvKiAgICBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZSAob3IgdGhlIHNjb3BlIHdoZXJlIHRoZSBtYWNybyAgICAgICAgKi8KLSAgLyogICAgaXMgdXNlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFRklORV9PVVRMSU5FX0ZVTkNTKCAgICAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBtb3ZlX3RvXywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbGluZV90b18sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNvbmljX3RvXywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjdWJpY190b18sICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2hpZnRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRlbHRhXyApICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIGNvbnN0ICBGVF9PdXRsaW5lX0Z1bmNzIGNsYXNzXyA9ICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIG1vdmVfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaW5lX3RvXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uaWNfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGN1YmljX3RvXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzaGlmdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZGVsdGFfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9PVVRMSU5FX0ZVTkNTKCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG1vdmVfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbGluZV90b18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjb25pY190b18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGN1YmljX3RvXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2hpZnRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkZWx0YV8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEluaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfT3V0bGluZV9GdW5jcyogIGNsYXp6ICkgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5tb3ZlX3RvICA9IG1vdmVfdG9fOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmxpbmVfdG8gID0gbGluZV90b187ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Y29uaWNfdG8gPSBjb25pY190b187ICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5jdWJpY190byA9IGN1YmljX3RvXzsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnNoaWZ0ICAgID0gc2hpZnRfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+ZGVsdGEgICAgPSBkZWx0YV87ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9SQVNURVJfRlVOQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBGVF9SYXN0ZXJfRnVuY3Mgc3RydWN0LiAgICAgICAgICAqLwotICAvKiAgICBXaGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQgYW4gaW5pdCBmdW50aW9uIHdpbGwgbmVlZCB0byAgKi8KLSAgLyogICAgYmUgY2FsbGVkIHdpdGggYSBwcmUtYWxsb2NhdGVkIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQuICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgbm90IGRlZmluZWQgdGhlIHN0cnVjdCB3aWxsIGJlICAgICAgICAqLwotICAvKiAgICBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZSAob3IgdGhlIHNjb3BlIHdoZXJlIHRoZSBtYWNybyAgICAgICAgKi8KLSAgLyogICAgaXMgdXNlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFRklORV9SQVNURVJfRlVOQ1MoICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdseXBoX2Zvcm1hdF8sICAgICAgICAgICBcCi0gICAgICAgICAgcmFzdGVyX25ld18sICAgICAgICAgICAgIFwKLSAgICAgICAgICByYXN0ZXJfcmVzZXRfLCAgICAgICAgICAgXAotICAgICAgICAgIHJhc3Rlcl9zZXRfbW9kZV8sICAgICAgICBcCi0gICAgICAgICAgcmFzdGVyX3JlbmRlcl8sICAgICAgICAgIFwKLSAgICAgICAgICByYXN0ZXJfZG9uZV8gKSAgICAgICAgICAgXAotICBjb25zdCBGVF9SYXN0ZXJfRnVuY3MgIGNsYXNzXyA9ICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnbHlwaF9mb3JtYXRfLCAgICAgICAgICAgICAgICAgXAotICAgIHJhc3Rlcl9uZXdfLCAgICAgICAgICAgICAgICAgICBcCi0gICAgcmFzdGVyX3Jlc2V0XywgICAgICAgICAgICAgICAgIFwKLSAgICByYXN0ZXJfc2V0X21vZGVfLCAgICAgICAgICAgICAgXAotICAgIHJhc3Rlcl9yZW5kZXJfLCAgICAgICAgICAgICAgICBcCi0gICAgcmFzdGVyX2RvbmVfICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfUkFTVEVSX0ZVTkNTKCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2x5cGhfZm9ybWF0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJhc3Rlcl9uZXdfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByYXN0ZXJfcmVzZXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmFzdGVyX3NldF9tb2RlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJhc3Rlcl9yZW5kZXJfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByYXN0ZXJfZG9uZV8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX1Jhc3Rlcl9GdW5jcyogIGNsYXp6ICkgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdseXBoX2Zvcm1hdCAgICA9IGdseXBoX2Zvcm1hdF87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5yYXN0ZXJfbmV3ICAgICAgPSByYXN0ZXJfbmV3XzsgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cmFzdGVyX3Jlc2V0ICAgID0gcmFzdGVyX3Jlc2V0XzsgICAgICAgICAgICBcCi0gICAgY2xhenotPnJhc3Rlcl9zZXRfbW9kZSA9IHJhc3Rlcl9zZXRfbW9kZV87ICAgICAgICAgXAotICAgIGNsYXp6LT5yYXN0ZXJfcmVuZGVyICAgPSByYXN0ZXJfcmVuZGVyXzsgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cmFzdGVyX2RvbmUgICAgID0gcmFzdGVyX2RvbmVfOyAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQotICAvKiBQSUMgc3VwcG9ydCBtYWNyb3MgZm9yIGZ0cmVuZGVyLmggKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9HTFlQSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZWQgdG8gaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBGVF9HbHlwaF9DbGFzcyBzdHJ1Y3QuICAgICAgICAgICAqLwotICAvKiAgICBXaGVuIEZUX0NPTkZJR19PUFRJT05fUElDIGlzIGRlZmluZWQgYW4gaW5pdCBmdW50aW9uIHdpbGwgbmVlZCB0byAgKi8KLSAgLyogICAgYmUgY2FsbGVkIHdpdGggYSBwcmUtYWxsb2NhdGVkIHN0Y3R1cmUgdG8gYmUgZmlsbGVkLiAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgbm90IGRlZmluZWQgdGhlIHN0cnVjdCB3aWxsIGJlICAgICAgICAqLwotICAvKiAgICBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZSAob3IgdGhlIHNjb3BlIHdoZXJlIHRoZSBtYWNybyAgICAgICAgKi8KLSAgLyogICAgaXMgdXNlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFRklORV9HTFlQSCggICAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzaXplXywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZm9ybWF0XywgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lXywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY29weV8sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHRyYW5zZm9ybV8sICAgICAgICAgICAgIFwKLSAgICAgICAgICBiYm94XywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcHJlcGFyZV8gKSAgICAgICAgICAgICAgXAotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYgICAgICAgICAgIFwKLSAgY29uc3QgRlRfR2x5cGhfQ2xhc3MgIGNsYXNzXyA9ICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3JtYXRfLCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb3B5XywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdHJhbnNmb3JtXywgICAgICAgICAgICAgICAgICAgXAotICAgIGJib3hfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmVwYXJlXyAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX0dMWVBIKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzaXplXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmb3JtYXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjb3B5XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB0cmFuc2Zvcm1fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBiYm94XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBwcmVwYXJlXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9HbHlwaF9DbGFzcyogIGNsYXp6ICkgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2x5cGhfc2l6ZSAgICAgID0gc2l6ZV87ICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2x5cGhfZm9ybWF0ICAgID0gZm9ybWF0XzsgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2x5cGhfaW5pdCAgICAgID0gaW5pdF87ICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2x5cGhfZG9uZSAgICAgID0gZG9uZV87ICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2x5cGhfY29weSAgICAgID0gY29weV87ICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2x5cGhfdHJhbnNmb3JtID0gdHJhbnNmb3JtXzsgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2x5cGhfYmJveCAgICAgID0gYmJveF87ICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2x5cGhfcHJlcGFyZSAgID0gcHJlcGFyZV87ICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFQ0xBUkVfUkVOREVSRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZWQgdG8gY3JlYXRlIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBhICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9SZW5kZXJlcl9DbGFzcyBzdHJ1Y3QgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ERUZJTkVfUkVOREVSRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2VkIHRvIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgRlRfUmVuZGVyZXJfQ2xhc3Mgc3RydWN0LiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgZGVmaW5lZCBhIGBjcmVhdGUnIGZ1bnRpb24gd2lsbCBuZWVkICAqLwotICAvKiAgICB0byBiZSBjYWxsZWQgd2l0aCBhIHBvaW50ZXIgd2hlcmUgdGhlIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgaXMgICAgICAgKi8KLSAgLyogICAgcmV0dXJuZWQuICBBbmQgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkIGEgYGRlc3Ryb3knIGZ1bmN0aW9uICAgICovCi0gIC8qICAgIG5lZWRzIHRvIGJlIGNhbGxlZCB0byByZWxlYXNlIHRoYXQgYWxsb2NhdGlvbi4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBgZmNpbml0LmMnIChmdF9jcmVhdGVfZGVmYXVsdF9tb2R1bGVfY2xhc3NlcykgYWxyZWFkeSBjb250YWlucyAgICAgKi8KLSAgLyogICAgYSBtZWNoYW5pc20gdG8gY2FsbCB0aGVzZSBmdW5jdGlvbnMgZm9yIHRoZSBkZWZhdWx0IG1vZHVsZXMgICAgICAgICovCi0gIC8qICAgIGRlc2NyaWJlZCBpbiBgZnRtb2R1bGUuaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90aWNlIHRoYXQgdGhlIGNyZWF0ZWQgYGNyZWF0ZScgYW5kIGBkZXN0cm95JyBmdW5jdGlvbnMgY2FsbCAgICAgICovCi0gIC8qICAgIGBwaWNfaW5pdCcgYW5kIGBwaWNfZnJlZScgdG8gYWxsb3cgeW91IHRvIG1hbnVhbGx5IGFsbG9jYXRlIGFuZCAgICAqLwotICAvKiAgICBpbml0aWFsaXplIGFueSBhZGRpdGlvbmFsIGdsb2JhbCBkYXRhLCBsaWtlIGEgbW9kdWxlIHNwZWNpZmljICAgICAgKi8KLSAgLyogICAgaW50ZXJmYWNlLCBhbmQgcHV0IHRoZW0gaW4gdGhlIGdsb2JhbCBwaWMgY29udGFpbmVyIGRlZmluZWQgaW4gICAgICovCi0gIC8qICAgIGBmdHBpYy5oJy4gIElmIHlvdSBkb24ndCBuZWVkIHRoZW0ganVzdCBpbXBsZW1lbnQgdGhlIGZ1bmN0aW9ucyBhcyAqLwotICAvKiAgICBlbXB0eSB0byByZXNvbHZlIHRoZSBsaW5rIGVycm9yLiAgQWxzbyB0aGUgYHBpY19pbml0JyBhbmQgICAgICAgICAgKi8KLSAgLyogICAgYHBpY19mcmVlJyBmdW5jdGlvbnMgc2hvdWxkIGJlIGRlY2xhcmVkIGluIGBwaWMuaCcsIHRvIGJlIHJlZmVycmVkICovCi0gIC8qICAgIGJ5IHRoZSByZW5kZXJlciBkZWZpbml0aW9uIGNhbGxpbmcgYEZUX0RFRklORV9SRU5ERVJFUicgaW4gdGhlICAgICAqLwotICAvKiAgICBmb2xsb3dpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgbm90IGRlZmluZWQgdGhlIHN0cnVjdCB3aWxsIGJlICAgICAgICAqLwotICAvKiAgICBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZSAob3IgdGhlIHNjb3BlIHdoZXJlIHRoZSBtYWNybyAgICAgICAgKi8KLSAgLyogICAgaXMgdXNlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFQ0xBUkVfUkVOREVSRVIoIGNsYXNzXyApICAgICAgICAgICAgICAgXAotICBGVF9FWFBPUlRfVkFSKCBjb25zdCBGVF9SZW5kZXJlcl9DbGFzcyApIGNsYXNzXzsKLQotI2RlZmluZSBGVF9ERUZJTkVfUkVOREVSRVIoICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZsYWdzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG5hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHZlcnNpb25fLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlcXVpcmVzXywgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9pbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdseXBoX2Zvcm1hdF8sICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlbmRlcl9nbHlwaF8sICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHRyYW5zZm9ybV9nbHlwaF8sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9nbHlwaF9jYm94XywgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNldF9tb2RlXywgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJhc3Rlcl9jbGFzc18gKSAgICAgICAgICAgICAgICAgICAgXAotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBGVF9SZW5kZXJlcl9DbGFzcyAgY2xhc3NfID0gICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0RFRklORV9ST09UX01PRFVMRSggZmxhZ3NfLCAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV8sICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbl8sICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXNfLCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlXywgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF8sICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZV8sICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2ludGVyZmFjZV8gKSAgXAotICAgIGdseXBoX2Zvcm1hdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJlbmRlcl9nbHlwaF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRyYW5zZm9ybV9nbHlwaF8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF9nbHlwaF9jYm94XywgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNldF9tb2RlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJhc3Rlcl9jbGFzc18gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFQ0xBUkVfUkVOREVSRVIoIGNsYXNzXyApICBGVF9ERUNMQVJFX01PRFVMRSggY2xhc3NfICkKLQotI2RlZmluZSBGVF9ERUZJTkVfUkVOREVSRVIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmbGFnc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB2ZXJzaW9uXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlcXVpcmVzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X2ludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnbHlwaF9mb3JtYXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlbmRlcl9nbHlwaF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgdHJhbnNmb3JtX2dseXBoXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfZ2x5cGhfY2JveF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNldF9tb2RlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgcmFzdGVyX2NsYXNzXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9EZXN0cm95X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnksICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTW9kdWxlX0NsYXNzKiAgY2xhenogKSAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1JlbmRlcmVyX0NsYXNzKiAgcmNsYXp6ID0gKEZUX1JlbmRlcmVyX0NsYXNzKiljbGF6ejsgICAgICBcCi0gICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhc3NfICMjIF9waWNfZnJlZSggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIHJjbGF6eiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRlJFRSggcmNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfQ3JlYXRlX0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICBsaWJyYXJ5LCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTW9kdWxlX0NsYXNzKiogIG91dHB1dF9jbGFzcyApICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9SZW5kZXJlcl9DbGFzcyogIGNsYXp6ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBGVF9BTExPQyggY2xhenosIHNpemVvZiAoICpjbGF6eiApICkgKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZXJyb3IgPSBjbGFzc18gIyMgX3BpY19pbml0KCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGVycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GUkVFKCBjbGF6eiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9ERUZJTkVfUk9PVF9NT0RVTEUoIGZsYWdzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb25fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZXNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfaW50ZXJmYWNlXyApICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nbHlwaF9mb3JtYXQgICAgPSBnbHlwaF9mb3JtYXRfOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cmVuZGVyX2dseXBoICAgID0gcmVuZGVyX2dseXBoXzsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT50cmFuc2Zvcm1fZ2x5cGggPSB0cmFuc2Zvcm1fZ2x5cGhfOyAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9nbHlwaF9jYm94ICA9IGdldF9nbHlwaF9jYm94XzsgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+c2V0X21vZGUgICAgICAgID0gc2V0X21vZGVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnJhc3Rlcl9jbGFzcyAgICA9IHJhc3Rlcl9jbGFzc187ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICpvdXRwdXRfY2xhc3MgPSAoRlRfTW9kdWxlX0NsYXNzKiljbGF6ejsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLSAgLyogUElDIHN1cHBvcnQgbWFjcm9zIGZvciBmdG1vZGFwaS5oICoqLwotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX01vZHVsZV9DcmVhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBjcmVhdGUgKGFsbG9jYXRlKSBhIG5ldyBtb2R1bGUgY2xhc3Mgb2JqZWN0LiAgICAqLwotICAvKiAgICBUaGUgb2JqZWN0J3MgbWVtYmVycyBhcmUgaW5pdGlhbGl6ZWQsIGJ1dCB0aGUgbW9kdWxlIGl0c2VsZiBpcyAgICAgKi8KLSAgLyogICAgbm90LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBtZW1vcnkgbWFuYWdlci4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG91dHB1dF9jbGFzcyA6OiBJbml0aWFsaXplZCB3aXRoIHRoZSBuZXdseSBhbGxvY2F0ZWQgY2xhc3MuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX01vZHVsZV9DcmVhdG9yKSggRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZV9DbGFzcyoqICBvdXRwdXRfY2xhc3MgKTsKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGVfRGVzdHJveWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGZ1bmN0aW9uIHVzZWQgdG8gZGVzdHJveSAoZGVhbGxvY2F0ZSkgYSBtb2R1bGUgY2xhc3Mgb2JqZWN0LiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgOjogQSBoYW5kbGUgdG8gdGhlIG1lbW9yeSBtYW5hZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2xhenogIDo6IE1vZHVsZSBjbGFzcyB0byBkZXN0cm95LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpGVF9Nb2R1bGVfRGVzdHJveWVyKSggRlRfTWVtb3J5ICAgICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGVfQ2xhc3MqICBjbGF6eiApOwotCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE1hY3JvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFQ0xBUkVfTU9EVUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZWQgdG8gY3JlYXRlIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBhICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9Nb2R1bGVfQ2xhc3Mgc3RydWN0IGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ERUZJTkVfTU9EVUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2VkIHRvIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgYW4gRlRfTW9kdWxlX0NsYXNzIHN0cnVjdC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgZGVmaW5lZCBhIGBjcmVhdGUnIGZ1bnRpb24gbmVlZHMgdG8gICAqLwotICAvKiAgICBiZSBjYWxsZWQgd2l0aCBhIHBvaW50ZXIgd2hlcmUgdGhlIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgaXMgICAgICAgICAgKi8KLSAgLyogICAgcmV0dXJuZWQuICBBbmQgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkIGEgYGRlc3Ryb3knIGZ1bmN0aW9uICAgICovCi0gIC8qICAgIG5lZWRzIHRvIGJlIGNhbGxlZCB0byByZWxlYXNlIHRoYXQgYWxsb2NhdGlvbi4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBgZmNpbml0LmMnIChmdF9jcmVhdGVfZGVmYXVsdF9tb2R1bGVfY2xhc3NlcykgYWxyZWFkeSBjb250YWlucyAgICAgKi8KLSAgLyogICAgYSBtZWNoYW5pc20gdG8gY2FsbCB0aGVzZSBmdW5jdGlvbnMgZm9yIHRoZSBkZWZhdWx0IG1vZHVsZXMgICAgICAgICovCi0gIC8qICAgIGRlc2NyaWJlZCBpbiBgZnRtb2R1bGUuaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm90aWNlIHRoYXQgdGhlIGNyZWF0ZWQgYGNyZWF0ZScgYW5kIGBkZXN0cm95JyBmdW5jdGlvbnMgY2FsbCAgICAgICovCi0gIC8qICAgIGBwaWNfaW5pdCcgYW5kIGBwaWNfZnJlZScgdG8gYWxsb3cgeW91IHRvIG1hbnVhbGx5IGFsbG9jYXRlIGFuZCAgICAqLwotICAvKiAgICBpbml0aWFsaXplIGFueSBhZGRpdGlvbmFsIGdsb2JhbCBkYXRhLCBsaWtlIGEgbW9kdWxlIHNwZWNpZmljICAgICAgKi8KLSAgLyogICAgaW50ZXJmYWNlLCBhbmQgcHV0IHRoZW0gaW4gdGhlIGdsb2JhbCBwaWMgY29udGFpbmVyIGRlZmluZWQgaW4gICAgICovCi0gIC8qICAgIGBmdHBpYy5oJy4gIElmIHlvdSBkb24ndCBuZWVkIHRoZW0ganVzdCBpbXBsZW1lbnQgdGhlIGZ1bmN0aW9ucyBhcyAqLwotICAvKiAgICBlbXB0eSB0byByZXNvbHZlIHRoZSBsaW5rIGVycm9yLiAgQWxzbyB0aGUgYHBpY19pbml0JyBhbmQgICAgICAgICAgKi8KLSAgLyogICAgYHBpY19mcmVlJyBmdW5jdGlvbnMgc2hvdWxkIGJlIGRlY2xhcmVkIGluIGBwaWMuaCcsIHRvIGJlIHJlZmVycmVkICovCi0gIC8qICAgIGJ5IHRoZSBtb2R1bGUgZGVmaW5pdGlvbiBjYWxsaW5nIGBGVF9ERUZJTkVfTU9EVUxFJyBpbiB0aGUgICAgICAgICAqLwotICAvKiAgICBmb2xsb3dpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgbm90IGRlZmluZWQgdGhlIHN0cnVjdCB3aWxsIGJlICAgICAgICAqLwotICAvKiAgICBhbGxvY2F0ZWQgaW4gdGhlIGdsb2JhbCBzY29wZSAob3IgdGhlIHNjb3BlIHdoZXJlIHRoZSBtYWNybyAgICAgICAgKi8KLSAgLyogICAgaXMgdXNlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8TWFjcm8+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfREVGSU5FX1JPT1RfTU9EVUxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVXNlZCB0byBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIGFuIEZUX01vZHVsZV9DbGFzcyBzdHJ1Y3QgaW5zaWRlICovCi0gIC8qICAgIGFub3RoZXIgc3RydWN0IHRoYXQgY29udGFpbnMgaXQgb3IgaW4gYSBmdW5jdGlvbiB0aGF0IGluaXRpYWxpemVzICAqLwotICAvKiAgICB0aGF0IGNvbnRhaW5pbmcgc3RydWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVDTEFSRV9NT0RVTEUoIGNsYXNzXyApICBcCi0gIEZUX0NBTExCQUNLX1RBQkxFICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBGVF9Nb2R1bGVfQ2xhc3MgIGNsYXNzXzsKLQotI2RlZmluZSBGVF9ERUZJTkVfUk9PVF9NT0RVTEUoICBcCi0gICAgICAgICAgZmxhZ3NfLCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzaXplXywgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG5hbWVfLCAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgdmVyc2lvbl8sICAgICAgICAgICAgIFwKLSAgICAgICAgICByZXF1aXJlc18sICAgICAgICAgICAgXAotICAgICAgICAgIGludGVyZmFjZV8sICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF8sICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lXywgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9pbnRlcmZhY2VfICkgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmbGFnc18sICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBuYW1lXywgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHZlcnNpb25fLCAgICAgICAgICAgICAgICAgICBcCi0gICAgcmVxdWlyZXNfLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludGVyZmFjZV8sICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X2ludGVyZmFjZV8sICAgICAgICAgICAgIFwKLSAgfSwKLQotI2RlZmluZSBGVF9ERUZJTkVfTU9EVUxFKCAgICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZmxhZ3NfLCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBuYW1lXywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgdmVyc2lvbl8sICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlcXVpcmVzXywgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbnRlcmZhY2VfLCAgICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF8sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfaW50ZXJmYWNlXyApICAgICAgICBcCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRiAgICAgICAgICAgXAotICBjb25zdCBGVF9Nb2R1bGVfQ2xhc3MgY2xhc3NfID0gIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmxhZ3NfLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHZlcnNpb25fLCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXF1aXJlc18sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfaW50ZXJmYWNlXywgICAgICAgICAgICAgICBcCi0gIH07Ci0KLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUNMQVJFX01PRFVMRSggY2xhc3NfICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9DcmVhdGVfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgIGxpYnJhcnksICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTW9kdWxlX0NsYXNzKiogIG91dHB1dF9jbGFzcyApOyAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9EZXN0cm95X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnksICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZV9DbGFzcyogIGNsYXp6ICk7Ci0KLSNkZWZpbmUgRlRfREVGSU5FX1JPT1RfTU9EVUxFKCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZmxhZ3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBuYW1lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgdmVyc2lvbl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlcXVpcmVzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfaW50ZXJmYWNlXyApICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnJvb3QubW9kdWxlX2ZsYWdzICAgICA9IGZsYWdzXzsgICAgICAgICAgXAotICAgIGNsYXp6LT5yb290Lm1vZHVsZV9zaXplICAgICAgPSBzaXplXzsgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cm9vdC5tb2R1bGVfbmFtZSAgICAgID0gbmFtZV87ICAgICAgICAgICBcCi0gICAgY2xhenotPnJvb3QubW9kdWxlX3ZlcnNpb24gICA9IHZlcnNpb25fOyAgICAgICAgXAotICAgIGNsYXp6LT5yb290Lm1vZHVsZV9yZXF1aXJlcyAgPSByZXF1aXJlc187ICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnJvb3QubW9kdWxlX2ludGVyZmFjZSA9IGludGVyZmFjZV87ICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cm9vdC5tb2R1bGVfaW5pdCAgICAgID0gaW5pdF87ICAgICAgICAgICBcCi0gICAgY2xhenotPnJvb3QubW9kdWxlX2RvbmUgICAgICA9IGRvbmVfOyAgICAgICAgICAgXAotICAgIGNsYXp6LT5yb290LmdldF9pbnRlcmZhY2UgICAgPSBnZXRfaW50ZXJmYWNlXzsKLQotI2RlZmluZSBGVF9ERUZJTkVfTU9EVUxFKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmbGFnc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB2ZXJzaW9uXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlcXVpcmVzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvbmVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X2ludGVyZmFjZV8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9EZXN0cm95X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnksICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTW9kdWxlX0NsYXNzKiAgY2xhenogKSAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXNzXyAjIyBfcGljX2ZyZWUoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBjbGF6eiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgbGlicmFyeSwgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZV9DbGFzcyoqICBvdXRwdXRfY2xhc3MgKSAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9Nb2R1bGVfQ2xhc3MqICBjbGF6eiAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0Vycm9yICAgICAgICAgIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggRlRfQUxMT0MoIGNsYXp6LCBzaXplb2YgKCAqY2xhenogKSApICkgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlcnJvciA9IGNsYXNzXyAjIyBfcGljX2luaXQoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggZXJyb3IgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5tb2R1bGVfZmxhZ3MgICAgID0gZmxhZ3NfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPm1vZHVsZV9zaXplICAgICAgPSBzaXplXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bW9kdWxlX25hbWUgICAgICA9IG5hbWVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5tb2R1bGVfdmVyc2lvbiAgID0gdmVyc2lvbl87ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPm1vZHVsZV9yZXF1aXJlcyAgPSByZXF1aXJlc187ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5tb2R1bGVfaW50ZXJmYWNlID0gaW50ZXJmYWNlXzsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bW9kdWxlX2luaXQgICAgICA9IGluaXRfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5tb2R1bGVfZG9uZSAgICAgID0gZG9uZV87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9pbnRlcmZhY2UgICAgPSBnZXRfaW50ZXJmYWNlXzsgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICpvdXRwdXRfY2xhc3MgPSBjbGF6ejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRPQkpTX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHBpYy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHBpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjkxNTRmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRwaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cGljLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyAoZGVjbGFyYXRpb24pLiAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgTW9kdWxlcyB0aGF0IG9yZGluYXJpbHkgaGF2ZSBjb25zdCBnbG9iYWwgZGF0YSB0aGF0IG5lZWQgYWRkcmVzcyAgICAgKi8KLSAgLyogIGNhbiBpbnN0ZWFkIGRlZmluZSBwb2ludGVycyBoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRQSUNfSF9fCi0jZGVmaW5lIF9fRlRQSUNfSF9fCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9QSUNfQ29udGFpbmVyXwotICB7Ci0gICAgLyogcGljIGNvbnRhaW5lcnMgZm9yIGJhc2UgKi8KLSAgICB2b2lkKiAgYmFzZTsKLQotICAgIC8qIHBpYyBjb250YWluZXJzIGZvciBtb2R1bGVzICovCi0gICAgdm9pZCogIGF1dG9maXQ7Ci0gICAgdm9pZCogIGNmZjsKLSAgICB2b2lkKiAgcHNoaW50ZXI7Ci0gICAgdm9pZCogIHBzbmFtZXM7Ci0gICAgdm9pZCogIHJhc3RlcjsKLSAgICB2b2lkKiAgc2ZudDsKLSAgICB2b2lkKiAgc21vb3RoOwotICAgIHZvaWQqICB0cnVldHlwZTsKLQotICB9IEZUX1BJQ19Db250YWluZXI7Ci0KLQotICAvKiBJbml0aWFsaXplIHRoZSB2YXJpb3VzIGZ1bmN0aW9uIHRhYmxlcywgc3RydWN0cywgZXRjLiAqLwotICAvKiBzdG9yZWQgaW4gdGhlIGNvbnRhaW5lci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIGZ0X3BpY19jb250YWluZXJfaW5pdCggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0KLSAgLyogRGVzdHJveSB0aGUgY29udGVudHMgb2YgdGhlIGNvbnRhaW5lci4gKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIGZ0X3BpY19jb250YWluZXJfZGVzdHJveSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotIC8qICovCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRQSUNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0cmZvcmsuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRyZm9yay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTYxY2E3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRyZm9yay5oCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cmZvcmsuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBFbWJlZGRlZCByZXNvdXJjZSBmb3JrcyBhY2Nlc3NvciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTWFzYXRha2UgWUFNQVRPIGFuZCBSZWRoYXQgSy5LLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBEZXZlbG9wbWVudCBvZiB0aGUgY29kZSBpbiB0aGlzIGZpbGUgaXMgc3VwcG9ydCBvZiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSW5mb3JtYXRpb24tdGVjaG5vbG9neSBQcm9tb3Rpb24gQWdlbmN5LCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUUkZPUktfSF9fCi0jZGVmaW5lIF9fRlRSRk9SS19IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyogTnVtYmVyIG9mIGd1ZXNzaW5nIHJ1bGVzIHN1cHBvcnRlZCBpbiBgRlRfUmFjY2Vzc19HdWVzcycuICAgICAgICAgICAgKi8KLSAgLyogRG9uJ3QgZm9yZ2V0IHRvIGluY3JlbWVudCB0aGUgbnVtYmVyIGlmIHlvdSBhZGQgYSBuZXcgZ3Vlc3NpbmcgcnVsZS4gKi8KLSNkZWZpbmUgRlRfUkFDQ0VTU19OX1JVTEVTICA5Ci0KLQotICAvKiBBIHN0cnVjdHVyZSB0byBkZXNjcmliZSBhIHJlZmVyZW5jZSBpbiBhIHJlc291cmNlIGJ5IGl0cyByZXNvdXJjZSBJRCAqLwotICAvKiBhbmQgaW50ZXJuYWwgb2Zmc2V0LiAgVGhlIGBQT1NUJyByZXNvdXJjZSBleHBlY3RzIHRvIGJlIGNvbmNhdGVuYXRlZCAqLwotICAvKiBieSB0aGUgb3JkZXIgb2YgcmVzb3VyY2UgSURzIGluc3RlYWQgb2YgaXRzIGFwcGVhcmFuY2UgaW4gdGhlIGZpbGUuICAqLwotCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9SRm9ya19SZWZfCi0gIHsKLSAgICBGVF9VU2hvcnQgIHJlc19pZDsKLSAgICBGVF9Mb25nICAgIG9mZnNldDsKLQotICB9IEZUX1JGb3JrX1JlZjsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fR1VFU1NJTkdfRU1CRURERURfUkZPUksKLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKmZ0X3JhY2Nlc3NfZ3Vlc3NfZnVuYykoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnJlc3VsdF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApOwotCi0gIHR5cGVkZWYgZW51bSAgRlRfUkZvcmtfUnVsZV8gewotICAgIEZUX1JGb3JrX1J1bGVfaW52YWxpZCA9IC0yLAotICAgIEZUX1JGb3JrX1J1bGVfdWtub3duLCAvKiAtMSAqLwotICAgIEZUX1JGb3JrX1J1bGVfYXBwbGVfZG91YmxlLAotICAgIEZUX1JGb3JrX1J1bGVfYXBwbGVfc2luZ2xlLAotICAgIEZUX1JGb3JrX1J1bGVfZGFyd2luX3Vmc19leHBvcnQsCi0gICAgRlRfUkZvcmtfUnVsZV9kYXJ3aW5fbmV3dmZzLAotICAgIEZUX1JGb3JrX1J1bGVfZGFyd2luX2hmc3BsdXMsCi0gICAgRlRfUkZvcmtfUnVsZV92ZmF0LAotICAgIEZUX1JGb3JrX1J1bGVfbGludXhfY2FwLAotICAgIEZUX1JGb3JrX1J1bGVfbGludXhfZG91YmxlLAotICAgIEZUX1JGb3JrX1J1bGVfbGludXhfbmV0YXRhbGsKLSAgfSBGVF9SRm9ya19SdWxlOwotCi0gIC8qIEZvciBmYXN0IHRyYW5zbGF0aW9uIGJldHdlZW4gcnVsZSBpbmRleCBhbmQgcnVsZSB0eXBlLAotICAgKiB0aGUgbWFjcm9zIEZUX1JGT1JLX3h4eCBzaG91bGQgYmUga2VwdCBjb25zaXN0ZW50IHdpdGgKLSAgICogdGhlIHJhY2Nlc3NfZ3Vlc3NfZnVuY3MgdGFibGUKLSAgICovCi0gIHR5cGVkZWYgc3RydWN0IGZ0X3JhY2Nlc3NfZ3Vlc3NfcmVjXyB7Ci0gICAgZnRfcmFjY2Vzc19ndWVzc19mdW5jICBmdW5jOwotICAgIEZUX1JGb3JrX1J1bGUgICAgICAgICAgdHlwZTsKLSAgfSBmdF9yYWNjZXNzX2d1ZXNzX3JlYzsKLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0gIC8qIHRoaXMgYXJyYXkgaXMgYSBzdG9yYWdlIGluIG5vbi1QSUMgbW9kZSwgc28gOyBpcyBuZWVkZWQgaW4gRU5EICovCi0jZGVmaW5lIENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfQkVHSU4oIG5hbWUsIHR5cGUgKSAgXAotICAgICAgICAgIHN0YXRpYyBjb25zdCB0eXBlIG5hbWVbXSA9IHsKLSNkZWZpbmUgQ09OU1RfRlRfUkZPUktfUlVMRV9BUlJBWV9FTlRSWSggZnVuY19zdWZmaXgsIHR5cGVfc3VmZml4ICkgIFwKLSAgICAgICAgICB7IHJhY2Nlc3NfZ3Vlc3NfICMjIGZ1bmNfc3VmZml4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEZUX1JGb3JrX1J1bGVfICMjIHR5cGVfc3VmZml4IH0sCi0jZGVmaW5lIENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfRU5EICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gIC8qIHRoaXMgYXJyYXkgaXMgYSBmdW5jdGlvbiBpbiBQSUMgbW9kZSwgc28gbm8gOyBpcyBuZWVkZWQgaW4gRU5EICovCi0jZGVmaW5lIENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfQkVHSU4oIG5hbWUsIHR5cGUgKSAgXAotICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9Jbml0X1RhYmxlXyAjIyBuYW1lKCB0eXBlKiAgc3RvcmFnZSApICAgICBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgdHlwZSogIGxvY2FsID0gc3RvcmFnZTsgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaW50ICBpID0gMDsKLSNkZWZpbmUgQ09OU1RfRlRfUkZPUktfUlVMRV9BUlJBWV9FTlRSWSggZnVuY19zdWZmaXgsIHR5cGVfc3VmZml4ICkgIFwKLSAgICAgICAgICBsb2NhbFtpXS5mdW5jID0gcmFjY2Vzc19ndWVzc18gIyMgZnVuY19zdWZmaXg7ICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2NhbFtpXS50eXBlID0gRlRfUkZvcmtfUnVsZV8gIyMgdHlwZV9zdWZmaXg7ICAgICAgICAgICAgIFwKLSAgICAgICAgICBpKys7Ci0jZGVmaW5lIENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfRU5EICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9HVUVTU0lOR19FTUJFRERFRF9SRk9SSyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFjY2Vzc19HdWVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR3Vlc3MgYSBmaWxlIG5hbWUgYW5kIG9mZnNldCB3aGVyZSB0aGUgYWN0dWFsIHJlc291cmNlIGZvcmsgaXMgICAgICovCi0gIC8qICAgIHN0b3JlZC4gIFRoZSBtYWNybyBGVF9SQUNDRVNTX05fUlVMRVMgaG9sZHMgdGhlIG51bWJlciBvZiAgICAgICAgICAqLwotICAvKiAgICBndWVzc2luZyBydWxlczsgIHRoZSBndWVzc2VkIHJlc3VsdCBmb3IgdGhlIE50aCBydWxlIGlzICAgICAgICAgICAgKi8KLSAgLyogICAgcmVwcmVzZW50ZWQgYXMgYSB0cmlwbGV0OiBhIG5ldyBmaWxlIG5hbWUgKG5ld19uYW1lc1tOXSksIGEgZmlsZSAgICovCi0gIC8qICAgIG9mZnNldCAob2Zmc2V0c1tOXSksIGFuZCBhbiBlcnJvciBjb2RlIChlcnJvcnNbTl0pLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpYnJhcnkgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgRnJlZVR5cGUgbGlicmFyeSBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEEgZmlsZSBzdHJlYW0gY29udGFpbmluZyB0aGUgcmVzb3VyY2UgZm9yay4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2VfbmFtZSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSAoYmFzZSkgZmlsZSBuYW1lIG9mIHRoZSByZXNvdXJjZSBmb3JrIHVzZWQgZm9yIHNvbWUgICAgICAgICAgKi8KLSAgLyogICAgICBndWVzc2luZyBydWxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmV3X25hbWVzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQW4gYXJyYXkgb2YgZ3Vlc3NlZCBmaWxlIG5hbWVzIGluIHdoaWNoIHRoZSByZXNvdXJjZSBmb3JrcyBtYXkgICAqLwotICAvKiAgICAgIGV4aXN0LiAgSWYgYG5ld19uYW1lc1tOXScgaXMgTlVMTCwgdGhlIGd1ZXNzZWQgZmlsZSBuYW1lIGlzICAgICAgKi8KLSAgLyogICAgICBlcXVhbCB0byBgYmFzZV9uYW1lJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvZmZzZXRzIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBbiBhcnJheSBvZiBndWVzc2VkIGZpbGUgb2Zmc2V0cy4gIGBvZmZzZXRzW05dJyBob2xkcyB0aGUgZmlsZSAgICovCi0gIC8qICAgICAgb2Zmc2V0IG9mIHRoZSBwb3NzaWJsZSBzdGFydCBvZiB0aGUgcmVzb3VyY2UgZm9yayBpbiBmaWxlICAgICAgICAqLwotICAvKiAgICAgIGBuZXdfbmFtZXNbTl0nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGVycm9ycyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIEFuIGFycmF5IG9mIEZyZWVUeXBlIGVycm9yIGNvZGVzLiAgYGVycm9yc1tOXScgaXMgdGhlIGVycm9yICAgICAgKi8KLSAgLyogICAgICBjb2RlIG9mIE50aCBndWVzc2luZyBydWxlIGZ1bmN0aW9uLiAgSWYgYGVycm9yc1tOXScgaXMgbm90ICAgICAgICovCi0gIC8qICAgICAgRlRfRXJyX09rLCBgbmV3X25hbWVzW05dJyBhbmQgYG9mZnNldHNbTl0nIGFyZSBtZWFuaW5nbGVzcy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX1JhY2Nlc3NfR3Vlc3MoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICAgYmFzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICBjaGFyKiogICAgICBuZXdfbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgIG9mZnNldHMsCi0gICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgIGVycm9ycyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFjY2Vzc19HZXRfSGVhZGVySW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR2V0IHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBoZWFkZXIgb2YgcmVzb3VyY2UgZm9yay4gIFRoZSAgICAgICAgICovCi0gIC8qICAgIGluZm9ybWF0aW9uIGluY2x1ZGVzIHRoZSBmaWxlIG9mZnNldCB3aGVyZSB0aGUgcmVzb3VyY2UgbWFwICAgICAgICAqLwotICAvKiAgICBzdGFydHMsIGFuZCB0aGUgZmlsZSBvZmZzZXQgd2hlcmUgdGhlIHJlc291cmNlIGRhdGEgc3RhcnRzLiAgICAgICAgKi8KLSAgLyogICAgYEZUX1JhY2Nlc3NfR2V0X0RhdGFPZmZzZXRzJyByZXF1aXJlcyB0aGVzZSB0d28gZGF0YS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGlicmFyeSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBGcmVlVHlwZSBsaWJyYXJ5IGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgQSBmaWxlIHN0cmVhbSBjb250YWluaW5nIHRoZSByZXNvdXJjZSBmb3JrLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmZvcmtfb2Zmc2V0IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGZpbGUgb2Zmc2V0IHdoZXJlIHRoZSByZXNvdXJjZSBmb3JrIHN0YXJ0cy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1hcF9vZmZzZXQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmaWxlIG9mZnNldCB3aGVyZSB0aGUgcmVzb3VyY2UgbWFwIHN0YXJ0cy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJkYXRhX3BvcyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBmaWxlIG9mZnNldCB3aGVyZSB0aGUgcmVzb3VyY2UgZGF0YSBzdGFydHMuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgRlRfRXJyX09rIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfUmFjY2Vzc19HZXRfSGVhZGVySW5mbyggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICByZm9ya19vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKm1hcF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJkYXRhX3BvcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUmFjY2Vzc19HZXRfRGF0YU9mZnNldHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR2V0IHRoZSBkYXRhIG9mZnNldHMgZm9yIGEgdGFnIGluIGEgcmVzb3VyY2UgZm9yay4gIE9mZnNldHMgYXJlICAgICovCi0gIC8qICAgIHN0b3JlZCBpbiBhbiBhcnJheSBiZWNhdXNlLCBpbiBzb21lIGNhc2VzLCByZXNvdXJjZXMgaW4gYSByZXNvdXJjZSAqLwotICAvKiAgICBmb3JrIGhhdmUgdGhlIHNhbWUgdGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsaWJyYXJ5IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIEZyZWVUeXBlIGxpYnJhcnkgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGZpbGUgc3RyZWFtIGNvbnRhaW5pbmcgdGhlIHJlc291cmNlIGZvcmsuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXBfb2Zmc2V0IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZmlsZSBvZmZzZXQgd2hlcmUgdGhlIHJlc291cmNlIG1hcCBzdGFydHMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZGF0YV9wb3MgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgZmlsZSBvZmZzZXQgd2hlcmUgdGhlIHJlc291cmNlIGRhdGEgc3RhcnRzLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgcmVzb3VyY2UgdGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzb3J0X2J5X3Jlc19pZCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIEJvb2xlYW4gdG8gc29ydCB0aGUgZnJhZ21lbnRlZCByZXNvdXJjZSBieSB0aGVpciBpZHMuICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGZyYWdtZW50ZWQgcmVzb3VyY2VzIGZvciBgUE9TVCcgcmVzb3VyY2Ugc2hvdWxkIGJlIHNvcnRlZCAgICAqLwotICAvKiAgICAgIHRvIHJlc3RvcmUgVHlwZTEgZm9udCBwcm9wZXJseS4gIEZvciBgc25mdCcgcmVzb3VyY2VzLCBzb3J0aW5nICAgKi8KLSAgLyogICAgICBtYXkgaW5kdWNlIGEgZGlmZmVyZW50IG9yZGVyIG9mIHRoZSBmYWNlcyBpbiBjb21wYXJpc29uIHRvIHRoYXQgICovCi0gIC8qICAgICAgYnkgUXVpY2tEcmF3IEFQSS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG9mZnNldHMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBzdHJlYW0gb2Zmc2V0cyBmb3IgdGhlIHJlc291cmNlIGRhdGEgc3BlY2lmaWVkIGJ5IGB0YWcnLiAgICAgKi8KLSAgLyogICAgICBUaGlzIGFycmF5IGlzIGFsbG9jYXRlZCBieSB0aGUgZnVuY3Rpb24sIHNvIHlvdSBoYXZlIHRvIGNhbGwgICAgICovCi0gIC8qICAgICAgQGZ0X21lbV9mcmVlIGFmdGVyIHVzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY291bnQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGxlbmd0aCBvZiBvZmZzZXRzIGFycmF5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICBGVF9FcnJfT2sgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vcm1hbGx5IHlvdSBzaG91bGQgdXNlIGBGVF9SYWNjZXNzX0dldF9IZWFkZXJJbmZvJyB0byBnZXQgdGhlICAgICAqLwotICAvKiAgICB2YWx1ZSBmb3IgYG1hcF9vZmZzZXQnIGFuZCBgcmRhdGFfcG9zJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfUmFjY2Vzc19HZXRfRGF0YU9mZnNldHMoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICBtYXBfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgcmRhdGFfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgc29ydF9ieV9yZXNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgKipvZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqY291bnQgKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUUkZPUktfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhMGM3Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c2Vydi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c2Vydi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgc2VydmljZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgRWFjaCBtb2R1bGUgY2FuIGV4cG9ydCBvbmUgb3IgbW9yZSBgc2VydmljZXMnLiAgRWFjaCBzZXJ2aWNlIGlzICAgICAgKi8KLSAgLyogIGlkZW50aWZpZWQgYnkgYSBjb25zdGFudCBzdHJpbmcgYW5kIG1vZGVsZWQgYnkgYSBwb2ludGVyOyB0aGUgbGF0dGVyICovCi0gIC8qICBnZW5lcmFsbHkgY29ycmVzcG9uZHMgdG8gYSBzdHJ1Y3R1cmUgY29udGFpbmluZyBmdW5jdGlvbiBwb2ludGVycy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIE5vdGUgdGhhdCBhIHNlcnZpY2UncyBkYXRhIGNhbm5vdCBiZSBhIG1lcmUgZnVuY3Rpb24gcG9pbnRlciBiZWNhdXNlICovCi0gIC8qICBpbiBDIGl0IGlzIHBvc3NpYmxlIHRoYXQgZnVuY3Rpb24gcG9pbnRlcnMgbWlnaHQgYmUgaW1wbGVtZW50ZWQgICAgICAqLwotICAvKiAgZGlmZmVyZW50bHkgdGhhbiBkYXRhIHBvaW50ZXJzIChlLmcuIDQ4IGJpdHMgaW5zdGVhZCBvZiAzMikuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVFNFUlZfSF9fCi0jZGVmaW5lIF9fRlRTRVJWX0hfXwotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIC8qCi0gICAqIEBtYWNybzoKLSAgICogICBGVF9GQUNFX0ZJTkRfU0VSVklDRQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhpcyBtYWNybyBpcyB1c2VkIHRvIGxvb2sgdXAgYSBzZXJ2aWNlIGZyb20gYSBmYWNlJ3MgZHJpdmVyIG1vZHVsZS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGZhY2UgOjoKLSAgICogICAgIFRoZSBzb3VyY2UgZmFjZSBoYW5kbGUuCi0gICAqCi0gICAqICAgaWQgOjoKLSAgICogICAgIEEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHNlcnZpY2UgYXMgZGVmaW5lZCBpbiB0aGUgc2VydmljZSdzCi0gICAqICAgICBoZWFkZXIgZmlsZXMgKGUuZy4gRlRfU0VSVklDRV9JRF9NVUxUSV9NQVNURVJTIHdoaWNoIGV4cGFuZHMgdG8KLSAgICogICAgIGBtdWx0aS1tYXN0ZXJzJykuICBJdCBpcyBhdXRvbWF0aWNhbGx5IHByZWZpeGVkIHdpdGgKLSAgICogICAgIGBGVF9TRVJWSUNFX0lEXycuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgcHRyIDo6Ci0gICAqICAgICBBIHZhcmlhYmxlIHRoYXQgcmVjZWl2ZXMgdGhlIHNlcnZpY2UgcG9pbnRlci4gIFdpbGwgYmUgTlVMTAotICAgKiAgICAgaWYgbm90IGZvdW5kLgotICAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0jZGVmaW5lIEZUX0ZBQ0VfRklORF9TRVJWSUNFKCBmYWNlLCBwdHIsIGlkICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9Nb2R1bGUgICAgbW9kdWxlID0gRlRfTU9EVUxFKCBGVF9GQUNFKCBmYWNlICktPmRyaXZlciApOyAgICAgICAgICAgICBcCi0gICAgRlRfUG9pbnRlciAgIF90bXBfICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1BvaW50ZXIqICBfcHB0cl8gPSAoRlRfUG9pbnRlciopJihwdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggbW9kdWxlLT5jbGF6ei0+Z2V0X2ludGVyZmFjZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIF90bXBfID0gbW9kdWxlLT5jbGF6ei0+Z2V0X2ludGVyZmFjZSggbW9kdWxlLCBGVF9TRVJWSUNFX0lEXyAjIyBpZCApOyBcCi0gICAgKl9wcHRyXyA9IF90bXBfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FTkRfU1RNTlQKLQotI2Vsc2UgLyogIUMrKyAqLwotCi0jZGVmaW5lIEZUX0ZBQ0VfRklORF9TRVJWSUNFKCBmYWNlLCBwdHIsIGlkICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9Nb2R1bGUgICBtb2R1bGUgPSBGVF9NT0RVTEUoIEZUX0ZBQ0UoIGZhY2UgKS0+ZHJpdmVyICk7ICAgICAgICAgICAgICBcCi0gICAgRlRfUG9pbnRlciAgX3RtcF8gID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIG1vZHVsZS0+Y2xhenotPmdldF9pbnRlcmZhY2UgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBfdG1wXyA9IG1vZHVsZS0+Y2xhenotPmdldF9pbnRlcmZhY2UoIG1vZHVsZSwgRlRfU0VSVklDRV9JRF8gIyMgaWQgKTsgXAotICAgIHB0ciA9IF90bXBfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRU5EX1NUTU5UCi0KLSNlbmRpZiAvKiAhQysrICovCi0KLQotICAvKgotICAgKiBAbWFjcm86Ci0gICAqICAgRlRfRkFDRV9GSU5EX0dMT0JBTF9TRVJWSUNFCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gbG9vayB1cCBhIHNlcnZpY2UgZnJvbSBhbGwgbW9kdWxlcy4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGZhY2UgOjoKLSAgICogICAgIFRoZSBzb3VyY2UgZmFjZSBoYW5kbGUuCi0gICAqCi0gICAqICAgaWQgOjoKLSAgICogICAgIEEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHNlcnZpY2UgYXMgZGVmaW5lZCBpbiB0aGUgc2VydmljZSdzCi0gICAqICAgICBoZWFkZXIgZmlsZXMgKGUuZy4gRlRfU0VSVklDRV9JRF9NVUxUSV9NQVNURVJTIHdoaWNoIGV4cGFuZHMgdG8KLSAgICogICAgIGBtdWx0aS1tYXN0ZXJzJykuICBJdCBpcyBhdXRvbWF0aWNhbGx5IHByZWZpeGVkIHdpdGgKLSAgICogICAgIGBGVF9TRVJWSUNFX0lEXycuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgcHRyIDo6Ci0gICAqICAgICBBIHZhcmlhYmxlIHRoYXQgcmVjZWl2ZXMgdGhlIHNlcnZpY2UgcG9pbnRlci4gIFdpbGwgYmUgTlVMTAotICAgKiAgICAgaWYgbm90IGZvdW5kLgotICAgKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0jZGVmaW5lIEZUX0ZBQ0VfRklORF9HTE9CQUxfU0VSVklDRSggZmFjZSwgcHRyLCBpZCApICAgICAgICAgICAgICAgXAotICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9Nb2R1bGUgICAgbW9kdWxlID0gRlRfTU9EVUxFKCBGVF9GQUNFKCBmYWNlICktPmRyaXZlciApOyAgICBcCi0gICAgRlRfUG9pbnRlciAgIF90bXBfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1BvaW50ZXIqICBfcHB0cl8gPSAoRlRfUG9pbnRlciopJihwdHIpOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF90bXBfID0gZnRfbW9kdWxlX2dldF9zZXJ2aWNlKCBtb2R1bGUsIEZUX1NFUlZJQ0VfSURfICMjIGlkICk7IFwKLSAgICAqX3BwdHJfID0gX3RtcF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0VORF9TVE1OVAotCi0jZWxzZSAvKiAhQysrICovCi0KLSNkZWZpbmUgRlRfRkFDRV9GSU5EX0dMT0JBTF9TRVJWSUNFKCBmYWNlLCBwdHIsIGlkICkgICAgICAgICAgICAgICBcCi0gIEZUX0JFR0lOX1NUTU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01vZHVsZSAgIG1vZHVsZSA9IEZUX01PRFVMRSggRlRfRkFDRSggZmFjZSApLT5kcml2ZXIgKTsgICAgIFwKLSAgICBGVF9Qb2ludGVyICBfdG1wXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBfdG1wXyA9IGZ0X21vZHVsZV9nZXRfc2VydmljZSggbW9kdWxlLCBGVF9TRVJWSUNFX0lEXyAjIyBpZCApOyBcCi0gICAgcHRyICAgPSBfdG1wXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FTkRfU1RNTlQKLQotI2VuZGlmIC8qICFDKysgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgIFMgRSBSIFYgSSBDIEUgICBEIEUgUyBDIFIgSSBQIFQgTyBSIFMgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qCi0gICAqICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB1c2VkIHRvIF9kZXNjcmliZV8gYSBnaXZlbiBzZXJ2aWNlCi0gICAqICB0byB0aGUgbGlicmFyeS4gIFRoaXMgaXMgdXNlZnVsIHRvIGJ1aWxkIHNpbXBsZSBzdGF0aWMgc2VydmljZSBsaXN0cy4KLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9TZXJ2aWNlRGVzY1JlY18KLSAgewotICAgIGNvbnN0IGNoYXIqICBzZXJ2X2lkOyAgICAgLyogc2VydmljZSBuYW1lICAgICAgICAgKi8KLSAgICBjb25zdCB2b2lkKiAgc2Vydl9kYXRhOyAgIC8qIHNlcnZpY2UgcG9pbnRlci9kYXRhICovCi0KLSAgfSBGVF9TZXJ2aWNlRGVzY1JlYzsKLQotICB0eXBlZGVmIGNvbnN0IEZUX1NlcnZpY2VEZXNjUmVjKiAgRlRfU2VydmljZURlc2M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxNYWNybz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBVc2VkIHRvIGluaXRpYWxpemUgYW4gYXJyYXkgb2YgRlRfU2VydmljZURlc2NSZWMgc3RydWN0dXJlcy4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdoZW4gRlRfQ09ORklHX09QVElPTl9QSUMgaXMgZGVmaW5lZCBhIGBjcmVhdGUnIGZ1bmN0aW9uIG5lZWRzIHRvICAqLwotICAvKiAgICBiZSBjYWxsZWQgd2l0aCBhIHBvaW50ZXIgdG8gcmV0dXJuIGFuIGFsbG9jYXRlZCBhcnJheS4gIEFzIHNvb24gYXMgKi8KLSAgLyogICAgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZCwgYSBgZGVzdHJveScgZnVuY3Rpb24gbmVlZHMgdG8gYmUgY2FsbGVkIHRvICovCi0gIC8qICAgIHJlbGVhc2UgdGhhdCBhbGxvY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBiZSBtYW51YWxseSBjYWxsZWQgZnJvbSB0aGUgYHBpY19pbml0JyBhbmQgICovCi0gIC8qICAgIGBwaWNfZnJlZScgZnVuY3Rpb25zIG9mIHlvdXIgbW9kdWxlIChzZWUgRlRfREVGSU5FX01PRFVMRSkuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgV2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBub3QgZGVmaW5lZCB0aGUgYXJyYXkgd2lsbCBiZSAgICAgICAgICovCi0gIC8qICAgIGFsbG9jYXRlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIChvciB0aGUgc2NvcGUgd2hlcmUgdGhlIG1hY3JvIGlzICAgICAqLwotICAvKiAgICB1c2VkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDMSggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEgKSAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZURlc2NSZWMgIGNsYXNzX1tdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgTlVMTCwgTlVMTCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMyKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIgKSAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZURlc2NSZWMgIGNsYXNzX1tdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IE5VTEwsIE5VTEwgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDMyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMyApICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyAgY2xhc3NfW10gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMyB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IE5VTEwsIE5VTEwgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNCggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQgKSAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZURlc2NSZWMgIGNsYXNzX1tdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfMywgc2Vydl9kYXRhXzMgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzQsIHNlcnZfZGF0YV80IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgTlVMTCwgTlVMTCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM1KCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF80LCBzZXJ2X2RhdGFfNCwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNSwgc2Vydl9kYXRhXzUgKSAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZURlc2NSZWMgIGNsYXNzX1tdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfMywgc2Vydl9kYXRhXzMgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzQsIHNlcnZfZGF0YV80IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF81LCBzZXJ2X2RhdGFfNSB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IE5VTEwsIE5VTEwgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNiggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzUsIHNlcnZfZGF0YV81LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF82LCBzZXJ2X2RhdGFfNiApICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyAgY2xhc3NfW10gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMyB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzUsIHNlcnZfZGF0YV81IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF82LCBzZXJ2X2RhdGFfNiB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IE5VTEwsIE5VTEwgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzUsIHNlcnZfZGF0YV81LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF82LCBzZXJ2X2RhdGFfNiwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNywgc2Vydl9kYXRhXzcgKSAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZURlc2NSZWMgIGNsYXNzX1tdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfMywgc2Vydl9kYXRhXzMgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzQsIHNlcnZfZGF0YV80IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgc2Vydl9pZF81LCBzZXJ2X2RhdGFfNSB9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNlcnZfaWRfNiwgc2Vydl9kYXRhXzYgfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyBzZXJ2X2lkXzcsIHNlcnZfZGF0YV83IH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgTlVMTCwgTlVMTCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMxKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSApICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9EZXN0cm95X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICkgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggY2xhenogKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqKiAgb3V0cHV0X2NsYXNzICkgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggKmNsYXp6ICkgKiAyICkgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMF0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfaWQgICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxXS5zZXJ2X2RhdGEgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICpvdXRwdXRfY2xhc3MgPSBjbGF6ejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDMiggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yICkgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogKSAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBjbGF6eiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfQ3JlYXRlX0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyoqICBvdXRwdXRfY2xhc3MgKSAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggRlRfQUxMT0MoIGNsYXp6LCBzaXplb2YgKCAqY2xhenogKSAqIDMgKSApICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzBdLnNlcnZfaWQgICA9IHNlcnZfaWRfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMV0uc2Vydl9pZCAgID0gc2Vydl9pZF8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsyXS5zZXJ2X2lkICAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMl0uc2Vydl9kYXRhID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqb3V0cHV0X2NsYXNzID0gY2xheno7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzMoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMywgc2Vydl9kYXRhXzMgKSAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRGVzdHJveV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiApICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGNsYXp6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GUkVFKCBjbGF6eiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9DcmVhdGVfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiogIG91dHB1dF9jbGFzcyApICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9FcnJvciAgICAgICAgICAgIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBGVF9BTExPQyggY2xhenosIHNpemVvZiAoICpjbGF6eiApICogNCApICkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMF0uc2Vydl9pZCAgID0gc2Vydl9pZF8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzBdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMV0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzJdLnNlcnZfaWQgICA9IHNlcnZfaWRfMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsyXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbM10uc2Vydl9pZCAgID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzNdLnNlcnZfZGF0YSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKm91dHB1dF9jbGFzcyA9IGNsYXp6OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM0KCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF80LCBzZXJ2X2RhdGFfNCApICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9EZXN0cm95X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICkgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggY2xhenogKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqKiAgb3V0cHV0X2NsYXNzICkgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggKmNsYXp6ICkgKiA1ICkgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMF0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfaWQgICA9IHNlcnZfaWRfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMl0uc2Vydl9pZCAgID0gc2Vydl9pZF8zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzJdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elszXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbM10uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzRdLnNlcnZfaWQgICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els0XS5zZXJ2X2RhdGEgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICpvdXRwdXRfY2xhc3MgPSBjbGF6ejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNSggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMSwgc2Vydl9kYXRhXzEsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzIsIHNlcnZfZGF0YV8yLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8zLCBzZXJ2X2RhdGFfMywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNCwgc2Vydl9kYXRhXzQsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzUsIHNlcnZfZGF0YV81ICkgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogKSAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBjbGF6eiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRlJFRSggY2xhenogKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfQ3JlYXRlX0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyoqICBvdXRwdXRfY2xhc3MgKSAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgICAgICAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggRlRfQUxMT0MoIGNsYXp6LCBzaXplb2YgKCAqY2xhenogKSAqIDYgKSApICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBlcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzBdLnNlcnZfaWQgICA9IHNlcnZfaWRfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMV0uc2Vydl9pZCAgID0gc2Vydl9pZF8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsyXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMl0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzNdLnNlcnZfaWQgICA9IHNlcnZfaWRfNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elszXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNF0uc2Vydl9pZCAgID0gc2Vydl9pZF81OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzRdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV81OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els1XS5zZXJ2X2lkICAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNV0uc2Vydl9kYXRhID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqb3V0cHV0X2NsYXNzID0gY2xheno7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBGVF9FcnJfT2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzYoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzEsIHNlcnZfZGF0YV8xLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8yLCBzZXJ2X2RhdGFfMiwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMywgc2Vydl9kYXRhXzMsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzQsIHNlcnZfZGF0YV80LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF81LCBzZXJ2X2RhdGFfNSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNiwgc2Vydl9kYXRhXzYgKSAgICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRGVzdHJveV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiApICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIGNsYXp6ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVF9GUkVFKCBjbGF6eiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9DcmVhdGVfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiogIG91dHB1dF9jbGFzcykgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9FcnJvciAgICAgICAgICAgIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBGVF9BTExPQyggY2xhenosIHNpemVvZiAoICpjbGF6eiApICogNyApICkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIGVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMF0uc2Vydl9pZCAgID0gc2Vydl9pZF8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzBdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMV0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzJdLnNlcnZfaWQgICA9IHNlcnZfaWRfMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsyXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbM10uc2Vydl9pZCAgID0gc2Vydl9pZF80OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzNdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV80OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els0XS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNF0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzVdLnNlcnZfaWQgICA9IHNlcnZfaWRfNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els1XS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNl0uc2Vydl9pZCAgID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzZdLnNlcnZfZGF0YSA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKm91dHB1dF9jbGFzcyA9IGNsYXp6OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gRlRfRXJyX09rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM3KCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF8xLCBzZXJ2X2RhdGFfMSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfMiwgc2Vydl9kYXRhXzIsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzMsIHNlcnZfZGF0YV8zLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF80LCBzZXJ2X2RhdGFfNCwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZfaWRfNSwgc2Vydl9kYXRhXzUsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2X2lkXzYsIHNlcnZfZGF0YV82LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vydl9pZF83LCBzZXJ2X2RhdGFfNyApICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9EZXN0cm95X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyogIGNsYXp6ICkgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICggY2xhenogKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0NyZWF0ZV9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqKiAgb3V0cHV0X2NsYXNzKSAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiAgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggKmNsYXp6ICkgKiA4ICkgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elswXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMF0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzFdLnNlcnZfaWQgICA9IHNlcnZfaWRfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elsxXS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbMl0uc2Vydl9pZCAgID0gc2Vydl9pZF8zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzJdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV8zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6elszXS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbM10uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzRdLnNlcnZfaWQgICA9IHNlcnZfaWRfNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els0XS5zZXJ2X2RhdGEgPSBzZXJ2X2RhdGFfNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNV0uc2Vydl9pZCAgID0gc2Vydl9pZF82OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzVdLnNlcnZfZGF0YSA9IHNlcnZfZGF0YV82OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els2XS5zZXJ2X2lkICAgPSBzZXJ2X2lkXzc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenpbNl0uc2Vydl9kYXRhID0gc2Vydl9kYXRhXzc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6WzddLnNlcnZfaWQgICA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6els3XS5zZXJ2X2RhdGEgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICpvdXRwdXRfY2xhc3MgPSBjbGF6ejsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIEZUX0Vycl9PazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLSAgLyoKLSAgICogIFBhcnNlIGEgbGlzdCBvZiBGVF9TZXJ2aWNlRGVzY1JlYyBkZXNjcmlwdG9ycyBhbmQgbG9vayBmb3IKLSAgICogIGEgc3BlY2lmaWMgc2VydmljZSBieSBJRC4gIE5vdGUgdGhhdCB0aGUgbGFzdCBlbGVtZW50IGluIHRoZQotICAgKiAgYXJyYXkgbXVzdCBiZSB7IE5VTEwsIE5VTEwgfSwgYW5kIHRoYXQgdGhlIGZ1bmN0aW9uIHNob3VsZAotICAgKiAgcmV0dXJuIE5VTEwgaWYgdGhlIHNlcnZpY2UgaXNuJ3QgYXZhaWxhYmxlLgotICAgKgotICAgKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCBieSBtb2R1bGVzIHRvIGltcGxlbWVudCB0aGVpcgotICAgKiAgYGdldF9zZXJ2aWNlJyBtZXRob2QuCi0gICAqLwotICBGVF9CQVNFKCBGVF9Qb2ludGVyICkKLSAgZnRfc2VydmljZV9saXN0X2xvb2t1cCggRlRfU2VydmljZURlc2MgIHNlcnZpY2VfZGVzY3JpcHRvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICBzZXJ2aWNlX2lkICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgUyBFIFIgViBJIEMgRSBTICAgQyBBIEMgSCBFICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKgotICAgKiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzdG9yZSBhIGNhY2hlIGZvciBzZXZlcmFsIGZyZXF1ZW50bHkgdXNlZAotICAgKiAgc2VydmljZXMuICBJdCBpcyB0aGUgdHlwZSBvZiBgZmFjZS0+aW50ZXJuYWwtPnNlcnZpY2VzJy4gIFlvdQotICAgKiAgc2hvdWxkIG9ubHkgdXNlIEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UgdG8gYWNjZXNzIGl0LgotICAgKgotICAgKiAgQWxsIGZpZWxkcyBzaG91bGQgaGF2ZSB0aGUgdHlwZSBGVF9Qb2ludGVyIHRvIHJlbGF4IGNvbXBpbGF0aW9uCi0gICAqICBkZXBlbmRlbmNpZXMuICBXZSBhc3N1bWUgdGhlIGRldmVsb3BlciBpc24ndCBjb21wbGV0ZWx5IHN0dXBpZC4KLSAgICoKLSAgICogIEVhY2ggZmllbGQgbXVzdCBiZSBuYW1lZCBgc2VydmljZV9YWFhYJyB3aGVyZSBgWFhYJyBjb3JyZXNwb25kcyB0bwotICAgKiAgdGhlIGNvcnJlY3QgRlRfU0VSVklDRV9JRF9YWFhYIG1hY3JvLiAgU2VlIHRoZSBkZWZpbml0aW9uIG9mCi0gICAqICBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFIGJlbG93IGhvdyB0aGlzIGlzIGltcGxlbWVudGVkLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1NlcnZpY2VDYWNoZVJlY18KLSAgewotICAgIEZUX1BvaW50ZXIgIHNlcnZpY2VfUE9TVFNDUklQVF9GT05UX05BTUU7Ci0gICAgRlRfUG9pbnRlciAgc2VydmljZV9NVUxUSV9NQVNURVJTOwotICAgIEZUX1BvaW50ZXIgIHNlcnZpY2VfR0xZUEhfRElDVDsKLSAgICBGVF9Qb2ludGVyICBzZXJ2aWNlX1BGUl9NRVRSSUNTOwotICAgIEZUX1BvaW50ZXIgIHNlcnZpY2VfV0lORk5UOwotCi0gIH0gRlRfU2VydmljZUNhY2hlUmVjLCAqRlRfU2VydmljZUNhY2hlOwotCi0KLSAgLyoKLSAgICogIEEgbWFnaWMgbnVtYmVyIHVzZWQgd2l0aGluIHRoZSBzZXJ2aWNlcyBjYWNoZS4KLSAgICovCi0KLSAgLyogZW5zdXJlIHRoYXQgdmFsdWUgYDEnIGhhcyB0aGUgc2FtZSB3aWR0aCBhcyBhIHBvaW50ZXIgKi8KLSNkZWZpbmUgRlRfU0VSVklDRV9VTkFWQUlMQUJMRSAgKChGVF9Qb2ludGVyKX4oRlRfUHRyRGlzdCkxKQotCi0KLSAgLyoKLSAgICogQG1hY3JvOgotICAgKiAgIEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBsb29rdXAgYSBzZXJ2aWNlIGZyb20gYSBmYWNlJ3MgZHJpdmVyIG1vZHVsZQotICAgKiAgIHVzaW5nIGl0cyBjYWNoZS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGZhY2U6OgotICAgKiAgICAgVGhlIHNvdXJjZSBmYWNlIGhhbmRsZSBjb250YWluaW5nIHRoZSBjYWNoZS4KLSAgICoKLSAgICogICBmaWVsZCA6OgotICAgKiAgICAgVGhlIGZpZWxkIG5hbWUgaW4gdGhlIGNhY2hlLgotICAgKgotICAgKiAgIGlkIDo6Ci0gICAqICAgICBUaGUgc2VydmljZSBJRC4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICBwdHIgOjoKLSAgICogICAgIEEgdmFyaWFibGUgcmVjZWl2aW5nIHRoZSBzZXJ2aWNlIGRhdGEuICBOVUxMIGlmIG5vdCBhdmFpbGFibGUuCi0gICAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLSNkZWZpbmUgRlRfRkFDRV9MT09LVVBfU0VSVklDRSggZmFjZSwgcHRyLCBpZCApICAgICAgICAgICAgICAgIFwKLSAgRlRfQkVHSU5fU1RNTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9Qb2ludGVyICAgc3ZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9Qb2ludGVyKiAgUHB0ciA9IChGVF9Qb2ludGVyKikmKHB0cik7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzdmMgPSBGVF9GQUNFKCBmYWNlICktPmludGVybmFsLT5zZXJ2aWNlcy4gc2VydmljZV8gIyMgaWQ7IFwKLSAgICBpZiAoIHN2YyA9PSBGVF9TRVJWSUNFX1VOQVZBSUxBQkxFICkgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHN2YyA9IE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlbHNlIGlmICggc3ZjID09IE5VTEwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZBQ0VfRklORF9TRVJWSUNFKCBmYWNlLCBzdmMsIGlkICk7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZUX0ZBQ0UoIGZhY2UgKS0+aW50ZXJuYWwtPnNlcnZpY2VzLiBzZXJ2aWNlXyAjIyBpZCA9ICAgIFwKLSAgICAgICAgKEZUX1BvaW50ZXIpKCBzdmMgIT0gTlVMTCA/IHN2YyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZUX1NFUlZJQ0VfVU5BVkFJTEFCTEUgKTsgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAqUHB0ciA9IHN2YzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfRU5EX1NUTU5UCi0KLSNlbHNlIC8qICFDKysgKi8KLQotI2RlZmluZSBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFKCBmYWNlLCBwdHIsIGlkICkgICAgICAgICAgICAgICAgXAotICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1BvaW50ZXIgIHN2YzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHN2YyA9IEZUX0ZBQ0UoIGZhY2UgKS0+aW50ZXJuYWwtPnNlcnZpY2VzLiBzZXJ2aWNlXyAjIyBpZDsgXAotICAgIGlmICggc3ZjID09IEZUX1NFUlZJQ0VfVU5BVkFJTEFCTEUgKSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgc3ZjID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVsc2UgaWYgKCBzdmMgPT0gTlVMTCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHN2YywgaWQgKTsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlRfRkFDRSggZmFjZSApLT5pbnRlcm5hbC0+c2VydmljZXMuIHNlcnZpY2VfICMjIGlkID0gICAgXAotICAgICAgICAoRlRfUG9pbnRlcikoIHN2YyAhPSBOVUxMID8gc3ZjICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlRfU0VSVklDRV9VTkFWQUlMQUJMRSApOyAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHB0ciA9IHN2YzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FTkRfU1RNTlQKLQotI2VuZGlmIC8qICFDKysgKi8KLQotICAvKgotICAgKiAgQSBtYWNybyB1c2VkIHRvIGRlZmluZSBuZXcgc2VydmljZSBzdHJ1Y3R1cmUgdHlwZXMuCi0gICAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFKCBuYW1lICkgICAgICAgICAgICBcCi0gIHR5cGVkZWYgc3RydWN0IEZUX1NlcnZpY2VfICMjIG5hbWUgIyMgUmVjXyBcCi0gICAgRlRfU2VydmljZV8gIyMgbmFtZSAjIyBSZWMgOyAgICAgICAgICAgICBcCi0gIHR5cGVkZWYgc3RydWN0IEZUX1NlcnZpY2VfICMjIG5hbWUgIyMgUmVjXyBcCi0gICAgY29uc3QgKiBGVF9TZXJ2aWNlXyAjIyBuYW1lIDsgICAgICAgICAgICBcCi0gIHN0cnVjdCBGVF9TZXJ2aWNlXyAjIyBuYW1lICMjIFJlY18KLQotICAvKiAqLwotCi0gIC8qCi0gICAqICBUaGUgaGVhZGVyIGZpbGVzIGNvbnRhaW5pbmcgdGhlIHNlcnZpY2VzLgotICAgKi8KLQotI2RlZmluZSBGVF9TRVJWSUNFX0JERl9IICAgICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmJkZi5oPgotI2RlZmluZSBGVF9TRVJWSUNFX0NJRF9IICAgICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmNpZC5oPgotI2RlZmluZSBGVF9TRVJWSUNFX0dMWVBIX0RJQ1RfSCAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmdsZGljdC5oPgotI2RlZmluZSBGVF9TRVJWSUNFX0dYX1ZBTElEQVRFX0ggICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmd4dmFsLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfS0VSTklOR19IICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2a2Vybi5oPgotI2RlZmluZSBGVF9TRVJWSUNFX01VTFRJUExFX01BU1RFUlNfSCAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm1tLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfT1BFTlRZUEVfVkFMSURBVEVfSCAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2b3R2YWwuaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9QRlJfSCAgICAgICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZwZnIuaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX0NNQVBTX0ggICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2NtYXAuaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX0lORk9fSCAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2luZm8uaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX05BTUVfSCAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwb3N0bm0uaD4KLSNkZWZpbmUgRlRfU0VSVklDRV9QUk9QRVJUSUVTX0ggICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwcm9wLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfU0ZOVF9IICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2c2ZudC5oPgotI2RlZmluZSBGVF9TRVJWSUNFX1RSVUVUWVBFX0VOR0lORV9IICAgIDxmcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0ZW5nLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfVFRfQ01BUF9IICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRjbWFwLmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfV0lORk5UX0ggICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2d2luZm50Lmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfRk9OVF9GT1JNQVRfSCAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Zm50Zm10Lmg+Ci0jZGVmaW5lIEZUX1NFUlZJQ0VfVFJVRVRZUEVfR0xZRl9IICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRnbHlmLmg+Ci0KLSAvKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUU0VSVl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg0ZTVkZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0c3RyZWFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzdHJlYW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFN0cmVhbSBoYW5kbGluZyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRTVFJFQU1fSF9fCi0jZGVmaW5lIF9fRlRTVFJFQU1fSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9TWVNURU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKiBmb3JtYXQgb2YgYW4gOC1iaXQgZnJhbWVfb3AgdmFsdWU6ICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBiaXQgIDc2NTQzMjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHh4eHh4eGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBzIGlzIHNldCB0byAxIGlmIHRoZSB2YWx1ZSBpcyBzaWduZWQuICAgICAgICAqLwotICAvKiBlIGlzIHNldCB0byAxIGlmIHRoZSB2YWx1ZSBpcyBsaXR0bGUtZW5kaWFuLiAqLwotICAvKiB4eHggaXMgYSBjb21tYW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIEZUX0ZSQU1FX09QX1NISUZUICAgICAgICAgMgotI2RlZmluZSBGVF9GUkFNRV9PUF9TSUdORUQgICAgICAgIDEKLSNkZWZpbmUgRlRfRlJBTUVfT1BfTElUVExFICAgICAgICAyCi0jZGVmaW5lIEZUX0ZSQU1FX09QX0NPTU1BTkQoIHggKSAgKCB4ID4+IEZUX0ZSQU1FX09QX1NISUZUICkKLQotI2RlZmluZSBGVF9NQUtFX0ZSQU1FX09QKCBjb21tYW5kLCBsaXR0bGUsIHNpZ24gKSBcCi0gICAgICAgICAgKCAoIGNvbW1hbmQgPDwgRlRfRlJBTUVfT1BfU0hJRlQgKSB8ICggbGl0dGxlIDw8IDEgKSB8IHNpZ24gKQotCi0jZGVmaW5lIEZUX0ZSQU1FX09QX0VORCAgICAwCi0jZGVmaW5lIEZUX0ZSQU1FX09QX1NUQVJUICAxICAvKiBzdGFydCBhIG5ldyBmcmFtZSAgICAgKi8KLSNkZWZpbmUgRlRfRlJBTUVfT1BfQllURSAgIDIgIC8qIHJlYWQgMS1ieXRlIHZhbHVlICAgICAqLwotI2RlZmluZSBGVF9GUkFNRV9PUF9TSE9SVCAgMyAgLyogcmVhZCAyLWJ5dGUgdmFsdWUgICAgICovCi0jZGVmaW5lIEZUX0ZSQU1FX09QX0xPTkcgICA0ICAvKiByZWFkIDQtYnl0ZSB2YWx1ZSAgICAgKi8KLSNkZWZpbmUgRlRfRlJBTUVfT1BfT0ZGMyAgIDUgIC8qIHJlYWQgMy1ieXRlIHZhbHVlICAgICAqLwotI2RlZmluZSBGVF9GUkFNRV9PUF9CWVRFUyAgNiAgLyogcmVhZCBhIGJ5dGVzIHNlcXVlbmNlICovCi0KLQotICB0eXBlZGVmIGVudW0gIEZUX0ZyYW1lX09wXwotICB7Ci0gICAgZnRfZnJhbWVfZW5kICAgICAgID0gMCwKLSAgICBmdF9mcmFtZV9zdGFydCAgICAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9TVEFSVCwgMCwgMCApLAotCi0gICAgZnRfZnJhbWVfYnl0ZSAgICAgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfQllURSwgIDAsIDAgKSwKLSAgICBmdF9mcmFtZV9zY2hhciAgICAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9CWVRFLCAgMCwgMSApLAotCi0gICAgZnRfZnJhbWVfdXNob3J0X2JlID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfU0hPUlQsIDAsIDAgKSwKLSAgICBmdF9mcmFtZV9zaG9ydF9iZSAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9TSE9SVCwgMCwgMSApLAotICAgIGZ0X2ZyYW1lX3VzaG9ydF9sZSA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX1NIT1JULCAxLCAwICksCi0gICAgZnRfZnJhbWVfc2hvcnRfbGUgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfU0hPUlQsIDEsIDEgKSwKLQotICAgIGZ0X2ZyYW1lX3Vsb25nX2JlICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX0xPTkcsIDAsIDAgKSwKLSAgICBmdF9mcmFtZV9sb25nX2JlICAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9MT05HLCAwLCAxICksCi0gICAgZnRfZnJhbWVfdWxvbmdfbGUgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfTE9ORywgMSwgMCApLAotICAgIGZ0X2ZyYW1lX2xvbmdfbGUgICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX0xPTkcsIDEsIDEgKSwKLQotICAgIGZ0X2ZyYW1lX3VvZmYzX2JlICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX09GRjMsIDAsIDAgKSwKLSAgICBmdF9mcmFtZV9vZmYzX2JlICAgPSBGVF9NQUtFX0ZSQU1FX09QKCBGVF9GUkFNRV9PUF9PRkYzLCAwLCAxICksCi0gICAgZnRfZnJhbWVfdW9mZjNfbGUgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfT0ZGMywgMSwgMCApLAotICAgIGZ0X2ZyYW1lX29mZjNfbGUgICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX09GRjMsIDEsIDEgKSwKLQotICAgIGZ0X2ZyYW1lX2J5dGVzICAgICA9IEZUX01BS0VfRlJBTUVfT1AoIEZUX0ZSQU1FX09QX0JZVEVTLCAwLCAwICksCi0gICAgZnRfZnJhbWVfc2tpcCAgICAgID0gRlRfTUFLRV9GUkFNRV9PUCggRlRfRlJBTUVfT1BfQllURVMsIDAsIDEgKQotCi0gIH0gRlRfRnJhbWVfT3A7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgRlRfRnJhbWVfRmllbGRfCi0gIHsKLSAgICBGVF9CeXRlICAgIHZhbHVlOwotICAgIEZUX0J5dGUgICAgc2l6ZTsKLSAgICBGVF9VU2hvcnQgIG9mZnNldDsKLQotICB9IEZUX0ZyYW1lX0ZpZWxkOwotCi0KLSAgLyogQ29uc3RydWN0IGFuIEZUX0ZyYW1lX0ZpZWxkIG91dCBvZiBhIHN0cnVjdHVyZSB0eXBlIGFuZCBhIGZpZWxkIG5hbWUuICovCi0gIC8qIFRoZSBzdHJ1Y3R1cmUgdHlwZSBtdXN0IGJlIHNldCBpbiB0aGUgRlRfU1RSVUNUVVJFIG1hY3JvIGJlZm9yZSAgICAgICAqLwotICAvKiBjYWxsaW5nIHRoZSBGVF9GUkFNRV9TVEFSVCgpIG1hY3JvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0ZJRUxEX1NJWkUoIGYgKSBcCi0gICAgICAgICAgKEZUX0J5dGUpc2l6ZW9mICggKChGVF9TVFJVQ1RVUkUqKTApLT5mICkKLQotI2RlZmluZSBGVF9GSUVMRF9TSVpFX0RFTFRBKCBmICkgXAotICAgICAgICAgIChGVF9CeXRlKXNpemVvZiAoICgoRlRfU1RSVUNUVVJFKikwKS0+ZlswXSApCi0KLSNkZWZpbmUgRlRfRklFTERfT0ZGU0VUKCBmICkgXAotICAgICAgICAgIChGVF9VU2hvcnQpKCBvZmZzZXRvZiggRlRfU1RSVUNUVVJFLCBmICkgKQotCi0jZGVmaW5lIEZUX0ZSQU1FX0ZJRUxEKCBmcmFtZV9vcCwgZmllbGQgKSBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBmcmFtZV9vcCwgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9GSUVMRF9TSVpFKCBmaWVsZCApLCAgICAgICBcCi0gICAgICAgICAgICBGVF9GSUVMRF9PRkZTRVQoIGZpZWxkICkgICAgICBcCi0gICAgICAgICAgfQotCi0jZGVmaW5lIEZUX01BS0VfRU1QVFlfRklFTEQoIGZyYW1lX29wICkgIHsgZnJhbWVfb3AsIDAsIDAgfQotCi0jZGVmaW5lIEZUX0ZSQU1FX1NUQVJUKCBzaXplICkgICB7IGZ0X2ZyYW1lX3N0YXJ0LCAwLCBzaXplIH0KLSNkZWZpbmUgRlRfRlJBTUVfRU5EICAgICAgICAgICAgIHsgZnRfZnJhbWVfZW5kLCAwLCAwIH0KLQotI2RlZmluZSBGVF9GUkFNRV9MT05HKCBmICkgICAgICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX2xvbmdfYmUsIGYgKQotI2RlZmluZSBGVF9GUkFNRV9VTE9ORyggZiApICAgICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX3Vsb25nX2JlLCBmICkKLSNkZWZpbmUgRlRfRlJBTUVfU0hPUlQoIGYgKSAgICAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV9zaG9ydF9iZSwgZiApCi0jZGVmaW5lIEZUX0ZSQU1FX1VTSE9SVCggZiApICAgICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfdXNob3J0X2JlLCBmICkKLSNkZWZpbmUgRlRfRlJBTUVfT0ZGMyggZiApICAgICAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV9vZmYzX2JlLCBmICkKLSNkZWZpbmUgRlRfRlJBTUVfVU9GRjMoIGYgKSAgICAgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV91b2ZmM19iZSwgZiApCi0jZGVmaW5lIEZUX0ZSQU1FX0JZVEUoIGYgKSAgICAgICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfYnl0ZSwgZiApCi0jZGVmaW5lIEZUX0ZSQU1FX0NIQVIoIGYgKSAgICAgICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfc2NoYXIsIGYgKQotCi0jZGVmaW5lIEZUX0ZSQU1FX0xPTkdfTEUoIGYgKSAgICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfbG9uZ19sZSwgZiApCi0jZGVmaW5lIEZUX0ZSQU1FX1VMT05HX0xFKCBmICkgICBGVF9GUkFNRV9GSUVMRCggZnRfZnJhbWVfdWxvbmdfbGUsIGYgKQotI2RlZmluZSBGVF9GUkFNRV9TSE9SVF9MRSggZiApICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX3Nob3J0X2xlLCBmICkKLSNkZWZpbmUgRlRfRlJBTUVfVVNIT1JUX0xFKCBmICkgIEZUX0ZSQU1FX0ZJRUxEKCBmdF9mcmFtZV91c2hvcnRfbGUsIGYgKQotI2RlZmluZSBGVF9GUkFNRV9PRkYzX0xFKCBmICkgICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX29mZjNfbGUsIGYgKQotI2RlZmluZSBGVF9GUkFNRV9VT0ZGM19MRSggZiApICAgRlRfRlJBTUVfRklFTEQoIGZ0X2ZyYW1lX3VvZmYzX2xlLCBmICkKLQotI2RlZmluZSBGVF9GUkFNRV9TS0lQX0xPTkcgICAgICAgeyBmdF9mcmFtZV9sb25nX2JlLCAwLCAwIH0KLSNkZWZpbmUgRlRfRlJBTUVfU0tJUF9TSE9SVCAgICAgIHsgZnRfZnJhbWVfc2hvcnRfYmUsIDAsIDAgfQotI2RlZmluZSBGVF9GUkFNRV9TS0lQX0JZVEUgICAgICAgeyBmdF9mcmFtZV9ieXRlLCAwLCAwIH0KLQotI2RlZmluZSBGVF9GUkFNRV9CWVRFUyggZmllbGQsIGNvdW50ICkgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZnRfZnJhbWVfYnl0ZXMsICAgICAgICAgICAgXAotICAgICAgICAgICAgY291bnQsICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfT0ZGU0VUKCBmaWVsZCApICAgXAotICAgICAgICAgIH0KLQotI2RlZmluZSBGVF9GUkFNRV9TS0lQX0JZVEVTKCBjb3VudCApICB7IGZ0X2ZyYW1lX3NraXAsIGNvdW50LCAwIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSW50ZWdlciBleHRyYWN0aW9uIG1hY3JvcyAtLSB0aGUgYGJ1ZmZlcicgcGFyYW1ldGVyIG11c3QgQUxXQVlTIGJlIG9mICovCi0gIC8qIHR5cGUgYGNoYXIqJyBvciBlcXVpdmFsZW50ICgxLWJ5dGUgZWxlbWVudHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBGVF9CWVRFXyggcCwgaSApICAoICgoY29uc3QgRlRfQnl0ZSopKHApKVsoaSldICkKLQotI2RlZmluZSBGVF9JTlQxNiggeCApICAgKCAoRlRfSW50MTYpKHgpICApCi0jZGVmaW5lIEZUX1VJTlQxNiggeCApICAoIChGVF9VSW50MTYpKHgpICkKLSNkZWZpbmUgRlRfSU5UMzIoIHggKSAgICggKEZUX0ludDMyKSh4KSAgKQotI2RlZmluZSBGVF9VSU5UMzIoIHggKSAgKCAoRlRfVUludDMyKSh4KSApCi0KLQotI2RlZmluZSBGVF9CWVRFX1UxNiggcCwgaSwgcyApICAoIEZUX1VJTlQxNiggRlRfQllURV8oIHAsIGkgKSApIDw8IChzKSApCi0jZGVmaW5lIEZUX0JZVEVfVTMyKCBwLCBpLCBzICkgICggRlRfVUlOVDMyKCBGVF9CWVRFXyggcCwgaSApICkgPDwgKHMpICkKLQotCi0jZGVmaW5lIEZUX1BFRUtfU0hPUlQoIHAgKSAgRlRfSU5UMTYoIEZUX0JZVEVfVTE2KCBwLCAwLCA4KSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMTYoIHAsIDEsIDApICkKLQotI2RlZmluZSBGVF9QRUVLX1VTSE9SVCggcCApICBGVF9VSU5UMTYoIEZUX0JZVEVfVTE2KCBwLCAwLCA4ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMTYoIHAsIDEsIDAgKSApCi0KLSNkZWZpbmUgRlRfUEVFS19MT05HKCBwICkgIEZUX0lOVDMyKCBGVF9CWVRFX1UzMiggcCwgMCwgMjQgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMSwgMTYgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMiwgIDggKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMywgIDAgKSApCi0KLSNkZWZpbmUgRlRfUEVFS19VTE9ORyggcCApICBGVF9VSU5UMzIoIEZUX0JZVEVfVTMyKCBwLCAwLCAyNCApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDEsIDE2ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMiwgIDggKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAzLCAgMCApICkKLQotI2RlZmluZSBGVF9QRUVLX09GRjMoIHAgKSAgRlRfSU5UMzIoIEZUX0JZVEVfVTMyKCBwLCAwLCAxNiApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAxLCAgOCApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAyLCAgMCApICkKLQotI2RlZmluZSBGVF9QRUVLX1VPRkYzKCBwICkgIEZUX1VJTlQzMiggRlRfQllURV9VMzIoIHAsIDAsIDE2ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMSwgIDggKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAyLCAgMCApICkKLQotI2RlZmluZSBGVF9QRUVLX1NIT1JUX0xFKCBwICkgIEZUX0lOVDE2KCBGVF9CWVRFX1UxNiggcCwgMSwgOCApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UxNiggcCwgMCwgMCApICkKLQotI2RlZmluZSBGVF9QRUVLX1VTSE9SVF9MRSggcCApICBGVF9VSU5UMTYoIEZUX0JZVEVfVTE2KCBwLCAxLCA4ICkgfCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTE2KCBwLCAwLCAwICkgKQotCi0jZGVmaW5lIEZUX1BFRUtfTE9OR19MRSggcCApICBGVF9JTlQzMiggRlRfQllURV9VMzIoIHAsIDMsIDI0ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDIsIDE2ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDEsICA4ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDAsICAwICkgKQotCi0jZGVmaW5lIEZUX1BFRUtfVUxPTkdfTEUoIHAgKSAgRlRfVUlOVDMyKCBGVF9CWVRFX1UzMiggcCwgMywgMjQgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JZVEVfVTMyKCBwLCAyLCAxNiApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDEsICA4ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMCwgIDAgKSApCi0KLSNkZWZpbmUgRlRfUEVFS19PRkYzX0xFKCBwICkgIEZUX0lOVDMyKCBGVF9CWVRFX1UzMiggcCwgMiwgMTYgKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMSwgIDggKSB8IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMCwgIDAgKSApCi0KLSNkZWZpbmUgRlRfUEVFS19VT0ZGM19MRSggcCApICBGVF9VSU5UMzIoIEZUX0JZVEVfVTMyKCBwLCAyLCAxNiApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQllURV9VMzIoIHAsIDEsICA4ICkgfCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CWVRFX1UzMiggcCwgMCwgIDAgKSApCi0KLQotI2RlZmluZSBGVF9ORVhUX0NIQVIoIGJ1ZmZlciApICAgICAgIFwKLSAgICAgICAgICAoIChzaWduZWQgY2hhcikqYnVmZmVyKysgKQotCi0jZGVmaW5lIEZUX05FWFRfQllURSggYnVmZmVyICkgICAgICAgICBcCi0gICAgICAgICAgKCAodW5zaWduZWQgY2hhcikqYnVmZmVyKysgKQotCi0jZGVmaW5lIEZUX05FWFRfU0hPUlQoIGJ1ZmZlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoc2hvcnQpKCBidWZmZXIgKz0gMiwgRlRfUEVFS19TSE9SVCggYnVmZmVyIC0gMiApICkgKQotCi0jZGVmaW5lIEZUX05FWFRfVVNIT1JUKCBidWZmZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKHVuc2lnbmVkIHNob3J0KSggYnVmZmVyICs9IDIsIEZUX1BFRUtfVVNIT1JUKCBidWZmZXIgLSAyICkgKSApCi0KLSNkZWZpbmUgRlRfTkVYVF9PRkYzKCBidWZmZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAobG9uZykoIGJ1ZmZlciArPSAzLCBGVF9QRUVLX09GRjMoIGJ1ZmZlciAtIDMgKSApICkKLQotI2RlZmluZSBGVF9ORVhUX1VPRkYzKCBidWZmZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAodW5zaWduZWQgbG9uZykoIGJ1ZmZlciArPSAzLCBGVF9QRUVLX1VPRkYzKCBidWZmZXIgLSAzICkgKSApCi0KLSNkZWZpbmUgRlRfTkVYVF9MT05HKCBidWZmZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAobG9uZykoIGJ1ZmZlciArPSA0LCBGVF9QRUVLX0xPTkcoIGJ1ZmZlciAtIDQgKSApICkKLQotI2RlZmluZSBGVF9ORVhUX1VMT05HKCBidWZmZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAodW5zaWduZWQgbG9uZykoIGJ1ZmZlciArPSA0LCBGVF9QRUVLX1VMT05HKCBidWZmZXIgLSA0ICkgKSApCi0KLQotI2RlZmluZSBGVF9ORVhUX1NIT1JUX0xFKCBidWZmZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKHNob3J0KSggYnVmZmVyICs9IDIsIEZUX1BFRUtfU0hPUlRfTEUoIGJ1ZmZlciAtIDIgKSApICkKLQotI2RlZmluZSBGVF9ORVhUX1VTSE9SVF9MRSggYnVmZmVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoICh1bnNpZ25lZCBzaG9ydCkoIGJ1ZmZlciArPSAyLCBGVF9QRUVLX1VTSE9SVF9MRSggYnVmZmVyIC0gMiApICkgKQotCi0jZGVmaW5lIEZUX05FWFRfT0ZGM19MRSggYnVmZmVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKGxvbmcpKCBidWZmZXIgKz0gMywgRlRfUEVFS19PRkYzX0xFKCBidWZmZXIgLSAzICkgKSApCi0KLSNkZWZpbmUgRlRfTkVYVF9VT0ZGM19MRSggYnVmZmVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpKCBidWZmZXIgKz0gMywgRlRfUEVFS19VT0ZGM19MRSggYnVmZmVyIC0gMyApICkgKQotCi0jZGVmaW5lIEZUX05FWFRfTE9OR19MRSggYnVmZmVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKGxvbmcpKCBidWZmZXIgKz0gNCwgRlRfUEVFS19MT05HX0xFKCBidWZmZXIgLSA0ICkgKSApCi0KLSNkZWZpbmUgRlRfTkVYVF9VTE9OR19MRSggYnVmZmVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKHVuc2lnbmVkIGxvbmcpKCBidWZmZXIgKz0gNCwgRlRfUEVFS19VTE9OR19MRSggYnVmZmVyIC0gNCApICkgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBFYWNoIEdFVF94eHh4KCkgbWFjcm8gdXNlcyBhbiBpbXBsaWNpdCBgc3RyZWFtJyB2YXJpYWJsZS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWYgMAotI2RlZmluZSBGVF9HRVRfTUFDUk8oIHR5cGUgKSAgICBGVF9ORVhUXyAjIyB0eXBlICggc3RyZWFtLT5jdXJzb3IgKQotCi0jZGVmaW5lIEZUX0dFVF9DSEFSKCkgICAgICAgRlRfR0VUX01BQ1JPKCBDSEFSICkKLSNkZWZpbmUgRlRfR0VUX0JZVEUoKSAgICAgICBGVF9HRVRfTUFDUk8oIEJZVEUgKQotI2RlZmluZSBGVF9HRVRfU0hPUlQoKSAgICAgIEZUX0dFVF9NQUNSTyggU0hPUlQgKQotI2RlZmluZSBGVF9HRVRfVVNIT1JUKCkgICAgIEZUX0dFVF9NQUNSTyggVVNIT1JUICkKLSNkZWZpbmUgRlRfR0VUX09GRjMoKSAgICAgICBGVF9HRVRfTUFDUk8oIE9GRjMgKQotI2RlZmluZSBGVF9HRVRfVU9GRjMoKSAgICAgIEZUX0dFVF9NQUNSTyggVU9GRjMgKQotI2RlZmluZSBGVF9HRVRfTE9ORygpICAgICAgIEZUX0dFVF9NQUNSTyggTE9ORyApCi0jZGVmaW5lIEZUX0dFVF9VTE9ORygpICAgICAgRlRfR0VUX01BQ1JPKCBVTE9ORyApCi0jZGVmaW5lIEZUX0dFVF9UQUc0KCkgICAgICAgRlRfR0VUX01BQ1JPKCBVTE9ORyApCi0KLSNkZWZpbmUgRlRfR0VUX1NIT1JUX0xFKCkgICBGVF9HRVRfTUFDUk8oIFNIT1JUX0xFICkKLSNkZWZpbmUgRlRfR0VUX1VTSE9SVF9MRSgpICBGVF9HRVRfTUFDUk8oIFVTSE9SVF9MRSApCi0jZGVmaW5lIEZUX0dFVF9MT05HX0xFKCkgICAgRlRfR0VUX01BQ1JPKCBMT05HX0xFICkKLSNkZWZpbmUgRlRfR0VUX1VMT05HX0xFKCkgICBGVF9HRVRfTUFDUk8oIFVMT05HX0xFICkKLQotI2Vsc2UKLSNkZWZpbmUgRlRfR0VUX01BQ1JPKCBmdW5jLCB0eXBlICkgICAgICAgICggKHR5cGUpZnVuYyggc3RyZWFtICkgKQotCi0jZGVmaW5lIEZUX0dFVF9DSEFSKCkgICAgICAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0Q2hhciwgRlRfQ2hhciApCi0jZGVmaW5lIEZUX0dFVF9CWVRFKCkgICAgICAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0Q2hhciwgRlRfQnl0ZSApCi0jZGVmaW5lIEZUX0dFVF9TSE9SVCgpICAgICAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0VVNob3J0LCBGVF9TaG9ydCApCi0jZGVmaW5lIEZUX0dFVF9VU0hPUlQoKSAgICAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0VVNob3J0LCBGVF9VU2hvcnQgKQotI2RlZmluZSBGVF9HRVRfT0ZGMygpICAgICAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldFVPZmZzZXQsIEZUX0xvbmcgKQotI2RlZmluZSBGVF9HRVRfVU9GRjMoKSAgICAgIEZUX0dFVF9NQUNSTyggRlRfU3RyZWFtX0dldFVPZmZzZXQsIEZUX1VMb25nICkKLSNkZWZpbmUgRlRfR0VUX0xPTkcoKSAgICAgICBGVF9HRVRfTUFDUk8oIEZUX1N0cmVhbV9HZXRVTG9uZywgRlRfTG9uZyApCi0jZGVmaW5lIEZUX0dFVF9VTE9ORygpICAgICAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0VUxvbmcsIEZUX1VMb25nICkKLSNkZWZpbmUgRlRfR0VUX1RBRzQoKSAgICAgICBGVF9HRVRfTUFDUk8oIEZUX1N0cmVhbV9HZXRVTG9uZywgRlRfVUxvbmcgKQotCi0jZGVmaW5lIEZUX0dFVF9TSE9SVF9MRSgpICAgRlRfR0VUX01BQ1JPKCBGVF9TdHJlYW1fR2V0VVNob3J0TEUsIEZUX1Nob3J0ICkKLSNkZWZpbmUgRlRfR0VUX1VTSE9SVF9MRSgpICBGVF9HRVRfTUFDUk8oIEZUX1N0cmVhbV9HZXRVU2hvcnRMRSwgRlRfVVNob3J0ICkKLSNkZWZpbmUgRlRfR0VUX0xPTkdfTEUoKSAgICBGVF9HRVRfTUFDUk8oIEZUX1N0cmVhbV9HZXRVTG9uZ0xFLCBGVF9Mb25nICkKLSNkZWZpbmUgRlRfR0VUX1VMT05HX0xFKCkgICBGVF9HRVRfTUFDUk8oIEZUX1N0cmVhbV9HZXRVTG9uZ0xFLCBGVF9VTG9uZyApCi0jZW5kaWYKLQotI2RlZmluZSBGVF9SRUFEX01BQ1JPKCBmdW5jLCB0eXBlLCB2YXIgKSAgICAgICAgXAotICAgICAgICAgICggdmFyID0gKHR5cGUpZnVuYyggc3RyZWFtLCAmZXJyb3IgKSwgXAotICAgICAgICAgICAgZXJyb3IgIT0gRlRfRXJyX09rICkKLQotI2RlZmluZSBGVF9SRUFEX0JZVEUoIHZhciApICAgICAgIEZUX1JFQURfTUFDUk8oIEZUX1N0cmVhbV9SZWFkQ2hhciwgRlRfQnl0ZSwgdmFyICkKLSNkZWZpbmUgRlRfUkVBRF9DSEFSKCB2YXIgKSAgICAgICBGVF9SRUFEX01BQ1JPKCBGVF9TdHJlYW1fUmVhZENoYXIsIEZUX0NoYXIsIHZhciApCi0jZGVmaW5lIEZUX1JFQURfU0hPUlQoIHZhciApICAgICAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRVU2hvcnQsIEZUX1Nob3J0LCB2YXIgKQotI2RlZmluZSBGVF9SRUFEX1VTSE9SVCggdmFyICkgICAgIEZUX1JFQURfTUFDUk8oIEZUX1N0cmVhbV9SZWFkVVNob3J0LCBGVF9VU2hvcnQsIHZhciApCi0jZGVmaW5lIEZUX1JFQURfT0ZGMyggdmFyICkgICAgICAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRVT2Zmc2V0LCBGVF9Mb25nLCB2YXIgKQotI2RlZmluZSBGVF9SRUFEX1VPRkYzKCB2YXIgKSAgICAgIEZUX1JFQURfTUFDUk8oIEZUX1N0cmVhbV9SZWFkVU9mZnNldCwgRlRfVUxvbmcsIHZhciApCi0jZGVmaW5lIEZUX1JFQURfTE9ORyggdmFyICkgICAgICAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRVTG9uZywgRlRfTG9uZywgdmFyICkKLSNkZWZpbmUgRlRfUkVBRF9VTE9ORyggdmFyICkgICAgICBGVF9SRUFEX01BQ1JPKCBGVF9TdHJlYW1fUmVhZFVMb25nLCBGVF9VTG9uZywgdmFyICkKLQotI2RlZmluZSBGVF9SRUFEX1NIT1JUX0xFKCB2YXIgKSAgIEZUX1JFQURfTUFDUk8oIEZUX1N0cmVhbV9SZWFkVVNob3J0TEUsIEZUX1Nob3J0LCB2YXIgKQotI2RlZmluZSBGVF9SRUFEX1VTSE9SVF9MRSggdmFyICkgIEZUX1JFQURfTUFDUk8oIEZUX1N0cmVhbV9SZWFkVVNob3J0TEUsIEZUX1VTaG9ydCwgdmFyICkKLSNkZWZpbmUgRlRfUkVBRF9MT05HX0xFKCB2YXIgKSAgICBGVF9SRUFEX01BQ1JPKCBGVF9TdHJlYW1fUmVhZFVMb25nTEUsIEZUX0xvbmcsIHZhciApCi0jZGVmaW5lIEZUX1JFQURfVUxPTkdfTEUoIHZhciApICAgRlRfUkVBRF9NQUNSTyggRlRfU3RyZWFtX1JlYWRVTG9uZ0xFLCBGVF9VTG9uZywgdmFyICkKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fTk9fREVGQVVMVF9TWVNURU0KLQotICAvKiBpbml0aWFsaXplIGEgc3RyZWFtIGZvciByZWFkaW5nIGEgcmVndWxhciBzeXN0ZW0gc3RyZWFtICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX09wZW4oIEZUX1N0cmVhbSAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgZmlsZXBhdGhuYW1lICk7Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX05PX0RFRkFVTFRfU1lTVEVNICovCi0KLQotICAvKiBjcmVhdGUgYSBuZXcgKGlucHV0KSBzdHJlYW0gZnJvbSBhbiBGVF9PcGVuX0FyZ3Mgc3RydWN0dXJlICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX05ldyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgY29uc3QgRlRfT3Blbl9BcmdzKiAgYXJncywKLSAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgICAgICAqYXN0cmVhbSApOwotCi0gIC8qIGZyZWUgYSBzdHJlYW0gKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX1N0cmVhbV9GcmVlKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgZXh0ZXJuYWwgKTsKLQotICAvKiBpbml0aWFsaXplIGEgc3RyZWFtIGZvciByZWFkaW5nIGluLW1lbW9yeSBkYXRhICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9TdHJlYW1fT3Blbk1lbW9yeSggRlRfU3RyZWFtICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgIHNpemUgKTsKLQotICAvKiBjbG9zZSBhIHN0cmVhbSAoZG9lcyBub3QgZGVzdHJveSB0aGUgc3RyZWFtIHN0cnVjdHVyZSkgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX1N0cmVhbV9DbG9zZSggRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotCi0gIC8qIHNlZWsgd2l0aGluIGEgc3RyZWFtLiBwb3NpdGlvbiBpcyByZWxhdGl2ZSB0byBzdGFydCBvZiBzdHJlYW0gKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fU2VlayggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHBvcyApOwotCi0gIC8qIHNraXAgYnl0ZXMgaW4gYSBzdHJlYW0gKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fU2tpcCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIGRpc3RhbmNlICk7Ci0KLSAgLyogcmV0dXJuIGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9uICovCi0gIEZUX0JBU0UoIEZUX1VMb25nICkKLSAgRlRfU3RyZWFtX1BvcyggRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotICAvKiByZWFkIGJ5dGVzIGZyb20gYSBzdHJlYW0gaW50byBhIHVzZXItYWxsb2NhdGVkIGJ1ZmZlciwgcmV0dXJucyBhbiAqLwotICAvKiBlcnJvciBpZiBub3QgYWxsIGJ5dGVzIGNvdWxkIGJlIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9SZWFkKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBjb3VudCApOwotCi0gIC8qIHJlYWQgYnl0ZXMgZnJvbSBhIHN0cmVhbSBhdCBhIGdpdmVuIHBvc2l0aW9uICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX1JlYWRBdCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgcG9zLAotICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBjb3VudCApOwotCi0gIC8qIHRyeSB0byByZWFkIGJ5dGVzIGF0IHRoZSBlbmQgb2YgYSBzdHJlYW07IHJldHVybiBudW1iZXIgb2YgYnl0ZXMgKi8KLSAgLyogcmVhbGx5IGF2YWlsYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCBGVF9VTG9uZyApCi0gIEZUX1N0cmVhbV9UcnlSZWFkKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBjb3VudCApOwotCi0gIC8qIEVudGVyIGEgZnJhbWUgb2YgYGNvdW50JyBjb25zZWN1dGl2ZSBieXRlcyBpbiBhIHN0cmVhbS4gIFJldHVybnMgYW4gKi8KLSAgLyogZXJyb3IgaWYgdGhlIGZyYW1lIGNvdWxkIG5vdCBiZSByZWFkL2FjY2Vzc2VkLiAgVGhlIGNhbGxlciBjYW4gdXNlICAqLwotICAvKiB0aGUgRlRfU3RyZWFtX0dldF9YWFggZnVuY3Rpb25zIHRvIHJldHJpZXZlIGZyYW1lIGRhdGEgd2l0aG91dCAgICAgICovCi0gIC8qIGVycm9yIGNoZWNrcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBZb3UgbXVzdCBfYWx3YXlzXyBjYWxsIEZUX1N0cmVhbV9FeGl0RnJhbWUoKSBvbmNlIHlvdSBoYXZlIGVudGVyZWQgICovCi0gIC8qIGEgc3RyZWFtIGZyYW1lISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9FbnRlckZyYW1lKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKTsKLQotICAvKiBleGl0IGEgc3RyZWFtIGZyYW1lICovCi0gIEZUX0JBU0UoIHZvaWQgKQotICBGVF9TdHJlYW1fRXhpdEZyYW1lKCBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0gIC8qIEV4dHJhY3QgYSBzdHJlYW0gZnJhbWUuICBJZiB0aGUgc3RyZWFtIGlzIGRpc2stYmFzZWQsIGEgaGVhcCBibG9jayAqLwotICAvKiBpcyBhbGxvY2F0ZWQgYW5kIHRoZSBmcmFtZSBieXRlcyBhcmUgcmVhZCBpbnRvIGl0LiAgSWYgdGhlIHN0cmVhbSAgKi8KLSAgLyogaXMgbWVtb3J5LWJhc2VkLCB0aGlzIGZ1bmN0aW9uIHNpbXBseSBzZXQgYSBwb2ludGVyIHRvIHRoZSBkYXRhLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBVc2VmdWwgdG8gb3B0aW1pemUgYWNjZXNzIHRvIG1lbW9yeS1iYXNlZCBzdHJlYW1zIHRyYW5zcGFyZW50bHkuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFsbCBleHRyYWN0ZWQgZnJhbWVzIG11c3QgYmUgYGZyZWVkJyB3aXRoIGEgY2FsbCB0byB0aGUgZnVuY3Rpb24gICAqLwotICAvKiBGVF9TdHJlYW1fUmVsZWFzZUZyYW1lKCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0UoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX0V4dHJhY3RGcmFtZSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgcGJ5dGVzICk7Ci0KLSAgLyogcmVsZWFzZSBhbiBleHRyYWN0IGZyYW1lIChzZWUgRlRfU3RyZWFtX0V4dHJhY3RGcmFtZSkgKi8KLSAgRlRfQkFTRSggdm9pZCApCi0gIEZUX1N0cmVhbV9SZWxlYXNlRnJhbWUoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBieXRlcyApOwotCi0gIC8qIHJlYWQgYSBieXRlIGZyb20gYW4gZW50ZXJlZCBmcmFtZSAqLwotICBGVF9CQVNFKCBGVF9DaGFyICkKLSAgRlRfU3RyZWFtX0dldENoYXIoIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLSAgLyogcmVhZCBhIDE2LWJpdCBiaWctZW5kaWFuIHVuc2lnbmVkIGludGVnZXIgZnJvbSBhbiBlbnRlcmVkIGZyYW1lICovCi0gIEZUX0JBU0UoIEZUX1VTaG9ydCApCi0gIEZUX1N0cmVhbV9HZXRVU2hvcnQoIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLSAgLyogcmVhZCBhIDI0LWJpdCBiaWctZW5kaWFuIHVuc2lnbmVkIGludGVnZXIgZnJvbSBhbiBlbnRlcmVkIGZyYW1lICovCi0gIEZUX0JBU0UoIEZUX1VMb25nICkKLSAgRlRfU3RyZWFtX0dldFVPZmZzZXQoIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLSAgLyogcmVhZCBhIDMyLWJpdCBiaWctZW5kaWFuIHVuc2lnbmVkIGludGVnZXIgZnJvbSBhbiBlbnRlcmVkIGZyYW1lICovCi0gIEZUX0JBU0UoIEZUX1VMb25nICkKLSAgRlRfU3RyZWFtX0dldFVMb25nKCBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0gIC8qIHJlYWQgYSAxNi1iaXQgbGl0dGxlLWVuZGlhbiB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gYW4gZW50ZXJlZCBmcmFtZSAqLwotICBGVF9CQVNFKCBGVF9VU2hvcnQgKQotICBGVF9TdHJlYW1fR2V0VVNob3J0TEUoIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLSAgLyogcmVhZCBhIDMyLWJpdCBsaXR0bGUtZW5kaWFuIHVuc2lnbmVkIGludGVnZXIgZnJvbSBhbiBlbnRlcmVkIGZyYW1lICovCi0gIEZUX0JBU0UoIEZUX1VMb25nICkKLSAgRlRfU3RyZWFtX0dldFVMb25nTEUoIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLQotICAvKiByZWFkIGEgYnl0ZSBmcm9tIGEgc3RyZWFtICovCi0gIEZUX0JBU0UoIEZUX0NoYXIgKQotICBGVF9TdHJlYW1fUmVhZENoYXIoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKTsKLQotICAvKiByZWFkIGEgMTYtYml0IGJpZy1lbmRpYW4gdW5zaWduZWQgaW50ZWdlciBmcm9tIGEgc3RyZWFtICovCi0gIEZUX0JBU0UoIEZUX1VTaG9ydCApCi0gIEZUX1N0cmVhbV9SZWFkVVNob3J0KCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKTsKLQotICAvKiByZWFkIGEgMjQtYml0IGJpZy1lbmRpYW4gdW5zaWduZWQgaW50ZWdlciBmcm9tIGEgc3RyZWFtICovCi0gIEZUX0JBU0UoIEZUX1VMb25nICkKLSAgRlRfU3RyZWFtX1JlYWRVT2Zmc2V0KCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICk7Ci0KLSAgLyogcmVhZCBhIDMyLWJpdCBiaWctZW5kaWFuIGludGVnZXIgZnJvbSBhIHN0cmVhbSAqLwotICBGVF9CQVNFKCBGVF9VTG9uZyApCi0gIEZUX1N0cmVhbV9SZWFkVUxvbmcoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICk7Ci0KLSAgLyogcmVhZCBhIDE2LWJpdCBsaXR0bGUtZW5kaWFuIHVuc2lnbmVkIGludGVnZXIgZnJvbSBhIHN0cmVhbSAqLwotICBGVF9CQVNFKCBGVF9VU2hvcnQgKQotICBGVF9TdHJlYW1fUmVhZFVTaG9ydExFKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICBlcnJvciApOwotCi0gIC8qIHJlYWQgYSAzMi1iaXQgbGl0dGxlLWVuZGlhbiB1bnNpZ25lZCBpbnRlZ2VyIGZyb20gYSBzdHJlYW0gKi8KLSAgRlRfQkFTRSggRlRfVUxvbmcgKQotICBGVF9TdHJlYW1fUmVhZFVMb25nTEUoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKTsKLQotICAvKiBSZWFkIGEgc3RydWN0dXJlIGZyb20gYSBzdHJlYW0uICBUaGUgc3RydWN0dXJlIG11c3QgYmUgZGVzY3JpYmVkICovCi0gIC8qIGJ5IGFuIGFycmF5IG9mIEZUX0ZyYW1lX0ZpZWxkIHJlY29yZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRSggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fUmVhZEZpZWxkcyggRlRfU3RyZWFtICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9GcmFtZV9GaWVsZCogIGZpZWxkcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgc3RydWN0dXJlICk7Ci0KLQotI2RlZmluZSBGVF9TVFJFQU1fUE9TKCkgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9TdHJlYW1fUG9zKCBzdHJlYW0gKQotCi0jZGVmaW5lIEZUX1NUUkVBTV9TRUVLKCBwb3NpdGlvbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9TRVRfRVJST1IoIEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VTG9uZykocG9zaXRpb24pICkgKQotCi0jZGVmaW5lIEZUX1NUUkVBTV9TS0lQKCBkaXN0YW5jZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX1NFVF9FUlJPUiggRlRfU3RyZWFtX1NraXAoIHN0cmVhbSwgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfTG9uZykoZGlzdGFuY2UpICkgKQotCi0jZGVmaW5lIEZUX1NUUkVBTV9SRUFEKCBidWZmZXIsIGNvdW50ICkgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9TRVRfRVJST1IoIEZUX1N0cmVhbV9SZWFkKCBzdHJlYW0sICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9CeXRlKikoYnVmZmVyKSwgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VMb25nKShjb3VudCkgKSApCi0KLSNkZWZpbmUgRlRfU1RSRUFNX1JFQURfQVQoIHBvc2l0aW9uLCBidWZmZXIsIGNvdW50ICkgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfU0VUX0VSUk9SKCBGVF9TdHJlYW1fUmVhZEF0KCBzdHJlYW0sICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VMb25nKShwb3NpdGlvbiksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9CeXRlKilidWZmZXIsICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUxvbmcpKGNvdW50KSApICkKLQotI2RlZmluZSBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIGZpZWxkcywgb2JqZWN0ICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9TRVRfRVJST1IoIEZUX1N0cmVhbV9SZWFkRmllbGRzKCBzdHJlYW0sIGZpZWxkcywgb2JqZWN0ICkgKQotCi0KLSNkZWZpbmUgRlRfRlJBTUVfRU5URVIoIHNpemUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgRlRfU0VUX0VSUk9SKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfREVCVUdfSU5ORVIoIEZUX1N0cmVhbV9FbnRlckZyYW1lKCBzdHJlYW0sICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VMb25nKShzaXplKSApICkgKQotCi0jZGVmaW5lIEZUX0ZSQU1FX0VYSVQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0RFQlVHX0lOTkVSKCBGVF9TdHJlYW1fRXhpdEZyYW1lKCBzdHJlYW0gKSApCi0KLSNkZWZpbmUgRlRfRlJBTUVfRVhUUkFDVCggc2l6ZSwgYnl0ZXMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBGVF9TRVRfRVJST1IoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEZUX0RFQlVHX0lOTkVSKCBGVF9TdHJlYW1fRXh0cmFjdEZyYW1lKCBzdHJlYW0sICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUxvbmcpKHNpemUpLCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSoqKSYoYnl0ZXMpICkgKSApCi0KLSNkZWZpbmUgRlRfRlJBTUVfUkVMRUFTRSggYnl0ZXMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEZUX0RFQlVHX0lOTkVSKCBGVF9TdHJlYW1fUmVsZWFzZUZyYW1lKCBzdHJlYW0sICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9CeXRlKiopJihieXRlcykgKSApCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVFNUUkVBTV9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR0cmFjZS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMjhkMjEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnR0cmFjZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRyYWNpbmcgaGFuZGxpbmcgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIGRlZmluaXRpb25zIG9mIHRyYWNlIGxldmVscyBmb3IgRnJlZVR5cGUgMiAqLwotCi0gIC8qIHRoZSBmaXJzdCBsZXZlbCBtdXN0IGFsd2F5cyBiZSBgdHJhY2VfYW55JyAqLwotRlRfVFJBQ0VfREVGKCBhbnkgKQotCi0gIC8qIGJhc2UgY29tcG9uZW50cyAqLwotRlRfVFJBQ0VfREVGKCBjYWxjICkgICAgICAvKiBjYWxjdWxhdGlvbnMgICAgICAgICAgICAoZnRjYWxjLmMpICAgKi8KLUZUX1RSQUNFX0RFRiggbWVtb3J5ICkgICAgLyogbWVtb3J5IG1hbmFnZXIgICAgICAgICAgKGZ0b2Jqcy5jKSAgICovCi1GVF9UUkFDRV9ERUYoIHN0cmVhbSApICAgIC8qIHN0cmVhbSBtYW5hZ2VyICAgICAgICAgIChmdHN0cmVhbS5jKSAqLwotRlRfVFJBQ0VfREVGKCBpbyApICAgICAgICAvKiBpL28gaW50ZXJmYWNlICAgICAgICAgICAoZnRzeXN0ZW0uYykgKi8KLUZUX1RSQUNFX0RFRiggbGlzdCApICAgICAgLyogbGlzdCBtYW5hZ2VtZW50ICAgICAgICAgKGZ0bGlzdC5jKSAgICovCi1GVF9UUkFDRV9ERUYoIGluaXQgKSAgICAgIC8qIGluaXRpYWxpemF0aW9uICAgICAgICAgIChmdGluaXQuYykgICAqLwotRlRfVFJBQ0VfREVGKCBvYmpzICkgICAgICAvKiBiYXNlIG9iamVjdHMgICAgICAgICAgICAoZnRvYmpzLmMpICAgKi8KLUZUX1RSQUNFX0RFRiggb3V0bGluZSApICAgLyogb3V0bGluZSBtYW5hZ2VtZW50ICAgICAgKGZ0b3V0bG4uYykgICovCi1GVF9UUkFDRV9ERUYoIGdseXBoICkgICAgIC8qIGdseXBoIG1hbmFnZW1lbnQgICAgICAgIChmdGdseXBoLmMpICAqLwotRlRfVFJBQ0VfREVGKCBnbG9hZGVyICkgICAvKiBnbHlwaCBsb2FkZXIgICAgICAgICAgICAoZnRnbG9hZHIuYykgKi8KLQotRlRfVFJBQ0VfREVGKCByYXN0ZXIgKSAgICAvKiBtb25vY2hyb21lIHJhc3Rlcml6ZXIgICAoZnRyYXN0ZXIuYykgKi8KLUZUX1RSQUNFX0RFRiggc21vb3RoICkgICAgLyogYW50aS1hbGlhc2luZyByYXN0ZXIgICAgKGZ0Z3JheXMuYykgICovCi1GVF9UUkFDRV9ERUYoIG1tICkgICAgICAgIC8qIE1NIGludGVyZmFjZSAgICAgICAgICAgIChmdG1tLmMpICAgICAqLwotRlRfVFJBQ0VfREVGKCByYWNjZXNzICkgICAvKiByZXNvdXJjZSBmb3JrIGFjY2Vzc29yICAoZnRyZm9yay5jKSAgKi8KLUZUX1RSQUNFX0RFRiggc3ludGggKSAgICAgLyogYm9sZC9zbGFudCBzeW50aGVzaXplciAgKGZ0c3ludGguYykgICovCi1GVF9UUkFDRV9ERUYoIGJpdG1hcCApICAgIC8qIGJpdG1hcCBjaGVja3N1bSAgICAgICAgIChmdG9ianMuYykgICAqLwotCi0gIC8qIENhY2hlIHN1Yi1zeXN0ZW0gKi8KLUZUX1RSQUNFX0RFRiggY2FjaGUgKSAgICAgLyogY2FjaGUgc3ViLXN5c3RlbSAgICAgICAgKGZ0Y2FjaGUuYywgZXRjLikgKi8KLQotICAvKiBTRk5UIGRyaXZlciBjb21wb25lbnRzICovCi1GVF9UUkFDRV9ERUYoIHNmZHJpdmVyICkgIC8qIFNGTlQgZm9udCBkcml2ZXIgICAgICAgIChzZmRyaXZlci5jKSAqLwotRlRfVFJBQ0VfREVGKCBzZm9ianMgKSAgICAvKiBTRk5UIG9iamVjdCBoYW5kbGVyICAgICAoc2ZvYmpzLmMpICAgKi8KLUZUX1RSQUNFX0RFRiggdHRjbWFwICkgICAgLyogY2hhcm1hcCBoYW5kbGVyICAgICAgICAgKHR0Y21hcC5jKSAgICovCi1GVF9UUkFDRV9ERUYoIHR0a2VybiApICAgIC8qIGtlcm5pbmcgaGFuZGxlciAgICAgICAgICh0dGtlcm4uYykgICAqLwotRlRfVFJBQ0VfREVGKCB0dGxvYWQgKSAgICAvKiBiYXNpYyBUcnVlVHlwZSB0YWJsZXMgICAodHRsb2FkLmMpICAgKi8KLUZUX1RSQUNFX0RFRiggdHRtdHggKSAgICAgLyogbWV0cmljcy1yZWxhdGVkIHRhYmxlcyAgKHR0bXR4LmMpICAgICovCi1GVF9UUkFDRV9ERUYoIHR0cG9zdCApICAgIC8qIFBTIHRhYmxlIHByb2Nlc3NpbmcgICAgICh0dHBvc3QuYykgICAqLwotRlRfVFJBQ0VfREVGKCB0dHNiaXQgKSAgICAvKiBUcnVlVHlwZSBzYml0IGhhbmRsaW5nICAodHRzYml0LmMpICAgKi8KLUZUX1RSQUNFX0RFRiggdHRiZGYgKSAgICAgLyogVHJ1ZVR5cGUgZW1iZWRkZWQgQkRGICAgKHR0YmRmLmMpICAgICovCi0KLSAgLyogVHJ1ZVR5cGUgZHJpdmVyIGNvbXBvbmVudHMgKi8KLUZUX1RSQUNFX0RFRiggdHRkcml2ZXIgKSAgLyogVFQgZm9udCBkcml2ZXIgICAgICAgICAgKHR0ZHJpdmVyLmMpICovCi1GVF9UUkFDRV9ERUYoIHR0Z2xvYWQgKSAgIC8qIFRUIGdseXBoIGxvYWRlciAgICAgICAgICh0dGdsb2FkLmMpICAqLwotRlRfVFJBQ0VfREVGKCB0dGludGVycCApICAvKiBieXRlY29kZSBpbnRlcnByZXRlciAgICAodHRpbnRlcnAuYykgKi8KLUZUX1RSQUNFX0RFRiggdHRvYmpzICkgICAgLyogVFQgb2JqZWN0cyBtYW5hZ2VyICAgICAgKHR0b2Jqcy5jKSAgICovCi1GVF9UUkFDRV9ERUYoIHR0cGxvYWQgKSAgIC8qIFRUIGRhdGEvcHJvZ3JhbSBsb2FkZXIgICh0dHBsb2FkLmMpICAqLwotRlRfVFJBQ0VfREVGKCB0dGd4dmFyICkgICAvKiBUcnVlVHlwZSBHWCB2YXIgaGFuZGxlciAodHRneHZhci5jKSAgKi8KLQotICAvKiBUeXBlIDEgZHJpdmVyIGNvbXBvbmVudHMgKi8KLUZUX1RSQUNFX0RFRiggdDFhZm0gKQotRlRfVFJBQ0VfREVGKCB0MWRyaXZlciApCi1GVF9UUkFDRV9ERUYoIHQxZ2xvYWQgKQotRlRfVFJBQ0VfREVGKCB0MWhpbnQgKQotRlRfVFJBQ0VfREVGKCB0MWxvYWQgKQotRlRfVFJBQ0VfREVGKCB0MW9ianMgKQotRlRfVFJBQ0VfREVGKCB0MXBhcnNlICkKLQotICAvKiBQb3N0U2NyaXB0IGhlbHBlciBtb2R1bGUgYHBzYXV4JyAqLwotRlRfVFJBQ0VfREVGKCB0MWRlY29kZSApCi1GVF9UUkFDRV9ERUYoIHBzb2JqcyApCi1GVF9UUkFDRV9ERUYoIHBzY29udiApCi0KLSAgLyogUG9zdFNjcmlwdCBoaW50aW5nIG1vZHVsZSBgcHNoaW50ZXInICovCi1GVF9UUkFDRV9ERUYoIHBzaHJlYyApCi1GVF9UUkFDRV9ERUYoIHBzaGFsZ28xICkKLUZUX1RSQUNFX0RFRiggcHNoYWxnbzIgKQotCi0gIC8qIFR5cGUgMiBkcml2ZXIgY29tcG9uZW50cyAqLwotRlRfVFJBQ0VfREVGKCBjZmZkcml2ZXIgKQotRlRfVFJBQ0VfREVGKCBjZmZnbG9hZCApCi1GVF9UUkFDRV9ERUYoIGNmZmxvYWQgKQotRlRfVFJBQ0VfREVGKCBjZmZvYmpzICkKLUZUX1RSQUNFX0RFRiggY2ZmcGFyc2UgKQotCi1GVF9UUkFDRV9ERUYoIGNmMmJsdWVzICkKLUZUX1RSQUNFX0RFRiggY2YyaGludHMgKQotRlRfVFJBQ0VfREVGKCBjZjJpbnRlcnAgKQotCi0gIC8qIFR5cGUgNDIgZHJpdmVyIGNvbXBvbmVudCAqLwotRlRfVFJBQ0VfREVGKCB0NDIgKQotCi0gIC8qIENJRCBkcml2ZXIgY29tcG9uZW50cyAqLwotRlRfVFJBQ0VfREVGKCBjaWRhZm0gKQotRlRfVFJBQ0VfREVGKCBjaWRkcml2ZXIgKQotRlRfVFJBQ0VfREVGKCBjaWRnbG9hZCApCi1GVF9UUkFDRV9ERUYoIGNpZGxvYWQgKQotRlRfVFJBQ0VfREVGKCBjaWRvYmpzICkKLUZUX1RSQUNFX0RFRiggY2lkcGFyc2UgKQotCi0gIC8qIFdpbmRvd3MgZm9udCBjb21wb25lbnQgKi8KLUZUX1RSQUNFX0RFRiggd2luZm50ICkKLQotICAvKiBQQ0YgZm9udCBjb21wb25lbnRzICovCi1GVF9UUkFDRV9ERUYoIHBjZmRyaXZlciApCi1GVF9UUkFDRV9ERUYoIHBjZnJlYWQgKQotCi0gIC8qIEJERiBmb250IGNvbXBvbmVudHMgKi8KLUZUX1RSQUNFX0RFRiggYmRmZHJpdmVyICkKLUZUX1RSQUNFX0RFRiggYmRmbGliICkKLQotICAvKiBQRlIgZm9udCBjb21wb25lbnQgKi8KLUZUX1RSQUNFX0RFRiggcGZyICkKLQotICAvKiBPcGVuVHlwZSB2YWxpZGF0aW9uIGNvbXBvbmVudHMgKi8KLUZUX1RSQUNFX0RFRiggb3R2bW9kdWxlICkKLUZUX1RSQUNFX0RFRiggb3R2Y29tbW9uICkKLUZUX1RSQUNFX0RFRiggb3R2YmFzZSApCi1GVF9UUkFDRV9ERUYoIG90dmdkZWYgKQotRlRfVFJBQ0VfREVGKCBvdHZncG9zICkKLUZUX1RSQUNFX0RFRiggb3R2Z3N1YiApCi1GVF9UUkFDRV9ERUYoIG90dmpzdGYgKQotRlRfVFJBQ0VfREVGKCBvdHZtYXRoICkKLQotICAvKiBUcnVlVHlwZUdYL0FBVCB2YWxpZGF0aW9uIGNvbXBvbmVudHMgKi8KLUZUX1RSQUNFX0RFRiggZ3h2bW9kdWxlICkKLUZUX1RSQUNFX0RFRiggZ3h2Y29tbW9uICkKLUZUX1RSQUNFX0RFRiggZ3h2ZmVhdCApCi1GVF9UUkFDRV9ERUYoIGd4dm1vcnQgKQotRlRfVFJBQ0VfREVGKCBneHZtb3J4ICkKLUZUX1RSQUNFX0RFRiggZ3h2YnNsbiApCi1GVF9UUkFDRV9ERUYoIGd4dmp1c3QgKQotRlRfVFJBQ0VfREVGKCBneHZrZXJuICkKLUZUX1RSQUNFX0RFRiggZ3h2b3BiZCApCi1GVF9UUkFDRV9ERUYoIGd4dnRyYWsgKQotRlRfVFJBQ0VfREVGKCBneHZwcm9wICkKLUZUX1RSQUNFX0RFRiggZ3h2bGNhciApCi0KLSAgLyogYXV0b2ZpdCBjb21wb25lbnRzICovCi1GVF9UUkFDRV9ERUYoIGFmbW9kdWxlICkKLUZUX1RSQUNFX0RFRiggYWZoaW50cyApCi1GVF9UUkFDRV9ERUYoIGFmY2prICkKLUZUX1RSQUNFX0RFRiggYWZsYXRpbiApCi1GVF9UUkFDRV9ERUYoIGFmbGF0aW4yICkKLUZUX1RSQUNFX0RFRiggYWZ3YXJwICkKLUZUX1RSQUNFX0RFRiggYWZoYXJmYnV6eiApCi1GVF9UUkFDRV9ERUYoIGFmZ2xvYmFsICkKLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dmFsaWQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR2YWxpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2RhNmVlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvZnR2YWxpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0dmFsaWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSB2YWxpZGF0aW9uIHN1cHBvcnQgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUVkFMSURfSF9fCi0jZGVmaW5lIF9fRlRWQUxJRF9IX18KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9DT05GSUdfU1RBTkRBUkRfTElCUkFSWV9IICAgLyogZm9yIGZ0X3NldGptcCBhbmQgZnRfbG9uZ2ptcCAqLwotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgViBBIEwgSSBEIEEgVCBJIE8gTiAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIGhhbmRsZSB0byBhIHZhbGlkYXRpb24gb2JqZWN0ICovCi0gIHR5cGVkZWYgc3RydWN0IEZUX1ZhbGlkYXRvclJlY18gdm9sYXRpbGUqICBGVF9WYWxpZGF0b3I7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZXJlIGFyZSB0aHJlZSBkaXN0aW5jdCB2YWxpZGF0aW9uIGxldmVscyBkZWZpbmVkIGhlcmU6ICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRlRfVkFMSURBVEVfREVGQVVMVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQSB0YWJsZSB0aGF0IHBhc3NlcyB0aGlzIHZhbGlkYXRpb24gbGV2ZWwgY2FuIGJlIHVzZWQgcmVsaWFibHkgYnkgICAqLwotICAvKiAgIEZyZWVUeXBlLiAgSXQgZ2VuZXJhbGx5IG1lYW5zIHRoYXQgYWxsIG9mZnNldHMgaGF2ZSBiZWVuIGNoZWNrZWQgdG8gKi8KLSAgLyogICBwcmV2ZW50IG91dC1vZi1ib3VuZCByZWFkcywgdGhhdCBhcnJheSBjb3VudHMgYXJlIGNvcnJlY3QsIGV0Yy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGVF9WQUxJREFURV9USUdIVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBBIHRhYmxlIHRoYXQgcGFzc2VzIHRoaXMgdmFsaWRhdGlvbiBsZXZlbCBjYW4gYmUgdXNlZCByZWxpYWJseSBhbmQgICovCi0gIC8qICAgZG9lc24ndCBjb250YWluIGludmFsaWQgZGF0YS4gIEZvciBleGFtcGxlLCBhIGNoYXJtYXAgdGFibGUgdGhhdCAgICAqLwotICAvKiAgIHJldHVybnMgaW52YWxpZCBnbHlwaCBpbmRpY2VzIHdpbGwgbm90IHBhc3MsIGV2ZW4gdGhvdWdoIGl0IGNhbiAgICAgKi8KLSAgLyogICBiZSB1c2VkIHdpdGggRnJlZVR5cGUgaW4gZGVmYXVsdCBtb2RlICh0aGUgbGlicmFyeSB3aWxsIHNpbXBseSAgICAgICovCi0gIC8qICAgcmV0dXJuIGFuIGVycm9yIGxhdGVyIHdoZW4gdHJ5aW5nIHRvIGxvYWQgdGhlIGdseXBoKS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBJdCBhbHNvIGNoZWNrcyB0aGF0IGZpZWxkcyB3aGljaCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMiwgNCwgb3IgOCwgICovCi0gIC8qICAgZG9uJ3QgaGF2ZSBpbmNvcnJlY3QgdmFsdWVzLCBldGMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRlRfVkFMSURBVEVfUEFSQU5PSUQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgT25seSBmb3IgZm9udCBkZWJ1Z2dpbmcuICBDaGVja3MgdGhhdCBhIHRhYmxlIGZvbGxvd3MgdGhlICAgICAgICAgICAqLwotICAvKiAgIHNwZWNpZmljYXRpb24gYnkgMTAwJS4gIFZlcnkgZmV3IGZvbnRzIHdpbGwgYmUgYWJsZSB0byBwYXNzIHRoaXMgICAgKi8KLSAgLyogICBsZXZlbCBhbnl3YXkgYnV0IGl0IGNhbiBiZSB1c2VmdWwgZm9yIGNlcnRhaW4gdG9vbHMgbGlrZSBmb250ICAgICAgICovCi0gIC8qICAgZWRpdG9ycy9jb252ZXJ0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBlbnVtICBGVF9WYWxpZGF0aW9uTGV2ZWxfCi0gIHsKLSAgICBGVF9WQUxJREFURV9ERUZBVUxUID0gMCwKLSAgICBGVF9WQUxJREFURV9USUdIVCwKLSAgICBGVF9WQUxJREFURV9QQVJBTk9JRAotCi0gIH0gRlRfVmFsaWRhdGlvbkxldmVsOwotCi0KLSNpZiBkZWZpbmVkKCBfTVNDX1ZFUiApICAgICAgLyogVmlzdWFsIEMrKyAoYW5kIEludGVsIEMrKykgKi8KLSAgLyogV2UgZGlzYWJsZSB0aGUgd2FybmluZyBgc3RydWN0dXJlIHdhcyBwYWRkZWQgZHVlIHRvICAgKi8KLSAgLyogX19kZWNsc3BlYyhhbGlnbigpKScgaW4gb3JkZXIgdG8gY29tcGlsZSBjbGVhbmx5IHdpdGggKi8KLSAgLyogdGhlIG1heGltdW0gbGV2ZWwgb2Ygd2FybmluZ3MuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNwcmFnbWEgd2FybmluZyggcHVzaCApCi0jcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MzI0ICkKLSNlbmRpZiAvKiBfTVNDX1ZFUiAqLwotCi0gIC8qIHZhbGlkYXRvciBzdHJ1Y3R1cmUgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1ZhbGlkYXRvclJlY18KLSAgewotICAgIGZ0X2ptcF9idWYgICAgICAgICAganVtcF9idWZmZXI7IC8qIHVzZWQgZm9yIGV4Y2VwdGlvbiBoYW5kbGluZyAgICAgICovCi0KLSAgICBjb25zdCBGVF9CeXRlKiAgICAgIGJhc2U7ICAgICAgICAvKiBhZGRyZXNzIG9mIHRhYmxlIGluIG1lbW9yeSAgICAgICAqLwotICAgIGNvbnN0IEZUX0J5dGUqICAgICAgbGltaXQ7ICAgICAgIC8qIGBiYXNlJyArIHNpemVvZih0YWJsZSkgaW4gbWVtb3J5ICovCi0gICAgRlRfVmFsaWRhdGlvbkxldmVsICBsZXZlbDsgICAgICAgLyogdmFsaWRhdGlvbiBsZXZlbCAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9FcnJvciAgICAgICAgICAgIGVycm9yOyAgICAgICAvKiBlcnJvciByZXR1cm5lZC4gMCBtZWFucyBzdWNjZXNzICAqLwotCi0gIH0gRlRfVmFsaWRhdG9yUmVjOwotCi0jaWYgZGVmaW5lZCggX01TQ19WRVIgKQotI3ByYWdtYSB3YXJuaW5nKCBwb3AgKQotI2VuZGlmCi0KLSNkZWZpbmUgRlRfVkFMSURBVE9SKCB4ICkgICggKEZUX1ZhbGlkYXRvcikoIHggKSApCi0KLQotICBGVF9CQVNFKCB2b2lkICkKLSAgZnRfdmFsaWRhdG9yX2luaXQoIEZUX1ZhbGlkYXRvciAgICAgICAgdmFsaWQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CeXRlKiAgICAgIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CeXRlKiAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdGlvbkxldmVsICBsZXZlbCApOwotCi0gIC8qIERvIG5vdCB1c2UgdGhpcy4gSXQncyBicm9rZW4gYW5kIHdpbGwgY2F1c2UgeW91ciB2YWxpZGF0b3IgdG8gY3Jhc2ggKi8KLSAgLyogaWYgeW91IHJ1biBpdCBvbiBhbiBpbnZhbGlkIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCBGVF9JbnQgKQotICBmdF92YWxpZGF0b3JfcnVuKCBGVF9WYWxpZGF0b3IgIHZhbGlkICk7Ci0KLSAgLyogU2V0cyB0aGUgZXJyb3IgZmllbGQgaW4gYSB2YWxpZGF0b3IsIHRoZW4gY2FsbHMgYGxvbmdqbXAnIHRvIHJldHVybiAqLwotICAvKiB0byBoaWdoLWxldmVsIGNhbGxlci4gIFVzaW5nIGBzZXRqbXAvbG9uZ2ptcCcgYXZvaWRzIG1hbnkgc3R1cGlkICAgICovCi0gIC8qIGVycm9yIGNoZWNrcyB3aXRoaW4gdGhlIHZhbGlkYXRpb24gcm91dGluZXMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9CQVNFKCB2b2lkICkKLSAgZnRfdmFsaWRhdG9yX2Vycm9yKCBGVF9WYWxpZGF0b3IgIHZhbGlkLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yICAgICAgZXJyb3IgKTsKLQotCi0gIC8qIENhbGxzIGZ0X3ZhbGlkYXRlX2Vycm9yLiAgQXNzdW1lcyB0aGF0IHRoZSBgdmFsaWQnIGxvY2FsIHZhcmlhYmxlICovCi0gIC8qIGhvbGRzIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCB2YWxpZGF0b3Igb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX0lOVkFMSUQoIF9lcnJvciApICBGVF9JTlZBTElEXyggX2Vycm9yICkKLSNkZWZpbmUgRlRfSU5WQUxJRF8oIF9lcnJvciApIFwKLSAgICAgICAgICBmdF92YWxpZGF0b3JfZXJyb3IoIHZhbGlkLCBGVF9USFJPVyggX2Vycm9yICkgKQotCi0gIC8qIGNhbGxlZCB3aGVuIGEgYnJva2VuIHRhYmxlIGlzIGRldGVjdGVkICovCi0jZGVmaW5lIEZUX0lOVkFMSURfVE9PX1NIT1JUIFwKLSAgICAgICAgICBGVF9JTlZBTElEKCBJbnZhbGlkX1RhYmxlICkKLQotICAvKiBjYWxsZWQgd2hlbiBhbiBpbnZhbGlkIG9mZnNldCBpcyBkZXRlY3RlZCAqLwotI2RlZmluZSBGVF9JTlZBTElEX09GRlNFVCBcCi0gICAgICAgICAgRlRfSU5WQUxJRCggSW52YWxpZF9PZmZzZXQgKQotCi0gIC8qIGNhbGxlZCB3aGVuIGFuIGludmFsaWQgZm9ybWF0L3ZhbHVlIGlzIGRldGVjdGVkICovCi0jZGVmaW5lIEZUX0lOVkFMSURfRk9STUFUIFwKLSAgICAgICAgICBGVF9JTlZBTElEKCBJbnZhbGlkX1RhYmxlICkKLQotICAvKiBjYWxsZWQgd2hlbiBhbiBpbnZhbGlkIGdseXBoIGluZGV4IGlzIGRldGVjdGVkICovCi0jZGVmaW5lIEZUX0lOVkFMSURfR0xZUEhfSUQgXAotICAgICAgICAgIEZUX0lOVkFMSUQoIEludmFsaWRfR2x5cGhfSW5kZXggKQotCi0gIC8qIGNhbGxlZCB3aGVuIGFuIGludmFsaWQgZmllbGQgdmFsdWUgaXMgZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgRlRfSU5WQUxJRF9EQVRBIFwKLSAgICAgICAgICBGVF9JTlZBTElEKCBJbnZhbGlkX1RhYmxlICkKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUVkFMSURfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2ludGVybmFsLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2ludGVybmFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOWNlNTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9pbnRlcm5hbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaW50ZXJuYWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEludGVybmFsIGhlYWRlciBmaWxlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgYnkgYGZ0MmJ1aWxkLmgnLiAgICAgICAgICAgICAgICAgICovCi0gIC8qIERvIG5vdCBpbmNsdWRlIGl0IG1hbnVhbGx5ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0ggICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL2Z0b2Jqcy5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9QSUNfSCAgICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL2Z0cGljLmg+Ci0jZGVmaW5lIEZUX0lOVEVSTkFMX1NUUkVBTV9IICAgICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvZnRzdHJlYW0uaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfTUVNT1JZX0ggICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdG1lbW9yeS5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9ERUJVR19IICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL2Z0ZGVidWcuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfQ0FMQ19IICAgICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdGNhbGMuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfRFJJVkVSX0ggICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdGRyaXZlci5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9UUkFDRV9IICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfR0xZUEhfTE9BREVSX0ggICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdGdsb2Fkci5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9TRk5UX0ggICAgICAgICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3NmbnQuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfU0VSVklDRV9IICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdHNlcnYuaD4KLSNkZWZpbmUgRlRfSU5URVJOQUxfUkZPUktfSCAgICAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9mdHJmb3JrLmg+Ci0jZGVmaW5lIEZUX0lOVEVSTkFMX1ZBTElEQVRFX0ggICAgICAgICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvZnR2YWxpZC5oPgotCi0jZGVmaW5lIEZUX0lOVEVSTkFMX1RSVUVUWVBFX1RZUEVTX0ggICAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9UWVBFMV9UWVBFU19IICAgICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaD4KLQotI2RlZmluZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9IICAgICAgPGZyZWV0eXBlL2ludGVybmFsL3BzYXV4Lmg+Ci0jZGVmaW5lIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfSElOVFNfSCAgICA8ZnJlZXR5cGUvaW50ZXJuYWwvcHNoaW50cy5oPgotI2RlZmluZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0dMT0JBTFNfSCAgPGZyZWV0eXBlL2ludGVybmFsL3BzZ2xvYmFsLmg+Ci0KLSNkZWZpbmUgRlRfSU5URVJOQUxfQVVUT0hJTlRfSCAgICAgICAgICAgIDxmcmVldHlwZS9pbnRlcm5hbC9hdXRvaGludC5oPgotCi0KLSNpZiBkZWZpbmVkKCBfTVNDX1ZFUiApICAgICAgLyogVmlzdWFsIEMrKyAoYW5kIEludGVsIEMrKykgKi8KLQotICAvKiBXZSBkaXNhYmxlIHRoZSB3YXJuaW5nIGBjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbnN0YW50JyBoZXJlICovCi0gIC8qIGluIG9yZGVyIHRvIGNvbXBpbGUgY2xlYW5seSB3aXRoIHRoZSBtYXhpbXVtIGxldmVsIG9mIHdhcm5pbmdzLiAgKi8KLSAgLyogSW4gcGFydGljdWxhciwgdGhlIHdhcm5pbmcgY29tcGxhaW5zIGFib3V0IHN0dWZmIGxpa2UgYHdoaWxlKDApJyAqLwotICAvKiB3aGljaCBpcyB2ZXJ5IHVzZWZ1bCBpbiBtYWNybyBkZWZpbml0aW9ucy4gIFRoZXJlIGlzIG5vIGJlbmVmaXQgICovCi0gIC8qIGluIGhhdmluZyBpdCBlbmFibGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQxMjcgKQotCi0jZW5kaWYgLyogX01TQ19WRVIgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNhdXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM1Zjc4NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3BzYXV4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNhdXguaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEF1eGlsaWFyeSBmdW5jdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcyByZWxhdGVkIHRvIFBvc3RTY3JpcHQgZm9udHMgICovCi0vKiAgICAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1BTQVVYX0hfXwotI2RlZmluZSBfX1BTQVVYX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UWVBFMV9UWVBFU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICB0eXBlZGVmIHN0cnVjdCBQU19UYWJsZVJlY18qICAgICAgICAgICAgICBQU19UYWJsZTsKLSAgdHlwZWRlZiBjb25zdCBzdHJ1Y3QgUFNfVGFibGVfRnVuY3NSZWNfKiAgUFNfVGFibGVfRnVuY3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19UYWJsZV9GdW5jc1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNldCBvZiBmdW5jdGlvbiBwb2ludGVycyB0byBtYW5hZ2UgUFNfVGFibGUgb2JqZWN0cy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWJsZV9pbml0ICAgIDo6IFVzZWQgdG8gaW5pdGlhbGl6ZSBhIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhYmxlX2RvbmUgICAgOjogRmluYWxpemVzIHJlc3AuIGRlc3Ryb3kgYSBnaXZlbiB0YWJsZS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFibGVfYWRkICAgICA6OiBBZGRzIGEgbmV3IG9iamVjdCB0byBhIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWJsZV9yZWxlYXNlIDo6IFJlbGVhc2VzIHRhYmxlIGRhdGEsIHRoZW4gZmluYWxpemVzIGl0LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU19UYWJsZV9GdW5jc1JlY18KLSAgewotICAgIEZUX0Vycm9yCi0gICAgKCppbml0KSggUFNfVGFibGUgICB0YWJsZSwKLSAgICAgICAgICAgICBGVF9JbnQgICAgIGNvdW50LAotICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICk7Ci0KLSAgICB2b2lkCi0gICAgKCpkb25lKSggUFNfVGFibGUgIHRhYmxlICk7Ci0KLSAgICBGVF9FcnJvcgotICAgICgqYWRkKSggUFNfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgRlRfSW50ICAgIGlkeCwKLSAgICAgICAgICAgIHZvaWQqICAgICBvYmplY3QsCi0gICAgICAgICAgICBGVF9VSW50ICAgbGVuZ3RoICk7Ci0KLSAgICB2b2lkCi0gICAgKCpyZWxlYXNlKSggUFNfVGFibGUgIHRhYmxlICk7Ci0KLSAgfSBQU19UYWJsZV9GdW5jc1JlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX1RhYmxlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgUFNfVGFibGUgaXMgYSBzaW1wbGUgb2JqZWN0IHVzZWQgdG8gc3RvcmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyBpbiAqLwotICAvKiAgICBhIHNpbmdsZSBtZW1vcnkgYmxvY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBibG9jayAgICAgOjogVGhlIGFkZHJlc3MgaW4gbWVtb3J5IG9mIHRoZSBncm93aGVhcCdzIGJsb2NrLiAgVGhpcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGNhbiBjaGFuZ2UgYmV0d2VlbiB0d28gb2JqZWN0IGFkZHMsIGR1ZSB0byAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICByZWFsbG9jYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY3Vyc29yICAgIDo6IFRoZSBjdXJyZW50IHRvcCBvZiB0aGUgZ3JvdyBoZWFwIHdpdGhpbiBpdHMgYmxvY2suICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjYXBhY2l0eSAgOjogVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgaGVhcCBibG9jay4gIEluY3JlbWVudHMgYnkgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIDFrQnl0ZSBjaHVua3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpbml0ICAgICAgOjogU2V0IHRvIDB4REVBREJFRUYgaWYgYGVsZW1lbnRzJyBhbmQgYGxlbmd0aHMnIGhhdmUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGJlZW4gYWxsb2NhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfZWxlbXMgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRhYmxlLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9lbGVtcyA6OiBUaGUgY3VycmVudCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGFibGUuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZWxlbWVudHMgIDo6IEEgdGFibGUgb2YgZWxlbWVudCBhZGRyZXNzZXMgd2l0aGluIHRoZSBibG9jay4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZW5ndGhzICAgOjogQSB0YWJsZSBvZiBlbGVtZW50IHNpemVzIHdpdGhpbiB0aGUgYmxvY2suICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSAgICA6OiBUaGUgb2JqZWN0IHVzZWQgZm9yIG1lbW9yeSBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgKGFsbG9jL3JlYWxsb2MpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ1bmNzICAgICA6OiBBIHRhYmxlIG9mIG1ldGhvZCBwb2ludGVycyBmb3IgdGhpcyBvYmplY3QuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTX1RhYmxlUmVjXwotICB7Ci0gICAgRlRfQnl0ZSogICAgICAgICAgIGJsb2NrOyAgICAgICAgICAvKiBjdXJyZW50IG1lbW9yeSBibG9jayAgICAgICAgICAgKi8KLSAgICBGVF9PZmZzZXQgICAgICAgICAgY3Vyc29yOyAgICAgICAgIC8qIGN1cnJlbnQgY3Vyc29yIGluIG1lbW9yeSBibG9jayAqLwotICAgIEZUX09mZnNldCAgICAgICAgICBjYXBhY2l0eTsgICAgICAgLyogY3VycmVudCBzaXplIG9mIG1lbW9yeSBibG9jayAgICovCi0gICAgRlRfVUxvbmcgICAgICAgICAgIGluaXQ7Ci0KLSAgICBGVF9JbnQgICAgICAgICAgICAgbWF4X2VsZW1zOwotICAgIEZUX0ludCAgICAgICAgICAgICBudW1fZWxlbXM7Ci0gICAgRlRfQnl0ZSoqICAgICAgICAgIGVsZW1lbnRzOyAgICAgICAvKiBhZGRyZXNzZXMgb2YgdGFibGUgZWxlbWVudHMgKi8KLSAgICBGVF9VSW50KiAgICAgICAgICAgbGVuZ3RoczsgICAgICAgIC8qIGxlbmd0aHMgb2YgdGFibGUgZWxlbWVudHMgICAqLwotCi0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeTsKLSAgICBQU19UYWJsZV9GdW5jc1JlYyAgZnVuY3M7Ci0KLSAgfSBQU19UYWJsZVJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgVDEgRklFTERTICYgVE9LRU5TICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHR5cGVkZWYgc3RydWN0IFBTX1BhcnNlclJlY18qICBQU19QYXJzZXI7Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgVDFfVG9rZW5SZWNfKiAgIFQxX1Rva2VuOwotCi0gIHR5cGVkZWYgc3RydWN0IFQxX0ZpZWxkUmVjXyogICBUMV9GaWVsZDsKLQotCi0gIC8qIHNpbXBsZSBlbnVtZXJhdGlvbiB0eXBlIHVzZWQgdG8gaWRlbnRpZnkgdG9rZW4gdHlwZXMgKi8KLSAgdHlwZWRlZiBlbnVtICBUMV9Ub2tlblR5cGVfCi0gIHsKLSAgICBUMV9UT0tFTl9UWVBFX05PTkUgPSAwLAotICAgIFQxX1RPS0VOX1RZUEVfQU5ZLAotICAgIFQxX1RPS0VOX1RZUEVfU1RSSU5HLAotICAgIFQxX1RPS0VOX1RZUEVfQVJSQVksCi0gICAgVDFfVE9LRU5fVFlQRV9LRVksIC8qIGFrYSBgbmFtZScgKi8KLQotICAgIC8qIGRvIG5vdCByZW1vdmUgKi8KLSAgICBUMV9UT0tFTl9UWVBFX01BWAotCi0gIH0gVDFfVG9rZW5UeXBlOwotCi0KLSAgLyogYSBzaW1wbGUgc3RydWN0dXJlIHVzZWQgdG8gaWRlbnRpZnkgdG9rZW5zICovCi0gIHR5cGVkZWYgc3RydWN0ICBUMV9Ub2tlblJlY18KLSAgewotICAgIEZUX0J5dGUqICAgICAgc3RhcnQ7ICAgLyogZmlyc3QgY2hhcmFjdGVyIG9mIHRva2VuIGluIGlucHV0IHN0cmVhbSAqLwotICAgIEZUX0J5dGUqICAgICAgbGltaXQ7ICAgLyogZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSB0b2tlbiAgICAgICAgICAqLwotICAgIFQxX1Rva2VuVHlwZSAgdHlwZTsgICAgLyogdHlwZSBvZiB0b2tlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIH0gVDFfVG9rZW5SZWM7Ci0KLQotICAvKiBlbnVtZXJhdGlvbiB0eXBlIHVzZWQgdG8gaWRlbnRpZnkgb2JqZWN0IGZpZWxkcyAqLwotICB0eXBlZGVmIGVudW0gIFQxX0ZpZWxkVHlwZV8KLSAgewotICAgIFQxX0ZJRUxEX1RZUEVfTk9ORSA9IDAsCi0gICAgVDFfRklFTERfVFlQRV9CT09MLAotICAgIFQxX0ZJRUxEX1RZUEVfSU5URUdFUiwKLSAgICBUMV9GSUVMRF9UWVBFX0ZJWEVELAotICAgIFQxX0ZJRUxEX1RZUEVfRklYRURfMTAwMCwKLSAgICBUMV9GSUVMRF9UWVBFX1NUUklORywKLSAgICBUMV9GSUVMRF9UWVBFX0tFWSwKLSAgICBUMV9GSUVMRF9UWVBFX0JCT1gsCi0gICAgVDFfRklFTERfVFlQRV9NTV9CQk9YLAotICAgIFQxX0ZJRUxEX1RZUEVfSU5URUdFUl9BUlJBWSwKLSAgICBUMV9GSUVMRF9UWVBFX0ZJWEVEX0FSUkFZLAotICAgIFQxX0ZJRUxEX1RZUEVfQ0FMTEJBQ0ssCi0KLSAgICAvKiBkbyBub3QgcmVtb3ZlICovCi0gICAgVDFfRklFTERfVFlQRV9NQVgKLQotICB9IFQxX0ZpZWxkVHlwZTsKLQotCi0gIHR5cGVkZWYgZW51bSAgVDFfRmllbGRMb2NhdGlvbl8KLSAgewotICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0NJRF9JTkZPLAotICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0ZPTlRfRElDVCwKLSAgICBUMV9GSUVMRF9MT0NBVElPTl9GT05UX0VYVFJBLAotICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0ZPTlRfSU5GTywKLSAgICBUMV9GSUVMRF9MT0NBVElPTl9QUklWQVRFLAotICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0JCT1gsCi0gICAgVDFfRklFTERfTE9DQVRJT05fTE9BREVSLAotICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0ZBQ0UsCi0gICAgVDFfRklFTERfTE9DQVRJT05fQkxFTkQsCi0KLSAgICAvKiBkbyBub3QgcmVtb3ZlICovCi0gICAgVDFfRklFTERfTE9DQVRJT05fTUFYCi0KLSAgfSBUMV9GaWVsZExvY2F0aW9uOwotCi0KLSAgdHlwZWRlZiB2b2lkCi0gICgqVDFfRmllbGRfUGFyc2VGdW5jKSggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBwYXJzZXIgKTsKLQotCi0gIC8qIHN0cnVjdHVyZSB0eXBlIHVzZWQgdG8gbW9kZWwgb2JqZWN0IGZpZWxkcyAqLwotICB0eXBlZGVmIHN0cnVjdCAgVDFfRmllbGRSZWNfCi0gIHsKLSAgICBjb25zdCBjaGFyKiAgICAgICAgIGlkZW50OyAgICAgICAgLyogZmllbGQgaWRlbnRpZmllciAgICAgICAgICAgICAgICovCi0gICAgVDFfRmllbGRMb2NhdGlvbiAgICBsb2NhdGlvbjsKLSAgICBUMV9GaWVsZFR5cGUgICAgICAgIHR5cGU7ICAgICAgICAgLyogdHlwZSBvZiBmaWVsZCAgICAgICAgICAgICAgICAgICovCi0gICAgVDFfRmllbGRfUGFyc2VGdW5jICByZWFkZXI7Ci0gICAgRlRfVUludCAgICAgICAgICAgICBvZmZzZXQ7ICAgICAgIC8qIG9mZnNldCBvZiBmaWVsZCBpbiBvYmplY3QgICAgICAqLwotICAgIEZUX0J5dGUgICAgICAgICAgICAgc2l6ZTsgICAgICAgICAvKiBzaXplIG9mIGZpZWxkIGluIGJ5dGVzICAgICAgICAgKi8KLSAgICBGVF9VSW50ICAgICAgICAgICAgIGFycmF5X21heDsgICAgLyogbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgZm9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFycmF5ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX1VJbnQgICAgICAgICAgICAgY291bnRfb2Zmc2V0OyAvKiBvZmZzZXQgb2YgZWxlbWVudCBjb3VudCBmb3IgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXJyYXlzOyBtdXN0IG5vdCBiZSB6ZXJvIGlmIGluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSAtLSBpbiBvdGhlciB3b3JkcywgYSAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBgbnVtX0ZPTycgZWxlbWVudCBtdXN0IG5vdCAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgdGhlIHVzZWQgc3RydWN0dXJlIGlmIHdlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBhcnNlIGEgYEZPTycgYXJyYXkgICAgICAgICAgICAqLwotICAgIEZUX1VJbnQgICAgICAgICAgICAgZGljdDsgICAgICAgICAvKiB3aGVyZSB3ZSBleHBlY3QgaXQgICAgICAgICAgICAgKi8KLSAgfSBUMV9GaWVsZFJlYzsKLQotI2RlZmluZSBUMV9GSUVMRF9ESUNUX0ZPTlRESUNUICggMSA8PCAwICkgLyogYWxzbyBGb250SW5mbyBhbmQgRkRBcnJheSAqLwotI2RlZmluZSBUMV9GSUVMRF9ESUNUX1BSSVZBVEUgICggMSA8PCAxICkKLQotCi0KLSNkZWZpbmUgVDFfTkVXX1NJTVBMRV9GSUVMRCggX2lkZW50LCBfdHlwZSwgX2ZuYW1lLCBfZGljdCApIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIF9pZGVudCwgVDFDT0RFLCBfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEZUX0ZJRUxEX09GRlNFVCggX2ZuYW1lICksICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEZUX0ZJRUxEX1NJWkUoIF9mbmFtZSApLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIF9kaWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9LAotCi0jZGVmaW5lIFQxX05FV19DQUxMQkFDS19GSUVMRCggX2lkZW50LCBfcmVhZGVyLCBfZGljdCApIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgX2lkZW50LCBUMUNPREUsIFQxX0ZJRUxEX1RZUEVfQ0FMTEJBQ0ssICAgICBcCi0gICAgICAgICAgICAoVDFfRmllbGRfUGFyc2VGdW5jKV9yZWFkZXIsICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfZGljdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9LAotCi0jZGVmaW5lIFQxX05FV19UQUJMRV9GSUVMRCggX2lkZW50LCBfdHlwZSwgX2ZuYW1lLCBfbWF4LCBfZGljdCApIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgX2lkZW50LCBUMUNPREUsIF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEZUX0ZJRUxEX09GRlNFVCggX2ZuYW1lICksICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfU0laRV9ERUxUQSggX2ZuYW1lICksICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfbWF4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEZUX0ZJRUxEX09GRlNFVCggbnVtXyAjIyBfZm5hbWUgKSwgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgX2RpY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgfSwKLQotI2RlZmluZSBUMV9ORVdfVEFCTEVfRklFTEQyKCBfaWRlbnQsIF90eXBlLCBfZm5hbWUsIF9tYXgsIF9kaWN0ICkgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgX2lkZW50LCBUMUNPREUsIF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfT0ZGU0VUKCBfZm5hbWUgKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfU0laRV9ERUxUQSggX2ZuYW1lICksICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgX21heCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgX2RpY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0sCi0KLQotI2RlZmluZSBUMV9GSUVMRF9CT09MKCBfaWRlbnQsIF9mbmFtZSwgX2RpY3QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIFQxX05FV19TSU1QTEVfRklFTEQoIF9pZGVudCwgVDFfRklFTERfVFlQRV9CT09MLCBfZm5hbWUsIF9kaWN0ICkKLQotI2RlZmluZSBUMV9GSUVMRF9OVU0oIF9pZGVudCwgX2ZuYW1lLCBfZGljdCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIFQxX05FV19TSU1QTEVfRklFTEQoIF9pZGVudCwgVDFfRklFTERfVFlQRV9JTlRFR0VSLCBfZm5hbWUsIF9kaWN0ICkKLQotI2RlZmluZSBUMV9GSUVMRF9GSVhFRCggX2lkZW50LCBfZm5hbWUsIF9kaWN0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBUMV9ORVdfU0lNUExFX0ZJRUxEKCBfaWRlbnQsIFQxX0ZJRUxEX1RZUEVfRklYRUQsIF9mbmFtZSwgX2RpY3QgKQotCi0jZGVmaW5lIFQxX0ZJRUxEX0ZJWEVEXzEwMDAoIF9pZGVudCwgX2ZuYW1lLCBfZGljdCApICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIFQxX05FV19TSU1QTEVfRklFTEQoIF9pZGVudCwgVDFfRklFTERfVFlQRV9GSVhFRF8xMDAwLCBfZm5hbWUsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGljdCApCi0KLSNkZWZpbmUgVDFfRklFTERfU1RSSU5HKCBfaWRlbnQsIF9mbmFtZSwgX2RpY3QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIFQxX05FV19TSU1QTEVfRklFTEQoIF9pZGVudCwgVDFfRklFTERfVFlQRV9TVFJJTkcsIF9mbmFtZSwgX2RpY3QgKQotCi0jZGVmaW5lIFQxX0ZJRUxEX0tFWSggX2lkZW50LCBfZm5hbWUsIF9kaWN0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBUMV9ORVdfU0lNUExFX0ZJRUxEKCBfaWRlbnQsIFQxX0ZJRUxEX1RZUEVfS0VZLCBfZm5hbWUsIF9kaWN0ICkKLQotI2RlZmluZSBUMV9GSUVMRF9CQk9YKCBfaWRlbnQsIF9mbmFtZSwgX2RpY3QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIFQxX05FV19TSU1QTEVfRklFTEQoIF9pZGVudCwgVDFfRklFTERfVFlQRV9CQk9YLCBfZm5hbWUsIF9kaWN0ICkKLQotCi0jZGVmaW5lIFQxX0ZJRUxEX05VTV9UQUJMRSggX2lkZW50LCBfZm5hbWUsIF9mbWF4LCBfZGljdCApICAgICAgICAgXAotICAgICAgICAgIFQxX05FV19UQUJMRV9GSUVMRCggX2lkZW50LCBUMV9GSUVMRF9UWVBFX0lOVEVHRVJfQVJSQVksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mbmFtZSwgX2ZtYXgsIF9kaWN0ICkKLQotI2RlZmluZSBUMV9GSUVMRF9GSVhFRF9UQUJMRSggX2lkZW50LCBfZm5hbWUsIF9mbWF4LCBfZGljdCApICAgICBcCi0gICAgICAgICAgVDFfTkVXX1RBQkxFX0ZJRUxEKCBfaWRlbnQsIFQxX0ZJRUxEX1RZUEVfRklYRURfQVJSQVksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mbmFtZSwgX2ZtYXgsIF9kaWN0ICkKLQotI2RlZmluZSBUMV9GSUVMRF9OVU1fVEFCTEUyKCBfaWRlbnQsIF9mbmFtZSwgX2ZtYXgsIF9kaWN0ICkgICAgICAgICBcCi0gICAgICAgICAgVDFfTkVXX1RBQkxFX0ZJRUxEMiggX2lkZW50LCBUMV9GSUVMRF9UWVBFX0lOVEVHRVJfQVJSQVksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZm5hbWUsIF9mbWF4LCBfZGljdCApCi0KLSNkZWZpbmUgVDFfRklFTERfRklYRURfVEFCTEUyKCBfaWRlbnQsIF9mbmFtZSwgX2ZtYXgsIF9kaWN0ICkgICAgIFwKLSAgICAgICAgICBUMV9ORVdfVEFCTEVfRklFTEQyKCBfaWRlbnQsIFQxX0ZJRUxEX1RZUEVfRklYRURfQVJSQVksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZm5hbWUsIF9mbWF4LCBfZGljdCApCi0KLSNkZWZpbmUgVDFfRklFTERfQ0FMTEJBQ0soIF9pZGVudCwgX25hbWUsIF9kaWN0ICkgICAgICAgXAotICAgICAgICAgIFQxX05FV19DQUxMQkFDS19GSUVMRCggX2lkZW50LCBfbmFtZSwgX2RpY3QgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxIFBBUlNFUiAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgdHlwZWRlZiBjb25zdCBzdHJ1Y3QgUFNfUGFyc2VyX0Z1bmNzUmVjXyogIFBTX1BhcnNlcl9GdW5jczsKLQotICB0eXBlZGVmIHN0cnVjdCAgUFNfUGFyc2VyX0Z1bmNzUmVjXwotICB7Ci0gICAgdm9pZAotICAgICgqaW5pdCkoIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgIEZUX0J5dGUqICAgYmFzZSwKLSAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0LAotICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICk7Ci0KLSAgICB2b2lkCi0gICAgKCpkb25lKSggUFNfUGFyc2VyICBwYXJzZXIgKTsKLQotICAgIHZvaWQKLSAgICAoKnNraXBfc3BhY2VzKSggUFNfUGFyc2VyICBwYXJzZXIgKTsKLSAgICB2b2lkCi0gICAgKCpza2lwX1BTX3Rva2VuKSggUFNfUGFyc2VyICBwYXJzZXIgKTsKLQotICAgIEZUX0xvbmcKLSAgICAoKnRvX2ludCkoIFBTX1BhcnNlciAgcGFyc2VyICk7Ci0gICAgRlRfRml4ZWQKLSAgICAoKnRvX2ZpeGVkKSggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgcG93ZXJfdGVuICk7Ci0KLSAgICBGVF9FcnJvcgotICAgICgqdG9fYnl0ZXMpKCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBieXRlcywKLSAgICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICBtYXhfYnl0ZXMsCi0gICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgcG51bV9ieXRlcywKLSAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICBkZWxpbWl0ZXJzICk7Ci0KLSAgICBGVF9JbnQKLSAgICAoKnRvX2Nvb3JkX2FycmF5KSggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgbWF4X2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfU2hvcnQqICBjb29yZHMgKTsKLSAgICBGVF9JbnQKLSAgICAoKnRvX2ZpeGVkX2FycmF5KSggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgbWF4X3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgcG93ZXJfdGVuICk7Ci0KLSAgICB2b2lkCi0gICAgKCp0b190b2tlbikoIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICBUMV9Ub2tlbiAgIHRva2VuICk7Ci0gICAgdm9pZAotICAgICgqdG9fdG9rZW5fYXJyYXkpKCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfVG9rZW4gICB0b2tlbnMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbWF4X3Rva2VucywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50KiAgICBwbnVtX3Rva2VucyApOwotCi0gICAgRlRfRXJyb3IKLSAgICAoKmxvYWRfZmllbGQpKCBQU19QYXJzZXIgICAgICAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxX0ZpZWxkICBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICB2b2lkKiogICAgICAgICAgb2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgbWF4X29iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgIHBmbGFncyApOwotCi0gICAgRlRfRXJyb3IKLSAgICAoKmxvYWRfZmllbGRfdGFibGUpKCBQU19QYXJzZXIgICAgICAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxX0ZpZWxkICBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogICAgICAgICAgb2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgbWF4X29iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgIHBmbGFncyApOwotCi0gIH0gUFNfUGFyc2VyX0Z1bmNzUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfUGFyc2VyUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBQU19QYXJzZXIgaXMgYW4gb2JqZWN0IHVzZWQgdG8gcGFyc2UgYSBUeXBlIDEgZm9udCB2ZXJ5IHF1aWNrbHkuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY3Vyc29yIDo6IFRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSB0ZXh0LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYXNlICAgOjogU3RhcnQgb2YgdGhlIHByb2Nlc3NlZCB0ZXh0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxpbWl0ICA6OiBFbmQgb2YgdGhlIHByb2Nlc3NlZCB0ZXh0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZXJyb3IgIDo6IFRoZSBsYXN0IGVycm9yIHJldHVybmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgOjogVGhlIG9iamVjdCB1c2VkIGZvciBtZW1vcnkgb3BlcmF0aW9ucyAoYWxsb2MvcmVhbGxvYykuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ1bmNzICA6OiBBIHRhYmxlIG9mIGZ1bmN0aW9ucyBmb3IgdGhlIHBhcnNlci4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTX1BhcnNlclJlY18KLSAgewotICAgIEZUX0J5dGUqICAgY3Vyc29yOwotICAgIEZUX0J5dGUqICAgYmFzZTsKLSAgICBGVF9CeXRlKiAgIGxpbWl0OwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0KLSAgICBQU19QYXJzZXJfRnVuY3NSZWMgIGZ1bmNzOwotCi0gIH0gUFNfUGFyc2VyUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgIFQxIEJVSUxERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICB0eXBlZGVmIHN0cnVjdCBUMV9CdWlsZGVyUmVjXyogIFQxX0J1aWxkZXI7Ci0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVDFfQnVpbGRlcl9DaGVja19Qb2ludHNfRnVuYykoIFQxX0J1aWxkZXIgIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIGNvdW50ICk7Ci0KLSAgdHlwZWRlZiB2b2lkCi0gICgqVDFfQnVpbGRlcl9BZGRfUG9pbnRfRnVuYykoIFQxX0J1aWxkZXIgIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUgICAgIGZsYWcgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVDFfQnVpbGRlcl9BZGRfUG9pbnQxX0Z1bmMpKCBUMV9CdWlsZGVyICBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHkgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVDFfQnVpbGRlcl9BZGRfQ29udG91cl9GdW5jKSggVDFfQnVpbGRlciAgYnVpbGRlciApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMV9CdWlsZGVyX1N0YXJ0X1BvaW50X0Z1bmMpKCBUMV9CdWlsZGVyICBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeSApOwotCi0gIHR5cGVkZWYgdm9pZAotICAoKlQxX0J1aWxkZXJfQ2xvc2VfQ29udG91cl9GdW5jKSggVDFfQnVpbGRlciAgYnVpbGRlciApOwotCi0KLSAgdHlwZWRlZiBjb25zdCBzdHJ1Y3QgVDFfQnVpbGRlcl9GdW5jc1JlY18qICBUMV9CdWlsZGVyX0Z1bmNzOwotCi0gIHR5cGVkZWYgc3RydWN0ICBUMV9CdWlsZGVyX0Z1bmNzUmVjXwotICB7Ci0gICAgdm9pZAotICAgICgqaW5pdCkoIFQxX0J1aWxkZXIgICAgYnVpbGRlciwKLSAgICAgICAgICAgICBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgRlRfU2l6ZSAgICAgICBzaXplLAotICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgc2xvdCwKLSAgICAgICAgICAgICBGVF9Cb29sICAgICAgIGhpbnRpbmcgKTsKLQotICAgIHZvaWQKLSAgICAoKmRvbmUpKCBUMV9CdWlsZGVyICAgYnVpbGRlciApOwotCi0gICAgVDFfQnVpbGRlcl9DaGVja19Qb2ludHNfRnVuYyAgIGNoZWNrX3BvaW50czsKLSAgICBUMV9CdWlsZGVyX0FkZF9Qb2ludF9GdW5jICAgICAgYWRkX3BvaW50OwotICAgIFQxX0J1aWxkZXJfQWRkX1BvaW50MV9GdW5jICAgICBhZGRfcG9pbnQxOwotICAgIFQxX0J1aWxkZXJfQWRkX0NvbnRvdXJfRnVuYyAgICBhZGRfY29udG91cjsKLSAgICBUMV9CdWlsZGVyX1N0YXJ0X1BvaW50X0Z1bmMgICAgc3RhcnRfcG9pbnQ7Ci0gICAgVDFfQnVpbGRlcl9DbG9zZV9Db250b3VyX0Z1bmMgIGNsb3NlX2NvbnRvdXI7Ci0KLSAgfSBUMV9CdWlsZGVyX0Z1bmNzUmVjOwotCi0KLSAgLyogYW4gZW51bWVyYXRpb24gdHlwZSB0byBoYW5kbGUgY2hhcnN0cmluZyBwYXJzaW5nIHN0YXRlcyAqLwotICB0eXBlZGVmIGVudW0gIFQxX1BhcnNlU3RhdGVfCi0gIHsKLSAgICBUMV9QYXJzZV9TdGFydCwKLSAgICBUMV9QYXJzZV9IYXZlX1dpZHRoLAotICAgIFQxX1BhcnNlX0hhdmVfTW92ZXRvLAotICAgIFQxX1BhcnNlX0hhdmVfUGF0aAotCi0gIH0gVDFfUGFyc2VTdGF0ZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdHVyZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0J1aWxkZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBBIHN0cnVjdHVyZSB1c2VkIGR1cmluZyBnbHlwaCBsb2FkaW5nIHRvIHN0b3JlIGl0cyBvdXRsaW5lLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSAgICAgICA6OiBUaGUgY3VycmVudCBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgIDo6IFRoZSBjdXJyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaCAgICAgICAgOjogVGhlIGN1cnJlbnQgZ2x5cGggc2xvdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRlciAgICAgICA6OiBYWFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzZSAgICAgICAgIDo6IFRoZSBiYXNlIGdseXBoIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjdXJyZW50ICAgICAgOjogVGhlIGN1cnJlbnQgZ2x5cGggb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9wb2ludHMgICA6OiBtYXhpbXVtIHBvaW50cyBpbiBidWlsZGVyIG91dGxpbmUgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X2NvbnRvdXJzIDo6IE1heGltdW0gbnVtYmVyIG9mIGNvbnRvdXJzIGluIGJ1aWxkZXIgb3V0bGluZS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb3NfeCAgICAgICAgOjogVGhlIGhvcml6b250YWwgdHJhbnNsYXRpb24gKGlmIGNvbXBvc2l0ZSBnbHlwaCkuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvc195ICAgICAgICA6OiBUaGUgdmVydGljYWwgdHJhbnNsYXRpb24gKGlmIGNvbXBvc2l0ZSBnbHlwaCkuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGVmdF9iZWFyaW5nIDo6IFRoZSBsZWZ0IHNpZGUgYmVhcmluZyBwb2ludC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZHZhbmNlICAgICAgOjogVGhlIGhvcml6b250YWwgYWR2YW5jZSB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJib3ggICAgICAgICA6OiBVbnVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFyc2Vfc3RhdGUgIDo6IEFuIGVudW1lcmF0aW9uIHdoaWNoIGNvbnRyb2xzIHRoZSBjaGFyc3RyaW5nICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBwYXJzaW5nIHN0YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9wb2ludHMgIDo6IElmIHRoaXMgZmxhZyBpcyBub3Qgc2V0LCBubyBwb2ludHMgYXJlIGxvYWRlZC4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBub19yZWN1cnNlICAgOjogU2V0IGJ1dCBub3QgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1ldHJpY3Nfb25seSA6OiBBIGJvb2xlYW4gaW5kaWNhdGluZyB0aGF0IHdlIG9ubHkgd2FudCB0byBjb21wdXRlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgdGhlIG1ldHJpY3Mgb2YgYSBnaXZlbiBnbHlwaCwgbm90IGxvYWQgYWxsIG9mIGl0cyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIHBvaW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdW5jcyAgICAgICAgOjogQW4gYXJyYXkgb2YgZnVuY3Rpb24gcG9pbnRlcnMgZm9yIHRoZSBidWlsZGVyLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUMV9CdWlsZGVyUmVjXwotICB7Ci0gICAgRlRfTWVtb3J5ICAgICAgIG1lbW9yeTsKLSAgICBGVF9GYWNlICAgICAgICAgZmFjZTsKLSAgICBGVF9HbHlwaFNsb3QgICAgZ2x5cGg7Ci0gICAgRlRfR2x5cGhMb2FkZXIgIGxvYWRlcjsKLSAgICBGVF9PdXRsaW5lKiAgICAgYmFzZTsKLSAgICBGVF9PdXRsaW5lKiAgICAgY3VycmVudDsKLQotICAgIEZUX1BvcyAgICAgICAgICBwb3NfeDsKLSAgICBGVF9Qb3MgICAgICAgICAgcG9zX3k7Ci0KLSAgICBGVF9WZWN0b3IgICAgICAgbGVmdF9iZWFyaW5nOwotICAgIEZUX1ZlY3RvciAgICAgICBhZHZhbmNlOwotCi0gICAgRlRfQkJveCAgICAgICAgIGJib3g7ICAgICAgICAgIC8qIGJvdW5kaW5nIGJveCAqLwotICAgIFQxX1BhcnNlU3RhdGUgICBwYXJzZV9zdGF0ZTsKLSAgICBGVF9Cb29sICAgICAgICAgbG9hZF9wb2ludHM7Ci0gICAgRlRfQm9vbCAgICAgICAgIG5vX3JlY3Vyc2U7Ci0KLSAgICBGVF9Cb29sICAgICAgICAgbWV0cmljc19vbmx5OwotCi0gICAgdm9pZCogICAgICAgICAgIGhpbnRzX2Z1bmNzOyAgICAvKiBoaW50ZXItc3BlY2lmaWMgKi8KLSAgICB2b2lkKiAgICAgICAgICAgaGludHNfZ2xvYmFsczsgIC8qIGhpbnRlci1zcGVjaWZpYyAqLwotCi0gICAgVDFfQnVpbGRlcl9GdW5jc1JlYyAgZnVuY3M7Ci0KLSAgfSBUMV9CdWlsZGVyUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgIFQxIERFQ09ERVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZiAwCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUMV9NQVhfU1VCUlNfQ0FMTFMgZGV0YWlscyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbmVzdGVkIHN1Yi1yb3V0aW5lICAgKi8KLSAgLyogY2FsbHMgZHVyaW5nIGdseXBoIGxvYWRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUMV9NQVhfU1VCUlNfQ0FMTFMgIDgKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVDFfTUFYX0NIQVJTVFJJTkdfT1BFUkFORFMgaXMgdGhlIGNoYXJzdHJpbmcgc3RhY2sncyBjYXBhY2l0eS4gIEEgICAgICovCi0gIC8qIG1pbmltdW0gb2YgMTYgaXMgcmVxdWlyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVDFfTUFYX0NIQVJTVFJJTkdTX09QRVJBTkRTICAzMgotCi0jZW5kaWYgLyogMCAqLwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQxX0RlY29kZXJfWm9uZVJlY18KLSAgewotICAgIEZUX0J5dGUqICBjdXJzb3I7Ci0gICAgRlRfQnl0ZSogIGJhc2U7Ci0gICAgRlRfQnl0ZSogIGxpbWl0OwotCi0gIH0gVDFfRGVjb2Rlcl9ab25lUmVjLCAqVDFfRGVjb2Rlcl9ab25lOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgVDFfRGVjb2RlclJlY18qICAgICAgICAgICAgICBUMV9EZWNvZGVyOwotICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBUMV9EZWNvZGVyX0Z1bmNzUmVjXyogIFQxX0RlY29kZXJfRnVuY3M7Ci0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVDFfRGVjb2Rlcl9DYWxsYmFjaykoIFQxX0RlY29kZXIgIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGdseXBoX2luZGV4ICk7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgVDFfRGVjb2Rlcl9GdW5jc1JlY18KLSAgewotICAgIEZUX0Vycm9yCi0gICAgKCppbml0KSggVDFfRGVjb2RlciAgICAgICAgICAgZGVjb2RlciwKLSAgICAgICAgICAgICBGVF9GYWNlICAgICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgIEZUX1NpemUgICAgICAgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAgICAgICAgc2xvdCwKLSAgICAgICAgICAgICBGVF9CeXRlKiogICAgICAgICAgICBnbHlwaF9uYW1lcywKLSAgICAgICAgICAgICBQU19CbGVuZCAgICAgICAgICAgICBibGVuZCwKLSAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgICAgICBoaW50aW5nLAotICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICAgICAgIGhpbnRfbW9kZSwKLSAgICAgICAgICAgICBUMV9EZWNvZGVyX0NhbGxiYWNrICBjYWxsYmFjayApOwotCi0gICAgdm9pZAotICAgICgqZG9uZSkoIFQxX0RlY29kZXIgIGRlY29kZXIgKTsKLQotICAgIEZUX0Vycm9yCi0gICAgKCpwYXJzZV9jaGFyc3RyaW5ncykoIFQxX0RlY29kZXIgIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGxlbiApOwotCi0gIH0gVDFfRGVjb2Rlcl9GdW5jc1JlYzsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBUMV9EZWNvZGVyUmVjXwotICB7Ci0gICAgVDFfQnVpbGRlclJlYyAgICAgICAgYnVpbGRlcjsKLQotICAgIEZUX0xvbmcgICAgICAgICAgICAgIHN0YWNrW1QxX01BWF9DSEFSU1RSSU5HU19PUEVSQU5EU107Ci0gICAgRlRfTG9uZyogICAgICAgICAgICAgdG9wOwotCi0gICAgVDFfRGVjb2Rlcl9ab25lUmVjICAgem9uZXNbVDFfTUFYX1NVQlJTX0NBTExTICsgMV07Ci0gICAgVDFfRGVjb2Rlcl9ab25lICAgICAgem9uZTsKLQotICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgIHBzbmFtZXM7ICAgICAgLyogZm9yIHNlYWMgKi8KLSAgICBGVF9VSW50ICAgICAgICAgICAgICBudW1fZ2x5cGhzOwotICAgIEZUX0J5dGUqKiAgICAgICAgICAgIGdseXBoX25hbWVzOwotCi0gICAgRlRfSW50ICAgICAgICAgICAgICAgbGVuSVY7ICAgICAgICAvKiBpbnRlcm5hbCBmb3Igc3ViIHJvdXRpbmUgY2FsbHMgKi8KLSAgICBGVF9JbnQgICAgICAgICAgICAgICBudW1fc3VicnM7Ci0gICAgRlRfQnl0ZSoqICAgICAgICAgICAgc3VicnM7Ci0gICAgRlRfVUludCogICAgICAgICAgICAgc3VicnNfbGVuOyAgICAvKiBhcnJheSBvZiBzdWJycyBsZW5ndGggKG9wdGlvbmFsKSAqLwotCi0gICAgRlRfTWF0cml4ICAgICAgICAgICAgZm9udF9tYXRyaXg7Ci0gICAgRlRfVmVjdG9yICAgICAgICAgICAgZm9udF9vZmZzZXQ7Ci0KLSAgICBGVF9JbnQgICAgICAgICAgICAgICBmbGV4X3N0YXRlOwotICAgIEZUX0ludCAgICAgICAgICAgICAgIG51bV9mbGV4X3ZlY3RvcnM7Ci0gICAgRlRfVmVjdG9yICAgICAgICAgICAgZmxleF92ZWN0b3JzWzddOwotCi0gICAgUFNfQmxlbmQgICAgICAgICAgICAgYmxlbmQ7ICAgICAgIC8qIGZvciBtdWx0aXBsZSBtYXN0ZXIgc3VwcG9ydCAqLwotCi0gICAgRlRfUmVuZGVyX01vZGUgICAgICAgaGludF9tb2RlOwotCi0gICAgVDFfRGVjb2Rlcl9DYWxsYmFjayAgcGFyc2VfY2FsbGJhY2s7Ci0gICAgVDFfRGVjb2Rlcl9GdW5jc1JlYyAgZnVuY3M7Ci0KLSAgICBGVF9Mb25nKiAgICAgICAgICAgICBidWlsZGNoYXI7Ci0gICAgRlRfVUludCAgICAgICAgICAgICAgbGVuX2J1aWxkY2hhcjsKLQotICAgIEZUX0Jvb2wgICAgICAgICAgICAgIHNlYWM7Ci0KLSAgfSBUMV9EZWNvZGVyUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGTSBQQVJTRVIgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgQUZNX1BhcnNlclJlY18qICBBRk1fUGFyc2VyOwotCi0gIHR5cGVkZWYgc3RydWN0ICBBRk1fUGFyc2VyX0Z1bmNzUmVjXwotICB7Ci0gICAgRlRfRXJyb3IKLSAgICAoKmluaXQpKCBBRk1fUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgRlRfTWVtb3J5ICAgbWVtb3J5LAotICAgICAgICAgICAgIEZUX0J5dGUqICAgIGJhc2UsCi0gICAgICAgICAgICAgRlRfQnl0ZSogICAgbGltaXQgKTsKLQotICAgIHZvaWQKLSAgICAoKmRvbmUpKCBBRk1fUGFyc2VyICBwYXJzZXIgKTsKLQotICAgIEZUX0Vycm9yCi0gICAgKCpwYXJzZSkoIEFGTV9QYXJzZXIgIHBhcnNlciApOwotCi0gIH0gQUZNX1BhcnNlcl9GdW5jc1JlYzsKLQotCi0gIHR5cGVkZWYgc3RydWN0IEFGTV9TdHJlYW1SZWNfKiAgQUZNX1N0cmVhbTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFGTV9QYXJzZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIEFGTV9QYXJzZXIgaXMgYSBwYXJzZXIgZm9yIHRoZSBBRk0gZmlsZXMuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSAgICA6OiBUaGUgb2JqZWN0IHVzZWQgZm9yIG1lbW9yeSBvcGVyYXRpb25zIChhbGxvYyBhbmQgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgcmVhbGxvYykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICA6OiBUaGlzIGlzIGFuIG9wYXF1ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRm9udEluZm8gIDo6IFRoZSByZXN1bHQgd2lsbCBiZSBzdG9yZWQgaGVyZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnZXRfaW5kZXggOjogQSB1c2VyIHByb3ZpZGVkIGZ1bmN0aW9uIHRvIGdldCBhIGdseXBoIGluZGV4IGJ5IGl0cyAgKi8KLSAgLyogICAgICAgICAgICAgICAgIG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQUZNX1BhcnNlclJlY18KLSAgewotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5OwotICAgIEFGTV9TdHJlYW0gICAgc3RyZWFtOwotCi0gICAgQUZNX0ZvbnRJbmZvICBGb250SW5mbzsKLQotICAgIEZUX0ludAotICAgICgqZ2V0X2luZGV4KSggY29uc3QgY2hhciogIG5hbWUsCi0gICAgICAgICAgICAgICAgICBGVF9PZmZzZXQgICAgbGVuLAotICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgIHVzZXJfZGF0YSApOwotCi0gICAgdm9pZCogICAgICAgICB1c2VyX2RhdGE7Ci0KLSAgfSBBRk1fUGFyc2VyUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgVFlQRTEgQ0hBUk1BUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgdHlwZWRlZiBjb25zdCBzdHJ1Y3QgVDFfQ01hcF9DbGFzc2VzUmVjXyogIFQxX0NNYXBfQ2xhc3NlczsKLQotICB0eXBlZGVmIHN0cnVjdCBUMV9DTWFwX0NsYXNzZXNSZWNfCi0gIHsKLSAgICBGVF9DTWFwX0NsYXNzICBzdGFuZGFyZDsKLSAgICBGVF9DTWFwX0NsYXNzICBleHBlcnQ7Ci0gICAgRlRfQ01hcF9DbGFzcyAgY3VzdG9tOwotICAgIEZUX0NNYXBfQ2xhc3MgIHVuaWNvZGU7Ci0KLSAgfSBUMV9DTWFwX0NsYXNzZXNSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICBQU0F1eCBNb2R1bGUgSW50ZXJmYWNlICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgUFNBdXhfU2VydmljZVJlY18KLSAgewotICAgIC8qIGRvbid0IHVzZSBgUFNfVGFibGVfRnVuY3MnIGFuZCBmcmllbmRzIHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzICovCi0gICAgY29uc3QgUFNfVGFibGVfRnVuY3NSZWMqICAgIHBzX3RhYmxlX2Z1bmNzOwotICAgIGNvbnN0IFBTX1BhcnNlcl9GdW5jc1JlYyogICBwc19wYXJzZXJfZnVuY3M7Ci0gICAgY29uc3QgVDFfQnVpbGRlcl9GdW5jc1JlYyogIHQxX2J1aWxkZXJfZnVuY3M7Ci0gICAgY29uc3QgVDFfRGVjb2Rlcl9GdW5jc1JlYyogIHQxX2RlY29kZXJfZnVuY3M7Ci0KLSAgICB2b2lkCi0gICAgKCp0MV9kZWNyeXB0KSggRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICBzZWVkICk7Ci0KLSAgICBUMV9DTWFwX0NsYXNzZXMgIHQxX2NtYXBfY2xhc3NlczsKLQotICAgIC8qIGZpZWxkcyBhZnRlciB0aGlzIGNvbW1lbnQgbGluZSB3ZXJlIGFkZGVkIGFmdGVyIHZlcnNpb24gMi4xLjEwICovCi0gICAgY29uc3QgQUZNX1BhcnNlcl9GdW5jc1JlYyogIGFmbV9wYXJzZXJfZnVuY3M7Ci0KLSAgfSBQU0F1eF9TZXJ2aWNlUmVjLCAqUFNBdXhfU2VydmljZTsKLQotICAvKiBiYWNrd2FyZHMtY29tcGF0aWJsZSB0eXBlIGRlZmluaXRpb24gKi8KLSAgdHlwZWRlZiBQU0F1eF9TZXJ2aWNlUmVjICAgUFNBdXhfSW50ZXJmYWNlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICBTb21lIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgSVNfUFNfTkVXTElORSggY2ggKSBcCi0gICggKGNoKSA9PSAnXHInIHx8ICAgICAgICAgXAotICAgIChjaCkgPT0gJ1xuJyApCi0KLSNkZWZpbmUgSVNfUFNfU1BBQ0UoIGNoICkgIFwKLSAgKCAoY2gpID09ICcgJyAgICAgICAgIHx8IFwKLSAgICBJU19QU19ORVdMSU5FKCBjaCApIHx8IFwKLSAgICAoY2gpID09ICdcdCcgICAgICAgIHx8IFwKLSAgICAoY2gpID09ICdcZicgICAgICAgIHx8IFwKLSAgICAoY2gpID09ICdcMCcgKQotCi0jZGVmaW5lIElTX1BTX1NQRUNJQUwoIGNoICkgICAgICAgXAotICAoIChjaCkgPT0gJy8nICAgICAgICAgICAgICAgIHx8IFwKLSAgICAoY2gpID09ICcoJyB8fCAoY2gpID09ICcpJyB8fCBcCi0gICAgKGNoKSA9PSAnPCcgfHwgKGNoKSA9PSAnPicgfHwgXAotICAgIChjaCkgPT0gJ1snIHx8IChjaCkgPT0gJ10nIHx8IFwKLSAgICAoY2gpID09ICd7JyB8fCAoY2gpID09ICd9JyB8fCBcCi0gICAgKGNoKSA9PSAnJScgICAgICAgICAgICAgICAgKQotCi0jZGVmaW5lIElTX1BTX0RFTElNKCBjaCApICBcCi0gICggSVNfUFNfU1BBQ0UoIGNoICkgICB8fCBcCi0gICAgSVNfUFNfU1BFQ0lBTCggY2ggKSApCi0KLSNkZWZpbmUgSVNfUFNfRElHSVQoIGNoICkgICAgICAgIFwKLSAgKCAoY2gpID49ICcwJyAmJiAoY2gpIDw9ICc5JyApCi0KLSNkZWZpbmUgSVNfUFNfWERJR0lUKCBjaCApICAgICAgICAgICAgXAotICAoIElTX1BTX0RJR0lUKCBjaCApICAgICAgICAgICAgICB8fCBcCi0gICAgKCAoY2gpID49ICdBJyAmJiAoY2gpIDw9ICdGJyApIHx8IFwKLSAgICAoIChjaCkgPj0gJ2EnICYmIChjaCkgPD0gJ2YnICkgKQotCi0jZGVmaW5lIElTX1BTX0JBU0U4NSggY2ggKSAgICAgICBcCi0gICggKGNoKSA+PSAnIScgJiYgKGNoKSA8PSAndScgKQotCi0jZGVmaW5lIElTX1BTX1RPS0VOKCBjdXIsIGxpbWl0LCB0b2tlbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICggKGNoYXIpKGN1cilbMF0gPT0gKHRva2VuKVswXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBcCi0gICAgKCAoY3VyKSArIHNpemVvZiAoICh0b2tlbikgKSA9PSAobGltaXQpIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAoIChjdXIpICsgc2l6ZW9mKCAodG9rZW4pICkgPCAobGltaXQpICAgICAgICAgICYmICAgICAgICAgICAgICAgICBcCi0gICAgICAgIElTX1BTX0RFTElNKCAoY3VyKVtzaXplb2YgKCAodG9rZW4pICkgLSAxXSApICkgKSAgICAgICAgICAgICAmJiBcCi0gICAgZnRfc3RybmNtcCggKGNoYXIqKShjdXIpLCAodG9rZW4pLCBzaXplb2YgKCAodG9rZW4pICkgLSAxICkgPT0gMCApCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19QU0FVWF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvcHNoaW50cy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2hpbnRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYWFhYmEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9wc2hpbnRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNoaW50cy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEludGVyZmFjZSB0byBQb3N0c2NyaXB0LXNwZWNpZmljIChUeXBlIDEgYW5kIFR5cGUgMikgaGludHMgICAgICAgICAgICovCi0vKiAgICByZWNvcmRlcnMgKHNwZWNpZmljYXRpb24gb25seSkuICBUaGVzZSBhcmUgdXNlZCB0byBzdXBwb3J0IG5hdGl2ZSAgICAqLwotLyogICAgVDEvVDIgaGludHMgaW4gdGhlIGB0eXBlMScsIGBjaWQnLCBhbmQgYGNmZicgZm9udCBkcml2ZXJzLiAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19QU0hJTlRTX0hfXwotI2RlZmluZSBfX1BTSElOVFNfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9UWVBFMV9UQUJMRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgSU5URVJOQUwgUkVQUkVTRU5UQVRJT04gT0YgR0xPQkFMUyAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgUFNIX0dsb2JhbHNSZWNfKiAgUFNIX0dsb2JhbHM7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlBTSF9HbG9iYWxzX05ld0Z1bmMpKCBGVF9NZW1vcnkgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUHJpdmF0ZSogICBwcml2YXRlX2RpY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBTSF9HbG9iYWxzKiAgYWdsb2JhbHMgKTsKLQotICB0eXBlZGVmIHZvaWQKLSAgKCpQU0hfR2xvYmFsc19TZXRTY2FsZUZ1bmMpKCBQU0hfR2xvYmFscyAgZ2xvYmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICAgeF9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICAgeV9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICAgeF9kZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICAgeV9kZWx0YSApOwotCi0gIHR5cGVkZWYgdm9pZAotICAoKlBTSF9HbG9iYWxzX0Rlc3Ryb3lGdW5jKSggUFNIX0dsb2JhbHMgIGdsb2JhbHMgKTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBQU0hfR2xvYmFsc19GdW5jc1JlY18KLSAgewotICAgIFBTSF9HbG9iYWxzX05ld0Z1bmMgICAgICAgY3JlYXRlOwotICAgIFBTSF9HbG9iYWxzX1NldFNjYWxlRnVuYyAgc2V0X3NjYWxlOwotICAgIFBTSF9HbG9iYWxzX0Rlc3Ryb3lGdW5jICAgZGVzdHJveTsKLQotICB9IFBTSF9HbG9iYWxzX0Z1bmNzUmVjLCAqUFNIX0dsb2JhbHNfRnVuY3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICBQVUJMSUMgVFlQRSAxIEhJTlRTIFJFQ09SREVSICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAdHlwZToKLSAgICogICBUMV9IaW50cwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgVGhpcyBpcyBhIGhhbmRsZSB0byBhbiBvcGFxdWUgc3RydWN0dXJlIHVzZWQgdG8gcmVjb3JkIGdseXBoIGhpbnRzCi0gICAqICAgZnJvbSBhIFR5cGUgMSBjaGFyYWN0ZXIgZ2x5cGggY2hhcmFjdGVyIHN0cmluZy4KLSAgICoKLSAgICogICBUaGUgbWV0aG9kcyB1c2VkIHRvIG9wZXJhdGUgb24gdGhpcyBvYmplY3QgYXJlIGRlZmluZWQgYnkgdGhlCi0gICAqICAgQFQxX0hpbnRzX0Z1bmNzUmVjIHN0cnVjdHVyZS4gIFJlY29yZGluZyBnbHlwaCBoaW50cyBpcyBub3JtYWxseQotICAgKiAgIGFjaGlldmVkIHRocm91Z2ggdGhlIGZvbGxvd2luZyBzY2hlbWU6Ci0gICAqCi0gICAqICAgLSBPcGVuIGEgbmV3IGhpbnQgcmVjb3JkaW5nIHNlc3Npb24gYnkgY2FsbGluZyB0aGUgYG9wZW4nIG1ldGhvZC4KLSAgICogICAgIFRoaXMgcmV3aW5kcyB0aGUgcmVjb3JkZXIgYW5kIHByZXBhcmUgaXQgZm9yIG5ldyBpbnB1dC4KLSAgICoKLSAgICogICAtIEZvciBlYWNoIGhpbnQgZm91bmQgaW4gdGhlIGdseXBoIGNoYXJzdHJpbmcsIGNhbGwgdGhlIGNvcnJlc3BvbmRpbmcKLSAgICogICAgIG1ldGhvZCAoYHN0ZW0nLCBgc3RlbTMnLCBvciBgcmVzZXQnKS4gIE5vdGUgdGhhdCB0aGVzZSBmdW5jdGlvbnMgZG8KLSAgICogICAgIG5vdCByZXR1cm4gYW4gZXJyb3IgY29kZS4KLSAgICoKLSAgICogICAtIENsb3NlIHRoZSByZWNvcmRpbmcgc2Vzc2lvbiBieSBjYWxsaW5nIHRoZSBgY2xvc2UnIG1ldGhvZC4gIEl0Ci0gICAqICAgICByZXR1cm5zIGFuIGVycm9yIGNvZGUgaWYgdGhlIGhpbnRzIHdlcmUgaW52YWxpZCBvciBzb21ldGhpbmcKLSAgICogICAgIHN0cmFuZ2UgaGFwcGVuZWQgKGUuZy4sIG1lbW9yeSBzaG9ydGFnZSkuCi0gICAqCi0gICAqICAgVGhlIGhpbnRzIGFjY3VtdWxhdGVkIGluIHRoZSBvYmplY3QgY2FuIGxhdGVyIGJlIHVzZWQgYnkgdGhlCi0gICAqICAgUG9zdFNjcmlwdCBoaW50ZXIuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCBUMV9IaW50c1JlY18qICBUMV9IaW50czsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOgotICAgKiAgIFQxX0hpbnRzX0Z1bmNzCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIHBvaW50ZXIgdG8gdGhlIEBUMV9IaW50c19GdW5jc1JlYyBzdHJ1Y3R1cmUgdGhhdCBkZWZpbmVzIHRoZSBBUEkgb2YKLSAgICogICBhIGdpdmVuIEBUMV9IaW50cyBvYmplY3QuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBUMV9IaW50c19GdW5jc1JlY18qICBUMV9IaW50c19GdW5jczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdHlwZToKLSAgICogICBUMV9IaW50c19PcGVuRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMV9IaW50cyBjbGFzcyB1c2VkIHRvIHByZXBhcmUgaXQgZm9yIGEgbmV3IFR5cGUgMQotICAgKiAgIGhpbnRzIHJlY29yZGluZyBzZXNzaW9uLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDEgaGludHMgcmVjb3JkZXIuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFlvdSBzaG91bGQgYWx3YXlzIGNhbGwgdGhlIEBUMV9IaW50c19DbG9zZUZ1bmMgbWV0aG9kIGluIG9yZGVyIHRvCi0gICAqICAgY2xvc2UgYW4gb3BlbmVkIHJlY29yZGluZyBzZXNzaW9uLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqVDFfSGludHNfT3BlbkZ1bmMpKCBUMV9IaW50cyAgaGludHMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdHlwZToKLSAgICogICBUMV9IaW50c19TZXRTdGVtRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMV9IaW50cyBjbGFzcyB1c2VkIHRvIHJlY29yZCBhIG5ldyBob3Jpem9udGFsIG9yCi0gICAqICAgdmVydGljYWwgc3RlbS4gIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIFR5cGUgMSBgaHN0ZW0nIGFuZCBgdnN0ZW0nCi0gICAqICAgb3BlcmF0b3JzLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDEgaGludHMgcmVjb3JkZXIuCi0gICAqCi0gICAqICAgZGltZW5zaW9uIDo6Ci0gICAqICAgICAwIGZvciBob3Jpem9udGFsIHN0ZW1zIChoc3RlbSksIDEgZm9yIHZlcnRpY2FsIG9uZXMgKHZzdGVtKS4KLSAgICoKLSAgICogICBjb29yZHMgOjoKLSAgICogICAgIEFycmF5IG9mIDIgY29vcmRpbmF0ZXMgaW4gMTYuMTYgZm9ybWF0LCB1c2VkIGFzIChwb3NpdGlvbixsZW5ndGgpCi0gICAqICAgICBzdGVtIGRlc2NyaXB0b3IuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFVzZSB2ZXJ0aWNhbCBjb29yZGluYXRlcyAoeSkgZm9yIGhvcml6b250YWwgc3RlbXMgKGRpbT0wKS4gIFVzZQotICAgKiAgIGhvcml6b250YWwgY29vcmRpbmF0ZXMgKHgpIGZvciB2ZXJ0aWNhbCBzdGVtcyAoZGltPTEpLgotICAgKgotICAgKiAgIGBjb29yZHNbMF0nIGlzIHRoZSBhYnNvbHV0ZSBzdGVtIHBvc2l0aW9uIChsb3dlc3QgY29vcmRpbmF0ZSk7Ci0gICAqICAgYGNvb3Jkc1sxXScgaXMgdGhlIGxlbmd0aC4KLSAgICoKLSAgICogICBUaGUgbGVuZ3RoIGNhbiBiZSBuZWdhdGl2ZSwgaW4gd2hpY2ggY2FzZSBpdCBtdXN0IGJlIGVpdGhlciAtMjAgb3IKLSAgICogICAtMjEuICBJdCBpcyBpbnRlcnByZXRlZCBhcyBhIGBnaG9zdCcgc3RlbSwgYWNjb3JkaW5nIHRvIHRoZSBUeXBlIDEKLSAgICogICBzcGVjaWZpY2F0aW9uLgotICAgKgotICAgKiAgIElmIHRoZSBsZW5ndGggaXMgLTIxIChjb3JyZXNwb25kaW5nIHRvIGEgYm90dG9tIGdob3N0IHN0ZW0pLCB0aGVuCi0gICAqICAgdGhlIHJlYWwgc3RlbSBwb3NpdGlvbiBpcyBgY29vcmRzWzBdK2Nvb3Jkc1sxXScuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpUMV9IaW50c19TZXRTdGVtRnVuYykoIFQxX0hpbnRzICAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGRpbWVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgVDFfSGludHNfU2V0U3RlbTNGdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1ldGhvZCBvZiB0aGUgQFQxX0hpbnRzIGNsYXNzIHVzZWQgdG8gcmVjb3JkIHRocmVlCi0gICAqICAgY291bnRlci1jb250cm9sbGVkIGhvcml6b250YWwgb3IgdmVydGljYWwgc3RlbXMgYXQgb25jZS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGhpbnRzIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgVHlwZSAxIGhpbnRzIHJlY29yZGVyLgotICAgKgotICAgKiAgIGRpbWVuc2lvbiA6OgotICAgKiAgICAgMCBmb3IgaG9yaXpvbnRhbCBzdGVtcywgMSBmb3IgdmVydGljYWwgb25lcy4KLSAgICoKLSAgICogICBjb29yZHMgOjoKLSAgICogICAgIEFuIGFycmF5IG9mIDYgdmFsdWVzIGluIDE2LjE2IGZvcm1hdCwgaG9sZGluZyAzIChwb3NpdGlvbixsZW5ndGgpCi0gICAqICAgICBwYWlycyBmb3IgdGhlIGNvdW50ZXItY29udHJvbGxlZCBzdGVtcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgVXNlIHZlcnRpY2FsIGNvb3JkaW5hdGVzICh5KSBmb3IgaG9yaXpvbnRhbCBzdGVtcyAoZGltPTApLiAgVXNlCi0gICAqICAgaG9yaXpvbnRhbCBjb29yZGluYXRlcyAoeCkgZm9yIHZlcnRpY2FsIHN0ZW1zIChkaW09MSkuCi0gICAqCi0gICAqICAgVGhlIGxlbmd0aHMgY2Fubm90IGJlIG5lZ2F0aXZlIChnaG9zdCBzdGVtcyBhcmUgbmV2ZXIKLSAgICogICBjb3VudGVyLWNvbnRyb2xsZWQpLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqVDFfSGludHNfU2V0U3RlbTNGdW5jKSggVDFfSGludHMgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGRpbWVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIFQxX0hpbnRzX1Jlc2V0RnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMV9IaW50cyBjbGFzcyB1c2VkIHRvIHJlc2V0IHRoZSBzdGVtcyBoaW50cyBpbiBhCi0gICAqICAgcmVjb3JkaW5nIHNlc3Npb24uCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBoaW50cyA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFR5cGUgMSBoaW50cyByZWNvcmRlci4KLSAgICoKLSAgICogICBlbmRfcG9pbnQgOjoKLSAgICogICAgIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBwb2ludCBpbiB0aGUgaW5wdXQgZ2x5cGggaW4gd2hpY2ggdGhlCi0gICAqICAgICBwcmV2aW91c2x5IGRlZmluZWQgaGludHMgYXBwbHkuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpUMV9IaW50c19SZXNldEZ1bmMpKCBUMV9IaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGVuZF9wb2ludCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIFQxX0hpbnRzX0Nsb3NlRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMV9IaW50cyBjbGFzcyB1c2VkIHRvIGNsb3NlIGEgaGludCByZWNvcmRpbmcKLSAgICogICBzZXNzaW9uLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDEgaGludHMgcmVjb3JkZXIuCi0gICAqCi0gICAqICAgZW5kX3BvaW50IDo6Ci0gICAqICAgICBUaGUgaW5kZXggb2YgdGhlIGxhc3QgcG9pbnQgaW4gdGhlIGlucHV0IGdseXBoLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFRoZSBlcnJvciBjb2RlIGlzIHNldCB0byBpbmRpY2F0ZSB0aGF0IGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0aGUKLSAgICogICByZWNvcmRpbmcgc2Vzc2lvbi4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUMV9IaW50c19DbG9zZUZ1bmMpKCBUMV9IaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGVuZF9wb2ludCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIFQxX0hpbnRzX0FwcGx5RnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMV9IaW50cyBjbGFzcyB1c2VkIHRvIGFwcGx5IGhpbnRzIHRvIHRoZQotICAgKiAgIGNvcnJlc3BvbmRpbmcgZ2x5cGggb3V0bGluZS4gIE11c3QgYmUgY2FsbGVkIG9uY2UgYWxsIGhpbnRzIGhhdmUgYmVlbgotICAgKiAgIHJlY29yZGVkLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDEgaGludHMgcmVjb3JkZXIuCi0gICAqCi0gICAqICAgb3V0bGluZSA6OgotICAgKiAgICAgQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgb3V0bGluZSBkZXNjcmlwdG9yLgotICAgKgotICAgKiAgIGdsb2JhbHMgOjoKLSAgICogICAgIFRoZSBoaW50ZXIgZ2xvYmFscyBmb3IgdGhpcyBmb250LgotICAgKgotICAgKiAgIGhpbnRfbW9kZSA6OgotICAgKiAgICAgSGludGluZyBpbmZvcm1hdGlvbi4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBPbiBpbnB1dCwgYWxsIHBvaW50cyB3aXRoaW4gdGhlIG91dGxpbmUgYXJlIGluIGZvbnQgY29vcmRpbmF0ZXMuIE9uCi0gICAqICAgb3V0cHV0LCB0aGV5IGFyZSBpbiAxLzY0dGggb2YgcGl4ZWxzLgotICAgKgotICAgKiAgIFRoZSBzY2FsaW5nIHRyYW5zZm9ybWF0aW9uIGlzIHRha2VuIGZyb20gdGhlIGBnbG9iYWxzJyBvYmplY3Qgd2hpY2gKLSAgICogICBtdXN0IGNvcnJlc3BvbmQgdG8gdGhlIHNhbWUgZm9udCBhcyB0aGUgZ2x5cGguCi0gICAqCi0gICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVDFfSGludHNfQXBwbHlGdW5jKSggVDFfSGludHMgICAgICAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICAgICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIFBTSF9HbG9iYWxzICAgICBnbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICBoaW50X21vZGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzdHJ1Y3Q6Ci0gICAqICAgVDFfSGludHNfRnVuY3NSZWMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBwcm92aWRlIHRoZSBBUEkgdG8gQFQxX0hpbnRzIG9iamVjdHMuCi0gICAqCi0gICAqIEBmaWVsZHM6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUMSBIaW50cyByZWNvcmRlci4KLSAgICoKLSAgICogICBvcGVuIDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gb3BlbiBhIHJlY29yZGluZyBzZXNzaW9uLgotICAgKgotICAgKiAgIGNsb3NlIDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gY2xvc2UgYSByZWNvcmRpbmcgc2Vzc2lvbi4KLSAgICoKLSAgICogICBzdGVtIDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gc2V0IGEgc2ltcGxlIHN0ZW0uCi0gICAqCi0gICAqICAgc3RlbTMgOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byBzZXQgY291bnRlci1jb250cm9sbGVkIHN0ZW1zLgotICAgKgotICAgKiAgIHJlc2V0IDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gcmVzZXQgc3RlbSBoaW50cy4KLSAgICoKLSAgICogICBhcHBseSA6OgotICAgKiAgICAgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IHRoZSBoaW50cyB0byB0aGUgY29ycmVzcG9uZGluZyBnbHlwaCBvdXRsaW5lLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQxX0hpbnRzX0Z1bmNzUmVjXwotICB7Ci0gICAgVDFfSGludHMgICAgICAgICAgICAgICBoaW50czsKLSAgICBUMV9IaW50c19PcGVuRnVuYyAgICAgIG9wZW47Ci0gICAgVDFfSGludHNfQ2xvc2VGdW5jICAgICBjbG9zZTsKLSAgICBUMV9IaW50c19TZXRTdGVtRnVuYyAgIHN0ZW07Ci0gICAgVDFfSGludHNfU2V0U3RlbTNGdW5jICBzdGVtMzsKLSAgICBUMV9IaW50c19SZXNldEZ1bmMgICAgIHJlc2V0OwotICAgIFQxX0hpbnRzX0FwcGx5RnVuYyAgICAgYXBwbHk7Ci0KLSAgfSBUMV9IaW50c19GdW5jc1JlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgIFBVQkxJQyBUWVBFIDIgSElOVFMgUkVDT1JERVIgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOgotICAgKiAgIFQyX0hpbnRzCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBUaGlzIGlzIGEgaGFuZGxlIHRvIGFuIG9wYXF1ZSBzdHJ1Y3R1cmUgdXNlZCB0byByZWNvcmQgZ2x5cGggaGludHMKLSAgICogICBmcm9tIGEgVHlwZSAyIGNoYXJhY3RlciBnbHlwaCBjaGFyYWN0ZXIgc3RyaW5nLgotICAgKgotICAgKiAgIFRoZSBtZXRob2RzIHVzZWQgdG8gb3BlcmF0ZSBvbiB0aGlzIG9iamVjdCBhcmUgZGVmaW5lZCBieSB0aGUKLSAgICogICBAVDJfSGludHNfRnVuY3NSZWMgc3RydWN0dXJlLiAgUmVjb3JkaW5nIGdseXBoIGhpbnRzIGlzIG5vcm1hbGx5Ci0gICAqICAgYWNoaWV2ZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIHNjaGVtZToKLSAgICoKLSAgICogICAtIE9wZW4gYSBuZXcgaGludCByZWNvcmRpbmcgc2Vzc2lvbiBieSBjYWxsaW5nIHRoZSBgb3BlbicgbWV0aG9kLgotICAgKiAgICAgVGhpcyByZXdpbmRzIHRoZSByZWNvcmRlciBhbmQgcHJlcGFyZSBpdCBmb3IgbmV3IGlucHV0LgotICAgKgotICAgKiAgIC0gRm9yIGVhY2ggaGludCBmb3VuZCBpbiB0aGUgZ2x5cGggY2hhcnN0cmluZywgY2FsbCB0aGUgY29ycmVzcG9uZGluZwotICAgKiAgICAgbWV0aG9kIChgc3RlbXMnLCBgaGludG1hc2snLCBgY291bnRlcnMnKS4gIE5vdGUgdGhhdCB0aGVzZQotICAgKiAgICAgZnVuY3Rpb25zIGRvIG5vdCByZXR1cm4gYW4gZXJyb3IgY29kZS4KLSAgICoKLSAgICogICAtIENsb3NlIHRoZSByZWNvcmRpbmcgc2Vzc2lvbiBieSBjYWxsaW5nIHRoZSBgY2xvc2UnIG1ldGhvZC4gIEl0Ci0gICAqICAgICByZXR1cm5zIGFuIGVycm9yIGNvZGUgaWYgdGhlIGhpbnRzIHdlcmUgaW52YWxpZCBvciBzb21ldGhpbmcKLSAgICogICAgIHN0cmFuZ2UgaGFwcGVuZWQgKGUuZy4sIG1lbW9yeSBzaG9ydGFnZSkuCi0gICAqCi0gICAqICAgVGhlIGhpbnRzIGFjY3VtdWxhdGVkIGluIHRoZSBvYmplY3QgY2FuIGxhdGVyIGJlIHVzZWQgYnkgdGhlCi0gICAqICAgUG9zdHNjcmlwdCBoaW50ZXIuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCBUMl9IaW50c1JlY18qICBUMl9IaW50czsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEB0eXBlOgotICAgKiAgIFQyX0hpbnRzX0Z1bmNzCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIHBvaW50ZXIgdG8gdGhlIEBUMl9IaW50c19GdW5jc1JlYyBzdHJ1Y3R1cmUgdGhhdCBkZWZpbmVzIHRoZSBBUEkgb2YKLSAgICogICBhIGdpdmVuIEBUMl9IaW50cyBvYmplY3QuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBUMl9IaW50c19GdW5jc1JlY18qICBUMl9IaW50c19GdW5jczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdHlwZToKLSAgICogICBUMl9IaW50c19PcGVuRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBtZXRob2Qgb2YgdGhlIEBUMl9IaW50cyBjbGFzcyB1c2VkIHRvIHByZXBhcmUgaXQgZm9yIGEgbmV3IFR5cGUgMgotICAgKiAgIGhpbnRzIHJlY29yZGluZyBzZXNzaW9uLgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUeXBlIDIgaGludHMgcmVjb3JkZXIuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFlvdSBzaG91bGQgYWx3YXlzIGNhbGwgdGhlIEBUMl9IaW50c19DbG9zZUZ1bmMgbWV0aG9kIGluIG9yZGVyIHRvCi0gICAqICAgY2xvc2UgYW4gb3BlbmVkIHJlY29yZGluZyBzZXNzaW9uLgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqVDJfSGludHNfT3BlbkZ1bmMpKCBUMl9IaW50cyAgaGludHMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdHlwZToKLSAgICogICBUMl9IaW50c19TdGVtc0Z1bmMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWV0aG9kIG9mIHRoZSBAVDJfSGludHMgY2xhc3MgdXNlZCB0byBzZXQgdGhlIHRhYmxlIG9mIHN0ZW1zIGluCi0gICAqICAgZWl0aGVyIHRoZSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIGRpbWVuc2lvbi4gIEVxdWl2YWxlbnQgdG8gdGhlCi0gICAqICAgYGhzdGVtJywgYHZzdGVtJywgYGhzdGVtaG0nLCBhbmQgYHZzdGVtaG0nIFR5cGUgMiBvcGVyYXRvcnMuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBoaW50cyA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFR5cGUgMiBoaW50cyByZWNvcmRlci4KLSAgICoKLSAgICogICBkaW1lbnNpb24gOjoKLSAgICogICAgIDAgZm9yIGhvcml6b250YWwgc3RlbXMgKGhzdGVtKSwgMSBmb3IgdmVydGljYWwgb25lcyAodnN0ZW0pLgotICAgKgotICAgKiAgIGNvdW50IDo6Ci0gICAqICAgICBUaGUgbnVtYmVyIG9mIHN0ZW1zLgotICAgKgotICAgKiAgIGNvb3JkcyA6OgotICAgKiAgICAgQW4gYXJyYXkgb2YgYGNvdW50JyAocG9zaXRpb24sbGVuZ3RoKSBwYWlycyBpbiAxNi4xNiBmb3JtYXQuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIFVzZSB2ZXJ0aWNhbCBjb29yZGluYXRlcyAoeSkgZm9yIGhvcml6b250YWwgc3RlbXMgKGRpbT0wKS4gIFVzZQotICAgKiAgIGhvcml6b250YWwgY29vcmRpbmF0ZXMgKHgpIGZvciB2ZXJ0aWNhbCBzdGVtcyAoZGltPTEpLgotICAgKgotICAgKiAgIFRoZXJlIGFyZSBgMipjb3VudCcgZWxlbWVudHMgaW4gdGhlIGBjb29yZHMnIGFycmF5LiAgRWFjaCBldmVuCi0gICAqICAgZWxlbWVudCBpcyBhbiBhYnNvbHV0ZSBwb3NpdGlvbiBpbiBmb250IHVuaXRzLCBlYWNoIG9kZCBlbGVtZW50IGlzIGEKLSAgICogICBsZW5ndGggaW4gZm9udCB1bml0cy4KLSAgICoKLSAgICogICBBIGxlbmd0aCBjYW4gYmUgbmVnYXRpdmUsIGluIHdoaWNoIGNhc2UgaXQgbXVzdCBiZSBlaXRoZXIgLTIwIG9yCi0gICAqICAgLTIxLiAgSXQgaXMgaW50ZXJwcmV0ZWQgYXMgYSBgZ2hvc3QnIHN0ZW0sIGFjY29yZGluZyB0byB0aGUgVHlwZSAxCi0gICAqICAgc3BlY2lmaWNhdGlvbi4KLSAgICoKLSAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKlQyX0hpbnRzX1N0ZW1zRnVuYykoIFQyX0hpbnRzICAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBkaW1lbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkaW5hdGVzICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3R5cGU6Ci0gICAqICAgVDJfSGludHNfTWFza0Z1bmMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWV0aG9kIG9mIHRoZSBAVDJfSGludHMgY2xhc3MgdXNlZCB0byBzZXQgYSBnaXZlbiBoaW50bWFzayAodGhpcwotICAgKiAgIGNvcnJlc3BvbmRzIHRvIHRoZSBgaGludG1hc2snIFR5cGUgMiBvcGVyYXRvcikuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICBoaW50cyA6OgotICAgKiAgICAgQSBoYW5kbGUgdG8gdGhlIFR5cGUgMiBoaW50cyByZWNvcmRlci4KLSAgICoKLSAgICogICBlbmRfcG9pbnQgOjoKLSAgICogICAgIFRoZSBnbHlwaCBpbmRleCBvZiB0aGUgbGFzdCBwb2ludCB0byB3aGljaCB0aGUgcHJldmlvdXNseSBkZWZpbmVkCi0gICAqICAgICBvciBhY3RpdmF0ZWQgaGludHMgYXBwbHkuCi0gICAqCi0gICAqICAgYml0X2NvdW50IDo6Ci0gICAqICAgICBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGhpbnQgbWFzay4KLSAgICoKLSAgICogICBieXRlcyA6OgotICAgKiAgICAgQW4gYXJyYXkgb2YgYnl0ZXMgbW9kZWxsaW5nIHRoZSBoaW50IG1hc2suCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIElmIHRoZSBoaW50bWFzayBzdGFydHMgdGhlIGNoYXJzdHJpbmcgKGJlZm9yZSBhbnkgZ2x5cGggcG9pbnQKLSAgICogICBkZWZpbml0aW9uKSwgdGhlIHZhbHVlIG9mIGBlbmRfcG9pbnQnIHNob3VsZCBiZSAwLgotICAgKgotICAgKiAgIGBiaXRfY291bnQnIGlzIHRoZSBudW1iZXIgb2YgbWVhbmluZ2Z1bCBiaXRzIGluIHRoZSBgYnl0ZXMnIGFycmF5OyBpdAotICAgKiAgIG11c3QgYmUgZXF1YWwgdG8gdGhlIHRvdGFsIG51bWJlciBvZiBoaW50cyBkZWZpbmVkIHNvIGZhciAoaS5lLiwKLSAgICogICBob3Jpem9udGFsK3ZlcnRpY2FscykuCi0gICAqCi0gICAqICAgVGhlIGBieXRlcycgYXJyYXkgY2FuIGNvbWUgZGlyZWN0bHkgZnJvbSB0aGUgVHlwZSAyIGNoYXJzdHJpbmcgYW5kCi0gICAqICAgcmVzcGVjdHMgdGhlIHNhbWUgZm9ybWF0LgotICAgKgotICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqVDJfSGludHNfTWFza0Z1bmMpKCBUMl9IaW50cyAgICAgICAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgZW5kX3BvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIGJpdF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBieXRlcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0eXBlOgotICAgKiAgIFQyX0hpbnRzX0NvdW50ZXJGdW5jCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIG1ldGhvZCBvZiB0aGUgQFQyX0hpbnRzIGNsYXNzIHVzZWQgdG8gc2V0IGEgZ2l2ZW4gY291bnRlciBtYXNrCi0gICAqICAgKHRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGBoaW50bWFzaycgVHlwZSAyIG9wZXJhdG9yKS4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGhpbnRzIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgVHlwZSAyIGhpbnRzIHJlY29yZGVyLgotICAgKgotICAgKiAgIGVuZF9wb2ludCA6OgotICAgKiAgICAgQSBnbHlwaCBpbmRleCBvZiB0aGUgbGFzdCBwb2ludCB0byB3aGljaCB0aGUgcHJldmlvdXNseSBkZWZpbmVkIG9yCi0gICAqICAgICBhY3RpdmUgaGludHMgYXBwbHkuCi0gICAqCi0gICAqICAgYml0X2NvdW50IDo6Ci0gICAqICAgICBUaGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGhpbnQgbWFzay4KLSAgICoKLSAgICogICBieXRlcyA6OgotICAgKiAgICAgQW4gYXJyYXkgb2YgYnl0ZXMgbW9kZWxsaW5nIHRoZSBoaW50IG1hc2suCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgIElmIHRoZSBoaW50bWFzayBzdGFydHMgdGhlIGNoYXJzdHJpbmcgKGJlZm9yZSBhbnkgZ2x5cGggcG9pbnQKLSAgICogICBkZWZpbml0aW9uKSwgdGhlIHZhbHVlIG9mIGBlbmRfcG9pbnQnIHNob3VsZCBiZSAwLgotICAgKgotICAgKiAgIGBiaXRfY291bnQnIGlzIHRoZSBudW1iZXIgb2YgbWVhbmluZ2Z1bCBiaXRzIGluIHRoZSBgYnl0ZXMnIGFycmF5OyBpdAotICAgKiAgIG11c3QgYmUgZXF1YWwgdG8gdGhlIHRvdGFsIG51bWJlciBvZiBoaW50cyBkZWZpbmVkIHNvIGZhciAoaS5lLiwKLSAgICogICBob3Jpem9udGFsK3ZlcnRpY2FscykuCi0gICAqCi0gICAqICAgIFRoZSBgYnl0ZXMnIGFycmF5IGNhbiBjb21lIGRpcmVjdGx5IGZyb20gdGhlIFR5cGUgMiBjaGFyc3RyaW5nIGFuZAotICAgKiAgICByZXNwZWN0cyB0aGUgc2FtZSBmb3JtYXQuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpUMl9IaW50c19Db3VudGVyRnVuYykoIFQyX0hpbnRzICAgICAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBiaXRfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CeXRlKiAgYnl0ZXMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdHlwZToKLSAgICogICBUMl9IaW50c19DbG9zZUZ1bmMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWV0aG9kIG9mIHRoZSBAVDJfSGludHMgY2xhc3MgdXNlZCB0byBjbG9zZSBhIGhpbnQgcmVjb3JkaW5nCi0gICAqICAgc2Vzc2lvbi4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGhpbnRzIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgVHlwZSAyIGhpbnRzIHJlY29yZGVyLgotICAgKgotICAgKiAgIGVuZF9wb2ludCA6OgotICAgKiAgICAgVGhlIGluZGV4IG9mIHRoZSBsYXN0IHBvaW50IGluIHRoZSBpbnB1dCBnbHlwaC4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICBUaGUgZXJyb3IgY29kZSBpcyBzZXQgdG8gaW5kaWNhdGUgdGhhdCBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlCi0gICAqICAgcmVjb3JkaW5nIHNlc3Npb24uCi0gICAqCi0gICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVDJfSGludHNfQ2xvc2VGdW5jKSggVDJfSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBlbmRfcG9pbnQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdHlwZToKLSAgICogICBUMl9IaW50c19BcHBseUZ1bmMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbWV0aG9kIG9mIHRoZSBAVDJfSGludHMgY2xhc3MgdXNlZCB0byBhcHBseSBoaW50cyB0byB0aGUKLSAgICogICBjb3JyZXNwb25kaW5nIGdseXBoIG91dGxpbmUuICBNdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgYGNsb3NlJwotICAgKiAgIG1ldGhvZC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgIGhpbnRzIDo6Ci0gICAqICAgICBBIGhhbmRsZSB0byB0aGUgVHlwZSAyIGhpbnRzIHJlY29yZGVyLgotICAgKgotICAgKiAgIG91dGxpbmUgOjoKLSAgICogICAgIEEgcG9pbnRlciB0byB0aGUgdGFyZ2V0IG91dGxpbmUgZGVzY3JpcHRvci4KLSAgICoKLSAgICogICBnbG9iYWxzIDo6Ci0gICAqICAgICBUaGUgaGludGVyIGdsb2JhbHMgZm9yIHRoaXMgZm9udC4KLSAgICoKLSAgICogICBoaW50X21vZGUgOjoKLSAgICogICAgIEhpbnRpbmcgaW5mb3JtYXRpb24uCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgT24gaW5wdXQsIGFsbCBwb2ludHMgd2l0aGluIHRoZSBvdXRsaW5lIGFyZSBpbiBmb250IGNvb3JkaW5hdGVzLiBPbgotICAgKiAgIG91dHB1dCwgdGhleSBhcmUgaW4gMS82NHRoIG9mIHBpeGVscy4KLSAgICoKLSAgICogICBUaGUgc2NhbGluZyB0cmFuc2Zvcm1hdGlvbiBpcyB0YWtlbiBmcm9tIHRoZSBgZ2xvYmFscycgb2JqZWN0IHdoaWNoCi0gICAqICAgbXVzdCBjb3JyZXNwb25kIHRvIHRoZSBzYW1lIGZvbnQgdGhhbiB0aGUgZ2x5cGguCi0gICAqCi0gICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVDJfSGludHNfQXBwbHlGdW5jKSggVDJfSGludHMgICAgICAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICAgICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIFBTSF9HbG9iYWxzICAgICBnbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICBoaW50X21vZGUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBzdHJ1Y3Q6Ci0gICAqICAgVDJfSGludHNfRnVuY3NSZWMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIFRoZSBzdHJ1Y3R1cmUgdXNlZCB0byBwcm92aWRlIHRoZSBBUEkgdG8gQFQyX0hpbnRzIG9iamVjdHMuCi0gICAqCi0gICAqIEBmaWVsZHM6Ci0gICAqICAgaGludHMgOjoKLSAgICogICAgIEEgaGFuZGxlIHRvIHRoZSBUMiBoaW50cyByZWNvcmRlciBvYmplY3QuCi0gICAqCi0gICAqICAgb3BlbiA6OgotICAgKiAgICAgVGhlIGZ1bmN0aW9uIHRvIG9wZW4gYSByZWNvcmRpbmcgc2Vzc2lvbi4KLSAgICoKLSAgICogICBjbG9zZSA6OgotICAgKiAgICAgVGhlIGZ1bmN0aW9uIHRvIGNsb3NlIGEgcmVjb3JkaW5nIHNlc3Npb24uCi0gICAqCi0gICAqICAgc3RlbXMgOjoKLSAgICogICAgIFRoZSBmdW5jdGlvbiB0byBzZXQgdGhlIGRpbWVuc2lvbidzIHN0ZW1zIHRhYmxlLgotICAgKgotICAgKiAgIGhpbnRtYXNrIDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gc2V0IGhpbnQgbWFza3MuCi0gICAqCi0gICAqICAgY291bnRlciA6OgotICAgKiAgICAgVGhlIGZ1bmN0aW9uIHRvIHNldCBjb3VudGVyIG1hc2tzLgotICAgKgotICAgKiAgIGFwcGx5IDo6Ci0gICAqICAgICBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgdGhlIGhpbnRzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGdseXBoIG91dGxpbmUuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVDJfSGludHNfRnVuY3NSZWNfCi0gIHsKLSAgICBUMl9IaW50cyAgICAgICAgICAgICAgaGludHM7Ci0gICAgVDJfSGludHNfT3BlbkZ1bmMgICAgIG9wZW47Ci0gICAgVDJfSGludHNfQ2xvc2VGdW5jICAgIGNsb3NlOwotICAgIFQyX0hpbnRzX1N0ZW1zRnVuYyAgICBzdGVtczsKLSAgICBUMl9IaW50c19NYXNrRnVuYyAgICAgaGludG1hc2s7Ci0gICAgVDJfSGludHNfQ291bnRlckZ1bmMgIGNvdW50ZXI7Ci0gICAgVDJfSGludHNfQXBwbHlGdW5jICAgIGFwcGx5OwotCi0gIH0gVDJfSGludHNfRnVuY3NSZWM7Ci0KLQotICAvKiAqLwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTSGludGVyX0ludGVyZmFjZV8KLSAgewotICAgIFBTSF9HbG9iYWxzX0Z1bmNzICAoKmdldF9nbG9iYWxzX2Z1bmNzKSggRlRfTW9kdWxlICBtb2R1bGUgKTsKLSAgICBUMV9IaW50c19GdW5jcyAgICAgKCpnZXRfdDFfZnVuY3MpICAgICAoIEZUX01vZHVsZSAgbW9kdWxlICk7Ci0gICAgVDJfSGludHNfRnVuY3MgICAgICgqZ2V0X3QyX2Z1bmNzKSAgICAgKCBGVF9Nb2R1bGUgIG1vZHVsZSApOwotCi0gIH0gUFNIaW50ZXJfSW50ZXJmYWNlOwotCi0gIHR5cGVkZWYgUFNIaW50ZXJfSW50ZXJmYWNlKiAgUFNIaW50ZXJfU2VydmljZTsKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX1BTSElOVEVSX0lOVEVSRkFDRSggICAgICAgIFwKLSAgICAgICAgICBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfZ2xvYmFsc19mdW5jc18sICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfdDFfZnVuY3NfLCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfdDJfZnVuY3NfICkgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIGNvbnN0IFBTSGludGVyX0ludGVyZmFjZSAgY2xhc3NfID0gIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfZ2xvYmFsc19mdW5jc18sICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfdDFfZnVuY3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfdDJfZnVuY3NfICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfUFNISU5URVJfSU5URVJGQUNFKCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfZ2xvYmFsc19mdW5jc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF90MV9mdW5jc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X3QyX2Z1bmNzXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNIaW50ZXJfSW50ZXJmYWNlKiAgY2xhenogKSAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X2dsb2JhbHNfZnVuY3MgPSBnZXRfZ2xvYmFsc19mdW5jc187ICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfdDFfZnVuY3MgICAgICA9IGdldF90MV9mdW5jc187ICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF90Ml9mdW5jcyAgICAgID0gZ2V0X3QyX2Z1bmNzXzsgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19QU0hJTlRTX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmJkZi5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmJkZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjViNTM2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZiZGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2YmRmLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgQkRGIHNlcnZpY2VzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1NWQkRGX0hfXwotI2RlZmluZSBfX1NWQkRGX0hfXwotCi0jaW5jbHVkZSBGVF9CREZfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX0JERiAgImJkZiIKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfQkRGX0dldENoYXJzZXRJZEZ1bmMpKCBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgKmFjaGFyc2V0X2VuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICphY2hhcnNldF9yZWdpc3RyeSApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9CREZfR2V0UHJvcGVydHlGdW5jKSggRlRfRmFjZSAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICAgICAgcHJvcF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCREZfUHJvcGVydHlSZWMgICphcHJvcGVydHkgKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBCREYgKQotICB7Ci0gICAgRlRfQkRGX0dldENoYXJzZXRJZEZ1bmMgIGdldF9jaGFyc2V0X2lkOwotICAgIEZUX0JERl9HZXRQcm9wZXJ0eUZ1bmMgICBnZXRfcHJvcGVydHk7Ci0gIH07Ci0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX0JERlJlYyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jaGFyc2V0X2lkXywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfcHJvcGVydHlfICkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX0JERlJlYyAgY2xhc3NfID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfY2hhcnNldF9pZF8sIGdldF9wcm9wZXJ0eV8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfQkRGUmVjKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NoYXJzZXRfaWRfLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9wcm9wZXJ0eV8gKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfU2VydmljZV9CREZSZWMqICBjbGF6eiApICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X2NoYXJzZXRfaWQgPSBnZXRfY2hhcnNldF9pZF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9wcm9wZXJ0eSAgID0gZ2V0X3Byb3BlcnR5XzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1NWQkRGX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmNpZC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmNpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTUzNWE2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZjaWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2Y2lkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgQ0lEIGZvbnQgc2VydmljZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNy0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGVyZWsgQ2xlZ2cgYW5kIE1pY2hhZWwgVG9mdGRhbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1NWQ0lEX0hfXwotI2RlZmluZSBfX1NWQ0lEX0hfXwotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfQ0lEICAiQ0lEIgotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9DSURfR2V0UmVnaXN0cnlPcmRlcmluZ1N1cHBsZW1lbnRGdW5jKSggRlRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgKnJlZ2lzdHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgKm9yZGVyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgKnN1cHBsZW1lbnQgKTsKLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0NJRF9HZXRJc0ludGVybmFsbHlDSURLZXllZEZ1bmMpKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgKmlzX2NpZCApOwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfQ0lEX0dldENJREZyb21HbHlwaEluZGV4RnVuYykoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICpjaWQgKTsKLQotICBGVF9ERUZJTkVfU0VSVklDRSggQ0lEICkKLSAgewotICAgIEZUX0NJRF9HZXRSZWdpc3RyeU9yZGVyaW5nU3VwcGxlbWVudEZ1bmMgIGdldF9yb3M7Ci0gICAgRlRfQ0lEX0dldElzSW50ZXJuYWxseUNJREtleWVkRnVuYyAgICAgICAgZ2V0X2lzX2NpZDsKLSAgICBGVF9DSURfR2V0Q0lERnJvbUdseXBoSW5kZXhGdW5jICAgICAgICAgICBnZXRfY2lkX2Zyb21fZ2x5cGhfaW5kZXg7Ci0gIH07Ci0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX0NJRFJFQyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9yb3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfaXNfY2lkXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NpZF9mcm9tX2dseXBoX2luZGV4XyApICAgICAgICAgICAgICAgXAotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9DSURSZWMgY2xhc3NfID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X3Jvc18sIGdldF9pc19jaWRfLCBnZXRfY2lkX2Zyb21fZ2x5cGhfaW5kZXhfICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX0NJRFJFQyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9yb3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfaXNfY2lkXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2NpZF9mcm9tX2dseXBoX2luZGV4XyApICAgICAgICAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZV9DSURSZWMqICBjbGF6eiApICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfcm9zICAgICAgICAgICAgICAgICAgPSBnZXRfcm9zXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X2lzX2NpZCAgICAgICAgICAgICAgID0gZ2V0X2lzX2NpZF87ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9jaWRfZnJvbV9nbHlwaF9pbmRleCA9IGdldF9jaWRfZnJvbV9nbHlwaF9pbmRleF87ICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1NWQ0lEX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmZudGZtdC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmZudGZtdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGIzNjE3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZmbnRmbXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2Zm50Zm10LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgZm9udCBmb3JtYXQgc2VydmljZSAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1NWRk5URk1UX0hfXwotI2RlZmluZSBfX1NWRk5URk1UX0hfXwotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qCi0gICAqICBBIHRyaXZpYWwgc2VydmljZSB1c2VkIHRvIHJldHVybiB0aGUgbmFtZSBvZiBhIGZhY2UncyBmb250IGRyaXZlciwKLSAgICogIGFjY29yZGluZyB0byB0aGUgWEZyZWU4NiBub21lbmNsYXR1cmUuICBOb3RlIHRoYXQgdGhlIHNlcnZpY2UgZGF0YQotICAgKiAgaXMgYSBzaW1wbGUgY29uc3RhbnQgc3RyaW5nIHBvaW50ZXIuCi0gICAqLwotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfRk9OVF9GT1JNQVQgICJmb250LWZvcm1hdCIKLQotI2RlZmluZSBGVF9GT05UX0ZPUk1BVF9UUlVFVFlQRSAgIlRydWVUeXBlIgotI2RlZmluZSBGVF9GT05UX0ZPUk1BVF9UWVBFXzEgICAgIlR5cGUgMSIKLSNkZWZpbmUgRlRfRk9OVF9GT1JNQVRfQkRGICAgICAgICJCREYiCi0jZGVmaW5lIEZUX0ZPTlRfRk9STUFUX1BDRiAgICAgICAiUENGIgotI2RlZmluZSBGVF9GT05UX0ZPUk1BVF9UWVBFXzQyICAgIlR5cGUgNDIiCi0jZGVmaW5lIEZUX0ZPTlRfRk9STUFUX0NJRCAgICAgICAiQ0lEIFR5cGUgMSIKLSNkZWZpbmUgRlRfRk9OVF9GT1JNQVRfQ0ZGICAgICAgICJDRkYiCi0jZGVmaW5lIEZUX0ZPTlRfRk9STUFUX1BGUiAgICAgICAiUEZSIgotI2RlZmluZSBGVF9GT05UX0ZPUk1BVF9XSU5GTlQgICAgIldpbmRvd3MgRk5UIgotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1NWRk5URk1UX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmdsZGljdC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmdsZGljdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzhiY2E1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZnbGRpY3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2Z2xkaWN0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgZ2x5cGggZGljdGlvbmFyeSBzZXJ2aWNlcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1NWR0xESUNUX0hfXwotI2RlZmluZSBfX1NWR0xESUNUX0hfXwotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qCi0gICAqICBBIHNlcnZpY2UgdXNlZCB0byByZXRyaWV2ZSBnbHlwaCBuYW1lcywgYXMgd2VsbCBhcyB0byBmaW5kIHRoZQotICAgKiAgaW5kZXggb2YgYSBnaXZlbiBnbHlwaCBuYW1lIGluIGEgZm9udC4KLSAgICoKLSAgICovCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9HTFlQSF9ESUNUICAiZ2x5cGgtZGljdCIKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9HbHlwaERpY3RfR2V0TmFtZUZ1bmMpKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBidWZmZXJfbWF4ICk7Ci0KLSAgdHlwZWRlZiBGVF9VSW50Ci0gICgqRlRfR2x5cGhEaWN0X05hbWVJbmRleEZ1bmMpKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyaW5nKiAgZ2x5cGhfbmFtZSApOwotCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0UoIEdseXBoRGljdCApCi0gIHsKLSAgICBGVF9HbHlwaERpY3RfR2V0TmFtZUZ1bmMgICAgZ2V0X25hbWU7Ci0gICAgRlRfR2x5cGhEaWN0X05hbWVJbmRleEZ1bmMgIG5hbWVfaW5kZXg7ICAvKiBvcHRpb25hbCAqLwotICB9OwotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9HTFlQSERJQ1RSRUMoIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X25hbWVfLCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX2luZGV4XykgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9HbHlwaERpY3RSZWMgIGNsYXNzXyA9ICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfbmFtZV8sIG5hbWVfaW5kZXhfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX0dMWVBIRElDVFJFQyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfbmFtZV8sICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfaW5kZXhfKSAgICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgIGxpYnJhcnksICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VfR2x5cGhEaWN0UmVjKiAgY2xhenogKSAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9uYW1lICAgPSBnZXRfbmFtZV87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bmFtZV9pbmRleCA9IG5hbWVfaW5kZXhfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1NWR0xESUNUX0hfXyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdmd4dmFsLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Z3h2YWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTljYzNiNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2Z3h2YWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2Z3h2YWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBBUEkgZm9yIHZhbGlkYXRpbmcgVHJ1ZVR5cGVHWC9BQVQgdGFibGVzIChzcGVjaWZpY2F0aW9uKS4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTWFzYXRha2UgWUFNQVRPLCBSZWQgSGF0IEsuSy4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIGd4dmFsaWQgaXMgZGVyaXZlZCBmcm9tIGJvdGggZ3hsYXlvdXQgbW9kdWxlIGFuZCBvdHZhbGlkIG1vZHVsZS4gICAgICAgICovCi0vKiBEZXZlbG9wbWVudCBvZiBneGxheW91dCBpcyBzdXBwb3J0ZWQgYnkgdGhlIEluZm9ybWF0aW9uLXRlY2hub2xvZ3kgICAgICAqLwotLyogUHJvbW90aW9uIEFnZW5jeShJUEEpLCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19TVkdYVkFMX0hfXwotI2RlZmluZSBfX1NWR1hWQUxfSF9fCi0KLSNpbmNsdWRlIEZUX0dYX1ZBTElEQVRFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1ZBTElEQVRFX0gKLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX0dYX1ZBTElEQVRFICAgICAgICAgICAidHJ1ZXR5cGVneC12YWxpZGF0ZSIKLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9DTEFTU0lDS0VSTl9WQUxJREFURSAgImNsYXNzaWNrZXJuLXZhbGlkYXRlIgotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpneHZfdmFsaWRhdGVfZnVuYykoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGd4X2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgIHRhYmxlc1tGVF9WQUxJREFURV9HWF9MRU5HVEhdLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIHRhYmxlX2xlbmd0aCApOwotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKmNrZXJuX3ZhbGlkYXRlX2Z1bmMpKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGNrZXJuX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgKmNrZXJuX3RhYmxlICk7Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRSggR1h2YWxpZGF0ZSApCi0gIHsKLSAgICBneHZfdmFsaWRhdGVfZnVuYyAgdmFsaWRhdGU7Ci0gIH07Ci0KLSAgRlRfREVGSU5FX1NFUlZJQ0UoIENLRVJOdmFsaWRhdGUgKQotICB7Ci0gICAgY2tlcm5fdmFsaWRhdGVfZnVuYyAgdmFsaWRhdGU7Ci0gIH07Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIF9fU1ZHWFZBTF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZrZXJuLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2a2Vybi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzI2ZjE1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZrZXJuLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdmtlcm4uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIEtlcm5pbmcgc2VydmljZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19TVktFUk5fSF9fCi0jZGVmaW5lIF9fU1ZLRVJOX0hfXwotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBQkxFU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9LRVJOSU5HICAia2VybmluZyIKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9LZXJuaW5nX1RyYWNrR2V0RnVuYykoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgcG9pbnRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgZGVncmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBha2VybmluZyApOwotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBLZXJuaW5nICkKLSAgewotICAgIEZUX0tlcm5pbmdfVHJhY2tHZXRGdW5jICBnZXRfdHJhY2s7Ci0gIH07Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIF9fU1ZLRVJOX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm1tLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2bW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJjZWNmYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2bW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdm1tLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIE11bHRpcGxlIE1hc3RlcnMgYW5kIEdYIHZhciBzZXJ2aWNlcyAoc3BlY2lmaWNhdGlvbikuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19TVk1NX0hfXwotI2RlZmluZSBfX1NWTU1fSF9fCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoKLSAgICogIEEgc2VydmljZSB1c2VkIHRvIG1hbmFnZSBtdWx0aXBsZS1tYXN0ZXJzIGRhdGEgaW4gYSBnaXZlbiBmYWNlLgotICAgKgotICAgKiAgU2VlIHRoZSByZWxhdGVkIEFQSXMgaW4gYGZ0bW0uaCcgKEZUX01VTFRJUExFX01BU1RFUlNfSCkuCi0gICAqCi0gICAqLwotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfTVVMVElfTUFTVEVSUyAgIm11bHRpLW1hc3RlcnMiCi0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfR2V0X01NX0Z1bmMpKCBGVF9GYWNlICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfTXVsdGlfTWFzdGVyKiAgbWFzdGVyICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX0dldF9NTV9WYXJfRnVuYykoIEZUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01NX1ZhciogICptYXN0ZXIgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfU2V0X01NX0Rlc2lnbl9GdW5jKSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogIGNvb3JkcyApOwotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9TZXRfVmFyX0Rlc2lnbl9GdW5jKSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1NldF9NTV9CbGVuZF9GdW5jKSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICBjb29yZHMgKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBNdWx0aU1hc3RlcnMgKQotICB7Ci0gICAgRlRfR2V0X01NX0Z1bmMgICAgICAgICAgZ2V0X21tOwotICAgIEZUX1NldF9NTV9EZXNpZ25fRnVuYyAgIHNldF9tbV9kZXNpZ247Ci0gICAgRlRfU2V0X01NX0JsZW5kX0Z1bmMgICAgc2V0X21tX2JsZW5kOwotICAgIEZUX0dldF9NTV9WYXJfRnVuYyAgICAgIGdldF9tbV92YXI7Ci0gICAgRlRfU2V0X1Zhcl9EZXNpZ25fRnVuYyAgc2V0X3Zhcl9kZXNpZ247Ci0gIH07Ci0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX01VTFRJTUFTVEVSU1JFQyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9tbV8sICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfbW1fZGVzaWduXywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X21tX2JsZW5kXywgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9tbV92YXJfLCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfdmFyX2Rlc2lnbl8gKSAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX011bHRpTWFzdGVyc1JlYyAgY2xhc3NfID0gICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfbW1fLCBzZXRfbW1fZGVzaWduXywgc2V0X21tX2JsZW5kXywgZ2V0X21tX3Zhcl8sIHNldF92YXJfZGVzaWduXyAgICBcCi0gIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfTVVMVElNQVNURVJTUkVDKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X21tXywgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9tbV9kZXNpZ25fLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfbW1fYmxlbmRfLCAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X21tX3Zhcl8sICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF92YXJfZGVzaWduXyApICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfU2VydmljZV9NdWx0aU1hc3RlcnNSZWMqICBjbGF6eiApICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X21tICAgICAgICAgPSBnZXRfbW1fOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnNldF9tbV9kZXNpZ24gID0gc2V0X21tX2Rlc2lnbl87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5zZXRfbW1fYmxlbmQgICA9IHNldF9tbV9ibGVuZF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X21tX3ZhciAgICAgPSBnZXRfbW1fdmFyXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnNldF92YXJfZGVzaWduID0gc2V0X3Zhcl9kZXNpZ25fOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19TVk1NX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdm90dmFsLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2b3R2YWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgyYTY0Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2b3R2YWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2b3R2YWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgT3BlblR5cGUgdmFsaWRhdGlvbiBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1NWT1RWQUxfSF9fCi0jZGVmaW5lIF9fU1ZPVFZBTF9IX18KLQotI2luY2x1ZGUgRlRfT1BFTlRZUEVfVkFMSURBVEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVkFMSURBVEVfSAotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfT1BFTlRZUEVfVkFMSURBVEUgICJvcGVudHlwZS12YWxpZGF0ZSIKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpvdHZfdmFsaWRhdGVfZnVuYykoIEZUX0ZhY2Ugdm9sYXRpbGUgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICBvdF9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgICAgKmJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICAgICpnZGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgICAgICAgICAqZ3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAgICAgICAgKmdzdWIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgICAgICAgICpqc3RmICk7Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRSggT1R2YWxpZGF0ZSApCi0gIHsKLSAgICBvdHZfdmFsaWRhdGVfZnVuYyAgdmFsaWRhdGU7Ci0gIH07Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIF9fU1ZPVFZBTF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZwZnIuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZwZnIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlYjE2OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cGZyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdnBmci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSW50ZXJuYWwgUEZSIHNlcnZpY2UgZnVuY3Rpb25zIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19TVlBGUl9IX18KLSNkZWZpbmUgX19TVlBGUl9IX18KLQotI2luY2x1ZGUgRlRfUEZSX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NFUlZJQ0VfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9QRlJfTUVUUklDUyAgInBmci1tZXRyaWNzIgotCi0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1BGUl9HZXRNZXRyaWNzRnVuYykoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgKmFvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAqYW1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICpheF9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgKmF5X3NjYWxlICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1BGUl9HZXRLZXJuaW5nRnVuYykoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICByaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IgICphdmVjdG9yICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKkZUX1BGUl9HZXRBZHZhbmNlRnVuYykoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgKmFhZHZhbmNlICk7Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRSggUGZyTWV0cmljcyApCi0gIHsKLSAgICBGVF9QRlJfR2V0TWV0cmljc0Z1bmMgIGdldF9tZXRyaWNzOwotICAgIEZUX1BGUl9HZXRLZXJuaW5nRnVuYyAgZ2V0X2tlcm5pbmc7Ci0gICAgRlRfUEZSX0dldEFkdmFuY2VGdW5jICBnZXRfYWR2YW5jZTsKLQotICB9OwotCi0gLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19TVlBGUl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwb3N0bm0uaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwb3N0bm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg5Zjc5ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cG9zdG5tLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdnBvc3RubS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIFBvc3RTY3JpcHQgbmFtZSBzZXJ2aWNlcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19TVlBPU1ROTV9IX18KLSNkZWZpbmUgX19TVlBPU1ROTV9IX18KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgLyoKLSAgICogIEEgdHJpdmlhbCBzZXJ2aWNlIHVzZWQgdG8gcmV0cmlldmUgdGhlIFBvc3RTY3JpcHQgbmFtZSBvZiBhIGdpdmVuCi0gICAqICBmb250IHdoZW4gYXZhaWxhYmxlLiAgVGhlIGBnZXRfbmFtZScgZmllbGQgc2hvdWxkIG5ldmVyIGJlIE5VTEwuCi0gICAqCi0gICAqICBUaGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbiBjYW4gcmV0dXJuIE5VTEwgdG8gaW5kaWNhdGUgdGhhdCB0aGUKLSAgICogIFBvc3RTY3JpcHQgbmFtZSBpcyBub3QgYXZhaWxhYmxlLgotICAgKgotICAgKiAgVGhlIG5hbWUgaXMgb3duZWQgYnkgdGhlIGZhY2UgYW5kIHdpbGwgYmUgZGVzdHJveWVkIHdpdGggaXQuCi0gICAqLwotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9GT05UX05BTUUgICJwb3N0c2NyaXB0LWZvbnQtbmFtZSIKLQotCi0gIHR5cGVkZWYgY29uc3QgY2hhcioKLSAgKCpGVF9Qc05hbWVfR2V0RnVuYykoIEZUX0ZhY2UgIGZhY2UgKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBQc0ZvbnROYW1lICkKLSAgewotICAgIEZUX1BzTmFtZV9HZXRGdW5jICBnZXRfcHNfZm9udF9uYW1lOwotICB9OwotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9QU0ZPTlROQU1FUkVDKCBjbGFzc18sIGdldF9wc19mb250X25hbWVfICkgXAotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9Qc0ZvbnROYW1lUmVjICBjbGFzc18gPSAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF9wc19mb250X25hbWVfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1BTRk9OVE5BTUVSRUMoIGNsYXNzXywgZ2V0X3BzX2ZvbnRfbmFtZV8gKSBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgICAgICAgbGlicmFyeSwgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZV9Qc0ZvbnROYW1lUmVjKiAgY2xhenogKSAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9wc19mb250X25hbWUgPSBnZXRfcHNfZm9udF9uYW1lXzsgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIF9fU1ZQT1NUTk1fSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHJvcC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnByb3AuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmMDdjZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2cHJvcC5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3Zwcm9wLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwcm9wZXJ0eSBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDEyLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fU1ZQUk9QX0hfXwotI2RlZmluZSBfX1NWUFJPUF9IX18KLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfUFJPUEVSVElFUyAgInByb3BlcnRpZXMiCi0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfUHJvcGVydGllc19TZXRGdW5jKSggRlRfTW9kdWxlICAgIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgcHJvcGVydHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiAgdmFsdWUgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqRlRfUHJvcGVydGllc19HZXRGdW5jKSggRlRfTW9kdWxlICAgIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgcHJvcGVydHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgdmFsdWUgKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBQcm9wZXJ0aWVzICkKLSAgewotICAgIEZUX1Byb3BlcnRpZXNfU2V0RnVuYyAgc2V0X3Byb3BlcnR5OwotICAgIEZUX1Byb3BlcnRpZXNfR2V0RnVuYyAgZ2V0X3Byb3BlcnR5OwotICB9OwotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9QUk9QRVJUSUVTUkVDKCBjbGFzc18sICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3Byb3BlcnR5XywgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9wcm9wZXJ0eV8gKSAgXAotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9Qcm9wZXJ0aWVzUmVjICBjbGFzc18gPSAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc2V0X3Byb3BlcnR5XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF9wcm9wZXJ0eV8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9QUk9QRVJUSUVTUkVDKCBjbGFzc18sICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X3Byb3BlcnR5XywgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9wcm9wZXJ0eV8gKSAgICAgICAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9TZXJ2aWNlX1Byb3BlcnRpZXNSZWMqICBjbGF6eiApICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5zZXRfcHJvcGVydHkgPSBzZXRfcHJvcGVydHlfOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X3Byb3BlcnR5ID0gZ2V0X3Byb3BlcnR5XzsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIF9fU1ZQUk9QX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzY21hcC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzY21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmRhNmUxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2NtYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdnBzY21hcC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIFBvc3RTY3JpcHQgY2hhcm1hcCBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19TVlBTQ01BUF9IX18KLSNkZWZpbmUgX19TVlBTQ01BUF9IX18KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfQ01BUFMgICJwb3N0c2NyaXB0LWNtYXBzIgotCi0KLSAgLyoKLSAgICogIEFkb2JlIGdseXBoIG5hbWUgdG8gdW5pY29kZSB2YWx1ZS4KLSAgICovCi0gIHR5cGVkZWYgRlRfVUludDMyCi0gICgqUFNfVW5pY29kZV9WYWx1ZUZ1bmMpKCBjb25zdCBjaGFyKiAgZ2x5cGhfbmFtZSApOwotCi0gIC8qCi0gICAqICBNYWNpbnRvc2ggbmFtZSBpZCB0byBnbHlwaCBuYW1lLiAgTlVMTCBpZiBpbnZhbGlkIGluZGV4LgotICAgKi8KLSAgdHlwZWRlZiBjb25zdCBjaGFyKgotICAoKlBTX01hY2ludG9zaF9OYW1lRnVuYykoIEZUX1VJbnQgIG5hbWVfaW5kZXggKTsKLQotICAvKgotICAgKiAgQWRvYmUgc3RhbmRhcmQgc3RyaW5nIElEIHRvIGdseXBoIG5hbWUuICBOVUxMIGlmIGludmFsaWQgaW5kZXguCi0gICAqLwotICB0eXBlZGVmIGNvbnN0IGNoYXIqCi0gICgqUFNfQWRvYmVfU3RkX1N0cmluZ3NGdW5jKSggRlRfVUludCAgc3RyaW5nX2luZGV4ICk7Ci0KLQotICAvKgotICAgKiAgU2ltcGxlIHVuaWNvZGUgLT4gZ2x5cGggaW5kZXggY2hhcm1hcCBidWlsdCBmcm9tIGZvbnQgZ2x5cGggbmFtZXMKLSAgICogIHRhYmxlLgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTX1VuaU1hcF8KLSAgewotICAgIEZUX1VJbnQzMiAgdW5pY29kZTsgICAgICAvKiBiaXQgMzEgc2V0OiBpcyBnbHlwaCB2YXJpYW50ICovCi0gICAgRlRfVUludCAgICBnbHlwaF9pbmRleDsKLQotICB9IFBTX1VuaU1hcDsKLQotCi0gIHR5cGVkZWYgc3RydWN0IFBTX1VuaWNvZGVzUmVjXyogIFBTX1VuaWNvZGVzOwotCi0gIHR5cGVkZWYgc3RydWN0ICBQU19Vbmljb2Rlc1JlY18KLSAgewotICAgIEZUX0NNYXBSZWMgIGNtYXA7Ci0gICAgRlRfVUludCAgICAgbnVtX21hcHM7Ci0gICAgUFNfVW5pTWFwKiAgbWFwczsKLQotICB9IFBTX1VuaWNvZGVzUmVjOwotCi0KLSAgLyoKLSAgICogIEEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhIGdseXBoIG5hbWUgZm9yIGEgZ2l2ZW4gaW5kZXguICBSZXR1cm5zCi0gICAqICBOVUxMIGlmIGludmFsaWQgaW5kZXguCi0gICAqLwotICB0eXBlZGVmIGNvbnN0IGNoYXIqCi0gICgqUFNfR2V0R2x5cGhOYW1lRnVuYykoIEZUX1BvaW50ZXIgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHN0cmluZ19pbmRleCApOwotCi0gIC8qCi0gICAqICBBIGZ1bmN0aW9uIHVzZWQgdG8gcmVsZWFzZSB0aGUgZ2x5cGggbmFtZSByZXR1cm5lZCBieQotICAgKiAgUFNfR2V0R2x5cGhOYW1lRnVuYywgd2hlbiBuZWVkZWQKLSAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKlBTX0ZyZWVHbHlwaE5hbWVGdW5jKSggRlRfUG9pbnRlciAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBuYW1lICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlBTX1VuaWNvZGVzX0luaXRGdW5jKSggRlRfTWVtb3J5ICAgICAgICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTX1VuaWNvZGVzICAgICAgICAgICB1bmljb2RlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgICBudW1fZ2x5cGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNfR2V0R2x5cGhOYW1lRnVuYyAgIGdldF9nbHlwaF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNfRnJlZUdseXBoTmFtZUZ1bmMgIGZyZWVfZ2x5cGhfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICAgICAgICAgICBnbHlwaF9kYXRhICk7Ci0KLSAgdHlwZWRlZiBGVF9VSW50Ci0gICgqUFNfVW5pY29kZXNfQ2hhckluZGV4RnVuYykoIFBTX1VuaWNvZGVzICB1bmljb2RlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgIHVuaWNvZGUgKTsKLQotICB0eXBlZGVmIEZUX1VJbnQzMgotICAoKlBTX1VuaWNvZGVzX0NoYXJOZXh0RnVuYykoIFBTX1VuaWNvZGVzICB1bmljb2RlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICAqdW5pY29kZSApOwotCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0UoIFBzQ01hcHMgKQotICB7Ci0gICAgUFNfVW5pY29kZV9WYWx1ZUZ1bmMgICAgICAgdW5pY29kZV92YWx1ZTsKLQotICAgIFBTX1VuaWNvZGVzX0luaXRGdW5jICAgICAgIHVuaWNvZGVzX2luaXQ7Ci0gICAgUFNfVW5pY29kZXNfQ2hhckluZGV4RnVuYyAgdW5pY29kZXNfY2hhcl9pbmRleDsKLSAgICBQU19Vbmljb2Rlc19DaGFyTmV4dEZ1bmMgICB1bmljb2Rlc19jaGFyX25leHQ7Ci0KLSAgICBQU19NYWNpbnRvc2hfTmFtZUZ1bmMgICAgICBtYWNpbnRvc2hfbmFtZTsKLSAgICBQU19BZG9iZV9TdGRfU3RyaW5nc0Z1bmMgICBhZG9iZV9zdGRfc3RyaW5nczsKLSAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCogICAgICBhZG9iZV9zdGRfZW5jb2Rpbmc7Ci0gICAgY29uc3QgdW5zaWduZWQgc2hvcnQqICAgICAgYWRvYmVfZXhwZXJ0X2VuY29kaW5nOwotICB9OwotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9QU0NNQVBTUkVDKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZV92YWx1ZV8sICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVzX2luaXRfLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2Rlc19jaGFyX2luZGV4XywgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZXNfY2hhcl9uZXh0XywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY2ludG9zaF9uYW1lXywgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG9iZV9zdGRfc3RyaW5nc18sICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRvYmVfc3RkX2VuY29kaW5nXywgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkb2JlX2V4cGVydF9lbmNvZGluZ18gKSAgICAgICAgICAgICAgXAotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9Qc0NNYXBzUmVjICBjbGFzc18gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdW5pY29kZV92YWx1ZV8sIHVuaWNvZGVzX2luaXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVuaWNvZGVzX2NoYXJfaW5kZXhfLCB1bmljb2Rlc19jaGFyX25leHRfLCBtYWNpbnRvc2hfbmFtZV8sICAgICAgICAgICAgIFwKLSAgICBhZG9iZV9zdGRfc3RyaW5nc18sIGFkb2JlX3N0ZF9lbmNvZGluZ18sIGFkb2JlX2V4cGVydF9lbmNvZGluZ18gICAgICAgICBcCi0gIH07Ci0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfUFNDTUFQU1JFQyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVfdmFsdWVfLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2Rlc19pbml0XywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZXNfY2hhcl9pbmRleF8sICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWNvZGVzX2NoYXJfbmV4dF8sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNpbnRvc2hfbmFtZV8sICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRvYmVfc3RkX3N0cmluZ3NfLCAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkb2JlX3N0ZF9lbmNvZGluZ18sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZG9iZV9leHBlcnRfZW5jb2RpbmdfICkgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfTGlicmFyeSAgICAgICAgICAgICAgbGlicmFyeSwgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VfUHNDTWFwc1JlYyogIGNsYXp6ICkgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+dW5pY29kZV92YWx1ZSAgICAgICAgID0gdW5pY29kZV92YWx1ZV87ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnVuaWNvZGVzX2luaXQgICAgICAgICA9IHVuaWNvZGVzX2luaXRfOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT51bmljb2Rlc19jaGFyX2luZGV4ICAgPSB1bmljb2Rlc19jaGFyX2luZGV4XzsgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+dW5pY29kZXNfY2hhcl9uZXh0ICAgID0gdW5pY29kZXNfY2hhcl9uZXh0XzsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPm1hY2ludG9zaF9uYW1lICAgICAgICA9IG1hY2ludG9zaF9uYW1lXzsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5hZG9iZV9zdGRfc3RyaW5ncyAgICAgPSBhZG9iZV9zdGRfc3RyaW5nc187ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+YWRvYmVfc3RkX2VuY29kaW5nICAgID0gYWRvYmVfc3RkX2VuY29kaW5nXzsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmFkb2JlX2V4cGVydF9lbmNvZGluZyA9IGFkb2JlX2V4cGVydF9lbmNvZGluZ187ICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1NWUFNDTUFQX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzaW5mby5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnBzaW5mby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTJhMjY2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Zwc2luZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdnBzaW5mby5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIFBvc3RTY3JpcHQgaW5mbyBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19TVlBTSU5GT19IX18KLSNkZWZpbmUgX19TVlBTSU5GT19IX18KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UWVBFMV9UWVBFU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfSU5GTyAgInBvc3RzY3JpcHQtaW5mbyIKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpQU19HZXRGb250SW5mb0Z1bmMpKCBGVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUFNfRm9udEluZm9SZWMqICBhZm9udF9pbmZvICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlBTX0dldEZvbnRFeHRyYUZ1bmMpKCBGVF9GYWNlICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQU19Gb250RXh0cmFSZWMqICBhZm9udF9leHRyYSApOwotCi0gIHR5cGVkZWYgRlRfSW50Ci0gICgqUFNfSGFzR2x5cGhOYW1lc0Z1bmMpKCBGVF9GYWNlICBmYWNlICk7Ci0KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlBTX0dldEZvbnRQcml2YXRlRnVuYykoIEZUX0ZhY2UgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBTX1ByaXZhdGVSZWMqICBhZm9udF9wcml2YXRlICk7Ci0KLSAgdHlwZWRlZiBGVF9Mb25nCi0gICgqUFNfR2V0Rm9udFZhbHVlRnVuYykoIEZUX0ZhY2UgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUFNfRGljdF9LZXlzICBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgIHZhbHVlX2xlbiApOwotCi0KLSAgRlRfREVGSU5FX1NFUlZJQ0UoIFBzSW5mbyApCi0gIHsKLSAgICBQU19HZXRGb250SW5mb0Z1bmMgICAgIHBzX2dldF9mb250X2luZm87Ci0gICAgUFNfR2V0Rm9udEV4dHJhRnVuYyAgICBwc19nZXRfZm9udF9leHRyYTsKLSAgICBQU19IYXNHbHlwaE5hbWVzRnVuYyAgIHBzX2hhc19nbHlwaF9uYW1lczsKLSAgICBQU19HZXRGb250UHJpdmF0ZUZ1bmMgIHBzX2dldF9mb250X3ByaXZhdGU7Ci0gICAgUFNfR2V0Rm9udFZhbHVlRnVuYyAgICBwc19nZXRfZm9udF92YWx1ZTsKLSAgfTsKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfUFNJTkZPUkVDKCBjbGFzc18sICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9mb250X2luZm9fLCAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNfZ2V0X2ZvbnRfZXh0cmFfLCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfZ2x5cGhfbmFtZXNfLCAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9mb250X3ByaXZhdGVfLCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2ZvbnRfdmFsdWVfICkgICAgICAgICAgIFwKLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfUHNJbmZvUmVjICBjbGFzc18gPSAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X2ZvbnRfaW5mb18sIHBzX2dldF9mb250X2V4dHJhXywgaGFzX2dseXBoX25hbWVzXywgICAgICAgIFwKLSAgICBnZXRfZm9udF9wcml2YXRlXywgZ2V0X2ZvbnRfdmFsdWVfICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1BTSU5GT1JFQyggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZm9udF9pbmZvXywgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzX2dldF9mb250X2V4dHJhXywgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2dseXBoX25hbWVzXywgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfZm9udF9wcml2YXRlXywgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9mb250X3ZhbHVlXyApICAgICAgICAgICBcCi0gIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgICAgIGxpYnJhcnksICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VfUHNJbmZvUmVjKiAgY2xhenogKSAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnBzX2dldF9mb250X2luZm8gICAgPSBnZXRfZm9udF9pbmZvXzsgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cHNfZ2V0X2ZvbnRfZXh0cmEgICA9IHBzX2dldF9mb250X2V4dHJhXzsgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5wc19oYXNfZ2x5cGhfbmFtZXMgID0gaGFzX2dseXBoX25hbWVzXzsgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPnBzX2dldF9mb250X3ByaXZhdGUgPSBnZXRfZm9udF9wcml2YXRlXzsgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+cHNfZ2V0X2ZvbnRfdmFsdWUgICA9IGdldF9mb250X3ZhbHVlXzsgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1NWUFNJTkZPX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnNmbnQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3ZzZm50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MmFlMWMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnNmbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdnNmbnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIFNGTlQgdGFibGUgbG9hZGluZyBzZXJ2aWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19TVlNGTlRfSF9fCi0jZGVmaW5lIF9fU1ZTRk5UX0hfXwotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBQkxFU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKgotICAgKiAgU0ZOVCB0YWJsZSBsb2FkaW5nIHNlcnZpY2UuCi0gICAqLwotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfU0ZOVF9UQUJMRSAgInNmbnQtdGFibGUiCi0KLQotICAvKgotICAgKiBVc2VkIHRvIGltcGxlbWVudCBGVF9Mb2FkX1NmbnRfVGFibGUoKS4KLSAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9TRk5UX1RhYmxlTG9hZEZ1bmMpKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICBsZW5ndGggKTsKLQotICAvKgotICAgKiBVc2VkIHRvIGltcGxlbWVudCBGVF9HZXRfU2ZudF9UYWJsZSgpLgotICAgKi8KLSAgdHlwZWRlZiB2b2lkKgotICAoKkZUX1NGTlRfVGFibGVHZXRGdW5jKSggRlRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZm50X1RhZyAgdGFnICk7Ci0KLQotICAvKgotICAgKiBVc2VkIHRvIGltcGxlbWVudCBGVF9TZm50X1RhYmxlX0luZm8oKS4KLSAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9TRk5UX1RhYmxlSW5mb0Z1bmMpKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICp0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICpvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICpsZW5ndGggKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBTRk5UX1RhYmxlICkKLSAgewotICAgIEZUX1NGTlRfVGFibGVMb2FkRnVuYyAgbG9hZF90YWJsZTsKLSAgICBGVF9TRk5UX1RhYmxlR2V0RnVuYyAgIGdldF90YWJsZTsKLSAgICBGVF9TRk5UX1RhYmxlSW5mb0Z1bmMgIHRhYmxlX2luZm87Ci0gIH07Ci0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1NGTlRfVEFCTEVSRUMoIGNsYXNzXywgbG9hZF8sIGdldF8sIGluZm9fICkgIFwKLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfU0ZOVF9UYWJsZVJlYyAgY2xhc3NfID0gICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbG9hZF8sIGdldF8sIGluZm9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfU0VSVklDRV9TRk5UX1RBQkxFUkVDKCBjbGFzc18sIGxvYWRfLCBnZXRfLCBpbmZvXyApIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZUX0luaXRfQ2xhc3NfICMjIGNsYXNzXyggRlRfU2VydmljZV9TRk5UX1RhYmxlUmVjKiAgY2xhenogKSAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF90YWJsZSA9IGxvYWRfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmdldF90YWJsZSAgPSBnZXRfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT50YWJsZV9pbmZvID0gaW5mb187ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19TVlNGTlRfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRjbWFwLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRjbWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkOTViOWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0Y21hcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2dHRjbWFwLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgVHJ1ZVR5cGUvc2ZudCBjbWFwIGV4dHJhIGluZm9ybWF0aW9uIHNlcnZpY2UuICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMy0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTWFzYXRha2UgWUFNQVRPLCBSZWRoYXQgSy5LLiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBEZXZlbG9wbWVudCBvZiB0aGlzIHNlcnZpY2UgaXMgc3VwcG9ydCBvZgotICAgSW5mb3JtYXRpb24tdGVjaG5vbG9neSBQcm9tb3Rpb24gQWdlbmN5LCBKYXBhbi4gKi8KLQotI2lmbmRlZiBfX1NWVFRDTUFQX0hfXwotI2RlZmluZSBfX1NWVFRDTUFQX0hfXwotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBQkxFU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX1RUX0NNQVAgICJ0dC1jbWFwcyIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0NNYXBJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gc3RvcmUgVHJ1ZVR5cGUvc2ZudCBzcGVjaWZpYyBjbWFwIGluZm9ybWF0aW9uICAqLwotICAvKiAgICB3aGljaCBpcyBub3QgY292ZXJlZCBieSB0aGUgZ2VuZXJpYyBARlRfQ2hhck1hcCBzdHJ1Y3R1cmUuICBUaGlzICAgKi8KLSAgLyogICAgc3RydWN0dXJlIGNhbiBiZSBhY2Nlc3NlZCB3aXRoIHRoZSBARlRfR2V0X1RUX0NNYXBfSW5mbyBmdW5jdGlvbi4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGFuZ3VhZ2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgVGhlIGxhbmd1YWdlIElEIHVzZWQgaW4gTWFjIGZvbnRzLiAgRGVmaW5pdGlvbnMgb2YgdmFsdWVzIGFyZSBpbiAqLwotICAvKiAgICAgIGB0dG5hbWVpZC5oJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvcm1hdCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBjbWFwIGZvcm1hdC4gIE9wZW5UeXBlIDEuNiBkZWZpbmVzIHRoZSBmb3JtYXRzIDAgKGJ5dGUgICAgICAgKi8KLSAgLyogICAgICBlbmNvZGluZyB0YWJsZSksIDJ+KGhpZ2gtYnl0ZSBtYXBwaW5nIHRocm91Z2ggdGFibGUpLCA0fihzZWdtZW50ICovCi0gIC8qICAgICAgbWFwcGluZyB0byBkZWx0YSB2YWx1ZXMpLCA2fih0cmltbWVkIHRhYmxlIG1hcHBpbmcpLCA4fihtaXhlZCAgICAqLwotICAvKiAgICAgIDE2LWJpdCBhbmQgMzItYml0IGNvdmVyYWdlKSwgMTB+KHRyaW1tZWQgYXJyYXkpLCAxMn4oc2VnbWVudGVkICAgKi8KLSAgLyogICAgICBjb3ZlcmFnZSksIDEzfihsYXN0IHJlc29ydCBmb250KSwgYW5kIDE0IChVbmljb2RlIFZhcmlhdGlvbiAgICAgICovCi0gIC8qICAgICAgU2VxdWVuY2VzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0NNYXBJbmZvXwotICB7Ci0gICAgRlRfVUxvbmcgIGxhbmd1YWdlOwotICAgIEZUX0xvbmcgICBmb3JtYXQ7Ci0KLSAgfSBUVF9DTWFwSW5mbzsKLQotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9DTWFwX0luZm9fR2V0RnVuYykoIEZUX0NoYXJNYXAgICAgY2hhcm1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0NNYXBJbmZvICAqY21hcF9pbmZvICk7Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRSggVFRDTWFwcyApCi0gIHsKLSAgICBUVF9DTWFwX0luZm9fR2V0RnVuYyAgZ2V0X2NtYXBfaW5mbzsKLSAgfTsKLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1RUQ01BUFNSRUMoIGNsYXNzXywgZ2V0X2NtYXBfaW5mb18gKSAgXAotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9UVENNYXBzUmVjICBjbGFzc18gPSAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X2NtYXBfaW5mb18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1RUQ01BUFNSRUMoIGNsYXNzXywgZ2V0X2NtYXBfaW5mb18gKSAgXAotICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRlRfSW5pdF9DbGFzc18gIyMgY2xhc3NfKCBGVF9MaWJyYXJ5ICAgICAgICAgICAgICBsaWJyYXJ5LCAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZV9UVENNYXBzUmVjKiAgY2xhenogKSAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfY21hcF9pbmZvID0gZ2V0X2NtYXBfaW5mb187ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fU1ZUVENNQVBfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2dHRlbmcuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGVuZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzJlZThjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGVuZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc3Z0dGVuZy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBUcnVlVHlwZSBlbmdpbmUgcXVlcnkgc2VydmljZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fU1ZUVEVOR19IX18KLSNkZWZpbmUgX19TVlRURU5HX0hfXwotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLSNpbmNsdWRlIEZUX01PRFVMRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKgotICAgKiAgU0ZOVCB0YWJsZSBsb2FkaW5nIHNlcnZpY2UuCi0gICAqLwotCi0jZGVmaW5lIEZUX1NFUlZJQ0VfSURfVFJVRVRZUEVfRU5HSU5FICAidHJ1ZXR5cGUtZW5naW5lIgotCi0gIC8qCi0gICAqIFVzZWQgdG8gaW1wbGVtZW50IEZUX0dldF9UcnVlVHlwZV9FbmdpbmVfVHlwZQotICAgKi8KLQotICBGVF9ERUZJTkVfU0VSVklDRSggVHJ1ZVR5cGVFbmdpbmUgKQotICB7Ci0gICAgRlRfVHJ1ZVR5cGVFbmdpbmVUeXBlICBlbmdpbmVfdHlwZTsKLSAgfTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19TVlRURU5HX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0Z2x5Zi5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9zZXJ2aWNlcy9zdnR0Z2x5Zi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWNiNzZhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z0dGdseWYuaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHN2dHRnbHlmLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgVHJ1ZVR5cGUgZ2x5cGggc2VydmljZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNy0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19TVlRUR0xZRl9IX18KLSNkZWZpbmUgX19TVlRUR0xZRl9IX18KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUJMRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgRlRfU0VSVklDRV9JRF9UVF9HTFlGICAidHQtZ2x5ZiIKLQotCi0gIHR5cGVkZWYgRlRfVUxvbmcKLSAgKCpUVF9HbHlmX0dldExvY2F0aW9uRnVuYykoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICpwc2l6ZSApOwotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBUVEdseWYgKQotICB7Ci0gICAgVFRfR2x5Zl9HZXRMb2NhdGlvbkZ1bmMgIGdldF9sb2NhdGlvbjsKLSAgfTsKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NFUlZJQ0VfVFRHTFlGUkVDKCBjbGFzc18sIGdldF9sb2NhdGlvbl8gKSAgXAotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZV9UVEdseWZSZWMgIGNsYXNzXyA9ICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfbG9jYXRpb25fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0RFRklORV9TRVJWSUNFX1RUR0xZRlJFQyggY2xhc3NfLCBnZXRfbG9jYXRpb25fICkgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX1NlcnZpY2VfVFRHbHlmUmVjKiAgY2xhenogKSAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X2xvY2F0aW9uID0gZ2V0X2xvY2F0aW9uXzsgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19TVlRUR0xZRl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z3aW5mbnQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2VydmljZXMvc3Z3aW5mbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAzNjkyOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NlcnZpY2VzL3N2d2luZm50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzdndpbmZudC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIFdpbmRvd3MgRk5UL0ZPTlQgc2VydmljZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19TVldJTkZOVF9IX18KLSNkZWZpbmUgX19TVldJTkZOVF9IX18KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9XSU5GT05UU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2RlZmluZSBGVF9TRVJWSUNFX0lEX1dJTkZOVCAgIndpbmZvbnRzIgotCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpGVF9XaW5GbnRfR2V0SGVhZGVyRnVuYykoIEZUX0ZhY2UgICAgICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfV2luRk5UX0hlYWRlclJlYyAgKmFoZWFkZXIgKTsKLQotCi0gIEZUX0RFRklORV9TRVJWSUNFKCBXaW5GbnQgKQotICB7Ci0gICAgRlRfV2luRm50X0dldEhlYWRlckZ1bmMgIGdldF9oZWFkZXI7Ci0gIH07Ci0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIF9fU1ZXSU5GTlRfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3NmbnQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGY1M2JmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvc2ZudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHNmbnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBIaWdoLWxldmVsIGBzZm50JyBkcml2ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1NGTlRfSF9fCi0jZGVmaW5lIF9fU0ZOVF9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RSSVZFUl9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Jbml0X0ZhY2VfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaXJzdCBwYXJ0IG9mIHRoZSBTRk5UIGZhY2Ugb2JqZWN0IGluaXRpYWxpemF0aW9uLiAgVGhpcyBmaW5kcyAgICAgKi8KLSAgLyogICAgdGhlIGZhY2UgaW4gYSBTRk5UIGZpbGUgb3IgY29sbGVjdGlvbiwgYW5kIGxvYWQgaXRzIGZvcm1hdCB0YWcgaW4gICovCi0gIC8qICAgIGZhY2UtPmZvcm1hdF90YWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgVHJ1ZVR5cGUgZm9udCwgaWYgd2UgYXJlIG9wZW5pbmcgYSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLCBpbiBiaXRzIDAtMTUuICBUaGUgbnVtYmVyZWQgaW5zdGFuY2UgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgaW5kZXh+K34xIG9mIGEgR1ggKHN1Yilmb250LCBpZiBhcHBsaWNhYmxlLCBpbiBiaXRzICAqLwotICAvKiAgICAgICAgICAgICAgICAgIDE2LTMwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9wYXJhbXMgOjogVGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFyYW1zICAgICA6OiBPcHRpb25hbCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHN0cmVhbSBjdXJzb3IgbXVzdCBiZSBhdCB0aGUgZm9udCBmaWxlJ3Mgb3JpZ2luLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIHJlY29nbml6ZXMgZm9udHMgZW1iZWRkZWQgaW4gYSBgVHJ1ZVR5cGUgICAgICAgICAgICAgKi8KLSAgLyogICAgY29sbGVjdGlvbicuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbmNlIHRoZSBmb3JtYXQgdGFnIGhhcyBiZWVuIHZhbGlkYXRlZCBieSB0aGUgZm9udCBkcml2ZXIsIGl0ICAgICAgKi8KLSAgLyogICAgc2hvdWxkIHRoZW4gY2FsbCB0aGUgVFRfTG9hZF9GYWNlX0Z1bmMoKSBjYWxsYmFjayB0byByZWFkIHRoZSByZXN0ICovCi0gIC8qICAgIG9mIHRoZSBTRk5UIHRhYmxlcyBpbiB0aGUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0luaXRfRmFjZV9GdW5jKSggRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkX0ZhY2VfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWNvbmQgcGFydCBvZiB0aGUgU0ZOVCBmYWNlIG9iamVjdCBpbml0aWFsaXphdGlvbi4gIFRoaXMgbG9hZHMgICAgKi8KLSAgLyogICAgdGhlIGNvbW1vbiBTRk5UIHRhYmxlcyAoaGVhZCwgT1MvMiwgbWF4cCwgbWV0cmljcywgZXRjLikgaW4gdGhlICAgICovCi0gIC8qICAgIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgVHJ1ZVR5cGUgZm9udCwgaWYgd2UgYXJlIG9wZW5pbmcgYSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLCBpbiBiaXRzIDAtMTUuICBUaGUgbnVtYmVyZWQgaW5zdGFuY2UgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgaW5kZXh+K34xIG9mIGEgR1ggKHN1Yilmb250LCBpZiBhcHBsaWNhYmxlLCBpbiBiaXRzICAqLwotICAvKiAgICAgICAgICAgICAgICAgIDE2LTMwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9wYXJhbXMgOjogVGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFyYW1zICAgICA6OiBPcHRpb25hbCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBhZnRlciBUVF9Jbml0X0ZhY2VfRnVuYygpLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfTG9hZF9GYWNlX0Z1bmMpKCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBUVF9GYWNlICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9QYXJhbWV0ZXIqICBwYXJhbXMgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0RvbmVfRmFjZV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgY2FsbGJhY2sgdXNlZCB0byBkZWxldGUgdGhlIGNvbW1vbiBTRk5UIGRhdGEgZnJvbSBhIGZhY2UuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBOT1QgZGVzdHJveSB0aGUgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqVFRfRG9uZV9GYWNlX0Z1bmMpKCBUVF9GYWNlICBmYWNlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkX0FueV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkIGFueSBmb250IHRhYmxlIGludG8gY2xpZW50IG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogVGhlIGZhY2Ugb2JqZWN0IHRvIGxvb2sgZm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRhZyAgICA6OiBUaGUgdGFnIG9mIHRhYmxlIHRvIGxvYWQuICBVc2UgdGhlIHZhbHVlIDAgaWYgeW91IHdhbnQgICAqLwotICAvKiAgICAgICAgICAgICAgdG8gYWNjZXNzIHRoZSB3aG9sZSBmb250IGZpbGUsIGVsc2Ugc2V0IHRoaXMgcGFyYW1ldGVyICAgKi8KLSAgLyogICAgICAgICAgICAgIHRvIGEgdmFsaWQgVHJ1ZVR5cGUgdGFibGUgdGFnIHRoYXQgeW91IGNhbiBmb3JnZSB3aXRoICAgICovCi0gIC8qICAgICAgICAgICAgICB0aGUgTUFLRV9UVF9UQUcgbWFjcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2Zmc2V0IDo6IFRoZSBzdGFydGluZyBvZmZzZXQgaW4gdGhlIHRhYmxlIChvciB0aGUgZmlsZSBpZiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICB0YWcgPT0gMCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGVuZ3RoIDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBkZWNpc2lvbiB2YXJpYWJsZTogICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBJZiBsZW5ndGggPT0gTlVMTDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBMb2FkcyB0aGUgd2hvbGUgdGFibGUuICBSZXR1cm5zIGFuIGVycm9yIGlmICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgYG9mZnNldCcgPT0gMCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgSWYgKmxlbmd0aCA9PSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgRXhpdHMgaW1tZWRpYXRlbHk7IHJldHVybmluZyB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiAqLwotICAvKiAgICAgICAgICAgICAgICAgIHRhYmxlIG9yIG9mIHRoZSBmb250IGZpbGUsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YgKi8KLSAgLyogICAgICAgICAgICAgICAgICBgdGFnJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBJZiAqbGVuZ3RoICE9IDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBMb2FkcyB0aGUgbmV4dCBgbGVuZ3RoJyBieXRlcyBvZiB0YWJsZSBvciBmb250LCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgc3RhcnRpbmcgYXQgb2Zmc2V0IGBvZmZzZXQnIChpbiB0YWJsZSBvciBmb250IHRvbykuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ1ZmZlciA6OiBUaGUgYWRkcmVzcyBvZiB0YXJnZXQgYnVmZmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0xvYWRfQW55X0Z1bmMpKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgdGFnLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSAgICpidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgbGVuZ3RoICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9GaW5kX1NCaXRfSW1hZ2VfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaGVjayB3aGV0aGVyIGFuIGVtYmVkZGVkIGJpdG1hcCAoYW4gYHNiaXQnKSBleGlzdHMgZm9yIGEgZ2l2ZW4gICAgKi8KLSAgLyogICAgZ2x5cGgsIGF0IGEgZ2l2ZW4gc3RyaWtlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgICA6OiBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9pbmRleCAgIDo6IFRoZSBnbHlwaCBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmlrZV9pbmRleCAgOjogVGhlIGN1cnJlbnQgc3RyaWtlIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFyYW5nZSAgICAgICAgOjogVGhlIFNCaXQgcmFuZ2UgY29udGFpbmluZyB0aGUgZ2x5cGggaW5kZXguICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYXN0cmlrZSAgICAgICA6OiBUaGUgU0JpdCBzdHJpa2UgY29udGFpbmluZyB0aGUgZ2x5cGggaW5kZXguICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZ2x5cGhfb2Zmc2V0IDo6IFRoZSBvZmZzZXQgb2YgdGhlIGdseXBoIGRhdGEgaW4gYEVCRFQnIHRhYmxlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgUmV0dXJucyAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU0ZOVF9FcnJfSW52YWxpZF9Bcmd1bWVudCBpZiBubyBzYml0IGV4aXN0cyBmb3IgdGhlIHJlcXVlc3RlZCAgICAgICovCi0gIC8qICAgIGdseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0ZpbmRfU0JpdF9JbWFnZV9GdW5jKSggVFRfRmFjZSAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAgc3RyaWtlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9SYW5nZSAgICphcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X1N0cmlrZSAgKmFzdHJpa2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgKmFnbHlwaF9vZmZzZXQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0xvYWRfU0JpdF9NZXRyaWNzX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdldCB0aGUgYmlnIG1ldHJpY3MgZm9yIGEgZ2l2ZW4gZW1iZWRkZWQgYml0bWFwLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmFuZ2UgICAgICAgOjogVGhlIFNCaXQgcmFuZ2UgY29udGFpbmluZyB0aGUgZ2x5cGguICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmlnX21ldHJpY3MgOjogQSBiaWcgU0JpdCBtZXRyaWNzIHN0cnVjdHVyZSBmb3IgdGhlIGdseXBoLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHN0cmVhbSBjdXJzb3IgbXVzdCBiZSBwb3NpdGlvbmVkIGF0IHRoZSBnbHlwaCdzIG9mZnNldCB3aXRoaW4gICovCi0gIC8qICAgIHRoZSBgRUJEVCcgdGFibGUgYmVmb3JlIHRoZSBjYWxsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSWYgdGhlIGltYWdlIGZvcm1hdCB1c2VzIHZhcmlhYmxlIG1ldHJpY3MsIHRoZSBzdHJlYW0gY3Vyc29yIGlzICAgICovCi0gIC8qICAgIHBvc2l0aW9uZWQganVzdCBhZnRlciB0aGUgbWV0cmljcyBoZWFkZXIgaW4gdGhlIGBFQkRUJyB0YWJsZSBvbiAgICAqLwotICAvKiAgICBmdW5jdGlvbiBleGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9Mb2FkX1NCaXRfTWV0cmljc19GdW5jKSggRlRfU3RyZWFtICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfUmFuZ2UgICAgcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfTWV0cmljcyAgbWV0cmljcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZF9TQml0X0ltYWdlX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCBhIGdpdmVuIGdseXBoIHNiaXQgaW1hZ2UgZnJvbSB0aGUgZm9udCByZXNvdXJjZS4gIFRoaXMgYWxzbyAgICovCi0gIC8qICAgIHJldHVybnMgaXRzIG1ldHJpY3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmlrZV9pbmRleCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBzdHJpa2UgaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2luZGV4IDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBjdXJyZW50IGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBjdXJyZW50IGxvYWQgZmxhZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbWFwIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBUaGUgdGFyZ2V0IHBpeG1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhbWV0cmljcyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICBBIGJpZyBzYml0IG1ldHJpY3Mgc3RydWN0dXJlIGZvciB0aGUgZ2x5cGggaW1hZ2UuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gIFJldHVybnMgYW4gZXJyb3IgaWYgbm8gICAgICovCi0gIC8qICAgIGdseXBoIHNiaXQgZXhpc3RzIGZvciB0aGUgaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBgbWFwLmJ1ZmZlcicgZmllbGQgaXMgYWx3YXlzIGZyZWVkIGJlZm9yZSB0aGUgZ2x5cGggaXMgbG9hZGVkLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0xvYWRfU0JpdF9JbWFnZV9GdW5jKSggVFRfRmFjZSAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAgICAgIHN0cmlrZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgICAgbG9hZF9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCAgICAgICAgICAgKmFtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9TQml0X01ldHJpY3NSZWMgICphbWV0cmljcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU2V0X1NCaXRfU3RyaWtlX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2VsZWN0IGFuIHNiaXQgc3RyaWtlIGZvciBhIGdpdmVuIHNpemUgcmVxdWVzdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgICA6OiBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZXEgICAgICAgICAgIDo6IFRoZSBzaXplIHJlcXVlc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhc3RyaWtlX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgc2JpdCBzdHJpa2UuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgUmV0dXJucyBhbiBlcnJvciBpZiBubyAgICAgKi8KLSAgLyogICAgc2JpdCBzdHJpa2UgZXhpc3RzIGZvciB0aGUgc2VsZWN0ZWQgcHBlbSB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfU2V0X1NCaXRfU3RyaWtlX0Z1bmMpKCBUVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgICAgYXN0cmlrZV9pbmRleCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZF9TdHJpa2VfTWV0cmljc19GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCB0aGUgbWV0cmljcyBvZiBhIGdpdmVuIHN0cmlrZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgICA6OiBUaGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJpa2VfaW5kZXggIDo6IFRoZSBzdHJpa2UgaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZXRyaWNzICAgICAgIDo6IHRoZSBtZXRyaWNzIG9mIHRoZSBzdHJpa2UuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgUmV0dXJucyBhbiBlcnJvciBpZiBubyAgICAgKi8KLSAgLyogICAgc3VjaCBzYml0IHN0cmlrZSBleGlzdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfTG9hZF9TdHJpa2VfTWV0cmljc19GdW5jKSggVFRfRmFjZSAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgICBzdHJpa2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9NZXRyaWNzKiAgbWV0cmljcyApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfR2V0X1BTX05hbWVfRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR2V0IHRoZSBQb3N0U2NyaXB0IGdseXBoIG5hbWUgb2YgYSBnbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaWR4ICA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU25hbWUgOjogVGhlIGFkZHJlc3Mgb2YgYSBzdHJpbmcgcG9pbnRlci4gIFdpbGwgYmUgTlVMTCBpbiBjYXNlICAgKi8KLSAgLyogICAgICAgICAgICAgIG9mIGVycm9yLCBvdGhlcndpc2UgaXQgaXMgYSBwb2ludGVyIHRvIHRoZSBnbHlwaCBuYW1lLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgWW91IG11c3Qgbm90IG1vZGlmeSB0aGUgcmV0dXJuZWQgc3RyaW5nISAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9HZXRfUFNfTmFtZV9GdW5jKSggVFRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmluZyoqICBQU25hbWUgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0xvYWRfTWV0cmljc19GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWQgYSBtZXRyaWNzIHRhYmxlLCB3aGljaCBpcyBhIHRhYmxlIHdpdGggYSBob3Jpem9udGFsIGFuZCBhICAgICAqLwotICAvKiAgICB2ZXJ0aWNhbCB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydGljYWwgOjogQSBib29sZWFuIGZsYWcuICBJZiBzZXQsIGxvYWQgdGhlIHZlcnRpY2FsIG9uZS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfTG9hZF9NZXRyaWNzX0Z1bmMpKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgdmVydGljYWwgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0dldF9NZXRyaWNzX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWQgdGhlIGhvcml6b250YWwgb3IgdmVydGljYWwgaGVhZGVyIGluIGEgZmFjZSBvYmplY3QuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydGljYWwgOjogQSBib29sZWFuIGZsYWcuICBJZiBzZXQsIGxvYWQgdmVydGljYWwgbWV0cmljcy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnaW5kZXggICA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhYmVhcmluZyA6OiBUaGUgaG9yaXpvbnRhbCAob3IgdmVydGljYWwpIGJlYXJpbmcuICBTZXQgdG8gemVybyBpbiAgKi8KLSAgLyogICAgICAgICAgICAgICAgY2FzZSBvZiBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhYWR2YW5jZSA6OiBUaGUgaG9yaXpvbnRhbCAob3IgdmVydGljYWwpIGFkdmFuY2UuICBTZXQgdG8gemVybyBpbiAgKi8KLSAgLyogICAgICAgICAgICAgICAgY2FzZSBvZiBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpUVF9HZXRfTWV0cmljc19GdW5jKSggVFRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgdmVydGljYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2hvcnQqICAgYWJlYXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogIGFhZHZhbmNlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9HZXRfTmFtZV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcm9tIHRoZSBgbmFtZScgdGFibGUsIHJldHVybiBhIGdpdmVuIEVOR0xJU0ggbmFtZSByZWNvcmQgaW4gICAgICAgKi8KLSAgLyogICAgQVNDSUkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuYW1laWQgICA6OiBUaGUgbmFtZSBpZCBvZiB0aGUgbmFtZSByZWNvcmQgdG8gcmV0dXJuLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuYW1lICAgICA6OiBUaGUgYWRkcmVzcyBvZiBhbiBhbGxvY2F0ZWQgc3RyaW5nIHBvaW50ZXIuICBOVUxMIGlmICAgKi8KLSAgLyogICAgICAgICAgICAgICAgbm8gbmFtZSBpcyBwcmVzZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfR2V0X05hbWVfRnVuYykoIFRUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgbmFtZWlkLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqKiAgbmFtZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY1R5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCBhIGdpdmVuIFRydWVUeXBlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZnVuY3Rpb24gdXNlcyBgZmFjZS0+Z290b190YWJsZScgdG8gc2VlayB0aGUgc3RyZWFtIHRvIHRoZSAgICAgKi8KLSAgLyogICAgc3RhcnQgb2YgdGhlIHRhYmxlLCBleGNlcHQgd2hpbGUgbG9hZGluZyB0aGUgZm9udCBkaXJlY3RvcnkuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfTG9hZF9UYWJsZV9GdW5jKSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9GcmVlX1RhYmxlX0Z1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlIGEgZ2l2ZW4gVHJ1ZVR5cGUgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKlRUX0ZyZWVfVGFibGVfRnVuYykoIFRUX0ZhY2UgIGZhY2UgKTsKLQotCi0gIC8qCi0gICAqIEBmdW5jdHlwZToKLSAgICogICAgVFRfRmFjZV9HZXRLZXJuaW5nRnVuYwotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgIFJldHVybiB0aGUgaG9yaXpvbnRhbCBrZXJuaW5nIHZhbHVlIGJldHdlZW4gdHdvIGdseXBocy4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LgotICAgKiAgICBsZWZ0X2dseXBoICA6OiBUaGUgbGVmdCBnbHlwaCBpbmRleC4KLSAgICogICAgcmlnaHRfZ2x5cGggOjogVGhlIHJpZ2h0IGdseXBoIGluZGV4LgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgICBUaGUga2VybmluZyB2YWx1ZSBpbiBmb250IHVuaXRzLgotICAgKi8KLSAgdHlwZWRlZiBGVF9JbnQKLSAgKCpUVF9GYWNlX0dldEtlcm5pbmdGdW5jKSggVFRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgbGVmdF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgcmlnaHRfZ2x5cGggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNGTlRfSW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIGhvbGRzIHBvaW50ZXJzIHRvIHRoZSBmdW5jdGlvbnMgdXNlZCB0byBsb2FkIGFuZCAgICAqLwotICAvKiAgICBmcmVlIHRoZSBiYXNpYyB0YWJsZXMgdGhhdCBhcmUgcmVxdWlyZWQgaW4gYSBgc2ZudCcgZm9udCBmaWxlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDaGVjayB0aGUgdmFyaW91cyB4eHhfRnVuYygpIGRlc2NyaXB0aW9ucyBmb3IgZGV0YWlscy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBTRk5UX0ludGVyZmFjZV8KLSAgewotICAgIFRUX0xvYWRlcl9Hb3RvVGFibGVGdW5jICAgICAgZ290b190YWJsZTsKLQotICAgIFRUX0luaXRfRmFjZV9GdW5jICAgICAgICAgICAgaW5pdF9mYWNlOwotICAgIFRUX0xvYWRfRmFjZV9GdW5jICAgICAgICAgICAgbG9hZF9mYWNlOwotICAgIFRUX0RvbmVfRmFjZV9GdW5jICAgICAgICAgICAgZG9uZV9mYWNlOwotICAgIEZUX01vZHVsZV9SZXF1ZXN0ZXIgICAgICAgICAgZ2V0X2ludGVyZmFjZTsKLQotICAgIFRUX0xvYWRfQW55X0Z1bmMgICAgICAgICAgICAgbG9hZF9hbnk7Ci0KLSAgICAvKiB0aGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZCBieSBgbG9hZF9mYWNlJyBidXQgdGhleSBjYW4gYWxzbyAgKi8KLSAgICAvKiBiZSBjYWxsZWQgZnJvbSBleHRlcm5hbCBtb2R1bGVzLCBpZiB0aGVyZSBpcyBhIG5lZWQgdG8gZG8gc28gKi8KLSAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfaGVhZDsKLSAgICBUVF9Mb2FkX01ldHJpY3NfRnVuYyAgICAgICAgIGxvYWRfaGhlYTsKLSAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfY21hcDsKLSAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfbWF4cDsKLSAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfb3MyOwotICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9wb3N0OwotCi0gICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgICAgICBsb2FkX25hbWU7Ci0gICAgVFRfRnJlZV9UYWJsZV9GdW5jICAgICAgICAgICBmcmVlX25hbWU7Ci0KLSAgICAvKiB0aGlzIGZpZWxkIHdhcyBjYWxsZWQgYGxvYWRfa2VybmluZycgdXAgdG8gdmVyc2lvbiAyLjEuMTAgKi8KLSAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfa2VybjsKLQotICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9nYXNwOwotICAgIFRUX0xvYWRfVGFibGVfRnVuYyAgICAgICAgICAgbG9hZF9wY2x0OwotCi0gICAgLyogc2VlIGB0dGxvYWQuaCc7IHRoaXMgZmllbGQgd2FzIGNhbGxlZCBgbG9hZF9iaXRtYXBfaGVhZGVyJyB1cCB0byAqLwotICAgIC8qIHZlcnNpb24gMi4xLjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBUVF9Mb2FkX1RhYmxlX0Z1bmMgICAgICAgICAgIGxvYWRfYmhlZDsKLQotICAgIFRUX0xvYWRfU0JpdF9JbWFnZV9GdW5jICAgICAgbG9hZF9zYml0X2ltYWdlOwotCi0gICAgLyogc2VlIGB0dHBvc3QuaCcgKi8KLSAgICBUVF9HZXRfUFNfTmFtZV9GdW5jICAgICAgICAgIGdldF9wc25hbWU7Ci0gICAgVFRfRnJlZV9UYWJsZV9GdW5jICAgICAgICAgICBmcmVlX3BzbmFtZXM7Ci0KLSAgICAvKiBzdGFydGluZyBoZXJlLCB0aGUgc3RydWN0dXJlIGRpZmZlcnMgZnJvbSB2ZXJzaW9uIDIuMS43ICovCi0KLSAgICAvKiB0aGlzIGZpZWxkIHdhcyBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMi4xLjgsIG5hbWVkIGBnZXRfcHNuYW1lJyAqLwotICAgIFRUX0ZhY2VfR2V0S2VybmluZ0Z1bmMgICAgICAgZ2V0X2tlcm5pbmc7Ci0KLSAgICAvKiBuZXcgZWxlbWVudHMgaW50cm9kdWNlZCBhZnRlciB2ZXJzaW9uIDIuMS4xMCAqLwotCi0gICAgLyogbG9hZCB0aGUgZm9udCBkaXJlY3RvcnksIGkuZS4sIHRoZSBvZmZzZXQgdGFibGUgYW5kICovCi0gICAgLyogdGhlIHRhYmxlIGRpcmVjdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgICAgICBsb2FkX2ZvbnRfZGlyOwotICAgIFRUX0xvYWRfTWV0cmljc19GdW5jICAgICAgICAgbG9hZF9obXR4OwotCi0gICAgVFRfTG9hZF9UYWJsZV9GdW5jICAgICAgICAgICBsb2FkX2VibGM7Ci0gICAgVFRfRnJlZV9UYWJsZV9GdW5jICAgICAgICAgICBmcmVlX2VibGM7Ci0KLSAgICBUVF9TZXRfU0JpdF9TdHJpa2VfRnVuYyAgICAgIHNldF9zYml0X3N0cmlrZTsKLSAgICBUVF9Mb2FkX1N0cmlrZV9NZXRyaWNzX0Z1bmMgIGxvYWRfc3RyaWtlX21ldHJpY3M7Ci0KLSAgICBUVF9HZXRfTWV0cmljc19GdW5jICAgICAgICAgIGdldF9tZXRyaWNzOwotCi0gICAgVFRfR2V0X05hbWVfRnVuYyAgICAgICAgICAgICBnZXRfbmFtZTsKLQotICB9IFNGTlRfSW50ZXJmYWNlOwotCi0KLSAgLyogdHJhbnNpdGlvbmFsICovCi0gIHR5cGVkZWYgU0ZOVF9JbnRlcmZhY2UqICAgU0ZOVF9TZXJ2aWNlOwotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgRlRfREVGSU5FX1NGTlRfSU5URVJGQUNFKCAgICAgICAgXAotICAgICAgICAgIGNsYXNzXywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ290b190YWJsZV8sICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpbml0X2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfZmFjZV8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG9uZV9mYWNlXywgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfaW50ZXJmYWNlXywgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfYW55XywgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9oZWFkXywgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2hoZWFfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfY21hcF8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9tYXhwXywgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX29zMl8sICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfcG9zdF8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9uYW1lXywgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmcmVlX25hbWVfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfa2Vybl8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9nYXNwXywgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX3BjbHRfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfYmhlZF8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9zYml0X2ltYWdlXywgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfcHNuYW1lXywgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZyZWVfcHNuYW1lc18sICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X2tlcm5pbmdfLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2ZvbnRfZGlyXywgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfaG10eF8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9lYmxjXywgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmcmVlX2VibGNfLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHNldF9zYml0X3N0cmlrZV8sICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9zdHJpa2VfbWV0cmljc18sICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfbWV0cmljc18sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9uYW1lXyApICAgICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBjb25zdCBTRk5UX0ludGVyZmFjZSAgY2xhc3NfID0gIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdvdG9fdGFibGVfLCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW5pdF9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsb2FkX2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRvbmVfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X2ludGVyZmFjZV8sICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsb2FkX2FueV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfaGVhZF8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbG9hZF9oaGVhXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsb2FkX2NtYXBfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfbWF4cF8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbG9hZF9vczJfLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsb2FkX3Bvc3RfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZnJlZV9uYW1lXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsb2FkX2tlcm5fLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfZ2FzcF8sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbG9hZF9wY2x0XywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsb2FkX2JoZWRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfc2JpdF9pbWFnZV8sICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X3BzbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmcmVlX3BzbmFtZXNfLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGdldF9rZXJuaW5nXywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbG9hZF9mb250X2Rpcl8sICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsb2FkX2htdHhfLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfZWJsY18sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZnJlZV9lYmxjXywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzZXRfc2JpdF9zdHJpa2VfLCAgICAgICAgICAgICAgICAgICAgXAotICAgIGxvYWRfc3RyaWtlX21ldHJpY3NfLCAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X21ldHJpY3NfLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBnZXRfbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jZGVmaW5lIEZUX0lOVEVSTkFMKCBhLCBhXyApICBcCi0gICAgICAgICAgY2xhenotPmEgPSBhXzsKLQotI2RlZmluZSBGVF9ERUZJTkVfU0ZOVF9JTlRFUkZBQ0UoICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnb3RvX3RhYmxlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGluaXRfZmFjZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9mYWNlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkb25lX2ZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9pbnRlcmZhY2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9hbnlfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2hlYWRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfaGhlYV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9jbWFwXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX21heHBfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfb3MyXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9wb3N0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZyZWVfbmFtZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9rZXJuXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2dhc3BfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfcGNsdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9iaGVkXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX3NiaXRfaW1hZ2VfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9wc25hbWVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZnJlZV9wc25hbWVzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBnZXRfa2VybmluZ18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGxvYWRfZm9udF9kaXJfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbG9hZF9obXR4XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX2VibGNfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZyZWVfZWJsY18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgc2V0X3NiaXRfc3RyaWtlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBsb2FkX3N0cmlrZV9tZXRyaWNzXywgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGdldF9tZXRyaWNzXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZ2V0X25hbWVfICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIEZUX0xpYnJhcnkgICAgICAgbGlicmFyeSwgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ZOVF9JbnRlcmZhY2UqICBjbGF6eiApICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z290b190YWJsZSAgICAgICAgICA9IGdvdG9fdGFibGVfOyAgICAgICAgICAgXAotICAgIGNsYXp6LT5pbml0X2ZhY2UgICAgICAgICAgID0gaW5pdF9mYWNlXzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfZmFjZSAgICAgICAgICAgPSBsb2FkX2ZhY2VfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+ZG9uZV9mYWNlICAgICAgICAgICA9IGRvbmVfZmFjZV87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5nZXRfaW50ZXJmYWNlICAgICAgID0gZ2V0X2ludGVyZmFjZV87ICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfYW55ICAgICAgICAgICAgPSBsb2FkX2FueV87ICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9oZWFkICAgICAgICAgICA9IGxvYWRfaGVhZF87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX2hoZWEgICAgICAgICAgID0gbG9hZF9oaGVhXzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfY21hcCAgICAgICAgICAgPSBsb2FkX2NtYXBfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9tYXhwICAgICAgICAgICA9IGxvYWRfbWF4cF87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX29zMiAgICAgICAgICAgID0gbG9hZF9vczJfOyAgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfcG9zdCAgICAgICAgICAgPSBsb2FkX3Bvc3RfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9uYW1lICAgICAgICAgICA9IGxvYWRfbmFtZV87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5mcmVlX25hbWUgICAgICAgICAgID0gZnJlZV9uYW1lXzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfa2VybiAgICAgICAgICAgPSBsb2FkX2tlcm5fOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9nYXNwICAgICAgICAgICA9IGxvYWRfZ2FzcF87ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX3BjbHQgICAgICAgICAgID0gbG9hZF9wY2x0XzsgICAgICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfYmhlZCAgICAgICAgICAgPSBsb2FkX2JoZWRfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9zYml0X2ltYWdlICAgICA9IGxvYWRfc2JpdF9pbWFnZV87ICAgICAgXAotICAgIGNsYXp6LT5nZXRfcHNuYW1lICAgICAgICAgID0gZ2V0X3BzbmFtZV87ICAgICAgICAgICBcCi0gICAgY2xhenotPmZyZWVfcHNuYW1lcyAgICAgICAgPSBmcmVlX3BzbmFtZXNfOyAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X2tlcm5pbmcgICAgICAgICA9IGdldF9rZXJuaW5nXzsgICAgICAgICAgXAotICAgIGNsYXp6LT5sb2FkX2ZvbnRfZGlyICAgICAgID0gbG9hZF9mb250X2Rpcl87ICAgICAgICBcCi0gICAgY2xhenotPmxvYWRfaG10eCAgICAgICAgICAgPSBsb2FkX2htdHhfOyAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9lYmxjICAgICAgICAgICA9IGxvYWRfZWJsY187ICAgICAgICAgICAgXAotICAgIGNsYXp6LT5mcmVlX2VibGMgICAgICAgICAgID0gZnJlZV9lYmxjXzsgICAgICAgICAgICBcCi0gICAgY2xhenotPnNldF9zYml0X3N0cmlrZSAgICAgPSBzZXRfc2JpdF9zdHJpa2VfOyAgICAgIFwKLSAgICBjbGF6ei0+bG9hZF9zdHJpa2VfbWV0cmljcyA9IGxvYWRfc3RyaWtlX21ldHJpY3NfOyAgXAotICAgIGNsYXp6LT5nZXRfbWV0cmljcyAgICAgICAgID0gZ2V0X21ldHJpY3NfOyAgICAgICAgICBcCi0gICAgY2xhenotPmdldF9uYW1lICAgICAgICAgICAgPSBnZXRfbmFtZV87ICAgICAgICAgICAgIFwKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19TRk5UX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC90MXR5cGVzLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI5YWNjNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3QxdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0MXR5cGVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQmFzaWMgVHlwZTEvVHlwZTIgdHlwZSBkZWZpbml0aW9ucyBhbmQgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uICAgICAgKi8KLS8qICAgIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fVDFUWVBFU19IX18KLSNkZWZpbmUgX19UMVRZUEVTX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfVFlQRTFfVEFCTEVTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfSElOVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICBSRVFVSVJFRCBUWVBFMS9UWVBFMiBUQUJMRVMgREVGSU5JVElPTlMgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfRW5jb2RpbmdSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgbW9kZWxpbmcgYSBjdXN0b20gZW5jb2RpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2NoYXJzICA6OiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlciBjb2RlcyBpbiB0aGUgZW5jb2RpbmcuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgVXN1YWxseSAyNTYuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29kZV9maXJzdCA6OiBUaGUgbG93ZXN0IHZhbGlkIGNoYXJhY3RlciBjb2RlIGluIHRoZSBlbmNvZGluZy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb2RlX2xhc3QgIDo6IFRoZSBoaWdoZXN0IHZhbGlkIGNoYXJhY3RlciBjb2RlIGluIHRoZSBlbmNvZGluZyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICArIDEuIFdoZW4gZXF1YWwgdG8gY29kZV9maXJzdCB0aGVyZSBhcmUgbm8gdmFsaWQgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyIGNvZGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcl9pbmRleCA6OiBBbiBhcnJheSBvZiBjb3JyZXNwb25kaW5nIGdseXBoIGluZGljZXMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyX25hbWUgIDo6IEFuIGFycmF5IG9mIGNvcnJlc3BvbmRpbmcgZ2x5cGggbmFtZXMuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUMV9FbmNvZGluZ1JlY1JlY18KLSAgewotICAgIEZUX0ludCAgICAgICBudW1fY2hhcnM7Ci0gICAgRlRfSW50ICAgICAgIGNvZGVfZmlyc3Q7Ci0gICAgRlRfSW50ICAgICAgIGNvZGVfbGFzdDsKLQotICAgIEZUX1VTaG9ydCogICBjaGFyX2luZGV4OwotICAgIEZUX1N0cmluZyoqICBjaGFyX25hbWU7Ci0KLSAgfSBUMV9FbmNvZGluZ1JlYywgKlQxX0VuY29kaW5nOwotCi0KLSAgLyogdXNlZCB0byBob2xkIGV4dHJhIGRhdGEgb2YgUFNfRm9udEluZm9SZWMgdGhhdAotICAgKiBjYW5ub3QgYmUgc3RvcmVkIGluIHRoZSBwdWJsaWNseSBkZWZpbmVkIHN0cnVjdHVyZS4KLSAgICoKLSAgICogTm90ZSB0aGVzZSBjYW4ndCBiZSBibGVuZGVkIHdpdGggbXVsdGlwbGUtbWFzdGVycy4KLSAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU19Gb250RXh0cmFSZWNfCi0gIHsKLSAgICBGVF9VU2hvcnQgIGZzX3R5cGU7Ci0KLSAgfSBQU19Gb250RXh0cmFSZWM7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgVDFfRm9udFJlY18KLSAgewotICAgIFBTX0ZvbnRJbmZvUmVjICAgZm9udF9pbmZvOyAgICAgICAgIC8qIGZvbnQgaW5mbyBkaWN0aW9uYXJ5ICAgKi8KLSAgICBQU19Gb250RXh0cmFSZWMgIGZvbnRfZXh0cmE7ICAgICAgICAvKiBmb250IGluZm8gZXh0cmEgZmllbGRzICovCi0gICAgUFNfUHJpdmF0ZVJlYyAgICBwcml2YXRlX2RpY3Q7ICAgICAgLyogcHJpdmF0ZSBkaWN0aW9uYXJ5ICAgICAqLwotICAgIEZUX1N0cmluZyogICAgICAgZm9udF9uYW1lOyAgICAgICAgIC8qIHRvcC1sZXZlbCBkaWN0aW9uYXJ5ICAgKi8KLQotICAgIFQxX0VuY29kaW5nVHlwZSAgZW5jb2RpbmdfdHlwZTsKLSAgICBUMV9FbmNvZGluZ1JlYyAgIGVuY29kaW5nOwotCi0gICAgRlRfQnl0ZSogICAgICAgICBzdWJyc19ibG9jazsKLSAgICBGVF9CeXRlKiAgICAgICAgIGNoYXJzdHJpbmdzX2Jsb2NrOwotICAgIEZUX0J5dGUqICAgICAgICAgZ2x5cGhfbmFtZXNfYmxvY2s7Ci0KLSAgICBGVF9JbnQgICAgICAgICAgIG51bV9zdWJyczsKLSAgICBGVF9CeXRlKiogICAgICAgIHN1YnJzOwotICAgIEZUX1VJbnQqICAgICAgICAgc3VicnNfbGVuOwotCi0gICAgRlRfSW50ICAgICAgICAgICBudW1fZ2x5cGhzOwotICAgIEZUX1N0cmluZyoqICAgICAgZ2x5cGhfbmFtZXM7ICAgICAgIC8qIGFycmF5IG9mIGdseXBoIG5hbWVzICAgICAgICovCi0gICAgRlRfQnl0ZSoqICAgICAgICBjaGFyc3RyaW5nczsgICAgICAgLyogYXJyYXkgb2YgZ2x5cGggY2hhcnN0cmluZ3MgKi8KLSAgICBGVF9VSW50KiAgICAgICAgIGNoYXJzdHJpbmdzX2xlbjsKLQotICAgIEZUX0J5dGUgICAgICAgICAgcGFpbnRfdHlwZTsKLSAgICBGVF9CeXRlICAgICAgICAgIGZvbnRfdHlwZTsKLSAgICBGVF9NYXRyaXggICAgICAgIGZvbnRfbWF0cml4OwotICAgIEZUX1ZlY3RvciAgICAgICAgZm9udF9vZmZzZXQ7Ci0gICAgRlRfQkJveCAgICAgICAgICBmb250X2Jib3g7Ci0gICAgRlRfTG9uZyAgICAgICAgICBmb250X2lkOwotCi0gICAgRlRfRml4ZWQgICAgICAgICBzdHJva2Vfd2lkdGg7Ci0KLSAgfSBUMV9Gb250UmVjLCAqVDFfRm9udDsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDSURfU3VicnNSZWNfCi0gIHsKLSAgICBGVF9JbnQgICAgIG51bV9zdWJyczsKLSAgICBGVF9CeXRlKiogIGNvZGU7Ci0KLSAgfSBDSURfU3VicnNSZWMsICpDSURfU3VicnM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgQUZNIEZPTlQgSU5GT1JNQVRJT04gU1RSVUNUVVJFUyAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEFGTV9UcmFja0tlcm5SZWNfCi0gIHsKLSAgICBGVF9JbnQgICAgZGVncmVlOwotICAgIEZUX0ZpeGVkICBtaW5fcHRzaXplOwotICAgIEZUX0ZpeGVkICBtaW5fa2VybjsKLSAgICBGVF9GaXhlZCAgbWF4X3B0c2l6ZTsKLSAgICBGVF9GaXhlZCAgbWF4X2tlcm47Ci0KLSAgfSBBRk1fVHJhY2tLZXJuUmVjLCAqQUZNX1RyYWNrS2VybjsKLQotICB0eXBlZGVmIHN0cnVjdCAgQUZNX0tlcm5QYWlyUmVjXwotICB7Ci0gICAgRlRfVUludCAgaW5kZXgxOwotICAgIEZUX1VJbnQgIGluZGV4MjsKLSAgICBGVF9JbnQgICB4OwotICAgIEZUX0ludCAgIHk7Ci0KLSAgfSBBRk1fS2VyblBhaXJSZWMsICpBRk1fS2VyblBhaXI7Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEFGTV9Gb250SW5mb1JlY18KLSAgewotICAgIEZUX0Jvb2wgICAgICAgIElzQ0lERm9udDsKLSAgICBGVF9CQm94ICAgICAgICBGb250QkJveDsKLSAgICBGVF9GaXhlZCAgICAgICBBc2NlbmRlcjsKLSAgICBGVF9GaXhlZCAgICAgICBEZXNjZW5kZXI7Ci0gICAgQUZNX1RyYWNrS2VybiAgVHJhY2tLZXJuczsgICAvKiBmcmVlIGlmIG5vbi1OVUxMICovCi0gICAgRlRfVUludCAgICAgICAgTnVtVHJhY2tLZXJuOwotICAgIEFGTV9LZXJuUGFpciAgIEtlcm5QYWlyczsgICAgLyogZnJlZSBpZiBub24tTlVMTCAqLwotICAgIEZUX1VJbnQgICAgICAgIE51bUtlcm5QYWlyOwotCi0gIH0gQUZNX0ZvbnRJbmZvUmVjLCAqQUZNX0ZvbnRJbmZvOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgIE9SSUdJTkFMIFQxX0ZBQ0UgQ0xBU1MgREVGSU5JVElPTiAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgVDFfRmFjZVJlY18qICAgVDFfRmFjZTsKLSAgdHlwZWRlZiBzdHJ1Y3QgQ0lEX0ZhY2VSZWNfKiAgQ0lEX0ZhY2U7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgVDFfRmFjZVJlY18KLSAgewotICAgIEZUX0ZhY2VSZWMgICAgICByb290OwotICAgIFQxX0ZvbnRSZWMgICAgICB0eXBlMTsKLSAgICBjb25zdCB2b2lkKiAgICAgcHNuYW1lczsKLSAgICBjb25zdCB2b2lkKiAgICAgcHNhdXg7Ci0gICAgY29uc3Qgdm9pZCogICAgIGFmbV9kYXRhOwotICAgIEZUX0NoYXJNYXBSZWMgICBjaGFybWFwcmVjc1syXTsKLSAgICBGVF9DaGFyTWFwICAgICAgY2hhcm1hcHNbMl07Ci0KLSAgICAvKiBzdXBwb3J0IGZvciBNdWx0aXBsZSBNYXN0ZXJzIGZvbnRzICovCi0gICAgUFNfQmxlbmQgICAgICAgIGJsZW5kOwotCi0gICAgLyogdW5kb2N1bWVudGVkLCBvcHRpb25hbDogaW5kaWNlcyBvZiBzdWJyb3V0aW5lcyB0aGF0IGV4cHJlc3MgICAgICAqLwotICAgIC8qIHRoZSBOb3JtYWxpemVEZXNpZ25WZWN0b3IgYW5kIHRoZSBDb252ZXJ0RGVzaWduVmVjdG9yIHByb2NlZHVyZSwgKi8KLSAgICAvKiByZXNwZWN0aXZlbHksIGFzIFR5cGUgMiBjaGFyc3RyaW5nczsgLTEgaWYga2V5d29yZHMgbm90IHByZXNlbnQgICovCi0gICAgRlRfSW50ICAgICAgICAgICBuZHZfaWR4OwotICAgIEZUX0ludCAgICAgICAgICAgY2R2X2lkeDsKLQotICAgIC8qIHVuZG9jdW1lbnRlZCwgb3B0aW9uYWw6IGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGxlbl9idWlsZGNoYXIgKi8KLSAgICAvKiBmb3IgVHlwZSAyIGZvbnRzOyBtYW5pcHVsYXRlZCBieSBvdGhlcnN1YnJzIDE5LCAyNCwgYW5kIDI1ICAgICovCi0gICAgRlRfVUludCAgICAgICAgICBsZW5fYnVpbGRjaGFyOwotICAgIEZUX0xvbmcqICAgICAgICAgYnVpbGRjaGFyOwotCi0gICAgLyogc2luY2UgdmVyc2lvbiAyLjEgLSBpbnRlcmZhY2UgdG8gUG9zdFNjcmlwdCBoaW50ZXIgKi8KLSAgICBjb25zdCB2b2lkKiAgICAgcHNoaW50ZXI7Ci0KLSAgfSBUMV9GYWNlUmVjOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIENJRF9GYWNlUmVjXwotICB7Ci0gICAgRlRfRmFjZVJlYyAgICAgICByb290OwotICAgIHZvaWQqICAgICAgICAgICAgcHNuYW1lczsKLSAgICB2b2lkKiAgICAgICAgICAgIHBzYXV4OwotICAgIENJRF9GYWNlSW5mb1JlYyAgY2lkOwotICAgIFBTX0ZvbnRFeHRyYVJlYyAgZm9udF9leHRyYTsKLSNpZiAwCi0gICAgdm9pZCogICAgICAgICAgICBhZm1fZGF0YTsKLSNlbmRpZgotICAgIENJRF9TdWJycyAgICAgICAgc3VicnM7Ci0KLSAgICAvKiBzaW5jZSB2ZXJzaW9uIDIuMSAtIGludGVyZmFjZSB0byBQb3N0U2NyaXB0IGhpbnRlciAqLwotICAgIHZvaWQqICAgICAgICAgICAgcHNoaW50ZXI7Ci0KLSAgICAvKiBzaW5jZSB2ZXJzaW9uIDIuMS44LCBidXQgd2FzIG9yaWdpbmFsbHkgcG9zaXRpb25lZCBhZnRlciBgYWZtX2RhdGEnICovCi0gICAgRlRfQnl0ZSogICAgICAgICBiaW5hcnlfZGF0YTsgLyogdXNlZCBpZiBoZXggZGF0YSBoYXMgYmVlbiBjb252ZXJ0ZWQgKi8KLSAgICBGVF9TdHJlYW0gICAgICAgIGNpZF9zdHJlYW07Ci0KLSAgfSBDSURfRmFjZVJlYzsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1QxVFlQRVNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL3R0dHlwZXMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTA3YTdjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvaW50ZXJuYWwvdHR0eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dHR5cGVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQmFzaWMgU0ZOVC9UcnVlVHlwZSB0eXBlIGRlZmluaXRpb25zIGFuZCBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24gICAgKi8KLS8qICAgIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fVFRUWVBFU19IX18KLSNkZWZpbmUgX19UVFRZUEVTX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFCTEVTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotI2luY2x1ZGUgRlRfTVVMVElQTEVfTUFTVEVSU19ICi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICBSRVFVSVJFRCBUUlVFVFlQRS9PUEVOVFlQRSBUQUJMRVMgREVGSU5JVElPTlMgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUQ19IZWFkZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlIGNvbGxlY3Rpb24gaGVhZGVyLiAgVGhpcyB0YWJsZSBjb250YWlucyB0aGUgb2Zmc2V0cyBvZiAgICAqLwotICAvKiAgICB0aGUgZm9udCBoZWFkZXJzIG9mIGVhY2ggZGlzdGluY3QgVHJ1ZVR5cGUgZmFjZSBpbiB0aGUgZmlsZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWcgICAgIDo6IE11c3QgYmUgYHR0YyAnIHRvIGluZGljYXRlIGEgVHJ1ZVR5cGUgY29sbGVjdGlvbi4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnNpb24gOjogVGhlIHZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY291bnQgICA6OiBUaGUgbnVtYmVyIG9mIGZhY2VzIGluIHRoZSBjb2xsZWN0aW9uLiAgVGhlICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgc3BlY2lmaWNhdGlvbiBzYXlzIHRoaXMgc2hvdWxkIGJlIGFuIHVuc2lnbmVkIGxvbmcsIGJ1dCAqLwotICAvKiAgICAgICAgICAgICAgIHdlIHVzZSBhIHNpZ25lZCBsb25nIHNpbmNlIHdlIG5lZWQgdGhlIHZhbHVlIC0xIGZvciAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBzcGVjaWZpYyBwdXJwb3Nlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvZmZzZXRzIDo6IFRoZSBvZmZzZXRzIG9mIHRoZSBmb250IGhlYWRlcnMsIG9uZSBwZXIgZmFjZS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVENfSGVhZGVyUmVjXwotICB7Ci0gICAgRlRfVUxvbmcgICB0YWc7Ci0gICAgRlRfRml4ZWQgICB2ZXJzaW9uOwotICAgIEZUX0xvbmcgICAgY291bnQ7Ci0gICAgRlRfVUxvbmcqICBvZmZzZXRzOwotCi0gIH0gVFRDX0hlYWRlclJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNGTlRfSGVhZGVyUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNGTlQgZmlsZSBmb3JtYXQgaGVhZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvcm1hdF90YWcgICAgIDo6IFRoZSBmb250IGZvcm1hdCB0YWcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX3RhYmxlcyAgICAgOjogVGhlIG51bWJlciBvZiB0YWJsZXMgaW4gZmlsZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzZWFyY2hfcmFuZ2UgICA6OiBNdXN0IGJlIGAxNiAqIChtYXggcG93ZXIgb2YgMiA8PSBudW1fdGFibGVzKScuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGVudHJ5X3NlbGVjdG9yIDo6IE11c3QgYmUgbG9nMiBvZiBgc2VhcmNoX3JhbmdlIC8gMTYnLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmFuZ2Vfc2hpZnQgICAgOjogTXVzdCBiZSBgbnVtX3RhYmxlcyAqIDE2IC0gc2VhcmNoX3JhbmdlJy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgU0ZOVF9IZWFkZXJSZWNfCi0gIHsKLSAgICBGVF9VTG9uZyAgIGZvcm1hdF90YWc7Ci0gICAgRlRfVVNob3J0ICBudW1fdGFibGVzOwotICAgIEZUX1VTaG9ydCAgc2VhcmNoX3JhbmdlOwotICAgIEZUX1VTaG9ydCAgZW50cnlfc2VsZWN0b3I7Ci0gICAgRlRfVVNob3J0ICByYW5nZV9zaGlmdDsKLQotICAgIEZUX1VMb25nICAgb2Zmc2V0OyAgLyogbm90IGluIGZpbGUgKi8KLQotICB9IFNGTlRfSGVhZGVyUmVjLCAqU0ZOVF9IZWFkZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9UYWJsZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgYSBnaXZlbiB0YWJsZSBvZiBhIFRydWVUeXBlIGZvbnQuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUYWcgICAgICA6OiBBIGZvdXItYnl0ZXMgdGFnIGRlc2NyaWJpbmcgdGhlIHRhYmxlLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENoZWNrU3VtIDo6IFRoZSB0YWJsZSBjaGVja3N1bS4gIFRoaXMgdmFsdWUgY2FuIGJlIGlnbm9yZWQuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT2Zmc2V0ICAgOjogVGhlIG9mZnNldCBvZiB0aGUgdGFibGUgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIFRydWVUeXBlICovCi0gIC8qICAgICAgICAgICAgICAgIGZvbnQgaW4gaXRzIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTGVuZ3RoICAgOjogVGhlIHRhYmxlIGxlbmd0aCAoaW4gYnl0ZXMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfVGFibGVSZWNfCi0gIHsKLSAgICBGVF9VTG9uZyAgVGFnOyAgICAgICAgLyogICAgICAgIHRhYmxlIHR5cGUgKi8KLSAgICBGVF9VTG9uZyAgQ2hlY2tTdW07ICAgLyogICAgdGFibGUgY2hlY2tzdW0gKi8KLSAgICBGVF9VTG9uZyAgT2Zmc2V0OyAgICAgLyogdGFibGUgZmlsZSBvZmZzZXQgKi8KLSAgICBGVF9VTG9uZyAgTGVuZ3RoOyAgICAgLyogICAgICB0YWJsZSBsZW5ndGggKi8KLQotICB9IFRUX1RhYmxlUmVjLCAqVFRfVGFibGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXT0ZGX0hlYWRlclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXT0ZGIGZpbGUgZm9ybWF0IGhlYWRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgaHR0cDovL3d3dy53My5vcmcvVFIvV09GRi8jV09GRkhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFdPRkZfSGVhZGVyUmVjXwotICB7Ci0gICAgRlRfVUxvbmcgICBzaWduYXR1cmU7Ci0gICAgRlRfVUxvbmcgICBmbGF2b3I7Ci0gICAgRlRfVUxvbmcgICBsZW5ndGg7Ci0gICAgRlRfVVNob3J0ICBudW1fdGFibGVzOwotICAgIEZUX1VTaG9ydCAgcmVzZXJ2ZWQ7Ci0gICAgRlRfVUxvbmcgICB0b3RhbFNmbnRTaXplOwotICAgIEZUX1VTaG9ydCAgbWFqb3JWZXJzaW9uOwotICAgIEZUX1VTaG9ydCAgbWlub3JWZXJzaW9uOwotICAgIEZUX1VMb25nICAgbWV0YU9mZnNldDsKLSAgICBGVF9VTG9uZyAgIG1ldGFMZW5ndGg7Ci0gICAgRlRfVUxvbmcgICBtZXRhT3JpZ0xlbmd0aDsKLSAgICBGVF9VTG9uZyAgIHByaXZPZmZzZXQ7Ci0gICAgRlRfVUxvbmcgICBwcml2TGVuZ3RoOwotCi0gIH0gV09GRl9IZWFkZXJSZWMsICpXT0ZGX0hlYWRlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFdPRkZfVGFibGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyBhIGdpdmVuIHRhYmxlIG9mIGEgV09GRiBmb250LiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRhZyAgICAgICAgOjogQSBmb3VyLWJ5dGVzIHRhZyBkZXNjcmliaW5nIHRoZSB0YWJsZS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT2Zmc2V0ICAgICA6OiBUaGUgb2Zmc2V0IG9mIHRoZSB0YWJsZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgV09GRiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgZm9udCBpbiBpdHMgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcExlbmd0aCA6OiBDb21wcmVzc2VkIHRhYmxlIGxlbmd0aCAoaW4gYnl0ZXMpLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPcmlnTGVuZ3RoIDo6IFVub21wcmVzc2VkIHRhYmxlIGxlbmd0aCAoaW4gYnl0ZXMpLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENoZWNrU3VtICAgOjogVGhlIHRhYmxlIGNoZWNrc3VtLiAgVGhpcyB2YWx1ZSBjYW4gYmUgaWdub3JlZC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT3JpZ09mZnNldCA6OiBUaGUgdW5jb21wcmVzc2VkIHRhYmxlIGZpbGUgb2Zmc2V0LiAgVGhpcyB2YWx1ZSBnZXRzICovCi0gIC8qICAgICAgICAgICAgICAgICAgY29tcHV0ZWQgd2hpbGUgY29uc3RydWN0aW5nIHRoZSAodW5jb21wcmVzc2VkKSBTRk5UICAqLwotICAvKiAgICAgICAgICAgICAgICAgIGhlYWRlci4gIEl0IGlzIG5vdCBjb250YWluZWQgaW4gdGhlIFdPRkYgZmlsZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBXT0ZGX1RhYmxlUmVjXwotICB7Ci0gICAgRlRfVUxvbmcgIFRhZzsgICAgICAgICAgIC8qIHRhYmxlIElEICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9VTG9uZyAgT2Zmc2V0OyAgICAgICAgLyogdGFibGUgZmlsZSBvZmZzZXQgICAgICAgICAqLwotICAgIEZUX1VMb25nICBDb21wTGVuZ3RoOyAgICAvKiBjb21wcmVzc2VkIHRhYmxlIGxlbmd0aCAgICovCi0gICAgRlRfVUxvbmcgIE9yaWdMZW5ndGg7ICAgIC8qIHVuY29tcHJlc3NlZCB0YWJsZSBsZW5ndGggKi8KLSAgICBGVF9VTG9uZyAgQ2hlY2tTdW07ICAgICAgLyogdW5jb21wcmVzc2VkIGNoZWNrc3VtICAgICAqLwotCi0gICAgRlRfVUxvbmcgIE9yaWdPZmZzZXQ7ICAgIC8qIHVuY29tcHJlc3NlZCB0YWJsZSBmaWxlIG9mZnNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAobm90IGluIHRoZSBXT0ZGIGZpbGUpICAgICAgICAgKi8KLSAgfSBXT0ZGX1RhYmxlUmVjLCAqV09GRl9UYWJsZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0xvbmdNZXRyaWNzUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIG1vZGVsaW5nIHRoZSBsb25nIG1ldHJpY3Mgb2YgdGhlIGBobXR4JyBhbmQgYHZtdHgnICAgICAqLwotICAvKiAgICBUcnVlVHlwZSB0YWJsZXMuICBUaGUgdmFsdWVzIGFyZSBleHByZXNzZWQgaW4gZm9udCB1bml0cy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZHZhbmNlIDo6IFRoZSBhZHZhbmNlIHdpZHRoIG9yIGhlaWdodCBmb3IgdGhlIGdseXBoLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJlYXJpbmcgOjogVGhlIGxlZnQtc2lkZSBvciB0b3Atc2lkZSBiZWFyaW5nIGZvciB0aGUgZ2x5cGguICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0xvbmdNZXRyaWNzUmVjXwotICB7Ci0gICAgRlRfVVNob3J0ICBhZHZhbmNlOwotICAgIEZUX1Nob3J0ICAgYmVhcmluZzsKLQotICB9IFRUX0xvbmdNZXRyaWNzUmVjLCAqVFRfTG9uZ01ldHJpY3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9TaG9ydE1ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSB0eXBlIHRvIG1vZGVsIHRoZSBzaG9ydCBtZXRyaWNzIG9mIHRoZSBgaG10eCcgYW5kIGB2bXR4JyAgKi8KLSAgLyogICAgdGFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX1Nob3J0ICBUVF9TaG9ydE1ldHJpY3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9OYW1lRW50cnlSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSBtb2RlbGluZyBUcnVlVHlwZSBuYW1lIHJlY29yZHMuICBOYW1lIHJlY29yZHMgYXJlIHVzZWQgKi8KLSAgLyogICAgdG8gc3RvcmUgaW1wb3J0YW50IHN0cmluZ3MgbGlrZSBmYW1pbHkgbmFtZSwgc3R5bGUgbmFtZSwgICAgICAgICAgICovCi0gIC8qICAgIGNvcHlyaWdodCwgZXRjLiBpbiBfbG9jYWxpemVkXyB2ZXJzaW9ucyAoaS5lLiwgbGFuZ3VhZ2UsIGVuY29kaW5nLCAqLwotICAvKiAgICBldGMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwbGF0Zm9ybUlEICAgOjogVGhlIElEIG9mIHRoZSBuYW1lJ3MgZW5jb2RpbmcgcGxhdGZvcm0uICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGVuY29kaW5nSUQgICA6OiBUaGUgcGxhdGZvcm0tc3BlY2lmaWMgSUQgZm9yIHRoZSBuYW1lJ3MgZW5jb2RpbmcuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGFuZ3VhZ2VJRCAgIDo6IFRoZSBwbGF0Zm9ybS1zcGVjaWZpYyBJRCBmb3IgdGhlIG5hbWUncyBsYW5ndWFnZS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuYW1lSUQgICAgICAgOjogVGhlIElEIHNwZWNpZnlpbmcgd2hhdCBraW5kIG9mIG5hbWUgdGhpcyBpcy4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmluZ0xlbmd0aCA6OiBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyaW5nT2Zmc2V0IDo6IFRoZSBvZmZzZXQgdG8gdGhlIHN0cmluZyBpbiB0aGUgYG5hbWUnIHRhYmxlLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJpbmcgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBzdHJpbmcncyBieXRlcy4gIE5vdGUgdGhhdCB0aGVzZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGFyZSB1c3VhbGx5IFVURi0xNiBlbmNvZGVkIGNoYXJhY3RlcnMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfTmFtZUVudHJ5UmVjXwotICB7Ci0gICAgRlRfVVNob3J0ICBwbGF0Zm9ybUlEOwotICAgIEZUX1VTaG9ydCAgZW5jb2RpbmdJRDsKLSAgICBGVF9VU2hvcnQgIGxhbmd1YWdlSUQ7Ci0gICAgRlRfVVNob3J0ICBuYW1lSUQ7Ci0gICAgRlRfVVNob3J0ICBzdHJpbmdMZW5ndGg7Ci0gICAgRlRfVUxvbmcgICBzdHJpbmdPZmZzZXQ7Ci0KLSAgICAvKiB0aGlzIGxhc3QgZmllbGQgaXMgbm90IGRlZmluZWQgaW4gdGhlIHNwZWMgKi8KLSAgICAvKiBidXQgdXNlZCBieSB0aGUgRnJlZVR5cGUgZW5naW5lICAgICAgICAgICAgKi8KLQotICAgIEZUX0J5dGUqICAgc3RyaW5nOwotCi0gIH0gVFRfTmFtZUVudHJ5UmVjLCAqVFRfTmFtZUVudHJ5OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTmFtZVRhYmxlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgbW9kZWxpbmcgdGhlIFRydWVUeXBlIG5hbWUgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9ybWF0ICAgICAgICAgOjogVGhlIGZvcm1hdCBvZiB0aGUgbmFtZSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1OYW1lUmVjb3JkcyA6OiBUaGUgbnVtYmVyIG9mIG5hbWVzIGluIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0b3JhZ2VPZmZzZXQgIDo6IFRoZSBvZmZzZXQgb2YgdGhlIG5hbWUgdGFibGUgaW4gdGhlIGBuYW1lJyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICBUcnVlVHlwZSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5hbWVzICAgICAgICAgIDo6IEFuIGFycmF5IG9mIG5hbWUgcmVjb3Jkcy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtICAgICAgICAgOjogdGhlIGZpbGUncyBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfTmFtZVRhYmxlUmVjXwotICB7Ci0gICAgRlRfVVNob3J0ICAgICAgICAgZm9ybWF0OwotICAgIEZUX1VJbnQgICAgICAgICAgIG51bU5hbWVSZWNvcmRzOwotICAgIEZUX1VJbnQgICAgICAgICAgIHN0b3JhZ2VPZmZzZXQ7Ci0gICAgVFRfTmFtZUVudHJ5UmVjKiAgbmFtZXM7Ci0gICAgRlRfU3RyZWFtICAgICAgICAgc3RyZWFtOwotCi0gIH0gVFRfTmFtZVRhYmxlUmVjLCAqVFRfTmFtZVRhYmxlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgIE9QVElPTkFMIFRSVUVUWVBFL09QRU5UWVBFIFRBQkxFUyBERUZJTklUSU9OUyAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfR2FzcFJhbmdlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0aW55IHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgZ2FzcCByYW5nZSBhY2NvcmRpbmcgdG8gdGhlICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heFBQRU0gIDo6IFRoZSBtYXhpbXVtIHBwZW0gdmFsdWUgdG8gd2hpY2ggYGdhc3BGbGFnJyBhcHBsaWVzLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2FzcEZsYWcgOjogQSBmbGFnIGRlc2NyaWJpbmcgdGhlIGdyaWQtZml0dGluZyBhbmQgYW50aS1hbGlhc2luZyAgICovCi0gIC8qICAgICAgICAgICAgICAgIG1vZGVzIHRvIGJlIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0dhc3BSYW5nZVJlY18KLSAgewotICAgIEZUX1VTaG9ydCAgbWF4UFBFTTsKLSAgICBGVF9VU2hvcnQgIGdhc3BGbGFnOwotCi0gIH0gVFRfR2FzcFJhbmdlUmVjLCAqVFRfR2FzcFJhbmdlOwotCi0KLSNkZWZpbmUgVFRfR0FTUF9HUklERklUICAweDAxCi0jZGVmaW5lIFRUX0dBU1BfRE9HUkFZICAgMHgwMgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfR2FzcFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgbW9kZWxpbmcgdGhlIFRydWVUeXBlIGBnYXNwJyB0YWJsZSB1c2VkIHRvIHNwZWNpZnkgICAgICovCi0gIC8qICAgIGdyaWQtZml0dGluZyBhbmQgYW50aS1hbGlhc2luZyBiZWhhdmlvdXIuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnNpb24gICAgOjogVGhlIHZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtUmFuZ2VzICA6OiBUaGUgbnVtYmVyIG9mIGdhc3AgcmFuZ2VzIGluIHRhYmxlLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnYXNwUmFuZ2VzIDo6IEFuIGFycmF5IG9mIGdhc3AgcmFuZ2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9HYXNwXwotICB7Ci0gICAgRlRfVVNob3J0ICAgICB2ZXJzaW9uOwotICAgIEZUX1VTaG9ydCAgICAgbnVtUmFuZ2VzOwotICAgIFRUX0dhc3BSYW5nZSAgZ2FzcFJhbmdlczsKLQotICB9IFRUX0dhc3BSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgIEVNQkVEREVEIEJJVE1BUFMgU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9TQml0X01ldHJpY3NSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIGhvbGQgdGhlIGJpZyBtZXRyaWNzIG9mIGEgZ2l2ZW4gZ2x5cGggYml0bWFwICAgKi8KLSAgLyogICAgaW4gYSBUcnVlVHlwZSBvciBPcGVuVHlwZSBmb250LiAgVGhlc2UgYXJlIHVzdWFsbHkgZm91bmQgaW4gdGhlICAgICovCi0gIC8qICAgIGBFQkRUJyAoTWljcm9zb2Z0KSBvciBgYmxvYycgKEFwcGxlKSB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhlaWdodCAgICAgICA6OiBUaGUgZ2x5cGggaGVpZ2h0IGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgd2lkdGggICAgICAgIDo6IFRoZSBnbHlwaCB3aWR0aCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBob3JpQmVhcmluZ1ggOjogVGhlIGhvcml6b250YWwgbGVmdCBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhvcmlCZWFyaW5nWSA6OiBUaGUgaG9yaXpvbnRhbCB0b3AgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaG9yaUFkdmFuY2UgIDo6IFRoZSBob3Jpem9udGFsIGFkdmFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0QmVhcmluZ1ggOjogVGhlIHZlcnRpY2FsIGxlZnQgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRCZWFyaW5nWSA6OiBUaGUgdmVydGljYWwgdG9wIGJlYXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydEFkdmFuY2UgIDo6IFRoZSB2ZXJ0aWNhbCBhZHZhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9NZXRyaWNzUmVjXwotICB7Ci0gICAgRlRfVVNob3J0ICBoZWlnaHQ7Ci0gICAgRlRfVVNob3J0ICB3aWR0aDsKLQotICAgIEZUX1Nob3J0ICAgaG9yaUJlYXJpbmdYOwotICAgIEZUX1Nob3J0ICAgaG9yaUJlYXJpbmdZOwotICAgIEZUX1VTaG9ydCAgaG9yaUFkdmFuY2U7Ci0KLSAgICBGVF9TaG9ydCAgIHZlcnRCZWFyaW5nWDsKLSAgICBGVF9TaG9ydCAgIHZlcnRCZWFyaW5nWTsKLSAgICBGVF9VU2hvcnQgIHZlcnRBZHZhbmNlOwotCi0gIH0gVFRfU0JpdF9NZXRyaWNzUmVjLCAqVFRfU0JpdF9NZXRyaWNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU0JpdF9TbWFsbE1ldHJpY3NSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIHRoZSBzbWFsbCBtZXRyaWNzIG9mIGEgZ2l2ZW4gZ2x5cGggYml0bWFwICovCi0gIC8qICAgIGluIGEgVHJ1ZVR5cGUgb3IgT3BlblR5cGUgZm9udC4gIFRoZXNlIGFyZSB1c3VhbGx5IGZvdW5kIGluIHRoZSAgICAqLwotICAvKiAgICBgRUJEVCcgKE1pY3Jvc29mdCkgb3IgdGhlIGBiZGF0JyAoQXBwbGUpIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZWlnaHQgICA6OiBUaGUgZ2x5cGggaGVpZ2h0IGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHdpZHRoICAgIDo6IFRoZSBnbHlwaCB3aWR0aCBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmVhcmluZ1ggOjogVGhlIGxlZnQtc2lkZSBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiZWFyaW5nWSA6OiBUaGUgdG9wLXNpZGUgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFkdmFuY2UgIDo6IFRoZSBhZHZhbmNlIHdpZHRoIG9yIGhlaWdodC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1NCaXRfU21hbGxfTWV0cmljc18KLSAgewotICAgIEZUX0J5dGUgIGhlaWdodDsKLSAgICBGVF9CeXRlICB3aWR0aDsKLQotICAgIEZUX0NoYXIgIGJlYXJpbmdYOwotICAgIEZUX0NoYXIgIGJlYXJpbmdZOwotICAgIEZUX0J5dGUgIGFkdmFuY2U7Ci0KLSAgfSBUVF9TQml0X1NtYWxsTWV0cmljc1JlYywgKlRUX1NCaXRfU21hbGxNZXRyaWNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU0JpdF9MaW5lTWV0cmljc1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBkZXNjcmliZSB0aGUgdGV4dCBsaW5lIG1ldHJpY3Mgb2YgYSBnaXZlbiAgICAgICovCi0gIC8qICAgIGJpdG1hcCBzdHJpa2UsIGZvciBlaXRoZXIgYSBob3Jpem9udGFsIG9yIHZlcnRpY2FsIGxheW91dC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFzY2VuZGVyICAgICAgICAgICAgICAgIDo6IFRoZSBhc2NlbmRlciBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVzY2VuZGVyICAgICAgICAgICAgICAgOjogVGhlIGRlc2NlbmRlciBpbiBwaXhlbHMuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhfd2lkdGggICAgICAgICAgICAgICA6OiBUaGUgbWF4aW11bSBnbHlwaCB3aWR0aCBpbiBwaXhlbHMuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcmV0X3Nsb3BlX2VudW1lcmF0b3IgIDo6IFJpc2Ugb2YgdGhlIGNhcmV0IHNsb3BlLCB0eXBpY2FsbHkgc2V0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byAxIGZvciBub24taXRhbGljIGZvbnRzLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcmV0X3Nsb3BlX2Rlbm9taW5hdG9yIDo6IFJpc2Ugb2YgdGhlIGNhcmV0IHNsb3BlLCB0eXBpY2FsbHkgc2V0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byAwIGZvciBub24taXRhbGljIGZvbnRzLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcmV0X29mZnNldCAgICAgICAgICAgIDo6IE9mZnNldCBpbiBwaXhlbHMgdG8gbW92ZSB0aGUgY2FyZXQgZm9yICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXIgcG9zaXRpb25pbmcuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbl9vcmlnaW5fU0IgICAgICAgICAgIDo6IE1pbmltdW0gb2YgaG9yaUJlYXJpbmdYIChyZXNwLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0QmVhcmluZ1kpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWluX2FkdmFuY2VfU0IgICAgICAgICAgOjogTWluaW11bSBvZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWwgYWR2YW5jZSAtICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggaG9yaUJlYXJpbmdYICsgd2lkdGggKSAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljYWwgYWR2YW5jZSAtICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB2ZXJ0QmVhcmluZ1kgKyBoZWlnaHQgKSAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heF9iZWZvcmVfQkwgICAgICAgICAgIDo6IE1heGltdW0gb2YgaG9yaUJlYXJpbmdZIChyZXNwLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0QmVhcmluZ1kpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbl9hZnRlcl9CTCAgICAgICAgICAgIDo6IE1pbmltdW0gb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3JpQmVhcmluZ1kgLSBoZWlnaHQgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydEJlYXJpbmdYIC0gd2lkdGggICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFkcyAgICAgICAgICAgICAgICAgICAgOjogVW51c2VkICh0byBtYWtlIHRoZSBzaXplIG9mIHRoZSByZWNvcmQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgbXVsdGlwbGUgb2YgMzIgYml0cy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1NCaXRfTGluZU1ldHJpY3NSZWNfCi0gIHsKLSAgICBGVF9DaGFyICBhc2NlbmRlcjsKLSAgICBGVF9DaGFyICBkZXNjZW5kZXI7Ci0gICAgRlRfQnl0ZSAgbWF4X3dpZHRoOwotICAgIEZUX0NoYXIgIGNhcmV0X3Nsb3BlX251bWVyYXRvcjsKLSAgICBGVF9DaGFyICBjYXJldF9zbG9wZV9kZW5vbWluYXRvcjsKLSAgICBGVF9DaGFyICBjYXJldF9vZmZzZXQ7Ci0gICAgRlRfQ2hhciAgbWluX29yaWdpbl9TQjsKLSAgICBGVF9DaGFyICBtaW5fYWR2YW5jZV9TQjsKLSAgICBGVF9DaGFyICBtYXhfYmVmb3JlX0JMOwotICAgIEZUX0NoYXIgIG1pbl9hZnRlcl9CTDsKLSAgICBGVF9DaGFyICBwYWRzWzJdOwotCi0gIH0gVFRfU0JpdF9MaW5lTWV0cmljc1JlYywgKlRUX1NCaXRfTGluZU1ldHJpY3M7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9TQml0X1JhbmdlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIFRydWVUeXBlL09wZW5UeXBlIHN1YkluZGV4VGFibGUgYXMgZGVmaW5lZCBpbiB0aGUgYEVCTEMnICAgICAgICAgKi8KLSAgLyogICAgKE1pY3Jvc29mdCkgb3IgYGJsb2MnIChBcHBsZSkgdGFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmlyc3RfZ2x5cGggICA6OiBUaGUgZmlyc3QgZ2x5cGggaW5kZXggaW4gdGhlIHJhbmdlLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsYXN0X2dseXBoICAgIDo6IFRoZSBsYXN0IGdseXBoIGluZGV4IGluIHRoZSByYW5nZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGluZGV4X2Zvcm1hdCAgOjogVGhlIGZvcm1hdCBvZiBpbmRleCB0YWJsZS4gIFZhbGlkIHZhbHVlcyBhcmUgMSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIHRvIDUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGltYWdlX2Zvcm1hdCAgOjogVGhlIGZvcm1hdCBvZiBgRUJEVCcgaW1hZ2UgZGF0YS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW1hZ2Vfb2Zmc2V0ICA6OiBUaGUgb2Zmc2V0IHRvIGltYWdlIGRhdGEgaW4gYEVCRFQnLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpbWFnZV9zaXplICAgIDo6IEZvciBpbmRleCBmb3JtYXRzIDIgYW5kIDUuICBUaGlzIGlzIHRoZSBzaXplIGluICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBieXRlcyBvZiBlYWNoIGdseXBoIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaWdfbWV0cmljcyAgIDo6IEZvciBpbmRleCBmb3JtYXRzIDIgYW5kIDUuICBUaGlzIGlzIHRoZSBiaWcgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBtZXRyaWNzIGZvciBlYWNoIGdseXBoIGJpdG1hcC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fZ2x5cGhzICAgIDo6IEZvciBpbmRleCBmb3JtYXRzIDQgYW5kIDUuICBUaGlzIGlzIHRoZSBudW1iZXIgb2YgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBnbHlwaHMgaW4gdGhlIGNvZGUgYXJyYXkuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9vZmZzZXRzIDo6IEZvciBpbmRleCBmb3JtYXRzIDEgYW5kIDMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2NvZGVzICAgOjogRm9yIGluZGV4IGZvcm1hdHMgNCBhbmQgNS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFibGVfb2Zmc2V0ICA6OiBUaGUgb2Zmc2V0IG9mIHRoZSBpbmRleCB0YWJsZSBpbiB0aGUgYEVCTEMnICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgdGFibGUuICBPbmx5IHVzZWQgZHVyaW5nIHN0cmlrZSBsb2FkaW5nLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1NCaXRfUmFuZ2VSZWNfCi0gIHsKLSAgICBGVF9VU2hvcnQgICAgICAgICAgIGZpcnN0X2dseXBoOwotICAgIEZUX1VTaG9ydCAgICAgICAgICAgbGFzdF9nbHlwaDsKLQotICAgIEZUX1VTaG9ydCAgICAgICAgICAgaW5kZXhfZm9ybWF0OwotICAgIEZUX1VTaG9ydCAgICAgICAgICAgaW1hZ2VfZm9ybWF0OwotICAgIEZUX1VMb25nICAgICAgICAgICAgaW1hZ2Vfb2Zmc2V0OwotCi0gICAgRlRfVUxvbmcgICAgICAgICAgICBpbWFnZV9zaXplOwotICAgIFRUX1NCaXRfTWV0cmljc1JlYyAgbWV0cmljczsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgIG51bV9nbHlwaHM7Ci0KLSAgICBGVF9VTG9uZyogICAgICAgICAgIGdseXBoX29mZnNldHM7Ci0gICAgRlRfVVNob3J0KiAgICAgICAgICBnbHlwaF9jb2RlczsKLQotICAgIEZUX1VMb25nICAgICAgICAgICAgdGFibGVfb2Zmc2V0OwotCi0gIH0gVFRfU0JpdF9SYW5nZVJlYywgKlRUX1NCaXRfUmFuZ2U7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9TQml0X1N0cmlrZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIGRlc2NyaWJlIGEgZ2l2ZW4gYml0bWFwIHN0cmlrZSBpbiB0aGUgYEVCTEMnICAgICAgKi8KLSAgLyogICAgKE1pY3Jvc29mdCkgb3IgYGJsb2MnIChBcHBsZSkgdGFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBudW1faW5kZXhfcmFuZ2VzIDo6IFRoZSBudW1iZXIgb2YgaW5kZXggcmFuZ2VzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGluZGV4X3JhbmdlcyAgICAgOjogQW4gYXJyYXkgb2YgZ2x5cGggaW5kZXggcmFuZ2VzLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgY29sb3JfcmVmICAgICAgICA6OiBVbnVzZWQuICBgY29sb3JfcmVmJyBpcyBwdXQgaW4gZm9yIGZ1dHVyZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgZW5oYW5jZW1lbnRzLCBidXQgdGhlc2UgZmllbGRzIGFyZSBhbHJlYWR5ICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGluIHVzZSBieSBvdGhlciBwbGF0Zm9ybXMgKGUuZy4gTmV3dG9uKS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBGb3IgZGV0YWlscywgcGxlYXNlIHNlZSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2ZvbnRzL1RydWVUeXBlLVJlZmVyZW5jZS1NYW51YWwvUk0wNi9DaGFwNmJsb2MuaHRtbCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBob3JpICAgICAgICAgICAgIDo6IFRoZSBsaW5lIG1ldHJpY3MgZm9yIGhvcml6b250YWwgbGF5b3V0cy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHZlcnQgICAgICAgICAgICAgOjogVGhlIGxpbmUgbWV0cmljcyBmb3IgdmVydGljYWwgbGF5b3V0cy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgc3RhcnRfZ2x5cGggICAgICA6OiBUaGUgbG93ZXN0IGdseXBoIGluZGV4IGZvciB0aGlzIHN0cmlrZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBlbmRfZ2x5cGggICAgICAgIDo6IFRoZSBoaWdoZXN0IGdseXBoIGluZGV4IGZvciB0aGlzIHN0cmlrZS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHhfcHBlbSAgICAgICAgICAgOjogVGhlIG51bWJlciBvZiBob3Jpem9udGFsIHBpeGVscyBwZXIgRU0uICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeV9wcGVtICAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIHZlcnRpY2FsIHBpeGVscyBwZXIgRU0uICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBiaXRfZGVwdGggICAgICAgIDo6IFRoZSBiaXQgZGVwdGguICBWYWxpZCB2YWx1ZXMgYXJlIDEsIDIsIDQsICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBhbmQgOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmbGFncyAgICAgICAgICAgIDo6IElzIHRoaXMgYSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIHN0cmlrZT8gIEZvciAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzLCBwbGVhc2Ugc2VlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL2ZvbnRzL1RydWVUeXBlLVJlZmVyZW5jZS1NYW51YWwvUk0wNi9DaGFwNmJsb2MuaHRtbCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1NCaXRfU3RyaWtlUmVjXwotICB7Ci0gICAgRlRfSW50ICAgICAgICAgICAgICAgICAgbnVtX3JhbmdlczsKLSAgICBUVF9TQml0X1JhbmdlICAgICAgICAgICBzYml0X3JhbmdlczsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgICByYW5nZXNfb2Zmc2V0OwotCi0gICAgRlRfVUxvbmcgICAgICAgICAgICAgICAgY29sb3JfcmVmOwotCi0gICAgVFRfU0JpdF9MaW5lTWV0cmljc1JlYyAgaG9yaTsKLSAgICBUVF9TQml0X0xpbmVNZXRyaWNzUmVjICB2ZXJ0OwotCi0gICAgRlRfVVNob3J0ICAgICAgICAgICAgICAgc3RhcnRfZ2x5cGg7Ci0gICAgRlRfVVNob3J0ICAgICAgICAgICAgICAgZW5kX2dseXBoOwotCi0gICAgRlRfQnl0ZSAgICAgICAgICAgICAgICAgeF9wcGVtOwotICAgIEZUX0J5dGUgICAgICAgICAgICAgICAgIHlfcHBlbTsKLQotICAgIEZUX0J5dGUgICAgICAgICAgICAgICAgIGJpdF9kZXB0aDsKLSAgICBGVF9DaGFyICAgICAgICAgICAgICAgICBmbGFnczsKLQotICB9IFRUX1NCaXRfU3RyaWtlUmVjLCAqVFRfU0JpdF9TdHJpa2U7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9TQml0X0NvbXBvbmVudFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHNpbXBsZSBzdHJ1Y3R1cmUgdG8gZGVzY3JpYmUgYSBjb21wb3VuZCBzYml0IGVsZW1lbnQuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9jb2RlIDo6IFRoZSBlbGVtZW50J3MgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHhfb2Zmc2V0ICAgOjogVGhlIGVsZW1lbnQncyBsZWZ0IGJlYXJpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeV9vZmZzZXQgICA6OiBUaGUgZWxlbWVudCdzIHRvcCBiZWFyaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9Db21wb25lbnRSZWNfCi0gIHsKLSAgICBGVF9VU2hvcnQgIGdseXBoX2NvZGU7Ci0gICAgRlRfQ2hhciAgICB4X29mZnNldDsKLSAgICBGVF9DaGFyICAgIHlfb2Zmc2V0OwotCi0gIH0gVFRfU0JpdF9Db21wb25lbnRSZWMsICpUVF9TQml0X0NvbXBvbmVudDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NCaXRfU2NhbGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgZGVzY3JpYmUgYSBnaXZlbiBiaXRtYXAgc2NhbGluZyB0YWJsZSwgYXMgZGVmaW5lZCAqLwotICAvKiAgICBpbiB0aGUgYEVCU0MnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBob3JpICAgICAgICAgICAgICA6OiBUaGUgaG9yaXpvbnRhbCBsaW5lIG1ldHJpY3MuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnQgICAgICAgICAgICAgIDo6IFRoZSB2ZXJ0aWNhbCBsaW5lIG1ldHJpY3MuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeF9wcGVtICAgICAgICAgICAgOjogVGhlIG51bWJlciBvZiBob3Jpem9udGFsIHBpeGVscyBwZXIgRU0uICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5X3BwZW0gICAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIHZlcnRpY2FsIHBpeGVscyBwZXIgRU0uICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHhfcHBlbV9zdWJzdGl0dXRlIDo6IFN1YnN0aXR1dGlvbiB4X3BwZW0gdmFsdWUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeV9wcGVtX3N1YnN0aXR1dGUgOjogU3Vic3RpdHV0aW9uIHlfcHBlbSB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfU0JpdF9TY2FsZVJlY18KLSAgewotICAgIFRUX1NCaXRfTGluZU1ldHJpY3NSZWMgIGhvcmk7Ci0gICAgVFRfU0JpdF9MaW5lTWV0cmljc1JlYyAgdmVydDsKLQotICAgIEZUX0J5dGUgICAgICAgICAgICAgICAgIHhfcHBlbTsKLSAgICBGVF9CeXRlICAgICAgICAgICAgICAgICB5X3BwZW07Ci0KLSAgICBGVF9CeXRlICAgICAgICAgICAgICAgICB4X3BwZW1fc3Vic3RpdHV0ZTsKLSAgICBGVF9CeXRlICAgICAgICAgICAgICAgICB5X3BwZW1fc3Vic3RpdHV0ZTsKLQotICB9IFRUX1NCaXRfU2NhbGVSZWMsICpUVF9TQml0X1NjYWxlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgUE9TVFNDUklQVCBHTFlQSCBOQU1FUyBTVVBQT1JUICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfUG9zdF8yMFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUG9zdHNjcmlwdCBuYW1lcyBzdWItdGFibGUsIGZvcm1hdCAyLjAuICBTdG9yZXMgdGhlIFBTIG5hbWUgb2YgICAgICovCi0gIC8qICAgIGVhY2ggZ2x5cGggaW4gdGhlIGZvbnQgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9nbHlwaHMgICAgOjogVGhlIG51bWJlciBvZiBuYW1lZCBnbHlwaHMgaW4gdGhlIHRhYmxlLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX25hbWVzICAgICA6OiBUaGUgbnVtYmVyIG9mIFBTIG5hbWVzIHN0b3JlZCBpbiB0aGUgdGFibGUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9pbmRpY2VzIDo6IFRoZSBpbmRpY2VzIG9mIHRoZSBnbHlwaHMgaW4gdGhlIG5hbWVzIGFycmF5cy4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX25hbWVzICAgOjogVGhlIFBTIG5hbWVzIG5vdCBpbiBNYWMgRW5jb2RpbmcuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1Bvc3RfMjBSZWNfCi0gIHsKLSAgICBGVF9VU2hvcnQgICBudW1fZ2x5cGhzOwotICAgIEZUX1VTaG9ydCAgIG51bV9uYW1lczsKLSAgICBGVF9VU2hvcnQqICBnbHlwaF9pbmRpY2VzOwotICAgIEZUX0NoYXIqKiAgIGdseXBoX25hbWVzOwotCi0gIH0gVFRfUG9zdF8yMFJlYywgKlRUX1Bvc3RfMjA7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Qb3N0XzI1UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQb3N0c2NyaXB0IG5hbWVzIHN1Yi10YWJsZSwgZm9ybWF0IDIuNS4gIFN0b3JlcyB0aGUgUFMgbmFtZSBvZiAgICAgKi8KLSAgLyogICAgZWFjaCBnbHlwaCBpbiB0aGUgZm9udCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2dseXBocyA6OiBUaGUgbnVtYmVyIG9mIGdseXBocyBpbiB0aGUgdGFibGUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvZmZzZXRzICAgIDo6IEFuIGFycmF5IG9mIHNpZ25lZCBvZmZzZXRzIGluIGEgbm9ybWFsIE1hYyAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBQb3N0c2NyaXB0IG5hbWUgZW5jb2RpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfUG9zdF8yNV8KLSAgewotICAgIEZUX1VTaG9ydCAgbnVtX2dseXBoczsKLSAgICBGVF9DaGFyKiAgIG9mZnNldHM7Ci0KLSAgfSBUVF9Qb3N0XzI1UmVjLCAqVFRfUG9zdF8yNTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1Bvc3RfTmFtZXNSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBvc3RzY3JpcHQgbmFtZXMgdGFibGUsIGVpdGhlciBmb3JtYXQgMi4wIG9yIDIuNS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRlZCAgICA6OiBBIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgUFMgbmFtZXMgYXJlIGxvYWRlZC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9ybWF0XzIwIDo6IFRoZSBzdWItdGFibGUgdXNlZCBmb3IgZm9ybWF0IDIuMC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb3JtYXRfMjUgOjogVGhlIHN1Yi10YWJsZSB1c2VkIGZvciBmb3JtYXQgMi41LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9Qb3N0X05hbWVzUmVjXwotICB7Ci0gICAgRlRfQm9vbCAgbG9hZGVkOwotCi0gICAgdW5pb24KLSAgICB7Ci0gICAgICBUVF9Qb3N0XzIwUmVjICBmb3JtYXRfMjA7Ci0gICAgICBUVF9Qb3N0XzI1UmVjICBmb3JtYXRfMjU7Ci0KLSAgICB9IG5hbWVzOwotCi0gIH0gVFRfUG9zdF9OYW1lc1JlYywgKlRUX1Bvc3RfTmFtZXM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgIEdYIFZBUklBVElPTiBUQUJMRSBTVVBQT1JUICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgdHlwZWRlZiBzdHJ1Y3QgR1hfQmxlbmRSZWNfICAqR1hfQmxlbmQ7Ci0jZW5kaWYKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgIEVNQkVEREVEIEJERiBQUk9QRVJUSUVTIFRBQkxFIFNVUFBPUlQgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoKLSAgICogVGhlc2UgdHlwZXMgYXJlIHVzZWQgdG8gc3VwcG9ydCBhIGBCREYgJyB0YWJsZSB0aGF0IGlzbid0IHBhcnQgb2YgdGhlCi0gICAqIG9mZmljaWFsIFRydWVUeXBlIHNwZWNpZmljYXRpb24uICBJdCBpcyBtYWlubHkgdXNlZCBpbiBTRk5ULWJhc2VkCi0gICAqIGJpdG1hcCBmb250cyB0aGF0IHdlcmUgZ2VuZXJhdGVkIGZyb20gYSBzZXQgb2YgQkRGIGZvbnRzLgotICAgKgotICAgKiBUaGUgZm9ybWF0IG9mIHRoZSB0YWJsZSBpcyBhcyBmb2xsb3dzLgotICAgKgotICAgKiAgIFVTSE9SVCAgIHZlcnNpb24gICAgICBgQkRGICcgdGFibGUgdmVyc2lvbiBudW1iZXIsIHNob3VsZCBiZSAweDAwMDEuCi0gICAqICAgVVNIT1JUICAgc3RyaWtlQ291bnQgIE51bWJlciBvZiBzdHJpa2VzIChiaXRtYXAgc2l6ZXMpIGluIHRoaXMgdGFibGUuCi0gICAqICAgVUxPTkcgICAgc3RyaW5nVGFibGUgIE9mZnNldCAoZnJvbSBzdGFydCBvZiBCREYgdGFibGUpIHRvIHN0cmluZwotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS4KLSAgICoKLSAgICogVGhpcyBpcyBmb2xsb3dlZCBieSBhbiBhcnJheSBvZiBgc3RyaWtlQ291bnQnIGRlc2NyaXB0b3JzLCBoYXZpbmcgdGhlCi0gICAqIGZvbGxvd2luZyBmb3JtYXQuCi0gICAqCi0gICAqICAgVVNIT1JUICAgcHBlbSAgICAgICAgIFZlcnRpY2FsIHBpeGVscyBwZXIgRU0gZm9yIHRoaXMgc3RyaWtlLgotICAgKiAgIFVTSE9SVCAgIG51bUl0ZW1zICAgICBOdW1iZXIgb2YgaXRlbXMgZm9yIHRoaXMgc3RyaWtlIChwcm9wZXJ0aWVzIGFuZAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBhdG9tcykuICBNYXhpbXVtIGlzIDI1NS4KLSAgICoKLSAgICogVGhpcyBhcnJheSBpbiB0dXJuIGlzIGZvbGxvd2VkIGJ5IGBzdHJpa2VDb3VudCcgdmFsdWUgc2V0cy4gIEVhY2gKLSAgICogYHZhbHVlIHNldCcgaXMgYW4gYXJyYXkgb2YgYG51bUl0ZW1zJyBpdGVtcyB3aXRoIHRoZSBmb2xsb3dpbmcgZm9ybWF0LgotICAgKgotICAgKiAgIFVMT05HICAgIGl0ZW1fbmFtZSAgICBPZmZzZXQgaW4gc3RyaW5nIHRhYmxlIHRvIGl0ZW0gbmFtZS4KLSAgICogICBVU0hPUlQgICBpdGVtX3R5cGUgICAgVGhlIGl0ZW0gdHlwZS4gIFBvc3NpYmxlIHZhbHVlcyBhcmUKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA9PiBzdHJpbmcgKGUuZy4sIENPTU1FTlQpCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPT4gYXRvbSAgIChlLmcuLCBGT05UIG9yIGV2ZW4gU0laRSkKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgMiA9PiBpbnQzMgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzID0+IHVpbnQzMgotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAweDEwID0+IEEgZmxhZyB0byBpbmRpY2F0ZSBhIHByb3BlcnRpZXMuICBUaGlzCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgT1JlZCB3aXRoIHRoZSBhYm92ZSB2YWx1ZXMuCi0gICAqICAgVUxPTkcgICAgaXRlbV92YWx1ZSAgIEZvciBzdHJpbmdzICA9PiBPZmZzZXQgaW50byBzdHJpbmcgdGFibGUgd2l0aG91dAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgZG91YmxlIHF1b3Rlcy4KLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGF0b21zICAgID0+IE9mZnNldCBpbnRvIHN0cmluZyB0YWJsZS4KLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGludGVnZXJzID0+IERpcmVjdCB2YWx1ZS4KLSAgICoKLSAgICogQWxsIHN0cmluZ3MgaW4gdGhlIHN0cmluZyB0YWJsZSBjb25zaXN0IG9mIGJ5dGVzIGFuZCBhcmUKLSAgICogemVyby10ZXJtaW5hdGVkLgotICAgKgotICAgKi8KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fQkRGCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0JERlJlY18KLSAgewotICAgIEZUX0J5dGUqICAgdGFibGU7Ci0gICAgRlRfQnl0ZSogICB0YWJsZV9lbmQ7Ci0gICAgRlRfQnl0ZSogICBzdHJpbmdzOwotICAgIEZUX1VMb25nICAgc3RyaW5nc19zaXplOwotICAgIEZUX1VJbnQgICAgbnVtX3N0cmlrZXM7Ci0gICAgRlRfQm9vbCAgICBsb2FkZWQ7Ci0KLSAgfSBUVF9CREZSZWMsICpUVF9CREY7Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX0JERiAqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgICAgICAgICAgICAgICAgIE9SSUdJTkFMIFRUX0ZBQ0UgQ0xBU1MgREVGSU5JVElPTiAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBzdHJ1Y3R1cmUvY2xhc3MgaXMgZGVmaW5lZCBoZXJlIGJlY2F1c2UgaXQgaXMgY29tbW9uIHRvIHRoZSAgICAgICovCi0gIC8qIGZvbGxvd2luZyBmb3JtYXRzOiBUVEYsIE9wZW5UeXBlLVRULCBhbmQgT3BlblR5cGUtQ0ZGLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSwgaG93ZXZlciwgdGhhdCB0aGUgY2xhc3NlcyBUVF9TaXplIGFuZCBUVF9HbHlwaFNsb3QgYXJlIG5vdCAgICAgICovCi0gIC8qIHNoYXJlZCBiZXR3ZWVuIGZvbnQgZHJpdmVycywgYW5kIGFyZSB0aHVzIGRlZmluZWQgaW4gYHR0b2Jqcy5oJy4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIFRydWVUeXBlIGZhY2UvZm9udCBvYmplY3QuICBBIFRUX0ZhY2UgZW5jYXBzdWxhdGVzICAgKi8KLSAgLyogICAgdGhlIHJlc29sdXRpb24gYW5kIHNjYWxpbmcgaW5kZXBlbmRlbnQgcGFydHMgb2YgYSBUcnVlVHlwZSBmb250ICAgICovCi0gIC8qICAgIHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBUVF9GYWNlIHN0cnVjdHVyZSBpcyBhbHNvIHVzZWQgYXMgYSBgcGFyZW50IGNsYXNzJyBmb3IgdGhlICAgICAqLwotICAvKiAgICBPcGVuVHlwZS1DRkYgY2xhc3MgKFQyX0ZhY2UpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IFRUX0ZhY2VSZWNfKiAgVFRfRmFjZTsKLQotCi0gIC8qIGEgZnVuY3Rpb24gdHlwZSB1c2VkIGZvciB0aGUgdHJ1ZXR5cGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgaG9va3MgKi8KLSAgdHlwZWRlZiBGVF9FcnJvcgotICAoKlRUX0ludGVycHJldGVyKSggdm9pZCogIGV4ZWNfY29udGV4dCApOwotCi0gIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgVFRfTG9hZGVyUmVjXyogIFRUX0xvYWRlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0xvYWRlcl9Hb3RvVGFibGVGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZWtzIGEgc3RyZWFtIHRvIHRoZSBzdGFydCBvZiBhIGdpdmVuIFRydWVUeXBlIHRhYmxlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFnICAgIDo6IEEgNC1ieXRlIHRhZyB1c2VkIHRvIG5hbWUgdGhlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZW5ndGggOjogVGhlIGxlbmd0aCBvZiB0aGUgdGFibGUgaW4gYnl0ZXMuICBTZXQgdG8gMCBpZiBub3QgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIG5lZWRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIHN0cmVhbSBjdXJzb3IgbXVzdCBiZSBhdCB0aGUgZm9udCBmaWxlJ3Mgb3JpZ2luLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfTG9hZGVyX0dvdG9UYWJsZUZ1bmMpKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICBsZW5ndGggKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0xvYWRlcl9TdGFydEdseXBoRnVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNlZWtzIGEgc3RyZWFtIHRvIHRoZSBzdGFydCBvZiBhIGdpdmVuIGdseXBoIGVsZW1lbnQsIGFuZCBvcGVucyBhICAqLwotICAvKiAgICBmcmFtZSBmb3IgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkZXIgICAgICA6OiBUaGUgY3VycmVudCBUcnVlVHlwZSBnbHlwaCBsb2FkZXIgb2JqZWN0LiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoIGluZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgZ2x5cGggdG8gYWNjZXNzLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2Zmc2V0ICAgICAgOjogVGhlIG9mZnNldCBvZiB0aGUgZ2x5cGggYWNjb3JkaW5nIHRvIHRoZSAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGBsb2NhdGlvbnMnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnl0ZV9jb3VudCAgOjogVGhlIHNpemUgb2YgdGhlIGZyYW1lIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBub3JtYWxseSBlcXVpdmFsZW50IHRvIEZUX1NUUkVBTV9TRUVLKG9mZnNldCkgICAgICovCi0gIC8qICAgIGZvbGxvd2VkIGJ5IEZUX0ZSQU1FX0VOVEVSKGJ5dGVfY291bnQpIHdpdGggdGhlIGxvYWRlcidzIHN0cmVhbSwgICAqLwotICAvKiAgICBidXQgYWx0ZXJuYXRpdmUgZm9ybWF0cyAoZS5nLiBjb21wcmVzc2VkIG9uZXMpIG1pZ2h0IHVzZSBzb21ldGhpbmcgKi8KLSAgLyogICAgZGlmZmVyZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfTG9hZGVyX1N0YXJ0R2x5cGhGdW5jKSggVFRfTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGJ5dGVfY291bnQgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmNUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0xvYWRlcl9SZWFkR2x5cGhGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlYWRzIG9uZSBnbHlwaCBlbGVtZW50IChpdHMgaGVhZGVyLCBhIHNpbXBsZSBnbHlwaCwgb3IgYSAgICAgICAgICAqLwotICAvKiAgICBjb21wb3NpdGUpIGZyb20gdGhlIGxvYWRlcidzIGN1cnJlbnQgc3RyZWFtIGZyYW1lLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkZXIgOjogVGhlIGN1cnJlbnQgVHJ1ZVR5cGUgZ2x5cGggbG9hZGVyIG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfRXJyb3IKLSAgKCpUVF9Mb2FkZXJfUmVhZEdseXBoRnVuYykoIFRUX0xvYWRlciAgbG9hZGVyICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jVHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkZXJfRW5kR2x5cGhGdW5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDbG9zZXMgdGhlIGN1cnJlbnQgbG9hZGVyIHN0cmVhbSBmcmFtZSBmb3IgdGhlIGdseXBoLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkZXIgOjogVGhlIGN1cnJlbnQgVHJ1ZVR5cGUgZ2x5cGggbG9hZGVyIG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZAotICAoKlRUX0xvYWRlcl9FbmRHbHlwaEZ1bmMpKCBUVF9Mb2FkZXIgIGxvYWRlciApOwotCi0KLSAgdHlwZWRlZiBlbnVtIFRUX1NiaXRUYWJsZVR5cGVfCi0gIHsKLSAgICBUVF9TQklUX1RBQkxFX1RZUEVfTk9ORSA9IDAsCi0gICAgVFRfU0JJVF9UQUJMRV9UWVBFX0VCTEMsIC8qIGBFQkxDJyAoTWljcm9zb2Z0KSwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYGJsb2MnIChBcHBsZSkgICAgICAqLwotICAgIFRUX1NCSVRfVEFCTEVfVFlQRV9DQkxDLCAvKiBgQ0JMQycgKEdvb2dsZSkgICAgICovCi0gICAgVFRfU0JJVF9UQUJMRV9UWVBFX1NCSVgsIC8qIGBzYml4JyAoQXBwbGUpICAgICAgKi8KLQotICAgIC8qIGRvIG5vdCByZW1vdmUgKi8KLSAgICBUVF9TQklUX1RBQkxFX1RZUEVfTUFYCi0KLSAgfSBUVF9TYml0VGFibGVUeXBlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlVHlwZSBGYWNlIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9GYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgVHJ1ZVR5cGUgZmFjZSBjbGFzcy4gIFRoZXNlIG9iamVjdHMgbW9kZWwgdGhlIHJlc29sdXRpb24gYW5kICAgKi8KLSAgLyogICAgcG9pbnQtc2l6ZSBpbmRlcGVuZGVudCBkYXRhIGZvdW5kIGluIGEgVHJ1ZVR5cGUgZm9udCBmaWxlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcm9vdCAgICAgICAgICAgICAgICAgOjogVGhlIGJhc2UgRlRfRmFjZSBzdHJ1Y3R1cmUsIG1hbmFnZWQgYnkgdGhlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgbGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRjX2hlYWRlciAgICAgICAgICAgOjogVGhlIFRydWVUeXBlIGNvbGxlY3Rpb24gaGVhZGVyLCB1c2VkIHdoZW4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaWxlIGlzIGEgYHR0YycgcmF0aGVyIHRoYW4gYSBgdHRmJy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3Igb3JkaW5hcnkgZm9udCBmaWxlcywgdGhlIGZpZWxkICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgYHR0Y19oZWFkZXIuY291bnQnIGlzIHNldCB0byAwLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb3JtYXRfdGFnICAgICAgICAgICA6OiBUaGUgZm9udCBmb3JtYXQgdGFnLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV90YWJsZXMgICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgVHJ1ZVR5cGUgdGFibGVzIGluIHRoaXMgZm9udCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRpcl90YWJsZXMgICAgICAgICAgIDo6IFRoZSBkaXJlY3Rvcnkgb2YgVHJ1ZVR5cGUgdGFibGVzIGZvciB0aGlzICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250IGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhlYWRlciAgICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgZm9udCBoZWFkZXIgKGBoZWFkJyB0YWJsZSkuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkIG9uIGZvbnQgb3BlbmluZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhvcml6b250YWwgICAgICAgICAgIDo6IFRoZSBmb250J3MgaG9yaXpvbnRhbCBoZWFkZXIgKGBoaGVhJyAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSkuICBUaGlzIGZpZWxkIGFsc28gY29udGFpbnMgdGhlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCBob3Jpem9udGFsIG1ldHJpY3MgdGFibGUgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIChgaG10eCcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4X3Byb2ZpbGUgICAgICAgICAgOjogVGhlIGZvbnQncyBtYXhpbXVtIHByb2ZpbGUgdGFibGUuICBSZWFkIG9uICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgb3BlbmluZy4gIE5vdGUgdGhhdCBzb21lIG1heGltdW0gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgY2Fubm90IGJlIHRha2VuIGRpcmVjdGx5IGZyb20gdGhpcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuICBXZSB0aHVzIGRlZmluZSBhZGRpdGlvbmFsIGZpZWxkcyAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlbG93IHRvIGhvbGQgdGhlIGNvbXB1dGVkIG1heGltYS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydGljYWxfaW5mbyAgICAgICAgOjogQSBib29sZWFuIHdoaWNoIGlzIHNldCB3aGVuIHRoZSBmb250IGZpbGUgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHZlcnRpY2FsIG1ldHJpY3MuICBJZiBub3QsIHRoZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiB0aGUgYHZlcnRpY2FsJyBmaWVsZCBpcyAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJ0aWNhbCAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIHZlcnRpY2FsIGhlYWRlciAoYHZoZWEnIHRhYmxlKS4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBmaWVsZCBhbHNvIGNvbnRhaW5zIHRoZSBhc3NvY2lhdGVkICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsIG1ldHJpY3MgdGFibGUgKGB2bXR4JyksIGlmIGZvdW5kLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTVBPUlRBTlQ6IFRoZSBjb250ZW50cyBvZiB0aGlzIGZpZWxkIGlzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkIGlmIHRoZSBgdmVydGljYWxfaW5mbycgZmllbGQgaXMgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX25hbWVzICAgICAgICAgICAgOjogVGhlIG51bWJlciBvZiBuYW1lIHJlY29yZHMgd2l0aGluIHRoaXMgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbmFtZV90YWJsZSAgICAgICAgICAgOjogVGhlIHRhYmxlIG9mIG5hbWUgcmVjb3JkcyAoYG5hbWUnKS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvczIgICAgICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIE9TLzIgdGFibGUgKGBPUy8yJykuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvc3RzY3JpcHQgICAgICAgICAgIDo6IFRoZSBmb250J3MgUG9zdFNjcmlwdCB0YWJsZSAoYHBvc3QnICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSkuICBUaGUgUG9zdFNjcmlwdCBnbHlwaCBuYW1lcyBhcmUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGxvYWRlZCBieSB0aGUgZHJpdmVyIG9uIGZhY2Ugb3BlbmluZy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSB0aGUgYHR0cG9zdCcgbW9kdWxlIGZvciBtb3JlIGRldGFpbHMuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY21hcF90YWJsZSAgICAgICAgICAgOjogQWRkcmVzcyBvZiB0aGUgZmFjZSdzIGBjbWFwJyBTRk5UIHRhYmxlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIG1lbW9yeSAoaXQncyBhbiBleHRyYWN0ZWQgZnJhbWUpLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY21hcF9zaXplICAgICAgICAgICAgOjogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGBjbWFwX3RhYmxlJyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlZCBhYm92ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ290b190YWJsZSAgICAgICAgICAgOjogQSBmdW5jdGlvbiBjYWxsZWQgYnkgZWFjaCBUcnVlVHlwZSB0YWJsZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlciB0byBwb3NpdGlvbiBhIHN0cmVhbSdzIGN1cnNvciB0byAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RhcnQgb2YgYSBnaXZlbiB0YWJsZSBhY2NvcmRpbmcgdG8gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRzIHRhZy4gIEl0IGRlZmF1bHRzIHRvIFRUX0dvdG9fRmFjZSBidXQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBkaWZmZXJlbnQgZm9yIHN0cmFuZ2UgZm9ybWF0cyAoZS5nLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIDQyKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFjY2Vzc19nbHlwaF9mcmFtZSAgIDo6IEEgZnVuY3Rpb24gdXNlZCB0byBhY2Nlc3MgdGhlIGZyYW1lIG9mIGEgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiBnbHlwaCB3aXRoaW4gdGhlIGZhY2UncyBmb250IGZpbGUuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZvcmdldF9nbHlwaF9mcmFtZSAgIDo6IEEgZnVuY3Rpb24gdXNlZCB0byBmb3JnZXQgdGhlIGZyYW1lIG9mIGEgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiBnbHlwaCB3aGVuIGFsbCBkYXRhIGhhcyBiZWVuIGxvYWRlZC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJlYWRfZ2x5cGhfaGVhZGVyICAgIDo6IEEgZnVuY3Rpb24gdXNlZCB0byByZWFkIGEgZ2x5cGggaGVhZGVyLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBtdXN0IGJlIGNhbGxlZCBiZXR3ZWVuIGFuIGBhY2Nlc3MnIGFuZCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgYGZvcmdldCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByZWFkX3NpbXBsZV9nbHlwaCAgICA6OiBBIGZ1bmN0aW9uIHVzZWQgdG8gcmVhZCBhIHNpbXBsZSBnbHlwaC4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGhlYWRlciB3YXMgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQsIGFuZCBiZWZvcmUgdGhlIGBmb3JnZXQnLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmVhZF9jb21wb3NpdGVfZ2x5cGggOjogQSBmdW5jdGlvbiB1c2VkIHRvIHJlYWQgYSBjb21wb3NpdGUgZ2x5cGguICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0IG11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBoZWFkZXIgd2FzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkLCBhbmQgYmVmb3JlIHRoZSBgZm9yZ2V0Jy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNmbnQgICAgICAgICAgICAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgU0ZOVCBzZXJ2aWNlLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcHNuYW1lcyAgICAgICAgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBQb3N0U2NyaXB0IG5hbWVzIHNlcnZpY2UuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoZG14ICAgICAgICAgICAgICAgICA6OiBUaGUgZmFjZSdzIGhvcml6b250YWwgZGV2aWNlIG1ldHJpY3MgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGBoZG14JyB0YWJsZSkuICBUaGlzIHRhYmxlIGlzIG9wdGlvbmFsIGluICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlL09wZW5UeXBlIGZvbnRzLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2FzcCAgICAgICAgICAgICAgICAgOjogVGhlIGdyaWQtZml0dGluZyBhbmQgc2NhbGluZyBwcm9wZXJ0aWVzICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlIChgZ2FzcCcpLiAgVGhpcyB0YWJsZSBpcyBvcHRpb25hbCBpbiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcnVlVHlwZS9PcGVuVHlwZSBmb250cy4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBjbHQgICAgICAgICAgICAgICAgIDo6IFRoZSBgcGNsdCcgU0ZOVCB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX3NiaXRfc2NhbGVzICAgICAgOjogVGhlIG51bWJlciBvZiBzYml0IHNjYWxlcyBmb3IgdGhpcyBmb250LiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzYml0X3NjYWxlcyAgICAgICAgICA6OiBBcnJheSBvZiBzYml0IHNjYWxlcyBlbWJlZGRlZCBpbiB0aGlzICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC4gIFRoaXMgdGFibGUgaXMgb3B0aW9uYWwgaW4gYSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWVUeXBlL09wZW5UeXBlIGZvbnQuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9zdHNjcmlwdF9uYW1lcyAgICAgOjogQSB0YWJsZSB1c2VkIHRvIHN0b3JlIHRoZSBQb3N0c2NyaXB0IG5hbWVzICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mICB0aGUgZ2x5cGhzIGZvciB0aGlzIGZvbnQuICBTZWUgdGhlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlICBgdHRjb25maWcuaCcgZm9yIGNvbW1lbnRzIG9uIHRoZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTIG9wdGlvbi4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fbG9jYXRpb25zICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGdseXBoIGxvY2F0aW9ucyBpbiB0aGlzICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZVR5cGUgZmlsZS4gIFRoaXMgc2hvdWxkIGJlICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWNhbCB0byB0aGUgbnVtYmVyIG9mIGdseXBocy4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZ25vcmVkIGZvciBUeXBlIDIgZm9udHMuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoX2xvY2F0aW9ucyAgICAgIDo6IEFuIGFycmF5IG9mIGxvbmdzLiAgVGhlc2UgYXJlIG9mZnNldHMgdG8gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaCBkYXRhIHdpdGhpbiB0aGUgYGdseWYnIHRhYmxlLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgSWdub3JlZCBmb3IgVHlwZSAyIGZvbnQgZmFjZXMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlmX2xlbiAgICAgICAgICAgICA6OiBUaGUgbGVuZ3RoIG9mIHRoZSBgZ2x5ZicgdGFibGUuICBOZWVkZWQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1hbGZvcm1lZCBgbG9jYScgdGFibGVzLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmb250X3Byb2dyYW1fc2l6ZSAgICA6OiBTaXplIGluIGJ5dGVjb2RlcyBvZiB0aGUgZmFjZSdzIGZvbnQgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS4gIDAgaWYgbm9uZSBkZWZpbmVkLiAgSWdub3JlZCBmb3IgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgMiBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZm9udF9wcm9ncmFtICAgICAgICAgOjogVGhlIGZhY2UncyBmb250IHByb2dyYW0gKGJ5dGVjb2RlIHN0cmVhbSkgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkIGF0IGxvYWQgdGltZSwgYWxzbyB1c2VkIGR1cmluZyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaCByZW5kZXJpbmcuICBDb21lcyBmcm9tIHRoZSBgZnBnbScgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuICBJZ25vcmVkIGZvciBUeXBlIDIgZm9udCBmb250cy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjdnRfcHJvZ3JhbV9zaXplICAgICA6OiBUaGUgc2l6ZSBpbiBieXRlY29kZXMgb2YgdGhlIGZhY2UncyBjdnQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbS4gIElnbm9yZWQgZm9yIFR5cGUgMiBmb250cy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjdnRfcHJvZ3JhbSAgICAgICAgICA6OiBUaGUgZmFjZSdzIGN2dCBwcm9ncmFtIChieXRlY29kZSBzdHJlYW0pICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZWQgZWFjaCB0aW1lIGFuIGluc3RhbmNlL3NpemUgaXMgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQvcmVzZXQuICBDb21lcyBmcm9tIHRoZSBgcHJlcCcgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS4gIElnbm9yZWQgZm9yIFR5cGUgMiBmb250cy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN2dF9zaXplICAgICAgICAgICAgIDo6IFNpemUgb2YgdGhlIGNvbnRyb2wgdmFsdWUgdGFibGUgKGluICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzKS4gICBJZ25vcmVkIGZvciBUeXBlIDIgZm9udHMuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN2dCAgICAgICAgICAgICAgICAgIDo6IFRoZSBmYWNlJ3Mgb3JpZ2luYWwgY29udHJvbCB2YWx1ZSB0YWJsZS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb29yZGluYXRlcyBhcmUgZXhwcmVzc2VkIGluIHVuc2NhbGVkIGZvbnQgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHMuICBDb21lcyBmcm9tIHRoZSBgY3Z0ICcgdGFibGUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIElnbm9yZWQgZm9yIFR5cGUgMiBmb250cy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2tlcm5fcGFpcnMgICAgICAgOjogVGhlIG51bWJlciBvZiBrZXJuaW5nIHBhaXJzIHByZXNlbnQgaW4gdGhlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQgZmlsZS4gIFRoZSBlbmdpbmUgb25seSBsb2FkcyB0aGUgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCBob3Jpem9udGFsIGZvcm1hdCAwIGtlcm4gdGFibGUgaXQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluZHMgaW4gdGhlIGZvbnQgZmlsZS4gIElnbm9yZWQgZm9yICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgMiBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAga2Vybl90YWJsZV9pbmRleCAgICAgOjogVGhlIGluZGV4IG9mIHRoZSBrZXJuaW5nIHRhYmxlIGluIHRoZSBmb250ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5pbmcgZGlyZWN0b3J5LiAgSWdub3JlZCBmb3IgVHlwZSAyICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGludGVycHJldGVyICAgICAgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgVHJ1ZVR5cGUgYnl0ZWNvZGUgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnByZXRlcnMgZmllbGQgaXMgYWxzbyB1c2VkIHRvIGhvb2sgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGRlYnVnZ2VyIGluIGB0dGRlYnVnJy4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB1bnBhdGVudGVkX2hpbnRpbmcgICA6OiBJZiB0cnVlLCB1c2Ugb25seSB1bnBhdGVudGVkIG1ldGhvZHMgaW4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJ5dGVjb2RlIGludGVycHJldGVyLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkb2JsZW5kICAgICAgICAgICAgICA6OiBBIGJvb2xlYW4gd2hpY2ggaXMgc2V0IGlmIHRoZSBmb250IHNob3VsZCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYmxlbmRlZCAodGhpcyBpcyBmb3IgR1ggdmFyKS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBibGVuZCAgICAgICAgICAgICAgICA6OiBDb250YWlucyB0aGUgZGF0YSBuZWVkZWQgdG8gY29udHJvbCBHWCAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWF0aW9uIHRhYmxlcyAocmF0aGVyIGxpa2UgTXVsdGlwbGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hc3RlciBkYXRhKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZXh0cmEgICAgICAgICAgICAgICAgOjogUmVzZXJ2ZWQgZm9yIHRoaXJkLXBhcnR5IGZvbnQgZHJpdmVycy4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb3N0c2NyaXB0X25hbWUgICAgICA6OiBUaGUgUFMgbmFtZSBvZiB0aGUgZm9udC4gIFVzZWQgYnkgdGhlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdHNjcmlwdCBuYW1lIHNlcnZpY2UuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfRmFjZVJlY18KLSAgewotICAgIEZUX0ZhY2VSZWMgICAgICAgICAgICByb290OwotCi0gICAgVFRDX0hlYWRlclJlYyAgICAgICAgIHR0Y19oZWFkZXI7Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgZm9ybWF0X3RhZzsKLSAgICBGVF9VU2hvcnQgICAgICAgICAgICAgbnVtX3RhYmxlczsKLSAgICBUVF9UYWJsZSAgICAgICAgICAgICAgZGlyX3RhYmxlczsKLQotICAgIFRUX0hlYWRlciAgICAgICAgICAgICBoZWFkZXI7ICAgICAgIC8qIFRydWVUeXBlIGhlYWRlciB0YWJsZSAgICAgICAgICAqLwotICAgIFRUX0hvcmlIZWFkZXIgICAgICAgICBob3Jpem9udGFsOyAgIC8qIFRydWVUeXBlIGhvcml6b250YWwgaGVhZGVyICAgICAqLwotCi0gICAgVFRfTWF4UHJvZmlsZSAgICAgICAgIG1heF9wcm9maWxlOwotCi0gICAgRlRfQm9vbCAgICAgICAgICAgICAgIHZlcnRpY2FsX2luZm87Ci0gICAgVFRfVmVydEhlYWRlciAgICAgICAgIHZlcnRpY2FsOyAgICAgLyogVFQgVmVydGljYWwgaGVhZGVyLCBpZiBwcmVzZW50ICovCi0KLSAgICBGVF9VU2hvcnQgICAgICAgICAgICAgbnVtX25hbWVzOyAgICAvKiBudW1iZXIgb2YgbmFtZSByZWNvcmRzICAqLwotICAgIFRUX05hbWVUYWJsZVJlYyAgICAgICBuYW1lX3RhYmxlOyAgIC8qIG5hbWUgdGFibGUgICAgICAgICAgICAgICovCi0KLSAgICBUVF9PUzIgICAgICAgICAgICAgICAgb3MyOyAgICAgICAgICAvKiBUcnVlVHlwZSBPUy8yIHRhYmxlICAgICAgICAgICAgKi8KLSAgICBUVF9Qb3N0c2NyaXB0ICAgICAgICAgcG9zdHNjcmlwdDsgICAvKiBUcnVlVHlwZSBQb3N0c2NyaXB0IHRhYmxlICAgICAgKi8KLQotICAgIEZUX0J5dGUqICAgICAgICAgICAgICBjbWFwX3RhYmxlOyAgIC8qIGV4dHJhY3RlZCBgY21hcCcgdGFibGUgKi8KLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgY21hcF9zaXplOwotCi0gICAgVFRfTG9hZGVyX0dvdG9UYWJsZUZ1bmMgICBnb3RvX3RhYmxlOwotCi0gICAgVFRfTG9hZGVyX1N0YXJ0R2x5cGhGdW5jICBhY2Nlc3NfZ2x5cGhfZnJhbWU7Ci0gICAgVFRfTG9hZGVyX0VuZEdseXBoRnVuYyAgICBmb3JnZXRfZ2x5cGhfZnJhbWU7Ci0gICAgVFRfTG9hZGVyX1JlYWRHbHlwaEZ1bmMgICByZWFkX2dseXBoX2hlYWRlcjsKLSAgICBUVF9Mb2FkZXJfUmVhZEdseXBoRnVuYyAgIHJlYWRfc2ltcGxlX2dseXBoOwotICAgIFRUX0xvYWRlcl9SZWFkR2x5cGhGdW5jICAgcmVhZF9jb21wb3NpdGVfZ2x5cGg7Ci0KLSAgICAvKiBhIHR5cGVsZXNzIHBvaW50ZXIgdG8gdGhlIFNGTlRfSW50ZXJmYWNlIHRhYmxlIHVzZWQgdG8gbG9hZCAqLwotICAgIC8qIHRoZSBiYXNpYyBUcnVlVHlwZSB0YWJsZXMgaW4gdGhlIGZhY2Ugb2JqZWN0ICAgICAgICAgICAgICAgICovCi0gICAgdm9pZCogICAgICAgICAgICAgICAgIHNmbnQ7Ci0KLSAgICAvKiBhIHR5cGVsZXNzIHBvaW50ZXIgdG8gdGhlIEZUX1NlcnZpY2VfUHNDTWFwc1JlYyB0YWJsZSB1c2VkIHRvICovCi0gICAgLyogaGFuZGxlIGdseXBoIG5hbWVzIDwtPiB1bmljb2RlICYgTWFjIHZhbHVlcyAgICAgICAgICAgICAgICAgICAqLwotICAgIHZvaWQqICAgICAgICAgICAgICAgICBwc25hbWVzOwotCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIE9wdGlvbmFsIFRydWVUeXBlL09wZW5UeXBlIHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyogZ3JpZC1maXR0aW5nIGFuZCBzY2FsaW5nIHRhYmxlICovCi0gICAgVFRfR2FzcFJlYyAgICAgICAgICAgIGdhc3A7ICAgICAgICAgICAgICAgICAvKiB0aGUgYGdhc3AnIHRhYmxlICovCi0KLSAgICAvKiBQQ0wgNSB0YWJsZSAqLwotICAgIFRUX1BDTFQgICAgICAgICAgICAgICBwY2x0OwotCi0gICAgLyogZW1iZWRkZWQgYml0bWFwcyBzdXBwb3J0ICovCi0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIG51bV9zYml0X3NjYWxlczsKLSAgICBUVF9TQml0X1NjYWxlICAgICAgICAgc2JpdF9zY2FsZXM7Ci0KLSAgICAvKiBwb3N0c2NyaXB0IG5hbWVzIHRhYmxlICovCi0gICAgVFRfUG9zdF9OYW1lc1JlYyAgICAgIHBvc3RzY3JpcHRfbmFtZXM7Ci0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogVHJ1ZVR5cGUtc3BlY2lmaWMgZmllbGRzIChpZ25vcmVkIGJ5IHRoZSBPVEYtVHlwZTIgZHJpdmVyKSAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiB0aGUgZm9udCBwcm9ncmFtLCBpZiBhbnkgKi8KLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgZm9udF9wcm9ncmFtX3NpemU7Ci0gICAgRlRfQnl0ZSogICAgICAgICAgICAgIGZvbnRfcHJvZ3JhbTsKLQotICAgIC8qIHRoZSBjdnQgcHJvZ3JhbSwgaWYgYW55ICovCi0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIGN2dF9wcm9ncmFtX3NpemU7Ci0gICAgRlRfQnl0ZSogICAgICAgICAgICAgIGN2dF9wcm9ncmFtOwotCi0gICAgLyogdGhlIG9yaWdpbmFsLCB1bnNjYWxlZCwgY29udHJvbCB2YWx1ZSB0YWJsZSAqLwotICAgIEZUX1VMb25nICAgICAgICAgICAgICBjdnRfc2l6ZTsKLSAgICBGVF9TaG9ydCogICAgICAgICAgICAgY3Z0OwotCi0gICAgLyogQSBwb2ludGVyIHRvIHRoZSBieXRlY29kZSBpbnRlcnByZXRlciB0byB1c2UuICBUaGlzIGlzIGFsc28gKi8KLSAgICAvKiB1c2VkIHRvIGhvb2sgdGhlIGRlYnVnZ2VyIGZvciB0aGUgYHR0ZGVidWcnIHV0aWxpdHkuICAgICAgICAqLwotICAgIFRUX0ludGVycHJldGVyICAgICAgICBpbnRlcnByZXRlcjsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCi0gICAgLyogVXNlIHVucGF0ZW50ZWQgaGludGluZyBvbmx5LiAqLwotICAgIEZUX0Jvb2wgICAgICAgICAgICAgICB1bnBhdGVudGVkX2hpbnRpbmc7Ci0jZW5kaWYKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogT3RoZXIgdGFibGVzIG9yIGZpZWxkcy4gVGhpcyBpcyB1c2VkIGJ5IGRlcml2YXRpdmUgZm9ybWF0cyBsaWtlICAgICAqLwotICAgIC8qIE9wZW5UeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgRlRfR2VuZXJpYyAgICAgICAgICAgIGV4dHJhOwotCi0gICAgY29uc3QgY2hhciogICAgICAgICAgIHBvc3RzY3JpcHRfbmFtZTsKLQotICAgIEZUX1VMb25nICAgICAgICAgICAgICBnbHlmX2xlbjsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgICBGVF9Cb29sICAgICAgICAgICAgICAgZG9ibGVuZDsKLSAgICBHWF9CbGVuZCAgICAgICAgICAgICAgYmxlbmQ7Ci0jZW5kaWYKLQotICAgIC8qIHNpbmNlIHZlcnNpb24gMi4yICovCi0KLSAgICBGVF9CeXRlKiAgICAgICAgICAgICAgaG9yel9tZXRyaWNzOwotICAgIEZUX1VMb25nICAgICAgICAgICAgICBob3J6X21ldHJpY3Nfc2l6ZTsKLQotICAgIEZUX0J5dGUqICAgICAgICAgICAgICB2ZXJ0X21ldHJpY3M7Ci0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIHZlcnRfbWV0cmljc19zaXplOwotCi0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIG51bV9sb2NhdGlvbnM7IC8qIGluIGJyb2tlbiBUVEYsIGdpZCA+IDB4RkZGRiAqLwotICAgIEZUX0J5dGUqICAgICAgICAgICAgICBnbHlwaF9sb2NhdGlvbnM7Ci0KLSAgICBGVF9CeXRlKiAgICAgICAgICAgICAgaGRteF90YWJsZTsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgaGRteF90YWJsZV9zaXplOwotICAgIEZUX1VJbnQgICAgICAgICAgICAgICBoZG14X3JlY29yZF9jb3VudDsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgaGRteF9yZWNvcmRfc2l6ZTsKLSAgICBGVF9CeXRlKiAgICAgICAgICAgICAgaGRteF9yZWNvcmRfc2l6ZXM7Ci0KLSAgICBGVF9CeXRlKiAgICAgICAgICAgICAgc2JpdF90YWJsZTsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAgc2JpdF90YWJsZV9zaXplOwotICAgIFRUX1NiaXRUYWJsZVR5cGUgICAgICBzYml0X3RhYmxlX3R5cGU7Ci0gICAgRlRfVUludCAgICAgICAgICAgICAgIHNiaXRfbnVtX3N0cmlrZXM7Ci0KLSAgICBGVF9CeXRlKiAgICAgICAgICAgICAga2Vybl90YWJsZTsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgICAga2Vybl90YWJsZV9zaXplOwotICAgIEZUX1VJbnQgICAgICAgICAgICAgICBudW1fa2Vybl90YWJsZXM7Ci0gICAgRlRfVUludDMyICAgICAgICAgICAgIGtlcm5fYXZhaWxfYml0czsKLSAgICBGVF9VSW50MzIgICAgICAgICAgICAga2Vybl9vcmRlcl9iaXRzOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9CREYKLSAgICBUVF9CREZSZWMgICAgICAgICAgICAgYmRmOwotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fQkRGICovCi0KLSAgICAvKiBzaW5jZSAyLjMuMCAqLwotICAgIEZUX1VMb25nICAgICAgICAgICAgICBob3J6X21ldHJpY3Nfb2Zmc2V0OwotICAgIEZUX1VMb25nICAgICAgICAgICAgICB2ZXJ0X21ldHJpY3Nfb2Zmc2V0OwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0gICAgLyogc2luY2UgMi40LjEyICovCi0gICAgRlRfVUxvbmcgICAgICAgICAgICAgIHNwaF9mb3VuZF9mdW5jX2ZsYWdzOyAvKiBzcGVjaWFsIGZ1bmN0aW9ucyBmb3VuZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIHRoaXMgZmFjZSAgICAgICAgICAgKi8KLSAgICBGVF9Cb29sICAgICAgICAgICAgICAgc3BoX2NvbXBhdGliaWxpdHlfbW9kZTsKLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KLQotICB9IFRUX0ZhY2VSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgVFRfR2x5cGhab25lUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgQSBnbHlwaCB6b25lIGlzIHVzZWQgdG8gbG9hZCwgc2NhbGUgYW5kIGhpbnQgZ2x5cGggb3V0bGluZSAgICAgICAgKi8KLSAgLyogICAgIGNvb3JkaW5hdGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIG1lbW9yeSAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgbWVtb3J5IG1hbmFnZXIuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgbWF4X3BvaW50cyAgIDo6IFRoZSBtYXhpbXVtIHNpemUgaW4gcG9pbnRzIG9mIHRoZSB6b25lLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBtYXhfY29udG91cnMgOjogTWF4IHNpemUgaW4gbGlua3MgY29udG91cnMgb2YgdGhlIHpvbmUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIG5fcG9pbnRzICAgICA6OiBUaGUgY3VycmVudCBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSB6b25lLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgbl9jb250b3VycyAgIDo6IFRoZSBjdXJyZW50IG51bWJlciBvZiBjb250b3VycyBpbiB0aGUgem9uZS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBvcmcgICAgICAgICAgOjogVGhlIG9yaWdpbmFsIGdseXBoIGNvb3JkaW5hdGVzIChmb250ICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIHVuaXRzL3NjYWxlZCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBjdXIgICAgICAgICAgOjogVGhlIGN1cnJlbnQgZ2x5cGggY29vcmRpbmF0ZXMgKHNjYWxlZC9oaW50ZWQpLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIHRhZ3MgICAgICAgICA6OiBUaGUgcG9pbnQgY29udHJvbCB0YWdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgY29udG91cnMgICAgIDo6IFRoZSBjb250b3VycyBlbmQgcG9pbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBmaXJzdF9wb2ludCAgOjogT2Zmc2V0IG9mIHRoZSBjdXJyZW50IHN1YmdseXBoJ3MgZmlyc3QgcG9pbnQuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0dseXBoWm9uZVJlY18KLSAgewotICAgIEZUX01lbW9yeSAgIG1lbW9yeTsKLSAgICBGVF9VU2hvcnQgICBtYXhfcG9pbnRzOwotICAgIEZUX1Nob3J0ICAgIG1heF9jb250b3VyczsKLSAgICBGVF9VU2hvcnQgICBuX3BvaW50czsgICAgLyogbnVtYmVyIG9mIHBvaW50cyBpbiB6b25lICAgICovCi0gICAgRlRfU2hvcnQgICAgbl9jb250b3VyczsgIC8qIG51bWJlciBvZiBjb250b3VycyAgICAgICAgICAqLwotCi0gICAgRlRfVmVjdG9yKiAgb3JnOyAgICAgICAgIC8qIG9yaWdpbmFsIHBvaW50IGNvb3JkaW5hdGVzICAqLwotICAgIEZUX1ZlY3RvciogIGN1cjsgICAgICAgICAvKiBjdXJyZW50IHBvaW50IGNvb3JkaW5hdGVzICAgKi8KLSAgICBGVF9WZWN0b3IqICBvcnVzOyAgICAgICAgLyogb3JpZ2luYWwgKHVuc2NhbGVkKSBwb2ludCBjb29yZGluYXRlcyAqLwotCi0gICAgRlRfQnl0ZSogICAgdGFnczsgICAgICAgIC8qIGN1cnJlbnQgdG91Y2ggZmxhZ3MgICAgICAgICAqLwotICAgIEZUX1VTaG9ydCogIGNvbnRvdXJzOyAgICAvKiBjb250b3VyIGVuZCBwb2ludHMgICAgICAgICAgKi8KLQotICAgIEZUX1VTaG9ydCAgIGZpcnN0X3BvaW50OyAvKiBvZmZzZXQgb2YgZmlyc3QgKCMwKSBwb2ludCAgKi8KLQotICB9IFRUX0dseXBoWm9uZVJlYywgKlRUX0dseXBoWm9uZTsKLQotCi0gIC8qIGhhbmRsZSB0byBleGVjdXRpb24gY29udGV4dCAqLwotICB0eXBlZGVmIHN0cnVjdCBUVF9FeGVjQ29udGV4dFJlY18qICBUVF9FeGVjQ29udGV4dDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgVHJ1ZVR5cGUgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgVFRfU2l6ZVJlY18qICBUVF9TaXplOwotCi0KLSAgLyogZ2x5cGggbG9hZGVyIHN0cnVjdHVyZSAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfTG9hZGVyUmVjXwotICB7Ci0gICAgVFRfRmFjZSAgICAgICAgICBmYWNlOwotICAgIFRUX1NpemUgICAgICAgICAgc2l6ZTsKLSAgICBGVF9HbHlwaFNsb3QgICAgIGdseXBoOwotICAgIEZUX0dseXBoTG9hZGVyICAgZ2xvYWRlcjsKLQotICAgIEZUX1VMb25nICAgICAgICAgbG9hZF9mbGFnczsKLSAgICBGVF9VSW50ICAgICAgICAgIGdseXBoX2luZGV4OwotCi0gICAgRlRfU3RyZWFtICAgICAgICBzdHJlYW07Ci0gICAgRlRfSW50ICAgICAgICAgICBieXRlX2xlbjsKLQotICAgIEZUX1Nob3J0ICAgICAgICAgbl9jb250b3VyczsKLSAgICBGVF9CQm94ICAgICAgICAgIGJib3g7Ci0gICAgRlRfSW50ICAgICAgICAgICBsZWZ0X2JlYXJpbmc7Ci0gICAgRlRfSW50ICAgICAgICAgICBhZHZhbmNlOwotICAgIEZUX0ludCAgICAgICAgICAgbGluZWFyOwotICAgIEZUX0Jvb2wgICAgICAgICAgbGluZWFyX2RlZjsKLSAgICBGVF9WZWN0b3IgICAgICAgIHBwMTsKLSAgICBGVF9WZWN0b3IgICAgICAgIHBwMjsKLQotICAgIEZUX1VMb25nICAgICAgICAgZ2x5Zl9vZmZzZXQ7Ci0KLSAgICAvKiB0aGUgem9uZSB3aGVyZSB3ZSBsb2FkIG91ciBnbHlwaHMgKi8KLSAgICBUVF9HbHlwaFpvbmVSZWMgIGJhc2U7Ci0gICAgVFRfR2x5cGhab25lUmVjICB6b25lOwotCi0gICAgVFRfRXhlY0NvbnRleHQgICBleGVjOwotICAgIEZUX0J5dGUqICAgICAgICAgaW5zdHJ1Y3Rpb25zOwotICAgIEZUX1VMb25nICAgICAgICAgaW5zX3BvczsKLQotICAgIC8qIGZvciBwb3NzaWJsZSBleHRlbnNpYmlsaXR5IGluIG90aGVyIGZvcm1hdHMgKi8KLSAgICB2b2lkKiAgICAgICAgICAgIG90aGVyOwotCi0gICAgLyogc2luY2UgdmVyc2lvbiAyLjEuOCAqLwotICAgIEZUX0ludCAgICAgICAgICAgdG9wX2JlYXJpbmc7Ci0gICAgRlRfSW50ICAgICAgICAgICB2YWR2YW5jZTsKLSAgICBGVF9WZWN0b3IgICAgICAgIHBwMzsKLSAgICBGVF9WZWN0b3IgICAgICAgIHBwNDsKLQotICAgIC8qIHNpbmNlIHZlcnNpb24gMi4yLjEgKi8KLSAgICBGVF9CeXRlKiAgICAgICAgIGN1cnNvcjsKLSAgICBGVF9CeXRlKiAgICAgICAgIGxpbWl0OwotCi0gIH0gVFRfTG9hZGVyUmVjOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fVFRUWVBFU19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvdDF0YWJsZXMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvdDF0YWJsZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZlYTQxNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL3QxdGFibGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDF0YWJsZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEJhc2ljIFR5cGUgMS9UeXBlIDIgdGFibGVzIGRlZmluaXRpb25zIGFuZCBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24gICovCi0vKiAgICBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1QxVEFCTEVTX0hfXwotI2RlZmluZSBfX1QxVEFCTEVTX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR5cGUxX3RhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFR5cGUgMSBUYWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFR5cGV+MSAoUG9zdFNjcmlwdCkgc3BlY2lmaWMgZm9udCB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBUeXBlIDEtc3BlY2lmaWMgdGFibGVzLCAgICAqLwotICAvKiAgICBpbmNsdWRpbmcgc3RydWN0dXJlcyByZWxhdGVkIHRvIG90aGVyIFBvc3RTY3JpcHQgZm9udCBmb3JtYXRzLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19Gb250SW5mb1JlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRm9udEluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX1ByaXZhdGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19Qcml2YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRF9GYWNlRGljdFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDSURfRmFjZURpY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0ZhY2VJbmZvUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRF9GYWNlSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfSGFzX1BTX0dseXBoX05hbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9QU19Gb250X0luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfUFNfRm9udF9Qcml2YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X1BTX0ZvbnRfVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CbGVuZF9GbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfRW5jb2RpbmdUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RpY3RfS2V5cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBOb3RlIHRoYXQgd2Ugc2VwYXJhdGUgZm9udCBkYXRhIGluIFBTX0ZvbnRJbmZvUmVjIGFuZCBQU19Qcml2YXRlUmVjICovCi0gIC8qIHN0cnVjdHVyZXMgaW4gb3JkZXIgdG8gc3VwcG9ydCBNdWx0aXBsZSBNYXN0ZXIgZm9udHMuICAgICAgICAgICAgICAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0ZvbnRJbmZvUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBUeXBlfjEgb3IgVHlwZX4yIEZvbnRJbmZvIGRpY3Rpb25hcnkuICAqLwotICAvKiAgICBOb3RlIHRoYXQgZm9yIE11bHRpcGxlIE1hc3RlciBmb250cywgZWFjaCBpbnN0YW5jZSBoYXMgaXRzIG93biAgICAgKi8KLSAgLyogICAgRm9udEluZm8gZGljdGlvbmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNfRm9udEluZm9SZWNfCi0gIHsKLSAgICBGVF9TdHJpbmcqICB2ZXJzaW9uOwotICAgIEZUX1N0cmluZyogIG5vdGljZTsKLSAgICBGVF9TdHJpbmcqICBmdWxsX25hbWU7Ci0gICAgRlRfU3RyaW5nKiAgZmFtaWx5X25hbWU7Ci0gICAgRlRfU3RyaW5nKiAgd2VpZ2h0OwotICAgIEZUX0xvbmcgICAgIGl0YWxpY19hbmdsZTsKLSAgICBGVF9Cb29sICAgICBpc19maXhlZF9waXRjaDsKLSAgICBGVF9TaG9ydCAgICB1bmRlcmxpbmVfcG9zaXRpb247Ci0gICAgRlRfVVNob3J0ICAgdW5kZXJsaW5lX3RoaWNrbmVzczsKLQotICB9IFBTX0ZvbnRJbmZvUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRm9udEluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBAUFNfRm9udEluZm9SZWMgc3RydWN0dXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBQU19Gb250SW5mb1JlY18qICBQU19Gb250SW5mbzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0ZvbnRJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgdHlwZSBpcyBlcXVpdmFsZW50IHRvIEBQU19Gb250SW5mb1JlYy4gIEl0IGlzIGRlcHJlY2F0ZWQgYnV0ICAqLwotICAvKiAgICBrZXB0IHRvIG1haW50YWluIHNvdXJjZSBjb21wYXRpYmlsaXR5IGJldHdlZW4gdmFyaW91cyB2ZXJzaW9ucyBvZiAgKi8KLSAgLyogICAgRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIFBTX0ZvbnRJbmZvUmVjICBUMV9Gb250SW5mbzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX1ByaXZhdGVSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBUeXBlfjEgb3IgVHlwZX4yIHByaXZhdGUgZGljdGlvbmFyeS4gICAqLwotICAvKiAgICBOb3RlIHRoYXQgZm9yIE11bHRpcGxlIE1hc3RlciBmb250cywgZWFjaCBpbnN0YW5jZSBoYXMgaXRzIG93biAgICAgKi8KLSAgLyogICAgUHJpdmF0ZSBkaWN0aW9uYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNfUHJpdmF0ZVJlY18KLSAgewotICAgIEZUX0ludCAgICAgdW5pcXVlX2lkOwotICAgIEZUX0ludCAgICAgbGVuSVY7Ci0KLSAgICBGVF9CeXRlICAgIG51bV9ibHVlX3ZhbHVlczsKLSAgICBGVF9CeXRlICAgIG51bV9vdGhlcl9ibHVlczsKLSAgICBGVF9CeXRlICAgIG51bV9mYW1pbHlfYmx1ZXM7Ci0gICAgRlRfQnl0ZSAgICBudW1fZmFtaWx5X290aGVyX2JsdWVzOwotCi0gICAgRlRfU2hvcnQgICBibHVlX3ZhbHVlc1sxNF07Ci0gICAgRlRfU2hvcnQgICBvdGhlcl9ibHVlc1sxMF07Ci0KLSAgICBGVF9TaG9ydCAgIGZhbWlseV9ibHVlcyAgICAgIFsxNF07Ci0gICAgRlRfU2hvcnQgICBmYW1pbHlfb3RoZXJfYmx1ZXNbMTBdOwotCi0gICAgRlRfRml4ZWQgICBibHVlX3NjYWxlOwotICAgIEZUX0ludCAgICAgYmx1ZV9zaGlmdDsKLSAgICBGVF9JbnQgICAgIGJsdWVfZnV6ejsKLQotICAgIEZUX1VTaG9ydCAgc3RhbmRhcmRfd2lkdGhbMV07Ci0gICAgRlRfVVNob3J0ICBzdGFuZGFyZF9oZWlnaHRbMV07Ci0KLSAgICBGVF9CeXRlICAgIG51bV9zbmFwX3dpZHRoczsKLSAgICBGVF9CeXRlICAgIG51bV9zbmFwX2hlaWdodHM7Ci0gICAgRlRfQm9vbCAgICBmb3JjZV9ib2xkOwotICAgIEZUX0Jvb2wgICAgcm91bmRfc3RlbV91cDsKLQotICAgIEZUX1Nob3J0ICAgc25hcF93aWR0aHMgWzEzXTsgIC8qIGluY2x1ZGluZyBzdGQgd2lkdGggICovCi0gICAgRlRfU2hvcnQgICBzbmFwX2hlaWdodHNbMTNdOyAgLyogaW5jbHVkaW5nIHN0ZCBoZWlnaHQgKi8KLQotICAgIEZUX0ZpeGVkICAgZXhwYW5zaW9uX2ZhY3RvcjsKLQotICAgIEZUX0xvbmcgICAgbGFuZ3VhZ2VfZ3JvdXA7Ci0gICAgRlRfTG9uZyAgICBwYXNzd29yZDsKLQotICAgIEZUX1Nob3J0ICAgbWluX2ZlYXR1cmVbMl07Ci0KLSAgfSBQU19Qcml2YXRlUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfUHJpdmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBAUFNfUHJpdmF0ZVJlYyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBQU19Qcml2YXRlUmVjXyogIFBTX1ByaXZhdGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9Qcml2YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoaXMgdHlwZSBpcyBlcXVpdmFsZW50IHRvIEBQU19Qcml2YXRlUmVjLiAgSXQgaXMgZGVwcmVjYXRlZCBidXQgICAgKi8KLSAgLyogICBrZXB0IHRvIG1haW50YWluIHNvdXJjZSBjb21wYXRpYmlsaXR5IGJldHdlZW4gdmFyaW91cyB2ZXJzaW9ucyBvZiAgICovCi0gIC8qICAgRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBQU19Qcml2YXRlUmVjICBUMV9Qcml2YXRlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQmxlbmRfRmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzZXQgb2YgZmxhZ3MgdXNlZCB0byBpbmRpY2F0ZSB3aGljaCBmaWVsZHMgYXJlIHByZXNlbnQgaW4gYSAgICAgICovCi0gIC8qICAgIGdpdmVuIGJsZW5kIGRpY3Rpb25hcnkgKGZvbnQgaW5mbyBvciBwcml2YXRlKS4gIFVzZWQgdG8gc3VwcG9ydCAgICAqLwotICAvKiAgICBNdWx0aXBsZSBNYXN0ZXJzIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxWYWx1ZXM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CTEVORF9VTkRFUkxJTkVfUE9TSVRJT04gOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQkxFTkRfVU5ERVJMSU5FX1RISUNLTkVTUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0JMRU5EX0lUQUxJQ19BTkdMRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CTEVORF9CTFVFX1ZBTFVFUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQkxFTkRfT1RIRVJfQkxVRVMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0JMRU5EX1NUQU5EQVJEX1dJRFRIIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CTEVORF9TVEFOREFSRF9IRUlHSFQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQkxFTkRfU1RFTV9TTkFQX1dJRFRIUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0JMRU5EX1NURU1fU05BUF9IRUlHSFRTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CTEVORF9CTFVFX1NDQUxFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQkxFTkRfQkxVRV9TSElGVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0JMRU5EX0ZBTUlMWV9CTFVFUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9CTEVORF9GQU1JTFlfT1RIRVJfQkxVRVMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfQkxFTkRfRk9SQ0VfQk9MRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGVudW0gIFQxX0JsZW5kX0ZsYWdzXwotICB7Ci0gICAgLyogcmVxdWlyZWQgZmllbGRzIGluIGEgRm9udEluZm8gYmxlbmQgZGljdGlvbmFyeSAqLwotICAgIFQxX0JMRU5EX1VOREVSTElORV9QT1NJVElPTiA9IDAsCi0gICAgVDFfQkxFTkRfVU5ERVJMSU5FX1RISUNLTkVTUywKLSAgICBUMV9CTEVORF9JVEFMSUNfQU5HTEUsCi0KLSAgICAvKiByZXF1aXJlZCBmaWVsZHMgaW4gYSBQcml2YXRlIGJsZW5kIGRpY3Rpb25hcnkgKi8KLSAgICBUMV9CTEVORF9CTFVFX1ZBTFVFUywKLSAgICBUMV9CTEVORF9PVEhFUl9CTFVFUywKLSAgICBUMV9CTEVORF9TVEFOREFSRF9XSURUSCwKLSAgICBUMV9CTEVORF9TVEFOREFSRF9IRUlHSFQsCi0gICAgVDFfQkxFTkRfU1RFTV9TTkFQX1dJRFRIUywKLSAgICBUMV9CTEVORF9TVEVNX1NOQVBfSEVJR0hUUywKLSAgICBUMV9CTEVORF9CTFVFX1NDQUxFLAotICAgIFQxX0JMRU5EX0JMVUVfU0hJRlQsCi0gICAgVDFfQkxFTkRfRkFNSUxZX0JMVUVTLAotICAgIFQxX0JMRU5EX0ZBTUlMWV9PVEhFUl9CTFVFUywKLSAgICBUMV9CTEVORF9GT1JDRV9CT0xELAotCi0gICAgVDFfQkxFTkRfTUFYICAgIC8qIGRvIG5vdCByZW1vdmUgKi8KLQotICB9IFQxX0JsZW5kX0ZsYWdzOwotCi0KLSAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgKi8KLSAgLyogYFQxX0JsZW5kX0ZsYWdzJyB2YWx1ZXMgaW5zdGVhZCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgdDFfYmxlbmRfdW5kZXJsaW5lX3Bvc2l0aW9uICAgVDFfQkxFTkRfVU5ERVJMSU5FX1BPU0lUSU9OCi0jZGVmaW5lIHQxX2JsZW5kX3VuZGVybGluZV90aGlja25lc3MgIFQxX0JMRU5EX1VOREVSTElORV9USElDS05FU1MKLSNkZWZpbmUgdDFfYmxlbmRfaXRhbGljX2FuZ2xlICAgICAgICAgVDFfQkxFTkRfSVRBTElDX0FOR0xFCi0jZGVmaW5lIHQxX2JsZW5kX2JsdWVfdmFsdWVzICAgICAgICAgIFQxX0JMRU5EX0JMVUVfVkFMVUVTCi0jZGVmaW5lIHQxX2JsZW5kX290aGVyX2JsdWVzICAgICAgICAgIFQxX0JMRU5EX09USEVSX0JMVUVTCi0jZGVmaW5lIHQxX2JsZW5kX3N0YW5kYXJkX3dpZHRocyAgICAgIFQxX0JMRU5EX1NUQU5EQVJEX1dJRFRICi0jZGVmaW5lIHQxX2JsZW5kX3N0YW5kYXJkX2hlaWdodCAgICAgIFQxX0JMRU5EX1NUQU5EQVJEX0hFSUdIVAotI2RlZmluZSB0MV9ibGVuZF9zdGVtX3NuYXBfd2lkdGhzICAgICBUMV9CTEVORF9TVEVNX1NOQVBfV0lEVEhTCi0jZGVmaW5lIHQxX2JsZW5kX3N0ZW1fc25hcF9oZWlnaHRzICAgIFQxX0JMRU5EX1NURU1fU05BUF9IRUlHSFRTCi0jZGVmaW5lIHQxX2JsZW5kX2JsdWVfc2NhbGUgICAgICAgICAgIFQxX0JMRU5EX0JMVUVfU0NBTEUKLSNkZWZpbmUgdDFfYmxlbmRfYmx1ZV9zaGlmdCAgICAgICAgICAgVDFfQkxFTkRfQkxVRV9TSElGVAotI2RlZmluZSB0MV9ibGVuZF9mYW1pbHlfYmx1ZXMgICAgICAgICBUMV9CTEVORF9GQU1JTFlfQkxVRVMKLSNkZWZpbmUgdDFfYmxlbmRfZmFtaWx5X290aGVyX2JsdWVzICAgVDFfQkxFTkRfRkFNSUxZX09USEVSX0JMVUVTCi0jZGVmaW5lIHQxX2JsZW5kX2ZvcmNlX2JvbGQgICAgICAgICAgIFQxX0JMRU5EX0ZPUkNFX0JPTEQKLSNkZWZpbmUgdDFfYmxlbmRfbWF4ICAgICAgICAgICAgICAgICAgVDFfQkxFTkRfTUFYCi0KLSAgLyogKi8KLQotCi0gIC8qIG1heGltdW0gbnVtYmVyIG9mIE11bHRpcGxlIE1hc3RlcnMgZGVzaWducywgYXMgZGVmaW5lZCBpbiB0aGUgc3BlYyAqLwotI2RlZmluZSBUMV9NQVhfTU1fREVTSUdOUyAgICAgMTYKLQotICAvKiBtYXhpbXVtIG51bWJlciBvZiBNdWx0aXBsZSBNYXN0ZXJzIGF4ZXMsIGFzIGRlZmluZWQgaW4gdGhlIHNwZWMgKi8KLSNkZWZpbmUgVDFfTUFYX01NX0FYSVMgICAgICAgIDQKLQotICAvKiBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIGRlc2lnbiBtYXAgKi8KLSNkZWZpbmUgVDFfTUFYX01NX01BUF9QT0lOVFMgIDIwCi0KLQotICAvKiB0aGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHN0b3JlIHRoZSBCbGVuZERlc2lnbk1hcCBlbnRyeSBmb3IgYW4gYXhpcyAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNfRGVzaWduTWFwXwotICB7Ci0gICAgRlRfQnl0ZSAgICBudW1fcG9pbnRzOwotICAgIEZUX0xvbmcqICAgZGVzaWduX3BvaW50czsKLSAgICBGVF9GaXhlZCogIGJsZW5kX3BvaW50czsKLQotICB9IFBTX0Rlc2lnbk1hcFJlYywgKlBTX0Rlc2lnbk1hcDsKLQotICAvKiBiYWNrd2FyZHMtY29tcGF0aWJsZSBkZWZpbml0aW9uICovCi0gIHR5cGVkZWYgUFNfRGVzaWduTWFwUmVjICBUMV9EZXNpZ25NYXA7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgUFNfQmxlbmRSZWNfCi0gIHsKLSAgICBGVF9VSW50ICAgICAgICAgIG51bV9kZXNpZ25zOwotICAgIEZUX1VJbnQgICAgICAgICAgbnVtX2F4aXM7Ci0KLSAgICBGVF9TdHJpbmcqICAgICAgIGF4aXNfbmFtZXNbVDFfTUFYX01NX0FYSVNdOwotICAgIEZUX0ZpeGVkKiAgICAgICAgZGVzaWduX3Bvc1tUMV9NQVhfTU1fREVTSUdOU107Ci0gICAgUFNfRGVzaWduTWFwUmVjICBkZXNpZ25fbWFwW1QxX01BWF9NTV9BWElTXTsKLQotICAgIEZUX0ZpeGVkKiAgICAgICAgd2VpZ2h0X3ZlY3RvcjsKLSAgICBGVF9GaXhlZCogICAgICAgIGRlZmF1bHRfd2VpZ2h0X3ZlY3RvcjsKLQotICAgIFBTX0ZvbnRJbmZvICAgICAgZm9udF9pbmZvc1tUMV9NQVhfTU1fREVTSUdOUyArIDFdOwotICAgIFBTX1ByaXZhdGUgICAgICAgcHJpdmF0ZXMgIFtUMV9NQVhfTU1fREVTSUdOUyArIDFdOwotCi0gICAgRlRfVUxvbmcgICAgICAgICBibGVuZF9iaXRmbGFnczsKLQotICAgIEZUX0JCb3gqICAgICAgICAgYmJveGVzICAgIFtUMV9NQVhfTU1fREVTSUdOUyArIDFdOwotCi0gICAgLyogc2luY2UgMi4zLjAgKi8KLQotICAgIC8qIHVuZG9jdW1lbnRlZCwgb3B0aW9uYWw6IHRoZSBkZWZhdWx0IGRlc2lnbiBpbnN0YW5jZTsgICAqLwotICAgIC8qIGNvcnJlc3BvbmRzIHRvIGRlZmF1bHRfd2VpZ2h0X3ZlY3RvciAtLSAgICAgICAgICAgICAgICAqLwotICAgIC8qIG51bV9kZWZhdWx0X2Rlc2lnbl92ZWN0b3IgPT0gMCBtZWFucyBpdCBpcyBub3QgcHJlc2VudCAqLwotICAgIC8qIGluIHRoZSBmb250IGFuZCBhc3NvY2lhdGVkIG1ldHJpY3MgZmlsZXMgICAgICAgICAgICAgICAqLwotICAgIEZUX1VJbnQgICAgICAgICAgZGVmYXVsdF9kZXNpZ25fdmVjdG9yW1QxX01BWF9NTV9ERVNJR05TXTsKLSAgICBGVF9VSW50ICAgICAgICAgIG51bV9kZWZhdWx0X2Rlc2lnbl92ZWN0b3I7Ci0KLSAgfSBQU19CbGVuZFJlYywgKlBTX0JsZW5kOwotCi0KLSAgLyogYmFja3dhcmRzLWNvbXBhdGlibGUgZGVmaW5pdGlvbiAqLwotICB0eXBlZGVmIFBTX0JsZW5kUmVjICBUMV9CbGVuZDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRF9GYWNlRGljdFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gcmVwcmVzZW50IGRhdGEgaW4gYSBDSUQgdG9wLWxldmVsIGRpY3Rpb25hcnkuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIENJRF9GYWNlRGljdFJlY18KLSAgewotICAgIFBTX1ByaXZhdGVSZWMgIHByaXZhdGVfZGljdDsKLQotICAgIEZUX1VJbnQgICAgICAgIGxlbl9idWlsZGNoYXI7Ci0gICAgRlRfRml4ZWQgICAgICAgZm9yY2Vib2xkX3RocmVzaG9sZDsKLSAgICBGVF9Qb3MgICAgICAgICBzdHJva2Vfd2lkdGg7Ci0gICAgRlRfRml4ZWQgICAgICAgZXhwYW5zaW9uX2ZhY3RvcjsKLQotICAgIEZUX0J5dGUgICAgICAgIHBhaW50X3R5cGU7Ci0gICAgRlRfQnl0ZSAgICAgICAgZm9udF90eXBlOwotICAgIEZUX01hdHJpeCAgICAgIGZvbnRfbWF0cml4OwotICAgIEZUX1ZlY3RvciAgICAgIGZvbnRfb2Zmc2V0OwotCi0gICAgRlRfVUludCAgICAgICAgbnVtX3N1YnJzOwotICAgIEZUX1VMb25nICAgICAgIHN1YnJtYXBfb2Zmc2V0OwotICAgIEZUX0ludCAgICAgICAgIHNkX2J5dGVzOwotCi0gIH0gQ0lEX0ZhY2VEaWN0UmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0ZhY2VEaWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBAQ0lEX0ZhY2VEaWN0UmVjIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBDSURfRmFjZURpY3RSZWNfKiAgQ0lEX0ZhY2VEaWN0OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0ZvbnREaWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyB0eXBlIGlzIGVxdWl2YWxlbnQgdG8gQENJRF9GYWNlRGljdFJlYy4gIEl0IGlzIGRlcHJlY2F0ZWQgYnV0ICovCi0gIC8qICAgIGtlcHQgdG8gbWFpbnRhaW4gc291cmNlIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB2YXJpb3VzIHZlcnNpb25zIG9mICAqLwotICAvKiAgICBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgQ0lEX0ZhY2VEaWN0UmVjICBDSURfRm9udERpY3Q7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDSURfRmFjZUluZm9SZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIHJlcHJlc2VudCBDSUQgRmFjZSBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBDSURfRmFjZUluZm9SZWNfCi0gIHsKLSAgICBGVF9TdHJpbmcqICAgICAgY2lkX2ZvbnRfbmFtZTsKLSAgICBGVF9GaXhlZCAgICAgICAgY2lkX3ZlcnNpb247Ci0gICAgRlRfSW50ICAgICAgICAgIGNpZF9mb250X3R5cGU7Ci0KLSAgICBGVF9TdHJpbmcqICAgICAgcmVnaXN0cnk7Ci0gICAgRlRfU3RyaW5nKiAgICAgIG9yZGVyaW5nOwotICAgIEZUX0ludCAgICAgICAgICBzdXBwbGVtZW50OwotCi0gICAgUFNfRm9udEluZm9SZWMgIGZvbnRfaW5mbzsKLSAgICBGVF9CQm94ICAgICAgICAgZm9udF9iYm94OwotICAgIEZUX1VMb25nICAgICAgICB1aWRfYmFzZTsKLQotICAgIEZUX0ludCAgICAgICAgICBudW1feHVpZDsKLSAgICBGVF9VTG9uZyAgICAgICAgeHVpZFsxNl07Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgY2lkbWFwX29mZnNldDsKLSAgICBGVF9JbnQgICAgICAgICAgZmRfYnl0ZXM7Ci0gICAgRlRfSW50ICAgICAgICAgIGdkX2J5dGVzOwotICAgIEZUX1VMb25nICAgICAgICBjaWRfY291bnQ7Ci0KLSAgICBGVF9JbnQgICAgICAgICAgbnVtX2RpY3RzOwotICAgIENJRF9GYWNlRGljdCAgICBmb250X2RpY3RzOwotCi0gICAgRlRfVUxvbmcgICAgICAgIGRhdGFfb2Zmc2V0OwotCi0gIH0gQ0lEX0ZhY2VJbmZvUmVjOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0ZhY2VJbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBAQ0lEX0ZhY2VJbmZvUmVjIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBDSURfRmFjZUluZm9SZWNfKiAgQ0lEX0ZhY2VJbmZvOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0luZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGlzIHR5cGUgaXMgZXF1aXZhbGVudCB0byBAQ0lEX0ZhY2VJbmZvUmVjLiAgSXQgaXMgZGVwcmVjYXRlZCBidXQgICovCi0gIC8qICAga2VwdCB0byBtYWludGFpbiBzb3VyY2UgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHZhcmlvdXMgdmVyc2lvbnMgb2YgICAqLwotICAvKiAgIEZyZWVUeXBlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgQ0lEX0ZhY2VJbmZvUmVjICBDSURfSW5mbzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGZ1bmN0aW9uOgotICAgKiAgICBGVF9IYXNfUFNfR2x5cGhfTmFtZXMKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBSZXR1cm4gdHJ1ZSBpZiBhIGdpdmVuIGZhY2UgcHJvdmlkZXMgcmVsaWFibGUgUG9zdFNjcmlwdCBnbHlwaAotICAgKiAgICBuYW1lcy4gIFRoaXMgaXMgc2ltaWxhciB0byB1c2luZyB0aGUgQEZUX0hBU19HTFlQSF9OQU1FUyBtYWNybywKLSAgICogICAgZXhjZXB0IHRoYXQgY2VydGFpbiBmb250cyAobW9zdGx5IFRydWVUeXBlKSBjb250YWluIGluY29ycmVjdAotICAgKiAgICBnbHlwaCBuYW1lIHRhYmxlcy4KLSAgICoKLSAgICogICAgV2hlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgdGhlIGNhbGxlciBpcyBzdXJlIHRoYXQgdGhlIGdseXBoCi0gICAqICAgIG5hbWVzIHJldHVybmVkIGJ5IEBGVF9HZXRfR2x5cGhfTmFtZSBhcmUgcmVsaWFibGUuCi0gICAqCi0gICAqIEBpbnB1dDoKLSAgICogICAgZmFjZSA6OgotICAgKiAgICAgICBmYWNlIGhhbmRsZQotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgICBCb29sZWFuLiAgVHJ1ZSBpZiBnbHlwaCBuYW1lcyBhcmUgcmVsaWFibGUuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0ludCApCi0gIEZUX0hhc19QU19HbHlwaF9OYW1lcyggRlRfRmFjZSAgZmFjZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZnVuY3Rpb246Ci0gICAqICAgIEZUX0dldF9QU19Gb250X0luZm8KLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBSZXRyaWV2ZSB0aGUgQFBTX0ZvbnRJbmZvUmVjIHN0cnVjdHVyZSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4KLSAgICogICAgUG9zdFNjcmlwdCBmb250LgotICAgKgotICAgKiBAaW5wdXQ6Ci0gICAqICAgIGZhY2UgOjoKLSAgICogICAgICAgUG9zdFNjcmlwdCBmYWNlIGhhbmRsZS4KLSAgICoKLSAgICogQG91dHB1dDoKLSAgICogICAgYWZvbnRfaW5mbyA6OgotICAgKiAgICAgICBPdXRwdXQgZm9udCBpbmZvIHN0cnVjdHVyZSBwb2ludGVyLgotICAgKgotICAgKiBAcmV0dXJuOgotICAgKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMH5tZWFucyBzdWNjZXNzLgotICAgKgotICAgKiBAbm90ZToKLSAgICogICAgU3RyaW5nIHBvaW50ZXJzIHdpdGhpbiB0aGUgQFBTX0ZvbnRJbmZvUmVjIHN0cnVjdHVyZSBhcmUgb3duZWQgYnkKLSAgICogICAgdGhlIGZhY2UgYW5kIGRvbid0IG5lZWQgdG8gYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4gIE1pc3NpbmcgZW50cmllcwotICAgKiAgICBpbiB0aGUgZm9udCdzIEZvbnRJbmZvIGRpY3Rpb25hcnkgYXJlIHJlcHJlc2VudGVkIGJ5IE5VTEwgcG9pbnRlcnMuCi0gICAqCi0gICAqICAgIElmIHRoZSBmb250J3MgZm9ybWF0IGlzIG5vdCBQb3N0U2NyaXB0LWJhc2VkLCB0aGlzIGZ1bmN0aW9uIHdpbGwKLSAgICogICAgcmV0dXJuIHRoZSBgRlRfRXJyX0ludmFsaWRfQXJndW1lbnQnIGVycm9yIGNvZGUuCi0gICAqCi0gICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfR2V0X1BTX0ZvbnRfSW5mbyggRlRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIFBTX0ZvbnRJbmZvICBhZm9udF9pbmZvICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICAgRlRfR2V0X1BTX0ZvbnRfUHJpdmF0ZQotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgIFJldHJpZXZlIHRoZSBAUFNfUHJpdmF0ZVJlYyBzdHJ1Y3R1cmUgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuCi0gICAqICAgIFBvc3RTY3JpcHQgZm9udC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgICBmYWNlIDo6Ci0gICAqICAgICAgIFBvc3RTY3JpcHQgZmFjZSBoYW5kbGUuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgIGFmb250X3ByaXZhdGUgOjoKLSAgICogICAgICAgT3V0cHV0IHByaXZhdGUgZGljdGlvbmFyeSBzdHJ1Y3R1cmUgcG9pbnRlci4KLSAgICoKLSAgICogQHJldHVybjoKLSAgICogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDB+bWVhbnMgc3VjY2Vzcy4KLSAgICoKLSAgICogQG5vdGU6Ci0gICAqICAgIFRoZSBzdHJpbmcgcG9pbnRlcnMgd2l0aGluIHRoZSBAUFNfUHJpdmF0ZVJlYyBzdHJ1Y3R1cmUgYXJlIG93bmVkIGJ5Ci0gICAqICAgIHRoZSBmYWNlIGFuZCBkb24ndCBuZWVkIHRvIGJlIGZyZWVkIGJ5IHRoZSBjYWxsZXIuCi0gICAqCi0gICAqICAgIElmIHRoZSBmb250J3MgZm9ybWF0IGlzIG5vdCBQb3N0U2NyaXB0LWJhc2VkLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKLSAgICogICAgdGhlIGBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudCcgZXJyb3IgY29kZS4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9HZXRfUFNfRm9udF9Qcml2YXRlKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQU19Qcml2YXRlICBhZm9udF9wcml2YXRlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9FbmNvZGluZ1R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlbnVtZXJhdGlvbiBkZXNjcmliaW5nIHRoZSBgRW5jb2RpbmcnIGVudHJ5IGluIGEgVHlwZSAxICAgICAgICAgKi8KLSAgLyogICAgZGljdGlvbmFyeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfRU5DT0RJTkdfVFlQRV9OT05FIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0VOQ09ESU5HX1RZUEVfQVJSQVkgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9FTkNPRElOR19UWVBFX1NUQU5EQVJEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfRU5DT0RJTkdfVFlQRV9JU09MQVRJTjEgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0VOQ09ESU5HX1RZUEVfRVhQRVJUIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBlbnVtICBUMV9FbmNvZGluZ1R5cGVfCi0gIHsKLSAgICBUMV9FTkNPRElOR19UWVBFX05PTkUgPSAwLAotICAgIFQxX0VOQ09ESU5HX1RZUEVfQVJSQVksCi0gICAgVDFfRU5DT0RJTkdfVFlQRV9TVEFOREFSRCwKLSAgICBUMV9FTkNPRElOR19UWVBFX0lTT0xBVElOMSwKLSAgICBUMV9FTkNPRElOR19UWVBFX0VYUEVSVAotCi0gIH0gVDFfRW5jb2RpbmdUeXBlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RW51bT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRGljdF9LZXlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gZW51bWVyYXRpb24gdXNlZCBpbiBjYWxscyB0byBARlRfR2V0X1BTX0ZvbnRfVmFsdWUgdG8gaWRlbnRpZnkgICovCi0gIC8qICAgIHRoZSBUeXBlfjEgZGljdGlvbmFyeSBlbnRyeSB0byByZXRyaWV2ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFZhbHVlcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfRk9OVF9UWVBFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0ZPTlRfTUFUUklYIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9GT05UX0JCT1ggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfUEFJTlRfVFlQRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0ZPTlRfTkFNRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9VTklRVUVfSUQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfTlVNX0NIQVJfU1RSSU5HUyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0NIQVJfU1RSSU5HX0tFWSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9DSEFSX1NUUklORyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfRU5DT0RJTkdfVFlQRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0VOQ09ESU5HX0VOVFJZIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9OVU1fU1VCUlMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfU1VCUiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX1NURF9IVyA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9TVERfVlcgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfTlVNX0JMVUVfVkFMVUVTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0JMVUVfVkFMVUUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9CTFVFX0ZVWlogOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfTlVNX09USEVSX0JMVUVTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX09USEVSX0JMVUUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9OVU1fRkFNSUxZX0JMVUVTIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfRkFNSUxZX0JMVUUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX05VTV9GQU1JTFlfT1RIRVJfQkxVRVMgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9GQU1JTFlfT1RIRVJfQkxVRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfQkxVRV9TQ0FMRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX0JMVUVfU0hJRlQgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9OVU1fU1RFTV9TTkFQX0ggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfU1RFTV9TTkFQX0ggOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX05VTV9TVEVNX1NOQVBfViA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9TVEVNX1NOQVBfViA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfRk9SQ0VfQk9MRCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX1JORF9TVEVNX1VQIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9NSU5fRkVBVFVSRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfTEVOX0lWIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX1BBU1NXT1JEIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9MQU5HVUFHRV9HUk9VUCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfVkVSU0lPTiA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX05PVElDRSA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9GVUxMX05BTUUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfRkFNSUxZX05BTUUgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX1dFSUdIVCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9JU19GSVhFRF9QSVRDSCA6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfVU5ERVJMSU5FX1BPU0lUSU9OIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19ESUNUX1VOREVSTElORV9USElDS05FU1MgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUFNfRElDVF9GU19UWVBFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0RJQ1RfSVRBTElDX0FOR0xFIDo6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBlbnVtICBQU19EaWN0X0tleXNfCi0gIHsKLSAgICAvKiBjb252ZW50aW9uYWxseSBpbiB0aGUgZm9udCBkaWN0aW9uYXJ5ICovCi0gICAgUFNfRElDVF9GT05UX1RZUEUsICAgICAgICAgICAgICAvKiBGVF9CeXRlICAgICAgICAgKi8KLSAgICBQU19ESUNUX0ZPTlRfTUFUUklYLCAgICAgICAgICAgIC8qIEZUX0ZpeGVkICAgICAgICAqLwotICAgIFBTX0RJQ1RfRk9OVF9CQk9YLCAgICAgICAgICAgICAgLyogRlRfRml4ZWQgICAgICAgICovCi0gICAgUFNfRElDVF9QQUlOVF9UWVBFLCAgICAgICAgICAgICAvKiBGVF9CeXRlICAgICAgICAgKi8KLSAgICBQU19ESUNUX0ZPTlRfTkFNRSwgICAgICAgICAgICAgIC8qIEZUX1N0cmluZyogICAgICAqLwotICAgIFBTX0RJQ1RfVU5JUVVFX0lELCAgICAgICAgICAgICAgLyogRlRfSW50ICAgICAgICAgICovCi0gICAgUFNfRElDVF9OVU1fQ0hBUl9TVFJJTkdTLCAgICAgICAvKiBGVF9JbnQgICAgICAgICAgKi8KLSAgICBQU19ESUNUX0NIQVJfU1RSSU5HX0tFWSwgICAgICAgIC8qIEZUX1N0cmluZyogICAgICAqLwotICAgIFBTX0RJQ1RfQ0hBUl9TVFJJTkcsICAgICAgICAgICAgLyogRlRfU3RyaW5nKiAgICAgICovCi0gICAgUFNfRElDVF9FTkNPRElOR19UWVBFLCAgICAgICAgICAvKiBUMV9FbmNvZGluZ1R5cGUgKi8KLSAgICBQU19ESUNUX0VOQ09ESU5HX0VOVFJZLCAgICAgICAgIC8qIEZUX1N0cmluZyogICAgICAqLwotCi0gICAgLyogY29udmVudGlvbmFsbHkgaW4gdGhlIGZvbnQgUHJpdmF0ZSBkaWN0aW9uYXJ5ICovCi0gICAgUFNfRElDVF9OVU1fU1VCUlMsICAgICAgICAgICAgICAvKiBGVF9JbnQgICAgICovCi0gICAgUFNfRElDVF9TVUJSLCAgICAgICAgICAgICAgICAgICAvKiBGVF9TdHJpbmcqICovCi0gICAgUFNfRElDVF9TVERfSFcsICAgICAgICAgICAgICAgICAvKiBGVF9VU2hvcnQgICovCi0gICAgUFNfRElDVF9TVERfVlcsICAgICAgICAgICAgICAgICAvKiBGVF9VU2hvcnQgICovCi0gICAgUFNfRElDVF9OVU1fQkxVRV9WQUxVRVMsICAgICAgICAvKiBGVF9CeXRlICAgICovCi0gICAgUFNfRElDVF9CTFVFX1ZBTFVFLCAgICAgICAgICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9CTFVFX0ZVWlosICAgICAgICAgICAgICAvKiBGVF9JbnQgICAgICovCi0gICAgUFNfRElDVF9OVU1fT1RIRVJfQkxVRVMsICAgICAgICAvKiBGVF9CeXRlICAgICovCi0gICAgUFNfRElDVF9PVEhFUl9CTFVFLCAgICAgICAgICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9OVU1fRkFNSUxZX0JMVUVTLCAgICAgICAvKiBGVF9CeXRlICAgICovCi0gICAgUFNfRElDVF9GQU1JTFlfQkxVRSwgICAgICAgICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9OVU1fRkFNSUxZX09USEVSX0JMVUVTLCAvKiBGVF9CeXRlICAgICovCi0gICAgUFNfRElDVF9GQU1JTFlfT1RIRVJfQkxVRSwgICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9CTFVFX1NDQUxFLCAgICAgICAgICAgICAvKiBGVF9GaXhlZCAgICovCi0gICAgUFNfRElDVF9CTFVFX1NISUZULCAgICAgICAgICAgICAvKiBGVF9JbnQgICAgICovCi0gICAgUFNfRElDVF9OVU1fU1RFTV9TTkFQX0gsICAgICAgICAvKiBGVF9CeXRlICAgICovCi0gICAgUFNfRElDVF9TVEVNX1NOQVBfSCwgICAgICAgICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9OVU1fU1RFTV9TTkFQX1YsICAgICAgICAvKiBGVF9CeXRlICAgICovCi0gICAgUFNfRElDVF9TVEVNX1NOQVBfViwgICAgICAgICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9GT1JDRV9CT0xELCAgICAgICAgICAgICAvKiBGVF9Cb29sICAgICovCi0gICAgUFNfRElDVF9STkRfU1RFTV9VUCwgICAgICAgICAgICAvKiBGVF9Cb29sICAgICovCi0gICAgUFNfRElDVF9NSU5fRkVBVFVSRSwgICAgICAgICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9MRU5fSVYsICAgICAgICAgICAgICAgICAvKiBGVF9JbnQgICAgICovCi0gICAgUFNfRElDVF9QQVNTV09SRCwgICAgICAgICAgICAgICAvKiBGVF9Mb25nICAgICovCi0gICAgUFNfRElDVF9MQU5HVUFHRV9HUk9VUCwgICAgICAgICAvKiBGVF9Mb25nICAgICovCi0KLSAgICAvKiBjb252ZW50aW9uYWxseSBpbiB0aGUgZm9udCBGb250SW5mbyBkaWN0aW9uYXJ5ICovCi0gICAgUFNfRElDVF9WRVJTSU9OLCAgICAgICAgICAgICAgICAvKiBGVF9TdHJpbmcqICovCi0gICAgUFNfRElDVF9OT1RJQ0UsICAgICAgICAgICAgICAgICAvKiBGVF9TdHJpbmcqICovCi0gICAgUFNfRElDVF9GVUxMX05BTUUsICAgICAgICAgICAgICAvKiBGVF9TdHJpbmcqICovCi0gICAgUFNfRElDVF9GQU1JTFlfTkFNRSwgICAgICAgICAgICAvKiBGVF9TdHJpbmcqICovCi0gICAgUFNfRElDVF9XRUlHSFQsICAgICAgICAgICAgICAgICAvKiBGVF9TdHJpbmcqICovCi0gICAgUFNfRElDVF9JU19GSVhFRF9QSVRDSCwgICAgICAgICAvKiBGVF9Cb29sICAgICovCi0gICAgUFNfRElDVF9VTkRFUkxJTkVfUE9TSVRJT04sICAgICAvKiBGVF9TaG9ydCAgICovCi0gICAgUFNfRElDVF9VTkRFUkxJTkVfVEhJQ0tORVNTLCAgICAvKiBGVF9VU2hvcnQgICovCi0gICAgUFNfRElDVF9GU19UWVBFLCAgICAgICAgICAgICAgICAvKiBGVF9VU2hvcnQgICovCi0gICAgUFNfRElDVF9JVEFMSUNfQU5HTEUsICAgICAgICAgICAvKiBGVF9Mb25nICAgICovCi0KLSAgICBQU19ESUNUX01BWCA9IFBTX0RJQ1RfSVRBTElDX0FOR0xFCi0KLSAgfSBQU19EaWN0X0tleXM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBmdW5jdGlvbjoKLSAgICogICAgRlRfR2V0X1BTX0ZvbnRfVmFsdWUKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgICBSZXRyaWV2ZSB0aGUgdmFsdWUgZm9yIHRoZSBzdXBwbGllZCBrZXkgZnJvbSBhIFBvc3RTY3JpcHQgZm9udC4KLSAgICoKLSAgICogQGlucHV0OgotICAgKiAgICBmYWNlIDo6Ci0gICAqICAgICAgIFBvc3RTY3JpcHQgZmFjZSBoYW5kbGUuCi0gICAqCi0gICAqICAgIGtleSA6OgotICAgKiAgICAgICBBbiBlbnVtZXJhdGlvbiB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGRpY3Rpb25hcnkga2V5IHRvIHJldHJpZXZlLgotICAgKgotICAgKiAgICBpZHggOjoKLSAgICogICAgICAgRm9yIGFycmF5IHZhbHVlcywgdGhpcyBzcGVjaWZpZXMgdGhlIGluZGV4IHRvIGJlIHJldHVybmVkLgotICAgKgotICAgKiAgICB2YWx1ZSA6OgotICAgKiAgICAgICBBIHBvaW50ZXIgdG8gbWVtb3J5IGludG8gd2hpY2ggdG8gd3JpdGUgdGhlIHZhbHVlLgotICAgKgotICAgKiAgICB2YWxlbl9sZW4gOjoKLSAgICogICAgICAgVGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgbWVtb3J5IHN1cHBsaWVkIGZvciB0aGUgdmFsdWUuCi0gICAqCi0gICAqIEBvdXRwdXQ6Ci0gICAqICAgIHZhbHVlIDo6Ci0gICAqICAgICAgIFRoZSB2YWx1ZSBtYXRjaGluZyB0aGUgYWJvdmUga2V5LCBpZiBpdCBleGlzdHMuCi0gICAqCi0gICAqIEByZXR1cm46Ci0gICAqICAgIFRoZSBhbW91bnQgb2YgbWVtb3J5IChpbiBieXRlcykgcmVxdWlyZWQgdG8gaG9sZCB0aGUgcmVxdWVzdGVkCi0gICAqICAgIHZhbHVlIChpZiBpdCBleGlzdHMsIC0xIG90aGVyd2lzZSkuCi0gICAqCi0gICAqIEBub3RlOgotICAgKiAgICBUaGUgdmFsdWVzIHJldHVybmVkIGFyZSBub3QgcG9pbnRlcnMgaW50byB0aGUgaW50ZXJuYWwgc3RydWN0dXJlcyBvZgotICAgKiAgICB0aGUgZmFjZSwgYnV0IGFyZSBgZnJlc2gnIGNvcGllcywgc28gdGhhdCB0aGUgbWVtb3J5IGNvbnRhaW5pbmcgdGhlbQotICAgKiAgICBiZWxvbmdzIHRvIHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uLiAgVGhpcyBhbHNvIGVuZm9yY2VzIHRoZQotICAgKiAgICBgcmVhZC1vbmx5JyBuYXR1cmUgb2YgdGhlc2UgdmFsdWVzLCBpLmUuLCB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZQotICAgKiAgICB1c2VkIHRvIG1hbmlwdWxhdGUgdGhlIGZhY2UuCi0gICAqCi0gICAqICAgIGB2YWx1ZScgaXMgYSB2b2lkIHBvaW50ZXIgYmVjYXVzZSB0aGUgdmFsdWVzIHJldHVybmVkIGNhbiBiZSBvZgotICAgKiAgICB2YXJpb3VzIHR5cGVzLgotICAgKgotICAgKiAgICBJZiBlaXRoZXIgYHZhbHVlJyBpcyBOVUxMIG9yIGB2YWx1ZV9sZW4nIGlzIHRvbyBzbWFsbCwganVzdCB0aGUKLSAgICogICAgcmVxdWlyZWQgbWVtb3J5IHNpemUgZm9yIHRoZSByZXF1ZXN0ZWQgZW50cnkgaXMgcmV0dXJuZWQuCi0gICAqCi0gICAqICAgIFRoZSBgaWR4JyBwYXJhbWV0ZXIgaXMgdXNlZCwgbm90IG9ubHkgdG8gcmV0cmlldmUgZWxlbWVudHMgb2YsIGZvcgotICAgKiAgICBleGFtcGxlLCB0aGUgRm9udE1hdHJpeCBvciBGb250QkJveCwgYnV0IGFsc28gdG8gcmV0cmlldmUgbmFtZSBrZXlzCi0gICAqICAgIGZyb20gdGhlIENoYXJTdHJpbmdzIGRpY3Rpb25hcnksIGFuZCB0aGUgY2hhcnN0cmluZ3MgdGhlbXNlbHZlcy4gIEl0Ci0gICAqICAgIGlzIGlnbm9yZWQgZm9yIGF0b21pYyB2YWx1ZXMuCi0gICAqCi0gICAqICAgIFBTX0RJQ1RfQkxVRV9TQ0FMRSByZXR1cm5zIGEgdmFsdWUgdGhhdCBpcyBzY2FsZWQgdXAgYnkgMTAwMC4gIFRvCi0gICAqICAgIGdldCB0aGUgdmFsdWUgYXMgaW4gdGhlIGZvbnQgc3RyZWFtLCB5b3UgbmVlZCB0byBkaXZpZGUgYnkKLSAgICogICAgNjU1MzYwMDAuMCAodG8gcmVtb3ZlIHRoZSBGVF9GaXhlZCBzY2FsZSwgYW5kIHRoZSB4MTAwMCBzY2FsZSkuCi0gICAqCi0gICAqICAgIElNUE9SVEFOVDogT25seSBrZXkvdmFsdWUgcGFpcnMgcmVhZCBieSB0aGUgRnJlZVR5cGUgaW50ZXJwcmV0ZXIgY2FuCi0gICAqICAgIGJlIHJldHJpZXZlZC4gIFNvLCBmb3IgZXhhbXBsZSwgUG9zdFNjcmlwdCBwcm9jZWR1cmVzIHN1Y2ggYXMgTlAsCi0gICAqICAgIE5ELCBhbmQgUkQgYXJlIG5vdCBhdmFpbGFibGUuICBBcmJpdHJhcnkga2V5cyBhcmUsIG9idmlvdXNseSwgbm90IGJlCi0gICAqICAgIGF2YWlsYWJsZSBlaXRoZXIuCi0gICAqCi0gICAqICAgIElmIHRoZSBmb250J3MgZm9ybWF0IGlzIG5vdCBQb3N0U2NyaXB0LWJhc2VkLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKLSAgICogICAgdGhlIGBGVF9FcnJfSW52YWxpZF9Bcmd1bWVudCcgZXJyb3IgY29kZS4KLSAgICoKLSAgICovCi0gIEZUX0VYUE9SVCggRlRfTG9uZyApCi0gIEZUX0dldF9QU19Gb250X1ZhbHVlKCBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBQU19EaWN0X0tleXMgIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgdmFsdWVfbGVuICk7Ci0KLSAgLyogKi8KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19UMVRBQkxFU19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvdHRuYW1laWQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvdHRuYW1laWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk1ODVmMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL3R0bmFtZWlkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0bmFtZWlkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBuYW1lIElEIGRlZmluaXRpb25zIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1RUTkFNRUlEX0hfXwotI2RlZmluZSBfX1RUTkFNRUlEX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U2VjdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHJ1ZXR5cGVfdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBgcGxhdGZvcm0nIGlkZW50aWZpZXIgY29kZSBpbiB0aGUgbmFtZSAgICAgICAgKi8KLSAgLyogcmVjb3JkcyBvZiB0aGUgVFRGIGBuYW1lJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICBUVF9QTEFURk9STV9YWFgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbGlzdCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgcGxhdGZvcm1faWQnIGlkZW50aWZpZXIgY29kZSBpbgotICAgKiAgIEBGVF9DaGFyTWFwUmVjIGFuZCBARlRfU2ZudE5hbWUgc3RydWN0dXJlcy4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBUVF9QTEFURk9STV9BUFBMRV9VTklDT0RFIDo6Ci0gICAqICAgICBVc2VkIGJ5IEFwcGxlIHRvIGluZGljYXRlIGEgVW5pY29kZSBjaGFyYWN0ZXIgbWFwIGFuZC9vciBuYW1lIGVudHJ5LgotICAgKiAgICAgU2VlIEBUVF9BUFBMRV9JRF9YWFggZm9yIGNvcnJlc3BvbmRpbmcgYGVuY29kaW5nX2lkJyB2YWx1ZXMuICBOb3RlCi0gICAqICAgICB0aGF0IG5hbWUgZW50cmllcyBpbiB0aGlzIGZvcm1hdCBhcmUgY29kZWQgYXMgYmlnLWVuZGlhbiBVQ1MtMgotICAgKiAgICAgY2hhcmFjdGVyIGNvZGVzIF9vbmx5Xy4KLSAgICoKLSAgICogICBUVF9QTEFURk9STV9NQUNJTlRPU0ggOjoKLSAgICogICAgIFVzZWQgYnkgQXBwbGUgdG8gaW5kaWNhdGUgYSBNYWNPUy1zcGVjaWZpYyBjaGFybWFwIGFuZC9vciBuYW1lIGVudHJ5LgotICAgKiAgICAgU2VlIEBUVF9NQUNfSURfWFhYIGZvciBjb3JyZXNwb25kaW5nIGBlbmNvZGluZ19pZCcgdmFsdWVzLiAgTm90ZSB0aGF0Ci0gICAqICAgICBtb3N0IFRydWVUeXBlIGZvbnRzIGNvbnRhaW4gYW4gQXBwbGUgcm9tYW4gY2hhcm1hcCB0byBiZSB1c2FibGUgb24KLSAgICogICAgIE1hY09TIHN5c3RlbXMgKGV2ZW4gaWYgdGhleSBjb250YWluIGEgTWljcm9zb2Z0IGNoYXJtYXAgYXMgd2VsbCkuCi0gICAqCi0gICAqICAgVFRfUExBVEZPUk1fSVNPIDo6Ci0gICAqICAgICBUaGlzIHZhbHVlIHdhcyB1c2VkIHRvIHNwZWNpZnkgSVNPL0lFQyAxMDY0NiBjaGFybWFwcy4gIEl0IGlzIGhvd2V2ZXIKLSAgICogICAgIG5vdyBkZXByZWNhdGVkLiAgU2VlIEBUVF9JU09fSURfWFhYIGZvciBhIGxpc3Qgb2YgY29ycmVzcG9uZGluZwotICAgKiAgICAgYGVuY29kaW5nX2lkJyB2YWx1ZXMuCi0gICAqCi0gICAqICAgVFRfUExBVEZPUk1fTUlDUk9TT0ZUIDo6Ci0gICAqICAgICBVc2VkIGJ5IE1pY3Jvc29mdCB0byBpbmRpY2F0ZSBXaW5kb3dzLXNwZWNpZmljIGNoYXJtYXBzLiAgU2VlCi0gICAqICAgICBAVFRfTVNfSURfWFhYIGZvciBhIGxpc3Qgb2YgY29ycmVzcG9uZGluZyBgZW5jb2RpbmdfaWQnIHZhbHVlcy4KLSAgICogICAgIE5vdGUgdGhhdCBtb3N0IGZvbnRzIGNvbnRhaW4gYSBVbmljb2RlIGNoYXJtYXAgdXNpbmcKLSAgICogICAgIChUVF9QTEFURk9STV9NSUNST1NPRlQsIEBUVF9NU19JRF9VTklDT0RFX0NTKS4KLSAgICoKLSAgICogICBUVF9QTEFURk9STV9DVVNUT00gOjoKLSAgICogICAgIFVzZWQgdG8gaW5kaWNhdGUgYXBwbGljYXRpb24tc3BlY2lmaWMgY2hhcm1hcHMuCi0gICAqCi0gICAqICAgVFRfUExBVEZPUk1fQURPQkUgOjoKLSAgICogICAgIFRoaXMgdmFsdWUgaXNuJ3QgcGFydCBvZiBhbnkgZm9udCBmb3JtYXQgc3BlY2lmaWNhdGlvbiwgYnV0IGlzIHVzZWQKLSAgICogICAgIGJ5IEZyZWVUeXBlIHRvIHJlcG9ydCBBZG9iZS1zcGVjaWZpYyBjaGFybWFwcyBpbiBhbiBARlRfQ2hhck1hcFJlYwotICAgKiAgICAgc3RydWN0dXJlLiAgU2VlIEBUVF9BRE9CRV9JRF9YWFguCi0gICAqLwotCi0jZGVmaW5lIFRUX1BMQVRGT1JNX0FQUExFX1VOSUNPREUgIDAKLSNkZWZpbmUgVFRfUExBVEZPUk1fTUFDSU5UT1NIICAgICAgMQotI2RlZmluZSBUVF9QTEFURk9STV9JU08gICAgICAgICAgICAyIC8qIGRlcHJlY2F0ZWQgKi8KLSNkZWZpbmUgVFRfUExBVEZPUk1fTUlDUk9TT0ZUICAgICAgMwotI2RlZmluZSBUVF9QTEFURk9STV9DVVNUT00gICAgICAgICA0Ci0jZGVmaW5lIFRUX1BMQVRGT1JNX0FET0JFICAgICAgICAgIDcgLyogYXJ0aWZpY2lhbCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIFRUX0FQUExFX0lEX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhlIGBlbmNvZGluZ19pZCcgZm9yCi0gICAqICAgQFRUX1BMQVRGT1JNX0FQUExFX1VOSUNPREUgY2hhcm1hcHMgYW5kIG5hbWUgZW50cmllcy4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBUVF9BUFBMRV9JRF9ERUZBVUxUIDo6Ci0gICAqICAgICBVbmljb2RlIHZlcnNpb24gMS4wLgotICAgKgotICAgKiAgIFRUX0FQUExFX0lEX1VOSUNPREVfMV8xIDo6Ci0gICAqICAgICBVbmljb2RlIDEuMTsgc3BlY2lmaWVzIEhhbmd1bCBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGF0IFUrMzR4eC4KLSAgICoKLSAgICogICBUVF9BUFBMRV9JRF9JU09fMTA2NDYgOjoKLSAgICogICAgIERlcHJlY2F0ZWQgKGlkZW50aWNhbCB0byBwcmVjZWRpbmcpLgotICAgKgotICAgKiAgIFRUX0FQUExFX0lEX1VOSUNPREVfMl8wIDo6Ci0gICAqICAgICBVbmljb2RlIDIuMCBhbmQgYmV5b25kIChVVEYtMTYgQk1QIG9ubHkpLgotICAgKgotICAgKiAgIFRUX0FQUExFX0lEX1VOSUNPREVfMzIgOjoKLSAgICogICAgIFVuaWNvZGUgMy4xIGFuZCBiZXlvbmQsIHVzaW5nIFVURi0zMi4KLSAgICoKLSAgICogICBUVF9BUFBMRV9JRF9WQVJJQU5UX1NFTEVDVE9SIDo6Ci0gICAqICAgICBGcm9tIEFkb2JlLCBub3QgQXBwbGUuICBOb3QgYSBub3JtYWwgY21hcC4gIFNwZWNpZmllcyB2YXJpYXRpb25zCi0gICAqICAgICBvbiBhIHJlYWwgY21hcC4KLSAgICovCi0KLSNkZWZpbmUgVFRfQVBQTEVfSURfREVGQVVMVCAgICAgICAgICAgMCAvKiBVbmljb2RlIDEuMCAqLwotI2RlZmluZSBUVF9BUFBMRV9JRF9VTklDT0RFXzFfMSAgICAgICAxIC8qIHNwZWNpZnkgSGFuZ3VsIGF0IFUrMzR4eCAqLwotI2RlZmluZSBUVF9BUFBMRV9JRF9JU09fMTA2NDYgICAgICAgICAyIC8qIGRlcHJlY2F0ZWQgKi8KLSNkZWZpbmUgVFRfQVBQTEVfSURfVU5JQ09ERV8yXzAgICAgICAgMyAvKiBvciBsYXRlciAqLwotI2RlZmluZSBUVF9BUFBMRV9JRF9VTklDT0RFXzMyICAgICAgICA0IC8qIDIuMCBvciBsYXRlciwgZnVsbCByZXBlcnRvaXJlICovCi0jZGVmaW5lIFRUX0FQUExFX0lEX1ZBUklBTlRfU0VMRUNUT1IgIDUgLyogdmFyaWF0aW9uIHNlbGVjdG9yIGRhdGEgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICBUVF9NQUNfSURfWFhYCi0gICAqCi0gICAqIEBkZXNjcmlwdGlvbjoKLSAgICogICBBIGxpc3Qgb2YgdmFsaWQgdmFsdWVzIGZvciB0aGUgYGVuY29kaW5nX2lkJyBmb3IKLSAgICogICBAVFRfUExBVEZPUk1fTUFDSU5UT1NIIGNoYXJtYXBzIGFuZCBuYW1lIGVudHJpZXMuCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgVFRfTUFDX0lEX1JPTUFOIDo6Ci0gICAqICAgVFRfTUFDX0lEX0pBUEFORVNFIDo6Ci0gICAqICAgVFRfTUFDX0lEX1RSQURJVElPTkFMX0NISU5FU0UgOjoKLSAgICogICBUVF9NQUNfSURfS09SRUFOIDo6Ci0gICAqICAgVFRfTUFDX0lEX0FSQUJJQyA6OgotICAgKiAgIFRUX01BQ19JRF9IRUJSRVcgOjoKLSAgICogICBUVF9NQUNfSURfR1JFRUsgOjoKLSAgICogICBUVF9NQUNfSURfUlVTU0lBTiA6OgotICAgKiAgIFRUX01BQ19JRF9SU1lNQk9MIDo6Ci0gICAqICAgVFRfTUFDX0lEX0RFVkFOQUdBUkkgOjoKLSAgICogICBUVF9NQUNfSURfR1VSTVVLSEkgOjoKLSAgICogICBUVF9NQUNfSURfR1VKQVJBVEkgOjoKLSAgICogICBUVF9NQUNfSURfT1JJWUEgOjoKLSAgICogICBUVF9NQUNfSURfQkVOR0FMSSA6OgotICAgKiAgIFRUX01BQ19JRF9UQU1JTCA6OgotICAgKiAgIFRUX01BQ19JRF9URUxVR1UgOjoKLSAgICogICBUVF9NQUNfSURfS0FOTkFEQSA6OgotICAgKiAgIFRUX01BQ19JRF9NQUxBWUFMQU0gOjoKLSAgICogICBUVF9NQUNfSURfU0lOSEFMRVNFIDo6Ci0gICAqICAgVFRfTUFDX0lEX0JVUk1FU0UgOjoKLSAgICogICBUVF9NQUNfSURfS0hNRVIgOjoKLSAgICogICBUVF9NQUNfSURfVEhBSSA6OgotICAgKiAgIFRUX01BQ19JRF9MQU9USUFOIDo6Ci0gICAqICAgVFRfTUFDX0lEX0dFT1JHSUFOIDo6Ci0gICAqICAgVFRfTUFDX0lEX0FSTUVOSUFOIDo6Ci0gICAqICAgVFRfTUFDX0lEX01BTERJVklBTiA6OgotICAgKiAgIFRUX01BQ19JRF9TSU1QTElGSUVEX0NISU5FU0UgOjoKLSAgICogICBUVF9NQUNfSURfVElCRVRBTiA6OgotICAgKiAgIFRUX01BQ19JRF9NT05HT0xJQU4gOjoKLSAgICogICBUVF9NQUNfSURfR0VFWiA6OgotICAgKiAgIFRUX01BQ19JRF9TTEFWSUMgOjoKLSAgICogICBUVF9NQUNfSURfVklFVE5BTUVTRSA6OgotICAgKiAgIFRUX01BQ19JRF9TSU5ESEkgOjoKLSAgICogICBUVF9NQUNfSURfVU5JTlRFUlAgOjoKLSAgICovCi0KLSNkZWZpbmUgVFRfTUFDX0lEX1JPTUFOICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFRUX01BQ19JRF9KQVBBTkVTRSAgICAgICAgICAgICAgMQotI2RlZmluZSBUVF9NQUNfSURfVFJBRElUSU9OQUxfQ0hJTkVTRSAgIDIKLSNkZWZpbmUgVFRfTUFDX0lEX0tPUkVBTiAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIFRUX01BQ19JRF9BUkFCSUMgICAgICAgICAgICAgICAgNAotI2RlZmluZSBUVF9NQUNfSURfSEVCUkVXICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgVFRfTUFDX0lEX0dSRUVLICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIFRUX01BQ19JRF9SVVNTSUFOICAgICAgICAgICAgICAgNwotI2RlZmluZSBUVF9NQUNfSURfUlNZTUJPTCAgICAgICAgICAgICAgIDgKLSNkZWZpbmUgVFRfTUFDX0lEX0RFVkFOQUdBUkkgICAgICAgICAgICA5Ci0jZGVmaW5lIFRUX01BQ19JRF9HVVJNVUtISSAgICAgICAgICAgICAxMAotI2RlZmluZSBUVF9NQUNfSURfR1VKQVJBVEkgICAgICAgICAgICAgMTEKLSNkZWZpbmUgVFRfTUFDX0lEX09SSVlBICAgICAgICAgICAgICAgIDEyCi0jZGVmaW5lIFRUX01BQ19JRF9CRU5HQUxJICAgICAgICAgICAgICAxMwotI2RlZmluZSBUVF9NQUNfSURfVEFNSUwgICAgICAgICAgICAgICAgMTQKLSNkZWZpbmUgVFRfTUFDX0lEX1RFTFVHVSAgICAgICAgICAgICAgIDE1Ci0jZGVmaW5lIFRUX01BQ19JRF9LQU5OQURBICAgICAgICAgICAgICAxNgotI2RlZmluZSBUVF9NQUNfSURfTUFMQVlBTEFNICAgICAgICAgICAgMTcKLSNkZWZpbmUgVFRfTUFDX0lEX1NJTkhBTEVTRSAgICAgICAgICAgIDE4Ci0jZGVmaW5lIFRUX01BQ19JRF9CVVJNRVNFICAgICAgICAgICAgICAxOQotI2RlZmluZSBUVF9NQUNfSURfS0hNRVIgICAgICAgICAgICAgICAgMjAKLSNkZWZpbmUgVFRfTUFDX0lEX1RIQUkgICAgICAgICAgICAgICAgIDIxCi0jZGVmaW5lIFRUX01BQ19JRF9MQU9USUFOICAgICAgICAgICAgICAyMgotI2RlZmluZSBUVF9NQUNfSURfR0VPUkdJQU4gICAgICAgICAgICAgMjMKLSNkZWZpbmUgVFRfTUFDX0lEX0FSTUVOSUFOICAgICAgICAgICAgIDI0Ci0jZGVmaW5lIFRUX01BQ19JRF9NQUxESVZJQU4gICAgICAgICAgICAyNQotI2RlZmluZSBUVF9NQUNfSURfU0lNUExJRklFRF9DSElORVNFICAgMjUKLSNkZWZpbmUgVFRfTUFDX0lEX1RJQkVUQU4gICAgICAgICAgICAgIDI2Ci0jZGVmaW5lIFRUX01BQ19JRF9NT05HT0xJQU4gICAgICAgICAgICAyNwotI2RlZmluZSBUVF9NQUNfSURfR0VFWiAgICAgICAgICAgICAgICAgMjgKLSNkZWZpbmUgVFRfTUFDX0lEX1NMQVZJQyAgICAgICAgICAgICAgIDI5Ci0jZGVmaW5lIFRUX01BQ19JRF9WSUVUTkFNRVNFICAgICAgICAgICAzMAotI2RlZmluZSBUVF9NQUNfSURfU0lOREhJICAgICAgICAgICAgICAgMzEKLSNkZWZpbmUgVFRfTUFDX0lEX1VOSU5URVJQICAgICAgICAgICAgIDMyCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICoKLSAgICogQGVudW06Ci0gICAqICAgVFRfSVNPX0lEX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhlIGBlbmNvZGluZ19pZCcgZm9yCi0gICAqICAgQFRUX1BMQVRGT1JNX0lTTyBjaGFybWFwcyBhbmQgbmFtZSBlbnRyaWVzLgotICAgKgotICAgKiAgIFRoZWlyIHVzZSBpcyBub3cgZGVwcmVjYXRlZC4KLSAgICoKLSAgICogQHZhbHVlczoKLSAgICogICBUVF9JU09fSURfN0JJVF9BU0NJSSA6OgotICAgKiAgICAgQVNDSUkuCi0gICAqICAgVFRfSVNPX0lEXzEwNjQ2IDo6Ci0gICAqICAgICBJU08vMTA2NDYuCi0gICAqICAgVFRfSVNPX0lEXzg4NTlfMSA6OgotICAgKiAgICAgQWxzbyBrbm93biBhcyBMYXRpbi0xLgotICAgKi8KLQotI2RlZmluZSBUVF9JU09fSURfN0JJVF9BU0NJSSAgMAotI2RlZmluZSBUVF9JU09fSURfMTA2NDYgICAgICAgMQotI2RlZmluZSBUVF9JU09fSURfODg1OV8xICAgICAgMgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAqCi0gICAqIEBlbnVtOgotICAgKiAgIFRUX01TX0lEX1hYWAotICAgKgotICAgKiBAZGVzY3JpcHRpb246Ci0gICAqICAgQSBsaXN0IG9mIHZhbGlkIHZhbHVlcyBmb3IgdGhlIGBlbmNvZGluZ19pZCcgZm9yCi0gICAqICAgQFRUX1BMQVRGT1JNX01JQ1JPU09GVCBjaGFybWFwcyBhbmQgbmFtZSBlbnRyaWVzLgotICAgKgotICAgKiBAdmFsdWVzOgotICAgKiAgIFRUX01TX0lEX1NZTUJPTF9DUyA6OgotICAgKiAgICAgQ29ycmVzcG9uZHMgdG8gTWljcm9zb2Z0IHN5bWJvbCBlbmNvZGluZy4gU2VlCi0gICAqICAgICBARlRfRU5DT0RJTkdfTVNfU1lNQk9MLgotICAgKgotICAgKiAgIFRUX01TX0lEX1VOSUNPREVfQ1MgOjoKLSAgICogICAgIENvcnJlc3BvbmRzIHRvIGEgTWljcm9zb2Z0IFdHTDQgY2hhcm1hcCwgbWF0Y2hpbmcgVW5pY29kZS4gIFNlZQotICAgKiAgICAgQEZUX0VOQ09ESU5HX1VOSUNPREUuCi0gICAqCi0gICAqICAgVFRfTVNfSURfU0pJUyA6OgotICAgKiAgICAgQ29ycmVzcG9uZHMgdG8gU0pJUyBKYXBhbmVzZSBlbmNvZGluZy4gIFNlZSBARlRfRU5DT0RJTkdfU0pJUy4KLSAgICoKLSAgICogICBUVF9NU19JRF9HQjIzMTIgOjoKLSAgICogICAgIENvcnJlc3BvbmRzIHRvIFNpbXBsaWZpZWQgQ2hpbmVzZSBhcyB1c2VkIGluIE1haW5sYW5kIENoaW5hLiAgU2VlCi0gICAqICAgICBARlRfRU5DT0RJTkdfR0IyMzEyLgotICAgKgotICAgKiAgIFRUX01TX0lEX0JJR181IDo6Ci0gICAqICAgICBDb3JyZXNwb25kcyB0byBUcmFkaXRpb25hbCBDaGluZXNlIGFzIHVzZWQgaW4gVGFpd2FuIGFuZCBIb25nIEtvbmcuCi0gICAqICAgICBTZWUgQEZUX0VOQ09ESU5HX0JJRzUuCi0gICAqCi0gICAqICAgVFRfTVNfSURfV0FOU1VORyA6OgotICAgKiAgICAgQ29ycmVzcG9uZHMgdG8gS29yZWFuIFdhbnN1bmcgZW5jb2RpbmcuICBTZWUgQEZUX0VOQ09ESU5HX1dBTlNVTkcuCi0gICAqCi0gICAqICAgVFRfTVNfSURfSk9IQUIgOjoKLSAgICogICAgIENvcnJlc3BvbmRzIHRvIEpvaGFiIGVuY29kaW5nLiAgU2VlIEBGVF9FTkNPRElOR19KT0hBQi4KLSAgICoKLSAgICogICBUVF9NU19JRF9VQ1NfNCA6OgotICAgKiAgICAgQ29ycmVzcG9uZHMgdG8gVUNTLTQgb3IgVVRGLTMyIGNoYXJtYXBzLiAgVGhpcyBoYXMgYmVlbiBhZGRlZCB0bwotICAgKiAgICAgdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24gdmVyc2lvbiAxLjQgKG1pZC0yMDAxLikKLSAgICovCi0KLSNkZWZpbmUgVFRfTVNfSURfU1lNQk9MX0NTICAgIDAKLSNkZWZpbmUgVFRfTVNfSURfVU5JQ09ERV9DUyAgIDEKLSNkZWZpbmUgVFRfTVNfSURfU0pJUyAgICAgICAgIDIKLSNkZWZpbmUgVFRfTVNfSURfR0IyMzEyICAgICAgIDMKLSNkZWZpbmUgVFRfTVNfSURfQklHXzUgICAgICAgIDQKLSNkZWZpbmUgVFRfTVNfSURfV0FOU1VORyAgICAgIDUKLSNkZWZpbmUgVFRfTVNfSURfSk9IQUIgICAgICAgIDYKLSNkZWZpbmUgVFRfTVNfSURfVUNTXzQgICAgICAgMTAKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgKgotICAgKiBAZW51bToKLSAgICogICBUVF9BRE9CRV9JRF9YWFgKLSAgICoKLSAgICogQGRlc2NyaXB0aW9uOgotICAgKiAgIEEgbGlzdCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHRoZSBgZW5jb2RpbmdfaWQnIGZvcgotICAgKiAgIEBUVF9QTEFURk9STV9BRE9CRSBjaGFybWFwcy4gIFRoaXMgaXMgYSBGcmVlVHlwZS1zcGVjaWZpYyBleHRlbnNpb24hCi0gICAqCi0gICAqIEB2YWx1ZXM6Ci0gICAqICAgVFRfQURPQkVfSURfU1RBTkRBUkQgOjoKLSAgICogICAgIEFkb2JlIHN0YW5kYXJkIGVuY29kaW5nLgotICAgKiAgIFRUX0FET0JFX0lEX0VYUEVSVCA6OgotICAgKiAgICAgQWRvYmUgZXhwZXJ0IGVuY29kaW5nLgotICAgKiAgIFRUX0FET0JFX0lEX0NVU1RPTSA6OgotICAgKiAgICAgQWRvYmUgY3VzdG9tIGVuY29kaW5nLgotICAgKiAgIFRUX0FET0JFX0lEX0xBVElOXzEgOjoKLSAgICogICAgIEFkb2JlIExhdGlufjEgZW5jb2RpbmcuCi0gICAqLwotCi0jZGVmaW5lIFRUX0FET0JFX0lEX1NUQU5EQVJEICAwCi0jZGVmaW5lIFRUX0FET0JFX0lEX0VYUEVSVCAgICAxCi0jZGVmaW5lIFRUX0FET0JFX0lEX0NVU1RPTSAgICAyCi0jZGVmaW5lIFRUX0FET0JFX0lEX0xBVElOXzEgICAzCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgbGFuZ3VhZ2UgaWRlbnRpZmllciBmaWVsZCBpbiB0aGUgbmFtZSByZWNvcmRzICAqLwotICAvKiBvZiB0aGUgVFRGIGBuYW1lJyB0YWJsZSBpZiB0aGUgYHBsYXRmb3JtJyBpZGVudGlmaWVyIGNvZGUgaXMgICAgICAgICAgKi8KLSAgLyogVFRfUExBVEZPUk1fTUFDSU5UT1NILiAgVGhlc2UgdmFsdWVzIGFyZSBhbHNvIHVzZWQgYXMgcmV0dXJuIHZhbHVlcyAgICovCi0gIC8qIGZvciBmdW5jdGlvbiBARlRfR2V0X0NNYXBfTGFuZ3VhZ2VfSUQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGNhbm9uaWNhbCBzb3VyY2UgZm9yIHRoZSBBcHBsZSBhc3NpZ25lZCBMYW5ndWFnZSBJRCdzIGlzIGF0ICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9mb250cy9UcnVlVHlwZS1SZWZlcmVuY2UtTWFudWFsL1JNMDYvQ2hhcDZuYW1lLmh0bWwgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfRU5HTElTSCAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZSRU5DSCAgICAgICAgICAgICAgICAgICAgICAgIDEKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HRVJNQU4gICAgICAgICAgICAgICAgICAgICAgICAyCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfSVRBTElBTiAgICAgICAgICAgICAgICAgICAgICAgMwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0RVVENIICAgICAgICAgICAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TV0VESVNIICAgICAgICAgICAgICAgICAgICAgICA1Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfU1BBTklTSCAgICAgICAgICAgICAgICAgICAgICAgNgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0RBTklTSCAgICAgICAgICAgICAgICAgICAgICAgIDcKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9QT1JUVUdVRVNFICAgICAgICAgICAgICAgICAgICA4Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfTk9SV0VHSUFOICAgICAgICAgICAgICAgICAgICAgOQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0hFQlJFVyAgICAgICAgICAgICAgICAgICAgICAgMTAKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9KQVBBTkVTRSAgICAgICAgICAgICAgICAgICAgIDExCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfQVJBQklDICAgICAgICAgICAgICAgICAgICAgICAxMgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZJTk5JU0ggICAgICAgICAgICAgICAgICAgICAgMTMKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HUkVFSyAgICAgICAgICAgICAgICAgICAgICAgIDE0Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfSUNFTEFORElDICAgICAgICAgICAgICAgICAgICAxNQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX01BTFRFU0UgICAgICAgICAgICAgICAgICAgICAgMTYKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9UVVJLSVNIICAgICAgICAgICAgICAgICAgICAgIDE3Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfQ1JPQVRJQU4gICAgICAgICAgICAgICAgICAgICAxOAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0NISU5FU0VfVFJBRElUSU9OQUwgICAgICAgICAgMTkKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9VUkRVICAgICAgICAgICAgICAgICAgICAgICAgIDIwCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfSElOREkgICAgICAgICAgICAgICAgICAgICAgICAyMQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RIQUkgICAgICAgICAgICAgICAgICAgICAgICAgMjIKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9LT1JFQU4gICAgICAgICAgICAgICAgICAgICAgIDIzCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfTElUSFVBTklBTiAgICAgICAgICAgICAgICAgICAyNAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1BPTElTSCAgICAgICAgICAgICAgICAgICAgICAgMjUKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9IVU5HQVJJQU4gICAgICAgICAgICAgICAgICAgIDI2Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfRVNUT05JQU4gICAgICAgICAgICAgICAgICAgICAyNwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0xFVFRJU0ggICAgICAgICAgICAgICAgICAgICAgMjgKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TQUFNSVNLICAgICAgICAgICAgICAgICAgICAgIDI5Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfRkFFUk9FU0UgICAgICAgICAgICAgICAgICAgICAzMAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZBUlNJICAgICAgICAgICAgICAgICAgICAgICAgMzEKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9SVVNTSUFOICAgICAgICAgICAgICAgICAgICAgIDMyCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfQ0hJTkVTRV9TSU1QTElGSUVEICAgICAgICAgICAzMwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0ZMRU1JU0ggICAgICAgICAgICAgICAgICAgICAgMzQKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9JUklTSCAgICAgICAgICAgICAgICAgICAgICAgIDM1Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfQUxCQU5JQU4gICAgICAgICAgICAgICAgICAgICAzNgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1JPTUFOSUFOICAgICAgICAgICAgICAgICAgICAgMzcKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9DWkVDSCAgICAgICAgICAgICAgICAgICAgICAgIDM4Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfU0xPVkFLICAgICAgICAgICAgICAgICAgICAgICAzOQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NMT1ZFTklBTiAgICAgICAgICAgICAgICAgICAgNDAKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9ZSURESVNIICAgICAgICAgICAgICAgICAgICAgIDQxCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfU0VSQklBTiAgICAgICAgICAgICAgICAgICAgICA0MgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX01BQ0VET05JQU4gICAgICAgICAgICAgICAgICAgNDMKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9CVUxHQVJJQU4gICAgICAgICAgICAgICAgICAgIDQ0Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfVUtSQUlOSUFOICAgICAgICAgICAgICAgICAgICA0NQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0JZRUxPUlVTU0lBTiAgICAgICAgICAgICAgICAgNDYKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9VWkJFSyAgICAgICAgICAgICAgICAgICAgICAgIDQ3Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfS0FaQUtIICAgICAgICAgICAgICAgICAgICAgICA0OAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FaRVJCQUlKQU5JICAgICAgICAgICAgICAgICAgNDkKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9BWkVSQkFJSkFOSV9DWVJJTExJQ19TQ1JJUFQgIDQ5Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfQVpFUkJBSUpBTklfQVJBQklDX1NDUklQVCAgICA1MAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FSTUVOSUFOICAgICAgICAgICAgICAgICAgICAgNTEKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HRU9SR0lBTiAgICAgICAgICAgICAgICAgICAgIDUyCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfTU9MREFWSUFOICAgICAgICAgICAgICAgICAgICA1MwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0tJUkdISVogICAgICAgICAgICAgICAgICAgICAgNTQKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9UQUpJS0kgICAgICAgICAgICAgICAgICAgICAgIDU1Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfVFVSS01FTiAgICAgICAgICAgICAgICAgICAgICA1NgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX01PTkdPTElBTiAgICAgICAgICAgICAgICAgICAgNTcKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NT05HT0xJQU5fTU9OR09MSUFOX1NDUklQVCAgIDU3Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfTU9OR09MSUFOX0NZUklMTElDX1NDUklQVCAgICA1OAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1BBU0hUTyAgICAgICAgICAgICAgICAgICAgICAgNTkKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9LVVJESVNIICAgICAgICAgICAgICAgICAgICAgIDYwCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfS0FTSE1JUkkgICAgICAgICAgICAgICAgICAgICA2MQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NJTkRISSAgICAgICAgICAgICAgICAgICAgICAgNjIKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9USUJFVEFOICAgICAgICAgICAgICAgICAgICAgIDYzCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfTkVQQUxJICAgICAgICAgICAgICAgICAgICAgICA2NAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NBTlNLUklUICAgICAgICAgICAgICAgICAgICAgNjUKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQVJBVEhJICAgICAgICAgICAgICAgICAgICAgIDY2Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfQkVOR0FMSSAgICAgICAgICAgICAgICAgICAgICA2NwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FTU0FNRVNFICAgICAgICAgICAgICAgICAgICAgNjgKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HVUpBUkFUSSAgICAgICAgICAgICAgICAgICAgIDY5Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfUFVOSkFCSSAgICAgICAgICAgICAgICAgICAgICA3MAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX09SSVlBICAgICAgICAgICAgICAgICAgICAgICAgNzEKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQUxBWUFMQU0gICAgICAgICAgICAgICAgICAgIDcyCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfS0FOTkFEQSAgICAgICAgICAgICAgICAgICAgICA3MwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RBTUlMICAgICAgICAgICAgICAgICAgICAgICAgNzQKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9URUxVR1UgICAgICAgICAgICAgICAgICAgICAgIDc1Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfU0lOSEFMRVNFICAgICAgICAgICAgICAgICAgICA3NgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0JVUk1FU0UgICAgICAgICAgICAgICAgICAgICAgNzcKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9LSE1FUiAgICAgICAgICAgICAgICAgICAgICAgIDc4Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfTEFPICAgICAgICAgICAgICAgICAgICAgICAgICA3OQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1ZJRVROQU1FU0UgICAgICAgICAgICAgICAgICAgODAKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9JTkRPTkVTSUFOICAgICAgICAgICAgICAgICAgIDgxCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfVEFHQUxPRyAgICAgICAgICAgICAgICAgICAgICA4MgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX01BTEFZX1JPTUFOX1NDUklQVCAgICAgICAgICAgODMKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQUxBWV9BUkFCSUNfU0NSSVBUICAgICAgICAgIDg0Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfQU1IQVJJQyAgICAgICAgICAgICAgICAgICAgICA4NQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RJR1JJTllBICAgICAgICAgICAgICAgICAgICAgODYKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HQUxMQSAgICAgICAgICAgICAgICAgICAgICAgIDg3Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfU09NQUxJICAgICAgICAgICAgICAgICAgICAgICA4OAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NXQUhJTEkgICAgICAgICAgICAgICAgICAgICAgODkKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9SVUFOREEgICAgICAgICAgICAgICAgICAgICAgIDkwCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfUlVOREkgICAgICAgICAgICAgICAgICAgICAgICA5MQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0NIRVdBICAgICAgICAgICAgICAgICAgICAgICAgOTIKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQUxBR0FTWSAgICAgICAgICAgICAgICAgICAgIDkzCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfRVNQRVJBTlRPICAgICAgICAgICAgICAgICAgICA5NAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1dFTFNIICAgICAgICAgICAgICAgICAgICAgICAxMjgKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9CQVNRVUUgICAgICAgICAgICAgICAgICAgICAgMTI5Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfQ0FUQUxBTiAgICAgICAgICAgICAgICAgICAgIDEzMAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0xBVElOICAgICAgICAgICAgICAgICAgICAgICAxMzEKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9RVUVDSFVBICAgICAgICAgICAgICAgICAgICAgMTMyCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfR1VBUkFOSSAgICAgICAgICAgICAgICAgICAgIDEzMwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FZTUFSQSAgICAgICAgICAgICAgICAgICAgICAxMzQKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9UQVRBUiAgICAgICAgICAgICAgICAgICAgICAgMTM1Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfVUlHSFVSICAgICAgICAgICAgICAgICAgICAgIDEzNgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0RaT05HS0hBICAgICAgICAgICAgICAgICAgICAxMzcKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9KQVZBTkVTRSAgICAgICAgICAgICAgICAgICAgMTM4Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfU1VOREFORVNFICAgICAgICAgICAgICAgICAgIDEzOQotCi0KLSNpZiAwICAvKiB0aGVzZSBzZWVtIHRvIGJlIGVycm9ycyB0aGF0IGhhdmUgYmVlbiBkcm9wcGVkICovCi0KLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9TQ09UVElTSF9HQUVMSUMgICAgICAgICAgICAgMTQwCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfSVJJU0hfR0FFTElDICAgICAgICAgICAgICAgIDE0MQotCi0jZW5kaWYKLQotCi0gIC8qIFRoZSBmb2xsb3dpbmcgY29kZXMgYXJlIG5ldyBhcyBvZiAyMDAwLTAzLTEwICovCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfR0FMSUNJQU4gICAgICAgICAgICAgICAgICAgIDE0MAotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FGUklLQUFOUyAgICAgICAgICAgICAgICAgICAxNDEKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9CUkVUT04gICAgICAgICAgICAgICAgICAgICAgMTQyCi0jZGVmaW5lIFRUX01BQ19MQU5HSURfSU5VS1RJVFVUICAgICAgICAgICAgICAgICAgIDE0MwotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1NDT1RUSVNIX0dBRUxJQyAgICAgICAgICAgICAxNDQKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9NQU5YX0dBRUxJQyAgICAgICAgICAgICAgICAgMTQ1Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfSVJJU0hfR0FFTElDICAgICAgICAgICAgICAgIDE0NgotI2RlZmluZSBUVF9NQUNfTEFOR0lEX1RPTkdBTiAgICAgICAgICAgICAgICAgICAgICAxNDcKLSNkZWZpbmUgVFRfTUFDX0xBTkdJRF9HUkVFS19QT0xZVE9OSUMgICAgICAgICAgICAgMTQ4Ci0jZGVmaW5lIFRUX01BQ19MQU5HSURfR1JFRUxBTkRJQyAgICAgICAgICAgICAgICAgIDE0OQotI2RlZmluZSBUVF9NQUNfTEFOR0lEX0FaRVJCQUlKQU5JX1JPTUFOX1NDUklQVCAgICAxNTAKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBsYW5ndWFnZSBpZGVudGlmaWVyIGZpZWxkIGluIHRoZSBuYW1lIHJlY29yZHMgICovCi0gIC8qIG9mIHRoZSBUVEYgYG5hbWUnIHRhYmxlIGlmIHRoZSBgcGxhdGZvcm0nIGlkZW50aWZpZXIgY29kZSBpcyAgICAgICAgICAqLwotICAvKiBUVF9QTEFURk9STV9NSUNST1NPRlQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBjYW5vbmljYWwgc291cmNlIGZvciB0aGUgTVMgYXNzaWduZWQgTENJRHMgaXMgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vZ2xvYmFsZGV2L3JlZmVyZW5jZS9sY2lkLWFsbC5tc3B4ICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfR0VORVJBTCAgICAgICAgICAgICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfU0FVRElfQVJBQklBICAgICAgICAgICAgICAgMHgwNDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfSVJBUSAgICAgICAgICAgICAgICAgICAgICAgMHgwODAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfRUdZUFQgICAgICAgICAgICAgICAgICAgICAgMHgwQzAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfTElCWUEgICAgICAgICAgICAgICAgICAgICAgMHgxMDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfQUxHRVJJQSAgICAgICAgICAgICAgICAgICAgMHgxNDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfTU9ST0NDTyAgICAgICAgICAgICAgICAgICAgMHgxODAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfVFVOSVNJQSAgICAgICAgICAgICAgICAgICAgMHgxQzAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfT01BTiAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfWUVNRU4gICAgICAgICAgICAgICAgICAgICAgMHgyNDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfU1lSSUEgICAgICAgICAgICAgICAgICAgICAgMHgyODAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfSk9SREFOICAgICAgICAgICAgICAgICAgICAgMHgyQzAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfTEVCQU5PTiAgICAgICAgICAgICAgICAgICAgMHgzMDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfS1VXQUlUICAgICAgICAgICAgICAgICAgICAgMHgzNDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfVUFFICAgICAgICAgICAgICAgICAgICAgICAgMHgzODAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfQkFIUkFJTiAgICAgICAgICAgICAgICAgICAgMHgzQzAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUkFCSUNfUUFUQVIgICAgICAgICAgICAgICAgICAgICAgMHg0MDAxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9CVUxHQVJJQU5fQlVMR0FSSUEgICAgICAgICAgICAgICAgMHgwNDAyCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9DQVRBTEFOX1NQQUlOICAgICAgICAgICAgICAgICAgICAgMHgwNDAzCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX0dFTkVSQUwgICAgICAgICAgICAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX1RBSVdBTiAgICAgICAgICAgICAgICAgICAgMHgwNDA0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX1BSQyAgICAgICAgICAgICAgICAgICAgICAgMHgwODA0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX0hPTkdfS09ORyAgICAgICAgICAgICAgICAgMHgwQzA0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9DSElORVNFX1NJTkdBUE9SRSAgICAgICAgICAgICAgICAgMHgxMDA0Ci0KLSNpZiAxICAvKiB0aGlzIGxvb2tzIGxpa2UgdGhlIGNvcnJlY3QgdmFsdWUgKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0NISU5FU0VfTUFDQVUgICAgICAgICAgICAgICAgICAgICAweDE0MDQKLSNlbHNlICAvKiBidXQgYmV3YXJlLCBNaWNyb3NvZnQgbWF5IGNoYW5nZSBpdHMgbWluZC4uLgotICAgICAgICAgIHRoZSBtb3N0IHJlY2VudCBXb3JkIHJlZmVyZW5jZSBoYXMgdGhlIGZvbGxvd2luZzogKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0NISU5FU0VfTUFDQVUgIFRUX01TX0xBTkdJRF9DSElORVNFX0hPTkdfS09ORwotI2VuZGlmCi0KLSNpZiAwICAvKiB1c2VkIG9ubHkgd2l0aCAuTkVUIGBjdWx0dXJlcyc7IGNvbW1lbnRlZCBvdXQgKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0NISU5FU0VfVFJBRElUSU9OQUwgICAgICAgICAgICAgICAweDdDMDQKLSNlbmRpZgotCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9DWkVDSF9DWkVDSF9SRVBVQkxJQyAgICAgICAgICAgICAgMHgwNDA1Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9EQU5JU0hfREVOTUFSSyAgICAgICAgICAgICAgICAgICAgMHgwNDA2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fR0VSTUFOWSAgICAgICAgICAgICAgICAgICAgMHgwNDA3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fU1dJVFpFUkxBTkQgICAgICAgICAgICAgICAgMHgwODA3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fQVVTVFJJQSAgICAgICAgICAgICAgICAgICAgMHgwQzA3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fTFVYRU1CT1VSRyAgICAgICAgICAgICAgICAgMHgxMDA3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HRVJNQU5fTElFQ0hURU5TVEVJICAgICAgICAgICAgICAgMHgxNDA3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HUkVFS19HUkVFQ0UgICAgICAgICAgICAgICAgICAgICAgMHgwNDA4Ci0KLSAgLyogZG9uJ3QgYXNrIHdoYXQgdGhpcyBvbmUgbWVhbnMuLi4gSXQgaXMgY29tbWVudGVkIG91dCBjdXJyZW50bHkuICovCi0jaWYgMAotI2RlZmluZSBUVF9NU19MQU5HSURfR1JFRUtfR1JFRUNFMiAgICAgICAgICAgICAgICAgICAgIDB4MjAwOAotI2VuZGlmCi0KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfR0VORVJBTCAgICAgICAgICAgICAgICAgICAweDAwMDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfVU5JVEVEX1NUQVRFUyAgICAgICAgICAgICAweDA0MDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfVU5JVEVEX0tJTkdET00gICAgICAgICAgICAweDA4MDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfQVVTVFJBTElBICAgICAgICAgICAgICAgICAweDBDMDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfQ0FOQURBICAgICAgICAgICAgICAgICAgICAweDEwMDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfTkVXX1pFQUxBTkQgICAgICAgICAgICAgICAweDE0MDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfSVJFTEFORCAgICAgICAgICAgICAgICAgICAweDE4MDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAweDFDMDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfSkFNQUlDQSAgICAgICAgICAgICAgICAgICAweDIwMDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfQ0FSSUJCRUFOICAgICAgICAgICAgICAgICAweDI0MDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfQkVMSVpFICAgICAgICAgICAgICAgICAgICAweDI4MDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfVFJJTklEQUQgICAgICAgICAgICAgICAgICAweDJDMDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfWklNQkFCV0UgICAgICAgICAgICAgICAgICAweDMwMDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfUEhJTElQUElORVMgICAgICAgICAgICAgICAweDM0MDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfSU5ET05FU0lBICAgICAgICAgICAgICAgICAweDM4MDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfSE9OR19LT05HICAgICAgICAgICAgICAgICAweDNDMDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfSU5ESUEgICAgICAgICAgICAgICAgICAgICAweDQwMDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfTUFMQVlTSUEgICAgICAgICAgICAgICAgICAweDQ0MDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0VOR0xJU0hfU0lOR0FQT1JFICAgICAgICAgICAgICAgICAweDQ4MDkKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfU1BBSU5fVFJBRElUSU9OQUxfU09SVCAgICAweDA0MEEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfTUVYSUNPICAgICAgICAgICAgICAgICAgICAweDA4MEEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfU1BBSU5fSU5URVJOQVRJT05BTF9TT1JUICAweDBDMEEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfR1VBVEVNQUxBICAgICAgICAgICAgICAgICAweDEwMEEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQ09TVEFfUklDQSAgICAgICAgICAgICAgICAweDE0MEEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfUEFOQU1BICAgICAgICAgICAgICAgICAgICAweDE4MEEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfRE9NSU5JQ0FOX1JFUFVCTElDICAgICAgICAweDFDMEEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfVkVORVpVRUxBICAgICAgICAgICAgICAgICAweDIwMEEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQ09MT01CSUEgICAgICAgICAgICAgICAgICAweDI0MEEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfUEVSVSAgICAgICAgICAgICAgICAgICAgICAweDI4MEEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQVJHRU5USU5BICAgICAgICAgICAgICAgICAweDJDMEEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfRUNVQURPUiAgICAgICAgICAgICAgICAgICAweDMwMEEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQ0hJTEUgICAgICAgICAgICAgICAgICAgICAweDM0MEEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfVVJVR1VBWSAgICAgICAgICAgICAgICAgICAweDM4MEEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfUEFSQUdVQVkgICAgICAgICAgICAgICAgICAweDNDMEEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfQk9MSVZJQSAgICAgICAgICAgICAgICAgICAweDQwMEEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfRUxfU0FMVkFET1IgICAgICAgICAgICAgICAweDQ0MEEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfSE9ORFVSQVMgICAgICAgICAgICAgICAgICAweDQ4MEEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfTklDQVJBR1VBICAgICAgICAgICAgICAgICAweDRDMEEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfUFVFUlRPX1JJQ08gICAgICAgICAgICAgICAweDUwMEEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NQQU5JU0hfVU5JVEVEX1NUQVRFUyAgICAgICAgICAgICAweDU0MEEKLSAgLyogVGhlIGZvbGxvd2luZyBJRCBibGF0YW50bHkgdmlvbGF0ZSBNUyBzcGVjcyBieSB1c2luZyBhICovCi0gIC8qIHN1Ymxhbmd1YWdlID4gMHgxRi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfU1BBTklTSF9MQVRJTl9BTUVSSUNBICAgICAgICAgICAgIDB4RTQwQVUKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZJTk5JU0hfRklOTEFORCAgICAgICAgICAgICAgICAgICAweDA0MEIKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9GUkFOQ0UgICAgICAgICAgICAgICAgICAgICAweDA0MEMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9CRUxHSVVNICAgICAgICAgICAgICAgICAgICAweDA4MEMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9DQU5BREEgICAgICAgICAgICAgICAgICAgICAweDBDMEMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9TV0lUWkVSTEFORCAgICAgICAgICAgICAgICAweDEwMEMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9MVVhFTUJPVVJHICAgICAgICAgICAgICAgICAweDE0MEMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9NT05BQ08gICAgICAgICAgICAgICAgICAgICAweDE4MEMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9XRVNUX0lORElFUyAgICAgICAgICAgICAgICAweDFDMEMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9SRVVOSU9OICAgICAgICAgICAgICAgICAgICAweDIwMEMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSRU5DSF9DT05HTyAgICAgICAgICAgICAgICAgICAgICAweDI0MEMKLSAgLyogd2hpY2ggd2FzIGZvcm1lcmx5OiAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfRlJFTkNIX1pBSVJFICBUVF9NU19MQU5HSURfRlJFTkNIX0NPTkdPCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfU0VORUdBTCAgICAgICAgICAgICAgICAgICAgMHgyODBDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfQ0FNRVJPT04gICAgICAgICAgICAgICAgICAgMHgyQzBDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfQ09URV9EX0lWT0lSRSAgICAgICAgICAgICAgMHgzMDBDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfTUFMSSAgICAgICAgICAgICAgICAgICAgICAgMHgzNDBDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfTU9ST0NDTyAgICAgICAgICAgICAgICAgICAgMHgzODBDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfSEFJVEkgICAgICAgICAgICAgICAgICAgICAgMHgzQzBDCi0gIC8qIGFuZCBhbm90aGVyIHZpb2xhdGlvbiBvZiB0aGUgc3BlYyAoc2VlIDB4RTQwQVUpICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9GUkVOQ0hfTk9SVEhfQUZSSUNBICAgICAgICAgICAgICAgMHhFNDBDVQotI2RlZmluZSBUVF9NU19MQU5HSURfSEVCUkVXX0lTUkFFTCAgICAgICAgICAgICAgICAgICAgIDB4MDQwRAotI2RlZmluZSBUVF9NU19MQU5HSURfSFVOR0FSSUFOX0hVTkdBUlkgICAgICAgICAgICAgICAgIDB4MDQwRQotI2RlZmluZSBUVF9NU19MQU5HSURfSUNFTEFORElDX0lDRUxBTkQgICAgICAgICAgICAgICAgIDB4MDQwRgotI2RlZmluZSBUVF9NU19MQU5HSURfSVRBTElBTl9JVEFMWSAgICAgICAgICAgICAgICAgICAgIDB4MDQxMAotI2RlZmluZSBUVF9NU19MQU5HSURfSVRBTElBTl9TV0lUWkVSTEFORCAgICAgICAgICAgICAgIDB4MDgxMAotI2RlZmluZSBUVF9NU19MQU5HSURfSkFQQU5FU0VfSkFQQU4gICAgICAgICAgICAgICAgICAgIDB4MDQxMQotI2RlZmluZSBUVF9NU19MQU5HSURfS09SRUFOX0VYVEVOREVEX1dBTlNVTkdfS09SRUEgICAgIDB4MDQxMgotI2RlZmluZSBUVF9NU19MQU5HSURfS09SRUFOX0pPSEFCX0tPUkVBICAgICAgICAgICAgICAgIDB4MDgxMgotI2RlZmluZSBUVF9NU19MQU5HSURfRFVUQ0hfTkVUSEVSTEFORFMgICAgICAgICAgICAgICAgIDB4MDQxMwotI2RlZmluZSBUVF9NU19MQU5HSURfRFVUQ0hfQkVMR0lVTSAgICAgICAgICAgICAgICAgICAgIDB4MDgxMwotI2RlZmluZSBUVF9NU19MQU5HSURfTk9SV0VHSUFOX05PUldBWV9CT0tNQUwgICAgICAgICAgIDB4MDQxNAotI2RlZmluZSBUVF9NU19MQU5HSURfTk9SV0VHSUFOX05PUldBWV9OWU5PUlNLICAgICAgICAgIDB4MDgxNAotI2RlZmluZSBUVF9NU19MQU5HSURfUE9MSVNIX1BPTEFORCAgICAgICAgICAgICAgICAgICAgIDB4MDQxNQotI2RlZmluZSBUVF9NU19MQU5HSURfUE9SVFVHVUVTRV9CUkFaSUwgICAgICAgICAgICAgICAgIDB4MDQxNgotI2RlZmluZSBUVF9NU19MQU5HSURfUE9SVFVHVUVTRV9QT1JUVUdBTCAgICAgICAgICAgICAgIDB4MDgxNgotI2RlZmluZSBUVF9NU19MQU5HSURfUkhBRVRPX1JPTUFOSUNfU1dJVFpFUkxBTkQgICAgICAgIDB4MDQxNwotI2RlZmluZSBUVF9NU19MQU5HSURfUk9NQU5JQU5fUk9NQU5JQSAgICAgICAgICAgICAgICAgIDB4MDQxOAotI2RlZmluZSBUVF9NU19MQU5HSURfTU9MREFWSUFOX01PTERBVklBICAgICAgICAgICAgICAgIDB4MDgxOAotI2RlZmluZSBUVF9NU19MQU5HSURfUlVTU0lBTl9SVVNTSUEgICAgICAgICAgICAgICAgICAgIDB4MDQxOQotI2RlZmluZSBUVF9NU19MQU5HSURfUlVTU0lBTl9NT0xEQVZJQSAgICAgICAgICAgICAgICAgIDB4MDgxOQotI2RlZmluZSBUVF9NU19MQU5HSURfQ1JPQVRJQU5fQ1JPQVRJQSAgICAgICAgICAgICAgICAgIDB4MDQxQQotI2RlZmluZSBUVF9NU19MQU5HSURfU0VSQklBTl9TRVJCSUFfTEFUSU4gICAgICAgICAgICAgIDB4MDgxQQotI2RlZmluZSBUVF9NU19MQU5HSURfU0VSQklBTl9TRVJCSUFfQ1lSSUxMSUMgICAgICAgICAgIDB4MEMxQQotCi0jaWYgMCAgLyogdGhpcyB1c2VkIHRvIGJlIHRoaXMgdmFsdWUsIGJ1dCBpdCBsb29rcyBsaWtlIHdlIHdlcmUgd3JvbmcgKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0JPU05JQU5fQk9TTklBX0hFUlpFR09WSU5BICAgICAgICAweDEwMUEKLSNlbHNlICAvKiBjdXJyZW50IHNvdXJjZXMgc2F5ICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9DUk9BVElBTl9CT1NOSUFfSEVSWkVHT1ZJTkEgICAgICAgMHgxMDFBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9CT1NOSUFOX0JPU05JQV9IRVJaRUdPVklOQSAgICAgICAgMHgxNDFBCi0gICAgICAgLyogYW5kIFhQc3AyIFBsYXRmb3JtIFNESyBhZGRlZCAoMjAwNC0wNy0yNikgKi8KLSAgICAgICAvKiBOYW1lcyBhcmUgc2hvcnRlbmVkIHRvIGJlIHNpZ25pZmljYW50IHdpdGhpbiA0MCBjaGFycy4gKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NFUkJJQU5fQk9TTklBX0hFUlpfTEFUSU4gICAgICAgICAweDE4MUEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NFUkJJQU5fQk9TTklBX0hFUlpfQ1lSSUxMSUMgICAgICAweDE4MUEKLSNlbmRpZgotCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TTE9WQUtfU0xPVkFLSUEgICAgICAgICAgICAgICAgICAgMHgwNDFCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BTEJBTklBTl9BTEJBTklBICAgICAgICAgICAgICAgICAgMHgwNDFDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TV0VESVNIX1NXRURFTiAgICAgICAgICAgICAgICAgICAgMHgwNDFECi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TV0VESVNIX0ZJTkxBTkQgICAgICAgICAgICAgICAgICAgMHgwODFECi0jZGVmaW5lIFRUX01TX0xBTkdJRF9USEFJX1RIQUlMQU5EICAgICAgICAgICAgICAgICAgICAgMHgwNDFFCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9UVVJLSVNIX1RVUktFWSAgICAgICAgICAgICAgICAgICAgMHgwNDFGCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9VUkRVX1BBS0lTVEFOICAgICAgICAgICAgICAgICAgICAgMHgwNDIwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9VUkRVX0lORElBICAgICAgICAgICAgICAgICAgICAgICAgMHgwODIwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9JTkRPTkVTSUFOX0lORE9ORVNJQSAgICAgICAgICAgICAgMHgwNDIxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9VS1JBSU5JQU5fVUtSQUlORSAgICAgICAgICAgICAgICAgMHgwNDIyCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9CRUxBUlVTSUFOX0JFTEFSVVMgICAgICAgICAgICAgICAgMHgwNDIzCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TTE9WRU5FX1NMT1ZFTklBICAgICAgICAgICAgICAgICAgMHgwNDI0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9FU1RPTklBTl9FU1RPTklBICAgICAgICAgICAgICAgICAgMHgwNDI1Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9MQVRWSUFOX0xBVFZJQSAgICAgICAgICAgICAgICAgICAgMHgwNDI2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9MSVRIVUFOSUFOX0xJVEhVQU5JQSAgICAgICAgICAgICAgMHgwNDI3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9DTEFTU0lDX0xJVEhVQU5JQU5fTElUSFVBTklBICAgICAgMHgwODI3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9UQUpJS19UQUpJS0lTVEFOICAgICAgICAgICAgICAgICAgMHgwNDI4Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9GQVJTSV9JUkFOICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDI5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9WSUVUTkFNRVNFX1ZJRVRfTkFNICAgICAgICAgICAgICAgMHgwNDJBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BUk1FTklBTl9BUk1FTklBICAgICAgICAgICAgICAgICAgMHgwNDJCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BWkVSSV9BWkVSQkFJSkFOX0xBVElOICAgICAgICAgICAgMHgwNDJDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BWkVSSV9BWkVSQkFJSkFOX0NZUklMTElDICAgICAgICAgMHgwODJDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9CQVNRVUVfU1BBSU4gICAgICAgICAgICAgICAgICAgICAgMHgwNDJECi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TT1JCSUFOX0dFUk1BTlkgICAgICAgICAgICAgICAgICAgMHgwNDJFCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9NQUNFRE9OSUFOX01BQ0VET05JQSAgICAgICAgICAgICAgMHgwNDJGCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TVVRVX1NPVVRIX0FGUklDQSAgICAgICAgICAgICAgICAgMHgwNDMwCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9UU09OR0FfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAgMHgwNDMxCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9UU1dBTkFfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAgMHgwNDMyCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9WRU5EQV9TT1VUSF9BRlJJQ0EgICAgICAgICAgICAgICAgMHgwNDMzCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9YSE9TQV9TT1VUSF9BRlJJQ0EgICAgICAgICAgICAgICAgMHgwNDM0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9aVUxVX1NPVVRIX0FGUklDQSAgICAgICAgICAgICAgICAgMHgwNDM1Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9BRlJJS0FBTlNfU09VVEhfQUZSSUNBICAgICAgICAgICAgMHgwNDM2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9HRU9SR0lBTl9HRU9SR0lBICAgICAgICAgICAgICAgICAgMHgwNDM3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9GQUVST0VTRV9GQUVST0VfSVNMQU5EUyAgICAgICAgICAgMHgwNDM4Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9ISU5ESV9JTkRJQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNDM5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9NQUxURVNFX01BTFRBICAgICAgICAgICAgICAgICAgICAgMHgwNDNBCi0gIC8qIEFkZGVkIGJ5IFhQc3AyIFBsYXRmb3JtIFNESyAoMjAwNC0wNy0yNikgKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfTk9SVEhFUk5fTk9SV0FZICAgICAgICAgICAgICAweDA0M0IKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfTk9SVEhFUk5fU1dFREVOICAgICAgICAgICAgICAweDA4M0IKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfTk9SVEhFUk5fRklOTEFORCAgICAgICAgICAgICAweDBDM0IKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfTFVMRV9OT1JXQVkgICAgICAgICAgICAgICAgICAweDEwM0IKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfTFVMRV9TV0VERU4gICAgICAgICAgICAgICAgICAweDE0M0IKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfU09VVEhFUk5fTk9SV0FZICAgICAgICAgICAgICAweDE4M0IKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfU09VVEhFUk5fU1dFREVOICAgICAgICAgICAgICAweDFDM0IKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfU0tPTFRfRklOTEFORCAgICAgICAgICAgICAgICAweDIwM0IKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NBTUlfSU5BUklfRklOTEFORCAgICAgICAgICAgICAgICAweDI0M0IKLSAgLyogLi4uIGFuZCB3ZSBhbHNvIGtlZXAgb3VyIG9sZCBpZGVudGlmaWVyLi4uICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TQUFNSV9MQVBPTklBICAgICAgICAgICAgICAgICAgICAgMHgwNDNCCi0KLSNpZiAwIC8qIHRoaXMgc2VlbXMgdG8gYmUgYSBwcmV2aW91cyBpbnZlcnNpb24gKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0lSSVNIX0dBRUxJQ19JUkVMQU5EICAgICAgICAgICAgICAweDA0M0MKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1NDT1RUSVNIX0dBRUxJQ19VTklURURfS0lOR0RPTSAgICAweDA4M0MKLSNlbHNlCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TQ09UVElTSF9HQUVMSUNfVU5JVEVEX0tJTkdET00gICAgMHgwODNDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9JUklTSF9HQUVMSUNfSVJFTEFORCAgICAgICAgICAgICAgMHgwNDNDCi0jZW5kaWYKLQotI2RlZmluZSBUVF9NU19MQU5HSURfWUlERElTSF9HRVJNQU5ZICAgICAgICAgICAgICAgICAgIDB4MDQzRAotI2RlZmluZSBUVF9NU19MQU5HSURfTUFMQVlfTUFMQVlTSUEgICAgICAgICAgICAgICAgICAgIDB4MDQzRQotI2RlZmluZSBUVF9NU19MQU5HSURfTUFMQVlfQlJVTkVJX0RBUlVTU0FMQU0gICAgICAgICAgIDB4MDgzRQotI2RlZmluZSBUVF9NU19MQU5HSURfS0FaQUtfS0FaQUtTVEFOICAgICAgICAgICAgICAgICAgIDB4MDQzRgotI2RlZmluZSBUVF9NU19MQU5HSURfS0lSR0hJWl9LSVJHSElaU1RBTiAvKiBDeXJpbGxpYyovIDB4MDQ0MAotICAvKiBhbGlhcyBkZWNsYXJlZCBpbiBXaW5kb3dzIDIwMDAgKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0tJUkdISVpfS0lSR0hJWl9SRVBVQkxJQyBcCi0gICAgICAgICAgVFRfTVNfTEFOR0lEX0tJUkdISVpfS0lSR0hJWlNUQU4KLQotI2RlZmluZSBUVF9NU19MQU5HSURfU1dBSElMSV9LRU5ZQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ0MQotI2RlZmluZSBUVF9NU19MQU5HSURfVFVSS01FTl9UVVJLTUVOSVNUQU4gICAgICAgICAgICAgIDB4MDQ0MgotI2RlZmluZSBUVF9NU19MQU5HSURfVVpCRUtfVVpCRUtJU1RBTl9MQVRJTiAgICAgICAgICAgIDB4MDQ0MwotI2RlZmluZSBUVF9NU19MQU5HSURfVVpCRUtfVVpCRUtJU1RBTl9DWVJJTExJQyAgICAgICAgIDB4MDg0MwotI2RlZmluZSBUVF9NU19MQU5HSURfVEFUQVJfVEFUQVJTVEFOICAgICAgICAgICAgICAgICAgIDB4MDQ0NAotI2RlZmluZSBUVF9NU19MQU5HSURfQkVOR0FMSV9JTkRJQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ0NQotI2RlZmluZSBUVF9NU19MQU5HSURfQkVOR0FMSV9CQU5HTEFERVNIICAgICAgICAgICAgICAgIDB4MDg0NQotI2RlZmluZSBUVF9NU19MQU5HSURfUFVOSkFCSV9JTkRJQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ0NgotI2RlZmluZSBUVF9NU19MQU5HSURfUFVOSkFCSV9BUkFCSUNfUEFLSVNUQU4gICAgICAgICAgIDB4MDg0NgotI2RlZmluZSBUVF9NU19MQU5HSURfR1VKQVJBVElfSU5ESUEgICAgICAgICAgICAgICAgICAgIDB4MDQ0NwotI2RlZmluZSBUVF9NU19MQU5HSURfT1JJWUFfSU5ESUEgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ0OAotI2RlZmluZSBUVF9NU19MQU5HSURfVEFNSUxfSU5ESUEgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ0OQotI2RlZmluZSBUVF9NU19MQU5HSURfVEVMVUdVX0lORElBICAgICAgICAgICAgICAgICAgICAgIDB4MDQ0QQotI2RlZmluZSBUVF9NU19MQU5HSURfS0FOTkFEQV9JTkRJQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ0QgotI2RlZmluZSBUVF9NU19MQU5HSURfTUFMQVlBTEFNX0lORElBICAgICAgICAgICAgICAgICAgIDB4MDQ0QwotI2RlZmluZSBUVF9NU19MQU5HSURfQVNTQU1FU0VfSU5ESUEgICAgICAgICAgICAgICAgICAgIDB4MDQ0RAotI2RlZmluZSBUVF9NU19MQU5HSURfTUFSQVRISV9JTkRJQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ0RQotI2RlZmluZSBUVF9NU19MQU5HSURfU0FOU0tSSVRfSU5ESUEgICAgICAgICAgICAgICAgICAgIDB4MDQ0RgotI2RlZmluZSBUVF9NU19MQU5HSURfTU9OR09MSUFOX01PTkdPTElBIC8qIEN5cmlsbGljICovIDB4MDQ1MAotI2RlZmluZSBUVF9NU19MQU5HSURfTU9OR09MSUFOX01PTkdPTElBX01PTkdPTElBTiAgICAgIDB4MDg1MAotI2RlZmluZSBUVF9NU19MQU5HSURfVElCRVRBTl9DSElOQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ1MQotICAvKiBEb24ndCB1c2UgdGhlIG5leHQgY29uc3RhbnQhICBJdCBoYXMgICAgICAgICAgICAqLwotICAvKiAgICgxKSB0aGUgd3Jvbmcgc3BlbGxpbmcgKER6b25naGthKSAgICAgICAgICAgICAqLwotICAvKiAgICgyKSBNaWNyb3NvZnQgZG9lc24ndCBvZmZpY2lhbGx5IGRlZmluZSBpdCAtLSAqLwotICAvKiAgICAgICBhdCBsZWFzdCBpdCBpcyBub3QgaW4gdGhlIExpc3Qgb2YgTG9jYWwgICAqLwotICAvKiAgICAgICBJRCBWYWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICgzKSBEem9uZ2toYSBpcyBub3QgdGhlIHNhbWUgbGFuZ3VhZ2UgYXMgICAgICAqLwotICAvKiAgICAgICBUaWJldGFuLCBzbyBtZXJnaW5nIGl0IGlzIHdyb25nIGFueXdheS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUVF9NU19MQU5HSURfVElCRVRBTl9CSFVUQU4gaXMgY29ycmVjdCwgQlRXLiAgICAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfRFpPTkdIS0FfQkhVVEFOICAgICAgICAgICAgICAgICAgIDB4MDg1MQotCi0jaWYgMAotICAvKiB0aGUgZm9sbG93aW5nIHVzZWQgdG8gYmUgZGVmaW5lZCAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfVElCRVRBTl9CSFVUQU4gICAgICAgICAgICAgICAgICAgIDB4MDQ1MQotICAvKiAuLi4gYnV0IGl0IHdhcyBjaGFuZ2VkOyAqLwotI2Vsc2UKLSAgLyogU28gd2Ugd2lsbCBjb250aW51ZSB0byAjZGVmaW5lIGl0LCBidXQgd2l0aCB0aGUgY29ycmVjdCB2YWx1ZSAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfVElCRVRBTl9CSFVUQU4gICBUVF9NU19MQU5HSURfRFpPTkdIS0FfQkhVVEFOCi0jZW5kaWYKLQotI2RlZmluZSBUVF9NU19MQU5HSURfV0VMU0hfV0FMRVMgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ1MgotI2RlZmluZSBUVF9NU19MQU5HSURfS0hNRVJfQ0FNQk9ESUEgICAgICAgICAgICAgICAgICAgIDB4MDQ1MwotI2RlZmluZSBUVF9NU19MQU5HSURfTEFPX0xBT1MgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDQ1NAotI2RlZmluZSBUVF9NU19MQU5HSURfQlVSTUVTRV9NWUFOTUFSICAgICAgICAgICAgICAgICAgIDB4MDQ1NQotI2RlZmluZSBUVF9NU19MQU5HSURfR0FMSUNJQU5fU1BBSU4gICAgICAgICAgICAgICAgICAgIDB4MDQ1NgotI2RlZmluZSBUVF9NU19MQU5HSURfS09OS0FOSV9JTkRJQSAgICAgICAgICAgICAgICAgICAgIDB4MDQ1NwotI2RlZmluZSBUVF9NU19MQU5HSURfTUFOSVBVUklfSU5ESUEgIC8qIEJlbmdhbGkgKi8gICAgIDB4MDQ1OAotI2RlZmluZSBUVF9NU19MQU5HSURfU0lOREhJX0lORElBIC8qIEFyYWJpYyAqLyAgICAgICAgIDB4MDQ1OQotI2RlZmluZSBUVF9NU19MQU5HSURfU0lOREhJX1BBS0lTVEFOICAgICAgICAgICAgICAgICAgIDB4MDg1OQotICAvKiBNaXNzaW5nIGEgTENJRCBmb3IgU2luZGhpIGluIERldmFuYWdhcmkgc2NyaXB0ICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TWVJJQUNfU1lSSUEgICAgICAgICAgICAgICAgICAgICAgMHgwNDVBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TSU5IQUxFU0VfU1JJX0xBTktBICAgICAgICAgICAgICAgMHgwNDVCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9DSEVST0tFRV9VTklURURfU1RBVEVTICAgICAgICAgICAgMHgwNDVDCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9JTlVLVElUVVRfQ0FOQURBICAgICAgICAgICAgICAgICAgMHgwNDVECi0jZGVmaW5lIFRUX01TX0xBTkdJRF9BTUhBUklDX0VUSElPUElBICAgICAgICAgICAgICAgICAgMHgwNDVFCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9UQU1BWklHSFRfTU9ST0NDTyAvKiBBcmFiaWMgKi8gICAgMHgwNDVGCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9UQU1BWklHSFRfTU9ST0NDT19MQVRJTiAgICAgICAgICAgMHgwODVGCi0gIC8qIE1pc3NpbmcgYSBMQ0lEIGZvciBUaWZpbmFnaCBzY3JpcHQgKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0tBU0hNSVJJX1BBS0lTVEFOIC8qIEFyYWJpYyAqLyAgICAweDA0NjAKLSAgLyogU3BlbGxlZCB0aGlzIHdheSBieSBYUHNwMiBQbGF0Zm9ybSBTREsgKDIwMDQtMDctMjYpICovCi0gIC8qIHNjcmlwdCBpcyB5ZXQgdW5jbGVhci4uLiBtaWdodCBiZSBBcmFiaWMsIE5hZ2FyaSBvciBTaGFyYWRhICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LQVNITUlSSV9TQVNJQSAgICAgICAgICAgICAgICAgICAgMHgwODYwCi0gIC8qIC4uLiBhbmQgYWxpYXNlZCAoYnkgTVMpIGZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMuICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9LQVNITUlSSV9JTkRJQSBUVF9NU19MQU5HSURfS0FTSE1JUklfU0FTSUEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX05FUEFMSV9ORVBBTCAgICAgICAgICAgICAgICAgICAgICAweDA0NjEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX05FUEFMSV9JTkRJQSAgICAgICAgICAgICAgICAgICAgICAweDA4NjEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZSSVNJQU5fTkVUSEVSTEFORFMgICAgICAgICAgICAgICAweDA0NjIKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1BBU0hUT19BRkdIQU5JU1RBTiAgICAgICAgICAgICAgICAweDA0NjMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0ZJTElQSU5PX1BISUxJUFBJTkVTICAgICAgICAgICAgICAweDA0NjQKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0RISVZFSElfTUFMRElWRVMgICAgICAgICAgICAgICAgICAweDA0NjUKLSAgLyogYWxpYXMgZGVjbGFyZWQgaW4gV2luZG93cyAyMDAwICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9ESVZFSElfTUFMRElWRVMgIFRUX01TX0xBTkdJRF9ESElWRUhJX01BTERJVkVTCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9FRE9fTklHRVJJQSAgICAgICAgICAgICAgICAgICAgICAgMHgwNDY2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9GVUxGVUxERV9OSUdFUklBICAgICAgICAgICAgICAgICAgMHgwNDY3Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9IQVVTQV9OSUdFUklBICAgICAgICAgICAgICAgICAgICAgMHgwNDY4Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9JQklCSU9fTklHRVJJQSAgICAgICAgICAgICAgICAgICAgMHgwNDY5Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9ZT1JVQkFfTklHRVJJQSAgICAgICAgICAgICAgICAgICAgMHgwNDZBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9RVUVDSFVBX0JPTElWSUEgICAgICAgICAgICAgICAgICAgMHgwNDZCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9RVUVDSFVBX0VDVUFET1IgICAgICAgICAgICAgICAgICAgMHgwODZCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9RVUVDSFVBX1BFUlUgICAgICAgICAgICAgICAgICAgICAgMHgwQzZCCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TRVBFRElfU09VVEhfQUZSSUNBICAgICAgICAgICAgICAgMHgwNDZDCi0gIC8qIEFsc28gc3BlbGxlZCBieSBYUHNwMiBQbGF0Zm9ybSBTREsgKDIwMDQtMDctMjYpICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9TT1RIT19TT1VUSEVSTl9TT1VUSF9BRlJJQ0EgXAotICAgICAgICAgIFRUX01TX0xBTkdJRF9TRVBFRElfU09VVEhfQUZSSUNBCi0gIC8qIGxhbmd1YWdlIGNvZGVzIDB4MDQ2RCwgMHgwNDZFIGFuZCAweDA0NkYgYXJlIChzdGlsbCkgdW5rbm93bi4gKi8KLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0lHQk9fTklHRVJJQSAgICAgICAgICAgICAgICAgICAgICAweDA0NzAKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX0tBTlVSSV9OSUdFUklBICAgICAgICAgICAgICAgICAgICAweDA0NzEKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX09ST01PX0VUSElPUElBICAgICAgICAgICAgICAgICAgICAweDA0NzIKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1RJR1JJR05BX0VUSElPUElBICAgICAgICAgICAgICAgICAweDA0NzMKLSNkZWZpbmUgVFRfTVNfTEFOR0lEX1RJR1JJR05BX0VSWVRIUkVBICAgICAgICAgICAgICAgICAweDA4NzMKLSAgLyogYWxzbyBzcGVsbGVkIGluIHRoZSBgUGFzc3BvcnQgU0RLJyBsaXN0IGFzOiAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfVElHUklHTkFfRVJZVFJFQSAgVFRfTVNfTEFOR0lEX1RJR1JJR05BX0VSWVRIUkVBCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9HVUFSQU5JX1BBUkFHVUFZICAgICAgICAgICAgICAgICAgMHgwNDc0Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9IQVdBSUlBTl9VTklURURfU1RBVEVTICAgICAgICAgICAgMHgwNDc1Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9MQVRJTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDc2Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9TT01BTElfU09NQUxJQSAgICAgICAgICAgICAgICAgICAgMHgwNDc3Ci0gIC8qIE5vdGU6IFlpIGRvZXMgbm90IGhhdmUgYSAocHJvcGVyKSBJU08gNjM5LTIgY29kZSwgc2luY2UgaXQgaXMgbW9zdGx5ICovCi0gIC8qICAgICAgIG5vdCB3cml0dGVuIChidXQgT1RPSCB0aGUgcGVjdWxpYXIgd3JpdGluZyBzeXN0ZW0gaXMgd29ydGggICAgICovCi0gIC8qICAgICAgIHN0dWR5aW5nKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9ZSV9DSElOQSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDc4Ci0jZGVmaW5lIFRUX01TX0xBTkdJRF9QQVBJQU1FTlRVX05FVEhFUkxBTkRTX0FOVElMTEVTICAgMHgwNDc5Ci0gIC8qIGxhbmd1YWdlIGNvZGVzIGZyb20gMHgwNDdBIHRvIDB4MDQ3RiBhcmUgKHN0aWxsKSB1bmtub3duLiAqLwotI2RlZmluZSBUVF9NU19MQU5HSURfVUlHSFVSX0NISU5BICAgICAgICAgICAgICAgICAgICAgIDB4MDQ4MAotI2RlZmluZSBUVF9NU19MQU5HSURfTUFPUklfTkVXX1pFQUxBTkQgICAgICAgICAgICAgICAgIDB4MDQ4MQotCi0jaWYgMCAgLyogbm90IGRlZW1lZCB1c2VmdWwgZm9yIGZvbnRzICovCi0jZGVmaW5lIFRUX01TX0xBTkdJRF9IVU1BTl9JTlRFUkZBQ0VfREVWSUNFICAgICAgICAgICAgMHgwNEZGCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBgbmFtZScgaWRlbnRpZmllciBmaWVsZCBpbiB0aGUgbmFtZSByZWNvcmRzIG9mICovCi0gIC8qIHRoZSBUVEYgYG5hbWUnIHRhYmxlLiAgVGhlc2UgdmFsdWVzIGFyZSBwbGF0Zm9ybSBpbmRlcGVuZGVudC4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVFRfTkFNRV9JRF9DT1BZUklHSFQgICAgICAgICAgICAwCi0jZGVmaW5lIFRUX05BTUVfSURfRk9OVF9GQU1JTFkgICAgICAgICAgMQotI2RlZmluZSBUVF9OQU1FX0lEX0ZPTlRfU1VCRkFNSUxZICAgICAgIDIKLSNkZWZpbmUgVFRfTkFNRV9JRF9VTklRVUVfSUQgICAgICAgICAgICAzCi0jZGVmaW5lIFRUX05BTUVfSURfRlVMTF9OQU1FICAgICAgICAgICAgNAotI2RlZmluZSBUVF9OQU1FX0lEX1ZFUlNJT05fU1RSSU5HICAgICAgIDUKLSNkZWZpbmUgVFRfTkFNRV9JRF9QU19OQU1FICAgICAgICAgICAgICA2Ci0jZGVmaW5lIFRUX05BTUVfSURfVFJBREVNQVJLICAgICAgICAgICAgNwotCi0gIC8qIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBmcm9tIHRoZSBPcGVuVHlwZSBzcGVjICovCi0jZGVmaW5lIFRUX05BTUVfSURfTUFOVUZBQ1RVUkVSICAgICAgICAgOAotI2RlZmluZSBUVF9OQU1FX0lEX0RFU0lHTkVSICAgICAgICAgICAgIDkKLSNkZWZpbmUgVFRfTkFNRV9JRF9ERVNDUklQVElPTiAgICAgICAgICAxMAotI2RlZmluZSBUVF9OQU1FX0lEX1ZFTkRPUl9VUkwgICAgICAgICAgIDExCi0jZGVmaW5lIFRUX05BTUVfSURfREVTSUdORVJfVVJMICAgICAgICAgMTIKLSNkZWZpbmUgVFRfTkFNRV9JRF9MSUNFTlNFICAgICAgICAgICAgICAxMwotI2RlZmluZSBUVF9OQU1FX0lEX0xJQ0VOU0VfVVJMICAgICAgICAgIDE0Ci0gIC8qIG51bWJlciAxNSBpcyByZXNlcnZlZCAqLwotI2RlZmluZSBUVF9OQU1FX0lEX1BSRUZFUlJFRF9GQU1JTFkgICAgIDE2Ci0jZGVmaW5lIFRUX05BTUVfSURfUFJFRkVSUkVEX1NVQkZBTUlMWSAgMTcKLSNkZWZpbmUgVFRfTkFNRV9JRF9NQUNfRlVMTF9OQU1FICAgICAgICAxOAotCi0gIC8qIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBuZXcgYXMgb2YgMjAwMC0wMS0yMSAqLwotI2RlZmluZSBUVF9OQU1FX0lEX1NBTVBMRV9URVhUICAgICAgICAgIDE5Ci0KLSAgLyogVGhpcyBpcyBuZXcgaW4gT3BlblR5cGUgMS4zICovCi0jZGVmaW5lIFRUX05BTUVfSURfQ0lEX0ZJTkRGT05UX05BTUUgICAgMjAKLQotICAvKiBUaGlzIGlzIG5ldyBpbiBPcGVuVHlwZSAxLjUgKi8KLSNkZWZpbmUgVFRfTkFNRV9JRF9XV1NfRkFNSUxZICAgICAgICAgICAyMQotI2RlZmluZSBUVF9OQU1FX0lEX1dXU19TVUJGQU1JTFkgICAgICAgIDIyCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEJpdCBtYXNrIHZhbHVlcyBmb3IgdGhlIFVuaWNvZGUgUmFuZ2VzIGZyb20gdGhlIFRURiBgT1MyICcgdGFibGUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVXBkYXRlZCAwOC1Ob3YtMjAwOC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIEJpdCAgMCAgIEJhc2ljIExhdGluICovCi0jZGVmaW5lIFRUX1VDUl9CQVNJQ19MQVRJTiAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgMCkgLyogVSswMDIwLVUrMDA3RSAqLwotICAvKiBCaXQgIDEgICBDMSBDb250cm9scyBhbmQgTGF0aW4tMSBTdXBwbGVtZW50ICovCi0jZGVmaW5lIFRUX1VDUl9MQVRJTjFfU1VQUExFTUVOVCAgICAgICAgICAgICAgICgxTCA8PCAgMSkgLyogVSswMDgwLVUrMDBGRiAqLwotICAvKiBCaXQgIDIgICBMYXRpbiBFeHRlbmRlZC1BICovCi0jZGVmaW5lIFRUX1VDUl9MQVRJTl9FWFRFTkRFRF9BICAgICAgICAgICAgICAgICgxTCA8PCAgMikgLyogVSswMTAwLVUrMDE3RiAqLwotICAvKiBCaXQgIDMgICBMYXRpbiBFeHRlbmRlZC1CICovCi0jZGVmaW5lIFRUX1VDUl9MQVRJTl9FWFRFTkRFRF9CICAgICAgICAgICAgICAgICgxTCA8PCAgMykgLyogVSswMTgwLVUrMDI0RiAqLwotICAvKiBCaXQgIDQgICBJUEEgRXh0ZW5zaW9ucyAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgUGhvbmV0aWMgRXh0ZW5zaW9ucyAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIFBob25ldGljIEV4dGVuc2lvbnMgU3VwcGxlbWVudCAqLwotI2RlZmluZSBUVF9VQ1JfSVBBX0VYVEVOU0lPTlMgICAgICAgICAgICAgICAgICAoMUwgPDwgIDQpIC8qIFUrMDI1MC1VKzAyQUYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzFEMDAtVSsxRDdGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsxRDgwLVUrMURCRiAqLwotICAvKiBCaXQgIDUgICBTcGFjaW5nIE1vZGlmaWVyIExldHRlcnMgKi8KLSAgLyogICAgICAgICAgTW9kaWZpZXIgVG9uZSBMZXR0ZXJzICAgICovCi0jZGVmaW5lIFRUX1VDUl9TUEFDSU5HX01PRElGSUVSICAgICAgICAgICAgICAgICgxTCA8PCAgNSkgLyogVSswMkIwLVUrMDJGRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrQTcwMC1VK0E3MUYgKi8KLSAgLyogQml0ICA2ICAgQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgQ29tYmluaW5nIERpYWNyaXRpY2FsIE1hcmtzIFN1cHBsZW1lbnQgKi8KLSNkZWZpbmUgVFRfVUNSX0NPTUJJTklOR19ESUFDUklUSUNTICAgICAgICAgICAgKDFMIDw8ICA2KSAvKiBVKzAzMDAtVSswMzZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsxREMwLVUrMURGRiAqLwotICAvKiBCaXQgIDcgICBHcmVlayBhbmQgQ29wdGljICovCi0jZGVmaW5lIFRUX1VDUl9HUkVFSyAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgNykgLyogVSswMzcwLVUrMDNGRiAqLwotICAvKiBCaXQgIDggICBDb3B0aWMgKi8KLSNkZWZpbmUgVFRfVUNSX0NPUFRJQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA4KSAvKiBVKzJDODAtVSsyQ0ZGICovCi0gIC8qIEJpdCAgOSAgIEN5cmlsbGljICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgQ3lyaWxsaWMgU3VwcGxlbWVudCAqLwotICAvKiAgICAgICAgICBDeXJpbGxpYyBFeHRlbmRlZC1BICovCi0gIC8qICAgICAgICAgIEN5cmlsbGljIEV4dGVuZGVkLUIgKi8KLSNkZWZpbmUgVFRfVUNSX0NZUklMTElDICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA5KSAvKiBVKzA0MDAtVSswNEZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSswNTAwLVUrMDUyRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMkRFMC1VKzJERkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVK0E2NDAtVStBNjlGICovCi0gIC8qIEJpdCAxMCAgIEFybWVuaWFuICovCi0jZGVmaW5lIFRUX1VDUl9BUk1FTklBTiAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMCkgLyogVSswNTMwLVUrMDU4RiAqLwotICAvKiBCaXQgMTEgICBIZWJyZXcgKi8KLSNkZWZpbmUgVFRfVUNSX0hFQlJFVyAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDExKSAvKiBVKzA1OTAtVSswNUZGICovCi0gIC8qIEJpdCAxMiAgIFZhaSAqLwotI2RlZmluZSBUVF9VQ1JfVkFJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTIpIC8qIFUrQTUwMC1VK0E2M0YgKi8KLSAgLyogQml0IDEzICAgQXJhYmljICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgQXJhYmljIFN1cHBsZW1lbnQgKi8KLSNkZWZpbmUgVFRfVUNSX0FSQUJJQyAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDEzKSAvKiBVKzA2MDAtVSswNkZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSswNzUwLVUrMDc3RiAqLwotICAvKiBCaXQgMTQgICBOS28gKi8KLSNkZWZpbmUgVFRfVUNSX05LTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE0KSAvKiBVKzA3QzAtVSswN0ZGICovCi0gIC8qIEJpdCAxNSAgIERldmFuYWdhcmkgKi8KLSNkZWZpbmUgVFRfVUNSX0RFVkFOQUdBUkkgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE1KSAvKiBVKzA5MDAtVSswOTdGICovCi0gIC8qIEJpdCAxNiAgIEJlbmdhbGkgKi8KLSNkZWZpbmUgVFRfVUNSX0JFTkdBTEkgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE2KSAvKiBVKzA5ODAtVSswOUZGICovCi0gIC8qIEJpdCAxNyAgIEd1cm11a2hpICovCi0jZGVmaW5lIFRUX1VDUl9HVVJNVUtISSAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNykgLyogVSswQTAwLVUrMEE3RiAqLwotICAvKiBCaXQgMTggICBHdWphcmF0aSAqLwotI2RlZmluZSBUVF9VQ1JfR1VKQVJBVEkgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTgpIC8qIFUrMEE4MC1VKzBBRkYgKi8KLSAgLyogQml0IDE5ICAgT3JpeWEgKi8KLSNkZWZpbmUgVFRfVUNSX09SSVlBICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE5KSAvKiBVKzBCMDAtVSswQjdGICovCi0gIC8qIEJpdCAyMCAgIFRhbWlsICovCi0jZGVmaW5lIFRUX1VDUl9UQU1JTCAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMCkgLyogVSswQjgwLVUrMEJGRiAqLwotICAvKiBCaXQgMjEgICBUZWx1Z3UgKi8KLSNkZWZpbmUgVFRfVUNSX1RFTFVHVSAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIxKSAvKiBVKzBDMDAtVSswQzdGICovCi0gIC8qIEJpdCAyMiAgIEthbm5hZGEgKi8KLSNkZWZpbmUgVFRfVUNSX0tBTk5BREEgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIyKSAvKiBVKzBDODAtVSswQ0ZGICovCi0gIC8qIEJpdCAyMyAgIE1hbGF5YWxhbSAqLwotI2RlZmluZSBUVF9VQ1JfTUFMQVlBTEFNICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjMpIC8qIFUrMEQwMC1VKzBEN0YgKi8KLSAgLyogQml0IDI0ICAgVGhhaSAqLwotI2RlZmluZSBUVF9VQ1JfVEhBSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjQpIC8qIFUrMEUwMC1VKzBFN0YgKi8KLSAgLyogQml0IDI1ICAgTGFvICovCi0jZGVmaW5lIFRUX1VDUl9MQU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNSkgLyogVSswRTgwLVUrMEVGRiAqLwotICAvKiBCaXQgMjYgICBHZW9yZ2lhbiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIEdlb3JnaWFuIFN1cHBsZW1lbnQgKi8KLSNkZWZpbmUgVFRfVUNSX0dFT1JHSUFOICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI2KSAvKiBVKzEwQTAtVSsxMEZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyRDAwLVUrMkQyRiAqLwotICAvKiBCaXQgMjcgICBCYWxpbmVzZSAqLwotI2RlZmluZSBUVF9VQ1JfQkFMSU5FU0UgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjcpIC8qIFUrMUIwMC1VKzFCN0YgKi8KLSAgLyogQml0IDI4ICAgSGFuZ3VsIEphbW8gKi8KLSNkZWZpbmUgVFRfVUNSX0hBTkdVTF9KQU1PICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI4KSAvKiBVKzExMDAtVSsxMUZGICovCi0gIC8qIEJpdCAyOSAgIExhdGluIEV4dGVuZGVkIEFkZGl0aW9uYWwgKi8KLSAgLyogICAgICAgICAgTGF0aW4gRXh0ZW5kZWQtQyAgICAgICAgICAqLwotICAvKiAgICAgICAgICBMYXRpbiBFeHRlbmRlZC1EICAgICAgICAgICovCi0jZGVmaW5lIFRUX1VDUl9MQVRJTl9FWFRFTkRFRF9BRERJVElPTkFMICAgICAgICgxTCA8PCAyOSkgLyogVSsxRTAwLVUrMUVGRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMkM2MC1VKzJDN0YgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVK0E3MjAtVStBN0ZGICovCi0gIC8qIEJpdCAzMCAgIEdyZWVrIEV4dGVuZGVkICovCi0jZGVmaW5lIFRUX1VDUl9HUkVFS19FWFRFTkRFRCAgICAgICAgICAgICAgICAgICgxTCA8PCAzMCkgLyogVSsxRjAwLVUrMUZGRiAqLwotICAvKiBCaXQgMzEgICBHZW5lcmFsIFB1bmN0dWF0aW9uICAgICAgKi8KLSAgLyogICAgICAgICAgU3VwcGxlbWVudGFsIFB1bmN0dWF0aW9uICovCi0jZGVmaW5lIFRUX1VDUl9HRU5FUkFMX1BVTkNUVUFUSU9OICAgICAgICAgICAgICgxTCA8PCAzMSkgLyogVSsyMDAwLVUrMjA2RiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMkUwMC1VKzJFN0YgKi8KLSAgLyogQml0IDMyICAgU3VwZXJzY3JpcHRzIEFuZCBTdWJzY3JpcHRzICovCi0jZGVmaW5lIFRUX1VDUl9TVVBFUlNDUklQVFNfU1VCU0NSSVBUUyAgICAgICAgICgxTCA8PCAgMCkgLyogVSsyMDcwLVUrMjA5RiAqLwotICAvKiBCaXQgMzMgICBDdXJyZW5jeSBTeW1ib2xzICovCi0jZGVmaW5lIFRUX1VDUl9DVVJSRU5DWV9TWU1CT0xTICAgICAgICAgICAgICAgICgxTCA8PCAgMSkgLyogVSsyMEEwLVUrMjBDRiAqLwotICAvKiBCaXQgMzQgICBDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MgRm9yIFN5bWJvbHMgKi8KLSNkZWZpbmUgVFRfVUNSX0NPTUJJTklOR19ESUFDUklUSUNTX1NZTUIgICAgICAgKDFMIDw8ICAyKSAvKiBVKzIwRDAtVSsyMEZGICovCi0gIC8qIEJpdCAzNSAgIExldHRlcmxpa2UgU3ltYm9scyAqLwotI2RlZmluZSBUVF9VQ1JfTEVUVEVSTElLRV9TWU1CT0xTICAgICAgICAgICAgICAoMUwgPDwgIDMpIC8qIFUrMjEwMC1VKzIxNEYgKi8KLSAgLyogQml0IDM2ICAgTnVtYmVyIEZvcm1zICovCi0jZGVmaW5lIFRUX1VDUl9OVU1CRVJfRk9STVMgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgNCkgLyogVSsyMTUwLVUrMjE4RiAqLwotICAvKiBCaXQgMzcgICBBcnJvd3MgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBTdXBwbGVtZW50YWwgQXJyb3dzLUEgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBTdXBwbGVtZW50YWwgQXJyb3dzLUIgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBNaXNjZWxsYW5lb3VzIFN5bWJvbHMgYW5kIEFycm93cyAqLwotI2RlZmluZSBUVF9VQ1JfQVJST1dTICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDUpIC8qIFUrMjE5MC1VKzIxRkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzI3RjAtVSsyN0ZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyOTAwLVUrMjk3RiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMkIwMC1VKzJCRkYgKi8KLSAgLyogQml0IDM4ICAgTWF0aGVtYXRpY2FsIE9wZXJhdG9ycyAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIFN1cHBsZW1lbnRhbCBNYXRoZW1hdGljYWwgT3BlcmF0b3JzICAqLwotICAvKiAgICAgICAgICBNaXNjZWxsYW5lb3VzIE1hdGhlbWF0aWNhbCBTeW1ib2xzLUEgKi8KLSAgLyogICAgICAgICAgTWlzY2VsbGFuZW91cyBNYXRoZW1hdGljYWwgU3ltYm9scy1CICovCi0jZGVmaW5lIFRUX1VDUl9NQVRIRU1BVElDQUxfT1BFUkFUT1JTICAgICAgICAgICgxTCA8PCAgNikgLyogVSsyMjAwLVUrMjJGRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMkEwMC1VKzJBRkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzI3QzAtVSsyN0VGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyOTgwLVUrMjlGRiAqLwotICAvKiBCaXQgMzkgTWlzY2VsbGFuZW91cyBUZWNobmljYWwgKi8KLSNkZWZpbmUgVFRfVUNSX01JU0NFTExBTkVPVVNfVEVDSE5JQ0FMICAgICAgICAgKDFMIDw8ICA3KSAvKiBVKzIzMDAtVSsyM0ZGICovCi0gIC8qIEJpdCA0MCAgIENvbnRyb2wgUGljdHVyZXMgKi8KLSNkZWZpbmUgVFRfVUNSX0NPTlRST0xfUElDVFVSRVMgICAgICAgICAgICAgICAgKDFMIDw8ICA4KSAvKiBVKzI0MDAtVSsyNDNGICovCi0gIC8qIEJpdCA0MSAgIE9wdGljYWwgQ2hhcmFjdGVyIFJlY29nbml0aW9uICovCi0jZGVmaW5lIFRUX1VDUl9PQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgOSkgLyogVSsyNDQwLVUrMjQ1RiAqLwotICAvKiBCaXQgNDIgICBFbmNsb3NlZCBBbHBoYW51bWVyaWNzICovCi0jZGVmaW5lIFRUX1VDUl9FTkNMT1NFRF9BTFBIQU5VTUVSSUNTICAgICAgICAgICgxTCA8PCAxMCkgLyogVSsyNDYwLVUrMjRGRiAqLwotICAvKiBCaXQgNDMgICBCb3ggRHJhd2luZyAqLwotI2RlZmluZSBUVF9VQ1JfQk9YX0RSQVdJTkcgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTEpIC8qIFUrMjUwMC1VKzI1N0YgKi8KLSAgLyogQml0IDQ0ICAgQmxvY2sgRWxlbWVudHMgKi8KLSNkZWZpbmUgVFRfVUNSX0JMT0NLX0VMRU1FTlRTICAgICAgICAgICAgICAgICAgKDFMIDw8IDEyKSAvKiBVKzI1ODAtVSsyNTlGICovCi0gIC8qIEJpdCA0NSAgIEdlb21ldHJpYyBTaGFwZXMgKi8KLSNkZWZpbmUgVFRfVUNSX0dFT01FVFJJQ19TSEFQRVMgICAgICAgICAgICAgICAgKDFMIDw8IDEzKSAvKiBVKzI1QTAtVSsyNUZGICovCi0gIC8qIEJpdCA0NiAgIE1pc2NlbGxhbmVvdXMgU3ltYm9scyAqLwotI2RlZmluZSBUVF9VQ1JfTUlTQ0VMTEFORU9VU19TWU1CT0xTICAgICAgICAgICAoMUwgPDwgMTQpIC8qIFUrMjYwMC1VKzI2RkYgKi8KLSAgLyogQml0IDQ3ICAgRGluZ2JhdHMgKi8KLSNkZWZpbmUgVFRfVUNSX0RJTkdCQVRTICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE1KSAvKiBVKzI3MDAtVSsyN0JGICovCi0gIC8qIEJpdCA0OCAgIENKSyBTeW1ib2xzIGFuZCBQdW5jdHVhdGlvbiAqLwotI2RlZmluZSBUVF9VQ1JfQ0pLX1NZTUJPTFMgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTYpIC8qIFUrMzAwMC1VKzMwM0YgKi8KLSAgLyogQml0IDQ5ICAgSGlyYWdhbmEgKi8KLSNkZWZpbmUgVFRfVUNSX0hJUkFHQU5BICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE3KSAvKiBVKzMwNDAtVSszMDlGICovCi0gIC8qIEJpdCA1MCAgIEthdGFrYW5hICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9ucyAqLwotI2RlZmluZSBUVF9VQ1JfS0FUQUtBTkEgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTgpIC8qIFUrMzBBMC1VKzMwRkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzMxRjAtVSszMUZGICovCi0gIC8qIEJpdCA1MSAgIEJvcG9tb2ZvICAgICAgICAgICovCi0gIC8qICAgICAgICAgIEJvcG9tb2ZvIEV4dGVuZGVkICovCi0jZGVmaW5lIFRUX1VDUl9CT1BPTU9GTyAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxOSkgLyogVSszMTAwLVUrMzEyRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMzFBMC1VKzMxQkYgKi8KLSAgLyogQml0IDUyICAgSGFuZ3VsIENvbXBhdGliaWxpdHkgSmFtbyAqLwotI2RlZmluZSBUVF9VQ1JfSEFOR1VMX0NPTVBBVElCSUxJVFlfSkFNTyAgICAgICAoMUwgPDwgMjApIC8qIFUrMzEzMC1VKzMxOEYgKi8KLSAgLyogQml0IDUzICAgUGhhZ3MtUGEgKi8KLSNkZWZpbmUgVFRfVUNSX0NKS19NSVNDICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDIxKSAvKiBVK0E4NDAtVStBODdGICovCi0jZGVmaW5lIFRUX1VDUl9LQU5CVU4gIFRUX1VDUl9DSktfTUlTQyAvKiBkZXByZWNhdGVkICovCi0jZGVmaW5lIFRUX1VDUl9QSEFHU1BBCi0gIC8qIEJpdCA1NCAgIEVuY2xvc2VkIENKSyBMZXR0ZXJzIGFuZCBNb250aHMgKi8KLSNkZWZpbmUgVFRfVUNSX0VOQ0xPU0VEX0NKS19MRVRURVJTX01PTlRIUyAgICAgKDFMIDw8IDIyKSAvKiBVKzMyMDAtVSszMkZGICovCi0gIC8qIEJpdCA1NSAgIENKSyBDb21wYXRpYmlsaXR5ICovCi0jZGVmaW5lIFRUX1VDUl9DSktfQ09NUEFUSUJJTElUWSAgICAgICAgICAgICAgICgxTCA8PCAyMykgLyogVSszMzAwLVUrMzNGRiAqLwotICAvKiBCaXQgNTYgICBIYW5ndWwgU3lsbGFibGVzICovCi0jZGVmaW5lIFRUX1VDUl9IQU5HVUwgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNCkgLyogVStBQzAwLVUrRDdBMyAqLwotICAvKiBCaXQgNTcgICBIaWdoIFN1cnJvZ2F0ZXMgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIEhpZ2ggUHJpdmF0ZSBVc2UgU3Vycm9nYXRlcyAgKi8KLSAgLyogICAgICAgICAgTG93IFN1cnJvZ2F0ZXMgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFjY29yZGluZyB0byBPcGVuVHlwZSBzcGVjcyB2LjEuMyssICAgKi8KLSAgLyogc2V0dGluZyBiaXQgNTcgaW1wbGllcyB0aGF0IHRoZXJlIGlzICAqLwotICAvKiBhdCBsZWFzdCBvbmUgY29kZXBvaW50IGJleW9uZCB0aGUgICAgICovCi0gIC8qIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSB0aGF0IGlzICAgICAgKi8KLSAgLyogc3VwcG9ydGVkIGJ5IHRoaXMgZm9udC4gIFNvIGl0IHJlYWxseSAqLwotICAvKiBtZWFucyA+PSBVKzEwMDAwICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX1VDUl9TVVJST0dBVEVTICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNSkgLyogVStEODAwLVUrREI3RiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrREI4MC1VK0RCRkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVK0RDMDAtVStERkZGICovCi0jZGVmaW5lIFRUX1VDUl9OT05fUExBTkVfMCAgVFRfVUNSX1NVUlJPR0FURVMKLSAgLyogQml0IDU4ICBQaG9lbmljaWFuICovCi0jZGVmaW5lIFRUX1VDUl9QSE9FTklDSUFOICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNikgLypVKzEwOTAwLVUrMTA5MUYqLwotICAvKiBCaXQgNTkgICBDSksgVW5pZmllZCBJZGVvZ3JhcGhzICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIENKSyBSYWRpY2FscyBTdXBwbGVtZW50ICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgS2FuZ3hpIFJhZGljYWxzICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBJZGVvZ3JhcGhpYyBEZXNjcmlwdGlvbiBDaGFyYWN0ZXJzICovCi0gIC8qICAgICAgICAgIENKSyBVbmlmaWVkIElkZW9ncmFwaHMgRXh0ZW5zaW9uIEEgKi8KLSAgLyogICAgICAgICAgQ0pLIFVuaWZpZWQgSWRlb2dyYXBocyBFeHRlbnNpb24gQiAqLwotICAvKiAgICAgICAgICBLYW5idW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX1VDUl9DSktfVU5JRklFRF9JREVPR1JBUEhTICAgICAgICAgICgxTCA8PCAyNykgLyogVSs0RTAwLVUrOUZGRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMkU4MC1VKzJFRkYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzJGMDAtVSsyRkRGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyRkYwLVUrMkZGRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMzQwMC1VKzREQjUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMjAwMDAtVSsyQTZERiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSszMTkwLVUrMzE5RiAqLwotICAvKiBCaXQgNjAgICBQcml2YXRlIFVzZSAqLwotI2RlZmluZSBUVF9VQ1JfUFJJVkFURV9VU0UgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjgpIC8qIFUrRTAwMC1VK0Y4RkYgKi8KLSAgLyogQml0IDYxICAgQ0pLIFN0cm9rZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzIFN1cHBsZW1lbnQgKi8KLSNkZWZpbmUgVFRfVUNSX0NKS19DT01QQVRJQklMSVRZX0lERU9HUkFQSFMgICAgKDFMIDw8IDI5KSAvKiBVKzMxQzAtVSszMUVGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVStGOTAwLVUrRkFGRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVSsyRjgwMC1VKzJGQTFGKi8KLSAgLyogQml0IDYyICAgQWxwaGFiZXRpYyBQcmVzZW50YXRpb24gRm9ybXMgKi8KLSNkZWZpbmUgVFRfVUNSX0FMUEhBQkVUSUNfUFJFU0VOVEFUSU9OX0ZPUk1TICAgKDFMIDw8IDMwKSAvKiBVK0ZCMDAtVStGQjRGICovCi0gIC8qIEJpdCA2MyAgIEFyYWJpYyBQcmVzZW50YXRpb24gRm9ybXMtQSAqLwotI2RlZmluZSBUVF9VQ1JfQVJBQklDX1BSRVNFTlRBVElPTlNfQSAgICAgICAgICAoMUwgPDwgMzEpIC8qIFUrRkI1MC1VK0ZERkYgKi8KLSAgLyogQml0IDY0ICAgQ29tYmluaW5nIEhhbGYgTWFya3MgKi8KLSNkZWZpbmUgVFRfVUNSX0NPTUJJTklOR19IQUxGX01BUktTICAgICAgICAgICAgKDFMIDw8ICAwKSAvKiBVK0ZFMjAtVStGRTJGICovCi0gIC8qIEJpdCA2NSAgIFZlcnRpY2FsIGZvcm1zICAgICAgICAgICovCi0gIC8qICAgICAgICAgIENKSyBDb21wYXRpYmlsaXR5IEZvcm1zICovCi0jZGVmaW5lIFRUX1VDUl9DSktfQ09NUEFUSUJJTElUWV9GT1JNUyAgICAgICAgICgxTCA8PCAgMSkgLyogVStGRTEwLVUrRkUxRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrRkUzMC1VK0ZFNEYgKi8KLSAgLyogQml0IDY2ICAgU21hbGwgRm9ybSBWYXJpYW50cyAqLwotI2RlZmluZSBUVF9VQ1JfU01BTExfRk9STV9WQVJJQU5UUyAgICAgICAgICAgICAoMUwgPDwgIDIpIC8qIFUrRkU1MC1VK0ZFNkYgKi8KLSAgLyogQml0IDY3ICAgQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CICovCi0jZGVmaW5lIFRUX1VDUl9BUkFCSUNfUFJFU0VOVEFUSU9OU19CICAgICAgICAgICgxTCA8PCAgMykgLyogVStGRTcwLVUrRkVGRSAqLwotICAvKiBCaXQgNjggICBIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3JtcyAqLwotI2RlZmluZSBUVF9VQ1JfSEFMRldJRFRIX0ZVTExXSURUSF9GT1JNUyAgICAgICAoMUwgPDwgIDQpIC8qIFUrRkYwMC1VK0ZGRUYgKi8KLSAgLyogQml0IDY5ICAgU3BlY2lhbHMgKi8KLSNkZWZpbmUgVFRfVUNSX1NQRUNJQUxTICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA1KSAvKiBVK0ZGRjAtVStGRkZEICovCi0gIC8qIEJpdCA3MCAgIFRpYmV0YW4gKi8KLSNkZWZpbmUgVFRfVUNSX1RJQkVUQU4gICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICA2KSAvKiBVKzBGMDAtVSswRkZGICovCi0gIC8qIEJpdCA3MSAgIFN5cmlhYyAqLwotI2RlZmluZSBUVF9VQ1JfU1lSSUFDICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDcpIC8qIFUrMDcwMC1VKzA3NEYgKi8KLSAgLyogQml0IDcyICAgVGhhYW5hICovCi0jZGVmaW5lIFRUX1VDUl9USEFBTkEgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgOCkgLyogVSswNzgwLVUrMDdCRiAqLwotICAvKiBCaXQgNzMgICBTaW5oYWxhICovCi0jZGVmaW5lIFRUX1VDUl9TSU5IQUxBICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgOSkgLyogVSswRDgwLVUrMERGRiAqLwotICAvKiBCaXQgNzQgICBNeWFubWFyICovCi0jZGVmaW5lIFRUX1VDUl9NWUFOTUFSICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxMCkgLyogVSsxMDAwLVUrMTA5RiAqLwotICAvKiBCaXQgNzUgICBFdGhpb3BpYyAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIEV0aGlvcGljIFN1cHBsZW1lbnQgKi8KLSAgLyogICAgICAgICAgRXRoaW9waWMgRXh0ZW5kZWQgICAqLwotI2RlZmluZSBUVF9VQ1JfRVRISU9QSUMgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTEpIC8qIFUrMTIwMC1VKzEzN0YgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzEzODAtVSsxMzlGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsyRDgwLVUrMkRERiAqLwotICAvKiBCaXQgNzYgICBDaGVyb2tlZSAqLwotI2RlZmluZSBUVF9VQ1JfQ0hFUk9LRUUgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTIpIC8qIFUrMTNBMC1VKzEzRkYgKi8KLSAgLyogQml0IDc3ICAgVW5pZmllZCBDYW5hZGlhbiBBYm9yaWdpbmFsIFN5bGxhYmljcyAqLwotI2RlZmluZSBUVF9VQ1JfQ0FOQURJQU5fQUJPUklHSU5BTF9TWUxMQUJJQ1MgICAoMUwgPDwgMTMpIC8qIFUrMTQwMC1VKzE2N0YgKi8KLSAgLyogQml0IDc4ICAgT2doYW0gKi8KLSNkZWZpbmUgVFRfVUNSX09HSEFNICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE0KSAvKiBVKzE2ODAtVSsxNjlGICovCi0gIC8qIEJpdCA3OSAgIFJ1bmljICovCi0jZGVmaW5lIFRUX1VDUl9SVU5JQyAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNSkgLyogVSsxNkEwLVUrMTZGRiAqLwotICAvKiBCaXQgODAgICBLaG1lciAgICAgICAgICovCi0gIC8qICAgICAgICAgIEtobWVyIFN5bWJvbHMgKi8KLSNkZWZpbmUgVFRfVUNSX0tITUVSICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE2KSAvKiBVKzE3ODAtVSsxN0ZGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsxOUUwLVUrMTlGRiAqLwotICAvKiBCaXQgODEgICBNb25nb2xpYW4gKi8KLSNkZWZpbmUgVFRfVUNSX01PTkdPTElBTiAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE3KSAvKiBVKzE4MDAtVSsxOEFGICovCi0gIC8qIEJpdCA4MiAgIEJyYWlsbGUgUGF0dGVybnMgKi8KLSNkZWZpbmUgVFRfVUNSX0JSQUlMTEUgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE4KSAvKiBVKzI4MDAtVSsyOEZGICovCi0gIC8qIEJpdCA4MyAgIFlpIFN5bGxhYmxlcyAqLwotICAvKiAgICAgICAgICBZaSBSYWRpY2FscyAgKi8KLSNkZWZpbmUgVFRfVUNSX1lJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE5KSAvKiBVK0EwMDAtVStBNDhGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVStBNDkwLVUrQTRDRiAqLwotICAvKiBCaXQgODQgICBUYWdhbG9nICAqLwotICAvKiAgICAgICAgICBIYW51bm9vICAqLwotICAvKiAgICAgICAgICBCdWhpZCAgICAqLwotICAvKiAgICAgICAgICBUYWdiYW53YSAqLwotI2RlZmluZSBUVF9VQ1JfUEhJTElQUElORSAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjApIC8qIFUrMTcwMC1VKzE3MUYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVKzE3MjAtVSsxNzNGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVSsxNzQwLVUrMTc1RiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFUrMTc2MC1VKzE3N0YgKi8KLSAgLyogQml0IDg1ICAgT2xkIEl0YWxpYyAqLwotI2RlZmluZSBUVF9VQ1JfT0xEX0lUQUxJQyAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjEpIC8qVSsxMDMwMC1VKzEwMzJGKi8KLSAgLyogQml0IDg2ICAgR290aGljICovCi0jZGVmaW5lIFRUX1VDUl9HT1RISUMgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMikgLypVKzEwMzMwLVUrMTAzNEYqLwotICAvKiBCaXQgODcgICBEZXNlcmV0ICovCi0jZGVmaW5lIFRUX1VDUl9ERVNFUkVUICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMykgLypVKzEwNDAwLVUrMTA0NEYqLwotICAvKiBCaXQgODggICBCeXphbnRpbmUgTXVzaWNhbCBTeW1ib2xzICAgICAgKi8KLSAgLyogICAgICAgICAgTXVzaWNhbCBTeW1ib2xzICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIEFuY2llbnQgR3JlZWsgTXVzaWNhbCBOb3RhdGlvbiAqLwotI2RlZmluZSBUVF9VQ1JfTVVTSUNBTF9TWU1CT0xTICAgICAgICAgICAgICAgICAoMUwgPDwgMjQpIC8qVSsxRDAwMC1VKzFEMEZGKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMUQxMDAtVSsxRDFGRiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypVKzFEMjAwLVUrMUQyNEYqLwotICAvKiBCaXQgODkgICBNYXRoZW1hdGljYWwgQWxwaGFudW1lcmljIFN5bWJvbHMgKi8KLSNkZWZpbmUgVFRfVUNSX01BVEhfQUxQSEFOVU1FUklDX1NZTUJPTFMgICAgICAgKDFMIDw8IDI1KSAvKlUrMUQ0MDAtVSsxRDdGRiovCi0gIC8qIEJpdCA5MCAgIFByaXZhdGUgVXNlIChwbGFuZSAxNSkgKi8KLSAgLyogICAgICAgICAgUHJpdmF0ZSBVc2UgKHBsYW5lIDE2KSAqLwotI2RlZmluZSBUVF9VQ1JfUFJJVkFURV9VU0VfU1VQUExFTUVOVEFSWSAgICAgICAoMUwgPDwgMjYpIC8qVStGMDAwMC1VK0ZGRkZEKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypVKzEwMDAwMC1VKzEwRkZGRCovCi0gIC8qIEJpdCA5MSAgIFZhcmlhdGlvbiBTZWxlY3RvcnMgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICBWYXJpYXRpb24gU2VsZWN0b3JzIFN1cHBsZW1lbnQgKi8KLSNkZWZpbmUgVFRfVUNSX1ZBUklBVElPTl9TRUxFQ1RPUlMgICAgICAgICAgICAgKDFMIDw8IDI3KSAvKiBVK0ZFMDAtVStGRTBGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypVK0UwMTAwLVUrRTAxRUYqLwotICAvKiBCaXQgOTIgICBUYWdzICovCi0jZGVmaW5lIFRUX1VDUl9UQUdTICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyOCkgLypVK0UwMDAwLVUrRTAwN0YqLwotICAvKiBCaXQgOTMgICBMaW1idSAqLwotI2RlZmluZSBUVF9VQ1JfTElNQlUgICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjkpIC8qIFUrMTkwMC1VKzE5NEYgKi8KLSAgLyogQml0IDk0ICAgVGFpIExlICovCi0jZGVmaW5lIFRUX1VDUl9UQUlfTEUgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAzMCkgLyogVSsxOTUwLVUrMTk3RiAqLwotICAvKiBCaXQgOTUgICBOZXcgVGFpIEx1ZSAqLwotI2RlZmluZSBUVF9VQ1JfTkVXX1RBSV9MVUUgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMzEpIC8qIFUrMTk4MC1VKzE5REYgKi8KLSAgLyogQml0IDk2ICAgQnVnaW5lc2UgKi8KLSNkZWZpbmUgVFRfVUNSX0JVR0lORVNFICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICAwKSAvKiBVKzFBMDAtVSsxQTFGICovCi0gIC8qIEJpdCA5NyAgIEdsYWdvbGl0aWMgKi8KLSNkZWZpbmUgVFRfVUNSX0dMQUdPTElUSUMgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8ICAxKSAvKiBVKzJDMDAtVSsyQzVGICovCi0gIC8qIEJpdCA5OCAgIFRpZmluYWdoICovCi0jZGVmaW5lIFRUX1VDUl9USUZJTkFHSCAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgMikgLyogVSsyRDMwLVUrMkQ3RiAqLwotICAvKiBCaXQgOTkgICBZaWppbmcgSGV4YWdyYW0gU3ltYm9scyAqLwotI2RlZmluZSBUVF9VQ1JfWUlKSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDMpIC8qIFUrNERDMC1VKzRERkYgKi8KLSAgLyogQml0IDEwMCAgU3lsb3RpIE5hZ3JpICovCi0jZGVmaW5lIFRUX1VDUl9TWUxPVElfTkFHUkkgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgNCkgLyogVStBODAwLVUrQTgyRiAqLwotICAvKiBCaXQgMTAxICBMaW5lYXIgQiBTeWxsYWJhcnkgKi8KLSAgLyogICAgICAgICAgTGluZWFyIEIgSWRlb2dyYW1zICovCi0gIC8qICAgICAgICAgIEFlZ2VhbiBOdW1iZXJzICAgICAqLwotI2RlZmluZSBUVF9VQ1JfTElORUFSX0IgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDUpIC8qVSsxMDAwMC1VKzEwMDdGKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMTAwODAtVSsxMDBGRiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypVKzEwMTAwLVUrMTAxM0YqLwotICAvKiBCaXQgMTAyICBBbmNpZW50IEdyZWVrIE51bWJlcnMgKi8KLSNkZWZpbmUgVFRfVUNSX0FOQ0lFTlRfR1JFRUtfTlVNQkVSUyAgICAgICAgICAgKDFMIDw8ICA2KSAvKlUrMTAxNDAtVSsxMDE4RiovCi0gIC8qIEJpdCAxMDMgIFVnYXJpdGljICovCi0jZGVmaW5lIFRUX1VDUl9VR0FSSVRJQyAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAgNykgLypVKzEwMzgwLVUrMTAzOUYqLwotICAvKiBCaXQgMTA0ICBPbGQgUGVyc2lhbiAqLwotI2RlZmluZSBUVF9VQ1JfT0xEX1BFUlNJQU4gICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDgpIC8qVSsxMDNBMC1VKzEwM0RGKi8KLSAgLyogQml0IDEwNSAgU2hhdmlhbiAqLwotI2RlZmluZSBUVF9VQ1JfU0hBVklBTiAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgIDkpIC8qVSsxMDQ1MC1VKzEwNDdGKi8KLSAgLyogQml0IDEwNiAgT3NtYW55YSAqLwotI2RlZmluZSBUVF9VQ1JfT1NNQU5ZQSAgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTApIC8qVSsxMDQ4MC1VKzEwNEFGKi8KLSAgLyogQml0IDEwNyAgQ3lwcmlvdCBTeWxsYWJhcnkgKi8KLSNkZWZpbmUgVFRfVUNSX0NZUFJJT1RfU1lMTEFCQVJZICAgICAgICAgICAgICAgKDFMIDw8IDExKSAvKlUrMTA4MDAtVSsxMDgzRiovCi0gIC8qIEJpdCAxMDggIEtoYXJvc2h0aGkgKi8KLSNkZWZpbmUgVFRfVUNSX0tIQVJPU0hUSEkgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDEyKSAvKlUrMTBBMDAtVSsxMEE1RiovCi0gIC8qIEJpdCAxMDkgIFRhaSBYdWFuIEppbmcgU3ltYm9scyAqLwotI2RlZmluZSBUVF9VQ1JfVEFJX1hVQU5fSklORyAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTMpIC8qVSsxRDMwMC1VKzFEMzVGKi8KLSAgLyogQml0IDExMCAgQ3VuZWlmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgIEN1bmVpZm9ybSBOdW1iZXJzIGFuZCBQdW5jdHVhdGlvbiAqLwotI2RlZmluZSBUVF9VQ1JfQ1VORUlGT1JNICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMTQpIC8qVSsxMjAwMC1VKzEyM0ZGKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMTI0MDAtVSsxMjQ3RiovCi0gIC8qIEJpdCAxMTEgIENvdW50aW5nIFJvZCBOdW1lcmFscyAqLwotI2RlZmluZSBUVF9VQ1JfQ09VTlRJTkdfUk9EX05VTUVSQUxTICAgICAgICAgICAoMUwgPDwgMTUpIC8qVSsxRDM2MC1VKzFEMzdGKi8KLSAgLyogQml0IDExMiAgU3VuZGFuZXNlICovCi0jZGVmaW5lIFRUX1VDUl9TVU5EQU5FU0UgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxNikgLyogVSsxQjgwLVUrMUJCRiAqLwotICAvKiBCaXQgMTEzICBMZXBjaGEgKi8KLSNkZWZpbmUgVFRfVUNSX0xFUENIQSAgICAgICAgICAgICAgICAgICAgICAgICAgKDFMIDw8IDE3KSAvKiBVKzFDMDAtVSsxQzRGICovCi0gIC8qIEJpdCAxMTQgIE9sIENoaWtpICovCi0jZGVmaW5lIFRUX1VDUl9PTF9DSElLSSAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxOCkgLyogVSsxQzUwLVUrMUM3RiAqLwotICAvKiBCaXQgMTE1ICBTYXVyYXNodHJhICovCi0jZGVmaW5lIFRUX1VDUl9TQVVSQVNIVFJBICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAxOSkgLyogVStBODgwLVUrQThERiAqLwotICAvKiBCaXQgMTE2ICBLYXlhaCBMaSAqLwotI2RlZmluZSBUVF9VQ1JfS0FZQUhfTEkgICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjApIC8qIFUrQTkwMC1VK0E5MkYgKi8KLSAgLyogQml0IDExNyAgUmVqYW5nICovCi0jZGVmaW5lIFRUX1VDUl9SRUpBTkcgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMSkgLyogVStBOTMwLVUrQTk1RiAqLwotICAvKiBCaXQgMTE4ICBDaGFtICovCi0jZGVmaW5lIFRUX1VDUl9DSEFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxTCA8PCAyMikgLyogVStBQTAwLVUrQUE1RiAqLwotICAvKiBCaXQgMTE5ICBBbmNpZW50IFN5bWJvbHMgKi8KLSNkZWZpbmUgVFRfVUNSX0FOQ0lFTlRfU1lNQk9MUyAgICAgICAgICAgICAgICAgKDFMIDw8IDIzKSAvKlUrMTAxOTAtVSsxMDFDRiovCi0gIC8qIEJpdCAxMjAgIFBoYWlzdG9zIERpc2MgKi8KLSNkZWZpbmUgVFRfVUNSX1BIQUlTVE9TX0RJU0MgICAgICAgICAgICAgICAgICAgKDFMIDw8IDI0KSAvKlUrMTAxRDAtVSsxMDFGRiovCi0gIC8qIEJpdCAxMjEgIENhcmlhbiAqLwotICAvKiAgICAgICAgICBMeWNpYW4gKi8KLSAgLyogICAgICAgICAgTHlkaWFuICovCi0jZGVmaW5lIFRUX1VDUl9PTERfQU5BVE9MSUFOICAgICAgICAgICAgICAgICAgICgxTCA8PCAyNSkgLypVKzEwMkEwLVUrMTAyREYqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qVSsxMDI4MC1VKzEwMjlGKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMTA5MjAtVSsxMDkzRiovCi0gIC8qIEJpdCAxMjIgIERvbWlubyBUaWxlcyAgKi8KLSAgLyogICAgICAgICAgTWFoam9uZyBUaWxlcyAqLwotI2RlZmluZSBUVF9VQ1JfR0FNRV9USUxFUyAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgMjYpIC8qVSsxRjAzMC1VKzFGMDlGKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKlUrMUYwMDAtVSsxRjAyRiovCi0gIC8qIEJpdCAxMjMtMTI3IFJlc2VydmVkIGZvciBwcm9jZXNzLWludGVybmFsIHVzYWdlICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNvbWUgY29tcGlsZXJzIGhhdmUgYSB2ZXJ5IGxpbWl0ZWQgbGVuZ3RoIG9mIGlkZW50aWZpZXJzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZiBkZWZpbmVkKCBfX1RVUkJPQ19fICkgJiYgX19UVVJCT0NfXyA8IDB4MDQxMCB8fCBkZWZpbmVkKCBfX1BBQ0lGSUNfXyApCi0jZGVmaW5lIEhBVkVfTElNSVRfT05fSURFTlRTCi0jZW5kaWYKLQotCi0jaWZuZGVmIEhBVkVfTElNSVRfT05fSURFTlRTCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEhlcmUgc29tZSBhbGlhcyAjZGVmaW5lcyBpbiBvcmRlciB0byBiZSBjbGVhcmVyLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlc2UgYXJlIG5vdCBhbHdheXMgI2RlZmluZWQgdG8gc3RheSB3aXRoaW4gdGhlIDMxfmNoYXJhY3RlciBsaW1pdCwgICovCi0gIC8qIHdoaWNoIHNvbWUgY29tcGlsZXJzIGhhdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ3JlZGl0cyBnbyB0byBEYXZlIEhvbyA8ZGhvb0BmbGFzaC5uZXQ+IGZvciBwb2ludGluZyBvdXQgdGhhdCBtb2Rlcm4gICovCi0gIC8qIEJvcmxhbmQgY29tcGlsZXJzIChyZWFkOiBmcm9tIEJDKysgMy4xIG9uKSBjYW4gaW5jcmVhc2UgdGhpcyBsaW1pdC4gICAqLwotICAvKiBJZiB5b3UgZ2V0IGEgd2FybmluZyB3aXRoIHN1Y2ggYSBjb21waWxlciwgdXNlIHRoZSAtaTQwIHN3aXRjaC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX1VDUl9BUkFCSUNfUFJFU0VOVEFUSU9OX0ZPUk1TX0EgICAgICBcCi0gICAgICAgICBUVF9VQ1JfQVJBQklDX1BSRVNFTlRBVElPTlNfQQotI2RlZmluZSBUVF9VQ1JfQVJBQklDX1BSRVNFTlRBVElPTl9GT1JNU19CICAgICAgXAotICAgICAgICAgVFRfVUNSX0FSQUJJQ19QUkVTRU5UQVRJT05TX0IKLQotI2RlZmluZSBUVF9VQ1JfQ09NQklOSU5HX0RJQUNSSVRJQ0FMX01BUktTICAgICAgXAotICAgICAgICAgVFRfVUNSX0NPTUJJTklOR19ESUFDUklUSUNTCi0jZGVmaW5lIFRUX1VDUl9DT01CSU5JTkdfRElBQ1JJVElDQUxfTUFSS1NfU1lNQiBcCi0gICAgICAgICBUVF9VQ1JfQ09NQklOSU5HX0RJQUNSSVRJQ1NfU1lNQgotCi0KLSNlbmRpZiAvKiAhSEFWRV9MSU1JVF9PTl9JREVOVFMgKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1RUTkFNRUlEX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS90dHRhYmxlcy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS90dHRhYmxlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTY4ZjQwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvdHR0YWJsZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDgyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dHRhYmxlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQmFzaWMgU0ZOVC9UcnVlVHlwZSB0YWJsZXMgZGVmaW5pdGlvbnMgYW5kIGludGVyZmFjZSAgICAgICAgICAgICAgICAgKi8KLS8qICAgIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fVFRUQUJMRVNfSF9fCi0jZGVmaW5lIF9fVFRUQUJMRVNfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0KLSNpZmRlZiBGUkVFVFlQRV9ICi0jZXJyb3IgImZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMSBoYXMgYmVlbiBsb2FkZWQhIgotI2Vycm9yICJQbGVhc2UgZml4IHRoZSBkaXJlY3Rvcnkgc2VhcmNoIG9yZGVyIGZvciBoZWFkZXIgZmlsZXMiCi0jZXJyb3IgInNvIHRoYXQgZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAyIGlzIGZvdW5kIGZpcnN0LiIKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFNlY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRydWV0eXBlX3RhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFRpdGxlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlIFRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEFic3RyYWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlIHNwZWNpZmljIHRhYmxlIHR5cGVzIGFuZCBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc2VjdGlvbiBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBUcnVlVHlwZS1zcGVjaWZpYyB0YWJsZXMgICAqLwotICAvKiAgICBhcyB3ZWxsIGFzIHNvbWUgcm91dGluZXMgdXNlZCB0byBhY2Nlc3MgYW5kIHByb2Nlc3MgdGhlbS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPcmRlcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9IZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfSG9yaUhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1ZlcnRIZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9PUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfUG9zdHNjcmlwdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1BDTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9NYXhQcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NmbnRfVGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9HZXRfU2ZudF9UYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfTG9hZF9TZm50X1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NmbnRfVGFibGVfSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0NNYXBfTGFuZ3VhZ2VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9DTWFwX0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfUEFSQU1fVEFHX1VOUEFURU5URURfSElOVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0hlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBUcnVlVHlwZSBmb250IGhlYWRlciB0YWJsZS4gIEFsbCAgICAgICAqLwotICAvKiAgICBmaWVsZHMgZm9sbG93IHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9IZWFkZXJfCi0gIHsKLSAgICBGVF9GaXhlZCAgIFRhYmxlX1ZlcnNpb247Ci0gICAgRlRfRml4ZWQgICBGb250X1JldmlzaW9uOwotCi0gICAgRlRfTG9uZyAgICBDaGVja1N1bV9BZGp1c3Q7Ci0gICAgRlRfTG9uZyAgICBNYWdpY19OdW1iZXI7Ci0KLSAgICBGVF9VU2hvcnQgIEZsYWdzOwotICAgIEZUX1VTaG9ydCAgVW5pdHNfUGVyX0VNOwotCi0gICAgRlRfTG9uZyAgICBDcmVhdGVkIFsyXTsKLSAgICBGVF9Mb25nICAgIE1vZGlmaWVkWzJdOwotCi0gICAgRlRfU2hvcnQgICB4TWluOwotICAgIEZUX1Nob3J0ICAgeU1pbjsKLSAgICBGVF9TaG9ydCAgIHhNYXg7Ci0gICAgRlRfU2hvcnQgICB5TWF4OwotCi0gICAgRlRfVVNob3J0ICBNYWNfU3R5bGU7Ci0gICAgRlRfVVNob3J0ICBMb3dlc3RfUmVjX1BQRU07Ci0KLSAgICBGVF9TaG9ydCAgIEZvbnRfRGlyZWN0aW9uOwotICAgIEZUX1Nob3J0ICAgSW5kZXhfVG9fTG9jX0Zvcm1hdDsKLSAgICBGVF9TaG9ydCAgIEdseXBoX0RhdGFfRm9ybWF0OwotCi0gIH0gVFRfSGVhZGVyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfSG9yaUhlYWRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIFRydWVUeXBlIGhvcml6b250YWwgaGVhZGVyLCB0aGUgYGhoZWEnICovCi0gIC8qICAgIHRhYmxlLCBhcyB3ZWxsIGFzIHRoZSBjb3JyZXNwb25kaW5nIGhvcml6b250YWwgbWV0cmljcyB0YWJsZSwgICAgICAqLwotICAvKiAgICBpLmUuLCB0aGUgYGhtdHgnIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBWZXJzaW9uICAgICAgICAgICAgICAgIDo6IFRoZSB0YWJsZSB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFzY2VuZGVyICAgICAgICAgICAgICAgOjogVGhlIGZvbnQncyBhc2NlbmRlciwgaS5lLiwgdGhlIGRpc3RhbmNlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGJhc2VsaW5lIHRvIHRoZSB0b3AtbW9zdCBvZiBhbGwgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaCBwb2ludHMgZm91bmQgaW4gdGhlIGZvbnQuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgaW52YWxpZCBpbiBtYW55IGZvbnRzLCBhcyAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyB1c3VhbGx5IHNldCBieSB0aGUgZm9udCBkZXNpZ25lciwgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG9mdGVuIHJlZmxlY3RzIG9ubHkgYSBwb3J0aW9uIG9mIHRoZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocyBmb3VuZCBpbiB0aGUgZm9udCAobWF5YmUgQVNDSUkpLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91IHNob3VsZCB1c2UgdGhlIGBzVHlwb0FzY2VuZGVyJyBmaWVsZCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBPUy8yIHRhYmxlIGluc3RlYWQgaWYgeW91IHdhbnQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29ycmVjdCBvbmUuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXNjZW5kZXIgICAgICAgICAgICAgIDo6IFRoZSBmb250J3MgZGVzY2VuZGVyLCBpLmUuLCB0aGUgZGlzdGFuY2UgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBiYXNlbGluZSB0byB0aGUgYm90dG9tLW1vc3Qgb2YgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGdseXBoIHBvaW50cyBmb3VuZCBpbiB0aGUgZm9udC4gIEl0ICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5lZ2F0aXZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBpbnZhbGlkIGluIG1hbnkgZm9udHMsIGFzICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIHVzdWFsbHkgc2V0IGJ5IHRoZSBmb250IGRlc2lnbmVyLCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgb2Z0ZW4gcmVmbGVjdHMgb25seSBhIHBvcnRpb24gb2YgdGhlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzIGZvdW5kIGluIHRoZSBmb250IChtYXliZSBBU0NJSSkuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3Ugc2hvdWxkIHVzZSB0aGUgYHNUeXBvRGVzY2VuZGVyJyAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgb2YgdGhlIE9TLzIgdGFibGUgaW5zdGVhZCBpZiB5b3UgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnQgdGhlIGNvcnJlY3Qgb25lLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExpbmVfR2FwICAgICAgICAgICAgICAgOjogVGhlIGZvbnQncyBsaW5lIGdhcCwgaS5lLiwgdGhlIGRpc3RhbmNlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFkZCB0byB0aGUgYXNjZW5kZXIgYW5kIGRlc2NlbmRlciB0byAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQgdGhlIEJUQiwgaS5lLiwgdGhlICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZWxpbmUtdG8tYmFzZWxpbmUgZGlzdGFuY2UgZm9yIHRoZSAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFkdmFuY2VfV2lkdGhfTWF4ICAgICAgOjogVGhpcyBmaWVsZCBpcyB0aGUgbWF4aW11bSBvZiBhbGwgYWR2YW5jZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRocyBmb3VuZCBpbiB0aGUgZm9udC4gIEl0IGNhbiBiZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGNvbXB1dGUgdGhlIG1heGltdW0gd2lkdGggb2YgYW4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJiaXRyYXJ5IHN0cmluZyBvZiB0ZXh0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWluX0xlZnRfU2lkZV9CZWFyaW5nICA6OiBUaGUgbWluaW11bSBsZWZ0IHNpZGUgYmVhcmluZyBvZiBhbGwgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzIHdpdGhpbiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWluX1JpZ2h0X1NpZGVfQmVhcmluZyA6OiBUaGUgbWluaW11bSByaWdodCBzaWRlIGJlYXJpbmcgb2YgYWxsICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhzIHdpdGhpbiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeE1heF9FeHRlbnQgICAgICAgICAgICA6OiBUaGUgbWF4aW11bSBob3Jpem9udGFsIGV4dGVudCAoaS5lLiwgdGhlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHdpZHRoJyBvZiBhIGdseXBoJ3MgYm91bmRpbmcgYm94KSBmb3IgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCBnbHlwaHMgaW4gdGhlIGZvbnQuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcmV0X1Nsb3BlX1Jpc2UgICAgICAgOjogVGhlIHJpc2UgY29lZmZpY2llbnQgb2YgdGhlIGN1cnNvcidzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3BlIG9mIHRoZSBjdXJzb3IgKHNsb3BlPXJpc2UvcnVuKS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNhcmV0X1Nsb3BlX1J1biAgICAgICAgOjogVGhlIHJ1biBjb2VmZmljaWVudCBvZiB0aGUgY3Vyc29yJ3MgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3BlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlc2VydmVkICAgICAgICAgICAgICAgOjogOH5yZXNlcnZlZCBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWV0cmljX0RhdGFfRm9ybWF0ICAgICA6OiBBbHdheXN+MC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1iZXJfT2ZfSE1ldHJpY3MgICAgIDo6IE51bWJlciBvZiBITWV0cmljcyBlbnRyaWVzIGluIHRoZSBgaG10eCcgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSAtLSB0aGlzIHZhbHVlIGNhbiBiZSBzbWFsbGVyIHRoYW4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRvdGFsIG51bWJlciBvZiBnbHlwaHMgaW4gdGhlIGZvbnQuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9uZ19tZXRyaWNzICAgICAgICAgICA6OiBBIHBvaW50ZXIgaW50byB0aGUgYGhtdHgnIHRhYmxlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaG9ydF9tZXRyaWNzICAgICAgICAgIDo6IEEgcG9pbnRlciBpbnRvIHRoZSBgaG10eCcgdGFibGUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJTVBPUlRBTlQ6IFRoZSBUVF9Ib3JpSGVhZGVyIGFuZCBUVF9WZXJ0SGVhZGVyIHN0cnVjdHVyZXMgc2hvdWxkICAgKi8KLSAgLyogICAgICAgICAgICAgICBiZSBpZGVudGljYWwgZXhjZXB0IGZvciB0aGUgbmFtZXMgb2YgdGhlaXIgZmllbGRzLCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgd2hpY2ggYXJlIGRpZmZlcmVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBUaGlzIGVuc3VyZXMgdGhhdCBhIHNpbmdsZSBmdW5jdGlvbiBpbiB0aGUgYHR0bG9hZCcgICAgICovCi0gIC8qICAgICAgICAgICAgICAgbW9kdWxlIGlzIGFibGUgdG8gcmVhZCBib3RoIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCAqLwotICAvKiAgICAgICAgICAgICAgIGhlYWRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9Ib3JpSGVhZGVyXwotICB7Ci0gICAgRlRfRml4ZWQgICBWZXJzaW9uOwotICAgIEZUX1Nob3J0ICAgQXNjZW5kZXI7Ci0gICAgRlRfU2hvcnQgICBEZXNjZW5kZXI7Ci0gICAgRlRfU2hvcnQgICBMaW5lX0dhcDsKLQotICAgIEZUX1VTaG9ydCAgYWR2YW5jZV9XaWR0aF9NYXg7ICAgICAgLyogYWR2YW5jZSB3aWR0aCBtYXhpbXVtICovCi0KLSAgICBGVF9TaG9ydCAgIG1pbl9MZWZ0X1NpZGVfQmVhcmluZzsgIC8qIG1pbmltdW0gbGVmdC1zYiAgICAgICAqLwotICAgIEZUX1Nob3J0ICAgbWluX1JpZ2h0X1NpZGVfQmVhcmluZzsgLyogbWluaW11bSByaWdodC1zYiAgICAgICovCi0gICAgRlRfU2hvcnQgICB4TWF4X0V4dGVudDsgICAgICAgICAgICAvKiB4bWF4IGV4dGVudHMgICAgICAgICAgKi8KLSAgICBGVF9TaG9ydCAgIGNhcmV0X1Nsb3BlX1Jpc2U7Ci0gICAgRlRfU2hvcnQgICBjYXJldF9TbG9wZV9SdW47Ci0gICAgRlRfU2hvcnQgICBjYXJldF9PZmZzZXQ7Ci0KLSAgICBGVF9TaG9ydCAgIFJlc2VydmVkWzRdOwotCi0gICAgRlRfU2hvcnQgICBtZXRyaWNfRGF0YV9Gb3JtYXQ7Ci0gICAgRlRfVVNob3J0ICBudW1iZXJfT2ZfSE1ldHJpY3M7Ci0KLSAgICAvKiBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgbm90IGRlZmluZWQgYnkgdGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24gKi8KLSAgICAvKiBidXQgdGhleSBhcmUgdXNlZCB0byBjb25uZWN0IHRoZSBtZXRyaWNzIGhlYWRlciB0byB0aGUgcmVsZXZhbnQgICAgKi8KLSAgICAvKiBgSE1UWCcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIHZvaWQqICAgICAgbG9uZ19tZXRyaWNzOwotICAgIHZvaWQqICAgICAgc2hvcnRfbWV0cmljczsKLQotICB9IFRUX0hvcmlIZWFkZXI7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9WZXJ0SGVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgVHJ1ZVR5cGUgdmVydGljYWwgaGVhZGVyLCB0aGUgYHZoZWEnICAgKi8KLSAgLyogICAgdGFibGUsIGFzIHdlbGwgYXMgdGhlIGNvcnJlc3BvbmRpbmcgdmVydGljYWwgbWV0cmljcyB0YWJsZSwgaS5lLiwgICovCi0gIC8qICAgIHRoZSBgdm10eCcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFZlcnNpb24gICAgICAgICAgICAgICAgIDo6IFRoZSB0YWJsZSB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQXNjZW5kZXIgICAgICAgICAgICAgICAgOjogVGhlIGZvbnQncyBhc2NlbmRlciwgaS5lLiwgdGhlIGRpc3RhbmNlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGJhc2VsaW5lIHRvIHRoZSB0b3AtbW9zdCBvZiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgZ2x5cGggcG9pbnRzIGZvdW5kIGluIHRoZSBmb250LiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgaW52YWxpZCBpbiBtYW55IGZvbnRzLCBhcyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyB1c3VhbGx5IHNldCBieSB0aGUgZm9udCBkZXNpZ25lciwgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG9mdGVuIHJlZmxlY3RzIG9ubHkgYSBwb3J0aW9uIG9mICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBnbHlwaHMgZm91bmQgaW4gdGhlIGZvbnQgKG1heWJlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0NJSSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBzaG91bGQgdXNlIHRoZSBgc1R5cG9Bc2NlbmRlcicgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBvZiB0aGUgT1MvMiB0YWJsZSBpbnN0ZWFkIGlmIHlvdSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0aGUgY29ycmVjdCBvbmUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEZXNjZW5kZXIgICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIGRlc2NlbmRlciwgaS5lLiwgdGhlICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgZnJvbSB0aGUgYmFzZWxpbmUgdG8gdGhlICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbS1tb3N0IG9mIGFsbCBnbHlwaCBwb2ludHMgZm91bmQgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgZm9udC4gIEl0IGlzIG5lZ2F0aXZlLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgaW52YWxpZCBpbiBtYW55IGZvbnRzLCBhcyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyB1c3VhbGx5IHNldCBieSB0aGUgZm9udCBkZXNpZ25lciwgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG9mdGVuIHJlZmxlY3RzIG9ubHkgYSBwb3J0aW9uIG9mICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBnbHlwaHMgZm91bmQgaW4gdGhlIGZvbnQgKG1heWJlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU0NJSSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlvdSBzaG91bGQgdXNlIHRoZSBgc1R5cG9EZXNjZW5kZXInICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBvZiB0aGUgT1MvMiB0YWJsZSBpbnN0ZWFkIGlmIHlvdSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0aGUgY29ycmVjdCBvbmUuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMaW5lX0dhcCAgICAgICAgICAgICAgICA6OiBUaGUgZm9udCdzIGxpbmUgZ2FwLCBpLmUuLCB0aGUgZGlzdGFuY2UgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWRkIHRvIHRoZSBhc2NlbmRlciBhbmQgZGVzY2VuZGVyIHRvICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCB0aGUgQlRCLCBpLmUuLCB0aGUgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbGluZS10by1iYXNlbGluZSBkaXN0YW5jZSBmb3IgdGhlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZHZhbmNlX0hlaWdodF9NYXggICAgICA6OiBUaGlzIGZpZWxkIGlzIHRoZSBtYXhpbXVtIG9mIGFsbCAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSBoZWlnaHRzIGZvdW5kIGluIHRoZSBmb250LiAgSXQgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSB1c2VkIHRvIGNvbXB1dGUgdGhlIG1heGltdW0gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgb2YgYW4gYXJiaXRyYXJ5IHN0cmluZyBvZiB0ZXh0LiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbl9Ub3BfU2lkZV9CZWFyaW5nICAgIDo6IFRoZSBtaW5pbXVtIHRvcCBzaWRlIGJlYXJpbmcgb2YgYWxsICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMgd2l0aGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbl9Cb3R0b21fU2lkZV9CZWFyaW5nIDo6IFRoZSBtaW5pbXVtIGJvdHRvbSBzaWRlIGJlYXJpbmcgb2YgYWxsICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMgd2l0aGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHlNYXhfRXh0ZW50ICAgICAgICAgICAgIDo6IFRoZSBtYXhpbXVtIHZlcnRpY2FsIGV4dGVudCAoaS5lLiwgdGhlICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgaGVpZ2h0JyBvZiBhIGdseXBoJ3MgYm91bmRpbmcgYm94KSBmb3IgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGdseXBocyBpbiB0aGUgZm9udC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjYXJldF9TbG9wZV9SaXNlICAgICAgICA6OiBUaGUgcmlzZSBjb2VmZmljaWVudCBvZiB0aGUgY3Vyc29yJ3MgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvcGUgb2YgdGhlIGN1cnNvciAoc2xvcGU9cmlzZS9ydW4pLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjYXJldF9TbG9wZV9SdW4gICAgICAgICA6OiBUaGUgcnVuIGNvZWZmaWNpZW50IG9mIHRoZSBjdXJzb3IncyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvcGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjYXJldF9PZmZzZXQgICAgICAgICAgICA6OiBUaGUgY3Vyc29yJ3Mgb2Zmc2V0IGZvciBzbGFudGVkIGZvbnRzLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyBgcmVzZXJ2ZWQnIGluIHZtdHggICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gMS4wLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmVzZXJ2ZWQgICAgICAgICAgICAgICAgOjogOH5yZXNlcnZlZCBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZXRyaWNfRGF0YV9Gb3JtYXQgICAgICA6OiBBbHdheXN+MC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bWJlcl9PZl9ITWV0cmljcyAgICAgIDo6IE51bWJlciBvZiBWTWV0cmljcyBlbnRyaWVzIGluIHRoZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgdm10eCcgdGFibGUgLS0gdGhpcyB2YWx1ZSBjYW4gYmUgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxlciB0aGFuIHRoZSB0b3RhbCBudW1iZXIgb2YgZ2x5cGhzICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9uZ19tZXRyaWNzICAgICAgICAgICA6OiBBIHBvaW50ZXIgaW50byB0aGUgYHZtdHgnIHRhYmxlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaG9ydF9tZXRyaWNzICAgICAgICAgIDo6IEEgcG9pbnRlciBpbnRvIHRoZSBgdm10eCcgdGFibGUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJTVBPUlRBTlQ6IFRoZSBUVF9Ib3JpSGVhZGVyIGFuZCBUVF9WZXJ0SGVhZGVyIHN0cnVjdHVyZXMgc2hvdWxkICAgKi8KLSAgLyogICAgICAgICAgICAgICBiZSBpZGVudGljYWwgZXhjZXB0IGZvciB0aGUgbmFtZXMgb2YgdGhlaXIgZmllbGRzLCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgd2hpY2ggYXJlIGRpZmZlcmVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICBUaGlzIGVuc3VyZXMgdGhhdCBhIHNpbmdsZSBmdW5jdGlvbiBpbiB0aGUgYHR0bG9hZCcgICAgICovCi0gIC8qICAgICAgICAgICAgICAgbW9kdWxlIGlzIGFibGUgdG8gcmVhZCBib3RoIHRoZSBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCAqLwotICAvKiAgICAgICAgICAgICAgIGhlYWRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9WZXJ0SGVhZGVyXwotICB7Ci0gICAgRlRfRml4ZWQgICBWZXJzaW9uOwotICAgIEZUX1Nob3J0ICAgQXNjZW5kZXI7Ci0gICAgRlRfU2hvcnQgICBEZXNjZW5kZXI7Ci0gICAgRlRfU2hvcnQgICBMaW5lX0dhcDsKLQotICAgIEZUX1VTaG9ydCAgYWR2YW5jZV9IZWlnaHRfTWF4OyAgICAgIC8qIGFkdmFuY2UgaGVpZ2h0IG1heGltdW0gKi8KLQotICAgIEZUX1Nob3J0ICAgbWluX1RvcF9TaWRlX0JlYXJpbmc7ICAgIC8qIG1pbmltdW0gbGVmdC1zYiBvciB0b3Atc2IgICAgICAgKi8KLSAgICBGVF9TaG9ydCAgIG1pbl9Cb3R0b21fU2lkZV9CZWFyaW5nOyAvKiBtaW5pbXVtIHJpZ2h0LXNiIG9yIGJvdHRvbS1zYiAgICovCi0gICAgRlRfU2hvcnQgICB5TWF4X0V4dGVudDsgICAgICAgICAgICAgLyogeG1heCBvciB5bWF4IGV4dGVudHMgICAgICAgICAgICAqLwotICAgIEZUX1Nob3J0ICAgY2FyZXRfU2xvcGVfUmlzZTsKLSAgICBGVF9TaG9ydCAgIGNhcmV0X1Nsb3BlX1J1bjsKLSAgICBGVF9TaG9ydCAgIGNhcmV0X09mZnNldDsKLQotICAgIEZUX1Nob3J0ICAgUmVzZXJ2ZWRbNF07Ci0KLSAgICBGVF9TaG9ydCAgIG1ldHJpY19EYXRhX0Zvcm1hdDsKLSAgICBGVF9VU2hvcnQgIG51bWJlcl9PZl9WTWV0cmljczsKLQotICAgIC8qIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBub3QgZGVmaW5lZCBieSB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiAqLwotICAgIC8qIGJ1dCB0aGV5J3JlIHVzZWQgdG8gY29ubmVjdCB0aGUgbWV0cmljcyBoZWFkZXIgdG8gdGhlIHJlbGV2YW50ICAgICAqLwotICAgIC8qIGBITVRYJyBvciBgVk1UWCcgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgdm9pZCogICAgICBsb25nX21ldHJpY3M7Ci0gICAgdm9pZCogICAgICBzaG9ydF9tZXRyaWNzOwotCi0gIH0gVFRfVmVydEhlYWRlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX09TMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBUcnVlVHlwZSBPUy8yIHRhYmxlLiAgQWxsIGZpZWxkcyAgICAgICAqLwotICAvKiAgICBjb21wbHkgdG8gdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vdGUgdGhhdCB3ZSBub3cgc3VwcG9ydCBvbGQgTWFjIGZvbnRzIHRoYXQgZG8gbm90IGluY2x1ZGUgYW4gT1MvMiAqLwotICAvKiAgICB0YWJsZS4gIEluIHRoaXMgY2FzZSwgdGhlIGB2ZXJzaW9uJyBmaWVsZCBpcyBhbHdheXMgc2V0IHRvIDB4RkZGRi4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9PUzJfCi0gIHsKLSAgICBGVF9VU2hvcnQgIHZlcnNpb247ICAgICAgICAgICAgICAgIC8qIDB4MDAwMSAtIG1vcmUgb3IgMHhGRkZGICovCi0gICAgRlRfU2hvcnQgICB4QXZnQ2hhcldpZHRoOwotICAgIEZUX1VTaG9ydCAgdXNXZWlnaHRDbGFzczsKLSAgICBGVF9VU2hvcnQgIHVzV2lkdGhDbGFzczsKLSAgICBGVF9VU2hvcnQgIGZzVHlwZTsKLSAgICBGVF9TaG9ydCAgIHlTdWJzY3JpcHRYU2l6ZTsKLSAgICBGVF9TaG9ydCAgIHlTdWJzY3JpcHRZU2l6ZTsKLSAgICBGVF9TaG9ydCAgIHlTdWJzY3JpcHRYT2Zmc2V0OwotICAgIEZUX1Nob3J0ICAgeVN1YnNjcmlwdFlPZmZzZXQ7Ci0gICAgRlRfU2hvcnQgICB5U3VwZXJzY3JpcHRYU2l6ZTsKLSAgICBGVF9TaG9ydCAgIHlTdXBlcnNjcmlwdFlTaXplOwotICAgIEZUX1Nob3J0ICAgeVN1cGVyc2NyaXB0WE9mZnNldDsKLSAgICBGVF9TaG9ydCAgIHlTdXBlcnNjcmlwdFlPZmZzZXQ7Ci0gICAgRlRfU2hvcnQgICB5U3RyaWtlb3V0U2l6ZTsKLSAgICBGVF9TaG9ydCAgIHlTdHJpa2VvdXRQb3NpdGlvbjsKLSAgICBGVF9TaG9ydCAgIHNGYW1pbHlDbGFzczsKLQotICAgIEZUX0J5dGUgICAgcGFub3NlWzEwXTsKLQotICAgIEZUX1VMb25nICAgdWxVbmljb2RlUmFuZ2UxOyAgICAgICAgLyogQml0cyAwLTMxICAgKi8KLSAgICBGVF9VTG9uZyAgIHVsVW5pY29kZVJhbmdlMjsgICAgICAgIC8qIEJpdHMgMzItNjMgICovCi0gICAgRlRfVUxvbmcgICB1bFVuaWNvZGVSYW5nZTM7ICAgICAgICAvKiBCaXRzIDY0LTk1ICAqLwotICAgIEZUX1VMb25nICAgdWxVbmljb2RlUmFuZ2U0OyAgICAgICAgLyogQml0cyA5Ni0xMjcgKi8KLQotICAgIEZUX0NoYXIgICAgYWNoVmVuZElEWzRdOwotCi0gICAgRlRfVVNob3J0ICBmc1NlbGVjdGlvbjsKLSAgICBGVF9VU2hvcnQgIHVzRmlyc3RDaGFySW5kZXg7Ci0gICAgRlRfVVNob3J0ICB1c0xhc3RDaGFySW5kZXg7Ci0gICAgRlRfU2hvcnQgICBzVHlwb0FzY2VuZGVyOwotICAgIEZUX1Nob3J0ICAgc1R5cG9EZXNjZW5kZXI7Ci0gICAgRlRfU2hvcnQgICBzVHlwb0xpbmVHYXA7Ci0gICAgRlRfVVNob3J0ICB1c1dpbkFzY2VudDsKLSAgICBGVF9VU2hvcnQgIHVzV2luRGVzY2VudDsKLQotICAgIC8qIG9ubHkgdmVyc2lvbiAxIGFuZCBoaWdoZXI6ICovCi0KLSAgICBGVF9VTG9uZyAgIHVsQ29kZVBhZ2VSYW5nZTE7ICAgICAgIC8qIEJpdHMgMC0zMSAgICovCi0gICAgRlRfVUxvbmcgICB1bENvZGVQYWdlUmFuZ2UyOyAgICAgICAvKiBCaXRzIDMyLTYzICAqLwotCi0gICAgLyogb25seSB2ZXJzaW9uIDIgYW5kIGhpZ2hlcjogKi8KLQotICAgIEZUX1Nob3J0ICAgc3hIZWlnaHQ7Ci0gICAgRlRfU2hvcnQgICBzQ2FwSGVpZ2h0OwotICAgIEZUX1VTaG9ydCAgdXNEZWZhdWx0Q2hhcjsKLSAgICBGVF9VU2hvcnQgIHVzQnJlYWtDaGFyOwotICAgIEZUX1VTaG9ydCAgdXNNYXhDb250ZXh0OwotCi0gICAgLyogb25seSB2ZXJzaW9uIDUgYW5kIGhpZ2hlcjogKi8KLQotICAgIEZUX1VTaG9ydCAgdXNMb3dlck9wdGljYWxQb2ludFNpemU7ICAgICAgIC8qIGluIHR3aXBzICgxLzIwdGggcG9pbnRzKSAqLwotICAgIEZUX1VTaG9ydCAgdXNVcHBlck9wdGljYWxQb2ludFNpemU7ICAgICAgIC8qIGluIHR3aXBzICgxLzIwdGggcG9pbnRzKSAqLwotCi0gIH0gVFRfT1MyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfUG9zdHNjcmlwdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBzdHJ1Y3R1cmUgdXNlZCB0byBtb2RlbCBhIFRydWVUeXBlIFBvc3RTY3JpcHQgdGFibGUuICBBbGwgZmllbGRzICovCi0gIC8qICAgIGNvbXBseSB0byB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbi4gIFRoaXMgc3RydWN0dXJlIGRvZXMgbm90ICAgICAqLwotICAvKiAgICByZWZlcmVuY2UgdGhlIFBvc3RTY3JpcHQgZ2x5cGggbmFtZXMsIHdoaWNoIGNhbiBiZSBuZXZlcnRoZWxlc3MgICAgKi8KLSAgLyogICAgYWNjZXNzZWQgd2l0aCB0aGUgYHR0cG9zdCcgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfUG9zdHNjcmlwdF8KLSAgewotICAgIEZUX0ZpeGVkICBGb3JtYXRUeXBlOwotICAgIEZUX0ZpeGVkICBpdGFsaWNBbmdsZTsKLSAgICBGVF9TaG9ydCAgdW5kZXJsaW5lUG9zaXRpb247Ci0gICAgRlRfU2hvcnQgIHVuZGVybGluZVRoaWNrbmVzczsKLSAgICBGVF9VTG9uZyAgaXNGaXhlZFBpdGNoOwotICAgIEZUX1VMb25nICBtaW5NZW1UeXBlNDI7Ci0gICAgRlRfVUxvbmcgIG1heE1lbVR5cGU0MjsKLSAgICBGVF9VTG9uZyAgbWluTWVtVHlwZTE7Ci0gICAgRlRfVUxvbmcgIG1heE1lbVR5cGUxOwotCi0gICAgLyogR2x5cGggbmFtZXMgZm9sbG93IGluIHRoZSBmaWxlLCBidXQgd2UgZG9uJ3QgICAqLwotICAgIC8qIGxvYWQgdGhlbSBieSBkZWZhdWx0LiAgU2VlIHRoZSB0dHBvc3QuYyBmaWxlLiAgKi8KLQotICB9IFRUX1Bvc3RzY3JpcHQ7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9QQ0xUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIHN0cnVjdHVyZSB1c2VkIHRvIG1vZGVsIGEgVHJ1ZVR5cGUgUENMVCB0YWJsZS4gIEFsbCBmaWVsZHMgICAgICAgKi8KLSAgLyogICAgY29tcGx5IHRvIHRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfUENMVF8KLSAgewotICAgIEZUX0ZpeGVkICAgVmVyc2lvbjsKLSAgICBGVF9VTG9uZyAgIEZvbnROdW1iZXI7Ci0gICAgRlRfVVNob3J0ICBQaXRjaDsKLSAgICBGVF9VU2hvcnQgIHhIZWlnaHQ7Ci0gICAgRlRfVVNob3J0ICBTdHlsZTsKLSAgICBGVF9VU2hvcnQgIFR5cGVGYW1pbHk7Ci0gICAgRlRfVVNob3J0ICBDYXBIZWlnaHQ7Ci0gICAgRlRfVVNob3J0ICBTeW1ib2xTZXQ7Ci0gICAgRlRfQ2hhciAgICBUeXBlRmFjZVsxNl07Ci0gICAgRlRfQ2hhciAgICBDaGFyYWN0ZXJDb21wbGVtZW50WzhdOwotICAgIEZUX0NoYXIgICAgRmlsZU5hbWVbNl07Ci0gICAgRlRfQ2hhciAgICBTdHJva2VXZWlnaHQ7Ci0gICAgRlRfQ2hhciAgICBXaWR0aFR5cGU7Ci0gICAgRlRfQnl0ZSAgICBTZXJpZlN0eWxlOwotICAgIEZUX0J5dGUgICAgUmVzZXJ2ZWQ7Ci0KLSAgfSBUVF9QQ0xUOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfTWF4UHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG1heGltdW0gcHJvZmlsZSBpcyBhIHRhYmxlIGNvbnRhaW5pbmcgbWFueSBtYXggdmFsdWVzLCB3aGljaCAgICovCi0gIC8qICAgIGNhbiBiZSB1c2VkIHRvIHByZS1hbGxvY2F0ZSBhcnJheXMuICBUaGlzIGVuc3VyZXMgdGhhdCBubyBtZW1vcnkgICAqLwotICAvKiAgICBhbGxvY2F0aW9uIG9jY3VycyBkdXJpbmcgYSBnbHlwaCBsb2FkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2ZXJzaW9uICAgICAgICAgICAgICAgOjogVGhlIHZlcnNpb24gbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bUdseXBocyAgICAgICAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGdseXBocyBpbiB0aGlzIFRydWVUeXBlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heFBvaW50cyAgICAgICAgICAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcG9pbnRzIGluIGEgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uLWNvbXBvc2l0ZSBUcnVlVHlwZSBnbHlwaC4gIFNlZSBhbHNvICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJ1Y3R1cmUgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgbWF4Q29tcG9zaXRlUG9pbnRzJy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4Q29udG91cnMgICAgICAgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb250b3VycyBpbiBhICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub24tY29tcG9zaXRlIFRydWVUeXBlIGdseXBoLiAgU2VlIGFsc28gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0cnVjdHVyZSBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBtYXhDb21wb3NpdGVDb250b3VycycuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhDb21wb3NpdGVQb2ludHMgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBvaW50cyBpbiBhICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSBUcnVlVHlwZSBnbHlwaC4gIFNlZSBhbHNvIHRoZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgZWxlbWVudCBgbWF4UG9pbnRzJy4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4Q29tcG9zaXRlQ29udG91cnMgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb250b3VycyBpbiBhICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUgVHJ1ZVR5cGUgZ2x5cGguICBTZWUgYWxzbyB0aGUgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlIGVsZW1lbnQgYG1heENvbnRvdXJzJy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heFpvbmVzICAgICAgICAgICAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygem9uZXMgdXNlZCBmb3IgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGggaGludGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heFR3aWxpZ2h0UG9pbnRzICAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcG9pbnRzIGluIHRoZSAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdpbGlnaHQgem9uZSB1c2VkIGZvciBnbHlwaCBoaW50aW5nLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heFN0b3JhZ2UgICAgICAgICAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZSBhcmVhIHVzZWQgZm9yIGdseXBoIGhpbnRpbmcuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heEZ1bmN0aW9uRGVmcyAgICAgICA6OiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZnVuY3Rpb24gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbnMgaW4gdGhlIFRydWVUeXBlIGJ5dGVjb2RlIGZvciAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhJbnN0cnVjdGlvbkRlZnMgICAgOjogVGhlIG1heGltdW0gbnVtYmVyIG9mIGluc3RydWN0aW9uICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25zIGluIHRoZSBUcnVlVHlwZSBieXRlY29kZSBmb3IgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4U3RhY2tFbGVtZW50cyAgICAgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBzdGFjayBlbGVtZW50cyB1c2VkICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJpbmcgYnl0ZWNvZGUgaW50ZXJwcmV0YXRpb24uICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBUcnVlVHlwZSBvcGNvZGVzICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIGZvciBnbHlwaCBoaW50aW5nLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4Q29tcG9uZW50RWxlbWVudHMgIDo6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBzaW1wbGUgKGkuZS4sIG5vbi0gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGUpIGdseXBocyBpbiBhIGNvbXBvc2l0ZSBnbHlwaC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4Q29tcG9uZW50RGVwdGggICAgIDo6IFRoZSBtYXhpbXVtIG5lc3RpbmcgZGVwdGggb2YgY29tcG9zaXRlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgc3RydWN0dXJlIGlzIG9ubHkgdXNlZCBkdXJpbmcgZm9udCBsb2FkaW5nLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX01heFByb2ZpbGVfCi0gIHsKLSAgICBGVF9GaXhlZCAgIHZlcnNpb247Ci0gICAgRlRfVVNob3J0ICBudW1HbHlwaHM7Ci0gICAgRlRfVVNob3J0ICBtYXhQb2ludHM7Ci0gICAgRlRfVVNob3J0ICBtYXhDb250b3VyczsKLSAgICBGVF9VU2hvcnQgIG1heENvbXBvc2l0ZVBvaW50czsKLSAgICBGVF9VU2hvcnQgIG1heENvbXBvc2l0ZUNvbnRvdXJzOwotICAgIEZUX1VTaG9ydCAgbWF4Wm9uZXM7Ci0gICAgRlRfVVNob3J0ICBtYXhUd2lsaWdodFBvaW50czsKLSAgICBGVF9VU2hvcnQgIG1heFN0b3JhZ2U7Ci0gICAgRlRfVVNob3J0ICBtYXhGdW5jdGlvbkRlZnM7Ci0gICAgRlRfVVNob3J0ICBtYXhJbnN0cnVjdGlvbkRlZnM7Ci0gICAgRlRfVVNob3J0ICBtYXhTdGFja0VsZW1lbnRzOwotICAgIEZUX1VTaG9ydCAgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zOwotICAgIEZUX1VTaG9ydCAgbWF4Q29tcG9uZW50RWxlbWVudHM7Ci0gICAgRlRfVVNob3J0ICBtYXhDb21wb25lbnREZXB0aDsKLQotICB9IFRUX01heFByb2ZpbGU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxFbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TZm50X1RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBlbnVtZXJhdGlvbiB1c2VkIHRvIHNwZWNpZnkgdGhlIGluZGV4IG9mIGFuIFNGTlQgdGFibGUuICAgICAgICAgKi8KLSAgLyogICAgVXNlZCBpbiB0aGUgQEZUX0dldF9TZm50X1RhYmxlIEFQSSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VmFsdWVzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU0ZOVF9IRUFEIDo6IFRvIGFjY2VzcyB0aGUgZm9udCdzIEBUVF9IZWFkZXIgc3RydWN0dXJlLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TRk5UX01BWFAgOjogVG8gYWNjZXNzIHRoZSBmb250J3MgQFRUX01heFByb2ZpbGUgc3RydWN0dXJlLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NGTlRfT1MyICA6OiBUbyBhY2Nlc3MgdGhlIGZvbnQncyBAVFRfT1MyIHN0cnVjdHVyZS4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU0ZOVF9ISEVBIDo6IFRvIGFjY2VzcyB0aGUgZm9udCdzIEBUVF9Ib3JpSGVhZGVyIHN0cnVjdHVyZS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9TRk5UX1ZIRUEgOjogVG8gYWNjZXNzIHRoZSBmb250J3MgQFRUX1ZlcnRIZWFkZXIgc3RydXR1cmUuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX1NGTlRfUE9TVCA6OiBUbyBhY2Nlc3MgdGhlIGZvbnQncyBAVFRfUG9zdHNjcmlwdCBzdHJ1Y3R1cmUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfU0ZOVF9QQ0xUIDo6IFRvIGFjY2VzcyB0aGUgZm9udCdzIEBUVF9QQ0xUIHN0cnVjdHVyZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIGVudW0gIEZUX1NmbnRfVGFnXwotICB7Ci0gICAgRlRfU0ZOVF9IRUFELAotICAgIEZUX1NGTlRfTUFYUCwKLSAgICBGVF9TRk5UX09TMiwKLSAgICBGVF9TRk5UX0hIRUEsCi0gICAgRlRfU0ZOVF9WSEVBLAotICAgIEZUX1NGTlRfUE9TVCwKLSAgICBGVF9TRk5UX1BDTFQsCi0KLSAgICBGVF9TRk5UX01BWAotCi0gIH0gRlRfU2ZudF9UYWc7Ci0KLSAgLyogdGhlc2UgY29uc3RhbnRzIGFyZSBkZXByZWNhdGVkOyB1c2UgdGhlIGNvcnJlc3BvbmRpbmcgYEZUX1NmbnRfVGFnJyAqLwotICAvKiB2YWx1ZXMgaW5zdGVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIGZ0X3NmbnRfaGVhZCAgRlRfU0ZOVF9IRUFECi0jZGVmaW5lIGZ0X3NmbnRfbWF4cCAgRlRfU0ZOVF9NQVhQCi0jZGVmaW5lIGZ0X3NmbnRfb3MyICAgRlRfU0ZOVF9PUzIKLSNkZWZpbmUgZnRfc2ZudF9oaGVhICBGVF9TRk5UX0hIRUEKLSNkZWZpbmUgZnRfc2ZudF92aGVhICBGVF9TRk5UX1ZIRUEKLSNkZWZpbmUgZnRfc2ZudF9wb3N0ICBGVF9TRk5UX1BPU1QKLSNkZWZpbmUgZnRfc2ZudF9wY2x0ICBGVF9TRk5UX1BDTFQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9TZm50X1RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiBhIHBvaW50ZXIgdG8gYSBnaXZlbiBTRk5UIHRhYmxlIHdpdGhpbiBhIGZhY2UuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFnICA6OiBUaGUgaW5kZXggb2YgdGhlIFNGTlQgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSB0eXBlLWxlc3MgcG9pbnRlciB0byB0aGUgdGFibGUuICBUaGlzIHdpbGwgYmV+MCBpbiBjYXNlIG9mICAgICAgICovCi0gIC8qICAgIGVycm9yLCBvciBpZiB0aGUgY29ycmVzcG9uZGluZyB0YWJsZSB3YXMgbm90IGZvdW5kICpPUiogbG9hZGVkICAgICAqLwotICAvKiAgICBmcm9tIHRoZSBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVzZSBhIHR5cGVjYXN0IGFjY29yZGluZyB0byBgdGFnJyB0byBhY2Nlc3MgdGhlIHN0cnVjdHVyZSAgICAgICAgICAqLwotICAvKiAgICBlbGVtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgdGFibGUgaXMgb3duZWQgYnkgdGhlIGZhY2Ugb2JqZWN0IGFuZCBkaXNhcHBlYXJzIHdpdGggaXQuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VmdWwgdG8gYWNjZXNzIFNGTlQgdGFibGVzIHRoYXQgYXJlIGxvYWRlZCAqLwotICAvKiAgICBieSB0aGUgc2ZudCwgdHJ1ZXR5cGUsIGFuZCBvcGVudHlwZSBkcml2ZXJzLiAgU2VlIEBGVF9TZm50X1RhZyBmb3IgKi8KLSAgLyogICAgYSBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBIZXJlIGFuIGV4YW1wbGUgaG93IHRvIGFjY2VzcyB0aGUgYHZoZWEnIHRhYmxlOiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRUX1ZlcnRIZWFkZXIqICB2ZXJ0X2hlYWRlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIHZlcnRfaGVhZGVyID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgIChUVF9WZXJ0SGVhZGVyKilGVF9HZXRfU2ZudF9UYWJsZSggZmFjZSwgRlRfU0ZOVF9WSEVBICk7ICAgICAgICovCi0gIC8qICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCB2b2lkKiApCi0gIEZUX0dldF9TZm50X1RhYmxlKCBGVF9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1NmbnRfVGFnICB0YWcgKTsKLQotCi0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICoKLSAgKiBAZnVuY3Rpb246Ci0gICogICBGVF9Mb2FkX1NmbnRfVGFibGUKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgIExvYWQgYW55IGZvbnQgdGFibGUgaW50byBjbGllbnQgbWVtb3J5LgotICAqCi0gICogQGlucHV0OgotICAqICAgZmFjZSA6OgotICAqICAgICBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2UuCi0gICoKLSAgKiAgIHRhZyA6OgotICAqICAgICBUaGUgZm91ci1ieXRlIHRhZyBvZiB0aGUgdGFibGUgdG8gbG9hZC4gIFVzZSB0aGUgdmFsdWV+MCBpZiB5b3Ugd2FudAotICAqICAgICB0byBhY2Nlc3MgdGhlIHdob2xlIGZvbnQgZmlsZS4gIE90aGVyd2lzZSwgeW91IGNhbiB1c2Ugb25lIG9mIHRoZQotICAqICAgICBkZWZpbml0aW9ucyBmb3VuZCBpbiB0aGUgQEZUX1RSVUVUWVBFX1RBR1NfSCBmaWxlLCBvciBmb3JnZSBhIG5ldwotICAqICAgICBvbmUgd2l0aCBARlRfTUFLRV9UQUcuCi0gICoKLSAgKiAgIG9mZnNldCA6OgotICAqICAgICBUaGUgc3RhcnRpbmcgb2Zmc2V0IGluIHRoZSB0YWJsZSAob3IgZmlsZSBpZiB0YWcgPT0gMCkuCi0gICoKLSAgKiBAb3V0cHV0OgotICAqICAgYnVmZmVyIDo6Ci0gICogICAgIFRoZSB0YXJnZXQgYnVmZmVyIGFkZHJlc3MuICBUaGUgY2xpZW50IG11c3QgZW5zdXJlIHRoYXQgdGhlIG1lbW9yeQotICAqICAgICBhcnJheSBpcyBiaWcgZW5vdWdoIHRvIGhvbGQgdGhlIGRhdGEuCi0gICoKLSAgKiBAaW5vdXQ6Ci0gICogICBsZW5ndGggOjoKLSAgKiAgICAgSWYgdGhlIGBsZW5ndGgnIHBhcmFtZXRlciBpcyBOVUxMLCB0aGVuIHRyeSB0byBsb2FkIHRoZSB3aG9sZSB0YWJsZS4KLSAgKiAgICAgUmV0dXJuIGFuIGVycm9yIGNvZGUgaWYgaXQgZmFpbHMuCi0gICoKLSAgKiAgICAgRWxzZSwgaWYgYCpsZW5ndGgnIGlzfjAsIGV4aXQgaW1tZWRpYXRlbHkgd2hpbGUgcmV0dXJuaW5nIHRoZQotICAqICAgICB0YWJsZSdzIChvciBmaWxlKSBmdWxsIHNpemUgaW4gaXQuCi0gICoKLSAgKiAgICAgRWxzZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUgdGFibGUgb3IgZmlsZSwgZnJvbSB0aGUKLSAgKiAgICAgc3RhcnRpbmcgb2Zmc2V0LgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIElmIHlvdSBuZWVkIHRvIGRldGVybWluZSB0aGUgdGFibGUncyBsZW5ndGggeW91IHNob3VsZCBmaXJzdCBjYWxsIHRoaXMKLSAgKiAgIGZ1bmN0aW9uIHdpdGggYCpsZW5ndGgnIHNldCB0b34wLCBhcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6Ci0gICoKLSAgKiAgICAgewotICAqICAgICAgIEZUX1VMb25nICBsZW5ndGggPSAwOwotICAqCi0gICoKLSAgKiAgICAgICBlcnJvciA9IEZUX0xvYWRfU2ZudF9UYWJsZSggZmFjZSwgdGFnLCAwLCBOVUxMLCAmbGVuZ3RoICk7Ci0gICogICAgICAgaWYgKCBlcnJvciApIHsgLi4uIHRhYmxlIGRvZXMgbm90IGV4aXN0IC4uLiB9Ci0gICoKLSAgKiAgICAgICBidWZmZXIgPSBtYWxsb2MoIGxlbmd0aCApOwotICAqICAgICAgIGlmICggYnVmZmVyID09IE5VTEwgKSB7IC4uLiBub3QgZW5vdWdoIG1lbW9yeSAuLi4gfQotICAqCi0gICogICAgICAgZXJyb3IgPSBGVF9Mb2FkX1NmbnRfVGFibGUoIGZhY2UsIHRhZywgMCwgYnVmZmVyLCAmbGVuZ3RoICk7Ci0gICogICAgICAgaWYgKCBlcnJvciApIHsgLi4uIGNvdWxkIG5vdCBsb2FkIHRhYmxlIC4uLiB9Ci0gICogICAgIH0KLSAgKgotICAqICAgTm90ZSB0aGF0IHN0cnVjdHVyZXMgbGlrZSBAVFRfSGVhZGVyIG9yIEBUVF9PUzIgY2FuJ3QgYmUgdXNlZCB3aXRoCi0gICogICB0aGlzIGZ1bmN0aW9uOyB0aGV5IGFyZSBsaW1pdGVkIHRvIEBGVF9HZXRfU2ZudF9UYWJsZS4gIFJlYXNvbiBpcyB0aGF0Ci0gICogICB0aG9zZSBzdHJ1Y3R1cmVzIGRlcGVuZCBvbiB0aGUgcHJvY2Vzc29yIGFyY2hpdGVjdHVyZSwgd2l0aCB2YXJ5aW5nCi0gICogICBzaXplIChlLmcuIDMyYml0IHZzLiA2NGJpdCkgb3Igb3JkZXIgKGJpZyBlbmRpYW4gdnMuIGxpdHRsZSBlbmRpYW4pLgotICAqCi0gICovCi0gIEZUX0VYUE9SVCggRlRfRXJyb3IgKQotICBGVF9Mb2FkX1NmbnRfVGFibGUoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHRhZywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIGxlbmd0aCApOwotCi0KLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBmdW5jdGlvbjoKLSAgKiAgIEZUX1NmbnRfVGFibGVfSW5mbwotICAqCi0gICogQGRlc2NyaXB0aW9uOgotICAqICAgUmV0dXJuIGluZm9ybWF0aW9uIG9uIGFuIFNGTlQgdGFibGUuCi0gICoKLSAgKiBAaW5wdXQ6Ci0gICogICBmYWNlIDo6Ci0gICogICAgIEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZS4KLSAgKgotICAqICAgdGFibGVfaW5kZXggOjoKLSAgKiAgICAgVGhlIGluZGV4IG9mIGFuIFNGTlQgdGFibGUuICBUaGUgZnVuY3Rpb24gcmV0dXJucwotICAqICAgICBGVF9FcnJfVGFibGVfTWlzc2luZyBmb3IgYW4gaW52YWxpZCB2YWx1ZS4KLSAgKgotICAqIEBpbm91dDoKLSAgKiAgIHRhZyA6OgotICAqICAgICBUaGUgbmFtZSB0YWcgb2YgdGhlIFNGTlQgdGFibGUuICBJZiB0aGUgdmFsdWUgaXMgTlVMTCwgYHRhYmxlX2luZGV4JwotICAqICAgICBpcyBpZ25vcmVkLCBhbmQgYGxlbmd0aCcgcmV0dXJucyB0aGUgbnVtYmVyIG9mIFNGTlQgdGFibGVzIGluIHRoZQotICAqICAgICBmb250LgotICAqCi0gICogQG91dHB1dDoKLSAgKiAgIGxlbmd0aCA6OgotICAqICAgICBUaGUgbGVuZ3RoIG9mIHRoZSBTRk5UIHRhYmxlIChvciB0aGUgbnVtYmVyIG9mIFNGTlQgdGFibGVzLCBkZXBlbmRpbmcKLSAgKiAgICAgb24gYHRhZycpLgotICAqCi0gICogQHJldHVybjoKLSAgKiAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwfm1lYW5zIHN1Y2Nlc3MuCi0gICoKLSAgKiBAbm90ZToKLSAgKiAgIFdoaWxlIHBhcnNpbmcgZm9udHMsIEZyZWVUeXBlIGhhbmRsZXMgU0ZOVCB0YWJsZXMgd2l0aCBsZW5ndGggemVybyBhcwotICAqICAgbWlzc2luZy4KLSAgKgotICAqLwotICBGVF9FWFBPUlQoIEZUX0Vycm9yICkKLSAgRlRfU2ZudF9UYWJsZV9JbmZvKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICB0YWJsZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgKnRhZywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgKmxlbmd0aCApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfR2V0X0NNYXBfTGFuZ3VhZ2VfSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUmV0dXJuIFRydWVUeXBlL3NmbnQgc3BlY2lmaWMgY21hcCBsYW5ndWFnZSBJRC4gIERlZmluaXRpb25zIG9mICAgICovCi0gIC8qICAgIGxhbmd1YWdlIElEIHZhbHVlcyBhcmUgaW4gYHR0bmFtZWlkLmgnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJtYXAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSB0YXJnZXQgY2hhcm1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbGFuZ3VhZ2UgSUQgb2YgYGNoYXJtYXAnLiAgSWYgYGNoYXJtYXAnIGRvZXNuJ3QgYmVsb25nIHRvIGEgICAgKi8KLSAgLyogICAgVHJ1ZVR5cGUvc2ZudCBmYWNlLCBqdXN0IHJldHVybn4wIGFzIHRoZSBkZWZhdWx0IHZhbHVlLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGb3IgYSBmb3JtYXR+MTQgY21hcCAodG8gYWNjZXNzIFVuaWNvZGUgSVZTKSwgdGhlIHJldHVybiB2YWx1ZSBpcyAgKi8KLSAgLyogICAgMHhGRkZGRkZGRi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX1VMb25nICkKLSAgRlRfR2V0X0NNYXBfTGFuZ3VhZ2VfSUQoIEZUX0NoYXJNYXAgIGNoYXJtYXAgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZUX0dldF9DTWFwX0Zvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiBUcnVlVHlwZS9zZm50IHNwZWNpZmljIGNtYXAgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNoYXJtYXAgOjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIFRoZSB0YXJnZXQgY2hhcm1hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZm9ybWF0IG9mIGBjaGFybWFwJy4gIElmIGBjaGFybWFwJyBkb2Vzbid0IGJlbG9uZyB0byBhICAgICAgICAgKi8KLSAgLyogICAgVHJ1ZVR5cGUvc2ZudCBmYWNlLCByZXR1cm4gLTEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9FWFBPUlQoIEZUX0xvbmcgKQotICBGVF9HZXRfQ01hcF9Gb3JtYXQoIEZUX0NoYXJNYXAgIGNoYXJtYXAgKTsKLQotICAvKiAqLwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fVFRUQUJMRVNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL3R0dGFncy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS90dHRhZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgzNmM3Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL3R0dGFncy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0dGFncy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUYWdzIGZvciBUcnVlVHlwZSBhbmQgT3BlblR5cGUgdGFibGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1RUQUdTX0hfXwotI2RlZmluZSBfX1RUQUdTX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0jaWZkZWYgRlJFRVRZUEVfSAotI2Vycm9yICJmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDEgaGFzIGJlZW4gbG9hZGVkISIKLSNlcnJvciAiUGxlYXNlIGZpeCB0aGUgZGlyZWN0b3J5IHNlYXJjaCBvcmRlciBmb3IgaGVhZGVyIGZpbGVzIgotI2Vycm9yICJzbyB0aGF0IGZyZWV0eXBlLmggb2YgRnJlZVR5cGUgMiBpcyBmb3VuZCBmaXJzdC4iCi0jZW5kaWYKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0jZGVmaW5lIFRUQUdfYXZhciAgRlRfTUFLRV9UQUcoICdhJywgJ3YnLCAnYScsICdyJyApCi0jZGVmaW5lIFRUQUdfQkFTRSAgRlRfTUFLRV9UQUcoICdCJywgJ0EnLCAnUycsICdFJyApCi0jZGVmaW5lIFRUQUdfYmRhdCAgRlRfTUFLRV9UQUcoICdiJywgJ2QnLCAnYScsICd0JyApCi0jZGVmaW5lIFRUQUdfQkRGICAgRlRfTUFLRV9UQUcoICdCJywgJ0QnLCAnRicsICcgJyApCi0jZGVmaW5lIFRUQUdfYmhlZCAgRlRfTUFLRV9UQUcoICdiJywgJ2gnLCAnZScsICdkJyApCi0jZGVmaW5lIFRUQUdfYmxvYyAgRlRfTUFLRV9UQUcoICdiJywgJ2wnLCAnbycsICdjJyApCi0jZGVmaW5lIFRUQUdfYnNsbiAgRlRfTUFLRV9UQUcoICdiJywgJ3MnLCAnbCcsICduJyApCi0jZGVmaW5lIFRUQUdfQ0JEVCAgRlRfTUFLRV9UQUcoICdDJywgJ0InLCAnRCcsICdUJyApCi0jZGVmaW5lIFRUQUdfQ0JMQyAgRlRfTUFLRV9UQUcoICdDJywgJ0InLCAnTCcsICdDJyApCi0jZGVmaW5lIFRUQUdfQ0ZGICAgRlRfTUFLRV9UQUcoICdDJywgJ0YnLCAnRicsICcgJyApCi0jZGVmaW5lIFRUQUdfQ0lEICAgRlRfTUFLRV9UQUcoICdDJywgJ0knLCAnRCcsICcgJyApCi0jZGVmaW5lIFRUQUdfY21hcCAgRlRfTUFLRV9UQUcoICdjJywgJ20nLCAnYScsICdwJyApCi0jZGVmaW5lIFRUQUdfY3ZhciAgRlRfTUFLRV9UQUcoICdjJywgJ3YnLCAnYScsICdyJyApCi0jZGVmaW5lIFRUQUdfY3Z0ICAgRlRfTUFLRV9UQUcoICdjJywgJ3YnLCAndCcsICcgJyApCi0jZGVmaW5lIFRUQUdfRFNJRyAgRlRfTUFLRV9UQUcoICdEJywgJ1MnLCAnSScsICdHJyApCi0jZGVmaW5lIFRUQUdfRUJEVCAgRlRfTUFLRV9UQUcoICdFJywgJ0InLCAnRCcsICdUJyApCi0jZGVmaW5lIFRUQUdfRUJMQyAgRlRfTUFLRV9UQUcoICdFJywgJ0InLCAnTCcsICdDJyApCi0jZGVmaW5lIFRUQUdfRUJTQyAgRlRfTUFLRV9UQUcoICdFJywgJ0InLCAnUycsICdDJyApCi0jZGVmaW5lIFRUQUdfZmVhdCAgRlRfTUFLRV9UQUcoICdmJywgJ2UnLCAnYScsICd0JyApCi0jZGVmaW5lIFRUQUdfRk9ORCAgRlRfTUFLRV9UQUcoICdGJywgJ08nLCAnTicsICdEJyApCi0jZGVmaW5lIFRUQUdfZnBnbSAgRlRfTUFLRV9UQUcoICdmJywgJ3AnLCAnZycsICdtJyApCi0jZGVmaW5lIFRUQUdfZnZhciAgRlRfTUFLRV9UQUcoICdmJywgJ3YnLCAnYScsICdyJyApCi0jZGVmaW5lIFRUQUdfZ2FzcCAgRlRfTUFLRV9UQUcoICdnJywgJ2EnLCAncycsICdwJyApCi0jZGVmaW5lIFRUQUdfR0RFRiAgRlRfTUFLRV9UQUcoICdHJywgJ0QnLCAnRScsICdGJyApCi0jZGVmaW5lIFRUQUdfZ2x5ZiAgRlRfTUFLRV9UQUcoICdnJywgJ2wnLCAneScsICdmJyApCi0jZGVmaW5lIFRUQUdfR1BPUyAgRlRfTUFLRV9UQUcoICdHJywgJ1AnLCAnTycsICdTJyApCi0jZGVmaW5lIFRUQUdfR1NVQiAgRlRfTUFLRV9UQUcoICdHJywgJ1MnLCAnVScsICdCJyApCi0jZGVmaW5lIFRUQUdfZ3ZhciAgRlRfTUFLRV9UQUcoICdnJywgJ3YnLCAnYScsICdyJyApCi0jZGVmaW5lIFRUQUdfaGRteCAgRlRfTUFLRV9UQUcoICdoJywgJ2QnLCAnbScsICd4JyApCi0jZGVmaW5lIFRUQUdfaGVhZCAgRlRfTUFLRV9UQUcoICdoJywgJ2UnLCAnYScsICdkJyApCi0jZGVmaW5lIFRUQUdfaGhlYSAgRlRfTUFLRV9UQUcoICdoJywgJ2gnLCAnZScsICdhJyApCi0jZGVmaW5lIFRUQUdfaG10eCAgRlRfTUFLRV9UQUcoICdoJywgJ20nLCAndCcsICd4JyApCi0jZGVmaW5lIFRUQUdfSlNURiAgRlRfTUFLRV9UQUcoICdKJywgJ1MnLCAnVCcsICdGJyApCi0jZGVmaW5lIFRUQUdfanVzdCAgRlRfTUFLRV9UQUcoICdqJywgJ3UnLCAncycsICd0JyApCi0jZGVmaW5lIFRUQUdfa2VybiAgRlRfTUFLRV9UQUcoICdrJywgJ2UnLCAncicsICduJyApCi0jZGVmaW5lIFRUQUdfbGNhciAgRlRfTUFLRV9UQUcoICdsJywgJ2MnLCAnYScsICdyJyApCi0jZGVmaW5lIFRUQUdfbG9jYSAgRlRfTUFLRV9UQUcoICdsJywgJ28nLCAnYycsICdhJyApCi0jZGVmaW5lIFRUQUdfTFRTSCAgRlRfTUFLRV9UQUcoICdMJywgJ1QnLCAnUycsICdIJyApCi0jZGVmaW5lIFRUQUdfTFdGTiAgRlRfTUFLRV9UQUcoICdMJywgJ1cnLCAnRicsICdOJyApCi0jZGVmaW5lIFRUQUdfTUFUSCAgRlRfTUFLRV9UQUcoICdNJywgJ0EnLCAnVCcsICdIJyApCi0jZGVmaW5lIFRUQUdfbWF4cCAgRlRfTUFLRV9UQUcoICdtJywgJ2EnLCAneCcsICdwJyApCi0jZGVmaW5lIFRUQUdfTUVUQSAgRlRfTUFLRV9UQUcoICdNJywgJ0UnLCAnVCcsICdBJyApCi0jZGVmaW5lIFRUQUdfTU1GWCAgRlRfTUFLRV9UQUcoICdNJywgJ00nLCAnRicsICdYJyApCi0jZGVmaW5lIFRUQUdfTU1TRCAgRlRfTUFLRV9UQUcoICdNJywgJ00nLCAnUycsICdEJyApCi0jZGVmaW5lIFRUQUdfbW9ydCAgRlRfTUFLRV9UQUcoICdtJywgJ28nLCAncicsICd0JyApCi0jZGVmaW5lIFRUQUdfbW9yeCAgRlRfTUFLRV9UQUcoICdtJywgJ28nLCAncicsICd4JyApCi0jZGVmaW5lIFRUQUdfbmFtZSAgRlRfTUFLRV9UQUcoICduJywgJ2EnLCAnbScsICdlJyApCi0jZGVmaW5lIFRUQUdfb3BiZCAgRlRfTUFLRV9UQUcoICdvJywgJ3AnLCAnYicsICdkJyApCi0jZGVmaW5lIFRUQUdfT1MyICAgRlRfTUFLRV9UQUcoICdPJywgJ1MnLCAnLycsICcyJyApCi0jZGVmaW5lIFRUQUdfT1RUTyAgRlRfTUFLRV9UQUcoICdPJywgJ1QnLCAnVCcsICdPJyApCi0jZGVmaW5lIFRUQUdfUENMVCAgRlRfTUFLRV9UQUcoICdQJywgJ0MnLCAnTCcsICdUJyApCi0jZGVmaW5lIFRUQUdfUE9TVCAgRlRfTUFLRV9UQUcoICdQJywgJ08nLCAnUycsICdUJyApCi0jZGVmaW5lIFRUQUdfcG9zdCAgRlRfTUFLRV9UQUcoICdwJywgJ28nLCAncycsICd0JyApCi0jZGVmaW5lIFRUQUdfcHJlcCAgRlRfTUFLRV9UQUcoICdwJywgJ3InLCAnZScsICdwJyApCi0jZGVmaW5lIFRUQUdfcHJvcCAgRlRfTUFLRV9UQUcoICdwJywgJ3InLCAnbycsICdwJyApCi0jZGVmaW5lIFRUQUdfc2JpeCAgRlRfTUFLRV9UQUcoICdzJywgJ2InLCAnaScsICd4JyApCi0jZGVmaW5lIFRUQUdfc2ZudCAgRlRfTUFLRV9UQUcoICdzJywgJ2YnLCAnbicsICd0JyApCi0jZGVmaW5lIFRUQUdfU0lORyAgRlRfTUFLRV9UQUcoICdTJywgJ0knLCAnTicsICdHJyApCi0jZGVmaW5lIFRUQUdfdHJhayAgRlRfTUFLRV9UQUcoICd0JywgJ3InLCAnYScsICdrJyApCi0jZGVmaW5lIFRUQUdfdHJ1ZSAgRlRfTUFLRV9UQUcoICd0JywgJ3InLCAndScsICdlJyApCi0jZGVmaW5lIFRUQUdfdHRjICAgRlRfTUFLRV9UQUcoICd0JywgJ3QnLCAnYycsICcgJyApCi0jZGVmaW5lIFRUQUdfdHRjZiAgRlRfTUFLRV9UQUcoICd0JywgJ3QnLCAnYycsICdmJyApCi0jZGVmaW5lIFRUQUdfVFlQMSAgRlRfTUFLRV9UQUcoICdUJywgJ1knLCAnUCcsICcxJyApCi0jZGVmaW5lIFRUQUdfdHlwMSAgRlRfTUFLRV9UQUcoICd0JywgJ3knLCAncCcsICcxJyApCi0jZGVmaW5lIFRUQUdfVkRNWCAgRlRfTUFLRV9UQUcoICdWJywgJ0QnLCAnTScsICdYJyApCi0jZGVmaW5lIFRUQUdfdmhlYSAgRlRfTUFLRV9UQUcoICd2JywgJ2gnLCAnZScsICdhJyApCi0jZGVmaW5lIFRUQUdfdm10eCAgRlRfTUFLRV9UQUcoICd2JywgJ20nLCAndCcsICd4JyApCi0jZGVmaW5lIFRUQUdfd09GRiAgRlRfTUFLRV9UQUcoICd3JywgJ08nLCAnRicsICdGJyApCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19UVEFHU19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnJlZXR5cGUvdHR1bnBhdC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS90dHVucGF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYTU1NjguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9mcmVldHlwZS90dHVucGF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dHVucGF0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRGVmaW5pdGlvbnMgZm9yIHRoZSB1bnBhdGVudGVkIFRydWVUeXBlIGhpbnRpbmcgc3lzdGVtICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV3JpdHRlbiBieSBHcmFoYW0gQXNoZXIgPGdyYWhhbS5hc2hlckBidGludGVybmV0LmNvbT4gICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1RUVU5QQVRfSF9fCi0jZGVmaW5lIF9fVFRVTlBBVF9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLQotI2lmZGVmIEZSRUVUWVBFX0gKLSNlcnJvciAiZnJlZXR5cGUuaCBvZiBGcmVlVHlwZSAxIGhhcyBiZWVuIGxvYWRlZCEiCi0jZXJyb3IgIlBsZWFzZSBmaXggdGhlIGRpcmVjdG9yeSBzZWFyY2ggb3JkZXIgZm9yIGhlYWRlciBmaWxlcyIKLSNlcnJvciAic28gdGhhdCBmcmVldHlwZS5oIG9mIEZyZWVUeXBlIDIgaXMgZm91bmQgZmlyc3QuIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgKgotICAqIEBjb25zdGFudDoKLSAgKiAgIEZUX1BBUkFNX1RBR19VTlBBVEVOVEVEX0hJTlRJTkcKLSAgKgotICAqIEBkZXNjcmlwdGlvbjoKLSAgKiAgIEEgY29uc3RhbnQgdXNlZCBhcyB0aGUgdGFnIG9mIGFuIEBGVF9QYXJhbWV0ZXIgc3RydWN0dXJlIHRvIGluZGljYXRlCi0gICogICB0aGF0IHVucGF0ZW50ZWQgbWV0aG9kcyBvbmx5IHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBUcnVlVHlwZSBieXRlY29kZQotICAqICAgaW50ZXJwcmV0ZXIgZm9yIGEgdHlwZWZhY2Ugb3BlbmVkIGJ5IEBGVF9PcGVuX0ZhY2UuCi0gICoKLSAgKi8KLSNkZWZpbmUgRlRfUEFSQU1fVEFHX1VOUEFURU5URURfSElOVElORyAgRlRfTUFLRV9UQUcoICd1JywgJ24nLCAncCcsICdhJyApCi0KLSAgLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIF9fVFRVTlBBVF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnQyYnVpbGQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUvZnQyYnVpbGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE5YjgwYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2Z0MmJ1aWxkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdDJidWlsZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgMiBidWlsZCBhbmQgc2V0dXAgbWFjcm9zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGlzIHRoZSBgZW50cnkgcG9pbnQnIGZvciBGcmVlVHlwZSBoZWFkZXIgZmlsZSBpbmNsdXNpb25zLiAgSXQgaXMgKi8KLSAgLyogdGhlIG9ubHkgaGVhZGVyIGZpbGUgd2hpY2ggc2hvdWxkIGJlIGluY2x1ZGVkIGRpcmVjdGx5OyBhbGwgb3RoZXIgICAgICovCi0gIC8qIEZyZWVUeXBlIGhlYWRlciBmaWxlcyBzaG91bGQgYmUgYWNjZXNzZWQgd2l0aCBtYWNybyBuYW1lcyAoYWZ0ZXIgICAgICAqLwotICAvKiBpbmNsdWRpbmcgYGZ0MmJ1aWxkLmgnKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEEgdHlwaWNhbCBleGFtcGxlIGlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAjaW5jbHVkZSA8ZnQyYnVpbGQuaD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgI2luY2x1ZGUgRlRfRlJFRVRZUEVfSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUMkJVSUxEX0hfXwotI2RlZmluZSBfX0ZUMkJVSUxEX0hfXwotCi0jaW5jbHVkZSA8ZnJlZXR5cGUvY29uZmlnL2Z0aGVhZGVyLmg+Ci0KLSNlbmRpZiAvKiBfX0ZUMkJVSUxEX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9wc3RhYmxlcy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvaW5jbHVkZS9wc3RhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMmI3MTcKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL3BzdGFibGVzLmgKQEAgLTAsMCArMSw0MjM4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwc3RhYmxlcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgUG9zdFNjcmlwdCBnbHlwaCBuYW1lcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29weXJpZ2h0IDIwMDUtMjAxNyBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLworLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KKy8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCisvKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLworLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyAgLyogVGhpcyBmaWxlIGhhcyBiZWVuIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IC0tIGRvIG5vdCBlZGl0ISAqLworCisKKyNpZm5kZWYgIERFRklORV9QU19UQUJMRVNfREFUQQorI2lmZGVmICBfX2NwbHVzcGx1cworICBleHRlcm4gIkMiCisjZWxzZQorICBleHRlcm4KKyNlbmRpZgorI2VuZGlmCisgIGNvbnN0IGNoYXIgIGZ0X3N0YW5kYXJkX2dseXBoX25hbWVzWzM2OTZdCisjaWZkZWYgIERFRklORV9QU19UQUJMRVNfREFUQQorICA9CisgIHsKKyAgICAnLicsJ24nLCd1JywnbCcsJ2wnLCAwLAorICAgICduJywnbycsJ24nLCdtJywnYScsJ3InLCdrJywnaScsJ24nLCdnJywncicsJ2UnLCd0JywndScsJ3InLCduJywgMCwKKyAgICAnbicsJ28nLCd0JywnZScsJ3EnLCd1JywnYScsJ2wnLCAwLAorICAgICdpJywnbicsJ2YnLCdpJywnbicsJ2knLCd0JywneScsIDAsCisgICAgJ2wnLCdlJywncycsJ3MnLCdlJywncScsJ3UnLCdhJywnbCcsIDAsCisgICAgJ2cnLCdyJywnZScsJ2EnLCd0JywnZScsJ3InLCdlJywncScsJ3UnLCdhJywnbCcsIDAsCisgICAgJ3AnLCdhJywncicsJ3QnLCdpJywnYScsJ2wnLCdkJywnaScsJ2YnLCdmJywgMCwKKyAgICAncycsJ3UnLCdtJywnbScsJ2EnLCd0JywnaScsJ28nLCduJywgMCwKKyAgICAncCcsJ3InLCdvJywnZCcsJ3UnLCdjJywndCcsIDAsCisgICAgJ3AnLCdpJywgMCwKKyAgICAnaScsJ24nLCd0JywnZScsJ2cnLCdyJywnYScsJ2wnLCAwLAorICAgICdPJywnbScsJ2UnLCdnJywnYScsIDAsCisgICAgJ3InLCdhJywnZCcsJ2knLCdjJywnYScsJ2wnLCAwLAorICAgICdhJywncCcsJ3AnLCdyJywnbycsJ3gnLCdlJywncScsJ3UnLCdhJywnbCcsIDAsCisgICAgJ0QnLCdlJywnbCcsJ3QnLCdhJywgMCwKKyAgICAnbicsJ28nLCduJywnYicsJ3InLCdlJywnYScsJ2snLCdpJywnbicsJ2cnLCdzJywncCcsJ2EnLCdjJywnZScsIDAsCisgICAgJ2wnLCdvJywneicsJ2UnLCduJywnZycsJ2UnLCAwLAorICAgICdhJywncCcsJ3AnLCdsJywnZScsIDAsCisgICAgJ2YnLCdyJywnYScsJ24nLCdjJywgMCwKKyAgICAnRycsJ2InLCdyJywnZScsJ3YnLCdlJywgMCwKKyAgICAnZycsJ2InLCdyJywnZScsJ3YnLCdlJywgMCwKKyAgICAnSScsJ2QnLCdvJywndCcsJ2EnLCdjJywnYycsJ2UnLCduJywndCcsIDAsCisgICAgJ1MnLCdjJywnZScsJ2QnLCdpJywnbCcsJ2wnLCdhJywgMCwKKyAgICAncycsJ2MnLCdlJywnZCcsJ2knLCdsJywnbCcsJ2EnLCAwLAorICAgICdDJywnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAorICAgICdjJywnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAorICAgICdDJywnYycsJ2EnLCdyJywnbycsJ24nLCAwLAorICAgICdjJywnYycsJ2EnLCdyJywnbycsJ24nLCAwLAorICAgICdkJywnYycsJ3InLCdvJywnYScsJ3QnLCAwLAorICAgICcuJywnbicsJ28nLCd0JywnZCcsJ2UnLCdmJywgMCwKKyAgICAncycsJ3AnLCdhJywnYycsJ2UnLCAwLAorICAgICdlJywneCcsJ2MnLCdsJywnYScsJ20nLCAwLAorICAgICdxJywndScsJ28nLCd0JywnZScsJ2QnLCdiJywnbCcsIDAsCisgICAgJ24nLCd1JywnbScsJ2InLCdlJywncicsJ3MnLCdpJywnZycsJ24nLCAwLAorICAgICdkJywnbycsJ2wnLCdsJywnYScsJ3InLCAwLAorICAgICdwJywnZScsJ3InLCdjJywnZScsJ24nLCd0JywgMCwKKyAgICAnYScsJ20nLCdwJywnZScsJ3InLCdzJywnYScsJ24nLCdkJywgMCwKKyAgICAncScsJ3UnLCdvJywndCcsJ2UnLCdyJywnaScsJ2cnLCdoJywndCcsIDAsCisgICAgJ3AnLCdhJywncicsJ2UnLCduJywnbCcsJ2UnLCdmJywndCcsIDAsCisgICAgJ3AnLCdhJywncicsJ2UnLCduJywncicsJ2knLCdnJywnaCcsJ3QnLCAwLAorICAgICdhJywncycsJ3QnLCdlJywncicsJ2knLCdzJywnaycsIDAsCisgICAgJ3AnLCdsJywndScsJ3MnLCAwLAorICAgICdjJywnbycsJ20nLCdtJywnYScsIDAsCisgICAgJ2gnLCd5JywncCcsJ2gnLCdlJywnbicsIDAsCisgICAgJ3AnLCdlJywncicsJ2knLCdvJywnZCcsIDAsCisgICAgJ3MnLCdsJywnYScsJ3MnLCdoJywgMCwKKyAgICAneicsJ2UnLCdyJywnbycsIDAsCisgICAgJ28nLCduJywnZScsIDAsCisgICAgJ3QnLCd3JywnbycsIDAsCisgICAgJ3QnLCdoJywncicsJ2UnLCdlJywgMCwKKyAgICAnZicsJ28nLCd1JywncicsIDAsCisgICAgJ2YnLCdpJywndicsJ2UnLCAwLAorICAgICdzJywnaScsJ3gnLCAwLAorICAgICdzJywnZScsJ3YnLCdlJywnbicsIDAsCisgICAgJ2UnLCdpJywnZycsJ2gnLCd0JywgMCwKKyAgICAnbicsJ2knLCduJywnZScsIDAsCisgICAgJ2MnLCdvJywnbCcsJ28nLCduJywgMCwKKyAgICAncycsJ2UnLCdtJywnaScsJ2MnLCdvJywnbCcsJ28nLCduJywgMCwKKyAgICAnbCcsJ2UnLCdzJywncycsIDAsCisgICAgJ2UnLCdxJywndScsJ2EnLCdsJywgMCwKKyAgICAnZycsJ3InLCdlJywnYScsJ3QnLCdlJywncicsIDAsCisgICAgJ3EnLCd1JywnZScsJ3MnLCd0JywnaScsJ28nLCduJywgMCwKKyAgICAnYScsJ3QnLCAwLAorICAgICdBJywgMCwKKyAgICAnQicsIDAsCisgICAgJ0MnLCAwLAorICAgICdEJywgMCwKKyAgICAnRScsIDAsCisgICAgJ0YnLCAwLAorICAgICdHJywgMCwKKyAgICAnSCcsIDAsCisgICAgJ0knLCAwLAorICAgICdKJywgMCwKKyAgICAnSycsIDAsCisgICAgJ0wnLCAwLAorICAgICdNJywgMCwKKyAgICAnTicsIDAsCisgICAgJ08nLCAwLAorICAgICdQJywgMCwKKyAgICAnUScsIDAsCisgICAgJ1InLCAwLAorICAgICdTJywgMCwKKyAgICAnVCcsIDAsCisgICAgJ1UnLCAwLAorICAgICdWJywgMCwKKyAgICAnVycsIDAsCisgICAgJ1gnLCAwLAorICAgICdZJywgMCwKKyAgICAnWicsIDAsCisgICAgJ2InLCdyJywnYScsJ2MnLCdrJywnZScsJ3QnLCdsJywnZScsJ2YnLCd0JywgMCwKKyAgICAnYicsJ2EnLCdjJywnaycsJ3MnLCdsJywnYScsJ3MnLCdoJywgMCwKKyAgICAnYicsJ3InLCdhJywnYycsJ2snLCdlJywndCcsJ3InLCdpJywnZycsJ2gnLCd0JywgMCwKKyAgICAnYScsJ3MnLCdjJywnaScsJ2knLCdjJywnaScsJ3InLCdjJywndScsJ20nLCAwLAorICAgICd1JywnbicsJ2QnLCdlJywncicsJ3MnLCdjJywnbycsJ3InLCdlJywgMCwKKyAgICAncScsJ3UnLCdvJywndCcsJ2UnLCdsJywnZScsJ2YnLCd0JywgMCwKKyAgICAnYScsIDAsCisgICAgJ2InLCAwLAorICAgICdjJywgMCwKKyAgICAnZCcsIDAsCisgICAgJ2UnLCAwLAorICAgICdmJywgMCwKKyAgICAnZycsIDAsCisgICAgJ2gnLCAwLAorICAgICdpJywgMCwKKyAgICAnaicsIDAsCisgICAgJ2snLCAwLAorICAgICdsJywgMCwKKyAgICAnbScsIDAsCisgICAgJ24nLCAwLAorICAgICdvJywgMCwKKyAgICAncCcsIDAsCisgICAgJ3EnLCAwLAorICAgICdyJywgMCwKKyAgICAncycsIDAsCisgICAgJ3QnLCAwLAorICAgICd1JywgMCwKKyAgICAndicsIDAsCisgICAgJ3cnLCAwLAorICAgICd4JywgMCwKKyAgICAneScsIDAsCisgICAgJ3onLCAwLAorICAgICdiJywncicsJ2EnLCdjJywnZScsJ2wnLCdlJywnZicsJ3QnLCAwLAorICAgICdiJywnYScsJ3InLCAwLAorICAgICdiJywncicsJ2EnLCdjJywnZScsJ3InLCdpJywnZycsJ2gnLCd0JywgMCwKKyAgICAnYScsJ3MnLCdjJywnaScsJ2knLCd0JywnaScsJ2wnLCdkJywnZScsIDAsCisgICAgJ2UnLCd4JywnYycsJ2wnLCdhJywnbScsJ2QnLCdvJywndycsJ24nLCAwLAorICAgICdjJywnZScsJ24nLCd0JywgMCwKKyAgICAncycsJ3QnLCdlJywncicsJ2wnLCdpJywnbicsJ2cnLCAwLAorICAgICdmJywncicsJ2EnLCdjJywndCcsJ2knLCdvJywnbicsIDAsCisgICAgJ3knLCdlJywnbicsIDAsCisgICAgJ2YnLCdsJywnbycsJ3InLCdpJywnbicsIDAsCisgICAgJ3MnLCdlJywnYycsJ3QnLCdpJywnbycsJ24nLCAwLAorICAgICdjJywndScsJ3InLCdyJywnZScsJ24nLCdjJywneScsIDAsCisgICAgJ3EnLCd1JywnbycsJ3QnLCdlJywncycsJ2knLCduJywnZycsJ2wnLCdlJywgMCwKKyAgICAncScsJ3UnLCdvJywndCcsJ2UnLCdkJywnYicsJ2wnLCdsJywnZScsJ2YnLCd0JywgMCwKKyAgICAnZycsJ3UnLCdpJywnbCcsJ2wnLCdlJywnbScsJ28nLCd0JywnbCcsJ2UnLCdmJywndCcsIDAsCisgICAgJ2cnLCd1JywnaScsJ2wnLCdzJywnaScsJ24nLCdnJywnbCcsJ2wnLCdlJywnZicsJ3QnLCAwLAorICAgICdnJywndScsJ2knLCdsJywncycsJ2knLCduJywnZycsJ2wnLCdyJywnaScsJ2cnLCdoJywndCcsIDAsCisgICAgJ2YnLCdpJywgMCwKKyAgICAnZicsJ2wnLCAwLAorICAgICdlJywnbicsJ2QnLCdhJywncycsJ2gnLCAwLAorICAgICdkJywnYScsJ2cnLCdnJywnZScsJ3InLCAwLAorICAgICdkJywnYScsJ2cnLCdnJywnZScsJ3InLCdkJywnYicsJ2wnLCAwLAorICAgICdwJywnZScsJ3InLCdpJywnbycsJ2QnLCdjJywnZScsJ24nLCd0JywnZScsJ3InLCdlJywnZCcsIDAsCisgICAgJ3AnLCdhJywncicsJ2EnLCdnJywncicsJ2EnLCdwJywnaCcsIDAsCisgICAgJ2InLCd1JywnbCcsJ2wnLCdlJywndCcsIDAsCisgICAgJ3EnLCd1JywnbycsJ3QnLCdlJywncycsJ2knLCduJywnZycsJ2wnLCdiJywnYScsJ3MnLCdlJywgMCwKKyAgICAncScsJ3UnLCdvJywndCcsJ2UnLCdkJywnYicsJ2wnLCdiJywnYScsJ3MnLCdlJywgMCwKKyAgICAncScsJ3UnLCdvJywndCcsJ2UnLCdkJywnYicsJ2wnLCdyJywnaScsJ2cnLCdoJywndCcsIDAsCisgICAgJ2cnLCd1JywnaScsJ2wnLCdsJywnZScsJ20nLCdvJywndCcsJ3InLCdpJywnZycsJ2gnLCd0JywgMCwKKyAgICAnZScsJ2wnLCdsJywnaScsJ3AnLCdzJywnaScsJ3MnLCAwLAorICAgICdwJywnZScsJ3InLCd0JywnaCcsJ28nLCd1JywncycsJ2EnLCduJywnZCcsIDAsCisgICAgJ3EnLCd1JywnZScsJ3MnLCd0JywnaScsJ28nLCduJywnZCcsJ28nLCd3JywnbicsIDAsCisgICAgJ2cnLCdyJywnYScsJ3YnLCdlJywgMCwKKyAgICAnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAorICAgICdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywgMCwKKyAgICAndCcsJ2knLCdsJywnZCcsJ2UnLCAwLAorICAgICdtJywnYScsJ2MnLCdyJywnbycsJ24nLCAwLAorICAgICdiJywncicsJ2UnLCd2JywnZScsIDAsCisgICAgJ2QnLCdvJywndCcsJ2EnLCdjJywnYycsJ2UnLCduJywndCcsIDAsCisgICAgJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKKyAgICAncicsJ2knLCduJywnZycsIDAsCisgICAgJ2MnLCdlJywnZCcsJ2knLCdsJywnbCcsJ2EnLCAwLAorICAgICdoJywndScsJ24nLCdnJywnYScsJ3InLCd1JywnbScsJ2wnLCdhJywndScsJ3QnLCAwLAorICAgICdvJywnZycsJ28nLCduJywnZScsJ2snLCAwLAorICAgICdjJywnYScsJ3InLCdvJywnbicsIDAsCisgICAgJ2UnLCdtJywnZCcsJ2EnLCdzJywnaCcsIDAsCisgICAgJ0EnLCdFJywgMCwKKyAgICAnbycsJ3InLCdkJywnZicsJ2UnLCdtJywnaScsJ24nLCdpJywnbicsJ2UnLCAwLAorICAgICdMJywncycsJ2wnLCdhJywncycsJ2gnLCAwLAorICAgICdPJywncycsJ2wnLCdhJywncycsJ2gnLCAwLAorICAgICdPJywnRScsIDAsCisgICAgJ28nLCdyJywnZCcsJ20nLCdhJywncycsJ2MnLCd1JywnbCcsJ2knLCduJywnZScsIDAsCisgICAgJ2EnLCdlJywgMCwKKyAgICAnZCcsJ28nLCd0JywnbCcsJ2UnLCdzJywncycsJ2knLCAwLAorICAgICdsJywncycsJ2wnLCdhJywncycsJ2gnLCAwLAorICAgICdvJywncycsJ2wnLCdhJywncycsJ2gnLCAwLAorICAgICdvJywnZScsIDAsCisgICAgJ2cnLCdlJywncicsJ20nLCdhJywnbicsJ2QnLCdiJywnbCcsJ3MnLCAwLAorICAgICdvJywnbicsJ2UnLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCisgICAgJ2wnLCdvJywnZycsJ2knLCdjJywnYScsJ2wnLCduJywnbycsJ3QnLCAwLAorICAgICdtJywndScsIDAsCisgICAgJ3QnLCdyJywnYScsJ2QnLCdlJywnbScsJ2EnLCdyJywnaycsIDAsCisgICAgJ0UnLCd0JywnaCcsIDAsCisgICAgJ28nLCduJywnZScsJ2gnLCdhJywnbCcsJ2YnLCAwLAorICAgICdwJywnbCcsJ3UnLCdzJywnbScsJ2knLCduJywndScsJ3MnLCAwLAorICAgICdUJywnaCcsJ28nLCdyJywnbicsIDAsCisgICAgJ28nLCduJywnZScsJ3EnLCd1JywnYScsJ3InLCd0JywnZScsJ3InLCAwLAorICAgICdkJywnaScsJ3YnLCdpJywnZCcsJ2UnLCAwLAorICAgICdiJywncicsJ28nLCdrJywnZScsJ24nLCdiJywnYScsJ3InLCAwLAorICAgICdkJywnZScsJ2cnLCdyJywnZScsJ2UnLCAwLAorICAgICd0JywnaCcsJ28nLCdyJywnbicsIDAsCisgICAgJ3QnLCdoJywncicsJ2UnLCdlJywncScsJ3UnLCdhJywncicsJ3QnLCdlJywncicsJ3MnLCAwLAorICAgICd0JywndycsJ28nLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCisgICAgJ3InLCdlJywnZycsJ2knLCdzJywndCcsJ2UnLCdyJywnZScsJ2QnLCAwLAorICAgICdtJywnaScsJ24nLCd1JywncycsIDAsCisgICAgJ2UnLCd0JywnaCcsIDAsCisgICAgJ20nLCd1JywnbCcsJ3QnLCdpJywncCcsJ2wnLCd5JywgMCwKKyAgICAndCcsJ2gnLCdyJywnZScsJ2UnLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCisgICAgJ2MnLCdvJywncCcsJ3knLCdyJywnaScsJ2cnLCdoJywndCcsIDAsCisgICAgJ0EnLCdhJywnYycsJ3UnLCd0JywnZScsIDAsCisgICAgJ0EnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywgMCwKKyAgICAnQScsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKKyAgICAnQScsJ2cnLCdyJywnYScsJ3YnLCdlJywgMCwKKyAgICAnQScsJ3InLCdpJywnbicsJ2cnLCAwLAorICAgICdBJywndCcsJ2knLCdsJywnZCcsJ2UnLCAwLAorICAgICdDJywnYycsJ2UnLCdkJywnaScsJ2wnLCdsJywnYScsIDAsCisgICAgJ0UnLCdhJywnYycsJ3UnLCd0JywnZScsIDAsCisgICAgJ0UnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywgMCwKKyAgICAnRScsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKKyAgICAnRScsJ2cnLCdyJywnYScsJ3YnLCdlJywgMCwKKyAgICAnSScsJ2EnLCdjJywndScsJ3QnLCdlJywgMCwKKyAgICAnSScsJ2MnLCdpJywncicsJ2MnLCd1JywnbScsJ2YnLCdsJywnZScsJ3gnLCAwLAorICAgICdJJywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCAwLAorICAgICdJJywnZycsJ3InLCdhJywndicsJ2UnLCAwLAorICAgICdOJywndCcsJ2knLCdsJywnZCcsJ2UnLCAwLAorICAgICdPJywnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAorICAgICdPJywnYycsJ2knLCdyJywnYycsJ3UnLCdtJywnZicsJ2wnLCdlJywneCcsIDAsCisgICAgJ08nLCdkJywnaScsJ2UnLCdyJywnZScsJ3MnLCdpJywncycsIDAsCisgICAgJ08nLCdnJywncicsJ2EnLCd2JywnZScsIDAsCisgICAgJ08nLCd0JywnaScsJ2wnLCdkJywnZScsIDAsCisgICAgJ1MnLCdjJywnYScsJ3InLCdvJywnbicsIDAsCisgICAgJ1UnLCdhJywnYycsJ3UnLCd0JywnZScsIDAsCisgICAgJ1UnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywgMCwKKyAgICAnVScsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKKyAgICAnVScsJ2cnLCdyJywnYScsJ3YnLCdlJywgMCwKKyAgICAnWScsJ2EnLCdjJywndScsJ3QnLCdlJywgMCwKKyAgICAnWScsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKKyAgICAnWicsJ2MnLCdhJywncicsJ28nLCduJywgMCwKKyAgICAnYScsJ2EnLCdjJywndScsJ3QnLCdlJywgMCwKKyAgICAnYScsJ2MnLCdpJywncicsJ2MnLCd1JywnbScsJ2YnLCdsJywnZScsJ3gnLCAwLAorICAgICdhJywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCAwLAorICAgICdhJywnZycsJ3InLCdhJywndicsJ2UnLCAwLAorICAgICdhJywncicsJ2knLCduJywnZycsIDAsCisgICAgJ2EnLCd0JywnaScsJ2wnLCdkJywnZScsIDAsCisgICAgJ2MnLCdjJywnZScsJ2QnLCdpJywnbCcsJ2wnLCdhJywgMCwKKyAgICAnZScsJ2EnLCdjJywndScsJ3QnLCdlJywgMCwKKyAgICAnZScsJ2MnLCdpJywncicsJ2MnLCd1JywnbScsJ2YnLCdsJywnZScsJ3gnLCAwLAorICAgICdlJywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCAwLAorICAgICdlJywnZycsJ3InLCdhJywndicsJ2UnLCAwLAorICAgICdpJywnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAorICAgICdpJywnYycsJ2knLCdyJywnYycsJ3UnLCdtJywnZicsJ2wnLCdlJywneCcsIDAsCisgICAgJ2knLCdkJywnaScsJ2UnLCdyJywnZScsJ3MnLCdpJywncycsIDAsCisgICAgJ2knLCdnJywncicsJ2EnLCd2JywnZScsIDAsCisgICAgJ24nLCd0JywnaScsJ2wnLCdkJywnZScsIDAsCisgICAgJ28nLCdhJywnYycsJ3UnLCd0JywnZScsIDAsCisgICAgJ28nLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywgMCwKKyAgICAnbycsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKKyAgICAnbycsJ2cnLCdyJywnYScsJ3YnLCdlJywgMCwKKyAgICAnbycsJ3QnLCdpJywnbCcsJ2QnLCdlJywgMCwKKyAgICAncycsJ2MnLCdhJywncicsJ28nLCduJywgMCwKKyAgICAndScsJ2EnLCdjJywndScsJ3QnLCdlJywgMCwKKyAgICAndScsJ2MnLCdpJywncicsJ2MnLCd1JywnbScsJ2YnLCdsJywnZScsJ3gnLCAwLAorICAgICd1JywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCAwLAorICAgICd1JywnZycsJ3InLCdhJywndicsJ2UnLCAwLAorICAgICd5JywnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAorICAgICd5JywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCAwLAorICAgICd6JywnYycsJ2EnLCdyJywnbycsJ24nLCAwLAorICAgICdlJywneCcsJ2MnLCdsJywnYScsJ20nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ0gnLCd1JywnbicsJ2cnLCdhJywncicsJ3UnLCdtJywnbCcsJ2EnLCd1JywndCcsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKKyAgICAnZCcsJ28nLCdsJywnbCcsJ2EnLCdyJywnbycsJ2wnLCdkJywncycsJ3QnLCd5JywnbCcsJ2UnLCAwLAorICAgICdkJywnbycsJ2wnLCdsJywnYScsJ3InLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCisgICAgJ2EnLCdtJywncCcsJ2UnLCdyJywncycsJ2EnLCduJywnZCcsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKKyAgICAnQScsJ2MnLCd1JywndCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ3AnLCdhJywncicsJ2UnLCduJywnbCcsJ2UnLCdmJywndCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAncCcsJ2EnLCdyJywnZScsJ24nLCdyJywnaScsJ2cnLCdoJywndCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAndCcsJ3cnLCdvJywnZCcsJ28nLCd0JywnZScsJ24nLCdsJywnZScsJ2EnLCdkJywnZScsJ3InLCAwLAorICAgICdvJywnbicsJ2UnLCdkJywnbycsJ3QnLCdlJywnbicsJ2wnLCdlJywnYScsJ2QnLCdlJywncicsIDAsCisgICAgJ3onLCdlJywncicsJ28nLCdvJywnbCcsJ2QnLCdzJywndCcsJ3knLCdsJywnZScsIDAsCisgICAgJ28nLCduJywnZScsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKKyAgICAndCcsJ3cnLCdvJywnbycsJ2wnLCdkJywncycsJ3QnLCd5JywnbCcsJ2UnLCAwLAorICAgICd0JywnaCcsJ3InLCdlJywnZScsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKKyAgICAnZicsJ28nLCd1JywncicsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKKyAgICAnZicsJ2knLCd2JywnZScsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKKyAgICAncycsJ2knLCd4JywnbycsJ2wnLCdkJywncycsJ3QnLCd5JywnbCcsJ2UnLCAwLAorICAgICdzJywnZScsJ3YnLCdlJywnbicsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKKyAgICAnZScsJ2knLCdnJywnaCcsJ3QnLCdvJywnbCcsJ2QnLCdzJywndCcsJ3knLCdsJywnZScsIDAsCisgICAgJ24nLCdpJywnbicsJ2UnLCdvJywnbCcsJ2QnLCdzJywndCcsJ3knLCdsJywnZScsIDAsCisgICAgJ2MnLCdvJywnbScsJ20nLCdhJywncycsJ3UnLCdwJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAorICAgICd0JywnaCcsJ3InLCdlJywnZScsJ3EnLCd1JywnYScsJ3InLCd0JywnZScsJ3InLCdzJywnZScsJ20nLCdkJywnYScsJ3MnLCdoJywgMCwKKyAgICAncCcsJ2UnLCdyJywnaScsJ28nLCdkJywncycsJ3UnLCdwJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAorICAgICdxJywndScsJ2UnLCdzJywndCcsJ2knLCdvJywnbicsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKKyAgICAnYScsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAnYicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAnYycsJ2UnLCduJywndCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAnZCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAnZScsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAnaScsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAnbCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAnbScsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAnbicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAnbycsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAncicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAncycsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAndCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAnZicsJ2YnLCAwLAorICAgICdmJywnZicsJ2knLCAwLAorICAgICdmJywnZicsJ2wnLCAwLAorICAgICdwJywnYScsJ3InLCdlJywnbicsJ2wnLCdlJywnZicsJ3QnLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCisgICAgJ3AnLCdhJywncicsJ2UnLCduJywncicsJ2knLCdnJywnaCcsJ3QnLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCisgICAgJ0MnLCdpJywncicsJ2MnLCd1JywnbScsJ2YnLCdsJywnZScsJ3gnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ2gnLCd5JywncCcsJ2gnLCdlJywnbicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAnRycsJ3InLCdhJywndicsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ0EnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ0InLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ0MnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ0QnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ0UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ0YnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ0cnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ0gnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ0knLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ0onLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ0snLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ0wnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ00nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ04nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ08nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ1AnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ1EnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ1InLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ1MnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ1QnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ1UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ1YnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ1cnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ1gnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ1knLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ1onLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ2MnLCdvJywnbCcsJ28nLCduJywnbScsJ28nLCduJywnZScsJ3QnLCdhJywncicsJ3knLCAwLAorICAgICdvJywnbicsJ2UnLCdmJywnaScsJ3QnLCd0JywnZScsJ2QnLCAwLAorICAgICdyJywndScsJ3AnLCdpJywnYScsJ2gnLCAwLAorICAgICdUJywnaScsJ2wnLCdkJywnZScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKKyAgICAnZScsJ3gnLCdjJywnbCcsJ2EnLCdtJywnZCcsJ28nLCd3JywnbicsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKKyAgICAnYycsJ2UnLCduJywndCcsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKKyAgICAnTCcsJ3MnLCdsJywnYScsJ3MnLCdoJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAorICAgICdTJywnYycsJ2EnLCdyJywnbycsJ24nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ1onLCdjJywnYScsJ3InLCdvJywnbicsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKKyAgICAnRCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ0InLCdyJywnZScsJ3YnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAorICAgICdDJywnYScsJ3InLCdvJywnbicsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKKyAgICAnRCcsJ28nLCd0JywnYScsJ2MnLCdjJywnZScsJ24nLCd0JywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAorICAgICdNJywnYScsJ2MnLCdyJywnbycsJ24nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ2YnLCdpJywnZycsJ3UnLCdyJywnZScsJ2QnLCdhJywncycsJ2gnLCAwLAorICAgICdoJywneScsJ3AnLCdoJywnZScsJ24nLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCisgICAgJ08nLCdnJywnbycsJ24nLCdlJywnaycsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKKyAgICAnUicsJ2knLCduJywnZycsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKKyAgICAnQycsJ2UnLCdkJywnaScsJ2wnLCdsJywnYScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKKyAgICAncScsJ3UnLCdlJywncycsJ3QnLCdpJywnbycsJ24nLCdkJywnbycsJ3cnLCduJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAorICAgICdvJywnbicsJ2UnLCdlJywnaScsJ2cnLCdoJywndCcsJ2gnLCAwLAorICAgICd0JywnaCcsJ3InLCdlJywnZScsJ2UnLCdpJywnZycsJ2gnLCd0JywnaCcsJ3MnLCAwLAorICAgICdmJywnaScsJ3YnLCdlJywnZScsJ2knLCdnJywnaCcsJ3QnLCdoJywncycsIDAsCisgICAgJ3MnLCdlJywndicsJ2UnLCduJywnZScsJ2knLCdnJywnaCcsJ3QnLCdoJywncycsIDAsCisgICAgJ28nLCduJywnZScsJ3QnLCdoJywnaScsJ3InLCdkJywgMCwKKyAgICAndCcsJ3cnLCdvJywndCcsJ2gnLCdpJywncicsJ2QnLCdzJywgMCwKKyAgICAneicsJ2UnLCdyJywnbycsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAnZicsJ28nLCd1JywncicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAnZicsJ2knLCd2JywnZScsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAncycsJ2knLCd4JywncycsJ3UnLCdwJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAorICAgICdzJywnZScsJ3YnLCdlJywnbicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAnZScsJ2knLCdnJywnaCcsJ3QnLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCisgICAgJ24nLCdpJywnbicsJ2UnLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCisgICAgJ3onLCdlJywncicsJ28nLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCisgICAgJ28nLCduJywnZScsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAndCcsJ3cnLCdvJywnaScsJ24nLCdmJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAorICAgICd0JywnaCcsJ3InLCdlJywnZScsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAnZicsJ28nLCd1JywncicsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAnZicsJ2knLCd2JywnZScsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAncycsJ2knLCd4JywnaScsJ24nLCdmJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAorICAgICdzJywnZScsJ3YnLCdlJywnbicsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAnZScsJ2knLCdnJywnaCcsJ3QnLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCisgICAgJ24nLCdpJywnbicsJ2UnLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCisgICAgJ2MnLCdlJywnbicsJ3QnLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCisgICAgJ2QnLCdvJywnbCcsJ2wnLCdhJywncicsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAncCcsJ2UnLCdyJywnaScsJ28nLCdkJywnaScsJ24nLCdmJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAorICAgICdjJywnbycsJ20nLCdtJywnYScsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKKyAgICAnQScsJ2cnLCdyJywnYScsJ3YnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAorICAgICdBJywnYScsJ2MnLCd1JywndCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ0EnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAorICAgICdBJywndCcsJ2knLCdsJywnZCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ0EnLCdkJywnaScsJ2UnLCdyJywnZScsJ3MnLCdpJywncycsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKKyAgICAnQScsJ3InLCdpJywnbicsJ2cnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ0EnLCdFJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAorICAgICdDJywnYycsJ2UnLCdkJywnaScsJ2wnLCdsJywnYScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKKyAgICAnRScsJ2cnLCdyJywnYScsJ3YnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAorICAgICdFJywnYScsJ2MnLCd1JywndCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ0UnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAorICAgICdFJywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ0knLCdnJywncicsJ2EnLCd2JywnZScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKKyAgICAnSScsJ2EnLCdjJywndScsJ3QnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAorICAgICdJJywnYycsJ2knLCdyJywnYycsJ3UnLCdtJywnZicsJ2wnLCdlJywneCcsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKKyAgICAnSScsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAorICAgICdFJywndCcsJ2gnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ04nLCd0JywnaScsJ2wnLCdkJywnZScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKKyAgICAnTycsJ2cnLCdyJywnYScsJ3YnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAorICAgICdPJywnYScsJ2MnLCd1JywndCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ08nLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAorICAgICdPJywndCcsJ2knLCdsJywnZCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ08nLCdkJywnaScsJ2UnLCdyJywnZScsJ3MnLCdpJywncycsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKKyAgICAnTycsJ0UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ08nLCdzJywnbCcsJ2EnLCdzJywnaCcsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKKyAgICAnVScsJ2cnLCdyJywnYScsJ3YnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAorICAgICdVJywnYScsJ2MnLCd1JywndCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ1UnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAorICAgICdVJywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ1knLCdhJywnYycsJ3UnLCd0JywnZScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKKyAgICAnVCcsJ2gnLCdvJywncicsJ24nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCisgICAgJ1knLCdkJywnaScsJ2UnLCdyJywnZScsJ3MnLCdpJywncycsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKKyAgICAnMCcsJzAnLCcxJywnLicsJzAnLCcwJywnMCcsIDAsCisgICAgJzAnLCcwJywnMScsJy4nLCcwJywnMCcsJzEnLCAwLAorICAgICcwJywnMCcsJzEnLCcuJywnMCcsJzAnLCcyJywgMCwKKyAgICAnMCcsJzAnLCcxJywnLicsJzAnLCcwJywnMycsIDAsCisgICAgJ0InLCdsJywnYScsJ2MnLCdrJywgMCwKKyAgICAnQicsJ28nLCdsJywnZCcsIDAsCisgICAgJ0InLCdvJywnbycsJ2snLCAwLAorICAgICdMJywnaScsJ2cnLCdoJywndCcsIDAsCisgICAgJ00nLCdlJywnZCcsJ2knLCd1JywnbScsIDAsCisgICAgJ1InLCdlJywnZycsJ3UnLCdsJywnYScsJ3InLCAwLAorICAgICdSJywnbycsJ20nLCdhJywnbicsIDAsCisgICAgJ1MnLCdlJywnbScsJ2knLCdiJywnbycsJ2wnLCdkJywgMCwKKyAgfQorI2VuZGlmIC8qIERFRklORV9QU19UQUJMRVNfREFUQSAqLworICA7CisKKworI2RlZmluZSBGVF9OVU1fTUFDX05BTUVTICAyNTgKKworICAvKiBWYWx1ZXMgYXJlIG9mZnNldHMgaW50byB0aGUgYGZ0X3N0YW5kYXJkX2dseXBoX25hbWVzJyB0YWJsZSAqLworCisjaWZuZGVmICBERUZJTkVfUFNfVEFCTEVTX0RBVEEKKyNpZmRlZiAgX19jcGx1c3BsdXMKKyAgZXh0ZXJuICJDIgorI2Vsc2UKKyAgZXh0ZXJuCisjZW5kaWYKKyNlbmRpZgorICBjb25zdCBzaG9ydCAgZnRfbWFjX25hbWVzW0ZUX05VTV9NQUNfTkFNRVNdCisjaWZkZWYgIERFRklORV9QU19UQUJMRVNfREFUQQorICA9CisgIHsKKyAgICAgMjUzLCAgIDAsICAgNiwgMjYxLCAyNjcsIDI3NCwgMjgzLCAyOTQsIDMwMSwgMzA5LCA3NTgsIDMzMCwgMzQwLCAzNTEsCisgICAgIDM2MCwgMzY1LCAzNzEsIDM3OCwgMzg1LCAzOTEsIDM5NiwgNDAwLCA0MDQsIDQxMCwgNDE1LCA0MjAsIDQyNCwgNDMwLAorICAgICA0MzYsIDQ0MSwgNDQ3LCA0NTcsIDQ2MiwgNDY4LCA0NzYsIDQ4NSwgNDg4LCA0OTAsIDQ5MiwgNDk0LCA0OTYsIDQ5OCwKKyAgICAgNTAwLCA1MDIsIDUwNCwgNTA2LCA1MDgsIDUxMCwgNTEyLCA1MTQsIDUxNiwgNTE4LCA1MjAsIDUyMiwgNTI0LCA1MjYsCisgICAgIDUyOCwgNTMwLCA1MzIsIDUzNCwgNTM2LCA1MzgsIDU0MCwgNTUyLCA1NjIsIDU3NSwgNTg3LCA5NzksIDYwOCwgNjEwLAorICAgICA2MTIsIDYxNCwgNjE2LCA2MTgsIDYyMCwgNjIyLCA2MjQsIDYyNiwgNjI4LCA2MzAsIDYzMiwgNjM0LCA2MzYsIDYzOCwKKyAgICAgNjQwLCA2NDIsIDY0NCwgNjQ2LCA2NDgsIDY1MCwgNjUyLCA2NTQsIDY1NiwgNjU4LCA2NjAsIDY3MCwgNjc0LCA2ODUsCisgICAgMTM3NSwxMzkyLDE0MDUsMTQxNCwxNDg2LDE1MTIsMTU2MiwxNjAzLDE2MzIsMTYxMCwxNjIyLDE2NDUsMTYzOSwxNjUyLAorICAgIDE2NjEsMTY5MCwxNjY4LDE2ODAsMTY5NywxNzI2LDE3MDQsMTcxNiwxNzMzLDE3NDAsMTc2OSwxNzQ3LDE3NTksMTc3NiwKKyAgICAxNzkwLDE4MTksMTc5NywxODA5LCA4MzksMTI2MywgNzA3LCA3MTIsIDc0MSwgODgxLCA4NzEsMTE2MCwxMzAyLDEzNDYsCisgICAgMTE5NywgOTg1LDEwMzEsICAyMywxMDg2LDExMDgsICAzMiwxMjE5LCAgNDEsICA1MSwgNzMwLDExOTQsICA2NCwgIDc2LAorICAgICAgODYsICA5NCwgIDk3LDEwODksMTExOCwgMTA2LDExMzEsMTE1MCwgOTY2LCA2OTYsMTE4MywgMTEyLCA3MzQsIDEyMCwKKyAgICAgMTMyLCA3ODMsIDkzMCwgOTQ1LCAxMzgsMTM4NSwxMzk4LDE1MjksMTExNSwxMTU3LCA4MzIsMTA3OSwgNzcwLCA5MTYsCisgICAgIDU5OCwgMzE5LDEyNDYsIDE1NSwxODMzLDE1ODYsIDcyMSwgNzQ5LCA3OTcsIDgxMSwgODI2LCA4MjksIDg0NiwgODU2LAorICAgICA4ODgsIDkwMywgOTU0LDEzNjMsMTQyMSwxMzU2LDE0MzMsMTQ0MywxNDUwLDE0NTcsMTQ2OSwxNDc5LDE0OTMsMTUwMCwKKyAgICAgMTYzLDE1MjIsMTU0MywxNTUwLDE1NzIsMTEzNCwgOTkxLDEwMDIsMTAwOCwxMDE1LDEwMjEsMTA0MCwxMDQ1LDEwNTMsCisgICAgMTA2NiwxMDczLDExMDEsMTE0MywxNTM2LDE3ODMsMTU5NiwxODQzLDEyNTMsMTIwNywxMzE5LDE1NzksMTgyNiwxMjI5LAorICAgIDEyNzAsMTMxMywxMzIzLDExNzEsMTI5MCwxMzMyLDEyMTEsMTIzNSwxMjc2LCAxNjksIDE3NSwgMTgyLCAxODksIDIwMCwKKyAgICAgMjA5LCAyMTgsIDIyNSwgMjMyLCAyMzksIDI0NgorICB9CisjZW5kaWYgLyogREVGSU5FX1BTX1RBQkxFU19EQVRBICovCisgIDsKKworCisjZGVmaW5lIEZUX05VTV9TSURfTkFNRVMgIDM5MQorCisgIC8qIFZhbHVlcyBhcmUgb2Zmc2V0cyBpbnRvIHRoZSBgZnRfc3RhbmRhcmRfZ2x5cGhfbmFtZXMnIHRhYmxlICovCisKKyNpZm5kZWYgIERFRklORV9QU19UQUJMRVNfREFUQQorI2lmZGVmICBfX2NwbHVzcGx1cworICBleHRlcm4gIkMiCisjZWxzZQorICBleHRlcm4KKyNlbmRpZgorI2VuZGlmCisgIGNvbnN0IHNob3J0ICBmdF9zaWRfbmFtZXNbRlRfTlVNX1NJRF9OQU1FU10KKyNpZmRlZiAgREVGSU5FX1BTX1RBQkxFU19EQVRBCisgID0KKyAgeworICAgICAyNTMsIDI2MSwgMjY3LCAyNzQsIDI4MywgMjk0LCAzMDEsIDMwOSwgMzE5LCAzMzAsIDM0MCwgMzUxLCAzNjAsIDM2NSwKKyAgICAgMzcxLCAzNzgsIDM4NSwgMzkxLCAzOTYsIDQwMCwgNDA0LCA0MTAsIDQxNSwgNDIwLCA0MjQsIDQzMCwgNDM2LCA0NDEsCisgICAgIDQ0NywgNDU3LCA0NjIsIDQ2OCwgNDc2LCA0ODUsIDQ4OCwgNDkwLCA0OTIsIDQ5NCwgNDk2LCA0OTgsIDUwMCwgNTAyLAorICAgICA1MDQsIDUwNiwgNTA4LCA1MTAsIDUxMiwgNTE0LCA1MTYsIDUxOCwgNTIwLCA1MjIsIDUyNCwgNTI2LCA1MjgsIDUzMCwKKyAgICAgNTMyLCA1MzQsIDUzNiwgNTM4LCA1NDAsIDU1MiwgNTYyLCA1NzUsIDU4NywgNTk4LCA2MDgsIDYxMCwgNjEyLCA2MTQsCisgICAgIDYxNiwgNjE4LCA2MjAsIDYyMiwgNjI0LCA2MjYsIDYyOCwgNjMwLCA2MzIsIDYzNCwgNjM2LCA2MzgsIDY0MCwgNjQyLAorICAgICA2NDQsIDY0NiwgNjQ4LCA2NTAsIDY1MiwgNjU0LCA2NTYsIDY1OCwgNjYwLCA2NzAsIDY3NCwgNjg1LCA2OTYsIDcwNywKKyAgICAgNzEyLCA3MjEsIDczMCwgNzM0LCA3NDEsIDc0OSwgNzU4LCA3NzAsIDc4MywgNzk3LCA4MTEsIDgyNiwgODI5LCA4MzIsCisgICAgIDgzOSwgODQ2LCA4NTYsIDg3MSwgODgxLCA4ODgsIDkwMywgOTE2LCA5MzAsIDk0NSwgOTU0LCA5NjYsIDk3OSwgOTg1LAorICAgICA5OTEsMTAwMiwxMDA4LDEwMTUsMTAyMSwxMDMxLDEwNDAsMTA0NSwxMDUzLDEwNjYsMTA3MywxMDc5LDEwODYsMTA4OSwKKyAgICAxMTAxLDExMDgsMTExNSwxMTE4LDExMzEsMTEzNCwxMTQzLDExNTAsMTE1NywxMTYwLDExNzEsMTE4MywxMTk0LDExOTcsCisgICAgMTIwNywxMjExLDEyMTksMTIyOSwxMjM1LDEyNDYsMTI1MywxMjYzLDEyNzAsMTI3NiwxMjkwLDEzMDIsMTMxMywxMzE5LAorICAgIDEzMjMsMTMzMiwxMzQ2LDEzNTYsMTM2MywxMzc1LDEzODUsMTM5MiwxMzk4LDE0MDUsMTQxNCwxNDIxLDE0MzMsMTQ0MywKKyAgICAxNDUwLDE0NTcsMTQ2OSwxNDc5LDE0ODYsMTQ5MywxNTAwLDE1MTIsMTUyMiwxNTI5LDE1MzYsMTU0MywxNTUwLDE1NjIsCisgICAgMTU3MiwxNTc5LDE1ODYsMTU5NiwxNjAzLDE2MTAsMTYyMiwxNjMyLDE2MzksMTY0NSwxNjUyLDE2NjEsMTY2OCwxNjgwLAorICAgIDE2OTAsMTY5NywxNzA0LDE3MTYsMTcyNiwxNzMzLDE3NDAsMTc0NywxNzU5LDE3NjksMTc3NiwxNzgzLDE3OTAsMTc5NywKKyAgICAxODA5LDE4MTksMTgyNiwxODMzLDE4NDMsMTg1MCwxODYyLDE4ODAsMTg5NSwxOTEwLDE5MjUsMTkzNiwxOTU0LDE5NzMsCisgICAgMTk4OCwyMDAzLDIwMTYsMjAyOCwyMDQwLDIwNTQsMjA2NywyMDgwLDIwOTIsMjEwNiwyMTIwLDIxMzMsMjE0NywyMTY3LAorICAgIDIxODIsMjE5NiwyMjA2LDIyMTYsMjIyOSwyMjM5LDIyNDksMjI1OSwyMjY5LDIyNzksMjI4OSwyMjk5LDIzMDksMjMxOSwKKyAgICAyMzI5LDIzMzIsMjMzNiwyMzQwLDIzNTgsMjM3NywyMzkzLDI0MDgsMjQxOSwyNDI2LDI0MzMsMjQ0MCwyNDQ3LDI0NTQsCisgICAgMjQ2MSwyNDY4LDI0NzUsMjQ4MiwyNDg5LDI0OTYsMjUwMywyNTEwLDI1MTcsMjUyNCwyNTMxLDI1MzgsMjU0NSwyNTUyLAorICAgIDI1NTksMjU2NiwyNTczLDI1ODAsMjU4NywyNTk0LDI2MDEsMjYxNSwyNjI1LDI2MzIsMjY0MywyNjU5LDI2NzIsMjY4NCwKKyAgICAyNjk2LDI3MDgsMjcyMiwyNzMzLDI3NDQsMjc1OSwyNzcxLDI3ODIsMjc5NywyODA5LDI4MTksMjgzMiwyODUwLDI4NjAsCisgICAgMjg3MywyODg1LDI4OTgsMjkwNywyOTE3LDI5MzAsMjk0MywyOTU2LDI5NjgsMjk4MiwyOTk2LDMwMDksMzAyMiwzMDM0LAorICAgIDMwNDYsMzA2MCwzMDczLDMwODYsMzA5OCwzMTEyLDMxMjYsMzEzOSwzMTUyLDMxNjcsMzE4MiwzMTk2LDMyMDgsMzIyMCwKKyAgICAzMjM3LDMyNDksMzI2NCwzMjc1LDMyODMsMzI5NywzMzA5LDMzMjEsMzMzOCwzMzUzLDMzNjUsMzM3NywzMzk0LDM0MDksCisgICAgMzQxOCwzNDMwLDM0NDIsMzQ1NCwzNDcxLDM0ODMsMzQ5OCwzNTA2LDM1MTgsMzUzMCwzNTQyLDM1NTksMzU3NCwzNTg2LAorICAgIDM1OTcsMzYxMiwzNjIwLDM2MjgsMzYzNiwzNjQ0LDM2NTAsMzY1NSwzNjYwLDM2NjYsMzY3MywzNjgxLDM2ODcKKyAgfQorI2VuZGlmIC8qIERFRklORV9QU19UQUJMRVNfREFUQSAqLworICA7CisKKworICAvKiB0aGUgZm9sbG93aW5nIGFyZSBpbmRpY2VzIGludG8gdGhlIFNJRCBuYW1lIHRhYmxlICovCisjaWZuZGVmICBERUZJTkVfUFNfVEFCTEVTX0RBVEEKKyNpZmRlZiAgX19jcGx1c3BsdXMKKyAgZXh0ZXJuICJDIgorI2Vsc2UKKyAgZXh0ZXJuCisjZW5kaWYKKyNlbmRpZgorICBjb25zdCB1bnNpZ25lZCBzaG9ydCAgdDFfc3RhbmRhcmRfZW5jb2RpbmdbMjU2XQorI2lmZGVmICBERUZJTkVfUFNfVEFCTEVTX0RBVEEKKyAgPQorICB7CisgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsCisgICAgIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLAorICAgICAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwKKyAgICAgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQsCisgICAgIDY1LCA2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgNzksIDgwLAorICAgICA4MSwgODIsIDgzLCA4NCwgODUsIDg2LCA4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAgMCwKKyAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAgMCwgOTYsIDk3LCA5OCwgOTksMTAwLDEwMSwxMDIsMTAzLDEwNCwxMDUsMTA2LDEwNywxMDgsMTA5LDExMCwKKyAgICAgIDAsMTExLDExMiwxMTMsMTE0LCAgMCwxMTUsMTE2LDExNywxMTgsMTE5LDEyMCwxMjEsMTIyLCAgMCwxMjMsCisgICAgICAwLDEyNCwxMjUsMTI2LDEyNywxMjgsMTI5LDEzMCwxMzEsICAwLDEzMiwxMzMsICAwLDEzNCwxMzUsMTM2LAorICAgIDEzNywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgIDAsMTM4LCAgMCwxMzksICAwLCAgMCwgIDAsICAwLDE0MCwxNDEsMTQyLDE0MywgIDAsICAwLCAgMCwgIDAsCisgICAgICAwLDE0NCwgIDAsICAwLCAgMCwxNDUsICAwLCAgMCwxNDYsMTQ3LDE0OCwxNDksICAwLCAgMCwgIDAsICAwCisgIH0KKyNlbmRpZiAvKiBERUZJTkVfUFNfVEFCTEVTX0RBVEEgKi8KKyAgOworCisKKyAgLyogdGhlIGZvbGxvd2luZyBhcmUgaW5kaWNlcyBpbnRvIHRoZSBTSUQgbmFtZSB0YWJsZSAqLworI2lmbmRlZiAgREVGSU5FX1BTX1RBQkxFU19EQVRBCisjaWZkZWYgIF9fY3BsdXNwbHVzCisgIGV4dGVybiAiQyIKKyNlbHNlCisgIGV4dGVybgorI2VuZGlmCisjZW5kaWYKKyAgY29uc3QgdW5zaWduZWQgc2hvcnQgIHQxX2V4cGVydF9lbmNvZGluZ1syNTZdCisjaWZkZWYgIERFRklORV9QU19UQUJMRVNfREFUQQorICA9CisgIHsKKyAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAorICAgICAgMSwyMjksMjMwLCAgMCwyMzEsMjMyLDIzMywyMzQsMjM1LDIzNiwyMzcsMjM4LCAxMywgMTQsIDE1LCA5OSwKKyAgICAyMzksMjQwLDI0MSwyNDIsMjQzLDI0NCwyNDUsMjQ2LDI0NywyNDgsIDI3LCAyOCwyNDksMjUwLDI1MSwyNTIsCisgICAgICAwLDI1MywyNTQsMjU1LDI1NiwyNTcsICAwLCAgMCwgIDAsMjU4LCAgMCwgIDAsMjU5LDI2MCwyNjEsMjYyLAorICAgICAgMCwgIDAsMjYzLDI2NCwyNjUsICAwLDI2NiwxMDksMTEwLDI2NywyNjgsMjY5LCAgMCwyNzAsMjcxLDI3MiwKKyAgICAyNzMsMjc0LDI3NSwyNzYsMjc3LDI3OCwyNzksMjgwLDI4MSwyODIsMjgzLDI4NCwyODUsMjg2LDI4NywyODgsCisgICAgMjg5LDI5MCwyOTEsMjkyLDI5MywyOTQsMjk1LDI5NiwyOTcsMjk4LDI5OSwzMDAsMzAxLDMwMiwzMDMsICAwLAorICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKKyAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCisgICAgICAwLDMwNCwzMDUsMzA2LCAgMCwgIDAsMzA3LDMwOCwzMDksMzEwLDMxMSwgIDAsMzEyLCAgMCwgIDAsMzEzLAorICAgICAgMCwgIDAsMzE0LDMxNSwgIDAsICAwLDMxNiwzMTcsMzE4LCAgMCwgIDAsICAwLDE1OCwxNTUsMTYzLDMxOSwKKyAgICAzMjAsMzIxLDMyMiwzMjMsMzI0LDMyNSwgIDAsICAwLDMyNiwxNTAsMTY0LDE2OSwzMjcsMzI4LDMyOSwzMzAsCisgICAgMzMxLDMzMiwzMzMsMzM0LDMzNSwzMzYsMzM3LDMzOCwzMzksMzQwLDM0MSwzNDIsMzQzLDM0NCwzNDUsMzQ2LAorICAgIDM0NywzNDgsMzQ5LDM1MCwzNTEsMzUyLDM1MywzNTQsMzU1LDM1NiwzNTcsMzU4LDM1OSwzNjAsMzYxLDM2MiwKKyAgICAzNjMsMzY0LDM2NSwzNjYsMzY3LDM2OCwzNjksMzcwLDM3MSwzNzIsMzczLDM3NCwzNzUsMzc2LDM3NywzNzgKKyAgfQorI2VuZGlmIC8qIERFRklORV9QU19UQUJMRVNfREFUQSAqLworICA7CisKKworICAvKgorICAgKiAgVGhpcyB0YWJsZSBpcyBhIGNvbXByZXNzZWQgdmVyc2lvbiBvZiB0aGUgQWRvYmUgR2x5cGggTGlzdCAoQUdMKSwKKyAgICogIG9wdGltaXplZCBmb3IgZWZmaWNpZW50IHNlYXJjaGluZy4gIEl0IGhhcyBiZWVuIGdlbmVyYXRlZCBieSB0aGUKKyAgICogIGBnbG5hbWVzLnB5JyBweXRob24gc2NyaXB0IGxvY2F0ZWQgaW4gdGhlIGBzcmMvdG9vbHMnIGRpcmVjdG9yeS4KKyAgICoKKyAgICogIFRoZSBsb29rdXAgZnVuY3Rpb24gdG8gZ2V0IHRoZSBVbmljb2RlIHZhbHVlIGZvciBhIGdpdmVuIHN0cmluZworICAgKiAgaXMgZGVmaW5lZCBiZWxvdyB0aGUgdGFibGUuCisgICAqLworCisjaWZkZWYgRlRfQ09ORklHX09QVElPTl9BRE9CRV9HTFlQSF9MSVNUCisKKyNpZm5kZWYgIERFRklORV9QU19UQUJMRVNfREFUQQorI2lmZGVmICBfX2NwbHVzcGx1cworICBleHRlcm4gIkMiCisjZWxzZQorICBleHRlcm4KKyNlbmRpZgorI2VuZGlmCisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgIGZ0X2Fkb2JlX2dseXBoX2xpc3RbNTU5OTdMXQorI2lmZGVmICBERUZJTkVfUFNfVEFCTEVTX0RBVEEKKyAgPQorICB7CisgICAgICAwLCA1MiwgIDAsMTA2LCAgMiwxNjcsICAzLCA2MywgIDQsMjIwLCAgNiwxMjUsICA5LDE0MywgMTAsIDIzLAorICAgICAxMSwxMzcsIDEyLDE5OSwgMTQsMjQ2LCAxNSwgODcsIDE2LDIzMywgMTcsMjE5LCAxOCwxMDQsIDE5LCA4OCwKKyAgICAgMjIsMTEwLCAyMywgMzIsIDIzLCA3MSwgMjQsIDc3LCAyNywxNTYsIDI5LCA3MywgMzEsMjQ3LCAzMiwxMDcsCisgICAgIDMyLDIyMiwgMzMsIDU1LCAzNCwxNTQsIDM1LDIxOCwgNTgsIDEwLCA2NCwxMjIsIDcyLDE4OCwgODAsMTA5LAorICAgICA4OCwxMDQsIDkzLCA2MSwgOTgsMTY4LDEwNiwgOTEsMTE0LDExMSwxMTUsMjM3LDEyMiwxODAsMTI3LDI1NSwKKyAgICAxMzUsMTY0LDE0MywxMzIsMTQ5LDIxMywxNTgsMTA4LDE2MSwxMTUsMTY4LDE3NSwxODMsMTQ3LDE5NywxOTksCisgICAgMjAyLCAyNSwyMDQsMTY2LDIwOCwyMDksMjA5LCA4MSwyMTUsIDI2LCA2NSwxNDMsICAwLCA2NSwgIDAsMTQwLAorICAgICAgMCwxNzUsICAwLDE5MywgIDEsIDE1LCAgMSwxNDcsICAxLDIzMywgIDEsMjUxLCAgMiwgIDcsICAyLCA0MCwKKyAgICAgIDIsIDU3LCAgMiwgODIsICAyLCA5MSwgIDIsMTI4LCAgMiwxMzYsICAyLDE1NCwgNjksMTMxLCAgMCwxOTgsCisgICAgICAwLDE1MCwgIDAsMTU4LCAgMCwxNjcsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLDI1MiwyMzcsMjI1LAorICAgIDIyNywyNDIsMjM5LDExMCwxMjgsICAxLDIyNiwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMjMwLDIyNSwKKyAgICAyMjcsMjQ1LDI0NCwxMDEsMTI5LCAgMCwxOTMsICAwLDE4NSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsCisgICAgMjI1LDIyNiwyNDIsMjI5LDI0NiwxMDEsMTM0LCAgMSwgIDIsICAwLDIxMywgIDAsMjIxLCAgMCwyMzIsICAwLAorICAgIDI0MywgIDAsMjUxLCAgMSwgIDcsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLDE3NCwyMjcsMjQ5LDI0MiwKKyAgICAyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjA4LDIyOCwyMzksMjQ0LDIyNiwyMjksMjM2LDIzOSwxMTksCisgICAgMTI4LCAzMCwxODIsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLDE3NiwyMzIsMjM5LDIzOSwyMzUsMjI1LAorICAgIDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDE3OCwyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwgMzAsMTgwLCA5OSwKKyAgICAgIDQsICAxLCAyNSwgIDEsIDMyLCAgMSwxMjEsICAxLDEzNywyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMDUsCisgICAgMjMzLDI0MiwgOTksICAyLCAgMSwgNDAsICAxLCA0NSwyMzYsMTAxLDEyOCwgMzYsMTgyLDI0NSwyMzcsMjMwLAorICAgIDIzNiwyMjksMTIwLDEzNCwgIDAsMTk0LCAgMSwgNjYsICAxLCA3NCwgIDEsIDg1LCAgMSwgOTMsICAxLDEwNSwKKyAgICAgIDEsMTEzLDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwxNjQsMjI4LDIzOSwyNDQsMjI2LDIyOSwyMzYsCisgICAgMjM5LDExOSwxMjgsIDMwLDE3MiwyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwgMzAsMTY2LDIzMiwyMzksMjM5LAorICAgIDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMTY4LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywKKyAgICAyMjYsMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjgsIDMwLDE3MCwyNDUsMjQ0LDEwMSwxMjksMjQ2LDIwMSwgIDEsCisgICAgMTI5LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxODAsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAorICAgIDEyOCwgIDQsIDE2LDEwMCwgIDMsICAxLDE1NSwgIDEsMTY1LCAgMSwyMDksMjI2LDIzNiwyMzEsMjQyLDIyNSwKKyAgICAyNDYsMTAxLDEyOCwgIDIsICAwLDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMzEsICAwLDE5NiwgIDEsCisgICAgMTgxLCAgMSwxOTIsICAxLDIwMSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjEwLAorICAgIDIzNywyMjUsMjI3LDI0MiwyMzksMTEwLDEyOCwgIDEsMjIyLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywKKyAgICAyMjgsMjM5LDExNiwgIDIsICAxLDIxNiwgIDEsMjI0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxNjAsCisgICAgMjM3LDIyNSwyMjcsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMjQsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjksICAwLAorICAgIDE5MiwgIDEsMjQzLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMjQsMjMyLDIzOSwyMzksMjM1LDIyNSwKKyAgICAyMjYsMjM5LDI0NiwxMDEsMTI4LCAzMCwxNjIsMTA1LCAgMiwgIDIsIDEzLCAgMiwgMjUsMjI5LDIyNywyNDksCisgICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMTIsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LAorICAgIDIyNiwyNDIsMjI5LDI0NiwxMDEsMTI4LCAgMiwgIDIsMjM2LDI0MCwyMzIsIDk3LDEyOSwgIDMsMTQ1LCAgMiwKKyAgICAgNDksMjQ0LDIzOSwyMzgsMjM5LDExNSwxMjgsICAzLDEzNCwxMDksICAyLCAgMiwgNjMsICAyLCA3MSwyMjUsCisgICAgMjI3LDI0MiwyMzksMTEwLDEyOCwgIDEsICAwLDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LAorICAgIDI1NSwgMzMsMjM5LDIzMSwyMzksMjM4LDIyOSwxMDcsMTI4LCAgMSwgIDQsMjQyLDIzMywyMzgsMTAzLDEzMSwKKyAgICAgIDAsMTk3LCAgMiwxMDQsICAyLDExMiwgIDIsMTIwLDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMSwyNTAsCisgICAgMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCAgMCwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMjI5LAorICAgIDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywgOTcsMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjksICAwLDE5NSwKKyAgICAgIDIsMTQ2LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMjcsMjQ5LDIyNiwyMjUsMjQyLDIzNywyMjksCisgICAgMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDQ5LCA2NiwxMzcsICAwLCA2NiwgIDIsMTg5LCAgMiwxOTgsICAyLAorICAgIDIyMywgIDMsICAzLCAgMywgMTAsICAzLCAyMiwgIDMsIDM0LCAgMywgNDYsICAzLCA1NCwyMjcsMjMzLDI0MiwKKyAgICAyMjcsMjM2LDEwMSwxMjgsIDM2LDE4MywyMjgsMjM5LDExNiwgIDIsICAyLDIwNiwgIDIsMjE1LDIyNSwyMjcsCisgICAgMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsICAyLDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgIDQsMTAxLAorICAgICAgMywgIDIsMjMxLCAgMiwyNDIsICAyLDI1NCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKKyAgICAgIDQsIDE3LDIzOCwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDUwLDI0NCwgOTcsCisgICAgMTI4LCAgMywxNDYsMjMyLDIzOSwyMzksMTA3LDEyOCwgIDEsMTI5LDIzNiwyMzMsMjM4LDIyOSwyMjYsMjI5LAorICAgIDIzNiwyMzksMTE5LDEyOCwgMzAsICA2LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwKKyAgICAyNTUsIDM0LDI0MiwyMjksMjQ2LDIyOSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDYsMjQ0LDI0MywyMzcsCisgICAgMjI1LDIzNiwxMDgsMTI4LDI0NywgOTgsMjQ0LDIzOSwyNDAsMjI2LDIyNSwxMTQsMTI4LCAgMSwxMzAsIDY3LAorICAgIDEzNywgIDAsIDY3LCAgMywgODUsICAzLDEyNywgIDMsMTkzLCAgMywyMTAsICAzLDIyNCwgIDQsMTcxLCAgNCwKKyAgICAxODgsICA0LDIwMCwgIDQsMjEyLCA5NywgIDMsICAzLCA5MywgIDMsMTA0LCAgMywxMTEsMjI1LDI0MiwyMzcsCisgICAgMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA2MiwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMSwgIDYsMjQyLAorICAgIDIzOSwxMTAsMTI5LDI0NiwyMDIsICAzLDExOSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDYsMjQ1LCA5OSwKKyAgICAgIDMsICAzLDEzNSwgIDMsMTQyLCAgMywxNzEsMjI1LDI0MiwyMzksMTEwLDEyOCwgIDEsIDEyLDIyOSwyMjgsCisgICAgMjMzLDIzNiwyMzYsIDk3LDEzMCwgIDAsMTk5LCAgMywxNTUsICAzLDE2MywyMjUsMjI3LDI0NSwyNDQsMTAxLAorICAgIDEyOCwgMzAsICA4LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMzEsMjMzLDI0MiwgOTksICAyLCAgMywKKyAgICAxNzksICAzLDE4NCwyMzYsMTAxLDEyOCwgMzYsMTg0LDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOCwgIDEsCisgICAgICA4LDIyOCwyMzksMTE2LDEyOSwgIDEsIDEwLCAgMywyMDEsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LAorICAgICAgMSwgMTAsMjI5LDIyOCwyMzMsMjM2LDIzNiwyMjUsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDE4NCwKKyAgICAxMDQsICA0LCAgMywyMzQsICAzLDI0NiwgIDQsMTYxLCAgNCwxNjUsMjI1LDIyNSwyNDIsMjM3LDIyOSwyMzgsCisgICAgMjMzLDIyNSwxMTAsMTI4LCAgNSwgNzMsMTAxLCAgNiwgIDQsICA0LCAgNCwgMjQsICA0LCAzNSwgIDQsMTAzLAorICAgICAgNCwxMTUsICA0LDEzNiwyMjUsMjI2LDIzNSwyMzIsMjI1LDI0MywyMzMsMjI1LDIzOCwyMjcsMjQ5LDI0MiwKKyAgICAyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTg4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksCisgICAgMTI4LCAgNCwgMzksMTAwLCAgMiwgIDQsIDQxLCAgNCwgODUsMjI5LDI0MywyMjcsMjI5LDIzOCwyMjgsMjI5LAorICAgIDExNCwgIDIsICA0LCA1NCwgIDQsIDc0LDIyNSwyMjYsMjM1LDIzMiwyMjUsMjQzLDIzMywyMjUsMjM4LDIyNywKKyAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxOTAsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCisgICAgMjMzLCA5OSwxMjgsICA0LDE4MiwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywyNDMsMjI3LDI0OSwyNDIsMjMzLAorICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDI0NCwyMzIsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwKKyAgICAxMjgsICA1LCA2NywyMzUsMjMyLDIyNSwyMzUsMjI1LDI0MywyNDMsMjMzLDIyNSwyMzgsMjI3LDI0OSwyNDIsCisgICAgMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDIwMywyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMjM2LAorICAgIDI0MywyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKKyAgICAxODQsMTA1LDEyOCwgIDMsMTY3LDIzOSwyMzksMTA3LDEyOCwgIDEsMTM1LDIzMywyNDIsMjI3LDI0NSwyMzcsCisgICAgMjMwLDIzNiwyMjksMjQ4LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NiwyNDYsMjM3LDIzOSwyMzgsMjM5LAorICAgIDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMzUsMjM5LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwKKyAgICAxMTAsMTI4LCAgNSwgODEsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LCA5OSwgNjgsMTQyLCAgMCwgNjgsCisgICAgICA0LDI1MiwgIDUsIDEwLCAgNSwgMzYsICA1LCA5NiwgIDUsMTIxLCAgNSwxNjYsICA1LDE3MywgIDUsMjMxLAorICAgICAgNSwyNDQsICA2LCAgMCwgIDYsIDEyLCAgNiwgMjgsICA2LCA0OCwgIDYsIDU3LCA5MCwxMjksICAxLDI0MSwKKyAgICAgIDUsICAyLDIyNywyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwxOTYsIDk3LCAgMiwgIDUsIDE2LCAgNSwgMjcsCisgICAgMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA1MiwyMzAsMjQyLDIzMywyMjcsMjI1LAorICAgIDExMCwxMjgsICAxLDEzNywgOTksICA0LCAgNSwgNDYsICA1LCA1MywgIDUsIDYyLCAgNSwgODksMjI1LDI0MiwKKyAgICAyMzksMTEwLDEyOCwgIDEsIDE0LDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgMzAsIDE2LDIzMywyNDIsCisgICAgIDk5LCAgMiwgIDUsIDcwLCAgNSwgNzUsMjM2LDEwMSwxMjgsIDM2LDE4NSwyNDUsMjM3LDIzMCwyMzYsMjI5LAorICAgIDI0OCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDE4LDI0MiwyMzksMjI1LDExNiwxMjgsICAxLCAxNiwKKyAgICAyMjgsMjM5LDExNiwgIDIsICA1LDEwNCwgIDUsMTEzLDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsCisgICAgIDEwLDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgMTIsMTAxLCAgMywgIDUsMTI5LCAgNSwxNDAsICA1LAorICAgIDE1MCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDIwLDIzMywyMjcsMjM5LDI0MCwKKyAgICAyNDQsMjMzLCA5OSwxMjgsICAzLDIzOCwyMzYsMjQ0LCA5NywxMjksIDM0LCAgNiwgIDUsMTU4LDIzMSwyNDIsCisgICAgMjI5LDIyOSwxMDcsMTI4LCAgMywxNDgsMjMyLDIzOSwyMzksMTA3LDEyOCwgIDEsMTM4LDEwNSwgIDIsICA1LAorICAgIDE3OSwgIDUsMjE4LDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEzMSwyNDYsMjAzLCAgNSwxOTQsICA1LDIwMiwKKyAgICAgIDUsMjEwLDE5MywyMjcsMjQ1LDI0NCwxMDEsMTI4LDI0NiwyMDQsMTk5LDI0MiwyMjUsMjQ2LDEwMSwxMjgsCisgICAgMjQ2LDIwNSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTY4LDIzMSwyMjUsMjM3LDIzNywyMjUsMjMxLAorICAgIDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDIyMCwyMzQsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywKKyAgICAgOTksMTI4LCAgNCwgIDIsMjM2LDIzMywyMzgsMjI5LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgMTQsCisgICAgMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMzYsMjM5LDI0NCwyMjUsMjI3LAorICAgIDIyNywyMjksMjM4LDI0NCwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDYsMjQ3LDExNSwgIDIsICA2LCAzNCwKKyAgICAgIDYsIDQxLDIzNiwyMjUsMjQzLDEwNCwxMjgsICAxLCAxNiwyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxMDAsCisgICAgMjQ0LDIzOSwyNDAsMjI2LDIyNSwxMTQsMTI4LCAgMSwxMzksMTIyLDEzMSwgIDEsMjQyLCAgNiwgNjcsICA2LAorICAgICA3NSwgIDYsMTEyLDIyNywyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwxOTcsMTAxLCAgMiwgIDYsIDgxLCAgNiwKKyAgICAxMDEsMjI1LDIyNiwyMzUsMjMyLDIyNSwyNDMsMjMzLDIyNSwyMzgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCisgICAgMjMzLCA5OSwxMjgsICA0LDIyNCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsICA1LAorICAgIDIzMiwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAxNSwgNjksMTQ2LCAgMCwKKyAgICAgNjksICA2LDE2NSwgIDYsMTgzLCAgNiwxOTEsICA3LCA4OSwgIDcsMTUzLCAgNywxNjUsICA3LDE4MywgIDcsCisgICAgMjExLCAgOCwgIDcsICA4LCAzNiwgIDgsIDk0LCAgOCwxNjksICA4LDE4OSwgIDgsMjA4LCAgOCwyNDgsICA5LAorICAgICA0NCwgIDksMTA5LCAgOSwxMTUsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjksICAwLDIwMSwgIDYsMTc1LDI0MywKKyAgICAyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMzMsMjI2LDI0MiwyMjksMjQ2LDEwMSwxMjgsICAxLCAyMCwgOTksCisgICAgICA1LCAgNiwyMDMsICA2LDIxMCwgIDYsMjI0LCAgNiwyMzYsICA3LCA3OSwyMjUsMjQyLDIzOSwxMTAsMTI4LAorICAgICAgMSwgMjYsMjI5LDIyOCwyMzMsMjM2LDIzNiwyMjUsMjI2LDI0MiwyMjksMjQ2LDEwMSwxMjgsIDMwLCAyOCwKKyAgICAyMzIsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA1MywyMzMsMjQyLCA5OSwgIDIsCisgICAgICA2LDI0NCwgIDYsMjQ5LDIzNiwxMDEsMTI4LCAzNiwxODYsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTM1LAorICAgICAgMCwyMDIsICA3LCAxNiwgIDcsIDI0LCAgNywgMzIsICA3LCA0MywgIDcsIDUxLCAgNywgNjMsICA3LCA3MSwKKyAgICAyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsMTkwLDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgMjQsCisgICAgMjI4LDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDE5OCwyMzEsMjQyLDIyNSwyNDYsMTAxLAorICAgIDEyOCwgMzAsMTkyLDIzMiwyMzksMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMTk0LDI0MywKKyAgICAyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMzQsMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjgsIDMwLDE5NiwyNDksCisgICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgIDQsMTAwLCAgMywgIDcsIDk3LCAgNywxMDcsICA3LAorICAgIDEyNywyMjYsMjM2LDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAgMiwgIDQsMjMzLDIyOSwyNDIsMjI5LDI0MywKKyAgICAyMzMsMTE1LDEyOSwgIDAsMjAzLCAgNywxMTksMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDIzNSwyMzksCisgICAgMTE2LDEzMCwgIDEsIDIyLCAgNywxMzYsICA3LDE0NSwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsICAxLAorICAgICAyMiwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTg0LDIzMCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwKKyAgICAyMzMsIDk5LDEyOCwgIDQsIDM2LDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI5LCAgMCwyMDAsICA3LDE3NSwyNDMsCisgICAgMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMjMyLDEwNCwgIDIsICA3LDE4OSwgIDcsMjAwLDIyNSwyNDIsMjM3LAorICAgIDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNTUsMjM5LDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwKKyAgICAxMjgsIDMwLDE4NiwxMDUsICAzLCAgNywyMTksICA3LDIzMCwgIDcsMjQ1LDIzMSwyMzIsMjQ0LDI0MiwyMzksCisgICAgMjM3LDIyNSwxMTAsMTI4LCAzMywxMDMsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LDIyNiwyNDIsMjI5LAorICAgIDI0NiwxMDEsMTI4LCAgMiwgIDYsMjM5LDI0NCwyMzMsMjMwLDIzMywyMjksMjI4LDIyNywyNDksMjQyLDIzMywKKyAgICAyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMDAsMTA4LCAgMiwgIDgsIDEzLCAgOCwgMjQsMjI3LDI0OSwyNDIsCisgICAgMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAyNywyMjksMjQ2LDIyOSwyMzgsMjQyLDIzOSwyMzcsMjI1LAorICAgIDExMCwxMjgsIDMzLDEwNiwxMDksICAzLCAgOCwgNDQsICA4LCA3MiwgIDgsIDgzLDIyNSwyMjcsMjQyLDIzOSwKKyAgICAxMTAsMTMwLCAgMSwgMTgsICA4LCA1NiwgIDgsIDY0LDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwgMjIsCisgICAgMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLCAyMCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAorICAgIDEyOCwgIDQsIDI4LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMzcsMTEwLCAgNCwKKyAgICAgIDgsMTA0LCAgOCwxMTUsICA4LDEzNSwgIDgsMTU0LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksCisgICAgMTI4LCAgNCwgMjksMjI4LDIyOSwyNDMsMjI3LDIyOSwyMzgsMjI4LDIyOSwyNDIsMjI3LDI0OSwyNDIsMjMzLAorICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE2MiwxMDMsMTI5LCAgMSwgNzQsICA4LDE0MSwyMzIsMjI5LDIyNywKKyAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNjQsMjMyLDIzOSwyMzksMjM1LDIyNywyNDksCisgICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxOTksMTExLCAgMiwgIDgsMTc1LCAgOCwxODMsMjMxLAorICAgIDIzOSwyMzgsMjI5LDEwNywxMjgsICAxLCAyNCwyNDAsMjI5LDExMCwxMjgsICAxLDE0NCwyNDAsMjQzLDIzMywKKyAgICAyMzYsMjM5LDExMCwxMjksICAzLDE0OSwgIDgsMjAwLDI0NCwyMzksMjM4LDIzOSwxMTUsMTI4LCAgMywxMzYsCisgICAgMTE0LCAgMiwgIDgsMjE0LCAgOCwyMjUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAorICAgICAzMiwyMjksMjQ2LDIyOSwyNDIsMjQzLDIyOSwxMDAsMTI5LCAgMSwxNDIsICA4LDIzNywyMjcsMjQ5LDI0MiwKKyAgICAyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDQ1LDExNSwgIDQsICA5LCAgMiwgIDksIDEzLCAgOSwgMzMsCisgICAgICA5LCAzNywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDMzLDIyOCwyMjksMjQzLAorICAgIDIyNywyMjksMjM4LDIyOCwyMjksMjQyLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKKyAgICAxNzAsMTA0LDEyOCwgIDEsMTY5LDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDEwMSwxMTYsICAzLCAgOSwgNTIsCisgICAgICA5LCA3OCwgIDksIDkyLCA5NywxMzAsICAzLDE1MSwgIDksIDYwLCAgOSwgNzAsMjQyLDIzNywyMjksMjM4LAorICAgIDIzMywyMjUsMTEwLDEyOCwgIDUsIDU2LDI0NCwyMzksMjM4LDIzOSwxMTUsMTI4LCAgMywxMzcsMTA0LDEyOSwKKyAgICAgIDAsMjA4LCAgOSwgODQsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI0MCwyMzMsMjM2LDIyOCwxMDEsCisgICAgMTI5LCAzMCwxODgsICA5LDEwMSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDI2LDI0NSwyNDIsMTExLAorICAgIDEyOCwgMzIsMTcyLDI1MCwxMDQsMTMwLCAgMSwxODMsICA5LDEyNCwgIDksMTMyLDIyNywyMjUsMjQyLDIzOSwKKyAgICAxMTAsMTI4LCAgMSwyMzgsMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwxMjgsICAxLDE4NCwgNzAsCisgICAgMTM2LCAgMCwgNzAsICA5LDE2MywgIDksMTcyLCAgOSwxODQsICA5LDIxMiwgIDksMjE5LCAgOSwyNDgsIDEwLAorICAgICAgNCwgMTAsIDE1LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMTg3LDIyOCwyMzksMjQ0LDIyNSwKKyAgICAyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsIDMwLDEwMSwgIDIsICA5LDE5MCwgIDksMjAyLDIzMiwyMjUsCisgICAgMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDg2LDIzMywyMjcsMjM5LDI0MCwyNDQsMjMzLAorICAgICA5OSwxMjgsICAzLDIyOCwyMzIsMjM5LDIzOSwxMDcsMTI4LCAgMSwxNDUsMTA1LCAgMiwgIDksMjI1LCAgOSwKKyAgICAyMzgsMjQ0LDIyNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTE0LDI0NiwyMjksCisgICAgMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsIDMzLDEwMCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LAorICAgIDEwMSwxMjgsMjU1LCAzOCwyMzksMjQ1LDI0MiwyNDIsMjM5LDIzNywyMjUsMTEwLDEyOCwgMzMsIDk5LDI0MywKKyAgICAyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxMDIsIDcxLDE0MCwgIDAsIDcxLCAxMCwgNTEsIDEwLCA2MSwgMTAsCisgICAgMTA3LCAxMCwxMTUsIDEwLDE3NiwgMTAsMTkzLCAxMCwyMDUsIDExLCAzOSwgMTEsIDUyLCAxMSwgNjUsIDExLAorICAgICA5MCwgMTEsMTA3LDE5NCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDEzNSwgOTcsICAzLCAxMCwKKyAgICAgNjksIDEwLCA3NiwgMTAsIDk0LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLDI0NCwyMzcsMjM3LCA5NywxMjksCisgICAgICAzLDE0NywgMTAsIDg0LDIyNSwyMzAsMjQyLDIzMywyMjcsMjI1LDExMCwxMjgsICAxLDE0OCwyMzgsMjMxLAorICAgIDIzMywyMjUsMjI3LDIzOSwyNDAsMjQ0LDIzMywgOTksMTI4LCAgMywyMzQsMjI2LDI0MiwyMjksMjQ2LDEwMSwKKyAgICAxMjgsICAxLCAzMCwgOTksICA0LCAxMCwxMjUsIDEwLDEzMiwgMTAsMTQxLCAxMCwxNjMsMjI1LDI0MiwyMzksCisgICAgMTEwLDEyOCwgIDEsMjMwLDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgIDEsIDM0LDIzMywyNDIsIDk5LAorICAgICAgMiwgMTAsMTQ5LCAxMCwxNTQsMjM2LDEwMSwxMjgsIDM2LDE4OCwyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwKKyAgICAxMjgsICAxLCAyOCwyMzksMjM3LDIzNywyMjUsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAgMSwgMzQsCisgICAgMjI4LDIzOSwxMTYsMTI5LCAgMSwgMzIsIDEwLDE4NCwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsICAxLAorICAgICAzMiwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAxOSwxMDQsICAzLCAxMCwKKyAgICAyMTMsIDEwLDIyNiwgMTEsIDMzLDIyNSwyMjgsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsCisgICAgICA1LCA2NiwxMDEsICAzLCAxMCwyMzQsIDEwLDI1NSwgMTEsIDE2LDIzNywyMzMsMjI4LDIyOCwyMzYsMjI5LAorICAgIDIzMiwyMzksMjM5LDIzNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTQ4LDI0MywKKyAgICAyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNDYsCisgICAgMjQ1LDI0MCwyNDQsMjQ1LDI0MiwyMzgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAorICAgIDE0NCwyMzksMjM5LDEwNywxMjgsICAxLDE0NywyMzMsMjM3LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwKKyAgICAxMTAsMTI4LCAgNSwgNTEsMjM0LDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCisgICAgICAzLDEwOSwgIDIsIDExLCA3MSwgMTEsIDc5LDIyNSwyMjcsMjQyLDIzOSwxMTAsMTI4LCAzMCwgMzIsMjM5LAorICAgIDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAzOSwyNDIsMjI1LDI0NiwxMDEsMTI5LDI0NiwKKyAgICAyMDYsIDExLCA5OSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsIDk2LDExNSwgIDIsIDExLDExMywgMTEsCisgICAgMTI5LDIzNywyMjUsMjM2LDEwOCwxMjksMjQ3LDEwMywgMTEsMTIyLDIzMiwyMzksMjM5LDEwNywxMjgsICAyLAorICAgIDE1NSwyNDQsMjQyLDIzOSwyMzUsMTAxLDEyOCwgIDEsMjI4LCA3MiwxNDAsICAwLCA3MiwgMTEsMTY1LCAxMSwKKyAgICAxOTAsIDExLDE5OCwgMTEsMjA4LCAxMiwgMTcsIDEyLCA0MCwgMTIsIDc3LCAxMiwxMTcsIDEyLDEyOSwgMTIsCisgICAgMTU3LCAxMiwxNjUsIDEyLDE4OSwxNzcsMTg0LCA1MywgIDMsIDExLDE3NSwgMTEsMTgwLCAxMSwxODUsMTc5LAorICAgICA1MSwxMjgsIDM3LDIwNywxODAsIDUxLDEyOCwgMzcsMTcwLDE4MSwgNDksMTI4LCAzNywxNzEsMTc4LDE3OCwKKyAgICAxNzYsMTgzLCA1MSwxMjgsIDM3LDE2MSwyMDgsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwyMDMsCisgICAgIDk3LCAgMywgMTEsMjE2LCAxMSwyMzYsIDEyLCAgMCwyMjUsMjI2LDIzNSwyMzIsMjI1LDI0MywyMzMsMjI1LAorICAgIDIzOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTY4LDIyOCwyMjksMjQzLDIyNywKKyAgICAyMjksMjM4LDIyOCwyMjksMjQyLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNzgsCisgICAgMjQyLDIyOCwyNDMsMjMzLDIzMSwyMzgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAorICAgICA0MiwgOTgsICAyLCAxMiwgMjMsIDEyLCAyOCwyMjUsMTE0LDEyOCwgIDEsIDM4LDI0MiwyMjksMjQ2LDIyOSwKKyAgICAyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDQyLCA5OSwgIDIsIDEyLCA0NiwgMTIsIDU1LDIyOSwyMjgsCisgICAgMjMzLDIzNiwyMzYsIDk3LDEyOCwgMzAsIDQwLDIzMywyNDIsIDk5LCAgMiwgMTIsIDYzLCAxMiwgNjgsMjM2LAorICAgIDEwMSwxMjgsIDM2LDE4OSwyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwxMjgsICAxLCAzNiwxMDAsICAyLCAxMiwKKyAgICAgODMsIDEyLCA5MywyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTI4LCAzMCwgMzgsMjM5LDExNiwgIDIsCisgICAgIDEyLDEwMCwgMTIsMTA5LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsIDM0LDIyNiwyMjksMjM2LAorICAgIDIzOSwxMTksMTI4LCAzMCwgMzYsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwKKyAgICAgNDAsMTExLCAgMiwgMTIsMTM1LCAxMiwxNDYsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsCisgICAgICA1LCA2NCwyNDIsMjMzLDIyNywyMzksMjQwLDI0NCwyMzMsIDk5LDEyOCwgIDMsMjMyLDI0MywyMzcsMjI1LAorICAgIDIzNiwxMDgsMTI4LDI0NywxMDQsMjQ1LDIzOCwyMzEsMjI1LDI0MiwyNDUsMjM3LDIzNiwyMjUsMjQ1LDExNiwKKyAgICAxMjksMjQ2LDIwNywgMTIsMTgxLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NiwyNDgsMjUwLDI0MywyNDEsCisgICAgMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTQ0LCA3MywxNDYsICAwLCA3MywgMTIsMjM5LCAxMiwyNTEsIDEyLAorICAgIDI1NSwgMTMsIDExLCAxMywgMjksIDEzLCAzNywgMTMsIDk0LCAxMywxODEsIDEzLDIxNCwgMTMsMjI0LCAxMywKKyAgICAyNDIsIDEzLDI1NCwgMTQsIDQ4LCAxNCwgODYsIDE0LCA5OSwgMTQsMTY2LCAxNCwxODcsIDE0LDIwNSwxOTMsCisgICAgMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA0NywgNzQsMTI4LCAgMSwgNTAsMjEzLAorICAgIDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNDYsMjI1LDIyNywyNDUsMjQ0LDEwMSwKKyAgICAxMjksICAwLDIwNSwgMTMsIDIxLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMzcsMjI2LDI0MiwyMjksCisgICAgMjQ2LDEwMSwxMjgsICAxLCA0NCwgOTksICAzLCAxMywgNDUsIDEzLCA1MiwgMTMsIDg0LDIyNSwyNDIsMjM5LAorICAgIDExMCwxMjgsICAxLDIwNywyMzMsMjQyLCA5OSwgIDIsIDEzLCA2MCwgMTMsIDY1LDIzNiwxMDEsMTI4LCAzNiwKKyAgICAxOTAsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTI5LCAgMCwyMDYsIDEzLCA3NiwyNDMsMjM3LDIyNSwyMzYsCisgICAgMTA4LDEyOCwyNDcsMjM4LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAgNiwxMDAsICAzLAorICAgICAxMywxMDIsIDEzLDExMiwgMTMsMTU1LDIyNiwyMzYsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAyLCAgOCwKKyAgICAyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTMxLCAgMCwyMDcsIDEzLDEyOCwgMTMsMTM2LCAxMywxNDcsCisgICAgMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLCA0NiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAorICAgIDEyOCwgIDQsMjI4LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMzksMjM5LDExNiwxMzAsICAxLCA0OCwKKyAgICAgMTMsMTY0LCAxMywxNzMsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAgMSwgNDgsMjI2LDIyOSwyMzYsCisgICAgMjM5LDExOSwxMjgsIDMwLDIwMiwxMDEsICAyLCAxMywxODcsIDEzLDIwMywyMjYsMjQyLDIyOSwyNDYsMjI5LAorICAgIDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMTQsMjI3LDI0OSwyNDIsMjMzLDIzNiwKKyAgICAyMzYsMjMzLCA5OSwxMjgsICA0LCAyMSwyMzAsMjQyLDIyNSwyMzUsMjQ0LDI0NSwxMTQsMTI4LCAzMywgMTcsCisgICAgMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjksICAwLDIwNCwgMTMsMjM0LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LAorICAgIDI0NywyMzYsMjMyLDIzOSwyMzksMjM1LDIyNSwyMjYsMjM5LDI0NiwxMDEsMTI4LCAzMCwyMDAsMTA1LCAgMywKKyAgICAgMTQsICA2LCAxNCwgMTcsIDE0LCAzMiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCisgICAgIDI0LDIzOCwyNDYsMjI5LDI0MiwyNDQsMjI5LDIyOCwyMjYsMjQyLDIyOSwyNDYsMTAxLDEyOCwgIDIsIDEwLAorICAgIDI0MywyMzIsMjM5LDI0MiwyNDQsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAyNSwKKyAgICAxMDksICAyLCAxNCwgNTQsIDE0LCA3NSwyMjUsMjI3LDI0MiwyMzksMTEwLDEyOSwgIDEsIDQyLCAxNCwgNjQsCisgICAgMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDIyNiwyMzksMjM4LDIzOSwyNDMsMjQwLAorICAgIDIyNSwyMjcsMTAxLDEyOCwyNTUsIDQxLDIzOCwyMzMsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwKKyAgICAxMjgsICA1LCA1OSwxMTEsICAzLCAxNCwxMDcsIDE0LDExOCwgMTQsMTI2LDIyNywyNDksMjQyLDIzMywyMzYsCisgICAgMjM2LDIzMywgOTksMTI4LCAgNCwgIDEsMjMxLDIzOSwyMzgsMjI5LDEwNywxMjgsICAxLCA0NiwyNDQsIDk3LAorICAgIDEzMSwgIDMsMTUzLCAxNCwxMzcsIDE0LDE0NywgMTQsMTU4LDIyNSwyMzAsMjQyLDIzMywyMjcsMjI1LDExMCwKKyAgICAxMjgsICAxLDE1MCwyMjgsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEyOCwgIDMsMTcwLDI0NCwyMzksCisgICAgMjM4LDIzOSwxMTUsMTI4LCAgMywxMzgsMTE1LCAgMiwgMTQsMTcyLCAxNCwxNzksMjM3LDIyNSwyMzYsMTA4LAorICAgIDEyOCwyNDcsMTA1LDI0NCwyNDIsMjM5LDIzNSwxMDEsMTI4LCAgMSwxNTEsMjQ0LDIzMywyMzYsMjI4LDEwMSwKKyAgICAxMjksICAxLCA0MCwgMTQsMTk3LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgNDQsMjUwLDIzMiwyMzMsCisgICAgMjQ0LDI0MywgOTcsICAyLCAxNCwyMTYsIDE0LDIyNywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAorICAgIDEyOCwgIDQsMTE2LDIyOCwyMjYsMjM2LDIzMSwyNDIsMjI1LDI0NiwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwKKyAgICAyMzYsMjMzLCA5OSwxMjgsICA0LDExOCwgNzQsMTM0LCAgMCwgNzQsIDE1LCAgNiwgMTUsIDE4LCAxNSwgNDEsCisgICAgIDE1LCA1MywgMTUsIDY3LCAxNSwgNzksMjI1LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LAorICAgICAgNSwgNjUsMjI3LDIzMywyNDIsIDk5LCAgMiwgMTUsIDI3LCAxNSwgMzIsMjM2LDEwMSwxMjgsIDM2LDE5MSwKKyAgICAyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwxMjgsICAxLCA1MiwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCisgICAgMjMzLCA5OSwxMjgsICA0LCAgOCwyMzIsMjI5LDIzMiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLAorICAgIDEyOCwgIDUsIDc1LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDQyLDI0MywKKyAgICAyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxMDYsIDc1LDE0MCwgIDAsIDc1LCAxNSwxMTUsIDE1LDEyNSwgMTUsCisgICAgMTM1LCAxNiwgMTgsIDE2LCA2NSwgMTYsIDc2LCAxNiwxMDYsIDE2LDE0MywgMTYsMTU2LCAxNiwxNjgsIDE2LAorICAgIDE4MCwgMTYsMjA4LDE5NCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDEzMywyMDMsMjQzLDI0MSwKKyAgICAyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwyMDUsIDk3LCAgNywgMTUsMTUxLCAxNSwxNjksIDE1LDE5MSwgMTUsCisgICAgMjExLCAxNSwyMjYsIDE1LDIzMiwgMTUsMjQ5LDIyNiwyMjUsMjQzLDIzMiwyMzUsMjMzLDI0MiwyMjcsMjQ5LAorICAgIDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTYwLCA5OSwgIDIsIDE1LDE3NSwgMTUsMTgxLDI0NSwKKyAgICAyNDQsMTAxLDEyOCwgMzAsIDQ4LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAyNiwyMjgsCisgICAgMjI5LDI0MywyMjcsMjI5LDIzOCwyMjgsMjI5LDI0MiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAorICAgIDEyOCwgIDQsMTU0LDIzMiwyMzksMjM5LDIzNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKKyAgICAgIDQsMTk1LDI0MCwyNDAsIDk3LDEyOCwgIDMsMTU0LDI0MywyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNywyNDksCisgICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNTgsMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LAorICAgIDIzNiwyNDMsMjQ0LDI0MiwyMzksMjM1LDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKKyAgICAgIDQsMTU2LCA5OSwgIDQsIDE2LCAyOCwgMTYsIDM1LCAxNiwgNDQsIDE2LCA1MiwyMjUsMjQyLDIzOSwxMTAsCisgICAgMTI4LCAgMSwyMzIsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI4LCAgMSwgNTQsMjMzLDI0MiwyMjcsMjM2LAorICAgIDEwMSwxMjgsIDM2LDE5MiwyMzksMjM3LDIzNywyMjUsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAgMSwKKyAgICAgNTQsMjI4LDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCA1MCwxMDEsICAyLCAxNiwgODIsCisgICAgIDE2LCA5NCwyMzIsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA4NCwyMzgsMjI1LAorICAgIDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA2MywxMDQsICAzLCAxNiwxMTQsIDE2LDEyNiwKKyAgICAgMTYsMTM3LDIyNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDM3LDIyOSwyMzMsCisgICAgMjI3LDIzOSwyNDAsMjQ0LDIzMywgOTksMTI4LCAgMywyMzAsMjM5LDIzOSwxMDcsMTI4LCAgMSwxNTIsMjM0LAorICAgIDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDEyLDIzNiwyMzMsMjM4LDIyOSwKKyAgICAyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDUyLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsCisgICAgMTAxLDEyOCwyNTUsIDQzLDIzOSwyNDAsMjQwLCA5NywgIDIsIDE2LDE4OSwgMTYsMjAwLDIyNywyNDksMjQyLAorICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMjgsMjMxLDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDIyMiwKKyAgICAxMTUsICAyLCAxNiwyMTQsIDE2LDIyNiwyMzMsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsCisgICAgICA0LDExMCwyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxMDcsIDc2LDEzOCwgIDAsIDc2LCAxNywgIDEsIDE3LAorICAgICAgNSwgMTcsICA5LCAxNywgMjksIDE3LCA5NSwgMTcsMTMzLCAxNywxNDcsIDE3LDE2NSwgMTcsMTc3LCAxNywKKyAgICAxODksIDc0LDEyOCwgIDEsMTk5LCA3NiwxMjgsMjQ2LDE5MSwgOTcsICAyLCAxNywgMTUsIDE3LCAyMiwyMjcsCisgICAgMjQ1LDI0NCwxMDEsMTI4LCAgMSwgNTcsMjM3LDIyNiwyMjgsIDk3LDEyOCwgIDMsMTU1LCA5OSwgIDQsIDE3LAorICAgICAzOSwgMTcsIDQ2LCAxNywgNTUsIDE3LCA4MiwyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwgNjEsMjI5LDIyOCwKKyAgICAyMzMsMjM2LDIzNiwgOTcsMTI4LCAgMSwgNTksMjMzLDI0MiwgOTksICAyLCAxNywgNjMsIDE3LCA2OCwyMzYsCisgICAgMTAxLDEyOCwgMzYsMTkzLDI0NSwyMzcsMjMwLDIzNiwyMjksMjQ4LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LAorICAgICAzMCwgNjAsMjM5LDIzNywyMzcsMjI1LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgIDEsIDU5LDIyOCwKKyAgICAyMzksMTE2LDEzMCwgIDEsIDYzLCAxNywxMDUsIDE3LDExNCwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsCisgICAgICAxLCA2MywyMjYsMjI5LDIzNiwyMzksMTE5LDEyOSwgMzAsIDU0LCAxNywxMjQsMjM3LDIyNSwyMjcsMjQyLAorICAgIDIzOSwxMTAsMTI4LCAzMCwgNTYsMjMzLDI0NywyMzgsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwKKyAgICAxMjgsICA1LCA2MCwxMDYsMTI5LCAgMSwyMDAsIDE3LDE1MywyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCisgICAgMjMzLCA5OSwxMjgsICA0LCAgOSwyMzYsMjMzLDIzOCwyMjksMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLAorICAgICA1OCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA0NCwxMTUsICAyLCAxNywKKyAgICAxOTUsIDE3LDIxMiwyMzYsMjI1LDI0MywxMDQsMTI5LCAgMSwgNjUsIDE3LDIwNCwyNDMsMjM3LDIyNSwyMzYsCisgICAgMTA4LDEyOCwyNDYsMjQ5LDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDEwOCwgNzcsMTM3LCAgMCwgNzcsIDE3LAorICAgIDI0MSwgMTcsMjUxLCAxOCwgMjQsIDE4LCAzMywgMTgsIDU4LCAxOCwgNzEsIDE4LCA4MywgMTgsIDkxLCAxOCwKKyAgICAxMDAsMTk0LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTM0LDIyNSwgOTksICAyLCAxOCwgIDIsCisgICAgIDE4LCAxOCwyNDIsMjM5LDExMCwxMjksMjQ2LDIwOCwgMTgsIDEwLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LAorICAgIDI0NywxNzUsMjQ1LDI0NCwxMDEsMTI4LCAzMCwgNjIsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwKKyAgICAxOTQsMjI4LDIzOSwxMTYsICAyLCAxOCwgNDEsIDE4LCA1MCwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsCisgICAgIDMwLCA2NCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDY2LDIyOSwyMzgsMjI1LDI0MiwyMzcsMjI5LAorICAgIDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA2OCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwKKyAgICAxMjgsMjU1LCA0NSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTA5LDI0NCwyNDUsMjQyLDIzOCwyMjksCisgICAgMTAwLDEyOCwgIDEsMTU2LDExNywxMjgsICAzLDE1NiwgNzgsMTQxLCAgMCwgNzgsIDE4LDEzNCwgMTgsMTM4LAorICAgICAxOCwxNDYsIDE4LDIxMiwgMTgsMjM3LCAxOCwyNDgsIDE5LCAgMywgMTksIDIxLCAxOSwgMzMsIDE5LCA0NSwKKyAgICAgMTksIDU4LCAxOSwgNjYsIDE5LCA4NCwgNzQsMTI4LCAgMSwyMDIsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsCisgICAgICAxLCA2NywgOTksICA0LCAxOCwxNTYsIDE4LDE2MywgMTgsMTcyLCAxOCwxOTksMjI1LDI0MiwyMzksMTEwLAorICAgIDEyOCwgIDEsIDcxLDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgIDEsIDY5LDIzMywyNDIsIDk5LCAgMiwKKyAgICAgMTgsMTgwLCAxOCwxODUsMjM2LDEwMSwxMjgsIDM2LDE5NSwyNDUsMjM3LDIzMCwyMzYsMjI5LDI0OCwyMjYsCisgICAgMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDc0LDIzOSwyMzcsMjM3LDIyNSwyMjUsMjI3LDIyNywyMjksMjM4LAorICAgIDExNiwxMjgsICAxLCA2OSwyMjgsMjM5LDExNiwgIDIsIDE4LDIyMCwgMTgsMjI5LDIyNSwyMjcsMjI3LDIyOSwKKyAgICAyMzgsMTE2LDEyOCwgMzAsIDY4LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgNzAsMjMyLDIzOSwyMzksCisgICAgMjM1LDIzNiwyMjksMjMwLDExNiwxMjgsICAxLDE1NywyMzMsMjM4LDIyOSwyNDIsMjM5LDIzNywyMjUsMTEwLAorICAgIDEyOCwgMzMsMTA0LDEwNiwxMjksICAxLDIwMywgMTksICA5LDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwKKyAgICAyMzMsIDk5LDEyOCwgIDQsIDEwLDIzNiwyMzMsMjM4LDIyOSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsCisgICAgIDcyLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDQ2LDIzOSwyNDcsMjI1LAorICAgIDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA3MCwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwKKyAgICAyNDcsMTEwLDI0NCwyMzMsMjM2LDIyOCwxMDEsMTI5LCAgMCwyMDksIDE5LCA3NiwyNDMsMjM3LDIyNSwyMzYsCisgICAgMTA4LDEyOCwyNDcsMjQxLDExNywxMjgsICAzLDE1NywgNzksMTQxLCAgMCwgNzksIDE5LDExOCwgMTksMTMyLAorICAgICAxOSwxNTAsIDE5LDIwMywgMjAsIDc4LCAyMCwxNTIsIDIwLDE4NywgMjEsIDQ4LCAyMSwgNjksIDIxLDIxMywKKyAgICAgMjEsMjIzLCAyMSwyNTQsIDIyLCA1MywgNjksMTI5LCAgMSwgODIsIDE5LDEyNCwyNDMsMjM3LDIyNSwyMzYsCisgICAgMTA4LDEyOCwyNDYsMjUwLDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI5LCAgMCwyMTEsIDE5LDE0MiwyNDMsMjM3LAorICAgIDIyNSwyMzYsMTA4LDEyOCwyNDcsMjQzLCA5OCwgIDIsIDE5LDE1NiwgMTksMTk2LDIyNSwyNDIsMjQyLDIyOSwKKyAgICAxMDAsICAyLCAxOSwxNjYsIDE5LDE3NywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCisgICAgMjMyLDIyOCwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywyNDMsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLAorICAgICA5OSwxMjgsICA0LDIzNCwyNDIsMjI5LDI0NiwxMDEsMTI4LCAgMSwgNzgsIDk5LCAgNCwgMTksMjEzLCAxOSwKKyAgICAyMjAsIDE5LDIzNSwgMjAsIDY4LDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLDIwOSwyMjksMjM4LDI0NCwyMjksCisgICAgMjQyLDIyOSwyMjgsMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjgsICAxLDE1OSwyMzMsMjQyLCA5OSwgIDIsIDE5LAorICAgIDI0MywgMTksMjQ4LDIzNiwxMDEsMTI4LCAzNiwxOTYsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTM0LCAgMCwKKyAgICAyMTIsIDIwLCAxMywgMjAsIDIxLCAyMCwgMzIsIDIwLCA0MCwgMjAsIDUyLCAyMCwgNjAsMjI1LDIyNywyNDUsCisgICAgMjQ0LDEwMSwxMjgsIDMwLDIwOCwyMjgsMjM5LDI0NCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMjE2LAorICAgIDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAzMCwyMTAsMjMyLDIzOSwyMzksMjM1LDIyNSwyMjYsMjM5LDI0NiwKKyAgICAxMDEsMTI4LCAzMCwyMTIsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI0NCwyNDQsMjMzLDIzNiwyMjgsCisgICAgMTAxLDEyOCwgMzAsMjE0LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAzMCwxMDAsICAzLAorICAgICAyMCwgODYsIDIwLDEwOSwgMjAsMTQyLDIyNiwxMDgsICAyLCAyMCwgOTMsIDIwLDEwMSwyMjUsMjI3LDI0NSwKKyAgICAyNDQsMTAxLDEyOCwgIDEsIDgwLDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAgMiwgMTIsMjMzLDIyOSwyNDIsCisgICAgMjI5LDI0MywyMzMsMTE1LDEzMCwgIDAsMjE0LCAyMCwxMjMsIDIwLDEzNCwyMjcsMjQ5LDI0MiwyMzMsMjM2LAorICAgIDIzNiwyMzMsIDk5LDEyOCwgIDQsMjMwLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyNDYsMjM5LDI0NCwKKyAgICAyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMjA0LDEwMywgIDIsIDIwLDE1OCwgMjAsMTcwLDIzOSwyMzgsCisgICAgMjI5LDIzNSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDYsMjUxLDI0MiwyMjUsMjQ2LDEwMSwxMjksICAwLAorICAgIDIxMCwgMjAsMTc5LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyNDIsMTA0LCAgNCwgMjAsMTk3LCAyMCwKKyAgICAyMDgsIDIwLDIxMiwgMjEsIDM0LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgODUsCisgICAgMTA5LDEyOCwgMzMsIDM4LDExMSwgIDIsIDIwLDIxOCwgMjAsMjI4LDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LAorICAgIDEwMSwxMjgsIDMwLDIwNiwyNDIsMTEwLDEzMywgIDEsMTYwLCAyMCwyNDMsIDIwLDI1MSwgMjEsICA2LCAyMSwKKyAgICAgMTQsIDIxLCAyNiwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsMjE4LDIyOCwyMzksMjQ0LDIyNiwyMjksCisgICAgMjM2LDIzOSwxMTksMTI4LCAzMCwyMjYsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLDIyMCwyMzIsMjM5LAorICAgIDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDIyMiwyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwKKyAgICAgMzAsMjI0LDI0NSwyMzgsMjMxLDIyNSwyNDIsMjQ1LDIzNywyMzYsMjI1LDI0NSwxMTYsMTI4LCAgMSwgODAsCisgICAgMTA1LDEyOSwgIDEsMTYyLCAyMSwgNTQsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LDIyNiwyNDIsMjI5LAorICAgIDI0NiwxMDEsMTI4LCAgMiwgMTQsMTA5LCAgNCwgMjEsIDc5LCAyMSwxMDcsIDIxLDE4NCwgMjEsMjAyLDIyNSwKKyAgICAyMjcsMjQyLDIzOSwxMTAsMTMwLCAgMSwgNzYsIDIxLCA5MSwgMjEsIDk5LDIyNSwyMjcsMjQ1LDI0NCwxMDEsCisgICAgMTI4LCAzMCwgODIsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLCA4MCwyMjksMjMxLCA5NywxMzIsIDMzLAorICAgICAzOCwgMjEsMTIxLCAyMSwxMzIsIDIxLDE0MCwgMjEsMTU2LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywKKyAgICAgOTksMTI4LCAgNCwgOTYsMjMxLDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDE2OSwyNDIsMjM5LDI0NSwyMzgsCisgICAgMjI4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMjIsMTE2LCAgMiwgMjEsMTYyLAorICAgICAyMSwxNzcsMjMzLDI0NCwyMzYsMjM5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKKyAgICAxMjQsMjM5LDIzOCwyMzksMTE1LDEyOCwgIDMsMTQzLDIzMywyMjcsMjQyLDIzOSwxMTAsMTI5LCAgMywxNTksCisgICAgIDIxLDE5NCwyNDQsMjM5LDIzOCwyMzksMTE1LDEyOCwgIDMsMTQwLDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LAorICAgIDIyNywxMDEsMTI4LDI1NSwgNDcsMjM4LDIyOSwyNDIsMjM5LDIzNywyMjUsMTEwLDEyOCwgMzMsIDk2LDExMSwKKyAgICAgIDIsIDIxLDIyOSwgMjEsMjQ4LDIzMSwyMzksMjM4LDIyOSwxMDcsMTI5LCAgMSwyMzQsIDIxLDIzOSwyMzcsCisgICAgMjI1LDIyNywyNDIsMjM5LDExMCwxMjgsICAxLDIzNiwyNDAsMjI5LDExMCwxMjgsICAxLDEzNCwxMTUsICAzLAorICAgICAyMiwgIDYsIDIyLCAzMywgMjIsIDQwLDIzNiwyMjUsMjQzLDEwNCwxMzAsICAwLDIxNiwgMjIsIDE3LCAyMiwKKyAgICAgMjUsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLDI1NCwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsCisgICAgMjQ4LDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDExMSwyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNSwyMjcsMjQ1LAorICAgIDI0NCwxMDEsMTI4LCAgMSwyNTQsMTE2LCAgMiwgMjIsIDU5LCAyMiwgNzAsMjI3LDI0OSwyNDIsMjMzLDIzNiwKKyAgICAyMzYsMjMzLCA5OSwxMjgsICA0LDEyNiwyMzMsMjM2LDIyOCwxMDEsMTMxLCAgMCwyMTMsIDIyLCA4MywgMjIsCisgICAgIDkxLCAyMiwxMDIsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLCA3NiwyMjgsMjMzLDIyOSwyNDIsMjI5LAorICAgIDI0MywyMzMsMTE1LDEyOCwgMzAsIDc4LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyNDUsIDgwLDEzNiwKKyAgICAgIDAsIDgwLCAyMiwxMzAsIDIyLDEzOCwgMjIsMTQ3LCAyMiwxNTksIDIyLDIxMSwgMjIsMjI3LCAyMiwyNDYsCisgICAgIDIzLCAgMiwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsIDg0LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLAorICAgIDEyOCwgMzYsMTk3LDIyOCwyMzksMjQ0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsIDg2LDEwMSwKKyAgICAgIDMsIDIyLDE2NywgMjIsMTc4LCAyMiwxOTAsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsCisgICAgICA0LCAzMSwyMzIsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA3NCwyMzcsMjMzLAorICAgIDIyOCwyMjgsMjM2LDIyOSwyMzIsMjM5LDIzOSwyMzUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwKKyAgICAxMjgsICA0LDE2NiwxMDQsICAyLCAyMiwyMTcsIDIyLDIyMSwxMDUsMTI4LCAgMywxNjYsMjM5LDIzOSwxMDcsCisgICAgMTI4LCAgMSwxNjQsMTA1LDEyOSwgIDMsMTYwLCAyMiwyMzMsMjQ3LDI0MiwyMjUsMjQyLDIzNywyMjksMjM4LAorICAgIDIzMywyMjUsMTEwLDEyOCwgIDUsIDgzLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwKKyAgICAyNTUsIDQ4LDExNSwgIDIsIDIzLCAgOCwgMjMsIDI1LDEwNSwxMjksICAzLDE2OCwgMjMsIDE0LDIyNywyNDksCisgICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMTIsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTEyLAorICAgICA4MSwxMzEsICAwLCA4MSwgMjMsIDQyLCAyMywgNTEsIDIzLCA2MywyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwKKyAgICAxMjgsIDM2LDE5OCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA0OSwyNDMsCisgICAgMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTEzLCA4MiwxMzgsICAwLCA4MiwgMjMsIDk1LCAyMywxMTksIDIzLAorICAgIDE2NiwgMjMsMjE3LCAyMywyMzAsIDIzLDI0MCwgMjMsMjQ1LCAyNCwgMTksIDI0LCAzMSwgMjQsIDQzLCA5NywKKyAgICAgIDIsIDIzLDEwMSwgMjMsMTEyLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNzYsCisgICAgMjI3LDI0NSwyNDQsMTAxLDEyOCwgIDEsIDg0LCA5OSwgIDQsIDIzLDEyOSwgMjMsMTM2LCAyMywxNDUsIDIzLAorICAgIDE1MywyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwgODgsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI4LCAgMSwKKyAgICAgODYsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM2LDE5OSwyMzksMjM3LDIzNywyMjUsMjI1LDIyNywyMjcsCisgICAgMjI5LDIzOCwxMTYsMTI4LCAgMSwgODYsMTAwLCAgMiwgMjMsMTcyLCAyMywxODIsMjI2LDIzNiwyMzEsMjQyLAorICAgIDIyNSwyNDYsMTAxLDEyOCwgIDIsIDE2LDIzOSwxMTYsICAyLCAyMywxODksIDIzLDE5OCwyMjUsMjI3LDIyNywKKyAgICAyMjksMjM4LDExNiwxMjgsIDMwLCA4OCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOSwgMzAsIDkwLCAyMywyMDgsCisgICAgMjM3LDIyNSwyMjcsMjQyLDIzOSwxMTAsMTI4LCAzMCwgOTIsMjI5LDIzMiwyMjUsMjQyLDIzNywyMjksMjM4LAorICAgIDIzMywyMjUsMTEwLDEyOCwgIDUsIDgwLDIzMCwyNDIsMjI1LDIzNSwyNDQsMjQ1LDExNCwxMjgsIDMzLCAyOCwKKyAgICAyMzIsMTExLDEyOCwgIDMsMTYxLDIzMywxMTAsICAyLCAyMywyNTIsIDI0LCAgNSwyMzEsMjQzLDIzNywyMjUsCisgICAgMjM2LDEwOCwxMjgsMjQ2LDI1MiwyNDYsMjI5LDI0MiwyNDQsMjI5LDIyOCwyMjYsMjQyLDIyOSwyNDYsMTAxLAorICAgIDEyOCwgIDIsIDE4LDIzNiwyMzMsMjM4LDIyOSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDk0LDIzNywKKyAgICAyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDUwLDI0MywyMzcsMjI1LDIzNiwxMDgsCisgICAgMTI5LDI0NywxMTQsIDI0LCA1MywyMzMsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksMTAwLDEyOSwgIDIsMTI5LAorICAgICAyNCwgNjYsMjQzLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsICAyLDE4MiwgODMsMTM5LCAgMCwKKyAgICAgODMsIDI0LDEwMywgMjYsIDE3LCAyNiwgNTUsIDI2LDE4MiwgMjYsMjIxLCAyNiwyNTAsIDI3LCA4NCwgMjcsCisgICAgMTA1LCAyNywxMTcsIDI3LDEzNSwgMjcsMTQzLCA3MCwgIDYsIDI0LDExNywgMjQsMjA5LCAyNCwyNDEsIDI1LAorICAgICA3NywgMjUsMTE5LCAyNSwyMjEsIDQ4LCAgOSwgMjQsMTM3LCAyNCwxNDUsIDI0LDE1MywgMjQsMTYxLCAyNCwKKyAgICAxNjksIDI0LDE3NywgMjQsMTg1LCAyNCwxOTMsIDI0LDIwMSwxNzcsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsCisgICAgIDEyLDE3OCwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgMjAsMTc5LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LAorICAgICAxNiwxODAsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsIDI0LDE4MSwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywKKyAgICAgNjAsMTgyLDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCA0NCwxODMsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsCisgICAgIDUyLDE4NCwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgMjgsMTg1LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LAorICAgICAzNiwgNDksICAzLCAyNCwyMTcsIDI0LDIyNSwgMjQsMjMzLDE3NiwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywKKyAgICAgIDAsMTc3LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCAgMiwxODUsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsCisgICAgIDk3LCA1MCwgIDksIDI1LCAgNSwgMjUsIDEzLCAyNSwgMjEsIDI1LCAyOSwgMjUsIDM3LCAyNSwgNDUsIDI1LAorICAgICA1MywgMjUsIDYxLCAyNSwgNjksMTc2LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCA5OCwxNzcsMTc2LDE3NiwKKyAgICAxNzYsIDQ4LDEyOCwgMzcsIDg2LDE3OCwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgODUsMTc5LDE3NiwxNzYsCisgICAgMTc2LCA0OCwxMjgsIDM3LCA5OSwxODAsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsIDgxLDE4MSwxNzYsMTc2LAorICAgIDE3NiwgNDgsMTI4LCAzNywgODcsMTgyLDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCA5MywxODMsMTc2LDE3NiwKKyAgICAxNzYsIDQ4LDEyOCwgMzcsIDkyLDE4NCwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgOTEsIDUxLCAgNCwgMjUsCisgICAgIDg3LCAyNSwgOTUsIDI1LDEwMywgMjUsMTExLDE4MiwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgOTQsMTgzLAorICAgIDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCA5NSwxODQsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsIDkwLDE4NSwKKyAgICAxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgODQsIDUyLCAxMCwgMjUsMTQxLCAyNSwxNDksIDI1LDE1NywgMjUsCisgICAgMTY1LCAyNSwxNzMsIDI1LDE4MSwgMjUsMTg5LCAyNSwxOTcsIDI1LDIwNSwgMjUsMjEzLDE3NiwxNzYsMTc2LAorICAgIDE3NiwgNDgsMTI4LCAzNywxMDUsMTc3LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LDEwMiwxNzgsMTc2LDE3NiwKKyAgICAxNzYsIDQ4LDEyOCwgMzcsIDk2LDE3OSwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgODAsMTgwLDE3NiwxNzYsCisgICAgMTc2LCA0OCwxMjgsIDM3LDEwOCwxODEsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsMTAzLDE4MiwxNzYsMTc2LAorICAgIDE3NiwgNDgsMTI4LCAzNywxMDQsMTgzLDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LDEwMCwxODQsMTc2LDE3NiwKKyAgICAxNzYsIDQ4LDEyOCwgMzcsMTAxLDE4NSwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgODksIDUzLCAgNSwgMjUsCisgICAgMjMzLCAyNSwyNDEsIDI1LDI0OSwgMjYsICAxLCAyNiwgIDksMTc2LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LAorICAgICA4OCwxNzcsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsIDgyLDE3OCwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywKKyAgICAgODMsMTc5LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LDEwNywxODAsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsCisgICAgMTA2LCA5NywgIDIsIDI2LCAyMywgMjYsIDQ0LDIyNywyNDUsMjQ0LDEwMSwxMjksICAxLCA5MCwgMjYsIDMyLAorICAgIDIyOCwyMzksMjQ0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsMTAwLDIzNywyNDAsMjMzLDIzMSwKKyAgICAyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywyMjQsIDk5LCAgNSwgMjYsIDY3LCAyNiwgOTgsIDI2LDEwNywgMjYsCisgICAgMTQ3LCAyNiwxNjksMjI1LDI0MiwyMzksMTEwLDEzMCwgIDEsIDk2LCAyNiwgNzgsIDI2LCA5MCwyMjgsMjM5LAorICAgIDI0NCwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsIDMwLDEwMiwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwKKyAgICAyNDYsMjUzLDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgIDEsIDk0LDIzMiwyNDcsIDk3LDEzMCwgIDEsCisgICAgMTQzLCAyNiwxMTcsIDI2LDEyOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjE2LAorICAgIDIyOCwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywyNDMsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwKKyAgICAxMjgsICA0LDIxOCwyMzMsMjQyLCA5OSwgIDIsIDI2LDE1NSwgMjYsMTYwLDIzNiwxMDEsMTI4LCAzNiwyMDAsCisgICAgMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTI4LCAgMSwgOTIsMjM5LDIzNywyMzcsMjI1LDIyNSwyMjcsMjI3LAorICAgIDIyOSwyMzgsMTE2LDEyOCwgIDIsIDI0LDIyOCwyMzksMTE2LCAgMiwgMjYsMTkwLCAyNiwxOTksMjI1LDIyNywKKyAgICAyMjcsMjI5LDIzOCwxMTYsMTI4LCAzMCwgOTYsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjksIDMwLCA5OCwgMjYsCisgICAgMjA5LDIyOCwyMzksMjQ0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsMTA0LDEwMSwgIDIsIDI2LAorICAgIDIyNywgMjYsMjM5LDIzMiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDc3LDI0NiwKKyAgICAyMjksMjM4LDI0MiwyMzksMjM3LDIyNSwxMTAsMTI4LCAzMywxMDIsMTA0LCAgNSwgMjcsICA2LCAyNywgMzQsCisgICAgIDI3LCA0OCwgMjcsIDU5LCAyNywgNzIsIDk3LCAgMiwgMjcsIDEyLCAyNywgMjMsMjI1LDI0MiwyMzcsMjI5LAorICAgIDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA3MSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKKyAgICAgIDQsIDQwLDIyNywyMzIsMjI1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNDEsCisgICAgMjI5LDIzMywyMjcsMjM5LDI0MCwyNDQsMjMzLCA5OSwxMjgsICAzLDIyNiwyMzIsMjI1LDIyNywyNDksMjQyLAorICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxODYsMjMzLDIzNywyMjUsMjI3LDIzOSwyNDAsMjQ0LDIzMywKKyAgICAgOTksMTI4LCAgMywyMzYsMTA1LCAgMiwgMjcsIDkwLCAyNywgOTYsMjMxLDIzNywgOTcsMTI4LCAgMywxNjMsCisgICAgMjQ4LDI0MiwyMzksMjM3LDIyNSwxMTAsMTI4LCAzMywxMDEsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LAorICAgIDIyNywxMDEsMTI4LDI1NSwgNTEsMjM5LDIzMCwyNDQsMjQzLDIzMywyMzEsMjM4LDIyNywyNDksMjQyLDIzMywKKyAgICAyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNDQsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDExNSwyNDQsCisgICAgMjMzLDIzMSwyMzcsMjI1LDIzMSwyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywyMTgsIDg0LDE0MSwgIDAsIDg0LAorICAgICAyNywxODYsIDI3LDE5MSwgMjcsMTk3LCAyOCwgIDcsIDI4LCAzMiwgMjgsIDk2LCAyOCwxNDcsIDI4LDE3NywKKyAgICAgMjgsMTg5LCAyOCwyMDEsIDI4LDI0NiwgMjksICA2LCAyOSwgNDYsMjI1LDExNywxMjgsICAzLDE2NCwyMjYsCisgICAgMjI1LDExNCwxMjgsICAxLDEwMiwgOTksICA0LCAyNywyMDcsIDI3LDIxNCwgMjcsMjIzLCAyNywyNTAsMjI1LAorICAgIDI0MiwyMzksMTEwLDEyOCwgIDEsMTAwLDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgIDEsIDk4LDIzMywKKyAgICAyNDIsIDk5LCAgMiwgMjcsMjMxLCAyNywyMzYsMjM2LDEwMSwxMjgsIDM2LDIwMSwyNDUsMjM3LDIzMCwyMzYsCisgICAgMjI5LDI0OCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTEyLDIzOSwyMzcsMjM3LDIyNSwyMjUsMjI3LAorICAgIDIyNywyMjksMjM4LDExNiwxMjgsICAxLCA5OCwyMjgsMjM5LDExNiwgIDIsIDI4LCAxNSwgMjgsIDI0LDIyNSwKKyAgICAyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsMTA2LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxMDgsCisgICAgMTAxLCAgNCwgMjgsIDQyLCAyOCwgNTMsIDI4LCA3MywgMjgsIDgyLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LAorICAgIDIzMywgOTksMTI4LCAgNCwgMzQsMjI4LDIyOSwyNDMsMjI3LDIyOSwyMzgsMjI4LDIyOSwyNDIsMjI3LDI0OSwKKyAgICAyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE3MiwyMzgsMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsCisgICAgIDMzLDEwNSwyNDQsMjQzLDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTgwLAorICAgIDEwNCwgIDMsIDI4LDEwNCwgMjgsMTEwLCAyOCwxMzYsMjI5LDI0NCwgOTcsMTI4LCAgMywxNTIsMTExLCAgMiwKKyAgICAgMjgsMTE2LCAyOCwxMjEsMjM5LDEwNywxMjgsICAxLDE3MiwyNDIsMTEwLDEyOSwgIDAsMjIyLCAyOCwxMjgsCisgICAgMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI1NCwyNDIsMjI5LDIyOSwyNDIsMjM5LDIzNywyMjUsMTEwLAorICAgIDEyOCwgMzMsIDk4LDEwNSwgIDIsIDI4LDE1MywgMjgsMTY0LDIzNiwyMjgsMjI5LDI0MywyMzcsMjI1LDIzNiwKKyAgICAxMDgsMTI4LDI0NiwyNTQsMjQ3LDIzOCwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsCisgICAgIDc5LDIzNiwyMzMsMjM4LDIyOSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTEwLDIzNywyMzksMjM4LAorICAgIDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDUyLDExMSwgIDIsIDI4LDIwNywgMjgsMjE4LDIyNSwKKyAgICAyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNTcsMjM4LDEwMSwgIDMsIDI4LDIyNywgMjgsCisgICAgMjM0LCAyOCwyNDAsMjMwLDIzMywyNDYsMTAxLDEyOCwgIDEsMTg4LDI0MywyMzMsMTIwLDEyOCwgIDEsMTMyLAorICAgIDI0NCwyNDcsMTExLDEyOCwgIDEsMTY3LDI0MiwyMjksMjQ0LDI0MiwyMzksMjMwLDIzNiwyMjksMjQ4LDIzMiwKKyAgICAyMzksMjM5LDEwNywxMjgsICAxLDE3NCwxMTUsICAzLCAyOSwgMTQsIDI5LCAyNiwgMjksIDM5LDIyOSwyMjcsCisgICAgMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDM4LDIzMiwyMjksMjI3LDI0OSwyNDIsMjMzLAorICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAxMSwyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxMTYsMTE5LCAgMiwKKyAgICAgMjksIDUyLCAyOSwgNjQsMjI5LDIzNiwyNDYsMjI5LDI0MiwyMzksMjM3LDIyNSwxMTAsMTI4LCAzMywxMDcsCisgICAgMjM5LDI0MiwyMzksMjM3LDIyNSwxMTAsMTI4LCAzMywgOTcsIDg1LDE0MiwgIDAsIDg1LCAyOSwxMDUsIDI5LAorICAgIDEyMywgMjksMTMxLCAyOSwxOTgsIDMwLCA2OSwgMzAsIDg3LCAzMCwxOTgsIDMwLDIxNCwgMzAsMjI2LCAzMSwKKyAgICAgMjEsIDMxLCAzMCwgMzEsMTQyLCAzMSwxNDksIDMxLDIxOSwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOSwgIDAsCisgICAgMjE4LCAyOSwxMTUsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI1MCwyMjYsMjQyLDIyOSwyNDYsMTAxLAorICAgIDEyOCwgIDEsMTA4LCA5OSwgIDMsIDI5LDEzOSwgMjksMTQ2LCAyOSwxODgsMjI1LDI0MiwyMzksMTEwLDEyOCwKKyAgICAgIDEsMjExLDIzMywyNDIsIDk5LCAgMiwgMjksMTU0LCAyOSwxNTksMjM2LDEwMSwxMjgsIDM2LDIwMiwyNDUsCisgICAgMjM3LDIzMCwyMzYsMjI5LDEyMCwxMzAsICAwLDIxOSwgMjksMTcyLCAyOSwxODAsMjI2LDIyOSwyMzYsMjM5LAorICAgIDExOSwxMjgsIDMwLDExOCwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMjUxLDI0OSwyNDIsMjMzLDIzNiwKKyAgICAyMzYsMjMzLCA5OSwxMjgsICA0LCAzNSwxMDAsICAzLCAyOSwyMDYsIDI5LDIyOSwgMzAsIDU5LDIyNiwxMDgsCisgICAgICAyLCAyOSwyMTMsIDI5LDIyMSwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgIDEsMTEyLDIzMSwyNDIsMjI1LAorICAgIDI0NiwxMDEsMTI4LCAgMiwgMjAsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEzNCwgIDAsMjIwLCAyOSwKKyAgICAyNTEsIDMwLCAgMywgMzAsIDExLCAzMCwgMzQsIDMwLCA0MiwgMzAsIDUxLDIyNSwyMjcsMjQ1LDI0NCwxMDEsCisgICAgMTI4LCAgMSwyMTUsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDExNCwgOTksICAyLCAzMCwgMTcsIDMwLAorICAgICAyNCwyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMTcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKKyAgICAgIDQsMjQwLDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAgMSwyMTksMjM3LDIyNSwyMjcsMjQyLDIzOSwxMTAsCisgICAgMTI4LCAgMSwyMTMsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI1MiwyMzksMjQ0LDIyNiwyMjksMjM2LAorICAgIDIzOSwxMTksMTI4LCAzMCwyMjgsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjksICAwLDIxNywgMzAsIDc5LDI0MywKKyAgICAyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyNDksMTA0LCAgMiwgMzAsIDkzLCAzMCwxNzEsMTExLCAgMiwgMzAsCisgICAgIDk5LCAzMCwxMDksMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMjMwLDI0MiwxMTAsMTMzLAorICAgICAgMSwxNzUsIDMwLDEyNCwgMzAsMTMyLCAzMCwxNDMsIDMwLDE1MSwgMzAsMTYzLDIyNSwyMjcsMjQ1LDI0NCwKKyAgICAxMDEsMTI4LCAzMCwyMzIsMjI4LDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDI0MCwyMzEsCisgICAgMjQyLDIyNSwyNDYsMTAxLDEyOCwgMzAsMjM0LDIzMiwyMzksMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLAorICAgIDEyOCwgMzAsMjM2LDI0NCwyMzMsMjM2LDIyOCwxMDEsMTI4LCAzMCwyMzgsMjQ1LDIzOCwyMzEsMjI1LDI0MiwKKyAgICAyNDUsMjM3LDIzNiwyMjUsMjQ1LDExNiwxMjksICAxLDExMiwgMzAsMTg3LDIyNywyNDksMjQyLDIzMywyMzYsCisgICAgMjM2LDIzMywgOTksMTI4LCAgNCwyNDIsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDQsMjI5LDIyOCwyMjYsMjQyLAorICAgIDIyOSwyNDYsMTAxLDEyOCwgIDIsIDIyLDIzNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKKyAgICAgIDQsMTIwLDEwOSwgIDIsIDMwLDIzMiwgMzEsIDEwLDIyNSwyMjcsMjQyLDIzOSwxMTAsMTMwLCAgMSwxMDYsCisgICAgIDMwLDI0NCwgMzAsMjU1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMzgsMjI4LAorICAgIDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjgsIDMwLDEyMiwyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwKKyAgICAyMjcsMTAxLDEyOCwyNTUsIDUzLDIzOSwyMzEsMjM5LDIzOCwyMjksMTA3LDEyOCwgIDEsMTE0LDI0MCwyNDMsCisgICAgMjMzLDIzNiwyMzksMTEwLDEzMywgIDMsMTY1LCAzMSwgNDksIDMxLCA1MywgMzEsIDkwLCAzMSwxMjEsIDMxLAorICAgIDEzNCwgNDksMTI4LCAgMywyMTAsIDk3LCAgMiwgMzEsIDU5LCAzMSwgODEsMjI3LDI0NSwyNDQsMjI5LDIzMiwKKyAgICAyMzksMjM5LDIzNSwyNDMsMjQ5LDIzNywyMjYsMjM5LDIzNiwyMzEsMjQyLDIyOSwyMjksMTA3LDEyOCwgIDMsCisgICAgMjExLDIzMCwyNDIsMjMzLDIyNywyMjUsMTEwLDEyOCwgIDEsMTc3LDIyOCwyMzMsMjI5LDI0MiwyMjksMjQzLAorICAgIDIzMywxMTUsMTI5LCAgMywxNzEsIDMxLDEwMywyMzIsMjM5LDIzOSwyMzUsMjQzLDI0OSwyMzcsMjI2LDIzOSwKKyAgICAyMzYsMjMxLDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDIxMiwyMzIsMjM5LDIzOSwyMzUsMjQzLDI0OSwyMzcsCisgICAgMjI2LDIzOSwxMDgsMTI4LCAgMywyMTAsMjQ0LDIzOSwyMzgsMjM5LDExNSwxMjgsICAzLDE0MiwyNDIsMjMzLAorICAgIDIzOCwxMDMsMTI4LCAgMSwxMTAsMTE1LCAgMywgMzEsMTU3LCAzMSwxNzIsIDMxLDE3OSwyMzIsMjM5LDI0MiwKKyAgICAyNDQsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAxNCwyMzcsMjI1LDIzNiwxMDgsCisgICAgMTI4LDI0NywxMTcsMjQ0LDI0MiwyMjUsMjMzLDIzMSwyMzIsMTE2LCAgMiwgMzEsMTkxLCAzMSwyMDIsMjI3LAorICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE3NCwyNDMsMjQ0LDI0MiwyMzksMjM1LDIyOSwKKyAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTc2LDI0NCwyMzMsMjM2LDIyOCwxMDEsCisgICAgMTMwLCAgMSwxMDQsIDMxLDIzMSwgMzEsMjM5LDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwxMjAsMjI2LAorICAgIDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDExNiwgODYsMTM2LCAgMCwgODYsIDMyLCAxMSwgMzIsIDIwLCAzMiwKKyAgICAgMzEsIDMyLCA2MCwgMzIsIDY3LCAzMiwgNzksIDMyLCA5MSwgMzIsIDk5LDIyNywyMzMsMjQyLDIyNywyMzYsCisgICAgMTAxLDEyOCwgMzYsMjAzLDIyOCwyMzksMjQ0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxMjYsMTAxLAorICAgICAgMiwgMzIsIDM3LCAzMiwgNDgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAxOCwKKyAgICAyNDcsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA3OCwyMzIsMjM5LDIzOSwxMDcsCisgICAgMTI4LCAgMSwxNzgsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNTQsMjM5LAorICAgIDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNzIsMjQzLDIzNywyMjUsMjM2LDEwOCwKKyAgICAxMjgsMjQ3LDExOCwyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwgMzAsMTI0LCA4NywxMzQsICAwLCA4NywgMzIsCisgICAgMTIzLCAzMiwxMzEsIDMyLDE1NCwgMzIsMTk0LCAzMiwyMDIsIDMyLDIxNCwyMjUsMjI3LDI0NSwyNDQsMTAxLAorICAgIDEyOCwgMzAsMTMwLDIyNywyMzMsMjQyLCA5OSwgIDIsIDMyLDE0MCwgMzIsMTQ1LDIzNiwxMDEsMTI4LCAzNiwKKyAgICAyMDQsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTI4LCAgMSwxMTYsMTAwLCAgMiwgMzIsMTYwLCAzMiwxNzAsCisgICAgMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEyOCwgMzAsMTMyLDIzOSwxMTYsICAyLCAzMiwxNzcsIDMyLAorICAgIDE4NiwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsIDMwLDEzNCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwKKyAgICAgMzAsMTM2LDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAzMCwxMjgsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsCisgICAgMjI1LDIyNywxMDEsMTI4LDI1NSwgNTUsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDExOSwgODgsMTM0LAorICAgICAgMCwgODgsIDMyLDIzOCwgMzIsMjQ3LCAzMywgMTgsIDMzLCAzMSwgMzMsIDM1LCAzMywgNDcsMjI3LDIzMywKKyAgICAyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwyMDUsMTAwLCAgMiwgMzIsMjUzLCAzMywgIDcsMjMzLDIyOSwyNDIsCisgICAgMjI5LDI0MywyMzMsMTE1LDEyOCwgMzAsMTQwLDIzOSwyNDQsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LAorICAgICAzMCwxMzgsMjI5LDIzMiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDYxLDEwNSwKKyAgICAxMjgsICAzLDE1OCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA1NiwyNDMsCisgICAgMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTIwLCA4OSwxMzksICAwLCA4OSwgMzMsIDgxLCAzMywxMTYsIDMzLAorICAgIDEzOSwgMzMsMTg5LCAzMywyMjgsIDMzLDIzNiwgMzMsMjUzLCAzNCwgNDAsIDM0LCA1MiwgMzQsIDYwLCAzNCwKKyAgICAgNjgsIDk3LCAgMiwgMzMsIDg3LCAzMywxMDQsMjI3LDI0NSwyNDQsMTAxLDEyOSwgIDAsMjIxLCAzMywgOTYsCisgICAgMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI1MywyNDQsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLAorICAgICA5OSwxMjgsICA0LCA5OCwyMjcsMjMzLDI0MiwgOTksICAyLCAzMywxMjUsIDMzLDEzMCwyMzYsMTAxLDEyOCwKKyAgICAgMzYsMjA2LDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOCwgIDEsMTE4LDEwMCwgIDIsIDMzLDE0NSwgMzMsCisgICAgMTY1LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjksICAxLDEyMCwgMzMsMTU3LDI0MywyMzcsMjI1LAorICAgIDIzNiwxMDgsMTI4LDI0NywyNTUsMjM5LDExNiwgIDIsIDMzLDE3MiwgMzMsMTgxLDIyNSwyMjcsMjI3LDIyOSwKKyAgICAyMzgsMTE2LDEyOCwgMzAsMTQyLDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwyNDQsMjI5LDExNCwgIDIsCisgICAgIDMzLDE5NiwgMzMsMjA4LDIzMywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDQzLAorICAgIDI0NSwyMjgsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMjQzLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywKKyAgICAgOTksMTI4LCAgNCwyNDgsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLDI0MiwyMzIsMjM5LDIzOSwxMDcsCisgICAgMTI5LCAgMSwxNzksIDMzLDI0NSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMjQ2LDEwNSwgIDMsIDM0LAorICAgICAgNSwgMzQsIDE2LCAzNCwgMjcsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA2OSwKKyAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsICA3LDI0NywyMzgsMjI1LDI0MiwyMzcsCisgICAgMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA4MiwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LAorICAgIDEwMSwxMjgsMjU1LCA1NywyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTIxLDI0NCwyMzMsMjM2LDIyOCwKKyAgICAxMDEsMTI4LCAzMCwyNDgsMjQ1LDExNSwgIDIsIDM0LCA3NSwgMzQsMTEzLDIyNiwyMzMsMTAzLCAgMiwgMzQsCisgICAgIDgzLCAzNCwgOTQsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDEwNiwyMzMsMjM5LAorICAgIDI0NCwyMzMsMjMwLDIzMywyMjksMjI4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKKyAgICAxMDgsMjM2LDIzMywyNDQsMjQ0LDIzNiwxMDEsICAyLCAzNCwxMjQsIDM0LDEzNSwyMjcsMjQ5LDI0MiwyMzMsCisgICAgMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTAyLDIzMywyMzksMjQ0LDIzMywyMzAsMjMzLDIyOSwyMjgsMjI3LAorICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDEwNCwgOTAsMTM2LCAgMCwgOTAsIDM0LDE3NCwKKyAgICAgMzQsMTk4LCAzNCwyNDMsIDM1LCAxNCwgMzUsIDgxLCAzNSwxNzMsIDM1LDE4NSwgMzUsMTk3LCA5NywgIDIsCisgICAgIDM0LDE4MCwgMzQsMTkxLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNTQsMjI3LAorICAgIDI0NSwyNDQsMTAxLDEyOCwgIDEsMTIxLCA5OSwgIDIsIDM0LDIwNCwgMzQsMjIxLDIyNSwyNDIsMjM5LDExMCwKKyAgICAxMjksICAxLDEyNSwgMzQsMjEzLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NiwyNTUsMjMzLDI0MiwgOTksCisgICAgICAyLCAzNCwyMjksIDM0LDIzNCwyMzYsMTAxLDEyOCwgMzYsMjA3LDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLAorICAgIDEyOCwgMzAsMTQ0LDIyOCwyMzksMTE2LDEzMCwgIDEsMTIzLCAzNCwyNTMsIDM1LCAgNiwyMjUsMjI3LDIyNywKKyAgICAyMjksMjM4LDExNiwxMjgsICAxLDEyMywyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTQ2LDEwMSwgIDMsCisgICAgIDM1LCAyMiwgMzUsIDMzLCAzNSwgNzYsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAorICAgICAyMywxMDAsICAyLCAzNSwgMzksIDM1LCA1OCwyMjksMjQzLDIyNywyMjksMjM4LDIyOCwyMjksMjQyLDIyNywKKyAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNTIsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsCisgICAgMjQzLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMjIsMjQ0LCA5NywxMjgsICAzLAorICAgIDE1MCwyMzIsMTAxLCAgNCwgMzUsIDkyLCAzNSwxMDMsIDM1LDExOSwgMzUsMTMwLDIyNSwyNDIsMjM3LDIyOSwKKyAgICAyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNTgsMjI2LDI0MiwyMjksMjQ2LDIyOSwyMjcsMjQ5LDI0MiwyMzMsCisgICAgMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTkzLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LAorICAgICAgNCwgMjIsMTAwLCAgMiwgMzUsMTM2LCAzNSwxNTUsMjI5LDI0MywyMjcsMjI5LDIzOCwyMjgsMjI5LDI0MiwKKyAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTUwLDIzMywyMjksMjQyLDIyOSwyNDMsCisgICAgMjMzLDI0MywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjIwLDIzNiwyMzMsMjM4LAorICAgIDIyOSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTQ4LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwKKyAgICAyMjcsMTAxLDEyOCwyNTUsIDU4LDExNSwgIDIsIDM1LDIwMywgMzUsMjEwLDIzNywyMjUsMjM2LDEwOCwxMjgsCisgICAgMjQ3LDEyMiwyNDQsMjQyLDIzOSwyMzUsMTAxLDEyOCwgIDEsMTgxLCA5NywxNTgsICAwLCA5NywgMzYsIDI2LAorICAgICAzOCwxNTQsIDM5LCAgNCwgMzksIDY4LCAzOSwxMzIsIDM5LDE5NiwgNDAsICA0LCA0MCwgNjgsIDQwLDEyNiwKKyAgICAgNDAsMTkwLCA0MSwgNzAsIDQxLDIxNywgNDIsMTM3LCA0MiwyMzcsIDQzLCAxNywgNDksMTkyLCA0OSwyMjksCisgICAgIDUwLCAgMCwgNTAsMjI1LCA1MSwgIDcsIDUyLCA5NiwgNTIsMTY4LCA1MywxMjMsIDUzLDEzMiwgNTQsICA1LAorICAgICA1NiwgMTMsIDU3LCAgMywgNTcsIDUwLCA1NywyMDEsIDU3LDIxNSwgNDksMTM4LCAzOSwgIDEsIDM2LCA1MCwKKyAgICAgMzYsMTE0LCAzNiwxNTQsIDM2LDIxOCwgMzcsIDI2LCAzNywgOTAsIDM3LDE1NCwgMzcsMjE4LCAzOCwgMjYsCisgICAgIDM4LCA5MCwgNDgsMTM4LCAzOSwgMzMsIDM2LCA3NCwgMzYsIDc4LCAzNiwgODIsIDM2LCA4NiwgMzYsIDkwLAorICAgICAzNiwgOTQsIDM2LCA5OCwgMzYsMTAyLCAzNiwxMDYsIDM2LDExMCwgNDgsMTI4LCAzOSwgOTQsIDQ5LDEyOCwKKyAgICAgMzksIDk3LCA1MCwxMjgsIDM5LCA5OCwgNTEsMTI4LCAzOSwgOTksIDUyLDEyOCwgMzksMTAwLCA1MywxMjgsCisgICAgIDM5LCAxNiwgNTQsMTI4LCAzOSwxMDEsIDU1LDEyOCwgMzksMTAyLCA1NiwxMjgsIDM5LDEwMywgNTcsMTI4LAorICAgICAzOCwgOTYsIDQ5LDEzNCwgMzgsIDI3LCAzNiwxMzAsIDM2LDEzNCwgMzYsMTM4LCAzNiwxNDIsIDM2LDE0NiwKKyAgICAgMzYsMTUwLCA0OCwxMjgsIDM4LDEwMSwgNDksMTI4LCAzOCwxMDIsIDUwLDEyOCwgMzgsIDk5LCA1NSwxMjgsCisgICAgIDM5LCAgOSwgNTYsMTI4LCAzOSwgIDgsIDU3LDEyOCwgMzksICA3LCA1MCwxMzgsIDM4LCAzMCwgMzYsMTc4LAorICAgICAzNiwxODIsIDM2LDE4NiwgMzYsMTkwLCAzNiwxOTQsIDM2LDE5OCwgMzYsMjAyLCAzNiwyMDYsIDM2LDIxMCwKKyAgICAgMzYsMjE0LCA0OCwxMjgsIDM2LCA5NiwgNDksMTI4LCAzNiwgOTcsIDUwLDEyOCwgMzYsIDk4LCA1MSwxMjgsCisgICAgIDM2LCA5OSwgNTIsMTI4LCAzNiwxMDAsIDUzLDEyOCwgMzYsMTAxLCA1NCwxMjgsIDM2LDEwMiwgNTUsMTI4LAorICAgICAzNiwxMDMsIDU2LDEyOCwgMzYsMTA0LCA1NywxMjgsIDM2LDEwNSwgNTEsMTM4LCAzOSwgMTIsIDM2LDI0MiwKKyAgICAgMzYsMjQ2LCAzNiwyNTAsIDM2LDI1NCwgMzcsICAyLCAzNywgIDYsIDM3LCAxMCwgMzcsIDE0LCAzNywgMTgsCisgICAgIDM3LCAyMiwgNDgsMTI4LCAzOSwxMTgsIDQ5LDEyOCwgMzksMTE5LCA1MCwxMjgsIDM5LDEyMCwgNTEsMTI4LAorICAgICAzOSwxMjEsIDUyLDEyOCwgMzksMTIyLCA1MywxMjgsIDM5LDEyMywgNTQsMTI4LCAzOSwxMjQsIDU1LDEyOCwKKyAgICAgMzksMTI1LCA1NiwxMjgsIDM5LDEyNiwgNTcsMTI4LCAzOSwxMjcsIDUyLDEzOCwgMzksIDEzLCAzNywgNTAsCisgICAgIDM3LCA1NCwgMzcsIDU4LCAzNywgNjIsIDM3LCA2NiwgMzcsIDcwLCAzNywgNzQsIDM3LCA3OCwgMzcsIDgyLAorICAgICAzNywgODYsIDQ4LDEyOCwgMzksMTI4LCA0OSwxMjgsIDM5LDEyOSwgNTAsMTI4LCAzOSwxMzAsIDUxLDEyOCwKKyAgICAgMzksMTMxLCA1MiwxMjgsIDM5LDEzMiwgNTMsMTI4LCAzOSwxMzMsIDU0LDEyOCwgMzksMTM0LCA1NSwxMjgsCisgICAgIDM5LDEzNSwgNTYsMTI4LCAzOSwxMzYsIDU3LDEyOCwgMzksMTM3LCA1MywxMzgsIDM5LCAxNCwgMzcsMTE0LAorICAgICAzNywxMTgsIDM3LDEyMiwgMzcsMTI2LCAzNywxMzAsIDM3LDEzNCwgMzcsMTM4LCAzNywxNDIsIDM3LDE0NiwKKyAgICAgMzcsMTUwLCA0OCwxMjgsIDM5LDEzOCwgNDksMTI4LCAzOSwxMzksIDUwLDEyOCwgMzksMTQwLCA1MSwxMjgsCisgICAgIDM5LDE0MSwgNTIsMTI4LCAzOSwxNDIsIDUzLDEyOCwgMzksMTQzLCA1NCwxMjgsIDM5LDE0NCwgNTUsMTI4LAorICAgICAzOSwxNDUsIDU2LDEyOCwgMzksMTQ2LCA1NywxMjgsIDM5LDE0NywgNTQsMTM4LCAzOSwgMTUsIDM3LDE3OCwKKyAgICAgMzcsMTgyLCAzNywxODYsIDM3LDE5MCwgMzcsMTk0LCAzNywxOTgsIDM3LDIwMiwgMzcsMjA2LCAzNywyMTAsCisgICAgIDM3LDIxNCwgNDgsMTI4LCAzOSwxNDgsIDQ5LDEyOCwgMzMsMTQ2LCA1MCwxMjgsIDM5LDE2MywgNTEsMTI4LAorICAgICAzMywxNDgsIDUyLDEyOCwgMzMsMTQ5LCA1MywxMjgsIDM5LDE1MywgNTQsMTI4LCAzOSwxNTUsIDU1LDEyOCwKKyAgICAgMzksMTU2LCA1NiwxMjgsIDM5LDE1NywgNTcsMTI4LCAzOSwxNTgsIDU1LDEzOCwgMzksIDE3LCAzNywyNDIsCisgICAgIDM3LDI0NiwgMzcsMjUwLCAzNywyNTQsIDM4LCAgMiwgMzgsICA2LCAzOCwgMTAsIDM4LCAxNCwgMzgsIDE4LAorICAgICAzOCwgMjIsIDQ4LDEyOCwgMzksMTU5LCA0OSwxMjgsIDM5LDE2MCwgNTAsMTI4LCAzOSwxNjEsIDUxLDEyOCwKKyAgICAgMzksMTYyLCA1MiwxMjgsIDM5LDE2NCwgNTMsMTI4LCAzOSwxNjUsIDU0LDEyOCwgMzksMTY2LCA1NSwxMjgsCisgICAgIDM5LDE2NywgNTYsMTI4LCAzOSwxNjgsIDU3LDEyOCwgMzksMTY5LCA1NiwxMzgsIDM5LCAxOCwgMzgsIDUwLAorICAgICAzOCwgNTQsIDM4LCA1OCwgMzgsIDYyLCAzOCwgNjYsIDM4LCA3MCwgMzgsIDc0LCAzOCwgNzgsIDM4LCA4MiwKKyAgICAgMzgsIDg2LCA0OCwxMjgsIDM5LDE3MSwgNDksMTI4LCAzOSwxNzMsIDUwLDEyOCwgMzksMTc1LCA1MSwxMjgsCisgICAgIDM5LDE3OCwgNTIsMTI4LCAzOSwxNzksIDUzLDEyOCwgMzksMTgxLCA1NCwxMjgsIDM5LDE4NCwgNTUsMTI4LAorICAgICAzOSwxODYsIDU2LDEyOCwgMzksMTg3LCA1NywxMjgsIDM5LDE4OCwgNTcsMTM4LCAzOSwgMTksIDM4LDExNCwKKyAgICAgMzgsMTE4LCAzOCwxMjIsIDM4LDEyNiwgMzgsMTMwLCAzOCwxMzQsIDM4LDEzOCwgMzgsMTQyLCAzOCwxNDYsCisgICAgIDM4LDE1MCwgNDgsMTI4LCAzOSwxODksIDQ5LDEyOCwgMzksMTkwLCA1MCwxMjgsIDM5LDE1NCwgNTEsMTI4LAorICAgICAzOSwxNzAsIDUyLDEyOCwgMzksMTgyLCA1MywxMjgsIDM5LDE4NSwgNTQsMTI4LCAzOSwxNTIsIDU1LDEyOCwKKyAgICAgMzksMTgwLCA1NiwxMjgsIDM5LDE4MywgNTcsMTI4LCAzOSwxNzIsIDUwLDEzOCwgMzksICAyLCAzOCwxNzgsCisgICAgIDM4LDIyNCwgMzgsMjI4LCAzOCwyMzIsIDM4LDIzNiwgMzgsMjQwLCAzOCwyNDQsIDM4LDI0OCwgMzgsMjUyLAorICAgICAzOSwgIDAsIDQ4LDEzNSwgMzksIDIwLCAzOCwxOTYsIDM4LDIwMCwgMzgsMjA0LCAzOCwyMDgsIDM4LDIxMiwKKyAgICAgMzgsMjE2LCAzOCwyMjAsIDQ4LDEyOCwgMzksMTc0LCA0OSwxMjgsIDM5LDE3NywgNTAsMTI4LCAzOSwgIDMsCisgICAgIDUxLDEyOCwgMzksIDgwLCA1MiwxMjgsIDM5LCA4MiwgNTMsMTI4LCAzOSwxMTAsIDU0LDEyOCwgMzksMTEyLAorICAgICA0OSwxMjgsIDM5LCAyMSwgNTAsMTI4LCAzOSwgMjIsIDUxLDEyOCwgMzksIDIzLCA1MiwxMjgsIDM5LCAyNCwKKyAgICAgNTMsMTI4LCAzOSwgMjUsIDU0LDEyOCwgMzksIDI2LCA1NSwxMjgsIDM5LCAyNywgNTYsMTI4LCAzOSwgMjgsCisgICAgIDU3LDEyOCwgMzksIDM0LCA1MSwxMzgsIDM5LCAgNCwgMzksIDI4LCAzOSwgMzIsIDM5LCAzNiwgMzksIDQwLAorICAgICAzOSwgNDQsIDM5LCA0OCwgMzksIDUyLCAzOSwgNTYsIDM5LCA2MCwgMzksIDY0LCA0OCwxMjgsIDM5LCAzNSwKKyAgICAgNDksMTI4LCAzOSwgMzYsIDUwLDEyOCwgMzksIDM3LCA1MSwxMjgsIDM5LCAzOCwgNTIsMTI4LCAzOSwgMzksCisgICAgIDUzLDEyOCwgMzgsICA1LCA1NCwxMjgsIDM5LCA0MSwgNTUsMTI4LCAzOSwgNDIsIDU2LDEyOCwgMzksIDQzLAorICAgICA1NywxMjgsIDM5LCA0NCwgNTIsMTM4LCAzOCwgMTQsIDM5LCA5MiwgMzksIDk2LCAzOSwxMDAsIDM5LDEwNCwKKyAgICAgMzksMTA4LCAzOSwxMTIsIDM5LDExNiwgMzksMTIwLCAzOSwxMjQsIDM5LDEyOCwgNDgsMTI4LCAzOSwgNDUsCisgICAgIDQ5LDEyOCwgMzksIDQ2LCA1MCwxMjgsIDM5LCA0NywgNTEsMTI4LCAzOSwgNDgsIDUyLDEyOCwgMzksIDQ5LAorICAgICA1MywxMjgsIDM5LCA1MCwgNTQsMTI4LCAzOSwgNTEsIDU1LDEyOCwgMzksIDUyLCA1NiwxMjgsIDM5LCA1MywKKyAgICAgNTcsMTI4LCAzOSwgNTQsIDUzLDEzOCwgMzksICA2LCAzOSwxNTYsIDM5LDE2MCwgMzksMTY0LCAzOSwxNjgsCisgICAgIDM5LDE3MiwgMzksMTc2LCAzOSwxODAsIDM5LDE4NCwgMzksMTg4LCAzOSwxOTIsIDQ4LDEyOCwgMzksIDU1LAorICAgICA0OSwxMjgsIDM5LCA1NiwgNTAsMTI4LCAzOSwgNTcsIDUxLDEyOCwgMzksIDU4LCA1MiwxMjgsIDM5LCA1OSwKKyAgICAgNTMsMTI4LCAzOSwgNjAsIDU0LDEyOCwgMzksIDYxLCA1NSwxMjgsIDM5LCA2MiwgNTYsMTI4LCAzOSwgNjMsCisgICAgIDU3LDEyOCwgMzksIDY0LCA1NCwxMzgsIDM5LCAyOSwgMzksMjIwLCAzOSwyMjQsIDM5LDIyOCwgMzksMjMyLAorICAgICAzOSwyMzYsIDM5LDI0MCwgMzksMjQ0LCAzOSwyNDgsIDM5LDI1MiwgNDAsICAwLCA0OCwxMjgsIDM5LCA2NSwKKyAgICAgNDksMTI4LCAzOSwgNjYsIDUwLDEyOCwgMzksIDY3LCA1MSwxMjgsIDM5LCA2OCwgNTIsMTI4LCAzOSwgNjksCisgICAgIDUzLDEyOCwgMzksIDcwLCA1NCwxMjgsIDM5LCA3MSwgNTUsMTI4LCAzOSwgNzIsIDU2LDEyOCwgMzksIDczLAorICAgICA1NywxMjgsIDM5LCA3NCwgNTUsMTM4LCAzOSwgMzAsIDQwLCAyOCwgNDAsIDMyLCA0MCwgMzYsIDQwLCA0MCwKKyAgICAgNDAsIDQ0LCA0MCwgNDgsIDQwLCA1MiwgNDAsIDU2LCA0MCwgNjAsIDQwLCA2NCwgNDgsMTI4LCAzOSwgNzUsCisgICAgIDQ5LDEyOCwgMzcsMjA3LCA1MCwxMjgsIDM5LCA3NywgNTEsMTI4LCAzNywxNjAsIDUyLDEyOCwgMzksIDc5LAorICAgICA1MywxMjgsIDM5LCA4MSwgNTQsMTI4LCAzNywxNzgsIDU1LDEyOCwgMzcsMTg4LCA1NiwxMjgsIDM3LDE5OCwKKyAgICAgNTcsMTI4LCAzOSwgODYsIDU2LDEzNywgMzksIDMxLCA0MCwgOTAsIDQwLCA5NCwgNDAsIDk4LCA0MCwxMDIsCisgICAgIDQwLDEwNiwgNDAsMTEwLCA0MCwxMTQsIDQwLDExOCwgNDAsMTIyLCA0OSwxMjgsIDM3LDIxNSwgNTAsMTI4LAorICAgICAzOSwgODgsIDUxLDEyOCwgMzksIDg5LCA1MiwxMjgsIDM5LCA5MCwgNTMsMTI4LCAzOSwxMTEsIDU0LDEyOCwKKyAgICAgMzksMTEzLCA1NSwxMjgsIDM5LDExNCwgNTYsMTI4LCAzOSwxMTUsIDU3LDEyOCwgMzksMTA0LCA1NywxMzgsCisgICAgIDM5LCAzMiwgNDAsMTUwLCA0MCwxNTQsIDQwLDE1OCwgNDAsMTYyLCA0MCwxNjYsIDQwLDE3MCwgNDAsMTc0LAorICAgICA0MCwxNzgsIDQwLDE4MiwgNDAsMTg2LCA0OCwxMjgsIDM5LDEwNSwgNDksMTI4LCAzOSwxMDgsIDUwLDEyOCwKKyAgICAgMzksMTA5LCA1MSwxMjgsIDM5LDEwNiwgNTIsMTI4LCAzOSwxMDcsIDUzLDEyOCwgMzksMTE2LCA1NCwxMjgsCisgICAgIDM5LDExNywgNTUsMTI4LCAzOSwgOTEsIDU2LDEyOCwgMzksIDkyLCA1NywxMjgsIDM5LCA5MywgOTcsICA3LAorICAgICA0MCwyMDYsIDQwLDIxNiwgNDAsMjIzLCA0MCwyMzAsIDQwLDI1NSwgNDEsIDE1LCA0MSwgMjYsMjI2LDIyOSwKKyAgICAyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTM0LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAwLDIyNSwyMjgsCisgICAgMjI5LDI0NiwgOTcsMTI4LCAgOSwgIDYsMjMxLDExNywgIDIsIDQwLDIzNywgNDAsMjQ2LDIzNCwyMjUsMjQyLAorICAgIDIyNSwyNDQsMTA1LDEyOCwgMTAsMTM0LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsICA2LDIzNywKKyAgICAyMjUsMjQ0LDI0MiwyMjUsMjMxLDI0NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA2MiwyNDIsCisgICAgMjQ1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsICAzLDI0NiwyMzksMjQ3LDIyOSwyMzYsMjQzLAorICAgIDIzMywyMzEsMTEwLCAgMywgNDEsIDQyLCA0MSwgNTIsIDQxLCA1OSwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwKKyAgICAxMDUsMTI4LCAgOSwxOTAsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDYyLDIzMSwyNDUsMjM0LDIyNSwyNDIsCisgICAgMjI1LDI0NCwxMDUsMTI4LCAxMCwxOTAsIDk4LCAgNCwgNDEsIDgwLCA0MSwxMjEsIDQxLDEzMCwgNDEsMTQwLAorICAgIDIyNiwyNDIsMjI5LDI0NiwyMzMsMjI1LDI0NCwyMzMsMjM5LDExMCwgIDIsIDQxLCA5NSwgNDEsMTEwLDIzNywKKyAgICAyMjUsMjQyLDIzNSwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDk1LDI0MywyMzMsCisgICAgMjMxLDIzOCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwxMTIsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LAorICAgICAgOSwxMzMsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDI2LDI0MiwyMjksMjQ2LDEwMSwKKyAgICAxMzQsICAxLCAgMywgNDEsMTU5LCA0MSwxNjcsIDQxLDE3OCwgNDEsMTg5LCA0MSwxOTcsIDQxLDIwOSwyMjUsCisgICAgMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsMTc1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LAorICAgICAgNCwyMDksMjI4LDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDE4MywyMzEsMjQyLDIyNSwKKyAgICAyNDYsMTAxLDEyOCwgMzAsMTc3LDIzMiwyMzksMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsCisgICAgMTc5LDI0NCwyMzMsMjM2LDIyOCwxMDEsMTI4LCAzMCwxODEsIDk5LCAgNCwgNDEsMjI3LCA0MSwyMzQsIDQyLAorICAgICA1NywgNDIsMTI3LDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLDIwNiwyMzMsMjQyLCA5OSwgIDIsIDQxLDI0MiwKKyAgICAgNDEsMjQ3LDIzNiwxMDEsMTI4LCAzNiwyMDgsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTMzLCAgMCwyMjYsCisgICAgIDQyLCAxMCwgNDIsIDE4LCA0MiwgMjksIDQyLCAzNywgNDIsIDQ5LDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LAorICAgICAzMCwxNjUsMjI4LDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDE3MywyMzEsMjQyLDIyNSwKKyAgICAyNDYsMTAxLDEyOCwgMzAsMTY3LDIzMiwyMzksMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsCisgICAgMTY5LDI0NCwyMzMsMjM2LDIyOCwxMDEsMTI4LCAzMCwxNzEsMjQ1LDI0NCwxMDEsMTMzLCAgMCwxODAsIDQyLAorICAgICA3MywgNDIsIDg0LCA0MiwxMDEsIDQyLDEwOCwgNDIsMTE3LDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywKKyAgICAgOTgsMTI4LCAgMywgMjMsIDk5LCAgMiwgNDIsIDkwLCA0MiwgOTUsMjM3LCA5OCwxMjgsICAzLCAgMSwyMzksCisgICAgMjM3LCA5OCwxMjgsICAzLCAgMSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgODQsMjM2LDIzOSwyNDcsMjM3LAorICAgIDIzOSwxMDAsMTI4LCAgMiwyMDcsMjQ0LDIzOSwyMzgsMjI5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDY1LDI0OSwKKyAgICAyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA0OCwxMDAsICA1LCA0MiwxNDksIDQyLDE1OSwgNDIsCisgICAgMTczLCA0MiwxNzksIDQyLDIxMywyMjYsMjM2LDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAgMiwgIDEsMjI4LAorICAgIDIyNSwyMzUsMjMxLDI0NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLDExMywyMjksMjQ2LCA5NywKKyAgICAxMjgsICA5LCAgNSwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTMwLCAgMCwyMjgsIDQyLDE5MywgNDIsCisgICAgMjA0LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMTEsMjM3LDIyNSwyMjcsMjQyLAorICAgIDIzOSwxMTAsMTI4LCAgMSwyMjMsMjM5LDExNiwgIDIsIDQyLDIyMCwgNDIsMjI4LDIyNiwyMjksMjM2LDIzOSwKKyAgICAxMTksMTI4LCAzMCwxNjEsMjM3LDIyNSwyMjcsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMjUsMTAxLDEzMSwgIDAsCisgICAgMjMwLCA0MiwyNDcsIDQyLDI1NSwgNDMsICA4LDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMSwyNTMsMjM1LAorICAgIDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgODAsMjM3LDIyNSwyMjcsMjQyLDIzOSwxMTAsMTI4LCAgMSwKKyAgICAyMjcsMjMwLDIzMywxMDUsICA2LCA0MywgMzMsIDQzLCA1MywgNDUsMjQ2LCA0NSwyNTIsIDQ2LCAxMSwgNDksCisgICAgMTExLCA0OCwgIDIsIDQzLCAzOSwgNDMsIDQ2LDE3NiwxNzgsMTc2LCA1NiwxMjgsIDMyLCAyMSwxODQsMTg1LAorICAgIDE4MCwgNDksMTI4LCAzMiwxNjQsMTc3LCA0OCwgIDMsIDQzLCA2MiwgNDUsIDg2LCA0NSwyMjEsIDQ4LCAgOSwKKyAgICAgNDMsIDgyLCA0MywxMDIsIDQzLDE2NCwgNDMsMjI2LCA0NCwgMzIsIDQ0LCA5NCwgNDQsMTU2LCA0NCwyMTgsCisgICAgIDQ1LCAyNCwgNDksICAzLCA0MywgOTAsIDQzLCA5NCwgNDMsIDk4LCA1NSwxMjgsICA0LCAxNiwgNTYsMTI4LAorICAgICAgNCwgMTcsIDU3LDEyOCwgIDQsIDE4LCA1MCwgMTAsIDQzLDEyNCwgNDMsMTI4LCA0MywxMzIsIDQzLDEzNiwKKyAgICAgNDMsMTQwLCA0MywxNDQsIDQzLDE0OCwgNDMsMTUyLCA0MywxNTYsIDQzLDE2MCwgNDgsMTI4LCAgNCwgMTksCisgICAgIDQ5LDEyOCwgIDQsIDIwLCA1MCwxMjgsICA0LCAyMSwgNTEsMTI4LCAgNCwgIDEsIDUyLDEyOCwgIDQsIDIyLAorICAgICA1MywxMjgsICA0LCAyMywgNTQsMTI4LCAgNCwgMjQsIDU1LDEyOCwgIDQsIDI1LCA1NiwxMjgsICA0LCAyNiwKKyAgICAgNTcsMTI4LCAgNCwgMjcsIDUxLCAxMCwgNDMsMTg2LCA0MywxOTAsIDQzLDE5NCwgNDMsMTk4LCA0MywyMDIsCisgICAgIDQzLDIwNiwgNDMsMjEwLCA0MywyMTQsIDQzLDIxOCwgNDMsMjIyLCA0OCwxMjgsICA0LCAyOCwgNDksMTI4LAorICAgICAgNCwgMjksIDUwLDEyOCwgIDQsIDMwLCA1MSwxMjgsICA0LCAzMSwgNTIsMTI4LCAgNCwgMzIsIDUzLDEyOCwKKyAgICAgIDQsIDMzLCA1NCwxMjgsICA0LCAzNCwgNTUsMTI4LCAgNCwgMzUsIDU2LDEyOCwgIDQsIDM2LCA1NywxMjgsCisgICAgICA0LCAzNywgNTIsIDEwLCA0MywyNDgsIDQzLDI1MiwgNDQsICAwLCA0NCwgIDQsIDQ0LCAgOCwgNDQsIDEyLAorICAgICA0NCwgMTYsIDQ0LCAyMCwgNDQsIDI0LCA0NCwgMjgsIDQ4LDEyOCwgIDQsIDM4LCA0OSwxMjgsICA0LCAzOSwKKyAgICAgNTAsMTI4LCAgNCwgNDAsIDUxLDEyOCwgIDQsIDQxLCA1MiwxMjgsICA0LCA0MiwgNTMsMTI4LCAgNCwgNDMsCisgICAgIDU0LDEyOCwgIDQsIDQ0LCA1NSwxMjgsICA0LCA0NSwgNTYsMTI4LCAgNCwgNDYsIDU3LDEyOCwgIDQsIDQ3LAorICAgICA1MywgMTAsIDQ0LCA1NCwgNDQsIDU4LCA0NCwgNjIsIDQ0LCA2NiwgNDQsIDcwLCA0NCwgNzQsIDQ0LCA3OCwKKyAgICAgNDQsIDgyLCA0NCwgODYsIDQ0LCA5MCwgNDgsMTI4LCAgNCwxNDQsIDQ5LDEyOCwgIDQsICAyLCA1MCwxMjgsCisgICAgICA0LCAgMywgNTEsMTI4LCAgNCwgIDQsIDUyLDEyOCwgIDQsICA1LCA1MywxMjgsICA0LCAgNiwgNTQsMTI4LAorICAgICAgNCwgIDcsIDU1LDEyOCwgIDQsICA4LCA1NiwxMjgsICA0LCAgOSwgNTcsMTI4LCAgNCwgMTAsIDU0LCAxMCwKKyAgICAgNDQsMTE2LCA0NCwxMjAsIDQ0LDEyNCwgNDQsMTI4LCA0NCwxMzIsIDQ0LDEzNiwgNDQsMTQwLCA0NCwxNDQsCisgICAgIDQ0LDE0OCwgNDQsMTUyLCA0OCwxMjgsICA0LCAxMSwgNDksMTI4LCAgNCwgMTIsIDUwLDEyOCwgIDQsIDE0LAorICAgICA1MSwxMjgsMjQ2LDE5NiwgNTIsMTI4LDI0NiwxOTcsIDUzLDEyOCwgIDQsIDQ4LCA1NCwxMjgsICA0LCA0OSwKKyAgICAgNTUsMTI4LCAgNCwgNTAsIDU2LDEyOCwgIDQsIDUxLCA1NywxMjgsICA0LCA1MiwgNTUsIDEwLCA0NCwxNzgsCisgICAgIDQ0LDE4MiwgNDQsMTg2LCA0NCwxOTAsIDQ0LDE5NCwgNDQsMTk4LCA0NCwyMDIsIDQ0LDIwNiwgNDQsMjEwLAorICAgICA0NCwyMTQsIDQ4LDEyOCwgIDQsIDUzLCA0OSwxMjgsICA0LCA4MSwgNTAsMTI4LCAgNCwgNTQsIDUxLDEyOCwKKyAgICAgIDQsIDU1LCA1MiwxMjgsICA0LCA1NiwgNTMsMTI4LCAgNCwgNTcsIDU0LDEyOCwgIDQsIDU4LCA1NSwxMjgsCisgICAgICA0LCA1OSwgNTYsMTI4LCAgNCwgNjAsIDU3LDEyOCwgIDQsIDYxLCA1NiwgMTAsIDQ0LDI0MCwgNDQsMjQ0LAorICAgICA0NCwyNDgsIDQ0LDI1MiwgNDUsICAwLCA0NSwgIDQsIDQ1LCAgOCwgNDUsIDEyLCA0NSwgMTYsIDQ1LCAyMCwKKyAgICAgNDgsMTI4LCAgNCwgNjIsIDQ5LDEyOCwgIDQsIDYzLCA1MCwxMjgsICA0LCA2NCwgNTEsMTI4LCAgNCwgNjUsCisgICAgIDUyLDEyOCwgIDQsIDY2LCA1MywxMjgsICA0LCA2NywgNTQsMTI4LCAgNCwgNjgsIDU1LDEyOCwgIDQsIDY5LAorICAgICA1NiwxMjgsICA0LCA3MCwgNTcsMTI4LCAgNCwgNzEsIDU3LCAxMCwgNDUsIDQ2LCA0NSwgNTAsIDQ1LCA1NCwKKyAgICAgNDUsIDU4LCA0NSwgNjIsIDQ1LCA2NiwgNDUsIDcwLCA0NSwgNzQsIDQ1LCA3OCwgNDUsIDgyLCA0OCwxMjgsCisgICAgICA0LCA3MiwgNDksMTI4LCAgNCwgNzMsIDUwLDEyOCwgIDQsIDc0LCA1MSwxMjgsICA0LCA3NSwgNTIsMTI4LAorICAgICAgNCwgNzYsIDUzLDEyOCwgIDQsIDc3LCA1NCwxMjgsICA0LCA3OCwgNTUsMTI4LCAgNCwgNzksIDU2LDEyOCwKKyAgICAgIDQsMTQ1LCA1NywxMjgsICA0LCA4MiwgNDksICA0LCA0NSwgOTYsIDQ1LDE1OCwgNDUsMTYzLCA0NSwxODksCisgICAgIDQ4LCAxMCwgNDUsMTE4LCA0NSwxMjIsIDQ1LDEyNiwgNDUsMTMwLCA0NSwxMzQsIDQ1LDEzOCwgNDUsMTQyLAorICAgICA0NSwxNDYsIDQ1LDE1MCwgNDUsMTU0LCA0OCwxMjgsICA0LCA4MywgNDksMTI4LCAgNCwgODQsIDUwLDEyOCwKKyAgICAgIDQsIDg1LCA1MSwxMjgsICA0LCA4NiwgNTIsMTI4LCAgNCwgODcsIDUzLDEyOCwgIDQsIDg4LCA1NCwxMjgsCisgICAgICA0LCA4OSwgNTUsMTI4LCAgNCwgOTAsIDU2LDEyOCwgIDQsIDkxLCA1NywxMjgsICA0LCA5MiwxNzcsIDQ4LAorICAgIDEyOCwgIDQsIDk0LCA1MiwgIDQsIDQ1LDE3MywgNDUsMTc3LCA0NSwxODEsIDQ1LDE4NSwgNTMsMTI4LCAgNCwKKyAgICAgMTUsIDU0LDEyOCwgIDQsIDk4LCA1NSwxMjgsICA0LDExNCwgNTYsMTI4LCAgNCwxMTYsIDU3LCAgNSwgNDUsCisgICAgMjAxLCA0NSwyMDUsIDQ1LDIwOSwgNDUsMjEzLCA0NSwyMTcsIDUwLDEyOCwyNDYsMTk4LCA1MSwxMjgsICA0LAorICAgICA5NSwgNTIsMTI4LCAgNCwgOTksIDUzLDEyOCwgIDQsMTE1LCA1NCwxMjgsICA0LDExNywgNTYsICAyLCA0NSwKKyAgICAyMjcsIDQ1LDI0MSwgNTEsICAyLCA0NSwyMzMsIDQ1LDIzNywgNDksMTI4LDI0NiwxOTksIDUwLDEyOCwyNDYsCisgICAgMjAwLDE4MCwgNTQsMTI4LCAgNCwyMTcsMTc4LDE4NSwgNTcsMTI4LCAzMiwgMTQsMTc5LCA0OCwgIDIsIDQ2LAorICAgICAgMywgNDYsICA3LCA0OCwxMjgsIDMyLCAxNSwgNDksMTI4LCAzMiwgMTMsMTgxLCA1NSwgIDcsIDQ2LCAyOCwKKyAgICAgNDYsIDk4LCA0NywxNjMsIDQ3LDI0MCwgNDgsMTk3LCA0OSwgMzQsIDQ5LDEwNSwgNTEsICAyLCA0NiwgMzQsCisgICAgIDQ2LCA0OCwgNTYsICAyLCA0NiwgNDAsIDQ2LCA0NCwgNDksMTI4LCAgNiwxMDYsIDU2LDEyOCwgIDYsIDEyLAorICAgICA1NywgIDgsIDQ2LCA2NiwgNDYsIDcwLCA0NiwgNzQsIDQ2LCA3OCwgNDYsIDgyLCA0NiwgODYsIDQ2LCA5MCwKKyAgICAgNDYsIDk0LCA1MCwxMjgsICA2LCA5NiwgNTEsMTI4LCAgNiwgOTcsIDUyLDEyOCwgIDYsIDk4LCA1MywxMjgsCisgICAgICA2LCA5OSwgNTQsMTI4LCAgNiwxMDAsIDU1LDEyOCwgIDYsMTAxLCA1NiwxMjgsICA2LDEwMiwgNTcsMTI4LAorICAgICAgNiwxMDMsIDUyLCAgNywgNDYsMTE0LCA0NiwxNDYsIDQ2LDIwOCwgNDcsIDE0LCA0NywgNDYsIDQ3LDEwMiwKKyAgICAgNDcsMTU4LCA0OCwgIDUsIDQ2LDEyNiwgNDYsMTMwLCA0NiwxMzQsIDQ2LDEzOCwgNDYsMTQyLCA0OCwxMjgsCisgICAgICA2LDEwNCwgNDksMTI4LCAgNiwxMDUsIDUxLDEyOCwgIDYsIDI3LCA1NSwxMjgsICA2LCAzMSwgNTcsMTI4LAorICAgICAgNiwgMzMsIDQ5LCAxMCwgNDYsMTY4LCA0NiwxNzIsIDQ2LDE3NiwgNDYsMTgwLCA0NiwxODQsIDQ2LDE4OCwKKyAgICAgNDYsMTkyLCA0NiwxOTYsIDQ2LDIwMCwgNDYsMjA0LCA0OCwxMjgsICA2LCAzNCwgNDksMTI4LCAgNiwgMzUsCisgICAgIDUwLDEyOCwgIDYsIDM2LCA1MSwxMjgsICA2LCAzNywgNTIsMTI4LCAgNiwgMzgsIDUzLDEyOCwgIDYsIDM5LAorICAgICA1NCwxMjgsICA2LCA0MCwgNTUsMTI4LCAgNiwgNDEsIDU2LDEyOCwgIDYsIDQyLCA1NywxMjgsICA2LCA0MywKKyAgICAgNTAsIDEwLCA0NiwyMzAsIDQ2LDIzNCwgNDYsMjM4LCA0NiwyNDIsIDQ2LDI0NiwgNDYsMjUwLCA0NiwyNTQsCisgICAgIDQ3LCAgMiwgNDcsICA2LCA0NywgMTAsIDQ4LDEyOCwgIDYsIDQ0LCA0OSwxMjgsICA2LCA0NSwgNTAsMTI4LAorICAgICAgNiwgNDYsIDUxLDEyOCwgIDYsIDQ3LCA1MiwxMjgsICA2LCA0OCwgNTMsMTI4LCAgNiwgNDksIDU0LDEyOCwKKyAgICAgIDYsIDUwLCA1NSwxMjgsICA2LCA1MSwgNTYsMTI4LCAgNiwgNTIsIDU3LDEyOCwgIDYsIDUzLCA1MSwgIDUsCisgICAgIDQ3LCAyNiwgNDcsIDMwLCA0NywgMzQsIDQ3LCAzOCwgNDcsIDQyLCA0OCwxMjgsICA2LCA1NCwgNDksMTI4LAorICAgICAgNiwgNTUsIDUwLDEyOCwgIDYsIDU2LCA1MSwxMjgsICA2LCA1NywgNTIsMTI4LCAgNiwgNTgsIDUyLCAgOSwKKyAgICAgNDcsIDY2LCA0NywgNzAsIDQ3LCA3NCwgNDcsIDc4LCA0NywgODIsIDQ3LCA4NiwgNDcsIDkwLCA0NywgOTQsCisgICAgIDQ3LCA5OCwgNDgsMTI4LCAgNiwgNjQsIDQ5LDEyOCwgIDYsIDY1LCA1MCwxMjgsICA2LCA2NiwgNTEsMTI4LAorICAgICAgNiwgNjcsIDUyLDEyOCwgIDYsIDY4LCA1MywxMjgsICA2LCA2OSwgNTQsMTI4LCAgNiwgNzAsIDU2LDEyOCwKKyAgICAgIDYsIDcyLCA1NywxMjgsICA2LCA3MywgNTMsICA5LCA0NywxMjIsIDQ3LDEyNiwgNDcsMTMwLCA0NywxMzQsCisgICAgIDQ3LDEzOCwgNDcsMTQyLCA0NywxNDYsIDQ3LDE1MCwgNDcsMTU0LCA0OCwxMjgsICA2LCA3NCwgNDksMTI4LAorICAgICAgNiwgNzUsIDUwLDEyOCwgIDYsIDc2LCA1MSwxMjgsICA2LCA3NywgNTIsMTI4LCAgNiwgNzgsIDUzLDEyOCwKKyAgICAgIDYsIDc5LCA1NCwxMjgsICA2LCA4MCwgNTUsMTI4LCAgNiwgODEsIDU2LDEyOCwgIDYsIDgyLDE4MywgNDgsCisgICAgMTI4LCAgNiwgNzEsIDUzLCAgMywgNDcsMTcxLCA0NywyMDMsIDQ3LDIzNSwgNDgsICA1LCA0NywxODMsIDQ3LAorICAgIDE4NywgNDcsMTkxLCA0NywxOTUsIDQ3LDE5OSwgNTMsMTI4LCAgNiwxNjQsIDU0LDEyOCwgIDYsMTI2LCA1NSwKKyAgICAxMjgsICA2LDEzNCwgNTYsMTI4LCAgNiwxNTIsIDU3LDEyOCwgIDYsMTc1LCA0OSwgIDUsIDQ3LDIxNSwgNDcsCisgICAgMjE5LCA0NywyMjMsIDQ3LDIyNywgNDcsMjMxLCA0OSwxMjgsICA2LDEyMSwgNTAsMTI4LCAgNiwxMzYsIDUxLAorICAgIDEyOCwgIDYsMTQ1LCA1MiwxMjgsICA2LDE4NiwgNTcsMTI4LCAgNiwyMTAsMTc5LCA1MiwxMjgsICA2LDIxMywKKyAgICAgNTQsICA3LCA0OCwgIDAsIDQ4LCAgNSwgNDgsIDEwLCA0OCwgMTUsIDQ4LCA1MywgNDgsMTE1LCA0OCwxNzcsCisgICAgMTc5LCA1NCwxMjgsIDMyLDE3MCwxODAsIDUzLDEyOCwgIDUsMTkwLDE4MSwgNTYsMTI4LCAgNSwxOTUsIDU0LAorICAgICAgNiwgNDgsIDI5LCA0OCwgMzMsIDQ4LCAzNywgNDgsIDQxLCA0OCwgNDUsIDQ4LCA0OSwgNTIsMTI4LCAgNSwKKyAgICAyMDgsIDUzLDEyOCwgIDUsMjA5LCA1NCwxMjgsICA1LDIxMCwgNTUsMTI4LCAgNSwyMTEsIDU2LDEyOCwgIDUsCisgICAgMjEyLCA1NywxMjgsICA1LDIxMywgNTUsIDEwLCA0OCwgNzUsIDQ4LCA3OSwgNDgsIDgzLCA0OCwgODcsIDQ4LAorICAgICA5MSwgNDgsIDk1LCA0OCwgOTksIDQ4LDEwMywgNDgsMTA3LCA0OCwxMTEsIDQ4LDEyOCwgIDUsMjE0LCA0OSwKKyAgICAxMjgsICA1LDIxNSwgNTAsMTI4LCAgNSwyMTYsIDUxLDEyOCwgIDUsMjE3LCA1MiwxMjgsICA1LDIxOCwgNTMsCisgICAgMTI4LCAgNSwyMTksIDU0LDEyOCwgIDUsMjIwLCA1NSwxMjgsICA1LDIyMSwgNTYsMTI4LCAgNSwyMjIsIDU3LAorICAgIDEyOCwgIDUsMjIzLCA1NiwgMTAsIDQ4LDEzNywgNDgsMTQxLCA0OCwxNDUsIDQ4LDE0OSwgNDgsMTUzLCA0OCwKKyAgICAxNTcsIDQ4LDE2MSwgNDgsMTY1LCA0OCwxNjksIDQ4LDE3MywgNDgsMTI4LCAgNSwyMjQsIDQ5LDEyOCwgIDUsCisgICAgMjI1LCA1MCwxMjgsICA1LDIyNiwgNTEsMTI4LCAgNSwyMjcsIDUyLDEyOCwgIDUsMjI4LCA1MywxMjgsICA1LAorICAgIDIyOSwgNTQsMTI4LCAgNSwyMzAsIDU1LDEyOCwgIDUsMjMxLCA1NiwxMjgsICA1LDIzMiwgNTcsMTI4LCAgNSwKKyAgICAyMzMsIDU3LCAgMywgNDgsMTg1LCA0OCwxODksIDQ4LDE5MywgNDgsMTI4LCAgNSwyMzQsIDUyLDEyOCwyNTEsCisgICAgIDQyLCA1MywxMjgsMjUxLCA0MywgNTUsICA0LCA0OCwyMDcsIDQ4LDIyMSwgNDgsMjQxLCA0OCwyNDYsIDQ4LAorICAgICAgMiwgNDgsMjEzLCA0OCwyMTcsIDQ4LDEyOCwyNTEsIDc1LCA1MywxMjgsMjUxLCAzMSwgNDksICAzLCA0OCwKKyAgICAyMjksIDQ4LDIzMywgNDgsMjM3LCA1NCwxMjgsICA1LDI0MCwgNTUsMTI4LCAgNSwyNDEsIDU2LDEyOCwgIDUsCisgICAgMjQyLDE3OCwgNTEsMTI4LDI1MSwgNTMsIDU3LCAgNywgNDksICA2LCA0OSwgMTAsIDQ5LCAxNCwgNDksIDE4LAorICAgICA0OSwgMjIsIDQ5LCAyNiwgNDksIDMwLCA1MSwxMjgsICA1LDE4MCwgNTIsMTI4LCAgNSwxODEsIDUzLDEyOCwKKyAgICAgIDUsMTgyLCA1NCwxMjgsICA1LDE4NywgNTUsMTI4LCAgNSwxODQsIDU2LDEyOCwgIDUsMTgzLCA1NywxMjgsCisgICAgICA1LDE3NiwgNTYsICAzLCA0OSwgNDIsIDQ5LCA4NiwgNDksIDkxLCA0OCwgIDcsIDQ5LCA1OCwgNDksIDYyLAorICAgICA0OSwgNjYsIDQ5LCA3MCwgNDksIDc0LCA0OSwgNzgsIDQ5LCA4MiwgNDgsMTI4LCAgNSwxNzgsIDQ5LDEyOCwKKyAgICAgIDUsMTc3LCA1MCwxMjgsICA1LDE3OSwgNTEsMTI4LCAgNSwxOTQsIDUyLDEyOCwgIDUsMTkzLCA1NCwxMjgsCisgICAgICA1LDE4NSwgNTUsMTI4LCAgNSwxODgsMTc5LCA1NywxMjgsICA1LDE4OSwgNTIsICAyLCA0OSwgOTcsIDQ5LAorICAgIDEwMSwgNDksMTI4LCAgNSwxOTEsIDUwLDEyOCwgIDUsMTkyLDE4NSwxNzgsIDU3LDEyOCwgIDIsMTg4LCA1NCwKKyAgICAgIDMsIDQ5LDExOSwgNDksMTc4LCA0OSwxODUsIDQ5LCAgNCwgNDksMTI5LCA0OSwxNDUsIDQ5LDE1MSwgNDksCisgICAgMTcyLCA1MCwgIDIsIDQ5LDEzNSwgNDksMTQwLDE4MCwgNTYsMTI4LCAzMywgIDUsMTg0LCA1NywxMjgsIDMzLAorICAgICAxOSwxNzksMTgxLCA1MCwxMjgsIDMzLCAyMiwxODEsIDU1LCAgMywgNDksMTYwLCA0OSwxNjQsIDQ5LDE2OCwKKyAgICAgNTEsMTI4LCAzMiwgNDQsIDUyLDEyOCwgMzIsIDQ1LCA1MywxMjgsIDMyLCA0NiwxODIsMTgyLCA1MiwxMjgsCisgICAgIDMyLCAxMiwxNzksMTc3LDE4MiwgNTUsMTI4LCAgNiwxMDksMTgwLDE4NSwxNzksIDU1LDEyOCwgIDIsMTg5LAorICAgIDEwMywgIDIsIDQ5LDE5OCwgNDksMjA1LDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAwLDIyNCwxMTcsICAyLCA0OSwKKyAgICAyMTEsIDQ5LDIyMCwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDEzMywyNDIsMjM3LDI0NSwyMzUsCisgICAgMjMyLDEwNSwxMjgsIDEwLCAgNSwxMDQsICAyLCA0OSwyMzUsIDQ5LDI0NSwyMzMsMjQyLDIyNSwyMzEsMjI1LAorICAgIDIzOCwgOTcsMTI4LCA0OCwgNjYsMjM5LDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDE2MywKKyAgICAxMDUsICA3LCA1MCwgMTYsIDUwLCA0MSwgNTAsIDQ4LCA1MCwgNjAsIDUwLCA4NSwgNTAsMTAxLCA1MCwxODEsCisgICAgIDk4LCAgMiwgNTAsIDIyLCA1MCwgMzEsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNDQsMjM5LAorICAgIDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDMwLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAxNiwKKyAgICAyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDIxMywyMzEsMTE3LCAgMiwgNTAsCisgICAgIDY3LCA1MCwgNzYsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNDQsMjQyLDIzNywyNDUsMjM1LAorICAgIDIzMiwxMDUsMTI4LCAxMCwgMTYsMjM3LDIyNSwyNDQsMjQyLDIyNSwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwKKyAgICAyMzIsMTA1LDEyOCwgMTAsIDcyLDExMCwgIDUsIDUwLDExMywgNTAsMTIyLCA1MCwxMzYsIDUwLDE1MiwgNTAsCisgICAgMTY3LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDU3LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LAorICAgIDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMDIsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwKKyAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjAzLDIzNywyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsCisgICAgMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjA0LDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LDIyNiwyNDIsMjI5LAorICAgIDI0NiwxMDEsMTI4LCAgMiwgIDMsMjQ2LDIzOSwyNDcsMjI5LDIzNiwyNDMsMjMzLDIzMSwxMTAsICAzLCA1MCwKKyAgICAxOTcsIDUwLDIwNywgNTAsMjE0LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIwMCwyMjgsCisgICAgMjI5LDI0NiwgOTcsMTI4LCAgOSwgNzIsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLAorICAgIDIwMCwxMDcsICAyLCA1MCwyMzEsIDUwLDI1NSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwKKyAgICAxNjIsIDUwLDI0MywyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDExMywyMzksCisgICAgMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDc5LDEwOCwgIDMsIDUxLCAxNSwgNTIsIDcxLCA1MiwgODAsMTAxLAorICAgICAgMiwgNTEsIDIxLCA1MiwgNjYsMTAyLDEzNiwgIDUsMjA4LCA1MSwgNDEsIDUxLCA1MCwgNTEsIDY1LCA1MSwKKyAgICAgNzksIDUxLDE2OCwgNTEsMTgyLCA1MiwgMzcsIDUyLCA1MSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCisgICAgICA2LCAzOSwyMjgsMjI1LDIzMSwyMjksMjQzLDIzMiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLAorICAgICA0OCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTQyLDEwNCwKKyAgICAgIDIsIDUxLCA4NSwgNTEsMTYwLDIyNSwyMzcsMjUwLCA5NywgIDIsIDUxLCA5NCwgNTEsMTI3LDIyNSwyMjYsCisgICAgMjM5LDI0NiwxMDEsICAyLCA1MSwxMDQsIDUxLDExMywyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LAorICAgICAzNSwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTMyLDIyNiwKKyAgICAyMjksMjM2LDIzOSwxMTksICAyLCA1MSwxMzcsIDUxLDE0NiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCisgICAgICA2LCAzNywyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTM2LAorICAgIDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwyMDgsMjM2LDIyNSwyMzcsMjI5LDIyOCwyMzIsMjI5LDIyNiwKKyAgICAyNDIsMjI5LDExOSwxMjgsMjUxLCA3OSwyMzcsIDk3LCAgMiwgNTEsMTg5LCA1MSwyMjUsMjI4LDIyOCwyMjUsCisgICAgMjI1LDIyNiwyMzksMjQ2LDEwMSwgIDIsIDUxLDIwMiwgNTEsMjExLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LAorICAgIDEyOCwgIDYsIDM0LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwKKyAgICAxMzAsMjM1LDI0MywyNDUsMjQyLCA5NywgIDQsIDUxLDIzOSwgNTEsMjQ4LCA1MiwgIDYsIDUyLCAyMiwyMjUsCisgICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA3MywyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LAorICAgIDIyNiwyMzMsIDk5LDEyOCwyNTQsMjQwLDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwKKyAgICAyMjYsMjMzLCA5OSwxMjgsMjU0LDI0MywyMzcsMjI5LDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsCisgICAgMjMzLCA5OSwxMjgsMjU0LDI0NCwyNDAsMjI1LDI0NCwyMjUsMjMyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LAorICAgIDEyOCwyNTEsIDQ2LDI0MSwyMjUsMjM3LDIyNSwyNDQsMjQzLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwKKyAgICAyNTEsIDQ3LDI0MCwxMDQsMTI4LCAzMywgNTMsMjM2LDIyOSwyNDEsMjQ1LDIyNSwxMDgsMTI4LCAzNCwgNzYsCisgICAgMjQwLDIzMiwgOTcsMTI5LCAgMywxNzcsIDUyLCA4OCwyNDQsMjM5LDIzOCwyMzksMTE1LDEyOCwgIDMsMTcyLAorICAgIDEwOSwgIDQsIDUyLDEwNiwgNTIsMTE0LCA1MiwxMjUsIDUyLDE1OSwyMjUsMjI3LDI0MiwyMzksMTEwLDEyOCwKKyAgICAgIDEsICAxLDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNjUsMjQwLDIyOSwyNDIsCisgICAgMjQzLDIyNSwyMzgsMTAwLDEzMCwgIDAsIDM4LCA1MiwxMzksIDUyLDE1MSwyMzcsMjM5LDIzOCwyMzksMjQzLAorICAgIDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAgNiwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsIDM4LDI0MywKKyAgICAyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTk0LDExMCwgIDQsIDUyLDE3OCwgNTIsMTg5LCA1MywgNTUsCisgICAgIDUzLCA2NSwyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDM0LDEwMywgIDQsIDUyLAorICAgIDE5OSwgNTIsMjEwLCA1MiwyMjQsIDUzLCA0NywyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwKKyAgICAgNDksIDM2LDIzNSwyMzIsMjI1LDIzOCwyMzUsMjMyLDI0NSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgOTAsCisgICAgMjM2LDEwMSwxMzEsIDM0LCAzMiwgNTIsMjM1LCA1MywgMzIsIDUzLCAzOSwyMjYsMjQyLDIyNSwyMjcsMjM1LAorICAgIDIyOSwxMTYsICAyLCA1MiwyNDcsIDUzLCAxMSwyMzYsMjI5LDIzMCwxMTYsMTI5LCA0OCwgIDgsIDUzLCAgMCwKKyAgICAyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LDEyOCwyNTQsIDYzLDI0MiwyMzMsMjMxLDIzMiwxMTYsCisgICAgMTI5LCA0OCwgIDksIDUzLCAyMSwyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LDEyOCwyNTQsIDY0LAorICAgIDIzNiwyMjksMjMwLDExNiwxMjgsIDM1LCA0MSwyNDIsMjMzLDIzMSwyMzIsMTE2LDEyOCwgMzUsIDQyLDI0MywKKyAgICAyNDQsMjQyLDIzOSwxMDksMTI4LCAzMywgNDMsMjM5LDI0NCwyMjksMjM2LDIyOSwyMzMsIDk3LDEyOCwgIDMsCisgICAgMTM1LDExNywgIDIsIDUzLCA3MSwgNTMsIDgzLDIyOCwyMjUsMjQ0LDI0NCwyMjUsMjI4LDIyOSwyNDYsIDk3LAorICAgIDEyOCwgIDksIDgyLDI0MywyNDYsMjI1LDI0MiwgOTcsICAzLCA1MywgOTUsIDUzLDEwNSwgNTMsMTEyLDIyNiwKKyAgICAyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDEzMCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgIDIsCisgICAgMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDEzMCwyMzksMjMxLDIzOSwyMzgsMjI5LAorICAgIDEwNywxMjgsICAxLCAgNSwxMTIsICAzLCA1MywxNDAsIDUzLDE2NCwgNTMsMTk0LCA5NywgIDIsIDUzLDE0NiwKKyAgICAgNTMsMTU4LDIyNSwyNDQsMjM5LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsICAwLDI0MiwyMjksCisgICAgMTEwLDEyOCwgMzYsMTU2LDIzOSwyNDMsMjQ0LDI0MiwyMzksMjQwLDIzMiwxMDEsICAyLCA1MywxNzcsIDUzLAorICAgIDE4OCwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDkwLDIzNywyMzksMTAwLDEyOCwKKyAgICAgIDIsMTg4LDExMiwgIDIsIDUzLDIwMCwgNTMsMjA1LDIzNiwxMDEsMTI4LDI0OCwyNTUsMjQyLDExMSwgIDIsCisgICAgIDUzLDIxMiwgNTMsMjIwLDIyNSwyMjcsMjMyLDIyOSwxMTUsMTI4LCAzNCwgODAsMTIwLCAgMiwgNTMsMjI2LAorICAgICA1MywyNDYsMjI5LDI0MSwyNDUsMjI1LDEwOCwxMjksIDM0LCA3MiwgNTMsMjM2LDIzOSwyNDIsMjMzLDIzNywKKyAgICAyMjUsMjMxLDEwMSwxMjgsIDM0LCA4MiwyMzMsMjM3LDIyNSwyNDQsMjI5LDIzNiwyNDksMjI5LDI0MSwyNDUsCisgICAgMjI1LDEwOCwxMjgsIDM0LCA2OSwxMTQsICA0LCA1NCwgMTUsIDU0LCA0MiwgNTQsIDQ2LCA1NCwgOTEsMjI1LAorICAgIDIyOSwgOTcsICAyLCA1NCwgMjMsIDU0LCAzMywyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwKKyAgICAxNDIsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxNDEsIDk5LDEyOCwgMzUsIDE4LDEwNSwgIDIsCisgICAgIDU0LCA1MiwgNTQsIDY2LDIzMSwyMzIsMjQ0LDIzMiwyMjUsMjM2LDIzMCwyNDIsMjMzLDIzOCwxMDMsMTI4LAorICAgICAzMCwxNTQsMjM4LDEwMywxMzAsICAwLDIyOSwgNTQsIDc1LCA1NCwgODMsMjI1LDIyNywyNDUsMjQ0LDEwMSwKKyAgICAxMjgsICAxLDI1MSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsICAxLDI0MiwyMzksMTE5LCAgOCwgNTQsCisgICAgMTExLCA1NCwxMTgsIDU0LDI0NywgNTUsIDU3LCA1NSwxMDcsIDU1LDE2MiwgNTUsMTg1LCA1NiwgIDQsMjI2LAorICAgIDIzOSwyNDQsMTA0LDEyOCwgMzMsMTQ4LDEwMCwgIDMsIDU0LDEyNiwgNTQsMTY1LCA1NCwyMTIsMjI1LDI0MywKKyAgICAxMDQsICA0LCA1NCwxMzgsIDU0LDE0NSwgNTQsMTUyLCA1NCwxNjAsMjI4LDIzOSwyNDcsMTEwLDEyOCwgMzMsCisgICAgMjI3LDIzNiwyMjksMjMwLDExNiwxMjgsIDMzLDIyNCwyNDIsMjMzLDIzMSwyMzIsMTE2LDEyOCwgMzMsMjI2LAorICAgIDI0NSwxMTIsMTI4LCAzMywyMjUsMjI2LDEwOCwgIDUsIDU0LDE3OCwgNTQsMTg1LCA1NCwxOTIsIDU0LDE5OSwKKyAgICAgNTQsMjA3LDIyNiwyMzksMjQ0LDEwNCwxMjgsIDMzLDIxMiwyMjgsMjM5LDI0NywxMTAsMTI4LCAzMywyMTEsCisgICAgMjM2LDIyOSwyMzAsMTE2LDEyOCwgMzMsMjA4LDI0MiwyMzMsMjMxLDIzMiwxMTYsMTI4LCAzMywyMTAsMjQ1LAorICAgIDExMiwxMjgsIDMzLDIwOSwyMzksMjQ3LDExMCwxMzEsIDMzLDE0NywgNTQsMjI0LCA1NCwyMzEsIDU0LDIzOSwKKyAgICAyMzYsMjI5LDIzMCwxMTYsMTI4LCAzMywxNTMsMjQyLDIzMywyMzEsMjMyLDExNiwxMjgsIDMzLDE1MiwyNDcsCisgICAgMjMyLDIzMywyNDQsMTAxLDEyOCwgMzMsMjMzLDEwNCwgIDIsIDU0LDI1MywgNTUsIDQ4LDIyOSwyMjUsMTAwLAorICAgICAgNCwgNTUsICA5LCA1NSwgMTksIDU1LCAyOSwgNTUsIDQwLDIyOCwyMzksMjQ3LDIzOCwyMzcsMjM5LDEwMCwKKyAgICAxMjgsICAyLDE5NywyMzYsMjI5LDIzMCwyNDQsMjM3LDIzOSwxMDAsMTI4LCAgMiwxOTQsMjQyLDIzMywyMzEsCisgICAgMjMyLDI0NCwyMzcsMjM5LDEwMCwxMjgsICAyLDE5NSwyNDUsMjQwLDIzNywyMzksMTAwLDEyOCwgIDIsMTk2LAorICAgIDIzOSwyNDIsMjMzLDI1MCwyMjksMTIwLDEyOCwyNDgsMjMxLDIzNiwyMjksMjMwLDExNiwxMzEsIDMzLDE0NCwKKyAgICAgNTUsIDcwLCA1NSwgODcsIDU1LCA5OSwyMjgsMjI2LDEwOCwxMjksIDMzLDIwOCwgNTUsIDc4LDI0MywyNDQsCisgICAgMjQyLDIzOSwyMzUsMTAxLDEyOCwgMzMsMjA1LDIzOSwyNDYsMjI5LDI0MiwyNDIsMjMzLDIzMSwyMzIsMTE2LAorICAgIDEyOCwgMzMsMTk4LDI0NywyMzIsMjMzLDI0NCwxMDEsMTI4LCAzMywyMzAsMjQyLDIzMywyMzEsMjMyLDExNiwKKyAgICAxMzIsIDMzLDE0NiwgNTUsMTIzLCA1NSwxMzUsIDU1LDE0MywgNTUsMTU0LDIyOCwyMjYsMjM2LDI0MywyNDQsCisgICAgMjQyLDIzOSwyMzUsMTAxLDEyOCwgMzMsMjA3LDIzMiwyMjksMjI1LDI0NiwxMjEsMTI4LCAzOSwxNTgsMjM5LAorICAgIDI0NiwyMjksMjQyLDIzNiwyMjksMjMwLDExNiwxMjgsIDMzLDE5NiwyNDcsMjMyLDIzMywyNDQsMTAxLDEyOCwKKyAgICAgMzMsMjMyLDI0NCwyMjUsIDk4LCAgMiwgNTUsMTcwLCA1NSwxNzcsMjM2LDIyOSwyMzAsMTE2LDEyOCwgMzMsCisgICAgMjI4LDI0MiwyMzMsMjMxLDIzMiwxMTYsMTI4LCAzMywyMjksMjQ1LDExMiwxMzIsIDMzLDE0NSwgNTUsMTk4LAorICAgICA1NSwyMjYsIDU1LDI0NCwgNTUsMjUyLDEwMCwgIDIsIDU1LDIwNCwgNTUsMjE2LDExMCwxMjksIDMzLDE0OSwKKyAgICAgNTUsMjEwLDIyNiwyNDMsMTAxLDEyOCwgMzMsMTY4LDIzOSwyNDcsMjM4LDIyNiwyMjUsMjQzLDEwMSwxMjgsCisgICAgIDMzLDE2OCwyMzYsMjI5LDIzMCwxMTYsMTI5LCAzMywxNTAsIDU1LDIzNSwyMzksMjMwLDIyOCwyMzksMjQ3LAorICAgIDExMCwxMjgsIDMzLDE5NywyNDIsMjMzLDIzMSwyMzIsMTE2LDEyOCwgMzMsMTUxLDI0NywyMzIsMjMzLDI0NCwKKyAgICAxMDEsMTI4LCAzMywyMzEsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwxMjAsMTI4LDI0OCwyMzAsMTE1LCAgNSwgNTYsCisgICAgIDI1LCA1NiwxMDEsIDU2LDE0NiwgNTYsMjI5LCA1NiwyMzksIDk5LCAgMiwgNTYsIDMxLCA1NiwgODMsMjMzLAorICAgIDEwNSwgIDIsIDU2LCAzOCwgNTYsIDYxLDIyNywyMzMsMjQyLDIyNywyNDUsMTA5LDEyOSwgIDAsIDk0LCA1NiwKKyAgICAgNDksMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNjIsMjQ0LDIzMywyMzYsCisgICAgMjI4LDEwMSwxMjksICAwLDEyNiwgNTYsIDcxLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLAorICAgIDEyOCwyNTUsIDk0LDI0MiwyMzMsMjQwLDExNiwxMjksICAyLCA4MSwgNTYsIDkyLDI0NCwyNDUsMjQyLDIzOCwKKyAgICAyMjksMTAwLDEyOCwgIDIsIDgyLDIzNywyMjUsMjM2LDEwOCwgIDIsIDU2LDExMCwgNTYsMTIxLDIzMiwyMzMsCisgICAgMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgNjUsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LAorICAgICA5NywxMjksIDQ4LDE2MSwgNTYsMTM0LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwKKyAgICAyNTUsMTAzLDI0NCwyMjksMjQyLDIzMywxMTUsICAyLCA1NiwxNTYsIDU2LDIyNSwxMDcsMTMxLCAgMCwgNDIsCisgICAgIDU2LDE2NiwgNTYsMTk0LCA1NiwyMTcsIDk3LCAgMiwgNTYsMTcyLCA1NiwxODYsMjM2LDI0NCwyMzksMjM4LAorICAgIDIyOSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LDEwOSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwKKyAgICAgIDYsMTA5LDEwOSwgIDIsIDU2LDIwMCwgNTYsMjA2LDIyNSwyNDQsMTA0LDEyOCwgMzQsIDIzLDIzOSwyMzgsCisgICAgMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMTAsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjU0LAorICAgICA5NywxMDksMTI4LCAzMiwgNjYsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwyNDYsMjMzLDI0OSwKKyAgICAyMzcsMjQwLDI0NCwyMzksMjQ0LDIzMywyMjcsMjI1LDIzNiwyMzYsMjQ5LDIyOSwyNDEsMjQ1LDIyNSwxMDgsCisgICAgMTI4LCAzNCwgNjcsMTE2LDEzMiwgIDAsIDY0LCA1NywgMTUsIDU3LCAyMiwgNTcsIDM0LCA1NywgNDIsMjMzLAorICAgIDIzNiwyMjgsMTAxLDEyOCwgIDAsMjI3LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwKKyAgICAyNTUsIDMyLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI1NCwxMDcsMjQ1LDI0MiwyMzgsMjI5LDEwMCwxMjgsCisgICAgICAyLCA4MCwxMTcsICA2LCA1NywgNjQsIDU3LCA4OSwgNTcsIDk2LCA1NywxMjEsIDU3LDE0MSwgNTcsMTU3LAorICAgICA5OCwgIDIsIDU3LCA3MCwgNTcsIDc5LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTQ4LDIzOSwKKyAgICAyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAzMiwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgMjAsCisgICAgMjMxLDExNywgIDIsIDU3LDEwMywgNTcsMTEyLDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTQ4LAorICAgIDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDIwLDIzNiwyMjksMjM4LDIzMSwyNDQsMjMyLDIzNywKKyAgICAyMjUsMjQyLDIzNSwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMTUsMjM3LDIyNSwyNDQsCisgICAgMjQyLDIyNSwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDc2LDI0NiwyMzksMjQ3LAorICAgIDIyOSwyMzYsMjQzLDIzMywyMzEsMTEwLCAgMywgNTcsMTczLCA1NywxODMsIDU3LDE5MCwyMjYsMjI5LDIzOCwKKyAgICAyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMDQsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDc2LDIzMSwyNDUsCisgICAgMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwyMDQsMjQ2LDIyNSwyMzEsMjQyLDIyNSwyMzIsMjI1LAorICAgIDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA2MSwxMjEsICAyLCA1NywyMjEsIDU3LDIzMywyMjYsMjI1LDI0MiwKKyAgICAyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA5NywyMzMsMTEwLDEzMCwgIDUsMjI2LCA1NywyNDIsCisgICAgIDU4LCAgMSwyMjUsMjM2LDI0NCwyMzksMjM4LDIyOSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLAorICAgICAzMiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIyNiwgOTgsMTQ0LCAgMCwgOTgsIDU4LCA0NiwKKyAgICAgNTgsMTgxLCA1OCwxOTIsIDU4LDIwMSwgNTgsMjI2LCA2MCwgMTEsIDYwLCA3MywgNjAsMTQ2LCA2MiwgNzIsCisgICAgIDYyLCA4NCwgNjIsMTI3LCA2MiwxMzUsIDYyLDE0NSwgNjQsIDE1LCA2NCwgMzksIDY0LCA0OCwgOTcsICA3LAorICAgICA1OCwgNjIsIDU4LCA3MiwgNTgsIDk2LCA1OCwxMDMsIDU4LDEyOCwgNTgsMTUyLCA1OCwxNjMsMjI2LDIyOSwKKyAgICAyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTcyLDIyNywyMzUsMjQzLDIzNiwyMjUsMjQzLDEwNCwxMjksCisgICAgICAwLCA5MiwgNTgsIDg0LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDYwLAorICAgIDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA0NCwyMzEsMTE3LCAgMiwgNTgsMTEwLCA1OCwxMTksMjM0LDIyNSwKKyAgICAyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNzIsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgNDQsCisgICAgMTA0LCAgMiwgNTgsMTM0LCA1OCwxNDQsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTEyLAorICAgIDI0NCwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNjMsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywKKyAgICAxMjgsIDQ4LDIwOCwxMTQsMTI5LCAgMCwxMjQsIDU4LDE2OSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsCisgICAgMjI3LDEwMSwxMjgsMjU1LCA5MiwyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksICA1LAorICAgIDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMjA5LDIyOCwyMzksMTE2LCAgMiwgNTgsMjA5LCA1OCwKKyAgICAyMTgsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAzMCwgIDMsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsCisgICAgIDMwLCAgNSwxMDEsICA2LCA1OCwyNDAsIDU5LCAgNSwgNTksIDI4LCA1OSwxNzAsIDU5LDE4MSwgNTksMTkzLAorICAgIDIyNSwyMzcsMjI5LDIyOCwyNDMsMjMzLDI0OCwyNDQsMjI5LDIyOSwyMzgsMjQ0LDIzMiwyMzgsMjM5LDI0NCwKKyAgICAyMjksMTE1LDEyOCwgMzgsMTA4LCA5OSwgIDIsIDU5LCAxMSwgNTksIDE4LDIyNSwyNDUsMjQzLDEwMSwxMjgsCisgICAgIDM0LCA1MywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNDksMTA0LCAgNSwgNTksIDQwLAorICAgICA1OSwgNDksIDU5LCA2MywgNTksIDkzLCA1OSwxNTIsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwKKyAgICAgNDAsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE0NCwxMDUsCisgICAgICAyLCA1OSwgNjksIDU5LCA4NCwyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLAorICAgICA5OSwxMjgsMjU0LDE0NSwyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEyMSwyMzcsMTAxLCAgMiwKKyAgICAgNTksMTAwLCA1OSwxMTMsMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsCisgICAgMTQ2LDIyOSwyMzcsMTA1LCAgMiwgNTksMTIxLCA1OSwxMzYsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LAorICAgIDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwxNTksMjQzLDIzOSwyMzYsMjI1LDI0NCwyMjksMjI4LDIyNSwKKyAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsICA4LDIzOCwyMzksMjM5LDIzOCwyMzAsMjMzLDIzOCwyMjUsCisgICAgMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsMTA5LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LAorICAgIDIzOCwgOTcsMTI4LCA0OCwyMTcsMjM4LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwKKyAgICAgOTgsMTE2LDEzMiwgIDUsMjA5LCA1OSwyMDUsIDU5LDIyNSwgNTksMjQ1LCA1OSwyNTQsIDk3LDEyOSwgIDMsCisgICAgMTc4LCA1OSwyMTEsMjQzLDI0OSwyMzcsMjI2LDIzOSwyMzYsMjMxLDI0MiwyMjksMjI5LDEwNywxMjgsICAzLAorICAgIDIwOCwyMjgsMjI1LDIzMSwyMjksMjQzLDEwNCwxMjksMjUxLCA0OSwgNTksMjM2LDIzMiwyMjksMjI2LDI0MiwKKyAgICAyMjksMTE5LDEyOCwyNTEsIDQ5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjA5LDI0MiwyMjUsCisgICAgMjMwLDIyOSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA3NiwxMDQsICAyLCA2MCwgMTcsIDYwLAorICAgICA2NywgOTcsICAzLCA2MCwgMjUsIDYwLCAzNSwgNjAsIDQyLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwKKyAgICAxMjgsICA5LDE3MywyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNDUsMjMxLDExNywgIDIsIDYwLCA0OSwgNjAsCisgICAgIDU4LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTczLDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LAorICAgIDEyOCwgMTAsIDQ1LDIzOSwyMzksMTA3LDEyOCwgIDIsIDgzLDEwNSwgIDUsIDYwLCA4NSwgNjAsIDk2LCA2MCwKKyAgICAxMDcsIDYwLDEyMSwgNjAsMTM1LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMTUsCisgICAgMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDIxMSwyMzYsMjI1LDIyNiwyMzMsMjI1LAorICAgIDIzNiwyMjcsMjM2LDIzMywyMjcsMTA3LDEyOCwgIDIsMTUyLDIzOCwyMjgsMjMzLDIzMSwyNDUsMjQyLDIzNywKKyAgICAyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgIDIsMjQyLDI0NSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsCisgICAgIDUxLCA0OSwxMDgsICAzLCA2MCwxNTQsIDYyLCA1NSwgNjIsIDY2LCA5NywgIDIsIDYwLDE2MCwgNjIsIDUwLAorICAgIDIyNywxMDcsICA2LCA2MCwxNzUsIDYwLDE4NCwgNjAsMjIxLCA2MSwxMTQsIDYxLDE2OSwgNjEsMjIxLDIyNywKKyAgICAyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzcsMjA3LDEwMCwgIDIsIDYwLDE5MCwgNjAsMTk5LDIzMywyMjUsCisgICAgMjM3LDIzOSwyMzgsMTAwLDEyOCwgMzcsMTk4LDIzOSwyNDcsMjM4LDI0MCwyMzksMjMzLDIzOCwyNDQsMjMzLAorICAgIDIzOCwyMzEsMjQ0LDI0MiwyMzMsMjI1LDIzOCwyMzEsMjM2LDEwMSwxMjgsIDM3LDE4OCwxMDgsICAyLCA2MCwKKyAgICAyMjcsIDYxLCA3NCwxMDEsICAyLCA2MCwyMzMsIDYxLCAxMywyMzAsMjQ0LDI0MCwyMzksMjMzLDIzOCwyNDQsCisgICAgMjMzLDIzOCwxMDMsICAyLCA2MCwyNDgsIDYxLCAgMiwyNDAsMjM5LDIzMywyMzgsMjQ0LDIyOSwxMTQsMTI4LAorICAgICAzNywxOTYsMjQ0LDI0MiwyMzMsMjI1LDIzOCwyMzEsMjM2LDEwMSwxMjgsIDM3LDE5MiwyMzgsMjQ0LDIzMywKKyAgICAyMjcsMjQ1LDIzNiwyMjUsMjQyLDIyNiwyNDIsMjI1LDIyNywyMzUsMjI5LDExNiwgIDIsIDYxLCAzMywgNjEsCisgICAgIDUzLDIzNiwyMjksMjMwLDExNiwxMjksIDQ4LCAxNiwgNjEsIDQyLDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LAorICAgIDIyNSwxMDgsMTI4LDI1NCwgNTksMjQyLDIzMywyMzEsMjMyLDExNiwxMjksIDQ4LCAxNywgNjEsIDYzLDI0NiwKKyAgICAyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LDI1NCwgNjAsMjM5LDI0NywyMjksMTE0LCAgMiwgNjEsCisgICAgIDgzLCA2MSwgOTgsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyNDIsMjMzLDIyNSwyMzgsMjMxLDIzNiwxMDEsMTI4LAorICAgICAzNywyMjcsMjQyLDIzMywyMzEsMjMyLDI0NCwyNDQsMjQyLDIzMywyMjUsMjM4LDIzMSwyMzYsMTAxLDEyOCwKKyAgICAgMzcsMjI2LDExNCwgIDIsIDYxLDEyMCwgNjEsMTMxLDIyOSwyMjcsMjQ0LDIyNSwyMzgsMjMxLDIzNiwxMDEsCisgICAgMTI4LCAzNywxNzIsMjMzLDIzMSwyMzIsMjQ0LDI0MCwyMzksMjMzLDIzOCwyNDQsMjMzLDIzOCwxMDMsICAyLAorICAgICA2MSwxNDgsIDYxLDE1OCwyNDAsMjM5LDIzMywyMzgsMjQ0LDIyOSwxMTQsMTI4LCAzNywxODYsMjQ0LDI0MiwKKyAgICAyMzMsMjI1LDIzOCwyMzEsMjM2LDEwMSwxMjgsIDM3LDE4MiwxMTUsICAzLCA2MSwxNzcsIDYxLDIwNywgNjEsCisgICAgMjE1LDEwOSwgIDIsIDYxLDE4MywgNjEsMTk1LDIyNSwyMzYsMjM2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLAorICAgIDEyOCwgMzcsMTcwLDIzMywyMzYsMjMzLDIzOCwyMzEsMjMwLDIyNSwyMjcsMTAxLDEyOCwgMzgsIDU5LDI0MSwKKyAgICAyNDUsMjI1LDI0MiwxMDEsMTI4LCAzNywxNjAsMjQ0LDIyNSwxMTQsMTI4LCAzOCwgIDUsMjQ1LDI0MCwxMTIsCisgICAgICAyLCA2MSwyMjksIDYyLCAxMSwyMjksMTE0LCAgMiwgNjEsMjM2LCA2MSwyNTEsMjM2LDIyOSwyMzAsMjQ0LAorICAgIDI0NCwyNDIsMjMzLDIyNSwyMzgsMjMxLDIzNiwxMDEsMTI4LCAzNywyMjgsMjQyLDIzMywyMzEsMjMyLDI0NCwKKyAgICAyNDQsMjQyLDIzMywyMjUsMjM4LDIzMSwyMzYsMTAxLDEyOCwgMzcsMjI5LDIzOSwyMzMsMjM4LDI0NCwyMzMsCisgICAgMjM4LDEwMywgIDIsIDYyLCAyMywgNjIsIDM5LDI0MywyMzcsMjI1LDIzNiwyMzYsMjQ0LDI0MiwyMzMsMjI1LAorICAgIDIzOCwyMzEsMjM2LDEwMSwxMjgsIDM3LDE4MCwyNDQsMjQyLDIzMywyMjUsMjM4LDIzMSwyMzYsMTAxLDEyOCwKKyAgICAgMzcsMTc4LDIzOCwxMDcsMTI4LCAzNiwgMzUsMjMzLDIzOCwyMjksMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsCisgICAgIDMwLCAgNywyMzksMjI3LDEwNywxMjgsIDM3LDEzNiwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LAorICAgIDEwMSwxMjgsMjU1LCA2NiwxMTEsICAzLCA2MiwgOTIsIDYyLDEwNSwgNjIsMTE2LDIyNiwyMjUsMjMzLDIzNywKKyAgICAyMjUsMjMzLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAyNiwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsCisgICAgIDk3LDEyOCwgNDgsMTI0LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyMjAsMjQwLAorICAgIDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDE1NywyNDEsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwKKyAgICAxOTUsMTE0LCAgNCwgNjIsMTU1LCA2MywxNDksIDYzLDIyMiwgNjQsICA1LDIyNSwgOTksICAyLCA2MiwxNjIsCisgICAgIDYzLCA1NiwxMDEsICAzLCA2MiwxNzAsIDYyLDE3NSwgNjIsMjQzLDIyOSwxMjAsMTI4LDI0OCwyNDQsMjM2LAorICAgIDIyOSwyMzAsMTE2LDEzMywgIDAsMTIzLCA2MiwxOTIsIDYyLDE5NywgNjIsMjE5LCA2MiwyMjcsIDYyLDIzMiwKKyAgICAyMjYsMTE2LDEyOCwyNDgsMjQzLDEwOSwgIDIsIDYyLDIwMywgNjIsMjA4LDIzMywxMDAsMTI4LDI0OCwyNDIsCisgICAgMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA5MSwyNDMsMjM3LDIyNSwyMzYsMTA4LAorICAgIDEyOCwyNTQsIDkxLDI0NCwxMTIsMTI4LDI0OCwyNDEsMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwKKyAgICAxMjgsMjU0LCA1NSwyNDIsMjMzLDIzMSwyMzIsMTE2LDEzMywgIDAsMTI1LCA2MywgIDUsIDYzLCAxMCwgNjMsCisgICAgIDMyLCA2MywgNDAsIDYzLCA0NSwyMjYsMTE2LDEyOCwyNDgsMjU0LDEwOSwgIDIsIDYzLCAxNiwgNjMsIDIxLAorICAgIDIzMywxMDAsMTI4LDI0OCwyNTMsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA5MywKKyAgICAyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsIDkyLDI0NCwxMTIsMTI4LDI0OCwyNTIsMjQ2LDIyOSwyNDIsCisgICAgMjQ0LDIzMywyMjcsMjI1LDEwOCwxMjgsMjU0LCA1NiwyMzUsMjI5LDExNiwgIDIsIDYzLCA2NCwgNjMsMTA2LAorICAgIDIzNiwyMjksMjMwLDExNiwxMzIsICAwLCA5MSwgNjMsIDc5LCA2MywgODQsIDYzLCA4OSwgNjMsMTAxLDIyNiwKKyAgICAxMTYsMTI4LDI0OCwyNDAsMjI5LDEyMCwxMjgsMjQ4LDIzOSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsCisgICAgMjI3LDEwMSwxMjgsMjU1LCA1OSwyNDQsMTEyLDEyOCwyNDgsMjM4LDI0MiwyMzMsMjMxLDIzMiwxMTYsMTMyLAorICAgICAgMCwgOTMsIDYzLDEyMiwgNjMsMTI3LCA2MywxMzIsIDYzLDE0NCwyMjYsMTE2LDEyOCwyNDgsMjUxLDIyOSwKKyAgICAxMjAsMTI4LDI0OCwyNTAsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNjEsCisgICAgMjQ0LDExMiwxMjgsMjQ4LDI0OSwyMjksMjQ2LDEwMSwxMzEsICAyLDIxNiwgNjMsMTYxLCA2MywxNzIsIDYzLAorICAgIDE3OCwyMjYsMjI5LDIzNiwyMzksMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDQ2LDIyNywyMzcsIDk4LDEyOCwKKyAgICAgIDMsICA2LDIzMywyMzgsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwxMDAsICAzLCA2MywxOTMsIDYzLDIwNCwgNjMsCisgICAgMjEwLDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgNDcsMjI3LDIzNywgOTgsMTI4LAorICAgICAgMywgMTcsMjI4LDIzOSwyNDUsMjI2LDIzNiwyMjksMjI3LDIzNywgOTgsMTI4LCAgMywgOTcsMjMzLDIyOCwKKyAgICAyMzEsMTAxLCAgMiwgNjMsMjMxLCA2MywyNDIsMjI2LDIyOSwyMzYsMjM5LDI0NywyMjcsMjM3LCA5OCwxMjgsCisgICAgICAzLCA0MiwyMzMsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LAorICAgIDIzNywgOTgsMTI4LCAgMywgNTgsMjM5LDIzNSwyMjksMjM4LDIyNiwyMjUsMTE0LDEyOCwgIDAsMTY2LDExNSwKKyAgICAgIDIsIDY0LCAyMSwgNjQsIDI5LDI0NCwyNDIsMjM5LDIzNSwxMDEsMTI4LCAgMSwxMjgsMjQ1LDI0MCwyMjksCisgICAgMjQyLDIzMywyMzksMTE0LDEyOCwyNDYsMjM0LDI0NCwyMzksMjQwLDIyNiwyMjUsMTE0LDEyOCwgIDEsMTMxLAorICAgIDExNywgIDMsIDY0LCA1NiwgNjQsIDY3LCA2NCwgNzgsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywKKyAgICAxMjgsIDQ4LDExOCwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMjE0LDIzNiwxMDgsCisgICAgICAyLCA2NCwgODUsIDY0LDExNSwyMjksMTE2LDEzMCwgMzIsIDM0LCA2NCwgOTQsIDY0LDEwNCwyMzMsMjM4LAorICAgIDI0NiwyMjksMjQyLDI0MywxMDEsMTI4LCAzNywyMTYsMjM5LDI0MCwyMjksMjQyLDIyNSwyNDQsMjM5LDExNCwKKyAgICAxMjgsIDM0LCAyNSwyNDMsMjI5LDI0OSwxMDEsMTI4LCAzNywyMDYsIDk5LDE0MywgIDAsIDk5LCA2NCwxNTYsCisgICAgIDY1LDEwNSwgNjUsMTE2LCA2NSwxODAsIDY1LDIxMSwgNjYsIDQ4LCA2NywyMTUsIDY4LDE5OSwgNjksIDQzLAorICAgICA2OSwgOTIsIDcyLCA4NCwgNzIsIDkyLCA3MiwxMDIsIDcyLDExNCwgNzIsMTQ3LCA5NywgIDksIDY0LDE3NiwKKyAgICAgNjQsMTg3LCA2NCwxOTcsIDY0LDIwNCwgNjQsMjExLCA2NCwyMzYsIDY0LDI0NiwgNjUsIDQyLCA2NSwgNTEsCisgICAgMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDExMCwyMjYsMjI5LDIzOCwyMzEsMjI1LAorICAgIDIzNiwxMDUsMTI4LCAgOSwxNTQsMjI3LDI0NSwyNDQsMTAxLDEyOCwgIDEsICA3LDIyOCwyMjksMjQ2LCA5NywKKyAgICAxMjgsICA5LCAyNiwyMzEsMTE3LCAgMiwgNjQsMjE4LCA2NCwyMjcsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsCisgICAgMTI4LCAxMCwxNTQsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMjYsMjM2LDI0MywyNDEsMjQ1LAorICAgIDIyNSwyNDIsMTAxLDEyOCwgNTEsMTM2LDIzOCwyMjgsMjQyLDIyNSwyMjYsMjMzLDIzOCwyMjgsMTE3LCAgNCwKKyAgICAgNjUsICA4LCA2NSwgMTgsIDY1LCAyNCwgNjUsIDMxLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsCisgICAgICA5LDEyOSwyMjcsMjM3LCA5OCwxMjgsICAzLCAxNiwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgIDEsMjMxLAorICAgIDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDEyOSwyNDAsMjQzLDIzNiwyMzksMjI3LDEwNywKKyAgICAxMjgsIDMzLDIzNCwxMTQsICAzLCA2NSwgNTksIDY1LCA2NSwgNjUsIDkxLDIyOSwyMzksMTAyLDEyOCwgMzMsCisgICAgICA1LDIzOSwxMTAsMTMwLCAgMiwxOTksIDY1LCA3NCwgNjUsIDg1LDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LAorICAgIDIzNywgOTgsMTI4LCAgMywgNDQsMjI3LDIzNywgOTgsMTI4LCAgMywgMTIsMjQyLDIzMywyMjUsMjMxLDIyOSwKKyAgICAyNDIsMjI5LDI0NCwyNDUsMjQyLDExMCwxMjgsIDMzLDE4MSwyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsCisgICAgMTExLDEyOCwgNDksIDI0LCA5OSwgIDQsIDY1LDEyNiwgNjUsMTMzLCA2NSwxNTIsIDY1LDE3NCwyMjUsMjQyLAorICAgIDIzOSwxMTAsMTI4LCAgMSwgMTMsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI5LCAgMCwyMzEsIDY1LDE0NCwKKyAgICAyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsICA5LDIzMywyNDIsIDk5LCAgMiwgNjUsMTYwLCA2NSwxNjUsCisgICAgMjM2LDEwMSwxMjgsIDM2LDIxMCwyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwxMjgsICAxLCAgOSwyNDUsMjQyLAorICAgIDEwOCwxMjgsICAyLCA4NSwxMDAsICAyLCA2NSwxODYsIDY1LDIwMiwyMzksMTE2LDEyOSwgIDEsIDExLCA2NSwKKyAgICAxOTMsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAgMSwgMTEsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsCisgICAgMTI4LCA1MSwxOTcsMTAxLCAgMiwgNjUsMjE3LCA2NSwyMzMsMjI4LDIzMywyMzYsMjM2LCA5NywxMjksICAwLAorICAgIDE4NCwgNjUsMjI3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDM5LDIzOCwxMTYsMTMyLCAgMCwxNjIsIDY1LDI0NiwKKyAgICAgNjYsIDE0LCA2NiwgMjYsIDY2LCAzNywxMDUsICAyLCA2NSwyNTIsIDY2LCAgNCwyMzEsMjQyLDIyNSwyMjgsCisgICAgMTAxLDEyOCwgMzMsICAzLDIzOCwyMzAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDIyMywyMzcsMjM5LAorICAgIDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LDIyNCwyMzksMjM2LDIyOCwyNDMsMjQ0LDI0OSwKKyAgICAyMzYsMTAxLDEyOCwyNDcsMTYyLDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LDI0NiwyMjQsCisgICAgMTA0LCAgNSwgNjYsIDYwLCA2NiwxMjMsIDY2LDEzNCwgNjcsIDYyLCA2NywxNTQsIDk3LCAgNCwgNjYsIDcwLAorICAgICA2NiwgODEsIDY2LCA5MSwgNjYsIDk4LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwKKyAgICAxMjEsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTU1LDIyOCwyMjksMjQ2LCA5NywxMjgsCisgICAgICA5LCAyNywyMzEsMTE3LCAgMiwgNjYsMTA1LCA2NiwxMTQsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LAorICAgICAxMCwxNTUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMjcsMjI2LDIzOSwyNDAsMjM5LDIzNywKKyAgICAyMzksMjMwLDExMSwxMjgsIDQ5LCAyMCwxMDEsICA2LCA2NiwxNDgsIDY2LDE2OCwgNjYsMTkyLCA2NywgIDQsCisgICAgIDY3LCAxNiwgNjcsIDM3LDIyNSwyMjYsMjM1LDIzMiwyMjUsMjQzLDIzMywyMjUsMjM4LDIyNywyNDksMjQyLAorICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxODksIDk5LCAgMiwgNjYsMTc0LCA2NiwxODIsMjM1LDIzNywKKyAgICAyMjUsMjQyLDEwNywxMjgsIDM5LCAxOSwyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNzEsCisgICAgMTAwLCAgMiwgNjYsMTk4LCA2NiwyNDIsMjI5LDI0MywyMjcsMjI5LDIzOCwyMjgsMjI5LDExNCwgIDIsIDY2LAorICAgIDIxMSwgNjYsMjMxLDIyNSwyMjYsMjM1LDIzMiwyMjUsMjQzLDIzMywyMjUsMjM4LDIyNywyNDksMjQyLDIzMywKKyAgICAyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxOTEsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsCisgICAgICA0LDE4MywyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywyNDMsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLAorICAgICA5OSwxMjgsICA0LDI0NSwyMzIsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDExNSwKKyAgICAyMzUsMjMyLDIyNSwyMzUsMjI1LDI0MywyNDMsMjMzLDIyNSwyMzgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCisgICAgMjMzLCA5OSwxMjgsICA0LDIwNCwyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMjM2LDI0MywyNDQsMjQyLAorICAgIDIzOSwyMzUsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxODUsMTA1LDEyOSwKKyAgICAgIDMsMTk5LCA2NywgNjgsMjI5LDI0NSwyMjcsMTA0LCAgNCwgNjcsIDgxLCA2NywxMTYsIDY3LDEzMSwgNjcsCisgICAgMTQwLCA5NywgIDIsIDY3LCA4NywgNjcsMTAyLDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLAorICAgIDIyOSwyMjUsMTEwLDEyOCwgNTAsMTE5LDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwKKyAgICAxMTAsMTI4LCA1MCwgMjMsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsCisgICAgMTI4LCA1MCwxMDUsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNzQsMjQwLDIyNSwyNDIsMjI5LAorICAgIDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAgOSwxMTEsICAyLCA2NywxNjAsIDY3LDIxMCwKKyAgICAyMjcsMTA0LCAgMywgNjcsMTY5LCA2NywxOTEsIDY3LDIwMSwyMjUsMTEwLCAgMiwgNjcsMTc2LCA2NywxODQsCisgICAgMjMxLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAxMCwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgIDgsMjMzLAorICAgIDIzOCwyMzEsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsICA5LDIzOSwyMjksMjQ0LDIzMiwyMjUsMTA1LDEyOCwKKyAgICAgMTQsIDEyLDIzOSwxMDcsMTI4LCAgMSwxMzYsMTA1LCAgMiwgNjcsMjIxLCA2OCwgNjcsMjI5LDI0NSwgOTksCisgICAgICA1LCA2NywyMzUsIDY4LCAxNCwgNjgsIDI5LCA2OCwgMzgsIDY4LCA1MiwgOTcsICAyLCA2NywyNDEsIDY4LAorICAgICAgMCwyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLDExOCwKKyAgICAyNDAsMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsIDIyLDIyNywyMzMsCisgICAgMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsMTA0LDIzNSwyMzksMjQyLAorICAgIDIyOSwyMjUsMTEwLDEyOCwgNDksIDcyLDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwKKyAgICAxMTAsMTI4LCA1MCwgIDgsMjQ1LDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsCisgICAgMTI4LCA1MCwgMjgsMjQyLCA5OSwgIDIsIDY4LCA3NCwgNjgsMTY5LDIzNiwxMDEsMTMyLCAzNywyMDMsIDY4LAorICAgICA4NywgNjgsIDk4LCA2OCwxMDMsIDY4LDEyNywyMzcsMjQ1LDIzNiwyNDQsMjMzLDI0MCwyMzYsMTIxLDEyOCwKKyAgICAgMzQsMTUxLDIzOSwxMTYsMTI4LCAzNCwxNTMsMTEyLCAgMiwgNjgsMTA5LCA2OCwxMTUsMjM2LDI0NSwxMTUsCisgICAgMTI4LCAzNCwxNDksMjM5LDI0MywyNDQsMjI1LDIzNiwyMzcsMjI1LDI0MiwxMDcsMTI4LCA0OCwgNTQsMjQ3LAorICAgIDIzMywyNDQsMTA0LCAgMiwgNjgsMTM2LCA2OCwxNTIsMjM2LDIyOSwyMzAsMjQ0LDIzMiwyMjUsMjM2LDIzMCwKKyAgICAyMjYsMjM2LDIyNSwyMjcsMTA3LDEyOCwgMzcsMjA4LDI0MiwyMzMsMjMxLDIzMiwyNDQsMjMyLDIyNSwyMzYsCisgICAgMjMwLDIyNiwyMzYsMjI1LDIyNywxMDcsMTI4LCAzNywyMDksMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTMwLAorICAgICAgMiwxOTgsIDY4LDE4MiwgNjgsMTkzLDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywKKyAgICAgNDUsMjI3LDIzNywgOTgsMTI4LCAgMywgIDIsMTA4LCAgMywgNjgsMjA3LCA2OCwyMTMsIDY5LCAxMSwyMjksCisgICAgMjI1LDExNCwxMjgsIDM1LCAzOSwyMzMsMjI3LDEwNywgIDQsIDY4LDIyNSwgNjgsMjM2LCA2OCwyNDUsIDY4LAorICAgIDI1NSwyMjUsMjM2LDI0NiwyMjksMjM5LDIzNiwyMjUsMTE0LDEyOCwgIDEsMTk0LDIyOCwyMjksMjM4LDI0NCwKKyAgICAyMjUsMTA4LDEyOCwgIDEsMTkyLDIzNiwyMjUsMjQ0LDIyOSwyNDIsMjI1LDEwOCwxMjgsICAxLDE5MywyNDIsCisgICAgMjI5LDI0NCwyNDIsMjM5LDIzMCwyMzYsMjI5LDEyMCwxMjgsICAxLDE5NSwyNDUsIDk4LDEyOSwgMzgsIDk5LAorICAgICA2OSwgMTgsMjQzLDI0NSwyMzMsMTE2LCAgMiwgNjksIDI3LCA2OSwgMzUsMjI2LDIzNiwyMjUsMjI3LDEwNywKKyAgICAxMjgsIDM4LCA5OSwyNDcsMjMyLDIzMywyNDQsMTAxLDEyOCwgMzgsMTAzLDEwOSwgIDMsIDY5LCA1MSwgNjksCisgICAgIDY1LCA2OSwgNzYsMjI3LDI0NSwyMjYsMjI5LDIyOCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLAorICAgIDE2NCwyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDY3LDI0MywyNDEsMjQ1LDIyNSwKKyAgICAyNDIsMjI5LDIyOCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE2MCwxMTEsICA4LCA2OSwxMTAsCisgICAgIDY5LDEyMSwgNjksMjA4LCA3MCwxNTAsIDcxLDE3OSwgNzEsMjEwLCA3MiwgNjEsIDcyLCA3MCwyMjUsMjQyLAorICAgIDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsMTI5LDIzNiwyMzksMTEwLDEzMSwgIDAsIDU4LCA2OSwKKyAgICAxMzMsIDY5LDE1OCwgNjksMTc3LDIzNywyMzksMTEwLCAgMiwgNjksMTQxLCA2OSwxNDksMjI5LDI0NCwyMjUsCisgICAgMjQyLDEyMSwxMjgsIDMyLDE2MSwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAyNiwxMTUsICAyLAorICAgICA2OSwxNjQsIDY5LDE3MCwyMzMsMjMxLDExMCwxMjgsIDMyLDE2MSwyMzcsMjI1LDIzNiwxMDgsMTI4LDI1NCwKKyAgICAgODUsMjQ0LDI0MiwyMzMsMjI1LDIzOCwyMzEsMjQ1LDIzNiwyMjUsMTE0LCAgMiwgNjksMTkyLCA2OSwyMDIsCisgICAgMjMyLDIyNSwyMzYsMjMwLDIzNywyMzksMTAwLDEyOCwgIDIsMjA5LDIzNywyMzksMTAwLDEyOCwgIDIsMjA4LAorICAgIDEwOSwgIDIsIDY5LDIxNCwgNzAsMTQzLDIzNywgOTcsMTM0LCAgMCwgNDQsIDY5LDIzMSwgNzAsIDM5LCA3MCwKKyAgICAgNTAsIDcwLCA2MiwgNzAsIDkyLCA3MCwxMTUsIDk3LCAgMywgNjksMjM5LCA3MCwgIDksIDcwLCAxNywyMjYsCisgICAgMjM5LDI0NiwxMDEsICAyLCA2OSwyNDgsIDY5LDI1NCwyMjcsMjM3LCA5OCwxMjgsICAzLCAxOSwyNDIsMjMzLAorICAgIDIzMSwyMzIsMjQ0LDIyNywyMzcsIDk4LDEyOCwgIDMsIDIxLDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LDI0NiwKKyAgICAxOTUsMTE0LCAgMiwgNzAsIDIzLCA3MCwgMzAsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDEyLDIzNywyMjksCisgICAgMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDkzLDIzMywyMzgsMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LAorICAgIDI0NiwyMjUsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMTIsMjQyLDIyOSwKKyAgICAyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwgIDIsIDcwLCA3NSwgNzAsIDg2LDIyNSwyMjYsMjM5LDI0NiwyMjksCisgICAgMjI3LDIzNywgOTgsMTI4LCAgMywgMjAsMjM3LDIzOSwxMDAsMTI4LCAgMiwxODksMTE1LCAgMiwgNzAsIDk4LAorICAgICA3MCwxMDUsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsIDgwLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwKKyAgICAxMjgsMjQ2LDIyNiwyNDQsMjQ1LDI0MiwyMzgsMjI5LDEwMCwgIDIsIDcwLDEyNiwgNzAsMTM3LDIyNSwyMjYsCisgICAgMjM5LDI0NiwyMjksMjI3LDIzNywgOTgsMTI4LCAgMywgMTgsMjM3LDIzOSwxMDAsMTI4LCAgMiwxODcsMjQwLAorICAgIDIyNSwyNDMsMTE1LDEyOCwgMzgsIDYwLDExMCwgIDIsIDcwLDE1NiwgNzAsMTY1LDIzMSwyNDIsMjQ1LDIyOSwKKyAgICAyMzgsMTE2LDEyOCwgMzQsIDY5LDExNiwgIDIsIDcwLDE3MSwgNzAsMTg1LDIzOSwyNDUsMjQyLDIzMywyMzgsCisgICAgMjQ0LDIyOSwyMzEsMjQyLDIyNSwxMDgsMTI4LCAzNCwgNDYsMjQyLDIzOSwxMDgsMTQyLCAzNSwgIDMsIDcwLAorICAgIDIxOSwgNzAsMjI1LCA3MCwyNDAsIDcwLDI1NSwgNzEsIDQzLCA3MSwgODgsIDcxLDEwMiwgNzEsMTA3LCA3MSwKKyAgICAxMTIsIDcxLDExNywgNzEsMTIzLCA3MSwxMjgsIDcxLDE2OSwgNzEsMTc0LDE5MywxOTUsIDc1LDEyOCwgIDAsCisgICAgICA2LCA2NiwgIDIsIDcwLDIzMSwgNzAsMjM2LDE5NywgNzYsMTI4LCAgMCwgIDcsIDgzLDEyOCwgIDAsICA4LAorICAgICA2NywgIDIsIDcwLDI0NiwgNzAsMjUxLDE5MywgNzgsMTI4LCAgMCwgMjQsIDgyLDEyOCwgIDAsIDEzLCA2OCwKKyAgICAgIDMsIDcxLCAgNywgNzEsIDMzLCA3MSwgMzgsIDY3LCAgNCwgNzEsIDE3LCA3MSwgMjEsIDcxLCAyNSwgNzEsCisgICAgIDI5LCA0OSwxMjgsICAwLCAxNywgNTAsMTI4LCAgMCwgMTgsIDUxLDEyOCwgIDAsIDE5LCA1MiwxMjgsICAwLAorICAgICAyMCwxOTcsIDc2LDEyOCwgIDAsMTI3LDIwNCwgNjksMTI4LCAgMCwgMTYsIDY5LCAgNSwgNzEsIDU1LCA3MSwKKyAgICAgNTksIDcxLCA2NCwgNzEsIDY5LCA3MSwgNzQsIDc3LDEyOCwgIDAsIDI1LDIwNiwgODEsMTI4LCAgMCwgIDUsCisgICAgMjA3LCA4NCwxMjgsICAwLCAgNCwyMTEsIDY3LDEyOCwgIDAsIDI3LCA4NCwgIDIsIDcxLCA4MCwgNzEsIDg0LAorICAgICA2NiwxMjgsICAwLCAyMywgODgsMTI4LCAgMCwgIDMsIDcwLCAgMiwgNzEsIDk0LCA3MSwgOTgsIDcwLDEyOCwKKyAgICAgIDAsIDEyLCA4MywxMjgsICAwLCAyOCwxOTksIDgzLDEyOCwgIDAsIDI5LDIwMCwgODQsMTI4LCAgMCwgIDksCisgICAgMjA0LCA3MCwxMjgsICAwLCAxMCwyMDYsMTkzLCA3NSwxMjgsICAwLCAyMSwyMTAsIDgzLDEyOCwgIDAsIDMwLAorICAgICA4MywgIDUsIDcxLDE0MCwgNzEsMTQ0LCA3MSwxNTQsIDcxLDE1OSwgNzEsMTY0LCA3MywxMjgsICAwLCAxNSwKKyAgICAgNzksMTI5LCAgMCwgMTQsIDcxLDE1MCwgODQsMTI4LCAgMCwgIDIsMjEyLCA4OCwxMjgsICAwLCAgMSwyMTMsCisgICAgIDY2LDEyOCwgIDAsIDI2LDIxNywgNzgsMTI4LCAgMCwgMjIsMjEzLCA4MywxMjgsICAwLCAzMSwyMTQsIDg0LAorICAgIDEyOCwgIDAsIDExLDI0MCwyNDksMjQyLDIzMywyMzEsMjMyLDExNiwxMjksICAwLDE2OSwgNzEsMTkxLDExNSwKKyAgICAgIDIsIDcxLDE5NywgNzEsMjAzLDIyNSwyMzgsMTE1LDEyOCwyNDgsMjMzLDIyOSwyNDIsMjMzLDEwMiwxMjgsCisgICAgMjQ2LDIxNywxMTQsICAyLCA3MSwyMTYsIDcyLCA0NCwyMzgsMjI5LDI0MiwyMjYsMjQyLDIyNSwyMjcsMjM1LAorICAgIDIyOSwxMTYsICAyLCA3MSwyMzEsIDcyLCAgOSwyMzYsMjI5LDIzMCwxMTYsMTMwLCA0OCwgMTIsIDcxLDI0MiwKKyAgICAgNzEsMjU0LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsIDk4LDI0NiwyMjksCisgICAgMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LDI1NCwgNjUsMjQyLDIzMywyMzEsMjMyLDExNiwxMzAsIDQ4LAorICAgICAxMywgNzIsIDIxLCA3MiwgMzMsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwKKyAgICAgOTksMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwxMjgsMjU0LCA2NiwyNDAsMjM5LDI0MiwyMjUsCisgICAgMjQ0LDIzMywyMzksMjM4LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTI3LDI0MywyNDEsMjQ1LAorICAgIDIyNSwyNDIsMTAxLDEyOCwgNTEsMTk5LDI0NiwyMjksMjQyLDIzNSwyMzEsMjQzLDI0MSwyNDUsMjI1LDI0MiwKKyAgICAxMDEsMTI4LCA1MSwxOTgsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDE1OCwyNDIsMjQ1LDI1MCwyMjksCisgICAgMjMzLDI0MiwxMTEsMTI4LCAzMiwxNjIsMjQzLDI0NCwyNDIsMjI5LDI0NCwyMjcsMjMyLDIyOSwxMDAsMTI4LAorICAgICAgMiwxNTEsMjQ1LDExNCwgIDIsIDcyLDEyMSwgNzIsMTM5LDIzNiwxMjEsICAyLCA3MiwxMjgsIDcyLDEzNCwKKyAgICAyMjUsMjM4LDEwMCwxMjgsIDM0LDIwNywyMzksMTE0LDEyOCwgMzQsMjA2LDI0MiwyMjksMjM4LDIyNywxMjEsCisgICAgMTI4LCAgMCwxNjQsMjQ5LDExNCwgIDQsIDcyLDE1OCwgNzIsMTY2LCA3MiwxNzMsIDcyLDE4MSwxOTQsMjQyLAorICAgIDIyOSwyNDYsMTAxLDEyOCwyNDYsMjA5LDE5OCwyMzYsMjI5LDEyMCwxMjgsMjQ2LDIxMCwyMjYsMjQyLDIyOSwKKyAgICAyNDYsMTAxLDEyOCwyNDYsMjEyLDIzMCwyMzYsMjI5LDEyMCwxMjgsMjQ2LDIxMywxMDAsMTQ2LCAgMCwxMDAsCisgICAgIDcyLDIyOCwgNzQsMTEwLCA3NSwxMzQsIDc1LDE5NCwgNzYsMTE0LCA3NywgNjgsIDc3LDEzMCwgNzgsIDU5LAorICAgICA3OCwgNzIsIDc4LCA4MSwgNzgsMTA3LCA3OCwxMzIsIDc4LDE0MSwgNzksMjA4LCA3OSwyMTYsIDc5LDIyNywKKyAgICAgNzksMjQ3LCA4MCwgMTksIDk3LCAxMSwgNzIsMjUyLCA3MywgIDcsIDczLCAxNywgNzMsIDg5LCA3MywxNTIsCisgICAgIDczLDE2MywgNzMsMTc0LCA3MywyNDMsIDc0LCA0OSwgNzQsIDU1LCA3NCwgODUsMjI1LDI0MiwyMzcsMjI5LAorICAgIDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDEwMCwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwKKyAgICAxNjYsMTAwLCAgNSwgNzMsIDI5LCA3MywgMzgsIDczLCA0NCwgNzMsIDU4LCA3MywgNzQsMjI1LDI0MiwyMjUsCisgICAgMjI2LDIzMywgOTksMTI4LCAgNiwgNTQsMjI5LDI0NiwgOTcsMTI4LCAgOSwgMzgsMjMwLDIzMywyMzgsMjI1LAorICAgIDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE5MCwyMzMsMjM4LDIzMywyNDQsMjMzLDIyNSwKKyAgICAyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxOTEsMjM3LDIyOSwyMjgsMjMzLDIyNSwyMzYsCisgICAgMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxOTIsMTAzLCAgMywgNzMsIDk3LCA3MywxMTQsIDczLAorICAgIDEyOCwyMjksMjQzLDEwNCwxMjksICA1LDE4OCwgNzMsMTA1LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwKKyAgICAgIDUsMTg4LDIzMSwyMjksMTE0LDEyOSwgMzIsIDMyLCA3MywxMjIsMjI4LDIyNiwxMDgsMTI4LCAzMiwgMzMsCisgICAgMTE3LCAgMiwgNzMsMTM0LCA3MywxNDMsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNjYsMjQyLAorICAgIDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMzgsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywKKyAgICAxMjgsIDQ4LCA5NiwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMTkyLDEwOCwgIDMsCisgICAgIDczLDE4MiwgNzMsMTkxLCA3MywyMjksMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNDcsMjI5LAorICAgIDExNiwxMzAsICA1LDIxMSwgNzMsMjAwLCA3MywyMjAsMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwKKyAgICAgNTEsIDczLDIxMSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA1MSwyMzIsMjI5LDIyNiwyNDIsCisgICAgMjI5LDExOSwxMjgsICA1LDIxMSwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LAorICAgIDEyOCwyNTQsMTcwLDIzNywyMzcsIDk3LCAgMywgNzMsMjUzLCA3NCwgIDYsIDc0LCAxOCwyMjUsMjQyLDIyNSwKKyAgICAyMjYsMjMzLCA5OSwxMjgsICA2LCA3OSwyMzYsMjM5LDI0NywyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCisgICAgICA2LCA3OSwyNDQsMjI1LDIzOCwgOTcsICAyLCA3NCwgMjcsIDc0LCA0MSwyMzYsMjQ0LDIzOSwyMzgsMjI5LAorICAgIDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDc2LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwKKyAgICAgNzYsMjM4LDIyOCwgOTcsMTI4LCAgOSwxMDAsMjQyLDIzMSwgOTcsICAyLCA3NCwgNjMsIDc0LCA3MiwyMzIsCisgICAgMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE2NywyMzYsMjI5LDIzMCwyNDQsMjMyLDIyOSwyMjYsMjQyLAorICAgIDIyOSwxMTksMTI4LCAgNSwxNjcsMjQzLDIzMywyMjUsMjQwLDIzOCwyMjksMjQ1LDIzNywyMjUsMjQ0LDIyNSwKKyAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsMjI3LDIyNywyMzcsIDk4LDEyOCwgIDQsMTMzLCA5OCwgIDMsCisgICAgIDc0LDExOCwgNzUsMTE1LCA3NSwxMjUsMTA4LCAgOSwgNzQsMTM4LCA3NCwxNDYsIDc1LCAgMywgNzUsIDExLAorICAgICA3NSwgMjcsIDc1LCAzOCwgNzUsIDU2LCA3NSwgNzAsIDc1LCA4MSwxOTksMjQyLDIyNSwyNDYsMTAxLDEyOCwKKyAgICAyNDYsMjExLCA5NywgIDIsIDc0LDE1MiwgNzQsMjA5LDIzOCwyMzEsMjM2LDIyOSwyMjYsMjQyLDIyNSwyMjcsCisgICAgMjM1LDIyOSwxMTYsICAyLCA3NCwxNjgsIDc0LDE4OCwyMzYsMjI5LDIzMCwxMTYsMTI5LCA0OCwgMTAsIDc0LAorICAgIDE3NywyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LDEyOCwyNTQsIDYxLDI0MiwyMzMsMjMxLDIzMiwKKyAgICAxMTYsMTI5LCA0OCwgMTEsIDc0LDE5OCwyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LDEyOCwyNTQsCisgICAgIDYyLDExNCwgIDIsIDc0LDIxNSwgNzQsMjM2LDIyNywyMzIsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDQsMjI5LAorICAgIDIyOCwyMjYsMjI5LDIzNiwyMzksMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDQzLDI0MiwyMzksMTE5LCAgMiwKKyAgICAgNzQsMjQ0LCA3NCwyNTEsMjM2LDIyOSwyMzAsMTE2LDEyOCwgMzMsMjEyLDI0MiwyMzMsMjMxLDIzMiwxMTYsCisgICAgMTI4LCAzMywyMTAsMjI4LDIyNSwyMzgsMjI4LCA5NywxMjgsICA5LDEwMSwyMzEsMjQyLDIyNSwyNDYsMTAxLAorICAgIDEyOSwyNDYsMjE0LCA3NSwgMjEsMjI3LDIzNywgOTgsMTI4LCAgMywgMTUsMjMzLDIzOCwyNDQsMjI5LDIzMSwKKyAgICAyNDIsMjI1LDEwOCwxMjgsIDM0LCA0NCwyMzYsMjM5LDI0NywyMzYsMjMzLDIzOCwxMDEsMTI5LCAzMiwgMjMsCisgICAgIDc1LCA1MCwyMjcsMjM3LCA5OCwxMjgsICAzLCA1MSwyMzksMjQ2LDIyOSwyNDIsMjM2LDIzMywyMzgsMjI5LAorICAgIDIyNywyMzcsIDk4LDEyOCwgIDMsIDYzLDI0MCwyNDIsMjMzLDIzNywyMjksMjM3LDIzOSwxMDAsMTI4LCAgMiwKKyAgICAxODYsMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwgIDIsIDc1LCA5NCwgNzUsMTAwLDIyNiwyMjUsCisgICAgMTE0LDEyOCwgMzIsIDIyLDIzNiwyMzMsMjM4LDIyOSwyMjUsMjI2LDIzOSwyNDYsMjI5LDIyNywyMzcsIDk4LAorICAgIDEyOCwgIDMsIDE0LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAgOSwyNDMsMjQxLDI0NSwKKyAgICAyMjUsMjQyLDEwMSwxMjgsIDUxLDIwMCwgOTksICA0LCA3NSwxNDQsIDc1LDE1MSwgNzUsMTYwLCA3NSwxODcsCisgICAgMjI1LDI0MiwyMzksMTEwLDEyOCwgIDEsIDE1LDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgMzAsIDE3LAorICAgIDIzMywyNDIsIDk5LCAgMiwgNzUsMTY4LCA3NSwxNzMsMjM2LDEwMSwxMjgsIDM2LDIxMSwyNDUsMjM3LDIzMCwKKyAgICAyMzYsMjI5LDI0OCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDE5LDI0MiwyMzksMjI1LDExNiwxMjgsCisgICAgICAxLCAxNywxMDAsICA0LCA3NSwyMDQsIDc2LCAyOSwgNzYsIDM5LCA3NiwgOTAsIDk3LCAgNCwgNzUsMjE0LAorICAgICA3NSwyMjQsIDc1LDIzMSwgNzYsICAwLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE2MSwKKyAgICAyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgMzMsMjMxLDExNywgIDIsIDc1LDIzOCwgNzUsMjQ3LDIzNCwyMjUsCisgICAgMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTYxLDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDMzLAorICAgIDEwOCwgIDIsIDc2LCAgNiwgNzYsIDE1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTM2LDIzMCwKKyAgICAyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxMzcsMjI4LDIzMiwyMjUsCisgICAgMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDkyLDIzMiwgOTcsICAzLCA3NiwgNDgsIDc2LCA1OCwgNzYsIDY1LAorICAgIDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE2MiwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwKKyAgICAgMzQsMjMxLDExNywgIDIsIDc2LCA3MiwgNzYsIDgxLDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsCisgICAgMTYyLDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDM0LDIzOSwxMTYsICAyLCA3NiwgOTcsIDc2LAorICAgIDEwNiwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsIDMwLCAxMSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwKKyAgICAgMzAsIDEzLDEwMSwgIDgsIDc2LDEzMiwgNzYsMTg1LCA3NiwxOTIsIDc2LDIxNywgNzYsMjI3LCA3NiwyMzgsCisgICAgIDc3LCAyNywgNzcsIDYzLCA5OSwgIDIsIDc2LDEzOCwgNzYsMTc1LDIzMywyMzcsMjI1LDIzNiwyNDMsMjI5LAorICAgIDI0MCwyMjUsMjQyLDIyNSwyNDQsMjM5LDExNCwgIDIsIDc2LDE1NiwgNzYsMTY1LDIyNSwyNDIsMjI1LDIyNiwKKyAgICAyMzMsIDk5LDEyOCwgIDYsMTA3LDI0MCwyMjksMjQyLDI0MywyMzMsMjI1LDExMCwxMjgsICA2LDEwNywyNDksCisgICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNTIsMjMxLDI0MiwyMjksMTAxLDEyOCwgIDAsMTc2LAorICAgIDIzMiwxMDUsICAyLCA3NiwxOTksIDc2LDIwOCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3MywKKyAgICAyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEwMywyMzMsMjI3LDIzOSwyNDAsMjQ0LDIzMywgOTksCisgICAgMTI4LCAgMywyMzksMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE5OSwxMDgsICAyLAorICAgICA3NiwyNDQsIDc3LCAxMSwyMjksMjQ0LDEwMSwgIDIsIDc2LDI1MiwgNzcsICAzLDIzNiwyMjksMjMwLDExNiwKKyAgICAxMjgsIDM1LCA0MywyNDIsMjMzLDIzMSwyMzIsMTE2LDEyOCwgMzUsIDM4LDI0NCwgOTcsMTI5LCAgMywxODAsCisgICAgIDc3LCAxOCwyNDQsMjQ1LDI0MiwyMzgsMjI5LDEwMCwxMjgsICAxLDE0MSwyMzgsMjM5LDIzNywyMzMsMjM4LAorICAgIDIyNSwyNDQsMjM5LDI0MiwyMzcsMjMzLDIzOCwyNDUsMjQzLDIzOSwyMzgsMjI5LDIzOCwyNDUsMjM3LDIyOSwKKyAgICAyNDIsMjI1LDI0NCwyMzksMjQyLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDI0OCwyNTAsCisgICAgMTA0LDEyOCwgIDIsMTY0LDEwNCwgIDIsIDc3LCA3NCwgNzcsMTI0LCA5NywgIDMsIDc3LCA4MiwgNzcsIDkyLAorICAgICA3NywgOTksMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTY3LDIyOCwyMjksMjQ2LCA5NywKKyAgICAxMjgsICA5LCAzOSwyMzEsMTE3LCAgMiwgNzcsMTA2LCA3NywxMTUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsCisgICAgMTI4LCAxMCwxNjcsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMzksMjM5LDIzOSwxMDcsMTI4LAorICAgICAgMiwgODcsMTA1LCAgNiwgNzcsMTQ0LCA3NywxOTMsIDc3LDI1MywgNzgsICA4LCA3OCwgMTksIDc4LCAyOSwKKyAgICAgOTcsICAyLCA3NywxNTAsIDc3LDE3MiwyMzYsMjQ5LDI0NCwyMzMsMjM1LDIyNSwyNDQsMjM5LDIzOCwyMzksCisgICAgMTE1LDEyOSwgIDMsMTMzLCA3NywxNjYsMjI3LDIzNywgOTgsMTI4LCAgMywgNjgsMjM3LDIzOSwyMzgsMTAwLAorICAgIDEyOSwgMzgsMTAyLCA3NywxODEsMjQzLDI0NSwyMzMsMjQ0LDI0NywyMzIsMjMzLDI0NCwxMDEsMTI4LCAzOCwKKyAgICAgOTgsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTMzLCAgMCwxNjgsIDc3LDIxMiwgNzcsMjIwLCA3NywyMzEsCisgICAgIDc3LDIzNywgNzcsMjQ1LDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LDI0NiwyMTUsMjI2LDIyOSwyMzYsMjM5LAorICAgIDI0NywyMjcsMjM3LCA5OCwxMjgsICAzLCAzNiwyMjcsMjM3LCA5OCwxMjgsICAzLCAgOCwyMzEsMjQyLDIyNSwKKyAgICAyNDYsMTAxLDEyOCwyNDYsMjE2LDI0NCwyMzksMjM4LDIzOSwxMTUsMTI4LCAgMywxMzMsMjMyLDIzMywyNDIsCisgICAgMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LCA5OCwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LAorICAgIDEyOCwgNDgsMTk0LDI0NCwyNDQsMjM5LDIzNywyMjUsMjQyLDEwNywxMjgsIDQ4LCAgMywyNDYsMTA1LCAgMiwKKyAgICAgNzgsIDM2LCA3OCwgNDcsMjI4LDEwMSwxMjksICAwLDI0NywgNzgsIDQzLDExNSwxMjgsIDM0LCAzNSwyNDMsCisgICAgMjMzLDIzOSwyMzgsMjQzLDIzNiwyMjUsMjQzLDEwNCwxMjgsIDM0LCAyMSwyMzQsMjI5LDIyNywyNDksMjQyLAorICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgODIsMjM1LDI0MywyMzIsMjI1LDIyOCwxMDEsMTI4LCAzNywKKyAgICAxNDcsMTA4LCAgMiwgNzgsIDg3LCA3OCwgOTgsMjMzLDIzOCwyMjksMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsCisgICAgIDMwLCAxNSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE1MSwxMDksICAyLCA3OCwxMTMsIDc4LAorICAgIDEyMSwyMjUsMjI3LDI0MiwyMzksMTEwLDEyOCwgIDEsIDE3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywKKyAgICAxMDEsMTI4LDI1NSwgNjgsMjM4LDIyNiwyMzYsMjM5LDIyNywxMDcsMTI4LCAzNywxMzIsMTExLCAxMCwgNzgsCisgICAgMTYzLCA3OCwxNzUsIDc4LDE4NSwgNzgsMTk2LCA3OCwyMDcsIDc5LCAyMywgNzksIDI4LCA3OSwgMzksIDc5LAorICAgIDE1NCwgNzksMTgwLDIyNywyMzIsMjI1LDIyOCwyMjUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDE0LDIyOCwKKyAgICAyMjksMjM1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAyMCwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsCisgICAgIDk3LDEyOCwgNDgsMTA1LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyMDEsMjM2LAorICAgIDIzNiwyMjUsMTE0LDEzMiwgIDAsIDM2LCA3OCwyMjIsIDc4LDIzMywgNzgsMjQ1LCA3OSwgIDAsMjMzLDIzOCwKKyAgICAyMzAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDIyNywyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsCisgICAgMjI3LDEwMSwxMjgsMjU1LCAgNCwyMzksMjM2LDIyOCwyNDMsMjQ0LDI0OSwyMzYsMTAxLDEyOCwyNDcsIDM2LAorICAgIDExNSwgIDIsIDc5LCAgNiwgNzksIDEzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjU0LDEwNSwyNDUsMjQwLDIyOSwKKyAgICAyNDIsMjMzLDIzOSwxMTQsMTI4LDI0NiwyMjgsMjM4LDEwMywxMjgsIDMyLDE3MSwyNDIsMjQ1LDI0MywyNDEsCisgICAgMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDM4LDExNiwgIDYsIDc5LCA1MywgNzksIDcwLCA3OSwgOTIsIDc5LAorICAgIDEwMywgNzksMTM1LCA3OSwxNDIsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI5LCAgMiwyMTcsIDc5LCA2NCwKKyAgICAyMjcsMjM3LCA5OCwxMjgsICAzLCAgNywyMjYsMjI5LDIzNiwyMzksMjQ3LCA5OSwgIDIsIDc5LCA4MSwgNzksCisgICAgIDg2LDIzNywgOTgsMTI4LCAgMywgMzUsMjM5LDIzNywgOTgsMTI4LCAgMywgMzUsMjM1LDIyNSwyNDQsMjI1LAorICAgIDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDI1MSwyMzYsMjI5LDI0MywxMTUsICAyLCA3OSwxMTIsIDc5LDExNiwKKyAgICAxMDUsMTI4LCAgMSwgNDksMTA2LDEyOSwyNDYsMTkwLCA3OSwxMjIsMjQzLDI0NCwyNDIsMjM5LDIzNSwyMjksCisgICAgMjMyLDIzOSwyMzksMTA3LDEyOCwgIDIsMTMyLDIzNywyMjUsMjQ0LDEwNCwxMjgsIDM0LDE5NywyNDQsMjI5LAorICAgIDIyOCwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM3LDIwNCwyNDUsMjI2LDIzNiwyMjksMjQ5LDIzOSwKKyAgICAyMjgsMjQwLDIyNSwyNDQsMjI1LDEwNCwxMjksMjUxLCAzMSwgNzksMTcxLDIzMiwyMjksMjI2LDI0MiwyMjksCisgICAgMTE5LDEyOCwyNTEsIDMxLDI0NywyMzgsMjQ0LDIyNSwyMjcsMTA3LCAgMiwgNzksMTkxLCA3OSwyMDIsMjI2LAorICAgIDIyOSwyMzYsMjM5LDI0NywyMjcsMjM3LCA5OCwxMjgsICAzLCAzMCwyMzcsMjM5LDEwMCwxMjgsICAyLDIxMywKKyAgICAyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTU5LDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsCisgICAgMTI4LDI0NiwyMzUsMTE2LCAgMiwgNzksMjMzLCA3OSwyMzksMjI1LDIzMywxMDgsMTI4LCAgMiwgODYsMjM5LAorICAgIDI0MCwyMjYsMjI1LDExNCwxMjgsICAxLDE0MCwxMTcsICAyLCA3OSwyNTMsIDgwLCAgOCwyMzIsMjMzLDI0MiwKKyAgICAyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTAxLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsCisgICAgMTI4LCA0OCwxOTcsMTIyLDEzMiwgIDEsMjQzLCA4MCwgMzEsIDgwLCA0MCwgODAsIDU5LCA4MCwgOTYsMjI1LAorICAgIDIzNiwyNDQsMjM5LDIzOCwxMDEsMTI4LCAgMiwxNjMsIDk5LCAgMiwgODAsIDQ2LCA4MCwgNTMsMjI1LDI0MiwKKyAgICAyMzksMTEwLDEyOCwgIDEsMTk4LDI0NSwyNDIsMTA4LDEyOCwgIDIsMTY1LDEwMSwgIDIsIDgwLCA2NSwgODAsCisgICAgIDg1LDIyNSwyMjYsMjM1LDIzMiwyMjUsMjQzLDIzMywyMjUsMjM4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LAorICAgIDIzMywgOTksMTI4LCAgNCwyMjUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA4NSwKKyAgICAyMzIsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgOTUsMTAxLDE1MSwgIDAsCisgICAgMTAxLCA4MCwxNTksIDgwLDE3OCwgODAsMjEyLCA4MSwxODYsIDgxLDI0OCwgODIsIDI1LCA4MiwgMzcsIDgyLAorICAgICA2MCwgODIsMTEzLCA4MywyMjUsIDg0LCAyNywgODQsMTI5LCA4NCwyNDUsIDg1LDEyNCwgODUsMTk5LCA4NSwKKyAgICAyMzAsIDg2LCAzNiwgODYsIDg5LCA4NywgMjQsIDg3LDE1NywgODcsMTc3LCA4NywyMjEsIDg4LCA1NiwgOTcsCisgICAgICAyLCA4MCwxNjUsIDgwLDE3MiwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMCwyMzMsMjQyLDI0NCwxMDQsMTI4LAorICAgICAzOCwgNjUsIDk4LCAgMywgODAsMTg2LCA4MCwxOTUsIDgwLDIwNSwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwKKyAgICAxMjgsICA5LDE0MywyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgMjgsMjQyLDIyOSwyNDYsCisgICAgMTAxLDEyOCwgIDEsIDIxLCA5OSwgIDUsIDgwLDIyNCwgODEsIDQxLCA4MSwgNTUsIDgxLCA4NywgODEsMTc2LAorICAgICA5NywgIDIsIDgwLDIzMCwgODEsIDM1LDIzOCwyMjgsMjQyLCA5NywgIDMsIDgwLDI0MSwgODAsMjQ4LCA4MSwKKyAgICAgIDMsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDEzLDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsCisgICAgMTI4LCAxMCwxNDEsMjQ2LDIzOSwyNDcsMjI5LDIzNiwyNDMsMjMzLDIzMSwxMTAsICAyLCA4MSwgMTcsIDgxLAorICAgICAyNCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNjksMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwKKyAgICAxMjgsIDEwLDE5NywyNDIsMjM5LDExMCwxMjgsICAxLCAyNywyMjksMjI4LDIzMywyMzYsMjM2LDIyNSwyMjYsCisgICAgMjQyLDIyOSwyNDYsMTAxLDEyOCwgMzAsIDI5LDEwNCwgIDIsIDgxLCA2MSwgODEsIDcyLDIyNSwyNDIsMjM3LAorICAgIDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMDEsMjQ5LDIzMywyNDcsMjM4LDIyNSwyNDIsMjM3LDIyOSwKKyAgICAyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMzUsMjMzLDI0MiwgOTksICAyLCA4MSwgOTUsIDgxLDEwMCwyMzYsCisgICAgMTAxLDEyOCwgMzYsMjEyLDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEzNCwgIDAsMjM0LCA4MSwxMjEsIDgxLAorICAgIDEyOSwgODEsMTM3LCA4MSwxNDgsIDgxLDE1NiwgODEsMTY4LDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwKKyAgICAxOTEsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCAyNSwyMjgsMjM5LDI0NCwyMjYsMjI5LDIzNiwyMzksCisgICAgMTE5LDEyOCwgMzAsMTk5LDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAzMCwxOTMsMjMyLDIzOSwyMzksMjM1LAorICAgIDIyNSwyMjYsMjM5LDI0NiwxMDEsMTI4LCAzMCwxOTUsMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjgsIDMwLDE5NywKKyAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgODQsMTAwLCAgNCwgODEsMTk2LCA4MSwyMDYsCisgICAgIDgxLDIxMiwgODEsMjIyLDIyNiwyMzYsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAyLCAgNSwyMjksMjQ2LAorICAgICA5NywxMjgsICA5LCAxNSwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTI4LCAgMCwyMzUsMjM5LDExNiwKKyAgICAxMzAsICAxLCAyMywgODEsMjMxLCA4MSwyNDAsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAgMSwgMjMsCisgICAgMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDE4NSwxMDEsICAyLCA4MSwyNTQsIDgyLCAgOSwyMzEsMjQ1LAorICAgIDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDE1LDIzNywyMjUsMjQ0LDI0MiwyMjUsMjMxLDI0NSwKKyAgICAyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA3MSwyMzAsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCisgICAgMjMzLCA5OSwxMjgsICA0LCA2OCwxMDMsICAyLCA4MiwgNDMsIDgyLCA1MCwyNDIsMjI1LDI0NiwxMDEsMTI4LAorICAgICAgMCwyMzIsMjQ1LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTQzLDEwNCwgIDQsIDgyLCA3MCwKKyAgICAgODIsIDgxLCA4MiwgOTIsIDgyLDEwMiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsCisgICAgMTAzLDIyNiwyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgMjksMjMzLDI0MiwyMjUsMjMxLAorICAgIDIyNSwyMzgsIDk3LDEyOCwgNDgsIDcyLDIzOSwyMzksMjM1LDIyNSwyMjYsMjM5LDI0NiwxMDEsMTI4LCAzMCwKKyAgICAxODcsMTA1LCAgNCwgODIsMTIzLCA4MiwxMzQsIDgzLDE5MiwgODMsMjA3LDIyNiwyMzksMjQwLDIzOSwyMzcsCisgICAgMjM5LDIzMCwxMTEsMTI4LCA0OSwgMzEsMjMxLDIzMiwxMTYsMTQyLCAgMCwgNTYsIDgyLDE2OCwgODIsMTc3LAorICAgICA4MiwxODcsIDgyLDIxNywgODIsMjI0LCA4MywgIDYsIDgzLCAzMSwgODMsIDc2LCA4MywxMTAsIDgzLDEyMiwKKyAgICAgODMsMTMzLCA4MywxNjYsIDgzLDE3NCwgODMsMTg1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsCisgICAgMTA0LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIzOCwyMjcsMjMzLDI0MiwyMjcsMjM2LAorICAgIDEwMSwxMjksIDM2LDEwMywgODIsMTk4LDIzMywyMzgsMjQ2LDIyOSwyNDIsMjQzLDIyOSwyNDMsMjI1LDIzOCwKKyAgICAyNDMsMjQzLDIyOSwyNDIsMjMzLDEwMiwxMjgsIDM5LDE0NSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwxMTAsCisgICAgMjI5LDIyOSwxMTAsICAyLCA4MiwyMzIsIDgyLDI0MSwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM2LAorICAgIDExMywxMTIsICAyLCA4MiwyNDcsIDgyLDI1NCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxMzMsMjI5LDI0MiwKKyAgICAyMzMsMjM5LDEwMCwxMjgsIDM2LDE1MywyMzEsMTE3LCAgMiwgODMsIDEzLCA4MywgMjIsMjM0LDIyNSwyNDIsCisgICAgMjI1LDI0NCwxMDUsMTI4LCAxMCwyMzgsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwxMTAsMTA0LAorICAgICAgMiwgODMsIDM3LCA4MywgNjMsIDk3LCAgMiwgODMsIDQzLCA4MywgNTQsMjI3LDIzNSwyMjUsMjQyLDIyNSwKKyAgICAyMjYsMjMzLCA5OSwxMjgsICA2LDEwNCwyMzgsMjMxLDI1MCwyMzIsMjM5LDExNywxMjgsIDQ4LCA0MCwyMzgsCisgICAgMjM5LDI0NCwyMjksMjI2LDIyOSwyMjUsMjM3LDIyOSwxMDAsMTI4LCAzOCwxMDcsMTA1LCAgMiwgODMsIDgyLAorICAgICA4MywxMDAsMjI4LDIyOSwyMzksMjMxLDI0MiwyMjUsMjQwLDIzMiwyMzMsMjI3LDI0MCwyMjUsMjQyLDIyOSwKKyAgICAxMTAsMTI4LCA1MCwgMzksMjM4LDIzMCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsMTM2LDIzNywyMzksCisgICAgMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDI0LDIzOSwyMzYsMjI4LDI0MywyNDQsMjQ5LAorICAgIDIzNiwxMDEsMTI4LDI0NywgNTYsMTEyLCAgMiwgODMsMTM5LCA4MywxNDYsMjI1LDI0MiwyMjksMTEwLDEyOCwKKyAgICAgMzYsMTIzLDIyOSwxMTQsICAyLCA4MywxNTMsIDgzLDE1OSwyMzMsMjM5LDEwMCwxMjgsIDM2LDE0MywyNDMsCisgICAgMjMzLDIyNSwxMTAsMTI4LCAgNiwyNDgsMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsIDMzLDExOSwyNDMsMjQ1LAorICAgIDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsMTIwLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA4OCwKKyAgICAyMzgsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwyMjgsMjI2LDI0MiwyMjksMjQ2LDEwMSwxMjgsICAyLCAgNywyMzksCisgICAgMjQ0LDIzMywyMzAsMjMzLDIyOSwyMjgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAorICAgIDEwMSwxMDcsICAyLCA4MywyMzEsIDgzLDI1NSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwKKyAgICAxNjgsIDgzLDI0MywyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDExNiwxMTEsCisgICAgICAyLCA4NCwgIDUsIDg0LCAyMCwyMzgsMjM1LDIyNSwyNDIsMjMxLDI0NSwyNDIsMjM3LDI0NSwyMzUsMjMyLAorICAgIDEwNSwxMjgsIDEwLDExNiwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgODQsMTA4LCAgMywgODQsIDM1LCA4NCwKKyAgICAgNDYsIDg0LDEwNywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDU5LDEwMSwgIDIsCisgICAgIDg0LCA1MiwgODQsIDU5LDIzNywyMjksMjM4LDExNiwxMjgsIDM0LCAgOCwyNDYsMjI5LDExMCwgIDMsIDg0LAorICAgICA2OSwgODQsIDc4LCA4NCwgOTksMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwxMDYsMTEyLCAgMiwKKyAgICAgODQsIDg0LCA4NCwgOTEsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTI2LDIyOSwyNDIsMjMzLDIzOSwxMDAsCisgICAgMTI4LCAzNiwxNDYsMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsIDMzLDEyMiwyMzYsMjMzLDI0MCwyNDMsMjMzLAorICAgIDExNSwxMjksIDMyLCAzOCwgODQsMTE4LDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LCAzNCwKKyAgICAyMzgsMTA5LCAgNSwgODQsMTQxLCA4NCwxNjksIDg0LDE4MCwgODQsMjAwLCA4NCwyMTEsMjI1LDIyNywyNDIsCisgICAgMjM5LDExMCwxMzAsICAxLCAxOSwgODQsMTUzLCA4NCwxNjEsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLAorICAgICAyMywyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwgMzAsIDIxLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywKKyAgICAgOTksMTI4LCAgNCwgNjAsMjI4LDIyNSwyNDMsMTA0LDEyOSwgMzIsIDIwLCA4NCwxODksMjQ2LDIyOSwyNDIsCisgICAgMjQ0LDIzMywyMjcsMjI1LDEwOCwxMjgsMjU0LCA0OSwyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLAorICAgIDEyOCwyNTUsIDY5LDExMiwgIDIsIDg0LDIxNywgODQsMjM3LDIzMiwyMjUsMjQzLDIzMywyNDMsMjM3LDIyNSwKKyAgICAyNDIsMjM1LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgOTEsMjQ0LDI0OSwyNDMsCisgICAgMjI5LDExNiwxMjgsIDM0LCAgNSwxMTAsICA2LCA4NSwgIDMsIDg1LCAxNCwgODUsIDI1LCA4NSwgNjksIDg1LAorICAgIDEwMSwgODUsMTE2LDIyNiwyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgMzUsMjI3LDI0OSwKKyAgICAyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA2MSwxMDAsICAyLCA4NSwgMzEsIDg1LCA1MCwyMjUsCisgICAgMjQzLDEwNCwxMjksIDMyLCAxOSwgODUsIDM5LDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LAorICAgIDI1NCwgNTAsMjI5LDI0MywyMjcsMjI5LDIzOCwyMjgsMjI5LDI0MiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwKKyAgICAyMzMsIDk5LDEyOCwgIDQsMTYzLDEwMywxMzAsICAxLCA3NSwgODUsIDc3LCA4NSwgODgsMjI2LDIzOSwyNDAsCisgICAgMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAzNywyMzIsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LAorICAgIDIzMywgOTksMTI4LCAgNCwxNjUsMjMyLDIzOSwyMzksMjM1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywKKyAgICAgOTksMTI4LCAgNCwyMDAsMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsIDMyLCAgMiwxMTEsICAzLCA4NSwxMzIsCisgICAgIDg1LDE0MCwgODUsMTQ5LDIzMSwyMzksMjM4LDIyOSwxMDcsMTI4LCAgMSwgMjUsMjM1LDIzOSwyNDIsMjI5LAorICAgIDIyNSwxMTAsMTI4LCA0OSwgODMsMjQwLDIyOSwxMTAsMTMwLCAgMiwgOTEsIDg1LDE1OSwgODUsMTY4LDIyNywKKyAgICAyMzYsMjM5LDI0MywyMjksMTAwLDEyOCwgIDIsMTU0LDI0MiwyMjksMjQ2LDIyOSwyNDIsMjQzLDIyOSwxMDAsCisgICAgMTMwLCAgMiwgOTIsIDg1LDE4MywgODUsMTkyLDIyNywyMzYsMjM5LDI0MywyMjksMTAwLDEyOCwgIDIsIDk0LAorICAgIDIzMiwyMzksMjM5LDEwNywxMjgsICAyLCA5MywxMTIsICAyLCA4NSwyMDUsIDg1LDIxMiwyMjUsMjQyLDIyOSwKKyAgICAxMTAsMTI4LCAzNiwxNjAsMjQzLDIzMywyMzYsMjM5LDExMCwxMjksICAzLDE4MSwgODUsMjIyLDI0NCwyMzksCisgICAgMjM4LDIzOSwxMTUsMTI4LCAgMywxNzMsMjQxLDExNywgIDIsIDg1LDIzNywgODYsIDI1LDIyNSwxMDgsMTMwLAorICAgICAgMCwgNjEsIDg1LDI0NiwgODYsICAyLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwKKyAgICAyNTUsIDI5LDExNSwgIDIsIDg2LCAgOCwgODYsIDE1LDIzNywyMjUsMjM2LDEwOCwxMjgsMjU0LDEwMiwyNDUsCisgICAgMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwxMjQsMjMzLDI0NiwyMjUsMjM2LDIyOSwyMzgsMjI3LAorICAgIDEwMSwxMjgsIDM0LCA5NywxMTQsICAzLCA4NiwgNDQsIDg2LCA1NSwgODYsIDY2LDIyNiwyMzksMjQwLDIzOSwKKyAgICAyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgMzgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsCisgICAgICA0LCA2NCwyMjksMjQ2LDIyOSwyNDIsMjQzLDIyOSwxMDAsMTI5LCAgMiwgODgsIDg2LCA3OCwyMjcsMjQ5LAorICAgIDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDc3LDExNSwgIDYsIDg2LDEwMywgODYsMTE0LCA4NiwKKyAgICAxMzQsIDg2LDIxNSwgODcsICA0LCA4NywgMTQsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsCisgICAgICA0LCA2NSwyMjgsMjI5LDI0MywyMjcsMjI5LDIzOCwyMjgsMjI5LDI0MiwyMjcsMjQ5LDI0MiwyMzMsMjM2LAorICAgIDIzNiwyMzMsIDk5LDEyOCwgIDQsMTcxLDEwNCwxMzIsICAyLDEzMSwgODYsMTQ2LCA4NiwxNTMsIDg2LDE4NCwKKyAgICAgODYsMTk5LDIyNywyNDUsMjQyLDEwOCwxMjgsICAyLDEzNCwyMzksMjQyLDExNiwgIDIsIDg2LDE2MSwgODYsCisgICAgMTY4LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAxNCwyNDYsMjM5LDI0NywyMjksMjM2LDI0MywyMzMsMjMxLAorICAgIDIzOCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNzAsMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDIyOCwKKyAgICAyMzYsMjM5LDIzOSwxMTIsMTI4LCAgMSwxNzAsMjQzLDI0MSwyNDUsMjI1LDI0NCwyNDIsMjI5LDI0NiwyMjksCisgICAgMjQyLDI0MywyMjksMTAwLDEyOCwgIDIsMTMzLDIzNywyMjUsMjM2LDEwOCwgIDIsIDg2LDIyNCwgODYsMjM1LAorICAgIDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgNzEsMjM1LDIyNSwyNDQsMjI1LDIzNSwKKyAgICAyMjUsMjM4LCA5NywxMjksIDQ4LDE2NywgODYsMjQ4LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsCisgICAgMTA0LDEyOCwyNTUsMTA2LDI0NCwyMzMsMjM3LDIyNSwyNDQsMjI5LDEwMCwxMjgsIDMzLCA0NiwyNDUsMjQwLAorICAgIDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LDI0NiwyMzYsMTE2LCAgNSwgODcsIDM2LCA4NywgNjIsIDg3LCA2NiwKKyAgICAgODcsIDgzLCA4NywxNDksIDk3LDEzMCwgIDMsMTgzLCA4NywgNDQsIDg3LCA1NCwyNDIsMjM3LDIyOSwyMzgsCisgICAgMjMzLDIyNSwxMTAsMTI4LCAgNSwxMDQsMjQ0LDIzOSwyMzgsMjM5LDExNSwxMjgsICAzLDE3NCwxMDQsMTI4LAorICAgICAgMCwyNDAsMjMzLDIzNiwyMjgsMTAxLDEyOSwgMzAsMTg5LCA4NywgNzUsMjI2LDIyOSwyMzYsMjM5LDExOSwKKyAgICAxMjgsIDMwLCAyNywyMzgsMjI1LDIzMiwyNDQsIDk3LCAgMywgODcsIDk1LCA4NywxMjcsIDg3LDEzNiwyMzAsCisgICAgMjM5LDI0NSwyMzUsMTA0LCAgMiwgODcsMTA1LCA4NywxMTQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAorICAgICAgNSwxNDUsMjM2LDIyOSwyMzAsMjQ0LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTQ1LDIzMiwKKyAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTQ1LDIzNiwyMjksMjMwLDI0NCwyMzIsMjI5LDIyNiwyNDIsCisgICAgMjI5LDExOSwxMjgsICA1LDE0NSwyNDUsMjQyLDIzOCwyMjksMTAwLDEyOCwgIDEsMjIxLDExNywgIDIsIDg3LAorICAgIDE2MywgODcsMTcyLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDk3LDI0MiwxMTEsMTI4LCAzMiwKKyAgICAxNzIsMjQ2LDIzOSwyNDcsMjI5LDIzNiwyNDMsMjMzLDIzMSwxMTAsICAzLCA4NywxOTMsIDg3LDIwMywgODcsCisgICAgMjEwLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE5OSwyMjgsMjI5LDI0NiwgOTcsMTI4LAorICAgICAgOSwgNzEsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE5OSwxMjAsICAyLCA4NywKKyAgICAyMjcsIDg4LCA0NCwyMjcsMjM2LDIyNSwxMDksMTMyLCAgMCwgMzMsIDg3LDI0MiwgODcsMjUzLCA4OCwgMjQsCisgICAgIDg4LCAzNiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDkyLDEwMCwgIDIsIDg4LAorICAgICAgMywgODgsICA4LDIyNiwxMDgsMTI4LCAzMiwgNjAsMjM5LDI0NywxMTAsMTI5LCAgMCwxNjEsIDg4LCAxNiwKKyAgICAyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTYxLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsCisgICAgMTAxLDEyOCwyNTUsICAxLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywgMzMsMjMzLDI0MywyNDQsMjI5LAorICAgIDIzOCwyNDQsMjMzLDIyNSwxMDgsMTI4LCAzNCwgIDMsMjUwLDEwNCwxMzEsICAyLDE0NiwgODgsIDY3LCA4OCwKKyAgICAgODYsIDg4LCA5NywgOTksICAyLCA4OCwgNzMsIDg4LCA4MCwyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMzksCisgICAgMjQ1LDI0MiwxMDgsMTI4LCAgMiwxNDcsMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwxMjgsICAxLAorICAgIDE4NSwyNDQsMjI1LDIzMywxMDgsMTI4LCAgMSwxODYsMTAyLDE0MCwgIDAsMTAyLCA4OCwxMzIsIDg4LDIxNCwKKyAgICAgODgsMjI1LCA4OCwyMzQsIDg4LDI0NiwgODksIDkzLCA4OSwxMDksIDkxLDExNywgOTEsMTMwLCA5MSwxNTYsCisgICAgIDkzLCAzMywgOTMsIDQxLCA5NywgIDQsIDg4LDE0MiwgODgsMTQ5LCA4OCwxNjAsIDg4LDE3MSwyMjgsMjI5LAorICAgIDI0NiwgOTcsMTI4LCAgOSwgOTQsMjMxLDI0NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA5NCwKKyAgICAyMzIsMjQyLDIyOSwyMzgsMjMyLDIyOSwyMzMsMTE2LDEyOCwgMzMsICA5LDI0NCwyMzIsIDk3LCAgMywgODgsCisgICAgMTgxLCA4OCwxOTAsIDg4LDIwMiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA3OCwyMzYsMjM5LAorICAgIDI0NywyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA3OCwyNDQsMjI1LDIzOCwyMjUsMjQyLDIyNSwKKyAgICAyMjYsMjMzLCA5OSwxMjgsICA2LCA3NSwyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksCisgICAgICA4LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMjEzLDIyOCwyMzksMjQ0LDIyNSwyMjcsMjI3LAorICAgIDIyOSwyMzgsMTE2LDEyOCwgMzAsIDMxLDEwMSwgIDMsIDg4LDI1NCwgODksIDc2LCA4OSwgODYsMTA0LCAgNCwKKyAgICAgODksICA4LCA4OSwgMzEsIDg5LCA0NSwgODksIDYxLDIyNSwxMTQsICAyLCA4OSwgMTUsIDg5LCAyMiwyMjUsCisgICAgMjI2LDIzMywgOTksMTI4LCAgNiwgNjUsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMzQsMjMwLAorICAgIDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIxMCwyMzMsMjM4LDIzMywKKyAgICAyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMTEsMjM3LDIyOSwyMjgsCisgICAgMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMTIsMjMzLDIyNywyMzksMjQwLAorICAgIDI0NCwyMzMsIDk5LDEyOCwgIDMsMjI5LDIzNywyMjUsMjM2LDEwMSwxMjgsIDM4LCA2NCwxMDIsMTMwLDI1MSwKKyAgICAgIDAsIDg5LDEwMSwgODksMTA1LDEwNSwxMjgsMjUxLCAgMywxMDgsMTI4LDI1MSwgIDQsMTA1LDEzNiwyNTEsCisgICAgICAxLCA4OSwxMjksIDg5LDE2OSwgODksMTgwLCA4OSwyMDIsIDkwLCA2OCwgOTAsIDg1LCA5MCwgOTMsIDkwLAorICAgIDEwNiwyMzAsMjQ0LDIyOSwyMjksMTEwLCAgMiwgODksMTM5LCA4OSwxNDgsMjI3LDIzMywyNDIsMjI3LDIzNiwKKyAgICAxMDEsMTI4LCAzNiwxMTAsMTEyLCAgMiwgODksMTU0LCA4OSwxNjEsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsCisgICAgMTMwLDIyOSwyNDIsMjMzLDIzOSwxMDAsMTI4LCAzNiwxNTAsMjMxLDI0NSwyNDIsMjI5LDIyOCwyMjUsMjQzLAorICAgIDEwNCwxMjgsIDMyLCAxOCwyMzYsMjM2LDIyOSwxMDAsICAyLCA4OSwxODksIDg5LDE5NSwyMjYsMjM5LDEyMCwKKyAgICAxMjgsIDM3LDE2MCwyNDIsMjI5LDIyNywxMTYsMTI4LCAzNywxNzIsMjM4LDIyNSwxMDgsICA1LCA4OSwyMTYsCisgICAgIDg5LDI1NSwgOTAsIDE2LCA5MCwgMzMsIDkwLCA0OSwyMzUsMjI1LDEwMiwxMzAsICA1LDIxOCwgODksMjI2LAorICAgICA4OSwyNDYsMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwgNTgsIDg5LDIzNywyMzIsMjI5LDIyNiwKKyAgICAyNDIsMjI5LDExOSwxMjgsMjUxLCA1OCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIxOCwyMzcsCisgICAgMjI5LDEwOSwxMjksICA1LDIyMSwgOTAsICA3LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjIxLAorICAgIDIzOCwyNDUsMTEwLDEyOSwgIDUsMjIzLCA5MCwgMjQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwKKyAgICAyMjMsMjQwLDEwMSwxMjksICA1LDIyNywgOTAsIDQwLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsCisgICAgMjI3LDI0NCwyNDMsMjI1LDIyOCwxMDUsMTI5LCAgNSwyMjksIDkwLCA1OSwyMzIsMjI5LDIyNiwyNDIsMjI5LAorICAgIDExOSwxMjgsICA1LDIyOSwyNDIsMjQzLDI0NCwyNDQsMjM5LDIzOCwyMjksMjI3LDIzMiwyMzMsMjM4LDIyOSwKKyAgICAyNDMsMTAxLDEyOCwgIDIsMjAxLDI0MywyMzIsMjI5LDI0OSwxMDEsMTI4LCAzNywyMDEsMjQ0LDIyNSwyMjcsCisgICAgMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTE1LDI0NiwxMDEsMTQyLCAgMCwgNTMsIDkwLAorICAgIDEzOSwgOTAsMTQ4LCA5MCwxNTgsIDkwLDE4OCwgOTAsMTk1LCA5MCwyMDUsIDkwLDIzMCwgOTEsICAxLCA5MSwKKyAgICAgMzUsIDkxLCA0NywgOTEsIDU4LCA5MSwgOTEsIDkxLCA5OSwgOTEsMTEwLDIyNSwyNDIsMjI1LDIyNiwyMzMsCisgICAgIDk5LDEyOCwgIDYsMTAxLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIzNSwyMjcsMjMzLAorICAgIDI0MiwyMjcsMjM2LDEwMSwxMjksIDM2LDEwMCwgOTAsMTY5LDIzMywyMzgsMjQ2LDIyOSwyNDIsMjQzLDIyOSwKKyAgICAyNDMsMjI1LDIzOCwyNDMsMjQzLDIyOSwyNDIsMjMzLDEwMiwxMjgsIDM5LDE0MiwyMjgsMjI5LDI0NiwgOTcsCisgICAgMTI4LCAgOSwxMDcsMjI5LDIzMywyMzEsMjMyLDI0NCwyMzIsMTE1LDEyOCwgMzMsIDkzLDIzMSwxMTcsICAyLAorICAgICA5MCwyMTIsIDkwLDIyMSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDIzNSwyNDIsMjM3LDI0NSwKKyAgICAyMzUsMjMyLDEwNSwxMjgsIDEwLDEwNywyMzIsIDk3LCAgMiwgOTAsMjM3LCA5MCwyNDgsMjI3LDIzNSwyMjUsCisgICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LDEwMSwyMzgsMjMxLDI1MCwyMzIsMjM5LDExNywxMjgsIDQ4LAorICAgICAzNywxMDUsICAyLCA5MSwgIDcsIDkxLCAyNSwyMjgsMjI5LDIzOSwyMzEsMjQyLDIyNSwyNDAsMjMyLDIzMywKKyAgICAyMjcsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCAzNiwyMzgsMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsCisgICAgMTI4LCAzMiwxMzMsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMjEsMjM5LAorICAgIDIzNiwyMjgsMjQzLDI0NCwyNDksMjM2LDEwMSwxMjgsMjQ3LCA1MywxMTIsICAyLCA5MSwgNjQsIDkxLCA3MSwKKyAgICAyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxMjAsMjI5LDExNCwgIDIsIDkxLCA3OCwgOTEsIDg0LDIzMywyMzksCisgICAgMTAwLDEyOCwgMzYsMTQwLDI0MywyMzMsMjI1LDExMCwxMjgsICA2LDI0NSwyNDIsMjM5LDIzNywyMjUsMTEwLAorICAgIDEyOCwgMzMsMTE2LDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwxMTcsMjQ0LDIzMiwKKyAgICAyMjUsMTA1LDEyOCwgMTQsIDg1LDEwOCwxMjksMjUxLCAgMiwgOTEsMTIzLDIzOSwyNDIsMjMzLDExMCwxMjgsCisgICAgICAxLDE0NiwxMDksICAyLCA5MSwxMzYsIDkxLDE0NywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLAorICAgIDEyOCwyNTUsIDcwLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTUzLDExMSwgIDQsIDkxLDE2NiwKKyAgICAgOTEsMTg4LCA5MSwyMDAsIDkxLDIwNywyMzAsIDk3LCAgMiwgOTEsMTczLCA5MSwxODEsMjM4LDI0NCwyMzIsCisgICAgMjI1LDEwNSwxMjgsIDE0LCAzMSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgMjksMjM4LDIzMSwyMzcsMjI1LAorICAgIDIzOCwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNzksMjQyLDIyNSwyMzYsMTA4LDEyOCwgMzQsICAwLDI0NSwKKyAgICAxMTQsMTQyLCAgMCwgNTIsIDkxLDI0MCwgOTEsMjQ5LCA5MiwgIDMsIDkyLCAzMywgOTIsIDQwLCA5MiwgNjUsCisgICAgIDkyLCA5MiwgOTIsMTI2LCA5MiwxMzgsIDkyLDE1NywgOTIsMTY4LCA5MiwyMDEsIDkyLDIwOSwgOTIsMjIwLAorICAgIDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTAwLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwKKyAgICAxMjgsICA5LDIzNCwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjksIDM2LCA5OSwgOTIsIDE0LDIzMywyMzgsCisgICAgMjQ2LDIyOSwyNDIsMjQzLDIyOSwyNDMsMjI1LDIzOCwyNDMsMjQzLDIyOSwyNDIsMjMzLDEwMiwxMjgsIDM5LAorICAgIDE0MSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwxMDYsMjMxLDExNywgIDIsIDkyLCA0NywgOTIsIDU2LDIzNCwKKyAgICAyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMjM0LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsCisgICAgMTA2LDIzMiwgOTcsICAyLCA5MiwgNzIsIDkyLCA4MywyMjcsMjM1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LAorICAgIDEyOCwgIDYsMTAwLDIzOCwyMzEsMjUwLDIzMiwyMzksMTE3LDEyOCwgNDgsIDM2LDEwNSwgIDIsIDkyLCA5OCwKKyAgICAgOTIsMTE2LDIyOCwyMjksMjM5LDIzMSwyNDIsMjI1LDI0MCwyMzIsMjMzLDIyNywyNDAsMjI1LDI0MiwyMjksCisgICAgMTEwLDEyOCwgNTAsIDM1LDIzOCwyMzAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLDEzMiwyMzcsMjM5LAorICAgIDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAyMCwyMzgsMjQ1LDIzNywyMjksMjQyLDIyNSwKKyAgICAyNDQsMjM5LDI0MiwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyNDcsMjM5LDIzNiwyMjgsCisgICAgMjQzLDI0NCwyNDksMjM2LDEwMSwxMjgsMjQ3LCA1MiwxMTIsICAyLCA5MiwxNzQsIDkyLDE4MSwyMjUsMjQyLAorICAgIDIyOSwxMTAsMTI4LCAzNiwxMTksMjI5LDExNCwgIDIsIDkyLDE4OCwgOTIsMTk0LDIzMywyMzksMTAwLDEyOCwKKyAgICAgMzYsMTM5LDI0MywyMzMsMjI1LDExMCwxMjgsICA2LDI0NCwyNDIsMjM5LDIzNywyMjUsMTEwLDEyOCwgMzMsCisgICAgMTE1LDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwxMTYsMTE2LCAgMiwgOTIsMjI2LAorICAgICA5MywgIDgsMjI5LDIyOSwxMTAsICAyLCA5MiwyMzQsIDkyLDI0MywyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwKKyAgICAxMjgsIDM2LDEwOSwxMTIsICAyLCA5MiwyNDksIDkzLCAgMCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxMjksCisgICAgMjI5LDI0MiwyMzMsMjM5LDEwMCwxMjgsIDM2LDE0OSwxMDQsICAyLCA5MywgMTQsIDkzLCAxOSwyMjUsMTA1LAorICAgIDEyOCwgMTQsIDg0LDI0NCwyMzksMjM4LDIyOSwyMjcsMjMyLDIzMywyMzgsMjI5LDI0MywxMDEsMTI4LCAgMiwKKyAgICAyMDMsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDE2MSwyNDIsIDk3LCAgMiwgOTMsIDQ4LCA5MywgNTYsCisgICAgMjI3LDI0NCwyMzMsMjM5LDExMCwxMjgsIDMyLCA2OCwyMzgsIDk5LDEyOCwgMzIsMTYzLDEwMywxNDQsICAwLAorICAgIDEwMywgOTMsIDk3LCA5NCwgNDMsIDk0LCA2NiwgOTQsMTI3LCA5NCwxNDQsIDk1LCA2NSwgOTYsIDU4LCA5NiwKKyAgICAxNDMsIDk2LDE1NiwgOTcsIDE0LCA5NywgMzksIDk3LCA2NywgOTcsIDg5LCA5OCwgMzQsIDk4LCA1NiwgOTgsCisgICAgMTU4LCA5NywgIDksIDkzLDExNywgOTMsMTI3LCA5MywxMzQsIDkzLDE0MSwgOTMsMjA1LCA5MywyMzAsIDkzLAorICAgIDI0MSwgOTMsMjUyLCA5NCwgMzAsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTUxLDIyNywKKyAgICAyNDUsMjQ0LDEwMSwxMjgsICAxLDI0NSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgMjMsMTAyLCAgNCwgOTMsCisgICAgMTUxLCA5MywxNjAsIDkzLDE3NCwgOTMsMTkwLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTc1LAorICAgIDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxNDcsMjMzLDIzOCwKKyAgICAyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTEsMTQ4LDIzNywyMjksCisgICAgMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTEsMTQ5LDIzMSwxMTcsICAyLAorICAgICA5MywyMTIsIDkzLDIyMSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE1MSwyNDIsMjM3LDI0NSwKKyAgICAyMzUsMjMyLDEwNSwxMjgsIDEwLCAyMywyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsCisgICAgIDc2LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwxNzIsMjM3LDIzNywgOTcsMTMwLAorICAgICAgMywxNzksIDk0LCAgNiwgOTQsIDE5LDIzNiwyMjUsMjQ0LDIzMywyMzgsMjQzLDIzNywyMjUsMjM2LDEwOCwKKyAgICAxMjgsICAyLCA5OSwyNDMsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgIDIsMjI0LDIzOCwyMzEsCisgICAgMjMzLDIyNSwyMjcsMjM5LDI0MCwyNDQsMjMzLCA5OSwxMjgsICAzLDIzNSwgOTgsICAyLCA5NCwgNDksIDk0LAorICAgICA1OSwyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgMTMsMjQyLDIyOSwyNDYsMTAxLDEyOCwKKyAgICAgIDEsIDMxLCA5OSwgIDQsIDk0LCA3NiwgOTQsIDgzLCA5NCwgOTIsIDk0LDExNCwyMjUsMjQyLDIzOSwxMTAsCisgICAgMTI4LCAgMSwyMzEsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI4LCAgMSwgMzUsMjMzLDI0MiwgOTksICAyLAorICAgICA5NCwxMDAsIDk0LDEwNSwyMzYsMTAxLDEyOCwgMzYsMjE0LDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOCwKKyAgICAgIDEsIDI5LDIzOSwyMzcsMjM3LDIyNSwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsICAxLCAzNSwyMjgsCisgICAgMjM5LDExNiwxMjksICAxLCAzMywgOTQsMTM1LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgIDEsIDMzLAorICAgIDEwMSwgIDYsIDk0LDE1OCwgOTQsMTY5LCA5NCwxODAsIDk0LDE5MSwgOTQsMjEwLCA5NSwgNTYsMjI3LDI0OSwKKyAgICAyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA1MSwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsCisgICAgIDk3LDEyOCwgNDgsIDgyLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwxNzgsMjM5LAorICAgIDIzNywyMjksMjQ0LDI0MiwyMzMsMjI3LDIyNSwyMzYsMjM2LDI0OSwyMjksMjQxLDI0NSwyMjUsMTA4LDEyOCwKKyAgICAgMzQsIDgxLDExNCwgIDMsIDk0LDIxOCwgOTUsIDExLCA5NSwgMjEsMjI5LDI0MywxMDQsICAzLCA5NCwyMjgsCisgICAgIDk0LDI0MywgOTQsMjUyLDIyNSwyMjcsMjI3LDIyOSwyMzgsMjQ0LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LAorICAgIDEyOCwgIDUsMTU2LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjQzLDIzNywyNDUsMjQxLDIyOCwKKyAgICAyMjUsMjM3LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTU3LDIzNywyMjUsMjM4LDIyOCwyMjYsCisgICAgMjM2LDExNSwxMjgsICAwLDIyMywyNDMsMjMyLDIyNSwyNDksMjMzLDEwOSwgIDIsIDk1LCAzMiwgOTUsIDQ3LAorICAgIDIyNSwyMjcsMjI3LDIyOSwyMzgsMjQ0LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTU4LDIzMiwKKyAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjQ0LDI0NCwyMjUsMjM3LDIyNSwyNDIsMTA3LDEyOCwgNDgsCisgICAgIDE5LDEwNCwgIDUsIDk1LCA3NywgOTUsMjEwLCA5NiwgMTcsIDk2LCA0MiwgOTYsIDQ4LCA5NywgIDQsIDk1LAorICAgICA4NywgOTUsIDk3LCA5NSwxMjAsIDk1LDE0NSwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwKKyAgICAxNTIsMTAwLCAgMiwgOTUsMTAzLCA5NSwxMTQsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsCisgICAgICA1LDExNCwyMjksMjQ2LCA5NywxMjgsICA5LCAyNCwyMzEsMTE3LCAgMiwgOTUsMTI3LCA5NSwxMzYsMjM0LAorICAgIDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNTIsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwKKyAgICAgMjQsMjMzLDExMCwgIDQsIDk1LDE1NiwgOTUsMTY1LCA5NSwxNzksIDk1LDE5NSwyMjUsMjQyLDIyNSwyMjYsCisgICAgMjMzLCA5OSwxMjgsICA2LCA1OCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LAorICAgIDEyOCwyNTQsMjA2LDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwKKyAgICAxMjgsMjU0LDIwNywyMzcsMjI5LDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCisgICAgMjU0LDIwOCwxMDEsICAzLCA5NSwyMTgsIDk1LDIzOSwgOTYsICAwLDIzNywyMzMsMjI4LDIyOCwyMzYsMjI5LAorICAgIDIzMiwyMzksMjM5LDIzNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTQ5LDI0MywKKyAgICAyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNDcsCisgICAgMjQ1LDI0MCwyNDQsMjQ1LDI0MiwyMzgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAorICAgIDE0NSwyMzIsIDk3LCAgMiwgOTYsIDI0LCA5NiwgMzEsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDkwLDIzMSwKKyAgICAyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgOTAsMjM5LDIzOSwxMDcsMTI4LCAgMiwgOTYsCisgICAgMjUwLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTQ3LDEwNSwgIDMsIDk2LCA2NiwgOTYsIDc3LAorICAgICA5NiwgODgsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LCA3OCwyMzUsMjI1LDI0NCwKKyAgICAyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMTc0LDEwOSwgIDIsIDk2LCA5NCwgOTYsMTA1LDIyNSwyNDIsCisgICAgMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgOTksMjI5LDEwOCwxMzAsICA1LDIxMCwgOTYsMTE0LAorICAgICA5NiwxMzQsMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwgNTAsIDk2LDEyNSwyMzIsMjI5LDIyNiwKKyAgICAyNDIsMjI5LDExOSwxMjgsMjUxLCA1MCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIxMCwyMzQsCisgICAgMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgODMsMjM2LDIzOSwyNDQsMjQ0LAorICAgIDIyNSwxMDgsICAyLCA5NiwxNjcsIDk2LDE4NCwyMzMsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LDI0MywKKyAgICAyNDQsMjQyLDIzOSwyMzUsMTAxLDEyOCwgIDEsMTkwLDI0MywyNDQsMjM5LDExMiwxMzIsICAyLDE0OCwgOTYsCisgICAgMTk5LCA5NiwyMTAsIDk2LDIxNiwgOTYsMjQ4LDIzMywyMzgsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwxMDAsMTI4LAorICAgICAgMiwxNTAsMjM3LDIzOSwxMDAsMTI4LCAgMiwxOTIsMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwKKyAgICAxMzAsICAyLDE0OSwgOTYsMjMxLCA5NiwyMzcsMjM3LDIzOSwxMDAsMTI4LCAgMiwxOTMsMjQzLDI0NSwyNDAsCisgICAgMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsICAyLDIyOCwyNDMsMjQ0LDI0MiwyMzksMjM1LDEwMSwxMjksICAyLAorICAgIDE2MSwgOTcsICAzLDI0MiwyMjksMjQ2LDIyOSwyNDIsMjQzLDIyOSwxMDAsMTI4LCAgMiwxNjIsMTA5LCAgMiwKKyAgICAgOTcsIDIwLCA5NywgMjgsMjI1LDIyNywyNDIsMjM5LDExMCwxMjgsIDMwLCAzMywyMzksMjM4LDIzOSwyNDMsCisgICAgMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDcxLDExMSwgIDIsIDk3LCA0NSwgOTcsIDU2LDIzMiwyMzMsMjQyLAorICAgIDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgODQsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywKKyAgICAxMjgsIDQ4LDE4MCwyNDAsIDk3LCAgMiwgOTcsIDc0LCA5NywgODAsMjQyLDIyOSwxMTAsMTI4LCAzNiwxNjIsCisgICAgMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNzIsMTE0LCAgMiwgOTcsIDk1LCA5NywxOTIsIDk3LAorICAgICAgMiwgOTcsMTAxLCA5NywxMDksMjI4LDIzMywyMjksMjM4LDExNiwxMjgsIDM0LCAgNywyNDYsMTAxLDEzNCwKKyAgICAgIDAsIDk2LCA5NywxMjYsIDk3LDEzNywgOTcsMTU0LCA5NywxNjEsIDk3LDE3MCwgOTcsMTgyLDIyNiwyMjksCisgICAgMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgMjIsIDk5LCAgMiwgOTcsMTQzLCA5NywxNDgsMjM3LAorICAgICA5OCwxMjgsICAzLCAgMCwyMzksMjM3LCA5OCwxMjgsICAzLCAgMCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwKKyAgICAgODMsMjM2LDIzOSwyNDcsMjM3LDIzOSwxMDAsMTI4LCAgMiwyMDYsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsCisgICAgMjI1LDIyNywxMDEsMTI4LDI1NSwgNjQsMjQ0LDIzOSwyMzgsMjI5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDY0LAorICAgIDIyOSwyMjUsMjQ0LDIyOSwxMTQsMTMyLCAgMCwgNjIsIDk3LDIwOCwgOTcsMjI3LCA5NywyMzksIDk4LCAyNiwKKyAgICAyMjksMjQxLDI0NSwyMjUsMTA4LDEyOSwgMzQsMTAxLCA5NywyMTgsMjM5LDI0MiwyMzYsMjI5LDI0MywxMTUsCisgICAgMTI4LCAzNCwyMTksMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMzAsMTExLAorICAgICAgMiwgOTcsMjQ1LCA5OCwgMTUsMTE0LCAgMiwgOTcsMjUxLCA5OCwgIDgsMjI5LDI0MSwyNDUsMjMzLDI0NiwKKyAgICAyMjUsMjM2LDIyOSwyMzgsMTE2LDEyOCwgMzQsMTE1LDIzNiwyMjksMjQzLDExNSwxMjgsIDM0LDExOSwyNDYsCisgICAgMjI5LDI0MiwyMjksMjQxLDI0NSwyMjUsMTA4LDEyOCwgMzQsMTAzLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LAorICAgIDI1NCwxMDEsMTE1LCAgMiwgOTgsIDQwLCA5OCwgNDgsMjI3LDI0MiwyMzMsMjQwLDExNiwxMjgsICAyLCA5NywKKyAgICAyNDQsMjQyLDIzOSwyMzUsMTAxLDEyOCwgIDEsMjI5LDExNywgIDQsIDk4LCA2NiwgOTgsIDc3LCA5OCwxMzQsCisgICAgIDk4LDE0NSwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDgwLDIzMywxMDgsICAyLAorICAgICA5OCwgODQsIDk4LDEwOSwyMzYsMjI5LDIzNywyMzksMTE2LCAgMiwgOTgsIDk0LCA5OCwxMDEsMjM2LDIyOSwKKyAgICAyMzAsMTE2LDEyOCwgIDAsMTcxLDI0MiwyMzMsMjMxLDIzMiwxMTYsMTI4LCAgMCwxODcsMjQzLDIzMywyMzgsCisgICAgMjMxLDEwOCwgIDIsIDk4LDExOSwgOTgsMTI2LDIzNiwyMjksMjMwLDExNiwxMjgsIDMyLCA1NywyNDIsMjMzLAorICAgIDIzMSwyMzIsMTE2LDEyOCwgMzIsIDU4LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwKKyAgICAxNzYsMjQyLDIyNSwyMzcsMjQ1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDI0LDI0OSwyNDMsCisgICAgMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDIwMSwxMDQsMTQ0LCAgMCwxMDQsIDk4LDIwNCwxMDEsIDkwLAorICAgIDEwMSwxMjUsMTAxLDE2MiwxMDEsMjAyLDEwMywgOTAsMTAzLDExMCwxMDQsIDc1LDEwNCwgODcsMTA0LCA5OSwKKyAgICAxMDUsMTY3LDEwNSwxNzUsMTA1LDE4NiwxMDUsMTk1LDEwNiwgMTksMTA2LCAyMywgOTcsIDEzLCA5OCwyMzIsCisgICAgIDk5LCAxNSwgOTksIDI1LCA5OSwgNTUsIDk5LCA4MCwgOTksMTU4LCA5OSwxNzAsIDk5LDE5NSwgOTksMjEwLAorICAgICA5OSwyMzksIDk5LDI1MiwxMDAsIDU0LDEwMCwgNjMsIDk3LCAgMiwgOTgsMjM4LCA5OSwgIDEsMjI2LDIzNSwKKyAgICAyMzIsMjI1LDI0MywyMzMsMjI1LDIzOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCisgICAgMTY5LDIzNiwyNDQsMjM5LDIzOCwyMjksMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxOTMsMjI2LAorICAgIDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTg1LDIyOCwxMDEsICAyLCA5OSwgMzIsIDk5LCA1MCwKKyAgICAyNDMsMjI3LDIyOSwyMzgsMjI4LDIyOSwyNDIsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsCisgICAgICA0LDE3OSwyNDYsIDk3LDEyOCwgIDksIDU3LDIzMSwxMTcsICAyLCA5OSwgNjIsIDk5LCA3MSwyMzQsMjI1LAorICAgIDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE4NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA1NywKKyAgICAxMDQsICA0LCA5OSwgOTAsIDk5LCA5OSwgOTksMTEzLCA5OSwxNDMsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksCisgICAgMTI4LCAgNiwgNDUsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LAorICAgIDE2MiwxMDUsICAyLCA5OSwxMTksIDk5LDEzNCwyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwKKyAgICAyMjYsMjMzLCA5OSwxMjgsMjU0LDE2MywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDExMSwyMzcsCisgICAgMjI5LDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE2NCwyMzMsMjQ0LAorICAgIDI0NSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCA0MiwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwKKyAgICAyMzgsIDk3LDEyOSwgNDgsMjA3LCA5OSwxODMsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsCisgICAgMTI4LDI1NSwxMzgsMjM2LDIyNSwyMzgsMjQ0LDIzMSwyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LAorICAgICAxMCwgNzcsMjM3LDI1MCwgOTcsICAyLCA5OSwyMTgsIDk5LDIyNywyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwKKyAgICAxMjgsICA2LCAzMywyMzYsMjM5LDI0NywyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCAzMywyMzgsCisgICAgMjMxLDI0NSwyMzYsMjMwLDIzMywyMzYsMjM2LDIyOSwxMTQsMTI4LCA0OSwxMDAsMTE0LCAgMiwxMDAsICAyLAorICAgIDEwMCwgMTgsMjI4LDI0MywyMzMsMjMxLDIzOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKKyAgICAgIDQsIDc0LDI0MCwyMzksMjM5LDExMCwgIDIsMTAwLCAyNywxMDAsIDQwLDIzNiwyMjksMjMwLDI0NCwyMjYsCisgICAgMjI1LDI0MiwyMjYsMjQ1LDExMiwxMjgsIDMzLDE4OCwyNDIsMjMzLDIzMSwyMzIsMjQ0LDIyNiwyMjUsMjQyLAorICAgIDIyNiwyNDUsMTEyLDEyOCwgMzMsMTkyLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMjAyLDI0NCwKKyAgICAyMjUsMTAyLCAgMywxMDAsIDczLDEwMCwxNjUsMTAxLCAgMCwyNDAsMjI1LDI0NCwyMjUsMTA0LDEzNCwgIDUsCisgICAgMTc4LDEwMCwgOTMsMTAwLCA5OCwxMDAsMTEyLDEwMCwxMjEsMTAwLDEzNiwxMDAsMTUyLDE3NywgNTQsMTI4LAorICAgICAgNSwxNzgsIDUwLCAgMiwxMDAsMTA0LDEwMCwxMDgsIDUxLDEyOCwgIDUsMTc4LDEwMiwxMjgsICA1LDE3OCwKKyAgICAyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3OCwyMzgsMjI1LDI0MiwyNDIsMjM5LDI0NywyMzIsCisgICAgMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3OCwyNDEsMjQ1LDIyNSwyNDIsMjQ0LDIyOSwyNDIsMjMyLAorICAgIDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNzgsMjQ3LDIzMywyMjgsMjI5LDIzMiwyMjksMjI2LDI0MiwKKyAgICAyMjksMTE5LDEyOCwgIDUsMTc4LDI0MSwyMjUsMjM3LDIyNSwyNDQsMTE1LDEzNSwgIDUsMTc5LDEwMCwxODgsCisgICAgMTAwLDE5MywxMDAsMTk4LDEwMCwyMDMsMTAwLDIxMiwxMDAsMjI3LDEwMCwyNDMsMTc3LCA5OCwxMjgsICA1LAorICAgIDE3OSwxNzgsIDU2LDEyOCwgIDUsMTc5LDE3OSwgNTIsMTI4LCAgNSwxNzksMjMyLDIyOSwyMjYsMjQyLDIyOSwKKyAgICAxMTksMTI4LCAgNSwxNzksMjM4LDIyNSwyNDIsMjQyLDIzOSwyNDcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksCisgICAgMTI4LCAgNSwxNzksMjQxLDI0NSwyMjUsMjQyLDI0NCwyMjksMjQyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LAorICAgIDEyOCwgIDUsMTc5LDI0NywyMzMsMjI4LDIyOSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3OSwKKyAgICAyNDMsMjI5LDIzMSwyMzksMTA4LDEzNSwgIDUsMTc3LDEwMSwgMjIsMTAxLCAyNywxMDEsIDMyLDEwMSwgMzcsCisgICAgMTAxLCA0NiwxMDEsIDYxLDEwMSwgNzcsMTc3LCA1NSwxMjgsICA1LDE3NywxNzgsIDUyLDEyOCwgIDUsMTc3LAorICAgIDE3OSwgNDgsMTI4LCAgNSwxNzcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNzcsMjM4LDIyNSwKKyAgICAyNDIsMjQyLDIzOSwyNDcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNzcsMjQxLDI0NSwyMjUsCisgICAgMjQyLDI0NCwyMjksMjQyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTc3LDI0NywyMzMsMjI4LAorICAgIDIyOSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3NywgOTgsICAzLDEwMSwgOTgsMTAxLDEwMywKKyAgICAxMDEsMTEzLDIyNSwxMTQsMTI4LCAgMSwgMzksMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksCisgICAgIDE1LDI0MiwyMjksMjQ2LDIyOSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDQzLCA5OSwgIDIsMTAxLAorICAgIDEzMSwxMDEsMTQwLDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgMzAsIDQxLDIzMywyNDIsIDk5LCAgMiwKKyAgICAxMDEsMTQ4LDEwMSwxNTMsMjM2LDEwMSwxMjgsIDM2LDIxNSwyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwxMjgsCisgICAgICAxLCAzNywxMDAsICAyLDEwMSwxNjgsMTAxLDE3OCwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTI4LAorICAgICAzMCwgMzksMjM5LDExNiwgIDIsMTAxLDE4NSwxMDEsMTk0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwKKyAgICAgMzAsIDM1LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgMzcsMTAxLDEzNiwgIDUsMjEyLDEwMSwyMjIsCisgICAgMTAxLDI1NSwxMDIsIDE5LDEwMiwyNDgsMTAzLCAgOCwxMDMsIDUzLDEwMywgNjIsMTAzLCA3NSwyMjUsMjQyLAorICAgIDExNiwxMjksIDM4LDEwMSwxMDEsMjMwLDI0MywyNDUsMjMzLDExNiwgIDIsMTAxLDIzOSwxMDEsMjQ3LDIyNiwKKyAgICAyMzYsMjI1LDIyNywxMDcsMTI4LCAzOCwxMDEsMjQ3LDIzMiwyMzMsMjQ0LDEwMSwxMjgsIDM4LCA5NywyMjgsCisgICAgMjI1LDIzMSwyMjksMjQzLDEwNCwxMjksMjUxLCA1MiwxMDIsIDEwLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LAorICAgIDEyOCwyNTEsIDUyLDEwNCwgIDYsMTAyLCAzMywxMDIsIDYxLDEwMiwgNjksMTAyLDExOSwxMDIsMTY1LDEwMiwKKyAgICAyMTQsIDk3LCAgMiwxMDIsIDM5LDEwMiwgNTMsMjM2LDI0NCwyMzksMjM4LDIyOSwyMjUsMjQyLDIyNSwyMjYsCisgICAgMjMzLCA5OSwxMjgsICA2LDE5MywyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDcxLDIyOSwyMjYsMjQyLAorICAgIDIyOSwxMTksMTI4LCAgNSwyMTIsMjMwLDIzMywyMzgsMjI1LDIzNiwgOTcsICAyLDEwMiwgODAsMTAyLDExMSwKKyAgICAyMzYsMTE2LCAgMiwxMDIsIDg3LDEwMiwgOTksMjM5LDIzOCwyMjksMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksCisgICAgMTI4LDI1MSwxNjcsMjQ0LDI0NywyMzksMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMzQsMjQyLAorICAgIDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIzNCwyMzIsMjI1LDIzNywyNTAsMjI1LDIyNSwyMjYsMjM5LDI0NiwKKyAgICAxMDEsICAyLDEwMiwxMzQsMTAyLDE0OCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsCisgICAgIDk5LDEyOCwyNTEsMTY1LDIzMywyNDMsMjM5LDIzNiwyMjUsMjQ0LDIyOSwyMjgsMjI1LDI0MiwyMjUsMjI2LAorICAgIDIzMywgOTksMTI4LDI1MSwxNjQsMTA1LCAgMiwxMDIsMTcxLDEwMiwyMDUsMjM4LDIzMywyNDQsMjMzLDIyNSwKKyAgICAyMzYsIDk3LCAgMiwxMDIsMTgzLDEwMiwxOTcsMjM2LDI0NCwyMzksMjM4LDIyOSwyMjUsMjQyLDIyNSwyMjYsCisgICAgMjMzLCA5OSwxMjgsMjUxLDE2OCwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjM1LDI0MiwyMjUsMjMxLAorICAgIDIyNSwyMzgsIDk3LDEyOCwgNDgsMTIwLDIzNywyMjksMjI4LDIzMywyMjUsMjM2LCA5NywgIDIsMTAyLDIyNiwKKyAgICAxMDIsMjQwLDIzNiwyNDQsMjM5LDIzOCwyMjksMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxNjksCisgICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIzNiwyMzMsMjQzLDIyOSwyMzMsMjI5LDI0MiwyMjUsMjQzLAorICAgIDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxMjMsMTA3LCAgMiwxMDMsIDE0LDEwMywgMzgsMjI1LDI0NCwKKyAgICAyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjE2LDEwMywgMjYsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsCisgICAgMjI4LDI0NCwxMDQsMTI4LDI1NSwxNDEsMjQ1LDI0NCwyMjUsMjI1LDI0MiwyNDUsMjQzLDI0MSwyNDUsMjI1LAorICAgIDI0MiwxMDEsMTI4LCA1MSwgNTQsMjM4LDIzMSwyMzIsMjM5LDIzOSwxMDcsMTI4LCAgMiwxMDMsMjQyLDI0NSwKKyAgICAyNDQsMjQ1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDU3LDExNiwxMjksICA1LDIxNSwxMDMsCisgICAgIDgxLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjE1LDIzMiwyMzksMjM5LDEwNywxMjksICAyLAorICAgIDEwMiwxMDMsIDk5LDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAgMiwxNzcsMTA1LCAgNCwKKyAgICAxMDMsMTIwLDEwMywyMDUsMTAzLDIxNiwxMDMsMjQxLDIyOSwyNDUsMTA0LCAgNCwxMDMsMTMyLDEwMywxNjcsCisgICAgMTAzLDE4MiwxMDMsMTkxLCA5NywgIDIsMTAzLDEzOCwxMDMsMTUzLDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LAorICAgIDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsMTIzLDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwKKyAgICAyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgMjcsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsCisgICAgMjI5LDIyNSwxMTAsMTI4LCA1MCwxMDksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNzgsMjQwLAorICAgIDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAxMywyMzIsMjMzLDI0MiwKKyAgICAyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTE0LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsCisgICAgMTI5LCA0OCwyMTAsMTAzLDIyOSwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LAorICAgIDEzOSwyNDIsMjMzLDExMywxMzQsICA1LDE4MCwxMDQsICAzLDEwNCwgIDgsMTA0LCAyMiwxMDQsIDMxLDEwNCwKKyAgICAgNDYsMTA0LCA2MiwxNzcsIDUyLDEyOCwgIDUsMTgwLCA1MCwgIDIsMTA0LCAxNCwxMDQsIDE4LCA0OSwxMjgsCisgICAgICA1LDE4MCwxMDAsMTI4LCAgNSwxODAsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODAsMjM4LAorICAgIDIyNSwyNDIsMjQyLDIzOSwyNDcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODAsMjQxLDI0NSwKKyAgICAyMjUsMjQyLDI0NCwyMjksMjQyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTgwLDI0NywyMzMsCisgICAgMjI4LDIyOSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4MCwyMzYsMjMzLDIzOCwyMjksMjI2LAorICAgIDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDE1MCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwKKyAgICAxMjgsMjU1LCA3MiwxMTEsICA5LDEwNCwxMTksMTA0LDEzMCwxMDQsMTU0LDEwNCwxNzksMTA1LCAxMSwxMDUsCisgICAgIDI0LDEwNSwxMTAsMTA1LDE1MCwxMDUsMTYxLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LAorICAgICAgNSwxMTIsMjMyLDEwNSwgIDIsMTA0LDEzNywxMDQsMTQ1LDI0MCwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwKKyAgICAgNDMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMjMsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsCisgICAgMjM4LCA5NywxMjksIDQ4LDIxOSwxMDQsMTY3LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LAorICAgIDEyOCwyNTUsMTQyLDIzNiwyMjUsMTA5LDEzNSwgIDUsMTg1LDEwNCwxOTksMTA0LDIwNCwxMDQsMjA5LDEwNCwKKyAgICAyMTQsMTA0LDIyMywxMDQsMjM4LDEwNCwyNTQsMTc3LCA1NywxMjgsICA1LDE4NSwxNzgsIDU0LDEyOCwgIDUsCisgICAgMTg1LDE3OSwgNTAsMTI4LCAgNSwxODUsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODUsMjM4LAorICAgIDIyNSwyNDIsMjQyLDIzOSwyNDcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODUsMjQxLDI0NSwKKyAgICAyMjUsMjQyLDI0NCwyMjksMjQyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTg1LDI0NywyMzMsCisgICAgMjI4LDIyOSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4NSwyMzgsMjM5LDIzNSwyMzIsMjQ1LAorICAgIDIzNSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNDYsMTExLCAgMiwxMDUsIDMwLDEwNSwxMDAsMTA3LCAgNCwKKyAgICAxMDUsIDQwLDEwNSwgNTIsMTA1LCA1OCwxMDUsIDgwLDIyNSwyMjYsMjM5LDI0NiwyMjksMjI3LDIzOSwyMzcsCisgICAgIDk4LDEyOCwgIDMsICA5LDIyNywyMzcsIDk4LDEyOCwgIDMsICA5LDI0MCwyMjUsMjM2LDIyNSwyNDQsMjI1LAorICAgIDIzNiwyMzMsMjUwLDIyOSwyMjgsMjI2LDIyOSwyMzYsMjM5LDI0NywyMjcsMjM3LCA5OCwxMjgsICAzLCAzMywKKyAgICAyNDIsMjI5LDI0NCwyNDIsMjM5LDIzMCwyMzYsMjI5LDI0OCwyMjYsMjI5LDIzNiwyMzksMjQ3LDIyNywyMzcsCisgICAgIDk4LDEyOCwgIDMsIDM0LDIzOCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCA2NiwxMTQsICAyLAorICAgIDEwNSwxMTYsMTA1LDE0MywxMDUsICAyLDEwNSwxMjIsMTA1LDEzMSwyMjcsMjM5LDI0MCwyNDQsMjMzLCA5OSwKKyAgICAxMjgsICAzLDIzMywyNTAsMjM5LDIzOCwyNDQsMjI1LDIzNiwyMjYsMjI1LDExNCwxMjgsIDMyLCAyMSwyMzgsCisgICAgMjI3LDIzNywgOTgsMTI4LCAgMywgMjcsMjQ0LDI0MywyNDAsMjQyLDIzMywyMzgsMjMxLDExNSwxMjgsIDM4LAorICAgIDEwNCwyNDUsMjQzLDEwMSwxMjgsIDM1LCAgMiwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTYzLDI0MywKKyAgICAyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAgMiwxNzYsMjQ0LDI0NSwyNDIsMjM4LDIyOSwxMDAsCisgICAgMTI4LCAgMiwxMDEsMTE3LCAgNCwxMDUsMjA1LDEwNSwyMTYsMTA1LDIyOSwxMDUsMjU0LDIzMiwyMzMsMjQyLAorICAgIDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMTcsMjMzLDIzMywyNDQsMjM5LDI0MywyNDEsMjQ1LDIyNSwKKyAgICAyNDIsMTAxLDEyOCwgNTEsIDUxLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyMTMsCisgICAgMTA1LDI0MiwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDE0MCwyMzgsMjMxLAorICAgIDIyNSwyNDIsMjQ1LDIzNywyMzYsMjI1LDI0NSwxMTYsMTI5LCAgMiwyMjEsMTA2LCAxMywyMjcsMjM3LCA5OCwKKyAgICAxMjgsICAzLCAxMSwxMTgsMTI4LCAgMSwxNDksMjQ5LDI0MCwyMzIsMjI5LDExMCwxMzIsICAwLCA0NSwxMDYsCisgICAgIDM5LDEwNiwgNTAsMTA2LCA2MiwxMDYsIDg1LDIzMywyMzgsMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LAorICAgIDI0NiwyMjksMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMTMsMTE1LCAgMiwKKyAgICAxMDYsIDY4LDEwNiwgNzUsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsIDk5LDI0NSwyNDAsMjI5LDI0MiwyMzMsCisgICAgMjM5LDExNCwxMjgsMjQ2LDIzMCwyNDQsMjQ3LDExMSwxMjgsIDMyLCAxNiwxMDUsMTQ5LCAgMCwxMDUsMTA2LAorICAgIDEzNywxMDYsMTYwLDEwNiwxOTQsMTA2LDI0MSwxMTAsMTIzLDExMCwyNDMsMTExLCAyNCwxMTEsIDUxLDExMSwKKyAgICAyMTMsMTExLDIxNywxMTEsMjU1LDExMiwgMjEsMTEyLDEwNSwxMTMsIDE0LDExMywgODksMTEzLCA5NywxMTMsCisgICAgMTEwLDExMywxOTcsMTEzLDI1NCwxMTQsIDI2LDExNCwgNzAsMjI1LCA5OSwgIDIsMTA2LDE0NCwxMDYsMTUwLAorICAgIDI0NSwyNDQsMTAxLDEyOCwgIDAsMjM3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA3OSwKKyAgICAgOTgsICAzLDEwNiwxNjgsMTA2LDE3NywxMDYsMTg3LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksCisgICAgMTM1LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAzOSwyNDIsMjI5LDI0NiwxMDEsMTI4LAorICAgICAgMSwgNDUsIDk5LCAgMywxMDYsMjAyLDEwNiwyMDksMTA2LDIzMSwyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwKKyAgICAyMDgsMjMzLDI0MiwgOTksICAyLDEwNiwyMTcsMTA2LDIyMiwyMzYsMTAxLDEyOCwgMzYsMjE2LDI0NSwyMzcsCisgICAgMjMwLDIzNiwyMjksMTIwLDEyOCwgIDAsMjM4LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAorICAgICA4NiwxMDAsICA0LDEwNiwyNTEsMTA3LCAgNSwxMTAsIDgwLDExMCwxMTMsMjI2LDIzNiwyMzEsMjQyLDIyNSwKKyAgICAyNDYsMTAxLDEyOCwgIDIsICA5LDEwMSwgIDIsMTA3LCAxMSwxMTAsIDc1LDIzOSwyMzEsMjQyLDIyNSwyNDAsCisgICAgMTA0LCAgNywxMDcsIDMyLDEwNywgNDYsMTA3LCA1OSwxMDksMjQ0LDExMCwgMTksMTEwLCAzMiwxMTAsIDQ0LAorICAgIDIyOSwyMjUsMjQyLDI0NCwyMzIsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCA1MCwxNDMsMjMwLDIzMywKKyAgICAyNDIsMjI5LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgNTAsMTM5LDIzMywgOTksIDE0LDEwNywgOTAsCisgICAgMTA3LDEwNiwxMDcsMjA1LDEwOCwgIDMsMTA4LCA2OSwxMDgsIDk4LDEwOCwxMTQsMTA4LDE3MSwxMDgsMjIwLAorICAgIDEwOCwyMzIsMTA5LCAgMywxMDksIDcwLDEwOSwyMDgsMTA5LDIzNywyMjUsMjM2LDIzNiwyMzMsMjI1LDIzOCwKKyAgICAyMjcsMjI5LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNjMsIDk5LCAgNCwxMDcsMTE2LDEwNywxMjcsCisgICAgMTA3LDE0MSwxMDcsMTQ4LDIyNSwyMzYsMjM2LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNTgsMjI5LAorICAgIDIzOCwyNDQsMjQyLDIyOSwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDUwLDE2NSwyMzYsMjM5LDI0MywKKyAgICAxMDEsMTI4LCA0OCwgIDYsMTExLCAgMywxMDcsMTU2LDEwNywxNzEsMTA3LDE5MSwyMzcsMjM3LCA5NywxMjksCisgICAgIDQ4LCAgMSwxMDcsMTY0LDIzNiwyMjksMjMwLDExNiwxMjgsMjU1LDEwMCwyMzgsMjMxLDI0MiwyMjUsMjQ0LAorICAgIDI0NSwyMzYsMjI1LDI0NCwyMzMsMjM5LDIzOCwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDU1LDI0MiwKKyAgICAyNDIsMjI5LDIyNywyNDQsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCA1MCwxNjMsMTAxLCAgMywxMDcsCisgICAgMjEzLDEwNywyMjUsMTA3LDI0MiwyMjUsMjQyLDI0NCwyMzIsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLAorICAgICA0NywyMzgsMjQ0LDIyOSwyNDIsMjQwLDI0MiwyMzMsMjQzLDIyOSwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwKKyAgICAgNTAsIDYxLDI0OCwyMjcsMjI5LDIzNiwyMzYsMjI5LDIzOCwyNDQsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsCisgICAgMTI4LCA1MCwxNTcsMTAyLCAgMiwxMDgsICA5LDEwOCwgMjQsMjI5LDI0MywyNDQsMjMzLDI0NiwyMjUsMjM2LAorICAgIDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNjQsMTA1LCAgMiwxMDgsIDMwLDEwOCwgNTksMjM4LDIyNSwKKyAgICAyMzgsMjI3LDIzMywyMjUsMTA4LCAgMiwxMDgsIDQyLDEwOCwgNTEsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsCisgICAgMTI4LCA1MCwxNTAsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCA1NCwyNDIsMjI5LDI0MCwyMjUsMjQyLAorICAgIDIyOSwxMTAsMTI4LCA1MCwgNDMsMTA0LCAgMiwxMDgsIDc1LDEwOCwgODYsMjI1LDI0NiwyMjksMjQwLDIyNSwKKyAgICAyNDIsMjI5LDExMCwxMjgsIDUwLCA1MCwyMzMsMjMxLDIzMiwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsCisgICAgIDUwLDE2NCwyMzMsMjQ0LDIyOSwyNDIsMjI1LDI0NCwyMzMsMjM5LDIzOCwyMzcsMjI1LDI0MiwxMDcsMTI4LAorICAgICA0OCwgIDUsMTA4LCAgMywxMDgsMTIyLDEwOCwxNDgsMTA4LDE2MCwyMjUsMjI2LDIzOSwxMTQsICAyLDEwOCwKKyAgICAxMzEsMTA4LDE0MCwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDUwLDE1MiwyNDAsMjI1LDI0MiwyMjksCisgICAgMTEwLDEyOCwgNTAsIDU2LDIyOSwyMzAsMjQ0LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgNTAsMTY3LAorICAgIDIzOSwyNDcsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCA1MCwxNjYsMTA5LCAgMiwxMDgsMTc3LDEwOCwKKyAgICAyMDksMTAxLCAgMiwxMDgsMTgzLDEwOCwxOTgsMjI4LDIzMywyMjcsMjMzLDIzOCwyMjksMjI3LDIzMywyNDIsCisgICAgMjI3LDIzNiwxMDEsMTI4LCA1MCwxNjksMjQ0LDIyNSwyMzYsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLAorICAgICA0NiwyMzksMjM5LDIzOCwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDQyLDIzOCwyMjUsMjM3LDIyOSwKKyAgICAyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDUyLDExMiwgIDIsMTA4LDIzOCwxMDgsMjQ2LDIyOSwyNDIsCisgICAgMjMzLDIzOSwxMDAsMTI4LCA0OCwgIDIsMjQyLDIzMywyMzgsMjQ0LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLAorICAgIDEyOCwgNTAsMTU4LDExNCwgIDIsMTA5LCAgOSwxMDksIDU3LDEwMSwgIDMsMTA5LCAxNywxMDksIDI4LDEwOSwKKyAgICAgNDMsMjI1LDIyNywyMzIsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCA2NywyNDAsMjQyLDIyOSwyNDMsCisgICAgMjI5LDIzOCwyNDQsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCA1NywyNDMsMjM5LDI0NSwyNDIsMjI3LAorICAgIDIyOSwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDYyLDIzMywyMzEsMjMyLDI0NCwyMjcsMjMzLDI0MiwKKyAgICAyMjcsMjM2LDEwMSwxMjgsIDUwLDE2OCwxMTUsICA1LDEwOSwgODIsMTA5LDExMSwxMDksMTI1LDEwOSwxNTAsCisgICAgMTA5LDE3OCwxMDEsICAyLDEwOSwgODgsMTA5LDEwMSwyMjcsMjQyLDIyOSwyNDQsMjI3LDIzMywyNDIsMjI3LAorICAgIDIzNiwxMDEsMTI4LCA1MCwxNTMsMjM2LDIzMCwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDY2LDIzOSwKKyAgICAyMjcsMjMzLDIyOSwyNDQsMjQ5LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNTEsMTEyLCAgMiwxMDksCisgICAgMTMxLDEwOSwxMzcsMjI1LDIyNywxMDEsMTI4LCA0OCwgIDAsMjI5LDIyNywyMzMsMjI1LDIzNiwyNDAsMjI1LAorICAgIDI0MiwyMjksMTEwLDEyOCwgNTAsIDUzLDExNiwgIDIsMTA5LDE1NiwxMDksMTY3LDIzOSwyMjcsMjM1LDI0MCwKKyAgICAyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNDksMjQ1LDIyOCwyNDksMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsCisgICAgIDUwLCA1OSwxMTcsICAyLDEwOSwxODQsMTA5LDE5MywyMzgsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLAorICAgICA0OCwyNDAsMjI5LDI0MiwyNDYsMjMzLDI0MywyMjksMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCA2MCwKKyAgICAxMTksICAyLDEwOSwyMTQsMTA5LDIyNiwyMjUsMjQ0LDIyOSwyNDIsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsCisgICAgIDUwLCA0NCwyMzksMjM5LDIyOCwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDQ1LDI1MCwyMjksMjQyLAorICAgIDExMSwxMjgsIDQ4LCAgNywxMDksICAyLDEwOSwyNTAsMTEwLCAgNywyMjksMjQ0LDIyNSwyMzYsMjI3LDIzMywKKyAgICAyNDIsMjI3LDIzNiwxMDEsMTI4LCA1MCwxNDIsMjM5LDIzOSwyMzgsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsCisgICAgMTI4LCA1MCwxMzgsMjM4LDIyNSwyMzcsMjI5LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgNTAsMTQ4LAorICAgIDI0MywyNDUsMjM4LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgNTAsMTQ0LDExOSwgIDIsMTEwLCA1MCwKKyAgICAxMTAsIDYzLDIyNSwyNDQsMjI5LDI0MiwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDUwLDE0MCwyMzksCisgICAgMjM5LDIyOCwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDUwLDE0MSwyNDYsIDk3LDEyOCwgIDksICA3LAorICAgIDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMzAsICAwLDIzOSwxMTAsIDk0LDExMCwxMDIsMjI1LDIyNywKKyAgICAyNDUsMjQ0LDEwMSwxMjgsIDMwLCA0NywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCisgICAgMjI5LDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDIwMywxMDEsICAzLDExMCwxMzEsMTEwLAorICAgIDE0NywxMTAsMTU4LDIyNiwyNDIsMjI5LDI0NiwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwKKyAgICAxMjgsICA0LDIxNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDUzLDI0NSwyMzgsCisgICAgMTAzLCAgNCwxMTAsMTcwLDExMCwyMDUsMTEwLDIyMCwxMTAsMjI5LCA5NywgIDIsMTEwLDE3NiwxMTAsMTkxLAorICAgIDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsMTE3LDI0MCwKKyAgICAyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgMjEsMjI3LDIzMywyNDIsCisgICAgMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMDMsMjM1LDIzOSwyNDIsMjI5LAorICAgIDIyNSwxMTAsMTI4LCA0OSwgNzEsMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwKKyAgICAxMjgsIDUwLCAgNywxMDMsICAyLDExMCwyNDksMTExLCAgMCwyNDIsMjI1LDI0NiwxMDEsMTI4LCAgMCwyMzYsCisgICAgMTE3LCAgMiwxMTEsICA2LDExMSwgMTUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxMzUsMjQyLAorICAgIDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgIDcsMTA0LCAgMiwxMTEsIDMwLDExMSwgNDAsMjMzLDI0MiwKKyAgICAyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDY4LDIzOSwyMzksMjM1LDIyNSwyMjYsMjM5LDI0NiwxMDEsCisgICAgMTI4LCAzMCwyMDEsMTA1LCAgOCwxMTEsIDY5LDExMSwgNzksMTExLCA5MCwxMTEsIDk3LDExMSwxMjIsMTExLAorICAgIDEzOCwxMTEsMTUzLDExMSwxNjksMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTM2LDIyNywKKyAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNTYsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksCisgICAgICA4LDIzMSwxMTcsICAyLDExMSwxMDQsMTExLDExMywyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLAorICAgIDEzNiwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAgOCwyMzcsMjI1LDI0NCwyNDIsMjI1LDIzMSwKKyAgICAyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgNjQsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksCisgICAgMjI4LDIyNiwyNDIsMjI5LDI0NiwxMDEsMTI4LCAgMiwgMTEsMjQzLDIzMiwyMzksMjQyLDI0NCwyMjcsMjQ5LAorICAgIDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDU3LDI0NiwyMzksMjQ3LDIyOSwyMzYsMjQzLDIzMywKKyAgICAyMzEsMTEwLCAgMywxMTEsMTg1LDExMSwxOTUsMTExLDIwMiwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsCisgICAgMTI4LCAgOSwxOTIsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDY0LDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LAorICAgIDI0NCwxMDUsMTI4LCAxMCwxOTIsMTA2LDEyOCwgIDEsIDUxLDEwNywgIDIsMTExLDIyMywxMTEsMjQ3LDIyNSwKKyAgICAyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDE2NCwxMTEsMjM1LDIzMiwyMjUsMjM2LDIzMCwyNDcsCisgICAgMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTE0LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgOTksMTA4LAorICAgICAgMiwxMTIsICA1LDExMiwgMTAsMjI4LDEwMSwxMjgsICAyLDIyMCwyNDUsMjQ5LDIzMiwyMjksMjI2LDI0MiwKKyAgICAyMjksMTE5LDEyOCwgIDUsMTcyLDEwOSwgIDIsMTEyLCAyNywxMTIsIDk0LCA5NywgIDMsMTEyLCAzNSwxMTIsCisgICAgIDU1LDExMiwgODAsMjI3LDI0MiwyMzksMTEwLDEyOSwgIDEsIDQzLDExMiwgNDQsMjI3LDI0OSwyNDIsMjMzLAorICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDIyNywyMzEsMjI5LDIzOSwyNDIsMjI1LDI0MCwyNDAsMjQyLDIzOSwKKyAgICAyNDgsMjMzLDIzNywyMjUsMjQ0LDIyOSwyMzYsMjQ5LDIyOSwyNDEsMjQ1LDIyNSwxMDgsMTI4LCAzNCwgODMsCisgICAgMjQ0LDI0MiwyMjUsMjMxLDI0NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA2MywyMzksMjM4LAorICAgIDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDczLDExMCwgIDUsMTEyLDExNywxMTIsMTI3LDExMiwKKyAgICAxMzYsMTEyLDE0OCwxMTIsMjMyLDIyNywyNDIsMjI5LDIzNywyMjksMjM4LDExNiwxMjgsIDM0LCAgNiwyMzAsCisgICAgMjMzLDIzOCwyMzMsMjQ0LDEyMSwxMjgsIDM0LCAzMCwyMzMsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LAorICAgIDExMCwxMjgsICA1LDEwNywxMTYsICAyLDExMiwxNTQsMTEyLDIyMiwxMDEsICAyLDExMiwxNjAsMTEyLDIxMSwKKyAgICAyMzEsMjQyLDIyNSwxMDgsMTMxLCAzNCwgNDMsMTEyLDE3MywxMTIsMTkxLDExMiwxOTYsIDk4LCAgMiwxMTIsCisgICAgMTc5LDExMiwxODcsMjM5LDI0NCwyNDQsMjM5LDEwOSwxMjgsIDM1LCAzMywxMTYsMTI4LCAzNSwgMzMsMjI5LAorICAgIDEyMCwxMjgsMjQ4LDI0NSwxMTYsICAyLDExMiwyMDIsMTEyLDIwNywyMzksMTEyLDEyOCwgMzUsIDMyLDExMiwKKyAgICAxMjgsIDM1LCAzMiwyNDIsMjQzLDIyOSwyMjcsMjQ0LDIzMywyMzksMTEwLDEyOCwgMzQsIDQxLDIzMywyNDMsCisgICAgMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCAgNSwxMTgsICAzLDExMiwyNDAsMTEyLDI0OSwxMTMsICAyLAorICAgIDIyNiwyNDUsMjM2LDIzNiwyMjksMTE2LDEyOCwgMzcsMjE2LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwKKyAgICAgMzcsMjE3LDI0MywyMzcsMjMzLDIzNiwyMjksMjMwLDIyNSwyMjcsMTAxLDEyOCwgMzgsIDU5LDExMSwgIDMsCisgICAgMTEzLCAyMiwxMTMsIDMzLDExMywgNDEsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAorICAgICA4MSwyMzEsMjM5LDIzOCwyMjksMTA3LDEyOCwgIDEsIDQ3LDI0NCwgOTcsMTMxLCAgMywxODUsMTEzLCA1MiwKKyAgICAxMTMsIDczLDExMywgODEsMjI4LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjksICAzLDIwMiwxMTMsCisgICAgIDY1LDI0NCwyMzksMjM4LDIzOSwxMTUsMTI4LCAgMywxNDQsMjM2LDIyNSwyNDQsMjMzLDExMCwxMjgsICAyLAorICAgIDEwNSwyNDQsMjM5LDIzOCwyMzksMTE1LDEyOCwgIDMsMTc1LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwKKyAgICAxNjQsMjQyLDIzMywyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsMTE0LDExNSwgIDQsCisgICAgMTEzLDEyMCwxMTMsMTY1LDExMywxNzksMTEzLDE4NywyMzcsMjI1LDIzNiwxMDgsICAyLDExMywxMjksMTEzLAorICAgIDE0MCwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDY3LDIzNSwyMjUsMjQ0LDIyNSwKKyAgICAyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwxNjMsMTEzLDE1MywyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsCisgICAgMjQ0LDEwNCwxMjgsMjU1LDEwNCwyNDMsMjMyLDIyNSwyNDIsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LAorICAgIDEyOCwgIDksMjUwLDI0NCwyNDIsMjM5LDIzNSwxMDEsMTI4LCAgMiwxMDQsMjQ1LDI0MCwyMjksMjQyLDIzMywKKyAgICAyMzksMTE0LDEyOCwyNDYsMjM3LDExNiwgIDIsMTEzLDIwMywxMTMsMjM3LDIyOSwyNDIsMjI1LDI0NCwyMzMsCisgICAgMjM5LDExMCwgIDIsMTEzLDIxNSwxMTMsMjI2LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LAorICAgICA0OCwxNTcsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDI1MywyMzMsMjM2LDIyOCwKKyAgICAxMDEsMTI5LCAgMSwgNDEsMTEzLDI0NiwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDQ1LDExNywgIDIsCisgICAgMTE0LCAgNCwxMTQsIDE1LDIyNiwyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgNDEsMjI3LAorICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA3OCwyNDYsMjM5LDI0NywyMjksMjM2LDI0MywKKyAgICAyMzMsMjMxLDExMCwgIDMsMTE0LCA0MiwxMTQsIDUyLDExNCwgNTksMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsCisgICAgMTA1LDEyOCwgIDksMTkxLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA2MywyMzEsMjQ1LDIzNCwyMjUsMjQyLAorICAgIDIyNSwyNDQsMTA1LDEyOCwgMTAsMTkxLDI1MCwyMzIsMjMzLDI0NCwyNDMsIDk3LCAgMiwxMTQsIDgxLDExNCwKKyAgICAgOTIsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDExNywyMjgsMjI2LDIzNiwyMzEsCisgICAgMjQyLDIyNSwyNDYsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMTksMTA2LAorICAgIDEzOCwgIDAsMTA2LDExNCwxMzUsMTE0LDE5OCwxMTQsMjA5LDExNSwgIDMsMTE1LCAxOSwxMTUsMTMyLDExNSwKKyAgICAyMDEsMTE1LDIwNiwxMTUsMjE4LDExNSwyMjYsIDk3LCAgNCwxMTQsMTQ1LDExNCwxNTYsMTE0LDE2NiwxMTQsCisgICAgMTczLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMTMsMjI2LDIyOSwyMzgsMjMxLAorICAgIDIyNSwyMzYsMTA1LDEyOCwgIDksMTU2LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAyOCwyMzEsMTE3LCAgMiwKKyAgICAxMTQsMTgwLDExNCwxODksMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNTYsMjQyLDIzNywyNDUsCisgICAgMjM1LDIzMiwxMDUsMTI4LCAxMCwgMjgsMjI2LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LAorICAgICAxNiwgOTksICAzLDExNCwyMTcsMTE0LDIyNCwxMTQsMjQ2LDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLDI0MCwKKyAgICAyMzMsMjQyLCA5OSwgIDIsMTE0LDIzMiwxMTQsMjM3LDIzNiwxMDEsMTI4LCAzNiwyMTcsMjQ1LDIzNywyMzAsCisgICAgMjM2LDIyOSwxMjAsMTI4LCAgMSwgNTMsMjQyLDIzOSwyNDMsMjQzLDIyOSwyMjgsMjQ0LDIyNSwyMzMsMTA4LAorICAgIDEyOCwgIDIsMTU3LDIyOCwyMzksMjQ0LDIzNiwyMjksMjQzLDI0MywyNDMsMjQ0LDI0MiwyMzksMjM1LDEwMSwKKyAgICAxMjgsICAyLCA5NSwxMDEsICAzLDExNSwgMjcsMTE1LCAzOCwxMTUsMTAzLDIyNywyNDksMjQyLDIzMywyMzYsCisgICAgMjM2LDIzMywgOTksMTI4LCAgNCwgODgsMjI5LDEwOSwgIDQsMTE1LCA0OSwxMTUsIDU4LDExNSwgNzIsMTE1LAorICAgICA4OCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA0NCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwKKyAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTU4LDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsCisgICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE1OSwyMzcsMjI5LDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLAorICAgIDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE2MCwxMDQsICAyLDExNSwxMDksMTE1LDExOCwyMjUsMjQyLDIyNSwKKyAgICAyMjYsMjMzLCA5OSwxMjgsICA2LDE1MiwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsCisgICAgIDk5LDEyOCwyNTEsMTM5LDEwNCwgIDIsMTE1LDEzOCwxMTUsMTg4LCA5NywgIDMsMTE1LDE0NiwxMTUsMTU2LAorICAgIDExNSwxNjMsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTU3LDIyOCwyMjksMjQ2LCA5NywKKyAgICAxMjgsICA5LCAyOSwyMzEsMTE3LCAgMiwxMTUsMTcwLDExNSwxNzksMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsCisgICAgMTI4LCAxMCwxNTcsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMjksMjI5LDIzMiwyMjUsMjQyLAorICAgIDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsMTIzLDIzMywxMTUsMTI4LCA0OCwgIDQsMjM3LDIzOSwKKyAgICAyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNzQsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsCisgICAgIDM2LDE2NSwyNDMsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgIDIsMTc4LDEwNywxNDYsICAwLAorICAgIDEwNywxMTYsIDIxLDExOCwxMTAsMTE4LDEyMSwxMTgsMTgzLDExOCwxOTQsMTE5LCAyOCwxMTksIDQyLDEyMCwKKyAgICAxNTAsMTIxLCA5MCwxMjEsMTAzLDEyMSwxMjksMTIxLDE3OCwxMjIsIDYwLDEyMiwgODIsMTIyLCA5NSwxMjIsCisgICAgMTE4LDEyMiwxNjAsMTIyLDE3MCwgOTcsIDEyLDExNiwgNDcsMTE2LCA3OSwxMTYsMTAxLDExNiwxMzEsMTE2LAorICAgIDI0NSwxMTcsIDE0LDExNywgNDQsMTE3LCA2OSwxMTcsMTc1LDExNywxODksMTE4LCA1NiwxMTgsIDg1LCA5OCwKKyAgICAgIDIsMTE2LCA1MywxMTYsIDcwLDIyNSwyNDMsMjMyLDIzNSwyMzMsMjQyLDIyNywyNDksMjQyLDIzMywyMzYsCisgICAgMjM2LDIzMywgOTksMTI4LCAgNCwxNjEsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNDksIDk5LAorICAgICAgMiwxMTYsIDg1LDExNiwgOTEsMjQ1LDI0NCwxMDEsMTI4LCAzMCwgNDksMjQ5LDI0MiwyMzMsMjM2LDIzNiwKKyAgICAyMzMsIDk5LDEyOCwgIDQsIDU4LDIyOCwxMDEsICAyLDExNiwxMDgsMTE2LDEyNiwyNDMsMjI3LDIyOSwyMzgsCisgICAgMjI4LDIyOSwyNDIsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE1NSwyNDYsIDk3LAorICAgIDEyOCwgIDksIDIxLDEwMiwxMzUsICA1LDIxOSwxMTYsMTQ5LDExNiwxNTgsMTE2LDE3OCwxMTYsMTkyLDExNiwKKyAgICAyMDEsMTE2LDIxNywxMTYsMjMyLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDY3LDIyOCwyMjUsCisgICAgMjMxLDIyOSwyNDMsMTA0LDEyOSwyNTEsIDU5LDExNiwxNjksMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAorICAgIDI1MSwgNTksMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIxOCwKKyAgICAyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIxOSwyMzMsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsCisgICAgMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMTksMjM3LDIyOSwyMjgsMjMzLDIyNSwyMzYsMjI1LAorICAgIDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMjAsMjQyLDIyNSwyMzAsMjI5LDIzMiwyMjksMjI2LDI0MiwKKyAgICAyMjksMTE5LDEyOCwyNTEsIDc3LDIzMSwxMTcsICAyLDExNiwyNTIsMTE3LCAgNSwyMzQsMjI1LDI0MiwyMjUsCisgICAgMjQ0LDEwNSwxMjgsIDEwLDE0OSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAyMSwxMDQsICAyLAorICAgIDExNywgMjAsMTE3LCAzMCwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgNzUsMjM5LDIzOSwKKyAgICAyMzUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE5NiwyMzUsMjI1LDI0NCwyMjUsCisgICAgMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMTcxLDExNywgNTcsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LAorICAgIDI0NCwxMDQsMTI4LDI1NSwxMTgsMTEyLCAgMiwxMTcsIDc1LDExNywgOTYsMjQwLCA5NywxMjksICAzLDE4NiwKKyAgICAxMTcsIDgyLDI0MywyNDksMjM3LDIyNiwyMzksMjM2LDIzMSwyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywyNDAsCisgICAgMjQ5LDIyOSwyMzksMjQ1LDExMCwgIDMsMTE3LDEwOCwxMTcsMTIyLDExNywxNTYsMjM3LDIzMywyMjksMjQ1LAorICAgIDIzNywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDExMywxMTIsICAyLDExNywxMjgsMTE3LDE0MywKKyAgICAyMzIsMjMzLDIyOSwyNDUsMjQwLDIzMiwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDEzMiwyMzMsCisgICAgMjI5LDI0NSwyNDAsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMjAsMjQzLDI0MywyMjUsMjM4LAorICAgIDIzMSwyNDAsMjMzLDIyOSwyNDUsMjQwLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTIxLDI0MiwKKyAgICAyMzksMjQyLDIzMywyMzMsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgMTMsMTE1LCAgNSwxMTcsCisgICAgMjAxLDExNywyNDUsMTE4LCAgNCwxMTgsIDEyLDExOCwgNDAsMjMyLDIzMywyMjgsMjI1LDIyNSwyNDUsMjQ0LAorICAgIDExMSwgIDIsMTE3LDIxNCwxMTcsMjIzLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDY0LDIzOCwKKyAgICAyMzksMjQzLDIzMywyMjgsMjI5LDIyNiwyMjksMjI1LDI0MiwyMzMsMjM4LDIzMSwyMjUsMjQyLDIyNSwyMjYsCisgICAgMjMzLCA5OSwxMjgsICA2LCA2NCwyMzcsMjI1LDIzNiwyMzYsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LAorICAgICA5NywxMjgsIDQ4LDI0NSwyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTMyLDI0MiwgOTcsICAyLDExOCwKKyAgICAgMTksMTE4LCAyOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA4MCwyNDQsMjI1LDIzOCwyMjUsCisgICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA3NywyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNywyNDksMjQyLAorICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNTksMjQ0LDIyNSwyMzIsMjMzLDI0MiwyMjUsMjQwLDI0MiwKKyAgICAyMzksMjM2LDIzOSwyMzgsMjMxLDIzNywyMjUsMjQyLDIzNSwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsCisgICAgMjQ0LDEwNCwxMjgsMjU1LDExMiwyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMjM2LDI0MywyNDQsMjQyLAorICAgIDIzOSwyMzUsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNTcsMjI2LDIzOSwKKyAgICAyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAxNCwgOTksICA0LDExOCwxMzEsMTE4LDE1MywxMTgsCisgICAgMTYyLDExOCwxNzAsIDk3LCAgMiwxMTgsMTM3LDExOCwxNDcsMjM2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLAorICAgIDEyOCwgNTEsMTM3LDI0MiwyMzksMTEwLDEyOCwgIDEsMjMzLDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwKKyAgICAgIDEsIDU1LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwyMTgsMjM5LDIzNywyMzcsMjI1LDIyNSwyMjcsCisgICAgMjI3LDIyOSwyMzgsMTE2LDEyOCwgIDEsIDU1LDIyOCwyMzksMjQ0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LAorICAgICAzMCwgNTEsMTAxLCAgNCwxMTgsMjA0LDExOCwyMzEsMTE5LCAgMCwxMTksIDEyLDEwNCwgIDIsMTE4LDIxMCwKKyAgICAxMTgsMjIxLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMzIsMjMzLDI0MiwyMjUsCisgICAgMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDgxLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LAorICAgICA0OCwxNzcsMTE4LDI0NCwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEyMSwKKyAgICAyMzgsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDExMSwyNDMsMjM3LDIyNSwyMzYsCisgICAgMjM2LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyNDYsMjMxLDI0MiwyMjksMjI5LAorICAgIDIzOCwyMzYsMjI1LDIzOCwyMjgsMjMzLCA5OSwxMjgsICAxLCA1NiwxMDQsICA2LDExOSwgNTYsMTE5LDE4NSwKKyAgICAxMTksMTk2LDExOSwyMjEsMTIwLCA1MiwxMjAsMTQwLCA5NywgIDUsMTE5LCA2OCwxMTksIDc4LDExOSwgODksCisgICAgMTE5LCA5NiwxMTksMTIxLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE1MCwyMjcsMjQ5LAorICAgIDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDY5LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAyMiwKKyAgICAyMzEsMTE3LCAgMiwxMTksMTAzLDExOSwxMTIsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNTAsCisgICAgMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMjIsMTA0LCAgNCwxMTksMTMxLDExOSwxNDAsMTE5LAorICAgIDE1NCwxMTksMTcwLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDQ2LDIzMCwyMzMsMjM4LDIyNSwKKyAgICAyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxNjYsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsCisgICAgMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTY3LDIzNywyMjksMjI4LDIzMywyMjUsMjM2LAorICAgIDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTY4LDIyOSwyMzMsMjI3LDIzOSwyNDAsMjQ0LDIzMywKKyAgICAgOTksMTI4LCAgMywyMzEsMjMyLCA5NywgIDIsMTE5LDIwMywxMTksMjEwLDIyOCwyMjksMjQ2LCA5NywxMjgsCisgICAgICA5LCA4OSwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDg5LDIzMywyMjksMjQ1LAorICAgIDIzNSwxMDQsICA0LDExOSwyMzUsMTIwLCAxNCwxMjAsIDI5LDEyMCwgMzgsIDk3LCAgMiwxMTksMjQxLDEyMCwKKyAgICAgIDAsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMjAsCisgICAgMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAyNCwyMjcsMjMzLAorICAgIDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLDEwNiwyMzUsMjM5LDI0MiwKKyAgICAyMjksMjI1LDExMCwxMjgsIDQ5LCA3NSwyNDAsMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsCisgICAgMTEwLDEyOCwgNTAsIDEwLDExMSwgIDQsMTIwLCA2MiwxMjAsMTExLDEyMCwxMjEsMTIwLDEyNiwyMzUsMTA0LAorICAgICAgNCwxMjAsIDczLDEyMCwgODIsMTIwLCA5MSwxMjAsMTAxLDIyNSwyMzMsMjQ0LDIzMiwyMjUsMTA1LDEyOCwKKyAgICAgMTQsICAyLDIzOSwyMzgsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsICA1LDI0NSwyMjUsMjQ0LDI0NCwyMzIsCisgICAgMjI1LDEwNSwxMjgsIDE0LCAgMywyNDcsMjI1LDIzMywyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgIDQsMjM3LAorICAgIDI0NSwyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDkxLDIzOSwxMDcsMTI4LCAgMSwxNTMsMjQyLDIyNSwKKyAgICAyMzUsMjMyLDIyNSwyMzgsMjMxLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAgNiwyNTAsMjQzLDI0MSwyNDUsCisgICAgMjI1LDI0MiwxMDEsMTI4LCA1MSwxNDUsMTA1LCAgNCwxMjAsMTYwLDEyMCwxNzEsMTIwLDE5NiwxMjAsMjQ1LAorICAgIDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgNzcsMjM1LDIyNSwyNDQsMjI1LDIzNSwKKyAgICAyMjUsMjM4LCA5NywxMjksIDQ4LDE3MywxMjAsMTg0LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsCisgICAgMTA0LDEyOCwyNTUsMTE5LDI0MiwxMTEsICAzLDEyMCwyMDUsMTIwLDIyMCwxMjAsMjM2LDIzMSwyNDUsMjQyLAorICAgIDIyNSwyMzcsMjQ1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDIxLDIzNywyMjksMjI5LDI0NCwKKyAgICAyMzksMjQyLDI0NSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCAyMiwyNDMsMjQxLDI0NSwyMjUsCisgICAgMjQyLDEwMSwxMjgsIDUxLCAyMCwyNDksMjI5LDIzOSwxMDcsICA1LDEyMSwgIDQsMTIxLCAzOSwxMjEsIDU0LAorICAgIDEyMSwgNjMsMTIxLCA3NywgOTcsICAyLDEyMSwgMTAsMTIxLCAyNSwyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwKKyAgICAyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLDExMCwyNDAsMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksCisgICAgMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsIDE0LDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLAorICAgIDIyOSwyMjUsMTEwLDEyOCwgNTAsIDk2LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDQ5LDI0MCwKKyAgICAyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgIDAsMjQzLDIzMywyMzksCisgICAgMjQzLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDUxLDIzNCwyMjksMjI3LDI0OSwyNDIsMjMzLAorICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA5MiwxMDgsICAyLDEyMSwxMDksMTIxLDEyMCwyMzMsMjM4LDIyOSwKKyAgICAyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDUzLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsCisgICAgMTUyLDEwOSwgIDMsMTIxLDEzNywxMjEsMTUxLDEyMSwxNjIsMjI3LDI0NSwyMjYsMjI5LDIyOCwyNDMsMjQxLAorICAgIDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE2NiwyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwKKyAgICAyNTUsIDc1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMjI5LDIyOCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsCisgICAgIDUxLDE2MiwxMTEsICA1LDEyMSwxOTAsMTIxLDIxNiwxMjEsMjU0LDEyMiwgMTAsMTIyLCAyNCwxMDQsICAyLAorICAgIDEyMSwxOTYsMTIxLDIwNiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgODMsMjM3LDI0MywKKyAgICAyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTkyLDIzNSwgOTcsICAyLDEyMSwyMjMsMTIxLDIzMSwyMzMsCisgICAgMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsICAxLDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMTc5LAorICAgIDEyMSwyNDIsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMjIsMjM5LDI0MCwKKyAgICAyMzksMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgMzAsMjQwLDI0MCwyMjUsMjI3LDI0OSwyNDIsCisgICAgMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDEyOSwxMTQsICAyLDEyMiwgMzAsMTIyLCA1MCwyMjksMjI1LAorICAgIDIzOCwyNDMsMjQ0LDIyNSwyMzgsMjI4LDIyNSwyNDIsMjI4LDI0MywyNDksMjM3LDIyNiwyMzksMTA4LDEyOCwKKyAgICAgNTAsMTI3LDIzOSwyMzgsMjMzLDI0MywyMjcsMjM3LCA5OCwxMjgsICAzLCA2NywyNDAsIDk3LCAgMiwxMjIsCisgICAgIDY3LDEyMiwgNzMsMjQyLDIyOSwxMTAsMTI4LCAzNiwxNjYsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LAorICAgICA1MSwxNzAsMjQzLDIzMywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTExLDExNiwKKyAgICAgIDIsMTIyLDEwMSwxMjIsMTEwLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMjA3LDI0NSwyNDIsCisgICAgMjM4LDIyOSwxMDAsMTI4LCAgMiwxNTgsMTE3LCAgMiwxMjIsMTI0LDEyMiwxMzUsMjMyLDIzMywyNDIsMjI1LAorICAgIDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LCA3OSwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwKKyAgICAgNDgsMTc1LDEyMiwxNDgsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMjAsCisgICAgMjQ2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTg0LDI0NywyNDMsMjQxLDI0NSwyMjUsMjQyLAorICAgIDEwMSwxMjgsIDUxLDE5MCwxMDgsMTQ2LCAgMCwxMDgsMTIyLDIyMCwxMjQsMjQ3LDEyNSwgMjAsMTI1LCA4NiwKKyAgICAxMjUsMTI0LDEyNiwgMjAsMTI2LCAyOSwxMjYsIDQ1LDEyNiwgNjksMTI2LCA4NywxMjYsMjA1LDEyNiwyNDYsCisgICAgMTI3LDEyNSwxMjcsMTMzLDEyNywxNjYsMTI3LDE3NSwxMjcsMTgzLDEyNywyNDUsIDk3LCAgNywxMjIsMjM2LAorICAgIDEyMiwyNDYsMTIyLDI1MywxMjMsICA0LDEyMywgMjksMTIzLCA0NSwxMjQsMjM1LDIyNiwyMjksMjM4LDIzMSwKKyAgICAyMjUsMjM2LDEwNSwxMjgsICA5LDE3OCwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMSwgNTgsMjI4LDIyOSwyNDYsCisgICAgIDk3LDEyOCwgIDksIDUwLDIzMSwxMTcsICAyLDEyMywgMTEsMTIzLCAyMCwyMzQsMjI1LDI0MiwyMjUsMjQ0LAorICAgIDEwNSwxMjgsIDEwLDE3OCwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA1MCwyMzUsMjM1LDIzMiwKKyAgICAyMjUsMjM4LDIzMSwyNDksMjI1LDIzOSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNjksMTA5LCAxMCwxMjMsCisgICAgIDY3LDEyNCwgIDYsMTI0LCAyMywxMjQsIDYxLDEyNCwgNzUsMTI0LCA5NCwxMjQsMTEwLDEyNCwxMzAsMTI0LAorICAgIDE1MCwxMjQsMTczLCA5NywgIDIsMTIzLCA3MywxMjMsMjU0LDIzNiwyMjksMTAyLCAgNCwxMjMsIDg1LDEyMywKKyAgICAgOTksMTIzLDE5MSwxMjMsMjA4LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksCisgICAgMTI4LDI1NCwyNTIsMjMyLDIyNSwyMzcsMjUwLCA5NywgIDIsMTIzLDEwOSwxMjMsMTUwLDIyNSwyMjYsMjM5LAorICAgIDI0NiwxMDEsICAyLDEyMywxMTksMTIzLDEzMywyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwKKyAgICAyMzMsIDk5LDEyOCwyNTQsMjQ4LDIzMywyNDMsMjM5LDIzNiwyMjUsMjQ0LDIyOSwyMjgsMjI1LDI0MiwyMjUsCisgICAgMjI2LDIzMywgOTksMTI4LDI1NCwyNDcsMjI2LDIyOSwyMzYsMjM5LDExOSwgIDIsMTIzLDE2MCwxMjMsMTc0LAorICAgIDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyNTAsMjMzLDI0MywKKyAgICAyMzksMjM2LDIyNSwyNDQsMjI5LDIyOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDI0OSwyMzMsCisgICAgMjQzLDIzOSwyMzYsMjI1LDI0NCwyMjksMjI4LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjUxLAorICAgIDIzNywyMjUsMjI4LDIyOCwyMjUsMjI1LDIyNiwyMzksMjQ2LDEwMSwgIDIsMTIzLDIyMywxMjMsMjM3LDIzMCwKKyAgICAyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyNDYsMjMzLDI0MywyMzksCisgICAgMjM2LDIyNSwyNDQsMjI5LDIyOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDI0NSwyNDIsMjI1LAorICAgIDIyNiwyMzMsIDk5LDEyOCwgIDYsIDY4LDIyNiwyMjgsIDk3LDEyOSwgIDMsMTg3LDEyNCwgMTQsMjQzLDI0NCwKKyAgICAyNDIsMjM5LDIzNSwxMDEsMTI4LCAgMSwxNTUsMjI5LDEwMCwxMzAsICA1LDIyMCwxMjQsIDMyLDEyNCwgNTIsCisgICAgMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwgNjAsMTI0LCA0MywyMzIsMjI5LDIyNiwyNDIsMjI5LAorICAgIDExOSwxMjgsMjUxLCA2MCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIyMCwyMzAsMjMzLDIzOCwKKyAgICAyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjIyLDIzMiwyMjUsMjMyLDIzMywyMzgsCisgICAgMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLDIwMiwyMzMsMjM4LAorICAgIDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMjMsMjM0LDIyOSwKKyAgICAyMjksMjM3LDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCisgICAgMjUyLDIwMSwyMzUsMjMyLDIyNSwyMzIsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LAorICAgIDIyNiwyMzMsIDk5LDEyOCwyNTIsMjAzLDIzNiwyMjUsMjM3LDIzMiwyMjksMjMyLDIzMywyNDMsMjM5LDIzNiwKKyAgICAyMjUsMjQ0LDIyOSwyMjgsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MywyNDIsMjM3LDEwMSwgIDIsCisgICAgMTI0LDE4MCwxMjQsMTkzLDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LAorICAgIDIyNCwyMjksMTA5LCAgMiwxMjQsMjAwLDEyNCwyMTksMjMyLDIyNSwyMzIsMjMzLDIzOCwyMzMsMjQ0LDIzMywKKyAgICAyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTMsMTM2LDIzMywyMzgsMjMzLDI0NCwyMzMsCisgICAgMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLDIwNCwyNDIsMjMxLDIyOSwyMjcsMjMzLAorICAgIDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM3LDIzOSwgOTgsICAzLDEyNCwyNTUsMTI1LCAgNCwxMjUsIDEwLDIyNSwKKyAgICAxMTQsMTI4LCAgMSwxNTQsMjI5LDIzNiwxMTYsMTI4LCAgMiwxMDgsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsCisgICAgMTExLDEyOCwgNDksIDEyLCA5OSwgIDQsMTI1LCAzMCwxMjUsIDM3LDEyNSwgNDYsMTI1LCA3MywyMjUsMjQyLAorICAgIDIzOSwxMTAsMTI4LCAgMSwgNjIsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI4LCAgMSwgNjAsMjMzLDI0MiwKKyAgICAgOTksICAyLDEyNSwgNTQsMTI1LCA1OSwyMzYsMTAxLDEyOCwgMzYsMjE5LDI0NSwyMzcsMjMwLDIzNiwyMjksCisgICAgMjQ4LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgNjEsMjM5LDIzNywyMzcsMjI1LDIyNSwyMjcsMjI3LAorICAgIDIyOSwyMzgsMTE2LDEyOCwgIDEsIDYwLDIyOCwyMzksMTE2LDEzMCwgIDEsIDY0LDEyNSwgOTYsMTI1LDEwNSwKKyAgICAyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsICAxLCA2NCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOSwgMzAsCisgICAgIDU1LDEyNSwxMTUsMjM3LDIyNSwyMjcsMjQyLDIzOSwxMTAsMTI4LCAzMCwgNTcsMTAxLCAgMywxMjUsMTMyLAorICAgIDEyNSwxNzAsMTI2LCAxNSwyMzAsMTE2LCAgMiwxMjUsMTM5LDEyNSwxNTUsMjI1LDIzOCwyMzEsMjM2LDIyOSwKKyAgICAyMjUsMjI2LDIzOSwyNDYsMjI5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDI2LDI0NCwyMjUsMjI3LDIzNSwyMjYsCisgICAgMjI5LDIzNiwyMzksMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDI0LDI0MywxMTUsMTMyLCAgMCwgNjAsMTI1LAorICAgIDE4MywxMjUsMjA1LDEyNSwyMTcsMTI2LCAgNywyMjksMjQxLDI0NSwyMjUsMTA4LDEyOSwgMzQsMTAwLDEyNSwKKyAgICAxOTMsMjM5LDI0MiwyMzEsMjQyLDIyOSwyMjUsMjQ0LDIyOSwxMTQsMTI4LCAzNCwyMTgsMjM3LDIzOSwyMzgsCisgICAgMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMjgsMTExLCAgMiwxMjUsMjIzLDEyNSwyNTIsMTE0LAorICAgICAgMiwxMjUsMjI5LDEyNSwyNDIsMjI5LDI0MSwyNDUsMjMzLDI0NiwyMjUsMjM2LDIyOSwyMzgsMTE2LDEyOCwKKyAgICAgMzQsMTE0LDIzMSwyNDIsMjI5LDIyNSwyNDQsMjI5LDExNCwxMjgsIDM0LDExOCwyNDYsMjI5LDI0MiwyMjksCisgICAgMjQxLDI0NSwyMjUsMTA4LDEyOCwgMzQsMTAyLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI1NCwxMDAsMjUwLAorICAgIDEwNCwxMjgsICAyLDExMCwyMzAsMjI2LDIzNiwyMzksMjI3LDEwNywxMjgsIDM3LDE0MCwyMzIsMjM5LDIzOSwKKyAgICAyMzUsMjQyLDIyOSwyNDQsMjQyLDIzOSwyMzAsMjM2LDIyOSwxMjAsMTI4LCAgMiwxMDksMTA1LCAgMiwxMjYsCisgICAgIDUxLDEyNiwgNTYsMjQyLCA5NywxMjgsIDMyLDE2NCwyNDcsMjM4LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLAorICAgIDIyNSwxMTAsMTI4LCAgNSwxMDgsMTA2LDEyOSwgIDEsMjAxLDEyNiwgNzUsMjI5LDIyNywyNDksMjQyLDIzMywKKyAgICAyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgODksMTA4LDEzMiwyNDYsMTkyLDEyNiwgOTksMTI2LDEyMywxMjYsCisgICAgMTM0LDEyNiwxNDMsIDk3LCAgMiwxMjYsMTA1LDEyNiwxMTIsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDUxLAorICAgIDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNzksMjMzLDIzOCwyMjksMjI2LDIyOSwKKyAgICAyMzYsMjM5LDExOSwxMjgsIDMwLCA1OSwyMzYsMjI1LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA1MiwyNDYsCisgICAgMjM5LDIyNywyMjUsMjM2LDIzMywgOTksICAzLDEyNiwxNTcsMTI2LDE2NywxMjYsMTc0LDIyNiwyMjksMjM4LAorICAgIDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIyNSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgOTcsMjQ2LDIzOSwKKyAgICAyNDcsMjI5LDIzNiwyNDMsMjMzLDIzMSwxMTAsICAyLDEyNiwxODgsMTI2LDE5OCwyMjYsMjI5LDIzOCwyMzEsCisgICAgMjI1LDIzNiwxMDUsMTI4LCAgOSwyMjcsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDk5LDEwOSwgIDMsMTI2LAorICAgIDIxMywxMjYsMjI2LDEyNiwyMzcsMjMzLDIyOCwyMjgsMjM2LDIyOSwyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwKKyAgICAgIDIsMTA3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNzYsMjQzLDI0MSwyNDUsCisgICAgMjI1LDI0MiwxMDEsMTI4LCA1MSwyMDgsMTExLCAgNiwxMjcsICA0LDEyNywgMTYsMTI3LCA1OCwxMjcsIDY5LAorICAgIDEyNywgNzUsMTI3LDExNywyMjcsMjMyLDI0NSwyMzYsMjI1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA0NCwKKyAgICAyMzEsMjMzLDIyNywyMjUsMTA4LCAgMywxMjcsIDI4LDEyNywgMzQsMTI3LCA1MywyMjUsMjM4LDEwMCwxMjgsCisgICAgIDM0LCAzOSwyMzgsMjM5LDExNiwxMjksICAwLDE3MiwxMjcsIDQyLDI0MiwyMjksMjQ2LDIyOSwyNDIsMjQzLAorICAgIDIyOSwxMDAsMTI4LCAzNSwgMTYsMjM5LDExNCwxMjgsIDM0LCA0MCwyMzYsMjMzLDIzOCwyMzEsMjQ0LDIzMiwKKyAgICAyMjUsMTA1LDEyOCwgMTQsIDM3LDIzOCwyMzEsMTE1LDEyOCwgIDEsMTI3LDI0NywyMzYsMjMzLDIzOCwxMDEsCisgICAgICAyLDEyNywgODUsMTI3LDEwOCwgOTksICAyLDEyNywgOTEsMTI3LDEwMywyMjksMjM4LDI0NCwyMjksMjQyLAorICAgIDIzNiwyMzMsMjM4LDEwMSwxMjgsMjU0LCA3OCwyMzcsIDk4LDEyOCwgIDMsIDUwLDIyOCwyMjUsMjQzLDIzMiwKKyAgICAyMjksMTAwLDEyOCwyNTQsIDc3LDI1MCwyMjksMjM4LDIzMSwxMDEsMTI4LCAzNywyMDIsMjQwLDIyNSwyNDIsCisgICAgMjI5LDExMCwxMjgsIDM2LDE2NywxMTUsICAzLDEyNywxNDEsMTI3LDE0OCwxMjcsMTU2LDIzNiwyMjUsMjQzLAorICAgIDEwNCwxMjgsICAxLCA2NiwyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgMzMsIDE5LDI0NSwyNDAsMjI5LDI0MiwKKyAgICAyMzMsMjM5LDExNCwxMjgsMjQ2LDIzOCwyNDQsMjQzLDIzMiwyMjUsMjI4LDEwMSwxMjgsIDM3LDE0NSwyNDUsCisgICAgMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDM4LDI0NiwyMzksMjI3LDIyNSwyMzYsMjMzLCA5OSwgIDMsMTI3LAorICAgIDE5NywxMjcsMjA3LDEyNywyMTQsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTQwLDIyOCwKKyAgICAyMjksMjQ2LCA5NywxMjgsICA5LCAxMiwyNDYsMjM5LDI0NywyMjksMjM2LDI0MywyMzMsMjMxLDExMCwgIDIsCisgICAgMTI3LDIyOCwxMjcsMjM4LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIyNiwyMjgsMjI5LAorICAgIDI0NiwgOTcsMTI4LCAgOSwgOTgsMjQ4LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMjExLDEwOSwKKyAgICAxNDQsICAwLDEwOSwxMjgsIDM1LDEzMCwxNDQsMTMwLDE2OSwxMzAsMTk2LDEzMCwyMjEsMTMyLCAxOCwxMzIsCisgICAgIDQwLDEzMywgOTUsMTMzLDEyNSwxMzMsMTc0LDEzNCwgMjUsMTM0LCA0NywxMzQsIDcyLDEzNCwgODEsMTM1LAorICAgIDEwOCwxMzUsMTM2LCA5NywgMTIsMTI4LCA2MSwxMjgsIDcxLDEyOCwxMzUsMTI4LDE0MiwxMjgsMTY3LDEyOCwKKyAgICAyMTUsMTMwLCA1MSwxMzAsIDc2LDEzMCwgODEsMTMwLCA5NSwxMzAsMTA3LDEzMCwxMTIsMjI2LDIyOSwyMzgsCisgICAgMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTc0LCA5OSwgIDIsMTI4LCA3NywxMjgsMTI5LDI0MiwyMzksMTEwLAorICAgIDEzMiwgIDAsMTc1LDEyOCwgOTEsMTI4LDEwMiwxMjgsMTA4LDEyOCwxMTcsMjI2LDIyOSwyMzYsMjM5LDI0NywKKyAgICAyMjcsMjM3LCA5OCwxMjgsICAzLCA0OSwyMjcsMjM3LCA5OCwxMjgsICAzLCAgNCwyMzYsMjM5LDI0NywyMzcsCisgICAgMjM5LDEwMCwxMjgsICAyLDIwNSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LAorICAgIDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLCA2MywyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNDYsMjMxLDExNywKKyAgICAgIDIsMTI4LDE0OSwxMjgsMTU4LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTc0LDI0MiwyMzcsCisgICAgMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDQ2LDEwNCwgIDIsMTI4LDE3MywxMjgsMjA1LDIyNSwyNDAsMjI1LAorICAgIDIzNSwxMDQsICAyLDEyOCwxODMsMTI4LDE5MiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE2NCwKKyAgICAyMzYsMjI5LDIzMCwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNjQsMjMzLDI0MiwyMjUsCisgICAgMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTI2LDEwNSwgIDUsMTI4LDIyNywxMjksIDQwLDEyOSwxMDMsMTI5LAorICAgIDEzMywxMzAsIDM5LDIyNywyMzIsMjI1LDI0NCwyNDQsMjI1LDI0NywgOTcsICAzLDEyOCwyNDIsMTI5LCAxNywKKyAgICAxMjksIDI0LDIzNiwyMzksMTE5LCAgMiwxMjgsMjUwLDEyOSwgIDUsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsCisgICAgMjI1LDEwNSwxMjgsMjQ4LDE0OSwyNDIsMjMzLDIzMSwyMzIsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LAorICAgIDE0OCwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNzUsMjQ1LDI0MCwyNDAsMjI5LDI0MiwyMzYsMjI5LDIzMCwKKyAgICAyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwyNDgsMTQ3LDIyOSwxMDcsICAzLDEyOSwgNDksMTI5LCA4MCwxMjksCisgICAgIDg3LDIzNiwyMzksMTE5LCAgMiwxMjksIDU3LDEyOSwgNjgsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LAorICAgIDEwNSwxMjgsMjQ4LDE0MCwyNDIsMjMzLDIzMSwyMzIsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDEzOSwKKyAgICAyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNzIsMjQ1LDI0MCwyNDAsMjI5LDI0MiwyMzYsMjI5LDIzMCwyNDQsCisgICAgMjQ0LDIzMiwyMjUsMTA1LDEyOCwyNDgsMTM4LDIzMiwyMjUsMjM4LDIyNSwyMzUsMjI1LDExNiwgIDIsMTI5LAorICAgIDExNSwxMjksMTI2LDIzNiwyMjksMjMwLDI0NCwyNDQsMjMyLDIyNSwxMDUsMTI4LDI0OCwxMzIsMjQ0LDIzMiwKKyAgICAyMjUsMTA1LDEyOCwgMTQsIDQ5LDExNiwgIDMsMTI5LDE0MSwxMjksMTY5LDEyOSwyMzIsMjI1LDIzMywyMzUsCisgICAgMjMyLDExNywgIDIsMTI5LDE1MSwxMjksMTYyLDIzNiwyMjksMjMwLDI0NCwyNDQsMjMyLDIyNSwxMDUsMTI4LAorICAgIDI0OCwxMzcsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDcxLDIzMiwxMTEsICAzLDEyOSwxNzgsMTI5LDIwOSwKKyAgICAxMjksMjE2LDIzNiwyMzksMTE5LCAgMiwxMjksMTg2LDEyOSwxOTcsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsCisgICAgMjI1LDEwNSwxMjgsMjQ4LDE0MywyNDIsMjMzLDIzMSwyMzIsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LAorICAgIDE0MiwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNzMsMjQ1LDI0MCwyNDAsMjI5LDI0MiwyMzYsMjI5LDIzMCwKKyAgICAyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwyNDgsMTQxLDI0MiwxMDUsICAzLDEyOSwyNDEsMTMwLCAxNiwxMzAsCisgICAgIDIzLDIzNiwyMzksMTE5LCAgMiwxMjksMjQ5LDEzMCwgIDQsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LAorICAgIDEwNSwxMjgsMjQ4LDE0NiwyNDIsMjMzLDIzMSwyMzIsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDE0NSwKKyAgICAyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNzQsMjQ1LDI0MCwyNDAsMjI5LDI0MiwyMzYsMjI5LDIzMCwyNDQsCisgICAgMjQ0LDIzMiwyMjUsMTA1LDEyOCwyNDgsMTQ0LDI0OSwyMjUsMjM3LDIzOSwyMzUsMjQ0LDIzMiwyMjUsMTA1LAorICAgIDEyOCwgMTQsIDcwLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyMjIsMTMwLCA2NCwKKyAgICAyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDE0MywyMzYsMTAxLDEyOCwgMzgsCisgICAgIDY2LDIzOCwyNDMsMjQ5LDIzOSwyMzgsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgNzEsMjQxLAorICAgIDIyNSwyMzAsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxOTAsMjQyLDExNSwxMjgsIDM4LCA2NiwKKyAgICAxMTUsICAyLDEzMCwxMTgsMTMwLDEzNiwyMzksMjQyLDIyNSwyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzIsCisgICAgMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3NSwyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTMxLAorICAgICA5OCwgIDIsMTMwLDE1MCwxMzAsMTYwLDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAgNywKKyAgICAyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDIxMiwgOTksICAyLDEzMCwxNzUsMTMwLDE4MywyMzMsCisgICAgMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMjIwLDI0NSwyMjYsMjI5LDIyOCwyNDMsMjQxLDI0NSwyMjUsMjQyLAorICAgIDEwMSwxMjgsIDUxLDE2NSwyMjgsMjM5LDExNiwgIDIsMTMwLDIwNCwxMzAsMjEzLDIyNSwyMjcsMjI3LDIyOSwKKyAgICAyMzgsMTE2LDEyOCwgMzAsIDY1LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgNjcsMTAxLCAgNywxMzAsCisgICAgMjM3LDEzMSwxMDgsMTMxLDExOSwxMzEsMTM0LDEzMSwxNTksMTMxLDE5NiwxMzEsMjA4LDEwMSwgIDIsMTMwLAorICAgIDI0MywxMzEsIDk1LDEwOSwgIDQsMTMwLDI1MywxMzEsICA2LDEzMSwgMjAsMTMxLCAzNiwyMjUsMjQyLDIyNSwKKyAgICAyMjYsMjMzLCA5OSwxMjgsICA2LCA2OSwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsCisgICAgIDk5LDEyOCwyNTQsMjI2LDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLAorICAgICA5OSwxMjgsMjU0LDIyNywyMzcsMTAxLCAgMiwxMzEsIDQzLDEzMSwgNTYsMjI4LDIzMywyMjUsMjM2LDIyNSwKKyAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjI4LDIyOSwyMzcsMTA1LCAgMiwxMzEsIDY0LDEzMSwgNzksCisgICAgMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwyMDksMjQzLAorICAgIDIzOSwyMzYsMjI1LDI0NCwyMjksMjI4LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsIDcyLDI0NCwKKyAgICAyMzksMjQyLDI0NSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCA3NywyMzIsMjMzLDI0MiwyMjUsCisgICAgMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTI5LDIzMywyNTAsMjMzLDIyOSwyNDIsMjI1LDI0MywyNDEsMjQ1LAorICAgIDIyNSwyNDIsMTAxLDEyOCwgNTEsMTI2LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwKKyAgICAyMjUsMTMxLDE0NywyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDE0NiwxMDksCisgICAgMTMwLCAgNSwyMjIsMTMxLDE2NywxMzEsMTg3LDIyOCwyMjUsMjMxLDIyOSwyNDMsMTA0LDEyOSwyNTEsIDYyLAorICAgIDEzMSwxNzgsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LDI1MSwgNjIsMjMyLDIyOSwyMjYsMjQyLDIyOSwKKyAgICAxMTksMTI4LCAgNSwyMjIsMjM4LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMTYsCisgICAgMjQyLDIzNSwyMzIsIDk3LCAgMywxMzEsMjE5LDEzMSwyMjgsMTMyLCAgNSwyMzIsMjI5LDIyNiwyNDIsMjI5LAorICAgIDExOSwxMjgsICA1LDE2NSwyMzUsMjI5LDIzMCwyNDUsMjM2LCA5NywgIDIsMTMxLDIzOSwxMzEsMjQ4LDIzMiwKKyAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTY2LDIzNiwyMjksMjMwLDI0NCwyMzIsMjI5LDIyNiwyNDIsCisgICAgMjI5LDExOSwxMjgsICA1LDE2NiwyMzYsMjI5LDIzMCwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAorICAgICAgNSwxNjUsMTA0LCAgMiwxMzIsIDI0LDEzMiwgMzAsMjM5LDIzOSwxMDcsMTI4LCAgMiwxMTMsMjUwLDI0MywKKyAgICAyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTQ2LDEwNSwgIDYsMTMyLCA1NCwxMzIsIDkxLDEzMiwyMjgsCisgICAgMTMyLDIzOSwxMzMsICA4LDEzMywgNjUsMjI4LDEwMCwgIDIsMTMyLCA2MSwxMzIsIDg2LDIzNiwyMjksMjI4LAorICAgIDIzOSwyNDQsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LDIyNSwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywKKyAgICAyMjgsMjQ0LDEwNCwxMjgsMjU1LDEwMSwyMzksMTE2LDEyOCwgIDAsMTgzLDIyOSwyNDUsMTA5LCAgNSwxMzIsCisgICAgMTA1LDEzMiwxNDAsMTMyLDE1NSwxMzIsMTY0LDEzMiwyMTUsIDk3LCAgMiwxMzIsMTExLDEzMiwxMjYsMjI3LAorICAgIDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMTQsMjQwLDIyNSwKKyAgICAyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAxOCwyMjcsMjMzLDI0MiwyMjcsCisgICAgMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLDEwMCwyMzUsMjM5LDI0MiwyMjksMjI1LAorICAgIDExMCwxMjgsIDQ5LCA2NSwxMTIsICAyLDEzMiwxNzAsMTMyLDIwMiwgOTcsICAyLDEzMiwxNzYsMTMyLDE5MCwKKyAgICAyMzgsMjQzLDIzMywyMzksMjQzLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTEyLDI0MiwyMjksCisgICAgMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsICA0LDIzMywyMjksMjQ1LDI0MCwyMzUsMjM5LAorICAgIDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDExMCwyNDMsMjMzLDIzOSwyNDMsMjM1LDIzOSwyNDIsMjI5LDIyNSwKKyAgICAxMTAsMTI4LCA0OSwxMTEsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEyNywyMzUsCisgICAgMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjIzLDEzMiwyNTIsMjMyLDIyNSwyMzYsMjMwLAorICAgIDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxNDQsMjM4LDExNywgIDIsMTMzLCAxNSwxMzMsIDYwLDExNSwKKyAgICAxMzIsIDM0LCAxOCwxMzMsIDI3LDEzMywgMzgsMTMzLCA0NywxMzMsIDUzLDIyNiwyMjksMjM2LDIzOSwyNDcsCisgICAgMjI3LDIzNywgOTgsMTI4LCAgMywgMzIsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNCwxNTAsMjM3LAorICAgIDIzOSwxMDAsMTI4LCAgMiwyMTUsMjQwLDIzNiwyNDUsMTE1LDEyOCwgMzQsIDE5LDI0NCwxMDEsMTI4LCAzMiwKKyAgICAgNTAsMjQyLDEwNSwgIDIsMTMzLCA3MiwxMzMsIDg2LDIyNiwyMjUsMjI1LDI0MiwyNDUsMjQzLDI0MSwyNDUsCisgICAgMjI1LDI0MiwxMDEsMTI4LCA1MSwgNzQsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgNzMsMTA4LAorICAgICAgMiwxMzMsMTAxLDEzMywxMTYsMjM5LDIzOCwyMzEsMjM2LDIyOSwyMzEsMjQ0LDI0NSwyNDIsMjM4LDIyOSwKKyAgICAxMDAsMTI4LCAgMiwxMTIsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNTAsMTA5LCAgMywxMzMsCisgICAgMTMzLDEzMywxNDcsMTMzLDE1OCwyMjcsMjQ1LDIyNiwyMjksMjI4LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLAorICAgIDEyOCwgNTEsMTYzLDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNzcsMjQzLDI0MSwKKyAgICAyNDUsMjI1LDI0MiwyMjksMjI4LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTU5LDExMSwgIDUsCisgICAgMTMzLDE4NiwxMzMsMjEyLDEzMywyMzcsMTMzLDI0NywxMzQsICAwLDEwNCwgIDIsMTMzLDE5MiwxMzMsMjAyLAorICAgIDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEzMCwyMzcsMjQzLDI0MSwyNDUsMjI1LDI0MiwKKyAgICAxMDEsMTI4LCA1MSwxOTMsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIyNiwxMzMsCisgICAgMjI1LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTQ3LDIzNiwyNDMsMjQxLAorICAgIDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDIxNCwyMzcsMjI1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAzMywKKyAgICAyNDYsMjI5LDI0MiwyNDMsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI5LCA1MSwxNjcsMTM0LCAxNSwyMjgsCisgICAgMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNjgsMjQwLCA5NywgIDIsMTM0LCAzMiwxMzQsIDM4LAorICAgIDI0MiwyMjksMTEwLDEyOCwgMzYsMTY4LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTcxLDExNSwKKyAgICAgIDIsMTM0LCA1MywxMzQsIDYyLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTc5LDI0NSwyNDAsCisgICAgMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDIzOSwyNDQsMjQ1LDI0MiwyMzgsMjI5LDEwMCwxMjgsICAyLAorICAgIDExMSwxMTcsMTQxLCAgMCwxODEsMTM0LDExMSwxMzQsMTE1LDEzNCwxMjUsMTM0LDE0OSwxMzQsMTU5LDEzNCwKKyAgICAxODEsMTM0LDE5MiwxMzQsMjE3LDEzNCwyNDAsMTM0LDI1MCwxMzUsIDI0LDEzNSwgODgsMTM1LCA5OCwgNDksCisgICAgMTI4LCAgMCwxODEsMjI1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTMwLDIyNywxMDQsICAyLAorICAgIDEzNCwxMzIsMTM0LDE0MiwyMzEsMjQyLDIyOSwyMjUsMjQ0LDIyOSwxMTQsMTI4LCAzNCwxMDcsMjM2LDIyOSwKKyAgICAyNDMsMTE1LDEyOCwgMzQsMTA2LDIzMCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE0MCwxMDMsCisgICAgICAyLDEzNCwxNjUsMTM0LDE3MiwyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywxODgsMjQzLDI0MSwyNDUsMjI1LAorICAgIDI0MiwxMDEsMTI4LCA1MSwxNDEsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEyOCwKKyAgICAyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjI0LDEzNCwyMDUsMjMyLDIyNSwyMzYsCisgICAgMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxNDUsMTA4LCAgMiwxMzQsMjIzLDEzNCwyMzIsMjQzLAorICAgIDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNDksMjQ0LDIzMywyNDAsMjM2LDEyMSwxMjgsICAwLDIxNSwKKyAgICAyMzcsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNTUsMjM4LDIyNSwxMDQsICAyLDEzNSwgIDIsCisgICAgMTM1LCAxMSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE2MywyMzYsMjI5LDIzMCwyNDQsMjMyLAorICAgIDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNjMsMTE1LCAgMiwxMzUsIDMwLDEzNSwgNzksMjMzLCA5OSwKKyAgICAgIDMsMTM1LCAzOSwxMzUsIDU2LDEzNSwgNjcsMjI1LDIzNiwyMzgsMjM5LDI0NCwxMDEsMTI5LCAzOCwxMDYsCisgICAgMTM1LCA1MCwyMjgsMjI2LDEwOCwxMjgsIDM4LDEwNywyMzAsMjM2LDIyNSwyNDQsMjQzLDIzMywyMzEsMTEwLAorICAgIDEyOCwgMzgsMTA5LDI0MywyMzIsMjI1LDI0MiwyNDAsMjQzLDIzMywyMzEsMTEwLDEyOCwgMzgsMTExLDI0MywKKyAgICAyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTc4LDI0NiwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsCisgICAgIDUxLDE4MiwyNDcsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxODgsMTE4LCAgMiwxMzUsMTE0LAorICAgIDEzNSwxMjcsMjM3LDIyOSwyMzEsMjI1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTg1LDI0MywKKyAgICAyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTgzLDExOSwgIDIsMTM1LDE0MiwxMzUsMTU1LDIzNywyMjksCisgICAgMjMxLDIyNSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE5MSwyNDMsMjQxLDI0NSwyMjUsMjQyLAorICAgIDEwMSwxMjgsIDUxLDE4OSwxMTAsMTUwLCAgMCwxMTAsMTM1LDIxMiwxMzYsIDkwLDEzNiwxMTQsMTM2LDE4MCwKKyAgICAxMzYsMjA1LDEzNywgIDcsMTM3LCAxNywxMzcsIDg0LDEzNywxMjcsMTM5LDE2MSwxMzksMTc5LDEzOSwyMDQsCisgICAgMTM5LDIzNSwxNDAsICA1LDE0MCwgNzAsMTQyLCA1MiwxNDIsIDYwLDE0MiwgODUsMTQyLCA5MywxNDMsIDYxLAorICAgIDE0MywgNzEsMTQzLCA4MSwgOTcsICA4LDEzNSwyMzAsMTM1LDI1MCwxMzYsICAxLDEzNiwgIDgsMTM2LCAzMywKKyAgICAxMzYsIDQ0LDEzNiwgNjksMTM2LCA4MSwgOTgsICAyLDEzNSwyMzYsMTM1LDI0NSwyMjksMjM4LDIzMSwyMjUsCisgICAgMjM2LDEwNSwxMjgsICA5LDE2OCwyMzYsIDk3LDEyOCwgMzQsICA3LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLAorICAgICA2OCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNDAsMjMxLDExNywgIDIsMTM2LCAxNSwxMzYsIDI0LDIzNCwKKyAgICAyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTY4LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsCisgICAgIDQwLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMDYsMjM1LDIyNSwyNDQsMjI1LAorICAgIDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIwMiwxMzYsIDU3LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwKKyAgICAyNDQsMTA0LDEyOCwyNTUsMTMzLDI0MCwyMzksMjQzLDI0NCwyNDIsMjM5LDI0MCwyMzIsMTAxLDEyOCwgIDEsCisgICAgIDczLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTI5LCA5OCwgIDIsMTM2LCA5NiwxMzYsMTA2LAorICAgIDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAxMSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwKKyAgICAgIDAsMTYwLCA5OSwgIDQsMTM2LDEyNCwxMzYsMTMxLDEzNiwxNDAsMTM2LDE2NywyMjUsMjQyLDIzOSwxMTAsCisgICAgMTI4LCAgMSwgNzIsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI4LCAgMSwgNzAsMjMzLDI0MiwgOTksICAyLAorICAgIDEzNiwxNDgsMTM2LDE1MywyMzYsMTAxLDEyOCwgMzYsMjIxLDI0NSwyMzcsMjMwLDIzNiwyMjksMjQ4LDIyNiwKKyAgICAyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgNzUsMjM5LDIzNywyMzcsMjI1LDIyNSwyMjcsMjI3LDIyOSwyMzgsCisgICAgMTE2LDEyOCwgIDEsIDcwLDIyOCwyMzksMTE2LCAgMiwxMzYsMTg4LDEzNiwxOTcsMjI1LDIyNywyMjcsMjI5LAorICAgIDIzOCwxMTYsMTI4LCAzMCwgNjksMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCA3MSwxMDEsICAzLDEzNiwKKyAgICAyMTMsMTM2LDIyNCwxMzYsMjQ5LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMDksCisgICAgMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIwNSwxMzYsMjM3LDIzMiwyMjUsMjM2LAorICAgIDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTM2LDI0NywyNDMsMjMyLDIyOSwyNDEsMjI5LDIzNiwKKyAgICAyNDMsMjMzLDIzMSwxMTAsMTI4LCAzMiwxNzAsMjMwLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsCisgICAgMTM5LDEwMywgIDIsMTM3LCAyMywxMzcsIDczLCA5NywgIDMsMTM3LCAzMSwxMzcsIDQxLDEzNywgNDgsMjI2LAorICAgIDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTUzLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAyNSwKKyAgICAyMzEsMTE3LCAgMiwxMzcsIDU1LDEzNywgNjQsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNTMsCisgICAgMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMjUsMjM5LDIzOCwyMzEsMjQ1LDI0NCwyMzIsMjI1LAorICAgIDEwNSwxMjgsIDE0LCAgNywxMDQsICAyLDEzNywgOTAsMTM3LDEwMCwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwKKyAgICAgOTcsMTI4LCA0OCwxNDcsMjM5LDIzOSwxMDcsICAyLDEzNywxMDgsMTM3LDExNSwyMzYsMjI5LDIzMCwxMTYsCisgICAgMTI4LCAgMiwxMTQsMjQyLDIyOSwyNDQsMjQyLDIzOSwyMzAsMjM2LDIyOSwxMjAsMTI4LCAgMiwxMTUsMTA1LAorICAgICAgNCwxMzcsMTM3LDEzOCwgNTAsMTM4LCA2MSwxMzgsMTE5LDIyOSwyNDUsMTEwLCAgNywxMzcsMTU1LDEzNywKKyAgICAxOTAsMTM3LDIyMiwxMzcsMjM2LDEzNywyNDUsMTM4LCAyMiwxMzgsIDM1LCA5NywgIDIsMTM3LDE2MSwxMzcsCisgICAgMTc2LDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsMTExLAorICAgIDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgMTUsMjI3LDEwNSwKKyAgICAgIDIsMTM3LDE5NywxMzcsMjA5LDIyOSwyNDUsMjI3LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksCisgICAgIDUzLDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCA5NywyMzIsMjMzLAorICAgIDIyOSwyNDUsMjMyLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDU0LDIzNSwyMzksMjQyLDIyOSwKKyAgICAyMjUsMTEwLDEyOCwgNDksIDUyLDI0MCwgOTcsICAyLDEzNywyNTIsMTM4LCAxMCwyMzgsMjQzLDIzMywyMzksCisgICAgMjQzLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTA0LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLAorICAgIDIyOSwyMjUsMTEwLDEyOCwgNTAsICAxLDI0MywyMzMsMjM5LDI0MywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwKKyAgICAxMjgsIDQ5LDEwMywyNDQsMjMzLDIzNSwyMjksMjQ1LDI0NCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsCisgICAgIDQ5LDEwMiwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTA3LDEwNywgIDIsMTM4LAorICAgICA2NywxMzgsIDkxLDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIwMywxMzgsIDc5LDIzMiwKKyAgICAyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTM0LDIzMiwyMjUsMjMyLDIzMywxMTYsCisgICAgICAyLDEzOCwxMDEsMTM4LDExMiwyMzYsMjI5LDIzMCwyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwyNDgsMTUzLAorICAgIDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA3NywyMzgsMTAxLDE0MSwgIDAsIDU3LDEzOCwxNTAsMTM4LDE1OSwKKyAgICAxMzgsMTY5LDEzOCwxOTksMTM4LDIwNiwxMzgsMjMxLDEzOSwgIDIsMTM5LCAzNiwxMzksIDQ4LDEzOSwgNTksCisgICAgMTM5LCA5MiwxMzksMTAwLDEzOSwxMTEsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxMDUsMjI2LAorICAgIDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjM5LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOSwKKyAgICAgMzYsMTA0LDEzOCwxODAsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDMsMjI5LDI0MywyMjUsMjM4LDI0MywyNDMsCisgICAgMjI5LDI0MiwyMzMsMTAyLDEyOCwgMzksMTQ2LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LDExMSwyMzEsMTE3LAorICAgICAgMiwxMzgsMjEzLDEzOCwyMjIsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwyMzksMjQyLDIzNywKKyAgICAyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwxMTEsMjMyLCA5NywgIDIsMTM4LDIzOCwxMzgsMjQ5LDIyNywyMzUsCisgICAgMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxMDUsMjM4LDIzMSwyNTAsMjMyLDIzOSwxMTcsMTI4LAorICAgICA0OCwgNDEsMTA1LCAgMiwxMzksICA4LDEzOSwgMjYsMjI4LDIyOSwyMzksMjMxLDI0MiwyMjUsMjQwLDIzMiwKKyAgICAyMzMsMjI3LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNDAsMjM4LDIzMCwyMjksMjQyLDIzMywyMzksCisgICAgMTE0LDEyOCwgMzIsMTM3LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDI1LAorICAgIDIzOSwyMzYsMjI4LDI0MywyNDQsMjQ5LDIzNiwxMDEsMTI4LDI0NywgNTcsMTEyLCAgMiwxMzksIDY1LDEzOSwKKyAgICAgNzIsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTI0LDIyOSwxMTQsICAyLDEzOSwgNzksMTM5LCA4NSwyMzMsCisgICAgMjM5LDEwMCwxMjgsIDM2LDE0NCwyNDMsMjMzLDIyNSwxMTAsMTI4LCAgNiwyNDksMjQyLDIzOSwyMzcsMjI1LAorICAgIDExMCwxMjgsIDMzLDEyMCwyNDMsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsMTIxLDExNiwKKyAgICAgIDIsMTM5LDExNywxMzksMTU1LDIyOSwyMjksMTEwLCAgMiwxMzksMTI1LDEzOSwxMzQsMjI3LDIzMywyNDIsCisgICAgMjI3LDIzNiwxMDEsMTI4LCAzNiwxMTQsMTEyLCAgMiwxMzksMTQwLDEzOSwxNDcsMjI1LDI0MiwyMjksMTEwLAorICAgIDEyOCwgMzYsMTM0LDIyOSwyNDIsMjMzLDIzOSwxMDAsMTI4LCAzNiwxNTQsMjMyLDIyNSwxMDUsMTI4LCAxNCwKKyAgICAgODksMTA2LDEyOSwgIDEsMjA0LDEzOSwxNjcsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksCisgICAgMTI4LCAgNCwgOTAsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDI0MywxMzksMTkyLAorICAgIDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTU3LDEwOCwgIDIsMTM5LDIxMCwKKyAgICAxMzksMjI0LDIyOSwyMzEsMjQyLDIzMywyMzEsMjMyLDI0NCwyMzYsMjM5LDIzOCwxMDMsMTI4LCAgMSwxNTgsCisgICAgMjMzLDIzOCwyMjksMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCA3MywxMDksICAyLDEzOSwyNDEsMTM5LAorICAgIDI1MiwyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDc4LDI0MywyNDEsMjQ1LDIyNSwKKyAgICAyNDIsMTAxLDEyOCwgNTEsMTU0LDExMCwgIDIsMTQwLCAxMSwxNDAsIDYxLCA5NywgIDMsMTQwLCAxOSwxNDAsCisgICAgIDI5LDE0MCwgMzYsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTYzLDIyOCwyMjksMjQ2LAorICAgICA5NywxMjgsICA5LCAzNSwyMzEsMTE3LCAgMiwxNDAsIDQzLDE0MCwgNTIsMjM0LDIyNSwyNDIsMjI1LDI0NCwKKyAgICAxMDUsMTI4LCAxMCwxNjMsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMzUsMjM4LDIyNSwyMjgsCisgICAgMjI5LDI0NiwgOTcsMTI4LCAgOSwgNDEsMTExLCAgNiwxNDAsIDg0LDE0MCwgOTUsMTQwLDEyMCwxNDAsMTYxLAorICAgIDE0MSwxMTMsMTQyLCA0MCwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTEwLDIzNSwKKyAgICAyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyMDYsMTQwLDEwOCwyMzIsMjI1LDIzNiwyMzAsCisgICAgMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEzNywxMTAsICAzLDE0MCwxMjgsMTQwLDE0NCwxNDAsMTUzLAorICAgIDIyNiwyNDIsMjI5LDIyNSwyMzUsMjMzLDIzOCwyMzEsMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsICAwLDE2MCwKKyAgICAyMjksMjM4LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAxOSwyNDUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsCisgICAgIDI1LDIzOSwxMTAsICA3LDE0MCwxNzgsMTQwLDE4NywxNDAsMjAxLDE0MCwyMzUsMTQwLDI1MSwxNDEsIDM2LAorICAgIDE0MSwgOTUsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNzAsMjMwLDIzMywyMzgsMjI1LDIzNiwKKyAgICAyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIzMCwyMzEsMjMyLDI0NSwyMzgsMjM4LCA5NywgIDIsCisgICAgMTQwLDIxMiwxNDAsMjIxLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTg2LDIzMCwyMzMsMjM4LAorICAgIDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxNTksMjMzLDIzOCwyMzMsMjQ0LDIzMywKKyAgICAyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjMxLDIzNCwyMjksMjI5LDIzNywxMDUsCisgICAgICAyLDE0MSwgIDUsMTQxLCAyMCwyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLAorICAgICA5OSwxMjgsMjUyLDIxMCwyNDMsMjM5LDIzNiwyMjUsMjQ0LDIyOSwyMjgsMjI1LDI0MiwyMjUsMjI2LDIzMywKKyAgICAgOTksMTI4LDI1MiwgNzUsMjM3LDEwMSwgIDIsMTQxLCA0MywxNDEsIDU2LDIyOCwyMzMsMjI1LDIzNiwyMjUsCisgICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIzMiwyMjksMjM3LDEwNSwgIDIsMTQxLCA2NCwxNDEsIDc5LAorICAgIDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsMjEzLDI0MywKKyAgICAyMzksMjM2LDIyNSwyNDQsMjI5LDIyOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLCA3OCwyMzgsCisgICAgMjM5LDIzOSwyMzgsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLAorICAgIDE0MSwxMTYsICA3LDE0MSwxMjksMTQxLDE0MCwxNDEsMTY5LDE0MSwyMDQsMTQxLDIxNiwxNDEsMjM2LDE0MiwKKyAgICAgIDYsMjI3LDIzOSwyMzgsMjQ0LDIyNSwyMzMsMjM4LDExNSwxMjgsIDM0LCAxMiwxMDEsICAyLDE0MSwxNDYsCisgICAgMTQxLDE2MiwyMzYsMjI5LDIzNywyMjksMjM4LDExNiwxMjksIDM0LCAgOSwxNDEsMTU3LDIzOSwxMDIsMTI4LAorICAgICAzNCwgIDksMjQxLDI0NSwyMjUsMTA4LDEyOCwgMzQsIDk2LDIzMSwyNDIsMjI5LDIyNSwyNDQsMjI5LDExNCwKKyAgICAxMjksIDM0LDExMSwxNDEsMTgxLDIzOCwyMzksMTE0LCAgMiwxNDEsMTg5LDE0MSwxOTcsMjI5LDI0MSwyNDUsCisgICAgMjI1LDEwOCwxMjgsIDM0LDExMywyMzYsMjI5LDI0MywxMTUsMTI4LCAzNCwxMjEsMjMzLDIyOCwyMjksMjM4LAorICAgIDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LCAzNCwgOTgsMjM2LDIyOSwyNDMsMTE1LDEyOSwgMzQsMTEwLDE0MSwKKyAgICAyMjUsMjM4LDIzOSwyNDIsMjI5LDI0MSwyNDUsMjI1LDEwOCwxMjgsIDM0LDExMiwxMTIsICAyLDE0MSwyNDIsCisgICAgMTQxLDI1MiwyMjUsMjQyLDIyNSwyMzYsMjM2LDIyOSwxMDgsMTI4LCAzNCwgMzgsMjQyLDIyOSwyMjcsMjI5LAorICAgIDIyOCwyMjksMTE1LDEyOCwgMzQsMTI4LDI0MywxMTcsICAzLDE0MiwgMTUsMTQyLCAyMiwxNDIsIDMxLDIyNiwKKyAgICAyNDMsMjI5LDExNiwxMjgsIDM0LDEzMiwyMjcsMjI3LDIyOSwyMjksMjI4LDExNSwxMjgsIDM0LDEyOSwyNDAsCisgICAgMjI5LDI0MiwyNDMsMjI5LDExNiwxMjgsIDM0LDEzMywyNDcsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LAorICAgIDExMCwxMjgsICA1LDExOCwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTY5LDExNSwgIDIsMTQyLCA2NiwKKyAgICAxNDIsIDc1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTc3LDI0NSwyNDAsMjI5LDI0MiwyMzMsCisgICAgMjM5LDExNCwxMjgsIDMyLDEyNywyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwgIDAsMjQxLDExNywxMzIsICAzLAorICAgIDE4OSwxNDIsMTA1LDE0MiwxMTYsMTQyLDE5NywxNDMsIDI0LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwKKyAgICAgOTcsMTI4LCA0OCwxMDgsMTA3LCAgMiwxNDIsMTIyLDE0MiwxNDYsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsCisgICAgIDk3LDEyOSwgNDgsMjA0LDE0MiwxMzQsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LAorICAgIDI1NSwxMzUsMjQ0LCA5NywgIDMsMTQyLDE1NSwxNDIsMTY1LDE0MiwxNzIsMjI2LDIyOSwyMzgsMjMxLDIyNSwKKyAgICAyMzYsMTA1LDEyOCwgIDksMTg4LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA2MCwyMzEsMTE3LCAgMiwxNDIsCisgICAgMTc5LDE0MiwxODgsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxODgsMjQyLDIzNywyNDUsMjM1LAorICAgIDIzMiwxMDUsMTI4LCAxMCwgNjAsMTA5LCAgMiwxNDIsMjAzLDE0MiwyMzcsMjI2LDIyOSwyNDIsMjQzLDIzMywKKyAgICAyMzEsMTEwLDEzMCwgIDAsIDM1LDE0MiwyMTcsMTQyLDIyOSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsCisgICAgMjI3LDEwMSwxMjgsMjU1LCAgMywyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsIDk1LDIyOSwxMTQsICAyLAorICAgIDE0MiwyNDQsMTQzLCAyMCwyMjUsMjM2LDI0MywyMzMsMjMxLDExMCwgIDIsMTQyLDI1NSwxNDMsICA3LDIzMSwKKyAgICAyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywxMTYsMjM2LDIzOSwyNDcsMjI5LDI0MiwyMzEsMjQyLDIyOSwyMjksCisgICAgMTA3LDEyOCwgIDMsMTE3LDExMSwxMjgsIDMzLCAyMiwxMTAsMTMwLCAgNSwyMjQsMTQzLCAzMiwxNDMsIDUyLAorICAgIDIyOCwyMjUsMjMxLDIyOSwyNDMsMTA0LDEyOSwyNTEsIDY0LDE0MywgNDMsMjMyLDIyOSwyMjYsMjQyLDIyOSwKKyAgICAxMTksMTI4LDI1MSwgNjQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwyMjQsMjQ2LDI0MywyNDEsCisgICAgMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTgxLDI0NywyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLAorICAgIDE4NywyNDksIDk3LCAgMywxNDMsIDkwLDE0MywxMDAsMTQzLDEwNywyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwKKyAgICAxMDUsMTI4LCAgOSwxNTgsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDMwLDIzMSwxMTcsICAyLDE0MywxMTQsCisgICAgMTQzLDEyMywyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE1OCwyNDIsMjM3LDI0NSwyMzUsMjMyLAorICAgIDEwNSwxMjgsIDEwLCAzMCwxMTEsMTQ3LCAgMCwxMTEsMTQzLDE3NCwxNDMsMTk2LDE0NCwgMTgsMTQ0LDE4OCwKKyAgICAxNDUsICA0LDE0NSwgMTksMTQ1LCA1OSwxNDUsMTgyLDE0NSwyMDMsMTQ1LDI0MSwxNDUsMjUyLDE0NiwxNzQsCisgICAgMTQ4LCAgOCwxNDgsIDcyLDE0OCwxMDUsMTQ4LDE1MSwxNDksIDI0LDE0OSwgNzEsMTQ5LCA4MywgOTcsICAyLAorICAgIDE0MywxODAsMTQzLDE4NywyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMCwyNDMsMjM4LDIzMSwyNDQsMjMyLDIyNSwKKyAgICAxMDUsMTI4LCAxNCwgNDUsIDk4LCAgNCwxNDMsMjA2LDE0MywyNDgsMTQ0LCAgMSwxNDQsIDExLDIyNSwyNDIsCisgICAgMjQyLDIyOSwxMDAsMTMwLCAgMiwxMTcsMTQzLDIxOCwxNDMsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LAorICAgIDIzMywgOTksMTI4LCAgNCwyMzMsMjI4LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDI0MywyMjcsMjQ5LDI0MiwKKyAgICAyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjM1LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksCisgICAgMTQ3LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAyNywyNDIsMjI5LDI0NiwxMDEsMTI4LAorICAgICAgMSwgNzksIDk5LCAgMywxNDQsIDI2LDE0NCwgOTksMTQ0LDE3OCwgOTcsICAyLDE0NCwgMzIsMTQ0LCA5MywKKyAgICAyMzgsMjI4LDI0MiwgOTcsICAzLDE0NCwgNDMsMTQ0LCA1MCwxNDQsIDYxLDIyOCwyMjksMjQ2LCA5NywxMjgsCisgICAgICA5LCAxNywyMzEsMjQ1LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTQ1LDI0NiwyMzksMjQ3LAorICAgIDIyOSwyMzYsMjQzLDIzMywyMzEsMTEwLCAgMiwxNDQsIDc1LDE0NCwgODIsMjI4LDIyOSwyNDYsIDk3LDEyOCwKKyAgICAgIDksIDczLDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwyMDEsMjQyLDIzOSwxMTAsCisgICAgMTI4LCAgMSwyMTAsMjMzLDI0MiwgOTksICAyLDE0NCwxMDcsMTQ0LDExMiwyMzYsMTAxLDEyOCwgMzYsMjIyLAorICAgIDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEzMywgIDAsMjQ0LDE0NCwxMzEsMTQ0LDEzOSwxNDQsMTUwLDE0NCwKKyAgICAxNTgsMTQ0LDE3MCwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsMjA5LDIyOCwyMzksMjQ0LDIyNiwyMjksCisgICAgMjM2LDIzOSwxMTksMTI4LCAzMCwyMTcsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLDIxMSwyMzIsMjM5LAorICAgIDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDIxMywyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwKKyAgICAgMzAsMjE1LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA2MiwxMDAsICA0LDE0NCwxOTgsCisgICAgMTQ0LDIyMSwxNDQsMjI3LDE0NCwyNTAsMjI2LDEwOCwgIDIsMTQ0LDIwNSwxNDQsMjEzLDIyNSwyMjcsMjQ1LAorICAgIDI0NCwxMDEsMTI4LCAgMSwgODEsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAyLCAxMywyMjksMjQ2LCA5NywKKyAgICAxMjgsICA5LCAxOSwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTI5LCAgMCwyNDYsMTQ0LDIzOSwyMjcsCisgICAgMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjMxLDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LAorICAgIDExOSwxMjgsIDMwLDIwNSwxMDEsMTI5LCAgMSwgODMsMTQ1LCAxMCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwKKyAgICAxMjgsIDQ5LCA5MCwxMDMsICAzLDE0NSwgMjcsMTQ1LCA0MiwxNDUsIDQ5LDIzOSwyMzgsMjI5LDEwNywxMjksCisgICAgICAyLDIxOSwxNDUsIDM2LDIyNywyMzcsIDk4LDEyOCwgIDMsIDQwLDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAwLAorICAgIDI0MiwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNDcsMTA0LCAgNCwxNDUsIDY5LDE0NSwKKyAgICAgODAsMTQ1LCA5MCwxNDUsMTY4LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMzMsCisgICAgMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDc0LDExMSwgIDIsMTQ1LCA5NiwxNDUsMTA2LAorICAgIDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDIwNywyNDIsMTEwLDEzMywgIDEsMTYxLDE0NSwKKyAgICAxMjEsMTQ1LDEyOSwxNDUsMTQwLDE0NSwxNDgsMTQ1LDE2MCwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsCisgICAgMjE5LDIyOCwyMzksMjQ0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwyMjcsMjMxLDI0MiwyMjUsMjQ2LAorICAgIDEwMSwxMjgsIDMwLDIyMSwyMzIsMjM5LDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDIyMywKKyAgICAyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwgMzAsMjI1LDI0NSwyMzgsMjMxLDIyNSwyNDIsMjQ1LDIzNywyMzYsCisgICAgMjI1LDI0NSwxMTYsMTI4LCAgMSwgODEsMTA1LDEyOSwgIDEsMTYzLDE0NSwxODgsMjM4LDI0NiwyMjksMjQyLAorICAgIDI0NCwyMjksMjI4LDIyNiwyNDIsMjI5LDI0NiwxMDEsMTI4LCAgMiwgMTUsMTA3LCAgMiwxNDUsMjA5LDE0NSwKKyAgICAyMzMsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMTcwLDE0NSwyMjEsMjMyLDIyNSwyMzYsCisgICAgMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMTcsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LAorICAgICA4NywyMzYsMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTcxLDEwOSwgIDYsMTQ2LCAxMCwKKyAgICAxNDYsIDM4LDE0NiwgNDUsMTQ2LDEzNCwxNDYsMTQ1LDE0NiwxNjMsMjI1LDIyNywyNDIsMjM5LDExMCwxMzAsCisgICAgICAxLCA3NywxNDYsIDIyLDE0NiwgMzAsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLCA4MywyMzEsMjQyLAorICAgIDIyNSwyNDYsMTAxLDEyOCwgMzAsIDgxLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA4MCwyMjksMjMxLCA5NywKKyAgICAxMzMsICAzLDIwMSwxNDYsIDYxLDE0NiwgNjUsMTQ2LCA3NiwxNDYsIDkwLDE0NiwxMDYsIDQ5LDEyOCwgIDMsCisgICAgMjE0LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgOTcsMjM2LDIyNSwyNDQsMjMzLAorICAgIDIzOCwyMjcsMjM2LDIzOSwyNDMsMjI5LDEwMCwxMjgsICAyLDExOSwyNDIsMjM5LDI0NSwyMzgsMjI4LDIyNywKKyAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMjMsMTE2LCAgMiwxNDYsMTEyLDE0NiwxMjcsCisgICAgMjMzLDI0NCwyMzYsMjM5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMjUsMjM5LAorICAgIDIzOCwyMzksMTE1LDEyOCwgIDMsMjA2LDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwKKyAgICAyMDgsMjMzLDIyNywyNDIsMjM5LDExMCwxMjksICAzLDE5MSwxNDYsMTU1LDI0NCwyMzksMjM4LDIzOSwxMTUsCisgICAgMTI4LCAgMywyMDQsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA3OSwyMzgsMTAxLAorICAgIDE0NSwgIDAsIDQ5LDE0NiwyMTMsMTQ2LDIyMiwxNDYsMjMyLDE0NywgIDYsMTQ3LCAzMSwxNDcsIDQwLDE0NywKKyAgICAgNDksMTQ3LCA3NCwxNDcsMTA4LDE0NywxNDIsMTQ3LDE1NCwxNDcsMTczLDE0NywxODQsMTQ3LDIxNywxNDcsCisgICAgMjI3LDE0NywyMzUsMTQ3LDI0NiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA5NywyMjYsMjI5LAorICAgIDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMzEsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI5LCAzNiwKKyAgICAgOTYsMTQ2LDI0MywyMzMsMjM4LDI0NiwyMjksMjQyLDI0MywyMjksMjQzLDIyNSwyMzgsMjQzLDI0MywyMjksCisgICAgMjQyLDIzMywxMDIsMTI4LCAzOSwxMzgsMTAwLCAgMiwxNDcsIDEyLDE0NywgMTgsMjI5LDI0NiwgOTcsMTI4LAorICAgICAgOSwxMDMsMjM5LDI0NCwyMjksMjM4LDIzNiwyMjksMjI1LDIyOCwyMjksMTE0LDEyOCwgMzIsIDM2LDIyOSwKKyAgICAyMzMsMjMxLDIzMiwyNDQsMTA0LDEyOCwgMzMsIDkxLDIzMCwyMzMsMjQ0LDI0NCwyMjksMTAwLDEyOCwyNDYsCisgICAgMjIwLDIzMSwxMTcsICAyLDE0NywgNTYsMTQ3LCA2NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLAorICAgIDIzMSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLDEwMywyMzIsIDk3LCAgMywxNDcsIDgzLDE0NywKKyAgICAgOTQsMTQ3LCA5OSwyMjcsMjM1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDk3LDIzNiwxMDIsCisgICAgMTI4LCAgMCwxODksMjM4LDIzMSwyNTAsMjMyLDIzOSwxMTcsMTI4LCA0OCwgMzMsMTA1LCAgMiwxNDcsMTE0LAorICAgIDE0NywxMzIsMjI4LDIyOSwyMzksMjMxLDI0MiwyMjUsMjQwLDIzMiwyMzMsMjI3LDI0MCwyMjUsMjQyLDIyOSwKKyAgICAxMTAsMTI4LCA1MCwgMzIsMjM4LDIzMCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsMTI5LDIzNywyMzksCisgICAgMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDE3LDIzOCwyNDUsMjM3LDIyOSwyNDIsMjI1LAorICAgIDI0NCwyMzksMjQyLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDI0NCwyMzksMjM2LDIyOCwKKyAgICAyNDMsMjQ0LDI0OSwyMzYsMTAxLDEyOCwyNDcsIDQ5LDExMiwgIDIsMTQ3LDE5MCwxNDcsMTk3LDIyNSwyNDIsCisgICAgMjI5LDExMCwxMjgsIDM2LDExNiwyMjksMTE0LCAgMiwxNDcsMjA0LDE0NywyMTAsMjMzLDIzOSwxMDAsMTI4LAorICAgICAzNiwxMzYsMjQzLDIzMywyMjUsMTEwLDEyOCwgIDYsMjQxLDI0MSwyNDUsMjI1LDI0MiwyNDQsMjI5LDExNCwKKyAgICAxMjgsICAwLDE4OCwyNDIsMjM5LDIzNywyMjUsMTEwLDEyOCwgMzMsMTEyLDI0MywyNDUsMjQwLDIyOSwyNDIsCisgICAgMjMzLDIzOSwxMTQsMTI4LCAgMCwxODUsMjQ0LDEwNCwgIDIsMTQ3LDI1MywxNDgsICAyLDIyNSwxMDUsMTI4LAorICAgICAxNCwgODEsMjMzLDI0MiwxMDAsMTI4LCAzMywgODMsMTExLCAgMywxNDgsIDE2LDE0OCwgNTAsMTQ4LCA2NiwKKyAgICAxMDMsICAyLDE0OCwgMjIsMTQ4LCA0MCwyMzksMjM4LDIyOSwxMDcsMTI5LCAgMSwyMzUsMTQ4LCAzMSwyMzcsCisgICAgMjI1LDIyNywyNDIsMjM5LDExMCwxMjgsICAxLDIzNywyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LAorICAgICAxMCwgMTksMjM3LDIyNSwyNDQsMjQyLDIyNSwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwKKyAgICAgMTAsIDc1LDI0MCwyMjksMTEwLDEyOCwgIDIsIDg0LDExMiwgIDMsMTQ4LCA4MCwxNDgsIDg3LDE0OCwgOTgsCisgICAgMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTcwLDIyOSwyMzgsMjI2LDI0NSwyMzYsMjM2LDIyOSwxMTYsMTI4LAorICAgICAzNywyMzAsMjQ0LDIzMywyMzksMTEwLDEyOCwgMzUsIDM3LDExNCwgIDIsMTQ4LDExMSwxNDgsMTQwLDEwMCwKKyAgICAgIDIsMTQ4LDExNywxNDgsMTI4LDIzMCwyMjksMjM3LDIzMywyMzgsMjMzLDIzOCwxMDEsMTI4LCAgMCwxNzAsCisgICAgMjM3LDIyNSwyNDMsMjI3LDI0NSwyMzYsMjMzLDIzOCwxMDEsMTI4LCAgMCwxODYsMjQ0LDIzMiwyMzksMjMxLAorICAgIDIzOSwyMzgsMjI1LDEwOCwxMjgsIDM0LCAzMSwxMTUsICA1LDE0OCwxNjMsMTQ4LDE5NSwxNDgsMjEyLDE0OSwKKyAgICAgIDEsMTQ5LCAxNCwyMzIsMjM5LDI0MiwxMTYsICAyLDE0OCwxNzIsMTQ4LDE3OSwyMjgsMjI5LDI0NiwgOTcsCisgICAgMTI4LCAgOSwgMTgsMjQ2LDIzOSwyNDcsMjI5LDIzNiwyNDMsMjMzLDIzMSwyMzgsMjI4LDIyOSwyNDYsIDk3LAorICAgIDEyOCwgIDksIDc0LDIzNiwyMjUsMjQzLDEwNCwxMjksICAwLDI0OCwxNDgsMjA0LDIyNSwyMjcsMjQ1LDI0NCwKKyAgICAxMDEsMTI4LCAgMSwyNTUsMjM3LDIyNSwyMzYsMTA4LCAgMiwxNDgsMjIxLDE0OCwyMzIsMjMyLDIzMywyNDIsCisgICAgMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LCA3MywyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LAorICAgIDEyOSwgNDgsMTY5LDE0OCwyNDUsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwKKyAgICAxMDcsMjQ0LDI0MiwyMzksMjM1LDIyOSwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgIDEsMjU1LDI0NSwyNDAsCisgICAgMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDI0MCwxMTYsICAyLDE0OSwgMzAsMTQ5LCA0MSwyMjcsMjQ5LAorICAgIDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTI3LDIzMywyMzYsMjI4LDEwMSwxMzAsICAwLDI0NSwKKyAgICAxNDksIDUyLDE0OSwgNjAsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLCA3NywyMjgsMjMzLDIyOSwyNDIsCisgICAgMjI5LDI0MywyMzMsMTE1LDEyOCwgMzAsIDc5LDI0NSwyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLAorICAgIDEyOCwgNDksIDMzLDExOCwgIDIsMTQ5LCA4OSwxNDksMTcwLDIyOSwxMTQsICAyLDE0OSwgOTYsMTQ5LDE2MiwKKyAgICAyMzYsMjMzLDIzOCwxMDEsMTMxLCAzMiwgNjIsMTQ5LDEwOSwxNDksMTMyLDE0OSwxNTUsIDk5LCAgMiwxNDksCisgICAgMTE1LDE0OSwxMjcsMjI5LDIzOCwyNDQsMjI5LDI0MiwyMzYsMjMzLDIzOCwxMDEsMTI4LDI1NCwgNzQsMjM3LAorICAgICA5OCwxMjgsICAzLCAgNSwxMDAsICAyLDE0OSwxMzgsMTQ5LDE0NiwyMjUsMjQzLDIzMiwyMjksMTAwLDEyOCwKKyAgICAyNTQsIDczLDIyNiwyMzYsMjQ3LDIyNSwyNDYsMTIxLDEyOCwyNTQsIDc2LDI0NywyMjUsMjQ2LDEyMSwxMjgsCisgICAgMjU0LCA3NSwyNDMsMjI3LDIzOSwyNDIsMTAxLDEyOCwgIDAsMTc1LDIzOSwyNDcsMjI5LDIzNiwyNDMsMjMzLAorICAgIDIzMSwxMTAsICAzLDE0OSwxODUsMTQ5LDE5NSwxNDksMjAyLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwKKyAgICAxMjgsICA5LDIwMywyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNzUsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsCisgICAgMjQ0LDEwNSwxMjgsIDEwLDIwMywxMTIsMTQ1LCAgMCwxMTIsMTQ5LDI1MSwxNTIsMTIzLDE1MiwxMzQsMTUyLAorICAgIDE0MywxNTIsMTU1LDE1NCwgODAsMTU0LCA5MCwxNTUsIDgyLDE1NiwxMDEsMTU2LDE5MSwxNTYsMjE3LDE1NywKKyAgICAgOTIsMTU3LDEwMCwxNTgsICAyLDE1OCwgNjAsMTU4LCA4OCwxNTgsIDk4LCA5NywgMTQsMTUwLCAyNSwxNTAsCisgICAgIDU3LDE1MCwgNjcsMTUwLCA3NCwxNTAsIDgxLDE1MCwxMjksMTUwLDE0MCwxNTAsMTU0LDE1MCwxNjUsMTUwLAorICAgIDIxMiwxNTAsMjI2LDE1MSwyMzgsMTUyLCAyMSwxNTIsMTExLCA5NywgIDIsMTUwLCAzMSwxNTAsIDQzLDIzNywKKyAgICAyNDAsMjQzLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTI4LDI0MywyMjksMjM4LDI0NCwyMzksCisgICAgMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgNDMsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LAorICAgIDEyOCwgIDksMTcwLDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLCA4NSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwKKyAgICAgNDIsMTAzLCAgMiwxNTAsIDg3LDE1MCwxMDUsMTAxLCAgMiwxNTAsIDkzLDE1MCwxMDAsMjI4LDIzOSwyNDcsCisgICAgMTEwLDEyOCwgMzMsMjIzLDI0NSwxMTIsMTI4LCAzMywyMjIsMTE3LCAgMiwxNTAsMTExLDE1MCwxMjAsMjM0LAorICAgIDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNzAsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwKKyAgICAgNDIsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDExMywyMzMsMjQ5LDIyNSwyMzgsCisgICAgMjM4LDIzOSwyMzMsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDQ3LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LAorICAgIDIzOCwgOTcsMTI4LCA0OCwyMDksMTA4LCAgMiwxNTAsMTcxLDE1MCwxOTYsMjI1LDI0NCwyMjUsMjM2LDIzMywKKyAgICAyNTAsMjI1LDI0NCwyMzMsMjM5LDIzOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsMjI3LDIyNywyMzcsCisgICAgIDk4LDEyOCwgIDQsMTMyLDIzOSwyMjcsMjMyLDIzNSwyMjUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLAorICAgICA5OSwxMjgsICA0LDE5MiwyMzgsMjQzLDIzMywyMzksMjQzLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwKKyAgICAgNDksMTI3LDExNCwgIDMsMTUwLDIzNCwxNTAsMjU1LDE1MSwyMjcsIDk3LCAgMiwxNTAsMjQwLDE1MCwyNDgsCisgICAgMjMxLDI0MiwyMjUsMjQwLDEwNCwxMjgsICAwLDE4MiwyMzYsMjM2LDIyOSwxMDgsMTI4LCAzNCwgMzcsMjI5LAorICAgIDExMCwgIDIsMTUxLCAgNiwxNTEsMTE2LDIzNiwyMjksMjMwLDExNiwxMzYsICAwLCA0MCwxNTEsIDI5LDE1MSwKKyAgICAgNDQsMTUxLCA0OSwxNTEsIDU0LDE1MSwgNjUsMTUxLCA3NywxNTEsMTAwLDE1MSwxMDUsMjI1LDIzNiwyNDQsCisgICAgMjM5LDIzOCwyMjksMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MywgNjIsMjI2LDExNiwxMjgsMjQ4LAorICAgIDIzNywyMjksMTIwLDEyOCwyNDgsMjM2LDIzMywyMzgsMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwKKyAgICAxNDEsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgIDgsMTE1LCAgMiwxNTEsCisgICAgIDgzLDE1MSwgOTAsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsIDg5LDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LAorICAgIDExNCwxMjgsIDMyLDEyNSwyNDQsMTEyLDEyOCwyNDgsMjM1LDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwKKyAgICAxMDgsMTI4LDI1NCwgNTMsMjQyLDIzMywyMzEsMjMyLDExNiwxMzYsICAwLCA0MSwxNTEsMTQwLDE1MSwxNTUsCisgICAgMTUxLDE2MCwxNTEsMTY1LDE1MSwxNzYsMTUxLDE4OCwxNTEsMjExLDE1MSwyMTYsMjI1LDIzNiwyNDQsMjM5LAorICAgIDIzOCwyMjksMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MywgNjMsMjI2LDExNiwxMjgsMjQ4LDI0OCwKKyAgICAyMjksMTIwLDEyOCwyNDgsMjQ3LDIzMywyMzgsMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwxNDIsCisgICAgMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgIDksMTE1LCAgMiwxNTEsMTk0LAorICAgIDE1MSwyMDEsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsIDkwLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwKKyAgICAxMjgsIDMyLDEyNiwyNDQsMTEyLDEyOCwyNDgsMjQ2LDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsCisgICAgMTI4LDI1NCwgNTQsMjQ0LDIzMywyMjUsMjM2LDIyOCwyMzMsMjMwLDEwMiwxMjgsIDM0LCAgMiwxMTUsICAzLAorICAgIDE1MSwyNDYsMTUyLCAgMSwxNTIsIDEzLDIyOSwyNDEsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwKKyAgICAxOTIsMjMyLDI0NCwyMjUsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNTMsMjQxLDI0NSwyMjUsCisgICAgMjQyLDEwMSwxMjgsIDUxLDE2OSwyNDQsMjI1LDEwNCwxMzQsICA1LDE4MywxNTIsIDM5LDE1MiwgNTMsMTUyLAorICAgICA1OCwxNTIsIDY3LDE1MiwgODIsMTUyLCA5OCwgNDksICAyLDE1MiwgNDUsMTUyLCA0OSwgNDksMTI4LCAgNSwKKyAgICAxODMsMTAwLDEyOCwgIDUsMTgzLDE3OCwgOTcsMTI4LCAgNSwxODMsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksCisgICAgMTI4LCAgNSwxODMsMjM4LDIyNSwyNDIsMjQyLDIzOSwyNDcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAorICAgICAgNSwxODMsMjQxLDI0NSwyMjUsMjQyLDI0NCwyMjksMjQyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwKKyAgICAgIDUsMTgzLDI0NywyMzMsMjI4LDIyOSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4MywyNTAsCisgICAgMjI5LDI0MiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE2MSwyMjYsMjM5LDI0MCwyMzksMjM3LAorICAgIDIzOSwyMzAsMTExLDEyOCwgNDksICA2LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMjIzLDIyOCwKKyAgICAyMzksMjQ0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsIDg3LDEwMSwxMzcsICA1LDIyOCwxNTIsCisgICAgMTc3LDE1MiwxODgsMTUyLDIwOCwxNTIsMjIwLDE1MiwyNDAsMTUzLCA4NiwxNTMsIDk3LDE1MywxMTgsMTU0LAorICAgICA3MywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDYzLDIyOCwyMjUsMjMxLDIyOSwKKyAgICAyNDMsMTA0LDEyOSwyNTEsIDY4LDE1MiwxOTksMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LDI1MSwgNjgsCisgICAgMjI5LDI1MCwyMzMsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgNTksMjMwLDIzMywyMzgsMjI1LAorICAgIDIzNiwyMjgsMjI1LDIzMSwyMjksMjQzLDIzMiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA2NywKKyAgICAxMDQsICA1LDE1MiwyNTIsMTUzLCAxOSwxNTMsIDI3LDE1MywgNDEsMTUzLCA3MSwyMjUsMTE0LCAgMiwxNTMsCisgICAgICAzLDE1MywgMTAsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTI2LDIzNywyMjksMjM4LDIzMywyMjUsMTEwLAorICAgIDEyOCwgIDUsMTIyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwyMjgsMjMwLDIzMywyMzgsMjI1LDIzNiwKKyAgICAyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUxLCA4NywxMDUsICAyLDE1MywgNDcsMTUzLCA2MiwyMzgsCisgICAgMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUxLCA4OCwyNDIsMjI1LAorICAgIDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEyMiwyMzcsMjI5LDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwKKyAgICAyMjYsMjMzLCA5OSwxMjgsMjUxLCA4OSwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsCisgICAgMjE4LDIzNywyMzMsMjI4LDIyOCwyMzYsMjI5LDIzMiwyMzksMjM5LDIzNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LAorICAgIDIzNiwyMzMsIDk5LDEyOCwgIDQsMTY3LDExNCwgIDUsMTUzLDEzMCwxNTMsMTQyLDE1MywxODQsMTU0LCA0OSwKKyAgICAxNTQsIDYyLDIyNSwyMzAsMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDc4LDIyNywyMjksCisgICAgMjM4LDExNiwxMzEsICAwLCAzNywxNTMsMTU1LDE1MywxNjQsMTUzLDE3NiwyMjUsMjQyLDIyNSwyMjYsMjMzLAorICAgICA5OSwxMjgsICA2LDEwNiwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAgNSwKKyAgICAyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsMTA2LDEwNSwgIDIsMTUzLDE5MCwxNTQsIDMxLDIzOSwxMDAsCisgICAgMTM0LCAgMCwgNDYsMTUzLDIwNywxNTMsMjE4LDE1MywyMjksMTUzLDI0MSwxNTMsMjUyLDE1NCwgIDgsMjI1LAorICAgIDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDEzNywyMjcsMjI5LDIzOCwyNDQsMjI5LDI0MiwKKyAgICAyMjksMTAwLDEyOCwgIDAsMTgzLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsCisgICAgIDk3LDIzMywyMzgsMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LDI0NiwyMzEsMjM3LDIzOSwyMzgsMjM5LAorICAgIDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMTQsMTE1LCAgMiwxNTQsIDE0LDE1NCwgMjEsMjM3LDIyNSwKKyAgICAyMzYsMTA4LDEyOCwyNTQsIDgyLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDIzMiwyNDMsCisgICAgMjQwLDIzOSwyMzcsMjI5LDIzOCwyMzMsMjMxLDI0MiwyMjksMjI5LDIzNSwyMjcsMjM3LCA5OCwxMjgsICAzLAorICAgICA2NiwyNDAsMjI5LDIzOCwyMjgsMjMzLDIyNywyNDUsMjM2LDIyNSwxMTQsMTI4LCAzNCwxNjUsMjQ0LDIzMiwKKyAgICAyMzksMjQ1LDI0MywyMjUsMjM4LDEwMCwxMjgsIDMyLCA0OCwyNDMsMjI5LDI0NCwgOTcsMTI4LCAzMiwxNjcsCisgICAgMjMwLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTM4LDEwNCwgIDMsMTU0LCA5OCwxNTQsMTQ4LAorICAgIDE1NSwgMjksIDk3LCAgMywxNTQsMTA2LDE1NCwxMTYsMTU0LDEyMywyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwKKyAgICAxMDUsMTI4LCAgOSwxNzEsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDQzLDIzMSwxMTcsICAyLDE1NCwxMzAsCisgICAgMTU0LDEzOSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE3MSwyNDIsMjM3LDI0NSwyMzUsMjMyLAorICAgIDEwNSwxMjgsIDEwLCA0MywxMDUsMTMzLCAgMywxOTgsMTU0LDE2MiwxNTQsMTY2LDE1NCwyNTIsMTU1LCAgNCwKKyAgICAxNTUsIDE1LCA0OSwxMjgsICAzLDIxMywyMjksMjQ1LDI0MCwxMDQsICA0LDE1NCwxNzksMTU0LDIxNCwxNTQsCisgICAgMjI5LDE1NCwyMzgsIDk3LCAgMiwxNTQsMTg1LDE1NCwyMDAsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LAorICAgIDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMjIsMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwKKyAgICAyMjksMjI1LDExMCwxMjgsIDUwLCAyNiwyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksCisgICAgMjI1LDExMCwxMjgsIDUwLDEwOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA3NywyNDAsMjI1LAorICAgIDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsIDEyLDIzNiwyMjUsMjQ0LDIzMywKKyAgICAxMTAsMTI4LCAgMiwxMjAsMjM4LDI0NCwyMzIsMjQ1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA1OCwyNDMsCisgICAgMjQ5LDIzNywyMjYsMjM5LDIzNiwyMzEsMjQyLDIyOSwyMjksMTA3LDEyOCwgIDMsMjEzLDExMSwgIDMsMTU1LAorICAgICAzNywxNTUsIDQyLDE1NSwgNjgsMjM5LDEwNywxMjgsICAxLDE2NSwyNDAsMTA0LCAgMiwxNTUsIDQ5LDE1NSwKKyAgICAgNTgsMjI1LDIzOCwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgMzAsMjQ1LDIzOCwyMzEsMjQ0LDIzMiwyMjUsCisgICAgMTA1LDEyOCwgMTQsIDI4LDI0MywyMjUsMjM3LDI0MCwyMzIsMjI1LDIzOSwyNDQsMjMyLDIyNSwxMDUsMTI4LAorICAgICAxNCwgMzIsMTA1LDEzMywgIDMsMTkyLDE1NSwgOTYsMTU2LCA1MiwxNTYsIDYzLDE1NiwgNzQsMTU2LCA4OCwKKyAgICAyMjksMjQ1LDExMiwgIDYsMTU1LDExMiwxNTUsMTQ3LDE1NSwxNzksMTU1LDIwNywxNTUsMjIxLDE1NiwgMTcsCisgICAgIDk3LCAgMiwxNTUsMTE4LDE1NSwxMzMsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LAorICAgIDIyNSwxMTAsMTI4LCA1MCwxMTUsMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwKKyAgICAxMjgsIDUwLCAxOSwyMjcsMTA1LCAgMiwxNTUsMTU0LDE1NSwxNjYsMjI5LDI0NSwyMjcsMjM1LDIzOSwyNDIsCisgICAgMjI5LDIyNSwxMTAsMTI4LCA0OSwxMTgsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLAorICAgIDEyOCwgNTAsMTAxLDEwNywgIDIsMTU1LDE4NSwxNTUsMTk5LDIzMywyNDksMjI5LDIzOSwyMzUsMjM1LDIzOSwKKyAgICAyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMTQsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA2NiwyNDAsCisgICAgMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsICA1LDI0MywyMzMsMjM5LAorICAgIDExNSwgIDIsMTU1LDIzMCwxNTYsICAyLDEwNywgIDIsMTU1LDIzNiwxNTUsMjUwLDIzMywyNDksMjI5LDIzOSwKKyAgICAyMzUsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMTYsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsCisgICAgIDQ5LCA2OCwyNDQsMjMzLDIzNSwyMjksMjQ1LDI0NCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LAorICAgIDExNywxMTYsICAyLDE1NiwgMjMsMTU2LCAzOCwyMzIsMjMzLDIyOSwyNDUsMjQ0LDIzMiwyMzUsMjM5LDI0MiwKKyAgICAyMjksMjI1LDExMCwxMjgsIDQ5LDExOSwyMzMsMjM1LDIyOSwyNDUsMjQ0LDIzNSwyMzksMjQyLDIyOSwyMjUsCisgICAgMTEwLDEyOCwgNDksMTE1LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMTYsMjM1LAorICAgIDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDIxMiwyNDMsMjQ5LDIzNywyMjYsMjM5LDIzNiwKKyAgICAyMzEsMjQyLDIyOSwyMjksMTA3LDEyOCwgIDMsMjE0LDI0NywyNDIsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsCisgICAgMjI1LDExMCwxMjgsICA1LDEzMSwyMzYsMjQ1LDExNSwxMzIsICAwLCA0MywxNTYsMTE1LDE1NiwxMjYsMTU2LAorICAgIDEzNSwxNTYsMTY4LDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgMzEsMjI3LDIzMywKKyAgICAyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNCwxNDksMTA5LCAgMiwxNTYsMTQxLDE1NiwxNDgsMjMzLDIzOCwyNDUsCisgICAgMTE1LDEyOCwgIDAsMTc3LDExMSwgIDIsMTU2LDE1NCwxNTYsMTU4LDEwMCwxMjgsICAyLDIxNCwyMzgsMjM5LAorICAgIDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMTEsMTE1LCAgMiwxNTYsMTc0LDE1NiwxODEsMjM3LDIyNSwKKyAgICAyMzYsMTA4LDEyOCwyNTQsIDk4LDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLDEyMiwxMDksCisgICAgICAyLDE1NiwxOTcsMTU2LDIwOCwyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDgwLAorICAgIDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMjE2LDExMSwgIDUsMTU2LDIyOSwxNTYsMjQwLDE1NywKKyAgICAgNTEsMTU3LCA2MiwxNTcsIDcyLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMjUsCisgICAgMjMzLDIzOCwyNDQsMjMzLDIzOCwyMzEsMjMzLDIzOCwyMjgsMjI5LDEyMCwgIDQsMTU3LCAgNCwxNTcsIDE2LAorICAgIDE1NywgMjgsMTU3LCA0MSwyMjgsMjM5LDI0NywyMzgsMjQ3LDIzMiwyMzMsMjQ0LDEwMSwxMjgsIDM4LCAzMSwKKyAgICAyMzYsMjI5LDIzMCwyNDQsMjQ3LDIzMiwyMzMsMjQ0LDEwMSwxMjgsIDM4LCAyOCwyNDIsMjMzLDIzMSwyMzIsCisgICAgMjQ0LDI0NywyMzIsMjMzLDI0NCwxMDEsMTI4LCAzOCwgMzAsMjQ1LDI0MCwyNDcsMjMyLDIzMywyNDQsMTAxLAorICAgIDEyOCwgMzgsIDI5LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyMjEsMjQwLDIzNiwKKyAgICAyMjUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDI3LDI0MywyNDQsMjI1LDIzNiwyMzcsMjI1LDI0MiwxMDcsCisgICAgMTI5LCA0OCwgMTgsMTU3LCA4NSwyMzAsMjI1LDIyNywxMDEsMTI4LCA0OCwgMzIsMjQwLDIyNSwyNDIsMjI5LAorICAgIDExMCwxMjgsIDM2LDE3MSwxMTQsICAzLDE1NywxMDgsMTU3LDEzNCwxNTcsMTU5LDEwMSwgIDIsMTU3LDExNCwKKyAgICAxNTcsMTIyLDIyNywyMjksMjI4LDIyOSwxMTUsMTI4LCAzNCwxMjIsMjQzLDIyNywyNDIsMjMzLDI0MCwyNDQsCisgICAgMjMzLDIzOSwxMTAsMTI4LCAzMywgMzAsMjMzLDIzNywxMDEsICAyLDE1NywxNDIsMTU3LDE0OCwyMzcsMjM5LAorICAgIDEwMCwxMjgsICAyLDE4NSwyNDIsMjI5LDI0NiwyMjksMjQyLDI0MywyMjksMTAwLDEyOCwgMzIsIDUzLDExMSwKKyAgICAgIDQsMTU3LDE2OSwxNTcsMTc2LDE1NywxODYsMTU3LDE5OSwyMjgsMjQ1LDIyNywxMTYsMTI4LCAzNCwgMTUsCisgICAgMjM0LDIyOSwyMjcsMjQ0LDIzMywyNDYsMTAxLDEyOCwgMzUsICA1LDIzNiwyMzksMjM4LDIzMSwyMjksMjI4LAorICAgIDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDI1MiwxMTIsICAyLDE1NywyMDUsMTU3LDI0MiwxMDEsICAyLDE1NywKKyAgICAyMTEsMTU3LDIxOCwyMzYsMjM2LDIzOSwxMTQsMTI4LCAzNSwgMjQsMjQyLDI0MywxMTcsICAyLDE1NywyMjYsCisgICAgMTU3LDIzMywyMjYsMjQzLDIyOSwxMTYsMTI4LCAzNCwxMzAsMjQwLDIyOSwyNDIsMjQzLDIyOSwxMTYsMTI4LAorICAgICAzNCwxMzEsMjM5LDI0MiwyNDQsMjMzLDIzOSwxMTAsMTI5LCAzNCwgNTUsMTU3LDI1MywyMjUsMTA4LDEyOCwKKyAgICAgMzQsIDI5LDExNSwgIDIsMTU4LCAgOCwxNTgsIDUxLDEwNSwxMzAsICAzLDIwMCwxNTgsIDE2LDE1OCwgMjcsCisgICAgMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDExMywyMzYsMjMzLDI0MCwyMzgsMjI5LAorICAgIDI0NSwyMzcsMjI1LDI0NCwyMjUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLDIyNywyMjcsMjM3LCA5OCwKKyAgICAxMjgsICA0LDEzNCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE3NiwxMTcsICAyLDE1OCwgNjYsCisgICAgMTU4LCA3NywyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTE5LDIzNSwyMjUsMjQ0LAorICAgIDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyMTUsMjQ2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwKKyAgICAgNTEsMTgwLDI0NywyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE4NiwxMTMsMTM2LCAgMCwxMTMsCisgICAgMTU4LDEyOCwxNTksMTc3LDE1OSwxODgsMTU5LDE5NywxNTksMjA0LDE1OSwyMTYsMTU5LDI1NCwxNjAsICA2LAorICAgICA5NywgIDQsMTU4LDEzOCwxNTgsMTYxLDE1OCwyMjUsMTU5LDE2MCwxMDAsICAyLDE1OCwxNDQsMTU4LDE1MCwKKyAgICAyMjksMjQ2LCA5NywxMjgsICA5LCA4OCwyMzcsMjI1LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsCisgICAgMTY4LDEwMiwgIDQsMTU4LDE3MSwxNTgsMTgwLDE1OCwxOTQsMTU4LDIxMCwyMjUsMjQyLDIyNSwyMjYsMjMzLAorICAgICA5OSwxMjgsICA2LCA2NiwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwKKyAgICAyNTQsMjE0LDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCisgICAgMjU0LDIxNSwyMzcsMjI5LDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LAorICAgIDIxNiwyMzcsMjI1LDI0NCwxMTUsMTM2LCAgNSwxODQsMTU4LDI0OCwxNTksIDEyLDE1OSwgMjYsMTU5LCAzMSwKKyAgICAxNTksIDM2LDE1OSwgNDUsMTU5LCA2MCwxNTksMTQ3LCA0OSwgIDMsMTU5LCAgMCwxNTksICA0LDE1OSwgIDgsCisgICAgIDQ4LDEyOCwgIDUsMTg0LCA5NywxMjgsICA1LDE4NCwgOTksMTI4LCAgNSwxODQsIDUwLCAgMiwxNTksIDE4LAorICAgIDE1OSwgMjIsIDU1LDEyOCwgIDUsMTg0LCA1NywxMjgsICA1LDE4NCwxNzksIDUxLDEyOCwgIDUsMTg0LDIyOCwKKyAgICAxMDEsMTI4LCAgNSwxODQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODQsMjM4LDIyNSwyNDIsCisgICAgMjQyLDIzOSwyNDcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODQsMTEzLCAgMiwxNTksIDY2LAorICAgIDE1OSwxMzIsMjI1LDI0NCwyMjUsMTEwLCAgNCwxNTksIDc5LDE1OSwgODgsMTU5LDEwMywxNTksMTE5LDIzMiwKKyAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTg0LDIzOCwyMjUsMjQyLDI0MiwyMzksMjQ3LDIzMiwyMjksCisgICAgMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTg0LDI0MSwyNDUsMjI1LDI0MiwyNDQsMjI5LDI0MiwyMzIsMjI5LAorICAgIDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4NCwyNDcsMjMzLDIyOCwyMjksMjMyLDIyOSwyMjYsMjQyLDIyOSwKKyAgICAxMTksMTI4LCAgNSwxODQsMjQ1LDIyNSwyNDIsMjQ0LDIyOSwyNDIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksCisgICAgMTI4LCAgNSwxODQsMjQ3LDIzMywyMjgsMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTg0LAorICAgIDI0MiwyMzgsMjI5LDI0OSwyNDAsMjI1LDI0MiwyMjUsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwKKyAgICAxNTksMjI2LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAxNywyMjcsMjMzLDI0MiwyMjcsCisgICAgMjM2LDEwMSwxMjgsIDM2LDIyNCwyMzIsMjM5LDIzOSwxMDcsMTI4LCAgMiwxNjAsMjM3LDIzOSwyMzgsMjM5LAorICAgIDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgODEsMjM5LDEwMiwxMzAsICA1LDIzMSwxNTksMjI1LDE1OSwKKyAgICAyNDUsMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwgNzEsMTU5LDIzNiwyMzIsMjI5LDIyNiwyNDIsCisgICAgMjI5LDExOSwxMjgsMjUxLCA3MSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIzMSwyNDAsMjI1LAorICAgIDI0MiwyMjksMTEwLDEyOCwgMzYsMTcyLDExNywgIDQsMTYwLCAxNiwxNjAsIDI4LDE2MCwxMTcsMTYwLDIwNCwKKyAgICAyMjUsMjQyLDI0NCwyMjksMjQyLDIzOCwyMzksMjQ0LDEwMSwxMjgsIDM4LDEwNSwyMjYsMjQ1LDI0NCwxMTUsCisgICAgMTM1LCAgNSwxODcsMTYwLCA0OSwxNjAsIDU0LDE2MCwgNTksMTYwLCA2NCwxNjAsIDczLDE2MCwgODgsMTYwLAorICAgIDEwNCwxNzcsIDU2LDEyOCwgIDUsMTg3LDE3OCwgNTMsMTI4LCAgNSwxODcsMTc5LCA0OSwxMjgsICA1LDE4NywKKyAgICAyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4NywyMzgsMjI1LDI0MiwyNDIsMjM5LDI0NywyMzIsCisgICAgMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4NywyNDEsMjQ1LDIyNSwyNDIsMjQ0LDIyOSwyNDIsMjMyLAorICAgIDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODcsMjQ3LDIzMywyMjgsMjI5LDIzMiwyMjksMjI2LDI0MiwKKyAgICAyMjksMTE5LDEyOCwgIDUsMTg3LDIyOSwyNDMsMjQ0LDIzMywyMzksMTEwLDEzMywgIDAsIDYzLDE2MCwxMzYsCisgICAgMTYwLDE1OSwxNjAsMTc2LDE2MCwxODQsMTYwLDE5NiwyMjUsMTE0LCAgMiwxNjAsMTQzLDE2MCwxNTAsMjI1LAorICAgIDIyNiwyMzMsIDk5LDEyOCwgIDYsIDMxLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDk0LDIyOCwKKyAgICAyMzksMjQ3LDExMCwxMjksICAwLDE5MSwxNjAsMTY4LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxOTEsCisgICAgMjMxLDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDEyNiwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LAorICAgIDEwMSwxMjgsMjU1LCAzMSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsIDYzLDIzOSwyNDQsMTAxLCAgNCwKKyAgICAxNjAsMjE2LDE2MSwgMzEsMTYxLCA1MSwxNjEsIDgwLDIyOCwyMjYsMTA4LDEzMywgIDAsIDM0LDE2MCwyMzIsCisgICAgMTYwLDIzOSwxNjAsMjQ2LDE2MSwgIDIsMTYxLCAyMywyMjYsMjI1LDI0MywxMDEsMTI4LCAzMiwgMzAsMjM2LAorICAgIDIyOSwyMzAsMTE2LDEyOCwgMzIsIDI4LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwKKyAgICAyNTUsICAyLDI0MCwyNDIsMjMzLDIzNywxMDEsMTI5LCA0OCwgMzAsMTYxLCAxMiwyNDIsMjI5LDI0NiwyMjksCisgICAgMjQyLDI0MywyMjksMTAwLDEyOCwgNDgsIDI5LDI0MiwyMzMsMjMxLDIzMiwxMTYsMTI4LCAzMiwgMjksMjM2LAorICAgIDIyOSwyMzAsMTE2LDEyOSwgMzIsIDI0LDE2MSwgNDAsMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwKKyAgICAxMjgsIDMyLCAyNywxMTQsICAyLDE2MSwgNTcsMTYxLCA2NywyMjksMjQ2LDIyOSwyNDIsMjQzLDIyOSwxMDAsCisgICAgMTI4LCAzMiwgMjcsMjMzLDIzMSwyMzIsMTE2LDEyOSwgMzIsIDI1LDE2MSwgNzYsMTEwLDEyOCwgIDEsIDczLAorICAgIDI0MywyMzMsMjM4LDIzMSwxMDgsICAyLDE2MSwgOTAsMTYxLCA5NywyMjYsMjI1LDI0MywxMDEsMTI4LCAzMiwKKyAgICAgMjYsMTAxLDEyOSwgIDAsIDM5LDE2MSwxMDMsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsCisgICAgMTI4LDI1NSwgIDcsMTE0LDE0NSwgIDAsMTE0LDE2MSwxNTMsMTYyLDE1NywxNjIsMTY4LDE2MiwyMTUsMTYzLAorICAgICAxMCwxNjQsIDI3LDE2NCwgNTEsMTY0LDE0NiwxNjYsMTgwLDE2NiwyMTcsMTY2LDIyOSwxNjcsIDI3LDE2NywKKyAgICAgMzUsMTY3LDE5NywxNjcsMjA4LDE2NywyNDMsMTY4LCA4NywgOTcsIDExLDE2MSwxNzcsMTYxLDE4OCwxNjEsCisgICAgMTk4LDE2MSwyMDUsMTYyLCAxNCwxNjIsIDMwLDE2MiwgNTUsMTYyLCA2NiwxNjIsIDkxLDE2MiwxMTQsMTYyLAorICAgIDE1MSwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsMTI0LDIyNiwyMjksMjM4LDIzMSwKKyAgICAyMjUsMjM2LDEwNSwxMjgsICA5LDE3NiwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMSwgODUsMTAwLCAgNCwxNjEsCisgICAgMjE1LDE2MSwyMjEsMTYxLDIzNSwxNjIsICA1LDIyOSwyNDYsIDk3LDEyOCwgIDksIDQ4LDIzMywyMjcsMjI1LAorICAgIDEwOCwxMjksIDM0LCAyNiwxNjEsMjMwLDIyOSwxMjAsMTI4LDI0OCwyMjksMjM5LDI0NiwyMjksMjQyLDI0MywKKyAgICAyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjksIDUxLDE3NCwxNjEsMjUxLDIyOCwyNDMsMjQxLDI0NSwyMjUsCisgICAgMjQyLDEwMSwxMjgsIDUxLDE3NSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE3MywyMzAsMTAxLAorICAgIDEyOSwgIDUsMTkxLDE2MiwgMjEsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxOTEsMjMxLDExNywKKyAgICAgIDIsMTYyLCAzNywxNjIsIDQ2LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTc2LDI0MiwyMzcsCisgICAgMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDQ4LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LAorICAgICA0OCwxMzcsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIzMywxNjIsIDc5LDIzMiwKKyAgICAyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTUxLDIzNiwyMzksMjQ3LDIyOSwyNDIsCisgICAgMjI4LDIzMywyMjUsMjMxLDIzOSwyMzgsMjI1LDIzNiwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LAorICAgICAgOSwyNDEsMTA5LCAgMiwxNjIsMTIwLDE2MiwxNDMsMjMzLDIyOCwyMjgsMjM2LDIyOSwyMjgsMjMzLDIyNSwKKyAgICAyMzEsMjM5LDIzOCwyMjUsMjM2LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDI0MCwyNDMsCisgICAgMjMyLDIzOSwyNDIsMTEwLDEyOCwgIDIsMTAwLDI0NCwyMzMsMTExLDEyOCwgMzQsIDU0LDIyNiwyMzksMjQwLAorICAgIDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgMjIsIDk5LCAgNCwxNjIsMTc4LDE2MiwxODUsMTYyLDE5NCwKKyAgICAxNjIsMjAyLDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLCA4OSwyMjksMjI4LDIzMywyMzYsMjM2LCA5NywxMjgsCisgICAgICAxLCA4NywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMjI1LDIzOSwyMzcsMjM3LDIyNSwyMjUsMjI3LAorICAgIDIyNywyMjksMjM4LDExNiwxMjgsICAxLCA4NywxMDAsICAyLDE2MiwyMjEsMTYyLDIzMSwyMjYsMjM2LDIzMSwKKyAgICAyNDIsMjI1LDI0NiwxMDEsMTI4LCAgMiwgMTcsMjM5LDExNiwgIDIsMTYyLDIzOCwxNjIsMjQ3LDIyNSwyMjcsCisgICAgMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsIDg5LDIyNiwyMjksMjM2LDIzOSwxMTksMTI5LCAzMCwgOTEsMTYzLAorICAgICAgMSwyMzcsMjI1LDIyNywyNDIsMjM5LDExMCwxMjgsIDMwLCA5MywxMDEsICA2LDE2MywgMjQsMTYzLCA2OSwKKyAgICAxNjMsMTA0LDE2MywxNTksMTYzLDE4NCwxNjMsMjE3LDEwMiwgIDIsMTYzLCAzMCwxNjMsIDQzLDIyOSwyNDIsCisgICAgMjI5LDIzOCwyMjcsMjI5LDIzNywyMjUsMjQyLDEwNywxMjgsIDMyLCA1OSwyMzYsMjI5LDI0OCwyNDMsMTE3LAorICAgICAgMiwxNjMsIDUzLDE2MywgNjAsMjI2LDI0MywyMjksMTE2LDEyOCwgMzQsMTM0LDI0MCwyMjksMjQyLDI0MywKKyAgICAyMjksMTE2LDEyOCwgMzQsMTM1LDIzMSwyMzMsMjQzLDI0NCwyMjksMTE0LCAgMiwxNjMsIDgwLDE2MywgODUsCisgICAgMjI5LDEwMCwxMjgsICAwLDE3NCwxMTUsICAyLDE2MywgOTEsMTYzLCA5NywyMjUsMjM4LDExNSwxMjgsMjQ4LAorICAgIDIzMiwyMjksMjQyLDIzMywxMDIsMTI4LDI0NiwyMTgsMTA0LCAgMywxNjMsMTEyLDE2MywxMzUsMTYzLDE0OSwKKyAgICAyMjUsMTE0LCAgMiwxNjMsMTE5LDE2MywxMjYsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDQ5LDIzNywyMjksCisgICAgMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsMTI4LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LAorICAgIDIzMywgOTksMTI4LDI1NCwxNzQsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTQwLDIzNSwKKyAgICAyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyMzYsMTYzLDE3MiwyMzIsMjI1LDIzNiwyMzAsCisgICAgMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDE1NCwyNDMsMTA0LDEzMCwgIDUsMjMyLDE2MywxOTMsMTYzLAorICAgIDIwOCwyMjgsMjI1LDIzMSwyMjksMjQzLDIzMiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA3MiwKKyAgICAyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIzMiwxMTgsICAzLDE2MywyMjUsMTYzLDIzOCwxNjQsCisgICAgIDE0LDIyOSwyNDIsMjQzLDIyOSwyMjgsMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjgsIDM0LCA2MSwyMzMsIDk3LAorICAgICAgMiwxNjMsMjQ1LDE2MywyNTQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNTEsMjM3LDI0NSwKKyAgICAyMzEsMjQyLDIyNSwyNDMsMjMyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTUxLDIzNiwyMzksCisgICAgMjMxLDIzMywyMjcsMjI1LDIzNiwyMzgsMjM5LDExNiwxMjgsIDM1LCAxNiwyMzAsMjMzLDI0MywyMzIsMjMyLAorICAgIDIzOSwyMzksMTA3LDEyOSwgIDIsMTI2LDE2NCwgNDAsMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwKKyAgICAxMjgsICAyLDEyNywxMDQsICAyLDE2NCwgNTcsMTY0LCA4MCwgOTcsICAyLDE2NCwgNjMsMTY0LCA3MywyMjYsCisgICAgMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMjEsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDkzLAorICAgIDExMSwxMzEsICAzLDE5MywxNjQsIDkwLDE2NCwxMTksMTY0LDEzMywyMzksMTA3LDEyOSwgIDIsMTI1LDE2NCwKKyAgICAgOTcsMjQ0LDI0NSwyNDIsMjM4LDIyOSwxMDAsMTI5LCAgMiwxMjMsMTY0LDEwOCwyNDMsMjQ1LDI0MCwyMjksCisgICAgMjQyLDIzMywyMzksMTE0LDEyOCwgIDIsMTgxLDI0MywyNDksMjM3LDIyNiwyMzksMjM2LDIzMSwyNDIsMjI5LAorICAgIDIyOSwxMDcsMTI4LCAgMywyNDEsMjQ0LDIzMywyMjcsMjMyLDIzOSwyMzksMjM1LDIzNywyMzksMTAwLDEyOCwKKyAgICAgIDIsMjIyLDEwNSwgIDYsMTY0LDE2MCwxNjUsMjA0LDE2NSwyNTAsMTY2LCAgNSwxNjYsIDMwLDE2NiwxNjYsCisgICAgMjI5LDI0NSwxMDgsICA5LDE2NCwxODIsMTY0LDIxNywxNjQsMjMyLDE2NCwyNDYsMTY1LCAzNiwxNjUsIDUwLAorICAgIDE2NSwxMzYsMTY1LDE0OSwxNjUsMTg0LCA5NywgIDIsMTY0LDE4OCwxNjQsMjAzLDIyNywyMzMsMjQyLDIyNywKKyAgICAyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsMTEzLDI0MCwyMjUsMjQyLDIyOSwyMzgsCisgICAgMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgMTcsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LAorICAgIDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgOTksMjMyLDIzMywyMjksMjQ1LDIzMiwyMzUsMjM5LDI0MiwKKyAgICAyMjksMjI1LDExMCwxMjgsIDQ5LCA2NCwxMDcsICAyLDE2NCwyNTIsMTY1LCAyOCwyMzMsMjQ5LDIyOSwyMzksCisgICAgMTA3LCAgMiwxNjUsICA2LDE2NSwgMTUsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNTgsMjQzLAorICAgIDIzMywyMzksMjQzLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTA1LDIzOSwyNDIsMjI5LDIyNSwKKyAgICAxMTAsMTI4LCA0OSwgNTcsMjM3LDIzMywyMjksMjQ1LDIzNywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsCisgICAgIDQ5LCA1OSwxMTIsICAzLDE2NSwgNTgsMTY1LCA5MCwxNjUsMTA1LCA5NywgIDIsMTY1LCA2NCwxNjUsIDc4LAorICAgIDIzOCwyNDMsMjMzLDIzOSwyNDMsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMDgsMjQyLDIyOSwKKyAgICAyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgIDMsMjMyLDIzMywyMjksMjQ1LDI0MCwyMzIsCisgICAgMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNjMsMjMzLDIyOSwyNDUsMTEyLCAgMiwxNjUsMTE0LAorICAgIDE2NSwxMjMsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNjAsMjQzLDIzMywyMzksMjQzLDIzNSwKKyAgICAyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTA3LDI0MywyMzMsMjM5LDI0MywyMzUsMjM5LDI0MiwyMjksCisgICAgMjI1LDExMCwxMjgsIDQ5LCA2MSwxMTYsICAyLDE2NSwxNTUsMTY1LDE3MCwyMzIsMjMzLDIyOSwyNDUsMjQ0LAorICAgIDIzMiwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA2MiwyMzMsMjM1LDIyOSwyNDUsMjQ0LDIzNSwKKyAgICAyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTA2LDI0OSwyMjksMjM5LDI0MiwyMzMsMjM4LDIzMiwyMzMsCisgICAgMjI5LDI0NSwyMzIsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMDksMjMxLDIzMiwxMTYsICAyLAorICAgIDE2NSwyMTIsMTY1LDIyMCwyMjUsMjM4LDIzMSwyMzYsMTAxLDEyOCwgMzQsIDMxLDExNiwgIDIsMTY1LDIyNiwKKyAgICAxNjUsMjQwLDIyNSwyMjcsMjM1LDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgMjUsCisgICAgMjQyLDIzMywyMjUsMjM4LDIzMSwyMzYsMTAxLDEyOCwgMzQsMTkxLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LAorICAgIDIzOCwgOTcsMTI4LCA0OCwxMzgsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIzNCwKKyAgICAxNjYsIDE4LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTUyLDExMCwgIDIsCisgICAgMTY2LCAzNiwxNjYsMTUyLDEwMywxMzEsICAyLDIxOCwxNjYsIDQ2LDE2NiwgNTcsMTY2LCA2MywyMjYsMjI5LAorICAgIDIzNiwyMzksMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDM3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDEwLDIzMiwKKyAgICAyMjUsMjM2LDEwMiwgIDIsMTY2LCA3MiwxNjYsMTE4LDIzNiwyMjksMjMwLDExNiwxMzEsICAyLDE5MSwxNjYsCisgICAgIDg1LDE2NiwgOTYsMTY2LDEwNywyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDg5LAorICAgIDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgMjgsMjI3LDIyOSwyMzgsMjQ0LDIyOSwKKyAgICAyNDIsMjI5LDEwMCwxMjgsICAyLDIxMSwyNDIsMjMzLDIzMSwyMzIsMTE2LDEzMCwgIDIsMTkwLDE2NiwxMzAsCisgICAgMTY2LDE0MSwyMjYsMjI5LDIzNiwyMzksMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDU3LDIyNywyMjksMjM4LAorICAgIDI0NCwyMjksMjQyLDIyOSwxMDAsMTI4LCAgMiwyMTAsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwyMjgsMjI2LDI0MiwKKyAgICAyMjksMjQ2LDEwMSwxMjgsICAyLCAxOSwyNDQsMjQ0LDIzOSwyNDIsMjQ1LDI0MywyNDEsMjQ1LDIyNSwyNDIsCisgICAgMTAxLDEyOCwgNTEsIDgxLDEwOCwgIDIsMTY2LDE4NiwxNjYsMTk3LDIzMywyMzgsMjI5LDIyNiwyMjksMjM2LAorICAgIDIzOSwxMTksMTI4LCAzMCwgOTUsMjM5LDIzOCwyMzEsMjM2LDIyOSwxMDMsMTI5LCAgMiwxMjQsMTY2LDIwOCwKKyAgICAyNDQsMjQ1LDI0MiwyMzgsMjI5LDEwMCwxMjgsICAyLDEyMiwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsCisgICAgMjI3LDEwMSwxMjgsMjU1LCA4MiwxMTEsICAzLDE2NiwyMzcsMTY2LDI0OCwxNjcsIDE3LDIzMiwyMzMsMjQyLAorICAgIDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxNDEsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywKKyAgICAxMjksIDQ4LDIzNywxNjcsICA1LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsCisgICAgMTU1LDI0MiwyNDUsMjI1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAzNSwyNDAsMjI1LDI0MiwyMjksMTEwLAorICAgIDEyOCwgMzYsMTczLDExNCwgIDMsMTY3LCA0MywxNjcsIDc5LDE2NywxMDksIDk3LCAgMywxNjcsIDUxLDE2NywKKyAgICAgNjEsMTY3LCA2OCwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMjAsMjI4LDIyOSwyNDYsCisgICAgIDk3LDEyOCwgIDksIDQ5LDIzMSwyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgOTIsMjI5LAorICAgIDEwNCwgIDIsMTY3LCA4NiwxNjcsIDk1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTQ1LDIzMCwKKyAgICAyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxNDEsMjQ2LDIzOSwyMjcsCisgICAgMjI1LDIzNiwyMzMsIDk5LCAgNCwxNjcsMTI1LDE2NywxMzUsMTY3LDE0MiwxNjcsMTUzLDIyNiwyMjksMjM4LAorICAgIDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIyNCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgOTYsMjMxLDI0NSwKKyAgICAyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDIyNCwyNDYsMjM5LDI0NywyMjksMjM2LDI0MywyMzMsCisgICAgMjMxLDExMCwgIDMsMTY3LDE2OSwxNjcsMTc5LDE2NywxODYsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LAorICAgIDEyOCwgIDksMTk2LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA2OCwyMzEsMjQ1LDIzNCwyMjUsMjQyLDIyNSwKKyAgICAyNDQsMTA1LDEyOCwgMTAsMTk2LDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LDI0NiwyNDEsCisgICAgMTE2LCAgMiwxNjcsMjE0LDE2NywyMjIsMjI2LDIzNiwyMzksMjI3LDEwNywxMjgsIDM3LDE0NCwyNDUsMjQyLAorICAgIDIzOCwyMjksMTAwLDEyOSwgIDIsMTIxLDE2NywyMzIsMjQzLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwKKyAgICAxMjgsICAyLDE4MCwxMTcsICA0LDE2NywyNTMsMTY4LCAgOCwxNjgsIDMzLDE2OCwgODAsMjMyLDIzMywyNDIsCisgICAgMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEzOSwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LAorICAgIDEyOSwgNDgsMjM1LDE2OCwgMjEsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwKKyAgICAxNTMsMTEyLCAgMiwxNjgsIDM5LDE2OCwgNzQsMjI5LDEwMSwgIDIsMTY4LCA0NiwxNjgsIDYwLDIzNywyMjUsCisgICAgMjQyLDIzNSwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyNDIsMjQzLDIzMywyMzEsMjM4LAorICAgIDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDI0MywyMzMsMjI1LDEwNCwxMjgsMjQ2LDIyMSwKKyAgICAyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgMzYsMjQ2LDIzOSwyMjcsMjI1LDIzNiwyMzMsIDk5LCAgNCwxNjgsCisgICAgMTAzLDE2OCwxMTMsMTY4LDEyMCwxNjgsMTMxLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LAorICAgIDEzOSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgMTEsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwKKyAgICAxMjgsIDEwLDEzOSwyNDYsMjM5LDI0NywyMjksMjM2LDI0MywyMzMsMjMxLDExMCwgIDMsMTY4LDE0NywxNjgsCisgICAgMTU3LDE2OCwxNjQsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTk1LDIyOCwyMjksMjQ2LAorICAgICA5NywxMjgsICA5LCA2NywyMzEsMjQ1LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTk1LDExNSwKKyAgICAxNDcsICAwLDExNSwxNjgsMjE3LDE3MCwxODcsMTcwLDE5OCwxNzEsIDY4LDE3MSwxMDcsMTc0LCA0OSwxNzQsCisgICAgIDYwLDE3NiwyMDMsMTc5LCA4NSwxNzksMTMxLDE3OSwxNTgsMTgwLCA5MywxODAsMTYwLDE4MSwxOTMsMTgxLAorICAgIDIwMywxODIsMTMzLDE4MiwyMDYsMTgzLDEyMCwxODMsMTMwLCA5NywgIDksMTY4LDIzNywxNjgsMjQ3LDE2OSwKKyAgICAgMTIsMTY5LCA4NCwxNjksMTA5LDE2OSwxMjAsMTY5LDE0NSwxNjksMTc3LDE2OSwyMTcsMjI2LDIyOSwyMzgsCisgICAgMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTg0LDIyNywyNDUsMjQ0LDEwMSwxMjksICAxLCA5MSwxNjksICAwLAorICAgIDIyOCwyMzksMjQ0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsMTAxLDEwMCwgIDUsMTY5LCAyNCwKKyAgICAxNjksIDMzLDE2OSwgMzksMTY5LCA1MywxNjksIDY5LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsCisgICAgIDUzLDIyOSwyNDYsIDk3LDEyOCwgIDksIDU2LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LAorICAgIDIzMywgOTksMTI4LDI1NCwxODYsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwKKyAgICAyMzMsIDk5LDEyOCwyNTQsMTg3LDIzNywyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsCisgICAgIDk5LDEyOCwyNTQsMTg4LDIzMSwxMTcsICAyLDE2OSwgOTEsMTY5LDEwMCwyMzQsMjI1LDI0MiwyMjUsMjQ0LAorICAgIDEwNSwxMjgsIDEwLDE4NCwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA1NiwyMzIsMjMzLDI0MiwKKyAgICAyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDg1LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsCisgICAgMTI5LCA0OCwxODEsMTY5LDEzMywyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LAorICAgIDEyMywyMzYsMjM2LDIyNSwyMzYsMjM2LDIyNSwyMzIsMjM5LDI0NSwyMjUsMjM2LDIyNSwyNDksMjMyLDIyOSwKKyAgICAyNDcsMjI1LDI0MywyMjUsMjM2LDIzNiwyMjUsMjM3LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTMsCisgICAgMjUwLDIzNywyMjksMjM1LDEwNCwxMzAsICA1LDIyNSwxNjksMTg4LDE2OSwyMDgsMjI4LDIyNSwyMzEsMjI5LAorICAgIDI0MywxMDQsMTI5LDI1MSwgNjUsMTY5LDE5OSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA2NSwKKyAgICAyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIyNSwyNDIsIDk3LCAgNSwxNjksMjMwLDE3MCwgNDgsCisgICAgMTcwLCA1NiwxNzAsMTA2LDE3MCwxMTQsIDk3LCAgNSwxNjksMjQyLDE2OSwyNTAsMTcwLCAgMiwxNzAsIDMzLAorICAgIDE3MCwgNDEsMjI1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA1MCwyMjksMjQ0LDIzMiwyMjUsMTA1LDEyOCwKKyAgICAgMTQsIDY1LDIzMywyMzcsMjI1LDIzMywxMDksICAyLDE3MCwgMTIsMTcwLCAyMywyMjUsMjM2LDIyNSwyMzMsCisgICAgMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDY4LDI0NSwyMjUsMjM4LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LAorICAgICA2NywyMzcsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDUxLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA0OCwKKyAgICAyMjksMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDY0LDEwNSwgIDMsMTcwLCA2NCwxNzAsIDg4LDE3MCwgOTksCisgICAgMTA1LCAgMiwxNzAsIDcwLDE3MCwgODEsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LAorICAgIDEzNCwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNTMsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LDEwNSwKKyAgICAxMjgsMjQ4LDEzMywyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNTIsMjM5LDI0NCwyMzIsMjI1LDEwNSwxMjgsCisgICAgIDE0LCA2NiwxMTcsICAzLDE3MCwxMjIsMTcwLDE3MiwxNzAsMTc5LDEwMSwgIDMsMTcwLDEzMCwxNzAsMTU0LAorICAgIDE3MCwxNjUsMTAxLCAgMiwxNzAsMTM2LDE3MCwxNDcsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LDEwNSwKKyAgICAxMjgsMjQ4LDEzNiwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNTUsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsCisgICAgMjI1LDEwNSwxMjgsMjQ4LDEzNSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNTQsMjQ0LDIzMiwyMjUsMTA1LAorICAgIDEyOCwgMTQsIDU2LDI0NSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNTcsMjI2LDIzOSwyNDAsMjM5LDIzNywKKyAgICAyMzksMjMwLDExMSwxMjgsIDQ5LCAyNSwgOTksICA1LDE3MCwyMTAsMTcwLDIzMSwxNzAsMjQwLDE3MSwgMzMsCisgICAgMTcxLCA1NSwyMjUsMjQyLDIzOSwxMTAsMTI5LCAgMSwgOTcsMTcwLDIxOSwyMjgsMjM5LDI0NCwyMjUsMjI3LAorICAgIDIyNywyMjksMjM4LDExNiwxMjgsIDMwLDEwMywyMjksMjI4LDIzMywyMzYsMjM2LCA5NywxMjgsICAxLCA5NSwKKyAgICAyMzIsMjQ3LCA5NywxMzEsICAyLCA4OSwxNzAsMjUyLDE3MSwgIDcsMTcxLCAyNiwyMjcsMjQ5LDI0MiwyMzMsCisgICAgMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjE3LDIyOCwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywyNDMsMjI3LAorICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDIxOSwyMzIsMjM5LDIzOSwxMDcsMTI4LCAgMiwKKyAgICAgOTAsMjMzLDI0MiwgOTksICAyLDE3MSwgNDEsMTcxLCA0NiwyMzYsMTAxLDEyOCwgMzYsMjI2LDI0NSwyMzcsCisgICAgMjMwLDIzNiwyMjksMTIwLDEyOCwgIDEsIDkzLDIzOSwyMzcsMjM3LDIyNSwyMjUsMjI3LDIyNywyMjksMjM4LAorICAgIDExNiwxMjgsICAyLCAyNSwyMjgsMjM5LDExNiwgIDIsMTcxLCA3NiwxNzEsIDg1LDIyNSwyMjcsMjI3LDIyOSwKKyAgICAyMzgsMTE2LDEyOCwgMzAsIDk3LDIyNiwyMjksMjM2LDIzOSwxMTksMTI5LCAzMCwgOTksMTcxLCA5NSwyMjgsCisgICAgMjM5LDI0NCwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsIDMwLDEwNSwxMDEsICA5LDE3MSwxMjcsMTcxLAorICAgIDE0MywxNzEsMTc4LDE3MSwyNDMsMTcyLCA5MCwxNzIsMTE3LDE3MiwxNDIsMTcyLDIyMywxNzIsMjUwLDIyNSwKKyAgICAyMzEsMjQ1LDIzNiwyMzYsMjI2LDIyOSwyMzYsMjM5LDI0NywyMjcsMjM3LCA5OCwxMjgsICAzLCA2MCwgOTksCisgICAgICAyLDE3MSwxNDksMTcxLDE3MSwyMzksMjM4LDEwMCwxMjksIDMyLCA1MSwxNzEsMTU3LDI0NCwyMzksMjM4LAorICAgIDIyOSwyMjcsMjMyLDIzMywyMzgsMjI5LDI0MywxMDEsMTI4LCAgMiwyMDIsMjQ0LDIzMywyMzksMTEwLDEyOCwKKyAgICAgIDAsMTY3LDIyOSwxMTAsICA0LDE3MSwxODksMTcxLDE5OCwxNzEsMjEyLDE3MSwyMjgsMjI1LDI0MiwyMjUsCisgICAgMjI2LDIzMywgOTksMTI4LCAgNiwgNTEsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLAorICAgICA5OSwxMjgsMjU0LDE3OCwyMzMsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywKKyAgICAgOTksMTI4LDI1NCwxNzksMjM3LDIyOSwyMjgsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksCisgICAgMTI4LDI1NCwxODAsMjMxLDIzOSwxMDgsMTM1LCAgNSwxODIsMTcyLCAgNywxNzIsIDIxLDE3MiwgMjYsMTcyLAorICAgICAzNSwxNzIsIDUwLDE3MiwgNjYsMTcyLCA3NywgNDksICAyLDE3MiwgMTMsMTcyLCAxNywgNTEsMTI4LCAgNSwKKyAgICAxODIsMTAyLDEyOCwgIDUsMTgyLDE3OCwgOTksMTI4LCAgNSwxODIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksCisgICAgMTI4LCAgNSwxODIsMjM4LDIyNSwyNDIsMjQyLDIzOSwyNDcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAorICAgICAgNSwxODIsMjQxLDI0NSwyMjUsMjQyLDI0NCwyMjksMjQyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwKKyAgICAgIDUsMTgyLDI0NCwyMjUsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNDYsMjQ3LDIzMywyMjgsCisgICAgMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTgyLDEwNCwgIDIsMTcyLCA5NiwxNzIsMTA3LAorICAgIDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMjUsMjMzLDI0MiwyMjUsMjMxLDIyNSwKKyAgICAyMzgsIDk3LDEyOCwgNDgsIDkxLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwxODcsCisgICAgMTcyLDEzMCwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEyNiwyMzcsMTA1LAorICAgICAgMiwxNzIsMTQ5LDE3MiwxOTIsMjI3LDIzOSwyMzYsMjM5LDExMCwxMzEsICAwLCA1OSwxNzIsMTYzLDE3MiwKKyAgICAxNzIsMTcyLDE4NCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCAyNywyMzcsMjM5LDIzOCwyMzksCisgICAgMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAyNywyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsIDg0LAorICAgIDI0NiwyMzksMjMzLDIyNywyMjksMjI4LDIzNywyMjUsMjQyLDIzNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwKKyAgICAxNTYsMTcyLDIxMSwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDE1OSwyMzgsCisgICAgMTE2LCAgMiwxNzIsMjMwLDE3MiwyNDAsMjMzLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDM0LAorICAgIDIzOSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCAzNSwyNDYsMjI5LDExMCwxNDIsICAwLCA1NSwKKyAgICAxNzMsIDI4LDE3MywgMzcsMTczLCA0NywxNzMsIDc3LDE3MywgODQsMTczLCA5NCwxNzMsMTE5LDE3MywxNDYsCisgICAgMTczLDE4MCwxNzMsMTkyLDE3MywyMDMsMTczLDIzNiwxNzMsMjQ0LDE3MywyNTUsMjI1LDI0MiwyMjUsMjI2LAorICAgIDIzMywgOTksMTI4LCAgNiwxMDMsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjM3LDIyNywKKyAgICAyMzMsMjQyLDIyNywyMzYsMTAxLDEyOSwgMzYsMTAyLDE3MywgNTgsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDMsCisgICAgMjI5LDI0MywyMjUsMjM4LDI0MywyNDMsMjI5LDI0MiwyMzMsMTAyLDEyOCwgMzksMTQ0LDIyOCwyMjksMjQ2LAorICAgICA5NywxMjgsICA5LDEwOSwyMjksMjMzLDIzMSwyMzIsMjQ0LDIzMiwxMTUsMTI4LCAzMywgOTQsMjMxLDExNywKKyAgICAgIDIsMTczLDEwMSwxNzMsMTEwLDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMjM3LDI0MiwyMzcsCisgICAgMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsMTA5LDIzMiwgOTcsICAyLDE3MywxMjYsMTczLDEzNywyMjcsMjM1LAorICAgIDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTAzLDIzOCwyMzEsMjUwLDIzMiwyMzksMTE3LDEyOCwKKyAgICAgNDgsIDM5LDEwNSwgIDIsMTczLDE1MiwxNzMsMTcwLDIyOCwyMjksMjM5LDIzMSwyNDIsMjI1LDI0MCwyMzIsCisgICAgMjMzLDIyNywyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDM4LDIzOCwyMzAsMjI5LDI0MiwyMzMsMjM5LAorICAgIDExNCwxMjgsIDMyLDEzNSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAyMywKKyAgICAyMzksMjM2LDIyOCwyNDMsMjQ0LDI0OSwyMzYsMTAxLDEyOCwyNDcsIDU1LDExMiwgIDIsMTczLDIwOSwxNzMsCisgICAgMjE2LDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDEyMiwyMjksMTE0LCAgMiwxNzMsMjIzLDE3MywyMjksMjMzLAorICAgIDIzOSwxMDAsMTI4LCAzNiwxNDIsMjQzLDIzMywyMjUsMTEwLDEyOCwgIDYsMjQ3LDI0MiwyMzksMjM3LDIyNSwKKyAgICAxMTAsMTI4LCAzMywxMTgsMjQzLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLDExOSwxMTYsCisgICAgICAyLDE3NCwgIDUsMTc0LCA0MywyMjksMjI5LDExMCwgIDIsMTc0LCAxMywxNzQsIDIyLDIyNywyMzMsMjQyLAorICAgIDIyNywyMzYsMTAxLDEyOCwgMzYsMTEyLDExMiwgIDIsMTc0LCAyOCwxNzQsIDM1LDIyNSwyNDIsMjI5LDExMCwKKyAgICAxMjgsIDM2LDEzMiwyMjksMjQyLDIzMywyMzksMTAwLDEyOCwgMzYsMTUyLDIzMiwyMjUsMTA1LDEyOCwgMTQsCisgICAgIDg3LDIzMCwyNDQsMjMyLDI0OSwyNDAsMjMyLDIyOSwxMTAsMTI4LCAgMCwxNzMsMTA0LCAgNywxNzQsIDc2LAorICAgIDE3NSwgNTAsMTc1LCA2MSwxNzUsIDc1LDE3NiwgMjAsMTc2LCAzMywxNzYsMTk3LCA5NywgIDYsMTc0LCA5MCwKKyAgICAxNzQsMTAxLDE3NCwxMTEsMTc0LDEyMiwxNzUsICA5LDE3NSwgMzQsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsCisgICAgMjI1LDExMCwxMjgsICA1LDExOSwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxODIsMjI3LAorICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA3MiwxMDAsICAyLDE3NCwxMjgsMTc0LDIyNCwKKyAgICAyMjgsIDk3LCAgNCwxNzQsMTM5LDE3NCwxNDgsMTc0LDE3OSwxNzQsMTkzLDIyNSwyNDIsMjI1LDIyNiwyMzMsCisgICAgIDk5LDEyOCwgIDYsIDgxLDIyOCwyMjUsMjM3LDIzNywgOTcsICAyLDE3NCwxNTgsMTc0LDE2NywyMjUsMjQyLAorICAgIDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLCA5NywyNDQsMjI1LDIzOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwKKyAgICAxMjgsMjUyLCA5NCwyMzAsMjI1LDI0NCwyMzIsMjI1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsCisgICAgIDk2LDIzNSwyMjUsMjQzLDI0MiwgOTcsICAyLDE3NCwyMDMsMTc0LDIxMiwyMjUsMjQyLDIyNSwyMjYsMjMzLAorICAgICA5OSwxMjgsMjUyLCA5OCwyNDQsMjI1LDIzOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLCA5NSwKKyAgICAxMDEsMTMyLCAzNywxNDYsMTc0LDIzNiwxNzQsMjQzLDE3NCwyNTEsMTc1LCAgNCwyMjgsMjI1LDI0MiwxMDcsCisgICAgMTI4LCAzNywxNDcsMjM2LDIzMywyMzEsMjMyLDExNiwxMjgsIDM3LDE0NSwyMzcsMjI5LDIyOCwyMzMsMjQ1LAorICAgIDEwOSwxMjgsIDM3LDE0NiwyNDYsIDk3LDEyOCwgIDksIDU0LDIzMSwxMTcsICAyLDE3NSwgMTYsMTc1LCAyNSwKKyAgICAyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE4MiwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsCisgICAgIDEwLCA1NCwyMzYsMjQzLDIzMiwyMjksMjM2LDIyOSwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAorICAgICAgNSwxNDcsMjI2LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAyMSwyMjcsMjMyLDIyNSwKKyAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDczLDEwMSwgIDQsMTc1LCA4NSwxNzUsCisgICAgMTUwLDE3NSwxNjAsMTc1LDE3NywyMjksMTEwLCAgNCwxNzUsIDk2LDE3NSwxMDUsMTc1LDExOSwxNzUsMTM1LAorICAgIDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDUyLDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwKKyAgICAyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxODIsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsCisgICAgMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTgzLDIzNywyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LAorICAgIDIyNiwyMzMsIDk5LDEyOCwyNTQsMTg0LDIzMywyMjcsMjM5LDI0MCwyNDQsMjMzLCA5OSwxMjgsICAzLDIyNywKKyAgICAyNDEsMjI5LDEwOCwxMjksIDMyLDE3MCwxNzUsMTY4LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgMzIsCisgICAgMTcwLDI0NiwgOTcsMTM0LCAgNSwxNzYsMTc1LDE5NCwxNzUsMjA5LDE3NSwyMjMsMTc1LDIzMiwxNzUsMjQ3LAorICAgIDE3NiwgIDcsIDQ5LCAgMiwxNzUsMjAwLDE3NSwyMDUsMTc3LCA1MywxMjgsICA1LDE3NiwgNTMsMTI4LCAgNSwKKyAgICAxNzYsIDUwLCAgMiwxNzUsMjE1LDE3NSwyMTksIDUwLDEyOCwgIDUsMTc2LDEwMSwxMjgsICA1LDE3NiwyMzIsCisgICAgMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3NiwyMzgsMjI1LDI0MiwyNDIsMjM5LDI0NywyMzIsMjI5LAorICAgIDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3NiwyNDEsMjQ1LDIyNSwyNDIsMjQ0LDIyOSwyNDIsMjMyLDIyOSwKKyAgICAyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNzYsMjQ3LDIzMywyMjgsMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksCisgICAgMTE5LDEyOCwgIDUsMTc2LDIzMiwyMjUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAorICAgIDE4NywxMDUsICAyLDE3NiwgMzksMTc2LCA1MCwyMzcsMjI1LDIyNywyMzksMjQwLDI0NCwyMzMsIDk5LDEyOCwKKyAgICAgIDMsMjM3LDExMCwxMzEsICA1LDIzMywxNzYsIDYwLDE3NiwxNDMsMTc2LDE1MiwxMDAsICAyLDE3NiwgNjYsCisgICAgMTc2LDEzMiwyMjUsMjMxLDIyOSwyNDMsMTA0LDEzMCwyNTEsIDczLDE3NiwgNzgsMTc2LCA4NywyMzIsMjI5LAorICAgIDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA3MywxMTUsICAyLDE3NiwgOTMsMTc2LDExMywyMzIsMjMzLDIzOCwKKyAgICAyMjgsMjM5LDExNiwxMjksMjUxLCA0NCwxNzYsMTA0LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsCisgICAgIDQ0LDIzMywyMzgsMjI4LDIzOSwxMTYsMTI5LDI1MSwgNDUsMTc2LDEyMywyMzIsMjI5LDIyNiwyNDIsMjI5LAorICAgIDExOSwxMjgsMjUxLCA0NSwyMzksMjQ0LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTkzLDIzMiwKKyAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjMzLDExNSwgIDIsMTc2LDE1OCwxNzYsMTc4LDIzMiwyMzMsCisgICAgMjM4LDIyOCwyMzksMTE2LDEyOSwyNTEsIDQyLDE3NiwxNjksMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAorICAgIDI1MSwgNDIsMjMzLDIzOCwyMjgsMjM5LDExNiwxMjksMjUxLCA0MywxNzYsMTg4LDIzMiwyMjksMjI2LDI0MiwKKyAgICAyMjksMTE5LDEyOCwyNTEsIDQzLDIzOSwyMzksMTA3LDEyOCwgIDIsMTMwLDEwNSwgIDgsMTc2LDIyMSwxNzcsCisgICAgICA5LDE3NywgMjAsMTc3LCA0NSwxNzcsIDc1LDE3NywgODMsMTc3LCA5NiwxNzgsIDExLDIzMSwyMzcsIDk3LAorICAgIDEzMSwgIDMsMTk1LDE3NiwyMzMsMTc2LDIzNywxNzYsMjQ1LCA0OSwxMjgsICAzLDE5NCwyMzAsMjMzLDIzOCwKKyAgICAyMjUsMTA4LDEyOCwgIDMsMTk0LDIzNiwyNDUsMjM4LDIyNSwyNDQsMjI5LDI0MywyNDksMjM3LDIyNiwyMzksCisgICAgMjM2LDIzMSwyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywyNDIsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LAorICAgICA5NywxMjgsIDQ4LCA4NywyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMTgzLDE3NywKKyAgICAgMzMsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMjQsMjM2LDI0NSwxMTMsCisgICAgICAyLDE3NywgNTMsMTc3LCA2MiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4OSwyMzYsMjI5LAorICAgIDIzMCwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODksMjM3LDIzMywyMzYsMjI1LDExNCwKKyAgICAxMjgsIDM0LCA2MCwyMzgsMjI4LDIzOSwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxOTQsCisgICAgMjM5LDExNSwgIDYsMTc3LDExMSwxNzcsMTQ2LDE3NywxNzgsMTc3LDIwNiwxNzcsMjIwLDE3NywyNTIsIDk3LAorICAgICAgMiwxNzcsMTE3LDE3NywxMzIsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwKKyAgICAxMTAsMTI4LCA1MCwxMTYsMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsCisgICAgIDUwLCAyMCwyMjcsMTA1LCAgMiwxNzcsMTUzLDE3NywxNjUsMjI5LDI0NSwyMjcsMjM1LDIzOSwyNDIsMjI5LAorICAgIDIyNSwxMTAsMTI4LCA0OSwxMjYsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwKKyAgICAgNTAsMTAyLDEwNywgIDIsMTc3LDE4NCwxNzcsMTk4LDIzMywyNDksMjI5LDIzOSwyMzUsMjM1LDIzOSwyNDIsCisgICAgMjI5LDIyNSwxMTAsMTI4LCA0OSwxMjIsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA2OSwyMzgsMjMzLAorICAgIDIyOSwyNDUsMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTIzLDExMiwgIDIsMTc3LDIyNiwKKyAgICAxNzcsMjM5LDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAgNiwyMzMsCisgICAgMjI5LDI0NSwyNDAsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMjUsMjQ0LDIzMywyMzUsMjI5LAorICAgIDI0NSwyNDQsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMjQsMTIwLDE0MSwgIDAsIDU0LDE3OCwKKyAgICAgNDEsMTc4LCA1MCwxNzgsIDYwLDE3OCwgOTAsMTc4LCA5NywxNzgsMTIyLDE3OCwxNDksMTc4LDE4MywxNzgsCisgICAgMTk1LDE3OCwyMDYsMTc4LDIzOSwxNzgsMjQ3LDE3OSwgIDIsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LAorICAgICAgNiwxMDIsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjM2LDIyNywyMzMsMjQyLDIyNywKKyAgICAyMzYsMTAxLDEyOSwgMzYsMTAxLDE3OCwgNzEsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDMsMjI5LDI0MywyMjUsCisgICAgMjM4LDI0MywyNDMsMjI5LDI0MiwyMzMsMTAyLDEyOCwgMzksMTQzLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LAorICAgIDEwOCwyMzEsMTE3LCAgMiwxNzgsMTA0LDE3OCwxMTMsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwKKyAgICAyMzYsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwxMDgsMjMyLCA5NywgIDIsMTc4LDEyOSwxNzgsCisgICAgMTQwLDIyNywyMzUsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxMDIsMjM4LDIzMSwyNTAsMjMyLAorICAgIDIzOSwxMTcsMTI4LCA0OCwgMzgsMTA1LCAgMiwxNzgsMTU1LDE3OCwxNzMsMjI4LDIyOSwyMzksMjMxLDI0MiwKKyAgICAyMjUsMjQwLDIzMiwyMzMsMjI3LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgMzcsMjM4LDIzMCwyMjksCisgICAgMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsMTM0LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLAorICAgIDEyOCwyNTUsIDIyLDIzOSwyMzYsMjI4LDI0MywyNDQsMjQ5LDIzNiwxMDEsMTI4LDI0NywgNTQsMTEyLCAgMiwKKyAgICAxNzgsMjEyLDE3OCwyMTksMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTIxLDIyOSwxMTQsICAyLDE3OCwyMjYsCisgICAgMTc4LDIzMiwyMzMsMjM5LDEwMCwxMjgsIDM2LDE0MSwyNDMsMjMzLDIyNSwxMTAsMTI4LCAgNiwyNDYsMjQyLAorICAgIDIzOSwyMzcsMjI1LDExMCwxMjgsIDMzLDExNywyNDMsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwKKyAgICAgMzIsMTE4LDExNiwgIDIsMTc5LCAgOCwxNzksIDc5LDIyOSwyMjksMTEwLCAgMiwxNzksIDE2LDE3OSwgNTgsCisgICAgIDk5LCAgMiwxNzksIDIyLDE3OSwgMzAsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM2LDExMSwyNDUsMjQyLAorICAgIDI0MiwyMjksMjM4LDIyNywyNDksMjI4LDIyOSwyMzgsMjM5LDIzNywyMzMsMjM4LDIyNSwyNDQsMjM5LDI0MiwKKyAgICAyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyNDksMTEyLCAgMiwxNzksIDY0LDE3OSwgNzEsCisgICAgMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTMxLDIyOSwyNDIsMjMzLDIzOSwxMDAsMTI4LCAzNiwxNTEsMjMyLAorICAgIDIyNSwxMDUsMTI4LCAxNCwgODYsMTA4LCAgMiwxNzksIDkxLDE3OSwxMTEsMjI1LDI0MywxMDQsMTI5LCAgMCwKKyAgICAgNDcsMTc5LCA5OSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAxNSwyMzksCisgICAgMjM4LDEwMywxMjksICAxLDEyNywxNzksMTE5LDIyOCwyMzksMjQ0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LAorICAgIDEyOCwgMzAsMTU1LDEwOSwgIDIsMTc5LDEzNywxNzksMTQ3LDIzMywyMzYsMjI5LDIzMCwyMjUsMjI3LDEwMSwKKyAgICAxMjgsIDM4LCA1OCwyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDgzLDExMSwgIDYsCisgICAgMTc5LDE3MiwxNzksMjIyLDE3OSwyMzMsMTgwLCAgMiwxODAsIDQ3LDE4MCwgNTgsMTAyLCAgMiwxNzksMTc4LAorICAgIDE3OSwxOTIsMjQwLDIyNSwyNDMsMjQ1LDI0MSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE5NSwKKyAgICAxMTYsICAyLDE3OSwxOTgsMTc5LDIwNywyMzIsMjQ5LDI0MCwyMzIsMjI5LDExMCwxMjgsICAwLDE3MywyNDMsCisgICAgMjMzLDIzMSwyMzgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA3NiwyMzIsMjMzLAorICAgIDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDkzLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwKKyAgICAgOTcsMTI5LCA0OCwxODksMTc5LDI0NiwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsCisgICAgMjU1LDEyNywyMzYsMjMzLDIyOCwyNDUsMTE1LCAgMiwxODAsIDEyLDE4MCwgMjksMjM2LDIzOSwyMzgsMjMxLAorICAgIDIzOSwyNDYsMjI5LDI0MiwyMzYsMjI1LDI0OSwyMjcsMjM3LCA5OCwxMjgsICAzLCA1NiwyNDMsMjMyLDIzOSwKKyAgICAyNDIsMjQ0LDIzOSwyNDYsMjI5LDI0MiwyMzYsMjI1LDI0OSwyMjcsMjM3LCA5OCwxMjgsICAzLCA1NSwyNDIsCisgICAgMjQ1LDI0MywyMzMsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDQxLDExNSwgIDMsMTgwLCA2NiwxODAsIDc2LAorICAgIDE4MCwgODQsMjI1LDIzNiwyMjUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDQwLDIzOSwyNDQsMjMyLDIyNSwKKyAgICAxMDUsMTI4LCAxNCwgMTEsMjQ1LDIyNSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNDIsMjQwLCA5NywgIDMsCisgICAgMTgwLDEwMiwxODAsMTIyLDE4MCwxNTQsMjI3LDEwMSwxMjksICAwLCAzMiwxODAsMTA5LDIzMiwyMjUsMjI3LAorICAgIDIzNSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICAwLCAzMiwyMjgsMTAxLDEyOSwgMzgsIDk2LDE4MCwKKyAgICAxMjksMjQzLDI0NSwyMzMsMTE2LCAgMiwxODAsMTM4LDE4MCwxNDYsMjI2LDIzNiwyMjUsMjI3LDEwNywxMjgsCisgICAgIDM4LCA5NiwyNDcsMjMyLDIzMywyNDQsMTAxLDEyOCwgMzgsMTAwLDI0MiwyMjksMTEwLDEyOCwgMzYsMTc0LAorICAgIDI0MSwyNDUsMjI1LDI0MiwxMDEsIDExLDE4MCwxODgsMTgwLDE5OSwxODAsMjEzLDE4MCwyMzgsMTgwLDI1NSwKKyAgICAxODEsIDI1LDE4MSwgNDAsMTgxLCA3MywxODEsMTAwLDE4MSwxNTYsMTgxLDE3MSwyMjYsMjI5LDIzNiwyMzksCisgICAgMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDU5LCA5OSwgIDIsMTgwLDIwNSwxODAsMjA5LCA5OSwxMjgsIDUxLAorICAgIDE5NiwxMDksMTI4LCA1MSwxNTcsMjI4LDIzMywyMjUsMjMxLDIzOSwyMzgsMjI1LDIzNiwyMjcsMjQyLDIzOSwKKyAgICAyNDMsMjQzLDIzMiwyMjUsMjQ0LDIyNywyMzIsMjMwLDIzMywyMzYsMTA4LDEyOCwgMzcsMTY5LDIzMiwyMzksCisgICAgMjQyLDIzMywyNTAsMjM5LDIzOCwyNDQsMjI1LDIzNiwyMzAsMjMzLDIzNiwxMDgsMTI4LCAzNywxNjQsMTA3LAorICAgICAgMiwxODEsICA1LDE4MSwgIDksMTAzLDEyOCwgNTEsMTQzLDEwOSwxMjksIDUxLDE1OCwxODEsIDE1LDIyNywKKyAgICAyMjUsMjQwLDIzMywyNDQsMjI1LDEwOCwxMjgsIDUxLDIwNiwxMDgsICAyLDE4MSwgMzEsMTgxLCAzNSwxMTAsCisgICAgMTI4LCA1MSwyMDksMjM5LDEwMywxMjgsIDUxLDIxMCwxMDksICA0LDE4MSwgNTAsMTgxLCA1NCwxODEsIDU5LAorICAgIDE4MSwgNjMsMTAzLDEyOCwgNTEsMTQyLDIzMywxMDgsMTI4LCA1MSwyMTMsMTA5LDEyOCwgNTEsMTU2LDI0MywKKyAgICAyNDEsMjQ1LDIyNSwyNDIsMjI5LDEwMCwxMjgsIDUxLDE2MSwyMzksMjQyLDI0NCwyMzIsMjM5LDIzMSwyMzksCisgICAgMjM4LDIyNSwyMzYsMjI3LDI0MiwyMzksMjQzLDI0MywyMzIsMjI1LDI0NCwyMjcsMjMyLDIzMCwyMzMsMjM2LAorICAgIDEwOCwxMjgsIDM3LDE2NiwyNDUsMjQwLDI0MCwyMjksMTE0LCAgMiwxODEsMTEwLDE4MSwxMzMsMjM2LDIyOSwKKyAgICAyMzAsMjQ0LDI0NCwyMzksMjM2LDIzOSwyNDcsMjI5LDI0MiwyNDIsMjMzLDIzMSwyMzIsMjQ0LDIzMCwyMzMsCisgICAgMjM2LDEwOCwxMjgsIDM3LDE2NywyNDIsMjMzLDIzMSwyMzIsMjQ0LDI0NCwyMzksMjM2LDIzOSwyNDcsMjI5LAorICAgIDI0MiwyMzYsMjI5LDIzMCwyNDQsMjMwLDIzMywyMzYsMTA4LDEyOCwgMzcsMTY4LDI0NiwyMjksMjQyLDI0NCwKKyAgICAyMzMsMjI3LDIyNSwyMzYsMjMwLDIzMywyMzYsMTA4LDEyOCwgMzcsMTY1LDI0NywyMzIsMjMzLDI0NCwyMjksCisgICAgMjQ3LDIzMywyNDQsMjMyLDI0MywyMzcsMjI1LDIzNiwyMzYsMjI2LDIzNiwyMjUsMjI3LDEwNywxMjgsIDM3LAorICAgIDE2MywyNDIsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwyMTksMTE1LCAgMiwxODEsMjA5LDE4MiwKKyAgICAxMjMsIDk3LCAgNCwxODEsMjE5LDE4MSwyMjksMTgxLDIzNiwxODEsMjQ3LDIyNiwyMjksMjM4LDIzMSwyMjUsCisgICAgMjM2LDEwNSwxMjgsICA5LDE4MywyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNTUsMjMxLDI0NSwyMzQsMjI1LAorICAgIDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE4MywyMzgsMTAzLCAgOCwxODIsIDEwLDE4MiwgMjQsMTgyLCAzOCwKKyAgICAxODIsIDUyLDE4MiwgNjcsMTgyLCA4MSwxODIsIDk1LDE4MiwxMDgsMjI3LDIzMywyMjksMjQ1LDIyNywyMzUsCisgICAgMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA3MywyMzIsMjMzLDIyOSwyNDUsMjMyLDIzNSwyMzksMjQyLAorICAgIDIyOSwyMjUsMTEwLDEyOCwgNDksMTMzLDIzMywyMjksMjQ1LDIzOCwyMzEsMjM1LDIzOSwyNDIsMjI5LDIyNSwKKyAgICAxMTAsMTI4LCA0OSwxMjgsMjM1LDIzMywyNDksMjI5LDIzOSwyMzUsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsCisgICAgMTI4LCA0OSwgNTAsMjM4LDIzMywyMjksMjQ1LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LAorICAgIDEwMSwyNDAsMjMzLDIyOSwyNDUsMjQwLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDY3LDI0MywKKyAgICAyMzMsMjM5LDI0MywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA3MCwyNDQsMjMzLDIzNSwyMjksCisgICAgMjQ1LDI0NCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA1NiwyNDUsMjQwLDIyOSwyNDIsMjMzLAorICAgIDIzOSwxMTQsMTI4LDI0NiwyNDIsMTE2LCAgMiwxODIsMTM5LDE4MiwxNjIsMjI5LDI0MiwyMzYsMjMzLDIzOCwKKyAgICAxMDMsMTI5LCAgMCwxNjMsMTgyLDE1MCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsCisgICAgMjU1LDIyNSwyNDIsMjM5LDIzNSwxMDEsICAyLDE4MiwxNzEsMTgyLDE4OCwyMzYsMjM5LDIzOCwyMzEsMjM5LAorICAgIDI0NiwyMjksMjQyLDIzNiwyMjUsMjQ5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDU0LDI0MywyMzIsMjM5LDI0MiwKKyAgICAyNDQsMjM5LDI0NiwyMjksMjQyLDIzNiwyMjUsMjQ5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDUzLDExNywgIDcsCisgICAgMTgyLDIyMiwxODIsMjU0LDE4MywgMjAsMTgzLCAzMSwxODMsIDcyLDE4MywgODIsMTgzLCA4NiwyMjYsMjQzLAorICAgIDIyOSwxMTYsMTMwLCAzNCwxMzAsMTgyLDIzMywxODIsMjQ0LDIzOCwyMzksMjQ0LDIyOSwyNDEsMjQ1LDIyNSwKKyAgICAxMDgsMTI4LCAzNCwxMzgsMjM5LDI0MiwyMjksMjQxLDI0NSwyMjUsMTA4LDEyOCwgMzQsMTM0LCA5OSwgIDIsCisgICAgMTgzLCAgNCwxODMsIDEyLDIyNywyMjksMjI5LDIyOCwxMTUsMTI4LCAzNCwxMjMsMjMyLDI0NCwyMzIsMjI1LAorICAgIDExNiwxMjgsIDM0LCAxMSwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDg5LDEwNywKKyAgICAgIDIsMTgzLCAzNywxODMsIDYxLDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDE4NSwxODMsCisgICAgIDQ5LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTI1LDI0NSwyMzgsMjI1LAorICAgIDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgODIsMjM3LDIzNywyMjUsMjQ0LDIzMywyMzksMTEwLDEyOCwKKyAgICAgMzQsIDE3LDExMCwxMjgsIDM4LCA2MCwyNDAsMjI5LDI0MiwyNDMsMjI5LDExNiwxMzAsIDM0LDEzMSwxODMsCisgICAgIDk5LDE4MywxMTAsMjM4LDIzOSwyNDQsMjI5LDI0MSwyNDUsMjI1LDEwOCwxMjgsIDM0LDEzOSwyMzksMjQyLAorICAgIDIyOSwyNDEsMjQ1LDIyNSwxMDgsMTI4LCAzNCwxMzUsMjQ2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwKKyAgICAgNTEsMjIwLDI0OSwyMzksMjQ1LDI0NywyMjUsMjI5LDI0MiwyMjUsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsCisgICAgMTI4LCA1MSwxMjQsMTE2LDE0NCwgIDAsMTE2LDE4MywxODMsMTg0LDE5MiwxODQsMjEzLDE4NSwxMDAsMTg1LAorICAgIDE0MCwxODcsMTg4LDE5MSwgNzAsMTkyLDE0NSwxOTIsMTU3LDE5MiwxNjksMTkzLDIwMiwxOTMsMjI3LDE5NCwKKyAgICAgNTcsMTk0LDIzNywxOTUsMTY1LDE5NSwyNTUsIDk3LCAxMCwxODMsMjA1LDE4MywyMTUsMTgzLDIzNiwxODMsCisgICAgMjQzLDE4NCwgMTIsMTg0LCA5MCwxODQsMTA3LDE4NCwxMzIsMTg0LDE0NiwxODQsMTUwLDIyNiwyMjksMjM4LAorICAgIDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE2NCwyMjcsMTA3LCAgMiwxODMsMjIyLDE4MywyMjksMjI4LDIzOSwKKyAgICAyNDcsMTEwLDEyOCwgMzQsMTY0LDIzNiwyMjksMjMwLDExNiwxMjgsIDM0LDE2MywyMjgsMjI5LDI0NiwgOTcsCisgICAgMTI4LCAgOSwgMzYsMjMxLDExNywgIDIsMTgzLDI1MCwxODQsICAzLDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LAorICAgIDEyOCwgMTAsMTY0LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDM2LDEwNCwgIDQsMTg0LCAyMiwKKyAgICAxODQsIDMxLDE4NCwgNDUsMTg0LCA3NSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA1NSwyMzAsCisgICAgMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTk0LDEwNSwgIDIsMTg0LAorICAgICA1MSwxODQsIDY2LDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwKKyAgICAyNTQsMTk1LDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDk1LDIzNywyMjksMjI4LDIzMywyMjUsCisgICAgMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTk2LDIzMywyNDMsMjQ5LDIzOSwyNDUsMjI5LAorICAgIDI0MiwyMjUsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxMjUsMjM1LDIyNSwyNDQsMjI1LDIzNSwKKyAgICAyMjUsMjM4LCA5NywxMjksIDQ4LDE5MSwxODQsMTIwLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsCisgICAgMTA0LDEyOCwyNTUsMTI4LDI0NCwyNDcsMjI5LDIyOSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LAorICAgICAgNiwgNjQsMTE3LDEyOCwgIDMsMTk2LDExOCwxMzAsICA1LDIzNCwxODQsMTU4LDE4NCwxODMsMjI4LDIyNSwKKyAgICAyMzEsMjI5LDExNSwxMjksMjUxLCA3NCwxODQsMTY4LDEwNCwxMjksMjUxLCA3NCwxODQsMTc0LDIzMiwyMjksCisgICAgMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDc0LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjM0LAorICAgICA5OCwgIDIsMTg0LDE5OCwxODQsMjAzLDIyNSwxMTQsMTI4LCAgMSwxMDMsMjM5LDI0MCwyMzksMjM3LDIzOSwKKyAgICAyMzAsMTExLDEyOCwgNDksIDEwLCA5OSwgIDYsMTg0LDIyNywxODQsMjM0LDE4NCwyNDEsMTg0LDI1MCwxODUsCisgICAgIDYwLDE4NSwgODcsMjI1LDI0MiwyMzksMTEwLDEyOCwgIDEsMTAxLDIyNywyNDUsMjQyLDEwOCwxMjgsICAyLAorICAgIDE2OCwyMjksMjI4LDIzMywyMzYsMjM2LCA5NywxMjgsICAxLCA5OSwyMzIsMjI5LDEwNCwgIDQsMTg1LCAgNiwKKyAgICAxODUsIDE1LDE4NSwgMjksMTg1LCA0NSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LDEzNCwyMzAsCisgICAgMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTEsMTIzLDIzMywyMzgsMjMzLAorICAgIDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUxLDEyNCwyMzcsMjI5LDIyOCwKKyAgICAyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUxLDEyNSwyMzMsMjQyLCA5OSwgIDIsCisgICAgMTg1LCA2OCwxODUsIDczLDIzNiwxMDEsMTI4LCAzNiwyMjcsMjQ1LDIzNywyMzAsMjM2LDIyOSwyNDgsMjI2LAorICAgIDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDExMywyMzksMjM3LDIzNywyMjUsMjI1LDIyNywyMjcsMjI5LDIzOCwKKyAgICAxMTYsMTI4LCAgMSwgOTksMTAwLCAgMiwxODUsMTA2LDE4NSwxMTYsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsCisgICAgMTE1LDEyOCwgMzAsMTUxLDIzOSwxMTYsICAyLDE4NSwxMjMsMTg1LDEzMiwyMjUsMjI3LDIyNywyMjksMjM4LAorICAgIDExNiwxMjgsIDMwLDEwNywyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTA5LDEwMSwgIDksMTg1LDE2MCwKKyAgICAxODUsMTcxLDE4NSwxOTEsMTg2LDIwMSwxODYsMjI2LDE4NywgMzQsMTg3LDEwMSwxODcsMTA2LDE4NywxNTgsCisgICAgMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA2NiwyMjgsMjI5LDI0MywyMjcsMjI5LAorICAgIDIzOCwyMjgsMjI5LDI0MiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTczLDEwNCwKKyAgICAgIDcsMTg1LDIwNywxODUsMjE2LDE4NSwyMzAsMTg2LCAxNCwxODYsIDQ0LDE4NiwgODUsMTg2LDE4MywyMjUsCisgICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA0MiwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LAorICAgIDIyNiwyMzMsIDk5LDEyOCwyNTQsMTUwLDIzMiwyMjUsMjMyLDEwNSwgIDIsMTg1LDIzOSwxODUsMjU0LDIzOCwKKyAgICAyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsMTYyLDI0MywyMzksCisgICAgMjM2LDIyNSwyNDQsMjI5LDIyOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLCAxMiwxMDUsICAyLAorICAgIDE4NiwgMjAsMTg2LCAzNSwyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwKKyAgICAxMjgsMjU0LDE1MSwyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEwMiwyMzQsMjI5LDIyOSwyMzcsCisgICAgMTA1LCAgMiwxODYsIDU0LDE4NiwgNjksMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LAorICAgIDIzMywgOTksMTI4LDI1MiwxNjEsMjQzLDIzOSwyMzYsMjI1LDI0NCwyMjksMjI4LDIyNSwyNDIsMjI1LDIyNiwKKyAgICAyMzMsIDk5LDEyOCwyNTIsIDExLDEwOSwgIDIsMTg2LCA5MSwxODYsMTI1LDIyNSwyNDIsMjI2LDI0NSwyNDQsCisgICAgIDk3LCAgMiwxODYsMTAyLDE4NiwxMTEsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNDEsMjMwLAorICAgIDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE0OCwxMDEsICAyLDE4NiwKKyAgICAxMzEsMTg2LDE0NCwyMjgsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxNTIsCisgICAgMjI5LDIzNywxMDUsICAyLDE4NiwxNTIsMTg2LDE2NywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLAorICAgIDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLDE2NCwyNDMsMjM5LDIzNiwyMjUsMjQ0LDIyOSwyMjgsMjI1LDI0MiwKKyAgICAyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwgMTQsMjM4LDIzOSwyMzksMjM4LDIzMCwyMzMsMjM4LDIyNSwyMzYsCisgICAgMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwxMTUsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LAorICAgICA5NywxMjksIDQ4LDE5OCwxODYsMjE0LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwKKyAgICAyNTUsMTMxLDEwOCwgIDIsMTg2LDIzMiwxODYsMjUxLDIyOSwyNDAsMjMyLDIzOSwyMzgsMTAxLDEyOSwgMzMsCisgICAgIDMzLDE4NiwyNDMsMjI2LDIzNiwyMjUsMjI3LDEwNywxMjgsIDM4LCAxNCwyMzMsMjQzLDIzMiwgOTcsICAyLAorICAgIDE4NywgIDQsMTg3LCAxOSwyMzEsMjI5LDIyOCwyMzksMjM2LDIyNSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwKKyAgICAxMjgsICA1LDE2MCwyNDEsMjI5LDI0NCwyMjUsMjM4LDIyNSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsCisgICAgICA1LDE2OSwxMTAsICA0LDE4NywgNDQsMTg3LCA1MywxODcsIDcyLDE4NywgOTMsMjI3LDIzMywyNDIsMjI3LAorICAgIDIzNiwxMDEsMTI4LCAzNiwxMDUsMjMzLDIyOCwyMjksMjM5LDIzMSwyNDIsMjI1LDI0MCwyMzIsMjMzLDIyNywKKyAgICAyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDQxLDExMiwgIDIsMTg3LCA3OCwxODcsIDg1LDIyNSwyNDIsCisgICAgMjI5LDExMCwxMjgsIDM2LDEyNSwyMjksMjQyLDIzMywyMzksMTAwLDEyOCwgMzYsMTQ1LDI0MiwyMzksMjM3LAorICAgIDIyNSwxMTAsMTI4LCAzMywxMjEsMjQzLDEwNCwxMjgsICAyLDE2NywxMTYsMTMxLCAgNSwyMTYsMTg3LDExNiwKKyAgICAxODcsMTM2LDE4NywxNDUsMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwgNTYsMTg3LDEyNywyMzIsCisgICAgMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA1NiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LAorICAgIDIxNiwyNDMsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxODEsMjQ2LDIzMywKKyAgICAxMTQsICAyLDE4NywxNjYsMTg3LDE3NSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE1NSwyMzYsCisgICAgMjI5LDIzMCwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNTUsMTA0LCAgNiwxODcsMjAyLAorICAgIDE4OCwgOTgsMTg4LDIyMCwxODksIDk2LDE5MCwgIDMsMTkxLCA2MCwgOTcsICA1LDE4NywyMTQsMTg3LDIyNCwKKyAgICAxODcsMjMxLDE4OCwgIDAsMTg4LCAyOSwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNjUsCisgICAgMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDM3LDIzMSwxMTcsICAyLDE4NywyMzgsMTg3LDI0NywyMzQsMjI1LAorICAgIDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE2NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAzNywKKyAgICAxMDgsICAyLDE4OCwgIDYsMTg4LCAxNSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA0OCwyMzAsCisgICAgMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTcyLDIzOCwyNDQsMjMyLAorICAgIDIyNSwyMzUsMjMyLDIyNSwxMTYsICAzLDE4OCwgNDQsMTg4LCA3NSwxODgsIDgyLDIzNiwyMzksMTE5LCAgMiwKKyAgICAxODgsIDUyLDE4OCwgNjMsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDE1MiwyNDIsCisgICAgMjMzLDIzMSwyMzIsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDE1MSwyNDQsMjMyLDIyNSwxMDUsMTI4LAorICAgICAxNCwgNzYsMjQ1LDI0MCwyNDAsMjI5LDI0MiwyMzYsMjI5LDIzMCwyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwKKyAgICAyNDgsMTUwLDEwMSwgIDMsMTg4LDEwNiwxODgsMTcwLDE4OCwxOTMsMTA0LCAgNCwxODgsMTE2LDE4OCwxMjUsCisgICAgMTg4LDEzOSwxODgsMTU1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDQzLDIzMCwyMzMsMjM4LAorICAgIDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxNTQsMjMzLDIzOCwyMzMsMjQ0LDIzMywKKyAgICAyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTU1LDIzNywyMjksMjI4LDIzMywyMjUsCisgICAgMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTU2LDI0MiwxMDEsICAyLDE4OCwxNzcsMTg4LAorICAgIDE4NiwyMjksMjQ4LDIzMywyNDMsMjQ0LDExNSwxMjgsIDM0LCAgMywyMzAsMjM5LDI0MiwxMDEsMTI4LCAzNCwKKyAgICAgNTIsMjQ0LCA5NywxMzAsICAzLDE4NCwxODgsMjAyLDE4OCwyMDYsIDQ5LDEyOCwgIDMsMjA5LDI0MywyNDksCisgICAgMjM3LDIyNiwyMzksMjM2LDIzMSwyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywyMDksMTA1LCAgMiwxODgsMjI2LAorICAgIDE4OSwgNTYsMjI5LDI0NSwyNDQsMTA0LCAgNCwxODgsMjM5LDE4OSwgMTgsMTg5LCAzMywxODksIDQyLCA5NywKKyAgICAgIDIsMTg4LDI0NSwxODksICA0LDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsCisgICAgMTEwLDEyOCwgNTAsMTIxLDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LAorICAgICA1MCwgMjUsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwKKyAgICAxMDcsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNzYsMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsCisgICAgMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAxMSwyNDIsMjQ0LDIyOSwyMjksMTEwLCAgMiwxODksIDY2LAorICAgIDE4OSwgNzUsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwxMDgsMTEyLCAgMiwxODksIDgxLDE4OSwKKyAgICAgODgsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTI4LDIyOSwyNDIsMjMzLDIzOSwxMDAsMTI4LCAzNiwxNDgsCisgICAgMTExLCAgNiwxODksMTEwLDE4OSwxMjcsMTg5LDEzMiwxODksMTQ2LDE4OSwxNTEsMTg5LDIwNCwyMzgsMjI1LAorICAgIDIzOCwyMzEsMjM3LDIzOSwyMzgsMjQ0LDIzMiwyMzksMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDE3LDIzOSwKKyAgICAxMDcsMTI4LCAgMSwxNzMsMjQwLDIzMiwyNDUsMjQ0LDIzMiwyMjUsMjM5LDI0NCwyMzIsMjI1LDEwNSwxMjgsCisgICAgIDE0LCAxOCwyNDIsMTEwLDEyOCwgIDAsMjU0LDI0NCwxMDQsICAzLDE4OSwxNjAsMTg5LDE4NCwxODksMTk0LAorICAgICA5NywgIDIsMTg5LDE2NiwxODksMTc2LDIzMiwyMjUsMjM4LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAyMywKKyAgICAyMzgsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDE2LDIzOSwyMzgsMjMxLDI0NCwyMzIsMjI1LDEwNSwxMjgsCisgICAgIDE0LCAyNCwyNDUsMjM4LDIzMSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgMjIsMjQ1LDI0MywyMjUsMjM4LAorICAgIDEwMCwgIDIsMTg5LDIxNCwxODksMjI1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKKyAgICAxMzAsMjQzLDI0MywyMjksMjQwLDIyNSwyNDIsMjI1LDI0NCwyMzksMTE0LCAgMiwxODksMjQwLDE4OSwyNDksCisgICAgMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxMDgsMjQwLDIyOSwyNDIsMjQzLDIzMywyMjUsMTEwLAorICAgIDEyOCwgIDYsMTA4LDI0MiwyMjksMTAxLDE0NCwgIDAsIDUxLDE5MCwgNDEsMTkwLCA1MCwxOTAsIDYwLDE5MCwKKyAgICAgOTAsMTkwLCA5NywxOTAsMTA3LDE5MCwxMzIsMTkwLDE1OSwxOTAsMTkzLDE5MCwyMDUsMTkwLDIyNCwxOTAsCisgICAgMjM1LDE5MSwgMTIsMTkxLCAzNCwxOTEsIDQyLDE5MSwgNTMsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LAorICAgICAgNiwgOTksMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjMzLDIyNywyMzMsMjQyLDIyNywKKyAgICAyMzYsMTAxLDEyOSwgMzYsIDk4LDE5MCwgNzEsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDMsMjI5LDI0MywyMjUsCisgICAgMjM4LDI0MywyNDMsMjI5LDI0MiwyMzMsMTAyLDEyOCwgMzksMTQwLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LAorICAgIDEwNSwyMjksMjMzLDIzMSwyMzIsMjQ0LDIzMiwxMTUsMTI4LCAzMywgOTIsMjMxLDExNywgIDIsMTkwLDExNCwKKyAgICAxOTAsMTIzLDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMjMzLDI0MiwyMzcsMjQ1LDIzNSwyMzIsCisgICAgMTA1LDEyOCwgMTAsMTA1LDIzMiwgOTcsICAyLDE5MCwxMzksMTkwLDE1MCwyMjcsMjM1LDIyNSwyNDIsMjI1LAorICAgIDIyNiwyMzMsIDk5LDEyOCwgIDYsIDk5LDIzOCwyMzEsMjUwLDIzMiwyMzksMTE3LDEyOCwgNDgsIDM1LDEwNSwKKyAgICAgIDIsMTkwLDE2NSwxOTAsMTgzLDIyOCwyMjksMjM5LDIzMSwyNDIsMjI1LDI0MCwyMzIsMjMzLDIyNywyNDAsCisgICAgMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDM0LDIzOCwyMzAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLAorICAgIDEzMSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAxOSwyMzgsMjQ1LDIzNywKKyAgICAyMjksMjQyLDIyNSwyNDQsMjM5LDI0MiwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyNDYsCisgICAgMjM5LDIzNiwyMjgsMjQzLDI0NCwyNDksMjM2LDEwMSwxMjgsMjQ3LCA1MSwxMTIsICAyLDE5MCwyNDEsMTkwLAorICAgIDI0OCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxMTgsMjI5LDExNCwgIDIsMTkwLDI1NSwxOTEsICA1LDIzMywKKyAgICAyMzksMTAwLDEyOCwgMzYsMTM4LDI0MywyMzMsMjI1LDExMCwxMjgsICA2LDI0MywyNDEsMjQ1LDIyNSwyNDIsCisgICAgMjQ0LDIyOSwyNDIsMTE1LDEyOSwgIDAsMTkwLDE5MSwgMjUsMjI5LDIzNywyMjgsMjI1LDI0MywxMDQsMTI4LAorICAgIDI0NiwyMjIsMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsIDMzLDExNCwyNDMsMjQ1LDI0MCwyMjksMjQyLDIzMywKKyAgICAyMzksMTE0LDEyOCwgIDAsMTc5LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA4MywyNTAsMjQzLDI0MSwyNDUsCisgICAgMjI1LDI0MiwxMDEsMTI4LCA1MSwxNDgsMTA1LCAgNywxOTEsIDg2LDE5MSwgOTcsMTkxLDIxMiwxOTIsIDU0LAorICAgIDE5MiwgNjYsMTkyLDExNSwxOTIsMTMyLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwKKyAgICAgOTcsMTA3LCAgMiwxOTEsMTAzLDE5MSwxMjcsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsCisgICAgMTkzLDE5MSwxMTUsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMjksMjI5LAorICAgIDI0NSwxMTYsICA0LDE5MSwxMzksMTkxLDE3NCwxOTEsMTg5LDE5MSwxOTgsIDk3LCAgMiwxOTEsMTQ1LDE5MSwKKyAgICAxNjAsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMTIsCisgICAgMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAxNiwyMjcsMjMzLAorICAgIDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCA5OCwyMzUsMjM5LDI0MiwKKyAgICAyMjksMjI1LDExMCwxMjgsIDQ5LCA1NSwyNDAsMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsCisgICAgMTEwLDEyOCwgNTAsICAyLDIzNiwyMjgsMTAxLDEzMywgIDIsMjIwLDE5MSwyMjgsMTkxLDIzOSwxOTIsICAwLAorICAgIDE5MiwgMTIsMTkyLCA0MCwyMjYsMjI5LDIzNiwyMzksMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDQ4LCA5OSwKKyAgICAgIDIsMTkxLDI0NSwxOTEsMjUwLDIzNywgOTgsMTI4LCAgMywgIDMsMjM5LDIzNywgOTgsMTI4LCAgMywgIDMsCisgICAgMjI4LDIzOSwyNDUsMjI2LDIzNiwyMjksMjI3LDIzNywgOTgsMTI4LCAgMywgOTYsMTExLCAgMiwxOTIsIDE4LAorICAgIDE5MiwgMjgsMjQwLDIyOSwyNDIsMjI1LDI0NCwyMzksMTE0LDEyOCwgMzQsIDYwLDI0NiwyMjksMjQyLDIzNiwKKyAgICAyMjUsMjQ5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDUyLDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwyMzYsCisgICAgMjI3LDIzNywgOTgsMTI4LCAgMywgNjIsMjM3LDIyOSwyNDMsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LAorICAgICAzNCwxNTEsMTEyLCAgMiwxOTIsIDcyLDE5MiwxMDIsMjI5LDIzMiwgOTcsICAyLDE5MiwgODAsMTkyLCA4OSwKKyAgICAyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE1MCwyMzYsMjI5LDIzMCwyNDQsMjMyLDIyOSwyMjYsCisgICAgMjQyLDIyOSwxMTksMTI4LCAgNSwxNTAsMjQwLDIzMywyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LAorICAgIDEyOCwgMTAsMTEyLDI0NCwyMzYsMjM5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywyMjcsMjI3LDIzNywKKyAgICAgOTgsMTI4LCAgNCwxMzEsMjQ3LDIzOCwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsCisgICAgMTI3LDIzNiwyMzMsMjM4LDIyOSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTExLDIzNywyMzksMjM4LAorICAgIDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDg0LDExMSwgIDcsMTkyLDE4NSwxOTIsMTk2LDE5MiwKKyAgICAyMDcsMTkyLDIzMiwxOTMsIDk2LDE5MywxMDgsMTkzLDE5MiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsCisgICAgMTEwLDEyOCwgIDUsMTA1LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMDQsMjM1LAorICAgIDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIwMCwxOTIsMjIwLDIzMiwyMjUsMjM2LDIzMCwKKyAgICAyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTMyLDExMCwgIDMsMTkyLDI0MCwxOTMsIDgyLDE5MywgODcsCisgICAgMTAxLCAgNCwxOTIsMjUwLDE5MywgNjMsMTkzLCA3MCwxOTMsIDc2LDIyNiwyMjUsMTE0LCAgNCwxOTMsICA2LAorICAgIDE5MywgMzUsMTkzLCA0NSwxOTMsIDU0LDIyOSwyNDgsMjQ0LDI0MiwgOTcsICAyLDE5MywgMTYsMTkzLCAyNiwKKyAgICAyMzIsMjMzLDIzMSwyMzIsMjM3LDIzOSwxMDAsMTI4LCAgMiwyMjksMjM2LDIzOSwyNDcsMjM3LDIzOSwxMDAsCisgICAgMTI4LCAgMiwyMzMsMjMyLDIzMywyMzEsMjMyLDIzNywyMzksMTAwLDEyOCwgIDIsMjMwLDIzNiwyMzksMjQ3LAorICAgIDIzNywyMzksMTAwLDEyOCwgIDIsMjMyLDIzNywyMzMsMjI4LDIzNywyMzksMTAwLDEyOCwgIDIsMjMxLDIzMCwKKyAgICAyMzMsMjQ2LDEwMSwxMjgsICAxLDE4OSwyNDMsMjMzLDEyMCwxMjgsICAxLDEzMywyNDQsMjQ3LDExMSwxMjgsCisgICAgICAxLDE2OCwyMzksMTE1LDEyOCwgIDMsMTMyLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDM5LAorICAgIDI0MCwyMjUsMjQ0LDIyNSwyMzUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDE1LDI0MiwyNDQsMjM5LDIzMywKKyAgICAyNDMsMjI5LDI0MywyMzIsMjI5LDIzNiwyMzYsMjI2LDI0MiwyMjUsMjI3LDIzNSwyMjksMTE2LCAgMiwxOTMsCisgICAgMTMxLDE5MywxNjEsMjM2LDIyOSwyMzAsMTE2LDEzMCwgNDgsIDIwLDE5MywxNDIsMTkzLDE1MCwyNDMsMjM3LAorICAgIDIyNSwyMzYsMTA4LDEyOCwyNTQsIDkzLDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LDI1NCwKKyAgICAgNTcsMjQyLDIzMywyMzEsMjMyLDExNiwxMzAsIDQ4LCAyMSwxOTMsMTczLDE5MywxODEsMjQzLDIzNywyMjUsCisgICAgMjM2LDEwOCwxMjgsMjU0LCA5NCwyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LDEyOCwyNTQsIDU4LAorICAgIDI0NCwyMjUsMjM5LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAyMSwyNDAsIDk3LCAgMiwxOTMsMjA5LDE5MywKKyAgICAyMjEsMjM2LDIyNSwyNDQsMjI1LDIzNiwyMzIsMjM5LDIzOSwxMDcsMTI4LCAgMSwxNzEsMjQyLDIyOSwxMTAsCisgICAgMTI4LCAzNiwxNzUsMTE0LCAgMywxOTMsMjM1LDE5NCwgMTAsMTk0LCAyNSwyMjUsMjI4LDIyOSwyMzcsMjI1LAorICAgIDI0MiwxMDcsMTI5LCAzMywgMzQsMTkzLDI0NywxMTUsICAyLDE5MywyNTMsMTk0LCAgMywyMjUsMjM4LDExNSwKKyAgICAxMjgsMjQ4LDIzNCwyMjksMjQyLDIzMywxMDIsMTI4LDI0NiwyMTksMjI5LDI0NCwyNDIsMjM5LDIzMCwyMzYsCisgICAgMjI5LDI0OCwyMzIsMjM5LDIzOSwxMDcsMTI4LCAgMiwxMzYsMjMzLDIyNSwxMDMsICA0LDE5NCwgMzcsMTk0LAorICAgICA0MiwxOTQsIDQ3LDE5NCwgNTIsMjI4LDExMCwxMjgsIDM3LDE4OCwyMzYsMTAyLDEyOCwgMzcsMTk2LDI0MiwKKyAgICAxMTYsMTI4LCAzNywxODYsMjQ1LDExMiwxMjgsIDM3LDE3OCwxMTUsMTMyLCAgMiwxNjYsMTk0LCA2OSwxOTQsCisgICAgMTA4LDE5NCwyMTQsMTk0LDIyNywyMjUsMjI4LDEwNSwxMzAsICA1LDIzMCwxOTQsIDc5LDE5NCwgOTksMjI4LAorICAgIDIyNSwyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwgNzAsMTk0LCA5MCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwKKyAgICAxMjgsMjUxLCA3MCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIzMCwxMDEsICAyLDE5NCwxMTQsCisgICAgMTk0LDEyNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDcwLDI0MiwxMDEsMTM0LAorICAgICAgNSwxODEsMTk0LDE0MiwxOTQsMTU2LDE5NCwxNjEsMTk0LDE3MCwxOTQsMTg1LDE5NCwyMDEsIDQ5LCAgMiwKKyAgICAxOTQsMTQ4LDE5NCwxNTIsIDUwLDEyOCwgIDUsMTgxLDEwMSwxMjgsICA1LDE4MSwxNzgsIDk4LDEyOCwgIDUsCisgICAgMTgxLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTgxLDIzOCwyMjUsMjQyLDI0MiwyMzksMjQ3LAorICAgIDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTgxLDI0MSwyNDUsMjI1LDI0MiwyNDQsMjI5LDI0MiwKKyAgICAyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4MSwyNDcsMjMzLDIyOCwyMjksMjMyLDIyOSwyMjYsCisgICAgMjQyLDIyOSwxMTksMTI4LCAgNSwxODEsMjMyLDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAorICAgIDEyOCwgIDQsIDkxLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDI0MywxMTYsICA0LDE5NCwKKyAgICAyNDcsMTk1LCA0MSwxOTUsMTA2LDE5NSwxNTcsIDk3LCAgMywxOTQsMjU1LDE5NSwgIDksMTk1LCAxNiwyMjYsCisgICAgMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNTksMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDMxLAorICAgIDIzMSwxMTcsICAyLDE5NSwgMjMsMTk1LCAzMiwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE1OSwKKyAgICAyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAzMSwyMjksMTA0LCAgNCwxOTUsIDUyLDE5NSwgNjEsCisgICAgMTk1LCA3NSwxOTUsIDkxLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTIxLDIzMCwyMzMsMjM4LAorICAgIDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxMDMsMjMzLDIzOCwyMzMsMjQ0LDIzMywKKyAgICAyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTEsMTA0LDIzNywyMjksMjI4LDIzMywyMjUsCisgICAgMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTEsMTA1LDIzMiwgOTcsICAzLDE5NSwxMTUsMTk1LAorICAgIDEyNSwxOTUsMTMyLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE2MCwyMjgsMjI5LDI0NiwKKyAgICAgOTcsMTI4LCAgOSwgMzIsMjMxLDExNywgIDIsMTk1LDEzOSwxOTUsMTQ4LDIzNCwyMjUsMjQyLDIyNSwyNDQsCisgICAgMTA1LDEyOCwgMTAsMTYwLDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDMyLDI0NSwyNDIsMjM4LAorICAgIDIyOSwxMDAsMTI4LCAgMiwxMzUsMTE3LCAgMywxOTUsMTczLDE5NSwxODQsMTk1LDIwOSwyMzIsMjMzLDI0MiwKKyAgICAyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTAwLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsCisgICAgMTI5LCA0OCwxOTYsMTk1LDE5NywyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LAorICAgIDEzMCwyNDMsMjM3LDIyNSwyMzYsMTA4LCAgMiwxOTUsMjE5LDE5NSwyMzAsMjMyLDIzMywyNDIsMjI1LDIzMSwKKyAgICAyMjUsMjM4LCA5NywxMjgsIDQ4LCA5OSwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsCisgICAgMTk1LDE5NSwyNDMsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMTEsMTE5LAorICAgICAgMiwxOTYsICA1LDE5NiwxMTAsMTAxLCAgMiwxOTYsIDExLDE5NiwgNTksMjM2LDI0NiwxMDEsICAzLDE5NiwKKyAgICAgMjEsMTk2LCAzMCwxOTYsIDUxLDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMTA3LDExMiwgIDIsCisgICAgMTk2LCAzNiwxOTYsIDQzLDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDEyNywyMjksMjQyLDIzMywyMzksMTAwLAorICAgIDEyOCwgMzYsMTQ3LDI0MiwyMzksMjM3LDIyNSwxMTAsMTI4LCAzMywxMjMsMjM4LDI0NCwxMjEsICAzLDE5NiwKKyAgICAgNjksMTk2LCA3OCwxOTYsIDg5LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMTE1LDIzMiwyMjUsCisgICAgMjM4LDIzMSwyNTAsMjMyLDIzOSwxMTcsMTI4LCA4MywgNjgsMTEyLCAgMiwxOTYsIDk1LDE5NiwxMDIsMjI1LAorICAgIDI0MiwyMjksMTEwLDEyOCwgMzYsMTM1LDIyOSwyNDIsMjMzLDIzOSwxMDAsMTI4LCAzNiwxNTUsMTExLDE0MiwKKyAgICAgIDAsIDUwLDE5NiwxNDIsMTk2LDE1MSwxOTYsMTYxLDE5NiwxOTEsMTk2LDI0MywxOTcsIDEyLDE5NywgMzksCisgICAgMTk3LCA3MywxOTcsIDg1LDE5NywxMDQsMTk3LDExNSwxOTcsMTQ4LDE5NywxNTYsMTk3LDE4MCwyMjUsMjQyLAorICAgIDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA5OCwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwKKyAgICAyMzIsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI5LCAzNiwgOTcsMTk2LDE3MiwyMzMsMjM4LDI0NiwyMjksCisgICAgMjQyLDI0MywyMjksMjQzLDIyNSwyMzgsMjQzLDI0MywyMjksMjQyLDIzMywxMDIsMTI4LCAzOSwxMzksMTAwLAorICAgICAgMiwxOTYsMTk3LDE5NiwyMDMsMjI5LDI0NiwgOTcsMTI4LCAgOSwxMDQsMjM5LDExNiwgIDIsMTk2LDIxMCwKKyAgICAxOTYsMjIxLDIyOSwyMzgsMjM2LDIyOSwyMjUsMjI4LDIyOSwxMTQsMTI4LCAzMiwgMzcsMjM2LDIyOSwyMjUsCisgICAgMjI4LDIyOSwxMTQsMTI5LCAzMiwgMzcsMTk2LDIzMiwyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LAorICAgIDEyOCwyNTQsIDQ4LDIzMSwxMTcsICAyLDE5NiwyNTAsMTk3LCAgMywyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwKKyAgICAxMjgsIDEwLDIzMiwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLDEwNCwyMzIsIDk3LCAgMiwxOTcsCisgICAgIDE5LDE5NywgMzAsMjI3LDIzNSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA5OCwyMzgsMjMxLAorICAgIDI1MCwyMzIsMjM5LDExNywxMjgsIDQ4LCAzNCwxMDUsICAyLDE5NywgNDUsMTk3LCA2MywyMjgsMjI5LDIzOSwKKyAgICAyMzEsMjQyLDIyNSwyNDAsMjMyLDIzMywyMjcsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCAzMywyMzgsCisgICAgMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwxMzAsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LAorICAgIDIyNywxMDEsMTI4LDI1NSwgMTgsMjM4LDI0NSwyMzcsMjI5LDI0MiwyMjUsMjQ0LDIzOSwyNDIsMjI2LDIyOSwKKyAgICAyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjQ1LDIzOSwyMzYsMjI4LDI0MywyNDQsMjQ5LDIzNiwxMDEsCisgICAgMTI4LDI0NywgNTAsMTEyLCAgMiwxOTcsMTIxLDE5NywxMjgsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTE3LAorICAgIDIyOSwxMTQsICAyLDE5NywxMzUsMTk3LDE0MSwyMzMsMjM5LDEwMCwxMjgsIDM2LDEzNywyNDMsMjMzLDIyNSwKKyAgICAxMTAsMTI4LCAgNiwyNDIsMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsIDMzLDExMywxMTUsICAyLDE5NywxNjIsCisgICAgMTk3LDE3MCwyNDQsMjQyLDIzOSwyMzUsMTAxLDEyOCwgIDEsMTg3LDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LAorICAgIDExNCwxMjgsICAwLDE3OCwyNDQsMTA0LCAgMiwxOTcsMTg3LDE5NywxOTIsMjI1LDEwNSwxMjgsIDE0LCA4MiwKKyAgICAyMzMsMjQyLDIyOCwxMTUsMTI4LCAzMywgODQsMTE3LDE0NSwgIDAsMTE3LDE5NywyMzcsMTk3LDI0NSwxOTgsCisgICAgIDMwLDE5OCwgODcsMTk4LDIyNSwxOTksICA2LDE5OSwxMjksMTk5LDE0NSwxOTksMTk2LDIwMCwgMTAsMjAwLAorICAgICA5MSwyMDAsMTAwLDIwMCwyMTksMjAwLDI0MywyMDEsIDk1LDIwMSwxMjMsMjAxLDIzNywyMjUsMjI3LDI0NSwKKyAgICAyNDQsMTAxLDEyOCwgIDAsMjUwLCA5OCwgIDQsMTk3LDI1NSwxOTgsICA0LDE5OCwgMTMsMTk4LCAyMywyMjUsCisgICAgMTE0LDEyOCwgIDIsMTM3LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTM3LDIzOSwyNDAsMjM5LAorICAgIDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCA0MCwyNDIsMjI5LDI0NiwxMDEsMTI4LCAgMSwxMDksIDk5LCAgMywKKyAgICAxOTgsIDM4LDE5OCwgNDUsMTk4LCA3NywyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMTIsMjMzLDI0MiwgOTksCisgICAgICAyLDE5OCwgNTMsMTk4LCA1OCwyMzYsMTAxLDEyOCwgMzYsMjI4LDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLAorICAgIDEyOSwgIDAsMjUxLDE5OCwgNjksMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDExOSwyNDksMjQyLDIzMywKKyAgICAyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNjcsMTAwLCAgNSwxOTgsIDk5LDE5OCwxMTAsMTk4LDEzMywxOTgsCisgICAgMTM5LDE5OCwyMTUsMjI1LDI0NCwyNDQsMjI1LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA4MSwyMjYsMTA4LAorICAgICAgMiwxOTgsMTE3LDE5OCwxMjUsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLDExMywyMzEsMjQyLDIyNSwKKyAgICAyNDYsMTAxLDEyOCwgIDIsIDIxLDIyOSwyNDYsIDk3LDEyOCwgIDksICA5LDIzMywyMjksMjQyLDIyOSwyNDMsCisgICAgMjMzLDExNSwxMzMsICAwLDI1MiwxOTgsMTU5LDE5OCwxNjcsMTk4LDE3NSwxOTgsMTk4LDE5OCwyMDYsMjI1LAorICAgIDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLDIxNiwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTE1LCA5OSwKKyAgICAgIDIsMTk4LDE4MSwxOTgsMTg4LDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLDIxOCwyNDksMjQyLDIzMywyMzYsCisgICAgMjM2LDIzMywgOTksMTI4LCAgNCwyNDEsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAxLDIyMCwyMzcsMjI1LAorICAgIDIyNywyNDIsMjM5LDExMCwxMjgsICAxLDIxNCwyMzksMjQ0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwKKyAgICAyMjksMTAzLCAgMiwxOTgsMjMxLDE5OCwyMzgsMjQyLDIyNSwyNDYsMTAxLDEyOCwgIDAsMjQ5LDExNywgIDIsCisgICAgMTk4LDI0NCwxOTgsMjUzLDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTM3LDI0MiwyMzcsMjQ1LAorICAgIDIzNSwyMzIsMTA1LDEyOCwgMTAsICA5LDEwNCwgIDMsMTk5LCAxNCwxOTksIDI0LDE5OSwxMDIsMjMzLDI0MiwKKyAgICAyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDcwLDExMSwgIDIsMTk5LCAzMCwxOTksIDQwLDIzOSwyMzUsCisgICAgMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDIzMSwyNDIsMTEwLDEzMywgIDEsMTc2LDE5OSwgNTUsMTk5LAorICAgICA2MywxOTksIDc0LDE5OSwgODIsMTk5LCA5NCwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsMjMzLDIyOCwKKyAgICAyMzksMjQ0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwyNDEsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsCisgICAgIDMwLDIzNSwyMzIsMjM5LDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDIzNywyNDQsMjMzLAorICAgIDIzNiwyMjgsMTAxLDEyOCwgMzAsMjM5LDI0NSwyMzgsMjMxLDIyNSwyNDIsMjQ1LDIzNywyMzYsMjI1LDI0NSwKKyAgICAxMTYsMTI5LCAgMSwxMTMsMTk5LDExOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCisgICAgMjQzLDIzMywyMzgsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwyMjgsMjI2LDI0MiwyMjksMjQ2LDEwMSwxMjgsICAyLAorICAgICAyMywxMDcsICAzLDE5OSwxNTMsMTk5LDE3NywxOTksMTg4LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywKKyAgICAxMjksIDQ4LDE2NiwxOTksMTY1LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsCisgICAgMTE1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMjEsMjM5LDI0MiwyMjksMjI1LAorICAgIDExMCwxMjgsIDQ5LCA5MiwxMDksICAyLDE5OSwyMDIsMTk5LDI1NSwgOTcsICAyLDE5OSwyMDgsMTk5LDI0MSwKKyAgICAyMjcsMjQyLDIzOSwxMTAsMTMwLCAgMSwxMDcsMTk5LDIxOSwxOTksMjMwLDIyNywyNDksMjQyLDIzMywyMzYsCisgICAgMjM2LDIzMywgOTksMTI4LCAgNCwyMzksMjI4LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjgsIDMwLAorICAgIDEyMywyNDQsMjQyLDIyNSwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDY1LDIzOSwKKyAgICAyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgODUsMTEwLCAgMiwyMDAsIDE2LDIwMCwgNzEsCisgICAgMjI4LDIyOSwyNDIsMjQzLDIyNywyMzksMjQyLDEwMSwxMzIsICAwLCA5NSwyMDAsIDM1LDIwMCwgNDEsMjAwLAorICAgICA1MywyMDAsIDY0LDIyOCwyMjYsMTA4LDEyOCwgMzIsIDIzLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwKKyAgICAyMjcsMTAxLDEyOCwyNTUsIDYzLDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LDI1NCwgNTEsCisgICAgMjQ3LDIyNSwyNDYsMTIxLDEyOCwyNTQsIDc5LDEwNSwgIDIsMjAwLCA3NywyMDAsIDgyLDIzOSwxMTAsMTI4LAorICAgICAzNCwgNDIsMjQ2LDIyOSwyNDIsMjQzLDIyNSwxMDgsMTI4LCAzNCwgIDAsMjM5LDIzMSwyMzksMjM4LDIyOSwKKyAgICAxMDcsMTI4LCAgMSwxMTUsMTEyLCAgNSwyMDAsMTEyLDIwMCwxMTksMjAwLDEyNywyMDAsMTQyLDIwMCwxOTMsCisgICAgMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTc2LDIyNiwyMzYsMjM5LDIyNywxMDcsMTI4LCAzNywxMjgsMjQwLAorICAgIDIyOSwyNDIsMjI4LDIzOSwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxOTYsMjQzLDIzMywKKyAgICAyMzYsMjM5LDExMCwxMzEsICAzLDE5NywyMDAsMTU2LDIwMCwxNzcsMjAwLDE4NSwyMjgsMjMzLDIyOSwyNDIsCisgICAgMjI5LDI0MywyMzMsMTE1LDEyOSwgIDMsMjAzLDIwMCwxNjksMjQ0LDIzOSwyMzgsMjM5LDExNSwxMjgsICAzLAorICAgIDE3NiwyMzYsMjI1LDI0NCwyMzMsMTEwLDEyOCwgIDIsMTM4LDI0NCwyMzksMjM4LDIzOSwxMTUsMTI4LCAgMywKKyAgICAyMDUsMjQ0LDIyNSwyMjcsMTA3LCAgMiwyMDAsMjAyLDIwMCwyMTMsMjI2LDIyOSwyMzYsMjM5LDI0NywyMjcsCisgICAgMjM3LCA5OCwxMjgsICAzLCAyOSwyMzcsMjM5LDEwMCwxMjgsICAyLDIxMiwxMTQsICAyLDIwMCwyMjUsMjAwLAorICAgIDIzNywyMjUsMjMxLDI0NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLDExNSwyMzMsMjM4LDEwMywKKyAgICAxMjgsICAxLDExMSwxMTUsICAzLDIwMCwyNTEsMjAxLCAxMCwyMDEsIDU1LDIzMiwyMzksMjQyLDI0NCwyMjcsCisgICAgMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDk0LDIzNywyMjUsMjM2LDEwOCwgIDIsMjAxLAorICAgICAxOSwyMDEsIDMwLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgNjksMjM1LDIyNSwKKyAgICAyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDE2NSwyMDEsIDQzLDIzMiwyMjUsMjM2LDIzMCwyNDcsCisgICAgMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTA1LDI0NCwyNDIsMjI1LDIzMywyMzEsMjMyLDExNiwgIDIsMjAxLAorICAgICA2NywyMDEsIDc4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNzUsMjQzLDI0NCwKKyAgICAyNDIsMjM5LDIzNSwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE3NywyNDQsCisgICAgMjMzLDIzNiwyMjgsMTAxLDEzMCwgIDEsMTA1LDIwMSwxMDcsMjAxLDExNSwyMjUsMjI3LDI0NSwyNDQsMTAxLAorICAgIDEyOCwgMzAsMTIxLDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxMTcsMTE3LCAgNSwyMDEsMTM1LDIwMSwKKyAgICAxNDUsMjAxLDE1MiwyMDEsMTc3LDIwMSwxOTMsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksCisgICAgMTM4LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAxMCwyMzEsMTE3LCAgMiwyMDEsMTU5LDIwMSwxNjgsMjM0LAorICAgIDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxMzgsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwKKyAgICAgMTAsMjM3LDIyNSwyNDQsMjQyLDIyNSwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsCisgICAgIDY2LDI0NiwyMzksMjQ3LDIyOSwyMzYsMjQzLDIzMywyMzEsMTEwLCAgMywyMDEsMjA5LDIwMSwyMTksMjAxLAorICAgIDIyNiwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxOTQsMjI4LDIyOSwyNDYsIDk3LDEyOCwKKyAgICAgIDksIDY2LDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxOTQsMjQ2LDIzOSwyNDcsCisgICAgMjI5LDIzNiwyNDMsMjMzLDIzMSwxMTAsICAzLDIwMSwyNTMsMjAyLCAgNywyMDIsIDE0LDIyNiwyMjksMjM4LAorICAgIDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE5MywyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNjUsMjMxLDI0NSwKKyAgICAyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE5MywxMTgsMTM5LCAgMCwxMTgsMjAyLCA1MSwyMDIsCisgICAgMTk5LDIwMiwyMDgsMjAyLDIxOSwyMDMsMTQ4LDIwMywxNTUsMjAzLDI1MywyMDQsICA5LDIwNCwxMDksMjA0LAorICAgIDExNywyMDQsMTM4LCA5NywgIDQsMjAyLCA2MSwyMDIsIDY4LDIwMiwgOTMsMjAyLDEwNCwyMjgsMjI5LDI0NiwKKyAgICAgOTcsMTI4LCAgOSwgNTMsMjMxLDExNywgIDIsMjAyLCA3NSwyMDIsIDg0LDIzNCwyMjUsMjQyLDIyNSwyNDQsCisgICAgMTA1LDEyOCwgMTAsMTgxLDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDUzLDIzNSwyMjUsMjQ0LAorICAgIDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyNDcsMTE4LDEzMiwgIDUsMjEzLDIwMiwxMTYsMjAyLDE0MywKKyAgICAyMDIsMTc1LDIwMiwxODcsMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsMTMwLDI1MSwgNTMsMjAyLDEyOSwyMDIsCisgICAgMTM0LDE4MiwgNTMsMTI4LDI1MSwgNTMsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LDI1MSwgNTMsMTA0LAorICAgICAgMiwyMDIsMTQ5LDIwMiwxNTcsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIxMywyMzksMjM2LDIyNSwKKyAgICAxMDksMTI5LDI1MSwgNzUsMjAyLDE2NiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA3NSwyNDYsCisgICAgMjI1LDI0NiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDI0MCwyNDksMjM5LDIyOCwyMzIsMjI5LAorICAgIDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDI0MSwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM2LDIyOSwKKyAgICAyMjgsMjM5LDI0NCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTI3LDEwMSwgIDYsMjAyLDIzMywyMDIsCisgICAgMjQ0LDIwMywgNTIsMjAzLCA2MywyMDMsIDY5LDIwMywxMzYsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLAorICAgICA5OSwxMjgsICA0LCA1MCwxMDQsICA0LDIwMiwyNTQsMjAzLCAgNywyMDMsIDIxLDIwMywgMzcsMjI1LDI0MiwKKyAgICAyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxNjQsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsCisgICAgMjMzLCA5OSwxMjgsMjUxLDEwNywyMzMsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LAorICAgIDIzMywgOTksMTI4LDI1MSwxMDgsMjM3LDIyOSwyMjgsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywKKyAgICAgOTksMTI4LDI1MSwxMDksMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDI0OSwyMzgsCisgICAgMjQ1LDExNSwxMjgsIDM4LCA2NCwyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwgIDIsMjAzLCA4MCwyMDMsIDg2LAorICAgIDIyNiwyMjUsMTE0LDEyOCwgIDAsMTI0LDIzNiwyMzMsMjM4LDEwMSwgIDQsMjAzLCA5OSwyMDMsMTEwLDIwMywKKyAgICAxMjEsMjAzLDEzMCwyMjUsMjI2LDIzOSwyNDYsMjI5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDEzLDIyNiwyMjksCisgICAgMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgNDEsMjM2LDIzOSwyNDcsMjM3LDIzOSwxMDAsMTI4LAorICAgICAgMiwyMDQsMjM3LDIzOSwxMDAsMTI4LCAgMiwyMDAsMjQ3LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwKKyAgICAxMTAsMTI4LCAgNSwxMjYsMjMyLDIzOSwyMzksMTA3LDEyOCwgIDIsMTM5LDEwNSwgIDMsMjAzLDE2MywyMDMsCisgICAgMTc0LDIwMywyMTMsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDI0OCwyNDIsMjI1LAorICAgIDIzNywgOTcsICAzLDIwMywxODUsMjAzLDE5NSwyMDMsMjAyLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwKKyAgICAxMjgsICA5LDIwNSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNzcsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsCisgICAgMjQ0LDEwNSwxMjgsIDEwLDIwNSwyNDMsMjI1LDI0MiwyMzEsIDk3LCAgMywyMDMsMjI1LDIwMywyMzUsMjAzLAorICAgIDI0MiwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxMzEsMjI4LDIyOSwyNDYsIDk3LDEyOCwKKyAgICAgIDksICAzLDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxMzEsMjM3LDIzOSwyMzgsCisgICAgMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgODYsMTExLCAgMywyMDQsIDE3LDIwNCwgMjgsMjA0LAorICAgICA5OCwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsMTIwLDIzMywyMjcsMjI5LDEwMCwKKyAgICAgIDIsMjA0LCAzNywyMDQsIDczLDIzMywyNDQsMjI5LDI0MiwyMjUsMjQ0LDIzMywyMzksMTEwLCAgMiwyMDQsCisgICAgIDUxLDIwNCwgNjIsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE1OCwyMzUsMjI1LAorICAgIDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMjU0LDIzNywyMjUsMjQyLDIzNSwyMzUsMjI1LDIzOCwKKyAgICAgOTcsMTI5LCA0OCwxNTUsMjA0LCA4NiwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsCisgICAgMjU1LDE1OCwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMjUwLDI0MCwyMjUsMjQyLAorICAgIDIyOSwxMTAsMTI4LCAzNiwxNzcsMTE2LCAgMiwyMDQsMTIzLDIwNCwxMzAsMjMzLDIzNiwyMjgsMTAxLDEyOCwKKyAgICAgMzAsMTI1LDI0NSwyNDIsMjM4LDIyOSwxMDAsMTI4LCAgMiwxNDAsMTE3LCAgMiwyMDQsMTQ0LDIwNCwxNTUsCisgICAgMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE0OCwyMzUsMjI1LDI0NCwyMjUsMjM1LAorICAgIDIyNSwyMzgsIDk3LDEyOCwgNDgsMjQ0LDExOSwxNDMsICAwLDExOSwyMDQsMjAwLDIwNSwxNzcsMjA1LDE4NywKKyAgICAyMDUsMjEwLDIwNSwyNTAsMjA2LCA2MSwyMDYsIDY5LDIwOCwgNDAsMjA4LCA4MSwyMDgsIDkzLDIwOCwxNjgsCisgICAgMjA4LDE3NiwyMDgsMTgzLDIwOCwxOTQsMjA4LDIwMywgOTcsICA4LDIwNCwyMTgsMjA0LDIyNSwyMDQsMjM1LAorICAgIDIwNCwyNDYsMjA1LCAyOCwyMDUsIDYwLDIwNSwgNzIsMjA1LDEwOCwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwKKyAgICAxMzEsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDg5LDIzMiwyMzMsMjQyLDIyNSwyMzEsCisgICAgMjI1LDIzOCwgOTcsMTI4LCA0OCwxNDMsMTA3LCAgMiwyMDQsMjUyLDIwNSwgMjAsMjI1LDI0NCwyMjUsMjM1LAorICAgIDIyNSwyMzgsIDk3LDEyOSwgNDgsMjM5LDIwNSwgIDgsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwKKyAgICAxMDQsMTI4LDI1NSwxNTYsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA4OCwyNDMsMjM3LDIyNSwyMzYsCisgICAgMTA4LCAgMiwyMDUsIDM4LDIwNSwgNDksMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LAorICAgIDE0MiwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMjM4LDI0NCwyNDQsMjM5LDI0MywKKyAgICAyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDg3LDExOCwgIDIsMjA1LCA3OCwyMDUsIDg2LDIyOSwyMjgsCisgICAgMjI1LDI0MywxMDQsMTI4LCA0OCwgMjgsMjQ5LDI0NSwyMzgsMjI4LDIyOSwyNDIsMjQzLDIyNywyMzksMjQyLAorICAgIDIyOSwyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LDEyOCwyNTQsIDUyLDExOSwgIDMsMjA1LDExNiwKKyAgICAyMDUsMTI1LDIwNSwxMzksMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNzIsMjMwLDIzMywyMzgsCisgICAgMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIzOCwyMzIsMjI1LDIzNywyNTAsMjI1LAorICAgIDIyNSwyMjYsMjM5LDI0NiwxMDEsICAyLDIwNSwxNTQsMjA1LDE2MywyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwKKyAgICAxMjgsICA2LCAzNiwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsCisgICAgMTM0LDIyNiwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDIyMSwyMjcsMjMzLDI0MiwgOTksICAyLAorICAgIDIwNSwxOTYsMjA1LDIwMSwyMzYsMTAxLDEyOCwgMzYsMjMwLDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOCwKKyAgICAgIDEsMTE3LDEwMCwgIDIsMjA1LDIxNiwyMDUsMjI2LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjgsCisgICAgIDMwLDEzMywyMzksMTE2LCAgMiwyMDUsMjMzLDIwNSwyNDIsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LAorICAgICAzMCwxMzUsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDEzNywxMDEsICA0LDIwNiwgIDQsMjA2LCAxNSwKKyAgICAyMDYsIDI3LDIwNiwgNTEsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE0NSwyMzMsCisgICAgMjI5LDI0MiwyNDMsMjQ0LDI0MiwyMjUsMjQzLDExNSwxMjgsIDMzLCAyNCwxMDcsICAyLDIwNiwgMzMsMjA2LAorICAgICA0MywyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyNDEsMjM5LDI0MiwyMjksMjI1LDExMCwKKyAgICAxMjgsIDQ5LCA5NCwyMzksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgOTMsMjMxLDI0MiwyMjUsCisgICAgMjQ2LDEwMSwxMjgsIDMwLDEyOSwyMzIsMjMzLDI0NCwxMDEsICA4LDIwNiwgOTAsMjA2LCA5OSwyMDYsMTgzLAorICAgIDIwNywgMTcsMjA3LDEwMSwyMDcsMTQ2LDIwNywxOTgsMjA3LDI1NCwyMjYsMjQ1LDIzNiwyMzYsMjI5LDExNiwKKyAgICAxMjgsIDM3LDIzMCwgOTksICAyLDIwNiwxMDUsMjA2LDEyNSwyMzMsMjQyLDIyNywyMzYsMTAxLDEyOSwgMzcsCisgICAgMjAzLDIwNiwxMTUsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDMsMTAxLDEyOCwgMzcsMjE3LDIzOSwyNDIsMjM4LAorICAgIDIyOSwyNDIsMjI2LDI0MiwyMjUsMjI3LDIzNSwyMjksMTE2LCAgMiwyMDYsMTQyLDIwNiwxNjIsMjM2LDIyOSwKKyAgICAyMzAsMTE2LDEyOSwgNDgsIDE0LDIwNiwxNTEsMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwxMjgsCisgICAgMjU0LCA2NywyNDIsMjMzLDIzMSwyMzIsMTE2LDEyOSwgNDgsIDE1LDIwNiwxNzIsMjQ2LDIyOSwyNDIsMjQ0LAorICAgIDIzMywyMjcsMjI1LDEwOCwxMjgsMjU0LCA2OCwxMDAsICAyLDIwNiwxODksMjA2LDIzMCwyMzMsMjI1LDIzNywKKyAgICAyMzksMjM4LDEwMCwxMjksIDM3LDE5OSwyMDYsMjAwLDIyNywyMzksMjM4LDI0NCwyMjUsMjMzLDIzOCwyMzMsCisgICAgMjM4LDIzMSwyMjYsMjM2LDIyNSwyMjcsMjM1LDI0MywyMzcsMjI1LDIzNiwyMzYsMjI4LDIzMywyMjUsMjM3LAorICAgIDIzOSwyMzgsMTAwLDEyOCwgMzcsMjAwLDIzOSwyNDcsMjM4LDI0MCwyMzksMjMzLDIzOCwyNDQsMjMzLDIzOCwKKyAgICAxMDMsICAyLDIwNiwyNDYsMjA3LCAgNiwyNDMsMjM3LDIyNSwyMzYsMjM2LDI0NCwyNDIsMjMzLDIyNSwyMzgsCisgICAgMjMxLDIzNiwxMDEsMTI4LCAzNywxOTEsMjQ0LDI0MiwyMzMsMjI1LDIzOCwyMzEsMjM2LDEwMSwxMjgsIDM3LAorICAgIDE4OSwyMzYsMTAxLCAgMiwyMDcsIDI0LDIwNywgNjYsMjMwLDI0NCwyNDAsMjM5LDIzMywyMzgsMjQ0LDIzMywKKyAgICAyMzgsMTAzLCAgMiwyMDcsIDM5LDIwNywgNTUsMjQzLDIzNywyMjUsMjM2LDIzNiwyNDQsMjQyLDIzMywyMjUsCisgICAgMjM4LDIzMSwyMzYsMTAxLDEyOCwgMzcsMTk1LDI0NCwyNDIsMjMzLDIyNSwyMzgsMjMxLDIzNiwxMDEsMTI4LAorICAgICAzNywxOTMsMjM4LDI0NCwyMzMsMjI3LDI0NSwyMzYsMjI1LDI0MiwyMjYsMjQyLDIyNSwyMjcsMjM1LDIyOSwKKyAgICAxMTYsICAyLDIwNywgODYsMjA3LCA5MywyMzYsMjI5LDIzMCwxMTYsMTI4LCA0OCwgMjIsMjQyLDIzMywyMzEsCisgICAgMjMyLDExNiwxMjgsIDQ4LCAyMywyNDIsMjMzLDIzMSwyMzIsMjQ0LDI0MCwyMzksMjMzLDIzOCwyNDQsMjMzLAorICAgIDIzOCwxMDMsICAyLDIwNywxMTksMjA3LDEzNSwyNDMsMjM3LDIyNSwyMzYsMjM2LDI0NCwyNDIsMjMzLDIyNSwKKyAgICAyMzgsMjMxLDIzNiwxMDEsMTI4LCAzNywxODUsMjQ0LDI0MiwyMzMsMjI1LDIzOCwyMzEsMjM2LDEwMSwxMjgsCisgICAgIDM3LDE4MywxMTUsICAzLDIwNywxNTQsMjA3LDE4NCwyMDcsMTkyLDEwOSwgIDIsMjA3LDE2MCwyMDcsMTcyLAorICAgIDIyNSwyMzYsMjM2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgMzcsMTcxLDIzMywyMzYsMjMzLDIzOCwKKyAgICAyMzEsMjMwLDIyNSwyMjcsMTAxLDEyOCwgMzgsIDU4LDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCAzNywxNjEsCisgICAgMjQ0LDIyNSwxMTQsMTI4LCAzOCwgIDYsMTE2LCAgMiwyMDcsMjA0LDIwNywyMTUsMjI5LDIzNiwyMjksMjQwLAorICAgIDIzMiwyMzksMjM4LDEwMSwxMjgsIDM4LCAxNSwyMzksMjQyLDI0NCwyMzksMjMzLDI0MywyMjksMjQzLDIzMiwKKyAgICAyMjksMjM2LDIzNiwyMjYsMjQyLDIyNSwyMjcsMjM1LDIyOSwxMTYsICAyLDIwNywyMzksMjA3LDI0NiwyMzYsCisgICAgMjI5LDIzMCwxMTYsMTI4LCA0OCwgMjQsMjQyLDIzMywyMzEsMjMyLDExNiwxMjgsIDQ4LCAyNSwyNDUsMjQwLAorICAgIDI0MCwyMzksMjMzLDIzOCwyNDQsMjMzLDIzOCwxMDMsICAyLDIwOCwgMTMsMjA4LCAyOSwyNDMsMjM3LDIyNSwKKyAgICAyMzYsMjM2LDI0NCwyNDIsMjMzLDIyNSwyMzgsMjMxLDIzNiwxMDEsMTI4LCAzNywxODEsMjQ0LDI0MiwyMzMsCisgICAgMjI1LDIzOCwyMzEsMjM2LDEwMSwxMjgsIDM3LDE3OSwxMDUsICAyLDIwOCwgNDYsMjA4LCA1NywyMzIsMjMzLAorICAgIDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTQ0LDEwNywgIDIsMjA4LCA2MywyMDgsIDczLDIyNSwKKyAgICAyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDI0MCwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksCisgICAgIDk1LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDg3LDExMSwgIDQsMjA4LAorICAgIDEwMywyMDgsMTE0LDIwOCwxMzksMjA4LDE1NywyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwKKyAgICAgNDgsMTQ2LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyNDIsMjA4LDEyNywyMzIsCisgICAgMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEwMiwxMTAsMTI5LCAzMiwxNjksMjA4LAorICAgIDE0NSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LDIzMCwyNDcsMjI1LDIyOSwKKyAgICAyMzgsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDM5LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxNzgsCisgICAgMjQyLDIzMywyMzgsMTAzLDEyOCwgMzAsMTUyLDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LAorICAgICAgMiwxODMsMjQ0LDI0NSwyNDIsMjM4LDIyOSwxMDAsMTI4LCAgMiwxNDEsMjQ5LDIzOCwxMTAsMTI4LCAgMSwKKyAgICAxOTEsMTIwLDEzNywgIDAsMTIwLDIwOCwyMzEsMjA4LDI0MiwyMDgsMjUzLDIwOSwgIDYsMjA5LCAzMywyMDksCisgICAgIDQ2LDIwOSwgNTAsMjA5LCA2MiwyMDksIDcwLDIyNSwyMjYsMjM5LDI0NiwyMjksMjI3LDIzNywgOTgsMTI4LAorICAgICAgMywgNjEsMjI2LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAxOCwyMjcsMjMzLDI0MiwKKyAgICAyMjcsMjM2LDEwMSwxMjgsIDM2LDIzMSwxMDAsICAyLDIwOSwgMTIsMjA5LCAyMiwyMzMsMjI5LDI0MiwyMjksCisgICAgMjQzLDIzMywxMTUsMTI4LCAzMCwxNDEsMjM5LDI0NCwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsIDMwLAorICAgIDEzOSwyMjksMjMyLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMDksMTA1LDEyOCwKKyAgICAgIDMsMTkwLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDg4LDI0MCwyMjUsCisgICAgMjQyLDIyOSwxMTAsMTI4LCAzNiwxNzksMjQzLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsICAyLAorICAgIDIyNywxMjEsMTQzLCAgMCwxMjEsMjA5LDExNSwyMTAsIDc0LDIxMCwgOTcsMjEwLDEzNywyMTIsMTAzLDIxMiwKKyAgICAxMTEsMjEyLDEyOCwyMTIsMTkyLDIxMiwyMDQsMjEzLDIwMSwyMTMsMjQxLDIxMywyNTMsMjE0LCAgOCwyMTQsCisgICAgIDI5LDIxNSwgIDIsIDk3LCAxMSwyMDksMTM5LDIwOSwxNTEsMjA5LDE2MSwyMDksMTY4LDIwOSwxNzUsMjA5LAorICAgIDE4NSwyMDksMjEwLDIwOSwyMjEsMjEwLCAgMywyMTAsIDE2LDIxMCwgNjIsMjI1LDIyOCwyMzksMjQzLDI0MSwKKyAgICAyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgNzgsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksCisgICAgMTc1LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAwLDI1MywyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNDcsMjI5LAorICAgIDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDgyLDIzMSwxMTcsICAyLDIwOSwxOTIsMjA5LDIwMSwKKyAgICAyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE3NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsCisgICAgIDEwLCA0NywyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTMyLDEwNywgIDIsMjA5LAorICAgIDIyNywyMDksMjUxLDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIyOCwyMDksMjM5LDIzMiwKKyAgICAyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTQ4LDIzOSwyNDIsMjI5LDIyNSwxMTAsCisgICAgMTI4LCA0OSwgODEsMjM3LDIyNSwyMzUsMjM1LDIyNSwyMzgsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDc4LAorICAgIDI0MywyMzcsMjI1LDIzNiwxMDgsICAyLDIxMCwgMjYsMjEwLCAzNywyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwKKyAgICAyMzgsIDk3LDEyOCwgNDgsMTMxLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyMjcsCisgICAgMjEwLCA1MCwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEwOCwyNDQsMjI3LAorICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA5OSwyMjcsMjMzLDI0MiwgOTksICAyLDIxMCwKKyAgICAgODMsMjEwLCA4OCwyMzYsMTAxLDEyOCwgMzYsMjMyLDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOCwgIDEsCisgICAgMTE5LDEwMCwgIDIsMjEwLDEwMywyMTAsMTEzLDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjgsICAwLAorICAgIDI1NSwyMzksMTE2LCAgMiwyMTAsMTIwLDIxMCwxMjksMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAzMCwKKyAgICAxNDMsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDI0NSwxMDEsICA3LDIxMCwxNTMsMjExLDE2MSwyMTEsCisgICAgMTcwLDIxMSwxODgsMjExLDIyMCwyMTIsIDQwLDIxMiwgOTEsMTA0LCAgOCwyMTAsMTcxLDIxMCwxODAsMjEwLAorICAgIDIxNCwyMTAsMjI4LDIxMSwgNDUsMjExLCA2MSwyMTEsMTIwLDIxMSwxMzgsMjI1LDI0MiwyMjUsMjI2LDIzMywKKyAgICAgOTksMTI4LCAgNiwgNzQsMjI2LDIyNSwyNDIsMjQyLDIyOSwxMDEsICAyLDIxMCwxOTEsMjEwLDIwMCwyMjUsCisgICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LDIxMCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LAorICAgIDIyNiwyMzMsIDk5LDEyOCwyNTEsMTc1LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywKKyAgICAgOTksMTI4LDI1NCwyNDIsMjMyLDIyNSwyMzcsMjUwLDIyNSwyMjUsMjI2LDIzOSwyNDYsMTAxLCAgNCwyMTAsCisgICAgMjQ3LDIxMSwgIDAsMjExLCAxNCwyMTEsIDMwLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDM4LAorICAgIDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxMzgsMjMzLDIzOCwKKyAgICAyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTM5LDIzNywyMjksCisgICAgMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTQwLDIzMywyMzgsMjMzLAorICAgIDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDI0MywyMzcsMTAxLCAgMiwKKyAgICAyMTEsIDY4LDIxMSwgODEsMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsCisgICAgMjQ0LDIyOSwyMzcsMTA1LCAgMiwyMTEsIDg5LDIxMSwxMDQsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LAorICAgIDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwyMjEsMjQzLDIzOSwyMzYsMjI1LDI0NCwyMjksMjI4LDIyNSwKKyAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsIDg4LDIzOCwyMzksMjM5LDIzOCwyMzAsMjMzLDIzOCwyMjUsCisgICAgMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsMTQ4LDI0NCwyMzIsMjQyLDIyOSwyMjksMjI4LAorICAgIDIzOSwyNDQsMjQzLDIyNiwyMjksMjM2LDIzOSwyNDcsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwKKyAgICAyMDksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgODYsMTEwLDEyOSwgIDAsMTY1LDIxMSwxNzYsCisgICAgMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwyMjksMTExLCAgMiwyMTEsMTk0LAorICAgIDIxMSwyMDMsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgODUsMjQyLDIzMywyMzgsMjMyLDIzMywKKyAgICAyMjksMjQ1LDIzMiwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDEzNCwxMTQsICAzLDIxMSwyMjgsCisgICAgMjEyLCAgOCwyMTIsIDIwLDIyNSwyMzIsMjI2LDIyOSwyMzgsMjQ5LDIzOSwyMzcsMTExLCAgMiwyMTEsMjQyLAorICAgIDIxMSwyNTEsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNzAsMjM2LDIyOSwyMzAsMjQ0LDIzMiwKKyAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTcwLDIzMywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsCisgICAgIDk5LDEyOCwgIDQsIDc1LDI0NSwyMjgsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMjQzLDIyNywyNDksMjQyLAorICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyNDksMjQzLDIzMywyMjksMjQ1LDIzOCwxMDMsICAzLDIxMiwKKyAgICAgNTMsMjEyLCA2MiwyMTIsIDc4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTI5LDI0MCwyMjUsCisgICAgMjM4LDI0MywyMzMsMjM5LDI0MywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDEzMSwyNDMsMjMzLAorICAgIDIzOSwyNDMsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMzAsMjQ0LDIzMywyNDYsMjMyLDIyOSwKKyAgICAyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNTQsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLDI0MywyMzIsCisgICAgMjM5LDIzOSwxMDcsMTI5LCAgMSwxODAsMjEyLDEyMCwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMjQ3LAorICAgIDEwNSwgIDUsMjEyLDE0MCwyMTIsMTUxLDIxMiwxNjIsMjEyLDE3MSwyMTIsMTc5LDIyNSwyNDIsMjM3LDIyOSwKKyAgICAyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMTcsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsCisgICAgICA0LCA4NywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA5OCwyMzgsMjQ5LDIyNSwyMzgsMTAzLAorICAgIDEyOCwgMzgsIDQ3LDI0NywyMzgsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDEzMCwKKyAgICAyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA4OSwxMTEsICA3LDIxMiwyMjAsCisgICAgMjEzLCAzNCwyMTMsIDQ1LDIxMywgNTUsMjEzLCA5MywyMTMsMTM5LDIxMywxNDgsMTAwLDEzMSwgIDUsMjE3LAorICAgIDIxMiwyMzAsMjEyLDI1MCwyMTMsICAzLDIyOCwyMjUsMjMxLDIyOSwyNDMsMTA0LDEyOSwyNTEsIDU3LDIxMiwKKyAgICAyNDEsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LDI1MSwgNTcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksCisgICAgMTI4LCAgNSwyMTcsMjQ5LDIzOSwxMDAsICAyLDIxMywgMTEsMjEzLCAyMCwyMzIsMjI5LDIyNiwyNDIsMjI5LAorICAgIDExOSwxMjgsICA1LDI0MiwyNDAsMjI1LDI0NCwyMjUsMjMyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwKKyAgICAyNTEsIDMxLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMzYsMjMzLDIzNSwyMzksCisgICAgMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTM3LDEwNywgIDIsMjEzLCA2MSwyMTMsIDg1LDIyNSwyNDQsMjI1LAorICAgIDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIzMiwyMTMsIDczLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwKKyAgICAyNDQsMTA0LDEyOCwyNTUsMTUwLDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgOTEsMjQzLDIzNywyMjUsCisgICAgMjM2LDEwOCwgIDIsMjEzLDEwMywyMTMsMTE0LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LAorICAgICA0OCwxMzUsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIzMSwyMTMsMTI3LDIzMiwKKyAgICAyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTEwLDI0NCwyMzEsMjQyLDIyOSwyMjksCisgICAgMTA3LDEyOCwgIDMsMjQzLDEyMSwgIDIsMjEzLDE1NCwyMTMsMTkxLCA5NywgIDIsMjEzLDE2MCwyMTMsMTcwLAorICAgIDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDEzNiwxMDcsICAyLDIxMywxNzYsMjEzLDE4NCwKKyAgICAyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTM1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAzNCwyMzMsCisgICAgMjM4LDIzMSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgMTMsMTEyLCAgMiwyMTMsMjA3LDIxMywyMTQsMjI1LAorICAgIDI0MiwyMjksMTEwLDEyOCwgMzYsMTgwLDIzOSwyMzEsMjI5LDIzMSwyNDIsMjI1LDIzNywyMzcsMjI5LDIzOCwKKyAgICAxMDUsMTI5LCAgMywxMjIsMjEzLDIzMCwyMzEsMjQyLDIyOSwyMjksMjM1LDIyNywyMzcsIDk4LDEyOCwgIDMsCisgICAgIDY5LDExNCwxMjksICAxLDE2NiwyMTMsMjQ3LDIzMywyMzgsMTAzLDEyOCwgMzAsMTUzLDI0MywyNDUsMjQwLAorICAgIDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAgMiwxODQsMTE2LCAgMiwyMTQsIDE0LDIxNCwgMjEsMjMzLDIzNiwKKyAgICAyMjgsMTAxLDEyOCwgMzAsMjQ5LDI0NSwyNDIsMjM4LDIyOSwxMDAsMTI4LCAgMiwxNDIsMTE3LCAgNSwyMTQsCisgICAgIDQxLDIxNCwgNTIsMjE0LCA2MiwyMTQsMTAwLDIxNCwyMzIsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LAorICAgICA5NywxMjgsIDQ4LDEzNCwyMzMsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxNDAsMTA3LCAgMiwKKyAgICAyMTQsIDY4LDIxNCwgOTIsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjMwLDIxNCwgODAsCisgICAgMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxNDksMjM5LDI0MiwyMjksMjI1LAorICAgIDExMCwxMjgsIDQ5LCA5NiwxMTUsICAzLDIxNCwxMDgsMjE0LDE0NiwyMTQsMTg3LDIyNiwyMzMsMTAzLCAgMiwKKyAgICAyMTQsMTE2LDIxNCwxMjcsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDEwNywyMzMsCisgICAgMjM5LDI0NCwyMzMsMjMwLDIzMywyMjksMjI4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LAorICAgICAgNCwxMDksMjM2LDIzMywyNDQsMjQ0LDIzNiwxMDEsICAyLDIxNCwxNTcsMjE0LDE2OCwyMjcsMjQ5LDI0MiwKKyAgICAyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTAzLDIzMywyMzksMjQ0LDIzMywyMzAsMjMzLDIyOSwyMjgsCisgICAgMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDEwNSwyMzcsMjI1LDIzNiwxMDgsICAyLAorICAgIDIxNCwxOTYsMjE0LDIwNywyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTMzLDIzNSwKKyAgICAyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyMjksMjE0LDIyMCwyMzIsMjI1LDIzNiwyMzAsCisgICAgMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEwOSwyNDksMTAxLCAgMiwyMTQsMjM5LDIxNCwyNDgsMjM1LAorICAgIDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMzksMjM5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwKKyAgICAgNDksMTM4LDI0OSwgOTcsICAyLDIxNSwgIDksMjE1LCAxOSwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsCisgICAgMTI4LCAgOSwyMjMsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDk1LDEyMiwxNDIsICAwLDEyMiwyMTUsIDU4LAorICAgIDIxNiwgNjYsMjE2LCA3NywyMTYsMTIwLDIxNiwxNDcsMjE3LDE4MiwyMTgsIDM0LDIxOCwgNzYsMjE4LCA4OCwKKyAgICAyMTgsMTAwLDIxOCwxMjgsMjE4LDEzNiwyMTgsMTUyLDIxOCwxNjEsIDk3LCAxMCwyMTUsIDgwLDIxNSwgOTEsCisgICAgMjE1LCA5OCwyMTUsMTA1LDIxNSwxMTYsMjE1LDE5NCwyMTUsMjI0LDIxNSwyMzUsMjE2LCAxNSwyMTYsIDI3LAorICAgIDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMDIsMjI3LDI0NSwyNDQsMTAxLDEyOCwKKyAgICAgIDEsMTIyLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA5MSwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsCisgICAgMTA1LDEyOCwgMTAsIDkxLDEwNCwgIDQsMjE1LDEyNiwyMTUsMTM1LDIxNSwxNDksMjE1LDE3OSwyMjUsMjQyLAorICAgIDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA1NiwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwKKyAgICAyMzMsIDk5LDEyOCwyNTQsMTk4LDEwNSwgIDIsMjE1LDE1NSwyMTUsMTcwLDIzOCwyMzMsMjQ0LDIzMywyMjUsCisgICAgMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTk5LDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LAorICAgIDEyOCwgNDgsIDg2LDIzNywyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwKKyAgICAyNTQsMjAwLDIzMywxMTAsICAyLDIxNSwyMDEsMjE1LDIxMCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCisgICAgICA2LCA1MCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTc2LAorICAgIDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwxODIsMjQxLDIyOSwxMDIsICAyLDIxNSwKKyAgICAyNDMsMjE2LCAgMSwyMzEsMjI1LDIyOCwyMzksMjM2LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsCisgICAgMTQ5LDI0MSwyMjUsMjQ0LDIyNSwyMzgsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNDgsMjQyLAorICAgIDI0MSwyMjUsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNTIsMjQ5LDIzMywxMTAsMTMwLCAgNSwKKyAgICAyMTQsMjE2LCAzNywyMTYsIDU3LDIyOCwyMjUsMjMxLDIyOSwyNDMsMTA0LDEyOSwyNTEsIDU0LDIxNiwgNDgsCisgICAgMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LDI1MSwgNTQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAorICAgICAgNSwyMTQsMjI2LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAyMywgOTksICAzLDIxNiwKKyAgICAgODUsMjE2LCA5MiwyMTYsMTE0LDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLDEyNiwyMzMsMjQyLCA5OSwgIDIsCisgICAgMjE2LDEwMCwyMTYsMTA1LDIzNiwxMDEsMTI4LCAzNiwyMzMsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTI4LAorICAgICAzMCwxNDUsMjQ1LDI0MiwxMDgsMTI4LCAgMiwxNDUsMjI4LDIzOSwxMTYsMTMwLCAgMSwxMjQsMjE2LDEzMCwKKyAgICAyMTYsMTM5LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgIDEsMTI0LDIyNiwyMjksMjM2LDIzOSwxMTksCisgICAgMTI4LCAzMCwxNDcsMTAxLCAgNiwyMTYsMTYxLDIxNiwxNzIsMjE2LDIxNSwyMTYsMjI2LDIxNiwyMzcsMjE3LAorICAgIDE3NywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDU1LDEwMCwgIDIsMjE2LDE3OCwKKyAgICAyMTYsMTk3LDIyOSwyNDMsMjI3LDIyOSwyMzgsMjI4LDIyOSwyNDIsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCisgICAgMjMzLCA5OSwxMjgsICA0LDE1MywyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywyNDMsMjI3LDI0OSwyNDIsMjMzLAorICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDIyMywyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwKKyAgICAgNDgsIDkyLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwxODgsMjQyLDExMSwxNDAsCisgICAgICAwLCA0OCwyMTcsIDEwLDIxNywgMTksMjE3LCAyOSwyMTcsIDM2LDIxNywgNjEsMjE3LCA3NCwyMTcsIDg1LAorICAgIDIxNywgOTcsMjE3LDEwOCwyMTcsMTE4LDIxNywxMjksMjE3LDEzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwKKyAgICAxMjgsICA2LCA5NiwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMzAsMjI4LDIyOSwyNDYsCisgICAgIDk3LDEyOCwgIDksMTAyLDIzMSwxMTcsICAyLDIxNywgNDMsMjE3LCA1MiwyMzQsMjI1LDI0MiwyMjUsMjQ0LAorICAgIDEwNSwxMjgsIDEwLDIzMCwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLDEwMiwyMzIsMjI1LDIyNywKKyAgICAyMzUsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgOTYsMjMzLDIzOCwyMzAsMjI5LDI0MiwyMzMsCisgICAgMjM5LDExNCwxMjgsIDMyLDEyOCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LAorICAgICAxNiwyMzksMjM2LDIyOCwyNDMsMjQ0LDI0OSwyMzYsMTAxLDEyOCwyNDcsIDQ4LDI0MCwyMjksMjQyLDI0MywKKyAgICAyMzMsMjI1LDExMCwxMjgsICA2LDI0MCwyNDMsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsCisgICAgMTEyLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA4MCwyNDcsMjMzLDIyOCwyNDQsMTA0LCAgMywyMTcsMTQ4LAorICAgIDIxNywxNTcsMjE3LDE2OSwyMzQsMjM5LDIzMywyMzgsMjI5LDExNCwxMjgsMjU0LDI1NSwyMzgsMjM5LDIzOCwKKyAgICAyMzQsMjM5LDIzMywyMzgsMjI5LDExNCwxMjgsIDMyLCAxMiwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwgMzIsCisgICAgIDExLDI0NCwgOTcsMTI4LCAgMywxODIsMTA0LCAgMiwyMTcsMTg4LDIxNywxOTksMjI2LDIzOSwyNDAsMjM5LAorICAgIDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAxOSwxMDEsICA0LDIxNywyMDksMjE3LDIyMCwyMTcsMjM2LDIxNywKKyAgICAyNDcsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDEwNiwyMjYsMjQyLDIyOSwyNDYsCisgICAgMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxOTQsMjI3LDI0OSwyNDIsMjMzLAorICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA1NCwxMDAsICAyLDIxNywyNTMsMjE4LCAxNiwyMjksMjQzLDIyNywKKyAgICAyMjksMjM4LDIyOCwyMjksMjQyLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNTEsCisgICAgMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMjQzLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LAorICAgICAgNCwyMjEsMTA1LCAgMywyMTgsIDQyLDIxOCwgNTMsMjE4LCA2NCwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwKKyAgICAyMzgsIDk3LDEyOCwgNDgsIDg4LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwxODQsCisgICAgMjM4LDIzOSwyNDIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNzQsMjM2LDIzMywyMzgsMjI5LAorICAgIDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxNDksMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywKKyAgICAxMDEsMTI4LDI1NSwgOTAsMTExLCAgMiwyMTgsMTA2LDIxOCwxMTcsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsCisgICAgMjM4LCA5NywxMjgsIDQ4LCA5NCwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMTkwLAorICAgIDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxODEsMjQyLDIyOSwyNDQsMjQyLDIzOSwyMzAsMjM2LDIyOSwKKyAgICAyNDgsMjMyLDIzOSwyMzksMTA3LDEyOCwgIDIsMTQ0LDI0MywyNDQsMjQyLDIzOSwyMzUsMTAxLDEyOCwgIDEsCisgICAgMTgyLDExNywgIDIsMjE4LDE2NywyMTgsMTc4LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LAorICAgICA0OCwgOTAsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE4NgorICB9CisjZW5kaWYgLyogREVGSU5FX1BTX1RBQkxFU19EQVRBICovCisgIDsKKworCisjaWZkZWYgIERFRklORV9QU19UQUJMRVMKKyAgLyoKKyAgICogIFRoaXMgZnVuY3Rpb24gc2VhcmNoZXMgdGhlIGNvbXByZXNzZWQgdGFibGUgZWZmaWNpZW50bHkuCisgICAqLworICBzdGF0aWMgdW5zaWduZWQgbG9uZworICBmdF9nZXRfYWRvYmVfZ2x5cGhfaW5kZXgoIGNvbnN0IGNoYXIqICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBsaW1pdCApCisgIHsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgYyA9IDA7CisgICAgaW50ICAgICAgICAgICAgICAgICAgIGNvdW50LCBtaW4sIG1heDsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiAgcCA9IGZ0X2Fkb2JlX2dseXBoX2xpc3Q7CisKKworICAgIGlmICggbmFtZSA9PSAwIHx8IG5hbWUgPj0gbGltaXQgKQorICAgICAgZ290byBOb3RGb3VuZDsKKworICAgIGMgICAgID0gKm5hbWUrKzsKKyAgICBjb3VudCA9IHBbMV07CisgICAgcCAgICArPSAyOworCisgICAgbWluID0gMDsKKyAgICBtYXggPSBjb3VudDsKKworICAgIHdoaWxlICggbWluIDwgbWF4ICkKKyAgICB7CisgICAgICBpbnQgICAgICAgICAgICAgICAgICAgbWlkID0gKCBtaW4gKyBtYXggKSA+PiAxOworICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogIHEgICA9IHAgKyBtaWQgKiAyOworICAgICAgaW50ICAgICAgICAgICAgICAgICAgIGMyOworCisKKyAgICAgIHEgPSBmdF9hZG9iZV9nbHlwaF9saXN0ICsgKCAoIChpbnQpcVswXSA8PCA4ICkgfCBxWzFdICk7CisKKyAgICAgIGMyID0gcVswXSAmIDEyNzsKKyAgICAgIGlmICggYzIgPT0gYyApCisgICAgICB7CisgICAgICAgIHAgPSBxOworICAgICAgICBnb3RvIEZvdW5kOworICAgICAgfQorICAgICAgaWYgKCBjMiA8IGMgKQorICAgICAgICBtaW4gPSBtaWQgKyAxOworICAgICAgZWxzZQorICAgICAgICBtYXggPSBtaWQ7CisgICAgfQorICAgIGdvdG8gTm90Rm91bmQ7CisKKyAgRm91bmQ6CisgICAgZm9yICg7OykKKyAgICB7CisgICAgICAvKiBhc3NlcnQgKCpwICYgMTI3KSA9PSBjICovCisKKyAgICAgIGlmICggbmFtZSA+PSBsaW1pdCApCisgICAgICB7CisgICAgICAgIGlmICggKHBbMF0gJiAxMjgpID09IDAgJiYKKyAgICAgICAgICAgICAocFsxXSAmIDEyOCkgIT0gMCApCisgICAgICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKSggKCAoaW50KXBbMl0gPDwgOCApIHwgcFszXSApOworCisgICAgICAgIGdvdG8gTm90Rm91bmQ7CisgICAgICB9CisgICAgICBjID0gKm5hbWUrKzsKKyAgICAgIGlmICggcFswXSAmIDEyOCApCisgICAgICB7CisgICAgICAgIHArKzsKKyAgICAgICAgaWYgKCBjICE9IChwWzBdICYgMTI3KSApCisgICAgICAgICAgZ290byBOb3RGb3VuZDsKKworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgcCsrOworICAgICAgY291bnQgPSBwWzBdICYgMTI3OworICAgICAgaWYgKCBwWzBdICYgMTI4ICkKKyAgICAgICAgcCArPSAyOworCisgICAgICBwKys7CisKKyAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBwICs9IDIgKQorICAgICAgeworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKCAoaW50KXBbMF0gPDwgOCApIHwgcFsxXTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogIHEgICAgICA9IGZ0X2Fkb2JlX2dseXBoX2xpc3QgKyBvZmZzZXQ7CisKKyAgICAgICAgaWYgKCBjID09ICggcVswXSAmIDEyNyApICkKKyAgICAgICAgeworICAgICAgICAgIHAgPSBxOworICAgICAgICAgIGdvdG8gTmV4dEl0ZXI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGdvdG8gTm90Rm91bmQ7CisKKyAgICBOZXh0SXRlcjoKKyAgICAgIDsKKyAgICB9CisKKyAgTm90Rm91bmQ6CisgICAgcmV0dXJuIDA7CisgIH0KKyNlbmRpZiAvKiBERUZJTkVfUFNfVEFCTEVTICovCisKKyNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX0FET0JFX0dMWVBIX0xJU1QgKi8KKworCisvKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3JvbGwtZnJlZXR5cGUuc2ggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9yb2xsLWZyZWV0eXBlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5MzBhNjQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9yb2xsLWZyZWV0eXBlLnNoCkBAIC0wLDAgKzEsMjYgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAyMDE3IFRoZSBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitzZXQgLWUKK3NldCAtbyBwaXBlZmFpbAorc2V0IC11CisKK1JFVklFV0VSUz1gcGFzdGUgLXMgLWQsIHRoaXJkX3BhcnR5L2ZyZWV0eXBlL09XTkVSU2AKK3JvbGwtZGVwIC1yICIke1JFVklFV0VSU30iICIkQCIgcGRmaXVtL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy8KK0ZUVkVSU0lPTj1gZ2l0IC1DIHRoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy8gZGVzY3JpYmUgLS1sb25nYAorRlRDT01NSVQ9YGdpdCAtQyB0aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvIHJldi1wYXJzZSBIRUFEYAorCisjIE1ha2Ugc3VyZSBvdXIgY29weSBvZiBwc3RhYmxlcy5oIG1hdGNoZXMgdGhlIG9uZSBpbiBmcmVldHlwZS9zcmMuCitjbXAgdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NyYy9wc25hbWVzL3BzdGFibGVzLmggXAorICB0aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL3BzdGFibGVzLmgKKworc2VkIC1pICJzL15WZXJzaW9uOiAuKlwkL1ZlcnNpb246ICR7RlRWRVJTSU9OJS0qfS8iIFwKKyAgdGhpcmRfcGFydHkvZnJlZXR5cGUvUkVBRE1FLnBkZml1bQorc2VkIC1pICJzL15SZXZpc2lvbjogLipcJC9SZXZpc2lvbjogJHtGVENPTU1JVH0vIiBcCisgIHRoaXJkX3BhcnR5L2ZyZWV0eXBlL1JFQURNRS5wZGZpdW0KKworZ2l0IGFkZCB0aGlyZF9wYXJ0eS9mcmVldHlwZS9SRUFETUUucGRmaXVtCitnaXQgY29tbWl0IC0tcXVpZXQgLS1hbWVuZCAtLW5vLWVkaXQKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL0phbWZpbGUgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzlmYjA5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0jIEZyZWVUeXBlIDIgc3JjL2Jhc2UgSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIGJhc2UgOwotCi0KLXsKLSAgbG9jYWwgIF9zb3VyY2VzIDsKLQotICBpZiAkKEZUMl9NVUxUSSkKLSAgewotICAgIF9zb3VyY2VzID0gYmFzZXBpYwotICAgICAgICAgICAgICAgZnRhZHZhbmMKLSAgICAgICAgICAgICAgIGZ0Y2FsYwotICAgICAgICAgICAgICAgZnRkYmdtZW0KLSAgICAgICAgICAgICAgIGZ0Z2xvYWRyCi0gICAgICAgICAgICAgICBmdG9ianMKLSAgICAgICAgICAgICAgIGZ0b3V0bG4KLSAgICAgICAgICAgICAgIGZ0cGljCi0gICAgICAgICAgICAgICBmdHJmb3JrCi0gICAgICAgICAgICAgICBmdHNuYW1lcwotICAgICAgICAgICAgICAgZnRzdHJlYW0KLSAgICAgICAgICAgICAgIGZ0dHJpZ29uCi0gICAgICAgICAgICAgICBmdHV0aWwKLSAgICAgICAgICAgICAgIDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBfc291cmNlcyA9IGZ0YmFzZSA7Ci0gIH0KLQotICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogJChfc291cmNlcykuYyA7Ci19Ci0KLSMgQWRkIHRoZSBvcHRpb25hbC9yZXBsYWNlYWJsZSBmaWxlcy4KLSMKLXsKLSAgbG9jYWwgIF9zb3VyY2VzID0gZnRhcGkKLSAgICAgICAgICAgICAgICAgICAgZnRiYm94Ci0gICAgICAgICAgICAgICAgICAgIGZ0YmRmCi0gICAgICAgICAgICAgICAgICAgIGZ0Yml0bWFwCi0gICAgICAgICAgICAgICAgICAgIGZ0Y2lkCi0gICAgICAgICAgICAgICAgICAgIGZ0ZGVidWcKLSAgICAgICAgICAgICAgICAgICAgZnRmbnRmbXQKLSAgICAgICAgICAgICAgICAgICAgZnRmc3R5cGUKLSAgICAgICAgICAgICAgICAgICAgZnRnYXNwCi0gICAgICAgICAgICAgICAgICAgIGZ0Z2x5cGgKLSAgICAgICAgICAgICAgICAgICAgZnRneHZhbAotICAgICAgICAgICAgICAgICAgICBmdGluaXQKLSAgICAgICAgICAgICAgICAgICAgZnRsY2RmaWwKLSAgICAgICAgICAgICAgICAgICAgZnRtbQotICAgICAgICAgICAgICAgICAgICBmdG90dmFsCi0gICAgICAgICAgICAgICAgICAgIGZ0cGF0ZW50Ci0gICAgICAgICAgICAgICAgICAgIGZ0cGZyCi0gICAgICAgICAgICAgICAgICAgIGZ0c3Ryb2tlCi0gICAgICAgICAgICAgICAgICAgIGZ0c3ludGgKLSAgICAgICAgICAgICAgICAgICAgZnRzeXN0ZW0KLSAgICAgICAgICAgICAgICAgICAgZnR0eXBlMQotICAgICAgICAgICAgICAgICAgICBmdHdpbmZudAotICAgICAgICAgICAgICAgICAgICA7Ci0KLSAgTGlicmFyeSAgJChGVDJfTElCKSA6ICQoX3NvdXJjZXMpLmMgOwotfQotCi0jIEFkZCBNYWNpbnRvc2gtc3BlY2lmaWMgZmlsZSB0byB0aGUgbGlicmFyeSB3aGVuIG5lY2Vzc2FyeS4KLSMKLWlmICQoTUFDKQotewotICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogZnRtYWMuYyA7Ci19Ci1lbHNlIGlmICQoT1MpID0gTUFDT1NYCi17Ci0gIGlmICQoRlQyX01VTFRJKQotICB7Ci0gICAgTGlicmFyeSAgJChGVDJfTElCKSA6IGZ0bWFjLmMgOwotICB9Ci19Ci0KLSMgZW5kIG9mIHNyYy9iYXNlIEphbWZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Jhc2VwaWMuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Jhc2VwaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1MGVkOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9iYXNlcGljLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYmFzZXBpYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHNlcnZpY2VzIGZvciBiYXNlLiAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgImJhc2VwaWMuaCIKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotICAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIFBJQyBpbml0IGZ1bmN0aW9ucyBmcm9tIGZ0Z2x5cGguYyAqLwotICB2b2lkCi0gIEZUX0luaXRfQ2xhc3NfZnRfb3V0bGluZV9nbHlwaF9jbGFzcyggRlRfR2x5cGhfQ2xhc3MqICBjbGF6eiApOwotCi0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc19mdF9iaXRtYXBfZ2x5cGhfY2xhc3MoIEZUX0dseXBoX0NsYXNzKiAgY2xhenogKTsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fTUFDX0ZPTlRTCi0gIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgUElDIGluaXQgZnVuY3Rpb24gZnJvbSBmdHJmb3JrLmMgKi8KLSAgLyogKG5vdCBtb2R1bGFyaXplZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB2b2lkCi0gIEZUX0luaXRfVGFibGVfZnRfcmFjY2Vzc19ndWVzc190YWJsZSggZnRfcmFjY2Vzc19ndWVzc19yZWMqICByZWNvcmQgKTsKLSNlbmRpZgotCi0gIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgUElDIGluaXQgZnVuY3Rpb25zIGZyb20gZnRpbml0LmMgKi8KLSAgRlRfRXJyb3IKLSAgZnRfY3JlYXRlX2RlZmF1bHRfbW9kdWxlX2NsYXNzZXMoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotICB2b2lkCi0gIGZ0X2Rlc3Ryb3lfZGVmYXVsdF9tb2R1bGVfY2xhc3NlcyggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0KLSAgdm9pZAotICBmdF9iYXNlX3BpY19mcmVlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeSAgICAgICAgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLQotICAgIGlmICggcGljX2NvbnRhaW5lci0+YmFzZSApCi0gICAgewotICAgICAgLyogZGVzdHJveSBkZWZhdWx0IG1vZHVsZSBjbGFzc2VzICAgICAgICAgICAgKi8KLSAgICAgIC8qIChpbiBjYXNlIEZUX0FkZF9EZWZhdWx0X01vZHVsZXMgd2FzIHVzZWQpICovCi0gICAgICBmdF9kZXN0cm95X2RlZmF1bHRfbW9kdWxlX2NsYXNzZXMoIGxpYnJhcnkgKTsKLQotICAgICAgRlRfRlJFRSggcGljX2NvbnRhaW5lci0+YmFzZSApOwotICAgICAgcGljX2NvbnRhaW5lci0+YmFzZSA9IE5VTEw7Ci0gICAgfQotICB9Ci0KLQotICBGVF9FcnJvcgotICBmdF9iYXNlX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yICAgICAgICAgPSBGVF9FcnJfT2s7Ci0gICAgQmFzZVBJQyogICAgICAgICAgIGNvbnRhaW5lciAgICAgPSBOVUxMOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICAvKiBhbGxvY2F0ZSBwb2ludGVyLCBjbGVhciBhbmQgc2V0IGdsb2JhbCBjb250YWluZXIgcG9pbnRlciAqLwotICAgIGlmICggRlRfQUxMT0MoIGNvbnRhaW5lciwgc2l6ZW9mICggKmNvbnRhaW5lciApICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIEZUX01FTV9TRVQoIGNvbnRhaW5lciwgMCwgc2l6ZW9mICggKmNvbnRhaW5lciApICk7Ci0gICAgcGljX2NvbnRhaW5lci0+YmFzZSA9IGNvbnRhaW5lcjsKLQotICAgIC8qIGluaXRpYWxpemUgZGVmYXVsdCBtb2R1bGVzIGxpc3QgYW5kIHBvaW50ZXJzICovCi0gICAgZXJyb3IgPSBmdF9jcmVhdGVfZGVmYXVsdF9tb2R1bGVfY2xhc3NlcyggbGlicmFyeSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogaW5pdGlhbGl6ZSBwb2ludGVyIHRhYmxlIC0gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogdGhpcyBpcyBob3cgdGhlIG1vZHVsZSB1c3VhbGx5IGV4cGVjdHMgdGhpcyBkYXRhICovCi0gICAgRlRfSW5pdF9DbGFzc19mdF9vdXRsaW5lX2dseXBoX2NsYXNzKAotICAgICAgJmNvbnRhaW5lci0+ZnRfb3V0bGluZV9nbHlwaF9jbGFzcyApOwotICAgIEZUX0luaXRfQ2xhc3NfZnRfYml0bWFwX2dseXBoX2NsYXNzKAotICAgICAgJmNvbnRhaW5lci0+ZnRfYml0bWFwX2dseXBoX2NsYXNzICk7Ci0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9NQUNfRk9OVFMKLSAgICBGVF9Jbml0X1RhYmxlX2Z0X3JhY2Nlc3NfZ3Vlc3NfdGFibGUoCi0gICAgICAoZnRfcmFjY2Vzc19ndWVzc19yZWMqKSZjb250YWluZXItPmZ0X3JhY2Nlc3NfZ3Vlc3NfdGFibGUgKTsKLSNlbmRpZgotCi0gIEV4aXQ6Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBmdF9iYXNlX3BpY19mcmVlKCBsaWJyYXJ5ICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvYmFzZXBpYy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvYmFzZXBpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWQ3Y2JmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Jhc2VwaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGJhc2VwaWMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3IgYmFzZS4gICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0JBU0VQSUNfSF9fCi0jZGVmaW5lIF9fQkFTRVBJQ19IX18KLQotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QSUNfSAotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9PVVRMSU5FX0dMWVBIX0NMQVNTX0dFVCAgJmZ0X291dGxpbmVfZ2x5cGhfY2xhc3MKLSNkZWZpbmUgRlRfQklUTUFQX0dMWVBIX0NMQVNTX0dFVCAgICZmdF9iaXRtYXBfZ2x5cGhfY2xhc3MKLSNkZWZpbmUgRlRfREVGQVVMVF9NT0RVTEVTX0dFVCAgICAgIGZ0X2RlZmF1bHRfbW9kdWxlcwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9HVUVTU0lOR19FTUJFRERFRF9SRk9SSwotI2RlZmluZSBGVF9SQUNDRVNTX0dVRVNTX1RBQkxFX0dFVCAgZnRfcmFjY2Vzc19ndWVzc190YWJsZQotI2VuZGlmCi0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSNpbmNsdWRlIEZUX0dMWVBIX0gKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fR1VFU1NJTkdfRU1CRURERURfUkZPUksKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1JGT1JLX0gKLSNlbmRpZgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIHR5cGVkZWYgc3RydWN0ICBCYXNlUElDXwotICB7Ci0gICAgRlRfTW9kdWxlX0NsYXNzKiogIGRlZmF1bHRfbW9kdWxlX2NsYXNzZXM7Ci0gICAgRlRfR2x5cGhfQ2xhc3MgICAgIGZ0X291dGxpbmVfZ2x5cGhfY2xhc3M7Ci0gICAgRlRfR2x5cGhfQ2xhc3MgICAgIGZ0X2JpdG1hcF9nbHlwaF9jbGFzczsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fR1VFU1NJTkdfRU1CRURERURfUkZPUksKLSAgICBmdF9yYWNjZXNzX2d1ZXNzX3JlYyAgZnRfcmFjY2Vzc19ndWVzc190YWJsZVtGVF9SQUNDRVNTX05fUlVMRVNdOwotI2VuZGlmCi0KLSAgfSBCYXNlUElDOwotCi0KLSNkZWZpbmUgR0VUX1BJQyggbGliICkgICggKEJhc2VQSUMqKSggKGxpYiktPnBpY19jb250YWluZXIuYmFzZSApICkKLQotI2RlZmluZSBGVF9PVVRMSU5FX0dMWVBIX0NMQVNTX0dFVCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAmR0VUX1BJQyggbGlicmFyeSApLT5mdF9vdXRsaW5lX2dseXBoX2NsYXNzICkKLSNkZWZpbmUgRlRfQklUTUFQX0dMWVBIX0NMQVNTX0dFVCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoICZHRVRfUElDKCBsaWJyYXJ5ICktPmZ0X2JpdG1hcF9nbHlwaF9jbGFzcyApCi0jZGVmaW5lIEZUX0RFRkFVTFRfTU9EVUxFU19HRVQgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPmRlZmF1bHRfbW9kdWxlX2NsYXNzZXMgKQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9HVUVTU0lOR19FTUJFRERFRF9SRk9SSwotI2RlZmluZSBGVF9SQUNDRVNTX0dVRVNTX1RBQkxFX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT5mdF9yYWNjZXNzX2d1ZXNzX3RhYmxlICkKLSNlbmRpZgotCi0KLSAgLyogc2VlIGJhc2VwaWMuYyBmb3IgdGhlIGltcGxlbWVudGF0aW9uICovCi0gIHZvaWQKLSAgZnRfYmFzZV9waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0gIEZUX0Vycm9yCi0gIGZ0X2Jhc2VfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICAvKiAqLwotCi0jZW5kaWYgLyogX19CQVNFUElDX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRhZHZhbmMuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0YWR2YW5jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMjkwOGYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRhZHZhbmMuYworKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGFkdmFuYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUXVpY2sgY29tcHV0YXRpb24gb2YgYWR2YW5jZSB3aWR0aHMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDgtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0jaW5jbHVkZSBGVF9BRFZBTkNFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBfZnRfZmFjZV9zY2FsZV9hZHZhbmNlcyggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBhZHZhbmNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgIGZsYWdzICkKLSAgewotICAgIEZUX0ZpeGVkICBzY2FsZTsKLSAgICBGVF9VSW50ICAgbm47Ci0KLQotICAgIGlmICggZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkKLSAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0KLSAgICBpZiAoIGZhY2UtPnNpemUgPT0gTlVMTCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfU2l6ZV9IYW5kbGUgKTsKLQotICAgIGlmICggZmxhZ3MgJiBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCApCi0gICAgICBzY2FsZSA9IGZhY2UtPnNpemUtPm1ldHJpY3MueV9zY2FsZTsKLSAgICBlbHNlCi0gICAgICBzY2FsZSA9IGZhY2UtPnNpemUtPm1ldHJpY3MueF9zY2FsZTsKLQotICAgIC8qIHRoaXMgbXVzdCBiZSB0aGUgc2FtZSBzY2FsaW5nIGFzIHRvIGdldCBsaW5lYXJ7SG9yaSxWZXJ0fUFkdmFuY2UgKi8KLSAgICAvKiAoc2VlIGBGVF9Mb2FkX0dseXBoJyBpbXBsZW1lbnRhdGlvbiBpbiBzcmMvYmFzZS9mdG9ianMuYykgICAgICAgICovCi0KLSAgICBmb3IgKCBubiA9IDA7IG5uIDwgY291bnQ7IG5uKysgKQotICAgICAgYWR2YW5jZXNbbm5dID0gRlRfTXVsRGl2KCBhZHZhbmNlc1tubl0sIHNjYWxlLCA2NCApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgIC8qIGF0IHRoZSBtb21lbnQsIHdlIGNhbiBwZXJmb3JtIGZhc3QgYWR2YW5jZSByZXRyaWV2YWwgb25seSBpbiAqLwotICAgLyogdGhlIGZvbGxvd2luZyBjYXNlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgIC8qICAtIHVuc2NhbGVkIGxvYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgLyogIC0gdW5oaW50ZWQgbG9hZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAvKiAgLSBsaWdodC1oaW50ZWQgbG9hZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBMT0FEX0FEVkFOQ0VfRkFTVF9DSEVDSyggZmxhZ3MgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBmbGFncyAmICggRlRfTE9BRF9OT19TQ0FMRSB8IEZUX0xPQURfTk9fSElOVElORyApICAgIHx8IFwKLSAgICAgICAgICAgIEZUX0xPQURfVEFSR0VUX01PREUoIGZsYWdzICkgPT0gRlRfUkVOREVSX01PREVfTElHSFQgKQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGFkdmFuYy5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRfQWR2YW5jZSggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICpwYWR2YW5jZSApCi0gIHsKLSAgICBGVF9GYWNlX0dldEFkdmFuY2VzRnVuYyAgZnVuYzsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIGlmICggIXBhZHZhbmNlICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgaWYgKCBnaW5kZXggPj0gKEZUX1VJbnQpZmFjZS0+bnVtX2dseXBocyApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfR2x5cGhfSW5kZXggKTsKLQotICAgIGZ1bmMgPSBmYWNlLT5kcml2ZXItPmNsYXp6LT5nZXRfYWR2YW5jZXM7Ci0gICAgaWYgKCBmdW5jICYmIExPQURfQURWQU5DRV9GQVNUX0NIRUNLKCBmbGFncyApICkKLSAgICB7Ci0gICAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgICAgZXJyb3IgPSBmdW5jKCBmYWNlLCBnaW5kZXgsIDEsIGZsYWdzLCBwYWR2YW5jZSApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICByZXR1cm4gX2Z0X2ZhY2Vfc2NhbGVfYWR2YW5jZXMoIGZhY2UsIHBhZHZhbmNlLCAxLCBmbGFncyApOwotCi0gICAgICBpZiAoIEZUX0VSUl9ORVEoIGVycm9yLCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKSApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfR2V0X0FkdmFuY2VzKCBmYWNlLCBnaW5kZXgsIDEsIGZsYWdzLCBwYWR2YW5jZSApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0YWR2YW5jLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldF9BZHZhbmNlcyggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAqcGFkdmFuY2VzICkKLSAgewotICAgIEZUX0ZhY2VfR2V0QWR2YW5jZXNGdW5jICBmdW5jOwotICAgIEZUX1VJbnQgICAgICAgICAgICAgICAgICBudW0sIGVuZCwgbm47Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GYWNlX0hhbmRsZSApOwotCi0gICAgaWYgKCAhcGFkdmFuY2VzICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgbnVtID0gKEZUX1VJbnQpZmFjZS0+bnVtX2dseXBoczsKLSAgICBlbmQgPSBzdGFydCArIGNvdW50OwotICAgIGlmICggc3RhcnQgPj0gbnVtIHx8IGVuZCA8IHN0YXJ0IHx8IGVuZCA+IG51bSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfR2x5cGhfSW5kZXggKTsKLQotICAgIGlmICggY291bnQgPT0gMCApCi0gICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgZnVuYyA9IGZhY2UtPmRyaXZlci0+Y2xhenotPmdldF9hZHZhbmNlczsKLSAgICBpZiAoIGZ1bmMgJiYgTE9BRF9BRFZBTkNFX0ZBU1RfQ0hFQ0soIGZsYWdzICkgKQotICAgIHsKLSAgICAgIGVycm9yID0gZnVuYyggZmFjZSwgc3RhcnQsIGNvdW50LCBmbGFncywgcGFkdmFuY2VzICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIHJldHVybiBfZnRfZmFjZV9zY2FsZV9hZHZhbmNlcyggZmFjZSwgcGFkdmFuY2VzLCBjb3VudCwgZmxhZ3MgKTsKLQotICAgICAgaWYgKCBGVF9FUlJfTkVRKCBlcnJvciwgVW5pbXBsZW1lbnRlZF9GZWF0dXJlICkgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLSAgICBpZiAoIGZsYWdzICYgRlRfQURWQU5DRV9GTEFHX0ZBU1RfT05MWSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotCi0gICAgZmxhZ3MgfD0gKEZUX1VJbnQzMilGVF9MT0FEX0FEVkFOQ0VfT05MWTsKLSAgICBmb3IgKCBubiA9IDA7IG5uIDwgY291bnQ7IG5uKysgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfTG9hZF9HbHlwaCggZmFjZSwgc3RhcnQgKyBubiwgZmxhZ3MgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBicmVhazsKLQotICAgICAgLyogc2NhbGUgZnJvbSAyNi42IHRvIDE2LjE2ICovCi0gICAgICBwYWR2YW5jZXNbbm5dID0gKCBmbGFncyAmIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUICkKLSAgICAgICAgICAgICAgICAgICAgICA/IGZhY2UtPmdseXBoLT5hZHZhbmNlLnkgPDwgMTAKLSAgICAgICAgICAgICAgICAgICAgICA6IGZhY2UtPmdseXBoLT5hZHZhbmNlLnggPDwgMTA7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGFwaS5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRhcGkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIyYTE4MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGFwaS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0YXBpLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgY29tcGF0aWJpbGl0eSBmdW5jdGlvbnMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9MSVNUX0gKLSNpbmNsdWRlIEZUX09VVExJTkVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFCTEVTX0gKLSNpbmNsdWRlIEZUX09VVExJTkVfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgQyBPIE0gUCBBIFQgSSBCIEkgTCBJIFQgWSAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IEFQSSAqLwotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfTmV3X01lbW9yeV9TdHJlYW0oIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICBiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsKLQotICAgIEZUX1N0cmVhbV9PcGVuTWVtb3J5KCBzdHJlYW0sIGJhc2UsIHNpemUgKTsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU2Vla19TdHJlYW0oIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBwb3MgKQotICB7Ci0gICAgcmV0dXJuIEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIHBvcyApOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9Ta2lwX1N0cmVhbSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIGRpc3RhbmNlICkKLSAgewotICAgIHJldHVybiBGVF9TdHJlYW1fU2tpcCggc3RyZWFtLCBkaXN0YW5jZSApOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9SZWFkX1N0cmVhbSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKQotICB7Ci0gICAgcmV0dXJuIEZUX1N0cmVhbV9SZWFkKCBzdHJlYW0sIGJ1ZmZlciwgY291bnQgKTsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfUmVhZF9TdHJlYW1fQXQoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBwb3MsCi0gICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKQotICB7Ci0gICAgcmV0dXJuIEZUX1N0cmVhbV9SZWFkQXQoIHN0cmVhbSwgcG9zLCBidWZmZXIsIGNvdW50ICk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX0V4dHJhY3RfRnJhbWUoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBieXRlcyApCi0gIHsKLSAgICByZXR1cm4gRlRfU3RyZWFtX0V4dHJhY3RGcmFtZSggc3RyZWFtLCBjb3VudCwgcGJ5dGVzICk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfUmVsZWFzZV9GcmFtZSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgcGJ5dGVzICkKLSAgewotICAgIEZUX1N0cmVhbV9SZWxlYXNlRnJhbWUoIHN0cmVhbSwgcGJ5dGVzICk7Ci0gIH0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9BY2Nlc3NfRnJhbWUoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgY291bnQgKQotICB7Ci0gICAgcmV0dXJuIEZUX1N0cmVhbV9FbnRlckZyYW1lKCBzdHJlYW0sIGNvdW50ICk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfRm9yZ2V0X0ZyYW1lKCBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9TdHJlYW1fRXhpdEZyYW1lKCBzdHJlYW0gKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRiYXNlLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGJhc2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUzZGZiNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGJhc2UuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0YmFzZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBTaW5nbGUgb2JqZWN0IGxpYnJhcnkgY29tcG9uZW50IChib2R5IG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0KLSNkZWZpbmUgIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLQotI2luY2x1ZGUgImZ0cGljLmMiCi0jaW5jbHVkZSAiYmFzZXBpYy5jIgotI2luY2x1ZGUgImZ0YWR2YW5jLmMiCi0jaW5jbHVkZSAiZnRjYWxjLmMiCi0jaW5jbHVkZSAiZnRkYmdtZW0uYyIKLSNpbmNsdWRlICJmdGdsb2Fkci5jIgotI2luY2x1ZGUgImZ0b2Jqcy5jIgotI2luY2x1ZGUgImZ0b3V0bG4uYyIKLSNpbmNsdWRlICJmdHJmb3JrLmMiCi0jaW5jbHVkZSAiZnRzbmFtZXMuYyIKLSNpbmNsdWRlICJmdHN0cmVhbS5jIgotI2luY2x1ZGUgImZ0dHJpZ29uLmMiCi0jaW5jbHVkZSAiZnR1dGlsLmMiCi0KLSNpZmRlZiBGVF9NQUNJTlRPU0gKLSNpbmNsdWRlICJmdG1hYy5jIgotI2VuZGlmCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRiYXNlLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3ZmVmYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0YmFzZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcHJpdmF0ZSBmdW5jdGlvbnMgdXNlZCBpbiBiYXNlIG1vZHVsZSAoc3BlY2lmaWNhdGlvbikuICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgV2VybmVyIExlbWJlcmcsIGFuZCBzdXp1a2kgdG9zaGl5YS4gICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUQkFTRV9IX18KLSNkZWZpbmUgX19GVEJBU0VfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qIE1hY09TIHJlc291cmNlIGZvcmsgY2Fubm90IGV4Y2VlZCAxNk1CIGF0IGxlYXN0IGZvciBDYXJib24gY29kZTsgKi8KLSAgLyogc2VlIGh0dHBzOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2VuLXVzL2tiLzEzMDQzNyAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9NQUNfUkZPUktfTUFYX0xFTiAgMHgwMEZGRkZGRlVMCi0KLQotICAvKiBBc3N1bWUgdGhlIHN0cmVhbSBpcyBzZm50LXdyYXBwZWQgUFMgVHlwZTEgb3Igc2ZudC13cmFwcGVkIENJRC1rZXllZCAqLwotICAvKiBmb250LCBhbmQgdHJ5IHRvIGxvYWQgYSBmYWNlIHNwZWNpZmllZCBieSB0aGUgZmFjZV9pbmRleC4gICAgICAgICAgICAqLwotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBvcGVuX2ZhY2VfUFNfZnJvbV9zZm50X3N0cmVhbSggRlRfTGlicmFyeSAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyICAqcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAqYWZhY2UgKTsKLQotCi0gIC8qIENyZWF0ZSBhIG5ldyBGVF9GYWNlIGdpdmVuIGEgYnVmZmVyIGFuZCBhIGRyaXZlciBuYW1lLiAqLwotICAvKiBGcm9tIGZ0bWFjLmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgb3Blbl9mYWNlX2Zyb21fYnVmZmVyKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgZHJpdmVyX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgKmFmYWNlICk7Ci0KLQotI2lmICBkZWZpbmVkKCBGVF9DT05GSUdfT1BUSU9OX0dVRVNTSU5HX0VNQkVEREVEX1JGT1JLICkgJiYgXAotICAgICFkZWZpbmVkKCBGVF9NQUNJTlRPU0ggKQotICAvKiBNYWMgT1MgWC9EYXJ3aW4ga2VybmVsIG9mdGVuIGNoYW5nZXMgcmVjb21tZW5kZWQgbWV0aG9kIHRvIGFjY2VzcyAqLwotICAvKiB0aGUgcmVzb3VyY2UgZm9yayBhbmQgb2xkZXIgbWV0aG9kcyBtYWtlcyB0aGUga2VybmVsIGlzc3VlIHRoZSAgICAqLwotICAvKiB3YXJuaW5nIG9mIGRlcHJlY2F0ZWQgbWV0aG9kLiAgVG8gY2FsbSBpdCBkb3duLCB0aGUgbWV0aG9kcyBiYXNlZCAqLwotICAvKiBvbiBEYXJ3aW4gVkZTIHNob3VsZCBiZSBncm91cGVkIGFuZCBza2lwIHRoZSByZXN0IG1ldGhvZHMgYWZ0ZXIgICAqLwotICAvKiB0aGUgY2FzZSB0aGUgcmVzb3VyY2UgaXMgb3BlbmVkIGJ1dCBmb3VuZCB0byBsYWNrIGEgZm9udCBpbiBpdC4gICAqLwotICBGVF9MT0NBTCggRlRfQm9vbCApCi0gIGZ0X3JhY2Nlc3NfcnVsZV9ieV9kYXJ3aW5fdmZzKCBGVF9MaWJyYXJ5IGxpYnJhcnksIEZUX1VJbnQgIHJ1bGVfaW5kZXggKTsKLSNlbmRpZgotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRCQVNFX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRiYm94LmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGJib3guYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkZjk4ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGJib3guYworKysgL2Rldi9udWxsCkBAIC0xLDUwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGJib3guYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgYmJveCBjb21wdXRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkICAgICAgICAqLwotLyogIG1vZGlmaWVkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGNvbXBvbmVudCBoYXMgYSBfc2luZ2xlXyByb2xlOiB0byBjb21wdXRlIGV4YWN0IG91dGxpbmUgYm91bmRpbmcgKi8KLSAgLyogYm94ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgRlRfQkJPWF9ICi0jaW5jbHVkZSBGVF9JTUFHRV9ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0KLQotICB0eXBlZGVmIHN0cnVjdCAgVEJCb3hfUmVjXwotICB7Ci0gICAgRlRfVmVjdG9yICBsYXN0OwotICAgIEZUX0JCb3ggICAgYmJveDsKLQotICB9IFRCQm94X1JlYzsKLQotCi0jZGVmaW5lIEZUX1VQREFURV9CQk9YKCBwLCBiYm94ICkgXAotICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIHAtPnggPCBiYm94LnhNaW4gKSAgICAgICBcCi0gICAgICBiYm94LnhNaW4gPSBwLT54OyAgICAgICAgICAgXAotICAgIGlmICggcC0+eCA+IGJib3gueE1heCApICAgICAgIFwKLSAgICAgIGJib3gueE1heCA9IHAtPng7ICAgICAgICAgICBcCi0gICAgaWYgKCBwLT55IDwgYmJveC55TWluICkgICAgICAgXAotICAgICAgYmJveC55TWluID0gcC0+eTsgICAgICAgICAgIFwKLSAgICBpZiAoIHAtPnkgPiBiYm94LnlNYXggKSAgICAgICBcCi0gICAgICBiYm94LnlNYXggPSBwLT55OyAgICAgICAgICAgXAotICBGVF9FTkRfU1RNTlQKLQotI2RlZmluZSBDSEVDS19YKCBwLCBiYm94ICkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggcC0+eCA8IGJib3gueE1pbiB8fCBwLT54ID4gYmJveC54TWF4ICkKLQotI2RlZmluZSBDSEVDS19ZKCBwLCBiYm94ICkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggcC0+eSA8IGJib3gueU1pbiB8fCBwLT55ID4gYmJveC55TWF4ICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJCb3hfTW92ZV9UbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBhIGBtb3ZlX3RvJyBlbWl0dGVyIGR1cmluZyAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0RlY29tcG9zZSgpLiAgSXQgc2ltcGx5IHJlY29yZHMgdGhlIGRlc3RpbmF0aW9uIHBvaW50ICAgKi8KLSAgLyogICAgaW4gYHVzZXItPmxhc3QnLiBXZSBhbHNvIHVwZGF0ZSBiYm94IGluIGNhc2UgY29udG91ciBzdGFydHMgd2l0aCAgICovCi0gIC8qICAgIGFuIGltcGxpY2l0IGBvbicgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRvICAgOjogQSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgOjogQSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHdhbGsgY29udGV4dC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFsd2F5cyAwLiAgTmVlZGVkIGZvciB0aGUgaW50ZXJmYWNlIG9ubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIGludAotICBCQm94X01vdmVfVG8oIEZUX1ZlY3RvciogIHRvLAotICAgICAgICAgICAgICAgIFRCQm94X1JlYyogIHVzZXIgKQotICB7Ci0gICAgRlRfVVBEQVRFX0JCT1goIHRvLCB1c2VyLT5iYm94ICk7Ci0KLSAgICB1c2VyLT5sYXN0ID0gKnRvOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJCb3hfTGluZV9UbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBhIGBsaW5lX3RvJyBlbWl0dGVyIGR1cmluZyAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0RlY29tcG9zZSgpLiAgSXQgc2ltcGx5IHJlY29yZHMgdGhlIGRlc3RpbmF0aW9uIHBvaW50ICAgKi8KLSAgLyogICAgaW4gYHVzZXItPmxhc3QnOyBubyBmdXJ0aGVyIGNvbXB1dGF0aW9ucyBhcmUgbmVjZXNzYXJ5IGJlY2F1c2UgICAgICovCi0gIC8qICAgIGJib3ggYWxyZWFkeSBjb250YWlucyBib3RoIGV4cGxpY2l0IGVuZHMgb2YgdGhlIGxpbmUgc2VnbWVudC4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHRvICAgOjogQSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgOjogQSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHdhbGsgY29udGV4dC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFsd2F5cyAwLiAgTmVlZGVkIGZvciB0aGUgaW50ZXJmYWNlIG9ubHkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIGludAotICBCQm94X0xpbmVfVG8oIEZUX1ZlY3RvciogIHRvLAotICAgICAgICAgICAgICAgIFRCQm94X1JlYyogIHVzZXIgKQotICB7Ci0gICAgdXNlci0+bGFzdCA9ICp0bzsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCQm94X0NvbmljX0NoZWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5kIHRoZSBleHRyZW1hIG9mIGEgMS1kaW1lbnNpb25hbCBjb25pYyBCZXppZXIgY3VydmUgYW5kIHVwZGF0ZSAgKi8KLSAgLyogICAgYSBib3VuZGluZyByYW5nZS4gIFRoaXMgdmVyc2lvbiB1c2VzIGRpcmVjdCBjb21wdXRhdGlvbiwgYXMgaXQgICAgICovCi0gIC8qICAgIGRvZXNuJ3QgbmVlZCBzcXVhcmUgcm9vdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHkxICA6OiBUaGUgc3RhcnQgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeTIgIDo6IFRoZSBjb29yZGluYXRlIG9mIHRoZSBjb250cm9sIHBvaW50LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5MyAgOjogVGhlIGVuZCBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW4gOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgbWluaW11bS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heCA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBtYXhpbXVtLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgQkJveF9Db25pY19DaGVjayggRlRfUG9zICAgeTEsCi0gICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgIHkyLAotICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICB5MywKLSAgICAgICAgICAgICAgICAgICAgRlRfUG9zKiAgbWluLAotICAgICAgICAgICAgICAgICAgICBGVF9Qb3MqICBtYXggKQotICB7Ci0gICAgLyogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCB3aGVuIGEgY29udHJvbCBvZmYtcG9pbnQgaXMgb3V0c2lkZSAqLwotICAgIC8qIHRoZSBiYm94IHRoYXQgY29udGFpbnMgYWxsIG9uLXBvaW50cy4gIEl0IGZpbmRzIGEgbG9jYWwgZXh0cmVtdW0gKi8KLSAgICAvKiB3aXRoaW4gdGhlIHNlZ21lbnQsIGVxdWFsIHRvICh5MSp5MyAtIHkyKnkyKS8oeTEgLSAyKnkyICsgeTMpLiAgICovCi0gICAgLyogT3IsIG9mZnNldHRpbmcgZnJvbSB5Miwgd2UgZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgeTEgLT0geTI7Ci0gICAgeTMgLT0geTI7Ci0gICAgeTIgKz0gRlRfTXVsRGl2KCB5MSwgeTMsIHkxICsgeTMgKTsKLQotICAgIGlmICggeTIgPCAqbWluICkKLSAgICAgICptaW4gPSB5MjsKLSAgICBpZiAoIHkyID4gKm1heCApCi0gICAgICAqbWF4ID0geTI7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJCb3hfQ29uaWNfVG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBhcyBhIGBjb25pY190bycgZW1pdHRlciBkdXJpbmcgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0RlY29tcG9zZSgpLiAgSXQgY2hlY2tzIGEgY29uaWMgQmV6aWVyIGN1cnZlIHdpdGggdGhlICAgKi8KLSAgLyogICAgY3VycmVudCBib3VuZGluZyBib3gsIGFuZCBjb21wdXRlcyBpdHMgZXh0cmVtYSBpZiBuZWNlc3NhcnkgdG8gICAgICovCi0gIC8qICAgIHVwZGF0ZSBpdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbnRyb2wgOjogQSBwb2ludGVyIHRvIGEgY29udHJvbCBwb2ludC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG8gICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdXNlciAgICA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgY3VycmVudCB3YWxrIGNvbnRleHQuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQWx3YXlzIDAuICBOZWVkZWQgZm9yIHRoZSBpbnRlcmZhY2Ugb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW4gdGhlIGNhc2Ugb2YgYSBub24tbW9ub3Rvbm91cyBhcmMsIHdlIGNvbXB1dGUgZGlyZWN0bHkgdGhlICAgICAgICovCi0gIC8qICAgIGV4dHJlbXVtIGNvb3JkaW5hdGVzLCBhcyBpdCBpcyBzdWZmaWNpZW50bHkgZmFzdC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIGludAotICBCQm94X0NvbmljX1RvKCBGVF9WZWN0b3IqICBjb250cm9sLAotICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICB0bywKLSAgICAgICAgICAgICAgICAgVEJCb3hfUmVjKiAgdXNlciApCi0gIHsKLSAgICAvKiBpbiBjYXNlIGB0bycgaXMgaW1wbGljaXQgYW5kIG5vdCBpbmNsdWRlZCBpbiBiYm94IHlldCAqLwotICAgIEZUX1VQREFURV9CQk9YKCB0bywgdXNlci0+YmJveCApOwotCi0gICAgaWYgKCBDSEVDS19YKCBjb250cm9sLCB1c2VyLT5iYm94ICkgKQotICAgICAgQkJveF9Db25pY19DaGVjayggdXNlci0+bGFzdC54LAotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC0+eCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvLT54LAotICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXItPmJib3gueE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLT5iYm94LnhNYXggKTsKLQotICAgIGlmICggQ0hFQ0tfWSggY29udHJvbCwgdXNlci0+YmJveCApICkKLSAgICAgIEJCb3hfQ29uaWNfQ2hlY2soIHVzZXItPmxhc3QueSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wtPnksCi0gICAgICAgICAgICAgICAgICAgICAgICB0by0+eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLT5iYm94LnlNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAmdXNlci0+YmJveC55TWF4ICk7Ci0KLSAgICB1c2VyLT5sYXN0ID0gKnRvOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJCb3hfQ3ViaWNfQ2hlY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmQgdGhlIGV4dHJlbWEgb2YgYSAxLWRpbWVuc2lvbmFsIGN1YmljIEJlemllciBjdXJ2ZSBhbmQgICAgICAgICAqLwotICAvKiAgICB1cGRhdGUgYSBib3VuZGluZyByYW5nZS4gIFRoaXMgdmVyc2lvbiB1c2VzIGl0ZXJhdGl2ZSBzcGxpdHRpbmcgICAgKi8KLSAgLyogICAgYmVjYXVzZSBpdCBpcyBmYXN0ZXIgdGhhbiB0aGUgZXhhY3Qgc29sdXRpb24gd2l0aCBzcXVhcmUgcm9vdHMuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcDEgIDo6IFRoZSBzdGFydCBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwMiAgOjogVGhlIGNvb3JkaW5hdGUgb2YgdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHAzICA6OiBUaGUgY29vcmRpbmF0ZSBvZiB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcDQgIDo6IFRoZSBlbmQgY29vcmRpbmF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWluIDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IG1pbmltdW0uICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXggOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgbWF4aW11bS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9Qb3MKLSAgY3ViaWNfcGVhayggRlRfUG9zICBxMSwKLSAgICAgICAgICAgICAgRlRfUG9zICBxMiwKLSAgICAgICAgICAgICAgRlRfUG9zICBxMywKLSAgICAgICAgICAgICAgRlRfUG9zICBxNCApCi0gIHsKLSAgICBGVF9Qb3MgIHBlYWsgPSAwOwotICAgIEZUX0ludCAgc2hpZnQ7Ci0KLQotICAgIC8qIFRoaXMgZnVuY3Rpb24gZmluZHMgYSBwZWFrIG9mIGEgY3ViaWMgc2VnbWVudCBpZiBpdCBpcyBhYm92ZSAwICAgICovCi0gICAgLyogdXNpbmcgaXRlcmF0aXZlIGJpc2VjdGlvbiBvZiB0aGUgc2VnbWVudCwgb3IgcmV0dXJucyAwLiAgICAgICAgICAgKi8KLSAgICAvKiBUaGUgZml4ZWQtcG9pbnQgYXJpdGhtZXRpYyBvZiBiaXNlY3Rpb24gaXMgaW5oZXJlbnRseSBzdGFibGUgICAgICAqLwotICAgIC8qIGJ1dCBtYXkgbG9vc2UgYWNjdXJhY3kgaW4gdGhlIHR3byBsb3dlc3QgYml0cy4gIFRvIGNvbXBlbnNhdGUsICAgICovCi0gICAgLyogd2UgdXBzY2FsZSB0aGUgc2VnbWVudCBpZiB0aGVyZSBpcyByb29tLiAgTGFyZ2UgdmFsdWVzIG1heSBuZWVkICAgKi8KLSAgICAvKiB0byBiZSBkb3duc2NhbGVkIHRvIGF2b2lkIG92ZXJmbG93cyBkdXJpbmcgYmlzZWN0aW9uLiAgICAgICAgICAgICAqLwotICAgIC8qIEl0IGlzIGNhbGxlZCB3aXRoIGVpdGhlciBxMiBvciBxMyBwb3NpdGl2ZSwgd2hpY2ggaXMgbmVjZXNzYXJ5ICAgICovCi0gICAgLyogZm9yIHRoZSBwZWFrIHRvIGV4aXN0IGFuZCBhdm9pZHMgdW5kZWZpbmVkIEZUX01TQi4gICAgICAgICAgICAgICAgKi8KLQotICAgIHNoaWZ0ID0gMjcgLSBGVF9NU0IoIChGVF9VSW50MzIpKCBGVF9BQlMoIHExICkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9BQlMoIHEyICkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9BQlMoIHEzICkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9BQlMoIHE0ICkgKSApOwotCi0gICAgaWYgKCBzaGlmdCA+IDAgKQotICAgIHsKLSAgICAgIC8qIHVwc2NhbGluZyB0b28gbXVjaCBqdXN0IHdhc3RlcyB0aW1lICovCi0gICAgICBpZiAoIHNoaWZ0ID4gMiApCi0gICAgICAgIHNoaWZ0ID0gMjsKLQotICAgICAgcTEgPDw9ICBzaGlmdDsKLSAgICAgIHEyIDw8PSAgc2hpZnQ7Ci0gICAgICBxMyA8PD0gIHNoaWZ0OwotICAgICAgcTQgPDw9ICBzaGlmdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHExID4+PSAtc2hpZnQ7Ci0gICAgICBxMiA+Pj0gLXNoaWZ0OwotICAgICAgcTMgPj49IC1zaGlmdDsKLSAgICAgIHE0ID4+PSAtc2hpZnQ7Ci0gICAgfQotCi0gICAgLyogZm9yIGEgcGVhayB0byBleGlzdCBhYm92ZSAwLCB0aGUgY3ViaWMgc2VnbWVudCBtdXN0IGhhdmUgKi8KLSAgICAvKiBhdCBsZWFzdCBvbmUgb2YgaXRzIGNvbnRyb2wgb2ZmLXBvaW50cyBhYm92ZSAwLiAgICAgICAgICAqLwotICAgIHdoaWxlICggcTIgPiAwIHx8IHEzID4gMCApCi0gICAgewotICAgICAgLyogZGV0ZXJtaW5lIHdoaWNoIGhhbGYgY29udGFpbnMgdGhlIG1heGltdW0gYW5kIHNwbGl0ICovCi0gICAgICBpZiAoIHExICsgcTIgPiBxMyArIHE0ICkgLyogZmlyc3QgaGFsZiAqLwotICAgICAgewotICAgICAgICBxNCA9IHE0ICsgcTM7Ci0gICAgICAgIHEzID0gcTMgKyBxMjsKLSAgICAgICAgcTIgPSBxMiArIHExOwotICAgICAgICBxNCA9IHE0ICsgcTM7Ci0gICAgICAgIHEzID0gcTMgKyBxMjsKLSAgICAgICAgcTQgPSAoIHE0ICsgcTMgKSAvIDg7Ci0gICAgICAgIHEzID0gcTMgLyA0OwotICAgICAgICBxMiA9IHEyIC8gMjsKLSAgICAgIH0KLSAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAvKiBzZWNvbmQgaGFsZiAqLwotICAgICAgewotICAgICAgICBxMSA9IHExICsgcTI7Ci0gICAgICAgIHEyID0gcTIgKyBxMzsKLSAgICAgICAgcTMgPSBxMyArIHE0OwotICAgICAgICBxMSA9IHExICsgcTI7Ci0gICAgICAgIHEyID0gcTIgKyBxMzsKLSAgICAgICAgcTEgPSAoIHExICsgcTIgKSAvIDg7Ci0gICAgICAgIHEyID0gcTIgLyA0OwotICAgICAgICBxMyA9IHEzIC8gMjsKLSAgICAgIH0KLQotICAgICAgLyogY2hlY2sgd2hldGhlciBlaXRoZXIgZW5kIHJlYWNoZWQgdGhlIG1heGltdW0gKi8KLSAgICAgIGlmICggcTEgPT0gcTIgJiYgcTEgPj0gcTMgKQotICAgICAgewotICAgICAgICBwZWFrID0gcTE7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKCBxMyA9PSBxNCAmJiBxMiA8PSBxNCApCi0gICAgICB7Ci0gICAgICAgIHBlYWsgPSBxNDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBzaGlmdCA+IDAgKQotICAgICAgcGVhayA+Pj0gIHNoaWZ0OwotICAgIGVsc2UKLSAgICAgIHBlYWsgPDw9IC1zaGlmdDsKLQotICAgIHJldHVybiBwZWFrOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBCQm94X0N1YmljX0NoZWNrKCBGVF9Qb3MgICBwMSwKLSAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgcDIsCi0gICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgIHAzLAotICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICBwNCwKLSAgICAgICAgICAgICAgICAgICAgRlRfUG9zKiAgbWluLAotICAgICAgICAgICAgICAgICAgICBGVF9Qb3MqICBtYXggKQotICB7Ci0gICAgLyogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCB3aGVuIGEgY29udHJvbCBvZmYtcG9pbnQgaXMgb3V0c2lkZSAgKi8KLSAgICAvKiB0aGUgYmJveCB0aGF0IGNvbnRhaW5zIGFsbCBvbi1wb2ludHMuICBTbyBhdCBsZWFzdCBvbmUgb2YgdGhlICAgICAqLwotICAgIC8qIGNvbmRpdGlvbnMgYmVsb3cgaG9sZHMgYW5kIGN1YmljX3BlYWsgaXMgY2FsbGVkIHdpdGggYXQgbGVhc3Qgb25lICovCi0gICAgLyogbm9uLXplcm8gYXJndW1lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIGlmICggcDIgPiAqbWF4IHx8IHAzID4gKm1heCApCi0gICAgICAqbWF4ICs9IGN1YmljX3BlYWsoIHAxIC0gKm1heCwgcDIgLSAqbWF4LCBwMyAtICptYXgsIHA0IC0gKm1heCApOwotCi0gICAgLyogbm93IGZsaXAgdGhlIHNpZ25zIHRvIHVwZGF0ZSB0aGUgbWluaW11bSAqLwotICAgIGlmICggcDIgPCAqbWluIHx8IHAzIDwgKm1pbiApCi0gICAgICAqbWluIC09IGN1YmljX3BlYWsoICptaW4gLSBwMSwgKm1pbiAtIHAyLCAqbWluIC0gcDMsICptaW4gLSBwNCApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCQm94X0N1YmljX1RvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYXMgYSBgY3ViaWNfdG8nIGVtaXR0ZXIgZHVyaW5nICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRlRfT3V0bGluZV9EZWNvbXBvc2UoKS4gIEl0IGNoZWNrcyBhIGN1YmljIEJlemllciBjdXJ2ZSB3aXRoIHRoZSAgICovCi0gIC8qICAgIGN1cnJlbnQgYm91bmRpbmcgYm94LCBhbmQgY29tcHV0ZXMgaXRzIGV4dHJlbWEgaWYgbmVjZXNzYXJ5IHRvICAgICAqLwotICAvKiAgICB1cGRhdGUgaXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb250cm9sMSA6OiBBIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNvbnRyb2wgcG9pbnQuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbnRyb2wyIDo6IEEgcG9pbnRlciB0byB0aGUgc2Vjb25kIGNvbnRyb2wgcG9pbnQuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdG8gICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdXNlciAgICAgOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGN1cnJlbnQgd2FsayBjb250ZXh0LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQWx3YXlzIDAuICBOZWVkZWQgZm9yIHRoZSBpbnRlcmZhY2Ugb25seS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW4gdGhlIGNhc2Ugb2YgYSBub24tbW9ub3Rvbm91cyBhcmMsIHdlIGRvbid0IGNvbXB1dGUgZGlyZWN0bHkgICAgICovCi0gIC8qICAgIGV4dHJlbXVtIGNvb3JkaW5hdGVzLCB3ZSBzdWJkaXZpZGUgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIGludAotICBCQm94X0N1YmljX1RvKCBGVF9WZWN0b3IqICBjb250cm9sMSwKLSAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgY29udHJvbDIsCi0gICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvLAotICAgICAgICAgICAgICAgICBUQkJveF9SZWMqICB1c2VyICkKLSAgewotICAgIC8qIFdlIGRvbid0IG5lZWQgdG8gY2hlY2sgYHRvJyBzaW5jZSBpdCBpcyBhbHdheXMgYW4gb24tcG9pbnQsICAgICovCi0gICAgLyogdGh1cyB3aXRoaW4gdGhlIGJib3guICBPbmx5IHNlZ21lbnRzIHdpdGggYW4gb2ZmLXBvaW50IG91dHNpZGUgKi8KLSAgICAvKiB0aGUgYmJveCBjYW4gcG9zc2libHkgcmVhY2ggbmV3IGV4dHJlbWUgdmFsdWVzLiAgICAgICAgICAgICAgICAqLwotCi0gICAgaWYgKCBDSEVDS19YKCBjb250cm9sMSwgdXNlci0+YmJveCApIHx8Ci0gICAgICAgICBDSEVDS19YKCBjb250cm9sMiwgdXNlci0+YmJveCApICkKLSAgICAgIEJCb3hfQ3ViaWNfQ2hlY2soIHVzZXItPmxhc3QueCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wxLT54LAotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbDItPngsCi0gICAgICAgICAgICAgICAgICAgICAgICB0by0+eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLT5iYm94LnhNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAmdXNlci0+YmJveC54TWF4ICk7Ci0KLSAgICBpZiAoIENIRUNLX1koIGNvbnRyb2wxLCB1c2VyLT5iYm94ICkgfHwKLSAgICAgICAgIENIRUNLX1koIGNvbnRyb2wyLCB1c2VyLT5iYm94ICkgKQotICAgICAgQkJveF9DdWJpY19DaGVjayggdXNlci0+bGFzdC55LAotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbDEtPnksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sMi0+eSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvLT55LAotICAgICAgICAgICAgICAgICAgICAgICAgJnVzZXItPmJib3gueU1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VyLT5iYm94LnlNYXggKTsKLQotICAgIHVzZXItPmxhc3QgPSAqdG87Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgRlRfREVGSU5FX09VVExJTkVfRlVOQ1MoYmJveF9pbnRlcmZhY2UsCi0gICAgKEZUX091dGxpbmVfTW92ZVRvX0Z1bmMpIEJCb3hfTW92ZV9UbywKLSAgICAoRlRfT3V0bGluZV9MaW5lVG9fRnVuYykgQkJveF9MaW5lX1RvLAotICAgIChGVF9PdXRsaW5lX0NvbmljVG9fRnVuYylCQm94X0NvbmljX1RvLAotICAgIChGVF9PdXRsaW5lX0N1YmljVG9fRnVuYylCQm94X0N1YmljX1RvLAotICAgIDAsIDAKLSAgKQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGJib3guaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9HZXRfQkJveCggRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0JCb3ggICAgICphYmJveCApCi0gIHsKLSAgICBGVF9CQm94ICAgICBjYm94ID0geyAgMHg3RkZGRkZGRkwsICAweDdGRkZGRkZGTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAtMHg3RkZGRkZGRkwsIC0weDdGRkZGRkZGTCB9OwotICAgIEZUX0JCb3ggICAgIGJib3ggPSB7ICAweDdGRkZGRkZGTCwgIDB4N0ZGRkZGRkZMLAotICAgICAgICAgICAgICAgICAgICAgICAgIC0weDdGRkZGRkZGTCwgLTB4N0ZGRkZGRkZMIH07Ci0gICAgRlRfVmVjdG9yKiAgdmVjOwotICAgIEZUX1VTaG9ydCAgIG47Ci0KLQotICAgIGlmICggIWFiYm94ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgaWYgKCAhb3V0bGluZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfT3V0bGluZSApOwotCi0gICAgLyogaWYgb3V0bGluZSBpcyBlbXB0eSwgcmV0dXJuICgwLDAsMCwwKSAqLwotICAgIGlmICggb3V0bGluZS0+bl9wb2ludHMgPT0gMCB8fCBvdXRsaW5lLT5uX2NvbnRvdXJzIDw9IDAgKQotICAgIHsKLSAgICAgIGFiYm94LT54TWluID0gYWJib3gtPnhNYXggPSAwOwotICAgICAgYWJib3gtPnlNaW4gPSBhYmJveC0+eU1heCA9IDA7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvKiBXZSBjb21wdXRlIHRoZSBjb250cm9sIGJveCBhcyB3ZWxsIGFzIHRoZSBib3VuZGluZyBib3ggb2YgICovCi0gICAgLyogYWxsIGBvbicgcG9pbnRzIGluIHRoZSBvdXRsaW5lLiAgVGhlbiwgaWYgdGhlIHR3byBib3hlcyAgICAqLwotICAgIC8qIGNvaW5jaWRlLCB3ZSBleGl0IGltbWVkaWF0ZWx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIHZlYyA9IG91dGxpbmUtPnBvaW50czsKLQotICAgIGZvciAoIG4gPSAwOyBuIDwgb3V0bGluZS0+bl9wb2ludHM7IG4rKyApCi0gICAgewotICAgICAgRlRfVVBEQVRFX0JCT1goIHZlYywgY2JveCk7Ci0KLSAgICAgIGlmICggRlRfQ1VSVkVfVEFHKCBvdXRsaW5lLT50YWdzW25dICkgPT0gRlRfQ1VSVkVfVEFHX09OICkKLSAgICAgICAgRlRfVVBEQVRFX0JCT1goIHZlYywgYmJveCk7Ci0KLSAgICAgIHZlYysrOwotICAgIH0KLQotICAgIC8qIHRlc3QgdHdvIGJveGVzIGZvciBlcXVhbGl0eSAqLwotICAgIGlmICggY2JveC54TWluIDwgYmJveC54TWluIHx8IGNib3gueE1heCA+IGJib3gueE1heCB8fAotICAgICAgICAgY2JveC55TWluIDwgYmJveC55TWluIHx8IGNib3gueU1heCA+IGJib3gueU1heCApCi0gICAgewotICAgICAgLyogdGhlIHR3byBib3hlcyBhcmUgZGlmZmVyZW50LCBub3cgd2FsayBvdmVyIHRoZSBvdXRsaW5lIHRvICovCi0gICAgICAvKiBnZXQgdGhlIEJlemllciBhcmMgZXh0cmVtYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICAgIFRCQm94X1JlYyAgdXNlcjsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0gICAgICBGVF9PdXRsaW5lX0Z1bmNzIGJib3hfaW50ZXJmYWNlOwotICAgICAgSW5pdF9DbGFzc19iYm94X2ludGVyZmFjZSgmYmJveF9pbnRlcmZhY2UpOwotI2VuZGlmCi0KLSAgICAgIHVzZXIuYmJveCA9IGJib3g7Ci0KLSAgICAgIGVycm9yID0gRlRfT3V0bGluZV9EZWNvbXBvc2UoIG91dGxpbmUsICZiYm94X2ludGVyZmFjZSwgJnVzZXIgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgICphYmJveCA9IHVzZXIuYmJveDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgKmFiYm94ID0gYmJveDsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0YmRmLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGJkZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTcyZGRjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0YmRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGJkZi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgQkRGLXNwZWNpZmljIHN0cmluZ3MgKGJvZHkpLiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfQkRGX0gKLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRiZGYuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0JERl9DaGFyc2V0X0lEKCBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICphY2hhcnNldF9lbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgKmFjaGFyc2V0X3JlZ2lzdHJ5ICkKLSAgewotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICBjb25zdCBjaGFyKiAgZW5jb2RpbmcgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIqICByZWdpc3RyeSA9IE5VTEw7Ci0KLSAgICBGVF9TZXJ2aWNlX0JERiAgc2VydmljZTsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIEZUX0ZBQ0VfRklORF9TRVJWSUNFKCBmYWNlLCBzZXJ2aWNlLCBCREYgKTsKLQotICAgIGlmICggc2VydmljZSAmJiBzZXJ2aWNlLT5nZXRfY2hhcnNldF9pZCApCi0gICAgICBlcnJvciA9IHNlcnZpY2UtPmdldF9jaGFyc2V0X2lkKCBmYWNlLCAmZW5jb2RpbmcsICZyZWdpc3RyeSApOwotICAgIGVsc2UKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGlmICggYWNoYXJzZXRfZW5jb2RpbmcgKQotICAgICAgKmFjaGFyc2V0X2VuY29kaW5nID0gZW5jb2Rpbmc7Ci0KLSAgICBpZiAoIGFjaGFyc2V0X3JlZ2lzdHJ5ICkKLSAgICAgICphY2hhcnNldF9yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0YmRmLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldF9CREZfUHJvcGVydHkoIEZUX0ZhY2UgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICAgIHByb3BfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQkRGX1Byb3BlcnR5UmVjICAqYXByb3BlcnR5ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotICAgIEZUX1NlcnZpY2VfQkRGICBzZXJ2aWNlOwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GYWNlX0hhbmRsZSApOwotCi0gICAgaWYgKCAhYXByb3BlcnR5ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgYXByb3BlcnR5LT50eXBlID0gQkRGX1BST1BFUlRZX1RZUEVfTk9ORTsKLQotICAgIEZUX0ZBQ0VfRklORF9TRVJWSUNFKCBmYWNlLCBzZXJ2aWNlLCBCREYgKTsKLQotICAgIGlmICggc2VydmljZSAmJiBzZXJ2aWNlLT5nZXRfcHJvcGVydHkgKQotICAgICAgZXJyb3IgPSBzZXJ2aWNlLT5nZXRfcHJvcGVydHkoIGZhY2UsIHByb3BfbmFtZSwgYXByb3BlcnR5ICk7Ci0gICAgZWxzZQotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGJpdG1hcC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRiaXRtYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU0NTcyYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGJpdG1hcC5jCisrKyAvZGV2L251bGwKQEAgLTEsODA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Yml0bWFwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgYml0bWFwcyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLSNpbmNsdWRlIEZUX0JJVE1BUF9ICi0jaW5jbHVkZSBGVF9JTUFHRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLQotCi0gIHN0YXRpYwotICBjb25zdCBGVF9CaXRtYXAgIG51bGxfYml0bWFwID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Yml0bWFwLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfQml0bWFwX0luaXQoIEZUX0JpdG1hcCAgKmFiaXRtYXAgKQotICB7Ci0gICAgaWYgKCBhYml0bWFwICkKLSAgICAgICphYml0bWFwID0gbnVsbF9iaXRtYXA7Ci0gIH0KLQotCi0gIC8qIGRlcHJlY2F0ZWQgZnVuY3Rpb24gbmFtZTsgcmV0YWluZWQgZm9yIEFCSSBjb21wYXRpYmlsaXR5ICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX0JpdG1hcF9OZXcoIEZUX0JpdG1hcCAgKmFiaXRtYXAgKQotICB7Ci0gICAgaWYgKCBhYml0bWFwICkKLSAgICAgICphYml0bWFwID0gbnVsbF9iaXRtYXA7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRiaXRtYXAuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfQml0bWFwX0NvcHkoIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICBjb25zdCBGVF9CaXRtYXAgICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICBGVF9CaXRtYXAgICAgICAgICp0YXJnZXQpCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLSAgICBGVF9FcnJvciAgIGVycm9yICA9IEZUX0Vycl9PazsKLQotICAgIEZUX0ludCAgICBwaXRjaDsKLSAgICBGVF9VTG9uZyAgc2l6ZTsKLQotICAgIEZUX0ludCAgc291cmNlX3BpdGNoX3NpZ24sIHRhcmdldF9waXRjaF9zaWduOwotCi0KLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9MaWJyYXJ5X0hhbmRsZSApOwotCi0gICAgaWYgKCAhc291cmNlIHx8ICF0YXJnZXQgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBpZiAoIHNvdXJjZSA9PSB0YXJnZXQgKQotICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLQotICAgIHNvdXJjZV9waXRjaF9zaWduID0gc291cmNlLT5waXRjaCA8IDAgPyAtMSA6IDE7Ci0gICAgdGFyZ2V0X3BpdGNoX3NpZ24gPSB0YXJnZXQtPnBpdGNoIDwgMCA/IC0xIDogMTsKLQotICAgIGlmICggc291cmNlLT5idWZmZXIgPT0gTlVMTCApCi0gICAgewotICAgICAgKnRhcmdldCA9ICpzb3VyY2U7Ci0gICAgICBpZiAoIHNvdXJjZV9waXRjaF9zaWduICE9IHRhcmdldF9waXRjaF9zaWduICkKLSAgICAgICAgdGFyZ2V0LT5waXRjaCA9IC10YXJnZXQtPnBpdGNoOwotCi0gICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgIH0KLQotICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLSAgICBwaXRjaCAgPSBzb3VyY2UtPnBpdGNoOwotCi0gICAgaWYgKCBwaXRjaCA8IDAgKQotICAgICAgcGl0Y2ggPSAtcGl0Y2g7Ci0gICAgc2l6ZSA9IChGVF9VTG9uZylwaXRjaCAqIHNvdXJjZS0+cm93czsKLQotICAgIGlmICggdGFyZ2V0LT5idWZmZXIgKQotICAgIHsKLSAgICAgIEZUX0ludCAgICB0YXJnZXRfcGl0Y2ggPSB0YXJnZXQtPnBpdGNoOwotICAgICAgRlRfVUxvbmcgIHRhcmdldF9zaXplOwotCi0KLSAgICAgIGlmICggdGFyZ2V0X3BpdGNoIDwgMCApCi0gICAgICAgIHRhcmdldF9waXRjaCA9IC10YXJnZXRfcGl0Y2g7Ci0gICAgICB0YXJnZXRfc2l6ZSA9IChGVF9VTG9uZyl0YXJnZXRfcGl0Y2ggKiB0YXJnZXQtPnJvd3M7Ci0KLSAgICAgIGlmICggdGFyZ2V0X3NpemUgIT0gc2l6ZSApCi0gICAgICAgICh2b2lkKUZUX1FSRUFMTE9DKCB0YXJnZXQtPmJ1ZmZlciwgdGFyZ2V0X3NpemUsIHNpemUgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgKHZvaWQpRlRfUUFMTE9DKCB0YXJnZXQtPmJ1ZmZlciwgc2l6ZSApOwotCi0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIHVuc2lnbmVkIGNoYXIgKnA7Ci0KLQotICAgICAgcCA9IHRhcmdldC0+YnVmZmVyOwotICAgICAgKnRhcmdldCA9ICpzb3VyY2U7Ci0gICAgICB0YXJnZXQtPmJ1ZmZlciA9IHA7Ci0KLSAgICAgIGlmICggc291cmNlX3BpdGNoX3NpZ24gPT0gdGFyZ2V0X3BpdGNoX3NpZ24gKQotICAgICAgICBGVF9NRU1fQ09QWSggdGFyZ2V0LT5idWZmZXIsIHNvdXJjZS0+YnVmZmVyLCBzaXplICk7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIHRha2UgY2FyZSBvZiBiaXRtYXAgZmxvdyAqLwotICAgICAgICBGVF9VSW50ICAgaTsKLSAgICAgICAgRlRfQnl0ZSogIHMgPSBzb3VyY2UtPmJ1ZmZlcjsKLSAgICAgICAgRlRfQnl0ZSogIHQgPSB0YXJnZXQtPmJ1ZmZlcjsKLQotCi0gICAgICAgIHQgKz0gKEZUX1VMb25nKXBpdGNoICogKCB0YXJnZXQtPnJvd3MgLSAxICk7Ci0KLSAgICAgICAgZm9yICggaSA9IHRhcmdldC0+cm93czsgaSA+IDA7IGktLSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9BUlJBWV9DT1BZKCB0LCBzLCBwaXRjaCApOwotCi0gICAgICAgICAgcyArPSBwaXRjaDsKLSAgICAgICAgICB0IC09IHBpdGNoOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBFbmxhcmdlIGBiaXRtYXAnIGhvcml6b250YWxseSBhbmQgdmVydGljYWxseSBieSBgeHBpeGVscycgKi8KLSAgLyogYW5kIGB5cGl4ZWxzJywgcmVzcGVjdGl2ZWx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X2JpdG1hcF9hc3N1cmVfYnVmZmVyKCBGVF9NZW1vcnkgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CaXRtYXAqICBiaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICB4cGl4ZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgeXBpeGVscyApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0gICAgaW50ICAgICAgICAgICAgIHBpdGNoOwotICAgIGludCAgICAgICAgICAgICBuZXdfcGl0Y2g7Ci0gICAgRlRfVUludCAgICAgICAgIGJwcDsKLSAgICBGVF9VSW50ICAgICAgICAgaSwgd2lkdGgsIGhlaWdodDsKLSAgICB1bnNpZ25lZCBjaGFyKiAgYnVmZmVyID0gTlVMTDsKLQotCi0gICAgd2lkdGggID0gYml0bWFwLT53aWR0aDsKLSAgICBoZWlnaHQgPSBiaXRtYXAtPnJvd3M7Ci0gICAgcGl0Y2ggID0gYml0bWFwLT5waXRjaDsKLSAgICBpZiAoIHBpdGNoIDwgMCApCi0gICAgICBwaXRjaCA9IC1waXRjaDsKLQotICAgIHN3aXRjaCAoIGJpdG1hcC0+cGl4ZWxfbW9kZSApCi0gICAgewotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9NT05POgotICAgICAgYnBwICAgICAgID0gMTsKLSAgICAgIG5ld19waXRjaCA9IChpbnQpKCAoIHdpZHRoICsgeHBpeGVscyArIDcgKSA+PiAzICk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZUX1BJWEVMX01PREVfR1JBWTI6Ci0gICAgICBicHAgICAgICAgPSAyOwotICAgICAgbmV3X3BpdGNoID0gKGludCkoICggd2lkdGggKyB4cGl4ZWxzICsgMyApID4+IDIgKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9HUkFZNDoKLSAgICAgIGJwcCAgICAgICA9IDQ7Ci0gICAgICBuZXdfcGl0Y2ggPSAoaW50KSggKCB3aWR0aCArIHhwaXhlbHMgKyAxICkgPj4gMSApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0dSQVk6Ci0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0xDRDoKLSAgICBjYXNlIEZUX1BJWEVMX01PREVfTENEX1Y6Ci0gICAgICBicHAgICAgICAgPSA4OwotICAgICAgbmV3X3BpdGNoID0gKGludCkoIHdpZHRoICsgeHBpeGVscyApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9HbHlwaF9Gb3JtYXQgKTsKLSAgICB9Ci0KLSAgICAvKiBpZiBubyBuZWVkIHRvIGFsbG9jYXRlIG1lbW9yeSAqLwotICAgIGlmICggeXBpeGVscyA9PSAwICYmIG5ld19waXRjaCA8PSBwaXRjaCApCi0gICAgewotICAgICAgLyogemVybyB0aGUgcGFkZGluZyAqLwotICAgICAgRlRfVUludCAgYml0X3dpZHRoID0gKEZUX1VJbnQpcGl0Y2ggKiA4OwotICAgICAgRlRfVUludCAgYml0X2xhc3QgID0gKCB3aWR0aCArIHhwaXhlbHMgKSAqIGJwcDsKLQotCi0gICAgICBpZiAoIGJpdF9sYXN0IDwgYml0X3dpZHRoICkKLSAgICAgIHsKLSAgICAgICAgRlRfQnl0ZSogIGxpbmUgID0gYml0bWFwLT5idWZmZXIgKyAoIGJpdF9sYXN0ID4+IDMgKTsKLSAgICAgICAgRlRfQnl0ZSogIGVuZCAgID0gYml0bWFwLT5idWZmZXIgKyBwaXRjaDsKLSAgICAgICAgRlRfVUludCAgIHNoaWZ0ID0gYml0X2xhc3QgJiA3OwotICAgICAgICBGVF9VSW50ICAgbWFzayAgPSAweEZGMDBVID4+IHNoaWZ0OwotICAgICAgICBGVF9VSW50ICAgY291bnQgPSBoZWlnaHQ7Ci0KLQotICAgICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgbGluZSArPSBwaXRjaCwgZW5kICs9IHBpdGNoICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0J5dGUqICB3cml0ZSA9IGxpbmU7Ci0KLQotICAgICAgICAgIGlmICggc2hpZnQgPiAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZVswXSA9IChGVF9CeXRlKSggd3JpdGVbMF0gJiBtYXNrICk7Ci0gICAgICAgICAgICB3cml0ZSsrOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoIHdyaXRlIDwgZW5kICkKLSAgICAgICAgICAgIEZUX01FTV9aRVJPKCB3cml0ZSwgZW5kIC0gd3JpdGUgKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgIH0KLQotICAgIC8qIG90aGVyd2lzZSBhbGxvY2F0ZSBuZXcgYnVmZmVyICovCi0gICAgaWYgKCBGVF9RQUxMT0NfTVVMVCggYnVmZmVyLCBuZXdfcGl0Y2gsIGJpdG1hcC0+cm93cyArIHlwaXhlbHMgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBuZXcgcm93cyBnZXQgYWRkZWQgYXQgdGhlIHRvcCBvZiB0aGUgYml0bWFwLCAqLwotICAgIC8qIHRodXMgdGFrZSBjYXJlIG9mIHRoZSBmbG93IGRpcmVjdGlvbiAgICAgICAgICovCi0gICAgaWYgKCBiaXRtYXAtPnBpdGNoID4gMCApCi0gICAgewotICAgICAgRlRfVUludCAgbGVuID0gKCB3aWR0aCAqIGJwcCArIDcgKSA+PiAzOwotCi0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgYml0bWFwLT5yb3dzOyBpKysgKQotICAgICAgICBGVF9NRU1fQ09QWSggYnVmZmVyICsgKEZUX1VJbnQpbmV3X3BpdGNoICogKCB5cGl4ZWxzICsgaSApLAotICAgICAgICAgICAgICAgICAgICAgYml0bWFwLT5idWZmZXIgKyAoRlRfVUludClwaXRjaCAqIGksCi0gICAgICAgICAgICAgICAgICAgICBsZW4gKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEZUX1VJbnQgIGxlbiA9ICggd2lkdGggKiBicHAgKyA3ICkgPj4gMzsKLQotCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IGJpdG1hcC0+cm93czsgaSsrICkKLSAgICAgICAgRlRfTUVNX0NPUFkoIGJ1ZmZlciArIChGVF9VSW50KW5ld19waXRjaCAqIGksCi0gICAgICAgICAgICAgICAgICAgICBiaXRtYXAtPmJ1ZmZlciArIChGVF9VSW50KXBpdGNoICogaSwKLSAgICAgICAgICAgICAgICAgICAgIGxlbiApOwotICAgIH0KLQotICAgIEZUX0ZSRUUoIGJpdG1hcC0+YnVmZmVyICk7Ci0gICAgYml0bWFwLT5idWZmZXIgPSBidWZmZXI7Ci0KLSAgICBpZiAoIGJpdG1hcC0+cGl0Y2ggPCAwICkKLSAgICAgIG5ld19waXRjaCA9IC1uZXdfcGl0Y2g7Ci0KLSAgICAvKiBzZXQgcGl0Y2ggb25seSwgd2lkdGggYW5kIGhlaWdodCBhcmUgbGVmdCB1bnRvdWNoZWQgKi8KLSAgICBiaXRtYXAtPnBpdGNoID0gbmV3X3BpdGNoOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGJpdG1hcC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9CaXRtYXBfRW1ib2xkZW4oIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwKiAgYml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHhTdHJlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB5U3RyZW5ndGggKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yOwotICAgIHVuc2lnbmVkIGNoYXIqICBwOwotICAgIEZUX0ludCAgICAgICAgICBpLCB4LCBwaXRjaDsKLSAgICBGVF9VSW50ICAgICAgICAgeTsKLSAgICBGVF9JbnQgICAgICAgICAgeHN0ciwgeXN0cjsKLQotCi0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfTGlicmFyeV9IYW5kbGUgKTsKLQotICAgIGlmICggIWJpdG1hcCB8fCAhYml0bWFwLT5idWZmZXIgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBpZiAoICggKCBGVF9QSVhfUk9VTkQoIHhTdHJlbmd0aCApID4+IDYgKSA+IEZUX0lOVF9NQVggKSB8fAotICAgICAgICAgKCAoIEZUX1BJWF9ST1VORCggeVN0cmVuZ3RoICkgPj4gNiApID4gRlRfSU5UX01BWCApICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgeHN0ciA9IChGVF9JbnQpRlRfUElYX1JPVU5EKCB4U3RyZW5ndGggKSA+PiA2OwotICAgIHlzdHIgPSAoRlRfSW50KUZUX1BJWF9ST1VORCggeVN0cmVuZ3RoICkgPj4gNjsKLQotICAgIGlmICggeHN0ciA9PSAwICYmIHlzdHIgPT0gMCApCi0gICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgIGVsc2UgaWYgKCB4c3RyIDwgMCB8fCB5c3RyIDwgMCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIHN3aXRjaCAoIGJpdG1hcC0+cGl4ZWxfbW9kZSApCi0gICAgewotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9HUkFZMjoKLSAgICBjYXNlIEZUX1BJWEVMX01PREVfR1JBWTQ6Ci0gICAgICB7Ci0gICAgICAgIEZUX0JpdG1hcCAgdG1wOwotCi0KLSAgICAgICAgLyogY29udmVydCB0byA4YnBwICovCi0gICAgICAgIEZUX0JpdG1hcF9Jbml0KCAmdG1wICk7Ci0gICAgICAgIGVycm9yID0gRlRfQml0bWFwX0NvbnZlcnQoIGxpYnJhcnksIGJpdG1hcCwgJnRtcCwgMSApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgICAgRlRfQml0bWFwX0RvbmUoIGxpYnJhcnksIGJpdG1hcCApOwotICAgICAgICAqYml0bWFwID0gdG1wOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZUX1BJWEVMX01PREVfTU9OTzoKLSAgICAgIGlmICggeHN0ciA+IDggKQotICAgICAgICB4c3RyID0gODsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0xDRDoKLSAgICAgIHhzdHIgKj0gMzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0xDRF9WOgotICAgICAgeXN0ciAqPSAzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZUX1BJWEVMX01PREVfQkdSQToKLSAgICAgIC8qIFdlIGRvbid0IGVtYm9sZGVuIGNvbG9yIGdseXBocy4gKi8KLSAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gICAgfQotCi0gICAgZXJyb3IgPSBmdF9iaXRtYXBfYXNzdXJlX2J1ZmZlciggbGlicmFyeS0+bWVtb3J5LCBiaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpeHN0ciwgKEZUX1VJbnQpeXN0ciApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgLyogdGFrZSBjYXJlIG9mIGJpdG1hcCBmbG93ICovCi0gICAgcGl0Y2ggPSBiaXRtYXAtPnBpdGNoOwotICAgIGlmICggcGl0Y2ggPiAwICkKLSAgICAgIHAgPSBiaXRtYXAtPmJ1ZmZlciArIHBpdGNoICogeXN0cjsKLSAgICBlbHNlCi0gICAgewotICAgICAgcGl0Y2ggPSAtcGl0Y2g7Ci0gICAgICBwID0gYml0bWFwLT5idWZmZXIgKyAoRlRfVUludClwaXRjaCAqICggYml0bWFwLT5yb3dzIC0gMSApOwotICAgIH0KLQotICAgIC8qIGZvciBlYWNoIHJvdyAqLwotICAgIGZvciAoIHkgPSAwOyB5IDwgYml0bWFwLT5yb3dzIDsgeSsrICkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogSG9yaXpvbnRhbGx5OgotICAgICAgICoKLSAgICAgICAqIEZyb20gdGhlIGxhc3QgcGl4ZWwgb24sIG1ha2UgZWFjaCBwaXhlbCBvcidlZCB3aXRoIHRoZQotICAgICAgICogYHhzdHInIHBpeGVscyBiZWZvcmUgaXQuCi0gICAgICAgKi8KLSAgICAgIGZvciAoIHggPSBwaXRjaCAtIDE7IHggPj0gMDsgeC0tICkKLSAgICAgIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAgdG1wOwotCi0KLSAgICAgICAgdG1wID0gcFt4XTsKLSAgICAgICAgZm9yICggaSA9IDE7IGkgPD0geHN0cjsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggYml0bWFwLT5waXhlbF9tb2RlID09IEZUX1BJWEVMX01PREVfTU9OTyApCi0gICAgICAgICAgewotICAgICAgICAgICAgcFt4XSB8PSB0bXAgPj4gaTsKLQotICAgICAgICAgICAgLyogdGhlIG1heGltdW0gdmFsdWUgb2YgOCBmb3IgYHhzdHInIGNvbWVzIGZyb20gaGVyZSAqLwotICAgICAgICAgICAgaWYgKCB4ID4gMCApCi0gICAgICAgICAgICAgIHBbeF0gfD0gcFt4IC0gMV0gPDwgKCA4IC0gaSApOwotCi0jaWYgMAotICAgICAgICAgICAgaWYgKCBwW3hdID09IDB4RkYgKQotICAgICAgICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCB4IC0gaSA+PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCBwW3hdICsgcFt4IC0gaV0gPiBiaXRtYXAtPm51bV9ncmF5cyAtIDEgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFt4XSA9ICh1bnNpZ25lZCBjaGFyKSggYml0bWFwLT5udW1fZ3JheXMgLSAxICk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFt4XSA9ICh1bnNpZ25lZCBjaGFyKSggcFt4XSArIHBbeCAtIGldICk7Ci0gICAgICAgICAgICAgICAgaWYgKCBwW3hdID09IGJpdG1hcC0+bnVtX2dyYXlzIC0gMSApCi0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyoKLSAgICAgICAqIFZlcnRpY2FsbHk6Ci0gICAgICAgKgotICAgICAgICogTWFrZSB0aGUgYWJvdmUgYHlzdHInIHJvd3Mgb3InZWQgd2l0aCBpdC4KLSAgICAgICAqLwotICAgICAgZm9yICggeCA9IDE7IHggPD0geXN0cjsgeCsrICkKLSAgICAgIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciogIHE7Ci0KLQotICAgICAgICBxID0gcCAtIGJpdG1hcC0+cGl0Y2ggKiB4OwotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IHBpdGNoOyBpKysgKQotICAgICAgICAgIHFbaV0gfD0gcFtpXTsKLSAgICAgIH0KLQotICAgICAgcCArPSBiaXRtYXAtPnBpdGNoOwotICAgIH0KLQotICAgIGJpdG1hcC0+d2lkdGggKz0gKEZUX1VJbnQpeHN0cjsKLSAgICBiaXRtYXAtPnJvd3MgKz0gKEZUX1VJbnQpeXN0cjsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9CeXRlCi0gIGZ0X2dyYXlfZm9yX3ByZW11bHRpcGxpZWRfc3JnYl9iZ3JhKCBjb25zdCBGVF9CeXRlKiAgYmdyYSApCi0gIHsKLSAgICBGVF9VSW50ICBhID0gYmdyYVszXTsKLSAgICBGVF9VSW50ICBsOwotCi0KLSAgICAvKiBTaG9ydC1jaXJjdWl0IHRyYW5zcGFyZW50IGNvbG9yIHRvIGF2b2lkIGRpdmlzaW9uIGJ5IHplcm8uICovCi0gICAgaWYgKCAhYSApCi0gICAgICByZXR1cm4gMDsKLQotICAgIC8qCi0gICAgICogTHVtaW5vc2l0eSBmb3Igc1JHQiBpcyBkZWZpbmVkIHVzaW5nIH4wLjIxMjYsMC43MTUyLDAuMDcyMgotICAgICAqIGNvZWZmaWNpZW50cyBmb3IgUkdCIGNoYW5uZWxzICpvbiB0aGUgbGluZWFyIGNvbG9ycyouCi0gICAgICogQSBnYW1tYSBvZiAyLjIgaXMgZmFpciB0byBhc3N1bWUuICBBbmQgdGhlbiwgd2UgbmVlZCB0bwotICAgICAqIHVuZG8gdGhlIHByZW11bHRpcGxpY2F0aW9uIHRvby4KLSAgICAgKgotICAgICAqICAgaHR0cDovL2FjY2Vzc2liaWxpdHkua2RlLm9yZy9oc2wtYWRqdXN0ZWQucGhwCi0gICAgICoKLSAgICAgKiBXZSBkbyB0aGUgY29tcHV0YXRpb24gd2l0aCBpbnRlZ2VycyBvbmx5LCBhcHBseWluZyBhIGdhbW1hIG9mIDIuMC4KLSAgICAgKiBXZSBndWFyYW50ZWUgMzItYml0IGFyaXRobWV0aWMgdG8gYXZvaWQgb3ZlcmZsb3cgYnV0IHRoZSByZXN1bHRpbmcKLSAgICAgKiBsdW1pbm9zaXR5IGZpdHMgaW50byAxNiBiaXRzLgotICAgICAqCi0gICAgICovCi0KLSAgICBsID0gKCAgNDczMlVMIC8qIDAuMDcyMiAqIDY1NTM2ICovICogYmdyYVswXSAqIGJncmFbMF0gKwotICAgICAgICAgIDQ2ODcxVUwgLyogMC43MTUyICogNjU1MzYgKi8gKiBiZ3JhWzFdICogYmdyYVsxXSArCi0gICAgICAgICAgMTM5MzNVTCAvKiAwLjIxMjYgKiA2NTUzNiAqLyAqIGJncmFbMl0gKiBiZ3JhWzJdICkgPj4gMTY7Ci0KLSAgICAvKgotICAgICAqIEZpbmFsIHRyYW5zcGFyZW5jeSBjYW4gYmUgZGV0ZXJtaW5lZCBhcyBmb2xsb3dzLgotICAgICAqCi0gICAgICogLSBJZiBhbHBoYSBpcyB6ZXJvLCB3ZSB3YW50IDAuCi0gICAgICogLSBJZiBhbHBoYSBpcyB6ZXJvIGFuZCBsdW1pbm9zaXR5IGlzIHplcm8sIHdlIHdhbnQgMjU1LgotICAgICAqIC0gSWYgYWxwaGEgaXMgemVybyBhbmQgbHVtaW5vc2l0eSBpcyBvbmUsIHdlIHdhbnQgMC4KLSAgICAgKgotICAgICAqIFNvIHRoZSBmb3JtdWxhIGlzIGEgKiAoMSAtIGwpID0gYSAtIGwgKiBhLgotICAgICAqCi0gICAgICogV2Ugc3RpbGwgbmVlZCB0byB1bmRvIHByZW11bHRpcGxpY2F0aW9uIGJ5IGRpdmlkaW5nIGwgYnkgYSphLgotICAgICAqCi0gICAgICovCi0KLSAgICByZXR1cm4gKEZUX0J5dGUpKCBhIC0gbCAvIGEgKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGJpdG1hcC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9CaXRtYXBfQ29udmVydCggRlRfTGlicmFyeSAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0JpdG1hcCAgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCAgICAgICAgKnRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICAgIGFsaWdubWVudCApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotCi0gICAgRlRfQnl0ZSogIHM7Ci0gICAgRlRfQnl0ZSogIHQ7Ci0KLQotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0xpYnJhcnlfSGFuZGxlICk7Ci0KLSAgICBpZiAoICFzb3VyY2UgfHwgIXRhcmdldCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLQotICAgIHN3aXRjaCAoIHNvdXJjZS0+cGl4ZWxfbW9kZSApCi0gICAgewotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9NT05POgotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9HUkFZOgotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9HUkFZMjoKLSAgICBjYXNlIEZUX1BJWEVMX01PREVfR1JBWTQ6Ci0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0xDRDoKLSAgICBjYXNlIEZUX1BJWEVMX01PREVfTENEX1Y6Ci0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0JHUkE6Ci0gICAgICB7Ci0gICAgICAgIEZUX0ludCAgICBwYWQsIG9sZF90YXJnZXRfcGl0Y2gsIHRhcmdldF9waXRjaDsKLSAgICAgICAgRlRfVUxvbmcgIG9sZF9zaXplOwotCi0KLSAgICAgICAgb2xkX3RhcmdldF9waXRjaCA9IHRhcmdldC0+cGl0Y2g7Ci0gICAgICAgIGlmICggb2xkX3RhcmdldF9waXRjaCA8IDAgKQotICAgICAgICAgIG9sZF90YXJnZXRfcGl0Y2ggPSAtb2xkX3RhcmdldF9waXRjaDsKLQotICAgICAgICBvbGRfc2l6ZSA9IHRhcmdldC0+cm93cyAqIChGVF9VSW50KW9sZF90YXJnZXRfcGl0Y2g7Ci0KLSAgICAgICAgdGFyZ2V0LT5waXhlbF9tb2RlID0gRlRfUElYRUxfTU9ERV9HUkFZOwotICAgICAgICB0YXJnZXQtPnJvd3MgICAgICAgPSBzb3VyY2UtPnJvd3M7Ci0gICAgICAgIHRhcmdldC0+d2lkdGggICAgICA9IHNvdXJjZS0+d2lkdGg7Ci0KLSAgICAgICAgcGFkID0gMDsKLSAgICAgICAgaWYgKCBhbGlnbm1lbnQgPiAwICkKLSAgICAgICAgewotICAgICAgICAgIHBhZCA9IChGVF9JbnQpc291cmNlLT53aWR0aCAlIGFsaWdubWVudDsKLSAgICAgICAgICBpZiAoIHBhZCAhPSAwICkKLSAgICAgICAgICAgIHBhZCA9IGFsaWdubWVudCAtIHBhZDsKLSAgICAgICAgfQotCi0gICAgICAgIHRhcmdldF9waXRjaCA9IChGVF9JbnQpc291cmNlLT53aWR0aCArIHBhZDsKLQotICAgICAgICBpZiAoIHRhcmdldF9waXRjaCA+IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgKEZUX1VMb25nKXRhcmdldC0+cm93cyA+IEZUX1VMT05HX01BWCAvIChGVF9VTG9uZyl0YXJnZXRfcGl0Y2ggKQotICAgICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgICAgIGlmICggdGFyZ2V0LT5yb3dzICogKEZUX1VMb25nKXRhcmdldF9waXRjaCA+IG9sZF9zaXplICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIEZUX1FSRUFMTE9DKCB0YXJnZXQtPmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX3NpemUsIHRhcmdldC0+cm93cyAqIChGVF9VSW50KXRhcmdldF9waXRjaCApICkKLSAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgICAgdGFyZ2V0LT5waXRjaCA9IHRhcmdldC0+cGl0Y2ggPCAwID8gLXRhcmdldF9waXRjaCA6IHRhcmdldF9waXRjaDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICB9Ci0KLSAgICBzID0gc291cmNlLT5idWZmZXI7Ci0gICAgdCA9IHRhcmdldC0+YnVmZmVyOwotCi0gICAgLyogdGFrZSBjYXJlIG9mIGJpdG1hcCBmbG93ICovCi0gICAgaWYgKCBzb3VyY2UtPnBpdGNoIDwgMCApCi0gICAgICBzIC09IHNvdXJjZS0+cGl0Y2ggKiAoRlRfSW50KSggc291cmNlLT5yb3dzIC0gMSApOwotICAgIGlmICggdGFyZ2V0LT5waXRjaCA8IDAgKQotICAgICAgdCAtPSB0YXJnZXQtPnBpdGNoICogKEZUX0ludCkoIHRhcmdldC0+cm93cyAtIDEgKTsKLQotICAgIHN3aXRjaCAoIHNvdXJjZS0+cGl4ZWxfbW9kZSApCi0gICAgewotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9NT05POgotICAgICAgewotICAgICAgICBGVF9VSW50ICBpOwotCi0KLSAgICAgICAgdGFyZ2V0LT5udW1fZ3JheXMgPSAyOwotCi0gICAgICAgIGZvciAoIGkgPSBzb3VyY2UtPnJvd3M7IGkgPiAwOyBpLS0gKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfQnl0ZSogIHNzID0gczsKLSAgICAgICAgICBGVF9CeXRlKiAgdHQgPSB0OwotICAgICAgICAgIEZUX1VJbnQgICBqOwotCi0KLSAgICAgICAgICAvKiBnZXQgdGhlIGZ1bGwgYnl0ZXMgKi8KLSAgICAgICAgICBmb3IgKCBqID0gc291cmNlLT53aWR0aCA+PiAzOyBqID4gMDsgai0tICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIHZhbCA9IHNzWzBdOyAvKiBhdm9pZCBhIGJ5dGUtPmludCBjYXN0IG9uIGVhY2ggbGluZSAqLwotCi0KLSAgICAgICAgICAgIHR0WzBdID0gKEZUX0J5dGUpKCAoIHZhbCAmIDB4ODAgKSA+PiA3ICk7Ci0gICAgICAgICAgICB0dFsxXSA9IChGVF9CeXRlKSggKCB2YWwgJiAweDQwICkgPj4gNiApOwotICAgICAgICAgICAgdHRbMl0gPSAoRlRfQnl0ZSkoICggdmFsICYgMHgyMCApID4+IDUgKTsKLSAgICAgICAgICAgIHR0WzNdID0gKEZUX0J5dGUpKCAoIHZhbCAmIDB4MTAgKSA+PiA0ICk7Ci0gICAgICAgICAgICB0dFs0XSA9IChGVF9CeXRlKSggKCB2YWwgJiAweDA4ICkgPj4gMyApOwotICAgICAgICAgICAgdHRbNV0gPSAoRlRfQnl0ZSkoICggdmFsICYgMHgwNCApID4+IDIgKTsKLSAgICAgICAgICAgIHR0WzZdID0gKEZUX0J5dGUpKCAoIHZhbCAmIDB4MDIgKSA+PiAxICk7Ci0gICAgICAgICAgICB0dFs3XSA9IChGVF9CeXRlKSggICB2YWwgJiAweDAxICk7Ci0KLSAgICAgICAgICAgIHR0ICs9IDg7Ci0gICAgICAgICAgICBzcyArPSAxOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIGdldCByZW1haW5pbmcgcGl4ZWxzIChpZiBhbnkpICovCi0gICAgICAgICAgaiA9IHNvdXJjZS0+d2lkdGggJiA3OwotICAgICAgICAgIGlmICggaiA+IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ludCAgdmFsID0gKnNzOwotCi0KLSAgICAgICAgICAgIGZvciAoIDsgaiA+IDA7IGotLSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHR0WzBdID0gKEZUX0J5dGUpKCAoIHZhbCAmIDB4ODAgKSA+PiA3KTsKLSAgICAgICAgICAgICAgdmFsIDw8PSAxOwotICAgICAgICAgICAgICB0dCAgICs9IDE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgcyArPSBzb3VyY2UtPnBpdGNoOwotICAgICAgICAgIHQgKz0gdGFyZ2V0LT5waXRjaDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLQotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9HUkFZOgotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9MQ0Q6Ci0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0xDRF9WOgotICAgICAgewotICAgICAgICBGVF9VSW50ICB3aWR0aCA9IHNvdXJjZS0+d2lkdGg7Ci0gICAgICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgICAgICB0YXJnZXQtPm51bV9ncmF5cyA9IDI1NjsKLQotICAgICAgICBmb3IgKCBpID0gc291cmNlLT5yb3dzOyBpID4gMDsgaS0tICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0FSUkFZX0NPUFkoIHQsIHMsIHdpZHRoICk7Ci0KLSAgICAgICAgICBzICs9IHNvdXJjZS0+cGl0Y2g7Ci0gICAgICAgICAgdCArPSB0YXJnZXQtPnBpdGNoOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotCi0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0dSQVkyOgotICAgICAgewotICAgICAgICBGVF9VSW50ICBpOwotCi0KLSAgICAgICAgdGFyZ2V0LT5udW1fZ3JheXMgPSA0OwotCi0gICAgICAgIGZvciAoIGkgPSBzb3VyY2UtPnJvd3M7IGkgPiAwOyBpLS0gKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfQnl0ZSogIHNzID0gczsKLSAgICAgICAgICBGVF9CeXRlKiAgdHQgPSB0OwotICAgICAgICAgIEZUX1VJbnQgICBqOwotCi0KLSAgICAgICAgICAvKiBnZXQgdGhlIGZ1bGwgYnl0ZXMgKi8KLSAgICAgICAgICBmb3IgKCBqID0gc291cmNlLT53aWR0aCA+PiAyOyBqID4gMDsgai0tICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIHZhbCA9IHNzWzBdOwotCi0KLSAgICAgICAgICAgIHR0WzBdID0gKEZUX0J5dGUpKCAoIHZhbCAmIDB4QzAgKSA+PiA2ICk7Ci0gICAgICAgICAgICB0dFsxXSA9IChGVF9CeXRlKSggKCB2YWwgJiAweDMwICkgPj4gNCApOwotICAgICAgICAgICAgdHRbMl0gPSAoRlRfQnl0ZSkoICggdmFsICYgMHgwQyApID4+IDIgKTsKLSAgICAgICAgICAgIHR0WzNdID0gKEZUX0J5dGUpKCAoIHZhbCAmIDB4MDMgKSApOwotCi0gICAgICAgICAgICBzcyArPSAxOwotICAgICAgICAgICAgdHQgKz0gNDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBqID0gc291cmNlLT53aWR0aCAmIDM7Ci0gICAgICAgICAgaWYgKCBqID4gMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfSW50ICB2YWwgPSBzc1swXTsKLQotCi0gICAgICAgICAgICBmb3IgKCA7IGogPiAwOyBqLS0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0dFswXSAgPSAoRlRfQnl0ZSkoICggdmFsICYgMHhDMCApID4+IDYgKTsKLSAgICAgICAgICAgICAgdmFsICA8PD0gMjsKLSAgICAgICAgICAgICAgdHQgICAgKz0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzICs9IHNvdXJjZS0+cGl0Y2g7Ci0gICAgICAgICAgdCArPSB0YXJnZXQtPnBpdGNoOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotCi0gICAgY2FzZSBGVF9QSVhFTF9NT0RFX0dSQVk0OgotICAgICAgewotICAgICAgICBGVF9VSW50ICBpOwotCi0KLSAgICAgICAgdGFyZ2V0LT5udW1fZ3JheXMgPSAxNjsKLQotICAgICAgICBmb3IgKCBpID0gc291cmNlLT5yb3dzOyBpID4gMDsgaS0tICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0J5dGUqICBzcyA9IHM7Ci0gICAgICAgICAgRlRfQnl0ZSogIHR0ID0gdDsKLSAgICAgICAgICBGVF9VSW50ICAgajsKLQotCi0gICAgICAgICAgLyogZ2V0IHRoZSBmdWxsIGJ5dGVzICovCi0gICAgICAgICAgZm9yICggaiA9IHNvdXJjZS0+d2lkdGggPj4gMTsgaiA+IDA7IGotLSApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfSW50ICB2YWwgPSBzc1swXTsKLQotCi0gICAgICAgICAgICB0dFswXSA9IChGVF9CeXRlKSggKCB2YWwgJiAweEYwICkgPj4gNCApOwotICAgICAgICAgICAgdHRbMV0gPSAoRlRfQnl0ZSkoICggdmFsICYgMHgwRiApICk7Ci0KLSAgICAgICAgICAgIHNzICs9IDE7Ci0gICAgICAgICAgICB0dCArPSAyOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggc291cmNlLT53aWR0aCAmIDEgKQotICAgICAgICAgICAgdHRbMF0gPSAoRlRfQnl0ZSkoICggc3NbMF0gJiAweEYwICkgPj4gNCApOwotCi0gICAgICAgICAgcyArPSBzb3VyY2UtPnBpdGNoOwotICAgICAgICAgIHQgKz0gdGFyZ2V0LT5waXRjaDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLQotICAgIGNhc2UgRlRfUElYRUxfTU9ERV9CR1JBOgotICAgICAgewotICAgICAgICBGVF9VSW50ICBpOwotCi0KLSAgICAgICAgdGFyZ2V0LT5udW1fZ3JheXMgPSAyNTY7Ci0KLSAgICAgICAgZm9yICggaSA9IHNvdXJjZS0+cm93czsgaSA+IDA7IGktLSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9CeXRlKiAgc3MgPSBzOwotICAgICAgICAgIEZUX0J5dGUqICB0dCA9IHQ7Ci0gICAgICAgICAgRlRfVUludCAgIGo7Ci0KLQotICAgICAgICAgIGZvciAoIGogPSBzb3VyY2UtPndpZHRoOyBqID4gMDsgai0tICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0dFswXSA9IGZ0X2dyYXlfZm9yX3ByZW11bHRpcGxpZWRfc3JnYl9iZ3JhKCBzcyApOwotCi0gICAgICAgICAgICBzcyArPSA0OwotICAgICAgICAgICAgdHQgKz0gMTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzICs9IHNvdXJjZS0+cGl0Y2g7Ci0gICAgICAgICAgdCArPSB0YXJnZXQtPnBpdGNoOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICA7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Yml0bWFwLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dseXBoU2xvdF9Pd25fQml0bWFwKCBGVF9HbHlwaFNsb3QgIHNsb3QgKQotICB7Ci0gICAgaWYgKCBzbG90ICYmIHNsb3QtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQICAgJiYKLSAgICAgICAgICEoIHNsb3QtPmludGVybmFsLT5mbGFncyAmIEZUX0dMWVBIX09XTl9CSVRNQVAgKSApCi0gICAgewotICAgICAgRlRfQml0bWFwICBiaXRtYXA7Ci0gICAgICBGVF9FcnJvciAgIGVycm9yOwotCi0KLSAgICAgIEZUX0JpdG1hcF9Jbml0KCAmYml0bWFwICk7Ci0gICAgICBlcnJvciA9IEZUX0JpdG1hcF9Db3B5KCBzbG90LT5saWJyYXJ5LCAmc2xvdC0+Yml0bWFwLCAmYml0bWFwICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICBzbG90LT5iaXRtYXAgPSBiaXRtYXA7Ci0gICAgICBzbG90LT5pbnRlcm5hbC0+ZmxhZ3MgfD0gRlRfR0xZUEhfT1dOX0JJVE1BUDsKLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Yml0bWFwLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0JpdG1hcF9Eb25lKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgRlRfQml0bWFwICAqYml0bWFwICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotCi0KLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9MaWJyYXJ5X0hhbmRsZSApOwotCi0gICAgaWYgKCAhYml0bWFwICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0gICAgRlRfRlJFRSggYml0bWFwLT5idWZmZXIgKTsKLSAgICAqYml0bWFwID0gbnVsbF9iaXRtYXA7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGNhbGMuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0Y2FsYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTlhMDhiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0Y2FsYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGNhbGMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXJpdGhtZXRpYyBjb21wdXRhdGlvbnMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3VwcG9ydCBmb3IgMS1jb21wbGVtZW50IGFyaXRobWV0aWMgaGFzIGJlZW4gdG90YWxseSBkcm9wcGVkIGluIHRoaXMgICovCi0gIC8qIHJlbGVhc2UuICBZb3UgY2FuIHN0aWxsIHdyaXRlIHlvdXIgb3duIGNvZGUgaWYgeW91IG5lZWQgaXQuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJbXBsZW1lbnRpbmcgYmFzaWMgY29tcHV0YXRpb24gcm91dGluZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZUX011bERpdigpLCBGVF9NdWxGaXgoKSwgRlRfRGl2Rml4KCksIEZUX1JvdW5kRml4KCksIEZUX0NlaWxGaXgoKSwgICAqLwotICAvKiBhbmQgRlRfRmxvb3JGaXgoKSBhcmUgZGVjbGFyZWQgaW4gZnJlZXR5cGUuaC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfR0xZUEhfSAotI2luY2x1ZGUgRlRfVFJJR09OT01FVFJZX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0KLQotI2lmZGVmIEZUX01VTEZJWF9BU1NFTUJMRVIKLSN1bmRlZiBGVF9NdWxGaXgKLSNlbmRpZgotCi0vKiB3ZSBuZWVkIHRvIGVtdWxhdGUgYSA2NC1iaXQgZGF0YSB0eXBlIGlmIGEgcmVhbCBvbmUgaXNuJ3QgYXZhaWxhYmxlICovCi0KLSNpZm5kZWYgRlRfTE9ORzY0Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX0ludDY0XwotICB7Ci0gICAgRlRfVUludDMyICBsbzsKLSAgICBGVF9VSW50MzIgIGhpOwotCi0gIH0gRlRfSW50NjQ7Ci0KLSNlbmRpZiAvKiAhRlRfTE9ORzY0ICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9jYWxjCi0KLQotICAvKiB0cmFuc2ZlciBzaWduIGxlYXZpbmcgYSBwb3NpdGl2ZSBudW1iZXIgKi8KLSNkZWZpbmUgRlRfTU9WRV9TSUdOKCB4LCBzICkgXAotICBGVF9CRUdJTl9TVE1OVCAgICAgICAgICAgICBcCi0gICAgaWYgKCB4IDwgMCApICAgICAgICAgICAgIFwKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgeCA9IC14OyAgICAgICAgICAgICAgICBcCi0gICAgICBzID0gLXM7ICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FTkRfU1RNTlQKLQotICAvKiBUaGUgZm9sbG93aW5nIHRocmVlIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciAqLwotICAvKiBGVF9MT05HNjQgaXMgZGVmaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0ZpeGVkICkKLSAgRlRfUm91bmRGaXgoIEZUX0ZpeGVkICBhICkKLSAgewotICAgIHJldHVybiAoIGEgKyAweDgwMDBMIC0gKCBhIDwgMCApICkgJiB+MHhGRkZGTDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRml4ZWQgKQotICBGVF9DZWlsRml4KCBGVF9GaXhlZCAgYSApCi0gIHsKLSAgICByZXR1cm4gKCBhICsgMHhGRkZGTCApICYgfjB4RkZGRkw7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0ZpeGVkICkKLSAgRlRfRmxvb3JGaXgoIEZUX0ZpeGVkICBhICkKLSAgewotICAgIHJldHVybiBhICYgfjB4RkZGRkw7Ci0gIH0KLQotI2lmbmRlZiBGVF9NU0IKLQotICBGVF9CQVNFX0RFRiAoIEZUX0ludCApCi0gIEZUX01TQiggRlRfVUludDMyIHogKQotICB7Ci0gICAgRlRfSW50ICBzaGlmdCA9IDA7Ci0KLQotICAgIC8qIGRldGVybWluZSBtc2IgYml0IGluZGV4IGluIGBzaGlmdCcgKi8KLSAgICBpZiAoIHogJiAweEZGRkYwMDAwVUwgKQotICAgIHsKLSAgICAgIHogICAgID4+PSAxNjsKLSAgICAgIHNoaWZ0ICArPSAxNjsKLSAgICB9Ci0gICAgaWYgKCB6ICYgMHgwMDAwRkYwMFVMICkKLSAgICB7Ci0gICAgICB6ICAgICA+Pj0gODsKLSAgICAgIHNoaWZ0ICArPSA4OwotICAgIH0KLSAgICBpZiAoIHogJiAweDAwMDAwMEYwVUwgKQotICAgIHsKLSAgICAgIHogICAgID4+PSA0OwotICAgICAgc2hpZnQgICs9IDQ7Ci0gICAgfQotICAgIGlmICggeiAmIDB4MDAwMDAwMENVTCApCi0gICAgewotICAgICAgeiAgICAgPj49IDI7Ci0gICAgICBzaGlmdCAgKz0gMjsKLSAgICB9Ci0gICAgaWYgKCB6ICYgMHgwMDAwMDAwMlVMICkKLSAgICB7Ci0gICAvKiB6ICAgICA+Pj0gMTsgKi8KLSAgICAgIHNoaWZ0ICArPSAxOwotICAgIH0KLQotICAgIHJldHVybiBzaGlmdDsKLSAgfQotCi0jZW5kaWYgLyogIUZUX01TQiAqLwotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGNhbGMuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBGVF9GaXhlZCApCi0gIEZUX0h5cG90KCBGVF9GaXhlZCAgeCwKLSAgICAgICAgICAgIEZUX0ZpeGVkICB5ICkKLSAgewotICAgIEZUX1ZlY3RvciAgdjsKLQotCi0gICAgdi54ID0geDsKLSAgICB2LnkgPSB5OwotCi0gICAgcmV0dXJuIEZUX1ZlY3Rvcl9MZW5ndGgoICZ2ICk7Ci0gIH0KLQotCi0jaWZkZWYgRlRfTE9ORzY0Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9Mb25nICkKLSAgRlRfTXVsRGl2KCBGVF9Mb25nICBhXywKLSAgICAgICAgICAgICBGVF9Mb25nICBiXywKLSAgICAgICAgICAgICBGVF9Mb25nICBjXyApCi0gIHsKLSAgICBGVF9JbnQgICAgIHMgPSAxOwotICAgIEZUX1VJbnQ2NCAgYSwgYiwgYywgZDsKLSAgICBGVF9Mb25nICAgIGRfOwotCi0KLSAgICBGVF9NT1ZFX1NJR04oIGFfLCBzICk7Ci0gICAgRlRfTU9WRV9TSUdOKCBiXywgcyApOwotICAgIEZUX01PVkVfU0lHTiggY18sIHMgKTsKLQotICAgIGEgPSAoRlRfVUludDY0KWFfOwotICAgIGIgPSAoRlRfVUludDY0KWJfOwotICAgIGMgPSAoRlRfVUludDY0KWNfOwotCi0gICAgZCA9IGMgPiAwID8gKCBhICogYiArICggYyA+PiAxICkgKSAvIGMKLSAgICAgICAgICAgICAgOiAweDdGRkZGRkZGVUw7Ci0KLSAgICBkXyA9IChGVF9Mb25nKWQ7Ci0KLSAgICByZXR1cm4gcyA8IDAgPyAtZF8gOiBkXzsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGNhbGMuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBGVF9Mb25nICkKLSAgRlRfTXVsRGl2X05vX1JvdW5kKCBGVF9Mb25nICBhXywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICBiXywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICBjXyApCi0gIHsKLSAgICBGVF9JbnQgICAgIHMgPSAxOwotICAgIEZUX1VJbnQ2NCAgYSwgYiwgYywgZDsKLSAgICBGVF9Mb25nICAgIGRfOwotCi0KLSAgICBGVF9NT1ZFX1NJR04oIGFfLCBzICk7Ci0gICAgRlRfTU9WRV9TSUdOKCBiXywgcyApOwotICAgIEZUX01PVkVfU0lHTiggY18sIHMgKTsKLQotICAgIGEgPSAoRlRfVUludDY0KWFfOwotICAgIGIgPSAoRlRfVUludDY0KWJfOwotICAgIGMgPSAoRlRfVUludDY0KWNfOwotCi0gICAgZCA9IGMgPiAwID8gYSAqIGIgLyBjCi0gICAgICAgICAgICAgIDogMHg3RkZGRkZGRlVMOwotCi0gICAgZF8gPSAoRlRfTG9uZylkOwotCi0gICAgcmV0dXJuIHMgPCAwID8gLWRfIDogZF87Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0xvbmcgKQotICBGVF9NdWxGaXgoIEZUX0xvbmcgIGFfLAotICAgICAgICAgICAgIEZUX0xvbmcgIGJfICkKLSAgewotI2lmZGVmIEZUX01VTEZJWF9BU1NFTUJMRVIKLQotICAgIHJldHVybiBGVF9NVUxGSVhfQVNTRU1CTEVSKCBhXywgYl8gKTsKLQotI2Vsc2UKLQotICAgIEZUX0ludDY0ICBhYiA9IChGVF9JbnQ2NClhXyAqIChGVF9JbnQ2NCliXzsKLQotICAgIC8qIHRoaXMgcmVxdWlyZXMgYXJpdGhtZXRpYyByaWdodCBzaGlmdCBvZiBzaWduZWQgbnVtYmVycyAqLwotICAgIHJldHVybiAoRlRfTG9uZykoICggYWIgKyAweDgwMDBMIC0gKCBhYiA8IDAgKSApID4+IDE2ICk7Ci0KLSNlbmRpZiAvKiBGVF9NVUxGSVhfQVNTRU1CTEVSICovCi0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0xvbmcgKQotICBGVF9EaXZGaXgoIEZUX0xvbmcgIGFfLAotICAgICAgICAgICAgIEZUX0xvbmcgIGJfICkKLSAgewotICAgIEZUX0ludCAgICAgcyA9IDE7Ci0gICAgRlRfVUludDY0ICBhLCBiLCBxOwotICAgIEZUX0xvbmcgICAgcV87Ci0KLQotICAgIEZUX01PVkVfU0lHTiggYV8sIHMgKTsKLSAgICBGVF9NT1ZFX1NJR04oIGJfLCBzICk7Ci0KLSAgICBhID0gKEZUX1VJbnQ2NClhXzsKLSAgICBiID0gKEZUX1VJbnQ2NCliXzsKLQotICAgIHEgPSBiID4gMCA/ICggKCBhIDw8IDE2ICkgKyAoIGIgPj4gMSApICkgLyBiCi0gICAgICAgICAgICAgIDogMHg3RkZGRkZGRlVMOwotCi0gICAgcV8gPSAoRlRfTG9uZylxOwotCi0gICAgcmV0dXJuIHMgPCAwID8gLXFfIDogcV87Ci0gIH0KLQotCi0jZWxzZSAvKiAhRlRfTE9ORzY0ICovCi0KLQotICBzdGF0aWMgdm9pZAotICBmdF9tdWx0bzY0KCBGVF9VSW50MzIgIHgsCi0gICAgICAgICAgICAgIEZUX1VJbnQzMiAgeSwKLSAgICAgICAgICAgICAgRlRfSW50NjQgICp6ICkKLSAgewotICAgIEZUX1VJbnQzMiAgbG8xLCBoaTEsIGxvMiwgaGkyLCBsbywgaGksIGkxLCBpMjsKLQotCi0gICAgbG8xID0geCAmIDB4MDAwMEZGRkZVOyAgaGkxID0geCA+PiAxNjsKLSAgICBsbzIgPSB5ICYgMHgwMDAwRkZGRlU7ICBoaTIgPSB5ID4+IDE2OwotCi0gICAgbG8gPSBsbzEgKiBsbzI7Ci0gICAgaTEgPSBsbzEgKiBoaTI7Ci0gICAgaTIgPSBsbzIgKiBoaTE7Ci0gICAgaGkgPSBoaTEgKiBoaTI7Ci0KLSAgICAvKiBDaGVjayBjYXJyeSBvdmVyZmxvdyBvZiBpMSArIGkyICovCi0gICAgaTEgKz0gaTI7Ci0gICAgaGkgKz0gKEZUX1VJbnQzMikoIGkxIDwgaTIgKSA8PCAxNjsKLQotICAgIGhpICs9IGkxID4+IDE2OwotICAgIGkxICA9IGkxIDw8IDE2OwotCi0gICAgLyogQ2hlY2sgY2Fycnkgb3ZlcmZsb3cgb2YgaTEgKyBsbyAqLwotICAgIGxvICs9IGkxOwotICAgIGhpICs9ICggbG8gPCBpMSApOwotCi0gICAgei0+bG8gPSBsbzsKLSAgICB6LT5oaSA9IGhpOwotICB9Ci0KLQotICBzdGF0aWMgRlRfVUludDMyCi0gIGZ0X2RpdjY0YnkzMiggRlRfVUludDMyICBoaSwKLSAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGxvLAotICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgeSApCi0gIHsKLSAgICBGVF9VSW50MzIgIHIsIHE7Ci0gICAgRlRfSW50ICAgICBpOwotCi0KLSAgICBpZiAoIGhpID49IHkgKQotICAgICAgcmV0dXJuIChGVF9VSW50MzIpMHg3RkZGRkZGRkw7Ci0KLSAgICAvKiBXZSBzaGlmdCBhcyBtYW55IGJpdHMgYXMgd2UgY2FuIGludG8gdGhlIGhpZ2ggcmVnaXN0ZXIsIHBlcmZvcm0gICAgICovCi0gICAgLyogMzItYml0IGRpdmlzaW9uIHdpdGggbW9kdWxvIHRoZXJlLCB0aGVuIHdvcmsgdGhyb3VnaCB0aGUgcmVtYWluaW5nICAqLwotICAgIC8qIGJpdHMgd2l0aCBsb25nIGRpdmlzaW9uLiBUaGlzIG9wdGltaXphdGlvbiBpcyBlc3BlY2lhbGx5IG5vdGljZWFibGUgKi8KLSAgICAvKiBmb3Igc21hbGxlciBkaXZpZGVuZHMgdGhhdCBiYXJlbHkgdXNlIHRoZSBoaWdoIHJlZ2lzdGVyLiAgICAgICAgICAgICovCi0KLSAgICBpID0gMzEgLSBGVF9NU0IoIGhpICk7Ci0gICAgciA9ICggaGkgPDwgaSApIHwgKCBsbyA+PiAoIDMyIC0gaSApICk7IGxvIDw8PSBpOyAvKiBsZWZ0IDY0LWJpdCBzaGlmdCAqLwotICAgIHEgPSByIC8geTsKLSAgICByIC09IHEgKiB5OyAgIC8qIHJlbWFpbmRlciAqLwotCi0gICAgaSA9IDMyIC0gaTsgICAvKiBiaXRzIHJlbWFpbmluZyBpbiBsb3cgcmVnaXN0ZXIgKi8KLSAgICBkbwotICAgIHsKLSAgICAgIHEgPDw9IDE7Ci0gICAgICByICAgPSAoIHIgPDwgMSApIHwgKCBsbyA+PiAzMSApOyBsbyA8PD0gMTsKLQotICAgICAgaWYgKCByID49IHkgKQotICAgICAgewotICAgICAgICByIC09IHk7Ci0gICAgICAgIHEgfD0gMTsKLSAgICAgIH0KLSAgICB9IHdoaWxlICggLS1pICk7Ci0KLSAgICByZXR1cm4gcTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgRlRfQWRkNjQoIEZUX0ludDY0KiAgeCwKLSAgICAgICAgICAgIEZUX0ludDY0KiAgeSwKLSAgICAgICAgICAgIEZUX0ludDY0ICAqeiApCi0gIHsKLSAgICBGVF9VSW50MzIgIGxvLCBoaTsKLQotCi0gICAgbG8gPSB4LT5sbyArIHktPmxvOwotICAgIGhpID0geC0+aGkgKyB5LT5oaSArICggbG8gPCB4LT5sbyApOwotCi0gICAgei0+bG8gPSBsbzsKLSAgICB6LT5oaSA9IGhpOwotICB9Ci0KLQotICAvKiAgVGhlIEZUX011bERpdiBmdW5jdGlvbiBoYXMgYmVlbiBvcHRpbWl6ZWQgdGhhbmtzIHRvIGlkZWFzIGZyb20gICAgICovCi0gIC8qICBHcmFoYW0gQXNoZXIgYW5kIEFsZXhlaSBQb2R0ZWxlemhuaWtvdi4gIFRoZSB0cmljayBpcyB0byBvcHRpbWl6ZSAgKi8KLSAgLyogIGEgcmF0aGVyIGNvbW1vbiBjYXNlIHdoZW4gZXZlcnl0aGluZyBmaXRzIHdpdGhpbiAzMi1iaXRzLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBXZSBjb21wdXRlICdhKmIrYy8yJywgdGhlbiBkaXZpZGUgaXQgYnkgJ2MnIChhbGwgcG9zaXRpdmUgdmFsdWVzKS4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhlIHByb2R1Y3Qgb2YgdHdvIHBvc2l0aXZlIG51bWJlcnMgbmV2ZXIgZXhjZWVkcyB0aGUgc3F1YXJlIG9mICAgICovCi0gIC8qICBpdHMgbWVhbiB2YWx1ZXMuICBUaGVyZWZvcmUsIHdlIGFsd2F5cyBhdm9pZCB0aGUgb3ZlcmZsb3cgYnkgICAgICAgKi8KLSAgLyogIGltcG9zaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIChhICsgYikgLyAyIDw9IHNxcnQoWCAtIGMvMikgICAgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgd2hlcmUgWCA9IDJeMzIgLSAxLCB0aGUgbWF4aW11bSB1bnNpZ25lZCAzMi1iaXQgdmFsdWUsIGFuZCB1c2luZyAgICovCi0gIC8qICB1bnNpZ25lZCBhcml0aG1ldGljLiAgTm93IHdlIHJlcGxhY2UgYHNxcnQnIHdpdGggYSBsaW5lYXIgZnVuY3Rpb24gKi8KLSAgLyogIHRoYXQgaXMgc21hbGxlciBvciBlcXVhbCBmb3IgYWxsIHZhbHVlcyBvZiBjIGluIHRoZSBpbnRlcnZhbCAgICAgICAqLwotICAvKiAgWzA7WC8yXTsgaXQgc2hvdWxkIGJlIGVxdWFsIHRvIHNxcnQoWCkgYW5kIHNxcnQoM1gvNCkgYXQgdGhlICAgICAgICovCi0gIC8qICBlbmRwb2ludHMuICBTdWJzdGl0dXRpbmcgdGhlIGxpbmVhciBzb2x1dGlvbiBhbmQgZXhwbGljaXQgbnVtYmVycyAgKi8KLSAgLyogIHdlIGdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGEgKyBiIDw9IDEzMTA3MS45OSAtIGMgLyAxMjIyOTEuODQgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgSW4gcHJhY3RpY2UsIHdlIHNob3VsZCB1c2UgYSBmYXN0ZXIgYW5kIGV2ZW4gc3Ryb25nZXIgaW5lcXVhbGl0eSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYSArIGIgPD0gMTMxMDcxIC0gKGMgPj4gMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBvciwgYWx0ZXJuYXRpdmVseSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhICsgYiA8PSAxMjk4OTQgLSAoYyA+PiAxNykgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIEZUX011bEZpeCwgb24gdGhlIG90aGVyIGhhbmQsIGlzIG9wdGltaXplZCBmb3IgYSBzbWFsbCB2YWx1ZSBvZiAgICAqLwotICAvKiAgdGhlIGZpcnN0IGFyZ3VtZW50LCB3aGVuIHRoZSBzZWNvbmQgYXJndW1lbnQgY2FuIGJlIG11Y2ggbGFyZ2VyLiAgICovCi0gIC8qICBUaGlzIGNhbiBiZSBhY2hpZXZlZCBieSBzY2FsaW5nIHRoZSBzZWNvbmQgYXJndW1lbnQgYW5kIHRoZSBsaW1pdCAgKi8KLSAgLyogIGluIHRoZSBhYm92ZSBpbmVxdWFsaXRpZXMuICBGb3IgZXhhbXBsZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGEgKyAoYiA+PiA4KSA8PSAoMTMxMDcxID4+IDQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgY292ZXJzIHRoZSBwcmFjdGljYWwgcmFuZ2Ugb2YgdXNlLiBUaGUgYWN0dWFsIHRlc3QgYmVsb3cgaXMgYSBiaXQgICovCi0gIC8qICB0aWdodGVyIHRvIGF2b2lkIHRoZSBib3JkZXIgY2FzZSBvdmVyZmxvd3MuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgSW4gdGhlIGNhc2Ugb2YgRlRfRGl2Rml4LCB0aGUgZXhhY3Qgb3ZlcmZsb3cgY2hlY2sgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYSA8PCAxNiA8PSBYIC0gYy8yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBpcyBzY2FsZWQgZG93biBieSAyXjE2IGFuZCB3ZSB1c2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhIDw9IDY1NTM1IC0gKGMgPj4gMTcpICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfTG9uZyApCi0gIEZUX011bERpdiggRlRfTG9uZyAgYV8sCi0gICAgICAgICAgICAgRlRfTG9uZyAgYl8sCi0gICAgICAgICAgICAgRlRfTG9uZyAgY18gKQotICB7Ci0gICAgRlRfSW50ICAgICBzID0gMTsKLSAgICBGVF9VSW50MzIgIGEsIGIsIGM7Ci0KLQotICAgIC8qIFhYWDogdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBhbGxvdyA2NC1iaXQgYXJndW1lbnRzICovCi0KLSAgICBGVF9NT1ZFX1NJR04oIGFfLCBzICk7Ci0gICAgRlRfTU9WRV9TSUdOKCBiXywgcyApOwotICAgIEZUX01PVkVfU0lHTiggY18sIHMgKTsKLQotICAgIGEgPSAoRlRfVUludDMyKWFfOwotICAgIGIgPSAoRlRfVUludDMyKWJfOwotICAgIGMgPSAoRlRfVUludDMyKWNfOwotCi0gICAgaWYgKCBjID09IDAgKQotICAgICAgYSA9IDB4N0ZGRkZGRkZVTDsKLQotICAgIGVsc2UgaWYgKCBhICsgYiA8PSAxMjk4OTRVTCAtICggYyA+PiAxNyApICkKLSAgICAgIGEgPSAoIGEgKiBiICsgKCBjID4+IDEgKSApIC8gYzsKLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGVF9JbnQ2NCAgdGVtcCwgdGVtcDI7Ci0KLQotICAgICAgZnRfbXVsdG82NCggYSwgYiwgJnRlbXAgKTsKLQotICAgICAgdGVtcDIuaGkgPSAwOwotICAgICAgdGVtcDIubG8gPSBjID4+IDE7Ci0KLSAgICAgIEZUX0FkZDY0KCAmdGVtcCwgJnRlbXAyLCAmdGVtcCApOwotCi0gICAgICAvKiBsYXN0IGF0dGVtcHQgdG8gZGl0Y2ggbG9uZyBkaXZpc2lvbiAqLwotICAgICAgYSA9IHRlbXAuaGkgPT0gMCA/IHRlbXAubG8gLyBjCi0gICAgICAgICAgICAgICAgICAgICAgIDogZnRfZGl2NjRieTMyKCB0ZW1wLmhpLCB0ZW1wLmxvLCBjICk7Ci0gICAgfQotCi0gICAgYV8gPSAoRlRfTG9uZylhOwotCi0gICAgcmV0dXJuIHMgPCAwID8gLWFfIDogYV87Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9Mb25nICkKLSAgRlRfTXVsRGl2X05vX1JvdW5kKCBGVF9Mb25nICBhXywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICBiXywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICBjXyApCi0gIHsKLSAgICBGVF9JbnQgICAgIHMgPSAxOwotICAgIEZUX1VJbnQzMiAgYSwgYiwgYzsKLQotCi0gICAgLyogWFhYOiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFsbG93IDY0LWJpdCBhcmd1bWVudHMgKi8KLQotICAgIEZUX01PVkVfU0lHTiggYV8sIHMgKTsKLSAgICBGVF9NT1ZFX1NJR04oIGJfLCBzICk7Ci0gICAgRlRfTU9WRV9TSUdOKCBjXywgcyApOwotCi0gICAgYSA9IChGVF9VSW50MzIpYV87Ci0gICAgYiA9IChGVF9VSW50MzIpYl87Ci0gICAgYyA9IChGVF9VSW50MzIpY187Ci0KLSAgICBpZiAoIGMgPT0gMCApCi0gICAgICBhID0gMHg3RkZGRkZGRlVMOwotCi0gICAgZWxzZSBpZiAoIGEgKyBiIDw9IDEzMTA3MVVMICkKLSAgICAgIGEgPSBhICogYiAvIGM7Ci0KLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfSW50NjQgIHRlbXA7Ci0KLQotICAgICAgZnRfbXVsdG82NCggYSwgYiwgJnRlbXAgKTsKLQotICAgICAgLyogbGFzdCBhdHRlbXB0IHRvIGRpdGNoIGxvbmcgZGl2aXNpb24gKi8KLSAgICAgIGEgPSB0ZW1wLmhpID09IDAgPyB0ZW1wLmxvIC8gYwotICAgICAgICAgICAgICAgICAgICAgICA6IGZ0X2RpdjY0YnkzMiggdGVtcC5oaSwgdGVtcC5sbywgYyApOwotICAgIH0KLQotICAgIGFfID0gKEZUX0xvbmcpYTsKLQotICAgIHJldHVybiBzIDwgMCA/IC1hXyA6IGFfOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9Mb25nICkKLSAgRlRfTXVsRml4KCBGVF9Mb25nICBhXywKLSAgICAgICAgICAgICBGVF9Mb25nICBiXyApCi0gIHsKLSNpZmRlZiBGVF9NVUxGSVhfQVNTRU1CTEVSCi0KLSAgICByZXR1cm4gRlRfTVVMRklYX0FTU0VNQkxFUiggYV8sIGJfICk7Ci0KLSNlbGlmIDAKLQotICAgIC8qCi0gICAgICogIFRoaXMgY29kZSBpcyBub25wb3J0YWJsZS4gIFNlZSBjb21tZW50IGJlbG93LgotICAgICAqCi0gICAgICogIEhvd2V2ZXIsIG9uIGEgcGxhdGZvcm0gd2hlcmUgcmlnaHQtc2hpZnQgb2YgYSBzaWduZWQgcXVhbnRpdHkgZmlsbHMKLSAgICAgKiAgdGhlIGxlZnRtb3N0IGJpdHMgYnkgY29weWluZyB0aGUgc2lnbiBiaXQsIGl0IG1pZ2h0IGJlIGZhc3Rlci4KLSAgICAgKi8KLQotICAgIEZUX0xvbmcgICAgc2EsIHNiOwotICAgIEZUX1VJbnQzMiAgYSwgYjsKLQotCi0gICAgLyoKLSAgICAgKiAgVGhpcyBpcyBhIGNsZXZlciB3YXkgb2YgY29udmVydGluZyBhIHNpZ25lZCBudW1iZXIgYGEnIGludG8gaXRzCi0gICAgICogIGFic29sdXRlIHZhbHVlIChzdG9yZWQgYmFjayBpbnRvIGBhJykgYW5kIGl0cyBzaWduLiAgVGhlIHNpZ24gaXMKLSAgICAgKiAgc3RvcmVkIGluIGBzYSc7IDAgbWVhbnMgYGEnIHdhcyBwb3NpdGl2ZSBvciB6ZXJvLCBhbmQgLTEgbWVhbnMgYGEnCi0gICAgICogIHdhcyBuZWdhdGl2ZS4gIChTaW1pbGFybHkgZm9yIGBiJyBhbmQgYHNiJykuCi0gICAgICoKLSAgICAgKiAgVW5mb3J0dW5hdGVseSwgaXQgZG9lc24ndCB3b3JrIChhdCBsZWFzdCBub3QgcG9ydGFibHkpLgotICAgICAqCi0gICAgICogIEl0IG1ha2VzIHRoZSBhc3N1bXB0aW9uIHRoYXQgcmlnaHQtc2hpZnQgb24gYSBuZWdhdGl2ZSBzaWduZWQgdmFsdWUKLSAgICAgKiAgZmlsbHMgdGhlIGxlZnRtb3N0IGJpdHMgYnkgY29weWluZyB0aGUgc2lnbiBiaXQuICBUaGlzIGlzIHdyb25nLgotICAgICAqICBBY2NvcmRpbmcgdG8gSyZSIDJuZCBlZCwgc2VjdGlvbiBgQTcuOCBTaGlmdCBPcGVyYXRvcnMnIG9uIHBhZ2UgMjA2LAotICAgICAqICB0aGUgcmVzdWx0IG9mIHJpZ2h0LXNoaWZ0IG9mIGEgbmVnYXRpdmUgc2lnbmVkIHZhbHVlIGlzCi0gICAgICogIGltcGxlbWVudGF0aW9uLWRlZmluZWQuICBBdCBsZWFzdCBvbmUgaW1wbGVtZW50YXRpb24gZmlsbHMgdGhlCi0gICAgICogIGxlZnRtb3N0IGJpdHMgd2l0aCAwcyAoaS5lLiwgaXQgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBhbiB1bnNpZ25lZAotICAgICAqICByaWdodCBzaGlmdCkuICBUaGlzIG1lYW5zIHRoYXQgd2hlbiBgYScgaXMgbmVnYXRpdmUsIGBzYScgZW5kcyB1cAotICAgICAqICB3aXRoIHRoZSB2YWx1ZSAxIHJhdGhlciB0aGFuIC0xLiAgQWZ0ZXIgdGhhdCwgZXZlcnl0aGluZyBlbHNlIGdvZXMKLSAgICAgKiAgd3JvbmcuCi0gICAgICovCi0gICAgc2EgPSAoIGFfID4+ICggc2l6ZW9mICggYV8gKSAqIDggLSAxICkgKTsKLSAgICBhICA9ICggYV8gXiBzYSApIC0gc2E7Ci0gICAgc2IgPSAoIGJfID4+ICggc2l6ZW9mICggYl8gKSAqIDggLSAxICkgKTsKLSAgICBiICA9ICggYl8gXiBzYiApIC0gc2I7Ci0KLSAgICBhID0gKEZUX1VJbnQzMilhXzsKLSAgICBiID0gKEZUX1VJbnQzMiliXzsKLQotICAgIGlmICggYSArICggYiA+PiA4ICkgPD0gODE5MFVMICkKLSAgICAgIGEgPSAoIGEgKiBiICsgMHg4MDAwVSApID4+IDE2OwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGVF9VSW50MzIgIGFsID0gYSAmIDB4RkZGRlVMOwotCi0KLSAgICAgIGEgPSAoIGEgPj4gMTYgKSAqIGIgKyBhbCAqICggYiA+PiAxNiApICsKLSAgICAgICAgICAoICggYWwgKiAoIGIgJiAweEZGRkZVTCApICsgMHg4MDAwVUwgKSA+PiAxNiApOwotICAgIH0KLQotICAgIHNhIF49IHNiOwotICAgIGEgICA9ICggYSBeIHNhICkgLSBzYTsKLQotICAgIHJldHVybiAoRlRfTG9uZylhOwotCi0jZWxzZSAvKiAwICovCi0KLSAgICBGVF9JbnQgICAgIHMgPSAxOwotICAgIEZUX1VJbnQzMiAgYSwgYjsKLQotCi0gICAgLyogWFhYOiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFsbG93IDY0LWJpdCBhcmd1bWVudHMgKi8KLQotICAgIEZUX01PVkVfU0lHTiggYV8sIHMgKTsKLSAgICBGVF9NT1ZFX1NJR04oIGJfLCBzICk7Ci0KLSAgICBhID0gKEZUX1VJbnQzMilhXzsKLSAgICBiID0gKEZUX1VJbnQzMiliXzsKLQotICAgIGlmICggYSArICggYiA+PiA4ICkgPD0gODE5MFVMICkKLSAgICAgIGEgPSAoIGEgKiBiICsgMHg4MDAwVUwgKSA+PiAxNjsKLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfVUludDMyICBhbCA9IGEgJiAweEZGRkZVTDsKLQotCi0gICAgICBhID0gKCBhID4+IDE2ICkgKiBiICsgYWwgKiAoIGIgPj4gMTYgKSArCi0gICAgICAgICAgKCAoIGFsICogKCBiICYgMHhGRkZGVUwgKSArIDB4ODAwMFVMICkgPj4gMTYgKTsKLSAgICB9Ci0KLSAgICBhXyA9IChGVF9Mb25nKWE7Ci0KLSAgICByZXR1cm4gcyA8IDAgPyAtYV8gOiBhXzsKLQotI2VuZGlmIC8qIDAgKi8KLQotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9Mb25nICkKLSAgRlRfRGl2Rml4KCBGVF9Mb25nICBhXywKLSAgICAgICAgICAgICBGVF9Mb25nICBiXyApCi0gIHsKLSAgICBGVF9JbnQgICAgIHMgPSAxOwotICAgIEZUX1VJbnQzMiAgYSwgYiwgcTsKLSAgICBGVF9Mb25nICAgIHFfOwotCi0KLSAgICAvKiBYWFg6IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWxsb3cgNjQtYml0IGFyZ3VtZW50cyAqLwotCi0gICAgRlRfTU9WRV9TSUdOKCBhXywgcyApOwotICAgIEZUX01PVkVfU0lHTiggYl8sIHMgKTsKLQotICAgIGEgPSAoRlRfVUludDMyKWFfOwotICAgIGIgPSAoRlRfVUludDMyKWJfOwotCi0gICAgaWYgKCBiID09IDAgKQotICAgIHsKLSAgICAgIC8qIGNoZWNrIGZvciBkaXZpc2lvbiBieSAwICovCi0gICAgICBxID0gMHg3RkZGRkZGRlVMOwotICAgIH0KLSAgICBlbHNlIGlmICggYSA8PSA2NTUzNVVMIC0gKCBiID4+IDE3ICkgKQotICAgIHsKLSAgICAgIC8qIGNvbXB1dGUgcmVzdWx0IGRpcmVjdGx5ICovCi0gICAgICBxID0gKCAoIGEgPDwgMTYgKSArICggYiA+PiAxICkgKSAvIGI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiB3ZSBuZWVkIG1vcmUgYml0czsgd2UgaGF2ZSB0byBkbyBpdCBieSBoYW5kICovCi0gICAgICBGVF9JbnQ2NCAgdGVtcCwgdGVtcDI7Ci0KLQotICAgICAgdGVtcC5oaSAgPSBhID4+IDE2OwotICAgICAgdGVtcC5sbyAgPSBhIDw8IDE2OwotICAgICAgdGVtcDIuaGkgPSAwOwotICAgICAgdGVtcDIubG8gPSBiID4+IDE7Ci0KLSAgICAgIEZUX0FkZDY0KCAmdGVtcCwgJnRlbXAyLCAmdGVtcCApOwotICAgICAgcSA9IGZ0X2RpdjY0YnkzMiggdGVtcC5oaSwgdGVtcC5sbywgYiApOwotICAgIH0KLQotICAgIHFfID0gKEZUX0xvbmcpcTsKLQotICAgIHJldHVybiBzIDwgMCA/IC1xXyA6IHFfOwotICB9Ci0KLQotI2VuZGlmIC8qICFGVF9MT05HNjQgKi8KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRnbHlwaC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX01hdHJpeF9NdWx0aXBseSggY29uc3QgRlRfTWF0cml4KiAgYSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9NYXRyaXggICAgICAgICpiICkKLSAgewotICAgIEZUX0ZpeGVkICB4eCwgeHksIHl4LCB5eTsKLQotCi0gICAgaWYgKCAhYSB8fCAhYiApCi0gICAgICByZXR1cm47Ci0KLSAgICB4eCA9IEZUX011bEZpeCggYS0+eHgsIGItPnh4ICkgKyBGVF9NdWxGaXgoIGEtPnh5LCBiLT55eCApOwotICAgIHh5ID0gRlRfTXVsRml4KCBhLT54eCwgYi0+eHkgKSArIEZUX011bEZpeCggYS0+eHksIGItPnl5ICk7Ci0gICAgeXggPSBGVF9NdWxGaXgoIGEtPnl4LCBiLT54eCApICsgRlRfTXVsRml4KCBhLT55eSwgYi0+eXggKTsKLSAgICB5eSA9IEZUX011bEZpeCggYS0+eXgsIGItPnh5ICkgKyBGVF9NdWxGaXgoIGEtPnl5LCBiLT55eSApOwotCi0gICAgYi0+eHggPSB4eDsgIGItPnh5ID0geHk7Ci0gICAgYi0+eXggPSB5eDsgIGItPnl5ID0geXk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRnbHlwaC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9NYXRyaXhfSW52ZXJ0KCBGVF9NYXRyaXgqICBtYXRyaXggKQotICB7Ci0gICAgRlRfUG9zICBkZWx0YSwgeHgsIHl5OwotCi0KLSAgICBpZiAoICFtYXRyaXggKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICAvKiBjb21wdXRlIGRpc2NyaW1pbmFudCAqLwotICAgIGRlbHRhID0gRlRfTXVsRml4KCBtYXRyaXgtPnh4LCBtYXRyaXgtPnl5ICkgLQotICAgICAgICAgICAgRlRfTXVsRml4KCBtYXRyaXgtPnh5LCBtYXRyaXgtPnl4ICk7Ci0KLSAgICBpZiAoICFkZWx0YSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsgIC8qIG1hdHJpeCBjYW4ndCBiZSBpbnZlcnRlZCAqLwotCi0gICAgbWF0cml4LT54eSA9IC0gRlRfRGl2Rml4KCBtYXRyaXgtPnh5LCBkZWx0YSApOwotICAgIG1hdHJpeC0+eXggPSAtIEZUX0RpdkZpeCggbWF0cml4LT55eCwgZGVsdGEgKTsKLQotICAgIHh4ID0gbWF0cml4LT54eDsKLSAgICB5eSA9IG1hdHJpeC0+eXk7Ci0KLSAgICBtYXRyaXgtPnh4ID0gRlRfRGl2Rml4KCB5eSwgZGVsdGEgKTsKLSAgICBtYXRyaXgtPnl5ID0gRlRfRGl2Rml4KCB4eCwgZGVsdGEgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRjYWxjLmggKi8KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX01hdHJpeF9NdWx0aXBseV9TY2FsZWQoIGNvbnN0IEZUX01hdHJpeCogIGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01hdHJpeCAgICAgICAgKmIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICAgIHNjYWxpbmcgKQotICB7Ci0gICAgRlRfRml4ZWQgIHh4LCB4eSwgeXgsIHl5OwotCi0gICAgRlRfTG9uZyAgIHZhbCA9IDB4MTAwMDBMICogc2NhbGluZzsKLQotCi0gICAgaWYgKCAhYSB8fCAhYiApCi0gICAgICByZXR1cm47Ci0KLSAgICB4eCA9IEZUX011bERpdiggYS0+eHgsIGItPnh4LCB2YWwgKSArIEZUX011bERpdiggYS0+eHksIGItPnl4LCB2YWwgKTsKLSAgICB4eSA9IEZUX011bERpdiggYS0+eHgsIGItPnh5LCB2YWwgKSArIEZUX011bERpdiggYS0+eHksIGItPnl5LCB2YWwgKTsKLSAgICB5eCA9IEZUX011bERpdiggYS0+eXgsIGItPnh4LCB2YWwgKSArIEZUX011bERpdiggYS0+eXksIGItPnl4LCB2YWwgKTsKLSAgICB5eSA9IEZUX011bERpdiggYS0+eXgsIGItPnh5LCB2YWwgKSArIEZUX011bERpdiggYS0+eXksIGItPnl5LCB2YWwgKTsKLQotICAgIGItPnh4ID0geHg7ICBiLT54eSA9IHh5OwotICAgIGItPnl4ID0geXg7ICBiLT55eSA9IHl5OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Y2FsYy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9WZWN0b3JfVHJhbnNmb3JtX1NjYWxlZCggRlRfVmVjdG9yKiAgICAgICAgdmVjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfTWF0cml4KiAgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgICAgc2NhbGluZyApCi0gIHsKLSAgICBGVF9Qb3MgICB4eiwgeXo7Ci0KLSAgICBGVF9Mb25nICB2YWwgPSAweDEwMDAwTCAqIHNjYWxpbmc7Ci0KLQotICAgIGlmICggIXZlY3RvciB8fCAhbWF0cml4ICkKLSAgICAgIHJldHVybjsKLQotICAgIHh6ID0gRlRfTXVsRGl2KCB2ZWN0b3ItPngsIG1hdHJpeC0+eHgsIHZhbCApICsKLSAgICAgICAgIEZUX011bERpdiggdmVjdG9yLT55LCBtYXRyaXgtPnh5LCB2YWwgKTsKLQotICAgIHl6ID0gRlRfTXVsRGl2KCB2ZWN0b3ItPngsIG1hdHJpeC0+eXgsIHZhbCApICsKLSAgICAgICAgIEZUX011bERpdiggdmVjdG9yLT55LCBtYXRyaXgtPnl5LCB2YWwgKTsKLQotICAgIHZlY3Rvci0+eCA9IHh6OwotICAgIHZlY3Rvci0+eSA9IHl6OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Y2FsYy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1VJbnQzMiApCi0gIEZUX1ZlY3Rvcl9Ob3JtTGVuKCBGVF9WZWN0b3IqICB2ZWN0b3IgKQotICB7Ci0gICAgRlRfSW50MzIgICB4XyA9IHZlY3Rvci0+eDsKLSAgICBGVF9JbnQzMiAgIHlfID0gdmVjdG9yLT55OwotICAgIEZUX0ludDMyICAgYiwgejsKLSAgICBGVF9VSW50MzIgIHgsIHksIHUsIHYsIGw7Ci0gICAgRlRfSW50ICAgICBzeCA9IDEsIHN5ID0gMSwgc2hpZnQ7Ci0KLQotICAgIEZUX01PVkVfU0lHTiggeF8sIHN4ICk7Ci0gICAgRlRfTU9WRV9TSUdOKCB5Xywgc3kgKTsKLQotICAgIHggPSAoRlRfVUludDMyKXhfOwotICAgIHkgPSAoRlRfVUludDMyKXlfOwotCi0gICAgLyogdHJpdmlhbCBjYXNlcyAqLwotICAgIGlmICggeCA9PSAwICkKLSAgICB7Ci0gICAgICBpZiAoIHkgPiAwICkKLSAgICAgICAgdmVjdG9yLT55ID0gc3kgKiAweDEwMDAwOwotICAgICAgcmV0dXJuIHk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCB5ID09IDAgKQotICAgIHsKLSAgICAgIGlmICggeCA+IDAgKQotICAgICAgICB2ZWN0b3ItPnggPSBzeCAqIDB4MTAwMDA7Ci0gICAgICByZXR1cm4geDsKLSAgICB9Ci0KLSAgICAvKiBFc3RpbWF0ZSBsZW5ndGggYW5kIHByZW5vcm1hbGl6ZSBieSBzaGlmdGluZyBzbyB0aGF0ICovCi0gICAgLyogdGhlIG5ldyBhcHByb3hpbWF0ZSBsZW5ndGggaXMgYmV0d2VlbiAyLzMgYW5kIDQvMy4gICAqLwotICAgIC8qIFRoZSBtYWdpYyBjb25zdGFudCAweEFBQUFBQUFBVUwgKDIvMyBvZiAyXjMyKSBoZWxwcyAgKi8KLSAgICAvKiBhY2hpZXZlIHRoaXMgaW4gMTYuMTYgZml4ZWQtcG9pbnQgcmVwcmVzZW50YXRpb24uICAgICovCi0gICAgbCA9IHggPiB5ID8geCArICggeSA+PiAxICkKLSAgICAgICAgICAgICAgOiB5ICsgKCB4ID4+IDEgKTsKLQotICAgIHNoaWZ0ICA9IDMxIC0gRlRfTVNCKCBsICk7Ci0gICAgc2hpZnQgLT0gMTUgKyAoIGwgPj0gKCAweEFBQUFBQUFBVUwgPj4gc2hpZnQgKSApOwotCi0gICAgaWYgKCBzaGlmdCA+IDAgKQotICAgIHsKLSAgICAgIHggPDw9IHNoaWZ0OwotICAgICAgeSA8PD0gc2hpZnQ7Ci0KLSAgICAgIC8qIHJlLWVzdGltYXRlIGxlbmd0aCBmb3IgdGlueSB2ZWN0b3JzICovCi0gICAgICBsID0geCA+IHkgPyB4ICsgKCB5ID4+IDEgKQotICAgICAgICAgICAgICAgIDogeSArICggeCA+PiAxICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB4ID4+PSAtc2hpZnQ7Ci0gICAgICB5ID4+PSAtc2hpZnQ7Ci0gICAgICBsID4+PSAtc2hpZnQ7Ci0gICAgfQotCi0gICAgLyogbG93ZXIgbGluZWFyIGFwcHJveGltYXRpb24gZm9yIHJlY2lwcm9jYWwgbGVuZ3RoIG1pbnVzIG9uZSAqLwotICAgIGIgPSAweDEwMDAwIC0gKEZUX0ludDMyKWw7Ci0KLSAgICB4XyA9IChGVF9JbnQzMil4OwotICAgIHlfID0gKEZUX0ludDMyKXk7Ci0KLSAgICAvKiBOZXd0b24ncyBpdGVyYXRpb25zICovCi0gICAgZG8KLSAgICB7Ci0gICAgICB1ID0gKEZUX1VJbnQzMikoIHhfICsgKCB4XyAqIGIgPj4gMTYgKSApOwotICAgICAgdiA9IChGVF9VSW50MzIpKCB5XyArICggeV8gKiBiID4+IDE2ICkgKTsKLQotICAgICAgLyogTm9ybWFsaXplZCBzcXVhcmVkIGxlbmd0aCBpbiB0aGUgcGFyZW50aGVzZXMgYXBwcm9hY2hlcyAyXjMyLiAqLwotICAgICAgLyogT24gdHdvJ3MgY29tcGxlbWVudCBzeXN0ZW1zLCBjb252ZXJ0aW5nIHRvIHNpZ25lZCBnaXZlcyB0aGUgICAqLwotICAgICAgLyogZGlmZmVyZW5jZSB3aXRoIDJeMzIgZXZlbiBpZiB0aGUgZXhwcmVzc2lvbiB3cmFwcyBhcm91bmQuICAgICAqLwotICAgICAgeiA9IC0oRlRfSW50MzIpKCB1ICogdSArIHYgKiB2ICkgLyAweDIwMDsKLSAgICAgIHogPSB6ICogKCAoIDB4MTAwMDAgKyBiICkgPj4gOCApIC8gMHgxMDAwMDsKLQotICAgICAgYiArPSB6OwotCi0gICAgfSB3aGlsZSAoIHogPiAwICk7Ci0KLSAgICB2ZWN0b3ItPnggPSBzeCA8IDAgPyAtKEZUX1Bvcyl1IDogKEZUX1Bvcyl1OwotICAgIHZlY3Rvci0+eSA9IHN5IDwgMCA/IC0oRlRfUG9zKXYgOiAoRlRfUG9zKXY7Ci0KLSAgICAvKiBDb252ZXJzaW9uIHRvIHNpZ25lZCBoZWxwcyB0byByZWNvdmVyIGZyb20gbGlrZWx5IHdyYXAgYXJvdW5kICovCi0gICAgLyogaW4gY2FsY3VsYXRpbmcgdGhlIHByZW5vcm1hbGl6ZWQgbGVuZ3RoLCBiZWNhdXNlIGl0IGdpdmVzIHRoZSAqLwotICAgIC8qIGNvcnJlY3QgZGlmZmVyZW5jZSB3aXRoIDJeMzIgb24gdHdvJ3MgY29tcGxlbWVudCBzeXN0ZW1zLiAgICAgKi8KLSAgICBsID0gKEZUX1VJbnQzMikoIDB4MTAwMDAgKyAoRlRfSW50MzIpKCB1ICogeCArIHYgKiB5ICkgLyAweDEwMDAwICk7Ci0gICAgaWYgKCBzaGlmdCA+IDAgKQotICAgICAgbCA9ICggbCArICggMSA8PCAoIHNoaWZ0IC0gMSApICkgKSA+PiBzaGlmdDsKLSAgICBlbHNlCi0gICAgICBsIDw8PSAtc2hpZnQ7Ci0KLSAgICByZXR1cm4gbDsKLSAgfQotCi0KLSNpZiAwCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGNhbGMuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBGVF9JbnQzMiApCi0gIEZUX1NxcnRGaXhlZCggRlRfSW50MzIgIHggKQotICB7Ci0gICAgRlRfVUludDMyICByb290LCByZW1faGksIHJlbV9sbywgdGVzdF9kaXY7Ci0gICAgRlRfSW50ICAgICBjb3VudDsKLQotCi0gICAgcm9vdCA9IDA7Ci0KLSAgICBpZiAoIHggPiAwICkKLSAgICB7Ci0gICAgICByZW1faGkgPSAwOwotICAgICAgcmVtX2xvID0gKEZUX1VJbnQzMil4OwotICAgICAgY291bnQgID0gMjQ7Ci0gICAgICBkbwotICAgICAgewotICAgICAgICByZW1faGkgICA9ICggcmVtX2hpIDw8IDIgKSB8ICggcmVtX2xvID4+IDMwICk7Ci0gICAgICAgIHJlbV9sbyA8PD0gMjsKLSAgICAgICAgcm9vdCAgIDw8PSAxOwotICAgICAgICB0ZXN0X2RpdiA9ICggcm9vdCA8PCAxICkgKyAxOwotCi0gICAgICAgIGlmICggcmVtX2hpID49IHRlc3RfZGl2ICkKLSAgICAgICAgewotICAgICAgICAgIHJlbV9oaSAtPSB0ZXN0X2RpdjsKLSAgICAgICAgICByb290ICAgKz0gMTsKLSAgICAgICAgfQotICAgICAgfSB3aGlsZSAoIC0tY291bnQgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKEZUX0ludDMyKXJvb3Q7Ci0gIH0KLQotI2VuZGlmIC8qIDAgKi8KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRjYWxjLmggKi8KLQotICBGVF9CQVNFX0RFRiggRlRfSW50ICkKLSAgZnRfY29ybmVyX29yaWVudGF0aW9uKCBGVF9Qb3MgIGluX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBpbl95LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgb3V0X3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICBvdXRfeSApCi0gIHsKLSNpZmRlZiBGVF9MT05HNjQKLQotICAgIEZUX0ludDY0ICBkZWx0YSA9IChGVF9JbnQ2NClpbl94ICogb3V0X3kgLSAoRlRfSW50NjQpaW5feSAqIG91dF94OwotCi0KLSAgICByZXR1cm4gKCBkZWx0YSA+IDAgKSAtICggZGVsdGEgPCAwICk7Ci0KLSNlbHNlCi0KLSAgICBGVF9JbnQgIHJlc3VsdDsKLQotCi0gICAgaWYgKCAoRlRfVUxvbmcpRlRfQUJTKCBpbl94ICkgKyAoRlRfVUxvbmcpRlRfQUJTKCBvdXRfeSApIDw9IDEzMTA3MVVMICYmCi0gICAgICAgICAoRlRfVUxvbmcpRlRfQUJTKCBpbl95ICkgKyAoRlRfVUxvbmcpRlRfQUJTKCBvdXRfeCApIDw9IDEzMTA3MVVMICkKLSAgICB7Ci0gICAgICBGVF9Mb25nICB6MSA9IGluX3ggKiBvdXRfeTsKLSAgICAgIEZUX0xvbmcgIHoyID0gaW5feSAqIG91dF94OwotCi0KLSAgICAgIGlmICggejEgPiB6MiApCi0gICAgICAgIHJlc3VsdCA9ICsxOwotICAgICAgZWxzZSBpZiAoIHoxIDwgejIgKQotICAgICAgICByZXN1bHQgPSAtMTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmVzdWx0ID0gMDsKLSAgICB9Ci0gICAgZWxzZSAvKiBwcm9kdWN0cyBtaWdodCBvdmVyZmxvdyAzMiBiaXRzICovCi0gICAgewotICAgICAgRlRfSW50NjQgIHoxLCB6MjsKLQotCi0gICAgICAvKiBYWFg6IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWxsb3cgNjQtYml0IGFyZ3VtZW50cyAqLwotICAgICAgZnRfbXVsdG82NCggKEZUX1VJbnQzMilpbl94LCAoRlRfVUludDMyKW91dF95LCAmejEgKTsKLSAgICAgIGZ0X211bHRvNjQoIChGVF9VSW50MzIpaW5feSwgKEZUX1VJbnQzMilvdXRfeCwgJnoyICk7Ci0KLSAgICAgIGlmICggejEuaGkgPiB6Mi5oaSApCi0gICAgICAgIHJlc3VsdCA9ICsxOwotICAgICAgZWxzZSBpZiAoIHoxLmhpIDwgejIuaGkgKQotICAgICAgICByZXN1bHQgPSAtMTsKLSAgICAgIGVsc2UgaWYgKCB6MS5sbyA+IHoyLmxvICkKLSAgICAgICAgcmVzdWx0ID0gKzE7Ci0gICAgICBlbHNlIGlmICggejEubG8gPCB6Mi5sbyApCi0gICAgICAgIHJlc3VsdCA9IC0xOwotICAgICAgZWxzZQotICAgICAgICByZXN1bHQgPSAwOwotICAgIH0KLQotICAgIC8qIFhYWDogb25seSB0aGUgc2lnbiBvZiByZXR1cm4gdmFsdWUsICsxLzAvLTEgbXVzdCBiZSB1c2VkICovCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotI2VuZGlmCi0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRjYWxjLmggKi8KLQotICBGVF9CQVNFX0RFRiggRlRfSW50ICkKLSAgZnRfY29ybmVyX2lzX2ZsYXQoIEZUX1BvcyAgaW5feCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgaW5feSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgb3V0X3gsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIG91dF95ICkKLSAgewotICAgIEZUX1BvcyAgYXggPSBpbl94ICsgb3V0X3g7Ci0gICAgRlRfUG9zICBheSA9IGluX3kgKyBvdXRfeTsKLQotICAgIEZUX1BvcyAgZF9pbiwgZF9vdXQsIGRfaHlwb3Q7Ci0KLQotICAgIC8qIFRoZSBpZGVhIG9mIHRoaXMgZnVuY3Rpb24gaXMgdG8gY29tcGFyZSB0aGUgbGVuZ3RoIG9mIHRoZSAqLwotICAgIC8qIGh5cG90ZW51c2Ugd2l0aCB0aGUgYGluJyBhbmQgYG91dCcgbGVuZ3RoLiAgVGhlIGBjb3JuZXInICAqLwotICAgIC8qIHJlcHJlc2VudGVkIGJ5IGBpbicgYW5kIGBvdXQnIGlzIGZsYXQgaWYgdGhlIGh5cG90ZW51c2UncyAqLwotICAgIC8qIGxlbmd0aCBpc24ndCB0b28gbGFyZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFRoaXMgYXBwcm9hY2ggaGFzIHRoZSBhZHZhbnRhZ2UgdGhhdCB0aGUgYW5nbGUgYmV0d2VlbiAgICAqLwotICAgIC8qIGBpbicgYW5kIGBvdXQnIGlzIG5vdCBjaGVja2VkLiAgSW4gY2FzZSBvbmUgb2YgdGhlIHR3byAgICAqLwotICAgIC8qIHZlY3RvcnMgaXMgYGRvbWluYW50JywgdGhpcyBpcywgbXVjaCBsYXJnZXIgdGhhbiB0aGUgICAgICAqLwotICAgIC8qIG90aGVyIHZlY3Rvciwgd2UgdGh1cyBhbHdheXMgaGF2ZSBhIGZsYXQgY29ybmVyLiAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgIGh5cG90ZW51c2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgIHgtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS14ICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICBcICAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgXCAgICAgICAgICAgICAgICAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgaW4gIFwgICAgICAgICAgLyAgb3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICBcICAgIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICBQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgZF9pbiAgICA9IEZUX0hZUE9UKCAgaW5feCwgIGluX3kgKTsKLSAgICBkX291dCAgID0gRlRfSFlQT1QoIG91dF94LCBvdXRfeSApOwotICAgIGRfaHlwb3QgPSBGVF9IWVBPVCggICAgYXgsICAgIGF5ICk7Ci0KLSAgICAvKiBub3cgZG8gYSBzaW1wbGUgbGVuZ3RoIGNvbXBhcmlzb246ICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgZF9pbiArIGRfb3V0IDwgMTcvMTYgZF9oeXBvdCAgICAgKi8KLQotICAgIHJldHVybiAoIGRfaW4gKyBkX291dCAtIGRfaHlwb3QgKSA8ICggZF9oeXBvdCA+PiA0ICk7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0Y2lkLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGNpZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzM0ODgxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0Y2lkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRjaWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgYWNjZXNzaW5nIENJRCBmb250IGluZm9ybWF0aW9uLiAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEZXJlayBDbGVnZyBhbmQgTWljaGFlbCBUb2Z0ZGFsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NJRF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfQ0lEX0gKLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRjaWQuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0NJRF9SZWdpc3RyeV9PcmRlcmluZ19TdXBwbGVtZW50KCBGVF9GYWNlICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICpyZWdpc3RyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgKm9yZGVyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAqc3VwcGxlbWVudCkKLSAgewotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICBjb25zdCBjaGFyKiAgciA9IE5VTEw7Ci0gICAgY29uc3QgY2hhciogIG8gPSBOVUxMOwotICAgIEZUX0ludCAgICAgICBzID0gMDsKLQotCi0gICAgZXJyb3IgPSBGVF9FUlIoIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGlmICggZmFjZSApCi0gICAgewotICAgICAgRlRfU2VydmljZV9DSUQgIHNlcnZpY2U7Ci0KLQotICAgICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHNlcnZpY2UsIENJRCApOwotCi0gICAgICBpZiAoIHNlcnZpY2UgJiYgc2VydmljZS0+Z2V0X3JvcyApCi0gICAgICAgIGVycm9yID0gc2VydmljZS0+Z2V0X3JvcyggZmFjZSwgJnIsICZvLCAmcyApOwotICAgIH0KLQotICAgIGlmICggcmVnaXN0cnkgKQotICAgICAgKnJlZ2lzdHJ5ID0gcjsKLQotICAgIGlmICggb3JkZXJpbmcgKQotICAgICAgKm9yZGVyaW5nID0gbzsKLQotICAgIGlmICggc3VwcGxlbWVudCApCi0gICAgICAqc3VwcGxlbWVudCA9IHM7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0NJRF9Jc19JbnRlcm5hbGx5X0NJRF9LZXllZCggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICppc19jaWQgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgRlRfQm9vbCAgIGljID0gMDsKLQotCi0gICAgaWYgKCBmYWNlICkKLSAgICB7Ci0gICAgICBGVF9TZXJ2aWNlX0NJRCAgc2VydmljZTsKLQotCi0gICAgICBGVF9GQUNFX0ZJTkRfU0VSVklDRSggZmFjZSwgc2VydmljZSwgQ0lEICk7Ci0KLSAgICAgIGlmICggc2VydmljZSAmJiBzZXJ2aWNlLT5nZXRfaXNfY2lkICkKLSAgICAgICAgZXJyb3IgPSBzZXJ2aWNlLT5nZXRfaXNfY2lkKCBmYWNlLCAmaWMpOwotICAgIH0KLQotICAgIGlmICggaXNfY2lkICkKLSAgICAgICppc19jaWQgPSBpYzsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRfQ0lEX0Zyb21fR2x5cGhfSW5kZXgoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAqY2lkICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0VSUiggSW52YWxpZF9Bcmd1bWVudCApOwotICAgIEZUX1VJbnQgICBjID0gMDsKLQotCi0gICAgaWYgKCBmYWNlICkKLSAgICB7Ci0gICAgICBGVF9TZXJ2aWNlX0NJRCAgc2VydmljZTsKLQotCi0gICAgICBGVF9GQUNFX0ZJTkRfU0VSVklDRSggZmFjZSwgc2VydmljZSwgQ0lEICk7Ci0KLSAgICAgIGlmICggc2VydmljZSAmJiBzZXJ2aWNlLT5nZXRfY2lkX2Zyb21fZ2x5cGhfaW5kZXggKQotICAgICAgICBlcnJvciA9IHNlcnZpY2UtPmdldF9jaWRfZnJvbV9nbHlwaF9pbmRleCggZmFjZSwgZ2x5cGhfaW5kZXgsICZjKTsKLSAgICB9Ci0KLSAgICBpZiAoIGNpZCApCi0gICAgICAqY2lkID0gYzsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRkYmdtZW0uYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0ZGJnbWVtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmMjAzMTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRkYmdtZW0uYworKysgL2Rldi9udWxsCkBAIC0xLDk5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGRiZ21lbS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgTWVtb3J5IGRlYnVnZ2VyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9NRU1PUllfSAotI2luY2x1ZGUgRlRfU1lTVEVNX0gKLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0jaW5jbHVkZSBGVF9UWVBFU19ICi0KLQotI2lmZGVmIEZUX0RFQlVHX01FTU9SWQotCi0jZGVmaW5lICBLRUVQQUxJVkUgLyogYEtlZXAgYWxpdmUnIG1lYW5zIHRoYXQgZnJlZWQgYmxvY2tzIGFyZW4ndCByZWxlYXNlZAotICAgICAgICAgICAgICAgICAgICAqIHRvIHRoZSBoZWFwLiAgVGhpcyBpcyB1c2VmdWwgdG8gZGV0ZWN0IGRvdWJsZS1mcmVlcwotICAgICAgICAgICAgICAgICAgICAqIG9yIHdlaXJkIGhlYXAgY29ycnVwdGlvbiwgYnV0IGl0IHVzZXMgbGFyZ2UgYW1vdW50cyBvZgotICAgICAgICAgICAgICAgICAgICAqIG1lbW9yeSwgaG93ZXZlci4KLSAgICAgICAgICAgICAgICAgICAgKi8KLQotI2luY2x1ZGUgRlRfQ09ORklHX1NUQU5EQVJEX0xJQlJBUllfSAotCi0gIEZUX0JBU0VfREVGKCBjb25zdCBjaGFyKiApICBfZnRfZGVidWdfZmlsZSAgID0gTlVMTDsKLSAgRlRfQkFTRV9ERUYoIGxvbmcgKSAgICAgICAgIF9mdF9kZWJ1Z19saW5lbm8gPSAwOwotCi0gIGV4dGVybiB2b2lkCi0gIEZUX0R1bXBNZW1vcnkoIEZUX01lbW9yeSAgbWVtb3J5ICk7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCBGVF9NZW1Tb3VyY2VSZWNfKiAgRlRfTWVtU291cmNlOwotICB0eXBlZGVmIHN0cnVjdCBGVF9NZW1Ob2RlUmVjXyogICAgRlRfTWVtTm9kZTsKLSAgdHlwZWRlZiBzdHJ1Y3QgRlRfTWVtVGFibGVSZWNfKiAgIEZUX01lbVRhYmxlOwotCi0KLSNkZWZpbmUgRlRfTUVNX1ZBTCggYWRkciApICAoIChGVF9QdHJEaXN0KShGVF9Qb2ludGVyKSggYWRkciApICkKLQotICAvKgotICAgKiAgVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgc3RhdGlzdGljcyBmb3IgYSBzaW5nbGUgYWxsb2NhdGlvbi9yZWxlYXNlCi0gICAqICBzaXRlLiAgVGhpcyBpcyB1c2VmdWwgdG8ga25vdyB3aGVyZSBtZW1vcnkgb3BlcmF0aW9ucyBoYXBwZW4gdGhlCi0gICAqICBtb3N0LgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX01lbVNvdXJjZVJlY18KLSAgewotICAgIGNvbnN0IGNoYXIqICAgZmlsZV9uYW1lOwotICAgIGxvbmcgICAgICAgICAgbGluZV9ubzsKLQotICAgIEZUX0xvbmcgICAgICAgY3VyX2Jsb2NrczsgICAvKiBjdXJyZW50IG51bWJlciBvZiBhbGxvY2F0ZWQgYmxvY2tzICovCi0gICAgRlRfTG9uZyAgICAgICBtYXhfYmxvY2tzOyAgIC8qIG1heC4gbnVtYmVyIG9mIGFsbG9jYXRlZCBibG9ja3MgICAgKi8KLSAgICBGVF9Mb25nICAgICAgIGFsbF9ibG9ja3M7ICAgLyogdG90YWwgbnVtYmVyIG9mIGJsb2NrcyBhbGxvY2F0ZWQgICAqLwotCi0gICAgRlRfTG9uZyAgICAgICBjdXJfc2l6ZTsgICAgIC8qIGN1cnJlbnQgY3VtdWxhdGl2ZSBhbGxvY2F0ZWQgc2l6ZSAqLwotICAgIEZUX0xvbmcgICAgICAgbWF4X3NpemU7ICAgICAvKiBtYXhpbXVtIGN1bXVsYXRpdmUgYWxsb2NhdGVkIHNpemUgKi8KLSAgICBGVF9Mb25nICAgICAgIGFsbF9zaXplOyAgICAgLyogdG90YWwgY3VtdWxhdGl2ZSBhbGxvY2F0ZWQgc2l6ZSAgICovCi0KLSAgICBGVF9Mb25nICAgICAgIGN1cl9tYXg7ICAgICAgLyogY3VycmVudCBtYXhpbXVtIGFsbG9jYXRlZCBzaXplICovCi0KLSAgICBGVF9VSW50MzIgICAgIGhhc2g7Ci0gICAgRlRfTWVtU291cmNlICBsaW5rOwotCi0gIH0gRlRfTWVtU291cmNlUmVjOwotCi0KLSAgLyoKLSAgICogIFdlIGRvbid0IG5lZWQgYSByZXNpemFibGUgYXJyYXkgZm9yIHRoZSBtZW1vcnkgc291cmNlcyBiZWNhdXNlCi0gICAqICB0aGVpciBudW1iZXIgaXMgcHJldHR5IGxpbWl0ZWQgd2l0aGluIEZyZWVUeXBlLgotICAgKi8KLSNkZWZpbmUgRlRfTUVNX1NPVVJDRV9CVUNLRVRTICAxMjgKLQotICAvKgotICAgKiAgVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBhIHNpbmdsZSBhbGxvY2F0ZWQKLSAgICogIG1lbW9yeSBibG9jay4gIElmIEtFRVBBTElWRSBpcyBkZWZpbmVkLCBibG9ja3MgdGhhdCBhcmUgZnJlZWQgYnkKLSAgICogIEZyZWVUeXBlIGFyZSBuZXZlciByZWxlYXNlZCB0byB0aGUgc3lzdGVtLiAgSW5zdGVhZCwgdGhlaXIgYHNpemUnCi0gICAqICBmaWVsZCBpcyBzZXQgdG8gYC1zaXplJy4gIFRoaXMgaXMgbWFpbmx5IHVzZWZ1bCB0byBkZXRlY3QgZG91YmxlCi0gICAqICBmcmVlcywgYXQgdGhlIHByaWNlIG9mIGEgbGFyZ2UgbWVtb3J5IGZvb3RwcmludCBkdXJpbmcgZXhlY3V0aW9uLgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX01lbU5vZGVSZWNfCi0gIHsKLSAgICBGVF9CeXRlKiAgICAgIGFkZHJlc3M7Ci0gICAgRlRfTG9uZyAgICAgICBzaXplOyAgICAgLyogPCAwIGlmIHRoZSBibG9jayB3YXMgZnJlZWQgKi8KLQotICAgIEZUX01lbVNvdXJjZSAgc291cmNlOwotCi0jaWZkZWYgS0VFUEFMSVZFCi0gICAgY29uc3QgY2hhciogICBmcmVlX2ZpbGVfbmFtZTsKLSAgICBGVF9Mb25nICAgICAgIGZyZWVfbGluZV9ubzsKLSNlbmRpZgotCi0gICAgRlRfTWVtTm9kZSAgICBsaW5rOwotCi0gIH0gRlRfTWVtTm9kZVJlYzsKLQotCi0gIC8qCi0gICAqICBUaGUgZ2xvYmFsIHN0cnVjdHVyZSwgY29udGFpbmluZyBjb21wb3VuZCBzdGF0aXN0aWNzIGFuZCBhbGwgaGFzaAotICAgKiAgdGFibGVzLgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX01lbVRhYmxlUmVjXwotICB7Ci0gICAgRlRfTG9uZyAgICAgICAgICBzaXplOwotICAgIEZUX0xvbmcgICAgICAgICAgbm9kZXM7Ci0gICAgRlRfTWVtTm9kZSogICAgICBidWNrZXRzOwotCi0gICAgRlRfTG9uZyAgICAgICAgICBhbGxvY190b3RhbDsKLSAgICBGVF9Mb25nICAgICAgICAgIGFsbG9jX2N1cnJlbnQ7Ci0gICAgRlRfTG9uZyAgICAgICAgICBhbGxvY19tYXg7Ci0gICAgRlRfTG9uZyAgICAgICAgICBhbGxvY19jb3VudDsKLQotICAgIEZUX0Jvb2wgICAgICAgICAgYm91bmRfdG90YWw7Ci0gICAgRlRfTG9uZyAgICAgICAgICBhbGxvY190b3RhbF9tYXg7Ci0KLSAgICBGVF9Cb29sICAgICAgICAgIGJvdW5kX2NvdW50OwotICAgIEZUX0xvbmcgICAgICAgICAgYWxsb2NfY291bnRfbWF4OwotCi0gICAgRlRfTWVtU291cmNlICAgICBzb3VyY2VzW0ZUX01FTV9TT1VSQ0VfQlVDS0VUU107Ci0KLSAgICBGVF9Cb29sICAgICAgICAgIGtlZXBfYWxpdmU7Ci0KLSAgICBGVF9NZW1vcnkgICAgICAgIG1lbW9yeTsKLSAgICBGVF9Qb2ludGVyICAgICAgIG1lbW9yeV91c2VyOwotICAgIEZUX0FsbG9jX0Z1bmMgICAgYWxsb2M7Ci0gICAgRlRfRnJlZV9GdW5jICAgICBmcmVlOwotICAgIEZUX1JlYWxsb2NfRnVuYyAgcmVhbGxvYzsKLQotICB9IEZUX01lbVRhYmxlUmVjOwotCi0KLSNkZWZpbmUgRlRfTUVNX1NJWkVfTUlOICA3Ci0jZGVmaW5lIEZUX01FTV9TSVpFX01BWCAgMTM4NDUxNjMKLQotI2RlZmluZSBGVF9GSUxFTkFNRSggeCApICAoICh4KSA/ICh4KSA6ICJ1bmtub3duIGZpbGUiICkKLQotCi0gIC8qCi0gICAqICBQcmltZSBudW1iZXJzIGFyZSB1Z2x5IHRvIGhhbmRsZS4gIEl0IHdvdWxkIGJlIGJldHRlciB0byBpbXBsZW1lbnQKLSAgICogIEwtSGFzaGluZywgd2hpY2ggaXMgMTAlIGZhc3RlciBhbmQgZG9lc24ndCByZXF1aXJlIGRpdmlzaW9ucy4KLSAgICovCi0gIHN0YXRpYyBjb25zdCBGVF9JbnQgIGZ0X21lbV9wcmltZXNbXSA9Ci0gIHsKLSAgICA3LAotICAgIDExLAotICAgIDE5LAotICAgIDM3LAotICAgIDczLAotICAgIDEwOSwKLSAgICAxNjMsCi0gICAgMjUxLAotICAgIDM2NywKLSAgICA1NTcsCi0gICAgODIzLAotICAgIDEyMzcsCi0gICAgMTg2MSwKLSAgICAyNzc3LAotICAgIDQxNzcsCi0gICAgNjI0NywKLSAgICA5MzcxLAotICAgIDE0MDU3LAotICAgIDIxMDg5LAotICAgIDMxNjI3LAotICAgIDQ3NDMxLAotICAgIDcxMTQzLAotICAgIDEwNjcyMSwKLSAgICAxNjAwNzMsCi0gICAgMjQwMTAxLAotICAgIDM2MDE2MywKLSAgICA1NDAyMTcsCi0gICAgODEwMzQzLAotICAgIDEyMTU0OTcsCi0gICAgMTgyMzIzMSwKLSAgICAyNzM0ODY3LAotICAgIDQxMDIyODMsCi0gICAgNjE1MzQwOSwKLSAgICA5MjMwMTEzLAotICAgIDEzODQ1MTYzLAotICB9OwotCi0KLSAgc3RhdGljIEZUX0xvbmcKLSAgZnRfbWVtX2Nsb3Nlc3RfcHJpbWUoIEZUX0xvbmcgIG51bSApCi0gIHsKLSAgICBzaXplX3QgIGk7Ci0KLQotICAgIGZvciAoIGkgPSAwOwotICAgICAgICAgIGkgPCBzaXplb2YgKCBmdF9tZW1fcHJpbWVzICkgLyBzaXplb2YgKCBmdF9tZW1fcHJpbWVzWzBdICk7IGkrKyApCi0gICAgICBpZiAoIGZ0X21lbV9wcmltZXNbaV0gPiBudW0gKQotICAgICAgICByZXR1cm4gZnRfbWVtX3ByaW1lc1tpXTsKLQotICAgIHJldHVybiBGVF9NRU1fU0laRV9NQVg7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X21lbV9kZWJ1Z19wYW5pYyggY29uc3QgY2hhciogIGZtdCwKLSAgICAgICAgICAgICAgICAgICAgICAuLi4gKQotICB7Ci0gICAgdmFfbGlzdCAgYXA7Ci0KLQotICAgIHByaW50ZiggIkZyZWVUeXBlLkRlYnVnOiAiICk7Ci0KLSAgICB2YV9zdGFydCggYXAsIGZtdCApOwotICAgIHZwcmludGYoIGZtdCwgYXAgKTsKLSAgICB2YV9lbmQoIGFwICk7Ci0KLSAgICBwcmludGYoICJcbiIgKTsKLSAgICBleGl0KCBFWElUX0ZBSUxVUkUgKTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1BvaW50ZXIKLSAgZnRfbWVtX3RhYmxlX2FsbG9jKCBGVF9NZW1UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgIHNpemUgKQotICB7Ci0gICAgRlRfTWVtb3J5ICAgbWVtb3J5ID0gdGFibGUtPm1lbW9yeTsKLSAgICBGVF9Qb2ludGVyICBibG9jazsKLQotCi0gICAgbWVtb3J5LT51c2VyID0gdGFibGUtPm1lbW9yeV91c2VyOwotICAgIGJsb2NrID0gdGFibGUtPmFsbG9jKCBtZW1vcnksIHNpemUgKTsKLSAgICBtZW1vcnktPnVzZXIgPSB0YWJsZTsKLQotICAgIHJldHVybiBibG9jazsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfbWVtX3RhYmxlX2ZyZWUoIEZUX01lbVRhYmxlICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICBibG9jayApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHRhYmxlLT5tZW1vcnk7Ci0KLQotICAgIG1lbW9yeS0+dXNlciA9IHRhYmxlLT5tZW1vcnlfdXNlcjsKLSAgICB0YWJsZS0+ZnJlZSggbWVtb3J5LCBibG9jayApOwotICAgIG1lbW9yeS0+dXNlciA9IHRhYmxlOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9tZW1fdGFibGVfcmVzaXplKCBGVF9NZW1UYWJsZSAgdGFibGUgKQotICB7Ci0gICAgRlRfTG9uZyAgbmV3X3NpemU7Ci0KLQotICAgIG5ld19zaXplID0gZnRfbWVtX2Nsb3Nlc3RfcHJpbWUoIHRhYmxlLT5ub2RlcyApOwotICAgIGlmICggbmV3X3NpemUgIT0gdGFibGUtPnNpemUgKQotICAgIHsKLSAgICAgIEZUX01lbU5vZGUqICBuZXdfYnVja2V0czsKLSAgICAgIEZUX0xvbmcgICAgICBpOwotCi0KLSAgICAgIG5ld19idWNrZXRzID0gKEZUX01lbU5vZGUgKikKLSAgICAgICAgICAgICAgICAgICAgICBmdF9tZW1fdGFibGVfYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld19zaXplICogKEZUX0xvbmcpc2l6ZW9mICggRlRfTWVtTm9kZSApICk7Ci0gICAgICBpZiAoIG5ld19idWNrZXRzID09IE5VTEwgKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIEZUX0FSUkFZX1pFUk8oIG5ld19idWNrZXRzLCBuZXdfc2l6ZSApOwotCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IHRhYmxlLT5zaXplOyBpKysgKQotICAgICAgewotICAgICAgICBGVF9NZW1Ob2RlICBub2RlLCBuZXh0LCAqcG5vZGU7Ci0gICAgICAgIEZUX1B0ckRpc3QgIGhhc2g7Ci0KLQotICAgICAgICBub2RlID0gdGFibGUtPmJ1Y2tldHNbaV07Ci0gICAgICAgIHdoaWxlICggbm9kZSApCi0gICAgICAgIHsKLSAgICAgICAgICBuZXh0ICA9IG5vZGUtPmxpbms7Ci0gICAgICAgICAgaGFzaCAgPSBGVF9NRU1fVkFMKCBub2RlLT5hZGRyZXNzICkgJSAoRlRfUHRyRGlzdCluZXdfc2l6ZTsKLSAgICAgICAgICBwbm9kZSA9IG5ld19idWNrZXRzICsgaGFzaDsKLQotICAgICAgICAgIG5vZGUtPmxpbmsgPSBwbm9kZVswXTsKLSAgICAgICAgICBwbm9kZVswXSAgID0gbm9kZTsKLQotICAgICAgICAgIG5vZGUgPSBuZXh0OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggdGFibGUtPmJ1Y2tldHMgKQotICAgICAgICBmdF9tZW1fdGFibGVfZnJlZSggdGFibGUsIHRhYmxlLT5idWNrZXRzICk7Ci0KLSAgICAgIHRhYmxlLT5idWNrZXRzID0gbmV3X2J1Y2tldHM7Ci0gICAgICB0YWJsZS0+c2l6ZSAgICA9IG5ld19zaXplOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIEZUX01lbVRhYmxlCi0gIGZ0X21lbV90YWJsZV9uZXcoIEZUX01lbW9yeSAgbWVtb3J5ICkKLSAgewotICAgIEZUX01lbVRhYmxlICB0YWJsZTsKLQotCi0gICAgdGFibGUgPSAoRlRfTWVtVGFibGUpbWVtb3J5LT5hbGxvYyggbWVtb3J5LCBzaXplb2YgKCAqdGFibGUgKSApOwotICAgIGlmICggdGFibGUgPT0gTlVMTCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBGVF9aRVJPKCB0YWJsZSApOwotCi0gICAgdGFibGUtPnNpemUgID0gRlRfTUVNX1NJWkVfTUlOOwotICAgIHRhYmxlLT5ub2RlcyA9IDA7Ci0KLSAgICB0YWJsZS0+bWVtb3J5ID0gbWVtb3J5OwotCi0gICAgdGFibGUtPm1lbW9yeV91c2VyID0gbWVtb3J5LT51c2VyOwotCi0gICAgdGFibGUtPmFsbG9jICAgPSBtZW1vcnktPmFsbG9jOwotICAgIHRhYmxlLT5yZWFsbG9jID0gbWVtb3J5LT5yZWFsbG9jOwotICAgIHRhYmxlLT5mcmVlICAgID0gbWVtb3J5LT5mcmVlOwotCi0gICAgdGFibGUtPmJ1Y2tldHMgPSAoRlRfTWVtTm9kZSAqKQotICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnktPmFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS0+c2l6ZSAqIChGVF9Mb25nKXNpemVvZiAoIEZUX01lbU5vZGUgKSApOwotICAgIGlmICggdGFibGUtPmJ1Y2tldHMgKQotICAgICAgRlRfQVJSQVlfWkVSTyggdGFibGUtPmJ1Y2tldHMsIHRhYmxlLT5zaXplICk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG1lbW9yeS0+ZnJlZSggbWVtb3J5LCB0YWJsZSApOwotICAgICAgdGFibGUgPSBOVUxMOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiB0YWJsZTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfbWVtX3RhYmxlX2Rlc3Ryb3koIEZUX01lbVRhYmxlICB0YWJsZSApCi0gIHsKLSAgICBGVF9Mb25nICBpOwotICAgIEZUX0xvbmcgIGxlYWtfY291bnQgPSAwOwotICAgIEZUX0xvbmcgIGxlYWtzICAgICAgPSAwOwotCi0KLSAgICBGVF9EdW1wTWVtb3J5KCB0YWJsZS0+bWVtb3J5ICk7Ci0KLSAgICAvKiByZW1vdmUgYWxsIGJsb2NrcyBmcm9tIHRoZSB0YWJsZSwgcmV2ZWFsaW5nIGxlYWtlZCBvbmVzICovCi0gICAgZm9yICggaSA9IDA7IGkgPCB0YWJsZS0+c2l6ZTsgaSsrICkKLSAgICB7Ci0gICAgICBGVF9NZW1Ob2RlICAqcG5vZGUgPSB0YWJsZS0+YnVja2V0cyArIGksIG5leHQsIG5vZGUgPSAqcG5vZGU7Ci0KLQotICAgICAgd2hpbGUgKCBub2RlICkKLSAgICAgIHsKLSAgICAgICAgbmV4dCAgICAgICA9IG5vZGUtPmxpbms7Ci0gICAgICAgIG5vZGUtPmxpbmsgPSBOVUxMOwotCi0gICAgICAgIGlmICggbm9kZS0+c2l6ZSA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgcHJpbnRmKAotICAgICAgICAgICAgImxlYWtlZCBtZW1vcnkgYmxvY2sgYXQgYWRkcmVzcyAlcCwgc2l6ZSAlOGxkIGluICglczolbGQpXG4iLAotICAgICAgICAgICAgbm9kZS0+YWRkcmVzcywgbm9kZS0+c2l6ZSwKLSAgICAgICAgICAgIEZUX0ZJTEVOQU1FKCBub2RlLT5zb3VyY2UtPmZpbGVfbmFtZSApLAotICAgICAgICAgICAgbm9kZS0+c291cmNlLT5saW5lX25vICk7Ci0KLSAgICAgICAgICBsZWFrX2NvdW50Kys7Ci0gICAgICAgICAgbGVha3MgKz0gbm9kZS0+c2l6ZTsKLQotICAgICAgICAgIGZ0X21lbV90YWJsZV9mcmVlKCB0YWJsZSwgbm9kZS0+YWRkcmVzcyApOwotICAgICAgICB9Ci0KLSAgICAgICAgbm9kZS0+YWRkcmVzcyA9IE5VTEw7Ci0gICAgICAgIG5vZGUtPnNpemUgICAgPSAwOwotCi0gICAgICAgIGZ0X21lbV90YWJsZV9mcmVlKCB0YWJsZSwgbm9kZSApOwotICAgICAgICBub2RlID0gbmV4dDsKLSAgICAgIH0KLSAgICAgIHRhYmxlLT5idWNrZXRzW2ldID0gTlVMTDsKLSAgICB9Ci0KLSAgICBmdF9tZW1fdGFibGVfZnJlZSggdGFibGUsIHRhYmxlLT5idWNrZXRzICk7Ci0gICAgdGFibGUtPmJ1Y2tldHMgPSBOVUxMOwotCi0gICAgdGFibGUtPnNpemUgID0gMDsKLSAgICB0YWJsZS0+bm9kZXMgPSAwOwotCi0gICAgLyogcmVtb3ZlIGFsbCBzb3VyY2VzICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBGVF9NRU1fU09VUkNFX0JVQ0tFVFM7IGkrKyApCi0gICAgewotICAgICAgRlRfTWVtU291cmNlICBzb3VyY2UsIG5leHQ7Ci0KLQotICAgICAgZm9yICggc291cmNlID0gdGFibGUtPnNvdXJjZXNbaV07IHNvdXJjZSAhPSBOVUxMOyBzb3VyY2UgPSBuZXh0ICkKLSAgICAgIHsKLSAgICAgICAgbmV4dCA9IHNvdXJjZS0+bGluazsKLSAgICAgICAgZnRfbWVtX3RhYmxlX2ZyZWUoIHRhYmxlLCBzb3VyY2UgKTsKLSAgICAgIH0KLQotICAgICAgdGFibGUtPnNvdXJjZXNbaV0gPSBOVUxMOwotICAgIH0KLQotICAgIHByaW50ZiggIkZyZWVUeXBlOiB0b3RhbCBtZW1vcnkgYWxsb2NhdGlvbnMgPSAlbGRcbiIsCi0gICAgICAgICAgICB0YWJsZS0+YWxsb2NfdG90YWwgKTsKLSAgICBwcmludGYoICJGcmVlVHlwZTogbWF4aW11bSBtZW1vcnkgZm9vdHByaW50ID0gJWxkXG4iLAotICAgICAgICAgICAgdGFibGUtPmFsbG9jX21heCApOwotCi0gICAgZnRfbWVtX3RhYmxlX2ZyZWUoIHRhYmxlLCB0YWJsZSApOwotCi0gICAgaWYgKCBsZWFrX2NvdW50ID4gMCApCi0gICAgICBmdF9tZW1fZGVidWdfcGFuaWMoCi0gICAgICAgICJGcmVlVHlwZTogJWxkIGJ5dGVzIG9mIG1lbW9yeSBsZWFrZWQgaW4gJWxkIGJsb2Nrc1xuIiwKLSAgICAgICAgbGVha3MsIGxlYWtfY291bnQgKTsKLQotICAgIHByaW50ZiggIkZyZWVUeXBlOiBubyBtZW1vcnkgbGVha3MgZGV0ZWN0ZWRcbiIgKTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX01lbU5vZGUqCi0gIGZ0X21lbV90YWJsZV9nZXRfbm9kZXAoIEZUX01lbVRhYmxlICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgIGFkZHJlc3MgKQotICB7Ci0gICAgRlRfUHRyRGlzdCAgIGhhc2g7Ci0gICAgRlRfTWVtTm9kZSAgKnBub2RlLCBub2RlOwotCi0KLSAgICBoYXNoICA9IEZUX01FTV9WQUwoIGFkZHJlc3MgKTsKLSAgICBwbm9kZSA9IHRhYmxlLT5idWNrZXRzICsgKCBoYXNoICUgKEZUX1B0ckRpc3QpdGFibGUtPnNpemUgKTsKLQotICAgIGZvciAoOzspCi0gICAgewotICAgICAgbm9kZSA9IHBub2RlWzBdOwotICAgICAgaWYgKCAhbm9kZSApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBpZiAoIG5vZGUtPmFkZHJlc3MgPT0gYWRkcmVzcyApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBwbm9kZSA9ICZub2RlLT5saW5rOwotICAgIH0KLSAgICByZXR1cm4gcG5vZGU7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9NZW1Tb3VyY2UKLSAgZnRfbWVtX3RhYmxlX2dldF9zb3VyY2UoIEZUX01lbVRhYmxlICB0YWJsZSApCi0gIHsKLSAgICBGVF9VSW50MzIgICAgIGhhc2g7Ci0gICAgRlRfTWVtU291cmNlICBub2RlLCAqcG5vZGU7Ci0KLQotICAgIC8qIGNhc3QgdG8gRlRfUHRyRGlzdCBmaXJzdCBzaW5jZSB2b2lkKiBjYW4gYmUgbGFyZ2VyICovCi0gICAgLyogdGhhbiBGVF9VSW50MzIgYW5kIEdDQyA0LjEuMSBlbWl0cyBhIHdhcm5pbmcgICAgICAgKi8KLSAgICBoYXNoICA9IChGVF9VSW50MzIpKEZUX1B0ckRpc3QpKHZvaWQqKV9mdF9kZWJ1Z19maWxlICsKLSAgICAgICAgICAgICAgKEZUX1VJbnQzMikoIDUgKiBfZnRfZGVidWdfbGluZW5vICk7Ci0gICAgcG5vZGUgPSAmdGFibGUtPnNvdXJjZXNbaGFzaCAlIEZUX01FTV9TT1VSQ0VfQlVDS0VUU107Ci0KLSAgICBmb3IgKCA7OyApCi0gICAgewotICAgICAgbm9kZSA9ICpwbm9kZTsKLSAgICAgIGlmICggbm9kZSA9PSBOVUxMICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmICggbm9kZS0+ZmlsZV9uYW1lID09IF9mdF9kZWJ1Z19maWxlICAgJiYKLSAgICAgICAgICAgbm9kZS0+bGluZV9ubyAgID09IF9mdF9kZWJ1Z19saW5lbm8gKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHBub2RlID0gJm5vZGUtPmxpbms7Ci0gICAgfQotCi0gICAgbm9kZSA9IChGVF9NZW1Tb3VyY2UpZnRfbWVtX3RhYmxlX2FsbG9jKCB0YWJsZSwgc2l6ZW9mICggKm5vZGUgKSApOwotICAgIGlmICggbm9kZSA9PSBOVUxMICkKLSAgICAgIGZ0X21lbV9kZWJ1Z19wYW5pYygKLSAgICAgICAgIm5vdCBlbm91Z2ggbWVtb3J5IHRvIHBlcmZvcm0gbWVtb3J5IGRlYnVnZ2luZ1xuIiApOwotCi0gICAgbm9kZS0+ZmlsZV9uYW1lID0gX2Z0X2RlYnVnX2ZpbGU7Ci0gICAgbm9kZS0+bGluZV9ubyAgID0gX2Z0X2RlYnVnX2xpbmVubzsKLQotICAgIG5vZGUtPmN1cl9ibG9ja3MgPSAwOwotICAgIG5vZGUtPm1heF9ibG9ja3MgPSAwOwotICAgIG5vZGUtPmFsbF9ibG9ja3MgPSAwOwotCi0gICAgbm9kZS0+Y3VyX3NpemUgPSAwOwotICAgIG5vZGUtPm1heF9zaXplID0gMDsKLSAgICBub2RlLT5hbGxfc2l6ZSA9IDA7Ci0KLSAgICBub2RlLT5jdXJfbWF4ID0gMDsKLQotICAgIG5vZGUtPmxpbmsgPSBOVUxMOwotICAgIG5vZGUtPmhhc2ggPSBoYXNoOwotICAgICpwbm9kZSAgICAgPSBub2RlOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIG5vZGU7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X21lbV90YWJsZV9zZXQoIEZUX01lbVRhYmxlICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgZGVsdGEgKQotICB7Ci0gICAgRlRfTWVtTm9kZSAgKnBub2RlLCBub2RlOwotCi0KLSAgICBpZiAoIHRhYmxlICkKLSAgICB7Ci0gICAgICBGVF9NZW1Tb3VyY2UgIHNvdXJjZTsKLQotCi0gICAgICBwbm9kZSA9IGZ0X21lbV90YWJsZV9nZXRfbm9kZXAoIHRhYmxlLCBhZGRyZXNzICk7Ci0gICAgICBub2RlICA9ICpwbm9kZTsKLSAgICAgIGlmICggbm9kZSApCi0gICAgICB7Ci0gICAgICAgIGlmICggbm9kZS0+c2l6ZSA8IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogVGhpcyBibG9jayB3YXMgYWxyZWFkeSBmcmVlZC4gIE91ciBtZW1vcnkgaXMgbm93IGNvbXBsZXRlbHkgKi8KLSAgICAgICAgICAvKiBjb3JydXB0ZWQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGluIGtlZXAtYWxpdmUgbW9kZS4gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgZnRfbWVtX2RlYnVnX3BhbmljKAotICAgICAgICAgICAgIm1lbW9yeSBoZWFwIGNvcnJ1cHRlZCAoYWxsb2NhdGluZyBmcmVlZCBibG9jaykiICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogVGhpcyBibG9jayB3YXMgYWxyZWFkeSBhbGxvY2F0ZWQuICBUaGlzIG1lYW5zIHRoYXQgb3VyIG1lbW9yeSAqLwotICAgICAgICAgIC8qIGlzIGFsc28gY29ycnVwdGVkISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBmdF9tZW1fZGVidWdfcGFuaWMoCi0gICAgICAgICAgICAibWVtb3J5IGhlYXAgY29ycnVwdGVkIChyZS1hbGxvY2F0aW5nIGFsbG9jYXRlZCBibG9jayBhdCIKLSAgICAgICAgICAgICIgJXAsIG9mIHNpemUgJWxkKVxuIgotICAgICAgICAgICAgIm9yZz0lczolZCBuZXc9JXM6JWRcbiIsCi0gICAgICAgICAgICBub2RlLT5hZGRyZXNzLCBub2RlLT5zaXplLAotICAgICAgICAgICAgRlRfRklMRU5BTUUoIG5vZGUtPnNvdXJjZS0+ZmlsZV9uYW1lICksIG5vZGUtPnNvdXJjZS0+bGluZV9ubywKLSAgICAgICAgICAgIEZUX0ZJTEVOQU1FKCBfZnRfZGVidWdfZmlsZSApLCBfZnRfZGVidWdfbGluZW5vICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgbm9kZSBpbiB0aGlzIHRhYmxlICovCi0gICAgICBub2RlID0gKEZUX01lbU5vZGUpZnRfbWVtX3RhYmxlX2FsbG9jKCB0YWJsZSwgc2l6ZW9mICggKm5vZGUgKSApOwotICAgICAgaWYgKCBub2RlID09IE5VTEwgKQotICAgICAgICBmdF9tZW1fZGVidWdfcGFuaWMoICJub3QgZW5vdWdoIG1lbW9yeSB0byBydW4gbWVtb3J5IHRlc3RzIiApOwotCi0gICAgICBub2RlLT5hZGRyZXNzID0gYWRkcmVzczsKLSAgICAgIG5vZGUtPnNpemUgICAgPSBzaXplOwotICAgICAgbm9kZS0+c291cmNlICA9IHNvdXJjZSA9IGZ0X21lbV90YWJsZV9nZXRfc291cmNlKCB0YWJsZSApOwotCi0gICAgICBpZiAoIGRlbHRhID09IDAgKQotICAgICAgewotICAgICAgICAvKiB0aGlzIGlzIGFuIGFsbG9jYXRpb24gKi8KLSAgICAgICAgc291cmNlLT5hbGxfYmxvY2tzKys7Ci0gICAgICAgIHNvdXJjZS0+Y3VyX2Jsb2NrcysrOwotICAgICAgICBpZiAoIHNvdXJjZS0+Y3VyX2Jsb2NrcyA+IHNvdXJjZS0+bWF4X2Jsb2NrcyApCi0gICAgICAgICAgc291cmNlLT5tYXhfYmxvY2tzID0gc291cmNlLT5jdXJfYmxvY2tzOwotICAgICAgfQotCi0gICAgICBpZiAoIHNpemUgPiBzb3VyY2UtPmN1cl9tYXggKQotICAgICAgICBzb3VyY2UtPmN1cl9tYXggPSBzaXplOwotCi0gICAgICBpZiAoIGRlbHRhICE9IDAgKQotICAgICAgewotICAgICAgICAvKiB3ZSBhcmUgZ3Jvd2luZyBvciBzaHJpbmtpbmcgYSByZWFsbG9jYXRlZCBibG9jayAqLwotICAgICAgICBzb3VyY2UtPmN1cl9zaXplICAgICArPSBkZWx0YTsKLSAgICAgICAgdGFibGUtPmFsbG9jX2N1cnJlbnQgKz0gZGVsdGE7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIHdlIGFyZSBhbGxvY2F0aW5nIGEgbmV3IGJsb2NrICovCi0gICAgICAgIHNvdXJjZS0+Y3VyX3NpemUgICAgICs9IHNpemU7Ci0gICAgICAgIHRhYmxlLT5hbGxvY19jdXJyZW50ICs9IHNpemU7Ci0gICAgICB9Ci0KLSAgICAgIHNvdXJjZS0+YWxsX3NpemUgKz0gc2l6ZTsKLQotICAgICAgaWYgKCBzb3VyY2UtPmN1cl9zaXplID4gc291cmNlLT5tYXhfc2l6ZSApCi0gICAgICAgIHNvdXJjZS0+bWF4X3NpemUgPSBzb3VyY2UtPmN1cl9zaXplOwotCi0gICAgICBub2RlLT5mcmVlX2ZpbGVfbmFtZSA9IE5VTEw7Ci0gICAgICBub2RlLT5mcmVlX2xpbmVfbm8gICA9IDA7Ci0KLSAgICAgIG5vZGUtPmxpbmsgPSBwbm9kZVswXTsKLQotICAgICAgcG5vZGVbMF0gPSBub2RlOwotICAgICAgdGFibGUtPm5vZGVzKys7Ci0KLSAgICAgIHRhYmxlLT5hbGxvY190b3RhbCArPSBzaXplOwotCi0gICAgICBpZiAoIHRhYmxlLT5hbGxvY19jdXJyZW50ID4gdGFibGUtPmFsbG9jX21heCApCi0gICAgICAgIHRhYmxlLT5hbGxvY19tYXggPSB0YWJsZS0+YWxsb2NfY3VycmVudDsKLQotICAgICAgaWYgKCB0YWJsZS0+bm9kZXMgKiAzIDwgdGFibGUtPnNpemUgIHx8Ci0gICAgICAgICAgIHRhYmxlLT5zaXplICAqIDMgPCB0YWJsZS0+bm9kZXMgKQotICAgICAgICBmdF9tZW1fdGFibGVfcmVzaXplKCB0YWJsZSApOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfbWVtX3RhYmxlX3JlbW92ZSggRlRfTWVtVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgIGRlbHRhICkKLSAgewotICAgIGlmICggdGFibGUgKQotICAgIHsKLSAgICAgIEZUX01lbU5vZGUgICpwbm9kZSwgbm9kZTsKLQotCi0gICAgICBwbm9kZSA9IGZ0X21lbV90YWJsZV9nZXRfbm9kZXAoIHRhYmxlLCBhZGRyZXNzICk7Ci0gICAgICBub2RlICA9ICpwbm9kZTsKLSAgICAgIGlmICggbm9kZSApCi0gICAgICB7Ci0gICAgICAgIEZUX01lbVNvdXJjZSAgc291cmNlOwotCi0KLSAgICAgICAgaWYgKCBub2RlLT5zaXplIDwgMCApCi0gICAgICAgICAgZnRfbWVtX2RlYnVnX3BhbmljKAotICAgICAgICAgICAgImZyZWVpbmcgbWVtb3J5IGJsb2NrIGF0ICVwIG1vcmUgdGhhbiBvbmNlIGF0ICglczolbGQpXG4iCi0gICAgICAgICAgICAiYmxvY2sgYWxsb2NhdGVkIGF0ICglczolbGQpIGFuZCByZWxlYXNlZCBhdCAoJXM6JWxkKSIsCi0gICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgRlRfRklMRU5BTUUoIF9mdF9kZWJ1Z19maWxlICksIF9mdF9kZWJ1Z19saW5lbm8sCi0gICAgICAgICAgICBGVF9GSUxFTkFNRSggbm9kZS0+c291cmNlLT5maWxlX25hbWUgKSwgbm9kZS0+c291cmNlLT5saW5lX25vLAotICAgICAgICAgICAgRlRfRklMRU5BTUUoIG5vZGUtPmZyZWVfZmlsZV9uYW1lICksIG5vZGUtPmZyZWVfbGluZV9ubyApOwotCi0gICAgICAgIC8qIHNjcmFtYmxlIHRoZSBub2RlJ3MgY29udGVudCBmb3IgYWRkaXRpb25hbCBzYWZldHkgKi8KLSAgICAgICAgRlRfTUVNX1NFVCggYWRkcmVzcywgMHhGMywgbm9kZS0+c2l6ZSApOwotCi0gICAgICAgIGlmICggZGVsdGEgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBzb3VyY2UgPSBub2RlLT5zb3VyY2U7Ci0KLSAgICAgICAgICBzb3VyY2UtPmN1cl9ibG9ja3MtLTsKLSAgICAgICAgICBzb3VyY2UtPmN1cl9zaXplIC09IG5vZGUtPnNpemU7Ci0KLSAgICAgICAgICB0YWJsZS0+YWxsb2NfY3VycmVudCAtPSBub2RlLT5zaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCB0YWJsZS0+a2VlcF9hbGl2ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiB3ZSBzaW1wbHkgaW52ZXJ0IHRoZSBub2RlJ3Mgc2l6ZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBub2RlICovCi0gICAgICAgICAgLyogd2FzIGZyZWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIG5vZGUtPnNpemUgICAgICAgICAgID0gLW5vZGUtPnNpemU7Ci0gICAgICAgICAgbm9kZS0+ZnJlZV9maWxlX25hbWUgPSBfZnRfZGVidWdfZmlsZTsKLSAgICAgICAgICBub2RlLT5mcmVlX2xpbmVfbm8gICA9IF9mdF9kZWJ1Z19saW5lbm87Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdGFibGUtPm5vZGVzLS07Ci0KLSAgICAgICAgICAqcG5vZGUgPSBub2RlLT5saW5rOwotCi0gICAgICAgICAgbm9kZS0+c2l6ZSAgID0gMDsKLSAgICAgICAgICBub2RlLT5zb3VyY2UgPSBOVUxMOwotCi0gICAgICAgICAgZnRfbWVtX3RhYmxlX2ZyZWUoIHRhYmxlLCBub2RlICk7Ci0KLSAgICAgICAgICBpZiAoIHRhYmxlLT5ub2RlcyAqIDMgPCB0YWJsZS0+c2l6ZSAgfHwKLSAgICAgICAgICAgICAgIHRhYmxlLT5zaXplICAqIDMgPCB0YWJsZS0+bm9kZXMgKQotICAgICAgICAgICAgZnRfbWVtX3RhYmxlX3Jlc2l6ZSggdGFibGUgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBmdF9tZW1fZGVidWdfcGFuaWMoCi0gICAgICAgICAgInRyeWluZyB0byBmcmVlIHVua25vd24gYmxvY2sgYXQgJXAgaW4gKCVzOiVsZClcbiIsCi0gICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICBGVF9GSUxFTkFNRSggX2Z0X2RlYnVnX2ZpbGUgKSwgX2Z0X2RlYnVnX2xpbmVubyApOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIEZUX1BvaW50ZXIKLSAgZnRfbWVtX2RlYnVnX2FsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIHNpemUgKQotICB7Ci0gICAgRlRfTWVtVGFibGUgIHRhYmxlID0gKEZUX01lbVRhYmxlKW1lbW9yeS0+dXNlcjsKLSAgICBGVF9CeXRlKiAgICAgYmxvY2s7Ci0KLQotICAgIGlmICggc2l6ZSA8PSAwICkKLSAgICAgIGZ0X21lbV9kZWJ1Z19wYW5pYyggIm5lZ2F0aXZlIGJsb2NrIHNpemUgYWxsb2NhdGlvbiAoJWxkKSIsIHNpemUgKTsKLQotICAgIC8qIHJldHVybiBOVUxMIGlmIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvY2F0aW9ucyB3YXMgcmVhY2hlZCAqLwotICAgIGlmICggdGFibGUtPmJvdW5kX2NvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIHRhYmxlLT5hbGxvY19jb3VudCA+PSB0YWJsZS0+YWxsb2NfY291bnRfbWF4ICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLyogcmV0dXJuIE5VTEwgaWYgdGhpcyBhbGxvY2F0aW9uIHdvdWxkIG92ZXJmbG93IHRoZSBtYXhpbXVtIGhlYXAgc2l6ZSAqLwotICAgIGlmICggdGFibGUtPmJvdW5kX3RvdGFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgdGFibGUtPmFsbG9jX3RvdGFsX21heCAtIHRhYmxlLT5hbGxvY19jdXJyZW50ID4gc2l6ZSApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGJsb2NrID0gKEZUX0J5dGUgKilmdF9tZW1fdGFibGVfYWxsb2MoIHRhYmxlLCBzaXplICk7Ci0gICAgaWYgKCBibG9jayApCi0gICAgewotICAgICAgZnRfbWVtX3RhYmxlX3NldCggdGFibGUsIGJsb2NrLCBzaXplLCAwICk7Ci0KLSAgICAgIHRhYmxlLT5hbGxvY19jb3VudCsrOwotICAgIH0KLQotICAgIF9mdF9kZWJ1Z19maWxlICAgPSAiPHVua25vd24+IjsKLSAgICBfZnRfZGVidWdfbGluZW5vID0gMDsKLQotICAgIHJldHVybiAoRlRfUG9pbnRlcilibG9jazsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfbWVtX2RlYnVnX2ZyZWUoIEZUX01lbW9yeSAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIGJsb2NrICkKLSAgewotICAgIEZUX01lbVRhYmxlICB0YWJsZSA9IChGVF9NZW1UYWJsZSltZW1vcnktPnVzZXI7Ci0KLQotICAgIGlmICggYmxvY2sgPT0gTlVMTCApCi0gICAgICBmdF9tZW1fZGVidWdfcGFuaWMoICJ0cnlpbmcgdG8gZnJlZSBOVUxMIGluICglczolbGQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRklMRU5BTUUoIF9mdF9kZWJ1Z19maWxlICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9mdF9kZWJ1Z19saW5lbm8gKTsKLQotICAgIGZ0X21lbV90YWJsZV9yZW1vdmUoIHRhYmxlLCAoRlRfQnl0ZSopYmxvY2ssIDAgKTsKLQotICAgIGlmICggIXRhYmxlLT5rZWVwX2FsaXZlICkKLSAgICAgIGZ0X21lbV90YWJsZV9mcmVlKCB0YWJsZSwgYmxvY2sgKTsKLQotICAgIHRhYmxlLT5hbGxvY19jb3VudC0tOwotCi0gICAgX2Z0X2RlYnVnX2ZpbGUgICA9ICI8dW5rbm93bj4iOwotICAgIF9mdF9kZWJ1Z19saW5lbm8gPSAwOwotICB9Ci0KLQotICBzdGF0aWMgRlRfUG9pbnRlcgotICBmdF9tZW1fZGVidWdfcmVhbGxvYyggRlRfTWVtb3J5ICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgY3VyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICBuZXdfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIGJsb2NrICkKLSAgewotICAgIEZUX01lbVRhYmxlICB0YWJsZSA9IChGVF9NZW1UYWJsZSltZW1vcnktPnVzZXI7Ci0gICAgRlRfTWVtTm9kZSAgIG5vZGUsICpwbm9kZTsKLSAgICBGVF9Qb2ludGVyICAgbmV3X2Jsb2NrOwotICAgIEZUX0xvbmcgICAgICBkZWx0YTsKLQotICAgIGNvbnN0IGNoYXIqICBmaWxlX25hbWUgPSBGVF9GSUxFTkFNRSggX2Z0X2RlYnVnX2ZpbGUgKTsKLSAgICBGVF9Mb25nICAgICAgbGluZV9ubyAgID0gX2Z0X2RlYnVnX2xpbmVubzsKLQotCi0gICAgLyogdW5saWtlbHksIGJ1dCBwb3NzaWJsZSAqLwotICAgIGlmICggbmV3X3NpemUgPT0gY3VyX3NpemUgKQotICAgICAgcmV0dXJuIGJsb2NrOwotCi0gICAgLyogdGhlIGZvbGxvd2luZyBpcyB2YWxpZCBhY2NvcmRpbmcgdG8gQU5TSSBDICovCi0jaWYgMAotICAgIGlmICggYmxvY2sgPT0gTlVMTCB8fCBjdXJfc2l6ZSA9PSAwICkKLSAgICAgIGZ0X21lbV9kZWJ1Z19wYW5pYyggInRyeWluZyB0byByZWFsbG9jYXRlIE5VTEwgaW4gKCVzOiVsZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWUsIGxpbmVfbm8gKTsKLSNlbmRpZgotCi0gICAgLyogd2hpbGUgdGhlIGZvbGxvd2luZyBpcyBhbGxvd2VkIGluIEFOU0kgQyBhbHNvLCB3ZSBhYm9ydCBzaW5jZSAqLwotICAgIC8qIHN1Y2ggY2FzZSBzaG91bGQgYmUgaGFuZGxlZCBieSBGcmVlVHlwZS4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIG5ld19zaXplIDw9IDAgKQotICAgICAgZnRfbWVtX2RlYnVnX3BhbmljKAotICAgICAgICAidHJ5aW5nIHRvIHJlYWxsb2NhdGUgJXAgdG8gc2l6ZSAwIChjdXJyZW50IGlzICVsZCkgaW4gKCVzOiVsZCkiLAotICAgICAgICBibG9jaywgY3VyX3NpemUsIGZpbGVfbmFtZSwgbGluZV9ubyApOwotCi0gICAgLyogY2hlY2sgYGN1cl9zaXplJyB2YWx1ZSAqLwotICAgIHBub2RlID0gZnRfbWVtX3RhYmxlX2dldF9ub2RlcCggdGFibGUsIChGVF9CeXRlKilibG9jayApOwotICAgIG5vZGUgID0gKnBub2RlOwotICAgIGlmICggIW5vZGUgKQotICAgICAgZnRfbWVtX2RlYnVnX3BhbmljKAotICAgICAgICAidHJ5aW5nIHRvIHJlYWxsb2NhdGUgdW5rbm93biBibG9jayBhdCAlcCBpbiAoJXM6JWxkKSIsCi0gICAgICAgIGJsb2NrLCBmaWxlX25hbWUsIGxpbmVfbm8gKTsKLQotICAgIGlmICggbm9kZS0+c2l6ZSA8PSAwICkKLSAgICAgIGZ0X21lbV9kZWJ1Z19wYW5pYygKLSAgICAgICAgInRyeWluZyB0byByZWFsbG9jYXRlIGZyZWVkIGJsb2NrIGF0ICVwIGluICglczolbGQpIiwKLSAgICAgICAgYmxvY2ssIGZpbGVfbmFtZSwgbGluZV9ubyApOwotCi0gICAgaWYgKCBub2RlLT5zaXplICE9IGN1cl9zaXplICkKLSAgICAgIGZ0X21lbV9kZWJ1Z19wYW5pYyggImludmFsaWQgZnRfcmVhbGxvYyByZXF1ZXN0IGZvciAlcC4gY3VyX3NpemUgaXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiJWxkIGluc3RlYWQgb2YgJWxkIGluICglczolbGQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2ssIGN1cl9zaXplLCBub2RlLT5zaXplLCBmaWxlX25hbWUsIGxpbmVfbm8gKTsKLQotICAgIC8qIHJldHVybiBOVUxMIGlmIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhbGxvY2F0aW9ucyB3YXMgcmVhY2hlZCAqLwotICAgIGlmICggdGFibGUtPmJvdW5kX2NvdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIHRhYmxlLT5hbGxvY19jb3VudCA+PSB0YWJsZS0+YWxsb2NfY291bnRfbWF4ICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgZGVsdGEgPSBuZXdfc2l6ZSAtIGN1cl9zaXplOwotCi0gICAgLyogcmV0dXJuIE5VTEwgaWYgdGhpcyBhbGxvY2F0aW9uIHdvdWxkIG92ZXJmbG93IHRoZSBtYXhpbXVtIGhlYXAgc2l6ZSAqLwotICAgIGlmICggZGVsdGEgPiAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIHRhYmxlLT5ib3VuZF90b3RhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICB0YWJsZS0+YWxsb2NfY3VycmVudCArIGRlbHRhID4gdGFibGUtPmFsbG9jX3RvdGFsX21heCApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIG5ld19ibG9jayA9IChGVF9Qb2ludGVyKWZ0X21lbV90YWJsZV9hbGxvYyggdGFibGUsIG5ld19zaXplICk7Ci0gICAgaWYgKCBuZXdfYmxvY2sgPT0gTlVMTCApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGZ0X21lbV90YWJsZV9zZXQoIHRhYmxlLCAoRlRfQnl0ZSopbmV3X2Jsb2NrLCBuZXdfc2l6ZSwgZGVsdGEgKTsKLQotICAgIGZ0X21lbWNweSggbmV3X2Jsb2NrLCBibG9jaywgY3VyX3NpemUgPCBuZXdfc2l6ZSA/IChzaXplX3QpY3VyX3NpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoc2l6ZV90KW5ld19zaXplICk7Ci0KLSAgICBmdF9tZW1fdGFibGVfcmVtb3ZlKCB0YWJsZSwgKEZUX0J5dGUqKWJsb2NrLCBkZWx0YSApOwotCi0gICAgX2Z0X2RlYnVnX2ZpbGUgICA9ICI8dW5rbm93bj4iOwotICAgIF9mdF9kZWJ1Z19saW5lbm8gPSAwOwotCi0gICAgaWYgKCAhdGFibGUtPmtlZXBfYWxpdmUgKQotICAgICAgZnRfbWVtX3RhYmxlX2ZyZWUoIHRhYmxlLCBibG9jayApOwotCi0gICAgcmV0dXJuIG5ld19ibG9jazsKLSAgfQotCi0KLSAgZXh0ZXJuIEZUX0ludAotICBmdF9tZW1fZGVidWdfaW5pdCggRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0gICAgRlRfTWVtVGFibGUgIHRhYmxlOwotICAgIEZUX0ludCAgICAgICByZXN1bHQgPSAwOwotCi0KLSAgICBpZiAoIGdldGVudiggIkZUMl9ERUJVR19NRU1PUlkiICkgKQotICAgIHsKLSAgICAgIHRhYmxlID0gZnRfbWVtX3RhYmxlX25ldyggbWVtb3J5ICk7Ci0gICAgICBpZiAoIHRhYmxlICkKLSAgICAgIHsKLSAgICAgICAgY29uc3QgY2hhciogIHA7Ci0KLQotICAgICAgICBtZW1vcnktPnVzZXIgICAgPSB0YWJsZTsKLSAgICAgICAgbWVtb3J5LT5hbGxvYyAgID0gZnRfbWVtX2RlYnVnX2FsbG9jOwotICAgICAgICBtZW1vcnktPnJlYWxsb2MgPSBmdF9tZW1fZGVidWdfcmVhbGxvYzsKLSAgICAgICAgbWVtb3J5LT5mcmVlICAgID0gZnRfbWVtX2RlYnVnX2ZyZWU7Ci0KLSAgICAgICAgcCA9IGdldGVudiggIkZUMl9BTExPQ19UT1RBTF9NQVgiICk7Ci0gICAgICAgIGlmICggcCAhPSBOVUxMICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0xvbmcgICB0b3RhbF9tYXggPSBmdF9hdG9sKCBwICk7Ci0KLQotICAgICAgICAgIGlmICggdG90YWxfbWF4ID4gMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgdGFibGUtPmJvdW5kX3RvdGFsICAgICA9IDE7Ci0gICAgICAgICAgICB0YWJsZS0+YWxsb2NfdG90YWxfbWF4ID0gdG90YWxfbWF4OwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHAgPSBnZXRlbnYoICJGVDJfQUxMT0NfQ09VTlRfTUFYIiApOwotICAgICAgICBpZiAoIHAgIT0gTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Mb25nICB0b3RhbF9jb3VudCA9IGZ0X2F0b2woIHAgKTsKLQotCi0gICAgICAgICAgaWYgKCB0b3RhbF9jb3VudCA+IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRhYmxlLT5ib3VuZF9jb3VudCAgICAgPSAxOwotICAgICAgICAgICAgdGFibGUtPmFsbG9jX2NvdW50X21heCA9IHRvdGFsX2NvdW50OwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHAgPSBnZXRlbnYoICJGVDJfS0VFUF9BTElWRSIgKTsKLSAgICAgICAgaWYgKCBwICE9IE5VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfTG9uZyAga2VlcF9hbGl2ZSA9IGZ0X2F0b2woIHAgKTsKLQotCi0gICAgICAgICAgaWYgKCBrZWVwX2FsaXZlID4gMCApCi0gICAgICAgICAgICB0YWJsZS0+a2VlcF9hbGl2ZSA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICByZXN1bHQgPSAxOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBleHRlcm4gdm9pZAotICBmdF9tZW1fZGVidWdfZG9uZSggRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0gICAgRlRfTWVtVGFibGUgIHRhYmxlID0gKEZUX01lbVRhYmxlKW1lbW9yeS0+dXNlcjsKLQotCi0gICAgaWYgKCB0YWJsZSApCi0gICAgewotICAgICAgbWVtb3J5LT5mcmVlICAgID0gdGFibGUtPmZyZWU7Ci0gICAgICBtZW1vcnktPnJlYWxsb2MgPSB0YWJsZS0+cmVhbGxvYzsKLSAgICAgIG1lbW9yeS0+YWxsb2MgICA9IHRhYmxlLT5hbGxvYzsKLQotICAgICAgZnRfbWVtX3RhYmxlX2Rlc3Ryb3koIHRhYmxlICk7Ci0gICAgICBtZW1vcnktPnVzZXIgPSBOVUxMOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIGludAotICBmdF9tZW1fc291cmNlX2NvbXBhcmUoIGNvbnN0IHZvaWQqICBwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiAgcDIgKQotICB7Ci0gICAgRlRfTWVtU291cmNlICBzMSA9ICooRlRfTWVtU291cmNlKilwMTsKLSAgICBGVF9NZW1Tb3VyY2UgIHMyID0gKihGVF9NZW1Tb3VyY2UqKXAyOwotCi0KLSAgICBpZiAoIHMyLT5tYXhfc2l6ZSA+IHMxLT5tYXhfc2l6ZSApCi0gICAgICByZXR1cm4gMTsKLSAgICBlbHNlIGlmICggczItPm1heF9zaXplIDwgczEtPm1heF9zaXplICkKLSAgICAgIHJldHVybiAtMTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgZXh0ZXJuIHZvaWQKLSAgRlRfRHVtcE1lbW9yeSggRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0gICAgRlRfTWVtVGFibGUgIHRhYmxlID0gKEZUX01lbVRhYmxlKW1lbW9yeS0+dXNlcjsKLQotCi0gICAgaWYgKCB0YWJsZSApCi0gICAgewotICAgICAgRlRfTWVtU291cmNlKiAgYnVja2V0ID0gdGFibGUtPnNvdXJjZXM7Ci0gICAgICBGVF9NZW1Tb3VyY2UqICBsaW1pdCAgPSBidWNrZXQgKyBGVF9NRU1fU09VUkNFX0JVQ0tFVFM7Ci0gICAgICBGVF9NZW1Tb3VyY2UqICBzb3VyY2VzOwotICAgICAgRlRfSW50ICAgICAgICAgbm4sIGNvdW50OwotICAgICAgY29uc3QgY2hhciogICAgZm10OwotCi0KLSAgICAgIGNvdW50ID0gMDsKLSAgICAgIGZvciAoIDsgYnVja2V0IDwgbGltaXQ7IGJ1Y2tldCsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfTWVtU291cmNlICBzb3VyY2UgPSAqYnVja2V0OwotCi0KLSAgICAgICAgZm9yICggOyBzb3VyY2U7IHNvdXJjZSA9IHNvdXJjZS0+bGluayApCi0gICAgICAgICAgY291bnQrKzsKLSAgICAgIH0KLQotICAgICAgc291cmNlcyA9IChGVF9NZW1Tb3VyY2UqKQotICAgICAgICAgICAgICAgICAgZnRfbWVtX3RhYmxlX2FsbG9jKAotICAgICAgICAgICAgICAgICAgICB0YWJsZSwgY291bnQgKiAoRlRfTG9uZylzaXplb2YgKCAqc291cmNlcyApICk7Ci0KLSAgICAgIGNvdW50ID0gMDsKLSAgICAgIGZvciAoIGJ1Y2tldCA9IHRhYmxlLT5zb3VyY2VzOyBidWNrZXQgPCBsaW1pdDsgYnVja2V0KysgKQotICAgICAgewotICAgICAgICBGVF9NZW1Tb3VyY2UgIHNvdXJjZSA9ICpidWNrZXQ7Ci0KLQotICAgICAgICBmb3IgKCA7IHNvdXJjZTsgc291cmNlID0gc291cmNlLT5saW5rICkKLSAgICAgICAgICBzb3VyY2VzW2NvdW50KytdID0gc291cmNlOwotICAgICAgfQotCi0gICAgICBmdF9xc29ydCggc291cmNlcywKLSAgICAgICAgICAgICAgICAoc2l6ZV90KWNvdW50LAotICAgICAgICAgICAgICAgIHNpemVvZiAoICpzb3VyY2VzICksCi0gICAgICAgICAgICAgICAgZnRfbWVtX3NvdXJjZV9jb21wYXJlICk7Ci0KLSAgICAgIHByaW50ZiggIkZyZWVUeXBlIE1lbW9yeSBEdW1wOiAiCi0gICAgICAgICAgICAgICJjdXJyZW50PSVsZCBtYXg9JWxkIHRvdGFsPSVsZCBjb3VudD0lbGRcbiIsCi0gICAgICAgICAgICAgIHRhYmxlLT5hbGxvY19jdXJyZW50LCB0YWJsZS0+YWxsb2NfbWF4LAotICAgICAgICAgICAgICB0YWJsZS0+YWxsb2NfdG90YWwsIHRhYmxlLT5hbGxvY19jb3VudCApOwotICAgICAgcHJpbnRmKCAiIGJsb2NrICBibG9jayAgICBzaXplcyAgICBzaXplcyAgICBzaXplcyAgIHNvdXJjZVxuIiApOwotICAgICAgcHJpbnRmKCAiIGNvdW50ICAgaGlnaCAgICAgIHN1bSAgaGlnaHN1bSAgICAgIG1heCAgIGxvY2F0aW9uXG4iICk7Ci0gICAgICBwcmludGYoICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7Ci0KLSAgICAgIGZtdCA9ICIlNmxkICU2bGQgJThsZCAlOGxkICU4bGQgJXM6JWRcbiI7Ci0KLSAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBjb3VudDsgbm4rKyApCi0gICAgICB7Ci0gICAgICAgIEZUX01lbVNvdXJjZSAgc291cmNlID0gc291cmNlc1tubl07Ci0KLQotICAgICAgICBwcmludGYoIGZtdCwKLSAgICAgICAgICAgICAgICBzb3VyY2UtPmN1cl9ibG9ja3MsIHNvdXJjZS0+bWF4X2Jsb2NrcywKLSAgICAgICAgICAgICAgICBzb3VyY2UtPmN1cl9zaXplLCBzb3VyY2UtPm1heF9zaXplLCBzb3VyY2UtPmN1cl9tYXgsCi0gICAgICAgICAgICAgICAgRlRfRklMRU5BTUUoIHNvdXJjZS0+ZmlsZV9uYW1lICksCi0gICAgICAgICAgICAgICAgc291cmNlLT5saW5lX25vICk7Ci0gICAgICB9Ci0gICAgICBwcmludGYoICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKLQotICAgICAgZnRfbWVtX3RhYmxlX2ZyZWUoIHRhYmxlLCBzb3VyY2VzICk7Ci0gICAgfQotICB9Ci0KLSNlbHNlICAvKiAhRlRfREVCVUdfTUVNT1JZICovCi0KLSAgLyogQU5TSSBDIGRvZXNuJ3QgbGlrZSBlbXB0eSBzb3VyY2UgZmlsZXMgKi8KLSAgdHlwZWRlZiBpbnQgIF9kZWJ1Z19tZW1fZHVtbXk7Ci0KLSNlbmRpZiAvKiAhRlRfREVCVUdfTUVNT1JZICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGRlYnVnLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGRlYnVnLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZTE4YTguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRkZWJ1Zy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0ZGVidWcuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBEZWJ1Z2dpbmcgYW5kIGxvZ2dpbmcgY29tcG9uZW50IChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgY29tcG9uZW50IGNvbnRhaW5zIHZhcmlvdXMgbWFjcm9zIGFuZCBmdW5jdGlvbnMgdXNlZCB0byBlYXNlIHRoZSAqLwotICAvKiBkZWJ1Z2dpbmcgb2YgdGhlIEZyZWVUeXBlIGVuZ2luZS4gIEl0cyBtYWluIHB1cnBvc2UgaXMgaW4gYXNzZXJ0aW9uICAgKi8KLSAgLyogY2hlY2tpbmcsIHRyYWNpbmcsIGFuZCBlcnJvciBkZXRlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVyZSBhcmUgbm93IHRocmVlIGRlYnVnZ2luZyBtb2RlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gdHJhY2UgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBFcnJvciBhbmQgdHJhY2UgbWVzc2FnZXMgYXJlIHNlbnQgdG8gdGhlIGxvZyBmaWxlICh3aGljaCBjYW4gYmUgdGhlICovCi0gIC8qICAgc3RhbmRhcmQgZXJyb3Igb3V0cHV0KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBlcnJvciBtb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE9ubHkgZXJyb3IgbWVzc2FnZXMgYXJlIGdlbmVyYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gcmVsZWFzZSBtb2RlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBObyBlcnJvciBtZXNzYWdlIGlzIHNlbnQgb3IgZ2VuZXJhdGVkLiAgVGhlIGNvZGUgaXMgZnJlZSBmcm9tIGFueSAgICovCi0gIC8qICAgZGVidWdnaW5nIHBhcnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX0VSUk9SCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGRlYnVnLmggKi8KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX01lc3NhZ2UoIGNvbnN0IGNoYXIqICBmbXQsCi0gICAgICAgICAgICAgIC4uLiApCi0gIHsKLSAgICB2YV9saXN0ICBhcDsKLQotCi0gICAgdmFfc3RhcnQoIGFwLCBmbXQgKTsKLSAgICB2ZnByaW50Ziggc3RkZXJyLCBmbXQsIGFwICk7Ci0gICAgdmFfZW5kKCBhcCApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0ZGVidWcuaCAqLwotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfUGFuaWMoIGNvbnN0IGNoYXIqICBmbXQsCi0gICAgICAgICAgICAuLi4gKQotICB7Ci0gICAgdmFfbGlzdCAgYXA7Ci0KLQotICAgIHZhX3N0YXJ0KCBhcCwgZm10ICk7Ci0gICAgdmZwcmludGYoIHN0ZGVyciwgZm10LCBhcCApOwotICAgIHZhX2VuZCggYXAgKTsKLQotICAgIGV4aXQoIEVYSVRfRkFJTFVSRSApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0ZGVidWcuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBpbnQgKQotICBGVF9UaHJvdyggRlRfRXJyb3IgICAgIGVycm9yLAotICAgICAgICAgICAgaW50ICAgICAgICAgIGxpbmUsCi0gICAgICAgICAgICBjb25zdCBjaGFyKiAgZmlsZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGVycm9yICk7Ci0gICAgRlRfVU5VU0VEKCBsaW5lICk7Ci0gICAgRlRfVU5VU0VEKCBmaWxlICk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0jZW5kaWYgLyogRlRfREVCVUdfTEVWRUxfRVJST1IgKi8KLQotCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotCi0gIC8qIGFycmF5IG9mIHRyYWNlIGxldmVscywgaW5pdGlhbGl6ZWQgdG8gMCAqLwotICBpbnQgIGZ0X3RyYWNlX2xldmVsc1t0cmFjZV9jb3VudF07Ci0KLQotICAvKiBkZWZpbmUgYXJyYXkgb2YgdHJhY2UgdG9nZ2xlIG5hbWVzICovCi0jZGVmaW5lIEZUX1RSQUNFX0RFRiggeCApICAjeCAsCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIqICBmdF90cmFjZV90b2dnbGVzW3RyYWNlX2NvdW50ICsgMV0gPQotICB7Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUkFDRV9ICi0gICAgTlVMTAotICB9OwotCi0jdW5kZWYgRlRfVFJBQ0VfREVGCi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0ZGVidWcuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBGVF9JbnQgKQotICBGVF9UcmFjZV9HZXRfQ291bnQoIHZvaWQgKQotICB7Ci0gICAgcmV0dXJuIHRyYWNlX2NvdW50OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0ZGVidWcuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBjb25zdCBjaGFyICogKQotICBGVF9UcmFjZV9HZXRfTmFtZSggRlRfSW50ICBpZHggKQotICB7Ci0gICAgaW50ICBtYXggPSBGVF9UcmFjZV9HZXRfQ291bnQoKTsKLQotCi0gICAgaWYgKCBpZHggPCBtYXggKQotICAgICAgcmV0dXJuIGZ0X3RyYWNlX3RvZ2dsZXNbaWR4XTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJbml0aWFsaXplIHRoZSB0cmFjaW5nIHN1Yi1zeXN0ZW0uICBUaGlzIGlzIGRvbmUgYnkgcmV0cmlldmluZyB0aGUgICAgKi8KLSAgLyogdmFsdWUgb2YgdGhlIGBGVDJfREVCVUcnIGVudmlyb25tZW50IHZhcmlhYmxlLiAgSXQgbXVzdCBiZSBhIGxpc3Qgb2YgICovCi0gIC8qIHRvZ2dsZXMsIHNlcGFyYXRlZCBieSBzcGFjZXMsIGA7Jywgb3IgYCwnLiAgRXhhbXBsZTogICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZXhwb3J0IEZUMl9ERUJVRz0iYW55OjMgbWVtb3J5Ojcgc3RyZWFtOjUiICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIHJlcXVlc3RzIHRoYXQgYWxsIGxldmVscyBiZSBzZXQgdG8gMywgZXhjZXB0IHRoZSB0cmFjZSBsZXZlbCBmb3IgKi8KLSAgLyogdGhlIG1lbW9yeSBhbmQgc3RyZWFtIGNvbXBvbmVudHMgd2hpY2ggYXJlIHNldCB0byA3IGFuZCA1LCAgICAgICAgICAgICovCi0gIC8qIHJlc3BlY3RpdmVseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU2VlIHRoZSBmaWxlIGBpbmNsdWRlL2ZyZWV0eXBlL2ludGVybmFsL2Z0dHJhY2UuaCcgZm9yIGRldGFpbHMgb2YgICAgICovCi0gIC8qIHRoZSBhdmFpbGFibGUgdG9nZ2xlIG5hbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGxldmVsIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA3OyAwIG1lYW5zIHF1aWV0IChleGNlcHQgZm9yIHNlcmlvdXMgICovCi0gIC8qIHJ1bnRpbWUgZXJyb3JzKSwgYW5kIDcgbWVhbnMgX3ZlcnlfIHZlcmJvc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBmdF9kZWJ1Z19pbml0KCB2b2lkICkKLSAgewotICAgIGNvbnN0IGNoYXIqICBmdDJfZGVidWcgPSBnZXRlbnYoICJGVDJfREVCVUciICk7Ci0KLQotICAgIGlmICggZnQyX2RlYnVnICkKLSAgICB7Ci0gICAgICBjb25zdCBjaGFyKiAgcCA9IGZ0Ml9kZWJ1ZzsKLSAgICAgIGNvbnN0IGNoYXIqICBxOwotCi0KLSAgICAgIGZvciAoIDsgKnA7IHArKyApCi0gICAgICB7Ci0gICAgICAgIC8qIHNraXAgbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCBzZXBhcmF0b3JzICovCi0gICAgICAgIGlmICggKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgfHwgKnAgPT0gJywnIHx8ICpwID09ICc7JyB8fCAqcCA9PSAnPScgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8qIHJlYWQgdG9nZ2xlIG5hbWUsIGZvbGxvd2VkIGJ5ICc6JyAqLwotICAgICAgICBxID0gcDsKLSAgICAgICAgd2hpbGUgKCAqcCAmJiAqcCAhPSAnOicgKQotICAgICAgICAgIHArKzsKLQotICAgICAgICBpZiAoICEqcCApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKCAqcCA9PSAnOicgJiYgcCA+IHEgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfSW50ICBuLCBpLCBsZW4gPSAoRlRfSW50KSggcCAtIHEgKTsKLSAgICAgICAgICBGVF9JbnQgIGxldmVsID0gLTEsIGZvdW5kID0gLTE7Ci0KLQotICAgICAgICAgIGZvciAoIG4gPSAwOyBuIDwgdHJhY2VfY291bnQ7IG4rKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgY29uc3QgY2hhciogIHRvZ2dsZSA9IGZ0X3RyYWNlX3RvZ2dsZXNbbl07Ci0KLQotICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICggdG9nZ2xlW2ldICE9IHFbaV0gKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIGkgPT0gbGVuICYmIHRvZ2dsZVtpXSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZm91bmQgPSBuOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiByZWFkIGxldmVsICovCi0gICAgICAgICAgcCsrOwotICAgICAgICAgIGlmICggKnAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxldmVsID0gKnAgLSAnMCc7Ci0gICAgICAgICAgICBpZiAoIGxldmVsIDwgMCB8fCBsZXZlbCA+IDcgKQotICAgICAgICAgICAgICBsZXZlbCA9IC0xOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggZm91bmQgPj0gMCAmJiBsZXZlbCA+PSAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGZvdW5kID09IHRyYWNlX2FueSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIHNwZWNpYWwgY2FzZSBmb3IgYGFueScgKi8KLSAgICAgICAgICAgICAgZm9yICggbiA9IDA7IG4gPCB0cmFjZV9jb3VudDsgbisrICkKLSAgICAgICAgICAgICAgICBmdF90cmFjZV9sZXZlbHNbbl0gPSBsZXZlbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZnRfdHJhY2VfbGV2ZWxzW2ZvdW5kXSA9IGxldmVsOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSNlbHNlICAvKiAhRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgZnRfZGVidWdfaW5pdCggdm9pZCApCi0gIHsKLSAgICAvKiBub3RoaW5nICovCi0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9JbnQgKQotICBGVF9UcmFjZV9HZXRfQ291bnQoIHZvaWQgKQotICB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBjb25zdCBjaGFyICogKQotICBGVF9UcmFjZV9HZXRfTmFtZSggRlRfSW50ICBpZHggKQotICB7Ci0gICAgRlRfVU5VU0VEKCBpZHggKTsKLQotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLQotI2VuZGlmIC8qICFGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRmbnRmbXQuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0Zm50Zm10LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZTc0MzEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRmbnRmbXQuYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Zm50Zm10LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSB1dGlsaXR5IGZpbGUgZm9yIGZvbnQgZm9ybWF0cyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GT05UX0ZPUk1BVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0ZPTlRfRk9STUFUX0gKLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRmbnRmbXQuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIGNvbnN0IGNoYXIqICkKLSAgRlRfR2V0X0ZvbnRfRm9ybWF0KCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIGNvbnN0IGNoYXIqICByZXN1bHQgPSBOVUxMOwotCi0KLSAgICBpZiAoIGZhY2UgKQotICAgICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHJlc3VsdCwgRk9OVF9GT1JNQVQgKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qIGRlcHJlY2F0ZWQgZnVuY3Rpb24gbmFtZTsgcmV0YWluZWQgZm9yIEFCSSBjb21wYXRpYmlsaXR5ICovCi0KLSAgRlRfRVhQT1JUX0RFRiggY29uc3QgY2hhciogKQotICBGVF9HZXRfWDExX0ZvbnRfRm9ybWF0KCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIGNvbnN0IGNoYXIqICByZXN1bHQgPSBOVUxMOwotCi0KLSAgICBpZiAoIGZhY2UgKQotICAgICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHJlc3VsdCwgRk9OVF9GT1JNQVQgKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0ZnN0eXBlLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGZzdHlwZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDM0NThmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0ZnN0eXBlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGZzdHlwZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgdXRpbGl0eSBmaWxlIHRvIGFjY2VzcyBGU1R5cGUgZGF0YSAoYm9keSkuICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDgtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1RZUEUxX1RBQkxFU19ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUJMRVNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfSU5GT19ICi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9VU2hvcnQgKQotICBGVF9HZXRfRlNUeXBlX0ZsYWdzKCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIFRUX09TMiogIG9zMjsKLQotCi0gICAgLyogZmlyc3QsIHRyeSB0byBnZXQgdGhlIGZzX3R5cGUgZGlyZWN0bHkgZnJvbSB0aGUgZm9udCAqLwotICAgIGlmICggZmFjZSApCi0gICAgewotICAgICAgRlRfU2VydmljZV9Qc0luZm8gIHNlcnZpY2UgPSBOVUxMOwotCi0KLSAgICAgIEZUX0ZBQ0VfRklORF9TRVJWSUNFKCBmYWNlLCBzZXJ2aWNlLCBQT1NUU0NSSVBUX0lORk8gKTsKLQotICAgICAgaWYgKCBzZXJ2aWNlICYmIHNlcnZpY2UtPnBzX2dldF9mb250X2V4dHJhICkKLSAgICAgIHsKLSAgICAgICAgUFNfRm9udEV4dHJhUmVjICBleHRyYTsKLQotCi0gICAgICAgIGlmICggIXNlcnZpY2UtPnBzX2dldF9mb250X2V4dHJhKCBmYWNlLCAmZXh0cmEgKSAmJgotICAgICAgICAgICAgIGV4dHJhLmZzX3R5cGUgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgIHJldHVybiBleHRyYS5mc190eXBlOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIGxvb2sgYXQgRlNUeXBlIGJlZm9yZSBmc1R5cGUgZm9yIFR5cGU0MiAqLwotCi0gICAgaWYgKCAoIG9zMiA9IChUVF9PUzIqKUZUX0dldF9TZm50X1RhYmxlKCBmYWNlLCBGVF9TRk5UX09TMiApICkgIT0gTlVMTCAmJgotICAgICAgICAgb3MyLT52ZXJzaW9uICE9IDB4RkZGRlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgcmV0dXJuIG9zMi0+ZnNUeXBlOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0Z2FzcC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRnYXNwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZDI1N2MuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRnYXNwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGdhc3AuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWNjZXNzIG9mIFRydWVUeXBlJ3MgYGdhc3AnIHRhYmxlIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfR0FTUF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19ICi0KLQotICBGVF9FWFBPUlRfREVGKCBGVF9JbnQgKQotICBGVF9HZXRfR2FzcCggRlRfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgIEZUX1VJbnQgIHBwZW0gKQotICB7Ci0gICAgRlRfSW50ICByZXN1bHQgPSBGVF9HQVNQX05PX1RBQkxFOwotCi0KLSAgICBpZiAoIGZhY2UgJiYgRlRfSVNfU0ZOVCggZmFjZSApICkKLSAgICB7Ci0gICAgICBUVF9GYWNlICB0dGZhY2UgPSAoVFRfRmFjZSlmYWNlOwotCi0KLSAgICAgIGlmICggdHRmYWNlLT5nYXNwLm51bVJhbmdlcyA+IDAgKQotICAgICAgewotICAgICAgICBUVF9HYXNwUmFuZ2UgIHJhbmdlICAgICA9IHR0ZmFjZS0+Z2FzcC5nYXNwUmFuZ2VzOwotICAgICAgICBUVF9HYXNwUmFuZ2UgIHJhbmdlX2VuZCA9IHJhbmdlICsgdHRmYWNlLT5nYXNwLm51bVJhbmdlczsKLQotCi0gICAgICAgIHdoaWxlICggcHBlbSA+IHJhbmdlLT5tYXhQUEVNICkKLSAgICAgICAgewotICAgICAgICAgIHJhbmdlKys7Ci0gICAgICAgICAgaWYgKCByYW5nZSA+PSByYW5nZV9lbmQgKQotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0ID0gcmFuZ2UtPmdhc3BGbGFnOwotCi0gICAgICAgIC8qIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgc3B1cmlvdXMgYml0cyAqLwotICAgICAgICBpZiAoIHR0ZmFjZS0+Z2FzcC52ZXJzaW9uID09IDAgKQotICAgICAgICAgIHJlc3VsdCAmPSAzOwotICAgICAgfQotICAgIH0KLSAgRXhpdDoKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGdsb2Fkci5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRnbG9hZHIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UyODYzOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGdsb2Fkci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Z2xvYWRyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgZ2x5cGggbG9hZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9HTFlQSF9MT0FERVJfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfTUVNT1JZX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2dsb2FkZXIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICBHIEwgWSBQIEggICBMIE8gQSBEIEUgUiAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBnbHlwaCBsb2FkZXIgaXMgYSBzaW1wbGUgb2JqZWN0IHdoaWNoIGlzIHVzZWQgdG8gbG9hZCBhIHNldCBvZiAgICAqLwotICAvKiBnbHlwaHMgZWFzaWx5LiAgSXQgaXMgY3JpdGljYWwgZm9yIHRoZSBjb3JyZWN0IGxvYWRpbmcgb2YgY29tcG9zaXRlcy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElkZWFsbHksIG9uZSBjYW4gc2VlIGl0IGFzIGEgc3RhY2sgb2YgYWJzdHJhY3QgYGdseXBoJyBvYmplY3RzLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBsb2FkZXIuYmFzZSAgICAgSXMgcmVhbGx5IHRoZSBib3R0b20gb2YgdGhlIHN0YWNrLiAgSXQgZGVzY3JpYmVzIGEgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHNpbmdsZSBnbHlwaCBpbWFnZSBtYWRlIG9mIHRoZSBqdXh0YXBvc2l0aW9uIG9mICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzZXZlcmFsIGdseXBocyAodGhvc2UgYGluIHRoZSBzdGFjaycpLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgbG9hZGVyLmN1cnJlbnQgIERlc2NyaWJlcyB0aGUgdG9wIG9mIHRoZSBzdGFjaywgb24gd2hpY2ggYSBuZXcgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBnbHlwaCBjYW4gYmUgbG9hZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgUmV3aW5kICAgICAgICAgIENsZWFycyB0aGUgc3RhY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFByZXBhcmUgICAgICAgICBTZXQgdXAgYGxvYWRlci5jdXJyZW50JyBmb3IgYWRkaXRpb24gb2YgYSBuZXcgZ2x5cGggKi8KLSAgLyogICAgICAgICAgICAgICAgICAgaW1hZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQWRkICAgICAgICAgICAgIEFkZCB0aGUgYGN1cnJlbnQnIGdseXBoIGltYWdlIHRvIHRoZSBgYmFzZScgb25lLCAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBhbmQgcHJlcGFyZSBmb3IgYW5vdGhlciBvbmUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBnbHlwaCBsb2FkZXIgaXMgbm93IGEgYmFzZSBvYmplY3QuICBFYWNoIGRyaXZlciB1c2VkIHRvICAgICAgICAgICAqLwotICAvKiByZS1pbXBsZW1lbnQgaXQgaW4gb25lIHdheSBvciB0aGUgb3RoZXIsIHdoaWNoIHdhc3RlZCBjb2RlIGFuZCAgICAgICAgKi8KLSAgLyogZW5lcmd5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIGNyZWF0ZSBhIG5ldyBnbHlwaCBsb2FkZXIgKi8KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhMb2FkZXJfTmV3KCBGVF9NZW1vcnkgICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaExvYWRlciAgKmFsb2FkZXIgKQotICB7Ci0gICAgRlRfR2x5cGhMb2FkZXIgIGxvYWRlciA9IE5VTEw7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yOwotCi0KLSAgICBpZiAoICFGVF9ORVcoIGxvYWRlciApICkKLSAgICB7Ci0gICAgICBsb2FkZXItPm1lbW9yeSA9IG1lbW9yeTsKLSAgICAgICphbG9hZGVyICAgICAgID0gbG9hZGVyOwotICAgIH0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIHJld2luZCB0aGUgZ2x5cGggbG9hZGVyIC0gcmVzZXQgY291bnRlcnMgdG8gMCAqLwotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX0dseXBoTG9hZGVyX1Jld2luZCggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBGVF9HbHlwaExvYWQgIGJhc2UgICAgPSAmbG9hZGVyLT5iYXNlOwotICAgIEZUX0dseXBoTG9hZCAgY3VycmVudCA9ICZsb2FkZXItPmN1cnJlbnQ7Ci0KLQotICAgIGJhc2UtPm91dGxpbmUubl9wb2ludHMgICA9IDA7Ci0gICAgYmFzZS0+b3V0bGluZS5uX2NvbnRvdXJzID0gMDsKLSAgICBiYXNlLT5udW1fc3ViZ2x5cGhzICAgICAgPSAwOwotCi0gICAgKmN1cnJlbnQgPSAqYmFzZTsKLSAgfQotCi0KLSAgLyogcmVzZXQgdGhlIGdseXBoIGxvYWRlciwgZnJlZXMgYWxsIGFsbG9jYXRlZCB0YWJsZXMgKi8KLSAgLyogYW5kIHN0YXJ0cyBmcm9tIHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9HbHlwaExvYWRlcl9SZXNldCggRlRfR2x5cGhMb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBGVF9NZW1vcnkgbWVtb3J5ID0gbG9hZGVyLT5tZW1vcnk7Ci0KLQotICAgIEZUX0ZSRUUoIGxvYWRlci0+YmFzZS5vdXRsaW5lLnBvaW50cyApOwotICAgIEZUX0ZSRUUoIGxvYWRlci0+YmFzZS5vdXRsaW5lLnRhZ3MgKTsKLSAgICBGVF9GUkVFKCBsb2FkZXItPmJhc2Uub3V0bGluZS5jb250b3VycyApOwotICAgIEZUX0ZSRUUoIGxvYWRlci0+YmFzZS5leHRyYV9wb2ludHMgKTsKLSAgICBGVF9GUkVFKCBsb2FkZXItPmJhc2Uuc3ViZ2x5cGhzICk7Ci0KLSAgICBsb2FkZXItPmJhc2UuZXh0cmFfcG9pbnRzMiA9IE5VTEw7Ci0KLSAgICBsb2FkZXItPm1heF9wb2ludHMgICAgPSAwOwotICAgIGxvYWRlci0+bWF4X2NvbnRvdXJzICA9IDA7Ci0gICAgbG9hZGVyLT5tYXhfc3ViZ2x5cGhzID0gMDsKLQotICAgIEZUX0dseXBoTG9hZGVyX1Jld2luZCggbG9hZGVyICk7Ci0gIH0KLQotCi0gIC8qIGRlbGV0ZSBhIGdseXBoIGxvYWRlciAqLwotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX0dseXBoTG9hZGVyX0RvbmUoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgaWYgKCBsb2FkZXIgKQotICAgIHsKLSAgICAgIEZUX01lbW9yeSBtZW1vcnkgPSBsb2FkZXItPm1lbW9yeTsKLQotCi0gICAgICBGVF9HbHlwaExvYWRlcl9SZXNldCggbG9hZGVyICk7Ci0gICAgICBGVF9GUkVFKCBsb2FkZXIgKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIHJlLWFkanVzdCB0aGUgYGN1cnJlbnQnIG91dGxpbmUgZmllbGRzICovCi0gIHN0YXRpYyB2b2lkCi0gIEZUX0dseXBoTG9hZGVyX0FkanVzdF9Qb2ludHMoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgRlRfT3V0bGluZSogIGJhc2UgICAgPSAmbG9hZGVyLT5iYXNlLm91dGxpbmU7Ci0gICAgRlRfT3V0bGluZSogIGN1cnJlbnQgPSAmbG9hZGVyLT5jdXJyZW50Lm91dGxpbmU7Ci0KLQotICAgIGN1cnJlbnQtPnBvaW50cyAgID0gYmFzZS0+cG9pbnRzICAgKyBiYXNlLT5uX3BvaW50czsKLSAgICBjdXJyZW50LT50YWdzICAgICA9IGJhc2UtPnRhZ3MgICAgICsgYmFzZS0+bl9wb2ludHM7Ci0gICAgY3VycmVudC0+Y29udG91cnMgPSBiYXNlLT5jb250b3VycyArIGJhc2UtPm5fY29udG91cnM7Ci0KLSAgICAvKiBoYW5kbGUgZXh0cmEgcG9pbnRzIHRhYmxlIC0gaWYgYW55ICovCi0gICAgaWYgKCBsb2FkZXItPnVzZV9leHRyYSApCi0gICAgewotICAgICAgbG9hZGVyLT5jdXJyZW50LmV4dHJhX3BvaW50cyAgPSBsb2FkZXItPmJhc2UuZXh0cmFfcG9pbnRzICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+bl9wb2ludHM7Ci0KLSAgICAgIGxvYWRlci0+Y3VycmVudC5leHRyYV9wb2ludHMyID0gbG9hZGVyLT5iYXNlLmV4dHJhX3BvaW50czIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5uX3BvaW50czsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX0dseXBoTG9hZGVyX0NyZWF0ZUV4dHJhKCBGVF9HbHlwaExvYWRlciAgbG9hZGVyICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsb2FkZXItPm1lbW9yeTsKLQotCi0gICAgaWYgKCAhRlRfTkVXX0FSUkFZKCBsb2FkZXItPmJhc2UuZXh0cmFfcG9pbnRzLCAyICogbG9hZGVyLT5tYXhfcG9pbnRzICkgKQotICAgIHsKLSAgICAgIGxvYWRlci0+dXNlX2V4dHJhICAgICAgICAgID0gMTsKLSAgICAgIGxvYWRlci0+YmFzZS5leHRyYV9wb2ludHMyID0gbG9hZGVyLT5iYXNlLmV4dHJhX3BvaW50cyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci0+bWF4X3BvaW50czsKLQotICAgICAgRlRfR2x5cGhMb2FkZXJfQWRqdXN0X1BvaW50cyggbG9hZGVyICk7Ci0gICAgfQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogcmUtYWRqdXN0IHRoZSBgY3VycmVudCcgc3ViZ2x5cGhzIGZpZWxkICovCi0gIHN0YXRpYyB2b2lkCi0gIEZUX0dseXBoTG9hZGVyX0FkanVzdF9TdWJnbHlwaHMoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgRlRfR2x5cGhMb2FkICBiYXNlICAgID0gJmxvYWRlci0+YmFzZTsKLSAgICBGVF9HbHlwaExvYWQgIGN1cnJlbnQgPSAmbG9hZGVyLT5jdXJyZW50OwotCi0KLSAgICBjdXJyZW50LT5zdWJnbHlwaHMgPSBiYXNlLT5zdWJnbHlwaHMgKyBiYXNlLT5udW1fc3ViZ2x5cGhzOwotICB9Ci0KLQotICAvKiBFbnN1cmUgdGhhdCB3ZSBjYW4gYWRkIGBuX3BvaW50cycgYW5kIGBuX2NvbnRvdXJzJyB0byBvdXIgZ2x5cGguICAgICAgKi8KLSAgLyogVGhpcyBmdW5jdGlvbiByZWFsbG9jYXRlcyBpdHMgb3V0bGluZSB0YWJsZXMgaWYgbmVjZXNzYXJ5LiAgTm90ZSB0aGF0ICovCi0gIC8qIGl0IERPRVNOJ1QgY2hhbmdlIHRoZSBudW1iZXIgb2YgcG9pbnRzIHdpdGhpbiB0aGUgbG9hZGVyISAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhMb2FkZXJfQ2hlY2tQb2ludHMoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgbl9wb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgbl9jb250b3VycyApCi0gIHsKLSAgICBGVF9NZW1vcnkgICAgbWVtb3J5ICA9IGxvYWRlci0+bWVtb3J5OwotICAgIEZUX0Vycm9yICAgICBlcnJvciAgID0gRlRfRXJyX09rOwotICAgIEZUX091dGxpbmUqICBiYXNlICAgID0gJmxvYWRlci0+YmFzZS5vdXRsaW5lOwotICAgIEZUX091dGxpbmUqICBjdXJyZW50ID0gJmxvYWRlci0+Y3VycmVudC5vdXRsaW5lOwotICAgIEZUX0Jvb2wgICAgICBhZGp1c3QgID0gMDsKLQotICAgIEZUX1VJbnQgICAgICBuZXdfbWF4LCBvbGRfbWF4OwotCi0KLSAgICAvKiBjaGVjayBwb2ludHMgJiB0YWdzICovCi0gICAgbmV3X21heCA9IChGVF9VSW50KWJhc2UtPm5fcG9pbnRzICsgKEZUX1VJbnQpY3VycmVudC0+bl9wb2ludHMgKwotICAgICAgICAgICAgICBuX3BvaW50czsKLSAgICBvbGRfbWF4ID0gbG9hZGVyLT5tYXhfcG9pbnRzOwotCi0gICAgaWYgKCBuZXdfbWF4ID4gb2xkX21heCApCi0gICAgewotICAgICAgbmV3X21heCA9IEZUX1BBRF9DRUlMKCBuZXdfbWF4LCA4ICk7Ci0KLSAgICAgIGlmICggbmV3X21heCA+IEZUX09VVExJTkVfUE9JTlRTX01BWCApCi0gICAgICAgIHJldHVybiBGVF9USFJPVyggQXJyYXlfVG9vX0xhcmdlICk7Ci0KLSAgICAgIGlmICggRlRfUkVORVdfQVJSQVkoIGJhc2UtPnBvaW50cywgb2xkX21heCwgbmV3X21heCApIHx8Ci0gICAgICAgICAgIEZUX1JFTkVXX0FSUkFZKCBiYXNlLT50YWdzLCAgIG9sZF9tYXgsIG5ld19tYXggKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgaWYgKCBsb2FkZXItPnVzZV9leHRyYSApCi0gICAgICB7Ci0gICAgICAgIGlmICggRlRfUkVORVdfQVJSQVkoIGxvYWRlci0+YmFzZS5leHRyYV9wb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZF9tYXggKiAyLCBuZXdfbWF4ICogMiApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgRlRfQVJSQVlfTU9WRSggbG9hZGVyLT5iYXNlLmV4dHJhX3BvaW50cyArIG5ld19tYXgsCi0gICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci0+YmFzZS5leHRyYV9wb2ludHMgKyBvbGRfbWF4LAotICAgICAgICAgICAgICAgICAgICAgICBvbGRfbWF4ICk7Ci0KLSAgICAgICAgbG9hZGVyLT5iYXNlLmV4dHJhX3BvaW50czIgPSBsb2FkZXItPmJhc2UuZXh0cmFfcG9pbnRzICsgbmV3X21heDsKLSAgICAgIH0KLQotICAgICAgYWRqdXN0ID0gMTsKLSAgICAgIGxvYWRlci0+bWF4X3BvaW50cyA9IG5ld19tYXg7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgY29udG91cnMgKi8KLSAgICBvbGRfbWF4ID0gbG9hZGVyLT5tYXhfY29udG91cnM7Ci0gICAgbmV3X21heCA9IChGVF9VSW50KWJhc2UtPm5fY29udG91cnMgKyAoRlRfVUludCljdXJyZW50LT5uX2NvbnRvdXJzICsKLSAgICAgICAgICAgICAgbl9jb250b3VyczsKLSAgICBpZiAoIG5ld19tYXggPiBvbGRfbWF4ICkKLSAgICB7Ci0gICAgICBuZXdfbWF4ID0gRlRfUEFEX0NFSUwoIG5ld19tYXgsIDQgKTsKLQotICAgICAgaWYgKCBuZXdfbWF4ID4gRlRfT1VUTElORV9DT05UT1VSU19NQVggKQotICAgICAgICByZXR1cm4gRlRfVEhST1coIEFycmF5X1Rvb19MYXJnZSApOwotCi0gICAgICBpZiAoIEZUX1JFTkVXX0FSUkFZKCBiYXNlLT5jb250b3Vycywgb2xkX21heCwgbmV3X21heCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBhZGp1c3QgPSAxOwotICAgICAgbG9hZGVyLT5tYXhfY29udG91cnMgPSBuZXdfbWF4OwotICAgIH0KLQotICAgIGlmICggYWRqdXN0ICkKLSAgICAgIEZUX0dseXBoTG9hZGVyX0FkanVzdF9Qb2ludHMoIGxvYWRlciApOwotCi0gIEV4aXQ6Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBGVF9HbHlwaExvYWRlcl9SZXNldCggbG9hZGVyICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIEVuc3VyZSB0aGF0IHdlIGNhbiBhZGQgYG5fc3ViZ2x5cGhzJyB0byBvdXIgZ2x5cGguIHRoaXMgZnVuY3Rpb24gKi8KLSAgLyogcmVhbGxvY2F0ZXMgaXRzIHN1YmdseXBocyB0YWJsZSBpZiBuZWNlc3NhcnkuICBOb3RlIHRoYXQgaXQgRE9FUyAqLwotICAvKiBOT1QgY2hhbmdlIHRoZSBudW1iZXIgb2Ygc3ViZ2x5cGhzIHdpdGhpbiB0aGUgbG9hZGVyISAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhMb2FkZXJfQ2hlY2tTdWJHbHlwaHMoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgbl9zdWJzICkKLSAgewotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gbG9hZGVyLT5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfVUludCAgICAgICBuZXdfbWF4LCBvbGRfbWF4OwotCi0gICAgRlRfR2x5cGhMb2FkICBiYXNlICAgID0gJmxvYWRlci0+YmFzZTsKLSAgICBGVF9HbHlwaExvYWQgIGN1cnJlbnQgPSAmbG9hZGVyLT5jdXJyZW50OwotCi0KLSAgICBuZXdfbWF4ID0gYmFzZS0+bnVtX3N1YmdseXBocyArIGN1cnJlbnQtPm51bV9zdWJnbHlwaHMgKyBuX3N1YnM7Ci0gICAgb2xkX21heCA9IGxvYWRlci0+bWF4X3N1YmdseXBoczsKLSAgICBpZiAoIG5ld19tYXggPiBvbGRfbWF4ICkKLSAgICB7Ci0gICAgICBuZXdfbWF4ID0gRlRfUEFEX0NFSUwoIG5ld19tYXgsIDIgKTsKLSAgICAgIGlmICggRlRfUkVORVdfQVJSQVkoIGJhc2UtPnN1YmdseXBocywgb2xkX21heCwgbmV3X21heCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBsb2FkZXItPm1heF9zdWJnbHlwaHMgPSBuZXdfbWF4OwotCi0gICAgICBGVF9HbHlwaExvYWRlcl9BZGp1c3RfU3ViZ2x5cGhzKCBsb2FkZXIgKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIHByZXBhcmUgbG9hZGVyIGZvciB0aGUgYWRkaXRpb24gb2YgYSBuZXcgZ2x5cGggb24gdG9wIG9mIHRoZSBiYXNlIG9uZSAqLwotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX0dseXBoTG9hZGVyX1ByZXBhcmUoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgRlRfR2x5cGhMb2FkICBjdXJyZW50ID0gJmxvYWRlci0+Y3VycmVudDsKLQotCi0gICAgY3VycmVudC0+b3V0bGluZS5uX3BvaW50cyAgID0gMDsKLSAgICBjdXJyZW50LT5vdXRsaW5lLm5fY29udG91cnMgPSAwOwotICAgIGN1cnJlbnQtPm51bV9zdWJnbHlwaHMgICAgICA9IDA7Ci0KLSAgICBGVF9HbHlwaExvYWRlcl9BZGp1c3RfUG9pbnRzICAgKCBsb2FkZXIgKTsKLSAgICBGVF9HbHlwaExvYWRlcl9BZGp1c3RfU3ViZ2x5cGhzKCBsb2FkZXIgKTsKLSAgfQotCi0KLSAgLyogYWRkIGN1cnJlbnQgZ2x5cGggdG8gdGhlIGJhc2UgaW1hZ2UgLS0gYW5kIHByZXBhcmUgZm9yIGFub3RoZXIgKi8KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9HbHlwaExvYWRlcl9BZGQoIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgRlRfR2x5cGhMb2FkICBiYXNlOwotICAgIEZUX0dseXBoTG9hZCAgY3VycmVudDsKLQotICAgIEZUX0ludCAgICAgICAgbl9jdXJyX2NvbnRvdXJzOwotICAgIEZUX0ludCAgICAgICAgbl9iYXNlX3BvaW50czsKLSAgICBGVF9JbnQgICAgICAgIG47Ci0KLQotICAgIGlmICggIWxvYWRlciApCi0gICAgICByZXR1cm47Ci0KLSAgICBiYXNlICAgID0gJmxvYWRlci0+YmFzZTsKLSAgICBjdXJyZW50ID0gJmxvYWRlci0+Y3VycmVudDsKLQotICAgIG5fY3Vycl9jb250b3VycyA9IGN1cnJlbnQtPm91dGxpbmUubl9jb250b3VyczsKLSAgICBuX2Jhc2VfcG9pbnRzICAgPSBiYXNlLT5vdXRsaW5lLm5fcG9pbnRzOwotCi0gICAgYmFzZS0+b3V0bGluZS5uX3BvaW50cyA9Ci0gICAgICAoc2hvcnQpKCBiYXNlLT5vdXRsaW5lLm5fcG9pbnRzICsgY3VycmVudC0+b3V0bGluZS5uX3BvaW50cyApOwotICAgIGJhc2UtPm91dGxpbmUubl9jb250b3VycyA9Ci0gICAgICAoc2hvcnQpKCBiYXNlLT5vdXRsaW5lLm5fY29udG91cnMgKyBjdXJyZW50LT5vdXRsaW5lLm5fY29udG91cnMgKTsKLQotICAgIGJhc2UtPm51bV9zdWJnbHlwaHMgKz0gY3VycmVudC0+bnVtX3N1YmdseXBoczsKLQotICAgIC8qIGFkanVzdCBjb250b3VycyBjb3VudCBpbiBuZXdlc3Qgb3V0bGluZSAqLwotICAgIGZvciAoIG4gPSAwOyBuIDwgbl9jdXJyX2NvbnRvdXJzOyBuKysgKQotICAgICAgY3VycmVudC0+b3V0bGluZS5jb250b3Vyc1tuXSA9Ci0gICAgICAgIChzaG9ydCkoIGN1cnJlbnQtPm91dGxpbmUuY29udG91cnNbbl0gKyBuX2Jhc2VfcG9pbnRzICk7Ci0KLSAgICAvKiBwcmVwYXJlIGZvciBhbm90aGVyIG5ldyBnbHlwaCBpbWFnZSAqLwotICAgIEZUX0dseXBoTG9hZGVyX1ByZXBhcmUoIGxvYWRlciApOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9HbHlwaExvYWRlcl9Db3B5UG9pbnRzKCBGVF9HbHlwaExvYWRlciAgdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaExvYWRlciAgc291cmNlICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBGVF9VSW50ICAgbnVtX3BvaW50cyAgID0gKEZUX1VJbnQpc291cmNlLT5iYXNlLm91dGxpbmUubl9wb2ludHM7Ci0gICAgRlRfVUludCAgIG51bV9jb250b3VycyA9IChGVF9VSW50KXNvdXJjZS0+YmFzZS5vdXRsaW5lLm5fY29udG91cnM7Ci0KLQotICAgIGVycm9yID0gRlRfR2x5cGhMb2FkZXJfQ2hlY2tQb2ludHMoIHRhcmdldCwgbnVtX3BvaW50cywgbnVtX2NvbnRvdXJzICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIEZUX091dGxpbmUqICBvdXQgPSAmdGFyZ2V0LT5iYXNlLm91dGxpbmU7Ci0gICAgICBGVF9PdXRsaW5lKiAgaW4gID0gJnNvdXJjZS0+YmFzZS5vdXRsaW5lOwotCi0KLSAgICAgIEZUX0FSUkFZX0NPUFkoIG91dC0+cG9pbnRzLCBpbi0+cG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgbnVtX3BvaW50cyApOwotICAgICAgRlRfQVJSQVlfQ09QWSggb3V0LT50YWdzLCBpbi0+dGFncywKLSAgICAgICAgICAgICAgICAgICAgIG51bV9wb2ludHMgKTsKLSAgICAgIEZUX0FSUkFZX0NPUFkoIG91dC0+Y29udG91cnMsIGluLT5jb250b3VycywKLSAgICAgICAgICAgICAgICAgICAgIG51bV9jb250b3VycyApOwotCi0gICAgICAvKiBkbyB3ZSBuZWVkIHRvIGNvcHkgdGhlIGV4dHJhIHBvaW50cz8gKi8KLSAgICAgIGlmICggdGFyZ2V0LT51c2VfZXh0cmEgJiYgc291cmNlLT51c2VfZXh0cmEgKQotICAgICAgewotICAgICAgICBGVF9BUlJBWV9DT1BZKCB0YXJnZXQtPmJhc2UuZXh0cmFfcG9pbnRzLCBzb3VyY2UtPmJhc2UuZXh0cmFfcG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICBudW1fcG9pbnRzICk7Ci0gICAgICAgIEZUX0FSUkFZX0NPUFkoIHRhcmdldC0+YmFzZS5leHRyYV9wb2ludHMyLCBzb3VyY2UtPmJhc2UuZXh0cmFfcG9pbnRzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BvaW50cyApOwotICAgICAgfQotCi0gICAgICBvdXQtPm5fcG9pbnRzICAgPSAoc2hvcnQpbnVtX3BvaW50czsKLSAgICAgIG91dC0+bl9jb250b3VycyA9IChzaG9ydCludW1fY29udG91cnM7Ci0KLSAgICAgIEZUX0dseXBoTG9hZGVyX0FkanVzdF9Qb2ludHMoIHRhcmdldCApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRnbHlwaC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRnbHlwaC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjdmYzM3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0Z2x5cGguYworKysgL2Rldi9udWxsCkBAIC0xLDYyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGdseXBoLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgY29udmVuaWVuY2UgZnVuY3Rpb25zIHRvIGhhbmRsZSBnbHlwaHMgKGJvZHkpLiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbiBvZiBzZXZlcmFsIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyAgICovCi0gIC8qICB0aGF0IGNhbiBiZSB1c2VkIGJ5IGNsaWVudCBhcHBsaWNhdGlvbnMgdG8gZWFzaWx5IHJldHJpZXZlIGdseXBoICAgICAqLwotICAvKiAgYml0bWFwcyBhbmQgb3V0bGluZXMgZnJvbSBhIGdpdmVuIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIG9wdGlvbmFsIGlmIHlvdSBhcmUgd3JpdGluZyBhIGZvbnQgc2VydmVyICAqLwotICAvKiAgb3IgdGV4dCBsYXlvdXQgZW5naW5lIG9uIHRvcCBvZiBGcmVlVHlwZS4gIEhvd2V2ZXIsIHRoZXkgYXJlIHByZXR0eSAgKi8KLSAgLyogIGhhbmR5IGZvciBtYW55IG90aGVyIHNpbXBsZSB1c2VzIG9mIHRoZSBsaWJyYXJ5LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgRlRfR0xZUEhfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9CSVRNQVBfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0KLSNpbmNsdWRlICJiYXNlcGljLmgiCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfZ2x5cGgKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgRlRfQml0bWFwR2x5cGggc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBmdF9iaXRtYXBfZ2x5cGhfaW5pdCggRlRfR2x5cGggICAgICBiaXRtYXBfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgIHNsb3QgKQotICB7Ci0gICAgRlRfQml0bWFwR2x5cGggIGdseXBoICAgPSAoRlRfQml0bWFwR2x5cGgpYml0bWFwX2dseXBoOwotICAgIEZUX0Vycm9yICAgICAgICBlcnJvciAgID0gRlRfRXJyX09rOwotICAgIEZUX0xpYnJhcnkgICAgICBsaWJyYXJ5ID0gRlRfR0xZUEgoIGdseXBoICktPmxpYnJhcnk7Ci0KLQotICAgIGlmICggc2xvdC0+Zm9ybWF0ICE9IEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfR2x5cGhfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgZ2x5cGgtPmxlZnQgPSBzbG90LT5iaXRtYXBfbGVmdDsKLSAgICBnbHlwaC0+dG9wICA9IHNsb3QtPmJpdG1hcF90b3A7Ci0KLSAgICAvKiBkbyBsYXp5IGNvcHlpbmcgd2hlbmV2ZXIgcG9zc2libGUgKi8KLSAgICBpZiAoIHNsb3QtPmludGVybmFsLT5mbGFncyAmIEZUX0dMWVBIX09XTl9CSVRNQVAgKQotICAgIHsKLSAgICAgIGdseXBoLT5iaXRtYXAgPSBzbG90LT5iaXRtYXA7Ci0gICAgICBzbG90LT5pbnRlcm5hbC0+ZmxhZ3MgJj0gfkZUX0dMWVBIX09XTl9CSVRNQVA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGVF9CaXRtYXBfSW5pdCggJmdseXBoLT5iaXRtYXAgKTsKLSAgICAgIGVycm9yID0gRlRfQml0bWFwX0NvcHkoIGxpYnJhcnksICZzbG90LT5iaXRtYXAsICZnbHlwaC0+Yml0bWFwICk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgZnRfYml0bWFwX2dseXBoX2NvcHkoIEZUX0dseXBoICBiaXRtYXBfc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGggIGJpdG1hcF90YXJnZXQgKQotICB7Ci0gICAgRlRfTGlicmFyeSAgICAgIGxpYnJhcnkgPSBiaXRtYXBfc291cmNlLT5saWJyYXJ5OwotICAgIEZUX0JpdG1hcEdseXBoICBzb3VyY2UgID0gKEZUX0JpdG1hcEdseXBoKWJpdG1hcF9zb3VyY2U7Ci0gICAgRlRfQml0bWFwR2x5cGggIHRhcmdldCAgPSAoRlRfQml0bWFwR2x5cGgpYml0bWFwX3RhcmdldDsKLQotCi0gICAgdGFyZ2V0LT5sZWZ0ID0gc291cmNlLT5sZWZ0OwotICAgIHRhcmdldC0+dG9wICA9IHNvdXJjZS0+dG9wOwotCi0gICAgcmV0dXJuIEZUX0JpdG1hcF9Db3B5KCBsaWJyYXJ5LCAmc291cmNlLT5iaXRtYXAsICZ0YXJnZXQtPmJpdG1hcCApOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICBmdF9iaXRtYXBfZ2x5cGhfZG9uZSggRlRfR2x5cGggIGJpdG1hcF9nbHlwaCApCi0gIHsKLSAgICBGVF9CaXRtYXBHbHlwaCAgZ2x5cGggICA9IChGVF9CaXRtYXBHbHlwaCliaXRtYXBfZ2x5cGg7Ci0gICAgRlRfTGlicmFyeSAgICAgIGxpYnJhcnkgPSBGVF9HTFlQSCggZ2x5cGggKS0+bGlicmFyeTsKLQotCi0gICAgRlRfQml0bWFwX0RvbmUoIGxpYnJhcnksICZnbHlwaC0+Yml0bWFwICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIGZ0X2JpdG1hcF9nbHlwaF9iYm94KCBGVF9HbHlwaCAgYml0bWFwX2dseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQkJveCogIGNib3ggKQotICB7Ci0gICAgRlRfQml0bWFwR2x5cGggIGdseXBoID0gKEZUX0JpdG1hcEdseXBoKWJpdG1hcF9nbHlwaDsKLQotCi0gICAgY2JveC0+eE1pbiA9IGdseXBoLT5sZWZ0IDw8IDY7Ci0gICAgY2JveC0+eE1heCA9IGNib3gtPnhNaW4gKyAoRlRfUG9zKSggZ2x5cGgtPmJpdG1hcC53aWR0aCA8PCA2ICk7Ci0gICAgY2JveC0+eU1heCA9IGdseXBoLT50b3AgPDwgNjsKLSAgICBjYm94LT55TWluID0gY2JveC0+eU1heCAtIChGVF9Qb3MpKCBnbHlwaC0+Yml0bWFwLnJvd3MgPDwgNiApOwotICB9Ci0KLQotICBGVF9ERUZJTkVfR0xZUEgoZnRfYml0bWFwX2dseXBoX2NsYXNzLAotICAgIHNpemVvZiAoIEZUX0JpdG1hcEdseXBoUmVjICksCi0gICAgRlRfR0xZUEhfRk9STUFUX0JJVE1BUCwKLQotICAgIGZ0X2JpdG1hcF9nbHlwaF9pbml0LAotICAgIGZ0X2JpdG1hcF9nbHlwaF9kb25lLAotICAgIGZ0X2JpdG1hcF9nbHlwaF9jb3B5LAotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGVF9HbHlwaF9UcmFuc2Zvcm1GdW5jICovCi0gICAgZnRfYml0bWFwX2dseXBoX2Jib3gsCi0gICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZUX0dseXBoX1ByZXBhcmVGdW5jICAgKi8KLSAgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICBGVF9PdXRsaW5lR2x5cGggc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgZnRfb3V0bGluZV9nbHlwaF9pbml0KCBGVF9HbHlwaCAgICAgIG91dGxpbmVfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICBzbG90ICkKLSAgewotICAgIEZUX091dGxpbmVHbHlwaCAgZ2x5cGggICA9IChGVF9PdXRsaW5lR2x5cGgpb3V0bGluZV9nbHlwaDsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yICAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfTGlicmFyeSAgICAgICBsaWJyYXJ5ID0gRlRfR0xZUEgoIGdseXBoICktPmxpYnJhcnk7Ci0gICAgRlRfT3V0bGluZSogICAgICBzb3VyY2UgID0gJnNsb3QtPm91dGxpbmU7Ci0gICAgRlRfT3V0bGluZSogICAgICB0YXJnZXQgID0gJmdseXBoLT5vdXRsaW5lOwotCi0KLSAgICAvKiBjaGVjayBmb3JtYXQgaW4gZ2x5cGggc2xvdCAqLwotICAgIGlmICggc2xvdC0+Zm9ybWF0ICE9IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0dseXBoX0Zvcm1hdCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIGFsbG9jYXRlIG5ldyBvdXRsaW5lICovCi0gICAgZXJyb3IgPSBGVF9PdXRsaW5lX05ldyggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludClzb3VyY2UtPm5fcG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+bl9jb250b3VycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2x5cGgtPm91dGxpbmUgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIEZUX091dGxpbmVfQ29weSggc291cmNlLCB0YXJnZXQgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgZnRfb3V0bGluZV9nbHlwaF9kb25lKCBGVF9HbHlwaCAgb3V0bGluZV9nbHlwaCApCi0gIHsKLSAgICBGVF9PdXRsaW5lR2x5cGggIGdseXBoID0gKEZUX091dGxpbmVHbHlwaClvdXRsaW5lX2dseXBoOwotCi0KLSAgICBGVF9PdXRsaW5lX0RvbmUoIEZUX0dMWVBIKCBnbHlwaCApLT5saWJyYXJ5LCAmZ2x5cGgtPm91dGxpbmUgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIGZ0X291dGxpbmVfZ2x5cGhfY29weSggRlRfR2x5cGggIG91dGxpbmVfc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoICBvdXRsaW5lX3RhcmdldCApCi0gIHsKLSAgICBGVF9PdXRsaW5lR2x5cGggIHNvdXJjZSAgPSAoRlRfT3V0bGluZUdseXBoKW91dGxpbmVfc291cmNlOwotICAgIEZUX091dGxpbmVHbHlwaCAgdGFyZ2V0ICA9IChGVF9PdXRsaW5lR2x5cGgpb3V0bGluZV90YXJnZXQ7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvcjsKLSAgICBGVF9MaWJyYXJ5ICAgICAgIGxpYnJhcnkgPSBGVF9HTFlQSCggc291cmNlICktPmxpYnJhcnk7Ci0KLQotICAgIGVycm9yID0gRlRfT3V0bGluZV9OZXcoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpc291cmNlLT5vdXRsaW5lLm5fcG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+b3V0bGluZS5uX2NvbnRvdXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0YXJnZXQtPm91dGxpbmUgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgICBGVF9PdXRsaW5lX0NvcHkoICZzb3VyY2UtPm91dGxpbmUsICZ0YXJnZXQtPm91dGxpbmUgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgZnRfb3V0bGluZV9nbHlwaF90cmFuc2Zvcm0oIEZUX0dseXBoICAgICAgICAgIG91dGxpbmVfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9NYXRyaXgqICBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBkZWx0YSApCi0gIHsKLSAgICBGVF9PdXRsaW5lR2x5cGggIGdseXBoID0gKEZUX091dGxpbmVHbHlwaClvdXRsaW5lX2dseXBoOwotCi0KLSAgICBpZiAoIG1hdHJpeCApCi0gICAgICBGVF9PdXRsaW5lX1RyYW5zZm9ybSggJmdseXBoLT5vdXRsaW5lLCBtYXRyaXggKTsKLQotICAgIGlmICggZGVsdGEgKQotICAgICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoICZnbHlwaC0+b3V0bGluZSwgZGVsdGEtPngsIGRlbHRhLT55ICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIGZ0X291dGxpbmVfZ2x5cGhfYmJveCggRlRfR2x5cGggIG91dGxpbmVfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfQkJveCogIGJib3ggKQotICB7Ci0gICAgRlRfT3V0bGluZUdseXBoICBnbHlwaCA9IChGVF9PdXRsaW5lR2x5cGgpb3V0bGluZV9nbHlwaDsKLQotCi0gICAgRlRfT3V0bGluZV9HZXRfQ0JveCggJmdseXBoLT5vdXRsaW5lLCBiYm94ICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBmdF9vdXRsaW5lX2dseXBoX3ByZXBhcmUoIEZUX0dseXBoICAgICAgb3V0bGluZV9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgIHNsb3QgKQotICB7Ci0gICAgRlRfT3V0bGluZUdseXBoICBnbHlwaCA9IChGVF9PdXRsaW5lR2x5cGgpb3V0bGluZV9nbHlwaDsKLQotCi0gICAgc2xvdC0+Zm9ybWF0ICAgICAgICAgPSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORTsKLSAgICBzbG90LT5vdXRsaW5lICAgICAgICA9IGdseXBoLT5vdXRsaW5lOwotICAgIHNsb3QtPm91dGxpbmUuZmxhZ3MgJj0gfkZUX09VVExJTkVfT1dORVI7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9ERUZJTkVfR0xZUEgoIGZ0X291dGxpbmVfZ2x5cGhfY2xhc3MsCi0gICAgc2l6ZW9mICggRlRfT3V0bGluZUdseXBoUmVjICksCi0gICAgRlRfR0xZUEhfRk9STUFUX09VVExJTkUsCi0KLSAgICBmdF9vdXRsaW5lX2dseXBoX2luaXQsCi0gICAgZnRfb3V0bGluZV9nbHlwaF9kb25lLAotICAgIGZ0X291dGxpbmVfZ2x5cGhfY29weSwKLSAgICBmdF9vdXRsaW5lX2dseXBoX3RyYW5zZm9ybSwKLSAgICBmdF9vdXRsaW5lX2dseXBoX2Jib3gsCi0gICAgZnRfb3V0bGluZV9nbHlwaF9wcmVwYXJlCi0gICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgRlRfR2x5cGggY2xhc3MgYW5kIEFQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICBzdGF0aWMgRlRfRXJyb3IKLSAgIGZ0X25ld19nbHlwaCggRlRfTGlicmFyeSAgICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICBjb25zdCBGVF9HbHlwaF9DbGFzcyogIGNsYXp6LAotICAgICAgICAgICAgICAgICBGVF9HbHlwaCogICAgICAgICAgICAgIGFnbHlwaCApCi0gICB7Ci0gICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotICAgICBGVF9FcnJvciAgIGVycm9yOwotICAgICBGVF9HbHlwaCAgIGdseXBoICA9IE5VTEw7Ci0KLQotICAgICAqYWdseXBoID0gTlVMTDsKLQotICAgICBpZiAoICFGVF9BTExPQyggZ2x5cGgsIGNsYXp6LT5nbHlwaF9zaXplICkgKQotICAgICB7Ci0gICAgICAgZ2x5cGgtPmxpYnJhcnkgPSBsaWJyYXJ5OwotICAgICAgIGdseXBoLT5jbGF6eiAgID0gY2xheno7Ci0gICAgICAgZ2x5cGgtPmZvcm1hdCAgPSBjbGF6ei0+Z2x5cGhfZm9ybWF0OwotCi0gICAgICAgKmFnbHlwaCA9IGdseXBoOwotICAgICB9Ci0KLSAgICAgcmV0dXJuIGVycm9yOwotICAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGdseXBoLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dseXBoX0NvcHkoIEZUX0dseXBoICAgc291cmNlLAotICAgICAgICAgICAgICAgICBGVF9HbHlwaCAgKnRhcmdldCApCi0gIHsKLSAgICBGVF9HbHlwaCAgICAgICAgICAgICAgIGNvcHk7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICAgICBlcnJvcjsKLSAgICBjb25zdCBGVF9HbHlwaF9DbGFzcyogIGNsYXp6OwotCi0KLSAgICAvKiBjaGVjayBhcmd1bWVudHMgKi8KLSAgICBpZiAoICF0YXJnZXQgfHwgIXNvdXJjZSB8fCAhc291cmNlLT5jbGF6eiApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgICp0YXJnZXQgPSBOVUxMOwotCi0gICAgaWYgKCAhc291cmNlIHx8ICFzb3VyY2UtPmNsYXp6ICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgY2xhenogPSBzb3VyY2UtPmNsYXp6OwotICAgIGVycm9yID0gZnRfbmV3X2dseXBoKCBzb3VyY2UtPmxpYnJhcnksIGNsYXp6LCAmY29weSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgY29weS0+YWR2YW5jZSA9IHNvdXJjZS0+YWR2YW5jZTsKLSAgICBjb3B5LT5mb3JtYXQgID0gc291cmNlLT5mb3JtYXQ7Ci0KLSAgICBpZiAoIGNsYXp6LT5nbHlwaF9jb3B5ICkKLSAgICAgIGVycm9yID0gY2xhenotPmdseXBoX2NvcHkoIHNvdXJjZSwgY29weSApOwotCi0gICAgaWYgKCBlcnJvciApCi0gICAgICBGVF9Eb25lX0dseXBoKCBjb3B5ICk7Ci0gICAgZWxzZQotICAgICAgKnRhcmdldCA9IGNvcHk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRnbHlwaC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRfR2x5cGgoIEZUX0dseXBoU2xvdCAgc2xvdCwKLSAgICAgICAgICAgICAgICBGVF9HbHlwaCAgICAgKmFnbHlwaCApCi0gIHsKLSAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5OwotICAgIEZUX0Vycm9yICAgIGVycm9yOwotICAgIEZUX0dseXBoICAgIGdseXBoOwotCi0gICAgY29uc3QgRlRfR2x5cGhfQ2xhc3MqICBjbGF6eiA9IE5VTEw7Ci0KLQotICAgIGlmICggIXNsb3QgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1Nsb3RfSGFuZGxlICk7Ci0KLSAgICBsaWJyYXJ5ID0gc2xvdC0+bGlicmFyeTsKLQotICAgIGlmICggIWFnbHlwaCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIC8qIGlmIGl0IGlzIGEgYml0bWFwLCB0aGF0J3MgZWFzeSA6LSkgKi8KLSAgICBpZiAoIHNsb3QtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQICkKLSAgICAgIGNsYXp6ID0gRlRfQklUTUFQX0dMWVBIX0NMQVNTX0dFVDsKLQotICAgIC8qIGlmIGl0IGlzIGFuIG91dGxpbmUgKi8KLSAgICBlbHNlIGlmICggc2xvdC0+Zm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FICkKLSAgICAgIGNsYXp6ID0gRlRfT1VUTElORV9HTFlQSF9DTEFTU19HRVQ7Ci0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogdHJ5IHRvIGZpbmQgYSByZW5kZXJlciB0aGF0IHN1cHBvcnRzIHRoZSBnbHlwaCBpbWFnZSBmb3JtYXQgKi8KLSAgICAgIEZUX1JlbmRlcmVyICByZW5kZXIgPSBGVF9Mb29rdXBfUmVuZGVyZXIoIGxpYnJhcnksIHNsb3QtPmZvcm1hdCwgMCApOwotCi0KLSAgICAgIGlmICggcmVuZGVyICkKLSAgICAgICAgY2xhenogPSAmcmVuZGVyLT5nbHlwaF9jbGFzczsKLSAgICB9Ci0KLSAgICBpZiAoICFjbGF6eiApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9HbHlwaF9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBjcmVhdGUgRlRfR2x5cGggb2JqZWN0ICovCi0gICAgZXJyb3IgPSBmdF9uZXdfZ2x5cGgoIGxpYnJhcnksIGNsYXp6LCAmZ2x5cGggKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGNvcHkgYWR2YW5jZSB3aGlsZSBjb252ZXJ0aW5nIGl0IHRvIDE2LjE2IGZvcm1hdCAqLwotICAgIGdseXBoLT5hZHZhbmNlLnggPSBzbG90LT5hZHZhbmNlLnggPDwgMTA7Ci0gICAgZ2x5cGgtPmFkdmFuY2UueSA9IHNsb3QtPmFkdmFuY2UueSA8PCAxMDsKLQotICAgIC8qIG5vdyBpbXBvcnQgdGhlIGltYWdlIGZyb20gdGhlIGdseXBoIHNsb3QgKi8KLSAgICBlcnJvciA9IGNsYXp6LT5nbHlwaF9pbml0KCBnbHlwaCwgc2xvdCApOwotCi0gICAgLyogaWYgYW4gZXJyb3Igb2NjdXJyZWQsIGRlc3Ryb3kgdGhlIGdseXBoICovCi0gICAgaWYgKCBlcnJvciApCi0gICAgICBGVF9Eb25lX0dseXBoKCBnbHlwaCApOwotICAgIGVsc2UKLSAgICAgICphZ2x5cGggPSBnbHlwaDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGdseXBoLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dseXBoX1RyYW5zZm9ybSggRlRfR2x5cGggICAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTWF0cml4KiAgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGRlbHRhICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0gICAgaWYgKCAhZ2x5cGggfHwgIWdseXBoLT5jbGF6eiApCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNvbnN0IEZUX0dseXBoX0NsYXNzKiAgY2xhenogPSBnbHlwaC0+Y2xheno7Ci0KLQotICAgICAgaWYgKCBjbGF6ei0+Z2x5cGhfdHJhbnNmb3JtICkKLSAgICAgIHsKLSAgICAgICAgLyogdHJhbnNmb3JtIGdseXBoIGltYWdlICovCi0gICAgICAgIGNsYXp6LT5nbHlwaF90cmFuc2Zvcm0oIGdseXBoLCBtYXRyaXgsIGRlbHRhICk7Ci0KLSAgICAgICAgLyogdHJhbnNmb3JtIGFkdmFuY2UgdmVjdG9yICovCi0gICAgICAgIGlmICggbWF0cml4ICkKLSAgICAgICAgICBGVF9WZWN0b3JfVHJhbnNmb3JtKCAmZ2x5cGgtPmFkdmFuY2UsIG1hdHJpeCApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0dseXBoX0Zvcm1hdCApOwotICAgIH0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRnbHlwaC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX0dseXBoX0dldF9DQm94KCBGVF9HbHlwaCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgYmJveF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgRlRfQkJveCAgKmFjYm94ICkKLSAgewotICAgIGNvbnN0IEZUX0dseXBoX0NsYXNzKiAgY2xheno7Ci0KLQotICAgIGlmICggIWFjYm94ICkKLSAgICAgIHJldHVybjsKLQotICAgIGFjYm94LT54TWluID0gYWNib3gtPnlNaW4gPSBhY2JveC0+eE1heCA9IGFjYm94LT55TWF4ID0gMDsKLQotICAgIGlmICggIWdseXBoIHx8ICFnbHlwaC0+Y2xhenogKQotICAgICAgcmV0dXJuOwotCi0gICAgY2xhenogPSBnbHlwaC0+Y2xheno7Ci0gICAgaWYgKCAhY2xhenotPmdseXBoX2Jib3ggKQotICAgICAgcmV0dXJuOwotCi0gICAgLyogcmV0cmlldmUgYmJveCBpbiAyNi42IGNvb3JkaW5hdGVzICovCi0gICAgY2xhenotPmdseXBoX2Jib3goIGdseXBoLCBhY2JveCApOwotCi0gICAgLyogcGVyZm9ybSBncmlkIGZpdHRpbmcgaWYgbmVlZGVkICovCi0gICAgaWYgKCBiYm94X21vZGUgPT0gRlRfR0xZUEhfQkJPWF9HUklERklUIHx8Ci0gICAgICAgICBiYm94X21vZGUgPT0gRlRfR0xZUEhfQkJPWF9QSVhFTFMgICkKLSAgICB7Ci0gICAgICBhY2JveC0+eE1pbiA9IEZUX1BJWF9GTE9PUiggYWNib3gtPnhNaW4gKTsKLSAgICAgIGFjYm94LT55TWluID0gRlRfUElYX0ZMT09SKCBhY2JveC0+eU1pbiApOwotICAgICAgYWNib3gtPnhNYXggPSBGVF9QSVhfQ0VJTCggYWNib3gtPnhNYXggKTsKLSAgICAgIGFjYm94LT55TWF4ID0gRlRfUElYX0NFSUwoIGFjYm94LT55TWF4ICk7Ci0gICAgfQotCi0gICAgLyogY29udmVydCB0byBpbnRlZ2VyIHBpeGVscyBpZiBuZWVkZWQgKi8KLSAgICBpZiAoIGJib3hfbW9kZSA9PSBGVF9HTFlQSF9CQk9YX1RSVU5DQVRFIHx8Ci0gICAgICAgICBiYm94X21vZGUgPT0gRlRfR0xZUEhfQkJPWF9QSVhFTFMgICApCi0gICAgewotICAgICAgYWNib3gtPnhNaW4gPj49IDY7Ci0gICAgICBhY2JveC0+eU1pbiA+Pj0gNjsKLSAgICAgIGFjYm94LT54TWF4ID4+PSA2OwotICAgICAgYWNib3gtPnlNYXggPj49IDY7Ci0gICAgfQotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Z2x5cGguaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2x5cGhfVG9fQml0bWFwKCBGVF9HbHlwaCogICAgICAgdGhlX2dseXBoLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICByZW5kZXJfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAgICAgb3JpZ2luLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICBkZXN0cm95ICkKLSAgewotICAgIEZUX0dseXBoU2xvdFJlYyAgICAgICAgICAgZHVtbXk7Ci0gICAgRlRfR2x5cGhTbG90X0ludGVybmFsUmVjICBkdW1teV9pbnRlcm5hbDsKLSAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX0dseXBoICAgICAgICAgICAgICAgICAgYiwgZ2x5cGg7Ci0gICAgRlRfQml0bWFwR2x5cGggICAgICAgICAgICBiaXRtYXAgPSBOVUxMOwotICAgIGNvbnN0IEZUX0dseXBoX0NsYXNzKiAgICAgY2xheno7Ci0KLSAgICAvKiBGVF9CSVRNQVBfR0xZUEhfQ0xBU1NfR0VUIGRlcmVmZXJlbmNlcyBgbGlicmFyeScgaW4gUElDIG1vZGUgKi8KLSAgICBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgIGxpYnJhcnk7Ci0KLQotICAgIC8qIGNoZWNrIGFyZ3VtZW50ICovCi0gICAgaWYgKCAhdGhlX2dseXBoICkKLSAgICAgIGdvdG8gQmFkOwotICAgIGdseXBoID0gKnRoZV9nbHlwaDsKLSAgICBpZiAoICFnbHlwaCApCi0gICAgICBnb3RvIEJhZDsKLQotICAgIGNsYXp6ICAgPSBnbHlwaC0+Y2xheno7Ci0gICAgbGlicmFyeSA9IGdseXBoLT5saWJyYXJ5OwotICAgIGlmICggIWxpYnJhcnkgfHwgIWNsYXp6ICkKLSAgICAgIGdvdG8gQmFkOwotCi0gICAgLyogd2hlbiBjYWxsZWQgd2l0aCBhIGJpdG1hcCBnbHlwaCwgZG8gbm90aGluZyBhbmQgcmV0dXJuIHN1Y2Nlc3NmdWxseSAqLwotICAgIGlmICggY2xhenogPT0gRlRfQklUTUFQX0dMWVBIX0NMQVNTX0dFVCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoICFjbGF6ei0+Z2x5cGhfcHJlcGFyZSApCi0gICAgICBnb3RvIEJhZDsKLQotICAgIC8qIHdlIHJlbmRlciB0aGUgZ2x5cGggaW50byBhIGdseXBoIGJpdG1hcCB1c2luZyBhIGBkdW1teScgZ2x5cGggc2xvdCAqLwotICAgIC8qIHRoZW4gY2FsbGluZyBGVF9SZW5kZXJfR2x5cGhfSW50ZXJuYWwoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgRlRfTUVNX1pFUk8oICZkdW1teSwgc2l6ZW9mICggZHVtbXkgKSApOwotICAgIEZUX01FTV9aRVJPKCAmZHVtbXlfaW50ZXJuYWwsIHNpemVvZiAoIGR1bW15X2ludGVybmFsICkgKTsKLSAgICBkdW1teS5pbnRlcm5hbCA9ICZkdW1teV9pbnRlcm5hbDsKLSAgICBkdW1teS5saWJyYXJ5ICA9IGxpYnJhcnk7Ci0gICAgZHVtbXkuZm9ybWF0ICAgPSBjbGF6ei0+Z2x5cGhfZm9ybWF0OwotCi0gICAgLyogY3JlYXRlIHJlc3VsdCBiaXRtYXAgZ2x5cGggKi8KLSAgICBlcnJvciA9IGZ0X25ld19nbHlwaCggbGlicmFyeSwgRlRfQklUTUFQX0dMWVBIX0NMQVNTX0dFVCwgJmIgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLSAgICBiaXRtYXAgPSAoRlRfQml0bWFwR2x5cGgpYjsKLQotI2lmIDEKLSAgICAvKiBpZiBgb3JpZ2luJyBpcyBzZXQsIHRyYW5zbGF0ZSB0aGUgZ2x5cGggaW1hZ2UgKi8KLSAgICBpZiAoIG9yaWdpbiApCi0gICAgICBGVF9HbHlwaF9UcmFuc2Zvcm0oIGdseXBoLCAwLCBvcmlnaW4gKTsKLSNlbHNlCi0gICAgRlRfVU5VU0VEKCBvcmlnaW4gKTsKLSNlbmRpZgotCi0gICAgLyogcHJlcGFyZSBkdW1teSBzbG90IGZvciByZW5kZXJpbmcgKi8KLSAgICBlcnJvciA9IGNsYXp6LT5nbHlwaF9wcmVwYXJlKCBnbHlwaCwgJmR1bW15ICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgZXJyb3IgPSBGVF9SZW5kZXJfR2x5cGhfSW50ZXJuYWwoIGdseXBoLT5saWJyYXJ5LCAmZHVtbXksIHJlbmRlcl9tb2RlICk7Ci0KLSNpZiAxCi0gICAgaWYgKCAhZGVzdHJveSAmJiBvcmlnaW4gKQotICAgIHsKLSAgICAgIEZUX1ZlY3RvciAgdjsKLQotCi0gICAgICB2LnggPSAtb3JpZ2luLT54OwotICAgICAgdi55ID0gLW9yaWdpbi0+eTsKLSAgICAgIEZUX0dseXBoX1RyYW5zZm9ybSggZ2x5cGgsIDAsICZ2ICk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGluIGNhc2Ugb2Ygc3VjY2VzcywgY29weSB0aGUgYml0bWFwIHRvIHRoZSBnbHlwaCBiaXRtYXAgKi8KLSAgICBlcnJvciA9IGZ0X2JpdG1hcF9nbHlwaF9pbml0KCAoRlRfR2x5cGgpYml0bWFwLCAmZHVtbXkgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGNvcHkgYWR2YW5jZSAqLwotICAgIGJpdG1hcC0+cm9vdC5hZHZhbmNlID0gZ2x5cGgtPmFkdmFuY2U7Ci0KLSAgICBpZiAoIGRlc3Ryb3kgKQotICAgICAgRlRfRG9uZV9HbHlwaCggZ2x5cGggKTsKLQotICAgICp0aGVfZ2x5cGggPSBGVF9HTFlQSCggYml0bWFwICk7Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGVycm9yICYmIGJpdG1hcCApCi0gICAgICBGVF9Eb25lX0dseXBoKCBGVF9HTFlQSCggYml0bWFwICkgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLQotICBCYWQ6Ci0gICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgIGdvdG8gRXhpdDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGdseXBoLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfRG9uZV9HbHlwaCggRlRfR2x5cGggIGdseXBoICkKLSAgewotICAgIGlmICggZ2x5cGggKQotICAgIHsKLSAgICAgIEZUX01lbW9yeSAgICAgICAgICAgICAgbWVtb3J5ID0gZ2x5cGgtPmxpYnJhcnktPm1lbW9yeTsKLSAgICAgIGNvbnN0IEZUX0dseXBoX0NsYXNzKiAgY2xhenogID0gZ2x5cGgtPmNsYXp6OwotCi0KLSAgICAgIGlmICggY2xhenotPmdseXBoX2RvbmUgKQotICAgICAgICBjbGF6ei0+Z2x5cGhfZG9uZSggZ2x5cGggKTsKLQotICAgICAgRlRfRlJFRSggZ2x5cGggKTsKLSAgICB9Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0Z3h2YWwuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0Z3h2YWwuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg4NjhmMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGd4dmFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRneHZhbC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgdmFsaWRhdGluZyBUcnVlVHllcEdYL0FBVCB0YWJsZXMgKGJvZHkpLiAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNYXNhdGFrZSBZQU1BVE8sIFJlZGhhdCBLLkssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogZ3h2YWxpZCBpcyBkZXJpdmVkIGZyb20gYm90aCBneGxheW91dCBtb2R1bGUgYW5kIG90dmFsaWQgbW9kdWxlLiAgICAgICAgKi8KLS8qIERldmVsb3BtZW50IG9mIGd4bGF5b3V0IGlzIHN1cHBvcnRlZCBieSB0aGUgSW5mb3JtYXRpb24tdGVjaG5vbG9neSAgICAgICovCi0vKiBQcm9tb3Rpb24gQWdlbmN5KElQQSksIEphcGFuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9HWF9WQUxJREFURV9ICi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0Z3h2YWwuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfVHJ1ZVR5cGVHWF9WYWxpZGF0ZSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICB2YWxpZGF0aW9uX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgdGFibGVzW0ZUX1ZBTElEQVRFX0dYX0xFTkdUSF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICB0YWJsZV9sZW5ndGggKQotICB7Ci0gICAgRlRfU2VydmljZV9HWHZhbGlkYXRlICBzZXJ2aWNlOwotICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgZXJyb3I7Ci0KLQotICAgIGlmICggIWZhY2UgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoICF0YWJsZXMgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBGVF9GQUNFX0ZJTkRfR0xPQkFMX1NFUlZJQ0UoIGZhY2UsIHNlcnZpY2UsIEdYX1ZBTElEQVRFICk7Ci0KLSAgICBpZiAoIHNlcnZpY2UgKQotICAgICAgZXJyb3IgPSBzZXJ2aWNlLT52YWxpZGF0ZSggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25fZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9sZW5ndGggKTsKLSAgICBlbHNlCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX1RydWVUeXBlR1hfRnJlZSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZXMgIHRhYmxlICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybjsKLQotICAgIG1lbW9yeSA9IEZUX0ZBQ0VfTUVNT1JZKCBmYWNlICk7Ci0KLSAgICBGVF9GUkVFKCB0YWJsZSApOwotICB9Ci0KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0NsYXNzaWNLZXJuX1ZhbGlkYXRlKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIHZhbGlkYXRpb25fZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgKmNrZXJuX3RhYmxlICkKLSAgewotICAgIEZUX1NlcnZpY2VfQ0tFUk52YWxpZGF0ZSAgc2VydmljZTsKLSAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgIGVycm9yOwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCAhY2tlcm5fdGFibGUgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBGVF9GQUNFX0ZJTkRfR0xPQkFMX1NFUlZJQ0UoIGZhY2UsIHNlcnZpY2UsIENMQVNTSUNLRVJOX1ZBTElEQVRFICk7Ci0KLSAgICBpZiAoIHNlcnZpY2UgKQotICAgICAgZXJyb3IgPSBzZXJ2aWNlLT52YWxpZGF0ZSggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25fZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBja2Vybl90YWJsZSApOwotICAgIGVsc2UKLSAgICAgIGVycm9yID0gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfQ2xhc3NpY0tlcm5fRnJlZSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICB0YWJsZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm47Ci0KLSAgICBtZW1vcnkgPSBGVF9GQUNFX01FTU9SWSggZmFjZSApOwotCi0KLSAgICBGVF9GUkVFKCB0YWJsZSApOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdGluaXQuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0aW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjVhOTFkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0aW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0aW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBpbml0aWFsaXphdGlvbiBsYXllciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBmaWxlIGlzIHRvIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHR3byAgICAgICAgICAgKi8KLSAgLyogIGZ1bmN0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgRlRfQWRkX0RlZmF1bHRfTW9kdWxlcygpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhZGQgdGhlIHNldCBvZiBkZWZhdWx0IG1vZHVsZXMgdG8gYSAgICAgICovCi0gIC8qICAgICBmcmVzaCBuZXcgbGlicmFyeSBvYmplY3QuICBUaGUgc2V0IGlzIHRha2VuIGZyb20gdGhlIGhlYWRlciBmaWxlICAqLwotICAvKiAgICAgYGZyZWV0eXBlL2NvbmZpZy9mdG1vZHVsZS5oJy4gIFNlZSB0aGUgZG9jdW1lbnQgYEZyZWVUeXBlIDIuMCAgICAgKi8KLSAgLyogICAgIEJ1aWxkIFN5c3RlbScgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgRlRfSW5pdF9GcmVlVHlwZSgpOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIHN5c3RlbSBvYmplY3QgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLCAgICovCi0gIC8qICAgICBidWlsZHMgYSBsaWJyYXJ5IG91dCBvZiBpdCwgdGhlbiBjYWxscyBGVF9EZWZhdWx0X0RyaXZlcnMoKS4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIE5vdGUgdGhhdCBldmVuIGlmIEZUX0luaXRfRnJlZVR5cGUoKSB1c2VzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgICovCi0gIC8qICBzeXN0ZW0gb2JqZWN0IGRlZmluZWQgYXQgYnVpbGQgdGltZSwgY2xpZW50IGFwcGxpY2F0aW9ucyBhcmUgc3RpbGwgICAqLwotICAvKiAgYWJsZSB0byBwcm92aWRlIHRoZWlyIG93biBgZnRzeXN0ZW0uYycuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX01PRFVMRV9ICi0jaW5jbHVkZSAiYmFzZXBpYy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfaW5pdAotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotCi0jdW5kZWYgIEZUX1VTRV9NT0RVTEUKLSNpZmRlZiBfX2NwbHVzcGx1cwotI2RlZmluZSBGVF9VU0VfTU9EVUxFKCB0eXBlLCB4ICkgIGV4dGVybiAiQyIgY29uc3QgdHlwZSAgeDsKLSNlbHNlCi0jZGVmaW5lIEZUX1VTRV9NT0RVTEUoIHR5cGUsIHggKSAgZXh0ZXJuIGNvbnN0IHR5cGUgIHg7Ci0jZW5kaWYKLQotI2luY2x1ZGUgRlRfQ09ORklHX01PRFVMRVNfSAotCi0jdW5kZWYgIEZUX1VTRV9NT0RVTEUKLSNkZWZpbmUgRlRfVVNFX01PRFVMRSggdHlwZSwgeCApICAoY29uc3QgRlRfTW9kdWxlX0NsYXNzKikmKHgpLAotCi0gIHN0YXRpYwotICBjb25zdCBGVF9Nb2R1bGVfQ2xhc3MqICBjb25zdCBmdF9kZWZhdWx0X21vZHVsZXNbXSA9Ci0gIHsKLSNpbmNsdWRlIEZUX0NPTkZJR19NT0RVTEVTX0gKLSAgICAwCi0gIH07Ci0KLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgRlRfRVhURVJOQyAgZXh0ZXJuICJDIgotI2Vsc2UKLSNkZWZpbmUgRlRfRVhURVJOQyAgZXh0ZXJuCi0jZW5kaWYKLQotICAvKiBkZWNsYXJlIHRoZSBtb2R1bGUncyBjbGFzcyBjcmVhdGlvbi9kZXN0cnVjdGlvbiBmdW5jdGlvbnMgKi8KLSN1bmRlZiAgRlRfVVNFX01PRFVMRQotI2RlZmluZSBGVF9VU0VfTU9EVUxFKCB0eXBlLCB4ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FWFRFUk5DIEZUX0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9DcmVhdGVfQ2xhc3NfICMjIHgoIEZUX0xpYnJhcnkgICAgICAgICBsaWJyYXJ5LCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01vZHVsZV9DbGFzcyogICpvdXRwdXRfY2xhc3MgKTsgXAotICBGVF9FWFRFUk5DIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9EZXN0cm95X0NsYXNzXyAjIyB4KCBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5LCAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGVfQ2xhc3MqICBjbGF6eiApOwotCi0jaW5jbHVkZSBGVF9DT05GSUdfTU9EVUxFU19ICi0KLSAgLyogY291bnQgYWxsIG1vZHVsZSBjbGFzc2VzICovCi0jdW5kZWYgIEZUX1VTRV9NT0RVTEUKLSNkZWZpbmUgRlRfVVNFX01PRFVMRSggdHlwZSwgeCApICBNT0RVTEVfQ0xBU1NfICMjIHgsCi0KLSAgZW51bQotICB7Ci0jaW5jbHVkZSBGVF9DT05GSUdfTU9EVUxFU19ICi0gICAgRlRfTlVNX01PRFVMRV9DTEFTU0VTCi0gIH07Ci0KLSAgLyogZGVzdHJveSBhbGwgbW9kdWxlIGNsYXNzZXMgKi8KLSN1bmRlZiAgRlRfVVNFX01PRFVMRQotI2RlZmluZSBGVF9VU0VfTU9EVUxFKCB0eXBlLCB4ICkgICAgICAgICAgICAgICAgICAgXAotICBpZiAoIGNsYXNzZXNbaV0gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX0Rlc3Ryb3lfQ2xhc3NfICMjIHgoIGxpYnJhcnksIGNsYXNzZXNbaV0gKTsgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpKys7Ci0KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIGZ0X2Rlc3Ryb3lfZGVmYXVsdF9tb2R1bGVfY2xhc3NlcyggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9Nb2R1bGVfQ2xhc3MqICAqY2xhc3NlczsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5OwotICAgIEZUX1VJbnQgICAgICAgICAgICBpOwotICAgIEJhc2VQSUMqICAgICAgICAgICBwaWNfY29udGFpbmVyID0gKEJhc2VQSUMqKWxpYnJhcnktPnBpY19jb250YWluZXIuYmFzZTsKLQotCi0gICAgaWYgKCAhcGljX2NvbnRhaW5lci0+ZGVmYXVsdF9tb2R1bGVfY2xhc3NlcyApCi0gICAgICByZXR1cm47Ci0KLSAgICBtZW1vcnkgID0gbGlicmFyeS0+bWVtb3J5OwotICAgIGNsYXNzZXMgPSBwaWNfY29udGFpbmVyLT5kZWZhdWx0X21vZHVsZV9jbGFzc2VzOwotICAgIGkgICAgICAgPSAwOwotCi0jaW5jbHVkZSBGVF9DT05GSUdfTU9EVUxFU19ICi0KLSAgICBGVF9GUkVFKCBjbGFzc2VzICk7Ci0gICAgcGljX2NvbnRhaW5lci0+ZGVmYXVsdF9tb2R1bGVfY2xhc3NlcyA9IE5VTEw7Ci0gIH0KLQotCi0gIC8qIGluaXRpYWxpemUgYWxsIG1vZHVsZSBjbGFzc2VzIGFuZCB0aGUgcG9pbnRlciB0YWJsZSAqLwotI3VuZGVmICBGVF9VU0VfTU9EVUxFCi0jZGVmaW5lIEZUX1VTRV9NT0RVTEUoIHR5cGUsIHggKSAgICAgICAgICAgICAgICAgICAgIFwKLSAgZXJyb3IgPSBGVF9DcmVhdGVfQ2xhc3NfICMjIHgoIGxpYnJhcnksICZjbGF6eiApOyAgXAotICBpZiAoIGVycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ290byBFeGl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY2xhc3Nlc1tpKytdID0gY2xheno7Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBmdF9jcmVhdGVfZGVmYXVsdF9tb2R1bGVfY2xhc3NlcyggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeTsKLSAgICBGVF9Nb2R1bGVfQ2xhc3MqICAqY2xhc3NlcyA9IE5VTEw7Ci0gICAgRlRfTW9kdWxlX0NsYXNzKiAgIGNsYXp6OwotICAgIEZUX1VJbnQgICAgICAgICAgICBpOwotICAgIEJhc2VQSUMqICAgICAgICAgICBwaWNfY29udGFpbmVyID0gKEJhc2VQSUMqKWxpYnJhcnktPnBpY19jb250YWluZXIuYmFzZTsKLQotCi0gICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0gICAgcGljX2NvbnRhaW5lci0+ZGVmYXVsdF9tb2R1bGVfY2xhc3NlcyA9IE5VTEw7Ci0KLSAgICBpZiAoIEZUX0FMTE9DKCBjbGFzc2VzLCBzaXplb2YgKCBGVF9Nb2R1bGVfQ2xhc3MqICkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBGVF9OVU1fTU9EVUxFX0NMQVNTRVMgKyAxICkgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBpbml0aWFsaXplIGFsbCBwb2ludGVycyB0byAwLCBlc3BlY2lhbGx5IHRoZSBsYXN0IG9uZSAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgRlRfTlVNX01PRFVMRV9DTEFTU0VTOyBpKysgKQotICAgICAgY2xhc3Nlc1tpXSA9IE5VTEw7Ci0gICAgY2xhc3Nlc1tGVF9OVU1fTU9EVUxFX0NMQVNTRVNdID0gTlVMTDsKLQotICAgIGkgPSAwOwotCi0jaW5jbHVkZSBGVF9DT05GSUdfTU9EVUxFU19ICi0KLSAgRXhpdDoKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGZ0X2Rlc3Ryb3lfZGVmYXVsdF9tb2R1bGVfY2xhc3NlcyggbGlicmFyeSApOwotICAgIGVsc2UKLSAgICAgIHBpY19jb250YWluZXItPmRlZmF1bHRfbW9kdWxlX2NsYXNzZXMgPSBjbGFzc2VzOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bW9kYXBpLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfQWRkX0RlZmF1bHRfTW9kdWxlcyggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I7Ci0gICAgY29uc3QgRlRfTW9kdWxlX0NsYXNzKiBjb25zdCogIGN1cjsKLQotCi0gICAgLyogRlRfREVGQVVMVF9NT0RVTEVTX0dFVCBkZXJlZmVyZW5jZXMgYGxpYnJhcnknIGluIFBJQyBtb2RlICovCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybjsKLSNlbmRpZgotCi0gICAgLyogR0NDIDQuNiB3YXJucyB0aGUgdHlwZSBkaWZmZXJlbmNlOgotICAgICAqICAgRlRfTW9kdWxlX0NsYXNzKiogIT0gY29uc3QgRlRfTW9kdWxlX0NsYXNzKiBjb25zdCoKLSAgICAgKi8KLSAgICBjdXIgPSAoY29uc3QgRlRfTW9kdWxlX0NsYXNzKiBjb25zdCopRlRfREVGQVVMVF9NT0RVTEVTX0dFVDsKLQotICAgIC8qIHRlc3QgZm9yIHZhbGlkIGBsaWJyYXJ5JyBkZWxheWVkIHRvIEZUX0FkZF9Nb2R1bGUoKSAqLwotICAgIHdoaWxlICggKmN1ciApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9BZGRfTW9kdWxlKCBsaWJyYXJ5LCAqY3VyICk7Ci0gICAgICAvKiBub3RpZnkgZXJyb3JzLCBidXQgZG9uJ3Qgc3RvcCAqLwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIEZUX1RSQUNFMCgoICJGVF9BZGRfRGVmYXVsdF9Nb2R1bGU6IgotICAgICAgICAgICAgICAgICAgICAiIENhbm5vdCBpbnN0YWxsIGAlcycsIGVycm9yID0gMHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgKCpjdXIpLT5tb2R1bGVfbmFtZSwgZXJyb3IgKSk7Ci0gICAgICBjdXIrKzsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfSW5pdF9GcmVlVHlwZSggRlRfTGlicmFyeSAgKmFsaWJyYXJ5ICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0KLQotICAgIC8qIGNoZWNrIG9mIGBhbGlicmFyeScgZGVsYXllZCB0byBgRlRfTmV3X0xpYnJhcnknICovCi0KLSAgICAvKiBGaXJzdCBvZiBhbGwsIGFsbG9jYXRlIGEgbmV3IHN5c3RlbSBvYmplY3QgLS0gdGhpcyBmdW5jdGlvbiBpcyBwYXJ0ICovCi0gICAgLyogb2YgdGhlIHN5c3RlbS1zcGVjaWZpYyBjb21wb25lbnQsIGkuZS4gYGZ0c3lzdGVtLmMnLiAgICAgICAgICAgICAgICAqLwotCi0gICAgbWVtb3J5ID0gRlRfTmV3X01lbW9yeSgpOwotICAgIGlmICggIW1lbW9yeSApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiRlRfSW5pdF9GcmVlVHlwZTogY2Fubm90IGZpbmQgbWVtb3J5IG1hbmFnZXJcbiIgKSk7Ci0gICAgICByZXR1cm4gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotICAgIH0KLQotICAgIC8qIGJ1aWxkIGEgbGlicmFyeSBvdXQgb2YgaXQsIHRoZW4gZmlsbCBpdCB3aXRoIHRoZSBzZXQgb2YgKi8KLSAgICAvKiBkZWZhdWx0IGRyaXZlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBlcnJvciA9IEZUX05ld19MaWJyYXJ5KCBtZW1vcnksIGFsaWJyYXJ5ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBGVF9Eb25lX01lbW9yeSggbWVtb3J5ICk7Ci0gICAgZWxzZQotICAgICAgRlRfQWRkX0RlZmF1bHRfTW9kdWxlcyggKmFsaWJyYXJ5ICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfRG9uZV9GcmVlVHlwZSggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLQotCi0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfTGlicmFyeV9IYW5kbGUgKTsKLQotICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLQotICAgIC8qIERpc2NhcmQgdGhlIGxpYnJhcnkgb2JqZWN0ICovCi0gICAgRlRfRG9uZV9MaWJyYXJ5KCBsaWJyYXJ5ICk7Ci0KLSAgICAvKiBkaXNjYXJkIG1lbW9yeSBtYW5hZ2VyICovCi0gICAgRlRfRG9uZV9NZW1vcnkoIG1lbW9yeSApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRsY2RmaWwuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0bGNkZmlsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNmY3ZTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRsY2RmaWwuYworKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdGxjZGZpbC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBjb2xvciBmaWx0ZXJpbmcgb2Ygc3VicGl4ZWwgYml0bWFwIGdseXBocyAoYm9keSkuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0jaW5jbHVkZSBGVF9MQ0RfRklMVEVSX0gKLSNpbmNsdWRlIEZUX0lNQUdFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORwotCi0vKiBkZWZpbmUgVVNFX0xFR0FDWSB0byBpbXBsZW1lbnQgdGhlIGxlZ2FjeSBmaWx0ZXIgKi8KLSNkZWZpbmUgIFVTRV9MRUdBQ1kKLQotICAvKiBGSVIgZmlsdGVyIHVzZWQgYnkgdGhlIGRlZmF1bHQgYW5kIGxpZ2h0IGZpbHRlcnMgKi8KLSAgc3RhdGljIHZvaWQKLSAgX2Z0X2xjZF9maWx0ZXJfZmlyKCBGVF9CaXRtYXAqICAgICAgYml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xpYnJhcnkgICAgICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX0J5dGUqICB3ZWlnaHRzID0gbGlicmFyeS0+bGNkX3dlaWdodHM7Ci0gICAgRlRfVUludCAgIHdpZHRoICAgPSAoRlRfVUludCliaXRtYXAtPndpZHRoOwotICAgIEZUX1VJbnQgICBoZWlnaHQgID0gKEZUX1VJbnQpYml0bWFwLT5yb3dzOwotCi0KLSAgICAvKiBob3Jpem9udGFsIGluLXBsYWNlIEZJUiBmaWx0ZXIgKi8KLSAgICBpZiAoIG1vZGUgPT0gRlRfUkVOREVSX01PREVfTENEICYmIHdpZHRoID49IDQgKQotICAgIHsKLSAgICAgIEZUX0J5dGUqICBsaW5lID0gYml0bWFwLT5idWZmZXI7Ci0KLQotICAgICAgLyogdGFrZSBjYXJlIG9mIGJpdG1hcCBmbG93ICovCi0gICAgICBpZiAoIGJpdG1hcC0+cGl0Y2ggPCAwICkKLSAgICAgICAgbGluZSAtPSBiaXRtYXAtPnBpdGNoICogKEZUX0ludCkoIGJpdG1hcC0+cm93cyAtIDEgKTsKLQotICAgICAgLyogYGZpcicgYW5kIGBwaXgnIG11c3QgYmUgYXQgbGVhc3QgMzIgYml0IHdpZGUsIHNpbmNlIHRoZSBzdW0gb2YgKi8KLSAgICAgIC8qIHRoZSB2YWx1ZXMgaW4gYHdlaWdodHMnIGNhbiBleGNlZWQgMHhGRiAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIGZvciAoIDsgaGVpZ2h0ID4gMDsgaGVpZ2h0LS0sIGxpbmUgKz0gYml0bWFwLT5waXRjaCApCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIGZpcls0XTsgICAgICAgIC8qIGJlbG93LCBgcGl4JyBpcyB1c2VkIGFzIHRoZSA1dGggZWxlbWVudCAqLwotICAgICAgICBGVF9VSW50ICB2YWwxLCB4eDsKLQotCi0gICAgICAgIHZhbDEgICA9IGxpbmVbMF07Ci0gICAgICAgIGZpclswXSA9IHdlaWdodHNbMl0gKiB2YWwxOwotICAgICAgICBmaXJbMV0gPSB3ZWlnaHRzWzNdICogdmFsMTsKLSAgICAgICAgZmlyWzJdID0gd2VpZ2h0c1s0XSAqIHZhbDE7Ci0gICAgICAgIGZpclszXSA9IDA7Ci0KLSAgICAgICAgdmFsMSAgICA9IGxpbmVbMV07Ci0gICAgICAgIGZpclswXSArPSB3ZWlnaHRzWzFdICogdmFsMTsKLSAgICAgICAgZmlyWzFdICs9IHdlaWdodHNbMl0gKiB2YWwxOwotICAgICAgICBmaXJbMl0gKz0gd2VpZ2h0c1szXSAqIHZhbDE7Ci0gICAgICAgIGZpclszXSArPSB3ZWlnaHRzWzRdICogdmFsMTsKLQotICAgICAgICBmb3IgKCB4eCA9IDI7IHh4IDwgd2lkdGg7IHh4KysgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUludCAgdmFsLCBwaXg7Ci0KLQotICAgICAgICAgIHZhbCAgICA9IGxpbmVbeHhdOwotICAgICAgICAgIHBpeCAgICA9IGZpclswXSArIHdlaWdodHNbMF0gKiB2YWw7Ci0gICAgICAgICAgZmlyWzBdID0gZmlyWzFdICsgd2VpZ2h0c1sxXSAqIHZhbDsKLSAgICAgICAgICBmaXJbMV0gPSBmaXJbMl0gKyB3ZWlnaHRzWzJdICogdmFsOwotICAgICAgICAgIGZpclsyXSA9IGZpclszXSArIHdlaWdodHNbM10gKiB2YWw7Ci0gICAgICAgICAgZmlyWzNdID0gICAgICAgICAgd2VpZ2h0c1s0XSAqIHZhbDsKLQotICAgICAgICAgIHBpeCAgICAgICAgPj49IDg7Ci0gICAgICAgICAgcGl4ICAgICAgICAgfD0gKEZUX1VJbnQpLShGVF9JbnQpKCBwaXggPj4gOCApOwotICAgICAgICAgIGxpbmVbeHggLSAyXSA9IChGVF9CeXRlKXBpeDsKLSAgICAgICAgfQotCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50ICBwaXg7Ci0KLQotICAgICAgICAgIHBpeCAgICAgICAgICA9IGZpclswXSA+PiA4OwotICAgICAgICAgIHBpeCAgICAgICAgIHw9IChGVF9VSW50KS0oRlRfSW50KSggcGl4ID4+IDggKTsKLSAgICAgICAgICBsaW5lW3h4IC0gMl0gPSAoRlRfQnl0ZSlwaXg7Ci0KLSAgICAgICAgICBwaXggICAgICAgICAgPSBmaXJbMV0gPj4gODsKLSAgICAgICAgICBwaXggICAgICAgICB8PSAoRlRfVUludCktKEZUX0ludCkoIHBpeCA+PiA4ICk7Ci0gICAgICAgICAgbGluZVt4eCAtIDFdID0gKEZUX0J5dGUpcGl4OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogdmVydGljYWwgaW4tcGxhY2UgRklSIGZpbHRlciAqLwotICAgIGVsc2UgaWYgKCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRF9WICYmIGhlaWdodCA+PSA0ICkKLSAgICB7Ci0gICAgICBGVF9CeXRlKiAgY29sdW1uID0gYml0bWFwLT5idWZmZXI7Ci0gICAgICBGVF9JbnQgICAgcGl0Y2ggID0gYml0bWFwLT5waXRjaDsKLQotCi0gICAgICAvKiB0YWtlIGNhcmUgb2YgYml0bWFwIGZsb3cgKi8KLSAgICAgIGlmICggYml0bWFwLT5waXRjaCA8IDAgKQotICAgICAgICBjb2x1bW4gLT0gYml0bWFwLT5waXRjaCAqIChGVF9JbnQpKCBiaXRtYXAtPnJvd3MgLSAxICk7Ci0KLSAgICAgIGZvciAoIDsgd2lkdGggPiAwOyB3aWR0aC0tLCBjb2x1bW4rKyApCi0gICAgICB7Ci0gICAgICAgIEZUX0J5dGUqICBjb2wgPSBjb2x1bW47Ci0gICAgICAgIEZUX1VJbnQgICBmaXJbNF07ICAgICAgIC8qIGJlbG93LCBgcGl4JyBpcyB1c2VkIGFzIHRoZSA1dGggZWxlbWVudCAqLwotICAgICAgICBGVF9VSW50ICAgdmFsMSwgeXk7Ci0KLQotICAgICAgICB2YWwxICAgPSBjb2xbMF07Ci0gICAgICAgIGZpclswXSA9IHdlaWdodHNbMl0gKiB2YWwxOwotICAgICAgICBmaXJbMV0gPSB3ZWlnaHRzWzNdICogdmFsMTsKLSAgICAgICAgZmlyWzJdID0gd2VpZ2h0c1s0XSAqIHZhbDE7Ci0gICAgICAgIGZpclszXSA9IDA7Ci0gICAgICAgIGNvbCAgICs9IHBpdGNoOwotCi0gICAgICAgIHZhbDEgICAgPSBjb2xbMF07Ci0gICAgICAgIGZpclswXSArPSB3ZWlnaHRzWzFdICogdmFsMTsKLSAgICAgICAgZmlyWzFdICs9IHdlaWdodHNbMl0gKiB2YWwxOwotICAgICAgICBmaXJbMl0gKz0gd2VpZ2h0c1szXSAqIHZhbDE7Ci0gICAgICAgIGZpclszXSArPSB3ZWlnaHRzWzRdICogdmFsMTsKLSAgICAgICAgY29sICAgICs9IHBpdGNoOwotCi0gICAgICAgIGZvciAoIHl5ID0gMjsgeXkgPCBoZWlnaHQ7IHl5KysgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUludCAgdmFsLCBwaXg7Ci0KLQotICAgICAgICAgIHZhbCAgICA9IGNvbFswXTsKLSAgICAgICAgICBwaXggICAgPSBmaXJbMF0gKyB3ZWlnaHRzWzBdICogdmFsOwotICAgICAgICAgIGZpclswXSA9IGZpclsxXSArIHdlaWdodHNbMV0gKiB2YWw7Ci0gICAgICAgICAgZmlyWzFdID0gZmlyWzJdICsgd2VpZ2h0c1syXSAqIHZhbDsKLSAgICAgICAgICBmaXJbMl0gPSBmaXJbM10gKyB3ZWlnaHRzWzNdICogdmFsOwotICAgICAgICAgIGZpclszXSA9ICAgICAgICAgIHdlaWdodHNbNF0gKiB2YWw7Ci0KLSAgICAgICAgICBwaXggICAgICAgICAgID4+PSA4OwotICAgICAgICAgIHBpeCAgICAgICAgICAgIHw9IChGVF9VSW50KS0oRlRfSW50KSggcGl4ID4+IDggKTsKLSAgICAgICAgICBjb2xbLTIgKiBwaXRjaF0gPSAoRlRfQnl0ZSlwaXg7Ci0gICAgICAgICAgY29sICAgICAgICAgICAgKz0gcGl0Y2g7Ci0gICAgICAgIH0KLQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUludCAgcGl4OwotCi0KLSAgICAgICAgICBwaXggICAgICAgICAgICAgPSBmaXJbMF0gPj4gODsKLSAgICAgICAgICBwaXggICAgICAgICAgICB8PSAoRlRfVUludCktKEZUX0ludCkoIHBpeCA+PiA4ICk7Ci0gICAgICAgICAgY29sWy0yICogcGl0Y2hdID0gKEZUX0J5dGUpcGl4OwotCi0gICAgICAgICAgcGl4ICAgICAgICAgPSBmaXJbMV0gPj4gODsKLSAgICAgICAgICBwaXggICAgICAgIHw9IChGVF9VSW50KS0oRlRfSW50KSggcGl4ID4+IDggKTsKLSAgICAgICAgICBjb2xbLXBpdGNoXSA9IChGVF9CeXRlKXBpeDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSNpZmRlZiBVU0VfTEVHQUNZCi0KLSAgLyogaW50cmEtcGl4ZWwgZmlsdGVyIHVzZWQgYnkgdGhlIGxlZ2FjeSBmaWx0ZXIgKi8KLSAgc3RhdGljIHZvaWQKLSAgX2Z0X2xjZF9maWx0ZXJfbGVnYWN5KCBGVF9CaXRtYXAqICAgICAgYml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xpYnJhcnkgICAgICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1VJbnQgIHdpZHRoICA9IChGVF9VSW50KWJpdG1hcC0+d2lkdGg7Ci0gICAgRlRfVUludCAgaGVpZ2h0ID0gKEZUX1VJbnQpYml0bWFwLT5yb3dzOwotICAgIEZUX0ludCAgIHBpdGNoICA9IGJpdG1hcC0+cGl0Y2g7Ci0KLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50ICBmaWx0ZXJzWzNdWzNdID0KLSAgICB7Ci0gICAgICB7IDY1NTM4ICogOS8xMywgNjU1MzggKiAxLzYsIDY1NTM4ICogMS8xMyB9LAotICAgICAgeyA2NTUzOCAqIDMvMTMsIDY1NTM4ICogNC82LCA2NTUzOCAqIDMvMTMgfSwKLSAgICAgIHsgNjU1MzggKiAxLzEzLCA2NTUzOCAqIDEvNiwgNjU1MzggKiA5LzEzIH0KLSAgICB9OwotCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7Ci0KLQotICAgIC8qIGhvcml6b250YWwgaW4tcGxhY2UgaW50cmEtcGl4ZWwgZmlsdGVyICovCi0gICAgaWYgKCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRCAmJiB3aWR0aCA+PSAzICkKLSAgICB7Ci0gICAgICBGVF9CeXRlKiAgbGluZSA9IGJpdG1hcC0+YnVmZmVyOwotCi0KLSAgICAgIC8qIHRha2UgY2FyZSBvZiBiaXRtYXAgZmxvdyAqLwotICAgICAgaWYgKCBiaXRtYXAtPnBpdGNoIDwgMCApCi0gICAgICAgIGxpbmUgLT0gYml0bWFwLT5waXRjaCAqIChGVF9JbnQpKCBiaXRtYXAtPnJvd3MgLSAxICk7Ci0KLSAgICAgIGZvciAoIDsgaGVpZ2h0ID4gMDsgaGVpZ2h0LS0sIGxpbmUgKz0gcGl0Y2ggKQotICAgICAgewotICAgICAgICBGVF9VSW50ICB4eDsKLQotCi0gICAgICAgIGZvciAoIHh4ID0gMDsgeHggPCB3aWR0aDsgeHggKz0gMyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50ICByID0gMDsKLSAgICAgICAgICBGVF9VSW50ICBnID0gMDsKLSAgICAgICAgICBGVF9VSW50ICBiID0gMDsKLSAgICAgICAgICBGVF9VSW50ICBwOwotCi0KLSAgICAgICAgICBwICA9IGxpbmVbeHhdOwotICAgICAgICAgIHIgKz0gZmlsdGVyc1swXVswXSAqIHA7Ci0gICAgICAgICAgZyArPSBmaWx0ZXJzWzBdWzFdICogcDsKLSAgICAgICAgICBiICs9IGZpbHRlcnNbMF1bMl0gKiBwOwotCi0gICAgICAgICAgcCAgPSBsaW5lW3h4ICsgMV07Ci0gICAgICAgICAgciArPSBmaWx0ZXJzWzFdWzBdICogcDsKLSAgICAgICAgICBnICs9IGZpbHRlcnNbMV1bMV0gKiBwOwotICAgICAgICAgIGIgKz0gZmlsdGVyc1sxXVsyXSAqIHA7Ci0KLSAgICAgICAgICBwICA9IGxpbmVbeHggKyAyXTsKLSAgICAgICAgICByICs9IGZpbHRlcnNbMl1bMF0gKiBwOwotICAgICAgICAgIGcgKz0gZmlsdGVyc1syXVsxXSAqIHA7Ci0gICAgICAgICAgYiArPSBmaWx0ZXJzWzJdWzJdICogcDsKLQotICAgICAgICAgIGxpbmVbeHhdICAgICA9IChGVF9CeXRlKSggciAvIDY1NTM2ICk7Ci0gICAgICAgICAgbGluZVt4eCArIDFdID0gKEZUX0J5dGUpKCBnIC8gNjU1MzYgKTsKLSAgICAgICAgICBsaW5lW3h4ICsgMl0gPSAoRlRfQnl0ZSkoIGIgLyA2NTUzNiApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRF9WICYmIGhlaWdodCA+PSAzICkKLSAgICB7Ci0gICAgICBGVF9CeXRlKiAgY29sdW1uID0gYml0bWFwLT5idWZmZXI7Ci0KLQotICAgICAgLyogdGFrZSBjYXJlIG9mIGJpdG1hcCBmbG93ICovCi0gICAgICBpZiAoIGJpdG1hcC0+cGl0Y2ggPCAwICkKLSAgICAgICAgY29sdW1uIC09IGJpdG1hcC0+cGl0Y2ggKiAoRlRfSW50KSggYml0bWFwLT5yb3dzIC0gMSApOwotCi0gICAgICBmb3IgKCA7IHdpZHRoID4gMDsgd2lkdGgtLSwgY29sdW1uKysgKQotICAgICAgewotICAgICAgICBGVF9CeXRlKiAgY29sICAgICA9IGNvbHVtbjsKLSAgICAgICAgRlRfQnl0ZSogIGNvbF9lbmQgPSBjb2wgKyAoRlRfSW50KWhlaWdodCAqIHBpdGNoOwotCi0KLSAgICAgICAgZm9yICggOyBjb2wgPCBjb2xfZW5kOyBjb2wgKz0gMyAqIHBpdGNoICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgIHIgPSAwOwotICAgICAgICAgIEZUX1VJbnQgIGcgPSAwOwotICAgICAgICAgIEZUX1VJbnQgIGIgPSAwOwotICAgICAgICAgIEZUX1VJbnQgIHA7Ci0KLQotICAgICAgICAgIHAgID0gY29sWzBdOwotICAgICAgICAgIHIgKz0gZmlsdGVyc1swXVswXSAqIHA7Ci0gICAgICAgICAgZyArPSBmaWx0ZXJzWzBdWzFdICogcDsKLSAgICAgICAgICBiICs9IGZpbHRlcnNbMF1bMl0gKiBwOwotCi0gICAgICAgICAgcCAgPSBjb2xbcGl0Y2hdOwotICAgICAgICAgIHIgKz0gZmlsdGVyc1sxXVswXSAqIHA7Ci0gICAgICAgICAgZyArPSBmaWx0ZXJzWzFdWzFdICogcDsKLSAgICAgICAgICBiICs9IGZpbHRlcnNbMV1bMl0gKiBwOwotCi0gICAgICAgICAgcCAgPSBjb2xbcGl0Y2ggKiAyXTsKLSAgICAgICAgICByICs9IGZpbHRlcnNbMl1bMF0gKiBwOwotICAgICAgICAgIGcgKz0gZmlsdGVyc1syXVsxXSAqIHA7Ci0gICAgICAgICAgYiArPSBmaWx0ZXJzWzJdWzJdICogcDsKLQotICAgICAgICAgIGNvbFswXSAgICAgICAgID0gKEZUX0J5dGUpKCByIC8gNjU1MzYgKTsKLSAgICAgICAgICBjb2xbcGl0Y2hdICAgICA9IChGVF9CeXRlKSggZyAvIDY1NTM2ICk7Ci0gICAgICAgICAgY29sWzIgKiBwaXRjaF0gPSAoRlRfQnl0ZSkoIGIgLyA2NTUzNiApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSNlbmRpZiAvKiBVU0VfTEVHQUNZICovCi0KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyV2VpZ2h0cyggRlRfTGlicmFyeSAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAgKndlaWdodHMgKQotICB7Ci0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfTGlicmFyeV9IYW5kbGUgKTsKLQotICAgIGlmICggIXdlaWdodHMgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBmdF9tZW1jcHkoIGxpYnJhcnktPmxjZF93ZWlnaHRzLCB3ZWlnaHRzLCA1ICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0xpYnJhcnlfU2V0TGNkRmlsdGVyKCBGVF9MaWJyYXJ5ICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9MY2RGaWx0ZXIgIGZpbHRlciApCi0gIHsKLSAgICBzdGF0aWMgY29uc3QgRlRfQnl0ZSAgbGlnaHRfZmlsdGVyWzVdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MDAsIDB4NTUsIDB4NTYsIDB4NTUsIDB4MDAgfTsKLSAgICAvKiB0aGUgdmFsdWVzIGhlcmUgc3VtIHVwIHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4gMjU2LCAqLwotICAgIC8qIHByb3ZpZGluZyBhIGNoZWFwIGdhbW1hIGNvcnJlY3Rpb24gICAgICAgICAgICAgICAgICovCi0gICAgc3RhdGljIGNvbnN0IEZUX0J5dGUgIGRlZmF1bHRfZmlsdGVyWzVdID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IDB4MTAsIDB4NDAsIDB4NzAsIDB4NDAsIDB4MTAgfTsKLQotCi0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfTGlicmFyeV9IYW5kbGUgKTsKLQotICAgIHN3aXRjaCAoIGZpbHRlciApCi0gICAgewotICAgIGNhc2UgRlRfTENEX0ZJTFRFUl9OT05FOgotICAgICAgbGlicmFyeS0+bGNkX2ZpbHRlcl9mdW5jID0gTlVMTDsKLSAgICAgIGxpYnJhcnktPmxjZF9leHRyYSAgICAgICA9IDA7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRlRfTENEX0ZJTFRFUl9ERUZBVUxUOgotI2lmIGRlZmluZWQoIEZUX0ZPUkNFX0xFR0FDWV9MQ0RfRklMVEVSICkKLQotICAgICAgbGlicmFyeS0+bGNkX2ZpbHRlcl9mdW5jID0gX2Z0X2xjZF9maWx0ZXJfbGVnYWN5OwotICAgICAgbGlicmFyeS0+bGNkX2V4dHJhICAgICAgID0gMDsKLQotI2VsaWYgZGVmaW5lZCggRlRfRk9SQ0VfTElHSFRfTENEX0ZJTFRFUiApCi0KLSAgICAgIGZ0X21lbWNweSggbGlicmFyeS0+bGNkX3dlaWdodHMsIGxpZ2h0X2ZpbHRlciwgNSApOwotICAgICAgbGlicmFyeS0+bGNkX2ZpbHRlcl9mdW5jID0gX2Z0X2xjZF9maWx0ZXJfZmlyOwotICAgICAgbGlicmFyeS0+bGNkX2V4dHJhICAgICAgID0gMjsKLQotI2Vsc2UKLQotICAgICAgZnRfbWVtY3B5KCBsaWJyYXJ5LT5sY2Rfd2VpZ2h0cywgZGVmYXVsdF9maWx0ZXIsIDUgKTsKLSAgICAgIGxpYnJhcnktPmxjZF9maWx0ZXJfZnVuYyA9IF9mdF9sY2RfZmlsdGVyX2ZpcjsKLSAgICAgIGxpYnJhcnktPmxjZF9leHRyYSAgICAgICA9IDI7Ci0KLSNlbmRpZgotCi0gICAgICBicmVhazsKLQotICAgIGNhc2UgRlRfTENEX0ZJTFRFUl9MSUdIVDoKLSAgICAgIGZ0X21lbWNweSggbGlicmFyeS0+bGNkX3dlaWdodHMsIGxpZ2h0X2ZpbHRlciwgNSApOwotICAgICAgbGlicmFyeS0+bGNkX2ZpbHRlcl9mdW5jID0gX2Z0X2xjZF9maWx0ZXJfZmlyOwotICAgICAgbGlicmFyeS0+bGNkX2V4dHJhICAgICAgID0gMjsKLSAgICAgIGJyZWFrOwotCi0jaWZkZWYgVVNFX0xFR0FDWQotCi0gICAgY2FzZSBGVF9MQ0RfRklMVEVSX0xFR0FDWToKLSAgICAgIGxpYnJhcnktPmxjZF9maWx0ZXJfZnVuYyA9IF9mdF9sY2RfZmlsdGVyX2xlZ2FjeTsKLSAgICAgIGxpYnJhcnktPmxjZF9leHRyYSAgICAgICA9IDA7Ci0gICAgICBicmVhazsKLQotI2VuZGlmCi0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgfQotCi0gICAgbGlicmFyeS0+bGNkX2ZpbHRlciA9IGZpbHRlcjsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotI2Vsc2UgLyogIUZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9MaWJyYXJ5X1NldExjZEZpbHRlcldlaWdodHMoIEZUX0xpYnJhcnkgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgICp3ZWlnaHRzICkKLSAgewotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOwotICAgIEZUX1VOVVNFRCggd2VpZ2h0cyApOwotCi0gICAgcmV0dXJuIEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLSAgfQotCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9MaWJyYXJ5X1NldExjZEZpbHRlciggRlRfTGlicmFyeSAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTGNkRmlsdGVyICBmaWx0ZXIgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7Ci0gICAgRlRfVU5VU0VEKCBmaWx0ZXIgKTsKLQotICAgIHJldHVybiBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0gIH0KLQotI2VuZGlmIC8qICFGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRtYWMuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0bWFjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNGJiYjYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRtYWMuYworKysgL2Rldi9udWxsCkBAIC0xLDEwODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRtYWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE1hYyBGT05EIHN1cHBvcnQuICBXcml0dGVuIGJ5IGp1c3RAbGV0dGVycm9yLmNvbS4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgSGVhdmlseSBtb2RpZmllZCBieSBtcHN1enVraSwgR2VvcmdlIFdpbGxpYW1zLCBhbmQgU2VhbiBNY0JyaWRlLiAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgZm9yIE1hYyBPUyBYIG9ubHk7IHNlZSBidWlsZHMvbWFjL2Z0b2xkbWFjLmMgZm9yICAgICAgICAgICovCi0vKiAgY2xhc3NpYyBwbGF0Zm9ybXMgYnVpbHQgYnkgTVBXLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSnVzdCB2YW4gUm9zc3VtLCBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKgotICAgIE5vdGVzCi0KLSAgICBNYWMgc3VpdGNhc2UgZmlsZXMgY2FuIChhbmQgb2Z0ZW4gZG8hKSBjb250YWluIG11bHRpcGxlIGZvbnRzLiAgVG8KLSAgICBzdXBwb3J0IHRoaXMgSSB1c2UgdGhlIGZhY2VfaW5kZXggYXJndW1lbnQgb2YgRlRfKE9wZW58TmV3KV9GYWNlKCkKLSAgICBmdW5jdGlvbnMsIGFuZCBwcmV0ZW5kIHRoZSBzdWl0Y2FzZSBmaWxlIGlzIGEgY29sbGVjdGlvbi4KLQotICAgIFdhcm5pbmc6IGZiaXQgYW5kIE5GTlQgYml0bWFwIHJlc291cmNlcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQuICBJbiBvbGQKLSAgICBzZm50IGZvbnRzLCBiaXRtYXAgZ2x5cGggZGF0YSBmb3IgZWFjaCBzaXplIGlzIHN0b3JlZCBpbiBlYWNoIGBORk5UJwotICAgIHJlc291cmNlcyBpbnN0ZWFkIG9mIHRoZSBgYmRhdCcgdGFibGUgaW4gdGhlIHNmbnQgcmVzb3VyY2UuICBUaGVyZWZvcmUsCi0gICAgZmFjZS0+bnVtX2ZpeGVkX3NpemVzIGlzIHNldCB0byAwLCBiZWNhdXNlIGJpdG1hcCBkYXRhIGluIGBORk5UJwotICAgIHJlc291cmNlIGlzIHVuYXZhaWxhYmxlIGF0IHByZXNlbnQuCi0KLSAgICBUaGUgTWFjIEZPTkQgc3VwcG9ydCB3b3JrcyByb3VnaGx5IGxpa2UgdGhpczoKLQotICAgIC0gQ2hlY2sgd2hldGhlciB0aGUgb2ZmZXJlZCBzdHJlYW0gcG9pbnRzIHRvIGEgTWFjIHN1aXRjYXNlIGZpbGUuICBUaGlzCi0gICAgICBpcyBkb25lIGJ5IGNoZWNraW5nIHRoZSBmaWxlIHR5cGU6IGl0IGhhcyB0byBiZSAnRkZJTCcgb3IgJ3RmaWwnLiAgVGhlCi0gICAgICBzdHJlYW0gdGhhdCBnZXRzIHBhc3NlZCB0byBvdXIgaW5pdF9mYWNlKCkgcm91dGluZSBpcyBhIHN0ZGlvIHN0cmVhbSwKLSAgICAgIHdoaWNoIGlzbid0IHVzYWJsZSBmb3IgdXMsIHNpbmNlIHRoZSBGT05EIHJlc291cmNlcyBsaXZlIGluIHRoZQotICAgICAgcmVzb3VyY2UgZm9yay4gIFNvIHdlIGp1c3QgZ3JhYiB0aGUgc3RyZWFtLT5wYXRobmFtZSBmaWVsZC4KLQotICAgIC0gUmVhZCB0aGUgRk9ORCByZXNvdXJjZSBpbnRvIG1lbW9yeSwgdGhlbiBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEKLSAgICAgIFRydWVUeXBlIGZvbnQgYW5kL29yKCEpIGEgVHlwZSAxIGZvbnQgYXZhaWxhYmxlLgotCi0gICAgLSBJZiB0aGVyZSBpcyBhIFR5cGUgMSBmb250IGF2YWlsYWJsZSAoYXMgYSBzZXBhcmF0ZSBgTFdGTicgZmlsZSksIHJlYWQKLSAgICAgIGl0cyBkYXRhIGludG8gbWVtb3J5LCBtYXNzYWdlIGl0IHNsaWdodGx5IHNvIGl0IGJlY29tZXMgUEZCIGRhdGEsIHdyYXAKLSAgICAgIGl0IGludG8gYSBtZW1vcnkgc3RyZWFtLCBsb2FkIHRoZSBUeXBlIDEgZHJpdmVyIGFuZCBkZWxlZ2F0ZSB0aGUgcmVzdAotICAgICAgb2YgdGhlIHdvcmsgdG8gaXQgYnkgY2FsbGluZyBGVF9PcGVuX0ZhY2UoKS4gIChYWFggVE9ETzogYWZ0ZXIgdGhpcwotICAgICAgaGFzIGJlZW4gZG9uZSwgdGhlIGtlcm5pbmcgZGF0YSBmcm9tIHRoZSBGT05EIHJlc291cmNlIHNob3VsZCBiZQotICAgICAgYXBwZW5kZWQgdG8gdGhlIGZhY2U6IE9uIHRoZSBNYWMgdGhlcmUgYXJlIHVzdWFsbHkgbm8gQUZNIGZpbGVzCi0gICAgICBhdmFpbGFibGUuICBIb3dldmVyLCB0aGlzIGlzIHRyaWNreSBzaW5jZSB3ZSBuZWVkIHRvIG1hcCBNYWMgY2hhcgotICAgICAgY29kZXMgdG8gcHMgZ2x5cGggbmFtZXMgdG8gZ2x5cGggSUQncy4uLikKLQotICAgIC0gSWYgdGhlcmUgaXMgYSBUcnVlVHlwZSBmb250IChhbiBgc2ZudCcgcmVzb3VyY2UpLCByZWFkIGl0IGludG8gbWVtb3J5LAotICAgICAgd3JhcCBpdCBpbnRvIGEgbWVtb3J5IHN0cmVhbSwgbG9hZCB0aGUgVHJ1ZVR5cGUgZHJpdmVyIGFuZCBkZWxlZ2F0ZQotICAgICAgdGhlIHJlc3Qgb2YgdGhlIHdvcmsgdG8gaXQsIGJ5IGNhbGxpbmcgRlRfT3Blbl9GYWNlKCkuCi0KLSAgICAtIFNvbWUgc3VpdGNhc2UgZm9udHMgKG5vdGFibHkgT255eCkgbWlnaHQgcG9pbnQgdGhlIGBMV0ZOJyBmaWxlIHRvCi0gICAgICBpdHNlbGYsIGV2ZW4gdGhvdWdoIGl0IGRvZXNuJ3QgY29udGFpbnMgYFBPU1QnIHJlc291cmNlcy4gIFRvIGhhbmRsZQotICAgICAgdGhpcyBzcGVjaWFsIGNhc2Ugd2l0aG91dCBvcGVuaW5nIHRoZSBmaWxlIGFuIGV4dHJhIHRpbWUsIHdlIGp1c3QKLSAgICAgIGlnbm9yZSBlcnJvcnMgZnJvbSB0aGUgYExXRk4nIGFuZCBmYWxsYmFjayB0byB0aGUgYHNmbnQnIGlmIGJvdGggYXJlCi0gICAgICBhdmFpbGFibGUuCi0gICovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSAiZnRiYXNlLmgiCi0KLSAgLyogVGhpcyBpcyBmb3IgTWFjIE9TIFguICBXaXRob3V0IHJlZGVmaW5pdGlvbiwgT1NfSU5MSU5FICovCi0gIC8qIGV4cGFuZHMgdG8gYHN0YXRpYyBpbmxpbmUnIHdoaWNoIGRvZXNuJ3Qgc3Vydml2ZSB0aGUgICAqLwotICAvKiAtYW5zaSBjb21waWxhdGlvbiBmbGFnIG9mIEdDQy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZiAhSEFWRV9BTlNJX09TX0lOTElORQotI3VuZGVmICBPU19JTkxJTkUKLSNkZWZpbmUgT1NfSU5MSU5FICBzdGF0aWMgX19pbmxpbmVfXwotI2VuZGlmCi0KLSAgLyogYGNvbmZpZ3VyZScgY2hlY2tzIHRoZSBhdmFpbGFiaWxpdHkgb2YgYFJlc291cmNlSW5kZXgnIHN0cmljdGx5ICovCi0gIC8qIGFuZCBzZXRzIEhBVkVfVFlQRV9SRVNPVVJDRV9JTkRFWCAxIG9yIDAgYWx3YXlzLiAgSWYgaXQgaXMgICAgICAqLwotICAvKiBub3Qgc2V0IChlLmcuLCBhIGJ1aWxkIHdpdGhvdXQgYGNvbmZpZ3VyZScpLCB0aGUgYXZhaWxhYmlsaXR5ICAgKi8KLSAgLyogaXMgZ3Vlc3NlZCBmcm9tIHRoZSBTREsgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZuZGVmIEhBVkVfVFlQRV9SRVNPVVJDRV9JTkRFWAotI2lmICFkZWZpbmVkKCBNQUNfT1NfWF9WRVJTSU9OXzEwXzUgKSB8fCBcCi0gICAgKCBNQUNfT1NfWF9WRVJTSU9OX01BWF9BTExPV0VEIDwgTUFDX09TX1hfVkVSU0lPTl8xMF81ICkKLSNkZWZpbmUgSEFWRV9UWVBFX1JFU09VUkNFX0lOREVYIDAKLSNlbHNlCi0jZGVmaW5lIEhBVkVfVFlQRV9SRVNPVVJDRV9JTkRFWCAxCi0jZW5kaWYKLSNlbmRpZiAvKiAhSEFWRV9UWVBFX1JFU09VUkNFX0lOREVYICovCi0KLSNpZiAoIEhBVkVfVFlQRV9SRVNPVVJDRV9JTkRFWCA9PSAwICkKLSAgdHlwZWRlZiBzaG9ydCAgUmVzb3VyY2VJbmRleDsKLSNlbmRpZgotCi0jaW5jbHVkZSA8Q29yZVNlcnZpY2VzL0NvcmVTZXJ2aWNlcy5oPgotI2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgotI2luY2x1ZGUgPHN5cy9zeXNsaW1pdHMuaD4gLyogUEFUSF9NQVggKi8KLQotICAvKiBEb24ndCB3YW50IHdhcm5pbmdzIGFib3V0IG91ciBvd24gdXNlIG9mIGRlcHJlY2F0ZWQgZnVuY3Rpb25zLiAqLwotI2RlZmluZSBGVF9ERVBSRUNBVEVEX0FUVFJJQlVURQotCi0jaW5jbHVkZSBGVF9NQUNfSAotCi0jaWZuZGVmIGtBVFNPcHRpb25GbGFnc1VuUmVzdHJpY3RlZFNjb3BlIC8qIHNpbmNlIE1hYyBPUyBYIDEwLjEgKi8KLSNkZWZpbmUga0FUU09wdGlvbkZsYWdzVW5SZXN0cmljdGVkU2NvcGUga0FUU09wdGlvbkZsYWdzRGVmYXVsdAotI2VuZGlmCi0KLQotICAvKiBTZXQgUFJFRkVSX0xXRk4gdG8gMSBpZiBMV0ZOIChUeXBlIDEpIGlzIHByZWZlcnJlZCBvdmVyCi0gICAgIFRydWVUeXBlIGluIGNhc2UgKmJvdGgqIGFyZSBhdmFpbGFibGUgKHRoaXMgaXMgbm90IGNvbW1vbiwKLSAgICAgYnV0IGl0ICppcyogcG9zc2libGUpLiAqLwotI2lmbmRlZiBQUkVGRVJfTFdGTgotI2RlZmluZSBQUkVGRVJfTFdGTiAgMQotI2VuZGlmCi0KLQotI2lmZGVmIEZUX01BQ0lOVE9TSAotCi0gIC8qIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBiZWNhdXNlIEZTU3BlYyBpcyBkZXByZWNhdGVkIGluIE1hYyBPUyBYICAqLwotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldEZpbGVfRnJvbV9NYWNfTmFtZSggY29uc3QgY2hhciogIGZvbnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlYyogICAgICBwYXRoU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgZmFjZV9pbmRleCApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGZvbnROYW1lICk7Ci0gICAgRlRfVU5VU0VEKCBwYXRoU3BlYyApOwotICAgIEZUX1VOVVNFRCggZmFjZV9pbmRleCApOwotCi0gICAgcmV0dXJuIEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLSAgfQotCi0KLSAgLyogUHJpdmF0ZSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBGU1NwZWMgdHlwZSBoYXMgYmVlbiBkaXNjb3VyYWdlZCBmb3IgYSBsb25nIHRpbWUsICAgICAqLwotICAvKiB1bmZvcnR1bmF0ZWx5IGFuIEZTUmVmIHJlcGxhY2VtZW50IEFQSSBmb3IgICAgICAgICAgICAgICAgKi8KLSAgLyogQVRTRm9udEdldEZpbGVTcGVjaWZpY2F0aW9uKCkgaXMgb25seSBhdmFpbGFibGUgaW4gICAgICAgICovCi0gIC8qIE1hYyBPUyBYIDEwLjUgYW5kIGxhdGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgT1NTdGF0dXMKLSAgRlRfQVRTRm9udEdldEZpbGVSZWZlcmVuY2UoIEFUU0ZvbnRSZWYgIGF0c19mb250X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlNSZWYqICAgICAgYXRzX2ZvbnRfcmVmICkKLSAgewotI2lmIGRlZmluZWQoIE1BQ19PU19YX1ZFUlNJT05fMTBfNSApICYmIFwKLSAgICAoIE1BQ19PU19YX1ZFUlNJT05fTUlOX1JFUVVJUkVEID49IE1BQ19PU19YX1ZFUlNJT05fMTBfNSApCi0KLSAgICBPU1N0YXR1cyAgZXJyOwotCi0gICAgZXJyID0gQVRTRm9udEdldEZpbGVSZWZlcmVuY2UoIGF0c19mb250X2lkLCBhdHNfZm9udF9yZWYgKTsKLQotICAgIHJldHVybiBlcnI7Ci0jZWxpZiBfX0xQNjRfXyAvKiBObyA2NGJpdCBDYXJib24gQVBJIG9uIGxlZ2FjeSBwbGF0Zm9ybXMgKi8KLSAgICBGVF9VTlVTRUQoIGF0c19mb250X2lkICk7Ci0gICAgRlRfVU5VU0VEKCBhdHNfZm9udF9yZWYgKTsKLQotCi0gICAgcmV0dXJuIGZuZkVycjsKLSNlbHNlIC8qIDMyYml0IENhcmJvbiBBUEkgb24gbGVnYWN5IHBsYXRmb3JtcyAqLwotICAgIE9TU3RhdHVzICBlcnI7Ci0gICAgRlNTcGVjICAgIHNwZWM7Ci0KLQotICAgIGVyciA9IEFUU0ZvbnRHZXRGaWxlU3BlY2lmaWNhdGlvbiggYXRzX2ZvbnRfaWQsICZzcGVjICk7Ci0gICAgaWYgKCBub0VyciA9PSBlcnIgKQotICAgICAgZXJyID0gRlNwTWFrZUZTUmVmKCAmc3BlYywgYXRzX2ZvbnRfcmVmICk7Ci0KLSAgICByZXR1cm4gZXJyOwotI2VuZGlmCi0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBGVF9HZXRGaWxlUmVmX0Zyb21fTWFjX0FUU19OYW1lKCBjb25zdCBjaGFyKiAgZm9udE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTUmVmKiAgICAgICBhdHNfZm9udF9yZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICBmYWNlX2luZGV4ICkKLSAgewotICAgIENGU3RyaW5nUmVmICBjZl9mb250TmFtZTsKLSAgICBBVFNGb250UmVmICAgYXRzX2ZvbnRfaWQ7Ci0KLQotICAgICpmYWNlX2luZGV4ID0gMDsKLQotICAgIGNmX2ZvbnROYW1lID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ1N0cmluZyggTlVMTCwgZm9udE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ0ZTdHJpbmdFbmNvZGluZ01hY1JvbWFuICk7Ci0gICAgYXRzX2ZvbnRfaWQgPSBBVFNGb250RmluZEZyb21OYW1lKCBjZl9mb250TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBVFNPcHRpb25GbGFnc1VuUmVzdHJpY3RlZFNjb3BlICk7Ci0gICAgQ0ZSZWxlYXNlKCBjZl9mb250TmFtZSApOwotCi0gICAgaWYgKCBhdHNfZm9udF9pZCA9PSAwIHx8IGF0c19mb250X2lkID09IDB4RkZGRkZGRkZVTCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLQotICAgIGlmICggbm9FcnIgIT0gRlRfQVRTRm9udEdldEZpbGVSZWZlcmVuY2UoIGF0c19mb250X2lkLCBhdHNfZm9udF9yZWYgKSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLQotICAgIC8qIGZhY2VfaW5kZXggY2FsY3VsYXRpb24gYnkgc2VhcmNoaW5nIHByZWNlZGluZyBmb250SURzICovCi0gICAgLyogd2l0aCBzYW1lIEZTUmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB7Ci0gICAgICBBVFNGb250UmVmICBpZDIgPSBhdHNfZm9udF9pZCAtIDE7Ci0gICAgICBGU1JlZiAgICAgICByZWYyOwotCi0KLSAgICAgIHdoaWxlICggaWQyID4gMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggbm9FcnIgIT0gRlRfQVRTRm9udEdldEZpbGVSZWZlcmVuY2UoIGlkMiwgJnJlZjIgKSApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGlmICggbm9FcnIgIT0gRlNDb21wYXJlRlNSZWZzKCBhdHNfZm9udF9yZWYsICZyZWYyICkgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlkMiAtLTsKLSAgICAgIH0KLSAgICAgICpmYWNlX2luZGV4ID0gYXRzX2ZvbnRfaWQgLSAoIGlkMiArIDEgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldEZpbGVQYXRoX0Zyb21fTWFjX0FUU19OYW1lKCBjb25zdCBjaGFyKiAgZm9udE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSW50OCogICAgICAgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJbnQzMiAgICAgICBtYXhQYXRoU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICBmYWNlX2luZGV4ICkKLSAgewotICAgIEZTUmVmICAgICByZWY7Ci0gICAgRlRfRXJyb3IgIGVycjsKLQotCi0gICAgaWYgKCAhZm9udE5hbWUgfHwgIWZhY2VfaW5kZXggKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50KSA7Ci0KLSAgICBlcnIgPSBGVF9HZXRGaWxlUmVmX0Zyb21fTWFjX0FUU19OYW1lKCBmb250TmFtZSwgJnJlZiwgZmFjZV9pbmRleCApOwotICAgIGlmICggZXJyICkKLSAgICAgIHJldHVybiBlcnI7Ci0KLSAgICBpZiAoIG5vRXJyICE9IEZTUmVmTWFrZVBhdGgoICZyZWYsIHBhdGgsIG1heFBhdGhTaXplICkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgYmVjYXVzZSBGU1NwZWMgaXMgZGVwcmVjYXRlZCBpbiBNYWMgT1MgWCAgKi8KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRGaWxlX0Zyb21fTWFjX0FUU19OYW1lKCBjb25zdCBjaGFyKiAgZm9udE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZTU3BlYyogICAgICBwYXRoU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgIGZhY2VfaW5kZXggKQotICB7Ci0jaWYgKCBfX0xQNjRfXyApIHx8ICggZGVmaW5lZCggTUFDX09TX1hfVkVSU0lPTl8xMF81ICkgJiYgXAotICAgICAgKCBNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA+PSBNQUNfT1NfWF9WRVJTSU9OXzEwXzUgKSApCi0gICAgRlRfVU5VU0VEKCBmb250TmFtZSApOwotICAgIEZUX1VOVVNFRCggcGF0aFNwZWMgKTsKLSAgICBGVF9VTlVTRUQoIGZhY2VfaW5kZXggKTsKLQotICAgIHJldHVybiBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0jZWxzZQotICAgIEZTUmVmICAgICByZWY7Ci0gICAgRlRfRXJyb3IgIGVycjsKLQotCi0gICAgaWYgKCAhZm9udE5hbWUgfHwgIWZhY2VfaW5kZXggKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBlcnIgPSBGVF9HZXRGaWxlUmVmX0Zyb21fTWFjX0FUU19OYW1lKCBmb250TmFtZSwgJnJlZiwgZmFjZV9pbmRleCApOwotICAgIGlmICggZXJyICkKLSAgICAgIHJldHVybiBlcnI7Ci0KLSAgICBpZiAoIG5vRXJyICE9IEZTR2V0Q2F0YWxvZ0luZm8oICZyZWYsIGtGU0NhdEluZm9Ob25lLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aFNwZWMsIE5VTEwgKSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0jZW5kaWYKLSAgfQotCi0KLSAgc3RhdGljIE9TRXJyCi0gIEZUX0ZTUGF0aE1ha2VSZXMoIGNvbnN0IFVJbnQ4KiAgICBwYXRobmFtZSwKLSAgICAgICAgICAgICAgICAgICAgUmVzRmlsZVJlZk51bSogIHJlcyApCi0gIHsKLSAgICBPU0VyciAgZXJyOwotICAgIEZTUmVmICByZWY7Ci0KLQotICAgIGlmICggbm9FcnIgIT0gRlNQYXRoTWFrZVJlZiggcGF0aG5hbWUsICZyZWYsIEZBTFNFICkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwotCi0gICAgLyogYXQgcHJlc2VudCwgbm8gc3VwcG9ydCBmb3IgZGZvbnQgZm9ybWF0ICovCi0gICAgZXJyID0gRlNPcGVuUmVzb3VyY2VGaWxlKCAmcmVmLCAwLCBOVUxMLCBmc1JkUGVybSwgcmVzICk7Ci0gICAgaWYgKCBub0VyciA9PSBlcnIgKQotICAgICAgcmV0dXJuIGVycjsKLQotICAgIC8qIGZhbGxiYWNrIHRvIG9yaWdpbmFsIHJlc291cmNlLWZvcmsgZm9udCAqLwotICAgICpyZXMgPSBGU09wZW5SZXNGaWxlKCAmcmVmLCBmc1JkUGVybSApOwotICAgIGVyciAgPSBSZXNFcnJvcigpOwotCi0gICAgcmV0dXJuIGVycjsKLSAgfQotCi0KLSAgLyogUmV0dXJuIHRoZSBmaWxlIHR5cGUgZm9yIGdpdmVuIHBhdGhuYW1lICovCi0gIHN0YXRpYyBPU1R5cGUKLSAgZ2V0X2ZpbGVfdHlwZV9mcm9tX3BhdGgoIGNvbnN0IFVJbnQ4KiAgcGF0aG5hbWUgKQotICB7Ci0gICAgRlNSZWYgICAgICAgICAgcmVmOwotICAgIEZTQ2F0YWxvZ0luZm8gIGluZm87Ci0KLQotICAgIGlmICggbm9FcnIgIT0gRlNQYXRoTWFrZVJlZiggcGF0aG5hbWUsICZyZWYsIEZBTFNFICkgKQotICAgICAgcmV0dXJuICggT1NUeXBlICkgMDsKLQotICAgIGlmICggbm9FcnIgIT0gRlNHZXRDYXRhbG9nSW5mbyggJnJlZiwga0ZTQ2F0SW5mb0ZpbmRlckluZm8sICZpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCApICkKLSAgICAgIHJldHVybiAoIE9TVHlwZSApIDA7Ci0KLSAgICByZXR1cm4gKChGSW5mbyAqKShpbmZvLmZpbmRlckluZm8pKS0+ZmRUeXBlOwotICB9Ci0KLQotICAvKiBHaXZlbiBhIFBvc3RTY3JpcHQgZm9udCBuYW1lLCBjcmVhdGUgdGhlIE1hY2ludG9zaCBMV0ZOIGZpbGUgbmFtZS4gKi8KLSAgc3RhdGljIHZvaWQKLSAgY3JlYXRlX2x3Zm5fbmFtZSggY2hhciogICBwc19uYW1lLAotICAgICAgICAgICAgICAgICAgICBTdHIyNTUgIGx3Zm5fZmlsZV9uYW1lICkKLSAgewotICAgIGludCAgICAgICBtYXggPSA1LCBjb3VudCA9IDA7Ci0gICAgRlRfQnl0ZSogIHAgPSBsd2ZuX2ZpbGVfbmFtZTsKLSAgICBGVF9CeXRlKiAgcSA9IChGVF9CeXRlKilwc19uYW1lOwotCi0KLSAgICBsd2ZuX2ZpbGVfbmFtZVswXSA9IDA7Ci0KLSAgICB3aGlsZSAoICpxICkKLSAgICB7Ci0gICAgICBpZiAoIGZ0X2lzdXBwZXIoICpxICkgKQotICAgICAgewotICAgICAgICBpZiAoIGNvdW50ICkKLSAgICAgICAgICBtYXggPSAzOwotICAgICAgICBjb3VudCA9IDA7Ci0gICAgICB9Ci0gICAgICBpZiAoIGNvdW50IDwgbWF4ICYmICggZnRfaXNhbG51bSggKnEgKSB8fCAqcSA9PSAnXycgKSApCi0gICAgICB7Ci0gICAgICAgICorK3AgPSAqcTsKLSAgICAgICAgbHdmbl9maWxlX25hbWVbMF0rKzsKLSAgICAgICAgY291bnQrKzsKLSAgICAgIH0KLSAgICAgIHErKzsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyBzaG9ydAotICBjb3VudF9mYWNlc19zZm50KCBjaGFyKiAgZm9uZF9kYXRhICkKLSAgewotICAgIC8qIFRoZSBjb3VudCBpcyAxIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUgaW4gdGhlIEZPTkQuICAqLwotICAgIC8qIElzbid0IHRoYXQgY3V0ZT8gOi0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgcmV0dXJuIEVuZGlhblMxNl9CdG9OKCAqKCAoc2hvcnQqKSggZm9uZF9kYXRhICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCBGYW1SZWMgKSApICkgKSArIDE7Ci0gIH0KLQotCi0gIHN0YXRpYyBzaG9ydAotICBjb3VudF9mYWNlc19zY2FsYWJsZSggY2hhciogIGZvbmRfZGF0YSApCi0gIHsKLSAgICBBc3NjRW50cnkqICBhc3NvYzsKLSAgICBzaG9ydCAgICAgICBpLCBmYWNlLCBmYWNlX2FsbDsKLQotCi0gICAgZmFjZV9hbGwgPSBFbmRpYW5TMTZfQnRvTiggKiggKHNob3J0ICopKCBmb25kX2RhdGEgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggRmFtUmVjICkgKSApICkgKyAxOwotICAgIGFzc29jICAgID0gKEFzc2NFbnRyeSopKCBmb25kX2RhdGEgKyBzaXplb2YgKCBGYW1SZWMgKSArIDIgKTsKLSAgICBmYWNlICAgICA9IDA7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IGZhY2VfYWxsOyBpKysgKQotICAgIHsKLSAgICAgIGlmICggMCA9PSBFbmRpYW5TMTZfQnRvTiggYXNzb2NbaV0uZm9udFNpemUgKSApCi0gICAgICAgIGZhY2UrKzsKLSAgICB9Ci0gICAgcmV0dXJuIGZhY2U7Ci0gIH0KLQotCi0gIC8qIExvb2sgaW5zaWRlIHRoZSBGT05EIGRhdGEsIGFuc3dlciB3aGV0aGVyIHRoZXJlIHNob3VsZCBiZSBhbiBTRk5UCi0gICAgIHJlc291cmNlLCBhbmQgYW5zd2VyIHRoZSBuYW1lIG9mIGEgcG9zc2libGUgTFdGTiBUeXBlIDEgZmlsZS4KLQotICAgICBUaGFua3MgdG8gUGF1bCBNaWxsZXIgKHBhdWxtQHByb2ZvdW5kZWZmZWN0cy5jb20pIGZvciB0aGUgZml4Ci0gICAgIHRvIGxvYWQgYSBmYWNlIE9USEVSIHRoYW4gdGhlIGZpcnN0IG9uZSBpbiB0aGUgRk9ORCEKLSAgKi8KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHBhcnNlX2ZvbmQoIGNoYXIqICAgZm9uZF9kYXRhLAotICAgICAgICAgICAgICBzaG9ydCogIGhhdmVfc2ZudCwKLSAgICAgICAgICAgICAgUmVzSUQqICBzZm50X2lkLAotICAgICAgICAgICAgICBTdHIyNTUgIGx3Zm5fZmlsZV9uYW1lLAotICAgICAgICAgICAgICBzaG9ydCAgIGZhY2VfaW5kZXggKQotICB7Ci0gICAgQXNzY0VudHJ5KiAgYXNzb2M7Ci0gICAgQXNzY0VudHJ5KiAgYmFzZV9hc3NvYzsKLSAgICBGYW1SZWMqICAgICBmb25kOwotCi0KLSAgICAqc2ZudF9pZCAgICAgICAgICA9IDA7Ci0gICAgKmhhdmVfc2ZudCAgICAgICAgPSAwOwotICAgIGx3Zm5fZmlsZV9uYW1lWzBdID0gMDsKLQotICAgIGZvbmQgICAgICAgPSAoRmFtUmVjKilmb25kX2RhdGE7Ci0gICAgYXNzb2MgICAgICA9IChBc3NjRW50cnkqKSggZm9uZF9kYXRhICsgc2l6ZW9mICggRmFtUmVjICkgKyAyICk7Ci0gICAgYmFzZV9hc3NvYyA9IGFzc29jOwotCi0gICAgLyogdGhlIG1heGltdW0gZmFjZXMgaW4gYSBGT05EIGlzIDQ4LCBzaXplIG9mIFN0eWxlVGFibGUuaW5kZXhlc1tdICovCi0gICAgaWYgKCA0NyA8IGZhY2VfaW5kZXggKQotICAgICAgcmV0dXJuOwotCi0gICAgLyogTGV0J3MgZG8gYSBsaXR0bGUgcmFuZ2UgY2hlY2tpbmcgYmVmb3JlIHdlIGdldCB0b28gZXhjaXRlZCBoZXJlICovCi0gICAgaWYgKCBmYWNlX2luZGV4IDwgY291bnRfZmFjZXNfc2ZudCggZm9uZF9kYXRhICkgKQotICAgIHsKLSAgICAgIGFzc29jICs9IGZhY2VfaW5kZXg7ICAgICAgICAvKiBhZGQgb24gdGhlIGZhY2VfaW5kZXghICovCi0KLSAgICAgIC8qIGlmIHRoZSBmYWNlIGF0IHRoaXMgaW5kZXggaXMgbm90IHNjYWxhYmxlLAotICAgICAgICAgZmFsbCBiYWNrIHRvIHRoZSBmaXJzdCBvbmUgKG9sZCBiZWhhdmlvcikgKi8KLSAgICAgIGlmICggRW5kaWFuUzE2X0J0b04oIGFzc29jLT5mb250U2l6ZSApID09IDAgKQotICAgICAgewotICAgICAgICAqaGF2ZV9zZm50ID0gMTsKLSAgICAgICAgKnNmbnRfaWQgICA9IEVuZGlhblMxNl9CdG9OKCBhc3NvYy0+Zm9udElEICk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggYmFzZV9hc3NvYy0+Zm9udFNpemUgPT0gMCApCi0gICAgICB7Ci0gICAgICAgICpoYXZlX3NmbnQgPSAxOwotICAgICAgICAqc2ZudF9pZCAgID0gRW5kaWFuUzE2X0J0b04oIGJhc2VfYXNzb2MtPmZvbnRJRCApOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggRW5kaWFuUzMyX0J0b04oIGZvbmQtPmZmU3R5bE9mZiApICkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyKiAgcCA9ICh1bnNpZ25lZCBjaGFyKilmb25kX2RhdGE7Ci0gICAgICBTdHlsZVRhYmxlKiAgICAgc3R5bGU7Ci0gICAgICB1bnNpZ25lZCBzaG9ydCAgc3RyaW5nX2NvdW50OwotICAgICAgY2hhciAgICAgICAgICAgIHBzX25hbWVbMjU2XTsKLSAgICAgIHVuc2lnbmVkIGNoYXIqICBuYW1lc1s2NF07Ci0gICAgICBpbnQgICAgICAgICAgICAgaTsKLQotCi0gICAgICBwICs9IEVuZGlhblMzMl9CdG9OKCBmb25kLT5mZlN0eWxPZmYgKTsKLSAgICAgIHN0eWxlID0gKFN0eWxlVGFibGUqKXA7Ci0gICAgICBwICs9IHNpemVvZiAoIFN0eWxlVGFibGUgKTsKLSAgICAgIHN0cmluZ19jb3VudCA9IEVuZGlhblMxNl9CdG9OKCAqKHNob3J0KikocCkgKTsKLSAgICAgIHN0cmluZ19jb3VudCA9IEZUX01JTiggNjQsIHN0cmluZ19jb3VudCApOwotICAgICAgcCArPSBzaXplb2YgKCBzaG9ydCApOwotCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IHN0cmluZ19jb3VudDsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgbmFtZXNbaV0gPSBwOwotICAgICAgICBwICAgICAgICs9IG5hbWVzW2ldWzBdOwotICAgICAgICBwKys7Ci0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgc2l6ZV90ICBwc19uYW1lX2xlbiA9IChzaXplX3QpbmFtZXNbMF1bMF07Ci0KLQotICAgICAgICBpZiAoIHBzX25hbWVfbGVuICE9IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgZnRfbWVtY3B5KHBzX25hbWUsIG5hbWVzWzBdICsgMSwgcHNfbmFtZV9sZW4pOwotICAgICAgICAgIHBzX25hbWVbcHNfbmFtZV9sZW5dID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIHN0eWxlLT5pbmRleGVzW2ZhY2VfaW5kZXhdID4gMSAmJgotICAgICAgICAgICAgIHN0eWxlLT5pbmRleGVzW2ZhY2VfaW5kZXhdIDw9IHN0cmluZ19jb3VudCApCi0gICAgICAgIHsKLSAgICAgICAgICB1bnNpZ25lZCBjaGFyKiAgc3VmZml4ZXMgPSBuYW1lc1tzdHlsZS0+aW5kZXhlc1tmYWNlX2luZGV4XSAtIDFdOwotCi0KLSAgICAgICAgICBmb3IgKCBpID0gMTsgaSA8PSBzdWZmaXhlc1swXTsgaSsrICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiAgczsKLSAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBqID0gc3VmZml4ZXNbaV0gLSAxOwotCi0KLSAgICAgICAgICAgIGlmICggaiA8IHN0cmluZ19jb3VudCAmJiAoIHMgPSBuYW1lc1tqXSApICE9IE5VTEwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBzaXplX3QgIHNfbGVuID0gKHNpemVfdClzWzBdOwotCi0KLSAgICAgICAgICAgICAgaWYgKCBzX2xlbiAhPSAwICYmIHBzX25hbWVfbGVuICsgc19sZW4gPCBzaXplb2YgKCBwc19uYW1lICkgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZnRfbWVtY3B5KCBwc19uYW1lICsgcHNfbmFtZV9sZW4sIHMgKyAxLCBzX2xlbiApOwotICAgICAgICAgICAgICAgIHBzX25hbWVfbGVuICs9IHNfbGVuOwotICAgICAgICAgICAgICAgIHBzX25hbWVbcHNfbmFtZV9sZW5dID0gMDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBjcmVhdGVfbHdmbl9uYW1lKCBwc19uYW1lLCBsd2ZuX2ZpbGVfbmFtZSApOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljICBGVF9FcnJvcgotICBsb29rdXBfbHdmbl9ieV9mb25kKCBjb25zdCBVSW50OCogICAgICBwYXRoX2ZvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgIENvbnN0U3RyMjU1UGFyYW0gIGJhc2VfbHdmbiwKLSAgICAgICAgICAgICAgICAgICAgICAgVUludDgqICAgICAgICAgICAgcGF0aF9sd2ZuLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICBwYXRoX3NpemUgKQotICB7Ci0gICAgRlNSZWYgICByZWYsIHBhcl9yZWY7Ci0gICAgc2l6ZV90ICBkaXJuYW1lX2xlbjsKLQotCi0gICAgLyogUGF0aG5hbWUgZm9yIEZTUmVmIGNhbiBiZSBpbiB2YXJpb3VzIGZvcm1hdHM6IEhGUywgSEZTKywgYW5kIFBPU0lYLiAqLwotICAgIC8qIFdlIHNob3VsZCBub3QgZXh0cmFjdCBwYXJlbnQgZGlyZWN0b3J5IGJ5IHN0cmluZyBtYW5pcHVsYXRpb24uICAgICAgKi8KLQotICAgIGlmICggbm9FcnIgIT0gRlNQYXRoTWFrZVJlZiggcGF0aF9mb25kLCAmcmVmLCBGQUxTRSApICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgaWYgKCBub0VyciAhPSBGU0dldENhdGFsb2dJbmZvKCAmcmVmLCBrRlNDYXRJbmZvTm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsICZwYXJfcmVmICkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBpZiAoIG5vRXJyICE9IEZTUmVmTWFrZVBhdGgoICZwYXJfcmVmLCBwYXRoX2x3Zm4sIHBhdGhfc2l6ZSApICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgaWYgKCBmdF9zdHJsZW4oIChjaGFyICopcGF0aF9sd2ZuICkgKyAxICsgYmFzZV9sd2ZuWzBdID4gcGF0aF9zaXplICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgLyogbm93IHdlIGhhdmUgYWJzb2x1dGUgZGlybmFtZSBpbiBwYXRoX2x3Zm4gKi8KLSAgICBmdF9zdHJjYXQoIChjaGFyICopcGF0aF9sd2ZuLCAiLyIgKTsKLSAgICBkaXJuYW1lX2xlbiA9IGZ0X3N0cmxlbiggKGNoYXIgKilwYXRoX2x3Zm4gKTsKLSAgICBmdF9zdHJjYXQoIChjaGFyICopcGF0aF9sd2ZuLCAoY2hhciAqKWJhc2VfbHdmbiArIDEgKTsKLSAgICBwYXRoX2x3Zm5bZGlybmFtZV9sZW4gKyBiYXNlX2x3Zm5bMF1dID0gJ1wwJzsKLQotICAgIGlmICggbm9FcnIgIT0gRlNQYXRoTWFrZVJlZiggcGF0aF9sd2ZuLCAmcmVmLCBGQUxTRSApICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X09wZW5fUmVzb3VyY2UgKTsKLQotICAgIGlmICggbm9FcnIgIT0gRlNHZXRDYXRhbG9nSW5mbyggJnJlZiwga0ZTQ2F0SW5mb05vbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMICkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIHNob3J0Ci0gIGNvdW50X2ZhY2VzKCBIYW5kbGUgICAgICAgIGZvbmQsCi0gICAgICAgICAgICAgICBjb25zdCBVSW50OCogIHBhdGhuYW1lICkKLSAgewotICAgIFJlc0lEICAgICBzZm50X2lkOwotICAgIHNob3J0ICAgICBoYXZlX3NmbnQsIGhhdmVfbHdmbjsKLSAgICBTdHIyNTUgICAgbHdmbl9maWxlX25hbWU7Ci0gICAgVUludDggICAgIGJ1ZmZbUEFUSF9NQVhdOwotICAgIEZUX0Vycm9yICBlcnI7Ci0gICAgc2hvcnQgICAgIG51bV9mYWNlczsKLQotCi0gICAgaGF2ZV9zZm50ID0gaGF2ZV9sd2ZuID0gMDsKLQotICAgIHBhcnNlX2ZvbmQoICpmb25kLCAmaGF2ZV9zZm50LCAmc2ZudF9pZCwgbHdmbl9maWxlX25hbWUsIDAgKTsKLQotICAgIGlmICggbHdmbl9maWxlX25hbWVbMF0gKQotICAgIHsKLSAgICAgIGVyciA9IGxvb2t1cF9sd2ZuX2J5X2ZvbmQoIHBhdGhuYW1lLCBsd2ZuX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYsIHNpemVvZiAoIGJ1ZmYgKSAgKTsKLSAgICAgIGlmICggIWVyciApCi0gICAgICAgIGhhdmVfbHdmbiA9IDE7Ci0gICAgfQotCi0gICAgaWYgKCBoYXZlX2x3Zm4gJiYgKCAhaGF2ZV9zZm50IHx8IFBSRUZFUl9MV0ZOICkgKQotICAgICAgbnVtX2ZhY2VzID0gMTsKLSAgICBlbHNlCi0gICAgICBudW1fZmFjZXMgPSBjb3VudF9mYWNlc19zY2FsYWJsZSggKmZvbmQgKTsKLQotICAgIHJldHVybiBudW1fZmFjZXM7Ci0gIH0KLQotCi0gIC8qIFJlYWQgVHlwZSAxIGRhdGEgZnJvbSB0aGUgUE9TVCByZXNvdXJjZXMgaW5zaWRlIHRoZSBMV0ZOIGZpbGUsCi0gICAgIHJldHVybiBhIFBGQiBidWZmZXIuICBUaGlzIGlzIHNvbWV3aGF0IGNvbnZvbHV0ZWQgYmVjYXVzZSB0aGUgRlQyCi0gICAgIFBGQiBwYXJzZXIgd2FudHMgdGhlIEFTQ0lJIGhlYWRlciBhcyBvbmUgY2h1bmssIGFuZCB0aGUgTFdGTgotICAgICBjaHVua3MgYXJlIG9mdGVuIG5vdCBvcmdhbml6ZWQgdGhhdCB3YXksIHNvIHdlIGdsdWUgY2h1bmtzCi0gICAgIG9mIHRoZSBzYW1lIHR5cGUgdG9nZXRoZXIuICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICByZWFkX2x3Zm4oIEZUX01lbW9yeSAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICBSZXNGaWxlUmVmTnVtICByZXMsCi0gICAgICAgICAgICAgRlRfQnl0ZSoqICAgICAgcGZiX2RhdGEsCi0gICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgc2l6ZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBSZXNJRCAgICAgICAgICByZXNfaWQ7Ci0gICAgdW5zaWduZWQgY2hhciAgKmJ1ZmZlciwgKnAsICpzaXplX3AgPSBOVUxMOwotICAgIEZUX1VMb25nICAgICAgIHRvdGFsX3NpemUgPSAwOwotICAgIEZUX1VMb25nICAgICAgIG9sZF90b3RhbF9zaXplID0gMDsKLSAgICBGVF9VTG9uZyAgICAgICBwb3N0X3NpemUsIHBmYl9jaHVua19zaXplOwotICAgIEhhbmRsZSAgICAgICAgIHBvc3RfZGF0YTsKLSAgICBjaGFyICAgICAgICAgICBjb2RlLCBsYXN0X2NvZGU7Ci0KLQotICAgIFVzZVJlc0ZpbGUoIHJlcyApOwotCi0gICAgLyogRmlyc3QgcGFzczogbG9hZCBhbGwgUE9TVCByZXNvdXJjZXMsIGFuZCBkZXRlcm1pbmUgdGhlIHNpemUgb2YgKi8KLSAgICAvKiB0aGUgb3V0cHV0IGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHJlc19pZCAgICA9IDUwMTsKLSAgICBsYXN0X2NvZGUgPSAtMTsKLQotICAgIGZvciAoOzspCi0gICAgewotICAgICAgcG9zdF9kYXRhID0gR2V0MVJlc291cmNlKCBUVEFHX1BPU1QsIHJlc19pZCsrICk7Ci0gICAgICBpZiAoIHBvc3RfZGF0YSA9PSBOVUxMICkKLSAgICAgICAgYnJlYWs7ICAvKiB3ZSBhcmUgZG9uZSAqLwotCi0gICAgICBjb2RlID0gKCpwb3N0X2RhdGEpWzBdOwotCi0gICAgICBpZiAoIGNvZGUgIT0gbGFzdF9jb2RlICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBjb2RlID09IDUgKQotICAgICAgICAgIHRvdGFsX3NpemUgKz0gMjsgLyoganVzdCB0aGUgZW5kIGNvZGUgKi8KLSAgICAgICAgZWxzZQotICAgICAgICAgIHRvdGFsX3NpemUgKz0gNjsgLyogY29kZSArIDQgYnl0ZXMgY2h1bmsgbGVuZ3RoICovCi0gICAgICB9Ci0KLSAgICAgIHRvdGFsX3NpemUgKz0gKEZUX1VMb25nKUdldEhhbmRsZVNpemUoIHBvc3RfZGF0YSApIC0gMjsKLSAgICAgIGxhc3RfY29kZSA9IGNvZGU7Ci0KLSAgICAgIC8qIGRldGVjdCByZXNvdXJjZSBmb3JrIG92ZXJmbG93ICovCi0gICAgICBpZiAoIEZUX01BQ19SRk9SS19NQVhfTEVOIDwgdG90YWxfc2l6ZSApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEFycmF5X1Rvb19MYXJnZSApOwotICAgICAgICBnb3RvIEVycm9yOwotICAgICAgfQotCi0gICAgICBvbGRfdG90YWxfc2l6ZSA9IHRvdGFsX3NpemU7Ci0gICAgfQotCi0gICAgaWYgKCBGVF9BTExPQyggYnVmZmVyLCAoRlRfTG9uZyl0b3RhbF9zaXplICkgKQotICAgICAgZ290byBFcnJvcjsKLQotICAgIC8qIFNlY29uZCBwYXNzOiBhcHBlbmQgYWxsIFBPU1QgZGF0YSB0byB0aGUgYnVmZmVyLCBhZGQgUEZCIGZpZWxkcy4gKi8KLSAgICAvKiBHbHVlIGFsbCBjb25zZWN1dGl2ZSBjaHVua3Mgb2YgdGhlIHNhbWUgdHlwZSB0b2dldGhlci4gICAgICAgICAgICovCi0gICAgcCAgICAgICAgICAgICAgPSBidWZmZXI7Ci0gICAgcmVzX2lkICAgICAgICAgPSA1MDE7Ci0gICAgbGFzdF9jb2RlICAgICAgPSAtMTsKLSAgICBwZmJfY2h1bmtfc2l6ZSA9IDA7Ci0KLSAgICBmb3IgKDs7KQotICAgIHsKLSAgICAgIHBvc3RfZGF0YSA9IEdldDFSZXNvdXJjZSggVFRBR19QT1NULCByZXNfaWQrKyApOwotICAgICAgaWYgKCBwb3N0X2RhdGEgPT0gTlVMTCApCi0gICAgICAgIGJyZWFrOyAgLyogd2UgYXJlIGRvbmUgKi8KLQotICAgICAgcG9zdF9zaXplID0gKEZUX1VMb25nKUdldEhhbmRsZVNpemUoIHBvc3RfZGF0YSApIC0gMjsKLSAgICAgIGNvZGUgPSAoKnBvc3RfZGF0YSlbMF07Ci0KLSAgICAgIGlmICggY29kZSAhPSBsYXN0X2NvZGUgKQotICAgICAgewotICAgICAgICBpZiAoIGxhc3RfY29kZSAhPSAtMSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiB3ZSBhcmUgZG9uZSBhZGRpbmcgYSBjaHVuaywgZmlsbCBpbiB0aGUgc2l6ZSBmaWVsZCAqLwotICAgICAgICAgIGlmICggc2l6ZV9wICE9IE5VTEwgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICpzaXplX3ArKyA9IChGVF9CeXRlKSggICBwZmJfY2h1bmtfc2l6ZSAgICAgICAgICYgMHhGRiApOwotICAgICAgICAgICAgKnNpemVfcCsrID0gKEZUX0J5dGUpKCAoIHBmYl9jaHVua19zaXplID4+IDggICkgJiAweEZGICk7Ci0gICAgICAgICAgICAqc2l6ZV9wKysgPSAoRlRfQnl0ZSkoICggcGZiX2NodW5rX3NpemUgPj4gMTYgKSAmIDB4RkYgKTsKLSAgICAgICAgICAgICpzaXplX3ArKyA9IChGVF9CeXRlKSggKCBwZmJfY2h1bmtfc2l6ZSA+PiAyNCApICYgMHhGRiApOwotICAgICAgICAgIH0KLSAgICAgICAgICBwZmJfY2h1bmtfc2l6ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAqcCsrID0gMHg4MDsKLSAgICAgICAgaWYgKCBjb2RlID09IDUgKQotICAgICAgICAgICpwKysgPSAweDAzOyAgLyogdGhlIGVuZCAqLwotICAgICAgICBlbHNlIGlmICggY29kZSA9PSAyICkKLSAgICAgICAgICAqcCsrID0gMHgwMjsgIC8qIGJpbmFyeSBzZWdtZW50ICovCi0gICAgICAgIGVsc2UKLSAgICAgICAgICAqcCsrID0gMHgwMTsgIC8qIEFTQ0lJIHNlZ21lbnQgKi8KLQotICAgICAgICBpZiAoIGNvZGUgIT0gNSApCi0gICAgICAgIHsKLSAgICAgICAgICBzaXplX3AgPSBwOyAgIC8qIHNhdmUgZm9yIGxhdGVyICovCi0gICAgICAgICAgcCArPSA0OyAgICAgICAvKiBtYWtlIHNwYWNlIGZvciBzaXplIGZpZWxkICovCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZnRfbWVtY3B5KCBwLCAqcG9zdF9kYXRhICsgMiwgcG9zdF9zaXplICk7Ci0gICAgICBwZmJfY2h1bmtfc2l6ZSArPSBwb3N0X3NpemU7Ci0gICAgICBwICs9IHBvc3Rfc2l6ZTsKLSAgICAgIGxhc3RfY29kZSA9IGNvZGU7Ci0gICAgfQotCi0gICAgKnBmYl9kYXRhID0gYnVmZmVyOwotICAgICpzaXplID0gdG90YWxfc2l6ZTsKLQotICBFcnJvcjoKLSAgICBDbG9zZVJlc0ZpbGUoIHJlcyApOwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogQ3JlYXRlIGEgbmV3IEZUX0ZhY2UgZnJvbSBhIGZpbGUgcGF0aCB0byBhbiBMV0ZOIGZpbGUuICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBGVF9OZXdfRmFjZV9Gcm9tX0xXRk4oIEZUX0xpYnJhcnkgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSW50OCogIHBhdGhuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlKiAgICAgIGFmYWNlICkKLSAgewotICAgIEZUX0J5dGUqICAgICAgIHBmYl9kYXRhOwotICAgIEZUX1VMb25nICAgICAgIHBmYl9zaXplOwotICAgIEZUX0Vycm9yICAgICAgIGVycm9yOwotICAgIFJlc0ZpbGVSZWZOdW0gIHJlczsKLQotCi0gICAgaWYgKCBub0VyciAhPSBGVF9GU1BhdGhNYWtlUmVzKCBwYXRobmFtZSwgJnJlcyApICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X09wZW5fUmVzb3VyY2UgKTsKLQotICAgIHBmYl9kYXRhID0gTlVMTDsKLSAgICBwZmJfc2l6ZSA9IDA7Ci0gICAgZXJyb3IgPSByZWFkX2x3Zm4oIGxpYnJhcnktPm1lbW9yeSwgcmVzLCAmcGZiX2RhdGEsICZwZmJfc2l6ZSApOwotICAgIENsb3NlUmVzRmlsZSggcmVzICk7IC8qIFBGQiBpcyBhbHJlYWR5IGxvYWRlZCwgdXNlbGVzcyBhbnltb3JlICovCi0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICByZXR1cm4gb3Blbl9mYWNlX2Zyb21fYnVmZmVyKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmYl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmYl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZmFjZSApOwotICB9Ci0KLQotICAvKiBDcmVhdGUgYSBuZXcgRlRfRmFjZSBmcm9tIGFuIFNGTlQgcmVzb3VyY2UsIHNwZWNpZmllZCBieSByZXMgSUQuICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBGVF9OZXdfRmFjZV9Gcm9tX1NGTlQoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgUmVzSUQgICAgICAgc2ZudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UqICAgIGFmYWNlICkKLSAgewotICAgIEhhbmRsZSAgICAgc2ZudCA9IE5VTEw7Ci0gICAgRlRfQnl0ZSogICBzZm50X2RhdGE7Ci0gICAgc2l6ZV90ICAgICBzZm50X3NpemU7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0gICAgaW50ICAgICAgICBpc19jZmYsIGlzX3NmbnRfcHM7Ci0KLQotICAgIHNmbnQgPSBHZXRSZXNvdXJjZSggVFRBR19zZm50LCBzZm50X2lkICk7Ci0gICAgaWYgKCBzZm50ID09IE5VTEwgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0hhbmRsZSApOwotCi0gICAgc2ZudF9zaXplID0gKEZUX1VMb25nKUdldEhhbmRsZVNpemUoIHNmbnQgKTsKLQotICAgIC8qIGRldGVjdCByZXNvdXJjZSBmb3JrIG92ZXJmbG93ICovCi0gICAgaWYgKCBGVF9NQUNfUkZPUktfTUFYX0xFTiA8IHNmbnRfc2l6ZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEFycmF5X1Rvb19MYXJnZSApOwotCi0gICAgaWYgKCBGVF9BTExPQyggc2ZudF9kYXRhLCAoRlRfTG9uZylzZm50X3NpemUgKSApCi0gICAgewotICAgICAgUmVsZWFzZVJlc291cmNlKCBzZm50ICk7Ci0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgZnRfbWVtY3B5KCBzZm50X2RhdGEsICpzZm50LCBzZm50X3NpemUgKTsKLSAgICBSZWxlYXNlUmVzb3VyY2UoIHNmbnQgKTsKLQotICAgIGlzX2NmZiAgICAgPSBzZm50X3NpemUgPiA0ICYmICFmdF9tZW1jbXAoIHNmbnRfZGF0YSwgIk9UVE8iLCA0ICk7Ci0gICAgaXNfc2ZudF9wcyA9IHNmbnRfc2l6ZSA+IDQgJiYgIWZ0X21lbWNtcCggc2ZudF9kYXRhLCAidHlwMSIsIDQgKTsKLQotICAgIGlmICggaXNfc2ZudF9wcyApCi0gICAgewotICAgICAgRlRfU3RyZWFtICBzdHJlYW07Ci0KLQotICAgICAgaWYgKCBGVF9ORVcoIHN0cmVhbSApICkKLSAgICAgICAgZ290byBUcnlfT3BlblR5cGU7Ci0KLSAgICAgIEZUX1N0cmVhbV9PcGVuTWVtb3J5KCBzdHJlYW0sIHNmbnRfZGF0YSwgc2ZudF9zaXplICk7Ci0gICAgICBpZiAoICFvcGVuX2ZhY2VfUFNfZnJvbV9zZm50X3N0cmVhbSggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmYWNlICkgKQotICAgICAgewotICAgICAgICBGVF9TdHJlYW1fQ2xvc2UoIHN0cmVhbSApOwotICAgICAgICBGVF9GUkVFKCBzdHJlYW0gKTsKLSAgICAgICAgRlRfRlJFRSggc2ZudF9kYXRhICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgRlRfRlJFRSggc3RyZWFtICk7Ci0gICAgfQotICBUcnlfT3BlblR5cGU6Ci0gICAgZXJyb3IgPSBvcGVuX2ZhY2VfZnJvbV9idWZmZXIoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmbnRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZudF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19jZmYgPyAiY2ZmIiA6ICJ0cnVldHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmYWNlICk7Ci0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBDcmVhdGUgYSBuZXcgRlRfRmFjZSBmcm9tIGEgZmlsZSBwYXRoIHRvIGEgc3VpdGNhc2UgZmlsZS4gKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIEZUX05ld19GYWNlX0Zyb21fU3VpdGNhc2UoIEZUX0xpYnJhcnkgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVUludDgqICBwYXRobmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlKiAgICAgIGFmYWNlICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgIGVycm9yID0gRlRfRVJSKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwotICAgIFJlc0ZpbGVSZWZOdW0gIHJlc19yZWY7Ci0gICAgUmVzb3VyY2VJbmRleCAgcmVzX2luZGV4OwotICAgIEhhbmRsZSAgICAgICAgIGZvbmQ7Ci0gICAgc2hvcnQgICAgICAgICAgbnVtX2ZhY2VzX2luX3JlczsKLQotCi0gICAgaWYgKCBub0VyciAhPSBGVF9GU1BhdGhNYWtlUmVzKCBwYXRobmFtZSwgJnJlc19yZWYgKSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIENhbm5vdF9PcGVuX1Jlc291cmNlICk7Ci0KLSAgICBVc2VSZXNGaWxlKCByZXNfcmVmICk7Ci0gICAgaWYgKCBSZXNFcnJvcigpICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X09wZW5fUmVzb3VyY2UgKTsKLQotICAgIG51bV9mYWNlc19pbl9yZXMgPSAwOwotICAgIGZvciAoIHJlc19pbmRleCA9IDE7IDsgKytyZXNfaW5kZXggKQotICAgIHsKLSAgICAgIHNob3J0ICBudW1fZmFjZXNfaW5fZm9uZDsKLQotCi0gICAgICBmb25kID0gR2V0MUluZFJlc291cmNlKCBUVEFHX0ZPTkQsIHJlc19pbmRleCApOwotICAgICAgaWYgKCBSZXNFcnJvcigpICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIG51bV9mYWNlc19pbl9mb25kICA9IGNvdW50X2ZhY2VzKCBmb25kLCBwYXRobmFtZSApOwotICAgICAgbnVtX2ZhY2VzX2luX3JlcyAgKz0gbnVtX2ZhY2VzX2luX2ZvbmQ7Ci0KLSAgICAgIGlmICggMCA8PSBmYWNlX2luZGV4ICYmIGZhY2VfaW5kZXggPCBudW1fZmFjZXNfaW5fZm9uZCAmJiBlcnJvciApCi0gICAgICAgIGVycm9yID0gRlRfTmV3X0ZhY2VfRnJvbV9GT05EKCBsaWJyYXJ5LCBmb25kLCBmYWNlX2luZGV4LCBhZmFjZSApOwotCi0gICAgICBmYWNlX2luZGV4IC09IG51bV9mYWNlc19pbl9mb25kOwotICAgIH0KLQotICAgIENsb3NlUmVzRmlsZSggcmVzX3JlZiApOwotICAgIGlmICggIWVycm9yICYmIGFmYWNlICYmICphZmFjZSApCi0gICAgICAoKmFmYWNlKS0+bnVtX2ZhY2VzID0gbnVtX2ZhY2VzX2luX3JlczsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRtYWMuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfTmV3X0ZhY2VfRnJvbV9GT05EKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZSAgICAgIGZvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlKiAgICBhZmFjZSApCi0gIHsKLSAgICBzaG9ydCAgICAgaGF2ZV9zZm50LCBoYXZlX2x3Zm4gPSAwOwotICAgIFJlc0lEICAgICBzZm50X2lkLCBmb25kX2lkOwotICAgIE9TVHlwZSAgICBmb25kX3R5cGU7Ci0gICAgU3RyMjU1ICAgIGZvbmRfbmFtZTsKLSAgICBTdHIyNTUgICAgbHdmbl9maWxlX25hbWU7Ci0gICAgVUludDggICAgIHBhdGhfbHdmbltQQVRIX01BWF07Ci0gICAgT1NFcnIgICAgIGVycjsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIC8qIGNoZWNrIG9mIGBsaWJyYXJ5JyBhbmQgYGFmYWNlJyBkZWxheWVkIHRvIGBGVF9OZXdfRmFjZV9Gcm9tX1hYWCcgKi8KLQotICAgIEdldFJlc0luZm8oIGZvbmQsICZmb25kX2lkLCAmZm9uZF90eXBlLCBmb25kX25hbWUgKTsKLSAgICBpZiAoIFJlc0Vycm9yKCkgIT0gbm9FcnIgfHwgZm9uZF90eXBlICE9IFRUQUdfRk9ORCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLQotICAgIHBhcnNlX2ZvbmQoICpmb25kLCAmaGF2ZV9zZm50LCAmc2ZudF9pZCwgbHdmbl9maWxlX25hbWUsIGZhY2VfaW5kZXggKTsKLQotICAgIGlmICggbHdmbl9maWxlX25hbWVbMF0gKQotICAgIHsKLSAgICAgIFJlc0ZpbGVSZWZOdW0gIHJlczsKLQotCi0gICAgICByZXMgPSBIb21lUmVzRmlsZSggZm9uZCApOwotICAgICAgaWYgKCBub0VyciAhPSBSZXNFcnJvcigpICkKLSAgICAgICAgZ290byBmb3VuZF9ub19sd2ZuX2ZpbGU7Ci0KLSAgICAgIHsKLSAgICAgICAgVUludDggIHBhdGhfZm9uZFtQQVRIX01BWF07Ci0gICAgICAgIEZTUmVmICByZWY7Ci0KLQotICAgICAgICBlcnIgPSBGU0dldEZvcmtDQkluZm8oIHJlcywga0ZTSW52YWxpZFZvbHVtZVJlZk51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCAmcmVmLCBOVUxMICk7Ci0gICAgICAgIGlmICggbm9FcnIgIT0gZXJyICkKLSAgICAgICAgICBnb3RvIGZvdW5kX25vX2x3Zm5fZmlsZTsKLQotICAgICAgICBlcnIgPSBGU1JlZk1ha2VQYXRoKCAmcmVmLCBwYXRoX2ZvbmQsIHNpemVvZiAoIHBhdGhfZm9uZCApICk7Ci0gICAgICAgIGlmICggbm9FcnIgIT0gZXJyICkKLSAgICAgICAgICBnb3RvIGZvdW5kX25vX2x3Zm5fZmlsZTsKLQotICAgICAgICBlcnJvciA9IGxvb2t1cF9sd2ZuX2J5X2ZvbmQoIHBhdGhfZm9uZCwgbHdmbl9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF9sd2ZuLCBzaXplb2YgKCBwYXRoX2x3Zm4gKSApOwotICAgICAgICBpZiAoICFlcnJvciApCi0gICAgICAgICAgaGF2ZV9sd2ZuID0gMTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIGhhdmVfbHdmbiAmJiAoICFoYXZlX3NmbnQgfHwgUFJFRkVSX0xXRk4gKSApCi0gICAgICBlcnJvciA9IEZUX05ld19GYWNlX0Zyb21fTFdGTiggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoX2x3Zm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZmFjZSApOwotICAgIGVsc2UKLSAgICAgIGVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLQotICBmb3VuZF9ub19sd2ZuX2ZpbGU6Ci0gICAgaWYgKCBoYXZlX3NmbnQgJiYgZXJyb3IgKQotICAgICAgZXJyb3IgPSBGVF9OZXdfRmFjZV9Gcm9tX1NGTlQoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ZudF9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmYWNlICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIENvbW1vbiBmdW5jdGlvbiB0byBsb2FkIGEgbmV3IEZUX0ZhY2UgZnJvbSBhIHJlc291cmNlIGZpbGUuICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBGVF9OZXdfRmFjZV9Gcm9tX1Jlc291cmNlKCBGVF9MaWJyYXJ5ICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFVJbnQ4KiAgcGF0aG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSogICAgICBhZmFjZSApCi0gIHsKLSAgICBPU1R5cGUgICAgZmlsZV90eXBlOwotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgLyogTFdGTiBpcyBhICh2ZXJ5KSBzcGVjaWZpYyBmaWxlIGZvcm1hdCwgY2hlY2sgZm9yIGl0IGV4cGxpY2l0bHkgKi8KLSAgICBmaWxlX3R5cGUgPSBnZXRfZmlsZV90eXBlX2Zyb21fcGF0aCggcGF0aG5hbWUgKTsKLSAgICBpZiAoIGZpbGVfdHlwZSA9PSBUVEFHX0xXRk4gKQotICAgICAgcmV0dXJuIEZUX05ld19GYWNlX0Zyb21fTFdGTiggbGlicmFyeSwgcGF0aG5hbWUsIGZhY2VfaW5kZXgsIGFmYWNlICk7Ci0KLSAgICAvKiBPdGhlcndpc2UgdGhlIGZpbGUgdHlwZSBkb2Vzbid0IG1hdHRlciAodGhlcmUgYXJlIG1vcmUgdGhhbiAgKi8KLSAgICAvKiBgRkZJTCcgYW5kIGB0ZmlsJykuICBKdXN0IHRyeSBvcGVuaW5nIGl0IGFzIGEgZm9udCBzdWl0Y2FzZTsgKi8KLSAgICAvKiBpZiBpdCB3b3JrcywgZmluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIGVycm9yID0gRlRfTmV3X0ZhY2VfRnJvbV9TdWl0Y2FzZSggbGlicmFyeSwgcGF0aG5hbWUsIGZhY2VfaW5kZXgsIGFmYWNlICk7Ci0gICAgaWYgKCBlcnJvciA9PSAwICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIC8qIGxldCBpdCBmYWxsIHRocm91Z2ggdG8gbm9ybWFsIGxvYWRlciAoLnR0ZiwgLm90ZiwgZXRjLik7ICovCi0gICAgLyogd2Ugc2lnbmFsIHRoaXMgYnkgcmV0dXJuaW5nIG5vIGVycm9yIGFuZCBubyBGVF9GYWNlICAgICAgKi8KLSAgICAqYWZhY2UgPSBOVUxMOwotICAgIHJldHVybiAwOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGlzIHRoZSBNYWMtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgRlRfTmV3X0ZhY2UuICBJbiAgICAgICAgKi8KLSAgLyogICAgYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIEZUX05ld19GYWNlKCkgZnVuY3Rpb25hbGl0eSwgaXQgYWxzbyAgICAgICovCi0gIC8qICAgIGFjY2VwdHMgcGF0aG5hbWVzIHRvIE1hYyBzdWl0Y2FzZSBmaWxlcy4gIEZvciBmdXJ0aGVyICAgICAgICAgICAgICAqLwotICAvKiAgICBkb2N1bWVudGF0aW9uIHNlZSB0aGUgb3JpZ2luYWwgRlRfTmV3X0ZhY2UoKSBpbiBmcmVldHlwZS5oLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfTmV3X0ZhY2UoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHBhdGhuYW1lLAotICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICBGVF9GYWNlKiAgICAgYWZhY2UgKQotICB7Ci0gICAgRlRfT3Blbl9BcmdzICBhcmdzOwotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0KLQotICAgIC8qIHRlc3QgZm9yIHZhbGlkIGBsaWJyYXJ5JyBhbmQgYGFmYWNlJyBkZWxheWVkIHRvIEZUX09wZW5fRmFjZSgpICovCi0gICAgaWYgKCAhcGF0aG5hbWUgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICAqYWZhY2UgPSBOVUxMOwotCi0gICAgLyogdHJ5IHJlc291cmNlZm9yayBiYXNlZCBmb250OiBMV0ZOLCBGRklMICovCi0gICAgZXJyb3IgPSBGVF9OZXdfRmFjZV9Gcm9tX1Jlc291cmNlKCBsaWJyYXJ5LCAoVUludDggKilwYXRobmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5kZXgsIGFmYWNlICk7Ci0gICAgaWYgKCBlcnJvciAhPSAwIHx8ICphZmFjZSAhPSBOVUxMICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIC8qIGxldCBpdCBmYWxsIHRocm91Z2ggdG8gbm9ybWFsIGxvYWRlciAoLnR0ZiwgLm90ZiwgZXRjLikgKi8KLSAgICBhcmdzLmZsYWdzICAgID0gRlRfT1BFTl9QQVRITkFNRTsKLSAgICBhcmdzLnBhdGhuYW1lID0gKGNoYXIqKXBhdGhuYW1lOwotICAgIHJldHVybiBGVF9PcGVuX0ZhY2UoIGxpYnJhcnksICZhcmdzLCBmYWNlX2luZGV4LCBhZmFjZSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZV9Gcm9tX0ZTUmVmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZV9Gcm9tX0ZTUmVmIGlzIGlkZW50aWNhbCB0byBGVF9OZXdfRmFjZSBleGNlcHQgaXQgICAgICAgKi8KLSAgLyogICAgYWNjZXB0cyBhbiBGU1JlZiBpbnN0ZWFkIG9mIGEgcGF0aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgYmVjYXVzZSBDYXJib24gZGF0YSB0eXBlcyAoRlNSZWYpICAgICAgICAgKi8KLSAgLyogYXJlIG5vdCBjcm9zcy1wbGF0Zm9ybSwgYW5kIHRodXMgbm90IHN1aXRhYmxlIGZvciB0aGUgZnJlZXR5cGUgQVBJLiAgICovCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfTmV3X0ZhY2VfRnJvbV9GU1JlZiggRlRfTGlicmFyeSAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGU1JlZiogIHJlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlKiAgICAgIGFmYWNlICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0gICAgRlRfT3Blbl9BcmdzICBhcmdzOwotCi0gICAgT1NFcnIgIGVycjsKLSAgICBVSW50OCAgcGF0aG5hbWVbUEFUSF9NQVhdOwotCi0KLSAgICAvKiBjaGVjayBvZiBgbGlicmFyeScgYW5kIGBhZmFjZScgZGVsYXllZCB0byAqLwotICAgIC8qIGBGVF9OZXdfRmFjZV9Gcm9tX1Jlc291cmNlJyAgICAgICAgICAgICAgICovCi0KLSAgICBpZiAoICFyZWYgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBlcnIgPSBGU1JlZk1ha2VQYXRoKCByZWYsIHBhdGhuYW1lLCBzaXplb2YgKCBwYXRobmFtZSApICk7Ci0gICAgaWYgKCBlcnIgKQotICAgICAgZXJyb3IgPSBGVF9USFJPVyggQ2Fubm90X09wZW5fUmVzb3VyY2UgKTsKLQotICAgIGVycm9yID0gRlRfTmV3X0ZhY2VfRnJvbV9SZXNvdXJjZSggbGlicmFyeSwgcGF0aG5hbWUsIGZhY2VfaW5kZXgsIGFmYWNlICk7Ci0gICAgaWYgKCBlcnJvciAhPSAwIHx8ICphZmFjZSAhPSBOVUxMICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIC8qIGZhbGxiYWNrIHRvIGRhdGFmb3JrIGZvbnQgKi8KLSAgICBhcmdzLmZsYWdzICAgID0gRlRfT1BFTl9QQVRITkFNRTsKLSAgICBhcmdzLnBhdGhuYW1lID0gKGNoYXIqKXBhdGhuYW1lOwotICAgIHJldHVybiBGVF9PcGVuX0ZhY2UoIGxpYnJhcnksICZhcmdzLCBmYWNlX2luZGV4LCBhZmFjZSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYyBpcyBpZGVudGljYWwgdG8gRlRfTmV3X0ZhY2UgZXhjZXB0IGl0ICAgICAgKi8KLSAgLyogICAgYWNjZXB0cyBhbiBGU1NwZWMgaW5zdGVhZCBvZiBhIHBhdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgYmVjYXVzZSBGU1NwZWMgaXMgZGVwcmVjYXRlZCBpbiBNYWMgT1MgWCAgKi8KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9OZXdfRmFjZV9Gcm9tX0ZTU3BlYyggRlRfTGlicmFyeSAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZTU3BlYyogIHNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSogICAgICAgYWZhY2UgKQotICB7Ci0jaWYgKCBfX0xQNjRfXyApIHx8ICggZGVmaW5lZCggTUFDX09TX1hfVkVSU0lPTl8xMF81ICkgJiYgXAotICAgICAgKCBNQUNfT1NfWF9WRVJTSU9OX01JTl9SRVFVSVJFRCA+PSBNQUNfT1NfWF9WRVJTSU9OXzEwXzUgKSApCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7Ci0gICAgRlRfVU5VU0VEKCBzcGVjICk7Ci0gICAgRlRfVU5VU0VEKCBmYWNlX2luZGV4ICk7Ci0gICAgRlRfVU5VU0VEKCBhZmFjZSApOwotCi0gICAgcmV0dXJuIEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLSNlbHNlCi0gICAgRlNSZWYgIHJlZjsKLQotCi0gICAgLyogY2hlY2sgb2YgYGxpYnJhcnknIGFuZCBgYWZhY2UnIGRlbGF5ZWQgdG8gYEZUX05ld19GYWNlX0Zyb21fRlNSZWYnICovCi0KLSAgICBpZiAoICFzcGVjIHx8IEZTcE1ha2VGU1JlZiggc3BlYywgJnJlZiApICE9IG5vRXJyICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBGVF9OZXdfRmFjZV9Gcm9tX0ZTUmVmKCBsaWJyYXJ5LCAmcmVmLCBmYWNlX2luZGV4LCBhZmFjZSApOwotI2VuZGlmCi0gIH0KLQotI2VuZGlmIC8qIEZUX01BQ0lOVE9TSCAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRtbS5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRtbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzAxMmFhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0bW0uYworKysgL2Rldi9udWxsCkBAIC0xLDIzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG1tLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgTXVsdGlwbGUgTWFzdGVyIGZvbnQgc3VwcG9ydCAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0jaW5jbHVkZSBGVF9NVUxUSVBMRV9NQVNURVJTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9NVUxUSVBMRV9NQVNURVJTX0gKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX21tCi0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfZmFjZV9nZXRfbW1fc2VydmljZSggRlRfRmFjZSAgICAgICAgICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlX011bHRpTWFzdGVycyAgKmFzZXJ2aWNlICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgKmFzZXJ2aWNlID0gTlVMTDsKLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICBlcnJvciA9IEZUX0VSUiggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgaWYgKCBGVF9IQVNfTVVMVElQTEVfTUFTVEVSUyggZmFjZSApICkKLSAgICB7Ci0gICAgICBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFKCBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmFzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVVMVElfTUFTVEVSUyApOwotCi0gICAgICBpZiAoICphc2VydmljZSApCi0gICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG1tLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldF9NdWx0aV9NYXN0ZXIoIEZUX0ZhY2UgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX011bHRpX01hc3RlciAgKmFtYXN0ZXIgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICAgICAgIGVycm9yOwotICAgIEZUX1NlcnZpY2VfTXVsdGlNYXN0ZXJzICBzZXJ2aWNlOwotCi0KLSAgICAvKiBjaGVjayBvZiBgZmFjZScgZGVsYXllZCB0byBgZnRfZmFjZV9nZXRfbW1fc2VydmljZScgKi8KLQotICAgIGlmICggIWFtYXN0ZXIgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBlcnJvciA9IGZ0X2ZhY2VfZ2V0X21tX3NlcnZpY2UoIGZhY2UsICZzZXJ2aWNlICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBpZiAoIHNlcnZpY2UtPmdldF9tbSApCi0gICAgICAgIGVycm9yID0gc2VydmljZS0+Z2V0X21tKCBmYWNlLCBhbWFzdGVyICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bW0uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2V0X01NX1ZhciggRlRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgIEZUX01NX1ZhciogICphbWFzdGVyICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgICBlcnJvcjsKLSAgICBGVF9TZXJ2aWNlX011bHRpTWFzdGVycyAgc2VydmljZTsKLQotCi0gICAgLyogY2hlY2sgb2YgYGZhY2UnIGRlbGF5ZWQgdG8gYGZ0X2ZhY2VfZ2V0X21tX3NlcnZpY2UnICovCi0KLSAgICBpZiAoICFhbWFzdGVyICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgZXJyb3IgPSBmdF9mYWNlX2dldF9tbV9zZXJ2aWNlKCBmYWNlLCAmc2VydmljZSApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX0VSUiggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgaWYgKCBzZXJ2aWNlLT5nZXRfbW1fdmFyICkKLSAgICAgICAgZXJyb3IgPSBzZXJ2aWNlLT5nZXRfbW1fdmFyKCBmYWNlLCBhbWFzdGVyICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bW0uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU2V0X01NX0Rlc2lnbl9Db29yZGluYXRlcyggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgY29vcmRzICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgICBlcnJvcjsKLSAgICBGVF9TZXJ2aWNlX011bHRpTWFzdGVycyAgc2VydmljZTsKLQotCi0gICAgLyogY2hlY2sgb2YgYGZhY2UnIGRlbGF5ZWQgdG8gYGZ0X2ZhY2VfZ2V0X21tX3NlcnZpY2UnICovCi0KLSAgICBpZiAoICFjb29yZHMgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBlcnJvciA9IGZ0X2ZhY2VfZ2V0X21tX3NlcnZpY2UoIGZhY2UsICZzZXJ2aWNlICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBpZiAoIHNlcnZpY2UtPnNldF9tbV9kZXNpZ24gKQotICAgICAgICBlcnJvciA9IHNlcnZpY2UtPnNldF9tbV9kZXNpZ24oIGZhY2UsIG51bV9jb29yZHMsIGNvb3JkcyApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG1tLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1NldF9WYXJfRGVzaWduX0Nvb3JkaW5hdGVzKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgZXJyb3I7Ci0gICAgRlRfU2VydmljZV9NdWx0aU1hc3RlcnMgIHNlcnZpY2U7Ci0KLQotICAgIC8qIGNoZWNrIG9mIGBmYWNlJyBkZWxheWVkIHRvIGBmdF9mYWNlX2dldF9tbV9zZXJ2aWNlJyAqLwotCi0gICAgaWYgKCAhY29vcmRzICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgZXJyb3IgPSBmdF9mYWNlX2dldF9tbV9zZXJ2aWNlKCBmYWNlLCAmc2VydmljZSApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX0VSUiggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgaWYgKCBzZXJ2aWNlLT5zZXRfdmFyX2Rlc2lnbiApCi0gICAgICAgIGVycm9yID0gc2VydmljZS0+c2V0X3Zhcl9kZXNpZ24oIGZhY2UsIG51bV9jb29yZHMsIGNvb3JkcyApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG1tLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1NldF9NTV9CbGVuZF9Db29yZGluYXRlcyggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgZXJyb3I7Ci0gICAgRlRfU2VydmljZV9NdWx0aU1hc3RlcnMgIHNlcnZpY2U7Ci0KLQotICAgIC8qIGNoZWNrIG9mIGBmYWNlJyBkZWxheWVkIHRvIGBmdF9mYWNlX2dldF9tbV9zZXJ2aWNlJyAqLwotCi0gICAgaWYgKCAhY29vcmRzICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgZXJyb3IgPSBmdF9mYWNlX2dldF9tbV9zZXJ2aWNlKCBmYWNlLCAmc2VydmljZSApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX0VSUiggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgaWYgKCBzZXJ2aWNlLT5zZXRfbW1fYmxlbmQgKQotICAgICAgICAgZXJyb3IgPSBzZXJ2aWNlLT5zZXRfbW1fYmxlbmQoIGZhY2UsIG51bV9jb29yZHMsIGNvb3JkcyApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG1tLmggKi8KLQotICAvKiBUaGlzIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGZ1bmN0aW9uLiAgSXQgZXhpc3RzIGZvciAqLwotICAvKiBvcnRob2dvbmFsaXR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU2V0X1Zhcl9CbGVuZF9Db29yZGluYXRlcyggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgICBlcnJvcjsKLSAgICBGVF9TZXJ2aWNlX011bHRpTWFzdGVycyAgc2VydmljZTsKLQotCi0gICAgLyogY2hlY2sgb2YgYGZhY2UnIGRlbGF5ZWQgdG8gYGZ0X2ZhY2VfZ2V0X21tX3NlcnZpY2UnICovCi0KLSAgICBpZiAoICFjb29yZHMgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBlcnJvciA9IGZ0X2ZhY2VfZ2V0X21tX3NlcnZpY2UoIGZhY2UsICZzZXJ2aWNlICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBpZiAoIHNlcnZpY2UtPnNldF9tbV9ibGVuZCApCi0gICAgICAgICBlcnJvciA9IHNlcnZpY2UtPnNldF9tbV9ibGVuZCggZmFjZSwgbnVtX2Nvb3JkcywgY29vcmRzICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdG9ianMuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0b2Jqcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGMyZTc3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0b2Jqcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG9ianMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHByaXZhdGUgYmFzZSBjbGFzc2VzIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfTElTVF9ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1ZBTElEQVRFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUkZPUktfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NGTlRfSCAgICAvKiBmb3IgU0ZOVF9Mb2FkX1RhYmxlX0Z1bmMgKi8KLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBQkxFU19ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX0lEU19ICi0KLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUFJPUEVSVElFU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1NGTlRfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX05BTUVfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9HTFlQSF9ESUNUX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfVFRfQ01BUF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0tFUk5JTkdfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9UUlVFVFlQRV9FTkdJTkVfSAotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9NQUNfRk9OVFMKLSNpbmNsdWRlICJmdGJhc2UuaCIKLSNlbmRpZgotCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotCi0jaW5jbHVkZSBGVF9CSVRNQVBfSAotCi0jaWYgZGVmaW5lZCggX01TQ19WRVIgKSAgICAgIC8qIFZpc3VhbCBDKysgKGFuZCBJbnRlbCBDKyspICAgKi8KLSAgLyogV2UgZGlzYWJsZSB0aGUgd2FybmluZyBgY29udmVyc2lvbiBmcm9tIFhYWCB0byBZWVksICAgICAqLwotICAvKiBwb3NzaWJsZSBsb3NzIG9mIGRhdGEnIGluIG9yZGVyIHRvIGNvbXBpbGUgY2xlYW5seSB3aXRoICovCi0gIC8qIHRoZSBtYXhpbXVtIGxldmVsIG9mIHdhcm5pbmdzOiBgbWQ1LmMnIGlzIG5vbi1GcmVlVHlwZSAgKi8KLSAgLyogY29kZSwgYW5kIGl0IGdldHMgdXNlZCBkdXJpbmcgZGV2ZWxvcG1lbnQgYnVpbGRzIG9ubHkuICAqLwotI3ByYWdtYSB3YXJuaW5nKCBwdXNoICkKLSNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQyNDQgKQotI2VuZGlmIC8qIF9NU0NfVkVSICovCi0KLSAgLyogaXQncyBlYXNpZXN0IHRvIGluY2x1ZGUgYG1kNS5jJyBkaXJlY3RseSAqLwotI2luY2x1ZGUgIm1kNS5jIgotCi0jaWYgZGVmaW5lZCggX01TQ19WRVIgKQotI3ByYWdtYSB3YXJuaW5nKCBwb3AgKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0KLSNkZWZpbmUgR1JJRF9GSVRfTUVUUklDUwotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1BvaW50ZXIgKQotICBmdF9zZXJ2aWNlX2xpc3RfbG9va3VwKCBGVF9TZXJ2aWNlRGVzYyAgc2VydmljZV9kZXNjcmlwdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogICAgIHNlcnZpY2VfaWQgKQotICB7Ci0gICAgRlRfUG9pbnRlciAgICAgIHJlc3VsdCA9IE5VTEw7Ci0gICAgRlRfU2VydmljZURlc2MgIGRlc2MgICA9IHNlcnZpY2VfZGVzY3JpcHRvcnM7Ci0KLQotICAgIGlmICggZGVzYyAmJiBzZXJ2aWNlX2lkICkKLSAgICB7Ci0gICAgICBmb3IgKCA7IGRlc2MtPnNlcnZfaWQgIT0gTlVMTDsgZGVzYysrICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBmdF9zdHJjbXAoIGRlc2MtPnNlcnZfaWQsIHNlcnZpY2VfaWQgKSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IChGVF9Qb2ludGVyKWRlc2MtPnNlcnZfZGF0YTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgZnRfdmFsaWRhdG9yX2luaXQoIEZUX1ZhbGlkYXRvciAgICAgICAgdmFsaWQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CeXRlKiAgICAgIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CeXRlKiAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdGlvbkxldmVsICBsZXZlbCApCi0gIHsKLSAgICB2YWxpZC0+YmFzZSAgPSBiYXNlOwotICAgIHZhbGlkLT5saW1pdCA9IGxpbWl0OwotICAgIHZhbGlkLT5sZXZlbCA9IGxldmVsOwotICAgIHZhbGlkLT5lcnJvciA9IEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0ludCApCi0gIGZ0X3ZhbGlkYXRvcl9ydW4oIEZUX1ZhbGlkYXRvciAgdmFsaWQgKQotICB7Ci0gICAgLyogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHdvcmshICBOb25lIHNob3VsZCBjYWxsIGl0LiAqLwotICAgIEZUX1VOVVNFRCggdmFsaWQgKTsKLQotICAgIHJldHVybiAtMTsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBmdF92YWxpZGF0b3JfZXJyb3IoIEZUX1ZhbGlkYXRvciAgdmFsaWQsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IgICAgICBlcnJvciApCi0gIHsKLSAgICAvKiBzaW5jZSB0aGUgY2FzdCBiZWxvdyBhbHNvIGRpc2FibGVzIHRoZSBjb21waWxlcidzICovCi0gICAgLyogdHlwZSBjaGVjaywgd2UgaW50cm9kdWNlIGEgZHVtbXkgdmFyaWFibGUsIHdoaWNoICAqLwotICAgIC8qIHdpbGwgYmUgb3B0aW1pemVkIGF3YXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB2b2xhdGlsZSBmdF9qbXBfYnVmKiBqdW1wX2J1ZmZlciA9ICZ2YWxpZC0+anVtcF9idWZmZXI7Ci0KLQotICAgIHZhbGlkLT5lcnJvciA9IGVycm9yOwotCi0gICAgLyogdGhyb3cgYXdheSB2b2xhdGlsZW5lc3M7IHVzZSBganVtcF9idWZmZXInIG9yIHRoZSAgKi8KLSAgICAvKiBjb21waWxlciBtYXkgd2FybiBhYm91dCBhbiB1bnVzZWQgbG9jYWwgdmFyaWFibGUgICAqLwotICAgIGZ0X2xvbmdqbXAoICooZnRfam1wX2J1ZiopIGp1bXBfYnVmZmVyLCAxICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICBTIFQgUiBFIEEgTSAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIGNyZWF0ZSBhIG5ldyBpbnB1dCBzdHJlYW0gZnJvbSBhbiBGVF9PcGVuX0FyZ3Mgc3RydWN0dXJlICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9OZXcoIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgIGNvbnN0IEZUX09wZW5fQXJncyogIGFyZ3MsCi0gICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICAgICAgKmFzdHJlYW0gKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IE5VTEw7Ci0KLQotICAgICphc3RyZWFtID0gTlVMTDsKLQotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0xpYnJhcnlfSGFuZGxlICk7Ci0KLSAgICBpZiAoICFhcmdzICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0gICAgaWYgKCBGVF9ORVcoIHN0cmVhbSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHN0cmVhbS0+bWVtb3J5ID0gbWVtb3J5OwotCi0gICAgaWYgKCBhcmdzLT5mbGFncyAmIEZUX09QRU5fTUVNT1JZICkKLSAgICB7Ci0gICAgICAvKiBjcmVhdGUgYSBtZW1vcnktYmFzZWQgc3RyZWFtICovCi0gICAgICBGVF9TdHJlYW1fT3Blbk1lbW9yeSggc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBGVF9CeXRlKilhcmdzLT5tZW1vcnlfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUxvbmcpYXJncy0+bWVtb3J5X3NpemUgKTsKLSAgICB9Ci0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9ESVNBQkxFX1NUUkVBTV9TVVBQT1JUCi0KLSAgICBlbHNlIGlmICggYXJncy0+ZmxhZ3MgJiBGVF9PUEVOX1BBVEhOQU1FICkKLSAgICB7Ci0gICAgICAvKiBjcmVhdGUgYSBub3JtYWwgc3lzdGVtIHN0cmVhbSAqLwotICAgICAgZXJyb3IgPSBGVF9TdHJlYW1fT3Blbiggc3RyZWFtLCBhcmdzLT5wYXRobmFtZSApOwotICAgICAgc3RyZWFtLT5wYXRobmFtZS5wb2ludGVyID0gYXJncy0+cGF0aG5hbWU7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAoIGFyZ3MtPmZsYWdzICYgRlRfT1BFTl9TVFJFQU0gKSAmJiBhcmdzLT5zdHJlYW0gKQotICAgIHsKLSAgICAgIC8qIHVzZSBhbiBleGlzdGluZywgdXNlci1wcm92aWRlZCBzdHJlYW0gKi8KLQotICAgICAgLyogaW4gdGhpcyBjYXNlLCB3ZSBkbyBub3QgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBzdHJlYW0gb2JqZWN0ICovCi0gICAgICAvKiBzaW5jZSB0aGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjbG9zaW5nIGl0IGhpbXNlbGYgICAgICAgKi8KLSAgICAgIEZUX0ZSRUUoIHN0cmVhbSApOwotICAgICAgc3RyZWFtID0gYXJncy0+c3RyZWFtOwotICAgIH0KLQotI2VuZGlmCi0KLSAgICBlbHNlCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIEZUX0ZSRUUoIHN0cmVhbSApOwotICAgIGVsc2UKLSAgICAgIHN0cmVhbS0+bWVtb3J5ID0gbWVtb3J5OyAgLyoganVzdCB0byBiZSBjZXJ0YWluICovCi0KLSAgICAqYXN0cmVhbSA9IHN0cmVhbTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9TdHJlYW1fRnJlZSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGV4dGVybmFsICkKLSAgewotICAgIGlmICggc3RyZWFtICkKLSAgICB7Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotCi0KLSAgICAgIEZUX1N0cmVhbV9DbG9zZSggc3RyZWFtICk7Ci0KLSAgICAgIGlmICggIWV4dGVybmFsICkKLSAgICAgICAgRlRfRlJFRSggc3RyZWFtICk7Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9vYmpzCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgRkFDRSwgU0laRSAmIEdMWVBIIFNMT1QgT0JKRUNUUyAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfZ2x5cGhzbG90X2luaXQoIEZUX0dseXBoU2xvdCAgc2xvdCApCi0gIHsKLSAgICBGVF9Ecml2ZXIgICAgICAgICBkcml2ZXIgICA9IHNsb3QtPmZhY2UtPmRyaXZlcjsKLSAgICBGVF9Ecml2ZXJfQ2xhc3MgICBjbGF6eiAgICA9IGRyaXZlci0+Y2xheno7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgbWVtb3J5ICAgPSBkcml2ZXItPnJvb3QubWVtb3J5OwotICAgIEZUX0Vycm9yICAgICAgICAgIGVycm9yICAgID0gRlRfRXJyX09rOwotICAgIEZUX1Nsb3RfSW50ZXJuYWwgIGludGVybmFsID0gTlVMTDsKLQotCi0gICAgc2xvdC0+bGlicmFyeSA9IGRyaXZlci0+cm9vdC5saWJyYXJ5OwotCi0gICAgaWYgKCBGVF9ORVcoIGludGVybmFsICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgc2xvdC0+aW50ZXJuYWwgPSBpbnRlcm5hbDsKLQotICAgIGlmICggRlRfRFJJVkVSX1VTRVNfT1VUTElORVMoIGRyaXZlciApICkKLSAgICAgIGVycm9yID0gRlRfR2x5cGhMb2FkZXJfTmV3KCBtZW1vcnksICZpbnRlcm5hbC0+bG9hZGVyICk7Ci0KLSAgICBpZiAoICFlcnJvciAmJiBjbGF6ei0+aW5pdF9zbG90ICkKLSAgICAgIGVycm9yID0gY2xhenotPmluaXRfc2xvdCggc2xvdCApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIGZ0X2dseXBoc2xvdF9mcmVlX2JpdG1hcCggRlRfR2x5cGhTbG90ICBzbG90ICkKLSAgewotICAgIGlmICggc2xvdC0+aW50ZXJuYWwgJiYgKCBzbG90LT5pbnRlcm5hbC0+ZmxhZ3MgJiBGVF9HTFlQSF9PV05fQklUTUFQICkgKQotICAgIHsKLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gRlRfRkFDRV9NRU1PUlkoIHNsb3QtPmZhY2UgKTsKLQotCi0gICAgICBGVF9GUkVFKCBzbG90LT5iaXRtYXAuYnVmZmVyICk7Ci0gICAgICBzbG90LT5pbnRlcm5hbC0+ZmxhZ3MgJj0gfkZUX0dMWVBIX09XTl9CSVRNQVA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBhc3N1bWUgdGhhdCB0aGUgYml0bWFwIGJ1ZmZlciB3YXMgc3RvbGVuIG9yIG5vdCAqLwotICAgICAgLyogYWxsb2NhdGVkIGZyb20gdGhlIGhlYXAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIHNsb3QtPmJpdG1hcC5idWZmZXIgPSBOVUxMOwotICAgIH0KLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBmdF9nbHlwaHNsb3Rfc2V0X2JpdG1hcCggRlRfR2x5cGhTbG90ICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICBidWZmZXIgKQotICB7Ci0gICAgZnRfZ2x5cGhzbG90X2ZyZWVfYml0bWFwKCBzbG90ICk7Ci0KLSAgICBzbG90LT5iaXRtYXAuYnVmZmVyID0gYnVmZmVyOwotCi0gICAgRlRfQVNTRVJUKCAoc2xvdC0+aW50ZXJuYWwtPmZsYWdzICYgRlRfR0xZUEhfT1dOX0JJVE1BUCkgPT0gMCApOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBmdF9nbHlwaHNsb3RfYWxsb2NfYml0bWFwKCBGVF9HbHlwaFNsb3QgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgc2l6ZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IEZUX0ZBQ0VfTUVNT1JZKCBzbG90LT5mYWNlICk7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLQotCi0gICAgaWYgKCBzbG90LT5pbnRlcm5hbC0+ZmxhZ3MgJiBGVF9HTFlQSF9PV05fQklUTUFQICkKLSAgICAgIEZUX0ZSRUUoIHNsb3QtPmJpdG1hcC5idWZmZXIgKTsKLSAgICBlbHNlCi0gICAgICBzbG90LT5pbnRlcm5hbC0+ZmxhZ3MgfD0gRlRfR0xZUEhfT1dOX0JJVE1BUDsKLQotICAgICh2b2lkKUZUX0FMTE9DKCBzbG90LT5iaXRtYXAuYnVmZmVyLCBzaXplICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9nbHlwaHNsb3RfY2xlYXIoIEZUX0dseXBoU2xvdCAgc2xvdCApCi0gIHsKLSAgICAvKiBmcmVlIGJpdG1hcCBpZiBuZWVkZWQgKi8KLSAgICBmdF9nbHlwaHNsb3RfZnJlZV9iaXRtYXAoIHNsb3QgKTsKLQotICAgIC8qIGNsZWFyIGFsbCBwdWJsaWMgZmllbGRzIGluIHRoZSBnbHlwaCBzbG90ICovCi0gICAgRlRfWkVSTyggJnNsb3QtPm1ldHJpY3MgKTsKLSAgICBGVF9aRVJPKCAmc2xvdC0+b3V0bGluZSApOwotCi0gICAgc2xvdC0+Yml0bWFwLndpZHRoICAgICAgPSAwOwotICAgIHNsb3QtPmJpdG1hcC5yb3dzICAgICAgID0gMDsKLSAgICBzbG90LT5iaXRtYXAucGl0Y2ggICAgICA9IDA7Ci0gICAgc2xvdC0+Yml0bWFwLnBpeGVsX21vZGUgPSAwOwotICAgIC8qIGBzbG90LT5iaXRtYXAuYnVmZmVyJyBoYXMgYmVlbiBoYW5kbGVkIGJ5IGZ0X2dseXBoc2xvdF9mcmVlX2JpdG1hcCAqLwotCi0gICAgc2xvdC0+Yml0bWFwX2xlZnQgICA9IDA7Ci0gICAgc2xvdC0+Yml0bWFwX3RvcCAgICA9IDA7Ci0gICAgc2xvdC0+bnVtX3N1YmdseXBocyA9IDA7Ci0gICAgc2xvdC0+c3ViZ2x5cGhzICAgICA9IE5VTEw7Ci0gICAgc2xvdC0+Y29udHJvbF9kYXRhICA9IE5VTEw7Ci0gICAgc2xvdC0+Y29udHJvbF9sZW4gICA9IDA7Ci0gICAgc2xvdC0+b3RoZXIgICAgICAgICA9IE5VTEw7Ci0gICAgc2xvdC0+Zm9ybWF0ICAgICAgICA9IEZUX0dMWVBIX0ZPUk1BVF9OT05FOwotCi0gICAgc2xvdC0+bGluZWFySG9yaUFkdmFuY2UgPSAwOwotICAgIHNsb3QtPmxpbmVhclZlcnRBZHZhbmNlID0gMDsKLSAgICBzbG90LT5sc2JfZGVsdGEgICAgICAgICA9IDA7Ci0gICAgc2xvdC0+cnNiX2RlbHRhICAgICAgICAgPSAwOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9nbHlwaHNsb3RfZG9uZSggRlRfR2x5cGhTbG90ICBzbG90ICkKLSAgewotICAgIEZUX0RyaXZlciAgICAgICAgZHJpdmVyID0gc2xvdC0+ZmFjZS0+ZHJpdmVyOwotICAgIEZUX0RyaXZlcl9DbGFzcyAgY2xhenogID0gZHJpdmVyLT5jbGF6ejsKLSAgICBGVF9NZW1vcnkgICAgICAgIG1lbW9yeSA9IGRyaXZlci0+cm9vdC5tZW1vcnk7Ci0KLQotICAgIGlmICggY2xhenotPmRvbmVfc2xvdCApCi0gICAgICBjbGF6ei0+ZG9uZV9zbG90KCBzbG90ICk7Ci0KLSAgICAvKiBmcmVlIGJpdG1hcCBidWZmZXIgaWYgbmVlZGVkICovCi0gICAgZnRfZ2x5cGhzbG90X2ZyZWVfYml0bWFwKCBzbG90ICk7Ci0KLSAgICAvKiBzbG90LT5pbnRlcm5hbCBtaWdodCBiZSBOVUxMIGluIG91dC1vZi1tZW1vcnkgc2l0dWF0aW9ucyAqLwotICAgIGlmICggc2xvdC0+aW50ZXJuYWwgKQotICAgIHsKLSAgICAgIC8qIGZyZWUgZ2x5cGggbG9hZGVyICovCi0gICAgICBpZiAoIEZUX0RSSVZFUl9VU0VTX09VVExJTkVTKCBkcml2ZXIgKSApCi0gICAgICB7Ci0gICAgICAgIEZUX0dseXBoTG9hZGVyX0RvbmUoIHNsb3QtPmludGVybmFsLT5sb2FkZXIgKTsKLSAgICAgICAgc2xvdC0+aW50ZXJuYWwtPmxvYWRlciA9IE5VTEw7Ci0gICAgICB9Ci0KLSAgICAgIEZUX0ZSRUUoIHNsb3QtPmludGVybmFsICk7Ci0gICAgfQotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b2Jqcy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfTmV3X0dseXBoU2xvdCggRlRfRmFjZSAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAqYXNsb3QgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvcjsKLSAgICBGVF9Ecml2ZXIgICAgICAgIGRyaXZlcjsKLSAgICBGVF9Ecml2ZXJfQ2xhc3MgIGNsYXp6OwotICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5OwotICAgIEZUX0dseXBoU2xvdCAgICAgc2xvdCA9IE5VTEw7Ci0KLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICBpZiAoICFmYWNlLT5kcml2ZXIgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBkcml2ZXIgPSBmYWNlLT5kcml2ZXI7Ci0gICAgY2xhenogID0gZHJpdmVyLT5jbGF6ejsKLSAgICBtZW1vcnkgPSBkcml2ZXItPnJvb3QubWVtb3J5OwotCi0gICAgRlRfVFJBQ0U0KCggIkZUX05ld19HbHlwaFNsb3Q6IENyZWF0aW5nIG5ldyBzbG90IG9iamVjdFxuIiApKTsKLSAgICBpZiAoICFGVF9BTExPQyggc2xvdCwgY2xhenotPnNsb3Rfb2JqZWN0X3NpemUgKSApCi0gICAgewotICAgICAgc2xvdC0+ZmFjZSA9IGZhY2U7Ci0KLSAgICAgIGVycm9yID0gZnRfZ2x5cGhzbG90X2luaXQoIHNsb3QgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgewotICAgICAgICBmdF9nbHlwaHNsb3RfZG9uZSggc2xvdCApOwotICAgICAgICBGVF9GUkVFKCBzbG90ICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgc2xvdC0+bmV4dCAgPSBmYWNlLT5nbHlwaDsKLSAgICAgIGZhY2UtPmdseXBoID0gc2xvdDsKLQotICAgICAgaWYgKCBhc2xvdCApCi0gICAgICAgICphc2xvdCA9IHNsb3Q7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBhc2xvdCApCi0gICAgICAqYXNsb3QgPSBOVUxMOwotCi0KLSAgRXhpdDoKLSAgICBGVF9UUkFDRTQoKCAiRlRfTmV3X0dseXBoU2xvdDogUmV0dXJuICVkXG4iLCBlcnJvciApKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvYmpzLmggKi8KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX0RvbmVfR2x5cGhTbG90KCBGVF9HbHlwaFNsb3QgIHNsb3QgKQotICB7Ci0gICAgaWYgKCBzbG90ICkKLSAgICB7Ci0gICAgICBGVF9Ecml2ZXIgICAgIGRyaXZlciA9IHNsb3QtPmZhY2UtPmRyaXZlcjsKLSAgICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gZHJpdmVyLT5yb290Lm1lbW9yeTsKLSAgICAgIEZUX0dseXBoU2xvdCAgcHJldjsKLSAgICAgIEZUX0dseXBoU2xvdCAgY3VyOwotCi0KLSAgICAgIC8qIFJlbW92ZSBzbG90IGZyb20gaXRzIHBhcmVudCBmYWNlJ3MgbGlzdCAqLwotICAgICAgcHJldiA9IE5VTEw7Ci0gICAgICBjdXIgID0gc2xvdC0+ZmFjZS0+Z2x5cGg7Ci0KLSAgICAgIHdoaWxlICggY3VyICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBjdXIgPT0gc2xvdCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoICFwcmV2ICkKLSAgICAgICAgICAgIHNsb3QtPmZhY2UtPmdseXBoID0gY3VyLT5uZXh0OwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHByZXYtPm5leHQgPSBjdXItPm5leHQ7Ci0KLSAgICAgICAgICAvKiBmaW5hbGl6ZSBjbGllbnQtc3BlY2lmaWMgZGF0YSAqLwotICAgICAgICAgIGlmICggc2xvdC0+Z2VuZXJpYy5maW5hbGl6ZXIgKQotICAgICAgICAgICAgc2xvdC0+Z2VuZXJpYy5maW5hbGl6ZXIoIHNsb3QgKTsKLQotICAgICAgICAgIGZ0X2dseXBoc2xvdF9kb25lKCBzbG90ICk7Ci0gICAgICAgICAgRlRfRlJFRSggc2xvdCApOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHByZXYgPSBjdXI7Ci0gICAgICAgIGN1ciAgPSBjdXItPm5leHQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfU2V0X1RyYW5zZm9ybSggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfTWF0cml4KiAgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBkZWx0YSApCi0gIHsKLSAgICBGVF9GYWNlX0ludGVybmFsICBpbnRlcm5hbDsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm47Ci0KLSAgICBpbnRlcm5hbCA9IGZhY2UtPmludGVybmFsOwotCi0gICAgaW50ZXJuYWwtPnRyYW5zZm9ybV9mbGFncyA9IDA7Ci0KLSAgICBpZiAoICFtYXRyaXggKQotICAgIHsKLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fbWF0cml4Lnh4ID0gMHgxMDAwMEw7Ci0gICAgICBpbnRlcm5hbC0+dHJhbnNmb3JtX21hdHJpeC54eSA9IDA7Ci0gICAgICBpbnRlcm5hbC0+dHJhbnNmb3JtX21hdHJpeC55eCA9IDA7Ci0gICAgICBpbnRlcm5hbC0+dHJhbnNmb3JtX21hdHJpeC55eSA9IDB4MTAwMDBMOwotCi0gICAgICBtYXRyaXggPSAmaW50ZXJuYWwtPnRyYW5zZm9ybV9tYXRyaXg7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fbWF0cml4ID0gKm1hdHJpeDsKLQotICAgIC8qIHNldCB0cmFuc2Zvcm1fZmxhZ3MgYml0IGZsYWcgMCBpZiBgbWF0cml4JyBpc24ndCB0aGUgaWRlbnRpdHkgKi8KLSAgICBpZiAoICggbWF0cml4LT54eSB8IG1hdHJpeC0+eXggKSB8fAotICAgICAgICAgbWF0cml4LT54eCAhPSAweDEwMDAwTCAgICAgIHx8Ci0gICAgICAgICBtYXRyaXgtPnl5ICE9IDB4MTAwMDBMICAgICAgKQotICAgICAgaW50ZXJuYWwtPnRyYW5zZm9ybV9mbGFncyB8PSAxOwotCi0gICAgaWYgKCAhZGVsdGEgKQotICAgIHsKLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fZGVsdGEueCA9IDA7Ci0gICAgICBpbnRlcm5hbC0+dHJhbnNmb3JtX2RlbHRhLnkgPSAwOwotCi0gICAgICBkZWx0YSA9ICZpbnRlcm5hbC0+dHJhbnNmb3JtX2RlbHRhOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBpbnRlcm5hbC0+dHJhbnNmb3JtX2RlbHRhID0gKmRlbHRhOwotCi0gICAgLyogc2V0IHRyYW5zZm9ybV9mbGFncyBiaXQgZmxhZyAxIGlmIGBkZWx0YScgaXNuJ3QgdGhlIG51bGwgdmVjdG9yICovCi0gICAgaWYgKCBkZWx0YS0+eCB8IGRlbHRhLT55ICkKLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fZmxhZ3MgfD0gMjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1JlbmRlcmVyCi0gIGZ0X2xvb2t1cF9nbHlwaF9yZW5kZXJlciggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLQotI2lmZGVmIEdSSURfRklUX01FVFJJQ1MKLSAgc3RhdGljIHZvaWQKLSAgZnRfZ2x5cGhzbG90X2dyaWRfZml0X21ldHJpY3MoIEZUX0dseXBoU2xvdCAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgdmVydGljYWwgKQotICB7Ci0gICAgRlRfR2x5cGhfTWV0cmljcyogIG1ldHJpY3MgPSAmc2xvdC0+bWV0cmljczsKLSAgICBGVF9Qb3MgICAgICAgICAgICAgcmlnaHQsIGJvdHRvbTsKLQotCi0gICAgaWYgKCB2ZXJ0aWNhbCApCi0gICAgewotICAgICAgbWV0cmljcy0+aG9yaUJlYXJpbmdYID0gRlRfUElYX0ZMT09SKCBtZXRyaWNzLT5ob3JpQmVhcmluZ1ggKTsKLSAgICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWSA9IEZUX1BJWF9DRUlMICggbWV0cmljcy0+aG9yaUJlYXJpbmdZICk7Ci0KLSAgICAgIHJpZ2h0ICA9IEZUX1BJWF9DRUlMKCBtZXRyaWNzLT52ZXJ0QmVhcmluZ1ggKyBtZXRyaWNzLT53aWR0aCApOwotICAgICAgYm90dG9tID0gRlRfUElYX0NFSUwoIG1ldHJpY3MtPnZlcnRCZWFyaW5nWSArIG1ldHJpY3MtPmhlaWdodCApOwotCi0gICAgICBtZXRyaWNzLT52ZXJ0QmVhcmluZ1ggPSBGVF9QSVhfRkxPT1IoIG1ldHJpY3MtPnZlcnRCZWFyaW5nWCApOwotICAgICAgbWV0cmljcy0+dmVydEJlYXJpbmdZID0gRlRfUElYX0ZMT09SKCBtZXRyaWNzLT52ZXJ0QmVhcmluZ1kgKTsKLQotICAgICAgbWV0cmljcy0+d2lkdGggID0gcmlnaHQgLSBtZXRyaWNzLT52ZXJ0QmVhcmluZ1g7Ci0gICAgICBtZXRyaWNzLT5oZWlnaHQgPSBib3R0b20gLSBtZXRyaWNzLT52ZXJ0QmVhcmluZ1k7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBtZXRyaWNzLT52ZXJ0QmVhcmluZ1ggPSBGVF9QSVhfRkxPT1IoIG1ldHJpY3MtPnZlcnRCZWFyaW5nWCApOwotICAgICAgbWV0cmljcy0+dmVydEJlYXJpbmdZID0gRlRfUElYX0ZMT09SKCBtZXRyaWNzLT52ZXJ0QmVhcmluZ1kgKTsKLQotICAgICAgcmlnaHQgID0gRlRfUElYX0NFSUwgKCBtZXRyaWNzLT5ob3JpQmVhcmluZ1ggKyBtZXRyaWNzLT53aWR0aCApOwotICAgICAgYm90dG9tID0gRlRfUElYX0ZMT09SKCBtZXRyaWNzLT5ob3JpQmVhcmluZ1kgLSBtZXRyaWNzLT5oZWlnaHQgKTsKLQotICAgICAgbWV0cmljcy0+aG9yaUJlYXJpbmdYID0gRlRfUElYX0ZMT09SKCBtZXRyaWNzLT5ob3JpQmVhcmluZ1ggKTsKLSAgICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWSA9IEZUX1BJWF9DRUlMICggbWV0cmljcy0+aG9yaUJlYXJpbmdZICk7Ci0KLSAgICAgIG1ldHJpY3MtPndpZHRoICA9IHJpZ2h0IC0gbWV0cmljcy0+aG9yaUJlYXJpbmdYOwotICAgICAgbWV0cmljcy0+aGVpZ2h0ID0gbWV0cmljcy0+aG9yaUJlYXJpbmdZIC0gYm90dG9tOwotICAgIH0KLQotICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlID0gRlRfUElYX1JPVU5EKCBtZXRyaWNzLT5ob3JpQWR2YW5jZSApOwotICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlID0gRlRfUElYX1JPVU5EKCBtZXRyaWNzLT52ZXJ0QWR2YW5jZSApOwotICB9Ci0jZW5kaWYgLyogR1JJRF9GSVRfTUVUUklDUyAqLwotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9Mb2FkX0dseXBoKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgRlRfVUludCAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgbG9hZF9mbGFncyApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yOwotICAgIEZUX0RyaXZlciAgICAgZHJpdmVyOwotICAgIEZUX0dseXBoU2xvdCAgc2xvdDsKLSAgICBGVF9MaWJyYXJ5ICAgIGxpYnJhcnk7Ci0gICAgRlRfQm9vbCAgICAgICBhdXRvaGludCA9IEZBTFNFOwotICAgIEZUX01vZHVsZSAgICAgaGludGVyOwotICAgIFRUX0ZhY2UgICAgICAgdHRmYWNlID0gKFRUX0ZhY2UpZmFjZTsKLQotCi0gICAgaWYgKCAhZmFjZSB8fCAhZmFjZS0+c2l6ZSB8fCAhZmFjZS0+Z2x5cGggKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICAvKiBUaGUgdmFsaWRpdHkgdGVzdCBmb3IgYGdseXBoX2luZGV4JyBpcyBwZXJmb3JtZWQgYnkgdGhlICovCi0gICAgLyogZm9udCBkcml2ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgc2xvdCA9IGZhY2UtPmdseXBoOwotICAgIGZ0X2dseXBoc2xvdF9jbGVhciggc2xvdCApOwotCi0gICAgZHJpdmVyICA9IGZhY2UtPmRyaXZlcjsKLSAgICBsaWJyYXJ5ID0gZHJpdmVyLT5yb290LmxpYnJhcnk7Ci0gICAgaGludGVyICA9IGxpYnJhcnktPmF1dG9faGludGVyOwotCi0gICAgLyogcmVzb2x2ZSBsb2FkIGZsYWdzIGRlcGVuZGVuY2llcyAqLwotCi0gICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19SRUNVUlNFICkKLSAgICAgIGxvYWRfZmxhZ3MgfD0gRlRfTE9BRF9OT19TQ0FMRSAgICAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgRlRfTE9BRF9JR05PUkVfVFJBTlNGT1JNOwotCi0gICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSApCi0gICAgewotICAgICAgbG9hZF9mbGFncyB8PSBGVF9MT0FEX05PX0hJTlRJTkcgfAotICAgICAgICAgICAgICAgICAgICBGVF9MT0FEX05PX0JJVE1BUDsKLQotICAgICAgbG9hZF9mbGFncyAmPSB+RlRfTE9BRF9SRU5ERVI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB3ZSBuZWVkIHRvIGF1dG8taGludCBvciBub3QuCi0gICAgICogVGhlIGdlbmVyYWwgcnVsZXMgYXJlOgotICAgICAqCi0gICAgICogLSBEbyBvbmx5IGF1dG8taGludGluZyBpZiB3ZSBoYXZlIGEgaGludGVyIG1vZHVsZSwgYSBzY2FsYWJsZSBmb250Ci0gICAgICogICBmb3JtYXQgZGVhbGluZyB3aXRoIG91dGxpbmVzLCBhbmQgbm8gdHJhbnNmb3JtcyBleGNlcHQgc2ltcGxlCi0gICAgICogICBzbGFudHMgYW5kL29yIHJvdGF0aW9ucyBieSBpbnRlZ2VyIG11bHRpcGxlcyBvZiA5MCBkZWdyZWVzLgotICAgICAqCi0gICAgICogLSBUaGVuLCBhdXRvLWhpbnQgaWYgRlRfTE9BRF9GT1JDRV9BVVRPSElOVCBpcyBzZXQgb3IgaWYgd2UgZG9uJ3QKLSAgICAgKiAgIGhhdmUgYSBuYXRpdmUgZm9udCBoaW50ZXIuCi0gICAgICoKLSAgICAgKiAtIE90aGVyd2lzZSwgYXV0by1oaW50IGZvciBMSUdIVCBoaW50aW5nIG1vZGUgb3IgaWYgdGhlcmUgaXNuJ3QKLSAgICAgKiAgIGFueSBoaW50aW5nIGJ5dGVjb2RlIGluIHRoZSBUcnVlVHlwZS9PcGVuVHlwZSBmb250LgotICAgICAqCi0gICAgICogLSBFeGNlcHRpb246IFRoZSBmb250IGlzIGB0cmlja3knIGFuZCByZXF1aXJlcyB0aGUgbmF0aXZlIGhpbnRlciB0bwotICAgICAqICAgbG9hZCBwcm9wZXJseS4KLSAgICAgKi8KLQotICAgIGlmICggaGludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAhKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19ISU5USU5HICkgICAgICAgICAgICAgJiYKLSAgICAgICAgICEoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX0FVVE9ISU5UICkgICAgICAgICAgICAmJgotICAgICAgICAgRlRfRFJJVkVSX0lTX1NDQUxBQkxFKCBkcml2ZXIgKSAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBGVF9EUklWRVJfVVNFU19PVVRMSU5FUyggZHJpdmVyICkgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICFGVF9JU19UUklDS1koIGZhY2UgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgKCAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX0lHTk9SRV9UUkFOU0ZPUk0gKSAgICB8fAotICAgICAgICAgICAoIGZhY2UtPmludGVybmFsLT50cmFuc2Zvcm1fbWF0cml4Lnl4ID09IDAgJiYKLSAgICAgICAgICAgICBmYWNlLT5pbnRlcm5hbC0+dHJhbnNmb3JtX21hdHJpeC54eCAhPSAwICkgfHwKLSAgICAgICAgICAgKCBmYWNlLT5pbnRlcm5hbC0+dHJhbnNmb3JtX21hdHJpeC54eCA9PSAwICYmCi0gICAgICAgICAgICAgZmFjZS0+aW50ZXJuYWwtPnRyYW5zZm9ybV9tYXRyaXgueXggIT0gMCApICkgKQotICAgIHsKLSAgICAgIGlmICggKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9GT1JDRV9BVVRPSElOVCApIHx8Ci0gICAgICAgICAgICFGVF9EUklWRVJfSEFTX0hJTlRFUiggZHJpdmVyICkgICAgICAgICApCi0gICAgICAgIGF1dG9oaW50ID0gVFJVRTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRlRfUmVuZGVyX01vZGUgIG1vZGUgPSBGVF9MT0FEX1RBUkdFVF9NT0RFKCBsb2FkX2ZsYWdzICk7Ci0KLQotICAgICAgICAvKiB0aGUgY2hlY2sgZm9yIGBudW1fbG9jYXRpb25zJyBhc3N1cmVzIHRoYXQgd2UgYWN0dWFsbHkgICAgKi8KLSAgICAgICAgLyogdGVzdCBmb3IgaW5zdHJ1Y3Rpb25zIGluIGEgVFRGIGFuZCBub3QgaW4gYSBDRkYtYmFzZWQgT1RGICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBzaW5jZSBgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zJyBtaWdodCBiZSB1bnJlbGlhYmxlLCB3ZSAgICAgKi8KLSAgICAgICAgLyogY2hlY2sgdGhlIHNpemUgb2YgdGhlIGBmcGdtJyBhbmQgYHByZXAnIHRhYmxlcywgdG9vIC0tICAgICovCi0gICAgICAgIC8qIHRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgdGhlcmUgZG9uJ3QgZXhpc3QgcmVhbCBUVEZzIHdoZXJlICAqLwotICAgICAgICAvKiBib3RoIGBmcGdtJyBhbmQgYHByZXAnIHRhYmxlcyBhcmUgbWlzc2luZyAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xJR0hUICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgIGZhY2UtPmludGVybmFsLT5pZ25vcmVfdW5wYXRlbnRlZF9oaW50ZXIgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgKCBGVF9JU19TRk5UKCBmYWNlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICB0dGZhY2UtPm51bV9sb2NhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICB0dGZhY2UtPm1heF9wcm9maWxlLm1heFNpemVPZkluc3RydWN0aW9ucyA9PSAwICYmCi0gICAgICAgICAgICAgICB0dGZhY2UtPmZvbnRfcHJvZ3JhbV9zaXplID09IDAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICB0dGZhY2UtPmN2dF9wcm9ncmFtX3NpemUgPT0gMCAgICAgICAgICAgICAgICAgICkgKQotICAgICAgICAgIGF1dG9oaW50ID0gVFJVRTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIGF1dG9oaW50ICkKLSAgICB7Ci0gICAgICBGVF9BdXRvSGludGVyX0ludGVyZmFjZSAgaGludGluZzsKLQotCi0gICAgICAvKiB0cnkgdG8gbG9hZCBlbWJlZGRlZCBiaXRtYXBzIGZpcnN0IGlmIGF2YWlsYWJsZSAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBYWFg6IFRoaXMgaXMgcmVhbGx5IGEgdGVtcG9yYXJ5IGhhY2sgdGhhdCBzaG91bGQgZGlzYXBwZWFyICovCi0gICAgICAvKiAgICAgIHByb21wdGx5IHdpdGggRnJlZVR5cGUgMi4xISAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIEZUX0hBU19GSVhFRF9TSVpFUyggZmFjZSApICAgICAgICAgICAgICYmCi0gICAgICAgICAgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19CSVRNQVAgKSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBkcml2ZXItPmNsYXp6LT5sb2FkX2dseXBoKCBzbG90LCBmYWNlLT5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfZmxhZ3MgfCBGVF9MT0FEX1NCSVRTX09OTFkgKTsKLQotICAgICAgICBpZiAoICFlcnJvciAmJiBzbG90LT5mb3JtYXQgPT0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUCApCi0gICAgICAgICAgZ290byBMb2FkX09rOwotICAgICAgfQotCi0gICAgICB7Ci0gICAgICAgIEZUX0ZhY2VfSW50ZXJuYWwgIGludGVybmFsICAgICAgICA9IGZhY2UtPmludGVybmFsOwotICAgICAgICBGVF9JbnQgICAgICAgICAgICB0cmFuc2Zvcm1fZmxhZ3MgPSBpbnRlcm5hbC0+dHJhbnNmb3JtX2ZsYWdzOwotCi0KLSAgICAgICAgLyogc2luY2UgdGhlIGF1dG8taGludGVyIGNhbGxzIEZUX0xvYWRfR2x5cGggYnkgaXRzZWxmLCAqLwotICAgICAgICAvKiBtYWtlIHN1cmUgdGhhdCBnbHlwaHMgYXJlbid0IHRyYW5zZm9ybWVkICAgICAgICAgICAgICovCi0gICAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fZmxhZ3MgPSAwOwotCi0gICAgICAgIC8qIGxvYWQgYXV0by1oaW50ZWQgb3V0bGluZSAqLwotICAgICAgICBoaW50aW5nID0gKEZUX0F1dG9IaW50ZXJfSW50ZXJmYWNlKWhpbnRlci0+Y2xhenotPm1vZHVsZV9pbnRlcmZhY2U7Ci0KLSAgICAgICAgZXJyb3IgICA9IGhpbnRpbmctPmxvYWRfZ2x5cGgoIChGVF9BdXRvSGludGVyKWhpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QsIGZhY2UtPnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwgbG9hZF9mbGFncyApOwotCi0gICAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fZmxhZ3MgPSB0cmFuc2Zvcm1fZmxhZ3M7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlcnJvciA9IGRyaXZlci0+Y2xhenotPmxvYWRfZ2x5cGgoIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX2ZsYWdzICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBpZiAoIHNsb3QtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSApCi0gICAgICB7Ci0gICAgICAgIC8qIGNoZWNrIHRoYXQgdGhlIGxvYWRlZCBvdXRsaW5lIGlzIGNvcnJlY3QgKi8KLSAgICAgICAgZXJyb3IgPSBGVF9PdXRsaW5lX0NoZWNrKCAmc2xvdC0+b3V0bGluZSApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSNpZmRlZiBHUklEX0ZJVF9NRVRSSUNTCi0gICAgICAgIGlmICggISggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fSElOVElORyApICkKLSAgICAgICAgICBmdF9nbHlwaHNsb3RfZ3JpZF9maXRfbWV0cmljcyggc2xvdCwKLSAgICAgICAgICAgICAgRlRfQk9PTCggbG9hZF9mbGFncyAmIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUICkgKTsKLSNlbmRpZgotICAgICAgfQotICAgIH0KLQotICBMb2FkX09rOgotICAgIC8qIGNvbXB1dGUgdGhlIGFkdmFuY2UgKi8KLSAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCApCi0gICAgewotICAgICAgc2xvdC0+YWR2YW5jZS54ID0gMDsKLSAgICAgIHNsb3QtPmFkdmFuY2UueSA9IHNsb3QtPm1ldHJpY3MudmVydEFkdmFuY2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzbG90LT5hZHZhbmNlLnggPSBzbG90LT5tZXRyaWNzLmhvcmlBZHZhbmNlOwotICAgICAgc2xvdC0+YWR2YW5jZS55ID0gMDsKLSAgICB9Ci0KLSAgICAvKiBjb21wdXRlIHRoZSBsaW5lYXIgYWR2YW5jZSBpbiAxNi4xNiBwaXhlbHMgKi8KLSAgICBpZiAoICggbG9hZF9mbGFncyAmIEZUX0xPQURfTElORUFSX0RFU0lHTiApID09IDAgJiYKLSAgICAgICAgICggRlRfSVNfU0NBTEFCTEUoIGZhY2UgKSApICAgICAgICAgICAgICAgICAgKQotICAgIHsKLSAgICAgIEZUX1NpemVfTWV0cmljcyogIG1ldHJpY3MgPSAmZmFjZS0+c2l6ZS0+bWV0cmljczsKLQotCi0gICAgICAvKiBpdCdzIHRyaWNreSEgKi8KLSAgICAgIHNsb3QtPmxpbmVhckhvcmlBZHZhbmNlID0gRlRfTXVsRGl2KCBzbG90LT5saW5lYXJIb3JpQWR2YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT54X3NjYWxlLCA2NCApOwotCi0gICAgICBzbG90LT5saW5lYXJWZXJ0QWR2YW5jZSA9IEZUX011bERpdiggc2xvdC0+bGluZWFyVmVydEFkdmFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+eV9zY2FsZSwgNjQgKTsKLSAgICB9Ci0KLSAgICBpZiAoICggbG9hZF9mbGFncyAmIEZUX0xPQURfSUdOT1JFX1RSQU5TRk9STSApID09IDAgKQotICAgIHsKLSAgICAgIEZUX0ZhY2VfSW50ZXJuYWwgIGludGVybmFsID0gZmFjZS0+aW50ZXJuYWw7Ci0KLQotICAgICAgLyogbm93LCB0cmFuc2Zvcm0gdGhlIGdseXBoIGltYWdlIGlmIG5lZWRlZCAqLwotICAgICAgaWYgKCBpbnRlcm5hbC0+dHJhbnNmb3JtX2ZsYWdzICkKLSAgICAgIHsKLSAgICAgICAgLyogZ2V0IHJlbmRlcmVyICovCi0gICAgICAgIEZUX1JlbmRlcmVyICByZW5kZXJlciA9IGZ0X2xvb2t1cF9nbHlwaF9yZW5kZXJlciggc2xvdCApOwotCi0KLSAgICAgICAgaWYgKCByZW5kZXJlciApCi0gICAgICAgICAgZXJyb3IgPSByZW5kZXJlci0+Y2xhenotPnRyYW5zZm9ybV9nbHlwaCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJlciwgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJuYWwtPnRyYW5zZm9ybV9tYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVybmFsLT50cmFuc2Zvcm1fZGVsdGEgKTsKLSAgICAgICAgZWxzZSBpZiAoIHNsb3QtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBhcHBseSBgc3RhbmRhcmQnIHRyYW5zZm9ybWF0aW9uIGlmIG5vIHJlbmRlcmVyIGlzIGF2YWlsYWJsZSAqLwotICAgICAgICAgIGlmICggaW50ZXJuYWwtPnRyYW5zZm9ybV9mbGFncyAmIDEgKQotICAgICAgICAgICAgRlRfT3V0bGluZV9UcmFuc2Zvcm0oICZzbG90LT5vdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcm5hbC0+dHJhbnNmb3JtX21hdHJpeCApOwotCi0gICAgICAgICAgaWYgKCBpbnRlcm5hbC0+dHJhbnNmb3JtX2ZsYWdzICYgMiApCi0gICAgICAgICAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggJnNsb3QtPm91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwtPnRyYW5zZm9ybV9kZWx0YS54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fZGVsdGEueSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogdHJhbnNmb3JtIGFkdmFuY2UgKi8KLSAgICAgICAgRlRfVmVjdG9yX1RyYW5zZm9ybSggJnNsb3QtPmFkdmFuY2UsICZpbnRlcm5hbC0+dHJhbnNmb3JtX21hdHJpeCApOwotICAgICAgfQotICAgIH0KLQotICAgIEZUX1RSQUNFNSgoICIgIHggYWR2YW5jZTogJWRcbiIgLCBzbG90LT5hZHZhbmNlLnggKSk7Ci0gICAgRlRfVFJBQ0U1KCggIiAgeSBhZHZhbmNlOiAlZFxuIiAsIHNsb3QtPmFkdmFuY2UueSApKTsKLQotICAgIEZUX1RSQUNFNSgoICIgIGxpbmVhciB4IGFkdmFuY2U6ICVkXG4iICwgc2xvdC0+bGluZWFySG9yaUFkdmFuY2UgKSk7Ci0gICAgRlRfVFJBQ0U1KCggIiAgbGluZWFyIHkgYWR2YW5jZTogJWRcbiIgLCBzbG90LT5saW5lYXJWZXJ0QWR2YW5jZSApKTsKLQotICAgIC8qIGRvIHdlIG5lZWQgdG8gcmVuZGVyIHRoZSBpbWFnZSBub3c/ICovCi0gICAgaWYgKCAhZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgc2xvdC0+Zm9ybWF0ICE9IEZUX0dMWVBIX0ZPUk1BVF9CSVRNQVAgICAgJiYKLSAgICAgICAgIHNsb3QtPmZvcm1hdCAhPSBGVF9HTFlQSF9GT1JNQVRfQ09NUE9TSVRFICYmCi0gICAgICAgICBsb2FkX2ZsYWdzICYgRlRfTE9BRF9SRU5ERVIgKQotICAgIHsKLSAgICAgIEZUX1JlbmRlcl9Nb2RlICBtb2RlID0gRlRfTE9BRF9UQVJHRVRfTU9ERSggbG9hZF9mbGFncyApOwotCi0KLSAgICAgIGlmICggbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9OT1JNQUwgICAgICAmJgotICAgICAgICAgICAobG9hZF9mbGFncyAmIEZUX0xPQURfTU9OT0NIUk9NRSApICkKLSAgICAgICAgbW9kZSA9IEZUX1JFTkRFUl9NT0RFX01PTk87Ci0KLSAgICAgIGVycm9yID0gRlRfUmVuZGVyX0dseXBoKCBzbG90LCBtb2RlICk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0xvYWRfQ2hhciggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgRlRfVUxvbmcgIGNoYXJfY29kZSwKLSAgICAgICAgICAgICAgICBGVF9JbnQzMiAgbG9hZF9mbGFncyApCi0gIHsKLSAgICBGVF9VSW50ICBnbHlwaF9pbmRleDsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIGdseXBoX2luZGV4ID0gKEZUX1VJbnQpY2hhcl9jb2RlOwotICAgIGlmICggZmFjZS0+Y2hhcm1hcCApCi0gICAgICBnbHlwaF9pbmRleCA9IEZUX0dldF9DaGFyX0luZGV4KCBmYWNlLCBjaGFyX2NvZGUgKTsKLQotICAgIHJldHVybiBGVF9Mb2FkX0dseXBoKCBmYWNlLCBnbHlwaF9pbmRleCwgbG9hZF9mbGFncyApOwotICB9Ci0KLQotICAvKiBkZXN0cnVjdG9yIGZvciBzaXplcyBsaXN0ICovCi0gIHN0YXRpYyB2b2lkCi0gIGRlc3Ryb3lfc2l6ZSggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgICAgRlRfU2l6ZSAgICBzaXplLAotICAgICAgICAgICAgICAgIEZUX0RyaXZlciAgZHJpdmVyICkKLSAgewotICAgIC8qIGZpbmFsaXplIGNsaWVudC1zcGVjaWZpYyBkYXRhICovCi0gICAgaWYgKCBzaXplLT5nZW5lcmljLmZpbmFsaXplciApCi0gICAgICBzaXplLT5nZW5lcmljLmZpbmFsaXplciggc2l6ZSApOwotCi0gICAgLyogZmluYWxpemUgZm9ybWF0LXNwZWNpZmljIHN0dWZmICovCi0gICAgaWYgKCBkcml2ZXItPmNsYXp6LT5kb25lX3NpemUgKQotICAgICAgZHJpdmVyLT5jbGF6ei0+ZG9uZV9zaXplKCBzaXplICk7Ci0KLSAgICBGVF9GUkVFKCBzaXplLT5pbnRlcm5hbCApOwotICAgIEZUX0ZSRUUoIHNpemUgKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfY21hcF9kb25lX2ludGVybmFsKCBGVF9DTWFwICBjbWFwICk7Ci0KLQotICBzdGF0aWMgdm9pZAotICBkZXN0cm95X2NoYXJtYXBzKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICkKLSAgewotICAgIEZUX0ludCAgbjsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm47Ci0KLSAgICBmb3IgKCBuID0gMDsgbiA8IGZhY2UtPm51bV9jaGFybWFwczsgbisrICkKLSAgICB7Ci0gICAgICBGVF9DTWFwICBjbWFwID0gRlRfQ01BUCggZmFjZS0+Y2hhcm1hcHNbbl0gKTsKLQotCi0gICAgICBmdF9jbWFwX2RvbmVfaW50ZXJuYWwoIGNtYXAgKTsKLQotICAgICAgZmFjZS0+Y2hhcm1hcHNbbl0gPSBOVUxMOwotICAgIH0KLQotICAgIEZUX0ZSRUUoIGZhY2UtPmNoYXJtYXBzICk7Ci0gICAgZmFjZS0+bnVtX2NoYXJtYXBzID0gMDsKLSAgfQotCi0KLSAgLyogZGVzdHJ1Y3RvciBmb3IgZmFjZXMgbGlzdCAqLwotICBzdGF0aWMgdm9pZAotICBkZXN0cm95X2ZhY2UoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICBGVF9Ecml2ZXIgIGRyaXZlciApCi0gIHsKLSAgICBGVF9Ecml2ZXJfQ2xhc3MgIGNsYXp6ID0gZHJpdmVyLT5jbGF6ejsKLQotCi0gICAgLyogZGlzY2FyZCBhdXRvLWhpbnRpbmcgZGF0YSAqLwotICAgIGlmICggZmFjZS0+YXV0b2hpbnQuZmluYWxpemVyICkKLSAgICAgIGZhY2UtPmF1dG9oaW50LmZpbmFsaXplciggZmFjZS0+YXV0b2hpbnQuZGF0YSApOwotCi0gICAgLyogRGlzY2FyZCBnbHlwaCBzbG90cyBmb3IgdGhpcyBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogQmV3YXJlISAgRlRfRG9uZV9HbHlwaFNsb3QoKSBjaGFuZ2VzIHRoZSBmaWVsZCBgZmFjZS0+Z2x5cGgnICovCi0gICAgd2hpbGUgKCBmYWNlLT5nbHlwaCApCi0gICAgICBGVF9Eb25lX0dseXBoU2xvdCggZmFjZS0+Z2x5cGggKTsKLQotICAgIC8qIGRpc2NhcmQgYWxsIHNpemVzIGZvciB0aGlzIGZhY2UgKi8KLSAgICBGVF9MaXN0X0ZpbmFsaXplKCAmZmFjZS0+c2l6ZXNfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAoRlRfTGlzdF9EZXN0cnVjdG9yKWRlc3Ryb3lfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgZHJpdmVyICk7Ci0gICAgZmFjZS0+c2l6ZSA9IE5VTEw7Ci0KLSAgICAvKiBub3cgZGlzY2FyZCBjbGllbnQgZGF0YSAqLwotICAgIGlmICggZmFjZS0+Z2VuZXJpYy5maW5hbGl6ZXIgKQotICAgICAgZmFjZS0+Z2VuZXJpYy5maW5hbGl6ZXIoIGZhY2UgKTsKLQotICAgIC8qIGRpc2NhcmQgY2hhcm1hcHMgKi8KLSAgICBkZXN0cm95X2NoYXJtYXBzKCBmYWNlLCBtZW1vcnkgKTsKLQotICAgIC8qIGZpbmFsaXplIGZvcm1hdC1zcGVjaWZpYyBzdHVmZiAqLwotICAgIGlmICggY2xhenotPmRvbmVfZmFjZSApCi0gICAgICBjbGF6ei0+ZG9uZV9mYWNlKCBmYWNlICk7Ci0KLSAgICAvKiBjbG9zZSB0aGUgc3RyZWFtIGZvciB0aGlzIGZhY2UgaWYgbmVlZGVkICovCi0gICAgRlRfU3RyZWFtX0ZyZWUoCi0gICAgICBmYWNlLT5zdHJlYW0sCi0gICAgICAoIGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfRVhURVJOQUxfU1RSRUFNICkgIT0gMCApOwotCi0gICAgZmFjZS0+c3RyZWFtID0gTlVMTDsKLQotICAgIC8qIGdldCByaWQgb2YgaXQgKi8KLSAgICBpZiAoIGZhY2UtPmludGVybmFsICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCBmYWNlLT5pbnRlcm5hbCApOwotICAgIH0KLSAgICBGVF9GUkVFKCBmYWNlICk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIERlc3Ryb3lfRHJpdmVyKCBGVF9Ecml2ZXIgIGRyaXZlciApCi0gIHsKLSAgICBGVF9MaXN0X0ZpbmFsaXplKCAmZHJpdmVyLT5mYWNlc19saXN0LAotICAgICAgICAgICAgICAgICAgICAgIChGVF9MaXN0X0Rlc3RydWN0b3IpZGVzdHJveV9mYWNlLAotICAgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+cm9vdC5tZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgZHJpdmVyICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZpbmRfdW5pY29kZV9jaGFybWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gZmluZHMgYSBVbmljb2RlIGNoYXJtYXAsIGlmIHRoZXJlIGlzIG9uZS4gICAgICAgICAgICAqLwotICAvKiAgICBBbmQgaWYgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSwgaXQgdHJpZXMgdG8gZmF2b3VyIHRoZSBtb3JlICAgICAgICAgKi8KLSAgLyogICAgZXh0ZW5zaXZlIG9uZSwgaS5lLiwgb25lIHRoYXQgc3VwcG9ydHMgVUNTLTQgYWdhaW5zdCB0aG9zZSB3aGljaCAgICovCi0gIC8qICAgIGFyZSBsaW1pdGVkIHRvIHRoZSBCTVAgKHNhaWQgVUNTLTIgZW5jb2RpbmcuKSAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBvcGVuX2ZhY2UoKSAoanVzdCBiZWxvdyksIGFuZCBhbHNvICAgICovCi0gIC8qICAgIGZyb20gRlRfU2VsZWN0X0NoYXJtYXAoIC4uLiwgRlRfRU5DT0RJTkdfVU5JQ09ERSApLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZpbmRfdW5pY29kZV9jaGFybWFwKCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX0NoYXJNYXAqICBmaXJzdDsKLSAgICBGVF9DaGFyTWFwKiAgY3VyOwotCi0KLSAgICAvKiBjYWxsZXIgc2hvdWxkIGhhdmUgYWxyZWFkeSBjaGVja2VkIHRoYXQgYGZhY2UnIGlzIHZhbGlkICovCi0gICAgRlRfQVNTRVJUKCBmYWNlICk7Ci0KLSAgICBmaXJzdCA9IGZhY2UtPmNoYXJtYXBzOwotCi0gICAgaWYgKCAhZmlyc3QgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0NoYXJNYXBfSGFuZGxlICk7Ci0KLSAgICAvKgotICAgICAqICBUaGUgb3JpZ2luYWwgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbihzKSBvbmx5IHNwZWNpZmllZCBjaGFybWFwCi0gICAgICogIGZvcm1hdHMgdGhhdCBhcmUgY2FwYWJsZSBvZiBtYXBwaW5nIDggb3IgMTYgYml0IGNoYXJhY3RlciBjb2RlcyB0bwotICAgICAqICBnbHlwaCBpbmRpY2VzLgotICAgICAqCi0gICAgICogIEhvd2V2ZXIsIHJlY2VudCB1cGRhdGVzIHRvIHRoZSBBcHBsZSBhbmQgT3BlblR5cGUgc3BlY2lmaWNhdGlvbnMKLSAgICAgKiAgaW50cm9kdWNlZCBuZXcgZm9ybWF0cyB0aGF0IGFyZSBjYXBhYmxlIG9mIG1hcHBpbmcgMzItYml0IGNoYXJhY3RlcgotICAgICAqICBjb2RlcyBhcyB3ZWxsLiAgQW5kIHRoZXNlIGFyZSBhbHJlYWR5IHVzZWQgb24gc29tZSBmb250cywgbWFpbmx5IHRvCi0gICAgICogIG1hcCBub24tQk1QIEFzaWFuIGlkZW9ncmFwaHMgYXMgZGVmaW5lZCBpbiBVbmljb2RlLgotICAgICAqCi0gICAgICogIEZvciBjb21wYXRpYmlsaXR5IHB1cnBvc2VzLCB0aGVzZSBmb250cyBnZW5lcmFsbHkgY29tZSB3aXRoCi0gICAgICogICpzZXZlcmFsKiBVbmljb2RlIGNoYXJtYXBzOgotICAgICAqCi0gICAgICogICAtIE9uZSBvZiB0aGVtIGluIHRoZSAib2xkIiAxNi1iaXQgZm9ybWF0LCB0aGF0IGNhbm5vdCBhY2Nlc3MKLSAgICAgKiAgICAgYWxsIGdseXBocyBpbiB0aGUgZm9udC4KLSAgICAgKgotICAgICAqICAgLSBBbm90aGVyIG9uZSBpbiB0aGUgIm5ldyIgMzItYml0IGZvcm1hdCwgdGhhdCBjYW4gYWNjZXNzIGFsbAotICAgICAqICAgICB0aGUgZ2x5cGhzLgotICAgICAqCi0gICAgICogIFRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gd3JpdHRlbiB0byBhbHdheXMgZmF2b3IgYSAzMi1iaXQgY2hhcm1hcAotICAgICAqICB3aGVuIGZvdW5kLiAgT3RoZXJ3aXNlLCBhIDE2LWJpdCBvbmUgaXMgcmV0dXJuZWQgd2hlbiBmb3VuZC4KLSAgICAgKi8KLQotICAgIC8qIFNpbmNlIHRoZSBgaW50ZXJlc3RpbmcnIHRhYmxlLCB3aXRoIElEcyAoMywxMCksIGlzIG5vcm1hbGx5IHRoZSAqLwotICAgIC8qIGxhc3Qgb25lLCB3ZSBsb29wIGJhY2t3YXJkcy4gIFRoaXMgbG9zZXMgd2l0aCB0eXBlMSBmb250cyB3aXRoICAqLwotICAgIC8qIG5vbi1CTVAgY2hhcmFjdGVycyAoPC4wMDAxJSksIHRoaXMgd2lucyB3aXRoIC50dGYgd2l0aCBub24tQk1QICAqLwotICAgIC8qIGNoYXJzICguMDElID8pLCBhbmQgdGhpcyBpcyB0aGUgc2FtZSBhYm91dCA5OS45OSUgb2YgdGhlIHRpbWUhICAqLwotCi0gICAgY3VyID0gZmlyc3QgKyBmYWNlLT5udW1fY2hhcm1hcHM7ICAvKiBwb2ludHMgYWZ0ZXIgdGhlIGxhc3Qgb25lICovCi0KLSAgICBmb3IgKCA7IC0tY3VyID49IGZpcnN0OyApCi0gICAgewotICAgICAgaWYgKCBjdXJbMF0tPmVuY29kaW5nID09IEZUX0VOQ09ESU5HX1VOSUNPREUgKQotICAgICAgewotICAgICAgICAvKiBYWFggSWYgc29tZSBuZXcgZW5jb2RpbmdzIHRvIHJlcHJlc2VudCBVQ1MtNCBhcmUgYWRkZWQsICovCi0gICAgICAgIC8qICAgICB0aGV5IHNob3VsZCBiZSBhZGRlZCBoZXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCAoIGN1clswXS0+cGxhdGZvcm1faWQgPT0gVFRfUExBVEZPUk1fTUlDUk9TT0ZUICYmCi0gICAgICAgICAgICAgICBjdXJbMF0tPmVuY29kaW5nX2lkID09IFRUX01TX0lEX1VDU180ICAgICAgICApICAgICB8fAotICAgICAgICAgICAgICggY3VyWzBdLT5wbGF0Zm9ybV9pZCA9PSBUVF9QTEFURk9STV9BUFBMRV9VTklDT0RFICYmCi0gICAgICAgICAgICAgICBjdXJbMF0tPmVuY29kaW5nX2lkID09IFRUX0FQUExFX0lEX1VOSUNPREVfMzIgICAgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBmYWNlLT5jaGFybWFwID0gY3VyWzBdOwotICAgICAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBXZSBkbyBub3QgaGF2ZSBhbnkgVUNTLTQgY2hhcm1hcC4gICAgICAgICAgICAgICAgKi8KLSAgICAvKiBEbyB0aGUgbG9vcCBhZ2FpbiBhbmQgc2VhcmNoIGZvciBVQ1MtMiBjaGFybWFwcy4gKi8KLSAgICBjdXIgPSBmaXJzdCArIGZhY2UtPm51bV9jaGFybWFwczsKLQotICAgIGZvciAoIDsgLS1jdXIgPj0gZmlyc3Q7ICkKLSAgICB7Ci0gICAgICBpZiAoIGN1clswXS0+ZW5jb2RpbmcgPT0gRlRfRU5DT0RJTkdfVU5JQ09ERSApCi0gICAgICB7Ci0gICAgICAgIGZhY2UtPmNoYXJtYXAgPSBjdXJbMF07Ci0gICAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0NoYXJNYXBfSGFuZGxlICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZpbmRfdmFyaWFudF9zZWxlY3Rvcl9jaGFybWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIHZhcmlhbnQgc2VsZWN0b3IgY2hhcm1hcCwgaWYgdGhlcmUgaXMgb25lLiAqLwotICAvKiAgICBUaGVyZSBjYW4gb25seSBiZSBvbmUgKHBsYXRmb3JtPTAsIHNwZWNpZmljPTUsIGZvcm1hdD0xNCkuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9DaGFyTWFwCi0gIGZpbmRfdmFyaWFudF9zZWxlY3Rvcl9jaGFybWFwKCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX0NoYXJNYXAqICBmaXJzdDsKLSAgICBGVF9DaGFyTWFwKiAgZW5kOwotICAgIEZUX0NoYXJNYXAqICBjdXI7Ci0KLQotICAgIC8qIGNhbGxlciBzaG91bGQgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgdGhhdCBgZmFjZScgaXMgdmFsaWQgKi8KLSAgICBGVF9BU1NFUlQoIGZhY2UgKTsKLQotICAgIGZpcnN0ID0gZmFjZS0+Y2hhcm1hcHM7Ci0KLSAgICBpZiAoICFmaXJzdCApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGVuZCA9IGZpcnN0ICsgZmFjZS0+bnVtX2NoYXJtYXBzOyAgLyogcG9pbnRzIGFmdGVyIHRoZSBsYXN0IG9uZSAqLwotCi0gICAgZm9yICggY3VyID0gZmlyc3Q7IGN1ciA8IGVuZDsgKytjdXIgKQotICAgIHsKLSAgICAgIGlmICggY3VyWzBdLT5wbGF0Zm9ybV9pZCA9PSBUVF9QTEFURk9STV9BUFBMRV9VTklDT0RFICAgICYmCi0gICAgICAgICAgIGN1clswXS0+ZW5jb2RpbmdfaWQgPT0gVFRfQVBQTEVfSURfVkFSSUFOVF9TRUxFQ1RPUiAmJgotICAgICAgICAgICBGVF9HZXRfQ01hcF9Gb3JtYXQoIGN1clswXSApID09IDE0ICAgICAgICAgICAgICAgICAgKQotICAgICAgICByZXR1cm4gY3VyWzBdOwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvcGVuX2ZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgc29tZSB3b3JrIGZvciBGVF9PcGVuX0ZhY2UoKS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBvcGVuX2ZhY2UoIEZUX0RyaXZlciAgICAgIGRyaXZlciwKLSAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAqYXN0cmVhbSwKLSAgICAgICAgICAgICBGVF9Cb29sICAgICAgICBleHRlcm5hbF9zdHJlYW0sCi0gICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcywKLSAgICAgICAgICAgICBGVF9GYWNlICAgICAgICphZmFjZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgICAgICAgICBtZW1vcnk7Ci0gICAgRlRfRHJpdmVyX0NsYXNzICAgY2xheno7Ci0gICAgRlRfRmFjZSAgICAgICAgICAgZmFjZSAgICAgPSBOVUxMOwotICAgIEZUX0ZhY2VfSW50ZXJuYWwgIGludGVybmFsID0gTlVMTDsKLQotICAgIEZUX0Vycm9yICAgICAgICAgIGVycm9yLCBlcnJvcjI7Ci0KLQotICAgIGNsYXp6ICA9IGRyaXZlci0+Y2xheno7Ci0gICAgbWVtb3J5ID0gZHJpdmVyLT5yb290Lm1lbW9yeTsKLQotICAgIC8qIGFsbG9jYXRlIHRoZSBmYWNlIG9iamVjdCBhbmQgcGVyZm9ybSBiYXNpYyBpbml0aWFsaXphdGlvbiAqLwotICAgIGlmICggRlRfQUxMT0MoIGZhY2UsIGNsYXp6LT5mYWNlX29iamVjdF9zaXplICkgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgZmFjZS0+ZHJpdmVyID0gZHJpdmVyOwotICAgIGZhY2UtPm1lbW9yeSA9IG1lbW9yeTsKLSAgICBmYWNlLT5zdHJlYW0gPSAqYXN0cmVhbTsKLQotICAgIC8qIHNldCB0aGUgRlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTSBiaXQgZm9yIEZUX0RvbmVfRmFjZSAqLwotICAgIGlmICggZXh0ZXJuYWxfc3RyZWFtICkKLSAgICAgIGZhY2UtPmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0VYVEVSTkFMX1NUUkVBTTsKLQotICAgIGlmICggRlRfTkVXKCBpbnRlcm5hbCApICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIGZhY2UtPmludGVybmFsID0gaW50ZXJuYWw7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgewotICAgICAgaW50ICBpOwotCi0KLSAgICAgIGZhY2UtPmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgPSBOVUxMOwotICAgICAgZm9yICggaSA9IDA7IGkgPCBudW1fcGFyYW1zICYmICFmYWNlLT5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlOwotICAgICAgICAgICAgaSsrICkKLSAgICAgICAgaWYgKCBwYXJhbXNbaV0udGFnID09IEZUX1BBUkFNX1RBR19JTkNSRU1FTlRBTCApCi0gICAgICAgICAgZmFjZS0+aW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSA9Ci0gICAgICAgICAgICAoRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlKXBhcmFtc1tpXS5kYXRhOwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKCBjbGF6ei0+aW5pdF9mYWNlICkKLSAgICAgIGVycm9yID0gY2xhenotPmluaXRfZmFjZSggKmFzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9JbnQpZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zICk7Ci0gICAgKmFzdHJlYW0gPSBmYWNlLT5zdHJlYW07IC8qIFN0cmVhbSBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQuICovCi0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICAvKiBzZWxlY3QgVW5pY29kZSBjaGFybWFwIGJ5IGRlZmF1bHQgKi8KLSAgICBlcnJvcjIgPSBmaW5kX3VuaWNvZGVfY2hhcm1hcCggZmFjZSApOwotCi0gICAgLyogaWYgbm8gVW5pY29kZSBjaGFybWFwIGNhbiBiZSBmb3VuZCwgRlRfRXJyX0ludmFsaWRfQ2hhck1hcF9IYW5kbGUgKi8KLSAgICAvKiBpcyByZXR1cm5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgLyogbm8gZXJyb3Igc2hvdWxkIGhhcHBlbiwgYnV0IHdlIHdhbnQgdG8gcGxheSBzYWZlICovCi0gICAgaWYgKCBlcnJvcjIgJiYgRlRfRVJSX05FUSggZXJyb3IyLCBJbnZhbGlkX0NoYXJNYXBfSGFuZGxlICkgKQotICAgIHsKLSAgICAgIGVycm9yID0gZXJyb3IyOwotICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgICphZmFjZSA9IGZhY2U7Ci0KLSAgRmFpbDoKLSAgICBpZiAoIGVycm9yICkKLSAgICB7Ci0gICAgICBkZXN0cm95X2NoYXJtYXBzKCBmYWNlLCBtZW1vcnkgKTsKLSAgICAgIGlmICggY2xhenotPmRvbmVfZmFjZSApCi0gICAgICAgIGNsYXp6LT5kb25lX2ZhY2UoIGZhY2UgKTsKLSAgICAgIEZUX0ZSRUUoIGludGVybmFsICk7Ci0gICAgICBGVF9GUkVFKCBmYWNlICk7Ci0gICAgICAqYWZhY2UgPSBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogdGhlcmUncyBhIE1hYy1zcGVjaWZpYyBleHRlbmRlZCBpbXBsZW1lbnRhdGlvbiBvZiBGVF9OZXdfRmFjZSgpICovCi0gIC8qIGluIHNyYy9iYXNlL2Z0bWFjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZuZGVmIEZUX01BQ0lOVE9TSAotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfTmV3X0ZhY2UoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHBhdGhuYW1lLAotICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICBGVF9GYWNlICAgICAqYWZhY2UgKQotICB7Ci0gICAgRlRfT3Blbl9BcmdzICBhcmdzOwotCi0KLSAgICAvKiB0ZXN0IGZvciB2YWxpZCBgbGlicmFyeScgYW5kIGBhZmFjZScgZGVsYXllZCB0byBgRlRfT3Blbl9GYWNlJyAqLwotICAgIGlmICggIXBhdGhuYW1lICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgYXJncy5mbGFncyAgICA9IEZUX09QRU5fUEFUSE5BTUU7Ci0gICAgYXJncy5wYXRobmFtZSA9IChjaGFyKilwYXRobmFtZTsKLSAgICBhcmdzLnN0cmVhbSAgID0gTlVMTDsKLQotICAgIHJldHVybiBGVF9PcGVuX0ZhY2UoIGxpYnJhcnksICZhcmdzLCBmYWNlX2luZGV4LCBhZmFjZSApOwotICB9Ci0KLSNlbmRpZgotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9OZXdfTWVtb3J5X0ZhY2UoIEZUX0xpYnJhcnkgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBmaWxlX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgIGZpbGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICAqYWZhY2UgKQotICB7Ci0gICAgRlRfT3Blbl9BcmdzICBhcmdzOwotCi0KLSAgICAvKiB0ZXN0IGZvciB2YWxpZCBgbGlicmFyeScgYW5kIGBmYWNlJyBkZWxheWVkIHRvIGBGVF9PcGVuX0ZhY2UnICovCi0gICAgaWYgKCAhZmlsZV9iYXNlICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgYXJncy5mbGFncyAgICAgICA9IEZUX09QRU5fTUVNT1JZOwotICAgIGFyZ3MubWVtb3J5X2Jhc2UgPSBmaWxlX2Jhc2U7Ci0gICAgYXJncy5tZW1vcnlfc2l6ZSA9IGZpbGVfc2l6ZTsKLSAgICBhcmdzLnN0cmVhbSAgICAgID0gTlVMTDsKLQotICAgIHJldHVybiBGVF9PcGVuX0ZhY2UoIGxpYnJhcnksICZhcmdzLCBmYWNlX2luZGV4LCBhZmFjZSApOwotICB9Ci0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fTUFDX0ZPTlRTCi0KLSAgLyogVGhlIGJlaGF2aW9yIGhlcmUgaXMgdmVyeSBzaW1pbGFyIHRvIHRoYXQgaW4gYmFzZS9mdG1hYy5jLCBidXQgaXQgICAgICovCi0gIC8qIGlzIGRlc2lnbmVkIHRvIHdvcmsgb24gbm9uLW1hYyBzeXN0ZW1zLCBzbyBubyBtYWMgc3BlY2lmaWMgY2FsbHMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogV2UgbG9vayBhdCB0aGUgZmlsZSBhbmQgZGV0ZXJtaW5lIGlmIGl0IGlzIGEgbWFjIGRmb250IGZpbGUgb3IgYSBtYWMgICovCi0gIC8qIHJlc291cmNlIGZpbGUsIG9yIGEgbWFjYmluYXJ5IGZpbGUgY29udGFpbmluZyBhIG1hYyByZXNvdXJjZSBmaWxlLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVW5saWtlIGZ0bWFjIEknbSBub3QgZ29pbmcgdG8gbG9vayBhdCBhIGBGT05EJy4gIEkgZG9uJ3QgcmVhbGx5IHNlZSAgICovCi0gIC8qIHRoZSBwb2ludCwgZXNwZWNpYWxseSBzaW5jZSB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgYEZPTkQnIHJlc291cmNlcy4gICAqLwotICAvKiBJbnN0ZWFkIEknbGwganVzdCBsb29rIGZvciBgc2ZudCcgYW5kIGBQT1NUJyByZXNvdXJjZXMsIG9yZGVyZWQgYXMgICAgKi8KLSAgLyogdGhleSBvY2N1ciBpbiB0aGUgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlIHRoYXQgbXVsdGlwbGUgYFBPU1QnIHJlc291cmNlcyBkbyBub3QgbWVhbiBtdWx0aXBsZSBwb3N0c2NyaXB0ICAgKi8KLSAgLyogZm9udHM7IHRoZXkgYWxsIGdldCBqYW1tZWQgdG9nZXRoZXIgdG8gbWFrZSB3aGF0IGlzIGVzc2VudGlhbGx5IGEgICAgICovCi0gIC8qIHBmYiBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogV2UgYXJlbid0IGludGVyZXN0ZWQgaW4gYE5GTlQnIG9yIGBGT05UJyBiaXRtYXAgcmVzb3VyY2VzLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBcyBzb29uIGFzIHdlIGdldCBhbiBgc2ZudCcgbG9hZCBpdCBpbnRvIG1lbW9yeSBhbmQgcGFzcyBpdCBvZmYgdG8gICAgKi8KLSAgLyogRlRfT3Blbl9GYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJZiB3ZSBoYXZlIGEgKHNldCBvZikgYFBPU1QnIHJlc291cmNlcywgbWFzc2FnZSB0aGVtIGludG8gYSAobWVtb3J5KSAgKi8KLSAgLyogcGZiIGZpbGUgYW5kIHBhc3MgdGhhdCB0byBGVF9PcGVuX0ZhY2UuICAoQXMgd2l0aCBmdG1hYy5jIEknbSBub3QgICAgICovCi0gIC8qIGdvaW5nIHRvIHRyeSB0byBzYXZlIHRoZSBrZXJuaW5nIGluZm8uICBBZnRlciBhbGwgdGhhdCBsaXZlcyBpbiB0aGUgICAqLwotICAvKiBgRk9ORCcgd2hpY2ggaXNuJ3QgaW4gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgYFBPU1QnIHJlc291cmNlcyBzbyAgICAgKi8KLSAgLyogd2UgZG9uJ3QgcmVhbGx5IGhhdmUgYWNjZXNzIHRvIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLQotICAvKiBGaW5hbGl6ZXIgZm9yIGEgbWVtb3J5IHN0cmVhbTsgZ2V0cyBjYWxsZWQgYnkgRlRfRG9uZV9GYWNlKCkuICovCi0gIC8qIEl0IGZyZWVzIHRoZSBtZW1vcnkgaXQgdXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRnJvbSBmdG1hYy5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBtZW1vcnlfc3RyZWFtX2Nsb3NlKCBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotCi0KLSAgICBGVF9GUkVFKCBzdHJlYW0tPmJhc2UgKTsKLQotICAgIHN0cmVhbS0+c2l6ZSAgPSAwOwotICAgIHN0cmVhbS0+YmFzZSAgPSBOVUxMOwotICAgIHN0cmVhbS0+Y2xvc2UgPSBOVUxMOwotICB9Ci0KLQotICAvKiBDcmVhdGUgYSBuZXcgbWVtb3J5IHN0cmVhbSBmcm9tIGEgYnVmZmVyIGFuZCBhIHNpemUuICovCi0gIC8qIEZyb20gZnRtYWMuYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIG5ld19tZW1vcnlfc3RyZWFtKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgICAgICAgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW1fQ2xvc2VGdW5jICBjbG9zZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICAgICAgKmFzdHJlYW0gKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IE5VTEw7Ci0KLQotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0xpYnJhcnlfSGFuZGxlICk7Ci0KLSAgICBpZiAoICFiYXNlICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgKmFzdHJlYW0gPSBOVUxMOwotICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLSAgICBpZiAoIEZUX05FVyggc3RyZWFtICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgRlRfU3RyZWFtX09wZW5NZW1vcnkoIHN0cmVhbSwgYmFzZSwgc2l6ZSApOwotCi0gICAgc3RyZWFtLT5jbG9zZSA9IGNsb3NlOwotCi0gICAgKmFzdHJlYW0gPSBzdHJlYW07Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIENyZWF0ZSBhIG5ldyBGVF9GYWNlIGdpdmVuIGEgYnVmZmVyIGFuZCBhIGRyaXZlciBuYW1lLiAqLwotICAvKiBmcm9tIGZ0bWFjLmMgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIG9wZW5fZmFjZV9mcm9tX2J1ZmZlciggRlRfTGlicmFyeSAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIGRyaXZlcl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICphZmFjZSApCi0gIHsKLSAgICBGVF9PcGVuX0FyZ3MgIGFyZ3M7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvcjsKLSAgICBGVF9TdHJlYW0gICAgIHN0cmVhbSA9IE5VTEw7Ci0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLQotICAgIGVycm9yID0gbmV3X21lbW9yeV9zdHJlYW0oIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9zdHJlYW1fY2xvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbSApOwotICAgIGlmICggZXJyb3IgKQotICAgIHsKLSAgICAgIEZUX0ZSRUUoIGJhc2UgKTsKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICBhcmdzLmZsYWdzID0gRlRfT1BFTl9TVFJFQU07Ci0gICAgYXJncy5zdHJlYW0gPSBzdHJlYW07Ci0gICAgaWYgKCBkcml2ZXJfbmFtZSApCi0gICAgewotICAgICAgYXJncy5mbGFncyA9IGFyZ3MuZmxhZ3MgfCBGVF9PUEVOX0RSSVZFUjsKLSAgICAgIGFyZ3MuZHJpdmVyID0gRlRfR2V0X01vZHVsZSggbGlicmFyeSwgZHJpdmVyX25hbWUgKTsKLSAgICB9Ci0KLSNpZmRlZiBGVF9NQUNJTlRPU0gKLSAgICAvKiBBdCB0aGlzIHBvaW50LCB0aGUgZmFjZSBpbmRleCBoYXMgc2VydmVkIGl0cyBwdXJwb3NlOyAgKi8KLSAgICAvKiB3aG9ldmVyIGNhbGxzIHRoaXMgZnVuY3Rpb24gaGFzIGFscmVhZHkgdXNlZCBpdCB0byAgICAgKi8KLSAgICAvKiBsb2NhdGUgdGhlIGNvcnJlY3QgZm9udCBkYXRhLiAgV2Ugc2hvdWxkIG5vdCBwcm9wYWdhdGUgKi8KLSAgICAvKiB0aGlzIGluZGV4IHRvIEZUX09wZW5fRmFjZSgpICh1bmxlc3MgaXQgaXMgbmVnYXRpdmUpLiAgKi8KLQotICAgIGlmICggZmFjZV9pbmRleCA+IDAgKQotICAgICAgZmFjZV9pbmRleCAmPSAweDdGRkYwMDAwTDsgLyogcmV0YWluIEdYIGRhdGEgKi8KLSNlbmRpZgotCi0gICAgZXJyb3IgPSBGVF9PcGVuX0ZhY2UoIGxpYnJhcnksICZhcmdzLCBmYWNlX2luZGV4LCBhZmFjZSApOwotCi0gICAgaWYgKCBlcnJvciA9PSBGVF9FcnJfT2sgKQotICAgICAgKCphZmFjZSktPmZhY2VfZmxhZ3MgJj0gfkZUX0ZBQ0VfRkxBR19FWFRFUk5BTF9TVFJFQU07Ci0gICAgZWxzZQotI2lmZGVmIEZUX01BQ0lOVE9TSAotICAgICAgRlRfU3RyZWFtX0ZyZWUoIHN0cmVhbSwgMCApOwotI2Vsc2UKLSAgICB7Ci0gICAgICBGVF9TdHJlYW1fQ2xvc2UoIHN0cmVhbSApOwotICAgICAgRlRfRlJFRSggc3RyZWFtICk7Ci0gICAgfQotI2VuZGlmCi0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIExvb2sgdXAgYFRZUDEnIG9yIGBDSUQgJyB0YWJsZSBmcm9tIHNmbnQgdGFibGUgZGlyZWN0b3J5LiAgICAgICAqLwotICAvKiBgb2Zmc2V0JyBhbmQgYGxlbmd0aCcgbXVzdCBleGNsdWRlIHRoZSBiaW5hcnkgaGVhZGVyIGluIHRhYmxlcy4gKi8KLQotICAvKiBUeXBlIDEgYW5kIENJRC1rZXllZCBmb250IGRyaXZlcnMgc2hvdWxkIHJlY29nbml6ZSBzZm50LXdyYXBwZWQgKi8KLSAgLyogZm9ybWF0IHRvby4gIEhlcmUsIHNpbmNlIHdlIGNhbid0IGV4cGVjdCB0aGF0IHRoZSBUcnVlVHlwZSBmb250ICovCi0gIC8qIGRyaXZlciBpcyBsb2FkZWQgdW5jb25kaXRpYWxseSwgd2UgbXVzdCBwYXJzZSB0aGUgZm9udCBieSAgICAgICAqLwotICAvKiBvdXJzZWx2ZXMuICBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSBhbmQgKi8KLSAgLyogdGhlIG9mZnNldC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X2xvb2t1cF9QU19pbl9zZm50X3N0cmVhbSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wqICAgaXNfc2ZudF9jaWQgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9VU2hvcnQgIG51bVRhYmxlczsKLSAgICBGVF9Mb25nICAgIHBzdGFibGVfaW5kZXg7Ci0gICAgRlRfVUxvbmcgICB0YWc7Ci0gICAgaW50ICAgICAgICBpOwotCi0KLSAgICAqb2Zmc2V0ID0gMDsKLSAgICAqbGVuZ3RoID0gMDsKLSAgICAqaXNfc2ZudF9jaWQgPSBGQUxTRTsKLQotICAgIC8qIFRPRE86IHN1cHBvcnQgZm9yIHNmbnQtd3JhcHBlZCBQUy9DSUQgaW4gVFRDIGZvcm1hdCAqLwotCi0gICAgLyogdmVyc2lvbiBjaGVjayBmb3IgJ3R5cDEnIChzaG91bGQgYmUgaWdub3JlZD8pICovCi0gICAgaWYgKCBGVF9SRUFEX1VMT05HKCB0YWcgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgaWYgKCB0YWcgIT0gVFRBR190eXAxICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotCi0gICAgaWYgKCBGVF9SRUFEX1VTSE9SVCggbnVtVGFibGVzICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIGlmICggRlRfU1RSRUFNX1NLSVAoIDIgKiAzICkgKSAvKiBza2lwIGJpbmFyeSBzZWFyY2ggaGVhZGVyICovCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBwc3RhYmxlX2luZGV4ID0gLTE7Ci0gICAgKmlzX3NmbnRfY2lkICA9IEZBTFNFOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBudW1UYWJsZXM7IGkrKyApCi0gICAgewotICAgICAgaWYgKCBGVF9SRUFEX1VMT05HKCB0YWcgKSAgICAgfHwgRlRfU1RSRUFNX1NLSVAoIDQgKSAgICAgIHx8Ci0gICAgICAgICAgIEZUX1JFQURfVUxPTkcoICpvZmZzZXQgKSB8fCBGVF9SRUFEX1VMT05HKCAqbGVuZ3RoICkgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgIGlmICggdGFnID09IFRUQUdfQ0lEICkKLSAgICAgIHsKLSAgICAgICAgcHN0YWJsZV9pbmRleCsrOwotICAgICAgICAqb2Zmc2V0ICs9IDIyOwotICAgICAgICAqbGVuZ3RoIC09IDIyOwotICAgICAgICAqaXNfc2ZudF9jaWQgPSBUUlVFOwotICAgICAgICBpZiAoIGZhY2VfaW5kZXggPCAwICkKLSAgICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHRhZyA9PSBUVEFHX1RZUDEgKQotICAgICAgewotICAgICAgICBwc3RhYmxlX2luZGV4Kys7Ci0gICAgICAgICpvZmZzZXQgKz0gMjQ7Ci0gICAgICAgICpsZW5ndGggLT0gMjQ7Ci0gICAgICAgICppc19zZm50X2NpZCA9IEZBTFNFOwotICAgICAgICBpZiAoIGZhY2VfaW5kZXggPCAwICkKLSAgICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgICAgfQotICAgICAgaWYgKCBmYWNlX2luZGV4ID49IDAgJiYgcHN0YWJsZV9pbmRleCA9PSBmYWNlX2luZGV4ICkKLSAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICB9Ci0gICAgcmV0dXJuIEZUX1RIUk9XKCBUYWJsZV9NaXNzaW5nICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBvcGVuX2ZhY2VfUFNfZnJvbV9zZm50X3N0cmVhbSggRlRfTGlicmFyeSAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyICAqcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAqYWZhY2UgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLSAgICBGVF9VTG9uZyAgIG9mZnNldCwgbGVuZ3RoOwotICAgIEZUX1VMb25nICAgcG9zOwotICAgIEZUX0Jvb2wgICAgaXNfc2ZudF9jaWQ7Ci0gICAgRlRfQnl0ZSogICBzZm50X3BzID0gTlVMTDsKLQotICAgIEZUX1VOVVNFRCggbnVtX3BhcmFtcyApOwotICAgIEZUX1VOVVNFRCggcGFyYW1zICk7Ci0KLQotICAgIC8qIGlnbm9yZSBHWCBzdHVmZiAqLwotICAgIGlmICggZmFjZV9pbmRleCA+IDAgKQotICAgICAgZmFjZV9pbmRleCAmPSAweEZGRkZMOwotCi0gICAgcG9zID0gRlRfU1RSRUFNX1BPUygpOwotCi0gICAgZXJyb3IgPSBmdF9sb29rdXBfUFNfaW5fc2ZudF9zdHJlYW0oIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlzX3NmbnRfY2lkICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIHBvcyArIG9mZnNldCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggRlRfQUxMT0MoIHNmbnRfcHMsIChGVF9Mb25nKWxlbmd0aCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGVycm9yID0gRlRfU3RyZWFtX1JlYWQoIHN0cmVhbSwgKEZUX0J5dGUgKilzZm50X3BzLCBsZW5ndGggKTsKLSAgICBpZiAoIGVycm9yICkgewotICAgICAgRlRfRlJFRSggc2ZudF9wcyApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGVycm9yID0gb3Blbl9mYWNlX2Zyb21fYnVmZmVyKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZm50X3BzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01JTiggZmFjZV9pbmRleCwgMCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19zZm50X2NpZCA/ICJjaWQiIDogInR5cGUxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZhY2UgKTsKLSAgRXhpdDoKLSAgICB7Ci0gICAgICBGVF9FcnJvciAgZXJyb3IxOwotCi0KLSAgICAgIGlmICggRlRfRVJSX0VRKCBlcnJvciwgVW5rbm93bl9GaWxlX0Zvcm1hdCApICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IxID0gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgcG9zICk7Ci0gICAgICAgIGlmICggZXJyb3IxICkKLSAgICAgICAgICByZXR1cm4gZXJyb3IxOwotICAgICAgfQotCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotICB9Ci0KLQotI2lmbmRlZiBGVF9NQUNJTlRPU0gKLQotICAvKiBUaGUgcmVzb3VyY2UgaGVhZGVyIHNheXMgd2UndmUgZ290IHJlc291cmNlX2NudCBgUE9TVCcgKHR5cGUxKSAqLwotICAvKiByZXNvdXJjZXMgaW4gdGhpcyBmaWxlLiAgVGhleSBhbGwgbmVlZCB0byBiZSBjb2FsZXNjZWQgaW50byAgICAqLwotICAvKiBvbmUgbHVtcCB3aGljaCBnZXRzIHBhc3NlZCBvbiB0byB0aGUgdHlwZTEgZHJpdmVyLiAgICAgICAgICAgICAqLwotICAvKiBIZXJlIGNhbiBiZSBvbmx5IG9uZSBQb3N0U2NyaXB0IGZvbnQgaW4gYSBmaWxlIHNvIGZhY2VfaW5kZXggICAqLwotICAvKiBtdXN0IGJlIDAgKG9yIC0xKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgTWFjX1JlYWRfUE9TVF9SZXNvdXJjZSggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpvZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICByZXNvdXJjZV9jbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgKmFmYWNlICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3IgID0gRlRfRVJSKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotICAgIEZUX0J5dGUqICAgcGZiX2RhdGEgPSBOVUxMOwotICAgIGludCAgICAgICAgaSwgdHlwZSwgZmxhZ3M7Ci0gICAgRlRfVUxvbmcgICBsZW47Ci0gICAgRlRfVUxvbmcgICBwZmJfbGVuLCBwZmJfcG9zLCBwZmJfbGVucG9zOwotICAgIEZUX1VMb25nICAgcmxlbiwgdGVtcDsKLQotCi0gICAgaWYgKCBmYWNlX2luZGV4ID09IC0xICkKLSAgICAgIGZhY2VfaW5kZXggPSAwOwotICAgIGlmICggZmFjZV9pbmRleCAhPSAwICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIC8qIEZpbmQgdGhlIGxlbmd0aCBvZiBhbGwgdGhlIFBPU1QgcmVzb3VyY2VzLCBjb25jYXRlbmF0ZWQuICBBc3N1bWUgKi8KLSAgICAvKiB3b3JzdCBjYXNlIChlYWNoIHJlc291cmNlIGluIGl0cyBvd24gc2VjdGlvbikuICAgICAgICAgICAgICAgICAgICovCi0gICAgcGZiX2xlbiA9IDA7Ci0gICAgZm9yICggaSA9IDA7IGkgPCByZXNvdXJjZV9jbnQ7ICsraSApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9TdHJlYW1fU2Vlayggc3RyZWFtLCAoRlRfVUxvbmcpb2Zmc2V0c1tpXSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIGlmICggRlRfUkVBRF9VTE9ORyggdGVtcCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiBGVDIgYWxsb2NhdG9yIHRha2VzIHNpZ25lZCBsb25nIGJ1ZmZlciBsZW5ndGgsCi0gICAgICAgKiB0b28gbGFyZ2UgdmFsdWUgY2F1c2luZyBvdmVyZmxvdyBzaG91bGQgYmUgY2hlY2tlZAotICAgICAgICovCi0gICAgICBGVF9UUkFDRTQoKCAiICAgICAgICAgICAgICAgICBQT1NUIGZyYWdtZW50ICMlZDogbGVuZ3RoPTB4JTA4eCIKLSAgICAgICAgICAgICAgICAgICIgdG90YWwgcGZiX2xlbj0weCUwOHhcbiIsCi0gICAgICAgICAgICAgICAgICBpLCB0ZW1wLCBwZmJfbGVuICsgdGVtcCArIDYpKTsKLSAgICAgIGlmICggRlRfTUFDX1JGT1JLX01BWF9MRU4gPCB0ZW1wICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgRlRfTUFDX1JGT1JLX01BWF9MRU4gLSB0ZW1wIDwgcGZiX2xlbiArIDYgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTIoKCAiICAgICAgICAgICAgIE1hY09TIHJlc291cmNlIGxlbmd0aCBjYW5ub3QgZXhjZWVkIgotICAgICAgICAgICAgICAgICAgICAiIDB4JTA4eFxuIiwgRlRfTUFDX1JGT1JLX01BWF9MRU4gKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfT2Zmc2V0ICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgcGZiX2xlbiArPSB0ZW1wICsgNjsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTIoKCAiICAgICAgICAgICAgIHRvdGFsIGJ1ZmZlciBzaXplIHRvIGNvbmNhdGVuYXRlICVkIgotICAgICAgICAgICAgICAgICIgUE9TVCBmcmFnbWVudHM6IDB4JTA4eFxuIiwKLSAgICAgICAgICAgICAgICAgcmVzb3VyY2VfY250LCBwZmJfbGVuICsgMikpOwotICAgIGlmICggcGZiX2xlbiArIDIgPCA2ICkgewotICAgICAgRlRfVFJBQ0UyKCggIiAgICAgICAgICAgICB0b28gbG9uZyBmcmFnbWVudCBsZW5ndGggbWFrZXMiCi0gICAgICAgICAgICAgICAgICAiIHBmYl9sZW4gY29uZnVzZWQ6IHBmYl9sZW49MHglMDh4XG4iLCBwZmJfbGVuICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggQXJyYXlfVG9vX0xhcmdlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotICAgIGlmICggRlRfQUxMT0MoIHBmYl9kYXRhLCAoRlRfTG9uZylwZmJfbGVuICsgMiApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHBmYl9kYXRhWzBdID0gMHg4MDsKLSAgICBwZmJfZGF0YVsxXSA9IDE7ICAgICAgICAgICAgLyogQXNjaWkgc2VjdGlvbiAqLwotICAgIHBmYl9kYXRhWzJdID0gMDsgICAgICAgICAgICAvKiA0LWJ5dGUgbGVuZ3RoLCBmaWxsIGluIGxhdGVyICovCi0gICAgcGZiX2RhdGFbM10gPSAwOwotICAgIHBmYl9kYXRhWzRdID0gMDsKLSAgICBwZmJfZGF0YVs1XSA9IDA7Ci0gICAgcGZiX3BvcyAgICAgPSA2OwotICAgIHBmYl9sZW5wb3MgID0gMjsKLQotICAgIGxlbiA9IDA7Ci0gICAgdHlwZSA9IDE7Ci0gICAgZm9yICggaSA9IDA7IGkgPCByZXNvdXJjZV9jbnQ7ICsraSApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9TdHJlYW1fU2Vlayggc3RyZWFtLCAoRlRfVUxvbmcpb2Zmc2V0c1tpXSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDI7Ci0gICAgICBpZiAoIEZUX1JFQURfVUxPTkcoIHJsZW4gKSApCi0gICAgICAgIGdvdG8gRXhpdDI7Ci0KLSAgICAgIC8qIEZUMiBhbGxvY2F0b3IgdGFrZXMgc2lnbmVkIGxvbmcgYnVmZmVyIGxlbmd0aCwKLSAgICAgICAqIHRvbyBsYXJnZSBmcmFnbWVudCBsZW5ndGggY2F1c2luZyBvdmVyZmxvdyBzaG91bGQgYmUgY2hlY2tlZAotICAgICAgICovCi0gICAgICBpZiAoIDB4N0ZGRkZGRkZVTCA8IHJsZW4gKQotICAgICAgewotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX09mZnNldCApOwotICAgICAgICBnb3RvIEV4aXQyOwotICAgICAgfQotCi0gICAgICBpZiAoIEZUX1JFQURfVVNIT1JUKCBmbGFncyApICkKLSAgICAgICAgZ290byBFeGl0MjsKLSAgICAgIEZUX1RSQUNFMygoICJQT1NUIGZyYWdtZW50WyVkXTogb2Zmc2V0cz0weCUwOHgsIHJsZW49MHglMDh4LCBmbGFncz0weCUwNHhcbiIsCi0gICAgICAgICAgICAgICAgICAgaSwgb2Zmc2V0c1tpXSwgcmxlbiwgZmxhZ3MgKSk7Ci0KLSAgICAgIGVycm9yID0gRlRfRVJSKCBBcnJheV9Ub29fTGFyZ2UgKTsKLSAgICAgIC8qIHBvc3Rwb25lIHRoZSBjaGVjayBvZiBybGVuIGxvbmdlciB0aGFuIGJ1ZmZlciB1bnRpbCBGVF9TdHJlYW1fUmVhZCgpICovCi0gICAgICBpZiAoICggZmxhZ3MgPj4gOCApID09IDAgKSAgICAgICAgLyogQ29tbWVudCwgc2hvdWxkIG5vdCBiZSBsb2FkZWQgKi8KLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UzKCggIiAgICBTa2lwIFBPU1QgZnJhZ21lbnQgIyVkIGJlY2F1c2UgaXQgaXMgYSBjb21tZW50XG4iLCBpICkpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgLyogdGhlIGZsYWdzIGFyZSBwYXJ0IG9mIHRoZSByZXNvdXJjZSwgc28gcmxlbiA+PSAyLiAgKi8KLSAgICAgIC8qIGJ1dCBzb21lIGZvbnRzIGRlY2xhcmUgcmxlbiA9IDAgZm9yIGVtcHR5IGZyYWdtZW50ICovCi0gICAgICBpZiAoIHJsZW4gPiAyICkKLSAgICAgICAgcmxlbiAtPSAyOwotICAgICAgZWxzZQotICAgICAgICBybGVuID0gMDsKLQotICAgICAgaWYgKCAoIGZsYWdzID4+IDggKSA9PSB0eXBlICkKLSAgICAgICAgbGVuICs9IHJsZW47Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMygoICIgICAgV3JpdGUgUE9TVCBmcmFnbWVudCAjJWQgaGVhZGVyICg0LWJ5dGUpIHRvIGJ1ZmZlciIKLSAgICAgICAgICAgICAgICAgICAgIiAlcCArIDB4JTA4eFxuIiwgaSwgcGZiX2RhdGEsIHBmYl9sZW5wb3MgKSk7Ci0gICAgICAgIGlmICggcGZiX2xlbnBvcyArIDMgPiBwZmJfbGVuICsgMiApCi0gICAgICAgICAgZ290byBFeGl0MjsKLSAgICAgICAgcGZiX2RhdGFbcGZiX2xlbnBvcyAgICBdID0gKEZUX0J5dGUpKCBsZW4gKTsKLSAgICAgICAgcGZiX2RhdGFbcGZiX2xlbnBvcyArIDFdID0gKEZUX0J5dGUpKCBsZW4gPj4gOCApOwotICAgICAgICBwZmJfZGF0YVtwZmJfbGVucG9zICsgMl0gPSAoRlRfQnl0ZSkoIGxlbiA+PiAxNiApOwotICAgICAgICBwZmJfZGF0YVtwZmJfbGVucG9zICsgM10gPSAoRlRfQnl0ZSkoIGxlbiA+PiAyNCApOwotCi0gICAgICAgIGlmICggKCBmbGFncyA+PiA4ICkgPT0gNSApICAgICAgLyogRW5kIG9mIGZvbnQgbWFyayAqLwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIEZUX1RSQUNFMygoICIgICAgV3JpdGUgUE9TVCBmcmFnbWVudCAjJWQgaGVhZGVyICg2LWJ5dGUpIHRvIGJ1ZmZlciIKLSAgICAgICAgICAgICAgICAgICAgIiAlcCArIDB4JTA4eFxuIiwgaSwgcGZiX2RhdGEsIHBmYl9wb3MgKSk7Ci0gICAgICAgIGlmICggcGZiX3BvcyArIDYgPiBwZmJfbGVuICsgMiApCi0gICAgICAgICAgZ290byBFeGl0MjsKLSAgICAgICAgcGZiX2RhdGFbcGZiX3BvcysrXSA9IDB4ODA7Ci0KLSAgICAgICAgdHlwZSA9IGZsYWdzID4+IDg7Ci0gICAgICAgIGxlbiA9IHJsZW47Ci0KLSAgICAgICAgcGZiX2RhdGFbcGZiX3BvcysrXSA9IChGVF9CeXRlKXR5cGU7Ci0gICAgICAgIHBmYl9sZW5wb3MgICAgICAgICAgPSBwZmJfcG9zOwotICAgICAgICBwZmJfZGF0YVtwZmJfcG9zKytdID0gMDsgICAgICAgIC8qIDQtYnl0ZSBsZW5ndGgsIGZpbGwgaW4gbGF0ZXIgKi8KLSAgICAgICAgcGZiX2RhdGFbcGZiX3BvcysrXSA9IDA7Ci0gICAgICAgIHBmYl9kYXRhW3BmYl9wb3MrK10gPSAwOwotICAgICAgICBwZmJfZGF0YVtwZmJfcG9zKytdID0gMDsKLSAgICAgIH0KLQotICAgICAgaWYgKCBwZmJfcG9zID4gcGZiX2xlbiB8fCBwZmJfcG9zICsgcmxlbiA+IHBmYl9sZW4gKQotICAgICAgICBnb3RvIEV4aXQyOwotCi0gICAgICBGVF9UUkFDRTMoKCAiICAgIExvYWQgUE9TVCBmcmFnbWVudCAjJWQgKCVkIGJ5dGUpIHRvIGJ1ZmZlciIKLSAgICAgICAgICAgICAgICAgICIgJXAgKyAweCUwOHhcbiIsIGksIHJsZW4sIHBmYl9kYXRhLCBwZmJfcG9zICkpOwotICAgICAgZXJyb3IgPSBGVF9TdHJlYW1fUmVhZCggc3RyZWFtLCAoRlRfQnl0ZSAqKXBmYl9kYXRhICsgcGZiX3BvcywgcmxlbiApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDI7Ci0gICAgICBwZmJfcG9zICs9IHJsZW47Ci0gICAgfQotCi0gICAgZXJyb3IgPSBGVF9FUlIoIEFycmF5X1Rvb19MYXJnZSApOwotICAgIGlmICggcGZiX3BvcyArIDIgPiBwZmJfbGVuICsgMiApCi0gICAgICBnb3RvIEV4aXQyOwotICAgIHBmYl9kYXRhW3BmYl9wb3MrK10gPSAweDgwOwotICAgIHBmYl9kYXRhW3BmYl9wb3MrK10gPSAzOwotCi0gICAgaWYgKCBwZmJfbGVucG9zICsgMyA+IHBmYl9sZW4gKyAyICkKLSAgICAgIGdvdG8gRXhpdDI7Ci0gICAgcGZiX2RhdGFbcGZiX2xlbnBvcyAgICBdID0gKEZUX0J5dGUpKCBsZW4gKTsKLSAgICBwZmJfZGF0YVtwZmJfbGVucG9zICsgMV0gPSAoRlRfQnl0ZSkoIGxlbiA+PiA4ICk7Ci0gICAgcGZiX2RhdGFbcGZiX2xlbnBvcyArIDJdID0gKEZUX0J5dGUpKCBsZW4gPj4gMTYgKTsKLSAgICBwZmJfZGF0YVtwZmJfbGVucG9zICsgM10gPSAoRlRfQnl0ZSkoIGxlbiA+PiAyNCApOwotCi0gICAgcmV0dXJuIG9wZW5fZmFjZV9mcm9tX2J1ZmZlciggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZmJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZmJfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUxIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZmFjZSApOwotCi0gIEV4aXQyOgotICAgIGlmICggZXJyb3IgPT0gRlRfRVJSKCBBcnJheV9Ub29fTGFyZ2UgKSApCi0gICAgICBGVF9UUkFDRTIoKCAiICBBYm9ydCBkdWUgdG8gdG9vLXNob3J0IGJ1ZmZlciB0byBzdG9yZSIKLSAgICAgICAgICAgICAgICAgICIgYWxsIFBPU1QgZnJhZ21lbnRzXG4iICkpOwotICAgIGVsc2UgaWYgKCBlcnJvciA9PSBGVF9FUlIoIEludmFsaWRfT2Zmc2V0ICkgKQotICAgICAgRlRfVFJBQ0UyKCggIiAgQWJvcnQgZHVlIHRvIGludmFsaWQgb2Zmc2V0IGluIGEgUE9TVCBmcmFnbWVudFxuIiApKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGVycm9yID0gRlRfRVJSKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwotICAgIEZUX0ZSRUUoIHBmYl9kYXRhICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIFRoZSByZXNvdXJjZSBoZWFkZXIgc2F5cyB3ZSd2ZSBnb3QgcmVzb3VyY2VfY250IGBzZm50JyAgICAgICovCi0gIC8qIChUcnVlVHlwZS9PcGVuVHlwZSkgcmVzb3VyY2VzIGluIHRoaXMgZmlsZS4gIExvb2sgdGhyb3VnaCAgICovCi0gIC8qIHRoZW0gZm9yIHRoZSBvbmUgaW5kaWNhdGVkIGJ5IGZhY2VfaW5kZXgsIGxvYWQgaXQgaW50byBtZW0sICovCi0gIC8qIHBhc3MgaXQgb24gdG8gdGhlIHRydWV0eXBlIGRyaXZlciwgYW5kIHJldHVybiBpdC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBNYWNfUmVhZF9zZm50X1Jlc291cmNlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKm9mZnNldHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIHJlc291cmNlX2NudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAqYWZhY2UgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0gICAgRlRfQnl0ZSogICBzZm50X2RhdGEgPSBOVUxMOwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfVUxvbmcgICBmbGFnX29mZnNldDsKLSAgICBGVF9Mb25nICAgIHJsZW47Ci0gICAgaW50ICAgICAgICBpc19jZmY7Ci0gICAgRlRfTG9uZyAgICBmYWNlX2luZGV4X2luX3Jlc291cmNlID0gMDsKLQotCi0gICAgaWYgKCBmYWNlX2luZGV4ID09IC0xICkKLSAgICAgIGZhY2VfaW5kZXggPSAwOwotICAgIGlmICggZmFjZV9pbmRleCA+PSByZXNvdXJjZV9jbnQgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwotCi0gICAgZmxhZ19vZmZzZXQgPSAoRlRfVUxvbmcpb2Zmc2V0c1tmYWNlX2luZGV4XTsKLSAgICBlcnJvciA9IEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIGZsYWdfb2Zmc2V0ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIEZUX1JFQURfTE9ORyggcmxlbiApICkKLSAgICAgIGdvdG8gRXhpdDsKLSAgICBpZiAoIHJsZW4gPT0gLTEgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9SZXNvdXJjZSApOwotICAgIGlmICggKEZUX1VMb25nKXJsZW4gPiBGVF9NQUNfUkZPUktfTUFYX0xFTiApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfT2Zmc2V0ICk7Ci0KLSAgICBlcnJvciA9IG9wZW5fZmFjZV9QU19mcm9tX3NmbnRfc3RyZWFtKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZhY2UgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiByZXdpbmQgc2ZudCBzdHJlYW0gYmVmb3JlIG9wZW5fZmFjZV9QU19mcm9tX3NmbnRfc3RyZWFtKCkgKi8KLSAgICBpZiAoIEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIGZsYWdfb2Zmc2V0ICsgNCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggRlRfQUxMT0MoIHNmbnRfZGF0YSwgcmxlbiApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICBlcnJvciA9IEZUX1N0cmVhbV9SZWFkKCBzdHJlYW0sIChGVF9CeXRlICopc2ZudF9kYXRhLCAoRlRfVUxvbmcpcmxlbiApOwotICAgIGlmICggZXJyb3IgKSB7Ci0gICAgICBGVF9GUkVFKCBzZm50X2RhdGEgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpc19jZmYgPSBybGVuID4gNCAmJiAhZnRfbWVtY21wKCBzZm50X2RhdGEsICJPVFRPIiwgNCApOwotICAgIGVycm9yID0gb3Blbl9mYWNlX2Zyb21fYnVmZmVyKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZm50X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VTG9uZylybGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlX2luZGV4X2luX3Jlc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19jZmYgPyAiY2ZmIiA6ICJ0cnVldHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmYWNlICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIENoZWNrIGZvciBhIHZhbGlkIHJlc291cmNlIGZvcmsgaGVhZGVyLCBvciBhIHZhbGlkIGRmb250ICAgICovCi0gIC8qIGhlYWRlci4gIEluIGEgcmVzb3VyY2UgZm9yayB0aGUgZmlyc3QgMTYgYnl0ZXMgYXJlIHJlcGVhdGVkICovCi0gIC8qIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgYnl0ZXMgNC03LiAgSW4gYSBkZm9udCBieXRlcyAgICovCi0gIC8qIDQtNyBwb2ludCB0byAxNiBieXRlcyBvZiB6ZXJvZXMgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBJc01hY1Jlc291cmNlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgIHJlc291cmNlX29mZnNldCwKLSAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAqYWZhY2UgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9Mb25nICAgIG1hcF9vZmZzZXQsIHJkYXJhX3BvczsKLSAgICBGVF9Mb25nICAgICpkYXRhX29mZnNldHM7Ci0gICAgRlRfTG9uZyAgICBjb3VudDsKLQotCi0gICAgZXJyb3IgPSBGVF9SYWNjZXNzX0dldF9IZWFkZXJJbmZvKCBsaWJyYXJ5LCBzdHJlYW0sIHJlc291cmNlX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXBfb2Zmc2V0LCAmcmRhcmFfcG9zICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBQT1NUIHJlc291cmNlcyBtdXN0IGJlIHNvcnRlZCB0byBjb25jYXRlbmF0ZSBwcm9wZXJseSAqLwotICAgIGVycm9yID0gRlRfUmFjY2Vzc19HZXRfRGF0YU9mZnNldHMoIGxpYnJhcnksIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfb2Zmc2V0LCByZGFyYV9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRBR19QT1NULCBUUlVFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhX29mZnNldHMsICZjb3VudCApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBlcnJvciA9IE1hY19SZWFkX1BPU1RfUmVzb3VyY2UoIGxpYnJhcnksIHN0cmVhbSwgZGF0YV9vZmZzZXRzLCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZV9pbmRleCwgYWZhY2UgKTsKLSAgICAgIEZUX0ZSRUUoIGRhdGFfb2Zmc2V0cyApOwotICAgICAgLyogUE9TVCBleGlzdHMgaW4gYW4gTFdGTiBwcm92aWRpbmcgYSBzaW5nbGUgZmFjZSAqLwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICAoKmFmYWNlKS0+bnVtX2ZhY2VzID0gMTsKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICAvKiBzZm50IHJlc291cmNlcyBzaG91bGQgbm90IGJlIHNvcnRlZCB0byBwcmVzZXJ2ZSB0aGUgZmFjZSBvcmRlciBieQotICAgICAgIFF1aWNrRHJhdyBBUEkgKi8KLSAgICBlcnJvciA9IEZUX1JhY2Nlc3NfR2V0X0RhdGFPZmZzZXRzKCBsaWJyYXJ5LCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX29mZnNldCwgcmRhcmFfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUQUdfc2ZudCwgRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGFfb2Zmc2V0cywgJmNvdW50ICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIEZUX0xvbmcgIGZhY2VfaW5kZXhfaW50ZXJuYWwgPSBmYWNlX2luZGV4ICUgY291bnQ7Ci0KLQotICAgICAgZXJyb3IgPSBNYWNfUmVhZF9zZm50X1Jlc291cmNlKCBsaWJyYXJ5LCBzdHJlYW0sIGRhdGFfb2Zmc2V0cywgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5kZXhfaW50ZXJuYWwsIGFmYWNlICk7Ci0gICAgICBGVF9GUkVFKCBkYXRhX29mZnNldHMgKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgKCphZmFjZSktPm51bV9mYWNlcyA9IGNvdW50OwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgbWFjYmluYXJ5IGhlYWRlciwgYW5kIGlmIHdlIGZpbmQgb25lICAgKi8KLSAgLyogY2hlY2sgdGhhdCB0aGUgKGZsYXR0ZW5lZCkgcmVzb3VyY2UgZm9yayBpbiBpdCBpcyB2YWxpZC4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIElzTWFjQmluYXJ5KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgKmFmYWNlICkKLSAgewotICAgIHVuc2lnbmVkIGNoYXIgIGhlYWRlclsxMjhdOwotICAgIEZUX0Vycm9yICAgICAgIGVycm9yOwotICAgIEZUX0xvbmcgICAgICAgIGRsZW4sIG9mZnNldDsKLQotCi0gICAgaWYgKCBOVUxMID09IHN0cmVhbSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfU3RyZWFtX09wZXJhdGlvbiApOwotCi0gICAgZXJyb3IgPSBGVF9TdHJlYW1fU2Vlayggc3RyZWFtLCAwICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBlcnJvciA9IEZUX1N0cmVhbV9SZWFkKCBzdHJlYW0sIChGVF9CeXRlKiloZWFkZXIsIDEyOCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCAgICAgICAgICAgIGhlYWRlclsgMF0gIT0gICAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlcls3NF0gIT0gICAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlcls4Ml0gIT0gICAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlclsgMV0gPT0gICAwIHx8Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlclsgMV0gPiAgIDMzIHx8Ci0gICAgICAgICAgICAgICAgICAgIGhlYWRlcls2M10gIT0gICAwIHx8Ci0gICAgICAgICBoZWFkZXJbMiArIGhlYWRlclsxXV0gIT0gICAwIHx8Ci0gICAgICAgICAgICAgICAgICBoZWFkZXJbMHg1M10gPiAweDdGICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotCi0gICAgZGxlbiA9ICggaGVhZGVyWzB4NTNdIDw8IDI0ICkgfAotICAgICAgICAgICAoIGhlYWRlclsweDU0XSA8PCAxNiApIHwKLSAgICAgICAgICAgKCBoZWFkZXJbMHg1NV0gPDwgIDggKSB8Ci0gICAgICAgICAgICAgaGVhZGVyWzB4NTZdOwotI2lmIDAKLSAgICBybGVuID0gKCBoZWFkZXJbMHg1N10gPDwgMjQgKSB8Ci0gICAgICAgICAgICggaGVhZGVyWzB4NThdIDw8IDE2ICkgfAotICAgICAgICAgICAoIGhlYWRlclsweDU5XSA8PCAgOCApIHwKLSAgICAgICAgICAgICBoZWFkZXJbMHg1QV07Ci0jZW5kaWYgLyogMCAqLwotICAgIG9mZnNldCA9IDEyOCArICggKCBkbGVuICsgMTI3ICkgJiB+MTI3ICk7Ci0KLSAgICByZXR1cm4gSXNNYWNSZXNvdXJjZSggbGlicmFyeSwgc3RyZWFtLCBvZmZzZXQsIGZhY2VfaW5kZXgsIGFmYWNlICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBsb2FkX2ZhY2VfaW5fZW1iZWRkZWRfcmZvcmsoIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgICAgICAqYWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfT3Blbl9BcmdzICAqYXJncyApCi0gIHsKLQotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9yYWNjZXNzCi0KLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLSAgICBGVF9FcnJvciAgIGVycm9yICA9IEZUX0VSUiggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotICAgIEZUX1VJbnQgICAgaTsKLQotICAgIGNoYXIgKiAgICAgZmlsZV9uYW1lc1tGVF9SQUNDRVNTX05fUlVMRVNdOwotICAgIEZUX0xvbmcgICAgb2Zmc2V0c1tGVF9SQUNDRVNTX05fUlVMRVNdOwotICAgIEZUX0Vycm9yICAgZXJyb3JzW0ZUX1JBQ0NFU1NfTl9SVUxFU107Ci0gICAgRlRfQm9vbCAgICBpc19kYXJ3aW5fdmZzLCB2ZnNfcmZvcmtfaGFzX25vX2ZvbnQgPSBGQUxTRTsgLyogbm90IHRlc3RlZCAqLwotCi0gICAgRlRfT3Blbl9BcmdzICBhcmdzMjsKLSAgICBGVF9TdHJlYW0gICAgIHN0cmVhbTIgPSBOVUxMOwotCi0KLSAgICBGVF9SYWNjZXNzX0d1ZXNzKCBsaWJyYXJ5LCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgYXJncy0+cGF0aG5hbWUsIGZpbGVfbmFtZXMsIG9mZnNldHMsIGVycm9ycyApOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBGVF9SQUNDRVNTX05fUlVMRVM7IGkrKyApCi0gICAgewotICAgICAgaXNfZGFyd2luX3ZmcyA9IGZ0X3JhY2Nlc3NfcnVsZV9ieV9kYXJ3aW5fdmZzKCBsaWJyYXJ5LCBpICk7Ci0gICAgICBpZiAoIGlzX2Rhcndpbl92ZnMgJiYgdmZzX3Jmb3JrX2hhc19ub19mb250ICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UzKCggIlNraXAgcnVsZSAlZDogZGFyd2luIHZmcyByZXNvdXJjZSBmb3JrIgotICAgICAgICAgICAgICAgICAgICAiIGlzIGFscmVhZHkgY2hlY2tlZCBhbmQiCi0gICAgICAgICAgICAgICAgICAgICIgbm8gZm9udCBpcyBmb3VuZFxuIiwgaSApKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggZXJyb3JzW2ldICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UzKCggIkVycm9yWyVkXSBoYXMgb2NjdXJyZWQgaW4gcnVsZSAlZFxuIiwgZXJyb3JzW2ldLCBpICkpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgYXJnczIuZmxhZ3MgICAgPSBGVF9PUEVOX1BBVEhOQU1FOwotICAgICAgYXJnczIucGF0aG5hbWUgPSBmaWxlX25hbWVzW2ldID8gZmlsZV9uYW1lc1tpXSA6IGFyZ3MtPnBhdGhuYW1lOwotCi0gICAgICBGVF9UUkFDRTMoKCAiVHJ5IHJ1bGUgJWQ6ICVzIChvZmZzZXQ9JWQpIC4uLiIsCi0gICAgICAgICAgICAgICAgICBpLCBhcmdzMi5wYXRobmFtZSwgb2Zmc2V0c1tpXSApKTsKLQotICAgICAgZXJyb3IgPSBGVF9TdHJlYW1fTmV3KCBsaWJyYXJ5LCAmYXJnczIsICZzdHJlYW0yICk7Ci0gICAgICBpZiAoIGlzX2Rhcndpbl92ZnMgJiYgRlRfRVJSX0VRKCBlcnJvciwgQ2Fubm90X09wZW5fU3RyZWFtICkgKQotICAgICAgICB2ZnNfcmZvcmtfaGFzX25vX2ZvbnQgPSBUUlVFOwotCi0gICAgICBpZiAoIGVycm9yICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UzKCggImZhaWxlZFxuIiApKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGVycm9yID0gSXNNYWNSZXNvdXJjZSggbGlicmFyeSwgc3RyZWFtMiwgb2Zmc2V0c1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZV9pbmRleCwgYWZhY2UgKTsKLSAgICAgIEZUX1N0cmVhbV9GcmVlKCBzdHJlYW0yLCAwICk7Ci0KLSAgICAgIEZUX1RSQUNFMygoICIlc1xuIiwgZXJyb3IgPyAiZmFpbGVkIjogInN1Y2Nlc3NmdWwiICkpOwotCi0gICAgICBpZiAoICFlcnJvciApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICBlbHNlIGlmICggaXNfZGFyd2luX3ZmcyApCi0gICAgICAgICAgdmZzX3Jmb3JrX2hhc19ub19mb250ID0gVFJVRTsKLSAgICB9Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgRlRfUkFDQ0VTU19OX1JVTEVTOyBpKyspCi0gICAgewotICAgICAgaWYgKCBmaWxlX25hbWVzW2ldICkKLSAgICAgICAgRlRfRlJFRSggZmlsZV9uYW1lc1tpXSApOwotICAgIH0KLQotICAgIC8qIENhbGxlciAobG9hZF9tYWNfZmFjZSkgcmVxdWlyZXMgRlRfRXJyX1Vua25vd25fRmlsZV9Gb3JtYXQuICovCi0gICAgaWYgKCBlcnJvciApCi0gICAgICBlcnJvciA9IEZUX0VSUiggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotCi0gICAgcmV0dXJuIGVycm9yOwotCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX29ianMKLQotICB9Ci0KLQotICAvKiBDaGVjayBmb3Igc29tZSBtYWNpbnRvc2ggZm9ybWF0cyB3aXRob3V0IENhcmJvbiBmcmFtZXdvcmsuICAgICovCi0gIC8qIElzIHRoaXMgYSBtYWNiaW5hcnkgZmlsZT8gIElmIHNvIGxvb2sgYXQgdGhlIHJlc291cmNlIGZvcmsuICAgKi8KLSAgLyogSXMgdGhpcyBhIG1hYyBkZm9udCBmaWxlPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJcyB0aGlzIGFuIG9sZCBzdHlsZSByZXNvdXJjZSBmb3JrPyAoaW4gZGF0YSkgICAgICAgICAgICAgICAgICovCi0gIC8qIEVsc2UgY2FsbCBsb2FkX2ZhY2VfaW5fZW1iZWRkZWRfcmZvcmsgdG8gdHJ5IGV4dHJhIHJ1bGVzICAgICAgKi8KLSAgLyogKGRlZmluZWQgaW4gYGZ0cmZvcmsuYycpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBsb2FkX21hY19mYWNlKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgICAgICAgKmFmYWNlLAotICAgICAgICAgICAgICAgICBjb25zdCBGVF9PcGVuX0FyZ3MgICphcmdzICkKLSAgewotICAgIEZUX0Vycm9yIGVycm9yOwotICAgIEZUX1VOVVNFRCggYXJncyApOwotCi0KLSAgICBlcnJvciA9IElzTWFjQmluYXJ5KCBsaWJyYXJ5LCBzdHJlYW0sIGZhY2VfaW5kZXgsIGFmYWNlICk7Ci0gICAgaWYgKCBGVF9FUlJfRVEoIGVycm9yLCBVbmtub3duX0ZpbGVfRm9ybWF0ICkgKQotICAgIHsKLQotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9yYWNjZXNzCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgRlRfVFJBQ0UzKCggIlRyeSBhcyBkZm9udDogIiApKTsKLSAgICAgIGlmICggISggYXJncy0+ZmxhZ3MgJiBGVF9PUEVOX01FTU9SWSApICkKLSAgICAgICAgRlRfVFJBQ0UzKCggIiVzIC4uLiIsIGFyZ3MtPnBhdGhuYW1lICkpOwotI2VuZGlmCi0KLSAgICAgIGVycm9yID0gSXNNYWNSZXNvdXJjZSggbGlicmFyeSwgc3RyZWFtLCAwLCBmYWNlX2luZGV4LCBhZmFjZSApOwotCi0gICAgICBGVF9UUkFDRTMoKCAiJXNcbiIsIGVycm9yID8gImZhaWxlZCIgOiAic3VjY2Vzc2Z1bCIgKSk7Ci0KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2Vfb2JqcwotCi0gICAgfQotCi0gICAgaWYgKCAoIEZUX0VSUl9FUSggZXJyb3IsIFVua25vd25fRmlsZV9Gb3JtYXQgKSAgICAgIHx8Ci0gICAgICAgICAgIEZUX0VSUl9FUSggZXJyb3IsIEludmFsaWRfU3RyZWFtX09wZXJhdGlvbiApICkgJiYKLSAgICAgICAgICggYXJncy0+ZmxhZ3MgJiBGVF9PUEVOX1BBVEhOQU1FICkgICAgICAgICAgICAgICApCi0gICAgICBlcnJvciA9IGxvYWRfZmFjZV9pbl9lbWJlZGRlZF9yZm9yayggbGlicmFyeSwgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5kZXgsIGFmYWNlLCBhcmdzICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0jZW5kaWYKLQotI2VuZGlmICAvKiAhRlRfTUFDSU5UT1NIICYmIEZUX0NPTkZJR19PUFRJT05fTUFDX0ZPTlRTICovCi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX09wZW5fRmFjZSggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICBjb25zdCBGVF9PcGVuX0FyZ3MqICBhcmdzLAotICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgICAgICAqYWZhY2UgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yOwotICAgIEZUX0RyaXZlciAgICBkcml2ZXIgPSBOVUxMOwotICAgIEZUX01lbW9yeSAgICBtZW1vcnkgPSBOVUxMOwotICAgIEZUX1N0cmVhbSAgICBzdHJlYW0gPSBOVUxMOwotICAgIEZUX0ZhY2UgICAgICBmYWNlICAgPSBOVUxMOwotICAgIEZUX0xpc3ROb2RlICBub2RlICAgPSBOVUxMOwotICAgIEZUX0Jvb2wgICAgICBleHRlcm5hbF9zdHJlYW07Ci0gICAgRlRfTW9kdWxlKiAgIGN1cjsKLSAgICBGVF9Nb2R1bGUqICAgbGltaXQ7Ci0KLQotICAgIC8qIHRlc3QgZm9yIHZhbGlkIGBsaWJyYXJ5JyBkZWxheWVkIHRvIGBGVF9TdHJlYW1fTmV3JyAqLwotCi0gICAgaWYgKCAoICFhZmFjZSAmJiBmYWNlX2luZGV4ID49IDAgKSB8fCAhYXJncyApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGV4dGVybmFsX3N0cmVhbSA9IEZUX0JPT0woICggYXJncy0+ZmxhZ3MgJiBGVF9PUEVOX1NUUkVBTSApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy0+c3RyZWFtICAgICAgICAgICAgICAgICAgICAgKTsKLQotICAgIC8qIGNyZWF0ZSBpbnB1dCBzdHJlYW0gKi8KLSAgICBlcnJvciA9IEZUX1N0cmVhbV9OZXcoIGxpYnJhcnksIGFyZ3MsICZzdHJlYW0gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRmFpbDM7Ci0KLSAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLSAgICAvKiBJZiB0aGUgZm9udCBkcml2ZXIgaXMgc3BlY2lmaWVkIGluIHRoZSBgYXJncycgc3RydWN0dXJlLCB1c2UgKi8KLSAgICAvKiBpdC4gIE90aGVyd2lzZSwgd2Ugc2NhbiB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIGRyaXZlcnMuICAgICAgKi8KLSAgICBpZiAoICggYXJncy0+ZmxhZ3MgJiBGVF9PUEVOX0RSSVZFUiApICYmIGFyZ3MtPmRyaXZlciApCi0gICAgewotICAgICAgZHJpdmVyID0gRlRfRFJJVkVSKCBhcmdzLT5kcml2ZXIgKTsKLQotICAgICAgLyogbm90IGFsbCBtb2R1bGVzIGFyZSBkcml2ZXJzLCBzbyBjaGVjay4uLiAqLwotICAgICAgaWYgKCBGVF9NT0RVTEVfSVNfRFJJVkVSKCBkcml2ZXIgKSApCi0gICAgICB7Ci0gICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMgPSAwOwotICAgICAgICBGVF9QYXJhbWV0ZXIqICBwYXJhbXMgICAgID0gTlVMTDsKLQotCi0gICAgICAgIGlmICggYXJncy0+ZmxhZ3MgJiBGVF9PUEVOX1BBUkFNUyApCi0gICAgICAgIHsKLSAgICAgICAgICBudW1fcGFyYW1zID0gYXJncy0+bnVtX3BhcmFtczsKLSAgICAgICAgICBwYXJhbXMgICAgID0gYXJncy0+cGFyYW1zOwotICAgICAgICB9Ci0KLSAgICAgICAgZXJyb3IgPSBvcGVuX2ZhY2UoIGRyaXZlciwgJnN0cmVhbSwgZXh0ZXJuYWxfc3RyZWFtLCBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BhcmFtcywgcGFyYW1zLCAmZmFjZSApOwotICAgICAgICBpZiAoICFlcnJvciApCi0gICAgICAgICAgZ290byBTdWNjZXNzOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0hhbmRsZSApOwotCi0gICAgICBGVF9TdHJlYW1fRnJlZSggc3RyZWFtLCBleHRlcm5hbF9zdHJlYW0gKTsKLSAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfRVJSKCBNaXNzaW5nX01vZHVsZSApOwotCi0gICAgICAvKiBjaGVjayBlYWNoIGZvbnQgZHJpdmVyIGZvciBhbiBhcHByb3ByaWF0ZSBmb3JtYXQgKi8KLSAgICAgIGN1ciAgID0gbGlicmFyeS0+bW9kdWxlczsKLSAgICAgIGxpbWl0ID0gY3VyICsgbGlicmFyeS0+bnVtX21vZHVsZXM7Ci0KLSAgICAgIGZvciAoIDsgY3VyIDwgbGltaXQ7IGN1cisrICkKLSAgICAgIHsKLSAgICAgICAgLyogbm90IGFsbCBtb2R1bGVzIGFyZSBmb250IGRyaXZlcnMsIHNvIGNoZWNrLi4uICovCi0gICAgICAgIGlmICggRlRfTU9EVUxFX0lTX0RSSVZFUiggY3VyWzBdICkgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcyA9IDA7Ci0gICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICAgICA9IE5VTEw7Ci0KLQotICAgICAgICAgIGRyaXZlciA9IEZUX0RSSVZFUiggY3VyWzBdICk7Ci0KLSAgICAgICAgICBpZiAoIGFyZ3MtPmZsYWdzICYgRlRfT1BFTl9QQVJBTVMgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG51bV9wYXJhbXMgPSBhcmdzLT5udW1fcGFyYW1zOwotICAgICAgICAgICAgcGFyYW1zICAgICA9IGFyZ3MtPnBhcmFtczsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBlcnJvciA9IG9wZW5fZmFjZSggZHJpdmVyLCAmc3RyZWFtLCBleHRlcm5hbF9zdHJlYW0sIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wYXJhbXMsIHBhcmFtcywgJmZhY2UgKTsKLSAgICAgICAgICBpZiAoICFlcnJvciApCi0gICAgICAgICAgICBnb3RvIFN1Y2Nlc3M7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX01BQ19GT05UUwotICAgICAgICAgIGlmICggZnRfc3RyY21wKCBjdXJbMF0tPmNsYXp6LT5tb2R1bGVfbmFtZSwgInRydWV0eXBlIiApID09IDAgJiYKLSAgICAgICAgICAgICAgIEZUX0VSUl9FUSggZXJyb3IsIFRhYmxlX01pc3NpbmcgKSAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBUcnVlVHlwZSBidXQgZXNzZW50aWFsIHRhYmxlcyBhcmUgbWlzc2luZyAqLwotICAgICAgICAgICAgaWYgKCBGVF9TdHJlYW1fU2Vlayggc3RyZWFtLCAwICkgKQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZXJyb3IgPSBvcGVuX2ZhY2VfUFNfZnJvbV9zZm50X3N0cmVhbSggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZhY2UgKTsKLSAgICAgICAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfU3RyZWFtX0ZyZWUoIHN0cmVhbSwgZXh0ZXJuYWxfc3RyZWFtICk7Ci0gICAgICAgICAgICAgIHJldHVybiBlcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgIGlmICggRlRfRVJSX05FUSggZXJyb3IsIFVua25vd25fRmlsZV9Gb3JtYXQgKSApCi0gICAgICAgICAgICBnb3RvIEZhaWwzOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICBGYWlsMzoKLSAgICAgIC8qIElmIHdlIGFyZSBvbiB0aGUgbWFjLCBhbmQgd2UgZ2V0IGFuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogRlRfRXJyX0ludmFsaWRfU3RyZWFtX09wZXJhdGlvbiBpdCBtYXkgYmUgYmVjYXVzZSB3ZSBoYXZlIGFuICovCi0gICAgICAvKiBlbXB0eSBkYXRhIGZvcmssIHNvIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHJlc291cmNlIGZvcmsuICAgICAgKi8KLSAgICAgIGlmICggRlRfRVJSX05FUSggZXJyb3IsIENhbm5vdF9PcGVuX1N0cmVhbSApICAgICAgICYmCi0gICAgICAgICAgIEZUX0VSUl9ORVEoIGVycm9yLCBVbmtub3duX0ZpbGVfRm9ybWF0ICkgICAgICAmJgotICAgICAgICAgICBGVF9FUlJfTkVRKCBlcnJvciwgSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uICkgKQotICAgICAgICBnb3RvIEZhaWwyOwotCi0jaWYgIWRlZmluZWQoIEZUX01BQ0lOVE9TSCApICYmIGRlZmluZWQoIEZUX0NPTkZJR19PUFRJT05fTUFDX0ZPTlRTICkKLSAgICAgIGVycm9yID0gbG9hZF9tYWNfZmFjZSggbGlicmFyeSwgc3RyZWFtLCBmYWNlX2luZGV4LCBhZmFjZSwgYXJncyApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgewotICAgICAgICAvKiBXZSBkb24ndCB3YW50IHRvIGdvIHRvIFN1Y2Nlc3MgaGVyZS4gIFdlJ3ZlIGFscmVhZHkgZG9uZSB0aGF0LiAqLwotICAgICAgICAvKiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgd2Ugc3VjY2VlZGVkIHdlIHN0aWxsIG5lZWQgdG8gY2xvc2UgdGhpcyAqLwotICAgICAgICAvKiBzdHJlYW0gKHdlIG9wZW5lZCBhIGRpZmZlcmVudCBzdHJlYW0gd2hpY2ggZXh0cmFjdGVkIHRoZSAgICAgICAqLwotICAgICAgICAvKiBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbiBvdXQgb2YgdGhpcyBzdHJlYW0gaGVyZS4gIFRoYXQgc3RyZWFtICAqLwotICAgICAgICAvKiB3aWxsIHN0aWxsIGJlIG9wZW4gYW5kIHRoZSBmYWNlIHdpbGwgcG9pbnQgdG8gaXQpLiAgICAgICAgICAgICAqLwotICAgICAgICBGVF9TdHJlYW1fRnJlZSggc3RyZWFtLCBleHRlcm5hbF9zdHJlYW0gKTsKLSAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgfQotCi0gICAgICBpZiAoIEZUX0VSUl9ORVEoIGVycm9yLCBVbmtub3duX0ZpbGVfRm9ybWF0ICkgKQotICAgICAgICBnb3RvIEZhaWwyOwotI2VuZGlmICAvKiAhRlRfTUFDSU5UT1NIICYmIEZUX0NPTkZJR19PUFRJT05fTUFDX0ZPTlRTICovCi0KLSAgICAgIC8qIG5vIGRyaXZlciBpcyBhYmxlIHRvIGhhbmRsZSB0aGlzIGZvcm1hdCAqLwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotCi0gIEZhaWwyOgotICAgICAgRlRfU3RyZWFtX0ZyZWUoIHN0cmVhbSwgZXh0ZXJuYWxfc3RyZWFtICk7Ci0gICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0gIFN1Y2Nlc3M6Ci0gICAgRlRfVFJBQ0U0KCggIkZUX09wZW5fRmFjZTogTmV3IGZhY2Ugb2JqZWN0LCBhZGRpbmcgdG8gbGlzdFxuIiApKTsKLQotICAgIC8qIGFkZCB0aGUgZmFjZSBvYmplY3QgdG8gaXRzIGRyaXZlcidzIGxpc3QgKi8KLSAgICBpZiAoIEZUX05FVyggbm9kZSApICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIG5vZGUtPmRhdGEgPSBmYWNlOwotICAgIC8qIGRvbid0IGFzc3VtZSBkcml2ZXIgaXMgdGhlIHNhbWUgYXMgZmFjZS0+ZHJpdmVyLCBzbyB1c2UgKi8KLSAgICAvKiBmYWNlLT5kcml2ZXIgaW5zdGVhZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfTGlzdF9BZGQoICZmYWNlLT5kcml2ZXItPmZhY2VzX2xpc3QsIG5vZGUgKTsKLQotICAgIC8qIG5vdyBhbGxvY2F0ZSBhIGdseXBoIHNsb3Qgb2JqZWN0IGZvciB0aGUgZmFjZSAqLwotICAgIEZUX1RSQUNFNCgoICJGVF9PcGVuX0ZhY2U6IENyZWF0aW5nIGdseXBoIHNsb3RcbiIgKSk7Ci0KLSAgICBpZiAoIGZhY2VfaW5kZXggPj0gMCApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9OZXdfR2x5cGhTbG90KCBmYWNlLCBOVUxMICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAvKiBmaW5hbGx5LCBhbGxvY2F0ZSBhIHNpemUgb2JqZWN0IGZvciB0aGUgZmFjZSAqLwotICAgICAgewotICAgICAgICBGVF9TaXplICBzaXplOwotCi0KLSAgICAgICAgRlRfVFJBQ0U0KCggIkZUX09wZW5fRmFjZTogQ3JlYXRpbmcgc2l6ZSBvYmplY3RcbiIgKSk7Ci0KLSAgICAgICAgZXJyb3IgPSBGVF9OZXdfU2l6ZSggZmFjZSwgJnNpemUgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIGZhY2UtPnNpemUgPSBzaXplOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIHNvbWUgY2hlY2tzICovCi0KLSAgICBpZiAoIEZUX0lTX1NDQUxBQkxFKCBmYWNlICkgKQotICAgIHsKLSAgICAgIGlmICggZmFjZS0+aGVpZ2h0IDwgMCApCi0gICAgICAgIGZhY2UtPmhlaWdodCA9IChGVF9TaG9ydCktZmFjZS0+aGVpZ2h0OwotCi0gICAgICBpZiAoICFGVF9IQVNfVkVSVElDQUwoIGZhY2UgKSApCi0gICAgICAgIGZhY2UtPm1heF9hZHZhbmNlX2hlaWdodCA9IChGVF9TaG9ydClmYWNlLT5oZWlnaHQ7Ci0gICAgfQotCi0gICAgaWYgKCBGVF9IQVNfRklYRURfU0laRVMoIGZhY2UgKSApCi0gICAgewotICAgICAgRlRfSW50ICBpOwotCi0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgZmFjZS0+bnVtX2ZpeGVkX3NpemVzOyBpKysgKQotICAgICAgewotICAgICAgICBGVF9CaXRtYXBfU2l6ZSogIGJzaXplID0gZmFjZS0+YXZhaWxhYmxlX3NpemVzICsgaTsKLQotCi0gICAgICAgIGlmICggYnNpemUtPmhlaWdodCA8IDAgKQotICAgICAgICAgIGJzaXplLT5oZWlnaHQgPSAoRlRfU2hvcnQpLWJzaXplLT5oZWlnaHQ7Ci0gICAgICAgIGlmICggYnNpemUtPnhfcHBlbSA8IDAgKQotICAgICAgICAgIGJzaXplLT54X3BwZW0gPSAoRlRfU2hvcnQpLWJzaXplLT54X3BwZW07Ci0gICAgICAgIGlmICggYnNpemUtPnlfcHBlbSA8IDAgKQotICAgICAgICAgIGJzaXplLT55X3BwZW0gPSAtYnNpemUtPnlfcHBlbTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBpbml0aWFsaXplIGludGVybmFsIGZhY2UgZGF0YSAqLwotICAgIHsKLSAgICAgIEZUX0ZhY2VfSW50ZXJuYWwgIGludGVybmFsID0gZmFjZS0+aW50ZXJuYWw7Ci0KLQotICAgICAgaW50ZXJuYWwtPnRyYW5zZm9ybV9tYXRyaXgueHggPSAweDEwMDAwTDsKLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fbWF0cml4Lnh5ID0gMDsKLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fbWF0cml4Lnl4ID0gMDsKLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fbWF0cml4Lnl5ID0gMHgxMDAwMEw7Ci0KLSAgICAgIGludGVybmFsLT50cmFuc2Zvcm1fZGVsdGEueCA9IDA7Ci0gICAgICBpbnRlcm5hbC0+dHJhbnNmb3JtX2RlbHRhLnkgPSAwOwotCi0gICAgICBpbnRlcm5hbC0+cmVmY291bnQgPSAxOwotICAgIH0KLQotICAgIGlmICggYWZhY2UgKQotICAgICAgKmFmYWNlID0gZmFjZTsKLSAgICBlbHNlCi0gICAgICBGVF9Eb25lX0ZhY2UoIGZhY2UgKTsKLQotICAgIGdvdG8gRXhpdDsKLQotICBGYWlsOgotICAgIGlmICggbm9kZSApCi0gICAgICBGVF9Eb25lX0ZhY2UoIGZhY2UgKTsgICAgLyogZmFjZSBtdXN0IGJlIGluIHRoZSBkcml2ZXIncyBsaXN0ICovCi0gICAgZWxzZSBpZiAoIGZhY2UgKQotICAgICAgZGVzdHJveV9mYWNlKCBtZW1vcnksIGZhY2UsIGRyaXZlciApOwotCi0gIEV4aXQ6Ci0gICAgRlRfVFJBQ0U0KCggIkZUX09wZW5fRmFjZTogUmV0dXJuICVkXG4iLCBlcnJvciApKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9BdHRhY2hfRmlsZSggRlRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgZmlsZXBhdGhuYW1lICkKLSAgewotICAgIEZUX09wZW5fQXJncyAgb3BlbjsKLQotCi0gICAgLyogdGVzdCBmb3IgdmFsaWQgYGZhY2UnIGRlbGF5ZWQgdG8gYEZUX0F0dGFjaF9TdHJlYW0nICovCi0KLSAgICBpZiAoICFmaWxlcGF0aG5hbWUgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBvcGVuLnN0cmVhbSAgID0gTlVMTDsKLSAgICBvcGVuLmZsYWdzICAgID0gRlRfT1BFTl9QQVRITkFNRTsKLSAgICBvcGVuLnBhdGhuYW1lID0gKGNoYXIqKWZpbGVwYXRobmFtZTsKLQotICAgIHJldHVybiBGVF9BdHRhY2hfU3RyZWFtKCBmYWNlLCAmb3BlbiApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0F0dGFjaF9TdHJlYW0oIEZUX0ZhY2UgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX09wZW5fQXJncyogIHBhcmFtZXRlcnMgKQotICB7Ci0gICAgRlRfU3RyZWFtICBzdHJlYW07Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9Ecml2ZXIgIGRyaXZlcjsKLQotICAgIEZUX0RyaXZlcl9DbGFzcyAgY2xheno7Ci0KLQotICAgIC8qIHRlc3QgZm9yIHZhbGlkIGBwYXJhbWV0ZXJzJyBkZWxheWVkIHRvIGBGVF9TdHJlYW1fTmV3JyAqLwotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIGRyaXZlciA9IGZhY2UtPmRyaXZlcjsKLSAgICBpZiAoICFkcml2ZXIgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0RyaXZlcl9IYW5kbGUgKTsKLQotICAgIGVycm9yID0gRlRfU3RyZWFtX05ldyggZHJpdmVyLT5yb290LmxpYnJhcnksIHBhcmFtZXRlcnMsICZzdHJlYW0gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIHdlIGltcGxlbWVudCBGVF9BdHRhY2hfU3RyZWFtIGluIGVhY2ggZHJpdmVyIHRocm91Z2ggdGhlICovCi0gICAgLyogYGF0dGFjaF9maWxlJyBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIGVycm9yID0gRlRfRVJSKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLSAgICBjbGF6eiA9IGRyaXZlci0+Y2xheno7Ci0gICAgaWYgKCBjbGF6ei0+YXR0YWNoX2ZpbGUgKQotICAgICAgZXJyb3IgPSBjbGF6ei0+YXR0YWNoX2ZpbGUoIGZhY2UsIHN0cmVhbSApOwotCi0gICAgLyogY2xvc2UgdGhlIGF0dGFjaGVkIHN0cmVhbSAqLwotICAgIEZUX1N0cmVhbV9GcmVlKCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgIChGVF9Cb29sKSggcGFyYW1ldGVycy0+c3RyZWFtICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBwYXJhbWV0ZXJzLT5mbGFncyAmIEZUX09QRU5fU1RSRUFNICkgKSApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1JlZmVyZW5jZV9GYWNlKCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICBmYWNlLT5pbnRlcm5hbC0+cmVmY291bnQrKzsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfRG9uZV9GYWNlKCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICBGVF9Ecml2ZXIgICAgZHJpdmVyOwotICAgIEZUX01lbW9yeSAgICBtZW1vcnk7Ci0gICAgRlRfTGlzdE5vZGUgIG5vZGU7Ci0KLQotICAgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0gICAgaWYgKCBmYWNlICYmIGZhY2UtPmRyaXZlciApCi0gICAgewotICAgICAgZmFjZS0+aW50ZXJuYWwtPnJlZmNvdW50LS07Ci0gICAgICBpZiAoIGZhY2UtPmludGVybmFsLT5yZWZjb3VudCA+IDAgKQotICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZHJpdmVyID0gZmFjZS0+ZHJpdmVyOwotICAgICAgICBtZW1vcnkgPSBkcml2ZXItPnJvb3QubWVtb3J5OwotCi0gICAgICAgIC8qIGZpbmQgZmFjZSBpbiBkcml2ZXIncyBsaXN0ICovCi0gICAgICAgIG5vZGUgPSBGVF9MaXN0X0ZpbmQoICZkcml2ZXItPmZhY2VzX2xpc3QsIGZhY2UgKTsKLSAgICAgICAgaWYgKCBub2RlICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHJlbW92ZSBmYWNlIG9iamVjdCBmcm9tIHRoZSBkcml2ZXIncyBsaXN0ICovCi0gICAgICAgICAgRlRfTGlzdF9SZW1vdmUoICZkcml2ZXItPmZhY2VzX2xpc3QsIG5vZGUgKTsKLSAgICAgICAgICBGVF9GUkVFKCBub2RlICk7Ci0KLSAgICAgICAgICAvKiBub3cgZGVzdHJveSB0aGUgb2JqZWN0IHByb3BlciAqLwotICAgICAgICAgIGRlc3Ryb3lfZmFjZSggbWVtb3J5LCBmYWNlLCBkcml2ZXIgKTsKLSAgICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG9ianMuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfTmV3X1NpemUoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgRlRfU2l6ZSAgKmFzaXplICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnk7Ci0gICAgRlRfRHJpdmVyICAgICAgICBkcml2ZXI7Ci0gICAgRlRfRHJpdmVyX0NsYXNzICBjbGF6ejsKLQotICAgIEZUX1NpemUgICAgICAgICAgc2l6ZSA9IE5VTEw7Ci0gICAgRlRfTGlzdE5vZGUgICAgICBub2RlID0gTlVMTDsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIGlmICggIWFzaXplICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgaWYgKCAhZmFjZS0+ZHJpdmVyICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Ecml2ZXJfSGFuZGxlICk7Ci0KLSAgICAqYXNpemUgPSBOVUxMOwotCi0gICAgZHJpdmVyID0gZmFjZS0+ZHJpdmVyOwotICAgIGNsYXp6ICA9IGRyaXZlci0+Y2xheno7Ci0gICAgbWVtb3J5ID0gZmFjZS0+bWVtb3J5OwotCi0gICAgLyogQWxsb2NhdGUgbmV3IHNpemUgb2JqZWN0IGFuZCBwZXJmb3JtIGJhc2ljIGluaXRpYWxpc2F0aW9uICovCi0gICAgaWYgKCBGVF9BTExPQyggc2l6ZSwgY2xhenotPnNpemVfb2JqZWN0X3NpemUgKSB8fCBGVF9ORVcoIG5vZGUgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBzaXplLT5mYWNlID0gZmFjZTsKLQotICAgIC8qIGZvciBub3csIGRvIG5vdCB1c2UgYW55IGludGVybmFsIGZpZWxkcyBpbiBzaXplIG9iamVjdHMgKi8KLSAgICBzaXplLT5pbnRlcm5hbCA9IE5VTEw7Ci0KLSAgICBpZiAoIGNsYXp6LT5pbml0X3NpemUgKQotICAgICAgZXJyb3IgPSBjbGF6ei0+aW5pdF9zaXplKCBzaXplICk7Ci0KLSAgICAvKiBpbiBjYXNlIG9mIHN1Y2Nlc3MsIGFkZCB0byB0aGUgZmFjZSdzIGxpc3QgKi8KLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgKmFzaXplICAgICA9IHNpemU7Ci0gICAgICBub2RlLT5kYXRhID0gc2l6ZTsKLSAgICAgIEZUX0xpc3RfQWRkKCAmZmFjZS0+c2l6ZXNfbGlzdCwgbm9kZSApOwotICAgIH0KLQotICBFeGl0OgotICAgIGlmICggZXJyb3IgKQotICAgIHsKLSAgICAgIEZUX0ZSRUUoIG5vZGUgKTsKLSAgICAgIEZUX0ZSRUUoIHNpemUgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvYmpzLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0RvbmVfU2l6ZSggRlRfU2l6ZSAgc2l6ZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgZXJyb3I7Ci0gICAgRlRfRHJpdmVyICAgIGRyaXZlcjsKLSAgICBGVF9NZW1vcnkgICAgbWVtb3J5OwotICAgIEZUX0ZhY2UgICAgICBmYWNlOwotICAgIEZUX0xpc3ROb2RlICBub2RlOwotCi0KLSAgICBpZiAoICFzaXplICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9TaXplX0hhbmRsZSApOwotCi0gICAgZmFjZSA9IHNpemUtPmZhY2U7Ci0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIGRyaXZlciA9IGZhY2UtPmRyaXZlcjsKLSAgICBpZiAoICFkcml2ZXIgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0RyaXZlcl9IYW5kbGUgKTsKLQotICAgIG1lbW9yeSA9IGRyaXZlci0+cm9vdC5tZW1vcnk7Ci0KLSAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBub2RlICA9IEZUX0xpc3RfRmluZCggJmZhY2UtPnNpemVzX2xpc3QsIHNpemUgKTsKLSAgICBpZiAoIG5vZGUgKQotICAgIHsKLSAgICAgIEZUX0xpc3RfUmVtb3ZlKCAmZmFjZS0+c2l6ZXNfbGlzdCwgbm9kZSApOwotICAgICAgRlRfRlJFRSggbm9kZSApOwotCi0gICAgICBpZiAoIGZhY2UtPnNpemUgPT0gc2l6ZSApCi0gICAgICB7Ci0gICAgICAgIGZhY2UtPnNpemUgPSBOVUxMOwotICAgICAgICBpZiAoIGZhY2UtPnNpemVzX2xpc3QuaGVhZCApCi0gICAgICAgICAgZmFjZS0+c2l6ZSA9IChGVF9TaXplKShmYWNlLT5zaXplc19saXN0LmhlYWQtPmRhdGEpOwotICAgICAgfQotCi0gICAgICBkZXN0cm95X3NpemUoIG1lbW9yeSwgc2l6ZSwgZHJpdmVyICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfU2l6ZV9IYW5kbGUgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG9ianMuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX01hdGNoX1NpemUoIEZUX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEsCi0gICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICAgaWdub3JlX3dpZHRoLAotICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICAgIHNpemVfaW5kZXggKQotICB7Ci0gICAgRlRfSW50ICAgaTsKLSAgICBGVF9Mb25nICB3LCBoOwotCi0KLSAgICBpZiAoICFGVF9IQVNfRklYRURfU0laRVMoIGZhY2UgKSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIC8qIEZUX0JpdG1hcF9TaXplIGRvZXNuJ3QgcHJvdmlkZSBlbm91Z2ggaW5mby4uLiAqLwotICAgIGlmICggcmVxLT50eXBlICE9IEZUX1NJWkVfUkVRVUVTVF9UWVBFX05PTUlOQUwgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLQotICAgIHcgPSBGVF9SRVFVRVNUX1dJRFRIICggcmVxICk7Ci0gICAgaCA9IEZUX1JFUVVFU1RfSEVJR0hUKCByZXEgKTsKLQotICAgIGlmICggcmVxLT53aWR0aCAmJiAhcmVxLT5oZWlnaHQgKQotICAgICAgaCA9IHc7Ci0gICAgZWxzZSBpZiAoICFyZXEtPndpZHRoICYmIHJlcS0+aGVpZ2h0ICkKLSAgICAgIHcgPSBoOwotCi0gICAgdyA9IEZUX1BJWF9ST1VORCggdyApOwotICAgIGggPSBGVF9QSVhfUk9VTkQoIGggKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgZmFjZS0+bnVtX2ZpeGVkX3NpemVzOyBpKysgKQotICAgIHsKLSAgICAgIEZUX0JpdG1hcF9TaXplKiAgYnNpemUgPSBmYWNlLT5hdmFpbGFibGVfc2l6ZXMgKyBpOwotCi0KLSAgICAgIGlmICggaCAhPSBGVF9QSVhfUk9VTkQoIGJzaXplLT55X3BwZW0gKSApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBpZiAoIHcgPT0gRlRfUElYX1JPVU5EKCBic2l6ZS0+eF9wcGVtICkgfHwgaWdub3JlX3dpZHRoICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UzKCggIkZUX01hdGNoX1NpemU6IGJpdG1hcCBzdHJpa2UgJWQgbWF0Y2hlc1xuIiwgaSApKTsKLQotICAgICAgICBpZiAoIHNpemVfaW5kZXggKQotICAgICAgICAgICpzaXplX2luZGV4ID0gKEZUX1VMb25nKWk7Ci0KLSAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfUGl4ZWxfU2l6ZSApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b2Jqcy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBmdF9zeW50aGVzaXplX3ZlcnRpY2FsX21ldHJpY3MoIEZUX0dseXBoX01ldHJpY3MqICBtZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgICAgICBhZHZhbmNlICkKLSAgewotICAgIEZUX1BvcyAgaGVpZ2h0ID0gbWV0cmljcy0+aGVpZ2h0OwotCi0KLSAgICAvKiBjb21wZW5zYXRlIGZvciBnbHlwaCB3aXRoIGJib3ggYWJvdmUvYmVsb3cgdGhlIGJhc2VsaW5lICovCi0gICAgaWYgKCBtZXRyaWNzLT5ob3JpQmVhcmluZ1kgPCAwICkKLSAgICB7Ci0gICAgICBpZiAoIGhlaWdodCA8IG1ldHJpY3MtPmhvcmlCZWFyaW5nWSApCi0gICAgICAgIGhlaWdodCA9IG1ldHJpY3MtPmhvcmlCZWFyaW5nWTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIG1ldHJpY3MtPmhvcmlCZWFyaW5nWSA+IDAgKQotICAgICAgaGVpZ2h0IC09IG1ldHJpY3MtPmhvcmlCZWFyaW5nWTsKLQotICAgIC8qIHRoZSBmYWN0b3IgMS4yIGlzIGEgaGV1cmlzdGljYWwgdmFsdWUgKi8KLSAgICBpZiAoICFhZHZhbmNlICkKLSAgICAgIGFkdmFuY2UgPSBoZWlnaHQgKiAxMiAvIDEwOwotCi0gICAgbWV0cmljcy0+dmVydEJlYXJpbmdYID0gbWV0cmljcy0+aG9yaUJlYXJpbmdYIC0gbWV0cmljcy0+aG9yaUFkdmFuY2UgLyAyOwotICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWSA9ICggYWR2YW5jZSAtIGhlaWdodCApIC8gMjsKLSAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSAgPSBhZHZhbmNlOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9yZWNvbXB1dGVfc2NhbGVkX21ldHJpY3MoIEZUX0ZhY2UgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9NZXRyaWNzKiAgbWV0cmljcyApCi0gIHsKLSAgICAvKiBDb21wdXRlIHJvb3QgYXNjZW5kZXIsIGRlc2NlbmRlciwgdGVzdCBoZWlnaHQsIGFuZCBtYXhfYWR2YW5jZSAqLwotCi0jaWZkZWYgR1JJRF9GSVRfTUVUUklDUwotICAgIG1ldHJpY3MtPmFzY2VuZGVyICAgID0gRlRfUElYX0NFSUwoIEZUX011bEZpeCggZmFjZS0+YXNjZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT55X3NjYWxlICkgKTsKLQotICAgIG1ldHJpY3MtPmRlc2NlbmRlciAgID0gRlRfUElYX0ZMT09SKCBGVF9NdWxGaXgoIGZhY2UtPmRlc2NlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT55X3NjYWxlICkgKTsKLQotICAgIG1ldHJpY3MtPmhlaWdodCAgICAgID0gRlRfUElYX1JPVU5EKCBGVF9NdWxGaXgoIGZhY2UtPmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT55X3NjYWxlICkgKTsKLQotICAgIG1ldHJpY3MtPm1heF9hZHZhbmNlID0gRlRfUElYX1JPVU5EKCBGVF9NdWxGaXgoIGZhY2UtPm1heF9hZHZhbmNlX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnhfc2NhbGUgKSApOwotI2Vsc2UgLyogIUdSSURfRklUX01FVFJJQ1MgKi8KLSAgICBtZXRyaWNzLT5hc2NlbmRlciAgICA9IEZUX011bEZpeCggZmFjZS0+YXNjZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnlfc2NhbGUgKTsKLQotICAgIG1ldHJpY3MtPmRlc2NlbmRlciAgID0gRlRfTXVsRml4KCBmYWNlLT5kZXNjZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnlfc2NhbGUgKTsKLQotICAgIG1ldHJpY3MtPmhlaWdodCAgICAgID0gRlRfTXVsRml4KCBmYWNlLT5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnlfc2NhbGUgKTsKLQotICAgIG1ldHJpY3MtPm1heF9hZHZhbmNlID0gRlRfTXVsRml4KCBmYWNlLT5tYXhfYWR2YW5jZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+eF9zY2FsZSApOwotI2VuZGlmIC8qICFHUklEX0ZJVF9NRVRSSUNTICovCi0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfU2VsZWN0X01ldHJpY3MoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHN0cmlrZV9pbmRleCApCi0gIHsKLSAgICBGVF9TaXplX01ldHJpY3MqICBtZXRyaWNzOwotICAgIEZUX0JpdG1hcF9TaXplKiAgIGJzaXplOwotCi0KLSAgICBtZXRyaWNzID0gJmZhY2UtPnNpemUtPm1ldHJpY3M7Ci0gICAgYnNpemUgICA9IGZhY2UtPmF2YWlsYWJsZV9zaXplcyArIHN0cmlrZV9pbmRleDsKLQotICAgIG1ldHJpY3MtPnhfcHBlbSA9IChGVF9VU2hvcnQpKCAoIGJzaXplLT54X3BwZW0gKyAzMiApID4+IDYgKTsKLSAgICBtZXRyaWNzLT55X3BwZW0gPSAoRlRfVVNob3J0KSggKCBic2l6ZS0+eV9wcGVtICsgMzIgKSA+PiA2ICk7Ci0KLSAgICBpZiAoIEZUX0lTX1NDQUxBQkxFKCBmYWNlICkgKQotICAgIHsKLSAgICAgIG1ldHJpY3MtPnhfc2NhbGUgPSBGVF9EaXZGaXgoIGJzaXplLT54X3BwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT51bml0c19wZXJfRU0gKTsKLSAgICAgIG1ldHJpY3MtPnlfc2NhbGUgPSBGVF9EaXZGaXgoIGJzaXplLT55X3BwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT51bml0c19wZXJfRU0gKTsKLQotICAgICAgZnRfcmVjb21wdXRlX3NjYWxlZF9tZXRyaWNzKCBmYWNlLCBtZXRyaWNzICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBtZXRyaWNzLT54X3NjYWxlICAgICA9IDFMIDw8IDE2OwotICAgICAgbWV0cmljcy0+eV9zY2FsZSAgICAgPSAxTCA8PCAxNjsKLSAgICAgIG1ldHJpY3MtPmFzY2VuZGVyICAgID0gYnNpemUtPnlfcHBlbTsKLSAgICAgIG1ldHJpY3MtPmRlc2NlbmRlciAgID0gMDsKLSAgICAgIG1ldHJpY3MtPmhlaWdodCAgICAgID0gYnNpemUtPmhlaWdodCA8PCA2OwotICAgICAgbWV0cmljcy0+bWF4X2FkdmFuY2UgPSBic2l6ZS0+eF9wcGVtOwotICAgIH0KLQotICAgIEZUX1RSQUNFNSgoICJGVF9TZWxlY3RfTWV0cmljczpcbiIgKSk7Ci0gICAgRlRfVFJBQ0U1KCggIiAgeCBzY2FsZTogJWQgKCVmKVxuIiwKLSAgICAgICAgICAgICAgICBtZXRyaWNzLT54X3NjYWxlLCBtZXRyaWNzLT54X3NjYWxlIC8gNjU1MzYuMCApKTsKLSAgICBGVF9UUkFDRTUoKCAiICB5IHNjYWxlOiAlZCAoJWYpXG4iLAotICAgICAgICAgICAgICAgIG1ldHJpY3MtPnlfc2NhbGUsIG1ldHJpY3MtPnlfc2NhbGUgLyA2NTUzNi4wICkpOwotICAgIEZUX1RSQUNFNSgoICIgIGFzY2VuZGVyOiAlZlxuIiwgICAgbWV0cmljcy0+YXNjZW5kZXIgLyA2NC4wICkpOwotICAgIEZUX1RSQUNFNSgoICIgIGRlc2NlbmRlcjogJWZcbiIsICAgbWV0cmljcy0+ZGVzY2VuZGVyIC8gNjQuMCApKTsKLSAgICBGVF9UUkFDRTUoKCAiICBoZWlnaHQ6ICVmXG4iLCAgICAgIG1ldHJpY3MtPmhlaWdodCAvIDY0LjAgKSk7Ci0gICAgRlRfVFJBQ0U1KCggIiAgbWF4IGFkdmFuY2U6ICVmXG4iLCBtZXRyaWNzLT5tYXhfYWR2YW5jZSAvIDY0LjAgKSk7Ci0gICAgRlRfVFJBQ0U1KCggIiAgeCBwcGVtOiAlZFxuIiwgICAgICBtZXRyaWNzLT54X3BwZW0gKSk7Ci0gICAgRlRfVFJBQ0U1KCggIiAgeSBwcGVtOiAlZFxuIiwgICAgICBtZXRyaWNzLT55X3BwZW0gKSk7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgRlRfUmVxdWVzdF9NZXRyaWNzKCBGVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEgKQotICB7Ci0gICAgRlRfU2l6ZV9NZXRyaWNzKiAgbWV0cmljczsKLQotCi0gICAgbWV0cmljcyA9ICZmYWNlLT5zaXplLT5tZXRyaWNzOwotCi0gICAgaWYgKCBGVF9JU19TQ0FMQUJMRSggZmFjZSApICkKLSAgICB7Ci0gICAgICBGVF9Mb25nICB3ID0gMCwgaCA9IDAsIHNjYWxlZF93ID0gMCwgc2NhbGVkX2ggPSAwOwotCi0KLSAgICAgIHN3aXRjaCAoIHJlcS0+dHlwZSApCi0gICAgICB7Ci0gICAgICBjYXNlIEZUX1NJWkVfUkVRVUVTVF9UWVBFX05PTUlOQUw6Ci0gICAgICAgIHcgPSBoID0gZmFjZS0+dW5pdHNfcGVyX0VNOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBGVF9TSVpFX1JFUVVFU1RfVFlQRV9SRUFMX0RJTToKLSAgICAgICAgdyA9IGggPSBmYWNlLT5hc2NlbmRlciAtIGZhY2UtPmRlc2NlbmRlcjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRlRfU0laRV9SRVFVRVNUX1RZUEVfQkJPWDoKLSAgICAgICAgdyA9IGZhY2UtPmJib3gueE1heCAtIGZhY2UtPmJib3gueE1pbjsKLSAgICAgICAgaCA9IGZhY2UtPmJib3gueU1heCAtIGZhY2UtPmJib3gueU1pbjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRlRfU0laRV9SRVFVRVNUX1RZUEVfQ0VMTDoKLSAgICAgICAgdyA9IGZhY2UtPm1heF9hZHZhbmNlX3dpZHRoOwotICAgICAgICBoID0gZmFjZS0+YXNjZW5kZXIgLSBmYWNlLT5kZXNjZW5kZXI7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEZUX1NJWkVfUkVRVUVTVF9UWVBFX1NDQUxFUzoKLSAgICAgICAgbWV0cmljcy0+eF9zY2FsZSA9IChGVF9GaXhlZClyZXEtPndpZHRoOwotICAgICAgICBtZXRyaWNzLT55X3NjYWxlID0gKEZUX0ZpeGVkKXJlcS0+aGVpZ2h0OwotICAgICAgICBpZiAoICFtZXRyaWNzLT54X3NjYWxlICkKLSAgICAgICAgICBtZXRyaWNzLT54X3NjYWxlID0gbWV0cmljcy0+eV9zY2FsZTsKLSAgICAgICAgZWxzZSBpZiAoICFtZXRyaWNzLT55X3NjYWxlICkKLSAgICAgICAgICBtZXRyaWNzLT55X3NjYWxlID0gbWV0cmljcy0+eF9zY2FsZTsKLSAgICAgICAgZ290byBDYWxjdWxhdGVfUHBlbTsKLQotICAgICAgY2FzZSBGVF9TSVpFX1JFUVVFU1RfVFlQRV9NQVg6Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvKiB0byBiZSBvbiB0aGUgc2FmZSBzaWRlICovCi0gICAgICBpZiAoIHcgPCAwICkKLSAgICAgICAgdyA9IC13OwotCi0gICAgICBpZiAoIGggPCAwICkKLSAgICAgICAgaCA9IC1oOwotCi0gICAgICBzY2FsZWRfdyA9IEZUX1JFUVVFU1RfV0lEVEggKCByZXEgKTsKLSAgICAgIHNjYWxlZF9oID0gRlRfUkVRVUVTVF9IRUlHSFQoIHJlcSApOwotCi0gICAgICAvKiBkZXRlcm1pbmUgc2NhbGVzICovCi0gICAgICBpZiAoIHJlcS0+d2lkdGggKQotICAgICAgewotICAgICAgICBtZXRyaWNzLT54X3NjYWxlID0gRlRfRGl2Rml4KCBzY2FsZWRfdywgdyApOwotCi0gICAgICAgIGlmICggcmVxLT5oZWlnaHQgKQotICAgICAgICB7Ci0gICAgICAgICAgbWV0cmljcy0+eV9zY2FsZSA9IEZUX0RpdkZpeCggc2NhbGVkX2gsIGggKTsKLQotICAgICAgICAgIGlmICggcmVxLT50eXBlID09IEZUX1NJWkVfUkVRVUVTVF9UWVBFX0NFTEwgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggbWV0cmljcy0+eV9zY2FsZSA+IG1ldHJpY3MtPnhfc2NhbGUgKQotICAgICAgICAgICAgICBtZXRyaWNzLT55X3NjYWxlID0gbWV0cmljcy0+eF9zY2FsZTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgbWV0cmljcy0+eF9zY2FsZSA9IG1ldHJpY3MtPnlfc2NhbGU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG1ldHJpY3MtPnlfc2NhbGUgPSBtZXRyaWNzLT54X3NjYWxlOwotICAgICAgICAgIHNjYWxlZF9oID0gRlRfTXVsRGl2KCBzY2FsZWRfdywgaCwgdyApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG1ldHJpY3MtPnhfc2NhbGUgPSBtZXRyaWNzLT55X3NjYWxlID0gRlRfRGl2Rml4KCBzY2FsZWRfaCwgaCApOwotICAgICAgICBzY2FsZWRfdyA9IEZUX011bERpdiggc2NhbGVkX2gsIHcsIGggKTsKLSAgICAgIH0KLQotICBDYWxjdWxhdGVfUHBlbToKLSAgICAgIC8qIGNhbGN1bGF0ZSB0aGUgcHBlbXMgKi8KLSAgICAgIGlmICggcmVxLT50eXBlICE9IEZUX1NJWkVfUkVRVUVTVF9UWVBFX05PTUlOQUwgKQotICAgICAgewotICAgICAgICBzY2FsZWRfdyA9IEZUX011bEZpeCggZmFjZS0+dW5pdHNfcGVyX0VNLCBtZXRyaWNzLT54X3NjYWxlICk7Ci0gICAgICAgIHNjYWxlZF9oID0gRlRfTXVsRml4KCBmYWNlLT51bml0c19wZXJfRU0sIG1ldHJpY3MtPnlfc2NhbGUgKTsKLSAgICAgIH0KLQotICAgICAgbWV0cmljcy0+eF9wcGVtID0gKEZUX1VTaG9ydCkoICggc2NhbGVkX3cgKyAzMiApID4+IDYgKTsKLSAgICAgIG1ldHJpY3MtPnlfcHBlbSA9IChGVF9VU2hvcnQpKCAoIHNjYWxlZF9oICsgMzIgKSA+PiA2ICk7Ci0KLSAgICAgIGZ0X3JlY29tcHV0ZV9zY2FsZWRfbWV0cmljcyggZmFjZSwgbWV0cmljcyApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfWkVSTyggbWV0cmljcyApOwotICAgICAgbWV0cmljcy0+eF9zY2FsZSA9IDFMIDw8IDE2OwotICAgICAgbWV0cmljcy0+eV9zY2FsZSA9IDFMIDw8IDE2OwotICAgIH0KLQotICAgIEZUX1RSQUNFNSgoICJGVF9SZXF1ZXN0X01ldHJpY3M6XG4iICkpOwotICAgIEZUX1RSQUNFNSgoICIgIHggc2NhbGU6ICVkICglZilcbiIsCi0gICAgICAgICAgICAgICAgbWV0cmljcy0+eF9zY2FsZSwgbWV0cmljcy0+eF9zY2FsZSAvIDY1NTM2LjAgKSk7Ci0gICAgRlRfVFJBQ0U1KCggIiAgeSBzY2FsZTogJWQgKCVmKVxuIiwKLSAgICAgICAgICAgICAgICBtZXRyaWNzLT55X3NjYWxlLCBtZXRyaWNzLT55X3NjYWxlIC8gNjU1MzYuMCApKTsKLSAgICBGVF9UUkFDRTUoKCAiICBhc2NlbmRlcjogJWZcbiIsICAgIG1ldHJpY3MtPmFzY2VuZGVyIC8gNjQuMCApKTsKLSAgICBGVF9UUkFDRTUoKCAiICBkZXNjZW5kZXI6ICVmXG4iLCAgIG1ldHJpY3MtPmRlc2NlbmRlciAvIDY0LjAgKSk7Ci0gICAgRlRfVFJBQ0U1KCggIiAgaGVpZ2h0OiAlZlxuIiwgICAgICBtZXRyaWNzLT5oZWlnaHQgLyA2NC4wICkpOwotICAgIEZUX1RSQUNFNSgoICIgIG1heCBhZHZhbmNlOiAlZlxuIiwgbWV0cmljcy0+bWF4X2FkdmFuY2UgLyA2NC4wICkpOwotICAgIEZUX1RSQUNFNSgoICIgIHggcHBlbTogJWRcbiIsICAgICAgbWV0cmljcy0+eF9wcGVtICkpOwotICAgIEZUX1RSQUNFNSgoICIgIHkgcHBlbTogJWRcbiIsICAgICAgbWV0cmljcy0+eV9wcGVtICkpOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1NlbGVjdF9TaXplKCBGVF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgc3RyaWtlX2luZGV4ICkKLSAgewotICAgIEZUX0RyaXZlcl9DbGFzcyAgY2xheno7Ci0KLQotICAgIGlmICggIWZhY2UgfHwgIUZUX0hBU19GSVhFRF9TSVpFUyggZmFjZSApICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GYWNlX0hhbmRsZSApOwotCi0gICAgaWYgKCBzdHJpa2VfaW5kZXggPCAwIHx8IHN0cmlrZV9pbmRleCA+PSBmYWNlLT5udW1fZml4ZWRfc2l6ZXMgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBjbGF6eiA9IGZhY2UtPmRyaXZlci0+Y2xheno7Ci0KLSAgICBpZiAoIGNsYXp6LT5zZWxlY3Rfc2l6ZSApCi0gICAgewotICAgICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICAgIGVycm9yID0gY2xhenotPnNlbGVjdF9zaXplKCBmYWNlLT5zaXplLCAoRlRfVUxvbmcpc3RyaWtlX2luZGV4ICk7Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgewotICAgICAgICBGVF9TaXplX01ldHJpY3MqICBtZXRyaWNzID0gJmZhY2UtPnNpemUtPm1ldHJpY3M7Ci0KLQotICAgICAgICBGVF9UUkFDRTUoKCAiRlRfU2VsZWN0X1NpemUgKGZvbnQgZHJpdmVyJ3MgYHNlbGVjdF9zaXplJyk6XG4iICkpOwotICAgICAgICBGVF9UUkFDRTUoKCAiICB4IHNjYWxlOiAlZCAoJWYpXG4iLAotICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT54X3NjYWxlLCBtZXRyaWNzLT54X3NjYWxlIC8gNjU1MzYuMCApKTsKLSAgICAgICAgRlRfVFJBQ0U1KCggIiAgeSBzY2FsZTogJWQgKCVmKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+eV9zY2FsZSwgbWV0cmljcy0+eV9zY2FsZSAvIDY1NTM2LjAgKSk7Ci0gICAgICAgIEZUX1RSQUNFNSgoICIgIGFzY2VuZGVyOiAlZlxuIiwgICAgbWV0cmljcy0+YXNjZW5kZXIgLyA2NC4wICkpOwotICAgICAgICBGVF9UUkFDRTUoKCAiICBkZXNjZW5kZXI6ICVmXG4iLCAgIG1ldHJpY3MtPmRlc2NlbmRlciAvIDY0LjAgKSk7Ci0gICAgICAgIEZUX1RSQUNFNSgoICIgIGhlaWdodDogJWZcbiIsICAgICAgbWV0cmljcy0+aGVpZ2h0IC8gNjQuMCApKTsKLSAgICAgICAgRlRfVFJBQ0U1KCggIiAgbWF4IGFkdmFuY2U6ICVmXG4iLCBtZXRyaWNzLT5tYXhfYWR2YW5jZSAvIDY0LjAgKSk7Ci0gICAgICAgIEZUX1RSQUNFNSgoICIgIHggcHBlbTogJWRcbiIsICAgICAgbWV0cmljcy0+eF9wcGVtICkpOwotICAgICAgICBGVF9UUkFDRTUoKCAiICB5IHBwZW06ICVkXG4iLCAgICAgIG1ldHJpY3MtPnlfcHBlbSApKTsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgRlRfU2VsZWN0X01ldHJpY3MoIGZhY2UsIChGVF9VTG9uZylzdHJpa2VfaW5kZXggKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfUmVxdWVzdF9TaXplKCBGVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEgKQotICB7Ci0gICAgRlRfRHJpdmVyX0NsYXNzICBjbGF6ejsKLSAgICBGVF9VTG9uZyAgICAgICAgIHN0cmlrZV9pbmRleDsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIGlmICggIXJlcSB8fCByZXEtPndpZHRoIDwgMCB8fCByZXEtPmhlaWdodCA8IDAgfHwKLSAgICAgICAgIHJlcS0+dHlwZSA+PSBGVF9TSVpFX1JFUVVFU1RfVFlQRV9NQVggKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBjbGF6eiA9IGZhY2UtPmRyaXZlci0+Y2xheno7Ci0KLSAgICBpZiAoIGNsYXp6LT5yZXF1ZXN0X3NpemUgKQotICAgIHsKLSAgICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgICBlcnJvciA9IGNsYXp6LT5yZXF1ZXN0X3NpemUoIGZhY2UtPnNpemUsIHJlcSApOwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgIHsKLSAgICAgICAgRlRfU2l6ZV9NZXRyaWNzKiAgbWV0cmljcyA9ICZmYWNlLT5zaXplLT5tZXRyaWNzOwotCi0KLSAgICAgICAgRlRfVFJBQ0U1KCggIkZUX1JlcXVlc3RfU2l6ZSAoZm9udCBkcml2ZXIncyBgcmVxdWVzdF9zaXplJyk6XG4iICkpOwotICAgICAgICBGVF9UUkFDRTUoKCAiICB4IHNjYWxlOiAlZCAoJWYpXG4iLAotICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT54X3NjYWxlLCBtZXRyaWNzLT54X3NjYWxlIC8gNjU1MzYuMCApKTsKLSAgICAgICAgRlRfVFJBQ0U1KCggIiAgeSBzY2FsZTogJWQgKCVmKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+eV9zY2FsZSwgbWV0cmljcy0+eV9zY2FsZSAvIDY1NTM2LjAgKSk7Ci0gICAgICAgIEZUX1RSQUNFNSgoICIgIGFzY2VuZGVyOiAlZlxuIiwgICAgbWV0cmljcy0+YXNjZW5kZXIgLyA2NC4wICkpOwotICAgICAgICBGVF9UUkFDRTUoKCAiICBkZXNjZW5kZXI6ICVmXG4iLCAgIG1ldHJpY3MtPmRlc2NlbmRlciAvIDY0LjAgKSk7Ci0gICAgICAgIEZUX1RSQUNFNSgoICIgIGhlaWdodDogJWZcbiIsICAgICAgbWV0cmljcy0+aGVpZ2h0IC8gNjQuMCApKTsKLSAgICAgICAgRlRfVFJBQ0U1KCggIiAgbWF4IGFkdmFuY2U6ICVmXG4iLCBtZXRyaWNzLT5tYXhfYWR2YW5jZSAvIDY0LjAgKSk7Ci0gICAgICAgIEZUX1RSQUNFNSgoICIgIHggcHBlbTogJWRcbiIsICAgICAgbWV0cmljcy0+eF9wcGVtICkpOwotICAgICAgICBGVF9UUkFDRTUoKCAiICB5IHBwZW06ICVkXG4iLCAgICAgIG1ldHJpY3MtPnlfcHBlbSApKTsKLSAgICAgIH0KLSNlbmRpZgotCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUaGUgcmVhc29uIHRoYXQgYSBkcml2ZXIgZG9lc24ndCBoYXZlIGByZXF1ZXN0X3NpemUnIGRlZmluZWQgaXMKLSAgICAgKiBlaXRoZXIgdGhhdCB0aGUgc2NhbGluZyBoZXJlIHN1ZmZpY2VzIG9yIHRoYXQgdGhlIHN1cHBvcnRlZCBmb3JtYXRzCi0gICAgICogYXJlIGJpdG1hcC1vbmx5IGFuZCBzaXplIG1hdGNoaW5nIGlzIG5vdCBpbXBsZW1lbnRlZC4KLSAgICAgKgotICAgICAqIEluIHRoZSBsYXR0ZXIgY2FzZSwgYSBzaW1wbGUgc2l6ZSBtYXRjaGluZyBpcyBkb25lLgotICAgICAqLwotICAgIGlmICggIUZUX0lTX1NDQUxBQkxFKCBmYWNlICkgJiYgRlRfSEFTX0ZJWEVEX1NJWkVTKCBmYWNlICkgKQotICAgIHsKLSAgICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgICBlcnJvciA9IEZUX01hdGNoX1NpemUoIGZhY2UsIHJlcSwgMCwgJnN0cmlrZV9pbmRleCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgcmV0dXJuIEZUX1NlbGVjdF9TaXplKCBmYWNlLCAoRlRfSW50KXN0cmlrZV9pbmRleCApOwotICAgIH0KLQotICAgIEZUX1JlcXVlc3RfTWV0cmljcyggZmFjZSwgcmVxICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1NldF9DaGFyX1NpemUoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGNoYXJfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIGNoYXJfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBob3J6X3Jlc29sdXRpb24sCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHZlcnRfcmVzb2x1dGlvbiApCi0gIHsKLSAgICBGVF9TaXplX1JlcXVlc3RSZWMgIHJlcTsKLQotCi0gICAgLyogY2hlY2sgb2YgYGZhY2UnIGRlbGF5ZWQgdG8gYEZUX1JlcXVlc3RfU2l6ZScgKi8KLQotICAgIGlmICggIWNoYXJfd2lkdGggKQotICAgICAgY2hhcl93aWR0aCA9IGNoYXJfaGVpZ2h0OwotICAgIGVsc2UgaWYgKCAhY2hhcl9oZWlnaHQgKQotICAgICAgY2hhcl9oZWlnaHQgPSBjaGFyX3dpZHRoOwotCi0gICAgaWYgKCAhaG9yel9yZXNvbHV0aW9uICkKLSAgICAgIGhvcnpfcmVzb2x1dGlvbiA9IHZlcnRfcmVzb2x1dGlvbjsKLSAgICBlbHNlIGlmICggIXZlcnRfcmVzb2x1dGlvbiApCi0gICAgICB2ZXJ0X3Jlc29sdXRpb24gPSBob3J6X3Jlc29sdXRpb247Ci0KLSAgICBpZiAoIGNoYXJfd2lkdGggIDwgMSAqIDY0ICkKLSAgICAgIGNoYXJfd2lkdGggID0gMSAqIDY0OwotICAgIGlmICggY2hhcl9oZWlnaHQgPCAxICogNjQgKQotICAgICAgY2hhcl9oZWlnaHQgPSAxICogNjQ7Ci0KLSAgICBpZiAoICFob3J6X3Jlc29sdXRpb24gKQotICAgICAgaG9yel9yZXNvbHV0aW9uID0gdmVydF9yZXNvbHV0aW9uID0gNzI7Ci0KLSAgICByZXEudHlwZSAgICAgICAgICAgPSBGVF9TSVpFX1JFUVVFU1RfVFlQRV9OT01JTkFMOwotICAgIHJlcS53aWR0aCAgICAgICAgICA9IGNoYXJfd2lkdGg7Ci0gICAgcmVxLmhlaWdodCAgICAgICAgID0gY2hhcl9oZWlnaHQ7Ci0gICAgcmVxLmhvcmlSZXNvbHV0aW9uID0gaG9yel9yZXNvbHV0aW9uOwotICAgIHJlcS52ZXJ0UmVzb2x1dGlvbiA9IHZlcnRfcmVzb2x1dGlvbjsKLQotICAgIHJldHVybiBGVF9SZXF1ZXN0X1NpemUoIGZhY2UsICZyZXEgKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9TZXRfUGl4ZWxfU2l6ZXMoIEZUX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgcGl4ZWxfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgcGl4ZWxfaGVpZ2h0ICkKLSAgewotICAgIEZUX1NpemVfUmVxdWVzdFJlYyAgcmVxOwotCi0KLSAgICAvKiBjaGVjayBvZiBgZmFjZScgZGVsYXllZCB0byBgRlRfUmVxdWVzdF9TaXplJyAqLwotCi0gICAgaWYgKCBwaXhlbF93aWR0aCA9PSAwICkKLSAgICAgIHBpeGVsX3dpZHRoID0gcGl4ZWxfaGVpZ2h0OwotICAgIGVsc2UgaWYgKCBwaXhlbF9oZWlnaHQgPT0gMCApCi0gICAgICBwaXhlbF9oZWlnaHQgPSBwaXhlbF93aWR0aDsKLQotICAgIGlmICggcGl4ZWxfd2lkdGggIDwgMSApCi0gICAgICBwaXhlbF93aWR0aCAgPSAxOwotICAgIGlmICggcGl4ZWxfaGVpZ2h0IDwgMSApCi0gICAgICBwaXhlbF9oZWlnaHQgPSAxOwotCi0gICAgLyogdXNlIGA+PScgdG8gYXZvaWQgcG90ZW50aWFsIGNvbXBpbGVyIHdhcm5pbmcgb24gMTZiaXQgcGxhdGZvcm1zICovCi0gICAgaWYgKCBwaXhlbF93aWR0aCA+PSAweEZGRkZVICkKLSAgICAgIHBpeGVsX3dpZHRoID0gMHhGRkZGVTsKLSAgICBpZiAoIHBpeGVsX2hlaWdodCA+PSAweEZGRkZVICkKLSAgICAgIHBpeGVsX2hlaWdodCA9IDB4RkZGRlU7Ci0KLSAgICByZXEudHlwZSAgICAgICAgICAgPSBGVF9TSVpFX1JFUVVFU1RfVFlQRV9OT01JTkFMOwotICAgIHJlcS53aWR0aCAgICAgICAgICA9IChGVF9Mb25nKSggcGl4ZWxfd2lkdGggPDwgNiApOwotICAgIHJlcS5oZWlnaHQgICAgICAgICA9IChGVF9Mb25nKSggcGl4ZWxfaGVpZ2h0IDw8IDYgKTsKLSAgICByZXEuaG9yaVJlc29sdXRpb24gPSAwOwotICAgIHJlcS52ZXJ0UmVzb2x1dGlvbiA9IDA7Ci0KLSAgICByZXR1cm4gRlRfUmVxdWVzdF9TaXplKCBmYWNlLCAmcmVxICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2V0X0tlcm5pbmcoIEZUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBsZWZ0X2dseXBoLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgcmlnaHRfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBrZXJuX21vZGUsCi0gICAgICAgICAgICAgICAgICBGVF9WZWN0b3IgICpha2VybmluZyApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX0RyaXZlciAgZHJpdmVyOwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GYWNlX0hhbmRsZSApOwotCi0gICAgaWYgKCAhYWtlcm5pbmcgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBkcml2ZXIgPSBmYWNlLT5kcml2ZXI7Ci0KLSAgICBha2VybmluZy0+eCA9IDA7Ci0gICAgYWtlcm5pbmctPnkgPSAwOwotCi0gICAgaWYgKCBkcml2ZXItPmNsYXp6LT5nZXRfa2VybmluZyApCi0gICAgewotICAgICAgZXJyb3IgPSBkcml2ZXItPmNsYXp6LT5nZXRfa2VybmluZyggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFrZXJuaW5nICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICB7Ci0gICAgICAgIGlmICgga2Vybl9tb2RlICE9IEZUX0tFUk5JTkdfVU5TQ0FMRUQgKQotICAgICAgICB7Ci0gICAgICAgICAgYWtlcm5pbmctPnggPSBGVF9NdWxGaXgoIGFrZXJuaW5nLT54LCBmYWNlLT5zaXplLT5tZXRyaWNzLnhfc2NhbGUgKTsKLSAgICAgICAgICBha2VybmluZy0+eSA9IEZUX011bEZpeCggYWtlcm5pbmctPnksIGZhY2UtPnNpemUtPm1ldHJpY3MueV9zY2FsZSApOwotCi0gICAgICAgICAgaWYgKCBrZXJuX21vZGUgIT0gRlRfS0VSTklOR19VTkZJVFRFRCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfUG9zICBvcmlnX3ggPSBha2VybmluZy0+eDsKLSAgICAgICAgICAgIEZUX1BvcyAgb3JpZ195ID0gYWtlcm5pbmctPnk7Ci0KLQotICAgICAgICAgICAgLyogd2Ugc2NhbGUgZG93biBrZXJuaW5nIHZhbHVlcyBmb3Igc21hbGwgcHBlbSB2YWx1ZXMgKi8KLSAgICAgICAgICAgIC8qIHRvIGF2b2lkIHRoYXQgcm91bmRpbmcgbWFrZXMgdGhlbSB0b28gYmlnLiAgICAgICAgICovCi0gICAgICAgICAgICAvKiBgMjUnIGhhcyBiZWVuIGRldGVybWluZWQgaGV1cmlzdGljYWxseS4gICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCBmYWNlLT5zaXplLT5tZXRyaWNzLnhfcHBlbSA8IDI1ICkKLSAgICAgICAgICAgICAgYWtlcm5pbmctPnggPSBGVF9NdWxEaXYoIG9yaWdfeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnNpemUtPm1ldHJpY3MueF9wcGVtLCAyNSApOwotICAgICAgICAgICAgaWYgKCBmYWNlLT5zaXplLT5tZXRyaWNzLnlfcHBlbSA8IDI1ICkKLSAgICAgICAgICAgICAgYWtlcm5pbmctPnkgPSBGVF9NdWxEaXYoIG9yaWdfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnNpemUtPm1ldHJpY3MueV9wcGVtLCAyNSApOwotCi0gICAgICAgICAgICBha2VybmluZy0+eCA9IEZUX1BJWF9ST1VORCggYWtlcm5pbmctPnggKTsKLSAgICAgICAgICAgIGFrZXJuaW5nLT55ID0gRlRfUElYX1JPVU5EKCBha2VybmluZy0+eSApOwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfUG9zICBvcmlnX3hfcm91bmRlZCA9IEZUX1BJWF9ST1VORCggb3JpZ194ICk7Ci0gICAgICAgICAgICAgIEZUX1BvcyAgb3JpZ195X3JvdW5kZWQgPSBGVF9QSVhfUk9VTkQoIG9yaWdfeSApOwotCi0KLSAgICAgICAgICAgICAgaWYgKCBha2VybmluZy0+eCAhPSBvcmlnX3hfcm91bmRlZCB8fAotICAgICAgICAgICAgICAgICAgIGFrZXJuaW5nLT55ICE9IG9yaWdfeV9yb3VuZGVkICkKLSAgICAgICAgICAgICAgICBGVF9UUkFDRTUoKCAiRlRfR2V0X0tlcm5pbmc6IGhvcml6b250YWwga2VybmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICglZCwgJWQpIHNjYWxlZCBkb3duIHRvICglZCwgJWQpIHBpeGVsc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnX3hfcm91bmRlZCAvIDY0LCBvcmlnX3lfcm91bmRlZCAvIDY0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFrZXJuaW5nLT54IC8gNjQsIGFrZXJuaW5nLT55IC8gNjQgKSk7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2V0X1RyYWNrX0tlcm5pbmcoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgcG9pbnRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgZGVncmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBha2VybmluZyApCi0gIHsKLSAgICBGVF9TZXJ2aWNlX0tlcm5pbmcgIHNlcnZpY2U7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIGlmICggIWFrZXJuaW5nICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHNlcnZpY2UsIEtFUk5JTkcgKTsKLSAgICBpZiAoICFzZXJ2aWNlICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0KLSAgICBlcnJvciA9IHNlcnZpY2UtPmdldF90cmFjayggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVncmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBha2VybmluZyApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1NlbGVjdF9DaGFybWFwKCBGVF9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0VuY29kaW5nICBlbmNvZGluZyApCi0gIHsKLSAgICBGVF9DaGFyTWFwKiAgY3VyOwotICAgIEZUX0NoYXJNYXAqICBsaW1pdDsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIGlmICggZW5jb2RpbmcgPT0gRlRfRU5DT0RJTkdfTk9ORSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIC8qIEZUX0VOQ09ESU5HX1VOSUNPREUgaXMgc3BlY2lhbC4gIFdlIHRyeSB0byBmaW5kIHRoZSBgYmVzdCcgVW5pY29kZSAqLwotICAgIC8qIGNoYXJtYXAgYXZhaWxhYmxlLCBpLmUuLCBvbmUgd2l0aCBVQ1MtNCBjaGFyYWN0ZXJzLCBpZiBwb3NzaWJsZS4gICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFRoaXMgaXMgZG9uZSBieSBmaW5kX3VuaWNvZGVfY2hhcm1hcCgpIGFib3ZlLCB0byBzaGFyZSBjb2RlLiAgICAgICAqLwotICAgIGlmICggZW5jb2RpbmcgPT0gRlRfRU5DT0RJTkdfVU5JQ09ERSApCi0gICAgICByZXR1cm4gZmluZF91bmljb2RlX2NoYXJtYXAoIGZhY2UgKTsKLQotICAgIGN1ciA9IGZhY2UtPmNoYXJtYXBzOwotICAgIGlmICggIWN1ciApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQ2hhck1hcF9IYW5kbGUgKTsKLQotICAgIGxpbWl0ID0gY3VyICsgZmFjZS0+bnVtX2NoYXJtYXBzOwotCi0gICAgZm9yICggOyBjdXIgPCBsaW1pdDsgY3VyKysgKQotICAgIHsKLSAgICAgIGlmICggY3VyWzBdLT5lbmNvZGluZyA9PSBlbmNvZGluZyApCi0gICAgICB7Ci0gICAgICAgIGZhY2UtPmNoYXJtYXAgPSBjdXJbMF07Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1NldF9DaGFybWFwKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfQ2hhck1hcCAgY2hhcm1hcCApCi0gIHsKLSAgICBGVF9DaGFyTWFwKiAgY3VyOwotICAgIEZUX0NoYXJNYXAqICBsaW1pdDsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIGN1ciA9IGZhY2UtPmNoYXJtYXBzOwotICAgIGlmICggIWN1ciB8fCAhY2hhcm1hcCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQ2hhck1hcF9IYW5kbGUgKTsKLQotICAgIGlmICggRlRfR2V0X0NNYXBfRm9ybWF0KCBjaGFybWFwICkgPT0gMTQgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBsaW1pdCA9IGN1ciArIGZhY2UtPm51bV9jaGFybWFwczsKLQotICAgIGZvciAoIDsgY3VyIDwgbGltaXQ7IGN1cisrICkKLSAgICB7Ci0gICAgICBpZiAoIGN1clswXSA9PSBjaGFybWFwICkKLSAgICAgIHsKLSAgICAgICAgZmFjZS0+Y2hhcm1hcCA9IGN1clswXTsKLSAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfSW50ICkKLSAgRlRfR2V0X0NoYXJtYXBfSW5kZXgoIEZUX0NoYXJNYXAgIGNoYXJtYXAgKQotICB7Ci0gICAgRlRfSW50ICBpOwotCi0KLSAgICBpZiAoICFjaGFybWFwIHx8ICFjaGFybWFwLT5mYWNlICkKLSAgICAgIHJldHVybiAtMTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgY2hhcm1hcC0+ZmFjZS0+bnVtX2NoYXJtYXBzOyBpKysgKQotICAgICAgaWYgKCBjaGFybWFwLT5mYWNlLT5jaGFybWFwc1tpXSA9PSBjaGFybWFwICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBGVF9BU1NFUlQoIGkgPCBjaGFybWFwLT5mYWNlLT5udW1fY2hhcm1hcHMgKTsKLQotICAgIHJldHVybiBpOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9jbWFwX2RvbmVfaW50ZXJuYWwoIEZUX0NNYXAgIGNtYXAgKQotICB7Ci0gICAgRlRfQ01hcF9DbGFzcyAgY2xhenogID0gY21hcC0+Y2xheno7Ci0gICAgRlRfRmFjZSAgICAgICAgZmFjZSAgID0gY21hcC0+Y2hhcm1hcC5mYWNlOwotICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSA9IEZUX0ZBQ0VfTUVNT1JZKCBmYWNlICk7Ci0KLQotICAgIGlmICggY2xhenotPmRvbmUgKQotICAgICAgY2xhenotPmRvbmUoIGNtYXAgKTsKLQotICAgIEZUX0ZSRUUoIGNtYXAgKTsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9DTWFwX0RvbmUoIEZUX0NNYXAgIGNtYXAgKQotICB7Ci0gICAgaWYgKCBjbWFwICkKLSAgICB7Ci0gICAgICBGVF9GYWNlICAgIGZhY2UgICA9IGNtYXAtPmNoYXJtYXAuZmFjZTsKLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gRlRfRkFDRV9NRU1PUlkoIGZhY2UgKTsKLSAgICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgICBGVF9JbnQgICAgIGksIGo7Ci0KLQotICAgICAgZm9yICggaSA9IDA7IGkgPCBmYWNlLT5udW1fY2hhcm1hcHM7IGkrKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggKEZUX0NNYXApZmFjZS0+Y2hhcm1hcHNbaV0gPT0gY21hcCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9DaGFyTWFwICBsYXN0X2NoYXJtYXAgPSBmYWNlLT5jaGFybWFwc1tmYWNlLT5udW1fY2hhcm1hcHMgLSAxXTsKLQotCi0gICAgICAgICAgaWYgKCBGVF9SRU5FV19BUlJBWSggZmFjZS0+Y2hhcm1hcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+bnVtX2NoYXJtYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV9jaGFybWFwcyAtIDEgKSApCi0gICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAvKiByZW1vdmUgaXQgZnJvbSBvdXIgbGlzdCBvZiBjaGFybWFwcyAqLwotICAgICAgICAgIGZvciAoIGogPSBpICsgMTsgaiA8IGZhY2UtPm51bV9jaGFybWFwczsgaisrICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGogPT0gZmFjZS0+bnVtX2NoYXJtYXBzIC0gMSApCi0gICAgICAgICAgICAgIGZhY2UtPmNoYXJtYXBzW2ogLSAxXSA9IGxhc3RfY2hhcm1hcDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZmFjZS0+Y2hhcm1hcHNbaiAtIDFdID0gZmFjZS0+Y2hhcm1hcHNbal07Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZmFjZS0+bnVtX2NoYXJtYXBzLS07Ci0KLSAgICAgICAgICBpZiAoIChGVF9DTWFwKWZhY2UtPmNoYXJtYXAgPT0gY21hcCApCi0gICAgICAgICAgICBmYWNlLT5jaGFybWFwID0gTlVMTDsKLQotICAgICAgICAgIGZ0X2NtYXBfZG9uZV9pbnRlcm5hbCggY21hcCApOwotCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX0NNYXBfTmV3KCBGVF9DTWFwX0NsYXNzICBjbGF6eiwKLSAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICAgIGluaXRfZGF0YSwKLSAgICAgICAgICAgICAgIEZUX0NoYXJNYXAgICAgIGNoYXJtYXAsCi0gICAgICAgICAgICAgICBGVF9DTWFwICAgICAgICphY21hcCApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX0ZhY2UgICAgZmFjZTsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLSAgICBGVF9DTWFwICAgIGNtYXAgPSBOVUxMOwotCi0KLSAgICBpZiAoIGNsYXp6ID09IE5VTEwgfHwgY2hhcm1hcCA9PSBOVUxMIHx8IGNoYXJtYXAtPmZhY2UgPT0gTlVMTCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGZhY2UgICA9IGNoYXJtYXAtPmZhY2U7Ci0gICAgbWVtb3J5ID0gRlRfRkFDRV9NRU1PUlkoIGZhY2UgKTsKLQotICAgIGlmICggIUZUX0FMTE9DKCBjbWFwLCBjbGF6ei0+c2l6ZSApICkKLSAgICB7Ci0gICAgICBjbWFwLT5jaGFybWFwID0gKmNoYXJtYXA7Ci0gICAgICBjbWFwLT5jbGF6eiAgID0gY2xheno7Ci0KLSAgICAgIGlmICggY2xhenotPmluaXQgKQotICAgICAgewotICAgICAgICBlcnJvciA9IGNsYXp6LT5pbml0KCBjbWFwLCBpbml0X2RhdGEgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotCi0gICAgICAvKiBhZGQgaXQgdG8gb3VyIGxpc3Qgb2YgY2hhcm1hcHMgKi8KLSAgICAgIGlmICggRlRfUkVORVdfQVJSQVkoIGZhY2UtPmNoYXJtYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+bnVtX2NoYXJtYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+bnVtX2NoYXJtYXBzICsgMSApICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBmYWNlLT5jaGFybWFwc1tmYWNlLT5udW1fY2hhcm1hcHMrK10gPSAoRlRfQ2hhck1hcCljbWFwOwotICAgIH0KLQotICBFeGl0OgotICAgIGlmICggYWNtYXAgKQotICAgICAgKmFjbWFwID0gY21hcDsKLQotICAgIHJldHVybiBlcnJvcjsKLQotICBGYWlsOgotICAgIGZ0X2NtYXBfZG9uZV9pbnRlcm5hbCggY21hcCApOwotICAgIGNtYXAgPSBOVUxMOwotICAgIGdvdG8gRXhpdDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfVUludCApCi0gIEZUX0dldF9DaGFyX0luZGV4KCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICBjaGFyY29kZSApCi0gIHsKLSAgICBGVF9VSW50ICByZXN1bHQgPSAwOwotCi0KLSAgICBpZiAoIGZhY2UgJiYgZmFjZS0+Y2hhcm1hcCApCi0gICAgewotICAgICAgRlRfQ01hcCAgY21hcCA9IEZUX0NNQVAoIGZhY2UtPmNoYXJtYXAgKTsKLQotCi0gICAgICBpZiAoIGNoYXJjb2RlID4gMHhGRkZGRkZGRlVMICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UxKCggIkZUX0dldF9DaGFyX0luZGV4OiB0b28gbGFyZ2UgY2hhcmNvZGUiICkpOwotICAgICAgICBGVF9UUkFDRTEoKCAiIDB4JXggaXMgdHJ1bmNhdGVkXG4iLCBjaGFyY29kZSApKTsKLSAgICAgIH0KLQotICAgICAgcmVzdWx0ID0gY21hcC0+Y2xhenotPmNoYXJfaW5kZXgoIGNtYXAsIChGVF9VSW50MzIpY2hhcmNvZGUgKTsKLSAgICAgIGlmICggcmVzdWx0ID49IChGVF9VSW50KWZhY2UtPm51bV9nbHlwaHMgKQotICAgICAgICByZXN1bHQgPSAwOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX1VMb25nICkKLSAgRlRfR2V0X0ZpcnN0X0NoYXIoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgKmFnaW5kZXggKQotICB7Ci0gICAgRlRfVUxvbmcgIHJlc3VsdCA9IDA7Ci0gICAgRlRfVUludCAgIGdpbmRleCA9IDA7Ci0KLQotICAgIC8qIG9ubHkgZG8gc29tZXRoaW5nIGlmIHdlIGhhdmUgYSBjaGFybWFwLCBhbmQgd2UgaGF2ZSBnbHlwaHMgYXQgYWxsICovCi0gICAgaWYgKCBmYWNlICYmIGZhY2UtPmNoYXJtYXAgJiYgZmFjZS0+bnVtX2dseXBocyApCi0gICAgewotICAgICAgZ2luZGV4ID0gRlRfR2V0X0NoYXJfSW5kZXgoIGZhY2UsIDAgKTsKLSAgICAgIGlmICggZ2luZGV4ID09IDAgKQotICAgICAgICByZXN1bHQgPSBGVF9HZXRfTmV4dF9DaGFyKCBmYWNlLCAwLCAmZ2luZGV4ICk7Ci0gICAgfQotCi0gICAgaWYgKCBhZ2luZGV4ICkKLSAgICAgICphZ2luZGV4ID0gZ2luZGV4OwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfVUxvbmcgKQotICBGVF9HZXRfTmV4dF9DaGFyKCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIGNoYXJjb2RlLAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAqYWdpbmRleCApCi0gIHsKLSAgICBGVF9VTG9uZyAgcmVzdWx0ID0gMDsKLSAgICBGVF9VSW50ICAgZ2luZGV4ID0gMDsKLQotCi0gICAgaWYgKCBmYWNlICYmIGZhY2UtPmNoYXJtYXAgJiYgZmFjZS0+bnVtX2dseXBocyApCi0gICAgewotICAgICAgRlRfVUludDMyICBjb2RlID0gKEZUX1VJbnQzMiljaGFyY29kZTsKLSAgICAgIEZUX0NNYXAgICAgY21hcCA9IEZUX0NNQVAoIGZhY2UtPmNoYXJtYXAgKTsKLQotCi0gICAgICBkbwotICAgICAgewotICAgICAgICBnaW5kZXggPSBjbWFwLT5jbGF6ei0+Y2hhcl9uZXh0KCBjbWFwLCAmY29kZSApOwotCi0gICAgICB9IHdoaWxlICggZ2luZGV4ID49IChGVF9VSW50KWZhY2UtPm51bV9nbHlwaHMgKTsKLQotICAgICAgcmVzdWx0ID0gKCBnaW5kZXggPT0gMCApID8gMCA6IGNvZGU7Ci0gICAgfQotCi0gICAgaWYgKCBhZ2luZGV4ICkKLSAgICAgICphZ2luZGV4ID0gZ2luZGV4OwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfVUludCApCi0gIEZUX0ZhY2VfR2V0Q2hhclZhcmlhbnRJbmRleCggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIGNoYXJjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICB2YXJpYW50U2VsZWN0b3IgKQotICB7Ci0gICAgRlRfVUludCAgcmVzdWx0ID0gMDsKLQotCi0gICAgaWYgKCBmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBmYWNlLT5jaGFybWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBmYWNlLT5jaGFybWFwLT5lbmNvZGluZyA9PSBGVF9FTkNPRElOR19VTklDT0RFICkKLSAgICB7Ci0gICAgICBGVF9DaGFyTWFwICBjaGFybWFwID0gZmluZF92YXJpYW50X3NlbGVjdG9yX2NoYXJtYXAoIGZhY2UgKTsKLSAgICAgIEZUX0NNYXAgICAgIHVjbWFwID0gRlRfQ01BUCggZmFjZS0+Y2hhcm1hcCApOwotCi0KLSAgICAgIGlmICggY2hhcm1hcCAhPSBOVUxMICkKLSAgICAgIHsKLSAgICAgICAgRlRfQ01hcCAgdmNtYXAgPSBGVF9DTUFQKCBjaGFybWFwICk7Ci0KLQotICAgICAgICBpZiAoIGNoYXJjb2RlID4gMHhGRkZGRkZGRlVMICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMSgoICJGVF9HZXRfQ2hhcl9JbmRleDogdG9vIGxhcmdlIGNoYXJjb2RlIiApKTsKLSAgICAgICAgICBGVF9UUkFDRTEoKCAiIDB4JXggaXMgdHJ1bmNhdGVkXG4iLCBjaGFyY29kZSApKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIHZhcmlhbnRTZWxlY3RvciA+IDB4RkZGRkZGRkZVTCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTEoKCAiRlRfR2V0X0NoYXJfSW5kZXg6IHRvbyBsYXJnZSB2YXJpYW50U2VsZWN0b3IiICkpOwotICAgICAgICAgIEZUX1RSQUNFMSgoICIgMHgleCBpcyB0cnVuY2F0ZWRcbiIsIHZhcmlhbnRTZWxlY3RvciApKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdCA9IHZjbWFwLT5jbGF6ei0+Y2hhcl92YXJfaW5kZXgoIHZjbWFwLCB1Y21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQzMiljaGFyY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQzMil2YXJpYW50U2VsZWN0b3IgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9JbnQgKQotICBGVF9GYWNlX0dldENoYXJWYXJpYW50SXNEZWZhdWx0KCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIGNoYXJjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgdmFyaWFudFNlbGVjdG9yICkKLSAgewotICAgIEZUX0ludCAgcmVzdWx0ID0gLTE7Ci0KLQotICAgIGlmICggZmFjZSApCi0gICAgewotICAgICAgRlRfQ2hhck1hcCAgY2hhcm1hcCA9IGZpbmRfdmFyaWFudF9zZWxlY3Rvcl9jaGFybWFwKCBmYWNlICk7Ci0KLQotICAgICAgaWYgKCBjaGFybWFwICE9IE5VTEwgKQotICAgICAgewotICAgICAgICBGVF9DTWFwICB2Y21hcCA9IEZUX0NNQVAoIGNoYXJtYXAgKTsKLQotCi0gICAgICAgIGlmICggY2hhcmNvZGUgPiAweEZGRkZGRkZGVUwgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0UxKCggIkZUX0dldF9DaGFyX0luZGV4OiB0b28gbGFyZ2UgY2hhcmNvZGUiICkpOwotICAgICAgICAgIEZUX1RSQUNFMSgoICIgMHgleCBpcyB0cnVuY2F0ZWRcbiIsIGNoYXJjb2RlICkpOwotICAgICAgICB9Ci0gICAgICAgIGlmICggdmFyaWFudFNlbGVjdG9yID4gMHhGRkZGRkZGRlVMICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMSgoICJGVF9HZXRfQ2hhcl9JbmRleDogdG9vIGxhcmdlIHZhcmlhbnRTZWxlY3RvciIgKSk7Ci0gICAgICAgICAgRlRfVFJBQ0UxKCggIiAweCV4IGlzIHRydW5jYXRlZFxuIiwgdmFyaWFudFNlbGVjdG9yICkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0ID0gdmNtYXAtPmNsYXp6LT5jaGFyX3Zhcl9kZWZhdWx0KCB2Y21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludDMyKWNoYXJjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50MzIpdmFyaWFudFNlbGVjdG9yICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfVUludDMyKiApCi0gIEZUX0ZhY2VfR2V0VmFyaWFudFNlbGVjdG9ycyggRlRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBGVF9VSW50MzIgICpyZXN1bHQgPSBOVUxMOwotCi0KLSAgICBpZiAoIGZhY2UgKQotICAgIHsKLSAgICAgIEZUX0NoYXJNYXAgIGNoYXJtYXAgPSBmaW5kX3ZhcmlhbnRfc2VsZWN0b3JfY2hhcm1hcCggZmFjZSApOwotCi0KLSAgICAgIGlmICggY2hhcm1hcCAhPSBOVUxMICkKLSAgICAgIHsKLSAgICAgICAgRlRfQ01hcCAgICB2Y21hcCAgPSBGVF9DTUFQKCBjaGFybWFwICk7Ci0gICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gRlRfRkFDRV9NRU1PUlkoIGZhY2UgKTsKLQotCi0gICAgICAgIHJlc3VsdCA9IHZjbWFwLT5jbGF6ei0+dmFyaWFudF9saXN0KCB2Y21hcCwgbWVtb3J5ICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfVUludDMyKiApCi0gIEZUX0ZhY2VfR2V0VmFyaWFudHNPZkNoYXIoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgY2hhcmNvZGUgKQotICB7Ci0gICAgRlRfVUludDMyICAqcmVzdWx0ID0gTlVMTDsKLQotCi0gICAgaWYgKCBmYWNlICkKLSAgICB7Ci0gICAgICBGVF9DaGFyTWFwICBjaGFybWFwID0gZmluZF92YXJpYW50X3NlbGVjdG9yX2NoYXJtYXAoIGZhY2UgKTsKLQotCi0gICAgICBpZiAoIGNoYXJtYXAgIT0gTlVMTCApCi0gICAgICB7Ci0gICAgICAgIEZUX0NNYXAgICAgdmNtYXAgID0gRlRfQ01BUCggY2hhcm1hcCApOwotICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IEZUX0ZBQ0VfTUVNT1JZKCBmYWNlICk7Ci0KLQotICAgICAgICBpZiAoIGNoYXJjb2RlID4gMHhGRkZGRkZGRlVMICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMSgoICJGVF9HZXRfQ2hhcl9JbmRleDogdG9vIGxhcmdlIGNoYXJjb2RlIiApKTsKLSAgICAgICAgICBGVF9UUkFDRTEoKCAiIDB4JXggaXMgdHJ1bmNhdGVkXG4iLCBjaGFyY29kZSApKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdCA9IHZjbWFwLT5jbGF6ei0+Y2hhcnZhcmlhbnRfbGlzdCggdmNtYXAsIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludDMyKWNoYXJjb2RlICk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX1VJbnQzMiogKQotICBGVF9GYWNlX0dldENoYXJzT2ZWYXJpYW50KCBGVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHZhcmlhbnRTZWxlY3RvciApCi0gIHsKLSAgICBGVF9VSW50MzIgICpyZXN1bHQgPSBOVUxMOwotCi0KLSAgICBpZiAoIGZhY2UgKQotICAgIHsKLSAgICAgIEZUX0NoYXJNYXAgIGNoYXJtYXAgPSBmaW5kX3ZhcmlhbnRfc2VsZWN0b3JfY2hhcm1hcCggZmFjZSApOwotCi0KLSAgICAgIGlmICggY2hhcm1hcCAhPSBOVUxMICkKLSAgICAgIHsKLSAgICAgICAgRlRfQ01hcCAgICB2Y21hcCAgPSBGVF9DTUFQKCBjaGFybWFwICk7Ci0gICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gRlRfRkFDRV9NRU1PUlkoIGZhY2UgKTsKLQotCi0gICAgICAgIGlmICggdmFyaWFudFNlbGVjdG9yID4gMHhGRkZGRkZGRlVMICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMSgoICJGVF9HZXRfQ2hhcl9JbmRleDogdG9vIGxhcmdlIHZhcmlhbnRTZWxlY3RvciIgKSk7Ci0gICAgICAgICAgRlRfVFJBQ0UxKCggIiAweCV4IGlzIHRydW5jYXRlZFxuIiwgdmFyaWFudFNlbGVjdG9yICkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0ID0gdmNtYXAtPmNsYXp6LT52YXJpYW50Y2hhcl9saXN0KCB2Y21hcCwgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50MzIpdmFyaWFudFNlbGVjdG9yICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfVUludCApCi0gIEZUX0dldF9OYW1lX0luZGV4KCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyaW5nKiAgZ2x5cGhfbmFtZSApCi0gIHsKLSAgICBGVF9VSW50ICByZXN1bHQgPSAwOwotCi0KLSAgICBpZiAoIGZhY2UgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBGVF9IQVNfR0xZUEhfTkFNRVMoIGZhY2UgKSAmJgotICAgICAgICAgZ2x5cGhfbmFtZSAgICAgICAgICAgICAgICAgKQotICAgIHsKLSAgICAgIEZUX1NlcnZpY2VfR2x5cGhEaWN0ICBzZXJ2aWNlOwotCi0KLSAgICAgIEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xZUEhfRElDVCApOwotCi0gICAgICBpZiAoIHNlcnZpY2UgJiYgc2VydmljZS0+bmFtZV9pbmRleCApCi0gICAgICAgIHJlc3VsdCA9IHNlcnZpY2UtPm5hbWVfaW5kZXgoIGZhY2UsIGdseXBoX25hbWUgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZyZWV0eXBlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldF9HbHlwaF9OYW1lKCBGVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBidWZmZXJfbWF4ICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICAgICAgICBlcnJvcjsKLSAgICBGVF9TZXJ2aWNlX0dseXBoRGljdCAgc2VydmljZTsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIGlmICggIWJ1ZmZlciB8fCBidWZmZXJfbWF4ID09IDAgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICAvKiBjbGVhbiB1cCBidWZmZXIgKi8KLSAgICAoKEZUX0J5dGUqKWJ1ZmZlcilbMF0gPSAnXDAnOwotCi0gICAgaWYgKCAoRlRfTG9uZylnbHlwaF9pbmRleCA+PSBmYWNlLT5udW1fZ2x5cGhzICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9HbHlwaF9JbmRleCApOwotCi0gICAgaWYgKCAhRlRfSEFTX0dMWVBIX05BTUVTKCBmYWNlICkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFKCBmYWNlLCBzZXJ2aWNlLCBHTFlQSF9ESUNUICk7Ci0gICAgaWYgKCBzZXJ2aWNlICYmIHNlcnZpY2UtPmdldF9uYW1lICkKLSAgICAgIGVycm9yID0gc2VydmljZS0+Z2V0X25hbWUoIGZhY2UsIGdseXBoX2luZGV4LCBidWZmZXIsIGJ1ZmZlcl9tYXggKTsKLSAgICBlbHNlCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIGNvbnN0IGNoYXIqICkKLSAgRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZSggRlRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBjb25zdCBjaGFyKiAgcmVzdWx0ID0gTlVMTDsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoICFyZXN1bHQgKQotICAgIHsKLSAgICAgIEZUX1NlcnZpY2VfUHNGb250TmFtZSAgc2VydmljZTsKLQotCi0gICAgICBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFKCBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPU1RTQ1JJUFRfRk9OVF9OQU1FICk7Ci0KLSAgICAgIGlmICggc2VydmljZSAmJiBzZXJ2aWNlLT5nZXRfcHNfZm9udF9uYW1lICkKLSAgICAgICAgcmVzdWx0ID0gc2VydmljZS0+Z2V0X3BzX2ZvbnRfbmFtZSggZmFjZSApOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gdHR0YWJsZXMuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQqICkKLSAgRlRfR2V0X1NmbnRfVGFibGUoIEZUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU2ZudF9UYWcgIHRhZyApCi0gIHsKLSAgICB2b2lkKiAgICAgICAgICAgICAgICAgIHRhYmxlID0gTlVMTDsKLSAgICBGVF9TZXJ2aWNlX1NGTlRfVGFibGUgIHNlcnZpY2U7Ci0KLQotICAgIGlmICggZmFjZSAmJiBGVF9JU19TRk5UKCBmYWNlICkgKQotICAgIHsKLSAgICAgIEZUX0ZBQ0VfRklORF9TRVJWSUNFKCBmYWNlLCBzZXJ2aWNlLCBTRk5UX1RBQkxFICk7Ci0gICAgICBpZiAoIHNlcnZpY2UgIT0gTlVMTCApCi0gICAgICAgIHRhYmxlID0gc2VydmljZS0+Z2V0X3RhYmxlKCBmYWNlLCB0YWcgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdGFibGU7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gdHR0YWJsZXMuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfTG9hZF9TZm50X1RhYmxlKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICBsZW5ndGggKQotICB7Ci0gICAgRlRfU2VydmljZV9TRk5UX1RhYmxlICBzZXJ2aWNlOwotCi0KLSAgICBpZiAoICFmYWNlIHx8ICFGVF9JU19TRk5UKCBmYWNlICkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICBGVF9GQUNFX0ZJTkRfU0VSVklDRSggZmFjZSwgc2VydmljZSwgU0ZOVF9UQUJMRSApOwotICAgIGlmICggc2VydmljZSA9PSBOVUxMICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0KLSAgICByZXR1cm4gc2VydmljZS0+bG9hZF90YWJsZSggZmFjZSwgdGFnLCBvZmZzZXQsIGJ1ZmZlciwgbGVuZ3RoICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gdHR0YWJsZXMuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU2ZudF9UYWJsZV9JbmZvKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICB0YWJsZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgKnRhZywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgKmxlbmd0aCApCi0gIHsKLSAgICBGVF9TZXJ2aWNlX1NGTlRfVGFibGUgIHNlcnZpY2U7Ci0gICAgRlRfVUxvbmcgICAgICAgICAgICAgICBvZmZzZXQ7Ci0KLQotICAgIC8qIHRlc3QgZm9yIHZhbGlkIGBsZW5ndGgnIGRlbGF5ZWQgdG8gYHNlcnZpY2UtPnRhYmxlX2luZm8nICovCi0KLSAgICBpZiAoICFmYWNlIHx8ICFGVF9JU19TRk5UKCBmYWNlICkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICBGVF9GQUNFX0ZJTkRfU0VSVklDRSggZmFjZSwgc2VydmljZSwgU0ZOVF9UQUJMRSApOwotICAgIGlmICggc2VydmljZSA9PSBOVUxMICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0KLSAgICByZXR1cm4gc2VydmljZS0+dGFibGVfaW5mbyggZmFjZSwgdGFibGVfaW5kZXgsIHRhZywgJm9mZnNldCwgbGVuZ3RoICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gdHR0YWJsZXMuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX1VMb25nICkKLSAgRlRfR2V0X0NNYXBfTGFuZ3VhZ2VfSUQoIEZUX0NoYXJNYXAgIGNoYXJtYXAgKQotICB7Ci0gICAgRlRfU2VydmljZV9UVENNYXBzICBzZXJ2aWNlOwotICAgIEZUX0ZhY2UgICAgICAgICAgICAgZmFjZTsKLSAgICBUVF9DTWFwSW5mbyAgICAgICAgIGNtYXBfaW5mbzsKLQotCi0gICAgaWYgKCAhY2hhcm1hcCB8fCAhY2hhcm1hcC0+ZmFjZSApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGZhY2UgPSBjaGFybWFwLT5mYWNlOwotICAgIEZUX0ZBQ0VfRklORF9TRVJWSUNFKCBmYWNlLCBzZXJ2aWNlLCBUVF9DTUFQICk7Ci0gICAgaWYgKCBzZXJ2aWNlID09IE5VTEwgKQotICAgICAgcmV0dXJuIDA7Ci0gICAgaWYgKCBzZXJ2aWNlLT5nZXRfY21hcF9pbmZvKCBjaGFybWFwLCAmY21hcF9pbmZvICkpCi0gICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiBjbWFwX2luZm8ubGFuZ3VhZ2U7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gdHR0YWJsZXMuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0xvbmcgKQotICBGVF9HZXRfQ01hcF9Gb3JtYXQoIEZUX0NoYXJNYXAgIGNoYXJtYXAgKQotICB7Ci0gICAgRlRfU2VydmljZV9UVENNYXBzICBzZXJ2aWNlOwotICAgIEZUX0ZhY2UgICAgICAgICAgICAgZmFjZTsKLSAgICBUVF9DTWFwSW5mbyAgICAgICAgIGNtYXBfaW5mbzsKLQotCi0gICAgaWYgKCAhY2hhcm1hcCB8fCAhY2hhcm1hcC0+ZmFjZSApCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgICBmYWNlID0gY2hhcm1hcC0+ZmFjZTsKLSAgICBGVF9GQUNFX0ZJTkRfU0VSVklDRSggZmFjZSwgc2VydmljZSwgVFRfQ01BUCApOwotICAgIGlmICggc2VydmljZSA9PSBOVUxMICkKLSAgICAgIHJldHVybiAtMTsKLSAgICBpZiAoIHNlcnZpY2UtPmdldF9jbWFwX2luZm8oIGNoYXJtYXAsICZjbWFwX2luZm8gKSkKLSAgICAgIHJldHVybiAtMTsKLQotICAgIHJldHVybiBjbWFwX2luZm8uZm9ybWF0OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c2l6ZXMuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfQWN0aXZhdGVfU2l6ZSggRlRfU2l6ZSAgc2l6ZSApCi0gIHsKLSAgICBGVF9GYWNlICBmYWNlOwotCi0KLSAgICBpZiAoICFzaXplICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9TaXplX0hhbmRsZSApOwotCi0gICAgZmFjZSA9IHNpemUtPmZhY2U7Ci0gICAgaWYgKCAhZmFjZSB8fCAhZmFjZS0+ZHJpdmVyICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GYWNlX0hhbmRsZSApOwotCi0gICAgLyogd2UgZG9uJ3QgbmVlZCBhbnl0aGluZyBtb3JlIGNvbXBsZXggdGhhbiB0aGF0OyBhbGwgc2l6ZSBvYmplY3RzICovCi0gICAgLyogYXJlIGFscmVhZHkgbGlzdGVkIGJ5IHRoZSBmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZmFjZS0+c2l6ZSA9IHNpemU7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgUiBFIE4gRCBFIFIgRSBSIFMgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogbG9va3VwIGEgcmVuZGVyZXIgYnkgZ2x5cGggZm9ybWF0IGluIHRoZSBsaWJyYXJ5J3MgbGlzdCAqLwotICBGVF9CQVNFX0RFRiggRlRfUmVuZGVyZXIgKQotICBGVF9Mb29rdXBfUmVuZGVyZXIoIEZUX0xpYnJhcnkgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaF9Gb3JtYXQgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9MaXN0Tm9kZSogICAgIG5vZGUgKQotICB7Ci0gICAgRlRfTGlzdE5vZGUgIGN1cjsKLSAgICBGVF9SZW5kZXJlciAgcmVzdWx0ID0gTlVMTDsKLQotCi0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBjdXIgPSBsaWJyYXJ5LT5yZW5kZXJlcnMuaGVhZDsKLQotICAgIGlmICggbm9kZSApCi0gICAgewotICAgICAgaWYgKCAqbm9kZSApCi0gICAgICAgIGN1ciA9ICgqbm9kZSktPm5leHQ7Ci0gICAgICAqbm9kZSA9IE5VTEw7Ci0gICAgfQotCi0gICAgd2hpbGUgKCBjdXIgKQotICAgIHsKLSAgICAgIEZUX1JlbmRlcmVyICByZW5kZXJlciA9IEZUX1JFTkRFUkVSKCBjdXItPmRhdGEgKTsKLQotCi0gICAgICBpZiAoIHJlbmRlcmVyLT5nbHlwaF9mb3JtYXQgPT0gZm9ybWF0ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBub2RlICkKLSAgICAgICAgICAqbm9kZSA9IGN1cjsKLQotICAgICAgICByZXN1bHQgPSByZW5kZXJlcjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjdXIgPSBjdXItPm5leHQ7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1JlbmRlcmVyCi0gIGZ0X2xvb2t1cF9nbHlwaF9yZW5kZXJlciggRlRfR2x5cGhTbG90ICBzbG90ICkKLSAgewotICAgIEZUX0ZhY2UgICAgICBmYWNlICAgID0gc2xvdC0+ZmFjZTsKLSAgICBGVF9MaWJyYXJ5ICAgbGlicmFyeSA9IEZUX0ZBQ0VfTElCUkFSWSggZmFjZSApOwotICAgIEZUX1JlbmRlcmVyICByZXN1bHQgID0gbGlicmFyeS0+Y3VyX3JlbmRlcmVyOwotCi0KLSAgICBpZiAoICFyZXN1bHQgfHwgcmVzdWx0LT5nbHlwaF9mb3JtYXQgIT0gc2xvdC0+Zm9ybWF0ICkKLSAgICAgIHJlc3VsdCA9IEZUX0xvb2t1cF9SZW5kZXJlciggbGlicmFyeSwgc2xvdC0+Zm9ybWF0LCAwICk7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9zZXRfY3VycmVudF9yZW5kZXJlciggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9SZW5kZXJlciAgcmVuZGVyZXI7Ci0KLQotICAgIHJlbmRlcmVyID0gRlRfTG9va3VwX1JlbmRlcmVyKCBsaWJyYXJ5LCBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSwgMCApOwotICAgIGxpYnJhcnktPmN1cl9yZW5kZXJlciA9IHJlbmRlcmVyOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfYWRkX3JlbmRlcmVyKCBGVF9Nb2R1bGUgIG1vZHVsZSApCi0gIHsKLSAgICBGVF9MaWJyYXJ5ICAgbGlicmFyeSA9IG1vZHVsZS0+bGlicmFyeTsKLSAgICBGVF9NZW1vcnkgICAgbWVtb3J5ICA9IGxpYnJhcnktPm1lbW9yeTsKLSAgICBGVF9FcnJvciAgICAgZXJyb3I7Ci0gICAgRlRfTGlzdE5vZGUgIG5vZGUgICAgPSBOVUxMOwotCi0KLSAgICBpZiAoIEZUX05FVyggbm9kZSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHsKLSAgICAgIEZUX1JlbmRlcmVyICAgICAgICAgcmVuZGVyID0gRlRfUkVOREVSRVIoIG1vZHVsZSApOwotICAgICAgRlRfUmVuZGVyZXJfQ2xhc3MqICBjbGF6eiAgPSAoRlRfUmVuZGVyZXJfQ2xhc3MqKW1vZHVsZS0+Y2xheno7Ci0KLQotICAgICAgcmVuZGVyLT5jbGF6eiAgICAgICAgPSBjbGF6ejsKLSAgICAgIHJlbmRlci0+Z2x5cGhfZm9ybWF0ID0gY2xhenotPmdseXBoX2Zvcm1hdDsKLQotICAgICAgLyogYWxsb2NhdGUgcmFzdGVyIG9iamVjdCBpZiBuZWVkZWQgKi8KLSAgICAgIGlmICggY2xhenotPmdseXBoX2Zvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSAmJgotICAgICAgICAgICBjbGF6ei0+cmFzdGVyX2NsYXNzLT5yYXN0ZXJfbmV3ICAgICAgICAgICAgICAgICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBjbGF6ei0+cmFzdGVyX2NsYXNzLT5yYXN0ZXJfbmV3KCBtZW1vcnksICZyZW5kZXItPnJhc3RlciApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgcmVuZGVyLT5yYXN0ZXJfcmVuZGVyID0gY2xhenotPnJhc3Rlcl9jbGFzcy0+cmFzdGVyX3JlbmRlcjsKLSAgICAgICAgcmVuZGVyLT5yZW5kZXIgICAgICAgID0gY2xhenotPnJlbmRlcl9nbHlwaDsKLSAgICAgIH0KLQotICAgICAgLyogYWRkIHRvIGxpc3QgKi8KLSAgICAgIG5vZGUtPmRhdGEgPSBtb2R1bGU7Ci0gICAgICBGVF9MaXN0X0FkZCggJmxpYnJhcnktPnJlbmRlcmVycywgbm9kZSApOwotCi0gICAgICBmdF9zZXRfY3VycmVudF9yZW5kZXJlciggbGlicmFyeSApOwotICAgIH0KLQotICBGYWlsOgotICAgIGlmICggZXJyb3IgKQotICAgICAgRlRfRlJFRSggbm9kZSApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9yZW1vdmVfcmVuZGVyZXIoIEZUX01vZHVsZSAgbW9kdWxlICkKLSAgewotICAgIEZUX0xpYnJhcnkgICBsaWJyYXJ5OwotICAgIEZUX01lbW9yeSAgICBtZW1vcnk7Ci0gICAgRlRfTGlzdE5vZGUgIG5vZGU7Ci0KLQotICAgIGxpYnJhcnkgPSBtb2R1bGUtPmxpYnJhcnk7Ci0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm47Ci0KLSAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLSAgICBub2RlID0gRlRfTGlzdF9GaW5kKCAmbGlicmFyeS0+cmVuZGVyZXJzLCBtb2R1bGUgKTsKLSAgICBpZiAoIG5vZGUgKQotICAgIHsKLSAgICAgIEZUX1JlbmRlcmVyICByZW5kZXIgPSBGVF9SRU5ERVJFUiggbW9kdWxlICk7Ci0KLQotICAgICAgLyogcmVsZWFzZSByYXN0ZXIgb2JqZWN0LCBpZiBhbnkgKi8KLSAgICAgIGlmICggcmVuZGVyLT5jbGF6ei0+Z2x5cGhfZm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FICYmCi0gICAgICAgICAgIHJlbmRlci0+cmFzdGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgIHJlbmRlci0+Y2xhenotPnJhc3Rlcl9jbGFzcy0+cmFzdGVyX2RvbmUoIHJlbmRlci0+cmFzdGVyICk7Ci0KLSAgICAgIC8qIHJlbW92ZSBmcm9tIGxpc3QgKi8KLSAgICAgIEZUX0xpc3RfUmVtb3ZlKCAmbGlicmFyeS0+cmVuZGVyZXJzLCBub2RlICk7Ci0gICAgICBGVF9GUkVFKCBub2RlICk7Ci0KLSAgICAgIGZ0X3NldF9jdXJyZW50X3JlbmRlcmVyKCBsaWJyYXJ5ICk7Ci0gICAgfQotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0cmVuZGVyLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9SZW5kZXJlciApCi0gIEZUX0dldF9SZW5kZXJlciggRlRfTGlicmFyeSAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgIEZUX0dseXBoX0Zvcm1hdCAgZm9ybWF0ICkKLSAgewotICAgIC8qIHRlc3QgZm9yIHZhbGlkIGBsaWJyYXJ5JyBkZWxheWVkIHRvIGBGVF9Mb29rdXBfUmVuZGVyZXInICovCi0KLSAgICByZXR1cm4gRlRfTG9va3VwX1JlbmRlcmVyKCBsaWJyYXJ5LCBmb3JtYXQsIDAgKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHJlbmRlci5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9TZXRfUmVuZGVyZXIoIEZUX0xpYnJhcnkgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyZXIgICAgcmVuZGVyZXIsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgbnVtX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICBGVF9QYXJhbWV0ZXIqICBwYXJhbWV0ZXJzICkKLSAgewotICAgIEZUX0xpc3ROb2RlICBub2RlOwotICAgIEZUX0Vycm9yICAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotICAgIEZUX1JlbmRlcmVyX1NldE1vZGVGdW5jICBzZXRfbW9kZTsKLQotCi0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9MaWJyYXJ5X0hhbmRsZSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggIXJlbmRlcmVyICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBudW1fcGFyYW1zID4gMCAmJiAhcGFyYW1ldGVycyApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIG5vZGUgPSBGVF9MaXN0X0ZpbmQoICZsaWJyYXJ5LT5yZW5kZXJlcnMsIHJlbmRlcmVyICk7Ci0gICAgaWYgKCAhbm9kZSApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIEZUX0xpc3RfVXAoICZsaWJyYXJ5LT5yZW5kZXJlcnMsIG5vZGUgKTsKLQotICAgIGlmICggcmVuZGVyZXItPmdseXBoX2Zvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSApCi0gICAgICBsaWJyYXJ5LT5jdXJfcmVuZGVyZXIgPSByZW5kZXJlcjsKLQotICAgIHNldF9tb2RlID0gcmVuZGVyZXItPmNsYXp6LT5zZXRfbW9kZTsKLQotICAgIGZvciAoIDsgbnVtX3BhcmFtcyA+IDA7IG51bV9wYXJhbXMtLSApCi0gICAgewotICAgICAgZXJyb3IgPSBzZXRfbW9kZSggcmVuZGVyZXIsIHBhcmFtZXRlcnMtPnRhZywgcGFyYW1ldGVycy0+ZGF0YSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGJyZWFrOwotICAgICAgcGFyYW1ldGVycysrOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfUmVuZGVyX0dseXBoX0ludGVybmFsKCBGVF9MaWJyYXJ5ICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgcmVuZGVyX21vZGUgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX1JlbmRlcmVyICByZW5kZXJlcjsKLQotCi0gICAgLyogaWYgaXQgaXMgYWxyZWFkeSBhIGJpdG1hcCwgbm8gbmVlZCB0byBkbyBhbnl0aGluZyAqLwotICAgIHN3aXRjaCAoIHNsb3QtPmZvcm1hdCApCi0gICAgewotICAgIGNhc2UgRlRfR0xZUEhfRk9STUFUX0JJVE1BUDogICAvKiBhbHJlYWR5IGEgYml0bWFwLCBkb24ndCBkbyBhbnl0aGluZyAqLwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgewotICAgICAgICBGVF9MaXN0Tm9kZSAgbm9kZSA9IE5VTEw7Ci0KLQotICAgICAgICAvKiBzbWFsbCBzaG9ydGN1dCBmb3IgdGhlIHZlcnkgY29tbW9uIGNhc2UgKi8KLSAgICAgICAgaWYgKCBzbG90LT5mb3JtYXQgPT0gRlRfR0xZUEhfRk9STUFUX09VVExJTkUgKQotICAgICAgICB7Ci0gICAgICAgICAgcmVuZGVyZXIgPSBsaWJyYXJ5LT5jdXJfcmVuZGVyZXI7Ci0gICAgICAgICAgbm9kZSAgICAgPSBsaWJyYXJ5LT5yZW5kZXJlcnMuaGVhZDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgcmVuZGVyZXIgPSBGVF9Mb29rdXBfUmVuZGVyZXIoIGxpYnJhcnksIHNsb3QtPmZvcm1hdCwgJm5vZGUgKTsKLQotICAgICAgICBlcnJvciA9IEZUX0VSUiggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0gICAgICAgIHdoaWxlICggcmVuZGVyZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSByZW5kZXJlci0+cmVuZGVyKCByZW5kZXJlciwgc2xvdCwgcmVuZGVyX21vZGUsIE5VTEwgKTsKLSAgICAgICAgICBpZiAoICFlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgIEZUX0VSUl9ORVEoIGVycm9yLCBDYW5ub3RfUmVuZGVyX0dseXBoICkgKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAvKiBGVF9FcnJfQ2Fubm90X1JlbmRlcl9HbHlwaCBpcyByZXR1cm5lZCBpZiB0aGUgcmVuZGVyIG1vZGUgICAqLwotICAgICAgICAgIC8qIGlzIHVuc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IHJlbmRlcmVyIGZvciB0aGlzIGdseXBoIGltYWdlICovCi0gICAgICAgICAgLyogZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgIC8qIG5vdywgbG9vayBmb3IgYW5vdGhlciByZW5kZXJlciB0aGF0IHN1cHBvcnRzIHRoZSBzYW1lICovCi0gICAgICAgICAgLyogZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICByZW5kZXJlciA9IEZUX0xvb2t1cF9SZW5kZXJlciggbGlicmFyeSwgc2xvdC0+Zm9ybWF0LCAmbm9kZSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLQotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9iaXRtYXAKLQotICAgIC8qIHdlIGNvbnZlcnQgdG8gYSBzaW5nbGUgYml0bWFwIGZvcm1hdCBmb3IgY29tcHV0aW5nIHRoZSBjaGVja3N1bSAqLwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBGVF9CaXRtYXAgIGJpdG1hcDsKLSAgICAgIEZUX0Vycm9yICAgZXJyOwotCi0KLSAgICAgIEZUX0JpdG1hcF9Jbml0KCAmYml0bWFwICk7Ci0KLSAgICAgIC8qIHRoaXMgYWxzbyBjb252ZXJ0cyB0aGUgYml0bWFwIGZsb3cgdG8gYGRvd24nIChpLmUuLCBwaXRjaCA+IDApICovCi0gICAgICBlcnIgPSBGVF9CaXRtYXBfQ29udmVydCggbGlicmFyeSwgJnNsb3QtPmJpdG1hcCwgJmJpdG1hcCwgMSApOwotICAgICAgaWYgKCAhZXJyICkKLSAgICAgIHsKLSAgICAgICAgTUQ1X0NUWCAgICAgICAgY3R4OwotICAgICAgICB1bnNpZ25lZCBjaGFyICBtZDVbMTZdOwotICAgICAgICBpbnQgICAgICAgICAgICBpOwotICAgICAgICB1bnNpZ25lZCBpbnQgICByb3dzICA9IGJpdG1hcC5yb3dzOwotICAgICAgICB1bnNpZ25lZCBpbnQgICBwaXRjaCA9ICh1bnNpZ25lZCBpbnQpYml0bWFwLnBpdGNoOwotCi0KLSAgICAgICAgTUQ1X0luaXQoICZjdHggKTsKLSAgICAgICAgTUQ1X1VwZGF0ZSggJmN0eCwgYml0bWFwLmJ1ZmZlciwgcm93cyAqIHBpdGNoICk7Ci0gICAgICAgIE1ENV9GaW5hbCggbWQ1LCAmY3R4ICk7Ci0KLSAgICAgICAgRlRfVFJBQ0UzKCggIk1ENSBjaGVja3N1bSBmb3IgJWR4JWQgYml0bWFwOlxuIgotICAgICAgICAgICAgICAgICAgICAiICAiLAotICAgICAgICAgICAgICAgICAgICByb3dzLCBwaXRjaCApKTsKLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCAxNjsgaSsrICkKLSAgICAgICAgICBGVF9UUkFDRTMoKCAiJTAyWCIsIG1kNVtpXSApKTsKLSAgICAgICAgRlRfVFJBQ0UzKCggIlxuIiApKTsKLSAgICAgIH0KLQotICAgICAgRlRfQml0bWFwX0RvbmUoIGxpYnJhcnksICZiaXRtYXAgKTsKLSAgICB9Ci0KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2Vfb2JqcwotCi0jZW5kaWYgLyogRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9SZW5kZXJfR2x5cGgoIEZUX0dseXBoU2xvdCAgICBzbG90LAotICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICByZW5kZXJfbW9kZSApCi0gIHsKLSAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5OwotCi0KLSAgICBpZiAoICFzbG90IHx8ICFzbG90LT5mYWNlICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgbGlicmFyeSA9IEZUX0ZBQ0VfTElCUkFSWSggc2xvdC0+ZmFjZSApOwotCi0gICAgcmV0dXJuIEZUX1JlbmRlcl9HbHlwaF9JbnRlcm5hbCggbGlicmFyeSwgc2xvdCwgcmVuZGVyX21vZGUgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICBNIE8gRCBVIEwgRSBTICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzdHJveV9Nb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzdHJveXMgYSBnaXZlbiBtb2R1bGUgb2JqZWN0LiAgRm9yIGRyaXZlcnMsIHRoaXMgYWxzbyBkZXN0cm95cyAgICovCi0gIC8qICAgIGFsbCBjaGlsZCBmYWNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1vZHVsZSA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGRyaXZlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBkcml2ZXIgX211c3RfIGJlIExPQ0tFRCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgRGVzdHJveV9Nb2R1bGUoIEZUX01vZHVsZSAgbW9kdWxlICkKLSAgewotICAgIEZUX01lbW9yeSAgICAgICAgIG1lbW9yeSAgPSBtb2R1bGUtPm1lbW9yeTsKLSAgICBGVF9Nb2R1bGVfQ2xhc3MqICBjbGF6eiAgID0gbW9kdWxlLT5jbGF6ejsKLSAgICBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5ID0gbW9kdWxlLT5saWJyYXJ5OwotCi0KLSAgICBpZiAoIGxpYnJhcnkgJiYgbGlicmFyeS0+YXV0b19oaW50ZXIgPT0gbW9kdWxlICkKLSAgICAgIGxpYnJhcnktPmF1dG9faGludGVyID0gTlVMTDsKLQotICAgIC8qIGlmIHRoZSBtb2R1bGUgaXMgYSByZW5kZXJlciAqLwotICAgIGlmICggRlRfTU9EVUxFX0lTX1JFTkRFUkVSKCBtb2R1bGUgKSApCi0gICAgICBmdF9yZW1vdmVfcmVuZGVyZXIoIG1vZHVsZSApOwotCi0gICAgLyogaWYgdGhlIG1vZHVsZSBpcyBhIGZvbnQgZHJpdmVyLCBhZGQgc29tZSBzdGVwcyAqLwotICAgIGlmICggRlRfTU9EVUxFX0lTX0RSSVZFUiggbW9kdWxlICkgKQotICAgICAgRGVzdHJveV9Ecml2ZXIoIEZUX0RSSVZFUiggbW9kdWxlICkgKTsKLQotICAgIC8qIGZpbmFsaXplIHRoZSBtb2R1bGUgb2JqZWN0ICovCi0gICAgaWYgKCBjbGF6ei0+bW9kdWxlX2RvbmUgKQotICAgICAgY2xhenotPm1vZHVsZV9kb25lKCBtb2R1bGUgKTsKLQotICAgIC8qIGRpc2NhcmQgaXQgKi8KLSAgICBGVF9GUkVFKCBtb2R1bGUgKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG1vZGFwaS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9BZGRfTW9kdWxlKCBGVF9MaWJyYXJ5ICAgICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICBjb25zdCBGVF9Nb2R1bGVfQ2xhc3MqICBjbGF6eiApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotICAgIEZUX01vZHVsZSAgbW9kdWxlOwotICAgIEZUX1VJbnQgICAgbm47Ci0KLQotI2RlZmluZSBGUkVFVFlQRV9WRVJfRklYRUQgICggKCAoRlRfTG9uZylGUkVFVFlQRV9NQUpPUiA8PCAxNiApIHwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkVFVFlQRV9NSU5PUiAgICAgICAgICAgICAgICAgICkKLQotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0xpYnJhcnlfSGFuZGxlICk7Ci0KLSAgICBpZiAoICFjbGF6eiApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIC8qIGNoZWNrIGZyZWV0eXBlIHZlcnNpb24gKi8KLSAgICBpZiAoIGNsYXp6LT5tb2R1bGVfcmVxdWlyZXMgPiBGUkVFVFlQRV9WRVJfRklYRUQgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1ZlcnNpb24gKTsKLQotICAgIC8qIGxvb2sgZm9yIGEgbW9kdWxlIHdpdGggdGhlIHNhbWUgbmFtZSBpbiB0aGUgbGlicmFyeSdzIHRhYmxlICovCi0gICAgZm9yICggbm4gPSAwOyBubiA8IGxpYnJhcnktPm51bV9tb2R1bGVzOyBubisrICkKLSAgICB7Ci0gICAgICBtb2R1bGUgPSBsaWJyYXJ5LT5tb2R1bGVzW25uXTsKLSAgICAgIGlmICggZnRfc3RyY21wKCBtb2R1bGUtPmNsYXp6LT5tb2R1bGVfbmFtZSwgY2xhenotPm1vZHVsZV9uYW1lICkgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIC8qIHRoaXMgaW5zdGFsbGVkIG1vZHVsZSBoYXMgdGhlIHNhbWUgbmFtZSwgY29tcGFyZSB0aGVpciB2ZXJzaW9ucyAqLwotICAgICAgICBpZiAoIGNsYXp6LT5tb2R1bGVfdmVyc2lvbiA8PSBtb2R1bGUtPmNsYXp6LT5tb2R1bGVfdmVyc2lvbiApCi0gICAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBMb3dlcl9Nb2R1bGVfVmVyc2lvbiApOwotCi0gICAgICAgIC8qIHJlbW92ZSB0aGUgbW9kdWxlIGZyb20gb3VyIGxpc3QsIHRoZW4gZXhpdCB0aGUgbG9vcCB0byByZXBsYWNlICovCi0gICAgICAgIC8qIGl0IGJ5IG91ciBuZXcgdmVyc2lvbi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIEZUX1JlbW92ZV9Nb2R1bGUoIGxpYnJhcnksIG1vZHVsZSApOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0gICAgZXJyb3IgID0gRlRfRXJyX09rOwotCi0gICAgaWYgKCBsaWJyYXJ5LT5udW1fbW9kdWxlcyA+PSBGVF9NQVhfTU9EVUxFUyApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggVG9vX01hbnlfRHJpdmVycyApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIGFsbG9jYXRlIG1vZHVsZSBvYmplY3QgKi8KLSAgICBpZiAoIEZUX0FMTE9DKCBtb2R1bGUsIGNsYXp6LT5tb2R1bGVfc2l6ZSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGJhc2UgaW5pdGlhbGl6YXRpb24gKi8KLSAgICBtb2R1bGUtPmxpYnJhcnkgPSBsaWJyYXJ5OwotICAgIG1vZHVsZS0+bWVtb3J5ICA9IG1lbW9yeTsKLSAgICBtb2R1bGUtPmNsYXp6ICAgPSAoRlRfTW9kdWxlX0NsYXNzKiljbGF6ejsKLQotICAgIC8qIGNoZWNrIHdoZXRoZXIgdGhlIG1vZHVsZSBpcyBhIHJlbmRlcmVyIC0gdGhpcyBtdXN0IGJlIHBlcmZvcm1lZCAqLwotICAgIC8qIGJlZm9yZSB0aGUgbm9ybWFsIG1vZHVsZSBpbml0aWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggRlRfTU9EVUxFX0lTX1JFTkRFUkVSKCBtb2R1bGUgKSApCi0gICAgewotICAgICAgLyogYWRkIHRvIHRoZSByZW5kZXJlcnMgbGlzdCAqLwotICAgICAgZXJyb3IgPSBmdF9hZGRfcmVuZGVyZXIoIG1vZHVsZSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgbW9kdWxlIGEgYXV0by1oaW50ZXI/ICovCi0gICAgaWYgKCBGVF9NT0RVTEVfSVNfSElOVEVSKCBtb2R1bGUgKSApCi0gICAgICBsaWJyYXJ5LT5hdXRvX2hpbnRlciA9IG1vZHVsZTsKLQotICAgIC8qIGlmIHRoZSBtb2R1bGUgaXMgYSBmb250IGRyaXZlciAqLwotICAgIGlmICggRlRfTU9EVUxFX0lTX0RSSVZFUiggbW9kdWxlICkgKQotICAgIHsKLSAgICAgIEZUX0RyaXZlciAgZHJpdmVyID0gRlRfRFJJVkVSKCBtb2R1bGUgKTsKLQotCi0gICAgICBkcml2ZXItPmNsYXp6ID0gKEZUX0RyaXZlcl9DbGFzcyltb2R1bGUtPmNsYXp6OwotICAgIH0KLQotICAgIGlmICggY2xhenotPm1vZHVsZV9pbml0ICkKLSAgICB7Ci0gICAgICBlcnJvciA9IGNsYXp6LT5tb2R1bGVfaW5pdCggbW9kdWxlICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgIC8qIGFkZCBtb2R1bGUgdG8gdGhlIGxpYnJhcnkncyB0YWJsZSAqLwotICAgIGxpYnJhcnktPm1vZHVsZXNbbGlicmFyeS0+bnVtX21vZHVsZXMrK10gPSBtb2R1bGU7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgRmFpbDoKLSAgICBpZiAoIEZUX01PRFVMRV9JU19SRU5ERVJFUiggbW9kdWxlICkgKQotICAgIHsKLSAgICAgIEZUX1JlbmRlcmVyICByZW5kZXJlciA9IEZUX1JFTkRFUkVSKCBtb2R1bGUgKTsKLQotCi0gICAgICBpZiAoIHJlbmRlcmVyLT5jbGF6eiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgIHJlbmRlcmVyLT5jbGF6ei0+Z2x5cGhfZm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FICYmCi0gICAgICAgICAgIHJlbmRlcmVyLT5yYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgcmVuZGVyZXItPmNsYXp6LT5yYXN0ZXJfY2xhc3MtPnJhc3Rlcl9kb25lKCByZW5kZXJlci0+cmFzdGVyICk7Ci0gICAgfQotCi0gICAgRlRfRlJFRSggbW9kdWxlICk7Ci0gICAgZ290byBFeGl0OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bW9kYXBpLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9Nb2R1bGUgKQotICBGVF9HZXRfTW9kdWxlKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIG1vZHVsZV9uYW1lICkKLSAgewotICAgIEZUX01vZHVsZSAgIHJlc3VsdCA9IE5VTEw7Ci0gICAgRlRfTW9kdWxlKiAgY3VyOwotICAgIEZUX01vZHVsZSogIGxpbWl0OwotCi0KLSAgICBpZiAoICFsaWJyYXJ5IHx8ICFtb2R1bGVfbmFtZSApCi0gICAgICByZXR1cm4gcmVzdWx0OwotCi0gICAgY3VyICAgPSBsaWJyYXJ5LT5tb2R1bGVzOwotICAgIGxpbWl0ID0gY3VyICsgbGlicmFyeS0+bnVtX21vZHVsZXM7Ci0KLSAgICBmb3IgKCA7IGN1ciA8IGxpbWl0OyBjdXIrKyApCi0gICAgICBpZiAoIGZ0X3N0cmNtcCggY3VyWzBdLT5jbGF6ei0+bW9kdWxlX25hbWUsIG1vZHVsZV9uYW1lICkgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGN1clswXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b2Jqcy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIGNvbnN0IHZvaWQqICkKLSAgRlRfR2V0X01vZHVsZV9JbnRlcmZhY2UoIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIG1vZF9uYW1lICkKLSAgewotICAgIEZUX01vZHVsZSAgbW9kdWxlOwotCi0KLSAgICAvKiB0ZXN0IGZvciB2YWxpZCBgbGlicmFyeScgZGVsYXllZCB0byBGVF9HZXRfTW9kdWxlKCkgKi8KLQotICAgIG1vZHVsZSA9IEZUX0dldF9Nb2R1bGUoIGxpYnJhcnksIG1vZF9uYW1lICk7Ci0KLSAgICByZXR1cm4gbW9kdWxlID8gbW9kdWxlLT5jbGF6ei0+bW9kdWxlX2ludGVyZmFjZSA6IDA7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9Qb2ludGVyICkKLSAgZnRfbW9kdWxlX2dldF9zZXJ2aWNlKCBGVF9Nb2R1bGUgICAgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBzZXJ2aWNlX2lkICkKLSAgewotICAgIEZUX1BvaW50ZXIgIHJlc3VsdCA9IE5VTEw7Ci0KLQotICAgIGlmICggbW9kdWxlICkKLSAgICB7Ci0gICAgICBGVF9BU1NFUlQoIG1vZHVsZS0+Y2xhenogJiYgbW9kdWxlLT5jbGF6ei0+Z2V0X2ludGVyZmFjZSApOwotCi0gICAgICAvKiBmaXJzdCwgbG9vayBmb3IgdGhlIHNlcnZpY2UgaW4gdGhlIG1vZHVsZSAqLwotICAgICAgaWYgKCBtb2R1bGUtPmNsYXp6LT5nZXRfaW50ZXJmYWNlICkKLSAgICAgICAgcmVzdWx0ID0gbW9kdWxlLT5jbGF6ei0+Z2V0X2ludGVyZmFjZSggbW9kdWxlLCBzZXJ2aWNlX2lkICk7Ci0KLSAgICAgIGlmICggcmVzdWx0ID09IE5VTEwgKQotICAgICAgewotICAgICAgICAvKiB3ZSBkaWRuJ3QgZmluZCBpdCwgbG9vayBpbiBhbGwgb3RoZXIgbW9kdWxlcyB0aGVuICovCi0gICAgICAgIEZUX0xpYnJhcnkgIGxpYnJhcnkgPSBtb2R1bGUtPmxpYnJhcnk7Ci0gICAgICAgIEZUX01vZHVsZSogIGN1ciAgICAgPSBsaWJyYXJ5LT5tb2R1bGVzOwotICAgICAgICBGVF9Nb2R1bGUqICBsaW1pdCAgID0gY3VyICsgbGlicmFyeS0+bnVtX21vZHVsZXM7Ci0KLQotICAgICAgICBmb3IgKCA7IGN1ciA8IGxpbWl0OyBjdXIrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGN1clswXSAhPSBtb2R1bGUgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0FTU0VSVCggY3VyWzBdLT5jbGF6eiApOwotCi0gICAgICAgICAgICBpZiAoIGN1clswXS0+Y2xhenotPmdldF9pbnRlcmZhY2UgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBjdXJbMF0tPmNsYXp6LT5nZXRfaW50ZXJmYWNlKCBjdXJbMF0sIHNlcnZpY2VfaWQgKTsKLSAgICAgICAgICAgICAgaWYgKCByZXN1bHQgIT0gTlVMTCApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG1vZGFwaS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9SZW1vdmVfTW9kdWxlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICBGVF9Nb2R1bGUgICBtb2R1bGUgKQotICB7Ci0gICAgLyogdHJ5IHRvIGZpbmQgdGhlIG1vZHVsZSBmcm9tIHRoZSB0YWJsZSwgdGhlbiByZW1vdmUgaXQgZnJvbSB0aGVyZSAqLwotCi0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfTGlicmFyeV9IYW5kbGUgKTsKLQotICAgIGlmICggbW9kdWxlICkKLSAgICB7Ci0gICAgICBGVF9Nb2R1bGUqICBjdXIgICA9IGxpYnJhcnktPm1vZHVsZXM7Ci0gICAgICBGVF9Nb2R1bGUqICBsaW1pdCA9IGN1ciArIGxpYnJhcnktPm51bV9tb2R1bGVzOwotCi0KLSAgICAgIGZvciAoIDsgY3VyIDwgbGltaXQ7IGN1cisrICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBjdXJbMF0gPT0gbW9kdWxlICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHJlbW92ZSBpdCBmcm9tIHRoZSB0YWJsZSAqLwotICAgICAgICAgIGxpYnJhcnktPm51bV9tb2R1bGVzLS07Ci0gICAgICAgICAgbGltaXQtLTsKLSAgICAgICAgICB3aGlsZSAoIGN1ciA8IGxpbWl0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjdXJbMF0gPSBjdXJbMV07Ci0gICAgICAgICAgICBjdXIrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbGltaXRbMF0gPSBOVUxMOwotCi0gICAgICAgICAgLyogZGVzdHJveSB0aGUgbW9kdWxlICovCi0gICAgICAgICAgRGVzdHJveV9Nb2R1bGUoIG1vZHVsZSApOwotCi0gICAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRHJpdmVyX0hhbmRsZSApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfcHJvcGVydHlfZG8oIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICBtb2R1bGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIHByb3BlcnR5X25hbWUsCi0gICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICAgIHNldCApCi0gIHsKLSAgICBGVF9Nb2R1bGUqICAgICAgICAgICBjdXI7Ci0gICAgRlRfTW9kdWxlKiAgICAgICAgICAgbGltaXQ7Ci0gICAgRlRfTW9kdWxlX0ludGVyZmFjZSAgaW50ZXJmYWNlOwotCi0gICAgRlRfU2VydmljZV9Qcm9wZXJ0aWVzICBzZXJ2aWNlOwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfRVJST1IKLSAgICBjb25zdCBGVF9TdHJpbmcqICBzZXRfbmFtZSAgPSAiRlRfUHJvcGVydHlfU2V0IjsKLSAgICBjb25zdCBGVF9TdHJpbmcqICBnZXRfbmFtZSAgPSAiRlRfUHJvcGVydHlfR2V0IjsKLSAgICBjb25zdCBGVF9TdHJpbmcqICBmdW5jX25hbWUgPSBzZXQgPyBzZXRfbmFtZSA6IGdldF9uYW1lOwotI2VuZGlmCi0KLSAgICBGVF9Cb29sICBtaXNzaW5nX2Z1bmM7Ci0KLQotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0xpYnJhcnlfSGFuZGxlICk7Ci0KLSAgICBpZiAoICFtb2R1bGVfbmFtZSB8fCAhcHJvcGVydHlfbmFtZSB8fCAhdmFsdWUgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBjdXIgICA9IGxpYnJhcnktPm1vZHVsZXM7Ci0gICAgbGltaXQgPSBjdXIgKyBsaWJyYXJ5LT5udW1fbW9kdWxlczsKLQotICAgIC8qIHNlYXJjaCBtb2R1bGUgKi8KLSAgICBmb3IgKCA7IGN1ciA8IGxpbWl0OyBjdXIrKyApCi0gICAgICBpZiAoICFmdF9zdHJjbXAoIGN1clswXS0+Y2xhenotPm1vZHVsZV9uYW1lLCBtb2R1bGVfbmFtZSApICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBpZiAoIGN1ciA9PSBsaW1pdCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiJXM6IGNhbid0IGZpbmQgbW9kdWxlIGAlcydcbiIsCi0gICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSwgbW9kdWxlX25hbWUgKSk7Ci0gICAgICByZXR1cm4gRlRfVEhST1coIE1pc3NpbmdfTW9kdWxlICk7Ci0gICAgfQotCi0gICAgLyogY2hlY2sgd2hldGhlciB3ZSBoYXZlIGEgc2VydmljZSBpbnRlcmZhY2UgKi8KLSAgICBpZiAoICFjdXJbMF0tPmNsYXp6LT5nZXRfaW50ZXJmYWNlICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICIlczogbW9kdWxlIGAlcycgZG9lc24ndCBzdXBwb3J0IHByb3BlcnRpZXNcbiIsCi0gICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSwgbW9kdWxlX25hbWUgKSk7Ci0gICAgICByZXR1cm4gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotICAgIH0KLQotICAgIC8qIHNlYXJjaCBwcm9wZXJ0eSBzZXJ2aWNlICovCi0gICAgaW50ZXJmYWNlID0gY3VyWzBdLT5jbGF6ei0+Z2V0X2ludGVyZmFjZSggY3VyWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NFUlZJQ0VfSURfUFJPUEVSVElFUyApOwotICAgIGlmICggIWludGVyZmFjZSApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiJXM6IG1vZHVsZSBgJXMnIGRvZXNuJ3Qgc3VwcG9ydCBwcm9wZXJ0aWVzXG4iLAotICAgICAgICAgICAgICAgICBmdW5jX25hbWUsIG1vZHVsZV9uYW1lICkpOwotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLSAgICB9Ci0KLSAgICBzZXJ2aWNlID0gKEZUX1NlcnZpY2VfUHJvcGVydGllcylpbnRlcmZhY2U7Ci0KLSAgICBpZiAoIHNldCApCi0gICAgICBtaXNzaW5nX2Z1bmMgPSAoRlRfQm9vbCkoICFzZXJ2aWNlLT5zZXRfcHJvcGVydHkgKTsKLSAgICBlbHNlCi0gICAgICBtaXNzaW5nX2Z1bmMgPSAoRlRfQm9vbCkoICFzZXJ2aWNlLT5nZXRfcHJvcGVydHkgKTsKLQotICAgIGlmICggbWlzc2luZ19mdW5jICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICIlczogcHJvcGVydHkgc2VydmljZSBvZiBtb2R1bGUgYCVzJyBpcyBicm9rZW5cbiIsCi0gICAgICAgICAgICAgICAgIGZ1bmNfbmFtZSwgbW9kdWxlX25hbWUgKSk7Ci0gICAgICByZXR1cm4gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotICAgIH0KLQotICAgIHJldHVybiBzZXQgPyBzZXJ2aWNlLT5zZXRfcHJvcGVydHkoIGN1clswXSwgcHJvcGVydHlfbmFtZSwgdmFsdWUgKQotICAgICAgICAgICAgICAgOiBzZXJ2aWNlLT5nZXRfcHJvcGVydHkoIGN1clswXSwgcHJvcGVydHlfbmFtZSwgdmFsdWUgKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG1vZGFwaS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9Qcm9wZXJ0eV9TZXQoIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgbW9kdWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgcHJvcGVydHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiAgICAgICB2YWx1ZSApCi0gIHsKLSAgICByZXR1cm4gZnRfcHJvcGVydHlfZG8oIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRtb2RhcGkuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfUHJvcGVydHlfR2V0KCBGVF9MaWJyYXJ5ICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIG1vZHVsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIHByb3BlcnR5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgdmFsdWUgKQotICB7Ci0gICAgcmV0dXJuIGZ0X3Byb3BlcnR5X2RvKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgIEwgSSBCIFIgQSBSIFkgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bW9kYXBpLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1JlZmVyZW5jZV9MaWJyYXJ5KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0xpYnJhcnlfSGFuZGxlICk7Ci0KLSAgICBsaWJyYXJ5LT5yZWZjb3VudCsrOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG1vZGFwaS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9OZXdfTGlicmFyeSggRlRfTWVtb3J5ICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgIEZUX0xpYnJhcnkgICphbGlicmFyeSApCi0gIHsKLSAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5ID0gTlVMTDsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLQotCi0gICAgaWYgKCAhbWVtb3J5IHx8ICFhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX0VSUk9SCi0gICAgLyogaW5pdCBkZWJ1Z2dpbmcgc3VwcG9ydCAqLwotICAgIGZ0X2RlYnVnX2luaXQoKTsKLSNlbmRpZgotCi0gICAgLyogZmlyc3Qgb2YgYWxsLCBhbGxvY2F0ZSB0aGUgbGlicmFyeSBvYmplY3QgKi8KLSAgICBpZiAoIEZUX05FVyggbGlicmFyeSApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGxpYnJhcnktPm1lbW9yeSA9IG1lbW9yeTsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0gICAgLyogaW5pdGlhbGl6ZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIGNvbnRhaW5lcnMgKi8KLSAgICBlcnJvciA9IGZ0X3BpY19jb250YWluZXJfaW5pdCggbGlicmFyeSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBGYWlsOwotI2VuZGlmCi0KLSAgICAvKiB3ZSBkb24ndCB1c2UgcmFzdGVyX3Bvb2wgYW55bW9yZS4gKi8KLSAgICBsaWJyYXJ5LT5yYXN0ZXJfcG9vbF9zaXplID0gMDsKLSAgICBsaWJyYXJ5LT5yYXN0ZXJfcG9vbCAgICAgID0gTlVMTDsKLQotICAgIGxpYnJhcnktPnZlcnNpb25fbWFqb3IgPSBGUkVFVFlQRV9NQUpPUjsKLSAgICBsaWJyYXJ5LT52ZXJzaW9uX21pbm9yID0gRlJFRVRZUEVfTUlOT1I7Ci0gICAgbGlicmFyeS0+dmVyc2lvbl9wYXRjaCA9IEZSRUVUWVBFX1BBVENIOwotCi0gICAgbGlicmFyeS0+cmVmY291bnQgPSAxOwotCi0gICAgLyogVGhhdCdzIG9rIG5vdyAqLwotICAgICphbGlicmFyeSA9IGxpYnJhcnk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSAgRmFpbDoKLSAgICBmdF9waWNfY29udGFpbmVyX2Rlc3Ryb3koIGxpYnJhcnkgKTsKLSNlbmRpZgotICAgIEZUX0ZSRUUoIGxpYnJhcnkgKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9MaWJyYXJ5X1ZlcnNpb24oIEZUX0xpYnJhcnkgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICphbWFqb3IsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgKmFtaW5vciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAqYXBhdGNoICkKLSAgewotICAgIEZUX0ludCAgbWFqb3IgPSAwOwotICAgIEZUX0ludCAgbWlub3IgPSAwOwotICAgIEZUX0ludCAgcGF0Y2ggPSAwOwotCi0KLSAgICBpZiAoIGxpYnJhcnkgKQotICAgIHsKLSAgICAgIG1ham9yID0gbGlicmFyeS0+dmVyc2lvbl9tYWpvcjsKLSAgICAgIG1pbm9yID0gbGlicmFyeS0+dmVyc2lvbl9taW5vcjsKLSAgICAgIHBhdGNoID0gbGlicmFyeS0+dmVyc2lvbl9wYXRjaDsKLSAgICB9Ci0KLSAgICBpZiAoIGFtYWpvciApCi0gICAgICAqYW1ham9yID0gbWFqb3I7Ci0KLSAgICBpZiAoIGFtaW5vciApCi0gICAgICAqYW1pbm9yID0gbWlub3I7Ci0KLSAgICBpZiAoIGFwYXRjaCApCi0gICAgICAqYXBhdGNoID0gcGF0Y2g7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRtb2RhcGkuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfRG9uZV9MaWJyYXJ5KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotCi0KLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9MaWJyYXJ5X0hhbmRsZSApOwotCi0gICAgbGlicmFyeS0+cmVmY291bnQtLTsKLSAgICBpZiAoIGxpYnJhcnktPnJlZmNvdW50ID4gMCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLSAgICAvKgotICAgICAqIENsb3NlIGFsbCBmYWNlcyBpbiB0aGUgbGlicmFyeS4gIElmIHdlIGRvbid0IGRvIHRoaXMsIHdlIGNhbiBoYXZlCi0gICAgICogc29tZSBzdWJ0bGUgbWVtb3J5IGxlYWtzLgotICAgICAqCi0gICAgICogRXhhbXBsZToKLSAgICAgKgotICAgICAqICAtIHRoZSBjZmYgZm9udCBkcml2ZXIgdXNlcyB0aGUgcHNoaW50ZXIgbW9kdWxlIGluIGNmZl9zaXplX2RvbmUKLSAgICAgKiAgLSBpZiB0aGUgcHNoaW50ZXIgbW9kdWxlIGlzIGRlc3Ryb3llZCBiZWZvcmUgdGhlIGNmZiBmb250IGRyaXZlciwKLSAgICAgKiAgICBvcGVuZWQgRlRfRmFjZSBvYmplY3RzIG1hbmFnZWQgYnkgdGhlIGRyaXZlciBhcmUgbm90IHByb3Blcmx5Ci0gICAgICogICAgZGVzdHJveWVkLCByZXN1bHRpbmcgaW4gYSBtZW1vcnkgbGVhawotICAgICAqCi0gICAgICogU29tZSBmYWNlcyBhcmUgZGVwZW5kZW50IG9uIG90aGVyIGZhY2VzLCBsaWtlIFR5cGU0MiBmYWNlcyB0aGF0Ci0gICAgICogZGVwZW5kIG9uIFRydWVUeXBlIGZhY2VzIHN5bnRoZXNpemVkIGludGVybmFsbHkuCi0gICAgICoKLSAgICAgKiBUaGUgb3JkZXIgb2YgZHJpdmVycyBzaG91bGQgYmUgc3BlY2lmaWVkIGluIGRyaXZlcl9uYW1lW10uCi0gICAgICovCi0gICAgewotICAgICAgRlRfVUludCAgICAgIG0sIG47Ci0gICAgICBjb25zdCBjaGFyKiAgZHJpdmVyX25hbWVbXSA9IHsgInR5cGU0MiIsIE5VTEwgfTsKLQotCi0gICAgICBmb3IgKCBtID0gMDsKLSAgICAgICAgICAgIG0gPCBzaXplb2YgKCBkcml2ZXJfbmFtZSApIC8gc2l6ZW9mICggZHJpdmVyX25hbWVbMF0gKTsKLSAgICAgICAgICAgIG0rKyApCi0gICAgICB7Ci0gICAgICAgIGZvciAoIG4gPSAwOyBuIDwgbGlicmFyeS0+bnVtX21vZHVsZXM7IG4rKyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Nb2R1bGUgICAgbW9kdWxlICAgICAgPSBsaWJyYXJ5LT5tb2R1bGVzW25dOwotICAgICAgICAgIGNvbnN0IGNoYXIqICBtb2R1bGVfbmFtZSA9IG1vZHVsZS0+Y2xhenotPm1vZHVsZV9uYW1lOwotICAgICAgICAgIEZUX0xpc3QgICAgICBmYWNlczsKLQotCi0gICAgICAgICAgaWYgKCBkcml2ZXJfbmFtZVttXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgIGZ0X3N0cmNtcCggbW9kdWxlX25hbWUsIGRyaXZlcl9uYW1lW21dICkgIT0gMCApCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIGlmICggKCBtb2R1bGUtPmNsYXp6LT5tb2R1bGVfZmxhZ3MgJiBGVF9NT0RVTEVfRk9OVF9EUklWRVIgKSA9PSAwICkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgRlRfVFJBQ0U3KCggIkZUX0RvbmVfTGlicmFyeTogY2xvc2UgZmFjZXMgZm9yICVzXG4iLCBtb2R1bGVfbmFtZSApKTsKLQotICAgICAgICAgIGZhY2VzID0gJkZUX0RSSVZFUiggbW9kdWxlICktPmZhY2VzX2xpc3Q7Ci0gICAgICAgICAgd2hpbGUgKCBmYWNlcy0+aGVhZCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRG9uZV9GYWNlKCBGVF9GQUNFKCBmYWNlcy0+aGVhZC0+ZGF0YSApICk7Ci0gICAgICAgICAgICBpZiAoIGZhY2VzLT5oZWFkICkKLSAgICAgICAgICAgICAgRlRfVFJBQ0UwKCggIkZUX0RvbmVfTGlicmFyeTogZmFpbGVkIHRvIGZyZWUgc29tZSBmYWNlc1xuIiApKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDbG9zZSBhbGwgb3RoZXIgbW9kdWxlcyBpbiB0aGUgbGlicmFyeSAqLwotI2lmIDEKLSAgICAvKiBYWFggTW9kdWxlcyBhcmUgcmVtb3ZlZCBpbiB0aGUgcmV2ZXJzZWQgb3JkZXIgc28gdGhhdCAgKi8KLSAgICAvKiB0eXBlNDIgbW9kdWxlIGlzIHJlbW92ZWQgYmVmb3JlIHRydWV0eXBlIG1vZHVsZS4gIFRoaXMgKi8KLSAgICAvKiBhdm9pZHMgZG91YmxlIGZyZWUgaW4gc29tZSBvY2Nhc2lvbnMuICBJdCBpcyBhIGhhY2suICAgKi8KLSAgICB3aGlsZSAoIGxpYnJhcnktPm51bV9tb2R1bGVzID4gMCApCi0gICAgICBGVF9SZW1vdmVfTW9kdWxlKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeS0+bW9kdWxlc1tsaWJyYXJ5LT5udW1fbW9kdWxlcyAtIDFdICk7Ci0jZWxzZQotICAgIHsKLSAgICAgIEZUX1VJbnQgIG47Ci0KLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBsaWJyYXJ5LT5udW1fbW9kdWxlczsgbisrICkKLSAgICAgIHsKLSAgICAgICAgRlRfTW9kdWxlICBtb2R1bGUgPSBsaWJyYXJ5LT5tb2R1bGVzW25dOwotCi0KLSAgICAgICAgaWYgKCBtb2R1bGUgKQotICAgICAgICB7Ci0gICAgICAgICAgRGVzdHJveV9Nb2R1bGUoIG1vZHVsZSApOwotICAgICAgICAgIGxpYnJhcnktPm1vZHVsZXNbbl0gPSBOVUxMOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotI2VuZGlmCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotICAgIC8qIERlc3Ryb3kgcGljIGNvbnRhaW5lciBjb250ZW50cyAqLwotICAgIGZ0X3BpY19jb250YWluZXJfZGVzdHJveSggbGlicmFyeSApOwotI2VuZGlmCi0KLSAgICBGVF9GUkVFKCBsaWJyYXJ5ICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bW9kYXBpLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfU2V0X0RlYnVnX0hvb2soIEZUX0xpYnJhcnkgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgIGhvb2tfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICBGVF9EZWJ1Z0hvb2tfRnVuYyAgZGVidWdfaG9vayApCi0gIHsKLSAgICBpZiAoIGxpYnJhcnkgJiYgZGVidWdfaG9vayAmJgotICAgICAgICAgaG9va19pbmRleCA8Ci0gICAgICAgICAgICggc2l6ZW9mICggbGlicmFyeS0+ZGVidWdfaG9va3MgKSAvIHNpemVvZiAoIHZvaWQqICkgKSApCi0gICAgICBsaWJyYXJ5LT5kZWJ1Z19ob29rc1tob29rX2luZGV4XSA9IGRlYnVnX2hvb2s7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRtb2RhcGkuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX1RydWVUeXBlRW5naW5lVHlwZSApCi0gIEZUX0dldF9UcnVlVHlwZV9FbmdpbmVfVHlwZSggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9UcnVlVHlwZUVuZ2luZVR5cGUgIHJlc3VsdCA9IEZUX1RSVUVUWVBFX0VOR0lORV9UWVBFX05PTkU7Ci0KLQotICAgIGlmICggbGlicmFyeSApCi0gICAgewotICAgICAgRlRfTW9kdWxlICBtb2R1bGUgPSBGVF9HZXRfTW9kdWxlKCBsaWJyYXJ5LCAidHJ1ZXR5cGUiICk7Ci0KLQotICAgICAgaWYgKCBtb2R1bGUgKQotICAgICAgewotICAgICAgICBGVF9TZXJ2aWNlX1RydWVUeXBlRW5naW5lICBzZXJ2aWNlOwotCi0KLSAgICAgICAgc2VydmljZSA9IChGVF9TZXJ2aWNlX1RydWVUeXBlRW5naW5lKQotICAgICAgICAgICAgICAgICAgICBmdF9tb2R1bGVfZ2V0X3NlcnZpY2UoIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TRVJWSUNFX0lEX1RSVUVUWVBFX0VOR0lORSApOwotICAgICAgICBpZiAoIHNlcnZpY2UgKQotICAgICAgICAgIHJlc3VsdCA9IHNlcnZpY2UtPmVuZ2luZV90eXBlOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnJlZXR5cGUuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2V0X1N1YkdseXBoX0luZm8oIEZUX0dseXBoU2xvdCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIHN1Yl9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAqcF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAqcF9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAqcF9hcmcxLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICpwX2FyZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9NYXRyaXggICAgKnBfdHJhbnNmb3JtICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0VSUiggSW52YWxpZF9Bcmd1bWVudCApOwotCi0KLSAgICBpZiAoIGdseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZ2x5cGgtPnN1YmdseXBocyAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBnbHlwaC0+Zm9ybWF0ID09IEZUX0dMWVBIX0ZPUk1BVF9DT01QT1NJVEUgJiYKLSAgICAgICAgIHN1Yl9pbmRleCA8IGdseXBoLT5udW1fc3ViZ2x5cGhzICAgICAgICAgICApCi0gICAgewotICAgICAgRlRfU3ViR2x5cGggIHN1YmcgPSBnbHlwaC0+c3ViZ2x5cGhzICsgc3ViX2luZGV4OwotCi0KLSAgICAgICpwX2luZGV4ICAgICA9IHN1YmctPmluZGV4OwotICAgICAgKnBfZmxhZ3MgICAgID0gc3ViZy0+ZmxhZ3M7Ci0gICAgICAqcF9hcmcxICAgICAgPSBzdWJnLT5hcmcxOwotICAgICAgKnBfYXJnMiAgICAgID0gc3ViZy0+YXJnMjsKLSAgICAgICpwX3RyYW5zZm9ybSA9IHN1YmctPnRyYW5zZm9ybTsKLQotICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdG90dmFsLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdG90dmFsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NjQ1N2IuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRvdHZhbC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRvdHZhbC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgdmFsaWRhdGluZyBPcGVuVHlwZSB0YWJsZXMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9PUEVOVFlQRV9WQUxJREFURV9ICi0jaW5jbHVkZSBGVF9PUEVOVFlQRV9WQUxJREFURV9ICi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b3R2YWwuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfT3BlblR5cGVfVmFsaWRhdGUoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgdmFsaWRhdGlvbl9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqQkFTRV90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqR0RFRl90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqR1BPU190YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqR1NVQl90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGVzICAqSlNURl90YWJsZSApCi0gIHsKLSAgICBGVF9TZXJ2aWNlX09UdmFsaWRhdGUgIHNlcnZpY2U7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICAgICBlcnJvcjsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GYWNlX0hhbmRsZSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggISggQkFTRV90YWJsZSAmJgotICAgICAgICAgICAgR0RFRl90YWJsZSAmJgotICAgICAgICAgICAgR1BPU190YWJsZSAmJgotICAgICAgICAgICAgR1NVQl90YWJsZSAmJgotICAgICAgICAgICAgSlNURl90YWJsZSApICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgRlRfRkFDRV9GSU5EX0dMT0JBTF9TRVJWSUNFKCBmYWNlLCBzZXJ2aWNlLCBPUEVOVFlQRV9WQUxJREFURSApOwotCi0gICAgaWYgKCBzZXJ2aWNlICkKLSAgICAgIGVycm9yID0gc2VydmljZS0+dmFsaWRhdGUoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFTRV90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdERUZfdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUE9TX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1NVQl90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTVEZfdGFibGUgKTsKLSAgICBlbHNlCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX09wZW5UeXBlX0ZyZWUoIEZUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9CeXRlcyAgdGFibGUgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0KLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuOwotCi0gICAgbWVtb3J5ID0gRlRfRkFDRV9NRU1PUlkoIGZhY2UgKTsKLQotICAgIEZUX0ZSRUUoIHRhYmxlICk7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0b3V0bG4uYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0b3V0bG4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVjYzlmNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdG91dGxuLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0b3V0bG4uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBvdXRsaW5lIG1hbmFnZW1lbnQgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFsbCBmdW5jdGlvbnMgYXJlIGRlY2xhcmVkIGluIGZyZWV0eXBlLmguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9UUklHT05PTUVUUllfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2Vfb3V0bGluZQotCi0KLSAgc3RhdGljCi0gIGNvbnN0IEZUX091dGxpbmUgIG51bGxfb3V0bGluZSA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OwotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG91dGxuLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfRGVjb21wb3NlKCBGVF9PdXRsaW5lKiAgICAgICAgICAgICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX091dGxpbmVfRnVuY3MqICBmdW5jX2ludGVyZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICB1c2VyICkKLSAgewotI3VuZGVmICBTQ0FMRUQKLSNkZWZpbmUgU0NBTEVEKCB4ICkgICggKCAoeCkgPCAwID8gLSggLSh4KSA8PCBzaGlmdCApICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICggICh4KSA8PCBzaGlmdCApICkgLSBkZWx0YSApCi0KLSAgICBGVF9WZWN0b3IgICB2X2xhc3Q7Ci0gICAgRlRfVmVjdG9yICAgdl9jb250cm9sOwotICAgIEZUX1ZlY3RvciAgIHZfc3RhcnQ7Ci0KLSAgICBGVF9WZWN0b3IqICBwb2ludDsKLSAgICBGVF9WZWN0b3IqICBsaW1pdDsKLSAgICBjaGFyKiAgICAgICB0YWdzOwotCi0gICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0KLSAgICBGVF9JbnQgICBuOyAgICAgICAgIC8qIGluZGV4IG9mIGNvbnRvdXIgaW4gb3V0bGluZSAgICAgKi8KLSAgICBGVF9VSW50ICBmaXJzdDsgICAgIC8qIGluZGV4IG9mIGZpcnN0IHBvaW50IGluIGNvbnRvdXIgKi8KLSAgICBGVF9JbnQgICB0YWc7ICAgICAgIC8qIGN1cnJlbnQgcG9pbnQncyBzdGF0ZSAgICAgICAgICAgKi8KLQotICAgIEZUX0ludCAgIHNoaWZ0OwotICAgIEZUX1BvcyAgIGRlbHRhOwotCi0KLSAgICBpZiAoICFvdXRsaW5lICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9PdXRsaW5lICk7Ci0KLSAgICBpZiAoICFmdW5jX2ludGVyZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIHNoaWZ0ID0gZnVuY19pbnRlcmZhY2UtPnNoaWZ0OwotICAgIGRlbHRhID0gZnVuY19pbnRlcmZhY2UtPmRlbHRhOwotICAgIGZpcnN0ID0gMDsKLQotICAgIGZvciAoIG4gPSAwOyBuIDwgb3V0bGluZS0+bl9jb250b3VyczsgbisrICkKLSAgICB7Ci0gICAgICBGVF9JbnQgIGxhc3Q7ICAvKiBpbmRleCBvZiBsYXN0IHBvaW50IGluIGNvbnRvdXIgKi8KLQotCi0gICAgICBGVF9UUkFDRTUoKCAiRlRfT3V0bGluZV9EZWNvbXBvc2U6IE91dGxpbmUgJWRcbiIsIG4gKSk7Ci0KLSAgICAgIGxhc3QgPSBvdXRsaW5lLT5jb250b3Vyc1tuXTsKLSAgICAgIGlmICggbGFzdCA8IDAgKQotICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLSAgICAgIGxpbWl0ID0gb3V0bGluZS0+cG9pbnRzICsgbGFzdDsKLQotICAgICAgdl9zdGFydCAgID0gb3V0bGluZS0+cG9pbnRzW2ZpcnN0XTsKLSAgICAgIHZfc3RhcnQueCA9IFNDQUxFRCggdl9zdGFydC54ICk7Ci0gICAgICB2X3N0YXJ0LnkgPSBTQ0FMRUQoIHZfc3RhcnQueSApOwotCi0gICAgICB2X2xhc3QgICA9IG91dGxpbmUtPnBvaW50c1tsYXN0XTsKLSAgICAgIHZfbGFzdC54ID0gU0NBTEVEKCB2X2xhc3QueCApOwotICAgICAgdl9sYXN0LnkgPSBTQ0FMRUQoIHZfbGFzdC55ICk7Ci0KLSAgICAgIHZfY29udHJvbCA9IHZfc3RhcnQ7Ci0KLSAgICAgIHBvaW50ID0gb3V0bGluZS0+cG9pbnRzICsgZmlyc3Q7Ci0gICAgICB0YWdzICA9IG91dGxpbmUtPnRhZ3MgICArIGZpcnN0OwotICAgICAgdGFnICAgPSBGVF9DVVJWRV9UQUcoIHRhZ3NbMF0gKTsKLQotICAgICAgLyogQSBjb250b3VyIGNhbm5vdCBzdGFydCB3aXRoIGEgY3ViaWMgY29udHJvbCBwb2ludCEgKi8KLSAgICAgIGlmICggdGFnID09IEZUX0NVUlZFX1RBR19DVUJJQyApCi0gICAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotCi0gICAgICAvKiBjaGVjayBmaXJzdCBwb2ludCB0byBkZXRlcm1pbmUgb3JpZ2luICovCi0gICAgICBpZiAoIHRhZyA9PSBGVF9DVVJWRV9UQUdfQ09OSUMgKQotICAgICAgewotICAgICAgICAvKiBmaXJzdCBwb2ludCBpcyBjb25pYyBjb250cm9sLiAgWWVzLCB0aGlzIGhhcHBlbnMuICovCi0gICAgICAgIGlmICggRlRfQ1VSVkVfVEFHKCBvdXRsaW5lLT50YWdzW2xhc3RdICkgPT0gRlRfQ1VSVkVfVEFHX09OICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHN0YXJ0IGF0IGxhc3QgcG9pbnQgaWYgaXQgaXMgb24gdGhlIGN1cnZlICovCi0gICAgICAgICAgdl9zdGFydCA9IHZfbGFzdDsKLSAgICAgICAgICBsaW1pdC0tOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8qIGlmIGJvdGggZmlyc3QgYW5kIGxhc3QgcG9pbnRzIGFyZSBjb25pYywgICAgICAgICAqLwotICAgICAgICAgIC8qIHN0YXJ0IGF0IHRoZWlyIG1pZGRsZSBhbmQgcmVjb3JkIGl0cyBwb3NpdGlvbiAgICAqLwotICAgICAgICAgIC8qIGZvciBjbG9zdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIHZfc3RhcnQueCA9ICggdl9zdGFydC54ICsgdl9sYXN0LnggKSAvIDI7Ci0gICAgICAgICAgdl9zdGFydC55ID0gKCB2X3N0YXJ0LnkgKyB2X2xhc3QueSApIC8gMjsKLQotICAgICAgIC8qIHZfbGFzdCA9IHZfc3RhcnQ7ICovCi0gICAgICAgIH0KLSAgICAgICAgcG9pbnQtLTsKLSAgICAgICAgdGFncy0tOwotICAgICAgfQotCi0gICAgICBGVF9UUkFDRTUoKCAiICBtb3ZlIHRvICglLjJmLCAlLjJmKVxuIiwKLSAgICAgICAgICAgICAgICAgIHZfc3RhcnQueCAvIDY0LjAsIHZfc3RhcnQueSAvIDY0LjAgKSk7Ci0gICAgICBlcnJvciA9IGZ1bmNfaW50ZXJmYWNlLT5tb3ZlX3RvKCAmdl9zdGFydCwgdXNlciApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgd2hpbGUgKCBwb2ludCA8IGxpbWl0ICkKLSAgICAgIHsKLSAgICAgICAgcG9pbnQrKzsKLSAgICAgICAgdGFncysrOwotCi0gICAgICAgIHRhZyA9IEZUX0NVUlZFX1RBRyggdGFnc1swXSApOwotICAgICAgICBzd2l0Y2ggKCB0YWcgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgRlRfQ1VSVkVfVEFHX09OOiAgLyogZW1pdCBhIHNpbmdsZSBsaW5lX3RvICovCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVmVjdG9yICB2ZWM7Ci0KLQotICAgICAgICAgICAgdmVjLnggPSBTQ0FMRUQoIHBvaW50LT54ICk7Ci0gICAgICAgICAgICB2ZWMueSA9IFNDQUxFRCggcG9pbnQtPnkgKTsKLQotICAgICAgICAgICAgRlRfVFJBQ0U1KCggIiAgbGluZSB0byAoJS4yZiwgJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICB2ZWMueCAvIDY0LjAsIHZlYy55IC8gNjQuMCApKTsKLSAgICAgICAgICAgIGVycm9yID0gZnVuY19pbnRlcmZhY2UtPmxpbmVfdG8oICZ2ZWMsIHVzZXIgKTsKLSAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGVF9DVVJWRV9UQUdfQ09OSUM6ICAvKiBjb25zdW1lIGNvbmljIGFyY3MgKi8KLSAgICAgICAgICB2X2NvbnRyb2wueCA9IFNDQUxFRCggcG9pbnQtPnggKTsKLSAgICAgICAgICB2X2NvbnRyb2wueSA9IFNDQUxFRCggcG9pbnQtPnkgKTsKLQotICAgICAgICBEb19Db25pYzoKLSAgICAgICAgICBpZiAoIHBvaW50IDwgbGltaXQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1ZlY3RvciAgdmVjOwotICAgICAgICAgICAgRlRfVmVjdG9yICB2X21pZGRsZTsKLQotCi0gICAgICAgICAgICBwb2ludCsrOwotICAgICAgICAgICAgdGFncysrOwotICAgICAgICAgICAgdGFnID0gRlRfQ1VSVkVfVEFHKCB0YWdzWzBdICk7Ci0KLSAgICAgICAgICAgIHZlYy54ID0gU0NBTEVEKCBwb2ludC0+eCApOwotICAgICAgICAgICAgdmVjLnkgPSBTQ0FMRUQoIHBvaW50LT55ICk7Ci0KLSAgICAgICAgICAgIGlmICggdGFnID09IEZUX0NVUlZFX1RBR19PTiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX1RSQUNFNSgoICIgIGNvbmljIHRvICglLjJmLCAlLjJmKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRoIGNvbnRyb2wgKCUuMmYsICUuMmYpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMueCAvIDY0LjAsIHZlYy55IC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdl9jb250cm9sLnggLyA2NC4wLCB2X2NvbnRyb2wueSAvIDY0LjAgKSk7Ci0gICAgICAgICAgICAgIGVycm9yID0gZnVuY19pbnRlcmZhY2UtPmNvbmljX3RvKCAmdl9jb250cm9sLCAmdmVjLCB1c2VyICk7Ci0gICAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggdGFnICE9IEZUX0NVUlZFX1RBR19DT05JQyApCi0gICAgICAgICAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotCi0gICAgICAgICAgICB2X21pZGRsZS54ID0gKCB2X2NvbnRyb2wueCArIHZlYy54ICkgLyAyOwotICAgICAgICAgICAgdl9taWRkbGUueSA9ICggdl9jb250cm9sLnkgKyB2ZWMueSApIC8gMjsKLQotICAgICAgICAgICAgRlRfVFJBQ0U1KCggIiAgY29uaWMgdG8gKCUuMmYsICUuMmYpIgotICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRoIGNvbnRyb2wgKCUuMmYsICUuMmYpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgdl9taWRkbGUueCAvIDY0LjAsIHZfbWlkZGxlLnkgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgdl9jb250cm9sLnggLyA2NC4wLCB2X2NvbnRyb2wueSAvIDY0LjAgKSk7Ci0gICAgICAgICAgICBlcnJvciA9IGZ1bmNfaW50ZXJmYWNlLT5jb25pY190byggJnZfY29udHJvbCwgJnZfbWlkZGxlLCB1c2VyICk7Ci0gICAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgICB2X2NvbnRyb2wgPSB2ZWM7Ci0gICAgICAgICAgICBnb3RvIERvX0NvbmljOwotICAgICAgICAgIH0KLQotICAgICAgICAgIEZUX1RSQUNFNSgoICIgIGNvbmljIHRvICglLjJmLCAlLjJmKSIKLSAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggY29udHJvbCAoJS4yZiwgJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgdl9zdGFydC54IC8gNjQuMCwgdl9zdGFydC55IC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgICB2X2NvbnRyb2wueCAvIDY0LjAsIHZfY29udHJvbC55IC8gNjQuMCApKTsKLSAgICAgICAgICBlcnJvciA9IGZ1bmNfaW50ZXJmYWNlLT5jb25pY190byggJnZfY29udHJvbCwgJnZfc3RhcnQsIHVzZXIgKTsKLSAgICAgICAgICBnb3RvIENsb3NlOwotCi0gICAgICAgIGRlZmF1bHQ6ICAvKiBGVF9DVVJWRV9UQUdfQ1VCSUMgKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9WZWN0b3IgIHZlYzEsIHZlYzI7Ci0KLQotICAgICAgICAgICAgaWYgKCBwb2ludCArIDEgPiBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgRlRfQ1VSVkVfVEFHKCB0YWdzWzFdICkgIT0gRlRfQ1VSVkVfVEFHX0NVQklDICkKLSAgICAgICAgICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAgICAgICAgIHBvaW50ICs9IDI7Ci0gICAgICAgICAgICB0YWdzICArPSAyOwotCi0gICAgICAgICAgICB2ZWMxLnggPSBTQ0FMRUQoIHBvaW50Wy0yXS54ICk7Ci0gICAgICAgICAgICB2ZWMxLnkgPSBTQ0FMRUQoIHBvaW50Wy0yXS55ICk7Ci0KLSAgICAgICAgICAgIHZlYzIueCA9IFNDQUxFRCggcG9pbnRbLTFdLnggKTsKLSAgICAgICAgICAgIHZlYzIueSA9IFNDQUxFRCggcG9pbnRbLTFdLnkgKTsKLQotICAgICAgICAgICAgaWYgKCBwb2ludCA8PSBsaW1pdCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX1ZlY3RvciAgdmVjOwotCi0KLSAgICAgICAgICAgICAgdmVjLnggPSBTQ0FMRUQoIHBvaW50LT54ICk7Ci0gICAgICAgICAgICAgIHZlYy55ID0gU0NBTEVEKCBwb2ludC0+eSApOwotCi0gICAgICAgICAgICAgIEZUX1RSQUNFNSgoICIgIGN1YmljIHRvICglLjJmLCAlLjJmKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRoIGNvbnRyb2xzICglLjJmLCAlLjJmKSBhbmQgKCUuMmYsICUuMmYpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMueCAvIDY0LjAsIHZlYy55IC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMS54IC8gNjQuMCwgdmVjMS55IC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMi54IC8gNjQuMCwgdmVjMi55IC8gNjQuMCApKTsKLSAgICAgICAgICAgICAgZXJyb3IgPSBmdW5jX2ludGVyZmFjZS0+Y3ViaWNfdG8oICZ2ZWMxLCAmdmVjMiwgJnZlYywgdXNlciApOwotICAgICAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGVF9UUkFDRTUoKCAiICBjdWJpYyB0byAoJS4yZiwgJS4yZikiCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggY29udHJvbHMgKCUuMmYsICUuMmYpIGFuZCAoJS4yZiwgJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICB2X3N0YXJ0LnggLyA2NC4wLCB2X3N0YXJ0LnkgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgdmVjMS54IC8gNjQuMCwgdmVjMS55IC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIueCAvIDY0LjAsIHZlYzIueSAvIDY0LjAgKSk7Ci0gICAgICAgICAgICBlcnJvciA9IGZ1bmNfaW50ZXJmYWNlLT5jdWJpY190byggJnZlYzEsICZ2ZWMyLCAmdl9zdGFydCwgdXNlciApOwotICAgICAgICAgICAgZ290byBDbG9zZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogY2xvc2UgdGhlIGNvbnRvdXIgd2l0aCBhIGxpbmUgc2VnbWVudCAqLwotICAgICAgRlRfVFJBQ0U1KCggIiAgbGluZSB0byAoJS4yZiwgJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgICB2X3N0YXJ0LnggLyA2NC4wLCB2X3N0YXJ0LnkgLyA2NC4wICkpOwotICAgICAgZXJyb3IgPSBmdW5jX2ludGVyZmFjZS0+bGluZV90byggJnZfc3RhcnQsIHVzZXIgKTsKLQotICAgIENsb3NlOgotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZmlyc3QgPSAoRlRfVUludClsYXN0ICsgMTsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTUoKCAiRlRfT3V0bGluZV9EZWNvbXBvc2U6IERvbmVcbiIsIG4gKSk7Ci0gICAgcmV0dXJuIEZUX0Vycl9PazsKLQotICBFeGl0OgotICAgIEZUX1RSQUNFNSgoICJGVF9PdXRsaW5lX0RlY29tcG9zZTogRXJyb3IgJWRcbiIsIGVycm9yICkpOwotICAgIHJldHVybiBlcnJvcjsKLQotICBJbnZhbGlkX091dGxpbmU6Ci0gICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX091dGxpbmUgKTsKLSAgfQotCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX05ld19JbnRlcm5hbCggRlRfTWVtb3J5ICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBudW1Qb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgbnVtQ29udG91cnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lICAqYW5vdXRsaW5lICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgaWYgKCAhYW5vdXRsaW5lIHx8ICFtZW1vcnkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICAqYW5vdXRsaW5lID0gbnVsbF9vdXRsaW5lOwotCi0gICAgaWYgKCBudW1Db250b3VycyA8IDAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgKEZUX1VJbnQpbnVtQ29udG91cnMgPiBudW1Qb2ludHMgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBpZiAoIG51bVBvaW50cyA+IEZUX09VVExJTkVfUE9JTlRTX01BWCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEFycmF5X1Rvb19MYXJnZSApOwotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIGFub3V0bGluZS0+cG9pbnRzLCAgIG51bVBvaW50cyAgICkgfHwKLSAgICAgICAgIEZUX05FV19BUlJBWSggYW5vdXRsaW5lLT50YWdzLCAgICAgbnVtUG9pbnRzICAgKSB8fAotICAgICAgICAgRlRfTkVXX0FSUkFZKCBhbm91dGxpbmUtPmNvbnRvdXJzLCBudW1Db250b3VycyApICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIGFub3V0bGluZS0+bl9wb2ludHMgICAgPSAoRlRfU2hvcnQpbnVtUG9pbnRzOwotICAgIGFub3V0bGluZS0+bl9jb250b3VycyAgPSAoRlRfU2hvcnQpbnVtQ29udG91cnM7Ci0gICAgYW5vdXRsaW5lLT5mbGFncyAgICAgIHw9IEZUX09VVExJTkVfT1dORVI7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gIEZhaWw6Ci0gICAgYW5vdXRsaW5lLT5mbGFncyB8PSBGVF9PVVRMSU5FX09XTkVSOwotICAgIEZUX091dGxpbmVfRG9uZV9JbnRlcm5hbCggbWVtb3J5LCBhbm91dGxpbmUgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG91dGxuLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfTmV3KCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBudW1Qb2ludHMsCi0gICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgbnVtQ29udG91cnMsCi0gICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lICAqYW5vdXRsaW5lICkKLSAgewotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0xpYnJhcnlfSGFuZGxlICk7Ci0KLSAgICByZXR1cm4gRlRfT3V0bGluZV9OZXdfSW50ZXJuYWwoIGxpYnJhcnktPm1lbW9yeSwgbnVtUG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ29udG91cnMsIGFub3V0bGluZSApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b3V0bG4uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9DaGVjayggRlRfT3V0bGluZSogIG91dGxpbmUgKQotICB7Ci0gICAgaWYgKCBvdXRsaW5lICkKLSAgICB7Ci0gICAgICBGVF9JbnQgIG5fcG9pbnRzICAgPSBvdXRsaW5lLT5uX3BvaW50czsKLSAgICAgIEZUX0ludCAgbl9jb250b3VycyA9IG91dGxpbmUtPm5fY29udG91cnM7Ci0gICAgICBGVF9JbnQgIGVuZDAsIGVuZDsKLSAgICAgIEZUX0ludCAgbjsKLQotCi0gICAgICAvKiBlbXB0eSBnbHlwaD8gKi8KLSAgICAgIGlmICggbl9wb2ludHMgPT0gMCAmJiBuX2NvbnRvdXJzID09IDAgKQotICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgICAvKiBjaGVjayBwb2ludCBhbmQgY29udG91ciBjb3VudHMgKi8KLSAgICAgIGlmICggbl9wb2ludHMgPD0gMCB8fCBuX2NvbnRvdXJzIDw9IDAgKQotICAgICAgICBnb3RvIEJhZDsKLQotICAgICAgZW5kMCA9IGVuZCA9IC0xOwotICAgICAgZm9yICggbiA9IDA7IG4gPCBuX2NvbnRvdXJzOyBuKysgKQotICAgICAgewotICAgICAgICBlbmQgPSBvdXRsaW5lLT5jb250b3Vyc1tuXTsKLQotICAgICAgICAvKiBub3RlIHRoYXQgd2UgZG9uJ3QgYWNjZXB0IGVtcHR5IGNvbnRvdXJzICovCi0gICAgICAgIGlmICggZW5kIDw9IGVuZDAgfHwgZW5kID49IG5fcG9pbnRzICkKLSAgICAgICAgICBnb3RvIEJhZDsKLQotICAgICAgICBlbmQwID0gZW5kOwotICAgICAgfQotCi0gICAgICBpZiAoIGVuZCAhPSBuX3BvaW50cyAtIDEgKQotICAgICAgICBnb3RvIEJhZDsKLQotICAgICAgLyogWFhYOiBjaGVjayB0aGUgdGFncyBhcnJheSAqLwotICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICB9Ci0KLSAgQmFkOgotICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b3V0bG4uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9Db3B5KCBjb25zdCBGVF9PdXRsaW5lKiAgc291cmNlLAotICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUgICAgICAgICp0YXJnZXQgKQotICB7Ci0gICAgRlRfSW50ICBpc19vd25lcjsKLQotCi0gICAgaWYgKCAhc291cmNlIHx8ICF0YXJnZXQgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX091dGxpbmUgKTsKLQotICAgIGlmICggc291cmNlLT5uX3BvaW50cyAgICE9IHRhcmdldC0+bl9wb2ludHMgICB8fAotICAgICAgICAgc291cmNlLT5uX2NvbnRvdXJzICE9IHRhcmdldC0+bl9jb250b3VycyApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGlmICggc291cmNlID09IHRhcmdldCApCi0gICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgRlRfQVJSQVlfQ09QWSggdGFyZ2V0LT5wb2ludHMsIHNvdXJjZS0+cG9pbnRzLCBzb3VyY2UtPm5fcG9pbnRzICk7Ci0KLSAgICBGVF9BUlJBWV9DT1BZKCB0YXJnZXQtPnRhZ3MsIHNvdXJjZS0+dGFncywgc291cmNlLT5uX3BvaW50cyApOwotCi0gICAgRlRfQVJSQVlfQ09QWSggdGFyZ2V0LT5jb250b3Vycywgc291cmNlLT5jb250b3Vycywgc291cmNlLT5uX2NvbnRvdXJzICk7Ci0KLSAgICAvKiBjb3B5IGFsbCBmbGFncywgZXhjZXB0IHRoZSBgRlRfT1VUTElORV9PV05FUicgb25lICovCi0gICAgaXNfb3duZXIgICAgICA9IHRhcmdldC0+ZmxhZ3MgJiBGVF9PVVRMSU5FX09XTkVSOwotICAgIHRhcmdldC0+ZmxhZ3MgPSBzb3VyY2UtPmZsYWdzOwotCi0gICAgdGFyZ2V0LT5mbGFncyAmPSB+RlRfT1VUTElORV9PV05FUjsKLSAgICB0YXJnZXQtPmZsYWdzIHw9IGlzX293bmVyOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX0RvbmVfSW50ZXJuYWwoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogIG91dGxpbmUgKQotICB7Ci0gICAgaWYgKCAhb3V0bGluZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfT3V0bGluZSApOwotCi0gICAgaWYgKCAhbWVtb3J5ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgaWYgKCBvdXRsaW5lLT5mbGFncyAmIEZUX09VVExJTkVfT1dORVIgKQotICAgIHsKLSAgICAgIEZUX0ZSRUUoIG91dGxpbmUtPnBvaW50cyAgICk7Ci0gICAgICBGVF9GUkVFKCBvdXRsaW5lLT50YWdzICAgICApOwotICAgICAgRlRfRlJFRSggb3V0bGluZS0+Y29udG91cnMgKTsKLSAgICB9Ci0gICAgKm91dGxpbmUgPSBudWxsX291dGxpbmU7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b3V0bG4uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9Eb25lKCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSApCi0gIHsKLSAgICAvKiBjaGVjayBmb3IgdmFsaWQgYG91dGxpbmUnIGluIEZUX091dGxpbmVfRG9uZV9JbnRlcm5hbCgpICovCi0KLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9MaWJyYXJ5X0hhbmRsZSApOwotCi0gICAgcmV0dXJuIEZUX091dGxpbmVfRG9uZV9JbnRlcm5hbCggbGlicmFyeS0+bWVtb3J5LCBvdXRsaW5lICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvdXRsbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX091dGxpbmVfR2V0X0NCb3goIGNvbnN0IEZUX091dGxpbmUqICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9CQm94ICAgICAgICAgICAqYWNib3ggKQotICB7Ci0gICAgRlRfUG9zICB4TWluLCB5TWluLCB4TWF4LCB5TWF4OwotCi0KLSAgICBpZiAoIG91dGxpbmUgJiYgYWNib3ggKQotICAgIHsKLSAgICAgIGlmICggb3V0bGluZS0+bl9wb2ludHMgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIHhNaW4gPSAwOwotICAgICAgICB5TWluID0gMDsKLSAgICAgICAgeE1heCA9IDA7Ci0gICAgICAgIHlNYXggPSAwOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBGVF9WZWN0b3IqICB2ZWMgICA9IG91dGxpbmUtPnBvaW50czsKLSAgICAgICAgRlRfVmVjdG9yKiAgbGltaXQgPSB2ZWMgKyBvdXRsaW5lLT5uX3BvaW50czsKLQotCi0gICAgICAgIHhNaW4gPSB4TWF4ID0gdmVjLT54OwotICAgICAgICB5TWluID0geU1heCA9IHZlYy0+eTsKLSAgICAgICAgdmVjKys7Ci0KLSAgICAgICAgZm9yICggOyB2ZWMgPCBsaW1pdDsgdmVjKysgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfUG9zICB4LCB5OwotCi0KLSAgICAgICAgICB4ID0gdmVjLT54OwotICAgICAgICAgIGlmICggeCA8IHhNaW4gKSB4TWluID0geDsKLSAgICAgICAgICBpZiAoIHggPiB4TWF4ICkgeE1heCA9IHg7Ci0KLSAgICAgICAgICB5ID0gdmVjLT55OwotICAgICAgICAgIGlmICggeSA8IHlNaW4gKSB5TWluID0geTsKLSAgICAgICAgICBpZiAoIHkgPiB5TWF4ICkgeU1heCA9IHk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGFjYm94LT54TWluID0geE1pbjsKLSAgICAgIGFjYm94LT54TWF4ID0geE1heDsKLSAgICAgIGFjYm94LT55TWluID0geU1pbjsKLSAgICAgIGFjYm94LT55TWF4ID0geU1heDsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvdXRsbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX091dGxpbmVfVHJhbnNsYXRlKCBjb25zdCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgICAgICB4T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICAgICAgIHlPZmZzZXQgKQotICB7Ci0gICAgRlRfVVNob3J0ICAgbjsKLSAgICBGVF9WZWN0b3IqICB2ZWM7Ci0KLQotICAgIGlmICggIW91dGxpbmUgKQotICAgICAgcmV0dXJuOwotCi0gICAgdmVjID0gb3V0bGluZS0+cG9pbnRzOwotCi0gICAgZm9yICggbiA9IDA7IG4gPCBvdXRsaW5lLT5uX3BvaW50czsgbisrICkKLSAgICB7Ci0gICAgICB2ZWMtPnggKz0geE9mZnNldDsKLSAgICAgIHZlYy0+eSArPSB5T2Zmc2V0OwotICAgICAgdmVjKys7Ci0gICAgfQotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b3V0bG4uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9PdXRsaW5lX1JldmVyc2UoIEZUX091dGxpbmUqICBvdXRsaW5lICkKLSAgewotICAgIEZUX1VTaG9ydCAgbjsKLSAgICBGVF9JbnQgICAgIGZpcnN0LCBsYXN0OwotCi0KLSAgICBpZiAoICFvdXRsaW5lICkKLSAgICAgIHJldHVybjsKLQotICAgIGZpcnN0ID0gMDsKLQotICAgIGZvciAoIG4gPSAwOyBuIDwgb3V0bGluZS0+bl9jb250b3VyczsgbisrICkKLSAgICB7Ci0gICAgICBsYXN0ICA9IG91dGxpbmUtPmNvbnRvdXJzW25dOwotCi0gICAgICAvKiByZXZlcnNlIHBvaW50IHRhYmxlICovCi0gICAgICB7Ci0gICAgICAgIEZUX1ZlY3RvciogIHAgPSBvdXRsaW5lLT5wb2ludHMgKyBmaXJzdDsKLSAgICAgICAgRlRfVmVjdG9yKiAgcSA9IG91dGxpbmUtPnBvaW50cyArIGxhc3Q7Ci0gICAgICAgIEZUX1ZlY3RvciAgIHN3YXA7Ci0KLQotICAgICAgICB3aGlsZSAoIHAgPCBxICkKLSAgICAgICAgewotICAgICAgICAgIHN3YXAgPSAqcDsKLSAgICAgICAgICAqcCAgID0gKnE7Ci0gICAgICAgICAgKnEgICA9IHN3YXA7Ci0gICAgICAgICAgcCsrOwotICAgICAgICAgIHEtLTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiByZXZlcnNlIHRhZ3MgdGFibGUgKi8KLSAgICAgIHsKLSAgICAgICAgY2hhciogIHAgPSBvdXRsaW5lLT50YWdzICsgZmlyc3Q7Ci0gICAgICAgIGNoYXIqICBxID0gb3V0bGluZS0+dGFncyArIGxhc3Q7Ci0KLQotICAgICAgICB3aGlsZSAoIHAgPCBxICkKLSAgICAgICAgewotICAgICAgICAgIGNoYXIgIHN3YXA7Ci0KLQotICAgICAgICAgIHN3YXAgPSAqcDsKLSAgICAgICAgICAqcCAgID0gKnE7Ci0gICAgICAgICAgKnEgICA9IHN3YXA7Ci0gICAgICAgICAgcCsrOwotICAgICAgICAgIHEtLTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBmaXJzdCA9IGxhc3QgKyAxOwotICAgIH0KLQotICAgIG91dGxpbmUtPmZsYWdzIF49IEZUX09VVExJTkVfUkVWRVJTRV9GSUxMOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b3V0bG4uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfT3V0bGluZV9SZW5kZXIoIEZUX0xpYnJhcnkgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgICAgIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9SYXN0ZXJfUGFyYW1zKiAgcGFyYW1zICkKLSAgewotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICBGVF9SZW5kZXJlciAgcmVuZGVyZXI7Ci0gICAgRlRfTGlzdE5vZGUgIG5vZGU7Ci0KLQotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0xpYnJhcnlfSGFuZGxlICk7Ci0KLSAgICBpZiAoICFvdXRsaW5lICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9PdXRsaW5lICk7Ci0KLSAgICBpZiAoICFwYXJhbXMgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICByZW5kZXJlciA9IGxpYnJhcnktPmN1cl9yZW5kZXJlcjsKLSAgICBub2RlICAgICA9IGxpYnJhcnktPnJlbmRlcmVycy5oZWFkOwotCi0gICAgcGFyYW1zLT5zb3VyY2UgPSAodm9pZCopb3V0bGluZTsKLQotICAgIGVycm9yID0gRlRfRVJSKCBDYW5ub3RfUmVuZGVyX0dseXBoICk7Ci0gICAgd2hpbGUgKCByZW5kZXJlciApCi0gICAgewotICAgICAgZXJyb3IgPSByZW5kZXJlci0+cmFzdGVyX3JlbmRlciggcmVuZGVyZXItPnJhc3RlciwgcGFyYW1zICk7Ci0gICAgICBpZiAoICFlcnJvciB8fCBGVF9FUlJfTkVRKCBlcnJvciwgQ2Fubm90X1JlbmRlcl9HbHlwaCApICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIEZUX0Vycl9DYW5ub3RfUmVuZGVyX0dseXBoIGlzIHJldHVybmVkIGlmIHRoZSByZW5kZXIgbW9kZSAgICovCi0gICAgICAvKiBpcyB1bnN1cHBvcnRlZCBieSB0aGUgY3VycmVudCByZW5kZXJlciBmb3IgdGhpcyBnbHlwaCBpbWFnZSAqLwotICAgICAgLyogZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgLyogbm93LCBsb29rIGZvciBhbm90aGVyIHJlbmRlcmVyIHRoYXQgc3VwcG9ydHMgdGhlIHNhbWUgKi8KLSAgICAgIC8qIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICByZW5kZXJlciA9IEZUX0xvb2t1cF9SZW5kZXJlciggbGlicmFyeSwgRlRfR0xZUEhfRk9STUFUX09VVExJTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5vZGUgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvdXRsbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX0dldF9CaXRtYXAoIEZUX0xpYnJhcnkgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CaXRtYXAgICphYml0bWFwICkKLSAgewotICAgIEZUX1Jhc3Rlcl9QYXJhbXMgIHBhcmFtczsKLQotCi0gICAgaWYgKCAhYWJpdG1hcCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIC8qIG90aGVyIGNoZWNrcyBhcmUgZGVsYXllZCB0byBgRlRfT3V0bGluZV9SZW5kZXInICovCi0KLSAgICBwYXJhbXMudGFyZ2V0ID0gYWJpdG1hcDsKLSAgICBwYXJhbXMuZmxhZ3MgID0gMDsKLQotICAgIGlmICggYWJpdG1hcC0+cGl4ZWxfbW9kZSA9PSBGVF9QSVhFTF9NT0RFX0dSQVkgIHx8Ci0gICAgICAgICBhYml0bWFwLT5waXhlbF9tb2RlID09IEZUX1BJWEVMX01PREVfTENEICAgfHwKLSAgICAgICAgIGFiaXRtYXAtPnBpeGVsX21vZGUgPT0gRlRfUElYRUxfTU9ERV9MQ0RfViApCi0gICAgICBwYXJhbXMuZmxhZ3MgfD0gRlRfUkFTVEVSX0ZMQUdfQUE7Ci0KLSAgICByZXR1cm4gRlRfT3V0bGluZV9SZW5kZXIoIGxpYnJhcnksIG91dGxpbmUsICZwYXJhbXMgKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX1ZlY3Rvcl9UcmFuc2Zvcm0oIEZUX1ZlY3RvciogICAgICAgIHZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfTWF0cml4KiAgbWF0cml4ICkKLSAgewotICAgIEZUX1BvcyAgeHosIHl6OwotCi0KLSAgICBpZiAoICF2ZWN0b3IgfHwgIW1hdHJpeCApCi0gICAgICByZXR1cm47Ci0KLSAgICB4eiA9IEZUX011bEZpeCggdmVjdG9yLT54LCBtYXRyaXgtPnh4ICkgKwotICAgICAgICAgRlRfTXVsRml4KCB2ZWN0b3ItPnksIG1hdHJpeC0+eHkgKTsKLQotICAgIHl6ID0gRlRfTXVsRml4KCB2ZWN0b3ItPngsIG1hdHJpeC0+eXggKSArCi0gICAgICAgICBGVF9NdWxGaXgoIHZlY3Rvci0+eSwgbWF0cml4LT55eSApOwotCi0gICAgdmVjdG9yLT54ID0geHo7Ci0gICAgdmVjdG9yLT55ID0geXo7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvdXRsbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX091dGxpbmVfVHJhbnNmb3JtKCBjb25zdCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX01hdHJpeCogICBtYXRyaXggKQotICB7Ci0gICAgRlRfVmVjdG9yKiAgdmVjOwotICAgIEZUX1ZlY3RvciogIGxpbWl0OwotCi0KLSAgICBpZiAoICFvdXRsaW5lIHx8ICFtYXRyaXggKQotICAgICAgcmV0dXJuOwotCi0gICAgdmVjICAgPSBvdXRsaW5lLT5wb2ludHM7Ci0gICAgbGltaXQgPSB2ZWMgKyBvdXRsaW5lLT5uX3BvaW50czsKLQotICAgIGZvciAoIDsgdmVjIDwgbGltaXQ7IHZlYysrICkKLSAgICAgIEZUX1ZlY3Rvcl9UcmFuc2Zvcm0oIHZlYywgbWF0cml4ICk7Ci0gIH0KLQotCi0jaWYgMAotCi0jZGVmaW5lIEZUX09VVExJTkVfR0VUX0NPTlRPVVIoIG91dGxpbmUsIGMsIGZpcnN0LCBsYXN0ICkgIFwKLSAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKGZpcnN0KSA9ICggYyA+IDAgKSA/IChvdXRsaW5lKS0+cG9pbnRzICsgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3V0bGluZSktPmNvbnRvdXJzW2MgLSAxXSArIDEgXAotICAgICAgICAgICAgICAgICAgICAgICAgOiAob3V0bGluZSktPnBvaW50czsgICAgICAgICAgICAgICBcCi0gICAgKGxhc3QpID0gKG91dGxpbmUpLT5wb2ludHMgKyAob3V0bGluZSktPmNvbnRvdXJzW2NdOyAgIFwKLSAgfSB3aGlsZSAoIDAgKQotCi0KLSAgLyogSXMgYSBwb2ludCBpbiBzb21lIGNvbnRvdXI/ICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogV2UgdHJlYXQgZXZlcnkgcG9pbnQgb2YgdGhlIGNvbnRvdXIgYXMgaWYgaXQgICAgKi8KLSAgLyogaXQgd2VyZSBPTi4gIFRoYXQgaXMsIHdlIGFsbG93IGZhbHNlIHBvc2l0aXZlcywgKi8KLSAgLyogYnV0IGRpc2FsbG93IGZhbHNlIG5lZ2F0aXZlcy4gIChYWFggcmVhbGx5PykgICAgKi8KLSAgc3RhdGljIEZUX0Jvb2wKLSAgZnRfY29udG91cl9oYXMoIEZUX091dGxpbmUqICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgRlRfU2hvcnQgICAgIGMsCi0gICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAgcG9pbnQgKQotICB7Ci0gICAgRlRfVmVjdG9yKiAgZmlyc3Q7Ci0gICAgRlRfVmVjdG9yKiAgbGFzdDsKLSAgICBGVF9WZWN0b3IqICBhOwotICAgIEZUX1ZlY3RvciogIGI7Ci0gICAgRlRfVUludCAgICAgbiA9IDA7Ci0KLQotICAgIEZUX09VVExJTkVfR0VUX0NPTlRPVVIoIG91dGxpbmUsIGMsIGZpcnN0LCBsYXN0ICk7Ci0KLSAgICBmb3IgKCBhID0gZmlyc3Q7IGEgPD0gbGFzdDsgYSsrICkKLSAgICB7Ci0gICAgICBGVF9Qb3MgIHg7Ci0gICAgICBGVF9JbnQgIGludGVyc2VjdDsKLQotCi0gICAgICBiID0gKCBhID09IGxhc3QgKSA/IGZpcnN0IDogYSArIDE7Ci0KLSAgICAgIGludGVyc2VjdCA9ICggYS0+eSAtIHBvaW50LT55ICkgXiAoIGItPnkgLSBwb2ludC0+eSApOwotCi0gICAgICAvKiBhIGFuZCBiIGFyZSBvbiB0aGUgc2FtZSBzaWRlICovCi0gICAgICBpZiAoIGludGVyc2VjdCA+PSAwICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBpbnRlcnNlY3QgPT0gMCAmJiBhLT55ID09IHBvaW50LT55ICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggKCBhLT54IDw9IHBvaW50LT54ICYmIGItPnggPj0gcG9pbnQtPnggKSB8fAotICAgICAgICAgICAgICAgKCBhLT54ID49IHBvaW50LT54ICYmIGItPnggPD0gcG9pbnQtPnggKSApCi0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICB4ID0gYS0+eCArICggYi0+eCAtIGEtPnggKSAqIChwb2ludC0+eSAtIGEtPnkgKSAvICggYi0+eSAtIGEtPnkgKTsKLQotICAgICAgaWYgKCB4IDwgcG9pbnQtPnggKQotICAgICAgICBuKys7Ci0gICAgICBlbHNlIGlmICggeCA9PSBwb2ludC0+eCApCi0gICAgICAgIHJldHVybiAxOwotICAgIH0KLQotICAgIHJldHVybiBuICYgMTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Jvb2wKLSAgZnRfY29udG91cl9lbmNsb3NlZCggRlRfT3V0bGluZSogIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICBjICkKLSAgewotICAgIEZUX1ZlY3RvciogIGZpcnN0OwotICAgIEZUX1ZlY3RvciogIGxhc3Q7Ci0gICAgRlRfU2hvcnQgICAgaTsKLQotCi0gICAgRlRfT1VUTElORV9HRVRfQ09OVE9VUiggb3V0bGluZSwgYywgZmlyc3QsIGxhc3QgKTsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgb3V0bGluZS0+bl9jb250b3VyczsgaSsrICkKLSAgICB7Ci0gICAgICBpZiAoIGkgIT0gYyAmJiBmdF9jb250b3VyX2hhcyggb3V0bGluZSwgaSwgZmlyc3QgKSApCi0gICAgICB7Ci0gICAgICAgIEZUX1ZlY3RvciogIHB0OwotCi0KLSAgICAgICAgZm9yICggcHQgPSBmaXJzdCArIDE7IHB0IDw9IGxhc3Q7IHB0KysgKQotICAgICAgICAgIGlmICggIWZ0X2NvbnRvdXJfaGFzKCBvdXRsaW5lLCBpLCBwdCApICkKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgICAgIHJldHVybiAxOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICAvKiBUaGlzIHZlcnNpb24gZGlmZmVycyBmcm9tIHRoZSBwdWJsaWMgb25lIGluIHRoYXQgZWFjaCAqLwotICAvKiBwYXJ0IChjb250b3VyIG5vdCBlbmNsb3NlZCBpbiBhbm90aGVyIGNvbnRvdXIpIG9mIHRoZSAqLwotICAvKiBvdXRsaW5lIGlzIGNoZWNrZWQgZm9yIG9yaWVudGF0aW9uLiAgVGhpcyBpcyAgICAgICAgICAqLwotICAvKiBuZWNlc3NhcnkgZm9yIHNvbWUgYnVnZ3kgQ0pLIGZvbnRzLiAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfT3JpZW50YXRpb24KLSAgZnRfb3V0bGluZV9nZXRfb3JpZW50YXRpb24oIEZUX091dGxpbmUqICBvdXRsaW5lICkKLSAgewotICAgIEZUX1Nob3J0ICAgICAgICBpOwotICAgIEZUX1ZlY3RvciogICAgICBmaXJzdDsKLSAgICBGVF9WZWN0b3IqICAgICAgbGFzdDsKLSAgICBGVF9PcmllbnRhdGlvbiAgb3JpZW50ID0gRlRfT1JJRU5UQVRJT05fTk9ORTsKLQotCi0gICAgZmlyc3QgPSBvdXRsaW5lLT5wb2ludHM7Ci0gICAgZm9yICggaSA9IDA7IGkgPCBvdXRsaW5lLT5uX2NvbnRvdXJzOyBpKyssIGZpcnN0ID0gbGFzdCArIDEgKQotICAgIHsKLSAgICAgIEZUX1ZlY3RvciogIHBvaW50OwotICAgICAgRlRfVmVjdG9yKiAgeG1pbl9wb2ludDsKLSAgICAgIEZUX1BvcyAgICAgIHhtaW47Ci0KLQotICAgICAgbGFzdCA9IG91dGxpbmUtPnBvaW50cyArIG91dGxpbmUtPmNvbnRvdXJzW2ldOwotCi0gICAgICAvKiBza2lwIGRlZ2VuZXJhdGUgY29udG91cnMgKi8KLSAgICAgIGlmICggbGFzdCA8IGZpcnN0ICsgMiApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBpZiAoIGZ0X2NvbnRvdXJfZW5jbG9zZWQoIG91dGxpbmUsIGkgKSApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICB4bWluICAgICAgID0gZmlyc3QtPng7Ci0gICAgICB4bWluX3BvaW50ID0gZmlyc3Q7Ci0KLSAgICAgIGZvciAoIHBvaW50ID0gZmlyc3QgKyAxOyBwb2ludCA8PSBsYXN0OyBwb2ludCsrICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBwb2ludC0+eCA8IHhtaW4gKQotICAgICAgICB7Ci0gICAgICAgICAgeG1pbiAgICAgICA9IHBvaW50LT54OwotICAgICAgICAgIHhtaW5fcG9pbnQgPSBwb2ludDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBjaGVjayB0aGUgb3JpZW50YXRpb24gb2YgdGhlIGNvbnRvdXIgKi8KLSAgICAgIHsKLSAgICAgICAgRlRfVmVjdG9yKiAgICAgIHByZXY7Ci0gICAgICAgIEZUX1ZlY3RvciogICAgICBuZXh0OwotICAgICAgICBGVF9PcmllbnRhdGlvbiAgbzsKLQotCi0gICAgICAgIHByZXYgPSAoIHhtaW5fcG9pbnQgPT0gZmlyc3QgKSA/IGxhc3QgOiB4bWluX3BvaW50IC0gMTsKLSAgICAgICAgbmV4dCA9ICggeG1pbl9wb2ludCA9PSBsYXN0ICkgPyBmaXJzdCA6IHhtaW5fcG9pbnQgKyAxOwotCi0gICAgICAgIGlmICggRlRfQXRhbjIoIHByZXYtPnggLSB4bWluX3BvaW50LT54LCBwcmV2LT55IC0geG1pbl9wb2ludC0+eSApID4KLSAgICAgICAgICAgICBGVF9BdGFuMiggbmV4dC0+eCAtIHhtaW5fcG9pbnQtPngsIG5leHQtPnkgLSB4bWluX3BvaW50LT55ICkgKQotICAgICAgICAgIG8gPSBGVF9PUklFTlRBVElPTl9QT1NUU0NSSVBUOwotICAgICAgICBlbHNlCi0gICAgICAgICAgbyA9IEZUX09SSUVOVEFUSU9OX1RSVUVUWVBFOwotCi0gICAgICAgIGlmICggb3JpZW50ID09IEZUX09SSUVOVEFUSU9OX05PTkUgKQotICAgICAgICAgIG9yaWVudCA9IG87Ci0gICAgICAgIGVsc2UgaWYgKCBvcmllbnQgIT0gbyApCi0gICAgICAgICAgcmV0dXJuIEZUX09SSUVOVEFUSU9OX05PTkU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG9yaWVudDsKLSAgfQotCi0jZW5kaWYgLyogMCAqLwotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG91dGxuLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX091dGxpbmVfRW1ib2xkZW4oIEZUX091dGxpbmUqICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgc3RyZW5ndGggKQotICB7Ci0gICAgcmV0dXJuIEZUX091dGxpbmVfRW1ib2xkZW5YWSggb3V0bGluZSwgc3RyZW5ndGgsIHN0cmVuZ3RoICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvdXRsbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9PdXRsaW5lX0VtYm9sZGVuWFkoIEZUX091dGxpbmUqICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICB4c3RyZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgIHlzdHJlbmd0aCApCi0gIHsKLSAgICBGVF9WZWN0b3IqICBwb2ludHM7Ci0gICAgRlRfSW50ICAgICAgYywgZmlyc3QsIGxhc3Q7Ci0gICAgRlRfSW50ICAgICAgb3JpZW50YXRpb247Ci0KLQotICAgIGlmICggIW91dGxpbmUgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX091dGxpbmUgKTsKLQotICAgIHhzdHJlbmd0aCAvPSAyOwotICAgIHlzdHJlbmd0aCAvPSAyOwotICAgIGlmICggeHN0cmVuZ3RoID09IDAgJiYgeXN0cmVuZ3RoID09IDAgKQotICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLQotICAgIG9yaWVudGF0aW9uID0gRlRfT3V0bGluZV9HZXRfT3JpZW50YXRpb24oIG91dGxpbmUgKTsKLSAgICBpZiAoIG9yaWVudGF0aW9uID09IEZUX09SSUVOVEFUSU9OX05PTkUgKQotICAgIHsKLSAgICAgIGlmICggb3V0bGluZS0+bl9jb250b3VycyApCi0gICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgIH0KLQotICAgIHBvaW50cyA9IG91dGxpbmUtPnBvaW50czsKLQotICAgIGZpcnN0ID0gMDsKLSAgICBmb3IgKCBjID0gMDsgYyA8IG91dGxpbmUtPm5fY29udG91cnM7IGMrKyApCi0gICAgewotICAgICAgRlRfVmVjdG9yICBpbiwgb3V0LCBhbmNob3IsIHNoaWZ0OwotICAgICAgRlRfRml4ZWQgICBsX2luLCBsX291dCwgbF9hbmNob3IgPSAwLCBsLCBxLCBkOwotICAgICAgRlRfSW50ICAgICBpLCBqLCBrOwotCi0KLSAgICAgIGxfaW4gPSAwOwotICAgICAgbGFzdCA9IG91dGxpbmUtPmNvbnRvdXJzW2NdOwotCi0gICAgICAvKiBDb3VudGVyIGogY3ljbGVzIHRob3VnaCB0aGUgcG9pbnRzOyBjb3VudGVyIGkgYWR2YW5jZXMgb25seSAgKi8KLSAgICAgIC8qIHdoZW4gcG9pbnRzIGFyZSBtb3ZlZDsgYW5jaG9yIGsgbWFya3MgdGhlIGZpcnN0IG1vdmVkIHBvaW50LiAqLwotICAgICAgZm9yICggaSA9IGxhc3QsIGogPSBmaXJzdCwgayA9IC0xOwotICAgICAgICAgICAgaiAhPSBpICYmIGkgIT0gazsKLSAgICAgICAgICAgIGogPSBqIDwgbGFzdCA/IGogKyAxIDogZmlyc3QgKQotICAgICAgewotICAgICAgICBpZiAoIGogIT0gayApCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQueCA9IHBvaW50c1tqXS54IC0gcG9pbnRzW2ldLng7Ci0gICAgICAgICAgb3V0LnkgPSBwb2ludHNbal0ueSAtIHBvaW50c1tpXS55OwotICAgICAgICAgIGxfb3V0ID0gKEZUX0ZpeGVkKUZUX1ZlY3Rvcl9Ob3JtTGVuKCAmb3V0ICk7Ci0KLSAgICAgICAgICBpZiAoIGxfb3V0ID09IDAgKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgb3V0ICAgPSBhbmNob3I7Ci0gICAgICAgICAgbF9vdXQgPSBsX2FuY2hvcjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggbF9pbiAhPSAwICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggayA8IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGsgICAgICAgID0gaTsKLSAgICAgICAgICAgIGFuY2hvciAgID0gaW47Ci0gICAgICAgICAgICBsX2FuY2hvciA9IGxfaW47Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZCA9IEZUX011bEZpeCggaW4ueCwgb3V0LnggKSArIEZUX011bEZpeCggaW4ueSwgb3V0LnkgKTsKLQotICAgICAgICAgIC8qIHNoaWZ0IG9ubHkgaWYgdHVybiBpcyBsZXNzIHRoYW4gfjE2MCBkZWdyZWVzICovCi0gICAgICAgICAgaWYgKCBkID4gLTB4RjAwMEwgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGQgPSBkICsgMHgxMDAwMEw7Ci0KLSAgICAgICAgICAgIC8qIHNoaWZ0IGNvbXBvbmVudHMgYWxvbmcgbGF0ZXJhbCBiaXNlY3RvciBpbiBwcm9wZXIgb3JpZW50YXRpb24gKi8KLSAgICAgICAgICAgIHNoaWZ0LnggPSBpbi55ICsgb3V0Lnk7Ci0gICAgICAgICAgICBzaGlmdC55ID0gaW4ueCArIG91dC54OwotCi0gICAgICAgICAgICBpZiAoIG9yaWVudGF0aW9uID09IEZUX09SSUVOVEFUSU9OX1RSVUVUWVBFICkKLSAgICAgICAgICAgICAgc2hpZnQueCA9IC1zaGlmdC54OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBzaGlmdC55ID0gLXNoaWZ0Lnk7Ci0KLSAgICAgICAgICAgIC8qIHJlc3RyaWN0IHNoaWZ0IG1hZ25pdHVkZSB0byBiZXR0ZXIgaGFuZGxlIGNvbGxhcHNpbmcgc2VnbWVudHMgKi8KLSAgICAgICAgICAgIHEgPSBGVF9NdWxGaXgoIG91dC54LCBpbi55ICkgLSBGVF9NdWxGaXgoIG91dC55LCBpbi54ICk7Ci0gICAgICAgICAgICBpZiAoIG9yaWVudGF0aW9uID09IEZUX09SSUVOVEFUSU9OX1RSVUVUWVBFICkKLSAgICAgICAgICAgICAgcSA9IC1xOwotCi0gICAgICAgICAgICBsID0gRlRfTUlOKCBsX2luLCBsX291dCApOwotCi0gICAgICAgICAgICAvKiBub24tc3RyaWN0IGluZXF1YWxpdGllcyBhdm9pZCBkaXZpZGUtYnktemVybyB3aGVuIHEgPT0gbCA9PSAwICovCi0gICAgICAgICAgICBpZiAoIEZUX011bEZpeCggeHN0cmVuZ3RoLCBxICkgPD0gRlRfTXVsRml4KCBsLCBkICkgKQotICAgICAgICAgICAgICBzaGlmdC54ID0gRlRfTXVsRGl2KCBzaGlmdC54LCB4c3RyZW5ndGgsIGQgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgc2hpZnQueCA9IEZUX011bERpdiggc2hpZnQueCwgbCwgcSApOwotCi0KLSAgICAgICAgICAgIGlmICggRlRfTXVsRml4KCB5c3RyZW5ndGgsIHEgKSA8PSBGVF9NdWxGaXgoIGwsIGQgKSApCi0gICAgICAgICAgICAgIHNoaWZ0LnkgPSBGVF9NdWxEaXYoIHNoaWZ0LnksIHlzdHJlbmd0aCwgZCApOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBzaGlmdC55ID0gRlRfTXVsRGl2KCBzaGlmdC55LCBsLCBxICk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHNoaWZ0LnggPSBzaGlmdC55ID0gMDsKLQotICAgICAgICAgIGZvciAoIDsKLSAgICAgICAgICAgICAgICBpICE9IGo7Ci0gICAgICAgICAgICAgICAgaSA9IGkgPCBsYXN0ID8gaSArIDEgOiBmaXJzdCApCi0gICAgICAgICAgewotICAgICAgICAgICAgcG9pbnRzW2ldLnggKz0geHN0cmVuZ3RoICsgc2hpZnQueDsKLSAgICAgICAgICAgIHBvaW50c1tpXS55ICs9IHlzdHJlbmd0aCArIHNoaWZ0Lnk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBpID0gajsKLQotICAgICAgICBpbiAgID0gb3V0OwotICAgICAgICBsX2luID0gbF9vdXQ7Ci0gICAgICB9Ci0KLSAgICAgIGZpcnN0ID0gbGFzdCArIDE7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdG91dGxuLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9PcmllbnRhdGlvbiApCi0gIEZUX091dGxpbmVfR2V0X09yaWVudGF0aW9uKCBGVF9PdXRsaW5lKiAgb3V0bGluZSApCi0gIHsKLSAgICBGVF9CQm94ICAgICBjYm94OwotICAgIEZUX0ludCAgICAgIHhzaGlmdCwgeXNoaWZ0OwotICAgIEZUX1ZlY3RvciogIHBvaW50czsKLSAgICBGVF9WZWN0b3IgICB2X3ByZXYsIHZfY3VyOwotICAgIEZUX0ludCAgICAgIGMsIG4sIGZpcnN0OwotICAgIEZUX1BvcyAgICAgIGFyZWEgPSAwOwotCi0KLSAgICBpZiAoICFvdXRsaW5lIHx8IG91dGxpbmUtPm5fcG9pbnRzIDw9IDAgKQotICAgICAgcmV0dXJuIEZUX09SSUVOVEFUSU9OX1RSVUVUWVBFOwotCi0gICAgLyogV2UgdXNlIHRoZSBub256ZXJvIHdpbmRpbmcgcnVsZSB0byBmaW5kIHRoZSBvcmllbnRhdGlvbi4gICAgICAgKi8KLSAgICAvKiBTaW5jZSBnbHlwaCBvdXRsaW5lcyBiZWhhdmUgbXVjaCBtb3JlIGByZWd1bGFyJyB0aGFuIGFyYml0cmFyeSAqLwotICAgIC8qIGN1YmljIG9yIHF1YWRyYXRpYyBjdXJ2ZXMsIHRoaXMgdGVzdCBkZWFscyB3aXRoIHRoZSBwb2x5Z29uICAgICovCi0gICAgLyogb25seSB0aGF0IGlzIHNwYW5uZWQgdXAgYnkgdGhlIGNvbnRyb2wgcG9pbnRzLiAgICAgICAgICAgICAgICAgKi8KLQotICAgIEZUX091dGxpbmVfR2V0X0NCb3goIG91dGxpbmUsICZjYm94ICk7Ci0KLSAgICAvKiBIYW5kbGUgY29sbGFwc2VkIG91dGxpbmVzIHRvIGF2b2lkIHVuZGVmaW5lZCBGVF9NU0IuICovCi0gICAgaWYgKCBjYm94LnhNaW4gPT0gY2JveC54TWF4IHx8IGNib3gueU1pbiA9PSBjYm94LnlNYXggKQotICAgICAgcmV0dXJuIEZUX09SSUVOVEFUSU9OX05PTkU7Ci0KLSAgICB4c2hpZnQgPSBGVF9NU0IoIChGVF9VSW50MzIpKCBGVF9BQlMoIGNib3gueE1heCApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9BQlMoIGNib3gueE1pbiApICkgKSAtIDE0OwotICAgIHhzaGlmdCA9IEZUX01BWCggeHNoaWZ0LCAwICk7Ci0KLSAgICB5c2hpZnQgPSBGVF9NU0IoIChGVF9VSW50MzIpKCBjYm94LnlNYXggLSBjYm94LnlNaW4gKSApIC0gMTQ7Ci0gICAgeXNoaWZ0ID0gRlRfTUFYKCB5c2hpZnQsIDAgKTsKLQotICAgIHBvaW50cyA9IG91dGxpbmUtPnBvaW50czsKLQotICAgIGZpcnN0ID0gMDsKLSAgICBmb3IgKCBjID0gMDsgYyA8IG91dGxpbmUtPm5fY29udG91cnM7IGMrKyApCi0gICAgewotICAgICAgRlRfSW50ICBsYXN0ID0gb3V0bGluZS0+Y29udG91cnNbY107Ci0KLQotICAgICAgdl9wcmV2ID0gcG9pbnRzW2xhc3RdOwotCi0gICAgICBmb3IgKCBuID0gZmlyc3Q7IG4gPD0gbGFzdDsgbisrICkKLSAgICAgIHsKLSAgICAgICAgdl9jdXIgPSBwb2ludHNbbl07Ci0gICAgICAgIGFyZWEgKz0gKCAoIHZfY3VyLnkgLSB2X3ByZXYueSApID4+IHlzaGlmdCApICoKLSAgICAgICAgICAgICAgICAoICggdl9jdXIueCArIHZfcHJldi54ICkgPj4geHNoaWZ0ICk7Ci0gICAgICAgIHZfcHJldiA9IHZfY3VyOwotICAgICAgfQotCi0gICAgICBmaXJzdCA9IGxhc3QgKyAxOwotICAgIH0KLQotICAgIGlmICggYXJlYSA+IDAgKQotICAgICAgcmV0dXJuIEZUX09SSUVOVEFUSU9OX1BPU1RTQ1JJUFQ7Ci0gICAgZWxzZSBpZiAoIGFyZWEgPCAwICkKLSAgICAgIHJldHVybiBGVF9PUklFTlRBVElPTl9UUlVFVFlQRTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gRlRfT1JJRU5UQVRJT05fTk9ORTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRwYXRlbnQuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0cGF0ZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMmIwODUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRwYXRlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDI4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHBhdGVudC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBjaGVja2luZyBwYXRlbnRlZCBUcnVlVHlwZSBieXRlY29kZSBpbnN0cnVjdGlvbnMgICAgKi8KLS8qICAgIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfU0ZOVF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1RSVUVUWVBFX0dMWUZfSAotCi0KLSAgc3RhdGljIEZUX0Jvb2wKLSAgX3R0X2NoZWNrX3BhdGVudHNfaW5fcmFuZ2UoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBzaXplICkKLSAgewotICAgIEZUX0Jvb2wgICByZXN1bHQgPSBGQUxTRTsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0gICAgRlRfQnl0ZXMgIHAsIGVuZDsKLQotCi0gICAgaWYgKCBGVF9GUkFNRV9FTlRFUiggc2l6ZSApICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgcCAgID0gc3RyZWFtLT5jdXJzb3I7Ci0gICAgZW5kID0gcCArIHNpemU7Ci0KLSAgICB3aGlsZSAoIHAgPCBlbmQgKQotICAgIHsKLSAgICAgIHN3aXRjaCAocFswXSkKLSAgICAgIHsKLSAgICAgIGNhc2UgMHgwNjogIC8qIFNQdlRMIC8vICovCi0gICAgICBjYXNlIDB4MDc6ICAvKiBTUHZUTCArICAqLwotICAgICAgY2FzZSAweDA4OiAgLyogU0Z2VEwgLy8gKi8KLSAgICAgIGNhc2UgMHgwOTogIC8qIFNGdlRMICsgICovCi0gICAgICBjYXNlIDB4MEE6ICAvKiBTUHZGUyAgICAqLwotICAgICAgY2FzZSAweDBCOiAgLyogU0Z2RlMgICAgKi8KLSAgICAgICAgcmVzdWx0ID0gVFJVRTsKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBjYXNlIDB4NDA6Ci0gICAgICAgIGlmICggcCArIDEgPj0gZW5kICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgcCArPSBwWzFdICsgMjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMHg0MToKLSAgICAgICAgaWYgKCBwICsgMSA+PSBlbmQgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBwICs9IHBbMV0gKiAyICsgMjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMHg3MTogIC8qIERFTFRBUDIgKi8KLSAgICAgIGNhc2UgMHg3MjogIC8qIERFTFRBUDMgKi8KLSAgICAgIGNhc2UgMHg3MzogIC8qIERFTFRBQzAgKi8KLSAgICAgIGNhc2UgMHg3NDogIC8qIERFTFRBQzEgKi8KLSAgICAgIGNhc2UgMHg3NTogIC8qIERFTFRBQzIgKi8KLSAgICAgICAgcmVzdWx0ID0gVFJVRTsKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBjYXNlIDB4QjA6Ci0gICAgICBjYXNlIDB4QjE6Ci0gICAgICBjYXNlIDB4QjI6Ci0gICAgICBjYXNlIDB4QjM6Ci0gICAgICBjYXNlIDB4QjQ6Ci0gICAgICBjYXNlIDB4QjU6Ci0gICAgICBjYXNlIDB4QjY6Ci0gICAgICBjYXNlIDB4Qjc6Ci0gICAgICAgIHAgKz0gKCBwWzBdIC0gMHhCMCApICsgMjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMHhCODoKLSAgICAgIGNhc2UgMHhCOToKLSAgICAgIGNhc2UgMHhCQToKLSAgICAgIGNhc2UgMHhCQjoKLSAgICAgIGNhc2UgMHhCQzoKLSAgICAgIGNhc2UgMHhCRDoKLSAgICAgIGNhc2UgMHhCRToKLSAgICAgIGNhc2UgMHhCRjoKLSAgICAgICAgcCArPSAoIHBbMF0gLSAweEI4ICkgKiAyICsgMzsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHAgKz0gMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgRlRfVU5VU0VEKCBlcnJvciApOwotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBzdGF0aWMgRlRfQm9vbAotICBfdHRfY2hlY2tfcGF0ZW50c19pbl90YWJsZSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgdGFnICkKLSAgewotICAgIEZUX1N0cmVhbSAgICAgICAgICAgICAgc3RyZWFtID0gZmFjZS0+c3RyZWFtOwotICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgZXJyb3IgID0gRlRfRXJyX09rOwotICAgIEZUX1NlcnZpY2VfU0ZOVF9UYWJsZSAgc2VydmljZTsKLSAgICBGVF9Cb29sICAgICAgICAgICAgICAgIHJlc3VsdCA9IEZBTFNFOwotCi0KLSAgICBGVF9GQUNFX0ZJTkRfU0VSVklDRSggZmFjZSwgc2VydmljZSwgU0ZOVF9UQUJMRSApOwotCi0gICAgaWYgKCBzZXJ2aWNlICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICAgaSA9IDA7Ci0gICAgICBGVF9VTG9uZyAgdGFnX2kgPSAwLCBvZmZzZXRfaSA9IDAsIGxlbmd0aF9pID0gMDsKLQotCi0gICAgICBmb3IgKCBpID0gMDsgIWVycm9yICYmIHRhZ19pICE9IHRhZyA7IGkrKyApCi0gICAgICAgIGVycm9yID0gc2VydmljZS0+dGFibGVfaW5mbyggZmFjZSwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFnX2ksICZvZmZzZXRfaSwgJmxlbmd0aF9pICk7Ci0KLSAgICAgIGlmICggZXJyb3IgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgRlRfU1RSRUFNX1NFRUsoIG9mZnNldF9pICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHJlc3VsdCA9IF90dF9jaGVja19wYXRlbnRzX2luX3JhbmdlKCBzdHJlYW0sIGxlbmd0aF9pICk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Jvb2wKLSAgX3R0X2ZhY2VfY2hlY2tfcGF0ZW50cyggRlRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGZhY2UtPnN0cmVhbTsKLSAgICBGVF9VSW50ICAgIGdpbmRleDsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX0Jvb2wgICAgcmVzdWx0OwotCi0gICAgRlRfU2VydmljZV9UVEdseWYgIHNlcnZpY2U7Ci0KLQotICAgIHJlc3VsdCA9IF90dF9jaGVja19wYXRlbnRzX2luX3RhYmxlKCBmYWNlLCBUVEFHX2ZwZ20gKTsKLSAgICBpZiAoIHJlc3VsdCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICByZXN1bHQgPSBfdHRfY2hlY2tfcGF0ZW50c19pbl90YWJsZSggZmFjZSwgVFRBR19wcmVwICk7Ci0gICAgaWYgKCByZXN1bHQgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHNlcnZpY2UsIFRUX0dMWUYgKTsKLSAgICBpZiAoIHNlcnZpY2UgPT0gTlVMTCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBmb3IgKCBnaW5kZXggPSAwOyBnaW5kZXggPCAoRlRfVUludClmYWNlLT5udW1fZ2x5cGhzOyBnaW5kZXgrKyApCi0gICAgewotICAgICAgRlRfVUxvbmcgIG9mZnNldCwgbnVtX2lucywgc2l6ZTsKLSAgICAgIEZUX0ludCAgICBudW1fY29udG91cnM7Ci0KLQotICAgICAgb2Zmc2V0ID0gc2VydmljZS0+Z2V0X2xvY2F0aW9uKCBmYWNlLCBnaW5kZXgsICZzaXplICk7Ci0gICAgICBpZiAoIHNpemUgPT0gMCApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBvZmZzZXQgKSAgICAgIHx8Ci0gICAgICAgICAgIEZUX1JFQURfU0hPUlQoIG51bV9jb250b3VycyApICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGlmICggbnVtX2NvbnRvdXJzID49IDAgKSAgLyogc2ltcGxlIGdseXBoICovCi0gICAgICB7Ci0gICAgICAgIGlmICggRlRfU1RSRUFNX1NLSVAoIDggKyBudW1fY29udG91cnMgKiAyICkgKQotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgZWxzZSAgLyogY29tcG91bmQgZ2x5cGggKi8KLSAgICAgIHsKLSAgICAgICAgRlRfQm9vbCAgaGFzX2luc3RyID0gMDsKLQotCi0gICAgICAgIGlmICggRlRfU1RSRUFNX1NLSVAoIDggKSApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLyogbm93IHJlYWQgZWFjaCBjb21wb25lbnQgKi8KLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgIGZsYWdzLCB0b3NraXA7Ci0KLQotICAgICAgICAgIGlmKCBGVF9SRUFEX1VTSE9SVCggZmxhZ3MgKSApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIHRvc2tpcCA9IDIgKyAxICsgMTsKLQotICAgICAgICAgIGlmICggKCBmbGFncyAmICggMSA8PCAwICkgKSAhPSAwICkgICAgICAgLyogQVJHU19BUkVfV09SRFMgKi8KLSAgICAgICAgICAgIHRvc2tpcCArPSAyOwotCi0gICAgICAgICAgaWYgKCAoIGZsYWdzICYgKCAxIDw8IDMgKSApICE9IDAgKSAgICAgICAvKiBXRV9IQVZFX0FfU0NBTEUgKi8KLSAgICAgICAgICAgIHRvc2tpcCArPSAyOwotICAgICAgICAgIGVsc2UgaWYgKCAoIGZsYWdzICYgKCAxIDw8IDYgKSApICE9IDAgKSAgLyogV0VfSEFWRV9YX1lfU0NBTEUgKi8KLSAgICAgICAgICAgIHRvc2tpcCArPSA0OwotICAgICAgICAgIGVsc2UgaWYgKCAoIGZsYWdzICYgKCAxIDw8IDcgKSApICE9IDAgKSAgLyogV0VfSEFWRV9BXzJ4MiAqLwotICAgICAgICAgICAgdG9za2lwICs9IDg7Ci0KLSAgICAgICAgICBpZiAoICggZmxhZ3MgJiAoIDEgPDwgOCApICkgIT0gMCApICAgICAgIC8qIFdFX0hBVkVfSU5TVFJVQ1RJT05TICovCi0gICAgICAgICAgICBoYXNfaW5zdHIgPSAxOwotCi0gICAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0tJUCggdG9za2lwICkgKQotICAgICAgICAgICAgZ290byBOZXh0R2x5cGg7Ci0KLSAgICAgICAgICBpZiAoICggZmxhZ3MgJiAoIDEgPDwgNSApICkgPT0gMCApICAgICAgIC8qIE1PUkVfQ09NUE9ORU5UUyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoICFoYXNfaW5zdHIgKQotICAgICAgICAgIGdvdG8gTmV4dEdseXBoOwotICAgICAgfQotCi0gICAgICBpZiAoIEZUX1JFQURfVVNIT1JUKCBudW1faW5zICkgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgcmVzdWx0ID0gX3R0X2NoZWNrX3BhdGVudHNfaW5fcmFuZ2UoIHN0cmVhbSwgbnVtX2lucyApOwotICAgICAgaWYgKCByZXN1bHQgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBOZXh0R2x5cGg6Ci0gICAgICA7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfQm9vbCApCi0gIEZUX0ZhY2VfQ2hlY2tUcnVlVHlwZVBhdGVudHMoIEZUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfQm9vbCAgcmVzdWx0ID0gRkFMU0U7Ci0KLQotICAgIGlmICggZmFjZSAmJiBGVF9JU19TRk5UKCBmYWNlICkgKQotICAgICAgcmVzdWx0ID0gX3R0X2ZhY2VfY2hlY2tfcGF0ZW50cyggZmFjZSApOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmcmVldHlwZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfQm9vbCApCi0gIEZUX0ZhY2VfU2V0VW5wYXRlbnRlZEhpbnRpbmcoIEZUX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgIHZhbHVlICkKLSAgewotICAgIEZUX0Jvb2wgIHJlc3VsdCA9IEZBTFNFOwotCi0KLSNpZiBkZWZpbmVkKCBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORyApICYmIFwKLSAgICAhZGVmaW5lZCggVFRfQ09ORklHX09QVElPTl9CWVRFQ09ERV9JTlRFUlBSRVRFUiApCi0gICAgaWYgKCBmYWNlICYmIEZUX0lTX1NGTlQoIGZhY2UgKSApCi0gICAgewotICAgICAgcmVzdWx0ID0gIWZhY2UtPmludGVybmFsLT5pZ25vcmVfdW5wYXRlbnRlZF9oaW50ZXI7Ci0gICAgICBmYWNlLT5pbnRlcm5hbC0+aWdub3JlX3VucGF0ZW50ZWRfaGludGVyID0gIXZhbHVlOwotICAgIH0KLSNlbHNlCi0gICAgRlRfVU5VU0VEKCBmYWNlICk7Ci0gICAgRlRfVU5VU0VEKCB2YWx1ZSApOwotI2VuZGlmCi0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRwZnIuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0cGZyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZjA4OWUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRwZnIuYworKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHBmci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgQVBJIGZvciBhY2Nlc3NpbmcgUEZSLXNwZWNpZmljIGRhdGEgKGJvZHkpLiAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BGUl9ICi0KLQotICAvKiBjaGVjayB0aGUgZm9ybWF0ICovCi0gIHN0YXRpYyBGVF9TZXJ2aWNlX1Bmck1ldHJpY3MKLSAgZnRfcGZyX2NoZWNrKCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX1NlcnZpY2VfUGZyTWV0cmljcyAgc2VydmljZSA9IE5VTEw7Ci0KLQotICAgIGlmICggZmFjZSApCi0gICAgICBGVF9GQUNFX0xPT0tVUF9TRVJWSUNFKCBmYWNlLCBzZXJ2aWNlLCBQRlJfTUVUUklDUyApOwotCi0gICAgcmV0dXJuIHNlcnZpY2U7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRwZnIuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfR2V0X1BGUl9NZXRyaWNzKCBGVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICphb3V0bGluZV9yZXNvbHV0aW9uLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAqYW1ldHJpY3NfcmVzb2x1dGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgKmFtZXRyaWNzX3hfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICphbWV0cmljc195X3NjYWxlICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfU2VydmljZV9QZnJNZXRyaWNzICBzZXJ2aWNlOwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GYWNlX0hhbmRsZSApOwotCi0gICAgc2VydmljZSA9IGZ0X3Bmcl9jaGVjayggZmFjZSApOwotICAgIGlmICggc2VydmljZSApCi0gICAgewotICAgICAgZXJyb3IgPSBzZXJ2aWNlLT5nZXRfbWV0cmljcyggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFvdXRsaW5lX3Jlc29sdXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWV0cmljc19yZXNvbHV0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1ldHJpY3NfeF9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtZXRyaWNzX3lfc2NhbGUgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEZUX0ZpeGVkICB4X3NjYWxlLCB5X3NjYWxlOwotCi0KLSAgICAgIC8qIHRoaXMgaXMgbm90IGEgUEZSIGZvbnQgKi8KLSAgICAgIGlmICggYW91dGxpbmVfcmVzb2x1dGlvbiApCi0gICAgICAgICphb3V0bGluZV9yZXNvbHV0aW9uID0gZmFjZS0+dW5pdHNfcGVyX0VNOwotCi0gICAgICBpZiAoIGFtZXRyaWNzX3Jlc29sdXRpb24gKQotICAgICAgICAqYW1ldHJpY3NfcmVzb2x1dGlvbiA9IGZhY2UtPnVuaXRzX3Blcl9FTTsKLQotICAgICAgeF9zY2FsZSA9IHlfc2NhbGUgPSAweDEwMDAwTDsKLSAgICAgIGlmICggZmFjZS0+c2l6ZSApCi0gICAgICB7Ci0gICAgICAgIHhfc2NhbGUgPSBmYWNlLT5zaXplLT5tZXRyaWNzLnhfc2NhbGU7Ci0gICAgICAgIHlfc2NhbGUgPSBmYWNlLT5zaXplLT5tZXRyaWNzLnlfc2NhbGU7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggYW1ldHJpY3NfeF9zY2FsZSApCi0gICAgICAgICphbWV0cmljc194X3NjYWxlID0geF9zY2FsZTsKLQotICAgICAgaWYgKCBhbWV0cmljc195X3NjYWxlICkKLSAgICAgICAgKmFtZXRyaWNzX3lfc2NhbGUgPSB5X3NjYWxlOwotCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0cGZyLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldF9QRlJfS2VybmluZyggRlRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciAgKmF2ZWN0b3IgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICAgICBlcnJvcjsKLSAgICBGVF9TZXJ2aWNlX1Bmck1ldHJpY3MgIHNlcnZpY2U7Ci0KLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICBpZiAoICFhdmVjdG9yICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgc2VydmljZSA9IGZ0X3Bmcl9jaGVjayggZmFjZSApOwotICAgIGlmICggc2VydmljZSApCi0gICAgICBlcnJvciA9IHNlcnZpY2UtPmdldF9rZXJuaW5nKCBmYWNlLCBsZWZ0LCByaWdodCwgYXZlY3RvciApOwotICAgIGVsc2UKLSAgICAgIGVycm9yID0gRlRfR2V0X0tlcm5pbmcoIGZhY2UsIGxlZnQsIHJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfS0VSTklOR19VTlNDQUxFRCwgYXZlY3RvciApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0cGZyLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldF9QRlJfQWR2YW5jZSggRlRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAqYWFkdmFuY2UgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICAgICBlcnJvcjsKLSAgICBGVF9TZXJ2aWNlX1Bmck1ldHJpY3MgIHNlcnZpY2U7Ci0KLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICBpZiAoICFhYWR2YW5jZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIHNlcnZpY2UgPSBmdF9wZnJfY2hlY2soIGZhY2UgKTsKLSAgICBpZiAoIHNlcnZpY2UgKQotICAgICAgZXJyb3IgPSBzZXJ2aWNlLT5nZXRfYWR2YW5jZSggZmFjZSwgZ2luZGV4LCBhYWR2YW5jZSApOwotICAgIGVsc2UKLSAgICAgIC8qIFhYWDogVE9ETzogUFJPVklERSBBRFZBTkNFLUxPQURJTkcgTUVUSE9EIFRPIEFMTCBGT05UIERSSVZFUlMgKi8KLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRwaWMuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0cGljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNGIxY2QuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRwaWMuYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cGljLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyAoYm9keSkuICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlICJiYXNlcGljLmgiCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRwaWMuaCAqLwotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIGZ0X3BpY19jb250YWluZXJfaW5pdCggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9QSUNfQ29udGFpbmVyKiAgcGljX2NvbnRhaW5lciA9ICZsaWJyYXJ5LT5waWNfY29udGFpbmVyOwotICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvcjsKLQotCi0gICAgRlRfTUVNX1NFVCggcGljX2NvbnRhaW5lciwgMCwgc2l6ZW9mICggKnBpY19jb250YWluZXIgKSApOwotCi0gICAgZXJyb3IgPSBmdF9iYXNlX3BpY19pbml0KCBsaWJyYXJ5ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKiBEZXN0cm95IHRoZSBjb250ZW50cyBvZiB0aGUgY29udGFpbmVyLiAqLwotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIGZ0X3BpY19jb250YWluZXJfZGVzdHJveSggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBmdF9iYXNlX3BpY19mcmVlKCBsaWJyYXJ5ICk7Ci0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHJmb3JrLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHJmb3JrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMGM3NjYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRyZm9yay5jCisrKyAvZGV2L251bGwKQEAgLTEsODgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cmZvcmsuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBFbWJlZGRlZCByZXNvdXJjZSBmb3JrcyBhY2Nlc3NvciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTWFzYXRha2UgWUFNQVRPIGFuZCBSZWRoYXQgSy5LLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBGVF9SYWNjZXNzX0dldF9IZWFkZXJJbmZvKCkgYW5kIHJhY2Nlc3NfZ3Vlc3NfZGFyd2luX2hmc3BsdXMoKSBhcmUgICAgICovCi0vKiAgZGVyaXZlZCBmcm9tIGZ0b2Jqcy5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBEZXZlbG9wbWVudCBvZiB0aGUgY29kZSBpbiB0aGlzIGZpbGUgaXMgc3VwcG9ydCBvZiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSW5mb3JtYXRpb24tdGVjaG5vbG9neSBQcm9tb3Rpb24gQWdlbmN5LCBKYXBhbi4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUkZPUktfSAotI2luY2x1ZGUgImJhc2VwaWMuaCIKLSNpbmNsdWRlICJmdGJhc2UuaCIKLQotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9yYWNjZXNzCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgUmVzb3VyY2UgZm9yayBkaXJlY3RvcnkgYWNjZXNzICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfUmFjY2Vzc19HZXRfSGVhZGVySW5mbyggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICByZm9ya19vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKm1hcF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJkYXRhX3BvcyApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICBlcnJvcjsKLSAgICB1bnNpZ25lZCBjaGFyICBoZWFkWzE2XSwgaGVhZDJbMTZdOwotICAgIEZUX0xvbmcgICAgICAgIG1hcF9wb3MsIHJkYXRhX2xlbjsKLSAgICBpbnQgICAgICAgICAgICBhbGx6ZXJvcywgYWxsbWF0Y2gsIGk7Ci0gICAgRlRfTG9uZyAgICAgICAgdHlwZV9saXN0OwotCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7Ci0KLQotICAgIGVycm9yID0gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgKEZUX1VMb25nKXJmb3JrX29mZnNldCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgZXJyb3IgPSBGVF9TdHJlYW1fUmVhZCggc3RyZWFtLCAoRlRfQnl0ZSAqKWhlYWQsIDE2ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBlbnN1cmUgcG9zaXRpdmUgdmFsdWVzICovCi0gICAgaWYgKCBoZWFkWzBdID49IDB4ODAgfHwgaGVhZFs0XSA+PSAweDgwIHx8IGhlYWRbOF0gPj0gMHg4MCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLQotICAgICpyZGF0YV9wb3MgPSAoIGhlYWRbIDBdIDw8IDI0ICkgfAotICAgICAgICAgICAgICAgICAoIGhlYWRbIDFdIDw8IDE2ICkgfAotICAgICAgICAgICAgICAgICAoIGhlYWRbIDJdIDw8ICA4ICkgfAotICAgICAgICAgICAgICAgICAgIGhlYWRbIDNdOwotICAgIG1hcF9wb3MgICAgPSAoIGhlYWRbIDRdIDw8IDI0ICkgfAotICAgICAgICAgICAgICAgICAoIGhlYWRbIDVdIDw8IDE2ICkgfAotICAgICAgICAgICAgICAgICAoIGhlYWRbIDZdIDw8ICA4ICkgfAotICAgICAgICAgICAgICAgICAgIGhlYWRbIDddOwotICAgIHJkYXRhX2xlbiAgPSAoIGhlYWRbIDhdIDw8IDI0ICkgfAotICAgICAgICAgICAgICAgICAoIGhlYWRbIDldIDw8IDE2ICkgfAotICAgICAgICAgICAgICAgICAoIGhlYWRbMTBdIDw8ICA4ICkgfAotICAgICAgICAgICAgICAgICAgIGhlYWRbMTFdOwotCi0gICAgLyogbWFwX2xlbiA9IGhlYWRbMTJdIC4uIGhlYWRbMTVdICovCi0KLSAgICBpZiAoICpyZGF0YV9wb3MgIT0gbWFwX3BvcyAtIHJkYXRhX2xlbiB8fCBtYXBfcG9zID09IDAgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICBpZiAoIEZUX0xPTkdfTUFYIC0gcmZvcmtfb2Zmc2V0IDwgKnJkYXRhX3BvcyB8fAotICAgICAgICAgRlRfTE9OR19NQVggLSByZm9ya19vZmZzZXQgPCBtYXBfcG9zICAgICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotCi0gICAgKnJkYXRhX3BvcyArPSByZm9ya19vZmZzZXQ7Ci0gICAgbWFwX3BvcyAgICArPSByZm9ya19vZmZzZXQ7Ci0KLSAgICBlcnJvciA9IEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIChGVF9VTG9uZyltYXBfcG9zICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBoZWFkMlsxNV0gPSAoRlRfQnl0ZSkoIGhlYWRbMTVdICsgMSApOyAgICAgICAvKiBtYWtlIGl0IGJlIGRpZmZlcmVudCAqLwotCi0gICAgZXJyb3IgPSBGVF9TdHJlYW1fUmVhZCggc3RyZWFtLCAoRlRfQnl0ZSopaGVhZDIsIDE2ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBhbGx6ZXJvcyA9IDE7Ci0gICAgYWxsbWF0Y2ggPSAxOwotICAgIGZvciAoIGkgPSAwOyBpIDwgMTY7ICsraSApCi0gICAgewotICAgICAgaWYgKCBoZWFkMltpXSAhPSAwICkKLSAgICAgICAgYWxsemVyb3MgPSAwOwotICAgICAgaWYgKCBoZWFkMltpXSAhPSBoZWFkW2ldICkKLSAgICAgICAgYWxsbWF0Y2ggPSAwOwotICAgIH0KLSAgICBpZiAoICFhbGx6ZXJvcyAmJiAhYWxsbWF0Y2ggKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICAvKiBJZiB3ZSBoYXZlIHJlYWNoZWQgdGhpcyBwb2ludCB0aGVuIGl0IGlzIHByb2JhYmx5IGEgbWFjIHJlc291cmNlICovCi0gICAgLyogZmlsZS4gIE5vdywgZG9lcyBpdCBjb250YWluIGFueSBpbnRlcmVzdGluZyByZXNvdXJjZXM/ICAgICAgICAgICAqLwotICAgIC8qIFNraXAgaGFuZGxlIHRvIG5leHQgcmVzb3VyY2UgbWFwLCB0aGUgZmlsZSByZXNvdXJjZSBudW1iZXIsIGFuZCAgKi8KLSAgICAvKiBhdHRyaWJ1dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgKHZvaWQpRlRfU1RSRUFNX1NLSVAoIDQgICAgICAgIC8qIHNraXAgaGFuZGxlIHRvIG5leHQgcmVzb3VyY2UgbWFwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICsgMiAgICAgIC8qIHNraXAgZmlsZSByZXNvdXJjZSBudW1iZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKyAyICk7ICAgLyogc2tpcCBhdHRyaWJ1dGVzICovCi0KLSAgICBpZiAoIEZUX1JFQURfVVNIT1JUKCB0eXBlX2xpc3QgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgaWYgKCB0eXBlX2xpc3QgPT0gLTEgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICBlcnJvciA9IEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIChGVF9VTG9uZykoIG1hcF9wb3MgKyB0eXBlX2xpc3QgKSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgKm1hcF9vZmZzZXQgPSBtYXBfcG9zICsgdHlwZV9saXN0OwotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIHN0YXRpYyBpbnQKLSAgZnRfcmFjY2Vzc19zb3J0X3JlZl9ieV9pZCggRlRfUkZvcmtfUmVmKiAgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUkZvcmtfUmVmKiAgYiApCi0gIHsKLSAgICBpZiAoIGEtPnJlc19pZCA8IGItPnJlc19pZCApCi0gICAgICByZXR1cm4gLTE7Ci0gICAgZWxzZSBpZiAoIGEtPnJlc19pZCA+IGItPnJlc19pZCApCi0gICAgICByZXR1cm4gMTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfUmFjY2Vzc19HZXRfRGF0YU9mZnNldHMoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICBtYXBfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgcmRhdGFfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgc29ydF9ieV9yZXNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgKipvZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqY291bnQgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvcjsKLSAgICBpbnQgICAgICAgICAgIGksIGosIGNudCwgc3ViY250OwotICAgIEZUX0xvbmcgICAgICAgdGFnX2ludGVybmFsLCBycG9zOwotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotICAgIEZUX0xvbmcgICAgICAgdGVtcDsKLSAgICBGVF9Mb25nICAgICAgICpvZmZzZXRzX2ludGVybmFsID0gTlVMTDsKLSAgICBGVF9SRm9ya19SZWYgICpyZWYgPSBOVUxMOwotCi0KLSAgICBGVF9UUkFDRTMoKCAiXG4iICkpOwotICAgIGVycm9yID0gRlRfU3RyZWFtX1NlZWsoIHN0cmVhbSwgKEZUX1VMb25nKW1hcF9vZmZzZXQgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGlmICggRlRfUkVBRF9VU0hPUlQoIGNudCApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICBjbnQrKzsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgY250OyArK2kgKQotICAgIHsKLSAgICAgIGlmICggRlRfUkVBRF9MT05HKCB0YWdfaW50ZXJuYWwgKSB8fAotICAgICAgICAgICBGVF9SRUFEX1VTSE9SVCggc3ViY250ICkgICAgIHx8Ci0gICAgICAgICAgIEZUX1JFQURfVVNIT1JUKCBycG9zICkgICAgICAgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgIEZUX1RSQUNFMigoICJSZXNvdXJjZSB0YWdzOiAlYyVjJWMlY1xuIiwKLSAgICAgICAgICAgICAgICAgIChjaGFyKSggMHhGRiAmICggdGFnX2ludGVybmFsID4+IDI0ICkgKSwKLSAgICAgICAgICAgICAgICAgIChjaGFyKSggMHhGRiAmICggdGFnX2ludGVybmFsID4+IDE2ICkgKSwKLSAgICAgICAgICAgICAgICAgIChjaGFyKSggMHhGRiAmICggdGFnX2ludGVybmFsID4+ICA4ICkgKSwKLSAgICAgICAgICAgICAgICAgIChjaGFyKSggMHhGRiAmICggdGFnX2ludGVybmFsID4+ICAwICkgKSApKTsKLSAgICAgIEZUX1RSQUNFMygoICIgICAgICAgICAgICAgOiBzdWJjb3VudD0lZCwgc3Vib2Zmc2V0PTB4JTA0eFxuIiwKLSAgICAgICAgICAgICAgICAgIHN1YmNudCwgcnBvcyApKTsKLQotICAgICAgaWYgKCB0YWdfaW50ZXJuYWwgPT0gdGFnICkKLSAgICAgIHsKLSAgICAgICAgKmNvdW50ID0gc3ViY250ICsgMTsKLSAgICAgICAgcnBvcyAgKz0gbWFwX29mZnNldDsKLQotICAgICAgICBlcnJvciA9IEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIChGVF9VTG9uZylycG9zICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgICBpZiAoIEZUX05FV19BUlJBWSggcmVmLCAqY291bnQgKSApCi0gICAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgKmNvdW50OyArK2ogKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBGVF9SRUFEX1VTSE9SVCggcmVmW2pdLnJlc19pZCApICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICBpZiAoIEZUX1NUUkVBTV9TS0lQKCAyICkgKSAvKiByZXNvdXJjZSBuYW1lICovCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgaWYgKCBGVF9SRUFEX0xPTkcoIHRlbXAgKSApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0tJUCggNCApICkgLyogbWJ6ICovCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICByZWZbal0ub2Zmc2V0ID0gdGVtcCAmIDB4RkZGRkZGTDsKLSAgICAgICAgICBGVF9UUkFDRTMoKCAiICAgICAgICAgICAgIFslZF06IgotICAgICAgICAgICAgICAgICAgICAgICIgcmVzb3VyY2VfaWQ9MHglMDR4LCBvZmZzZXQ9MHglMDh4XG4iLAotICAgICAgICAgICAgICAgICAgICAgIGosIHJlZltqXS5yZXNfaWQsIHJlZltqXS5vZmZzZXQgKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc29ydF9ieV9yZXNfaWQpCi0gICAgICAgIHsKLSAgICAgICAgICBmdF9xc29ydCggcmVmLCAoc2l6ZV90KSpjb3VudCwgc2l6ZW9mICggRlRfUkZvcmtfUmVmICksCi0gICAgICAgICAgICAgICAgICAgICggaW50KCopKGNvbnN0IHZvaWQqLCBjb25zdCB2b2lkKikgKQotICAgICAgICAgICAgICAgICAgICBmdF9yYWNjZXNzX3NvcnRfcmVmX2J5X2lkICk7Ci0KLSAgICAgICAgICBGVF9UUkFDRTMoKCAiICAgICAgICAgICAgIC0tIHNvcnQgcmVzb3VyY2VzIGJ5IHRoZWlyIGlkcyAtLVxuIiApKTsKLSAgICAgICAgICBmb3IgKCBqID0gMDsgaiA8ICpjb3VudDsgKysgaiApIHsKLSAgICAgICAgICAgIEZUX1RSQUNFMygoICIgICAgICAgICAgICAgWyVkXToiCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHJlc291cmNlX2lkPTB4JTA0eCwgb2Zmc2V0PTB4JTA4eFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGosIHJlZltqXS5yZXNfaWQsIHJlZltqXS5vZmZzZXQgKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIG9mZnNldHNfaW50ZXJuYWwsICpjb3VudCApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgLyogWFhYOiBkdXBsaWNhdGVkIHJlZmVyZW5jZSBJRCwKLSAgICAgICAgICogICAgICBnYXAgYmV0d2VlbiByZWZlcmVuY2UgSURzIGFyZSBhY2NlcHRhYmxlPwotICAgICAgICAgKiAgICAgIGZ1cnRoZXIgaW52ZXN0aWdhdGlvbiBvbiBBcHBsZSBpbXBsZW1lbnRhdGlvbiBpcyBuZWVkZWQuCi0gICAgICAgICAqLwotICAgICAgICBmb3IgKCBqID0gMDsgaiA8ICpjb3VudDsgKytqICkKLSAgICAgICAgICBvZmZzZXRzX2ludGVybmFsW2pdID0gcmRhdGFfcG9zICsgcmVmW2pdLm9mZnNldDsKLQotICAgICAgICAqb2Zmc2V0cyA9IG9mZnNldHNfaW50ZXJuYWw7Ci0gICAgICAgIGVycm9yICAgID0gRlRfRXJyX09rOwotCi0gICAgICBFeGl0OgotICAgICAgICBGVF9GUkVFKCByZWYgKTsKLSAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X09wZW5fUmVzb3VyY2UgKTsKLSAgfQotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0dVRVNTSU5HX0VNQkVEREVEX1JGT1JLCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgIEd1ZXNzaW5nIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgV2hlbiB5b3UgYWRkIGEgbmV3IGd1ZXNzaW5nIGZ1bmN0aW9uLCAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgdXBkYXRlIEZUX1JBQ0NFU1NfTl9SVUxFUyBpbiBmdHJmb3JrLmguICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJhY2Nlc3NfZ3Vlc3NfYXBwbGVfZG91YmxlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKipyZXN1bHRfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApOwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2FwcGxlX3NpbmdsZSggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKTsKLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcmFjY2Vzc19ndWVzc19kYXJ3aW5fdWZzX2V4cG9ydCggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpiYXNlX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApOwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2Rhcndpbl9uZXd2ZnMoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnJlc3VsdF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApOwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2Rhcndpbl9oZnNwbHVzKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKipyZXN1bHRfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpyZXN1bHRfb2Zmc2V0ICk7Ci0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJhY2Nlc3NfZ3Vlc3NfdmZhdCggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpyZXN1bHRfb2Zmc2V0ICk7Ci0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJhY2Nlc3NfZ3Vlc3NfbGludXhfY2FwKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKipyZXN1bHRfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApOwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2xpbnV4X2RvdWJsZSggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKTsKLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcmFjY2Vzc19ndWVzc19saW51eF9uZXRhdGFsayggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpiYXNlX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApOwotCi0KLSAgQ09OU1RfRlRfUkZPUktfUlVMRV9BUlJBWV9CRUdJTihmdF9yYWNjZXNzX2d1ZXNzX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0X3JhY2Nlc3NfZ3Vlc3NfcmVjKQotICBDT05TVF9GVF9SRk9SS19SVUxFX0FSUkFZX0VOVFJZKGFwcGxlX2RvdWJsZSwgICAgICBhcHBsZV9kb3VibGUpCi0gIENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfRU5UUlkoYXBwbGVfc2luZ2xlLCAgICAgIGFwcGxlX3NpbmdsZSkKLSAgQ09OU1RfRlRfUkZPUktfUlVMRV9BUlJBWV9FTlRSWShkYXJ3aW5fdWZzX2V4cG9ydCwgZGFyd2luX3Vmc19leHBvcnQpCi0gIENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfRU5UUlkoZGFyd2luX25ld3ZmcywgICAgIGRhcndpbl9uZXd2ZnMpCi0gIENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfRU5UUlkoZGFyd2luX2hmc3BsdXMsICAgIGRhcndpbl9oZnNwbHVzKQotICBDT05TVF9GVF9SRk9SS19SVUxFX0FSUkFZX0VOVFJZKHZmYXQsICAgICAgICAgICAgICB2ZmF0KQotICBDT05TVF9GVF9SRk9SS19SVUxFX0FSUkFZX0VOVFJZKGxpbnV4X2NhcCwgICAgICAgICBsaW51eF9jYXApCi0gIENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfRU5UUlkobGludXhfZG91YmxlLCAgICAgIGxpbnV4X2RvdWJsZSkKLSAgQ09OU1RfRlRfUkZPUktfUlVMRV9BUlJBWV9FTlRSWShsaW51eF9uZXRhdGFsaywgICAgbGludXhfbmV0YXRhbGspCi0gIENPTlNUX0ZUX1JGT1JLX1JVTEVfQVJSQVlfRU5ECi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICBIZWxwZXIgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJhY2Nlc3NfZ3Vlc3NfYXBwbGVfZ2VuZXJpYyggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICAgbWFnaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApOwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2xpbnV4X2RvdWJsZV9mcm9tX2ZpbGVfbmFtZSggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiAgICAgIGZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKTsKLQotICBzdGF0aWMgY2hhciAqCi0gIHJhY2Nlc3NfbWFrZV9maWxlX25hbWUoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgICpvcmlnaW5hbF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqaW5zZXJ0aW9uICk7Ci0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9SYWNjZXNzX0d1ZXNzKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgIGJhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqbmV3X25hbWVzLAotICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpvZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciAgICplcnJvcnMgKQotICB7Ci0gICAgRlRfSW50ICBpOwotCi0KLSAgICBmb3IgKCBpID0gMDsgaSA8IEZUX1JBQ0NFU1NfTl9SVUxFUzsgaSsrICkKLSAgICB7Ci0gICAgICBuZXdfbmFtZXNbaV0gPSBOVUxMOwotICAgICAgaWYgKCBOVUxMICE9IHN0cmVhbSApCi0gICAgICAgIGVycm9yc1tpXSA9IEZUX1N0cmVhbV9TZWVrKCBzdHJlYW0sIDAgKTsKLSAgICAgIGVsc2UKLSAgICAgICAgZXJyb3JzW2ldID0gRlRfRXJyX09rOwotCi0gICAgICBpZiAoIGVycm9yc1tpXSApCi0gICAgICAgIGNvbnRpbnVlIDsKLQotICAgICAgZXJyb3JzW2ldID0gKEZUX1JBQ0NFU1NfR1VFU1NfVEFCTEVfR0VUW2ldLmZ1bmMpKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgYmFzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYobmV3X25hbWVzW2ldKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKG9mZnNldHNbaV0pICk7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotICB9Ci0KLQotI2lmbmRlZiBGVF9NQUNJTlRPU0gKLSAgc3RhdGljIEZUX1JGb3JrX1J1bGUKLSAgcmFjY2Vzc19nZXRfcnVsZV90eXBlX2Zyb21fcnVsZV9pbmRleCggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgcnVsZV9pbmRleCApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsKLQotICAgIGlmICggcnVsZV9pbmRleCA+PSBGVF9SQUNDRVNTX05fUlVMRVMgKQotICAgICAgcmV0dXJuIEZUX1JGb3JrX1J1bGVfaW52YWxpZDsKLQotICAgIHJldHVybiBGVF9SQUNDRVNTX0dVRVNTX1RBQkxFX0dFVFtydWxlX2luZGV4XS50eXBlOwotICB9Ci0KLQotICAvKgotICAgKiBGb3IgdGhpcyBmdW5jdGlvbiwgcmVmZXIgZnRiYXNlLmguCi0gICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Jvb2wgKQotICBmdF9yYWNjZXNzX3J1bGVfYnlfZGFyd2luX3ZmcyggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHJ1bGVfaW5kZXggKQotICB7Ci0gICAgc3dpdGNoKCByYWNjZXNzX2dldF9ydWxlX3R5cGVfZnJvbV9ydWxlX2luZGV4KCBsaWJyYXJ5LCBydWxlX2luZGV4ICkgKQotICAgIHsKLSAgICAgIGNhc2UgRlRfUkZvcmtfUnVsZV9kYXJ3aW5fbmV3dmZzOgotICAgICAgY2FzZSBGVF9SRm9ya19SdWxlX2Rhcndpbl9oZnNwbHVzOgotICAgICAgICByZXR1cm4gVFJVRTsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgfQotI2VuZGlmCi0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcmFjY2Vzc19ndWVzc19hcHBsZV9kb3VibGUoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpiYXNlX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnJlc3VsdF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpyZXN1bHRfb2Zmc2V0ICkKLSAgewotICAgIEZUX0ludDMyICBtYWdpYyA9ICggMHgwMCA8PCAyNCApIHwKLSAgICAgICAgICAgICAgICAgICAgICAoIDB4MDUgPDwgMTYgKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgKCAweDE2IDw8ICA4ICkgfAotICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzsKLQotCi0gICAgKnJlc3VsdF9maWxlX25hbWUgPSBOVUxMOwotICAgIGlmICggTlVMTCA9PSBzdHJlYW0gKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9TdHJlYW0gKTsKLQotICAgIHJldHVybiByYWNjZXNzX2d1ZXNzX2FwcGxlX2dlbmVyaWMoIGxpYnJhcnksIHN0cmVhbSwgYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFnaWMsIHJlc3VsdF9vZmZzZXQgKTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJhY2Nlc3NfZ3Vlc3NfYXBwbGVfc2luZ2xlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKipyZXN1bHRfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApCi0gIHsKLSAgICBGVF9JbnQzMiAgbWFnaWMgPSAoIDB4MDAgPDwgMjQgKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgKCAweDA1IDw8IDE2ICkgfAotICAgICAgICAgICAgICAgICAgICAgICggMHgxNiA8PCAgOCApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA7Ci0KLQotICAgICpyZXN1bHRfZmlsZV9uYW1lID0gTlVMTDsKLSAgICBpZiAoIE5VTEwgPT0gc3RyZWFtICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggQ2Fubm90X09wZW5fU3RyZWFtICk7Ci0KLSAgICByZXR1cm4gcmFjY2Vzc19ndWVzc19hcHBsZV9nZW5lcmljKCBsaWJyYXJ5LCBzdHJlYW0sIGJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hZ2ljLCByZXN1bHRfb2Zmc2V0ICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2Rhcndpbl91ZnNfZXhwb3J0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKipyZXN1bHRfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpyZXN1bHRfb2Zmc2V0ICkKLSAgewotICAgIGNoYXIqICAgICAgbmV3cGF0aDsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotCi0gICAgRlRfVU5VU0VEKCBzdHJlYW0gKTsKLQotCi0gICAgbWVtb3J5ICA9IGxpYnJhcnktPm1lbW9yeTsKLSAgICBuZXdwYXRoID0gcmFjY2Vzc19tYWtlX2ZpbGVfbmFtZSggbWVtb3J5LCBiYXNlX2ZpbGVfbmFtZSwgIi5fIiApOwotICAgIGlmICggIW5ld3BhdGggKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBPdXRfT2ZfTWVtb3J5ICk7Ci0KLSAgICBlcnJvciA9IHJhY2Nlc3NfZ3Vlc3NfbGludXhfZG91YmxlX2Zyb21fZmlsZV9uYW1lKCBsaWJyYXJ5LCBuZXdwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9vZmZzZXQgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgICAqcmVzdWx0X2ZpbGVfbmFtZSA9IG5ld3BhdGg7Ci0gICAgZWxzZQotICAgICAgRlRfRlJFRSggbmV3cGF0aCApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcmFjY2Vzc19ndWVzc19kYXJ3aW5faGZzcGx1cyggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpiYXNlX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApCi0gIHsKLSAgICAvKgotICAgICAgT25seSBtZWFuaW5nZnVsIG9uIHN5c3RlbXMgd2l0aCBoZnMrIGRyaXZlcnMgKG9yIE1hY3MpLgotICAgICAqLwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgY2hhciogICAgICBuZXdwYXRoID0gTlVMTDsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLSAgICBGVF9Mb25nICAgIGJhc2VfZmlsZV9sZW4gPSAoRlRfTG9uZylmdF9zdHJsZW4oIGJhc2VfZmlsZV9uYW1lICk7Ci0KLSAgICBGVF9VTlVTRUQoIHN0cmVhbSApOwotCi0KLSAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLSAgICBpZiAoIGJhc2VfZmlsZV9sZW4gKyA2ID4gRlRfSU5UX01BWCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEFycmF5X1Rvb19MYXJnZSApOwotCi0gICAgaWYgKCBGVF9BTExPQyggbmV3cGF0aCwgYmFzZV9maWxlX2xlbiArIDYgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBGVF9NRU1fQ09QWSggbmV3cGF0aCwgYmFzZV9maWxlX25hbWUsIGJhc2VfZmlsZV9sZW4gKTsKLSAgICBGVF9NRU1fQ09QWSggbmV3cGF0aCArIGJhc2VfZmlsZV9sZW4sICIvcnNyYyIsIDYgKTsKLQotICAgICpyZXN1bHRfZmlsZV9uYW1lID0gbmV3cGF0aDsKLSAgICAqcmVzdWx0X29mZnNldCAgICA9IDA7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcmFjY2Vzc19ndWVzc19kYXJ3aW5fbmV3dmZzKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpiYXNlX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKipyZXN1bHRfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKQotICB7Ci0gICAgLyoKLSAgICAgIE9ubHkgbWVhbmluZ2Z1bCBvbiBzeXN0ZW1zIHdpdGggTWFjIE9TIFggKD4gMTAuMSkuCi0gICAgICovCi0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBjaGFyKiAgICAgIG5ld3BhdGggPSBOVUxMOwotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotICAgIEZUX0xvbmcgICAgYmFzZV9maWxlX2xlbiA9IChGVF9Mb25nKWZ0X3N0cmxlbiggYmFzZV9maWxlX25hbWUgKTsKLQotICAgIEZUX1VOVVNFRCggc3RyZWFtICk7Ci0KLQotICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLQotICAgIGlmICggYmFzZV9maWxlX2xlbiArIDE4ID4gRlRfSU5UX01BWCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEFycmF5X1Rvb19MYXJnZSApOwotCi0gICAgaWYgKCBGVF9BTExPQyggbmV3cGF0aCwgYmFzZV9maWxlX2xlbiArIDE4ICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgRlRfTUVNX0NPUFkoIG5ld3BhdGgsIGJhc2VfZmlsZV9uYW1lLCBiYXNlX2ZpbGVfbGVuICk7Ci0gICAgRlRfTUVNX0NPUFkoIG5ld3BhdGggKyBiYXNlX2ZpbGVfbGVuLCAiLy4ubmFtZWRmb3JrL3JzcmMiLCAxOCApOwotCi0gICAgKnJlc3VsdF9maWxlX25hbWUgPSBuZXdwYXRoOwotICAgICpyZXN1bHRfb2Zmc2V0ICAgID0gMDsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX3ZmYXQoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnJlc3VsdF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAqcmVzdWx0X29mZnNldCApCi0gIHsKLSAgICBjaGFyKiAgICAgIG5ld3BhdGg7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0KLSAgICBGVF9VTlVTRUQoIHN0cmVhbSApOwotCi0KLSAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLSAgICBuZXdwYXRoID0gcmFjY2Vzc19tYWtlX2ZpbGVfbmFtZSggbWVtb3J5LCBiYXNlX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlc291cmNlLmZyay8iICk7Ci0gICAgaWYgKCAhbmV3cGF0aCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIE91dF9PZl9NZW1vcnkgKTsKLQotICAgICpyZXN1bHRfZmlsZV9uYW1lID0gbmV3cGF0aDsKLSAgICAqcmVzdWx0X29mZnNldCAgICA9IDA7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcmFjY2Vzc19ndWVzc19saW51eF9jYXAoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpiYXNlX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAqKnJlc3VsdF9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpyZXN1bHRfb2Zmc2V0ICkKLSAgewotICAgIGNoYXIqICAgICAgbmV3cGF0aDsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLQotICAgIEZUX1VOVVNFRCggc3RyZWFtICk7Ci0KLQotICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLQotICAgIG5ld3BhdGggPSByYWNjZXNzX21ha2VfZmlsZV9uYW1lKCBtZW1vcnksIGJhc2VfZmlsZV9uYW1lLCAiLnJlc291cmNlLyIgKTsKLSAgICBpZiAoICFuZXdwYXRoICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggT3V0X09mX01lbW9yeSApOwotCi0gICAgKnJlc3VsdF9maWxlX25hbWUgPSBuZXdwYXRoOwotICAgICpyZXN1bHRfb2Zmc2V0ICAgID0gMDsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2xpbnV4X2RvdWJsZSggRlRfTGlicmFyeSAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICoqcmVzdWx0X2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKnJlc3VsdF9vZmZzZXQgKQotICB7Ci0gICAgY2hhciogICAgICBuZXdwYXRoOwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0KLSAgICBGVF9VTlVTRUQoIHN0cmVhbSApOwotCi0KLSAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLSAgICBuZXdwYXRoID0gcmFjY2Vzc19tYWtlX2ZpbGVfbmFtZSggbWVtb3J5LCBiYXNlX2ZpbGVfbmFtZSwgIiUiICk7Ci0gICAgaWYgKCAhbmV3cGF0aCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIE91dF9PZl9NZW1vcnkgKTsKLQotICAgIGVycm9yID0gcmFjY2Vzc19ndWVzc19saW51eF9kb3VibGVfZnJvbV9maWxlX25hbWUoIGxpYnJhcnksIG5ld3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X29mZnNldCApOwotICAgIGlmICggIWVycm9yICkKLSAgICAgICpyZXN1bHRfZmlsZV9uYW1lID0gbmV3cGF0aDsKLSAgICBlbHNlCi0gICAgICBGVF9GUkVFKCBuZXdwYXRoICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICByYWNjZXNzX2d1ZXNzX2xpbnV4X25ldGF0YWxrKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgKmJhc2VfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKipyZXN1bHRfZmlsZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpyZXN1bHRfb2Zmc2V0ICkKLSAgewotICAgIGNoYXIqICAgICAgbmV3cGF0aDsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgbWVtb3J5OwotCi0gICAgRlRfVU5VU0VEKCBzdHJlYW0gKTsKLQotCi0gICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0gICAgbmV3cGF0aCA9IHJhY2Nlc3NfbWFrZV9maWxlX25hbWUoIG1lbW9yeSwgYmFzZV9maWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuQXBwbGVEb3VibGUvIiApOwotICAgIGlmICggIW5ld3BhdGggKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBPdXRfT2ZfTWVtb3J5ICk7Ci0KLSAgICBlcnJvciA9IHJhY2Nlc3NfZ3Vlc3NfbGludXhfZG91YmxlX2Zyb21fZmlsZV9uYW1lKCBsaWJyYXJ5LCBuZXdwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9vZmZzZXQgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgICAqcmVzdWx0X2ZpbGVfbmFtZSA9IG5ld3BhdGg7Ci0gICAgZWxzZQotICAgICAgRlRfRlJFRSggbmV3cGF0aCApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcmFjY2Vzc19ndWVzc19hcHBsZV9nZW5lcmljKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpiYXNlX2ZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgICBtYWdpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpyZXN1bHRfb2Zmc2V0ICkKLSAgewotICAgIEZUX0ludDMyICAgbWFnaWNfZnJvbV9zdHJlYW07Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9JbnQzMiAgIHZlcnNpb25fbnVtYmVyID0gMDsKLSAgICBGVF9VU2hvcnQgIG5fb2ZfZW50cmllczsKLQotICAgIGludCAgICAgICAgaTsKLSAgICBGVF9JbnQzMiAgIGVudHJ5X2lkLCBlbnRyeV9vZmZzZXQsIGVudHJ5X2xlbmd0aCA9IDA7Ci0KLSAgICBjb25zdCBGVF9JbnQzMiAgcmVzb3VyY2VfZm9ya19lbnRyeV9pZCA9IDB4MjsKLQotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOwotICAgIEZUX1VOVVNFRCggYmFzZV9maWxlX25hbWUgKTsKLSAgICBGVF9VTlVTRUQoIHZlcnNpb25fbnVtYmVyICk7Ci0gICAgRlRfVU5VU0VEKCBlbnRyeV9sZW5ndGggICApOwotCi0KLSAgICBpZiAoIEZUX1JFQURfTE9ORyggbWFnaWNfZnJvbV9zdHJlYW0gKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgaWYgKCBtYWdpY19mcm9tX3N0cmVhbSAhPSBtYWdpYyApCi0gICAgICByZXR1cm4gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLQotICAgIGlmICggRlRfUkVBRF9MT05HKCB2ZXJzaW9uX251bWJlciApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIC8qIGZpbGxlciAqLwotICAgIGVycm9yID0gRlRfU3RyZWFtX1NraXAoIHN0cmVhbSwgMTYgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGlmICggRlRfUkVBRF9VU0hPUlQoIG5fb2ZfZW50cmllcyApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICBpZiAoIG5fb2ZfZW50cmllcyA9PSAwICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBuX29mX2VudHJpZXM7IGkrKyApCi0gICAgewotICAgICAgaWYgKCBGVF9SRUFEX0xPTkcoIGVudHJ5X2lkICkgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgICBpZiAoIGVudHJ5X2lkID09IHJlc291cmNlX2ZvcmtfZW50cnlfaWQgKQotICAgICAgewotICAgICAgICBpZiAoIEZUX1JFQURfTE9ORyggZW50cnlfb2Zmc2V0ICkgfHwKLSAgICAgICAgICAgICBGVF9SRUFEX0xPTkcoIGVudHJ5X2xlbmd0aCApICkKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgKnJlc3VsdF9vZmZzZXQgPSBlbnRyeV9vZmZzZXQ7Ci0KLSAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9TdHJlYW1fU2tpcCggc3RyZWFtLCA0ICsgNCApOyAgICAvKiBvZmZzZXQgKyBsZW5ndGggKi8KLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcmFjY2Vzc19ndWVzc19saW51eF9kb3VibGVfZnJvbV9maWxlX25hbWUoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgICpmaWxlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICpyZXN1bHRfb2Zmc2V0ICkKLSAgewotICAgIEZUX09wZW5fQXJncyAgYXJnczI7Ci0gICAgRlRfU3RyZWFtICAgICBzdHJlYW0yOwotICAgIGNoYXIgKiAgICAgICAgbm91c2UgPSBOVUxMOwotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0KLQotICAgIGFyZ3MyLmZsYWdzICAgID0gRlRfT1BFTl9QQVRITkFNRTsKLSAgICBhcmdzMi5wYXRobmFtZSA9IGZpbGVfbmFtZTsKLSAgICBlcnJvciA9IEZUX1N0cmVhbV9OZXcoIGxpYnJhcnksICZhcmdzMiwgJnN0cmVhbTIgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGVycm9yID0gcmFjY2Vzc19ndWVzc19hcHBsZV9kb3VibGUoIGxpYnJhcnksIHN0cmVhbTIsIGZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbm91c2UsIHJlc3VsdF9vZmZzZXQgKTsKLQotICAgIEZUX1N0cmVhbV9GcmVlKCBzdHJlYW0yLCAwICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBjaGFyKgotICByYWNjZXNzX21ha2VfZmlsZV9uYW1lKCBGVF9NZW1vcnkgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICAqb3JpZ2luYWxfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAgKmluc2VydGlvbiApCi0gIHsKLSAgICBjaGFyKiAgICAgICAgbmV3X25hbWUgPSBOVUxMOwotICAgIGNvbnN0IGNoYXIqICB0bXA7Ci0gICAgY29uc3QgY2hhciogIHNsYXNoOwotICAgIHNpemVfdCAgICAgICBuZXdfbGVuZ3RoOwotICAgIEZUX0Vycm9yICAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotICAgIEZUX1VOVVNFRCggZXJyb3IgKTsKLQotCi0gICAgbmV3X2xlbmd0aCA9IGZ0X3N0cmxlbiggb3JpZ2luYWxfbmFtZSApICsgZnRfc3RybGVuKCBpbnNlcnRpb24gKTsKLSAgICBpZiAoIEZUX0FMTE9DKCBuZXdfbmFtZSwgbmV3X2xlbmd0aCArIDEgKSApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIHRtcCA9IGZ0X3N0cnJjaHIoIG9yaWdpbmFsX25hbWUsICcvJyApOwotICAgIGlmICggdG1wICkKLSAgICB7Ci0gICAgICBmdF9zdHJuY3B5KCBuZXdfbmFtZSwKLSAgICAgICAgICAgICAgICAgIG9yaWdpbmFsX25hbWUsCi0gICAgICAgICAgICAgICAgICAoc2l6ZV90KSggdG1wIC0gb3JpZ2luYWxfbmFtZSArIDEgKSApOwotICAgICAgbmV3X25hbWVbdG1wIC0gb3JpZ2luYWxfbmFtZSArIDFdID0gJ1wwJzsKLSAgICAgIHNsYXNoID0gdG1wICsgMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNsYXNoICAgICAgID0gb3JpZ2luYWxfbmFtZTsKLSAgICAgIG5ld19uYW1lWzBdID0gJ1wwJzsKLSAgICB9Ci0KLSAgICBmdF9zdHJjYXQoIG5ld19uYW1lLCBpbnNlcnRpb24gKTsKLSAgICBmdF9zdHJjYXQoIG5ld19uYW1lLCBzbGFzaCApOwotCi0gICAgcmV0dXJuIG5ld19uYW1lOwotICB9Ci0KLQotI2Vsc2UgICAvKiAhRlRfQ09ORklHX09QVElPTl9HVUVTU0lOR19FTUJFRERFRF9SRk9SSyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgRHVtbXkgZnVuY3Rpb247IGp1c3Qgc2V0cyBlcnJvcnMgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX1JhY2Nlc3NfR3Vlc3MoIEZUX0xpYnJhcnkgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgY2hhciAgICAgICAqYmFzZV9uYW1lLAotICAgICAgICAgICAgICAgICAgICBjaGFyICAgICAgKipuZXdfbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgKm9mZnNldHMsCi0gICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yICAgKmVycm9ycyApCi0gIHsKLSAgICBGVF9JbnQgIGk7Ci0KLSAgICBGVF9VTlVTRUQoIGxpYnJhcnkgKTsKLSAgICBGVF9VTlVTRUQoIHN0cmVhbSApOwotICAgIEZUX1VOVVNFRCggYmFzZV9uYW1lICk7Ci0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgRlRfUkFDQ0VTU19OX1JVTEVTOyBpKysgKQotICAgIHsKLSAgICAgIG5ld19uYW1lc1tpXSA9IE5VTEw7Ci0gICAgICBvZmZzZXRzW2ldICAgPSAwOwotICAgICAgZXJyb3JzW2ldICAgID0gRlRfRVJSKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLSAgICB9Ci0gIH0KLQotCi0jZW5kaWYgIC8qICFGVF9DT05GSUdfT1BUSU9OX0dVRVNTSU5HX0VNQkVEREVEX1JGT1JLICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHNuYW1lcy5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRzbmFtZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAzMDRlNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHNuYW1lcy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRzbmFtZXMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFNpbXBsZSBpbnRlcmZhY2UgdG8gYWNjZXNzIFNGTlQgbmFtZSB0YWJsZXMgKHdoaWNoIGFyZSB1c2VkICAgICAgICAgICovCi0vKiAgICB0byBob2xkIGZvbnQgbmFtZXMsIGNvcHlyaWdodCBpbmZvLCBub3RpY2VzLCBldGMuKSAoYm9keSkuICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoaXMgaXMgX25vdF8gdXNlZCB0byByZXRyaWV2ZSBnbHlwaCBuYW1lcyEgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1NGTlRfTkFNRVNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFJVRVRZUEVfVFlQRVNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TRk5UX05BTUVTCi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c25hbWVzLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9VSW50ICkKLSAgRlRfR2V0X1NmbnRfTmFtZV9Db3VudCggRlRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICByZXR1cm4gKCBmYWNlICYmIEZUX0lTX1NGTlQoIGZhY2UgKSApID8gKChUVF9GYWNlKWZhY2UpLT5udW1fbmFtZXMgOiAwOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c25hbWVzLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldF9TZm50X05hbWUoIEZUX0ZhY2UgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgIEZUX1NmbnROYW1lICAqYW5hbWUgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRVJSKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLQotICAgIGlmICggYW5hbWUgJiYgZmFjZSAmJiBGVF9JU19TRk5UKCBmYWNlICkgKQotICAgIHsKLSAgICAgIFRUX0ZhY2UgIHR0ZmFjZSA9IChUVF9GYWNlKWZhY2U7Ci0KLQotICAgICAgaWYgKCBpZHggPCAoRlRfVUludCl0dGZhY2UtPm51bV9uYW1lcyApCi0gICAgICB7Ci0gICAgICAgIFRUX05hbWVFbnRyeVJlYyogIGVudHJ5ID0gdHRmYWNlLT5uYW1lX3RhYmxlLm5hbWVzICsgaWR4OwotCi0KLSAgICAgICAgLyogbG9hZCBuYW1lIG9uIGRlbWFuZCAqLwotICAgICAgICBpZiAoIGVudHJ5LT5zdHJpbmdMZW5ndGggPiAwICYmIGVudHJ5LT5zdHJpbmcgPT0gTlVMTCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGZhY2UtPm1lbW9yeTsKLSAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGZhY2UtPnN0cmVhbTsKLQotCi0gICAgICAgICAgaWYgKCBGVF9ORVdfQVJSQVkgICggZW50cnktPnN0cmluZywgZW50cnktPnN0cmluZ0xlbmd0aCApIHx8Ci0gICAgICAgICAgICAgICBGVF9TVFJFQU1fU0VFSyggZW50cnktPnN0cmluZ09mZnNldCApICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICBGVF9TVFJFQU1fUkVBRCggZW50cnktPnN0cmluZywgZW50cnktPnN0cmluZ0xlbmd0aCApICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9GUkVFKCBlbnRyeS0+c3RyaW5nICk7Ci0gICAgICAgICAgICBlbnRyeS0+c3RyaW5nTGVuZ3RoID0gMDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhbmFtZS0+cGxhdGZvcm1faWQgPSBlbnRyeS0+cGxhdGZvcm1JRDsKLSAgICAgICAgYW5hbWUtPmVuY29kaW5nX2lkID0gZW50cnktPmVuY29kaW5nSUQ7Ci0gICAgICAgIGFuYW1lLT5sYW5ndWFnZV9pZCA9IGVudHJ5LT5sYW5ndWFnZUlEOwotICAgICAgICBhbmFtZS0+bmFtZV9pZCAgICAgPSBlbnRyeS0+bmFtZUlEOwotICAgICAgICBhbmFtZS0+c3RyaW5nICAgICAgPSAoRlRfQnl0ZSopZW50cnktPnN0cmluZzsKLSAgICAgICAgYW5hbWUtPnN0cmluZ19sZW4gID0gZW50cnktPnN0cmluZ0xlbmd0aDsKLQotICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TRk5UX05BTUVTICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHN0cmVhbS5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRzdHJlYW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY4ZjNmOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHN0cmVhbS5jCisrKyAvZGV2L251bGwKQEAgLTEsODYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c3RyZWFtLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBJL08gc3RyZWFtIHN1cHBvcnQgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2Vfc3RyZWFtCi0KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX1N0cmVhbV9PcGVuTWVtb3J5KCBGVF9TdHJlYW0gICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfQnl0ZSogIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgc2l6ZSApCi0gIHsKLSAgICBzdHJlYW0tPmJhc2UgICA9IChGVF9CeXRlKikgYmFzZTsKLSAgICBzdHJlYW0tPnNpemUgICA9IHNpemU7Ci0gICAgc3RyZWFtLT5wb3MgICAgPSAwOwotICAgIHN0cmVhbS0+Y3Vyc29yID0gTlVMTDsKLSAgICBzdHJlYW0tPnJlYWQgICA9IE5VTEw7Ci0gICAgc3RyZWFtLT5jbG9zZSAgPSBOVUxMOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX1N0cmVhbV9DbG9zZSggRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgaWYgKCBzdHJlYW0gJiYgc3RyZWFtLT5jbG9zZSApCi0gICAgICBzdHJlYW0tPmNsb3NlKCBzdHJlYW0gKTsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX1NlZWsoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBwb3MgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoIHN0cmVhbS0+cmVhZCApCi0gICAgewotICAgICAgaWYgKCBzdHJlYW0tPnJlYWQoIHN0cmVhbSwgcG9zLCAwLCAwICkgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fU2VlazoiCi0gICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIGkvbzsgcG9zID0gMHglbHgsIHNpemUgPSAweCVseFxuIiwKLSAgICAgICAgICAgICAgICAgICBwb3MsIHN0cmVhbS0+c2l6ZSApKTsKLQotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogbm90ZSB0aGF0IHNlZWtpbmcgdG8gdGhlIGZpcnN0IHBvc2l0aW9uIGFmdGVyIHRoZSBmaWxlIGlzIHZhbGlkICovCi0gICAgZWxzZSBpZiAoIHBvcyA+IHN0cmVhbS0+c2l6ZSApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX1NlZWs6IgotICAgICAgICAgICAgICAgICAiIGludmFsaWQgaS9vOyBwb3MgPSAweCVseCwgc2l6ZSA9IDB4JWx4XG4iLAotICAgICAgICAgICAgICAgICBwb3MsIHN0cmVhbS0+c2l6ZSApKTsKLQotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uICk7Ci0gICAgfQotCi0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgc3RyZWFtLT5wb3MgPSBwb3M7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9Ta2lwKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgZGlzdGFuY2UgKQotICB7Ci0gICAgaWYgKCBkaXN0YW5jZSA8IDAgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKTsKLQotICAgIHJldHVybiBGVF9TdHJlYW1fU2Vlayggc3RyZWFtLCBzdHJlYW0tPnBvcyArIChGVF9VTG9uZylkaXN0YW5jZSApOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfVUxvbmcgKQotICBGVF9TdHJlYW1fUG9zKCBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICByZXR1cm4gc3RyZWFtLT5wb3M7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cmVhbV9SZWFkKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBjb3VudCApCi0gIHsKLSAgICByZXR1cm4gRlRfU3RyZWFtX1JlYWRBdCggc3RyZWFtLCBzdHJlYW0tPnBvcywgYnVmZmVyLCBjb3VudCApOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fUmVhZEF0KCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBwb3MsCi0gICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIGNvdW50ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9VTG9uZyAgcmVhZF9ieXRlczsKLQotCi0gICAgaWYgKCBwb3MgPj0gc3RyZWFtLT5zaXplICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fUmVhZEF0OiIKLSAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIGkvbzsgcG9zID0gMHglbHgsIHNpemUgPSAweCVseFxuIiwKLSAgICAgICAgICAgICAgICAgcG9zLCBzdHJlYW0tPnNpemUgKSk7Ci0KLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uICk7Ci0gICAgfQotCi0gICAgaWYgKCBzdHJlYW0tPnJlYWQgKQotICAgICAgcmVhZF9ieXRlcyA9IHN0cmVhbS0+cmVhZCggc3RyZWFtLCBwb3MsIGJ1ZmZlciwgY291bnQgKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgcmVhZF9ieXRlcyA9IHN0cmVhbS0+c2l6ZSAtIHBvczsKLSAgICAgIGlmICggcmVhZF9ieXRlcyA+IGNvdW50ICkKLSAgICAgICAgcmVhZF9ieXRlcyA9IGNvdW50OwotCi0gICAgICBGVF9NRU1fQ09QWSggYnVmZmVyLCBzdHJlYW0tPmJhc2UgKyBwb3MsIHJlYWRfYnl0ZXMgKTsKLSAgICB9Ci0KLSAgICBzdHJlYW0tPnBvcyA9IHBvcyArIHJlYWRfYnl0ZXM7Ci0KLSAgICBpZiAoIHJlYWRfYnl0ZXMgPCBjb3VudCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX1JlYWRBdDoiCi0gICAgICAgICAgICAgICAgICIgaW52YWxpZCByZWFkOyBleHBlY3RlZCAlbHUgYnl0ZXMsIGdvdCAlbHVcbiIsCi0gICAgICAgICAgICAgICAgIGNvdW50LCByZWFkX2J5dGVzICkpOwotCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9VTG9uZyApCi0gIEZUX1N0cmVhbV9UcnlSZWFkKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBjb3VudCApCi0gIHsKLSAgICBGVF9VTG9uZyAgcmVhZF9ieXRlcyA9IDA7Ci0KLQotICAgIGlmICggc3RyZWFtLT5wb3MgPj0gc3RyZWFtLT5zaXplICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggc3RyZWFtLT5yZWFkICkKLSAgICAgIHJlYWRfYnl0ZXMgPSBzdHJlYW0tPnJlYWQoIHN0cmVhbSwgc3RyZWFtLT5wb3MsIGJ1ZmZlciwgY291bnQgKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgcmVhZF9ieXRlcyA9IHN0cmVhbS0+c2l6ZSAtIHN0cmVhbS0+cG9zOwotICAgICAgaWYgKCByZWFkX2J5dGVzID4gY291bnQgKQotICAgICAgICByZWFkX2J5dGVzID0gY291bnQ7Ci0KLSAgICAgIEZUX01FTV9DT1BZKCBidWZmZXIsIHN0cmVhbS0+YmFzZSArIHN0cmVhbS0+cG9zLCByZWFkX2J5dGVzICk7Ci0gICAgfQotCi0gICAgc3RyZWFtLT5wb3MgKz0gcmVhZF9ieXRlczsKLQotICBFeGl0OgotICAgIHJldHVybiByZWFkX2J5dGVzOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fRXh0cmFjdEZyYW1lKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSoqICBwYnl0ZXMgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBlcnJvciA9IEZUX1N0cmVhbV9FbnRlckZyYW1lKCBzdHJlYW0sIGNvdW50ICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgICpwYnl0ZXMgPSAoRlRfQnl0ZSopc3RyZWFtLT5jdXJzb3I7Ci0KLSAgICAgIC8qIGVxdWl2YWxlbnQgdG8gRlRfU3RyZWFtX0V4aXRGcmFtZSgpLCB3aXRoIG5vIG1lbW9yeSBibG9jayByZWxlYXNlICovCi0gICAgICBzdHJlYW0tPmN1cnNvciA9IE5VTEw7Ci0gICAgICBzdHJlYW0tPmxpbWl0ICA9IE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX1N0cmVhbV9SZWxlYXNlRnJhbWUoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBieXRlcyApCi0gIHsKLSAgICBpZiAoIHN0cmVhbSAmJiBzdHJlYW0tPnJlYWQgKQotICAgIHsKLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0KLSNpZmRlZiBGVF9ERUJVR19NRU1PUlkKLSAgICAgIGZ0X21lbV9mcmVlKCBtZW1vcnksICpwYnl0ZXMgKTsKLSAgICAgICpwYnl0ZXMgPSBOVUxMOwotI2Vsc2UKLSAgICAgIEZUX0ZSRUUoICpwYnl0ZXMgKTsKLSNlbmRpZgotICAgIH0KLSAgICAqcGJ5dGVzID0gTlVMTDsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX0VudGVyRnJhbWUoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBjb3VudCApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfVUxvbmcgIHJlYWRfYnl0ZXM7Ci0KLQotICAgIC8qIGNoZWNrIGZvciBuZXN0ZWQgZnJhbWUgYWNjZXNzICovCi0gICAgRlRfQVNTRVJUKCBzdHJlYW0gJiYgc3RyZWFtLT5jdXJzb3IgPT0gMCApOwotCi0gICAgaWYgKCBzdHJlYW0tPnJlYWQgKQotICAgIHsKLSAgICAgIC8qIGFsbG9jYXRlIHRoZSBmcmFtZSBpbiBtZW1vcnkgKi8KLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0KLQotICAgICAgLyogc2ltcGxlIHNhbml0eSBjaGVjayAqLwotICAgICAgaWYgKCBjb3VudCA+IHN0cmVhbS0+c2l6ZSApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9FbnRlckZyYW1lOiIKLSAgICAgICAgICAgICAgICAgICAiIGZyYW1lIHNpemUgKCVsdSkgbGFyZ2VyIHRoYW4gc3RyZWFtIHNpemUgKCVsdSlcbiIsCi0gICAgICAgICAgICAgICAgICAgY291bnQsIHN0cmVhbS0+c2l6ZSApKTsKLQotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0jaWZkZWYgRlRfREVCVUdfTUVNT1JZCi0gICAgICAvKiBhc3N1bWUgX2Z0X2RlYnVnX2ZpbGUgYW5kIF9mdF9kZWJ1Z19saW5lbm8gYXJlIGFscmVhZHkgc2V0ICovCi0gICAgICBzdHJlYW0tPmJhc2UgPSAodW5zaWduZWQgY2hhciopZnRfbWVtX3FhbGxvYyggbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Mb25nKWNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSNlbHNlCi0gICAgICBpZiAoIEZUX1FBTExPQyggc3RyZWFtLT5iYXNlLCBjb3VudCApICkKLSAgICAgICAgZ290byBFeGl0OwotI2VuZGlmCi0gICAgICAvKiByZWFkIGl0ICovCi0gICAgICByZWFkX2J5dGVzID0gc3RyZWFtLT5yZWFkKCBzdHJlYW0sIHN0cmVhbS0+cG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5iYXNlLCBjb3VudCApOwotICAgICAgaWYgKCByZWFkX2J5dGVzIDwgY291bnQgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fRW50ZXJGcmFtZToiCi0gICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIHJlYWQ7IGV4cGVjdGVkICVsdSBieXRlcywgZ290ICVsdVxuIiwKLSAgICAgICAgICAgICAgICAgICBjb3VudCwgcmVhZF9ieXRlcyApKTsKLQotICAgICAgICBGVF9GUkVFKCBzdHJlYW0tPmJhc2UgKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uICk7Ci0gICAgICB9Ci0gICAgICBzdHJlYW0tPmN1cnNvciA9IHN0cmVhbS0+YmFzZTsKLSAgICAgIHN0cmVhbS0+bGltaXQgID0gc3RyZWFtLT5jdXJzb3IgKyBjb3VudDsKLSAgICAgIHN0cmVhbS0+cG9zICAgKz0gcmVhZF9ieXRlczsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIGNoZWNrIGN1cnJlbnQgYW5kIG5ldyBwb3NpdGlvbiAqLwotICAgICAgaWYgKCBzdHJlYW0tPnBvcyA+PSBzdHJlYW0tPnNpemUgICAgICAgIHx8Ci0gICAgICAgICAgIHN0cmVhbS0+c2l6ZSAtIHN0cmVhbS0+cG9zIDwgY291bnQgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fRW50ZXJGcmFtZToiCi0gICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIGkvbzsgcG9zID0gMHglbHgsIGNvdW50ID0gJWx1LCBzaXplID0gMHglbHhcbiIsCi0gICAgICAgICAgICAgICAgICAgc3RyZWFtLT5wb3MsIGNvdW50LCBzdHJlYW0tPnNpemUgKSk7Ci0KLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgLyogc2V0IGN1cnNvciAqLwotICAgICAgc3RyZWFtLT5jdXJzb3IgPSBzdHJlYW0tPmJhc2UgKyBzdHJlYW0tPnBvczsKLSAgICAgIHN0cmVhbS0+bGltaXQgID0gc3RyZWFtLT5jdXJzb3IgKyBjb3VudDsKLSAgICAgIHN0cmVhbS0+cG9zICAgKz0gY291bnQ7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggdm9pZCApCi0gIEZUX1N0cmVhbV9FeGl0RnJhbWUoIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIC8qIElNUE9SVEFOVDogVGhlIGFzc2VydGlvbiBzdHJlYW0tPmN1cnNvciAhPSAwIHdhcyByZW1vdmVkLCBnaXZlbiAgICAqLwotICAgIC8qICAgICAgICAgICAgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byBhY2Nlc3MgYSBmcmFtZSBvZiBsZW5ndGggMCBpbiAgICAqLwotICAgIC8qICAgICAgICAgICAgc29tZSB3ZWlyZCBmb250cyAodXN1YWxseSwgd2hlbiBhY2Nlc3NpbmcgYW4gYXJyYXkgb2YgICAqLwotICAgIC8qICAgICAgICAgICAgMCByZWNvcmRzLCBsaWtlIGluIHNvbWUgc3RyYW5nZSBrZXJuIHRhYmxlcykuICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICBJbiB0aGlzIGNhc2UsIHRoZSBsb2FkZXIgY29kZSBoYW5kbGVzIHRoZSAwLWxlbmd0aCB0YWJsZSAgICAgICAgICAqLwotICAgIC8qICBncmFjZWZ1bGx5OyBob3dldmVyLCBzdHJlYW0uY3Vyc29yIGlzIHJlYWxseSBzZXQgdG8gMCBieSB0aGUgICAgICAqLwotICAgIC8qICBGVF9TdHJlYW1fRW50ZXJGcmFtZSgpIGNhbGwsIGFuZCB0aGlzIGlzIG5vdCBhbiBlcnJvci4gICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX0FTU0VSVCggc3RyZWFtICk7Ci0KLSAgICBpZiAoIHN0cmVhbS0+cmVhZCApCi0gICAgewotICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLQotI2lmZGVmIEZUX0RFQlVHX01FTU9SWQotICAgICAgZnRfbWVtX2ZyZWUoIG1lbW9yeSwgc3RyZWFtLT5iYXNlICk7Ci0gICAgICBzdHJlYW0tPmJhc2UgPSBOVUxMOwotI2Vsc2UKLSAgICAgIEZUX0ZSRUUoIHN0cmVhbS0+YmFzZSApOwotI2VuZGlmCi0gICAgfQotICAgIHN0cmVhbS0+Y3Vyc29yID0gTlVMTDsKLSAgICBzdHJlYW0tPmxpbWl0ICA9IE5VTEw7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9DaGFyICkKLSAgRlRfU3RyZWFtX0dldENoYXIoIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0NoYXIgIHJlc3VsdDsKLQotCi0gICAgRlRfQVNTRVJUKCBzdHJlYW0gJiYgc3RyZWFtLT5jdXJzb3IgKTsKLQotICAgIHJlc3VsdCA9IDA7Ci0gICAgaWYgKCBzdHJlYW0tPmN1cnNvciA8IHN0cmVhbS0+bGltaXQgKQotICAgICAgcmVzdWx0ID0gKEZUX0NoYXIpKnN0cmVhbS0+Y3Vyc29yKys7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfVVNob3J0ICkKLSAgRlRfU3RyZWFtX0dldFVTaG9ydCggRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfQnl0ZSogICBwOwotICAgIEZUX1VTaG9ydCAgcmVzdWx0OwotCi0KLSAgICBGVF9BU1NFUlQoIHN0cmVhbSAmJiBzdHJlYW0tPmN1cnNvciApOwotCi0gICAgcmVzdWx0ICAgICAgICAgPSAwOwotICAgIHAgICAgICAgICAgICAgID0gc3RyZWFtLT5jdXJzb3I7Ci0gICAgaWYgKCBwICsgMSA8IHN0cmVhbS0+bGltaXQgKQotICAgICAgcmVzdWx0ICAgICAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBzdHJlYW0tPmN1cnNvciA9IHA7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfVVNob3J0ICkKLSAgRlRfU3RyZWFtX0dldFVTaG9ydExFKCBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9CeXRlKiAgIHA7Ci0gICAgRlRfVVNob3J0ICByZXN1bHQ7Ci0KLQotICAgIEZUX0FTU0VSVCggc3RyZWFtICYmIHN0cmVhbS0+Y3Vyc29yICk7Ci0KLSAgICByZXN1bHQgICAgICAgICA9IDA7Ci0gICAgcCAgICAgICAgICAgICAgPSBzdHJlYW0tPmN1cnNvcjsKLSAgICBpZiAoIHAgKyAxIDwgc3RyZWFtLT5saW1pdCApCi0gICAgICByZXN1bHQgICAgICAgPSBGVF9ORVhUX1VTSE9SVF9MRSggcCApOwotICAgIHN0cmVhbS0+Y3Vyc29yID0gcDsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9VTG9uZyApCi0gIEZUX1N0cmVhbV9HZXRVT2Zmc2V0KCBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9CeXRlKiAgcDsKLSAgICBGVF9VTG9uZyAgcmVzdWx0OwotCi0KLSAgICBGVF9BU1NFUlQoIHN0cmVhbSAmJiBzdHJlYW0tPmN1cnNvciApOwotCi0gICAgcmVzdWx0ICAgICAgICAgPSAwOwotICAgIHAgICAgICAgICAgICAgID0gc3RyZWFtLT5jdXJzb3I7Ci0gICAgaWYgKCBwICsgMiA8IHN0cmVhbS0+bGltaXQgKQotICAgICAgcmVzdWx0ICAgICAgID0gRlRfTkVYVF9VT0ZGMyggcCApOwotICAgIHN0cmVhbS0+Y3Vyc29yID0gcDsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfVUxvbmcgKQotICBGVF9TdHJlYW1fR2V0VUxvbmcoIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0J5dGUqICBwOwotICAgIEZUX1VMb25nICByZXN1bHQ7Ci0KLQotICAgIEZUX0FTU0VSVCggc3RyZWFtICYmIHN0cmVhbS0+Y3Vyc29yICk7Ci0KLSAgICByZXN1bHQgICAgICAgICA9IDA7Ci0gICAgcCAgICAgICAgICAgICAgPSBzdHJlYW0tPmN1cnNvcjsKLSAgICBpZiAoIHAgKyAzIDwgc3RyZWFtLT5saW1pdCApCi0gICAgICByZXN1bHQgICAgICAgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgc3RyZWFtLT5jdXJzb3IgPSBwOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9VTG9uZyApCi0gIEZUX1N0cmVhbV9HZXRVTG9uZ0xFKCBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBGVF9CeXRlKiAgcDsKLSAgICBGVF9VTG9uZyAgcmVzdWx0OwotCi0KLSAgICBGVF9BU1NFUlQoIHN0cmVhbSAmJiBzdHJlYW0tPmN1cnNvciApOwotCi0gICAgcmVzdWx0ICAgICAgICAgPSAwOwotICAgIHAgICAgICAgICAgICAgID0gc3RyZWFtLT5jdXJzb3I7Ci0gICAgaWYgKCBwICsgMyA8IHN0cmVhbS0+bGltaXQgKQotICAgICAgcmVzdWx0ICAgICAgID0gRlRfTkVYVF9VTE9OR19MRSggcCApOwotICAgIHN0cmVhbS0+Y3Vyc29yID0gcDsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfQ2hhciApCi0gIEZUX1N0cmVhbV9SZWFkQ2hhciggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICBlcnJvciApCi0gIHsKLSAgICBGVF9CeXRlICByZXN1bHQgPSAwOwotCi0KLSAgICBGVF9BU1NFUlQoIHN0cmVhbSApOwotCi0gICAgKmVycm9yID0gRlRfRXJyX09rOwotCi0gICAgaWYgKCBzdHJlYW0tPnJlYWQgKQotICAgIHsKLSAgICAgIGlmICggc3RyZWFtLT5yZWFkKCBzdHJlYW0sIHN0cmVhbS0+cG9zLCAmcmVzdWx0LCAxTCApICE9IDFMICkKLSAgICAgICAgZ290byBGYWlsOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCBzdHJlYW0tPnBvcyA8IHN0cmVhbS0+c2l6ZSApCi0gICAgICAgIHJlc3VsdCA9IHN0cmVhbS0+YmFzZVtzdHJlYW0tPnBvc107Ci0gICAgICBlbHNlCi0gICAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0gICAgc3RyZWFtLT5wb3MrKzsKLQotICAgIHJldHVybiAoRlRfQ2hhcilyZXN1bHQ7Ci0KLSAgRmFpbDoKLSAgICAqZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uICk7Ci0gICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX1JlYWRDaGFyOiIKLSAgICAgICAgICAgICAgICIgaW52YWxpZCBpL287IHBvcyA9IDB4JWx4LCBzaXplID0gMHglbHhcbiIsCi0gICAgICAgICAgICAgICBzdHJlYW0tPnBvcywgc3RyZWFtLT5zaXplICkpOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9VU2hvcnQgKQotICBGVF9TdHJlYW1fUmVhZFVTaG9ydCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICkKLSAgewotICAgIEZUX0J5dGUgICAgcmVhZHNbMl07Ci0gICAgRlRfQnl0ZSogICBwICAgICAgPSAwOwotICAgIEZUX1VTaG9ydCAgcmVzdWx0ID0gMDsKLQotCi0gICAgRlRfQVNTRVJUKCBzdHJlYW0gKTsKLQotICAgICplcnJvciA9IEZUX0Vycl9PazsKLQotICAgIGlmICggc3RyZWFtLT5wb3MgKyAxIDwgc3RyZWFtLT5zaXplICkKLSAgICB7Ci0gICAgICBpZiAoIHN0cmVhbS0+cmVhZCApCi0gICAgICB7Ci0gICAgICAgIGlmICggc3RyZWFtLT5yZWFkKCBzdHJlYW0sIHN0cmVhbS0+cG9zLCByZWFkcywgMkwgKSAhPSAyTCApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIHAgPSByZWFkczsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcCA9IHN0cmVhbS0+YmFzZSArIHN0cmVhbS0+cG9zOwotCi0gICAgICBpZiAoIHAgKQotICAgICAgICByZXN1bHQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICBzdHJlYW0tPnBvcyArPSAyOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLQotICBGYWlsOgotICAgICplcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKTsKLSAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fUmVhZFVTaG9ydDoiCi0gICAgICAgICAgICAgICAiIGludmFsaWQgaS9vOyBwb3MgPSAweCVseCwgc2l6ZSA9IDB4JWx4XG4iLAotICAgICAgICAgICAgICAgc3RyZWFtLT5wb3MsIHN0cmVhbS0+c2l6ZSApKTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfVVNob3J0ICkKLSAgRlRfU3RyZWFtX1JlYWRVU2hvcnRMRSggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKQotICB7Ci0gICAgRlRfQnl0ZSAgICByZWFkc1syXTsKLSAgICBGVF9CeXRlKiAgIHAgICAgICA9IDA7Ci0gICAgRlRfVVNob3J0ICByZXN1bHQgPSAwOwotCi0KLSAgICBGVF9BU1NFUlQoIHN0cmVhbSApOwotCi0gICAgKmVycm9yID0gRlRfRXJyX09rOwotCi0gICAgaWYgKCBzdHJlYW0tPnBvcyArIDEgPCBzdHJlYW0tPnNpemUgKQotICAgIHsKLSAgICAgIGlmICggc3RyZWFtLT5yZWFkICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBzdHJlYW0tPnJlYWQoIHN0cmVhbSwgc3RyZWFtLT5wb3MsIHJlYWRzLCAyTCApICE9IDJMICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgcCA9IHJlYWRzOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBwID0gc3RyZWFtLT5iYXNlICsgc3RyZWFtLT5wb3M7Ci0KLSAgICAgIGlmICggcCApCi0gICAgICAgIHJlc3VsdCA9IEZUX05FWFRfVVNIT1JUX0xFKCBwICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIHN0cmVhbS0+cG9zICs9IDI7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIEZhaWw6Ci0gICAgKmVycm9yID0gRlRfVEhST1coIEludmFsaWRfU3RyZWFtX09wZXJhdGlvbiApOwotICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9SZWFkVVNob3J0TEU6IgotICAgICAgICAgICAgICAgIiBpbnZhbGlkIGkvbzsgcG9zID0gMHglbHgsIHNpemUgPSAweCVseFxuIiwKLSAgICAgICAgICAgICAgIHN0cmVhbS0+cG9zLCBzdHJlYW0tPnNpemUgKSk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1VMb25nICkKLSAgRlRfU3RyZWFtX1JlYWRVT2Zmc2V0KCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICkKLSAgewotICAgIEZUX0J5dGUgICByZWFkc1szXTsKLSAgICBGVF9CeXRlKiAgcCAgICAgID0gMDsKLSAgICBGVF9VTG9uZyAgcmVzdWx0ID0gMDsKLQotCi0gICAgRlRfQVNTRVJUKCBzdHJlYW0gKTsKLQotICAgICplcnJvciA9IEZUX0Vycl9PazsKLQotICAgIGlmICggc3RyZWFtLT5wb3MgKyAyIDwgc3RyZWFtLT5zaXplICkKLSAgICB7Ci0gICAgICBpZiAoIHN0cmVhbS0+cmVhZCApCi0gICAgICB7Ci0gICAgICAgIGlmIChzdHJlYW0tPnJlYWQoIHN0cmVhbSwgc3RyZWFtLT5wb3MsIHJlYWRzLCAzTCApICE9IDNMICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgcCA9IHJlYWRzOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBwID0gc3RyZWFtLT5iYXNlICsgc3RyZWFtLT5wb3M7Ci0KLSAgICAgIGlmICggcCApCi0gICAgICAgIHJlc3VsdCA9IEZUX05FWFRfVU9GRjMoIHAgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZ290byBGYWlsOwotCi0gICAgc3RyZWFtLT5wb3MgKz0gMzsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgRmFpbDoKLSAgICAqZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uICk7Ci0gICAgRlRfRVJST1IoKCAiRlRfU3RyZWFtX1JlYWRVT2Zmc2V0OiIKLSAgICAgICAgICAgICAgICIgaW52YWxpZCBpL287IHBvcyA9IDB4JWx4LCBzaXplID0gMHglbHhcbiIsCi0gICAgICAgICAgICAgICBzdHJlYW0tPnBvcywgc3RyZWFtLT5zaXplICkpOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9VTG9uZyApCi0gIEZUX1N0cmVhbV9SZWFkVUxvbmcoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICkKLSAgewotICAgIEZUX0J5dGUgICByZWFkc1s0XTsKLSAgICBGVF9CeXRlKiAgcCAgICAgID0gMDsKLSAgICBGVF9VTG9uZyAgcmVzdWx0ID0gMDsKLQotCi0gICAgRlRfQVNTRVJUKCBzdHJlYW0gKTsKLQotICAgICplcnJvciA9IEZUX0Vycl9PazsKLQotICAgIGlmICggc3RyZWFtLT5wb3MgKyAzIDwgc3RyZWFtLT5zaXplICkKLSAgICB7Ci0gICAgICBpZiAoIHN0cmVhbS0+cmVhZCApCi0gICAgICB7Ci0gICAgICAgIGlmICggc3RyZWFtLT5yZWFkKCBzdHJlYW0sIHN0cmVhbS0+cG9zLCByZWFkcywgNEwgKSAhPSA0TCApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIHAgPSByZWFkczsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcCA9IHN0cmVhbS0+YmFzZSArIHN0cmVhbS0+cG9zOwotCi0gICAgICBpZiAoIHAgKQotICAgICAgICByZXN1bHQgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIHN0cmVhbS0+cG9zICs9IDQ7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIEZhaWw6Ci0gICAgKmVycm9yID0gRlRfVEhST1coIEludmFsaWRfU3RyZWFtX09wZXJhdGlvbiApOwotICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9SZWFkVUxvbmc6IgotICAgICAgICAgICAgICAgIiBpbnZhbGlkIGkvbzsgcG9zID0gMHglbHgsIHNpemUgPSAweCVseFxuIiwKLSAgICAgICAgICAgICAgIHN0cmVhbS0+cG9zLCBzdHJlYW0tPnNpemUgKSk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1VMb25nICkKLSAgRlRfU3RyZWFtX1JlYWRVTG9uZ0xFKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogIGVycm9yICkKLSAgewotICAgIEZUX0J5dGUgICByZWFkc1s0XTsKLSAgICBGVF9CeXRlKiAgcCAgICAgID0gMDsKLSAgICBGVF9VTG9uZyAgcmVzdWx0ID0gMDsKLQotCi0gICAgRlRfQVNTRVJUKCBzdHJlYW0gKTsKLQotICAgICplcnJvciA9IEZUX0Vycl9PazsKLQotICAgIGlmICggc3RyZWFtLT5wb3MgKyAzIDwgc3RyZWFtLT5zaXplICkKLSAgICB7Ci0gICAgICBpZiAoIHN0cmVhbS0+cmVhZCApCi0gICAgICB7Ci0gICAgICAgIGlmICggc3RyZWFtLT5yZWFkKCBzdHJlYW0sIHN0cmVhbS0+cG9zLCByZWFkcywgNEwgKSAhPSA0TCApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIHAgPSByZWFkczsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgcCA9IHN0cmVhbS0+YmFzZSArIHN0cmVhbS0+cG9zOwotCi0gICAgICBpZiAoIHAgKQotICAgICAgICByZXN1bHQgPSBGVF9ORVhUX1VMT05HX0xFKCBwICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIHN0cmVhbS0+cG9zICs9IDQ7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotCi0gIEZhaWw6Ci0gICAgKmVycm9yID0gRlRfVEhST1coIEludmFsaWRfU3RyZWFtX09wZXJhdGlvbiApOwotICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9SZWFkVUxvbmdMRToiCi0gICAgICAgICAgICAgICAiIGludmFsaWQgaS9vOyBwb3MgPSAweCVseCwgc2l6ZSA9IDB4JWx4XG4iLAotICAgICAgICAgICAgICAgc3RyZWFtLT5wb3MsIHN0cmVhbS0+c2l6ZSApKTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfRXJyb3IgKQotICBGVF9TdHJlYW1fUmVhZEZpZWxkcyggRlRfU3RyZWFtICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9GcmFtZV9GaWVsZCogIGZpZWxkcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgc3RydWN0dXJlICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBGVF9Cb29sICAgZnJhbWVfYWNjZXNzZWQgPSAwOwotICAgIEZUX0J5dGUqICBjdXJzb3I7Ci0KLQotICAgIGlmICggIWZpZWxkcyApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGlmICggIXN0cmVhbSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfU3RyZWFtX0hhbmRsZSApOwotCi0gICAgY3Vyc29yID0gc3RyZWFtLT5jdXJzb3I7Ci0KLSAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBkbwotICAgIHsKLSAgICAgIEZUX1VMb25nICB2YWx1ZTsKLSAgICAgIEZUX0ludCAgICBzaWduX3NoaWZ0OwotICAgICAgRlRfQnl0ZSogIHA7Ci0KLQotICAgICAgc3dpdGNoICggZmllbGRzLT52YWx1ZSApCi0gICAgICB7Ci0gICAgICBjYXNlIGZ0X2ZyYW1lX3N0YXJ0OiAgLyogYWNjZXNzIGEgbmV3IGZyYW1lICovCi0gICAgICAgIGVycm9yID0gRlRfU3RyZWFtX0VudGVyRnJhbWUoIHN0cmVhbSwgZmllbGRzLT5vZmZzZXQgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGZyYW1lX2FjY2Vzc2VkID0gMTsKLSAgICAgICAgY3Vyc29yICAgICAgICAgPSBzdHJlYW0tPmN1cnNvcjsKLSAgICAgICAgZmllbGRzKys7Ci0gICAgICAgIGNvbnRpbnVlOyAgLyogbG9vcCEgKi8KLQotICAgICAgY2FzZSBmdF9mcmFtZV9ieXRlczogIC8qIHJlYWQgYSBieXRlIHNlcXVlbmNlICovCi0gICAgICBjYXNlIGZ0X2ZyYW1lX3NraXA6ICAgLyogc2tpcCBzb21lIGJ5dGVzICAgICAgKi8KLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgIGxlbiA9IGZpZWxkcy0+c2l6ZTsKLQotCi0gICAgICAgICAgaWYgKCBjdXJzb3IgKyBsZW4gPiBzdHJlYW0tPmxpbWl0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKTsKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoIGZpZWxkcy0+dmFsdWUgPT0gZnRfZnJhbWVfYnl0ZXMgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHAgPSAoRlRfQnl0ZSopc3RydWN0dXJlICsgZmllbGRzLT5vZmZzZXQ7Ci0gICAgICAgICAgICBGVF9NRU1fQ09QWSggcCwgY3Vyc29yLCBsZW4gKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY3Vyc29yICs9IGxlbjsKLSAgICAgICAgICBmaWVsZHMrKzsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICBjYXNlIGZ0X2ZyYW1lX2J5dGU6Ci0gICAgICBjYXNlIGZ0X2ZyYW1lX3NjaGFyOiAgLyogcmVhZCBhIHNpbmdsZSBieXRlICovCi0gICAgICAgIHZhbHVlID0gRlRfTkVYVF9CWVRFKCBjdXJzb3IgKTsKLSAgICAgICAgc2lnbl9zaGlmdCA9IDI0OwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBmdF9mcmFtZV9zaG9ydF9iZToKLSAgICAgIGNhc2UgZnRfZnJhbWVfdXNob3J0X2JlOiAgLyogcmVhZCBhIDItYnl0ZSBiaWctZW5kaWFuIHNob3J0ICovCi0gICAgICAgIHZhbHVlID0gRlRfTkVYVF9VU0hPUlQoIGN1cnNvcikgOwotICAgICAgICBzaWduX3NoaWZ0ID0gMTY7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIGZ0X2ZyYW1lX3Nob3J0X2xlOgotICAgICAgY2FzZSBmdF9mcmFtZV91c2hvcnRfbGU6ICAvKiByZWFkIGEgMi1ieXRlIGxpdHRsZS1lbmRpYW4gc2hvcnQgKi8KLSAgICAgICAgdmFsdWUgPSBGVF9ORVhUX1VTSE9SVF9MRSggY3Vyc29yICk7Ci0gICAgICAgIHNpZ25fc2hpZnQgPSAxNjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgZnRfZnJhbWVfbG9uZ19iZToKLSAgICAgIGNhc2UgZnRfZnJhbWVfdWxvbmdfYmU6ICAvKiByZWFkIGEgNC1ieXRlIGJpZy1lbmRpYW4gbG9uZyAqLwotICAgICAgICB2YWx1ZSA9IEZUX05FWFRfVUxPTkcoIGN1cnNvciApOwotICAgICAgICBzaWduX3NoaWZ0ID0gMDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgZnRfZnJhbWVfbG9uZ19sZToKLSAgICAgIGNhc2UgZnRfZnJhbWVfdWxvbmdfbGU6ICAvKiByZWFkIGEgNC1ieXRlIGxpdHRsZS1lbmRpYW4gbG9uZyAqLwotICAgICAgICB2YWx1ZSA9IEZUX05FWFRfVUxPTkdfTEUoIGN1cnNvciApOwotICAgICAgICBzaWduX3NoaWZ0ID0gMDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgZnRfZnJhbWVfb2ZmM19iZToKLSAgICAgIGNhc2UgZnRfZnJhbWVfdW9mZjNfYmU6ICAvKiByZWFkIGEgMy1ieXRlIGJpZy1lbmRpYW4gbG9uZyAqLwotICAgICAgICB2YWx1ZSA9IEZUX05FWFRfVU9GRjMoIGN1cnNvciApOwotICAgICAgICBzaWduX3NoaWZ0ID0gODsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgZnRfZnJhbWVfb2ZmM19sZToKLSAgICAgIGNhc2UgZnRfZnJhbWVfdW9mZjNfbGU6ICAvKiByZWFkIGEgMy1ieXRlIGxpdHRsZS1lbmRpYW4gbG9uZyAqLwotICAgICAgICB2YWx1ZSA9IEZUX05FWFRfVU9GRjNfTEUoIGN1cnNvciApOwotICAgICAgICBzaWduX3NoaWZ0ID0gODsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8qIG90aGVyd2lzZSwgZXhpdCB0aGUgbG9vcCAqLwotICAgICAgICBzdHJlYW0tPmN1cnNvciA9IGN1cnNvcjsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICAvKiBub3csIGNvbXB1dGUgdGhlIHNpZ25lZCB2YWx1ZSBpcyBuZWNlc3NhcnkgKi8KLSAgICAgIGlmICggZmllbGRzLT52YWx1ZSAmIEZUX0ZSQU1FX09QX1NJR05FRCApCi0gICAgICAgIHZhbHVlID0gKEZUX1VMb25nKSggKEZUX0ludDMyKSggdmFsdWUgPDwgc2lnbl9zaGlmdCApID4+IHNpZ25fc2hpZnQgKTsKLQotICAgICAgLyogZmluYWxseSwgc3RvcmUgdGhlIHZhbHVlIGluIHRoZSBvYmplY3QgKi8KLQotICAgICAgcCA9IChGVF9CeXRlKilzdHJ1Y3R1cmUgKyBmaWVsZHMtPm9mZnNldDsKLSAgICAgIHN3aXRjaCAoIGZpZWxkcy0+c2l6ZSApCi0gICAgICB7Ci0gICAgICBjYXNlICggOCAvIEZUX0NIQVJfQklUICk6Ci0gICAgICAgICooRlRfQnl0ZSopcCA9IChGVF9CeXRlKXZhbHVlOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAoIDE2IC8gRlRfQ0hBUl9CSVQgKToKLSAgICAgICAgKihGVF9VU2hvcnQqKXAgPSAoRlRfVVNob3J0KXZhbHVlOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAoIDMyIC8gRlRfQ0hBUl9CSVQgKToKLSAgICAgICAgKihGVF9VSW50MzIqKXAgPSAoRlRfVUludDMyKXZhbHVlOwotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDogIC8qIGZvciA2NC1iaXQgc3lzdGVtcyAqLwotICAgICAgICAqKEZUX1VMb25nKilwID0gKEZUX1VMb25nKXZhbHVlOwotICAgICAgfQotCi0gICAgICAvKiBnbyB0byBuZXh0IGZpZWxkICovCi0gICAgICBmaWVsZHMrKzsKLSAgICB9Ci0gICAgd2hpbGUgKCAxICk7Ci0KLSAgRXhpdDoKLSAgICAvKiBjbG9zZSB0aGUgZnJhbWUgaWYgaXQgd2FzIG9wZW5lZCBieSB0aGlzIHJlYWQgKi8KLSAgICBpZiAoIGZyYW1lX2FjY2Vzc2VkICkKLSAgICAgIEZUX1N0cmVhbV9FeGl0RnJhbWUoIHN0cmVhbSApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHN0cm9rZS5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRzdHJva2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjYjNjYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHN0cm9rZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHN0cm9rZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgcGF0aCBzdHJva2VyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfU1RST0tFUl9ICi0jaW5jbHVkZSBGVF9UUklHT05PTUVUUllfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9NRU1PUllfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0KLSNpbmNsdWRlICJiYXNlcGljLmgiCi0KLQotICAvKiBkZWNsYXJlIGFuIGV4dGVybiB0byBhY2Nlc3MgYGZ0X291dGxpbmVfZ2x5cGhfY2xhc3MnIGdsb2JhbGx5ICAgICAqLwotICAvKiBhbGxvY2F0ZWQgIGluIGBmdGdseXBoLmMnLCBhbmQgdXNlIHRoZSBGVF9PVVRMSU5FX0dMWVBIX0NMQVNTX0dFVCAqLwotICAvKiBtYWNybyB0byBhY2Nlc3MgaXQgd2hlbiBGVF9DT05GSUdfT1BUSU9OX1BJQyBpcyBkZWZpbmVkICAgICAgICAgICAqLwotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotICBGVF9DQUxMQkFDS19UQUJMRSBjb25zdCBGVF9HbHlwaF9DbGFzcyAgZnRfb3V0bGluZV9nbHlwaF9jbGFzczsKLSNlbmRpZgotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHN0cm9rZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfU3Ryb2tlckJvcmRlciApCi0gIEZUX091dGxpbmVfR2V0SW5zaWRlQm9yZGVyKCBGVF9PdXRsaW5lKiAgb3V0bGluZSApCi0gIHsKLSAgICBGVF9PcmllbnRhdGlvbiAgbyA9IEZUX091dGxpbmVfR2V0X09yaWVudGF0aW9uKCBvdXRsaW5lICk7Ci0KLQotICAgIHJldHVybiBvID09IEZUX09SSUVOVEFUSU9OX1RSVUVUWVBFID8gRlRfU1RST0tFUl9CT1JERVJfUklHSFQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZUX1NUUk9LRVJfQk9SREVSX0xFRlQ7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX1N0cm9rZXJCb3JkZXIgKQotICBGVF9PdXRsaW5lX0dldE91dHNpZGVCb3JkZXIoIEZUX091dGxpbmUqICBvdXRsaW5lICkKLSAgewotICAgIEZUX09yaWVudGF0aW9uICBvID0gRlRfT3V0bGluZV9HZXRfT3JpZW50YXRpb24oIG91dGxpbmUgKTsKLQotCi0gICAgcmV0dXJuIG8gPT0gRlRfT1JJRU5UQVRJT05fVFJVRVRZUEUgPyBGVF9TVFJPS0VSX0JPUkRFUl9MRUZUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGVF9TVFJPS0VSX0JPUkRFUl9SSUdIVDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgIEJFWklFUiBDT01QVVRBVElPTlMgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgRlRfU01BTExfQ09OSUNfVEhSRVNIT0xEICAoIEZUX0FOR0xFX1BJIC8gNiApCi0jZGVmaW5lIEZUX1NNQUxMX0NVQklDX1RIUkVTSE9MRCAgKCBGVF9BTkdMRV9QSSAvIDggKQotCi0jZGVmaW5lIEZUX0VQU0lMT04gIDIKLQotI2RlZmluZSBGVF9JU19TTUFMTCggeCApICAoICh4KSA+IC1GVF9FUFNJTE9OICYmICh4KSA8IEZUX0VQU0lMT04gKQotCi0KLSAgc3RhdGljIEZUX1BvcwotICBmdF9wb3NfYWJzKCBGVF9Qb3MgIHggKQotICB7Ci0gICAgcmV0dXJuIHggPj0gMCA/IHggOiAteDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfY29uaWNfc3BsaXQoIEZUX1ZlY3RvciogIGJhc2UgKQotICB7Ci0gICAgRlRfUG9zICBhLCBiOwotCi0KLSAgICBiYXNlWzRdLnggPSBiYXNlWzJdLng7Ci0gICAgYiA9IGJhc2VbMV0ueDsKLSAgICBhID0gYmFzZVszXS54ID0gKCBiYXNlWzJdLnggKyBiICkgLyAyOwotICAgIGIgPSBiYXNlWzFdLnggPSAoIGJhc2VbMF0ueCArIGIgKSAvIDI7Ci0gICAgYmFzZVsyXS54ID0gKCBhICsgYiApIC8gMjsKLQotICAgIGJhc2VbNF0ueSA9IGJhc2VbMl0ueTsKLSAgICBiID0gYmFzZVsxXS55OwotICAgIGEgPSBiYXNlWzNdLnkgPSAoIGJhc2VbMl0ueSArIGIgKSAvIDI7Ci0gICAgYiA9IGJhc2VbMV0ueSA9ICggYmFzZVswXS55ICsgYiApIC8gMjsKLSAgICBiYXNlWzJdLnkgPSAoIGEgKyBiICkgLyAyOwotICB9Ci0KLQotICBzdGF0aWMgRlRfQm9vbAotICBmdF9jb25pY19pc19zbWFsbF9lbm91Z2goIEZUX1ZlY3RvciogIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAqYW5nbGVfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAqYW5nbGVfb3V0ICkKLSAgewotICAgIEZUX1ZlY3RvciAgZDEsIGQyOwotICAgIEZUX0FuZ2xlICAgdGhldGE7Ci0gICAgRlRfSW50ICAgICBjbG9zZTEsIGNsb3NlMjsKLQotCi0gICAgZDEueCA9IGJhc2VbMV0ueCAtIGJhc2VbMl0ueDsKLSAgICBkMS55ID0gYmFzZVsxXS55IC0gYmFzZVsyXS55OwotICAgIGQyLnggPSBiYXNlWzBdLnggLSBiYXNlWzFdLng7Ci0gICAgZDIueSA9IGJhc2VbMF0ueSAtIGJhc2VbMV0ueTsKLQotICAgIGNsb3NlMSA9IEZUX0lTX1NNQUxMKCBkMS54ICkgJiYgRlRfSVNfU01BTEwoIGQxLnkgKTsKLSAgICBjbG9zZTIgPSBGVF9JU19TTUFMTCggZDIueCApICYmIEZUX0lTX1NNQUxMKCBkMi55ICk7Ci0KLSAgICBpZiAoIGNsb3NlMSApCi0gICAgewotICAgICAgaWYgKCBjbG9zZTIgKQotICAgICAgewotICAgICAgICAvKiBiYXNpY2FsbHkgYSBwb2ludDsgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogZG8gbm90aGluZyB0byByZXRhaW4gb3JpZ2luYWwgZGlyZWN0aW9uICovCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICphbmdsZV9pbiAgPQotICAgICAgICAqYW5nbGVfb3V0ID0gRlRfQXRhbjIoIGQyLngsIGQyLnkgKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSAvKiAhY2xvc2UxICovCi0gICAgewotICAgICAgaWYgKCBjbG9zZTIgKQotICAgICAgewotICAgICAgICAqYW5nbGVfaW4gID0KLSAgICAgICAgKmFuZ2xlX291dCA9IEZUX0F0YW4yKCBkMS54LCBkMS55ICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICphbmdsZV9pbiAgPSBGVF9BdGFuMiggZDEueCwgZDEueSApOwotICAgICAgICAqYW5nbGVfb3V0ID0gRlRfQXRhbjIoIGQyLngsIGQyLnkgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB0aGV0YSA9IGZ0X3Bvc19hYnMoIEZUX0FuZ2xlX0RpZmYoICphbmdsZV9pbiwgKmFuZ2xlX291dCApICk7Ci0KLSAgICByZXR1cm4gRlRfQk9PTCggdGhldGEgPCBGVF9TTUFMTF9DT05JQ19USFJFU0hPTEQgKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfY3ViaWNfc3BsaXQoIEZUX1ZlY3RvciogIGJhc2UgKQotICB7Ci0gICAgRlRfUG9zICBhLCBiLCBjLCBkOwotCi0KLSAgICBiYXNlWzZdLnggPSBiYXNlWzNdLng7Ci0gICAgYyA9IGJhc2VbMV0ueDsKLSAgICBkID0gYmFzZVsyXS54OwotICAgIGJhc2VbMV0ueCA9IGEgPSAoIGJhc2VbMF0ueCArIGMgKSAvIDI7Ci0gICAgYmFzZVs1XS54ID0gYiA9ICggYmFzZVszXS54ICsgZCApIC8gMjsKLSAgICBjID0gKCBjICsgZCApIC8gMjsKLSAgICBiYXNlWzJdLnggPSBhID0gKCBhICsgYyApIC8gMjsKLSAgICBiYXNlWzRdLnggPSBiID0gKCBiICsgYyApIC8gMjsKLSAgICBiYXNlWzNdLnggPSAoIGEgKyBiICkgLyAyOwotCi0gICAgYmFzZVs2XS55ID0gYmFzZVszXS55OwotICAgIGMgPSBiYXNlWzFdLnk7Ci0gICAgZCA9IGJhc2VbMl0ueTsKLSAgICBiYXNlWzFdLnkgPSBhID0gKCBiYXNlWzBdLnkgKyBjICkgLyAyOwotICAgIGJhc2VbNV0ueSA9IGIgPSAoIGJhc2VbM10ueSArIGQgKSAvIDI7Ci0gICAgYyA9ICggYyArIGQgKSAvIDI7Ci0gICAgYmFzZVsyXS55ID0gYSA9ICggYSArIGMgKSAvIDI7Ci0gICAgYmFzZVs0XS55ID0gYiA9ICggYiArIGMgKSAvIDI7Ci0gICAgYmFzZVszXS55ID0gKCBhICsgYiApIC8gMjsKLSAgfQotCi0KLSAgLyogUmV0dXJuIHRoZSBhdmVyYWdlIG9mIGBhbmdsZTEnIGFuZCBgYW5nbGUyJy4gICAgICAgICAgICAqLwotICAvKiBUaGlzIGdpdmVzIGNvcnJlY3QgcmVzdWx0IGV2ZW4gaWYgYGFuZ2xlMScgYW5kIGBhbmdsZTInICovCi0gIC8qIGhhdmUgb3Bwb3NpdGUgc2lnbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0FuZ2xlCi0gIGZ0X2FuZ2xlX21lYW4oIEZUX0FuZ2xlICBhbmdsZTEsCi0gICAgICAgICAgICAgICAgIEZUX0FuZ2xlICBhbmdsZTIgKQotICB7Ci0gICAgcmV0dXJuIGFuZ2xlMSArIEZUX0FuZ2xlX0RpZmYoIGFuZ2xlMSwgYW5nbGUyICkgLyAyOwotICB9Ci0KLQotICBzdGF0aWMgRlRfQm9vbAotICBmdF9jdWJpY19pc19zbWFsbF9lbm91Z2goIEZUX1ZlY3RvciogIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAqYW5nbGVfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAqYW5nbGVfbWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgKmFuZ2xlX291dCApCi0gIHsKLSAgICBGVF9WZWN0b3IgIGQxLCBkMiwgZDM7Ci0gICAgRlRfQW5nbGUgICB0aGV0YTEsIHRoZXRhMjsKLSAgICBGVF9JbnQgICAgIGNsb3NlMSwgY2xvc2UyLCBjbG9zZTM7Ci0KLQotICAgIGQxLnggPSBiYXNlWzJdLnggLSBiYXNlWzNdLng7Ci0gICAgZDEueSA9IGJhc2VbMl0ueSAtIGJhc2VbM10ueTsKLSAgICBkMi54ID0gYmFzZVsxXS54IC0gYmFzZVsyXS54OwotICAgIGQyLnkgPSBiYXNlWzFdLnkgLSBiYXNlWzJdLnk7Ci0gICAgZDMueCA9IGJhc2VbMF0ueCAtIGJhc2VbMV0ueDsKLSAgICBkMy55ID0gYmFzZVswXS55IC0gYmFzZVsxXS55OwotCi0gICAgY2xvc2UxID0gRlRfSVNfU01BTEwoIGQxLnggKSAmJiBGVF9JU19TTUFMTCggZDEueSApOwotICAgIGNsb3NlMiA9IEZUX0lTX1NNQUxMKCBkMi54ICkgJiYgRlRfSVNfU01BTEwoIGQyLnkgKTsKLSAgICBjbG9zZTMgPSBGVF9JU19TTUFMTCggZDMueCApICYmIEZUX0lTX1NNQUxMKCBkMy55ICk7Ci0KLSAgICBpZiAoIGNsb3NlMSApCi0gICAgewotICAgICAgaWYgKCBjbG9zZTIgKQotICAgICAgewotICAgICAgICBpZiAoIGNsb3NlMyApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBiYXNpY2FsbHkgYSBwb2ludDsgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBkbyBub3RoaW5nIHRvIHJldGFpbiBvcmlnaW5hbCBkaXJlY3Rpb24gKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlIC8qICFjbG9zZTMgKi8KLSAgICAgICAgewotICAgICAgICAgICphbmdsZV9pbiAgPQotICAgICAgICAgICphbmdsZV9taWQgPQotICAgICAgICAgICphbmdsZV9vdXQgPSBGVF9BdGFuMiggZDMueCwgZDMueSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIC8qICFjbG9zZTIgKi8KLSAgICAgIHsKLSAgICAgICAgaWYgKCBjbG9zZTMgKQotICAgICAgICB7Ci0gICAgICAgICAgKmFuZ2xlX2luICA9Ci0gICAgICAgICAgKmFuZ2xlX21pZCA9Ci0gICAgICAgICAgKmFuZ2xlX291dCA9IEZUX0F0YW4yKCBkMi54LCBkMi55ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKiAhY2xvc2UzICovCi0gICAgICAgIHsKLSAgICAgICAgICAqYW5nbGVfaW4gID0KLSAgICAgICAgICAqYW5nbGVfbWlkID0gRlRfQXRhbjIoIGQyLngsIGQyLnkgKTsKLSAgICAgICAgICAqYW5nbGVfb3V0ID0gRlRfQXRhbjIoIGQzLngsIGQzLnkgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlIC8qICFjbG9zZTEgKi8KLSAgICB7Ci0gICAgICBpZiAoIGNsb3NlMiApCi0gICAgICB7Ci0gICAgICAgIGlmICggY2xvc2UzICkKLSAgICAgICAgewotICAgICAgICAgICphbmdsZV9pbiAgPQotICAgICAgICAgICphbmdsZV9taWQgPQotICAgICAgICAgICphbmdsZV9vdXQgPSBGVF9BdGFuMiggZDEueCwgZDEueSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogIWNsb3NlMyAqLwotICAgICAgICB7Ci0gICAgICAgICAgKmFuZ2xlX2luICA9IEZUX0F0YW4yKCBkMS54LCBkMS55ICk7Ci0gICAgICAgICAgKmFuZ2xlX291dCA9IEZUX0F0YW4yKCBkMy54LCBkMy55ICk7Ci0gICAgICAgICAgKmFuZ2xlX21pZCA9IGZ0X2FuZ2xlX21lYW4oICphbmdsZV9pbiwgKmFuZ2xlX291dCApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIC8qICFjbG9zZTIgKi8KLSAgICAgIHsKLSAgICAgICAgaWYgKCBjbG9zZTMgKQotICAgICAgICB7Ci0gICAgICAgICAgKmFuZ2xlX2luICA9IEZUX0F0YW4yKCBkMS54LCBkMS55ICk7Ci0gICAgICAgICAgKmFuZ2xlX21pZCA9Ci0gICAgICAgICAgKmFuZ2xlX291dCA9IEZUX0F0YW4yKCBkMi54LCBkMi55ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAvKiAhY2xvc2UzICovCi0gICAgICAgIHsKLSAgICAgICAgICAqYW5nbGVfaW4gID0gRlRfQXRhbjIoIGQxLngsIGQxLnkgKTsKLSAgICAgICAgICAqYW5nbGVfbWlkID0gRlRfQXRhbjIoIGQyLngsIGQyLnkgKTsKLSAgICAgICAgICAqYW5nbGVfb3V0ID0gRlRfQXRhbjIoIGQzLngsIGQzLnkgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHRoZXRhMSA9IGZ0X3Bvc19hYnMoIEZUX0FuZ2xlX0RpZmYoICphbmdsZV9pbiwgICphbmdsZV9taWQgKSApOwotICAgIHRoZXRhMiA9IGZ0X3Bvc19hYnMoIEZUX0FuZ2xlX0RpZmYoICphbmdsZV9taWQsICphbmdsZV9vdXQgKSApOwotCi0gICAgcmV0dXJuIEZUX0JPT0woIHRoZXRhMSA8IEZUX1NNQUxMX0NVQklDX1RIUkVTSE9MRCAmJgotICAgICAgICAgICAgICAgICAgICB0aGV0YTIgPCBGVF9TTUFMTF9DVUJJQ19USFJFU0hPTEQgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICBTVFJPS0UgQk9SREVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgdHlwZWRlZiBlbnVtICBGVF9TdHJva2VUYWdzXwotICB7Ci0gICAgRlRfU1RST0tFX1RBR19PTiAgICA9IDEsICAgLyogb24tY3VydmUgcG9pbnQgICovCi0gICAgRlRfU1RST0tFX1RBR19DVUJJQyA9IDIsICAgLyogY3ViaWMgb2ZmLXBvaW50ICovCi0gICAgRlRfU1RST0tFX1RBR19CRUdJTiA9IDQsICAgLyogc3ViLXBhdGggc3RhcnQgICovCi0gICAgRlRfU1RST0tFX1RBR19FTkQgICA9IDggICAgLyogc3ViLXBhdGggZW5kICAgICovCi0KLSAgfSBGVF9TdHJva2VUYWdzOwotCi0jZGVmaW5lICBGVF9TVFJPS0VfVEFHX0JFR0lOX0VORCAgKCBGVF9TVFJPS0VfVEFHX0JFR0lOIHwgRlRfU1RST0tFX1RBR19FTkQgKQotCi0gIHR5cGVkZWYgc3RydWN0ICBGVF9TdHJva2VCb3JkZXJSZWNfCi0gIHsKLSAgICBGVF9VSW50ICAgICBudW1fcG9pbnRzOwotICAgIEZUX1VJbnQgICAgIG1heF9wb2ludHM7Ci0gICAgRlRfVmVjdG9yKiAgcG9pbnRzOwotICAgIEZUX0J5dGUqICAgIHRhZ3M7Ci0gICAgRlRfQm9vbCAgICAgbW92YWJsZTsgIC8qIFRSVUUgZm9yIGVuZHMgb2YgbGluZXRvIGJvcmRlcnMgKi8KLSAgICBGVF9JbnQgICAgICBzdGFydDsgICAgLyogaW5kZXggb2YgY3VycmVudCBzdWItcGF0aCBzdGFydCBwb2ludCAqLwotICAgIEZUX01lbW9yeSAgIG1lbW9yeTsKLSAgICBGVF9Cb29sICAgICB2YWxpZDsKLQotICB9IEZUX1N0cm9rZUJvcmRlclJlYywgKkZUX1N0cm9rZUJvcmRlcjsKLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zdHJva2VfYm9yZGVyX2dyb3coIEZUX1N0cm9rZUJvcmRlciAgYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgbmV3X3BvaW50cyApCi0gIHsKLSAgICBGVF9VSW50ICAgb2xkX21heCA9IGJvcmRlci0+bWF4X3BvaW50czsKLSAgICBGVF9VSW50ICAgbmV3X21heCA9IGJvcmRlci0+bnVtX3BvaW50cyArIG5ld19wb2ludHM7Ci0gICAgRlRfRXJyb3IgIGVycm9yICAgPSBGVF9FcnJfT2s7Ci0KLQotICAgIGlmICggbmV3X21heCA+IG9sZF9tYXggKQotICAgIHsKLSAgICAgIEZUX1VJbnQgICAgY3VyX21heCA9IG9sZF9tYXg7Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSAgPSBib3JkZXItPm1lbW9yeTsKLQotCi0gICAgICB3aGlsZSAoIGN1cl9tYXggPCBuZXdfbWF4ICkKLSAgICAgICAgY3VyX21heCArPSAoIGN1cl9tYXggPj4gMSApICsgMTY7Ci0KLSAgICAgIGlmICggRlRfUkVORVdfQVJSQVkoIGJvcmRlci0+cG9pbnRzLCBvbGRfbWF4LCBjdXJfbWF4ICkgfHwKLSAgICAgICAgICAgRlRfUkVORVdfQVJSQVkoIGJvcmRlci0+dGFncywgICBvbGRfbWF4LCBjdXJfbWF4ICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGJvcmRlci0+bWF4X3BvaW50cyA9IGN1cl9tYXg7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9zdHJva2VfYm9yZGVyX2Nsb3NlKCBGVF9TdHJva2VCb3JkZXIgIGJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgICByZXZlcnNlICkKLSAgewotICAgIEZUX1VJbnQgIHN0YXJ0ID0gKEZUX1VJbnQpYm9yZGVyLT5zdGFydDsKLSAgICBGVF9VSW50ICBjb3VudCA9IGJvcmRlci0+bnVtX3BvaW50czsKLQotCi0gICAgRlRfQVNTRVJUKCBib3JkZXItPnN0YXJ0ID49IDAgKTsKLQotICAgIC8qIGRvbid0IHJlY29yZCBlbXB0eSBwYXRocyEgKi8KLSAgICBpZiAoIGNvdW50IDw9IHN0YXJ0ICsgMVUgKQotICAgICAgYm9yZGVyLT5udW1fcG9pbnRzID0gc3RhcnQ7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIGNvcHkgdGhlIGxhc3QgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgc3ViLXBhdGgsIHNpbmNlICovCi0gICAgICAvKiBpdCBjb250YWlucyB0aGUgYGFkanVzdGVkJyBzdGFydGluZyBjb29yZGluYXRlcyAgICAgICAgICAqLwotICAgICAgYm9yZGVyLT5udW1fcG9pbnRzICAgID0gLS1jb3VudDsKLSAgICAgIGJvcmRlci0+cG9pbnRzW3N0YXJ0XSA9IGJvcmRlci0+cG9pbnRzW2NvdW50XTsKLQotICAgICAgaWYgKCByZXZlcnNlICkKLSAgICAgIHsKLSAgICAgICAgLyogcmV2ZXJzZSB0aGUgcG9pbnRzICovCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9WZWN0b3IqICB2ZWMxID0gYm9yZGVyLT5wb2ludHMgKyBzdGFydCArIDE7Ci0gICAgICAgICAgRlRfVmVjdG9yKiAgdmVjMiA9IGJvcmRlci0+cG9pbnRzICsgY291bnQgLSAxOwotCi0KLSAgICAgICAgICBmb3IgKCA7IHZlYzEgPCB2ZWMyOyB2ZWMxKyssIHZlYzItLSApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVmVjdG9yICB0bXA7Ci0KLQotICAgICAgICAgICAgdG1wICAgPSAqdmVjMTsKLSAgICAgICAgICAgICp2ZWMxID0gKnZlYzI7Ci0gICAgICAgICAgICAqdmVjMiA9IHRtcDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB0aGVuIHRoZSB0YWdzICovCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9CeXRlKiAgdGFnMSA9IGJvcmRlci0+dGFncyArIHN0YXJ0ICsgMTsKLSAgICAgICAgICBGVF9CeXRlKiAgdGFnMiA9IGJvcmRlci0+dGFncyArIGNvdW50IC0gMTsKLQotCi0gICAgICAgICAgZm9yICggOyB0YWcxIDwgdGFnMjsgdGFnMSsrLCB0YWcyLS0gKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0J5dGUgIHRtcDsKLQotCi0gICAgICAgICAgICB0bXAgICA9ICp0YWcxOwotICAgICAgICAgICAgKnRhZzEgPSAqdGFnMjsKLSAgICAgICAgICAgICp0YWcyID0gdG1wOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBib3JkZXItPnRhZ3Nbc3RhcnQgICAgXSB8PSBGVF9TVFJPS0VfVEFHX0JFR0lOOwotICAgICAgYm9yZGVyLT50YWdzW2NvdW50IC0gMV0gfD0gRlRfU1RST0tFX1RBR19FTkQ7Ci0gICAgfQotCi0gICAgYm9yZGVyLT5zdGFydCAgID0gLTE7Ci0gICAgYm9yZGVyLT5tb3ZhYmxlID0gRkFMU0U7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zdHJva2VfYm9yZGVyX2xpbmV0byggRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAgICAgIHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgICBtb3ZhYmxlICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0gICAgRlRfQVNTRVJUKCBib3JkZXItPnN0YXJ0ID49IDAgKTsKLQotICAgIGlmICggYm9yZGVyLT5tb3ZhYmxlICkKLSAgICB7Ci0gICAgICAvKiBtb3ZlIGxhc3QgcG9pbnQgKi8KLSAgICAgIGJvcmRlci0+cG9pbnRzW2JvcmRlci0+bnVtX3BvaW50cyAtIDFdID0gKnRvOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogZG9uJ3QgYWRkIHplcm8tbGVuZ3RoIGxpbmV0byAqLwotICAgICAgaWYgKCBib3JkZXItPm51bV9wb2ludHMgPiAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgRlRfSVNfU01BTEwoIGJvcmRlci0+cG9pbnRzW2JvcmRlci0+bnVtX3BvaW50cyAtIDFdLnggLSB0by0+eCApICYmCi0gICAgICAgICAgIEZUX0lTX1NNQUxMKCBib3JkZXItPnBvaW50c1tib3JkZXItPm51bV9wb2ludHMgLSAxXS55IC0gdG8tPnkgKSApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgLyogYWRkIG9uZSBwb2ludCAqLwotICAgICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2dyb3coIGJvcmRlciwgMSApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgewotICAgICAgICBGVF9WZWN0b3IqICB2ZWMgPSBib3JkZXItPnBvaW50cyArIGJvcmRlci0+bnVtX3BvaW50czsKLSAgICAgICAgRlRfQnl0ZSogICAgdGFnID0gYm9yZGVyLT50YWdzICAgKyBib3JkZXItPm51bV9wb2ludHM7Ci0KLQotICAgICAgICB2ZWNbMF0gPSAqdG87Ci0gICAgICAgIHRhZ1swXSA9IEZUX1NUUk9LRV9UQUdfT047Ci0KLSAgICAgICAgYm9yZGVyLT5udW1fcG9pbnRzICs9IDE7Ci0gICAgICB9Ci0gICAgfQotICAgIGJvcmRlci0+bW92YWJsZSA9IG1vdmFibGU7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfc3Ryb2tlX2JvcmRlcl9jb25pY3RvKCBGVF9TdHJva2VCb3JkZXIgIGJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAgICAgIGNvbnRyb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgICAgICB0byApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIEZUX0FTU0VSVCggYm9yZGVyLT5zdGFydCA+PSAwICk7Ci0KLSAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfZ3JvdyggYm9yZGVyLCAyICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIEZUX1ZlY3RvciogIHZlYyA9IGJvcmRlci0+cG9pbnRzICsgYm9yZGVyLT5udW1fcG9pbnRzOwotICAgICAgRlRfQnl0ZSogICAgdGFnID0gYm9yZGVyLT50YWdzICAgKyBib3JkZXItPm51bV9wb2ludHM7Ci0KLQotICAgICAgdmVjWzBdID0gKmNvbnRyb2w7Ci0gICAgICB2ZWNbMV0gPSAqdG87Ci0KLSAgICAgIHRhZ1swXSA9IDA7Ci0gICAgICB0YWdbMV0gPSBGVF9TVFJPS0VfVEFHX09OOwotCi0gICAgICBib3JkZXItPm51bV9wb2ludHMgKz0gMjsKLSAgICB9Ci0KLSAgICBib3JkZXItPm1vdmFibGUgPSBGQUxTRTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3N0cm9rZV9ib3JkZXJfY3ViaWN0byggRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgICAgICBjb250cm9sMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAgICAgIGNvbnRyb2wyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogICAgICAgdG8gKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBGVF9BU1NFUlQoIGJvcmRlci0+c3RhcnQgPj0gMCApOwotCi0gICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2dyb3coIGJvcmRlciwgMyApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBGVF9WZWN0b3IqICB2ZWMgPSBib3JkZXItPnBvaW50cyArIGJvcmRlci0+bnVtX3BvaW50czsKLSAgICAgIEZUX0J5dGUqICAgIHRhZyA9IGJvcmRlci0+dGFncyAgICsgYm9yZGVyLT5udW1fcG9pbnRzOwotCi0KLSAgICAgIHZlY1swXSA9ICpjb250cm9sMTsKLSAgICAgIHZlY1sxXSA9ICpjb250cm9sMjsKLSAgICAgIHZlY1syXSA9ICp0bzsKLQotICAgICAgdGFnWzBdID0gRlRfU1RST0tFX1RBR19DVUJJQzsKLSAgICAgIHRhZ1sxXSA9IEZUX1NUUk9LRV9UQUdfQ1VCSUM7Ci0gICAgICB0YWdbMl0gPSBGVF9TVFJPS0VfVEFHX09OOwotCi0gICAgICBib3JkZXItPm51bV9wb2ludHMgKz0gMzsKLSAgICB9Ci0KLSAgICBib3JkZXItPm1vdmFibGUgPSBGQUxTRTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSNkZWZpbmUgRlRfQVJDX0NVQklDX0FOR0xFICAoIEZUX0FOR0xFX1BJIC8gMiApCi0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfc3Ryb2tlX2JvcmRlcl9hcmN0byggRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogICAgICAgY2VudGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICAgICAgIHJhZGl1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAgICAgICBhbmdsZV9zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQW5nbGUgICAgICAgICBhbmdsZV9kaWZmICkKLSAgewotICAgIEZUX0FuZ2xlICAgdG90YWwsIGFuZ2xlLCBzdGVwLCByb3RhdGUsIG5leHQsIHRoZXRhOwotICAgIEZUX1ZlY3RvciAgYSwgYiwgYTIsIGIyOwotICAgIEZUX0ZpeGVkICAgbGVuZ3RoOwotICAgIEZUX0Vycm9yICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIC8qIGNvbXB1dGUgc3RhcnQgcG9pbnQgKi8KLSAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmEsIHJhZGl1cywgYW5nbGVfc3RhcnQgKTsKLSAgICBhLnggKz0gY2VudGVyLT54OwotICAgIGEueSArPSBjZW50ZXItPnk7Ci0KLSAgICB0b3RhbCAgPSBhbmdsZV9kaWZmOwotICAgIGFuZ2xlICA9IGFuZ2xlX3N0YXJ0OwotICAgIHJvdGF0ZSA9ICggYW5nbGVfZGlmZiA+PSAwICkgPyBGVF9BTkdMRV9QSTIgOiAtRlRfQU5HTEVfUEkyOwotCi0gICAgd2hpbGUgKCB0b3RhbCAhPSAwICkKLSAgICB7Ci0gICAgICBzdGVwID0gdG90YWw7Ci0gICAgICBpZiAoIHN0ZXAgPiBGVF9BUkNfQ1VCSUNfQU5HTEUgKQotICAgICAgICBzdGVwID0gRlRfQVJDX0NVQklDX0FOR0xFOwotCi0gICAgICBlbHNlIGlmICggc3RlcCA8IC1GVF9BUkNfQ1VCSUNfQU5HTEUgKQotICAgICAgICBzdGVwID0gLUZUX0FSQ19DVUJJQ19BTkdMRTsKLQotICAgICAgbmV4dCAgPSBhbmdsZSArIHN0ZXA7Ci0gICAgICB0aGV0YSA9IHN0ZXA7Ci0gICAgICBpZiAoIHRoZXRhIDwgMCApCi0gICAgICAgIHRoZXRhID0gLXRoZXRhOwotCi0gICAgICB0aGV0YSA+Pj0gMTsKLQotICAgICAgLyogY29tcHV0ZSBlbmQgcG9pbnQgKi8KLSAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmYiwgcmFkaXVzLCBuZXh0ICk7Ci0gICAgICBiLnggKz0gY2VudGVyLT54OwotICAgICAgYi55ICs9IGNlbnRlci0+eTsKLQotICAgICAgLyogY29tcHV0ZSBmaXJzdCBhbmQgc2Vjb25kIGNvbnRyb2wgcG9pbnRzICovCi0gICAgICBsZW5ndGggPSBGVF9NdWxEaXYoIHJhZGl1cywgRlRfU2luKCB0aGV0YSApICogNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCAweDEwMDAwTCArIEZUX0NvcyggdGhldGEgKSApICogMyApOwotCi0gICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmEyLCBsZW5ndGgsIGFuZ2xlICsgcm90YXRlICk7Ci0gICAgICBhMi54ICs9IGEueDsKLSAgICAgIGEyLnkgKz0gYS55OwotCi0gICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmIyLCBsZW5ndGgsIG5leHQgLSByb3RhdGUgKTsKLSAgICAgIGIyLnggKz0gYi54OwotICAgICAgYjIueSArPSBiLnk7Ci0KLSAgICAgIC8qIGFkZCBjdWJpYyBhcmMgKi8KLSAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9jdWJpY3RvKCBib3JkZXIsICZhMiwgJmIyLCAmYiApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICAvKiBwcm9jZXNzIHRoZSByZXN0IG9mIHRoZSBhcmMgPz8gKi8KLSAgICAgIGEgICAgICA9IGI7Ci0gICAgICB0b3RhbCAtPSBzdGVwOwotICAgICAgYW5nbGUgID0gbmV4dDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zdHJva2VfYm9yZGVyX21vdmV0byggRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAgICAgIHRvICkKLSAgewotICAgIC8qIGNsb3NlIGN1cnJlbnQgb3BlbiBwYXRoIGlmIGFueSA/ICovCi0gICAgaWYgKCBib3JkZXItPnN0YXJ0ID49IDAgKQotICAgICAgZnRfc3Ryb2tlX2JvcmRlcl9jbG9zZSggYm9yZGVyLCBGQUxTRSApOwotCi0gICAgYm9yZGVyLT5zdGFydCA9IChGVF9JbnQpYm9yZGVyLT5udW1fcG9pbnRzOwotICAgIGJvcmRlci0+bW92YWJsZSA9IEZBTFNFOwotCi0gICAgcmV0dXJuIGZ0X3N0cm9rZV9ib3JkZXJfbGluZXRvKCBib3JkZXIsIHRvLCBGQUxTRSApOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9zdHJva2VfYm9yZGVyX2luaXQoIEZUX1N0cm9rZUJvcmRlciAgYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5ICkKLSAgewotICAgIGJvcmRlci0+bWVtb3J5ID0gbWVtb3J5OwotICAgIGJvcmRlci0+cG9pbnRzID0gTlVMTDsKLSAgICBib3JkZXItPnRhZ3MgICA9IE5VTEw7Ci0KLSAgICBib3JkZXItPm51bV9wb2ludHMgPSAwOwotICAgIGJvcmRlci0+bWF4X3BvaW50cyA9IDA7Ci0gICAgYm9yZGVyLT5zdGFydCAgICAgID0gLTE7Ci0gICAgYm9yZGVyLT52YWxpZCAgICAgID0gRkFMU0U7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X3N0cm9rZV9ib3JkZXJfcmVzZXQoIEZUX1N0cm9rZUJvcmRlciAgYm9yZGVyICkKLSAgewotICAgIGJvcmRlci0+bnVtX3BvaW50cyA9IDA7Ci0gICAgYm9yZGVyLT5zdGFydCAgICAgID0gLTE7Ci0gICAgYm9yZGVyLT52YWxpZCAgICAgID0gRkFMU0U7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X3N0cm9rZV9ib3JkZXJfZG9uZSggRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBib3JkZXItPm1lbW9yeTsKLQotCi0gICAgRlRfRlJFRSggYm9yZGVyLT5wb2ludHMgKTsKLSAgICBGVF9GUkVFKCBib3JkZXItPnRhZ3MgKTsKLQotICAgIGJvcmRlci0+bnVtX3BvaW50cyA9IDA7Ci0gICAgYm9yZGVyLT5tYXhfcG9pbnRzID0gMDsKLSAgICBib3JkZXItPnN0YXJ0ICAgICAgPSAtMTsKLSAgICBib3JkZXItPnZhbGlkICAgICAgPSBGQUxTRTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3N0cm9rZV9ib3JkZXJfZ2V0X2NvdW50cyggRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICphbnVtX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgKmFudW1fY29udG91cnMgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yICAgICAgICA9IEZUX0Vycl9PazsKLSAgICBGVF9VSW50ICAgbnVtX3BvaW50cyAgID0gMDsKLSAgICBGVF9VSW50ICAgbnVtX2NvbnRvdXJzID0gMDsKLQotICAgIEZUX1VJbnQgICAgIGNvdW50ICAgICAgPSBib3JkZXItPm51bV9wb2ludHM7Ci0gICAgRlRfVmVjdG9yKiAgcG9pbnQgICAgICA9IGJvcmRlci0+cG9pbnRzOwotICAgIEZUX0J5dGUqICAgIHRhZ3MgICAgICAgPSBib3JkZXItPnRhZ3M7Ci0gICAgRlRfSW50ICAgICAgaW5fY29udG91ciA9IDA7Ci0KLQotICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBudW1fcG9pbnRzKyssIHBvaW50KyssIHRhZ3MrKyApCi0gICAgewotICAgICAgaWYgKCB0YWdzWzBdICYgRlRfU1RST0tFX1RBR19CRUdJTiApCi0gICAgICB7Ci0gICAgICAgIGlmICggaW5fY29udG91ciAhPSAwICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgaW5fY29udG91ciA9IDE7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggaW5fY29udG91ciA9PSAwICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBpZiAoIHRhZ3NbMF0gJiBGVF9TVFJPS0VfVEFHX0VORCApCi0gICAgICB7Ci0gICAgICAgIGluX2NvbnRvdXIgPSAwOwotICAgICAgICBudW1fY29udG91cnMrKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIGluX2NvbnRvdXIgIT0gMCApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICBib3JkZXItPnZhbGlkID0gVFJVRTsKLQotICBFeGl0OgotICAgICphbnVtX3BvaW50cyAgID0gbnVtX3BvaW50czsKLSAgICAqYW51bV9jb250b3VycyA9IG51bV9jb250b3VyczsKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgRmFpbDoKLSAgICBudW1fcG9pbnRzICAgPSAwOwotICAgIG51bV9jb250b3VycyA9IDA7Ci0gICAgZ290byBFeGl0OwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBmdF9zdHJva2VfYm9yZGVyX2V4cG9ydCggRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgICAgIG91dGxpbmUgKQotICB7Ci0gICAgLyogY29weSBwb2ludCBsb2NhdGlvbnMgKi8KLSAgICBGVF9BUlJBWV9DT1BZKCBvdXRsaW5lLT5wb2ludHMgKyBvdXRsaW5lLT5uX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICBib3JkZXItPnBvaW50cywKLSAgICAgICAgICAgICAgICAgICBib3JkZXItPm51bV9wb2ludHMgKTsKLQotICAgIC8qIGNvcHkgdGFncyAqLwotICAgIHsKLSAgICAgIEZUX1VJbnQgICBjb3VudCA9IGJvcmRlci0+bnVtX3BvaW50czsKLSAgICAgIEZUX0J5dGUqICByZWFkICA9IGJvcmRlci0+dGFnczsKLSAgICAgIEZUX0J5dGUqICB3cml0ZSA9IChGVF9CeXRlKilvdXRsaW5lLT50YWdzICsgb3V0bGluZS0+bl9wb2ludHM7Ci0KLQotICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHJlYWQrKywgd3JpdGUrKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggKnJlYWQgJiBGVF9TVFJPS0VfVEFHX09OICkKLSAgICAgICAgICAqd3JpdGUgPSBGVF9DVVJWRV9UQUdfT047Ci0gICAgICAgIGVsc2UgaWYgKCAqcmVhZCAmIEZUX1NUUk9LRV9UQUdfQ1VCSUMgKQotICAgICAgICAgICp3cml0ZSA9IEZUX0NVUlZFX1RBR19DVUJJQzsKLSAgICAgICAgZWxzZQotICAgICAgICAgICp3cml0ZSA9IEZUX0NVUlZFX1RBR19DT05JQzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBjb3B5IGNvbnRvdXJzICovCi0gICAgewotICAgICAgRlRfVUludCAgICBjb3VudCA9IGJvcmRlci0+bnVtX3BvaW50czsKLSAgICAgIEZUX0J5dGUqICAgdGFncyAgPSBib3JkZXItPnRhZ3M7Ci0gICAgICBGVF9TaG9ydCogIHdyaXRlID0gb3V0bGluZS0+Y29udG91cnMgKyBvdXRsaW5lLT5uX2NvbnRvdXJzOwotICAgICAgRlRfU2hvcnQgICBpZHggICA9IChGVF9TaG9ydClvdXRsaW5lLT5uX3BvaW50czsKLQotCi0gICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgdGFncysrLCBpZHgrKyApCi0gICAgICB7Ci0gICAgICAgIGlmICggKnRhZ3MgJiBGVF9TVFJPS0VfVEFHX0VORCApCi0gICAgICAgIHsKLSAgICAgICAgICAqd3JpdGUrKyA9IGlkeDsKLSAgICAgICAgICBvdXRsaW5lLT5uX2NvbnRvdXJzKys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXRsaW5lLT5uX3BvaW50cyArPSAoc2hvcnQpYm9yZGVyLT5udW1fcG9pbnRzOwotCi0gICAgRlRfQVNTRVJUKCBGVF9PdXRsaW5lX0NoZWNrKCBvdXRsaW5lICkgPT0gMCApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICBTVFJPS0VSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBGVF9TSURFX1RPX1JPVEFURSggcyApICAgKCBGVF9BTkdMRV9QSTIgLSAocykgKiBGVF9BTkdMRV9QSSApCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEZUX1N0cm9rZXJSZWNfCi0gIHsKLSAgICBGVF9BbmdsZSAgICAgICAgICAgICBhbmdsZV9pbjsgICAgICAgICAgICAgLyogZGlyZWN0aW9uIGludG8gY3VyciBqb2luICovCi0gICAgRlRfQW5nbGUgICAgICAgICAgICAgYW5nbGVfb3V0OyAgICAgICAgICAgIC8qIGRpcmVjdGlvbiBvdXQgb2Ygam9pbiAgKi8KLSAgICBGVF9WZWN0b3IgICAgICAgICAgICBjZW50ZXI7ICAgICAgICAgICAgICAgLyogY3VycmVudCBwb3NpdGlvbiAqLwotICAgIEZUX0ZpeGVkICAgICAgICAgICAgIGxpbmVfbGVuZ3RoOyAgICAgICAgICAvKiBsZW5ndGggb2YgbGFzdCBsaW5ldG8gKi8KLSAgICBGVF9Cb29sICAgICAgICAgICAgICBmaXJzdF9wb2ludDsgICAgICAgICAgLyogaXMgdGhpcyB0aGUgc3RhcnQ/ICovCi0gICAgRlRfQm9vbCAgICAgICAgICAgICAgc3VicGF0aF9vcGVuOyAgICAgICAgIC8qIGlzIHRoZSBzdWJwYXRoIG9wZW4/ICovCi0gICAgRlRfQW5nbGUgICAgICAgICAgICAgc3VicGF0aF9hbmdsZTsgICAgICAgIC8qIHN1YnBhdGggc3RhcnQgZGlyZWN0aW9uICovCi0gICAgRlRfVmVjdG9yICAgICAgICAgICAgc3VicGF0aF9zdGFydDsgICAgICAgIC8qIHN1YnBhdGggc3RhcnQgcG9zaXRpb24gKi8KLSAgICBGVF9GaXhlZCAgICAgICAgICAgICBzdWJwYXRoX2xpbmVfbGVuZ3RoOyAgLyogc3VicGF0aCBzdGFydCBsaW5ldG8gbGVuICovCi0gICAgRlRfQm9vbCAgICAgICAgICAgICAgaGFuZGxlX3dpZGVfc3Ryb2tlczsgIC8qIHVzZSB3aWRlIHN0cm9rZXMgbG9naWM/ICovCi0KLSAgICBGVF9TdHJva2VyX0xpbmVDYXAgICBsaW5lX2NhcDsKLSAgICBGVF9TdHJva2VyX0xpbmVKb2luICBsaW5lX2pvaW47Ci0gICAgRlRfU3Ryb2tlcl9MaW5lSm9pbiAgbGluZV9qb2luX3NhdmVkOwotICAgIEZUX0ZpeGVkICAgICAgICAgICAgIG1pdGVyX2xpbWl0OwotICAgIEZUX0ZpeGVkICAgICAgICAgICAgIHJhZGl1czsKLQotICAgIEZUX1N0cm9rZUJvcmRlclJlYyAgIGJvcmRlcnNbMl07Ci0gICAgRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeTsKLQotICB9IEZUX1N0cm9rZXJSZWM7Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3Ryb2tlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfTmV3KCBGVF9MaWJyYXJ5ICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgIEZUX1N0cm9rZXIgICphc3Ryb2tlciApCi0gIHsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsgICAgICAgICAgIC8qIGFzc2lnbmVkIGluIEZUX05FVyAqLwotICAgIEZUX01lbW9yeSAgIG1lbW9yeTsKLSAgICBGVF9TdHJva2VyICBzdHJva2VyID0gTlVMTDsKLQotCi0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfTGlicmFyeV9IYW5kbGUgKTsKLQotICAgIGlmICggIWFzdHJva2VyICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0gICAgaWYgKCAhRlRfTkVXKCBzdHJva2VyICkgKQotICAgIHsKLSAgICAgIHN0cm9rZXItPmxpYnJhcnkgPSBsaWJyYXJ5OwotCi0gICAgICBmdF9zdHJva2VfYm9yZGVyX2luaXQoICZzdHJva2VyLT5ib3JkZXJzWzBdLCBtZW1vcnkgKTsKLSAgICAgIGZ0X3N0cm9rZV9ib3JkZXJfaW5pdCggJnN0cm9rZXItPmJvcmRlcnNbMV0sIG1lbW9yeSApOwotICAgIH0KLQotICAgICphc3Ryb2tlciA9IHN0cm9rZXI7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9TdHJva2VyX1NldCggRlRfU3Ryb2tlciAgICAgICAgICAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICAgICAgICAgIHJhZGl1cywKLSAgICAgICAgICAgICAgICAgIEZUX1N0cm9rZXJfTGluZUNhcCAgIGxpbmVfY2FwLAotICAgICAgICAgICAgICAgICAgRlRfU3Ryb2tlcl9MaW5lSm9pbiAgbGluZV9qb2luLAotICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgICAgICAgICAgbWl0ZXJfbGltaXQgKQotICB7Ci0gICAgaWYgKCAhc3Ryb2tlciApCi0gICAgICByZXR1cm47Ci0KLSAgICBzdHJva2VyLT5yYWRpdXMgICAgICA9IHJhZGl1czsKLSAgICBzdHJva2VyLT5saW5lX2NhcCAgICA9IGxpbmVfY2FwOwotICAgIHN0cm9rZXItPmxpbmVfam9pbiAgID0gbGluZV9qb2luOwotICAgIHN0cm9rZXItPm1pdGVyX2xpbWl0ID0gbWl0ZXJfbGltaXQ7Ci0KLSAgICAvKiBlbnN1cmUgbWl0ZXIgbGltaXQgaGFzIHNlbnNpYmxlIHZhbHVlICovCi0gICAgaWYgKCBzdHJva2VyLT5taXRlcl9saW1pdCA8IDB4MTAwMDBMICkKLSAgICAgIHN0cm9rZXItPm1pdGVyX2xpbWl0ID0gMHgxMDAwMEw7Ci0KLSAgICAvKiBzYXZlIGxpbmUgam9pbiBzdHlsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBsaW5lIGpvaW4gc3R5bGUgY2FuIGJlIHRlbXBvcmFyaWx5IGNoYW5nZWQgd2hlbiBzdHJva2luZyBjdXJ2ZXMgKi8KLSAgICBzdHJva2VyLT5saW5lX2pvaW5fc2F2ZWQgPSBsaW5lX2pvaW47Ci0KLSAgICBGVF9TdHJva2VyX1Jld2luZCggc3Ryb2tlciApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3Ryb2tlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfU3Ryb2tlcl9SZXdpbmQoIEZUX1N0cm9rZXIgIHN0cm9rZXIgKQotICB7Ci0gICAgaWYgKCBzdHJva2VyICkKLSAgICB7Ci0gICAgICBmdF9zdHJva2VfYm9yZGVyX3Jlc2V0KCAmc3Ryb2tlci0+Ym9yZGVyc1swXSApOwotICAgICAgZnRfc3Ryb2tlX2JvcmRlcl9yZXNldCggJnN0cm9rZXItPmJvcmRlcnNbMV0gKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9TdHJva2VyX0RvbmUoIEZUX1N0cm9rZXIgIHN0cm9rZXIgKQotICB7Ci0gICAgaWYgKCBzdHJva2VyICkKLSAgICB7Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cm9rZXItPmxpYnJhcnktPm1lbW9yeTsKLQotCi0gICAgICBmdF9zdHJva2VfYm9yZGVyX2RvbmUoICZzdHJva2VyLT5ib3JkZXJzWzBdICk7Ci0gICAgICBmdF9zdHJva2VfYm9yZGVyX2RvbmUoICZzdHJva2VyLT5ib3JkZXJzWzFdICk7Ci0KLSAgICAgIHN0cm9rZXItPmxpYnJhcnkgPSBOVUxMOwotICAgICAgRlRfRlJFRSggc3Ryb2tlciApOwotICAgIH0KLSAgfQotCi0KLSAgLyogY3JlYXRlIGEgY2lyY3VsYXIgYXJjIGF0IGEgY29ybmVyIG9yIGNhcCAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfc3Ryb2tlcl9hcmN0byggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgc2lkZSApCi0gIHsKLSAgICBGVF9BbmdsZSAgICAgICAgIHRvdGFsLCByb3RhdGU7Ci0gICAgRlRfRml4ZWQgICAgICAgICByYWRpdXMgPSBzdHJva2VyLT5yYWRpdXM7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIgPSBzdHJva2VyLT5ib3JkZXJzICsgc2lkZTsKLQotCi0gICAgcm90YXRlID0gRlRfU0lERV9UT19ST1RBVEUoIHNpZGUgKTsKLQotICAgIHRvdGFsID0gRlRfQW5nbGVfRGlmZiggc3Ryb2tlci0+YW5nbGVfaW4sIHN0cm9rZXItPmFuZ2xlX291dCApOwotICAgIGlmICggdG90YWwgPT0gRlRfQU5HTEVfUEkgKQotICAgICAgdG90YWwgPSAtcm90YXRlICogMjsKLQotICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9hcmN0byggYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cm9rZXItPmNlbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZXItPmFuZ2xlX2luICsgcm90YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKTsKLSAgICBib3JkZXItPm1vdmFibGUgPSBGQUxTRTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGFkZCBhIGNhcCBhdCB0aGUgZW5kIG9mIGFuIG9wZW5lZCBwYXRoICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zdHJva2VyX2NhcCggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgIGFuZ2xlLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgc2lkZSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIGlmICggc3Ryb2tlci0+bGluZV9jYXAgPT0gRlRfU1RST0tFUl9MSU5FQ0FQX1JPVU5EICkKLSAgICB7Ci0gICAgICAvKiBhZGQgYSByb3VuZCBjYXAgKi8KLSAgICAgIHN0cm9rZXItPmFuZ2xlX2luICA9IGFuZ2xlOwotICAgICAgc3Ryb2tlci0+YW5nbGVfb3V0ID0gYW5nbGUgKyBGVF9BTkdMRV9QSTsKLQotICAgICAgZXJyb3IgPSBmdF9zdHJva2VyX2FyY3RvKCBzdHJva2VyLCBzaWRlICk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBzdHJva2VyLT5saW5lX2NhcCA9PSBGVF9TVFJPS0VSX0xJTkVDQVBfU1FVQVJFICkKLSAgICB7Ci0gICAgICAvKiBhZGQgYSBzcXVhcmUgY2FwICovCi0gICAgICBGVF9WZWN0b3IgICAgICAgIGRlbHRhLCBkZWx0YTI7Ci0gICAgICBGVF9BbmdsZSAgICAgICAgIHJvdGF0ZSA9IEZUX1NJREVfVE9fUk9UQVRFKCBzaWRlICk7Ci0gICAgICBGVF9GaXhlZCAgICAgICAgIHJhZGl1cyA9IHN0cm9rZXItPnJhZGl1czsKLSAgICAgIEZUX1N0cm9rZUJvcmRlciAgYm9yZGVyID0gc3Ryb2tlci0+Ym9yZGVycyArIHNpZGU7Ci0KLQotICAgICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZkZWx0YTIsIHJhZGl1cywgYW5nbGUgKyByb3RhdGUgKTsKLSAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmZGVsdGEsICByYWRpdXMsIGFuZ2xlICk7Ci0KLSAgICAgIGRlbHRhLnggKz0gc3Ryb2tlci0+Y2VudGVyLnggKyBkZWx0YTIueDsKLSAgICAgIGRlbHRhLnkgKz0gc3Ryb2tlci0+Y2VudGVyLnkgKyBkZWx0YTIueTsKLQotICAgICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2xpbmV0byggYm9yZGVyLCAmZGVsdGEsIEZBTFNFICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhMiwgcmFkaXVzLCBhbmdsZSAtIHJvdGF0ZSApOwotICAgICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZkZWx0YSwgIHJhZGl1cywgYW5nbGUgKTsKLQotICAgICAgZGVsdGEueCArPSBkZWx0YTIueCArIHN0cm9rZXItPmNlbnRlci54OwotICAgICAgZGVsdGEueSArPSBkZWx0YTIueSArIHN0cm9rZXItPmNlbnRlci55OwotCi0gICAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfbGluZXRvKCBib3JkZXIsICZkZWx0YSwgRkFMU0UgKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIHN0cm9rZXItPmxpbmVfY2FwID09IEZUX1NUUk9LRVJfTElORUNBUF9CVVRUICkKLSAgICB7Ci0gICAgICAvKiBhZGQgYSBidXR0IGVuZGluZyAqLwotICAgICAgRlRfVmVjdG9yICAgICAgICBkZWx0YTsKLSAgICAgIEZUX0FuZ2xlICAgICAgICAgcm90YXRlID0gRlRfU0lERV9UT19ST1RBVEUoIHNpZGUgKTsKLSAgICAgIEZUX0ZpeGVkICAgICAgICAgcmFkaXVzID0gc3Ryb2tlci0+cmFkaXVzOwotICAgICAgRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIgPSBzdHJva2VyLT5ib3JkZXJzICsgc2lkZTsKLQotCi0gICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCByYWRpdXMsIGFuZ2xlICsgcm90YXRlICk7Ci0KLSAgICAgIGRlbHRhLnggKz0gc3Ryb2tlci0+Y2VudGVyLng7Ci0gICAgICBkZWx0YS55ICs9IHN0cm9rZXItPmNlbnRlci55OwotCi0gICAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfbGluZXRvKCBib3JkZXIsICZkZWx0YSwgRkFMU0UgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmZGVsdGEsIHJhZGl1cywgYW5nbGUgLSByb3RhdGUgKTsKLQotICAgICAgZGVsdGEueCArPSBzdHJva2VyLT5jZW50ZXIueDsKLSAgICAgIGRlbHRhLnkgKz0gc3Ryb2tlci0+Y2VudGVyLnk7Ci0KLSAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmRlbHRhLCBGQUxTRSApOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogcHJvY2VzcyBhbiBpbnNpZGUgY29ybmVyLCBpLmUuIGNvbXB1dGUgaW50ZXJzZWN0aW9uICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zdHJva2VyX2luc2lkZSggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIHNpZGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICBsaW5lX2xlbmd0aCApCi0gIHsKLSAgICBGVF9TdHJva2VCb3JkZXIgIGJvcmRlciA9IHN0cm9rZXItPmJvcmRlcnMgKyBzaWRlOwotICAgIEZUX0FuZ2xlICAgICAgICAgcGhpLCB0aGV0YSwgcm90YXRlOwotICAgIEZUX0ZpeGVkICAgICAgICAgbGVuZ3RoLCB0aGNvczsKLSAgICBGVF9WZWN0b3IgICAgICAgIGRlbHRhOwotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfQm9vbCAgICAgICAgICBpbnRlcnNlY3Q7ICAgICAgICAgIC8qIHVzZSBpbnRlcnNlY3Rpb24gb2YgbGluZXM/ICovCi0KLQotICAgIHJvdGF0ZSA9IEZUX1NJREVfVE9fUk9UQVRFKCBzaWRlICk7Ci0KLSAgICB0aGV0YSA9IEZUX0FuZ2xlX0RpZmYoIHN0cm9rZXItPmFuZ2xlX2luLCBzdHJva2VyLT5hbmdsZV9vdXQgKSAvIDI7Ci0KLSAgICAvKiBPbmx5IGludGVyc2VjdCBib3JkZXJzIGlmIGJldHdlZW4gdHdvIGxpbmV0bydzIGFuZCBib3RoICovCi0gICAgLyogbGluZXMgYXJlIGxvbmcgZW5vdWdoIChsaW5lX2xlbmd0aCBpcyB6ZXJvIGZvciBjdXJ2ZXMpLiAqLwotICAgIC8qIEFsc28gYXZvaWQgVS10dXJucyBvZiBuZWFybHkgMTgwIGRlZ3JlZS4gICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoICFib3JkZXItPm1vdmFibGUgfHwgbGluZV9sZW5ndGggPT0gMCAgfHwKLSAgICAgICAgIHRoZXRhID4gMHg1OUMwMDAgfHwgdGhldGEgPCAtMHg1OUMwMDAgKQotICAgICAgaW50ZXJzZWN0ID0gRkFMU0U7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIGNvbXB1dGUgbWluaW11bSByZXF1aXJlZCBsZW5ndGggb2YgbGluZXMgKi8KLSAgICAgIEZUX0ZpeGVkICBtaW5fbGVuZ3RoID0gZnRfcG9zX2FicyggRlRfTXVsRml4KCBzdHJva2VyLT5yYWRpdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVGFuKCB0aGV0YSApICkgKTsKLQotCi0gICAgICBpbnRlcnNlY3QgPSBGVF9CT09MKCBtaW5fbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VyLT5saW5lX2xlbmd0aCA+PSBtaW5fbGVuZ3RoICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX2xlbmd0aCAgICAgICAgICA+PSBtaW5fbGVuZ3RoICk7Ci0gICAgfQotCi0gICAgaWYgKCAhaW50ZXJzZWN0ICkKLSAgICB7Ci0gICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCBzdHJva2VyLT5yYWRpdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlci0+YW5nbGVfb3V0ICsgcm90YXRlICk7Ci0gICAgICBkZWx0YS54ICs9IHN0cm9rZXItPmNlbnRlci54OwotICAgICAgZGVsdGEueSArPSBzdHJva2VyLT5jZW50ZXIueTsKLQotICAgICAgYm9yZGVyLT5tb3ZhYmxlID0gRkFMU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBjb21wdXRlIG1lZGlhbiBhbmdsZSAqLwotICAgICAgcGhpID0gc3Ryb2tlci0+YW5nbGVfaW4gKyB0aGV0YTsKLQotICAgICAgdGhjb3MgPSBGVF9Db3MoIHRoZXRhICk7Ci0KLSAgICAgIGxlbmd0aCA9IEZUX0RpdkZpeCggc3Ryb2tlci0+cmFkaXVzLCB0aGNvcyApOwotCi0gICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCBsZW5ndGgsIHBoaSArIHJvdGF0ZSApOwotICAgICAgZGVsdGEueCArPSBzdHJva2VyLT5jZW50ZXIueDsKLSAgICAgIGRlbHRhLnkgKz0gc3Ryb2tlci0+Y2VudGVyLnk7Ci0gICAgfQotCi0gICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2xpbmV0byggYm9yZGVyLCAmZGVsdGEsIEZBTFNFICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIHByb2Nlc3MgYW4gb3V0c2lkZSBjb3JuZXIsIGkuZS4gY29tcHV0ZSBiZXZlbC9taXRlci9yb3VuZCAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfc3Ryb2tlcl9vdXRzaWRlKCBGVF9TdHJva2VyICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIHNpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgbGluZV9sZW5ndGggKQotICB7Ci0gICAgRlRfU3Ryb2tlQm9yZGVyICBib3JkZXIgPSBzdHJva2VyLT5ib3JkZXJzICsgc2lkZTsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yOwotICAgIEZUX0FuZ2xlICAgICAgICAgcm90YXRlOwotCi0KLSAgICBpZiAoIHN0cm9rZXItPmxpbmVfam9pbiA9PSBGVF9TVFJPS0VSX0xJTkVKT0lOX1JPVU5EICkKLSAgICAgIGVycm9yID0gZnRfc3Ryb2tlcl9hcmN0byggc3Ryb2tlciwgc2lkZSApOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiB0aGlzIGlzIGEgbWl0ZXJlZCAocG9pbnRlZCkgb3IgYmV2ZWxlZCAodHJ1bmNhdGVkKSBjb3JuZXIgKi8KLSAgICAgIEZUX0ZpeGVkICBzaWdtYSA9IDAsIHJhZGl1cyA9IHN0cm9rZXItPnJhZGl1czsKLSAgICAgIEZUX0FuZ2xlICB0aGV0YSA9IDAsIHBoaSA9IDA7Ci0gICAgICBGVF9GaXhlZCAgdGhjb3MgPSAwOwotICAgICAgRlRfQm9vbCAgIGJldmVsLCBmaXhlZF9iZXZlbDsKLQotCi0gICAgICByb3RhdGUgPSBGVF9TSURFX1RPX1JPVEFURSggc2lkZSApOwotCi0gICAgICBiZXZlbCA9Ci0gICAgICAgIEZUX0JPT0woIHN0cm9rZXItPmxpbmVfam9pbiA9PSBGVF9TVFJPS0VSX0xJTkVKT0lOX0JFVkVMICk7Ci0KLSAgICAgIGZpeGVkX2JldmVsID0KLSAgICAgICAgRlRfQk9PTCggc3Ryb2tlci0+bGluZV9qb2luICE9IEZUX1NUUk9LRVJfTElORUpPSU5fTUlURVJfVkFSSUFCTEUgKTsKLQotICAgICAgaWYgKCAhYmV2ZWwgKQotICAgICAgewotICAgICAgICB0aGV0YSA9IEZUX0FuZ2xlX0RpZmYoIHN0cm9rZXItPmFuZ2xlX2luLCBzdHJva2VyLT5hbmdsZV9vdXQgKTsKLQotICAgICAgICBpZiAoIHRoZXRhID09IEZUX0FOR0xFX1BJICkKLSAgICAgICAgewotICAgICAgICAgIHRoZXRhID0gcm90YXRlOwotICAgICAgICAgIHBoaSAgID0gc3Ryb2tlci0+YW5nbGVfaW47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdGhldGEgLz0gMjsKLSAgICAgICAgICBwaGkgICAgPSBzdHJva2VyLT5hbmdsZV9pbiArIHRoZXRhICsgcm90YXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgdGhjb3MgPSBGVF9Db3MoIHRoZXRhICk7Ci0gICAgICAgIHNpZ21hID0gRlRfTXVsRml4KCBzdHJva2VyLT5taXRlcl9saW1pdCwgdGhjb3MgKTsKLQotICAgICAgICAvKiBpcyBtaXRlciBsaW1pdCBleGNlZWRlZD8gKi8KLSAgICAgICAgaWYgKCBzaWdtYSA8IDB4MTAwMDBMICkKLSAgICAgICAgewotICAgICAgICAgIC8qIGRvbid0IGNyZWF0ZSB2YXJpYWJsZSBiZXZlbHMgZm9yIHZlcnkgc21hbGwgZGV2aWF0aW9uczsgKi8KLSAgICAgICAgICAvKiBGVF9TaW4oeCkgPSAwIGZvciB4IDw9IDU3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgaWYgKCBmaXhlZF9iZXZlbCB8fCBmdF9wb3NfYWJzKCB0aGV0YSApID4gNTcgKQotICAgICAgICAgICAgYmV2ZWwgPSBUUlVFOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggYmV2ZWwgKSAgLyogdGhpcyBpcyBhIGJldmVsIChicm9rZW4gYW5nbGUpICovCi0gICAgICB7Ci0gICAgICAgIGlmICggZml4ZWRfYmV2ZWwgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogdGhlIG91dGVyIGNvcm5lcnMgYXJlIHNpbXBseSBqb2luZWQgdG9nZXRoZXIgKi8KLSAgICAgICAgICBGVF9WZWN0b3IgIGRlbHRhOwotCi0KLSAgICAgICAgICAvKiBhZGQgYmV2ZWwgKi8KLSAgICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZXItPmFuZ2xlX291dCArIHJvdGF0ZSApOwotICAgICAgICAgIGRlbHRhLnggKz0gc3Ryb2tlci0+Y2VudGVyLng7Ci0gICAgICAgICAgZGVsdGEueSArPSBzdHJva2VyLT5jZW50ZXIueTsKLQotICAgICAgICAgIGJvcmRlci0+bW92YWJsZSA9IEZBTFNFOwotICAgICAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmRlbHRhLCBGQUxTRSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogdmFyaWFibGUgYmV2ZWwgKi8KLSAgICAgICAgewotICAgICAgICAgIC8qIHRoZSBtaXRlciBpcyB0cnVuY2F0ZWQgKi8KLSAgICAgICAgICBGVF9WZWN0b3IgIG1pZGRsZSwgZGVsdGE7Ci0gICAgICAgICAgRlRfRml4ZWQgICBsZW5ndGg7Ci0KLQotICAgICAgICAgIC8qIGNvbXB1dGUgbWlkZGxlIHBvaW50ICovCi0gICAgICAgICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZtaWRkbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggcmFkaXVzLCBzdHJva2VyLT5taXRlcl9saW1pdCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaGkgKTsKLSAgICAgICAgICBtaWRkbGUueCArPSBzdHJva2VyLT5jZW50ZXIueDsKLSAgICAgICAgICBtaWRkbGUueSArPSBzdHJva2VyLT5jZW50ZXIueTsKLQotICAgICAgICAgIC8qIGNvbXB1dGUgZmlyc3QgYW5nbGUgcG9pbnQgKi8KLSAgICAgICAgICBsZW5ndGggPSBGVF9NdWxEaXYoIHJhZGl1cywgMHgxMDAwMEwgLSBzaWdtYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0X3Bvc19hYnMoIEZUX1NpbiggdGhldGEgKSApICk7Ci0KLSAgICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCBsZW5ndGgsIHBoaSArIHJvdGF0ZSApOwotICAgICAgICAgIGRlbHRhLnggKz0gbWlkZGxlLng7Ci0gICAgICAgICAgZGVsdGEueSArPSBtaWRkbGUueTsKLQotICAgICAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmRlbHRhLCBGQUxTRSApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgLyogY29tcHV0ZSBzZWNvbmQgYW5nbGUgcG9pbnQgKi8KLSAgICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCBsZW5ndGgsIHBoaSAtIHJvdGF0ZSApOwotICAgICAgICAgIGRlbHRhLnggKz0gbWlkZGxlLng7Ci0gICAgICAgICAgZGVsdGEueSArPSBtaWRkbGUueTsKLQotICAgICAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmRlbHRhLCBGQUxTRSApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgLyogZmluYWxseSwgYWRkIGFuIGVuZCBwb2ludDsgb25seSBuZWVkZWQgaWYgbm90IGxpbmV0byAqLwotICAgICAgICAgIC8qIChsaW5lX2xlbmd0aCBpcyB6ZXJvIGZvciBjdXJ2ZXMpICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoIGxpbmVfbGVuZ3RoID09IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZXItPmFuZ2xlX291dCArIHJvdGF0ZSApOwotCi0gICAgICAgICAgICBkZWx0YS54ICs9IHN0cm9rZXItPmNlbnRlci54OwotICAgICAgICAgICAgZGVsdGEueSArPSBzdHJva2VyLT5jZW50ZXIueTsKLQotICAgICAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2xpbmV0byggYm9yZGVyLCAmZGVsdGEsIEZBTFNFICk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIC8qIHRoaXMgaXMgYSBtaXRlciAoaW50ZXJzZWN0aW9uKSAqLwotICAgICAgewotICAgICAgICBGVF9GaXhlZCAgIGxlbmd0aDsKLSAgICAgICAgRlRfVmVjdG9yICBkZWx0YTsKLQotCi0gICAgICAgIGxlbmd0aCA9IEZUX0RpdkZpeCggc3Ryb2tlci0+cmFkaXVzLCB0aGNvcyApOwotCi0gICAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmZGVsdGEsIGxlbmd0aCwgcGhpICk7Ci0gICAgICAgIGRlbHRhLnggKz0gc3Ryb2tlci0+Y2VudGVyLng7Ci0gICAgICAgIGRlbHRhLnkgKz0gc3Ryb2tlci0+Y2VudGVyLnk7Ci0KLSAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2xpbmV0byggYm9yZGVyLCAmZGVsdGEsIEZBTFNFICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAvKiBub3cgYWRkIGFuIGVuZCBwb2ludDsgb25seSBuZWVkZWQgaWYgbm90IGxpbmV0byAqLwotICAgICAgICAvKiAobGluZV9sZW5ndGggaXMgemVybyBmb3IgY3VydmVzKSAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIGxpbmVfbGVuZ3RoID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZkZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlci0+cmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VyLT5hbmdsZV9vdXQgKyByb3RhdGUgKTsKLSAgICAgICAgICBkZWx0YS54ICs9IHN0cm9rZXItPmNlbnRlci54OwotICAgICAgICAgIGRlbHRhLnkgKz0gc3Ryb2tlci0+Y2VudGVyLnk7Ci0KLSAgICAgICAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfbGluZXRvKCBib3JkZXIsICZkZWx0YSwgRkFMU0UgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3N0cm9rZXJfcHJvY2Vzc19jb3JuZXIoIEZUX1N0cm9rZXIgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgIGxpbmVfbGVuZ3RoICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9BbmdsZSAgdHVybjsKLSAgICBGVF9JbnQgICAgaW5zaWRlX3NpZGU7Ci0KLQotICAgIHR1cm4gPSBGVF9BbmdsZV9EaWZmKCBzdHJva2VyLT5hbmdsZV9pbiwgc3Ryb2tlci0+YW5nbGVfb3V0ICk7Ci0KLSAgICAvKiBubyBzcGVjaWZpYyBjb3JuZXIgcHJvY2Vzc2luZyBpcyByZXF1aXJlZCBpZiB0aGUgdHVybiBpcyAwICovCi0gICAgaWYgKCB0dXJuID09IDAgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogd2hlbiB3ZSB0dXJuIHRvIHRoZSByaWdodCwgdGhlIGluc2lkZSBzaWRlIGlzIDAgKi8KLSAgICAvKiBvdGhlcndpc2UsIHRoZSBpbnNpZGUgc2lkZSBpcyAxICovCi0gICAgaW5zaWRlX3NpZGUgPSAoIHR1cm4gPCAwICk7Ci0KLSAgICAvKiBwcm9jZXNzIHRoZSBpbnNpZGUgc2lkZSAqLwotICAgIGVycm9yID0gZnRfc3Ryb2tlcl9pbnNpZGUoIHN0cm9rZXIsIGluc2lkZV9zaWRlLCBsaW5lX2xlbmd0aCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogcHJvY2VzcyB0aGUgb3V0c2lkZSBzaWRlICovCi0gICAgZXJyb3IgPSBmdF9zdHJva2VyX291dHNpZGUoIHN0cm9rZXIsICFpbnNpZGVfc2lkZSwgbGluZV9sZW5ndGggKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogYWRkIHR3byBwb2ludHMgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0IGJvcmRlcnMgY29ycmVzcG9uZGluZyB0byB0aGUgKi8KLSAgLyogc3RhcnQgb2YgdGhlIHN1YnBhdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3N0cm9rZXJfc3VicGF0aF9zdGFydCggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgICBzdGFydF9hbmdsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICBsaW5lX2xlbmd0aCApCi0gIHsKLSAgICBGVF9WZWN0b3IgICAgICAgIGRlbHRhOwotICAgIEZUX1ZlY3RvciAgICAgICAgcG9pbnQ7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvcjsKLSAgICBGVF9TdHJva2VCb3JkZXIgIGJvcmRlcjsKLQotCi0gICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZkZWx0YSwgc3Ryb2tlci0+cmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9hbmdsZSArIEZUX0FOR0xFX1BJMiApOwotCi0gICAgcG9pbnQueCA9IHN0cm9rZXItPmNlbnRlci54ICsgZGVsdGEueDsKLSAgICBwb2ludC55ID0gc3Ryb2tlci0+Y2VudGVyLnkgKyBkZWx0YS55OwotCi0gICAgYm9yZGVyID0gc3Ryb2tlci0+Ym9yZGVyczsKLSAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfbW92ZXRvKCBib3JkZXIsICZwb2ludCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgcG9pbnQueCA9IHN0cm9rZXItPmNlbnRlci54IC0gZGVsdGEueDsKLSAgICBwb2ludC55ID0gc3Ryb2tlci0+Y2VudGVyLnkgLSBkZWx0YS55OwotCi0gICAgYm9yZGVyKys7Ci0gICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX21vdmV0byggYm9yZGVyLCAmcG9pbnQgKTsKLQotICAgIC8qIHNhdmUgYW5nbGUsIHBvc2l0aW9uLCBhbmQgbGluZSBsZW5ndGggZm9yIGxhc3Qgam9pbiAqLwotICAgIC8qIChsaW5lX2xlbmd0aCBpcyB6ZXJvIGZvciBjdXJ2ZXMpICAgICAgICAgICAgICAgICAgICAqLwotICAgIHN0cm9rZXItPnN1YnBhdGhfYW5nbGUgICAgICAgPSBzdGFydF9hbmdsZTsKLSAgICBzdHJva2VyLT5maXJzdF9wb2ludCAgICAgICAgID0gRkFMU0U7Ci0gICAgc3Ryb2tlci0+c3VicGF0aF9saW5lX2xlbmd0aCA9IGxpbmVfbGVuZ3RoOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3Ryb2tlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfTGluZVRvKCBGVF9TdHJva2VyICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgdG8gKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9TdHJva2VCb3JkZXIgIGJvcmRlcjsKLSAgICBGVF9WZWN0b3IgICAgICAgIGRlbHRhOwotICAgIEZUX0FuZ2xlICAgICAgICAgYW5nbGU7Ci0gICAgRlRfSW50ICAgICAgICAgICBzaWRlOwotICAgIEZUX0ZpeGVkICAgICAgICAgbGluZV9sZW5ndGg7Ci0KLQotICAgIGlmICggIXN0cm9rZXIgfHwgIXRvICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgZGVsdGEueCA9IHRvLT54IC0gc3Ryb2tlci0+Y2VudGVyLng7Ci0gICAgZGVsdGEueSA9IHRvLT55IC0gc3Ryb2tlci0+Y2VudGVyLnk7Ci0KLSAgICAvKiBhIHplcm8tbGVuZ3RoIGxpbmV0byBpcyBhIG5vLW9wOyBhdm9pZCBjcmVhdGluZyBhIHNwdXJpb3VzIGNvcm5lciAqLwotICAgIGlmICggZGVsdGEueCA9PSAwICYmIGRlbHRhLnkgPT0gMCApCi0gICAgICAgZ290byBFeGl0OwotCi0gICAgLyogY29tcHV0ZSBsZW5ndGggb2YgbGluZSAqLwotICAgIGxpbmVfbGVuZ3RoID0gRlRfVmVjdG9yX0xlbmd0aCggJmRlbHRhICk7Ci0KLSAgICBhbmdsZSA9IEZUX0F0YW4yKCBkZWx0YS54LCBkZWx0YS55ICk7Ci0gICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZkZWx0YSwgc3Ryb2tlci0+cmFkaXVzLCBhbmdsZSArIEZUX0FOR0xFX1BJMiApOwotCi0gICAgLyogcHJvY2VzcyBjb3JuZXIgaWYgbmVjZXNzYXJ5ICovCi0gICAgaWYgKCBzdHJva2VyLT5maXJzdF9wb2ludCApCi0gICAgewotICAgICAgLyogVGhpcyBpcyB0aGUgZmlyc3Qgc2VnbWVudCBvZiBhIHN1YnBhdGguICBXZSBuZWVkIHRvICAgICAqLwotICAgICAgLyogYWRkIGEgcG9pbnQgdG8gZWFjaCBib3JkZXIgYXQgdGhlaXIgcmVzcGVjdGl2ZSBzdGFydGluZyAqLwotICAgICAgLyogcG9pbnQgbG9jYXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgZXJyb3IgPSBmdF9zdHJva2VyX3N1YnBhdGhfc3RhcnQoIHN0cm9rZXIsIGFuZ2xlLCBsaW5lX2xlbmd0aCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIHByb2Nlc3MgdGhlIGN1cnJlbnQgY29ybmVyICovCi0gICAgICBzdHJva2VyLT5hbmdsZV9vdXQgPSBhbmdsZTsKLSAgICAgIGVycm9yID0gZnRfc3Ryb2tlcl9wcm9jZXNzX2Nvcm5lciggc3Ryb2tlciwgbGluZV9sZW5ndGggKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogbm93IGFkZCBhIGxpbmUgc2VnbWVudCB0byBib3RoIHRoZSBgaW5zaWRlJyBhbmQgYG91dHNpZGUnIHBhdGhzICovCi0gICAgZm9yICggYm9yZGVyID0gc3Ryb2tlci0+Ym9yZGVycywgc2lkZSA9IDE7IHNpZGUgPj0gMDsgc2lkZS0tLCBib3JkZXIrKyApCi0gICAgewotICAgICAgRlRfVmVjdG9yICBwb2ludDsKLQotCi0gICAgICBwb2ludC54ID0gdG8tPnggKyBkZWx0YS54OwotICAgICAgcG9pbnQueSA9IHRvLT55ICsgZGVsdGEueTsKLQotICAgICAgLyogdGhlIGVuZHMgb2YgbGluZXRvIGJvcmRlcnMgYXJlIG1vdmFibGUgKi8KLSAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJnBvaW50LCBUUlVFICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBkZWx0YS54ID0gLWRlbHRhLng7Ci0gICAgICBkZWx0YS55ID0gLWRlbHRhLnk7Ci0gICAgfQotCi0gICAgc3Ryb2tlci0+YW5nbGVfaW4gICAgPSBhbmdsZTsKLSAgICBzdHJva2VyLT5jZW50ZXIgICAgICA9ICp0bzsKLSAgICBzdHJva2VyLT5saW5lX2xlbmd0aCA9IGxpbmVfbGVuZ3RoOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3Ryb2tlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfQ29uaWNUbyggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBjb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIHRvICkKLSAgewotICAgIEZUX0Vycm9yICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX1ZlY3RvciAgIGJlel9zdGFja1szNF07Ci0gICAgRlRfVmVjdG9yKiAgYXJjOwotICAgIEZUX1ZlY3RvciogIGxpbWl0ID0gYmV6X3N0YWNrICsgMzA7Ci0gICAgRlRfQm9vbCAgICAgZmlyc3RfYXJjID0gVFJVRTsKLQotCi0gICAgaWYgKCAhc3Ryb2tlciB8fCAhY29udHJvbCB8fCAhdG8gKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBpZiBhbGwgY29udHJvbCBwb2ludHMgYXJlIGNvaW5jaWRlbnQsIHRoaXMgaXMgYSBuby1vcDsgKi8KLSAgICAvKiBhdm9pZCBjcmVhdGluZyBhIHNwdXJpb3VzIGNvcm5lciAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIEZUX0lTX1NNQUxMKCBzdHJva2VyLT5jZW50ZXIueCAtIGNvbnRyb2wtPnggKSAmJgotICAgICAgICAgRlRfSVNfU01BTEwoIHN0cm9rZXItPmNlbnRlci55IC0gY29udHJvbC0+eSApICYmCi0gICAgICAgICBGVF9JU19TTUFMTCggY29udHJvbC0+eCAgICAgICAgLSB0by0+eCAgICAgICkgJiYKLSAgICAgICAgIEZUX0lTX1NNQUxMKCBjb250cm9sLT55ICAgICAgICAtIHRvLT55ICAgICAgKSApCi0gICAgewotICAgICAgIHN0cm9rZXItPmNlbnRlciA9ICp0bzsKLSAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgYXJjICAgID0gYmV6X3N0YWNrOwotICAgIGFyY1swXSA9ICp0bzsKLSAgICBhcmNbMV0gPSAqY29udHJvbDsKLSAgICBhcmNbMl0gPSBzdHJva2VyLT5jZW50ZXI7Ci0KLSAgICB3aGlsZSAoIGFyYyA+PSBiZXpfc3RhY2sgKQotICAgIHsKLSAgICAgIEZUX0FuZ2xlICBhbmdsZV9pbiwgYW5nbGVfb3V0OwotCi0KLSAgICAgIC8qIGluaXRpYWxpemUgd2l0aCBjdXJyZW50IGRpcmVjdGlvbiAqLwotICAgICAgYW5nbGVfaW4gPSBhbmdsZV9vdXQgPSBzdHJva2VyLT5hbmdsZV9pbjsKLQotICAgICAgaWYgKCBhcmMgPCBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICFmdF9jb25pY19pc19zbWFsbF9lbm91Z2goIGFyYywgJmFuZ2xlX2luLCAmYW5nbGVfb3V0ICkgKQotICAgICAgewotICAgICAgICBpZiAoIHN0cm9rZXItPmZpcnN0X3BvaW50ICkKLSAgICAgICAgICBzdHJva2VyLT5hbmdsZV9pbiA9IGFuZ2xlX2luOwotCi0gICAgICAgIGZ0X2NvbmljX3NwbGl0KCBhcmMgKTsKLSAgICAgICAgYXJjICs9IDI7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoIGZpcnN0X2FyYyApCi0gICAgICB7Ci0gICAgICAgIGZpcnN0X2FyYyA9IEZBTFNFOwotCi0gICAgICAgIC8qIHByb2Nlc3MgY29ybmVyIGlmIG5lY2Vzc2FyeSAqLwotICAgICAgICBpZiAoIHN0cm9rZXItPmZpcnN0X3BvaW50ICkKLSAgICAgICAgICBlcnJvciA9IGZ0X3N0cm9rZXJfc3VicGF0aF9zdGFydCggc3Ryb2tlciwgYW5nbGVfaW4sIDAgKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgc3Ryb2tlci0+YW5nbGVfb3V0ID0gYW5nbGVfaW47Ci0gICAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VyX3Byb2Nlc3NfY29ybmVyKCBzdHJva2VyLCAwICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBmdF9wb3NfYWJzKCBGVF9BbmdsZV9EaWZmKCBzdHJva2VyLT5hbmdsZV9pbiwgYW5nbGVfaW4gKSApID4KLSAgICAgICAgICAgICAgICAgIEZUX1NNQUxMX0NPTklDX1RIUkVTSE9MRCAvIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgIHsKLSAgICAgICAgLyogaWYgdGhlIGRldmlhdGlvbiBmcm9tIG9uZSBhcmMgdG8gdGhlIG5leHQgaXMgdG9vIGdyZWF0LCAqLwotICAgICAgICAvKiBhZGQgYSByb3VuZCBjb3JuZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHN0cm9rZXItPmNlbnRlciAgICA9IGFyY1syXTsKLSAgICAgICAgc3Ryb2tlci0+YW5nbGVfb3V0ID0gYW5nbGVfaW47Ci0gICAgICAgIHN0cm9rZXItPmxpbmVfam9pbiA9IEZUX1NUUk9LRVJfTElORUpPSU5fUk9VTkQ7Ci0KLSAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VyX3Byb2Nlc3NfY29ybmVyKCBzdHJva2VyLCAwICk7Ci0KLSAgICAgICAgLyogcmVpbnN0YXRlIGxpbmUgam9pbiBzdHlsZSAqLwotICAgICAgICBzdHJva2VyLT5saW5lX2pvaW4gPSBzdHJva2VyLT5saW5lX2pvaW5fc2F2ZWQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIHRoZSBhcmMncyBhbmdsZSBpcyBzbWFsbCBlbm91Z2g7IHdlIGNhbiBhZGQgaXQgZGlyZWN0bHkgdG8gZWFjaCAqLwotICAgICAgLyogYm9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICB7Ci0gICAgICAgIEZUX1ZlY3RvciAgICAgICAgY3RybCwgZW5kOwotICAgICAgICBGVF9BbmdsZSAgICAgICAgIHRoZXRhLCBwaGksIHJvdGF0ZSwgYWxwaGEwID0gMDsKLSAgICAgICAgRlRfRml4ZWQgICAgICAgICBsZW5ndGg7Ci0gICAgICAgIEZUX1N0cm9rZUJvcmRlciAgYm9yZGVyOwotICAgICAgICBGVF9JbnQgICAgICAgICAgIHNpZGU7Ci0KLQotICAgICAgICB0aGV0YSAgPSBGVF9BbmdsZV9EaWZmKCBhbmdsZV9pbiwgYW5nbGVfb3V0ICkgLyAyOwotICAgICAgICBwaGkgICAgPSBhbmdsZV9pbiArIHRoZXRhOwotICAgICAgICBsZW5ndGggPSBGVF9EaXZGaXgoIHN0cm9rZXItPnJhZGl1cywgRlRfQ29zKCB0aGV0YSApICk7Ci0KLSAgICAgICAgLyogY29tcHV0ZSBkaXJlY3Rpb24gb2Ygb3JpZ2luYWwgYXJjICovCi0gICAgICAgIGlmICggc3Ryb2tlci0+aGFuZGxlX3dpZGVfc3Ryb2tlcyApCi0gICAgICAgICAgYWxwaGEwID0gRlRfQXRhbjIoIGFyY1swXS54IC0gYXJjWzJdLngsIGFyY1swXS55IC0gYXJjWzJdLnkgKTsKLQotICAgICAgICBmb3IgKCBib3JkZXIgPSBzdHJva2VyLT5ib3JkZXJzLCBzaWRlID0gMDsKLSAgICAgICAgICAgICAgc2lkZSA8PSAxOwotICAgICAgICAgICAgICBzaWRlKyssIGJvcmRlcisrICkKLSAgICAgICAgewotICAgICAgICAgIHJvdGF0ZSA9IEZUX1NJREVfVE9fUk9UQVRFKCBzaWRlICk7Ci0KLSAgICAgICAgICAvKiBjb21wdXRlIGNvbnRyb2wgcG9pbnQgKi8KLSAgICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmN0cmwsIGxlbmd0aCwgcGhpICsgcm90YXRlICk7Ci0gICAgICAgICAgY3RybC54ICs9IGFyY1sxXS54OwotICAgICAgICAgIGN0cmwueSArPSBhcmNbMV0ueTsKLQotICAgICAgICAgIC8qIGNvbXB1dGUgZW5kIHBvaW50ICovCi0gICAgICAgICAgRlRfVmVjdG9yX0Zyb21fUG9sYXIoICZlbmQsIHN0cm9rZXItPnJhZGl1cywgYW5nbGVfb3V0ICsgcm90YXRlICk7Ci0gICAgICAgICAgZW5kLnggKz0gYXJjWzBdLng7Ci0gICAgICAgICAgZW5kLnkgKz0gYXJjWzBdLnk7Ci0KLSAgICAgICAgICBpZiAoIHN0cm9rZXItPmhhbmRsZV93aWRlX3N0cm9rZXMgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1ZlY3RvciAgc3RhcnQ7Ci0gICAgICAgICAgICBGVF9BbmdsZSAgIGFscGhhMTsKLQotCi0gICAgICAgICAgICAvKiBkZXRlcm1pbmUgd2hldGhlciB0aGUgYm9yZGVyIHJhZGl1cyBpcyBncmVhdGVyIHRoYW4gdGhlICovCi0gICAgICAgICAgICAvKiByYWRpdXMgb2YgY3VydmF0dXJlIG9mIHRoZSBvcmlnaW5hbCBhcmMgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBzdGFydCA9IGJvcmRlci0+cG9pbnRzW2JvcmRlci0+bnVtX3BvaW50cyAtIDFdOwotCi0gICAgICAgICAgICBhbHBoYTEgPSBGVF9BdGFuMiggZW5kLnggLSBzdGFydC54LCBlbmQueSAtIHN0YXJ0LnkgKTsKLQotICAgICAgICAgICAgLyogaXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgYm9yZGVyIGFyYyBvcHBvc2l0ZSB0byAqLwotICAgICAgICAgICAgLyogdGhhdCBvZiB0aGUgb3JpZ2luYWwgYXJjPyAqLwotICAgICAgICAgICAgaWYgKCBmdF9wb3NfYWJzKCBGVF9BbmdsZV9EaWZmKCBhbHBoYTAsIGFscGhhMSApICkgPgotICAgICAgICAgICAgICAgICAgIEZUX0FOR0xFX1BJIC8gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9BbmdsZSAgIGJldGEsIGdhbW1hOwotICAgICAgICAgICAgICBGVF9WZWN0b3IgIGJ2ZWMsIGRlbHRhOwotICAgICAgICAgICAgICBGVF9GaXhlZCAgIGJsZW4sIHNpbkEsIHNpbkIsIGFsZW47Ci0KLQotICAgICAgICAgICAgICAvKiB1c2UgdGhlIHNpbmUgcnVsZSB0byBmaW5kIHRoZSBpbnRlcnNlY3Rpb24gcG9pbnQgKi8KLSAgICAgICAgICAgICAgYmV0YSAgPSBGVF9BdGFuMiggYXJjWzJdLnggLSBzdGFydC54LCBhcmNbMl0ueSAtIHN0YXJ0LnkgKTsKLSAgICAgICAgICAgICAgZ2FtbWEgPSBGVF9BdGFuMiggYXJjWzBdLnggLSBlbmQueCwgICBhcmNbMF0ueSAtIGVuZC55ICk7Ci0KLSAgICAgICAgICAgICAgYnZlYy54ID0gZW5kLnggLSBzdGFydC54OwotICAgICAgICAgICAgICBidmVjLnkgPSBlbmQueSAtIHN0YXJ0Lnk7Ci0KLSAgICAgICAgICAgICAgYmxlbiA9IEZUX1ZlY3Rvcl9MZW5ndGgoICZidmVjICk7Ci0KLSAgICAgICAgICAgICAgc2luQSA9IGZ0X3Bvc19hYnMoIEZUX1NpbiggYWxwaGExIC0gZ2FtbWEgKSApOwotICAgICAgICAgICAgICBzaW5CID0gZnRfcG9zX2FicyggRlRfU2luKCBiZXRhIC0gZ2FtbWEgKSApOwotCi0gICAgICAgICAgICAgIGFsZW4gPSBGVF9NdWxEaXYoIGJsZW4sIHNpbkEsIHNpbkIgKTsKLQotICAgICAgICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmRlbHRhLCBhbGVuLCBiZXRhICk7Ci0gICAgICAgICAgICAgIGRlbHRhLnggKz0gc3RhcnQueDsKLSAgICAgICAgICAgICAgZGVsdGEueSArPSBzdGFydC55OwotCi0gICAgICAgICAgICAgIC8qIGNpcmN1bW5hdmlnYXRlIHRoZSBuZWdhdGl2ZSBzZWN0b3IgYmFja3dhcmRzICovCi0gICAgICAgICAgICAgIGJvcmRlci0+bW92YWJsZSA9IEZBTFNFOwotICAgICAgICAgICAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfbGluZXRvKCBib3JkZXIsICZkZWx0YSwgRkFMU0UgKTsKLSAgICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfbGluZXRvKCBib3JkZXIsICZlbmQsIEZBTFNFICk7Ci0gICAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2NvbmljdG8oIGJvcmRlciwgJmN0cmwsICZzdGFydCApOwotICAgICAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICAgIC8qIGFuZCB0aGVuIG1vdmUgdG8gdGhlIGVuZHBvaW50ICovCi0gICAgICAgICAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmVuZCwgRkFMU0UgKTsKLSAgICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBlbHNlIGZhbGwgdGhyb3VnaCAqLwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIHNpbXBseSBhZGQgYW4gYXJjICovCi0gICAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2NvbmljdG8oIGJvcmRlciwgJmN0cmwsICZlbmQgKTsKLSAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBhcmMgLT0gMjsKLQotICAgICAgc3Ryb2tlci0+YW5nbGVfaW4gPSBhbmdsZV9vdXQ7Ci0gICAgfQotCi0gICAgc3Ryb2tlci0+Y2VudGVyID0gKnRvOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3Ryb2tlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfQ3ViaWNUbyggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBjb250cm9sMSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICBjb250cm9sMiwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICB0byApCi0gIHsKLSAgICBGVF9FcnJvciAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9WZWN0b3IgICBiZXpfc3RhY2tbMzddOwotICAgIEZUX1ZlY3RvciogIGFyYzsKLSAgICBGVF9WZWN0b3IqICBsaW1pdCA9IGJlel9zdGFjayArIDMyOwotICAgIEZUX0Jvb2wgICAgIGZpcnN0X2FyYyA9IFRSVUU7Ci0KLQotICAgIGlmICggIXN0cm9rZXIgfHwgIWNvbnRyb2wxIHx8ICFjb250cm9sMiB8fCAhdG8gKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBpZiBhbGwgY29udHJvbCBwb2ludHMgYXJlIGNvaW5jaWRlbnQsIHRoaXMgaXMgYSBuby1vcDsgKi8KLSAgICAvKiBhdm9pZCBjcmVhdGluZyBhIHNwdXJpb3VzIGNvcm5lciAqLwotICAgIGlmICggRlRfSVNfU01BTEwoIHN0cm9rZXItPmNlbnRlci54IC0gY29udHJvbDEtPnggKSAmJgotICAgICAgICAgRlRfSVNfU01BTEwoIHN0cm9rZXItPmNlbnRlci55IC0gY29udHJvbDEtPnkgKSAmJgotICAgICAgICAgRlRfSVNfU01BTEwoIGNvbnRyb2wxLT54ICAgICAgIC0gY29udHJvbDItPnggKSAmJgotICAgICAgICAgRlRfSVNfU01BTEwoIGNvbnRyb2wxLT55ICAgICAgIC0gY29udHJvbDItPnkgKSAmJgotICAgICAgICAgRlRfSVNfU01BTEwoIGNvbnRyb2wyLT54ICAgICAgIC0gdG8tPnggICAgICAgKSAmJgotICAgICAgICAgRlRfSVNfU01BTEwoIGNvbnRyb2wyLT55ICAgICAgIC0gdG8tPnkgICAgICAgKSApCi0gICAgewotICAgICAgIHN0cm9rZXItPmNlbnRlciA9ICp0bzsKLSAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgYXJjICAgID0gYmV6X3N0YWNrOwotICAgIGFyY1swXSA9ICp0bzsKLSAgICBhcmNbMV0gPSAqY29udHJvbDI7Ci0gICAgYXJjWzJdID0gKmNvbnRyb2wxOwotICAgIGFyY1szXSA9IHN0cm9rZXItPmNlbnRlcjsKLQotICAgIHdoaWxlICggYXJjID49IGJlel9zdGFjayApCi0gICAgewotICAgICAgRlRfQW5nbGUgIGFuZ2xlX2luLCBhbmdsZV9taWQsIGFuZ2xlX291dDsKLQotCi0gICAgICAvKiBpbml0aWFsaXplIHdpdGggY3VycmVudCBkaXJlY3Rpb24gKi8KLSAgICAgIGFuZ2xlX2luID0gYW5nbGVfb3V0ID0gYW5nbGVfbWlkID0gc3Ryb2tlci0+YW5nbGVfaW47Ci0KLSAgICAgIGlmICggYXJjIDwgbGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICFmdF9jdWJpY19pc19zbWFsbF9lbm91Z2goIGFyYywgJmFuZ2xlX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYW5nbGVfbWlkLCAmYW5nbGVfb3V0ICkgKQotICAgICAgewotICAgICAgICBpZiAoIHN0cm9rZXItPmZpcnN0X3BvaW50ICkKLSAgICAgICAgICBzdHJva2VyLT5hbmdsZV9pbiA9IGFuZ2xlX2luOwotCi0gICAgICAgIGZ0X2N1YmljX3NwbGl0KCBhcmMgKTsKLSAgICAgICAgYXJjICs9IDM7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoIGZpcnN0X2FyYyApCi0gICAgICB7Ci0gICAgICAgIGZpcnN0X2FyYyA9IEZBTFNFOwotCi0gICAgICAgIC8qIHByb2Nlc3MgY29ybmVyIGlmIG5lY2Vzc2FyeSAqLwotICAgICAgICBpZiAoIHN0cm9rZXItPmZpcnN0X3BvaW50ICkKLSAgICAgICAgICBlcnJvciA9IGZ0X3N0cm9rZXJfc3VicGF0aF9zdGFydCggc3Ryb2tlciwgYW5nbGVfaW4sIDAgKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgc3Ryb2tlci0+YW5nbGVfb3V0ID0gYW5nbGVfaW47Ci0gICAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VyX3Byb2Nlc3NfY29ybmVyKCBzdHJva2VyLCAwICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBmdF9wb3NfYWJzKCBGVF9BbmdsZV9EaWZmKCBzdHJva2VyLT5hbmdsZV9pbiwgYW5nbGVfaW4gKSApID4KLSAgICAgICAgICAgICAgICAgIEZUX1NNQUxMX0NVQklDX1RIUkVTSE9MRCAvIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgIHsKLSAgICAgICAgLyogaWYgdGhlIGRldmlhdGlvbiBmcm9tIG9uZSBhcmMgdG8gdGhlIG5leHQgaXMgdG9vIGdyZWF0LCAqLwotICAgICAgICAvKiBhZGQgYSByb3VuZCBjb3JuZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHN0cm9rZXItPmNlbnRlciAgICA9IGFyY1szXTsKLSAgICAgICAgc3Ryb2tlci0+YW5nbGVfb3V0ID0gYW5nbGVfaW47Ci0gICAgICAgIHN0cm9rZXItPmxpbmVfam9pbiA9IEZUX1NUUk9LRVJfTElORUpPSU5fUk9VTkQ7Ci0KLSAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VyX3Byb2Nlc3NfY29ybmVyKCBzdHJva2VyLCAwICk7Ci0KLSAgICAgICAgLyogcmVpbnN0YXRlIGxpbmUgam9pbiBzdHlsZSAqLwotICAgICAgICBzdHJva2VyLT5saW5lX2pvaW4gPSBzdHJva2VyLT5saW5lX2pvaW5fc2F2ZWQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIHRoZSBhcmMncyBhbmdsZSBpcyBzbWFsbCBlbm91Z2g7IHdlIGNhbiBhZGQgaXQgZGlyZWN0bHkgdG8gZWFjaCAqLwotICAgICAgLyogYm9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICB7Ci0gICAgICAgIEZUX1ZlY3RvciAgICAgICAgY3RybDEsIGN0cmwyLCBlbmQ7Ci0gICAgICAgIEZUX0FuZ2xlICAgICAgICAgdGhldGExLCBwaGkxLCB0aGV0YTIsIHBoaTIsIHJvdGF0ZSwgYWxwaGEwID0gMDsKLSAgICAgICAgRlRfRml4ZWQgICAgICAgICBsZW5ndGgxLCBsZW5ndGgyOwotICAgICAgICBGVF9TdHJva2VCb3JkZXIgIGJvcmRlcjsKLSAgICAgICAgRlRfSW50ICAgICAgICAgICBzaWRlOwotCi0KLSAgICAgICAgdGhldGExICA9IEZUX0FuZ2xlX0RpZmYoIGFuZ2xlX2luLCAgYW5nbGVfbWlkICkgLyAyOwotICAgICAgICB0aGV0YTIgID0gRlRfQW5nbGVfRGlmZiggYW5nbGVfbWlkLCBhbmdsZV9vdXQgKSAvIDI7Ci0gICAgICAgIHBoaTEgICAgPSBmdF9hbmdsZV9tZWFuKCBhbmdsZV9pbiwgIGFuZ2xlX21pZCApOwotICAgICAgICBwaGkyICAgID0gZnRfYW5nbGVfbWVhbiggYW5nbGVfbWlkLCBhbmdsZV9vdXQgKTsKLSAgICAgICAgbGVuZ3RoMSA9IEZUX0RpdkZpeCggc3Ryb2tlci0+cmFkaXVzLCBGVF9Db3MoIHRoZXRhMSApICk7Ci0gICAgICAgIGxlbmd0aDIgPSBGVF9EaXZGaXgoIHN0cm9rZXItPnJhZGl1cywgRlRfQ29zKCB0aGV0YTIgKSApOwotCi0gICAgICAgIC8qIGNvbXB1dGUgZGlyZWN0aW9uIG9mIG9yaWdpbmFsIGFyYyAqLwotICAgICAgICBpZiAoIHN0cm9rZXItPmhhbmRsZV93aWRlX3N0cm9rZXMgKQotICAgICAgICAgIGFscGhhMCA9IEZUX0F0YW4yKCBhcmNbMF0ueCAtIGFyY1szXS54LCBhcmNbMF0ueSAtIGFyY1szXS55ICk7Ci0KLSAgICAgICAgZm9yICggYm9yZGVyID0gc3Ryb2tlci0+Ym9yZGVycywgc2lkZSA9IDA7Ci0gICAgICAgICAgICAgIHNpZGUgPD0gMTsKLSAgICAgICAgICAgICAgc2lkZSsrLCBib3JkZXIrKyApCi0gICAgICAgIHsKLSAgICAgICAgICByb3RhdGUgPSBGVF9TSURFX1RPX1JPVEFURSggc2lkZSApOwotCi0gICAgICAgICAgLyogY29tcHV0ZSBjb250cm9sIHBvaW50cyAqLwotICAgICAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmY3RybDEsIGxlbmd0aDEsIHBoaTEgKyByb3RhdGUgKTsKLSAgICAgICAgICBjdHJsMS54ICs9IGFyY1syXS54OwotICAgICAgICAgIGN0cmwxLnkgKz0gYXJjWzJdLnk7Ci0KLSAgICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmN0cmwyLCBsZW5ndGgyLCBwaGkyICsgcm90YXRlICk7Ci0gICAgICAgICAgY3RybDIueCArPSBhcmNbMV0ueDsKLSAgICAgICAgICBjdHJsMi55ICs9IGFyY1sxXS55OwotCi0gICAgICAgICAgLyogY29tcHV0ZSBlbmQgcG9pbnQgKi8KLSAgICAgICAgICBGVF9WZWN0b3JfRnJvbV9Qb2xhciggJmVuZCwgc3Ryb2tlci0+cmFkaXVzLCBhbmdsZV9vdXQgKyByb3RhdGUgKTsKLSAgICAgICAgICBlbmQueCArPSBhcmNbMF0ueDsKLSAgICAgICAgICBlbmQueSArPSBhcmNbMF0ueTsKLQotICAgICAgICAgIGlmICggc3Ryb2tlci0+aGFuZGxlX3dpZGVfc3Ryb2tlcyApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVmVjdG9yICBzdGFydDsKLSAgICAgICAgICAgIEZUX0FuZ2xlICAgYWxwaGExOwotCi0KLSAgICAgICAgICAgIC8qIGRldGVybWluZSB3aGV0aGVyIHRoZSBib3JkZXIgcmFkaXVzIGlzIGdyZWF0ZXIgdGhhbiB0aGUgKi8KLSAgICAgICAgICAgIC8qIHJhZGl1cyBvZiBjdXJ2YXR1cmUgb2YgdGhlIG9yaWdpbmFsIGFyYyAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHN0YXJ0ID0gYm9yZGVyLT5wb2ludHNbYm9yZGVyLT5udW1fcG9pbnRzIC0gMV07Ci0KLSAgICAgICAgICAgIGFscGhhMSA9IEZUX0F0YW4yKCBlbmQueCAtIHN0YXJ0LngsIGVuZC55IC0gc3RhcnQueSApOwotCi0gICAgICAgICAgICAvKiBpcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSBib3JkZXIgYXJjIG9wcG9zaXRlIHRvICovCi0gICAgICAgICAgICAvKiB0aGF0IG9mIHRoZSBvcmlnaW5hbCBhcmM/ICovCi0gICAgICAgICAgICBpZiAoIGZ0X3Bvc19hYnMoIEZUX0FuZ2xlX0RpZmYoIGFscGhhMCwgYWxwaGExICkgKSA+Ci0gICAgICAgICAgICAgICAgICAgRlRfQU5HTEVfUEkgLyAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0FuZ2xlICAgYmV0YSwgZ2FtbWE7Ci0gICAgICAgICAgICAgIEZUX1ZlY3RvciAgYnZlYywgZGVsdGE7Ci0gICAgICAgICAgICAgIEZUX0ZpeGVkICAgYmxlbiwgc2luQSwgc2luQiwgYWxlbjsKLQotCi0gICAgICAgICAgICAgIC8qIHVzZSB0aGUgc2luZSBydWxlIHRvIGZpbmQgdGhlIGludGVyc2VjdGlvbiBwb2ludCAqLwotICAgICAgICAgICAgICBiZXRhICA9IEZUX0F0YW4yKCBhcmNbM10ueCAtIHN0YXJ0LngsIGFyY1szXS55IC0gc3RhcnQueSApOwotICAgICAgICAgICAgICBnYW1tYSA9IEZUX0F0YW4yKCBhcmNbMF0ueCAtIGVuZC54LCAgIGFyY1swXS55IC0gZW5kLnkgKTsKLQotICAgICAgICAgICAgICBidmVjLnggPSBlbmQueCAtIHN0YXJ0Lng7Ci0gICAgICAgICAgICAgIGJ2ZWMueSA9IGVuZC55IC0gc3RhcnQueTsKLQotICAgICAgICAgICAgICBibGVuID0gRlRfVmVjdG9yX0xlbmd0aCggJmJ2ZWMgKTsKLQotICAgICAgICAgICAgICBzaW5BID0gZnRfcG9zX2FicyggRlRfU2luKCBhbHBoYTEgLSBnYW1tYSApICk7Ci0gICAgICAgICAgICAgIHNpbkIgPSBmdF9wb3NfYWJzKCBGVF9TaW4oIGJldGEgLSBnYW1tYSApICk7Ci0KLSAgICAgICAgICAgICAgYWxlbiA9IEZUX011bERpdiggYmxlbiwgc2luQSwgc2luQiApOwotCi0gICAgICAgICAgICAgIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCAmZGVsdGEsIGFsZW4sIGJldGEgKTsKLSAgICAgICAgICAgICAgZGVsdGEueCArPSBzdGFydC54OwotICAgICAgICAgICAgICBkZWx0YS55ICs9IHN0YXJ0Lnk7Ci0KLSAgICAgICAgICAgICAgLyogY2lyY3VtbmF2aWdhdGUgdGhlIG5lZ2F0aXZlIHNlY3RvciBiYWNrd2FyZHMgKi8KLSAgICAgICAgICAgICAgYm9yZGVyLT5tb3ZhYmxlID0gRkFMU0U7Ci0gICAgICAgICAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmRlbHRhLCBGQUxTRSApOwotICAgICAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9saW5ldG8oIGJvcmRlciwgJmVuZCwgRkFMU0UgKTsKLSAgICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfY3ViaWN0byggYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0cmwyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmN0cmwxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0ICk7Ci0gICAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgICAgLyogYW5kIHRoZW4gbW92ZSB0byB0aGUgZW5kcG9pbnQgKi8KLSAgICAgICAgICAgICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2xpbmV0byggYm9yZGVyLCAmZW5kLCBGQUxTRSApOwotICAgICAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGVsc2UgZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogc2ltcGx5IGFkZCBhbiBhcmMgKi8KLSAgICAgICAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfY3ViaWN0byggYm9yZGVyLCAmY3RybDEsICZjdHJsMiwgJmVuZCApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGFyYyAtPSAzOwotCi0gICAgICBzdHJva2VyLT5hbmdsZV9pbiA9IGFuZ2xlX291dDsKLSAgICB9Ci0KLSAgICBzdHJva2VyLT5jZW50ZXIgPSAqdG87Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU3Ryb2tlcl9CZWdpblN1YlBhdGgoIEZUX1N0cm9rZXIgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICB0bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgIG9wZW4gKQotICB7Ci0gICAgaWYgKCAhc3Ryb2tlciB8fCAhdG8gKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICAvKiBXZSBjYW5ub3QgcHJvY2VzcyB0aGUgZmlyc3QgcG9pbnQsIGJlY2F1c2UgdGhlcmUgaXMgbm90IGVub3VnaCAgICAgICovCi0gICAgLyogaW5mb3JtYXRpb24gcmVnYXJkaW5nIGl0cyBjb3JuZXIvY2FwLiAgVGhlIGxhdHRlciB3aWxsIGJlIHByb2Nlc3NlZCAqLwotICAgIC8qIGluIHRoZSBgRlRfU3Ryb2tlcl9FbmRTdWJQYXRoJyByb3V0aW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgc3Ryb2tlci0+Zmlyc3RfcG9pbnQgID0gVFJVRTsKLSAgICBzdHJva2VyLT5jZW50ZXIgICAgICAgPSAqdG87Ci0gICAgc3Ryb2tlci0+c3VicGF0aF9vcGVuID0gb3BlbjsKLQotICAgIC8qIERldGVybWluZSBpZiB3ZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIGJvcmRlciByYWRpdXMgaXMgZ3JlYXRlciAqLwotICAgIC8qIHRoYW4gdGhlIHJhZGl1cyBvZiBjdXJ2YXR1cmUgb2YgYSBjdXJ2ZSwgdG8gaGFuZGxlIHRoaXMgY2FzZSAgICAgICAqLwotICAgIC8qIHNwZWNpYWxseS4gIFRoaXMgaXMgb25seSByZXF1aXJlZCBpZiBiZXZlbCBqb2lucyBvciBidXR0IGNhcHMgbWF5ICAqLwotICAgIC8qIGJlIGNyZWF0ZWQsIGJlY2F1c2Ugcm91bmQgJiBtaXRlciBqb2lucyBhbmQgcm91bmQgJiBzcXVhcmUgY2FwcyAgICAqLwotICAgIC8qIGNvdmVyIHRoZSBuZWdhdGl2ZSBzZWN0b3IgY3JlYXRlZCB3aXRoIHdpZGUgc3Ryb2tlcy4gICAgICAgICAgICAgICAqLwotICAgIHN0cm9rZXItPmhhbmRsZV93aWRlX3N0cm9rZXMgPQotICAgICAgRlRfQk9PTCggc3Ryb2tlci0+bGluZV9qb2luICE9IEZUX1NUUk9LRVJfTElORUpPSU5fUk9VTkQgIHx8Ci0gICAgICAgICAgICAgICAoIHN0cm9rZXItPnN1YnBhdGhfb3BlbiAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgIHN0cm9rZXItPmxpbmVfY2FwID09IEZUX1NUUk9LRVJfTElORUNBUF9CVVRUICkgKTsKLQotICAgIC8qIHJlY29yZCB0aGUgc3VicGF0aCBzdGFydCBwb2ludCBmb3IgZWFjaCBib3JkZXIgKi8KLSAgICBzdHJva2VyLT5zdWJwYXRoX3N0YXJ0ID0gKnRvOwotCi0gICAgc3Ryb2tlci0+YW5nbGVfaW4gPSAwOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3N0cm9rZXJfYWRkX3JldmVyc2VfbGVmdCggRlRfU3Ryb2tlciAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICBvcGVuICkKLSAgewotICAgIEZUX1N0cm9rZUJvcmRlciAgcmlnaHQgPSBzdHJva2VyLT5ib3JkZXJzICsgMDsKLSAgICBGVF9TdHJva2VCb3JkZXIgIGxlZnQgID0gc3Ryb2tlci0+Ym9yZGVycyArIDE7Ci0gICAgRlRfSW50ICAgICAgICAgICBuZXdfcG9pbnRzOwotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIEZUX0FTU0VSVCggbGVmdC0+c3RhcnQgPj0gMCApOwotCi0gICAgbmV3X3BvaW50cyA9IChGVF9JbnQpbGVmdC0+bnVtX3BvaW50cyAtIGxlZnQtPnN0YXJ0OwotICAgIGlmICggbmV3X3BvaW50cyA+IDAgKQotICAgIHsKLSAgICAgIGVycm9yID0gZnRfc3Ryb2tlX2JvcmRlcl9ncm93KCByaWdodCwgKEZUX1VJbnQpbmV3X3BvaW50cyApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgewotICAgICAgICBGVF9WZWN0b3IqICBkc3RfcG9pbnQgPSByaWdodC0+cG9pbnRzICsgcmlnaHQtPm51bV9wb2ludHM7Ci0gICAgICAgIEZUX0J5dGUqICAgIGRzdF90YWcgICA9IHJpZ2h0LT50YWdzICAgKyByaWdodC0+bnVtX3BvaW50czsKLSAgICAgICAgRlRfVmVjdG9yKiAgc3JjX3BvaW50ID0gbGVmdC0+cG9pbnRzICArIGxlZnQtPm51bV9wb2ludHMgLSAxOwotICAgICAgICBGVF9CeXRlKiAgICBzcmNfdGFnICAgPSBsZWZ0LT50YWdzICAgICsgbGVmdC0+bnVtX3BvaW50cyAtIDE7Ci0KLQotICAgICAgICB3aGlsZSAoIHNyY19wb2ludCA+PSBsZWZ0LT5wb2ludHMgKyBsZWZ0LT5zdGFydCApCi0gICAgICAgIHsKLSAgICAgICAgICAqZHN0X3BvaW50ID0gKnNyY19wb2ludDsKLSAgICAgICAgICAqZHN0X3RhZyAgID0gKnNyY190YWc7Ci0KLSAgICAgICAgICBpZiAoIG9wZW4gKQotICAgICAgICAgICAgZHN0X3RhZ1swXSAmPSB+RlRfU1RST0tFX1RBR19CRUdJTl9FTkQ7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0J5dGUgIHR0YWcgPQotICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSkoIGRzdF90YWdbMF0gJiBGVF9TVFJPS0VfVEFHX0JFR0lOX0VORCApOwotCi0KLSAgICAgICAgICAgIC8qIHN3aXRjaCBiZWdpbi9lbmQgdGFncyBpZiBuZWNlc3NhcnkgKi8KLSAgICAgICAgICAgIGlmICggdHRhZyA9PSBGVF9TVFJPS0VfVEFHX0JFR0lOIHx8Ci0gICAgICAgICAgICAgICAgIHR0YWcgPT0gRlRfU1RST0tFX1RBR19FTkQgICApCi0gICAgICAgICAgICAgIGRzdF90YWdbMF0gXj0gRlRfU1RST0tFX1RBR19CRUdJTl9FTkQ7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgc3JjX3BvaW50LS07Ci0gICAgICAgICAgc3JjX3RhZy0tOwotICAgICAgICAgIGRzdF9wb2ludCsrOwotICAgICAgICAgIGRzdF90YWcrKzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBsZWZ0LT5udW1fcG9pbnRzICAgPSAoRlRfVUludClsZWZ0LT5zdGFydDsKLSAgICAgIHJpZ2h0LT5udW1fcG9pbnRzICs9IChGVF9VSW50KW5ld19wb2ludHM7Ci0KLSAgICAgIHJpZ2h0LT5tb3ZhYmxlID0gRkFMU0U7Ci0gICAgICBsZWZ0LT5tb3ZhYmxlICA9IEZBTFNFOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHN0cm9rZS5oICovCi0KLSAgLyogdGhlcmUncyBhIGxvdCBvZiBtYWdpYyBpbiB0aGlzIGZ1bmN0aW9uISAqLwotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfRW5kU3ViUGF0aCggRlRfU3Ryb2tlciAgc3Ryb2tlciApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIGlmICggIXN0cm9rZXIgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIHN0cm9rZXItPnN1YnBhdGhfb3BlbiApCi0gICAgewotICAgICAgRlRfU3Ryb2tlQm9yZGVyICByaWdodCA9IHN0cm9rZXItPmJvcmRlcnM7Ci0KLQotICAgICAgLyogQWxsIHJpZ2h0LCB0aGlzIGlzIGFuIG9wZW5lZCBwYXRoLCB3ZSBuZWVkIHRvIGFkZCBhIGNhcCBiZXR3ZWVuICovCi0gICAgICAvKiByaWdodCAmIGxlZnQsIGFkZCB0aGUgcmV2ZXJzZSBvZiBsZWZ0LCB0aGVuIGFkZCBhIGZpbmFsIGNhcCAgICAgKi8KLSAgICAgIC8qIGJldHdlZW4gbGVmdCAmIHJpZ2h0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgZXJyb3IgPSBmdF9zdHJva2VyX2NhcCggc3Ryb2tlciwgc3Ryb2tlci0+YW5nbGVfaW4sIDAgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIGFkZCByZXZlcnNlZCBwb2ludHMgZnJvbSBgbGVmdCcgdG8gYHJpZ2h0JyAqLwotICAgICAgZXJyb3IgPSBmdF9zdHJva2VyX2FkZF9yZXZlcnNlX2xlZnQoIHN0cm9rZXIsIFRSVUUgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIG5vdyBhZGQgdGhlIGZpbmFsIGNhcCAqLwotICAgICAgc3Ryb2tlci0+Y2VudGVyID0gc3Ryb2tlci0+c3VicGF0aF9zdGFydDsKLSAgICAgIGVycm9yID0gZnRfc3Ryb2tlcl9jYXAoIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2VyLT5zdWJwYXRoX2FuZ2xlICsgRlRfQU5HTEVfUEksIDAgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIE5vdyBlbmQgdGhlIHJpZ2h0IHN1YnBhdGggYWNjb3JkaW5nbHkuICBUaGUgbGVmdCBvbmUgaXMgKi8KLSAgICAgIC8qIHJld2luZCBhbmQgZG9lc24ndCBuZWVkIGZ1cnRoZXIgcHJvY2Vzc2luZy4gICAgICAgICAgICAgKi8KLSAgICAgIGZ0X3N0cm9rZV9ib3JkZXJfY2xvc2UoIHJpZ2h0LCBGQUxTRSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfQW5nbGUgIHR1cm47Ci0gICAgICBGVF9JbnQgICAgaW5zaWRlX3NpZGU7Ci0KLQotICAgICAgLyogY2xvc2UgdGhlIHBhdGggaWYgbmVlZGVkICovCi0gICAgICBpZiAoIHN0cm9rZXItPmNlbnRlci54ICE9IHN0cm9rZXItPnN1YnBhdGhfc3RhcnQueCB8fAotICAgICAgICAgICBzdHJva2VyLT5jZW50ZXIueSAhPSBzdHJva2VyLT5zdWJwYXRoX3N0YXJ0LnkgKQotICAgICAgewotICAgICAgICAgZXJyb3IgPSBGVF9TdHJva2VyX0xpbmVUbyggc3Ryb2tlciwgJnN0cm9rZXItPnN1YnBhdGhfc3RhcnQgKTsKLSAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHByb2Nlc3MgdGhlIGNvcm5lciAqLwotICAgICAgc3Ryb2tlci0+YW5nbGVfb3V0ID0gc3Ryb2tlci0+c3VicGF0aF9hbmdsZTsKLSAgICAgIHR1cm4gICAgICAgICAgICAgICA9IEZUX0FuZ2xlX0RpZmYoIHN0cm9rZXItPmFuZ2xlX2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlci0+YW5nbGVfb3V0ICk7Ci0KLSAgICAgIC8qIG5vIHNwZWNpZmljIGNvcm5lciBwcm9jZXNzaW5nIGlzIHJlcXVpcmVkIGlmIHRoZSB0dXJuIGlzIDAgKi8KLSAgICAgIGlmICggdHVybiAhPSAwICkKLSAgICAgIHsKLSAgICAgICAgLyogd2hlbiB3ZSB0dXJuIHRvIHRoZSByaWdodCwgdGhlIGluc2lkZSBzaWRlIGlzIDAgKi8KLSAgICAgICAgLyogb3RoZXJ3aXNlLCB0aGUgaW5zaWRlIHNpZGUgaXMgMSAqLwotICAgICAgICBpbnNpZGVfc2lkZSA9ICggdHVybiA8IDAgKTsKLQotICAgICAgICBlcnJvciA9IGZ0X3N0cm9rZXJfaW5zaWRlKCBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVfc2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlci0+c3VicGF0aF9saW5lX2xlbmd0aCApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgLyogcHJvY2VzcyB0aGUgb3V0c2lkZSBzaWRlICovCi0gICAgICAgIGVycm9yID0gZnRfc3Ryb2tlcl9vdXRzaWRlKCBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWluc2lkZV9zaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlci0+c3VicGF0aF9saW5lX2xlbmd0aCApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHRoZW4gZW5kIG91ciB0d28gc3VicGF0aHMgKi8KLSAgICAgIGZ0X3N0cm9rZV9ib3JkZXJfY2xvc2UoIHN0cm9rZXItPmJvcmRlcnMgKyAwLCBGQUxTRSApOwotICAgICAgZnRfc3Ryb2tlX2JvcmRlcl9jbG9zZSggc3Ryb2tlci0+Ym9yZGVycyArIDEsIFRSVUUgKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU3Ryb2tlcl9HZXRCb3JkZXJDb3VudHMoIEZUX1N0cm9rZXIgICAgICAgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJva2VyQm9yZGVyICBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICphbnVtX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgKmFudW1fY29udG91cnMgKQotICB7Ci0gICAgRlRfVUludCAgIG51bV9wb2ludHMgPSAwLCBudW1fY29udG91cnMgPSAwOwotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgaWYgKCAhc3Ryb2tlciB8fCBib3JkZXIgPiAxICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2dldF9jb3VudHMoIHN0cm9rZXItPmJvcmRlcnMgKyBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1fcG9pbnRzLCAmbnVtX2NvbnRvdXJzICk7Ci0gIEV4aXQ6Ci0gICAgaWYgKCBhbnVtX3BvaW50cyApCi0gICAgICAqYW51bV9wb2ludHMgPSBudW1fcG9pbnRzOwotCi0gICAgaWYgKCBhbnVtX2NvbnRvdXJzICkKLSAgICAgICphbnVtX2NvbnRvdXJzID0gbnVtX2NvbnRvdXJzOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3Ryb2tlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX1N0cm9rZXJfR2V0Q291bnRzKCBGVF9TdHJva2VyICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAqYW51bV9wb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICphbnVtX2NvbnRvdXJzICkKLSAgewotICAgIEZUX1VJbnQgICBjb3VudDEsIGNvdW50MiwgbnVtX3BvaW50cyAgID0gMDsKLSAgICBGVF9VSW50ICAgY291bnQzLCBjb3VudDQsIG51bV9jb250b3VycyA9IDA7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBpZiAoICFzdHJva2VyICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgZXJyb3IgPSBmdF9zdHJva2VfYm9yZGVyX2dldF9jb3VudHMoIHN0cm9rZXItPmJvcmRlcnMgKyAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQxLCAmY291bnQyICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBlcnJvciA9IGZ0X3N0cm9rZV9ib3JkZXJfZ2V0X2NvdW50cyggc3Ryb2tlci0+Ym9yZGVycyArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3VudDMsICZjb3VudDQgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIG51bV9wb2ludHMgICA9IGNvdW50MSArIGNvdW50MzsKLSAgICBudW1fY29udG91cnMgPSBjb3VudDIgKyBjb3VudDQ7Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGFudW1fcG9pbnRzICkKLSAgICAgICphbnVtX3BvaW50cyAgID0gbnVtX3BvaW50czsKLQotICAgIGlmICggYW51bV9jb250b3VycyApCi0gICAgICAqYW51bV9jb250b3VycyA9IG51bV9jb250b3VyczsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHN0cm9rZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX1N0cm9rZXJfRXhwb3J0Qm9yZGVyKCBGVF9TdHJva2VyICAgICAgICBzdHJva2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3Ryb2tlckJvcmRlciAgYm9yZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT3V0bGluZSogICAgICAgb3V0bGluZSApCi0gIHsKLSAgICBpZiAoICFzdHJva2VyIHx8ICFvdXRsaW5lICkKLSAgICAgIHJldHVybjsKLQotICAgIGlmICggYm9yZGVyID09IEZUX1NUUk9LRVJfQk9SREVSX0xFRlQgIHx8Ci0gICAgICAgICBib3JkZXIgPT0gRlRfU1RST0tFUl9CT1JERVJfUklHSFQgKQotICAgIHsKLSAgICAgIEZUX1N0cm9rZUJvcmRlciAgc2JvcmRlciA9ICYgc3Ryb2tlci0+Ym9yZGVyc1tib3JkZXJdOwotCi0KLSAgICAgIGlmICggc2JvcmRlci0+dmFsaWQgKQotICAgICAgICBmdF9zdHJva2VfYm9yZGVyX2V4cG9ydCggc2JvcmRlciwgb3V0bGluZSApOwotICAgIH0KLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHN0cm9rZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX1N0cm9rZXJfRXhwb3J0KCBGVF9TdHJva2VyICAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX091dGxpbmUqICBvdXRsaW5lICkKLSAgewotICAgIEZUX1N0cm9rZXJfRXhwb3J0Qm9yZGVyKCBzdHJva2VyLCBGVF9TVFJPS0VSX0JPUkRFUl9MRUZULCBvdXRsaW5lICk7Ci0gICAgRlRfU3Ryb2tlcl9FeHBvcnRCb3JkZXIoIHN0cm9rZXIsIEZUX1NUUk9LRVJfQk9SREVSX1JJR0hULCBvdXRsaW5lICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzdHJva2UuaCAqLwotCi0gIC8qCi0gICAqICBUaGUgZm9sbG93aW5nIGlzIHZlcnkgc2ltaWxhciB0byBGVF9PdXRsaW5lX0RlY29tcG9zZSwgZXhjZXB0Ci0gICAqICB0aGF0IHdlIGRvIHN1cHBvcnQgb3BlbmVkIHBhdGhzLCBhbmQgZG8gbm90IHNjYWxlIHRoZSBvdXRsaW5lLgotICAgKi8KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9TdHJva2VyX1BhcnNlT3V0bGluZSggRlRfU3Ryb2tlciAgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICBvcGVuZWQgKQotICB7Ci0gICAgRlRfVmVjdG9yICAgdl9sYXN0OwotICAgIEZUX1ZlY3RvciAgIHZfY29udHJvbDsKLSAgICBGVF9WZWN0b3IgICB2X3N0YXJ0OwotCi0gICAgRlRfVmVjdG9yKiAgcG9pbnQ7Ci0gICAgRlRfVmVjdG9yKiAgbGltaXQ7Ci0gICAgY2hhciogICAgICAgdGFnczsKLQotICAgIEZUX0Vycm9yICAgIGVycm9yOwotCi0gICAgRlRfSW50ICAgICAgbjsgICAgICAgICAvKiBpbmRleCBvZiBjb250b3VyIGluIG91dGxpbmUgICAgICovCi0gICAgRlRfVUludCAgICAgZmlyc3Q7ICAgICAvKiBpbmRleCBvZiBmaXJzdCBwb2ludCBpbiBjb250b3VyICovCi0gICAgRlRfSW50ICAgICAgdGFnOyAgICAgICAvKiBjdXJyZW50IHBvaW50J3Mgc3RhdGUgICAgICAgICAgICovCi0KLQotICAgIGlmICggIW91dGxpbmUgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX091dGxpbmUgKTsKLQotICAgIGlmICggIXN0cm9rZXIgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBGVF9TdHJva2VyX1Jld2luZCggc3Ryb2tlciApOwotCi0gICAgZmlyc3QgPSAwOwotCi0gICAgZm9yICggbiA9IDA7IG4gPCBvdXRsaW5lLT5uX2NvbnRvdXJzOyBuKysgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIGxhc3Q7ICAvKiBpbmRleCBvZiBsYXN0IHBvaW50IGluIGNvbnRvdXIgKi8KLQotCi0gICAgICBsYXN0ICA9IChGVF9VSW50KW91dGxpbmUtPmNvbnRvdXJzW25dOwotICAgICAgbGltaXQgPSBvdXRsaW5lLT5wb2ludHMgKyBsYXN0OwotCi0gICAgICAvKiBza2lwIGVtcHR5IHBvaW50czsgd2UgZG9uJ3Qgc3Ryb2tlIHRoZXNlICovCi0gICAgICBpZiAoIGxhc3QgPD0gZmlyc3QgKQotICAgICAgewotICAgICAgICBmaXJzdCA9IGxhc3QgKyAxOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgdl9zdGFydCA9IG91dGxpbmUtPnBvaW50c1tmaXJzdF07Ci0gICAgICB2X2xhc3QgID0gb3V0bGluZS0+cG9pbnRzW2xhc3RdOwotCi0gICAgICB2X2NvbnRyb2wgPSB2X3N0YXJ0OwotCi0gICAgICBwb2ludCA9IG91dGxpbmUtPnBvaW50cyArIGZpcnN0OwotICAgICAgdGFncyAgPSBvdXRsaW5lLT50YWdzICAgKyBmaXJzdDsKLSAgICAgIHRhZyAgID0gRlRfQ1VSVkVfVEFHKCB0YWdzWzBdICk7Ci0KLSAgICAgIC8qIEEgY29udG91ciBjYW5ub3Qgc3RhcnQgd2l0aCBhIGN1YmljIGNvbnRyb2wgcG9pbnQhICovCi0gICAgICBpZiAoIHRhZyA9PSBGVF9DVVJWRV9UQUdfQ1VCSUMgKQotICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgICAgLyogY2hlY2sgZmlyc3QgcG9pbnQgdG8gZGV0ZXJtaW5lIG9yaWdpbiAqLwotICAgICAgaWYgKCB0YWcgPT0gRlRfQ1VSVkVfVEFHX0NPTklDICkKLSAgICAgIHsKLSAgICAgICAgLyogRmlyc3QgcG9pbnQgaXMgY29uaWMgY29udHJvbC4gIFllcywgdGhpcyBoYXBwZW5zLiAqLwotICAgICAgICBpZiAoIEZUX0NVUlZFX1RBRyggb3V0bGluZS0+dGFnc1tsYXN0XSApID09IEZUX0NVUlZFX1RBR19PTiApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBzdGFydCBhdCBsYXN0IHBvaW50IGlmIGl0IGlzIG9uIHRoZSBjdXJ2ZSAqLwotICAgICAgICAgIHZfc3RhcnQgPSB2X2xhc3Q7Ci0gICAgICAgICAgbGltaXQtLTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBpZiBib3RoIGZpcnN0IGFuZCBsYXN0IHBvaW50cyBhcmUgY29uaWMsICovCi0gICAgICAgICAgLyogc3RhcnQgYXQgdGhlaXIgbWlkZGxlICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIHZfc3RhcnQueCA9ICggdl9zdGFydC54ICsgdl9sYXN0LnggKSAvIDI7Ci0gICAgICAgICAgdl9zdGFydC55ID0gKCB2X3N0YXJ0LnkgKyB2X2xhc3QueSApIC8gMjsKLSAgICAgICAgfQotICAgICAgICBwb2ludC0tOwotICAgICAgICB0YWdzLS07Ci0gICAgICB9Ci0KLSAgICAgIGVycm9yID0gRlRfU3Ryb2tlcl9CZWdpblN1YlBhdGgoIHN0cm9rZXIsICZ2X3N0YXJ0LCBvcGVuZWQgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHdoaWxlICggcG9pbnQgPCBsaW1pdCApCi0gICAgICB7Ci0gICAgICAgIHBvaW50Kys7Ci0gICAgICAgIHRhZ3MrKzsKLQotICAgICAgICB0YWcgPSBGVF9DVVJWRV9UQUcoIHRhZ3NbMF0gKTsKLSAgICAgICAgc3dpdGNoICggdGFnICkKLSAgICAgICAgewotICAgICAgICBjYXNlIEZUX0NVUlZFX1RBR19PTjogIC8qIGVtaXQgYSBzaW5nbGUgbGluZV90byAqLwotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1ZlY3RvciAgdmVjOwotCi0KLSAgICAgICAgICAgIHZlYy54ID0gcG9pbnQtPng7Ci0gICAgICAgICAgICB2ZWMueSA9IHBvaW50LT55OwotCi0gICAgICAgICAgICBlcnJvciA9IEZUX1N0cm9rZXJfTGluZVRvKCBzdHJva2VyLCAmdmVjICk7Ci0gICAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRlRfQ1VSVkVfVEFHX0NPTklDOiAgLyogY29uc3VtZSBjb25pYyBhcmNzICovCi0gICAgICAgICAgdl9jb250cm9sLnggPSBwb2ludC0+eDsKLSAgICAgICAgICB2X2NvbnRyb2wueSA9IHBvaW50LT55OwotCi0gICAgICAgIERvX0NvbmljOgotICAgICAgICAgIGlmICggcG9pbnQgPCBsaW1pdCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVmVjdG9yICB2ZWM7Ci0gICAgICAgICAgICBGVF9WZWN0b3IgIHZfbWlkZGxlOwotCi0KLSAgICAgICAgICAgIHBvaW50Kys7Ci0gICAgICAgICAgICB0YWdzKys7Ci0gICAgICAgICAgICB0YWcgPSBGVF9DVVJWRV9UQUcoIHRhZ3NbMF0gKTsKLQotICAgICAgICAgICAgdmVjID0gcG9pbnRbMF07Ci0KLSAgICAgICAgICAgIGlmICggdGFnID09IEZUX0NVUlZFX1RBR19PTiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVycm9yID0gRlRfU3Ryb2tlcl9Db25pY1RvKCBzdHJva2VyLCAmdl9jb250cm9sLCAmdmVjICk7Ci0gICAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggdGFnICE9IEZUX0NVUlZFX1RBR19DT05JQyApCi0gICAgICAgICAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotCi0gICAgICAgICAgICB2X21pZGRsZS54ID0gKCB2X2NvbnRyb2wueCArIHZlYy54ICkgLyAyOwotICAgICAgICAgICAgdl9taWRkbGUueSA9ICggdl9jb250cm9sLnkgKyB2ZWMueSApIC8gMjsKLQotICAgICAgICAgICAgZXJyb3IgPSBGVF9TdHJva2VyX0NvbmljVG8oIHN0cm9rZXIsICZ2X2NvbnRyb2wsICZ2X21pZGRsZSApOwotICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgICAgdl9jb250cm9sID0gdmVjOwotICAgICAgICAgICAgZ290byBEb19Db25pYzsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBlcnJvciA9IEZUX1N0cm9rZXJfQ29uaWNUbyggc3Ryb2tlciwgJnZfY29udHJvbCwgJnZfc3RhcnQgKTsKLSAgICAgICAgICBnb3RvIENsb3NlOwotCi0gICAgICAgIGRlZmF1bHQ6ICAvKiBGVF9DVVJWRV9UQUdfQ1VCSUMgKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9WZWN0b3IgIHZlYzEsIHZlYzI7Ci0KLQotICAgICAgICAgICAgaWYgKCBwb2ludCArIDEgPiBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgRlRfQ1VSVkVfVEFHKCB0YWdzWzFdICkgIT0gRlRfQ1VSVkVfVEFHX0NVQklDICkKLSAgICAgICAgICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAgICAgICAgIHBvaW50ICs9IDI7Ci0gICAgICAgICAgICB0YWdzICArPSAyOwotCi0gICAgICAgICAgICB2ZWMxID0gcG9pbnRbLTJdOwotICAgICAgICAgICAgdmVjMiA9IHBvaW50Wy0xXTsKLQotICAgICAgICAgICAgaWYgKCBwb2ludCA8PSBsaW1pdCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX1ZlY3RvciAgdmVjOwotCi0KLSAgICAgICAgICAgICAgdmVjID0gcG9pbnRbMF07Ci0KLSAgICAgICAgICAgICAgZXJyb3IgPSBGVF9TdHJva2VyX0N1YmljVG8oIHN0cm9rZXIsICZ2ZWMxLCAmdmVjMiwgJnZlYyApOwotICAgICAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlcnJvciA9IEZUX1N0cm9rZXJfQ3ViaWNUbyggc3Ryb2tlciwgJnZlYzEsICZ2ZWMyLCAmdl9zdGFydCApOwotICAgICAgICAgICAgZ290byBDbG9zZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgIENsb3NlOgotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgLyogZG9uJ3QgdHJ5IHRvIGVuZCB0aGUgcGF0aCBpZiBubyBzZWdtZW50cyBoYXZlIGJlZW4gZ2VuZXJhdGVkICovCi0gICAgICBpZiAoICFzdHJva2VyLT5maXJzdF9wb2ludCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gRlRfU3Ryb2tlcl9FbmRTdWJQYXRoKCBzdHJva2VyICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgZmlyc3QgPSBsYXN0ICsgMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotCi0gIEludmFsaWRfT3V0bGluZToKLSAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfT3V0bGluZSApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3Ryb2tlLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dseXBoX1N0cm9rZSggRlRfR2x5cGggICAgKnBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICBGVF9TdHJva2VyICAgc3Ryb2tlciwKLSAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgZGVzdHJveSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FUlIoIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICBGVF9HbHlwaCAgZ2x5cGggPSBOVUxMOwotCi0gICAgLyogZm9yIEZUX09VVExJTkVfR0xZUEhfQ0xBU1NfR0VUIChpbiBQSUMgbW9kZSkgKi8KLSAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5ID0gc3Ryb2tlci0+bGlicmFyeTsKLQotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOwotCi0KLSAgICBpZiAoICFwZ2x5cGggKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZ2x5cGggPSAqcGdseXBoOwotICAgIGlmICggIWdseXBoIHx8IGdseXBoLT5jbGF6eiAhPSBGVF9PVVRMSU5FX0dMWVBIX0NMQVNTX0dFVCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICB7Ci0gICAgICBGVF9HbHlwaCAgY29weTsKLQotCi0gICAgICBlcnJvciA9IEZUX0dseXBoX0NvcHkoIGdseXBoLCAmY29weSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZ2x5cGggPSBjb3B5OwotICAgIH0KLQotICAgIHsKLSAgICAgIEZUX091dGxpbmVHbHlwaCAgb2dseXBoICA9IChGVF9PdXRsaW5lR2x5cGgpZ2x5cGg7Ci0gICAgICBGVF9PdXRsaW5lKiAgICAgIG91dGxpbmUgPSAmb2dseXBoLT5vdXRsaW5lOwotICAgICAgRlRfVUludCAgICAgICAgICBudW1fcG9pbnRzLCBudW1fY29udG91cnM7Ci0KLQotICAgICAgZXJyb3IgPSBGVF9TdHJva2VyX1BhcnNlT3V0bGluZSggc3Ryb2tlciwgb3V0bGluZSwgRkFMU0UgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIEZUX1N0cm9rZXJfR2V0Q291bnRzKCBzdHJva2VyLCAmbnVtX3BvaW50cywgJm51bV9jb250b3VycyApOwotCi0gICAgICBGVF9PdXRsaW5lX0RvbmUoIGdseXBoLT5saWJyYXJ5LCBvdXRsaW5lICk7Ci0KLSAgICAgIGVycm9yID0gRlRfT3V0bGluZV9OZXcoIGdseXBoLT5saWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9JbnQpbnVtX2NvbnRvdXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgb3V0bGluZS0+bl9wb2ludHMgICA9IDA7Ci0gICAgICBvdXRsaW5lLT5uX2NvbnRvdXJzID0gMDsKLQotICAgICAgRlRfU3Ryb2tlcl9FeHBvcnQoIHN0cm9rZXIsIG91dGxpbmUgKTsKLSAgICB9Ci0KLSAgICBpZiAoIGRlc3Ryb3kgKQotICAgICAgRlRfRG9uZV9HbHlwaCggKnBnbHlwaCApOwotCi0gICAgKnBnbHlwaCA9IGdseXBoOwotICAgIGdvdG8gRXhpdDsKLQotICBGYWlsOgotICAgIEZUX0RvbmVfR2x5cGgoIGdseXBoICk7Ci0gICAgZ2x5cGggPSBOVUxMOwotCi0gICAgaWYgKCAhZGVzdHJveSApCi0gICAgICAqcGdseXBoID0gTlVMTDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHN0cm9rZS5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HbHlwaF9TdHJva2VCb3JkZXIoIEZUX0dseXBoICAgICpwZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3Ryb2tlciAgIHN0cm9rZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgIGluc2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgZGVzdHJveSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FUlIoIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICBGVF9HbHlwaCAgZ2x5cGggPSBOVUxMOwotCi0gICAgLyogZm9yIEZUX09VVExJTkVfR0xZUEhfQ0xBU1NfR0VUIChpbiBQSUMgbW9kZSkgKi8KLSAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5ID0gc3Ryb2tlci0+bGlicmFyeTsKLQotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOwotCi0KLSAgICBpZiAoICFwZ2x5cGggKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZ2x5cGggPSAqcGdseXBoOwotICAgIGlmICggIWdseXBoIHx8IGdseXBoLT5jbGF6eiAhPSBGVF9PVVRMSU5FX0dMWVBIX0NMQVNTX0dFVCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICB7Ci0gICAgICBGVF9HbHlwaCAgY29weTsKLQotCi0gICAgICBlcnJvciA9IEZUX0dseXBoX0NvcHkoIGdseXBoLCAmY29weSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZ2x5cGggPSBjb3B5OwotICAgIH0KLQotICAgIHsKLSAgICAgIEZUX091dGxpbmVHbHlwaCAgIG9nbHlwaCAgPSAoRlRfT3V0bGluZUdseXBoKWdseXBoOwotICAgICAgRlRfU3Ryb2tlckJvcmRlciAgYm9yZGVyOwotICAgICAgRlRfT3V0bGluZSogICAgICAgb3V0bGluZSA9ICZvZ2x5cGgtPm91dGxpbmU7Ci0gICAgICBGVF9VSW50ICAgICAgICAgICBudW1fcG9pbnRzLCBudW1fY29udG91cnM7Ci0KLQotICAgICAgYm9yZGVyID0gRlRfT3V0bGluZV9HZXRPdXRzaWRlQm9yZGVyKCBvdXRsaW5lICk7Ci0gICAgICBpZiAoIGluc2lkZSApCi0gICAgICB7Ci0gICAgICAgIGlmICggYm9yZGVyID09IEZUX1NUUk9LRVJfQk9SREVSX0xFRlQgKQotICAgICAgICAgIGJvcmRlciA9IEZUX1NUUk9LRVJfQk9SREVSX1JJR0hUOwotICAgICAgICBlbHNlCi0gICAgICAgICAgYm9yZGVyID0gRlRfU1RST0tFUl9CT1JERVJfTEVGVDsKLSAgICAgIH0KLQotICAgICAgZXJyb3IgPSBGVF9TdHJva2VyX1BhcnNlT3V0bGluZSggc3Ryb2tlciwgb3V0bGluZSwgRkFMU0UgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIEZUX1N0cm9rZXJfR2V0Qm9yZGVyQ291bnRzKCBzdHJva2VyLCBib3JkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm51bV9wb2ludHMsICZudW1fY29udG91cnMgKTsKLQotICAgICAgRlRfT3V0bGluZV9Eb25lKCBnbHlwaC0+bGlicmFyeSwgb3V0bGluZSApOwotCi0gICAgICBlcnJvciA9IEZUX091dGxpbmVfTmV3KCBnbHlwaC0+bGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfSW50KW51bV9jb250b3VycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIG91dGxpbmUtPm5fcG9pbnRzICAgPSAwOwotICAgICAgb3V0bGluZS0+bl9jb250b3VycyA9IDA7Ci0KLSAgICAgIEZUX1N0cm9rZXJfRXhwb3J0Qm9yZGVyKCBzdHJva2VyLCBib3JkZXIsIG91dGxpbmUgKTsKLSAgICB9Ci0KLSAgICBpZiAoIGRlc3Ryb3kgKQotICAgICAgRlRfRG9uZV9HbHlwaCggKnBnbHlwaCApOwotCi0gICAgKnBnbHlwaCA9IGdseXBoOwotICAgIGdvdG8gRXhpdDsKLQotICBGYWlsOgotICAgIEZUX0RvbmVfR2x5cGgoIGdseXBoICk7Ci0gICAgZ2x5cGggPSBOVUxMOwotCi0gICAgaWYgKCAhZGVzdHJveSApCi0gICAgICAqcGdseXBoID0gTlVMTDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRzeW50aC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRzeW50aC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDY4NTMzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0c3ludGguYworKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHN5bnRoLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgc3ludGhlc2l6aW5nIGNvZGUgZm9yIGVtYm9sZGVuaW5nIGFuZCBzbGFudGluZyAoYm9keSkuICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfU1lOVEhFU0lTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9CSVRNQVBfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2Vfc3ludGgKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgRVhQRVJJTUVOVEFMIE9CTElRVUlORyBTVVBQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRzeW50aC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX0dseXBoU2xvdF9PYmxpcXVlKCBGVF9HbHlwaFNsb3QgIHNsb3QgKQotICB7Ci0gICAgRlRfTWF0cml4ICAgIHRyYW5zZm9ybTsKLSAgICBGVF9PdXRsaW5lKiAgb3V0bGluZTsKLQotCi0gICAgaWYgKCAhc2xvdCApCi0gICAgICByZXR1cm47Ci0KLSAgICBvdXRsaW5lID0gJnNsb3QtPm91dGxpbmU7Ci0KLSAgICAvKiBvbmx5IG9ibGlxdWUgb3V0bGluZSBnbHlwaHMgKi8KLSAgICBpZiAoIHNsb3QtPmZvcm1hdCAhPSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSApCi0gICAgICByZXR1cm47Ci0KLSAgICAvKiB3ZSBkb24ndCB0b3VjaCB0aGUgYWR2YW5jZSB3aWR0aCAqLwotCi0gICAgLyogRm9yIGl0YWxpYywgc2ltcGx5IGFwcGx5IGEgc2hlYXIgdHJhbnNmb3JtLCB3aXRoIGFuIGFuZ2xlICovCi0gICAgLyogb2YgYWJvdXQgMTIgZGVncmVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICB0cmFuc2Zvcm0ueHggPSAweDEwMDAwTDsKLSAgICB0cmFuc2Zvcm0ueXggPSAweDAwMDAwTDsKLQotICAgIHRyYW5zZm9ybS54eSA9IDB4MDM2NkFMOwotICAgIHRyYW5zZm9ybS55eSA9IDB4MTAwMDBMOwotCi0gICAgRlRfT3V0bGluZV9UcmFuc2Zvcm0oIG91dGxpbmUsICZ0cmFuc2Zvcm0gKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICBFWFBFUklNRU5UQUwgRU1CT0xERU5JTkcgU1VQUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0c3ludGguaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9HbHlwaFNsb3RfRW1ib2xkZW4oIEZUX0dseXBoU2xvdCAgc2xvdCApCi0gIHsKLSAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5OwotICAgIEZUX0ZhY2UgICAgIGZhY2U7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0gICAgRlRfUG9zICAgICAgeHN0ciwgeXN0cjsKLQotCi0gICAgaWYgKCAhc2xvdCApCi0gICAgICByZXR1cm47Ci0KLSAgICBsaWJyYXJ5ID0gc2xvdC0+bGlicmFyeTsKLSAgICBmYWNlICAgID0gc2xvdC0+ZmFjZTsKLQotICAgIGlmICggc2xvdC0+Zm9ybWF0ICE9IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FICYmCi0gICAgICAgICBzbG90LT5mb3JtYXQgIT0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUCAgKQotICAgICAgcmV0dXJuOwotCi0gICAgLyogc29tZSByZWFzb25hYmxlIHN0cmVuZ3RoICovCi0gICAgeHN0ciA9IEZUX011bEZpeCggZmFjZS0+dW5pdHNfcGVyX0VNLAotICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnNpemUtPm1ldHJpY3MueV9zY2FsZSApIC8gMjQ7Ci0gICAgeXN0ciA9IHhzdHI7Ci0KLSAgICBpZiAoIHNsb3QtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSApCi0gICAgICBGVF9PdXRsaW5lX0VtYm9sZGVuWFkoICZzbG90LT5vdXRsaW5lLCB4c3RyLCB5c3RyICk7Ci0KLSAgICBlbHNlIC8qIHNsb3QtPmZvcm1hdCA9PSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQICovCi0gICAgewotICAgICAgLyogcm91bmQgdG8gZnVsbCBwaXhlbHMgKi8KLSAgICAgIHhzdHIgJj0gfjYzOwotICAgICAgaWYgKCB4c3RyID09IDAgKQotICAgICAgICB4c3RyID0gMSA8PCA2OwotICAgICAgeXN0ciAmPSB+NjM7Ci0KLSAgICAgIC8qCi0gICAgICAgKiBYWFg6IG92ZXJmbG93IGNoZWNrIGZvciAxNi1iaXQgc3lzdGVtLCBmb3IgY29tcGF0aWJpbGl0eQotICAgICAgICogICAgICB3aXRoIEZUX0dseXBoU2xvdF9FbWJvbGRlbigpIHNpbmNlIGZyZWV0eXBlLTIuMS4xMC4KLSAgICAgICAqICAgICAgdW5mb3J0dW5hdGVseSwgdGhpcyBmdW5jdGlvbiByZXR1cm4gbm8gaW5mb3JtYXRpb25zCi0gICAgICAgKiAgICAgIGFib3V0IHRoZSBjYXVzZSBvZiBlcnJvci4KLSAgICAgICAqLwotICAgICAgaWYgKCAoIHlzdHIgPj4gNiApID4gRlRfSU5UX01BWCB8fCAoIHlzdHIgPj4gNiApIDwgRlRfSU5UX01JTiApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMSgoICJGVF9HbHlwaFNsb3RfRW1ib2xkZW46IiApKTsKLSAgICAgICAgRlRfVFJBQ0UxKCggInRvbyBzdHJvbmcgZW1ib2xkaW5nIHBhcmFtZXRlciB5c3RyPSVkXG4iLCB5c3RyICkpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBlcnJvciA9IEZUX0dseXBoU2xvdF9Pd25fQml0bWFwKCBzbG90ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBlcnJvciA9IEZUX0JpdG1hcF9FbWJvbGRlbiggbGlicmFyeSwgJnNsb3QtPmJpdG1hcCwgeHN0ciwgeXN0ciApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIHNsb3QtPmFkdmFuY2UueCApCi0gICAgICBzbG90LT5hZHZhbmNlLnggKz0geHN0cjsKLQotICAgIGlmICggc2xvdC0+YWR2YW5jZS55ICkKLSAgICAgIHNsb3QtPmFkdmFuY2UueSArPSB5c3RyOwotCi0gICAgc2xvdC0+bWV0cmljcy53aWR0aCAgICAgICAgKz0geHN0cjsKLSAgICBzbG90LT5tZXRyaWNzLmhlaWdodCAgICAgICArPSB5c3RyOwotICAgIHNsb3QtPm1ldHJpY3MuaG9yaUFkdmFuY2UgICs9IHhzdHI7Ci0gICAgc2xvdC0+bWV0cmljcy52ZXJ0QWR2YW5jZSAgKz0geXN0cjsKLSAgICBzbG90LT5tZXRyaWNzLmhvcmlCZWFyaW5nWSArPSB5c3RyOwotCi0gICAgLyogWFhYOiAxNi1iaXQgb3ZlcmZsb3cgY2FzZSBtdXN0IGJlIGV4Y2x1ZGVkIGJlZm9yZSBoZXJlICovCi0gICAgaWYgKCBzbG90LT5mb3JtYXQgPT0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUCApCi0gICAgICBzbG90LT5iaXRtYXBfdG9wICs9IChGVF9JbnQpKCB5c3RyID4+IDYgKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRzeXN0ZW0uYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0c3lzdGVtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MzhmZDguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnRzeXN0ZW0uYworKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHN5c3RlbS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQU5TSS1zcGVjaWZpYyBGcmVlVHlwZSBsb3ctbGV2ZWwgc3lzdGVtIGludGVyZmFjZSAoYm9keSkuICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZhdWx0IGludGVyZmFjZSB1c2VkIGJ5IEZyZWVUeXBlIHRvIGFjY2VzcyAgICovCi0gIC8qIGxvdy1sZXZlbCwgaS5lLiBtZW1vcnkgbWFuYWdlbWVudCwgaS9vIGFjY2VzcyBhcyB3ZWxsIGFzIHRocmVhZCAgICAgICAqLwotICAvKiBzeW5jaHJvbmlzYXRpb24uICBJdCBjYW4gYmUgcmVwbGFjZWQgYnkgdXNlci1zcGVjaWZpYyByb3V0aW5lcyBpZiAgICAgKi8KLSAgLyogbmVjZXNzYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX1NZU1RFTV9ICi0jaW5jbHVkZSBGVF9FUlJPUlNfSAotI2luY2x1ZGUgRlRfVFlQRVNfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgTUVNT1JZIE1BTkFHRU1FTlQgSU5URVJGQUNFICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBkbyBhbnkgZXJyb3IgY2hlY2tpbmcgZm9yIHRoZSAgICAgICAgICAgICAgICAgICovCi0gIC8qIGFsbG9jYXRpb24tcmVsYXRlZCBmdW5jdGlvbnMuICBUaGlzIHdpbGwgYmUgZG9uZSBieSB0aGUgaGlnaGVyIGxldmVsICAqLwotICAvKiByb3V0aW5lcyBsaWtlIGZ0X21lbV9hbGxvYygpIG9yIGZ0X21lbV9yZWFsbG9jKCkuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5IDo6IEEgcG9pbnRlciB0byB0aGUgbWVtb3J5IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgOjogVGhlIHJlcXVlc3RlZCBzaXplIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgYWRkcmVzcyBvZiBuZXdseSBhbGxvY2F0ZWQgYmxvY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCogKQotICBmdF9hbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICBsb25nICAgICAgIHNpemUgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBtZW1vcnkgKTsKLQotICAgIHJldHVybiBmdF9zbWFsbG9jKCAoc2l6ZV90KXNpemUgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfcmVhbGxvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIG1lbW9yeSByZWFsbG9jYXRpb24gZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgOjogQSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjdXJfc2l6ZSA6OiBUaGUgY3VycmVudCBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5ld19zaXplIDo6IFRoZSBuZXdseSByZXF1ZXN0ZWQgc2l6ZSBpbiBieXRlcy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmxvY2sgICAgOjogVGhlIGN1cnJlbnQgYWRkcmVzcyBvZiB0aGUgYmxvY2sgaW4gbWVtb3J5LiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGFkZHJlc3Mgb2YgdGhlIHJlYWxsb2NhdGVkIG1lbW9yeSBibG9jay4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQqICkKLSAgZnRfcmVhbGxvYyggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgIGxvbmcgICAgICAgY3VyX3NpemUsCi0gICAgICAgICAgICAgIGxvbmcgICAgICAgbmV3X3NpemUsCi0gICAgICAgICAgICAgIHZvaWQqICAgICAgYmxvY2sgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBtZW1vcnkgKTsKLSAgICBGVF9VTlVTRUQoIGN1cl9zaXplICk7Ci0KLSAgICByZXR1cm4gZnRfc3JlYWxsb2MoIGJsb2NrLCAoc2l6ZV90KW5ld19zaXplICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X2ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtZW1vcnkgcmVsZWFzZSBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSAgOjogQSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmxvY2sgICA6OiBUaGUgYWRkcmVzcyBvZiBibG9jayBpbiBtZW1vcnkgdG8gYmUgZnJlZWQuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICBmdF9mcmVlKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgdm9pZCogICAgICBibG9jayApCi0gIHsKLSAgICBGVF9VTlVTRUQoIG1lbW9yeSApOwotCi0gICAgZnRfc2ZyZWUoIGJsb2NrICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBSRVNPVVJDRSBNQU5BR0VNRU5UIElOVEVSRkFDRSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX0RJU0FCTEVfU1RSRUFNX1NVUFBPUlQKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9pbwotCi0gIC8qIFdlIHVzZSB0aGUgbWFjcm8gU1RSRUFNX0ZJTEUgZm9yIGNvbnZlbmllbmNlIHRvIGV4dHJhY3QgdGhlICAgICAgICovCi0gIC8qIHN5c3RlbS1zcGVjaWZpYyBzdHJlYW0gaGFuZGxlIGZyb20gYSBnaXZlbiBGcmVlVHlwZSBzdHJlYW0gb2JqZWN0ICovCi0jZGVmaW5lIFNUUkVBTV9GSUxFKCBzdHJlYW0gKSAgKCAoRlRfRklMRSopc3RyZWFtLT5kZXNjcmlwdG9yLnBvaW50ZXIgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZnRfYW5zaV9zdHJlYW1fY2xvc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGZ1bmN0aW9uIHRvIGNsb3NlIGEgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IEEgcG9pbnRlciB0byB0aGUgc3RyZWFtIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICBmdF9hbnNpX3N0cmVhbV9jbG9zZSggRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgZnRfZmNsb3NlKCBTVFJFQU1fRklMRSggc3RyZWFtICkgKTsKLQotICAgIHN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyID0gTlVMTDsKLSAgICBzdHJlYW0tPnNpemUgICAgICAgICAgICAgICA9IDA7Ci0gICAgc3RyZWFtLT5iYXNlICAgICAgICAgICAgICAgPSBOVUxMOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF9hbnNpX3N0cmVhbV9pbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZnVuY3Rpb24gdG8gb3BlbiBhIHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogQSBwb2ludGVyIHRvIHRoZSBzdHJlYW0gb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG9mZnNldCA6OiBUaGUgcG9zaXRpb24gaW4gdGhlIGRhdGEgc3RyZWFtIHRvIHN0YXJ0IHJlYWRpbmcuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnVmZmVyIDo6IFRoZSBhZGRyZXNzIG9mIGJ1ZmZlciB0byBzdG9yZSB0aGUgcmVhZCBkYXRhLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb3VudCAgOjogVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkIGZyb20gdGhlIHN0cmVhbS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQuICBJZiBgY291bnQnIGlzIHplcm8gKHRoaXMgaXMsICAgKi8KLSAgLyogICAgdGhlIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIHNlZWtpbmcpLCBhIG5vbi16ZXJvIHJldHVybiB2YWx1ZSAgICAgICAgICovCi0gIC8qICAgIGluZGljYXRlcyBhbiBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfQ0FMTEJBQ0tfREVGKCB1bnNpZ25lZCBsb25nICkKLSAgZnRfYW5zaV9zdHJlYW1faW8oIEZUX1N0cmVhbSAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICBjb3VudCApCi0gIHsKLSAgICBGVF9GSUxFKiAgZmlsZTsKLQotCi0gICAgaWYgKCAhY291bnQgJiYgb2Zmc2V0ID4gc3RyZWFtLT5zaXplICkKLSAgICAgIHJldHVybiAxOwotCi0gICAgZmlsZSA9IFNUUkVBTV9GSUxFKCBzdHJlYW0gKTsKLQotICAgIGlmICggc3RyZWFtLT5wb3MgIT0gb2Zmc2V0ICkKLSAgICAgIGZ0X2ZzZWVrKCBmaWxlLCAobG9uZylvZmZzZXQsIFNFRUtfU0VUICk7Ci0KLSAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpZnRfZnJlYWQoIGJ1ZmZlciwgMSwgY291bnQsIGZpbGUgKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHN0cmVhbS5oICovCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0Vycm9yICkKLSAgRlRfU3RyZWFtX09wZW4oIEZUX1N0cmVhbSAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgZmlsZXBhdGhuYW1lICkKLSAgewotICAgIEZUX0ZJTEUqICBmaWxlOwotCi0KLSAgICBpZiAoICFzdHJlYW0gKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9IYW5kbGUgKTsKLQotICAgIHN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyID0gTlVMTDsKLSAgICBzdHJlYW0tPnBhdGhuYW1lLnBvaW50ZXIgICA9IChjaGFyKilmaWxlcGF0aG5hbWU7Ci0gICAgc3RyZWFtLT5iYXNlICAgICAgICAgICAgICAgPSBOVUxMOwotICAgIHN0cmVhbS0+cG9zICAgICAgICAgICAgICAgID0gMDsKLSAgICBzdHJlYW0tPnJlYWQgICAgICAgICAgICAgICA9IE5VTEw7Ci0gICAgc3RyZWFtLT5jbG9zZSAgICAgICAgICAgICAgPSBOVUxMOwotCi0gICAgZmlsZSA9IGZ0X2ZvcGVuKCBmaWxlcGF0aG5hbWUsICJyYiIgKTsKLSAgICBpZiAoICFmaWxlICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJGVF9TdHJlYW1fT3BlbjoiCi0gICAgICAgICAgICAgICAgICIgY291bGQgbm90IG9wZW4gYCVzJ1xuIiwgZmlsZXBhdGhuYW1lICkpOwotCi0gICAgICByZXR1cm4gRlRfVEhST1coIENhbm5vdF9PcGVuX1Jlc291cmNlICk7Ci0gICAgfQotCi0gICAgZnRfZnNlZWsoIGZpbGUsIDAsIFNFRUtfRU5EICk7Ci0gICAgc3RyZWFtLT5zaXplID0gKHVuc2lnbmVkIGxvbmcpZnRfZnRlbGwoIGZpbGUgKTsKLSAgICBpZiAoICFzdHJlYW0tPnNpemUgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggIkZUX1N0cmVhbV9PcGVuOiIgKSk7Ci0gICAgICBGVF9FUlJPUigoICIgb3BlbmVkIGAlcycgYnV0IHplcm8tc2l6ZWRcbiIsIGZpbGVwYXRobmFtZSApKTsKLSAgICAgIGZ0X2ZjbG9zZSggZmlsZSApOwotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDYW5ub3RfT3Blbl9TdHJlYW0gKTsKLSAgICB9Ci0gICAgZnRfZnNlZWsoIGZpbGUsIDAsIFNFRUtfU0VUICk7Ci0KLSAgICBzdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlciA9IGZpbGU7Ci0gICAgc3RyZWFtLT5yZWFkICA9IGZ0X2Fuc2lfc3RyZWFtX2lvOwotICAgIHN0cmVhbS0+Y2xvc2UgPSBmdF9hbnNpX3N0cmVhbV9jbG9zZTsKLQotICAgIEZUX1RSQUNFMSgoICJGVF9TdHJlYW1fT3BlbjoiICkpOwotICAgIEZUX1RSQUNFMSgoICIgb3BlbmVkIGAlcycgKCVkIGJ5dGVzKSBzdWNjZXNzZnVsbHlcbiIsCi0gICAgICAgICAgICAgICAgZmlsZXBhdGhuYW1lLCBzdHJlYW0tPnNpemUgKSk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLSNlbmRpZiAvKiAhRlRfQ09ORklHX09QVElPTl9ESVNBQkxFX1NUUkVBTV9TVVBQT1JUICovCi0KLSNpZmRlZiBGVF9ERUJVR19NRU1PUlkKLQotICBleHRlcm4gRlRfSW50Ci0gIGZ0X21lbV9kZWJ1Z19pbml0KCBGVF9NZW1vcnkgIG1lbW9yeSApOwotCi0gIGV4dGVybiB2b2lkCi0gIGZ0X21lbV9kZWJ1Z19kb25lKCBGVF9NZW1vcnkgIG1lbW9yeSApOwotCi0jZW5kaWYKLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRvYmpzLmggKi8KLQotICBGVF9CQVNFX0RFRiggRlRfTWVtb3J5ICkKLSAgRlRfTmV3X01lbW9yeSggdm9pZCApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLQotCi0gICAgbWVtb3J5ID0gKEZUX01lbW9yeSlmdF9zbWFsbG9jKCBzaXplb2YgKCAqbWVtb3J5ICkgKTsKLSAgICBpZiAoIG1lbW9yeSApCi0gICAgewotICAgICAgbWVtb3J5LT51c2VyICAgID0gTlVMTDsKLSAgICAgIG1lbW9yeS0+YWxsb2MgICA9IGZ0X2FsbG9jOwotICAgICAgbWVtb3J5LT5yZWFsbG9jID0gZnRfcmVhbGxvYzsKLSAgICAgIG1lbW9yeS0+ZnJlZSAgICA9IGZ0X2ZyZWU7Ci0jaWZkZWYgRlRfREVCVUdfTUVNT1JZCi0gICAgICBmdF9tZW1fZGVidWdfaW5pdCggbWVtb3J5ICk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICByZXR1cm4gbWVtb3J5OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0b2Jqcy5oICovCi0KLSAgRlRfQkFTRV9ERUYoIHZvaWQgKQotICBGVF9Eb25lX01lbW9yeSggRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0jaWZkZWYgRlRfREVCVUdfTUVNT1JZCi0gICAgZnRfbWVtX2RlYnVnX2RvbmUoIG1lbW9yeSApOwotI2VuZGlmCi0gICAgZnRfc2ZyZWUoIG1lbW9yeSApOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHRyaWdvbi5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnR0cmlnb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyNDMwNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHRyaWdvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0dHJpZ29uLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSB0cmlnb25vbWV0cmljIGZ1bmN0aW9ucyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGlzIGEgZml4ZWQtcG9pbnQgQ09SRElDIGltcGxlbWVudGF0aW9uIG9mIHRyaWdvbm9tZXRyaWMgICAgICAgICAgKi8KLSAgLyogZnVuY3Rpb25zIGFzIHdlbGwgYXMgdHJhbnNmb3JtYXRpb25zIGJldHdlZW4gQ2FydGVzaWFuIGFuZCBwb2xhciAgICAgICovCi0gIC8qIGNvb3JkaW5hdGVzLiAgVGhlIGFuZ2xlcyBhcmUgcmVwcmVzZW50ZWQgYXMgMTYuMTYgZml4ZWQtcG9pbnQgdmFsdWVzICAqLwotICAvKiBpbiBkZWdyZWVzLCBpLmUuLCB0aGUgYW5ndWxhciByZXNvbHV0aW9uIGlzIDJeLTE2IGRlZ3JlZXMuICBOb3RlIHRoYXQgKi8KLSAgLyogb25seSB2ZWN0b3JzIGxvbmdlciB0aGFuIDJeMTYqMTgwL3BpIChvciBhdCBsZWFzdCAyMiBiaXRzKSBvbiBhICAgICAgICovCi0gIC8qIGRpc2NyZXRlIENhcnRlc2lhbiBncmlkIGNhbiBoYXZlIHRoZSBzYW1lIG9yIGJldHRlciBhbmd1bGFyICAgICAgICAgICAqLwotICAvKiByZXNvbHV0aW9uLiAgVGhlcmVmb3JlLCB0byBtYWludGFpbiB0aGlzIHByZWNpc2lvbiwgc29tZSBmdW5jdGlvbnMgICAgKi8KLSAgLyogcmVxdWlyZSBhbiBpbnRlcmltIHVwc2NhbGluZyBvZiB0aGUgdmVjdG9ycywgd2hlcmVhcyBvdGhlcnMgb3BlcmF0ZSAgICovCi0gIC8qIHdpdGggMjQtYml0IGxvbmcgdmVjdG9ycyBkaXJlY3RseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLSNpbmNsdWRlIEZUX1RSSUdPTk9NRVRSWV9ICi0KLQotICAvKiB0aGUgQ29yZGljIHNocmluayBmYWN0b3IgMC44NTg3ODUzMzY0ODA0MzYgKiAyXjMyICovCi0jZGVmaW5lIEZUX1RSSUdfU0NBTEUgICAgICAweERCRDk1QjE2VUwKLQotICAvKiB0aGUgaGlnaGVzdCBiaXQgaW4gb3ZlcmZsb3ctc2FmZSB2ZWN0b3IgY29tcG9uZW50cywgKi8KLSAgLyogTVNCIG9mIDAuODU4Nzg1MzM2NDgwNDM2ICogc3FydCgwLjUpICogMl4zMCAgICAgICAgICovCi0jZGVmaW5lIEZUX1RSSUdfU0FGRV9NU0IgICAyOQotCi0gIC8qIHRoaXMgdGFibGUgd2FzIGdlbmVyYXRlZCBmb3IgRlRfUEkgPSAxODBMIDw8IDE2LCBpLmUuIGRlZ3JlZXMgKi8KLSNkZWZpbmUgRlRfVFJJR19NQVhfSVRFUlMgIDIzCi0KLSAgc3RhdGljIGNvbnN0IEZUX0FuZ2xlCi0gIGZ0X3RyaWdfYXJjdGFuX3RhYmxlW10gPQotICB7Ci0gICAgMTc0MDk2N0wsIDkxOTg3OUwsIDQ2Njk0NUwsIDIzNDM3OUwsIDExNzMwNEwsIDU4NjY2TCwgMjkzMzVMLAotICAgIDE0NjY4TCwgNzMzNEwsIDM2NjdMLCAxODMzTCwgOTE3TCwgNDU4TCwgMjI5TCwgMTE1TCwKLSAgICA1N0wsIDI5TCwgMTRMLCA3TCwgNEwsIDJMLCAxTAotICB9OwotCi0KLSNpZmRlZiBGVF9MT05HNjQKLQotICAvKiBtdWx0aXBseSBhIGdpdmVuIHZhbHVlIGJ5IHRoZSBDT1JESUMgc2hyaW5rIGZhY3RvciAqLwotICBzdGF0aWMgRlRfRml4ZWQKLSAgZnRfdHJpZ19kb3duc2NhbGUoIEZUX0ZpeGVkICB2YWwgKQotICB7Ci0gICAgRlRfSW50ICBzID0gMTsKLQotCi0gICAgaWYgKCB2YWwgPCAwICkKLSAgICB7Ci0gICAgICAgdmFsID0gLXZhbDsKLSAgICAgICBzID0gLTE7Ci0gICAgfQotCi0gICAgLyogMHg0MDAwMDAwMCBjb21lcyBmcm9tIHJlZ3Jlc3Npb24gYW5hbHlzaXMgYmV0d2VlbiB0cnVlICovCi0gICAgLyogYW5kIENPUkRJQyBoeXBvdGVudXNlLCBzbyBpdCBtaW5pbWl6ZXMgdGhlIGVycm9yICAgICAgICovCi0gICAgdmFsID0gKEZUX0ZpeGVkKSggKCAoRlRfSW50NjQpdmFsICogRlRfVFJJR19TQ0FMRSArIDB4NDAwMDAwMDBVTCApID4+IDMyICk7Ci0KLSAgICByZXR1cm4gcyA8IDAgPyAtdmFsIDogdmFsOwotICB9Ci0KLSNlbHNlIC8qICFGVF9MT05HNjQgKi8KLQotICAvKiBtdWx0aXBseSBhIGdpdmVuIHZhbHVlIGJ5IHRoZSBDT1JESUMgc2hyaW5rIGZhY3RvciAqLwotICBzdGF0aWMgRlRfRml4ZWQKLSAgZnRfdHJpZ19kb3duc2NhbGUoIEZUX0ZpeGVkICB2YWwgKQotICB7Ci0gICAgRlRfSW50ICAgICBzID0gMTsKLSAgICBGVF9VSW50MzIgIGxvMSwgaGkxLCBsbzIsIGhpMiwgbG8sIGhpLCBpMSwgaTI7Ci0KLQotICAgIGlmICggdmFsIDwgMCApCi0gICAgewotICAgICAgIHZhbCA9IC12YWw7Ci0gICAgICAgcyA9IC0xOwotICAgIH0KLQotICAgIGxvMSA9IChGVF9VSW50MzIpdmFsICYgMHgwMDAwRkZGRlU7Ci0gICAgaGkxID0gKEZUX1VJbnQzMil2YWwgPj4gMTY7Ci0gICAgbG8yID0gRlRfVFJJR19TQ0FMRSAmIDB4MDAwMEZGRkZVOwotICAgIGhpMiA9IEZUX1RSSUdfU0NBTEUgPj4gMTY7Ci0KLSAgICBsbyA9IGxvMSAqIGxvMjsKLSAgICBpMSA9IGxvMSAqIGhpMjsKLSAgICBpMiA9IGxvMiAqIGhpMTsKLSAgICBoaSA9IGhpMSAqIGhpMjsKLQotICAgIC8qIENoZWNrIGNhcnJ5IG92ZXJmbG93IG9mIGkxICsgaTIgKi8KLSAgICBpMSArPSBpMjsKLSAgICBoaSArPSAoRlRfVUludDMyKSggaTEgPCBpMiApIDw8IDE2OwotCi0gICAgaGkgKz0gaTEgPj4gMTY7Ci0gICAgaTEgID0gaTEgPDwgMTY7Ci0KLSAgICAvKiBDaGVjayBjYXJyeSBvdmVyZmxvdyBvZiBpMSArIGxvICovCi0gICAgbG8gKz0gaTE7Ci0gICAgaGkgKz0gKCBsbyA8IGkxICk7Ci0KLSAgICAvKiAweDQwMDAwMDAwIGNvbWVzIGZyb20gcmVncmVzc2lvbiBhbmFseXNpcyBiZXR3ZWVuIHRydWUgKi8KLSAgICAvKiBhbmQgQ09SRElDIGh5cG90ZW51c2UsIHNvIGl0IG1pbmltaXplcyB0aGUgZXJyb3IgICAgICAgKi8KLQotICAgIC8qIENoZWNrIGNhcnJ5IG92ZXJmbG93IG9mIGxvICsgMHg0MDAwMDAwMCAqLwotICAgIGxvICs9IDB4NDAwMDAwMDBVTDsKLSAgICBoaSArPSAoIGxvIDwgMHg0MDAwMDAwMFVMICk7Ci0KLSAgICB2YWwgPSAoRlRfRml4ZWQpaGk7Ci0KLSAgICByZXR1cm4gcyA8IDAgPyAtdmFsIDogdmFsOwotICB9Ci0KLSNlbmRpZiAvKiAhRlRfTE9ORzY0ICovCi0KLQotICAvKiB1bmRlZmluZWQgYW5kIG5ldmVyIGNhbGxlZCBmb3IgemVybyB2ZWN0b3IgKi8KLSAgc3RhdGljIEZUX0ludAotICBmdF90cmlnX3ByZW5vcm0oIEZUX1ZlY3RvciogIHZlYyApCi0gIHsKLSAgICBGVF9Qb3MgIHgsIHk7Ci0gICAgRlRfSW50ICBzaGlmdDsKLQotCi0gICAgeCA9IHZlYy0+eDsKLSAgICB5ID0gdmVjLT55OwotCi0gICAgc2hpZnQgPSBGVF9NU0IoIChGVF9VSW50MzIpKCBGVF9BQlMoIHggKSB8IEZUX0FCUyggeSApICkgKTsKLQotICAgIGlmICggc2hpZnQgPD0gRlRfVFJJR19TQUZFX01TQiApCi0gICAgewotICAgICAgc2hpZnQgID0gRlRfVFJJR19TQUZFX01TQiAtIHNoaWZ0OwotICAgICAgdmVjLT54ID0gKEZUX1BvcykoIChGVF9VTG9uZyl4IDw8IHNoaWZ0ICk7Ci0gICAgICB2ZWMtPnkgPSAoRlRfUG9zKSggKEZUX1VMb25nKXkgPDwgc2hpZnQgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNoaWZ0IC09IEZUX1RSSUdfU0FGRV9NU0I7Ci0gICAgICB2ZWMtPnggPSB4ID4+IHNoaWZ0OwotICAgICAgdmVjLT55ID0geSA+PiBzaGlmdDsKLSAgICAgIHNoaWZ0ICA9IC1zaGlmdDsKLSAgICB9Ci0KLSAgICByZXR1cm4gc2hpZnQ7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X3RyaWdfcHNldWRvX3JvdGF0ZSggRlRfVmVjdG9yKiAgdmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgIHRoZXRhICkKLSAgewotICAgIEZUX0ludCAgICAgICAgICAgaTsKLSAgICBGVF9GaXhlZCAgICAgICAgIHgsIHksIHh0ZW1wLCBiOwotICAgIGNvbnN0IEZUX0FuZ2xlICAqYXJjdGFucHRyOwotCi0KLSAgICB4ID0gdmVjLT54OwotICAgIHkgPSB2ZWMtPnk7Ci0KLSAgICAvKiBSb3RhdGUgaW5zaWRlIFstUEkvNCxQSS80XSBzZWN0b3IgKi8KLSAgICB3aGlsZSAoIHRoZXRhIDwgLUZUX0FOR0xFX1BJNCApCi0gICAgewotICAgICAgeHRlbXAgID0gIHk7Ci0gICAgICB5ICAgICAgPSAteDsKLSAgICAgIHggICAgICA9ICB4dGVtcDsKLSAgICAgIHRoZXRhICs9ICBGVF9BTkdMRV9QSTI7Ci0gICAgfQotCi0gICAgd2hpbGUgKCB0aGV0YSA+IEZUX0FOR0xFX1BJNCApCi0gICAgewotICAgICAgeHRlbXAgID0gLXk7Ci0gICAgICB5ICAgICAgPSAgeDsKLSAgICAgIHggICAgICA9ICB4dGVtcDsKLSAgICAgIHRoZXRhIC09ICBGVF9BTkdMRV9QSTI7Ci0gICAgfQotCi0gICAgYXJjdGFucHRyID0gZnRfdHJpZ19hcmN0YW5fdGFibGU7Ci0KLSAgICAvKiBQc2V1ZG9yb3RhdGlvbnMsIHdpdGggcmlnaHQgc2hpZnRzICovCi0gICAgZm9yICggaSA9IDEsIGIgPSAxOyBpIDwgRlRfVFJJR19NQVhfSVRFUlM7IGIgPDw9IDEsIGkrKyApCi0gICAgewotICAgICAgaWYgKCB0aGV0YSA8IDAgKQotICAgICAgewotICAgICAgICB4dGVtcCAgPSB4ICsgKCAoIHkgKyBiICkgPj4gaSApOwotICAgICAgICB5ICAgICAgPSB5IC0gKCAoIHggKyBiICkgPj4gaSApOwotICAgICAgICB4ICAgICAgPSB4dGVtcDsKLSAgICAgICAgdGhldGEgKz0gKmFyY3RhbnB0cisrOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB4dGVtcCAgPSB4IC0gKCAoIHkgKyBiICkgPj4gaSApOwotICAgICAgICB5ICAgICAgPSB5ICsgKCAoIHggKyBiICkgPj4gaSApOwotICAgICAgICB4ICAgICAgPSB4dGVtcDsKLSAgICAgICAgdGhldGEgLT0gKmFyY3RhbnB0cisrOwotICAgICAgfQotICAgIH0KLQotICAgIHZlYy0+eCA9IHg7Ci0gICAgdmVjLT55ID0geTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfdHJpZ19wc2V1ZG9fcG9sYXJpemUoIEZUX1ZlY3RvciogIHZlYyApCi0gIHsKLSAgICBGVF9BbmdsZSAgICAgICAgIHRoZXRhOwotICAgIEZUX0ludCAgICAgICAgICAgaTsKLSAgICBGVF9GaXhlZCAgICAgICAgIHgsIHksIHh0ZW1wLCBiOwotICAgIGNvbnN0IEZUX0FuZ2xlICAqYXJjdGFucHRyOwotCi0KLSAgICB4ID0gdmVjLT54OwotICAgIHkgPSB2ZWMtPnk7Ci0KLSAgICAvKiBHZXQgdGhlIHZlY3RvciBpbnRvIFstUEkvNCxQSS80XSBzZWN0b3IgKi8KLSAgICBpZiAoIHkgPiB4ICkKLSAgICB7Ci0gICAgICBpZiAoIHkgPiAteCApCi0gICAgICB7Ci0gICAgICAgIHRoZXRhID0gIEZUX0FOR0xFX1BJMjsKLSAgICAgICAgeHRlbXAgPSAgeTsKLSAgICAgICAgeSAgICAgPSAteDsKLSAgICAgICAgeCAgICAgPSAgeHRlbXA7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRoZXRhID0gIHkgPiAwID8gRlRfQU5HTEVfUEkgOiAtRlRfQU5HTEVfUEk7Ci0gICAgICAgIHggICAgID0gLXg7Ci0gICAgICAgIHkgICAgID0gLXk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoIHkgPCAteCApCi0gICAgICB7Ci0gICAgICAgIHRoZXRhID0gLUZUX0FOR0xFX1BJMjsKLSAgICAgICAgeHRlbXAgPSAteTsKLSAgICAgICAgeSAgICAgPSAgeDsKLSAgICAgICAgeCAgICAgPSAgeHRlbXA7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRoZXRhID0gMDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBhcmN0YW5wdHIgPSBmdF90cmlnX2FyY3Rhbl90YWJsZTsKLQotICAgIC8qIFBzZXVkb3JvdGF0aW9ucywgd2l0aCByaWdodCBzaGlmdHMgKi8KLSAgICBmb3IgKCBpID0gMSwgYiA9IDE7IGkgPCBGVF9UUklHX01BWF9JVEVSUzsgYiA8PD0gMSwgaSsrICkKLSAgICB7Ci0gICAgICBpZiAoIHkgPiAwICkKLSAgICAgIHsKLSAgICAgICAgeHRlbXAgID0geCArICggKCB5ICsgYiApID4+IGkgKTsKLSAgICAgICAgeSAgICAgID0geSAtICggKCB4ICsgYiApID4+IGkgKTsKLSAgICAgICAgeCAgICAgID0geHRlbXA7Ci0gICAgICAgIHRoZXRhICs9ICphcmN0YW5wdHIrKzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgeHRlbXAgID0geCAtICggKCB5ICsgYiApID4+IGkgKTsKLSAgICAgICAgeSAgICAgID0geSArICggKCB4ICsgYiApID4+IGkgKTsKLSAgICAgICAgeCAgICAgID0geHRlbXA7Ci0gICAgICAgIHRoZXRhIC09ICphcmN0YW5wdHIrKzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiByb3VuZCB0aGV0YSB0byBhY2tub3dsZWRnZSBpdHMgZXJyb3IgdGhhdCBtb3N0bHkgY29tZXMgKi8KLSAgICAvKiBmcm9tIGFjY3VtdWxhdGVkIHJvdW5kaW5nIGVycm9ycyBpbiB0aGUgYXJjdGFuIHRhYmxlICAgKi8KLSAgICBpZiAoIHRoZXRhID49IDAgKQotICAgICAgdGhldGEgPSBGVF9QQURfUk9VTkQoIHRoZXRhLCAxNiApOwotICAgIGVsc2UKLSAgICAgIHRoZXRhID0gLUZUX1BBRF9ST1VORCggLXRoZXRhLCAxNiApOwotCi0gICAgdmVjLT54ID0geDsKLSAgICB2ZWMtPnkgPSB0aGV0YTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHRyaWdvbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRml4ZWQgKQotICBGVF9Db3MoIEZUX0FuZ2xlICBhbmdsZSApCi0gIHsKLSAgICBGVF9WZWN0b3IgIHY7Ci0KLQotICAgIEZUX1ZlY3Rvcl9Vbml0KCAmdiwgYW5nbGUgKTsKLQotICAgIHJldHVybiB2Lng7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnR0cmlnb24uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0ZpeGVkICkKLSAgRlRfU2luKCBGVF9BbmdsZSAgYW5nbGUgKQotICB7Ci0gICAgRlRfVmVjdG9yICB2OwotCi0KLSAgICBGVF9WZWN0b3JfVW5pdCggJnYsIGFuZ2xlICk7Ci0KLSAgICByZXR1cm4gdi55OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0dHJpZ29uLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9GaXhlZCApCi0gIEZUX1RhbiggRlRfQW5nbGUgIGFuZ2xlICkKLSAgewotICAgIEZUX1ZlY3RvciAgdjsKLQotCi0gICAgRlRfVmVjdG9yX1VuaXQoICZ2LCBhbmdsZSApOwotCi0gICAgcmV0dXJuIEZUX0RpdkZpeCggdi55LCB2LnggKTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHRyaWdvbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfQW5nbGUgKQotICBGVF9BdGFuMiggRlRfRml4ZWQgIGR4LAotICAgICAgICAgICAgRlRfRml4ZWQgIGR5ICkKLSAgewotICAgIEZUX1ZlY3RvciAgdjsKLQotCi0gICAgaWYgKCBkeCA9PSAwICYmIGR5ID09IDAgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICB2LnggPSBkeDsKLSAgICB2LnkgPSBkeTsKLSAgICBmdF90cmlnX3ByZW5vcm0oICZ2ICk7Ci0gICAgZnRfdHJpZ19wc2V1ZG9fcG9sYXJpemUoICZ2ICk7Ci0KLSAgICByZXR1cm4gdi55OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0dHJpZ29uLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfVmVjdG9yX1VuaXQoIEZUX1ZlY3RvciogIHZlYywKLSAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgIGFuZ2xlICkKLSAgewotICAgIGlmICggIXZlYyApCi0gICAgICByZXR1cm47Ci0KLSAgICB2ZWMtPnggPSBGVF9UUklHX1NDQUxFID4+IDg7Ci0gICAgdmVjLT55ID0gMDsKLSAgICBmdF90cmlnX3BzZXVkb19yb3RhdGUoIHZlYywgYW5nbGUgKTsKLSAgICB2ZWMtPnggPSAoIHZlYy0+eCArIDB4ODBMICkgPj4gODsKLSAgICB2ZWMtPnkgPSAoIHZlYy0+eSArIDB4ODBMICkgPj4gODsKLSAgfQotCi0KLSAgLyogdGhlc2UgbWFjcm9zIHJldHVybiAwIGZvciBwb3NpdGl2ZSBudW1iZXJzLAotICAgICBhbmQgLTEgZm9yIG5lZ2F0aXZlIG9uZXMgKi8KLSNkZWZpbmUgRlRfU0lHTl9MT05HKCB4ICkgICAoICh4KSA+PiAoIEZUX1NJWkVPRl9MT05HICogOCAtIDEgKSApCi0jZGVmaW5lIEZUX1NJR05fSU5UKCB4ICkgICAgKCAoeCkgPj4gKCBGVF9TSVpFT0ZfSU5UICogOCAtIDEgKSApCi0jZGVmaW5lIEZUX1NJR05fSU5UMzIoIHggKSAgKCAoeCkgPj4gMzEgKQotI2RlZmluZSBGVF9TSUdOX0lOVDE2KCB4ICkgICggKHgpID4+IDE1ICkKLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnR0cmlnb24uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9WZWN0b3JfUm90YXRlKCBGVF9WZWN0b3IqICB2ZWMsCi0gICAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgIGFuZ2xlICkKLSAgewotICAgIEZUX0ludCAgICAgc2hpZnQ7Ci0gICAgRlRfVmVjdG9yICB2OwotCi0KLSAgICBpZiAoICF2ZWMgfHwgIWFuZ2xlICkKLSAgICAgIHJldHVybjsKLQotICAgIHYgPSAqdmVjOwotCi0gICAgaWYgKCB2LnggPT0gMCAmJiB2LnkgPT0gMCApCi0gICAgICByZXR1cm47Ci0KLSAgICBzaGlmdCA9IGZ0X3RyaWdfcHJlbm9ybSggJnYgKTsKLSAgICBmdF90cmlnX3BzZXVkb19yb3RhdGUoICZ2LCBhbmdsZSApOwotICAgIHYueCA9IGZ0X3RyaWdfZG93bnNjYWxlKCB2LnggKTsKLSAgICB2LnkgPSBmdF90cmlnX2Rvd25zY2FsZSggdi55ICk7Ci0KLSAgICBpZiAoIHNoaWZ0ID4gMCApCi0gICAgewotICAgICAgRlRfSW50MzIgIGhhbGYgPSAoRlRfSW50MzIpMUwgPDwgKCBzaGlmdCAtIDEgKTsKLQotCi0gICAgICB2ZWMtPnggPSAoIHYueCArIGhhbGYgKyBGVF9TSUdOX0xPTkcoIHYueCApICkgPj4gc2hpZnQ7Ci0gICAgICB2ZWMtPnkgPSAoIHYueSArIGhhbGYgKyBGVF9TSUdOX0xPTkcoIHYueSApICkgPj4gc2hpZnQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzaGlmdCAgPSAtc2hpZnQ7Ci0gICAgICB2ZWMtPnggPSAoRlRfUG9zKSggKEZUX1VMb25nKXYueCA8PCBzaGlmdCApOwotICAgICAgdmVjLT55ID0gKEZUX1BvcykoIChGVF9VTG9uZyl2LnkgPDwgc2hpZnQgKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnR0cmlnb24uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0ZpeGVkICkKLSAgRlRfVmVjdG9yX0xlbmd0aCggRlRfVmVjdG9yKiAgdmVjICkKLSAgewotICAgIEZUX0ludCAgICAgc2hpZnQ7Ci0gICAgRlRfVmVjdG9yICB2OwotCi0KLSAgICBpZiAoICF2ZWMgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICB2ID0gKnZlYzsKLQotICAgIC8qIGhhbmRsZSB0cml2aWFsIGNhc2VzICovCi0gICAgaWYgKCB2LnggPT0gMCApCi0gICAgewotICAgICAgcmV0dXJuIEZUX0FCUyggdi55ICk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCB2LnkgPT0gMCApCi0gICAgewotICAgICAgcmV0dXJuIEZUX0FCUyggdi54ICk7Ci0gICAgfQotCi0gICAgLyogZ2VuZXJhbCBjYXNlICovCi0gICAgc2hpZnQgPSBmdF90cmlnX3ByZW5vcm0oICZ2ICk7Ci0gICAgZnRfdHJpZ19wc2V1ZG9fcG9sYXJpemUoICZ2ICk7Ci0KLSAgICB2LnggPSBmdF90cmlnX2Rvd25zY2FsZSggdi54ICk7Ci0KLSAgICBpZiAoIHNoaWZ0ID4gMCApCi0gICAgICByZXR1cm4gKCB2LnggKyAoIDFMIDw8ICggc2hpZnQgLSAxICkgKSApID4+IHNoaWZ0OwotCi0gICAgcmV0dXJuIChGVF9GaXhlZCkoIChGVF9VSW50MzIpdi54IDw8IC1zaGlmdCApOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0dHJpZ29uLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfVmVjdG9yX1BvbGFyaXplKCBGVF9WZWN0b3IqICB2ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAqbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0FuZ2xlICAgKmFuZ2xlICkKLSAgewotICAgIEZUX0ludCAgICAgc2hpZnQ7Ci0gICAgRlRfVmVjdG9yICB2OwotCi0KLSAgICBpZiAoICF2ZWMgfHwgIWxlbmd0aCB8fCAhYW5nbGUgKQotICAgICAgcmV0dXJuOwotCi0gICAgdiA9ICp2ZWM7Ci0KLSAgICBpZiAoIHYueCA9PSAwICYmIHYueSA9PSAwICkKLSAgICAgIHJldHVybjsKLQotICAgIHNoaWZ0ID0gZnRfdHJpZ19wcmVub3JtKCAmdiApOwotICAgIGZ0X3RyaWdfcHNldWRvX3BvbGFyaXplKCAmdiApOwotCi0gICAgdi54ID0gZnRfdHJpZ19kb3duc2NhbGUoIHYueCApOwotCi0gICAgKmxlbmd0aCA9IHNoaWZ0ID49IDAgPyAgICAgICAgICAgICAgICAgICAgICAoIHYueCA+PiAgc2hpZnQgKQotICAgICAgICAgICAgICAgICAgICAgICAgIDogKEZUX0ZpeGVkKSggKEZUX1VJbnQzMil2LnggPDwgLXNoaWZ0ICk7Ci0gICAgKmFuZ2xlICA9IHYueTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHRyaWdvbi5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX1ZlY3Rvcl9Gcm9tX1BvbGFyKCBGVF9WZWN0b3IqICB2ZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9BbmdsZSAgICBhbmdsZSApCi0gIHsKLSAgICBpZiAoICF2ZWMgKQotICAgICAgcmV0dXJuOwotCi0gICAgdmVjLT54ID0gbGVuZ3RoOwotICAgIHZlYy0+eSA9IDA7Ci0KLSAgICBGVF9WZWN0b3JfUm90YXRlKCB2ZWMsIGFuZ2xlICk7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnR0cmlnb24uaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0FuZ2xlICkKLSAgRlRfQW5nbGVfRGlmZiggRlRfQW5nbGUgIGFuZ2xlMSwKLSAgICAgICAgICAgICAgICAgRlRfQW5nbGUgIGFuZ2xlMiApCi0gIHsKLSAgICBGVF9BbmdsZSAgZGVsdGEgPSBhbmdsZTIgLSBhbmdsZTE7Ci0KLQotICAgIHdoaWxlICggZGVsdGEgPD0gLUZUX0FOR0xFX1BJICkKLSAgICAgIGRlbHRhICs9IEZUX0FOR0xFXzJQSTsKLQotICAgIHdoaWxlICggZGVsdGEgPiBGVF9BTkdMRV9QSSApCi0gICAgICBkZWx0YSAtPSBGVF9BTkdMRV8yUEk7Ci0KLSAgICByZXR1cm4gZGVsdGE7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0dHlwZTEuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0dHlwZTEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU0OTM4Mi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHR5cGUxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnR0eXBlMS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHV0aWxpdHkgZmlsZSBmb3IgUFMgbmFtZXMgc3VwcG9ydCAoYm9keSkuICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0VSVklDRV9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfSU5GT19ICi0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIHQxdGFibGVzLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldF9QU19Gb250X0luZm8oIEZUX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgUFNfRm9udEluZm9SZWMqICBhZm9udF9pbmZvICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvcjsKLSAgICBGVF9TZXJ2aWNlX1BzSW5mbyAgc2VydmljZTsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIGlmICggIWFmb250X2luZm8gKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBGVF9GQUNFX0ZJTkRfU0VSVklDRSggZmFjZSwgc2VydmljZSwgUE9TVFNDUklQVF9JTkZPICk7Ci0KLSAgICBpZiAoIHNlcnZpY2UgJiYgc2VydmljZS0+cHNfZ2V0X2ZvbnRfaW5mbyApCi0gICAgICBlcnJvciA9IHNlcnZpY2UtPnBzX2dldF9mb250X2luZm8oIGZhY2UsIGFmb250X2luZm8gKTsKLSAgICBlbHNlCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gdDF0YWJsZXMuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0ludCApCi0gIEZUX0hhc19QU19HbHlwaF9OYW1lcyggRlRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBGVF9JbnQgICAgICAgICAgICAgcmVzdWx0ID0gMDsKLSAgICBGVF9TZXJ2aWNlX1BzSW5mbyAgc2VydmljZTsKLQotCi0gICAgaWYgKCBmYWNlICkKLSAgICB7Ci0gICAgICBGVF9GQUNFX0ZJTkRfU0VSVklDRSggZmFjZSwgc2VydmljZSwgUE9TVFNDUklQVF9JTkZPICk7Ci0KLSAgICAgIGlmICggc2VydmljZSAmJiBzZXJ2aWNlLT5wc19oYXNfZ2x5cGhfbmFtZXMgKQotICAgICAgICByZXN1bHQgPSBzZXJ2aWNlLT5wc19oYXNfZ2x5cGhfbmFtZXMoIGZhY2UgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIHQxdGFibGVzLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9FcnJvciApCi0gIEZUX0dldF9QU19Gb250X1ByaXZhdGUoIEZUX0ZhY2UgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBQU19Qcml2YXRlUmVjKiAgYWZvbnRfcHJpdmF0ZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgICAgZXJyb3I7Ci0gICAgRlRfU2VydmljZV9Qc0luZm8gIHNlcnZpY2U7Ci0KLQotICAgIGlmICggIWZhY2UgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZhY2VfSGFuZGxlICk7Ci0KLSAgICBpZiAoICFhZm9udF9wcml2YXRlICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgRlRfRkFDRV9GSU5EX1NFUlZJQ0UoIGZhY2UsIHNlcnZpY2UsIFBPU1RTQ1JJUFRfSU5GTyApOwotCi0gICAgaWYgKCBzZXJ2aWNlICYmIHNlcnZpY2UtPnBzX2dldF9mb250X3ByaXZhdGUgKQotICAgICAgZXJyb3IgPSBzZXJ2aWNlLT5wc19nZXRfZm9udF9wcml2YXRlKCBmYWNlLCBhZm9udF9wcml2YXRlICk7Ci0gICAgZWxzZQotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIHQxdGFibGVzLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBGVF9Mb25nICkKLSAgRlRfR2V0X1BTX0ZvbnRfVmFsdWUoIEZUX0ZhY2UgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBTX0RpY3RfS2V5cyAga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICB2YWx1ZV9sZW4gKQotICB7Ci0gICAgRlRfSW50ICAgICAgICAgICAgIHJlc3VsdCAgPSAwOwotICAgIEZUX1NlcnZpY2VfUHNJbmZvICBzZXJ2aWNlID0gTlVMTDsKLQotCi0gICAgaWYgKCBmYWNlICkKLSAgICB7Ci0gICAgICBGVF9GQUNFX0ZJTkRfU0VSVklDRSggZmFjZSwgc2VydmljZSwgUE9TVFNDUklQVF9JTkZPICk7Ci0KLSAgICAgIGlmICggc2VydmljZSAmJiBzZXJ2aWNlLT5wc19nZXRfZm9udF92YWx1ZSApCi0gICAgICAgIHJlc3VsdCA9IHNlcnZpY2UtPnBzX2dldF9mb250X3ZhbHVlKCBmYWNlLCBrZXksIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCB2YWx1ZV9sZW4gKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHV0aWwuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0dXRpbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWI3MmRiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL2Z0dXRpbC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0dXRpbC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSB1dGlsaXR5IGZpbGUgZm9yIG1lbW9yeSBhbmQgbGlzdCBtYW5hZ2VtZW50IChib2R5KS4gICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9NRU1PUllfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9MSVNUX0gKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX21lbW9yeQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICBNIEUgTSBPIFIgWSAgIE0gQSBOIEEgRyBFIE0gRSBOIFQgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1BvaW50ZXIgKQotICBmdF9tZW1fYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICBGVF9FcnJvciAgKnBfZXJyb3IgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0gICAgRlRfUG9pbnRlciAgYmxvY2sgPSBmdF9tZW1fcWFsbG9jKCBtZW1vcnksIHNpemUsICZlcnJvciApOwotCi0gICAgaWYgKCAhZXJyb3IgJiYgc2l6ZSA+IDAgKQotICAgICAgRlRfTUVNX1pFUk8oIGJsb2NrLCBzaXplICk7Ci0KLSAgICAqcF9lcnJvciA9IGVycm9yOwotICAgIHJldHVybiBibG9jazsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1BvaW50ZXIgKQotICBmdF9tZW1fcWFsbG9jKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBzaXplLAotICAgICAgICAgICAgICAgICBGVF9FcnJvciAgKnBfZXJyb3IgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfUG9pbnRlciAgYmxvY2sgPSBOVUxMOwotCi0KLSAgICBpZiAoIHNpemUgPiAwICkKLSAgICB7Ci0gICAgICBibG9jayA9IG1lbW9yeS0+YWxsb2MoIG1lbW9yeSwgc2l6ZSApOwotICAgICAgaWYgKCBibG9jayA9PSBOVUxMICkKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggT3V0X09mX01lbW9yeSApOwotICAgIH0KLSAgICBlbHNlIGlmICggc2l6ZSA8IDAgKQotICAgIHsKLSAgICAgIC8qIG1heSBoZWxwIGNhdGNoL3ByZXZlbnQgc2VjdXJpdHkgaXNzdWVzICovCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgfQotCi0gICAgKnBfZXJyb3IgPSBlcnJvcjsKLSAgICByZXR1cm4gYmxvY2s7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCBGVF9Qb2ludGVyICkKLSAgZnRfbWVtX3JlYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBpdGVtX3NpemUsCi0gICAgICAgICAgICAgICAgICBGVF9Mb25nICAgIGN1cl9jb3VudCwKLSAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgbmV3X2NvdW50LAotICAgICAgICAgICAgICAgICAgdm9pZCogICAgICBibG9jaywKLSAgICAgICAgICAgICAgICAgIEZUX0Vycm9yICAqcF9lcnJvciApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIGJsb2NrID0gZnRfbWVtX3FyZWFsbG9jKCBtZW1vcnksIGl0ZW1fc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2NvdW50LCBuZXdfY291bnQsIGJsb2NrLCAmZXJyb3IgKTsKLSAgICBpZiAoICFlcnJvciAmJiBuZXdfY291bnQgPiBjdXJfY291bnQgKQotICAgICAgRlRfTUVNX1pFUk8oIChjaGFyKilibG9jayArIGN1cl9jb3VudCAqIGl0ZW1fc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAoIG5ld19jb3VudCAtIGN1cl9jb3VudCApICogaXRlbV9zaXplICk7Ci0KLSAgICAqcF9lcnJvciA9IGVycm9yOwotICAgIHJldHVybiBibG9jazsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX1BvaW50ZXIgKQotICBmdF9tZW1fcXJlYWxsb2MoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgaXRlbV9zaXplLAotICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgY3VyX2NvdW50LAotICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgbmV3X2NvdW50LAotICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgRlRfRXJyb3IgICpwX2Vycm9yICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0gICAgLyogTm90ZSB0aGF0IHdlIG5vdyBhY2NlcHQgYGl0ZW1fc2l6ZSA9PSAwJyBhcyBhIHZhbGlkIHBhcmFtZXRlciwgaW4KLSAgICAgKiBvcmRlciB0byBjb3ZlciB2ZXJ5IHdlaXJkIGNhc2VzIHdoZXJlIGFuIEFMTE9DX01VTFQgbWFjcm8gd291bGQgYmUKLSAgICAgKiBjYWxsZWQuCi0gICAgICovCi0gICAgaWYgKCBjdXJfY291bnQgPCAwIHx8IG5ld19jb3VudCA8IDAgfHwgaXRlbV9zaXplIDwgMCApCi0gICAgewotICAgICAgLyogbWF5IGhlbHAgY2F0Y2gvcHJldmVudCBuYXN0eSBzZWN1cml0eSBpc3N1ZXMgKi8KLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIG5ld19jb3VudCA9PSAwIHx8IGl0ZW1fc2l6ZSA9PSAwICkKLSAgICB7Ci0gICAgICBmdF9tZW1fZnJlZSggbWVtb3J5LCBibG9jayApOwotICAgICAgYmxvY2sgPSBOVUxMOwotICAgIH0KLSAgICBlbHNlIGlmICggbmV3X2NvdW50ID4gRlRfSU5UX01BWC9pdGVtX3NpemUgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEFycmF5X1Rvb19MYXJnZSApOwotICAgIH0KLSAgICBlbHNlIGlmICggY3VyX2NvdW50ID09IDAgKQotICAgIHsKLSAgICAgIEZUX0FTU0VSVCggYmxvY2sgPT0gTlVMTCApOwotCi0gICAgICBibG9jayA9IGZ0X21lbV9hbGxvYyggbWVtb3J5LCBuZXdfY291bnQqaXRlbV9zaXplLCAmZXJyb3IgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEZUX1BvaW50ZXIgIGJsb2NrMjsKLSAgICAgIEZUX0xvbmcgICAgIGN1cl9zaXplID0gY3VyX2NvdW50Kml0ZW1fc2l6ZTsKLSAgICAgIEZUX0xvbmcgICAgIG5ld19zaXplID0gbmV3X2NvdW50Kml0ZW1fc2l6ZTsKLQotCi0gICAgICBibG9jazIgPSBtZW1vcnktPnJlYWxsb2MoIG1lbW9yeSwgY3VyX3NpemUsIG5ld19zaXplLCBibG9jayApOwotICAgICAgaWYgKCBibG9jazIgPT0gTlVMTCApCi0gICAgICAgIGVycm9yID0gRlRfVEhST1coIE91dF9PZl9NZW1vcnkgKTsKLSAgICAgIGVsc2UKLSAgICAgICAgYmxvY2sgPSBibG9jazI7Ci0gICAgfQotCi0gICAgKnBfZXJyb3IgPSBlcnJvcjsKLSAgICByZXR1cm4gYmxvY2s7Ci0gIH0KLQotCi0gIEZUX0JBU0VfREVGKCB2b2lkICkKLSAgZnRfbWVtX2ZyZWUoIEZUX01lbW9yeSAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKlAgKQotICB7Ci0gICAgaWYgKCBQICkKLSAgICAgIG1lbW9yeS0+ZnJlZSggbWVtb3J5LCAodm9pZCopUCApOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfUG9pbnRlciApCi0gIGZ0X21lbV9kdXAoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgIGNvbnN0IHZvaWQqICBhZGRyZXNzLAotICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgRlRfRXJyb3IgICAgKnBfZXJyb3IgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0gICAgRlRfUG9pbnRlciAgcCA9IGZ0X21lbV9xYWxsb2MoIG1lbW9yeSwgKEZUX0xvbmcpc2l6ZSwgJmVycm9yICk7Ci0KLQotICAgIGlmICggIWVycm9yICYmIGFkZHJlc3MgKQotICAgICAgZnRfbWVtY3B5KCBwLCBhZGRyZXNzLCBzaXplICk7Ci0KLSAgICAqcF9lcnJvciA9IGVycm9yOwotICAgIHJldHVybiBwOwotICB9Ci0KLQotICBGVF9CQVNFX0RFRiggRlRfUG9pbnRlciApCi0gIGZ0X21lbV9zdHJkdXAoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBzdHIsCi0gICAgICAgICAgICAgICAgIEZUX0Vycm9yICAgICpwX2Vycm9yICkKLSAgewotICAgIEZUX1VMb25nICBsZW4gPSBzdHIgPyAoRlRfVUxvbmcpZnRfc3RybGVuKCBzdHIgKSArIDEKLSAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKLQotCi0gICAgcmV0dXJuIGZ0X21lbV9kdXAoIG1lbW9yeSwgc3RyLCBsZW4sIHBfZXJyb3IgKTsKLSAgfQotCi0KLSAgRlRfQkFTRV9ERUYoIEZUX0ludCApCi0gIGZ0X21lbV9zdHJjcHluKCBjaGFyKiAgICAgICAgZHN0LAotICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHNyYywKLSAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICBzaXplICkKLSAgewotICAgIHdoaWxlICggc2l6ZSA+IDEgJiYgKnNyYyAhPSAwICkKLSAgICB7Ci0gICAgICAqZHN0KysgPSAqc3JjKys7Ci0gICAgICBzaXplLS07Ci0gICAgfQotCi0gICAgKmRzdCA9IDA7ICAvKiBhbHdheXMgemVyby10ZXJtaW5hdGUgKi8KLQotICAgIHJldHVybiAqc3JjICE9IDA7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgRCBPIFUgQiBMIFkgICBMIEkgTiBLIEUgRCAgIEwgSSBTIFQgUyAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9saXN0Ci0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGxpc3QuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0xpc3ROb2RlICkKLSAgRlRfTGlzdF9GaW5kKCBGVF9MaXN0ICBsaXN0LAotICAgICAgICAgICAgICAgIHZvaWQqICAgIGRhdGEgKQotICB7Ci0gICAgRlRfTGlzdE5vZGUgIGN1cjsKLQotCi0gICAgaWYgKCAhbGlzdCApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGN1ciA9IGxpc3QtPmhlYWQ7Ci0gICAgd2hpbGUgKCBjdXIgKQotICAgIHsKLSAgICAgIGlmICggY3VyLT5kYXRhID09IGRhdGEgKQotICAgICAgICByZXR1cm4gY3VyOwotCi0gICAgICBjdXIgPSBjdXItPm5leHQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRsaXN0LmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfTGlzdF9BZGQoIEZUX0xpc3QgICAgICBsaXN0LAotICAgICAgICAgICAgICAgRlRfTGlzdE5vZGUgIG5vZGUgKQotICB7Ci0gICAgRlRfTGlzdE5vZGUgIGJlZm9yZTsKLQotCi0gICAgaWYgKCAhbGlzdCB8fCAhbm9kZSApCi0gICAgICByZXR1cm47Ci0KLSAgICBiZWZvcmUgPSBsaXN0LT50YWlsOwotCi0gICAgbm9kZS0+bmV4dCA9IE5VTEw7Ci0gICAgbm9kZS0+cHJldiA9IGJlZm9yZTsKLQotICAgIGlmICggYmVmb3JlICkKLSAgICAgIGJlZm9yZS0+bmV4dCA9IG5vZGU7Ci0gICAgZWxzZQotICAgICAgbGlzdC0+aGVhZCA9IG5vZGU7Ci0KLSAgICBsaXN0LT50YWlsID0gbm9kZTsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGxpc3QuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9MaXN0X0luc2VydCggRlRfTGlzdCAgICAgIGxpc3QsCi0gICAgICAgICAgICAgICAgICBGVF9MaXN0Tm9kZSAgbm9kZSApCi0gIHsKLSAgICBGVF9MaXN0Tm9kZSAgYWZ0ZXI7Ci0KLQotICAgIGlmICggIWxpc3QgfHwgIW5vZGUgKQotICAgICAgcmV0dXJuOwotCi0gICAgYWZ0ZXIgPSBsaXN0LT5oZWFkOwotCi0gICAgbm9kZS0+bmV4dCA9IGFmdGVyOwotICAgIG5vZGUtPnByZXYgPSBOVUxMOwotCi0gICAgaWYgKCAhYWZ0ZXIgKQotICAgICAgbGlzdC0+dGFpbCA9IG5vZGU7Ci0gICAgZWxzZQotICAgICAgYWZ0ZXItPnByZXYgPSBub2RlOwotCi0gICAgbGlzdC0+aGVhZCA9IG5vZGU7Ci0gIH0KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRsaXN0LmggKi8KLQotICBGVF9FWFBPUlRfREVGKCB2b2lkICkKLSAgRlRfTGlzdF9SZW1vdmUoIEZUX0xpc3QgICAgICBsaXN0LAotICAgICAgICAgICAgICAgICAgRlRfTGlzdE5vZGUgIG5vZGUgKQotICB7Ci0gICAgRlRfTGlzdE5vZGUgIGJlZm9yZSwgYWZ0ZXI7Ci0KLQotICAgIGlmICggIWxpc3QgfHwgIW5vZGUgKQotICAgICAgcmV0dXJuOwotCi0gICAgYmVmb3JlID0gbm9kZS0+cHJldjsKLSAgICBhZnRlciAgPSBub2RlLT5uZXh0OwotCi0gICAgaWYgKCBiZWZvcmUgKQotICAgICAgYmVmb3JlLT5uZXh0ID0gYWZ0ZXI7Ci0gICAgZWxzZQotICAgICAgbGlzdC0+aGVhZCA9IGFmdGVyOwotCi0gICAgaWYgKCBhZnRlciApCi0gICAgICBhZnRlci0+cHJldiA9IGJlZm9yZTsKLSAgICBlbHNlCi0gICAgICBsaXN0LT50YWlsID0gYmVmb3JlOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bGlzdC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggdm9pZCApCi0gIEZUX0xpc3RfVXAoIEZUX0xpc3QgICAgICBsaXN0LAotICAgICAgICAgICAgICBGVF9MaXN0Tm9kZSAgbm9kZSApCi0gIHsKLSAgICBGVF9MaXN0Tm9kZSAgYmVmb3JlLCBhZnRlcjsKLQotCi0gICAgaWYgKCAhbGlzdCB8fCAhbm9kZSApCi0gICAgICByZXR1cm47Ci0KLSAgICBiZWZvcmUgPSBub2RlLT5wcmV2OwotICAgIGFmdGVyICA9IG5vZGUtPm5leHQ7Ci0KLSAgICAvKiBjaGVjayB3aGV0aGVyIHdlIGFyZSBhbHJlYWR5IG9uIHRvcCBvZiB0aGUgbGlzdCAqLwotICAgIGlmICggIWJlZm9yZSApCi0gICAgICByZXR1cm47Ci0KLSAgICBiZWZvcmUtPm5leHQgPSBhZnRlcjsKLQotICAgIGlmICggYWZ0ZXIgKQotICAgICAgYWZ0ZXItPnByZXYgPSBiZWZvcmU7Ci0gICAgZWxzZQotICAgICAgbGlzdC0+dGFpbCA9IGJlZm9yZTsKLQotICAgIG5vZGUtPnByZXYgICAgICAgPSBOVUxMOwotICAgIG5vZGUtPm5leHQgICAgICAgPSBsaXN0LT5oZWFkOwotICAgIGxpc3QtPmhlYWQtPnByZXYgPSBub2RlOwotICAgIGxpc3QtPmhlYWQgICAgICAgPSBub2RlOwotICB9Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIGZ0bGlzdC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9MaXN0X0l0ZXJhdGUoIEZUX0xpc3QgICAgICAgICAgIGxpc3QsCi0gICAgICAgICAgICAgICAgICAgRlRfTGlzdF9JdGVyYXRvciAgaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgdXNlciApCi0gIHsKLSAgICBGVF9MaXN0Tm9kZSAgY3VyOwotICAgIEZUX0Vycm9yICAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0gICAgaWYgKCAhbGlzdCB8fCAhaXRlcmF0b3IgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBjdXIgPSBsaXN0LT5oZWFkOwotCi0gICAgd2hpbGUgKCBjdXIgKQotICAgIHsKLSAgICAgIEZUX0xpc3ROb2RlICBuZXh0ID0gY3VyLT5uZXh0OwotCi0KLSAgICAgIGVycm9yID0gaXRlcmF0b3IoIGN1ciwgdXNlciApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBjdXIgPSBuZXh0OwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGxpc3QuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIHZvaWQgKQotICBGVF9MaXN0X0ZpbmFsaXplKCBGVF9MaXN0ICAgICAgICAgICAgIGxpc3QsCi0gICAgICAgICAgICAgICAgICAgIEZUX0xpc3RfRGVzdHJ1Y3RvciAgZGVzdHJveSwKLSAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgdXNlciApCi0gIHsKLSAgICBGVF9MaXN0Tm9kZSAgY3VyOwotCi0KLSAgICBpZiAoICFsaXN0IHx8ICFtZW1vcnkgKQotICAgICAgcmV0dXJuOwotCi0gICAgY3VyID0gbGlzdC0+aGVhZDsKLSAgICB3aGlsZSAoIGN1ciApCi0gICAgewotICAgICAgRlRfTGlzdE5vZGUgIG5leHQgPSBjdXItPm5leHQ7Ci0gICAgICB2b2lkKiAgICAgICAgZGF0YSA9IGN1ci0+ZGF0YTsKLQotCi0gICAgICBpZiAoIGRlc3Ryb3kgKQotICAgICAgICBkZXN0cm95KCBtZW1vcnksIGRhdGEsIHVzZXIgKTsKLQotICAgICAgRlRfRlJFRSggY3VyICk7Ci0gICAgICBjdXIgPSBuZXh0OwotICAgIH0KLQotICAgIGxpc3QtPmhlYWQgPSBOVUxMOwotICAgIGxpc3QtPnRhaWwgPSBOVUxMOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHdpbmZudC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvZnR3aW5mbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZhMTlhZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9mdHdpbmZudC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnR3aW5mbnQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEFQSSBmb3IgYWNjZXNzaW5nIFdpbmRvd3MgRk5UIHNwZWNpZmljIGluZm8gKGJvZHkpLiAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAzLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX1dJTkZPTlRTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9XSU5GTlRfSAotCi0KLSAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdHdpbmZudC5oICovCi0KLSAgRlRfRVhQT1JUX0RFRiggRlRfRXJyb3IgKQotICBGVF9HZXRfV2luRk5UX0hlYWRlciggRlRfRmFjZSAgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9XaW5GTlRfSGVhZGVyUmVjICAqaGVhZGVyICkKLSAgewotICAgIEZUX1NlcnZpY2VfV2luRm50ICBzZXJ2aWNlOwotICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvcjsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotICAgIGlmICggIWhlYWRlciApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIEZUX0ZBQ0VfTE9PS1VQX1NFUlZJQ0UoIGZhY2UsIHNlcnZpY2UsIFdJTkZOVCApOwotCi0gICAgaWYgKCBzZXJ2aWNlICkKLSAgICAgIGVycm9yID0gc2VydmljZS0+Z2V0X2hlYWRlciggZmFjZSwgaGVhZGVyICk7Ci0gICAgZWxzZQotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvYmFzZS9tZDUuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL21kNS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmQ5NmFjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL21kNS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qCi0gKiBUaGlzIGlzIGFuIE9wZW5TU0wtY29tcGF0aWJsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4KLSAqIE1ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0gKFJGQyAxMzIxKS4KLSAqCi0gKiBIb21lcGFnZToKLSAqIGh0dHA6Ly9vcGVud2FsbC5pbmZvL3dpa2kvcGVvcGxlL3NvbGFyL3NvZnR3YXJlL3B1YmxpYy1kb21haW4tc291cmNlLWNvZGUvbWQ1Ci0gKgotICogQXV0aG9yOgotICogQWxleGFuZGVyIFBlc2x5YWssIGJldHRlciBrbm93biBhcyBTb2xhciBEZXNpZ25lciA8c29sYXIgYXQgb3BlbndhbGwuY29tPgotICoKLSAqIFRoaXMgc29mdHdhcmUgd2FzIHdyaXR0ZW4gYnkgQWxleGFuZGVyIFBlc2x5YWsgaW4gMjAwMS4gIE5vIGNvcHlyaWdodCBpcwotICogY2xhaW1lZCwgYW5kIHRoZSBzb2Z0d2FyZSBpcyBoZXJlYnkgcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9tYWluLgotICogSW4gY2FzZSB0aGlzIGF0dGVtcHQgdG8gZGlzY2xhaW0gY29weXJpZ2h0IGFuZCBwbGFjZSB0aGUgc29mdHdhcmUgaW4gdGhlCi0gKiBwdWJsaWMgZG9tYWluIGlzIGRlZW1lZCBudWxsIGFuZCB2b2lkLCB0aGVuIHRoZSBzb2Z0d2FyZSBpcwotICogQ29weXJpZ2h0IChjKSAyMDAxIEFsZXhhbmRlciBQZXNseWFrIGFuZCBpdCBpcyBoZXJlYnkgcmVsZWFzZWQgdG8gdGhlCi0gKiBnZW5lcmFsIHB1YmxpYyB1bmRlciB0aGUgZm9sbG93aW5nIHRlcm1zOgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkLgotICoKLSAqIFRoZXJlJ3MgQUJTT0xVVEVMWSBOTyBXQVJSQU5UWSwgZXhwcmVzcyBvciBpbXBsaWVkLgotICoKLSAqIChUaGlzIGlzIGEgaGVhdmlseSBjdXQtZG93biAiQlNEIGxpY2Vuc2UiLikKLSAqCi0gKiBUaGlzIGRpZmZlcnMgZnJvbSBDb2xpbiBQbHVtYidzIG9sZGVyIHB1YmxpYyBkb21haW4gaW1wbGVtZW50YXRpb24gaW4gdGhhdAotICogbm8gZXhhY3RseSAzMi1iaXQgaW50ZWdlciBkYXRhIHR5cGUgaXMgcmVxdWlyZWQgKGFueSAzMi1iaXQgb3Igd2lkZXIKLSAqIHVuc2lnbmVkIGludGVnZXIgZGF0YSB0eXBlIHdpbGwgZG8pLCB0aGVyZSdzIG5vIGNvbXBpbGUtdGltZSBlbmRpYW5uZXNzCi0gKiBjb25maWd1cmF0aW9uLCBhbmQgdGhlIGZ1bmN0aW9uIHByb3RvdHlwZXMgbWF0Y2ggT3BlblNTTCdzLiAgTm8gY29kZSBmcm9tCi0gKiBDb2xpbiBQbHVtYidzIGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIHJldXNlZDsgdGhpcyBjb21tZW50IG1lcmVseSBjb21wYXJlcwotICogdGhlIHByb3BlcnRpZXMgb2YgdGhlIHR3byBpbmRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbnMuCi0gKgotICogVGhlIHByaW1hcnkgZ29hbHMgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBhcmUgcG9ydGFiaWxpdHkgYW5kIGVhc2Ugb2YgdXNlLgotICogSXQgaXMgbWVhbnQgdG8gYmUgZmFzdCwgYnV0IG5vdCBhcyBmYXN0IGFzIHBvc3NpYmxlLiAgU29tZSBrbm93bgotICogb3B0aW1pemF0aW9ucyBhcmUgbm90IGluY2x1ZGVkIHRvIHJlZHVjZSBzb3VyY2UgY29kZSBzaXplIGFuZCBhdm9pZAotICogY29tcGlsZS10aW1lIGNvbmZpZ3VyYXRpb24uCi0gKi8KLQotI2lmbmRlZiBIQVZFX09QRU5TU0wKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSAibWQ1LmgiCi0KLS8qCi0gKiBUaGUgYmFzaWMgTUQ1IGZ1bmN0aW9ucy4KLSAqCi0gKiBGIGFuZCBHIGFyZSBvcHRpbWl6ZWQgY29tcGFyZWQgdG8gdGhlaXIgUkZDIDEzMjEgZGVmaW5pdGlvbnMgZm9yCi0gKiBhcmNoaXRlY3R1cmVzIHRoYXQgbGFjayBhbiBBTkQtTk9UIGluc3RydWN0aW9uLCBqdXN0IGxpa2UgaW4gQ29saW4gUGx1bWIncwotICogaW1wbGVtZW50YXRpb24uCi0gKi8KLSNkZWZpbmUgRih4LCB5LCB6KQkJCSgoeikgXiAoKHgpICYgKCh5KSBeICh6KSkpKQotI2RlZmluZSBHKHgsIHksIHopCQkJKCh5KSBeICgoeikgJiAoKHgpIF4gKHkpKSkpCi0jZGVmaW5lIEgoeCwgeSwgeikJCQkoKCh4KSBeICh5KSkgXiAoeikpCi0jZGVmaW5lIEgyKHgsIHksIHopCQkJKCh4KSBeICgoeSkgXiAoeikpKQotI2RlZmluZSBJKHgsIHksIHopCQkJKCh5KSBeICgoeCkgfCB+KHopKSkKLQotLyoKLSAqIFRoZSBNRDUgdHJhbnNmb3JtYXRpb24gZm9yIGFsbCBmb3VyIHJvdW5kcy4KLSAqLwotI2RlZmluZSBTVEVQKGYsIGEsIGIsIGMsIGQsIHgsIHQsIHMpIFwKLQkoYSkgKz0gZigoYiksIChjKSwgKGQpKSArICh4KSArICh0KTsgXAotCShhKSA9ICgoKGEpIDw8IChzKSkgfCAoKChhKSAmIDB4ZmZmZmZmZmYpID4+ICgzMiAtIChzKSkpKTsgXAotCShhKSArPSAoYik7Ci0KLS8qCi0gKiBTRVQgcmVhZHMgNCBpbnB1dCBieXRlcyBpbiBsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIgYW5kIHN0b3JlcyB0aGVtCi0gKiBpbiBhIHByb3Blcmx5IGFsaWduZWQgd29yZCBpbiBob3N0IGJ5dGUgb3JkZXIuCi0gKgotICogVGhlIGNoZWNrIGZvciBsaXR0bGUtZW5kaWFuIGFyY2hpdGVjdHVyZXMgdGhhdCB0b2xlcmF0ZSB1bmFsaWduZWQKLSAqIG1lbW9yeSBhY2Nlc3NlcyBpcyBqdXN0IGFuIG9wdGltaXphdGlvbi4gIE5vdGhpbmcgd2lsbCBicmVhayBpZiBpdAotICogZG9lc24ndCB3b3JrLgotICovCi0jaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9fdmF4X18pCi0jZGVmaW5lIFNFVChuKSBcCi0JKCooTUQ1X3UzMnBsdXMgKikmcHRyWyhuKSAqIDRdKQotI2RlZmluZSBHRVQobikgXAotCVNFVChuKQotI2Vsc2UKLSNkZWZpbmUgU0VUKG4pIFwKLQkoY3R4LT5ibG9ja1sobildID0gXAotCShNRDVfdTMycGx1cylwdHJbKG4pICogNF0gfCBcCi0JKChNRDVfdTMycGx1cylwdHJbKG4pICogNCArIDFdIDw8IDgpIHwgXAotCSgoTUQ1X3UzMnBsdXMpcHRyWyhuKSAqIDQgKyAyXSA8PCAxNikgfCBcCi0JKChNRDVfdTMycGx1cylwdHJbKG4pICogNCArIDNdIDw8IDI0KSkKLSNkZWZpbmUgR0VUKG4pIFwKLQkoY3R4LT5ibG9ja1sobildKQotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIHByb2Nlc3NlcyBvbmUgb3IgbW9yZSA2NC1ieXRlIGRhdGEgYmxvY2tzLCBidXQgZG9lcyBOT1QgdXBkYXRlCi0gKiB0aGUgYml0IGNvdW50ZXJzLiAgVGhlcmUgYXJlIG5vIGFsaWdubWVudCByZXF1aXJlbWVudHMuCi0gKi8KLXN0YXRpYyBjb25zdCB2b2lkICpib2R5KE1ENV9DVFggKmN0eCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplKQotewotCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnB0cjsKLQlNRDVfdTMycGx1cyBhLCBiLCBjLCBkOwotCU1ENV91MzJwbHVzIHNhdmVkX2EsIHNhdmVkX2IsIHNhdmVkX2MsIHNhdmVkX2Q7Ci0KLQlwdHIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWRhdGE7Ci0KLQlhID0gY3R4LT5hOwotCWIgPSBjdHgtPmI7Ci0JYyA9IGN0eC0+YzsKLQlkID0gY3R4LT5kOwotCi0JZG8gewotCQlzYXZlZF9hID0gYTsKLQkJc2F2ZWRfYiA9IGI7Ci0JCXNhdmVkX2MgPSBjOwotCQlzYXZlZF9kID0gZDsKLQotLyogUm91bmQgMSAqLwotCQlTVEVQKEYsIGEsIGIsIGMsIGQsIFNFVCgwKSwgMHhkNzZhYTQ3OCwgNykKLQkJU1RFUChGLCBkLCBhLCBiLCBjLCBTRVQoMSksIDB4ZThjN2I3NTYsIDEyKQotCQlTVEVQKEYsIGMsIGQsIGEsIGIsIFNFVCgyKSwgMHgyNDIwNzBkYiwgMTcpCi0JCVNURVAoRiwgYiwgYywgZCwgYSwgU0VUKDMpLCAweGMxYmRjZWVlLCAyMikKLQkJU1RFUChGLCBhLCBiLCBjLCBkLCBTRVQoNCksIDB4ZjU3YzBmYWYsIDcpCi0JCVNURVAoRiwgZCwgYSwgYiwgYywgU0VUKDUpLCAweDQ3ODdjNjJhLCAxMikKLQkJU1RFUChGLCBjLCBkLCBhLCBiLCBTRVQoNiksIDB4YTgzMDQ2MTMsIDE3KQotCQlTVEVQKEYsIGIsIGMsIGQsIGEsIFNFVCg3KSwgMHhmZDQ2OTUwMSwgMjIpCi0JCVNURVAoRiwgYSwgYiwgYywgZCwgU0VUKDgpLCAweDY5ODA5OGQ4LCA3KQotCQlTVEVQKEYsIGQsIGEsIGIsIGMsIFNFVCg5KSwgMHg4YjQ0ZjdhZiwgMTIpCi0JCVNURVAoRiwgYywgZCwgYSwgYiwgU0VUKDEwKSwgMHhmZmZmNWJiMSwgMTcpCi0JCVNURVAoRiwgYiwgYywgZCwgYSwgU0VUKDExKSwgMHg4OTVjZDdiZSwgMjIpCi0JCVNURVAoRiwgYSwgYiwgYywgZCwgU0VUKDEyKSwgMHg2YjkwMTEyMiwgNykKLQkJU1RFUChGLCBkLCBhLCBiLCBjLCBTRVQoMTMpLCAweGZkOTg3MTkzLCAxMikKLQkJU1RFUChGLCBjLCBkLCBhLCBiLCBTRVQoMTQpLCAweGE2Nzk0MzhlLCAxNykKLQkJU1RFUChGLCBiLCBjLCBkLCBhLCBTRVQoMTUpLCAweDQ5YjQwODIxLCAyMikKLQotLyogUm91bmQgMiAqLwotCQlTVEVQKEcsIGEsIGIsIGMsIGQsIEdFVCgxKSwgMHhmNjFlMjU2MiwgNSkKLQkJU1RFUChHLCBkLCBhLCBiLCBjLCBHRVQoNiksIDB4YzA0MGIzNDAsIDkpCi0JCVNURVAoRywgYywgZCwgYSwgYiwgR0VUKDExKSwgMHgyNjVlNWE1MSwgMTQpCi0JCVNURVAoRywgYiwgYywgZCwgYSwgR0VUKDApLCAweGU5YjZjN2FhLCAyMCkKLQkJU1RFUChHLCBhLCBiLCBjLCBkLCBHRVQoNSksIDB4ZDYyZjEwNWQsIDUpCi0JCVNURVAoRywgZCwgYSwgYiwgYywgR0VUKDEwKSwgMHgwMjQ0MTQ1MywgOSkKLQkJU1RFUChHLCBjLCBkLCBhLCBiLCBHRVQoMTUpLCAweGQ4YTFlNjgxLCAxNCkKLQkJU1RFUChHLCBiLCBjLCBkLCBhLCBHRVQoNCksIDB4ZTdkM2ZiYzgsIDIwKQotCQlTVEVQKEcsIGEsIGIsIGMsIGQsIEdFVCg5KSwgMHgyMWUxY2RlNiwgNSkKLQkJU1RFUChHLCBkLCBhLCBiLCBjLCBHRVQoMTQpLCAweGMzMzcwN2Q2LCA5KQotCQlTVEVQKEcsIGMsIGQsIGEsIGIsIEdFVCgzKSwgMHhmNGQ1MGQ4NywgMTQpCi0JCVNURVAoRywgYiwgYywgZCwgYSwgR0VUKDgpLCAweDQ1NWExNGVkLCAyMCkKLQkJU1RFUChHLCBhLCBiLCBjLCBkLCBHRVQoMTMpLCAweGE5ZTNlOTA1LCA1KQotCQlTVEVQKEcsIGQsIGEsIGIsIGMsIEdFVCgyKSwgMHhmY2VmYTNmOCwgOSkKLQkJU1RFUChHLCBjLCBkLCBhLCBiLCBHRVQoNyksIDB4Njc2ZjAyZDksIDE0KQotCQlTVEVQKEcsIGIsIGMsIGQsIGEsIEdFVCgxMiksIDB4OGQyYTRjOGEsIDIwKQotCi0vKiBSb3VuZCAzICovCi0JCVNURVAoSCwgYSwgYiwgYywgZCwgR0VUKDUpLCAweGZmZmEzOTQyLCA0KQotCQlTVEVQKEgyLCBkLCBhLCBiLCBjLCBHRVQoOCksIDB4ODc3MWY2ODEsIDExKQotCQlTVEVQKEgsIGMsIGQsIGEsIGIsIEdFVCgxMSksIDB4NmQ5ZDYxMjIsIDE2KQotCQlTVEVQKEgyLCBiLCBjLCBkLCBhLCBHRVQoMTQpLCAweGZkZTUzODBjLCAyMykKLQkJU1RFUChILCBhLCBiLCBjLCBkLCBHRVQoMSksIDB4YTRiZWVhNDQsIDQpCi0JCVNURVAoSDIsIGQsIGEsIGIsIGMsIEdFVCg0KSwgMHg0YmRlY2ZhOSwgMTEpCi0JCVNURVAoSCwgYywgZCwgYSwgYiwgR0VUKDcpLCAweGY2YmI0YjYwLCAxNikKLQkJU1RFUChIMiwgYiwgYywgZCwgYSwgR0VUKDEwKSwgMHhiZWJmYmM3MCwgMjMpCi0JCVNURVAoSCwgYSwgYiwgYywgZCwgR0VUKDEzKSwgMHgyODliN2VjNiwgNCkKLQkJU1RFUChIMiwgZCwgYSwgYiwgYywgR0VUKDApLCAweGVhYTEyN2ZhLCAxMSkKLQkJU1RFUChILCBjLCBkLCBhLCBiLCBHRVQoMyksIDB4ZDRlZjMwODUsIDE2KQotCQlTVEVQKEgyLCBiLCBjLCBkLCBhLCBHRVQoNiksIDB4MDQ4ODFkMDUsIDIzKQotCQlTVEVQKEgsIGEsIGIsIGMsIGQsIEdFVCg5KSwgMHhkOWQ0ZDAzOSwgNCkKLQkJU1RFUChIMiwgZCwgYSwgYiwgYywgR0VUKDEyKSwgMHhlNmRiOTllNSwgMTEpCi0JCVNURVAoSCwgYywgZCwgYSwgYiwgR0VUKDE1KSwgMHgxZmEyN2NmOCwgMTYpCi0JCVNURVAoSDIsIGIsIGMsIGQsIGEsIEdFVCgyKSwgMHhjNGFjNTY2NSwgMjMpCi0KLS8qIFJvdW5kIDQgKi8KLQkJU1RFUChJLCBhLCBiLCBjLCBkLCBHRVQoMCksIDB4ZjQyOTIyNDQsIDYpCi0JCVNURVAoSSwgZCwgYSwgYiwgYywgR0VUKDcpLCAweDQzMmFmZjk3LCAxMCkKLQkJU1RFUChJLCBjLCBkLCBhLCBiLCBHRVQoMTQpLCAweGFiOTQyM2E3LCAxNSkKLQkJU1RFUChJLCBiLCBjLCBkLCBhLCBHRVQoNSksIDB4ZmM5M2EwMzksIDIxKQotCQlTVEVQKEksIGEsIGIsIGMsIGQsIEdFVCgxMiksIDB4NjU1YjU5YzMsIDYpCi0JCVNURVAoSSwgZCwgYSwgYiwgYywgR0VUKDMpLCAweDhmMGNjYzkyLCAxMCkKLQkJU1RFUChJLCBjLCBkLCBhLCBiLCBHRVQoMTApLCAweGZmZWZmNDdkLCAxNSkKLQkJU1RFUChJLCBiLCBjLCBkLCBhLCBHRVQoMSksIDB4ODU4NDVkZDEsIDIxKQotCQlTVEVQKEksIGEsIGIsIGMsIGQsIEdFVCg4KSwgMHg2ZmE4N2U0ZiwgNikKLQkJU1RFUChJLCBkLCBhLCBiLCBjLCBHRVQoMTUpLCAweGZlMmNlNmUwLCAxMCkKLQkJU1RFUChJLCBjLCBkLCBhLCBiLCBHRVQoNiksIDB4YTMwMTQzMTQsIDE1KQotCQlTVEVQKEksIGIsIGMsIGQsIGEsIEdFVCgxMyksIDB4NGUwODExYTEsIDIxKQotCQlTVEVQKEksIGEsIGIsIGMsIGQsIEdFVCg0KSwgMHhmNzUzN2U4MiwgNikKLQkJU1RFUChJLCBkLCBhLCBiLCBjLCBHRVQoMTEpLCAweGJkM2FmMjM1LCAxMCkKLQkJU1RFUChJLCBjLCBkLCBhLCBiLCBHRVQoMiksIDB4MmFkN2QyYmIsIDE1KQotCQlTVEVQKEksIGIsIGMsIGQsIGEsIEdFVCg5KSwgMHhlYjg2ZDM5MSwgMjEpCi0KLQkJYSArPSBzYXZlZF9hOwotCQliICs9IHNhdmVkX2I7Ci0JCWMgKz0gc2F2ZWRfYzsKLQkJZCArPSBzYXZlZF9kOwotCi0JCXB0ciArPSA2NDsKLQl9IHdoaWxlIChzaXplIC09IDY0KTsKLQotCWN0eC0+YSA9IGE7Ci0JY3R4LT5iID0gYjsKLQljdHgtPmMgPSBjOwotCWN0eC0+ZCA9IGQ7Ci0KLQlyZXR1cm4gcHRyOwotfQotCi12b2lkIE1ENV9Jbml0KE1ENV9DVFggKmN0eCkKLXsKLQljdHgtPmEgPSAweDY3NDUyMzAxOwotCWN0eC0+YiA9IDB4ZWZjZGFiODk7Ci0JY3R4LT5jID0gMHg5OGJhZGNmZTsKLQljdHgtPmQgPSAweDEwMzI1NDc2OwotCi0JY3R4LT5sbyA9IDA7Ci0JY3R4LT5oaSA9IDA7Ci19Ci0KLXZvaWQgTUQ1X1VwZGF0ZShNRDVfQ1RYICpjdHgsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlNRDVfdTMycGx1cyBzYXZlZF9sbzsKLQl1bnNpZ25lZCBsb25nIHVzZWQsIGF2YWlsYWJsZTsKLQotCXNhdmVkX2xvID0gY3R4LT5sbzsKLQlpZiAoKGN0eC0+bG8gPSAoc2F2ZWRfbG8gKyBzaXplKSAmIDB4MWZmZmZmZmYpIDwgc2F2ZWRfbG8pCi0JCWN0eC0+aGkrKzsKLQljdHgtPmhpICs9IHNpemUgPj4gMjk7Ci0KLQl1c2VkID0gc2F2ZWRfbG8gJiAweDNmOwotCi0JaWYgKHVzZWQpIHsKLQkJYXZhaWxhYmxlID0gNjQgLSB1c2VkOwotCi0JCWlmIChzaXplIDwgYXZhaWxhYmxlKSB7Ci0JCQltZW1jcHkoJmN0eC0+YnVmZmVyW3VzZWRdLCBkYXRhLCBzaXplKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCW1lbWNweSgmY3R4LT5idWZmZXJbdXNlZF0sIGRhdGEsIGF2YWlsYWJsZSk7Ci0JCWRhdGEgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWRhdGEgKyBhdmFpbGFibGU7Ci0JCXNpemUgLT0gYXZhaWxhYmxlOwotCQlib2R5KGN0eCwgY3R4LT5idWZmZXIsIDY0KTsKLQl9Ci0KLQlpZiAoc2l6ZSA+PSA2NCkgewotCQlkYXRhID0gYm9keShjdHgsIGRhdGEsIHNpemUgJiB+KHVuc2lnbmVkIGxvbmcpMHgzZik7Ci0JCXNpemUgJj0gMHgzZjsKLQl9Ci0KLQltZW1jcHkoY3R4LT5idWZmZXIsIGRhdGEsIHNpemUpOwotfQotCi12b2lkIE1ENV9GaW5hbCh1bnNpZ25lZCBjaGFyICpyZXN1bHQsIE1ENV9DVFggKmN0eCkKLXsKLQl1bnNpZ25lZCBsb25nIHVzZWQsIGF2YWlsYWJsZTsKLQotCXVzZWQgPSBjdHgtPmxvICYgMHgzZjsKLQotCWN0eC0+YnVmZmVyW3VzZWQrK10gPSAweDgwOwotCi0JYXZhaWxhYmxlID0gNjQgLSB1c2VkOwotCi0JaWYgKGF2YWlsYWJsZSA8IDgpIHsKLQkJbWVtc2V0KCZjdHgtPmJ1ZmZlclt1c2VkXSwgMCwgYXZhaWxhYmxlKTsKLQkJYm9keShjdHgsIGN0eC0+YnVmZmVyLCA2NCk7Ci0JCXVzZWQgPSAwOwotCQlhdmFpbGFibGUgPSA2NDsKLQl9Ci0KLQltZW1zZXQoJmN0eC0+YnVmZmVyW3VzZWRdLCAwLCBhdmFpbGFibGUgLSA4KTsKLQotCWN0eC0+bG8gPDw9IDM7Ci0JY3R4LT5idWZmZXJbNTZdID0gY3R4LT5sbzsKLQljdHgtPmJ1ZmZlcls1N10gPSBjdHgtPmxvID4+IDg7Ci0JY3R4LT5idWZmZXJbNThdID0gY3R4LT5sbyA+PiAxNjsKLQljdHgtPmJ1ZmZlcls1OV0gPSBjdHgtPmxvID4+IDI0OwotCWN0eC0+YnVmZmVyWzYwXSA9IGN0eC0+aGk7Ci0JY3R4LT5idWZmZXJbNjFdID0gY3R4LT5oaSA+PiA4OwotCWN0eC0+YnVmZmVyWzYyXSA9IGN0eC0+aGkgPj4gMTY7Ci0JY3R4LT5idWZmZXJbNjNdID0gY3R4LT5oaSA+PiAyNDsKLQotCWJvZHkoY3R4LCBjdHgtPmJ1ZmZlciwgNjQpOwotCi0JcmVzdWx0WzBdID0gY3R4LT5hOwotCXJlc3VsdFsxXSA9IGN0eC0+YSA+PiA4OwotCXJlc3VsdFsyXSA9IGN0eC0+YSA+PiAxNjsKLQlyZXN1bHRbM10gPSBjdHgtPmEgPj4gMjQ7Ci0JcmVzdWx0WzRdID0gY3R4LT5iOwotCXJlc3VsdFs1XSA9IGN0eC0+YiA+PiA4OwotCXJlc3VsdFs2XSA9IGN0eC0+YiA+PiAxNjsKLQlyZXN1bHRbN10gPSBjdHgtPmIgPj4gMjQ7Ci0JcmVzdWx0WzhdID0gY3R4LT5jOwotCXJlc3VsdFs5XSA9IGN0eC0+YyA+PiA4OwotCXJlc3VsdFsxMF0gPSBjdHgtPmMgPj4gMTY7Ci0JcmVzdWx0WzExXSA9IGN0eC0+YyA+PiAyNDsKLQlyZXN1bHRbMTJdID0gY3R4LT5kOwotCXJlc3VsdFsxM10gPSBjdHgtPmQgPj4gODsKLQlyZXN1bHRbMTRdID0gY3R4LT5kID4+IDE2OwotCXJlc3VsdFsxNV0gPSBjdHgtPmQgPj4gMjQ7Ci0KLQltZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9iYXNlL21kNS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvbWQ1LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYTQ0YmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2Jhc2UvbWQ1LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogVGhpcyBpcyBhbiBPcGVuU1NMLWNvbXBhdGlibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuCi0gKiBNRDUgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtIChSRkMgMTMyMSkuCi0gKgotICogSG9tZXBhZ2U6Ci0gKiBodHRwOi8vb3BlbndhbGwuaW5mby93aWtpL3Blb3BsZS9zb2xhci9zb2Z0d2FyZS9wdWJsaWMtZG9tYWluLXNvdXJjZS1jb2RlL21kNQotICoKLSAqIEF1dGhvcjoKLSAqIEFsZXhhbmRlciBQZXNseWFrLCBiZXR0ZXIga25vd24gYXMgU29sYXIgRGVzaWduZXIgPHNvbGFyIGF0IG9wZW53YWxsLmNvbT4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIHdhcyB3cml0dGVuIGJ5IEFsZXhhbmRlciBQZXNseWFrIGluIDIwMDEuICBObyBjb3B5cmlnaHQgaXMKLSAqIGNsYWltZWQsIGFuZCB0aGUgc29mdHdhcmUgaXMgaGVyZWJ5IHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbi4KLSAqIEluIGNhc2UgdGhpcyBhdHRlbXB0IHRvIGRpc2NsYWltIGNvcHlyaWdodCBhbmQgcGxhY2UgdGhlIHNvZnR3YXJlIGluIHRoZQotICogcHVibGljIGRvbWFpbiBpcyBkZWVtZWQgbnVsbCBhbmQgdm9pZCwgdGhlbiB0aGUgc29mdHdhcmUgaXMKLSAqIENvcHlyaWdodCAoYykgMjAwMSBBbGV4YW5kZXIgUGVzbHlhayBhbmQgaXQgaXMgaGVyZWJ5IHJlbGVhc2VkIHRvIHRoZQotICogZ2VuZXJhbCBwdWJsaWMgdW5kZXIgdGhlIGZvbGxvd2luZyB0ZXJtczoKLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZC4KLSAqCi0gKiBUaGVyZSdzIEFCU09MVVRFTFkgTk8gV0FSUkFOVFksIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqCi0gKiBTZWUgbWQ1LmMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKi8KLQotI2lmZGVmIEhBVkVfT1BFTlNTTAotI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+Ci0jZWxpZiAhZGVmaW5lZChfTUQ1X0gpCi0jZGVmaW5lIF9NRDVfSAotCi0vKiBBbnkgMzItYml0IG9yIHdpZGVyIHVuc2lnbmVkIGludGVnZXIgZGF0YSB0eXBlIHdpbGwgZG8gKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IE1ENV91MzJwbHVzOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0JTUQ1X3UzMnBsdXMgbG8sIGhpOwotCU1ENV91MzJwbHVzIGEsIGIsIGMsIGQ7Ci0JdW5zaWduZWQgY2hhciBidWZmZXJbNjRdOwotCU1ENV91MzJwbHVzIGJsb2NrWzE2XTsKLX0gTUQ1X0NUWDsKLQotZXh0ZXJuIHZvaWQgTUQ1X0luaXQoTUQ1X0NUWCAqY3R4KTsKLWV4dGVybiB2b2lkIE1ENV9VcGRhdGUoTUQ1X0NUWCAqY3R4LCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUpOwotZXh0ZXJuIHZvaWQgTUQ1X0ZpbmFsKHVuc2lnbmVkIGNoYXIgKnJlc3VsdCwgTUQ1X0NUWCAqY3R4KTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL0phbWZpbGUgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL0phbWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZWMwNzkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyBGcmVlVHlwZSAyIHNyYy9jZmYgSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIGNmZiA7Ci0KLXsKLSAgbG9jYWwgIF9zb3VyY2VzIDsKLQotICBpZiAkKEZUMl9NVUxUSSkKLSAgewotICAgIF9zb3VyY2VzID0gY2ZmY21hcAotICAgICAgICAgICAgICAgY2ZmZHJpdnIKLSAgICAgICAgICAgICAgIGNmZmdsb2FkCi0gICAgICAgICAgICAgICBjZmZsb2FkCi0gICAgICAgICAgICAgICBjZmZvYmpzCi0gICAgICAgICAgICAgICBjZmZwYXJzZQotICAgICAgICAgICAgICAgY2ZmcGljCi0gICAgICAgICAgICAgICBjZjJhcnJzdAotICAgICAgICAgICAgICAgY2YyYmx1ZXMKLSAgICAgICAgICAgICAgIGNmMmVycm9yCi0gICAgICAgICAgICAgICBjZjJmb250Ci0gICAgICAgICAgICAgICBjZjJmdAotICAgICAgICAgICAgICAgY2YyaGludHMKLSAgICAgICAgICAgICAgIGNmMmludHJwCi0gICAgICAgICAgICAgICBjZjJyZWFkCi0gICAgICAgICAgICAgICBjZjJzdGFjawotICAgICAgICAgICAgICAgOwotICB9Ci0gIGVsc2UKLSAgewotICAgIF9zb3VyY2VzID0gY2ZmIDsKLSAgfQotCi0gIExpYnJhcnkgICQoRlQyX0xJQikgOiAkKF9zb3VyY2VzKS5jIDsKLX0KLQotIyBlbmQgb2Ygc3JjL2NmZiBKYW1maWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmFycnN0LmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmFycnN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZjNlOWYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJhcnJzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmMmFycnN0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBZG9iZSdzIGNvZGUgZm9yIEFycmF5IFN0YWNrcyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNy0yMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IgICAgICAgKi8KLS8qICBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZCAgICAgICovCi0vKiAgaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUgICAqLwotLyogIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgICAgKi8KLS8qICBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMgICAqLwotLyogIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgICAgKi8KLS8qICB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IgICAgICovCi0vKiAgIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsICAgICAgICAgICAgICAqLwotLyogIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgICAgKi8KLS8qICBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCAgICAgICovCi0vKiAgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlICAqLwotLyogIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5ICAgICAgKi8KLS8qICBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyICAgICovCi0vKiAgY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzICAgICAgICAqLwotLyogIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5ICAgICAgKi8KLS8qICAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCAgICovCi0vKiAgdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyAgICAqLwotLyogIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzICAgKi8KLS8qICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgICovCi0vKiAgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91ICAgICovCi0vKiAgaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgICAgICAgICAgICAgICAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwgICAgKi8KLS8qICBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiY2YyZnQuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgImNmMmdsdWUuaCIKLSNpbmNsdWRlICJjZjJhcnJzdC5oIgotCi0jaW5jbHVkZSAiY2YyZXJyb3IuaCIKLQotCi0gIC8qCi0gICAqIENGMl9BcnJTdGFjayB1c2VzIGFuIGVycm9yIHBvaW50ZXIsIHRvIGVuYWJsZSBzaGFyZWQgZXJyb3JzLgotICAgKiBTaGFyZWQgZXJyb3JzIGFyZSBuZWNlc3Nhcnkgd2hlbiBtdWx0aXBsZSBvYmplY3RzIGFsbG93IHRoZSBwcm9ncmFtCi0gICAqIHRvIGNvbnRpbnVlIGFmdGVyIGRldGVjdGluZyBlcnJvcnMuICBPbmx5IHRoZSBmaXJzdCBlcnJvciBzaG91bGQgYmUKLSAgICogcmVjb3JkZWQuCi0gICAqLwotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9hcnJzdGFja19pbml0KCBDRjJfQXJyU3RhY2sgIGFycnN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogICAgIGVycm9yLAotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICBzaXplSXRlbSApCi0gIHsKLSAgICBGVF9BU1NFUlQoIGFycnN0YWNrICE9IE5VTEwgKTsKLQotICAgIC8qIGluaXRpYWxpemUgdGhlIHN0cnVjdHVyZSAqLwotICAgIGFycnN0YWNrLT5tZW1vcnkgICAgPSBtZW1vcnk7Ci0gICAgYXJyc3RhY2stPmVycm9yICAgICA9IGVycm9yOwotICAgIGFycnN0YWNrLT5zaXplSXRlbSAgPSBzaXplSXRlbTsKLSAgICBhcnJzdGFjay0+YWxsb2NhdGVkID0gMDsKLSAgICBhcnJzdGFjay0+Y2h1bmsgICAgID0gMTA7ICAgIC8qIGNodW5rcyBvZiAxMCBpdGVtcyAqLwotICAgIGFycnN0YWNrLT5jb3VudCAgICAgPSAwOwotICAgIGFycnN0YWNrLT50b3RhbFNpemUgPSAwOwotICAgIGFycnN0YWNrLT5wdHIgICAgICAgPSBOVUxMOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZjJfYXJyc3RhY2tfZmluYWxpemUoIENGMl9BcnJTdGFjayAgYXJyc3RhY2sgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBhcnJzdGFjay0+bWVtb3J5OyAgICAgLyogZm9yIEZUX0ZSRUUgKi8KLQotCi0gICAgRlRfQVNTRVJUKCBhcnJzdGFjayAhPSBOVUxMICk7Ci0KLSAgICBhcnJzdGFjay0+YWxsb2NhdGVkID0gMDsKLSAgICBhcnJzdGFjay0+Y291bnQgICAgID0gMDsKLSAgICBhcnJzdGFjay0+dG90YWxTaXplID0gMDsKLQotICAgIC8qIGZyZWUgdGhlIGRhdGEgYnVmZmVyICovCi0gICAgRlRfRlJFRSggYXJyc3RhY2stPnB0ciApOwotICB9Ci0KLQotICAvKiBhbGxvY2F0ZSBvciByZWFsbG9jYXRlIHRoZSBidWZmZXIgc2l6ZTsgKi8KLSAgLyogcmV0dXJuIGZhbHNlIG9uIG1lbW9yeSBlcnJvciAqLwotICBzdGF0aWMgRlRfQm9vbAotICBjZjJfYXJyc3RhY2tfc2V0TnVtRWxlbWVudHMoIENGMl9BcnJTdGFjayAgYXJyc3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICBudW1FbGVtZW50cyApCi0gIHsKLSAgICBGVF9BU1NFUlQoIGFycnN0YWNrICE9IE5VTEwgKTsKLQotICAgIHsKLSAgICAgIEZUX0Vycm9yICAgZXJyb3IgID0gRlRfRXJyX09rOyAgICAgICAgLyogZm9yIEZUX1JFQUxMT0MgKi8KLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gYXJyc3RhY2stPm1lbW9yeTsgLyogZm9yIEZUX1JFQUxMT0MgKi8KLQotICAgICAgc2l6ZV90ICBuZXdTaXplID0gbnVtRWxlbWVudHMgKiBhcnJzdGFjay0+c2l6ZUl0ZW07Ci0KLQotICAgICAgaWYgKCBudW1FbGVtZW50cyA+IEZUX0xPTkdfTUFYIC8gYXJyc3RhY2stPnNpemVJdGVtICkKLSAgICAgICAgZ290byBleGl0OwotCi0KLSAgICAgIEZUX0FTU0VSVCggbmV3U2l6ZSA+IDAgKTsgICAvKiBhdm9pZCByZWFsbG9jIHdpdGggemVybyBzaXplICovCi0KLSAgICAgIGlmICggIUZUX1JFQUxMT0MoIGFycnN0YWNrLT5wdHIsIGFycnN0YWNrLT50b3RhbFNpemUsIG5ld1NpemUgKSApCi0gICAgICB7Ci0gICAgICAgIGFycnN0YWNrLT5hbGxvY2F0ZWQgPSBudW1FbGVtZW50czsKLSAgICAgICAgYXJyc3RhY2stPnRvdGFsU2l6ZSA9IG5ld1NpemU7Ci0KLSAgICAgICAgaWYgKCBhcnJzdGFjay0+Y291bnQgPiBudW1FbGVtZW50cyApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiB3ZSB0cnVuY2F0ZWQgdGhlIGxpc3QhICovCi0gICAgICAgICAgQ0YyX1NFVF9FUlJPUiggYXJyc3RhY2stPmVycm9yLCBTdGFja19PdmVyZmxvdyApOwotICAgICAgICAgIGFycnN0YWNrLT5jb3VudCA9IG51bUVsZW1lbnRzOwotICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBUUlVFOyAgICAgLyogc3VjY2VzcyAqLwotICAgICAgfQotICAgIH0KLQotICBleGl0OgotICAgIC8qIGlmIHRoZXJlJ3Mgbm90IGFscmVhZHkgYW4gZXJyb3IsIHN0b3JlIHRoaXMgb25lICovCi0gICAgQ0YyX1NFVF9FUlJPUiggYXJyc3RhY2stPmVycm9yLCBPdXRfT2ZfTWVtb3J5ICk7Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotCi0gIC8qIHNldCB0aGUgY291bnQsIGVuc3VyaW5nIGFsbG9jYXRpb24gaXMgc3VmZmljaWVudCAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZjJfYXJyc3RhY2tfc2V0Q291bnQoIENGMl9BcnJTdGFjayAgYXJyc3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICBudW1FbGVtZW50cyApCi0gIHsKLSAgICBGVF9BU1NFUlQoIGFycnN0YWNrICE9IE5VTEwgKTsKLQotICAgIGlmICggbnVtRWxlbWVudHMgPiBhcnJzdGFjay0+YWxsb2NhdGVkICkKLSAgICB7Ci0gICAgICAvKiBleHBhbmQgdGhlIGFsbG9jYXRpb24gZmlyc3QgKi8KLSAgICAgIGlmICggIWNmMl9hcnJzdGFja19zZXROdW1FbGVtZW50cyggYXJyc3RhY2ssIG51bUVsZW1lbnRzICkgKQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYXJyc3RhY2stPmNvdW50ID0gbnVtRWxlbWVudHM7Ci0gIH0KLQotCi0gIC8qIGNsZWFyIHRoZSBjb3VudCAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZjJfYXJyc3RhY2tfY2xlYXIoIENGMl9BcnJTdGFjayAgYXJyc3RhY2sgKQotICB7Ci0gICAgRlRfQVNTRVJUKCBhcnJzdGFjayAhPSBOVUxMICk7Ci0KLSAgICBhcnJzdGFjay0+Y291bnQgPSAwOwotICB9Ci0KLQotICAvKiBjdXJyZW50IG51bWJlciBvZiBpdGVtcyAqLwotICBGVF9MT0NBTF9ERUYoIHNpemVfdCApCi0gIGNmMl9hcnJzdGFja19zaXplKCBjb25zdCBDRjJfQXJyU3RhY2sgIGFycnN0YWNrICkKLSAgewotICAgIEZUX0FTU0VSVCggYXJyc3RhY2sgIT0gTlVMTCApOwotCi0gICAgcmV0dXJuIGFycnN0YWNrLT5jb3VudDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkKiApCi0gIGNmMl9hcnJzdGFja19nZXRCdWZmZXIoIGNvbnN0IENGMl9BcnJTdGFjayAgYXJyc3RhY2sgKQotICB7Ci0gICAgRlRfQVNTRVJUKCBhcnJzdGFjayAhPSBOVUxMICk7Ci0KLSAgICByZXR1cm4gYXJyc3RhY2stPnB0cjsKLSAgfQotCi0KLSAgLyogcmV0dXJuIHBvaW50ZXIgdG8gdGhlIGdpdmVuIGVsZW1lbnQgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkKiApCi0gIGNmMl9hcnJzdGFja19nZXRQb2ludGVyKCBjb25zdCBDRjJfQXJyU3RhY2sgIGFycnN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICBpZHggKQotICB7Ci0gICAgdm9pZCogIG5ld1B0cjsKLQotCi0gICAgRlRfQVNTRVJUKCBhcnJzdGFjayAhPSBOVUxMICk7Ci0KLSAgICBpZiAoIGlkeCA+PSBhcnJzdGFjay0+Y291bnQgKQotICAgIHsKLSAgICAgIC8qIG92ZXJmbG93ICovCi0gICAgICBDRjJfU0VUX0VSUk9SKCBhcnJzdGFjay0+ZXJyb3IsIFN0YWNrX092ZXJmbG93ICk7Ci0gICAgICBpZHggPSAwOyAgICAvKiBjaG9vc2Ugc2FmZSBkZWZhdWx0ICovCi0gICAgfQotCi0gICAgbmV3UHRyID0gKEZUX0J5dGUqKWFycnN0YWNrLT5wdHIgKyBpZHggKiBhcnJzdGFjay0+c2l6ZUl0ZW07Ci0KLSAgICByZXR1cm4gbmV3UHRyOwotICB9Ci0KLQotICAvKiBwdXNoIChhcHBlbmQpIGFuIGVsZW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdDsgICAgICAgICAqLwotICAvKiByZXR1cm4gZmFsc2Ugb24gbWVtb3J5IGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUT0RPOiBzaG91bGQgdGhlcmUgYmUgYSBsZW5ndGggcGFyYW0gZm9yIGV4dHJhIGNoZWNraW5nPyAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZjJfYXJyc3RhY2tfcHVzaCggQ0YyX0FyclN0YWNrICBhcnJzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqICAgcHRyICkKLSAgewotICAgIEZUX0FTU0VSVCggYXJyc3RhY2sgIT0gTlVMTCApOwotCi0gICAgaWYgKCBhcnJzdGFjay0+Y291bnQgPT0gYXJyc3RhY2stPmFsbG9jYXRlZCApCi0gICAgewotICAgICAgLyogZ3JvdyB0aGUgYnVmZmVyIGJ5IG9uZSBjaHVuayAqLwotICAgICAgaWYgKCAhY2YyX2FycnN0YWNrX3NldE51bUVsZW1lbnRzKAotICAgICAgICAgICAgIGFycnN0YWNrLCBhcnJzdGFjay0+YWxsb2NhdGVkICsgYXJyc3RhY2stPmNodW5rICkgKQotICAgICAgewotICAgICAgICAvKiBvbiBlcnJvciwgaWdub3JlIHRoZSBwdXNoICovCi0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBGVF9BU1NFUlQoIHB0ciAhPSBOVUxMICk7Ci0KLSAgICB7Ci0gICAgICBzaXplX3QgIG9mZnNldCA9IGFycnN0YWNrLT5jb3VudCAqIGFycnN0YWNrLT5zaXplSXRlbTsKLSAgICAgIHZvaWQqICAgbmV3UHRyID0gKEZUX0J5dGUqKWFycnN0YWNrLT5wdHIgKyBvZmZzZXQ7Ci0KLQotICAgICAgRlRfTUVNX0NPUFkoIG5ld1B0ciwgcHRyLCBhcnJzdGFjay0+c2l6ZUl0ZW0gKTsKLSAgICAgIGFycnN0YWNrLT5jb3VudCArPSAxOwotICAgIH0KLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJhcnJzdC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJhcnJzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjVhZDhiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyYXJyc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZjJhcnJzdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBBcnJheSBTdGFja3MgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0NGMkFSUlNUX0hfXwotI2RlZmluZSBfX0NGMkFSUlNUX0hfXwotCi0KLSNpbmNsdWRlICJjZjJlcnJvci5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyogbmVlZCB0byBkZWZpbmUgdGhlIHN0cnVjdCBoZXJlIChub3Qgb3BhcXVlKSBzbyBpdCBjYW4gYmUgYWxsb2NhdGVkIGJ5ICovCi0gIC8qIGNsaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQ0YyX0FyclN0YWNrUmVjXwotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0gICAgRlRfRXJyb3IqICBlcnJvcjsKLQotICAgIHNpemVfdCAgc2l6ZUl0ZW07ICAgICAgIC8qIGJ5dGVzIHBlciBlbGVtZW50ICAgICAgICAgICAgICovCi0gICAgc2l6ZV90ICBhbGxvY2F0ZWQ7ICAgICAgLyogaXRlbXMgYWxsb2NhdGVkICAgICAgICAgICAgICAgKi8KLSAgICBzaXplX3QgIGNodW5rOyAgICAgICAgICAvKiBhbGxvY2F0aW9uIGluY3JlbWVudCBpbiBpdGVtcyAqLwotICAgIHNpemVfdCAgY291bnQ7ICAgICAgICAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBhbGxvY2F0ZWQgICovCi0gICAgc2l6ZV90ICB0b3RhbFNpemU7ICAgICAgLyogdG90YWwgYnl0ZXMgYWxsb2NhdGVkICAgICAgICAgKi8KLQotICAgIHZvaWQqICBwdHI7ICAgICAgICAgICAgIC8qIHB0ciB0byBkYXRhICAgICAgICAgICAgICAgICAgICovCi0KLSAgfSBDRjJfQXJyU3RhY2tSZWMsICpDRjJfQXJyU3RhY2s7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9hcnJzdGFja19pbml0KCBDRjJfQXJyU3RhY2sgIGFycnN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogICAgIGVycm9yLAotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICBzaXplSXRlbSApOwotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9hcnJzdGFja19maW5hbGl6ZSggQ0YyX0FyclN0YWNrICBhcnJzdGFjayApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX2FycnN0YWNrX3NldENvdW50KCBDRjJfQXJyU3RhY2sgIGFycnN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgbnVtRWxlbWVudHMgKTsKLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZjJfYXJyc3RhY2tfY2xlYXIoIENGMl9BcnJTdGFjayAgYXJyc3RhY2sgKTsKLSAgRlRfTE9DQUwoIHNpemVfdCApCi0gIGNmMl9hcnJzdGFja19zaXplKCBjb25zdCBDRjJfQXJyU3RhY2sgIGFycnN0YWNrICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQqICkKLSAgY2YyX2FycnN0YWNrX2dldEJ1ZmZlciggY29uc3QgQ0YyX0FyclN0YWNrICBhcnJzdGFjayApOwotICBGVF9MT0NBTCggdm9pZCogKQotICBjZjJfYXJyc3RhY2tfZ2V0UG9pbnRlciggY29uc3QgQ0YyX0FyclN0YWNrICBhcnJzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgaWR4ICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZjJfYXJyc3RhY2tfcHVzaCggQ0YyX0FyclN0YWNrICBhcnJzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqICAgcHRyICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX0NGMkFSUlNUX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJibHVlcy5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJibHVlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTBmODllLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyYmx1ZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDU3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZjJibHVlcy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBoYW5kbGluZyBCbHVlIFpvbmVzIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxNCBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImNmMmZ0LmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLSNpbmNsdWRlICJjZjJibHVlcy5oIgotI2luY2x1ZGUgImNmMmhpbnRzLmgiCi0jaW5jbHVkZSAiY2YyZm9udC5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfY2YyYmx1ZXMKLQotCi0gIC8qCi0gICAqIEZvciBibHVlIHZhbHVlcywgdGhlIEZyZWVUeXBlIHBhcnNlciBwcm9kdWNlcyBhbiBhcnJheSBvZiBpbnRlZ2VycywKLSAgICogd2hpbGUgdGhlIEFkb2JlIENGRiBlbmdpbmUgcHJvZHVjZXMgYW4gYXJyYXkgb2YgZml4ZWQuCi0gICAqIERlZmluZSBhIG1hY3JvIHRvIGNvbnZlcnQgRnJlZVR5cGUgdG8gZml4ZWQuCi0gICAqLwotI2RlZmluZSBjZjJfYmx1ZVRvRml4ZWQoIHggKSAgY2YyX2ludFRvRml4ZWQoIHggKQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX2JsdWVzX2luaXQoIENGMl9CbHVlcyAgYmx1ZXMsCi0gICAgICAgICAgICAgICAgICBDRjJfRm9udCAgIGZvbnQgKQotICB7Ci0gICAgLyogcG9pbnRlciB0byBwYXJzZWQgZm9udCBvYmplY3QgKi8KLSAgICBDRkZfRGVjb2RlciogIGRlY29kZXIgPSBmb250LT5kZWNvZGVyOwotCi0gICAgQ0YyX0ZpeGVkICB6b25lSGVpZ2h0OwotICAgIENGMl9GaXhlZCAgbWF4Wm9uZUhlaWdodCA9IDA7Ci0gICAgQ0YyX0ZpeGVkICBjc1VuaXRzUGVyUGl4ZWw7Ci0KLSAgICBzaXplX3QgIG51bUJsdWVWYWx1ZXM7Ci0gICAgc2l6ZV90ICBudW1PdGhlckJsdWVzOwotICAgIHNpemVfdCAgbnVtRmFtaWx5Qmx1ZXM7Ci0gICAgc2l6ZV90ICBudW1GYW1pbHlPdGhlckJsdWVzOwotCi0gICAgRlRfUG9zKiAgYmx1ZVZhbHVlczsKLSAgICBGVF9Qb3MqICBvdGhlckJsdWVzOwotICAgIEZUX1BvcyogIGZhbWlseUJsdWVzOwotICAgIEZUX1BvcyogIGZhbWlseU90aGVyQmx1ZXM7Ci0KLSAgICBzaXplX3QgICAgIGk7Ci0gICAgQ0YyX0ZpeGVkICBlbUJveEJvdHRvbSwgZW1Cb3hUb3A7Ci0KLSNpZiAwCi0gICAgQ0YyX0ludCAgdW5pdHNQZXJFbSA9IGZvbnQtPnVuaXRzUGVyRW07Ci0KLQotICAgIGlmICggdW5pdHNQZXJFbSA9PSAwICkKLSAgICAgIHVuaXRzUGVyRW0gPSAxMDAwOwotI2VuZGlmCi0KLSAgICBGVF9aRVJPKCBibHVlcyApOwotICAgIGJsdWVzLT5zY2FsZSA9IGZvbnQtPmlubmVyVHJhbnNmb3JtLmQ7Ci0KLSAgICBjZjJfZ2V0Qmx1ZU1ldHJpY3MoIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmYmx1ZXMtPmJsdWVTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZibHVlcy0+Ymx1ZVNoaWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgJmJsdWVzLT5ibHVlRnV6eiApOwotCi0gICAgY2YyX2dldEJsdWVWYWx1ZXMoIGRlY29kZXIsICZudW1CbHVlVmFsdWVzLCAmYmx1ZVZhbHVlcyApOwotICAgIGNmMl9nZXRPdGhlckJsdWVzKCBkZWNvZGVyLCAmbnVtT3RoZXJCbHVlcywgJm90aGVyQmx1ZXMgKTsKLSAgICBjZjJfZ2V0RmFtaWx5Qmx1ZXMoIGRlY29kZXIsICZudW1GYW1pbHlCbHVlcywgJmZhbWlseUJsdWVzICk7Ci0gICAgY2YyX2dldEZhbWlseU90aGVyQmx1ZXMoIGRlY29kZXIsICZudW1GYW1pbHlPdGhlckJsdWVzLCAmZmFtaWx5T3RoZXJCbHVlcyApOwotCi0gICAgLyoKLSAgICAgKiBzeW50aGV0aWMgZW0gYm94IGhpbnQgaGV1cmlzdGljCi0gICAgICoKLSAgICAgKiBBcHBseSB0aGlzIHdoZW4gaWRlb2dyYXBoaWMgZGljdGlvbmFyeSAoTGFuZ3VhZ2VHcm91cCAxKSBoYXMgbm8KLSAgICAgKiByZWFsIGFsaWdubWVudCB6b25lcy4gIEFkb2JlIHRvb2xzIGdlbmVyYXRlIGR1bW15IHpvbmVzIGF0IC0yNTAgYW5kCi0gICAgICogMTEwMCBmb3IgYSAxMDAwIHVuaXQgZW0uICBGb250cyB3aXRoIElDRi1iYXNlZCBhbGlnbm1lbnQgem9uZXMKLSAgICAgKiBzaG91bGQgbm90IGVuYWJsZSB0aGUgaGV1cmlzdGljLiAgV2hlbiB0aGUgaGV1cmlzdGljIGlzIGVuYWJsZWQsCi0gICAgICogdGhlIGZvbnQncyBibHVlIHpvbmVzIGFyZSBpZ25vcmVkLgotICAgICAqCi0gICAgICovCi0KLSAgICAvKiBnZXQgZW0gYm94IGZyb20gT1MvMiB0eXBvQXNjZW5kZXIvRGVzY2VuZGVyICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogVE9ETzogRnJlZVR5cGUgZG9lcyBub3QgcGFyc2UgdGhlc2UgbWV0cmljcy4gIFNraXAgdGhlbSBmb3Igbm93LiAqLwotI2lmIDAKLSAgICBGQ01fZ2V0SG9yaXpvbnRhbExpbmVNZXRyaWNzKCAmZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LT5mb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhc2NlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzY2VuZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaW5lZ2FwICk7Ci0gICAgaWYgKCBhc2NlbmRlciAtIGRlc2NlbmRlciA9PSB1bml0c1BlckVtICkKLSAgICB7Ci0gICAgICBlbUJveEJvdHRvbSA9IGNmMl9pbnRUb0ZpeGVkKCBkZXNjZW5kZXIgKTsKLSAgICAgIGVtQm94VG9wICAgID0gY2YyX2ludFRvRml4ZWQoIGFzY2VuZGVyICk7Ci0gICAgfQotICAgIGVsc2UKLSNlbmRpZgotICAgIHsKLSAgICAgIGVtQm94Qm90dG9tID0gQ0YyX0lDRl9Cb3R0b207Ci0gICAgICBlbUJveFRvcCAgICA9IENGMl9JQ0ZfVG9wOwotICAgIH0KLQotICAgIGlmICggY2YyX2dldExhbmd1YWdlR3JvdXAoIGRlY29kZXIgKSA9PSAxICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAoIG51bUJsdWVWYWx1ZXMgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICggbnVtQmx1ZVZhbHVlcyA9PSA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIGNmMl9ibHVlVG9GaXhlZCggYmx1ZVZhbHVlc1swXSApIDwgZW1Cb3hCb3R0b20gJiYKLSAgICAgICAgICAgICBjZjJfYmx1ZVRvRml4ZWQoIGJsdWVWYWx1ZXNbMV0gKSA8IGVtQm94Qm90dG9tICYmCi0gICAgICAgICAgICAgY2YyX2JsdWVUb0ZpeGVkKCBibHVlVmFsdWVzWzJdICkgPiBlbUJveFRvcCAgICAmJgotICAgICAgICAgICAgIGNmMl9ibHVlVG9GaXhlZCggYmx1ZVZhbHVlc1szXSApID4gZW1Cb3hUb3AgICAgKSApICkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogQ29uc3RydWN0IGhpbnQgZWRnZXMgc3VpdGFibGUgZm9yIHN5bnRoZXRpYyBnaG9zdCBoaW50cyBhdCB0b3AKLSAgICAgICAqIGFuZCBib3R0b20gb2YgZW0gYm94LiAgKy1DRjJfTUlOX0NPVU5URVIgYWxsb3dzIGZvciB1bmhpbnRlZAotICAgICAgICogZmVhdHVyZXMgYWJvdmUgb3IgYmVsb3cgdGhlIGxhc3QgaGludGVkIGVkZ2UuICBUaGlzIGFsc28gZ2l2ZXMgYQotICAgICAgICogbmV0IDEgcGl4ZWwgYm9vc3QgdG8gdGhlIGhlaWdodCBvZiBpZGVvZ3JhcGhpYyBnbHlwaHMuCi0gICAgICAgKgotICAgICAgICogTm90ZTogQWRqdXN0IHN5bnRoZXRpYyBoaW50cyBvdXR3YXJkIGJ5IGVwc2lsb24gKDB4LjAwMDEpIHRvCi0gICAgICAgKiAgICAgICBhdm9pZCBpbnRlcmZlcmVuY2UuICBFLmcuLCBzb21lIGZvbnRzIGhhdmUgcmVhbCBoaW50cyBhdAotICAgICAgICogICAgICAgODgwIGFuZCAtMTIwLgotICAgICAgICovCi0KLSAgICAgIGJsdWVzLT5lbUJveEJvdHRvbUVkZ2UuY3NDb29yZCA9IGVtQm94Qm90dG9tIC0gQ0YyX0ZJWEVEX0VQU0lMT047Ci0gICAgICBibHVlcy0+ZW1Cb3hCb3R0b21FZGdlLmRzQ29vcmQgPSBjZjJfZml4ZWRSb3VuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRml4KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWVzLT5lbUJveEJvdHRvbUVkZ2UuY3NDb29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVlcy0+c2NhbGUgKSApIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9NSU5fQ09VTlRFUjsKLSAgICAgIGJsdWVzLT5lbUJveEJvdHRvbUVkZ2Uuc2NhbGUgICA9IGJsdWVzLT5zY2FsZTsKLSAgICAgIGJsdWVzLT5lbUJveEJvdHRvbUVkZ2UuZmxhZ3MgICA9IENGMl9HaG9zdEJvdHRvbSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfTG9ja2VkIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9TeW50aGV0aWM7Ci0KLSAgICAgIGJsdWVzLT5lbUJveFRvcEVkZ2UuY3NDb29yZCA9IGVtQm94VG9wICsgQ0YyX0ZJWEVEX0VQU0lMT04gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIGZvbnQtPmRhcmtlblk7Ci0gICAgICBibHVlcy0+ZW1Cb3hUb3BFZGdlLmRzQ29vcmQgPSBjZjJfZml4ZWRSb3VuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRml4KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWVzLT5lbUJveFRvcEVkZ2UuY3NDb29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVlcy0+c2NhbGUgKSApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9NSU5fQ09VTlRFUjsKLSAgICAgIGJsdWVzLT5lbUJveFRvcEVkZ2Uuc2NhbGUgICA9IGJsdWVzLT5zY2FsZTsKLSAgICAgIGJsdWVzLT5lbUJveFRvcEVkZ2UuZmxhZ3MgICA9IENGMl9HaG9zdFRvcCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfTG9ja2VkIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9TeW50aGV0aWM7Ci0KLSAgICAgIGJsdWVzLT5kb0VtQm94SGludHMgPSBUUlVFOyAgICAvKiBlbmFibGUgdGhlIGhldXJpc3RpYyAqLwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogY29weSBgQmx1ZVZhbHVlcycgYW5kIGBPdGhlckJsdWVzJyB0byBhIGNvbWJpbmVkIGFycmF5IG9mIHRvcCBhbmQgKi8KLSAgICAvKiBib3R0b20gem9uZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtQmx1ZVZhbHVlczsgaSArPSAyICkKLSAgICB7Ci0gICAgICBibHVlcy0+em9uZVtibHVlcy0+Y291bnRdLmNzQm90dG9tRWRnZSA9Ci0gICAgICAgIGNmMl9ibHVlVG9GaXhlZCggYmx1ZVZhbHVlc1tpXSApOwotICAgICAgYmx1ZXMtPnpvbmVbYmx1ZXMtPmNvdW50XS5jc1RvcEVkZ2UgPQotICAgICAgICBjZjJfYmx1ZVRvRml4ZWQoIGJsdWVWYWx1ZXNbaSArIDFdICk7Ci0KLSAgICAgIHpvbmVIZWlnaHQgPSBibHVlcy0+em9uZVtibHVlcy0+Y291bnRdLmNzVG9wRWRnZSAtCi0gICAgICAgICAgICAgICAgICAgYmx1ZXMtPnpvbmVbYmx1ZXMtPmNvdW50XS5jc0JvdHRvbUVkZ2U7Ci0KLSAgICAgIGlmICggem9uZUhlaWdodCA8IDAgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTQoKCAiY2YyX2JsdWVzX2luaXQ6IGlnbm9yaW5nIG5lZ2F0aXZlIHpvbmUgaGVpZ2h0XG4iICkpOwotICAgICAgICBjb250aW51ZTsgICAvKiByZWplY3QgdGhpcyB6b25lICovCi0gICAgICB9Ci0KLSAgICAgIGlmICggem9uZUhlaWdodCA+IG1heFpvbmVIZWlnaHQgKQotICAgICAgewotICAgICAgICAvKiB0YWtlIG1heGltdW0gYmVmb3JlIGRhcmtlbmluZyBhZGp1c3RtZW50ICAgICAgKi8KLSAgICAgICAgLyogc28gb3ZlcnNob290IHN1cHByZXNzaW9uIHBvaW50IGRvZXNuJ3QgY2hhbmdlICovCi0gICAgICAgIG1heFpvbmVIZWlnaHQgPSB6b25lSGVpZ2h0OwotICAgICAgfQotCi0gICAgICAvKiBhZGp1c3QgYm90aCBlZGdlcyBvZiB0b3Agem9uZSB1cHdhcmQgYnkgdHdpY2UgZGFya2VuaW5nIGFtb3VudCAqLwotICAgICAgaWYgKCBpICE9IDAgKQotICAgICAgewotICAgICAgICBibHVlcy0+em9uZVtibHVlcy0+Y291bnRdLmNzVG9wRWRnZSAgICArPSAyICogZm9udC0+ZGFya2VuWTsKLSAgICAgICAgYmx1ZXMtPnpvbmVbYmx1ZXMtPmNvdW50XS5jc0JvdHRvbUVkZ2UgKz0gMiAqIGZvbnQtPmRhcmtlblk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGZpcnN0IGBCbHVlVmFsdWUnIGlzIGJvdHRvbSB6b25lOyBvdGhlcnMgYXJlIHRvcCAqLwotICAgICAgaWYgKCBpID09IDAgKQotICAgICAgewotICAgICAgICBibHVlcy0+em9uZVtibHVlcy0+Y291bnRdLmJvdHRvbVpvbmUgPQotICAgICAgICAgIFRSVUU7Ci0gICAgICAgIGJsdWVzLT56b25lW2JsdWVzLT5jb3VudF0uY3NGbGF0RWRnZSA9Ci0gICAgICAgICAgYmx1ZXMtPnpvbmVbYmx1ZXMtPmNvdW50XS5jc1RvcEVkZ2U7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJsdWVzLT56b25lW2JsdWVzLT5jb3VudF0uYm90dG9tWm9uZSA9Ci0gICAgICAgICAgRkFMU0U7Ci0gICAgICAgIGJsdWVzLT56b25lW2JsdWVzLT5jb3VudF0uY3NGbGF0RWRnZSA9Ci0gICAgICAgICAgYmx1ZXMtPnpvbmVbYmx1ZXMtPmNvdW50XS5jc0JvdHRvbUVkZ2U7Ci0gICAgICB9Ci0KLSAgICAgIGJsdWVzLT5jb3VudCArPSAxOwotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtT3RoZXJCbHVlczsgaSArPSAyICkKLSAgICB7Ci0gICAgICBibHVlcy0+em9uZVtibHVlcy0+Y291bnRdLmNzQm90dG9tRWRnZSA9Ci0gICAgICAgIGNmMl9ibHVlVG9GaXhlZCggb3RoZXJCbHVlc1tpXSApOwotICAgICAgYmx1ZXMtPnpvbmVbYmx1ZXMtPmNvdW50XS5jc1RvcEVkZ2UgPQotICAgICAgICBjZjJfYmx1ZVRvRml4ZWQoIG90aGVyQmx1ZXNbaSArIDFdICk7Ci0KLSAgICAgIHpvbmVIZWlnaHQgPSBibHVlcy0+em9uZVtibHVlcy0+Y291bnRdLmNzVG9wRWRnZSAtCi0gICAgICAgICAgICAgICAgICAgYmx1ZXMtPnpvbmVbYmx1ZXMtPmNvdW50XS5jc0JvdHRvbUVkZ2U7Ci0KLSAgICAgIGlmICggem9uZUhlaWdodCA8IDAgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTQoKCAiY2YyX2JsdWVzX2luaXQ6IGlnbm9yaW5nIG5lZ2F0aXZlIHpvbmUgaGVpZ2h0XG4iICkpOwotICAgICAgICBjb250aW51ZTsgICAvKiByZWplY3QgdGhpcyB6b25lICovCi0gICAgICB9Ci0KLSAgICAgIGlmICggem9uZUhlaWdodCA+IG1heFpvbmVIZWlnaHQgKQotICAgICAgewotICAgICAgICAvKiB0YWtlIG1heGltdW0gYmVmb3JlIGRhcmtlbmluZyBhZGp1c3RtZW50ICAgICAgKi8KLSAgICAgICAgLyogc28gb3ZlcnNob290IHN1cHByZXNzaW9uIHBvaW50IGRvZXNuJ3QgY2hhbmdlICovCi0gICAgICAgIG1heFpvbmVIZWlnaHQgPSB6b25lSGVpZ2h0OwotICAgICAgfQotCi0gICAgICAvKiBOb3RlOiBib3R0b20gem9uZXMgYXJlIG5vdCBhZGp1c3RlZCBmb3IgZGFya2VuaW5nIGFtb3VudCAqLwotCi0gICAgICAvKiBhbGwgT3RoZXJCbHVlcyBhcmUgYm90dG9tIHpvbmUgKi8KLSAgICAgIGJsdWVzLT56b25lW2JsdWVzLT5jb3VudF0uYm90dG9tWm9uZSA9Ci0gICAgICAgIFRSVUU7Ci0gICAgICBibHVlcy0+em9uZVtibHVlcy0+Y291bnRdLmNzRmxhdEVkZ2UgPQotICAgICAgICBibHVlcy0+em9uZVtibHVlcy0+Y291bnRdLmNzVG9wRWRnZTsKLQotICAgICAgYmx1ZXMtPmNvdW50ICs9IDE7Ci0gICAgfQotCi0gICAgLyogQWRqdXN0IGZvciBGYW1pbHlCbHVlcyAqLwotCi0gICAgLyogU2VhcmNoIGZvciB0aGUgbmVhcmVzdCBmbGF0IGVkZ2UgaW4gYEZhbWlseUJsdWVzJyBvciAgICAgICAgICAgICAgICAqLwotICAgIC8qIGBGYW1pbHlPdGhlckJsdWVzJy4gIEFjY29yZGluZyB0byB0aGUgQmxhY2sgQm9vaywgYW55IG1hdGNoaW5nIGVkZ2UgKi8KLSAgICAvKiBtdXN0IGJlIHdpdGhpbiBvbmUgZGV2aWNlIHBpeGVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBjc1VuaXRzUGVyUGl4ZWwgPSBGVF9EaXZGaXgoIGNmMl9pbnRUb0ZpeGVkKCAxICksIGJsdWVzLT5zY2FsZSApOwotCi0gICAgLyogbG9vcCBvbiBhbGwgem9uZXMgaW4gdGhpcyBmb250ICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBibHVlcy0+Y291bnQ7IGkrKyApCi0gICAgewotICAgICAgc2l6ZV90ICAgICBqOwotICAgICAgQ0YyX0ZpeGVkICBtaW5EaWZmOwotICAgICAgQ0YyX0ZpeGVkICBmbGF0RmFtaWx5RWRnZSwgZGlmZjsKLSAgICAgIC8qIHZhbHVlIGZvciB0aGlzIGZvbnQgKi8KLSAgICAgIENGMl9GaXhlZCAgZmxhdEVkZ2UgPSBibHVlcy0+em9uZVtpXS5jc0ZsYXRFZGdlOwotCi0KLSAgICAgIGlmICggYmx1ZXMtPnpvbmVbaV0uYm90dG9tWm9uZSApCi0gICAgICB7Ci0gICAgICAgIC8qIEluIGEgYm90dG9tIHpvbmUsIHRoZSB0b3AgZWRnZSBpcyB0aGUgZmxhdCBlZGdlLiAgICAgICAgICAgICAqLwotICAgICAgICAvKiBTZWFyY2ggYEZhbWlseU90aGVyQmx1ZXMnIGZvciBib3R0b20gem9uZXM7IGxvb2sgZm9yIGNsb3Nlc3QgKi8KLSAgICAgICAgLyogRmFtaWx5IGVkZ2UgdGhhdCBpcyB3aXRoaW4gdGhlIG9uZSBwaXhlbCB0aHJlc2hvbGQuICAgICAgICAgICovCi0KLSAgICAgICAgbWluRGlmZiA9IENGMl9GSVhFRF9NQVg7Ci0KLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBudW1GYW1pbHlPdGhlckJsdWVzOyBqICs9IDIgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogdG9wIGVkZ2UgKi8KLSAgICAgICAgICBmbGF0RmFtaWx5RWRnZSA9IGNmMl9ibHVlVG9GaXhlZCggZmFtaWx5T3RoZXJCbHVlc1tqICsgMV0gKTsKLQotICAgICAgICAgIGRpZmYgPSBjZjJfZml4ZWRBYnMoIGZsYXRFZGdlIC0gZmxhdEZhbWlseUVkZ2UgKTsKLQotICAgICAgICAgIGlmICggZGlmZiA8IG1pbkRpZmYgJiYgZGlmZiA8IGNzVW5pdHNQZXJQaXhlbCApCi0gICAgICAgICAgewotICAgICAgICAgICAgYmx1ZXMtPnpvbmVbaV0uY3NGbGF0RWRnZSA9IGZsYXRGYW1pbHlFZGdlOwotICAgICAgICAgICAgbWluRGlmZiAgICAgICAgICAgICAgICAgICA9IGRpZmY7Ci0KLSAgICAgICAgICAgIGlmICggZGlmZiA9PSAwICkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogY2hlY2sgdGhlIGZpcnN0IG1lbWJlciBvZiBGYW1pbHlCbHVlcywgd2hpY2ggaXMgYSBib3R0b20gem9uZSAqLwotICAgICAgICBpZiAoIG51bUZhbWlseUJsdWVzID49IDIgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogdG9wIGVkZ2UgKi8KLSAgICAgICAgICBmbGF0RmFtaWx5RWRnZSA9IGNmMl9ibHVlVG9GaXhlZCggZmFtaWx5Qmx1ZXNbMV0gKTsKLQotICAgICAgICAgIGRpZmYgPSBjZjJfZml4ZWRBYnMoIGZsYXRFZGdlIC0gZmxhdEZhbWlseUVkZ2UgKTsKLQotICAgICAgICAgIGlmICggZGlmZiA8IG1pbkRpZmYgJiYgZGlmZiA8IGNzVW5pdHNQZXJQaXhlbCApCi0gICAgICAgICAgICBibHVlcy0+em9uZVtpXS5jc0ZsYXRFZGdlID0gZmxhdEZhbWlseUVkZ2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogSW4gYSB0b3Agem9uZSwgdGhlIGJvdHRvbSBlZGdlIGlzIHRoZSBmbGF0IGVkZ2UuICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFNlYXJjaCBgRmFtaWx5Qmx1ZXMnIGZvciB0b3Agem9uZXM7IHNraXAgZmlyc3Qgem9uZSwgd2hpY2ggaXMgYSAqLwotICAgICAgICAvKiBib3R0b20gem9uZTsgbG9vayBmb3IgY2xvc2VzdCBGYW1pbHkgZWRnZSB0aGF0IGlzIHdpdGhpbiB0aGUgICAgKi8KLSAgICAgICAgLyogb25lIHBpeGVsIHRocmVzaG9sZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgbWluRGlmZiA9IENGMl9GSVhFRF9NQVg7Ci0KLSAgICAgICAgZm9yICggaiA9IDI7IGogPCBudW1GYW1pbHlCbHVlczsgaiArPSAyICkKLSAgICAgICAgewotICAgICAgICAgIC8qIGJvdHRvbSBlZGdlICovCi0gICAgICAgICAgZmxhdEZhbWlseUVkZ2UgPSBjZjJfYmx1ZVRvRml4ZWQoIGZhbWlseUJsdWVzW2pdICk7Ci0KLSAgICAgICAgICAvKiBhZGp1c3QgZWRnZXMgb2YgdG9wIHpvbmUgdXB3YXJkIGJ5IHR3aWNlIGRhcmtlbmluZyBhbW91bnQgKi8KLSAgICAgICAgICBmbGF0RmFtaWx5RWRnZSArPSAyICogZm9udC0+ZGFya2VuWTsgICAgICAvKiBib3R0b20gZWRnZSAqLwotCi0gICAgICAgICAgZGlmZiA9IGNmMl9maXhlZEFicyggZmxhdEVkZ2UgLSBmbGF0RmFtaWx5RWRnZSApOwotCi0gICAgICAgICAgaWYgKCBkaWZmIDwgbWluRGlmZiAmJiBkaWZmIDwgY3NVbml0c1BlclBpeGVsICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBibHVlcy0+em9uZVtpXS5jc0ZsYXRFZGdlID0gZmxhdEZhbWlseUVkZ2U7Ci0gICAgICAgICAgICBtaW5EaWZmICAgICAgICAgICAgICAgICAgID0gZGlmZjsKLQotICAgICAgICAgICAgaWYgKCBkaWZmID09IDAgKQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBUT0RPOiBlbmZvcmNlIHNlcGFyYXRpb24gb2Ygem9uZXMsIGluY2x1ZGluZyBCbHVlRnV6eiAqLwotCi0gICAgLyogQWRqdXN0IEJsdWVTY2FsZTsgc2ltaWxhciB0byBBZGp1c3RCbHVlU2NhbGUoKSBpbiBjb3JldHlwZSAqLwotICAgIC8qIGBiY3NldHVwLmMnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIGlmICggbWF4Wm9uZUhlaWdodCA+IDAgKQotICAgIHsKLSAgICAgIGlmICggYmx1ZXMtPmJsdWVTY2FsZSA+IEZUX0RpdkZpeCggY2YyX2ludFRvRml4ZWQoIDEgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Wm9uZUhlaWdodCApICkKLSAgICAgIHsKLSAgICAgICAgLyogY2xhbXAgYXQgbWF4aW11bSBzY2FsZSAqLwotICAgICAgICBibHVlcy0+Ymx1ZVNjYWxlID0gRlRfRGl2Rml4KCBjZjJfaW50VG9GaXhlZCggMSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhab25lSGVpZ2h0ICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qCi0gICAgICAgKiBUT0RPOiBSZXZpc2l0IHRoZSBidWcgZml4IGZvciA2MTM0NDguICBUaGUgbWluaW11bSBzY2FsZQotICAgICAgICogICAgICAgcmVxdWlyZW1lbnQgY2F0Y2hlcyBhIG51bWJlciBvZiBsaWJyYXJ5IGZvbnRzLiAgRm9yCi0gICAgICAgKiAgICAgICBleGFtcGxlLCB3aXRoIGRlZmF1bHQgQmx1ZVNjYWxlICguMDM5NjI1KSBhbmQgMC40IG1pbmltdW0sCi0gICAgICAgKiAgICAgICB0aGUgdGVzdCBiZWxvdyBjYXRjaGVzIGFueSBmb250IHdpdGggbWF4Wm9uZUhlaWdodCA8IDEwLjEuCi0gICAgICAgKiAgICAgICBUaGVyZSBhcmUgbGlicmFyeSBmb250cyByYW5naW5nIGZyb20gMiB0byAxMCB0aGF0IGdldAotICAgICAgICogICAgICAgY2F1Z2h0LCBpbmNsdWRpbmcgZS5nLiwgRXVyb3N0aWxlIExUIFN0ZCBNZWRpdW0gd2l0aAotICAgICAgICogICAgICAgbWF4Wm9uZUhlaWdodCBvZiA2LgotICAgICAgICoKLSAgICAgICAqLwotI2lmIDAKLSAgICAgIGlmICggYmx1ZVNjYWxlIDwgLjQgLyBtYXhab25lSGVpZ2h0ICkKLSAgICAgIHsKLSAgICAgICAgdGV0cmFwaGlsaWFfYXNzZXJ0KCAwICk7Ci0gICAgICAgIC8qIGNsYW1wIGF0IG1pbmltdW0gc2NhbGUsIHBlciBidWcgMDYxMzQ0OCBmaXggKi8KLSAgICAgICAgYmx1ZVNjYWxlID0gLjQgLyBtYXhab25lSGVpZ2h0OwotICAgICAgfQotI2VuZGlmCi0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFN1cHByZXNzIG92ZXJzaG9vdCBhbmQgYm9vc3QgYmx1ZSB6b25lcyBhdCBzbWFsbCBzaXplcy4gIEJvb3N0Ci0gICAgICogYW1vdW50IHZhcmllcyBsaW5lYXJseSBmcm9tIDAuNSBwaXhlbCBuZWFyIDAgdG8gMCBwaXhlbCBhdAotICAgICAqIGJsdWVTY2FsZSBjdXRvZmYuCi0gICAgICogTm90ZTogVGhpcyBib29zdCBhbW91bnQgaXMgZGlmZmVyZW50IGZyb20gdGhlIGNvcmV0eXBlIGhldXJpc3RpYy4KLSAgICAgKgotICAgICAqLwotCi0gICAgaWYgKCBibHVlcy0+c2NhbGUgPCBibHVlcy0+Ymx1ZVNjYWxlICkKLSAgICB7Ci0gICAgICBibHVlcy0+c3VwcHJlc3NPdmVyc2hvb3QgPSBUUlVFOwotCi0gICAgICAvKiBDaGFuZ2Ugcm91bmRpbmcgdGhyZXNob2xkIGZvciBgZHNGbGF0RWRnZScuICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogTm90ZTogY29uc3RhbnQgY2hhbmdlZCBmcm9tIDAuNSB0byAwLjYgdG8gYXZvaWQgYSBwcm9ibGVtIHdpdGggKi8KLSAgICAgIC8qICAgICAgIDEwcHBlbSBBcmlhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIGJsdWVzLT5ib29zdCA9IGNmMl9mbG9hdFRvRml4ZWQoIC42ICkgLQotICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxEaXYoIGNmMl9mbG9hdFRvRml4ZWQgKCAuNiApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWVzLT5zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVlcy0+Ymx1ZVNjYWxlICk7Ci0gICAgICBpZiAoIGJsdWVzLT5ib29zdCA+IDB4N0ZGRiApCi0gICAgICB7Ci0gICAgICAgIC8qIGJvb3N0IG11c3QgcmVtYWluIGxlc3MgdGhhbiAwLjUsIG9yIGJhc2VsaW5lIGNvdWxkIGdvIG5lZ2F0aXZlICovCi0gICAgICAgIGJsdWVzLT5ib29zdCA9IDB4N0ZGRjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBib29zdCBhbmQgZGFya2VuaW5nIGhhdmUgc2ltaWxhciBlZmZlY3RzOyBkb24ndCBkbyBib3RoICovCi0gICAgaWYgKCBmb250LT5zdGVtRGFya2VuZWQgKQotICAgICAgYmx1ZXMtPmJvb3N0ID0gMDsKLQotICAgIC8qIHNldCBkZXZpY2Ugc3BhY2UgYWxpZ25tZW50IGZvciBlYWNoIHpvbmU7ICAgICovCi0gICAgLyogYXBwbHkgYm9vc3QgYW1vdW50IGJlZm9yZSByb3VuZGluZyBmbGF0IGVkZ2UgKi8KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgYmx1ZXMtPmNvdW50OyBpKysgKQotICAgIHsKLSAgICAgIGlmICggYmx1ZXMtPnpvbmVbaV0uYm90dG9tWm9uZSApCi0gICAgICAgIGJsdWVzLT56b25lW2ldLmRzRmxhdEVkZ2UgPSBjZjJfZml4ZWRSb3VuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRml4KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWVzLT56b25lW2ldLmNzRmxhdEVkZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXMtPnNjYWxlICkgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVlcy0+Ym9vc3QgKTsKLSAgICAgIGVsc2UKLSAgICAgICAgYmx1ZXMtPnpvbmVbaV0uZHNGbGF0RWRnZSA9IGNmMl9maXhlZFJvdW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxGaXgoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZXMtPnpvbmVbaV0uY3NGbGF0RWRnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVlcy0+c2NhbGUgKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsdWVzLT5ib29zdCApOwotICAgIH0KLSAgfQotCi0KLSAgLyoKLSAgICogQ2hlY2sgd2hldGhlciBgc3RlbUhpbnQnIGlzIGNhcHR1cmVkIGJ5IG9uZSBvZiB0aGUgYmx1ZSB6b25lcy4KLSAgICoKLSAgICogWmVybywgb25lIG9yIGJvdGggZWRnZXMgbWF5IGJlIHZhbGlkOyBvbmx5IHZhbGlkIGVkZ2VzIGNhbiBiZQotICAgKiBjYXB0dXJlZC4gIEZvciBjb21wYXRpYmlsaXR5IHdpdGggQ29vbFR5cGUsIHNlYXJjaCB0b3AgYW5kIGJvdHRvbQotICAgKiB6b25lcyBpbiB0aGUgc2FtZSBwYXNzIChzZWUgYEJsdWVMb2NrJykuICBJZiBhIGhpbnQgaXMgY2FwdHVyZWQsCi0gICAqIHJldHVybiB0cnVlIGFuZCBwb3NpdGlvbiB0aGUgZWRnZShzKSBpbiBvbmUgb2YgMyB3YXlzOgotICAgKgotICAgKiAgMSkgSWYgYEJsdWVTY2FsZScgc3VwcHJlc3NlcyBvdmVyc2hvb3QsIHBvc2l0aW9uIHRoZSBjYXB0dXJlZCBlZGdlCi0gICAqICAgICBhdCB0aGUgZmxhdCBlZGdlIG9mIHRoZSB6b25lLgotICAgKiAgMikgSWYgb3ZlcnNob290IGlzIG5vdCBzdXBwcmVzc2VkIGFuZCBgQmx1ZVNoaWZ0JyByZXF1aXJlcwotICAgKiAgICAgb3ZlcnNob290LCBwb3NpdGlvbiB0aGUgY2FwdHVyZWQgZWRnZSBhIG1pbmltdW0gb2YgMSBkZXZpY2UgcGl4ZWwKLSAgICogICAgIGZyb20gdGhlIGZsYXQgZWRnZS4KLSAgICogIDMpIElmIG92ZXJzaG9vdCBpcyBub3Qgc3VwcHJlc3NlZCBvciByZXF1aXJlZCwgcG9zaXRpb24gdGhlIGNhcHR1cmVkCi0gICAqICAgICBlZGdlIGF0IHRoZSBuZWFyZXN0IGRldmljZSBwaXhlbC4KLSAgICoKLSAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfQm9vbCApCi0gIGNmMl9ibHVlc19jYXB0dXJlKCBjb25zdCBDRjJfQmx1ZXMgIGJsdWVzLAotICAgICAgICAgICAgICAgICAgICAgQ0YyX0hpbnQgICAgICAgICBib3R0b21IaW50RWRnZSwKLSAgICAgICAgICAgICAgICAgICAgIENGMl9IaW50ICAgICAgICAgdG9wSGludEVkZ2UgKQotICB7Ci0gICAgLyogVE9ETzogdmFsaWRhdGU/ICovCi0gICAgQ0YyX0ZpeGVkICBjc0Z1enogPSBibHVlcy0+Ymx1ZUZ1eno7Ci0KLSAgICAvKiBuZXcgcG9zaXRpb24gb2YgY2FwdHVyZWQgZWRnZSAqLwotICAgIENGMl9GaXhlZCAgZHNOZXc7Ci0KLSAgICAvKiBhbW91bnQgdGhhdCBoaW50IGlzIG1vdmVkIHdoZW4gcG9zaXRpb25lZCAqLwotICAgIENGMl9GaXhlZCAgZHNNb3ZlID0gMDsKLQotICAgIEZUX0Jvb2wgICBjYXB0dXJlZCA9IEZBTFNFOwotICAgIENGMl9VSW50ICBpOwotCi0KLSAgICAvKiBhc3NlcnQgZWRnZSBmbGFncyBhcmUgY29uc2lzdGVudCAqLwotICAgIEZUX0FTU0VSVCggIWNmMl9oaW50X2lzVG9wKCBib3R0b21IaW50RWRnZSApICYmCi0gICAgICAgICAgICAgICAhY2YyX2hpbnRfaXNCb3R0b20oIHRvcEhpbnRFZGdlICkgKTsKLQotICAgIC8qIFRPRE86IHNlYXJjaCBvbmNlIHdpdGhvdXQgYmx1ZSBmdXp6IGZvciBjb21wYXRpYmlsaXR5IHdpdGggY29yZXR5cGU/ICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBibHVlcy0+Y291bnQ7IGkrKyApCi0gICAgewotICAgICAgaWYgKCBibHVlcy0+em9uZVtpXS5ib3R0b21ab25lICAgICAgICAgICAmJgotICAgICAgICAgICBjZjJfaGludF9pc0JvdHRvbSggYm90dG9tSGludEVkZ2UgKSApCi0gICAgICB7Ci0gICAgICAgIGlmICggKCBibHVlcy0+em9uZVtpXS5jc0JvdHRvbUVkZ2UgLSBjc0Z1enogKSA8PQotICAgICAgICAgICAgICAgYm90dG9tSGludEVkZ2UtPmNzQ29vcmQgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICBib3R0b21IaW50RWRnZS0+Y3NDb29yZCA8PQotICAgICAgICAgICAgICAgKCBibHVlcy0+em9uZVtpXS5jc1RvcEVkZ2UgKyBjc0Z1enogKSAgICAgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogYm90dG9tIGVkZ2UgY2FwdHVyZWQgYnkgYm90dG9tIHpvbmUgKi8KLQotICAgICAgICAgIGlmICggYmx1ZXMtPnN1cHByZXNzT3ZlcnNob290ICkKLSAgICAgICAgICAgIGRzTmV3ID0gYmx1ZXMtPnpvbmVbaV0uZHNGbGF0RWRnZTsKLQotICAgICAgICAgIGVsc2UgaWYgKCAoIGJsdWVzLT56b25lW2ldLmNzVG9wRWRnZSAtIGJvdHRvbUhpbnRFZGdlLT5jc0Nvb3JkICkgPj0KLSAgICAgICAgICAgICAgICAgICAgICBibHVlcy0+Ymx1ZVNoaWZ0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBndWFyYW50ZWUgbWluaW11bSBvZiAxIHBpeGVsIG92ZXJzaG9vdCAqLwotICAgICAgICAgICAgZHNOZXcgPSBGVF9NSU4oCi0gICAgICAgICAgICAgICAgICAgICAgY2YyX2ZpeGVkUm91bmQoIGJvdHRvbUhpbnRFZGdlLT5kc0Nvb3JkICksCi0gICAgICAgICAgICAgICAgICAgICAgYmx1ZXMtPnpvbmVbaV0uZHNGbGF0RWRnZSAtIGNmMl9pbnRUb0ZpeGVkKCAxICkgKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogc2ltcGx5IHJvdW5kIGNhcHR1cmVkIGVkZ2UgKi8KLSAgICAgICAgICAgIGRzTmV3ID0gY2YyX2ZpeGVkUm91bmQoIGJvdHRvbUhpbnRFZGdlLT5kc0Nvb3JkICk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZHNNb3ZlICAgPSBkc05ldyAtIGJvdHRvbUhpbnRFZGdlLT5kc0Nvb3JkOwotICAgICAgICAgIGNhcHR1cmVkID0gVFJVRTsKLQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggIWJsdWVzLT56b25lW2ldLmJvdHRvbVpvbmUgJiYgY2YyX2hpbnRfaXNUb3AoIHRvcEhpbnRFZGdlICkgKQotICAgICAgewotICAgICAgICBpZiAoICggYmx1ZXMtPnpvbmVbaV0uY3NCb3R0b21FZGdlIC0gY3NGdXp6ICkgPD0KLSAgICAgICAgICAgICAgIHRvcEhpbnRFZGdlLT5jc0Nvb3JkICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgdG9wSGludEVkZ2UtPmNzQ29vcmQgPD0KLSAgICAgICAgICAgICAgICggYmx1ZXMtPnpvbmVbaV0uY3NUb3BFZGdlICsgY3NGdXp6ICkgICAgICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHRvcCBlZGdlIGNhcHR1cmVkIGJ5IHRvcCB6b25lICovCi0KLSAgICAgICAgICBpZiAoIGJsdWVzLT5zdXBwcmVzc092ZXJzaG9vdCApCi0gICAgICAgICAgICBkc05ldyA9IGJsdWVzLT56b25lW2ldLmRzRmxhdEVkZ2U7Ci0KLSAgICAgICAgICBlbHNlIGlmICggKCB0b3BIaW50RWRnZS0+Y3NDb29yZCAtIGJsdWVzLT56b25lW2ldLmNzQm90dG9tRWRnZSApID49Ci0gICAgICAgICAgICAgICAgICAgICAgYmx1ZXMtPmJsdWVTaGlmdCApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogZ3VhcmFudGVlIG1pbmltdW0gb2YgMSBwaXhlbCBvdmVyc2hvb3QgKi8KLSAgICAgICAgICAgIGRzTmV3ID0gRlRfTUFYKAotICAgICAgICAgICAgICAgICAgICAgIGNmMl9maXhlZFJvdW5kKCB0b3BIaW50RWRnZS0+ZHNDb29yZCApLAotICAgICAgICAgICAgICAgICAgICAgIGJsdWVzLT56b25lW2ldLmRzRmxhdEVkZ2UgKyBjZjJfaW50VG9GaXhlZCggMSApICk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIHNpbXBseSByb3VuZCBjYXB0dXJlZCBlZGdlICovCi0gICAgICAgICAgICBkc05ldyA9IGNmMl9maXhlZFJvdW5kKCB0b3BIaW50RWRnZS0+ZHNDb29yZCApOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGRzTW92ZSAgID0gZHNOZXcgLSB0b3BIaW50RWRnZS0+ZHNDb29yZDsKLSAgICAgICAgICBjYXB0dXJlZCA9IFRSVUU7Ci0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmICggY2FwdHVyZWQgKQotICAgIHsKLSAgICAgIC8qIG1vdmUgYm90aCBlZGdlcyBhbmQgZmxhZyB0aGVtIGBsb2NrZWQnICovCi0gICAgICBpZiAoIGNmMl9oaW50X2lzVmFsaWQoIGJvdHRvbUhpbnRFZGdlICkgKQotICAgICAgewotICAgICAgICBib3R0b21IaW50RWRnZS0+ZHNDb29yZCArPSBkc01vdmU7Ci0gICAgICAgIGNmMl9oaW50X2xvY2soIGJvdHRvbUhpbnRFZGdlICk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggY2YyX2hpbnRfaXNWYWxpZCggdG9wSGludEVkZ2UgKSApCi0gICAgICB7Ci0gICAgICAgIHRvcEhpbnRFZGdlLT5kc0Nvb3JkICs9IGRzTW92ZTsKLSAgICAgICAgY2YyX2hpbnRfbG9jayggdG9wSGludEVkZ2UgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gY2FwdHVyZWQ7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyYmx1ZXMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyYmx1ZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYzOGZjYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmJsdWVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2YyYmx1ZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFkb2JlJ3MgY29kZSBmb3IgaGFuZGxpbmcgQmx1ZSBab25lcyAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LTIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvciAgICAgICAqLwotLyogIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkICAgICAgKi8KLS8qICBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZSAgICovCi0vKiAgdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCAgICAqLwotLyogIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cyAgICovCi0vKiAgdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSAgICAqLwotLyogIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvciAgICAgKi8KLS8qICAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgICAgICAgICAgICAgICovCi0vKiAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCAgICAqLwotLyogIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kICAgICAgKi8KLS8qICBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgICovCi0vKiAgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgICAgICAqLwotLyogIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgICAgKi8KLS8qICBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMgICAgICAgICovCi0vKiAgc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgICAgICAqLwotLyogIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0ICAgKi8KLS8qICB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzICAgICovCi0vKiAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgICAqLwotLyogIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAgKi8KLS8qICB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgICAgKi8KLS8qICBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAgICAgICAgICAgICAgICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLCAgICAqLwotLyogIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoKLSAgICogQSBgQ0YyX0JsdWVzJyBvYmplY3Qgc3RvcmVzIHRoZSBibHVlIHpvbmVzIChob3Jpem9udGFsIGFsaWdubWVudAotICAgKiB6b25lcykgb2YgYSBmb250LiAgVGhlc2UgYXJlIHNwZWNpZmllZCBpbiB0aGUgQ0ZGIHByaXZhdGUgZGljdGlvbmFyeQotICAgKiBieSBgQmx1ZVZhbHVlcycsIGBPdGhlckJsdWVzJywgYEZhbWlseUJsdWVzJywgYW5kIGBGYW1pbHlPdGhlckJsdWVzJy4KLSAgICogRWFjaCB6b25lIGlzIGRlZmluZWQgYnkgYSB0b3AgYW5kIGJvdHRvbSBlZGdlIGluIGNoYXJhY3RlciBzcGFjZS4KLSAgICogRnVydGhlciwgZWFjaCB6b25lIGlzIGVpdGhlciBhIHRvcCB6b25lIG9yIGEgYm90dG9tIHpvbmUsIGFzIHJlY29yZGVkCi0gICAqIGJ5IGBib3R0b21ab25lJy4KLSAgICoKLSAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGBCbHVlVmFsdWVzJyBhbmQgYEZhbWlseUJsdWVzJyBpcyA3IGVhY2guCi0gICAqIEhvd2V2ZXIsIHRoZXNlIGFyZSBjb21iaW5lZCB0byBwcm9kdWNlIGEgdG90YWwgb2YgNyB6b25lcy4KLSAgICogU2ltaWxhcmx5LCB0aGUgbWF4aW11bSBudW1iZXIgb2YgYE90aGVyQmx1ZXMnIGFuZCBgRmFtaWx5T3RoZXJCbHVlcycKLSAgICogaXMgNSBhbmQgdGhlc2UgYXJlIGNvbWJpbmVkIHRvIHByb2R1Y2UgYW4gYWRkaXRpb25hbCA1IHpvbmVzLgotICAgKgotICAgKiBCbHVlIHpvbmVzIGFyZSB1c2VkIHRvIGBjYXB0dXJlJyBoaW50cyBhbmQgZm9yY2UgdGhlbSB0byBhIGNvbW1vbgotICAgKiBhbGlnbm1lbnQgcG9pbnQuICBUaGlzIGFsaWdubWVudCBpcyByZWNvcmRlZCBpbiBkZXZpY2Ugc3BhY2UgaW4KLSAgICogYGRzRmxhdEVkZ2UnLiAgRXhjZXB0IGZvciB0aGlzIHZhbHVlLCBhIGBDRjJfQmx1ZXMnIG9iamVjdCBjb3VsZCBiZQotICAgKiBjb25zdHJ1Y3RlZCBpbmRlcGVuZGVudGx5IG9mIHNjYWxpbmcuICBDb25zdHJ1Y3Rpb24gbWF5IG9jY3VyIG9uY2UKLSAgICogdGhlIG1hdHJpeCBpcyBrbm93bi4gIE90aGVyIGZlYXR1cmVzIGltcGxlbWVudGVkIGluIHRoZSBDYXB0dXJlCi0gICAqIG1ldGhvZCBhcmUgb3ZlcnNob290IHN1cHByZXNzaW9uLCBvdmVyc2hvb3QgZW5mb3JjZW1lbnQsIGFuZCBCbHVlCi0gICAqIEJvb3N0LgotICAgKgotICAgKiBDYXB0dXJlIGlzIGRldGVybWluZWQgYnkgYEJsdWVWYWx1ZXMnIGFuZCBgT3RoZXJCbHVlcycsIGJ1dCB0aGUKLSAgICogYWxpZ25tZW50IHBvaW50IG1heSBiZSBhZGp1c3RlZCB0byB0aGUgc2NhbGVkIGZsYXQgZWRnZSBvZgotICAgKiBgRmFtaWx5Qmx1ZXMnIG9yIGBGYW1pbHlPdGhlckJsdWVzJy4gIE5vIGFsaWdubWVudCBpcyBkb25lIHRvIHRoZQotICAgKiBjdXJ2ZWQgZWRnZSBvZiBhIHpvbmUuCi0gICAqCi0gICAqLwotCi0KLSNpZm5kZWYgX19DRjJCTFVFU19IX18KLSNkZWZpbmUgX19DRjJCTFVFU19IX18KLQotCi0jaW5jbHVkZSAiY2YyZ2x1ZS5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoKLSAgICogYENGMl9IaW50JyBpcyBzaGFyZWQgYnkgYGNmMmhpbnRzLmgnIGFuZAotICAgKiBgY2YyYmx1ZXMuaCcsIGJ1dCBgY2YyYmx1ZXMuaCcgZGVwZW5kcyBvbgotICAgKiBgY2YyaGludHMuaCcsIHNvIGRlZmluZSBpdCBoZXJlLiAgTm90ZTogVGhlIHR5cGVkZWYgaXMgaW4KLSAgICogYGNmMmdsdWUuaCcuCi0gICAqCi0gICAqLwotICBlbnVtCi0gIHsKLSAgICBDRjJfR2hvc3RCb3R0b20gPSAweDEsICAvKiBhIHNpbmdsZSBib3R0b20gZWRnZSAgICAgICAgICAgKi8KLSAgICBDRjJfR2hvc3RUb3AgICAgPSAweDIsICAvKiBhIHNpbmdsZSB0b3AgZWRnZSAgICAgICAgICAgICAgKi8KLSAgICBDRjJfUGFpckJvdHRvbSAgPSAweDQsICAvKiB0aGUgYm90dG9tIGVkZ2Ugb2YgYSBzdGVtIGhpbnQgKi8KLSAgICBDRjJfUGFpclRvcCAgICAgPSAweDgsICAvKiB0aGUgdG9wIGVkZ2Ugb2YgYSBzdGVtIGhpbnQgICAgKi8KLSAgICBDRjJfTG9ja2VkICAgICAgPSAweDEwLCAvKiB0aGlzIGVkZ2UgaGFzIGJlZW4gYWxpZ25lZCAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBieSBhIGJsdWUgem9uZSAgICAgICAgICAgICAgICAgKi8KLSAgICBDRjJfU3ludGhldGljICAgPSAweDIwICAvKiB0aGlzIGVkZ2Ugd2FzIHN5bnRoZXNpemVkICAgICAgKi8KLSAgfTsKLQotCi0gIC8qCi0gICAqIERlZmF1bHQgdmFsdWUgZm9yIE9TLzIgdHlwb0FzY2VuZGVyL0Rlc2NlbmRlciB3aGVuIHRoZWlyIGRpZmZlcmVuY2UKLSAgICogaXMgbm90IGVxdWFsIHRvIGB1bml0c1BlckVtJy4gIFRoZSBkZWZhdWx0IGlzIGJhc2VkIG9uIC0yNTAgYW5kIDExMDAKLSAgICogaW4gYENGMl9CbHVlcycsIGFzc3VtaW5nIDEwMDAgdW5pdHMgcGVyIGVtIGhlcmUuCi0gICAqCi0gICAqLwotICBlbnVtCi0gIHsKLSAgICBDRjJfSUNGX1RvcCAgICA9IGNmMl9pbnRUb0ZpeGVkKCAgODgwICksCi0gICAgQ0YyX0lDRl9Cb3R0b20gPSBjZjJfaW50VG9GaXhlZCggLTEyMCApCi0gIH07Ci0KLQotICAvKgotICAgKiBDb25zdGFudCB1c2VkIGZvciBoaW50IGFkanVzdG1lbnQgYW5kIGZvciBzeW50aGV0aWMgZW0gYm94IGhpbnQKLSAgICogcGxhY2VtZW50LgotICAgKi8KLSNkZWZpbmUgQ0YyX01JTl9DT1VOVEVSICBjZjJfZmxvYXRUb0ZpeGVkKCAwLjUgKQotCi0KLSAgLyogc2hhcmVkIHR5cGVkZWYgaXMgaW4gY2YyZ2x1ZS5oICovCi0gIHN0cnVjdCAgQ0YyX0hpbnRSZWNfCi0gIHsKLSAgICBDRjJfVUludCAgZmxhZ3M7ICAvKiBhdHRyaWJ1dGVzIG9mIHRoZSBlZGdlICAgICAgICAgICAgKi8KLSAgICBzaXplX3QgICAgaW5kZXg7ICAvKiBpbmRleCBpbiBvcmlnaW5hbCBzdGVtIGhpbnQgYXJyYXkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAvKiAoaWYgbm90IHN5bnRoZXRpYykgICAgICAgICAgICAgICAgKi8KLSAgICBDRjJfRml4ZWQgIGNzQ29vcmQ7Ci0gICAgQ0YyX0ZpeGVkICBkc0Nvb3JkOwotICAgIENGMl9GaXhlZCAgc2NhbGU7Ci0gIH07Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQ0YyX0JsdWVSZWNfCi0gIHsKLSAgICBDRjJfRml4ZWQgIGNzQm90dG9tRWRnZTsKLSAgICBDRjJfRml4ZWQgIGNzVG9wRWRnZTsKLSAgICBDRjJfRml4ZWQgIGNzRmxhdEVkZ2U7IC8qIG1heSBiZSBmcm9tIGVpdGhlciBsb2NhbCBvciBGYW1pbHkgem9uZXMgKi8KLSAgICBDRjJfRml4ZWQgIGRzRmxhdEVkZ2U7IC8qIHRvcCBlZGdlIG9mIGJvdHRvbSB6b25lIG9yIGJvdHRvbSBlZGdlICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9mIHRvcCB6b25lIChyb3VuZGVkKSAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9Cb29sICBib3R0b21ab25lOwotCi0gIH0gQ0YyX0JsdWVSZWM7Ci0KLQotICAvKiBtYXggdG90YWwgYmx1ZSB6b25lcyBpcyAxMiAqLwotICBlbnVtCi0gIHsKLSAgICBDRjJfTUFYX0JMVUVTICAgICAgPSA3LAotICAgIENGMl9NQVhfT1RIRVJCTFVFUyA9IDUKLSAgfTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDRjJfQmx1ZXNSZWNfCi0gIHsKLSAgICBDRjJfRml4ZWQgIHNjYWxlOwotICAgIENGMl9VSW50ICAgY291bnQ7Ci0gICAgRlRfQm9vbCAgICBzdXBwcmVzc092ZXJzaG9vdDsKLSAgICBGVF9Cb29sICAgIGRvRW1Cb3hIaW50czsKLQotICAgIENGMl9GaXhlZCAgYmx1ZVNjYWxlOwotICAgIENGMl9GaXhlZCAgYmx1ZVNoaWZ0OwotICAgIENGMl9GaXhlZCAgYmx1ZUZ1eno7Ci0KLSAgICBDRjJfRml4ZWQgIGJvb3N0OwotCi0gICAgQ0YyX0hpbnRSZWMgIGVtQm94VG9wRWRnZTsKLSAgICBDRjJfSGludFJlYyAgZW1Cb3hCb3R0b21FZGdlOwotCi0gICAgQ0YyX0JsdWVSZWMgIHpvbmVbQ0YyX01BWF9CTFVFUyArIENGMl9NQVhfT1RIRVJCTFVFU107Ci0KLSAgfSBDRjJfQmx1ZXNSZWMsICpDRjJfQmx1ZXM7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9ibHVlc19pbml0KCBDRjJfQmx1ZXMgIGJsdWVzLAotICAgICAgICAgICAgICAgICAgQ0YyX0ZvbnQgICBmb250ICk7Ci0gIEZUX0xPQ0FMKCBGVF9Cb29sICkKLSAgY2YyX2JsdWVzX2NhcHR1cmUoIGNvbnN0IENGMl9CbHVlcyAgYmx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICBDRjJfSGludCAgICAgICAgIGJvdHRvbUhpbnRFZGdlLAotICAgICAgICAgICAgICAgICAgICAgQ0YyX0hpbnQgICAgICAgICB0b3BIaW50RWRnZSApOwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19DRjJCTFVFU19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyZXJyb3IuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyZXJyb3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1OTVhMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmVycm9yLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZjJlcnJvci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBlcnJvciBoYW5kbGluZyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYtMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImNmMmZ0LmgiCi0jaW5jbHVkZSAiY2YyZXJyb3IuaCIKLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9zZXRFcnJvciggRlRfRXJyb3IqICBlcnJvciwKLSAgICAgICAgICAgICAgICBGVF9FcnJvciAgIHZhbHVlICkKLSAgewotICAgIGlmICggZXJyb3IgJiYgKmVycm9yID09IDAgKQotICAgICAgKmVycm9yID0gdmFsdWU7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyZXJyb3IuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyZXJyb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ1M2ViYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmVycm9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2YyZXJyb3IuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFkb2JlJ3MgY29kZSBmb3IgZXJyb3IgaGFuZGxpbmcgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2LTIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvciAgICAgICAqLwotLyogIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkICAgICAgKi8KLS8qICBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZSAgICovCi0vKiAgdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCAgICAqLwotLyogIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cyAgICovCi0vKiAgdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSAgICAqLwotLyogIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvciAgICAgKi8KLS8qICAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgICAgICAgICAgICAgICovCi0vKiAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCAgICAqLwotLyogIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kICAgICAgKi8KLS8qICBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgICovCi0vKiAgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgICAgICAqLwotLyogIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgICAgKi8KLS8qICBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMgICAgICAgICovCi0vKiAgc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgICAgICAqLwotLyogIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0ICAgKi8KLS8qICB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzICAgICovCi0vKiAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgICAqLwotLyogIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAgKi8KLS8qICB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgICAgKi8KLS8qICBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAgICAgICAgICAgICAgICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLCAgICAqLwotLyogIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19DRjJFUlJPUl9IX18KLSNkZWZpbmUgX19DRjJFUlJPUl9IX18KLQotCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKLQotI3VuZGVmIF9fRlRFUlJPUlNfSF9fCi0KLSN1bmRlZiAgRlRfRVJSX1BSRUZJWAotI2RlZmluZSBGVF9FUlJfUFJFRklYICBDRjJfRXJyXwotI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX0NGMgotCi0KLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0jaW5jbHVkZSAiY2YyZnQuaCIKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qCi0gICAqIEEgcG9vci1tYW4gZXJyb3IgZmFjaWxpdHkuCi0gICAqCi0gICAqIFRoaXMgY29kZSBiZWluZyB3cml0dGVuIGluIHZhbmlsbGEgQywgZG9lc24ndCBoYXZlIHRoZSBsdXh1cnkgb2YgYQotICAgKiBsYW5ndWFnZS1zdXBwb3J0ZWQgZXhjZXB0aW9uIG1lY2hhbmlzbSBzdWNoIGFzIHRoZSBvbmUgYXZhaWxhYmxlIGluCi0gICAqIEphdmEuICBJbnN0ZWFkLCB3ZSBhcmUgc3R1Y2sgd2l0aCB1c2luZyBlcnJvciBjb2RlcyB0aGF0IG11c3QgYmUKLSAgICogY2FyZWZ1bGx5IG1hbmFnZWQgYW5kIHByZXNlcnZlZC4gIEhvd2V2ZXIsIGl0IGlzIGNvbnZlbmllbnQgZm9yIHVzIHRvCi0gICAqIG1vZGVsIG91ciBlcnJvciBtZWNoYW5pc20gb24gYSBKYXZhLWxpa2UgZXhjZXB0aW9uIG1lY2hhbmlzbS4KLSAgICogV2hlbiB3ZSBhc3NpZ24gYW4gZXJyb3IgY29kZSB3ZSBhcmUgdGh1cyBgdGhyb3dpbmcnIGFuIGVycm9yLgotICAgKgotICAgKiBUaGUgcGVyc2VydmF0aW9uIG9mIGFuIGVycm9yIGNvZGUgaXMgZG9uZSBieSBjb2RpbmcgY29udmVudGlvbi4KLSAgICogVXBvbiBhIGZ1bmN0aW9uIGNhbGwgaWYgdGhlIGVycm9yIGNvZGUgaXMgYW55dGhpbmcgb3RoZXIgdGhhbgotICAgKiBgRlRfRXJyX09rJywgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSB6ZXJvLCB3ZQotICAgKiB3aWxsIHJldHVybiB3aXRob3V0IGFsdGVyaW5nIHRoYXQgZXJyb3IuICBUaGlzIHdpbGwgYWxsb3cgdGhlCi0gICAqIGVycm9yIHRvIHByb3BvZ2F0ZSBhbmQgYmUgaGFuZGxlZCBhdCB0aGUgYXBwcm9wcmlhdGUgbG9jYXRpb24gaW4KLSAgICogdGhlIGNvZGUuCi0gICAqCi0gICAqIFRoaXMgYWxsb3dzIGEgc3R5bGUgb2YgY29kZSB3aGVyZSB0aGUgZXJyb3IgY29kZSBpcyBpbml0aWFsaXplZAotICAgKiB1cCBmcm9udCBhbmQgYSBibG9jayBvZiBjYWxscyBhcmUgbWFkZSB3aXRoIHRoZSBlcnJvciBjb2RlIG9ubHkKLSAgICogYmVpbmcgY2hlY2tlZCBhZnRlciB0aGUgYmxvY2suICBJZiBhIG5ldyBlcnJvciBvY2N1cnMsIHRoZSBvcmlnaW5hbAotICAgKiBlcnJvciB3aWxsIGJlIHByZXNlcnZlZCBhbmQgYSBmdW5jdGlvbmFsIG5vLW9wIHNob3VsZCByZXN1bHQgaW4gYW55Ci0gICAqIHN1YnNlcXVlbnQgZnVuY3Rpb24gdGhhdCBoYXMgYW4gaW5pdGlhbCBlcnJvciBjb2RlIG5vdCBlcXVhbCB0bwotICAgKiBgRlRfRXJyX09rJy4KLSAgICoKLSAgICogRXJyb3JzIGFyZSBlbmNvZGVkIGJ5IGNhbGxpbmcgdGhlIGBGVF9USFJPVycgbWFjcm8uICBGb3IgZXhhbXBsZSwKLSAgICoKLSAgICogewotICAgKiAgIEZUX0Vycm9yICBlOwotICAgKgotICAgKgotICAgKiAgIC4uLgotICAgKiAgIGUgPSBGVF9USFJPVyggT3V0X09mX01lbW9yeSApOwotICAgKiB9Ci0gICAqCi0gICAqLwotCi0KLSAgLyogU2V0IGVycm9yIGNvZGUgdG8gYSBwYXJ0aWN1bGFyIHZhbHVlLiAqLwotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9zZXRFcnJvciggRlRfRXJyb3IqICBlcnJvciwKLSAgICAgICAgICAgICAgICBGVF9FcnJvciAgIHZhbHVlICk7Ci0KLQotICAvKgotICAgKiBBIG1hY3JvIHRoYXQgY29uZGl0aW9uYWxseSBzZXRzIGFuIGVycm9yIGNvZGUuCi0gICAqCi0gICAqIFRoaXMgbWFjcm8gd2lsbCBmaXJzdCBjaGVjayB3aGV0aGVyIGBlcnJvcicgaXMgc2V0OwotICAgKiBpZiBub3QsIGl0IHdpbGwgc2V0IGl0IHRvIGBlJy4KLSAgICoKLSAgKi8KLSNkZWZpbmUgQ0YyX1NFVF9FUlJPUiggZXJyb3IsIGUgKSAgICAgICAgICAgICAgXAotICAgICAgICAgIGNmMl9zZXRFcnJvciggZXJyb3IsIEZUX1RIUk9XKCBlICkgKQotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19DRjJFUlJPUl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyZml4ZWQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyZml4ZWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkOWZhZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmZpeGVkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZjJmaXhlZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBGaXhlZCBQb2ludCBNYXRoZW1hdGljcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0NGMkZJWEVEX0hfXwotI2RlZmluZSBfX0NGMkZJWEVEX0hfXwotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyogcmFzdGVyaXplciBpbnRlZ2VyIGFuZCBmaXhlZCBwb2ludCBhcml0aG1ldGljIG11c3QgYmUgMzItYml0ICovCi0KLSNkZWZpbmUgICBDRjJfRml4ZWQgIENGMl9GMTZEb3QxNgotICB0eXBlZGVmIEZUX0ludDMyICAgQ0YyX0ZyYWM7ICAgLyogMi4zMCBmaXhlZCBwb2ludCAqLwotCi0KLSNkZWZpbmUgQ0YyX0ZJWEVEX01BWCAgICAgICggKENGMl9GaXhlZCkweDdGRkZGRkZGTCApCi0jZGVmaW5lIENGMl9GSVhFRF9NSU4gICAgICAoIChDRjJfRml4ZWQpMHg4MDAwMDAwMEwgKQotI2RlZmluZSBDRjJfRklYRURfT05FICAgICAgMHgxMDAwMEwKLSNkZWZpbmUgQ0YyX0ZJWEVEX0VQU0lMT04gIDB4MDAwMQotCi0gIC8qIGluIEMgODksIGxlZnQgYW5kIHJpZ2h0IHNoaWZ0IG9mIG5lZ2F0aXZlIG51bWJlcnMgaXMgICovCi0gIC8qIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGJlaGF2aW91ciBpbiB0aGUgZ2VuZXJhbCBjYXNlICovCi0KLSNkZWZpbmUgY2YyX2ludFRvRml4ZWQoIGkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoQ0YyX0ZpeGVkKSggKEZUX1VJbnQzMikoaSkgPDwgMTYgKSApCi0jZGVmaW5lIGNmMl9maXhlZFRvSW50KCB4ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKEZUX1Nob3J0KSggKCAoRlRfVUludDMyKSh4KSArIDB4ODAwMFUgKSA+PiAxNiApICkKLSNkZWZpbmUgY2YyX2ZpeGVkUm91bmQoIHggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoQ0YyX0ZpeGVkKSggKCAoRlRfVUludDMyKSh4KSArIDB4ODAwMFUgKSAmIDB4RkZGRjAwMDBVTCApICkKLSNkZWZpbmUgY2YyX2Zsb2F0VG9GaXhlZCggZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoQ0YyX0ZpeGVkKSggKGYpICogNjU1MzYuMCArIDAuNSApICkKLSNkZWZpbmUgY2YyX2ZpeGVkQWJzKCB4ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoeCkgPCAwID8gLSh4KSA6ICh4KSApCi0jZGVmaW5lIGNmMl9maXhlZEZsb29yKCB4ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKENGMl9GaXhlZCkoIChGVF9VSW50MzIpKHgpICYgMHhGRkZGMDAwMFVMICkgKQotI2RlZmluZSBjZjJfZml4ZWRGcmFjdGlvbiggeCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoICh4KSAtIGNmMl9maXhlZEZsb29yKCB4ICkgKQotI2RlZmluZSBjZjJfZnJhY1RvRml4ZWQoIHggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoICh4KSA8IDAgPyAtKCAoIC0oeCkgKyAweDIwMDAgKSA+PiAxNCApICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgIDogICggKCAgKHgpICsgMHgyMDAwICkgPj4gMTQgKSApCi0KLQotICAvKiBzaWduZWQgbnVtZXJpYyB0eXBlcyAqLwotICB0eXBlZGVmIGVudW0gIENGMl9OdW1iZXJUeXBlXwotICB7Ci0gICAgQ0YyX051bWJlckZpeGVkLCAgICAvKiAxNi4xNiAqLwotICAgIENGMl9OdW1iZXJGcmFjLCAgICAgLyogIDIuMzAgKi8KLSAgICBDRjJfTnVtYmVySW50ICAgICAgIC8qIDMyLjAgICovCi0KLSAgfSBDRjJfTnVtYmVyVHlwZTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qICBfX0NGMkZJWEVEX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJmb250LmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmZvbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNmZDM0OC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmZvbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDUxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZjJmb250LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBmb250IGluc3RhbmNlcyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxNCBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLQotI2luY2x1ZGUgImNmMmZ0LmgiCi0KLSNpbmNsdWRlICJjZjJnbHVlLmgiCi0jaW5jbHVkZSAiY2YyZm9udC5oIgotI2luY2x1ZGUgImNmMmVycm9yLmgiCi0jaW5jbHVkZSAiY2YyaW50cnAuaCIKLQotCi0gIC8qIENvbXB1dGUgYSBzdGVtIGRhcmtlbmluZyBhbW91bnQgaW4gY2hhcmFjdGVyIHNwYWNlLiAqLwotICBzdGF0aWMgdm9pZAotICBjZjJfY29tcHV0ZURhcmtlbmluZyggQ0YyX0ZpeGVkICAgZW1SYXRpbywKLSAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgIHBwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICBzdGVtV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQqICBkYXJrZW5BbW91bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICBib2xkZW5BbW91bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICBzdGVtRGFya2VuZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQqICAgICBkYXJrZW5QYXJhbXMgKQotICB7Ci0gICAgLyoKLSAgICAgKiBUb3RhbCBkYXJrZW5pbmcgYW1vdW50IGlzIGNvbXB1dGVkIGluIDEwMDAgdW5pdCBjaGFyYWN0ZXIgc3BhY2UKLSAgICAgKiB1c2luZyB0aGUgbW9kaWZpZWQgNSBwYXJ0IGN1cnZlIGFzIEFkb2JlJ3MgQXZhbG9uIHJhc3Rlcml6ZXIuCi0gICAgICogVGhlIGRhcmtlbmluZyBhbW91bnQgaXMgc21hbGxlciBmb3IgdGhpY2tlciBzdGVtcy4KLSAgICAgKiBJdCBiZWNvbWVzIHplcm8gd2hlbiB0aGUgc3RlbSBpcyB0aGlja2VyIHRoYW4gMi4zMzMgcGl4ZWxzLgotICAgICAqCi0gICAgICogQnkgZGVmYXVsdCwgd2UgdXNlCi0gICAgICoKLSAgICAgKiAgIGRhcmtlbkFtb3VudCA9IDAuNCBwaXhlbHMgICBpZiBzY2FsZWRTdGVtIDw9IDAuNSBwaXhlbHMsCi0gICAgICogICBkYXJrZW5BbW91bnQgPSAwLjI3NSBwaXhlbHMgaWYgMSA8PSBzY2FsZWRTdGVtIDw9IDEuNjY3IHBpeGVscywKLSAgICAgKiAgIGRhcmtlbkFtb3VudCA9IDAgcGl4ZWwgICAgICBpZiBzY2FsZWRTdGVtID49IDIuMzMzIHBpeGVscywKLSAgICAgKgotICAgICAqIGFuZCBwaWVjZXdpc2UgbGluZWFyIGluLWJldHdlZW46Ci0gICAgICoKLSAgICAgKgotICAgICAqICAgZGFya2VuaW5nCi0gICAgICogICAgICAgXgotICAgICAqICAgICAgIHwKLSAgICAgKiAgICAgICB8ICAgICAgKHgxLHkxKQotICAgICAqICAgICAgIHwtLS0tLS0tLSsKLSAgICAgKiAgICAgICB8ICAgICAgICAgXAotICAgICAqICAgICAgIHwgICAgICAgICAgXAotICAgICAqICAgICAgIHwgICAgICAgICAgIFwgICAgICAgICAgKHgzLHkzKQotICAgICAqICAgICAgIHwgICAgICAgICAgICArLS0tLS0tLS0tLSsKLSAgICAgKiAgICAgICB8ICAgICAgICAoeDIseTIpICAgICAgICAgXAotICAgICAqICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAqICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgKiAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICogICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAoeDQseTQpCi0gICAgICogICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gICBzdGVtCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpY2tuZXNzCi0gICAgICoKLSAgICAgKgotICAgICAqIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIHRoZQotICAgICAqIGBkYXJrZW5pbmctcGFyYW1ldGVycycgcHJvcGVydHk6Ci0gICAgICoKLSAgICAgKiAgICh4MSwgeTEpID0gKDUwMCwgNDAwKQotICAgICAqICAgKHgyLCB5MikgPSAoMTAwMCwgMjc1KQotICAgICAqICAgKHgzLCB5MykgPSAoMTY2NywgMjc1KQotICAgICAqICAgKHg0LCB5NCkgPSAoMjMzMywgMCkKLSAgICAgKgotICAgICAqLwotCi0gICAgLyogSW50ZXJuYWwgY2FsY3VsYXRpb25zIGFyZSBkb25lIGluIHVuaXRzIHBlciB0aG91c2FuZCBmb3IgKi8KLSAgICAvKiBjb252ZW5pZW5jZS4gVGhlIHggYXhpcyBpcyBzY2FsZWQgc3RlbSB3aWR0aCBpbiAgICAgICAgICAqLwotICAgIC8qIHRob3VzYW5kdGhzIG9mIGEgcGl4ZWwuIFRoYXQgaXMsIDEwMDAgaXMgMSBwaXhlbC4gICAgICAgICovCi0gICAgLyogVGhlIHkgYXhpcyBpcyBkYXJrZW5pbmcgYW1vdW50IGluIHRob3VzYW5kdGhzIG9mIGEgcGl4ZWwuKi8KLSAgICAvKiBJbiB0aGUgY29kZSwgYmVsb3csIGRpdmlkaW5nIGJ5IHBwZW0gYW5kICAgICAgICAgICAgICAgICAqLwotICAgIC8qIGFkanVzdGluZyBmb3IgZW1SYXRpbyBjb252ZXJ0cyBkYXJrZW5BbW91bnQgdG8gY2hhcmFjdGVyICovCi0gICAgLyogc3BhY2UgKGZvbnQgdW5pdHMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBDRjJfRml4ZWQgIHN0ZW1XaWR0aFBlcjEwMDAsIHNjYWxlZFN0ZW07Ci0gICAgRlRfSW50ICAgICBsb2dCYXNlMjsKLQotCi0gICAgKmRhcmtlbkFtb3VudCA9IDA7Ci0KLSAgICBpZiAoIGJvbGRlbkFtb3VudCA9PSAwICYmICFzdGVtRGFya2VuZWQgKQotICAgICAgcmV0dXJuOwotCi0gICAgLyogcHJvdGVjdCBhZ2FpbnN0IHJhbmdlIHByb2JsZW1zIGFuZCBkaXZpZGUgYnkgemVybyAqLwotICAgIGlmICggZW1SYXRpbyA8IGNmMl9mbG9hdFRvRml4ZWQoIC4wMSApICkKLSAgICAgIHJldHVybjsKLQotICAgIGlmICggc3RlbURhcmtlbmVkICkKLSAgICB7Ci0gICAgICBGVF9JbnQgIHgxID0gZGFya2VuUGFyYW1zWzBdOwotICAgICAgRlRfSW50ICB5MSA9IGRhcmtlblBhcmFtc1sxXTsKLSAgICAgIEZUX0ludCAgeDIgPSBkYXJrZW5QYXJhbXNbMl07Ci0gICAgICBGVF9JbnQgIHkyID0gZGFya2VuUGFyYW1zWzNdOwotICAgICAgRlRfSW50ICB4MyA9IGRhcmtlblBhcmFtc1s0XTsKLSAgICAgIEZUX0ludCAgeTMgPSBkYXJrZW5QYXJhbXNbNV07Ci0gICAgICBGVF9JbnQgIHg0ID0gZGFya2VuUGFyYW1zWzZdOwotICAgICAgRlRfSW50ICB5NCA9IGRhcmtlblBhcmFtc1s3XTsKLQotCi0gICAgICAvKiBjb252ZXJ0IGZyb20gdHJ1ZSBjaGFyYWN0ZXIgc3BhY2UgdG8gMTAwMCB1bml0IGNoYXJhY3RlciBzcGFjZTsgKi8KLSAgICAgIC8qIGFkZCBzeW50aGV0aWMgZW1ib2xkZW5pbmcgZWZmZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAvKiBgc3RlbVdpZHRoUGVyMTAwMCcgd2lsbCBub3Qgb3ZlcmZsb3cgZm9yIGEgbGVnaXRpbWF0ZSBmb250ICAgICAgKi8KLQotICAgICAgc3RlbVdpZHRoUGVyMTAwMCA9IEZUX011bEZpeCggc3RlbVdpZHRoICsgYm9sZGVuQW1vdW50LCBlbVJhdGlvICk7Ci0KLSAgICAgIC8qIGBzY2FsZWRTdGVtJyBjYW4gZWFzaWx5IG92ZXJmbG93LCBzbyB3ZSBtdXN0IGNsYW1wIGl0cyBtYXhpbXVtICAqLwotICAgICAgLyogdmFsdWU7IHRoZSB0ZXN0IGRvZXNuJ3QgbmVlZCB0byBiZSBwcmVjaXNlLCBidXQgbXVzdCBiZSAgICAgICAgICovCi0gICAgICAvKiBjb25zZXJ2YXRpdmUuICBUaGUgY2xhbXAgdmFsdWUgKGRlZmF1bHQgMjMzMykgd2hlcmUgICAgICAgICAgICAgKi8KLSAgICAgIC8qIGBkYXJrZW5BbW91bnQnIGlzIHplcm8gaXMgd2VsbCBiZWxvdyB0aGUgb3ZlcmZsb3cgdmFsdWUgb2YgICAgICAqLwotICAgICAgLyogMzI3NjcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIEZUX01TQiBjb21wdXRlcyB0aGUgaW50ZWdlciBwYXJ0IG9mIHRoZSBiYXNlIDIgbG9nYXJpdGhtLiAgVGhlICAqLwotICAgICAgLyogbnVtYmVyIG9mIGJpdHMgZm9yIHRoZSBwcm9kdWN0IGlzIDEgb3IgMiBtb3JlIHRoYW4gdGhlIHN1bSBvZiAgICovCi0gICAgICAvKiBsb2dhcml0aG1zOyByZW1lbWJlcmluZyB0aGF0IHRoZSAxNiBsb3dlc3QgYml0cyBvZiB0aGUgZnJhY3Rpb24gKi8KLSAgICAgIC8qIGFyZSBkcm9wcGVkIHRoaXMgaXMgY29ycmVjdCB0byB3aXRoaW4gYSBmYWN0b3Igb2YgYWxtb3N0IDQuICAgICAqLwotICAgICAgLyogRm9yIGV4YW1wbGUsIDB4ODAuMDAwMCAqIDB4ODAuMDAwMCA9IDB4NDAwMC4wMDAwIGlzIDIzKzIzIGFuZCAgICovCi0gICAgICAvKiBpcyBmbGFnZ2VkIGFzIHBvc3NpYmxlIG92ZXJmbG93IGJlY2F1c2UgMHhGRi5GRkZGICogMHhGRi5GRkZGID0gKi8KLSAgICAgIC8qIDB4RkZGRi5GRTAwIGlzIGFsc28gMjMrMjMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBsb2dCYXNlMiA9IEZUX01TQiggKEZUX1VJbnQzMilzdGVtV2lkdGhQZXIxMDAwICkgKwotICAgICAgICAgICAgICAgICAgIEZUX01TQiggKEZUX1VJbnQzMilwcGVtICk7Ci0KLSAgICAgIGlmICggbG9nQmFzZTIgPj0gNDYgKQotICAgICAgICAvKiBwb3NzaWJsZSBvdmVyZmxvdyAqLwotICAgICAgICBzY2FsZWRTdGVtID0gY2YyX2ludFRvRml4ZWQoIHg0ICk7Ci0gICAgICBlbHNlCi0gICAgICAgIHNjYWxlZFN0ZW0gPSBGVF9NdWxGaXgoIHN0ZW1XaWR0aFBlcjEwMDAsIHBwZW0gKTsKLQotICAgICAgLyogbm93IGFwcGx5IHRoZSBkYXJrZW5pbmcgcGFyYW1ldGVycyAqLwotCi0gICAgICBpZiAoIHNjYWxlZFN0ZW0gPCBjZjJfaW50VG9GaXhlZCggeDEgKSApCi0gICAgICAgICpkYXJrZW5BbW91bnQgPSBGVF9EaXZGaXgoIGNmMl9pbnRUb0ZpeGVkKCB5MSApLCBwcGVtICk7Ci0KLSAgICAgIGVsc2UgaWYgKCBzY2FsZWRTdGVtIDwgY2YyX2ludFRvRml4ZWQoIHgyICkgKQotICAgICAgewotICAgICAgICBGVF9JbnQgIHhkZWx0YSA9IHgyIC0geDE7Ci0gICAgICAgIEZUX0ludCAgeWRlbHRhID0geTIgLSB5MTsKLSAgICAgICAgRlRfSW50ICB4ICAgICAgPSBzdGVtV2lkdGhQZXIxMDAwIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RpdkZpeCggY2YyX2ludFRvRml4ZWQoIHgxICksIHBwZW0gKTsKLQotCi0gICAgICAgIGlmICggIXhkZWx0YSApCi0gICAgICAgICAgZ290byBUcnlfeDM7Ci0KLSAgICAgICAgKmRhcmtlbkFtb3VudCA9IEZUX011bERpdiggeCwgeWRlbHRhLCB4ZGVsdGEgKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RpdkZpeCggY2YyX2ludFRvRml4ZWQoIHkxICksIHBwZW0gKTsKLSAgICAgIH0KLQotICAgICAgZWxzZSBpZiAoIHNjYWxlZFN0ZW0gPCBjZjJfaW50VG9GaXhlZCggeDMgKSApCi0gICAgICB7Ci0gICAgICBUcnlfeDM6Ci0gICAgICAgIHsKLSAgICAgICAgICBGVF9JbnQgIHhkZWx0YSA9IHgzIC0geDI7Ci0gICAgICAgICAgRlRfSW50ICB5ZGVsdGEgPSB5MyAtIHkyOwotICAgICAgICAgIEZUX0ludCAgeCAgICAgID0gc3RlbVdpZHRoUGVyMTAwMCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RpdkZpeCggY2YyX2ludFRvRml4ZWQoIHgyICksIHBwZW0gKTsKLQotCi0gICAgICAgICAgaWYgKCAheGRlbHRhICkKLSAgICAgICAgICAgIGdvdG8gVHJ5X3g0OwotCi0gICAgICAgICAgKmRhcmtlbkFtb3VudCA9IEZUX011bERpdiggeCwgeWRlbHRhLCB4ZGVsdGEgKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRGl2Rml4KCBjZjJfaW50VG9GaXhlZCggeTIgKSwgcHBlbSApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKCBzY2FsZWRTdGVtIDwgY2YyX2ludFRvRml4ZWQoIHg0ICkgKQotICAgICAgewotICAgICAgVHJ5X3g0OgotICAgICAgICB7Ci0gICAgICAgICAgRlRfSW50ICB4ZGVsdGEgPSB4NCAtIHgzOwotICAgICAgICAgIEZUX0ludCAgeWRlbHRhID0geTQgLSB5MzsKLSAgICAgICAgICBGVF9JbnQgIHggICAgICA9IHN0ZW1XaWR0aFBlcjEwMDAgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9EaXZGaXgoIGNmMl9pbnRUb0ZpeGVkKCB4MyApLCBwcGVtICk7Ci0KLQotICAgICAgICAgIGlmICggIXhkZWx0YSApCi0gICAgICAgICAgICBnb3RvIFVzZV95NDsKLQotICAgICAgICAgICpkYXJrZW5BbW91bnQgPSBGVF9NdWxEaXYoIHgsIHlkZWx0YSwgeGRlbHRhICkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RpdkZpeCggY2YyX2ludFRvRml4ZWQoIHkzICksIHBwZW0gKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICBVc2VfeTQ6Ci0gICAgICAgICpkYXJrZW5BbW91bnQgPSBGVF9EaXZGaXgoIGNmMl9pbnRUb0ZpeGVkKCB5NCApLCBwcGVtICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHVzZSBoYWxmIHRoZSBhbW91bnQgb24gZWFjaCBzaWRlIGFuZCBjb252ZXJ0IGJhY2sgdG8gdHJ1ZSAqLwotICAgICAgLyogY2hhcmFjdGVyIHNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAqZGFya2VuQW1vdW50ID0gRlRfRGl2Rml4KCAqZGFya2VuQW1vdW50LCAyICogZW1SYXRpbyApOwotICAgIH0KLQotICAgIC8qIGFkZCBzeW50aGV0aWMgZW1ib2xkZW5pbmcgZWZmZWN0IGluIGNoYXJhY3RlciBzcGFjZSAqLwotICAgICpkYXJrZW5BbW91bnQgKz0gYm9sZGVuQW1vdW50IC8gMjsKLSAgfQotCi0KLSAgLyogc2V0IHVwIHZhbHVlcyBmb3IgdGhlIGN1cnJlbnQgRm9udERpY3QgYW5kIG1hdHJpeCAqLwotCi0gIC8qIGNhbGxlcidzIHRyYW5zZm9ybSBpcyBhZGp1c3RlZCBmb3Igc3VicGl4ZWwgcG9zaXRpb25pbmcgKi8KLSAgc3RhdGljIHZvaWQKLSAgY2YyX2ZvbnRfc2V0dXAoIENGMl9Gb250ICAgICAgICAgICBmb250LAotICAgICAgICAgICAgICAgICAgY29uc3QgQ0YyX01hdHJpeCogIHRyYW5zZm9ybSApCi0gIHsKLSAgICAvKiBwb2ludGVyIHRvIHBhcnNlZCBmb250IG9iamVjdCAqLwotICAgIENGRl9EZWNvZGVyKiAgZGVjb2RlciA9IGZvbnQtPmRlY29kZXI7Ci0KLSAgICBGVF9Cb29sICBuZWVkRXh0cmFTZXR1cCA9IEZBTFNFOwotCi0gICAgLyogY2hhcmFjdGVyIHNwYWNlIHVuaXRzICovCi0gICAgQ0YyX0ZpeGVkICBib2xkZW5YID0gZm9udC0+c3ludGhldGljRW1ib2xkZW5pbmdBbW91bnRYOwotICAgIENGMl9GaXhlZCAgYm9sZGVuWSA9IGZvbnQtPnN5bnRoZXRpY0VtYm9sZGVuaW5nQW1vdW50WTsKLQotICAgIENGRl9TdWJGb250ICBzdWJGb250OwotICAgIENGMl9GaXhlZCAgICBwcGVtOwotCi0KLSAgICAvKiBjbGVhciBwcmV2aW91cyBlcnJvciAqLwotICAgIGZvbnQtPmVycm9yID0gRlRfRXJyX09rOwotCi0gICAgLyogaWYgYSBDSUQgZm9udERpY3QgaGFzIGNoYW5nZWQsIHdlIG5lZWQgdG8gcmVjb21wdXRlIHNvbWUgY2FjaGVkICovCi0gICAgLyogZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgc3ViRm9udCA9IGNmMl9nZXRTdWJmb250KCBkZWNvZGVyICk7Ci0gICAgaWYgKCBmb250LT5sYXN0U3ViZm9udCAhPSBzdWJGb250ICkKLSAgICB7Ci0gICAgICBmb250LT5sYXN0U3ViZm9udCA9IHN1YkZvbnQ7Ci0gICAgICBuZWVkRXh0cmFTZXR1cCAgICA9IFRSVUU7Ci0gICAgfQotCi0gICAgLyogaWYgcHBlbSBoYXMgY2hhbmdlZCwgd2UgbmVlZCB0byByZWNvbXB1dGUgc29tZSBjYWNoZWQgZGF0YSAgICAgICAgICovCi0gICAgLyogbm90ZTogYmVjYXVzZSBvZiBDSUQgZm9udCBtYXRyaXggY29uY2F0ZW5hdGlvbiwgcHBlbSBhbmQgdHJhbnNmb3JtICovCi0gICAgLyogICAgICAgZG8gbm90IG5lY2Vzc2FyaWx5IHRyYWNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgcHBlbSA9IGNmMl9nZXRQcGVtWSggZGVjb2RlciApOwotICAgIGlmICggZm9udC0+cHBlbSAhPSBwcGVtICkKLSAgICB7Ci0gICAgICBmb250LT5wcGVtICAgICA9IHBwZW07Ci0gICAgICBuZWVkRXh0cmFTZXR1cCA9IFRSVUU7Ci0gICAgfQotCi0gICAgLyogY29weSBoaW50ZWQgZmxhZyBvbiBlYWNoIGNhbGwgKi8KLSAgICBmb250LT5oaW50ZWQgPSAoRlRfQm9vbCkoIGZvbnQtPnJlbmRlcmluZ0ZsYWdzICYgQ0YyX0ZsYWdzSGludGVkICk7Ci0KLSAgICAvKiBkZXRlcm1pbmUgaWYgdHJhbnNmb3JtIGhhcyBjaGFuZ2VkOyAgICAgICAqLwotICAgIC8qIGluY2x1ZGUgRm9udG1hdHJpeCBidXQgaWdub3JlIHRyYW5zbGF0aW9uICovCi0gICAgaWYgKCBmdF9tZW1jbXAoIHRyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgJmZvbnQtPmN1cnJlbnRUcmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgIDQgKiBzaXplb2YgKCBDRjJfRml4ZWQgKSApICE9IDAgKQotICAgIHsKLSAgICAgIC8qIHNhdmUgYGtleScgaW5mb3JtYXRpb24gZm9yIGBjYWNoZSBvZiBvbmUnIG1hdHJpeCBkYXRhOyAqLwotICAgICAgLyogc2F2ZSBjbGllbnQgdHJhbnNmb3JtLCB3aXRob3V0IHRoZSB0cmFuc2xhdGlvbiAgICAgICAgICovCi0gICAgICBmb250LT5jdXJyZW50VHJhbnNmb3JtICAgID0gKnRyYW5zZm9ybTsKLSAgICAgIGZvbnQtPmN1cnJlbnRUcmFuc2Zvcm0udHggPQotICAgICAgZm9udC0+Y3VycmVudFRyYW5zZm9ybS50eSA9IGNmMl9pbnRUb0ZpeGVkKCAwICk7Ci0KLSAgICAgIC8qIFRPRE86IEZyZWVUeXBlIHRyYW5zZm9ybSBpcyBzaW1wbGUgc2NhbGFyOyBmb3Igbm93LCB1c2UgaWRlbnRpdHkgKi8KLSAgICAgIC8qICAgICAgIGZvciBvdXRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGZvbnQtPmlubmVyVHJhbnNmb3JtICAgPSAqdHJhbnNmb3JtOwotICAgICAgZm9udC0+b3V0ZXJUcmFuc2Zvcm0uYSA9Ci0gICAgICBmb250LT5vdXRlclRyYW5zZm9ybS5kID0gY2YyX2ludFRvRml4ZWQoIDEgKTsKLSAgICAgIGZvbnQtPm91dGVyVHJhbnNmb3JtLmIgPQotICAgICAgZm9udC0+b3V0ZXJUcmFuc2Zvcm0uYyA9IGNmMl9pbnRUb0ZpeGVkKCAwICk7Ci0KLSAgICAgIG5lZWRFeHRyYVNldHVwID0gVFJVRTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGZvbnQtPmRhcmtlbmVkIGlzIHNldCB0byB0cnVlIGlmIHRoZXJlIGlzIGEgc3RlbSBkYXJrZW5pbmcgcmVxdWVzdCBvcgotICAgICAqIHRoZSBmb250IGlzIHN5bnRoZXRpYyBlbWJvbGRlbmVkLgotICAgICAqIGZvbnQtPmRhcmtlbmVkIGNvbnRyb2xzIHdoZXRoZXIgdG8gYWRqdXN0IGJsdWUgem9uZXMsIHdpbmRpbmcgb3JkZXIsCi0gICAgICogYW5kIGhpbnRpbmcuCi0gICAgICoKLSAgICAgKi8KLSAgICBpZiAoIGZvbnQtPnN0ZW1EYXJrZW5lZCAhPSAoIGZvbnQtPnJlbmRlcmluZ0ZsYWdzICYgQ0YyX0ZsYWdzRGFya2VuZWQgKSApCi0gICAgewotICAgICAgZm9udC0+c3RlbURhcmtlbmVkID0KLSAgICAgICAgKEZUX0Jvb2wpKCBmb250LT5yZW5kZXJpbmdGbGFncyAmIENGMl9GbGFnc0RhcmtlbmVkICk7Ci0KLSAgICAgIC8qIGJsdWUgem9uZXMgZGVwZW5kIG9uIGRhcmtlbmVkIGZsYWcgKi8KLSAgICAgIG5lZWRFeHRyYVNldHVwID0gVFJVRTsKLSAgICB9Ci0KLSAgICAvKiByZWNvbXB1dGUgdmFyaWFibGVzIHRoYXQgYXJlIGRlcGVuZGVudCBvbiB0cmFuc2Zvcm0gb3IgRm9udERpY3Qgb3IgKi8KLSAgICAvKiBkYXJrZW4gZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIG5lZWRFeHRyYVNldHVwICkKLSAgICB7Ci0gICAgICAvKiBTdGRWVyBpcyBmb3VuZCBpbiB0aGUgcHJpdmF0ZSBkaWN0aW9uYXJ5OyAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIHJlY29tcHV0ZSBkYXJrZW5pbmcgYW1vdW50cyB3aGVuZXZlciBwcml2YXRlIGRpY3Rpb25hcnkgb3IgICAgICAqLwotICAgICAgLyogdHJhbnNmb3JtIGNoYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBOb3RlOiBhIHJlbmRlcmluZyBmbGFnIHR1cm5zIGRhcmtlbmluZyBvbiBvciBvZmYsIHNvIHdlIHdhbnQgdG8gKi8KLSAgICAgIC8qICAgICAgIHN0b3JlIHRoZSBgb24nIGFtb3VudHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgZGFya2VuaW5nIGFtb3VudCBpcyBjb21wdXRlZCBpbiBjaGFyYWN0ZXIgc3BhY2UgICAgICAgICAgICovCi0gICAgICAvKiBUT0RPOiB0ZXN0aW5nIHNpemUtZGVwZW5kZW50IGRhcmtlbmluZyBoZXJlOyAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgIHdoYXQgdG8gZG8gZm9yIHJvdGF0aW9ucz8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBDRjJfRml4ZWQgIGVtUmF0aW87Ci0gICAgICBDRjJfRml4ZWQgIHN0ZEhXOwotICAgICAgQ0YyX0ludCAgICB1bml0c1BlckVtID0gZm9udC0+dW5pdHNQZXJFbTsKLQotCi0gICAgICBpZiAoIHVuaXRzUGVyRW0gPT0gMCApCi0gICAgICAgIHVuaXRzUGVyRW0gPSAxMDAwOwotCi0gICAgICBwcGVtID0gRlRfTUFYKCBjZjJfaW50VG9GaXhlZCggNCApLAotICAgICAgICAgICAgICAgICAgICAgZm9udC0+cHBlbSApOyAvKiB1c2UgbWluaW11bSBwcGVtIG9mIDQgKi8KLQotI2lmIDAKLSAgICAgIC8qIHNpbmNlIHZzdGVtIGlzIG1lYXN1cmVkIGluIHRoZSB4LWRpcmVjdGlvbiwgd2UgdXNlIHRoZSBgYScgbWVtYmVyICovCi0gICAgICAvKiBvZiB0aGUgZm9udE1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgZW1SYXRpbyA9IGNmMl9maXhlZEZyYWNNdWwoIGNmMl9pbnRUb0ZpeGVkKCAxMDAwICksIGZvbnRNYXRyaXgtPmEgKTsKLSNlbmRpZgotCi0gICAgICAvKiBGcmVldHlwZSBkb2VzIG5vdCBwcmVzZXJ2ZSB0aGUgZm9udE1hdHJpeCB3aGVuIHBhcnNpbmc7IHVzZSAqLwotICAgICAgLyogdW5pdHNQZXJFbSBpbnN0ZWFkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIFRPRE86IGNoZWNrIHByZWNpc2lvbiBvZiB0aGlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBlbVJhdGlvICAgICA9IGNmMl9pbnRUb0ZpeGVkKCAxMDAwICkgLyB1bml0c1BlckVtOwotICAgICAgZm9udC0+c3RkVlcgPSBjZjJfZ2V0U3RkVlcoIGRlY29kZXIgKTsKLQotICAgICAgaWYgKCBmb250LT5zdGRWVyA8PSAwICkKLSAgICAgICAgZm9udC0+c3RkVlcgPSBGVF9EaXZGaXgoIGNmMl9pbnRUb0ZpeGVkKCA3NSApLCBlbVJhdGlvICk7Ci0KLSAgICAgIGlmICggYm9sZGVuWCA+IDAgKQotICAgICAgewotICAgICAgICAvKiBFbnN1cmUgdGhhdCBib2xkZW5YIGlzIGF0IGxlYXN0IDEgcGl4ZWwgZm9yIHN5bnRoZXRpYyBib2xkIGZvbnQgKi8KLSAgICAgICAgLyogKHNpbWlsYXIgdG8gd2hhdCBBdmFsb24gZG9lcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGJvbGRlblggPSBGVF9NQVgoIGJvbGRlblgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0RpdkZpeCggY2YyX2ludFRvRml4ZWQoIHVuaXRzUGVyRW0gKSwgcHBlbSApICk7Ci0KLSAgICAgICAgLyogU3ludGhldGljIGVtYm9sZGVuaW5nIGFkZHMgYXQgbGVhc3QgMSBwaXhlbCB0byBkYXJrZW5YLCB3aGlsZSAqLwotICAgICAgICAvKiBzdGVtIGRhcmtlbmluZyBhZGRzIGF0IG1vc3QgaGFsZiBwaXhlbC4gIFNpbmNlIHRoZSBwdXJwb3NlIG9mICovCi0gICAgICAgIC8qIHN0ZW0gZGFya2VuaW5nIChyZWFkYWJpbGl0eSBhdCBzbWFsbCBzaXplcykgaXMgbWV0IHdpdGggICAgICAgKi8KLSAgICAgICAgLyogc3ludGhldGljIGVtYm9sZGVuaW5nLCBubyBuZWVkIHRvIGFkZCBzdGVtIGRhcmtlbmluZyBmb3IgYSAgICAqLwotICAgICAgICAvKiBzeW50aGV0aWMgYm9sZCBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGNmMl9jb21wdXRlRGFya2VuaW5nKCBlbVJhdGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtPnN0ZFZXLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvbnQtPmRhcmtlblgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2xkZW5YLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LT5kYXJrZW5QYXJhbXMgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgY2YyX2NvbXB1dGVEYXJrZW5pbmcoIGVtUmF0aW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC0+c3RkVlcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9udC0+ZGFya2VuWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LT5zdGVtRGFya2VuZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LT5kYXJrZW5QYXJhbXMgKTsKLQotI2lmIDAKLSAgICAgIC8qIHNpbmNlIGhzdGVtIGlzIG1lYXN1cmVkIGluIHRoZSB5LWRpcmVjdGlvbiwgd2UgdXNlIHRoZSBgZCcgbWVtYmVyICovCi0gICAgICAvKiBvZiB0aGUgZm9udE1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogVE9ETzogdXNlIHRoZSBzYW1lIHVuaXRzIHBlciBlbSBhcyBhYm92ZTsgY2hlY2sgdGhpcyAgICAgICAgICAgICAgKi8KLSAgICAgIGVtUmF0aW8gPSBjZjJfZml4ZWRGcmFjTXVsKCBjZjJfaW50VG9GaXhlZCggMTAwMCApLCBmb250TWF0cml4LT5kICk7Ci0jZW5kaWYKLQotICAgICAgLyogc2V0IHRoZSBkZWZhdWx0IHN0ZW0gd2lkdGgsIGJlY2F1c2UgaXQgbXVzdCBiZSB0aGUgc2FtZSBmb3IgYWxsICovCi0gICAgICAvKiBmYW1pbHkgbWVtYmVyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIGNob29zZSBhIGNvbnN0YW50IGZvciBTdGRIVyB0aGF0IGRlcGVuZHMgb24gZm9udCBjb250cmFzdCAgICAgICAqLwotICAgICAgc3RkSFcgPSBjZjJfZ2V0U3RkSFcoIGRlY29kZXIgKTsKLQotICAgICAgaWYgKCBzdGRIVyA+IDAgJiYgZm9udC0+c3RkVlcgPiAyICogc3RkSFcgKQotICAgICAgICBmb250LT5zdGRIVyA9IEZUX0RpdkZpeCggY2YyX2ludFRvRml4ZWQoIDc1ICksIGVtUmF0aW8gKTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogbG93IGNvbnRyYXN0IGZvbnQgZ2V0cyBsZXNzIGhzdGVtIGRhcmtlbmluZyAqLwotICAgICAgICBmb250LT5zdGRIVyA9IEZUX0RpdkZpeCggY2YyX2ludFRvRml4ZWQoIDExMCApLCBlbVJhdGlvICk7Ci0gICAgICB9Ci0KLSAgICAgIGNmMl9jb21wdXRlRGFya2VuaW5nKCBlbVJhdGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC0+c3RkSFcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvbnQtPmRhcmtlblksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9sZGVuWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LT5zdGVtRGFya2VuZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udC0+ZGFya2VuUGFyYW1zICk7Ci0KLSAgICAgIGlmICggZm9udC0+ZGFya2VuWCAhPSAwIHx8IGZvbnQtPmRhcmtlblkgIT0gMCApCi0gICAgICAgIGZvbnQtPmRhcmtlbmVkID0gVFJVRTsKLSAgICAgIGVsc2UKLSAgICAgICAgZm9udC0+ZGFya2VuZWQgPSBGQUxTRTsKLQotICAgICAgZm9udC0+cmV2ZXJzZVdpbmRpbmcgPSBGQUxTRTsgLyogaW5pdGlhbCBleHBlY3RhdGlvbiBpcyBDQ1cgKi8KLQotICAgICAgLyogY29tcHV0ZSBibHVlIHpvbmVzIGZvciB0aGlzIGluc3RhbmNlICovCi0gICAgICBjZjJfYmx1ZXNfaW5pdCggJmZvbnQtPmJsdWVzLCBmb250ICk7Ci0gICAgfQotICB9Ci0KLQotICAvKiBlcXVpdmFsZW50IHRvIEFkb2JlR2V0T3V0bGluZSAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2YyX2dldEdseXBoT3V0bGluZSggQ0YyX0ZvbnQgICAgICAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIENGMl9CdWZmZXIgICAgICAgICBjaGFyc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRjJfTWF0cml4KiAgdHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgICBDRjJfRjE2RG90MTYqICAgICAgZ2x5cGhXaWR0aCApCi0gIHsKLSAgICBGVF9FcnJvciAgbGFzdEVycm9yID0gRlRfRXJyX09rOwotCi0gICAgRlRfVmVjdG9yICB0cmFuc2xhdGlvbjsKLQotI2lmIDAKLSAgICBGVF9WZWN0b3IgIGFkdmFuY2VQb2ludDsKLSNlbmRpZgotCi0gICAgQ0YyX0ZpeGVkICBhZHZXaWR0aCA9IDA7Ci0gICAgRlRfQm9vbCAgICBuZWVkV2luZGluZzsKLQotCi0gICAgLyogTm90ZTogdXNlIGJvdGggaW50ZWdlciBhbmQgZnJhY3Rpb24gZm9yIG91dGxpbmVzLiAgVGhpcyBhbGxvd3MgYmJveCAqLwotICAgIC8qICAgICAgIHRvIGNvbWUgb3V0IGRpcmVjdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIHRyYW5zbGF0aW9uLnggPSB0cmFuc2Zvcm0tPnR4OwotICAgIHRyYW5zbGF0aW9uLnkgPSB0cmFuc2Zvcm0tPnR5OwotCi0gICAgLyogc2V0IHVwIHZhbHVlcyBiYXNlZCBvbiB0cmFuc2Zvcm0gKi8KLSAgICBjZjJfZm9udF9zZXR1cCggZm9udCwgdHJhbnNmb3JtICk7Ci0gICAgaWYgKCBmb250LT5lcnJvciApCi0gICAgICBnb3RvIGV4aXQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIHNldHVwIGVuY291bnRlcmVkIGFuIGVycm9yICovCi0KLSAgICAvKiByZXNldCBkYXJrZW4gZGlyZWN0aW9uICovCi0gICAgZm9udC0+cmV2ZXJzZVdpbmRpbmcgPSBGQUxTRTsKLQotICAgIC8qIHdpbmRpbmcgb3JkZXIgb25seSBhZmZlY3RzIGRhcmtlbmluZyAqLwotICAgIG5lZWRXaW5kaW5nID0gZm9udC0+ZGFya2VuZWQ7Ci0KLSAgICB3aGlsZSAoIDEgKQotICAgIHsKLSAgICAgIC8qIHJlc2V0IG91dHB1dCBidWZmZXIgKi8KLSAgICAgIGNmMl9vdXRsaW5lX3Jlc2V0KCAmZm9udC0+b3V0bGluZSApOwotCi0gICAgICAvKiBidWlsZCB0aGUgb3V0bGluZSwgcGFzc2luZyB0aGUgZnVsbCB0cmFuc2xhdGlvbiAqLwotICAgICAgY2YyX2ludGVycFQyQ2hhclN0cmluZyggZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ0YyX091dGxpbmVDYWxsYmFja3MpJmZvbnQtPm91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNsYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkdldpZHRoICk7Ci0KLSAgICAgIGlmICggZm9udC0+ZXJyb3IgKQotICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAgICAgIGlmICggIW5lZWRXaW5kaW5nICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGNoZWNrIHdpbmRpbmcgb3JkZXIgKi8KLSAgICAgIGlmICggZm9udC0+b3V0bGluZS5yb290LndpbmRpbmdNb21lbnR1bSA+PSAwICkgLyogQ0ZGIGlzIENDVyAqLwotICAgICAgICBicmVhazsKLQotICAgICAgLyogaW52ZXJ0IGRhcmtlbmluZyBhbmQgcmVuZGVyIGFnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBUT0RPOiB0aGlzIHNob3VsZCBiZSBhIHBhcmFtZXRlciB0byBnZXRPdXRsaW5lLWNvbXB1dGVPZmZzZXQgKi8KLSAgICAgIGZvbnQtPnJldmVyc2VXaW5kaW5nID0gVFJVRTsKLQotICAgICAgbmVlZFdpbmRpbmcgPSBGQUxTRTsgICAgLyogZXhpdCBhZnRlciBuZXh0IGl0ZXJhdGlvbiAqLwotICAgIH0KLQotICAgIC8qIGZpbmlzaCBzdG9yaW5nIGNsaWVudCBvdXRsaW5lICovCi0gICAgY2YyX291dGxpbmVfY2xvc2UoICZmb250LT5vdXRsaW5lICk7Ci0KLSAgZXhpdDoKLSAgICAvKiBGcmVlVHlwZSBqdXN0IHdhbnRzIHRoZSBhZHZhbmNlIHdpZHRoOyB0aGVyZSBpcyBubyB0cmFuc2xhdGlvbiAqLwotICAgICpnbHlwaFdpZHRoID0gYWR2V2lkdGg7Ci0KLSAgICAvKiBmcmVlIHJlc291cmNlcyBhbmQgY29sbGVjdCBlcnJvcnMgZnJvbSBvYmplY3RzIHdlJ3ZlIHVzZWQgKi8KLSAgICBjZjJfc2V0RXJyb3IoICZmb250LT5lcnJvciwgbGFzdEVycm9yICk7Ci0KLSAgICByZXR1cm4gZm9udC0+ZXJyb3I7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyZm9udC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJmb250LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2Y2YwMmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJmb250LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2YyZm9udC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFkb2JlJ3MgY29kZSBmb3IgZm9udCBpbnN0YW5jZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LTIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvciAgICAgICAqLwotLyogIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkICAgICAgKi8KLS8qICBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZSAgICovCi0vKiAgdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCAgICAqLwotLyogIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cyAgICovCi0vKiAgdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSAgICAqLwotLyogIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvciAgICAgKi8KLS8qICAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgICAgICAgICAgICAgICovCi0vKiAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCAgICAqLwotLyogIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kICAgICAgKi8KLS8qICBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgICovCi0vKiAgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgICAgICAqLwotLyogIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgICAgKi8KLS8qICBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMgICAgICAgICovCi0vKiAgc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgICAgICAqLwotLyogIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0ICAgKi8KLS8qICB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzICAgICovCi0vKiAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgICAqLwotLyogIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAgKi8KLS8qICB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgICAgKi8KLS8qICBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAgICAgICAgICAgICAgICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLCAgICAqLwotLyogIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19DRjJGT05UX0hfXwotI2RlZmluZSBfX0NGMkZPTlRfSF9fCi0KLQotI2luY2x1ZGUgImNmMmZ0LmgiCi0jaW5jbHVkZSAiY2YyYmx1ZXMuaCIKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0jZGVmaW5lIENGMl9PUEVSQU5EX1NUQUNLX1NJWkUgIDQ4Ci0jZGVmaW5lIENGMl9NQVhfU1VCUiAgICAgICAgICAgIDE2IC8qIG1heGltdW0gc3Vicm91dGluZSBuZXN0aW5nOyAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9ubHkgMTAgYXJlIGFsbG93ZWQgYnV0IHRoZXJlIGV4aXN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvbnRzIGxpa2UgYEhpcmFLYWt1UHJvTi1XMy50dGYnICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChIaXJhZ2lubyBLYWt1IEdvdGhpYyBQcm9OIFczOyAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDguMmQ2ZTE7IDIwMTQtMTItMTkpIHRoYXQgZXhjZWVkICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoaXMgbGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLQotICAvKiB0eXBlZGVmIGlzIGluIGBjZjJnbHVlLmgnICovCi0gIHN0cnVjdCAgQ0YyX0ZvbnRSZWNfCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLSAgICBGVF9FcnJvciAgIGVycm9yOyAgICAgLyogc2hhcmVkIGVycm9yIGZvciB0aGlzIGluc3RhbmNlICovCi0KLSAgICBDRjJfUmVuZGVyaW5nRmxhZ3MgIHJlbmRlcmluZ0ZsYWdzOwotCi0gICAgLyogdmFyaWFibGVzIHRoYXQgZGVwZW5kIG9uIFRyYW5zZm9ybTogICovCi0gICAgLyogdGhlIGZvbGxvd2luZyBoYXZlIHplcm8gdHJhbnNsYXRpb247ICovCi0gICAgLyogaW5uZXIgKiBvdXRlciA9IGZvbnQgKiBvcmlnaW5hbCAgICAgICovCi0KLSAgICBDRjJfTWF0cml4ICBjdXJyZW50VHJhbnNmb3JtOyAgLyogb3JpZ2luYWwgY2xpZW50IG1hdHJpeCAgICAgICAgICAgKi8KLSAgICBDRjJfTWF0cml4ICBpbm5lclRyYW5zZm9ybTsgICAgLyogZm9yIGhpbnRpbmc7IGVyZWN0LCBzY2FsZWQgICAgICAgKi8KLSAgICBDRjJfTWF0cml4ICBvdXRlclRyYW5zZm9ybTsgICAgLyogcG9zdCBoaW50aW5nOyBpbmNsdWRlcyByb3RhdGlvbnMgKi8KLSAgICBDRjJfRml4ZWQgICBwcGVtOyAgICAgICAgICAgICAgLyogdHJhbnNmb3JtLWRlcGVuZGVudCAgICAgICAgICAgICAgKi8KLQotICAgIENGMl9JbnQgIHVuaXRzUGVyRW07Ci0KLSAgICBDRjJfRml4ZWQgIHN5bnRoZXRpY0VtYm9sZGVuaW5nQW1vdW50WDsgICAvKiBjaGFyYWN0ZXIgc3BhY2UgdW5pdHMgKi8KLSAgICBDRjJfRml4ZWQgIHN5bnRoZXRpY0VtYm9sZGVuaW5nQW1vdW50WTsgICAvKiBjaGFyYWN0ZXIgc3BhY2UgdW5pdHMgKi8KLQotICAgIC8qIEZyZWVUeXBlIHJlbGF0ZWQgbWVtYmVycyAqLwotICAgIENGMl9PdXRsaW5lUmVjICBvdXRsaW5lOyAgICAgICAvKiBmcmVldHlwZSBnbHlwaCBvdXRsaW5lIGZ1bmN0aW9ucyAqLwotICAgIENGRl9EZWNvZGVyKiAgICBkZWNvZGVyOwotICAgIENGRl9TdWJGb250ICAgICBsYXN0U3ViZm9udDsgICAgICAgICAgICAgIC8qIEZyZWVUeXBlIHBhcnNlZCBkYXRhOyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRvcCBmb250IG9yIHN1YmZvbnQgICAqLwotCi0gICAgLyogdGhlc2UgZmxhZ3MgY2FuIHZhcnkgZnJvbSBvbmUgY2FsbCB0byB0aGUgbmV4dCAqLwotICAgIEZUX0Jvb2wgIGhpbnRlZDsKLSAgICBGVF9Cb29sICBkYXJrZW5lZDsgICAgICAgLyogdHJ1ZSBpZiBzdGVtRGFya2VuZWQgb3Igc3ludGhldGljIGJvbGQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaS5lLiBkYXJrZW5YICE9IDAgfHwgZGFya2VuWSAhPSAwICAgICAgKi8KLSAgICBGVF9Cb29sICBzdGVtRGFya2VuZWQ7Ci0KLSAgICBGVF9JbnQgIGRhcmtlblBhcmFtc1s4XTsgICAgICAgICAgICAgIC8qIDEwMDAgdW5pdCBjaGFyYWN0ZXIgc3BhY2UgKi8KLQotICAgIC8qIHZhcmlhYmxlcyB0aGF0IGRlcGVuZCBvbiBib3RoIEZvbnREaWN0IGFuZCBUcmFuc2Zvcm0gKi8KLSAgICBDRjJfRml4ZWQgIHN0ZFZXOyAgICAgLyogaW4gY2hhcmFjdGVyIHNwYWNlOyBkZXBlbmRzIG9uIGRpY3QgZW50cnkgKi8KLSAgICBDRjJfRml4ZWQgIHN0ZEhXOyAgICAgLyogaW4gY2hhcmFjdGVyIHNwYWNlOyBkZXBlbmRzIG9uIGRpY3QgZW50cnkgKi8KLSAgICBDRjJfRml4ZWQgIGRhcmtlblg7ICAgICAgICAgICAgICAgICAgICAvKiBjaGFyYWN0ZXIgc3BhY2UgdW5pdHMgICAgKi8KLSAgICBDRjJfRml4ZWQgIGRhcmtlblk7ICAgICAgICAgICAgICAgICAgICAvKiBkZXBlbmRzIG9uIHRyYW5zZm9ybSAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgcHJpdmF0ZSBkaWN0IChTdGRWVykgKi8KLSAgICBGVF9Cb29sICByZXZlcnNlV2luZGluZzsgICAgICAgICAgICAgICAvKiBkYXJrZW4gYXNzdW1pbmcgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3VudGVyY2xvY2t3aXNlIHdpbmRpbmcgKi8KLQotICAgIENGMl9CbHVlc1JlYyAgYmx1ZXM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXB1dGVkIHpvbmUgZGF0YSAqLwotICB9OwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2YyX2dldEdseXBoT3V0bGluZSggQ0YyX0ZvbnQgICAgICAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIENGMl9CdWZmZXIgICAgICAgICBjaGFyc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRjJfTWF0cml4KiAgdHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgICBDRjJfRjE2RG90MTYqICAgICAgZ2x5cGhXaWR0aCApOwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19DRjJGT05UX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJmdC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJmdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjU0NGEyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyZnQuYworKysgL2Rldi9udWxsCkBAIC0xLDcwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZjJmdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgR2x1ZSBDb21wb25lbnQgdG8gQWRvYmUncyBJbnRlcnByZXRlciAoYm9keSkuICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMtMjAxNCBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImNmMmZ0LmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLSNpbmNsdWRlICJjZjJmb250LmgiCi0jaW5jbHVkZSAiY2YyZXJyb3IuaCIKLQotCi0jZGVmaW5lIENGMl9NQVhfU0laRSAgY2YyX2ludFRvRml4ZWQoIDIwMDAgKSAgICAvKiBtYXggcHBlbSAqLwotCi0KLSAgLyoKLSAgICogVGhpcyBjaGVjayBzaG91bGQgYXZvaWQgbW9zdCBpbnRlcm5hbCBvdmVyZmxvdyBjYXNlcy4gIENsaWVudHMgc2hvdWxkCi0gICAqIGdlbmVyYWxseSByZXNwb25kIHRvIGBHbHlwaF9Ub29fQmlnJyBieSBnZXR0aW5nIGEgZ2x5cGggb3V0bGluZQotICAgKiBhdCBFTSBzaXplLCBzY2FsaW5nIGl0IGFuZCBmaWxsaW5nIGl0IGFzIGEgZ3JhcGhpY3Mgb3BlcmF0aW9uLgotICAgKgotICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmMl9jaGVja1RyYW5zZm9ybSggY29uc3QgQ0YyX01hdHJpeCogIHRyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICBDRjJfSW50ICAgICAgICAgICAgdW5pdHNQZXJFbSApCi0gIHsKLSAgICBDRjJfRml4ZWQgIG1heFNjYWxlOwotCi0KLSAgICBGVF9BU1NFUlQoIHVuaXRzUGVyRW0gPiAwICk7Ci0KLSAgICBpZiAoIHRyYW5zZm9ybS0+YSA8PSAwIHx8IHRyYW5zZm9ybS0+ZCA8PSAwICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9TaXplX0hhbmRsZSApOwotCi0gICAgRlRfQVNTRVJUKCB0cmFuc2Zvcm0tPmIgPT0gMCAmJiB0cmFuc2Zvcm0tPmMgPT0gMCApOwotICAgIEZUX0FTU0VSVCggdHJhbnNmb3JtLT50eCA9PSAwICYmIHRyYW5zZm9ybS0+dHkgPT0gMCApOwotCi0gICAgaWYgKCB1bml0c1BlckVtID4gMHg3RkZGICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggR2x5cGhfVG9vX0JpZyApOwotCi0gICAgbWF4U2NhbGUgPSBGVF9EaXZGaXgoIENGMl9NQVhfU0laRSwgY2YyX2ludFRvRml4ZWQoIHVuaXRzUGVyRW0gKSApOwotCi0gICAgaWYgKCB0cmFuc2Zvcm0tPmEgPiBtYXhTY2FsZSB8fCB0cmFuc2Zvcm0tPmQgPiBtYXhTY2FsZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEdseXBoX1Rvb19CaWcgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGNmMl9zZXRHbHlwaFdpZHRoKCBDRjJfT3V0bGluZSAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICB3aWR0aCApCi0gIHsKLSAgICBDRkZfRGVjb2RlciogIGRlY29kZXIgPSBvdXRsaW5lLT5kZWNvZGVyOwotCi0KLSAgICBGVF9BU1NFUlQoIGRlY29kZXIgKTsKLQotICAgIGRlY29kZXItPmdseXBoX3dpZHRoID0gY2YyX2ZpeGVkVG9JbnQoIHdpZHRoICk7Ci0gIH0KLQotCi0gIC8qIENsZWFuIHVwIGZvbnQgaW5zdGFuY2UuICovCi0gIHN0YXRpYyB2b2lkCi0gIGNmMl9mcmVlX2luc3RhbmNlKCB2b2lkKiAgcHRyICkKLSAgewotICAgIENGMl9Gb250ICBmb250ID0gKENGMl9Gb250KXB0cjsKLQotCi0gICAgaWYgKCBmb250ICkKLSAgICB7Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGZvbnQtPm1lbW9yeTsKLQotCi0gICAgICAodm9pZCltZW1vcnk7Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogZnVuY3Rpb25zIGZvciBoYW5kbGluZyBjbGllbnQgb3V0bGluZTsgICAqLwotICAvKiBGcmVlVHlwZSB1c2VzIGNvb3JkaW5hdGVzIGluIDI2LjYgZm9ybWF0ICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyB2b2lkCi0gIGNmMl9idWlsZGVyX21vdmVUbyggQ0YyX091dGxpbmVDYWxsYmFja3MgICAgICBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0YyX0NhbGxiYWNrUGFyYW1zICBwYXJhbXMgKQotICB7Ci0gICAgLyogZG93bmNhc3QgdGhlIG9iamVjdCBwb2ludGVyICovCi0gICAgQ0YyX091dGxpbmUgICBvdXRsaW5lID0gKENGMl9PdXRsaW5lKWNhbGxiYWNrczsKLSAgICBDRkZfQnVpbGRlciogIGJ1aWxkZXI7Ci0KLSAgICAodm9pZClwYXJhbXM7ICAgICAgICAvKiBvbmx5IHVzZWQgaW4gZGVidWcgbW9kZSAqLwotCi0KLSAgICBGVF9BU1NFUlQoIG91dGxpbmUgJiYgb3V0bGluZS0+ZGVjb2RlciApOwotICAgIEZUX0FTU0VSVCggcGFyYW1zLT5vcCA9PSBDRjJfUGF0aE9wTW92ZVRvICk7Ci0KLSAgICBidWlsZGVyID0gJm91dGxpbmUtPmRlY29kZXItPmJ1aWxkZXI7Ci0KLSAgICAvKiBub3RlOiB0d28gc3VjY2Vzc2l2ZSBtb3ZlcyBzaW1wbHkgY2xvc2UgdGhlIGNvbnRvdXIgdHdpY2UgKi8KLSAgICBjZmZfYnVpbGRlcl9jbG9zZV9jb250b3VyKCBidWlsZGVyICk7Ci0gICAgYnVpbGRlci0+cGF0aF9iZWd1biA9IDA7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGNmMl9idWlsZGVyX2xpbmVUbyggQ0YyX091dGxpbmVDYWxsYmFja3MgICAgICBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0YyX0NhbGxiYWNrUGFyYW1zICBwYXJhbXMgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0gICAgLyogZG93bmNhc3QgdGhlIG9iamVjdCBwb2ludGVyICovCi0gICAgQ0YyX091dGxpbmUgICBvdXRsaW5lID0gKENGMl9PdXRsaW5lKWNhbGxiYWNrczsKLSAgICBDRkZfQnVpbGRlciogIGJ1aWxkZXI7Ci0KLQotICAgIEZUX0FTU0VSVCggb3V0bGluZSAmJiBvdXRsaW5lLT5kZWNvZGVyICk7Ci0gICAgRlRfQVNTRVJUKCBwYXJhbXMtPm9wID09IENGMl9QYXRoT3BMaW5lVG8gKTsKLQotICAgIGJ1aWxkZXIgPSAmb3V0bGluZS0+ZGVjb2Rlci0+YnVpbGRlcjsKLQotICAgIGlmICggIWJ1aWxkZXItPnBhdGhfYmVndW4gKQotICAgIHsKLSAgICAgIC8qIHJlY29yZCB0aGUgbW92ZSBiZWZvcmUgdGhlIGxpbmU7IGFsc28gY2hlY2sgcG9pbnRzIGFuZCBzZXQgKi8KLSAgICAgIC8qIGBwYXRoX2JlZ3VuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGVycm9yID0gY2ZmX2J1aWxkZXJfc3RhcnRfcG9pbnQoIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnB0MC54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5wdDAueSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICB7Ci0gICAgICAgIGlmICggISpjYWxsYmFja3MtPmVycm9yICkKLSAgICAgICAgICAqY2FsbGJhY2tzLT5lcnJvciA9ICBlcnJvcjsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIGBjZmZfYnVpbGRlcl9hZGRfcG9pbnQxJyBpbmNsdWRlcyBhIGNoZWNrX3BvaW50cyBjYWxsIGZvciBvbmUgcG9pbnQgKi8KLSAgICBlcnJvciA9IGNmZl9idWlsZGVyX2FkZF9wb2ludDEoIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnB0MS54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5wdDEueSApOwotICAgIGlmICggZXJyb3IgKQotICAgIHsKLSAgICAgIGlmICggISpjYWxsYmFja3MtPmVycm9yICkKLSAgICAgICAgKmNhbGxiYWNrcy0+ZXJyb3IgPSAgZXJyb3I7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBjZjJfYnVpbGRlcl9jdWJlVG8oIENGMl9PdXRsaW5lQ2FsbGJhY2tzICAgICAgY2FsbGJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGMl9DYWxsYmFja1BhcmFtcyAgcGFyYW1zICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotICAgIC8qIGRvd25jYXN0IHRoZSBvYmplY3QgcG9pbnRlciAqLwotICAgIENGMl9PdXRsaW5lICAgb3V0bGluZSA9IChDRjJfT3V0bGluZSljYWxsYmFja3M7Ci0gICAgQ0ZGX0J1aWxkZXIqICBidWlsZGVyOwotCi0KLSAgICBGVF9BU1NFUlQoIG91dGxpbmUgJiYgb3V0bGluZS0+ZGVjb2RlciApOwotICAgIEZUX0FTU0VSVCggcGFyYW1zLT5vcCA9PSBDRjJfUGF0aE9wQ3ViZVRvICk7Ci0KLSAgICBidWlsZGVyID0gJm91dGxpbmUtPmRlY29kZXItPmJ1aWxkZXI7Ci0KLSAgICBpZiAoICFidWlsZGVyLT5wYXRoX2JlZ3VuICkKLSAgICB7Ci0gICAgICAvKiByZWNvcmQgdGhlIG1vdmUgYmVmb3JlIHRoZSBsaW5lOyBhbHNvIGNoZWNrIHBvaW50cyBhbmQgc2V0ICovCi0gICAgICAvKiBgcGF0aF9iZWd1bicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBlcnJvciA9IGNmZl9idWlsZGVyX3N0YXJ0X3BvaW50KCBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5wdDAueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+cHQwLnkgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgewotICAgICAgICBpZiAoICEqY2FsbGJhY2tzLT5lcnJvciApCi0gICAgICAgICAgKmNhbGxiYWNrcy0+ZXJyb3IgPSAgZXJyb3I7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBwcmVwYXJlIHJvb20gZm9yIDMgcG9pbnRzOiAyIG9mZi1jdXJ2ZSwgMSBvbi1jdXJ2ZSAqLwotICAgIGVycm9yID0gY2ZmX2NoZWNrX3BvaW50cyggYnVpbGRlciwgMyApOwotICAgIGlmICggZXJyb3IgKQotICAgIHsKLSAgICAgIGlmICggISpjYWxsYmFja3MtPmVycm9yICkKLSAgICAgICAgKmNhbGxiYWNrcy0+ZXJyb3IgPSAgZXJyb3I7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5wdDEueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+cHQxLnksIDAgKTsKLSAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnB0Mi54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5wdDIueSwgMCApOwotICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+cHQzLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnB0My55LCAxICk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGNmMl9vdXRsaW5lX2luaXQoIENGMl9PdXRsaW5lICBvdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICBGVF9FcnJvciogICAgZXJyb3IgKQotICB7Ci0gICAgRlRfTUVNX1pFUk8oIG91dGxpbmUsIHNpemVvZiAoIENGMl9PdXRsaW5lUmVjICkgKTsKLQotICAgIG91dGxpbmUtPnJvb3QubWVtb3J5ID0gbWVtb3J5OwotICAgIG91dGxpbmUtPnJvb3QuZXJyb3IgID0gZXJyb3I7Ci0KLSAgICBvdXRsaW5lLT5yb290Lm1vdmVUbyA9IGNmMl9idWlsZGVyX21vdmVUbzsKLSAgICBvdXRsaW5lLT5yb290LmxpbmVUbyA9IGNmMl9idWlsZGVyX2xpbmVUbzsKLSAgICBvdXRsaW5lLT5yb290LmN1YmVUbyA9IGNmMl9idWlsZGVyX2N1YmVUbzsKLSAgfQotCi0KLSAgLyogZ2V0IHNjYWxpbmcgYW5kIGhpbnQgZmxhZyBmcm9tIEdseXBoU2xvdCAqLwotICBzdGF0aWMgdm9pZAotICBjZjJfZ2V0U2NhbGVBbmRIaW50RmxhZyggQ0ZGX0RlY29kZXIqICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkKiAgICB4X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkKiAgICB5X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCogICAgICBoaW50ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sKiAgICAgIHNjYWxlZCApCi0gIHsKLSAgICBGVF9BU1NFUlQoIGRlY29kZXIgJiYgZGVjb2Rlci0+YnVpbGRlci5nbHlwaCApOwotCi0gICAgLyogbm90ZTogRnJlZVR5cGUgc2NhbGUgaW5jbHVkZXMgYSBmYWN0b3Igb2YgNjQgKi8KLSAgICAqaGludGVkID0gZGVjb2Rlci0+YnVpbGRlci5nbHlwaC0+aGludDsKLSAgICAqc2NhbGVkID0gZGVjb2Rlci0+YnVpbGRlci5nbHlwaC0+c2NhbGVkOwotCi0gICAgaWYgKCAqaGludGVkICkKLSAgICB7Ci0gICAgICAqeF9zY2FsZSA9ICggZGVjb2Rlci0+YnVpbGRlci5nbHlwaC0+eF9zY2FsZSArIDMyICkgLyA2NDsKLSAgICAgICp5X3NjYWxlID0gKCBkZWNvZGVyLT5idWlsZGVyLmdseXBoLT55X3NjYWxlICsgMzIgKSAvIDY0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogZm9yIHVuaGludGVkIG91dGxpbmVzLCBgY2ZmX3Nsb3RfbG9hZCcgZG9lcyB0aGUgc2NhbGluZywgKi8KLSAgICAgIC8qIHRodXMgcmVuZGVyIGF0IGB1bml0eScgc2NhbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICp4X3NjYWxlID0gMHgwNDAwOyAgIC8qIDEvNjQgYXMgMTYuMTYgKi8KLSAgICAgICp5X3NjYWxlID0gMHgwNDAwOwotICAgIH0KLSAgfQotCi0KLSAgLyogZ2V0IHVuaXRzIHBlciBlbSBmcm9tIGBGVF9GYWNlJyAqLwotICAvKiBUT0RPOiBzaG91bGQgaGFuZGxlIGZvbnQgbWF0cml4IGNvbmNhdGVuYXRpb24/ICovCi0gIHN0YXRpYyBGVF9VU2hvcnQKLSAgY2YyX2dldFVuaXRzUGVyRW0oIENGRl9EZWNvZGVyKiAgZGVjb2RlciApCi0gIHsKLSAgICBGVF9BU1NFUlQoIGRlY29kZXIgJiYgZGVjb2Rlci0+YnVpbGRlci5mYWNlICk7Ci0gICAgRlRfQVNTRVJUKCBkZWNvZGVyLT5idWlsZGVyLmZhY2UtPnJvb3QudW5pdHNfcGVyX0VNICk7Ci0KLSAgICByZXR1cm4gZGVjb2Rlci0+YnVpbGRlci5mYWNlLT5yb290LnVuaXRzX3Blcl9FTTsKLSAgfQotCi0KLSAgLyogTWFpbiBlbnRyeSBwb2ludDogUmVuZGVyIG9uZSBnbHlwaC4gKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNmMl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKCBDRkZfRGVjb2RlciogIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgIGNoYXJzdHJpbmdfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgY2hhcnN0cmluZ19sZW4gKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBDRjJfRm9udCAgIGZvbnQ7Ci0KLQotICAgIEZUX0FTU0VSVCggZGVjb2RlciAmJiBkZWNvZGVyLT5jZmYgKTsKLQotICAgIG1lbW9yeSA9IGRlY29kZXItPmJ1aWxkZXIubWVtb3J5OwotCi0gICAgLyogQ0YyIGRhdGEgaXMgc2F2ZWQgaGVyZSBhY3Jvc3MgZ2x5cGhzICovCi0gICAgZm9udCA9IChDRjJfRm9udClkZWNvZGVyLT5jZmYtPmNmMl9pbnN0YW5jZS5kYXRhOwotCi0gICAgLyogb24gZmlyc3QgZ2x5cGgsIGFsbG9jYXRlIGluc3RhbmNlIHN0cnVjdHVyZSAqLwotICAgIGlmICggZGVjb2Rlci0+Y2ZmLT5jZjJfaW5zdGFuY2UuZGF0YSA9PSBOVUxMICkKLSAgICB7Ci0gICAgICBkZWNvZGVyLT5jZmYtPmNmMl9pbnN0YW5jZS5maW5hbGl6ZXIgPQotICAgICAgICAoRlRfR2VuZXJpY19GaW5hbGl6ZXIpY2YyX2ZyZWVfaW5zdGFuY2U7Ci0KLSAgICAgIGlmICggRlRfQUxMT0MoIGRlY29kZXItPmNmZi0+Y2YyX2luc3RhbmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCBDRjJfRm9udFJlYyApICkgKQotICAgICAgICByZXR1cm4gRlRfVEhST1coIE91dF9PZl9NZW1vcnkgKTsKLQotICAgICAgZm9udCA9IChDRjJfRm9udClkZWNvZGVyLT5jZmYtPmNmMl9pbnN0YW5jZS5kYXRhOwotCi0gICAgICBmb250LT5tZW1vcnkgPSBtZW1vcnk7Ci0KLSAgICAgIC8qIGluaXRpYWxpemUgYSBjbGllbnQgb3V0bGluZSwgdG8gYmUgc2hhcmVkIGJ5IGVhY2ggZ2x5cGggcmVuZGVyZWQgKi8KLSAgICAgIGNmMl9vdXRsaW5lX2luaXQoICZmb250LT5vdXRsaW5lLCBmb250LT5tZW1vcnksICZmb250LT5lcnJvciApOwotICAgIH0KLQotICAgIC8qIHNhdmUgZGVjb2RlcjsgaXQgaXMgYSBzdGFjayB2YXJpYWJsZSBhbmQgd2lsbCBiZSBkaWZmZXJlbnQgb24gZWFjaCAqLwotICAgIC8qIGNhbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGZvbnQtPmRlY29kZXIgICAgICAgICA9IGRlY29kZXI7Ci0gICAgZm9udC0+b3V0bGluZS5kZWNvZGVyID0gZGVjb2RlcjsKLQotICAgIHsKLSAgICAgIC8qIGJ1aWxkIHBhcmFtZXRlcnMgZm9yIEFkb2JlIGVuZ2luZSAqLwotCi0gICAgICBDRkZfQnVpbGRlciogIGJ1aWxkZXIgPSAmZGVjb2Rlci0+YnVpbGRlcjsKLSAgICAgIENGRl9Ecml2ZXIgICAgZHJpdmVyICA9IChDRkZfRHJpdmVyKUZUX0ZBQ0VfRFJJVkVSKCBidWlsZGVyLT5mYWNlICk7Ci0KLSAgICAgIC8qIGxvY2FsIGVycm9yICovCi0gICAgICBGVF9FcnJvciAgICAgICBlcnJvcjIgPSBGVF9FcnJfT2s7Ci0gICAgICBDRjJfQnVmZmVyUmVjICBidWY7Ci0gICAgICBDRjJfTWF0cml4ICAgICB0cmFuc2Zvcm07Ci0gICAgICBDRjJfRjE2RG90MTYgICBnbHlwaFdpZHRoOwotCi0gICAgICBGVF9Cb29sICBoaW50ZWQ7Ci0gICAgICBGVF9Cb29sICBzY2FsZWQ7Ci0KLQotICAgICAgLyogRnJlZVR5cGUgaGFzIGFscmVhZHkgbG9va2VkIHVwIHRoZSBHSUQ7IGNvbnZlcnQgdG8gICAgICAgICAqLwotICAgICAgLyogYFJlZ2lvbkJ1ZmZlcicsIGFzc3VtaW5nIHRoYXQgdGhlIGlucHV0IGhhcyBiZWVuIHZhbGlkYXRlZCAqLwotICAgICAgRlRfQVNTRVJUKCBjaGFyc3RyaW5nX2Jhc2UgKyBjaGFyc3RyaW5nX2xlbiA+PSBjaGFyc3RyaW5nX2Jhc2UgKTsKLQotICAgICAgRlRfWkVSTyggJmJ1ZiApOwotICAgICAgYnVmLnN0YXJ0ID0KLSAgICAgIGJ1Zi5wdHIgICA9IGNoYXJzdHJpbmdfYmFzZTsKLSAgICAgIGJ1Zi5lbmQgICA9IGNoYXJzdHJpbmdfYmFzZSArIGNoYXJzdHJpbmdfbGVuOwotCi0gICAgICBGVF9aRVJPKCAmdHJhbnNmb3JtICk7Ci0KLSAgICAgIGNmMl9nZXRTY2FsZUFuZEhpbnRGbGFnKCBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc2Zvcm0uYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhbnNmb3JtLmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpbnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2NhbGVkICk7Ci0KLSAgICAgIGZvbnQtPnJlbmRlcmluZ0ZsYWdzID0gMDsKLSAgICAgIGlmICggaGludGVkICkKLSAgICAgICAgZm9udC0+cmVuZGVyaW5nRmxhZ3MgfD0gQ0YyX0ZsYWdzSGludGVkOwotICAgICAgaWYgKCBzY2FsZWQgJiYgIWRyaXZlci0+bm9fc3RlbV9kYXJrZW5pbmcgKQotICAgICAgICBmb250LT5yZW5kZXJpbmdGbGFncyB8PSBDRjJfRmxhZ3NEYXJrZW5lZDsKLQotICAgICAgZm9udC0+ZGFya2VuUGFyYW1zWzBdID0gZHJpdmVyLT5kYXJrZW5fcGFyYW1zWzBdOwotICAgICAgZm9udC0+ZGFya2VuUGFyYW1zWzFdID0gZHJpdmVyLT5kYXJrZW5fcGFyYW1zWzFdOwotICAgICAgZm9udC0+ZGFya2VuUGFyYW1zWzJdID0gZHJpdmVyLT5kYXJrZW5fcGFyYW1zWzJdOwotICAgICAgZm9udC0+ZGFya2VuUGFyYW1zWzNdID0gZHJpdmVyLT5kYXJrZW5fcGFyYW1zWzNdOwotICAgICAgZm9udC0+ZGFya2VuUGFyYW1zWzRdID0gZHJpdmVyLT5kYXJrZW5fcGFyYW1zWzRdOwotICAgICAgZm9udC0+ZGFya2VuUGFyYW1zWzVdID0gZHJpdmVyLT5kYXJrZW5fcGFyYW1zWzVdOwotICAgICAgZm9udC0+ZGFya2VuUGFyYW1zWzZdID0gZHJpdmVyLT5kYXJrZW5fcGFyYW1zWzZdOwotICAgICAgZm9udC0+ZGFya2VuUGFyYW1zWzddID0gZHJpdmVyLT5kYXJrZW5fcGFyYW1zWzddOwotCi0gICAgICAvKiBub3cgZ2V0IGFuIG91dGxpbmUgZm9yIHRoaXMgZ2x5cGg7ICAgICAgKi8KLSAgICAgIC8qIGFsc28gZ2V0IHVuaXRzIHBlciBlbSB0byB2YWxpZGF0ZSBzY2FsZSAqLwotICAgICAgZm9udC0+dW5pdHNQZXJFbSA9IChDRjJfSW50KWNmMl9nZXRVbml0c1BlckVtKCBkZWNvZGVyICk7Ci0KLSAgICAgIGlmICggc2NhbGVkICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IyID0gY2YyX2NoZWNrVHJhbnNmb3JtKCAmdHJhbnNmb3JtLCBmb250LT51bml0c1BlckVtICk7Ci0gICAgICAgIGlmICggZXJyb3IyICkKLSAgICAgICAgICByZXR1cm4gZXJyb3IyOwotICAgICAgfQotCi0gICAgICBlcnJvcjIgPSBjZjJfZ2V0R2x5cGhPdXRsaW5lKCBmb250LCAmYnVmLCAmdHJhbnNmb3JtLCAmZ2x5cGhXaWR0aCApOwotICAgICAgaWYgKCBlcnJvcjIgKQotICAgICAgICByZXR1cm4gRlRfRVJSKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICAgIGNmMl9zZXRHbHlwaFdpZHRoKCAmZm9udC0+b3V0bGluZSwgZ2x5cGhXaWR0aCApOwotCi0gICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgIH0KLSAgfQotCi0KLSAgLyogZ2V0IHBvaW50ZXIgdG8gY3VycmVudCBGcmVlVHlwZSBzdWJmb250IChiYXNlZCBvbiBjdXJyZW50IGdseXBoSUQpICovCi0gIEZUX0xPQ0FMX0RFRiggQ0ZGX1N1YkZvbnQgKQotICBjZjJfZ2V0U3ViZm9udCggQ0ZGX0RlY29kZXIqICBkZWNvZGVyICkKLSAgewotICAgIEZUX0FTU0VSVCggZGVjb2RlciAmJiBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQgKTsKLQotICAgIHJldHVybiBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQ7Ci0gIH0KLQotCi0gIC8qIGdldCBgeV9wcGVtJyBmcm9tIGBDRkZfU2l6ZScgKi8KLSAgRlRfTE9DQUxfREVGKCBDRjJfRml4ZWQgKQotICBjZjJfZ2V0UHBlbVkoIENGRl9EZWNvZGVyKiAgZGVjb2RlciApCi0gIHsKLSAgICBGVF9BU1NFUlQoIGRlY29kZXIgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICBkZWNvZGVyLT5idWlsZGVyLmZhY2UgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgZGVjb2Rlci0+YnVpbGRlci5mYWNlLT5yb290LnNpemUgKTsKLQotICAgIC8qCi0gICAgICogTm90ZSB0aGF0IGB5X3BwZW0nIGNhbiBiZSB6ZXJvIGlmIHRoZXJlIHdhc24ndCBhIGNhbGwgdG8KLSAgICAgKiBgRlRfU2V0X0NoYXJfU2l6ZScgb3Igc29tZXRoaW5nIHNpbWlsYXIuICBIb3dldmVyLCB0aGlzIGlzbid0IGEKLSAgICAgKiBwcm9ibGVtIHNpbmNlIHdlIGNvbWUgdG8gdGhpcyBwbGFjZSBpbiB0aGUgY29kZSBvbmx5IGlmCi0gICAgICogRlRfTE9BRF9OT19TQ0FMRSBpcyBzZXQgKHRoZSBvdGhlciBjYXNlIGdldHMgY2F1Z2h0IGJ5Ci0gICAgICogYGNmMl9jaGVja1RyYW5zZm9ybScpLiAgVGhlIHBwZW0gdmFsdWUgaXMgbmVlZGVkIHRvIGNvbXB1dGUgdGhlIHN0ZW0KLSAgICAgKiBkYXJrZW5pbmcsIHdoaWNoIGlzIGRpc2FibGVkIGZvciBnZXR0aW5nIHRoZSB1bnNjYWxlZCBvdXRsaW5lLgotICAgICAqCi0gICAgICovCi0gICAgcmV0dXJuIGNmMl9pbnRUb0ZpeGVkKAotICAgICAgICAgICAgIGRlY29kZXItPmJ1aWxkZXIuZmFjZS0+cm9vdC5zaXplLT5tZXRyaWNzLnlfcHBlbSApOwotICB9Ci0KLQotICAvKiBnZXQgc3RhbmRhcmQgc3RlbSB3aWR0aHMgZm9yIHRoZSBjdXJyZW50IHN1YmZvbnQ7ICovCi0gIC8qIEZyZWVUeXBlIHN0b3JlcyB0aGVzZSBhcyBpbnRlZ2VyIGZvbnQgdW5pdHMgICAgICAgKi8KLSAgLyogKG5vdGU6IHZhcmlhYmxlIG5hbWVzIHNlZW0gc3dhcHBlZCkgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIENGMl9GaXhlZCApCi0gIGNmMl9nZXRTdGRWVyggQ0ZGX0RlY29kZXIqICBkZWNvZGVyICkKLSAgewotICAgIEZUX0FTU0VSVCggZGVjb2RlciAmJiBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQgKTsKLQotICAgIHJldHVybiBjZjJfaW50VG9GaXhlZCgKLSAgICAgICAgICAgICBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQtPnByaXZhdGVfZGljdC5zdGFuZGFyZF9oZWlnaHQgKTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBDRjJfRml4ZWQgKQotICBjZjJfZ2V0U3RkSFcoIENGRl9EZWNvZGVyKiAgZGVjb2RlciApCi0gIHsKLSAgICBGVF9BU1NFUlQoIGRlY29kZXIgJiYgZGVjb2Rlci0+Y3VycmVudF9zdWJmb250ICk7Ci0KLSAgICByZXR1cm4gY2YyX2ludFRvRml4ZWQoCi0gICAgICAgICAgICAgZGVjb2Rlci0+Y3VycmVudF9zdWJmb250LT5wcml2YXRlX2RpY3Quc3RhbmRhcmRfd2lkdGggKTsKLSAgfQotCi0KLSAgLyogbm90ZTogRnJlZVR5cGUgc3RvcmVzIDEwMDAgdGltZXMgdGhlIGFjdHVhbCB2YWx1ZSBmb3IgYEJsdWVTY2FsZScgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX2dldEJsdWVNZXRyaWNzKCBDRkZfRGVjb2RlciogIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkKiAgICBibHVlU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkKiAgICBibHVlU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkKiAgICBibHVlRnV6eiApCi0gIHsKLSAgICBGVF9BU1NFUlQoIGRlY29kZXIgJiYgZGVjb2Rlci0+Y3VycmVudF9zdWJmb250ICk7Ci0KLSAgICAqYmx1ZVNjYWxlID0gRlRfRGl2Rml4KAotICAgICAgICAgICAgICAgICAgIGRlY29kZXItPmN1cnJlbnRfc3ViZm9udC0+cHJpdmF0ZV9kaWN0LmJsdWVfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgY2YyX2ludFRvRml4ZWQoIDEwMDAgKSApOwotICAgICpibHVlU2hpZnQgPSBjZjJfaW50VG9GaXhlZCgKLSAgICAgICAgICAgICAgICAgICBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQtPnByaXZhdGVfZGljdC5ibHVlX3NoaWZ0ICk7Ci0gICAgKmJsdWVGdXp6ICA9IGNmMl9pbnRUb0ZpeGVkKAotICAgICAgICAgICAgICAgICAgIGRlY29kZXItPmN1cnJlbnRfc3ViZm9udC0+cHJpdmF0ZV9kaWN0LmJsdWVfZnV6eiApOwotICB9Ci0KLQotICAvKiBnZXQgYmx1ZSB2YWx1ZXMgY291bnRzIGFuZCBhcnJheXM7IHRoZSBGcmVlVHlwZSBwYXJzZXIgaGFzIHZhbGlkYXRlZCAqLwotICAvKiB0aGUgY291bnRzIGFuZCB2ZXJpZmllZCB0aGF0IGVhY2ggaXMgYW4gZXZlbiBudW1iZXIgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZjJfZ2V0Qmx1ZVZhbHVlcyggQ0ZGX0RlY29kZXIqICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyogICAgICAqZGF0YSApCi0gIHsKLSAgICBGVF9BU1NFUlQoIGRlY29kZXIgJiYgZGVjb2Rlci0+Y3VycmVudF9zdWJmb250ICk7Ci0KLSAgICAqY291bnQgPSBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQtPnByaXZhdGVfZGljdC5udW1fYmx1ZV92YWx1ZXM7Ci0gICAgKmRhdGEgID0gKEZUX1BvcyopCi0gICAgICAgICAgICAgICAmZGVjb2Rlci0+Y3VycmVudF9zdWJmb250LT5wcml2YXRlX2RpY3QuYmx1ZV92YWx1ZXM7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9nZXRPdGhlckJsdWVzKCBDRkZfRGVjb2RlciogIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9zKiAgICAgICpkYXRhICkKLSAgewotICAgIEZUX0FTU0VSVCggZGVjb2RlciAmJiBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQgKTsKLQotICAgICpjb3VudCA9IGRlY29kZXItPmN1cnJlbnRfc3ViZm9udC0+cHJpdmF0ZV9kaWN0Lm51bV9vdGhlcl9ibHVlczsKLSAgICAqZGF0YSAgPSAoRlRfUG9zKikKLSAgICAgICAgICAgICAgICZkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQtPnByaXZhdGVfZGljdC5vdGhlcl9ibHVlczsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX2dldEZhbWlseUJsdWVzKCBDRkZfRGVjb2RlciogIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MqICAgICAgKmRhdGEgKQotICB7Ci0gICAgRlRfQVNTRVJUKCBkZWNvZGVyICYmIGRlY29kZXItPmN1cnJlbnRfc3ViZm9udCApOwotCi0gICAgKmNvdW50ID0gZGVjb2Rlci0+Y3VycmVudF9zdWJmb250LT5wcml2YXRlX2RpY3QubnVtX2ZhbWlseV9ibHVlczsKLSAgICAqZGF0YSAgPSAoRlRfUG9zKikKLSAgICAgICAgICAgICAgICZkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQtPnByaXZhdGVfZGljdC5mYW1pbHlfYmx1ZXM7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9nZXRGYW1pbHlPdGhlckJsdWVzKCBDRkZfRGVjb2RlciogIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqICAgICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zKiAgICAgICpkYXRhICkKLSAgewotICAgIEZUX0FTU0VSVCggZGVjb2RlciAmJiBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQgKTsKLQotICAgICpjb3VudCA9IGRlY29kZXItPmN1cnJlbnRfc3ViZm9udC0+cHJpdmF0ZV9kaWN0Lm51bV9mYW1pbHlfb3RoZXJfYmx1ZXM7Ci0gICAgKmRhdGEgID0gKEZUX1BvcyopCi0gICAgICAgICAgICAgICAmZGVjb2Rlci0+Y3VycmVudF9zdWJmb250LT5wcml2YXRlX2RpY3QuZmFtaWx5X290aGVyX2JsdWVzOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIENGMl9JbnQgKQotICBjZjJfZ2V0TGFuZ3VhZ2VHcm91cCggQ0ZGX0RlY29kZXIqICBkZWNvZGVyICkKLSAgewotICAgIEZUX0FTU0VSVCggZGVjb2RlciAmJiBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQgKTsKLQotICAgIHJldHVybiBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQtPnByaXZhdGVfZGljdC5sYW5ndWFnZV9ncm91cDsKLSAgfQotCi0KLSAgLyogY29udmVydCB1bmJpYXNlZCBzdWJyb3V0aW5lIGluZGV4IHRvIGBDRjJfQnVmZmVyJyBhbmQgKi8KLSAgLyogcmV0dXJuIDAgb24gc3VjY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBDRjJfSW50ICkKLSAgY2YyX2luaXRHbG9iYWxSZWdpb25CdWZmZXIoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9VSW50ICAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0J1ZmZlciAgICBidWYgKQotICB7Ci0gICAgRlRfQVNTRVJUKCBkZWNvZGVyICk7Ci0KLSAgICBGVF9aRVJPKCBidWYgKTsKLQotICAgIGlkeCArPSAoQ0YyX1VJbnQpZGVjb2Rlci0+Z2xvYmFsc19iaWFzOwotICAgIGlmICggaWR4ID49IGRlY29kZXItPm51bV9nbG9iYWxzICkKLSAgICAgIHJldHVybiBUUlVFOyAgICAgLyogZXJyb3IgKi8KLQotICAgIEZUX0FTU0VSVCggZGVjb2Rlci0+Z2xvYmFscyApOwotCi0gICAgYnVmLT5zdGFydCA9Ci0gICAgYnVmLT5wdHIgICA9IGRlY29kZXItPmdsb2JhbHNbaWR4XTsKLSAgICBidWYtPmVuZCAgID0gZGVjb2Rlci0+Z2xvYmFsc1tpZHggKyAxXTsKLQotICAgIHJldHVybiBGQUxTRTsgICAgICAvKiBzdWNjZXNzICovCi0gIH0KLQotCi0gIC8qIGNvbnZlcnQgQWRvYmVTdGFuZGFyZEVuY29kaW5nIGNvZGUgdG8gQ0YyX0J1ZmZlcjsgKi8KLSAgLyogdXNlZCBmb3Igc2VhYyBjb21wb25lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2YyX2dldFNlYWNDb21wb25lbnQoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGMl9JbnQgICAgICAgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGMl9CdWZmZXIgICAgYnVmICkKLSAgewotICAgIENGMl9JbnQgICBnaWQ7Ci0gICAgRlRfQnl0ZSogIGNoYXJzdHJpbmc7Ci0gICAgRlRfVUxvbmcgIGxlbjsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIEZUX0FTU0VSVCggZGVjb2RlciApOwotCi0gICAgRlRfWkVSTyggYnVmICk7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgLyogSW5jcmVtZW50YWwgZm9udHMgZG9uJ3QgbmVjZXNzYXJpbHkgaGF2ZSB2YWxpZCBjaGFyc2V0cy4gICAgICAgICovCi0gICAgLyogVGhleSB1c2UgdGhlIGNoYXJhY3RlciBjb2RlLCBub3QgdGhlIGdseXBoIGluZGV4LCBpbiB0aGlzIGNhc2UuICovCi0gICAgaWYgKCBkZWNvZGVyLT5idWlsZGVyLmZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSApCi0gICAgICBnaWQgPSBjb2RlOwotICAgIGVsc2UKLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMICovCi0gICAgewotICAgICAgZ2lkID0gY2ZmX2xvb2t1cF9nbHlwaF9ieV9zdGRjaGFyY29kZSggZGVjb2Rlci0+Y2ZmLCBjb2RlICk7Ci0gICAgICBpZiAoIGdpZCA8IDAgKQotICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfR2x5cGhfRm9ybWF0ICk7Ci0gICAgfQotCi0gICAgZXJyb3IgPSBjZmZfZ2V0X2dseXBoX2RhdGEoIGRlY29kZXItPmJ1aWxkZXIuZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENGMl9VSW50KWdpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYXJzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsZW4gKTsKLSAgICAvKiBUT0RPOiBmb3Igbm93LCBqdXN0IHBhc3MgdGhlIEZyZWVUeXBlIGVycm9yIHRocm91Z2ggKi8KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIC8qIGFzc3VtZSBpbnB1dCBoYXMgYmVlbiB2YWxpZGF0ZWQgKi8KLSAgICBGVF9BU1NFUlQoIGNoYXJzdHJpbmcgKyBsZW4gPj0gY2hhcnN0cmluZyApOwotCi0gICAgYnVmLT5zdGFydCA9IGNoYXJzdHJpbmc7Ci0gICAgYnVmLT5lbmQgICA9IGNoYXJzdHJpbmcgKyBsZW47Ci0gICAgYnVmLT5wdHIgICA9IGJ1Zi0+c3RhcnQ7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZjJfZnJlZVNlYWNDb21wb25lbnQoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfQnVmZmVyICAgIGJ1ZiApCi0gIHsKLSAgICBGVF9BU1NFUlQoIGRlY29kZXIgKTsKLQotICAgIGNmZl9mcmVlX2dseXBoX2RhdGEoIGRlY29kZXItPmJ1aWxkZXIuZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSoqKSZidWYtPnN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VTG9uZykoIGJ1Zi0+ZW5kIC0gYnVmLT5zdGFydCApICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggQ0YyX0ludCApCi0gIGNmMl9pbml0TG9jYWxSZWdpb25CdWZmZXIoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX1VJbnQgICAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9CdWZmZXIgICAgYnVmICkKLSAgewotICAgIEZUX0FTU0VSVCggZGVjb2RlciApOwotCi0gICAgRlRfWkVSTyggYnVmICk7Ci0KLSAgICBpZHggKz0gKENGMl9VSW50KWRlY29kZXItPmxvY2Fsc19iaWFzOwotICAgIGlmICggaWR4ID49IGRlY29kZXItPm51bV9sb2NhbHMgKQotICAgICAgcmV0dXJuIFRSVUU7ICAgICAvKiBlcnJvciAqLwotCi0gICAgRlRfQVNTRVJUKCBkZWNvZGVyLT5sb2NhbHMgKTsKLQotICAgIGJ1Zi0+c3RhcnQgPQotICAgIGJ1Zi0+cHRyICAgPSBkZWNvZGVyLT5sb2NhbHNbaWR4XTsKLSAgICBidWYtPmVuZCAgID0gZGVjb2Rlci0+bG9jYWxzW2lkeCArIDFdOwotCi0gICAgcmV0dXJuIEZBTFNFOyAgICAgIC8qIHN1Y2Nlc3MgKi8KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBDRjJfRml4ZWQgKQotICBjZjJfZ2V0RGVmYXVsdFdpZHRoWCggQ0ZGX0RlY29kZXIqICBkZWNvZGVyICkKLSAgewotICAgIEZUX0FTU0VSVCggZGVjb2RlciAmJiBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQgKTsKLQotICAgIHJldHVybiBjZjJfaW50VG9GaXhlZCgKLSAgICAgICAgICAgICBkZWNvZGVyLT5jdXJyZW50X3N1YmZvbnQtPnByaXZhdGVfZGljdC5kZWZhdWx0X3dpZHRoICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggQ0YyX0ZpeGVkICkKLSAgY2YyX2dldE5vbWluYWxXaWR0aFgoIENGRl9EZWNvZGVyKiAgZGVjb2RlciApCi0gIHsKLSAgICBGVF9BU1NFUlQoIGRlY29kZXIgJiYgZGVjb2Rlci0+Y3VycmVudF9zdWJmb250ICk7Ci0KLSAgICByZXR1cm4gY2YyX2ludFRvRml4ZWQoCi0gICAgICAgICAgICAgZGVjb2Rlci0+Y3VycmVudF9zdWJmb250LT5wcml2YXRlX2RpY3Qubm9taW5hbF93aWR0aCApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZjJfb3V0bGluZV9yZXNldCggQ0YyX091dGxpbmUgIG91dGxpbmUgKQotICB7Ci0gICAgQ0ZGX0RlY29kZXIqICBkZWNvZGVyID0gb3V0bGluZS0+ZGVjb2RlcjsKLQotCi0gICAgRlRfQVNTRVJUKCBkZWNvZGVyICk7Ci0KLSAgICBvdXRsaW5lLT5yb290LndpbmRpbmdNb21lbnR1bSA9IDA7Ci0KLSAgICBGVF9HbHlwaExvYWRlcl9SZXdpbmQoIGRlY29kZXItPmJ1aWxkZXIubG9hZGVyICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9vdXRsaW5lX2Nsb3NlKCBDRjJfT3V0bGluZSAgb3V0bGluZSApCi0gIHsKLSAgICBDRkZfRGVjb2RlciogIGRlY29kZXIgPSBvdXRsaW5lLT5kZWNvZGVyOwotCi0KLSAgICBGVF9BU1NFUlQoIGRlY29kZXIgKTsKLQotICAgIGNmZl9idWlsZGVyX2Nsb3NlX2NvbnRvdXIoICZkZWNvZGVyLT5idWlsZGVyICk7Ci0KLSAgICBGVF9HbHlwaExvYWRlcl9BZGQoIGRlY29kZXItPmJ1aWxkZXIubG9hZGVyICk7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyZnQuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyZnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA3M2RmMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmZ0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2YyZnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIEdsdWUgQ29tcG9uZW50IHRvIEFkb2JlJ3MgSW50ZXJwcmV0ZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvciAgICAgICAqLwotLyogIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkICAgICAgKi8KLS8qICBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZSAgICovCi0vKiAgdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCAgICAqLwotLyogIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cyAgICovCi0vKiAgdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSAgICAqLwotLyogIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvciAgICAgKi8KLS8qICAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgICAgICAgICAgICAgICovCi0vKiAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCAgICAqLwotLyogIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kICAgICAgKi8KLS8qICBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgICovCi0vKiAgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgICAgICAqLwotLyogIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgICAgKi8KLS8qICBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMgICAgICAgICovCi0vKiAgc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgICAgICAqLwotLyogIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0ICAgKi8KLS8qICB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzICAgICovCi0vKiAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgICAqLwotLyogIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAgKi8KLS8qICB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgICAgKi8KLS8qICBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAgICAgICAgICAgICAgICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLCAgICAqLwotLyogIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19DRjJGVF9IX18KLSNkZWZpbmUgX19DRjJGVF9IX18KLQotCi0jaW5jbHVkZSAiY2YydHlwZXMuaCIKLQotCi0gIC8qIFRPRE86IGRpc2FibGUgYXNzZXJ0cyBmb3Igbm93ICovCi0jZGVmaW5lIENGMl9OREVCVUcKLQotCi0jaW5jbHVkZSBGVF9TWVNURU1fSAotCi0jaW5jbHVkZSAiY2YyZ2x1ZS5oIgotI2luY2x1ZGUgImNmZmdsb2FkLmgiICAgIC8qIGZvciBDRkZfRGVjb2RlciAqLwotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2YyX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgY2hhcnN0cmluZ19iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICBjaGFyc3RyaW5nX2xlbiApOwotCi0gIEZUX0xPQ0FMKCBDRkZfU3ViRm9udCApCi0gIGNmMl9nZXRTdWJmb250KCBDRkZfRGVjb2RlciogIGRlY29kZXIgKTsKLQotCi0gIEZUX0xPQ0FMKCBDRjJfRml4ZWQgKQotICBjZjJfZ2V0UHBlbVkoIENGRl9EZWNvZGVyKiAgZGVjb2RlciApOwotICBGVF9MT0NBTCggQ0YyX0ZpeGVkICkKLSAgY2YyX2dldFN0ZFZXKCBDRkZfRGVjb2RlciogIGRlY29kZXIgKTsKLSAgRlRfTE9DQUwoIENGMl9GaXhlZCApCi0gIGNmMl9nZXRTdGRIVyggQ0ZGX0RlY29kZXIqICBkZWNvZGVyICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZjJfZ2V0Qmx1ZU1ldHJpY3MoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQqICAgIGJsdWVTY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQqICAgIGJsdWVTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQqICAgIGJsdWVGdXp6ICk7Ci0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX2dldEJsdWVWYWx1ZXMoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb3MqICAgICAgKmRhdGEgKTsKLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZjJfZ2V0T3RoZXJCbHVlcyggQ0ZGX0RlY29kZXIqICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAgICAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyogICAgICAqZGF0YSApOwotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9nZXRGYW1pbHlCbHVlcyggQ0ZGX0RlY29kZXIqICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfUG9zKiAgICAgICpkYXRhICk7Ci0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX2dldEZhbWlseU90aGVyQmx1ZXMoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogICAgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MqICAgICAgKmRhdGEgKTsKLQotICBGVF9MT0NBTCggQ0YyX0ludCApCi0gIGNmMl9nZXRMYW5ndWFnZUdyb3VwKCBDRkZfRGVjb2RlciogIGRlY29kZXIgKTsKLQotICBGVF9MT0NBTCggQ0YyX0ludCApCi0gIGNmMl9pbml0R2xvYmFsUmVnaW9uQnVmZmVyKCBDRkZfRGVjb2RlciogIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfVUludCAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9CdWZmZXIgICAgYnVmICk7Ci0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGNmMl9nZXRTZWFjQ29tcG9uZW50KCBDRkZfRGVjb2RlciogIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRjJfSW50ICAgICAgIGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRjJfQnVmZmVyICAgIGJ1ZiApOwotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9mcmVlU2VhY0NvbXBvbmVudCggQ0ZGX0RlY29kZXIqICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9CdWZmZXIgICAgYnVmICk7Ci0gIEZUX0xPQ0FMKCBDRjJfSW50ICkKLSAgY2YyX2luaXRMb2NhbFJlZ2lvbkJ1ZmZlciggQ0ZGX0RlY29kZXIqICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfVUludCAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0J1ZmZlciAgICBidWYgKTsKLQotICBGVF9MT0NBTCggQ0YyX0ZpeGVkICkKLSAgY2YyX2dldERlZmF1bHRXaWR0aFgoIENGRl9EZWNvZGVyKiAgZGVjb2RlciApOwotICBGVF9MT0NBTCggQ0YyX0ZpeGVkICkKLSAgY2YyX2dldE5vbWluYWxXaWR0aFgoIENGRl9EZWNvZGVyKiAgZGVjb2RlciApOwotCi0KLSAgLyoKLSAgICogRnJlZVR5cGUgY2xpZW50IG91dGxpbmUKLSAgICoKLSAgICogcHJvY2VzcyBvdXRwdXQgZnJvbSB0aGUgY2hhcnN0cmluZyBpbnRlcnByZXRlcgotICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGMl9PdXRsaW5lUmVjXwotICB7Ci0gICAgQ0YyX091dGxpbmVDYWxsYmFja3NSZWMgIHJvb3Q7ICAgICAgICAvKiBiYXNlIGNsYXNzIG11c3QgYmUgZmlyc3QgKi8KLSAgICBDRkZfRGVjb2RlciogICAgICAgICAgICAgZGVjb2RlcjsKLQotICB9IENGMl9PdXRsaW5lUmVjLCAqQ0YyX091dGxpbmU7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9vdXRsaW5lX3Jlc2V0KCBDRjJfT3V0bGluZSAgb3V0bGluZSApOwotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9vdXRsaW5lX2Nsb3NlKCBDRjJfT3V0bGluZSAgb3V0bGluZSApOwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19DRjJGVF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyZ2x1ZS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJnbHVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNGRhMzkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJnbHVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2YyZ2x1ZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFkb2JlJ3MgY29kZSBmb3Igc2hhcmVkIHN0dWZmIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LTIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvciAgICAgICAqLwotLyogIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkICAgICAgKi8KLS8qICBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZSAgICovCi0vKiAgdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCAgICAqLwotLyogIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cyAgICovCi0vKiAgdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSAgICAqLwotLyogIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvciAgICAgKi8KLS8qICAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgICAgICAgICAgICAgICovCi0vKiAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCAgICAqLwotLyogIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kICAgICAgKi8KLS8qICBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgICovCi0vKiAgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgICAgICAqLwotLyogIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgICAgKi8KLS8qICBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMgICAgICAgICovCi0vKiAgc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgICAgICAqLwotLyogIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0ICAgKi8KLS8qICB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzICAgICovCi0vKiAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgICAqLwotLyogIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAgKi8KLS8qICB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgICAgKi8KLS8qICBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAgICAgICAgICAgICAgICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLCAgICAqLwotLyogIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19DRjJHTFVFX0hfXwotI2RlZmluZSBfX0NGMkdMVUVfSF9fCi0KLQotLyogY29tbW9uIGluY2x1ZGVzIGZvciBvdGhlciBtb2R1bGVzICovCi0jaW5jbHVkZSAiY2YyZXJyb3IuaCIKLSNpbmNsdWRlICJjZjJmaXhlZC5oIgotI2luY2x1ZGUgImNmMmFycnN0LmgiCi0jaW5jbHVkZSAiY2YycmVhZC5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyogcmVuZGVyaW5nIHBhcmFtZXRlcnMgKi8KLQotICAvKiBhcHBseSBoaW50cyB0byByZW5kZXJlZCBnbHlwaHMgKi8KLSNkZWZpbmUgQ0YyX0ZsYWdzSGludGVkICAgIDEKLSAgLyogZm9yIHRlc3RpbmcgKi8KLSNkZWZpbmUgQ0YyX0ZsYWdzRGFya2VuZWQgIDIKLQotICAvKiB0eXBlIGZvciBob2xkaW5nIHRoZSBmbGFncyAqLwotICB0eXBlZGVmIENGMl9JbnQgIENGMl9SZW5kZXJpbmdGbGFnczsKLQotCi0gIC8qIGVsZW1lbnRzIG9mIGEgZ2x5cGggb3V0bGluZSAqLwotICB0eXBlZGVmIGVudW0gIENGMl9QYXRoT3BfCi0gIHsKLSAgICBDRjJfUGF0aE9wTW92ZVRvID0gMSwgICAgIC8qIGNoYW5nZSB0aGUgY3VycmVudCBwb2ludCAqLwotICAgIENGMl9QYXRoT3BMaW5lVG8gPSAyLCAgICAgLyogbGluZSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgQ0YyX1BhdGhPcFF1YWRUbyA9IDMsICAgICAvKiBxdWFkcmF0aWMgY3VydmUgICAgICAgICAgKi8KLSAgICBDRjJfUGF0aE9wQ3ViZVRvID0gNCAgICAgIC8qIGN1YmljIGN1cnZlICAgICAgICAgICAgICAqLwotCi0gIH0gQ0YyX1BhdGhPcDsKLQotCi0gIC8qIGEgbWF0cml4IG9mIGZpeGVkIHBvaW50IHZhbHVlcyAqLwotICB0eXBlZGVmIHN0cnVjdCAgQ0YyX01hdHJpeF8KLSAgewotICAgIENGMl9GMTZEb3QxNiAgYTsKLSAgICBDRjJfRjE2RG90MTYgIGI7Ci0gICAgQ0YyX0YxNkRvdDE2ICBjOwotICAgIENGMl9GMTZEb3QxNiAgZDsKLSAgICBDRjJfRjE2RG90MTYgIHR4OwotICAgIENGMl9GMTZEb3QxNiAgdHk7Ci0KLSAgfSBDRjJfTWF0cml4OwotCi0KLSAgLyogdGhlc2UgdHlwZWRlZnMgYXJlIG5lZWRlZCBieSBtb3JlIHRoYW4gb25lIGhlYWRlciBmaWxlICovCi0gIC8qIGFuZCBnY2MgY29tcGlsZXIgZG9lc24ndCBhbGxvdyByZWRlZmluaXRpb24gICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBDRjJfRm9udFJlY18gIENGMl9Gb250UmVjLCAqQ0YyX0ZvbnQ7Ci0gIHR5cGVkZWYgc3RydWN0IENGMl9IaW50UmVjXyAgQ0YyX0hpbnRSZWMsICpDRjJfSGludDsKLQotCi0gIC8qIEEgY29tbW9uIHN0cnVjdHVyZSBmb3IgYWxsIGNhbGxiYWNrIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU29tZSBtZW1iZXJzIG1heSBiZSB1bnVzZWQuICBGb3IgZXhhbXBsZSwgYHB0MCcgaXMgbm90IHVzZWQgZm9yICAgICAgICovCi0gIC8qIGBtb3ZlVG8nIGFuZCBgcHQzJyBpcyBub3QgdXNlZCBmb3IgYHF1YWRUbycuICBUaGUgaW5pdGlhbCBwb2ludCBgcHQwJyAqLwotICAvKiBpcyBpbmNsdWRlZCBmb3IgZWFjaCBwYXRoIGVsZW1lbnQgZm9yIGdlbmVyYWxpdHk7IGN1cnZlIGNvbnZlcnNpb25zICAgKi8KLSAgLyogbmVlZCBpdC4gIFRoZSBgb3AnIHBhcmFtZXRlciBhbGxvd3Mgb25lIGZ1bmN0aW9uIHRvIGhhbmRsZSBtdWx0aXBsZSAgICovCi0gIC8qIGVsZW1lbnQgdHlwZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIHR5cGVkZWYgc3RydWN0ICBDRjJfQ2FsbGJhY2tQYXJhbXNSZWNfCi0gIHsKLSAgICBGVF9WZWN0b3IgIHB0MDsKLSAgICBGVF9WZWN0b3IgIHB0MTsKLSAgICBGVF9WZWN0b3IgIHB0MjsKLSAgICBGVF9WZWN0b3IgIHB0MzsKLQotICAgIENGMl9JbnQgIG9wOwotCi0gIH0gQ0YyX0NhbGxiYWNrUGFyYW1zUmVjLCAqQ0YyX0NhbGxiYWNrUGFyYW1zOwotCi0KLSAgLyogZm9yd2FyZCByZWZlcmVuY2UgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgQ0YyX091dGxpbmVDYWxsYmFja3NSZWNfICBDRjJfT3V0bGluZUNhbGxiYWNrc1JlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQ0YyX091dGxpbmVDYWxsYmFja3M7Ci0KLSAgLyogY2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcnMgKi8KLSAgdHlwZWRlZiB2b2lkCi0gICgqQ0YyX0NhbGxiYWNrX1R5cGUpKCBDRjJfT3V0bGluZUNhbGxiYWNrcyAgICAgIGNhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGMl9DYWxsYmFja1BhcmFtcyAgcGFyYW1zICk7Ci0KLQotICBzdHJ1Y3QgIENGMl9PdXRsaW5lQ2FsbGJhY2tzUmVjXwotICB7Ci0gICAgQ0YyX0NhbGxiYWNrX1R5cGUgIG1vdmVUbzsKLSAgICBDRjJfQ2FsbGJhY2tfVHlwZSAgbGluZVRvOwotICAgIENGMl9DYWxsYmFja19UeXBlICBxdWFkVG87Ci0gICAgQ0YyX0NhbGxiYWNrX1R5cGUgIGN1YmVUbzsKLQotICAgIENGMl9JbnQgIHdpbmRpbmdNb21lbnR1bTsgICAgLyogZm9yIHdpbmRpbmcgb3JkZXIgZGV0ZWN0aW9uICovCi0KLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLSAgICBGVF9FcnJvciogIGVycm9yOwotICB9OwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19DRjJHTFVFX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJoaW50cy5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJoaW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTI3MDAwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyaGludHMuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2YyaGludHMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFkb2JlJ3MgY29kZSBmb3IgaGFuZGxpbmcgQ0ZGIGhpbnRzIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LTIwMTQgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvciAgICAgICAqLwotLyogIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkICAgICAgKi8KLS8qICBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZSAgICovCi0vKiAgdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCAgICAqLwotLyogIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cyAgICovCi0vKiAgdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSAgICAqLwotLyogIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvciAgICAgKi8KLS8qICAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgICAgICAgICAgICAgICovCi0vKiAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCAgICAqLwotLyogIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kICAgICAgKi8KLS8qICBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgICovCi0vKiAgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgICAgICAqLwotLyogIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgICAgKi8KLS8qICBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMgICAgICAgICovCi0vKiAgc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgICAgICAqLwotLyogIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0ICAgKi8KLS8qICB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzICAgICovCi0vKiAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgICAqLwotLyogIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAgKi8KLS8qICB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgICAgKi8KLS8qICBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAgICAgICAgICAgICAgICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLCAgICAqLwotLyogIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlICJjZjJmdC5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0jaW5jbHVkZSAiY2YyZ2x1ZS5oIgotI2luY2x1ZGUgImNmMmZvbnQuaCIKLSNpbmNsdWRlICJjZjJoaW50cy5oIgotI2luY2x1ZGUgImNmMmludHJwLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9jZjJoaW50cwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGMl9IaW50TW92ZVJlY18KLSAgewotICAgIHNpemVfdCAgICAgajsgICAgICAgICAgLyogaW5kZXggb2YgdXBwZXIgaGludCBtYXAgZWRnZSAgICovCi0gICAgQ0YyX0ZpeGVkICBtb3ZlVXA7ICAgICAvKiBhZGp1c3RtZW50IHRvIG9wdGltdW0gcG9zaXRpb24gKi8KLQotICB9IENGMl9IaW50TW92ZVJlYywgKkNGMl9IaW50TW92ZTsKLQotCi0gIC8qIENvbXB1dGUgYW5ndWxhciBtb21lbnR1bSBmb3Igd2luZGluZyBvcmRlciBkZXRlY3Rpb24uICBJdCBpcyBjYWxsZWQgKi8KLSAgLyogZm9yIGFsbCBsaW5lcyBhbmQgY3VydmVzLCBidXQgbm90IG5lY2Vzc2FyaWx5IGluIGVsZW1lbnQgb3JkZXIuICAgICAqLwotICBzdGF0aWMgQ0YyX0ludAotICBjZjJfZ2V0V2luZGluZ01vbWVudHVtKCBDRjJfRml4ZWQgIHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgIHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgIHkyICkKLSAgewotICAgIC8qIGNyb3NzIHByb2R1Y3Qgb2YgcHQxIHBvc2l0aW9uIGZyb20gb3JpZ2luIHdpdGggcHQyIHBvc2l0aW9uIGZyb20gICovCi0gICAgLyogcHQxOyB3ZSByZWR1Y2UgdGhlIHByZWNpc2lvbiBzbyB0aGF0IHRoZSByZXN1bHQgZml0cyBpbnRvIDMyIGJpdHMgKi8KLQotICAgIHJldHVybiAoIHgxID4+IDE2ICkgKiAoICggeTIgLSB5MSApID4+IDE2ICkgLQotICAgICAgICAgICAoIHkxID4+IDE2ICkgKiAoICggeDIgLSB4MSApID4+IDE2ICk7Ci0gIH0KLQotCi0gIC8qCi0gICAqIENvbnN0cnVjdCBmcm9tIGEgU3RlbUhpbnQ7IHRoaXMgaXMgdXNlZCBhcyBhIHBhcmFtZXRlciB0bwotICAgKiBgY2YyX2JsdWVzX2NhcHR1cmUnLgotICAgKiBgaGludE9yaWdpbicgaXMgdGhlIGNoYXJhY3RlciBzcGFjZSBkaXNwbGFjZW1lbnQgb2YgYSBzZWFjIGFjY2VudC4KLSAgICogQWRqdXN0IHN0ZW0gaGludCBmb3IgZGFya2VuaW5nIGhlcmUuCi0gICAqCi0gICAqLwotICBzdGF0aWMgdm9pZAotICBjZjJfaGludF9pbml0KCBDRjJfSGludCAgICAgICAgICAgIGhpbnQsCi0gICAgICAgICAgICAgICAgIGNvbnN0IENGMl9BcnJTdGFjayAgc3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICBpbmRleFN0ZW1IaW50LAotICAgICAgICAgICAgICAgICBjb25zdCBDRjJfRm9udCAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgICAgICAgaGludE9yaWdpbiwKLSAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgICAgICBzY2FsZSwKLSAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgICAgICBib3R0b20gKQotICB7Ci0gICAgQ0YyX0ZpeGVkICAgICAgICAgICAgICAgd2lkdGg7Ci0gICAgY29uc3QgQ0YyX1N0ZW1IaW50UmVjKiAgc3RlbUhpbnQ7Ci0KLQotICAgIEZUX1pFUk8oIGhpbnQgKTsKLQotICAgIHN0ZW1IaW50ID0gKGNvbnN0IENGMl9TdGVtSGludFJlYyopY2YyX2FycnN0YWNrX2dldFBvaW50ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4U3RlbUhpbnQgKTsKLQotICAgIHdpZHRoID0gc3RlbUhpbnQtPm1heCAtIHN0ZW1IaW50LT5taW47Ci0KLSAgICBpZiAoIHdpZHRoID09IGNmMl9pbnRUb0ZpeGVkKCAtMjEgKSApCi0gICAgewotICAgICAgLyogZ2hvc3QgYm90dG9tICovCi0KLSAgICAgIGlmICggYm90dG9tICkKLSAgICAgIHsKLSAgICAgICAgaGludC0+Y3NDb29yZCA9IHN0ZW1IaW50LT5tYXg7Ci0gICAgICAgIGhpbnQtPmZsYWdzICAgPSBDRjJfR2hvc3RCb3R0b207Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGhpbnQtPmZsYWdzID0gMDsKLSAgICB9Ci0KLSAgICBlbHNlIGlmICggd2lkdGggPT0gY2YyX2ludFRvRml4ZWQoIC0yMCApICkKLSAgICB7Ci0gICAgICAvKiBnaG9zdCB0b3AgKi8KLQotICAgICAgaWYgKCBib3R0b20gKQotICAgICAgICBoaW50LT5mbGFncyA9IDA7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGhpbnQtPmNzQ29vcmQgPSBzdGVtSGludC0+bWluOwotICAgICAgICBoaW50LT5mbGFncyAgID0gQ0YyX0dob3N0VG9wOwotICAgICAgfQotICAgIH0KLQotICAgIGVsc2UgaWYgKCB3aWR0aCA8IDAgKQotICAgIHsKLSAgICAgIC8qIGludmVydGVkIHBhaXIgKi8KLQotICAgICAgLyoKLSAgICAgICAqIEhpbnRzIHdpdGggbmVnYXRpdmUgd2lkdGhzIHdlcmUgcHJvZHVjZWQgYnkgYW4gZWFybHkgdmVyc2lvbiBvZiBhCi0gICAgICAgKiBub24tQWRvYmUgZm9udCB0b29sLiAgVGhlIFR5cGUgMiBzcGVjIGFsbG93cyBlZGdlIChnaG9zdCkgaGludHMKLSAgICAgICAqIHdpdGggbmVnYXRpdmUgd2lkdGhzLCBidXQgc2F5cwotICAgICAgICoKLSAgICAgICAqICAgQWxsIG90aGVyIG5lZ2F0aXZlIHdpZHRocyBoYXZlIHVuZGVmaW5lZCBtZWFuaW5nLgotICAgICAgICoKLSAgICAgICAqIENvb2xUeXBlIGhhcyBhIHNpbGVudCB3b3JrYXJvdW5kIHRoYXQgbmVnYXRlcyB0aGUgaGludCB3aWR0aDsgZm9yCi0gICAgICAgKiBwZXJtaXNzaXZlIG1vZGUsIHdlIGRvIHRoZSBzYW1lIGhlcmUuCi0gICAgICAgKgotICAgICAgICogTm90ZTogU3VjaCBmb250cyBjYW5ub3QgdXNlIGdob3N0IGhpbnRzLCBidXQgc2hvdWxkIG90aGVyd2lzZSB3b3JrLgotICAgICAgICogTm90ZTogU29tZSBwb29yIGhpbnRzIGluIG91ciBmYXV4IGZvbnRzIGNhbiBwcm9kdWNlIG5lZ2F0aXZlCi0gICAgICAgKiAgICAgICB3aWR0aHMgYXQgc29tZSBibGVuZHMuICBGb3IgZXhhbXBsZSwgc2VlIGEgbGlnaHQgd2VpZ2h0IG9mCi0gICAgICAgKiAgICAgICBgdScgaW4gQVNlcmlmTU0uCi0gICAgICAgKgotICAgICAgICovCi0gICAgICBpZiAoIGJvdHRvbSApCi0gICAgICB7Ci0gICAgICAgIGhpbnQtPmNzQ29vcmQgPSBzdGVtSGludC0+bWF4OwotICAgICAgICBoaW50LT5mbGFncyAgID0gQ0YyX1BhaXJCb3R0b207Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGhpbnQtPmNzQ29vcmQgPSBzdGVtSGludC0+bWluOwotICAgICAgICBoaW50LT5mbGFncyAgID0gQ0YyX1BhaXJUb3A7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIG5vcm1hbCBwYWlyICovCi0KLSAgICAgIGlmICggYm90dG9tICkKLSAgICAgIHsKLSAgICAgICAgaGludC0+Y3NDb29yZCA9IHN0ZW1IaW50LT5taW47Ci0gICAgICAgIGhpbnQtPmZsYWdzICAgPSBDRjJfUGFpckJvdHRvbTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaGludC0+Y3NDb29yZCA9IHN0ZW1IaW50LT5tYXg7Ci0gICAgICAgIGhpbnQtPmZsYWdzICAgPSBDRjJfUGFpclRvcDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBOb3cgdGhhdCBnaG9zdCBoaW50cyBoYXZlIGJlZW4gZGV0ZWN0ZWQsIGFkanVzdCB0aGlzIGVkZ2UgZm9yICAgICAgKi8KLSAgICAvKiBkYXJrZW5pbmcuICBCb3R0b21zIGFyZSBub3QgY2hhbmdlZDsgdG9wcyBhcmUgaW5jcmVtZW50ZWQgYnkgdHdpY2UgKi8KLSAgICAvKiBgZGFya2VuWScuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGNmMl9oaW50X2lzVG9wKCBoaW50ICkgKQotICAgICAgaGludC0+Y3NDb29yZCArPSAyICogZm9udC0+ZGFya2VuWTsKLQotICAgIGhpbnQtPmNzQ29vcmQgKz0gaGludE9yaWdpbjsKLSAgICBoaW50LT5zY2FsZSAgICA9IHNjYWxlOwotICAgIGhpbnQtPmluZGV4ICAgID0gaW5kZXhTdGVtSGludDsgICAvKiBpbmRleCBpbiBvcmlnaW5hbCBzdGVtIGhpbnQgYXJyYXkgKi8KLQotICAgIC8qIGlmIG9yaWdpbmFsIHN0ZW0gaGludCBoYXMgYmVlbiB1c2VkLCB1c2UgdGhlIHNhbWUgcG9zaXRpb24gKi8KLSAgICBpZiAoIGhpbnQtPmZsYWdzICE9IDAgJiYgc3RlbUhpbnQtPnVzZWQgKQotICAgIHsKLSAgICAgIGlmICggY2YyX2hpbnRfaXNUb3AoIGhpbnQgKSApCi0gICAgICAgIGhpbnQtPmRzQ29vcmQgPSBzdGVtSGludC0+bWF4RFM7Ci0gICAgICBlbHNlCi0gICAgICAgIGhpbnQtPmRzQ29vcmQgPSBzdGVtSGludC0+bWluRFM7Ci0KLSAgICAgIGNmMl9oaW50X2xvY2soIGhpbnQgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgaGludC0+ZHNDb29yZCA9IEZUX011bEZpeCggaGludC0+Y3NDb29yZCwgc2NhbGUgKTsKLSAgfQotCi0KLSAgLyogaW5pdGlhbGl6ZSBhbiBpbnZhbGlkIGhpbnQgbWFwIGVsZW1lbnQgKi8KLSAgc3RhdGljIHZvaWQKLSAgY2YyX2hpbnRfaW5pdFplcm8oIENGMl9IaW50ICBoaW50ICkKLSAgewotICAgIEZUX1pFUk8oIGhpbnQgKTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9Cb29sICkKLSAgY2YyX2hpbnRfaXNWYWxpZCggY29uc3QgQ0YyX0hpbnQgIGhpbnQgKQotICB7Ci0gICAgcmV0dXJuIChGVF9Cb29sKSggaGludC0+ZmxhZ3MgIT0gMCApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfQm9vbAotICBjZjJfaGludF9pc1BhaXIoIGNvbnN0IENGMl9IaW50ICBoaW50ICkKLSAgewotICAgIHJldHVybiAoRlRfQm9vbCkoICggaGludC0+ZmxhZ3MgICAgICAgICAgICAgICAgICAgICAgJgotICAgICAgICAgICAgICAgICAgICAgICAgKCBDRjJfUGFpckJvdHRvbSB8IENGMl9QYWlyVG9wICkgKSAhPSAwICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9Cb29sCi0gIGNmMl9oaW50X2lzUGFpclRvcCggY29uc3QgQ0YyX0hpbnQgIGhpbnQgKQotICB7Ci0gICAgcmV0dXJuIChGVF9Cb29sKSggKCBoaW50LT5mbGFncyAmIENGMl9QYWlyVG9wICkgIT0gMCApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Jvb2wgKQotICBjZjJfaGludF9pc1RvcCggY29uc3QgQ0YyX0hpbnQgIGhpbnQgKQotICB7Ci0gICAgcmV0dXJuIChGVF9Cb29sKSggKCBoaW50LT5mbGFncyAgICAgICAgICAgICAgICAgICAgJgotICAgICAgICAgICAgICAgICAgICAgICAgKCBDRjJfUGFpclRvcCB8IENGMl9HaG9zdFRvcCApICkgIT0gMCApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Jvb2wgKQotICBjZjJfaGludF9pc0JvdHRvbSggY29uc3QgQ0YyX0hpbnQgIGhpbnQgKQotICB7Ci0gICAgcmV0dXJuIChGVF9Cb29sKSggKCBoaW50LT5mbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgJgotICAgICAgICAgICAgICAgICAgICAgICAgKCBDRjJfUGFpckJvdHRvbSB8IENGMl9HaG9zdEJvdHRvbSApICkgIT0gMCApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfQm9vbAotICBjZjJfaGludF9pc0xvY2tlZCggY29uc3QgQ0YyX0hpbnQgIGhpbnQgKQotICB7Ci0gICAgcmV0dXJuIChGVF9Cb29sKSggKCBoaW50LT5mbGFncyAmIENGMl9Mb2NrZWQgKSAhPSAwICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9Cb29sCi0gIGNmMl9oaW50X2lzU3ludGhldGljKCBjb25zdCBDRjJfSGludCAgaGludCApCi0gIHsKLSAgICByZXR1cm4gKEZUX0Jvb2wpKCAoIGhpbnQtPmZsYWdzICYgQ0YyX1N5bnRoZXRpYyApICE9IDAgKTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX2hpbnRfbG9jayggQ0YyX0hpbnQgIGhpbnQgKQotICB7Ci0gICAgaGludC0+ZmxhZ3MgfD0gQ0YyX0xvY2tlZDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX2hpbnRtYXBfaW5pdCggQ0YyX0hpbnRNYXAgICBoaW50bWFwLAotICAgICAgICAgICAgICAgICAgICBDRjJfRm9udCAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgIENGMl9IaW50TWFwICAgaW5pdGlhbE1hcCwKLSAgICAgICAgICAgICAgICAgICAgQ0YyX0FyclN0YWNrICBoaW50TW92ZXMsCi0gICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgc2NhbGUgKQotICB7Ci0gICAgRlRfWkVSTyggaGludG1hcCApOwotCi0gICAgLyogY29weSBwYXJhbWV0ZXJzIGZyb20gZm9udCBpbnN0YW5jZSAqLwotICAgIGhpbnRtYXAtPmhpbnRlZCAgICAgICAgID0gZm9udC0+aGludGVkOwotICAgIGhpbnRtYXAtPnNjYWxlICAgICAgICAgID0gc2NhbGU7Ci0gICAgaGludG1hcC0+Zm9udCAgICAgICAgICAgPSBmb250OwotICAgIGhpbnRtYXAtPmluaXRpYWxIaW50TWFwID0gaW5pdGlhbE1hcDsKLSAgICAvKiB3aWxsIGNsZWFyIGluIGBjZjJfaGludG1hcF9hZGp1c3RIaW50cycgKi8KLSAgICBoaW50bWFwLT5oaW50TW92ZXMgICAgICA9IGhpbnRNb3ZlczsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Jvb2wKLSAgY2YyX2hpbnRtYXBfaXNWYWxpZCggY29uc3QgQ0YyX0hpbnRNYXAgIGhpbnRtYXAgKQotICB7Ci0gICAgcmV0dXJuIGhpbnRtYXAtPmlzVmFsaWQ7Ci0gIH0KLQotCi0gIC8qIHRyYW5zZm9ybSBjaGFyYWN0ZXIgc3BhY2UgY29vcmRpbmF0ZSB0byBkZXZpY2Ugc3BhY2UgdXNpbmcgaGludCBtYXAgKi8KLSAgc3RhdGljIENGMl9GaXhlZAotICBjZjJfaGludG1hcF9tYXAoIENGMl9IaW50TWFwICBoaW50bWFwLAotICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICBjc0Nvb3JkICkKLSAgewotICAgIGlmICggaGludG1hcC0+Y291bnQgPT0gMCB8fCAhIGhpbnRtYXAtPmhpbnRlZCApCi0gICAgewotICAgICAgLyogdGhlcmUgYXJlIG5vIGhpbnRzOyB1c2UgdW5pZm9ybSBzY2FsZSBhbmQgemVybyBvZmZzZXQgKi8KLSAgICAgIHJldHVybiBGVF9NdWxGaXgoIGNzQ29vcmQsIGhpbnRtYXAtPnNjYWxlICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBzdGFydCBsaW5lYXIgc2VhcmNoIGZyb20gbGFzdCBoaXQgKi8KLSAgICAgIENGMl9VSW50ICBpID0gaGludG1hcC0+bGFzdEluZGV4OwotCi0gICAgICBGVF9BU1NFUlQoIGhpbnRtYXAtPmxhc3RJbmRleCA8IENGMl9NQVhfSElOVF9FREdFUyApOwotCi0gICAgICAvKiBzZWFyY2ggdXAgKi8KLSAgICAgIHdoaWxlICggaSA8IGhpbnRtYXAtPmNvdW50IC0gMSAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgIGNzQ29vcmQgPj0gaGludG1hcC0+ZWRnZVtpICsgMV0uY3NDb29yZCApCi0gICAgICAgIGkgKz0gMTsKLQotICAgICAgLyogc2VhcmNoIGRvd24gKi8KLSAgICAgIHdoaWxlICggaSA+IDAgJiYgY3NDb29yZCA8IGhpbnRtYXAtPmVkZ2VbaV0uY3NDb29yZCApCi0gICAgICAgIGkgLT0gMTsKLQotICAgICAgaGludG1hcC0+bGFzdEluZGV4ID0gaTsKLQotICAgICAgaWYgKCBpID09IDAgJiYgY3NDb29yZCA8IGhpbnRtYXAtPmVkZ2VbMF0uY3NDb29yZCApCi0gICAgICB7Ci0gICAgICAgIC8qIHNwZWNpYWwgY2FzZSBmb3IgcG9pbnRzIGJlbG93IGZpcnN0IGVkZ2U6IHVzZSB1bmlmb3JtIHNjYWxlICovCi0gICAgICAgIHJldHVybiBGVF9NdWxGaXgoIGNzQ29vcmQgLSBoaW50bWFwLT5lZGdlWzBdLmNzQ29vcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRtYXAtPnNjYWxlICkgKwotICAgICAgICAgICAgICAgICBoaW50bWFwLT5lZGdlWzBdLmRzQ29vcmQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIE5vdGU6IGVudHJpZXMgd2l0aCBkdXBsaWNhdGUgY3NDb29yZCBhcmUgYWxsb3dlZC4KLSAgICAgICAgICogVXNlIGVkZ2VbaV0sIHRoZSBoaWdoZXN0IGVudHJ5IHdoZXJlIGNzQ29vcmQgPj0gZW50cnlbaV0uY3NDb29yZAotICAgICAgICAgKi8KLSAgICAgICAgcmV0dXJuIEZUX011bEZpeCggY3NDb29yZCAtIGhpbnRtYXAtPmVkZ2VbaV0uY3NDb29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaGludG1hcC0+ZWRnZVtpXS5zY2FsZSApICsKLSAgICAgICAgICAgICAgICAgaGludG1hcC0+ZWRnZVtpXS5kc0Nvb3JkOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyoKLSAgICogVGhpcyBoaW50aW5nIHBvbGljeSBtb3ZlcyBhIGhpbnQgcGFpciBpbiBkZXZpY2Ugc3BhY2Ugc28gdGhhdCBvbmUgb2YKLSAgICogaXRzIHR3byBlZGdlcyBpcyBvbiBhIGRldmljZSBwaXhlbCBib3VuZGFyeSAoaXRzIGZyYWN0aW9uYWwgcGFydCBpcwotICAgKiB6ZXJvKS4gIGBjZjJfaGludG1hcF9pbnNlcnRIaW50JyBndWFyYW50ZWVzIG5vIG92ZXJsYXAgaW4gQ1MKLSAgICogc3BhY2UuICBFbnN1cmUgaGVyZSB0aGF0IHRoZXJlIGlzIG5vIG92ZXJsYXAgaW4gRFMuCi0gICAqCi0gICAqIEluIHRoZSBmaXJzdCBwYXNzLCBlZGdlcyBhcmUgYWRqdXN0ZWQgcmVsYXRpdmUgdG8gYWRqYWNlbnQgaGludHMuCi0gICAqIFRob3NlIHRoYXQgYXJlIGJlbG93IGhhdmUgYWxyZWFkeSBiZWVuIGFkanVzdGVkLiAgVGhvc2UgdGhhdCBhcmUKLSAgICogYWJvdmUgaGF2ZSBub3QgeWV0IGJlZW4gYWRqdXN0ZWQuICBJZiBhIGhpbnQgYWJvdmUgYmxvY2tzIGFuCi0gICAqIGFkanVzdG1lbnQgdG8gYW4gb3B0aW1hbCBwb3NpdGlvbiwgd2Ugd2lsbCB0cnkgYWdhaW4gaW4gYSBzZWNvbmQKLSAgICogcGFzcy4gIFRoZSBzZWNvbmQgcGFzcyBpcyB0b3AtZG93bi4KLSAgICoKLSAgICovCi0KLSAgc3RhdGljIHZvaWQKLSAgY2YyX2hpbnRtYXBfYWRqdXN0SGludHMoIENGMl9IaW50TWFwICBoaW50bWFwICkKLSAgewotICAgIHNpemVfdCAgaSwgajsKLQotCi0gICAgY2YyX2FycnN0YWNrX2NsZWFyKCBoaW50bWFwLT5oaW50TW92ZXMgKTsgICAgICAvKiB3b3JraW5nIHN0b3JhZ2UgKi8KLQotICAgIC8qCi0gICAgICogRmlyc3QgcGFzcyBpcyBib3R0b20tdXAgKGZvbnQgaGludCBvcmRlcikgd2l0aG91dCBsb29rLWFoZWFkLgotICAgICAqIExvY2tlZCBlZGdlcyBhcmUgYWxyZWFkeSBhZGp1c3RlZC4KLSAgICAgKiBVbmxvY2tlZCBlZGdlcyBiZWdpbiB3aXRoIGRzQ29vcmQgZnJvbSBgaW5pdGlhbEhpbnRNYXAnLgotICAgICAqIFNhdmUgZWRnZXMgdGhhdCBhcmUgbm90IG9wdGltYWxseSBhZGp1c3RlZCBpbiBgaGludE1vdmVzJyBhcnJheSwKLSAgICAgKiBhbmQgcHJvY2VzcyB0aGVtIGluIHNlY29uZCBwYXNzLgotICAgICAqLwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBoaW50bWFwLT5jb3VudDsgaSsrICkKLSAgICB7Ci0gICAgICBGVF9Cb29sICBpc1BhaXIgPSBjZjJfaGludF9pc1BhaXIoICZoaW50bWFwLT5lZGdlW2ldICk7Ci0KLQotICAgICAgLyogaW5kZXggb2YgdXBwZXIgZWRnZSAoc2FtZSB2YWx1ZSBmb3IgZ2hvc3QgaGludCkgKi8KLSAgICAgIGogPSBpc1BhaXIgPyBpICsgMSA6IGk7Ci0KLSAgICAgIEZUX0FTU0VSVCggaiA8IGhpbnRtYXAtPmNvdW50ICk7Ci0gICAgICBGVF9BU1NFUlQoIGNmMl9oaW50X2lzVmFsaWQoICZoaW50bWFwLT5lZGdlW2ldICkgKTsKLSAgICAgIEZUX0FTU0VSVCggY2YyX2hpbnRfaXNWYWxpZCggJmhpbnRtYXAtPmVkZ2Vbal0gKSApOwotICAgICAgRlRfQVNTRVJUKCBjZjJfaGludF9pc0xvY2tlZCggJmhpbnRtYXAtPmVkZ2VbaV0gKSA9PQotICAgICAgICAgICAgICAgICAgIGNmMl9oaW50X2lzTG9ja2VkKCAmaGludG1hcC0+ZWRnZVtqXSApICk7Ci0KLSAgICAgIGlmICggIWNmMl9oaW50X2lzTG9ja2VkKCAmaGludG1hcC0+ZWRnZVtpXSApICkKLSAgICAgIHsKLSAgICAgICAgLyogaGludCBlZGdlIGlzIG5vdCBsb2NrZWQsIHdlIGNhbiBhZGp1c3QgaXQgKi8KLSAgICAgICAgQ0YyX0ZpeGVkICBmcmFjRG93biA9IGNmMl9maXhlZEZyYWN0aW9uKCBoaW50bWFwLT5lZGdlW2ldLmRzQ29vcmQgKTsKLSAgICAgICAgQ0YyX0ZpeGVkICBmcmFjVXAgICA9IGNmMl9maXhlZEZyYWN0aW9uKCBoaW50bWFwLT5lZGdlW2pdLmRzQ29vcmQgKTsKLQotICAgICAgICAvKiBjYWxjdWxhdGUgYWxsIGZvdXIgcG9zc2liaWxpdGllczsgbW92ZXMgZG93biBhcmUgbmVnYXRpdmUgKi8KLSAgICAgICAgQ0YyX0ZpeGVkICBkb3duTW92ZURvd24gPSAwIC0gZnJhY0Rvd247Ci0gICAgICAgIENGMl9GaXhlZCAgdXBNb3ZlRG93biAgID0gMCAtIGZyYWNVcDsKLSAgICAgICAgQ0YyX0ZpeGVkICBkb3duTW92ZVVwICAgPSBmcmFjRG93biA9PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY2YyX2ludFRvRml4ZWQoIDEgKSAtIGZyYWNEb3duOwotICAgICAgICBDRjJfRml4ZWQgIHVwTW92ZVVwICAgICA9IGZyYWNVcCA9PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY2YyX2ludFRvRml4ZWQoIDEgKSAtIGZyYWNVcDsKLQotICAgICAgICAvKiBzbWFsbGVzdCBtb3ZlIHVwICovCi0gICAgICAgIENGMl9GaXhlZCAgbW92ZVVwICAgPSBGVF9NSU4oIGRvd25Nb3ZlVXAsIHVwTW92ZVVwICk7Ci0gICAgICAgIC8qIHNtYWxsZXN0IG1vdmUgZG93biAqLwotICAgICAgICBDRjJfRml4ZWQgIG1vdmVEb3duID0gRlRfTUFYKCBkb3duTW92ZURvd24sIHVwTW92ZURvd24gKTsKLQotICAgICAgICAvKiBmaW5hbCBhbW91bnQgdG8gbW92ZSBlZGdlIG9yIGVkZ2UgcGFpciAqLwotICAgICAgICBDRjJfRml4ZWQgIG1vdmU7Ci0KLSAgICAgICAgQ0YyX0ZpeGVkICBkb3duTWluQ291bnRlciA9IENGMl9NSU5fQ09VTlRFUjsKLSAgICAgICAgQ0YyX0ZpeGVkICB1cE1pbkNvdW50ZXIgICA9IENGMl9NSU5fQ09VTlRFUjsKLSAgICAgICAgRlRfQm9vbCAgICBzYXZlRWRnZSAgICAgICA9IEZBTFNFOwotCi0KLSAgICAgICAgLyogbWluaW11bSBjb3VudGVyIGNvbnN0cmFpbnQgZG9lc24ndCBhcHBseSB3aGVuIGFkamFjZW50IGVkZ2VzICovCi0gICAgICAgIC8qIGFyZSBzeW50aGV0aWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBUT0RPOiBkb2Vzbid0IHNlZW0gYSBiaWcgZWZmZWN0OyBmb3Igbm93LCByZWR1Y2UgdGhlIGNvZGUgICAgKi8KLSNpZiAwCi0gICAgICAgIGlmICggaSA9PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgY2YyX2hpbnRfaXNTeW50aGV0aWMoICZoaW50bWFwLT5lZGdlW2kgLSAxXSApICkKLSAgICAgICAgICBkb3duTWluQ291bnRlciA9IDA7Ci0KLSAgICAgICAgaWYgKCBqID49IGhpbnRtYXAtPmNvdW50IC0gMSAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICBjZjJfaGludF9pc1N5bnRoZXRpYyggJmhpbnRtYXAtPmVkZ2VbaiArIDFdICkgKQotICAgICAgICAgIHVwTWluQ291bnRlciA9IDA7Ci0jZW5kaWYKLQotICAgICAgICAvKiBpcyB0aGVyZSByb29tIHRvIG1vdmUgdXA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogdGhlcmUgaXMgaWYgd2UgYXJlIGF0IHRvcCBvZiBhcnJheSBvciB0aGUgbmV4dCBlZGdlIGlzIGF0IG9yICovCi0gICAgICAgIC8qIGJleW9uZCBwcm9wb3NlZCBtb3ZlIHVwPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIGogPj0gaGludG1hcC0+Y291bnQgLSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgaGludG1hcC0+ZWRnZVtqICsgMV0uZHNDb29yZCA+PQotICAgICAgICAgICAgICAgaGludG1hcC0+ZWRnZVtqXS5kc0Nvb3JkICsgbW92ZVVwICsgdXBNaW5Db3VudGVyICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHRoZXJlIGlzIHJvb20gdG8gbW92ZSB1cDsgaXMgdGhlcmUgYWxzbyByb29tIHRvIG1vdmUgZG93bj8gKi8KLSAgICAgICAgICBpZiAoIGkgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgaGludG1hcC0+ZWRnZVtpIC0gMV0uZHNDb29yZCA8PQotICAgICAgICAgICAgICAgICBoaW50bWFwLT5lZGdlW2ldLmRzQ29vcmQgKyBtb3ZlRG93biAtIGRvd25NaW5Db3VudGVyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBtb3ZlIHNtYWxsZXIgYWJzb2x1dGUgYW1vdW50ICovCi0gICAgICAgICAgICBtb3ZlID0gKCAtbW92ZURvd24gPCBtb3ZlVXAgKSA/IG1vdmVEb3duIDogbW92ZVVwOyAgLyogb3B0aW11bSAqLwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBtb3ZlID0gbW92ZVVwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8qIGlzIHRoZXJlIHJvb20gdG8gbW92ZSBkb3duPyAqLwotICAgICAgICAgIGlmICggaSA9PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICBoaW50bWFwLT5lZGdlW2kgLSAxXS5kc0Nvb3JkIDw9Ci0gICAgICAgICAgICAgICAgIGhpbnRtYXAtPmVkZ2VbaV0uZHNDb29yZCArIG1vdmVEb3duIC0gZG93bk1pbkNvdW50ZXIgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1vdmUgICAgID0gbW92ZURvd247Ci0gICAgICAgICAgICAvKiB0cnVlIGlmIG5vbi1vcHRpbXVtIG1vdmUgKi8KLSAgICAgICAgICAgIHNhdmVFZGdlID0gKEZUX0Jvb2wpKCBtb3ZlVXAgPCAtbW92ZURvd24gKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIG5vIHJvb20gdG8gbW92ZSBlaXRoZXIgd2F5IHdpdGhvdXQgb3ZlcmxhcHBpbmcgb3IgcmVkdWNpbmcgKi8KLSAgICAgICAgICAgIC8qIHRoZSBjb3VudGVyIHRvbyBtdWNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIG1vdmUgICAgID0gMDsKLSAgICAgICAgICAgIHNhdmVFZGdlID0gVFJVRTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBJZGVudGlmeSBub24tbW92ZXMgYW5kIG1vdmVzIGRvd24gdGhhdCBhcmVuJ3Qgb3B0aW1hbCwgYW5kIHNhdmUgKi8KLSAgICAgICAgLyogdGhlbSBmb3Igc2Vjb25kIHBhc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIERvIHRoaXMgb25seSBpZiB0aGVyZSBpcyBhbiB1bmxvY2tlZCBlZGdlIGFib3ZlICh3aGljaCBjb3VsZCAgICAqLwotICAgICAgICAvKiBwb3NzaWJseSBtb3ZlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBzYXZlRWRnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgaiA8IGhpbnRtYXAtPmNvdW50IC0gMSAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICFjZjJfaGludF9pc0xvY2tlZCggJmhpbnRtYXAtPmVkZ2VbaiArIDFdICkgKQotICAgICAgICB7Ci0gICAgICAgICAgQ0YyX0hpbnRNb3ZlUmVjICBzYXZlZE1vdmU7Ci0KLQotICAgICAgICAgIHNhdmVkTW92ZS5qICAgICAgPSBqOwotICAgICAgICAgIC8qIGRlc2lyZWQgYWRqdXN0bWVudCBpbiBzZWNvbmQgcGFzcyAqLwotICAgICAgICAgIHNhdmVkTW92ZS5tb3ZlVXAgPSBtb3ZlVXAgLSBtb3ZlOwotCi0gICAgICAgICAgY2YyX2FycnN0YWNrX3B1c2goIGhpbnRtYXAtPmhpbnRNb3ZlcywgJnNhdmVkTW92ZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogbW92ZSB0aGUgZWRnZShzKSAqLwotICAgICAgICBoaW50bWFwLT5lZGdlW2ldLmRzQ29vcmQgKz0gbW92ZTsKLSAgICAgICAgaWYgKCBpc1BhaXIgKQotICAgICAgICAgIGhpbnRtYXAtPmVkZ2Vbal0uZHNDb29yZCArPSBtb3ZlOwotICAgICAgfQotCi0gICAgICAvKiBhc3NlcnQgdGhlcmUgYXJlIG5vIG92ZXJsYXBzIGluIGRldmljZSBzcGFjZSAqLwotICAgICAgRlRfQVNTRVJUKCBpID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICBoaW50bWFwLT5lZGdlW2kgLSAxXS5kc0Nvb3JkIDw9IGhpbnRtYXAtPmVkZ2VbaV0uZHNDb29yZCApOwotICAgICAgRlRfQVNTRVJUKCBpIDwgaiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgIGhpbnRtYXAtPmVkZ2VbaV0uZHNDb29yZCA8PSBoaW50bWFwLT5lZGdlW2pdLmRzQ29vcmQgKTsKLQotICAgICAgLyogYWRqdXN0IHRoZSBzY2FsZXMsIGF2b2lkaW5nIGRpdmlkZSBieSB6ZXJvICovCi0gICAgICBpZiAoIGkgPiAwICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBoaW50bWFwLT5lZGdlW2ldLmNzQ29vcmQgIT0gaGludG1hcC0+ZWRnZVtpIC0gMV0uY3NDb29yZCApCi0gICAgICAgICAgaGludG1hcC0+ZWRnZVtpIC0gMV0uc2NhbGUgPQotICAgICAgICAgICAgRlRfRGl2Rml4KAotICAgICAgICAgICAgICBoaW50bWFwLT5lZGdlW2ldLmRzQ29vcmQgLSBoaW50bWFwLT5lZGdlW2kgLSAxXS5kc0Nvb3JkLAotICAgICAgICAgICAgICBoaW50bWFwLT5lZGdlW2ldLmNzQ29vcmQgLSBoaW50bWFwLT5lZGdlW2kgLSAxXS5jc0Nvb3JkICk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggaXNQYWlyICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBoaW50bWFwLT5lZGdlW2pdLmNzQ29vcmQgIT0gaGludG1hcC0+ZWRnZVtqIC0gMV0uY3NDb29yZCApCi0gICAgICAgICAgaGludG1hcC0+ZWRnZVtqIC0gMV0uc2NhbGUgPQotICAgICAgICAgICAgRlRfRGl2Rml4KAotICAgICAgICAgICAgICBoaW50bWFwLT5lZGdlW2pdLmRzQ29vcmQgLSBoaW50bWFwLT5lZGdlW2ogLSAxXS5kc0Nvb3JkLAotICAgICAgICAgICAgICBoaW50bWFwLT5lZGdlW2pdLmNzQ29vcmQgLSBoaW50bWFwLT5lZGdlW2ogLSAxXS5jc0Nvb3JkICk7Ci0KLSAgICAgICAgaSArPSAxOyAgICAgLyogc2tpcCB1cHBlciBlZGdlIG9uIG5leHQgbG9vcCAqLwotICAgICAgfQotICAgIH0KLQotICAgIC8qIHNlY29uZCBwYXNzIHRyaWVzIHRvIG1vdmUgbm9uLW9wdGltYWwgaGludHMgdXAsIGluIGNhc2UgdGhlcmUgaXMgKi8KLSAgICAvKiByb29tIG5vdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZm9yICggaSA9IGNmMl9hcnJzdGFja19zaXplKCBoaW50bWFwLT5oaW50TW92ZXMgKTsgaSA+IDA7IGktLSApCi0gICAgewotICAgICAgQ0YyX0hpbnRNb3ZlICBoaW50TW92ZSA9IChDRjJfSGludE1vdmUpCi0gICAgICAgICAgICAgICAgICAgICAgY2YyX2FycnN0YWNrX2dldFBvaW50ZXIoIGhpbnRtYXAtPmhpbnRNb3ZlcywgaSAtIDEgKTsKLQotCi0gICAgICBqID0gaGludE1vdmUtPmo7Ci0KLSAgICAgIC8qIHRoaXMgd2FzIHRlc3RlZCBiZWZvcmUgdGhlIHB1c2gsIGFib3ZlICovCi0gICAgICBGVF9BU1NFUlQoIGogPCBoaW50bWFwLT5jb3VudCAtIDEgKTsKLQotICAgICAgLyogaXMgdGhlcmUgcm9vbSB0byBtb3ZlIHVwPyAqLwotICAgICAgaWYgKCBoaW50bWFwLT5lZGdlW2ogKyAxXS5kc0Nvb3JkID49Ci0gICAgICAgICAgICAgaGludG1hcC0+ZWRnZVtqXS5kc0Nvb3JkICsgaGludE1vdmUtPm1vdmVVcCArIENGMl9NSU5fQ09VTlRFUiApCi0gICAgICB7Ci0gICAgICAgIC8qIHRoZXJlIGlzIG1vcmUgcm9vbSBub3csIG1vdmUgZWRnZSB1cCAqLwotICAgICAgICBoaW50bWFwLT5lZGdlW2pdLmRzQ29vcmQgKz0gaGludE1vdmUtPm1vdmVVcDsKLQotICAgICAgICBpZiAoIGNmMl9oaW50X2lzUGFpciggJmhpbnRtYXAtPmVkZ2Vbal0gKSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9BU1NFUlQoIGogPiAwICk7Ci0gICAgICAgICAgaGludG1hcC0+ZWRnZVtqIC0gMV0uZHNDb29yZCArPSBoaW50TW92ZS0+bW92ZVVwOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKiBpbnNlcnQgaGludCBlZGdlcyBpbnRvIG1hcCwgc29ydGVkIGJ5IGNzQ29vcmQgKi8KLSAgc3RhdGljIHZvaWQKLSAgY2YyX2hpbnRtYXBfaW5zZXJ0SGludCggQ0YyX0hpbnRNYXAgIGhpbnRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9IaW50ICAgICBib3R0b21IaW50RWRnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0hpbnQgICAgIHRvcEhpbnRFZGdlICkKLSAgewotICAgIENGMl9VSW50ICBpbmRleEluc2VydDsKLQotICAgIC8qIHNldCBkZWZhdWx0IHZhbHVlcywgdGhlbiBjaGVjayBmb3IgZWRnZSBoaW50cyAqLwotICAgIEZUX0Jvb2wgICBpc1BhaXIgICAgICAgICA9IFRSVUU7Ci0gICAgQ0YyX0hpbnQgIGZpcnN0SGludEVkZ2UgID0gYm90dG9tSGludEVkZ2U7Ci0gICAgQ0YyX0hpbnQgIHNlY29uZEhpbnRFZGdlID0gdG9wSGludEVkZ2U7Ci0KLQotICAgIC8qIG9uZSBvciBub25lIG9mIHRoZSBpbnB1dCBwYXJhbXMgbWF5IGJlIGludmFsaWQgd2hlbiBkZWFsaW5nIHdpdGggKi8KLSAgICAvKiBlZGdlIGhpbnRzOyBhdCBsZWFzdCBvbmUgZWRnZSBtdXN0IGJlIHZhbGlkICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfQVNTRVJUKCBjZjJfaGludF9pc1ZhbGlkKCBib3R0b21IaW50RWRnZSApIHx8Ci0gICAgICAgICAgICAgICBjZjJfaGludF9pc1ZhbGlkKCB0b3BIaW50RWRnZSApICAgICk7Ci0KLSAgICAvKiBkZXRlcm1pbmUgaG93IG1hbnkgYW5kIHdoaWNoIGVkZ2VzIHRvIGluc2VydCAqLwotICAgIGlmICggIWNmMl9oaW50X2lzVmFsaWQoIGJvdHRvbUhpbnRFZGdlICkgKQotICAgIHsKLSAgICAgIC8qIGluc2VydCBvbmx5IHRoZSB0b3AgZWRnZSAqLwotICAgICAgZmlyc3RIaW50RWRnZSA9IHRvcEhpbnRFZGdlOwotICAgICAgaXNQYWlyICAgICAgICA9IEZBTFNFOwotICAgIH0KLSAgICBlbHNlIGlmICggIWNmMl9oaW50X2lzVmFsaWQoIHRvcEhpbnRFZGdlICkgKQotICAgIHsKLSAgICAgIC8qIGluc2VydCBvbmx5IHRoZSBib3R0b20gZWRnZSAqLwotICAgICAgaXNQYWlyID0gRkFMU0U7Ci0gICAgfQotCi0gICAgLyogcGFpcmVkIGVkZ2VzIG11c3QgYmUgaW4gcHJvcGVyIG9yZGVyICovCi0gICAgRlRfQVNTRVJUKCAhaXNQYWlyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgdG9wSGludEVkZ2UtPmNzQ29vcmQgPj0gYm90dG9tSGludEVkZ2UtPmNzQ29vcmQgKTsKLQotICAgIC8qIGxpbmVhciBzZWFyY2ggdG8gZmluZCBpbmRleCB2YWx1ZSBvZiBpbnNlcnRpb24gcG9pbnQgKi8KLSAgICBpbmRleEluc2VydCA9IDA7Ci0gICAgZm9yICggOyBpbmRleEluc2VydCA8IGhpbnRtYXAtPmNvdW50OyBpbmRleEluc2VydCsrICkKLSAgICB7Ci0gICAgICBpZiAoIGhpbnRtYXAtPmVkZ2VbaW5kZXhJbnNlcnRdLmNzQ29vcmQgPj0gZmlyc3RIaW50RWRnZS0+Y3NDb29yZCApCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRGlzY2FyZCBhbnkgaGludHMgdGhhdCBvdmVybGFwIGluIGNoYXJhY3RlciBzcGFjZS4gIE1vc3Qgb2Z0ZW4sIHRoaXMKLSAgICAgKiBpcyB3aGlsZSBidWlsZGluZyB0aGUgaW5pdGlhbCBtYXAsIHdoZXJlIGNhcHR1cmVkIGhpbnRzIGZyb20gYWxsCi0gICAgICogem9uZXMgYXJlIGNvbWJpbmVkLiAgRGVmaW5lIG92ZXJsYXAgdG8gaW5jbHVkZSBoaW50cyB0aGF0IGB0b3VjaCcKLSAgICAgKiAob3ZlcmxhcCB6ZXJvKS4gIEhpcmFnaW5vIFNhbnMvR290aGljIGZvbnRzIGhhdmUgbnVtZXJvdXMgaGludHMgdGhhdAotICAgICAqIHRvdWNoLiAgU29tZSBmb250cyBoYXZlIG5vbi1pZGVvZ3JhcGhpYyBnbHlwaHMgdGhhdCBvdmVybGFwIG91cgotICAgICAqIHN5bnRoZXRpYyBoaW50cy4KLSAgICAgKgotICAgICAqIE92ZXJsYXAgYWxzbyBvY2N1cnMgd2hlbiBkYXJrZW5pbmcgc3RlbSBoaW50cyB0aGF0IGFyZSBjbG9zZS4KLSAgICAgKgotICAgICAqLwotICAgIGlmICggaW5kZXhJbnNlcnQgPCBoaW50bWFwLT5jb3VudCApCi0gICAgewotICAgICAgLyogd2UgYXJlIGluc2VydGluZyBiZWZvcmUgYW4gZXhpc3RpbmcgZWRnZTogICAgKi8KLSAgICAgIC8qIHZlcmlmeSB0aGF0IGFuIGV4aXN0aW5nIGVkZ2UgaXMgbm90IHRoZSBzYW1lICovCi0gICAgICBpZiAoIGhpbnRtYXAtPmVkZ2VbaW5kZXhJbnNlcnRdLmNzQ29vcmQgPT0gZmlyc3RIaW50RWRnZS0+Y3NDb29yZCApCi0gICAgICAgIHJldHVybjsgLyogaWdub3JlIG92ZXJsYXBwaW5nIHN0ZW0gaGludCAqLwotCi0gICAgICAvKiB2ZXJpZnkgdGhhdCBhIG5ldyBwYWlyIGRvZXMgbm90IHN0cmFkZGxlIHRoZSBuZXh0IGVkZ2UgKi8KLSAgICAgIGlmICggaXNQYWlyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICBoaW50bWFwLT5lZGdlW2luZGV4SW5zZXJ0XS5jc0Nvb3JkIDw9IHNlY29uZEhpbnRFZGdlLT5jc0Nvb3JkICkKLSAgICAgICAgcmV0dXJuOyAvKiBpZ25vcmUgb3ZlcmxhcHBpbmcgc3RlbSBoaW50ICovCi0KLSAgICAgIC8qIHZlcmlmeSB0aGF0IHdlIGFyZSBub3QgaW5zZXJ0aW5nIGJldHdlZW4gcGFpcmVkIGVkZ2VzICovCi0gICAgICBpZiAoIGNmMl9oaW50X2lzUGFpclRvcCggJmhpbnRtYXAtPmVkZ2VbaW5kZXhJbnNlcnRdICkgKQotICAgICAgICByZXR1cm47IC8qIGlnbm9yZSBvdmVybGFwcGluZyBzdGVtIGhpbnQgKi8KLSAgICB9Ci0KLSAgICAvKiByZWNvbXB1dGUgZGV2aWNlIHNwYWNlIGxvY2F0aW9ucyB1c2luZyBpbml0aWFsIGhpbnQgbWFwICovCi0gICAgaWYgKCBjZjJfaGludG1hcF9pc1ZhbGlkKCBoaW50bWFwLT5pbml0aWFsSGludE1hcCApICYmCi0gICAgICAgICAhY2YyX2hpbnRfaXNMb2NrZWQoIGZpcnN0SGludEVkZ2UgKSAgICAgICAgICAgICkKLSAgICB7Ci0gICAgICBpZiAoIGlzUGFpciApCi0gICAgICB7Ci0gICAgICAgIC8qIFVzZSBoaW50IG1hcCB0byBwb3NpdGlvbiB0aGUgY2VudGVyIG9mIHN0ZW0sIGFuZCBub21pbmFsIHNjYWxlICovCi0gICAgICAgIC8qIHRvIHBvc2l0aW9uIHRoZSB0d28gZWRnZXMuICBUaGlzIHByZXNlcnZlcyB0aGUgc3RlbSB3aWR0aC4gICAgICovCi0gICAgICAgIENGMl9GaXhlZCAgbWlkcG9pbnQgID0gY2YyX2hpbnRtYXBfbWFwKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludG1hcC0+aW5pdGlhbEhpbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHNlY29uZEhpbnRFZGdlLT5jc0Nvb3JkICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RIaW50RWRnZS0+Y3NDb29yZCApIC8gMiApOwotICAgICAgICBDRjJfRml4ZWQgIGhhbGZXaWR0aCA9IEZUX011bEZpeCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggc2Vjb25kSGludEVkZ2UtPmNzQ29vcmQgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEhpbnRFZGdlLT5jc0Nvb3JkICkgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludG1hcC0+c2NhbGUgKTsKLQotCi0gICAgICAgIGZpcnN0SGludEVkZ2UtPmRzQ29vcmQgID0gbWlkcG9pbnQgLSBoYWxmV2lkdGg7Ci0gICAgICAgIHNlY29uZEhpbnRFZGdlLT5kc0Nvb3JkID0gbWlkcG9pbnQgKyBoYWxmV2lkdGg7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGZpcnN0SGludEVkZ2UtPmRzQ29vcmQgPSBjZjJfaGludG1hcF9tYXAoIGhpbnRtYXAtPmluaXRpYWxIaW50TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEhpbnRFZGdlLT5jc0Nvb3JkICk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBEaXNjYXJkIGFueSBoaW50cyB0aGF0IG92ZXJsYXAgaW4gZGV2aWNlIHNwYWNlOyB0aGlzIGNhbiBvY2N1cgotICAgICAqIGJlY2F1c2UgbG9ja2VkIGhpbnRzIGhhdmUgYmVlbiBtb3ZlZCB0byBhbGlnbiB3aXRoIGJsdWUgem9uZXMuCi0gICAgICoKLSAgICAgKiBUT0RPOiBBbHRob3VnaCB3ZSBtaWdodCBjb3JyZWN0IHRoaXMgbGF0ZXIgZHVyaW5nIGFkanVzdG1lbnQsIHdlCi0gICAgICogZG9uJ3QgY3VycmVudGx5IGhhdmUgYSB3YXkgdG8gZGVsZXRlIGEgY29uZmxpY3RpbmcgaGludCBvbmNlIGl0IGhhcwotICAgICAqIGJlZW4gaW5zZXJ0ZWQuICBTZWUgdjIuMDMwIE1pbmlvblByby1SZWd1bGFyLCAxMiBwcGVtIGRhcmtlbmVkLAotICAgICAqIGluaXRpYWwgaGludCBtYXAgZm9yIHNlY29uZCBwYXRoLCBnbHlwaCA5NDUgKHRoZSBwZXJpc3BvbWVuaSAodGlsZGUpCi0gICAgICogaW4gVSsxRjZFLCBHcmVlayBvbWVnYSB3aXRoIHBzaWxpIGFuZCBwZXJpc3BvbWVuaSkuICBEYXJrZW5pbmcgaXMKLSAgICAgKiAyNS4gIFBhaXIgNjY3LDc0NyBpbml0aWFsbHkgY29uZmxpY3RzIGluIGRlc2lnbiBzcGFjZSB3aXRoIHRvcCBlZGdlCi0gICAgICogNjYwLiAgVGhpcyBpcyBiZWNhdXNlIDY2NyBtYXBzIHRvIDcuODcsIGFuZCB0aGUgdG9wIGVkZ2Ugd2FzCi0gICAgICogY2FwdHVyZWQgYnkgYSB6b25lIGF0IDguMC4gIFRoZSBwYWlyIGlzIGxhdGVyIHN1Y2Nlc3NmdWxseSBpbnNlcnRlZAotICAgICAqIGluIGEgem9uZSB3aXRob3V0IHRoZSB0b3AgZWRnZS4gIEluIHRoaXMgem9uZSBpdCBpcyBhZGp1c3RlZCB0byA4LjAsCi0gICAgICogYW5kIG5vIGxvbmdlciBjb25mbGljdHMgd2l0aCB0aGUgdG9wIGVkZ2UgaW4gZGVzaWduIHNwYWNlLiAgVGhpcwotICAgICAqIG1lYW5zIGl0IGNhbiBiZSBpbmNsdWRlZCBpbiB5ZXQgYSBsYXRlciB6b25lIHdoaWNoIGRvZXMgaGF2ZSB0aGUgdG9wCi0gICAgICogZWRnZSBoaW50LiAgVGhpcyBwcm9kdWNlcyBhIHNtYWxsIG1pc21hdGNoIGJldHdlZW4gdGhlIGZpcnN0IGFuZAotICAgICAqIGxhc3QgcG9pbnRzIG9mIHRoaXMgcGF0aCwgZXZlbiB0aG91Z2ggdGhlIGhpbnQgbWFza3MgYXJlIHRoZSBzYW1lLgotICAgICAqIFRoZSBkZW5zaXR5IG1hcCBkaWZmZXJlbmNlIGlzIHRpbnkgKDEvMjU2KS4KLSAgICAgKgotICAgICAqLwotCi0gICAgaWYgKCBpbmRleEluc2VydCA+IDAgKQotICAgIHsKLSAgICAgIC8qIHdlIGFyZSBpbnNlcnRpbmcgYWZ0ZXIgYW4gZXhpc3RpbmcgZWRnZSAqLwotICAgICAgaWYgKCBmaXJzdEhpbnRFZGdlLT5kc0Nvb3JkIDwgaGludG1hcC0+ZWRnZVtpbmRleEluc2VydCAtIDFdLmRzQ29vcmQgKQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCBpbmRleEluc2VydCA8IGhpbnRtYXAtPmNvdW50ICkKLSAgICB7Ci0gICAgICAvKiB3ZSBhcmUgaW5zZXJ0aW5nIGJlZm9yZSBhbiBleGlzdGluZyBlZGdlICovCi0gICAgICBpZiAoIGlzUGFpciApCi0gICAgICB7Ci0gICAgICAgIGlmICggc2Vjb25kSGludEVkZ2UtPmRzQ29vcmQgPiBoaW50bWFwLT5lZGdlW2luZGV4SW5zZXJ0XS5kc0Nvb3JkICkKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICggZmlyc3RIaW50RWRnZS0+ZHNDb29yZCA+IGhpbnRtYXAtPmVkZ2VbaW5kZXhJbnNlcnRdLmRzQ29vcmQgKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBtYWtlIHJvb20gdG8gaW5zZXJ0ICovCi0gICAgewotICAgICAgQ0YyX1VJbnQgIGlTcmMgPSBoaW50bWFwLT5jb3VudCAtIDE7Ci0gICAgICBDRjJfVUludCAgaURzdCA9IGlzUGFpciA/IGhpbnRtYXAtPmNvdW50ICsgMSA6IGhpbnRtYXAtPmNvdW50OwotCi0gICAgICBDRjJfVUludCAgY291bnQgPSBoaW50bWFwLT5jb3VudCAtIGluZGV4SW5zZXJ0OwotCi0KLSAgICAgIGlmICggaURzdCA+PSBDRjJfTUFYX0hJTlRfRURHRVMgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTQoKCAiY2YyX2hpbnRtYXBfaW5zZXJ0SGludDogdG9vIG1hbnkgaGludG1hcHNcbiIgKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgd2hpbGUgKCBjb3VudC0tICkKLSAgICAgICAgaGludG1hcC0+ZWRnZVtpRHN0LS1dID0gaGludG1hcC0+ZWRnZVtpU3JjLS1dOwotCi0gICAgICAvKiBpbnNlcnQgZmlyc3QgZWRnZSAqLwotICAgICAgaGludG1hcC0+ZWRnZVtpbmRleEluc2VydF0gPSAqZmlyc3RIaW50RWRnZTsgICAgICAgICAvKiBjb3B5IHN0cnVjdCAqLwotICAgICAgaGludG1hcC0+Y291bnQgKz0gMTsKLQotICAgICAgaWYgKCBpc1BhaXIgKQotICAgICAgewotICAgICAgICAvKiBpbnNlcnQgc2Vjb25kIGVkZ2UgKi8KLSAgICAgICAgaGludG1hcC0+ZWRnZVtpbmRleEluc2VydCArIDFdID0gKnNlY29uZEhpbnRFZGdlOyAgLyogY29weSBzdHJ1Y3QgKi8KLSAgICAgICAgaGludG1hcC0+Y291bnQgICAgICAgICAgICAgICAgKz0gMTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm47Ci0gIH0KLQotCi0gIC8qCi0gICAqIEJ1aWxkIGEgbWFwIGZyb20gaGludHMgYW5kIG1hc2suCi0gICAqCi0gICAqIFRoaXMgZnVuY3Rpb24gbWF5IHJlY3VyIG9uZSBsZXZlbCBpZiBgaGludG1hcC0+aW5pdGlhbEhpbnRNYXAnIGlzIG5vdCB5ZXQKLSAgICogdmFsaWQuCi0gICAqIElmIGBpbml0aWFsTWFwJyBpcyB0cnVlLCBzaW1wbHkgYnVpbGQgaW5pdGlhbCBtYXAuCi0gICAqCi0gICAqIFN5bnRoZXRpYyBoaW50cyBhcmUgdXNlZCBpbiB0d28gd2F5cy4gIEEgaGludCBhdCB6ZXJvIGlzIGluc2VydGVkLCBpZgotICAgKiBuZWVkZWQsIGluIHRoZSBpbml0aWFsIGhpbnQgbWFwLCB0byBwcmV2ZW50IHRyYW5zbGF0aW9ucyBmcm9tCi0gICAqIHByb3BhZ2F0aW5nIGFjcm9zcyB0aGUgb3JpZ2luLiAgSWYgc3ludGhldGljIGVtIGJveCBoaW50cyBhcmUgZW5hYmxlZAotICAgKiBmb3IgaWRlb2dyYXBoaWMgZGljdGlvbmFyaWVzLCB0aGVuIHRoZXkgYXJlIGluc2VydGVkIGluIGFsbCBoaW50Ci0gICAqIG1hcHMsIGluY2x1ZGluZyB0aGUgaW5pdGlhbCBvbmUuCi0gICAqCi0gICAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZjJfaGludG1hcF9idWlsZCggQ0YyX0hpbnRNYXAgICBoaW50bWFwLAotICAgICAgICAgICAgICAgICAgICAgQ0YyX0FyclN0YWNrICBoU3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgIENGMl9BcnJTdGFjayAgdlN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICBDRjJfSGludE1hc2sgIGhpbnRNYXNrLAotICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICBoaW50T3JpZ2luLAotICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICBpbml0aWFsTWFwICkKLSAgewotICAgIEZUX0J5dGUqICBtYXNrUHRyOwotCi0gICAgQ0YyX0ZvbnQgICAgICAgICBmb250ID0gaGludG1hcC0+Zm9udDsKLSAgICBDRjJfSGludE1hc2tSZWMgIHRlbXBIaW50TWFzazsKLQotICAgIHNpemVfdCAgIGJpdENvdW50LCBpOwotICAgIEZUX0J5dGUgIG1hc2tCeXRlOwotCi0KLSAgICAvKiBjaGVjayB3aGV0aGVyIGluaXRpYWwgbWFwIGlzIGNvbnN0cnVjdGVkICovCi0gICAgaWYgKCAhaW5pdGlhbE1hcCAmJiAhY2YyX2hpbnRtYXBfaXNWYWxpZCggaGludG1hcC0+aW5pdGlhbEhpbnRNYXAgKSApCi0gICAgewotICAgICAgLyogbWFrZSByZWN1cnNpdmUgY2FsbCB3aXRoIGluaXRpYWxIaW50TWFwIGFuZCB0ZW1wb3JhcnkgbWFzazsgKi8KLSAgICAgIC8qIHRlbXBvcmFyeSBtYXNrIHdpbGwgZ2V0IGFsbCBiaXRzIHNldCwgYmVsb3cgKi8KLSAgICAgIGNmMl9oaW50bWFza19pbml0KCAmdGVtcEhpbnRNYXNrLCBoaW50TWFzay0+ZXJyb3IgKTsKLSAgICAgIGNmMl9oaW50bWFwX2J1aWxkKCBoaW50bWFwLT5pbml0aWFsSGludE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoU3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB2U3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcEhpbnRNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRPcmlnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSApOwotICAgIH0KLQotICAgIGlmICggIWNmMl9oaW50bWFza19pc1ZhbGlkKCBoaW50TWFzayApICkKLSAgICB7Ci0gICAgICAvKiB3aXRob3V0IGEgaGludCBtYXNrLCBhc3N1bWUgYWxsIGhpbnRzIGFyZSBhY3RpdmUgKi8KLSAgICAgIGNmMl9oaW50bWFza19zZXRBbGwoIGhpbnRNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YyX2FycnN0YWNrX3NpemUoIGhTdGVtSGludEFycmF5ICkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZjJfYXJyc3RhY2tfc2l6ZSggdlN0ZW1IaW50QXJyYXkgKSApOwotICAgICAgaWYgKCAhY2YyX2hpbnRtYXNrX2lzVmFsaWQoIGhpbnRNYXNrICkgKQotICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgLyogdG9vIG1hbnkgc3RlbSBoaW50cyAqLwotICAgIH0KLQotICAgIC8qIGJlZ2luIGJ5IGNsZWFyaW5nIHRoZSBtYXAgKi8KLSAgICBoaW50bWFwLT5jb3VudCAgICAgPSAwOwotICAgIGhpbnRtYXAtPmxhc3RJbmRleCA9IDA7Ci0KLSAgICAvKiBtYWtlIGEgY29weSBvZiB0aGUgaGludCBtYXNrIHNvIHdlIGNhbiBtb2RpZnkgaXQgKi8KLSAgICB0ZW1wSGludE1hc2sgPSAqaGludE1hc2s7Ci0gICAgbWFza1B0ciAgICAgID0gY2YyX2hpbnRtYXNrX2dldE1hc2tQdHIoICZ0ZW1wSGludE1hc2sgKTsKLQotICAgIC8qIHVzZSB0aGUgaFN0ZW0gaGludHMgb25seSwgd2hpY2ggYXJlIGZpcnN0IGluIHRoZSBtYXNrICovCi0gICAgYml0Q291bnQgPSBjZjJfYXJyc3RhY2tfc2l6ZSggaFN0ZW1IaW50QXJyYXkgKTsKLQotICAgIC8qIERlZmVuc2UtaW4tZGVwdGguICBTaG91bGQgbmV2ZXIgcmV0dXJuIGhlcmUuICovCi0gICAgaWYgKCBiaXRDb3VudCA+IGhpbnRNYXNrLT5iaXRDb3VudCApCi0gICAgICAgIHJldHVybjsKLQotICAgIC8qIHN5bnRoZXRpYyBlbWJveCBoaW50cyBnZXQgaGlnaGVzdCBwcmlvcml0eSAqLwotICAgIGlmICggZm9udC0+Ymx1ZXMuZG9FbUJveEhpbnRzICkKLSAgICB7Ci0gICAgICBDRjJfSGludFJlYyAgZHVtbXk7Ci0KLQotICAgICAgY2YyX2hpbnRfaW5pdFplcm8oICZkdW1teSApOyAgIC8qIGludmFsaWQgaGludCBtYXAgZWxlbWVudCAqLwotCi0gICAgICAvKiBnaG9zdCBib3R0b20gKi8KLSAgICAgIGNmMl9oaW50bWFwX2luc2VydEhpbnQoIGhpbnRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9udC0+Ymx1ZXMuZW1Cb3hCb3R0b21FZGdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1bW15ICk7Ci0gICAgICAvKiBnaG9zdCB0b3AgKi8KLSAgICAgIGNmMl9oaW50bWFwX2luc2VydEhpbnQoIGhpbnRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVtbXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9udC0+Ymx1ZXMuZW1Cb3hUb3BFZGdlICk7Ci0gICAgfQotCi0gICAgLyogaW5zZXJ0IGhpbnRzIGNhcHR1cmVkIGJ5IGEgYmx1ZSB6b25lIG9yIGFscmVhZHkgbG9ja2VkIChoaWdoZXIgKi8KLSAgICAvKiBwcmlvcml0eSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGZvciAoIGkgPSAwLCBtYXNrQnl0ZSA9IDB4ODA7IGkgPCBiaXRDb3VudDsgaSsrICkKLSAgICB7Ci0gICAgICBpZiAoIG1hc2tCeXRlICYgKm1hc2tQdHIgKQotICAgICAgewotICAgICAgICAvKiBleHBhbmQgU3RlbUhpbnQgaW50byB0d28gYENGMl9IaW50JyBlbGVtZW50cyAqLwotICAgICAgICBDRjJfSGludFJlYyAgYm90dG9tSGludEVkZ2UsIHRvcEhpbnRFZGdlOwotCi0KLSAgICAgICAgY2YyX2hpbnRfaW5pdCggJmJvdHRvbUhpbnRFZGdlLAotICAgICAgICAgICAgICAgICAgICAgICBoU3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgaGludE9yaWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgaGludG1hcC0+c2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIFRSVUUgLyogYm90dG9tICovICk7Ci0gICAgICAgIGNmMl9oaW50X2luaXQoICZ0b3BIaW50RWRnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaFN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgIGksCi0gICAgICAgICAgICAgICAgICAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGhpbnRPcmlnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgIGhpbnRtYXAtPnNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSAvKiB0b3AgKi8gKTsKLQotICAgICAgICBpZiAoIGNmMl9oaW50X2lzTG9ja2VkKCAmYm90dG9tSGludEVkZ2UgKSB8fAotICAgICAgICAgICAgIGNmMl9oaW50X2lzTG9ja2VkKCAmdG9wSGludEVkZ2UgKSAgICB8fAotICAgICAgICAgICAgIGNmMl9ibHVlc19jYXB0dXJlKCAmZm9udC0+Ymx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZib3R0b21IaW50RWRnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvcEhpbnRFZGdlICkgICApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBpbnNlcnQgY2FwdHVyZWQgaGludCBpbnRvIG1hcCAqLwotICAgICAgICAgIGNmMl9oaW50bWFwX2luc2VydEhpbnQoIGhpbnRtYXAsICZib3R0b21IaW50RWRnZSwgJnRvcEhpbnRFZGdlICk7Ci0KLSAgICAgICAgICAqbWFza1B0ciAmPSB+bWFza0J5dGU7ICAgICAgLyogdHVybiBvZmYgdGhlIGJpdCBmb3IgdGhpcyBoaW50ICovCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCAoIGkgJiA3ICkgPT0gNyApCi0gICAgICB7Ci0gICAgICAgIC8qIG1vdmUgdG8gbmV4dCBtYXNrIGJ5dGUgKi8KLSAgICAgICAgbWFza1B0cisrOwotICAgICAgICBtYXNrQnl0ZSA9IDB4ODA7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIG1hc2tCeXRlID4+PSAxOwotICAgIH0KLQotICAgIC8qIGluaXRpYWwgaGludCBtYXAgaW5jbHVkZXMgb25seSBjYXB0dXJlZCBoaW50cyBwbHVzIG1heWJlIG9uZSBhdCAwICovCi0KLSAgICAvKgotICAgICAqIFRPRE86IFRoZXJlIGlzIGEgcHJvYmxlbSBoZXJlIGJlY2F1c2Ugd2UgYXJlIHRyeWluZyB0byBidWlsZCBhCi0gICAgICogICAgICAgc2luZ2xlIGhpbnQgbWFwIGNvbnRhaW5pbmcgYWxsIGNhcHR1cmVkIGhpbnRzLiAgSXQgaXMKLSAgICAgKiAgICAgICBwb3NzaWJsZSBmb3IgdGhlcmUgdG8gYmUgY29uZmxpY3RzIGJldHdlZW4gY2FwdHVyZWQgaGludHMsCi0gICAgICogICAgICAgZWl0aGVyIGJlY2F1c2Ugb2YgZGFya2VuaW5nIG9yIGJlY2F1c2UgdGhlIGhpbnRzIGFyZSBpbgotICAgICAqICAgICAgIHNlcGFyYXRlIGhpbnQgem9uZXMgKHdlIGFyZSBpZ25vcmluZyBoaW50IHpvbmVzIGZvciB0aGUKLSAgICAgKiAgICAgICBpbml0aWFsIG1hcCkuICBBbiBleGFtcGxlIG9mIHRoZSBsYXR0ZXIgaXMgTWluaW9uUHJvLVJlZ3VsYXIKLSAgICAgKiAgICAgICB2Mi4wMzAgZ2x5cGggODgzIChHcmVlayBDYXBpdGFsIEFscGhhIHdpdGggUHNpbGkpIGF0IDE1cHBlbS4KLSAgICAgKiAgICAgICBBIHN0ZW0gaGludCBmb3IgdGhlIHBzaWxpIGNvbmZsaWN0cyB3aXRoIHRoZSB0b3AgZWRnZSBoaW50Ci0gICAgICogICAgICAgZm9yIHRoZSBiYXNlIGNoYXJhY3Rlci4gIFRoZSBzdGVtIGhpbnQgZ2V0cyBwcmlvcml0eSBiZWNhdXNlCi0gICAgICogICAgICAgb2YgaXRzIHNvcnQgb3JkZXIuICBJbiBnbHlwaCA4ODQgKEdyZWVrIENhcGl0YWwgQWxwaGEgd2l0aAotICAgICAqICAgICAgIFBzaWxpIGFuZCBPeGlhKSwgdGhlIHRvcCBvZiB0aGUgYmFzZSBjaGFyYWN0ZXIgZ2V0cyBhIHN0ZW0KLSAgICAgKiAgICAgICBoaW50LCBhbmQgdGhlIHBzaWxpIGRvZXMgbm90LiAgVGhpcyBjcmVhdGVzIGRpZmZlcmVudCBpbml0aWFsCi0gICAgICogICAgICAgbWFwcyBmb3IgdGhlIHR3byBnbHlwaHMgcmVzdWx0aW5nIGluIGRpZmZlcmVudCByZW5kZXJpbmdzIG9mCi0gICAgICogICAgICAgdGhlIGJhc2UgY2hhcmFjdGVyLiAgV2lsbCBwcm9iYWJseSBkZWZlciB0aGlzIGVpdGhlciBhcyBub3QKLSAgICAgKiAgICAgICB3b3J0aCB0aGUgY29zdCBvciBhcyBhIGZvbnQgYnVnLiAgSSBkb24ndCB0aGluayB0aGVyZSBpcyBhbnkKLSAgICAgKiAgICAgICBnb29kIHJlYXNvbiBmb3IgYW4gYWNjZW50IHRvIGJlIGNhcHR1cmVkIGJ5IGFuIGFsaWdubWVudAotICAgICAqICAgICAgIHpvbmUuICAtZGFybm9sZCAyLzEyLzEwCi0gICAgICovCi0KLSAgICBpZiAoIGluaXRpYWxNYXAgKQotICAgIHsKLSAgICAgIC8qIEFwcGx5IGEgaGV1cmlzdGljIHRoYXQgaW5zZXJ0cyBhIHBvaW50IGZvciAoMCwwKSwgdW5sZXNzIGl0J3MgICAgICovCi0gICAgICAvKiBhbHJlYWR5IGNvdmVyZWQgYnkgYSBtYXBwaW5nLiAgVGhpcyBsb2NrcyB0aGUgYmFzZWxpbmUgZm9yIGdseXBocyAqLwotICAgICAgLyogdGhhdCBoYXZlIG5vIGJhc2VsaW5lIGhpbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgaWYgKCBoaW50bWFwLT5jb3VudCA9PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgaGludG1hcC0+ZWRnZVswXS5jc0Nvb3JkID4gMCAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIGhpbnRtYXAtPmVkZ2VbaGludG1hcC0+Y291bnQgLSAxXS5jc0Nvb3JkIDwgMCApCi0gICAgICB7Ci0gICAgICAgIC8qIGFsbCBlZGdlcyBhcmUgYWJvdmUgMCBvciBhbGwgZWRnZXMgYXJlIGJlbG93IDA7ICovCi0gICAgICAgIC8qIGNvbnN0cnVjdCBhIGxvY2tlZCBlZGdlIGhpbnQgYXQgMCAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgQ0YyX0hpbnRSZWMgIGVkZ2UsIGludmFsaWQ7Ci0KLQotICAgICAgICBjZjJfaGludF9pbml0WmVybyggJmVkZ2UgKTsKLQotICAgICAgICBlZGdlLmZsYWdzID0gQ0YyX0dob3N0Qm90dG9tIHwKLSAgICAgICAgICAgICAgICAgICAgIENGMl9Mb2NrZWQgICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICBDRjJfU3ludGhldGljOwotICAgICAgICBlZGdlLnNjYWxlID0gaGludG1hcC0+c2NhbGU7Ci0KLSAgICAgICAgY2YyX2hpbnRfaW5pdFplcm8oICZpbnZhbGlkICk7Ci0gICAgICAgIGNmMl9oaW50bWFwX2luc2VydEhpbnQoIGhpbnRtYXAsICZlZGdlLCAmaW52YWxpZCApOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogaW5zZXJ0IHJlbWFpbmluZyBoaW50cyAqLwotCi0gICAgICBtYXNrUHRyID0gY2YyX2hpbnRtYXNrX2dldE1hc2tQdHIoICZ0ZW1wSGludE1hc2sgKTsKLQotICAgICAgZm9yICggaSA9IDAsIG1hc2tCeXRlID0gMHg4MDsgaSA8IGJpdENvdW50OyBpKysgKQotICAgICAgewotICAgICAgICBpZiAoIG1hc2tCeXRlICYgKm1hc2tQdHIgKQotICAgICAgICB7Ci0gICAgICAgICAgQ0YyX0hpbnRSZWMgIGJvdHRvbUhpbnRFZGdlLCB0b3BIaW50RWRnZTsKLQotCi0gICAgICAgICAgY2YyX2hpbnRfaW5pdCggJmJvdHRvbUhpbnRFZGdlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhTdGVtSGludEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoaW50T3JpZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRtYXAtPnNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgLyogYm90dG9tICovICk7Ci0gICAgICAgICAgY2YyX2hpbnRfaW5pdCggJnRvcEhpbnRFZGdlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhTdGVtSGludEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoaW50T3JpZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRtYXAtPnNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIC8qIHRvcCAqLyApOwotCi0gICAgICAgICAgY2YyX2hpbnRtYXBfaW5zZXJ0SGludCggaGludG1hcCwgJmJvdHRvbUhpbnRFZGdlLCAmdG9wSGludEVkZ2UgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggKCBpICYgNyApID09IDcgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogbW92ZSB0byBuZXh0IG1hc2sgYnl0ZSAqLwotICAgICAgICAgIG1hc2tQdHIrKzsKLSAgICAgICAgICBtYXNrQnl0ZSA9IDB4ODA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIG1hc2tCeXRlID4+PSAxOwotICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogTm90ZTogVGhlIGZvbGxvd2luZyBsaW5lIGlzIGEgY29udmVuaWVudCBwbGFjZSB0byBicmVhayB3aGVuCi0gICAgICogICAgICAgZGVidWdnaW5nIGhpbnRpbmcuICBFeGFtaW5lIGBoaW50bWFwLT5lZGdlJyBmb3IgdGhlIGxpc3Qgb2YKLSAgICAgKiAgICAgICBlbmFibGVkIGhpbnRzLCB0aGVuIHN0ZXAgb3ZlciB0aGUgY2FsbCB0byBzZWUgdGhlIGVmZmVjdCBvZgotICAgICAqICAgICAgIGFkanVzdG1lbnQuICBXZSBzdG9wIGhlcmUgZmlyc3Qgb24gdGhlIHJlY3Vyc2l2ZSBjYWxsIHRoYXQKLSAgICAgKiAgICAgICBjcmVhdGVzIHRoZSBpbml0aWFsIG1hcCwgYW5kIHRoZW4gb24gZWFjaCBjb3VudGVyIGdyb3VwIGFuZAotICAgICAqICAgICAgIGhpbnQgem9uZS4KLSAgICAgKi8KLQotICAgIC8qIGFkanVzdCBwb3NpdGlvbnMgb2YgaGludCBlZGdlcyB0aGF0IGFyZSBub3QgbG9ja2VkIHRvIGJsdWUgem9uZXMgKi8KLSAgICBjZjJfaGludG1hcF9hZGp1c3RIaW50cyggaGludG1hcCApOwotCi0gICAgLyogc2F2ZSB0aGUgcG9zaXRpb24gb2YgYWxsIGhpbnRzIHRoYXQgd2VyZSB1c2VkIGluIHRoaXMgaGludCBtYXA7ICovCi0gICAgLyogaWYgd2UgdXNlIHRoZW0gYWdhaW4sIHdlJ2xsIGxvY2F0ZSB0aGVtIGluIHRoZSBzYW1lIHBvc2l0aW9uICAgICovCi0gICAgaWYgKCAhaW5pdGlhbE1hcCApCi0gICAgewotICAgICAgZm9yICggaSA9IDA7IGkgPCBoaW50bWFwLT5jb3VudDsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCAhY2YyX2hpbnRfaXNTeW50aGV0aWMoICZoaW50bWFwLT5lZGdlW2ldICkgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogTm90ZTogaW5jbHVkZSBib3RoIHZhbGlkIGFuZCBpbnZhbGlkIGVkZ2VzICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBOb3RlOiB0b3AgYW5kIGJvdHRvbSBlZGdlcyBhcmUgY29waWVkIGJhY2sgc2VwYXJhdGVseSAqLwotICAgICAgICAgIENGMl9TdGVtSGludCAgc3RlbWhpbnQgPSAoQ0YyX1N0ZW1IaW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICBjZjJfYXJyc3RhY2tfZ2V0UG9pbnRlciggaFN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50bWFwLT5lZGdlW2ldLmluZGV4ICk7Ci0KLQotICAgICAgICAgIGlmICggY2YyX2hpbnRfaXNUb3AoICZoaW50bWFwLT5lZGdlW2ldICkgKQotICAgICAgICAgICAgc3RlbWhpbnQtPm1heERTID0gaGludG1hcC0+ZWRnZVtpXS5kc0Nvb3JkOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0ZW1oaW50LT5taW5EUyA9IGhpbnRtYXAtPmVkZ2VbaV0uZHNDb29yZDsKLQotICAgICAgICAgIHN0ZW1oaW50LT51c2VkID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIGhpbnQgbWFwIGlzIHJlYWR5IHRvIHVzZSAqLwotICAgIGhpbnRtYXAtPmlzVmFsaWQgPSBUUlVFOwotCi0gICAgLyogcmVtZW1iZXIgdGhpcyBtYXNrIGhhcyBiZWVuIHVzZWQgKi8KLSAgICBjZjJfaGludG1hc2tfc2V0TmV3KCBoaW50TWFzaywgRkFMU0UgKTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX2dseXBocGF0aF9pbml0KCBDRjJfR2x5cGhQYXRoICAgICAgICAgZ2x5cGhwYXRoLAotICAgICAgICAgICAgICAgICAgICAgIENGMl9Gb250ICAgICAgICAgICAgICBmb250LAotICAgICAgICAgICAgICAgICAgICAgIENGMl9PdXRsaW5lQ2FsbGJhY2tzICBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgICAgICAgIHNjYWxlWSwKLSAgICAgICAgICAgICAgICAgICAgICAvKiBDRjJfRml4ZWQgIGhTaGlmdCwgKi8KLSAgICAgICAgICAgICAgICAgICAgICBDRjJfQXJyU3RhY2sgICAgICAgICAgaFN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgQ0YyX0FyclN0YWNrICAgICAgICAgIHZTdGVtSGludEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgIENGMl9IaW50TWFzayAgICAgICAgICBoaW50TWFzaywKLSAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgICAgICAgICAgaGludE9yaWdpblksCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0YyX0JsdWVzICAgICAgIGJsdWVzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogICAgICBmcmFjdGlvbmFsVHJhbnNsYXRpb24gKQotICB7Ci0gICAgRlRfWkVSTyggZ2x5cGhwYXRoICk7Ci0KLSAgICBnbHlwaHBhdGgtPmZvbnQgICAgICA9IGZvbnQ7Ci0gICAgZ2x5cGhwYXRoLT5jYWxsYmFja3MgPSBjYWxsYmFja3M7Ci0KLSAgICBjZjJfYXJyc3RhY2tfaW5pdCggJmdseXBocGF0aC0+aGludE1vdmVzLAotICAgICAgICAgICAgICAgICAgICAgICBmb250LT5tZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICZmb250LT5lcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggQ0YyX0hpbnRNb3ZlUmVjICkgKTsKLQotICAgIGNmMl9oaW50bWFwX2luaXQoICZnbHlwaHBhdGgtPmluaXRpYWxIaW50TWFwLAotICAgICAgICAgICAgICAgICAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgJmdseXBocGF0aC0+aW5pdGlhbEhpbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgJmdseXBocGF0aC0+aGludE1vdmVzLAotICAgICAgICAgICAgICAgICAgICAgIHNjYWxlWSApOwotICAgIGNmMl9oaW50bWFwX2luaXQoICZnbHlwaHBhdGgtPmZpcnN0SGludE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICBmb250LAotICAgICAgICAgICAgICAgICAgICAgICZnbHlwaHBhdGgtPmluaXRpYWxIaW50TWFwLAotICAgICAgICAgICAgICAgICAgICAgICZnbHlwaHBhdGgtPmhpbnRNb3ZlcywKLSAgICAgICAgICAgICAgICAgICAgICBzY2FsZVkgKTsKLSAgICBjZjJfaGludG1hcF9pbml0KCAmZ2x5cGhwYXRoLT5oaW50TWFwLAotICAgICAgICAgICAgICAgICAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgJmdseXBocGF0aC0+aW5pdGlhbEhpbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgJmdseXBocGF0aC0+aGludE1vdmVzLAotICAgICAgICAgICAgICAgICAgICAgIHNjYWxlWSApOwotCi0gICAgZ2x5cGhwYXRoLT5zY2FsZVggPSBmb250LT5pbm5lclRyYW5zZm9ybS5hOwotICAgIGdseXBocGF0aC0+c2NhbGVDID0gZm9udC0+aW5uZXJUcmFuc2Zvcm0uYzsKLSAgICBnbHlwaHBhdGgtPnNjYWxlWSA9IGZvbnQtPmlubmVyVHJhbnNmb3JtLmQ7Ci0KLSAgICBnbHlwaHBhdGgtPmZyYWN0aW9uYWxUcmFuc2xhdGlvbiA9ICpmcmFjdGlvbmFsVHJhbnNsYXRpb247Ci0KLSNpZiAwCi0gICAgZ2x5cGhwYXRoLT5oU2hpZnQgPSBoU2hpZnQ7ICAgICAgIC8qIGZvciBmYXV4aW5nICovCi0jZW5kaWYKLQotICAgIGdseXBocGF0aC0+aFN0ZW1IaW50QXJyYXkgPSBoU3RlbUhpbnRBcnJheTsKLSAgICBnbHlwaHBhdGgtPnZTdGVtSGludEFycmF5ID0gdlN0ZW1IaW50QXJyYXk7Ci0gICAgZ2x5cGhwYXRoLT5oaW50TWFzayAgICAgICA9IGhpbnRNYXNrOyAgICAgIC8qIHB0ciB0byBjdXJyZW50IG1hc2sgKi8KLSAgICBnbHlwaHBhdGgtPmhpbnRPcmlnaW5ZICAgID0gaGludE9yaWdpblk7Ci0gICAgZ2x5cGhwYXRoLT5ibHVlcyAgICAgICAgICA9IGJsdWVzOwotICAgIGdseXBocGF0aC0+ZGFya2VuICAgICAgICAgPSBmb250LT5kYXJrZW5lZDsgLyogVE9ETzogc2hvdWxkIHdlIG1ha2UgY29waWVzPyAqLwotICAgIGdseXBocGF0aC0+eE9mZnNldCAgICAgICAgPSBmb250LT5kYXJrZW5YOwotICAgIGdseXBocGF0aC0+eU9mZnNldCAgICAgICAgPSBmb250LT5kYXJrZW5ZOwotICAgIGdseXBocGF0aC0+bWl0ZXJMaW1pdCAgICAgPSAyICogRlRfTUFYKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmMl9maXhlZEFicyggZ2x5cGhwYXRoLT54T2Zmc2V0ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YyX2ZpeGVkQWJzKCBnbHlwaHBhdGgtPnlPZmZzZXQgKSApOwotCi0gICAgLyogLjEgY2hhcmFjdGVyIHNwYWNlIHVuaXQgKi8KLSAgICBnbHlwaHBhdGgtPnNuYXBUaHJlc2hvbGQgPSBjZjJfZmxvYXRUb0ZpeGVkKCAwLjFmICk7Ci0KLSAgICBnbHlwaHBhdGgtPm1vdmVJc1BlbmRpbmcgPSBUUlVFOwotICAgIGdseXBocGF0aC0+cGF0aElzT3BlbiAgICA9IEZBTFNFOwotICAgIGdseXBocGF0aC0+cGF0aElzQ2xvc2luZyA9IEZBTFNFOwotICAgIGdseXBocGF0aC0+ZWxlbUlzUXVldWVkICA9IEZBTFNFOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZjJfZ2x5cGhwYXRoX2ZpbmFsaXplKCBDRjJfR2x5cGhQYXRoICBnbHlwaHBhdGggKQotICB7Ci0gICAgY2YyX2FycnN0YWNrX2ZpbmFsaXplKCAmZ2x5cGhwYXRoLT5oaW50TW92ZXMgKTsKLSAgfQotCi0KLSAgLyoKLSAgICogSGludCBwb2ludCBpbiB5LWRpcmVjdGlvbiBhbmQgYXBwbHkgb3V0ZXJUcmFuc2Zvcm0uCi0gICAqIElucHV0IGBjdXJyZW50JyBoaW50IG1hcCAod2hpY2ggaXMgYWN0dWFsbHkgZGVsYXllZCBieSBvbmUgZWxlbWVudCkuCi0gICAqIElucHV0IHgseSBwb2ludCBpbiBDaGFyYWN0ZXIgU3BhY2UuCi0gICAqIE91dHB1dCB4LHkgcG9pbnQgaW4gRGV2aWNlIFNwYWNlLCBpbmNsdWRpbmcgdHJhbnNsYXRpb24uCi0gICAqLwotICBzdGF0aWMgdm9pZAotICBjZjJfZ2x5cGhwYXRoX2hpbnRQb2ludCggQ0YyX0dseXBoUGF0aCAgZ2x5cGhwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0hpbnRNYXAgICAgaGludG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogICAgIHBwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgICB5ICkKLSAgewotICAgIEZUX1ZlY3RvciAgcHQ7ICAgLyogaGludGVkIHBvaW50IGluIHVwcmlnaHQgRFMgKi8KLQotCi0gICAgcHQueCA9IEZUX011bEZpeCggZ2x5cGhwYXRoLT5zY2FsZVgsIHggKSArCi0gICAgICAgICAgICAgRlRfTXVsRml4KCBnbHlwaHBhdGgtPnNjYWxlQywgeSApOwotICAgIHB0LnkgPSBjZjJfaGludG1hcF9tYXAoIGhpbnRtYXAsIHkgKTsKLQotICAgIHBwdC0+eCA9IEZUX011bEZpeCggZ2x5cGhwYXRoLT5mb250LT5vdXRlclRyYW5zZm9ybS5hLCBwdC54ICkgICArCi0gICAgICAgICAgICAgICBGVF9NdWxGaXgoIGdseXBocGF0aC0+Zm9udC0+b3V0ZXJUcmFuc2Zvcm0uYywgcHQueSApICsKLSAgICAgICAgICAgICAgIGdseXBocGF0aC0+ZnJhY3Rpb25hbFRyYW5zbGF0aW9uLng7Ci0gICAgcHB0LT55ID0gRlRfTXVsRml4KCBnbHlwaHBhdGgtPmZvbnQtPm91dGVyVHJhbnNmb3JtLmIsIHB0LnggKSAgICsKLSAgICAgICAgICAgICAgIEZUX011bEZpeCggZ2x5cGhwYXRoLT5mb250LT5vdXRlclRyYW5zZm9ybS5kLCBwdC55ICkgKwotICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT5mcmFjdGlvbmFsVHJhbnNsYXRpb24ueTsKLSAgfQotCi0KLSAgLyoKLSAgICogRnJvbSB0d28gbGluZSBzZWdtZW50cywgKHUxLHUyKSBhbmQgKHYxLHYyKSwgY29tcHV0ZSBhIHBvaW50IG9mCi0gICAqIGludGVyc2VjdGlvbiBvbiB0aGUgY29ycmVzcG9uZGluZyBsaW5lcy4KLSAgICogUmV0dXJuIGZhbHNlIGlmIG5vIGludGVyc2VjdGlvbiBpcyBmb3VuZCwgb3IgaWYgdGhlIGludGVyc2VjdGlvbiBpcwotICAgKiB0b28gZmFyIGF3YXkgZnJvbSB0aGUgZW5kcyBvZiB0aGUgbGluZSBzZWdtZW50cywgdTIgYW5kIHYxLgotICAgKgotICAgKi8KLSAgc3RhdGljIEZUX0Jvb2wKLSAgY2YyX2dseXBocGF0aF9jb21wdXRlSW50ZXJzZWN0aW9uKCBDRjJfR2x5cGhQYXRoICAgICBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgdTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgdTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgdjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgdjIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgICAgICAgaW50ZXJzZWN0aW9uICkKLSAgewotICAgIC8qCi0gICAgICogTGV0IGB1JyBiZSBhIHplcm8tYmFzZWQgdmVjdG9yIGZyb20gdGhlIGZpcnN0IHNlZ21lbnQsIGB2JyBmcm9tIHRoZQotICAgICAqIHNlY29uZCBzZWdtZW50LgotICAgICAqIExldCBgdyAnYmUgdGhlIHplcm8tYmFzZWQgdmVjdG9yIGZyb20gYHUxJyB0byBgdjEnLgotICAgICAqIGBwZXJwJyBpcyB0aGUgYHBlcnBlbmRpY3VsYXIgZG90IHByb2R1Y3QnOyBzZWUKLSAgICAgKiBodHRwOi8vbWF0aHdvcmxkLndvbGZyYW0uY29tL1BlcnBEb3RQcm9kdWN0Lmh0bWwuCi0gICAgICogYHMnIGlzIHRoZSBwYXJhbWV0ZXIgZm9yIHRoZSBwYXJhbWV0cmljIGxpbmUgZm9yIHRoZSBmaXJzdCBzZWdtZW50Ci0gICAgICogKGB1JykuCi0gICAgICoKLSAgICAgKiBTZWUgbm90YXRpb24gaW4KLSAgICAgKiBodHRwOi8vc29mdHN1cmZlci5jb20vQXJjaGl2ZS9hbGdvcml0aG1fMDEwNC9hbGdvcml0aG1fMDEwNEIuaHRtLgotICAgICAqIENhbGN1bGF0aW9ucyBhcmUgZG9uZSBpbiAxNi4xNiwgYnV0IG11c3QgaGFuZGxlIHRoZSBzcXVhcmluZyBvZgotICAgICAqIGxpbmUgbGVuZ3RocyBpbiBjaGFyYWN0ZXIgc3BhY2UuICBXZSBzY2FsZSBhbGwgdmVjdG9ycyBieSAxLzMyIHRvCi0gICAgICogYXZvaWQgb3ZlcmZsb3cuICBUaGlzIGFsbG93cyB2YWx1ZXMgdXAgdG8gNDA5NSB0byBiZSBzcXVhcmVkLiAgVGhlCi0gICAgICogc2NhbGUgZmFjdG9yIGNhbmNlbHMgaW4gdGhlIGRpdmlkZS4KLSAgICAgKgotICAgICAqIFRPRE86IHRoZSBzY2FsZSBmYWN0b3IgY291bGQgYmUgY29tcHV0ZWQgZnJvbSBVbml0c1BlckVtLgotICAgICAqCi0gICAgICovCi0KLSNkZWZpbmUgY2YyX3BlcnAoIGEsIGIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEZUX011bEZpeCggYS54LCBiLnkgKSAtIEZUX011bEZpeCggYS55LCBiLnggKSApCi0KLSAgLyogcm91bmQgYW5kIGRpdmlkZSBieSAzMiAqLwotI2RlZmluZSBDRjJfQ1NfU0NBTEUoIHggKSAgICAgICAgIFwKLSAgICAgICAgICAoICggKHgpICsgMHgxMCApID4+IDUgKQotCi0gICAgRlRfVmVjdG9yICB1LCB2LCB3OyAgICAgIC8qIHNjYWxlZCB2ZWN0b3JzICovCi0gICAgQ0YyX0ZpeGVkICBkZW5vbWluYXRvciwgczsKLQotCi0gICAgdS54ID0gQ0YyX0NTX1NDQUxFKCB1Mi0+eCAtIHUxLT54ICk7Ci0gICAgdS55ID0gQ0YyX0NTX1NDQUxFKCB1Mi0+eSAtIHUxLT55ICk7Ci0gICAgdi54ID0gQ0YyX0NTX1NDQUxFKCB2Mi0+eCAtIHYxLT54ICk7Ci0gICAgdi55ID0gQ0YyX0NTX1NDQUxFKCB2Mi0+eSAtIHYxLT55ICk7Ci0gICAgdy54ID0gQ0YyX0NTX1NDQUxFKCB2MS0+eCAtIHUxLT54ICk7Ci0gICAgdy55ID0gQ0YyX0NTX1NDQUxFKCB2MS0+eSAtIHUxLT55ICk7Ci0KLSAgICBkZW5vbWluYXRvciA9IGNmMl9wZXJwKCB1LCB2ICk7Ci0KLSAgICBpZiAoIGRlbm9taW5hdG9yID09IDAgKQotICAgICAgcmV0dXJuIEZBTFNFOyAgICAgICAgICAgLyogcGFyYWxsZWwgb3IgY29pbmNpZGVudCBsaW5lcyAqLwotCi0gICAgcyA9IEZUX0RpdkZpeCggY2YyX3BlcnAoIHcsIHYgKSwgZGVub21pbmF0b3IgKTsKLQotICAgIGludGVyc2VjdGlvbi0+eCA9IHUxLT54ICsgRlRfTXVsRml4KCBzLCB1Mi0+eCAtIHUxLT54ICk7Ci0gICAgaW50ZXJzZWN0aW9uLT55ID0gdTEtPnkgKyBGVF9NdWxGaXgoIHMsIHUyLT55IC0gdTEtPnkgKTsKLQotICAgIC8qCi0gICAgICogU3BlY2lhbCBjYXNlIHNuYXBwaW5nIGZvciBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBsaW5lcy4KLSAgICAgKiBUaGlzIGNsZWFucyB1cCBpbnRlcnNlY3Rpb25zIGFuZCByZWR1Y2VzIHByb2JsZW1zIHdpdGggd2luZGluZwotICAgICAqIG9yZGVyIGRldGVjdGlvbi4KLSAgICAgKiBTYW1wbGUgY2FzZSBpcyBzYmMgY2QgS296R29QcjZOLU1lZGl1bS5vdGYgMjAgMTY2ODUuCi0gICAgICogTm90ZTogdGhlc2UgY2FsY3VsYXRpb25zIGFyZSBpbiBjaGFyYWN0ZXIgc3BhY2UuCi0gICAgICoKLSAgICAgKi8KLQotICAgIGlmICggdTEtPnggPT0gdTItPnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBjZjJfZml4ZWRBYnMoIGludGVyc2VjdGlvbi0+eCAtIHUxLT54ICkgPCBnbHlwaHBhdGgtPnNuYXBUaHJlc2hvbGQgKQotICAgICAgaW50ZXJzZWN0aW9uLT54ID0gdTEtPng7Ci0gICAgaWYgKCB1MS0+eSA9PSB1Mi0+eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGNmMl9maXhlZEFicyggaW50ZXJzZWN0aW9uLT55IC0gdTEtPnkgKSA8IGdseXBocGF0aC0+c25hcFRocmVzaG9sZCApCi0gICAgICBpbnRlcnNlY3Rpb24tPnkgPSB1MS0+eTsKLQotICAgIGlmICggdjEtPnggPT0gdjItPnggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBjZjJfZml4ZWRBYnMoIGludGVyc2VjdGlvbi0+eCAtIHYxLT54ICkgPCBnbHlwaHBhdGgtPnNuYXBUaHJlc2hvbGQgKQotICAgICAgaW50ZXJzZWN0aW9uLT54ID0gdjEtPng7Ci0gICAgaWYgKCB2MS0+eSA9PSB2Mi0+eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGNmMl9maXhlZEFicyggaW50ZXJzZWN0aW9uLT55IC0gdjEtPnkgKSA8IGdseXBocGF0aC0+c25hcFRocmVzaG9sZCApCi0gICAgICBpbnRlcnNlY3Rpb24tPnkgPSB2MS0+eTsKLQotICAgIC8qIGxpbWl0IHRoZSBpbnRlcnNlY3Rpb24gZGlzdGFuY2UgZnJvbSBtaWRwb2ludCBvZiB1MiBhbmQgdjEgKi8KLSAgICBpZiAoIGNmMl9maXhlZEFicyggaW50ZXJzZWN0aW9uLT54IC0gKCB1Mi0+eCArIHYxLT54ICkgLyAyICkgPgotICAgICAgICAgICBnbHlwaHBhdGgtPm1pdGVyTGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICBjZjJfZml4ZWRBYnMoIGludGVyc2VjdGlvbi0+eSAtICggdTItPnkgKyB2MS0+eSApIC8gMiApID4KLSAgICAgICAgICAgZ2x5cGhwYXRoLT5taXRlckxpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICByZXR1cm4gVFJVRTsKLSAgfQotCi0KLSAgLyoKLSAgICogUHVzaCB0aGUgY2FjaGVkIGVsZW1lbnQgKGdseXBocGF0aC0+cHJldkVsZW0qKSB0byB0aGUgb3V0bGluZQotICAgKiBjb25zdW1lci4gIFdoZW4gYSBkYXJrZW5pbmcgb2Zmc2V0IGlzIHVzZWQsIHRoZSBlbmQgcG9pbnQgb2YgdGhlCi0gICAqIGNhY2hlZCBlbGVtZW50IG1heSBiZSBhZGp1c3RlZCB0byBhbiBpbnRlcnNlY3Rpb24gcG9pbnQgb3Igd2UgbWF5Ci0gICAqIHN5bnRoZXNpemUgYSBjb25uZWN0aW5nIGxpbmUgdG8gdGhlIGN1cnJlbnQgZWxlbWVudC4gIElmIHdlIGFyZQotICAgKiBjbG9zaW5nIGEgc3VicGF0aCwgd2UgbWF5IGFsc28gZ2VuZXJhdGUgYSBjb25uZWN0aW5nIGxpbmUgdG8gdGhlIHN0YXJ0Ci0gICAqIHBvaW50LgotICAgKgotICAgKiBUaGlzIGlzIHdoZXJlIENoYXJhY3RlciBTcGFjZSAoQ1MpIGlzIGNvbnZlcnRlZCB0byBEZXZpY2UgU3BhY2UgKERTKQotICAgKiB1c2luZyBhIGhpbnQgbWFwLiAgVGhpcyBjYWxjdWxhdGlvbiBtdXN0IHVzZSBhIEhpbnRNYXAgdGhhdCB3YXMgdmFsaWQKLSAgICogYXQgdGhlIHRpbWUgdGhlIGVsZW1lbnQgd2FzIHNhdmVkLiAgRm9yIHRoZSBmaXJzdCBwb2ludCBpbiBhIHN1YnBhdGgsCi0gICAqIHRoYXQgaXMgYSBzYXZlZCBIaW50TWFwLiAgRm9yIG1vc3QgZWxlbWVudHMsIGl0IGp1c3QgbWVhbnMgdGhlIGNhbGxlcgotICAgKiBoYXMgZGVsYXllZCBidWlsZGluZyBhIEhpbnRNYXAgZnJvbSB0aGUgY3VycmVudCBIaW50TWFzay4KLSAgICoKLSAgICogVHJhbnNmb3JtIGVhY2ggcG9pbnQgd2l0aCBvdXRlclRyYW5zZm9ybSBhbmQgY2FsbCB0aGUgb3V0bGluZQotICAgKiBjYWxsYmFja3MuICBUaGlzIGlzIGEgZ2VuZXJhbCAzeDMgdHJhbnNmb3JtOgotICAgKgotICAgKiAgIHgnID0gYSp4ICsgYyp5ICsgdHgsIHknID0gYip4ICsgZCp5ICsgdHkKLSAgICoKLSAgICogYnV0IGl0IHVzZXMgNCBlbGVtZW50cyBmcm9tIENGMl9Gb250IGFuZCB0aGUgdHJhbnNsYXRpb24gcGFydAotICAgKiBmcm9tIENGMl9HbHlwaFBhdGguCi0gICAqCi0gICAqLwotICBzdGF0aWMgdm9pZAotICBjZjJfZ2x5cGhwYXRoX3B1c2hQcmV2RWxlbSggQ0YyX0dseXBoUGF0aCAgZ2x5cGhwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0hpbnRNYXAgICAgaGludG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogICAgIG5leHRQMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciAgICAgIG5leHRQMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgIGNsb3NlICkKLSAgewotICAgIENGMl9DYWxsYmFja1BhcmFtc1JlYyAgcGFyYW1zOwotCi0gICAgRlRfVmVjdG9yKiAgcHJldlAwOwotICAgIEZUX1ZlY3RvciogIHByZXZQMTsKLQotICAgIEZUX1ZlY3RvciAgaW50ZXJzZWN0aW9uICAgID0geyAwLCAwIH07Ci0gICAgRlRfQm9vbCAgICB1c2VJbnRlcnNlY3Rpb24gPSBGQUxTRTsKLQotCi0gICAgRlRfQVNTRVJUKCBnbHlwaHBhdGgtPnByZXZFbGVtT3AgPT0gQ0YyX1BhdGhPcExpbmVUbyB8fAotICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT5wcmV2RWxlbU9wID09IENGMl9QYXRoT3BDdWJlVG8gKTsKLQotICAgIGlmICggZ2x5cGhwYXRoLT5wcmV2RWxlbU9wID09IENGMl9QYXRoT3BMaW5lVG8gKQotICAgIHsKLSAgICAgIHByZXZQMCA9ICZnbHlwaHBhdGgtPnByZXZFbGVtUDA7Ci0gICAgICBwcmV2UDEgPSAmZ2x5cGhwYXRoLT5wcmV2RWxlbVAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcHJldlAwID0gJmdseXBocGF0aC0+cHJldkVsZW1QMjsKLSAgICAgIHByZXZQMSA9ICZnbHlwaHBhdGgtPnByZXZFbGVtUDM7Ci0gICAgfQotCi0gICAgLyogb3B0aW1pemF0aW9uOiBpZiBwcmV2aW91cyBhbmQgbmV4dCBlbGVtZW50cyBhcmUgb2Zmc2V0IGJ5IHRoZSBzYW1lICovCi0gICAgLyogYW1vdW50LCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gZ2FwLCBhbmQgbm8gbmVlZCB0byBjb21wdXRlIGFuICAgICAgICovCi0gICAgLyogaW50ZXJzZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBwcmV2UDEtPnggIT0gbmV4dFAwLT54IHx8IHByZXZQMS0+eSAhPSBuZXh0UDAtPnkgKQotICAgIHsKLSAgICAgIC8qIHByZXZpb3VzIGVsZW1lbnQgZG9lcyBub3Qgam9pbiBuZXh0IGVsZW1lbnQ6ICAgICAgICAgICAgICovCi0gICAgICAvKiBhZGp1c3QgZW5kIHBvaW50IG9mIHByZXZpb3VzIGVsZW1lbnQgdG8gdGhlIGludGVyc2VjdGlvbiAqLwotICAgICAgdXNlSW50ZXJzZWN0aW9uID0gY2YyX2dseXBocGF0aF9jb21wdXRlSW50ZXJzZWN0aW9uKCBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZQMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0UDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXh0UDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcnNlY3Rpb24gKTsKLSAgICAgIGlmICggdXNlSW50ZXJzZWN0aW9uICkKLSAgICAgIHsKLSAgICAgICAgLyogbW9kaWZ5IHRoZSBsYXN0IHBvaW50IG9mIHRoZSBjYWNoZWQgZWxlbWVudCAoZWl0aGVyIGxpbmUgb3IgKi8KLSAgICAgICAgLyogY3VydmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgKnByZXZQMSA9IGludGVyc2VjdGlvbjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwYXJhbXMucHQwID0gZ2x5cGhwYXRoLT5jdXJyZW50RFM7Ci0KLSAgICBzd2l0Y2goIGdseXBocGF0aC0+cHJldkVsZW1PcCApCi0gICAgewotICAgIGNhc2UgQ0YyX1BhdGhPcExpbmVUbzoKLSAgICAgIHBhcmFtcy5vcCA9IENGMl9QYXRoT3BMaW5lVG87Ci0KLSAgICAgIC8qIG5vdGU6IHB0MiBhbmQgcHQzIGFyZSB1bnVzZWQgKi8KLQotICAgICAgaWYgKCBjbG9zZSApCi0gICAgICB7Ci0gICAgICAgIC8qIHVzZSBmaXJzdCBoaW50IG1hcCBpZiBjbG9zaW5nICovCi0gICAgICAgIGNmMl9nbHlwaHBhdGhfaGludFBvaW50KCBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2x5cGhwYXRoLT5maXJzdEhpbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLnB0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+cHJldkVsZW1QMS54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT5wcmV2RWxlbVAxLnkgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgY2YyX2dseXBocGF0aF9oaW50UG9pbnQoIGdseXBocGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLnB0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+cHJldkVsZW1QMS54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT5wcmV2RWxlbVAxLnkgKTsKLSAgICAgIH0KLQotICAgICAgLyogb3V0cHV0IG9ubHkgbm9uLXplcm8gbGVuZ3RoIGxpbmVzICovCi0gICAgICBpZiAoIHBhcmFtcy5wdDAueCAhPSBwYXJhbXMucHQxLnggfHwgcGFyYW1zLnB0MC55ICE9IHBhcmFtcy5wdDEueSApCi0gICAgICB7Ci0gICAgICAgIGdseXBocGF0aC0+Y2FsbGJhY2tzLT5saW5lVG8oIGdseXBocGF0aC0+Y2FsbGJhY2tzLCAmcGFyYW1zICk7Ci0KLSAgICAgICAgZ2x5cGhwYXRoLT5jdXJyZW50RFMgPSBwYXJhbXMucHQxOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIENGMl9QYXRoT3BDdWJlVG86Ci0gICAgICBwYXJhbXMub3AgPSBDRjJfUGF0aE9wQ3ViZVRvOwotCi0gICAgICAvKiBUT0RPOiBzaG91bGQgd2UgaW50ZXJzZWN0IHRoZSBpbnRlcmlvciBqb2lucyAocDEtcDIgYW5kIHAyLXAzKT8gKi8KLSAgICAgIGNmMl9nbHlwaHBhdGhfaGludFBvaW50KCBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLnB0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPnByZXZFbGVtUDEueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPnByZXZFbGVtUDEueSApOwotICAgICAgY2YyX2dseXBocGF0aF9oaW50UG9pbnQoIGdseXBocGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMucHQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+cHJldkVsZW1QMi54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+cHJldkVsZW1QMi55ICk7Ci0gICAgICBjZjJfZ2x5cGhwYXRoX2hpbnRQb2ludCggZ2x5cGhwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcy5wdDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT5wcmV2RWxlbVAzLngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT5wcmV2RWxlbVAzLnkgKTsKLQotICAgICAgZ2x5cGhwYXRoLT5jYWxsYmFja3MtPmN1YmVUbyggZ2x5cGhwYXRoLT5jYWxsYmFja3MsICZwYXJhbXMgKTsKLQotICAgICAgZ2x5cGhwYXRoLT5jdXJyZW50RFMgPSBwYXJhbXMucHQzOwotCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoICF1c2VJbnRlcnNlY3Rpb24gfHwgY2xvc2UgKQotICAgIHsKLSAgICAgIC8qIGluc2VydCBjb25uZWN0aW5nIGxpbmUgYmV0d2VlbiBlbmQgb2YgcHJldmlvdXMgZWxlbWVudCBhbmQgc3RhcnQgKi8KLSAgICAgIC8qIG9mIGN1cnJlbnQgb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIG5vdGU6IGF0IHRoZSBlbmQgb2YgYSBzdWJwYXRoLCB3ZSBtaWdodCBkbyBib3RoLCBzbyB1c2UgYG5leHRQMCcgKi8KLSAgICAgIC8qIGJlZm9yZSB3ZSBjaGFuZ2UgaXQsIGJlbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgaWYgKCBjbG9zZSApCi0gICAgICB7Ci0gICAgICAgIC8qIGlmIHdlIGFyZSBjbG9zaW5nIHRoZSBzdWJwYXRoLCB0aGVuIG5leHRQMCBpcyBpbiB0aGUgZmlyc3QgICAgICovCi0gICAgICAgIC8qIGhpbnQgem9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGNmMl9nbHlwaHBhdGhfaGludFBvaW50KCBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2x5cGhwYXRoLT5maXJzdEhpbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLnB0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRQMC0+eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRQMC0+eSApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjZjJfZ2x5cGhwYXRoX2hpbnRQb2ludCggZ2x5cGhwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMucHQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFAwLT54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFAwLT55ICk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggcGFyYW1zLnB0MS54ICE9IGdseXBocGF0aC0+Y3VycmVudERTLnggfHwKLSAgICAgICAgICAgcGFyYW1zLnB0MS55ICE9IGdseXBocGF0aC0+Y3VycmVudERTLnkgKQotICAgICAgewotICAgICAgICAvKiBsZW5ndGggaXMgbm9uemVybyAqLwotICAgICAgICBwYXJhbXMub3AgID0gQ0YyX1BhdGhPcExpbmVUbzsKLSAgICAgICAgcGFyYW1zLnB0MCA9IGdseXBocGF0aC0+Y3VycmVudERTOwotCi0gICAgICAgIC8qIG5vdGU6IHB0MiBhbmQgcHQzIGFyZSB1bnVzZWQgKi8KLSAgICAgICAgZ2x5cGhwYXRoLT5jYWxsYmFja3MtPmxpbmVUbyggZ2x5cGhwYXRoLT5jYWxsYmFja3MsICZwYXJhbXMgKTsKLQotICAgICAgICBnbHlwaHBhdGgtPmN1cnJlbnREUyA9IHBhcmFtcy5wdDE7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCB1c2VJbnRlcnNlY3Rpb24gKQotICAgIHsKLSAgICAgIC8qIHJldHVybiBpbnRlcnNlY3Rpb24gcG9pbnQgdG8gY2FsbGVyICovCi0gICAgICAqbmV4dFAwID0gaW50ZXJzZWN0aW9uOwotICAgIH0KLSAgfQotCi0KLSAgLyogcHVzaCBhIE1vdmVUbyBlbGVtZW50IGJhc2VkIG9uIGN1cnJlbnQgcG9pbnQgYW5kIG9mZnNldCBvZiBjdXJyZW50ICovCi0gIC8qIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBjZjJfZ2x5cGhwYXRoX3B1c2hNb3ZlKCBDRjJfR2x5cGhQYXRoICBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciAgICAgIHN0YXJ0ICkKLSAgewotICAgIENGMl9DYWxsYmFja1BhcmFtc1JlYyAgcGFyYW1zOwotCi0KLSAgICBwYXJhbXMub3AgID0gQ0YyX1BhdGhPcE1vdmVUbzsKLSAgICBwYXJhbXMucHQwID0gZ2x5cGhwYXRoLT5jdXJyZW50RFM7Ci0KLSAgICAvKiBUZXN0IGlmIG1vdmUgaGFzIHJlYWxseSBoYXBwZW5lZCB5ZXQ7IGl0IHdvdWxkIGhhdmUgY2FsbGVkICovCi0gICAgLyogYGNmMl9oaW50bWFwX2J1aWxkJyB0byBzZXQgYGlzVmFsaWQnLiAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggIWNmMl9oaW50bWFwX2lzVmFsaWQoICZnbHlwaHBhdGgtPmhpbnRNYXAgKSApCi0gICAgewotICAgICAgLyogd2UgYXJlIGhlcmUgaWZmIGZpcnN0IHN1YnBhdGggaXMgbWlzc2luZyBhIG1vdmV0byBvcGVyYXRvcjogKi8KLSAgICAgIC8qIHN5bnRoZXNpemUgZmlyc3QgbW92ZVRvIHRvIGZpbmlzaCBpbml0aWFsaXphdGlvbiBvZiBoaW50TWFwICovCi0gICAgICBjZjJfZ2x5cGhwYXRoX21vdmVUbyggZ2x5cGhwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+c3RhcnQueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPnN0YXJ0LnkgKTsKLSAgICB9Ci0KLSAgICBjZjJfZ2x5cGhwYXRoX2hpbnRQb2ludCggZ2x5cGhwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2x5cGhwYXRoLT5oaW50TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLnB0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQueSApOwotCi0gICAgLyogbm90ZTogcHQyIGFuZCBwdDMgYXJlIHVudXNlZCAqLwotICAgIGdseXBocGF0aC0+Y2FsbGJhY2tzLT5tb3ZlVG8oIGdseXBocGF0aC0+Y2FsbGJhY2tzLCAmcGFyYW1zICk7Ci0KLSAgICBnbHlwaHBhdGgtPmN1cnJlbnREUyAgICA9IHBhcmFtcy5wdDE7Ci0gICAgZ2x5cGhwYXRoLT5vZmZzZXRTdGFydDAgPSBzdGFydDsKLSAgfQotCi0KLSAgLyoKLSAgICogQWxsIGNvb3JkaW5hdGVzIGFyZSBpbiBjaGFyYWN0ZXIgc3BhY2UuCi0gICAqIE9uIGlucHV0LCAoeDEsIHkxKSBhbmQgKHgyLCB5MikgZ2l2ZSBsaW5lIHNlZ21lbnQuCi0gICAqIE9uIG91dHB1dCwgKHgsIHkpIGdpdmUgb2Zmc2V0IHZlY3Rvci4KLSAgICogV2UgdXNlIGEgcGllY2V3aXNlIGFwcHJveGltYXRpb24gdG8gdHJpZyBmdW5jdGlvbnMuCi0gICAqCi0gICAqIFRPRE86IE9mZnNldCB0cnVlIHBlcnBlbmRpY3VsYXIgYW5kIHByb3BlciBsZW5ndGgKLSAgICogICAgICAgc3VwcGx5IHRoZSB5LXRyYW5zbGF0aW9uIGZvciBoaW50aW5nIGhlcmUsIHRvbywKLSAgICogICAgICAgdGhhdCBhZGRzIHlPZmZzZXQgdW5jb25kaXRpb25hbGx5IHRvICp5LgotICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgY2YyX2dseXBocGF0aF9jb21wdXRlT2Zmc2V0KCBDRjJfR2x5cGhQYXRoICBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgeTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgeDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgeTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkKiAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQqICAgICB5ICkKLSAgewotICAgIENGMl9GaXhlZCAgZHggPSB4MiAtIHgxOwotICAgIENGMl9GaXhlZCAgZHkgPSB5MiAtIHkxOwotCi0KLSAgICAvKiBub3RlOiBuZWdhdGl2ZSBvZmZzZXRzIGRvbid0IHdvcmsgaGVyZTsgbmVnYXRlIGRlbHRhcyB0byBjaGFuZ2UgKi8KLSAgICAvKiBxdWFkcmFudHMsIGJlbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGdseXBocGF0aC0+Zm9udC0+cmV2ZXJzZVdpbmRpbmcgKQotICAgIHsKLSAgICAgIGR4ID0gLWR4OwotICAgICAgZHkgPSAtZHk7Ci0gICAgfQotCi0gICAgKnggPSAqeSA9IDA7Ci0KLSAgICBpZiAoICFnbHlwaHBhdGgtPmRhcmtlbiApCi0gICAgICAgIHJldHVybjsKLQotICAgIC8qIGFkZCBtb21lbnR1bSBmb3IgdGhpcyBwYXRoIGVsZW1lbnQgKi8KLSAgICBnbHlwaHBhdGgtPmNhbGxiYWNrcy0+d2luZGluZ01vbWVudHVtICs9Ci0gICAgICBjZjJfZ2V0V2luZGluZ01vbWVudHVtKCB4MSwgeTEsIHgyLCB5MiApOwotCi0gICAgLyogbm90ZTogYWxsb3cgbWl4ZWQgaW50ZWdlciBhbmQgZml4ZWQgbXVsdGlwbGljYXRpb24gaGVyZSAqLwotICAgIGlmICggZHggPj0gMCApCi0gICAgewotICAgICAgaWYgKCBkeSA+PSAwICkKLSAgICAgIHsKLSAgICAgICAgLyogZmlyc3QgcXVhZHJhbnQsICt4ICt5ICovCi0KLSAgICAgICAgaWYgKCBkeCA+IDIgKiBkeSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiAreCAqLwotICAgICAgICAgICp4ID0gMDsKLSAgICAgICAgICAqeSA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIGR5ID4gMiAqIGR4ICkKLSAgICAgICAgewotICAgICAgICAgIC8qICt5ICovCi0gICAgICAgICAgKnggPSBnbHlwaHBhdGgtPnhPZmZzZXQ7Ci0gICAgICAgICAgKnkgPSBnbHlwaHBhdGgtPnlPZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogK3ggK3kgKi8KLSAgICAgICAgICAqeCA9IEZUX011bEZpeCggY2YyX2Zsb2F0VG9GaXhlZCggMC43ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+eE9mZnNldCApOwotICAgICAgICAgICp5ID0gRlRfTXVsRml4KCBjZjJfZmxvYXRUb0ZpeGVkKCAxLjAgLSAwLjcgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT55T2Zmc2V0ICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogZm91cnRoIHF1YWRyYW50LCAreCAteSAqLwotCi0gICAgICAgIGlmICggZHggPiAtMiAqIGR5ICkKLSAgICAgICAgewotICAgICAgICAgIC8qICt4ICovCi0gICAgICAgICAgKnggPSAwOwotICAgICAgICAgICp5ID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggLWR5ID4gMiAqIGR4ICkKLSAgICAgICAgewotICAgICAgICAgIC8qIC15ICovCi0gICAgICAgICAgKnggPSAtZ2x5cGhwYXRoLT54T2Zmc2V0OwotICAgICAgICAgICp5ID0gZ2x5cGhwYXRoLT55T2Zmc2V0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8qICt4IC15ICovCi0gICAgICAgICAgKnggPSBGVF9NdWxGaXgoIGNmMl9mbG9hdFRvRml4ZWQoIC0wLjcgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT54T2Zmc2V0ICk7Ci0gICAgICAgICAgKnkgPSBGVF9NdWxGaXgoIGNmMl9mbG9hdFRvRml4ZWQoIDEuMCAtIDAuNyApLAotICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPnlPZmZzZXQgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCBkeSA+PSAwICkKLSAgICAgIHsKLSAgICAgICAgLyogc2Vjb25kIHF1YWRyYW50LCAteCAreSAqLwotCi0gICAgICAgIGlmICggLWR4ID4gMiAqIGR5ICkKLSAgICAgICAgewotICAgICAgICAgIC8qIC14ICovCi0gICAgICAgICAgKnggPSAwOwotICAgICAgICAgICp5ID0gMiAqIGdseXBocGF0aC0+eU9mZnNldDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggZHkgPiAtMiAqIGR4ICkKLSAgICAgICAgewotICAgICAgICAgIC8qICt5ICovCi0gICAgICAgICAgKnggPSBnbHlwaHBhdGgtPnhPZmZzZXQ7Ci0gICAgICAgICAgKnkgPSBnbHlwaHBhdGgtPnlPZmZzZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogLXggK3kgKi8KLSAgICAgICAgICAqeCA9IEZUX011bEZpeCggY2YyX2Zsb2F0VG9GaXhlZCggMC43ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+eE9mZnNldCApOwotICAgICAgICAgICp5ID0gRlRfTXVsRml4KCBjZjJfZmxvYXRUb0ZpeGVkKCAxLjAgKyAwLjcgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT55T2Zmc2V0ICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogdGhpcmQgcXVhZHJhbnQsIC14IC15ICovCi0KLSAgICAgICAgaWYgKCAtZHggPiAtMiAqIGR5ICkKLSAgICAgICAgewotICAgICAgICAgIC8qIC14ICovCi0gICAgICAgICAgKnggPSAwOwotICAgICAgICAgICp5ID0gMiAqIGdseXBocGF0aC0+eU9mZnNldDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggLWR5ID4gLTIgKiBkeCApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiAteSAqLwotICAgICAgICAgICp4ID0gLWdseXBocGF0aC0+eE9mZnNldDsKLSAgICAgICAgICAqeSA9IGdseXBocGF0aC0+eU9mZnNldDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvKiAteCAteSAqLwotICAgICAgICAgICp4ID0gRlRfTXVsRml4KCBjZjJfZmxvYXRUb0ZpeGVkKCAtMC43ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+eE9mZnNldCApOwotICAgICAgICAgICp5ID0gRlRfTXVsRml4KCBjZjJfZmxvYXRUb0ZpeGVkKCAxLjAgKyAwLjcgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT55T2Zmc2V0ICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qCi0gICAqIFRoZSBmdW5jdGlvbnMgY2YyX2dseXBocGF0aF97bW92ZVRvLGxpbmVUbyxjdXJ2ZVRvLGNsb3NlT3BlblBhdGh9IGFyZQotICAgKiBjYWxsZWQgYnkgdGhlIGludGVycHJldGVyIHdpdGggQ2hhcmFjdGVyIFNwYWNlIChDUykgY29vcmRpbmF0ZXMuICBFYWNoCi0gICAqIHBhdGggZWxlbWVudCBpcyBwbGFjZWQgaW50byBhIHF1ZXVlIG9mIGxlbmd0aCBvbmUgdG8gYXdhaXQgdGhlCi0gICAqIGNhbGN1bGF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgZWxlbWVudC4gIEF0IHRoYXQgdGltZSwgdGhlIGRhcmtlbmluZwotICAgKiBvZmZzZXQgb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50IGlzIGtub3duIGFuZCBqb2lucyBjYW4gYmUgY29tcHV0ZWQsCi0gICAqIGluY2x1ZGluZyBwb3NzaWJsZSBtb2RpZmljYXRpb24gb2YgdGhpcyBlbGVtZW50LCBiZWZvcmUgbWFwcGluZyB0bwotICAgKiBEZXZpY2UgU3BhY2UgKERTKSBhbmQgcGFzc2luZyBpdCBvbiB0byB0aGUgb3V0bGluZSBjb25zdW1lci4KLSAgICoKLSAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9nbHlwaHBhdGhfbW92ZVRvKCBDRjJfR2x5cGhQYXRoICBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgeSApCi0gIHsKLSAgICBjZjJfZ2x5cGhwYXRoX2Nsb3NlT3BlblBhdGgoIGdseXBocGF0aCApOwotCi0gICAgLyogc2F2ZSB0aGUgcGFyYW1ldGVycyBvZiB0aGUgbW92ZSBmb3IgbGF0ZXIsIHdoZW4gd2UnbGwga25vdyBob3cgdG8gKi8KLSAgICAvKiBvZmZzZXQgaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIGFsc28gc2F2ZSBsYXN0IG1vdmUgcG9pbnQgKi8KLSAgICBnbHlwaHBhdGgtPmN1cnJlbnRDUy54ID0gZ2x5cGhwYXRoLT5zdGFydC54ID0geDsKLSAgICBnbHlwaHBhdGgtPmN1cnJlbnRDUy55ID0gZ2x5cGhwYXRoLT5zdGFydC55ID0geTsKLQotICAgIGdseXBocGF0aC0+bW92ZUlzUGVuZGluZyA9IFRSVUU7Ci0KLSAgICAvKiBlbnN1cmUgd2UgaGF2ZSBhIHZhbGlkIG1hcCB3aXRoIGN1cnJlbnQgbWFzayAqLwotICAgIGlmICggIWNmMl9oaW50bWFwX2lzVmFsaWQoICZnbHlwaHBhdGgtPmhpbnRNYXAgKSB8fAotICAgICAgICAgY2YyX2hpbnRtYXNrX2lzTmV3KCBnbHlwaHBhdGgtPmhpbnRNYXNrICkgICApCi0gICAgICBjZjJfaGludG1hcF9idWlsZCggJmdseXBocGF0aC0+aGludE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPmhTdGVtSGludEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+dlN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT5oaW50TWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPmhpbnRPcmlnaW5ZLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFICk7Ci0KLSAgICAvKiBzYXZlIGEgY29weSBvZiBjdXJyZW50IEhpbnRNYXAgdG8gdXNlIHdoZW4gZHJhd2luZyBpbml0aWFsIHBvaW50ICovCi0gICAgZ2x5cGhwYXRoLT5maXJzdEhpbnRNYXAgPSBnbHlwaHBhdGgtPmhpbnRNYXA7ICAgICAvKiBzdHJ1Y3R1cmUgY29weSAqLwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZjJfZ2x5cGhwYXRoX2xpbmVUbyggQ0YyX0dseXBoUGF0aCAgZ2x5cGhwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgIHkgKQotICB7Ci0gICAgQ0YyX0ZpeGVkICB4T2Zmc2V0LCB5T2Zmc2V0OwotICAgIEZUX1ZlY3RvciAgUDAsIFAxOwotICAgIEZUX0Jvb2wgICAgbmV3SGludE1hcDsKLQotICAgIC8qCi0gICAgICogTmV3IGhpbnRzIHdpbGwgYmUgYXBwbGllZCBhZnRlciBjZjJfZ2x5cGhwYXRoX3B1c2hQcmV2RWxlbSBoYXMgcnVuLgotICAgICAqIEluIGNhc2UgdGhpcyBpcyBhIHN5bnRoZXNpemVkIGNsb3NpbmcgbGluZSwgYW55IG5ldyBoaW50cyBzaG91bGQgYmUKLSAgICAgKiBkZWxheWVkIHVudGlsIHRoaXMgcGF0aCBpcyBjbG9zZWQgKGBjZjJfaGludG1hc2tfaXNOZXcnIHdpbGwgYmUKLSAgICAgKiBjYWxsZWQgYWdhaW4gYmVmb3JlIHRoZSBuZXh0IGxpbmUgb3IgY3VydmUpLgotICAgICAqLwotCi0gICAgLyogdHJ1ZSBpZiBuZXcgaGludCBtYXAgbm90IG9uIGNsb3NlICovCi0gICAgbmV3SGludE1hcCA9IGNmMl9oaW50bWFza19pc05ldyggZ2x5cGhwYXRoLT5oaW50TWFzayApICYmCi0gICAgICAgICAgICAgICAgICFnbHlwaHBhdGgtPnBhdGhJc0Nsb3Npbmc7Ci0KLSAgICAvKgotICAgICAqIFplcm8tbGVuZ3RoIGxpbmVzIG1heSBvY2N1ciBpbiB0aGUgY2hhcnN0cmluZy4gIEJlY2F1c2Ugd2UgY2Fubm90Ci0gICAgICogY29tcHV0ZSBkYXJrZW5pbmcgb2Zmc2V0cyBvciBpbnRlcnNlY3Rpb25zIGZyb20gemVyby1sZW5ndGggbGluZXMsCi0gICAgICogaXQgaXMgYmVzdCB0byByZW1vdmUgdGhlbSBhbmQgYXZvaWQgYXJ0aWZhY3RzLiAgSG93ZXZlciwgemVyby1sZW5ndGgKLSAgICAgKiBsaW5lcyBpbiBDUyBhdCB0aGUgc3RhcnQgb2YgYSBuZXcgaGludCBtYXAgY2FuIGdlbmVyYXRlIG5vbi16ZXJvCi0gICAgICogbGluZXMgaW4gRFMgZHVlIHRvIGhpbnQgc3Vic3RpdHV0aW9uLiAgV2UgZGV0ZWN0IGEgY2hhbmdlIGluIGhpbnQKLSAgICAgKiBtYXAgaGVyZSBhbmQgcGFzcyB0aG9zZSB6ZXJvLWxlbmd0aCBsaW5lcyBhbG9uZy4KLSAgICAgKi8KLQotICAgIC8qCi0gICAgICogTm90ZTogRmluZCBleHBsaWNpdGx5IGNsb3NlZCBwYXRocyBoZXJlIHdpdGggYSBjb25kaXRpb25hbAotICAgICAqICAgICAgIGJyZWFrcG9pbnQgdXNpbmcKLSAgICAgKgotICAgICAqICAgICAgICAgIWdwLT5wYXRoSXNDbG9zaW5nICYmIGdwLT5zdGFydC54ID09IHggJiYgZ3AtPnN0YXJ0LnkgPT0geQotICAgICAqCi0gICAgICovCi0KLSAgICBpZiAoIGdseXBocGF0aC0+Y3VycmVudENTLnggPT0geCAmJgotICAgICAgICAgZ2x5cGhwYXRoLT5jdXJyZW50Q1MueSA9PSB5ICYmCi0gICAgICAgICAhbmV3SGludE1hcCAgICAgICAgICAgICAgICAgKQotICAgICAgLyoKLSAgICAgICAqIElnbm9yZSB6ZXJvLWxlbmd0aCBsaW5lcyBpbiBDUyB3aGVyZSB0aGUgaGludCBtYXAgaXMgdGhlIHNhbWUKLSAgICAgICAqIGJlY2F1c2UgdGhlIGxpbmUgaW4gRFMgd2lsbCBhbHNvIGJlIHplcm8gbGVuZ3RoLgotICAgICAgICoKLSAgICAgICAqIElnbm9yZSB6ZXJvLWxlbmd0aCBsaW5lcyB3aGVuIHdlIHN5bnRoZXNpemUgYSBjbG9zaW5nIGxpbmUgYmVjYXVzZQotICAgICAgICogdGhlIGNsb3NlIHdpbGwgYmUgaGFuZGxlZCBpbiBjZjJfZ2x5cGhQYXRoX3B1c2hQcmV2RWxlbS4KLSAgICAgICAqLwotICAgICAgcmV0dXJuOwotCi0gICAgY2YyX2dseXBocGF0aF9jb21wdXRlT2Zmc2V0KCBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPmN1cnJlbnRDUy54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT5jdXJyZW50Q1MueSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnhPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeU9mZnNldCApOwotCi0gICAgLyogY29uc3RydWN0IG9mZnNldCBwb2ludHMgKi8KLSAgICBQMC54ID0gZ2x5cGhwYXRoLT5jdXJyZW50Q1MueCArIHhPZmZzZXQ7Ci0gICAgUDAueSA9IGdseXBocGF0aC0+Y3VycmVudENTLnkgKyB5T2Zmc2V0OwotICAgIFAxLnggPSB4ICsgeE9mZnNldDsKLSAgICBQMS55ID0geSArIHlPZmZzZXQ7Ci0KLSAgICBpZiAoIGdseXBocGF0aC0+bW92ZUlzUGVuZGluZyApCi0gICAgewotICAgICAgLyogZW1pdCBvZmZzZXQgMXN0IHBvaW50IGFzIE1vdmVUbyAqLwotICAgICAgY2YyX2dseXBocGF0aF9wdXNoTW92ZSggZ2x5cGhwYXRoLCBQMCApOwotCi0gICAgICBnbHlwaHBhdGgtPm1vdmVJc1BlbmRpbmcgPSBGQUxTRTsgIC8qIGFkanVzdCBzdGF0ZSBtYWNoaW5lICovCi0gICAgICBnbHlwaHBhdGgtPnBhdGhJc09wZW4gICAgPSBUUlVFOwotCi0gICAgICBnbHlwaHBhdGgtPm9mZnNldFN0YXJ0MSA9IFAxOyAgICAgICAgICAgICAgLyogcmVjb3JkIHNlY29uZCBwb2ludCAqLwotICAgIH0KLQotICAgIGlmICggZ2x5cGhwYXRoLT5lbGVtSXNRdWV1ZWQgKQotICAgIHsKLSAgICAgIEZUX0FTU0VSVCggY2YyX2hpbnRtYXBfaXNWYWxpZCggJmdseXBocGF0aC0+aGludE1hcCApIHx8Ci0gICAgICAgICAgICAgICAgIGdseXBocGF0aC0+aGludE1hcC5jb3VudCA9PSAwICAgICAgICAgICAgICApOwotCi0gICAgICBjZjJfZ2x5cGhwYXRoX3B1c2hQcmV2RWxlbSggZ2x5cGhwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbHlwaHBhdGgtPmhpbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFICk7Ci0gICAgfQotCi0gICAgLyogcXVldWUgdGhlIGN1cnJlbnQgZWxlbWVudCB3aXRoIG9mZnNldCBwb2ludHMgKi8KLSAgICBnbHlwaHBhdGgtPmVsZW1Jc1F1ZXVlZCA9IFRSVUU7Ci0gICAgZ2x5cGhwYXRoLT5wcmV2RWxlbU9wICAgPSBDRjJfUGF0aE9wTGluZVRvOwotICAgIGdseXBocGF0aC0+cHJldkVsZW1QMCAgID0gUDA7Ci0gICAgZ2x5cGhwYXRoLT5wcmV2RWxlbVAxICAgPSBQMTsKLQotICAgIC8qIHVwZGF0ZSBjdXJyZW50IG1hcCAqLwotICAgIGlmICggbmV3SGludE1hcCApCi0gICAgICBjZjJfaGludG1hcF9idWlsZCggJmdseXBocGF0aC0+aGludE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPmhTdGVtSGludEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+dlN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT5oaW50TWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPmhpbnRPcmlnaW5ZLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFICk7Ci0KLSAgICBnbHlwaHBhdGgtPmN1cnJlbnRDUy54ID0geDsgICAgIC8qIHByZS1vZmZzZXQgY3VycmVudCBwb2ludCAqLwotICAgIGdseXBocGF0aC0+Y3VycmVudENTLnkgPSB5OwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZjJfZ2x5cGhwYXRoX2N1cnZlVG8oIENGMl9HbHlwaFBhdGggIGdseXBocGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgICB4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgICB5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgICB4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgICB5MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgICB4MywKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgICB5MyApCi0gIHsKLSAgICBDRjJfRml4ZWQgIHhPZmZzZXQxLCB5T2Zmc2V0MSwgeE9mZnNldDMsIHlPZmZzZXQzOwotICAgIEZUX1ZlY3RvciAgUDAsIFAxLCBQMiwgUDM7Ci0KLQotICAgIC8qIFRPRE86IGlnbm9yZSB6ZXJvIGxlbmd0aCBwb3J0aW9ucyBvZiBjdXJ2ZT8/ICovCi0gICAgY2YyX2dseXBocGF0aF9jb21wdXRlT2Zmc2V0KCBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPmN1cnJlbnRDUy54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT5jdXJyZW50Q1MueSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeE9mZnNldDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmeU9mZnNldDEgKTsKLSAgICBjZjJfZ2x5cGhwYXRoX2NvbXB1dGVPZmZzZXQoIGdseXBocGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnhPZmZzZXQzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnlPZmZzZXQzICk7Ci0KLSAgICAvKiBhZGQgbW9tZW50dW0gZnJvbSB0aGUgbWlkZGxlIHNlZ21lbnQgKi8KLSAgICBnbHlwaHBhdGgtPmNhbGxiYWNrcy0+d2luZGluZ01vbWVudHVtICs9Ci0gICAgICBjZjJfZ2V0V2luZGluZ01vbWVudHVtKCB4MSwgeTEsIHgyLCB5MiApOwotCi0gICAgLyogY29uc3RydWN0IG9mZnNldCBwb2ludHMgKi8KLSAgICBQMC54ID0gZ2x5cGhwYXRoLT5jdXJyZW50Q1MueCArIHhPZmZzZXQxOwotICAgIFAwLnkgPSBnbHlwaHBhdGgtPmN1cnJlbnRDUy55ICsgeU9mZnNldDE7Ci0gICAgUDEueCA9IHgxICsgeE9mZnNldDE7Ci0gICAgUDEueSA9IHkxICsgeU9mZnNldDE7Ci0gICAgLyogbm90ZTogcHJlc2VydmUgYW5nbGUgb2YgZmluYWwgc2VnbWVudCBieSB1c2luZyBvZmZzZXQzIGF0IGJvdGggZW5kcyAqLwotICAgIFAyLnggPSB4MiArIHhPZmZzZXQzOwotICAgIFAyLnkgPSB5MiArIHlPZmZzZXQzOwotICAgIFAzLnggPSB4MyArIHhPZmZzZXQzOwotICAgIFAzLnkgPSB5MyArIHlPZmZzZXQzOwotCi0gICAgaWYgKCBnbHlwaHBhdGgtPm1vdmVJc1BlbmRpbmcgKQotICAgIHsKLSAgICAgIC8qIGVtaXQgb2Zmc2V0IDFzdCBwb2ludCBhcyBNb3ZlVG8gKi8KLSAgICAgIGNmMl9nbHlwaHBhdGhfcHVzaE1vdmUoIGdseXBocGF0aCwgUDAgKTsKLQotICAgICAgZ2x5cGhwYXRoLT5tb3ZlSXNQZW5kaW5nID0gRkFMU0U7Ci0gICAgICBnbHlwaHBhdGgtPnBhdGhJc09wZW4gICAgPSBUUlVFOwotCi0gICAgICBnbHlwaHBhdGgtPm9mZnNldFN0YXJ0MSA9IFAxOyAgICAgICAgICAgICAgLyogcmVjb3JkIHNlY29uZCBwb2ludCAqLwotICAgIH0KLQotICAgIGlmICggZ2x5cGhwYXRoLT5lbGVtSXNRdWV1ZWQgKQotICAgIHsKLSAgICAgIEZUX0FTU0VSVCggY2YyX2hpbnRtYXBfaXNWYWxpZCggJmdseXBocGF0aC0+aGludE1hcCApIHx8Ci0gICAgICAgICAgICAgICAgIGdseXBocGF0aC0+aGludE1hcC5jb3VudCA9PSAwICAgICAgICAgICAgICApOwotCi0gICAgICBjZjJfZ2x5cGhwYXRoX3B1c2hQcmV2RWxlbSggZ2x5cGhwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbHlwaHBhdGgtPmhpbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFICk7Ci0gICAgfQotCi0gICAgLyogcXVldWUgdGhlIGN1cnJlbnQgZWxlbWVudCB3aXRoIG9mZnNldCBwb2ludHMgKi8KLSAgICBnbHlwaHBhdGgtPmVsZW1Jc1F1ZXVlZCA9IFRSVUU7Ci0gICAgZ2x5cGhwYXRoLT5wcmV2RWxlbU9wICAgPSBDRjJfUGF0aE9wQ3ViZVRvOwotICAgIGdseXBocGF0aC0+cHJldkVsZW1QMCAgID0gUDA7Ci0gICAgZ2x5cGhwYXRoLT5wcmV2RWxlbVAxICAgPSBQMTsKLSAgICBnbHlwaHBhdGgtPnByZXZFbGVtUDIgICA9IFAyOwotICAgIGdseXBocGF0aC0+cHJldkVsZW1QMyAgID0gUDM7Ci0KLSAgICAvKiB1cGRhdGUgY3VycmVudCBtYXAgKi8KLSAgICBpZiAoIGNmMl9oaW50bWFza19pc05ldyggZ2x5cGhwYXRoLT5oaW50TWFzayApICkKLSAgICAgIGNmMl9oaW50bWFwX2J1aWxkKCAmZ2x5cGhwYXRoLT5oaW50TWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+aFN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhwYXRoLT52U3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPmhpbnRNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+aGludE9yaWdpblksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgKTsKLQotICAgIGdseXBocGF0aC0+Y3VycmVudENTLnggPSB4MzsgICAgICAgLyogcHJlLW9mZnNldCBjdXJyZW50IHBvaW50ICovCi0gICAgZ2x5cGhwYXRoLT5jdXJyZW50Q1MueSA9IHkzOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZjJfZ2x5cGhwYXRoX2Nsb3NlT3BlblBhdGgoIENGMl9HbHlwaFBhdGggIGdseXBocGF0aCApCi0gIHsKLSAgICBpZiAoIGdseXBocGF0aC0+cGF0aElzT3BlbiApCi0gICAgewotICAgICAgLyoKLSAgICAgICAqIEEgY2xvc2luZyBsaW5lIGluIENoYXJhY3RlciBTcGFjZSBsaW5lIGlzIGFsd2F5cyBnZW5lcmF0ZWQgYmVsb3cKLSAgICAgICAqIHdpdGggYGNmMl9nbHlwaFBhdGhfbGluZVRvJy4gIEl0IG1heSBiZSBpZ25vcmVkIGxhdGVyIGlmIGl0IHR1cm5zCi0gICAgICAgKiBvdXQgdG8gYmUgemVybyBsZW5ndGggaW4gRGV2aWNlIFNwYWNlLgotICAgICAgICovCi0gICAgICBnbHlwaHBhdGgtPnBhdGhJc0Nsb3NpbmcgPSBUUlVFOwotCi0gICAgICBjZjJfZ2x5cGhwYXRoX2xpbmVUbyggZ2x5cGhwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBocGF0aC0+c3RhcnQueCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPnN0YXJ0LnkgKTsKLQotICAgICAgLyogZW1wdHkgdGhlIGZpbmFsIGVsZW1lbnQgZnJvbSB0aGUgcXVldWUgYW5kIGNsb3NlIHRoZSBwYXRoICovCi0gICAgICBpZiAoIGdseXBocGF0aC0+ZWxlbUlzUXVldWVkICkKLSAgICAgICAgY2YyX2dseXBocGF0aF9wdXNoUHJldkVsZW0oIGdseXBocGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbHlwaHBhdGgtPmhpbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2x5cGhwYXRoLT5vZmZzZXRTdGFydDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaHBhdGgtPm9mZnNldFN0YXJ0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgKTsKLQotICAgICAgLyogcmVzZXQgc3RhdGUgbWFjaGluZSAqLwotICAgICAgZ2x5cGhwYXRoLT5tb3ZlSXNQZW5kaW5nID0gVFJVRTsKLSAgICAgIGdseXBocGF0aC0+cGF0aElzT3BlbiAgICA9IEZBTFNFOwotICAgICAgZ2x5cGhwYXRoLT5wYXRoSXNDbG9zaW5nID0gRkFMU0U7Ci0gICAgICBnbHlwaHBhdGgtPmVsZW1Jc1F1ZXVlZCAgPSBGQUxTRTsKLSAgICB9Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyaGludHMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyaGludHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI1ZDkxYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmhpbnRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2YyaGludHMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFkb2JlJ3MgY29kZSBmb3IgaGFuZGxpbmcgQ0ZGIGhpbnRzIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LTIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvciAgICAgICAqLwotLyogIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkICAgICAgKi8KLS8qICBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZSAgICovCi0vKiAgdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCAgICAqLwotLyogIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cyAgICovCi0vKiAgdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSAgICAqLwotLyogIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvciAgICAgKi8KLS8qICAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgICAgICAgICAgICAgICovCi0vKiAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCAgICAqLwotLyogIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kICAgICAgKi8KLS8qICBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgICovCi0vKiAgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgICAgICAqLwotLyogIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgICAgKi8KLS8qICBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMgICAgICAgICovCi0vKiAgc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgICAgICAqLwotLyogIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0ICAgKi8KLS8qICB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzICAgICovCi0vKiAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgICAqLwotLyogIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAgKi8KLS8qICB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgICAgKi8KLS8qICBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAgICAgICAgICAgICAgICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLCAgICAqLwotLyogIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19DRjJISU5UU19IX18KLSNkZWZpbmUgX19DRjJISU5UU19IX18KLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIGVudW0KLSAgewotICAgIENGMl9NQVhfSElOVFMgPSA5NiAgICAvKiBtYXhpbXVtICMgb2YgaGludHMgKi8KLSAgfTsKLQotCi0gIC8qCi0gICAqIEEgSGludE1hc2sgb2JqZWN0IHN0b3JlcyBhIGJpdCBtYXNrIHRoYXQgc3BlY2lmaWVzIHdoaWNoIGhpbnRzIGluIHRoZQotICAgKiBjaGFyc3RyaW5nIGFyZSBhY3RpdmUgYXQgYSBnaXZlbiB0aW1lLiAgSGludHMgaW4gQ0ZGIG11c3QgYmUgZGVjbGFyZWQKLSAgICogYXQgdGhlIHN0YXJ0LCBiZWZvcmUgYW55IGRyYXdpbmcgb3BlcmF0b3JzLCB3aXRoIGhvcml6b250YWwgaGludHMKLSAgICogcHJlY2VkaW5nIHZlcnRpY2FsIGhpbnRzLiAgVGhlIEhpbnRNYXNrIGlzIG9yZGVyZWQgdGhlIHNhbWUgd2F5LCB3aXRoCi0gICAqIGhvcml6b250YWwgaGludHMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgdmVydGljYWwgaGludHMuICBDbGllbnRzIGFyZQotICAgKiByZXNwb25zaWJsZSBmb3Iga25vd2luZyBob3cgbWFueSBvZiBlYWNoIHR5cGUgYXJlIHByZXNlbnQuCi0gICAqCi0gICAqIFRoZSBtYXhpbXVtIHRvdGFsIG51bWJlciBvZiBoaW50cyBpcyA5NiwgYXMgc3BlY2lmaWVkIGJ5IHRoZSBDRkYKLSAgICogc3BlY2lmaWNhdGlvbi4KLSAgICoKLSAgICogQSBIaW50TWFzayBpcyBidWlsdCAwIG9yIG1vcmUgdGltZXMgd2hpbGUgaW50ZXJwcmV0aW5nIGEgY2hhcnN0cmluZywgYnkKLSAgICogdGhlIEhpbnRNYXNrIG9wZXJhdG9yLiAgVGhlcmUgaXMgb25seSBvbmUgSGludE1hc2ssIGJ1dCBpdCBpcyBidWlsdCBvcgotICAgKiByZWJ1aWx0IGVhY2ggdGltZSB0aGVyZSBpcyBhIGhpbnQgc3Vic3RpdHV0aW9uIChIaW50TWFzayBvcGVyYXRvcikgaW4KLSAgICogdGhlIGNoYXJzdHJpbmcuICBBIGRlZmF1bHQgSGludE1hc2sgd2l0aCBhbGwgYml0cyBzZXQgaXMgYnVpbHQgaWYgdGhlcmUKLSAgICogaGFzIGJlZW4gbm8gSGludE1hc2sgb3BlcmF0b3IgcHJpb3IgdG8gdGhlIGZpcnN0IGRyYXdpbmcgb3BlcmF0b3IuCi0gICAqCi0gICAqLwotCi0gIHR5cGVkZWYgc3RydWN0ICBDRjJfSGludE1hc2tSZWNfCi0gIHsKLSAgICBGVF9FcnJvciogIGVycm9yOwotCi0gICAgRlRfQm9vbCAgaXNWYWxpZDsKLSAgICBGVF9Cb29sICBpc05ldzsKLQotICAgIHNpemVfdCAgYml0Q291bnQ7Ci0gICAgc2l6ZV90ICBieXRlQ291bnQ7Ci0KLSAgICBGVF9CeXRlICBtYXNrWyggQ0YyX01BWF9ISU5UUyArIDcgKSAvIDhdOwotCi0gIH0gQ0YyX0hpbnRNYXNrUmVjLCAqQ0YyX0hpbnRNYXNrOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGMl9TdGVtSGludFJlY18KLSAgewotICAgIEZUX0Jvb2wgIHVzZWQ7ICAgICAvKiBEUyBwb3NpdGlvbnMgYXJlIHZhbGlkICAgICAgICAgKi8KLQotICAgIENGMl9GaXhlZCAgbWluOyAgICAvKiBvcmlnaW5hbCBjaGFyYWN0ZXIgc3BhY2UgdmFsdWUgKi8KLSAgICBDRjJfRml4ZWQgIG1heDsKLQotICAgIENGMl9GaXhlZCAgbWluRFM7ICAvKiBEUyBwb3NpdGlvbiBhZnRlciBmaXJzdCB1c2UgICAgKi8KLSAgICBDRjJfRml4ZWQgIG1heERTOwotCi0gIH0gQ0YyX1N0ZW1IaW50UmVjLCAqQ0YyX1N0ZW1IaW50OwotCi0KLSAgLyoKLSAgICogQSBIaW50TWFwIG9iamVjdCBzdG9yZXMgYSBwaWVjZXdpc2UgbGluZWFyIGZ1bmN0aW9uIGZvciBtYXBwaW5nCi0gICAqIHktY29vcmRpbmF0ZXMgZnJvbSBjaGFyYWN0ZXIgc3BhY2UgdG8gZGV2aWNlIHNwYWNlLCBwcm92aWRpbmcKLSAgICogYXBwcm9wcmlhdGUgcGl4ZWwgYWxpZ25tZW50IHRvIHN0ZW0gZWRnZXMuCi0gICAqCi0gICAqIFRoZSBtYXAgaXMgaW1wbGVtZW50ZWQgYXMgYW4gYXJyYXkgb2YgYENGMl9IaW50JyBlbGVtZW50cywgZWFjaAotICAgKiByZXByZXNlbnRpbmcgYW4gZWRnZS4gIFdoZW4gZWRnZXMgYXJlIHBhaXJlZCwgYXMgZnJvbSBzdGVtIGhpbnRzLCB0aGUKLSAgICogYm90dG9tIGVkZ2UgbXVzdCBpbW1lZGlhdGVseSBwcmVjZWRlIHRoZSB0b3AgZWRnZSBpbiB0aGUgYXJyYXkuCi0gICAqIEVsZW1lbnQgY2hhcmFjdGVyIHNwYWNlIEFORCBkZXZpY2Ugc3BhY2UgcG9zaXRpb25zIG11c3QgYm90aCBpbmNyZWFzZQotICAgKiBtb25vdG9uaWNhbGx5IGluIHRoZSBhcnJheS4gIGBDRjJfSGludCcgZWxlbWVudHMgYXJlIGFsc28gdXNlZCBhcwotICAgKiBwYXJhbWV0ZXJzIHRvIGBjZjJfYmx1ZXNfY2FwdHVyZScuCi0gICAqCi0gICAqIFRoZSBgY2YyX2hpbnRtYXBfYnVpbGQnIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IGRyYXdpbmcKLSAgICogb3BlcmF0aW9uIChiZWdpbm5pbmcgd2l0aCBhIE1vdmUgb3BlcmF0b3IpIGFuZCBhdCBlYWNoIGhpbnQKLSAgICogc3Vic3RpdHV0aW9uIChIaW50TWFzayBvcGVyYXRvcikuCi0gICAqCi0gICAqIFRoZSBgY2YyX2hpbnRtYXBfbWFwJyBtZXRob2QgaXMgY2FsbGVkIHRvIHRyYW5zZm9ybSB5LWNvb3JkaW5hdGVzIGF0Ci0gICAqIGVhY2ggZHJhd2luZyBvcGVyYXRpb24gKG1vdmUsIGxpbmUsIGN1cnZlKS4KLSAgICoKLSAgICovCi0KLSAgLyogVE9ETzogbWFrZSB0aGlzIGEgQ0YyX0FyclN0YWNrIGFuZCBhZGQgYSBkZWVwIGNvcHkgbWV0aG9kICovCi0gIGVudW0KLSAgewotICAgIENGMl9NQVhfSElOVF9FREdFUyA9IENGMl9NQVhfSElOVFMgKiAyCi0gIH07Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQ0YyX0hpbnRNYXBSZWNfCi0gIHsKLSAgICBDRjJfRm9udCAgZm9udDsKLQotICAgIC8qIGluaXRpYWwgbWFwIGJhc2VkIG9uIGJsdWUgem9uZXMgKi8KLSAgICBzdHJ1Y3QgQ0YyX0hpbnRNYXBSZWNfKiAgaW5pdGlhbEhpbnRNYXA7Ci0KLSAgICAvKiB3b3JraW5nIHN0b3JhZ2UgZm9yIDJuZCBwYXNzIGFkanVzdEhpbnRzICovCi0gICAgQ0YyX0FyclN0YWNrICBoaW50TW92ZXM7Ci0KLSAgICBGVF9Cb29sICBpc1ZhbGlkOwotICAgIEZUX0Jvb2wgIGhpbnRlZDsKLQotICAgIENGMl9GaXhlZCAgc2NhbGU7Ci0gICAgQ0YyX1VJbnQgICBjb3VudDsKLQotICAgIC8qIHN0YXJ0IHNlYXJjaCBmcm9tIHRoaXMgaW5kZXggKi8KLSAgICBDRjJfVUludCAgbGFzdEluZGV4OwotCi0gICAgQ0YyX0hpbnRSZWMgIGVkZ2VbQ0YyX01BWF9ISU5UX0VER0VTXTsgLyogMTkyICovCi0KLSAgfSBDRjJfSGludE1hcFJlYywgKkNGMl9IaW50TWFwOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Jvb2wgKQotICBjZjJfaGludF9pc1ZhbGlkKCBjb25zdCBDRjJfSGludCAgaGludCApOwotICBGVF9MT0NBTCggRlRfQm9vbCApCi0gIGNmMl9oaW50X2lzVG9wKCBjb25zdCBDRjJfSGludCAgaGludCApOwotICBGVF9MT0NBTCggRlRfQm9vbCApCi0gIGNmMl9oaW50X2lzQm90dG9tKCBjb25zdCBDRjJfSGludCAgaGludCApOwotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9oaW50X2xvY2soIENGMl9IaW50ICBoaW50ICk7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9oaW50bWFwX2luaXQoIENGMl9IaW50TWFwICAgaGludG1hcCwKLSAgICAgICAgICAgICAgICAgICAgQ0YyX0ZvbnQgICAgICBmb250LAotICAgICAgICAgICAgICAgICAgICBDRjJfSGludE1hcCAgIGluaXRpYWxNYXAsCi0gICAgICAgICAgICAgICAgICAgIENGMl9BcnJTdGFjayAgaGludE1vdmVzLAotICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgIHNjYWxlICk7Ci0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX2hpbnRtYXBfYnVpbGQoIENGMl9IaW50TWFwICAgaGludG1hcCwKLSAgICAgICAgICAgICAgICAgICAgIENGMl9BcnJTdGFjayAgaFN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICBDRjJfQXJyU3RhY2sgIHZTdGVtSGludEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgQ0YyX0hpbnRNYXNrICBoaW50TWFzaywKLSAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgaGludE9yaWdpbiwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgaW5pdGlhbE1hcCApOwotCi0KLSAgLyoKLSAgICogR2x5cGhQYXRoIGlzIGEgd3JhcHBlciBmb3IgZHJhd2luZyBvcGVyYXRpb25zIHRoYXQgc2NhbGVzIHRoZQotICAgKiBjb29yZGluYXRlcyBhY2NvcmRpbmcgdG8gdGhlIHJlbmRlciBtYXRyaXggYW5kIEhpbnRNYXAuICBJdCBhbHNvIHRyYWNrcwotICAgKiBvcGVuIHBhdGhzIHRvIGNvbnRyb2wgQ2xvc2VQYXRoIGFuZCB0byBpbnNlcnQgTW92ZVRvIGZvciBicm9rZW4gZm9udHMuCi0gICAqCi0gICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQ0YyX0dseXBoUGF0aFJlY18KLSAgewotICAgIC8qIFRPRE86IGdhdGhlciBzb21lIG9mIHRoZXNlIGludG8gYSBoaW50aW5nIGNvbnRleHQgKi8KLQotICAgIENGMl9Gb250ICAgICAgICAgICAgICBmb250OyAgICAgICAgICAgLyogZm9udCBpbnN0YW5jZSAgICAqLwotICAgIENGMl9PdXRsaW5lQ2FsbGJhY2tzICBjYWxsYmFja3M7ICAgICAgLyogb3V0bGluZSBjb25zdW1lciAqLwotCi0KLSAgICBDRjJfSGludE1hcFJlYyAgaGludE1hcDsgICAgICAgIC8qIGN1cnJlbnQgaGludCBtYXAgICAgICAgICAgICAqLwotICAgIENGMl9IaW50TWFwUmVjICBmaXJzdEhpbnRNYXA7ICAgLyogc2F2ZWQgY29weSAgICAgICAgICAgICAgICAgICovCi0gICAgQ0YyX0hpbnRNYXBSZWMgIGluaXRpYWxIaW50TWFwOyAvKiBiYXNlZCBvbiBhbGwgY2FwdHVyZWQgaGludHMgKi8KLQotICAgIENGMl9BcnJTdGFja1JlYyAgaGludE1vdmVzOyAgLyogbGlzdCBvZiBoaW50IG1vdmVzIGZvciAybmQgcGFzcyAqLwotCi0gICAgQ0YyX0ZpeGVkICBzY2FsZVg7ICAgICAgICAgLyogbWF0cml4IGEgKi8KLSAgICBDRjJfRml4ZWQgIHNjYWxlQzsgICAgICAgICAvKiBtYXRyaXggYyAqLwotICAgIENGMl9GaXhlZCAgc2NhbGVZOyAgICAgICAgIC8qIG1hdHJpeCBkICovCi0KLSAgICBGVF9WZWN0b3IgIGZyYWN0aW9uYWxUcmFuc2xhdGlvbjsgIC8qIGluY2x1ZGluZyBkZXZpY2VYU2NhbGUgKi8KLSNpZiAwCi0gICAgQ0YyX0ZpeGVkICBoU2hpZnQ7ICAgIC8qIGNoYXJhY3RlciBzcGFjZSBob3Jpem9udGFsIHNoaWZ0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChmb3IgZmF1eGluZykgICAgICAgICAgICAgICAgICAgICovCi0jZW5kaWYKLQotICAgIEZUX0Jvb2wgIHBhdGhJc09wZW47ICAgICAvKiB0cnVlIGFmdGVyIE1vdmVUbyAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfQm9vbCAgcGF0aElzQ2xvc2luZzsgIC8qIHRydWUgd2hlbiBzeW50aGVzaXppbmcgY2xvc2VwYXRoIGxpbmUgKi8KLSAgICBGVF9Cb29sICBkYXJrZW47ICAgICAgICAgLyogdHJ1ZSBpZiBzdGVtIGRhcmtlbmluZyAgICAgICAgICAgICAgICAqLwotICAgIEZUX0Jvb2wgIG1vdmVJc1BlbmRpbmc7ICAvKiB0cnVlIGJldHdlZW4gTW92ZVRvIGFuZCBvZmZzZXQgTW92ZVRvICovCi0KLSAgICAvKiByZWZlcmVuY2VzIHVzZWQgdG8gY2FsbCBgY2YyX2hpbnRtYXBfYnVpbGQnLCBpZiBuZWNlc3NhcnkgKi8KLSAgICBDRjJfQXJyU3RhY2sgICAgICAgICBoU3RlbUhpbnRBcnJheTsKLSAgICBDRjJfQXJyU3RhY2sgICAgICAgICB2U3RlbUhpbnRBcnJheTsKLSAgICBDRjJfSGludE1hc2sgICAgICAgICBoaW50TWFzazsgICAgIC8qIHB0ciB0byB0aGUgY3VycmVudCBtYXNrICovCi0gICAgQ0YyX0ZpeGVkICAgICAgICAgICAgaGludE9yaWdpblk7ICAvKiBjb3B5IG9mIGN1cnJlbnQgb3JpZ2luICAqLwotICAgIGNvbnN0IENGMl9CbHVlc1JlYyogIGJsdWVzOwotCi0gICAgQ0YyX0ZpeGVkICB4T2Zmc2V0OyAgICAgICAgLyogY2hhcmFjdGVyIHNwYWNlIG9mZnNldHMgKi8KLSAgICBDRjJfRml4ZWQgIHlPZmZzZXQ7Ci0KLSAgICAvKiBjaGFyYWN0ZXIgc3BhY2UgbWl0ZXIgbGltaXQgdGhyZXNob2xkICovCi0gICAgQ0YyX0ZpeGVkICBtaXRlckxpbWl0OwotICAgIC8qIHZlcnRpY2FsL2hvcnppem9udGFsIHNuYXAgZGlzdGFuY2UgaW4gY2hhcmFjdGVyIHNwYWNlICovCi0gICAgQ0YyX0ZpeGVkICBzbmFwVGhyZXNob2xkOwotCi0gICAgRlRfVmVjdG9yICBvZmZzZXRTdGFydDA7ICAvKiBmaXJzdCBhbmQgc2Vjb25kIHBvaW50cyBvZiBmaXJzdCAqLwotICAgIEZUX1ZlY3RvciAgb2Zmc2V0U3RhcnQxOyAgLyogZWxlbWVudCB3aXRoIG9mZnNldCBhcHBsaWVkICAgICAgKi8KLQotICAgIC8qIGN1cnJlbnQgcG9pbnQsIGNoYXJhY3RlciBzcGFjZSwgYmVmb3JlIG9mZnNldCAqLwotICAgIEZUX1ZlY3RvciAgY3VycmVudENTOwotICAgIC8qIGN1cnJlbnQgcG9pbnQsIGRldmljZSBzcGFjZSAqLwotICAgIEZUX1ZlY3RvciAgY3VycmVudERTOwotICAgIC8qIHN0YXJ0IHBvaW50IG9mIHN1YnBhdGgsIGNoYXJhY3RlciBzcGFjZSAqLwotICAgIEZUX1ZlY3RvciAgc3RhcnQ7Ci0KLSAgICAvKiB0aGUgZm9sbG93aW5nIG1lbWJlcnMgY29uc3RpdHV0ZSB0aGUgYHF1ZXVlJyBvZiBvbmUgZWxlbWVudCAqLwotICAgIEZUX0Jvb2wgIGVsZW1Jc1F1ZXVlZDsKLSAgICBDRjJfSW50ICBwcmV2RWxlbU9wOwotCi0gICAgRlRfVmVjdG9yICBwcmV2RWxlbVAwOwotICAgIEZUX1ZlY3RvciAgcHJldkVsZW1QMTsKLSAgICBGVF9WZWN0b3IgIHByZXZFbGVtUDI7Ci0gICAgRlRfVmVjdG9yICBwcmV2RWxlbVAzOwotCi0gIH0gQ0YyX0dseXBoUGF0aFJlYywgKkNGMl9HbHlwaFBhdGg7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9nbHlwaHBhdGhfaW5pdCggQ0YyX0dseXBoUGF0aCAgICAgICAgIGdseXBocGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICBDRjJfRm9udCAgICAgICAgICAgICAgZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICBDRjJfT3V0bGluZUNhbGxiYWNrcyAgY2FsbGJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgICAgICAgICBzY2FsZVksCi0gICAgICAgICAgICAgICAgICAgICAgLyogQ0YyX0ZpeGVkIGhTaGlmdCwgKi8KLSAgICAgICAgICAgICAgICAgICAgICBDRjJfQXJyU3RhY2sgICAgICAgICAgaFN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgQ0YyX0FyclN0YWNrICAgICAgICAgIHZTdGVtSGludEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgIENGMl9IaW50TWFzayAgICAgICAgICBoaW50TWFzaywKLSAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgICAgICAgICAgaGludE9yaWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRjJfQmx1ZXMgICAgICAgYmx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgICAgIGZyYWN0aW9uYWxUcmFuc2xhdGlvbiApOwotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9nbHlwaHBhdGhfZmluYWxpemUoIENGMl9HbHlwaFBhdGggIGdseXBocGF0aCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX2dseXBocGF0aF9tb3ZlVG8oIENGMl9HbHlwaFBhdGggIGdseXBocGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgICB5ICk7Ci0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX2dseXBocGF0aF9saW5lVG8oIENGMl9HbHlwaFBhdGggIGdseXBocGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgICB5ICk7Ci0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX2dseXBocGF0aF9jdXJ2ZVRvKCBDRjJfR2x5cGhQYXRoICBnbHlwaHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgeTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgeDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgeTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgeDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgeTMgKTsKLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZjJfZ2x5cGhwYXRoX2Nsb3NlT3BlblBhdGgoIENGMl9HbHlwaFBhdGggIGdseXBocGF0aCApOwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19DRjJISU5UU19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyaW50cnAuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YyaW50cnAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYzZmE5YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmludHJwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmMmludHJwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBZG9iZSdzIENGRiBJbnRlcnByZXRlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNy0yMDE0IEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IgICAgICAgKi8KLS8qICBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZCAgICAgICovCi0vKiAgaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUgICAqLwotLyogIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgICAgKi8KLS8qICBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMgICAqLwotLyogIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgICAgKi8KLS8qICB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IgICAgICovCi0vKiAgIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsICAgICAgICAgICAgICAqLwotLyogIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgICAgKi8KLS8qICBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCAgICAgICovCi0vKiAgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlICAqLwotLyogIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5ICAgICAgKi8KLS8qICBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyICAgICovCi0vKiAgY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzICAgICAgICAqLwotLyogIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5ICAgICAgKi8KLS8qICAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCAgICovCi0vKiAgdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyAgICAqLwotLyogIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzICAgKi8KLS8qICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgICovCi0vKiAgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91ICAgICovCi0vKiAgaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgICAgICAgICAgICAgICAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwgICAgKi8KLS8qICBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiY2YyZnQuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgImNmMmdsdWUuaCIKLSNpbmNsdWRlICJjZjJmb250LmgiCi0jaW5jbHVkZSAiY2Yyc3RhY2suaCIKLSNpbmNsdWRlICJjZjJoaW50cy5oIgotI2luY2x1ZGUgImNmMmludHJwLmgiCi0KLSNpbmNsdWRlICJjZjJlcnJvci5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfY2YyaW50ZXJwCi0KLQotICAvKiBzb21lIG9wZXJhdG9ycyBhcmUgbm90IGltcGxlbWVudGVkIHlldCAqLwotI2RlZmluZSBDRjJfRklYTUUgIEZUX1RSQUNFNCgoICJjZjJfaW50ZXJwVDJDaGFyU3RyaW5nOiIgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBvcGVyYXRvciBub3QgaW1wbGVtZW50ZWQgeWV0XG4iICkpCi0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9oaW50bWFza19pbml0KCBDRjJfSGludE1hc2sgIGhpbnRtYXNrLAotICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IqICAgICBlcnJvciApCi0gIHsKLSAgICBGVF9aRVJPKCBoaW50bWFzayApOwotCi0gICAgaGludG1hc2stPmVycm9yID0gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfQm9vbCApCi0gIGNmMl9oaW50bWFza19pc1ZhbGlkKCBjb25zdCBDRjJfSGludE1hc2sgIGhpbnRtYXNrICkKLSAgewotICAgIHJldHVybiBoaW50bWFzay0+aXNWYWxpZDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9Cb29sICkKLSAgY2YyX2hpbnRtYXNrX2lzTmV3KCBjb25zdCBDRjJfSGludE1hc2sgIGhpbnRtYXNrICkKLSAgewotICAgIHJldHVybiBoaW50bWFzay0+aXNOZXc7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9oaW50bWFza19zZXROZXcoIENGMl9IaW50TWFzayAgaGludG1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgdmFsICkKLSAgewotICAgIGhpbnRtYXNrLT5pc05ldyA9IHZhbDsKLSAgfQotCi0KLSAgLyogY2xpZW50cyBjYWxsIGBnZXRNYXNrUHRyJyBpbiBvcmRlciB0byBpdGVyYXRlICovCi0gIC8qIHRocm91Z2ggaGludCBtYXNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIEZUX0xPQ0FMX0RFRiggRlRfQnl0ZSogKQotICBjZjJfaGludG1hc2tfZ2V0TWFza1B0ciggQ0YyX0hpbnRNYXNrICBoaW50bWFzayApCi0gIHsKLSAgICByZXR1cm4gaGludG1hc2stPm1hc2s7Ci0gIH0KLQotCi0gIHN0YXRpYyBzaXplX3QKLSAgY2YyX2hpbnRtYXNrX3NldENvdW50cyggQ0YyX0hpbnRNYXNrICBoaW50bWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICBiaXRDb3VudCApCi0gIHsKLSAgICBpZiAoIGJpdENvdW50ID4gQ0YyX01BWF9ISU5UUyApCi0gICAgewotICAgICAgLyogdG90YWwgb2YgaCBhbmQgdiBzdGVtcyBtdXN0IGJlIDw9IDk2ICovCi0gICAgICBDRjJfU0VUX0VSUk9SKCBoaW50bWFzay0+ZXJyb3IsIEludmFsaWRfR2x5cGhfRm9ybWF0ICk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBoaW50bWFzay0+Yml0Q291bnQgID0gYml0Q291bnQ7Ci0gICAgaGludG1hc2stPmJ5dGVDb3VudCA9ICggaGludG1hc2stPmJpdENvdW50ICsgNyApIC8gODsKLQotICAgIGhpbnRtYXNrLT5pc1ZhbGlkID0gVFJVRTsKLSAgICBoaW50bWFzay0+aXNOZXcgICA9IFRSVUU7Ci0KLSAgICByZXR1cm4gYml0Q291bnQ7Ci0gIH0KLQotCi0gIC8qIGNvbnN1bWUgdGhlIGhpbnRtYXNrIGJ5dGVzIGZyb20gdGhlIGNoYXJzdHJpbmcsIGFkdmFuY2luZyB0aGUgc3JjICovCi0gIC8qIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIGNmMl9oaW50bWFza19yZWFkKCBDRjJfSGludE1hc2sgIGhpbnRtYXNrLAotICAgICAgICAgICAgICAgICAgICAgQ0YyX0J1ZmZlciAgICBjaGFyc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICBiaXRDb3VudCApCi0gIHsKLSAgICBzaXplX3QgIGk7Ci0KLSNpZm5kZWYgQ0YyX05ERUJVRwotICAgIC8qIHRoZXNlIGFyZSB0aGUgYml0cyBpbiB0aGUgZmluYWwgbWFzayBieXRlIHRoYXQgc2hvdWxkIGJlIHplcm8gICovCi0gICAgLyogTm90ZTogdGhpcyB2YXJpYWJsZSBpcyBvbmx5IHVzZWQgaW4gYW4gYXNzZXJ0IGV4cHJlc3Npb24gYmVsb3cgKi8KLSAgICAvKiBhbmQgdGhlbiBvbmx5IGlmIENGMl9OREVCVUcgaXMgbm90IGRlZmluZWQgICAgICAgICAgICAgICAgICAgICAqLwotICAgIENGMl9VSW50ICBtYXNrID0gKCAxIDw8ICggLShDRjJfSW50KWJpdENvdW50ICYgNyApICkgLSAxOwotI2VuZGlmCi0KLQotICAgIC8qIGluaXRpYWxpemUgY291bnRzIGFuZCBpc1ZhbGlkICovCi0gICAgaWYgKCBjZjJfaGludG1hc2tfc2V0Q291bnRzKCBoaW50bWFzaywgYml0Q291bnQgKSA9PSAwICkKLSAgICAgIHJldHVybjsKLQotICAgIEZUX0FTU0VSVCggaGludG1hc2stPmJ5dGVDb3VudCA+IDAgKTsKLQotICAgIEZUX1RSQUNFNCgoICIgKG1hc2tieXRlczoiICkpOwotCi0gICAgLyogc2V0IG1hc2sgYW5kIGFkdmFuY2UgaW50ZXJwcmV0ZXIncyBjaGFyc3RyaW5nIHBvaW50ZXIgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IGhpbnRtYXNrLT5ieXRlQ291bnQ7IGkrKyApCi0gICAgewotICAgICAgaGludG1hc2stPm1hc2tbaV0gPSAoRlRfQnl0ZSljZjJfYnVmX3JlYWRCeXRlKCBjaGFyc3RyaW5nICk7Ci0gICAgICBGVF9UUkFDRTQoKCAiIDB4JTAyWCIsIGhpbnRtYXNrLT5tYXNrW2ldICkpOwotICAgIH0KLQotICAgIEZUX1RSQUNFNCgoICIpXG4iICkpOwotCi0gICAgLyogYXNzZXJ0IGFueSB1bnVzZWQgYml0cyBpbiBsYXN0IGJ5dGUgYXJlIHplcm8gdW5sZXNzIHRoZXJlJ3MgYSBwcmlvciAqLwotICAgIC8qIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBiaXRDb3VudCAtPiBtYXNrLCAwIC0+IDAsIDEgLT4gN2YsIDIgLT4gM2YsIC4uLiA2IC0+IDMsIDcgLT4gMSAgICAgICovCi0jaWZuZGVmIENGMl9OREVCVUcKLSAgICBGVF9BU1NFUlQoICggaGludG1hc2stPm1hc2tbaGludG1hc2stPmJ5dGVDb3VudCAtIDFdICYgbWFzayApID09IDAgfHwKLSAgICAgICAgICAgICAgICpoaW50bWFzay0+ZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSNlbmRpZgotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZjJfaGludG1hc2tfc2V0QWxsKCBDRjJfSGludE1hc2sgIGhpbnRtYXNrLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgICAgICAgIGJpdENvdW50ICkKLSAgewotICAgIHNpemVfdCAgICBpOwotICAgIENGMl9VSW50ICBtYXNrID0gKCAxIDw8ICggLShDRjJfSW50KWJpdENvdW50ICYgNyApICkgLSAxOwotCi0KLSAgICAvKiBpbml0aWFsaXplIGNvdW50cyBhbmQgaXNWYWxpZCAqLwotICAgIGlmICggY2YyX2hpbnRtYXNrX3NldENvdW50cyggaGludG1hc2ssIGJpdENvdW50ICkgPT0gMCApCi0gICAgICByZXR1cm47Ci0KLSAgICBGVF9BU1NFUlQoIGhpbnRtYXNrLT5ieXRlQ291bnQgPiAwICk7Ci0gICAgRlRfQVNTRVJUKCBoaW50bWFzay0+Ynl0ZUNvdW50IDwKLSAgICAgICAgICAgICAgICAgc2l6ZW9mICggaGludG1hc2stPm1hc2sgKSAvIHNpemVvZiAoIGhpbnRtYXNrLT5tYXNrWzBdICkgKTsKLQotICAgIC8qIHNldCBtYXNrIHRvIGFsbCBvbmVzICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBoaW50bWFzay0+Ynl0ZUNvdW50OyBpKysgKQotICAgICAgaGludG1hc2stPm1hc2tbaV0gPSAweEZGOwotCi0gICAgLyogY2xlYXIgdW51c2VkIGJpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBiaXRDb3VudCAtPiBtYXNrLCAwIC0+IDAsIDEgLT4gN2YsIDIgLT4gM2YsIC4uLiA2IC0+IDMsIDcgLT4gMSAqLwotICAgIGhpbnRtYXNrLT5tYXNrW2hpbnRtYXNrLT5ieXRlQ291bnQgLSAxXSAmPSB+bWFzazsKLSAgfQotCi0KLSAgLyogVHlwZTIgY2hhcnN0cmluZyBvcGNvZGVzICovCi0gIGVudW0KLSAgewotICAgIGNmMl9jbWRSRVNFUlZFRF8wLCAgIC8qIDAgKi8KLSAgICBjZjJfY21kSFNURU0sICAgICAgICAvKiAxICovCi0gICAgY2YyX2NtZFJFU0VSVkVEXzIsICAgLyogMiAqLwotICAgIGNmMl9jbWRWU1RFTSwgICAgICAgIC8qIDMgKi8KLSAgICBjZjJfY21kVk1PVkVUTywgICAgICAvKiA0ICovCi0gICAgY2YyX2NtZFJMSU5FVE8sICAgICAgLyogNSAqLwotICAgIGNmMl9jbWRITElORVRPLCAgICAgIC8qIDYgKi8KLSAgICBjZjJfY21kVkxJTkVUTywgICAgICAvKiA3ICovCi0gICAgY2YyX2NtZFJSQ1VSVkVUTywgICAgLyogOCAqLwotICAgIGNmMl9jbWRSRVNFUlZFRF85LCAgIC8qIDkgKi8KLSAgICBjZjJfY21kQ0FMTFNVQlIsICAgICAvKiAxMCAqLwotICAgIGNmMl9jbWRSRVRVUk4sICAgICAgIC8qIDExICovCi0gICAgY2YyX2NtZEVTQywgICAgICAgICAgLyogMTIgKi8KLSAgICBjZjJfY21kUkVTRVJWRURfMTMsICAvKiAxMyAqLwotICAgIGNmMl9jbWRFTkRDSEFSLCAgICAgIC8qIDE0ICovCi0gICAgY2YyX2NtZFJFU0VSVkVEXzE1LCAgLyogMTUgKi8KLSAgICBjZjJfY21kUkVTRVJWRURfMTYsICAvKiAxNiAqLwotICAgIGNmMl9jbWRSRVNFUlZFRF8xNywgIC8qIDE3ICovCi0gICAgY2YyX2NtZEhTVEVNSE0sICAgICAgLyogMTggKi8KLSAgICBjZjJfY21kSElOVE1BU0ssICAgICAvKiAxOSAqLwotICAgIGNmMl9jbWRDTlRSTUFTSywgICAgIC8qIDIwICovCi0gICAgY2YyX2NtZFJNT1ZFVE8sICAgICAgLyogMjEgKi8KLSAgICBjZjJfY21kSE1PVkVUTywgICAgICAvKiAyMiAqLwotICAgIGNmMl9jbWRWU1RFTUhNLCAgICAgIC8qIDIzICovCi0gICAgY2YyX2NtZFJDVVJWRUxJTkUsICAgLyogMjQgKi8KLSAgICBjZjJfY21kUkxJTkVDVVJWRSwgICAvKiAyNSAqLwotICAgIGNmMl9jbWRWVkNVUlZFVE8sICAgIC8qIDI2ICovCi0gICAgY2YyX2NtZEhIQ1VSVkVUTywgICAgLyogMjcgKi8KLSAgICBjZjJfY21kRVhURU5ERUROTUJSLCAvKiAyOCAqLwotICAgIGNmMl9jbWRDQUxMR1NVQlIsICAgIC8qIDI5ICovCi0gICAgY2YyX2NtZFZIQ1VSVkVUTywgICAgLyogMzAgKi8KLSAgICBjZjJfY21kSFZDVVJWRVRPICAgICAvKiAzMSAqLwotICB9OwotCi0gIGVudW0KLSAgewotICAgIGNmMl9lc2NET1RTRUNUSU9OLCAgIC8qIDAgKi8KLSAgICBjZjJfZXNjUkVTRVJWRURfMSwgICAvKiAxICovCi0gICAgY2YyX2VzY1JFU0VSVkVEXzIsICAgLyogMiAqLwotICAgIGNmMl9lc2NBTkQsICAgICAgICAgIC8qIDMgKi8KLSAgICBjZjJfZXNjT1IsICAgICAgICAgICAvKiA0ICovCi0gICAgY2YyX2VzY05PVCwgICAgICAgICAgLyogNSAqLwotICAgIGNmMl9lc2NSRVNFUlZFRF82LCAgIC8qIDYgKi8KLSAgICBjZjJfZXNjUkVTRVJWRURfNywgICAvKiA3ICovCi0gICAgY2YyX2VzY1JFU0VSVkVEXzgsICAgLyogOCAqLwotICAgIGNmMl9lc2NBQlMsICAgICAgICAgIC8qIDkgKi8KLSAgICBjZjJfZXNjQURELCAgICAgICAgICAvKiAxMCAgICAgbGlrZSBvdGhlckFERCAqLwotICAgIGNmMl9lc2NTVUIsICAgICAgICAgIC8qIDExICAgICBsaWtlIG90aGVyU1VCICovCi0gICAgY2YyX2VzY0RJViwgICAgICAgICAgLyogMTIgKi8KLSAgICBjZjJfZXNjUkVTRVJWRURfMTMsICAvKiAxMyAqLwotICAgIGNmMl9lc2NORUcsICAgICAgICAgIC8qIDE0ICovCi0gICAgY2YyX2VzY0VRLCAgICAgICAgICAgLyogMTUgKi8KLSAgICBjZjJfZXNjUkVTRVJWRURfMTYsICAvKiAxNiAqLwotICAgIGNmMl9lc2NSRVNFUlZFRF8xNywgIC8qIDE3ICovCi0gICAgY2YyX2VzY0RST1AsICAgICAgICAgLyogMTggKi8KLSAgICBjZjJfZXNjUkVTRVJWRURfMTksICAvKiAxOSAqLwotICAgIGNmMl9lc2NQVVQsICAgICAgICAgIC8qIDIwICAgICBsaWtlIG90aGVyUFVUICAgICovCi0gICAgY2YyX2VzY0dFVCwgICAgICAgICAgLyogMjEgICAgIGxpa2Ugb3RoZXJHRVQgICAgKi8KLSAgICBjZjJfZXNjSUZFTFNFLCAgICAgICAvKiAyMiAgICAgbGlrZSBvdGhlcklGRUxTRSAqLwotICAgIGNmMl9lc2NSQU5ET00sICAgICAgIC8qIDIzICAgICBsaWtlIG90aGVyUkFORE9NICovCi0gICAgY2YyX2VzY01VTCwgICAgICAgICAgLyogMjQgICAgIGxpa2Ugb3RoZXJNVUwgICAgKi8KLSAgICBjZjJfZXNjUkVTRVJWRURfMjUsICAvKiAyNSAqLwotICAgIGNmMl9lc2NTUVJULCAgICAgICAgIC8qIDI2ICovCi0gICAgY2YyX2VzY0RVUCwgICAgICAgICAgLyogMjcgICAgIGxpa2Ugb3RoZXJEVVAgICAgKi8KLSAgICBjZjJfZXNjRVhDSCwgICAgICAgICAvKiAyOCAgICAgbGlrZSBvdGhlckVYQ0ggICAqLwotICAgIGNmMl9lc2NJTkRFWCwgICAgICAgIC8qIDI5ICovCi0gICAgY2YyX2VzY1JPTEwsICAgICAgICAgLyogMzAgKi8KLSAgICBjZjJfZXNjUkVTRVJWRURfMzEsICAvKiAzMSAqLwotICAgIGNmMl9lc2NSRVNFUlZFRF8zMiwgIC8qIDMyICovCi0gICAgY2YyX2VzY1JFU0VSVkVEXzMzLCAgLyogMzMgKi8KLSAgICBjZjJfZXNjSEZMRVgsICAgICAgICAvKiAzNCAqLwotICAgIGNmMl9lc2NGTEVYLCAgICAgICAgIC8qIDM1ICovCi0gICAgY2YyX2VzY0hGTEVYMSwgICAgICAgLyogMzYgKi8KLSAgICBjZjJfZXNjRkxFWDEgICAgICAgICAvKiAzNyAqLwotICB9OwotCi0KLSAgLyogYHN0ZW1IaW50QXJyYXknIGRvZXMgbm90IGNoYW5nZSBvbmNlIHdlIHN0YXJ0IGRyYXdpbmcgdGhlIG91dGxpbmUuICovCi0gIHN0YXRpYyB2b2lkCi0gIGNmMl9kb1N0ZW1zKCBjb25zdCBDRjJfRm9udCAgZm9udCwKLSAgICAgICAgICAgICAgIENGMl9TdGFjayAgICAgICBvcFN0YWNrLAotICAgICAgICAgICAgICAgQ0YyX0FyclN0YWNrICAgIHN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICBDRjJfRml4ZWQqICAgICAgd2lkdGgsCi0gICAgICAgICAgICAgICBGVF9Cb29sKiAgICAgICAgaGF2ZVdpZHRoLAotICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgIGhpbnRPZmZzZXQgKQotICB7Ci0gICAgQ0YyX1VJbnQgIGk7Ci0gICAgQ0YyX1VJbnQgIGNvdW50ICAgICAgID0gY2YyX3N0YWNrX2NvdW50KCBvcFN0YWNrICk7Ci0gICAgRlRfQm9vbCAgIGhhc1dpZHRoQXJnID0gKEZUX0Jvb2wpKCBjb3VudCAmIDEgKTsKLQotICAgIC8qIHZhcmlhYmxlIGFjY3VtdWxhdGVzIGRlbHRhIHZhbHVlcyBmcm9tIG9wZXJhbmQgc3RhY2sgKi8KLSAgICBDRjJfRml4ZWQgIHBvc2l0aW9uID0gaGludE9mZnNldDsKLQotICAgIGlmICggaGFzV2lkdGhBcmcgJiYgISAqaGF2ZVdpZHRoICkKLSAgICAgICp3aWR0aCA9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCAwICkgKwotICAgICAgICAgICAgICAgICBjZjJfZ2V0Tm9taW5hbFdpZHRoWCggZm9udC0+ZGVjb2RlciApOwotCi0gICAgaWYgKCBmb250LT5kZWNvZGVyLT53aWR0aF9vbmx5ICkKLSAgICAgIGdvdG8gZXhpdDsKLQotICAgIGZvciAoIGkgPSBoYXNXaWR0aEFyZyA/IDEgOiAwOyBpIDwgY291bnQ7IGkgKz0gMiApCi0gICAgewotICAgICAgLyogY29uc3RydWN0IGEgQ0YyX1N0ZW1IaW50IGFuZCBwdXNoIGl0IG9udG8gdGhlIGxpc3QgKi8KLSAgICAgIENGMl9TdGVtSGludFJlYyAgc3RlbWhpbnQ7Ci0KLQotICAgICAgc3RlbWhpbnQubWluICA9Ci0gICAgICAgIHBvc2l0aW9uICAgKz0gY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGkgKTsKLSAgICAgIHN0ZW1oaW50Lm1heCAgPQotICAgICAgICBwb3NpdGlvbiAgICs9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpICsgMSApOwotCi0gICAgICBzdGVtaGludC51c2VkICA9IEZBTFNFOwotICAgICAgc3RlbWhpbnQubWF4RFMgPQotICAgICAgc3RlbWhpbnQubWluRFMgPSAwOwotCi0gICAgICBjZjJfYXJyc3RhY2tfcHVzaCggc3RlbUhpbnRBcnJheSwgJnN0ZW1oaW50ICk7IC8qIGRlZmVyIGVycm9yIGNoZWNrICovCi0gICAgfQotCi0gICAgY2YyX3N0YWNrX2NsZWFyKCBvcFN0YWNrICk7Ci0KLSAgZXhpdDoKLSAgICAvKiBjZjJfZG9TdGVtcyBtdXN0IGRlZmluZSBhIHdpZHRoIChtYXkgYmUgZGVmYXVsdCkgKi8KLSAgICAqaGF2ZVdpZHRoID0gVFJVRTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgY2YyX2RvRmxleCggQ0YyX1N0YWNrICAgICAgIG9wU3RhY2ssCi0gICAgICAgICAgICAgIENGMl9GaXhlZCogICAgICBjdXJYLAotICAgICAgICAgICAgICBDRjJfRml4ZWQqICAgICAgY3VyWSwKLSAgICAgICAgICAgICAgQ0YyX0dseXBoUGF0aCAgIGdseXBoUGF0aCwKLSAgICAgICAgICAgICAgY29uc3QgRlRfQm9vbCogIHJlYWRGcm9tU3RhY2ssCi0gICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICBkb0NvbmRpdGlvbmFsTGFzdFJlYWQgKQotICB7Ci0gICAgQ0YyX0ZpeGVkICB2YWxzWzE0XTsKLSAgICBDRjJfVUludCAgIGluZGV4OwotICAgIEZUX0Jvb2wgICAgaXNIRmxleDsKLSAgICBDRjJfSW50ICAgIHRvcCwgaSwgajsKLQotCi0gICAgdmFsc1swXSA9ICpjdXJYOwotICAgIHZhbHNbMV0gPSAqY3VyWTsKLSAgICBpbmRleCAgID0gMDsKLSAgICBpc0hGbGV4ID0gcmVhZEZyb21TdGFja1s5XSA9PSBGQUxTRTsKLSAgICB0b3AgICAgID0gaXNIRmxleCA/IDkgOiAxMDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgdG9wOyBpKysgKQotICAgIHsKLSAgICAgIHZhbHNbaSArIDJdID0gdmFsc1tpXTsKLSAgICAgIGlmICggcmVhZEZyb21TdGFja1tpXSApCi0gICAgICAgIHZhbHNbaSArIDJdICs9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpbmRleCsrICk7Ci0gICAgfQotCi0gICAgaWYgKCBpc0hGbGV4ICkKLSAgICAgIHZhbHNbOSArIDJdID0gKmN1clk7Ci0KLSAgICBpZiAoIGRvQ29uZGl0aW9uYWxMYXN0UmVhZCApCi0gICAgewotICAgICAgRlRfQm9vbCAgICBsYXN0SXNYID0gKEZUX0Jvb2wpKCBjZjJfZml4ZWRBYnMoIHZhbHNbMTBdIC0gKmN1clggKSA+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YyX2ZpeGVkQWJzKCB2YWxzWzExXSAtICpjdXJZICkgKTsKLSAgICAgIENGMl9GaXhlZCAgbGFzdFZhbCA9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpbmRleCApOwotCi0KLSAgICAgIGlmICggbGFzdElzWCApCi0gICAgICB7Ci0gICAgICAgIHZhbHNbMTJdID0gdmFsc1sxMF0gKyBsYXN0VmFsOwotICAgICAgICB2YWxzWzEzXSA9ICpjdXJZOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB2YWxzWzEyXSA9ICpjdXJYOwotICAgICAgICB2YWxzWzEzXSA9IHZhbHNbMTFdICsgbGFzdFZhbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICggcmVhZEZyb21TdGFja1sxMF0gKQotICAgICAgICB2YWxzWzEyXSA9IHZhbHNbMTBdICsgY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGluZGV4KysgKTsKLSAgICAgIGVsc2UKLSAgICAgICAgdmFsc1sxMl0gPSAqY3VyWDsKLQotICAgICAgaWYgKCByZWFkRnJvbVN0YWNrWzExXSApCi0gICAgICAgIHZhbHNbMTNdID0gdmFsc1sxMV0gKyBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaW5kZXggKTsKLSAgICAgIGVsc2UKLSAgICAgICAgdmFsc1sxM10gPSAqY3VyWTsKLSAgICB9Ci0KLSAgICBmb3IgKCBqID0gMDsgaiA8IDI7IGorKyApCi0gICAgICBjZjJfZ2x5cGhwYXRoX2N1cnZlVG8oIGdseXBoUGF0aCwgdmFsc1tqICogNiArIDJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHNbaiAqIDYgKyAzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxzW2ogKiA2ICsgNF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsc1tqICogNiArIDVdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHNbaiAqIDYgKyA2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxzW2ogKiA2ICsgN10gKTsKLQotICAgIGNmMl9zdGFja19jbGVhciggb3BTdGFjayApOwotCi0gICAgKmN1clggPSB2YWxzWzEyXTsKLSAgICAqY3VyWSA9IHZhbHNbMTNdOwotICB9Ci0KLQotICAvKgotICAgKiBgZXJyb3InIGlzIGEgc2hhcmVkIGVycm9yIGNvZGUgdXNlZCBieSBtYW55IG9iamVjdHMgaW4gdGhpcwotICAgKiByb3V0aW5lLiAgQmVmb3JlIHRoZSBjb2RlIGNvbnRpbnVlcyBmcm9tIGFuIGVycm9yLCBpdCBtdXN0IGNoZWNrIGFuZAotICAgKiByZWNvcmQgdGhlIGVycm9yIGluIGAqZXJyb3InLiAgVGhlIGlkZWEgaXMgdGhhdCB0aGlzIHNoYXJlZAotICAgKiBlcnJvciBjb2RlIHdpbGwgcmVjb3JkIHRoZSBmaXJzdCBlcnJvciBlbmNvdW50ZXJlZC4gIElmIHRlc3RpbmcKLSAgICogZm9yIGFuIGVycm9yIGFueXdheSwgdGhlIGNvc3Qgb2YgYGdvdG8gZXhpdCcgaXMgc21hbGwsIHNvIHdlIGRvIGl0LAotICAgKiBldmVuIGlmIGNvbnRpbnVpbmcgd291bGQgYmUgc2FmZS4gIEluIHRoaXMgY2FzZSwgYGxhc3RFcnJvcicgaXMKLSAgICogc2V0LCBzbyB0aGUgdGVzdGluZyBhbmQgc3RvcmluZyBjYW4gYmUgZG9uZSBpbiBvbmUgcGxhY2UsIGF0IGBleGl0Jy4KLSAgICoKLSAgICogQ29udGludWluZyBhZnRlciBhbiBlcnJvciBpcyBpbnRlbmRlZCBmb3Igb2JqZWN0cyB3aGljaCBkbyB0aGVpciBvd24KLSAgICogdGVzdGluZyBvZiBgKmVycm9yJywgZS5nLiwgYXJyYXkgc3RhY2sgZnVuY3Rpb25zLiAgVGhpcyBhbGxvd3MgdXMgdG8KLSAgICogYXZvaWQgYW4gZXh0cmEgdGVzdCBhZnRlciB0aGUgY2FsbC4KLSAgICoKLSAgICogVW5pbXBsZW1lbnRlZCBvcGNvZGVzIGFyZSBpZ25vcmVkLgotICAgKgotICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX2ludGVycFQyQ2hhclN0cmluZyggQ0YyX0ZvbnQgICAgICAgICAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9CdWZmZXIgICAgICAgICAgICBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9PdXRsaW5lQ2FsbGJhY2tzICBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogICAgICB0cmFuc2xhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgICAgICAgIGRvaW5nU2VhYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICAgICAgICAgICAgIGN1clgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgICAgICAgICBjdXJZLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQqICAgICAgICAgICAgd2lkdGggKQotICB7Ci0gICAgLyogbGFzdEVycm9yIGlzIHVzZWQgZm9yIGVycm9ycyB0aGF0IGFyZSBpbW1lZGlhdGVseSB0ZXN0ZWQgKi8KLSAgICBGVF9FcnJvciAgbGFzdEVycm9yID0gRlRfRXJyX09rOwotCi0gICAgLyogcG9pbnRlciB0byBwYXJzZWQgZm9udCBvYmplY3QgKi8KLSAgICBDRkZfRGVjb2RlciogIGRlY29kZXIgPSBmb250LT5kZWNvZGVyOwotCi0gICAgRlRfRXJyb3IqICBlcnJvciAgPSAmZm9udC0+ZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBmb250LT5tZW1vcnk7Ci0KLSAgICBDRjJfRml4ZWQgIHNjYWxlWSAgICAgICAgPSBmb250LT5pbm5lclRyYW5zZm9ybS5kOwotICAgIENGMl9GaXhlZCAgbm9taW5hbFdpZHRoWCA9IGNmMl9nZXROb21pbmFsV2lkdGhYKCBkZWNvZGVyICk7Ci0KLSAgICAvKiBzYXZlIHRoaXMgZm9yIGhpbnRpbmcgc2VhYyBhY2NlbnRzICovCi0gICAgQ0YyX0ZpeGVkICBoaW50T3JpZ2luWSA9IGN1clk7Ci0KLSAgICBDRjJfU3RhY2sgIG9wU3RhY2sgPSBOVUxMOwotICAgIEZUX0J5dGUgICAgb3AxOyAgICAgICAgICAgICAgICAgICAgICAgLyogZmlyc3Qgb3Bjb2RlIGJ5dGUgKi8KLQotICAgIC8qIGluc3RydWN0aW9uIGxpbWl0OyAyMCwwMDAsMDAwIG1hdGNoZXMgQXZhbG9uICovCi0gICAgRlRfVUludDMyICBpbnN0cnVjdGlvbkxpbWl0ID0gMjAwMDAwMDBVTDsKLQotICAgIENGMl9BcnJTdGFja1JlYyAgc3ViclN0YWNrOwotCi0gICAgRlRfQm9vbCAgICAgaGF2ZVdpZHRoOwotICAgIENGMl9CdWZmZXIgIGNoYXJzdHJpbmcgPSBOVUxMOwotCi0gICAgQ0YyX0ludCAgY2hhcnN0cmluZ0luZGV4ID0gLTE7ICAgICAgIC8qIGluaXRpYWxpemUgdG8gZW1wdHkgKi8KLQotICAgIC8qIFRPRE86IHBsYWNlaG9sZGVycyBmb3IgaGludCBzdHJ1Y3R1cmVzICovCi0KLSAgICAvKiBvYmplY3RzIHVzZWQgZm9yIGhpbnRpbmcgKi8KLSAgICBDRjJfQXJyU3RhY2tSZWMgIGhTdGVtSGludEFycmF5OwotICAgIENGMl9BcnJTdGFja1JlYyAgdlN0ZW1IaW50QXJyYXk7Ci0KLSAgICBDRjJfSGludE1hc2tSZWMgICBoaW50TWFzazsKLSAgICBDRjJfR2x5cGhQYXRoUmVjICBnbHlwaFBhdGg7Ci0KLQotICAgIC8qIGluaXRpYWxpemUgdGhlIHJlbWFpbmluZyBvYmplY3RzICovCi0gICAgY2YyX2FycnN0YWNrX2luaXQoICZzdWJyU3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoIENGMl9CdWZmZXJSZWMgKSApOwotICAgIGNmMl9hcnJzdGFja19pbml0KCAmaFN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoIENGMl9TdGVtSGludFJlYyApICk7Ci0gICAgY2YyX2FycnN0YWNrX2luaXQoICZ2U3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICBlcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggQ0YyX1N0ZW1IaW50UmVjICkgKTsKLQotICAgIC8qIGluaXRpYWxpemUgQ0YyX1N0ZW1IaW50IGFycmF5cyAqLwotICAgIGNmMl9oaW50bWFza19pbml0KCAmaGludE1hc2ssIGVycm9yICk7Ci0KLSAgICAvKiBpbml0aWFsaXplIHBhdGggbWFwIHRvIG1hbmFnZSBkcmF3aW5nIG9wZXJhdGlvbnMgKi8KLQotICAgIC8qIE5vdGU6IGxhc3QgNCBwYXJhbXMgYXJlIHVzZWQgdG8gaGFuZGxlIGBNb3ZlVG9QZXJtaXNzaXZlJywgd2hpY2ggKi8KLSAgICAvKiAgICAgICBtYXkgbmVlZCB0byBjYWxsIGBoaW50TWFwLkJ1aWxkJyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogVE9ETzogTW92ZVRvUGVybWlzc2l2ZSBpcyBnb25lOyBhcmUgdGhlc2Ugc3RpbGwgbmVlZGVkPyAgICAgICAgICAqLwotICAgIGNmMl9nbHlwaHBhdGhfaW5pdCggJmdseXBoUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBzY2FsZVksCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBoU2hpZnQsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAmaFN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAmdlN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAmaGludE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICBoaW50T3JpZ2luWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZmb250LT5ibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uICk7Ci0KLSAgICAvKgotICAgICAqIEluaXRpYWxpemUgc3RhdGUgZm9yIHdpZHRoIHBhcnNpbmcuICBGcm9tIHRoZSBDRkYgU3BlYzoKLSAgICAgKgotICAgICAqICAgVGhlIGZpcnN0IHN0YWNrLWNsZWFyaW5nIG9wZXJhdG9yLCB3aGljaCBtdXN0IGJlIG9uZSBvZiBoc3RlbSwKLSAgICAgKiAgIGhzdGVtaG0sIHZzdGVtLCB2c3RlbWhtLCBjbnRybWFzaywgaGludG1hc2ssIGhtb3ZldG8sIHZtb3ZldG8sCi0gICAgICogICBybW92ZXRvLCBvciBlbmRjaGFyLCB0YWtlcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IC0gdGhlIHdpZHRoIChhcwotICAgICAqICAgZGVzY3JpYmVkIGVhcmxpZXIpLCB3aGljaCBtYXkgYmUgZXhwcmVzc2VkIGFzIHplcm8gb3Igb25lIG51bWVyaWMKLSAgICAgKiAgIGFyZ3VtZW50LgotICAgICAqCi0gICAgICogV2hhdCB3ZSBpbXBsZW1lbnQgaGVyZSB1c2VzIHRoZSBmaXJzdCB2YWxpZGx5IHNwZWNpZmllZCB3aWR0aCwgYnV0Ci0gICAgICogZG9lcyBub3QgZGV0ZWN0IGVycm9ycyBmb3Igc3BlY2lmeWluZyBtb3JlIHRoYW4gb25lIHdpZHRoLgotICAgICAqCi0gICAgICogSWYgb25lIG9mIHRoZSBhYm92ZSBvcGVyYXRvcnMgb2NjdXJzIHdpdGhvdXQgZXhwbGljaXRseSBzcGVjaWZ5aW5nCi0gICAgICogYSB3aWR0aCwgd2UgYXNzdW1lIHRoZSBkZWZhdWx0IHdpZHRoLgotICAgICAqCi0gICAgICovCi0gICAgaGF2ZVdpZHRoID0gRkFMU0U7Ci0gICAgKndpZHRoICAgID0gY2YyX2dldERlZmF1bHRXaWR0aFgoIGRlY29kZXIgKTsKLQotICAgIC8qCi0gICAgICogTm90ZTogYXQgdGhpcyBwb2ludCwgYWxsIHBvaW50ZXJzIHRvIHJlc291cmNlcyBtdXN0IGJlIE5VTEwKLSAgICAgKiBhbmQgYWxsIGxvY2FsIG9iamVjdHMgbXVzdCBiZSBpbml0aWFsaXplZC4KLSAgICAgKiBUaGVyZSBtdXN0IGJlIG5vIGJyYW5jaGVzIHRvIGV4aXQ6IGFib3ZlIHRoaXMgcG9pbnQuCi0gICAgICoKLSAgICAgKi8KLQotICAgIC8qIGFsbG9jYXRlIGFuIG9wZXJhbmQgc3RhY2sgKi8KLSAgICBvcFN0YWNrID0gY2YyX3N0YWNrX2luaXQoIG1lbW9yeSwgZXJyb3IgKTsKLSAgICBpZiAoICFvcFN0YWNrICkKLSAgICB7Ci0gICAgICBsYXN0RXJyb3IgPSBGVF9USFJPVyggT3V0X09mX01lbW9yeSApOwotICAgICAgZ290byBleGl0OwotICAgIH0KLQotICAgIC8qIGluaXRpYWxpemUgc3Vicm91dGluZSBzdGFjayBieSBwbGFjaW5nIHRvcCBsZXZlbCBjaGFyc3RyaW5nIGFzICovCi0gICAgLyogZmlyc3QgZWxlbWVudCAobWF4IGRlcHRoIHBsdXMgb25lIGZvciB0aGUgY2hhcnN0cmluZykgICAgICAgICAgKi8KLSAgICAvKiBOb3RlOiBDYWxsZXIgb3ducyBhbmQgbXVzdCBmaW5hbGl6ZSB0aGUgZmlyc3QgY2hhcnN0cmluZy4gICAgICAqLwotICAgIC8qICAgICAgIE91ciBjb3B5IG9mIGl0IGRvZXMgbm90IGNoYW5nZSB0aGF0IHJlcXVpcmVtZW50LiAgICAgICAgICovCi0gICAgY2YyX2FycnN0YWNrX3NldENvdW50KCAmc3ViclN0YWNrLCBDRjJfTUFYX1NVQlIgKyAxICk7Ci0KLSAgICBjaGFyc3RyaW5nICA9IChDRjJfQnVmZmVyKWNmMl9hcnJzdGFja19nZXRCdWZmZXIoICZzdWJyU3RhY2sgKTsKLSAgICAqY2hhcnN0cmluZyA9ICpidWY7ICAgIC8qIHN0cnVjdHVyZSBjb3B5ICovCi0KLSAgICBjaGFyc3RyaW5nSW5kZXggPSAwOyAgICAgICAvKiBlbnRyeSBpcyB2YWxpZCBub3cgKi8KLQotICAgIC8qIGNhdGNoIGVycm9ycyBzbyBmYXIgKi8KLSAgICBpZiAoICplcnJvciApCi0gICAgICBnb3RvIGV4aXQ7Ci0KLSAgICAvKiBtYWluIGludGVycHJldGVyIGxvb3AgKi8KLSAgICB3aGlsZSAoIDEgKQotICAgIHsKLSAgICAgIGlmICggY2YyX2J1Zl9pc0VuZCggY2hhcnN0cmluZyApICkKLSAgICAgIHsKLSAgICAgICAgLyogSWYgd2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBjaGFyc3RyaW5nLCBzaW11bGF0ZSBhICovCi0gICAgICAgIC8qIGNmMl9jbWRSRVRVUk4gb3IgY2YyX2NtZEVORENIQVIuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIGNoYXJzdHJpbmdJbmRleCApCi0gICAgICAgICAgb3AxID0gY2YyX2NtZFJFVFVSTjsgIC8qIGVuZCBvZiBidWZmZXIgZm9yIHN1YnJvdXRpbmUgKi8KLSAgICAgICAgZWxzZQotICAgICAgICAgIG9wMSA9IGNmMl9jbWRFTkRDSEFSOyAvKiBlbmQgb2YgYnVmZmVyIGZvciB0b3AgbGV2ZWwgY2hhcnN0cmluZyAqLwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBvcDEgPSAoRlRfQnl0ZSljZjJfYnVmX3JlYWRCeXRlKCBjaGFyc3RyaW5nICk7Ci0KLSAgICAgIC8qIGNoZWNrIGZvciBlcnJvcnMgb25jZSBwZXIgbG9vcCAqLwotICAgICAgaWYgKCAqZXJyb3IgKQotICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAgICAgIGluc3RydWN0aW9uTGltaXQtLTsKLSAgICAgIGlmICggaW5zdHJ1Y3Rpb25MaW1pdCA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgbGFzdEVycm9yID0gRlRfVEhST1coIEludmFsaWRfR2x5cGhfRm9ybWF0ICk7Ci0gICAgICAgIGdvdG8gZXhpdDsKLSAgICAgIH0KLQotICAgICAgc3dpdGNoKCBvcDEgKQotICAgICAgewotICAgICAgY2FzZSBjZjJfY21kUkVTRVJWRURfMDoKLSAgICAgIGNhc2UgY2YyX2NtZFJFU0VSVkVEXzI6Ci0gICAgICBjYXNlIGNmMl9jbWRSRVNFUlZFRF85OgotICAgICAgY2FzZSBjZjJfY21kUkVTRVJWRURfMTM6Ci0gICAgICBjYXNlIGNmMl9jbWRSRVNFUlZFRF8xNToKLSAgICAgIGNhc2UgY2YyX2NtZFJFU0VSVkVEXzE2OgotICAgICAgY2FzZSBjZjJfY21kUkVTRVJWRURfMTc6Ci0gICAgICAgIC8qIHdlIG1heSBnZXQgaGVyZSBpZiB3ZSBoYXZlIGEgcHJpb3IgZXJyb3IgKi8KLSAgICAgICAgRlRfVFJBQ0U0KCggIiB1bmtub3duIG9wICglZClcbiIsIG9wMSApKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgY2YyX2NtZEhTVEVNSE06Ci0gICAgICBjYXNlIGNmMl9jbWRIU1RFTToKLSAgICAgICAgRlRfVFJBQ0U0KCggb3AxID09IGNmMl9jbWRIU1RFTUhNID8gIiBoc3RlbWhtXG4iIDogIiBoc3RlbVxuIiApKTsKLQotICAgICAgICAvKiBuZXZlciBhZGQgaGludHMgYWZ0ZXIgdGhlIG1hc2sgaXMgY29tcHV0ZWQgKi8KLSAgICAgICAgaWYgKCBjZjJfaGludG1hc2tfaXNWYWxpZCggJmhpbnRNYXNrICkgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggImNmMl9pbnRlcnBUMkNoYXJTdHJpbmc6IgotICAgICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBob3Jpem9udGFsIGhpbnQgbWFza1xuIiApKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNmMl9kb1N0ZW1zKCBmb250LAotICAgICAgICAgICAgICAgICAgICAgb3BTdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICZoU3RlbUhpbnRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgJmhhdmVXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgIDAgKTsKLQotICAgICAgICBpZiAoIGZvbnQtPmRlY29kZXItPndpZHRoX29ubHkgKQotICAgICAgICAgICAgZ290byBleGl0OwotCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIGNmMl9jbWRWU1RFTUhNOgotICAgICAgY2FzZSBjZjJfY21kVlNURU06Ci0gICAgICAgIEZUX1RSQUNFNCgoIG9wMSA9PSBjZjJfY21kVlNURU1ITSA/ICIgdnN0ZW1obVxuIiA6ICIgdnN0ZW1cbiIgKSk7Ci0KLSAgICAgICAgLyogbmV2ZXIgYWRkIGhpbnRzIGFmdGVyIHRoZSBtYXNrIGlzIGNvbXB1dGVkICovCi0gICAgICAgIGlmICggY2YyX2hpbnRtYXNrX2lzVmFsaWQoICZoaW50TWFzayApICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFNCgoICJjZjJfaW50ZXJwVDJDaGFyU3RyaW5nOiIKLSAgICAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgdmVydGljYWwgaGludCBtYXNrXG4iICkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2YyX2RvU3RlbXMoIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICBvcFN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgJnZTdGVtSGludEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAmaGF2ZVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgMCApOwotCi0gICAgICAgIGlmICggZm9udC0+ZGVjb2Rlci0+d2lkdGhfb25seSApCi0gICAgICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgY2YyX2NtZFZNT1ZFVE86Ci0gICAgICAgIEZUX1RSQUNFNCgoICIgdm1vdmV0b1xuIiApKTsKLQotICAgICAgICBpZiAoIGNmMl9zdGFja19jb3VudCggb3BTdGFjayApID4gMSAmJiAhaGF2ZVdpZHRoICkKLSAgICAgICAgICAqd2lkdGggPSBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgMCApICsgbm9taW5hbFdpZHRoWDsKLQotICAgICAgICAvKiB3aWR0aCBpcyBkZWZpbmVkIG9yIGRlZmF1bHQgYWZ0ZXIgdGhpcyAqLwotICAgICAgICBoYXZlV2lkdGggPSBUUlVFOwotCi0gICAgICAgIGlmICggZm9udC0+ZGVjb2Rlci0+d2lkdGhfb25seSApCi0gICAgICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAgICAgICAgY3VyWSArPSBjZjJfc3RhY2tfcG9wRml4ZWQoIG9wU3RhY2sgKTsKLQotICAgICAgICBjZjJfZ2x5cGhwYXRoX21vdmVUbyggJmdseXBoUGF0aCwgY3VyWCwgY3VyWSApOwotCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIGNmMl9jbWRSTElORVRPOgotICAgICAgICB7Ci0gICAgICAgICAgQ0YyX1VJbnQgIGluZGV4OwotICAgICAgICAgIENGMl9VSW50ICBjb3VudCA9IGNmMl9zdGFja19jb3VudCggb3BTdGFjayApOwotCi0KLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHJsaW5ldG9cbiIgKSk7Ci0KLSAgICAgICAgICBmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4ICs9IDIgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGN1clggKz0gY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGluZGV4ICsgMCApOwotICAgICAgICAgICAgY3VyWSArPSBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaW5kZXggKyAxICk7Ci0KLSAgICAgICAgICAgIGNmMl9nbHlwaHBhdGhfbGluZVRvKCAmZ2x5cGhQYXRoLCBjdXJYLCBjdXJZICk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgY2YyX3N0YWNrX2NsZWFyKCBvcFN0YWNrICk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7IC8qIG5vIG5lZWQgdG8gY2xlYXIgc3RhY2sgYWdhaW4gKi8KLQotICAgICAgY2FzZSBjZjJfY21kSExJTkVUTzoKLSAgICAgIGNhc2UgY2YyX2NtZFZMSU5FVE86Ci0gICAgICAgIHsKLSAgICAgICAgICBDRjJfVUludCAgaW5kZXg7Ci0gICAgICAgICAgQ0YyX1VJbnQgIGNvdW50ID0gY2YyX3N0YWNrX2NvdW50KCBvcFN0YWNrICk7Ci0KLSAgICAgICAgICBGVF9Cb29sICBpc1ggPSBvcDEgPT0gY2YyX2NtZEhMSU5FVE87Ci0KLQotICAgICAgICAgIEZUX1RSQUNFNCgoIGlzWCA/ICIgaGxpbmV0b1xuIiA6ICIgdmxpbmV0b1xuIiApKTsKLQotICAgICAgICAgIGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgaW5kZXgrKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgQ0YyX0ZpeGVkICB2ID0gY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGluZGV4ICk7Ci0KLQotICAgICAgICAgICAgaWYgKCBpc1ggKQotICAgICAgICAgICAgICBjdXJYICs9IHY7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGN1clkgKz0gdjsKLQotICAgICAgICAgICAgaXNYID0gIWlzWDsKLQotICAgICAgICAgICAgY2YyX2dseXBocGF0aF9saW5lVG8oICZnbHlwaFBhdGgsIGN1clgsIGN1clkgKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBjZjJfc3RhY2tfY2xlYXIoIG9wU3RhY2sgKTsKLSAgICAgICAgfQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgY2FzZSBjZjJfY21kUkNVUlZFTElORToKLSAgICAgIGNhc2UgY2YyX2NtZFJSQ1VSVkVUTzoKLSAgICAgICAgewotICAgICAgICAgIENGMl9VSW50ICBjb3VudCA9IGNmMl9zdGFja19jb3VudCggb3BTdGFjayApOwotICAgICAgICAgIENGMl9VSW50ICBpbmRleCA9IDA7Ci0KLQotICAgICAgICAgIEZUX1RSQUNFNCgoIG9wMSA9PSBjZjJfY21kUkNVUlZFTElORSA/ICIgcmN1cnZlbGluZVxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIgcnJjdXJ2ZXRvXG4iICkpOwotCi0gICAgICAgICAgd2hpbGUgKCBpbmRleCArIDYgPD0gY291bnQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENGMl9GaXhlZCAgeDEgPSBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaW5kZXggKyAwICkgKyBjdXJYOwotICAgICAgICAgICAgQ0YyX0ZpeGVkICB5MSA9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpbmRleCArIDEgKSArIGN1clk7Ci0gICAgICAgICAgICBDRjJfRml4ZWQgIHgyID0gY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGluZGV4ICsgMiApICsgeDE7Ci0gICAgICAgICAgICBDRjJfRml4ZWQgIHkyID0gY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGluZGV4ICsgMyApICsgeTE7Ci0gICAgICAgICAgICBDRjJfRml4ZWQgIHgzID0gY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGluZGV4ICsgNCApICsgeDI7Ci0gICAgICAgICAgICBDRjJfRml4ZWQgIHkzID0gY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGluZGV4ICsgNSApICsgeTI7Ci0KLQotICAgICAgICAgICAgY2YyX2dseXBocGF0aF9jdXJ2ZVRvKCAmZ2x5cGhQYXRoLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzICk7Ci0KLSAgICAgICAgICAgIGN1clggICA9IHgzOwotICAgICAgICAgICAgY3VyWSAgID0geTM7Ci0gICAgICAgICAgICBpbmRleCArPSA2OwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggb3AxID09IGNmMl9jbWRSQ1VSVkVMSU5FICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjdXJYICs9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpbmRleCArIDAgKTsKLSAgICAgICAgICAgIGN1clkgKz0gY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGluZGV4ICsgMSApOwotCi0gICAgICAgICAgICBjZjJfZ2x5cGhwYXRoX2xpbmVUbyggJmdseXBoUGF0aCwgY3VyWCwgY3VyWSApOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGNmMl9zdGFja19jbGVhciggb3BTdGFjayApOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRpbnVlOyAvKiBubyBuZWVkIHRvIGNsZWFyIHN0YWNrIGFnYWluICovCi0KLSAgICAgIGNhc2UgY2YyX2NtZENBTExHU1VCUjoKLSAgICAgIGNhc2UgY2YyX2NtZENBTExTVUJSOgotICAgICAgICB7Ci0gICAgICAgICAgQ0YyX1VJbnQgIHN1YnJJbmRleDsKLQotCi0gICAgICAgICAgRlRfVFJBQ0U0KCggb3AxID09IGNmMl9jbWRDQUxMR1NVQlIgPyAiIGNhbGxnc3ViciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIgY2FsbHN1YnIiICkpOwotCi0gICAgICAgICAgaWYgKCBjaGFyc3RyaW5nSW5kZXggPiBDRjJfTUFYX1NVQlIgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIG1heCBzdWJyIHBsdXMgb25lIGZvciBjaGFyc3RyaW5nICovCi0gICAgICAgICAgICBsYXN0RXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9HbHlwaF9Gb3JtYXQgKTsKLSAgICAgICAgICAgIGdvdG8gZXhpdDsgICAgICAgICAgICAgICAgICAgICAgLyogb3ZlcmZsb3cgb2Ygc3RhY2sgKi8KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBwdXNoIG91ciBjdXJyZW50IENGRiBjaGFyc3RyaW5nIHJlZ2lvbiBvbiBzdWJyU3RhY2sgKi8KLSAgICAgICAgICBjaGFyc3RyaW5nID0gKENGMl9CdWZmZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2YyX2FycnN0YWNrX2dldFBvaW50ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ViclN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCljaGFyc3RyaW5nSW5kZXggKyAxICk7Ci0KLSAgICAgICAgICAvKiBzZXQgdXAgdGhlIG5ldyBDRkYgcmVnaW9uIGFuZCBwb2ludGVyICovCi0gICAgICAgICAgc3VickluZGV4ID0gKENGMl9VSW50KWNmMl9zdGFja19wb3BJbnQoIG9wU3RhY2sgKTsKLQotICAgICAgICAgIHN3aXRjaCAoIG9wMSApCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgY2YyX2NtZENBTExHU1VCUjoKLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgKGlkeCAlZCwgZW50ZXJpbmcgbGV2ZWwgJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgc3VickluZGV4ICsgKENGMl9VSW50KWRlY29kZXItPmdsb2JhbHNfYmlhcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzdHJpbmdJbmRleCArIDEgKSk7Ci0KLSAgICAgICAgICAgIGlmICggY2YyX2luaXRHbG9iYWxSZWdpb25CdWZmZXIoIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJySW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc3RyaW5nICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsYXN0RXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9HbHlwaF9Gb3JtYXQgKTsKLSAgICAgICAgICAgICAgZ290byBleGl0OyAgLyogc3Vicm91dGluZSBsb29rdXAgb3Igc3RyZWFtIGVycm9yICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvKiBjZjJfY21kQ0FMTFNVQlIgKi8KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgKGlkeCAlZCwgZW50ZXJpbmcgbGV2ZWwgJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgc3VickluZGV4ICsgKENGMl9VSW50KWRlY29kZXItPmxvY2Fsc19iaWFzLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnN0cmluZ0luZGV4ICsgMSApKTsKLQotICAgICAgICAgICAgaWYgKCBjZjJfaW5pdExvY2FsUmVnaW9uQnVmZmVyKCBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJySW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzdHJpbmcgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGxhc3RFcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0dseXBoX0Zvcm1hdCApOwotICAgICAgICAgICAgICBnb3RvIGV4aXQ7ICAvKiBzdWJyb3V0aW5lIGxvb2t1cCBvciBzdHJlYW0gZXJyb3IgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBjaGFyc3RyaW5nSW5kZXggKz0gMTsgICAgICAgLyogZW50cnkgaXMgdmFsaWQgbm93ICovCi0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7IC8qIGRvIG5vdCBjbGVhciB0aGUgc3RhY2sgKi8KLQotICAgICAgY2FzZSBjZjJfY21kUkVUVVJOOgotICAgICAgICBGVF9UUkFDRTQoKCAiIHJldHVybiAobGVhdmluZyBsZXZlbCAlZClcbiIsIGNoYXJzdHJpbmdJbmRleCApKTsKLQotICAgICAgICBpZiAoIGNoYXJzdHJpbmdJbmRleCA8IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogTm90ZTogY2Fubm90IHJldHVybiBmcm9tIHRvcCBjaGFyc3RyaW5nICovCi0gICAgICAgICAgbGFzdEVycm9yID0gRlRfVEhST1coIEludmFsaWRfR2x5cGhfRm9ybWF0ICk7Ci0gICAgICAgICAgZ290byBleGl0OyAgICAgICAgICAgICAgICAgICAgICAvKiB1bmRlcmZsb3cgb2Ygc3RhY2sgKi8KLSAgICAgICAgfQotCi0gICAgICAgIC8qIHJlc3RvcmUgcG9zaXRpb24gaW4gcHJldmlvdXMgY2hhcnN0cmluZyAqLwotICAgICAgICBjaGFyc3RyaW5nID0gKENGMl9CdWZmZXIpCi0gICAgICAgICAgICAgICAgICAgICAgIGNmMl9hcnJzdGFja19nZXRQb2ludGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICZzdWJyU3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgKENGMl9VSW50KS0tY2hhcnN0cmluZ0luZGV4ICk7Ci0gICAgICAgIGNvbnRpbnVlOyAgICAgLyogZG8gbm90IGNsZWFyIHRoZSBzdGFjayAqLwotCi0gICAgICBjYXNlIGNmMl9jbWRFU0M6Ci0gICAgICAgIHsKLSAgICAgICAgICBGVF9CeXRlICBvcDIgPSAoRlRfQnl0ZSljZjJfYnVmX3JlYWRCeXRlKCBjaGFyc3RyaW5nICk7Ci0KLQotICAgICAgICAgIHN3aXRjaCAoIG9wMiApCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgY2YyX2VzY0RPVFNFQ1RJT046Ci0gICAgICAgICAgICAvKiBzb21ldGhpbmcgYWJvdXQgYGZsaXAgdHlwZSBvZiBsb2NraW5nJyAtLSBpZ25vcmUgaXQgKi8KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgZG90c2VjdGlvblxuIiApKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAvKiBUT0RPOiBzaG91bGQgdGhlc2Ugb3BlcmF0b3JzIGJlIHN1cHBvcnRlZD8gKi8KLSAgICAgICAgICBjYXNlIGNmMl9lc2NBTkQ6IC8qIGluIHNwZWMgKi8KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgYW5kXG4iICkpOwotCi0gICAgICAgICAgICBDRjJfRklYTUU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgY2YyX2VzY09SOiAvKiBpbiBzcGVjICovCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIG9yXG4iICkpOwotCi0gICAgICAgICAgICBDRjJfRklYTUU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgY2YyX2VzY05PVDogLyogaW4gc3BlYyAqLwotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBub3RcbiIgKSk7Ci0KLSAgICAgICAgICAgIENGMl9GSVhNRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBjZjJfZXNjQUJTOiAvKiBpbiBzcGVjICovCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGFic1xuIiApKTsKLQotICAgICAgICAgICAgQ0YyX0ZJWE1FOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIGNmMl9lc2NBREQ6IC8qIGluIHNwZWMgKi8KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgYWRkXG4iICkpOwotCi0gICAgICAgICAgICBDRjJfRklYTUU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgY2YyX2VzY1NVQjogLyogaW4gc3BlYyAqLwotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBzdWJcbiIgKSk7Ci0KLSAgICAgICAgICAgIENGMl9GSVhNRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBjZjJfZXNjRElWOiAvKiBpbiBzcGVjICovCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGRpdlxuIiApKTsKLQotICAgICAgICAgICAgQ0YyX0ZJWE1FOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIGNmMl9lc2NORUc6IC8qIGluIHNwZWMgKi8KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgbmVnXG4iICkpOwotCi0gICAgICAgICAgICBDRjJfRklYTUU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgY2YyX2VzY0VROiAvKiBpbiBzcGVjICovCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGVxXG4iICkpOwotCi0gICAgICAgICAgICBDRjJfRklYTUU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgY2YyX2VzY0RST1A6IC8qIGluIHNwZWMgKi8KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgZHJvcFxuIiApKTsKLQotICAgICAgICAgICAgQ0YyX0ZJWE1FOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIGNmMl9lc2NQVVQ6IC8qIGluIHNwZWMgKi8KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgcHV0XG4iICkpOwotCi0gICAgICAgICAgICBDRjJfRklYTUU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgY2YyX2VzY0dFVDogLyogaW4gc3BlYyAqLwotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBnZXRcbiIgKSk7Ci0KLSAgICAgICAgICAgIENGMl9GSVhNRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBjZjJfZXNjSUZFTFNFOiAvKiBpbiBzcGVjICovCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGlmZWxzZVxuIiApKTsKLQotICAgICAgICAgICAgQ0YyX0ZJWE1FOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIGNmMl9lc2NSQU5ET006IC8qIGluIHNwZWMgKi8KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgcmFuZG9tXG4iICkpOwotCi0gICAgICAgICAgICBDRjJfRklYTUU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgY2YyX2VzY01VTDogLyogaW4gc3BlYyAqLwotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBtdWxcbiIgKSk7Ci0KLSAgICAgICAgICAgIENGMl9GSVhNRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBjZjJfZXNjU1FSVDogLyogaW4gc3BlYyAqLwotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBzcXJ0XG4iICkpOwotCi0gICAgICAgICAgICBDRjJfRklYTUU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgY2YyX2VzY0RVUDogLyogaW4gc3BlYyAqLwotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBkdXBcbiIgKSk7Ci0KLSAgICAgICAgICAgIENGMl9GSVhNRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBjZjJfZXNjRVhDSDogLyogaW4gc3BlYyAqLwotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBleGNoXG4iICkpOwotCi0gICAgICAgICAgICBDRjJfRklYTUU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgY2YyX2VzY0lOREVYOiAvKiBpbiBzcGVjICovCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGluZGV4XG4iICkpOwotCi0gICAgICAgICAgICBDRjJfRklYTUU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgY2YyX2VzY1JPTEw6IC8qIGluIHNwZWMgKi8KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgcm9sbFxuIiApKTsKLQotICAgICAgICAgICAgQ0YyX0ZJWE1FOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIGNmMl9lc2NIRkxFWDoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IEZUX0Jvb2wgIHJlYWRGcm9tU3RhY2tbMTJdID0KLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRSVUUgLyogZHgxICovLCBGQUxTRSAvKiBkeTEgKi8sCi0gICAgICAgICAgICAgICAgVFJVRSAvKiBkeDIgKi8sIFRSVUUgIC8qIGR5MiAqLywKLSAgICAgICAgICAgICAgICBUUlVFIC8qIGR4MyAqLywgRkFMU0UgLyogZHkzICovLAotICAgICAgICAgICAgICAgIFRSVUUgLyogZHg0ICovLCBGQUxTRSAvKiBkeTQgKi8sCi0gICAgICAgICAgICAgICAgVFJVRSAvKiBkeDUgKi8sIEZBTFNFIC8qIGR5NSAqLywKLSAgICAgICAgICAgICAgICBUUlVFIC8qIGR4NiAqLywgRkFMU0UgLyogZHk2ICovCi0gICAgICAgICAgICAgIH07Ci0KLQotICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGhmbGV4XG4iICkpOwotCi0gICAgICAgICAgICAgIGNmMl9kb0ZsZXgoIG9wU3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZjdXJYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VyWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmdseXBoUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEZyb21TdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgLyogZG9Db25kaXRpb25hbExhc3RSZWFkICovICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIGNhc2UgY2YyX2VzY0ZMRVg6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBGVF9Cb29sICByZWFkRnJvbVN0YWNrWzEyXSA9Ci0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUUlVFIC8qIGR4MSAqLywgVFJVRSAvKiBkeTEgKi8sCi0gICAgICAgICAgICAgICAgVFJVRSAvKiBkeDIgKi8sIFRSVUUgLyogZHkyICovLAotICAgICAgICAgICAgICAgIFRSVUUgLyogZHgzICovLCBUUlVFIC8qIGR5MyAqLywKLSAgICAgICAgICAgICAgICBUUlVFIC8qIGR4NCAqLywgVFJVRSAvKiBkeTQgKi8sCi0gICAgICAgICAgICAgICAgVFJVRSAvKiBkeDUgKi8sIFRSVUUgLyogZHk1ICovLAotICAgICAgICAgICAgICAgIFRSVUUgLyogZHg2ICovLCBUUlVFIC8qIGR5NiAqLwotICAgICAgICAgICAgICB9OwotCi0KLSAgICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBmbGV4XG4iICkpOwotCi0gICAgICAgICAgICAgIGNmMl9kb0ZsZXgoIG9wU3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZjdXJYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VyWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmdseXBoUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEZyb21TdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgLyogZG9Db25kaXRpb25hbExhc3RSZWFkICovICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsgICAgICAvKiBUT0RPOiB3aHkgaXMgdGhpcyBub3QgYSBjb250aW51ZT8gKi8KLQotICAgICAgICAgIGNhc2UgY2YyX2VzY0hGTEVYMToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IEZUX0Jvb2wgIHJlYWRGcm9tU3RhY2tbMTJdID0KLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRSVUUgLyogZHgxICovLCBUUlVFICAvKiBkeTEgKi8sCi0gICAgICAgICAgICAgICAgVFJVRSAvKiBkeDIgKi8sIFRSVUUgIC8qIGR5MiAqLywKLSAgICAgICAgICAgICAgICBUUlVFIC8qIGR4MyAqLywgRkFMU0UgLyogZHkzICovLAotICAgICAgICAgICAgICAgIFRSVUUgLyogZHg0ICovLCBGQUxTRSAvKiBkeTQgKi8sCi0gICAgICAgICAgICAgICAgVFJVRSAvKiBkeDUgKi8sIFRSVUUgIC8qIGR5NSAqLywKLSAgICAgICAgICAgICAgICBUUlVFIC8qIGR4NiAqLywgRkFMU0UgLyogZHk2ICovCi0gICAgICAgICAgICAgIH07Ci0KLQotICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGhmbGV4MVxuIiApKTsKLQotICAgICAgICAgICAgICBjZjJfZG9GbGV4KCBvcFN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VyWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmN1clksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZnbHlwaFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRGcm9tU3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIC8qIGRvQ29uZGl0aW9uYWxMYXN0UmVhZCAqLyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICBjYXNlIGNmMl9lc2NGTEVYMToKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IEZUX0Jvb2wgIHJlYWRGcm9tU3RhY2tbMTJdID0KLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRSVUUgIC8qIGR4MSAqLywgVFJVRSAgLyogZHkxICovLAotICAgICAgICAgICAgICAgIFRSVUUgIC8qIGR4MiAqLywgVFJVRSAgLyogZHkyICovLAotICAgICAgICAgICAgICAgIFRSVUUgIC8qIGR4MyAqLywgVFJVRSAgLyogZHkzICovLAotICAgICAgICAgICAgICAgIFRSVUUgIC8qIGR4NCAqLywgVFJVRSAgLyogZHk0ICovLAotICAgICAgICAgICAgICAgIFRSVUUgIC8qIGR4NSAqLywgVFJVRSAgLyogZHk1ICovLAotICAgICAgICAgICAgICAgIEZBTFNFIC8qIGR4NiAqLywgRkFMU0UgLyogZHk2ICovCi0gICAgICAgICAgICAgIH07Ci0KLQotICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGZsZXgxXG4iICkpOwotCi0gICAgICAgICAgICAgIGNmMl9kb0ZsZXgoIG9wU3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZjdXJYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VyWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmdseXBoUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEZyb21TdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSAvKiBkb0NvbmRpdGlvbmFsTGFzdFJlYWQgKi8gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgY2FzZSBjZjJfZXNjUkVTRVJWRURfMToKLSAgICAgICAgICBjYXNlIGNmMl9lc2NSRVNFUlZFRF8yOgotICAgICAgICAgIGNhc2UgY2YyX2VzY1JFU0VSVkVEXzY6Ci0gICAgICAgICAgY2FzZSBjZjJfZXNjUkVTRVJWRURfNzoKLSAgICAgICAgICBjYXNlIGNmMl9lc2NSRVNFUlZFRF84OgotICAgICAgICAgIGNhc2UgY2YyX2VzY1JFU0VSVkVEXzEzOgotICAgICAgICAgIGNhc2UgY2YyX2VzY1JFU0VSVkVEXzE2OgotICAgICAgICAgIGNhc2UgY2YyX2VzY1JFU0VSVkVEXzE3OgotICAgICAgICAgIGNhc2UgY2YyX2VzY1JFU0VSVkVEXzE5OgotICAgICAgICAgIGNhc2UgY2YyX2VzY1JFU0VSVkVEXzI1OgotICAgICAgICAgIGNhc2UgY2YyX2VzY1JFU0VSVkVEXzMxOgotICAgICAgICAgIGNhc2UgY2YyX2VzY1JFU0VSVkVEXzMyOgotICAgICAgICAgIGNhc2UgY2YyX2VzY1JFU0VSVkVEXzMzOgotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIHVua25vd24gb3AgKDEyLCAlZClcbiIsIG9wMiApKTsKLQotICAgICAgICAgIH07IC8qIGVuZCBvZiBzd2l0Y2ggc3RhdGVtZW50IGNoZWNraW5nIGBvcDInICovCi0KLSAgICAgICAgfSAvKiBjYXNlIGNmMl9jbWRFU0MgKi8KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgY2YyX2NtZEVORENIQVI6Ci0gICAgICAgIEZUX1RSQUNFNCgoICIgZW5kY2hhclxuIiApKTsKLQotICAgICAgICBpZiAoIGNmMl9zdGFja19jb3VudCggb3BTdGFjayApID09IDEgfHwKLSAgICAgICAgICAgICBjZjJfc3RhY2tfY291bnQoIG9wU3RhY2sgKSA9PSA1ICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggIWhhdmVXaWR0aCApCi0gICAgICAgICAgICAqd2lkdGggPSBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgMCApICsgbm9taW5hbFdpZHRoWDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHdpZHRoIGlzIGRlZmluZWQgb3IgZGVmYXVsdCBhZnRlciB0aGlzICovCi0gICAgICAgIGhhdmVXaWR0aCA9IFRSVUU7Ci0KLSAgICAgICAgaWYgKCBmb250LT5kZWNvZGVyLT53aWR0aF9vbmx5ICkKLSAgICAgICAgICAgIGdvdG8gZXhpdDsKLQotICAgICAgICAvKiBjbG9zZSBwYXRoIGlmIHN0aWxsIG9wZW4gKi8KLSAgICAgICAgY2YyX2dseXBocGF0aF9jbG9zZU9wZW5QYXRoKCAmZ2x5cGhQYXRoICk7Ci0KLSAgICAgICAgaWYgKCBjZjJfc3RhY2tfY291bnQoIG9wU3RhY2sgKSA+IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogbXVzdCBiZSBlaXRoZXIgNCBvciA1IC0tICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIHRoaXMgaXMgYSAoZGVwcmVjYXRlZCkgaW1wbGllZCBgc2VhYycgb3BlcmF0b3IgKi8KLQotICAgICAgICAgIENGMl9JbnQgICAgICAgIGFjaGFyOwotICAgICAgICAgIENGMl9JbnQgICAgICAgIGJjaGFyOwotICAgICAgICAgIENGMl9CdWZmZXJSZWMgIGNvbXBvbmVudDsKLSAgICAgICAgICBDRjJfRml4ZWQgICAgICBkdW1teVdpZHRoOyAgIC8qIGlnbm9yZSBjb21wb25lbnQgd2lkdGggKi8KLSAgICAgICAgICBGVF9FcnJvciAgICAgICBlcnJvcjI7Ci0KLQotICAgICAgICAgIGlmICggZG9pbmdTZWFjICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBsYXN0RXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9HbHlwaF9Gb3JtYXQgKTsKLSAgICAgICAgICAgIGdvdG8gZXhpdDsgICAgICAvKiBuZXN0ZWQgc2VhYyAqLwotICAgICAgICAgIH0KLQotICAgICAgICAgIGFjaGFyID0gY2YyX3N0YWNrX3BvcEludCggb3BTdGFjayApOwotICAgICAgICAgIGJjaGFyID0gY2YyX3N0YWNrX3BvcEludCggb3BTdGFjayApOwotCi0gICAgICAgICAgY3VyWSA9IGNmMl9zdGFja19wb3BGaXhlZCggb3BTdGFjayApOwotICAgICAgICAgIGN1clggPSBjZjJfc3RhY2tfcG9wRml4ZWQoIG9wU3RhY2sgKTsKLQotICAgICAgICAgIGVycm9yMiA9IGNmMl9nZXRTZWFjQ29tcG9uZW50KCBkZWNvZGVyLCBhY2hhciwgJmNvbXBvbmVudCApOwotICAgICAgICAgIGlmICggZXJyb3IyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgbGFzdEVycm9yID0gZXJyb3IyOyAgICAgIC8qIHBhc3MgRnJlZVR5cGUgZXJyb3IgdGhyb3VnaCAqLwotICAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2YyX2ludGVycFQyQ2hhclN0cmluZyggZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1clgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVtbXlXaWR0aCApOwotICAgICAgICAgIGNmMl9mcmVlU2VhY0NvbXBvbmVudCggZGVjb2RlciwgJmNvbXBvbmVudCApOwotCi0gICAgICAgICAgZXJyb3IyID0gY2YyX2dldFNlYWNDb21wb25lbnQoIGRlY29kZXIsIGJjaGFyLCAmY29tcG9uZW50ICk7Ci0gICAgICAgICAgaWYgKCBlcnJvcjIgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxhc3RFcnJvciA9IGVycm9yMjsgICAgICAvKiBwYXNzIEZyZWVUeXBlIGVycm9yIHRocm91Z2ggKi8KLSAgICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2YyX2ludGVycFQyQ2hhclN0cmluZyggZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVtbXlXaWR0aCApOwotICAgICAgICAgIGNmMl9mcmVlU2VhY0NvbXBvbmVudCggZGVjb2RlciwgJmNvbXBvbmVudCApOwotICAgICAgICB9Ci0gICAgICAgIGdvdG8gZXhpdDsKLQotICAgICAgY2FzZSBjZjJfY21kQ05UUk1BU0s6Ci0gICAgICBjYXNlIGNmMl9jbWRISU5UTUFTSzoKLSAgICAgICAgLyogdGhlIGZpbmFsIFxuIGluIHRoZSB0cmFjaW5nIG1lc3NhZ2UgZ2V0cyBhZGRlZCBpbiAgICAgICovCi0gICAgICAgIC8qIGBjZjJfaGludG1hc2tfcmVhZCcgKHdoaWNoIGFsc28gdHJhY2VzIHRoZSBtYXNrIGJ5dGVzKSAqLwotICAgICAgICBGVF9UUkFDRTQoKCBvcDEgPT0gY2YyX2NtZENOVFJNQVNLID8gIiBjbnRybWFzayIgOiAiIGhpbnRtYXNrIiApKTsKLQotICAgICAgICAvKiBuZXZlciBhZGQgaGludHMgYWZ0ZXIgdGhlIG1hc2sgaXMgY29tcHV0ZWQgKi8KLSAgICAgICAgaWYgKCBjZjJfc3RhY2tfY291bnQoIG9wU3RhY2sgKSA+IDEgICAgJiYKLSAgICAgICAgICAgICBjZjJfaGludG1hc2tfaXNWYWxpZCggJmhpbnRNYXNrICkgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggImNmMl9pbnRlcnBUMkNoYXJTdHJpbmc6IGludmFsaWQgaGludCBtYXNrXG4iICkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogaWYgdGhlcmUgYXJlIGFyZ3VtZW50cyBvbiB0aGUgc3RhY2ssIHRoZXJlIHRoaXMgaXMgYW4gKi8KLSAgICAgICAgLyogaW1wbGllZCBjZjJfY21kVlNURU1ITSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgY2YyX2RvU3RlbXMoIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICBvcFN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgJnZTdGVtSGludEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAmaGF2ZVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgMCApOwotCi0gICAgICAgIGlmICggZm9udC0+ZGVjb2Rlci0+d2lkdGhfb25seSApCi0gICAgICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAgICAgICAgaWYgKCBvcDEgPT0gY2YyX2NtZEhJTlRNQVNLICkKLSAgICAgICAgewotICAgICAgICAgIC8qIGNvbnN1bWUgdGhlIGhpbnQgbWFzayBieXRlcyB3aGljaCBmb2xsb3cgdGhlIG9wZXJhdG9yICovCi0gICAgICAgICAgY2YyX2hpbnRtYXNrX3JlYWQoICZoaW50TWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YyX2FycnN0YWNrX3NpemUoICZoU3RlbUhpbnRBcnJheSApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZjJfYXJyc3RhY2tfc2l6ZSggJnZTdGVtSGludEFycmF5ICkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvKgotICAgICAgICAgICAqIENvbnN1bWUgdGhlIGNvdW50ZXIgbWFzayBieXRlcyB3aGljaCBmb2xsb3cgdGhlIG9wZXJhdG9yOgotICAgICAgICAgICAqIEJ1aWxkIGEgdGVtcG9yYXJ5IGhpbnQgbWFwLCBqdXN0IHRvIHBsYWNlIGFuZCBsb2NrIHRob3NlCi0gICAgICAgICAgICogc3RlbXMgcGFydGljaXBhdGluZyBpbiB0aGUgY291bnRlciBtYXNrLiAgVGhlc2UgYXJlIG1vc3QKLSAgICAgICAgICAgKiBsaWtlbHkgdGhlIGRvbWluYW50IGhzdGVtcywgYW5kIGFyZSBncm91cGVkIHRvZ2V0aGVyIGluIGEKLSAgICAgICAgICAgKiBmZXcgY291bnRlciBncm91cHMsIG5vdCBuZWNlc3NhcmlseSBpbiBjb3JyZXNwb25kZW5jZQotICAgICAgICAgICAqIHdpdGggdGhlIGhpbnQgZ3JvdXBzLiAgVGhpcyByZWR1Y2VzIHRoZSBjaGFuY2VzIG9mCi0gICAgICAgICAgICogY29uZmxpY3RzIGJldHdlZW4gaHN0ZW1zIHRoYXQgYXJlIGluaXRpYWxseSBwbGFjZWQgaW4KLSAgICAgICAgICAgKiBzZXBhcmF0ZSBoaW50IGdyb3VwcyBhbmQgdGhlbiBicm91Z2h0IHRvZ2V0aGVyLiAgVGhlCi0gICAgICAgICAgICogcG9zaXRpb25zIGFyZSBjb3BpZWQgYmFjayB0byBgaFN0ZW1IaW50QXJyYXknLCBzbyB3ZSBjYW4KLSAgICAgICAgICAgKiBkaXNjYXJkIGBjb3VudGVyTWFzaycgYW5kIGBjb3VudGVySGludE1hcCcuCi0gICAgICAgICAgICoKLSAgICAgICAgICAgKi8KLSAgICAgICAgICBDRjJfSGludE1hcFJlYyAgIGNvdW50ZXJIaW50TWFwOwotICAgICAgICAgIENGMl9IaW50TWFza1JlYyAgY291bnRlck1hc2s7Ci0KLQotICAgICAgICAgIGNmMl9oaW50bWFwX2luaXQoICZjb3VudGVySGludE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbHlwaFBhdGguaW5pdGlhbEhpbnRNYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdseXBoUGF0aC5oaW50TW92ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVZICk7Ci0gICAgICAgICAgY2YyX2hpbnRtYXNrX2luaXQoICZjb3VudGVyTWFzaywgZXJyb3IgKTsKLQotICAgICAgICAgIGNmMl9oaW50bWFza19yZWFkKCAmY291bnRlck1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmMl9hcnJzdGFja19zaXplKCAmaFN0ZW1IaW50QXJyYXkgKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YyX2FycnN0YWNrX3NpemUoICZ2U3RlbUhpbnRBcnJheSApICk7Ci0gICAgICAgICAgY2YyX2hpbnRtYXBfYnVpbGQoICZjb3VudGVySGludE1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhTdGVtSGludEFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdlN0ZW1IaW50QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb3VudGVyTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBjZjJfY21kUk1PVkVUTzoKLSAgICAgICAgRlRfVFJBQ0U0KCggIiBybW92ZXRvXG4iICkpOwotCi0gICAgICAgIGlmICggY2YyX3N0YWNrX2NvdW50KCBvcFN0YWNrICkgPiAyICYmICFoYXZlV2lkdGggKQotICAgICAgICAgICp3aWR0aCA9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCAwICkgKyBub21pbmFsV2lkdGhYOwotCi0gICAgICAgIC8qIHdpZHRoIGlzIGRlZmluZWQgb3IgZGVmYXVsdCBhZnRlciB0aGlzICovCi0gICAgICAgIGhhdmVXaWR0aCA9IFRSVUU7Ci0KLSAgICAgICAgaWYgKCBmb250LT5kZWNvZGVyLT53aWR0aF9vbmx5ICkKLSAgICAgICAgICAgIGdvdG8gZXhpdDsKLQotICAgICAgICBjdXJZICs9IGNmMl9zdGFja19wb3BGaXhlZCggb3BTdGFjayApOwotICAgICAgICBjdXJYICs9IGNmMl9zdGFja19wb3BGaXhlZCggb3BTdGFjayApOwotCi0gICAgICAgIGNmMl9nbHlwaHBhdGhfbW92ZVRvKCAmZ2x5cGhQYXRoLCBjdXJYLCBjdXJZICk7Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgY2YyX2NtZEhNT1ZFVE86Ci0gICAgICAgIEZUX1RSQUNFNCgoICIgaG1vdmV0b1xuIiApKTsKLQotICAgICAgICBpZiAoIGNmMl9zdGFja19jb3VudCggb3BTdGFjayApID4gMSAmJiAhaGF2ZVdpZHRoICkKLSAgICAgICAgICAqd2lkdGggPSBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgMCApICsgbm9taW5hbFdpZHRoWDsKLQotICAgICAgICAvKiB3aWR0aCBpcyBkZWZpbmVkIG9yIGRlZmF1bHQgYWZ0ZXIgdGhpcyAqLwotICAgICAgICBoYXZlV2lkdGggPSBUUlVFOwotCi0gICAgICAgIGlmICggZm9udC0+ZGVjb2Rlci0+d2lkdGhfb25seSApCi0gICAgICAgICAgICBnb3RvIGV4aXQ7Ci0KLSAgICAgICAgY3VyWCArPSBjZjJfc3RhY2tfcG9wRml4ZWQoIG9wU3RhY2sgKTsKLQotICAgICAgICBjZjJfZ2x5cGhwYXRoX21vdmVUbyggJmdseXBoUGF0aCwgY3VyWCwgY3VyWSApOwotCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIGNmMl9jbWRSTElORUNVUlZFOgotICAgICAgICB7Ci0gICAgICAgICAgQ0YyX1VJbnQgIGNvdW50ID0gY2YyX3N0YWNrX2NvdW50KCBvcFN0YWNrICk7Ci0gICAgICAgICAgQ0YyX1VJbnQgIGluZGV4ID0gMDsKLQotCi0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBybGluZWN1cnZlXG4iICkpOwotCi0gICAgICAgICAgd2hpbGUgKCBpbmRleCArIDYgPCBjb3VudCApCi0gICAgICAgICAgewotICAgICAgICAgICAgY3VyWCArPSBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaW5kZXggKyAwICk7Ci0gICAgICAgICAgICBjdXJZICs9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpbmRleCArIDEgKTsKLQotICAgICAgICAgICAgY2YyX2dseXBocGF0aF9saW5lVG8oICZnbHlwaFBhdGgsIGN1clgsIGN1clkgKTsKLSAgICAgICAgICAgIGluZGV4ICs9IDI7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgd2hpbGUgKCBpbmRleCA8IGNvdW50ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDRjJfRml4ZWQgIHgxID0gY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGluZGV4ICsgMCApICsgY3VyWDsKLSAgICAgICAgICAgIENGMl9GaXhlZCAgeTEgPSBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaW5kZXggKyAxICkgKyBjdXJZOwotICAgICAgICAgICAgQ0YyX0ZpeGVkICB4MiA9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpbmRleCArIDIgKSArIHgxOwotICAgICAgICAgICAgQ0YyX0ZpeGVkICB5MiA9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpbmRleCArIDMgKSArIHkxOwotICAgICAgICAgICAgQ0YyX0ZpeGVkICB4MyA9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpbmRleCArIDQgKSArIHgyOwotICAgICAgICAgICAgQ0YyX0ZpeGVkICB5MyA9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpbmRleCArIDUgKSArIHkyOwotCi0KLSAgICAgICAgICAgIGNmMl9nbHlwaHBhdGhfY3VydmVUbyggJmdseXBoUGF0aCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MyApOwotCi0gICAgICAgICAgICBjdXJYICAgPSB4MzsKLSAgICAgICAgICAgIGN1clkgICA9IHkzOwotICAgICAgICAgICAgaW5kZXggKz0gNjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBjZjJfc3RhY2tfY2xlYXIoIG9wU3RhY2sgKTsKLSAgICAgICAgfQotICAgICAgICBjb250aW51ZTsgLyogbm8gbmVlZCB0byBjbGVhciBzdGFjayBhZ2FpbiAqLwotCi0gICAgICBjYXNlIGNmMl9jbWRWVkNVUlZFVE86Ci0gICAgICAgIHsKLSAgICAgICAgICBDRjJfVUludCAgY291bnQsIGNvdW50MSA9IGNmMl9zdGFja19jb3VudCggb3BTdGFjayApOwotICAgICAgICAgIENGMl9VSW50ICBpbmRleCA9IDA7Ci0KLQotICAgICAgICAgIC8qIGlmIGBjZjJfc3RhY2tfY291bnQnIGlzbid0IG9mIHRoZSBmb3JtIDRuIG9yIDRuKzEsICovCi0gICAgICAgICAgLyogd2UgZW5mb3JjZSBpdCBieSBjbGVhcmluZyB0aGUgc2Vjb25kIGJpdCAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAoYW5kIHNvcnRpbmcgdGhlIHN0YWNrIGluZGV4aW5nIHRvIHN1aXQpICAgICAgICAgICAqLwotICAgICAgICAgIGNvdW50ICA9IGNvdW50MSAmIH4yVTsKLSAgICAgICAgICBpbmRleCArPSBjb3VudDEgLSBjb3VudDsKLQotICAgICAgICAgIEZUX1RSQUNFNCgoICIgdnZjdXJ2ZXRvXG4iICkpOwotCi0gICAgICAgICAgd2hpbGUgKCBpbmRleCA8IGNvdW50ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDRjJfRml4ZWQgIHgxLCB5MSwgeDIsIHkyLCB4MywgeTM7Ci0KLQotICAgICAgICAgICAgaWYgKCAoIGNvdW50IC0gaW5kZXggKSAmIDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4MSA9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpbmRleCApICsgY3VyWDsKLQotICAgICAgICAgICAgICArK2luZGV4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB4MSA9IGN1clg7Ci0KLSAgICAgICAgICAgIHkxID0gY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGluZGV4ICsgMCApICsgY3VyWTsKLSAgICAgICAgICAgIHgyID0gY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGluZGV4ICsgMSApICsgeDE7Ci0gICAgICAgICAgICB5MiA9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpbmRleCArIDIgKSArIHkxOwotICAgICAgICAgICAgeDMgPSB4MjsKLSAgICAgICAgICAgIHkzID0gY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGluZGV4ICsgMyApICsgeTI7Ci0KLSAgICAgICAgICAgIGNmMl9nbHlwaHBhdGhfY3VydmVUbyggJmdseXBoUGF0aCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MyApOwotCi0gICAgICAgICAgICBjdXJYICAgPSB4MzsKLSAgICAgICAgICAgIGN1clkgICA9IHkzOwotICAgICAgICAgICAgaW5kZXggKz0gNDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBjZjJfc3RhY2tfY2xlYXIoIG9wU3RhY2sgKTsKLSAgICAgICAgfQotICAgICAgICBjb250aW51ZTsgLyogbm8gbmVlZCB0byBjbGVhciBzdGFjayBhZ2FpbiAqLwotCi0gICAgICBjYXNlIGNmMl9jbWRISENVUlZFVE86Ci0gICAgICAgIHsKLSAgICAgICAgICBDRjJfVUludCAgY291bnQsIGNvdW50MSA9IGNmMl9zdGFja19jb3VudCggb3BTdGFjayApOwotICAgICAgICAgIENGMl9VSW50ICBpbmRleCA9IDA7Ci0KLQotICAgICAgICAgIC8qIGlmIGBjZjJfc3RhY2tfY291bnQnIGlzbid0IG9mIHRoZSBmb3JtIDRuIG9yIDRuKzEsICovCi0gICAgICAgICAgLyogd2UgZW5mb3JjZSBpdCBieSBjbGVhcmluZyB0aGUgc2Vjb25kIGJpdCAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAoYW5kIHNvcnRpbmcgdGhlIHN0YWNrIGluZGV4aW5nIHRvIHN1aXQpICAgICAgICAgICAqLwotICAgICAgICAgIGNvdW50ICA9IGNvdW50MSAmIH4yVTsKLSAgICAgICAgICBpbmRleCArPSBjb3VudDEgLSBjb3VudDsKLQotICAgICAgICAgIEZUX1RSQUNFNCgoICIgaGhjdXJ2ZXRvXG4iICkpOwotCi0gICAgICAgICAgd2hpbGUgKCBpbmRleCA8IGNvdW50ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDRjJfRml4ZWQgIHgxLCB5MSwgeDIsIHkyLCB4MywgeTM7Ci0KLQotICAgICAgICAgICAgaWYgKCAoIGNvdW50IC0gaW5kZXggKSAmIDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB5MSA9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpbmRleCApICsgY3VyWTsKLQotICAgICAgICAgICAgICArK2luZGV4OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB5MSA9IGN1clk7Ci0KLSAgICAgICAgICAgIHgxID0gY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGluZGV4ICsgMCApICsgY3VyWDsKLSAgICAgICAgICAgIHgyID0gY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGluZGV4ICsgMSApICsgeDE7Ci0gICAgICAgICAgICB5MiA9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpbmRleCArIDIgKSArIHkxOwotICAgICAgICAgICAgeDMgPSBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaW5kZXggKyAzICkgKyB4MjsKLSAgICAgICAgICAgIHkzID0geTI7Ci0KLSAgICAgICAgICAgIGNmMl9nbHlwaHBhdGhfY3VydmVUbyggJmdseXBoUGF0aCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MyApOwotCi0gICAgICAgICAgICBjdXJYICAgPSB4MzsKLSAgICAgICAgICAgIGN1clkgICA9IHkzOwotICAgICAgICAgICAgaW5kZXggKz0gNDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBjZjJfc3RhY2tfY2xlYXIoIG9wU3RhY2sgKTsKLSAgICAgICAgfQotICAgICAgICBjb250aW51ZTsgLyogbm8gbmVlZCB0byBjbGVhciBzdGFjayBhZ2FpbiAqLwotCi0gICAgICBjYXNlIGNmMl9jbWRWSENVUlZFVE86Ci0gICAgICBjYXNlIGNmMl9jbWRIVkNVUlZFVE86Ci0gICAgICAgIHsKLSAgICAgICAgICBDRjJfVUludCAgY291bnQsIGNvdW50MSA9IGNmMl9zdGFja19jb3VudCggb3BTdGFjayApOwotICAgICAgICAgIENGMl9VSW50ICBpbmRleCA9IDA7Ci0KLSAgICAgICAgICBGVF9Cb29sICBhbHRlcm5hdGUgPSBvcDEgPT0gY2YyX2NtZEhWQ1VSVkVUTzsKLQotCi0gICAgICAgICAgLyogaWYgYGNmMl9zdGFja19jb3VudCcgaXNuJ3Qgb2YgdGhlIGZvcm0gOG4sIDhuKzEsICovCi0gICAgICAgICAgLyogOG4rNCwgb3IgOG4rNSwgd2UgZW5mb3JjZSBpdCBieSBjbGVhcmluZyB0aGUgICAgICovCi0gICAgICAgICAgLyogc2Vjb25kIGJpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogKGFuZCBzb3J0aW5nIHRoZSBzdGFjayBpbmRleGluZyB0byBzdWl0KSAgICAgICAgICovCi0gICAgICAgICAgY291bnQgID0gY291bnQxICYgfjJVOwotICAgICAgICAgIGluZGV4ICs9IGNvdW50MSAtIGNvdW50OwotCi0gICAgICAgICAgRlRfVFJBQ0U0KCggYWx0ZXJuYXRlID8gIiBodmN1cnZldG9cbiIgOiAiIHZoY3VydmV0b1xuIiApKTsKLQotICAgICAgICAgIHdoaWxlICggaW5kZXggPCBjb3VudCApCi0gICAgICAgICAgewotICAgICAgICAgICAgQ0YyX0ZpeGVkIHgxLCB4MiwgeDMsIHkxLCB5MiwgeTM7Ci0KLQotICAgICAgICAgICAgaWYgKCBhbHRlcm5hdGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4MSA9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpbmRleCArIDAgKSArIGN1clg7Ci0gICAgICAgICAgICAgIHkxID0gY3VyWTsKLSAgICAgICAgICAgICAgeDIgPSBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaW5kZXggKyAxICkgKyB4MTsKLSAgICAgICAgICAgICAgeTIgPSBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaW5kZXggKyAyICkgKyB5MTsKLSAgICAgICAgICAgICAgeTMgPSBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaW5kZXggKyAzICkgKyB5MjsKLQotICAgICAgICAgICAgICBpZiAoIGNvdW50IC0gaW5kZXggPT0gNSApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB4MyA9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpbmRleCArIDQgKSArIHgyOwotCi0gICAgICAgICAgICAgICAgKytpbmRleDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgeDMgPSB4MjsKLQotICAgICAgICAgICAgICBhbHRlcm5hdGUgPSBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgeDEgPSBjdXJYOwotICAgICAgICAgICAgICB5MSA9IGNmMl9zdGFja19nZXRSZWFsKCBvcFN0YWNrLCBpbmRleCArIDAgKSArIGN1clk7Ci0gICAgICAgICAgICAgIHgyID0gY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGluZGV4ICsgMSApICsgeDE7Ci0gICAgICAgICAgICAgIHkyID0gY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGluZGV4ICsgMiApICsgeTE7Ci0gICAgICAgICAgICAgIHgzID0gY2YyX3N0YWNrX2dldFJlYWwoIG9wU3RhY2ssIGluZGV4ICsgMyApICsgeDI7Ci0KLSAgICAgICAgICAgICAgaWYgKCBjb3VudCAtIGluZGV4ID09IDUgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeTMgPSBjZjJfc3RhY2tfZ2V0UmVhbCggb3BTdGFjaywgaW5kZXggKyA0ICkgKyB5MjsKLQotICAgICAgICAgICAgICAgICsraW5kZXg7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHkzID0geTI7Ci0KLSAgICAgICAgICAgICAgYWx0ZXJuYXRlID0gVFJVRTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2YyX2dseXBocGF0aF9jdXJ2ZVRvKCAmZ2x5cGhQYXRoLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzICk7Ci0KLSAgICAgICAgICAgIGN1clggICA9IHgzOwotICAgICAgICAgICAgY3VyWSAgID0geTM7Ci0gICAgICAgICAgICBpbmRleCArPSA0OwotICAgICAgICAgIH0KLQotICAgICAgICAgIGNmMl9zdGFja19jbGVhciggb3BTdGFjayApOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRpbnVlOyAgICAgLyogbm8gbmVlZCB0byBjbGVhciBzdGFjayBhZ2FpbiAqLwotCi0gICAgICBjYXNlIGNmMl9jbWRFWFRFTkRFRE5NQlI6Ci0gICAgICAgIHsKLSAgICAgICAgICBDRjJfSW50ICB2OwotCi0KLSAgICAgICAgICB2ID0gKEZUX1Nob3J0KSggKCBjZjJfYnVmX3JlYWRCeXRlKCBjaGFyc3RyaW5nICkgPDwgOCApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZjJfYnVmX3JlYWRCeXRlKCBjaGFyc3RyaW5nICkgICAgICAgICk7Ci0KLSAgICAgICAgICBGVF9UUkFDRTQoKCAiICVkIiwgdiApKTsKLQotICAgICAgICAgIGNmMl9zdGFja19wdXNoSW50KCBvcFN0YWNrLCB2ICk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8qIG51bWJlcnMgKi8KLSAgICAgICAgewotICAgICAgICAgIGlmICggLyogb3AxID49IDMyICYmICovIG9wMSA8PSAyNDYgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENGMl9JbnQgIHY7Ci0KLQotICAgICAgICAgICAgdiA9IG9wMSAtIDEzOTsKLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiAlZCIsIHYgKSk7Ci0KLSAgICAgICAgICAgIC8qIC0xMDcgLi4gMTA3ICovCi0gICAgICAgICAgICBjZjJfc3RhY2tfcHVzaEludCggb3BTdGFjaywgdiApOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGVsc2UgaWYgKCAvKiBvcDEgPj0gMjQ3ICYmICovIG9wMSA8PSAyNTAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENGMl9JbnQgIHY7Ci0KLQotICAgICAgICAgICAgdiAgPSBvcDE7Ci0gICAgICAgICAgICB2IC09IDI0NzsKLSAgICAgICAgICAgIHYgKj0gMjU2OwotICAgICAgICAgICAgdiArPSBjZjJfYnVmX3JlYWRCeXRlKCBjaGFyc3RyaW5nICk7Ci0gICAgICAgICAgICB2ICs9IDEwODsKLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiAlZCIsIHYgKSk7Ci0KLSAgICAgICAgICAgIC8qIDEwOCAuLiAxMTMxICovCi0gICAgICAgICAgICBjZjJfc3RhY2tfcHVzaEludCggb3BTdGFjaywgdiApOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGVsc2UgaWYgKCAvKiBvcDEgPj0gMjUxICYmICovIG9wMSA8PSAyNTQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENGMl9JbnQgIHY7Ci0KLQotICAgICAgICAgICAgdiAgPSBvcDE7Ci0gICAgICAgICAgICB2IC09IDI1MTsKLSAgICAgICAgICAgIHYgKj0gMjU2OwotICAgICAgICAgICAgdiArPSBjZjJfYnVmX3JlYWRCeXRlKCBjaGFyc3RyaW5nICk7Ci0gICAgICAgICAgICB2ICA9IC12IC0gMTA4OwotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiICVkIiwgdiApKTsKLQotICAgICAgICAgICAgLyogLTExMzEgLi4gLTEwOCAqLwotICAgICAgICAgICAgY2YyX3N0YWNrX3B1c2hJbnQoIG9wU3RhY2ssIHYgKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBlbHNlIC8qIG9wMSA9PSAyNTUgKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDRjJfRml4ZWQgIHY7Ci0KLQotICAgICAgICAgICAgdiA9IChDRjJfRml4ZWQpCi0gICAgICAgICAgICAgICAgICAoICggKEZUX1VJbnQzMiljZjJfYnVmX3JlYWRCeXRlKCBjaGFyc3RyaW5nICkgPDwgMjQgKSB8Ci0gICAgICAgICAgICAgICAgICAgICggKEZUX1VJbnQzMiljZjJfYnVmX3JlYWRCeXRlKCBjaGFyc3RyaW5nICkgPDwgMTYgKSB8Ci0gICAgICAgICAgICAgICAgICAgICggKEZUX1VJbnQzMiljZjJfYnVmX3JlYWRCeXRlKCBjaGFyc3RyaW5nICkgPDwgIDggKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQzMiljZjJfYnVmX3JlYWRCeXRlKCBjaGFyc3RyaW5nICkgICAgICAgICApOwotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiICUuMmYiLCB2IC8gNjU1MzYuMCApKTsKLQotICAgICAgICAgICAgY2YyX3N0YWNrX3B1c2hGaXhlZCggb3BTdGFjaywgdiApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjb250aW51ZTsgICAvKiBkb24ndCBjbGVhciBzdGFjayAqLwotCi0gICAgICB9IC8qIGVuZCBvZiBzd2l0Y2ggc3RhdGVtZW50IGNoZWNraW5nIGBvcDEnICovCi0KLSAgICAgIGNmMl9zdGFja19jbGVhciggb3BTdGFjayApOwotCi0gICAgfSAvKiBlbmQgb2YgbWFpbiBpbnRlcnByZXRlciBsb29wICovCi0KLSAgICAvKiB3ZSBnZXQgaGVyZSBpZiB0aGUgY2hhcnN0cmluZyBlbmRzIHdpdGhvdXQgY2YyX2NtZEVORENIQVIgKi8KLSAgICBGVF9UUkFDRTQoKCAiY2YyX2ludGVycFQyQ2hhclN0cmluZzoiCi0gICAgICAgICAgICAgICAgIiAgY2hhcnN0cmluZyBlbmRzIHdpdGhvdXQgRU5EQ0hBUlxuIiApKTsKLQotICBleGl0OgotICAgIC8qIGNoZWNrIHdoZXRoZXIgbGFzdCBlcnJvciBzZWVuIGlzIGFsc28gdGhlIGZpcnN0IG9uZSAqLwotICAgIGNmMl9zZXRFcnJvciggZXJyb3IsIGxhc3RFcnJvciApOwotCi0gICAgLyogZnJlZSByZXNvdXJjZXMgZnJvbSBvYmplY3RzIHdlJ3ZlIHVzZWQgKi8KLSAgICBjZjJfZ2x5cGhwYXRoX2ZpbmFsaXplKCAmZ2x5cGhQYXRoICk7Ci0gICAgY2YyX2FycnN0YWNrX2ZpbmFsaXplKCAmdlN0ZW1IaW50QXJyYXkgKTsKLSAgICBjZjJfYXJyc3RhY2tfZmluYWxpemUoICZoU3RlbUhpbnRBcnJheSApOwotICAgIGNmMl9hcnJzdGFja19maW5hbGl6ZSggJnN1YnJTdGFjayApOwotICAgIGNmMl9zdGFja19mcmVlKCBvcFN0YWNrICk7Ci0KLSAgICBGVF9UUkFDRTQoKCAiXG4iICkpOwotCi0gICAgcmV0dXJuOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmludHJwLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMmludHJwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZDg5NDcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJpbnRycC5oCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2YyZm9udC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFkb2JlJ3MgQ0ZGIEludGVycHJldGVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA3LTIwMTMgQWRvYmUgU3lzdGVtcyBJbmNvcnBvcmF0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBzb2Z0d2FyZSwgYW5kIGFsbCB3b3JrcyBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIHNvdXJjZSBvciAgICAgICAqLwotLyogIG9iamVjdCBjb2RlIGZvcm0gYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb3B5cmlnaHQgbm90aWNlKHMpIGluY2x1ZGVkICAgICAgKi8KLS8qICBoZXJlaW4gKGNvbGxlY3RpdmVseSwgdGhlICJXb3JrIikgaXMgbWFkZSBhdmFpbGFibGUsIGFuZCBtYXkgb25seSBiZSAgICovCi0vKiAgdXNlZCwgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCAgICAqLwotLyogIExJQ0VOU0UuVFhULiAgQWRkaXRpb25hbGx5LCBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsIGVhY2ggY29udHJpYnV0b3IgdG8gdGhlIFdvcmsgaGVyZWJ5IGdyYW50cyAgICovCi0vKiAgdG8gYW55IGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5IGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSAgICAqLwotLyogIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYW5kIHRoaXMgc2VjdGlvbiAoaGVyZWFmdGVyLCAiWW91IiBvciAgICAgKi8KLS8qICAiWW91ciIpIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgICAgICAgICAgICAgICovCi0vKiAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCAgICAqLwotLyogIGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLCB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kICAgICAgKi8KLS8qICBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgICovCi0vKiAgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IHN1Y2ggY29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgICAgICAqLwotLyogIGluZnJpbmdlZCBieSB0aGVpciBjb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgICAgKi8KLS8qICBjb250cmlidXRpb24ocykgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIGNvbnRyaWJ1dGlvbihzKSB3YXMgICAgICAgICovCi0vKiAgc3VibWl0dGVkLiAgSWYgWW91IGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgICAgICAqLwotLyogIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0ICAgKi8KLS8qICB0aGUgV29yayBvciBhIGNvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzICAgICovCi0vKiAgZGlyZWN0IG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMgICAqLwotLyogIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiAgKi8KLS8qICB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5IHVzaW5nLCBtb2RpZnlpbmcsIG9yIGRpc3RyaWJ1dGluZyB0aGUgV29yayB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgICAgKi8KLS8qICBoYXZlIHJlYWQgYW5kIHVuZGVyc3Rvb2QgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAgICAgICAgICAgICAgICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFzIHdlbGwgYXMgdGhvc2UgcHJvdmlkZWQgaW4gdGhpcyBzZWN0aW9uLCAgICAqLwotLyogIGFuZCB5b3UgYWNjZXB0IHRoZW0gZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19DRjJJTlRSUF9IX18KLSNkZWZpbmUgX19DRjJJTlRSUF9IX18KLQotCi0jaW5jbHVkZSAiY2YyZnQuaCIKLSNpbmNsdWRlICJjZjJoaW50cy5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZjJfaGludG1hc2tfaW5pdCggQ0YyX0hpbnRNYXNrICBoaW50bWFzaywKLSAgICAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgICAgZXJyb3IgKTsKLSAgRlRfTE9DQUwoIEZUX0Jvb2wgKQotICBjZjJfaGludG1hc2tfaXNWYWxpZCggY29uc3QgQ0YyX0hpbnRNYXNrICBoaW50bWFzayApOwotICBGVF9MT0NBTCggRlRfQm9vbCApCi0gIGNmMl9oaW50bWFza19pc05ldyggY29uc3QgQ0YyX0hpbnRNYXNrICBoaW50bWFzayApOwotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9oaW50bWFza19zZXROZXcoIENGMl9IaW50TWFzayAgaGludG1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgdmFsICk7Ci0gIEZUX0xPQ0FMKCBGVF9CeXRlKiApCi0gIGNmMl9oaW50bWFza19nZXRNYXNrUHRyKCBDRjJfSGludE1hc2sgIGhpbnRtYXNrICk7Ci0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX2hpbnRtYXNrX3NldEFsbCggQ0YyX0hpbnRNYXNrICBoaW50bWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgICBiaXRDb3VudCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX2ludGVycFQyQ2hhclN0cmluZyggQ0YyX0ZvbnQgICAgICAgICAgICAgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9CdWZmZXIgICAgICAgICAgICBjaGFyc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfT3V0bGluZUNhbGxiYWNrcyAgY2FsbGJhY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICAgICAgdHJhbnNsYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgICAgICAgICBkb2luZ1NlYWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgICAgICAgICAgICBjdXJYLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRjJfRml4ZWQgICAgICAgICAgICAgY3VyWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkKiAgICAgICAgICAgIHdpZHRoICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX0NGMklOVFJQX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJyZWFkLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMnJlYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI0MjllMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMnJlYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZjJyZWFkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBzdHJlYW0gaGFuZGxpbmcgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgImNmMmZ0LmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLSNpbmNsdWRlICJjZjJnbHVlLmgiCi0KLSNpbmNsdWRlICJjZjJlcnJvci5oIgotCi0KLSAgLyogRGVmaW5lIENGMl9JT19GQUlMIGFzIDEgdG8gZW5hYmxlIHJhbmRvbSBlcnJvcnMgYW5kIHJhbmRvbSAqLwotICAvKiB2YWx1ZSBlcnJvcnMgaW4gSS9PLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIENGMl9JT19GQUlMICAwCi0KLQotI2lmIENGMl9JT19GQUlMCi0KLSAgLyogc2V0IHRoZSAuMDAgdmFsdWUgdG8gYSBub256ZXJvIHByb2JhYmlsaXR5ICovCi0gIHN0YXRpYyBpbnQKLSAgcmFuZG9tRXJyb3IyKCB2b2lkICkKLSAgewotICAgIC8qIGZvciByZWdpb24gYnVmZmVyIFJlYWRCeXRlIChpbnRlcnApIGZ1bmN0aW9uICovCi0gICAgcmV0dXJuIChkb3VibGUpcmFuZCgpIC8gUkFORF9NQVggPCAuMDA7Ci0gIH0KLQotICAvKiBzZXQgdGhlIC4wMCB2YWx1ZSB0byBhIG5vbnplcm8gcHJvYmFiaWxpdHkgKi8KLSAgc3RhdGljIENGMl9JbnQKLSAgcmFuZG9tVmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIChkb3VibGUpcmFuZCgpIC8gUkFORF9NQVggPCAuMDAgPyByYW5kKCkgOiAwOwotICB9Ci0KLSNlbmRpZiAvKiBDRjJfSU9fRkFJTCAqLwotCi0KLSAgLyogUmVnaW9uIEJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ2FuIGJlIGNvbnN0cnVjdGVkIGZyb20gYSBjb3BpZWQgYnVmZmVyIG1hbmFnZWQgYnkgKi8KLSAgLyogYEZDTV9nZXREYXRhYmxvY2snLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUmVhZHMgYnl0ZXMgd2l0aCBjaGVjayBmb3IgZW5kIG9mIGJ1ZmZlci4gICAgICAgICAgKi8KLQotICAvKiByZWFkaW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHNldHMgZXJyb3IgYW5kIHJldHVybnMgemVybyAqLwotICBGVF9MT0NBTF9ERUYoIENGMl9JbnQgKQotICBjZjJfYnVmX3JlYWRCeXRlKCBDRjJfQnVmZmVyICBidWYgKQotICB7Ci0gICAgaWYgKCBidWYtPnB0ciA8IGJ1Zi0+ZW5kICkKLSAgICB7Ci0jaWYgQ0YyX0lPX0ZBSUwKLSAgICAgIGlmICggcmFuZG9tRXJyb3IyKCkgKQotICAgICAgewotICAgICAgICBDRjJfU0VUX0VSUk9SKCBidWYtPmVycm9yLCBJbnZhbGlkX1N0cmVhbV9PcGVyYXRpb24gKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiAqKGJ1Zi0+cHRyKSsrICsgcmFuZG9tVmFsdWUoKTsKLSNlbHNlCi0gICAgICByZXR1cm4gKihidWYtPnB0cikrKzsKLSNlbmRpZgotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgQ0YyX1NFVF9FUlJPUiggYnVmLT5lcnJvciwgSW52YWxpZF9TdHJlYW1fT3BlcmF0aW9uICk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIG5vdGU6IGVuZCBjb25kaXRpb24gY2FuIG9jY3VyIHdpdGhvdXQgZXJyb3IgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9Cb29sICkKLSAgY2YyX2J1Zl9pc0VuZCggQ0YyX0J1ZmZlciAgYnVmICkKLSAgewotICAgIHJldHVybiAoRlRfQm9vbCkoIGJ1Zi0+cHRyID49IGJ1Zi0+ZW5kICk7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YycmVhZC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJyZWFkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZjdjOGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJyZWFkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZjJyZWFkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBzdHJlYW0gaGFuZGxpbmcgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0NGMlJFQURfSF9fCi0jZGVmaW5lIF9fQ0YyUkVBRF9IX18KLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDRjJfQnVmZmVyUmVjXwotICB7Ci0gICAgRlRfRXJyb3IqICAgICAgIGVycm9yOwotICAgIGNvbnN0IEZUX0J5dGUqICBzdGFydDsKLSAgICBjb25zdCBGVF9CeXRlKiAgZW5kOwotICAgIGNvbnN0IEZUX0J5dGUqICBwdHI7Ci0KLSAgfSBDRjJfQnVmZmVyUmVjLCAqQ0YyX0J1ZmZlcjsKLQotCi0gIEZUX0xPQ0FMKCBDRjJfSW50ICkKLSAgY2YyX2J1Zl9yZWFkQnl0ZSggQ0YyX0J1ZmZlciAgYnVmICk7Ci0gIEZUX0xPQ0FMKCBGVF9Cb29sICkKLSAgY2YyX2J1Zl9pc0VuZCggQ0YyX0J1ZmZlciAgYnVmICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX0NGMlJFQURfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMnN0YWNrLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmMnN0YWNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMzJiNWQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJzdGFjay5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmMnN0YWNrLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBZG9iZSdzIGNvZGUgZm9yIGVtdWxhdGluZyBhIENGRiBzdGFjayAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNy0yMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IgICAgICAgKi8KLS8qICBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZCAgICAgICovCi0vKiAgaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUgICAqLwotLyogIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgICAgKi8KLS8qICBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMgICAqLwotLyogIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgICAgKi8KLS8qICB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IgICAgICovCi0vKiAgIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsICAgICAgICAgICAgICAqLwotLyogIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgICAgKi8KLS8qICBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCAgICAgICovCi0vKiAgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlICAqLwotLyogIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5ICAgICAgKi8KLS8qICBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyICAgICovCi0vKiAgY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzICAgICAgICAqLwotLyogIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5ICAgICAgKi8KLS8qICAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCAgICovCi0vKiAgdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyAgICAqLwotLyogIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzICAgKi8KLS8qICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgICovCi0vKiAgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91ICAgICovCi0vKiAgaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgICAgICAgICAgICAgICAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwgICAgKi8KLS8qICBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAiY2YyZnQuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgImNmMmdsdWUuaCIKLSNpbmNsdWRlICJjZjJmb250LmgiCi0jaW5jbHVkZSAiY2Yyc3RhY2suaCIKLQotI2luY2x1ZGUgImNmMmVycm9yLmgiCi0KLQotICAvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBpbnN0YW5jZSBvZiBDRjJfU3RhY2suICAgICAgICovCi0gIC8qIE5vdGU6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBOVUxMIG9uIGVycm9yIChkb2VzIG5vdCBzZXQgKi8KLSAgLyogYGVycm9yJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIENGMl9TdGFjayApCi0gIGNmMl9zdGFja19pbml0KCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7ICAgICAvKiBmb3IgRlRfUU5FVyAqLwotCi0gICAgQ0YyX1N0YWNrICBzdGFjayA9IE5VTEw7Ci0KLQotICAgIGlmICggIUZUX1FORVcoIHN0YWNrICkgKQotICAgIHsKLSAgICAgIC8qIGluaXRpYWxpemUgdGhlIHN0cnVjdHVyZTsgRlRfUU5FVyB6ZXJvZXMgaXQgKi8KLSAgICAgIHN0YWNrLT5tZW1vcnkgPSBtZW1vcnk7Ci0gICAgICBzdGFjay0+ZXJyb3IgID0gZTsKLSAgICAgIHN0YWNrLT50b3AgICAgPSAmc3RhY2stPmJ1ZmZlclswXTsgLyogZW1wdHkgc3RhY2sgKi8KLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhY2s7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmMl9zdGFja19mcmVlKCBDRjJfU3RhY2sgIHN0YWNrICkKLSAgewotICAgIGlmICggc3RhY2sgKQotICAgIHsKLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RhY2stPm1lbW9yeTsKLQotCi0gICAgICAvKiBmcmVlIHRoZSBtYWluIHN0cnVjdHVyZSAqLwotICAgICAgRlRfRlJFRSggc3RhY2sgKTsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggQ0YyX1VJbnQgKQotICBjZjJfc3RhY2tfY291bnQoIENGMl9TdGFjayAgc3RhY2sgKQotICB7Ci0gICAgcmV0dXJuIChDRjJfVUludCkoIHN0YWNrLT50b3AgLSAmc3RhY2stPmJ1ZmZlclswXSApOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZjJfc3RhY2tfcHVzaEludCggQ0YyX1N0YWNrICBzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgIENGMl9JbnQgICAgdmFsICkKLSAgewotICAgIGlmICggc3RhY2stPnRvcCA9PSAmc3RhY2stPmJ1ZmZlcltDRjJfT1BFUkFORF9TVEFDS19TSVpFXSApCi0gICAgewotICAgICAgQ0YyX1NFVF9FUlJPUiggc3RhY2stPmVycm9yLCBTdGFja19PdmVyZmxvdyApOwotICAgICAgcmV0dXJuOyAgICAgLyogc3RhY2sgb3ZlcmZsb3cgKi8KLSAgICB9Ci0KLSAgICBzdGFjay0+dG9wLT51LmkgID0gdmFsOwotICAgIHN0YWNrLT50b3AtPnR5cGUgPSBDRjJfTnVtYmVySW50OwotICAgICsrc3RhY2stPnRvcDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX3N0YWNrX3B1c2hGaXhlZCggQ0YyX1N0YWNrICBzdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgQ0YyX0ZpeGVkICB2YWwgKQotICB7Ci0gICAgaWYgKCBzdGFjay0+dG9wID09ICZzdGFjay0+YnVmZmVyW0NGMl9PUEVSQU5EX1NUQUNLX1NJWkVdICkKLSAgICB7Ci0gICAgICBDRjJfU0VUX0VSUk9SKCBzdGFjay0+ZXJyb3IsIFN0YWNrX092ZXJmbG93ICk7Ci0gICAgICByZXR1cm47ICAgICAvKiBzdGFjayBvdmVyZmxvdyAqLwotICAgIH0KLQotICAgIHN0YWNrLT50b3AtPnUuciAgPSB2YWw7Ci0gICAgc3RhY2stPnRvcC0+dHlwZSA9IENGMl9OdW1iZXJGaXhlZDsKLSAgICArK3N0YWNrLT50b3A7Ci0gIH0KLQotCi0gIC8qIHRoaXMgZnVuY3Rpb24gaXMgb25seSBhbGxvd2VkIHRvIHBvcCBhbiBpbnRlZ2VyIHR5cGUgKi8KLSAgRlRfTE9DQUxfREVGKCBDRjJfSW50ICkKLSAgY2YyX3N0YWNrX3BvcEludCggQ0YyX1N0YWNrICBzdGFjayApCi0gIHsKLSAgICBpZiAoIHN0YWNrLT50b3AgPT0gJnN0YWNrLT5idWZmZXJbMF0gKQotICAgIHsKLSAgICAgIENGMl9TRVRfRVJST1IoIHN0YWNrLT5lcnJvciwgU3RhY2tfVW5kZXJmbG93ICk7Ci0gICAgICByZXR1cm4gMDsgICAvKiB1bmRlcmZsb3cgKi8KLSAgICB9Ci0gICAgaWYgKCBzdGFjay0+dG9wWy0xXS50eXBlICE9IENGMl9OdW1iZXJJbnQgKQotICAgIHsKLSAgICAgIENGMl9TRVRfRVJST1IoIHN0YWNrLT5lcnJvciwgU3ludGF4X0Vycm9yICk7Ci0gICAgICByZXR1cm4gMDsgICAvKiB0eXBlIG1pc21hdGNoICovCi0gICAgfQotCi0gICAgLS1zdGFjay0+dG9wOwotCi0gICAgcmV0dXJuIHN0YWNrLT50b3AtPnUuaTsKLSAgfQotCi0KLSAgLyogTm90ZTogdHlwZSBtaXNtYXRjaCBpcyBzaWxlbnRseSBjYXN0ICovCi0gIC8qIFRPRE86IGNoZWNrIHRoaXMgKi8KLSAgRlRfTE9DQUxfREVGKCBDRjJfRml4ZWQgKQotICBjZjJfc3RhY2tfcG9wRml4ZWQoIENGMl9TdGFjayAgc3RhY2sgKQotICB7Ci0gICAgaWYgKCBzdGFjay0+dG9wID09ICZzdGFjay0+YnVmZmVyWzBdICkKLSAgICB7Ci0gICAgICBDRjJfU0VUX0VSUk9SKCBzdGFjay0+ZXJyb3IsIFN0YWNrX1VuZGVyZmxvdyApOwotICAgICAgcmV0dXJuIGNmMl9pbnRUb0ZpeGVkKCAwICk7ICAgIC8qIHVuZGVyZmxvdyAqLwotICAgIH0KLQotICAgIC0tc3RhY2stPnRvcDsKLQotICAgIHN3aXRjaCAoIHN0YWNrLT50b3AtPnR5cGUgKQotICAgIHsKLSAgICBjYXNlIENGMl9OdW1iZXJJbnQ6Ci0gICAgICByZXR1cm4gY2YyX2ludFRvRml4ZWQoIHN0YWNrLT50b3AtPnUuaSApOwotICAgIGNhc2UgQ0YyX051bWJlckZyYWM6Ci0gICAgICByZXR1cm4gY2YyX2ZyYWNUb0ZpeGVkKCBzdGFjay0+dG9wLT51LmYgKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHN0YWNrLT50b3AtPnUucjsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIE5vdGU6IHR5cGUgbWlzbWF0Y2ggaXMgc2lsZW50bHkgY2FzdCAqLwotICAvKiBUT0RPOiBjaGVjayB0aGlzICovCi0gIEZUX0xPQ0FMX0RFRiggQ0YyX0ZpeGVkICkKLSAgY2YyX3N0YWNrX2dldFJlYWwoIENGMl9TdGFjayAgc3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICBDRjJfVUludCAgIGlkeCApCi0gIHsKLSAgICBGVF9BU1NFUlQoIGNmMl9zdGFja19jb3VudCggc3RhY2sgKSA8PSBDRjJfT1BFUkFORF9TVEFDS19TSVpFICk7Ci0KLSAgICBpZiAoIGlkeCA+PSBjZjJfc3RhY2tfY291bnQoIHN0YWNrICkgKQotICAgIHsKLSAgICAgIENGMl9TRVRfRVJST1IoIHN0YWNrLT5lcnJvciwgU3RhY2tfT3ZlcmZsb3cgKTsKLSAgICAgIHJldHVybiBjZjJfaW50VG9GaXhlZCggMCApOyAgICAvKiBib3VuZHMgZXJyb3IgKi8KLSAgICB9Ci0KLSAgICBzd2l0Y2ggKCBzdGFjay0+YnVmZmVyW2lkeF0udHlwZSApCi0gICAgewotICAgIGNhc2UgQ0YyX051bWJlckludDoKLSAgICAgIHJldHVybiBjZjJfaW50VG9GaXhlZCggc3RhY2stPmJ1ZmZlcltpZHhdLnUuaSApOwotICAgIGNhc2UgQ0YyX051bWJlckZyYWM6Ci0gICAgICByZXR1cm4gY2YyX2ZyYWNUb0ZpeGVkKCBzdGFjay0+YnVmZmVyW2lkeF0udS5mICk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBzdGFjay0+YnVmZmVyW2lkeF0udS5yOwotICAgIH0KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2YyX3N0YWNrX2NsZWFyKCBDRjJfU3RhY2sgIHN0YWNrICkKLSAgewotICAgIHN0YWNrLT50b3AgPSAmc3RhY2stPmJ1ZmZlclswXTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJzdGFjay5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJzdGFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDZkMTk2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2Yyc3RhY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZjJzdGFjay5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQWRvYmUncyBjb2RlIGZvciBlbXVsYXRpbmcgYSBDRkYgc3RhY2sgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDctMjAxMyBBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIHNvZnR3YXJlLCBhbmQgYWxsIHdvcmtzIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gc291cmNlIG9yICAgICAgICovCi0vKiAgb2JqZWN0IGNvZGUgZm9ybSBhcyBpbmRpY2F0ZWQgYnkgdGhlIGNvcHlyaWdodCBub3RpY2UocykgaW5jbHVkZWQgICAgICAqLwotLyogIGhlcmVpbiAoY29sbGVjdGl2ZWx5LCB0aGUgIldvcmsiKSBpcyBtYWRlIGF2YWlsYWJsZSwgYW5kIG1heSBvbmx5IGJlICAgKi8KLS8qICB1c2VkLCBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UsICAgICovCi0vKiAgTElDRU5TRS5UWFQuICBBZGRpdGlvbmFsbHksIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgZWFjaCBjb250cmlidXRvciB0byB0aGUgV29yayBoZXJlYnkgZ3JhbnRzICAgKi8KLS8qICB0byBhbnkgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5ICAgICovCi0vKiAgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhbmQgdGhpcyBzZWN0aW9uIChoZXJlYWZ0ZXIsICJZb3UiIG9yICAgICAqLwotLyogICJZb3VyIikgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCAgICAgICAgICAgICAgKi8KLS8qICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50ICAgICovCi0vKiAgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgICAgICAqLwotLyogIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSAgKi8KLS8qICBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgc3VjaCBjb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSAgICAgICovCi0vKiAgaW5mcmluZ2VkIGJ5IHRoZWlyIGNvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciAgICAqLwotLyogIGNvbnRyaWJ1dGlvbihzKSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggY29udHJpYnV0aW9uKHMpIHdhcyAgICAgICAgKi8KLS8qICBzdWJtaXR0ZWQuICBJZiBZb3UgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAgICAgICovCi0vKiAgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgICAqLwotLyogIHRoZSBXb3JrIG9yIGEgY29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgICAgKi8KLS8qICBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcyAgICovCi0vKiAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlIGFzIG9mICAqLwotLyogIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnkgdXNpbmcsIG1vZGlmeWluZywgb3IgZGlzdHJpYnV0aW5nIHRoZSBXb3JrIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSAgICAqLwotLyogIGhhdmUgcmVhZCBhbmQgdW5kZXJzdG9vZCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICAgICAgICAgICAgICAgKi8KLS8qICBGcmVlVHlwZSBQcm9qZWN0IExpY2Vuc2UgYXMgd2VsbCBhcyB0aG9zZSBwcm92aWRlZCBpbiB0aGlzIHNlY3Rpb24sICAgICovCi0vKiAgYW5kIHlvdSBhY2NlcHQgdGhlbSBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0NGMlNUQUNLX0hfXwotI2RlZmluZSBfX0NGMlNUQUNLX0hfXwotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyogQ0ZGIG9wZXJhbmQgc3RhY2s7IHNwZWNpZmllZCBtYXhpbXVtIG9mIDQ4IG9yIDE5MiB2YWx1ZXMgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGMl9TdGFja051bWJlcl8KLSAgewotICAgIHVuaW9uCi0gICAgewotICAgICAgQ0YyX0ZpeGVkICByOyAgICAgIC8qIDE2LjE2IGZpeGVkIHBvaW50ICovCi0gICAgICBDRjJfRnJhYyAgIGY7ICAgICAgLyogMi4zMCBmaXhlZCBwb2ludCAoZm9yIGZvbnQgbWF0cml4KSAqLwotICAgICAgQ0YyX0ludCAgICBpOwotICAgIH0gdTsKLQotICAgIENGMl9OdW1iZXJUeXBlICB0eXBlOwotCi0gIH0gQ0YyX1N0YWNrTnVtYmVyOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGMl9TdGFja1JlY18KLSAgewotICAgIEZUX01lbW9yeSAgICAgICAgIG1lbW9yeTsKLSAgICBGVF9FcnJvciogICAgICAgICBlcnJvcjsKLSAgICBDRjJfU3RhY2tOdW1iZXIgICBidWZmZXJbQ0YyX09QRVJBTkRfU1RBQ0tfU0laRV07Ci0gICAgQ0YyX1N0YWNrTnVtYmVyKiAgdG9wOwotCi0gIH0gQ0YyX1N0YWNrUmVjLCAqQ0YyX1N0YWNrOwotCi0KLSAgRlRfTE9DQUwoIENGMl9TdGFjayApCi0gIGNmMl9zdGFja19pbml0KCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgIEZUX0Vycm9yKiAgZXJyb3IgKTsKLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZjJfc3RhY2tfZnJlZSggQ0YyX1N0YWNrICBzdGFjayApOwotCi0gIEZUX0xPQ0FMKCBDRjJfVUludCApCi0gIGNmMl9zdGFja19jb3VudCggQ0YyX1N0YWNrICBzdGFjayApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX3N0YWNrX3B1c2hJbnQoIENGMl9TdGFjayAgc3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICBDRjJfSW50ICAgIHZhbCApOwotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmMl9zdGFja19wdXNoRml4ZWQoIENGMl9TdGFjayAgc3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgIENGMl9GaXhlZCAgdmFsICk7Ci0KLSAgRlRfTE9DQUwoIENGMl9JbnQgKQotICBjZjJfc3RhY2tfcG9wSW50KCBDRjJfU3RhY2sgIHN0YWNrICk7Ci0gIEZUX0xPQ0FMKCBDRjJfRml4ZWQgKQotICBjZjJfc3RhY2tfcG9wRml4ZWQoIENGMl9TdGFjayAgc3RhY2sgKTsKLQotICBGVF9MT0NBTCggQ0YyX0ZpeGVkICkKLSAgY2YyX3N0YWNrX2dldFJlYWwoIENGMl9TdGFjayAgc3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICBDRjJfVUludCAgIGlkeCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2YyX3N0YWNrX2NsZWFyKCBDRjJfU3RhY2sgIHN0YWNrICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX0NGMlNUQUNLX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJ0eXBlcy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZjJ0eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzZhMDIyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2YydHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmMnR5cGVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBZG9iZSdzIGNvZGUgZm9yIGRlZmluaW5nIGRhdGEgdHlwZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMS0yMDEzIEFkb2JlIFN5c3RlbXMgSW5jb3Jwb3JhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgc29mdHdhcmUsIGFuZCBhbGwgd29ya3Mgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBzb3VyY2Ugb3IgICAgICAgKi8KLS8qICBvYmplY3QgY29kZSBmb3JtIGFzIGluZGljYXRlZCBieSB0aGUgY29weXJpZ2h0IG5vdGljZShzKSBpbmNsdWRlZCAgICAgICovCi0vKiAgaGVyZWluIChjb2xsZWN0aXZlbHksIHRoZSAiV29yayIpIGlzIG1hZGUgYXZhaWxhYmxlLCBhbmQgbWF5IG9ubHkgYmUgICAqLwotLyogIHVzZWQsIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSwgICAgKi8KLS8qICBMSUNFTlNFLlRYVC4gIEFkZGl0aW9uYWxseSwgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlICovCi0vKiAgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlLCBlYWNoIGNvbnRyaWJ1dG9yIHRvIHRoZSBXb3JrIGhlcmVieSBncmFudHMgICAqLwotLyogIHRvIGFueSBpbmRpdmlkdWFsIG9yIGxlZ2FsIGVudGl0eSBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgICAgKi8KLS8qICB0aGUgRnJlZVR5cGUgUHJvamVjdCBMaWNlbnNlIGFuZCB0aGlzIHNlY3Rpb24gKGhlcmVhZnRlciwgIllvdSIgb3IgICAgICovCi0vKiAgIllvdXIiKSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsICAgICAgICAgICAgICAqLwotLyogIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgICAgKi8KLS8qICBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCAgICAgICovCi0vKiAgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlICAqLwotLyogIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBzdWNoIGNvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5ICAgICAgKi8KLS8qICBpbmZyaW5nZWQgYnkgdGhlaXIgY29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyICAgICovCi0vKiAgY29udHJpYnV0aW9uKHMpIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBjb250cmlidXRpb24ocykgd2FzICAgICAgICAqLwotLyogIHN1Ym1pdHRlZC4gIElmIFlvdSBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5ICAgICAgKi8KLS8qICAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCAgICovCi0vKiAgdGhlIFdvcmsgb3IgYSBjb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyAgICAqLwotLyogIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzICAgKi8KLS8qICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgICovCi0vKiAgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBCeSB1c2luZywgbW9kaWZ5aW5nLCBvciBkaXN0cmlidXRpbmcgdGhlIFdvcmsgeW91IGluZGljYXRlIHRoYXQgeW91ICAgICovCi0vKiAgaGF2ZSByZWFkIGFuZCB1bmRlcnN0b29kIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgICAgICAgICAgICAgICAqLwotLyogIEZyZWVUeXBlIFByb2plY3QgTGljZW5zZSBhcyB3ZWxsIGFzIHRob3NlIHByb3ZpZGVkIGluIHRoaXMgc2VjdGlvbiwgICAgKi8KLS8qICBhbmQgeW91IGFjY2VwdCB0aGVtIGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fQ0YyVFlQRVNfSF9fCi0jZGVmaW5lIF9fQ0YyVFlQRVNfSF9fCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoKLSAgICogVGhlIGRhdGEgbW9kZWxzIHRoYXQgd2UgZXhwZWN0IHRvIHN1cHBvcnQgYXJlIGFzIGZvbGxvd3M6Ci0gICAqCi0gICAqICAgbmFtZSAgY2hhciBzaG9ydCBpbnQgbG9uZyBsb25nLWxvbmcgcG9pbnRlciBleGFtcGxlCi0gICAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgKiAgIElMUDMyICA4ICAgIDE2ICAgIDMyICAzMiAgICAgNjQqICAgICAgMzIgICAgMzItYml0IE1hY09TLCB4ODYKLSAgICogICBMTFA2NCAgOCAgICAxNiAgICAzMiAgMzIgICAgIDY0ICAgICAgIDY0ICAgIHg2NAotICAgKiAgIExQNjQgICA4ICAgIDE2ICAgIDMyICA2NCAgICAgNjQgICAgICAgNjQgICAgNjQtYml0IE1hY09TCi0gICAqCi0gICAqICAgICopIHR5cGUgbWF5IGJlIHN1cHBvcnRlZCBieSBlbXVsYXRpb24gb24gYSAzMi1iaXQgYXJjaGl0ZWN0dXJlCi0gICAqCi0gICAqLwotCi0KLSAgLyogaW50ZWdlcnMgYXQgbGVhc3QgMzIgYml0cyB3aWRlICovCi0jZGVmaW5lIENGMl9VSW50ICBGVF9VRmFzdAotI2RlZmluZSBDRjJfSW50ICAgRlRfRmFzdAotCi0KLSAgLyogZml4ZWQtZmxvYXQgbnVtYmVycyAqLwotICB0eXBlZGVmIEZUX0ludDMyICBDRjJfRjE2RG90MTY7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX0NGMlRZUEVTX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmYuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMmNmYjUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBPcGVuVHlwZSBkcml2ZXIgY29tcG9uZW50IChib2R5IG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotCi0jaW5jbHVkZSAiY2ZmcGljLmMiCi0jaW5jbHVkZSAiY2ZmZHJpdnIuYyIKLSNpbmNsdWRlICJjZmZwYXJzZS5jIgotI2luY2x1ZGUgImNmZmxvYWQuYyIKLSNpbmNsdWRlICJjZmZvYmpzLmMiCi0jaW5jbHVkZSAiY2ZmZ2xvYWQuYyIKLSNpbmNsdWRlICJjZmZjbWFwLmMiCi0KLSNpbmNsdWRlICJjZjJhcnJzdC5jIgotI2luY2x1ZGUgImNmMmJsdWVzLmMiCi0jaW5jbHVkZSAiY2YyZXJyb3IuYyIKLSNpbmNsdWRlICJjZjJmb250LmMiCi0jaW5jbHVkZSAiY2YyZnQuYyIKLSNpbmNsdWRlICJjZjJoaW50cy5jIgotI2luY2x1ZGUgImNmMmludHJwLmMiCi0jaW5jbHVkZSAiY2YycmVhZC5jIgotI2luY2x1ZGUgImNmMnN0YWNrLmMiCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZjbWFwLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZmNtYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1MzhlOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZmNtYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZjbWFwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ0ZGIGNoYXJhY3RlciBtYXBwaW5nIHRhYmxlIChjbWFwKSBzdXBwb3J0IChib2R5KS4gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgImNmZmNtYXAuaCIKLSNpbmNsdWRlICJjZmZsb2FkLmgiCi0KLSNpbmNsdWRlICJjZmZlcnJzLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgIENGRiBTVEFOREFSRCAoQU5EIEVYUEVSVCkgRU5DT0RJTkcgQ01BUFMgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgY2ZmX2NtYXBfZW5jb2RpbmdfaW5pdCggQ0ZGX0NNYXBTdGQgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICBwb2ludGVyICkKLSAgewotICAgIFRUX0ZhY2UgICAgICAgZmFjZSAgICAgPSAoVFRfRmFjZSlGVF9DTUFQX0ZBQ0UoIGNtYXAgKTsKLSAgICBDRkZfRm9udCAgICAgIGNmZiAgICAgID0gKENGRl9Gb250KWZhY2UtPmV4dHJhLmRhdGE7Ci0gICAgQ0ZGX0VuY29kaW5nICBlbmNvZGluZyA9ICZjZmYtPmVuY29kaW5nOwotCi0gICAgRlRfVU5VU0VEKCBwb2ludGVyICk7Ci0KLQotICAgIGNtYXAtPmdpZHMgID0gZW5jb2RpbmctPmNvZGVzOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIGNmZl9jbWFwX2VuY29kaW5nX2RvbmUoIENGRl9DTWFwU3RkICBjbWFwICkKLSAgewotICAgIGNtYXAtPmdpZHMgID0gTlVMTDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgY2ZmX2NtYXBfZW5jb2RpbmdfY2hhcl9pbmRleCggQ0ZGX0NNYXBTdGQgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgICBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfVUludCAgcmVzdWx0ID0gMDsKLQotCi0gICAgaWYgKCBjaGFyX2NvZGUgPCAyNTYgKQotICAgICAgcmVzdWx0ID0gY21hcC0+Z2lkc1tjaGFyX2NvZGVdOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50MzIgKQotICBjZmZfY21hcF9lbmNvZGluZ19jaGFyX25leHQoIENGRl9DTWFwU3RkICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICAgKnBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfVUludCAgICByZXN1bHQgICAgPSAwOwotICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlID0gKnBjaGFyX2NvZGU7Ci0KLQotICAgICpwY2hhcl9jb2RlID0gMDsKLQotICAgIGlmICggY2hhcl9jb2RlIDwgMjU1ICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBjb2RlID0gKEZUX1VJbnQpKGNoYXJfY29kZSArIDEpOwotCi0KLSAgICAgIGZvciAoOzspCi0gICAgICB7Ci0gICAgICAgIGlmICggY29kZSA+PSAyNTYgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIHJlc3VsdCA9IGNtYXAtPmdpZHNbY29kZV07Ci0gICAgICAgIGlmICggcmVzdWx0ICE9IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgKnBjaGFyX2NvZGUgPSBjb2RlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY29kZSsrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBGVF9ERUZJTkVfQ01BUF9DTEFTUyhjZmZfY21hcF9lbmNvZGluZ19jbGFzc19yZWMsCi0gICAgc2l6ZW9mICggQ0ZGX0NNYXBTdGRSZWMgKSwKLQotICAgIChGVF9DTWFwX0luaXRGdW5jKSAgICAgY2ZmX2NtYXBfZW5jb2RpbmdfaW5pdCwKLSAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIGNmZl9jbWFwX2VuY29kaW5nX2RvbmUsCi0gICAgKEZUX0NNYXBfQ2hhckluZGV4RnVuYyljZmZfY21hcF9lbmNvZGluZ19jaGFyX2luZGV4LAotICAgIChGVF9DTWFwX0NoYXJOZXh0RnVuYykgY2ZmX2NtYXBfZW5jb2RpbmdfY2hhcl9uZXh0LAotCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAotICApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgIENGRiBTWU5USEVUSUMgVU5JQ09ERSBFTkNPRElORyBDTUFQICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBGVF9DQUxMQkFDS19ERUYoIGNvbnN0IGNoYXIqICkKLSAgY2ZmX3NpZF90b19nbHlwaF9uYW1lKCBUVF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIGlkeCApCi0gIHsKLSAgICBDRkZfRm9udCAgICAgY2ZmICAgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotICAgIENGRl9DaGFyc2V0ICBjaGFyc2V0ID0gJmNmZi0+Y2hhcnNldDsKLSAgICBGVF9VSW50ICAgICAgc2lkICAgICA9IGNoYXJzZXQtPnNpZHNbaWR4XTsKLQotCi0gICAgcmV0dXJuIGNmZl9pbmRleF9nZXRfc2lkX3N0cmluZyggY2ZmLCBzaWQgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIGNmZl9jbWFwX3VuaWNvZGVfaW5pdCggUFNfVW5pY29kZXMgIHVuaWNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICBwb2ludGVyICkKLSAgewotICAgIFRUX0ZhY2UgICAgICAgICAgICAgZmFjZSAgICA9IChUVF9GYWNlKUZUX0NNQVBfRkFDRSggdW5pY29kZXMgKTsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSAgPSBGVF9GQUNFX01FTU9SWSggZmFjZSApOwotICAgIENGRl9Gb250ICAgICAgICAgICAgY2ZmICAgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotICAgIENGRl9DaGFyc2V0ICAgICAgICAgY2hhcnNldCA9ICZjZmYtPmNoYXJzZXQ7Ci0gICAgRlRfU2VydmljZV9Qc0NNYXBzICBwc25hbWVzID0gKEZUX1NlcnZpY2VfUHNDTWFwcyljZmYtPnBzbmFtZXM7Ci0KLSAgICBGVF9VTlVTRUQoIHBvaW50ZXIgKTsKLQotCi0gICAgLyogY2FuJ3QgYnVpbGQgVW5pY29kZSBtYXAgZm9yIENJRC1rZXllZCBmb250ICovCi0gICAgLyogYmVjYXVzZSB3ZSBkb24ndCBrbm93IGdseXBoIG5hbWVzLiAgICAgICAgICovCi0gICAgaWYgKCAhY2hhcnNldC0+c2lkcyApCi0gICAgICByZXR1cm4gRlRfVEhST1coIE5vX1VuaWNvZGVfR2x5cGhfTmFtZSApOwotCi0gICAgcmV0dXJuIHBzbmFtZXMtPnVuaWNvZGVzX2luaXQoIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZi0+bnVtX2dseXBocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBTX0dldEdseXBoTmFtZUZ1bmMpJmNmZl9zaWRfdG9fZ2x5cGhfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBTX0ZyZWVHbHlwaE5hbWVGdW5jKU5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9Qb2ludGVyKWZhY2UgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgY2ZmX2NtYXBfdW5pY29kZV9kb25lKCBQU19Vbmljb2RlcyAgdW5pY29kZXMgKQotICB7Ci0gICAgRlRfRmFjZSAgICBmYWNlICAgPSBGVF9DTUFQX0ZBQ0UoIHVuaWNvZGVzICk7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBGVF9GQUNFX01FTU9SWSggZmFjZSApOwotCi0KLSAgICBGVF9GUkVFKCB1bmljb2Rlcy0+bWFwcyApOwotICAgIHVuaWNvZGVzLT5udW1fbWFwcyA9IDA7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludCApCi0gIGNmZl9jbWFwX3VuaWNvZGVfY2hhcl9pbmRleCggUFNfVW5pY29kZXMgIHVuaWNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgICBjaGFyX2NvZGUgKQotICB7Ci0gICAgVFRfRmFjZSAgICAgICAgICAgICBmYWNlICAgID0gKFRUX0ZhY2UpRlRfQ01BUF9GQUNFKCB1bmljb2RlcyApOwotICAgIENGRl9Gb250ICAgICAgICAgICAgY2ZmICAgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lcyA9IChGVF9TZXJ2aWNlX1BzQ01hcHMpY2ZmLT5wc25hbWVzOwotCi0KLSAgICByZXR1cm4gcHNuYW1lcy0+dW5pY29kZXNfY2hhcl9pbmRleCggdW5pY29kZXMsIGNoYXJfY29kZSApOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQzMiApCi0gIGNmZl9jbWFwX3VuaWNvZGVfY2hhcl9uZXh0KCBQU19Vbmljb2RlcyAgdW5pY29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICAqcGNoYXJfY29kZSApCi0gIHsKLSAgICBUVF9GYWNlICAgICAgICAgICAgIGZhY2UgICAgPSAoVFRfRmFjZSlGVF9DTUFQX0ZBQ0UoIHVuaWNvZGVzICk7Ci0gICAgQ0ZGX0ZvbnQgICAgICAgICAgICBjZmYgICAgID0gKENGRl9Gb250KWZhY2UtPmV4dHJhLmRhdGE7Ci0gICAgRlRfU2VydmljZV9Qc0NNYXBzICBwc25hbWVzID0gKEZUX1NlcnZpY2VfUHNDTWFwcyljZmYtPnBzbmFtZXM7Ci0KLQotICAgIHJldHVybiBwc25hbWVzLT51bmljb2Rlc19jaGFyX25leHQoIHVuaWNvZGVzLCBwY2hhcl9jb2RlICk7Ci0gIH0KLQotCi0gIEZUX0RFRklORV9DTUFQX0NMQVNTKGNmZl9jbWFwX3VuaWNvZGVfY2xhc3NfcmVjLAotICAgIHNpemVvZiAoIFBTX1VuaWNvZGVzUmVjICksCi0KLSAgICAoRlRfQ01hcF9Jbml0RnVuYykgICAgIGNmZl9jbWFwX3VuaWNvZGVfaW5pdCwKLSAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIGNmZl9jbWFwX3VuaWNvZGVfZG9uZSwKLSAgICAoRlRfQ01hcF9DaGFySW5kZXhGdW5jKWNmZl9jbWFwX3VuaWNvZGVfY2hhcl9pbmRleCwKLSAgICAoRlRfQ01hcF9DaGFyTmV4dEZ1bmMpIGNmZl9jbWFwX3VuaWNvZGVfY2hhcl9uZXh0LAotCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAotICApCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZjbWFwLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZmNtYXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVhZWQ2My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZmNtYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZmNtYXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDRkYgY2hhcmFjdGVyIG1hcHBpbmcgdGFibGUgKGNtYXApIHN1cHBvcnQgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0NGRkNNQVBfSF9fCi0jZGVmaW5lIF9fQ0ZGQ01BUF9IX18KLQotI2luY2x1ZGUgImNmZm9ianMuaCIKLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgVFlQRTEgU1RBTkRBUkQgKEFORCBFWFBFUlQpIEVOQ09ESU5HIENNQVBTICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBzdGFuZGFyZCAoYW5kIGV4cGVydCkgZW5jb2RpbmcgY21hcHMgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgQ0ZGX0NNYXBTdGRSZWNfKiAgQ0ZGX0NNYXBTdGQ7Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGRl9DTWFwU3RkUmVjXwotICB7Ci0gICAgRlRfQ01hcFJlYyAgY21hcDsKLSAgICBGVF9VU2hvcnQqICBnaWRzOyAgIC8qIHVwIHRvIDI1NiBlbGVtZW50cyAqLwotCi0gIH0gQ0ZGX0NNYXBTdGRSZWM7Ci0KLQotICBGVF9ERUNMQVJFX0NNQVBfQ0xBU1MoY2ZmX2NtYXBfZW5jb2RpbmdfY2xhc3NfcmVjKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgQ0ZGIFNZTlRIRVRJQyBVTklDT0RFIEVOQ09ESU5HIENNQVAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogdW5pY29kZSAoc3ludGhldGljKSBjbWFwcyAqLwotCi0gIEZUX0RFQ0xBUkVfQ01BUF9DTEFTUyhjZmZfY21hcF91bmljb2RlX2NsYXNzX3JlYykKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0NGRkNNQVBfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZmRyaXZyLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZmRyaXZyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MThiN2EuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZkcml2ci5jCisrKyAvZGV2L251bGwKQEAgLTEsOTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZmRyaXZyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBPcGVuVHlwZSBmb250IGRyaXZlciBpbXBsZW1lbnRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0ZOVF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0NJRF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfSU5GT19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfTkFNRV9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1RUX0NNQVBfSAotCi0jaW5jbHVkZSAiY2ZmZHJpdnIuaCIKLSNpbmNsdWRlICJjZmZnbG9hZC5oIgotI2luY2x1ZGUgImNmZmxvYWQuaCIKLSNpbmNsdWRlICJjZmZjbWFwLmgiCi0jaW5jbHVkZSAiY2ZmcGFyc2UuaCIKLQotI2luY2x1ZGUgImNmZmVycnMuaCIKLSNpbmNsdWRlICJjZmZwaWMuaCIKLQotI2luY2x1ZGUgRlRfU0VSVklDRV9GT05UX0ZPUk1BVF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0dMWVBIX0RJQ1RfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QUk9QRVJUSUVTX0gKLSNpbmNsdWRlIEZUX0NGRl9EUklWRVJfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfY2ZmZHJpdmVyCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICBGIEEgQyBFIFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjZmZfZ2V0X2tlcm5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGRyaXZlciBtZXRob2QgdXNlZCB0byByZXR1cm4gdGhlIGtlcm5pbmcgdmVjdG9yIGJldHdlZW4gdHdvICAgICAgKi8KLSAgLyogICAgZ2x5cGhzIG9mIHRoZSBzYW1lIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZWZ0X2dseXBoICA6OiBUaGUgaW5kZXggb2YgdGhlIGxlZnQgZ2x5cGggaW4gdGhlIGtlcm4gcGFpci4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJpZ2h0X2dseXBoIDo6IFRoZSBpbmRleCBvZiB0aGUgcmlnaHQgZ2x5cGggaW4gdGhlIGtlcm4gcGFpci4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGtlcm5pbmcgICAgIDo6IFRoZSBrZXJuaW5nIHZlY3Rvci4gIFRoaXMgaXMgaW4gZm9udCB1bml0cyBmb3IgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzY2FsYWJsZSBmb3JtYXRzLCBhbmQgaW4gcGl4ZWxzIGZvciBmaXhlZC1zaXplcyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25seSBob3Jpem9udGFsIGxheW91dHMgKGxlZnQtdG8tcmlnaHQgJiByaWdodC10by1sZWZ0KSBhcmUgICAgICAgICovCi0gIC8qICAgIHN1cHBvcnRlZCBieSB0aGlzIGZ1bmN0aW9uLiAgT3RoZXIgbGF5b3V0cywgb3IgbW9yZSBzb3BoaXN0aWNhdGVkICAqLwotICAvKiAgICBrZXJuaW5ncywgYXJlIG91dCBvZiBzY29wZSBvZiB0aGlzIG1ldGhvZCAodGhlIGJhc2ljIGRyaXZlciAgICAgICAgKi8KLSAgLyogICAgaW50ZXJmYWNlIGlzIG1lYW50IHRvIGJlIHNpbXBsZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGV5IGNhbiBiZSBpbXBsZW1lbnRlZCBieSBmb3JtYXQtc3BlY2lmaWMgaW50ZXJmYWNlcy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBjZmZfZ2V0X2tlcm5pbmcoIEZUX0ZhY2UgICAgIHR0ZmFjZSwgICAgICAgICAgLyogVFRfRmFjZSAqLwotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGxlZnRfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgcmlnaHRfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAga2VybmluZyApCi0gIHsKLSAgICBUVF9GYWNlICAgICAgIGZhY2UgPSAoVFRfRmFjZSl0dGZhY2U7Ci0gICAgU0ZOVF9TZXJ2aWNlICBzZm50ID0gKFNGTlRfU2VydmljZSlmYWNlLT5zZm50OwotCi0KLSAgICBrZXJuaW5nLT54ID0gMDsKLSAgICBrZXJuaW5nLT55ID0gMDsKLQotICAgIGlmICggc2ZudCApCi0gICAgICBrZXJuaW5nLT54ID0gc2ZudC0+Z2V0X2tlcm5pbmcoIGZhY2UsIGxlZnRfZ2x5cGgsIHJpZ2h0X2dseXBoICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjZmZfZ2x5cGhfbG9hZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGRyaXZlciBtZXRob2QgdXNlZCB0byBsb2FkIGEgZ2x5cGggd2l0aGluIGEgZ2l2ZW4gZ2x5cGggc2xvdC4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzbG90ICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IHNsb3Qgb2JqZWN0IHdoZXJlIHRoZSBnbHlwaCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgd2lsbCBiZSBsb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugc2l6ZSBhdCB3aGljaCB0aGUgZ2x5cGggKi8KLSAgLyogICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzY2FsZWQsIGxvYWRlZCwgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGdseXBoIGluIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgIDo6IEEgZmxhZyBpbmRpY2F0aW5nIHdoYXQgdG8gbG9hZCBmb3IgdGhpcyBnbHlwaC4gIFRoZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICBGVF9MT0FEXz8/PyBjb25zdGFudHMgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZ2x5cGggbG9hZGluZyBwcm9jZXNzIChlLmcuLCB3aGV0aGVyIHRoZSBvdXRsaW5lICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBzY2FsZWQsIHdoZXRoZXIgdG8gbG9hZCBiaXRtYXBzIG9yIG5vdCwgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRvIGhpbnQgdGhlIG91dGxpbmUsIGV0YykuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBjZmZfZ2x5cGhfbG9hZCggRlRfR2x5cGhTbG90ICBjZmZzbG90LCAgICAgIC8qIENGRl9HbHlwaFNsb3QgKi8KLSAgICAgICAgICAgICAgICAgIEZUX1NpemUgICAgICAgY2Zmc2l6ZSwgICAgICAvKiBDRkZfU2l6ZSAgICAgICovCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICAgICBsb2FkX2ZsYWdzICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgIGVycm9yOwotICAgIENGRl9HbHlwaFNsb3QgIHNsb3QgPSAoQ0ZGX0dseXBoU2xvdCljZmZzbG90OwotICAgIENGRl9TaXplICAgICAgIHNpemUgPSAoQ0ZGX1NpemUpY2Zmc2l6ZTsKLQotCi0gICAgaWYgKCAhc2xvdCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfU2xvdF9IYW5kbGUgKTsKLQotICAgIEZUX1RSQUNFMSgoICJjZmZfZ2x5cGhfbG9hZDogZ2x5cGggaW5kZXggJWRcbiIsIGdseXBoX2luZGV4ICkpOwotCi0gICAgLyogY2hlY2sgd2hldGhlciB3ZSB3YW50IGEgc2NhbGVkIG91dGxpbmUgb3IgYml0bWFwICovCi0gICAgaWYgKCAhc2l6ZSApCi0gICAgICBsb2FkX2ZsYWdzIHw9IEZUX0xPQURfTk9fU0NBTEUgfCBGVF9MT0FEX05PX0hJTlRJTkc7Ci0KLSAgICAvKiByZXNldCB0aGUgc2l6ZSBvYmplY3QgaWYgbmVjZXNzYXJ5ICovCi0gICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSApCi0gICAgICBzaXplID0gTlVMTDsKLQotICAgIGlmICggc2l6ZSApCi0gICAgewotICAgICAgLyogdGhlc2UgdHdvIG9iamVjdHMgbXVzdCBoYXZlIHRoZSBzYW1lIHBhcmVudCAqLwotICAgICAgaWYgKCBjZmZzaXplLT5mYWNlICE9IGNmZnNsb3QtPmZhY2UgKQotICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLSAgICB9Ci0KLSAgICAvKiBub3cgbG9hZCB0aGUgZ2x5cGggb3V0bGluZSBpZiBuZWNlc3NhcnkgKi8KLSAgICBlcnJvciA9IGNmZl9zbG90X2xvYWQoIHNsb3QsIHNpemUsIGdseXBoX2luZGV4LCBsb2FkX2ZsYWdzICk7Ci0KLSAgICAvKiBmb3JjZSBkcm9wLW91dCBtb2RlIHRvIDIgLSBpcnJlbGV2YW50IG5vdyAqLwotICAgIC8qIHNsb3QtPm91dGxpbmUuZHJvcG91dF9tb2RlID0gMjsgKi8KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIGNmZl9nZXRfYWR2YW5jZXMoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBhZHZhbmNlcyApCi0gIHsKLSAgICBGVF9VSW50ICAgICAgIG5uOwotICAgIEZUX0Vycm9yICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfR2x5cGhTbG90ICBzbG90ICA9IGZhY2UtPmdseXBoOwotCi0KLSAgICBpZiAoIEZUX0lTX1NGTlQoIGZhY2UgKSApCi0gICAgewotICAgICAgLyogT3BlblR5cGUgMS43IG1hbmRhdGVzIHRoYXQgdGhlIGRhdGEgZnJvbSBgaG10eCcgdGFibGUgYmUgdXNlZDsgKi8KLSAgICAgIC8qIGl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdGhhdCB0aG9zZSB2YWx1ZXMgYXJlIGlkZW50aWNhbCB0byAgICovCi0gICAgICAvKiB0aGUgdmFsdWVzIGluIHRoZSBgQ0ZGJyB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBUVF9GYWNlICAgdHRmYWNlID0gKFRUX0ZhY2UpZmFjZTsKLSAgICAgIEZUX1Nob3J0ICBkdW1teTsKLQotCi0gICAgICBpZiAoIGZsYWdzICYgRlRfTE9BRF9WRVJUSUNBTF9MQVlPVVQgKQotICAgICAgewotICAgICAgICAvKiBjaGVjayB3aGV0aGVyIHdlIGhhdmUgZGF0YSBmcm9tIHRoZSBgdm10eCcgdGFibGUgYXQgYWxsOyAqLwotICAgICAgICAvKiBvdGhlcndpc2Ugd2UgZXh0cmFjdCB0aGUgaW5mbyBmcm9tIHRoZSBDRkYgZ2x5cGhzdHJpbmdzICAqLwotICAgICAgICAvKiAoaW5zdGVhZCBvZiBzeW50aGVzaXppbmcgYSBnbG9iYWwgdmFsdWUgdXNpbmcgdGhlIGBPUy8yJyAqLwotICAgICAgICAvKiB0YWJsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoICF0dGZhY2UtPnZlcnRpY2FsX2luZm8gKQotICAgICAgICAgIGdvdG8gTWlzc2luZ19UYWJsZTsKLQotICAgICAgICBmb3IgKCBubiA9IDA7IG5uIDwgY291bnQ7IG5uKysgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVVNob3J0ICBhaDsKLQotCi0gICAgICAgICAgKCAoU0ZOVF9TZXJ2aWNlKXR0ZmFjZS0+c2ZudCApLT5nZXRfbWV0cmljcyggdHRmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBubiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVtbXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFoICk7Ci0KLSAgICAgICAgICBGVF9UUkFDRTUoKCAiICBpZHggJWQ6IGFkdmFuY2UgaGVpZ2h0ICVkIGZvbnQgdW5pdHNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBubiwgYWggKSk7Ci0gICAgICAgICAgYWR2YW5jZXNbbm5dID0gYWg7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogY2hlY2sgd2hldGhlciB3ZSBoYXZlIGRhdGEgZnJvbSB0aGUgYGhtdHgnIHRhYmxlIGF0IGFsbCAqLwotICAgICAgICBpZiAoICF0dGZhY2UtPmhvcml6b250YWwubnVtYmVyX09mX0hNZXRyaWNzICkKLSAgICAgICAgICBnb3RvIE1pc3NpbmdfVGFibGU7Ci0KLSAgICAgICAgZm9yICggbm4gPSAwOyBubiA8IGNvdW50OyBubisrICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1VTaG9ydCAgYXc7Ci0KLQotICAgICAgICAgICggKFNGTlRfU2VydmljZSl0dGZhY2UtPnNmbnQgKS0+Z2V0X21ldHJpY3MoIHR0ZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgbm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1bW15LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdyApOwotCi0gICAgICAgICAgRlRfVFJBQ0U1KCggIiAgaWR4ICVkOiBhZHZhbmNlIHdpZHRoICVkIGZvbnQgdW5pdHNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgc3RhcnQgKyBubiwgYXcgKSk7Ci0gICAgICAgICAgYWR2YW5jZXNbbm5dID0gYXc7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIH0KLQotICBNaXNzaW5nX1RhYmxlOgotICAgIGZsYWdzIHw9IChGVF9VSW50MzIpRlRfTE9BRF9BRFZBTkNFX09OTFk7Ci0KLSAgICBmb3IgKCBubiA9IDA7IG5uIDwgY291bnQ7IG5uKysgKQotICAgIHsKLSAgICAgIGVycm9yID0gY2ZmX2dseXBoX2xvYWQoIHNsb3QsIGZhY2UtPnNpemUsIHN0YXJ0ICsgbm4sIGZsYWdzICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGFkdmFuY2VzW25uXSA9ICggZmxhZ3MgJiBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCApCi0gICAgICAgICAgICAgICAgICAgICA/IHNsb3QtPmxpbmVhclZlcnRBZHZhbmNlCi0gICAgICAgICAgICAgICAgICAgICA6IHNsb3QtPmxpbmVhckhvcmlBZHZhbmNlOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoKLSAgICogIEdMWVBIIERJQ1QgU0VSVklDRQotICAgKgotICAgKi8KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2ZmX2dldF9nbHlwaF9uYW1lKCBDRkZfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBidWZmZXJfbWF4ICkKLSAgewotICAgIENGRl9Gb250ICAgIGZvbnQgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotICAgIEZUX1N0cmluZyogIGduYW1lOwotICAgIEZUX1VTaG9ydCAgIHNpZDsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLQotCi0gICAgaWYgKCAhZm9udC0+cHNuYW1lcyApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiY2ZmX2dldF9nbHlwaF9uYW1lOiIKLSAgICAgICAgICAgICAgICAgIiBjYW5ub3QgZ2V0IGdseXBoIG5hbWUgZnJvbSBDRkYgJiBDRUYgZm9udHNcbiIKLSAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAiCi0gICAgICAgICAgICAgICAgICIgd2l0aG91dCB0aGUgYFBTTmFtZXMnIG1vZHVsZVxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIE1pc3NpbmdfTW9kdWxlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogZmlyc3QsIGxvY2F0ZSB0aGUgc2lkIGluIHRoZSBjaGFyc2V0IHRhYmxlICovCi0gICAgc2lkID0gZm9udC0+Y2hhcnNldC5zaWRzW2dseXBoX2luZGV4XTsKLQotICAgIC8qIG5vdywgbG9va3VwIHRoZSBuYW1lIGl0c2VsZiAqLwotICAgIGduYW1lID0gY2ZmX2luZGV4X2dldF9zaWRfc3RyaW5nKCBmb250LCBzaWQgKTsKLQotICAgIGlmICggZ25hbWUgKQotICAgICAgRlRfU1RSQ1BZTiggYnVmZmVyLCBnbmFtZSwgYnVmZmVyX21heCApOwotCi0gICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9VSW50Ci0gIGNmZl9nZXRfbmFtZV9pbmRleCggQ0ZGX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqICBnbHlwaF9uYW1lICkKLSAgewotICAgIENGRl9Gb250ICAgICAgICAgICAgY2ZmOwotICAgIENGRl9DaGFyc2V0ICAgICAgICAgY2hhcnNldDsKLSAgICBGVF9TZXJ2aWNlX1BzQ01hcHMgIHBzbmFtZXM7Ci0gICAgRlRfU3RyaW5nKiAgICAgICAgICBuYW1lOwotICAgIEZUX1VTaG9ydCAgICAgICAgICAgc2lkOwotICAgIEZUX1VJbnQgICAgICAgICAgICAgaTsKLQotCi0gICAgY2ZmICAgICA9IChDRkZfRm9udFJlYyAqKWZhY2UtPmV4dHJhLmRhdGE7Ci0gICAgY2hhcnNldCA9ICZjZmYtPmNoYXJzZXQ7Ci0KLSAgICBGVF9GQUNFX0ZJTkRfR0xPQkFMX1NFUlZJQ0UoIGZhY2UsIHBzbmFtZXMsIFBPU1RTQ1JJUFRfQ01BUFMgKTsKLSAgICBpZiAoICFwc25hbWVzICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBjZmYtPm51bV9nbHlwaHM7IGkrKyApCi0gICAgewotICAgICAgc2lkID0gY2hhcnNldC0+c2lkc1tpXTsKLQotICAgICAgaWYgKCBzaWQgPiAzOTAgKQotICAgICAgICBuYW1lID0gY2ZmX2luZGV4X2dldF9zdHJpbmcoIGNmZiwgc2lkIC0gMzkxICk7Ci0gICAgICBlbHNlCi0gICAgICAgIG5hbWUgPSAoRlRfU3RyaW5nICopcHNuYW1lcy0+YWRvYmVfc3RkX3N0cmluZ3MoIHNpZCApOwotCi0gICAgICBpZiAoICFuYW1lICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGlmICggIWZ0X3N0cmNtcCggZ2x5cGhfbmFtZSwgbmFtZSApICkKLSAgICAgICAgcmV0dXJuIGk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0RFRklORV9TRVJWSUNFX0dMWVBIRElDVFJFQygKLSAgICBjZmZfc2VydmljZV9nbHlwaF9kaWN0LAotICAgIChGVF9HbHlwaERpY3RfR2V0TmFtZUZ1bmMpICBjZmZfZ2V0X2dseXBoX25hbWUsCi0gICAgKEZUX0dseXBoRGljdF9OYW1lSW5kZXhGdW5jKWNmZl9nZXRfbmFtZV9pbmRleAotICApCi0KLQotICAvKgotICAgKiAgUE9TVFNDUklQVCBJTkZPIFNFUlZJQ0UKLSAgICoKLSAgICovCi0KLSAgc3RhdGljIEZUX0ludAotICBjZmZfcHNfaGFzX2dseXBoX25hbWVzKCBGVF9GYWNlICBmYWNlICkKLSAgewotICAgIHJldHVybiAoIGZhY2UtPmZhY2VfZmxhZ3MgJiBGVF9GQUNFX0ZMQUdfR0xZUEhfTkFNRVMgKSA+IDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfcHNfZ2V0X2ZvbnRfaW5mbyggQ0ZGX0ZhY2UgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgUFNfRm9udEluZm9SZWMqICBhZm9udF9pbmZvICkKLSAgewotICAgIENGRl9Gb250ICBjZmYgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0gICAgaWYgKCBjZmYgJiYgY2ZmLT5mb250X2luZm8gPT0gTlVMTCApCi0gICAgewotICAgICAgQ0ZGX0ZvbnRSZWNEaWN0ICBkaWN0ICAgPSAmY2ZmLT50b3BfZm9udC5mb250X2RpY3Q7Ci0gICAgICBQU19Gb250SW5mb1JlYyAgKmZvbnRfaW5mbyA9IE5VTEw7Ci0gICAgICBGVF9NZW1vcnkgICAgICAgIG1lbW9yeSA9IGZhY2UtPnJvb3QubWVtb3J5OwotCi0KLSAgICAgIGlmICggRlRfQUxMT0MoIGZvbnRfaW5mbywgc2l6ZW9mICggKmZvbnRfaW5mbyApICkgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGZvbnRfaW5mby0+dmVyc2lvbiAgICAgPSBjZmZfaW5kZXhfZ2V0X3NpZF9zdHJpbmcoIGNmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPnZlcnNpb24gKTsKLSAgICAgIGZvbnRfaW5mby0+bm90aWNlICAgICAgPSBjZmZfaW5kZXhfZ2V0X3NpZF9zdHJpbmcoIGNmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPm5vdGljZSApOwotICAgICAgZm9udF9pbmZvLT5mdWxsX25hbWUgICA9IGNmZl9pbmRleF9nZXRfc2lkX3N0cmluZyggY2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdC0+ZnVsbF9uYW1lICk7Ci0gICAgICBmb250X2luZm8tPmZhbWlseV9uYW1lID0gY2ZmX2luZGV4X2dldF9zaWRfc3RyaW5nKCBjZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0LT5mYW1pbHlfbmFtZSApOwotICAgICAgZm9udF9pbmZvLT53ZWlnaHQgICAgICA9IGNmZl9pbmRleF9nZXRfc2lkX3N0cmluZyggY2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdC0+d2VpZ2h0ICk7Ci0gICAgICBmb250X2luZm8tPml0YWxpY19hbmdsZSAgICAgICAgPSBkaWN0LT5pdGFsaWNfYW5nbGU7Ci0gICAgICBmb250X2luZm8tPmlzX2ZpeGVkX3BpdGNoICAgICAgPSBkaWN0LT5pc19maXhlZF9waXRjaDsKLSAgICAgIGZvbnRfaW5mby0+dW5kZXJsaW5lX3Bvc2l0aW9uICA9IChGVF9TaG9ydClkaWN0LT51bmRlcmxpbmVfcG9zaXRpb247Ci0gICAgICBmb250X2luZm8tPnVuZGVybGluZV90aGlja25lc3MgPSAoRlRfVVNob3J0KWRpY3QtPnVuZGVybGluZV90aGlja25lc3M7Ci0KLSAgICAgIGNmZi0+Zm9udF9pbmZvID0gZm9udF9pbmZvOwotICAgIH0KLQotICAgIGlmICggY2ZmICkKLSAgICAgICphZm9udF9pbmZvID0gKmNmZi0+Zm9udF9pbmZvOwotCi0gIEZhaWw6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRV9QU0lORk9SRUMoCi0gICAgY2ZmX3NlcnZpY2VfcHNfaW5mbywKLSAgICAoUFNfR2V0Rm9udEluZm9GdW5jKSAgIGNmZl9wc19nZXRfZm9udF9pbmZvLAotICAgIChQU19HZXRGb250RXh0cmFGdW5jKSAgTlVMTCwKLSAgICAoUFNfSGFzR2x5cGhOYW1lc0Z1bmMpIGNmZl9wc19oYXNfZ2x5cGhfbmFtZXMsCi0gICAgKFBTX0dldEZvbnRQcml2YXRlRnVuYylOVUxMLCAgICAgICAgLyogdW5zdXBwb3J0ZWQgd2l0aCBDRkYgZm9udHMgKi8KLSAgICAoUFNfR2V0Rm9udFZhbHVlRnVuYykgIE5VTEwgICAgICAgICAvKiBub3QgaW1wbGVtZW50ZWQgICAgICAgICAgICAqLwotICApCi0KLQotICAvKgotICAgKiAgUE9TVFNDUklQVCBOQU1FIFNFUlZJQ0UKLSAgICoKLSAgICovCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIqCi0gIGNmZl9nZXRfcHNfbmFtZSggQ0ZGX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgQ0ZGX0ZvbnQgICAgICBjZmYgID0gKENGRl9Gb250KWZhY2UtPmV4dHJhLmRhdGE7Ci0gICAgU0ZOVF9TZXJ2aWNlICBzZm50ID0gKFNGTlRfU2VydmljZSlmYWNlLT5zZm50OwotCi0KLSAgICAvKiBmb2xsb3dpbmcgdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24gMS43LCB3ZSByZXR1cm4gdGhlIG5hbWUgc3RvcmVkICovCi0gICAgLyogaW4gdGhlIGBuYW1lJyB0YWJsZSBmb3IgYSBDRkYgd3JhcHBlZCBpbnRvIGFuIFNGTlQgY29udGFpbmVyICAgICAgICAqLwotCi0gICAgaWYgKCBzZm50ICkKLSAgICB7Ci0gICAgICBGVF9MaWJyYXJ5ICAgICAgICAgICAgIGxpYnJhcnkgICAgID0gRlRfRkFDRV9MSUJSQVJZKCBmYWNlICk7Ci0gICAgICBGVF9Nb2R1bGUgICAgICAgICAgICAgIHNmbnRfbW9kdWxlID0gRlRfR2V0X01vZHVsZSggbGlicmFyeSwgInNmbnQiICk7Ci0gICAgICBGVF9TZXJ2aWNlX1BzRm9udE5hbWUgIHNlcnZpY2UgICAgID0KLSAgICAgICAgKEZUX1NlcnZpY2VfUHNGb250TmFtZSlmdF9tb2R1bGVfZ2V0X3NlcnZpY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZm50X21vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9GT05UX05BTUUgKTsKLQotCi0gICAgICBpZiAoIHNlcnZpY2UgJiYgc2VydmljZS0+Z2V0X3BzX2ZvbnRfbmFtZSApCi0gICAgICAgIHJldHVybiBzZXJ2aWNlLT5nZXRfcHNfZm9udF9uYW1lKCBGVF9GQUNFKCBmYWNlICkgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKGNvbnN0IGNoYXIqKWNmZi0+Zm9udF9uYW1lOwotICB9Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRV9QU0ZPTlROQU1FUkVDKAotICAgIGNmZl9zZXJ2aWNlX3BzX25hbWUsCi0gICAgKEZUX1BzTmFtZV9HZXRGdW5jKWNmZl9nZXRfcHNfbmFtZQotICApCi0KLQotICAvKgotICAgKiBUVCBDTUFQIElORk8KLSAgICoKLSAgICogSWYgdGhlIGNoYXJtYXAgaXMgYSBzeW50aGV0aWMgVW5pY29kZSBlbmNvZGluZyBjbWFwIG9yCi0gICAqIGEgVHlwZSAxIHN0YW5kYXJkIChvciBleHBlcnQpIGVuY29kaW5nIGNtYXAsIGhpZGUgVFQgQ01BUCBJTkZPCi0gICAqIHNlcnZpY2UgZGVmaW5lZCBpbiBTRk5UIG1vZHVsZS4KLSAgICoKLSAgICogT3RoZXJ3aXNlIGNhbGwgdGhlIHNlcnZpY2UgZnVuY3Rpb24gaW4gdGhlIHNmbnQgbW9kdWxlLgotICAgKgotICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9nZXRfY21hcF9pbmZvKCBGVF9DaGFyTWFwICAgIGNoYXJtYXAsCi0gICAgICAgICAgICAgICAgICAgICBUVF9DTWFwSW5mbyAgKmNtYXBfaW5mbyApCi0gIHsKLSAgICBGVF9DTWFwICAgY21hcCAgPSBGVF9DTUFQKCBjaGFybWFwICk7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0gICAgRlRfRmFjZSAgICAgZmFjZSAgICA9IEZUX0NNQVBfRkFDRSggY21hcCApOwotICAgIEZUX0xpYnJhcnkgIGxpYnJhcnkgPSBGVF9GQUNFX0xJQlJBUlkoIGZhY2UgKTsKLQotCi0gICAgY21hcF9pbmZvLT5sYW5ndWFnZSA9IDA7Ci0gICAgY21hcF9pbmZvLT5mb3JtYXQgICA9IDA7Ci0KLSAgICBpZiAoIGNtYXAtPmNsYXp6ICE9ICZDRkZfQ01BUF9FTkNPRElOR19DTEFTU19SRUNfR0VUICYmCi0gICAgICAgICBjbWFwLT5jbGF6eiAhPSAmQ0ZGX0NNQVBfVU5JQ09ERV9DTEFTU19SRUNfR0VUICApCi0gICAgewotICAgICAgRlRfTW9kdWxlICAgICAgICAgICBzZm50ICAgID0gRlRfR2V0X01vZHVsZSggbGlicmFyeSwgInNmbnQiICk7Ci0gICAgICBGVF9TZXJ2aWNlX1RUQ01hcHMgIHNlcnZpY2UgPQotICAgICAgICAoRlRfU2VydmljZV9UVENNYXBzKWZ0X21vZHVsZV9nZXRfc2VydmljZSggc2ZudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NFUlZJQ0VfSURfVFRfQ01BUCApOwotCi0KLSAgICAgIGlmICggc2VydmljZSAmJiBzZXJ2aWNlLT5nZXRfY21hcF9pbmZvICkKLSAgICAgICAgZXJyb3IgPSBzZXJ2aWNlLT5nZXRfY21hcF9pbmZvKCBjaGFybWFwLCBjbWFwX2luZm8gKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0RFRklORV9TRVJWSUNFX1RUQ01BUFNSRUMoCi0gICAgY2ZmX3NlcnZpY2VfZ2V0X2NtYXBfaW5mbywKLSAgICAoVFRfQ01hcF9JbmZvX0dldEZ1bmMpY2ZmX2dldF9jbWFwX2luZm8KLSAgKQotCi0KLSAgLyoKLSAgICogIENJRCBJTkZPIFNFUlZJQ0UKLSAgICoKLSAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfZ2V0X3JvcyggQ0ZGX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogICpyZWdpc3RyeSwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqb3JkZXJpbmcsCi0gICAgICAgICAgICAgICBGVF9JbnQgICAgICAgKnN1cHBsZW1lbnQgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotICAgIENGRl9Gb250ICBjZmYgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotCi0KLSAgICBpZiAoIGNmZiApCi0gICAgewotICAgICAgQ0ZGX0ZvbnRSZWNEaWN0ICBkaWN0ID0gJmNmZi0+dG9wX2ZvbnQuZm9udF9kaWN0OwotCi0KLSAgICAgIGlmICggZGljdC0+Y2lkX3JlZ2lzdHJ5ID09IDB4RkZGRlUgKQotICAgICAgewotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLQotICAgICAgaWYgKCByZWdpc3RyeSApCi0gICAgICB7Ci0gICAgICAgIGlmICggY2ZmLT5yZWdpc3RyeSA9PSBOVUxMICkKLSAgICAgICAgICBjZmYtPnJlZ2lzdHJ5ID0gY2ZmX2luZGV4X2dldF9zaWRfc3RyaW5nKCBjZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdC0+Y2lkX3JlZ2lzdHJ5ICk7Ci0gICAgICAgICpyZWdpc3RyeSA9IGNmZi0+cmVnaXN0cnk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggb3JkZXJpbmcgKQotICAgICAgewotICAgICAgICBpZiAoIGNmZi0+b3JkZXJpbmcgPT0gTlVMTCApCi0gICAgICAgICAgY2ZmLT5vcmRlcmluZyA9IGNmZl9pbmRleF9nZXRfc2lkX3N0cmluZyggY2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPmNpZF9vcmRlcmluZyApOwotICAgICAgICAqb3JkZXJpbmcgPSBjZmYtPm9yZGVyaW5nOwotICAgICAgfQotCi0gICAgICAvKgotICAgICAgICogWFhYOiBBY2NvcmRpbmcgdG8gQWRvYmUgVGVjaE5vdGUgIzUxNzYsIHRoZSBzdXBwbGVtZW50IGluIENGRgotICAgICAgICogICAgICBjYW4gYmUgYSByZWFsIG51bWJlci4gV2UgdHJ1bmNhdGUgaXQgdG8gZml0IHB1YmxpYyBBUEkKLSAgICAgICAqICAgICAgc2luY2UgZnJlZXR5cGUtMi4zLjYuCi0gICAgICAgKi8KLSAgICAgIGlmICggc3VwcGxlbWVudCApCi0gICAgICB7Ci0gICAgICAgIGlmICggZGljdC0+Y2lkX3N1cHBsZW1lbnQgPCBGVF9JTlRfTUlOIHx8Ci0gICAgICAgICAgICAgZGljdC0+Y2lkX3N1cHBsZW1lbnQgPiBGVF9JTlRfTUFYICkKLSAgICAgICAgICBGVF9UUkFDRTEoKCAiY2ZmX2dldF9yb3M6IHRvbyBsYXJnZSBzdXBwbGVtZW50ICVkIGlzIHRydW5jYXRlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBkaWN0LT5jaWRfc3VwcGxlbWVudCApKTsKLSAgICAgICAgKnN1cHBsZW1lbnQgPSAoRlRfSW50KWRpY3QtPmNpZF9zdXBwbGVtZW50OwotICAgICAgfQotICAgIH0KLQotICBGYWlsOgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9nZXRfaXNfY2lkKCBDRkZfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICppc19jaWQgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotICAgIENGRl9Gb250ICBjZmYgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotCi0KLSAgICAqaXNfY2lkID0gMDsKLQotICAgIGlmICggY2ZmICkKLSAgICB7Ci0gICAgICBDRkZfRm9udFJlY0RpY3QgIGRpY3QgPSAmY2ZmLT50b3BfZm9udC5mb250X2RpY3Q7Ci0KLQotICAgICAgaWYgKCBkaWN0LT5jaWRfcmVnaXN0cnkgIT0gMHhGRkZGVSApCi0gICAgICAgICppc19jaWQgPSAxOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9nZXRfY2lkX2Zyb21fZ2x5cGhfaW5kZXgoIENGRl9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICpjaWQgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotICAgIENGRl9Gb250ICBjZmY7Ci0KLQotICAgIGNmZiA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotCi0gICAgaWYgKCBjZmYgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgICAgICAgICAgYzsKLSAgICAgIENGRl9Gb250UmVjRGljdCAgZGljdCA9ICZjZmYtPnRvcF9mb250LmZvbnRfZGljdDsKLQotCi0gICAgICBpZiAoIGRpY3QtPmNpZF9yZWdpc3RyeSA9PSAweEZGRkZVICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggZ2x5cGhfaW5kZXggPiBjZmYtPm51bV9nbHlwaHMgKQotICAgICAgewotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLQotICAgICAgYyA9IGNmZi0+Y2hhcnNldC5zaWRzW2dseXBoX2luZGV4XTsKLQotICAgICAgaWYgKCBjaWQgKQotICAgICAgICAqY2lkID0gYzsKLSAgICB9Ci0KLSAgRmFpbDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0RFRklORV9TRVJWSUNFX0NJRFJFQygKLSAgICBjZmZfc2VydmljZV9jaWRfaW5mbywKLSAgICAoRlRfQ0lEX0dldFJlZ2lzdHJ5T3JkZXJpbmdTdXBwbGVtZW50RnVuYyljZmZfZ2V0X3JvcywKLSAgICAoRlRfQ0lEX0dldElzSW50ZXJuYWxseUNJREtleWVkRnVuYykgICAgICBjZmZfZ2V0X2lzX2NpZCwKLSAgICAoRlRfQ0lEX0dldENJREZyb21HbHlwaEluZGV4RnVuYykgICAgICAgICBjZmZfZ2V0X2NpZF9mcm9tX2dseXBoX2luZGV4Ci0gICkKLQotCi0gIC8qCi0gICAqICBQUk9QRVJUWSBTRVJWSUNFCi0gICAqCi0gICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2ZmX3Byb3BlcnR5X3NldCggRlRfTW9kdWxlICAgIG1vZHVsZSwgICAgICAgICAvKiBDRkZfRHJpdmVyICovCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBwcm9wZXJ0eV9uYW1lLAotICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiAgdmFsdWUgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3IgID0gRlRfRXJyX09rOwotICAgIENGRl9Ecml2ZXIgIGRyaXZlciA9IChDRkZfRHJpdmVyKW1vZHVsZTsKLQotCi0gICAgaWYgKCAhZnRfc3RyY21wKCBwcm9wZXJ0eV9uYW1lLCAiZGFya2VuaW5nLXBhcmFtZXRlcnMiICkgKQotICAgIHsKLSAgICAgIEZUX0ludCogIGRhcmtlbl9wYXJhbXMgPSAoRlRfSW50Kil2YWx1ZTsKLQotICAgICAgRlRfSW50ICB4MSA9IGRhcmtlbl9wYXJhbXNbMF07Ci0gICAgICBGVF9JbnQgIHkxID0gZGFya2VuX3BhcmFtc1sxXTsKLSAgICAgIEZUX0ludCAgeDIgPSBkYXJrZW5fcGFyYW1zWzJdOwotICAgICAgRlRfSW50ICB5MiA9IGRhcmtlbl9wYXJhbXNbM107Ci0gICAgICBGVF9JbnQgIHgzID0gZGFya2VuX3BhcmFtc1s0XTsKLSAgICAgIEZUX0ludCAgeTMgPSBkYXJrZW5fcGFyYW1zWzVdOwotICAgICAgRlRfSW50ICB4NCA9IGRhcmtlbl9wYXJhbXNbNl07Ci0gICAgICBGVF9JbnQgIHk0ID0gZGFya2VuX3BhcmFtc1s3XTsKLQotCi0gICAgICBpZiAoIHgxIDwgMCAgIHx8IHgyIDwgMCAgIHx8IHgzIDwgMCAgIHx8IHg0IDwgMCAgIHx8Ci0gICAgICAgICAgIHkxIDwgMCAgIHx8IHkyIDwgMCAgIHx8IHkzIDwgMCAgIHx8IHk0IDwgMCAgIHx8Ci0gICAgICAgICAgIHgxID4geDIgIHx8IHgyID4geDMgIHx8IHgzID4geDQgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIHkxID4gNTAwIHx8IHkyID4gNTAwIHx8IHkzID4gNTAwIHx8IHk0ID4gNTAwICkKLSAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICAgIGRyaXZlci0+ZGFya2VuX3BhcmFtc1swXSA9IHgxOwotICAgICAgZHJpdmVyLT5kYXJrZW5fcGFyYW1zWzFdID0geTE7Ci0gICAgICBkcml2ZXItPmRhcmtlbl9wYXJhbXNbMl0gPSB4MjsKLSAgICAgIGRyaXZlci0+ZGFya2VuX3BhcmFtc1szXSA9IHkyOwotICAgICAgZHJpdmVyLT5kYXJrZW5fcGFyYW1zWzRdID0geDM7Ci0gICAgICBkcml2ZXItPmRhcmtlbl9wYXJhbXNbNV0gPSB5MzsKLSAgICAgIGRyaXZlci0+ZGFya2VuX3BhcmFtc1s2XSA9IHg0OwotICAgICAgZHJpdmVyLT5kYXJrZW5fcGFyYW1zWzddID0geTQ7Ci0KLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoICFmdF9zdHJjbXAoIHByb3BlcnR5X25hbWUsICJoaW50aW5nLWVuZ2luZSIgKSApCi0gICAgewotICAgICAgRlRfVUludCogIGhpbnRpbmdfZW5naW5lID0gKEZUX1VJbnQqKXZhbHVlOwotCi0KLSNpZm5kZWYgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORQotICAgICAgaWYgKCAqaGludGluZ19lbmdpbmUgIT0gRlRfQ0ZGX0hJTlRJTkdfQURPQkUgKQotICAgICAgICBlcnJvciA9IEZUX0VSUiggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0gICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgZHJpdmVyLT5oaW50aW5nX2VuZ2luZSA9ICpoaW50aW5nX2VuZ2luZTsKLQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIH0KLSAgICBlbHNlIGlmICggIWZ0X3N0cmNtcCggcHJvcGVydHlfbmFtZSwgIm5vLXN0ZW0tZGFya2VuaW5nIiApICkKLSAgICB7Ci0gICAgICBGVF9Cb29sKiAgbm9fc3RlbV9kYXJrZW5pbmcgPSAoRlRfQm9vbCopdmFsdWU7Ci0KLQotICAgICAgZHJpdmVyLT5ub19zdGVtX2RhcmtlbmluZyA9ICpub19zdGVtX2RhcmtlbmluZzsKLQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIH0KLQotICAgIEZUX1RSQUNFMCgoICJjZmZfcHJvcGVydHlfc2V0OiBtaXNzaW5nIHByb3BlcnR5IGAlcydcbiIsCi0gICAgICAgICAgICAgICAgcHJvcGVydHlfbmFtZSApKTsKLSAgICByZXR1cm4gRlRfVEhST1coIE1pc3NpbmdfUHJvcGVydHkgKTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9wcm9wZXJ0eV9nZXQoIEZUX01vZHVsZSAgICBtb2R1bGUsICAgICAgICAgLyogQ0ZGX0RyaXZlciAqLwotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgcHJvcGVydHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogIHZhbHVlICkKLSAgewotICAgIEZUX0Vycm9yICAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBDRkZfRHJpdmVyICBkcml2ZXIgPSAoQ0ZGX0RyaXZlciltb2R1bGU7Ci0KLQotICAgIGlmICggIWZ0X3N0cmNtcCggcHJvcGVydHlfbmFtZSwgImRhcmtlbmluZy1wYXJhbWV0ZXJzIiApICkKLSAgICB7Ci0gICAgICBGVF9JbnQqICBkYXJrZW5fcGFyYW1zID0gZHJpdmVyLT5kYXJrZW5fcGFyYW1zOwotICAgICAgRlRfSW50KiAgdmFsICAgICAgICAgICA9IChGVF9JbnQqKXZhbHVlOwotCi0KLSAgICAgIHZhbFswXSA9IGRhcmtlbl9wYXJhbXNbMF07Ci0gICAgICB2YWxbMV0gPSBkYXJrZW5fcGFyYW1zWzFdOwotICAgICAgdmFsWzJdID0gZGFya2VuX3BhcmFtc1syXTsKLSAgICAgIHZhbFszXSA9IGRhcmtlbl9wYXJhbXNbM107Ci0gICAgICB2YWxbNF0gPSBkYXJrZW5fcGFyYW1zWzRdOwotICAgICAgdmFsWzVdID0gZGFya2VuX3BhcmFtc1s1XTsKLSAgICAgIHZhbFs2XSA9IGRhcmtlbl9wYXJhbXNbNl07Ci0gICAgICB2YWxbN10gPSBkYXJrZW5fcGFyYW1zWzddOwotCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAhZnRfc3RyY21wKCBwcm9wZXJ0eV9uYW1lLCAiaGludGluZy1lbmdpbmUiICkgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgICBoaW50aW5nX2VuZ2luZSAgICA9IGRyaXZlci0+aGludGluZ19lbmdpbmU7Ci0gICAgICBGVF9VSW50KiAgdmFsICAgICAgICAgICAgICAgPSAoRlRfVUludCopdmFsdWU7Ci0KLQotICAgICAgKnZhbCA9IGhpbnRpbmdfZW5naW5lOwotCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotICAgIGVsc2UgaWYgKCAhZnRfc3RyY21wKCBwcm9wZXJ0eV9uYW1lLCAibm8tc3RlbS1kYXJrZW5pbmciICkgKQotICAgIHsKLSAgICAgIEZUX0Jvb2wgICBub19zdGVtX2RhcmtlbmluZyA9IGRyaXZlci0+bm9fc3RlbV9kYXJrZW5pbmc7Ci0gICAgICBGVF9Cb29sKiAgdmFsICAgICAgICAgICAgICAgPSAoRlRfQm9vbCopdmFsdWU7Ci0KLQotICAgICAgKnZhbCA9IG5vX3N0ZW1fZGFya2VuaW5nOwotCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0UwKCggImNmZl9wcm9wZXJ0eV9nZXQ6IG1pc3NpbmcgcHJvcGVydHkgYCVzJ1xuIiwKLSAgICAgICAgICAgICAgICBwcm9wZXJ0eV9uYW1lICkpOwotICAgIHJldHVybiBGVF9USFJPVyggTWlzc2luZ19Qcm9wZXJ0eSApOwotICB9Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRV9QUk9QRVJUSUVTUkVDKAotICAgIGNmZl9zZXJ2aWNlX3Byb3BlcnRpZXMsCi0gICAgKEZUX1Byb3BlcnRpZXNfU2V0RnVuYyljZmZfcHJvcGVydHlfc2V0LAotICAgIChGVF9Qcm9wZXJ0aWVzX0dldEZ1bmMpY2ZmX3Byb3BlcnR5X2dldCApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgIEQgUiBJIFYgRSBSICBJIE4gVCBFIFIgRiBBIEMgRSAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9OT19HTFlQSF9OQU1FUwotICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM3KAotICAgIGNmZl9zZXJ2aWNlcywKLSAgICBGVF9TRVJWSUNFX0lEX0ZPTlRfRk9STUFULCAgICAgICAgICBGVF9GT05UX0ZPUk1BVF9DRkYsCi0gICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0lORk8sICAgICAgJkNGRl9TRVJWSUNFX1BTX0lORk9fR0VULAotICAgIEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9GT05UX05BTUUsICZDRkZfU0VSVklDRV9QU19OQU1FX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX0dMWVBIX0RJQ1QsICAgICAgICAgICAmQ0ZGX1NFUlZJQ0VfR0xZUEhfRElDVF9HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9UVF9DTUFQLCAgICAgICAgICAgICAgJkNGRl9TRVJWSUNFX0dFVF9DTUFQX0lORk9fR0VULAotICAgIEZUX1NFUlZJQ0VfSURfQ0lELCAgICAgICAgICAgICAgICAgICZDRkZfU0VSVklDRV9DSURfSU5GT19HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9QUk9QRVJUSUVTLCAgICAgICAgICAgJkNGRl9TRVJWSUNFX1BST1BFUlRJRVNfR0VUCi0gICkKLSNlbHNlCi0gIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzYoCi0gICAgY2ZmX3NlcnZpY2VzLAotICAgIEZUX1NFUlZJQ0VfSURfRk9OVF9GT1JNQVQsICAgICAgICAgIEZUX0ZPTlRfRk9STUFUX0NGRiwKLSAgICBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfSU5GTywgICAgICAmQ0ZGX1NFUlZJQ0VfUFNfSU5GT19HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0ZPTlRfTkFNRSwgJkNGRl9TRVJWSUNFX1BTX05BTUVfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfVFRfQ01BUCwgICAgICAgICAgICAgICZDRkZfU0VSVklDRV9HRVRfQ01BUF9JTkZPX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX0NJRCwgICAgICAgICAgICAgICAgICAmQ0ZGX1NFUlZJQ0VfQ0lEX0lORk9fR0VULAotICAgIEZUX1NFUlZJQ0VfSURfUFJPUEVSVElFUywgICAgICAgICAgICZDRkZfU0VSVklDRV9QUk9QRVJUSUVTX0dFVAotICApCi0jZW5kaWYKLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfTW9kdWxlX0ludGVyZmFjZSApCi0gIGNmZl9nZXRfaW50ZXJmYWNlKCBGVF9Nb2R1bGUgICAgZHJpdmVyLCAgICAgICAvKiBDRkZfRHJpdmVyICovCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgbW9kdWxlX2ludGVyZmFjZSApCi0gIHsKLSAgICBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5OwotICAgIEZUX01vZHVsZSAgICAgICAgICAgIHNmbnQ7Ci0gICAgRlRfTW9kdWxlX0ludGVyZmFjZSAgcmVzdWx0OwotCi0KLSAgICAvKiBDRkZfU0VSVklDRVNfR0VUIGRlcmVmZXJlbmNlcyBgbGlicmFyeScgaW4gUElDIG1vZGUgKi8KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotICAgIGlmICggIWRyaXZlciApCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICBsaWJyYXJ5ID0gZHJpdmVyLT5saWJyYXJ5OwotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0jZW5kaWYKLQotICAgIHJlc3VsdCA9IGZ0X3NlcnZpY2VfbGlzdF9sb29rdXAoIENGRl9TRVJWSUNFU19HRVQsIG1vZHVsZV9pbnRlcmZhY2UgKTsKLSAgICBpZiAoIHJlc3VsdCAhPSBOVUxMICkKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgICAvKiBgZHJpdmVyJyBpcyBub3QgeWV0IGV2YWx1YXRlZCBpbiBub24tUElDIG1vZGUgKi8KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSAgICBpZiAoICFkcml2ZXIgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgbGlicmFyeSA9IGRyaXZlci0+bGlicmFyeTsKLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBOVUxMOwotI2VuZGlmCi0KLSAgICAvKiB3ZSBwYXNzIG91ciByZXF1ZXN0IHRvIHRoZSBgc2ZudCcgbW9kdWxlICovCi0gICAgc2ZudCA9IEZUX0dldF9Nb2R1bGUoIGxpYnJhcnksICJzZm50IiApOwotCi0gICAgcmV0dXJuIHNmbnQgPyBzZm50LT5jbGF6ei0+Z2V0X2ludGVyZmFjZSggc2ZudCwgbW9kdWxlX2ludGVyZmFjZSApIDogMDsKLSAgfQotCi0KLSAgLyogVGhlIEZUX0RyaXZlckludGVyZmFjZSBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBmdGRyaXZlci5oLiAqLwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCi0jZGVmaW5lIENGRl9TSVpFX1NFTEVDVCBjZmZfc2l6ZV9zZWxlY3QKLSNlbHNlCi0jZGVmaW5lIENGRl9TSVpFX1NFTEVDVCAwCi0jZW5kaWYKLQotICBGVF9ERUZJTkVfRFJJVkVSKAotICAgIGNmZl9kcml2ZXJfY2xhc3MsCi0KLSAgICAgIEZUX01PRFVMRV9GT05UX0RSSVZFUiAgICAgICB8Ci0gICAgICBGVF9NT0RVTEVfRFJJVkVSX1NDQUxBQkxFICAgfAotICAgICAgRlRfTU9EVUxFX0RSSVZFUl9IQVNfSElOVEVSLAotCi0gICAgICBzaXplb2YgKCBDRkZfRHJpdmVyUmVjICksCi0gICAgICAiY2ZmIiwKLSAgICAgIDB4MTAwMDBMLAotICAgICAgMHgyMDAwMEwsCi0KLSAgICAgIDAsICAgLyogbW9kdWxlLXNwZWNpZmljIGludGVyZmFjZSAqLwotCi0gICAgICBjZmZfZHJpdmVyX2luaXQsCi0gICAgICBjZmZfZHJpdmVyX2RvbmUsCi0gICAgICBjZmZfZ2V0X2ludGVyZmFjZSwKLQotICAgIC8qIG5vdyB0aGUgc3BlY2lmaWMgZHJpdmVyIGZpZWxkcyAqLwotICAgIHNpemVvZiAoIFRUX0ZhY2VSZWMgKSwKLSAgICBzaXplb2YgKCBDRkZfU2l6ZVJlYyApLAotICAgIHNpemVvZiAoIENGRl9HbHlwaFNsb3RSZWMgKSwKLQotICAgIGNmZl9mYWNlX2luaXQsCi0gICAgY2ZmX2ZhY2VfZG9uZSwKLSAgICBjZmZfc2l6ZV9pbml0LAotICAgIGNmZl9zaXplX2RvbmUsCi0gICAgY2ZmX3Nsb3RfaW5pdCwKLSAgICBjZmZfc2xvdF9kb25lLAotCi0gICAgY2ZmX2dseXBoX2xvYWQsCi0KLSAgICBjZmZfZ2V0X2tlcm5pbmcsCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIEZUX0ZhY2VfQXR0YWNoRnVuYyAqLwotICAgIGNmZl9nZXRfYWR2YW5jZXMsCi0KLSAgICBjZmZfc2l6ZV9yZXF1ZXN0LAotCi0gICAgQ0ZGX1NJWkVfU0VMRUNUCi0gICkKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmZHJpdnIuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmZHJpdnIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUyN2Y1ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZmRyaXZyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZkcml2ci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSGlnaC1sZXZlbCBPcGVuVHlwZSBkcml2ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19DRkZEUklWRVJfSF9fCi0jZGVmaW5lIF9fQ0ZGRFJJVkVSX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfRFJJVkVSX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0RFQ0xBUkVfRFJJVkVSKCBjZmZfZHJpdmVyX2NsYXNzICkKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0NGRkRSSVZFUl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmZXJycy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZlcnJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0M2JkYjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZlcnJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZlcnJzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ0ZGIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIENGRiBlcnJvciBlbnVtZXJhdGlvbiBjb25zdGFudHMuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fQ0ZGRVJSU19IX18KLSNkZWZpbmUgX19DRkZFUlJTX0hfXwotCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKLQotI3VuZGVmIF9fRlRFUlJPUlNfSF9fCi0KLSN1bmRlZiAgRlRfRVJSX1BSRUZJWAotI2RlZmluZSBGVF9FUlJfUFJFRklYICBDRkZfRXJyXwotI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX0NGRgotCi0KLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0KLSNlbmRpZiAvKiBfX0NGRkVSUlNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZmdsb2FkLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZmdsb2FkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNTc0MDMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZnbG9hZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZnbG9hZC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgT3BlblR5cGUgR2x5cGggTG9hZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NGTlRfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9DRkZfRFJJVkVSX0gKLQotI2luY2x1ZGUgImNmZm9ianMuaCIKLSNpbmNsdWRlICJjZmZsb2FkLmgiCi0jaW5jbHVkZSAiY2ZmZ2xvYWQuaCIKLSNpbmNsdWRlICJjZjJmdC5oIiAgICAgIC8qIGZvciBjZjJfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyAqLwotCi0jaW5jbHVkZSAiY2ZmZXJycy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfY2ZmZ2xvYWQKLQotCi0jaWZkZWYgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORQotCi0gIHR5cGVkZWYgZW51bSAgQ0ZGX09wZXJhdG9yXwotICB7Ci0gICAgY2ZmX29wX3Vua25vd24gPSAwLAotCi0gICAgY2ZmX29wX3Jtb3ZldG8sCi0gICAgY2ZmX29wX2htb3ZldG8sCi0gICAgY2ZmX29wX3Ztb3ZldG8sCi0KLSAgICBjZmZfb3BfcmxpbmV0bywKLSAgICBjZmZfb3BfaGxpbmV0bywKLSAgICBjZmZfb3BfdmxpbmV0bywKLQotICAgIGNmZl9vcF9ycmN1cnZldG8sCi0gICAgY2ZmX29wX2hoY3VydmV0bywKLSAgICBjZmZfb3BfaHZjdXJ2ZXRvLAotICAgIGNmZl9vcF9yY3VydmVsaW5lLAotICAgIGNmZl9vcF9ybGluZWN1cnZlLAotICAgIGNmZl9vcF92aGN1cnZldG8sCi0gICAgY2ZmX29wX3Z2Y3VydmV0bywKLQotICAgIGNmZl9vcF9mbGV4LAotICAgIGNmZl9vcF9oZmxleCwKLSAgICBjZmZfb3BfaGZsZXgxLAotICAgIGNmZl9vcF9mbGV4MSwKLQotICAgIGNmZl9vcF9lbmRjaGFyLAotCi0gICAgY2ZmX29wX2hzdGVtLAotICAgIGNmZl9vcF92c3RlbSwKLSAgICBjZmZfb3BfaHN0ZW1obSwKLSAgICBjZmZfb3BfdnN0ZW1obSwKLQotICAgIGNmZl9vcF9oaW50bWFzaywKLSAgICBjZmZfb3BfY250cm1hc2ssCi0gICAgY2ZmX29wX2RvdHNlY3Rpb24sICAvKiBkZXByZWNhdGVkLCBhY3RzIGFzIG5vLW9wICovCi0KLSAgICBjZmZfb3BfYWJzLAotICAgIGNmZl9vcF9hZGQsCi0gICAgY2ZmX29wX3N1YiwKLSAgICBjZmZfb3BfZGl2LAotICAgIGNmZl9vcF9uZWcsCi0gICAgY2ZmX29wX3JhbmRvbSwKLSAgICBjZmZfb3BfbXVsLAotICAgIGNmZl9vcF9zcXJ0LAotCi0gICAgY2ZmX29wX2JsZW5kLAotCi0gICAgY2ZmX29wX2Ryb3AsCi0gICAgY2ZmX29wX2V4Y2gsCi0gICAgY2ZmX29wX2luZGV4LAotICAgIGNmZl9vcF9yb2xsLAotICAgIGNmZl9vcF9kdXAsCi0KLSAgICBjZmZfb3BfcHV0LAotICAgIGNmZl9vcF9nZXQsCi0gICAgY2ZmX29wX3N0b3JlLAotICAgIGNmZl9vcF9sb2FkLAotCi0gICAgY2ZmX29wX2FuZCwKLSAgICBjZmZfb3Bfb3IsCi0gICAgY2ZmX29wX25vdCwKLSAgICBjZmZfb3BfZXEsCi0gICAgY2ZmX29wX2lmZWxzZSwKLQotICAgIGNmZl9vcF9jYWxsc3ViciwKLSAgICBjZmZfb3BfY2FsbGdzdWJyLAotICAgIGNmZl9vcF9yZXR1cm4sCi0KLSAgICAvKiBUeXBlIDEgb3Bjb2RlczogaW52YWxpZCBidXQgc2VlbiBpbiByZWFsIGxpZmUgKi8KLSAgICBjZmZfb3BfaHNidywKLSAgICBjZmZfb3BfY2xvc2VwYXRoLAotICAgIGNmZl9vcF9jYWxsb3RoZXJzdWJyLAotICAgIGNmZl9vcF9wb3AsCi0gICAgY2ZmX29wX3NlYWMsCi0gICAgY2ZmX29wX3NidywKLSAgICBjZmZfb3Bfc2V0Y3VycmVudHBvaW50LAotCi0gICAgLyogZG8gbm90IHJlbW92ZSAqLwotICAgIGNmZl9vcF9tYXgKLQotICB9IENGRl9PcGVyYXRvcjsKLQotCi0jZGVmaW5lIENGRl9DT1VOVF9DSEVDS19XSURUSCAgMHg4MAotI2RlZmluZSBDRkZfQ09VTlRfRVhBQ1QgICAgICAgIDB4NDAKLSNkZWZpbmUgQ0ZGX0NPVU5UX0NMRUFSX1NUQUNLICAweDIwCi0KLSAgLyogY291bnQgdmFsdWVzIHdoaWNoIGhhdmUgdGhlIGBDRkZfQ09VTlRfQ0hFQ0tfV0lEVEgnIGZsYWcgc2V0IGFyZSAgKi8KLSAgLyogdXNlZCBmb3IgY2hlY2tpbmcgdGhlIHdpZHRoIGFuZCByZXF1ZXN0ZWQgbnVtYmVycyBvZiBhcmd1bWVudHMgICAgKi8KLSAgLyogb25seTsgdGhleSBhcmUgc2V0IHRvIHplcm8gYWZ0ZXJ3YXJkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiB0aGUgb3RoZXIgdHdvIGZsYWdzIGFyZSBpbmZvcm1hdGl2ZSBvbmx5IGFuZCB1bnVzZWQgY3VycmVudGx5ICAgICAqLwotCi0gIHN0YXRpYyBjb25zdCBGVF9CeXRlICBjZmZfYXJndW1lbnRfY291bnRzW10gPQotICB7Ci0gICAgMCwgIC8qIHVua25vd24gKi8KLQotICAgIDIgfCBDRkZfQ09VTlRfQ0hFQ0tfV0lEVEggfCBDRkZfQ09VTlRfRVhBQ1QsIC8qIHJtb3ZldG8gKi8KLSAgICAxIHwgQ0ZGX0NPVU5UX0NIRUNLX1dJRFRIIHwgQ0ZGX0NPVU5UX0VYQUNULAotICAgIDEgfCBDRkZfQ09VTlRfQ0hFQ0tfV0lEVEggfCBDRkZfQ09VTlRfRVhBQ1QsCi0KLSAgICAwIHwgQ0ZGX0NPVU5UX0NMRUFSX1NUQUNLLCAvKiBybGluZXRvICovCi0gICAgMCB8IENGRl9DT1VOVF9DTEVBUl9TVEFDSywKLSAgICAwIHwgQ0ZGX0NPVU5UX0NMRUFSX1NUQUNLLAotCi0gICAgMCB8IENGRl9DT1VOVF9DTEVBUl9TVEFDSywgLyogcnJjdXJ2ZXRvICovCi0gICAgMCB8IENGRl9DT1VOVF9DTEVBUl9TVEFDSywKLSAgICAwIHwgQ0ZGX0NPVU5UX0NMRUFSX1NUQUNLLAotICAgIDAgfCBDRkZfQ09VTlRfQ0xFQVJfU1RBQ0ssCi0gICAgMCB8IENGRl9DT1VOVF9DTEVBUl9TVEFDSywKLSAgICAwIHwgQ0ZGX0NPVU5UX0NMRUFSX1NUQUNLLAotICAgIDAgfCBDRkZfQ09VTlRfQ0xFQVJfU1RBQ0ssCi0KLSAgICAxMywgLyogZmxleCAqLwotICAgIDcsCi0gICAgOSwKLSAgICAxMSwKLQotICAgIDAgfCBDRkZfQ09VTlRfQ0hFQ0tfV0lEVEgsIC8qIGVuZGNoYXIgKi8KLQotICAgIDIgfCBDRkZfQ09VTlRfQ0hFQ0tfV0lEVEgsIC8qIGhzdGVtICovCi0gICAgMiB8IENGRl9DT1VOVF9DSEVDS19XSURUSCwKLSAgICAyIHwgQ0ZGX0NPVU5UX0NIRUNLX1dJRFRILAotICAgIDIgfCBDRkZfQ09VTlRfQ0hFQ0tfV0lEVEgsCi0KLSAgICAwIHwgQ0ZGX0NPVU5UX0NIRUNLX1dJRFRILCAvKiBoaW50bWFzayAqLwotICAgIDAgfCBDRkZfQ09VTlRfQ0hFQ0tfV0lEVEgsIC8qIGNudHJtYXNrICovCi0gICAgMCwgLyogZG90c2VjdGlvbiAqLwotCi0gICAgMSwgLyogYWJzICovCi0gICAgMiwKLSAgICAyLAotICAgIDIsCi0gICAgMSwKLSAgICAwLAotICAgIDIsCi0gICAgMSwKLQotICAgIDEsIC8qIGJsZW5kICovCi0KLSAgICAxLCAvKiBkcm9wICovCi0gICAgMiwKLSAgICAxLAotICAgIDIsCi0gICAgMSwKLQotICAgIDIsIC8qIHB1dCAqLwotICAgIDEsCi0gICAgNCwKLSAgICAzLAotCi0gICAgMiwgLyogYW5kICovCi0gICAgMiwKLSAgICAxLAotICAgIDIsCi0gICAgNCwKLQotICAgIDEsIC8qIGNhbGxzdWJyICovCi0gICAgMSwKLSAgICAwLAotCi0gICAgMiwgLyogaHNidyAqLwotICAgIDAsCi0gICAgMCwKLSAgICAwLAotICAgIDUsIC8qIHNlYWMgKi8KLSAgICA0LCAvKiBzYncgKi8KLSAgICAyICAvKiBzZXRjdXJyZW50cG9pbnQgKi8KLSAgfTsKLQotI2VuZGlmIC8qIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgICAgICAgICAgR0VORVJJQyBDSEFSU1RSSU5HIFBBUlNJTkcgICAgICAgICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNmZl9idWlsZGVyX2luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRpYWxpemVzIGEgZ2l2ZW4gZ2x5cGggYnVpbGRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ1aWxkZXIgOjogQSBwb2ludGVyIHRvIHRoZSBnbHlwaCBidWlsZGVyIHRvIGluaXRpYWxpemUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgOjogVGhlIGN1cnJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSAgICA6OiBUaGUgY3VycmVudCBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaCAgIDo6IFRoZSBjdXJyZW50IGdseXBoIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhpbnRpbmcgOjogV2hldGhlciBoaW50aW5nIGlzIGFjdGl2ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgY2ZmX2J1aWxkZXJfaW5pdCggQ0ZGX0J1aWxkZXIqICAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZGX1NpemUgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZGX0dseXBoU2xvdCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgIGhpbnRpbmcgKQotICB7Ci0gICAgYnVpbGRlci0+cGF0aF9iZWd1biAgPSAwOwotICAgIGJ1aWxkZXItPmxvYWRfcG9pbnRzID0gMTsKLQotICAgIGJ1aWxkZXItPmZhY2UgICA9IGZhY2U7Ci0gICAgYnVpbGRlci0+Z2x5cGggID0gZ2x5cGg7Ci0gICAgYnVpbGRlci0+bWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0KLSAgICBpZiAoIGdseXBoICkKLSAgICB7Ci0gICAgICBGVF9HbHlwaExvYWRlciAgbG9hZGVyID0gZ2x5cGgtPnJvb3QuaW50ZXJuYWwtPmxvYWRlcjsKLQotCi0gICAgICBidWlsZGVyLT5sb2FkZXIgID0gbG9hZGVyOwotICAgICAgYnVpbGRlci0+YmFzZSAgICA9ICZsb2FkZXItPmJhc2Uub3V0bGluZTsKLSAgICAgIGJ1aWxkZXItPmN1cnJlbnQgPSAmbG9hZGVyLT5jdXJyZW50Lm91dGxpbmU7Ci0gICAgICBGVF9HbHlwaExvYWRlcl9SZXdpbmQoIGxvYWRlciApOwotCi0gICAgICBidWlsZGVyLT5oaW50c19nbG9iYWxzID0gTlVMTDsKLSAgICAgIGJ1aWxkZXItPmhpbnRzX2Z1bmNzICAgPSBOVUxMOwotCi0gICAgICBpZiAoIGhpbnRpbmcgJiYgc2l6ZSApCi0gICAgICB7Ci0gICAgICAgIENGRl9JbnRlcm5hbCAgaW50ZXJuYWwgPSAoQ0ZGX0ludGVybmFsKXNpemUtPnJvb3QuaW50ZXJuYWw7Ci0KLQotICAgICAgICBidWlsZGVyLT5oaW50c19nbG9iYWxzID0gKHZvaWQgKilpbnRlcm5hbC0+dG9wZm9udDsKLSAgICAgICAgYnVpbGRlci0+aGludHNfZnVuY3MgICA9IGdseXBoLT5yb290LmludGVybmFsLT5nbHlwaF9oaW50czsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBidWlsZGVyLT5wb3NfeCA9IDA7Ci0gICAgYnVpbGRlci0+cG9zX3kgPSAwOwotCi0gICAgYnVpbGRlci0+bGVmdF9iZWFyaW5nLnggPSAwOwotICAgIGJ1aWxkZXItPmxlZnRfYmVhcmluZy55ID0gMDsKLSAgICBidWlsZGVyLT5hZHZhbmNlLnggICAgICA9IDA7Ci0gICAgYnVpbGRlci0+YWR2YW5jZS55ICAgICAgPSAwOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjZmZfYnVpbGRlcl9kb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5hbGl6ZXMgYSBnaXZlbiBnbHlwaCBidWlsZGVyLiAgSXRzIGNvbnRlbnRzIGNhbiBzdGlsbCBiZSB1c2VkICAgKi8KLSAgLyogICAgYWZ0ZXIgdGhlIGNhbGwsIGJ1dCB0aGUgZnVuY3Rpb24gc2F2ZXMgaW1wb3J0YW50IGluZm9ybWF0aW9uICAgICAgICovCi0gIC8qICAgIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZyBnbHlwaCBzbG90LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJ1aWxkZXIgOjogQSBwb2ludGVyIHRvIHRoZSBnbHlwaCBidWlsZGVyIHRvIGZpbmFsaXplLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgY2ZmX2J1aWxkZXJfZG9uZSggQ0ZGX0J1aWxkZXIqICBidWlsZGVyICkKLSAgewotICAgIENGRl9HbHlwaFNsb3QgIGdseXBoID0gYnVpbGRlci0+Z2x5cGg7Ci0KLQotICAgIGlmICggZ2x5cGggKQotICAgICAgZ2x5cGgtPnJvb3Qub3V0bGluZSA9ICpidWlsZGVyLT5iYXNlOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjZmZfY29tcHV0ZV9iaWFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlcyB0aGUgYmlhcyB2YWx1ZSBpbiBkZXBlbmRlbmNlIG9mIHRoZSBudW1iZXIgb2YgZ2x5cGggICAgICAgKi8KLSAgLyogICAgc3Vicm91dGluZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW5fY2hhcnN0cmluZ190eXBlIDo6IFRoZSBgQ2hhcnN0cmluZ1R5cGUnIHZhbHVlIG9mIHRoZSB0b3AgRElDVCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX3N1YnJzICAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgZ2x5cGggc3Vicm91dGluZXMuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGJpYXMgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9JbnQKLSAgY2ZmX2NvbXB1dGVfYmlhcyggRlRfSW50ICAgaW5fY2hhcnN0cmluZ190eXBlLAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBudW1fc3VicnMgKQotICB7Ci0gICAgRlRfSW50ICByZXN1bHQ7Ci0KLQotICAgIGlmICggaW5fY2hhcnN0cmluZ190eXBlID09IDEgKQotICAgICAgcmVzdWx0ID0gMDsKLSAgICBlbHNlIGlmICggbnVtX3N1YnJzIDwgMTI0MCApCi0gICAgICByZXN1bHQgPSAxMDc7Ci0gICAgZWxzZSBpZiAoIG51bV9zdWJycyA8IDMzOTAwVSApCi0gICAgICByZXN1bHQgPSAxMTMxOwotICAgIGVsc2UKLSAgICAgIHJlc3VsdCA9IDMyNzY4VTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNmZl9kZWNvZGVyX2luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRpYWxpemVzIGEgZ2l2ZW4gZ2x5cGggZGVjb2Rlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlY29kZXIgOjogQSBwb2ludGVyIHRvIHRoZSBnbHlwaCBidWlsZGVyIHRvIGluaXRpYWxpemUuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICA6OiBUaGUgY3VycmVudCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSAgICAgIDo6IFRoZSBjdXJyZW50IHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzbG90ICAgICAgOjogVGhlIGN1cnJlbnQgZ2x5cGggb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhpbnRpbmcgICA6OiBXaGV0aGVyIGhpbnRpbmcgaXMgYWN0aXZlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaGludF9tb2RlIDo6IFRoZSBoaW50aW5nIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZmZfZGVjb2Rlcl9pbml0KCBDRkZfRGVjb2RlciogICAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIENGRl9TaXplICAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICBDRkZfR2x5cGhTbG90ICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgIGhpbnRpbmcsCi0gICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICBoaW50X21vZGUgKQotICB7Ci0gICAgQ0ZGX0ZvbnQgIGNmZiA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotCi0KLSAgICAvKiBjbGVhciBldmVyeXRoaW5nICovCi0gICAgRlRfTUVNX1pFUk8oIGRlY29kZXIsIHNpemVvZiAoICpkZWNvZGVyICkgKTsKLQotICAgIC8qIGluaXRpYWxpemUgYnVpbGRlciAqLwotICAgIGNmZl9idWlsZGVyX2luaXQoICZkZWNvZGVyLT5idWlsZGVyLCBmYWNlLCBzaXplLCBzbG90LCBoaW50aW5nICk7Ci0KLSAgICAvKiBpbml0aWFsaXplIFR5cGUyIGRlY29kZXIgKi8KLSAgICBkZWNvZGVyLT5jZmYgICAgICAgICAgPSBjZmY7Ci0gICAgZGVjb2Rlci0+bnVtX2dsb2JhbHMgID0gY2ZmLT5nbG9iYWxfc3VicnNfaW5kZXguY291bnQ7Ci0gICAgZGVjb2Rlci0+Z2xvYmFscyAgICAgID0gY2ZmLT5nbG9iYWxfc3VicnM7Ci0gICAgZGVjb2Rlci0+Z2xvYmFsc19iaWFzID0gY2ZmX2NvbXB1dGVfYmlhcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZi0+dG9wX2ZvbnQuZm9udF9kaWN0LmNoYXJzdHJpbmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXItPm51bV9nbG9iYWxzICk7Ci0KLSAgICBkZWNvZGVyLT5oaW50X21vZGUgICAgPSBoaW50X21vZGU7Ci0gIH0KLQotCi0gIC8qIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZWxlY3QgdGhlIHN1YmZvbnQgKi8KLSAgLyogYW5kIHRoZSBsb2NhbHMgc3VicnMgYXJyYXkgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2ZmX2RlY29kZXJfcHJlcGFyZSggQ0ZGX0RlY29kZXIqICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICBDRkZfU2l6ZSAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGhfaW5kZXggKQotICB7Ci0gICAgQ0ZGX0J1aWxkZXIgICpidWlsZGVyID0gJmRlY29kZXItPmJ1aWxkZXI7Ci0gICAgQ0ZGX0ZvbnQgICAgICBjZmYgICAgID0gKENGRl9Gb250KWJ1aWxkZXItPmZhY2UtPmV4dHJhLmRhdGE7Ci0gICAgQ0ZGX1N1YkZvbnQgICBzdWIgICAgID0gJmNmZi0+dG9wX2ZvbnQ7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvciAgID0gRlRfRXJyX09rOwotCi0KLSAgICAvKiBtYW5hZ2UgQ0lEIGZvbnRzICovCi0gICAgaWYgKCBjZmYtPm51bV9zdWJmb250cyApCi0gICAgewotICAgICAgRlRfQnl0ZSAgZmRfaW5kZXggPSBjZmZfZmRfc2VsZWN0X2dldCggJmNmZi0+ZmRfc2VsZWN0LCBnbHlwaF9pbmRleCApOwotCi0KLSAgICAgIGlmICggZmRfaW5kZXggPj0gY2ZmLT5udW1fc3ViZm9udHMgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTQoKCAiY2ZmX2RlY29kZXJfcHJlcGFyZTogaW52YWxpZCBDSUQgc3ViZm9udCBpbmRleFxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIEZUX1RSQUNFMygoICIgIGluIHN1YmZvbnQgJWQ6XG4iLCBmZF9pbmRleCApKTsKLQotICAgICAgc3ViID0gY2ZmLT5zdWJmb250c1tmZF9pbmRleF07Ci0KLSAgICAgIGlmICggYnVpbGRlci0+aGludHNfZnVuY3MgJiYgc2l6ZSApCi0gICAgICB7Ci0gICAgICAgIENGRl9JbnRlcm5hbCAgaW50ZXJuYWwgPSAoQ0ZGX0ludGVybmFsKXNpemUtPnJvb3QuaW50ZXJuYWw7Ci0KLQotICAgICAgICAvKiBmb3IgQ0ZGcyB3aXRob3V0IHN1YmZvbnRzLCB0aGlzIHZhbHVlIGhhcyBhbHJlYWR5IGJlZW4gc2V0ICovCi0gICAgICAgIGJ1aWxkZXItPmhpbnRzX2dsb2JhbHMgPSAodm9pZCAqKWludGVybmFsLT5zdWJmb250c1tmZF9pbmRleF07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZGVjb2Rlci0+bnVtX2xvY2FscyAgICA9IHN1Yi0+bG9jYWxfc3VicnNfaW5kZXguY291bnQ7Ci0gICAgZGVjb2Rlci0+bG9jYWxzICAgICAgICA9IHN1Yi0+bG9jYWxfc3VicnM7Ci0gICAgZGVjb2Rlci0+bG9jYWxzX2JpYXMgICA9IGNmZl9jb21wdXRlX2JpYXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci0+Y2ZmLT50b3BfZm9udC5mb250X2RpY3QuY2hhcnN0cmluZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXItPm51bV9sb2NhbHMgKTsKLQotICAgIGRlY29kZXItPmdseXBoX3dpZHRoICAgPSBzdWItPnByaXZhdGVfZGljdC5kZWZhdWx0X3dpZHRoOwotICAgIGRlY29kZXItPm5vbWluYWxfd2lkdGggPSBzdWItPnByaXZhdGVfZGljdC5ub21pbmFsX3dpZHRoOwotCi0gICAgZGVjb2Rlci0+Y3VycmVudF9zdWJmb250ID0gc3ViOyAgICAgLyogZm9yIEFkb2JlJ3MgQ0ZGIGhhbmRsZXIgKi8KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogY2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgZm9yIGBjb3VudCcgbW9yZSBwb2ludHMgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNmZl9jaGVja19wb2ludHMoIENGRl9CdWlsZGVyKiAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICBjb3VudCApCi0gIHsKLSAgICByZXR1cm4gRlRfR0xZUEhMT0FERVJfQ0hFQ0tfUE9JTlRTKCBidWlsZGVyLT5sb2FkZXIsIGNvdW50LCAwICk7Ci0gIH0KLQotCi0gIC8qIGFkZCBhIG5ldyBwb2ludCwgZG8gbm90IGNoZWNrIHNwYWNlICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmZl9idWlsZGVyX2FkZF9wb2ludCggQ0ZGX0J1aWxkZXIqICBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSAgICAgICBmbGFnICkKLSAgewotICAgIEZUX091dGxpbmUqICBvdXRsaW5lID0gYnVpbGRlci0+Y3VycmVudDsKLQotCi0gICAgaWYgKCBidWlsZGVyLT5sb2FkX3BvaW50cyApCi0gICAgewotICAgICAgRlRfVmVjdG9yKiAgcG9pbnQgICA9IG91dGxpbmUtPnBvaW50cyArIG91dGxpbmUtPm5fcG9pbnRzOwotICAgICAgRlRfQnl0ZSogICAgY29udHJvbCA9IChGVF9CeXRlKilvdXRsaW5lLT50YWdzICsgb3V0bGluZS0+bl9wb2ludHM7Ci0KLSNpZmRlZiBDRkZfQ09ORklHX09QVElPTl9PTERfRU5HSU5FCi0gICAgICBDRkZfRHJpdmVyICBkcml2ZXIgID0gKENGRl9Ecml2ZXIpRlRfRkFDRV9EUklWRVIoIGJ1aWxkZXItPmZhY2UgKTsKLQotCi0gICAgICBpZiAoIGRyaXZlci0+aGludGluZ19lbmdpbmUgPT0gRlRfQ0ZGX0hJTlRJTkdfRlJFRVRZUEUgKQotICAgICAgewotICAgICAgICBwb2ludC0+eCA9IHggPj4gMTY7Ci0gICAgICAgIHBvaW50LT55ID0geSA+PiAxNjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgewotICAgICAgICAvKiBjZjJfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyB1c2VzIDE2LjE2IGNvb3JkaW5hdGVzICovCi0gICAgICAgIHBvaW50LT54ID0geCA+PiAxMDsKLSAgICAgICAgcG9pbnQtPnkgPSB5ID4+IDEwOwotICAgICAgfQotICAgICAgKmNvbnRyb2wgPSAoRlRfQnl0ZSkoIGZsYWcgPyBGVF9DVVJWRV9UQUdfT04gOiBGVF9DVVJWRV9UQUdfQ1VCSUMgKTsKLSAgICB9Ci0KLSAgICBvdXRsaW5lLT5uX3BvaW50cysrOwotICB9Ci0KLQotICAvKiBjaGVjayBzcGFjZSBmb3IgYSBuZXcgb24tY3VydmUgcG9pbnQsIHRoZW4gYWRkIGl0ICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQxKCBDRkZfQnVpbGRlciogIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICB5ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgZXJyb3IgPSBjZmZfY2hlY2tfcG9pbnRzKCBidWlsZGVyLCAxICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGNoZWNrIHNwYWNlIGZvciBhIG5ldyBjb250b3VyLCB0aGVuIGFkZCBpdCAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2ZmX2J1aWxkZXJfYWRkX2NvbnRvdXIoIENGRl9CdWlsZGVyKiAgYnVpbGRlciApCi0gIHsKLSAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSA9IGJ1aWxkZXItPmN1cnJlbnQ7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yOwotCi0KLSAgICBpZiAoICFidWlsZGVyLT5sb2FkX3BvaW50cyApCi0gICAgewotICAgICAgb3V0bGluZS0+bl9jb250b3VycysrOwotICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICB9Ci0KLSAgICBlcnJvciA9IEZUX0dMWVBITE9BREVSX0NIRUNLX1BPSU5UUyggYnVpbGRlci0+bG9hZGVyLCAwLCAxICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGlmICggb3V0bGluZS0+bl9jb250b3VycyA+IDAgKQotICAgICAgICBvdXRsaW5lLT5jb250b3Vyc1tvdXRsaW5lLT5uX2NvbnRvdXJzIC0gMV0gPQotICAgICAgICAgIChzaG9ydCkoIG91dGxpbmUtPm5fcG9pbnRzIC0gMSApOwotCi0gICAgICBvdXRsaW5lLT5uX2NvbnRvdXJzKys7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBpZiBhIHBhdGggd2FzIGJlZ3VuLCBhZGQgaXRzIGZpcnN0IG9uLWN1cnZlIHBvaW50ICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjZmZfYnVpbGRlcl9zdGFydF9wb2ludCggQ0ZGX0J1aWxkZXIqICBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICB5ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0gICAgLyogdGVzdCB3aGV0aGVyIHdlIGFyZSBidWlsZGluZyBhIG5ldyBjb250b3VyICovCi0gICAgaWYgKCAhYnVpbGRlci0+cGF0aF9iZWd1biApCi0gICAgewotICAgICAgYnVpbGRlci0+cGF0aF9iZWd1biA9IDE7Ci0gICAgICBlcnJvciA9IGNmZl9idWlsZGVyX2FkZF9jb250b3VyKCBidWlsZGVyICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIGVycm9yID0gY2ZmX2J1aWxkZXJfYWRkX3BvaW50MSggYnVpbGRlciwgeCwgeSApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogY2xvc2UgdGhlIGN1cnJlbnQgY29udG91ciAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZmZfYnVpbGRlcl9jbG9zZV9jb250b3VyKCBDRkZfQnVpbGRlciogIGJ1aWxkZXIgKQotICB7Ci0gICAgRlRfT3V0bGluZSogIG91dGxpbmUgPSBidWlsZGVyLT5jdXJyZW50OwotICAgIEZUX0ludCAgICAgICBmaXJzdDsKLQotCi0gICAgaWYgKCAhb3V0bGluZSApCi0gICAgICByZXR1cm47Ci0KLSAgICBmaXJzdCA9IG91dGxpbmUtPm5fY29udG91cnMgPD0gMQotICAgICAgICAgICAgPyAwIDogb3V0bGluZS0+Y29udG91cnNbb3V0bGluZS0+bl9jb250b3VycyAtIDJdICsgMTsKLQotICAgIC8qIFdlIG11c3Qgbm90IGluY2x1ZGUgdGhlIGxhc3QgcG9pbnQgaW4gdGhlIHBhdGggaWYgaXQgKi8KLSAgICAvKiBpcyBsb2NhdGVkIG9uIHRoZSBmaXJzdCBwb2ludC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBvdXRsaW5lLT5uX3BvaW50cyA+IDEgKQotICAgIHsKLSAgICAgIEZUX1ZlY3RvciogIHAxICAgICAgPSBvdXRsaW5lLT5wb2ludHMgKyBmaXJzdDsKLSAgICAgIEZUX1ZlY3RvciogIHAyICAgICAgPSBvdXRsaW5lLT5wb2ludHMgKyBvdXRsaW5lLT5uX3BvaW50cyAtIDE7Ci0gICAgICBGVF9CeXRlKiAgICBjb250cm9sID0gKEZUX0J5dGUqKW91dGxpbmUtPnRhZ3MgKyBvdXRsaW5lLT5uX3BvaW50cyAtIDE7Ci0KLQotICAgICAgLyogYGRlbGV0ZScgbGFzdCBwb2ludCBvbmx5IGlmIGl0IGNvaW5jaWRlcyB3aXRoIHRoZSBmaXJzdCAgICAqLwotICAgICAgLyogcG9pbnQgYW5kIGlmIGl0IGlzIG5vdCBhIGNvbnRyb2wgcG9pbnQgKHdoaWNoIGNhbiBoYXBwZW4pLiAqLwotICAgICAgaWYgKCBwMS0+eCA9PSBwMi0+eCAmJiBwMS0+eSA9PSBwMi0+eSApCi0gICAgICAgIGlmICggKmNvbnRyb2wgPT0gRlRfQ1VSVkVfVEFHX09OICkKLSAgICAgICAgICBvdXRsaW5lLT5uX3BvaW50cy0tOwotICAgIH0KLQotICAgIGlmICggb3V0bGluZS0+bl9jb250b3VycyA+IDAgKQotICAgIHsKLSAgICAgIC8qIERvbid0IGFkZCBjb250b3VycyBvbmx5IGNvbnNpc3Rpbmcgb2Ygb25lIHBvaW50LCBpLmUuLCAqLwotICAgICAgLyogY2hlY2sgd2hldGhlciBiZWdpbiBwb2ludCBhbmQgbGFzdCBwb2ludCBhcmUgdGhlIHNhbWUuICovCi0gICAgICBpZiAoIGZpcnN0ID09IG91dGxpbmUtPm5fcG9pbnRzIC0gMSApCi0gICAgICB7Ci0gICAgICAgIG91dGxpbmUtPm5fY29udG91cnMtLTsKLSAgICAgICAgb3V0bGluZS0+bl9wb2ludHMtLTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgb3V0bGluZS0+Y29udG91cnNbb3V0bGluZS0+bl9jb250b3VycyAtIDFdID0KLSAgICAgICAgICAoc2hvcnQpKCBvdXRsaW5lLT5uX3BvaW50cyAtIDEgKTsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfSW50ICkKLSAgY2ZmX2xvb2t1cF9nbHlwaF9ieV9zdGRjaGFyY29kZSggQ0ZGX0ZvbnQgIGNmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgIGNoYXJjb2RlICkKLSAgewotICAgIEZUX1VJbnQgICAgbjsKLSAgICBGVF9VU2hvcnQgIGdseXBoX3NpZDsKLQotCi0gICAgLyogQ0lELWtleWVkIGZvbnRzIGRvbid0IGhhdmUgZ2x5cGggbmFtZXMgKi8KLSAgICBpZiAoICFjZmYtPmNoYXJzZXQuc2lkcyApCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgICAvKiBjaGVjayByYW5nZSBvZiBzdGFuZGFyZCBjaGFyIGNvZGUgKi8KLSAgICBpZiAoIGNoYXJjb2RlIDwgMCB8fCBjaGFyY29kZSA+IDI1NSApCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgICAvKiBHZXQgY29kZSB0byBTSUQgbWFwcGluZyBmcm9tIGBjZmZfc3RhbmRhcmRfZW5jb2RpbmcnLiAqLwotICAgIGdseXBoX3NpZCA9IGNmZl9nZXRfc3RhbmRhcmRfZW5jb2RpbmcoIChGVF9VSW50KWNoYXJjb2RlICk7Ci0KLSAgICBmb3IgKCBuID0gMDsgbiA8IGNmZi0+bnVtX2dseXBoczsgbisrICkKLSAgICB7Ci0gICAgICBpZiAoIGNmZi0+Y2hhcnNldC5zaWRzW25dID09IGdseXBoX3NpZCApCi0gICAgICAgIHJldHVybiAoRlRfSW50KW47Ci0gICAgfQotCi0gICAgcmV0dXJuIC0xOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2ZmX2dldF9nbHlwaF9kYXRhKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBvaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICBsZW5ndGggKQotICB7Ci0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgIC8qIEZvciBpbmNyZW1lbnRhbCBmb250cyBnZXQgdGhlIGNoYXJhY3RlciBkYXRhIHVzaW5nIHRoZSAqLwotICAgIC8qIGNhbGxiYWNrIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlICkKLSAgICB7Ci0gICAgICBGVF9EYXRhICAgZGF0YTsKLSAgICAgIEZUX0Vycm9yICBlcnJvciA9Ci0gICAgICAgICAgICAgICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPmZ1bmNzLT5nZXRfZ2x5cGhfZGF0YSgKLSAgICAgICAgICAgICAgICAgICAgZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlLT5vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LCAmZGF0YSApOwotCi0KLSAgICAgICpwb2ludGVyID0gKEZUX0J5dGUqKWRhdGEucG9pbnRlcjsKLSAgICAgICpsZW5ndGggID0gKEZUX1VMb25nKWRhdGEubGVuZ3RoOwotCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotICAgIGVsc2UKLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMICovCi0KLSAgICB7Ci0gICAgICBDRkZfRm9udCAgY2ZmICA9IChDRkZfRm9udCkoZmFjZS0+ZXh0cmEuZGF0YSk7Ci0KLQotICAgICAgcmV0dXJuIGNmZl9pbmRleF9hY2Nlc3NfZWxlbWVudCggJmNmZi0+Y2hhcnN0cmluZ3NfaW5kZXgsIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciwgbGVuZ3RoICk7Ci0gICAgfQotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZmZfZnJlZV9nbHlwaF9kYXRhKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgcG9pbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBsZW5ndGggKQotICB7Ci0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICBGVF9VTlVTRUQoIGxlbmd0aCApOwotI2VuZGlmCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgLyogRm9yIGluY3JlbWVudGFsIGZvbnRzIGdldCB0aGUgY2hhcmFjdGVyIGRhdGEgdXNpbmcgdGhlICovCi0gICAgLyogY2FsbGJhY2sgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgKQotICAgIHsKLSAgICAgIEZUX0RhdGEgIGRhdGE7Ci0KLQotICAgICAgZGF0YS5wb2ludGVyID0gKnBvaW50ZXI7Ci0gICAgICBkYXRhLmxlbmd0aCAgPSAoRlRfSW50KWxlbmd0aDsKLQotICAgICAgZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlLT5mdW5jcy0+ZnJlZV9nbHlwaF9kYXRhKAotICAgICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPm9iamVjdCwgJmRhdGEgKTsKLSAgICB9Ci0gICAgZWxzZQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwgKi8KLQotICAgIHsKLSAgICAgIENGRl9Gb250ICBjZmYgPSAoQ0ZGX0ZvbnQpKGZhY2UtPmV4dHJhLmRhdGEpOwotCi0KLSAgICAgIGNmZl9pbmRleF9mb3JnZXRfZWxlbWVudCggJmNmZi0+Y2hhcnN0cmluZ3NfaW5kZXgsIHBvaW50ZXIgKTsKLSAgICB9Ci0gIH0KLQotCi0jaWZkZWYgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfb3BlcmF0b3Jfc2VhYyggQ0ZGX0RlY29kZXIqICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICBhc2IsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgIGFkeCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgYWR5LAotICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICBiY2hhciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgYWNoYXIgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvcjsKLSAgICBDRkZfQnVpbGRlciogIGJ1aWxkZXIgPSAmZGVjb2Rlci0+YnVpbGRlcjsKLSAgICBGVF9JbnQgICAgICAgIGJjaGFyX2luZGV4LCBhY2hhcl9pbmRleDsKLSAgICBUVF9GYWNlICAgICAgIGZhY2UgPSBkZWNvZGVyLT5idWlsZGVyLmZhY2U7Ci0gICAgRlRfVmVjdG9yICAgICBsZWZ0X2JlYXJpbmcsIGFkdmFuY2U7Ci0gICAgRlRfQnl0ZSogICAgICBjaGFyc3RyaW5nOwotICAgIEZUX1VMb25nICAgICAgY2hhcnN0cmluZ19sZW47Ci0gICAgRlRfUG9zICAgICAgICBnbHlwaF93aWR0aDsKLQotCi0gICAgaWYgKCBkZWNvZGVyLT5zZWFjICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJjZmZfb3BlcmF0b3Jfc2VhYzogaW52YWxpZCBuZXN0ZWQgc2VhY1xuIiApKTsKLSAgICAgIHJldHVybiBGVF9USFJPVyggU3ludGF4X0Vycm9yICk7Ci0gICAgfQotCi0gICAgYWR4ICs9IGRlY29kZXItPmJ1aWxkZXIubGVmdF9iZWFyaW5nLng7Ci0gICAgYWR5ICs9IGRlY29kZXItPmJ1aWxkZXIubGVmdF9iZWFyaW5nLnk7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgLyogSW5jcmVtZW50YWwgZm9udHMgZG9uJ3QgbmVjZXNzYXJpbHkgaGF2ZSB2YWxpZCBjaGFyc2V0cy4gICAgICAgICovCi0gICAgLyogVGhleSB1c2UgdGhlIGNoYXJhY3RlciBjb2RlLCBub3QgdGhlIGdseXBoIGluZGV4LCBpbiB0aGlzIGNhc2UuICovCi0gICAgaWYgKCBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgKQotICAgIHsKLSAgICAgIGJjaGFyX2luZGV4ID0gYmNoYXI7Ci0gICAgICBhY2hhcl9pbmRleCA9IGFjaGFyOwotICAgIH0KLSAgICBlbHNlCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCAqLwotICAgIHsKLSAgICAgIENGRl9Gb250IGNmZiA9IChDRkZfRm9udCkoZmFjZS0+ZXh0cmEuZGF0YSk7Ci0KLQotICAgICAgYmNoYXJfaW5kZXggPSBjZmZfbG9va3VwX2dseXBoX2J5X3N0ZGNoYXJjb2RlKCBjZmYsIGJjaGFyICk7Ci0gICAgICBhY2hhcl9pbmRleCA9IGNmZl9sb29rdXBfZ2x5cGhfYnlfc3RkY2hhcmNvZGUoIGNmZiwgYWNoYXIgKTsKLSAgICB9Ci0KLSAgICBpZiAoIGJjaGFyX2luZGV4IDwgMCB8fCBhY2hhcl9pbmRleCA8IDAgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggImNmZl9vcGVyYXRvcl9zZWFjOiIKLSAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIHNlYWMgY2hhcmFjdGVyIGNvZGUgYXJndW1lbnRzXG4iICkpOwotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBTeW50YXhfRXJyb3IgKTsKLSAgICB9Ci0KLSAgICAvKiBJZiB3ZSBhcmUgdHJ5aW5nIHRvIGxvYWQgYSBjb21wb3NpdGUgZ2x5cGgsIGRvIG5vdCBsb2FkIHRoZSAqLwotICAgIC8qIGFjY2VudCBjaGFyYWN0ZXIgYW5kIHJldHVybiB0aGUgYXJyYXkgb2Ygc3ViZ2x5cGhzLiAgICAgICAgICovCi0gICAgaWYgKCBidWlsZGVyLT5ub19yZWN1cnNlICkKLSAgICB7Ci0gICAgICBGVF9HbHlwaFNsb3QgICAgZ2x5cGggID0gKEZUX0dseXBoU2xvdClidWlsZGVyLT5nbHlwaDsKLSAgICAgIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgPSBnbHlwaC0+aW50ZXJuYWwtPmxvYWRlcjsKLSAgICAgIEZUX1N1YkdseXBoICAgICBzdWJnOwotCi0KLSAgICAgIC8qIHJlYWxsb2NhdGUgc3ViZ2x5cGggYXJyYXkgaWYgbmVjZXNzYXJ5ICovCi0gICAgICBlcnJvciA9IEZUX0dseXBoTG9hZGVyX0NoZWNrU3ViR2x5cGhzKCBsb2FkZXIsIDIgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHN1YmcgPSBsb2FkZXItPmN1cnJlbnQuc3ViZ2x5cGhzOwotCi0gICAgICAvKiBzdWJnbHlwaCAwID0gYmFzZSBjaGFyYWN0ZXIgKi8KLSAgICAgIHN1YmctPmluZGV4ID0gYmNoYXJfaW5kZXg7Ci0gICAgICBzdWJnLT5mbGFncyA9IEZUX1NVQkdMWVBIX0ZMQUdfQVJHU19BUkVfWFlfVkFMVUVTIHwKLSAgICAgICAgICAgICAgICAgICAgRlRfU1VCR0xZUEhfRkxBR19VU0VfTVlfTUVUUklDUzsKLSAgICAgIHN1YmctPmFyZzEgID0gMDsKLSAgICAgIHN1YmctPmFyZzIgID0gMDsKLSAgICAgIHN1YmcrKzsKLQotICAgICAgLyogc3ViZ2x5cGggMSA9IGFjY2VudCBjaGFyYWN0ZXIgKi8KLSAgICAgIHN1YmctPmluZGV4ID0gYWNoYXJfaW5kZXg7Ci0gICAgICBzdWJnLT5mbGFncyA9IEZUX1NVQkdMWVBIX0ZMQUdfQVJHU19BUkVfWFlfVkFMVUVTOwotICAgICAgc3ViZy0+YXJnMSAgPSAoRlRfSW50KSggYWR4ID4+IDE2ICk7Ci0gICAgICBzdWJnLT5hcmcyICA9IChGVF9JbnQpKCBhZHkgPj4gMTYgKTsKLQotICAgICAgLyogc2V0IHVwIHJlbWFpbmluZyBnbHlwaCBmaWVsZHMgKi8KLSAgICAgIGdseXBoLT5udW1fc3ViZ2x5cGhzID0gMjsKLSAgICAgIGdseXBoLT5zdWJnbHlwaHMgICAgID0gbG9hZGVyLT5iYXNlLnN1YmdseXBoczsKLSAgICAgIGdseXBoLT5mb3JtYXQgICAgICAgID0gRlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURTsKLQotICAgICAgbG9hZGVyLT5jdXJyZW50Lm51bV9zdWJnbHlwaHMgPSAyOwotICAgIH0KLQotICAgIEZUX0dseXBoTG9hZGVyX1ByZXBhcmUoIGJ1aWxkZXItPmxvYWRlciApOwotCi0gICAgLyogRmlyc3QgbG9hZCBgYmNoYXInIGluIGJ1aWxkZXIgKi8KLSAgICBlcnJvciA9IGNmZl9nZXRfZ2x5cGhfZGF0YSggZmFjZSwgKEZUX1VJbnQpYmNoYXJfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFyc3RyaW5nLCAmY2hhcnN0cmluZ19sZW4gKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgLyogdGhlIHNlYWMgb3BlcmF0b3IgbXVzdCBub3QgYmUgbmVzdGVkICovCi0gICAgICBkZWNvZGVyLT5zZWFjID0gVFJVRTsKLSAgICAgIGVycm9yID0gY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MoIGRlY29kZXIsIGNoYXJzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc3RyaW5nX2xlbiApOwotICAgICAgZGVjb2Rlci0+c2VhYyA9IEZBTFNFOwotCi0gICAgICBjZmZfZnJlZV9nbHlwaF9kYXRhKCBmYWNlLCAmY2hhcnN0cmluZywgY2hhcnN0cmluZ19sZW4gKTsKLQotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBTYXZlIHRoZSBsZWZ0IGJlYXJpbmcsIGFkdmFuY2UgYW5kIGdseXBoIHdpZHRoIG9mIHRoZSBiYXNlICovCi0gICAgLyogY2hhcmFjdGVyIGFzIHRoZXkgd2lsbCBiZSBlcmFzZWQgYnkgdGhlIG5leHQgbG9hZC4gICAgICAgICAqLwotCi0gICAgbGVmdF9iZWFyaW5nID0gYnVpbGRlci0+bGVmdF9iZWFyaW5nOwotICAgIGFkdmFuY2UgICAgICA9IGJ1aWxkZXItPmFkdmFuY2U7Ci0gICAgZ2x5cGhfd2lkdGggID0gZGVjb2Rlci0+Z2x5cGhfd2lkdGg7Ci0KLSAgICBidWlsZGVyLT5sZWZ0X2JlYXJpbmcueCA9IDA7Ci0gICAgYnVpbGRlci0+bGVmdF9iZWFyaW5nLnkgPSAwOwotCi0gICAgYnVpbGRlci0+cG9zX3ggPSBhZHggLSBhc2I7Ci0gICAgYnVpbGRlci0+cG9zX3kgPSBhZHk7Ci0KLSAgICAvKiBOb3cgbG9hZCBgYWNoYXInIG9uIHRvcCBvZiB0aGUgYmFzZSBvdXRsaW5lLiAqLwotICAgIGVycm9yID0gY2ZmX2dldF9nbHlwaF9kYXRhKCBmYWNlLCAoRlRfVUludClhY2hhcl9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYXJzdHJpbmcsICZjaGFyc3RyaW5nX2xlbiApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICAvKiB0aGUgc2VhYyBvcGVyYXRvciBtdXN0IG5vdCBiZSBuZXN0ZWQgKi8KLSAgICAgIGRlY29kZXItPnNlYWMgPSBUUlVFOwotICAgICAgZXJyb3IgPSBjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyggZGVjb2RlciwgY2hhcnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzdHJpbmdfbGVuICk7Ci0gICAgICBkZWNvZGVyLT5zZWFjID0gRkFMU0U7Ci0KLSAgICAgIGNmZl9mcmVlX2dseXBoX2RhdGEoIGZhY2UsICZjaGFyc3RyaW5nLCBjaGFyc3RyaW5nX2xlbiApOwotCi0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIFJlc3RvcmUgdGhlIGxlZnQgc2lkZSBiZWFyaW5nLCBhZHZhbmNlIGFuZCBnbHlwaCB3aWR0aCAqLwotICAgIC8qIG9mIHRoZSBiYXNlIGNoYXJhY3Rlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGJ1aWxkZXItPmxlZnRfYmVhcmluZyA9IGxlZnRfYmVhcmluZzsKLSAgICBidWlsZGVyLT5hZHZhbmNlICAgICAgPSBhZHZhbmNlOwotICAgIGRlY29kZXItPmdseXBoX3dpZHRoICA9IGdseXBoX3dpZHRoOwotCi0gICAgYnVpbGRlci0+cG9zX3ggPSAwOwotICAgIGJ1aWxkZXItPnBvc195ID0gMDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUGFyc2VzIGEgZ2l2ZW4gVHlwZSAyIGNoYXJzdHJpbmdzIHByb2dyYW0uICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVjb2RlciAgICAgICAgIDo6IFRoZSBjdXJyZW50IFR5cGUgMSBkZWNvZGVyLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcnN0cmluZ19iYXNlIDo6IFRoZSBiYXNlIG9mIHRoZSBjaGFyc3RyaW5nIHN0cmVhbS4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyc3RyaW5nX2xlbiAgOjogVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgY2hhcnN0cmluZyBzdHJlYW0uICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyggQ0ZGX0RlY29kZXIqICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICBjaGFyc3RyaW5nX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgIGNoYXJzdHJpbmdfbGVuICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvcjsKLSAgICBDRkZfRGVjb2Rlcl9ab25lKiAgem9uZTsKLSAgICBGVF9CeXRlKiAgICAgICAgICAgaXA7Ci0gICAgRlRfQnl0ZSogICAgICAgICAgIGxpbWl0OwotICAgIENGRl9CdWlsZGVyKiAgICAgICBidWlsZGVyID0gJmRlY29kZXItPmJ1aWxkZXI7Ci0gICAgRlRfUG9zICAgICAgICAgICAgIHgsIHk7Ci0gICAgRlRfRml4ZWQgICAgICAgICAgIHNlZWQ7Ci0gICAgRlRfRml4ZWQqICAgICAgICAgIHN0YWNrOwotICAgIEZUX0ludCAgICAgICAgICAgICBjaGFyc3RyaW5nX3R5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXItPmNmZi0+dG9wX2ZvbnQuZm9udF9kaWN0LmNoYXJzdHJpbmdfdHlwZTsKLQotICAgIFQyX0hpbnRzX0Z1bmNzICAgICBoaW50ZXI7Ci0KLQotICAgIC8qIHNldCBkZWZhdWx0IHdpZHRoICovCi0gICAgZGVjb2Rlci0+bnVtX2hpbnRzICA9IDA7Ci0gICAgZGVjb2Rlci0+cmVhZF93aWR0aCA9IDE7Ci0KLSAgICAvKiBjb21wdXRlIHJhbmRvbSBzZWVkIGZyb20gc3RhY2sgYWRkcmVzcyBvZiBwYXJhbWV0ZXIgKi8KLSAgICBzZWVkID0gKEZUX0ZpeGVkKSggKCAoRlRfT2Zmc2V0KShjaGFyKikmc2VlZCAgICAgICAgICAgIF4KLSAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfT2Zmc2V0KShjaGFyKikmZGVjb2RlciAgICAgICAgIF4KLSAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfT2Zmc2V0KShjaGFyKikmY2hhcnN0cmluZ19iYXNlICkgJgotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMT05HX01BWCAgICAgICAgICAgICAgICAgICAgICAgICApOwotICAgIHNlZWQgPSAoIHNlZWQgXiAoIHNlZWQgPj4gMTAgKSBeICggc2VlZCA+PiAyMCApICkgJiAweEZGRkZMOwotICAgIGlmICggc2VlZCA9PSAwICkKLSAgICAgIHNlZWQgPSAweDczODQ7Ci0KLSAgICAvKiBpbml0aWFsaXplIHRoZSBkZWNvZGVyICovCi0gICAgZGVjb2Rlci0+dG9wICA9IGRlY29kZXItPnN0YWNrOwotICAgIGRlY29kZXItPnpvbmUgPSBkZWNvZGVyLT56b25lczsKLSAgICB6b25lICAgICAgICAgID0gZGVjb2Rlci0+em9uZXM7Ci0gICAgc3RhY2sgICAgICAgICA9IGRlY29kZXItPnRvcDsKLQotICAgIGhpbnRlciA9IChUMl9IaW50c19GdW5jcylidWlsZGVyLT5oaW50c19mdW5jczsKLQotICAgIGJ1aWxkZXItPnBhdGhfYmVndW4gPSAwOwotCi0gICAgem9uZS0+YmFzZSAgICAgICAgICAgPSBjaGFyc3RyaW5nX2Jhc2U7Ci0gICAgbGltaXQgPSB6b25lLT5saW1pdCAgPSBjaGFyc3RyaW5nX2Jhc2UgKyBjaGFyc3RyaW5nX2xlbjsKLSAgICBpcCAgICA9IHpvbmUtPmN1cnNvciA9IHpvbmUtPmJhc2U7Ci0KLSAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotICAgIHggPSBidWlsZGVyLT5wb3NfeDsKLSAgICB5ID0gYnVpbGRlci0+cG9zX3k7Ci0KLSAgICAvKiBiZWdpbiBoaW50cyByZWNvcmRpbmcgc2Vzc2lvbiwgaWYgYW55ICovCi0gICAgaWYgKCBoaW50ZXIgKQotICAgICAgaGludGVyLT5vcGVuKCBoaW50ZXItPmhpbnRzICk7Ci0KLSAgICAvKiBub3cgZXhlY3V0ZSBsb29wICovCi0gICAgd2hpbGUgKCBpcCA8IGxpbWl0ICkKLSAgICB7Ci0gICAgICBDRkZfT3BlcmF0b3IgIG9wOwotICAgICAgRlRfQnl0ZSAgICAgICB2OwotCi0KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIERlY29kZSBvcGVyYXRvciBvciBvcGVyYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIHYgPSAqaXArKzsKLSAgICAgIGlmICggdiA+PSAzMiB8fCB2ID09IDI4ICkKLSAgICAgIHsKLSAgICAgICAgRlRfSW50ICAgIHNoaWZ0ID0gMTY7Ci0gICAgICAgIEZUX0ludDMyICB2YWw7Ci0KLQotICAgICAgICAvKiB0aGlzIGlzIGFuIG9wZXJhbmQsIHB1c2ggaXQgb24gdGhlIHN0YWNrICovCi0KLSAgICAgICAgLyogaWYgd2UgdXNlIHNoaWZ0cywgYWxsIGNvbXB1dGF0aW9ucyBhcmUgZG9uZSB3aXRoIHVuc2lnbmVkICovCi0gICAgICAgIC8qIHZhbHVlczsgdGhlIGNvbnZlcnNpb24gdG8gYSBzaWduZWQgdmFsdWUgaXMgdGhlIGxhc3Qgc3RlcCAqLwotICAgICAgICBpZiAoIHYgPT0gMjggKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBpcCArIDEgPj0gbGltaXQgKQotICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgdmFsID0gKEZUX1Nob3J0KSggKCAoRlRfVVNob3J0KWlwWzBdIDw8IDggKSB8IGlwWzFdICk7Ci0gICAgICAgICAgaXAgKz0gMjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggdiA8IDI0NyApCi0gICAgICAgICAgdmFsID0gKEZUX0ludDMyKXYgLSAxMzk7Ci0gICAgICAgIGVsc2UgaWYgKCB2IDwgMjUxICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggaXAgPj0gbGltaXQgKQotICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgdmFsID0gKCAoRlRfSW50MzIpdiAtIDI0NyApICogMjU2ICsgKmlwKysgKyAxMDg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHYgPCAyNTUgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBpcCA+PSBsaW1pdCApCi0gICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICB2YWwgPSAtKCAoRlRfSW50MzIpdiAtIDI1MSApICogMjU2IC0gKmlwKysgLSAxMDg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBpcCArIDMgPj0gbGltaXQgKQotICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgdmFsID0gKEZUX0ludDMyKSggKCAoRlRfVUludDMyKWlwWzBdIDw8IDI0ICkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKEZUX1VJbnQzMilpcFsxXSA8PCAxNiApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIChGVF9VSW50MzIpaXBbMl0gPDwgIDggKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludDMyKWlwWzNdICAgICAgICAgKTsKLSAgICAgICAgICBpcCAgICArPSA0OwotICAgICAgICAgIGlmICggY2hhcnN0cmluZ190eXBlID09IDIgKQotICAgICAgICAgICAgc2hpZnQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmICggZGVjb2Rlci0+dG9wIC0gc3RhY2sgPj0gQ0ZGX01BWF9PUEVSQU5EUyApCi0gICAgICAgICAgZ290byBTdGFja19PdmVyZmxvdzsKLQotICAgICAgICB2YWwgICAgICAgICAgICAgPSAoRlRfSW50MzIpKCAoRlRfVUludDMyKXZhbCA8PCBzaGlmdCApOwotICAgICAgICAqZGVjb2Rlci0+dG9wKysgPSB2YWw7Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICBpZiAoICEoIHZhbCAmIDB4RkZGRkwgKSApCi0gICAgICAgICAgRlRfVFJBQ0U0KCggIiAlaGQiLCAoRlRfU2hvcnQpKCAoRlRfVUludDMyKXZhbCA+PiAxNiApICkpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgRlRfVFJBQ0U0KCggIiAlLjJmIiwgdmFsIC8gNjU1MzYuMCApKTsKLSNlbmRpZgotCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIFRoZSBzcGVjaWZpY2F0aW9uIHNheXMgdGhhdCBub3JtYWxseSBhcmd1bWVudHMgYXJlIHRvIGJlIHRha2VuICovCi0gICAgICAgIC8qIGZyb20gdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2suICBIb3dldmVyLCB0aGlzIHNlZW1zIG5vdCB0byBiZSAgICovCi0gICAgICAgIC8qIGNvcnJlY3QsIGF0IGxlYXN0IGZvciBBY3JvcmVhZCA3LjAuOCBvbiBHTlUvTGludXg6IEl0IHBvcHMgdGhlICovCi0gICAgICAgIC8qIGFyZ3VtZW50cyBzaW1pbGFyIHRvIGEgUFMgaW50ZXJwcmV0ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgRlRfRml4ZWQqICBhcmdzICAgICA9IGRlY29kZXItPnRvcDsKLSAgICAgICAgRlRfSW50ICAgICBudW1fYXJncyA9IChGVF9JbnQpKCBhcmdzIC0gZGVjb2Rlci0+c3RhY2sgKTsKLSAgICAgICAgRlRfSW50ICAgICByZXFfYXJnczsKLQotCi0gICAgICAgIC8qIGZpbmQgb3BlcmF0b3IgKi8KLSAgICAgICAgb3AgPSBjZmZfb3BfdW5rbm93bjsKLQotICAgICAgICBzd2l0Y2ggKCB2ICkKLSAgICAgICAgewotICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfaHN0ZW07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzoKLSAgICAgICAgICBvcCA9IGNmZl9vcF92c3RlbTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgIG9wID0gY2ZmX29wX3Ztb3ZldG87Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICBvcCA9IGNmZl9vcF9ybGluZXRvOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfaGxpbmV0bzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSA3OgotICAgICAgICAgIG9wID0gY2ZmX29wX3ZsaW5ldG87Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICBvcCA9IGNmZl9vcF9ycmN1cnZldG87Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgOToKLSAgICAgICAgICBvcCA9IGNmZl9vcF9jbG9zZXBhdGg7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfY2FsbHN1YnI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfcmV0dXJuOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDEyOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggaXAgPj0gbGltaXQgKQotICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICAgIHYgPSAqaXArKzsKLQotICAgICAgICAgICAgc3dpdGNoICggdiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX2RvdHNlY3Rpb247Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOiAvKiB0aGlzIGlzIGFjdHVhbGx5IHRoZSBUeXBlMSB2c3RlbTMgb3BlcmF0b3IgKi8KLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3BfdnN0ZW07Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyOiAvKiB0aGlzIGlzIGFjdHVhbGx5IHRoZSBUeXBlMSBoc3RlbTMgb3BlcmF0b3IgKi8KLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3BfaHN0ZW07Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9hbmQ7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9vcjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX25vdDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX3NlYWM7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9zYnc7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9zdG9yZTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX2FiczsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9hZGQ7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3Bfc3ViOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX2RpdjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9sb2FkOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX25lZzsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9lcTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9jYWxsb3RoZXJzdWJyOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTc6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX3BvcDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE4OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9kcm9wOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX3B1dDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDIxOgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9nZXQ7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyMjoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3BfaWZlbHNlOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjM6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX3JhbmRvbTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI0OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9tdWw7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyNjoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3Bfc3FydDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI3OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9kdXA7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyODoKLSAgICAgICAgICAgICAgb3AgPSBjZmZfb3BfZXhjaDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI5OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9pbmRleDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDMwOgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9yb2xsOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzM6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX3NldGN1cnJlbnRwb2ludDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDM0OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9oZmxleDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDM1OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9mbGV4OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzY6Ci0gICAgICAgICAgICAgIG9wID0gY2ZmX29wX2hmbGV4MTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDM3OgotICAgICAgICAgICAgICBvcCA9IGNmZl9vcF9mbGV4MTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiIHVua25vd24gb3AgKDEyLCAlZClcbiIsIHYgKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICBvcCA9IGNmZl9vcF9oc2J3OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE0OgotICAgICAgICAgIG9wID0gY2ZmX29wX2VuZGNoYXI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfYmxlbmQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfaHN0ZW1obTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOToKLSAgICAgICAgICBvcCA9IGNmZl9vcF9oaW50bWFzazsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICBvcCA9IGNmZl9vcF9jbnRybWFzazsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICBvcCA9IGNmZl9vcF9ybW92ZXRvOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDIyOgotICAgICAgICAgIG9wID0gY2ZmX29wX2htb3ZldG87Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjM6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfdnN0ZW1obTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyNDoKLSAgICAgICAgICBvcCA9IGNmZl9vcF9yY3VydmVsaW5lOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI1OgotICAgICAgICAgIG9wID0gY2ZmX29wX3JsaW5lY3VydmU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfdnZjdXJ2ZXRvOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDI3OgotICAgICAgICAgIG9wID0gY2ZmX29wX2hoY3VydmV0bzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOToKLSAgICAgICAgICBvcCA9IGNmZl9vcF9jYWxsZ3N1YnI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgb3AgPSBjZmZfb3BfdmhjdXJ2ZXRvOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDMxOgotICAgICAgICAgIG9wID0gY2ZmX29wX2h2Y3VydmV0bzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHVua25vd24gb3AgKCVkKVxuIiwgdiApKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggb3AgPT0gY2ZmX29wX3Vua25vd24gKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIC8qIGNoZWNrIGFyZ3VtZW50cyAqLwotICAgICAgICByZXFfYXJncyA9IGNmZl9hcmd1bWVudF9jb3VudHNbb3BdOwotICAgICAgICBpZiAoIHJlcV9hcmdzICYgQ0ZGX0NPVU5UX0NIRUNLX1dJRFRIICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggbnVtX2FyZ3MgPiAwICYmIGRlY29kZXItPnJlYWRfd2lkdGggKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIElmIGBub21pbmFsX3dpZHRoJyBpcyBub24temVybywgdGhlIG51bWJlciBpcyByZWFsbHkgYSAgICAgICovCi0gICAgICAgICAgICAvKiBkaWZmZXJlbmNlIGFnYWluc3QgYG5vbWluYWxfd2lkdGgnLiAgRWxzZSwgdGhlIG51bWJlciBoZXJlICAqLwotICAgICAgICAgICAgLyogaXMgdHJ1bHkgYSB3aWR0aCwgbm90IGEgZGlmZmVyZW5jZSBhZ2FpbnN0IGBub21pbmFsX3dpZHRoJy4gKi8KLSAgICAgICAgICAgIC8qIElmIHRoZSBmb250IGRvZXMgbm90IHNldCBgbm9taW5hbF93aWR0aCcsIHRoZW4gICAgICAgICAgICAgICovCi0gICAgICAgICAgICAvKiBgbm9taW5hbF93aWR0aCcgZGVmYXVsdHMgdG8gemVybywgYW5kIHNvIHdlIGNhbiBzZXQgICAgICAgICAqLwotICAgICAgICAgICAgLyogYGdseXBoX3dpZHRoJyB0byBgbm9taW5hbF93aWR0aCcgcGx1cyBudW1iZXIgb24gdGhlIHN0YWNrICAgKi8KLSAgICAgICAgICAgIC8qIC0tIGZvciBlaXRoZXIgY2FzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIEZUX0ludCAgc2V0X3dpZHRoX29rOwotCi0KLSAgICAgICAgICAgIHN3aXRjaCAoIG9wICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgY2ZmX29wX2htb3ZldG86Ci0gICAgICAgICAgICBjYXNlIGNmZl9vcF92bW92ZXRvOgotICAgICAgICAgICAgICBzZXRfd2lkdGhfb2sgPSBudW1fYXJncyAmIDI7Ci0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIGNmZl9vcF9oc3RlbToKLSAgICAgICAgICAgIGNhc2UgY2ZmX29wX3ZzdGVtOgotICAgICAgICAgICAgY2FzZSBjZmZfb3BfaHN0ZW1obToKLSAgICAgICAgICAgIGNhc2UgY2ZmX29wX3ZzdGVtaG06Ci0gICAgICAgICAgICBjYXNlIGNmZl9vcF9ybW92ZXRvOgotICAgICAgICAgICAgY2FzZSBjZmZfb3BfaGludG1hc2s6Ci0gICAgICAgICAgICBjYXNlIGNmZl9vcF9jbnRybWFzazoKLSAgICAgICAgICAgICAgc2V0X3dpZHRoX29rID0gbnVtX2FyZ3MgJiAxOwotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBjZmZfb3BfZW5kY2hhcjoKLSAgICAgICAgICAgICAgLyogSWYgdGhlcmUgaXMgYSB3aWR0aCBzcGVjaWZpZWQgZm9yIGVuZGNoYXIsIHdlIGVpdGhlciBoYXZlICovCi0gICAgICAgICAgICAgIC8qIDEgYXJndW1lbnQgb3IgNSBhcmd1bWVudHMuICBXZSBsaWtlIHRvIGFyZ3VlLiAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICBzZXRfd2lkdGhfb2sgPSAoIG51bV9hcmdzID09IDUgKSB8fCAoIG51bV9hcmdzID09IDEgKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIHNldF93aWR0aF9vayA9IDA7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIHNldF93aWR0aF9vayApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGRlY29kZXItPmdseXBoX3dpZHRoID0gZGVjb2Rlci0+bm9taW5hbF93aWR0aCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHN0YWNrWzBdID4+IDE2ICk7Ci0KLSAgICAgICAgICAgICAgaWYgKCBkZWNvZGVyLT53aWR0aF9vbmx5ICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIHdlIG9ubHkgd2FudCB0aGUgYWR2YW5jZSB3aWR0aDsgc3RvcCBoZXJlICovCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAvKiBDb25zdW1lZCBhbiBhcmd1bWVudC4gKi8KLSAgICAgICAgICAgICAgbnVtX2FyZ3MtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBkZWNvZGVyLT5yZWFkX3dpZHRoID0gMDsKLSAgICAgICAgICByZXFfYXJncyAgICAgICAgICAgID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIHJlcV9hcmdzICY9IDB4MDAwRjsKLSAgICAgICAgaWYgKCBudW1fYXJncyA8IHJlcV9hcmdzICkKLSAgICAgICAgICBnb3RvIFN0YWNrX1VuZGVyZmxvdzsKLSAgICAgICAgYXJncyAgICAgLT0gcmVxX2FyZ3M7Ci0gICAgICAgIG51bV9hcmdzIC09IHJlcV9hcmdzOwotCi0gICAgICAgIC8qIEF0IHRoaXMgcG9pbnQsIGBhcmdzJyBwb2ludHMgdG8gdGhlIGZpcnN0IGFyZ3VtZW50IG9mIHRoZSAgKi8KLSAgICAgICAgLyogb3BlcmFuZCBpbiBjYXNlIGByZXFfYXJncycgaXNuJ3QgemVyby4gIE90aGVyd2lzZSwgd2UgaGF2ZSAqLwotICAgICAgICAvKiB0byBhZGp1c3QgYGFyZ3MnIG1hbnVhbGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgLyogTm90ZSB0aGF0IHdlIG9ubHkgcG9wIGFyZ3VtZW50cyBmcm9tIHRoZSBzdGFjayB3aGljaCB3ZSAgICAqLwotICAgICAgICAvKiByZWFsbHkgbmVlZCBhbmQgY2FuIGRpZ2VzdCBzbyB0aGF0IHdlIGNhbiBjb250aW51ZSBpbiBjYXNlICovCi0gICAgICAgIC8qIG9mIHN1cGVyZmx1b3VzIHN0YWNrIGVsZW1lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICBzd2l0Y2ggKCBvcCApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBjZmZfb3BfaHN0ZW06Ci0gICAgICAgIGNhc2UgY2ZmX29wX3ZzdGVtOgotICAgICAgICBjYXNlIGNmZl9vcF9oc3RlbWhtOgotICAgICAgICBjYXNlIGNmZl9vcF92c3RlbWhtOgotICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGlzIGFsd2F5cyBldmVuIGhlcmUgKi8KLSAgICAgICAgICBGVF9UUkFDRTQoKAotICAgICAgICAgICAgICBvcCA9PSBjZmZfb3BfaHN0ZW0gICA/ICIgaHN0ZW1cbiIgICA6Ci0gICAgICAgICAgICAoIG9wID09IGNmZl9vcF92c3RlbSAgID8gIiB2c3RlbVxuIiAgIDoKLSAgICAgICAgICAgICggb3AgPT0gY2ZmX29wX2hzdGVtaG0gPyAiIGhzdGVtaG1cbiIgOiAiIHZzdGVtaG1cbiIgKSApICkpOwotCi0gICAgICAgICAgaWYgKCBoaW50ZXIgKQotICAgICAgICAgICAgaGludGVyLT5zdGVtcyggaGludGVyLT5oaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICggb3AgPT0gY2ZmX29wX2hzdGVtIHx8IG9wID09IGNmZl9vcF9oc3RlbWhtICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fYXJncyAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzIC0gKCBudW1fYXJncyAmIH4xICkgKTsKLQotICAgICAgICAgIGRlY29kZXItPm51bV9oaW50cyArPSBudW1fYXJncyAvIDI7Ci0gICAgICAgICAgYXJncyA9IHN0YWNrOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2hpbnRtYXNrOgotICAgICAgICBjYXNlIGNmZl9vcF9jbnRybWFzazoKLSAgICAgICAgICBGVF9UUkFDRTQoKCBvcCA9PSBjZmZfb3BfaGludG1hc2sgPyAiIGhpbnRtYXNrIiA6ICIgY250cm1hc2siICkpOwotCi0gICAgICAgICAgLyogaW1wbGVtZW50IHZzdGVtIHdoZW4gbmVlZGVkIC0tICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiB0aGUgc3BlY2lmaWNhdGlvbiBkb2Vzbid0IHNheSBpdCwgYnV0IHRoaXMgYWxzbyB3b3JrcyAqLwotICAgICAgICAgIC8qIHdpdGggdGhlICdjbnRybWFzaycgb3BlcmF0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoIG51bV9hcmdzID4gMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBoaW50ZXIgKQotICAgICAgICAgICAgICBoaW50ZXItPnN0ZW1zKCBoaW50ZXItPmhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fYXJncyAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgLSAoIG51bV9hcmdzICYgfjEgKSApOwotCi0gICAgICAgICAgICBkZWNvZGVyLT5udW1faGludHMgKz0gbnVtX2FyZ3MgLyAyOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIEluIGEgdmFsaWQgY2hhcnN0cmluZyB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBieXRlICovCi0gICAgICAgICAgLyogYWZ0ZXIgYGhpbnRtYXNrJyBvciBgY250cm1hc2snIChlLmcuLCBmb3IgYSBgcmV0dXJuJyAgKi8KLSAgICAgICAgICAvKiBpbnN0cnVjdGlvbikuICBBZGRpdGlvbmFsbHksIHRoZXJlIG11c3QgYmUgc3BhY2UgZm9yICAqLwotICAgICAgICAgIC8qIGBudW1faGludHMnIGJpdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICBpZiAoICggaXAgKyAoICggZGVjb2Rlci0+bnVtX2hpbnRzICsgNyApID4+IDMgKSApID49IGxpbWl0ICkKLSAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotCi0gICAgICAgICAgaWYgKCBoaW50ZXIgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggb3AgPT0gY2ZmX29wX2hpbnRtYXNrICkKLSAgICAgICAgICAgICAgaGludGVyLT5oaW50bWFzayggaGludGVyLT5oaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpYnVpbGRlci0+Y3VycmVudC0+bl9wb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KWRlY29kZXItPm51bV9oaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXAgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgaGludGVyLT5jb3VudGVyKCBoaW50ZXItPmhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KWRlY29kZXItPm51bV9oaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcCApOwotICAgICAgICAgIH0KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVUludCBtYXNrYnl0ZTsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIChtYXNrYnl0ZXM6IiApKTsKLQotICAgICAgICAgICAgZm9yICggbWFza2J5dGUgPSAwOwotICAgICAgICAgICAgICAgICAgbWFza2J5dGUgPCAoRlRfVUludCkoICggZGVjb2Rlci0+bnVtX2hpbnRzICsgNyApID4+IDMgKTsKLSAgICAgICAgICAgICAgICAgIG1hc2tieXRlKyssIGlwKysgKQotICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiIDB4JTAyWCIsICppcCApKTsKLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIilcbiIgKSk7Ci0gICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICBpcCArPSAoIGRlY29kZXItPm51bV9oaW50cyArIDcgKSA+PiAzOwotI2VuZGlmCi0gICAgICAgICAgYXJncyA9IHN0YWNrOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX3Jtb3ZldG86Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBybW92ZXRvXG4iICkpOwotCi0gICAgICAgICAgY2ZmX2J1aWxkZXJfY2xvc2VfY29udG91ciggYnVpbGRlciApOwotICAgICAgICAgIGJ1aWxkZXItPnBhdGhfYmVndW4gPSAwOwotICAgICAgICAgIHggICArPSBhcmdzWy0yXTsKLSAgICAgICAgICB5ICAgKz0gYXJnc1stMV07Ci0gICAgICAgICAgYXJncyA9IHN0YWNrOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX3Ztb3ZldG86Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiB2bW92ZXRvXG4iICkpOwotCi0gICAgICAgICAgY2ZmX2J1aWxkZXJfY2xvc2VfY29udG91ciggYnVpbGRlciApOwotICAgICAgICAgIGJ1aWxkZXItPnBhdGhfYmVndW4gPSAwOwotICAgICAgICAgIHkgICArPSBhcmdzWy0xXTsKLSAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfaG1vdmV0bzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGhtb3ZldG9cbiIgKSk7Ci0KLSAgICAgICAgICBjZmZfYnVpbGRlcl9jbG9zZV9jb250b3VyKCBidWlsZGVyICk7Ci0gICAgICAgICAgYnVpbGRlci0+cGF0aF9iZWd1biA9IDA7Ci0gICAgICAgICAgeCAgICs9IGFyZ3NbLTFdOwotICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9ybGluZXRvOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgcmxpbmV0b1xuIiApKTsKLQotICAgICAgICAgIGlmICggY2ZmX2J1aWxkZXJfc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSAgfHwKLSAgICAgICAgICAgICAgIGNmZl9jaGVja19wb2ludHMoIGJ1aWxkZXIsIG51bV9hcmdzIC8gMiApICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgIGlmICggbnVtX2FyZ3MgPCAyICkKLSAgICAgICAgICAgIGdvdG8gU3RhY2tfVW5kZXJmbG93OwotCi0gICAgICAgICAgYXJncyAtPSBudW1fYXJncyAmIH4xOwotICAgICAgICAgIHdoaWxlICggYXJncyA8IGRlY29kZXItPnRvcCApCi0gICAgICAgICAgewotICAgICAgICAgICAgeCArPSBhcmdzWzBdOwotICAgICAgICAgICAgeSArPSBhcmdzWzFdOwotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0gICAgICAgICAgICBhcmdzICs9IDI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9obGluZXRvOgotICAgICAgICBjYXNlIGNmZl9vcF92bGluZXRvOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ludCAgcGhhc2UgPSAoIG9wID09IGNmZl9vcF9obGluZXRvICk7Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggb3AgPT0gY2ZmX29wX2hsaW5ldG8gPyAiIGhsaW5ldG9cbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiB2bGluZXRvXG4iICkpOwotCi0gICAgICAgICAgICBpZiAoIG51bV9hcmdzIDwgMCApCi0gICAgICAgICAgICAgIGdvdG8gU3RhY2tfVW5kZXJmbG93OwotCi0gICAgICAgICAgICAvKiB0aGVyZSBleGlzdCBzdWJzZXR0ZWQgZm9udHMgKGZvdW5kIGluIFBERnMpICovCi0gICAgICAgICAgICAvKiB3aGljaCBjYWxsIGBobGluZXRvJyB3aXRob3V0IGFyZ3VtZW50cyAgICAgICovCi0gICAgICAgICAgICBpZiAoIG51bV9hcmdzID09IDAgKQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgaWYgKCBjZmZfYnVpbGRlcl9zdGFydF9wb2ludCggYnVpbGRlciwgeCwgeSApIHx8Ci0gICAgICAgICAgICAgICAgIGNmZl9jaGVja19wb2ludHMoIGJ1aWxkZXIsIG51bV9hcmdzICkgICAgKQotICAgICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICAgIHdoaWxlICggYXJncyA8IGRlY29kZXItPnRvcCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICggcGhhc2UgKQotICAgICAgICAgICAgICAgIHggKz0gYXJnc1swXTsKLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHkgKz0gYXJnc1swXTsKLQotICAgICAgICAgICAgICBpZiAoIGNmZl9idWlsZGVyX2FkZF9wb2ludDEoIGJ1aWxkZXIsIHgsIHkgKSApCi0gICAgICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICAgICAgcGhhc2UgXj0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfcnJjdXJ2ZXRvOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ludCAgbmFyZ3M7Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBycmN1cnZldG9cbiIgKSk7Ci0KLSAgICAgICAgICAgIGlmICggbnVtX2FyZ3MgPCA2ICkKLSAgICAgICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7Ci0KLSAgICAgICAgICAgIG5hcmdzID0gbnVtX2FyZ3MgLSBudW1fYXJncyAlIDY7Ci0KLSAgICAgICAgICAgIGlmICggY2ZmX2J1aWxkZXJfc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSB8fAotICAgICAgICAgICAgICAgICBjZmZfY2hlY2tfcG9pbnRzKCBidWlsZGVyLCBuYXJncyAvIDIgKSAgICkKLSAgICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgICBhcmdzIC09IG5hcmdzOwotICAgICAgICAgICAgd2hpbGUgKCBhcmdzIDwgZGVjb2Rlci0+dG9wICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgeCArPSBhcmdzWzBdOwotICAgICAgICAgICAgICB5ICs9IGFyZ3NbMV07Ci0gICAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotICAgICAgICAgICAgICB4ICs9IGFyZ3NbMl07Ci0gICAgICAgICAgICAgIHkgKz0gYXJnc1szXTsKLSAgICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0gICAgICAgICAgICAgIHggKz0gYXJnc1s0XTsKLSAgICAgICAgICAgICAgeSArPSBhcmdzWzVdOwotICAgICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDEgKTsKLSAgICAgICAgICAgICAgYXJncyArPSA2OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXJncyA9IHN0YWNrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF92dmN1cnZldG86Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfSW50ICBuYXJnczsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIHZ2Y3VydmV0b1xuIiApKTsKLQotICAgICAgICAgICAgaWYgKCBudW1fYXJncyA8IDQgKQotICAgICAgICAgICAgICBnb3RvIFN0YWNrX1VuZGVyZmxvdzsKLQotICAgICAgICAgICAgLyogaWYgbnVtX2FyZ3MgaXNuJ3Qgb2YgdGhlIGZvcm0gNG4gb3IgNG4rMSwgKi8KLSAgICAgICAgICAgIC8qIHdlIGVuZm9yY2UgaXQgYnkgY2xlYXJpbmcgdGhlIHNlY29uZCBiaXQgICovCi0KLSAgICAgICAgICAgIG5hcmdzID0gbnVtX2FyZ3MgJiB+MjsKLQotICAgICAgICAgICAgaWYgKCBjZmZfYnVpbGRlcl9zdGFydF9wb2ludCggYnVpbGRlciwgeCwgeSApICkKLSAgICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgICBhcmdzIC09IG5hcmdzOwotCi0gICAgICAgICAgICBpZiAoIG5hcmdzICYgMSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHggKz0gYXJnc1swXTsKLSAgICAgICAgICAgICAgYXJncysrOwotICAgICAgICAgICAgICBuYXJncy0tOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIGNmZl9jaGVja19wb2ludHMoIGJ1aWxkZXIsIDMgKiAoIG5hcmdzIC8gNCApICkgKQotICAgICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICAgIHdoaWxlICggYXJncyA8IGRlY29kZXItPnRvcCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHkgKz0gYXJnc1swXTsKLSAgICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0gICAgICAgICAgICAgIHggKz0gYXJnc1sxXTsKLSAgICAgICAgICAgICAgeSArPSBhcmdzWzJdOwotICAgICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLSAgICAgICAgICAgICAgeSArPSBhcmdzWzNdOwotICAgICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDEgKTsKLSAgICAgICAgICAgICAgYXJncyArPSA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXJncyA9IHN0YWNrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9oaGN1cnZldG86Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfSW50ICBuYXJnczsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGhoY3VydmV0b1xuIiApKTsKLQotICAgICAgICAgICAgaWYgKCBudW1fYXJncyA8IDQgKQotICAgICAgICAgICAgICBnb3RvIFN0YWNrX1VuZGVyZmxvdzsKLQotICAgICAgICAgICAgLyogaWYgbnVtX2FyZ3MgaXNuJ3Qgb2YgdGhlIGZvcm0gNG4gb3IgNG4rMSwgKi8KLSAgICAgICAgICAgIC8qIHdlIGVuZm9yY2UgaXQgYnkgY2xlYXJpbmcgdGhlIHNlY29uZCBiaXQgICovCi0KLSAgICAgICAgICAgIG5hcmdzID0gbnVtX2FyZ3MgJiB+MjsKLQotICAgICAgICAgICAgaWYgKCBjZmZfYnVpbGRlcl9zdGFydF9wb2ludCggYnVpbGRlciwgeCwgeSApICkKLSAgICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgICBhcmdzIC09IG5hcmdzOwotICAgICAgICAgICAgaWYgKCBuYXJncyAmIDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB5ICs9IGFyZ3NbMF07Ci0gICAgICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICAgICAgbmFyZ3MtLTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBjZmZfY2hlY2tfcG9pbnRzKCBidWlsZGVyLCAzICogKCBuYXJncyAvIDQgKSApICkKLSAgICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgICB3aGlsZSAoIGFyZ3MgPCBkZWNvZGVyLT50b3AgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4ICs9IGFyZ3NbMF07Ci0gICAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotICAgICAgICAgICAgICB4ICs9IGFyZ3NbMV07Ci0gICAgICAgICAgICAgIHkgKz0gYXJnc1syXTsKLSAgICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0gICAgICAgICAgICAgIHggKz0gYXJnc1szXTsKLSAgICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0gICAgICAgICAgICAgIGFyZ3MgKz0gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfdmhjdXJ2ZXRvOgotICAgICAgICBjYXNlIGNmZl9vcF9odmN1cnZldG86Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfSW50ICBwaGFzZTsKLSAgICAgICAgICAgIEZUX0ludCAgbmFyZ3M7Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggb3AgPT0gY2ZmX29wX3ZoY3VydmV0byA/ICIgdmhjdXJ2ZXRvXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIiBodmN1cnZldG9cbiIgKSk7Ci0KLSAgICAgICAgICAgIGlmICggY2ZmX2J1aWxkZXJfc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSApCi0gICAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgICAgaWYgKCBudW1fYXJncyA8IDQgKQotICAgICAgICAgICAgICBnb3RvIFN0YWNrX1VuZGVyZmxvdzsKLQotICAgICAgICAgICAgLyogaWYgbnVtX2FyZ3MgaXNuJ3Qgb2YgdGhlIGZvcm0gOG4sIDhuKzEsIDhuKzQsIG9yIDhuKzUsICovCi0gICAgICAgICAgICAvKiB3ZSBlbmZvcmNlIGl0IGJ5IGNsZWFyaW5nIHRoZSBzZWNvbmQgYml0ICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgbmFyZ3MgPSBudW1fYXJncyAmIH4yOwotCi0gICAgICAgICAgICBhcmdzIC09IG5hcmdzOwotICAgICAgICAgICAgaWYgKCBjZmZfY2hlY2tfcG9pbnRzKCBidWlsZGVyLCAoIG5hcmdzIC8gNCApICogMyApICkKLSAgICAgICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7Ci0KLSAgICAgICAgICAgIHBoYXNlID0gKCBvcCA9PSBjZmZfb3BfaHZjdXJ2ZXRvICk7Ci0KLSAgICAgICAgICAgIHdoaWxlICggbmFyZ3MgPj0gNCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG5hcmdzIC09IDQ7Ci0gICAgICAgICAgICAgIGlmICggcGhhc2UgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeCArPSBhcmdzWzBdOwotICAgICAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotICAgICAgICAgICAgICAgIHggKz0gYXJnc1sxXTsKLSAgICAgICAgICAgICAgICB5ICs9IGFyZ3NbMl07Ci0gICAgICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0gICAgICAgICAgICAgICAgeSArPSBhcmdzWzNdOwotICAgICAgICAgICAgICAgIGlmICggbmFyZ3MgPT0gMSApCi0gICAgICAgICAgICAgICAgICB4ICs9IGFyZ3NbNF07Ci0gICAgICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeSArPSBhcmdzWzBdOwotICAgICAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotICAgICAgICAgICAgICAgIHggKz0gYXJnc1sxXTsKLSAgICAgICAgICAgICAgICB5ICs9IGFyZ3NbMl07Ci0gICAgICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0gICAgICAgICAgICAgICAgeCArPSBhcmdzWzNdOwotICAgICAgICAgICAgICAgIGlmICggbmFyZ3MgPT0gMSApCi0gICAgICAgICAgICAgICAgICB5ICs9IGFyZ3NbNF07Ci0gICAgICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYXJncyAgKz0gNDsKLSAgICAgICAgICAgICAgcGhhc2UgXj0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfcmxpbmVjdXJ2ZToKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIG51bV9saW5lczsKLSAgICAgICAgICAgIEZUX0ludCAgbmFyZ3M7Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBybGluZWN1cnZlXG4iICkpOwotCi0gICAgICAgICAgICBpZiAoIG51bV9hcmdzIDwgOCApCi0gICAgICAgICAgICAgIGdvdG8gU3RhY2tfVW5kZXJmbG93OwotCi0gICAgICAgICAgICBuYXJncyAgICAgPSBudW1fYXJncyAmIH4xOwotICAgICAgICAgICAgbnVtX2xpbmVzID0gKCBuYXJncyAtIDYgKSAvIDI7Ci0KLSAgICAgICAgICAgIGlmICggY2ZmX2J1aWxkZXJfc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSAgIHx8Ci0gICAgICAgICAgICAgICAgIGNmZl9jaGVja19wb2ludHMoIGJ1aWxkZXIsIG51bV9saW5lcyArIDMgKSApCi0gICAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgICAgYXJncyAtPSBuYXJnczsKLQotICAgICAgICAgICAgLyogZmlyc3QsIGFkZCB0aGUgbGluZSBzZWdtZW50cyAqLwotICAgICAgICAgICAgd2hpbGUgKCBudW1fbGluZXMgPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgeCArPSBhcmdzWzBdOwotICAgICAgICAgICAgICB5ICs9IGFyZ3NbMV07Ci0gICAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMSApOwotICAgICAgICAgICAgICBhcmdzICs9IDI7Ci0gICAgICAgICAgICAgIG51bV9saW5lcy0tOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiB0aGVuIHRoZSBjdXJ2ZSAqLwotICAgICAgICAgICAgeCArPSBhcmdzWzBdOwotICAgICAgICAgICAgeSArPSBhcmdzWzFdOwotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0gICAgICAgICAgICB4ICs9IGFyZ3NbMl07Ci0gICAgICAgICAgICB5ICs9IGFyZ3NbM107Ci0gICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLSAgICAgICAgICAgIHggKz0gYXJnc1s0XTsKLSAgICAgICAgICAgIHkgKz0gYXJnc1s1XTsKLSAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMSApOwotICAgICAgICAgICAgYXJncyA9IHN0YWNrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9yY3VydmVsaW5lOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ludCAgbnVtX2N1cnZlczsKLSAgICAgICAgICAgIEZUX0ludCAgbmFyZ3M7Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiByY3VydmVsaW5lXG4iICkpOwotCi0gICAgICAgICAgICBpZiAoIG51bV9hcmdzIDwgOCApCi0gICAgICAgICAgICAgIGdvdG8gU3RhY2tfVW5kZXJmbG93OwotCi0gICAgICAgICAgICBuYXJncyAgICAgID0gbnVtX2FyZ3MgLSAyOwotICAgICAgICAgICAgbmFyZ3MgICAgICA9IG5hcmdzIC0gbmFyZ3MgJSA2ICsgMjsKLSAgICAgICAgICAgIG51bV9jdXJ2ZXMgPSAoIG5hcmdzIC0gMiApIC8gNjsKLQotICAgICAgICAgICAgaWYgKCBjZmZfYnVpbGRlcl9zdGFydF9wb2ludCggYnVpbGRlciwgeCwgeSApICAgICAgICB8fAotICAgICAgICAgICAgICAgICBjZmZfY2hlY2tfcG9pbnRzKCBidWlsZGVyLCBudW1fY3VydmVzICogMyArIDIgKSApCi0gICAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgICAgYXJncyAtPSBuYXJnczsKLQotICAgICAgICAgICAgLyogZmlyc3QsIGFkZCB0aGUgY3VydmVzICovCi0gICAgICAgICAgICB3aGlsZSAoIG51bV9jdXJ2ZXMgPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgeCArPSBhcmdzWzBdOwotICAgICAgICAgICAgICB5ICs9IGFyZ3NbMV07Ci0gICAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotICAgICAgICAgICAgICB4ICs9IGFyZ3NbMl07Ci0gICAgICAgICAgICAgIHkgKz0gYXJnc1szXTsKLSAgICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0gICAgICAgICAgICAgIHggKz0gYXJnc1s0XTsKLSAgICAgICAgICAgICAgeSArPSBhcmdzWzVdOwotICAgICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDEgKTsKLSAgICAgICAgICAgICAgYXJncyArPSA2OwotICAgICAgICAgICAgICBudW1fY3VydmVzLS07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIHRoZW4gdGhlIGZpbmFsIGxpbmUgKi8KLSAgICAgICAgICAgIHggKz0gYXJnc1swXTsKLSAgICAgICAgICAgIHkgKz0gYXJnc1sxXTsKLSAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMSApOwotICAgICAgICAgICAgYXJncyA9IHN0YWNrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9oZmxleDE6Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfUG9zIHN0YXJ0X3k7Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBoZmxleDFcbiIgKSk7Ci0KLSAgICAgICAgICAgIC8qIGFkZGluZyBmaXZlIG1vcmUgcG9pbnRzOiA0IGNvbnRyb2wgcG9pbnRzLCAxIG9uLWN1cnZlIHBvaW50ICovCi0gICAgICAgICAgICAvKiAtLSBtYWtlIHN1cmUgd2UgaGF2ZSBlbm91Z2ggc3BhY2UgZm9yIHRoZSBzdGFydCBwb2ludCBpZiBpdCAqLwotICAgICAgICAgICAgLyogbmVlZHMgdG8gYmUgYWRkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICggY2ZmX2J1aWxkZXJfc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSB8fAotICAgICAgICAgICAgICAgICBjZmZfY2hlY2tfcG9pbnRzKCBidWlsZGVyLCA2ICkgICAgICAgICAgICkKLSAgICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgICAvKiByZWNvcmQgdGhlIHN0YXJ0aW5nIHBvaW50J3MgeSBwb3NpdGlvbiBmb3IgbGF0ZXIgdXNlICovCi0gICAgICAgICAgICBzdGFydF95ID0geTsKLQotICAgICAgICAgICAgLyogZmlyc3QgY29udHJvbCBwb2ludCAqLwotICAgICAgICAgICAgeCArPSBhcmdzWzBdOwotICAgICAgICAgICAgeSArPSBhcmdzWzFdOwotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0KLSAgICAgICAgICAgIC8qIHNlY29uZCBjb250cm9sIHBvaW50ICovCi0gICAgICAgICAgICB4ICs9IGFyZ3NbMl07Ci0gICAgICAgICAgICB5ICs9IGFyZ3NbM107Ci0gICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLQotICAgICAgICAgICAgLyogam9pbiBwb2ludDsgb24gY3VydmUsIHdpdGggeS12YWx1ZSB0aGUgc2FtZSBhcyB0aGUgbGFzdCAqLwotICAgICAgICAgICAgLyogY29udHJvbCBwb2ludCdzIHktdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgeCArPSBhcmdzWzRdOwotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0KLSAgICAgICAgICAgIC8qIHRoaXJkIGNvbnRyb2wgcG9pbnQsIHdpdGggeS12YWx1ZSB0aGUgc2FtZSBhcyB0aGUgam9pbiAqLwotICAgICAgICAgICAgLyogcG9pbnQncyB5LXZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICB4ICs9IGFyZ3NbNV07Ci0gICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLQotICAgICAgICAgICAgLyogZm91cnRoIGNvbnRyb2wgcG9pbnQgKi8KLSAgICAgICAgICAgIHggKz0gYXJnc1s2XTsKLSAgICAgICAgICAgIHkgKz0gYXJnc1s3XTsKLSAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotCi0gICAgICAgICAgICAvKiBlbmRpbmcgcG9pbnQsIHdpdGggeS12YWx1ZSB0aGUgc2FtZSBhcyB0aGUgc3RhcnQgICAqLwotICAgICAgICAgICAgeCArPSBhcmdzWzhdOwotICAgICAgICAgICAgeSAgPSBzdGFydF95OwotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0KLSAgICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLQotICAgICAgICBjYXNlIGNmZl9vcF9oZmxleDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9Qb3Mgc3RhcnRfeTsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGhmbGV4XG4iICkpOwotCi0gICAgICAgICAgICAvKiBhZGRpbmcgc2l4IG1vcmUgcG9pbnRzOyA0IGNvbnRyb2wgcG9pbnRzLCAyIG9uLWN1cnZlIHBvaW50cyAqLwotICAgICAgICAgICAgaWYgKCBjZmZfYnVpbGRlcl9zdGFydF9wb2ludCggYnVpbGRlciwgeCwgeSApIHx8Ci0gICAgICAgICAgICAgICAgIGNmZl9jaGVja19wb2ludHMoIGJ1aWxkZXIsIDYgKSAgICAgICAgICAgKQotICAgICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICAgIC8qIHJlY29yZCB0aGUgc3RhcnRpbmcgcG9pbnQncyB5LXBvc2l0aW9uIGZvciBsYXRlciB1c2UgKi8KLSAgICAgICAgICAgIHN0YXJ0X3kgPSB5OwotCi0gICAgICAgICAgICAvKiBmaXJzdCBjb250cm9sIHBvaW50ICovCi0gICAgICAgICAgICB4ICs9IGFyZ3NbMF07Ci0gICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLQotICAgICAgICAgICAgLyogc2Vjb25kIGNvbnRyb2wgcG9pbnQgKi8KLSAgICAgICAgICAgIHggKz0gYXJnc1sxXTsKLSAgICAgICAgICAgIHkgKz0gYXJnc1syXTsKLSAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotCi0gICAgICAgICAgICAvKiBqb2luIHBvaW50OyBvbiBjdXJ2ZSwgd2l0aCB5LXZhbHVlIHRoZSBzYW1lIGFzIHRoZSBsYXN0ICovCi0gICAgICAgICAgICAvKiBjb250cm9sIHBvaW50J3MgeS12YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICB4ICs9IGFyZ3NbM107Ci0gICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDEgKTsKLQotICAgICAgICAgICAgLyogdGhpcmQgY29udHJvbCBwb2ludCwgd2l0aCB5LXZhbHVlIHRoZSBzYW1lIGFzIHRoZSBqb2luICovCi0gICAgICAgICAgICAvKiBwb2ludCdzIHktdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHggKz0gYXJnc1s0XTsKLSAgICAgICAgICAgIGNmZl9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotCi0gICAgICAgICAgICAvKiBmb3VydGggY29udHJvbCBwb2ludCAqLwotICAgICAgICAgICAgeCArPSBhcmdzWzVdOwotICAgICAgICAgICAgeSAgPSBzdGFydF95OwotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0KLSAgICAgICAgICAgIC8qIGVuZGluZyBwb2ludCwgd2l0aCB5LXZhbHVlIHRoZSBzYW1lIGFzIHRoZSBzdGFydCBwb2ludCdzICovCi0gICAgICAgICAgICAvKiB5LXZhbHVlIC0tIHdlIGRvbid0IGFkZCB0aGlzIHBvaW50LCB0aG91Z2ggICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgeCArPSBhcmdzWzZdOwotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0KLSAgICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLQotICAgICAgICBjYXNlIGNmZl9vcF9mbGV4MToKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9Qb3MgICAgIHN0YXJ0X3gsIHN0YXJ0X3k7IC8qIHJlY29yZCBzdGFydCB4LCB5IHZhbHVlcyBmb3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWx0ZXIgdXNlICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgRlRfRml4ZWQgICBkeCA9IDAsIGR5ID0gMDsgICAvKiB1c2VkIGluIGhvcml6b250YWwvdmVydGljYWwgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFsZ29yaXRobSBiZWxvdyAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEZUX0ludCAgICAgaG9yaXpvbnRhbCwgY291bnQ7Ci0gICAgICAgICAgICBGVF9GaXhlZCogIHRlbXA7Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBmbGV4MVxuIiApKTsKLQotICAgICAgICAgICAgLyogYWRkaW5nIHNpeCBtb3JlIHBvaW50czsgNCBjb250cm9sIHBvaW50cywgMiBvbi1jdXJ2ZSBwb2ludHMgKi8KLSAgICAgICAgICAgIGlmICggY2ZmX2J1aWxkZXJfc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSB8fAotICAgICAgICAgICAgICAgICBjZmZfY2hlY2tfcG9pbnRzKCBidWlsZGVyLCA2ICkgICAgICAgICAgICkKLSAgICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgICAvKiByZWNvcmQgdGhlIHN0YXJ0aW5nIHBvaW50J3MgeCwgeSBwb3NpdGlvbiBmb3IgbGF0ZXIgdXNlICovCi0gICAgICAgICAgICBzdGFydF94ID0geDsKLSAgICAgICAgICAgIHN0YXJ0X3kgPSB5OwotCi0gICAgICAgICAgICAvKiBYWFg6IGZpZ3VyZSBvdXQgd2hldGhlciB0aGlzIGlzIHN1cHBvc2VkIHRvIGJlIGEgaG9yaXpvbnRhbCAqLwotICAgICAgICAgICAgLyogICAgICBvciB2ZXJ0aWNhbCBmbGV4OyB0aGUgVHlwZSAyIHNwZWNpZmljYXRpb24gaXMgdmFndWUuLi4gKi8KLQotICAgICAgICAgICAgdGVtcCA9IGFyZ3M7Ci0KLSAgICAgICAgICAgIC8qIGdyYWIgdXAgdG8gdGhlIGxhc3QgYXJndW1lbnQgKi8KLSAgICAgICAgICAgIGZvciAoIGNvdW50ID0gNTsgY291bnQgPiAwOyBjb3VudC0tICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZHggKz0gdGVtcFswXTsKLSAgICAgICAgICAgICAgZHkgKz0gdGVtcFsxXTsKLSAgICAgICAgICAgICAgdGVtcCArPSAyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIGR4IDwgMCApCi0gICAgICAgICAgICAgIGR4ID0gLWR4OwotICAgICAgICAgICAgaWYgKCBkeSA8IDAgKQotICAgICAgICAgICAgICBkeSA9IC1keTsKLQotICAgICAgICAgICAgLyogc3RyYW5nZSB0ZXN0LCBidXQgaGVyZSBpdCBpcy4uLiAqLwotICAgICAgICAgICAgaG9yaXpvbnRhbCA9ICggZHggPiBkeSApOwotCi0gICAgICAgICAgICBmb3IgKCBjb3VudCA9IDU7IGNvdW50ID4gMDsgY291bnQtLSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHggKz0gYXJnc1swXTsKLSAgICAgICAgICAgICAgeSArPSBhcmdzWzFdOwotICAgICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0Jvb2wpKCBjb3VudCA9PSAzICkgKTsKLSAgICAgICAgICAgICAgYXJncyArPSAyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBpcyBsYXN0IG9wZXJhbmQgYW4geC0gb3IgeS1kZWx0YT8gKi8KLSAgICAgICAgICAgIGlmICggaG9yaXpvbnRhbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHggKz0gYXJnc1swXTsKLSAgICAgICAgICAgICAgeSAgPSBzdGFydF95OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB4ICA9IHN0YXJ0X3g7Ci0gICAgICAgICAgICAgIHkgKz0gYXJnc1swXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0KLSAgICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfZmxleDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9VSW50ICBjb3VudDsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGZsZXhcbiIgKSk7Ci0KLSAgICAgICAgICAgIGlmICggY2ZmX2J1aWxkZXJfc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSB8fAotICAgICAgICAgICAgICAgICBjZmZfY2hlY2tfcG9pbnRzKCBidWlsZGVyLCA2ICkgICAgICAgICAgICkKLSAgICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgICBmb3IgKCBjb3VudCA9IDY7IGNvdW50ID4gMDsgY291bnQtLSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHggKz0gYXJnc1swXTsKLSAgICAgICAgICAgICAgeSArPSBhcmdzWzFdOwotICAgICAgICAgICAgICBjZmZfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0Jvb2wpKCBjb3VudCA9PSA0IHx8IGNvdW50ID09IDEgKSApOwotICAgICAgICAgICAgICBhcmdzICs9IDI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3Bfc2VhYzoKLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgc2VhY1xuIiApKTsKLQotICAgICAgICAgICAgZXJyb3IgPSBjZmZfb3BlcmF0b3Jfc2VhYyggZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfSW50KSggYXJnc1szXSA+PiAxNiApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0ludCkoIGFyZ3NbNF0gPj4gMTYgKSApOwotCi0gICAgICAgICAgICAvKiBhZGQgY3VycmVudCBvdXRsaW5lIHRvIHRoZSBnbHlwaCBzbG90ICovCi0gICAgICAgICAgICBGVF9HbHlwaExvYWRlcl9BZGQoIGJ1aWxkZXItPmxvYWRlciApOwotCi0gICAgICAgICAgICAvKiByZXR1cm4gbm93ISAqLwotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIlxuIiApKTsKLSAgICAgICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgICBjYXNlIGNmZl9vcF9lbmRjaGFyOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgZW5kY2hhclxuIiApKTsKLQotICAgICAgICAgIC8qIFdlIGFyZSBnb2luZyB0byBlbXVsYXRlIHRoZSBzZWFjIG9wZXJhdG9yLiAqLwotICAgICAgICAgIGlmICggbnVtX2FyZ3MgPj0gNCApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogU2F2ZSBnbHlwaCB3aWR0aCBzbyB0aGF0IHRoZSBzdWJnbHlwaHMgZG9uJ3Qgb3ZlcndyaXRlIGl0LiAqLwotICAgICAgICAgICAgRlRfUG9zICBnbHlwaF93aWR0aCA9IGRlY29kZXItPmdseXBoX3dpZHRoOwotCi0KLSAgICAgICAgICAgIGVycm9yID0gY2ZmX29wZXJhdG9yX3NlYWMoIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwTCwgYXJnc1stNF0sIGFyZ3NbLTNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0ludCkoIGFyZ3NbLTJdID4+IDE2ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfSW50KSggYXJnc1stMV0gPj4gMTYgKSApOwotCi0gICAgICAgICAgICBkZWNvZGVyLT5nbHlwaF93aWR0aCA9IGdseXBoX3dpZHRoOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgY2ZmX2J1aWxkZXJfY2xvc2VfY29udG91ciggYnVpbGRlciApOwotCi0gICAgICAgICAgICAvKiBjbG9zZSBoaW50cyByZWNvcmRpbmcgc2Vzc2lvbiAqLwotICAgICAgICAgICAgaWYgKCBoaW50ZXIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoIGhpbnRlci0+Y2xvc2UoIGhpbnRlci0+aGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpYnVpbGRlci0+Y3VycmVudC0+bl9wb2ludHMgKSApCi0gICAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0KLSAgICAgICAgICAgICAgLyogYXBwbHkgaGludHMgdG8gdGhlIGxvYWRlZCBnbHlwaCBvdXRsaW5lIG5vdyAqLwotICAgICAgICAgICAgICBlcnJvciA9IGhpbnRlci0+YXBwbHkoIGhpbnRlci0+aGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci0+Y3VycmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFNIX0dsb2JhbHMpYnVpbGRlci0+aGludHNfZ2xvYmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLT5oaW50X21vZGUgKTsKLSAgICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgICAgZ290byBGYWlsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBhZGQgY3VycmVudCBvdXRsaW5lIHRvIHRoZSBnbHlwaCBzbG90ICovCi0gICAgICAgICAgICBGVF9HbHlwaExvYWRlcl9BZGQoIGJ1aWxkZXItPmxvYWRlciApOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIHJldHVybiBub3chICovCi0gICAgICAgICAgRlRfVFJBQ0U0KCggIlxuIiApKTsKLSAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfYWJzOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgYWJzXG4iICkpOwotCi0gICAgICAgICAgaWYgKCBhcmdzWzBdIDwgMCApCi0gICAgICAgICAgICBhcmdzWzBdID0gLWFyZ3NbMF07Ci0gICAgICAgICAgYXJncysrOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2FkZDoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGFkZFxuIiApKTsKLQotICAgICAgICAgIGFyZ3NbMF0gKz0gYXJnc1sxXTsKLSAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3Bfc3ViOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgc3ViXG4iICkpOwotCi0gICAgICAgICAgYXJnc1swXSAtPSBhcmdzWzFdOwotICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9kaXY6Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBkaXZcbiIgKSk7Ci0KLSAgICAgICAgICBhcmdzWzBdID0gRlRfRGl2Rml4KCBhcmdzWzBdLCBhcmdzWzFdICk7Ci0gICAgICAgICAgYXJncysrOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX25lZzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIG5lZ1xuIiApKTsKLQotICAgICAgICAgIGFyZ3NbMF0gPSAtYXJnc1swXTsKLSAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfcmFuZG9tOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ZpeGVkICBSYW5kOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgcmFuZFxuIiApKTsKLQotICAgICAgICAgICAgUmFuZCA9IHNlZWQ7Ci0gICAgICAgICAgICBpZiAoIFJhbmQgPj0gMHg4MDAwTCApCi0gICAgICAgICAgICAgIFJhbmQrKzsKLQotICAgICAgICAgICAgYXJnc1swXSA9IFJhbmQ7Ci0gICAgICAgICAgICBzZWVkICAgID0gRlRfTXVsRml4KCBzZWVkLCAweDEwMDAwTCAtIHNlZWQgKTsKLSAgICAgICAgICAgIGlmICggc2VlZCA9PSAwICkKLSAgICAgICAgICAgICAgc2VlZCArPSAweDI4NzM7Ci0gICAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX211bDoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIG11bFxuIiApKTsKLQotICAgICAgICAgIGFyZ3NbMF0gPSBGVF9NdWxGaXgoIGFyZ3NbMF0sIGFyZ3NbMV0gKTsKLSAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3Bfc3FydDoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHNxcnRcbiIgKSk7Ci0KLSAgICAgICAgICBpZiAoIGFyZ3NbMF0gPiAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgICAgY291bnQgPSA5OwotICAgICAgICAgICAgRlRfRml4ZWQgIHJvb3QgID0gYXJnc1swXTsKLSAgICAgICAgICAgIEZUX0ZpeGVkICBuZXdfcm9vdDsKLQotCi0gICAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBuZXdfcm9vdCA9ICggcm9vdCArIEZUX0RpdkZpeCggYXJnc1swXSwgcm9vdCApICsgMSApID4+IDE7Ci0gICAgICAgICAgICAgIGlmICggbmV3X3Jvb3QgPT0gcm9vdCB8fCBjb3VudCA8PSAwICkKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgcm9vdCA9IG5ld19yb290OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXJnc1swXSA9IG5ld19yb290OwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBhcmdzWzBdID0gMDsKLSAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfZHJvcDoKLSAgICAgICAgICAvKiBub3RoaW5nICovCi0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBkcm9wXG4iICkpOwotCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfZXhjaDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9GaXhlZCAgdG1wOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgZXhjaFxuIiApKTsKLQotICAgICAgICAgICAgdG1wICAgICA9IGFyZ3NbMF07Ci0gICAgICAgICAgICBhcmdzWzBdID0gYXJnc1sxXTsKLSAgICAgICAgICAgIGFyZ3NbMV0gPSB0bXA7Ci0gICAgICAgICAgICBhcmdzICAgKz0gMjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfaW5kZXg6Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfSW50ICBpZHggPSAoRlRfSW50KSggYXJnc1swXSA+PiAxNiApOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgaW5kZXhcbiIgKSk7Ci0KLSAgICAgICAgICAgIGlmICggaWR4IDwgMCApCi0gICAgICAgICAgICAgIGlkeCA9IDA7Ci0gICAgICAgICAgICBlbHNlIGlmICggaWR4ID4gbnVtX2FyZ3MgLSAyICkKLSAgICAgICAgICAgICAgaWR4ID0gbnVtX2FyZ3MgLSAyOwotICAgICAgICAgICAgYXJnc1swXSA9IGFyZ3NbLSggaWR4ICsgMSApXTsKLSAgICAgICAgICAgIGFyZ3MrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3Bfcm9sbDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIGNvdW50ID0gKEZUX0ludCkoIGFyZ3NbMF0gPj4gMTYgKTsKLSAgICAgICAgICAgIEZUX0ludCAgaWR4ICAgPSAoRlRfSW50KSggYXJnc1sxXSA+PiAxNiApOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgcm9sbFxuIiApKTsKLQotICAgICAgICAgICAgaWYgKCBjb3VudCA8PSAwICkKLSAgICAgICAgICAgICAgY291bnQgPSAxOwotCi0gICAgICAgICAgICBhcmdzIC09IGNvdW50OwotICAgICAgICAgICAgaWYgKCBhcmdzIDwgc3RhY2sgKQotICAgICAgICAgICAgICBnb3RvIFN0YWNrX1VuZGVyZmxvdzsKLQotICAgICAgICAgICAgaWYgKCBpZHggPj0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHdoaWxlICggaWR4ID4gMCApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGVF9GaXhlZCAgdG1wID0gYXJnc1tjb3VudCAtIDFdOwotICAgICAgICAgICAgICAgIEZUX0ludCAgICBpOwotCi0KLSAgICAgICAgICAgICAgICBmb3IgKCBpID0gY291bnQgLSAyOyBpID49IDA7IGktLSApCi0gICAgICAgICAgICAgICAgICBhcmdzW2kgKyAxXSA9IGFyZ3NbaV07Ci0gICAgICAgICAgICAgICAgYXJnc1swXSA9IHRtcDsKLSAgICAgICAgICAgICAgICBpZHgtLTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB3aGlsZSAoIGlkeCA8IDAgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRlRfRml4ZWQgIHRtcCA9IGFyZ3NbMF07Ci0gICAgICAgICAgICAgICAgRlRfSW50ICAgIGk7Ci0KLQotICAgICAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgY291bnQgLSAxOyBpKysgKQotICAgICAgICAgICAgICAgICAgYXJnc1tpXSA9IGFyZ3NbaSArIDFdOwotICAgICAgICAgICAgICAgIGFyZ3NbY291bnQgLSAxXSA9IHRtcDsKLSAgICAgICAgICAgICAgICBpZHgrKzsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXJncyArPSBjb3VudDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfZHVwOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgZHVwXG4iICkpOwotCi0gICAgICAgICAgYXJnc1sxXSA9IGFyZ3NbMF07Ci0gICAgICAgICAgYXJncyArPSAyOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX3B1dDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9GaXhlZCAgdmFsID0gYXJnc1swXTsKLSAgICAgICAgICAgIEZUX0ludCAgICBpZHggPSAoRlRfSW50KSggYXJnc1sxXSA+PiAxNiApOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgcHV0XG4iICkpOwotCi0gICAgICAgICAgICBpZiAoIGlkeCA+PSAwICYmIGlkeCA8IENGRl9NQVhfVFJBTlNfRUxFTUVOVFMgKQotICAgICAgICAgICAgICBkZWNvZGVyLT5idWlsZGNoYXJbaWR4XSA9IHZhbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfZ2V0OgotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ludCAgICBpZHggPSAoRlRfSW50KSggYXJnc1swXSA+PiAxNiApOwotICAgICAgICAgICAgRlRfRml4ZWQgIHZhbCA9IDA7Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiBnZXRcbiIgKSk7Ci0KLSAgICAgICAgICAgIGlmICggaWR4ID49IDAgJiYgaWR4IDwgQ0ZGX01BWF9UUkFOU19FTEVNRU5UUyApCi0gICAgICAgICAgICAgIHZhbCA9IGRlY29kZXItPmJ1aWxkY2hhcltpZHhdOwotCi0gICAgICAgICAgICBhcmdzWzBdID0gdmFsOwotICAgICAgICAgICAgYXJncysrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9zdG9yZToKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHN0b3JlXG4iKSk7Ci0KLSAgICAgICAgICBnb3RvIFVuaW1wbGVtZW50ZWQ7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfbG9hZDoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGxvYWRcbiIgKSk7Ci0KLSAgICAgICAgICBnb3RvIFVuaW1wbGVtZW50ZWQ7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfZG90c2VjdGlvbjoKLSAgICAgICAgICAvKiB0aGlzIG9wZXJhdG9yIGlzIGRlcHJlY2F0ZWQgYW5kIGlnbm9yZWQgYnkgdGhlIHBhcnNlciAqLwotICAgICAgICAgIEZUX1RSQUNFNCgoICIgZG90c2VjdGlvblxuIiApKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9jbG9zZXBhdGg6Ci0gICAgICAgICAgLyogdGhpcyBpcyBhbiBpbnZhbGlkIFR5cGUgMiBvcGVyYXRvcjsgaG93ZXZlciwgdGhlcmUgICAgICAgICovCi0gICAgICAgICAgLyogZXhpc3QgZm9udHMgd2hpY2ggYXJlIGluY29ycmVjdGx5IGNvbnZlcnRlZCBmcm9tIHByb2JhYmx5ICovCi0gICAgICAgICAgLyogVHlwZSAxIHRvIENGRiwgYW5kIHNvbWUgcGFyc2VycyBzZWVtIHRvIGFjY2VwdCBpdCAgICAgICAgICovCi0KLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGNsb3NlcGF0aCAoaW52YWxpZCBvcClcbiIgKSk7Ci0KLSAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfaHNidzoKLSAgICAgICAgICAvKiB0aGlzIGlzIGFuIGludmFsaWQgVHlwZSAyIG9wZXJhdG9yOyBob3dldmVyLCB0aGVyZSAgICAgICAgKi8KLSAgICAgICAgICAvKiBleGlzdCBmb250cyB3aGljaCBhcmUgaW5jb3JyZWN0bHkgY29udmVydGVkIGZyb20gcHJvYmFibHkgKi8KLSAgICAgICAgICAvKiBUeXBlIDEgdG8gQ0ZGLCBhbmQgc29tZSBwYXJzZXJzIHNlZW0gdG8gYWNjZXB0IGl0ICAgICAgICAgKi8KLQotICAgICAgICAgIEZUX1RSQUNFNCgoICIgaHNidyAoaW52YWxpZCBvcClcbiIgKSk7Ci0KLSAgICAgICAgICBkZWNvZGVyLT5nbHlwaF93aWR0aCA9IGRlY29kZXItPm5vbWluYWxfd2lkdGggKyAoIGFyZ3NbMV0gPj4gMTYgKTsKLQotICAgICAgICAgIGRlY29kZXItPmJ1aWxkZXIubGVmdF9iZWFyaW5nLnggPSBhcmdzWzBdOwotICAgICAgICAgIGRlY29kZXItPmJ1aWxkZXIubGVmdF9iZWFyaW5nLnkgPSAwOwotCi0gICAgICAgICAgeCAgICA9IGRlY29kZXItPmJ1aWxkZXIucG9zX3ggKyBhcmdzWzBdOwotICAgICAgICAgIHkgICAgPSBkZWNvZGVyLT5idWlsZGVyLnBvc195OwotICAgICAgICAgIGFyZ3MgPSBzdGFjazsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9zYnc6Ci0gICAgICAgICAgLyogdGhpcyBpcyBhbiBpbnZhbGlkIFR5cGUgMiBvcGVyYXRvcjsgaG93ZXZlciwgdGhlcmUgICAgICAgICovCi0gICAgICAgICAgLyogZXhpc3QgZm9udHMgd2hpY2ggYXJlIGluY29ycmVjdGx5IGNvbnZlcnRlZCBmcm9tIHByb2JhYmx5ICovCi0gICAgICAgICAgLyogVHlwZSAxIHRvIENGRiwgYW5kIHNvbWUgcGFyc2VycyBzZWVtIHRvIGFjY2VwdCBpdCAgICAgICAgICovCi0KLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHNidyAoaW52YWxpZCBvcClcbiIgKSk7Ci0KLSAgICAgICAgICBkZWNvZGVyLT5nbHlwaF93aWR0aCA9IGRlY29kZXItPm5vbWluYWxfd2lkdGggKyAoIGFyZ3NbMl0gPj4gMTYgKTsKLQotICAgICAgICAgIGRlY29kZXItPmJ1aWxkZXIubGVmdF9iZWFyaW5nLnggPSBhcmdzWzBdOwotICAgICAgICAgIGRlY29kZXItPmJ1aWxkZXIubGVmdF9iZWFyaW5nLnkgPSBhcmdzWzFdOwotCi0gICAgICAgICAgeCAgICA9IGRlY29kZXItPmJ1aWxkZXIucG9zX3ggKyBhcmdzWzBdOwotICAgICAgICAgIHkgICAgPSBkZWNvZGVyLT5idWlsZGVyLnBvc195ICsgYXJnc1sxXTsKLSAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3Bfc2V0Y3VycmVudHBvaW50OgotICAgICAgICAgIC8qIHRoaXMgaXMgYW4gaW52YWxpZCBUeXBlIDIgb3BlcmF0b3I7IGhvd2V2ZXIsIHRoZXJlICAgICAgICAqLwotICAgICAgICAgIC8qIGV4aXN0IGZvbnRzIHdoaWNoIGFyZSBpbmNvcnJlY3RseSBjb252ZXJ0ZWQgZnJvbSBwcm9iYWJseSAqLwotICAgICAgICAgIC8qIFR5cGUgMSB0byBDRkYsIGFuZCBzb21lIHBhcnNlcnMgc2VlbSB0byBhY2NlcHQgaXQgICAgICAgICAqLwotCi0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBzZXRjdXJyZW50cG9pbnQgKGludmFsaWQgb3ApXG4iICkpOwotCi0gICAgICAgICAgeCAgICA9IGRlY29kZXItPmJ1aWxkZXIucG9zX3ggKyBhcmdzWzBdOwotICAgICAgICAgIHkgICAgPSBkZWNvZGVyLT5idWlsZGVyLnBvc195ICsgYXJnc1sxXTsKLSAgICAgICAgICBhcmdzID0gc3RhY2s7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfY2FsbG90aGVyc3VicjoKLSAgICAgICAgICAvKiB0aGlzIGlzIGFuIGludmFsaWQgVHlwZSAyIG9wZXJhdG9yOyBob3dldmVyLCB0aGVyZSAgICAgICAgKi8KLSAgICAgICAgICAvKiBleGlzdCBmb250cyB3aGljaCBhcmUgaW5jb3JyZWN0bHkgY29udmVydGVkIGZyb20gcHJvYmFibHkgKi8KLSAgICAgICAgICAvKiBUeXBlIDEgdG8gQ0ZGLCBhbmQgc29tZSBwYXJzZXJzIHNlZW0gdG8gYWNjZXB0IGl0ICAgICAgICAgKi8KLQotICAgICAgICAgIEZUX1RSQUNFNCgoICIgY2FsbG90aGVyc3ViciAoaW52YWxpZCBvcClcbiIgKSk7Ci0KLSAgICAgICAgICAvKiBzdWJzZXF1ZW50IGBwb3AnIG9wZXJhbmRzIHNob3VsZCBhZGQgdGhlIGFyZ3VtZW50cywgICAgICAgKi8KLSAgICAgICAgICAvKiB0aGlzIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXNjcmliZWQgZm9yIGB1bmtub3duJyBvdGhlciAgKi8KLSAgICAgICAgICAvKiBzdWJyb3V0aW5lcyBpbiB0aGUgVHlwZTEgc3BlYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBYWFggRml4IHJldHVybiBhcmd1bWVudHMgKHNlZSBkaXNjdXNzaW9uIGJlbG93KS4gICAgICAgICAgKi8KLSAgICAgICAgICBhcmdzIC09IDIgKyAoIGFyZ3NbLTJdID4+IDE2ICk7Ci0gICAgICAgICAgaWYgKCBhcmdzIDwgc3RhY2sgKQotICAgICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjZmZfb3BfcG9wOgotICAgICAgICAgIC8qIHRoaXMgaXMgYW4gaW52YWxpZCBUeXBlIDIgb3BlcmF0b3I7IGhvd2V2ZXIsIHRoZXJlICAgICAgICAqLwotICAgICAgICAgIC8qIGV4aXN0IGZvbnRzIHdoaWNoIGFyZSBpbmNvcnJlY3RseSBjb252ZXJ0ZWQgZnJvbSBwcm9iYWJseSAqLwotICAgICAgICAgIC8qIFR5cGUgMSB0byBDRkYsIGFuZCBzb21lIHBhcnNlcnMgc2VlbSB0byBhY2NlcHQgaXQgICAgICAgICAqLwotCi0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBwb3AgKGludmFsaWQgb3ApXG4iICkpOwotCi0gICAgICAgICAgLyogWFhYIEluY3JlYXNpbmcgYGFyZ3MnIGlzIHdyb25nOiBBZnRlciBhIGNlcnRhaW4gbnVtYmVyIG9mICovCi0gICAgICAgICAgLyogYHBvcCdzIHdlIGdldCBhIHN0YWNrIG92ZXJmbG93LiAgUmVhc29uIGZvciBkb2luZyBpdCBpcyAgICovCi0gICAgICAgICAgLyogY29kZSBsaWtlIHRoaXMgKGFjdHVhbGx5IGZvdW5kIGluIGEgQ0ZGIGZvbnQpOiAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICAxNyAxIDMgY2FsbG90aGVyc3ViciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICBjYWxsc3ViciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogU2luY2Ugd2UgaGFuZGxlIGBjYWxsb3RoZXJzdWJyJyBhcyBhIG5vLW9wLCBhbmQgICAgICAgICAgICovCi0gICAgICAgICAgLyogYGNhbGxzdWJyJyBuZWVkcyBhdCBsZWFzdCBvbmUgYXJndW1lbnQsIGBwb3AnIGNhbid0IGJlIGEgICovCi0gICAgICAgICAgLyogbm8tb3AgdG9vIGFzIGl0IGJhc2ljYWxseSBzaG91bGQgYmUuICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogVGhlIHJpZ2h0IHNvbHV0aW9uIHdvdWxkIGJlIHRvIHByb3ZpZGUgcmVhbCBzdXBwb3J0IGZvciAgICovCi0gICAgICAgICAgLyogYGNhbGxvdGhlcnN1YnInIGFzIGRvbmUgaW4gYHQxZGVjb2RlLmMnLCBob3dldmVyLCBnaXZlbiAgICovCi0gICAgICAgICAgLyogdGhlIGZhY3QgdGhhdCBDRkYgZm9udHMgd2l0aCBgcG9wJyBhcmUgaW52YWxpZCwgaXQgaXMgICAgICovCi0gICAgICAgICAgLyogcXVlc3Rpb25hYmxlIHdoZXRoZXIgaXQgaXMgd29ydGggdGhlIHRpbWUuICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgYXJncysrOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2FuZDoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9GaXhlZCAgY29uZCA9IGFyZ3NbMF0gJiYgYXJnc1sxXTsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGFuZFxuIiApKTsKLQotICAgICAgICAgICAgYXJnc1swXSA9IGNvbmQgPyAweDEwMDAwTCA6IDA7Ci0gICAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX29yOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ZpeGVkICBjb25kID0gYXJnc1swXSB8fCBhcmdzWzFdOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgb3JcbiIgKSk7Ci0KLSAgICAgICAgICAgIGFyZ3NbMF0gPSBjb25kID8gMHgxMDAwMEwgOiAwOwotICAgICAgICAgICAgYXJncysrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9lcToKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9GaXhlZCAgY29uZCA9ICFhcmdzWzBdOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgZXFcbiIgKSk7Ci0KLSAgICAgICAgICAgIGFyZ3NbMF0gPSBjb25kID8gMHgxMDAwMEwgOiAwOwotICAgICAgICAgICAgYXJncysrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9pZmVsc2U6Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRml4ZWQgIGNvbmQgPSAoIGFyZ3NbMl0gPD0gYXJnc1szXSApOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgaWZlbHNlXG4iICkpOwotCi0gICAgICAgICAgICBpZiAoICFjb25kICkKLSAgICAgICAgICAgICAgYXJnc1swXSA9IGFyZ3NbMV07Ci0gICAgICAgICAgICBhcmdzKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX2NhbGxzdWJyOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1VJbnQgIGlkeCA9IChGVF9VSW50KSggKCBhcmdzWzBdID4+IDE2ICkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLT5sb2NhbHNfYmlhcyApOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgY2FsbHN1YnIgKGlkeCAlZCwgZW50ZXJpbmcgbGV2ZWwgJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgem9uZSAtIGRlY29kZXItPnpvbmVzICsgMSApKTsKLQotICAgICAgICAgICAgaWYgKCBpZHggPj0gZGVjb2Rlci0+bnVtX2xvY2FscyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0VSUk9SKCggImNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgbG9jYWwgc3ViciBpbmRleFxuIiApKTsKLSAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggem9uZSAtIGRlY29kZXItPnpvbmVzID49IENGRl9NQVhfU1VCUlNfQ0FMTFMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9FUlJPUigoICJjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiB0b28gbWFueSBuZXN0ZWQgc3VicnNcbiIgKSk7Ci0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB6b25lLT5jdXJzb3IgPSBpcDsgIC8qIHNhdmUgY3VycmVudCBpbnN0cnVjdGlvbiBwb2ludGVyICovCi0KLSAgICAgICAgICAgIHpvbmUrKzsKLSAgICAgICAgICAgIHpvbmUtPmJhc2UgICA9IGRlY29kZXItPmxvY2Fsc1tpZHhdOwotICAgICAgICAgICAgem9uZS0+bGltaXQgID0gZGVjb2Rlci0+bG9jYWxzW2lkeCArIDFdOwotICAgICAgICAgICAgem9uZS0+Y3Vyc29yID0gem9uZS0+YmFzZTsKLQotICAgICAgICAgICAgaWYgKCAhem9uZS0+YmFzZSB8fCB6b25lLT5saW1pdCA9PSB6b25lLT5iYXNlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfRVJST1IoKCAiY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IgotICAgICAgICAgICAgICAgICAgICAgICAgICIgaW52b2tpbmcgZW1wdHkgc3VicnNcbiIgKSk7Ci0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWNvZGVyLT56b25lID0gem9uZTsKLSAgICAgICAgICAgIGlwICAgICAgICAgICAgPSB6b25lLT5iYXNlOwotICAgICAgICAgICAgbGltaXQgICAgICAgICA9IHpvbmUtPmxpbWl0OwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNmZl9vcF9jYWxsZ3N1YnI6Ci0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVUludCAgaWR4ID0gKEZUX1VJbnQpKCAoIGFyZ3NbMF0gPj4gMTYgKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXItPmdsb2JhbHNfYmlhcyApOwotCi0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgY2FsbGdzdWJyIChpZHggJWQsIGVudGVyaW5nIGxldmVsICVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHpvbmUgLSBkZWNvZGVyLT56b25lcyArIDEgKSk7Ci0KLSAgICAgICAgICAgIGlmICggaWR4ID49IGRlY29kZXItPm51bV9nbG9iYWxzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfRVJST1IoKCAiY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IgotICAgICAgICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBnbG9iYWwgc3ViciBpbmRleFxuIiApKTsKLSAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggem9uZSAtIGRlY29kZXItPnpvbmVzID49IENGRl9NQVhfU1VCUlNfQ0FMTFMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9FUlJPUigoICJjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiB0b28gbWFueSBuZXN0ZWQgc3VicnNcbiIgKSk7Ci0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB6b25lLT5jdXJzb3IgPSBpcDsgIC8qIHNhdmUgY3VycmVudCBpbnN0cnVjdGlvbiBwb2ludGVyICovCi0KLSAgICAgICAgICAgIHpvbmUrKzsKLSAgICAgICAgICAgIHpvbmUtPmJhc2UgICA9IGRlY29kZXItPmdsb2JhbHNbaWR4XTsKLSAgICAgICAgICAgIHpvbmUtPmxpbWl0ICA9IGRlY29kZXItPmdsb2JhbHNbaWR4ICsgMV07Ci0gICAgICAgICAgICB6b25lLT5jdXJzb3IgPSB6b25lLT5iYXNlOwotCi0gICAgICAgICAgICBpZiAoICF6b25lLT5iYXNlIHx8IHpvbmUtPmxpbWl0ID09IHpvbmUtPmJhc2UgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9FUlJPUigoICJjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiBpbnZva2luZyBlbXB0eSBzdWJyc1xuIiApKTsKLSAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlY29kZXItPnpvbmUgPSB6b25lOwotICAgICAgICAgICAgaXAgICAgICAgICAgICA9IHpvbmUtPmJhc2U7Ci0gICAgICAgICAgICBsaW1pdCAgICAgICAgID0gem9uZS0+bGltaXQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY2ZmX29wX3JldHVybjoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHJldHVybiAobGVhdmluZyBsZXZlbCAlZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgZGVjb2Rlci0+em9uZSAtIGRlY29kZXItPnpvbmVzICkpOwotCi0gICAgICAgICAgaWYgKCBkZWNvZGVyLT56b25lIDw9IGRlY29kZXItPnpvbmVzICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9FUlJPUigoICJjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgICAgICAgICIgdW5leHBlY3RlZCByZXR1cm5cbiIgKSk7Ci0gICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBkZWNvZGVyLT56b25lLS07Ci0gICAgICAgICAgem9uZSAgPSBkZWNvZGVyLT56b25lOwotICAgICAgICAgIGlwICAgID0gem9uZS0+Y3Vyc29yOwotICAgICAgICAgIGxpbWl0ID0gem9uZS0+bGltaXQ7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgVW5pbXBsZW1lbnRlZDoKLSAgICAgICAgICBGVF9FUlJPUigoICJVbmltcGxlbWVudGVkIG9wY29kZTogJWQiLCBpcFstMV0gKSk7Ci0KLSAgICAgICAgICBpZiAoIGlwWy0xXSA9PSAxMiApCi0gICAgICAgICAgICBGVF9FUlJPUigoICIgJWQiLCBpcFswXSApKTsKLSAgICAgICAgICBGVF9FUlJPUigoICJcbiIgKSk7Ci0KLSAgICAgICAgICByZXR1cm4gRlRfVEhST1coIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVjb2Rlci0+dG9wID0gYXJnczsKLQotICAgICAgICBpZiAoIGRlY29kZXItPnRvcCAtIHN0YWNrID49IENGRl9NQVhfT1BFUkFORFMgKQotICAgICAgICAgIGdvdG8gU3RhY2tfT3ZlcmZsb3c7Ci0KLSAgICAgIH0gLyogZ2VuZXJhbCBvcGVyYXRvciBwcm9jZXNzaW5nICovCi0KLSAgICB9IC8qIHdoaWxlIGlwIDwgbGltaXQgKi8KLQotICAgIEZUX1RSQUNFNCgoICIuLmVuZC4uXG5cbiIgKSk7Ci0KLSAgRmFpbDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgU3ludGF4X0Vycm9yOgotICAgIEZUX1RSQUNFNCgoICJjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczogc3ludGF4IGVycm9yXG4iICkpOwotICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotCi0gIFN0YWNrX1VuZGVyZmxvdzoKLSAgICBGVF9UUkFDRTQoKCAiY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IHN0YWNrIHVuZGVyZmxvd1xuIiApKTsKLSAgICByZXR1cm4gRlRfVEhST1coIFRvb19GZXdfQXJndW1lbnRzICk7Ci0KLSAgU3RhY2tfT3ZlcmZsb3c6Ci0gICAgRlRfVFJBQ0U0KCggImNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiBzdGFjayBvdmVyZmxvd1xuIiApKTsKLSAgICByZXR1cm4gRlRfVEhST1coIFN0YWNrX092ZXJmbG93ICk7Ci0gIH0KLQotI2VuZGlmIC8qIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgICAgICAgICBDT01QVVRFIFRIRSBNQVhJTVVNIEFEVkFOQ0UgV0lEVEggICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICBUaGUgZm9sbG93aW5nIGNvZGUgaXMgaW4gY2hhcmdlIG9mIGNvbXB1dGluZyAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgdGhlIG1heGltdW0gYWR2YW5jZSB3aWR0aCBvZiB0aGUgZm9udC4gIEl0ICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgIHF1aWNrbHkgcHJvY2Vzc2VzIGVhY2ggZ2x5cGggY2hhcnN0cmluZyB0byAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICBleHRyYWN0IHRoZSB2YWx1ZSBmcm9tIGVpdGhlciBhIGBzYncnIG9yIGBzZWFjJyAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgb3BlcmF0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZiAwIC8qIHVudXNlZCB1bnRpbCB3ZSBzdXBwb3J0IHB1cmUgQ0ZGIGZvbnRzICovCi0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2ZmX2NvbXB1dGVfbWF4X2FkdmFuY2UoIFRUX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQqICBtYXhfYWR2YW5jZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgQ0ZGX0RlY29kZXIgIGRlY29kZXI7Ci0gICAgRlRfSW50ICAgICAgIGdseXBoX2luZGV4OwotICAgIENGRl9Gb250ICAgICBjZmYgPSAoQ0ZGX0ZvbnQpZmFjZS0+b3RoZXI7Ci0KLQotICAgICptYXhfYWR2YW5jZSA9IDA7Ci0KLSAgICAvKiBJbml0aWFsaXplIGxvYWQgZGVjb2RlciAqLwotICAgIGNmZl9kZWNvZGVyX2luaXQoICZkZWNvZGVyLCBmYWNlLCAwLCAwLCAwLCAwICk7Ci0KLSAgICBkZWNvZGVyLmJ1aWxkZXIubWV0cmljc19vbmx5ID0gMTsKLSAgICBkZWNvZGVyLmJ1aWxkZXIubG9hZF9wb2ludHMgID0gMDsKLQotICAgIC8qIEZvciBlYWNoIGdseXBoLCBwYXJzZSB0aGUgZ2x5cGggY2hhcnN0cmluZyBhbmQgZXh0cmFjdCAqLwotICAgIC8qIHRoZSBhZHZhbmNlIHdpZHRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGZvciAoIGdseXBoX2luZGV4ID0gMDsgZ2x5cGhfaW5kZXggPCBmYWNlLT5yb290Lm51bV9nbHlwaHM7Ci0gICAgICAgICAgZ2x5cGhfaW5kZXgrKyApCi0gICAgewotICAgICAgRlRfQnl0ZSogIGNoYXJzdHJpbmc7Ci0gICAgICBGVF9VTG9uZyAgY2hhcnN0cmluZ19sZW47Ci0KLQotICAgICAgLyogbm93IGdldCBsb2FkIHRoZSB1bnNjYWxlZCBvdXRsaW5lICovCi0gICAgICBlcnJvciA9IGNmZl9nZXRfZ2x5cGhfZGF0YSggZmFjZSwgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYXJzdHJpbmcsICZjaGFyc3RyaW5nX2xlbiApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgewotICAgICAgICBlcnJvciA9IGNmZl9kZWNvZGVyX3ByZXBhcmUoICZkZWNvZGVyLCBzaXplLCBnbHlwaF9pbmRleCApOwotICAgICAgICBpZiAoICFlcnJvciApCi0gICAgICAgICAgZXJyb3IgPSBjZmZfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyggJmRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc3RyaW5nX2xlbiApOwotCi0gICAgICAgIGNmZl9mcmVlX2dseXBoX2RhdGEoIGZhY2UsICZjaGFyc3RyaW5nLCAmY2hhcnN0cmluZ19sZW4gKTsKLSAgICAgIH0KLQotICAgICAgLyogaWdub3JlIHRoZSBlcnJvciBpZiBvbmUgaGFzIG9jY3VycmVkIC0tIHNraXAgdG8gbmV4dCBnbHlwaCAqLwotICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgfQotCi0gICAgKm1heF9hZHZhbmNlID0gZGVjb2Rlci5idWlsZGVyLmFkdmFuY2UueDsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0jZW5kaWYgLyogMCAqLwotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNmZl9zbG90X2xvYWQoIENGRl9HbHlwaFNsb3QgIGdseXBoLAotICAgICAgICAgICAgICAgICBDRkZfU2l6ZSAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgRlRfSW50MzIgICAgICAgbG9hZF9mbGFncyApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgZXJyb3I7Ci0gICAgQ0ZGX0RlY29kZXIgIGRlY29kZXI7Ci0gICAgVFRfRmFjZSAgICAgIGZhY2UgPSAoVFRfRmFjZSlnbHlwaC0+cm9vdC5mYWNlOwotICAgIEZUX0Jvb2wgICAgICBoaW50aW5nLCBzY2FsZWQsIGZvcmNlX3NjYWxpbmc7Ci0gICAgQ0ZGX0ZvbnQgICAgIGNmZiAgPSAoQ0ZGX0ZvbnQpZmFjZS0+ZXh0cmEuZGF0YTsKLQotICAgIEZUX01hdHJpeCAgICBmb250X21hdHJpeDsKLSAgICBGVF9WZWN0b3IgICAgZm9udF9vZmZzZXQ7Ci0KLQotICAgIGZvcmNlX3NjYWxpbmcgPSBGQUxTRTsKLQotICAgIC8qIGluIGEgQ0lELWtleWVkIGZvbnQsIGNvbnNpZGVyIGBnbHlwaF9pbmRleCcgYXMgYSBDSUQgYW5kIG1hcCAqLwotICAgIC8qIGl0IGltbWVkaWF0ZWx5IHRvIHRoZSByZWFsIGdseXBoX2luZGV4IC0tIGlmIGl0IGlzbid0IGEgICAgICAqLwotICAgIC8qIHN1YnNldHRlZCBmb250LCBnbHlwaF9pbmRpY2VzIGFuZCBDSURzIGFyZSBpZGVudGljYWwsIHRob3VnaCAqLwotICAgIGlmICggY2ZmLT50b3BfZm9udC5mb250X2RpY3QuY2lkX3JlZ2lzdHJ5ICE9IDB4RkZGRlUgJiYKLSAgICAgICAgIGNmZi0+Y2hhcnNldC5jaWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICB7Ci0gICAgICAvKiBkb24ndCBoYW5kbGUgQ0lEIDAgKC5ub3RkZWYpIHdoaWNoIGlzIGRpcmVjdGx5IG1hcHBlZCB0byBHSUQgMCAqLwotICAgICAgaWYgKCBnbHlwaF9pbmRleCAhPSAwICkKLSAgICAgIHsKLSAgICAgICAgZ2x5cGhfaW5kZXggPSBjZmZfY2hhcnNldF9jaWRfdG9fZ2luZGV4KCAmY2ZmLT5jaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4ICk7Ci0gICAgICAgIGlmICggZ2x5cGhfaW5kZXggPT0gMCApCi0gICAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKCBnbHlwaF9pbmRleCA+PSBjZmYtPm51bV9nbHlwaHMgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1JFQ1VSU0UgKQotICAgICAgbG9hZF9mbGFncyB8PSBGVF9MT0FEX05PX1NDQUxFIHwgRlRfTE9BRF9OT19ISU5USU5HOwotCi0gICAgZ2x5cGgtPnhfc2NhbGUgPSAweDEwMDAwTDsKLSAgICBnbHlwaC0+eV9zY2FsZSA9IDB4MTAwMDBMOwotICAgIGlmICggc2l6ZSApCi0gICAgewotICAgICAgZ2x5cGgtPnhfc2NhbGUgPSBzaXplLT5yb290Lm1ldHJpY3MueF9zY2FsZTsKLSAgICAgIGdseXBoLT55X3NjYWxlID0gc2l6ZS0+cm9vdC5tZXRyaWNzLnlfc2NhbGU7Ci0gICAgfQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCi0KLSAgICAvKiB0cnkgdG8gbG9hZCBlbWJlZGRlZCBiaXRtYXAgaWYgYW55ICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogWFhYOiBUaGUgY29udmVudGlvbiBzaG91bGQgYmUgZW1waGFzaXplZCBpbiAgICAgKi8KLSAgICAvKiAgICAgIHRoZSBkb2N1bWVudHMgYmVjYXVzZSBpdCBjYW4gYmUgY29uZnVzaW5nLiAqLwotICAgIGlmICggc2l6ZSApCi0gICAgewotICAgICAgQ0ZGX0ZhY2UgICAgICBjZmZfZmFjZSA9IChDRkZfRmFjZSlzaXplLT5yb290LmZhY2U7Ci0gICAgICBTRk5UX1NlcnZpY2UgIHNmbnQgICAgID0gKFNGTlRfU2VydmljZSljZmZfZmFjZS0+c2ZudDsKLSAgICAgIEZUX1N0cmVhbSAgICAgc3RyZWFtICAgPSBjZmZfZmFjZS0+cm9vdC5zdHJlYW07Ci0KLQotICAgICAgaWYgKCBzaXplLT5zdHJpa2VfaW5kZXggIT0gMHhGRkZGRkZGRlVMICAgICAgJiYKLSAgICAgICAgICAgc2ZudC0+bG9hZF9lYmxjICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fQklUTUFQICkgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIFRUX1NCaXRfTWV0cmljc1JlYyAgbWV0cmljczsKLQotCi0gICAgICAgIGVycm9yID0gc2ZudC0+bG9hZF9zYml0X2ltYWdlKCBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS0+c3RyaWtlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludClsb2FkX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdseXBoLT5yb290LmJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXRyaWNzICk7Ci0KLSAgICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfQm9vbCAgICBoYXNfdmVydGljYWxfaW5mbzsKLSAgICAgICAgICBGVF9VU2hvcnQgIGFkdmFuY2U7Ci0gICAgICAgICAgRlRfU2hvcnQgICBkdW1teTsKLQotCi0gICAgICAgICAgZ2x5cGgtPnJvb3Qub3V0bGluZS5uX3BvaW50cyAgID0gMDsKLSAgICAgICAgICBnbHlwaC0+cm9vdC5vdXRsaW5lLm5fY29udG91cnMgPSAwOwotCi0gICAgICAgICAgZ2x5cGgtPnJvb3QubWV0cmljcy53aWR0aCAgPSAoRlRfUG9zKW1ldHJpY3Mud2lkdGggIDw8IDY7Ci0gICAgICAgICAgZ2x5cGgtPnJvb3QubWV0cmljcy5oZWlnaHQgPSAoRlRfUG9zKW1ldHJpY3MuaGVpZ2h0IDw8IDY7Ci0KLSAgICAgICAgICBnbHlwaC0+cm9vdC5tZXRyaWNzLmhvcmlCZWFyaW5nWCA9IChGVF9Qb3MpbWV0cmljcy5ob3JpQmVhcmluZ1ggPDwgNjsKLSAgICAgICAgICBnbHlwaC0+cm9vdC5tZXRyaWNzLmhvcmlCZWFyaW5nWSA9IChGVF9Qb3MpbWV0cmljcy5ob3JpQmVhcmluZ1kgPDwgNjsKLSAgICAgICAgICBnbHlwaC0+cm9vdC5tZXRyaWNzLmhvcmlBZHZhbmNlICA9IChGVF9Qb3MpbWV0cmljcy5ob3JpQWR2YW5jZSAgPDwgNjsKLQotICAgICAgICAgIGdseXBoLT5yb290Lm1ldHJpY3MudmVydEJlYXJpbmdYID0gKEZUX1BvcyltZXRyaWNzLnZlcnRCZWFyaW5nWCA8PCA2OwotICAgICAgICAgIGdseXBoLT5yb290Lm1ldHJpY3MudmVydEJlYXJpbmdZID0gKEZUX1BvcyltZXRyaWNzLnZlcnRCZWFyaW5nWSA8PCA2OwotICAgICAgICAgIGdseXBoLT5yb290Lm1ldHJpY3MudmVydEFkdmFuY2UgID0gKEZUX1BvcyltZXRyaWNzLnZlcnRBZHZhbmNlICA8PCA2OwotCi0gICAgICAgICAgZ2x5cGgtPnJvb3QuZm9ybWF0ID0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUDsKLQotICAgICAgICAgIGlmICggbG9hZF9mbGFncyAmIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBnbHlwaC0+cm9vdC5iaXRtYXBfbGVmdCA9IG1ldHJpY3MudmVydEJlYXJpbmdYOwotICAgICAgICAgICAgZ2x5cGgtPnJvb3QuYml0bWFwX3RvcCAgPSBtZXRyaWNzLnZlcnRCZWFyaW5nWTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdseXBoLT5yb290LmJpdG1hcF9sZWZ0ID0gbWV0cmljcy5ob3JpQmVhcmluZ1g7Ci0gICAgICAgICAgICBnbHlwaC0+cm9vdC5iaXRtYXBfdG9wICA9IG1ldHJpY3MuaG9yaUJlYXJpbmdZOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIGNvbXB1dGUgbGluZWFyIGFkdmFuY2Ugd2lkdGhzICovCi0KLSAgICAgICAgICAodm9pZCkoIChTRk5UX1NlcnZpY2UpZmFjZS0+c2ZudCApLT5nZXRfbWV0cmljcyggZmFjZSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdW1teSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkdmFuY2UgKTsKLSAgICAgICAgICBnbHlwaC0+cm9vdC5saW5lYXJIb3JpQWR2YW5jZSA9IGFkdmFuY2U7Ci0KLSAgICAgICAgICBoYXNfdmVydGljYWxfaW5mbyA9IEZUX0JPT0woCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnZlcnRpY2FsX2luZm8gICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+dmVydGljYWwubnVtYmVyX09mX1ZNZXRyaWNzID4gMCApOwotCi0gICAgICAgICAgLyogZ2V0IHRoZSB2ZXJ0aWNhbCBtZXRyaWNzIGZyb20gdGhlIHZtdHggdGFibGUgaWYgd2UgaGF2ZSBvbmUgKi8KLSAgICAgICAgICBpZiAoIGhhc192ZXJ0aWNhbF9pbmZvICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAodm9pZCkoIChTRk5UX1NlcnZpY2UpZmFjZS0+c2ZudCApLT5nZXRfbWV0cmljcyggZmFjZSwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVtbXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkdmFuY2UgKTsKLSAgICAgICAgICAgIGdseXBoLT5yb290LmxpbmVhclZlcnRBZHZhbmNlID0gYWR2YW5jZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIG1ha2UgdXAgdmVydGljYWwgb25lcyAqLwotICAgICAgICAgICAgaWYgKCBmYWNlLT5vczIudmVyc2lvbiAhPSAweEZGRkZVICkKLSAgICAgICAgICAgICAgZ2x5cGgtPnJvb3QubGluZWFyVmVydEFkdmFuY2UgPSAoRlRfUG9zKQotICAgICAgICAgICAgICAgICggZmFjZS0+b3MyLnNUeXBvQXNjZW5kZXIgLSBmYWNlLT5vczIuc1R5cG9EZXNjZW5kZXIgKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgZ2x5cGgtPnJvb3QubGluZWFyVmVydEFkdmFuY2UgPSAoRlRfUG9zKQotICAgICAgICAgICAgICAgICggZmFjZS0+aG9yaXpvbnRhbC5Bc2NlbmRlciAtIGZhY2UtPmhvcml6b250YWwuRGVzY2VuZGVyICk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTICovCi0KLSAgICAvKiByZXR1cm4gaW1tZWRpYXRlbHkgaWYgd2Ugb25seSB3YW50IHRoZSBlbWJlZGRlZCBiaXRtYXBzICovCi0gICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9TQklUU19PTkxZICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgLyogaWYgd2UgaGF2ZSBhIENJRCBzdWJmb250LCB1c2UgaXRzIG1hdHJpeCAod2hpY2ggaGFzIGFscmVhZHkgKi8KLSAgICAvKiBiZWVuIG11bHRpcGxpZWQgd2l0aCB0aGUgcm9vdCBtYXRyaXgpICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgLyogdGhpcyBzY2FsaW5nIGlzIG9ubHkgcmVsZXZhbnQgaWYgdGhlIFBTIGhpbnRlciBpc24ndCBhY3RpdmUgKi8KLSAgICBpZiAoIGNmZi0+bnVtX3N1YmZvbnRzICkKLSAgICB7Ci0gICAgICBGVF9Mb25nICB0b3BfdXBtLCBzdWJfdXBtOwotICAgICAgRlRfQnl0ZSAgZmRfaW5kZXggPSBjZmZfZmRfc2VsZWN0X2dldCggJmNmZi0+ZmRfc2VsZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXggKTsKLQotCi0gICAgICBpZiAoIGZkX2luZGV4ID49IGNmZi0+bnVtX3N1YmZvbnRzICkKLSAgICAgICAgZmRfaW5kZXggPSAoRlRfQnl0ZSkoIGNmZi0+bnVtX3N1YmZvbnRzIC0gMSApOwotCi0gICAgICB0b3BfdXBtID0gKEZUX0xvbmcpY2ZmLT50b3BfZm9udC5mb250X2RpY3QudW5pdHNfcGVyX2VtOwotICAgICAgc3ViX3VwbSA9IChGVF9Mb25nKWNmZi0+c3ViZm9udHNbZmRfaW5kZXhdLT5mb250X2RpY3QudW5pdHNfcGVyX2VtOwotCi0KLSAgICAgIGZvbnRfbWF0cml4ID0gY2ZmLT5zdWJmb250c1tmZF9pbmRleF0tPmZvbnRfZGljdC5mb250X21hdHJpeDsKLSAgICAgIGZvbnRfb2Zmc2V0ID0gY2ZmLT5zdWJmb250c1tmZF9pbmRleF0tPmZvbnRfZGljdC5mb250X29mZnNldDsKLQotICAgICAgaWYgKCB0b3BfdXBtICE9IHN1Yl91cG0gKQotICAgICAgewotICAgICAgICBnbHlwaC0+eF9zY2FsZSA9IEZUX011bERpdiggZ2x5cGgtPnhfc2NhbGUsIHRvcF91cG0sIHN1Yl91cG0gKTsKLSAgICAgICAgZ2x5cGgtPnlfc2NhbGUgPSBGVF9NdWxEaXYoIGdseXBoLT55X3NjYWxlLCB0b3BfdXBtLCBzdWJfdXBtICk7Ci0KLSAgICAgICAgZm9yY2Vfc2NhbGluZyA9IFRSVUU7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBmb250X21hdHJpeCA9IGNmZi0+dG9wX2ZvbnQuZm9udF9kaWN0LmZvbnRfbWF0cml4OwotICAgICAgZm9udF9vZmZzZXQgPSBjZmYtPnRvcF9mb250LmZvbnRfZGljdC5mb250X29mZnNldDsKLSAgICB9Ci0KLSAgICBnbHlwaC0+cm9vdC5vdXRsaW5lLm5fcG9pbnRzICAgPSAwOwotICAgIGdseXBoLT5yb290Lm91dGxpbmUubl9jb250b3VycyA9IDA7Ci0KLSAgICAvKiB0b3AtbGV2ZWwgY29kZSBlbnN1cmVzIHRoYXQgRlRfTE9BRF9OT19ISU5USU5HIGlzIHNldCAqLwotICAgIC8qIGlmIEZUX0xPQURfTk9fU0NBTEUgaXMgYWN0aXZlICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaGludGluZyA9IEZUX0JPT0woICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fSElOVElORyApID09IDAgKTsKLSAgICBzY2FsZWQgID0gRlRfQk9PTCggKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSAgICkgPT0gMCApOwotCi0gICAgZ2x5cGgtPmhpbnQgICAgICAgID0gaGludGluZzsKLSAgICBnbHlwaC0+c2NhbGVkICAgICAgPSBzY2FsZWQ7Ci0gICAgZ2x5cGgtPnJvb3QuZm9ybWF0ID0gRlRfR0xZUEhfRk9STUFUX09VVExJTkU7ICAvKiBieSBkZWZhdWx0ICovCi0KLSAgICB7Ci0jaWZkZWYgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORQotICAgICAgQ0ZGX0RyaXZlciAgZHJpdmVyID0gKENGRl9Ecml2ZXIpRlRfRkFDRV9EUklWRVIoIGZhY2UgKTsKLSNlbmRpZgotCi0KLSAgICAgIEZUX0J5dGUqICBjaGFyc3RyaW5nOwotICAgICAgRlRfVUxvbmcgIGNoYXJzdHJpbmdfbGVuOwotCi0KLSAgICAgIGNmZl9kZWNvZGVyX2luaXQoICZkZWNvZGVyLCBmYWNlLCBzaXplLCBnbHlwaCwgaGludGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xPQURfVEFSR0VUX01PREUoIGxvYWRfZmxhZ3MgKSApOwotCi0gICAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX0FEVkFOQ0VfT05MWSApCi0gICAgICAgIGRlY29kZXIud2lkdGhfb25seSA9IFRSVUU7Ci0KLSAgICAgIGRlY29kZXIuYnVpbGRlci5ub19yZWN1cnNlID0KLSAgICAgICAgKEZUX0Jvb2wpKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19SRUNVUlNFICk7Ci0KLSAgICAgIC8qIG5vdyBsb2FkIHRoZSB1bnNjYWxlZCBvdXRsaW5lICovCi0gICAgICBlcnJvciA9IGNmZl9nZXRfZ2x5cGhfZGF0YSggZmFjZSwgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYXJzdHJpbmcsICZjaGFyc3RyaW5nX2xlbiApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gR2x5cGhfQnVpbGRfRmluaXNoZWQ7Ci0KLSAgICAgIGVycm9yID0gY2ZmX2RlY29kZXJfcHJlcGFyZSggJmRlY29kZXIsIHNpemUsIGdseXBoX2luZGV4ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBHbHlwaF9CdWlsZF9GaW5pc2hlZDsKLQotI2lmZGVmIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUKLSAgICAgIC8qIGNob29zZSB3aGljaCBDRkYgcmVuZGVyZXIgdG8gdXNlICovCi0gICAgICBpZiAoIGRyaXZlci0+aGludGluZ19lbmdpbmUgPT0gRlRfQ0ZGX0hJTlRJTkdfRlJFRVRZUEUgKQotICAgICAgICBlcnJvciA9IGNmZl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKCAmZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnN0cmluZ19sZW4gKTsKLSAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgewotICAgICAgICBlcnJvciA9IGNmMl9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKCAmZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnN0cmluZ19sZW4gKTsKLQotICAgICAgICAvKiBBZG9iZSdzIGVuZ2luZSB1c2VzIDE2LjE2IG51bWJlcnMgZXZlcnl3aGVyZTsgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIGFzIGEgY29uc2VxdWVuY2UsIGdseXBocyBsYXJnZXIgdGhhbiAyMDAwcHBlbSBnZXQgcmVqZWN0ZWQgKi8KLSAgICAgICAgaWYgKCBGVF9FUlJfRVEoIGVycm9yLCBHbHlwaF9Ub29fQmlnICkgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogdGhpcyB0aW1lLCB3ZSByZXRyeSB1bmhpbnRlZCBhbmQgc2NhbGUgdXAgdGhlIGdseXBoIGxhdGVyIG9uICovCi0gICAgICAgICAgLyogKHRoZSBlbmdpbmUgdXNlcyBhbmQgc2V0cyB0aGUgaGFyZGNvZGVkIHZhbHVlIDB4MTAwMDAgLyA2NCA9ICovCi0gICAgICAgICAgLyogMHg0MDAgZm9yIGJvdGggYHhfc2NhbGUnIGFuZCBgeV9zY2FsZScgaW4gdGhpcyBjYXNlKSAgICAgICAgICovCi0gICAgICAgICAgaGludGluZyAgICAgICA9IEZBTFNFOwotICAgICAgICAgIGZvcmNlX3NjYWxpbmcgPSBUUlVFOwotICAgICAgICAgIGdseXBoLT5oaW50ICAgPSBoaW50aW5nOwotCi0gICAgICAgICAgZXJyb3IgPSBjZjJfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5ncyggJmRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc3RyaW5nX2xlbiApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGNmZl9mcmVlX2dseXBoX2RhdGEoIGZhY2UsICZjaGFyc3RyaW5nLCBjaGFyc3RyaW5nX2xlbiApOwotCi0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBHbHlwaF9CdWlsZF9GaW5pc2hlZDsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICAgIC8qIENvbnRyb2wgZGF0YSBhbmQgbGVuZ3RoIG1heSBub3QgYmUgYXZhaWxhYmxlIGZvciBpbmNyZW1lbnRhbCAqLwotICAgICAgLyogZm9udHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSApCi0gICAgICB7Ci0gICAgICAgIGdseXBoLT5yb290LmNvbnRyb2xfZGF0YSA9IE5VTEw7Ci0gICAgICAgIGdseXBoLT5yb290LmNvbnRyb2xfbGVuID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMICovCi0KLSAgICAgIC8qIFdlIHNldCBjb250cm9sX2RhdGEgYW5kIGNvbnRyb2xfbGVuIGlmIGNoYXJzdHJpbmdzIGlzIGxvYWRlZC4gKi8KLSAgICAgIC8qIFNlZSBob3cgY2hhcnN0cmluZyBsb2FkcyBhdCBjZmZfaW5kZXhfYWNjZXNzX2VsZW1lbnQoKSBpbiAgICAgKi8KLSAgICAgIC8qIGNmZmxvYWQuYy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIHsKLSAgICAgICAgQ0ZGX0luZGV4ICBjc2luZGV4ID0gJmNmZi0+Y2hhcnN0cmluZ3NfaW5kZXg7Ci0KLQotICAgICAgICBpZiAoIGNzaW5kZXgtPm9mZnNldHMgKQotICAgICAgICB7Ci0gICAgICAgICAgZ2x5cGgtPnJvb3QuY29udHJvbF9kYXRhID0gY3NpbmRleC0+Ynl0ZXMgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzaW5kZXgtPm9mZnNldHNbZ2x5cGhfaW5kZXhdIC0gMTsKLSAgICAgICAgICBnbHlwaC0+cm9vdC5jb250cm9sX2xlbiAgPSAoRlRfTG9uZyljaGFyc3RyaW5nX2xlbjsKLSAgICAgICAgfQotICAgICAgfQotCi0gIEdseXBoX0J1aWxkX0ZpbmlzaGVkOgotICAgICAgLyogc2F2ZSBuZXcgZ2x5cGggdGFibGVzLCBpZiBubyBlcnJvciAqLwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICBjZmZfYnVpbGRlcl9kb25lKCAmZGVjb2Rlci5idWlsZGVyICk7Ci0gICAgICAvKiBYWFg6IGFueXRoaW5nIHRvIGRvIGZvciBicm9rZW4gZ2x5cGggZW50cnk/ICovCi0gICAgfQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotCi0gICAgLyogSW5jcmVtZW50YWwgZm9udHMgY2FuIG9wdGlvbmFsbHkgb3ZlcnJpZGUgdGhlIG1ldHJpY3MuICovCi0gICAgaWYgKCAhZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+ZnVuY3MtPmdldF9nbHlwaF9tZXRyaWNzICkKLSAgICB7Ci0gICAgICBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzUmVjICBtZXRyaWNzOwotCi0KLSAgICAgIG1ldHJpY3MuYmVhcmluZ194ID0gZGVjb2Rlci5idWlsZGVyLmxlZnRfYmVhcmluZy54OwotICAgICAgbWV0cmljcy5iZWFyaW5nX3kgPSAwOwotICAgICAgbWV0cmljcy5hZHZhbmNlICAgPSBkZWNvZGVyLmJ1aWxkZXIuYWR2YW5jZS54OwotICAgICAgbWV0cmljcy5hZHZhbmNlX3YgPSBkZWNvZGVyLmJ1aWxkZXIuYWR2YW5jZS55OwotCi0gICAgICBlcnJvciA9IGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+ZnVuY3MtPmdldF9nbHlwaF9tZXRyaWNzKAotICAgICAgICAgICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+b2JqZWN0LAotICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LCBGQUxTRSwgJm1ldHJpY3MgKTsKLQotICAgICAgZGVjb2Rlci5idWlsZGVyLmxlZnRfYmVhcmluZy54ID0gbWV0cmljcy5iZWFyaW5nX3g7Ci0gICAgICBkZWNvZGVyLmJ1aWxkZXIuYWR2YW5jZS54ICAgICAgPSBtZXRyaWNzLmFkdmFuY2U7Ci0gICAgICBkZWNvZGVyLmJ1aWxkZXIuYWR2YW5jZS55ICAgICAgPSBtZXRyaWNzLmFkdmFuY2VfdjsKLSAgICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMICovCi0KLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgLyogTm93LCBzZXQgdGhlIG1ldHJpY3MgLS0gdGhpcyBpcyByYXRoZXIgc2ltcGxlLCBhcyAgICovCi0gICAgICAvKiB0aGUgbGVmdCBzaWRlIGJlYXJpbmcgaXMgdGhlIHhNaW4sIGFuZCB0aGUgdG9wIHNpZGUgKi8KLSAgICAgIC8qIGJlYXJpbmcgdGhlIHlNYXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAvKiBGb3IgY29tcG9zaXRlIGdseXBocywgcmV0dXJuIG9ubHkgbGVmdCBzaWRlIGJlYXJpbmcgYW5kICovCi0gICAgICAvKiBhZHZhbmNlIHdpZHRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1JFQ1VSU0UgKQotICAgICAgewotICAgICAgICBGVF9TbG90X0ludGVybmFsICBpbnRlcm5hbCA9IGdseXBoLT5yb290LmludGVybmFsOwotCi0KLSAgICAgICAgZ2x5cGgtPnJvb3QubWV0cmljcy5ob3JpQmVhcmluZ1ggPSBkZWNvZGVyLmJ1aWxkZXIubGVmdF9iZWFyaW5nLng7Ci0gICAgICAgIGdseXBoLT5yb290Lm1ldHJpY3MuaG9yaUFkdmFuY2UgID0gZGVjb2Rlci5nbHlwaF93aWR0aDsKLSAgICAgICAgaW50ZXJuYWwtPmdseXBoX21hdHJpeCAgICAgICAgICAgPSBmb250X21hdHJpeDsKLSAgICAgICAgaW50ZXJuYWwtPmdseXBoX2RlbHRhICAgICAgICAgICAgPSBmb250X29mZnNldDsKLSAgICAgICAgaW50ZXJuYWwtPmdseXBoX3RyYW5zZm9ybWVkICAgICAgPSAxOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBGVF9CQm94ICAgICAgICAgICAgY2JveDsKLSAgICAgICAgRlRfR2x5cGhfTWV0cmljcyogIG1ldHJpY3MgPSAmZ2x5cGgtPnJvb3QubWV0cmljczsKLSAgICAgICAgRlRfQm9vbCAgICAgICAgICAgIGhhc192ZXJ0aWNhbF9pbmZvOwotCi0KLSAgICAgICAgaWYgKCBmYWNlLT5ob3Jpem9udGFsLm51bWJlcl9PZl9ITWV0cmljcyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9TaG9ydCAgIGhvcmlCZWFyaW5nWCA9IDA7Ci0gICAgICAgICAgRlRfVVNob3J0ICBob3JpQWR2YW5jZSAgPSAwOwotCi0KLSAgICAgICAgICAoIChTRk5UX1NlcnZpY2UpZmFjZS0+c2ZudCApLT5nZXRfbWV0cmljcyggZmFjZSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZob3JpQmVhcmluZ1gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZob3JpQWR2YW5jZSApOwotICAgICAgICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlICAgICAgICAgID0gaG9yaUFkdmFuY2U7Ci0gICAgICAgICAgbWV0cmljcy0+aG9yaUJlYXJpbmdYICAgICAgICAgPSBob3JpQmVhcmluZ1g7Ci0gICAgICAgICAgZ2x5cGgtPnJvb3QubGluZWFySG9yaUFkdmFuY2UgPSBob3JpQWR2YW5jZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBjb3B5IHRoZSBfdW5zY2FsZWRfIGFkdmFuY2Ugd2lkdGggKi8KLSAgICAgICAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSAgICAgICAgICA9IGRlY29kZXIuZ2x5cGhfd2lkdGg7Ci0gICAgICAgICAgZ2x5cGgtPnJvb3QubGluZWFySG9yaUFkdmFuY2UgPSBkZWNvZGVyLmdseXBoX3dpZHRoOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2x5cGgtPnJvb3QuaW50ZXJuYWwtPmdseXBoX3RyYW5zZm9ybWVkID0gMDsKLQotICAgICAgICBoYXNfdmVydGljYWxfaW5mbyA9IEZUX0JPT0woIGZhY2UtPnZlcnRpY2FsX2luZm8gICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT52ZXJ0aWNhbC5udW1iZXJfT2ZfVk1ldHJpY3MgPiAwICk7Ci0KLSAgICAgICAgLyogZ2V0IHRoZSB2ZXJ0aWNhbCBtZXRyaWNzIGZyb20gdGhlIHZtdHggdGFibGUgaWYgd2UgaGF2ZSBvbmUgKi8KLSAgICAgICAgaWYgKCBoYXNfdmVydGljYWxfaW5mbyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9TaG9ydCAgIHZlcnRCZWFyaW5nWSA9IDA7Ci0gICAgICAgICAgRlRfVVNob3J0ICB2ZXJ0QWR2YW5jZSAgPSAwOwotCi0KLSAgICAgICAgICAoIChTRk5UX1NlcnZpY2UpZmFjZS0+c2ZudCApLT5nZXRfbWV0cmljcyggZmFjZSwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZXJ0QmVhcmluZ1ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZXJ0QWR2YW5jZSApOwotICAgICAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWSA9IHZlcnRCZWFyaW5nWTsKLSAgICAgICAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSAgPSB2ZXJ0QWR2YW5jZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBtYWtlIHVwIHZlcnRpY2FsIG9uZXMgKi8KLSAgICAgICAgICBpZiAoIGZhY2UtPm9zMi52ZXJzaW9uICE9IDB4RkZGRlUgKQotICAgICAgICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgPSAoRlRfUG9zKSggZmFjZS0+b3MyLnNUeXBvQXNjZW5kZXIgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+b3MyLnNUeXBvRGVzY2VuZGVyICk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgPSAoRlRfUG9zKSggZmFjZS0+aG9yaXpvbnRhbC5Bc2NlbmRlciAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5ob3Jpem9udGFsLkRlc2NlbmRlciApOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2x5cGgtPnJvb3QubGluZWFyVmVydEFkdmFuY2UgPSBtZXRyaWNzLT52ZXJ0QWR2YW5jZTsKLQotICAgICAgICBnbHlwaC0+cm9vdC5mb3JtYXQgPSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORTsKLQotICAgICAgICBnbHlwaC0+cm9vdC5vdXRsaW5lLmZsYWdzID0gMDsKLSAgICAgICAgaWYgKCBzaXplICYmIHNpemUtPnJvb3QubWV0cmljcy55X3BwZW0gPCAyNCApCi0gICAgICAgICAgZ2x5cGgtPnJvb3Qub3V0bGluZS5mbGFncyB8PSBGVF9PVVRMSU5FX0hJR0hfUFJFQ0lTSU9OOwotCi0gICAgICAgIGdseXBoLT5yb290Lm91dGxpbmUuZmxhZ3MgfD0gRlRfT1VUTElORV9SRVZFUlNFX0ZJTEw7Ci0KLSAgICAgICAgLyogYXBwbHkgdGhlIGZvbnQgbWF0cml4LCBpZiBhbnkgKi8KLSAgICAgICAgaWYgKCBmb250X21hdHJpeC54eCAhPSAweDEwMDAwTCB8fCBmb250X21hdHJpeC55eSAhPSAweDEwMDAwTCB8fAotICAgICAgICAgICAgIGZvbnRfbWF0cml4Lnh5ICE9IDAgICAgICAgIHx8IGZvbnRfbWF0cml4Lnl4ICE9IDAgICAgICAgICkKLSAgICAgICAgewotICAgICAgICAgIEZUX091dGxpbmVfVHJhbnNmb3JtKCAmZ2x5cGgtPnJvb3Qub3V0bGluZSwgJmZvbnRfbWF0cml4ICk7Ci0KLSAgICAgICAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSA9IEZUX011bEZpeCggbWV0cmljcy0+aG9yaUFkdmFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRfbWF0cml4Lnh4ICk7Ci0gICAgICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgPSBGVF9NdWxGaXgoIG1ldHJpY3MtPnZlcnRBZHZhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X21hdHJpeC55eSApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBmb250X29mZnNldC54IHx8IGZvbnRfb2Zmc2V0LnkgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoICZnbHlwaC0+cm9vdC5vdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X29mZnNldC54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X29mZnNldC55ICk7Ci0KLSAgICAgICAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSArPSBmb250X29mZnNldC54OwotICAgICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlICs9IGZvbnRfb2Zmc2V0Lnk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUgKSA9PSAwIHx8IGZvcmNlX3NjYWxpbmcgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogc2NhbGUgdGhlIG91dGxpbmUgYW5kIHRoZSBtZXRyaWNzICovCi0gICAgICAgICAgRlRfSW50ICAgICAgIG47Ci0gICAgICAgICAgRlRfT3V0bGluZSogIGN1ciAgICAgPSAmZ2x5cGgtPnJvb3Qub3V0bGluZTsKLSAgICAgICAgICBGVF9WZWN0b3IqICAgdmVjICAgICA9IGN1ci0+cG9pbnRzOwotICAgICAgICAgIEZUX0ZpeGVkICAgICB4X3NjYWxlID0gZ2x5cGgtPnhfc2NhbGU7Ci0gICAgICAgICAgRlRfRml4ZWQgICAgIHlfc2NhbGUgPSBnbHlwaC0+eV9zY2FsZTsKLQotCi0gICAgICAgICAgLyogRmlyc3Qgb2YgYWxsLCBzY2FsZSB0aGUgcG9pbnRzICovCi0gICAgICAgICAgaWYgKCAhaGludGluZyB8fCAhZGVjb2Rlci5idWlsZGVyLmhpbnRzX2Z1bmNzICkKLSAgICAgICAgICAgIGZvciAoIG4gPSBjdXItPm5fcG9pbnRzOyBuID4gMDsgbi0tLCB2ZWMrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHZlYy0+eCA9IEZUX011bEZpeCggdmVjLT54LCB4X3NjYWxlICk7Ci0gICAgICAgICAgICAgIHZlYy0+eSA9IEZUX011bEZpeCggdmVjLT55LCB5X3NjYWxlICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBUaGVuIHNjYWxlIHRoZSBtZXRyaWNzICovCi0gICAgICAgICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgPSBGVF9NdWxGaXgoIG1ldHJpY3MtPmhvcmlBZHZhbmNlLCB4X3NjYWxlICk7Ci0gICAgICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgPSBGVF9NdWxGaXgoIG1ldHJpY3MtPnZlcnRBZHZhbmNlLCB5X3NjYWxlICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBjb21wdXRlIHRoZSBvdGhlciBtZXRyaWNzICovCi0gICAgICAgIEZUX091dGxpbmVfR2V0X0NCb3goICZnbHlwaC0+cm9vdC5vdXRsaW5lLCAmY2JveCApOwotCi0gICAgICAgIG1ldHJpY3MtPndpZHRoICA9IGNib3gueE1heCAtIGNib3gueE1pbjsKLSAgICAgICAgbWV0cmljcy0+aGVpZ2h0ID0gY2JveC55TWF4IC0gY2JveC55TWluOwotCi0gICAgICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWCA9IGNib3gueE1pbjsKLSAgICAgICAgbWV0cmljcy0+aG9yaUJlYXJpbmdZID0gY2JveC55TWF4OwotCi0gICAgICAgIGlmICggaGFzX3ZlcnRpY2FsX2luZm8gKQotICAgICAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWCA9IG1ldHJpY3MtPmhvcmlCZWFyaW5nWCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSAvIDI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICggbG9hZF9mbGFncyAmIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUICkKLSAgICAgICAgICAgIGZ0X3N5bnRoZXNpemVfdmVydGljYWxfbWV0cmljcyggbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZnbG9hZC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZnbG9hZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjI2NTVmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmZ2xvYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZnbG9hZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgT3BlblR5cGUgR2x5cGggTG9hZGVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19DRkZHTE9BRF9IX18KLSNkZWZpbmUgX19DRkZHTE9BRF9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlICJjZmZvYmpzLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2RlZmluZSBDRkZfTUFYX09QRVJBTkRTICAgICAgICA0OAotI2RlZmluZSBDRkZfTUFYX1NVQlJTX0NBTExTICAgICAxNiAgLyogbWF4aW11bSBzdWJyb3V0aW5lIG5lc3Rpbmc7ICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9ubHkgMTAgYXJlIGFsbG93ZWQgYnV0IHRoZXJlIGV4aXN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb250cyBsaWtlIGBIaXJhS2FrdVByb04tVzMudHRmJyAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKEhpcmFnaW5vIEtha3UgR290aGljIFByb04gVzM7ICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDguMmQ2ZTE7IDIwMTQtMTItMTkpIHRoYXQgZXhjZWVkICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIGxpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBDRkZfTUFYX1RSQU5TX0VMRU1FTlRTICAzMgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0dXJlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0ZGX0J1aWxkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIEEgc3RydWN0dXJlIHVzZWQgZHVyaW5nIGdseXBoIGxvYWRpbmcgdG8gc3RvcmUgaXRzIG91dGxpbmUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWVtb3J5ICAgICAgICA6OiBUaGUgY3VycmVudCBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICAgIDo6IFRoZSBjdXJyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGdseXBoICAgICAgICAgOjogVGhlIGN1cnJlbnQgZ2x5cGggc2xvdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZGVyICAgICAgICA6OiBUaGUgY3VycmVudCBnbHlwaCBsb2FkZXIuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYXNlICAgICAgICAgIDo6IFRoZSBiYXNlIGdseXBoIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGN1cnJlbnQgICAgICAgOjogVGhlIGN1cnJlbnQgZ2x5cGggb3V0bGluZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9zX3ggICAgICAgICA6OiBUaGUgaG9yaXpvbnRhbCB0cmFuc2xhdGlvbiAoaWYgY29tcG9zaXRlIGdseXBoKS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwb3NfeSAgICAgICAgIDo6IFRoZSB2ZXJ0aWNhbCB0cmFuc2xhdGlvbiAoaWYgY29tcG9zaXRlIGdseXBoKS4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlZnRfYmVhcmluZyAgOjogVGhlIGxlZnQgc2lkZSBiZWFyaW5nIHBvaW50LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWR2YW5jZSAgICAgICA6OiBUaGUgaG9yaXpvbnRhbCBhZHZhbmNlIHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiYm94ICAgICAgICAgIDo6IFVudXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhdGhfYmVndW4gICAgOjogQSBmbGFnIHdoaWNoIGluZGljYXRlcyB0aGF0IGEgbmV3IHBhdGggaGFzIGJlZ3VuLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbG9hZF9wb2ludHMgICA6OiBJZiB0aGlzIGZsYWcgaXMgbm90IHNldCwgbm8gcG9pbnRzIGFyZSBsb2FkZWQuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBub19yZWN1cnNlICAgIDo6IFNldCBidXQgbm90IHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1ldHJpY3Nfb25seSAgOjogQSBib29sZWFuIGluZGljYXRpbmcgdGhhdCB3ZSBvbmx5IHdhbnQgdG8gY29tcHV0ZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgIHRoZSBtZXRyaWNzIG9mIGEgZ2l2ZW4gZ2x5cGgsIG5vdCBsb2FkIGFsbCBvZiBpdHMgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICBwb2ludHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoaW50c19mdW5jcyAgIDo6IEF1eGlsaWFyeSBwb2ludGVyIGZvciBoaW50aW5nLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGhpbnRzX2dsb2JhbHMgOjogQXV4aWxpYXJ5IHBvaW50ZXIgZm9yIGhpbnRpbmcuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGRl9CdWlsZGVyXwotICB7Ci0gICAgRlRfTWVtb3J5ICAgICAgIG1lbW9yeTsKLSAgICBUVF9GYWNlICAgICAgICAgZmFjZTsKLSAgICBDRkZfR2x5cGhTbG90ICAgZ2x5cGg7Ci0gICAgRlRfR2x5cGhMb2FkZXIgIGxvYWRlcjsKLSAgICBGVF9PdXRsaW5lKiAgICAgYmFzZTsKLSAgICBGVF9PdXRsaW5lKiAgICAgY3VycmVudDsKLQotICAgIEZUX1BvcyAgICAgICAgICBwb3NfeDsKLSAgICBGVF9Qb3MgICAgICAgICAgcG9zX3k7Ci0KLSAgICBGVF9WZWN0b3IgICAgICAgbGVmdF9iZWFyaW5nOwotICAgIEZUX1ZlY3RvciAgICAgICBhZHZhbmNlOwotCi0gICAgRlRfQkJveCAgICAgICAgIGJib3g7ICAgICAgICAgIC8qIGJvdW5kaW5nIGJveCAqLwotICAgIEZUX0Jvb2wgICAgICAgICBwYXRoX2JlZ3VuOwotICAgIEZUX0Jvb2wgICAgICAgICBsb2FkX3BvaW50czsKLSAgICBGVF9Cb29sICAgICAgICAgbm9fcmVjdXJzZTsKLQotICAgIEZUX0Jvb2wgICAgICAgICBtZXRyaWNzX29ubHk7Ci0KLSAgICB2b2lkKiAgICAgICAgICAgaGludHNfZnVuY3M7ICAgIC8qIGhpbnRlci1zcGVjaWZpYyAqLwotICAgIHZvaWQqICAgICAgICAgICBoaW50c19nbG9iYWxzOyAgLyogaGludGVyLXNwZWNpZmljICovCi0KLSAgfSBDRkZfQnVpbGRlcjsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGNmZl9jaGVja19wb2ludHMoIENGRl9CdWlsZGVyKiAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICBjb3VudCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50KCBDRkZfQnVpbGRlciogIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlICAgICAgIGZsYWcgKTsKLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX2J1aWxkZXJfYWRkX3BvaW50MSggQ0ZGX0J1aWxkZXIqICBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgIHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgeSApOwotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBjZmZfYnVpbGRlcl9zdGFydF9wb2ludCggQ0ZGX0J1aWxkZXIqICBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICB5ICk7Ci0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2ZmX2J1aWxkZXJfY2xvc2VfY29udG91ciggQ0ZGX0J1aWxkZXIqICBidWlsZGVyICk7Ci0KLQotICBGVF9MT0NBTCggRlRfSW50ICkKLSAgY2ZmX2xvb2t1cF9nbHlwaF9ieV9zdGRjaGFyY29kZSggQ0ZGX0ZvbnQgIGNmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgIGNoYXJjb2RlICk7Ci0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGNmZl9nZXRfZ2x5cGhfZGF0YSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSoqICBwb2ludGVyLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgbGVuZ3RoICk7Ci0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2ZmX2ZyZWVfZ2x5cGhfZGF0YSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBvaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgbGVuZ3RoICk7Ci0KLQotICAvKiBleGVjdXRpb24gY29udGV4dCBjaGFyc3RyaW5nIHpvbmUgKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX0RlY29kZXJfWm9uZV8KLSAgewotICAgIEZUX0J5dGUqICBiYXNlOwotICAgIEZUX0J5dGUqICBsaW1pdDsKLSAgICBGVF9CeXRlKiAgY3Vyc29yOwotCi0gIH0gQ0ZGX0RlY29kZXJfWm9uZTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfRGVjb2Rlcl8KLSAgewotICAgIENGRl9CdWlsZGVyICAgICAgICBidWlsZGVyOwotICAgIENGRl9Gb250ICAgICAgICAgICBjZmY7Ci0KLSAgICBGVF9GaXhlZCAgICAgICAgICAgc3RhY2tbQ0ZGX01BWF9PUEVSQU5EUyArIDFdOwotICAgIEZUX0ZpeGVkKiAgICAgICAgICB0b3A7Ci0KLSAgICBDRkZfRGVjb2Rlcl9ab25lICAgem9uZXNbQ0ZGX01BWF9TVUJSU19DQUxMUyArIDFdOwotICAgIENGRl9EZWNvZGVyX1pvbmUqICB6b25lOwotCi0gICAgRlRfSW50ICAgICAgICAgICAgIGZsZXhfc3RhdGU7Ci0gICAgRlRfSW50ICAgICAgICAgICAgIG51bV9mbGV4X3ZlY3RvcnM7Ci0gICAgRlRfVmVjdG9yICAgICAgICAgIGZsZXhfdmVjdG9yc1s3XTsKLQotICAgIEZUX1BvcyAgICAgICAgICAgICBnbHlwaF93aWR0aDsKLSAgICBGVF9Qb3MgICAgICAgICAgICAgbm9taW5hbF93aWR0aDsKLQotICAgIEZUX0Jvb2wgICAgICAgICAgICByZWFkX3dpZHRoOwotICAgIEZUX0Jvb2wgICAgICAgICAgICB3aWR0aF9vbmx5OwotICAgIEZUX0ludCAgICAgICAgICAgICBudW1faGludHM7Ci0gICAgRlRfRml4ZWQgICAgICAgICAgIGJ1aWxkY2hhcltDRkZfTUFYX1RSQU5TX0VMRU1FTlRTXTsKLQotICAgIEZUX1VJbnQgICAgICAgICAgICBudW1fbG9jYWxzOwotICAgIEZUX1VJbnQgICAgICAgICAgICBudW1fZ2xvYmFsczsKLQotICAgIEZUX0ludCAgICAgICAgICAgICBsb2NhbHNfYmlhczsKLSAgICBGVF9JbnQgICAgICAgICAgICAgZ2xvYmFsc19iaWFzOwotCi0gICAgRlRfQnl0ZSoqICAgICAgICAgIGxvY2FsczsKLSAgICBGVF9CeXRlKiogICAgICAgICAgZ2xvYmFsczsKLQotICAgIEZUX0J5dGUqKiAgICAgICAgICBnbHlwaF9uYW1lczsgICAvKiBmb3IgcHVyZSBDRkYgZm9udHMgb25seSAgKi8KLSAgICBGVF9VSW50ICAgICAgICAgICAgbnVtX2dseXBoczsgICAgLyogbnVtYmVyIG9mIGdseXBocyBpbiBmb250ICovCi0KLSAgICBGVF9SZW5kZXJfTW9kZSAgICAgaGludF9tb2RlOwotCi0gICAgRlRfQm9vbCAgICAgICAgICAgIHNlYWM7Ci0KLSAgICBDRkZfU3ViRm9udCAgICAgICAgY3VycmVudF9zdWJmb250OyAvKiBmb3IgY3VycmVudCBnbHlwaF9pbmRleCAqLwotCi0gIH0gQ0ZGX0RlY29kZXI7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmZl9kZWNvZGVyX2luaXQoIENGRl9EZWNvZGVyKiAgICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICBUVF9GYWNlICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZGX1NpemUgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgIENGRl9HbHlwaFNsb3QgICBzbG90LAotICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgaGludGluZywKLSAgICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIGhpbnRfbW9kZSApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGNmZl9kZWNvZGVyX3ByZXBhcmUoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZGX1NpemUgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoX2luZGV4ICk7Ci0KLSNpZiAwICAvKiB1bnVzZWQgdW50aWwgd2Ugc3VwcG9ydCBwdXJlIENGRiBmb250cyAqLwotCi0gIC8qIENvbXB1dGUgdGhlIG1heGltdW0gYWR2YW5jZSB3aWR0aCBvZiBhIGZvbnQgdGhyb3VnaCBxdWljayBwYXJzaW5nICovCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGNmZl9jb21wdXRlX21heF9hZHZhbmNlKCBUVF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50KiAgbWF4X2FkdmFuY2UgKTsKLQotI2VuZGlmIC8qIDAgKi8KLQotI2lmZGVmIENGRl9DT05GSUdfT1BUSU9OX09MRF9FTkdJTkUKLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MoIENGRl9EZWNvZGVyKiAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgY2hhcnN0cmluZ19iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICBjaGFyc3RyaW5nX2xlbiApOwotI2VuZGlmCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX3Nsb3RfbG9hZCggQ0ZGX0dseXBoU2xvdCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgIENGRl9TaXplICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgICAgICBsb2FkX2ZsYWdzICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19DRkZHTE9BRF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmbG9hZC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZsb2FkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MTIyMmQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZsb2FkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZmxvYWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBPcGVuVHlwZSBhbmQgQ0ZGIGRhdGEvcHJvZ3JhbSB0YWJsZXMgbG9hZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLSNpbmNsdWRlIEZUX1RZUEUxX1RBQkxFU19ICi0KLSNpbmNsdWRlICJjZmZsb2FkLmgiCi0jaW5jbHVkZSAiY2ZmcGFyc2UuaCIKLQotI2luY2x1ZGUgImNmZmVycnMuaCIKLQotCi0jaWYgMQotCi0gIHN0YXRpYyBjb25zdCBGVF9VU2hvcnQgIGNmZl9pc29hZG9iZV9jaGFyc2V0WzIyOV0gPQotICB7Ci0gICAgICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsCi0gICAgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCi0gICAgIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsCi0gICAgIDI0LCAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsCi0gICAgIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksCi0gICAgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCi0gICAgIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsCi0gICAgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCi0gICAgIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsCi0gICAgIDcyLCAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksCi0gICAgIDgwLCAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsCi0gICAgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsCi0gICAgIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsCi0gICAgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCi0gICAgMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksCi0gICAgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LCAxMjcsCi0gICAgMTI4LCAxMjksIDEzMCwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsCi0gICAgMTM2LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsCi0gICAgMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsCi0gICAgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTYsIDE1NywgMTU4LCAxNTksCi0gICAgMTYwLCAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsCi0gICAgMTY4LCAxNjksIDE3MCwgMTcxLCAxNzIsIDE3MywgMTc0LCAxNzUsCi0gICAgMTc2LCAxNzcsIDE3OCwgMTc5LCAxODAsIDE4MSwgMTgyLCAxODMsCi0gICAgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkwLCAxOTEsCi0gICAgMTkyLCAxOTMsIDE5NCwgMTk1LCAxOTYsIDE5NywgMTk4LCAxOTksCi0gICAgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNSwgMjA2LCAyMDcsCi0gICAgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywgMjE0LCAyMTUsCi0gICAgMjE2LCAyMTcsIDIxOCwgMjE5LCAyMjAsIDIyMSwgMjIyLCAyMjMsCi0gICAgMjI0LCAyMjUsIDIyNiwgMjI3LCAyMjgKLSAgfTsKLQotICBzdGF0aWMgY29uc3QgRlRfVVNob3J0ICBjZmZfZXhwZXJ0X2NoYXJzZXRbMTY2XSA9Ci0gIHsKLSAgICAgIDAsICAgMSwgMjI5LCAyMzAsIDIzMSwgMjMyLCAyMzMsIDIzNCwKLSAgICAyMzUsIDIzNiwgMjM3LCAyMzgsICAxMywgIDE0LCAgMTUsICA5OSwKLSAgICAyMzksIDI0MCwgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwKLSAgICAyNDcsIDI0OCwgIDI3LCAgMjgsIDI0OSwgMjUwLCAyNTEsIDI1MiwKLSAgICAyNTMsIDI1NCwgMjU1LCAyNTYsIDI1NywgMjU4LCAyNTksIDI2MCwKLSAgICAyNjEsIDI2MiwgMjYzLCAyNjQsIDI2NSwgMjY2LCAxMDksIDExMCwKLSAgICAyNjcsIDI2OCwgMjY5LCAyNzAsIDI3MSwgMjcyLCAyNzMsIDI3NCwKLSAgICAyNzUsIDI3NiwgMjc3LCAyNzgsIDI3OSwgMjgwLCAyODEsIDI4MiwKLSAgICAyODMsIDI4NCwgMjg1LCAyODYsIDI4NywgMjg4LCAyODksIDI5MCwKLSAgICAyOTEsIDI5MiwgMjkzLCAyOTQsIDI5NSwgMjk2LCAyOTcsIDI5OCwKLSAgICAyOTksIDMwMCwgMzAxLCAzMDIsIDMwMywgMzA0LCAzMDUsIDMwNiwKLSAgICAzMDcsIDMwOCwgMzA5LCAzMTAsIDMxMSwgMzEyLCAzMTMsIDMxNCwKLSAgICAzMTUsIDMxNiwgMzE3LCAzMTgsIDE1OCwgMTU1LCAxNjMsIDMxOSwKLSAgICAzMjAsIDMyMSwgMzIyLCAzMjMsIDMyNCwgMzI1LCAzMjYsIDE1MCwKLSAgICAxNjQsIDE2OSwgMzI3LCAzMjgsIDMyOSwgMzMwLCAzMzEsIDMzMiwKLSAgICAzMzMsIDMzNCwgMzM1LCAzMzYsIDMzNywgMzM4LCAzMzksIDM0MCwKLSAgICAzNDEsIDM0MiwgMzQzLCAzNDQsIDM0NSwgMzQ2LCAzNDcsIDM0OCwKLSAgICAzNDksIDM1MCwgMzUxLCAzNTIsIDM1MywgMzU0LCAzNTUsIDM1NiwKLSAgICAzNTcsIDM1OCwgMzU5LCAzNjAsIDM2MSwgMzYyLCAzNjMsIDM2NCwKLSAgICAzNjUsIDM2NiwgMzY3LCAzNjgsIDM2OSwgMzcwLCAzNzEsIDM3MiwKLSAgICAzNzMsIDM3NCwgMzc1LCAzNzYsIDM3NywgMzc4Ci0gIH07Ci0KLSAgc3RhdGljIGNvbnN0IEZUX1VTaG9ydCAgY2ZmX2V4cGVydHN1YnNldF9jaGFyc2V0Wzg3XSA9Ci0gIHsKLSAgICAgIDAsICAgMSwgMjMxLCAyMzIsIDIzNSwgMjM2LCAyMzcsIDIzOCwKLSAgICAgMTMsICAxNCwgIDE1LCAgOTksIDIzOSwgMjQwLCAyNDEsIDI0MiwKLSAgICAyNDMsIDI0NCwgMjQ1LCAyNDYsIDI0NywgMjQ4LCAgMjcsICAyOCwKLSAgICAyNDksIDI1MCwgMjUxLCAyNTMsIDI1NCwgMjU1LCAyNTYsIDI1NywKLSAgICAyNTgsIDI1OSwgMjYwLCAyNjEsIDI2MiwgMjYzLCAyNjQsIDI2NSwKLSAgICAyNjYsIDEwOSwgMTEwLCAyNjcsIDI2OCwgMjY5LCAyNzAsIDI3MiwKLSAgICAzMDAsIDMwMSwgMzAyLCAzMDUsIDMxNCwgMzE1LCAxNTgsIDE1NSwKLSAgICAxNjMsIDMyMCwgMzIxLCAzMjIsIDMyMywgMzI0LCAzMjUsIDMyNiwKLSAgICAxNTAsIDE2NCwgMTY5LCAzMjcsIDMyOCwgMzI5LCAzMzAsIDMzMSwKLSAgICAzMzIsIDMzMywgMzM0LCAzMzUsIDMzNiwgMzM3LCAzMzgsIDMzOSwKLSAgICAzNDAsIDM0MSwgMzQyLCAzNDMsIDM0NCwgMzQ1LCAzNDYKLSAgfTsKLQotICBzdGF0aWMgY29uc3QgRlRfVVNob3J0ICBjZmZfc3RhbmRhcmRfZW5jb2RpbmdbMjU2XSA9Ci0gIHsKLSAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwKLSAgICAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsICAxNiwKLSAgICAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwKLSAgICAgMjUsICAyNiwgIDI3LCAgMjgsICAyOSwgIDMwLCAgMzEsICAzMiwKLSAgICAgMzMsICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwKLSAgICAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsICA0OCwKLSAgICAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwKLSAgICAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsICA2NCwKLSAgICAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwKLSAgICAgNzMsICA3NCwgIDc1LCAgNzYsICA3NywgIDc4LCAgNzksICA4MCwKLSAgICAgODEsICA4MiwgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwKLSAgICAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsICAgMCwKLSAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAgIDAsICA5NiwgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDEsIDEwMiwKLSAgICAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwKLSAgICAgIDAsIDExMSwgMTEyLCAxMTMsIDExNCwgICAwLCAxMTUsIDExNiwKLSAgICAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAgIDAsIDEyMywKLSAgICAgIDAsIDEyNCwgMTI1LCAxMjYsIDEyNywgMTI4LCAxMjksIDEzMCwKLSAgICAxMzEsICAgMCwgMTMyLCAxMzMsICAgMCwgMTM0LCAxMzUsIDEzNiwKLSAgICAxMzcsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAgIDAsIDEzOCwgICAwLCAxMzksICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAxNDAsIDE0MSwgMTQyLCAxNDMsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAgIDAsIDE0NCwgICAwLCAgIDAsICAgMCwgMTQ1LCAgIDAsICAgMCwKLSAgICAxNDYsIDE0NywgMTQ4LCAxNDksICAgMCwgICAwLCAgIDAsICAgMAotICB9OwotCi0gIHN0YXRpYyBjb25zdCBGVF9VU2hvcnQgIGNmZl9leHBlcnRfZW5jb2RpbmdbMjU2XSA9Ci0gIHsKLSAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAgIDEsIDIyOSwgMjMwLCAgIDAsIDIzMSwgMjMyLCAyMzMsIDIzNCwKLSAgICAyMzUsIDIzNiwgMjM3LCAyMzgsICAxMywgIDE0LCAgMTUsICA5OSwKLSAgICAyMzksIDI0MCwgMjQxLCAyNDIsIDI0MywgMjQ0LCAyNDUsIDI0NiwKLSAgICAyNDcsIDI0OCwgIDI3LCAgMjgsIDI0OSwgMjUwLCAyNTEsIDI1MiwKLSAgICAgIDAsIDI1MywgMjU0LCAyNTUsIDI1NiwgMjU3LCAgIDAsICAgMCwKLSAgICAgIDAsIDI1OCwgICAwLCAgIDAsIDI1OSwgMjYwLCAyNjEsIDI2MiwKLSAgICAgIDAsICAgMCwgMjYzLCAyNjQsIDI2NSwgICAwLCAyNjYsIDEwOSwKLSAgICAxMTAsIDI2NywgMjY4LCAyNjksICAgMCwgMjcwLCAyNzEsIDI3MiwKLSAgICAyNzMsIDI3NCwgMjc1LCAyNzYsIDI3NywgMjc4LCAyNzksIDI4MCwKLSAgICAyODEsIDI4MiwgMjgzLCAyODQsIDI4NSwgMjg2LCAyODcsIDI4OCwKLSAgICAyODksIDI5MCwgMjkxLCAyOTIsIDI5MywgMjk0LCAyOTUsIDI5NiwKLSAgICAyOTcsIDI5OCwgMjk5LCAzMDAsIDMwMSwgMzAyLCAzMDMsICAgMCwKLSAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgICAgIDAsIDMwNCwgMzA1LCAzMDYsICAgMCwgICAwLCAzMDcsIDMwOCwKLSAgICAzMDksIDMxMCwgMzExLCAgIDAsIDMxMiwgICAwLCAgIDAsIDMxMiwKLSAgICAgIDAsICAgMCwgMzE0LCAzMTUsICAgMCwgICAwLCAzMTYsIDMxNywKLSAgICAzMTgsICAgMCwgICAwLCAgIDAsIDE1OCwgMTU1LCAxNjMsIDMxOSwKLSAgICAzMjAsIDMyMSwgMzIyLCAzMjMsIDMyNCwgMzI1LCAgIDAsICAgMCwKLSAgICAzMjYsIDE1MCwgMTY0LCAxNjksIDMyNywgMzI4LCAzMjksIDMzMCwKLSAgICAzMzEsIDMzMiwgMzMzLCAzMzQsIDMzNSwgMzM2LCAzMzcsIDMzOCwKLSAgICAzMzksIDM0MCwgMzQxLCAzNDIsIDM0MywgMzQ0LCAzNDUsIDM0NiwKLSAgICAzNDcsIDM0OCwgMzQ5LCAzNTAsIDM1MSwgMzUyLCAzNTMsIDM1NCwKLSAgICAzNTUsIDM1NiwgMzU3LCAzNTgsIDM1OSwgMzYwLCAzNjEsIDM2MiwKLSAgICAzNjMsIDM2NCwgMzY1LCAzNjYsIDM2NywgMzY4LCAzNjksIDM3MCwKLSAgICAzNzEsIDM3MiwgMzczLCAzNzQsIDM3NSwgMzc2LCAzNzcsIDM3OAotICB9OwotCi0jZW5kaWYgLyogMSAqLwotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9VU2hvcnQgKQotICBjZmZfZ2V0X3N0YW5kYXJkX2VuY29kaW5nKCBGVF9VSW50ICBjaGFyY29kZSApCi0gIHsKLSAgICByZXR1cm4gKEZUX1VTaG9ydCkoIGNoYXJjb2RlIDwgMjU2ID8gY2ZmX3N0YW5kYXJkX2VuY29kaW5nW2NoYXJjb2RlXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2NmZmxvYWQKLQotCi0gIC8qIHJlYWQgYW4gb2Zmc2V0IGZyb20gdGhlIGluZGV4J3Mgc3RyZWFtIGN1cnJlbnQgcG9zaXRpb24gKi8KLSAgc3RhdGljIEZUX1VMb25nCi0gIGNmZl9pbmRleF9yZWFkX29mZnNldCggQ0ZGX0luZGV4ICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRXJyb3IgICplcnJvcnAgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGlkeC0+c3RyZWFtOwotICAgIEZUX0J5dGUgICAgdG1wWzRdOwotICAgIEZUX1VMb25nICAgcmVzdWx0ID0gMDsKLQotCi0gICAgaWYgKCAhRlRfU1RSRUFNX1JFQUQoIHRtcCwgaWR4LT5vZmZfc2l6ZSApICkKLSAgICB7Ci0gICAgICBGVF9JbnQgIG5uOwotCi0KLSAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBpZHgtPm9mZl9zaXplOyBubisrICkKLSAgICAgICAgcmVzdWx0ID0gKCByZXN1bHQgPDwgOCApIHwgdG1wW25uXTsKLSAgICB9Ci0KLSAgICAqZXJyb3JwID0gZXJyb3I7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9pbmRleF9pbml0KCBDRkZfSW5kZXggIGlkeCwKLSAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICBsb2FkICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBGVF9VU2hvcnQgIGNvdW50OwotCi0KLSAgICBGVF9NRU1fWkVSTyggaWR4LCBzaXplb2YgKCAqaWR4ICkgKTsKLQotICAgIGlkeC0+c3RyZWFtID0gc3RyZWFtOwotICAgIGlkeC0+c3RhcnQgID0gRlRfU1RSRUFNX1BPUygpOwotICAgIGlmICggIUZUX1JFQURfVVNIT1JUKCBjb3VudCApICYmCi0gICAgICAgICBjb3VudCA+IDAgICAgICAgICAgICAgICAgKQotICAgIHsKLSAgICAgIEZUX0J5dGUgICBvZmZzaXplOwotICAgICAgRlRfVUxvbmcgIHNpemU7Ci0KLQotICAgICAgLyogdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGVsZW1lbnQ7IHJlYWQgdGhlIG9mZnNldCBzaXplLCAgICAgICAgICAgKi8KLSAgICAgIC8qIHRoZW4gYWNjZXNzIHRoZSBvZmZzZXQgdGFibGUgdG8gY29tcHV0ZSB0aGUgaW5kZXgncyB0b3RhbCBzaXplICovCi0gICAgICBpZiAoIEZUX1JFQURfQllURSggb2Zmc2l6ZSApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBpZiAoIG9mZnNpemUgPCAxIHx8IG9mZnNpemUgPiA0ICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGlkeC0+Y291bnQgICAgPSBjb3VudDsKLSAgICAgIGlkeC0+b2ZmX3NpemUgPSBvZmZzaXplOwotICAgICAgc2l6ZSAgICAgICAgICA9IChGVF9VTG9uZykoIGNvdW50ICsgMSApICogb2Zmc2l6ZTsKLQotICAgICAgaWR4LT5kYXRhX29mZnNldCA9IGlkeC0+c3RhcnQgKyAzICsgc2l6ZTsKLQotICAgICAgaWYgKCBGVF9TVFJFQU1fU0tJUCggc2l6ZSAtIG9mZnNpemUgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgc2l6ZSA9IGNmZl9pbmRleF9yZWFkX29mZnNldCggaWR4LCAmZXJyb3IgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGlmICggc2l6ZSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGlkeC0+ZGF0YV9zaXplID0gLS1zaXplOwotCi0gICAgICBpZiAoIGxvYWQgKQotICAgICAgewotICAgICAgICAvKiBsb2FkIHRoZSBkYXRhICovCi0gICAgICAgIGlmICggRlRfRlJBTUVfRVhUUkFDVCggc2l6ZSwgaWR4LT5ieXRlcyApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIHNraXAgdGhlIGRhdGEgKi8KLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0tJUCggc2l6ZSApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBGVF9GUkVFKCBpZHgtPm9mZnNldHMgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgY2ZmX2luZGV4X2RvbmUoIENGRl9JbmRleCAgaWR4ICkKLSAgewotICAgIGlmICggaWR4LT5zdHJlYW0gKQotICAgIHsKLSAgICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gaWR4LT5zdHJlYW07Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotCi0KLSAgICAgIGlmICggaWR4LT5ieXRlcyApCi0gICAgICAgIEZUX0ZSQU1FX1JFTEVBU0UoIGlkeC0+Ynl0ZXMgKTsKLQotICAgICAgRlRfRlJFRSggaWR4LT5vZmZzZXRzICk7Ci0gICAgICBGVF9NRU1fWkVSTyggaWR4LCBzaXplb2YgKCAqaWR4ICkgKTsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfaW5kZXhfbG9hZF9vZmZzZXRzKCBDRkZfSW5kZXggIGlkeCApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGlkeC0+c3RyZWFtOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0KLQotICAgIGlmICggaWR4LT5jb3VudCA+IDAgJiYgaWR4LT5vZmZzZXRzID09IE5VTEwgKQotICAgIHsKLSAgICAgIEZUX0J5dGUgICAgb2Zmc2l6ZSA9IGlkeC0+b2ZmX3NpemU7Ci0gICAgICBGVF9VTG9uZyAgIGRhdGFfc2l6ZTsKLSAgICAgIEZUX0J5dGUqICAgcDsKLSAgICAgIEZUX0J5dGUqICAgcF9lbmQ7Ci0gICAgICBGVF9VTG9uZyogIHBvZmY7Ci0KLQotICAgICAgZGF0YV9zaXplID0gKEZUX1VMb25nKSggaWR4LT5jb3VudCArIDEgKSAqIG9mZnNpemU7Ci0KLSAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBpZHgtPm9mZnNldHMsIGlkeC0+Y291bnQgKyAxICkgfHwKLSAgICAgICAgICAgRlRfU1RSRUFNX1NFRUsoIGlkeC0+c3RhcnQgKyAzICkgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgRlRfRlJBTUVfRU5URVIoIGRhdGFfc2l6ZSApICAgICAgICAgICAgICAgICAgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHBvZmYgICA9IGlkeC0+b2Zmc2V0czsKLSAgICAgIHAgICAgICA9IChGVF9CeXRlKilzdHJlYW0tPmN1cnNvcjsKLSAgICAgIHBfZW5kICA9IHAgKyBkYXRhX3NpemU7Ci0KLSAgICAgIHN3aXRjaCAoIG9mZnNpemUgKQotICAgICAgewotICAgICAgY2FzZSAxOgotICAgICAgICBmb3IgKCA7IHAgPCBwX2VuZDsgcCsrLCBwb2ZmKysgKQotICAgICAgICAgIHBvZmZbMF0gPSBwWzBdOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAyOgotICAgICAgICBmb3IgKCA7IHAgPCBwX2VuZDsgcCArPSAyLCBwb2ZmKysgKQotICAgICAgICAgIHBvZmZbMF0gPSBGVF9QRUVLX1VTSE9SVCggcCApOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAzOgotICAgICAgICBmb3IgKCA7IHAgPCBwX2VuZDsgcCArPSAzLCBwb2ZmKysgKQotICAgICAgICAgIHBvZmZbMF0gPSBGVF9QRUVLX1VPRkYzKCBwICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBmb3IgKCA7IHAgPCBwX2VuZDsgcCArPSA0LCBwb2ZmKysgKQotICAgICAgICAgIHBvZmZbMF0gPSBGVF9QRUVLX1VMT05HKCBwICk7Ci0gICAgICB9Ci0KLSAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIEZUX0ZSRUUoIGlkeC0+b2Zmc2V0cyApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBBbGxvY2F0ZSBhIHRhYmxlIGNvbnRhaW5pbmcgcG9pbnRlcnMgdG8gYW4gaW5kZXgncyBlbGVtZW50cy4gKi8KLSAgLyogVGhlIGBwb29sJyBhcmd1bWVudCBtYWtlcyB0aGlzIGZ1bmN0aW9uIGNvbnZlcnQgdGhlIGluZGV4ICAgICovCi0gIC8qIGVudHJpZXMgdG8gQy1zdHlsZSBzdHJpbmdzICh0aGlzIGlzLCBOVUxMLXRlcm1pbmF0ZWQpLiAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2ZmX2luZGV4X2dldF9wb2ludGVycyggQ0ZGX0luZGV4ICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKioqICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSoqICAgcG9vbCApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yICAgICA9IEZUX0Vycl9PazsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSAgICA9IGlkeC0+c3RyZWFtLT5tZW1vcnk7Ci0KLSAgICBGVF9CeXRlKiogIHQgICAgICAgICA9IE5VTEw7Ci0gICAgRlRfQnl0ZSogICBuZXdfYnl0ZXMgPSBOVUxMOwotCi0KLSAgICAqdGFibGUgPSBOVUxMOwotCi0gICAgaWYgKCBpZHgtPm9mZnNldHMgPT0gTlVMTCApCi0gICAgewotICAgICAgZXJyb3IgPSBjZmZfaW5kZXhfbG9hZF9vZmZzZXRzKCBpZHggKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBpZHgtPmNvdW50ID4gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgIUZUX05FV19BUlJBWSggdCwgaWR4LT5jb3VudCArIDEgKSAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICggIXBvb2wgfHwgIUZUX0FMTE9DKCBuZXdfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4LT5kYXRhX3NpemUgKyBpZHgtPmNvdW50ICkgKSApCi0gICAgewotICAgICAgRlRfVUxvbmcgIG4sIGN1cl9vZmZzZXQ7Ci0gICAgICBGVF9VTG9uZyAgZXh0cmEgPSAwOwotICAgICAgRlRfQnl0ZSogIG9yZ19ieXRlcyA9IGlkeC0+Ynl0ZXM7Ci0KLQotICAgICAgLyogYXQgdGhpcyBwb2ludCwgYGlkeC0+b2Zmc2V0cycgY2FuJ3QgYmUgTlVMTCAqLwotICAgICAgY3VyX29mZnNldCA9IGlkeC0+b2Zmc2V0c1swXSAtIDE7Ci0KLSAgICAgIC8qIHNhbml0eSBjaGVjayAqLwotICAgICAgaWYgKCBjdXJfb2Zmc2V0ICE9IDAgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTAoKCAiY2ZmX2luZGV4X2dldF9wb2ludGVyczoiCi0gICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBmaXJzdCBvZmZzZXQgdmFsdWUgJWQgc2V0IHRvIHplcm9cbiIsCi0gICAgICAgICAgICAgICAgICAgIGN1cl9vZmZzZXQgKSk7Ci0gICAgICAgIGN1cl9vZmZzZXQgPSAwOwotICAgICAgfQotCi0gICAgICBpZiAoICFwb29sICkKLSAgICAgICAgdFswXSA9IG9yZ19ieXRlcyArIGN1cl9vZmZzZXQ7Ci0gICAgICBlbHNlCi0gICAgICAgIHRbMF0gPSBuZXdfYnl0ZXMgKyBjdXJfb2Zmc2V0OwotCi0gICAgICBmb3IgKCBuID0gMTsgbiA8PSBpZHgtPmNvdW50OyBuKysgKQotICAgICAgewotICAgICAgICBGVF9VTG9uZyAgbmV4dF9vZmZzZXQgPSBpZHgtPm9mZnNldHNbbl0gLSAxOwotCi0KLSAgICAgICAgLyogdHdvIHNhbml0eSBjaGVja3MgZm9yIGludmFsaWQgb2Zmc2V0IHRhYmxlcyAqLwotICAgICAgICBpZiAoIG5leHRfb2Zmc2V0IDwgY3VyX29mZnNldCApCi0gICAgICAgICAgbmV4dF9vZmZzZXQgPSBjdXJfb2Zmc2V0OwotICAgICAgICBlbHNlIGlmICggbmV4dF9vZmZzZXQgPiBpZHgtPmRhdGFfc2l6ZSApCi0gICAgICAgICAgbmV4dF9vZmZzZXQgPSBpZHgtPmRhdGFfc2l6ZTsKLQotICAgICAgICBpZiAoICFwb29sICkKLSAgICAgICAgICB0W25dID0gb3JnX2J5dGVzICsgbmV4dF9vZmZzZXQ7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHRbbl0gPSBuZXdfYnl0ZXMgKyBuZXh0X29mZnNldCArIGV4dHJhOwotCi0gICAgICAgICAgaWYgKCBuZXh0X29mZnNldCAhPSBjdXJfb2Zmc2V0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9NRU1fQ09QWSggdFtuIC0gMV0sIG9yZ19ieXRlcyArIGN1cl9vZmZzZXQsIHRbbl0gLSB0W24gLSAxXSApOwotICAgICAgICAgICAgdFtuXVswXSA9ICdcMCc7Ci0gICAgICAgICAgICB0W25dICAgKz0gMTsKLSAgICAgICAgICAgIGV4dHJhKys7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY3VyX29mZnNldCA9IG5leHRfb2Zmc2V0OwotICAgICAgfQotICAgICAgKnRhYmxlID0gdDsKLQotICAgICAgaWYgKCBwb29sICkKLSAgICAgICAgKnBvb2wgPSBuZXdfYnl0ZXM7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2ZmX2luZGV4X2FjY2Vzc19lbGVtZW50KCBDRkZfSW5kZXggIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSoqICBwYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICBwYnl0ZV9sZW4gKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoIGlkeCAmJiBpZHgtPmNvdW50ID4gZWxlbWVudCApCi0gICAgewotICAgICAgLyogY29tcHV0ZSBzdGFydCBhbmQgZW5kIG9mZnNldHMgKi8KLSAgICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gaWR4LT5zdHJlYW07Ci0gICAgICBGVF9VTG9uZyAgIG9mZjEsIG9mZjIgPSAwOwotCi0KLSAgICAgIC8qIGxvYWQgb2Zmc2V0cyBmcm9tIGZpbGUgb3IgdGhlIG9mZnNldCB0YWJsZSAqLwotICAgICAgaWYgKCAhaWR4LT5vZmZzZXRzICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUxvbmcgIHBvcyA9IGVsZW1lbnQgKiBpZHgtPm9mZl9zaXplOwotCi0KLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggaWR4LT5zdGFydCArIDMgKyBwb3MgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIG9mZjEgPSBjZmZfaW5kZXhfcmVhZF9vZmZzZXQoIGlkeCwgJmVycm9yICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBpZiAoIG9mZjEgIT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBkbwotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVsZW1lbnQrKzsKLSAgICAgICAgICAgIG9mZjIgPSBjZmZfaW5kZXhfcmVhZF9vZmZzZXQoIGlkeCwgJmVycm9yICk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHdoaWxlICggb2ZmMiA9PSAwICYmIGVsZW1lbnQgPCBpZHgtPmNvdW50ICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgICAvKiB1c2Ugb2Zmc2V0cyB0YWJsZSAqLwotICAgICAgewotICAgICAgICBvZmYxID0gaWR4LT5vZmZzZXRzW2VsZW1lbnRdOwotICAgICAgICBpZiAoIG9mZjEgKQotICAgICAgICB7Ci0gICAgICAgICAgZG8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlbGVtZW50Kys7Ci0gICAgICAgICAgICBvZmYyID0gaWR4LT5vZmZzZXRzW2VsZW1lbnRdOwotCi0gICAgICAgICAgfSB3aGlsZSAoIG9mZjIgPT0gMCAmJiBlbGVtZW50IDwgaWR4LT5jb3VudCApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIFhYWDogc2hvdWxkIGNoZWNrIG9mZjIgZG9lcyBub3QgZXhjZWVkIHRoZSBlbmQgb2YgdGhpcyBlbnRyeTsgKi8KLSAgICAgIC8qICAgICAgYXQgcHJlc2VudCwgb25seSB0cnVuY2F0ZSBvZmYyIGF0IHRoZSBlbmQgb2YgdGhpcyBzdHJlYW0gKi8KLSAgICAgIGlmICggb2ZmMiA+IHN0cmVhbS0+c2l6ZSArIDEgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIGlkeC0+ZGF0YV9vZmZzZXQgPiBzdHJlYW0tPnNpemUgLSBvZmYyICsgMSApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggImNmZl9pbmRleF9hY2Nlc3NfZWxlbWVudDoiCi0gICAgICAgICAgICAgICAgICAgIiBvZmZzZXQgdG8gbmV4dCBlbnRyeSAoJWQpIgotICAgICAgICAgICAgICAgICAgICIgZXhjZWVkcyB0aGUgZW5kIG9mIHN0cmVhbSAoJWQpXG4iLAotICAgICAgICAgICAgICAgICAgIG9mZjIsIHN0cmVhbS0+c2l6ZSAtIGlkeC0+ZGF0YV9vZmZzZXQgKyAxICkpOwotICAgICAgICBvZmYyID0gc3RyZWFtLT5zaXplIC0gaWR4LT5kYXRhX29mZnNldCArIDE7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGFjY2VzcyBlbGVtZW50ICovCi0gICAgICBpZiAoIG9mZjEgJiYgb2ZmMiA+IG9mZjEgKQotICAgICAgewotICAgICAgICAqcGJ5dGVfbGVuID0gb2ZmMiAtIG9mZjE7Ci0KLSAgICAgICAgaWYgKCBpZHgtPmJ5dGVzICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHRoaXMgaW5kZXggd2FzIGNvbXBsZXRlbHkgbG9hZGVkIGluIG1lbW9yeSwgdGhhdCdzIGVhc3kgKi8KLSAgICAgICAgICAqcGJ5dGVzID0gaWR4LT5ieXRlcyArIG9mZjEgLSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8qIHRoaXMgaW5kZXggaXMgc3RpbGwgb24gZGlzay9maWxlLCBhY2Nlc3MgaXQgdGhyb3VnaCBhIGZyYW1lICovCi0gICAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggaWR4LT5kYXRhX29mZnNldCArIG9mZjEgLSAxICkgfHwKLSAgICAgICAgICAgICAgIEZUX0ZSQU1FX0VYVFJBQ1QoIG9mZjIgLSBvZmYxLCAqcGJ5dGVzICkgICAgICApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogZW1wdHkgaW5kZXggZWxlbWVudCAqLwotICAgICAgICAqcGJ5dGVzICAgID0gMDsKLSAgICAgICAgKnBieXRlX2xlbiA9IDA7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2ZmX2luZGV4X2ZvcmdldF9lbGVtZW50KCBDRkZfSW5kZXggIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBieXRlcyApCi0gIHsKLSAgICBpZiAoIGlkeC0+Ynl0ZXMgPT0gMCApCi0gICAgewotICAgICAgRlRfU3RyZWFtICBzdHJlYW0gPSBpZHgtPnN0cmVhbTsKLQotCi0gICAgICBGVF9GUkFNRV9SRUxFQVNFKCAqcGJ5dGVzICk7Ci0gICAgfQotICB9Ci0KLQotICAvKiBnZXQgYW4gZW50cnkgZnJvbSBOYW1lIElOREVYICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfU3RyaW5nKiApCi0gIGNmZl9pbmRleF9nZXRfbmFtZSggQ0ZGX0ZvbnQgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGVsZW1lbnQgKQotICB7Ci0gICAgQ0ZGX0luZGV4ICAgaWR4ID0gJmZvbnQtPm5hbWVfaW5kZXg7Ci0gICAgRlRfTWVtb3J5ICAgbWVtb3J5ID0gaWR4LT5zdHJlYW0tPm1lbW9yeTsKLSAgICBGVF9CeXRlKiAgICBieXRlczsKLSAgICBGVF9VTG9uZyAgICBieXRlX2xlbjsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLSAgICBGVF9TdHJpbmcqICBuYW1lID0gMDsKLQotCi0gICAgZXJyb3IgPSBjZmZfaW5kZXhfYWNjZXNzX2VsZW1lbnQoIGlkeCwgZWxlbWVudCwgJmJ5dGVzLCAmYnl0ZV9sZW4gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggIUZUX0FMTE9DKCBuYW1lLCBieXRlX2xlbiArIDEgKSApCi0gICAgewotICAgICAgRlRfTUVNX0NPUFkoIG5hbWUsIGJ5dGVzLCBieXRlX2xlbiApOwotICAgICAgbmFtZVtieXRlX2xlbl0gPSAwOwotICAgIH0KLSAgICBjZmZfaW5kZXhfZm9yZ2V0X2VsZW1lbnQoIGlkeCwgJmJ5dGVzICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0KLSAgLyogZ2V0IGFuIGVudHJ5IGZyb20gU3RyaW5nIElOREVYICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfU3RyaW5nKiApCi0gIGNmZl9pbmRleF9nZXRfc3RyaW5nKCBDRkZfRm9udCAgZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBlbGVtZW50ICkKLSAgewotICAgIHJldHVybiAoIGVsZW1lbnQgPCBmb250LT5udW1fc3RyaW5ncyApCi0gICAgICAgICAgICAgPyAoRlRfU3RyaW5nKilmb250LT5zdHJpbmdzW2VsZW1lbnRdCi0gICAgICAgICAgICAgOiBOVUxMOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX1N0cmluZyogKQotICBjZmZfaW5kZXhfZ2V0X3NpZF9zdHJpbmcoIENGRl9Gb250ICBmb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBzaWQgKQotICB7Ci0gICAgLyogdmFsdWUgMHhGRkZGVSBpbmRpY2F0ZXMgYSBtaXNzaW5nIGRpY3Rpb25hcnkgZW50cnkgKi8KLSAgICBpZiAoIHNpZCA9PSAweEZGRkZVICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLyogaWYgaXQgaXMgbm90IGEgc3RhbmRhcmQgc3RyaW5nLCByZXR1cm4gaXQgKi8KLSAgICBpZiAoIHNpZCA+IDM5MCApCi0gICAgICByZXR1cm4gY2ZmX2luZGV4X2dldF9zdHJpbmcoIGZvbnQsIHNpZCAtIDM5MSApOwotCi0gICAgLyogQ0lELWtleWVkIENGRiBmb250cyBkb24ndCBoYXZlIGdseXBoIG5hbWVzICovCi0gICAgaWYgKCAhZm9udC0+cHNuYW1lcyApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIC8qIHRoaXMgaXMgYSBzdGFuZGFyZCBzdHJpbmcgKi8KLSAgICByZXR1cm4gKEZUX1N0cmluZyAqKWZvbnQtPnBzbmFtZXMtPmFkb2JlX3N0ZF9zdHJpbmdzKCBzaWQgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgIEZEIFNlbGVjdCB0YWJsZSBzdXBwb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBzdGF0aWMgdm9pZAotICBDRkZfRG9uZV9GRF9TZWxlY3QoIENGRl9GRFNlbGVjdCAgZmRzZWxlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICBzdHJlYW0gKQotICB7Ci0gICAgaWYgKCBmZHNlbGVjdC0+ZGF0YSApCi0gICAgICBGVF9GUkFNRV9SRUxFQVNFKCBmZHNlbGVjdC0+ZGF0YSApOwotCi0gICAgZmRzZWxlY3QtPmRhdGFfc2l6ZSAgID0gMDsKLSAgICBmZHNlbGVjdC0+Zm9ybWF0ICAgICAgPSAwOwotICAgIGZkc2VsZWN0LT5yYW5nZV9jb3VudCA9IDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBDRkZfTG9hZF9GRF9TZWxlY3QoIENGRl9GRFNlbGVjdCAgZmRzZWxlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBudW1fZ2x5cGhzLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgb2Zmc2V0ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBGVF9CeXRlICAgZm9ybWF0OwotICAgIEZUX1VJbnQgICBudW1fcmFuZ2VzOwotCi0KLSAgICAvKiByZWFkIGZvcm1hdCAqLwotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIG9mZnNldCApIHx8IEZUX1JFQURfQllURSggZm9ybWF0ICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZmRzZWxlY3QtPmZvcm1hdCAgICAgID0gZm9ybWF0OwotICAgIGZkc2VsZWN0LT5jYWNoZV9jb3VudCA9IDA7ICAgLyogY2xlYXIgY2FjaGUgKi8KLQotICAgIHN3aXRjaCAoIGZvcm1hdCApCi0gICAgewotICAgIGNhc2UgMDogICAgIC8qIGZvcm1hdCAwLCB0aGF0J3Mgc2ltcGxlICovCi0gICAgICBmZHNlbGVjdC0+ZGF0YV9zaXplID0gbnVtX2dseXBoczsKLSAgICAgIGdvdG8gTG9hZF9EYXRhOwotCi0gICAgY2FzZSAzOiAgICAgLyogZm9ybWF0IDMsIGEgdGFkIG1vcmUgY29tcGxleCAqLwotICAgICAgaWYgKCBGVF9SRUFEX1VTSE9SVCggbnVtX3JhbmdlcyApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBpZiAoICFudW1fcmFuZ2VzICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UwKCggIkNGRl9Mb2FkX0ZEX1NlbGVjdDogZW1wdHkgRkRTZWxlY3QgYXJyYXlcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBmZHNlbGVjdC0+ZGF0YV9zaXplID0gbnVtX3JhbmdlcyAqIDMgKyAyOwotCi0gICAgTG9hZF9EYXRhOgotICAgICAgaWYgKCBGVF9GUkFNRV9FWFRSQUNUKCBmZHNlbGVjdC0+ZGF0YV9zaXplLCBmZHNlbGVjdC0+ZGF0YSApICkKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OiAgICAvKiBobW0uLi4gdGhhdCdzIHdyb25nICovCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0J5dGUgKQotICBjZmZfZmRfc2VsZWN0X2dldCggQ0ZGX0ZEU2VsZWN0ICBmZHNlbGVjdCwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGhfaW5kZXggKQotICB7Ci0gICAgRlRfQnl0ZSAgZmQgPSAwOwotCi0KLSAgICBzd2l0Y2ggKCBmZHNlbGVjdC0+Zm9ybWF0ICkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgZmQgPSBmZHNlbGVjdC0+ZGF0YVtnbHlwaF9pbmRleF07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzoKLSAgICAgIC8qIGZpcnN0LCBjb21wYXJlIHRvIHRoZSBjYWNoZSAqLwotICAgICAgaWYgKCAoRlRfVUludCkoIGdseXBoX2luZGV4IC0gZmRzZWxlY3QtPmNhY2hlX2ZpcnN0ICkgPAotICAgICAgICAgICAgICAgICAgICAgICAgZmRzZWxlY3QtPmNhY2hlX2NvdW50ICkKLSAgICAgIHsKLSAgICAgICAgZmQgPSBmZHNlbGVjdC0+Y2FjaGVfZmQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvKiB0aGVuLCBsb29rIHVwIHRoZSByYW5nZXMgYXJyYXkgKi8KLSAgICAgIHsKLSAgICAgICAgRlRfQnl0ZSogIHAgICAgICAgPSBmZHNlbGVjdC0+ZGF0YTsKLSAgICAgICAgRlRfQnl0ZSogIHBfbGltaXQgPSBwICsgZmRzZWxlY3QtPmRhdGFfc2l6ZTsKLSAgICAgICAgRlRfQnl0ZSAgIGZkMjsKLSAgICAgICAgRlRfVUludCAgIGZpcnN0LCBsaW1pdDsKLQotCi0gICAgICAgIGZpcnN0ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgIGlmICggZ2x5cGhfaW5kZXggPCBmaXJzdCApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGZkMiAgID0gKnArKzsKLSAgICAgICAgICBsaW1pdCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICAgICAgICBpZiAoIGdseXBoX2luZGV4IDwgbGltaXQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZkID0gZmQyOwotCi0gICAgICAgICAgICAvKiB1cGRhdGUgY2FjaGUgKi8KLSAgICAgICAgICAgIGZkc2VsZWN0LT5jYWNoZV9maXJzdCA9IGZpcnN0OwotICAgICAgICAgICAgZmRzZWxlY3QtPmNhY2hlX2NvdW50ID0gbGltaXQgLSBmaXJzdDsKLSAgICAgICAgICAgIGZkc2VsZWN0LT5jYWNoZV9mZCAgICA9IGZkMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBmaXJzdCA9IGxpbWl0OwotCi0gICAgICAgIH0gd2hpbGUgKCBwIDwgcF9saW1pdCApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgOwotICAgIH0KLQotICAgIHJldHVybiBmZDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKi8KLSAgLyoqKiAgIENGRiBmb250IHN1cHBvcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKiovCi0gIC8qKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9jaGFyc2V0X2NvbXB1dGVfY2lkcyggQ0ZGX0NoYXJzZXQgIGNoYXJzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIG51bV9nbHlwaHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yICAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfVUludCAgICBpOwotICAgIEZUX0xvbmcgICAgajsKLSAgICBGVF9VU2hvcnQgIG1heF9jaWQgPSAwOwotCi0KLSAgICBpZiAoIGNoYXJzZXQtPm1heF9jaWQgPiAwICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX2dseXBoczsgaSsrICkKLSAgICB7Ci0gICAgICBpZiAoIGNoYXJzZXQtPnNpZHNbaV0gPiBtYXhfY2lkICkKLSAgICAgICAgbWF4X2NpZCA9IGNoYXJzZXQtPnNpZHNbaV07Ci0gICAgfQotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIGNoYXJzZXQtPmNpZHMsIChGVF9VTG9uZyltYXhfY2lkICsgMSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIFdoZW4gbXVsdGlwbGUgR0lEcyBtYXAgdG8gdGhlIHNhbWUgQ0lELCB3ZSBjaG9vc2UgdGhlIGxvd2VzdCAqLwotICAgIC8qIEdJRC4gIFRoaXMgaXMgbm90IGRlc2NyaWJlZCBpbiBhbnkgc3BlYywgYnV0IGl0IG1hdGNoZXMgdGhlICAqLwotICAgIC8qIGJlaGF2aW91ciBvZiByZWNlbnQgQWNyb3JlYWQgdmVyc2lvbnMuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGZvciAoIGogPSAoRlRfTG9uZyludW1fZ2x5cGhzIC0gMTsgaiA+PSAwIDsgai0tICkKLSAgICAgIGNoYXJzZXQtPmNpZHNbY2hhcnNldC0+c2lkc1tqXV0gPSAoRlRfVVNob3J0KWo7Ci0KLSAgICBjaGFyc2V0LT5tYXhfY2lkICAgID0gbWF4X2NpZDsKLSAgICBjaGFyc2V0LT5udW1fZ2x5cGhzID0gbnVtX2dseXBoczsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9VSW50ICkKLSAgY2ZmX2NoYXJzZXRfY2lkX3RvX2dpbmRleCggQ0ZGX0NoYXJzZXQgIGNoYXJzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBjaWQgKQotICB7Ci0gICAgRlRfVUludCAgcmVzdWx0ID0gMDsKLQotCi0gICAgaWYgKCBjaWQgPD0gY2hhcnNldC0+bWF4X2NpZCApCi0gICAgICByZXN1bHQgPSBjaGFyc2V0LT5jaWRzW2NpZF07Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBjZmZfY2hhcnNldF9mcmVlX2NpZHMoIENGRl9DaGFyc2V0ICBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICBtZW1vcnkgKQotICB7Ci0gICAgRlRfRlJFRSggY2hhcnNldC0+Y2lkcyApOwotICAgIGNoYXJzZXQtPm1heF9jaWQgPSAwOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBjZmZfY2hhcnNldF9kb25lKCBDRkZfQ2hhcnNldCAgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgIHN0cmVhbSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotCi0KLSAgICBjZmZfY2hhcnNldF9mcmVlX2NpZHMoIGNoYXJzZXQsIG1lbW9yeSApOwotCi0gICAgRlRfRlJFRSggY2hhcnNldC0+c2lkcyApOwotICAgIGNoYXJzZXQtPmZvcm1hdCA9IDA7Ci0gICAgY2hhcnNldC0+b2Zmc2V0ID0gMDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9jaGFyc2V0X2xvYWQoIENGRl9DaGFyc2V0ICBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgbnVtX2dseXBocywKLSAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgIGJhc2Vfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgaW52ZXJ0ICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfVVNob3J0ICBnbHlwaF9zaWQ7Ci0KLQotICAgIC8qIElmIHRoZSB0aGUgb2Zmc2V0IGlzIGdyZWF0ZXIgdGhhbiAyLCB3ZSBoYXZlIHRvIHBhcnNlIHRoZSAqLwotICAgIC8qIGNoYXJzZXQgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggb2Zmc2V0ID4gMiApCi0gICAgewotICAgICAgRlRfVUludCAgajsKLQotCi0gICAgICBjaGFyc2V0LT5vZmZzZXQgPSBiYXNlX29mZnNldCArIG9mZnNldDsKLQotICAgICAgLyogR2V0IHRoZSBmb3JtYXQgb2YgdGhlIHRhYmxlLiAqLwotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggY2hhcnNldC0+b2Zmc2V0ICkgfHwKLSAgICAgICAgICAgRlRfUkVBRF9CWVRFKCBjaGFyc2V0LT5mb3JtYXQgKSAgICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHNpZHMuICovCi0gICAgICBpZiAoIEZUX05FV19BUlJBWSggY2hhcnNldC0+c2lkcywgbnVtX2dseXBocyApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiBhc3NpZ24gdGhlIC5ub3RkZWYgZ2x5cGggKi8KLSAgICAgIGNoYXJzZXQtPnNpZHNbMF0gPSAwOwotCi0gICAgICBzd2l0Y2ggKCBjaGFyc2V0LT5mb3JtYXQgKQotICAgICAgewotICAgICAgY2FzZSAwOgotICAgICAgICBpZiAoIG51bV9nbHlwaHMgPiAwICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggRlRfRlJBTUVfRU5URVIoICggbnVtX2dseXBocyAtIDEgKSAqIDIgKSApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICBmb3IgKCBqID0gMTsgaiA8IG51bV9nbHlwaHM7IGorKyApCi0gICAgICAgICAgICBjaGFyc2V0LT5zaWRzW2pdID0gRlRfR0VUX1VTSE9SVCgpOwotCi0gICAgICAgICAgRlRfRlJBTUVfRVhJVCgpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDE6Ci0gICAgICBjYXNlIDI6Ci0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50ICBubGVmdDsKLSAgICAgICAgICBGVF9VSW50ICBpOwotCi0KLSAgICAgICAgICBqID0gMTsKLQotICAgICAgICAgIHdoaWxlICggaiA8IG51bV9nbHlwaHMgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIFJlYWQgdGhlIGZpcnN0IGdseXBoIHNpZCBvZiB0aGUgcmFuZ2UuICovCi0gICAgICAgICAgICBpZiAoIEZUX1JFQURfVVNIT1JUKCBnbHlwaF9zaWQgKSApCi0gICAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgICAgLyogUmVhZCB0aGUgbnVtYmVyIG9mIGdseXBocyBpbiB0aGUgcmFuZ2UuICAqLwotICAgICAgICAgICAgaWYgKCBjaGFyc2V0LT5mb3JtYXQgPT0gMiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICggRlRfUkVBRF9VU0hPUlQoIG5sZWZ0ICkgKQotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCBGVF9SRUFEX0JZVEUoIG5sZWZ0ICkgKQotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogdHJ5IHRvIHJlc2N1ZSBzb21lIG9mIHRoZSBTSURzIGlmIGBubGVmdCcgaXMgdG9vIGxhcmdlICovCi0gICAgICAgICAgICBpZiAoIGdseXBoX3NpZCA+IDB4RkZGRkwgLSBubGVmdCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0VSUk9SKCggImNmZl9jaGFyc2V0X2xvYWQ6IGludmFsaWQgU0lEIHJhbmdlIHRyaW1tZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiBubGVmdD0lZCAtPiAlZFxuIiwgbmxlZnQsIDB4RkZGRkwgLSBnbHlwaF9zaWQgKSk7Ci0gICAgICAgICAgICAgIG5sZWZ0ID0gKCBGVF9VSW50ICkoIDB4RkZGRkwgLSBnbHlwaF9zaWQgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogRmlsbCBpbiB0aGUgcmFuZ2Ugb2Ygc2lkcyAtLSBgbmxlZnQgKyAxJyBnbHlwaHMuICovCi0gICAgICAgICAgICBmb3IgKCBpID0gMDsgaiA8IG51bV9nbHlwaHMgJiYgaSA8PSBubGVmdDsgaSsrLCBqKyssIGdseXBoX3NpZCsrICkKLSAgICAgICAgICAgICAgY2hhcnNldC0+c2lkc1tqXSA9IGdseXBoX3NpZDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEZUX0VSUk9SKCggImNmZl9jaGFyc2V0X2xvYWQ6IGludmFsaWQgdGFibGUgZm9ybWF0XG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIFBhcnNlIGRlZmF1bHQgdGFibGVzIGNvcnJlc3BvbmRpbmcgdG8gb2Zmc2V0ID09IDAsIDEsIG9yIDIuICAqLwotICAgICAgLyogQ0ZGIHNwZWNpZmljYXRpb24gaW50aW1hdGVzIHRoZSBmb2xsb3dpbmc6ICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIEluIG9yZGVyIHRvIHVzZSBhIHByZWRlZmluZWQgY2hhcnNldCwgdGhlIGZvbGxvd2luZyBtdXN0IGJlICAqLwotICAgICAgLyogdHJ1ZTogVGhlIGNoYXJzZXQgY29uc3RydWN0ZWQgZm9yIHRoZSBnbHlwaHMgaW4gdGhlIGZvbnQncyAgICovCi0gICAgICAvKiBjaGFyc3RyaW5ncyBkaWN0aW9uYXJ5IG11c3QgbWF0Y2ggdGhlIHByZWRlZmluZWQgY2hhcnNldCBpbiAgKi8KLSAgICAgIC8qIHRoZSBmaXJzdCBudW1fZ2x5cGhzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBjaGFyc2V0LT5vZmZzZXQgPSBvZmZzZXQ7ICAvKiByZWNvcmQgY2hhcnNldCB0eXBlICovCi0KLSAgICAgIHN3aXRjaCAoIChGVF9VSW50KW9mZnNldCApCi0gICAgICB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgIGlmICggbnVtX2dseXBocyA+IDIyOSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9FUlJPUigoICJjZmZfY2hhcnNldF9sb2FkOiBpbXBsaWNpdCBjaGFyc2V0IGxhcmdlciB0aGFuXG4iCi0gICAgICAgICAgICAgICAgICAgICAicHJlZGVmaW5lZCBjaGFyc2V0IChBZG9iZSBJU08tTGF0aW4pXG4iICkpOwotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHNpZHMuICovCi0gICAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBjaGFyc2V0LT5zaWRzLCBudW1fZ2x5cGhzICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAvKiBDb3B5IHRoZSBwcmVkZWZpbmVkIGNoYXJzZXQgaW50byB0aGUgYWxsb2NhdGVkIG1lbW9yeS4gKi8KLSAgICAgICAgRlRfQVJSQVlfQ09QWSggY2hhcnNldC0+c2lkcywgY2ZmX2lzb2Fkb2JlX2NoYXJzZXQsIG51bV9nbHlwaHMgKTsKLQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAxOgotICAgICAgICBpZiAoIG51bV9nbHlwaHMgPiAxNjYgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfRVJST1IoKCAiY2ZmX2NoYXJzZXRfbG9hZDogaW1wbGljaXQgY2hhcnNldCBsYXJnZXIgdGhhblxuIgotICAgICAgICAgICAgICAgICAgICAgInByZWRlZmluZWQgY2hhcnNldCAoQWRvYmUgRXhwZXJ0KVxuIiApKTsKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzaWRzLiAqLwotICAgICAgICBpZiAoIEZUX05FV19BUlJBWSggY2hhcnNldC0+c2lkcywgbnVtX2dseXBocyApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgLyogQ29weSB0aGUgcHJlZGVmaW5lZCBjaGFyc2V0IGludG8gdGhlIGFsbG9jYXRlZCBtZW1vcnkuICAgICAqLwotICAgICAgICBGVF9BUlJBWV9DT1BZKCBjaGFyc2V0LT5zaWRzLCBjZmZfZXhwZXJ0X2NoYXJzZXQsIG51bV9nbHlwaHMgKTsKLQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAyOgotICAgICAgICBpZiAoIG51bV9nbHlwaHMgPiA4NyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9FUlJPUigoICJjZmZfY2hhcnNldF9sb2FkOiBpbXBsaWNpdCBjaGFyc2V0IGxhcmdlciB0aGFuXG4iCi0gICAgICAgICAgICAgICAgICAgICAicHJlZGVmaW5lZCBjaGFyc2V0IChBZG9iZSBFeHBlcnQgU3Vic2V0KVxuIiApKTsKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzaWRzLiAqLwotICAgICAgICBpZiAoIEZUX05FV19BUlJBWSggY2hhcnNldC0+c2lkcywgbnVtX2dseXBocyApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgLyogQ29weSB0aGUgcHJlZGVmaW5lZCBjaGFyc2V0IGludG8gdGhlIGFsbG9jYXRlZCBtZW1vcnkuICAgICAqLwotICAgICAgICBGVF9BUlJBWV9DT1BZKCBjaGFyc2V0LT5zaWRzLCBjZmZfZXhwZXJ0c3Vic2V0X2NoYXJzZXQsIG51bV9nbHlwaHMgKTsKLQotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogd2UgaGF2ZSB0byBpbnZlcnQgdGhlIGBzaWRzJyBhcnJheSBmb3Igc3Vic2V0dGVkIENJRC1rZXllZCBmb250cyAqLwotICAgIGlmICggaW52ZXJ0ICkKLSAgICAgIGVycm9yID0gY2ZmX2NoYXJzZXRfY29tcHV0ZV9jaWRzKCBjaGFyc2V0LCBudW1fZ2x5cGhzLCBtZW1vcnkgKTsKLQotICBFeGl0OgotICAgIC8qIENsZWFuIHVwIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4gKi8KLSAgICBpZiAoIGVycm9yICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCBjaGFyc2V0LT5zaWRzICk7Ci0gICAgICBGVF9GUkVFKCBjaGFyc2V0LT5jaWRzICk7Ci0gICAgICBjaGFyc2V0LT5mb3JtYXQgPSAwOwotICAgICAgY2hhcnNldC0+b2Zmc2V0ID0gMDsKLSAgICAgIGNoYXJzZXQtPnNpZHMgICA9IDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBjZmZfZW5jb2RpbmdfZG9uZSggQ0ZGX0VuY29kaW5nICBlbmNvZGluZyApCi0gIHsKLSAgICBlbmNvZGluZy0+Zm9ybWF0ID0gMDsKLSAgICBlbmNvZGluZy0+b2Zmc2V0ID0gMDsKLSAgICBlbmNvZGluZy0+Y291bnQgID0gMDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9lbmNvZGluZ19sb2FkKCBDRkZfRW5jb2RpbmcgIGVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgQ0ZGX0NoYXJzZXQgICBjaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBudW1fZ2x5cGhzLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgIGJhc2Vfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICBvZmZzZXQgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9VSW50ICAgIGNvdW50OwotICAgIEZUX1VJbnQgICAgajsKLSAgICBGVF9VU2hvcnQgIGdseXBoX3NpZDsKLSAgICBGVF9VSW50ICAgIGdseXBoX2NvZGU7Ci0KLQotICAgIC8qIENoZWNrIGZvciBjaGFyc2V0LT5zaWRzLiAgSWYgd2UgZG8gbm90IGhhdmUgdGhpcywgd2UgZmFpbC4gKi8KLSAgICBpZiAoICFjaGFyc2V0LT5zaWRzICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogWmVybyBvdXQgdGhlIGNvZGUgdG8gZ2lkL3NpZCBtYXBwaW5ncy4gKi8KLSAgICBmb3IgKCBqID0gMDsgaiA8IDI1NjsgaisrICkKLSAgICB7Ci0gICAgICBlbmNvZGluZy0+c2lkcyBbal0gPSAwOwotICAgICAgZW5jb2RpbmctPmNvZGVzW2pdID0gMDsKLSAgICB9Ci0KLSAgICAvKiBOb3RlOiBUaGUgZW5jb2RpbmcgdGFibGUgaW4gYSBDRkYgZm9udCBpcyBpbmRleGVkIGJ5IGdseXBoIGluZGV4OyAgKi8KLSAgICAvKiB0aGUgZmlyc3QgZW5jb2RlZCBnbHlwaCBpbmRleCBpcyAxLiAgSGVuY2UsIHdlIHJlYWQgdGhlIGNoYXJhY3RlciAgKi8KLSAgICAvKiBjb2RlIChgZ2x5cGhfY29kZScpIGF0IGluZGV4IGogYW5kIG1ha2UgdGhlIGFzc2lnbm1lbnQ6ICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICBlbmNvZGluZy0+Y29kZXNbZ2x5cGhfY29kZV0gPSBqICsgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBXZSBhbHNvIG1ha2UgdGhlIGFzc2lnbm1lbnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICBlbmNvZGluZy0+c2lkc1tnbHlwaF9jb2RlXSA9IGNoYXJzZXQtPnNpZHNbaiArIDFdICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBUaGlzIGdpdmVzIHVzIGJvdGggYSBjb2RlIHRvIEdJRCBhbmQgYSBjb2RlIHRvIFNJRCBtYXBwaW5nLiAgICAgICAgKi8KLQotICAgIGlmICggb2Zmc2V0ID4gMSApCi0gICAgewotICAgICAgZW5jb2RpbmctPm9mZnNldCA9IGJhc2Vfb2Zmc2V0ICsgb2Zmc2V0OwotCi0gICAgICAvKiB3ZSBuZWVkIHRvIHBhcnNlIHRoZSB0YWJsZSB0byBkZXRlcm1pbmUgaXRzIHNpemUgKi8KLSAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGVuY29kaW5nLT5vZmZzZXQgKSB8fAotICAgICAgICAgICBGVF9SRUFEX0JZVEUoIGVuY29kaW5nLT5mb3JtYXQgKSAgIHx8Ci0gICAgICAgICAgIEZUX1JFQURfQllURSggY291bnQgKSAgICAgICAgICAgICAgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHN3aXRjaCAoIGVuY29kaW5nLT5mb3JtYXQgJiAweDdGICkKLSAgICAgIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgewotICAgICAgICAgIEZUX0J5dGUqICBwOwotCi0KLSAgICAgICAgICAvKiBCeSBjb252ZW50aW9uLCBHSUQgMCBpcyBhbHdheXMgIi5ub3RkZWYiIGFuZCBpcyBuZXZlciAqLwotICAgICAgICAgIC8qIGNvZGVkIGluIHRoZSBmb250LiAgSGVuY2UsIHRoZSBudW1iZXIgb2YgY29kZXMgZm91bmQgICovCi0gICAgICAgICAgLyogaW4gdGhlIHRhYmxlIGlzIGBjb3VudCsxJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGVuY29kaW5nLT5jb3VudCA9IGNvdW50ICsgMTsKLQotICAgICAgICAgIGlmICggRlRfRlJBTUVfRU5URVIoIGNvdW50ICkgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgcCA9IChGVF9CeXRlKilzdHJlYW0tPmN1cnNvcjsKLQotICAgICAgICAgIGZvciAoIGogPSAxOyBqIDw9IGNvdW50OyBqKysgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGdseXBoX2NvZGUgPSAqcCsrOwotCi0gICAgICAgICAgICAvKiBNYWtlIHN1cmUgaiBpcyBub3QgdG9vIGJpZy4gKi8KLSAgICAgICAgICAgIGlmICggaiA8IG51bV9nbHlwaHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiBBc3NpZ24gY29kZSB0byBHSUQgbWFwcGluZy4gKi8KLSAgICAgICAgICAgICAgZW5jb2RpbmctPmNvZGVzW2dseXBoX2NvZGVdID0gKEZUX1VTaG9ydClqOwotCi0gICAgICAgICAgICAgIC8qIEFzc2lnbiBjb2RlIHRvIFNJRCBtYXBwaW5nLiAqLwotICAgICAgICAgICAgICBlbmNvZGluZy0+c2lkc1tnbHlwaF9jb2RlXSA9IGNoYXJzZXQtPnNpZHNbal07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgRlRfRlJBTUVfRVhJVCgpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDE6Ci0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50ICBubGVmdDsKLSAgICAgICAgICBGVF9VSW50ICBpID0gMTsKLSAgICAgICAgICBGVF9VSW50ICBrOwotCi0KLSAgICAgICAgICBlbmNvZGluZy0+Y291bnQgPSAwOwotCi0gICAgICAgICAgLyogUGFyc2UgdGhlIEZvcm1hdDEgcmFuZ2VzLiAqLwotICAgICAgICAgIGZvciAoIGogPSAwOyAgaiA8IGNvdW50OyBqKyssIGkgKz0gbmxlZnQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIFJlYWQgdGhlIGZpcnN0IGdseXBoIGNvZGUgb2YgdGhlIHJhbmdlLiAqLwotICAgICAgICAgICAgaWYgKCBGVF9SRUFEX0JZVEUoIGdseXBoX2NvZGUgKSApCi0gICAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgICAgLyogUmVhZCB0aGUgbnVtYmVyIG9mIGNvZGVzIGluIHRoZSByYW5nZS4gKi8KLSAgICAgICAgICAgIGlmICggRlRfUkVBRF9CWVRFKCBubGVmdCApICkKLSAgICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgICAvKiBJbmNyZW1lbnQgbmxlZnQsIHNvIHdlIHJlYWQgYG5sZWZ0ICsgMScgY29kZXMvc2lkcy4gKi8KLSAgICAgICAgICAgIG5sZWZ0Kys7Ci0KLSAgICAgICAgICAgIC8qIGNvbXB1dGUgbWF4IG51bWJlciBvZiBjaGFyYWN0ZXIgY29kZXMgKi8KLSAgICAgICAgICAgIGlmICggKEZUX1VJbnQpbmxlZnQgPiBlbmNvZGluZy0+Y291bnQgKQotICAgICAgICAgICAgICBlbmNvZGluZy0+Y291bnQgPSBubGVmdDsKLQotICAgICAgICAgICAgLyogRmlsbCBpbiB0aGUgcmFuZ2Ugb2YgY29kZXMvc2lkcy4gKi8KLSAgICAgICAgICAgIGZvciAoIGsgPSBpOyBrIDwgbmxlZnQgKyBpOyBrKyssIGdseXBoX2NvZGUrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSBrIGlzIG5vdCB0b28gYmlnLiAqLwotICAgICAgICAgICAgICBpZiAoIGsgPCBudW1fZ2x5cGhzICYmIGdseXBoX2NvZGUgPCAyNTYgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogQXNzaWduIGNvZGUgdG8gR0lEIG1hcHBpbmcuICovCi0gICAgICAgICAgICAgICAgZW5jb2RpbmctPmNvZGVzW2dseXBoX2NvZGVdID0gKEZUX1VTaG9ydClrOwotCi0gICAgICAgICAgICAgICAgLyogQXNzaWduIGNvZGUgdG8gU0lEIG1hcHBpbmcuICovCi0gICAgICAgICAgICAgICAgZW5jb2RpbmctPnNpZHNbZ2x5cGhfY29kZV0gPSBjaGFyc2V0LT5zaWRzW2tdOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogc2ltcGxlIGNoZWNrOyBvbmUgbmV2ZXIga25vd3Mgd2hhdCBjYW4gYmUgZm91bmQgaW4gYSBmb250ICovCi0gICAgICAgICAgaWYgKCBlbmNvZGluZy0+Y291bnQgPiAyNTYgKQotICAgICAgICAgICAgZW5jb2RpbmctPmNvdW50ID0gMjU2OwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBGVF9FUlJPUigoICJjZmZfZW5jb2RpbmdfbG9hZDogaW52YWxpZCB0YWJsZSBmb3JtYXRcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICAvKiBQYXJzZSBzdXBwbGVtZW50YWwgZW5jb2RpbmdzLCBpZiBhbnkuICovCi0gICAgICBpZiAoIGVuY29kaW5nLT5mb3JtYXQgJiAweDgwICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgZ2luZGV4OwotCi0KLSAgICAgICAgLyogY291bnQgc3VwcGxlbWVudHMgKi8KLSAgICAgICAgaWYgKCBGVF9SRUFEX0JZVEUoIGNvdW50ICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGNvdW50OyBqKysgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogUmVhZCBzdXBwbGVtZW50YWwgZ2x5cGggY29kZS4gKi8KLSAgICAgICAgICBpZiAoIEZUX1JFQURfQllURSggZ2x5cGhfY29kZSApICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgIC8qIFJlYWQgdGhlIFNJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyBnbHlwaCBjb2RlLiAqLwotICAgICAgICAgIGlmICggRlRfUkVBRF9VU0hPUlQoIGdseXBoX3NpZCApICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgIC8qIEFzc2lnbiBjb2RlIHRvIFNJRCBtYXBwaW5nLiAqLwotICAgICAgICAgIGVuY29kaW5nLT5zaWRzW2dseXBoX2NvZGVdID0gZ2x5cGhfc2lkOwotCi0gICAgICAgICAgLyogRmlyc3QsIGxvb2sgdXAgR0lEIHdoaWNoIGhhcyBiZWVuIGFzc2lnbmVkIHRvICovCi0gICAgICAgICAgLyogU0lEIGdseXBoX3NpZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgZm9yICggZ2luZGV4ID0gMDsgZ2luZGV4IDwgbnVtX2dseXBoczsgZ2luZGV4KysgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggY2hhcnNldC0+c2lkc1tnaW5kZXhdID09IGdseXBoX3NpZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGVuY29kaW5nLT5jb2Rlc1tnbHlwaF9jb2RlXSA9IChGVF9VU2hvcnQpZ2luZGV4OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIFdlIHRha2UgaW50byBhY2NvdW50IHRoZSBmYWN0IGEgQ0ZGIGZvbnQgY2FuIHVzZSBhIHByZWRlZmluZWQgKi8KLSAgICAgIC8qIGVuY29kaW5nIHdpdGhvdXQgY29udGFpbmluZyBhbGwgb2YgdGhlIGdseXBocyBlbmNvZGVkIGJ5IHRoaXMgKi8KLSAgICAgIC8qIGVuY29kaW5nIChzZWUgdGhlIG5vdGUgYXQgdGhlIGVuZCBvZiBzZWN0aW9uIDEyIGluIHRoZSBDRkYgICAgKi8KLSAgICAgIC8qIHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgc3dpdGNoICggKEZUX1VJbnQpb2Zmc2V0ICkKLSAgICAgIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgLyogRmlyc3QsIGNvcHkgdGhlIGNvZGUgdG8gU0lEIG1hcHBpbmcuICovCi0gICAgICAgIEZUX0FSUkFZX0NPUFkoIGVuY29kaW5nLT5zaWRzLCBjZmZfc3RhbmRhcmRfZW5jb2RpbmcsIDI1NiApOwotICAgICAgICBnb3RvIFBvcHVsYXRlOwotCi0gICAgICBjYXNlIDE6Ci0gICAgICAgIC8qIEZpcnN0LCBjb3B5IHRoZSBjb2RlIHRvIFNJRCBtYXBwaW5nLiAqLwotICAgICAgICBGVF9BUlJBWV9DT1BZKCBlbmNvZGluZy0+c2lkcywgY2ZmX2V4cGVydF9lbmNvZGluZywgMjU2ICk7Ci0KLSAgICAgIFBvcHVsYXRlOgotICAgICAgICAvKiBDb25zdHJ1Y3QgY29kZSB0byBHSUQgbWFwcGluZyBmcm9tIGNvZGUgdG8gU0lEIG1hcHBpbmcgKi8KLSAgICAgICAgLyogYW5kIGNoYXJzZXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgZW5jb2RpbmctPmNvdW50ID0gMDsKLQotICAgICAgICBlcnJvciA9IGNmZl9jaGFyc2V0X2NvbXB1dGVfY2lkcyggY2hhcnNldCwgbnVtX2dseXBocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+bWVtb3J5ICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IDI1NjsgaisrICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgIHNpZCA9IGVuY29kaW5nLT5zaWRzW2pdOwotICAgICAgICAgIEZUX1VJbnQgIGdpZCA9IDA7Ci0KLQotICAgICAgICAgIGlmICggc2lkICkKLSAgICAgICAgICAgIGdpZCA9IGNmZl9jaGFyc2V0X2NpZF90b19naW5kZXgoIGNoYXJzZXQsIHNpZCApOwotCi0gICAgICAgICAgaWYgKCBnaWQgIT0gMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgZW5jb2RpbmctPmNvZGVzW2pdID0gKEZUX1VTaG9ydClnaWQ7Ci0gICAgICAgICAgICBlbmNvZGluZy0+Y291bnQgICAgPSBqICsgMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGVuY29kaW5nLT5jb2Rlc1tqXSA9IDA7Ci0gICAgICAgICAgICBlbmNvZGluZy0+c2lkcyBbal0gPSAwOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgRlRfRVJST1IoKCAiY2ZmX2VuY29kaW5nX2xvYWQ6IGludmFsaWQgdGFibGUgZm9ybWF0XG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLQotICAgIC8qIENsZWFuIHVwIGlmIHRoZXJlIHdhcyBhbiBlcnJvci4gKi8KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjZmZfc3ViZm9udF9sb2FkKCBDRkZfU3ViRm9udCAgZm9udCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZGX0luZGV4ICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIGZvbnRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICBiYXNlX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgRlRfTGlicmFyeSAgIGxpYnJhcnkgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvcjsKLSAgICBDRkZfUGFyc2VyUmVjICAgIHBhcnNlcjsKLSAgICBGVF9CeXRlKiAgICAgICAgIGRpY3QgPSBOVUxMOwotICAgIEZUX1VMb25nICAgICAgICAgZGljdF9sZW47Ci0gICAgQ0ZGX0ZvbnRSZWNEaWN0ICB0b3AgID0gJmZvbnQtPmZvbnRfZGljdDsKLSAgICBDRkZfUHJpdmF0ZSAgICAgIHByaXYgPSAmZm9udC0+cHJpdmF0ZV9kaWN0OwotCi0KLSAgICBjZmZfcGFyc2VyX2luaXQoICZwYXJzZXIsIENGRl9DT0RFX1RPUERJQ1QsICZmb250LT5mb250X2RpY3QsIGxpYnJhcnkgKTsKLQotICAgIC8qIHNldCBkZWZhdWx0cyAqLwotICAgIEZUX01FTV9aRVJPKCB0b3AsIHNpemVvZiAoICp0b3AgKSApOwotCi0gICAgdG9wLT51bmRlcmxpbmVfcG9zaXRpb24gID0gLSggMTAwTCA8PCAxNiApOwotICAgIHRvcC0+dW5kZXJsaW5lX3RoaWNrbmVzcyA9IDUwTCA8PCAxNjsKLSAgICB0b3AtPmNoYXJzdHJpbmdfdHlwZSAgICAgPSAyOwotICAgIHRvcC0+Zm9udF9tYXRyaXgueHggICAgICA9IDB4MTAwMDBMOwotICAgIHRvcC0+Zm9udF9tYXRyaXgueXkgICAgICA9IDB4MTAwMDBMOwotICAgIHRvcC0+Y2lkX2NvdW50ICAgICAgICAgICA9IDg3MjA7Ci0KLSAgICAvKiB3ZSB1c2UgdGhlIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIFNJRCB2YWx1ZSAweEZGRkYgdG8gaW5kaWNhdGUgKi8KLSAgICAvKiBtaXNzaW5nIGVudHJpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICB0b3AtPnZlcnNpb24gICAgICAgICAgICAgPSAweEZGRkZVOwotICAgIHRvcC0+bm90aWNlICAgICAgICAgICAgICA9IDB4RkZGRlU7Ci0gICAgdG9wLT5jb3B5cmlnaHQgICAgICAgICAgID0gMHhGRkZGVTsKLSAgICB0b3AtPmZ1bGxfbmFtZSAgICAgICAgICAgPSAweEZGRkZVOwotICAgIHRvcC0+ZmFtaWx5X25hbWUgICAgICAgICA9IDB4RkZGRlU7Ci0gICAgdG9wLT53ZWlnaHQgICAgICAgICAgICAgID0gMHhGRkZGVTsKLSAgICB0b3AtPmVtYmVkZGVkX3Bvc3RzY3JpcHQgPSAweEZGRkZVOwotCi0gICAgdG9wLT5jaWRfcmVnaXN0cnkgICAgICAgID0gMHhGRkZGVTsKLSAgICB0b3AtPmNpZF9vcmRlcmluZyAgICAgICAgPSAweEZGRkZVOwotICAgIHRvcC0+Y2lkX2ZvbnRfbmFtZSAgICAgICA9IDB4RkZGRlU7Ci0KLSAgICBlcnJvciA9IGNmZl9pbmRleF9hY2Nlc3NfZWxlbWVudCggaWR4LCBmb250X2luZGV4LCAmZGljdCwgJmRpY3RfbGVuICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFNCgoICIgdG9wIGRpY3Rpb25hcnk6XG4iICkpOwotICAgICAgZXJyb3IgPSBjZmZfcGFyc2VyX3J1biggJnBhcnNlciwgZGljdCwgZGljdCArIGRpY3RfbGVuICk7Ci0gICAgfQotCi0gICAgY2ZmX2luZGV4X2ZvcmdldF9lbGVtZW50KCBpZHgsICZkaWN0ICk7Ci0KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGlmIGl0IGlzIGEgQ0lEIGZvbnQsIHdlIHN0b3AgdGhlcmUgKi8KLSAgICBpZiAoIHRvcC0+Y2lkX3JlZ2lzdHJ5ICE9IDB4RkZGRlUgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogcGFyc2UgdGhlIHByaXZhdGUgZGljdGlvbmFyeSwgaWYgYW55ICovCi0gICAgaWYgKCB0b3AtPnByaXZhdGVfb2Zmc2V0ICYmIHRvcC0+cHJpdmF0ZV9zaXplICkKLSAgICB7Ci0gICAgICAvKiBzZXQgZGVmYXVsdHMgKi8KLSAgICAgIEZUX01FTV9aRVJPKCBwcml2LCBzaXplb2YgKCAqcHJpdiApICk7Ci0KLSAgICAgIHByaXYtPmJsdWVfc2hpZnQgICAgICAgPSA3OwotICAgICAgcHJpdi0+Ymx1ZV9mdXp6ICAgICAgICA9IDE7Ci0gICAgICBwcml2LT5sZW5JViAgICAgICAgICAgID0gLTE7Ci0gICAgICBwcml2LT5leHBhbnNpb25fZmFjdG9yID0gKEZUX0ZpeGVkKSggMC4wNiAqIDB4MTAwMDBMICk7Ci0gICAgICBwcml2LT5ibHVlX3NjYWxlICAgICAgID0gKEZUX0ZpeGVkKSggMC4wMzk2MjUgKiAweDEwMDAwTCAqIDEwMDAgKTsKLQotICAgICAgY2ZmX3BhcnNlcl9pbml0KCAmcGFyc2VyLCBDRkZfQ09ERV9QUklWQVRFLCBwcml2LCBsaWJyYXJ5ICk7Ci0KLSAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGJhc2Vfb2Zmc2V0ICsgZm9udC0+Zm9udF9kaWN0LnByaXZhdGVfb2Zmc2V0ICkgfHwKLSAgICAgICAgICAgRlRfRlJBTUVfRU5URVIoIGZvbnQtPmZvbnRfZGljdC5wcml2YXRlX3NpemUgKSAgICAgICAgICAgICAgICAgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIEZUX1RSQUNFNCgoICIgcHJpdmF0ZSBkaWN0aW9uYXJ5OlxuIiApKTsKLSAgICAgIGVycm9yID0gY2ZmX3BhcnNlcl9ydW4oICZwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSopc3RyZWFtLT5jdXJzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSopc3RyZWFtLT5saW1pdCApOwotICAgICAgRlRfRlJBTUVfRVhJVCgpOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgLyogZW5zdXJlIHRoYXQgYG51bV9ibHVlX3ZhbHVlcycgaXMgZXZlbiAqLwotICAgICAgcHJpdi0+bnVtX2JsdWVfdmFsdWVzICY9IH4xOwotICAgIH0KLQotICAgIC8qIHJlYWQgdGhlIGxvY2FsIHN1YnJzLCBpZiBhbnkgKi8KLSAgICBpZiAoIHByaXYtPmxvY2FsX3N1YnJzX29mZnNldCApCi0gICAgewotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggYmFzZV9vZmZzZXQgKyB0b3AtPnByaXZhdGVfb2Zmc2V0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPmxvY2FsX3N1YnJzX29mZnNldCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBlcnJvciA9IGNmZl9pbmRleF9pbml0KCAmZm9udC0+bG9jYWxfc3VicnNfaW5kZXgsIHN0cmVhbSwgMSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZXJyb3IgPSBjZmZfaW5kZXhfZ2V0X3BvaW50ZXJzKCAmZm9udC0+bG9jYWxfc3VicnNfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb250LT5sb2NhbF9zdWJycywgTlVMTCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGNmZl9zdWJmb250X2RvbmUoIEZUX01lbW9yeSAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgIENGRl9TdWJGb250ICBzdWJmb250ICkKLSAgewotICAgIGlmICggc3ViZm9udCApCi0gICAgewotICAgICAgY2ZmX2luZGV4X2RvbmUoICZzdWJmb250LT5sb2NhbF9zdWJyc19pbmRleCApOwotICAgICAgRlRfRlJFRSggc3ViZm9udC0+bG9jYWxfc3VicnMgKTsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjZmZfZm9udF9sb2FkKCBGVF9MaWJyYXJ5IGxpYnJhcnksCi0gICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgIENGRl9Gb250ICAgZm9udCwKLSAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICBwdXJlX2NmZiApCi0gIHsKLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIGNmZl9oZWFkZXJfZmllbGRzW10gPQotICAgIHsKLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgQ0ZGX0ZvbnRSZWMKLQotICAgICAgRlRfRlJBTUVfU1RBUlQoIDQgKSwKLSAgICAgICAgRlRfRlJBTUVfQllURSggdmVyc2lvbl9tYWpvciApLAotICAgICAgICBGVF9GUkFNRV9CWVRFKCB2ZXJzaW9uX21pbm9yICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUoIGhlYWRlcl9zaXplICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUoIGFic29sdXRlX29mZnNpemUgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgRlRfVUxvbmcgICAgICAgICBiYXNlX29mZnNldDsKLSAgICBDRkZfRm9udFJlY0RpY3QgIGRpY3Q7Ci0gICAgQ0ZGX0luZGV4UmVjICAgICBzdHJpbmdfaW5kZXg7Ci0gICAgRlRfVUludCAgICAgICAgICBzdWJmb250X2luZGV4OwotCi0KLSAgICBGVF9aRVJPKCBmb250ICk7Ci0gICAgRlRfWkVSTyggJnN0cmluZ19pbmRleCApOwotCi0gICAgZm9udC0+c3RyZWFtID0gc3RyZWFtOwotICAgIGZvbnQtPm1lbW9yeSA9IG1lbW9yeTsKLSAgICBkaWN0ICAgICAgICAgPSAmZm9udC0+dG9wX2ZvbnQuZm9udF9kaWN0OwotICAgIGJhc2Vfb2Zmc2V0ICA9IEZUX1NUUkVBTV9QT1MoKTsKLQotICAgIC8qIHJlYWQgQ0ZGIGZvbnQgaGVhZGVyICovCi0gICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIGNmZl9oZWFkZXJfZmllbGRzLCBmb250ICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogY2hlY2sgZm9ybWF0ICovCi0gICAgaWYgKCBmb250LT52ZXJzaW9uX21ham9yICAgIT0gMSB8fAotICAgICAgICAgZm9udC0+aGVhZGVyX3NpemUgICAgICA8IDQgfHwKLSAgICAgICAgIGZvbnQtPmFic29sdXRlX29mZnNpemUgPiA0ICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiICBub3QgYSBDRkYgZm9udCBoZWFkZXJcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogc2tpcCB0aGUgcmVzdCBvZiB0aGUgaGVhZGVyICovCi0gICAgaWYgKCBGVF9TVFJFQU1fU0tJUCggZm9udC0+aGVhZGVyX3NpemUgLSA0ICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogcmVhZCB0aGUgbmFtZSwgdG9wIGRpY3QsIHN0cmluZyBhbmQgZ2xvYmFsIHN1YnJzIGluZGV4ICovCi0gICAgaWYgKCBGVF9TRVRfRVJST1IoIGNmZl9pbmRleF9pbml0KCAmZm9udC0+bmFtZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgMCApICkgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgRlRfU0VUX0VSUk9SKCBjZmZfaW5kZXhfaW5pdCggJmZvbnQtPmZvbnRfZGljdF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgMCApICkgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgRlRfU0VUX0VSUk9SKCBjZmZfaW5kZXhfaW5pdCggJnN0cmluZ19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgMSApICkgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgRlRfU0VUX0VSUk9SKCBjZmZfaW5kZXhfaW5pdCggJmZvbnQtPmdsb2JhbF9zdWJyc19pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgMSApICkgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgRlRfU0VUX0VSUk9SKCBjZmZfaW5kZXhfZ2V0X3BvaW50ZXJzKCAmc3RyaW5nX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9udC0+c3RyaW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvbnQtPnN0cmluZ19wb29sICkgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBmb250LT5udW1fc3RyaW5ncyA9IHN0cmluZ19pbmRleC5jb3VudDsKLQotICAgIGlmICggcHVyZV9jZmYgKQotICAgIHsKLSAgICAgIC8qIHdlbGwsIHdlIGRvbid0IHJlYWxseSBmb3JnZXQgdGhlIGBkaXNhYmxlZCcgZm9udHMuLi4gKi8KLSAgICAgIHN1YmZvbnRfaW5kZXggPSAoRlRfVUludCkoIGZhY2VfaW5kZXggJiAweEZGRkYgKTsKLQotICAgICAgaWYgKCBmYWNlX2luZGV4ID4gMCAmJiBzdWJmb250X2luZGV4ID49IGZvbnQtPm5hbWVfaW5kZXguY291bnQgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJjZmZfZm9udF9sb2FkOiIKLSAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgc3ViZm9udCBpbmRleCBmb3IgcHVyZSBDRkYgZm9udCAoJWQpXG4iLAotICAgICAgICAgICAgICAgICAgIHN1YmZvbnRfaW5kZXggKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBmb250LT5udW1fZmFjZXMgPSBmb250LT5uYW1lX2luZGV4LmNvdW50OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc3ViZm9udF9pbmRleCA9IDA7Ci0KLSAgICAgIGlmICggZm9udC0+bmFtZV9pbmRleC5jb3VudCA+IDEgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJjZmZfZm9udF9sb2FkOiIKLSAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgQ0ZGIGZvbnQgd2l0aCBtdWx0aXBsZSBzdWJmb250c1xuIgotICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIKLSAgICAgICAgICAgICAgICAgICAiIGluIFNGTlQgd3JhcHBlclxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogaW4gY2FzZSBvZiBhIGZvbnQgZm9ybWF0IGNoZWNrLCBzaW1wbHkgZXhpdCBub3cgKi8KLSAgICBpZiAoIGZhY2VfaW5kZXggPCAwICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIG5vdywgcGFyc2UgdGhlIHRvcC1sZXZlbCBmb250IGRpY3Rpb25hcnkgKi8KLSAgICBGVF9UUkFDRTQoKCAicGFyc2luZyB0b3AtbGV2ZWxcbiIgKSk7Ci0gICAgZXJyb3IgPSBjZmZfc3ViZm9udF9sb2FkKCAmZm9udC0+dG9wX2ZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9udC0+Zm9udF9kaWN0X2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZm9udF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2Vfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggYmFzZV9vZmZzZXQgKyBkaWN0LT5jaGFyc3RyaW5nc19vZmZzZXQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBlcnJvciA9IGNmZl9pbmRleF9pbml0KCAmZm9udC0+Y2hhcnN0cmluZ3NfaW5kZXgsIHN0cmVhbSwgMCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogbm93LCBjaGVjayBmb3IgYSBDSUQgZm9udCAqLwotICAgIGlmICggZGljdC0+Y2lkX3JlZ2lzdHJ5ICE9IDB4RkZGRlUgKQotICAgIHsKLSAgICAgIENGRl9JbmRleFJlYyAgZmRfaW5kZXg7Ci0gICAgICBDRkZfU3ViRm9udCAgIHN1YiA9IE5VTEw7Ci0gICAgICBGVF9VSW50ICAgICAgIGlkeDsKLQotCi0gICAgICAvKiB0aGlzIGlzIGEgQ0lELWtleWVkIGZvbnQsIHdlIG11c3Qgbm93IGFsbG9jYXRlIGEgdGFibGUgb2YgKi8KLSAgICAgIC8qIHN1Yi1mb250cywgdGhlbiBsb2FkIGVhY2ggb2YgdGhlbSBzZXBhcmF0ZWx5ICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggYmFzZV9vZmZzZXQgKyBkaWN0LT5jaWRfZmRfYXJyYXlfb2Zmc2V0ICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGVycm9yID0gY2ZmX2luZGV4X2luaXQoICZmZF9pbmRleCwgc3RyZWFtLCAwICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBpZiAoIGZkX2luZGV4LmNvdW50ID4gQ0ZGX01BWF9DSURfRk9OVFMgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTAoKCAiY2ZmX2ZvbnRfbG9hZDogRkQgYXJyYXkgdG9vIGxhcmdlIGluIENJRCBmb250XG4iICkpOwotICAgICAgICBnb3RvIEZhaWxfQ0lEOwotICAgICAgfQotCi0gICAgICAvKiBhbGxvY2F0ZSAmIHJlYWQgZWFjaCBmb250IGRpY3QgaW5kZXBlbmRlbnRseSAqLwotICAgICAgZm9udC0+bnVtX3N1YmZvbnRzID0gZmRfaW5kZXguY291bnQ7Ci0gICAgICBpZiAoIEZUX05FV19BUlJBWSggc3ViLCBmZF9pbmRleC5jb3VudCApICkKLSAgICAgICAgZ290byBGYWlsX0NJRDsKLQotICAgICAgLyogc2V0IHVwIHBvaW50ZXIgdGFibGUgKi8KLSAgICAgIGZvciAoIGlkeCA9IDA7IGlkeCA8IGZkX2luZGV4LmNvdW50OyBpZHgrKyApCi0gICAgICAgIGZvbnQtPnN1YmZvbnRzW2lkeF0gPSBzdWIgKyBpZHg7Ci0KLSAgICAgIC8qIG5vdyBsb2FkIGVhY2ggc3ViZm9udCBpbmRlcGVuZGVudGx5ICovCi0gICAgICBmb3IgKCBpZHggPSAwOyBpZHggPCBmZF9pbmRleC5jb3VudDsgaWR4KysgKQotICAgICAgewotICAgICAgICBzdWIgPSBmb250LT5zdWJmb250c1tpZHhdOwotICAgICAgICBGVF9UUkFDRTQoKCAicGFyc2luZyBzdWJmb250ICV1XG4iLCBpZHggKSk7Ci0gICAgICAgIGVycm9yID0gY2ZmX3N1YmZvbnRfbG9hZCggc3ViLCAmZmRfaW5kZXgsIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIGJhc2Vfb2Zmc2V0LCBsaWJyYXJ5ICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRmFpbF9DSUQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIG5vdyBsb2FkIHRoZSBGRCBTZWxlY3QgYXJyYXkgKi8KLSAgICAgIGVycm9yID0gQ0ZGX0xvYWRfRkRfU2VsZWN0KCAmZm9udC0+ZmRfc2VsZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtPmNoYXJzdHJpbmdzX2luZGV4LmNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlX29mZnNldCArIGRpY3QtPmNpZF9mZF9zZWxlY3Rfb2Zmc2V0ICk7Ci0KLSAgICBGYWlsX0NJRDoKLSAgICAgIGNmZl9pbmRleF9kb25lKCAmZmRfaW5kZXggKTsKLQotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZm9udC0+bnVtX3N1YmZvbnRzID0gMDsKLQotICAgIC8qIHJlYWQgdGhlIGNoYXJzdHJpbmdzIGluZGV4IG5vdyAqLwotICAgIGlmICggZGljdC0+Y2hhcnN0cmluZ3Nfb2Zmc2V0ID09IDAgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggImNmZl9mb250X2xvYWQ6IG5vIGNoYXJzdHJpbmdzIG9mZnNldFxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBmb250LT5udW1fZ2x5cGhzID0gZm9udC0+Y2hhcnN0cmluZ3NfaW5kZXguY291bnQ7Ci0KLSAgICBlcnJvciA9IGNmZl9pbmRleF9nZXRfcG9pbnRlcnMoICZmb250LT5nbG9iYWxfc3VicnNfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZm9udC0+Z2xvYmFsX3N1YnJzLCBOVUxMICk7Ci0KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIHJlYWQgdGhlIENoYXJzZXQgYW5kIEVuY29kaW5nIHRhYmxlcyBpZiBhdmFpbGFibGUgKi8KLSAgICBpZiAoIGZvbnQtPm51bV9nbHlwaHMgPiAwICkKLSAgICB7Ci0gICAgICBGVF9Cb29sICBpbnZlcnQgPSBGVF9CT09MKCBkaWN0LT5jaWRfcmVnaXN0cnkgIT0gMHhGRkZGVSAmJiBwdXJlX2NmZiApOwotCi0KLSAgICAgIGVycm9yID0gY2ZmX2NoYXJzZXRfbG9hZCggJmZvbnQtPmNoYXJzZXQsIGZvbnQtPm51bV9nbHlwaHMsIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9vZmZzZXQsIGRpY3QtPmNoYXJzZXRfb2Zmc2V0LCBpbnZlcnQgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIENJRC1rZXllZCBDRkZzIGRvbid0IGhhdmUgYW4gZW5jb2RpbmcgKi8KLSAgICAgIGlmICggZGljdC0+Y2lkX3JlZ2lzdHJ5ID09IDB4RkZGRlUgKQotICAgICAgewotICAgICAgICBlcnJvciA9IGNmZl9lbmNvZGluZ19sb2FkKCAmZm9udC0+ZW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb250LT5jaGFyc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LT5udW1fZ2x5cGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2Vfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0LT5lbmNvZGluZ19vZmZzZXQgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotICAgIH0KLQotICAgIC8qIGdldCB0aGUgZm9udCBuYW1lICgvQ0lERm9udE5hbWUgZm9yIENJRC1rZXllZCBmb250cywgKi8KLSAgICAvKiAvRm9udE5hbWUgb3RoZXJ3aXNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZm9udC0+Zm9udF9uYW1lID0gY2ZmX2luZGV4X2dldF9uYW1lKCBmb250LCBzdWJmb250X2luZGV4ICk7Ci0KLSAgRXhpdDoKLSAgICBjZmZfaW5kZXhfZG9uZSggJnN0cmluZ19pbmRleCApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZmZfZm9udF9kb25lKCBDRkZfRm9udCAgZm9udCApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGZvbnQtPm1lbW9yeTsKLSAgICBGVF9VSW50ICAgIGlkeDsKLQotCi0gICAgY2ZmX2luZGV4X2RvbmUoICZmb250LT5nbG9iYWxfc3VicnNfaW5kZXggKTsKLSAgICBjZmZfaW5kZXhfZG9uZSggJmZvbnQtPmZvbnRfZGljdF9pbmRleCApOwotICAgIGNmZl9pbmRleF9kb25lKCAmZm9udC0+bmFtZV9pbmRleCApOwotICAgIGNmZl9pbmRleF9kb25lKCAmZm9udC0+Y2hhcnN0cmluZ3NfaW5kZXggKTsKLQotICAgIC8qIHJlbGVhc2UgZm9udCBkaWN0aW9uYXJpZXMsIGJ1dCBvbmx5IGlmIHdvcmtpbmcgd2l0aCAqLwotICAgIC8qIGEgQ0lEIGtleWVkIENGRiBmb250ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggZm9udC0+bnVtX3N1YmZvbnRzID4gMCApCi0gICAgewotICAgICAgZm9yICggaWR4ID0gMDsgaWR4IDwgZm9udC0+bnVtX3N1YmZvbnRzOyBpZHgrKyApCi0gICAgICAgIGNmZl9zdWJmb250X2RvbmUoIG1lbW9yeSwgZm9udC0+c3ViZm9udHNbaWR4XSApOwotCi0gICAgICAvKiB0aGUgc3ViZm9udHMgYXJyYXkgaGFzIGJlZW4gYWxsb2NhdGVkIGFzIGEgc2luZ2xlIGJsb2NrICovCi0gICAgICBGVF9GUkVFKCBmb250LT5zdWJmb250c1swXSApOwotICAgIH0KLQotICAgIGNmZl9lbmNvZGluZ19kb25lKCAmZm9udC0+ZW5jb2RpbmcgKTsKLSAgICBjZmZfY2hhcnNldF9kb25lKCAmZm9udC0+Y2hhcnNldCwgZm9udC0+c3RyZWFtICk7Ci0KLSAgICBjZmZfc3ViZm9udF9kb25lKCBtZW1vcnksICZmb250LT50b3BfZm9udCApOwotCi0gICAgQ0ZGX0RvbmVfRkRfU2VsZWN0KCAmZm9udC0+ZmRfc2VsZWN0LCBmb250LT5zdHJlYW0gKTsKLQotICAgIEZUX0ZSRUUoIGZvbnQtPmZvbnRfaW5mbyApOwotCi0gICAgRlRfRlJFRSggZm9udC0+Zm9udF9uYW1lICk7Ci0gICAgRlRfRlJFRSggZm9udC0+Z2xvYmFsX3N1YnJzICk7Ci0gICAgRlRfRlJFRSggZm9udC0+c3RyaW5ncyApOwotICAgIEZUX0ZSRUUoIGZvbnQtPnN0cmluZ19wb29sICk7Ci0KLSAgICBpZiAoIGZvbnQtPmNmMl9pbnN0YW5jZS5maW5hbGl6ZXIgKQotICAgIHsKLSAgICAgIGZvbnQtPmNmMl9pbnN0YW5jZS5maW5hbGl6ZXIoIGZvbnQtPmNmMl9pbnN0YW5jZS5kYXRhICk7Ci0gICAgICBGVF9GUkVFKCBmb250LT5jZjJfaW5zdGFuY2UuZGF0YSApOwotICAgIH0KLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZsb2FkLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZmxvYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU5ZTdiMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZmxvYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZmxvYWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBPcGVuVHlwZSAmIENGRiBkYXRhL3Byb2dyYW0gdGFibGVzIGxvYWRlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0NGRkxPQURfSF9fCi0jZGVmaW5lIF9fQ0ZGTE9BRF9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlICJjZmZ0eXBlcy5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0gIEZUX0xPQ0FMKCBGVF9VU2hvcnQgKQotICBjZmZfZ2V0X3N0YW5kYXJkX2VuY29kaW5nKCBGVF9VSW50ICBjaGFyY29kZSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX1N0cmluZyogKQotICBjZmZfaW5kZXhfZ2V0X3N0cmluZyggQ0ZGX0ZvbnQgIGZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZWxlbWVudCApOwotCi0gIEZUX0xPQ0FMKCBGVF9TdHJpbmcqICkKLSAgY2ZmX2luZGV4X2dldF9zaWRfc3RyaW5nKCBDRkZfRm9udCAgZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgc2lkICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBjZmZfaW5kZXhfYWNjZXNzX2VsZW1lbnQoIENGRl9JbmRleCAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIHBieXRlX2xlbiApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2ZmX2luZGV4X2ZvcmdldF9lbGVtZW50KCBDRkZfSW5kZXggIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIHBieXRlcyApOwotCi0gIEZUX0xPQ0FMKCBGVF9TdHJpbmcqICkKLSAgY2ZmX2luZGV4X2dldF9uYW1lKCBDRkZfRm9udCAgZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZWxlbWVudCApOwotCi0KLSAgRlRfTE9DQUwoIEZUX1VJbnQgKQotICBjZmZfY2hhcnNldF9jaWRfdG9fZ2luZGV4KCBDRkZfQ2hhcnNldCAgY2hhcnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIGNpZCApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX2ZvbnRfbG9hZCggRlRfTGlicmFyeSBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgICBDRkZfRm9udCAgIGZvbnQsCi0gICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgcHVyZV9jZmYgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmZl9mb250X2RvbmUoIENGRl9Gb250ICBmb250ICk7Ci0KLQotICBGVF9MT0NBTCggRlRfQnl0ZSApCi0gIGNmZl9mZF9zZWxlY3RfZ2V0KCBDRkZfRkRTZWxlY3QgIGZkc2VsZWN0LAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBnbHlwaF9pbmRleCApOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fQ0ZGTE9BRF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2Zmb2Jqcy5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZvYmpzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMGQ1YjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZvYmpzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZm9ianMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBPcGVuVHlwZSBvYmplY3RzIG1hbmFnZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9JRFNfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRk5UX0gKLSNpbmNsdWRlIEZUX0NGRl9EUklWRVJfSAotCi0jaW5jbHVkZSAiY2Zmb2Jqcy5oIgotI2luY2x1ZGUgImNmZmxvYWQuaCIKLSNpbmNsdWRlICJjZmZjbWFwLmgiCi0jaW5jbHVkZSAiY2ZmcGljLmgiCi0KLSNpbmNsdWRlICJjZmZlcnJzLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9jZmZvYmpzCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWkUgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIE5vdGUgdGhhdCB3ZSBzdG9yZSB0aGUgZ2xvYmFsIGhpbnRzIGluIHRoZSBzaXplJ3MgYGludGVybmFsJyByb290ICAgICovCi0gIC8qICBmaWVsZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBzdGF0aWMgUFNIX0dsb2JhbHNfRnVuY3MKLSAgY2ZmX3NpemVfZ2V0X2dsb2JhbHNfZnVuY3MoIENGRl9TaXplICBzaXplICkKLSAgewotICAgIENGRl9GYWNlICAgICAgICAgIGZhY2UgICAgID0gKENGRl9GYWNlKXNpemUtPnJvb3QuZmFjZTsKLSAgICBDRkZfRm9udCAgICAgICAgICBmb250ICAgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotICAgIFBTSGludGVyX1NlcnZpY2UgIHBzaGludGVyID0gZm9udC0+cHNoaW50ZXI7Ci0gICAgRlRfTW9kdWxlICAgICAgICAgbW9kdWxlOwotCi0KLSAgICBtb2R1bGUgPSBGVF9HZXRfTW9kdWxlKCBzaXplLT5yb290LmZhY2UtPmRyaXZlci0+cm9vdC5saWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwc2hpbnRlciIgKTsKLSAgICByZXR1cm4gKCBtb2R1bGUgJiYgcHNoaW50ZXIgJiYgcHNoaW50ZXItPmdldF9nbG9iYWxzX2Z1bmNzICkKLSAgICAgICAgICAgPyBwc2hpbnRlci0+Z2V0X2dsb2JhbHNfZnVuY3MoIG1vZHVsZSApCi0gICAgICAgICAgIDogMDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2ZmX3NpemVfZG9uZSggRlRfU2l6ZSAgY2Zmc2l6ZSApICAgICAgICAvKiBDRkZfU2l6ZSAqLwotICB7Ci0gICAgQ0ZGX1NpemUgICAgICBzaXplICAgICA9IChDRkZfU2l6ZSljZmZzaXplOwotICAgIENGRl9GYWNlICAgICAgZmFjZSAgICAgPSAoQ0ZGX0ZhY2Upc2l6ZS0+cm9vdC5mYWNlOwotICAgIENGRl9Gb250ICAgICAgZm9udCAgICAgPSAoQ0ZGX0ZvbnQpZmFjZS0+ZXh0cmEuZGF0YTsKLSAgICBDRkZfSW50ZXJuYWwgIGludGVybmFsID0gKENGRl9JbnRlcm5hbCljZmZzaXplLT5pbnRlcm5hbDsKLQotCi0gICAgaWYgKCBpbnRlcm5hbCApCi0gICAgewotICAgICAgUFNIX0dsb2JhbHNfRnVuY3MgIGZ1bmNzOwotCi0KLSAgICAgIGZ1bmNzID0gY2ZmX3NpemVfZ2V0X2dsb2JhbHNfZnVuY3MoIHNpemUgKTsKLSAgICAgIGlmICggZnVuY3MgKQotICAgICAgewotICAgICAgICBGVF9VSW50ICBpOwotCi0KLSAgICAgICAgZnVuY3MtPmRlc3Ryb3koIGludGVybmFsLT50b3Bmb250ICk7Ci0KLSAgICAgICAgZm9yICggaSA9IGZvbnQtPm51bV9zdWJmb250czsgaSA+IDA7IGktLSApCi0gICAgICAgICAgZnVuY3MtPmRlc3Ryb3koIGludGVybmFsLT5zdWJmb250c1tpIC0gMV0gKTsKLSAgICAgIH0KLQotICAgICAgLyogYGludGVybmFsJyBpcyBmcmVlZCBieSBkZXN0cm95X3NpemUgKGluIGZ0b2Jqcy5jKSAqLwotICAgIH0KLSAgfQotCi0KLSAgLyogQ0ZGIGFuZCBUeXBlIDEgcHJpdmF0ZSBkaWN0aW9uYXJpZXMgaGF2ZSBzbGlnaHRseSBkaWZmZXJlbnQgICAgICAqLwotICAvKiBzdHJ1Y3R1cmVzOyB3ZSBuZWVkIHRvIHN5bnRoZXNpemUgYSBUeXBlIDEgZGljdGlvbmFyeSBvbiB0aGUgZmx5ICovCi0KLSAgc3RhdGljIHZvaWQKLSAgY2ZmX21ha2VfcHJpdmF0ZV9kaWN0KCBDRkZfU3ViRm9udCAgc3ViZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQU19Qcml2YXRlICAgcHJpdiApCi0gIHsKLSAgICBDRkZfUHJpdmF0ZSAgY3ByaXYgPSAmc3ViZm9udC0+cHJpdmF0ZV9kaWN0OwotICAgIEZUX1VJbnQgICAgICBuLCBjb3VudDsKLQotCi0gICAgRlRfTUVNX1pFUk8oIHByaXYsIHNpemVvZiAoICpwcml2ICkgKTsKLQotICAgIGNvdW50ID0gcHJpdi0+bnVtX2JsdWVfdmFsdWVzID0gY3ByaXYtPm51bV9ibHVlX3ZhbHVlczsKLSAgICBmb3IgKCBuID0gMDsgbiA8IGNvdW50OyBuKysgKQotICAgICAgcHJpdi0+Ymx1ZV92YWx1ZXNbbl0gPSAoRlRfU2hvcnQpY3ByaXYtPmJsdWVfdmFsdWVzW25dOwotCi0gICAgY291bnQgPSBwcml2LT5udW1fb3RoZXJfYmx1ZXMgPSBjcHJpdi0+bnVtX290aGVyX2JsdWVzOwotICAgIGZvciAoIG4gPSAwOyBuIDwgY291bnQ7IG4rKyApCi0gICAgICBwcml2LT5vdGhlcl9ibHVlc1tuXSA9IChGVF9TaG9ydCljcHJpdi0+b3RoZXJfYmx1ZXNbbl07Ci0KLSAgICBjb3VudCA9IHByaXYtPm51bV9mYW1pbHlfYmx1ZXMgPSBjcHJpdi0+bnVtX2ZhbWlseV9ibHVlczsKLSAgICBmb3IgKCBuID0gMDsgbiA8IGNvdW50OyBuKysgKQotICAgICAgcHJpdi0+ZmFtaWx5X2JsdWVzW25dID0gKEZUX1Nob3J0KWNwcml2LT5mYW1pbHlfYmx1ZXNbbl07Ci0KLSAgICBjb3VudCA9IHByaXYtPm51bV9mYW1pbHlfb3RoZXJfYmx1ZXMgPSBjcHJpdi0+bnVtX2ZhbWlseV9vdGhlcl9ibHVlczsKLSAgICBmb3IgKCBuID0gMDsgbiA8IGNvdW50OyBuKysgKQotICAgICAgcHJpdi0+ZmFtaWx5X290aGVyX2JsdWVzW25dID0gKEZUX1Nob3J0KWNwcml2LT5mYW1pbHlfb3RoZXJfYmx1ZXNbbl07Ci0KLSAgICBwcml2LT5ibHVlX3NjYWxlID0gY3ByaXYtPmJsdWVfc2NhbGU7Ci0gICAgcHJpdi0+Ymx1ZV9zaGlmdCA9IChGVF9JbnQpY3ByaXYtPmJsdWVfc2hpZnQ7Ci0gICAgcHJpdi0+Ymx1ZV9mdXp6ICA9IChGVF9JbnQpY3ByaXYtPmJsdWVfZnV6ejsKLQotICAgIHByaXYtPnN0YW5kYXJkX3dpZHRoWzBdICA9IChGVF9VU2hvcnQpY3ByaXYtPnN0YW5kYXJkX3dpZHRoOwotICAgIHByaXYtPnN0YW5kYXJkX2hlaWdodFswXSA9IChGVF9VU2hvcnQpY3ByaXYtPnN0YW5kYXJkX2hlaWdodDsKLQotICAgIGNvdW50ID0gcHJpdi0+bnVtX3NuYXBfd2lkdGhzID0gY3ByaXYtPm51bV9zbmFwX3dpZHRoczsKLSAgICBmb3IgKCBuID0gMDsgbiA8IGNvdW50OyBuKysgKQotICAgICAgcHJpdi0+c25hcF93aWR0aHNbbl0gPSAoRlRfU2hvcnQpY3ByaXYtPnNuYXBfd2lkdGhzW25dOwotCi0gICAgY291bnQgPSBwcml2LT5udW1fc25hcF9oZWlnaHRzID0gY3ByaXYtPm51bV9zbmFwX2hlaWdodHM7Ci0gICAgZm9yICggbiA9IDA7IG4gPCBjb3VudDsgbisrICkKLSAgICAgIHByaXYtPnNuYXBfaGVpZ2h0c1tuXSA9IChGVF9TaG9ydCljcHJpdi0+c25hcF9oZWlnaHRzW25dOwotCi0gICAgcHJpdi0+Zm9yY2VfYm9sZCAgICAgPSBjcHJpdi0+Zm9yY2VfYm9sZDsKLSAgICBwcml2LT5sYW5ndWFnZV9ncm91cCA9IGNwcml2LT5sYW5ndWFnZV9ncm91cDsKLSAgICBwcml2LT5sZW5JViAgICAgICAgICA9IGNwcml2LT5sZW5JVjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNmZl9zaXplX2luaXQoIEZUX1NpemUgIGNmZnNpemUgKSAgICAgICAgIC8qIENGRl9TaXplICovCi0gIHsKLSAgICBDRkZfU2l6ZSAgICAgICAgICAgc2l6ZSAgPSAoQ0ZGX1NpemUpY2Zmc2l6ZTsKLSAgICBGVF9FcnJvciAgICAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgUFNIX0dsb2JhbHNfRnVuY3MgIGZ1bmNzID0gY2ZmX3NpemVfZ2V0X2dsb2JhbHNfZnVuY3MoIHNpemUgKTsKLQotCi0gICAgaWYgKCBmdW5jcyApCi0gICAgewotICAgICAgQ0ZGX0ZhY2UgICAgICBmYWNlICAgICA9IChDRkZfRmFjZSljZmZzaXplLT5mYWNlOwotICAgICAgQ0ZGX0ZvbnQgICAgICBmb250ICAgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotICAgICAgQ0ZGX0ludGVybmFsICBpbnRlcm5hbCA9IE5VTEw7Ci0KLSAgICAgIFBTX1ByaXZhdGVSZWMgIHByaXY7Ci0gICAgICBGVF9NZW1vcnkgICAgICBtZW1vcnkgPSBjZmZzaXplLT5mYWNlLT5tZW1vcnk7Ci0KLSAgICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgICAgaWYgKCBGVF9ORVcoIGludGVybmFsICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGNmZl9tYWtlX3ByaXZhdGVfZGljdCggJmZvbnQtPnRvcF9mb250LCAmcHJpdiApOwotICAgICAgZXJyb3IgPSBmdW5jcy0+Y3JlYXRlKCBjZmZzaXplLT5mYWNlLT5tZW1vcnksICZwcml2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJuYWwtPnRvcGZvbnQgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGZvciAoIGkgPSBmb250LT5udW1fc3ViZm9udHM7IGkgPiAwOyBpLS0gKQotICAgICAgewotICAgICAgICBDRkZfU3ViRm9udCAgc3ViID0gZm9udC0+c3ViZm9udHNbaSAtIDFdOwotCi0KLSAgICAgICAgY2ZmX21ha2VfcHJpdmF0ZV9kaWN0KCBzdWIsICZwcml2ICk7Ci0gICAgICAgIGVycm9yID0gZnVuY3MtPmNyZWF0ZSggY2Zmc2l6ZS0+ZmFjZS0+bWVtb3J5LCAmcHJpdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJuYWwtPnN1YmZvbnRzW2kgLSAxXSApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGNmZnNpemUtPmludGVybmFsID0gKEZUX1NpemVfSW50ZXJuYWwpKHZvaWQqKWludGVybmFsOwotICAgIH0KLQotICAgIHNpemUtPnN0cmlrZV9pbmRleCA9IDB4RkZGRkZGRkZVTDsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2ZmX3NpemVfc2VsZWN0KCBGVF9TaXplICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgc3RyaWtlX2luZGV4ICkKLSAgewotICAgIENGRl9TaXplICAgICAgICAgICBjZmZzaXplID0gKENGRl9TaXplKXNpemU7Ci0gICAgUFNIX0dsb2JhbHNfRnVuY3MgIGZ1bmNzOwotCi0KLSAgICBjZmZzaXplLT5zdHJpa2VfaW5kZXggPSBzdHJpa2VfaW5kZXg7Ci0KLSAgICBGVF9TZWxlY3RfTWV0cmljcyggc2l6ZS0+ZmFjZSwgc3RyaWtlX2luZGV4ICk7Ci0KLSAgICBmdW5jcyA9IGNmZl9zaXplX2dldF9nbG9iYWxzX2Z1bmNzKCBjZmZzaXplICk7Ci0KLSAgICBpZiAoIGZ1bmNzICkKLSAgICB7Ci0gICAgICBDRkZfRmFjZSAgICAgIGZhY2UgICAgID0gKENGRl9GYWNlKXNpemUtPmZhY2U7Ci0gICAgICBDRkZfRm9udCAgICAgIGZvbnQgICAgID0gKENGRl9Gb250KWZhY2UtPmV4dHJhLmRhdGE7Ci0gICAgICBDRkZfSW50ZXJuYWwgIGludGVybmFsID0gKENGRl9JbnRlcm5hbClzaXplLT5pbnRlcm5hbDsKLQotICAgICAgRlRfTG9uZyAgdG9wX3VwbSAgPSAoRlRfTG9uZylmb250LT50b3BfZm9udC5mb250X2RpY3QudW5pdHNfcGVyX2VtOwotICAgICAgRlRfVUludCAgaTsKLQotCi0gICAgICBmdW5jcy0+c2V0X3NjYWxlKCBpbnRlcm5hbC0+dG9wZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemUtPm1ldHJpY3MueF9zY2FsZSwgc2l6ZS0+bWV0cmljcy55X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCApOwotCi0gICAgICBmb3IgKCBpID0gZm9udC0+bnVtX3N1YmZvbnRzOyBpID4gMDsgaS0tICkKLSAgICAgIHsKLSAgICAgICAgQ0ZGX1N1YkZvbnQgIHN1YiAgICAgPSBmb250LT5zdWJmb250c1tpIC0gMV07Ci0gICAgICAgIEZUX0xvbmcgICAgICBzdWJfdXBtID0gKEZUX0xvbmcpc3ViLT5mb250X2RpY3QudW5pdHNfcGVyX2VtOwotICAgICAgICBGVF9Qb3MgICAgICAgeF9zY2FsZSwgeV9zY2FsZTsKLQotCi0gICAgICAgIGlmICggdG9wX3VwbSAhPSBzdWJfdXBtICkKLSAgICAgICAgewotICAgICAgICAgIHhfc2NhbGUgPSBGVF9NdWxEaXYoIHNpemUtPm1ldHJpY3MueF9zY2FsZSwgdG9wX3VwbSwgc3ViX3VwbSApOwotICAgICAgICAgIHlfc2NhbGUgPSBGVF9NdWxEaXYoIHNpemUtPm1ldHJpY3MueV9zY2FsZSwgdG9wX3VwbSwgc3ViX3VwbSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHhfc2NhbGUgPSBzaXplLT5tZXRyaWNzLnhfc2NhbGU7Ci0gICAgICAgICAgeV9zY2FsZSA9IHNpemUtPm1ldHJpY3MueV9zY2FsZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZ1bmNzLT5zZXRfc2NhbGUoIGludGVybmFsLT5zdWJmb250c1tpIC0gMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHhfc2NhbGUsIHlfc2NhbGUsIDAsIDAgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMgKi8KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjZmZfc2l6ZV9yZXF1ZXN0KCBGVF9TaXplICAgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgIEZUX1NpemVfUmVxdWVzdCAgcmVxICkKLSAgewotICAgIENGRl9TaXplICAgICAgICAgICBjZmZzaXplID0gKENGRl9TaXplKXNpemU7Ci0gICAgUFNIX0dsb2JhbHNfRnVuY3MgIGZ1bmNzOwotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKLQotICAgIGlmICggRlRfSEFTX0ZJWEVEX1NJWkVTKCBzaXplLT5mYWNlICkgKQotICAgIHsKLSAgICAgIENGRl9GYWNlICAgICAgY2ZmZmFjZSA9IChDRkZfRmFjZSlzaXplLT5mYWNlOwotICAgICAgU0ZOVF9TZXJ2aWNlICBzZm50ICAgID0gKFNGTlRfU2VydmljZSljZmZmYWNlLT5zZm50OwotICAgICAgRlRfVUxvbmcgICAgICBzdHJpa2VfaW5kZXg7Ci0KLQotICAgICAgaWYgKCBzZm50LT5zZXRfc2JpdF9zdHJpa2UoIGNmZmZhY2UsIHJlcSwgJnN0cmlrZV9pbmRleCApICkKLSAgICAgICAgY2Zmc2l6ZS0+c3RyaWtlX2luZGV4ID0gMHhGRkZGRkZGRlVMOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gY2ZmX3NpemVfc2VsZWN0KCBzaXplLCBzdHJpa2VfaW5kZXggKTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMgKi8KLQotICAgIEZUX1JlcXVlc3RfTWV0cmljcyggc2l6ZS0+ZmFjZSwgcmVxICk7Ci0KLSAgICBmdW5jcyA9IGNmZl9zaXplX2dldF9nbG9iYWxzX2Z1bmNzKCBjZmZzaXplICk7Ci0KLSAgICBpZiAoIGZ1bmNzICkKLSAgICB7Ci0gICAgICBDRkZfRmFjZSAgICAgIGNmZmZhY2UgID0gKENGRl9GYWNlKXNpemUtPmZhY2U7Ci0gICAgICBDRkZfRm9udCAgICAgIGZvbnQgICAgID0gKENGRl9Gb250KWNmZmZhY2UtPmV4dHJhLmRhdGE7Ci0gICAgICBDRkZfSW50ZXJuYWwgIGludGVybmFsID0gKENGRl9JbnRlcm5hbClzaXplLT5pbnRlcm5hbDsKLQotICAgICAgRlRfTG9uZyAgdG9wX3VwbSAgPSAoRlRfTG9uZylmb250LT50b3BfZm9udC5mb250X2RpY3QudW5pdHNfcGVyX2VtOwotICAgICAgRlRfVUludCAgaTsKLQotCi0gICAgICBmdW5jcy0+c2V0X3NjYWxlKCBpbnRlcm5hbC0+dG9wZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemUtPm1ldHJpY3MueF9zY2FsZSwgc2l6ZS0+bWV0cmljcy55X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCApOwotCi0gICAgICBmb3IgKCBpID0gZm9udC0+bnVtX3N1YmZvbnRzOyBpID4gMDsgaS0tICkKLSAgICAgIHsKLSAgICAgICAgQ0ZGX1N1YkZvbnQgIHN1YiAgICAgPSBmb250LT5zdWJmb250c1tpIC0gMV07Ci0gICAgICAgIEZUX0xvbmcgICAgICBzdWJfdXBtID0gKEZUX0xvbmcpc3ViLT5mb250X2RpY3QudW5pdHNfcGVyX2VtOwotICAgICAgICBGVF9Qb3MgICAgICAgeF9zY2FsZSwgeV9zY2FsZTsKLQotCi0gICAgICAgIGlmICggdG9wX3VwbSAhPSBzdWJfdXBtICkKLSAgICAgICAgewotICAgICAgICAgIHhfc2NhbGUgPSBGVF9NdWxEaXYoIHNpemUtPm1ldHJpY3MueF9zY2FsZSwgdG9wX3VwbSwgc3ViX3VwbSApOwotICAgICAgICAgIHlfc2NhbGUgPSBGVF9NdWxEaXYoIHNpemUtPm1ldHJpY3MueV9zY2FsZSwgdG9wX3VwbSwgc3ViX3VwbSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHhfc2NhbGUgPSBzaXplLT5tZXRyaWNzLnhfc2NhbGU7Ci0gICAgICAgICAgeV9zY2FsZSA9IHNpemUtPm1ldHJpY3MueV9zY2FsZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZ1bmNzLT5zZXRfc2NhbGUoIGludGVybmFsLT5zdWJmb250c1tpIC0gMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHhfc2NhbGUsIHlfc2NhbGUsIDAsIDAgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMT1QgIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2ZmX3Nsb3RfZG9uZSggRlRfR2x5cGhTbG90ICBzbG90ICkKLSAgewotICAgIHNsb3QtPmludGVybmFsLT5nbHlwaF9oaW50cyA9IE5VTEw7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjZmZfc2xvdF9pbml0KCBGVF9HbHlwaFNsb3QgIHNsb3QgKQotICB7Ci0gICAgQ0ZGX0ZhY2UgICAgICAgICAgZmFjZSAgICAgPSAoQ0ZGX0ZhY2Upc2xvdC0+ZmFjZTsKLSAgICBDRkZfRm9udCAgICAgICAgICBmb250ICAgICA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotICAgIFBTSGludGVyX1NlcnZpY2UgIHBzaGludGVyID0gZm9udC0+cHNoaW50ZXI7Ci0KLQotICAgIGlmICggcHNoaW50ZXIgKQotICAgIHsKLSAgICAgIEZUX01vZHVsZSAgbW9kdWxlOwotCi0KLSAgICAgIG1vZHVsZSA9IEZUX0dldF9Nb2R1bGUoIHNsb3QtPmZhY2UtPmRyaXZlci0+cm9vdC5saWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzaGludGVyIiApOwotICAgICAgaWYgKCBtb2R1bGUgKQotICAgICAgewotICAgICAgICBUMl9IaW50c19GdW5jcyAgZnVuY3M7Ci0KLQotICAgICAgICBmdW5jcyA9IHBzaGludGVyLT5nZXRfdDJfZnVuY3MoIG1vZHVsZSApOwotICAgICAgICBzbG90LT5pbnRlcm5hbC0+Z2x5cGhfaGludHMgPSAodm9pZCopZnVuY3M7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBQ0UgIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyBGVF9TdHJpbmcqCi0gIGNmZl9zdHJjcHkoIEZUX01lbW9yeSAgICAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgc291cmNlICkKLSAgewotICAgIEZUX0Vycm9yICAgIGVycm9yOwotICAgIEZUX1N0cmluZyogIHJlc3VsdDsKLQotCi0gICAgKHZvaWQpRlRfU1RSRFVQKCByZXN1bHQsIHNvdXJjZSApOwotCi0gICAgRlRfVU5VU0VEKCBlcnJvciApOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyogU3RyaXAgYWxsIHN1YnNldCBwcmVmaXhlcyBvZiB0aGUgZm9ybSBgQUJDREVGKycuICBVc3VhbGx5LCB0aGVyZSAqLwotICAvKiBpcyBvbmx5IG9uZSwgYnV0IGZvbnQgbmFtZXMgbGlrZSBgQVBDT09HK0pGQUJURCtGdXR1cmFCUS1Cb2xkJyAgICovCi0gIC8qIGhhdmUgYmVlbiBzZWVuIGluIHRoZSB3aWxkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBzdGF0aWMgdm9pZAotICByZW1vdmVfc3Vic2V0X3ByZWZpeCggRlRfU3RyaW5nKiAgbmFtZSApCi0gIHsKLSAgICBGVF9JbnQzMiAgaWR4ICAgICAgICAgICAgID0gMDsKLSAgICBGVF9JbnQzMiAgbGVuZ3RoICAgICAgICAgID0gKEZUX0ludDMyKXN0cmxlbiggbmFtZSApICsgMTsKLSAgICBGVF9Cb29sICAgY29udGludWVfc2VhcmNoID0gMTsKLQotCi0gICAgd2hpbGUgKCBjb250aW51ZV9zZWFyY2ggKQotICAgIHsKLSAgICAgIGlmICggbGVuZ3RoID49IDcgJiYgbmFtZVs2XSA9PSAnKycgKQotICAgICAgewotICAgICAgICBmb3IgKCBpZHggPSAwOyBpZHggPCA2OyBpZHgrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBBU0NJSSB1cHBlcmNhc2UgbGV0dGVycyAqLwotICAgICAgICAgIGlmICggISggJ0EnIDw9IG5hbWVbaWR4XSAmJiBuYW1lW2lkeF0gPD0gJ1onICkgKQotICAgICAgICAgICAgY29udGludWVfc2VhcmNoID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggY29udGludWVfc2VhcmNoICkKLSAgICAgICAgewotICAgICAgICAgIGZvciAoIGlkeCA9IDc7IGlkeCA8IGxlbmd0aDsgaWR4KysgKQotICAgICAgICAgICAgbmFtZVtpZHggLSA3XSA9IG5hbWVbaWR4XTsKLSAgICAgICAgICBsZW5ndGggLT0gNzsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBjb250aW51ZV9zZWFyY2ggPSAwOwotICAgIH0KLSAgfQotCi0KLSAgLyogUmVtb3ZlIHRoZSBzdHlsZSBwYXJ0IGZyb20gdGhlIGZhbWlseSBuYW1lIChpZiBwcmVzZW50KS4gKi8KLQotICBzdGF0aWMgdm9pZAotICByZW1vdmVfc3R5bGUoIEZUX1N0cmluZyogICAgICAgIGZhbWlseV9uYW1lLAotICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIHN0eWxlX25hbWUgKQotICB7Ci0gICAgRlRfSW50MzIgIGZhbWlseV9uYW1lX2xlbmd0aCwgc3R5bGVfbmFtZV9sZW5ndGg7Ci0KLQotICAgIGZhbWlseV9uYW1lX2xlbmd0aCA9IChGVF9JbnQzMilzdHJsZW4oIGZhbWlseV9uYW1lICk7Ci0gICAgc3R5bGVfbmFtZV9sZW5ndGggID0gKEZUX0ludDMyKXN0cmxlbiggc3R5bGVfbmFtZSApOwotCi0gICAgaWYgKCBmYW1pbHlfbmFtZV9sZW5ndGggPiBzdHlsZV9uYW1lX2xlbmd0aCApCi0gICAgewotICAgICAgRlRfSW50ICBpZHg7Ci0KLQotICAgICAgZm9yICggaWR4ID0gMTsgaWR4IDw9IHN0eWxlX25hbWVfbGVuZ3RoOyArK2lkeCApCi0gICAgICB7Ci0gICAgICAgIGlmICggZmFtaWx5X25hbWVbZmFtaWx5X25hbWVfbGVuZ3RoIC0gaWR4XSAhPQotICAgICAgICAgICAgIHN0eWxlX25hbWVbc3R5bGVfbmFtZV9sZW5ndGggLSBpZHhdICkKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgaWYgKCBpZHggPiBzdHlsZV9uYW1lX2xlbmd0aCApCi0gICAgICB7Ci0gICAgICAgIC8qIGZhbWlseV9uYW1lIGVuZHMgd2l0aCBzdHlsZV9uYW1lOyByZW1vdmUgaXQgKi8KLSAgICAgICAgaWR4ID0gZmFtaWx5X25hbWVfbGVuZ3RoIC0gc3R5bGVfbmFtZV9sZW5ndGggLSAxOwotCi0gICAgICAgIC8qIGFsc28gcmVtb3ZlIHNwZWNpYWwgY2hhcmFjdGVycyAgICAgKi8KLSAgICAgICAgLyogYmV0d2VlbiByZWFsIGZhbWlseSBuYW1lIGFuZCBzdHlsZSAqLwotICAgICAgICB3aGlsZSAoIGlkeCA+IDAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICggZmFtaWx5X25hbWVbaWR4XSA9PSAnLScgfHwKLSAgICAgICAgICAgICAgICAgIGZhbWlseV9uYW1lW2lkeF0gPT0gJyAnIHx8Ci0gICAgICAgICAgICAgICAgICBmYW1pbHlfbmFtZVtpZHhdID09ICdfJyB8fAotICAgICAgICAgICAgICAgICAgZmFtaWx5X25hbWVbaWR4XSA9PSAnKycgKSApCi0gICAgICAgICAgLS1pZHg7Ci0KLSAgICAgICAgaWYgKCBpZHggPiAwICkKLSAgICAgICAgICBmYW1pbHlfbmFtZVtpZHggKyAxXSA9ICdcMCc7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2ZmX2ZhY2VfaW5pdCggRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICBjZmZmYWNlLCAgICAgICAgLyogQ0ZGX0ZhY2UgKi8KLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICkKLSAgewotICAgIENGRl9GYWNlICAgICAgICAgICAgZmFjZSAgICAgICAgPSAoQ0ZGX0ZhY2UpY2ZmZmFjZTsKLSAgICBGVF9FcnJvciAgICAgICAgICAgIGVycm9yOwotICAgIFNGTlRfU2VydmljZSAgICAgICAgc2ZudDsKLSAgICBGVF9TZXJ2aWNlX1BzQ01hcHMgIHBzbmFtZXM7Ci0gICAgUFNIaW50ZXJfU2VydmljZSAgICBwc2hpbnRlcjsKLSAgICBGVF9Cb29sICAgICAgICAgICAgIHB1cmVfY2ZmICAgID0gMTsKLSAgICBGVF9Cb29sICAgICAgICAgICAgIHNmbnRfZm9ybWF0ID0gMDsKLSAgICBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnkgICAgID0gY2ZmZmFjZS0+ZHJpdmVyLT5yb290LmxpYnJhcnk7Ci0KLQotICAgIHNmbnQgPSAoU0ZOVF9TZXJ2aWNlKUZUX0dldF9Nb2R1bGVfSW50ZXJmYWNlKAotICAgICAgICAgICAgIGxpYnJhcnksICJzZm50IiApOwotICAgIGlmICggIXNmbnQgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggImNmZl9mYWNlX2luaXQ6IGNhbm5vdCBhY2Nlc3MgYHNmbnQnIG1vZHVsZVxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIE1pc3NpbmdfTW9kdWxlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgRlRfRkFDRV9GSU5EX0dMT0JBTF9TRVJWSUNFKCBmYWNlLCBwc25hbWVzLCBQT1NUU0NSSVBUX0NNQVBTICk7Ci0KLSAgICBwc2hpbnRlciA9IChQU0hpbnRlcl9TZXJ2aWNlKUZUX0dldF9Nb2R1bGVfSW50ZXJmYWNlKAotICAgICAgICAgICAgICAgICBsaWJyYXJ5LCAicHNoaW50ZXIiICk7Ci0KLSAgICBGVF9UUkFDRTIoKCAiQ0ZGIGRyaXZlclxuIiApKTsKLQotICAgIC8qIGNyZWF0ZSBpbnB1dCBzdHJlYW0gZnJvbSByZXNvdXJjZSAqLwotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIDAgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBjaGVjayB3aGV0aGVyIHdlIGhhdmUgYSB2YWxpZCBPcGVuVHlwZSBmaWxlICovCi0gICAgZXJyb3IgPSBzZm50LT5pbml0X2ZhY2UoIHN0cmVhbSwgZmFjZSwgZmFjZV9pbmRleCwgbnVtX3BhcmFtcywgcGFyYW1zICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGlmICggZmFjZS0+Zm9ybWF0X3RhZyAhPSBUVEFHX09UVE8gKSAgLyogYE9UVE8nOyBPcGVuVHlwZS9DRkYgZm9udCAqLwotICAgICAgewotICAgICAgICBGVF9UUkFDRTIoKCAiICBub3QgYW4gT3BlblR5cGUvQ0ZGIGZvbnRcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICAvKiBpZiB3ZSBhcmUgcGVyZm9ybWluZyBhIHNpbXBsZSBmb250IGZvcm1hdCBjaGVjaywgZXhpdCBpbW1lZGlhdGVseSAqLwotICAgICAgaWYgKCBmYWNlX2luZGV4IDwgMCApCi0gICAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0KLSAgICAgIHNmbnRfZm9ybWF0ID0gMTsKLQotICAgICAgLyogbm93LCB0aGUgZm9udCBjYW4gYmUgZWl0aGVyIGFuIE9wZW5UeXBlL0NGRiBmb250LCBvciBhbiBTVkcgQ0VGICovCi0gICAgICAvKiBmb250OyBpbiB0aGUgbGF0dGVyIGNhc2UgaXQgZG9lc24ndCBoYXZlIGEgYGhlYWQnIHRhYmxlICAgICAgICAgKi8KLSAgICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19oZWFkLCBzdHJlYW0sIDAgKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgIHsKLSAgICAgICAgcHVyZV9jZmYgPSAwOwotCi0gICAgICAgIC8qIGxvYWQgZm9udCBkaXJlY3RvcnkgKi8KLSAgICAgICAgZXJyb3IgPSBzZm50LT5sb2FkX2ZhY2UoIHN0cmVhbSwgZmFjZSwgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wYXJhbXMsIHBhcmFtcyApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGxvYWQgdGhlIGBjbWFwJyB0YWJsZSBleHBsaWNpdGx5ICovCi0gICAgICAgIGVycm9yID0gc2ZudC0+bG9hZF9jbWFwKCBmYWNlLCBzdHJlYW0gKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICAvKiBub3cgbG9hZCB0aGUgQ0ZGIHBhcnQgb2YgdGhlIGZpbGUgKi8KLSAgICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19DRkYsIHN0cmVhbSwgMCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJld2luZCB0byBzdGFydCBvZiBmaWxlOyB3ZSBhcmUgZ29pbmcgdG8gbG9hZCBhIHB1cmUtQ0ZGIGZvbnQgKi8KLSAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIDAgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIH0KLQotICAgIC8qIG5vdyBsb2FkIGFuZCBwYXJzZSB0aGUgQ0ZGIHRhYmxlIGluIHRoZSBmaWxlICovCi0gICAgewotICAgICAgQ0ZGX0ZvbnQgICAgICAgICBjZmYgPSBOVUxMOwotICAgICAgQ0ZGX0ZvbnRSZWNEaWN0ICBkaWN0OwotICAgICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnkgPSBjZmZmYWNlLT5tZW1vcnk7Ci0gICAgICBGVF9JbnQzMiAgICAgICAgIGZsYWdzOwotICAgICAgRlRfVUludCAgICAgICAgICBpOwotCi0KLSAgICAgIGlmICggRlRfTkVXKCBjZmYgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZmFjZS0+ZXh0cmEuZGF0YSA9IGNmZjsKLSAgICAgIGVycm9yID0gY2ZmX2ZvbnRfbG9hZCggbGlicmFyeSwgc3RyZWFtLCBmYWNlX2luZGV4LCBjZmYsIHB1cmVfY2ZmICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiBpZiB3ZSBhcmUgcGVyZm9ybWluZyBhIHNpbXBsZSBmb250IGZvcm1hdCBjaGVjaywgZXhpdCBpbW1lZGlhdGVseSAqLwotICAgICAgLyogKHRoaXMgaXMgaGVyZSBmb3IgcHVyZSBDRkYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggZmFjZV9pbmRleCA8IDAgKQotICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgICBjZmYtPnBzaGludGVyID0gcHNoaW50ZXI7Ci0gICAgICBjZmYtPnBzbmFtZXMgID0gcHNuYW1lczsKLQotICAgICAgY2ZmZmFjZS0+ZmFjZV9pbmRleCA9IGZhY2VfaW5kZXggJiAweEZGRkY7Ci0KLSAgICAgIC8qIENvbXBsZW1lbnQgdGhlIHJvb3QgZmxhZ3Mgd2l0aCBzb21lIGludGVyZXN0aW5nIGluZm9ybWF0aW9uLiAqLwotICAgICAgLyogTm90ZSB0aGF0IHRoaXMgaXMgb25seSBuZWNlc3NhcnkgZm9yIHB1cmUgQ0ZGIGFuZCBDRUYgZm9udHM7ICovCi0gICAgICAvKiBTRk5UIGJhc2VkIGZvbnRzIHVzZSB0aGUgYG5hbWUnIHRhYmxlIGluc3RlYWQuICAgICAgICAgICAgICAgKi8KLQotICAgICAgY2ZmZmFjZS0+bnVtX2dseXBocyA9IChGVF9Mb25nKWNmZi0+bnVtX2dseXBoczsKLQotICAgICAgZGljdCA9ICZjZmYtPnRvcF9mb250LmZvbnRfZGljdDsKLQotICAgICAgLyogd2UgbmVlZCB0aGUgYFBTTmFtZXMnIG1vZHVsZSBmb3IgQ0ZGIGFuZCBDRUYgZm9ybWF0cyAqLwotICAgICAgLyogd2hpY2ggYXJlbid0IENJRC1rZXllZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBkaWN0LT5jaWRfcmVnaXN0cnkgPT0gMHhGRkZGVSAmJiAhcHNuYW1lcyApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggImNmZl9mYWNlX2luaXQ6IgotICAgICAgICAgICAgICAgICAgICIgY2Fubm90IG9wZW4gQ0ZGICYgQ0VGIGZvbnRzXG4iCi0gICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIgotICAgICAgICAgICAgICAgICAgICIgd2l0aG91dCB0aGUgYFBTTmFtZXMnIG1vZHVsZVxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggTWlzc2luZ19Nb2R1bGUgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgICAgaWR4OwotICAgICAgICBGVF9TdHJpbmcqICBzOwotCi0KLSAgICAgICAgRlRfVFJBQ0U0KCggIlNJRHNcbiIgKSk7Ci0KLSAgICAgICAgLyogZHVtcCBzdHJpbmcgaW5kZXgsIGluY2x1ZGluZyBkZWZhdWx0IHN0cmluZ3MgZm9yIGNvbnZlbmllbmNlICovCi0gICAgICAgIGZvciAoIGlkeCA9IDA7IGlkeCA8IGNmZi0+bnVtX3N0cmluZ3MgKyAzOTA7IGlkeCsrICkKLSAgICAgICAgewotICAgICAgICAgIHMgPSBjZmZfaW5kZXhfZ2V0X3NpZF9zdHJpbmcoIGNmZiwgaWR4ICk7Ci0gICAgICAgICAgaWYgKCBzICkKLSAgICAgICAgICAgIEZUX1RSQUNFNCgoIiAgJTVkICVzXG4iLCBpZHgsIHMgKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0gICAgICBpZiAoICFkaWN0LT5oYXNfZm9udF9tYXRyaXggKQotICAgICAgICBkaWN0LT51bml0c19wZXJfZW0gPSBwdXJlX2NmZiA/IDEwMDAgOiBmYWNlLT5yb290LnVuaXRzX3Blcl9FTTsKLQotICAgICAgLyogTm9ybWFsaXplIHRoZSBmb250IG1hdHJpeCBzbyB0aGF0IGBtYXRyaXgtPnl5JyBpcyAxOyB0aGUgKi8KLSAgICAgIC8qIHNjYWxpbmcgaXMgZG9uZSB3aXRoIGB1bml0c19wZXJfZW0nIHRoZW4gKGF0IHRoaXMgcG9pbnQsICovCi0gICAgICAvKiBpdCBhbHJlYWR5IGNvbnRhaW5zIHRoZSBzY2FsaW5nIGZhY3RvciwgYnV0IHdpdGhvdXQgICAgICAqLwotICAgICAgLyogbm9ybWFsaXphdGlvbiBvZiB0aGUgbWF0cml4KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBOb3RlIHRoYXQgdGhlIG9mZnNldHMgbXVzdCBiZSBleHByZXNzZWQgaW4gaW50ZWdlciBmb250ICAqLwotICAgICAgLyogdW5pdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgewotICAgICAgICBGVF9NYXRyaXgqICBtYXRyaXggPSAmZGljdC0+Zm9udF9tYXRyaXg7Ci0gICAgICAgIEZUX1ZlY3RvciogIG9mZnNldCA9ICZkaWN0LT5mb250X29mZnNldDsKLSAgICAgICAgRlRfVUxvbmcqICAgdXBtICAgID0gJmRpY3QtPnVuaXRzX3Blcl9lbTsKLSAgICAgICAgRlRfRml4ZWQgICAgdGVtcCAgID0gRlRfQUJTKCBtYXRyaXgtPnl5ICk7Ci0KLQotICAgICAgICBpZiAoIHRlbXAgIT0gMHgxMDAwMEwgKQotICAgICAgICB7Ci0gICAgICAgICAgKnVwbSA9IChGVF9VTG9uZylGVF9EaXZGaXgoIChGVF9Mb25nKSp1cG0sIHRlbXAgKTsKLQotICAgICAgICAgIG1hdHJpeC0+eHggPSBGVF9EaXZGaXgoIG1hdHJpeC0+eHgsIHRlbXAgKTsKLSAgICAgICAgICBtYXRyaXgtPnl4ID0gRlRfRGl2Rml4KCBtYXRyaXgtPnl4LCB0ZW1wICk7Ci0gICAgICAgICAgbWF0cml4LT54eSA9IEZUX0RpdkZpeCggbWF0cml4LT54eSwgdGVtcCApOwotICAgICAgICAgIG1hdHJpeC0+eXkgPSBGVF9EaXZGaXgoIG1hdHJpeC0+eXksIHRlbXAgKTsKLSAgICAgICAgICBvZmZzZXQtPnggID0gRlRfRGl2Rml4KCBvZmZzZXQtPngsICB0ZW1wICk7Ci0gICAgICAgICAgb2Zmc2V0LT55ICA9IEZUX0RpdkZpeCggb2Zmc2V0LT55LCAgdGVtcCApOwotICAgICAgICB9Ci0KLSAgICAgICAgb2Zmc2V0LT54ID4+PSAxNjsKLSAgICAgICAgb2Zmc2V0LT55ID4+PSAxNjsKLSAgICAgIH0KLQotICAgICAgZm9yICggaSA9IGNmZi0+bnVtX3N1YmZvbnRzOyBpID4gMDsgaS0tICkKLSAgICAgIHsKLSAgICAgICAgQ0ZGX0ZvbnRSZWNEaWN0ICBzdWIgPSAmY2ZmLT5zdWJmb250c1tpIC0gMV0tPmZvbnRfZGljdDsKLSAgICAgICAgQ0ZGX0ZvbnRSZWNEaWN0ICB0b3AgPSAmY2ZmLT50b3BfZm9udC5mb250X2RpY3Q7Ci0KLSAgICAgICAgRlRfTWF0cml4KiAgbWF0cml4OwotICAgICAgICBGVF9WZWN0b3IqICBvZmZzZXQ7Ci0gICAgICAgIEZUX1VMb25nKiAgIHVwbTsKLSAgICAgICAgRlRfRml4ZWQgICAgdGVtcDsKLQotCi0gICAgICAgIGlmICggc3ViLT5oYXNfZm9udF9tYXRyaXggKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfTG9uZyAgc2NhbGluZzsKLQotCi0gICAgICAgICAgLyogaWYgd2UgaGF2ZSBhIHRvcC1sZXZlbCBtYXRyaXgsICovCi0gICAgICAgICAgLyogY29uY2F0ZW5hdGUgdGhlIHN1YmZvbnQgbWF0cml4ICovCi0KLSAgICAgICAgICBpZiAoIHRvcC0+aGFzX2ZvbnRfbWF0cml4ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIHRvcC0+dW5pdHNfcGVyX2VtID4gMSAmJiBzdWItPnVuaXRzX3Blcl9lbSA+IDEgKQotICAgICAgICAgICAgICBzY2FsaW5nID0gKEZUX0xvbmcpRlRfTUlOKCB0b3AtPnVuaXRzX3Blcl9lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViLT51bml0c19wZXJfZW0gKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgc2NhbGluZyA9IDE7Ci0KLSAgICAgICAgICAgIEZUX01hdHJpeF9NdWx0aXBseV9TY2FsZWQoICZ0b3AtPmZvbnRfbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1Yi0+Zm9udF9tYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsaW5nICk7Ci0gICAgICAgICAgICBGVF9WZWN0b3JfVHJhbnNmb3JtX1NjYWxlZCggJnN1Yi0+Zm9udF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRvcC0+Zm9udF9tYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGluZyApOwotCi0gICAgICAgICAgICBzdWItPnVuaXRzX3Blcl9lbSA9IChGVF9VTG9uZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxEaXYoIChGVF9Mb25nKXN1Yi0+dW5pdHNfcGVyX2VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpdG9wLT51bml0c19wZXJfZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsaW5nICk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHN1Yi0+Zm9udF9tYXRyaXggPSB0b3AtPmZvbnRfbWF0cml4OwotICAgICAgICAgIHN1Yi0+Zm9udF9vZmZzZXQgPSB0b3AtPmZvbnRfb2Zmc2V0OwotCi0gICAgICAgICAgc3ViLT51bml0c19wZXJfZW0gPSB0b3AtPnVuaXRzX3Blcl9lbTsKLSAgICAgICAgfQotCi0gICAgICAgIG1hdHJpeCA9ICZzdWItPmZvbnRfbWF0cml4OwotICAgICAgICBvZmZzZXQgPSAmc3ViLT5mb250X29mZnNldDsKLSAgICAgICAgdXBtICAgID0gJnN1Yi0+dW5pdHNfcGVyX2VtOwotICAgICAgICB0ZW1wICAgPSBGVF9BQlMoIG1hdHJpeC0+eXkgKTsKLQotICAgICAgICBpZiAoIHRlbXAgIT0gMHgxMDAwMEwgKQotICAgICAgICB7Ci0gICAgICAgICAgKnVwbSA9IChGVF9VTG9uZylGVF9EaXZGaXgoIChGVF9Mb25nKSp1cG0sIHRlbXAgKTsKLQotICAgICAgICAgIG1hdHJpeC0+eHggPSBGVF9EaXZGaXgoIG1hdHJpeC0+eHgsIHRlbXAgKTsKLSAgICAgICAgICBtYXRyaXgtPnl4ID0gRlRfRGl2Rml4KCBtYXRyaXgtPnl4LCB0ZW1wICk7Ci0gICAgICAgICAgbWF0cml4LT54eSA9IEZUX0RpdkZpeCggbWF0cml4LT54eSwgdGVtcCApOwotICAgICAgICAgIG1hdHJpeC0+eXkgPSBGVF9EaXZGaXgoIG1hdHJpeC0+eXksIHRlbXAgKTsKLSAgICAgICAgICBvZmZzZXQtPnggID0gRlRfRGl2Rml4KCBvZmZzZXQtPngsICB0ZW1wICk7Ci0gICAgICAgICAgb2Zmc2V0LT55ICA9IEZUX0RpdkZpeCggb2Zmc2V0LT55LCAgdGVtcCApOwotICAgICAgICB9Ci0KLSAgICAgICAgb2Zmc2V0LT54ID4+PSAxNjsKLSAgICAgICAgb2Zmc2V0LT55ID4+PSAxNjsKLSAgICAgIH0KLQotICAgICAgaWYgKCBwdXJlX2NmZiApCi0gICAgICB7Ci0gICAgICAgIGNoYXIqICBzdHlsZV9uYW1lID0gTlVMTDsKLQotCi0gICAgICAgIC8qIHNldCB1cCBudW1fZmFjZXMgKi8KLSAgICAgICAgY2ZmZmFjZS0+bnVtX2ZhY2VzID0gKEZUX0xvbmcpY2ZmLT5udW1fZmFjZXM7Ci0KLSAgICAgICAgLyogY29tcHV0ZSBudW1iZXIgb2YgZ2x5cGhzICovCi0gICAgICAgIGlmICggZGljdC0+Y2lkX3JlZ2lzdHJ5ICE9IDB4RkZGRlUgKQotICAgICAgICAgIGNmZmZhY2UtPm51bV9nbHlwaHMgPSAoRlRfTG9uZykoIGNmZi0+Y2hhcnNldC5tYXhfY2lkICsgMSApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgY2ZmZmFjZS0+bnVtX2dseXBocyA9IChGVF9Mb25nKWNmZi0+Y2hhcnN0cmluZ3NfaW5kZXguY291bnQ7Ci0KLSAgICAgICAgLyogc2V0IGdsb2JhbCBiYm94LCBhcyB3ZWxsIGFzIEVNIHNpemUgKi8KLSAgICAgICAgY2ZmZmFjZS0+YmJveC54TWluID0gICBkaWN0LT5mb250X2Jib3gueE1pbiAgICAgICAgICAgID4+IDE2OwotICAgICAgICBjZmZmYWNlLT5iYm94LnlNaW4gPSAgIGRpY3QtPmZvbnRfYmJveC55TWluICAgICAgICAgICAgPj4gMTY7Ci0gICAgICAgIC8qIG5vIGBVJyBzdWZmaXggaGVyZSB0byAweEZGRkYhICovCi0gICAgICAgIGNmZmZhY2UtPmJib3gueE1heCA9ICggZGljdC0+Zm9udF9iYm94LnhNYXggKyAweEZGRkYgKSA+PiAxNjsKLSAgICAgICAgY2ZmZmFjZS0+YmJveC55TWF4ID0gKCBkaWN0LT5mb250X2Jib3gueU1heCArIDB4RkZGRiApID4+IDE2OwotCi0gICAgICAgIGNmZmZhY2UtPnVuaXRzX3Blcl9FTSA9IChGVF9VU2hvcnQpKCBkaWN0LT51bml0c19wZXJfZW0gKTsKLQotICAgICAgICBjZmZmYWNlLT5hc2NlbmRlciAgPSAoRlRfU2hvcnQpKCBjZmZmYWNlLT5iYm94LnlNYXggKTsKLSAgICAgICAgY2ZmZmFjZS0+ZGVzY2VuZGVyID0gKEZUX1Nob3J0KSggY2ZmZmFjZS0+YmJveC55TWluICk7Ci0KLSAgICAgICAgY2ZmZmFjZS0+aGVpZ2h0ID0gKEZUX1Nob3J0KSggKCBjZmZmYWNlLT51bml0c19wZXJfRU0gKiAxMiApIC8gMTAgKTsKLSAgICAgICAgaWYgKCBjZmZmYWNlLT5oZWlnaHQgPCBjZmZmYWNlLT5hc2NlbmRlciAtIGNmZmZhY2UtPmRlc2NlbmRlciApCi0gICAgICAgICAgY2ZmZmFjZS0+aGVpZ2h0ID0gKEZUX1Nob3J0KSggY2ZmZmFjZS0+YXNjZW5kZXIgLSBjZmZmYWNlLT5kZXNjZW5kZXIgKTsKLQotICAgICAgICBjZmZmYWNlLT51bmRlcmxpbmVfcG9zaXRpb24gID0KLSAgICAgICAgICAoRlRfU2hvcnQpKCBkaWN0LT51bmRlcmxpbmVfcG9zaXRpb24gPj4gMTYgKTsKLSAgICAgICAgY2ZmZmFjZS0+dW5kZXJsaW5lX3RoaWNrbmVzcyA9Ci0gICAgICAgICAgKEZUX1Nob3J0KSggZGljdC0+dW5kZXJsaW5lX3RoaWNrbmVzcyA+PiAxNiApOwotCi0gICAgICAgIC8qIHJldHJpZXZlIGZvbnQgZmFtaWx5ICYgc3R5bGUgbmFtZSAqLwotICAgICAgICBjZmZmYWNlLT5mYW1pbHlfbmFtZSA9IGNmZl9pbmRleF9nZXRfbmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KSggZmFjZV9pbmRleCAmIDB4RkZGRiApICk7Ci0gICAgICAgIGlmICggY2ZmZmFjZS0+ZmFtaWx5X25hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgY2hhciogIGZ1bGwgICA9IGNmZl9pbmRleF9nZXRfc2lkX3N0cmluZyggY2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPmZ1bGxfbmFtZSApOwotICAgICAgICAgIGNoYXIqICBmdWxscCAgPSBmdWxsOwotICAgICAgICAgIGNoYXIqICBmYW1pbHkgPSBjZmZmYWNlLT5mYW1pbHlfbmFtZTsKLSAgICAgICAgICBjaGFyKiAgZmFtaWx5X25hbWUgPSBOVUxMOwotCi0KLSAgICAgICAgICByZW1vdmVfc3Vic2V0X3ByZWZpeCggY2ZmZmFjZS0+ZmFtaWx5X25hbWUgKTsKLQotICAgICAgICAgIGlmICggZGljdC0+ZmFtaWx5X25hbWUgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZhbWlseV9uYW1lID0gY2ZmX2luZGV4X2dldF9zaWRfc3RyaW5nKCBjZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdC0+ZmFtaWx5X25hbWUgKTsKLSAgICAgICAgICAgIGlmICggZmFtaWx5X25hbWUgKQotICAgICAgICAgICAgICBmYW1pbHkgPSBmYW1pbHlfbmFtZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBXZSB0cnkgdG8gZXh0cmFjdCB0aGUgc3R5bGUgbmFtZSBmcm9tIHRoZSBmdWxsIG5hbWUuICAgKi8KLSAgICAgICAgICAvKiBXZSBuZWVkIHRvIGlnbm9yZSBzcGFjZXMgYW5kIGRhc2hlcyBkdXJpbmcgdGhlIHNlYXJjaC4gKi8KLSAgICAgICAgICBpZiAoIGZ1bGwgJiYgZmFtaWx5ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAoICpmdWxscCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIHNraXAgY29tbW9uIGNoYXJhY3RlcnMgYXQgdGhlIHN0YXJ0IG9mIGJvdGggc3RyaW5ncyAqLwotICAgICAgICAgICAgICBpZiAoICpmdWxscCA9PSAqZmFtaWx5ICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhbWlseSsrOwotICAgICAgICAgICAgICAgIGZ1bGxwKys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAvKiBpZ25vcmUgc3BhY2VzIGFuZCBkYXNoZXMgaW4gZnVsbCBuYW1lIGR1cmluZyBjb21wYXJpc29uICovCi0gICAgICAgICAgICAgIGlmICggKmZ1bGxwID09ICcgJyB8fCAqZnVsbHAgPT0gJy0nICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZ1bGxwKys7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAvKiBpZ25vcmUgc3BhY2VzIGFuZCBkYXNoZXMgaW4gZmFtaWx5IG5hbWUgZHVyaW5nIGNvbXBhcmlzb24gKi8KLSAgICAgICAgICAgICAgaWYgKCAqZmFtaWx5ID09ICcgJyB8fCAqZmFtaWx5ID09ICctJyApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmYW1pbHkrKzsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgIGlmICggISpmYW1pbHkgJiYgKmZ1bGxwICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFRoZSBmdWxsIG5hbWUgYmVnaW5zIHdpdGggdGhlIHNhbWUgY2hhcmFjdGVycyBhcyB0aGUgICovCi0gICAgICAgICAgICAgICAgLyogZmFtaWx5IG5hbWUsIHdpdGggc3BhY2VzIGFuZCBkYXNoZXMgcmVtb3ZlZC4gIEluIHRoaXMgKi8KLSAgICAgICAgICAgICAgICAvKiBjYXNlLCB0aGUgcmVtYWluaW5nIHN0cmluZyBpbiBgZnVsbHAnIHdpbGwgYmUgdXNlZCBhcyAqLwotICAgICAgICAgICAgICAgIC8qIHRoZSBzdHlsZSBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgc3R5bGVfbmFtZSA9IGNmZl9zdHJjcHkoIG1lbW9yeSwgZnVsbHAgKTsKLQotICAgICAgICAgICAgICAgIC8qIHJlbW92ZSB0aGUgc3R5bGUgcGFydCBmcm9tIHRoZSBmYW1pbHkgbmFtZSAoaWYgcHJlc2VudCkgKi8KLSAgICAgICAgICAgICAgICByZW1vdmVfc3R5bGUoIGNmZmZhY2UtPmZhbWlseV9uYW1lLCBzdHlsZV9uYW1lICk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGNoYXIgICpjaWRfZm9udF9uYW1lID0KLSAgICAgICAgICAgICAgICAgICBjZmZfaW5kZXhfZ2V0X3NpZF9zdHJpbmcoIGNmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QtPmNpZF9mb250X25hbWUgKTsKLQotCi0gICAgICAgICAgLyogZG8gd2UgaGF2ZSBhIGAvRm9udE5hbWUnIGZvciBhIENJRC1rZXllZCBmb250PyAqLwotICAgICAgICAgIGlmICggY2lkX2ZvbnRfbmFtZSApCi0gICAgICAgICAgICBjZmZmYWNlLT5mYW1pbHlfbmFtZSA9IGNmZl9zdHJjcHkoIG1lbW9yeSwgY2lkX2ZvbnRfbmFtZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBzdHlsZV9uYW1lICkKLSAgICAgICAgICBjZmZmYWNlLT5zdHlsZV9uYW1lID0gc3R5bGVfbmFtZTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIC8qIGFzc3VtZSAiUmVndWxhciIgc3R5bGUgaWYgd2UgZG9uJ3Qga25vdyBiZXR0ZXIgKi8KLSAgICAgICAgICBjZmZmYWNlLT5zdHlsZV9uYW1lID0gY2ZmX3N0cmNweSggbWVtb3J5LCAoY2hhciAqKSJSZWd1bGFyIiApOwotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogQ29tcHV0ZSBmYWNlIGZsYWdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBmbGFncyA9IEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRSAgIHwgLyogc2NhbGFibGUgb3V0bGluZXMgKi8KLSAgICAgICAgICAgICAgICBGVF9GQUNFX0ZMQUdfSE9SSVpPTlRBTCB8IC8qIGhvcml6b250YWwgZGF0YSAgICovCi0gICAgICAgICAgICAgICAgRlRfRkFDRV9GTEFHX0hJTlRFUjsgICAgICAvKiBoYXMgbmF0aXZlIGhpbnRlciAqLwotCi0gICAgICAgIGlmICggc2ZudF9mb3JtYXQgKQotICAgICAgICAgIGZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19TRk5UOwotCi0gICAgICAgIC8qIGZpeGVkIHdpZHRoIGZvbnQ/ICovCi0gICAgICAgIGlmICggZGljdC0+aXNfZml4ZWRfcGl0Y2ggKQotICAgICAgICAgIGZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSDsKLQotICAvKiBYWFg6IFdFIERPIE5PVCBTVVBQT1JUIEtFUk5JTkcgTUVUUklDUyBJTiBUSEUgR1BPUyBUQUJMRSBGT1IgTk9XICovCi0jaWYgMAotICAgICAgICAvKiBrZXJuaW5nIGF2YWlsYWJsZT8gKi8KLSAgICAgICAgaWYgKCBmYWNlLT5rZXJuX3BhaXJzICkKLSAgICAgICAgICBmbGFncyB8PSBGVF9GQUNFX0ZMQUdfS0VSTklORzsKLSNlbmRpZgotCi0gICAgICAgIGNmZmZhY2UtPmZhY2VfZmxhZ3MgfD0gZmxhZ3M7Ci0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBDb21wdXRlIHN0eWxlIGZsYWdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGZsYWdzID0gMDsKLQotICAgICAgICBpZiAoIGRpY3QtPml0YWxpY19hbmdsZSApCi0gICAgICAgICAgZmxhZ3MgfD0gRlRfU1RZTEVfRkxBR19JVEFMSUM7Ci0KLSAgICAgICAgewotICAgICAgICAgIGNoYXIgICp3ZWlnaHQgPSBjZmZfaW5kZXhfZ2V0X3NpZF9zdHJpbmcoIGNmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0LT53ZWlnaHQgKTsKLQotCi0gICAgICAgICAgaWYgKCB3ZWlnaHQgKQotICAgICAgICAgICAgaWYgKCAhZnRfc3RyY21wKCB3ZWlnaHQsICJCb2xkIiAgKSB8fAotICAgICAgICAgICAgICAgICAhZnRfc3RyY21wKCB3ZWlnaHQsICJCbGFjayIgKSApCi0gICAgICAgICAgICAgIGZsYWdzIHw9IEZUX1NUWUxFX0ZMQUdfQk9MRDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGRvdWJsZSBjaGVjayAqLwotICAgICAgICBpZiAoICEoZmxhZ3MgJiBGVF9TVFlMRV9GTEFHX0JPTEQpICYmIGNmZmZhY2UtPnN0eWxlX25hbWUgKQotICAgICAgICAgIGlmICggIWZ0X3N0cm5jbXAoIGNmZmZhY2UtPnN0eWxlX25hbWUsICJCb2xkIiwgNCApICB8fAotICAgICAgICAgICAgICAgIWZ0X3N0cm5jbXAoIGNmZmZhY2UtPnN0eWxlX25hbWUsICJCbGFjayIsIDUgKSApCi0gICAgICAgICAgICBmbGFncyB8PSBGVF9TVFlMRV9GTEFHX0JPTEQ7Ci0KLSAgICAgICAgY2ZmZmFjZS0+c3R5bGVfZmxhZ3MgPSBmbGFnczsKLSAgICAgIH0KLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fTk9fR0xZUEhfTkFNRVMKLSAgICAgIC8qIENJRC1rZXllZCBDRkYgZm9udHMgZG9uJ3QgaGF2ZSBnbHlwaCBuYW1lcyAtLSB0aGUgU0ZOVCBsb2FkZXIgKi8KLSAgICAgIC8qIGhhcyB1bnNldCB0aGlzIGZsYWcgYmVjYXVzZSBvZiB0aGUgMy4wIGBwb3N0JyB0YWJsZS4gICAgICAgICAgKi8KLSAgICAgIGlmICggZGljdC0+Y2lkX3JlZ2lzdHJ5ID09IDB4RkZGRlUgKQotICAgICAgICBjZmZmYWNlLT5mYWNlX2ZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19HTFlQSF9OQU1FUzsKLSNlbmRpZgotCi0gICAgICBpZiAoIGRpY3QtPmNpZF9yZWdpc3RyeSAhPSAweEZGRkZVICYmIHB1cmVfY2ZmICkKLSAgICAgICAgY2ZmZmFjZS0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfQ0lEX0tFWUVEOwotCi0KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBDb21wdXRlIGNoYXIgbWFwcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAvKiBUcnkgdG8gc3ludGhlc2l6ZSBhIFVuaWNvZGUgY2hhcm1hcCBpZiB0aGVyZSBpcyBub25lIGF2YWlsYWJsZSAqLwotICAgICAgLyogYWxyZWFkeS4gIElmIGFuIE9wZW5UeXBlIGZvbnQgY29udGFpbnMgYSBVbmljb2RlICJjbWFwIiwgd2UgICAgKi8KLSAgICAgIC8qIHdpbGwgdXNlIGl0LCB3aGF0ZXZlciBiZSBpbiB0aGUgQ0ZGIHBhcnQgb2YgdGhlIGZpbGUuICAgICAgICAgICovCi0gICAgICB7Ci0gICAgICAgIEZUX0NoYXJNYXBSZWMgIGNtYXByZWM7Ci0gICAgICAgIEZUX0NoYXJNYXAgICAgIGNtYXA7Ci0gICAgICAgIEZUX1VJbnQgICAgICAgIG5uOwotICAgICAgICBDRkZfRW5jb2RpbmcgICBlbmNvZGluZyA9ICZjZmYtPmVuY29kaW5nOwotCi0KLSAgICAgICAgZm9yICggbm4gPSAwOyBubiA8IChGVF9VSW50KWNmZmZhY2UtPm51bV9jaGFybWFwczsgbm4rKyApCi0gICAgICAgIHsKLSAgICAgICAgICBjbWFwID0gY2ZmZmFjZS0+Y2hhcm1hcHNbbm5dOwotCi0gICAgICAgICAgLyogV2luZG93cyBVbmljb2RlPyAqLwotICAgICAgICAgIGlmICggY21hcC0+cGxhdGZvcm1faWQgPT0gVFRfUExBVEZPUk1fTUlDUk9TT0ZUICYmCi0gICAgICAgICAgICAgICBjbWFwLT5lbmNvZGluZ19pZCA9PSBUVF9NU19JRF9VTklDT0RFX0NTICAgKQotICAgICAgICAgICAgZ290byBTa2lwX1VuaWNvZGU7Ci0KLSAgICAgICAgICAvKiBBcHBsZSBVbmljb2RlIHBsYXRmb3JtIGlkPyAqLwotICAgICAgICAgIGlmICggY21hcC0+cGxhdGZvcm1faWQgPT0gVFRfUExBVEZPUk1fQVBQTEVfVU5JQ09ERSApCi0gICAgICAgICAgICBnb3RvIFNraXBfVW5pY29kZTsgLyogQXBwbGUgVW5pY29kZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyogc2luY2UgQ0lELWtleWVkIGZvbnRzIGRvbid0IGNvbnRhaW4gZ2x5cGggbmFtZXMsIHdlIGNhbid0ICovCi0gICAgICAgIC8qIGNvbnN0cnVjdCBhIGNtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIHB1cmVfY2ZmICYmIGNmZi0+dG9wX2ZvbnQuZm9udF9kaWN0LmNpZF9yZWdpc3RyeSAhPSAweEZGRkZVICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgLyogd2UgZGlkbid0IGZpbmQgYSBVbmljb2RlIGNoYXJtYXAgLS0gc3ludGhlc2l6ZSBvbmUgKi8KLSAgICAgICAgY21hcHJlYy5mYWNlICAgICAgICA9IGNmZmZhY2U7Ci0gICAgICAgIGNtYXByZWMucGxhdGZvcm1faWQgPSBUVF9QTEFURk9STV9NSUNST1NPRlQ7Ci0gICAgICAgIGNtYXByZWMuZW5jb2RpbmdfaWQgPSBUVF9NU19JRF9VTklDT0RFX0NTOwotICAgICAgICBjbWFwcmVjLmVuY29kaW5nICAgID0gRlRfRU5DT0RJTkdfVU5JQ09ERTsKLQotICAgICAgICBubiA9IChGVF9VSW50KWNmZmZhY2UtPm51bV9jaGFybWFwczsKLQotICAgICAgICBlcnJvciA9IEZUX0NNYXBfTmV3KCAmQ0ZGX0NNQVBfVU5JQ09ERV9DTEFTU19SRUNfR0VULCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY21hcHJlYywgTlVMTCApOwotICAgICAgICBpZiAoIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIEZUX0VSUl9ORVEoIGVycm9yLCBOb19Vbmljb2RlX0dseXBoX05hbWUgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotICAgICAgICAvKiBpZiBubyBVbmljb2RlIGNoYXJtYXAgd2FzIHByZXZpb3VzbHkgc2VsZWN0ZWQsIHNlbGVjdCB0aGlzIG9uZSAqLwotICAgICAgICBpZiAoIGNmZmZhY2UtPmNoYXJtYXAgPT0gTlVMTCAmJiBubiAhPSAoRlRfVUludCljZmZmYWNlLT5udW1fY2hhcm1hcHMgKQotICAgICAgICAgIGNmZmZhY2UtPmNoYXJtYXAgPSBjZmZmYWNlLT5jaGFybWFwc1tubl07Ci0KLSAgICAgIFNraXBfVW5pY29kZToKLSAgICAgICAgaWYgKCBlbmNvZGluZy0+Y291bnQgPiAwICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0NNYXBfQ2xhc3MgIGNsYXp6OwotCi0KLSAgICAgICAgICBjbWFwcmVjLmZhY2UgICAgICAgID0gY2ZmZmFjZTsKLSAgICAgICAgICBjbWFwcmVjLnBsYXRmb3JtX2lkID0gVFRfUExBVEZPUk1fQURPQkU7ICAvKiBBZG9iZSBwbGF0Zm9ybSBpZCAqLwotCi0gICAgICAgICAgaWYgKCBlbmNvZGluZy0+b2Zmc2V0ID09IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNtYXByZWMuZW5jb2RpbmdfaWQgPSBUVF9BRE9CRV9JRF9TVEFOREFSRDsKLSAgICAgICAgICAgIGNtYXByZWMuZW5jb2RpbmcgICAgPSBGVF9FTkNPRElOR19BRE9CRV9TVEFOREFSRDsKLSAgICAgICAgICAgIGNsYXp6ICAgICAgICAgICAgICAgPSAmQ0ZGX0NNQVBfRU5DT0RJTkdfQ0xBU1NfUkVDX0dFVDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoIGVuY29kaW5nLT5vZmZzZXQgPT0gMSApCi0gICAgICAgICAgewotICAgICAgICAgICAgY21hcHJlYy5lbmNvZGluZ19pZCA9IFRUX0FET0JFX0lEX0VYUEVSVDsKLSAgICAgICAgICAgIGNtYXByZWMuZW5jb2RpbmcgICAgPSBGVF9FTkNPRElOR19BRE9CRV9FWFBFUlQ7Ci0gICAgICAgICAgICBjbGF6eiAgICAgICAgICAgICAgID0gJkNGRl9DTUFQX0VOQ09ESU5HX0NMQVNTX1JFQ19HRVQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjbWFwcmVjLmVuY29kaW5nX2lkID0gVFRfQURPQkVfSURfQ1VTVE9NOwotICAgICAgICAgICAgY21hcHJlYy5lbmNvZGluZyAgICA9IEZUX0VOQ09ESU5HX0FET0JFX0NVU1RPTTsKLSAgICAgICAgICAgIGNsYXp6ICAgICAgICAgICAgICAgPSAmQ0ZGX0NNQVBfRU5DT0RJTkdfQ0xBU1NfUkVDX0dFVDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBlcnJvciA9IEZUX0NNYXBfTmV3KCBjbGF6eiwgTlVMTCwgJmNtYXByZWMsIE5VTEwgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2ZmX2ZhY2VfZG9uZSggRlRfRmFjZSAgY2ZmZmFjZSApICAgICAgICAgLyogQ0ZGX0ZhY2UgKi8KLSAgewotICAgIENGRl9GYWNlICAgICAgZmFjZSA9IChDRkZfRmFjZSljZmZmYWNlOwotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5OwotICAgIFNGTlRfU2VydmljZSAgc2ZudDsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm47Ci0KLSAgICBtZW1vcnkgPSBjZmZmYWNlLT5tZW1vcnk7Ci0gICAgc2ZudCAgID0gKFNGTlRfU2VydmljZSlmYWNlLT5zZm50OwotCi0gICAgaWYgKCBzZm50ICkKLSAgICAgIHNmbnQtPmRvbmVfZmFjZSggZmFjZSApOwotCi0gICAgewotICAgICAgQ0ZGX0ZvbnQgIGNmZiA9IChDRkZfRm9udClmYWNlLT5leHRyYS5kYXRhOwotCi0KLSAgICAgIGlmICggY2ZmICkKLSAgICAgIHsKLSAgICAgICAgY2ZmX2ZvbnRfZG9uZSggY2ZmICk7Ci0gICAgICAgIEZUX0ZSRUUoIGZhY2UtPmV4dHJhLmRhdGEgKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjZmZfZHJpdmVyX2luaXQoIEZUX01vZHVsZSAgbW9kdWxlICkgICAgICAgIC8qIENGRl9Ecml2ZXIgKi8KLSAgewotICAgIENGRl9Ecml2ZXIgIGRyaXZlciA9IChDRkZfRHJpdmVyKW1vZHVsZTsKLQotCi0gICAgLyogc2V0IGRlZmF1bHQgcHJvcGVydHkgdmFsdWVzLCBjZi4gYGZ0Y2ZmZHJ2LmgnICovCi0jaWZkZWYgQ0ZGX0NPTkZJR19PUFRJT05fT0xEX0VOR0lORQotICAgIGRyaXZlci0+aGludGluZ19lbmdpbmUgPSBGVF9DRkZfSElOVElOR19GUkVFVFlQRTsKLSNlbHNlCi0gICAgZHJpdmVyLT5oaW50aW5nX2VuZ2luZSA9IEZUX0NGRl9ISU5USU5HX0FET0JFOwotI2VuZGlmCi0KLSAgICBkcml2ZXItPm5vX3N0ZW1fZGFya2VuaW5nID0gRkFMU0U7Ci0KLSAgICBkcml2ZXItPmRhcmtlbl9wYXJhbXNbMF0gPSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1gxOwotICAgIGRyaXZlci0+ZGFya2VuX3BhcmFtc1sxXSA9IENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTE7Ci0gICAgZHJpdmVyLT5kYXJrZW5fcGFyYW1zWzJdID0gQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9YMjsKLSAgICBkcml2ZXItPmRhcmtlbl9wYXJhbXNbM10gPSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1kyOwotICAgIGRyaXZlci0+ZGFya2VuX3BhcmFtc1s0XSA9IENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWDM7Ci0gICAgZHJpdmVyLT5kYXJrZW5fcGFyYW1zWzVdID0gQ0ZGX0NPTkZJR19PUFRJT05fREFSS0VOSU5HX1BBUkFNRVRFUl9ZMzsKLSAgICBkcml2ZXItPmRhcmtlbl9wYXJhbXNbNl0gPSBDRkZfQ09ORklHX09QVElPTl9EQVJLRU5JTkdfUEFSQU1FVEVSX1g0OwotICAgIGRyaXZlci0+ZGFya2VuX3BhcmFtc1s3XSA9IENGRl9DT05GSUdfT1BUSU9OX0RBUktFTklOR19QQVJBTUVURVJfWTQ7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjZmZfZHJpdmVyX2RvbmUoIEZUX01vZHVsZSAgbW9kdWxlICkgICAgICAgIC8qIENGRl9Ecml2ZXIgKi8KLSAgewotICAgIEZUX1VOVVNFRCggbW9kdWxlICk7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2Zmb2Jqcy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZvYmpzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYzk1MzEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZvYmpzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2Zmb2Jqcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9wZW5UeXBlIG9iamVjdHMgbWFuYWdlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fQ0ZGT0JKU19IX18KLSNkZWZpbmUgX19DRkZPQkpTX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSAiY2ZmdHlwZXMuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RSVUVUWVBFX1RZUEVTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0hJTlRTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENGRl9Ecml2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGFuIE9wZW5UeXBlIGRyaXZlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgQ0ZGX0RyaXZlclJlY18qICBDRkZfRHJpdmVyOwotCi0gIHR5cGVkZWYgVFRfRmFjZSAgQ0ZGX0ZhY2U7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDRkZfU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhbiBPcGVuVHlwZSBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfU2l6ZVJlY18KLSAgewotICAgIEZUX1NpemVSZWMgIHJvb3Q7Ci0gICAgRlRfVUxvbmcgICAgc3RyaWtlX2luZGV4OyAgICAvKiAweEZGRkZGRkZGIHRvIGluZGljYXRlIGludmFsaWQgKi8KLQotICB9IENGRl9TaXplUmVjLCAqQ0ZGX1NpemU7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDRkZfR2x5cGhTbG90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhbiBPcGVuVHlwZSBnbHlwaCBzbG90IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfR2x5cGhTbG90UmVjXwotICB7Ci0gICAgRlRfR2x5cGhTbG90UmVjICByb290OwotCi0gICAgRlRfQm9vbCAgICAgICAgICBoaW50OwotICAgIEZUX0Jvb2wgICAgICAgICAgc2NhbGVkOwotCi0gICAgRlRfRml4ZWQgICAgICAgICB4X3NjYWxlOwotICAgIEZUX0ZpeGVkICAgICAgICAgeV9zY2FsZTsKLQotICB9IENGRl9HbHlwaFNsb3RSZWMsICpDRkZfR2x5cGhTbG90OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0ZGX0ludGVybmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGludGVyZmFjZSB0byB0aGUgYGludGVybmFsJyBmaWVsZCBvZiBgRlRfU2l6ZScuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX0ludGVybmFsUmVjXwotICB7Ci0gICAgUFNIX0dsb2JhbHMgIHRvcGZvbnQ7Ci0gICAgUFNIX0dsb2JhbHMgIHN1YmZvbnRzW0NGRl9NQVhfQ0lEX0ZPTlRTXTsKLQotICB9IENGRl9JbnRlcm5hbFJlYywgKkNGRl9JbnRlcm5hbDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3ViZ2x5cGggdHJhbnNmb3JtYXRpb24gcmVjb3JkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX1RyYW5zZm9ybV8KLSAgewotICAgIEZUX0ZpeGVkICAgIHh4LCB4eTsgICAgIC8qIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBjb2VmZmljaWVudHMgKi8KLSAgICBGVF9GaXhlZCAgICB5eCwgeXk7Ci0gICAgRlRfRjI2RG90NiAgb3gsIG95OyAgICAgLyogb2Zmc2V0cyAgICAgICAgKi8KLQotICB9IENGRl9UcmFuc2Zvcm07Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ0ZGIGRyaXZlciBjbGFzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfRHJpdmVyUmVjXwotICB7Ci0gICAgRlRfRHJpdmVyUmVjICByb290OwotCi0gICAgRlRfVUludCAgaGludGluZ19lbmdpbmU7Ci0gICAgRlRfQm9vbCAgbm9fc3RlbV9kYXJrZW5pbmc7Ci0KLSAgICBGVF9JbnQgIGRhcmtlbl9wYXJhbXNbOF07Ci0KLSAgfSBDRkZfRHJpdmVyUmVjOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX3NpemVfaW5pdCggRlRfU2l6ZSAgc2l6ZSApOyAgICAgICAgICAgLyogQ0ZGX1NpemUgKi8KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNmZl9zaXplX2RvbmUoIEZUX1NpemUgIHNpemUgKTsgICAgICAgICAgIC8qIENGRl9TaXplICovCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX3NpemVfcmVxdWVzdCggRlRfU2l6ZSAgICAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSApOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX3NpemVfc2VsZWN0KCBGVF9TaXplICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgc3RyaWtlX2luZGV4ICk7Ci0KLSNlbmRpZgotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2ZmX3Nsb3RfZG9uZSggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX3Nsb3RfaW5pdCggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZhY2UgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX2ZhY2VfaW5pdCggRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICBmYWNlLCAgICAgICAgICAgLyogQ0ZGX0ZhY2UgKi8KLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjZmZfZmFjZV9kb25lKCBGVF9GYWNlICBmYWNlICk7ICAgICAgICAgICAgICAgLyogQ0ZGX0ZhY2UgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRHJpdmVyIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBjZmZfZHJpdmVyX2luaXQoIEZUX01vZHVsZSAgbW9kdWxlICk7ICAgICAgICAgLyogQ0ZGX0RyaXZlciAqLwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2ZmX2RyaXZlcl9kb25lKCBGVF9Nb2R1bGUgIG1vZHVsZSApOyAgICAgICAgIC8qIENGRl9Ecml2ZXIgKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0NGRk9CSlNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZnBhcnNlLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZnBhcnNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2M2IzNTEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZwYXJzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZwYXJzZS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ0ZGIHRva2VuIHN0cmVhbSBwYXJzZXIgKGJvZHkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgImNmZnBhcnNlLmgiCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotCi0jaW5jbHVkZSAiY2ZmZXJycy5oIgotI2luY2x1ZGUgImNmZnBpYy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfY2ZmcGFyc2UKLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNmZl9wYXJzZXJfaW5pdCggQ0ZGX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGNvZGUsCi0gICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgIEZUX0xpYnJhcnkgIGxpYnJhcnkpCi0gIHsKLSAgICBGVF9NRU1fWkVSTyggcGFyc2VyLCBzaXplb2YgKCAqcGFyc2VyICkgKTsKLQotICAgIHBhcnNlci0+dG9wICAgICAgICAgPSBwYXJzZXItPnN0YWNrOwotICAgIHBhcnNlci0+b2JqZWN0X2NvZGUgPSBjb2RlOwotICAgIHBhcnNlci0+b2JqZWN0ICAgICAgPSBvYmplY3Q7Ci0gICAgcGFyc2VyLT5saWJyYXJ5ICAgICA9IGxpYnJhcnk7Ci0gIH0KLQotCi0gIC8qIHJlYWQgYW4gaW50ZWdlciAqLwotICBzdGF0aWMgRlRfTG9uZwotICBjZmZfcGFyc2VfaW50ZWdlciggRlRfQnl0ZSogIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogIGxpbWl0ICkKLSAgewotICAgIEZUX0J5dGUqICBwICAgPSBzdGFydDsKLSAgICBGVF9JbnQgICAgdiAgID0gKnArKzsKLSAgICBGVF9Mb25nICAgdmFsID0gMDsKLQotCi0gICAgaWYgKCB2ID09IDI4ICkKLSAgICB7Ci0gICAgICBpZiAoIHAgKyAyID4gbGltaXQgKQotICAgICAgICBnb3RvIEJhZDsKLQotICAgICAgdmFsID0gKEZUX1Nob3J0KSggKCAoRlRfVVNob3J0KXBbMF0gPDwgOCApIHwgcFsxXSApOwotICAgIH0KLSAgICBlbHNlIGlmICggdiA9PSAyOSApCi0gICAgewotICAgICAgaWYgKCBwICsgNCA+IGxpbWl0ICkKLSAgICAgICAgZ290byBCYWQ7Ci0KLSAgICAgIHZhbCA9IChGVF9Mb25nKSggKCAoRlRfVUxvbmcpcFswXSA8PCAyNCApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgKCAoRlRfVUxvbmcpcFsxXSA8PCAxNiApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgKCAoRlRfVUxvbmcpcFsyXSA8PCAgOCApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUxvbmcpcFszXSAgICAgICAgICk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCB2IDwgMjQ3ICkKLSAgICB7Ci0gICAgICB2YWwgPSB2IC0gMTM5OwotICAgIH0KLSAgICBlbHNlIGlmICggdiA8IDI1MSApCi0gICAgewotICAgICAgaWYgKCBwICsgMSA+IGxpbWl0ICkKLSAgICAgICAgZ290byBCYWQ7Ci0KLSAgICAgIHZhbCA9ICggdiAtIDI0NyApICogMjU2ICsgcFswXSArIDEwODsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICggcCArIDEgPiBsaW1pdCApCi0gICAgICAgIGdvdG8gQmFkOwotCi0gICAgICB2YWwgPSAtKCB2IC0gMjUxICkgKiAyNTYgLSBwWzBdIC0gMTA4OwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiB2YWw7Ci0KLSAgQmFkOgotICAgIHZhbCA9IDA7Ci0gICAgRlRfVFJBQ0U0KCggIiEhIUVORCBPRiBEQVRBOiEhISIgKSk7Ci0gICAgZ290byBFeGl0OwotICB9Ci0KLQotICBzdGF0aWMgY29uc3QgRlRfTG9uZyBwb3dlcl90ZW5zW10gPQotICB7Ci0gICAgMUwsCi0gICAgMTBMLAotICAgIDEwMEwsCi0gICAgMTAwMEwsCi0gICAgMTAwMDBMLAotICAgIDEwMDAwMEwsCi0gICAgMTAwMDAwMEwsCi0gICAgMTAwMDAwMDBMLAotICAgIDEwMDAwMDAwMEwsCi0gICAgMTAwMDAwMDAwMEwKLSAgfTsKLQotCi0gIC8qIHJlYWQgYSByZWFsICovCi0gIHN0YXRpYyBGVF9GaXhlZAotICBjZmZfcGFyc2VfcmVhbCggRlRfQnl0ZSogIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogIGxpbWl0LAotICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgIHBvd2VyX3RlbiwKLSAgICAgICAgICAgICAgICAgIEZUX0xvbmcqICBzY2FsaW5nICkKLSAgewotICAgIEZUX0J5dGUqICBwID0gc3RhcnQ7Ci0gICAgRlRfSW50ICAgIG5pYjsKLSAgICBGVF9VSW50ICAgcGhhc2U7Ci0KLSAgICBGVF9Mb25nICAgcmVzdWx0LCBudW1iZXIsIGV4cG9uZW50OwotICAgIEZUX0ludCAgICBzaWduID0gMCwgZXhwb25lbnRfc2lnbiA9IDAsIGhhdmVfb3ZlcmZsb3cgPSAwOwotICAgIEZUX0xvbmcgICBleHBvbmVudF9hZGQsIGludGVnZXJfbGVuZ3RoLCBmcmFjdGlvbl9sZW5ndGg7Ci0KLQotICAgIGlmICggc2NhbGluZyApCi0gICAgICAqc2NhbGluZyA9IDA7Ci0KLSAgICByZXN1bHQgPSAwOwotCi0gICAgbnVtYmVyICAgPSAwOwotICAgIGV4cG9uZW50ID0gMDsKLQotICAgIGV4cG9uZW50X2FkZCAgICA9IDA7Ci0gICAgaW50ZWdlcl9sZW5ndGggID0gMDsKLSAgICBmcmFjdGlvbl9sZW5ndGggPSAwOwotCi0gICAgLyogRmlyc3Qgb2YgYWxsLCByZWFkIHRoZSBpbnRlZ2VyIHBhcnQuICovCi0gICAgcGhhc2UgPSA0OwotCi0gICAgZm9yICg7OykKLSAgICB7Ci0gICAgICAvKiBJZiB3ZSBlbnRlcmVkIHRoaXMgaXRlcmF0aW9uIHdpdGggcGhhc2UgPT0gNCwgd2UgbmVlZCB0byAqLwotICAgICAgLyogcmVhZCBhIG5ldyBieXRlLiAgVGhpcyBhbHNvIHNraXBzIHBhc3QgdGhlIGluaXRpYWwgMHgxRS4gKi8KLSAgICAgIGlmICggcGhhc2UgKQotICAgICAgewotICAgICAgICBwKys7Ci0KLSAgICAgICAgLyogTWFrZSBzdXJlIHdlIGRvbid0IHJlYWQgcGFzdCB0aGUgZW5kLiAqLwotICAgICAgICBpZiAoIHAgPj0gbGltaXQgKQotICAgICAgICAgIGdvdG8gQmFkOwotICAgICAgfQotCi0gICAgICAvKiBHZXQgdGhlIG5pYmJsZS4gKi8KLSAgICAgIG5pYiAgID0gKEZUX0ludCkoIHBbMF0gPj4gcGhhc2UgKSAmIDB4RjsKLSAgICAgIHBoYXNlID0gNCAtIHBoYXNlOwotCi0gICAgICBpZiAoIG5pYiA9PSAweEUgKQotICAgICAgICBzaWduID0gMTsKLSAgICAgIGVsc2UgaWYgKCBuaWIgPiA5ICkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIEluY3JlYXNlIGV4cG9uZW50IGlmIHdlIGNhbid0IGFkZCB0aGUgZGlnaXQuICovCi0gICAgICAgIGlmICggbnVtYmVyID49IDB4Q0NDQ0NDQ0wgKQotICAgICAgICAgIGV4cG9uZW50X2FkZCsrOwotICAgICAgICAvKiBTa2lwIGxlYWRpbmcgemVyb3MuICovCi0gICAgICAgIGVsc2UgaWYgKCBuaWIgfHwgbnVtYmVyICkKLSAgICAgICAgewotICAgICAgICAgIGludGVnZXJfbGVuZ3RoKys7Ci0gICAgICAgICAgbnVtYmVyID0gbnVtYmVyICogMTAgKyBuaWI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBSZWFkIGZyYWN0aW9uIHBhcnQsIGlmIGFueS4gKi8KLSAgICBpZiAoIG5pYiA9PSAweEEgKQotICAgICAgZm9yICg7OykKLSAgICAgIHsKLSAgICAgICAgLyogSWYgd2UgZW50ZXJlZCB0aGlzIGl0ZXJhdGlvbiB3aXRoIHBoYXNlID09IDQsIHdlIG5lZWQgKi8KLSAgICAgICAgLyogdG8gcmVhZCBhIG5ldyBieXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBwaGFzZSApCi0gICAgICAgIHsKLSAgICAgICAgICBwKys7Ci0KLSAgICAgICAgICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVhZCBwYXN0IHRoZSBlbmQuICovCi0gICAgICAgICAgaWYgKCBwID49IGxpbWl0ICkKLSAgICAgICAgICAgIGdvdG8gQmFkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogR2V0IHRoZSBuaWJibGUuICovCi0gICAgICAgIG5pYiAgID0gKCBwWzBdID4+IHBoYXNlICkgJiAweEY7Ci0gICAgICAgIHBoYXNlID0gNCAtIHBoYXNlOwotICAgICAgICBpZiAoIG5pYiA+PSAxMCApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogU2tpcCBsZWFkaW5nIHplcm9zIGlmIHBvc3NpYmxlLiAqLwotICAgICAgICBpZiAoICFuaWIgJiYgIW51bWJlciApCi0gICAgICAgICAgZXhwb25lbnRfYWRkLS07Ci0gICAgICAgIC8qIE9ubHkgYWRkIGRpZ2l0IGlmIHdlIGRvbid0IG92ZXJmbG93LiAqLwotICAgICAgICBlbHNlIGlmICggbnVtYmVyIDwgMHhDQ0NDQ0NDTCAmJiBmcmFjdGlvbl9sZW5ndGggPCA5ICkKLSAgICAgICAgewotICAgICAgICAgIGZyYWN0aW9uX2xlbmd0aCsrOwotICAgICAgICAgIG51bWJlciA9IG51bWJlciAqIDEwICsgbmliOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAvKiBSZWFkIGV4cG9uZW50LCBpZiBhbnkuICovCi0gICAgaWYgKCBuaWIgPT0gMTIgKQotICAgIHsKLSAgICAgIGV4cG9uZW50X3NpZ24gPSAxOwotICAgICAgbmliICAgICAgICAgICA9IDExOwotICAgIH0KLQotICAgIGlmICggbmliID09IDExICkKLSAgICB7Ci0gICAgICBmb3IgKDs7KQotICAgICAgewotICAgICAgICAvKiBJZiB3ZSBlbnRlcmVkIHRoaXMgaXRlcmF0aW9uIHdpdGggcGhhc2UgPT0gNCwgKi8KLSAgICAgICAgLyogd2UgbmVlZCB0byByZWFkIGEgbmV3IGJ5dGUuICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggcGhhc2UgKQotICAgICAgICB7Ci0gICAgICAgICAgcCsrOwotCi0gICAgICAgICAgLyogTWFrZSBzdXJlIHdlIGRvbid0IHJlYWQgcGFzdCB0aGUgZW5kLiAqLwotICAgICAgICAgIGlmICggcCA+PSBsaW1pdCApCi0gICAgICAgICAgICBnb3RvIEJhZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEdldCB0aGUgbmliYmxlLiAqLwotICAgICAgICBuaWIgICA9ICggcFswXSA+PiBwaGFzZSApICYgMHhGOwotICAgICAgICBwaGFzZSA9IDQgLSBwaGFzZTsKLSAgICAgICAgaWYgKCBuaWIgPj0gMTAgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIEFyYml0cmFyaWx5IGxpbWl0IGV4cG9uZW50LiAqLwotICAgICAgICBpZiAoIGV4cG9uZW50ID4gMTAwMCApCi0gICAgICAgICAgaGF2ZV9vdmVyZmxvdyA9IDE7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBleHBvbmVudCA9IGV4cG9uZW50ICogMTAgKyBuaWI7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggZXhwb25lbnRfc2lnbiApCi0gICAgICAgIGV4cG9uZW50ID0gLWV4cG9uZW50OwotICAgIH0KLQotICAgIGlmICggIW51bWJlciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIGhhdmVfb3ZlcmZsb3cgKQotICAgIHsKLSAgICAgIGlmICggZXhwb25lbnRfc2lnbiApCi0gICAgICAgIGdvdG8gVW5kZXJmbG93OwotICAgICAgZWxzZQotICAgICAgICBnb3RvIE92ZXJmbG93OwotICAgIH0KLQotICAgIC8qIFdlIGRvbid0IGNoZWNrIGBwb3dlcl90ZW4nIGFuZCBgZXhwb25lbnRfYWRkJy4gKi8KLSAgICBleHBvbmVudCArPSBwb3dlcl90ZW4gKyBleHBvbmVudF9hZGQ7Ci0KLSAgICBpZiAoIHNjYWxpbmcgKQotICAgIHsKLSAgICAgIC8qIE9ubHkgdXNlIGBmcmFjdGlvbl9sZW5ndGgnLiAqLwotICAgICAgZnJhY3Rpb25fbGVuZ3RoICs9IGludGVnZXJfbGVuZ3RoOwotICAgICAgZXhwb25lbnQgICAgICAgICs9IGludGVnZXJfbGVuZ3RoOwotCi0gICAgICBpZiAoIGZyYWN0aW9uX2xlbmd0aCA8PSA1ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBudW1iZXIgPiAweDdGRkZMICkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCAgID0gRlRfRGl2Rml4KCBudW1iZXIsIDEwICk7Ci0gICAgICAgICAgKnNjYWxpbmcgPSBleHBvbmVudCAtIGZyYWN0aW9uX2xlbmd0aCArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBleHBvbmVudCA+IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0xvbmcgIG5ld19mcmFjdGlvbl9sZW5ndGgsIHNoaWZ0OwotCi0KLSAgICAgICAgICAgIC8qIE1ha2UgYHNjYWxpbmcnIGFzIHNtYWxsIGFzIHBvc3NpYmxlLiAqLwotICAgICAgICAgICAgbmV3X2ZyYWN0aW9uX2xlbmd0aCA9IEZUX01JTiggZXhwb25lbnQsIDUgKTsKLSAgICAgICAgICAgIHNoaWZ0ICAgICAgICAgICAgICAgPSBuZXdfZnJhY3Rpb25fbGVuZ3RoIC0gZnJhY3Rpb25fbGVuZ3RoOwotCi0gICAgICAgICAgICBpZiAoIHNoaWZ0ID4gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGV4cG9uZW50IC09IG5ld19mcmFjdGlvbl9sZW5ndGg7Ci0gICAgICAgICAgICAgIG51bWJlciAgICo9IHBvd2VyX3RlbnNbc2hpZnRdOwotICAgICAgICAgICAgICBpZiAoIG51bWJlciA+IDB4N0ZGRkwgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbnVtYmVyICAgLz0gMTA7Ci0gICAgICAgICAgICAgICAgZXhwb25lbnQgKz0gMTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBleHBvbmVudCAtPSBmcmFjdGlvbl9sZW5ndGg7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGV4cG9uZW50IC09IGZyYWN0aW9uX2xlbmd0aDsKLQotICAgICAgICAgIHJlc3VsdCAgID0gKEZUX0xvbmcpKCAoRlRfVUxvbmcpbnVtYmVyIDw8IDE2ICk7Ci0gICAgICAgICAgKnNjYWxpbmcgPSBleHBvbmVudDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoICggbnVtYmVyIC8gcG93ZXJfdGVuc1tmcmFjdGlvbl9sZW5ndGggLSA1XSApID4gMHg3RkZGTCApCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgICA9IEZUX0RpdkZpeCggbnVtYmVyLCBwb3dlcl90ZW5zW2ZyYWN0aW9uX2xlbmd0aCAtIDRdICk7Ci0gICAgICAgICAgKnNjYWxpbmcgPSBleHBvbmVudCAtIDQ7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ICAgPSBGVF9EaXZGaXgoIG51bWJlciwgcG93ZXJfdGVuc1tmcmFjdGlvbl9sZW5ndGggLSA1XSApOwotICAgICAgICAgICpzY2FsaW5nID0gZXhwb25lbnQgLSA1OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpbnRlZ2VyX2xlbmd0aCAgKz0gZXhwb25lbnQ7Ci0gICAgICBmcmFjdGlvbl9sZW5ndGggLT0gZXhwb25lbnQ7Ci0KLSAgICAgIGlmICggaW50ZWdlcl9sZW5ndGggPiA1ICkKLSAgICAgICAgZ290byBPdmVyZmxvdzsKLSAgICAgIGlmICggaW50ZWdlcl9sZW5ndGggPCAtNSApCi0gICAgICAgIGdvdG8gVW5kZXJmbG93OwotCi0gICAgICAvKiBSZW1vdmUgbm9uLXNpZ25pZmljYW50IGRpZ2l0cy4gKi8KLSAgICAgIGlmICggaW50ZWdlcl9sZW5ndGggPCAwICkKLSAgICAgIHsKLSAgICAgICAgbnVtYmVyICAgICAgICAgIC89IHBvd2VyX3RlbnNbLWludGVnZXJfbGVuZ3RoXTsKLSAgICAgICAgZnJhY3Rpb25fbGVuZ3RoICs9IGludGVnZXJfbGVuZ3RoOwotICAgICAgfQotCi0gICAgICAvKiB0aGlzIGNhbiBvbmx5IGhhcHBlbiBpZiBleHBvbmVudCB3YXMgbm9uLXplcm8gKi8KLSAgICAgIGlmICggZnJhY3Rpb25fbGVuZ3RoID09IDEwICkKLSAgICAgIHsKLSAgICAgICAgbnVtYmVyICAgICAgICAgIC89IDEwOwotICAgICAgICBmcmFjdGlvbl9sZW5ndGggLT0gMTsKLSAgICAgIH0KLQotICAgICAgLyogQ29udmVydCBpbnRvIDE2LjE2IGZvcm1hdC4gKi8KLSAgICAgIGlmICggZnJhY3Rpb25fbGVuZ3RoID4gMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggKCBudW1iZXIgLyBwb3dlcl90ZW5zW2ZyYWN0aW9uX2xlbmd0aF0gKSA+IDB4N0ZGRkwgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICByZXN1bHQgPSBGVF9EaXZGaXgoIG51bWJlciwgcG93ZXJfdGVuc1tmcmFjdGlvbl9sZW5ndGhdICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG51bWJlciAqPSBwb3dlcl90ZW5zWy1mcmFjdGlvbl9sZW5ndGhdOwotCi0gICAgICAgIGlmICggbnVtYmVyID4gMHg3RkZGTCApCi0gICAgICAgICAgZ290byBPdmVyZmxvdzsKLQotICAgICAgICByZXN1bHQgPSAoRlRfTG9uZykoIChGVF9VTG9uZyludW1iZXIgPDwgMTYgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICBpZiAoIHNpZ24gKQotICAgICAgcmVzdWx0ID0gLXJlc3VsdDsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0KLSAgT3ZlcmZsb3c6Ci0gICAgcmVzdWx0ID0gMHg3RkZGRkZGRkw7Ci0gICAgRlRfVFJBQ0U0KCggIiEhIU9WRVJGTE9XOiEhISIgKSk7Ci0gICAgZ290byBFeGl0OwotCi0gIFVuZGVyZmxvdzoKLSAgICByZXN1bHQgPSAwOwotICAgIEZUX1RSQUNFNCgoICIhISFVTkRFUkZMT1c6ISEhIiApKTsKLSAgICBnb3RvIEV4aXQ7Ci0KLSAgQmFkOgotICAgIHJlc3VsdCA9IDA7Ci0gICAgRlRfVFJBQ0U0KCggIiEhIUVORCBPRiBEQVRBOiEhISIgKSk7Ci0gICAgZ290byBFeGl0OwotICB9Ci0KLQotICAvKiByZWFkIGEgbnVtYmVyLCBlaXRoZXIgaW50ZWdlciBvciByZWFsICovCi0gIHN0YXRpYyBGVF9Mb25nCi0gIGNmZl9wYXJzZV9udW0oIEZUX0J5dGUqKiAgZCApCi0gIHsKLSAgICByZXR1cm4gKipkID09IDMwID8gKCBjZmZfcGFyc2VfcmVhbCggZFswXSwgZFsxXSwgMCwgTlVMTCApID4+IDE2ICkKLSAgICAgICAgICAgICAgICAgICAgIDogICBjZmZfcGFyc2VfaW50ZWdlciggZFswXSwgZFsxXSApOwotICB9Ci0KLQotICAvKiByZWFkIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBlaXRoZXIgaW50ZWdlciBvciByZWFsICovCi0gIHN0YXRpYyBGVF9GaXhlZAotICBkb19maXhlZCggRlRfQnl0ZSoqICBkLAotICAgICAgICAgICAgRlRfTG9uZyAgICBzY2FsaW5nICkKLSAgewotICAgIGlmICggKipkID09IDMwICkKLSAgICAgIHJldHVybiBjZmZfcGFyc2VfcmVhbCggZFswXSwgZFsxXSwgc2NhbGluZywgTlVMTCApOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGVF9Mb25nICB2YWwgPSBjZmZfcGFyc2VfaW50ZWdlciggZFswXSwgZFsxXSApOwotCi0KLSAgICAgIGlmICggc2NhbGluZyApCi0gICAgICAgIHZhbCAqPSBwb3dlcl90ZW5zW3NjYWxpbmddOwotCi0gICAgICBpZiAoIHZhbCA+IDB4N0ZGRiApCi0gICAgICB7Ci0gICAgICAgIHZhbCA9IDB4N0ZGRkZGRkZMOwotICAgICAgICBnb3RvIE92ZXJmbG93OwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHZhbCA8IC0weDdGRkYgKQotICAgICAgewotICAgICAgICB2YWwgPSAtMHg3RkZGRkZGRkw7Ci0gICAgICAgIGdvdG8gT3ZlcmZsb3c7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiAoRlRfTG9uZykoIChGVF9VTG9uZyl2YWwgPDwgMTYgKTsKLQotICAgIE92ZXJmbG93OgotICAgICAgRlRfVFJBQ0U0KCggIiEhIU9WRVJGTE9XOiEhISIgKSk7Ci0gICAgICByZXR1cm4gdmFsOwotICAgIH0KLSAgfQotCi0KLSAgLyogcmVhZCBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgZWl0aGVyIGludGVnZXIgb3IgcmVhbCAqLwotICBzdGF0aWMgRlRfRml4ZWQKLSAgY2ZmX3BhcnNlX2ZpeGVkKCBGVF9CeXRlKiogIGQgKQotICB7Ci0gICAgcmV0dXJuIGRvX2ZpeGVkKCBkLCAwICk7Ci0gIH0KLQotCi0gIC8qIHJlYWQgYSBmbG9hdGluZyBwb2ludCBudW1iZXIsIGVpdGhlciBpbnRlZ2VyIG9yIHJlYWwsICovCi0gIC8qIGJ1dCByZXR1cm4gYDEwXnNjYWxpbmcnIHRpbWVzIHRoZSBudW1iZXIgcmVhZCBpbiAgICAgICovCi0gIHN0YXRpYyBGVF9GaXhlZAotICBjZmZfcGFyc2VfZml4ZWRfc2NhbGVkKCBGVF9CeXRlKiogIGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgc2NhbGluZyApCi0gIHsKLSAgICByZXR1cm4gZG9fZml4ZWQoIGQsIHNjYWxpbmcgKTsKLSAgfQotCi0KLSAgLyogcmVhZCBhIGZsb2F0aW5nIHBvaW50IG51bWJlciwgZWl0aGVyIGludGVnZXIgb3IgcmVhbCwgICAgICovCi0gIC8qIGFuZCByZXR1cm4gaXQgYXMgcHJlY2lzZSBhcyBwb3NzaWJsZSAtLSBgc2NhbGluZycgcmV0dXJucyAqLwotICAvKiB0aGUgc2NhbGluZyBmYWN0b3IgKGFzIGEgcG93ZXIgb2YgMTApICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0ZpeGVkCi0gIGNmZl9wYXJzZV9maXhlZF9keW5hbWljKCBGVF9CeXRlKiogIGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nKiAgIHNjYWxpbmcgKQotICB7Ci0gICAgRlRfQVNTRVJUKCBzY2FsaW5nICk7Ci0KLSAgICBpZiAoICoqZCA9PSAzMCApCi0gICAgICByZXR1cm4gY2ZmX3BhcnNlX3JlYWwoIGRbMF0sIGRbMV0sIDAsIHNjYWxpbmcgKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfTG9uZyAgbnVtYmVyOwotICAgICAgRlRfSW50ICAgaW50ZWdlcl9sZW5ndGg7Ci0KLQotICAgICAgbnVtYmVyID0gY2ZmX3BhcnNlX2ludGVnZXIoIGRbMF0sIGRbMV0gKTsKLQotICAgICAgaWYgKCBudW1iZXIgPiAweDdGRkZMICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggaW50ZWdlcl9sZW5ndGggPSA1OyBpbnRlZ2VyX2xlbmd0aCA8IDEwOyBpbnRlZ2VyX2xlbmd0aCsrICkKLSAgICAgICAgICBpZiAoIG51bWJlciA8IHBvd2VyX3RlbnNbaW50ZWdlcl9sZW5ndGhdICkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmICggKCBudW1iZXIgLyBwb3dlcl90ZW5zW2ludGVnZXJfbGVuZ3RoIC0gNV0gKSA+IDB4N0ZGRkwgKQotICAgICAgICB7Ci0gICAgICAgICAgKnNjYWxpbmcgPSBpbnRlZ2VyX2xlbmd0aCAtIDQ7Ci0gICAgICAgICAgcmV0dXJuIEZUX0RpdkZpeCggbnVtYmVyLCBwb3dlcl90ZW5zW2ludGVnZXJfbGVuZ3RoIC0gNF0gKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAqc2NhbGluZyA9IGludGVnZXJfbGVuZ3RoIC0gNTsKLSAgICAgICAgICByZXR1cm4gRlRfRGl2Rml4KCBudW1iZXIsIHBvd2VyX3RlbnNbaW50ZWdlcl9sZW5ndGggLSA1XSApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICpzY2FsaW5nID0gMDsKLSAgICAgICAgcmV0dXJuIChGVF9Mb25nKSggKEZUX1VMb25nKW51bWJlciA8PCAxNiApOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9wYXJzZV9mb250X21hdHJpeCggQ0ZGX1BhcnNlciAgcGFyc2VyICkKLSAgewotICAgIENGRl9Gb250UmVjRGljdCAgZGljdCAgID0gKENGRl9Gb250UmVjRGljdClwYXJzZXItPm9iamVjdDsKLSAgICBGVF9NYXRyaXgqICAgICAgIG1hdHJpeCA9ICZkaWN0LT5mb250X21hdHJpeDsKLSAgICBGVF9WZWN0b3IqICAgICAgIG9mZnNldCA9ICZkaWN0LT5mb250X29mZnNldDsKLSAgICBGVF9VTG9uZyogICAgICAgIHVwbSAgICA9ICZkaWN0LT51bml0c19wZXJfZW07Ci0gICAgRlRfQnl0ZSoqICAgICAgICBkYXRhICAgPSBwYXJzZXItPnN0YWNrOwotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3IgID0gRlRfRVJSKCBTdGFja19VbmRlcmZsb3cgKTsKLQotCi0gICAgaWYgKCBwYXJzZXItPnRvcCA+PSBwYXJzZXItPnN0YWNrICsgNiApCi0gICAgewotICAgICAgRlRfTG9uZyAgc2NhbGluZzsKLQotCi0gICAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotICAgICAgZGljdC0+aGFzX2ZvbnRfbWF0cml4ID0gVFJVRTsKLQotICAgICAgLyogV2UgZXhwZWN0IGEgd2VsbC1mb3JtZWQgZm9udCBtYXRyaXgsIHRoaXMgaXMsIHRoZSBtYXRyaXggZWxlbWVudHMgKi8KLSAgICAgIC8qIGB4eCcgYW5kIGB5eScgYXJlIG9mIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgbWFnbml0dWRlLiAgVG8gYXZvaWQgICovCi0gICAgICAvKiBsb3NzIG9mIHByZWNpc2lvbiwgd2UgdXNlIHRoZSBtYWduaXR1ZGUgb2YgZWxlbWVudCBgeHgnIHRvIHNjYWxlICAqLwotICAgICAgLyogYWxsIG90aGVyIGVsZW1lbnRzLiAgVGhlIHNjYWxpbmcgZmFjdG9yIGlzIHRoZW4gY29udGFpbmVkIGluIHRoZSAgKi8KLSAgICAgIC8qIGB1bml0c19wZXJfZW0nIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIG1hdHJpeC0+eHggPSBjZmZfcGFyc2VfZml4ZWRfZHluYW1pYyggZGF0YSsrLCAmc2NhbGluZyApOwotCi0gICAgICBzY2FsaW5nID0gLXNjYWxpbmc7Ci0KLSAgICAgIGlmICggc2NhbGluZyA8IDAgfHwgc2NhbGluZyA+IDkgKQotICAgICAgewotICAgICAgICAvKiBSZXR1cm4gZGVmYXVsdCBtYXRyaXggaW4gY2FzZSBvZiB1bmxpa2VseSB2YWx1ZXMuICovCi0KLSAgICAgICAgRlRfVFJBQ0UxKCggImNmZl9wYXJzZV9mb250X21hdHJpeDoiCi0gICAgICAgICAgICAgICAgICAgICIgc3RyYW5nZSBzY2FsaW5nIHZhbHVlIGZvciB4eCBlbGVtZW50ICglZCksXG4iCi0gICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgIgotICAgICAgICAgICAgICAgICAgICAiIHVzaW5nIGRlZmF1bHQgbWF0cml4XG4iLCBzY2FsaW5nICkpOwotCi0gICAgICAgIG1hdHJpeC0+eHggPSAweDEwMDAwTDsKLSAgICAgICAgbWF0cml4LT55eCA9IDA7Ci0gICAgICAgIG1hdHJpeC0+eHkgPSAwOwotICAgICAgICBtYXRyaXgtPnl5ID0gMHgxMDAwMEw7Ci0gICAgICAgIG9mZnNldC0+eCAgPSAwOwotICAgICAgICBvZmZzZXQtPnkgID0gMDsKLSAgICAgICAgKnVwbSAgICAgICA9IDE7Ci0KLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBtYXRyaXgtPnl4ID0gY2ZmX3BhcnNlX2ZpeGVkX3NjYWxlZCggZGF0YSsrLCBzY2FsaW5nICk7Ci0gICAgICBtYXRyaXgtPnh5ID0gY2ZmX3BhcnNlX2ZpeGVkX3NjYWxlZCggZGF0YSsrLCBzY2FsaW5nICk7Ci0gICAgICBtYXRyaXgtPnl5ID0gY2ZmX3BhcnNlX2ZpeGVkX3NjYWxlZCggZGF0YSsrLCBzY2FsaW5nICk7Ci0gICAgICBvZmZzZXQtPnggID0gY2ZmX3BhcnNlX2ZpeGVkX3NjYWxlZCggZGF0YSsrLCBzY2FsaW5nICk7Ci0gICAgICBvZmZzZXQtPnkgID0gY2ZmX3BhcnNlX2ZpeGVkX3NjYWxlZCggZGF0YSwgICBzY2FsaW5nICk7Ci0KLSAgICAgICp1cG0gPSAoRlRfVUxvbmcpcG93ZXJfdGVuc1tzY2FsaW5nXTsKLQotICAgICAgRlRfVFJBQ0U0KCggIiBbJWYgJWYgJWYgJWYgJWYgJWZdXG4iLAotICAgICAgICAgICAgICAgICAgKGRvdWJsZSltYXRyaXgtPnh4IC8gKnVwbSAvIDY1NTM2LAotICAgICAgICAgICAgICAgICAgKGRvdWJsZSltYXRyaXgtPnh5IC8gKnVwbSAvIDY1NTM2LAotICAgICAgICAgICAgICAgICAgKGRvdWJsZSltYXRyaXgtPnl4IC8gKnVwbSAvIDY1NTM2LAotICAgICAgICAgICAgICAgICAgKGRvdWJsZSltYXRyaXgtPnl5IC8gKnVwbSAvIDY1NTM2LAotICAgICAgICAgICAgICAgICAgKGRvdWJsZSlvZmZzZXQtPnggIC8gKnVwbSAvIDY1NTM2LAotICAgICAgICAgICAgICAgICAgKGRvdWJsZSlvZmZzZXQtPnkgIC8gKnVwbSAvIDY1NTM2ICkpOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNmZl9wYXJzZV9mb250X2Jib3goIENGRl9QYXJzZXIgIHBhcnNlciApCi0gIHsKLSAgICBDRkZfRm9udFJlY0RpY3QgIGRpY3QgPSAoQ0ZGX0ZvbnRSZWNEaWN0KXBhcnNlci0+b2JqZWN0OwotICAgIEZUX0JCb3gqICAgICAgICAgYmJveCA9ICZkaWN0LT5mb250X2Jib3g7Ci0gICAgRlRfQnl0ZSoqICAgICAgICBkYXRhID0gcGFyc2VyLT5zdGFjazsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yOwotCi0KLSAgICBlcnJvciA9IEZUX0VSUiggU3RhY2tfVW5kZXJmbG93ICk7Ci0KLSAgICBpZiAoIHBhcnNlci0+dG9wID49IHBhcnNlci0+c3RhY2sgKyA0ICkKLSAgICB7Ci0gICAgICBiYm94LT54TWluID0gRlRfUm91bmRGaXgoIGNmZl9wYXJzZV9maXhlZCggZGF0YSsrICkgKTsKLSAgICAgIGJib3gtPnlNaW4gPSBGVF9Sb3VuZEZpeCggY2ZmX3BhcnNlX2ZpeGVkKCBkYXRhKysgKSApOwotICAgICAgYmJveC0+eE1heCA9IEZUX1JvdW5kRml4KCBjZmZfcGFyc2VfZml4ZWQoIGRhdGErKyApICk7Ci0gICAgICBiYm94LT55TWF4ID0gRlRfUm91bmRGaXgoIGNmZl9wYXJzZV9maXhlZCggZGF0YSAgICkgKTsKLSAgICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0gICAgICBGVF9UUkFDRTQoKCAiIFslZCAlZCAlZCAlZF1cbiIsCi0gICAgICAgICAgICAgICAgICBiYm94LT54TWluIC8gNjU1MzYsCi0gICAgICAgICAgICAgICAgICBiYm94LT55TWluIC8gNjU1MzYsCi0gICAgICAgICAgICAgICAgICBiYm94LT54TWF4IC8gNjU1MzYsCi0gICAgICAgICAgICAgICAgICBiYm94LT55TWF4IC8gNjU1MzYgKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2ZmX3BhcnNlX3ByaXZhdGVfZGljdCggQ0ZGX1BhcnNlciAgcGFyc2VyICkKLSAgewotICAgIENGRl9Gb250UmVjRGljdCAgZGljdCA9IChDRkZfRm9udFJlY0RpY3QpcGFyc2VyLT5vYmplY3Q7Ci0gICAgRlRfQnl0ZSoqICAgICAgICBkYXRhID0gcGFyc2VyLT5zdGFjazsKLSAgICBGVF9FcnJvciAgICAgICAgIGVycm9yOwotCi0KLSAgICBlcnJvciA9IEZUX0VSUiggU3RhY2tfVW5kZXJmbG93ICk7Ci0KLSAgICBpZiAoIHBhcnNlci0+dG9wID49IHBhcnNlci0+c3RhY2sgKyAyICkKLSAgICB7Ci0gICAgICBGVF9Mb25nICB0bXA7Ci0KLQotICAgICAgdG1wID0gY2ZmX3BhcnNlX251bSggZGF0YSsrICk7Ci0gICAgICBpZiAoIHRtcCA8IDAgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJjZmZfcGFyc2VfcHJpdmF0ZV9kaWN0OiBJbnZhbGlkIGRpY3Rpb25hcnkgc2l6ZVxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0gICAgICBkaWN0LT5wcml2YXRlX3NpemUgPSAoRlRfVUxvbmcpdG1wOwotCi0gICAgICB0bXAgPSBjZmZfcGFyc2VfbnVtKCBkYXRhICk7Ci0gICAgICBpZiAoIHRtcCA8IDAgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJjZmZfcGFyc2VfcHJpdmF0ZV9kaWN0OiBJbnZhbGlkIGRpY3Rpb25hcnkgb2Zmc2V0XG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLSAgICAgIGRpY3QtPnByaXZhdGVfb2Zmc2V0ID0gKEZUX1VMb25nKXRtcDsKLQotICAgICAgRlRfVFJBQ0U0KCggIiAlbHUgJWx1XG4iLAotICAgICAgICAgICAgICAgICAgZGljdC0+cHJpdmF0ZV9zaXplLCBkaWN0LT5wcml2YXRlX29mZnNldCApKTsKLQotICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgfQotCi0gIEZhaWw6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2ZmX3BhcnNlX2NpZF9yb3MoIENGRl9QYXJzZXIgIHBhcnNlciApCi0gIHsKLSAgICBDRkZfRm9udFJlY0RpY3QgIGRpY3QgPSAoQ0ZGX0ZvbnRSZWNEaWN0KXBhcnNlci0+b2JqZWN0OwotICAgIEZUX0J5dGUqKiAgICAgICAgZGF0YSA9IHBhcnNlci0+c3RhY2s7Ci0gICAgRlRfRXJyb3IgICAgICAgICBlcnJvcjsKLQotCi0gICAgZXJyb3IgPSBGVF9FUlIoIFN0YWNrX1VuZGVyZmxvdyApOwotCi0gICAgaWYgKCBwYXJzZXItPnRvcCA+PSBwYXJzZXItPnN0YWNrICsgMyApCi0gICAgewotICAgICAgZGljdC0+Y2lkX3JlZ2lzdHJ5ID0gKEZUX1VJbnQpY2ZmX3BhcnNlX251bSggZGF0YSsrICk7Ci0gICAgICBkaWN0LT5jaWRfb3JkZXJpbmcgPSAoRlRfVUludCljZmZfcGFyc2VfbnVtKCBkYXRhKysgKTsKLSAgICAgIGlmICggKipkYXRhID09IDMwICkKLSAgICAgICAgRlRfVFJBQ0UxKCggImNmZl9wYXJzZV9jaWRfcm9zOiByZWFsIHN1cHBsZW1lbnQgaXMgcm91bmRlZFxuIiApKTsKLSAgICAgIGRpY3QtPmNpZF9zdXBwbGVtZW50ID0gY2ZmX3BhcnNlX251bSggZGF0YSApOwotICAgICAgaWYgKCBkaWN0LT5jaWRfc3VwcGxlbWVudCA8IDAgKQotICAgICAgICBGVF9UUkFDRTEoKCAiY2ZmX3BhcnNlX2NpZF9yb3M6IG5lZ2F0aXZlIHN1cHBsZW1lbnQgJWQgaXMgZm91bmRcbiIsCi0gICAgICAgICAgICAgICAgICAgZGljdC0+Y2lkX3N1cHBsZW1lbnQgKSk7Ci0gICAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotICAgICAgRlRfVFJBQ0U0KCggIiAlZCAlZCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgIGRpY3QtPmNpZF9yZWdpc3RyeSwKLSAgICAgICAgICAgICAgICAgIGRpY3QtPmNpZF9vcmRlcmluZywKLSAgICAgICAgICAgICAgICAgIGRpY3QtPmNpZF9zdXBwbGVtZW50ICkpOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSNkZWZpbmUgQ0ZGX0ZJRUxEX05VTSggY29kZSwgbmFtZSwgaWQgKSAgICAgICAgICAgICBcCi0gICAgICAgICAgQ0ZGX0ZJRUxEKCBjb2RlLCBuYW1lLCBpZCwgY2ZmX2tpbmRfbnVtICkKLSNkZWZpbmUgQ0ZGX0ZJRUxEX0ZJWEVEKCBjb2RlLCBuYW1lLCBpZCApICAgICAgICAgICAgIFwKLSAgICAgICAgICBDRkZfRklFTEQoIGNvZGUsIG5hbWUsIGlkLCBjZmZfa2luZF9maXhlZCApCi0jZGVmaW5lIENGRl9GSUVMRF9GSVhFRF8xMDAwKCBjb2RlLCBuYW1lLCBpZCApICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgQ0ZGX0ZJRUxEKCBjb2RlLCBuYW1lLCBpZCwgY2ZmX2tpbmRfZml4ZWRfdGhvdXNhbmQgKQotI2RlZmluZSBDRkZfRklFTERfU1RSSU5HKCBjb2RlLCBuYW1lLCBpZCApICAgICAgICAgICAgIFwKLSAgICAgICAgICBDRkZfRklFTEQoIGNvZGUsIG5hbWUsIGlkLCBjZmZfa2luZF9zdHJpbmcgKQotI2RlZmluZSBDRkZfRklFTERfQk9PTCggY29kZSwgbmFtZSwgaWQgKSAgICAgICAgICAgICBcCi0gICAgICAgICAgQ0ZGX0ZJRUxEKCBjb2RlLCBuYW1lLCBpZCwgY2ZmX2tpbmRfYm9vbCApCi0KLSNkZWZpbmUgQ0ZGQ09ERV9UT1BESUNUICAweDEwMDAKLSNkZWZpbmUgQ0ZGQ09ERV9QUklWQVRFICAweDIwMDAKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLQotI3VuZGVmICBDRkZfRklFTEQKLSN1bmRlZiAgQ0ZGX0ZJRUxEX0RFTFRBCi0KLQotI2lmbmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotCi0KLSNkZWZpbmUgQ0ZGX0ZJRUxEX0NBTExCQUNLKCBjb2RlLCBuYW1lLCBpZCApIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNmZl9raW5kX2NhbGxiYWNrLCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvZGUgfCBDRkZDT0RFLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNmZl9wYXJzZV8gIyMgbmFtZSwgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDAsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9LAotCi0jZGVmaW5lIENGRl9GSUVMRCggY29kZSwgbmFtZSwgaWQsIGtpbmQgKSBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBraW5kLCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjb2RlIHwgQ0ZGQ09ERSwgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9GSUVMRF9PRkZTRVQoIG5hbWUgKSwgICAgICBcCi0gICAgICAgICAgICBGVF9GSUVMRF9TSVpFKCBuYW1lICksICAgICAgICBcCi0gICAgICAgICAgICAwLCAwLCAwICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgfSwKLQotI2RlZmluZSBDRkZfRklFTERfREVMVEEoIGNvZGUsIG5hbWUsIG1heCwgaWQgKSBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNmZl9raW5kX2RlbHRhLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgY29kZSB8IENGRkNPREUsICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9GSUVMRF9PRkZTRVQoIG5hbWUgKSwgICAgICAgICAgIFwKLSAgICAgICAgICAgIEZUX0ZJRUxEX1NJWkVfREVMVEEoIG5hbWUgKSwgICAgICAgXAotICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBtYXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEZUX0ZJRUxEX09GRlNFVCggbnVtXyAjIyBuYW1lICkgICAgXAotICAgICAgICAgIH0sCi0KLSAgc3RhdGljIGNvbnN0IENGRl9GaWVsZF9IYW5kbGVyICBjZmZfZmllbGRfaGFuZGxlcnNbXSA9Ci0gIHsKLQotI2luY2x1ZGUgImNmZnRva2VuLmgiCi0KLSAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAgfQotICB9OwotCi0KLSNlbHNlIC8qIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLQotCi0jZGVmaW5lIENGRl9GSUVMRF9DQUxMQkFDSyggY29kZSwgbmFtZSwgaWQgKSBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjZmZfa2luZF9jYWxsYmFjaywgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjb2RlIHwgQ0ZGQ09ERSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjZmZfcGFyc2VfICMjIG5hbWUsICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgfSwKLQotI2RlZmluZSBDRkZfRklFTEQoIGNvZGUsIG5hbWUsIGlkLCBraW5kICkgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAga2luZCwgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgY29kZSB8IENGRkNPREUsICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfT0ZGU0VUKCBuYW1lICksICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfU0laRSggbmFtZSApLCAgICAgICAgXAotICAgICAgICAgICAgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0sCi0KLSNkZWZpbmUgQ0ZGX0ZJRUxEX0RFTFRBKCBjb2RlLCBuYW1lLCBtYXgsIGlkICkgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjZmZfa2luZF9kZWx0YSwgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGNvZGUgfCBDRkZDT0RFLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgRlRfRklFTERfT0ZGU0VUKCBuYW1lICksICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9GSUVMRF9TSVpFX0RFTFRBKCBuYW1lICksICAgICAgIFwKLSAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgbWF4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBGVF9GSUVMRF9PRkZTRVQoIG51bV8gIyMgbmFtZSApLCAgIFwKLSAgICAgICAgICAgIGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0sCi0KLSAgc3RhdGljIGNvbnN0IENGRl9GaWVsZF9IYW5kbGVyICBjZmZfZmllbGRfaGFuZGxlcnNbXSA9Ci0gIHsKLQotI2luY2x1ZGUgImNmZnRva2VuLmgiCi0KLSAgICB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfQotICB9OwotCi0KLSNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0KLSNlbHNlIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQotICB2b2lkCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfY2ZmX2ZpZWxkX2hhbmRsZXJzKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkZfRmllbGRfSGFuZGxlciogIGNsYXp6ICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICBpZiAoIGNsYXp6ICkKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7Ci0gIH0KLQotCi0gIEZUX0Vycm9yCi0gIEZUX0NyZWF0ZV9DbGFzc19jZmZfZmllbGRfaGFuZGxlcnMoIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGRl9GaWVsZF9IYW5kbGVyKiogIG91dHB1dF9jbGFzcyApCi0gIHsKLSAgICBDRkZfRmllbGRfSGFuZGxlciogIGNsYXp6ICA9IE5VTEw7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSA9IGxpYnJhcnktPm1lbW9yeTsKLQotICAgIGludCAgaSA9IDA7Ci0KLQotI3VuZGVmIENGRl9GSUVMRAotI2RlZmluZSBDRkZfRklFTEQoIGNvZGUsIG5hbWUsIGlkLCBraW5kICkgaSsrOwotI3VuZGVmIENGRl9GSUVMRF9ERUxUQQotI2RlZmluZSBDRkZfRklFTERfREVMVEEoIGNvZGUsIG5hbWUsIG1heCwgaWQgKSBpKys7Ci0jdW5kZWYgQ0ZGX0ZJRUxEX0NBTExCQUNLCi0jZGVmaW5lIENGRl9GSUVMRF9DQUxMQkFDSyggY29kZSwgbmFtZSwgaWQgKSBpKys7Ci0KLSNpbmNsdWRlICJjZmZ0b2tlbi5oIgotCi0gICAgaSsrOyAvKiB7IDAsIDAsIDAsIDAsIDAsIDAsIDAgfSAqLwotCi0gICAgaWYgKCBGVF9BTExPQyggY2xhenosIHNpemVvZiAoIENGRl9GaWVsZF9IYW5kbGVyICkgKiBpICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgaSA9IDA7Ci0KLQotI2lmbmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotCi0KLSN1bmRlZiBDRkZfRklFTERfQ0FMTEJBQ0sKLSNkZWZpbmUgQ0ZGX0ZJRUxEX0NBTExCQUNLKCBjb2RlXywgbmFtZV8sIGlkXyApICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0ua2luZCAgICAgICAgID0gY2ZmX2tpbmRfY2FsbGJhY2s7ICAgXAotICAgICAgICAgIGNsYXp6W2ldLmNvZGUgICAgICAgICA9IGNvZGVfIHwgQ0ZGQ09ERTsgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5vZmZzZXQgICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0uc2l6ZSAgICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLnJlYWRlciAgICAgICA9IGNmZl9wYXJzZV8gIyMgbmFtZV87IFwKLSAgICAgICAgICBjbGF6eltpXS5hcnJheV9tYXggICAgPSAwOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0uY291bnRfb2Zmc2V0ID0gMDsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGkrKzsKLQotI3VuZGVmICBDRkZfRklFTEQKLSNkZWZpbmUgQ0ZGX0ZJRUxEKCBjb2RlXywgbmFtZV8sIGlkXywga2luZF8gKSAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5raW5kICAgICAgICAgPSBraW5kXzsgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5jb2RlICAgICAgICAgPSBjb2RlXyB8IENGRkNPREU7ICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5vZmZzZXQgICAgICAgPSBGVF9GSUVMRF9PRkZTRVQoIG5hbWVfICk7IFwKLSAgICAgICAgICBjbGF6eltpXS5zaXplICAgICAgICAgPSBGVF9GSUVMRF9TSVpFKCBuYW1lXyApOyAgIFwKLSAgICAgICAgICBjbGF6eltpXS5yZWFkZXIgICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5hcnJheV9tYXggICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5jb3VudF9vZmZzZXQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBpKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQotI3VuZGVmICBDRkZfRklFTERfREVMVEEKLSNkZWZpbmUgQ0ZGX0ZJRUxEX0RFTFRBKCBjb2RlXywgbmFtZV8sIG1heF8sIGlkXyApICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmtpbmQgICAgICAgICA9IGNmZl9raW5kX2RlbHRhOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0uY29kZSAgICAgICAgID0gY29kZV8gfCBDRkZDT0RFOyAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5vZmZzZXQgICAgICAgPSBGVF9GSUVMRF9PRkZTRVQoIG5hbWVfICk7ICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLnNpemUgICAgICAgICA9IEZUX0ZJRUxEX1NJWkVfREVMVEEoIG5hbWVfICk7ICAgICBcCi0gICAgICAgICAgY2xhenpbaV0ucmVhZGVyICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5hcnJheV9tYXggICAgPSBtYXhfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmNvdW50X29mZnNldCA9IEZUX0ZJRUxEX09GRlNFVCggbnVtXyAjIyBuYW1lXyApOyBcCi0gICAgICAgICAgaSsrOwotCi0jaW5jbHVkZSAiY2ZmdG9rZW4uaCIKLQotICAgIGNsYXp6W2ldLmtpbmQgICAgICAgICA9IDA7Ci0gICAgY2xhenpbaV0uY29kZSAgICAgICAgID0gMDsKLSAgICBjbGF6eltpXS5vZmZzZXQgICAgICAgPSAwOwotICAgIGNsYXp6W2ldLnNpemUgICAgICAgICA9IDA7Ci0gICAgY2xhenpbaV0ucmVhZGVyICAgICAgID0gMDsKLSAgICBjbGF6eltpXS5hcnJheV9tYXggICAgPSAwOwotICAgIGNsYXp6W2ldLmNvdW50X29mZnNldCA9IDA7Ci0KLQotI2Vsc2UgLyogRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotCi0jdW5kZWYgQ0ZGX0ZJRUxEX0NBTExCQUNLCi0jZGVmaW5lIENGRl9GSUVMRF9DQUxMQkFDSyggY29kZV8sIG5hbWVfLCBpZF8gKSAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmtpbmQgICAgICAgICA9IGNmZl9raW5kX2NhbGxiYWNrOyAgIFwKLSAgICAgICAgICBjbGF6eltpXS5jb2RlICAgICAgICAgPSBjb2RlXyB8IENGRkNPREU7ICAgICBcCi0gICAgICAgICAgY2xhenpbaV0ub2Zmc2V0ICAgICAgID0gMDsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLnNpemUgICAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5yZWFkZXIgICAgICAgPSBjZmZfcGFyc2VfICMjIG5hbWVfOyBcCi0gICAgICAgICAgY2xhenpbaV0uYXJyYXlfbWF4ICAgID0gMDsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmNvdW50X29mZnNldCA9IDA7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5pZCAgICAgICAgICAgPSBpZF87ICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaSsrOwotCi0jdW5kZWYgIENGRl9GSUVMRAotI2RlZmluZSBDRkZfRklFTEQoIGNvZGVfLCBuYW1lXywgaWRfLCBraW5kXyApICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmtpbmQgICAgICAgICA9IGtpbmRfOyAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmNvZGUgICAgICAgICA9IGNvZGVfIHwgQ0ZGQ09ERTsgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLm9mZnNldCAgICAgICA9IEZUX0ZJRUxEX09GRlNFVCggbmFtZV8gKTsgXAotICAgICAgICAgIGNsYXp6W2ldLnNpemUgICAgICAgICA9IEZUX0ZJRUxEX1NJWkUoIG5hbWVfICk7ICAgXAotICAgICAgICAgIGNsYXp6W2ldLnJlYWRlciAgICAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmFycmF5X21heCAgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmNvdW50X29mZnNldCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmlkICAgICAgICAgICA9IGlkXzsgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGkrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCi0jdW5kZWYgIENGRl9GSUVMRF9ERUxUQQotI2RlZmluZSBDRkZfRklFTERfREVMVEEoIGNvZGVfLCBuYW1lXywgbWF4XywgaWRfICkgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0ua2luZCAgICAgICAgID0gY2ZmX2tpbmRfZGVsdGE7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5jb2RlICAgICAgICAgPSBjb2RlXyB8IENGRkNPREU7ICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLm9mZnNldCAgICAgICA9IEZUX0ZJRUxEX09GRlNFVCggbmFtZV8gKTsgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0uc2l6ZSAgICAgICAgID0gRlRfRklFTERfU0laRV9ERUxUQSggbmFtZV8gKTsgICAgIFwKLSAgICAgICAgICBjbGF6eltpXS5yZWFkZXIgICAgICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNsYXp6W2ldLmFycmF5X21heCAgICA9IG1heF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2xhenpbaV0uY291bnRfb2Zmc2V0ID0gRlRfRklFTERfT0ZGU0VUKCBudW1fICMjIG5hbWVfICk7IFwKLSAgICAgICAgICBjbGF6eltpXS5pZCAgICAgICAgICAgPSBpZF87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGkrKzsKLQotI2luY2x1ZGUgImNmZnRva2VuLmgiCi0KLSAgICBjbGF6eltpXS5raW5kICAgICAgICAgPSAwOwotICAgIGNsYXp6W2ldLmNvZGUgICAgICAgICA9IDA7Ci0gICAgY2xhenpbaV0ub2Zmc2V0ICAgICAgID0gMDsKLSAgICBjbGF6eltpXS5zaXplICAgICAgICAgPSAwOwotICAgIGNsYXp6W2ldLnJlYWRlciAgICAgICA9IDA7Ci0gICAgY2xhenpbaV0uYXJyYXlfbWF4ICAgID0gMDsKLSAgICBjbGF6eltpXS5jb3VudF9vZmZzZXQgPSAwOwotICAgIGNsYXp6W2ldLmlkICAgICAgICAgICA9IDA7Ci0KLQotI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLQotICAgICpvdXRwdXRfY2xhc3MgPSBjbGF6ejsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjZmZfcGFyc2VyX3J1biggQ0ZGX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgc3RhcnQsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICBsaW1pdCApCi0gIHsKLSAgICBGVF9CeXRlKiAgICBwICAgICAgID0gc3RhcnQ7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3IgICA9IEZUX0Vycl9PazsKLSAgICBGVF9MaWJyYXJ5ICBsaWJyYXJ5ID0gcGFyc2VyLT5saWJyYXJ5OwotICAgIEZUX1VOVVNFRCggbGlicmFyeSApOwotCi0KLSAgICBwYXJzZXItPnRvcCAgICA9IHBhcnNlci0+c3RhY2s7Ci0gICAgcGFyc2VyLT5zdGFydCAgPSBzdGFydDsKLSAgICBwYXJzZXItPmxpbWl0ICA9IGxpbWl0OwotICAgIHBhcnNlci0+Y3Vyc29yID0gc3RhcnQ7Ci0KLSAgICB3aGlsZSAoIHAgPCBsaW1pdCApCi0gICAgewotICAgICAgRlRfVUludCAgdiA9ICpwOwotCi0KLSAgICAgIGlmICggdiA+PSAyNyAmJiB2ICE9IDMxICkKLSAgICAgIHsKLSAgICAgICAgLyogaXQncyBhIG51bWJlcjsgd2Ugd2lsbCBwdXNoIGl0cyBwb3NpdGlvbiBvbiB0aGUgc3RhY2sgKi8KLSAgICAgICAgaWYgKCBwYXJzZXItPnRvcCAtIHBhcnNlci0+c3RhY2sgPj0gQ0ZGX01BWF9TVEFDS19ERVBUSCApCi0gICAgICAgICAgZ290byBTdGFja19PdmVyZmxvdzsKLQotICAgICAgICAqcGFyc2VyLT50b3AgKysgPSBwOwotCi0gICAgICAgIC8qIG5vdywgc2tpcCBpdCAqLwotICAgICAgICBpZiAoIHYgPT0gMzAgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogc2tpcCByZWFsIG51bWJlciAqLwotICAgICAgICAgIHArKzsKLSAgICAgICAgICBmb3IgKDs7KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIEFuIHVudGVybWluYXRlZCBmbG9hdGluZyBwb2ludCBudW1iZXIgYXQgdGhlICovCi0gICAgICAgICAgICAvKiBlbmQgb2YgYSBkaWN0aW9uYXJ5IGlzIGludmFsaWQgYnV0IGhhcm1sZXNzLiAqLwotICAgICAgICAgICAgaWYgKCBwID49IGxpbWl0ICkKLSAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgdiA9IHBbMF0gPj4gNDsKLSAgICAgICAgICAgIGlmICggdiA9PSAxNSApCi0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgdiA9IHBbMF0gJiAweEY7Ci0gICAgICAgICAgICBpZiAoIHYgPT0gMTUgKQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIHArKzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHYgPT0gMjggKQotICAgICAgICAgIHAgKz0gMjsKLSAgICAgICAgZWxzZSBpZiAoIHYgPT0gMjkgKQotICAgICAgICAgIHAgKz0gNDsKLSAgICAgICAgZWxzZSBpZiAoIHYgPiAyNDYgKQotICAgICAgICAgIHAgKz0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogVGhpcyBpcyBub3QgYSBudW1iZXIsIGhlbmNlIGl0J3MgYW4gb3BlcmF0b3IuICBDb21wdXRlIGl0cyBjb2RlICovCi0gICAgICAgIC8qIGFuZCBsb29rIGZvciBpdCBpbiBvdXIgY3VycmVudCBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgICAgICAgY29kZTsKLSAgICAgICAgRlRfVUludCAgICAgICAgICAgICAgICAgICBudW1fYXJncyA9IChGVF9VSW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBwYXJzZXItPnRvcCAtIHBhcnNlci0+c3RhY2sgKTsKLSAgICAgICAgY29uc3QgQ0ZGX0ZpZWxkX0hhbmRsZXIqICBmaWVsZDsKLQotCi0gICAgICAgICpwYXJzZXItPnRvcCA9IHA7Ci0gICAgICAgIGNvZGUgPSB2OwotICAgICAgICBpZiAoIHYgPT0gMTIgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogdHdvIGJ5dGUgb3BlcmF0b3IgKi8KLSAgICAgICAgICBwKys7Ci0gICAgICAgICAgaWYgKCBwID49IGxpbWl0ICkKLSAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotCi0gICAgICAgICAgY29kZSA9IDB4MTAwIHwgcFswXTsKLSAgICAgICAgfQotICAgICAgICBjb2RlID0gY29kZSB8IHBhcnNlci0+b2JqZWN0X2NvZGU7Ci0KLSAgICAgICAgZm9yICggZmllbGQgPSBDRkZfRklFTERfSEFORExFUlNfR0VUOyBmaWVsZC0+a2luZDsgZmllbGQrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGZpZWxkLT5jb2RlID09IChGVF9JbnQpY29kZSApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogd2UgZm91bmQgb3VyIGZpZWxkJ3MgaGFuZGxlcjsgcmVhZCBpdCAqLwotICAgICAgICAgICAgRlRfTG9uZyAgIHZhbDsKLSAgICAgICAgICAgIEZUX0J5dGUqICBxID0gKEZUX0J5dGUqKXBhcnNlci0+b2JqZWN0ICsgZmllbGQtPm9mZnNldDsKLQotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgICVzIiwgZmllbGQtPmlkICkpOwotI2VuZGlmCi0KLSAgICAgICAgICAgIC8qIGNoZWNrIHRoYXQgd2UgaGF2ZSBlbm91Z2ggYXJndW1lbnRzIC0tIGV4Y2VwdCBmb3IgKi8KLSAgICAgICAgICAgIC8qIGRlbHRhIGVuY29kZWQgYXJyYXlzLCB3aGljaCBjYW4gYmUgZW1wdHkgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICggZmllbGQtPmtpbmQgIT0gY2ZmX2tpbmRfZGVsdGEgJiYgbnVtX2FyZ3MgPCAxICkKLSAgICAgICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoIGZpZWxkLT5raW5kICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgY2ZmX2tpbmRfYm9vbDoKLSAgICAgICAgICAgIGNhc2UgY2ZmX2tpbmRfc3RyaW5nOgotICAgICAgICAgICAgY2FzZSBjZmZfa2luZF9udW06Ci0gICAgICAgICAgICAgIHZhbCA9IGNmZl9wYXJzZV9udW0oIHBhcnNlci0+c3RhY2sgKTsKLSAgICAgICAgICAgICAgZ290byBTdG9yZV9OdW1iZXI7Ci0KLSAgICAgICAgICAgIGNhc2UgY2ZmX2tpbmRfZml4ZWQ6Ci0gICAgICAgICAgICAgIHZhbCA9IGNmZl9wYXJzZV9maXhlZCggcGFyc2VyLT5zdGFjayApOwotICAgICAgICAgICAgICBnb3RvIFN0b3JlX051bWJlcjsKLQotICAgICAgICAgICAgY2FzZSBjZmZfa2luZF9maXhlZF90aG91c2FuZDoKLSAgICAgICAgICAgICAgdmFsID0gY2ZmX3BhcnNlX2ZpeGVkX3NjYWxlZCggcGFyc2VyLT5zdGFjaywgMyApOwotCi0gICAgICAgICAgICBTdG9yZV9OdW1iZXI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoIGZpZWxkLT5zaXplICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICBjYXNlICg4IC8gRlRfQ0hBUl9CSVQpOgotICAgICAgICAgICAgICAgICooRlRfQnl0ZSopcSA9IChGVF9CeXRlKXZhbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlICgxNiAvIEZUX0NIQVJfQklUKToKLSAgICAgICAgICAgICAgICAqKEZUX1Nob3J0KilxID0gKEZUX1Nob3J0KXZhbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlICgzMiAvIEZUX0NIQVJfQklUKToKLSAgICAgICAgICAgICAgICAqKEZUX0ludDMyKilxID0gKEZUX0ludCl2YWw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgZGVmYXVsdDogIC8qIGZvciA2NC1iaXQgc3lzdGVtcyAqLwotICAgICAgICAgICAgICAgICooRlRfTG9uZyopcSA9IHZhbDsKLSAgICAgICAgICAgICAgfQotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgICAgICAgc3dpdGNoICggZmllbGQtPmtpbmQgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgY2ZmX2tpbmRfYm9vbDoKLSAgICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiICVzXG4iLCB2YWwgPyAidHJ1ZSIgOiAiZmFsc2UiICkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgY2ZmX2tpbmRfc3RyaW5nOgotICAgICAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgJWxkIChTSUQpXG4iLCB2YWwgKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSBjZmZfa2luZF9udW06Ci0gICAgICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiAlbGRcbiIsIHZhbCApKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlIGNmZl9raW5kX2ZpeGVkOgotICAgICAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgJWZcbiIsIChkb3VibGUpdmFsIC8gNjU1MzYgKSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSBjZmZfa2luZF9maXhlZF90aG91c2FuZDoKLSAgICAgICAgICAgICAgICBGVF9UUkFDRTQoKCAiICVmXG4iLCAoZG91YmxlKXZhbCAvIDY1NTM2IC8gMTAwMCApKTsKLQotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIDsgLyogbmV2ZXIgcmVhY2hlZCAqLwotICAgICAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBjZmZfa2luZF9kZWx0YToKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgcWNvdW50ID0gKEZUX0J5dGUqKXBhcnNlci0+b2JqZWN0ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmNvdW50X29mZnNldDsKLQotICAgICAgICAgICAgICAgIEZUX0J5dGUqKiAgZGF0YSA9IHBhcnNlci0+c3RhY2s7Ci0KLQotICAgICAgICAgICAgICAgIGlmICggbnVtX2FyZ3MgPiBmaWVsZC0+YXJyYXlfbWF4ICkKLSAgICAgICAgICAgICAgICAgIG51bV9hcmdzID0gZmllbGQtPmFycmF5X21heDsKLQotICAgICAgICAgICAgICAgIEZUX1RSQUNFNCgoICIgWyIgKSk7Ci0KLSAgICAgICAgICAgICAgICAvKiBzdG9yZSBjb3VudCAqLwotICAgICAgICAgICAgICAgICpxY291bnQgPSAoRlRfQnl0ZSludW1fYXJnczsKLQotICAgICAgICAgICAgICAgIHZhbCA9IDA7Ci0gICAgICAgICAgICAgICAgd2hpbGUgKCBudW1fYXJncyA+IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIHZhbCArPSBjZmZfcGFyc2VfbnVtKCBkYXRhKysgKTsKLSAgICAgICAgICAgICAgICAgIHN3aXRjaCAoIGZpZWxkLT5zaXplICkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGNhc2UgKDggLyBGVF9DSEFSX0JJVCk6Ci0gICAgICAgICAgICAgICAgICAgICooRlRfQnl0ZSopcSA9IChGVF9CeXRlKXZhbDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgIGNhc2UgKDE2IC8gRlRfQ0hBUl9CSVQpOgotICAgICAgICAgICAgICAgICAgICAqKEZUX1Nob3J0KilxID0gKEZUX1Nob3J0KXZhbDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgIGNhc2UgKDMyIC8gRlRfQ0hBUl9CSVQpOgotICAgICAgICAgICAgICAgICAgICAqKEZUX0ludDMyKilxID0gKEZUX0ludCl2YWw7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgLyogZm9yIDY0LWJpdCBzeXN0ZW1zICovCi0gICAgICAgICAgICAgICAgICAgICooRlRfTG9uZyopcSA9IHZhbDsKLSAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgRlRfVFJBQ0U0KCggIiAlbGQiLCB2YWwgKSk7Ci0KLSAgICAgICAgICAgICAgICAgIHEgKz0gZmllbGQtPnNpemU7Ci0gICAgICAgICAgICAgICAgICBudW1fYXJncy0tOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEZUX1RSQUNFNCgoICJdXG4iICkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OiAgLyogY2FsbGJhY2sgKi8KLSAgICAgICAgICAgICAgZXJyb3IgPSBmaWVsZC0+cmVhZGVyKCBwYXJzZXIgKTsKLSAgICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ290byBGb3VuZDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB0aGlzIGlzIGFuIHVua25vd24gb3BlcmF0b3IsIG9yIGl0IGlzIHVuc3VwcG9ydGVkOyAqLwotICAgICAgICAvKiB3ZSB3aWxsIGlnbm9yZSBpdCBmb3Igbm93LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBGb3VuZDoKLSAgICAgICAgLyogY2xlYXIgc3RhY2sgKi8KLSAgICAgICAgcGFyc2VyLT50b3AgPSBwYXJzZXItPnN0YWNrOwotICAgICAgfQotICAgICAgcCsrOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLQotICBTdGFja19PdmVyZmxvdzoKLSAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgZ290byBFeGl0OwotCi0gIFN0YWNrX1VuZGVyZmxvdzoKLSAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgZ290byBFeGl0OwotCi0gIFN5bnRheF9FcnJvcjoKLSAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgZ290byBFeGl0OwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZnBhcnNlLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZnBhcnNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZDAyZWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZwYXJzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZnBhcnNlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDRkYgdG9rZW4gc3RyZWFtIHBhcnNlciAoc3BlY2lmaWNhdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0NGRl9QQVJTRV9IX18KLSNkZWZpbmUgX19DRkZfUEFSU0VfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAiY2ZmdHlwZXMuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgQ0ZGX01BWF9TVEFDS19ERVBUSCAgOTYKLQotI2RlZmluZSBDRkZfQ09ERV9UT1BESUNUICAweDEwMDAKLSNkZWZpbmUgQ0ZGX0NPREVfUFJJVkFURSAgMHgyMDAwCi0KLQotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX1BhcnNlclJlY18KLSAgewotICAgIEZUX0xpYnJhcnkgbGlicmFyeTsKLSAgICBGVF9CeXRlKiAgIHN0YXJ0OwotICAgIEZUX0J5dGUqICAgbGltaXQ7Ci0gICAgRlRfQnl0ZSogICBjdXJzb3I7Ci0KLSAgICBGVF9CeXRlKiAgIHN0YWNrW0NGRl9NQVhfU1RBQ0tfREVQVEggKyAxXTsKLSAgICBGVF9CeXRlKiogIHRvcDsKLQotICAgIEZUX1VJbnQgICAgb2JqZWN0X2NvZGU7Ci0gICAgdm9pZCogICAgICBvYmplY3Q7Ci0KLSAgfSBDRkZfUGFyc2VyUmVjLCAqQ0ZGX1BhcnNlcjsKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2ZmX3BhcnNlcl9pbml0KCBDRkZfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgY29kZSwKLSAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgRlRfTGlicmFyeSAgbGlicmFyeSk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2ZmX3BhcnNlcl9ydW4oIENGRl9QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgbGltaXQgKTsKLQotCi0gIGVudW0KLSAgewotICAgIGNmZl9raW5kX25vbmUgPSAwLAotICAgIGNmZl9raW5kX251bSwKLSAgICBjZmZfa2luZF9maXhlZCwKLSAgICBjZmZfa2luZF9maXhlZF90aG91c2FuZCwKLSAgICBjZmZfa2luZF9zdHJpbmcsCi0gICAgY2ZmX2tpbmRfYm9vbCwKLSAgICBjZmZfa2luZF9kZWx0YSwKLSAgICBjZmZfa2luZF9jYWxsYmFjaywKLQotICAgIGNmZl9raW5kX21heCAgLyogZG8gbm90IHJlbW92ZSAqLwotICB9OwotCi0KLSAgLyogbm93IGdlbmVyYXRlIGhhbmRsZXJzIGZvciB0aGUgbW9zdCBzaW1wbGUgZmllbGRzICovCi0gIHR5cGVkZWYgRlRfRXJyb3IgICgqQ0ZGX0ZpZWxkX1JlYWRlcikoIENGRl9QYXJzZXIgIHBhcnNlciApOwotCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfRmllbGRfSGFuZGxlcl8KLSAgewotICAgIGludCAgICAgICAgICAgICAgIGtpbmQ7Ci0gICAgaW50ICAgICAgICAgICAgICAgY29kZTsKLSAgICBGVF9VSW50ICAgICAgICAgICBvZmZzZXQ7Ci0gICAgRlRfQnl0ZSAgICAgICAgICAgc2l6ZTsKLSAgICBDRkZfRmllbGRfUmVhZGVyICByZWFkZXI7Ci0gICAgRlRfVUludCAgICAgICAgICAgYXJyYXlfbWF4OwotICAgIEZUX1VJbnQgICAgICAgICAgIGNvdW50X29mZnNldDsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgY29uc3QgY2hhciogICAgICAgaWQ7Ci0jZW5kaWYKLQotICB9IENGRl9GaWVsZF9IYW5kbGVyOwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19DRkZfUEFSU0VfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZnBpYy5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZwaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQwZGVjNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZnBpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZnBpYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3IgY2ZmIG1vZHVsZS4gICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlICJjZmZjbWFwLmgiCi0jaW5jbHVkZSAiY2ZmcGljLmgiCi0jaW5jbHVkZSAiY2ZmZXJycy5oIgotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0gIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgUElDIGluaXQgZnVuY3Rpb25zIGZyb20gY2ZmZHJpdnIuYyAqLwotICBGVF9FcnJvcgotICBGVF9DcmVhdGVfQ2xhc3NfY2ZmX3NlcnZpY2VzKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyoqICBvdXRwdXRfY2xhc3MgKTsKLSAgdm9pZAotICBGVF9EZXN0cm95X0NsYXNzX2NmZl9zZXJ2aWNlcyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2VydmljZURlc2NSZWMqICBjbGF6eiApOwotICB2b2lkCi0gIEZUX0luaXRfQ2xhc3NfY2ZmX3NlcnZpY2VfcHNfaW5mbyggRlRfTGlicmFyeSAgICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VfUHNJbmZvUmVjKiAgY2xhenogKTsKLSAgdm9pZAotICBGVF9Jbml0X0NsYXNzX2NmZl9zZXJ2aWNlX2dseXBoX2RpY3QoIEZUX0xpYnJhcnkgICAgICAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlX0dseXBoRGljdFJlYyogIGNsYXp6ICk7Ci0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc19jZmZfc2VydmljZV9wc19uYW1lKCBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VfUHNGb250TmFtZVJlYyogIGNsYXp6ICk7Ci0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc19jZmZfc2VydmljZV9nZXRfY21hcF9pbmZvKCBGVF9MaWJyYXJ5ICAgICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VfVFRDTWFwc1JlYyogIGNsYXp6ICk7Ci0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc19jZmZfc2VydmljZV9jaWRfaW5mbyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlX0NJRFJlYyogIGNsYXp6ICk7Ci0KLSAgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBQSUMgaW5pdCBmdW5jdGlvbnMgZnJvbSBjZmZwYXJzZS5jICovCi0gIEZUX0Vycm9yCi0gIEZUX0NyZWF0ZV9DbGFzc19jZmZfZmllbGRfaGFuZGxlcnMoIEZUX0xpYnJhcnkgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGRl9GaWVsZF9IYW5kbGVyKiogIG91dHB1dF9jbGFzcyApOwotICB2b2lkCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfY2ZmX2ZpZWxkX2hhbmRsZXJzKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkZfRmllbGRfSGFuZGxlciogIGNsYXp6ICk7Ci0KLQotICB2b2lkCi0gIGNmZl9kcml2ZXJfY2xhc3NfcGljX2ZyZWUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgRlRfUElDX0NvbnRhaW5lciogIHBpY19jb250YWluZXIgPSAmbGlicmFyeS0+cGljX2NvbnRhaW5lcjsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5ICAgICAgICA9IGxpYnJhcnktPm1lbW9yeTsKLQotCi0gICAgaWYgKCBwaWNfY29udGFpbmVyLT5jZmYgKQotICAgIHsKLSAgICAgIENmZk1vZHVsZVBJQyogIGNvbnRhaW5lciA9IChDZmZNb2R1bGVQSUMqKXBpY19jb250YWluZXItPmNmZjsKLQotCi0gICAgICBpZiAoIGNvbnRhaW5lci0+Y2ZmX3NlcnZpY2VzICkKLSAgICAgICAgRlRfRGVzdHJveV9DbGFzc19jZmZfc2VydmljZXMoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXItPmNmZl9zZXJ2aWNlcyApOwotICAgICAgY29udGFpbmVyLT5jZmZfc2VydmljZXMgPSBOVUxMOwotICAgICAgaWYgKCBjb250YWluZXItPmNmZl9maWVsZF9oYW5kbGVycyApCi0gICAgICAgIEZUX0Rlc3Ryb3lfQ2xhc3NfY2ZmX2ZpZWxkX2hhbmRsZXJzKAotICAgICAgICAgIGxpYnJhcnksIGNvbnRhaW5lci0+Y2ZmX2ZpZWxkX2hhbmRsZXJzICk7Ci0gICAgICBjb250YWluZXItPmNmZl9maWVsZF9oYW5kbGVycyA9IE5VTEw7Ci0gICAgICBGVF9GUkVFKCBjb250YWluZXIgKTsKLSAgICAgIHBpY19jb250YWluZXItPmNmZiA9IE5VTEw7Ci0gICAgfQotICB9Ci0KLQotICBGVF9FcnJvcgotICBjZmZfZHJpdmVyX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yICAgICAgICAgPSBGVF9FcnJfT2s7Ci0gICAgQ2ZmTW9kdWxlUElDKiAgICAgIGNvbnRhaW5lciAgICAgPSBOVUxMOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICAvKiBhbGxvY2F0ZSBwb2ludGVyLCBjbGVhciBhbmQgc2V0IGdsb2JhbCBjb250YWluZXIgcG9pbnRlciAqLwotICAgIGlmICggRlRfQUxMT0MgKCBjb250YWluZXIsIHNpemVvZiAoICpjb250YWluZXIgKSApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICBGVF9NRU1fU0VUKCBjb250YWluZXIsIDAsIHNpemVvZiAoICpjb250YWluZXIgKSApOwotICAgIHBpY19jb250YWluZXItPmNmZiA9IGNvbnRhaW5lcjsKLQotICAgIC8qIGluaXRpYWxpemUgcG9pbnRlciB0YWJsZSAtICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIHRoaXMgaXMgaG93IHRoZSBtb2R1bGUgdXN1YWxseSBleHBlY3RzIHRoaXMgZGF0YSAqLwotICAgIGVycm9yID0gRlRfQ3JlYXRlX0NsYXNzX2NmZl9zZXJ2aWNlcyggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZXItPmNmZl9zZXJ2aWNlcyApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZXJyb3IgPSBGVF9DcmVhdGVfQ2xhc3NfY2ZmX2ZpZWxkX2hhbmRsZXJzKAotICAgICAgICAgICAgICBsaWJyYXJ5LCAmY29udGFpbmVyLT5jZmZfZmllbGRfaGFuZGxlcnMgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIEZUX0luaXRfQ2xhc3NfY2ZmX3NlcnZpY2VfcHNfaW5mbygKLSAgICAgIGxpYnJhcnksICZjb250YWluZXItPmNmZl9zZXJ2aWNlX3BzX2luZm8gKTsKLSAgICBGVF9Jbml0X0NsYXNzX2NmZl9zZXJ2aWNlX2dseXBoX2RpY3QoCi0gICAgICBsaWJyYXJ5LCAmY29udGFpbmVyLT5jZmZfc2VydmljZV9nbHlwaF9kaWN0ICk7Ci0gICAgRlRfSW5pdF9DbGFzc19jZmZfc2VydmljZV9wc19uYW1lKAotICAgICAgbGlicmFyeSwgJmNvbnRhaW5lci0+Y2ZmX3NlcnZpY2VfcHNfbmFtZSApOwotICAgIEZUX0luaXRfQ2xhc3NfY2ZmX3NlcnZpY2VfZ2V0X2NtYXBfaW5mbygKLSAgICAgIGxpYnJhcnksICZjb250YWluZXItPmNmZl9zZXJ2aWNlX2dldF9jbWFwX2luZm8gKTsKLSAgICBGVF9Jbml0X0NsYXNzX2NmZl9zZXJ2aWNlX2NpZF9pbmZvKAotICAgICAgbGlicmFyeSwgJmNvbnRhaW5lci0+Y2ZmX3NlcnZpY2VfY2lkX2luZm8gKTsKLSAgICBGVF9Jbml0X0NsYXNzX2NmZl9jbWFwX2VuY29kaW5nX2NsYXNzX3JlYygKLSAgICAgIGxpYnJhcnksICZjb250YWluZXItPmNmZl9jbWFwX2VuY29kaW5nX2NsYXNzX3JlYyApOwotICAgIEZUX0luaXRfQ2xhc3NfY2ZmX2NtYXBfdW5pY29kZV9jbGFzc19yZWMoCi0gICAgICBsaWJyYXJ5LCAmY29udGFpbmVyLT5jZmZfY21hcF91bmljb2RlX2NsYXNzX3JlYyApOwotCi0gIEV4aXQ6Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBjZmZfZHJpdmVyX2NsYXNzX3BpY19mcmVlKCBsaWJyYXJ5ICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZwaWMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jZmYvY2ZmcGljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMjIxYTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZwaWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjZmZwaWMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIGNmZiBtb2R1bGUuICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19DRkZQSUNfSF9fCi0jZGVmaW5lIF9fQ0ZGUElDX0hfXwotCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BJQ19ICi0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIENGRl9TRVJWSUNFX1BTX0lORk9fR0VUICAgICAgICAgIGNmZl9zZXJ2aWNlX3BzX2luZm8KLSNkZWZpbmUgQ0ZGX1NFUlZJQ0VfR0xZUEhfRElDVF9HRVQgICAgICAgY2ZmX3NlcnZpY2VfZ2x5cGhfZGljdAotI2RlZmluZSBDRkZfU0VSVklDRV9QU19OQU1FX0dFVCAgICAgICAgICBjZmZfc2VydmljZV9wc19uYW1lCi0jZGVmaW5lIENGRl9TRVJWSUNFX0dFVF9DTUFQX0lORk9fR0VUICAgIGNmZl9zZXJ2aWNlX2dldF9jbWFwX2luZm8KLSNkZWZpbmUgQ0ZGX1NFUlZJQ0VfQ0lEX0lORk9fR0VUICAgICAgICAgY2ZmX3NlcnZpY2VfY2lkX2luZm8KLSNkZWZpbmUgQ0ZGX1NFUlZJQ0VfUFJPUEVSVElFU19HRVQgICAgICAgY2ZmX3NlcnZpY2VfcHJvcGVydGllcwotI2RlZmluZSBDRkZfU0VSVklDRVNfR0VUICAgICAgICAgICAgICAgICBjZmZfc2VydmljZXMKLSNkZWZpbmUgQ0ZGX0NNQVBfRU5DT0RJTkdfQ0xBU1NfUkVDX0dFVCAgY2ZmX2NtYXBfZW5jb2RpbmdfY2xhc3NfcmVjCi0jZGVmaW5lIENGRl9DTUFQX1VOSUNPREVfQ0xBU1NfUkVDX0dFVCAgIGNmZl9jbWFwX3VuaWNvZGVfY2xhc3NfcmVjCi0jZGVmaW5lIENGRl9GSUVMRF9IQU5ETEVSU19HRVQgICAgICAgICAgIGNmZl9maWVsZF9oYW5kbGVycwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jaW5jbHVkZSBGVF9TRVJWSUNFX0dMWVBIX0RJQ1RfSAotI2luY2x1ZGUgImNmZnBhcnNlLmgiCi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfSU5GT19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfTkFNRV9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1RUX0NNQVBfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9DSURfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QUk9QRVJUSUVTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICB0eXBlZGVmIHN0cnVjdCAgQ2ZmTW9kdWxlUElDXwotICB7Ci0gICAgRlRfU2VydmljZURlc2NSZWMqICAgICAgICBjZmZfc2VydmljZXM7Ci0gICAgQ0ZGX0ZpZWxkX0hhbmRsZXIqICAgICAgICBjZmZfZmllbGRfaGFuZGxlcnM7Ci0gICAgRlRfU2VydmljZV9Qc0luZm9SZWMgICAgICBjZmZfc2VydmljZV9wc19pbmZvOwotICAgIEZUX1NlcnZpY2VfR2x5cGhEaWN0UmVjICAgY2ZmX3NlcnZpY2VfZ2x5cGhfZGljdDsKLSAgICBGVF9TZXJ2aWNlX1BzRm9udE5hbWVSZWMgIGNmZl9zZXJ2aWNlX3BzX25hbWU7Ci0gICAgRlRfU2VydmljZV9UVENNYXBzUmVjICAgICBjZmZfc2VydmljZV9nZXRfY21hcF9pbmZvOwotICAgIEZUX1NlcnZpY2VfQ0lEUmVjICAgICAgICAgY2ZmX3NlcnZpY2VfY2lkX2luZm87Ci0gICAgRlRfU2VydmljZV9Qcm9wZXJ0aWVzUmVjICBjZmZfc2VydmljZV9wcm9wZXJ0aWVzOwotICAgIEZUX0NNYXBfQ2xhc3NSZWMgICAgICAgICAgY2ZmX2NtYXBfZW5jb2RpbmdfY2xhc3NfcmVjOwotICAgIEZUX0NNYXBfQ2xhc3NSZWMgICAgICAgICAgY2ZmX2NtYXBfdW5pY29kZV9jbGFzc19yZWM7Ci0KLSAgfSBDZmZNb2R1bGVQSUM7Ci0KLQotI2RlZmluZSBHRVRfUElDKCBsaWIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChDZmZNb2R1bGVQSUMqKSggKGxpYiktPnBpY19jb250YWluZXIuY2ZmICkgKQotCi0jZGVmaW5lIENGRl9TRVJWSUNFX1BTX0lORk9fR0VUICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPmNmZl9zZXJ2aWNlX3BzX2luZm8gKQotI2RlZmluZSBDRkZfU0VSVklDRV9HTFlQSF9ESUNUX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT5jZmZfc2VydmljZV9nbHlwaF9kaWN0ICkKLSNkZWZpbmUgQ0ZGX1NFUlZJQ0VfUFNfTkFNRV9HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+Y2ZmX3NlcnZpY2VfcHNfbmFtZSApCi0jZGVmaW5lIENGRl9TRVJWSUNFX0dFVF9DTUFQX0lORk9fR0VUICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPmNmZl9zZXJ2aWNlX2dldF9jbWFwX2luZm8gKQotI2RlZmluZSBDRkZfU0VSVklDRV9DSURfSU5GT19HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+Y2ZmX3NlcnZpY2VfY2lkX2luZm8gKQotI2RlZmluZSBDRkZfU0VSVklDRV9QUk9QRVJUSUVTX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT5jZmZfc2VydmljZV9wcm9wZXJ0aWVzICkKLSNkZWZpbmUgQ0ZGX1NFUlZJQ0VTX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT5jZmZfc2VydmljZXMgKQotI2RlZmluZSBDRkZfQ01BUF9FTkNPRElOR19DTEFTU19SRUNfR0VUICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPmNmZl9jbWFwX2VuY29kaW5nX2NsYXNzX3JlYyApCi0jZGVmaW5lIENGRl9DTUFQX1VOSUNPREVfQ0xBU1NfUkVDX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT5jZmZfY21hcF91bmljb2RlX2NsYXNzX3JlYyApCi0jZGVmaW5lIENGRl9GSUVMRF9IQU5ETEVSU19HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+Y2ZmX2ZpZWxkX2hhbmRsZXJzICkKLQotICAvKiBzZWUgY2ZmcGljLmMgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiAqLwotICB2b2lkCi0gIGNmZl9kcml2ZXJfY2xhc3NfcGljX2ZyZWUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotICBGVF9FcnJvcgotICBjZmZfZHJpdmVyX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAvKiAqLwotCi0jZW5kaWYgLyogX19DRkZQSUNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZnRva2VuLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZnRva2VuLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMzIwNzYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZ0b2tlbi5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2ZmdG9rZW4uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIENGRiB0b2tlbiBkZWZpbml0aW9ucyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIENGRl9Gb250UmVjRGljdFJlYwotCi0jdW5kZWYgIENGRkNPREUKLSNkZWZpbmUgQ0ZGQ09ERSAgICAgICBDRkZDT0RFX1RPUERJQ1QKLQotICBDRkZfRklFTERfU1RSSU5HICAoIDAsICAgICB2ZXJzaW9uLCAgICAgICAgICAgICAiVmVyc2lvbiIgKQotICBDRkZfRklFTERfU1RSSU5HICAoIDEsICAgICBub3RpY2UsICAgICAgICAgICAgICAiTm90aWNlIiApCi0gIENGRl9GSUVMRF9TVFJJTkcgICggMHgxMDAsIGNvcHlyaWdodCwgICAgICAgICAgICJDb3B5cmlnaHQiICkKLSAgQ0ZGX0ZJRUxEX1NUUklORyAgKCAyLCAgICAgZnVsbF9uYW1lLCAgICAgICAgICAgIkZ1bGxOYW1lIiApCi0gIENGRl9GSUVMRF9TVFJJTkcgICggMywgICAgIGZhbWlseV9uYW1lLCAgICAgICAgICJGYW1pbHlOYW1lIiApCi0gIENGRl9GSUVMRF9TVFJJTkcgICggNCwgICAgIHdlaWdodCwgICAgICAgICAgICAgICJXZWlnaHQiICkKLSAgQ0ZGX0ZJRUxEX0JPT0wgICAgKCAweDEwMSwgaXNfZml4ZWRfcGl0Y2gsICAgICAgImlzRml4ZWRQaXRjaCIgKQotICBDRkZfRklFTERfRklYRUQgICAoIDB4MTAyLCBpdGFsaWNfYW5nbGUsICAgICAgICAiSXRhbGljQW5nbGUiICkKLSAgQ0ZGX0ZJRUxEX0ZJWEVEICAgKCAweDEwMywgdW5kZXJsaW5lX3Bvc2l0aW9uLCAgIlVuZGVybGluZVBvc2l0aW9uIiApCi0gIENGRl9GSUVMRF9GSVhFRCAgICggMHgxMDQsIHVuZGVybGluZV90aGlja25lc3MsICJVbmRlcmxpbmVUaGlja25lc3MiICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgKCAweDEwNSwgcGFpbnRfdHlwZSwgICAgICAgICAgIlBhaW50VHlwZSIgKQotICBDRkZfRklFTERfTlVNICAgICAoIDB4MTA2LCBjaGFyc3RyaW5nX3R5cGUsICAgICAiQ2hhcnN0cmluZ1R5cGUiICkKLSAgQ0ZGX0ZJRUxEX0NBTExCQUNLKCAweDEwNywgZm9udF9tYXRyaXgsICAgICAgICAgIkZvbnRNYXRyaXgiICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgKCAxMywgICAgdW5pcXVlX2lkLCAgICAgICAgICAgIlVuaXF1ZUlEIiApCi0gIENGRl9GSUVMRF9DQUxMQkFDSyggNSwgICAgIGZvbnRfYmJveCwgICAgICAgICAgICJGb250QkJveCIgKQotICBDRkZfRklFTERfTlVNICAgICAoIDB4MTA4LCBzdHJva2Vfd2lkdGgsICAgICAgICAiU3Ryb2tlV2lkdGgiICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgKCAxNSwgICAgY2hhcnNldF9vZmZzZXQsICAgICAgImNoYXJzZXQiICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgKCAxNiwgICAgZW5jb2Rpbmdfb2Zmc2V0LCAgICAgIkVuY29kaW5nIiApCi0gIENGRl9GSUVMRF9OVU0gICAgICggMTcsICAgIGNoYXJzdHJpbmdzX29mZnNldCwgICJDaGFyU3RyaW5ncyIgKQotICBDRkZfRklFTERfQ0FMTEJBQ0soIDE4LCAgICBwcml2YXRlX2RpY3QsICAgICAgICAiUHJpdmF0ZSIgKQotICBDRkZfRklFTERfTlVNICAgICAoIDB4MTE0LCBzeW50aGV0aWNfYmFzZSwgICAgICAiU3ludGhldGljQmFzZSIgKQotICBDRkZfRklFTERfU1RSSU5HICAoIDB4MTE1LCBlbWJlZGRlZF9wb3N0c2NyaXB0LCAiUG9zdFNjcmlwdCIgKQotCi0jaWYgMAotICBDRkZfRklFTERfU1RSSU5HICAoIDB4MTE2LCBiYXNlX2ZvbnRfbmFtZSwgICAgICAiQmFzZUZvbnROYW1lIiApCi0gIENGRl9GSUVMRF9ERUxUQSAgICggMHgxMTcsIGJhc2VfZm9udF9ibGVuZCwgMTYsICJCYXNlRm9udEJsZW5kIiApCi0gIENGRl9GSUVMRF9DQUxMQkFDSyggMHgxMTgsIG11bHRpcGxlX21hc3RlciwgICAgICJNdWx0aXBsZU1hc3RlciIgKQotICBDRkZfRklFTERfQ0FMTEJBQ0soIDB4MTE5LCBibGVuZF9heGlzX3R5cGVzLCAgICAiQmxlbmRBeGlzVHlwZXMiICkKLSNlbmRpZgotCi0gIENGRl9GSUVMRF9DQUxMQkFDSyggMHgxMUUsIGNpZF9yb3MsICAgICAgICAgICAgICAiUk9TIiApCi0gIENGRl9GSUVMRF9OVU0gICAgICggMHgxMUYsIGNpZF9mb250X3ZlcnNpb24sICAgICAiQ0lERm9udFZlcnNpb24iICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgKCAweDEyMCwgY2lkX2ZvbnRfcmV2aXNpb24sICAgICJDSURGb250UmV2aXNpb24iICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgKCAweDEyMSwgY2lkX2ZvbnRfdHlwZSwgICAgICAgICJDSURGb250VHlwZSIgKQotICBDRkZfRklFTERfTlVNICAgICAoIDB4MTIyLCBjaWRfY291bnQsICAgICAgICAgICAgIkNJRENvdW50IiApCi0gIENGRl9GSUVMRF9OVU0gICAgICggMHgxMjMsIGNpZF91aWRfYmFzZSwgICAgICAgICAiVUlEQmFzZSIgKQotICBDRkZfRklFTERfTlVNICAgICAoIDB4MTI0LCBjaWRfZmRfYXJyYXlfb2Zmc2V0LCAgIkZEQXJyYXkiICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgKCAweDEyNSwgY2lkX2ZkX3NlbGVjdF9vZmZzZXQsICJGRFNlbGVjdCIgKQotICBDRkZfRklFTERfU1RSSU5HICAoIDB4MTI2LCBjaWRfZm9udF9uYW1lLCAgICAgICAgIkZvbnROYW1lIiApCi0KLSNpZiAwCi0gIENGRl9GSUVMRF9OVU0gICAgICggMHgxMjcsIGNoYW1lbGVvbiwgIkNoYW1lbGVvbiIgKQotI2VuZGlmCi0KLQotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBDRkZfUHJpdmF0ZVJlYwotI3VuZGVmICBDRkZDT0RFCi0jZGVmaW5lIENGRkNPREUgICAgICAgQ0ZGQ09ERV9QUklWQVRFCi0KLSAgQ0ZGX0ZJRUxEX0RFTFRBICAgICAoIDYsICAgICBibHVlX3ZhbHVlcywgMTQsICAgICAgICAiQmx1ZVZhbHVlcyIgKQotICBDRkZfRklFTERfREVMVEEgICAgICggNywgICAgIG90aGVyX2JsdWVzLCAxMCwgICAgICAgICJPdGhlckJsdWVzIiApCi0gIENGRl9GSUVMRF9ERUxUQSAgICAgKCA4LCAgICAgZmFtaWx5X2JsdWVzLCAxNCwgICAgICAgIkZhbWlseUJsdWVzIiApCi0gIENGRl9GSUVMRF9ERUxUQSAgICAgKCA5LCAgICAgZmFtaWx5X290aGVyX2JsdWVzLCAxMCwgIkZhbWlseU90aGVyQmx1ZXMiICkKLSAgQ0ZGX0ZJRUxEX0ZJWEVEXzEwMDAoIDB4MTA5LCBibHVlX3NjYWxlLCAgICAgICAgICAgICAiQmx1ZVNjYWxlIiApCi0gIENGRl9GSUVMRF9OVU0gICAgICAgKCAweDEwQSwgYmx1ZV9zaGlmdCwgICAgICAgICAgICAgIkJsdWVTaGlmdCIgKQotICBDRkZfRklFTERfTlVNICAgICAgICggMHgxMEIsIGJsdWVfZnV6eiwgICAgICAgICAgICAgICJCbHVlRnV6eiIgKQotICBDRkZfRklFTERfTlVNICAgICAgICggMTAsICAgIHN0YW5kYXJkX3dpZHRoLCAgICAgICAgICJTdGRIVyIgKQotICBDRkZfRklFTERfTlVNICAgICAgICggMTEsICAgIHN0YW5kYXJkX2hlaWdodCwgICAgICAgICJTdGRWVyIgKQotICBDRkZfRklFTERfREVMVEEgICAgICggMHgxMEMsIHNuYXBfd2lkdGhzLCAxMywgICAgICAgICJTdGVtU25hcEgiICkKLSAgQ0ZGX0ZJRUxEX0RFTFRBICAgICAoIDB4MTBELCBzbmFwX2hlaWdodHMsIDEzLCAgICAgICAiU3RlbVNuYXBWIiApCi0gIENGRl9GSUVMRF9CT09MICAgICAgKCAweDEwRSwgZm9yY2VfYm9sZCwgICAgICAgICAgICAgIkZvcmNlQm9sZCIgKQotICBDRkZfRklFTERfRklYRUQgICAgICggMHgxMEYsIGZvcmNlX2JvbGRfdGhyZXNob2xkLCAgICJGb3JjZUJvbGRUaHJlc2hvbGQiICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgICAoIDB4MTEwLCBsZW5JViwgICAgICAgICAgICAgICAgICAibGVuSVYiICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgICAoIDB4MTExLCBsYW5ndWFnZV9ncm91cCwgICAgICAgICAiTGFuZ3VhZ2VHcm91cCIgKQotICBDRkZfRklFTERfRklYRUQgICAgICggMHgxMTIsIGV4cGFuc2lvbl9mYWN0b3IsICAgICAgICJFeHBhbnNpb25GYWN0b3IiICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgICAoIDB4MTEzLCBpbml0aWFsX3JhbmRvbV9zZWVkLCAgICAiaW5pdGlhbFJhbmRvbVNlZWQiICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgICAoIDE5LCAgICBsb2NhbF9zdWJyc19vZmZzZXQsICAgICAiU3VicnMiICkKLSAgQ0ZGX0ZJRUxEX05VTSAgICAgICAoIDIwLCAgICBkZWZhdWx0X3dpZHRoLCAgICAgICAgICAiZGVmYXVsdFdpZHRoWCIgKQotICBDRkZfRklFTERfTlVNICAgICAgICggMjEsICAgIG5vbWluYWxfd2lkdGgsICAgICAgICAgICJub21pbmFsV2lkdGhYIiApCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZnR5cGVzLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2ZmL2NmZnR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlOGE1ZWUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NmZi9jZmZ0eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNmZnR5cGVzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBCYXNpYyBPcGVuVHlwZS9DRkYgdHlwZSBkZWZpbml0aW9ucyBhbmQgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uICAgICAqLwotLyogICAgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19DRkZUWVBFU19IX18KLSNkZWZpbmUgX19DRkZUWVBFU19IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX1RZUEUxX1RBQkxFU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRVJWSUNFX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0hJTlRTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENGRl9JbmRleFJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgc3RydWN0dXJlIHVzZWQgdG8gbW9kZWwgYSBDRkYgSW5kZXggdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZpZWxkcz4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgIDo6IFRoZSBzb3VyY2UgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RhcnQgICAgICAgOjogVGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBpbmRleCBieXRlIGluIHRoZSAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY291bnQgICAgICAgOjogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaW5kZXguICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvZmZfc2l6ZSAgICA6OiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBvYmplY3Qgb2Zmc2V0cyBpbiBpbmRleC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRhdGFfb2Zmc2V0IDo6IFRoZSBwb3NpdGlvbiBvZiBmaXJzdCBkYXRhIGJ5dGUgaW4gdGhlIGluZGV4J3MgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBieXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRhdGFfc2l6ZSAgIDo6IFRoZSBzaXplIG9mIHRoZSBkYXRhIHRhYmxlIGluIHRoaXMgaW5kZXguICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb2Zmc2V0cyAgICAgOjogQSB0YWJsZSBvZiBlbGVtZW50IG9mZnNldHMgaW4gdGhlIGluZGV4LiAgTXVzdCBiZSAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIGxvYWRlZCBleHBsaWNpdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnl0ZXMgICAgICAgOjogSWYgdGhlIGluZGV4IGlzIGxvYWRlZCBpbiBtZW1vcnksIGl0cyBieXRlcy4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX0luZGV4UmVjXwotICB7Ci0gICAgRlRfU3RyZWFtICBzdHJlYW07Ci0gICAgRlRfVUxvbmcgICBzdGFydDsKLSAgICBGVF9VSW50ICAgIGNvdW50OwotICAgIEZUX0J5dGUgICAgb2ZmX3NpemU7Ci0gICAgRlRfVUxvbmcgICBkYXRhX29mZnNldDsKLSAgICBGVF9VTG9uZyAgIGRhdGFfc2l6ZTsKLQotICAgIEZUX1VMb25nKiAgb2Zmc2V0czsKLSAgICBGVF9CeXRlKiAgIGJ5dGVzOwotCi0gIH0gQ0ZGX0luZGV4UmVjLCAqQ0ZGX0luZGV4OwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGRl9FbmNvZGluZ1JlY18KLSAgewotICAgIEZUX1VJbnQgICAgIGZvcm1hdDsKLSAgICBGVF9VTG9uZyAgICBvZmZzZXQ7Ci0KLSAgICBGVF9VSW50ICAgICBjb3VudDsKLSAgICBGVF9VU2hvcnQgICBzaWRzIFsyNTZdOyAgLyogYXZvaWQgZHluYW1pYyBhbGxvY2F0aW9ucyAqLwotICAgIEZUX1VTaG9ydCAgIGNvZGVzWzI1Nl07Ci0KLSAgfSBDRkZfRW5jb2RpbmdSZWMsICpDRkZfRW5jb2Rpbmc7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX0NoYXJzZXRSZWNfCi0gIHsKLQotICAgIEZUX1VJbnQgICAgIGZvcm1hdDsKLSAgICBGVF9VTG9uZyAgICBvZmZzZXQ7Ci0KLSAgICBGVF9VU2hvcnQqICBzaWRzOwotICAgIEZUX1VTaG9ydCogIGNpZHM7ICAgICAgIC8qIHRoZSBpbnZlcnNlIG1hcHBpbmcgb2YgYHNpZHMnOyBvbmx5IG5lZWRlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBDSUQta2V5ZWQgZm9udHMgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX1VJbnQgICAgIG1heF9jaWQ7Ci0gICAgRlRfVUludCAgICAgbnVtX2dseXBoczsKLQotICB9IENGRl9DaGFyc2V0UmVjLCAqQ0ZGX0NoYXJzZXQ7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX0ZvbnRSZWNEaWN0UmVjXwotICB7Ci0gICAgRlRfVUludCAgICB2ZXJzaW9uOwotICAgIEZUX1VJbnQgICAgbm90aWNlOwotICAgIEZUX1VJbnQgICAgY29weXJpZ2h0OwotICAgIEZUX1VJbnQgICAgZnVsbF9uYW1lOwotICAgIEZUX1VJbnQgICAgZmFtaWx5X25hbWU7Ci0gICAgRlRfVUludCAgICB3ZWlnaHQ7Ci0gICAgRlRfQm9vbCAgICBpc19maXhlZF9waXRjaDsKLSAgICBGVF9GaXhlZCAgIGl0YWxpY19hbmdsZTsKLSAgICBGVF9GaXhlZCAgIHVuZGVybGluZV9wb3NpdGlvbjsKLSAgICBGVF9GaXhlZCAgIHVuZGVybGluZV90aGlja25lc3M7Ci0gICAgRlRfSW50ICAgICBwYWludF90eXBlOwotICAgIEZUX0ludCAgICAgY2hhcnN0cmluZ190eXBlOwotICAgIEZUX01hdHJpeCAgZm9udF9tYXRyaXg7Ci0gICAgRlRfQm9vbCAgICBoYXNfZm9udF9tYXRyaXg7Ci0gICAgRlRfVUxvbmcgICB1bml0c19wZXJfZW07ICAvKiB0ZW1wb3JhcmlseSB1c2VkIGFzIHNjYWxpbmcgdmFsdWUgYWxzbyAqLwotICAgIEZUX1ZlY3RvciAgZm9udF9vZmZzZXQ7Ci0gICAgRlRfVUxvbmcgICB1bmlxdWVfaWQ7Ci0gICAgRlRfQkJveCAgICBmb250X2Jib3g7Ci0gICAgRlRfUG9zICAgICBzdHJva2Vfd2lkdGg7Ci0gICAgRlRfVUxvbmcgICBjaGFyc2V0X29mZnNldDsKLSAgICBGVF9VTG9uZyAgIGVuY29kaW5nX29mZnNldDsKLSAgICBGVF9VTG9uZyAgIGNoYXJzdHJpbmdzX29mZnNldDsKLSAgICBGVF9VTG9uZyAgIHByaXZhdGVfb2Zmc2V0OwotICAgIEZUX1VMb25nICAgcHJpdmF0ZV9zaXplOwotICAgIEZUX0xvbmcgICAgc3ludGhldGljX2Jhc2U7Ci0gICAgRlRfVUludCAgICBlbWJlZGRlZF9wb3N0c2NyaXB0OwotCi0gICAgLyogdGhlc2Ugc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgdGhlIHRvcC1sZXZlbCBmb250IGRpY3Rpb25hcnkgKi8KLSAgICBGVF9VSW50ICAgIGNpZF9yZWdpc3RyeTsKLSAgICBGVF9VSW50ICAgIGNpZF9vcmRlcmluZzsKLSAgICBGVF9Mb25nICAgIGNpZF9zdXBwbGVtZW50OwotCi0gICAgRlRfTG9uZyAgICBjaWRfZm9udF92ZXJzaW9uOwotICAgIEZUX0xvbmcgICAgY2lkX2ZvbnRfcmV2aXNpb247Ci0gICAgRlRfTG9uZyAgICBjaWRfZm9udF90eXBlOwotICAgIEZUX1VMb25nICAgY2lkX2NvdW50OwotICAgIEZUX1VMb25nICAgY2lkX3VpZF9iYXNlOwotICAgIEZUX1VMb25nICAgY2lkX2ZkX2FycmF5X29mZnNldDsKLSAgICBGVF9VTG9uZyAgIGNpZF9mZF9zZWxlY3Rfb2Zmc2V0OwotICAgIEZUX1VJbnQgICAgY2lkX2ZvbnRfbmFtZTsKLQotICB9IENGRl9Gb250UmVjRGljdFJlYywgKkNGRl9Gb250UmVjRGljdDsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfUHJpdmF0ZVJlY18KLSAgewotICAgIEZUX0J5dGUgICBudW1fYmx1ZV92YWx1ZXM7Ci0gICAgRlRfQnl0ZSAgIG51bV9vdGhlcl9ibHVlczsKLSAgICBGVF9CeXRlICAgbnVtX2ZhbWlseV9ibHVlczsKLSAgICBGVF9CeXRlICAgbnVtX2ZhbWlseV9vdGhlcl9ibHVlczsKLQotICAgIEZUX1BvcyAgICBibHVlX3ZhbHVlc1sxNF07Ci0gICAgRlRfUG9zICAgIG90aGVyX2JsdWVzWzEwXTsKLSAgICBGVF9Qb3MgICAgZmFtaWx5X2JsdWVzWzE0XTsKLSAgICBGVF9Qb3MgICAgZmFtaWx5X290aGVyX2JsdWVzWzEwXTsKLQotICAgIEZUX0ZpeGVkICBibHVlX3NjYWxlOwotICAgIEZUX1BvcyAgICBibHVlX3NoaWZ0OwotICAgIEZUX1BvcyAgICBibHVlX2Z1eno7Ci0gICAgRlRfUG9zICAgIHN0YW5kYXJkX3dpZHRoOwotICAgIEZUX1BvcyAgICBzdGFuZGFyZF9oZWlnaHQ7Ci0KLSAgICBGVF9CeXRlICAgbnVtX3NuYXBfd2lkdGhzOwotICAgIEZUX0J5dGUgICBudW1fc25hcF9oZWlnaHRzOwotICAgIEZUX1BvcyAgICBzbmFwX3dpZHRoc1sxM107Ci0gICAgRlRfUG9zICAgIHNuYXBfaGVpZ2h0c1sxM107Ci0gICAgRlRfQm9vbCAgIGZvcmNlX2JvbGQ7Ci0gICAgRlRfRml4ZWQgIGZvcmNlX2JvbGRfdGhyZXNob2xkOwotICAgIEZUX0ludCAgICBsZW5JVjsKLSAgICBGVF9JbnQgICAgbGFuZ3VhZ2VfZ3JvdXA7Ci0gICAgRlRfRml4ZWQgIGV4cGFuc2lvbl9mYWN0b3I7Ci0gICAgRlRfTG9uZyAgIGluaXRpYWxfcmFuZG9tX3NlZWQ7Ci0gICAgRlRfVUxvbmcgIGxvY2FsX3N1YnJzX29mZnNldDsKLSAgICBGVF9Qb3MgICAgZGVmYXVsdF93aWR0aDsKLSAgICBGVF9Qb3MgICAgbm9taW5hbF93aWR0aDsKLQotICB9IENGRl9Qcml2YXRlUmVjLCAqQ0ZGX1ByaXZhdGU7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQ0ZGX0ZEU2VsZWN0UmVjXwotICB7Ci0gICAgRlRfQnl0ZSAgIGZvcm1hdDsKLSAgICBGVF9VSW50ICAgcmFuZ2VfY291bnQ7Ci0KLSAgICAvKiB0aGF0J3MgdGhlIHRhYmxlLCB0YWtlbiBmcm9tIHRoZSBmaWxlIGBhcyBpcycgKi8KLSAgICBGVF9CeXRlKiAgZGF0YTsKLSAgICBGVF9VSW50ICAgZGF0YV9zaXplOwotCi0gICAgLyogc21hbGwgY2FjaGUgZm9yIGZvcm1hdCAzIG9ubHkgKi8KLSAgICBGVF9VSW50ICAgY2FjaGVfZmlyc3Q7Ci0gICAgRlRfVUludCAgIGNhY2hlX2NvdW50OwotICAgIEZUX0J5dGUgICBjYWNoZV9mZDsKLQotICB9IENGRl9GRFNlbGVjdFJlYywgKkNGRl9GRFNlbGVjdDsKLQotCi0gIC8qIEEgU3ViRm9udCBwYWNrcyBhIGZvbnQgZGljdCBhbmQgYSBwcml2YXRlIGRpY3QgdG9nZXRoZXIuICBUaGV5IGFyZSAqLwotICAvKiBuZWVkZWQgdG8gc3VwcG9ydCBDSUQta2V5ZWQgQ0ZGIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIENGRl9TdWJGb250UmVjXwotICB7Ci0gICAgQ0ZGX0ZvbnRSZWNEaWN0UmVjICBmb250X2RpY3Q7Ci0gICAgQ0ZGX1ByaXZhdGVSZWMgICAgICBwcml2YXRlX2RpY3Q7Ci0KLSAgICBDRkZfSW5kZXhSZWMgICAgICAgIGxvY2FsX3N1YnJzX2luZGV4OwotICAgIEZUX0J5dGUqKiAgICAgICAgICAgbG9jYWxfc3VicnM7IC8qIGFycmF5IG9mIHBvaW50ZXJzIGludG8gTG9jYWwgU3VicnMgSU5ERVggZGF0YSAqLwotCi0gIH0gQ0ZGX1N1YkZvbnRSZWMsICpDRkZfU3ViRm9udDsKLQotCi0jZGVmaW5lIENGRl9NQVhfQ0lEX0ZPTlRTICAyNTYKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDRkZfRm9udFJlY18KLSAgewotICAgIEZUX1N0cmVhbSAgICAgICAgc3RyZWFtOwotICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5OwotICAgIEZUX1VJbnQgICAgICAgICAgbnVtX2ZhY2VzOwotICAgIEZUX1VJbnQgICAgICAgICAgbnVtX2dseXBoczsKLQotICAgIEZUX0J5dGUgICAgICAgICAgdmVyc2lvbl9tYWpvcjsKLSAgICBGVF9CeXRlICAgICAgICAgIHZlcnNpb25fbWlub3I7Ci0gICAgRlRfQnl0ZSAgICAgICAgICBoZWFkZXJfc2l6ZTsKLSAgICBGVF9CeXRlICAgICAgICAgIGFic29sdXRlX29mZnNpemU7Ci0KLQotICAgIENGRl9JbmRleFJlYyAgICAgbmFtZV9pbmRleDsKLSAgICBDRkZfSW5kZXhSZWMgICAgIHRvcF9kaWN0X2luZGV4OwotICAgIENGRl9JbmRleFJlYyAgICAgZ2xvYmFsX3N1YnJzX2luZGV4OwotCi0gICAgQ0ZGX0VuY29kaW5nUmVjICBlbmNvZGluZzsKLSAgICBDRkZfQ2hhcnNldFJlYyAgIGNoYXJzZXQ7Ci0KLSAgICBDRkZfSW5kZXhSZWMgICAgIGNoYXJzdHJpbmdzX2luZGV4OwotICAgIENGRl9JbmRleFJlYyAgICAgZm9udF9kaWN0X2luZGV4OwotICAgIENGRl9JbmRleFJlYyAgICAgcHJpdmF0ZV9pbmRleDsKLSAgICBDRkZfSW5kZXhSZWMgICAgIGxvY2FsX3N1YnJzX2luZGV4OwotCi0gICAgRlRfU3RyaW5nKiAgICAgICBmb250X25hbWU7Ci0KLSAgICAvKiBhcnJheSBvZiBwb2ludGVycyBpbnRvIEdsb2JhbCBTdWJycyBJTkRFWCBkYXRhICovCi0gICAgRlRfQnl0ZSoqICAgICAgICBnbG9iYWxfc3VicnM7Ci0KLSAgICAvKiBhcnJheSBvZiBwb2ludGVycyBpbnRvIFN0cmluZyBJTkRFWCBkYXRhIHN0b3JlZCBhdCBzdHJpbmdfcG9vbCAqLwotICAgIEZUX1VJbnQgICAgICAgICAgbnVtX3N0cmluZ3M7Ci0gICAgRlRfQnl0ZSoqICAgICAgICBzdHJpbmdzOwotICAgIEZUX0J5dGUqICAgICAgICAgc3RyaW5nX3Bvb2w7Ci0KLSAgICBDRkZfU3ViRm9udFJlYyAgIHRvcF9mb250OwotICAgIEZUX1VJbnQgICAgICAgICAgbnVtX3N1YmZvbnRzOwotICAgIENGRl9TdWJGb250ICAgICAgc3ViZm9udHNbQ0ZGX01BWF9DSURfRk9OVFNdOwotCi0gICAgQ0ZGX0ZEU2VsZWN0UmVjICBmZF9zZWxlY3Q7Ci0KLSAgICAvKiBpbnRlcmZhY2UgdG8gUG9zdFNjcmlwdCBoaW50ZXIgKi8KLSAgICBQU0hpbnRlcl9TZXJ2aWNlICBwc2hpbnRlcjsKLQotICAgIC8qIGludGVyZmFjZSB0byBQb3N0c2NyaXB0IE5hbWVzIHNlcnZpY2UgKi8KLSAgICBGVF9TZXJ2aWNlX1BzQ01hcHMgIHBzbmFtZXM7Ci0KLSAgICAvKiBzaW5jZSB2ZXJzaW9uIDIuMy4wICovCi0gICAgUFNfRm9udEluZm9SZWMqICBmb250X2luZm87ICAgLyogZm9udCBpbmZvIGRpY3Rpb25hcnkgKi8KLQotICAgIC8qIHNpbmNlIHZlcnNpb24gMi4zLjYgKi8KLSAgICBGVF9TdHJpbmcqICAgICAgIHJlZ2lzdHJ5OwotICAgIEZUX1N0cmluZyogICAgICAgb3JkZXJpbmc7Ci0KLSAgICAvKiBzaW5jZSB2ZXJzaW9uIDIuNC4xMiAqLwotICAgIEZUX0dlbmVyaWMgICAgICAgY2YyX2luc3RhbmNlOwotCi0gIH0gQ0ZGX0ZvbnRSZWMsICpDRkZfRm9udDsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0NGRlRZUEVTX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9KYW1maWxlIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGUxNTIzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvSmFtZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMgRnJlZVR5cGUgMiBzcmMvY2lkIEphbWZpbGUKLSMKLSMgQ29weXJpZ2h0IDIwMDEtMjAxNSBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLVN1YkRpciAgRlQyX1RPUCAkKEZUMl9TUkNfRElSKSBjaWQgOwotCi17Ci0gIGxvY2FsICBfc291cmNlcyA7Ci0KLSAgaWYgJChGVDJfTVVMVEkpCi0gIHsKLSAgICBfc291cmNlcyA9IGNpZGdsb2FkCi0gICAgICAgICAgICAgICBjaWRsb2FkCi0gICAgICAgICAgICAgICBjaWRvYmpzCi0gICAgICAgICAgICAgICBjaWRwYXJzZQotICAgICAgICAgICAgICAgY2lkcml2ZXIKLSAgICAgICAgICAgICAgIDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBfc291cmNlcyA9IHR5cGUxY2lkIDsKLSAgfQotCi0gIExpYnJhcnkgICQoRlQyX0xJQikgOiAkKF9zb3VyY2VzKS5jIDsKLX0KLQotIyBlbmQgb2Ygc3JjL2NpZCBKYW1maWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZGVycnMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkZXJycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTBlNzc2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkZXJycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2lkZXJycy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIENJRCBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBDSUQgZXJyb3IgZW51bWVyYXRpb24gY29uc3RhbnRzLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX0NJREVSUlNfSF9fCi0jZGVmaW5lIF9fQ0lERVJSU19IX18KLQotI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19ICi0KLSN1bmRlZiBfX0ZURVJST1JTX0hfXwotCi0jdW5kZWYgIEZUX0VSUl9QUkVGSVgKLSNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgQ0lEX0Vycl8KLSNkZWZpbmUgRlRfRVJSX0JBU0UgICAgRlRfTW9kX0Vycl9DSUQKLQotI2luY2x1ZGUgRlRfRVJST1JTX0gKLQotI2VuZGlmIC8qIF9fQ0lERVJSU19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkZ2xvYWQuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkZ2xvYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAwNjc0Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZGdsb2FkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2lkZ2xvYWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIENJRC1rZXllZCBUeXBlMSBHbHlwaCBMb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlICJjaWRsb2FkLmgiCi0jaW5jbHVkZSAiY2lkZ2xvYWQuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotCi0jaW5jbHVkZSAiY2lkZXJycy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfY2lkZ2xvYWQKLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBjaWRfbG9hZF9nbHlwaCggVDFfRGVjb2RlciAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGdseXBoX2luZGV4ICkKLSAgewotICAgIENJRF9GYWNlICAgICAgIGZhY2UgPSAoQ0lEX0ZhY2UpZGVjb2Rlci0+YnVpbGRlci5mYWNlOwotICAgIENJRF9GYWNlSW5mbyAgIGNpZCAgPSAmZmFjZS0+Y2lkOwotICAgIEZUX0J5dGUqICAgICAgIHA7Ci0gICAgRlRfVUxvbmcgICAgICAgZmRfc2VsZWN0OwotICAgIEZUX1N0cmVhbSAgICAgIHN0cmVhbSAgICAgICA9IGZhY2UtPmNpZF9zdHJlYW07Ci0gICAgRlRfRXJyb3IgICAgICAgZXJyb3IgICAgICAgID0gRlRfRXJyX09rOwotICAgIEZUX0J5dGUqICAgICAgIGNoYXJzdHJpbmcgICA9IE5VTEw7Ci0gICAgRlRfTWVtb3J5ICAgICAgbWVtb3J5ICAgICAgID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0gICAgRlRfVUxvbmcgICAgICAgZ2x5cGhfbGVuZ3RoID0gMDsKLSAgICBQU0F1eF9TZXJ2aWNlICBwc2F1eCAgICAgICAgPSAoUFNBdXhfU2VydmljZSlmYWNlLT5wc2F1eDsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2VSZWMgKmluYyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlOwotI2VuZGlmCi0KLQotICAgIEZUX1RSQUNFMSgoICJjaWRfbG9hZF9nbHlwaDogZ2x5cGggaW5kZXggJWRcbiIsIGdseXBoX2luZGV4ICkpOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotCi0gICAgLyogRm9yIGluY3JlbWVudGFsIGZvbnRzIGdldCB0aGUgY2hhcmFjdGVyIGRhdGEgdXNpbmcgKi8KLSAgICAvKiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggaW5jICkKLSAgICB7Ci0gICAgICBGVF9EYXRhICBnbHlwaF9kYXRhOwotCi0KLSAgICAgIGVycm9yID0gaW5jLT5mdW5jcy0+Z2V0X2dseXBoX2RhdGEoIGluYy0+b2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsICZnbHlwaF9kYXRhICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBwICAgICAgICAgPSAoRlRfQnl0ZSopZ2x5cGhfZGF0YS5wb2ludGVyOwotICAgICAgZmRfc2VsZWN0ID0gY2lkX2dldF9vZmZzZXQoICZwLCAoRlRfQnl0ZSljaWQtPmZkX2J5dGVzICk7Ci0KLSAgICAgIGlmICggZ2x5cGhfZGF0YS5sZW5ndGggIT0gMCApCi0gICAgICB7Ci0gICAgICAgIGdseXBoX2xlbmd0aCA9IChGVF9VTG9uZykoIGdseXBoX2RhdGEubGVuZ3RoIC0gY2lkLT5mZF9ieXRlcyApOwotICAgICAgICAodm9pZClGVF9BTExPQyggY2hhcnN0cmluZywgZ2x5cGhfbGVuZ3RoICk7Ci0gICAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgICBmdF9tZW1jcHkoIGNoYXJzdHJpbmcsIGdseXBoX2RhdGEucG9pbnRlciArIGNpZC0+ZmRfYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICBnbHlwaF9sZW5ndGggKTsKLSAgICAgIH0KLQotICAgICAgaW5jLT5mdW5jcy0+ZnJlZV9nbHlwaF9kYXRhKCBpbmMtPm9iamVjdCwgJmdseXBoX2RhdGEgKTsKLQotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBlbHNlCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMICovCi0KLSAgICAvKiBGb3Igb3JkaW5hcnkgZm9udHMgcmVhZCB0aGUgQ0lEIGZvbnQgZGljdGlvbmFyeSBpbmRleCAqLwotICAgIC8qIGFuZCBjaGFyc3RyaW5nIG9mZnNldCBmcm9tIHRoZSBDSURNYXAuICAgICAgICAgICAgICAgICovCi0gICAgewotICAgICAgRlRfVUludCAgIGVudHJ5X2xlbiA9IChGVF9VSW50KSggY2lkLT5mZF9ieXRlcyArIGNpZC0+Z2RfYnl0ZXMgKTsKLSAgICAgIEZUX1VMb25nICBvZmYxOwotCi0KLSAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGNpZC0+ZGF0YV9vZmZzZXQgKyBjaWQtPmNpZG1hcF9vZmZzZXQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXggKiBlbnRyeV9sZW4gKSAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIEZUX0ZSQU1FX0VOVEVSKCAyICogZW50cnlfbGVuICkgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHAgICAgICAgICAgICA9IChGVF9CeXRlKilzdHJlYW0tPmN1cnNvcjsKLSAgICAgIGZkX3NlbGVjdCAgICA9IGNpZF9nZXRfb2Zmc2V0KCAmcCwgKEZUX0J5dGUpY2lkLT5mZF9ieXRlcyApOwotICAgICAgb2ZmMSAgICAgICAgID0gY2lkX2dldF9vZmZzZXQoICZwLCAoRlRfQnl0ZSljaWQtPmdkX2J5dGVzICk7Ci0gICAgICBwICAgICAgICAgICArPSBjaWQtPmZkX2J5dGVzOwotICAgICAgZ2x5cGhfbGVuZ3RoID0gY2lkX2dldF9vZmZzZXQoICZwLCAoRlRfQnl0ZSljaWQtPmdkX2J5dGVzICkgLSBvZmYxOwotICAgICAgRlRfRlJBTUVfRVhJVCgpOwotCi0gICAgICBpZiAoIGZkX3NlbGVjdCA+PSAoRlRfVUxvbmcpY2lkLT5udW1fZGljdHMgKQotICAgICAgewotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX09mZnNldCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgICBpZiAoIGdseXBoX2xlbmd0aCA9PSAwICkKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgaWYgKCBGVF9BTExPQyggY2hhcnN0cmluZywgZ2x5cGhfbGVuZ3RoICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0FUKCBjaWQtPmRhdGFfb2Zmc2V0ICsgb2ZmMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzdHJpbmcsIGdseXBoX2xlbmd0aCApICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIE5vdyBzZXQgdXAgdGhlIHN1YnJzIGFycmF5IGFuZCBwYXJzZSB0aGUgY2hhcnN0cmluZ3MuICovCi0gICAgewotICAgICAgQ0lEX0ZhY2VEaWN0ICBkaWN0OwotICAgICAgQ0lEX1N1YnJzICAgICBjaWRfc3VicnMgPSBmYWNlLT5zdWJycyArIGZkX3NlbGVjdDsKLSAgICAgIEZUX1VJbnQgICAgICAgY3Nfb2Zmc2V0OwotCi0KLSAgICAgIC8qIFNldCB1cCBzdWJycyAqLwotICAgICAgZGVjb2Rlci0+bnVtX3N1YnJzID0gY2lkX3N1YnJzLT5udW1fc3VicnM7Ci0gICAgICBkZWNvZGVyLT5zdWJycyAgICAgPSBjaWRfc3VicnMtPmNvZGU7Ci0gICAgICBkZWNvZGVyLT5zdWJyc19sZW4gPSAwOwotCi0gICAgICAvKiBTZXQgdXAgZm9udCBtYXRyaXggKi8KLSAgICAgIGRpY3QgICAgICAgICAgICAgICAgID0gY2lkLT5mb250X2RpY3RzICsgZmRfc2VsZWN0OwotCi0gICAgICBkZWNvZGVyLT5mb250X21hdHJpeCA9IGRpY3QtPmZvbnRfbWF0cml4OwotICAgICAgZGVjb2Rlci0+Zm9udF9vZmZzZXQgPSBkaWN0LT5mb250X29mZnNldDsKLSAgICAgIGRlY29kZXItPmxlbklWICAgICAgID0gZGljdC0+cHJpdmF0ZV9kaWN0LmxlbklWOwotCi0gICAgICAvKiBEZWNvZGUgdGhlIGNoYXJzdHJpbmcuICovCi0KLSAgICAgIC8qIEFkanVzdG1lbnQgZm9yIHNlZWQgYnl0ZXMuICovCi0gICAgICBjc19vZmZzZXQgPSBkZWNvZGVyLT5sZW5JViA+PSAwID8gKEZUX1VJbnQpZGVjb2Rlci0+bGVuSVYgOiAwOwotCi0gICAgICAvKiBEZWNyeXB0IG9ubHkgaWYgbGVuSVYgPj0gMC4gKi8KLSAgICAgIGlmICggZGVjb2Rlci0+bGVuSVYgPj0gMCApCi0gICAgICAgIHBzYXV4LT50MV9kZWNyeXB0KCBjaGFyc3RyaW5nLCBnbHlwaF9sZW5ndGgsIDQzMzAgKTsKLQotICAgICAgZXJyb3IgPSBkZWNvZGVyLT5mdW5jcy5wYXJzZV9jaGFyc3RyaW5ncygKLSAgICAgICAgICAgICAgICBkZWNvZGVyLCBjaGFyc3RyaW5nICsgY3Nfb2Zmc2V0LAotICAgICAgICAgICAgICAgIGdseXBoX2xlbmd0aCAtIGNzX29mZnNldCApOwotICAgIH0KLQotICAgIEZUX0ZSRUUoIGNoYXJzdHJpbmcgKTsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLQotICAgIC8qIEluY3JlbWVudGFsIGZvbnRzIGNhbiBvcHRpb25hbGx5IG92ZXJyaWRlIHRoZSBtZXRyaWNzLiAqLwotICAgIGlmICggIWVycm9yICYmIGluYyAmJiBpbmMtPmZ1bmNzLT5nZXRfZ2x5cGhfbWV0cmljcyApCi0gICAgewotICAgICAgRlRfSW5jcmVtZW50YWxfTWV0cmljc1JlYyAgbWV0cmljczsKLQotCi0gICAgICBtZXRyaWNzLmJlYXJpbmdfeCA9IEZJWEVEX1RPX0lOVCggZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcueCApOwotICAgICAgbWV0cmljcy5iZWFyaW5nX3kgPSAwOwotICAgICAgbWV0cmljcy5hZHZhbmNlICAgPSBGSVhFRF9UT19JTlQoIGRlY29kZXItPmJ1aWxkZXIuYWR2YW5jZS54ICk7Ci0gICAgICBtZXRyaWNzLmFkdmFuY2VfdiA9IEZJWEVEX1RPX0lOVCggZGVjb2Rlci0+YnVpbGRlci5hZHZhbmNlLnkgKTsKLQotICAgICAgZXJyb3IgPSBpbmMtPmZ1bmNzLT5nZXRfZ2x5cGhfbWV0cmljcyggaW5jLT5vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwgRkFMU0UsICZtZXRyaWNzICk7Ci0KLSAgICAgIGRlY29kZXItPmJ1aWxkZXIubGVmdF9iZWFyaW5nLnggPSBJTlRfVE9fRklYRUQoIG1ldHJpY3MuYmVhcmluZ194ICk7Ci0gICAgICBkZWNvZGVyLT5idWlsZGVyLmFkdmFuY2UueCAgICAgID0gSU5UX1RPX0ZJWEVEKCBtZXRyaWNzLmFkdmFuY2UgKTsKLSAgICAgIGRlY29kZXItPmJ1aWxkZXIuYWR2YW5jZS55ICAgICAgPSBJTlRfVE9fRklYRUQoIG1ldHJpY3MuYWR2YW5jZV92ICk7Ci0gICAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCAqLwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotI2lmIDAKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgICAgICAgICBDT01QVVRFIFRIRSBNQVhJTVVNIEFEVkFOQ0UgV0lEVEggICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICBUaGUgZm9sbG93aW5nIGNvZGUgaXMgaW4gY2hhcmdlIG9mIGNvbXB1dGluZyAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgdGhlIG1heGltdW0gYWR2YW5jZSB3aWR0aCBvZiB0aGUgZm9udC4gIEl0ICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgIHF1aWNrbHkgcHJvY2Vzc2VzIGVhY2ggZ2x5cGggY2hhcnN0cmluZyB0byAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICBleHRyYWN0IHRoZSB2YWx1ZSBmcm9tIGVpdGhlciBhIGBzYncnIG9yIGBzZWFjJyAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgb3BlcmF0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNpZF9mYWNlX2NvbXB1dGVfbWF4X2FkdmFuY2UoIENJRF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQqICAgbWF4X2FkdmFuY2UgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgZXJyb3I7Ci0gICAgVDFfRGVjb2RlclJlYyAgZGVjb2RlcjsKLSAgICBGVF9JbnQgICAgICAgICBnbHlwaF9pbmRleDsKLQotICAgIFBTQXV4X1NlcnZpY2UgIHBzYXV4ID0gKFBTQXV4X1NlcnZpY2UpZmFjZS0+cHNhdXg7Ci0KLQotICAgICptYXhfYWR2YW5jZSA9IDA7Ci0KLSAgICAvKiBJbml0aWFsaXplIGxvYWQgZGVjb2RlciAqLwotICAgIGVycm9yID0gcHNhdXgtPnQxX2RlY29kZXJfZnVuY3MtPmluaXQoICZkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9GYWNlKWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogc2l6ZSAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGdseXBoIHNsb3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBnbHlwaCBuYW1lcyEgWFhYICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogYmxlbmQgPT0gMCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGhpbnRpbmcgPT0gMCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpZF9sb2FkX2dseXBoICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBUT0RPOiBpbml0aWFsaXplIGRlY29kZXIubGVuX2J1aWxkY2hhciBhbmQgZGVjb2Rlci5idWlsZGNoYXIgKi8KLSAgICAvKiAgICAgICBpZiB3ZSBldmVyIHN1cHBvcnQgQ0lELWtleWVkIG11bHRpcGxlIG1hc3RlciBmb250cyAgICAgKi8KLQotICAgIGRlY29kZXIuYnVpbGRlci5tZXRyaWNzX29ubHkgPSAxOwotICAgIGRlY29kZXIuYnVpbGRlci5sb2FkX3BvaW50cyAgPSAwOwotCi0gICAgLyogZm9yIGVhY2ggZ2x5cGgsIHBhcnNlIHRoZSBnbHlwaCBjaGFyc3RyaW5nIGFuZCBleHRyYWN0ICovCi0gICAgLyogdGhlIGFkdmFuY2Ugd2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZm9yICggZ2x5cGhfaW5kZXggPSAwOyBnbHlwaF9pbmRleCA8IGZhY2UtPnJvb3QubnVtX2dseXBoczsKLSAgICAgICAgICBnbHlwaF9pbmRleCsrICkKLSAgICB7Ci0gICAgICAvKiBub3cgZ2V0IGxvYWQgdGhlIHVuc2NhbGVkIG91dGxpbmUgKi8KLSAgICAgIGVycm9yID0gY2lkX2xvYWRfZ2x5cGgoICZkZWNvZGVyLCBnbHlwaF9pbmRleCApOwotICAgICAgLyogaWdub3JlIHRoZSBlcnJvciBpZiBvbmUgb2NjdXJyZWQgLSBza2lwIHRvIG5leHQgZ2x5cGggKi8KLSAgICB9Ci0KLSAgICAqbWF4X2FkdmFuY2UgPSBGSVhFRF9UT19JTlQoIGRlY29kZXIuYnVpbGRlci5hZHZhbmNlLnggKTsKLQotICAgIHBzYXV4LT50MV9kZWNvZGVyX2Z1bmNzLT5kb25lKCAmZGVjb2RlciApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSNlbmRpZiAvKiAwICovCi0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2lkX3Nsb3RfbG9hZF9nbHlwaCggRlRfR2x5cGhTbG90ICBjaWRnbHlwaCwgICAgICAvKiBDSURfR2x5cGhTbG90ICovCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemUgICAgICAgY2lkc2l6ZSwgICAgICAgLyogQ0lEX1NpemUgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgICAgIGxvYWRfZmxhZ3MgKQotICB7Ci0gICAgQ0lEX0dseXBoU2xvdCAgZ2x5cGggPSAoQ0lEX0dseXBoU2xvdCljaWRnbHlwaDsKLSAgICBGVF9FcnJvciAgICAgICBlcnJvcjsKLSAgICBUMV9EZWNvZGVyUmVjICBkZWNvZGVyOwotICAgIENJRF9GYWNlICAgICAgIGZhY2UgPSAoQ0lEX0ZhY2UpY2lkZ2x5cGgtPmZhY2U7Ci0gICAgRlRfQm9vbCAgICAgICAgaGludGluZzsKLQotICAgIFBTQXV4X1NlcnZpY2UgIHBzYXV4ID0gKFBTQXV4X1NlcnZpY2UpZmFjZS0+cHNhdXg7Ci0gICAgRlRfTWF0cml4ICAgICAgZm9udF9tYXRyaXg7Ci0gICAgRlRfVmVjdG9yICAgICAgZm9udF9vZmZzZXQ7Ci0KLQotICAgIGlmICggZ2x5cGhfaW5kZXggPj0gKEZUX1VJbnQpZmFjZS0+cm9vdC5udW1fZ2x5cGhzICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19SRUNVUlNFICkKLSAgICAgIGxvYWRfZmxhZ3MgfD0gRlRfTE9BRF9OT19TQ0FMRSB8IEZUX0xPQURfTk9fSElOVElORzsKLQotICAgIGdseXBoLT54X3NjYWxlID0gY2lkc2l6ZS0+bWV0cmljcy54X3NjYWxlOwotICAgIGdseXBoLT55X3NjYWxlID0gY2lkc2l6ZS0+bWV0cmljcy55X3NjYWxlOwotCi0gICAgY2lkZ2x5cGgtPm91dGxpbmUubl9wb2ludHMgICA9IDA7Ci0gICAgY2lkZ2x5cGgtPm91dGxpbmUubl9jb250b3VycyA9IDA7Ci0KLSAgICBoaW50aW5nID0gRlRfQk9PTCggKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSAgICkgPT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX0hJTlRJTkcgKSA9PSAwICk7Ci0KLSAgICBjaWRnbHlwaC0+Zm9ybWF0ID0gRlRfR0xZUEhfRk9STUFUX09VVExJTkU7Ci0KLSAgICBlcnJvciA9IHBzYXV4LT50MV9kZWNvZGVyX2Z1bmNzLT5pbml0KCAmZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaWRnbHlwaC0+ZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaWRzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpZGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGdseXBoIG5hbWVzIC0tIFhYWCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGJsZW5kID09IDAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xPQURfVEFSR0VUX01PREUoIGxvYWRfZmxhZ3MgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaWRfbG9hZF9nbHlwaCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogVE9ETzogaW5pdGlhbGl6ZSBkZWNvZGVyLmxlbl9idWlsZGNoYXIgYW5kIGRlY29kZXIuYnVpbGRjaGFyICovCi0gICAgLyogICAgICAgaWYgd2UgZXZlciBzdXBwb3J0IENJRC1rZXllZCBtdWx0aXBsZSBtYXN0ZXIgZm9udHMgICAgICovCi0KLSAgICAvKiBzZXQgdXAgdGhlIGRlY29kZXIgKi8KLSAgICBkZWNvZGVyLmJ1aWxkZXIubm9fcmVjdXJzZSA9IEZUX0JPT0woCi0gICAgICAoICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fUkVDVVJTRSApICE9IDAgKSApOwotCi0gICAgZXJyb3IgPSBjaWRfbG9hZF9nbHlwaCggJmRlY29kZXIsIGdseXBoX2luZGV4ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBmb250X21hdHJpeCA9IGRlY29kZXIuZm9udF9tYXRyaXg7Ci0gICAgZm9udF9vZmZzZXQgPSBkZWNvZGVyLmZvbnRfb2Zmc2V0OwotCi0gICAgLyogc2F2ZSBuZXcgZ2x5cGggdGFibGVzICovCi0gICAgcHNhdXgtPnQxX2RlY29kZXJfZnVuY3MtPmRvbmUoICZkZWNvZGVyICk7Ci0KLSAgICAvKiBub3cgc2V0IHRoZSBtZXRyaWNzIC0tIHRoaXMgaXMgcmF0aGVyIHNpbXBsZSwgYXMgICAgKi8KLSAgICAvKiB0aGUgbGVmdCBzaWRlIGJlYXJpbmcgaXMgdGhlIHhNaW4sIGFuZCB0aGUgdG9wIHNpZGUgKi8KLSAgICAvKiBiZWFyaW5nIHRoZSB5TWF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBjaWRnbHlwaC0+b3V0bGluZS5mbGFncyAmPSBGVF9PVVRMSU5FX09XTkVSOwotICAgIGNpZGdseXBoLT5vdXRsaW5lLmZsYWdzIHw9IEZUX09VVExJTkVfUkVWRVJTRV9GSUxMOwotCi0gICAgLyogZm9yIGNvbXBvc2l0ZSBnbHlwaHMsIHJldHVybiBvbmx5IGxlZnQgc2lkZSBiZWFyaW5nIGFuZCAqLwotICAgIC8qIGFkdmFuY2Ugd2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1JFQ1VSU0UgKQotICAgIHsKLSAgICAgIEZUX1Nsb3RfSW50ZXJuYWwgIGludGVybmFsID0gY2lkZ2x5cGgtPmludGVybmFsOwotCi0KLSAgICAgIGNpZGdseXBoLT5tZXRyaWNzLmhvcmlCZWFyaW5nWCA9Ci0gICAgICAgIEZJWEVEX1RPX0lOVCggZGVjb2Rlci5idWlsZGVyLmxlZnRfYmVhcmluZy54ICk7Ci0gICAgICBjaWRnbHlwaC0+bWV0cmljcy5ob3JpQWR2YW5jZSA9Ci0gICAgICAgIEZJWEVEX1RPX0lOVCggZGVjb2Rlci5idWlsZGVyLmFkdmFuY2UueCApOwotCi0gICAgICBpbnRlcm5hbC0+Z2x5cGhfbWF0cml4ICAgICAgPSBmb250X21hdHJpeDsKLSAgICAgIGludGVybmFsLT5nbHlwaF9kZWx0YSAgICAgICA9IGZvbnRfb2Zmc2V0OwotICAgICAgaW50ZXJuYWwtPmdseXBoX3RyYW5zZm9ybWVkID0gMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEZUX0JCb3ggICAgICAgICAgICBjYm94OwotICAgICAgRlRfR2x5cGhfTWV0cmljcyogIG1ldHJpY3MgPSAmY2lkZ2x5cGgtPm1ldHJpY3M7Ci0KLQotICAgICAgLyogY29weSB0aGUgX3Vuc2NhbGVkXyBhZHZhbmNlIHdpZHRoICovCi0gICAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSA9Ci0gICAgICAgIEZJWEVEX1RPX0lOVCggZGVjb2Rlci5idWlsZGVyLmFkdmFuY2UueCApOwotICAgICAgY2lkZ2x5cGgtPmxpbmVhckhvcmlBZHZhbmNlID0KLSAgICAgICAgRklYRURfVE9fSU5UKCBkZWNvZGVyLmJ1aWxkZXIuYWR2YW5jZS54ICk7Ci0gICAgICBjaWRnbHlwaC0+aW50ZXJuYWwtPmdseXBoX3RyYW5zZm9ybWVkID0gMDsKLQotICAgICAgLyogbWFrZSB1cCB2ZXJ0aWNhbCBvbmVzICovCi0gICAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSAgICAgICAgPSAoIGZhY2UtPmNpZC5mb250X2Jib3gueU1heCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmNpZC5mb250X2Jib3gueU1pbiApID4+IDE2OwotICAgICAgY2lkZ2x5cGgtPmxpbmVhclZlcnRBZHZhbmNlID0gbWV0cmljcy0+dmVydEFkdmFuY2U7Ci0KLSAgICAgIGNpZGdseXBoLT5mb3JtYXQgICAgICAgICAgICA9IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FOwotCi0gICAgICBpZiAoIGNpZHNpemUtPm1ldHJpY3MueV9wcGVtIDwgMjQgKQotICAgICAgICBjaWRnbHlwaC0+b3V0bGluZS5mbGFncyB8PSBGVF9PVVRMSU5FX0hJR0hfUFJFQ0lTSU9OOwotCi0gICAgICAvKiBhcHBseSB0aGUgZm9udCBtYXRyaXgsIGlmIGFueSAqLwotICAgICAgaWYgKCBmb250X21hdHJpeC54eCAhPSAweDEwMDAwTCB8fCBmb250X21hdHJpeC55eSAhPSAweDEwMDAwTCB8fAotICAgICAgICAgICBmb250X21hdHJpeC54eSAhPSAwICAgICAgICB8fCBmb250X21hdHJpeC55eCAhPSAwICAgICAgICApCi0gICAgICB7Ci0gICAgICAgIEZUX091dGxpbmVfVHJhbnNmb3JtKCAmY2lkZ2x5cGgtPm91dGxpbmUsICZmb250X21hdHJpeCApOwotCi0gICAgICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlID0gRlRfTXVsRml4KCBtZXRyaWNzLT5ob3JpQWR2YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRfbWF0cml4Lnh4ICk7Ci0gICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlID0gRlRfTXVsRml4KCBtZXRyaWNzLT52ZXJ0QWR2YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRfbWF0cml4Lnl5ICk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggZm9udF9vZmZzZXQueCB8fCBmb250X29mZnNldC55ICkKLSAgICAgIHsKLSAgICAgICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoICZjaWRnbHlwaC0+b3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRfb2Zmc2V0LngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X29mZnNldC55ICk7Ci0KLSAgICAgICAgbWV0cmljcy0+aG9yaUFkdmFuY2UgKz0gZm9udF9vZmZzZXQueDsKLSAgICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgKz0gZm9udF9vZmZzZXQueTsKLSAgICAgIH0KLQotICAgICAgaWYgKCAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIC8qIHNjYWxlIHRoZSBvdXRsaW5lIGFuZCB0aGUgbWV0cmljcyAqLwotICAgICAgICBGVF9JbnQgICAgICAgbjsKLSAgICAgICAgRlRfT3V0bGluZSogIGN1ciA9IGRlY29kZXIuYnVpbGRlci5iYXNlOwotICAgICAgICBGVF9WZWN0b3IqICAgdmVjID0gY3VyLT5wb2ludHM7Ci0gICAgICAgIEZUX0ZpeGVkICAgICB4X3NjYWxlID0gZ2x5cGgtPnhfc2NhbGU7Ci0gICAgICAgIEZUX0ZpeGVkICAgICB5X3NjYWxlID0gZ2x5cGgtPnlfc2NhbGU7Ci0KLQotICAgICAgICAvKiBGaXJzdCBvZiBhbGwsIHNjYWxlIHRoZSBwb2ludHMgKi8KLSAgICAgICAgaWYgKCAhaGludGluZyB8fCAhZGVjb2Rlci5idWlsZGVyLmhpbnRzX2Z1bmNzICkKLSAgICAgICAgICBmb3IgKCBuID0gY3VyLT5uX3BvaW50czsgbiA+IDA7IG4tLSwgdmVjKysgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHZlYy0+eCA9IEZUX011bEZpeCggdmVjLT54LCB4X3NjYWxlICk7Ci0gICAgICAgICAgICB2ZWMtPnkgPSBGVF9NdWxGaXgoIHZlYy0+eSwgeV9zY2FsZSApOwotICAgICAgICAgIH0KLQotICAgICAgICAvKiBUaGVuIHNjYWxlIHRoZSBtZXRyaWNzICovCi0gICAgICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlID0gRlRfTXVsRml4KCBtZXRyaWNzLT5ob3JpQWR2YW5jZSwgeF9zY2FsZSApOwotICAgICAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSA9IEZUX011bEZpeCggbWV0cmljcy0+dmVydEFkdmFuY2UsIHlfc2NhbGUgKTsKLSAgICAgIH0KLQotICAgICAgLyogY29tcHV0ZSB0aGUgb3RoZXIgbWV0cmljcyAqLwotICAgICAgRlRfT3V0bGluZV9HZXRfQ0JveCggJmNpZGdseXBoLT5vdXRsaW5lLCAmY2JveCApOwotCi0gICAgICBtZXRyaWNzLT53aWR0aCAgPSBjYm94LnhNYXggLSBjYm94LnhNaW47Ci0gICAgICBtZXRyaWNzLT5oZWlnaHQgPSBjYm94LnlNYXggLSBjYm94LnlNaW47Ci0KLSAgICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWCA9IGNib3gueE1pbjsKLSAgICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWSA9IGNib3gueU1heDsKLQotICAgICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9WRVJUSUNBTF9MQVlPVVQgKQotICAgICAgewotICAgICAgICAvKiBtYWtlIHVwIHZlcnRpY2FsIG9uZXMgKi8KLSAgICAgICAgZnRfc3ludGhlc2l6ZV92ZXJ0aWNhbF9tZXRyaWNzKCBtZXRyaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlICk7Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZGdsb2FkLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZGdsb2FkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMTBjZTUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWRnbG9hZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2lkZ2xvYWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9wZW5UeXBlIEdseXBoIExvYWRlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fQ0lER0xPQURfSF9fCi0jZGVmaW5lIF9fQ0lER0xPQURfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAiY2lkb2Jqcy5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNpZiAwCi0KLSAgLyogQ29tcHV0ZSB0aGUgbWF4aW11bSBhZHZhbmNlIHdpZHRoIG9mIGEgZm9udCB0aHJvdWdoIHF1aWNrIHBhcnNpbmcgKi8KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2lkX2ZhY2VfY29tcHV0ZV9tYXhfYWR2YW5jZSggQ0lEX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCogICBtYXhfYWR2YW5jZSApOwotCi0jZW5kaWYgLyogMCAqLwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGNpZF9zbG90X2xvYWRfZ2x5cGgoIEZUX0dseXBoU2xvdCAgZ2x5cGgsICAgICAgICAgLyogQ0lEX0dseXBoX1Nsb3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZSAgICAgICBzaXplLCAgICAgICAgICAvKiBDSURfU2l6ZSAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgICAgIGxvYWRfZmxhZ3MgKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0NJREdMT0FEX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWRsb2FkLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZGxvYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTIzYjgyZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZGxvYWQuYworKysgL2Rldi9udWxsCkBAIC0xLDcwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjaWRsb2FkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ0lELWtleWVkIFR5cGUxIGZvbnQgbG9hZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICi0jaW5jbHVkZSBGVF9NVUxUSVBMRV9NQVNURVJTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RZUEUxX1RZUEVTX0gKLQotI2luY2x1ZGUgImNpZGxvYWQuaCIKLQotI2luY2x1ZGUgImNpZGVycnMuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2NpZGxvYWQKLQotCi0gIC8qIHJlYWQgYSBzaW5nbGUgb2Zmc2V0ICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfVUxvbmcgKQotICBjaWRfZ2V0X29mZnNldCggRlRfQnl0ZSogICpzdGFydCwKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUgICAgb2Zmc2l6ZSApCi0gIHsKLSAgICBGVF9VTG9uZyAgcmVzdWx0OwotICAgIEZUX0J5dGUqICBwID0gKnN0YXJ0OwotCi0KLSAgICBmb3IgKCByZXN1bHQgPSAwOyBvZmZzaXplID4gMDsgb2Zmc2l6ZS0tICkKLSAgICB7Ci0gICAgICByZXN1bHQgPDw9IDg7Ci0gICAgICByZXN1bHQgIHw9ICpwKys7Ci0gICAgfQotCi0gICAgKnN0YXJ0ID0gcDsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgIFRZUEUgMSBTWU1CT0wgUEFSU0lORyAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjaWRfbG9hZF9rZXl3b3JkKCBDSURfRmFjZSAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgQ0lEX0xvYWRlciogICAgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVDFfRmllbGQgIGtleXdvcmQgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvcjsKLSAgICBDSURfUGFyc2VyKiAgIHBhcnNlciA9ICZsb2FkZXItPnBhcnNlcjsKLSAgICBGVF9CeXRlKiAgICAgIG9iamVjdDsKLSAgICB2b2lkKiAgICAgICAgIGR1bW15X29iamVjdDsKLSAgICBDSURfRmFjZUluZm8gIGNpZCA9ICZmYWNlLT5jaWQ7Ci0KLQotICAgIC8qIGlmIHRoZSBrZXl3b3JkIGhhcyBhIGRlZGljYXRlZCBjYWxsYmFjaywgY2FsbCBpdCAqLwotICAgIGlmICgga2V5d29yZC0+dHlwZSA9PSBUMV9GSUVMRF9UWVBFX0NBTExCQUNLICkKLSAgICB7Ci0gICAgICBrZXl3b3JkLT5yZWFkZXIoIChGVF9GYWNlKWZhY2UsIHBhcnNlciApOwotICAgICAgZXJyb3IgPSBwYXJzZXItPnJvb3QuZXJyb3I7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogd2UgbXVzdCBub3cgY29tcHV0ZSB0aGUgYWRkcmVzcyBvZiBvdXIgdGFyZ2V0IG9iamVjdCAqLwotICAgIHN3aXRjaCAoIGtleXdvcmQtPmxvY2F0aW9uICkKLSAgICB7Ci0gICAgY2FzZSBUMV9GSUVMRF9MT0NBVElPTl9DSURfSU5GTzoKLSAgICAgIG9iamVjdCA9IChGVF9CeXRlKiljaWQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVDFfRklFTERfTE9DQVRJT05fRk9OVF9JTkZPOgotICAgICAgb2JqZWN0ID0gKEZUX0J5dGUqKSZjaWQtPmZvbnRfaW5mbzsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUMV9GSUVMRF9MT0NBVElPTl9GT05UX0VYVFJBOgotICAgICAgb2JqZWN0ID0gKEZUX0J5dGUqKSZmYWNlLT5mb250X2V4dHJhOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFQxX0ZJRUxEX0xPQ0FUSU9OX0JCT1g6Ci0gICAgICBvYmplY3QgPSAoRlRfQnl0ZSopJmNpZC0+Zm9udF9iYm94OwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgewotICAgICAgICBDSURfRmFjZURpY3QgIGRpY3Q7Ci0KLQotICAgICAgICBpZiAoIHBhcnNlci0+bnVtX2RpY3QgPCAwIHx8IHBhcnNlci0+bnVtX2RpY3QgPj0gY2lkLT5udW1fZGljdHMgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfRVJST1IoKCAiY2lkX2xvYWRfa2V5d29yZDogaW52YWxpZCB1c2Ugb2YgYCVzJ1xuIiwKLSAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQtPmlkZW50ICkpOwotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIFN5bnRheF9FcnJvciApOwotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotCi0gICAgICAgIGRpY3QgPSBjaWQtPmZvbnRfZGljdHMgKyBwYXJzZXItPm51bV9kaWN0OwotICAgICAgICBzd2l0Y2ggKCBrZXl3b3JkLT5sb2NhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBUMV9GSUVMRF9MT0NBVElPTl9QUklWQVRFOgotICAgICAgICAgIG9iamVjdCA9IChGVF9CeXRlKikmZGljdC0+cHJpdmF0ZV9kaWN0OwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgb2JqZWN0ID0gKEZUX0J5dGUqKWRpY3Q7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBkdW1teV9vYmplY3QgPSBvYmplY3Q7Ci0KLSAgICAvKiBub3csIGxvYWQgdGhlIGtleXdvcmQgZGF0YSBpbiB0aGUgb2JqZWN0J3MgZmllbGQocykgKi8KLSAgICBpZiAoIGtleXdvcmQtPnR5cGUgPT0gVDFfRklFTERfVFlQRV9JTlRFR0VSX0FSUkFZIHx8Ci0gICAgICAgICBrZXl3b3JkLT50eXBlID09IFQxX0ZJRUxEX1RZUEVfRklYRURfQVJSQVkgICApCi0gICAgICBlcnJvciA9IGNpZF9wYXJzZXJfbG9hZF9maWVsZF90YWJsZSggJmxvYWRlci0+cGFyc2VyLCBrZXl3b3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdW1teV9vYmplY3QgKTsKLSAgICBlbHNlCi0gICAgICBlcnJvciA9IGNpZF9wYXJzZXJfbG9hZF9maWVsZCggJmxvYWRlci0+cGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQsICZkdW1teV9vYmplY3QgKTsKLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBjaWRfcGFyc2VfZm9udF9tYXRyaXgoIENJRF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIENJRF9QYXJzZXIqICBwYXJzZXIgKQotICB7Ci0gICAgQ0lEX0ZhY2VEaWN0ICBkaWN0OwotICAgIEZUX0ZhY2UgICAgICAgcm9vdCA9IChGVF9GYWNlKSZmYWNlLT5yb290OwotICAgIEZUX0ZpeGVkICAgICAgdGVtcFs2XTsKLSAgICBGVF9GaXhlZCAgICAgIHRlbXBfc2NhbGU7Ci0KLQotICAgIGlmICggcGFyc2VyLT5udW1fZGljdCA+PSAwICYmIHBhcnNlci0+bnVtX2RpY3QgPCBmYWNlLT5jaWQubnVtX2RpY3RzICkKLSAgICB7Ci0gICAgICBGVF9NYXRyaXgqICBtYXRyaXg7Ci0gICAgICBGVF9WZWN0b3IqICBvZmZzZXQ7Ci0gICAgICBGVF9JbnQgICAgICByZXN1bHQ7Ci0KLQotICAgICAgZGljdCAgID0gZmFjZS0+Y2lkLmZvbnRfZGljdHMgKyBwYXJzZXItPm51bV9kaWN0OwotICAgICAgbWF0cml4ID0gJmRpY3QtPmZvbnRfbWF0cml4OwotICAgICAgb2Zmc2V0ID0gJmRpY3QtPmZvbnRfb2Zmc2V0OwotCi0gICAgICAvKiBpbnB1dCBpcyBzY2FsZWQgYnkgMTAwMCB0byBhY2NvbW1vZGF0ZSBkZWZhdWx0IEZvbnRNYXRyaXggKi8KLSAgICAgIHJlc3VsdCA9IGNpZF9wYXJzZXJfdG9fZml4ZWRfYXJyYXkoIHBhcnNlciwgNiwgdGVtcCwgMyApOwotCi0gICAgICBpZiAoIHJlc3VsdCA8IDYgKQotICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLQotICAgICAgdGVtcF9zY2FsZSA9IEZUX0FCUyggdGVtcFszXSApOwotCi0gICAgICBpZiAoIHRlbXBfc2NhbGUgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggImNpZF9wYXJzZV9mb250X21hdHJpeDogaW52YWxpZCBmb250IG1hdHJpeFxuIiApKTsKLSAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGF0eXBpY2FsIGNhc2UgKi8KLSAgICAgIGlmICggdGVtcF9zY2FsZSAhPSAweDEwMDAwTCApCi0gICAgICB7Ci0gICAgICAgIC8qIHNldCB1bml0cyBwZXIgRU0gYmFzZWQgb24gRm9udE1hdHJpeCB2YWx1ZXMgKi8KLSAgICAgICAgcm9vdC0+dW5pdHNfcGVyX0VNID0gKEZUX1VTaG9ydClGVF9EaXZGaXgoIDEwMDAsIHRlbXBfc2NhbGUgKTsKLQotICAgICAgICB0ZW1wWzBdID0gRlRfRGl2Rml4KCB0ZW1wWzBdLCB0ZW1wX3NjYWxlICk7Ci0gICAgICAgIHRlbXBbMV0gPSBGVF9EaXZGaXgoIHRlbXBbMV0sIHRlbXBfc2NhbGUgKTsKLSAgICAgICAgdGVtcFsyXSA9IEZUX0RpdkZpeCggdGVtcFsyXSwgdGVtcF9zY2FsZSApOwotICAgICAgICB0ZW1wWzRdID0gRlRfRGl2Rml4KCB0ZW1wWzRdLCB0ZW1wX3NjYWxlICk7Ci0gICAgICAgIHRlbXBbNV0gPSBGVF9EaXZGaXgoIHRlbXBbNV0sIHRlbXBfc2NhbGUgKTsKLSAgICAgICAgdGVtcFszXSA9IHRlbXBbM10gPCAwID8gLTB4MTAwMDBMIDogMHgxMDAwMEw7Ci0gICAgICB9Ci0KLSAgICAgIG1hdHJpeC0+eHggPSB0ZW1wWzBdOwotICAgICAgbWF0cml4LT55eCA9IHRlbXBbMV07Ci0gICAgICBtYXRyaXgtPnh5ID0gdGVtcFsyXTsKLSAgICAgIG1hdHJpeC0+eXkgPSB0ZW1wWzNdOwotCi0gICAgICAvKiBub3RlIHRoYXQgdGhlIGZvbnQgb2Zmc2V0cyBhcmUgZXhwcmVzc2VkIGluIGludGVnZXIgZm9udCB1bml0cyAqLwotICAgICAgb2Zmc2V0LT54ICA9IHRlbXBbNF0gPj4gMTY7Ci0gICAgICBvZmZzZXQtPnkgID0gdGVtcFs1XSA+PiAxNjsKLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgcGFyc2VfZmRfYXJyYXkoIENJRF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgQ0lEX1BhcnNlciogIHBhcnNlciApCi0gIHsKLSAgICBDSURfRmFjZUluZm8gIGNpZCAgICA9ICZmYWNlLT5jaWQ7Ci0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBGVF9Mb25nICAgICAgIG51bV9kaWN0czsKLQotCi0gICAgbnVtX2RpY3RzID0gY2lkX3BhcnNlcl90b19pbnQoIHBhcnNlciApOwotICAgIGlmICggbnVtX2RpY3RzIDwgMCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAicGFyc2VfZmRfYXJyYXk6IGludmFsaWQgbnVtYmVyIG9mIGRpY3Rpb25hcmllc1xuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoICFjaWQtPmZvbnRfZGljdHMgKQotICAgIHsKLSAgICAgIEZUX0ludCAgbjsKLQotCi0gICAgICBpZiAoIEZUX05FV19BUlJBWSggY2lkLT5mb250X2RpY3RzLCBudW1fZGljdHMgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgY2lkLT5udW1fZGljdHMgPSBudW1fZGljdHM7Ci0KLSAgICAgIC8qIGRvbid0IGZvcmdldCB0byBzZXQgYSBmZXcgZGVmYXVsdHMgKi8KLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgY2lkLT5udW1fZGljdHM7IG4rKyApCi0gICAgICB7Ci0gICAgICAgIENJRF9GYWNlRGljdCAgZGljdCA9IGNpZC0+Zm9udF9kaWN0cyArIG47Ci0KLQotICAgICAgICAvKiBkZWZhdWx0IHZhbHVlIGZvciBsZW5JViAqLwotICAgICAgICBkaWN0LT5wcml2YXRlX2RpY3QubGVuSVYgPSA0OwotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogYnkgbWlzdGFrZSwgYGV4cGFuc2lvbl9mYWN0b3InIGFwcGVhcnMgYm90aCBpbiBQU19Qcml2YXRlUmVjICovCi0gIC8qIGFuZCBDSURfRmFjZURpY3RSZWMgKGJvdGggYXJlIHB1YmxpYyBoZWFkZXIgZmlsZXMgYW5kIGNhbid0ICAqLwotICAvKiBjaGFuZ2VkKTsgd2Ugc2ltcGx5IGNvcHkgdGhlIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgcGFyc2VfZXhwYW5zaW9uX2ZhY3RvciggQ0lEX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENJRF9QYXJzZXIqICBwYXJzZXIgKQotICB7Ci0gICAgQ0lEX0ZhY2VEaWN0ICBkaWN0OwotCi0KLSAgICBpZiAoIHBhcnNlci0+bnVtX2RpY3QgPj0gMCAmJiBwYXJzZXItPm51bV9kaWN0IDwgZmFjZS0+Y2lkLm51bV9kaWN0cyApCi0gICAgewotICAgICAgZGljdCA9IGZhY2UtPmNpZC5mb250X2RpY3RzICsgcGFyc2VyLT5udW1fZGljdDsKLQotICAgICAgZGljdC0+ZXhwYW5zaW9uX2ZhY3RvciAgICAgICAgICAgICAgPSBjaWRfcGFyc2VyX3RvX2ZpeGVkKCBwYXJzZXIsIDAgKTsKLSAgICAgIGRpY3QtPnByaXZhdGVfZGljdC5leHBhbnNpb25fZmFjdG9yID0gZGljdC0+ZXhwYW5zaW9uX2ZhY3RvcjsKLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMKLSAgY29uc3QgVDFfRmllbGRSZWMgIGNpZF9maWVsZF9yZWNvcmRzW10gPQotICB7Ci0KLSNpbmNsdWRlICJjaWR0b2tlbi5oIgotCi0gICAgVDFfRklFTERfQ0FMTEJBQ0soICJGREFycmF5IiwgICAgICAgICBwYXJzZV9mZF9hcnJheSwgMCApCi0gICAgVDFfRklFTERfQ0FMTEJBQ0soICJGb250TWF0cml4IiwgICAgICBjaWRfcGFyc2VfZm9udF9tYXRyaXgsIDAgKQotICAgIFQxX0ZJRUxEX0NBTExCQUNLKCAiRXhwYW5zaW9uRmFjdG9yIiwgcGFyc2VfZXhwYW5zaW9uX2ZhY3RvciwgMCApCi0KLSAgICB7IDAsIFQxX0ZJRUxEX0xPQ0FUSU9OX0NJRF9JTkZPLCBUMV9GSUVMRF9UWVBFX05PTkUsIDAsIDAsIDAsIDAsIDAsIDAgfQotICB9OwotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNpZF9wYXJzZV9kaWN0KCBDSURfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIENJRF9Mb2FkZXIqICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgYmFzZSwKLSAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICBzaXplICkKLSAgewotICAgIENJRF9QYXJzZXIqICBwYXJzZXIgPSAmbG9hZGVyLT5wYXJzZXI7Ci0KLQotICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgPSBiYXNlOwotICAgIHBhcnNlci0+cm9vdC5saW1pdCAgPSBiYXNlICsgc2l6ZTsKLSAgICBwYXJzZXItPnJvb3QuZXJyb3IgID0gRlRfRXJyX09rOwotCi0gICAgewotICAgICAgRlRfQnl0ZSogIGN1ciAgID0gYmFzZTsKLSAgICAgIEZUX0J5dGUqICBsaW1pdCA9IGN1ciArIHNpemU7Ci0KLQotICAgICAgZm9yICg7OykKLSAgICAgIHsKLSAgICAgICAgRlRfQnl0ZSogIG5ld2xpbWl0OwotCi0KLSAgICAgICAgcGFyc2VyLT5yb290LmN1cnNvciA9IGN1cjsKLSAgICAgICAgY2lkX3BhcnNlcl9za2lwX3NwYWNlcyggcGFyc2VyICk7Ci0KLSAgICAgICAgaWYgKCBwYXJzZXItPnJvb3QuY3Vyc29yID49IGxpbWl0ICkKLSAgICAgICAgICBuZXdsaW1pdCA9IGxpbWl0IC0gMSAtIDE3OwotICAgICAgICBlbHNlCi0gICAgICAgICAgbmV3bGltaXQgPSBwYXJzZXItPnJvb3QuY3Vyc29yIC0gMTc7Ci0KLSAgICAgICAgLyogbG9vayBmb3IgYCVBRE9CZWdpbkZvbnREaWN0JyAqLwotICAgICAgICBmb3IgKCA7IGN1ciA8IG5ld2xpbWl0OyBjdXIrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoICpjdXIgPT0gJyUnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgZnRfc3RybmNtcCggKGNoYXIqKWN1ciwgIiVBRE9CZWdpbkZvbnREaWN0IiwgMTcgKSA9PSAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBpZiAvRkRBcnJheSB3YXMgZm91bmQsIHRoZW4gY2lkLT5udW1fZGljdHMgaXMgPiAwLCBhbmQgKi8KLSAgICAgICAgICAgIC8qIHdlIGNhbiBzdGFydCBpbmNyZWFzaW5nIHBhcnNlci0+bnVtX2RpY3QgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCBmYWNlLT5jaWQubnVtX2RpY3RzID4gMCApCi0gICAgICAgICAgICAgIHBhcnNlci0+bnVtX2RpY3QrKzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjdXIgPSBwYXJzZXItPnJvb3QuY3Vyc29yOwotICAgICAgICAvKiBubyBlcnJvciBjYW4gb2NjdXIgaW4gY2lkX3BhcnNlcl9za2lwX3NwYWNlcyAqLwotICAgICAgICBpZiAoIGN1ciA+PSBsaW1pdCApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2lkX3BhcnNlcl9za2lwX1BTX3Rva2VuKCBwYXJzZXIgKTsKLSAgICAgICAgaWYgKCBwYXJzZXItPnJvb3QuY3Vyc29yID49IGxpbWl0IHx8IHBhcnNlci0+cm9vdC5lcnJvciApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLyogbG9vayBmb3IgaW1tZWRpYXRlcyAqLwotICAgICAgICBpZiAoICpjdXIgPT0gJy8nICYmIGN1ciArIDIgPCBsaW1pdCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50ICBsZW47Ci0KLQotICAgICAgICAgIGN1cisrOwotICAgICAgICAgIGxlbiA9IChGVF9VSW50KSggcGFyc2VyLT5yb290LmN1cnNvciAtIGN1ciApOwotCi0gICAgICAgICAgaWYgKCBsZW4gPiAwICYmIGxlbiA8IDIyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBub3cgY29tcGFyZSB0aGUgaW1tZWRpYXRlIG5hbWUgdG8gdGhlIGtleXdvcmQgdGFibGUgKi8KLSAgICAgICAgICAgIFQxX0ZpZWxkICBrZXl3b3JkID0gKFQxX0ZpZWxkKWNpZF9maWVsZF9yZWNvcmRzOwotCi0KLSAgICAgICAgICAgIGZvciAoOzspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0J5dGUqICBuYW1lOwotCi0KLSAgICAgICAgICAgICAgbmFtZSA9IChGVF9CeXRlKilrZXl3b3JkLT5pZGVudDsKLSAgICAgICAgICAgICAgaWYgKCAhbmFtZSApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgaWYgKCBjdXJbMF0gPT0gbmFtZVswXSAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgbGVuID09IGZ0X3N0cmxlbiggKGNvbnN0IGNoYXIqKW5hbWUgKSApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGVF9VSW50ICBuOwotCi0KLSAgICAgICAgICAgICAgICBmb3IgKCBuID0gMTsgbiA8IGxlbjsgbisrICkKLSAgICAgICAgICAgICAgICAgIGlmICggY3VyW25dICE9IG5hbWVbbl0gKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGlmICggbiA+PSBsZW4gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIC8qIHdlIGZvdW5kIGl0IC0gcnVuIHRoZSBwYXJzaW5nIGNhbGxiYWNrICovCi0gICAgICAgICAgICAgICAgICBwYXJzZXItPnJvb3QuZXJyb3IgPSBjaWRfbG9hZF9rZXl3b3JkKCBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZCApOwotICAgICAgICAgICAgICAgICAgaWYgKCBwYXJzZXItPnJvb3QuZXJyb3IgKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VyLT5yb290LmVycm9yOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGtleXdvcmQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjdXIgPSBwYXJzZXItPnJvb3QuY3Vyc29yOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcGFyc2VyLT5yb290LmVycm9yOwotICB9Ci0KLQotICAvKiByZWFkIHRoZSBzdWJybWFwIGFuZCB0aGUgc3VicnMgb2YgZWFjaCBmb250IGRpY3QgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNpZF9yZWFkX3N1YnJzKCBDSURfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBDSURfRmFjZUluZm8gICBjaWQgICAgPSAmZmFjZS0+Y2lkOwotICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSA9IGZhY2UtPnJvb3QubWVtb3J5OwotICAgIEZUX1N0cmVhbSAgICAgIHN0cmVhbSA9IGZhY2UtPmNpZF9zdHJlYW07Ci0gICAgRlRfRXJyb3IgICAgICAgZXJyb3I7Ci0gICAgRlRfSW50ICAgICAgICAgbjsKLSAgICBDSURfU3VicnMgICAgICBzdWJyOwotICAgIEZUX1VJbnQgICAgICAgIG1heF9vZmZzZXRzID0gMDsKLSAgICBGVF9VTG9uZyogICAgICBvZmZzZXRzID0gTlVMTDsKLSAgICBQU0F1eF9TZXJ2aWNlICBwc2F1eCA9IChQU0F1eF9TZXJ2aWNlKWZhY2UtPnBzYXV4OwotCi0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggZmFjZS0+c3VicnMsIGNpZC0+bnVtX2RpY3RzICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgc3ViciA9IGZhY2UtPnN1YnJzOwotICAgIGZvciAoIG4gPSAwOyBuIDwgY2lkLT5udW1fZGljdHM7IG4rKywgc3VicisrICkKLSAgICB7Ci0gICAgICBDSURfRmFjZURpY3QgIGRpY3QgID0gY2lkLT5mb250X2RpY3RzICsgbjsKLSAgICAgIEZUX0ludCAgICAgICAgbGVuSVYgPSBkaWN0LT5wcml2YXRlX2RpY3QubGVuSVY7Ci0gICAgICBGVF9VSW50ICAgICAgIGNvdW50LCBudW1fc3VicnMgPSBkaWN0LT5udW1fc3VicnM7Ci0gICAgICBGVF9VTG9uZyAgICAgIGRhdGFfbGVuOwotICAgICAgRlRfQnl0ZSogICAgICBwOwotCi0KLSAgICAgIC8qIENoZWNrIGZvciBwb3NzaWJsZSBvdmVyZmxvdy4gKi8KLSAgICAgIGlmICggbnVtX3N1YnJzID09IEZUX1VJTlRfTUFYICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggU3ludGF4X0Vycm9yICk7Ci0gICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLQotICAgICAgLyogcmVhbGxvY2F0ZSBvZmZzZXRzIGFycmF5IGlmIG5lZWRlZCAqLwotICAgICAgaWYgKCBudW1fc3VicnMgKyAxID4gbWF4X29mZnNldHMgKQotICAgICAgewotICAgICAgICBGVF9VSW50ICBuZXdfbWF4ID0gRlRfUEFEX0NFSUwoIG51bV9zdWJycyArIDEsIDQgKTsKLQotCi0gICAgICAgIGlmICggbmV3X21heCA8PSBtYXhfb2Zmc2V0cyApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBTeW50YXhfRXJyb3IgKTsKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIEZUX1JFTkVXX0FSUkFZKCBvZmZzZXRzLCBtYXhfb2Zmc2V0cywgbmV3X21heCApICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgbWF4X29mZnNldHMgPSBuZXdfbWF4OwotICAgICAgfQotCi0gICAgICAvKiByZWFkIHRoZSBzdWJybWFwJ3Mgb2Zmc2V0cyAqLwotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggY2lkLT5kYXRhX29mZnNldCArIGRpY3QtPnN1YnJtYXBfb2Zmc2V0ICkgICAgIHx8Ci0gICAgICAgICAgIEZUX0ZSQU1FX0VOVEVSKCAoIG51bV9zdWJycyArIDEgKSAqIChGVF9VSW50KWRpY3QtPnNkX2J5dGVzICkgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIHAgPSAoRlRfQnl0ZSopc3RyZWFtLT5jdXJzb3I7Ci0gICAgICBmb3IgKCBjb3VudCA9IDA7IGNvdW50IDw9IG51bV9zdWJyczsgY291bnQrKyApCi0gICAgICAgIG9mZnNldHNbY291bnRdID0gY2lkX2dldF9vZmZzZXQoICZwLCAoRlRfQnl0ZSlkaWN0LT5zZF9ieXRlcyApOwotCi0gICAgICBGVF9GUkFNRV9FWElUKCk7Ci0KLSAgICAgIC8qIG9mZnNldHMgbXVzdCBiZSBvcmRlcmVkICovCi0gICAgICBmb3IgKCBjb3VudCA9IDE7IGNvdW50IDw9IG51bV9zdWJyczsgY291bnQrKyApCi0gICAgICAgIGlmICggb2Zmc2V0c1tjb3VudCAtIDFdID4gb2Zmc2V0c1tjb3VudF0gKQotICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgLyogbm93LCBjb21wdXRlIHRoZSBzaXplIG9mIHN1YnJzIGNoYXJzdHJpbmdzLCAqLwotICAgICAgLyogYWxsb2NhdGUsIGFuZCByZWFkIHRoZW0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgZGF0YV9sZW4gPSBvZmZzZXRzW251bV9zdWJyc10gLSBvZmZzZXRzWzBdOwotCi0gICAgICBpZiAoIEZUX05FV19BUlJBWSggc3Vici0+Y29kZSwgbnVtX3N1YnJzICsgMSApIHx8Ci0gICAgICAgICAgICAgICBGVF9BTExPQyggc3Vici0+Y29kZVswXSwgZGF0YV9sZW4gKSAgICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBjaWQtPmRhdGFfb2Zmc2V0ICsgb2Zmc2V0c1swXSApIHx8Ci0gICAgICAgICAgIEZUX1NUUkVBTV9SRUFEKCBzdWJyLT5jb2RlWzBdLCBkYXRhX2xlbiApICApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgLyogc2V0IHVwIHBvaW50ZXJzICovCi0gICAgICBmb3IgKCBjb3VudCA9IDE7IGNvdW50IDw9IG51bV9zdWJyczsgY291bnQrKyApCi0gICAgICB7Ci0gICAgICAgIEZUX1VMb25nICBsZW47Ci0KLQotICAgICAgICBsZW4gICAgICAgICAgICAgICA9IG9mZnNldHNbY291bnRdIC0gb2Zmc2V0c1tjb3VudCAtIDFdOwotICAgICAgICBzdWJyLT5jb2RlW2NvdW50XSA9IHN1YnItPmNvZGVbY291bnQgLSAxXSArIGxlbjsKLSAgICAgIH0KLQotICAgICAgLyogZGVjcnlwdCBzdWJyb3V0aW5lcywgYnV0IG9ubHkgaWYgbGVuSVYgPj0gMCAqLwotICAgICAgaWYgKCBsZW5JViA+PSAwICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggY291bnQgPSAwOyBjb3VudCA8IG51bV9zdWJyczsgY291bnQrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VTG9uZyAgbGVuOwotCi0KLSAgICAgICAgICBsZW4gPSBvZmZzZXRzW2NvdW50ICsgMV0gLSBvZmZzZXRzW2NvdW50XTsKLSAgICAgICAgICBwc2F1eC0+dDFfZGVjcnlwdCggc3Vici0+Y29kZVtjb3VudF0sIGxlbiwgNDMzMCApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHN1YnItPm51bV9zdWJycyA9IChGVF9JbnQpbnVtX3N1YnJzOwotICAgIH0KLQotICBFeGl0OgotICAgIEZUX0ZSRUUoIG9mZnNldHMgKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgRmFpbDoKLSAgICBpZiAoIGZhY2UtPnN1YnJzICkKLSAgICB7Ci0gICAgICBmb3IgKCBuID0gMDsgbiA8IGNpZC0+bnVtX2RpY3RzOyBuKysgKQotICAgICAgewotICAgICAgICBpZiAoIGZhY2UtPnN1YnJzW25dLmNvZGUgKQotICAgICAgICAgIEZUX0ZSRUUoIGZhY2UtPnN1YnJzW25dLmNvZGVbMF0gKTsKLQotICAgICAgICBGVF9GUkVFKCBmYWNlLT5zdWJyc1tuXS5jb2RlICk7Ci0gICAgICB9Ci0gICAgICBGVF9GUkVFKCBmYWNlLT5zdWJycyApOwotICAgIH0KLSAgICBnb3RvIEV4aXQ7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGNpZF9pbml0X2xvYWRlciggQ0lEX0xvYWRlciogIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICBDSURfRmFjZSAgICAgZmFjZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGZhY2UgKTsKLQotICAgIEZUX01FTV9aRVJPKCBsb2FkZXIsIHNpemVvZiAoICpsb2FkZXIgKSApOwotICB9Ci0KLQotICBzdGF0aWMgIHZvaWQKLSAgY2lkX2RvbmVfbG9hZGVyKCBDSURfTG9hZGVyKiAgbG9hZGVyICkKLSAgewotICAgIENJRF9QYXJzZXIqICBwYXJzZXIgPSAmbG9hZGVyLT5wYXJzZXI7Ci0KLQotICAgIC8qIGZpbmFsaXplIHBhcnNlciAqLwotICAgIGNpZF9wYXJzZXJfZG9uZSggcGFyc2VyICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjaWRfaGV4X3RvX2JpbmFyeSggRlRfQnl0ZSogIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgZGF0YV9sZW4sCi0gICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgQ0lEX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfU3RyZWFtICBzdHJlYW0gPSBmYWNlLT5yb290LnN0cmVhbTsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotCi0gICAgRlRfQnl0ZSAgICBidWZmZXJbMjU2XTsKLSAgICBGVF9CeXRlICAgKnAsICpwbGltaXQ7Ci0gICAgRlRfQnl0ZSAgICpkLCAqZGxpbWl0OwotICAgIEZUX0J5dGUgICAgdmFsOwotCi0gICAgRlRfQm9vbCAgICB1cHBlcl9uaWJibGUsIGRvbmU7Ci0KLQotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIG9mZnNldCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGQgICAgICA9IGRhdGE7Ci0gICAgZGxpbWl0ID0gZCArIGRhdGFfbGVuOwotICAgIHAgICAgICA9IGJ1ZmZlcjsKLSAgICBwbGltaXQgPSBwOwotCi0gICAgdXBwZXJfbmliYmxlID0gMTsKLSAgICBkb25lICAgICAgICAgPSAwOwotCi0gICAgd2hpbGUgKCBkIDwgZGxpbWl0ICkKLSAgICB7Ci0gICAgICBpZiAoIHAgPj0gcGxpbWl0ICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUxvbmcgIG9sZHBvcyA9IEZUX1NUUkVBTV9QT1MoKTsKLSAgICAgICAgRlRfVUxvbmcgIHNpemUgICA9IHN0cmVhbS0+c2l6ZSAtIG9sZHBvczsKLQotCi0gICAgICAgIGlmICggc2l6ZSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIFN5bnRheF9FcnJvciApOwotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggRlRfU1RSRUFNX1JFQUQoIGJ1ZmZlciwgMjU2ID4gc2l6ZSA/IHNpemUgOiAyNTYgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICBwICAgICAgPSBidWZmZXI7Ci0gICAgICAgIHBsaW1pdCA9IHAgKyBGVF9TVFJFQU1fUE9TKCkgLSBvbGRwb3M7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggZnRfaXNkaWdpdCggKnAgKSApCi0gICAgICAgIHZhbCA9IChGVF9CeXRlKSggKnAgLSAnMCcgKTsKLSAgICAgIGVsc2UgaWYgKCAqcCA+PSAnYScgJiYgKnAgPD0gJ2YnICkKLSAgICAgICAgdmFsID0gKEZUX0J5dGUpKCAqcCAtICdhJyApOwotICAgICAgZWxzZSBpZiAoICpwID49ICdBJyAmJiAqcCA8PSAnRicgKQotICAgICAgICB2YWwgPSAoRlRfQnl0ZSkoICpwIC0gJ0EnICsgMTAgKTsKLSAgICAgIGVsc2UgaWYgKCAqcCA9PSAnICcgIHx8Ci0gICAgICAgICAgICAgICAgKnAgPT0gJ1x0JyB8fAotICAgICAgICAgICAgICAgICpwID09ICdccicgfHwKLSAgICAgICAgICAgICAgICAqcCA9PSAnXG4nIHx8Ci0gICAgICAgICAgICAgICAgKnAgPT0gJ1xmJyB8fAotICAgICAgICAgICAgICAgICpwID09ICdcMCcgKQotICAgICAgewotICAgICAgICBwKys7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoICpwID09ICc+JyApCi0gICAgICB7Ci0gICAgICAgIHZhbCAgPSAwOwotICAgICAgICBkb25lID0gMTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggU3ludGF4X0Vycm9yICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgaWYgKCB1cHBlcl9uaWJibGUgKQotICAgICAgICAqZCA9IChGVF9CeXRlKSggdmFsIDw8IDQgKTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgKmQgPSAoRlRfQnl0ZSkoICpkICsgdmFsICk7Ci0gICAgICAgIGQrKzsKLSAgICAgIH0KLQotICAgICAgdXBwZXJfbmliYmxlID0gKEZUX0J5dGUpKCAxIC0gdXBwZXJfbmliYmxlICk7Ci0KLSAgICAgIGlmICggZG9uZSApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBwKys7Ci0gICAgfQotCi0gICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBjaWRfZmFjZV9vcGVuKCBDSURfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgIGZhY2VfaW5kZXggKQotICB7Ci0gICAgQ0lEX0xvYWRlciAgIGxvYWRlcjsKLSAgICBDSURfUGFyc2VyKiAgcGFyc2VyOwotICAgIEZUX01lbW9yeSAgICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLSAgICBGVF9FcnJvciAgICAgZXJyb3I7Ci0KLQotICAgIGNpZF9pbml0X2xvYWRlciggJmxvYWRlciwgZmFjZSApOwotCi0gICAgcGFyc2VyID0gJmxvYWRlci5wYXJzZXI7Ci0gICAgZXJyb3IgPSBjaWRfcGFyc2VyX25ldyggcGFyc2VyLCBmYWNlLT5yb290LnN0cmVhbSwgZmFjZS0+cm9vdC5tZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBTQXV4X1NlcnZpY2UpZmFjZS0+cHNhdXggKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGVycm9yID0gY2lkX3BhcnNlX2RpY3QoIGZhY2UsICZsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLT5wb3N0c2NyaXB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+cG9zdHNjcmlwdF9sZW4gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggZmFjZV9pbmRleCA8IDAgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBGVF9ORVcoIGZhY2UtPmNpZF9zdHJlYW0gKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIHBhcnNlci0+YmluYXJ5X2xlbmd0aCApCi0gICAgewotICAgICAgLyogd2UgbXVzdCBjb252ZXJ0IHRoZSBkYXRhIHNlY3Rpb24gZnJvbSBoZXhhZGVjaW1hbCB0byBiaW5hcnkgKi8KLSAgICAgIGlmICggRlRfQUxMT0MoIGZhY2UtPmJpbmFyeV9kYXRhLCBwYXJzZXItPmJpbmFyeV9sZW5ndGggKSAgICAgICAgIHx8Ci0gICAgICAgICAgIGNpZF9oZXhfdG9fYmluYXJ5KCBmYWNlLT5iaW5hcnlfZGF0YSwgcGFyc2VyLT5iaW5hcnlfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLT5kYXRhX29mZnNldCwgZmFjZSApICAgICAgICAgICAgICAgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIEZUX1N0cmVhbV9PcGVuTWVtb3J5KCBmYWNlLT5jaWRfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmJpbmFyeV9kYXRhLCBwYXJzZXItPmJpbmFyeV9sZW5ndGggKTsKLSAgICAgIGZhY2UtPmNpZC5kYXRhX29mZnNldCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAqZmFjZS0+Y2lkX3N0cmVhbSAgICAgPSAqZmFjZS0+cm9vdC5zdHJlYW07Ci0gICAgICBmYWNlLT5jaWQuZGF0YV9vZmZzZXQgPSBsb2FkZXIucGFyc2VyLmRhdGFfb2Zmc2V0OwotICAgIH0KLQotICAgIGVycm9yID0gY2lkX3JlYWRfc3VicnMoIGZhY2UgKTsKLQotICBFeGl0OgotICAgIGNpZF9kb25lX2xvYWRlciggJmxvYWRlciApOwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWRsb2FkLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZGxvYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc3NzZkMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZGxvYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNpZGxvYWQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDSUQta2V5ZWQgVHlwZTEgZm9udCBsb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0NJRExPQURfSF9fCi0jZGVmaW5lIF9fQ0lETE9BRF9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSAiY2lkcGFyc2UuaCIKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBDSURfTG9hZGVyXwotICB7Ci0gICAgQ0lEX1BhcnNlciAgcGFyc2VyOyAgICAgICAgICAvKiBwYXJzZXIgdXNlZCB0byByZWFkIHRoZSBzdHJlYW0gKi8KLSAgICBGVF9JbnQgICAgICBudW1fY2hhcnM7ICAgICAgIC8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGVuY29kaW5nICovCi0KLSAgfSBDSURfTG9hZGVyOwotCi0KLSAgRlRfTE9DQUwoIEZUX1VMb25nICkKLSAgY2lkX2dldF9vZmZzZXQoIEZUX0J5dGUqKiAgc3RhcnQsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlICAgIG9mZnNpemUgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBjaWRfZmFjZV9vcGVuKCBDSURfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgIGZhY2VfaW5kZXggKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0NJRExPQURfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZG9ianMuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkb2Jqcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjE1MTliLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkb2Jqcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNpZG9ianMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDSUQgb2JqZWN0cyBtYW5hZ2VyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotCi0jaW5jbHVkZSAiY2lkZ2xvYWQuaCIKLSNpbmNsdWRlICJjaWRsb2FkLmgiCi0KLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0hJTlRTX0gKLQotI2luY2x1ZGUgImNpZGVycnMuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX2NpZG9ianMKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgU0xPVCAgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBjaWRfc2xvdF9kb25lKCBGVF9HbHlwaFNsb3QgIHNsb3QgKQotICB7Ci0gICAgc2xvdC0+aW50ZXJuYWwtPmdseXBoX2hpbnRzID0gTlVMTDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNpZF9zbG90X2luaXQoIEZUX0dseXBoU2xvdCAgc2xvdCApCi0gIHsKLSAgICBDSURfRmFjZSAgICAgICAgICBmYWNlOwotICAgIFBTSGludGVyX1NlcnZpY2UgIHBzaGludGVyOwotCi0KLSAgICBmYWNlICAgICA9IChDSURfRmFjZSlzbG90LT5mYWNlOwotICAgIHBzaGludGVyID0gKFBTSGludGVyX1NlcnZpY2UpZmFjZS0+cHNoaW50ZXI7Ci0KLSAgICBpZiAoIHBzaGludGVyICkKLSAgICB7Ci0gICAgICBGVF9Nb2R1bGUgIG1vZHVsZTsKLQotCi0gICAgICBtb2R1bGUgPSBGVF9HZXRfTW9kdWxlKCBzbG90LT5mYWNlLT5kcml2ZXItPnJvb3QubGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwc2hpbnRlciIgKTsKLSAgICAgIGlmICggbW9kdWxlICkKLSAgICAgIHsKLSAgICAgICAgVDFfSGludHNfRnVuY3MgIGZ1bmNzOwotCi0KLSAgICAgICAgZnVuY3MgPSBwc2hpbnRlci0+Z2V0X3QxX2Z1bmNzKCBtb2R1bGUgKTsKLSAgICAgICAgc2xvdC0+aW50ZXJuYWwtPmdseXBoX2hpbnRzID0gKHZvaWQqKWZ1bmNzOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRSAgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBzdGF0aWMgUFNIX0dsb2JhbHNfRnVuY3MKLSAgY2lkX3NpemVfZ2V0X2dsb2JhbHNfZnVuY3MoIENJRF9TaXplICBzaXplICkKLSAgewotICAgIENJRF9GYWNlICAgICAgICAgIGZhY2UgICAgID0gKENJRF9GYWNlKXNpemUtPnJvb3QuZmFjZTsKLSAgICBQU0hpbnRlcl9TZXJ2aWNlICBwc2hpbnRlciA9IChQU0hpbnRlcl9TZXJ2aWNlKWZhY2UtPnBzaGludGVyOwotICAgIEZUX01vZHVsZSAgICAgICAgIG1vZHVsZTsKLQotCi0gICAgbW9kdWxlID0gRlRfR2V0X01vZHVsZSggc2l6ZS0+cm9vdC5mYWNlLT5kcml2ZXItPnJvb3QubGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHNoaW50ZXIiICk7Ci0gICAgcmV0dXJuICggbW9kdWxlICYmIHBzaGludGVyICYmIHBzaGludGVyLT5nZXRfZ2xvYmFsc19mdW5jcyApCi0gICAgICAgICAgID8gcHNoaW50ZXItPmdldF9nbG9iYWxzX2Z1bmNzKCBtb2R1bGUgKQotICAgICAgICAgICA6IDA7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIGNpZF9zaXplX2RvbmUoIEZUX1NpemUgIGNpZHNpemUgKSAgICAgICAgIC8qIENJRF9TaXplICovCi0gIHsKLSAgICBDSURfU2l6ZSAgc2l6ZSA9IChDSURfU2l6ZSljaWRzaXplOwotCi0KLSAgICBpZiAoIGNpZHNpemUtPmludGVybmFsICkKLSAgICB7Ci0gICAgICBQU0hfR2xvYmFsc19GdW5jcyAgZnVuY3M7Ci0KLQotICAgICAgZnVuY3MgPSBjaWRfc2l6ZV9nZXRfZ2xvYmFsc19mdW5jcyggc2l6ZSApOwotICAgICAgaWYgKCBmdW5jcyApCi0gICAgICAgIGZ1bmNzLT5kZXN0cm95KCAoUFNIX0dsb2JhbHMpY2lkc2l6ZS0+aW50ZXJuYWwgKTsKLQotICAgICAgY2lkc2l6ZS0+aW50ZXJuYWwgPSBOVUxMOwotICAgIH0KLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNpZF9zaXplX2luaXQoIEZUX1NpemUgIGNpZHNpemUgKSAgICAgLyogQ0lEX1NpemUgKi8KLSAgewotICAgIENJRF9TaXplICAgICAgICAgICBzaXplICA9IChDSURfU2l6ZSljaWRzaXplOwotICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBQU0hfR2xvYmFsc19GdW5jcyAgZnVuY3MgPSBjaWRfc2l6ZV9nZXRfZ2xvYmFsc19mdW5jcyggc2l6ZSApOwotCi0KLSAgICBpZiAoIGZ1bmNzICkKLSAgICB7Ci0gICAgICBQU0hfR2xvYmFscyAgIGdsb2JhbHM7Ci0gICAgICBDSURfRmFjZSAgICAgIGZhY2UgPSAoQ0lEX0ZhY2UpY2lkc2l6ZS0+ZmFjZTsKLSAgICAgIENJRF9GYWNlRGljdCAgZGljdCA9IGZhY2UtPmNpZC5mb250X2RpY3RzICsgZmFjZS0+cm9vdC5mYWNlX2luZGV4OwotICAgICAgUFNfUHJpdmF0ZSAgICBwcml2ID0gJmRpY3QtPnByaXZhdGVfZGljdDsKLQotCi0gICAgICBlcnJvciA9IGZ1bmNzLT5jcmVhdGUoIGNpZHNpemUtPmZhY2UtPm1lbW9yeSwgcHJpdiwgJmdsb2JhbHMgKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgY2lkc2l6ZS0+aW50ZXJuYWwgPSAoRlRfU2l6ZV9JbnRlcm5hbCkodm9pZCopZ2xvYmFsczsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGNpZF9zaXplX3JlcXVlc3QoIEZUX1NpemUgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEgKQotICB7Ci0gICAgUFNIX0dsb2JhbHNfRnVuY3MgIGZ1bmNzOwotCi0KLSAgICBGVF9SZXF1ZXN0X01ldHJpY3MoIHNpemUtPmZhY2UsIHJlcSApOwotCi0gICAgZnVuY3MgPSBjaWRfc2l6ZV9nZXRfZ2xvYmFsc19mdW5jcyggKENJRF9TaXplKXNpemUgKTsKLQotICAgIGlmICggZnVuY3MgKQotICAgICAgZnVuY3MtPnNldF9zY2FsZSggKFBTSF9HbG9iYWxzKXNpemUtPmludGVybmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS0+bWV0cmljcy54X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS0+bWV0cmljcy55X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBQ0UgIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNpZF9mYWNlX2RvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmFsaXplcyBhIGdpdmVuIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBwb2ludGVyIHRvIHRoZSBmYWNlIG9iamVjdCB0byBkZXN0cm95LiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2lkX2ZhY2VfZG9uZSggRlRfRmFjZSAgY2lkZmFjZSApICAgICAgICAgLyogQ0lEX0ZhY2UgKi8KLSAgewotICAgIENJRF9GYWNlICAgICAgZmFjZSA9IChDSURfRmFjZSljaWRmYWNlOwotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5OwotICAgIENJRF9GYWNlSW5mbyAgY2lkOwotICAgIFBTX0ZvbnRJbmZvICAgaW5mbzsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm47Ci0KLSAgICBjaWQgICAgPSAmZmFjZS0+Y2lkOwotICAgIGluZm8gICA9ICZjaWQtPmZvbnRfaW5mbzsKLSAgICBtZW1vcnkgPSBjaWRmYWNlLT5tZW1vcnk7Ci0KLSAgICAvKiByZWxlYXNlIHN1YnJzICovCi0gICAgaWYgKCBmYWNlLT5zdWJycyApCi0gICAgewotICAgICAgRlRfSW50ICBuOwotCi0KLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgY2lkLT5udW1fZGljdHM7IG4rKyApCi0gICAgICB7Ci0gICAgICAgIENJRF9TdWJycyAgc3ViciA9IGZhY2UtPnN1YnJzICsgbjsKLQotCi0gICAgICAgIGlmICggc3Vici0+Y29kZSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9GUkVFKCBzdWJyLT5jb2RlWzBdICk7Ci0gICAgICAgICAgRlRfRlJFRSggc3Vici0+Y29kZSApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIEZUX0ZSRUUoIGZhY2UtPnN1YnJzICk7Ci0gICAgfQotCi0gICAgLyogcmVsZWFzZSBGb250SW5mbyBzdHJpbmdzICovCi0gICAgRlRfRlJFRSggaW5mby0+dmVyc2lvbiApOwotICAgIEZUX0ZSRUUoIGluZm8tPm5vdGljZSApOwotICAgIEZUX0ZSRUUoIGluZm8tPmZ1bGxfbmFtZSApOwotICAgIEZUX0ZSRUUoIGluZm8tPmZhbWlseV9uYW1lICk7Ci0gICAgRlRfRlJFRSggaW5mby0+d2VpZ2h0ICk7Ci0KLSAgICAvKiByZWxlYXNlIGZvbnQgZGljdGlvbmFyaWVzICovCi0gICAgRlRfRlJFRSggY2lkLT5mb250X2RpY3RzICk7Ci0gICAgY2lkLT5udW1fZGljdHMgPSAwOwotCi0gICAgLyogcmVsZWFzZSBvdGhlciBzdHJpbmdzICovCi0gICAgRlRfRlJFRSggY2lkLT5jaWRfZm9udF9uYW1lICk7Ci0gICAgRlRfRlJFRSggY2lkLT5yZWdpc3RyeSApOwotICAgIEZUX0ZSRUUoIGNpZC0+b3JkZXJpbmcgKTsKLQotICAgIGNpZGZhY2UtPmZhbWlseV9uYW1lID0gTlVMTDsKLSAgICBjaWRmYWNlLT5zdHlsZV9uYW1lICA9IE5VTEw7Ci0KLSAgICBGVF9GUkVFKCBmYWNlLT5iaW5hcnlfZGF0YSApOwotICAgIEZUX0ZSRUUoIGZhY2UtPmNpZF9zdHJlYW0gKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2lkX2ZhY2VfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5pdGlhbGl6ZXMgYSBnaXZlbiBDSUQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtICAgICA6OiBUaGUgc291cmNlIGZvbnQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgZm9udCBmYWNlIGluIHRoZSByZXNvdXJjZS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9wYXJhbXMgOjogTnVtYmVyIG9mIGFkZGl0aW9uYWwgZ2VuZXJpYyBwYXJhbWV0ZXJzLiAgSWdub3JlZC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFyYW1zICAgICA6OiBBZGRpdGlvbmFsIGdlbmVyaWMgcGFyYW1ldGVycy4gIElnbm9yZWQuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBUaGUgbmV3bHkgYnVpbHQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2lkX2ZhY2VfaW5pdCggRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICBjaWRmYWNlLCAgICAgICAgLyogQ0lEX0ZhY2UgKi8KLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICkKLSAgewotICAgIENJRF9GYWNlICAgICAgICAgIGZhY2UgPSAoQ0lEX0ZhY2UpY2lkZmFjZTsKLSAgICBGVF9FcnJvciAgICAgICAgICBlcnJvcjsKLSAgICBQU0F1eF9TZXJ2aWNlICAgICBwc2F1eDsKLSAgICBQU0hpbnRlcl9TZXJ2aWNlICBwc2hpbnRlcjsKLQotICAgIEZUX1VOVVNFRCggbnVtX3BhcmFtcyApOwotICAgIEZUX1VOVVNFRCggcGFyYW1zICk7Ci0gICAgRlRfVU5VU0VEKCBzdHJlYW0gKTsKLQotCi0gICAgY2lkZmFjZS0+bnVtX2ZhY2VzID0gMTsKLQotICAgIHBzYXV4ID0gKFBTQXV4X1NlcnZpY2UpZmFjZS0+cHNhdXg7Ci0gICAgaWYgKCAhcHNhdXggKQotICAgIHsKLSAgICAgIHBzYXV4ID0gKFBTQXV4X1NlcnZpY2UpRlRfR2V0X01vZHVsZV9JbnRlcmZhY2UoCi0gICAgICAgICAgICAgICAgRlRfRkFDRV9MSUJSQVJZKCBmYWNlICksICJwc2F1eCIgKTsKLQotICAgICAgaWYgKCAhcHNhdXggKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJjaWRfZmFjZV9pbml0OiBjYW5ub3QgYWNjZXNzIGBwc2F1eCcgbW9kdWxlXG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBNaXNzaW5nX01vZHVsZSApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGZhY2UtPnBzYXV4ID0gcHNhdXg7Ci0gICAgfQotCi0gICAgcHNoaW50ZXIgPSAoUFNIaW50ZXJfU2VydmljZSlmYWNlLT5wc2hpbnRlcjsKLSAgICBpZiAoICFwc2hpbnRlciApCi0gICAgewotICAgICAgcHNoaW50ZXIgPSAoUFNIaW50ZXJfU2VydmljZSlGVF9HZXRfTW9kdWxlX0ludGVyZmFjZSgKLSAgICAgICAgICAgICAgICAgICBGVF9GQUNFX0xJQlJBUlkoIGZhY2UgKSwgInBzaGludGVyIiApOwotCi0gICAgICBmYWNlLT5wc2hpbnRlciA9IHBzaGludGVyOwotICAgIH0KLQotICAgIEZUX1RSQUNFMigoICJDSUQgZHJpdmVyXG4iICkpOwotCi0gICAgLyogb3BlbiB0aGUgdG9rZW5pemVyOyB0aGlzIHdpbGwgYWxzbyBjaGVjayB0aGUgZm9udCBmb3JtYXQgKi8KLSAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCAwICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZXJyb3IgPSBjaWRfZmFjZV9vcGVuKCBmYWNlLCBmYWNlX2luZGV4ICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBpZiB3ZSBqdXN0IHdhbnRlZCB0byBjaGVjayB0aGUgZm9ybWF0LCBsZWF2ZSBzdWNjZXNzZnVsbHkgbm93ICovCi0gICAgaWYgKCBmYWNlX2luZGV4IDwgMCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBjaGVjayB0aGUgZmFjZSBpbmRleCAqLwotICAgIC8qIFhYWDogaGFuZGxlIENJRCBmb250cyB3aXRoIG1vcmUgdGhhbiBhIHNpbmdsZSBmYWNlICovCi0gICAgaWYgKCAoIGZhY2VfaW5kZXggJiAweEZGRkYgKSAhPSAwICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJjaWRfZmFjZV9pbml0OiBpbnZhbGlkIGZhY2UgaW5kZXhcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogbm93IGxvYWQgdGhlIGZvbnQgcHJvZ3JhbSBpbnRvIHRoZSBmYWNlIG9iamVjdCAqLwotCi0gICAgLyogaW5pdGlhbGl6ZSB0aGUgZmFjZSBvYmplY3QgZmllbGRzICovCi0KLSAgICAvKiBzZXQgdXAgcm9vdCBmYWNlIGZpZWxkcyAqLwotICAgIHsKLSAgICAgIENJRF9GYWNlSW5mbyAgY2lkICA9ICZmYWNlLT5jaWQ7Ci0gICAgICBQU19Gb250SW5mbyAgIGluZm8gPSAmY2lkLT5mb250X2luZm87Ci0KLQotICAgICAgY2lkZmFjZS0+bnVtX2dseXBocyAgID0gKEZUX0xvbmcpY2lkLT5jaWRfY291bnQ7Ci0gICAgICBjaWRmYWNlLT5udW1fY2hhcm1hcHMgPSAwOwotCi0gICAgICBjaWRmYWNlLT5mYWNlX2luZGV4ID0gZmFjZV9pbmRleCAmIDB4RkZGRjsKLQotICAgICAgY2lkZmFjZS0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfU0NBTEFCTEUgICB8IC8qIHNjYWxhYmxlIG91dGxpbmVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZBQ0VfRkxBR19IT1JJWk9OVEFMIHwgLyogaG9yaXpvbnRhbCBkYXRhICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRkFDRV9GTEFHX0hJTlRFUjsgICAgICAvKiBoYXMgbmF0aXZlIGhpbnRlciAqLwotCi0gICAgICBpZiAoIGluZm8tPmlzX2ZpeGVkX3BpdGNoICkKLSAgICAgICAgY2lkZmFjZS0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfRklYRURfV0lEVEg7Ci0KLSAgICAgIC8qIFhYWDogVE9ETzogYWRkIGtlcm5pbmcgd2l0aCAuYWZtIHN1cHBvcnQgKi8KLQotICAgICAgLyogZ2V0IHN0eWxlIG5hbWUgLS0gYmUgY2FyZWZ1bCwgc29tZSBicm9rZW4gZm9udHMgb25seSAqLwotICAgICAgLyogaGF2ZSBhIC9Gb250TmFtZSBkaWN0aW9uYXJ5IGVudHJ5ISAgICAgICAgICAgICAgICAgICAqLwotICAgICAgY2lkZmFjZS0+ZmFtaWx5X25hbWUgPSBpbmZvLT5mYW1pbHlfbmFtZTsKLSAgICAgIC8qIGFzc3VtZSAiUmVndWxhciIgc3R5bGUgaWYgd2UgZG9uJ3Qga25vdyBiZXR0ZXIgKi8KLSAgICAgIGNpZGZhY2UtPnN0eWxlX25hbWUgPSAoY2hhciAqKSJSZWd1bGFyIjsKLSAgICAgIGlmICggY2lkZmFjZS0+ZmFtaWx5X25hbWUgKQotICAgICAgewotICAgICAgICBjaGFyKiAgZnVsbCAgID0gaW5mby0+ZnVsbF9uYW1lOwotICAgICAgICBjaGFyKiAgZmFtaWx5ID0gY2lkZmFjZS0+ZmFtaWx5X25hbWU7Ci0KLQotICAgICAgICBpZiAoIGZ1bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgd2hpbGUgKCAqZnVsbCApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCAqZnVsbCA9PSAqZmFtaWx5ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZmFtaWx5Kys7Ci0gICAgICAgICAgICAgIGZ1bGwrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaWYgKCAqZnVsbCA9PSAnICcgfHwgKmZ1bGwgPT0gJy0nICkKLSAgICAgICAgICAgICAgICBmdWxsKys7Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKCAqZmFtaWx5ID09ICcgJyB8fCAqZmFtaWx5ID09ICctJyApCi0gICAgICAgICAgICAgICAgZmFtaWx5Kys7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggISpmYW1pbHkgKQotICAgICAgICAgICAgICAgICAgY2lkZmFjZS0+c3R5bGVfbmFtZSA9IGZ1bGw7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogZG8gd2UgaGF2ZSBhIGAvRm9udE5hbWUnPyAqLwotICAgICAgICBpZiAoIGNpZC0+Y2lkX2ZvbnRfbmFtZSApCi0gICAgICAgICAgY2lkZmFjZS0+ZmFtaWx5X25hbWUgPSBjaWQtPmNpZF9mb250X25hbWU7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNvbXB1dGUgc3R5bGUgZmxhZ3MgKi8KLSAgICAgIGNpZGZhY2UtPnN0eWxlX2ZsYWdzID0gMDsKLSAgICAgIGlmICggaW5mby0+aXRhbGljX2FuZ2xlICkKLSAgICAgICAgY2lkZmFjZS0+c3R5bGVfZmxhZ3MgfD0gRlRfU1RZTEVfRkxBR19JVEFMSUM7Ci0gICAgICBpZiAoIGluZm8tPndlaWdodCApCi0gICAgICB7Ci0gICAgICAgIGlmICggIWZ0X3N0cmNtcCggaW5mby0+d2VpZ2h0LCAiQm9sZCIgICkgfHwKLSAgICAgICAgICAgICAhZnRfc3RyY21wKCBpbmZvLT53ZWlnaHQsICJCbGFjayIgKSApCi0gICAgICAgICAgY2lkZmFjZS0+c3R5bGVfZmxhZ3MgfD0gRlRfU1RZTEVfRkxBR19CT0xEOwotICAgICAgfQotCi0gICAgICAvKiBubyBlbWJlZGRlZCBiaXRtYXAgc3VwcG9ydCAqLwotICAgICAgY2lkZmFjZS0+bnVtX2ZpeGVkX3NpemVzID0gMDsKLSAgICAgIGNpZGZhY2UtPmF2YWlsYWJsZV9zaXplcyA9IE5VTEw7Ci0KLSAgICAgIGNpZGZhY2UtPmJib3gueE1pbiA9ICAgY2lkLT5mb250X2Jib3gueE1pbiAgICAgICAgICAgID4+IDE2OwotICAgICAgY2lkZmFjZS0+YmJveC55TWluID0gICBjaWQtPmZvbnRfYmJveC55TWluICAgICAgICAgICAgPj4gMTY7Ci0gICAgICAvKiBubyBgVScgc3VmZml4IGhlcmUgdG8gMHhGRkZGISAqLwotICAgICAgY2lkZmFjZS0+YmJveC54TWF4ID0gKCBjaWQtPmZvbnRfYmJveC54TWF4ICsgMHhGRkZGICkgPj4gMTY7Ci0gICAgICBjaWRmYWNlLT5iYm94LnlNYXggPSAoIGNpZC0+Zm9udF9iYm94LnlNYXggKyAweEZGRkYgKSA+PiAxNjsKLQotICAgICAgaWYgKCAhY2lkZmFjZS0+dW5pdHNfcGVyX0VNICkKLSAgICAgICAgY2lkZmFjZS0+dW5pdHNfcGVyX0VNID0gMTAwMDsKLQotICAgICAgY2lkZmFjZS0+YXNjZW5kZXIgID0gKEZUX1Nob3J0KSggY2lkZmFjZS0+YmJveC55TWF4ICk7Ci0gICAgICBjaWRmYWNlLT5kZXNjZW5kZXIgPSAoRlRfU2hvcnQpKCBjaWRmYWNlLT5iYm94LnlNaW4gKTsKLQotICAgICAgY2lkZmFjZS0+aGVpZ2h0ID0gKEZUX1Nob3J0KSggKCBjaWRmYWNlLT51bml0c19wZXJfRU0gKiAxMiApIC8gMTAgKTsKLSAgICAgIGlmICggY2lkZmFjZS0+aGVpZ2h0IDwgY2lkZmFjZS0+YXNjZW5kZXIgLSBjaWRmYWNlLT5kZXNjZW5kZXIgKQotICAgICAgICBjaWRmYWNlLT5oZWlnaHQgPSAoRlRfU2hvcnQpKCBjaWRmYWNlLT5hc2NlbmRlciAtIGNpZGZhY2UtPmRlc2NlbmRlciApOwotCi0gICAgICBjaWRmYWNlLT51bmRlcmxpbmVfcG9zaXRpb24gID0gKEZUX1Nob3J0KWluZm8tPnVuZGVybGluZV9wb3NpdGlvbjsKLSAgICAgIGNpZGZhY2UtPnVuZGVybGluZV90aGlja25lc3MgPSAoRlRfU2hvcnQpaW5mby0+dW5kZXJsaW5lX3RoaWNrbmVzczsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNpZF9kcml2ZXJfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRpYWxpemVzIGEgZ2l2ZW4gQ0lEIGRyaXZlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRyaXZlciA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGRyaXZlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIGNpZF9kcml2ZXJfaW5pdCggRlRfTW9kdWxlICBkcml2ZXIgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBkcml2ZXIgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNpZF9kcml2ZXJfZG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmFsaXplcyBhIGdpdmVuIENJRCBkcml2ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRyaXZlciA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IENJRCBkcml2ZXIuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2lkX2RyaXZlcl9kb25lKCBGVF9Nb2R1bGUgIGRyaXZlciApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGRyaXZlciApOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZG9ianMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkb2Jqcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTA5NWNhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkb2Jqcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNpZG9ianMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDSUQgb2JqZWN0cyBtYW5hZ2VyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0NJRE9CSlNfSF9fCi0jZGVmaW5lIF9fQ0lET0JKU19IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UWVBFMV9UWVBFU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKiBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZXMgbXVzdCBiZSBkZWZpbmVkIGJ5IHRoZSBoaW50ZXIgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgQ0lEX1NpemVfSGludHNfICAgQ0lEX1NpemVfSGludHM7Ci0gIHR5cGVkZWYgc3RydWN0IENJRF9HbHlwaF9IaW50c18gIENJRF9HbHlwaF9IaW50czsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRF9Ecml2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgVHlwZSAxIGRyaXZlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgQ0lEX0RyaXZlclJlY18qICBDSURfRHJpdmVyOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX1NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBUeXBlIDEgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBDSURfU2l6ZVJlY18qICBDSURfU2l6ZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENJRF9HbHlwaFNsb3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgVHlwZSAxIGdseXBoIHNsb3Qgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgQ0lEX0dseXBoU2xvdFJlY18qICBDSURfR2x5cGhTbG90OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ0lEX0NoYXJNYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBoYW5kbGUgdG8gYSBUeXBlIDEgY2hhcmFjdGVyIG1hcHBpbmcgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIFR5cGUgMSBmb3JtYXQgZG9lc24ndCB1c2UgYSBjaGFybWFwIGJ1dCBhbiBlbmNvZGluZyB0YWJsZS4gICAgICovCi0gIC8qICAgIFRoZSBkcml2ZXIgaXMgcmVzcG9uc2libGUgZm9yIG1ha2luZyB1cCBjaGFybWFwIG9iamVjdHMgICAgICAgICAgICAqLwotICAvKiAgICBjb3JyZXNwb25kaW5nIHRvIHRoZXNlIHRhYmxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IENJRF9DaGFyTWFwUmVjXyogIENJRF9DaGFyTWFwOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBIRVJFIEJFR0lOUyBUSEUgVFlQRSAxIFNQRUNJRklDIFNUVUZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIENJRF9TaXplUmVjXwotICB7Ci0gICAgRlRfU2l6ZVJlYyAgcm9vdDsKLSAgICBGVF9Cb29sICAgICB2YWxpZDsKLQotICB9IENJRF9TaXplUmVjOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIENJRF9HbHlwaFNsb3RSZWNfCi0gIHsKLSAgICBGVF9HbHlwaFNsb3RSZWMgIHJvb3Q7Ci0KLSAgICBGVF9Cb29sICAgICAgICAgIGhpbnQ7Ci0gICAgRlRfQm9vbCAgICAgICAgICBzY2FsZWQ7Ci0KLSAgICBGVF9GaXhlZCAgICAgICAgIHhfc2NhbGU7Ci0gICAgRlRfRml4ZWQgICAgICAgICB5X3NjYWxlOwotCi0gIH0gQ0lEX0dseXBoU2xvdFJlYzsKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgY2lkX3Nsb3RfZG9uZSggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2lkX3Nsb3RfaW5pdCggRlRfR2x5cGhTbG90ICBzbG90ICk7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNpZF9zaXplX2RvbmUoIEZUX1NpemUgIHNpemUgKTsgICAgICAgLyogQ0lEX1NpemUgKi8KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBjaWRfc2l6ZV9pbml0KCBGVF9TaXplICBzaXplICk7ICAgICAgIC8qIENJRF9TaXplICovCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2lkX3NpemVfcmVxdWVzdCggRlRfU2l6ZSAgICAgICAgICBzaXplLCAgICAgIC8qIENJRF9TaXplICovCi0gICAgICAgICAgICAgICAgICAgIEZUX1NpemVfUmVxdWVzdCAgcmVxICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgY2lkX2ZhY2VfaW5pdCggRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICBmYWNlLCAgICAgICAgICAgLyogQ0lEX0ZhY2UgKi8KLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBjaWRfZmFjZV9kb25lKCBGVF9GYWNlICBmYWNlICk7ICAgICAgICAgICAgICAgLyogQ0lEX0ZhY2UgKi8KLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGNpZF9kcml2ZXJfaW5pdCggRlRfTW9kdWxlICBkcml2ZXIgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNpZF9kcml2ZXJfZG9uZSggRlRfTW9kdWxlICBkcml2ZXIgKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0NJRE9CSlNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZHBhcnNlLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZHBhcnNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNzY5NDkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWRwYXJzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNpZHBhcnNlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDSUQta2V5ZWQgVHlwZTEgcGFyc2VyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0KLSNpbmNsdWRlICJjaWRwYXJzZS5oIgotCi0jaW5jbHVkZSAiY2lkZXJycy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfY2lkcGFyc2UKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgIElOUFVUIFNUUkVBTSBQQVJTRVIgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgY2lkX3BhcnNlcl9uZXcoIENJRF9QYXJzZXIqICAgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgIFBTQXV4X1NlcnZpY2UgIHBzYXV4ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBGVF9VTG9uZyAgYmFzZV9vZmZzZXQsIG9mZnNldCwgcHNfbGVuOwotICAgIEZUX0J5dGUgICAqY3VyLCAqbGltaXQ7Ci0gICAgRlRfQnl0ZSAgICphcmcxLCAqYXJnMjsKLQotCi0gICAgRlRfTUVNX1pFUk8oIHBhcnNlciwgc2l6ZW9mICggKnBhcnNlciApICk7Ci0gICAgcHNhdXgtPnBzX3BhcnNlcl9mdW5jcy0+aW5pdCggJnBhcnNlci0+cm9vdCwgMCwgMCwgbWVtb3J5ICk7Ci0KLSAgICBwYXJzZXItPnN0cmVhbSA9IHN0cmVhbTsKLQotICAgIGJhc2Vfb2Zmc2V0ID0gRlRfU1RSRUFNX1BPUygpOwotCi0gICAgLyogZmlyc3Qgb2YgYWxsLCBjaGVjayB0aGUgZm9udCBmb3JtYXQgaW4gdGhlIGhlYWRlciAqLwotICAgIGlmICggRlRfRlJBTUVfRU5URVIoIDMxICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBmdF9zdHJuY21wKCAoY2hhciAqKXN0cmVhbS0+Y3Vyc29yLAotICAgICAgICAgICAgICAgICAgICAgIiUhUFMtQWRvYmUtMy4wIFJlc291cmNlLUNJREZvbnQiLCAzMSApICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiICBub3QgYSBDSUQta2V5ZWQgZm9udFxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICB9Ci0KLSAgICBGVF9GUkFNRV9FWElUKCk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgQWdhaW46Ci0gICAgLyogbm93LCByZWFkIHRoZSByZXN0IG9mIHRoZSBmaWxlIHVudGlsIHdlIGZpbmQgKi8KLSAgICAvKiBgU3RhcnREYXRhJyBvciBgL3NmbnRzJyAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHsKLSAgICAgIEZUX0J5dGUgICBidWZmZXJbMjU2ICsgMTBdOwotICAgICAgRlRfVUxvbmcgIHJlYWRfbGVuID0gMjU2ICsgMTA7Ci0gICAgICBGVF9CeXRlKiAgcCAgICAgICAgPSBidWZmZXI7Ci0KLQotICAgICAgZm9yICggb2Zmc2V0ID0gRlRfU1RSRUFNX1BPUygpOyA7IG9mZnNldCArPSAyNTYgKQotICAgICAgewotICAgICAgICBGVF9VTG9uZyAgc3RyZWFtX2xlbjsKLQotCi0gICAgICAgIHN0cmVhbV9sZW4gPSBzdHJlYW0tPnNpemUgLSBGVF9TVFJFQU1fUE9TKCk7Ci0gICAgICAgIGlmICggc3RyZWFtX2xlbiA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMigoICJjaWRfcGFyc2VyX25ldzogbm8gYFN0YXJ0RGF0YScga2V5d29yZCBmb3VuZFxuIiApKTsKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgcmVhZF9sZW4gPSBGVF9NSU4oIHJlYWRfbGVuLCBzdHJlYW1fbGVuICk7Ci0gICAgICAgIGlmICggRlRfU1RSRUFNX1JFQUQoIHAsIHJlYWRfbGVuICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBpZiAoIHJlYWRfbGVuIDwgMjU2ICkKLSAgICAgICAgICBwW3JlYWRfbGVuXSAgPSAnXDAnOwotCi0gICAgICAgIGxpbWl0ID0gcCArIHJlYWRfbGVuIC0gMTA7Ci0KLSAgICAgICAgZm9yICggcCA9IGJ1ZmZlcjsgcCA8IGxpbWl0OyBwKysgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBwWzBdID09ICdTJyAmJiBmdF9zdHJuY21wKCAoY2hhciopcCwgIlN0YXJ0RGF0YSIsIDkgKSA9PSAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBzYXZlIG9mZnNldCBvZiBiaW5hcnkgZGF0YSBhZnRlciBgU3RhcnREYXRhJyAqLwotICAgICAgICAgICAgb2Zmc2V0ICs9IChGVF9VTG9uZykoIHAgLSBidWZmZXIgKyAxMCApOwotICAgICAgICAgICAgZ290byBGb3VuZDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoIHBbMV0gPT0gJ3MnICYmIGZ0X3N0cm5jbXAoIChjaGFyKilwLCAiL3NmbnRzIiwgNiApID09IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG9mZnNldCArPSAoRlRfVUxvbmcpKCBwIC0gYnVmZmVyICsgNyApOwotICAgICAgICAgICAgZ290byBGb3VuZDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBGVF9NRU1fTU9WRSggYnVmZmVyLCBwLCAxMCApOwotICAgICAgICByZWFkX2xlbiA9IDI1NjsKLSAgICAgICAgcCA9IGJ1ZmZlciArIDEwOwotICAgICAgfQotICAgIH0KLQotICBGb3VuZDoKLSAgICAvKiBXZSBoYXZlIGZvdW5kIHRoZSBzdGFydCBvZiB0aGUgYmluYXJ5IGRhdGEgb3IgdGhlIGAvc2ZudHMnIHRva2VuLiAqLwotICAgIC8qIE5vdyByZXdpbmQgYW5kIGV4dHJhY3QgdGhlIGZyYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBQb3N0U2NyaXB0ICovCi0gICAgLyogc2VjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIHBzX2xlbiA9IG9mZnNldCAtIGJhc2Vfb2Zmc2V0OwotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGJhc2Vfb2Zmc2V0ICkgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgRlRfRlJBTUVfRVhUUkFDVCggcHNfbGVuLCBwYXJzZXItPnBvc3RzY3JpcHQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBwYXJzZXItPmRhdGFfb2Zmc2V0ICAgID0gb2Zmc2V0OwotICAgIHBhcnNlci0+cG9zdHNjcmlwdF9sZW4gPSBwc19sZW47Ci0gICAgcGFyc2VyLT5yb290LmJhc2UgICAgICA9IHBhcnNlci0+cG9zdHNjcmlwdDsKLSAgICBwYXJzZXItPnJvb3QuY3Vyc29yICAgID0gcGFyc2VyLT5wb3N0c2NyaXB0OwotICAgIHBhcnNlci0+cm9vdC5saW1pdCAgICAgPSBwYXJzZXItPnJvb3QuY3Vyc29yICsgcHNfbGVuOwotICAgIHBhcnNlci0+bnVtX2RpY3QgICAgICAgPSAtMTsKLQotICAgIC8qIEZpbmFsbHksIHdlIGNoZWNrIHdoZXRoZXIgYFN0YXJ0RGF0YScgb3IgYC9zZm50cycgd2FzIHJlYWwgLS0gICovCi0gICAgLyogaXQgY291bGQgYmUgaW4gYSBjb21tZW50IG9yIHN0cmluZy4gIFdlIGFsc28gZ2V0IHRoZSBhcmd1bWVudHMgKi8KLSAgICAvKiBvZiBgU3RhcnREYXRhJyB0byBmaW5kIG91dCB3aGV0aGVyIHRoZSBkYXRhIGlzIHJlcHJlc2VudGVkIGluICAqLwotICAgIC8qIGJpbmFyeSBvciBoZXggZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBhcmcxID0gcGFyc2VyLT5yb290LmN1cnNvcjsKLSAgICBjaWRfcGFyc2VyX3NraXBfUFNfdG9rZW4oIHBhcnNlciApOwotICAgIGNpZF9wYXJzZXJfc2tpcF9zcGFjZXMgICggcGFyc2VyICk7Ci0gICAgYXJnMiA9IHBhcnNlci0+cm9vdC5jdXJzb3I7Ci0gICAgY2lkX3BhcnNlcl9za2lwX1BTX3Rva2VuKCBwYXJzZXIgKTsKLSAgICBjaWRfcGFyc2VyX3NraXBfc3BhY2VzICAoIHBhcnNlciApOwotCi0gICAgbGltaXQgPSBwYXJzZXItPnJvb3QubGltaXQ7Ci0gICAgY3VyICAgPSBwYXJzZXItPnJvb3QuY3Vyc29yOwotCi0gICAgd2hpbGUgKCBjdXIgPCBsaW1pdCApCi0gICAgewotICAgICAgaWYgKCBwYXJzZXItPnJvb3QuZXJyb3IgKQotICAgICAgewotICAgICAgICBlcnJvciA9IHBhcnNlci0+cm9vdC5lcnJvcjsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBpZiAoIGN1clswXSA9PSAnUycgJiYgZnRfc3RybmNtcCggKGNoYXIqKWN1ciwgIlN0YXJ0RGF0YSIsIDkgKSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBmdF9zdHJuY21wKCAoY2hhciopYXJnMSwgIihIZXgpIiwgNSApID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfTG9uZyAgdG1wID0gZnRfYXRvbCggKGNvbnN0IGNoYXIgKilhcmcyICk7Ci0KLQotICAgICAgICAgIGlmICggdG1wIDwgMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRVJST1IoKCAiY2lkX3BhcnNlcl9uZXc6IGludmFsaWQgbGVuZ3RoIG9mIGhleCBkYXRhXG4iICkpOwotICAgICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBwYXJzZXItPmJpbmFyeV9sZW5ndGggPSAoRlRfVUxvbmcpdG1wOwotICAgICAgICB9Ci0KLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIGN1clsxXSA9PSAncycgJiYgZnRfc3RybmNtcCggKGNoYXIqKWN1ciwgIi9zZm50cyIsIDYgKSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UyKCggImNpZF9wYXJzZXJfbmV3OiBjYW5ub3QgaGFuZGxlIFR5cGUgMTEgZm9udHNcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBjaWRfcGFyc2VyX3NraXBfUFNfdG9rZW4oIHBhcnNlciApOwotICAgICAgY2lkX3BhcnNlcl9za2lwX3NwYWNlcyAgKCBwYXJzZXIgKTsKLSAgICAgIGFyZzEgPSBhcmcyOwotICAgICAgYXJnMiA9IGN1cjsKLSAgICAgIGN1ciAgPSBwYXJzZXItPnJvb3QuY3Vyc29yOwotICAgIH0KLQotICAgIC8qIHdlIGhhdmVuJ3QgZm91bmQgdGhlIGNvcnJlY3QgYFN0YXJ0RGF0YSc7IGdvIGJhY2sgYW5kIGNvbnRpbnVlICovCi0gICAgLyogc2VhcmNoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9GUkFNRV9SRUxFQVNFKCBwYXJzZXItPnBvc3RzY3JpcHQgKTsKLSAgICBpZiAoICFGVF9TVFJFQU1fU0VFSyggb2Zmc2V0ICkgKQotICAgICAgZ290byBBZ2FpbjsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgY2lkX3BhcnNlcl9kb25lKCBDSURfUGFyc2VyKiAgcGFyc2VyICkKLSAgewotICAgIC8qIGFsd2F5cyBmcmVlIHRoZSBwcml2YXRlIGRpY3Rpb25hcnkgKi8KLSAgICBpZiAoIHBhcnNlci0+cG9zdHNjcmlwdCApCi0gICAgewotICAgICAgRlRfU3RyZWFtICBzdHJlYW0gPSBwYXJzZXItPnN0cmVhbTsKLQotCi0gICAgICBGVF9GUkFNRV9SRUxFQVNFKCBwYXJzZXItPnBvc3RzY3JpcHQgKTsKLSAgICB9Ci0gICAgcGFyc2VyLT5yb290LmZ1bmNzLmRvbmUoICZwYXJzZXItPnJvb3QgKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWRwYXJzZS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWRwYXJzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTgxYmI0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkcGFyc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjaWRwYXJzZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ0lELWtleWVkIFR5cGUxIHBhcnNlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19DSURQQVJTRV9IX18KLSNkZWZpbmUgX19DSURQQVJTRV9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RZUEUxX1RZUEVTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDSURfUGFyc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIENJRF9QYXJzZXIgaXMgYW4gb2JqZWN0IHVzZWQgdG8gcGFyc2UgYSBUeXBlIDEgZm9udHMgdmVyeSAgICAgICAgKi8KLSAgLyogICAgcXVpY2tseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcm9vdCAgICAgICAgICAgOjogVGhlIHJvb3QgUFNfUGFyc2VyUmVjIGZpZWxkcy4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgICAgICA6OiBUaGUgY3VycmVudCBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvc3RzY3JpcHQgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgZGF0YSB0byBiZSBwYXJzZWQuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9zdHNjcmlwdF9sZW4gOjogVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSB0byBiZSBwYXJzZWQuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkYXRhX29mZnNldCAgICA6OiBUaGUgc3RhcnQgcG9zaXRpb24gb2YgdGhlIGJpbmFyeSBkYXRhIChpLmUuLCB0aGUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgZW5kIG9mIHRoZSBkYXRhIHRvIGJlIHBhcnNlZC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBiaW5hcnlfbGVuZ3RoICA6OiBUaGUgbGVuZ3RoIG9mIHRoZSBkYXRhIGFmdGVyIHRoZSBgU3RhcnREYXRhJyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBpZiB0aGUgZGF0YSBmb3JtYXQgaXMgaGV4YWRlY2ltYWwuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaWQgICAgICAgICAgICA6OiBBIHN0cnVjdHVyZSB3aGljaCBob2xkcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgZm9udC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fZGljdCAgICAgICA6OiBUaGUgbnVtYmVyIG9mIGZvbnQgZGljdGlvbmFyaWVzLiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBDSURfUGFyc2VyXwotICB7Ci0gICAgUFNfUGFyc2VyUmVjICByb290OwotICAgIEZUX1N0cmVhbSAgICAgc3RyZWFtOwotCi0gICAgRlRfQnl0ZSogICAgICBwb3N0c2NyaXB0OwotICAgIEZUX1VMb25nICAgICAgcG9zdHNjcmlwdF9sZW47Ci0KLSAgICBGVF9VTG9uZyAgICAgIGRhdGFfb2Zmc2V0OwotCi0gICAgRlRfVUxvbmcgICAgICBiaW5hcnlfbGVuZ3RoOwotCi0gICAgQ0lEX0ZhY2VJbmZvICBjaWQ7Ci0gICAgRlRfSW50ICAgICAgICBudW1fZGljdDsKLQotICB9IENJRF9QYXJzZXI7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBjaWRfcGFyc2VyX25ldyggQ0lEX1BhcnNlciogICAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgUFNBdXhfU2VydmljZSAgcHNhdXggKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGNpZF9wYXJzZXJfZG9uZSggQ0lEX1BhcnNlciogIHBhcnNlciApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQVJTSU5HIFJPVVRJTkVTICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIGNpZF9wYXJzZXJfc2tpcF9zcGFjZXMoIHAgKSAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIChwKS0+cm9vdC5mdW5jcy5za2lwX3NwYWNlcyggJihwKS0+cm9vdCApCi0jZGVmaW5lIGNpZF9wYXJzZXJfc2tpcF9QU190b2tlbiggcCApICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKHApLT5yb290LmZ1bmNzLnNraXBfUFNfdG9rZW4oICYocCktPnJvb3QgKQotCi0jZGVmaW5lIGNpZF9wYXJzZXJfdG9faW50KCBwICkgICAgICAgKHApLT5yb290LmZ1bmNzLnRvX2ludCggJihwKS0+cm9vdCApCi0jZGVmaW5lIGNpZF9wYXJzZXJfdG9fZml4ZWQoIHAsIHQgKSAgKHApLT5yb290LmZ1bmNzLnRvX2ZpeGVkKCAmKHApLT5yb290LCB0ICkKLQotI2RlZmluZSBjaWRfcGFyc2VyX3RvX2Nvb3JkX2FycmF5KCBwLCBtLCBjICkgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAocCktPnJvb3QuZnVuY3MudG9fY29vcmRfYXJyYXkoICYocCktPnJvb3QsIG0sIGMgKQotI2RlZmluZSBjaWRfcGFyc2VyX3RvX2ZpeGVkX2FycmF5KCBwLCBtLCBmLCB0ICkgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAocCktPnJvb3QuZnVuY3MudG9fZml4ZWRfYXJyYXkoICYocCktPnJvb3QsIG0sIGYsIHQgKQotI2RlZmluZSBjaWRfcGFyc2VyX3RvX3Rva2VuKCBwLCB0ICkgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAocCktPnJvb3QuZnVuY3MudG9fdG9rZW4oICYocCktPnJvb3QsIHQgKQotI2RlZmluZSBjaWRfcGFyc2VyX3RvX3Rva2VuX2FycmF5KCBwLCB0LCBtLCBjICkgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAocCktPnJvb3QuZnVuY3MudG9fdG9rZW5fYXJyYXkoICYocCktPnJvb3QsIHQsIG0sIGMgKQotCi0jZGVmaW5lIGNpZF9wYXJzZXJfbG9hZF9maWVsZCggcCwgZiwgbyApICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKHApLT5yb290LmZ1bmNzLmxvYWRfZmllbGQoICYocCktPnJvb3QsIGYsIG8sIDAsIDAgKQotI2RlZmluZSBjaWRfcGFyc2VyX2xvYWRfZmllbGRfdGFibGUoIHAsIGYsIG8gKSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIChwKS0+cm9vdC5mdW5jcy5sb2FkX2ZpZWxkX3RhYmxlKCAmKHApLT5yb290LCBmLCBvLCAwLCAwICkKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0NJRFBBUlNFX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWRyaXZlci5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWRyaXZlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2M0Y2M0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkcml2ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDIzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBjaWRyaXZlci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQ0lEIGRyaXZlciBpbnRlcmZhY2UgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgImNpZHJpdmVyLmgiCi0jaW5jbHVkZSAiY2lkZ2xvYWQuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgImNpZGVycnMuaCIKLQotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX05BTUVfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9GT05UX0ZPUk1BVF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfSU5GT19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0NJRF9ICi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9jaWRkcml2ZXIKLQotCi0gIC8qCi0gICAqICBQT1NUU0NSSVBUIE5BTUUgU0VSVklDRQotICAgKgotICAgKi8KLQotICBzdGF0aWMgY29uc3QgY2hhcioKLSAgY2lkX2dldF9wb3N0c2NyaXB0X25hbWUoIENJRF9GYWNlICBmYWNlICkKLSAgewotICAgIGNvbnN0IGNoYXIqICByZXN1bHQgPSBmYWNlLT5jaWQuY2lkX2ZvbnRfbmFtZTsKLQotCi0gICAgaWYgKCByZXN1bHQgJiYgcmVzdWx0WzBdID09ICcvJyApCi0gICAgICByZXN1bHQrKzsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX1BzRm9udE5hbWVSZWMgIGNpZF9zZXJ2aWNlX3BzX25hbWUgPQotICB7Ci0gICAgKEZUX1BzTmFtZV9HZXRGdW5jKSBjaWRfZ2V0X3Bvc3RzY3JpcHRfbmFtZQotICB9OwotCi0KLSAgLyoKLSAgICogIFBPU1RTQ1JJUFQgSU5GTyBTRVJWSUNFCi0gICAqCi0gICAqLwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjaWRfcHNfZ2V0X2ZvbnRfaW5mbyggRlRfRmFjZSAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgUFNfRm9udEluZm9SZWMqICBhZm9udF9pbmZvICkKLSAgewotICAgICphZm9udF9pbmZvID0gKChDSURfRmFjZSlmYWNlKS0+Y2lkLmZvbnRfaW5mbzsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2lkX3BzX2dldF9mb250X2V4dHJhKCBGVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBQU19Gb250RXh0cmFSZWMqICBhZm9udF9leHRyYSApCi0gIHsKLSAgICAqYWZvbnRfZXh0cmEgPSAoKENJRF9GYWNlKWZhY2UpLT5mb250X2V4dHJhOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX1BzSW5mb1JlYyAgY2lkX3NlcnZpY2VfcHNfaW5mbyA9Ci0gIHsKLSAgICAoUFNfR2V0Rm9udEluZm9GdW5jKSAgIGNpZF9wc19nZXRfZm9udF9pbmZvLAotICAgIChQU19HZXRGb250RXh0cmFGdW5jKSAgY2lkX3BzX2dldF9mb250X2V4dHJhLAotICAgIChQU19IYXNHbHlwaE5hbWVzRnVuYykgTlVMTCwgICAgICAgIC8qIHVuc3VwcG9ydGVkIHdpdGggQ0lEIGZvbnRzICovCi0gICAgKFBTX0dldEZvbnRQcml2YXRlRnVuYylOVUxMLCAgICAgICAgLyogdW5zdXBwb3J0ZWQgICAgICAgICAgICAgICAgKi8KLSAgICAoUFNfR2V0Rm9udFZhbHVlRnVuYykgIE5VTEwgICAgICAgICAvKiBub3QgaW1wbGVtZW50ZWQgICAgICAgICAgICAqLwotICB9OwotCi0KLSAgLyoKLSAgICogIENJRCBJTkZPIFNFUlZJQ0UKLSAgICoKLSAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjaWRfZ2V0X3JvcyggQ0lEX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgY29uc3QgY2hhciogICpyZWdpc3RyeSwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAqb3JkZXJpbmcsCi0gICAgICAgICAgICAgICBGVF9JbnQgICAgICAgKnN1cHBsZW1lbnQgKQotICB7Ci0gICAgQ0lEX0ZhY2VJbmZvICBjaWQgPSAmZmFjZS0+Y2lkOwotCi0KLSAgICBpZiAoIHJlZ2lzdHJ5ICkKLSAgICAgICpyZWdpc3RyeSA9IGNpZC0+cmVnaXN0cnk7Ci0KLSAgICBpZiAoIG9yZGVyaW5nICkKLSAgICAgICpvcmRlcmluZyA9IGNpZC0+b3JkZXJpbmc7Ci0KLSAgICBpZiAoIHN1cHBsZW1lbnQgKQotICAgICAgKnN1cHBsZW1lbnQgPSBjaWQtPnN1cHBsZW1lbnQ7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2lkX2dldF9pc19jaWQoIENJRF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgKmlzX2NpZCApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfVU5VU0VEKCBmYWNlICk7Ci0KLQotICAgIGlmICggaXNfY2lkICkKLSAgICAgICppc19jaWQgPSAxOyAvKiBjaWQgZHJpdmVyIGlzIG9ubHkgdXNlZCBmb3IgQ0lEIGtleWVkIGZvbnRzICovCi0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjaWRfZ2V0X2NpZF9mcm9tX2dseXBoX2luZGV4KCBDSURfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAqY2lkICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9VTlVTRUQoIGZhY2UgKTsKLQotCi0gICAgaWYgKCBjaWQgKQotICAgICAgKmNpZCA9IGdseXBoX2luZGV4OyAvKiBpZGVudGl0eSBtYXBwaW5nICovCi0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX0NJRFJlYyAgY2lkX3NlcnZpY2VfY2lkX2luZm8gPQotICB7Ci0gICAgIChGVF9DSURfR2V0UmVnaXN0cnlPcmRlcmluZ1N1cHBsZW1lbnRGdW5jKWNpZF9nZXRfcm9zLAotICAgICAoRlRfQ0lEX0dldElzSW50ZXJuYWxseUNJREtleWVkRnVuYykgICAgICBjaWRfZ2V0X2lzX2NpZCwKLSAgICAgKEZUX0NJRF9HZXRDSURGcm9tR2x5cGhJbmRleEZ1bmMpICAgICAgICAgY2lkX2dldF9jaWRfZnJvbV9nbHlwaF9pbmRleAotICB9OwotCi0KLSAgLyoKLSAgICogIFNFUlZJQ0UgTElTVAotICAgKgotICAgKi8KLQotICBzdGF0aWMgY29uc3QgRlRfU2VydmljZURlc2NSZWMgIGNpZF9zZXJ2aWNlc1tdID0KLSAgewotICAgIHsgRlRfU0VSVklDRV9JRF9GT05UX0ZPUk1BVCwgICAgICAgICAgRlRfRk9OVF9GT1JNQVRfQ0lEIH0sCi0gICAgeyBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfRk9OVF9OQU1FLCAmY2lkX3NlcnZpY2VfcHNfbmFtZSB9LAotICAgIHsgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0lORk8sICAgICAgJmNpZF9zZXJ2aWNlX3BzX2luZm8gfSwKLSAgICB7IEZUX1NFUlZJQ0VfSURfQ0lELCAgICAgICAgICAgICAgICAgICZjaWRfc2VydmljZV9jaWRfaW5mbyB9LAotICAgIHsgTlVMTCwgTlVMTCB9Ci0gIH07Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX01vZHVsZV9JbnRlcmZhY2UgKQotICBjaWRfZ2V0X2ludGVyZmFjZSggRlRfTW9kdWxlICAgIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBjaWRfaW50ZXJmYWNlICkKLSAgewotICAgIEZUX1VOVVNFRCggbW9kdWxlICk7Ci0KLSAgICByZXR1cm4gZnRfc2VydmljZV9saXN0X2xvb2t1cCggY2lkX3NlcnZpY2VzLCBjaWRfaW50ZXJmYWNlICk7Ci0gIH0KLQotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGCi0gIGNvbnN0IEZUX0RyaXZlcl9DbGFzc1JlYyAgdDFjaWRfZHJpdmVyX2NsYXNzID0KLSAgewotICAgIC8qIGZpcnN0IG9mIGFsbCwgdGhlIEZUX01vZHVsZV9DbGFzcyBmaWVsZHMgKi8KLSAgICB7Ci0gICAgICBGVF9NT0RVTEVfRk9OVF9EUklWRVIgICAgICAgfAotICAgICAgRlRfTU9EVUxFX0RSSVZFUl9TQ0FMQUJMRSAgIHwKLSAgICAgIEZUX01PRFVMRV9EUklWRVJfSEFTX0hJTlRFUiwKLQotICAgICAgc2l6ZW9mICggRlRfRHJpdmVyUmVjICksCi0gICAgICAidDFjaWQiLCAgIC8qIG1vZHVsZSBuYW1lICAgICAgICAgICAqLwotICAgICAgMHgxMDAwMEwsICAvKiB2ZXJzaW9uIDEuMCBvZiBkcml2ZXIgKi8KLSAgICAgIDB4MjAwMDBMLCAgLyogcmVxdWlyZXMgRnJlZVR5cGUgMi4wICovCi0KLSAgICAgIDAsCi0KLSAgICAgIGNpZF9kcml2ZXJfaW5pdCwKLSAgICAgIGNpZF9kcml2ZXJfZG9uZSwKLSAgICAgIGNpZF9nZXRfaW50ZXJmYWNlCi0gICAgfSwKLQotICAgIC8qIHRoZW4gdGhlIG90aGVyIGZvbnQgZHJpdmVycyBmaWVsZHMgKi8KLSAgICBzaXplb2YgKCBDSURfRmFjZVJlYyApLAotICAgIHNpemVvZiAoIENJRF9TaXplUmVjICksCi0gICAgc2l6ZW9mICggQ0lEX0dseXBoU2xvdFJlYyApLAotCi0gICAgY2lkX2ZhY2VfaW5pdCwKLSAgICBjaWRfZmFjZV9kb25lLAotCi0gICAgY2lkX3NpemVfaW5pdCwKLSAgICBjaWRfc2l6ZV9kb25lLAotICAgIGNpZF9zbG90X2luaXQsCi0gICAgY2lkX3Nsb3RfZG9uZSwKLQotICAgIGNpZF9zbG90X2xvYWRfZ2x5cGgsCi0KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBGVF9GYWNlX0dldEtlcm5pbmdGdW5jICAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIEZUX0ZhY2VfQXR0YWNoRnVuYyAgICAgICovCi0KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKiBGVF9GYWNlX0dldEFkdmFuY2VzRnVuYyAqLwotCi0gICAgY2lkX3NpemVfcmVxdWVzdCwKLSAgICAwICAgICAgICAgICAgICAgICAgICAgICAvKiBGVF9TaXplX1NlbGVjdEZ1bmMgICAgICAqLwotICB9OwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWRyaXZlci5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC9jaWRyaXZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWI4Njc4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkcml2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGNpZHJpdmVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBIaWdoLWxldmVsIENJRCBkcml2ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0NJRFJJVkVSX0hfXwotI2RlZmluZSBfX0NJRFJJVkVSX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfRFJJVkVSX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0jZXJyb3IgInRoaXMgbW9kdWxlIGRvZXMgbm90IHN1cHBvcnQgUElDIHlldCIKLSNlbmRpZgotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEUKLSAgY29uc3QgRlRfRHJpdmVyX0NsYXNzUmVjICB0MWNpZF9kcml2ZXJfY2xhc3M7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19DSURSSVZFUl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkdG9rZW4uaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvY2lkdG9rZW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJlYWUwYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvY2lkL2NpZHRva2VuLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2lkdG9rZW4uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIENJRCB0b2tlbiBkZWZpbml0aW9ucyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIENJRF9GYWNlSW5mb1JlYwotI3VuZGVmICBUMUNPREUKLSNkZWZpbmUgVDFDT0RFICAgICAgICBUMV9GSUVMRF9MT0NBVElPTl9DSURfSU5GTwotCi0gIFQxX0ZJRUxEX0tFWSAgICggIkNJREZvbnROYW1lIiwgICAgY2lkX2ZvbnRfbmFtZSwgMCApCi0gIFQxX0ZJRUxEX0ZJWEVEICggIkNJREZvbnRWZXJzaW9uIiwgY2lkX3ZlcnNpb24sICAgMCApCi0gIFQxX0ZJRUxEX05VTSAgICggIkNJREZvbnRUeXBlIiwgICAgY2lkX2ZvbnRfdHlwZSwgMCApCi0gIFQxX0ZJRUxEX1NUUklORyggIlJlZ2lzdHJ5IiwgICAgICAgcmVnaXN0cnksICAgICAgMCApCi0gIFQxX0ZJRUxEX1NUUklORyggIk9yZGVyaW5nIiwgICAgICAgb3JkZXJpbmcsICAgICAgMCApCi0gIFQxX0ZJRUxEX05VTSAgICggIlN1cHBsZW1lbnQiLCAgICAgc3VwcGxlbWVudCwgICAgMCApCi0gIFQxX0ZJRUxEX05VTSAgICggIlVJREJhc2UiLCAgICAgICAgdWlkX2Jhc2UsICAgICAgMCApCi0gIFQxX0ZJRUxEX05VTSAgICggIkNJRE1hcE9mZnNldCIsICAgY2lkbWFwX29mZnNldCwgMCApCi0gIFQxX0ZJRUxEX05VTSAgICggIkZEQnl0ZXMiLCAgICAgICAgZmRfYnl0ZXMsICAgICAgMCApCi0gIFQxX0ZJRUxEX05VTSAgICggIkdEQnl0ZXMiLCAgICAgICAgZ2RfYnl0ZXMsICAgICAgMCApCi0gIFQxX0ZJRUxEX05VTSAgICggIkNJRENvdW50IiwgICAgICAgY2lkX2NvdW50LCAgICAgMCApCi0KLQotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBQU19Gb250SW5mb1JlYwotI3VuZGVmICBUMUNPREUKLSNkZWZpbmUgVDFDT0RFICAgICAgICBUMV9GSUVMRF9MT0NBVElPTl9GT05UX0lORk8KLQotICBUMV9GSUVMRF9TVFJJTkcoICJ2ZXJzaW9uIiwgICAgICAgICAgICB2ZXJzaW9uLCAgICAgICAgICAgICAwICkKLSAgVDFfRklFTERfU1RSSU5HKCAiTm90aWNlIiwgICAgICAgICAgICAgbm90aWNlLCAgICAgICAgICAgICAgMCApCi0gIFQxX0ZJRUxEX1NUUklORyggIkZ1bGxOYW1lIiwgICAgICAgICAgIGZ1bGxfbmFtZSwgICAgICAgICAgIDAgKQotICBUMV9GSUVMRF9TVFJJTkcoICJGYW1pbHlOYW1lIiwgICAgICAgICBmYW1pbHlfbmFtZSwgICAgICAgICAwICkKLSAgVDFfRklFTERfU1RSSU5HKCAiV2VpZ2h0IiwgICAgICAgICAgICAgd2VpZ2h0LCAgICAgICAgICAgICAgMCApCi0gIFQxX0ZJRUxEX05VTSAgICggIkl0YWxpY0FuZ2xlIiwgICAgICAgIGl0YWxpY19hbmdsZSwgICAgICAgIDAgKQotICBUMV9GSUVMRF9CT09MICAoICJpc0ZpeGVkUGl0Y2giLCAgICAgICBpc19maXhlZF9waXRjaCwgICAgICAwICkKLSAgVDFfRklFTERfTlVNICAgKCAiVW5kZXJsaW5lUG9zaXRpb24iLCAgdW5kZXJsaW5lX3Bvc2l0aW9uLCAgMCApCi0gIFQxX0ZJRUxEX05VTSAgICggIlVuZGVybGluZVRoaWNrbmVzcyIsIHVuZGVybGluZV90aGlja25lc3MsIDAgKQotCi0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFBTX0ZvbnRFeHRyYVJlYwotI3VuZGVmICBUMUNPREUKLSNkZWZpbmUgVDFDT0RFICAgICAgICBUMV9GSUVMRF9MT0NBVElPTl9GT05UX0VYVFJBCi0KLSAgVDFfRklFTERfTlVNICAgKCAiRlNUeXBlIiwgICAgICAgICAgICAgZnNfdHlwZSwgICAgICAgICAgICAgMCApCi0KLQotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBDSURfRmFjZURpY3RSZWMKLSN1bmRlZiAgVDFDT0RFCi0jZGVmaW5lIFQxQ09ERSAgICAgICAgVDFfRklFTERfTE9DQVRJT05fRk9OVF9ESUNUCi0KLSAgVDFfRklFTERfTlVNICAoICJQYWludFR5cGUiLCAgICAgICAgICBwYWludF90eXBlLCAgICAgICAgICAwICkKLSAgVDFfRklFTERfTlVNICAoICJGb250VHlwZSIsICAgICAgICAgICBmb250X3R5cGUsICAgICAgICAgICAwICkKLSAgVDFfRklFTERfTlVNICAoICJTdWJyTWFwT2Zmc2V0IiwgICAgICBzdWJybWFwX29mZnNldCwgICAgICAwICkKLSAgVDFfRklFTERfTlVNICAoICJTREJ5dGVzIiwgICAgICAgICAgICBzZF9ieXRlcywgICAgICAgICAgICAwICkKLSAgVDFfRklFTERfTlVNICAoICJTdWJyQ291bnQiLCAgICAgICAgICBudW1fc3VicnMsICAgICAgICAgICAwICkKLSAgVDFfRklFTERfTlVNICAoICJsZW5CdWlsZENoYXJBcnJheSIsICBsZW5fYnVpbGRjaGFyLCAgICAgICAwICkKLSAgVDFfRklFTERfRklYRUQoICJGb3JjZUJvbGRUaHJlc2hvbGQiLCBmb3JjZWJvbGRfdGhyZXNob2xkLCAwICkKLSAgVDFfRklFTERfRklYRUQoICJTdHJva2VXaWR0aCIsICAgICAgICBzdHJva2Vfd2lkdGgsICAgICAgICAwICkKLQotCi0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFBTX1ByaXZhdGVSZWMKLSN1bmRlZiAgVDFDT0RFCi0jZGVmaW5lIFQxQ09ERSAgICAgICAgVDFfRklFTERfTE9DQVRJT05fUFJJVkFURQotCi0gIFQxX0ZJRUxEX05VTSAgICAgICAoICJVbmlxdWVJRCIsICAgICAgICAgdW5pcXVlX2lkLCAgICAgIDAgKQotICBUMV9GSUVMRF9OVU0gICAgICAgKCAibGVuSVYiLCAgICAgICAgICAgIGxlbklWLCAgICAgICAgICAwICkKLSAgVDFfRklFTERfTlVNICAgICAgICggIkxhbmd1YWdlR3JvdXAiLCAgICBsYW5ndWFnZV9ncm91cCwgMCApCi0gIFQxX0ZJRUxEX05VTSAgICAgICAoICJwYXNzd29yZCIsICAgICAgICAgcGFzc3dvcmQsICAgICAgIDAgKQotCi0gIFQxX0ZJRUxEX0ZJWEVEXzEwMDAoICJCbHVlU2NhbGUiLCAgICAgICAgYmx1ZV9zY2FsZSwgICAgIDAgKQotICBUMV9GSUVMRF9OVU0gICAgICAgKCAiQmx1ZVNoaWZ0IiwgICAgICAgIGJsdWVfc2hpZnQsICAgICAwICkKLSAgVDFfRklFTERfTlVNICAgICAgICggIkJsdWVGdXp6IiwgICAgICAgICBibHVlX2Z1enosICAgICAgMCApCi0KLSAgVDFfRklFTERfTlVNX1RBQkxFICggIkJsdWVWYWx1ZXMiLCAgICAgICBibHVlX3ZhbHVlcywgICAgICAgIDE0LCAwICkKLSAgVDFfRklFTERfTlVNX1RBQkxFICggIk90aGVyQmx1ZXMiLCAgICAgICBvdGhlcl9ibHVlcywgICAgICAgIDEwLCAwICkKLSAgVDFfRklFTERfTlVNX1RBQkxFICggIkZhbWlseUJsdWVzIiwgICAgICBmYW1pbHlfYmx1ZXMsICAgICAgIDE0LCAwICkKLSAgVDFfRklFTERfTlVNX1RBQkxFICggIkZhbWlseU90aGVyQmx1ZXMiLCBmYW1pbHlfb3RoZXJfYmx1ZXMsIDEwLCAwICkKLQotICBUMV9GSUVMRF9OVU1fVEFCTEUyKCAiU3RkSFciLCAgICAgICAgICAgIHN0YW5kYXJkX3dpZHRoLCAgICAgIDEsIDAgKQotICBUMV9GSUVMRF9OVU1fVEFCTEUyKCAiU3RkVlciLCAgICAgICAgICAgIHN0YW5kYXJkX2hlaWdodCwgICAgIDEsIDAgKQotICBUMV9GSUVMRF9OVU1fVEFCTEUyKCAiTWluRmVhdHVyZSIsICAgICAgIG1pbl9mZWF0dXJlLCAgICAgICAgIDIsIDAgKQotCi0gIFQxX0ZJRUxEX05VTV9UQUJMRSAoICJTdGVtU25hcEgiLCAgICAgICAgc25hcF93aWR0aHMsICAgICAgICAxMiwgMCApCi0gIFQxX0ZJRUxEX05VTV9UQUJMRSAoICJTdGVtU25hcFYiLCAgICAgICAgc25hcF9oZWlnaHRzLCAgICAgICAxMiwgMCApCi0KLSAgVDFfRklFTERfQk9PTCAgICAgICggIkZvcmNlQm9sZCIsICAgICAgICBmb3JjZV9ib2xkLCAgICAgICAgICAwICkKLQotCi0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIEZUX0JCb3gKLSN1bmRlZiAgVDFDT0RFCi0jZGVmaW5lIFQxQ09ERSAgICAgICAgVDFfRklFTERfTE9DQVRJT05fQkJPWAotCi0gIFQxX0ZJRUxEX0JCT1goICJGb250QkJveCIsIHhNaW4sIDAgKQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC90eXBlMWNpZC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL2NpZC90eXBlMWNpZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDU0Y2E3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9jaWQvdHlwZTFjaWQuYworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR5cGUxY2lkLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBPcGVuVHlwZSBkcml2ZXIgY29tcG9uZW50IChib2R5IG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgImNpZHBhcnNlLmMiCi0jaW5jbHVkZSAiY2lkbG9hZC5jIgotI2luY2x1ZGUgImNpZG9ianMuYyIKLSNpbmNsdWRlICJjaWRyaXZlci5jIgotI2luY2x1ZGUgImNpZGdsb2FkLmMiCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvSmFtZmlsZSBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzkzZjBkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyBGcmVlVHlwZSAyIHNyYy9wc2F1eCBKYW1maWxlCi0jCi0jIENvcHlyaWdodCAyMDAxLTIwMTUgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi1TdWJEaXIgIEZUMl9UT1AgJChGVDJfU1JDX0RJUikgcHNhdXggOwotCi17Ci0gIGxvY2FsICBfc291cmNlcyA7Ci0KLSAgaWYgJChGVDJfTVVMVEkpCi0gIHsKLSAgICBfc291cmNlcyA9IGFmbXBhcnNlCi0gICAgICAgICAgICAgICBwc2F1eG1vZAotICAgICAgICAgICAgICAgcHNjb252Ci0gICAgICAgICAgICAgICBwc29ianMKLSAgICAgICAgICAgICAgIHQxY21hcAotICAgICAgICAgICAgICAgdDFkZWNvZGUKLSAgICAgICAgICAgICAgIDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBfc291cmNlcyA9IHBzYXV4IDsKLSAgfQotCi0gIExpYnJhcnkgICQoRlQyX0xJQikgOiAkKF9zb3VyY2VzKS5jIDsKLX0KLQotIyBlbmQgb2Ygc3JjL3BzYXV4IEphbWZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC9hZm1wYXJzZS5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L2FmbXBhcnNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZDQ0ZWMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L2FmbXBhcnNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYWZtcGFyc2UuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFGTSBwYXJzZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICi0KLSNpbmNsdWRlICJhZm1wYXJzZS5oIgotI2luY2x1ZGUgInBzY29udi5oIgotCi0jaW5jbHVkZSAicHNhdXhlcnIuaCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFGTV9TdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhlIHVzZSBvZiBBRk1fU3RyZWFtIGlzIGxhcmdlbHkgaW5zcGlyZWQgYnkgcGFyc2VBRk0uW2NoXSBmcm9tIHQxbGliLiAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIGVudW0KLSAgewotICAgIEFGTV9TVFJFQU1fU1RBVFVTX05PUk1BTCwKLSAgICBBRk1fU1RSRUFNX1NUQVRVU19FT0MsCi0gICAgQUZNX1NUUkVBTV9TVEFUVVNfRU9MLAotICAgIEFGTV9TVFJFQU1fU1RBVFVTX0VPRgotICB9OwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIEFGTV9TdHJlYW1SZWNfCi0gIHsKLSAgICBGVF9CeXRlKiAgY3Vyc29yOwotICAgIEZUX0J5dGUqICBiYXNlOwotICAgIEZUX0J5dGUqICBsaW1pdDsKLQotICAgIEZUX0ludCAgICBzdGF0dXM7Ci0KLSAgfSBBRk1fU3RyZWFtUmVjOwotCi0KLSNpZm5kZWYgRU9GCi0jZGVmaW5lIEVPRiAtMQotI2VuZGlmCi0KLQotICAvKiB0aGlzIHdvcmtzIGJlY2F1c2UgZW1wdHkgbGluZXMgYXJlIGlnbm9yZWQgKi8KLSNkZWZpbmUgQUZNX0lTX05FV0xJTkUoIGNoICkgICggKGNoKSA9PSAnXHInIHx8IChjaCkgPT0gJ1xuJyApCi0KLSNkZWZpbmUgQUZNX0lTX0VPRiggY2ggKSAgICAgICggKGNoKSA9PSBFT0YgIHx8IChjaCkgPT0gJ1x4MWEnICkKLSNkZWZpbmUgQUZNX0lTX1NQQUNFKCBjaCApICAgICggKGNoKSA9PSAnICcgIHx8IChjaCkgPT0gJ1x0JyApCi0KLSAgLyogY29sdW1uIHNlcGFyYXRvcjsgdGhlcmUgaXMgbm8gYGNvbHVtbicgaW4gdGhlIHNwZWMgYWN0dWFsbHkgKi8KLSNkZWZpbmUgQUZNX0lTX1NFUCggY2ggKSAgICAgICggKGNoKSA9PSAnOycgKQotCi0jZGVmaW5lIEFGTV9HRVRDKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKCAoc3RyZWFtKS0+Y3Vyc29yIDwgKHN0cmVhbSktPmxpbWl0ICkgPyAqKHN0cmVhbSktPmN1cnNvcisrIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRU9GICkKLQotI2RlZmluZSBBRk1fU1RSRUFNX0tFWV9CRUdJTiggc3RyZWFtICkgICAgXAotICAgICAgICAgIChjaGFyKikoIChzdHJlYW0pLT5jdXJzb3IgLSAxICkKLQotI2RlZmluZSBBRk1fU1RSRUFNX0tFWV9MRU4oIHN0cmVhbSwga2V5ICkgICAgICAgICAgIFwKLSAgICAgICAgICAoRlRfT2Zmc2V0KSggKGNoYXIqKShzdHJlYW0pLT5jdXJzb3IgLSBrZXkgLSAxICkKLQotI2RlZmluZSBBRk1fU1RBVFVTX0VPQyggc3RyZWFtICkgXAotICAgICAgICAgICggKHN0cmVhbSktPnN0YXR1cyA+PSBBRk1fU1RSRUFNX1NUQVRVU19FT0MgKQotCi0jZGVmaW5lIEFGTV9TVEFUVVNfRU9MKCBzdHJlYW0gKSBcCi0gICAgICAgICAgKCAoc3RyZWFtKS0+c3RhdHVzID49IEFGTV9TVFJFQU1fU1RBVFVTX0VPTCApCi0KLSNkZWZpbmUgQUZNX1NUQVRVU19FT0YoIHN0cmVhbSApIFwKLSAgICAgICAgICAoIChzdHJlYW0pLT5zdGF0dXMgPj0gQUZNX1NUUkVBTV9TVEFUVVNfRU9GICkKLQotCi0gIHN0YXRpYyBpbnQKLSAgYWZtX3N0cmVhbV9za2lwX3NwYWNlcyggQUZNX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIGludCAgY2ggPSAwOyAgLyogbWFrZSBzdHVwaWQgY29tcGlsZXIgaGFwcHkgKi8KLQotCi0gICAgaWYgKCBBRk1fU1RBVFVTX0VPQyggc3RyZWFtICkgKQotICAgICAgcmV0dXJuICc7JzsKLQotICAgIHdoaWxlICggMSApCi0gICAgewotICAgICAgY2ggPSBBRk1fR0VUQygpOwotICAgICAgaWYgKCAhQUZNX0lTX1NQQUNFKCBjaCApICkKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKCBBRk1fSVNfTkVXTElORSggY2ggKSApCi0gICAgICBzdHJlYW0tPnN0YXR1cyA9IEFGTV9TVFJFQU1fU1RBVFVTX0VPTDsKLSAgICBlbHNlIGlmICggQUZNX0lTX1NFUCggY2ggKSApCi0gICAgICBzdHJlYW0tPnN0YXR1cyA9IEFGTV9TVFJFQU1fU1RBVFVTX0VPQzsKLSAgICBlbHNlIGlmICggQUZNX0lTX0VPRiggY2ggKSApCi0gICAgICBzdHJlYW0tPnN0YXR1cyA9IEFGTV9TVFJFQU1fU1RBVFVTX0VPRjsKLQotICAgIHJldHVybiBjaDsKLSAgfQotCi0KLSAgLyogcmVhZCBhIGtleSBvciB2YWx1ZSBpbiBjdXJyZW50IGNvbHVtbiAqLwotICBzdGF0aWMgY2hhcioKLSAgYWZtX3N0cmVhbV9yZWFkX29uZSggQUZNX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIGNoYXIqICBzdHI7Ci0KLQotICAgIGFmbV9zdHJlYW1fc2tpcF9zcGFjZXMoIHN0cmVhbSApOwotICAgIGlmICggQUZNX1NUQVRVU19FT0MoIHN0cmVhbSApICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgc3RyID0gQUZNX1NUUkVBTV9LRVlfQkVHSU4oIHN0cmVhbSApOwotCi0gICAgd2hpbGUgKCAxICkKLSAgICB7Ci0gICAgICBpbnQgIGNoID0gQUZNX0dFVEMoKTsKLQotCi0gICAgICBpZiAoIEFGTV9JU19TUEFDRSggY2ggKSApCi0gICAgICAgIGJyZWFrOwotICAgICAgZWxzZSBpZiAoIEFGTV9JU19ORVdMSU5FKCBjaCApICkKLSAgICAgIHsKLSAgICAgICAgc3RyZWFtLT5zdGF0dXMgPSBBRk1fU1RSRUFNX1NUQVRVU19FT0w7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIEFGTV9JU19TRVAoIGNoICkgKQotICAgICAgewotICAgICAgICBzdHJlYW0tPnN0YXR1cyA9IEFGTV9TVFJFQU1fU1RBVFVTX0VPQzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggQUZNX0lTX0VPRiggY2ggKSApCi0gICAgICB7Ci0gICAgICAgIHN0cmVhbS0+c3RhdHVzID0gQUZNX1NUUkVBTV9TVEFUVVNfRU9GOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gc3RyOwotICB9Ci0KLQotICAvKiByZWFkIGEgc3RyaW5nIChpLmUuLCByZWFkIHRvIEVPTCkgKi8KLSAgc3RhdGljIGNoYXIqCi0gIGFmbV9zdHJlYW1fcmVhZF9zdHJpbmcoIEFGTV9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBjaGFyKiAgc3RyOwotCi0KLSAgICBhZm1fc3RyZWFtX3NraXBfc3BhY2VzKCBzdHJlYW0gKTsKLSAgICBpZiAoIEFGTV9TVEFUVVNfRU9MKCBzdHJlYW0gKSApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIHN0ciA9IEFGTV9TVFJFQU1fS0VZX0JFR0lOKCBzdHJlYW0gKTsKLQotICAgIC8qIHNjYW4gdG8gZW9sICovCi0gICAgd2hpbGUgKCAxICkKLSAgICB7Ci0gICAgICBpbnQgIGNoID0gQUZNX0dFVEMoKTsKLQotCi0gICAgICBpZiAoIEFGTV9JU19ORVdMSU5FKCBjaCApICkKLSAgICAgIHsKLSAgICAgICAgc3RyZWFtLT5zdGF0dXMgPSBBRk1fU1RSRUFNX1NUQVRVU19FT0w7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIEFGTV9JU19FT0YoIGNoICkgKQotICAgICAgewotICAgICAgICBzdHJlYW0tPnN0YXR1cyA9IEFGTV9TVFJFQU1fU1RBVFVTX0VPRjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0cjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBRk1fUGFyc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIGFsbCBrZXlzIGRlZmluZWQgaW4gQ2guIDctMTAgb2YgNTAwNC5BRk1fU3BlYy5wZGYgKi8KLSAgdHlwZWRlZiBlbnVtICBBRk1fVG9rZW5fCi0gIHsKLSAgICBBRk1fVE9LRU5fQVNDRU5ERVIsCi0gICAgQUZNX1RPS0VOX0FYSVNMQUJFTCwKLSAgICBBRk1fVE9LRU5fQVhJU1RZUEUsCi0gICAgQUZNX1RPS0VOX0IsCi0gICAgQUZNX1RPS0VOX0JMRU5EQVhJU1RZUEVTLAotICAgIEFGTV9UT0tFTl9CTEVORERFU0lHTk1BUCwKLSAgICBBRk1fVE9LRU5fQkxFTkRERVNJR05QT1NJVElPTlMsCi0gICAgQUZNX1RPS0VOX0MsCi0gICAgQUZNX1RPS0VOX0NDLAotICAgIEFGTV9UT0tFTl9DSCwKLSAgICBBRk1fVE9LRU5fQ0FQSEVJR0hULAotICAgIEFGTV9UT0tFTl9DSEFSV0lEVEgsCi0gICAgQUZNX1RPS0VOX0NIQVJBQ1RFUlNFVCwKLSAgICBBRk1fVE9LRU5fQ0hBUkFDVEVSUywKLSAgICBBRk1fVE9LRU5fREVTQ0VOREVSLAotICAgIEFGTV9UT0tFTl9FTkNPRElOR1NDSEVNRSwKLSAgICBBRk1fVE9LRU5fRU5EQVhJUywKLSAgICBBRk1fVE9LRU5fRU5EQ0hBUk1FVFJJQ1MsCi0gICAgQUZNX1RPS0VOX0VORENPTVBPU0lURVMsCi0gICAgQUZNX1RPS0VOX0VORERJUkVDVElPTiwKLSAgICBBRk1fVE9LRU5fRU5ERk9OVE1FVFJJQ1MsCi0gICAgQUZNX1RPS0VOX0VOREtFUk5EQVRBLAotICAgIEFGTV9UT0tFTl9FTkRLRVJOUEFJUlMsCi0gICAgQUZNX1RPS0VOX0VORFRSQUNLS0VSTiwKLSAgICBBRk1fVE9LRU5fRVNDQ0hBUiwKLSAgICBBRk1fVE9LRU5fRkFNSUxZTkFNRSwKLSAgICBBRk1fVE9LRU5fRk9OVEJCT1gsCi0gICAgQUZNX1RPS0VOX0ZPTlROQU1FLAotICAgIEFGTV9UT0tFTl9GVUxMTkFNRSwKLSAgICBBRk1fVE9LRU5fSVNCQVNFRk9OVCwKLSAgICBBRk1fVE9LRU5fSVNDSURGT05ULAotICAgIEFGTV9UT0tFTl9JU0ZJWEVEUElUQ0gsCi0gICAgQUZNX1RPS0VOX0lTRklYRURWLAotICAgIEFGTV9UT0tFTl9JVEFMSUNBTkdMRSwKLSAgICBBRk1fVE9LRU5fS1AsCi0gICAgQUZNX1RPS0VOX0tQSCwKLSAgICBBRk1fVE9LRU5fS1BYLAotICAgIEFGTV9UT0tFTl9LUFksCi0gICAgQUZNX1RPS0VOX0wsCi0gICAgQUZNX1RPS0VOX01BUFBJTkdTQ0hFTUUsCi0gICAgQUZNX1RPS0VOX01FVFJJQ1NTRVRTLAotICAgIEFGTV9UT0tFTl9OLAotICAgIEFGTV9UT0tFTl9OT1RJQ0UsCi0gICAgQUZNX1RPS0VOX1BDQywKLSAgICBBRk1fVE9LRU5fU1RBUlRBWElTLAotICAgIEFGTV9UT0tFTl9TVEFSVENIQVJNRVRSSUNTLAotICAgIEFGTV9UT0tFTl9TVEFSVENPTVBPU0lURVMsCi0gICAgQUZNX1RPS0VOX1NUQVJURElSRUNUSU9OLAotICAgIEFGTV9UT0tFTl9TVEFSVEZPTlRNRVRSSUNTLAotICAgIEFGTV9UT0tFTl9TVEFSVEtFUk5EQVRBLAotICAgIEFGTV9UT0tFTl9TVEFSVEtFUk5QQUlSUywKLSAgICBBRk1fVE9LRU5fU1RBUlRLRVJOUEFJUlMwLAotICAgIEFGTV9UT0tFTl9TVEFSVEtFUk5QQUlSUzEsCi0gICAgQUZNX1RPS0VOX1NUQVJUVFJBQ0tLRVJOLAotICAgIEFGTV9UT0tFTl9TVERIVywKLSAgICBBRk1fVE9LRU5fU1REVlcsCi0gICAgQUZNX1RPS0VOX1RSQUNLS0VSTiwKLSAgICBBRk1fVE9LRU5fVU5ERVJMSU5FUE9TSVRJT04sCi0gICAgQUZNX1RPS0VOX1VOREVSTElORVRISUNLTkVTUywKLSAgICBBRk1fVE9LRU5fVlYsCi0gICAgQUZNX1RPS0VOX1ZWRUNUT1IsCi0gICAgQUZNX1RPS0VOX1ZFUlNJT04sCi0gICAgQUZNX1RPS0VOX1csCi0gICAgQUZNX1RPS0VOX1cwLAotICAgIEFGTV9UT0tFTl9XMFgsCi0gICAgQUZNX1RPS0VOX1cwWSwKLSAgICBBRk1fVE9LRU5fVzEsCi0gICAgQUZNX1RPS0VOX1cxWCwKLSAgICBBRk1fVE9LRU5fVzFZLAotICAgIEFGTV9UT0tFTl9XWCwKLSAgICBBRk1fVE9LRU5fV1ksCi0gICAgQUZNX1RPS0VOX1dFSUdIVCwKLSAgICBBRk1fVE9LRU5fV0VJR0hUVkVDVE9SLAotICAgIEFGTV9UT0tFTl9YSEVJR0hULAotICAgIE5fQUZNX1RPS0VOUywKLSAgICBBRk1fVE9LRU5fVU5LTk9XTgotCi0gIH0gQUZNX1Rva2VuOwotCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIqICBjb25zdCBhZm1fa2V5X3RhYmxlW05fQUZNX1RPS0VOU10gPQotICB7Ci0gICAgIkFzY2VuZGVyIiwKLSAgICAiQXhpc0xhYmVsIiwKLSAgICAiQXhpc1R5cGUiLAotICAgICJCIiwKLSAgICAiQmxlbmRBeGlzVHlwZXMiLAotICAgICJCbGVuZERlc2lnbk1hcCIsCi0gICAgIkJsZW5kRGVzaWduUG9zaXRpb25zIiwKLSAgICAiQyIsCi0gICAgIkNDIiwKLSAgICAiQ0giLAotICAgICJDYXBIZWlnaHQiLAotICAgICJDaGFyV2lkdGgiLAotICAgICJDaGFyYWN0ZXJTZXQiLAotICAgICJDaGFyYWN0ZXJzIiwKLSAgICAiRGVzY2VuZGVyIiwKLSAgICAiRW5jb2RpbmdTY2hlbWUiLAotICAgICJFbmRBeGlzIiwKLSAgICAiRW5kQ2hhck1ldHJpY3MiLAotICAgICJFbmRDb21wb3NpdGVzIiwKLSAgICAiRW5kRGlyZWN0aW9uIiwKLSAgICAiRW5kRm9udE1ldHJpY3MiLAotICAgICJFbmRLZXJuRGF0YSIsCi0gICAgIkVuZEtlcm5QYWlycyIsCi0gICAgIkVuZFRyYWNrS2VybiIsCi0gICAgIkVzY0NoYXIiLAotICAgICJGYW1pbHlOYW1lIiwKLSAgICAiRm9udEJCb3giLAotICAgICJGb250TmFtZSIsCi0gICAgIkZ1bGxOYW1lIiwKLSAgICAiSXNCYXNlRm9udCIsCi0gICAgIklzQ0lERm9udCIsCi0gICAgIklzRml4ZWRQaXRjaCIsCi0gICAgIklzRml4ZWRWIiwKLSAgICAiSXRhbGljQW5nbGUiLAotICAgICJLUCIsCi0gICAgIktQSCIsCi0gICAgIktQWCIsCi0gICAgIktQWSIsCi0gICAgIkwiLAotICAgICJNYXBwaW5nU2NoZW1lIiwKLSAgICAiTWV0cmljc1NldHMiLAotICAgICJOIiwKLSAgICAiTm90aWNlIiwKLSAgICAiUENDIiwKLSAgICAiU3RhcnRBeGlzIiwKLSAgICAiU3RhcnRDaGFyTWV0cmljcyIsCi0gICAgIlN0YXJ0Q29tcG9zaXRlcyIsCi0gICAgIlN0YXJ0RGlyZWN0aW9uIiwKLSAgICAiU3RhcnRGb250TWV0cmljcyIsCi0gICAgIlN0YXJ0S2VybkRhdGEiLAotICAgICJTdGFydEtlcm5QYWlycyIsCi0gICAgIlN0YXJ0S2VyblBhaXJzMCIsCi0gICAgIlN0YXJ0S2VyblBhaXJzMSIsCi0gICAgIlN0YXJ0VHJhY2tLZXJuIiwKLSAgICAiU3RkSFciLAotICAgICJTdGRWVyIsCi0gICAgIlRyYWNrS2VybiIsCi0gICAgIlVuZGVybGluZVBvc2l0aW9uIiwKLSAgICAiVW5kZXJsaW5lVGhpY2tuZXNzIiwKLSAgICAiVlYiLAotICAgICJWVmVjdG9yIiwKLSAgICAiVmVyc2lvbiIsCi0gICAgIlciLAotICAgICJXMCIsCi0gICAgIlcwWCIsCi0gICAgIlcwWSIsCi0gICAgIlcxIiwKLSAgICAiVzFYIiwKLSAgICAiVzFZIiwKLSAgICAiV1giLAotICAgICJXWSIsCi0gICAgIldlaWdodCIsCi0gICAgIldlaWdodFZlY3RvciIsCi0gICAgIlhIZWlnaHQiCi0gIH07Ci0KLQotICAvKgotICAgKiBgYWZtX3BhcnNlcl9yZWFkX3ZhbHMnIGFuZCBgYWZtX3BhcnNlcl9uZXh0X2tleScgcHJvdmlkZQotICAgKiBoaWdoLWxldmVsIG9wZXJhdGlvbnMgdG8gYW4gQUZNX1N0cmVhbS4gIFRoZSByZXN0IG9mIHRoZQotICAgKiBwYXJzZXIgZnVuY3Rpb25zIHNob3VsZCB1c2UgdGhlbSB3aXRob3V0IGFjY2Vzc2luZyB0aGUKLSAgICogQUZNX1N0cmVhbSBkaXJlY3RseS4KLSAgICovCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9JbnQgKQotICBhZm1fcGFyc2VyX3JlYWRfdmFscyggQUZNX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgQUZNX1ZhbHVlICAgdmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIG4gKQotICB7Ci0gICAgQUZNX1N0cmVhbSAgc3RyZWFtID0gcGFyc2VyLT5zdHJlYW07Ci0gICAgY2hhciogICAgICAgc3RyOwotICAgIEZUX0ludCAgICAgIGk7Ci0KLQotICAgIGlmICggbiA+IEFGTV9NQVhfQVJHVU1FTlRTICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBuOyBpKysgKQotICAgIHsKLSAgICAgIEZUX09mZnNldCAgbGVuOwotICAgICAgQUZNX1ZhbHVlICB2YWwgPSB2YWxzICsgaTsKLQotCi0gICAgICBpZiAoIHZhbC0+dHlwZSA9PSBBRk1fVkFMVUVfVFlQRV9TVFJJTkcgKQotICAgICAgICBzdHIgPSBhZm1fc3RyZWFtX3JlYWRfc3RyaW5nKCBzdHJlYW0gKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc3RyID0gYWZtX3N0cmVhbV9yZWFkX29uZSggc3RyZWFtICk7Ci0KLSAgICAgIGlmICggIXN0ciApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBsZW4gPSBBRk1fU1RSRUFNX0tFWV9MRU4oIHN0cmVhbSwgc3RyICk7Ci0KLSAgICAgIHN3aXRjaCAoIHZhbC0+dHlwZSApCi0gICAgICB7Ci0gICAgICBjYXNlIEFGTV9WQUxVRV9UWVBFX1NUUklORzoKLSAgICAgIGNhc2UgQUZNX1ZBTFVFX1RZUEVfTkFNRToKLSAgICAgICAgewotICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gcGFyc2VyLT5tZW1vcnk7Ci0gICAgICAgICAgRlRfRXJyb3IgICBlcnJvcjsKLQotCi0gICAgICAgICAgaWYgKCAhRlRfUUFMTE9DKCB2YWwtPnUucywgbGVuICsgMSApICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmdF9tZW1jcHkoIHZhbC0+dS5zLCBzdHIsIGxlbiApOwotICAgICAgICAgICAgdmFsLT51LnNbbGVuXSA9ICdcMCc7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFGTV9WQUxVRV9UWVBFX0ZJWEVEOgotICAgICAgICB2YWwtPnUuZiA9IFBTX0NvbnZfVG9GaXhlZCggKEZUX0J5dGUqKikodm9pZCopJnN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9CeXRlKilzdHIgKyBsZW4sIDAgKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQUZNX1ZBTFVFX1RZUEVfSU5URUdFUjoKLSAgICAgICAgdmFsLT51LmkgPSBQU19Db252X1RvSW50KCAoRlRfQnl0ZSoqKSh2b2lkKikmc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9CeXRlKilzdHIgKyBsZW4gKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQUZNX1ZBTFVFX1RZUEVfQk9PTDoKLSAgICAgICAgdmFsLT51LmIgPSBGVF9CT09MKCBsZW4gPT0gNCAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICFmdF9zdHJuY21wKCBzdHIsICJ0cnVlIiwgNCApICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFGTV9WQUxVRV9UWVBFX0lOREVYOgotICAgICAgICBpZiAoIHBhcnNlci0+Z2V0X2luZGV4ICkKLSAgICAgICAgICB2YWwtPnUuaSA9IHBhcnNlci0+Z2V0X2luZGV4KCBzdHIsIGxlbiwgcGFyc2VyLT51c2VyX2RhdGEgKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHZhbC0+dS5pID0gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggY2hhciogKQotICBhZm1fcGFyc2VyX25leHRfa2V5KCBBRk1fUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgIGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX09mZnNldCogIGxlbiApCi0gIHsKLSAgICBBRk1fU3RyZWFtICBzdHJlYW0gPSBwYXJzZXItPnN0cmVhbTsKLSAgICBjaGFyKiAgICAgICBrZXkgICAgPSBOVUxMOyAgLyogbWFrZSBzdHVwaWQgY29tcGlsZXIgaGFwcHkgKi8KLQotCi0gICAgaWYgKCBsaW5lICkKLSAgICB7Ci0gICAgICB3aGlsZSAoIDEgKQotICAgICAgewotICAgICAgICAvKiBza2lwIGN1cnJlbnQgbGluZSAqLwotICAgICAgICBpZiAoICFBRk1fU1RBVFVTX0VPTCggc3RyZWFtICkgKQotICAgICAgICAgIGFmbV9zdHJlYW1fcmVhZF9zdHJpbmcoIHN0cmVhbSApOwotCi0gICAgICAgIHN0cmVhbS0+c3RhdHVzID0gQUZNX1NUUkVBTV9TVEFUVVNfTk9STUFMOwotICAgICAgICBrZXkgPSBhZm1fc3RyZWFtX3JlYWRfb25lKCBzdHJlYW0gKTsKLQotICAgICAgICAvKiBza2lwIGVtcHR5IGxpbmUgKi8KLSAgICAgICAgaWYgKCAha2V5ICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgIUFGTV9TVEFUVVNfRU9GKCBzdHJlYW0gKSAmJgotICAgICAgICAgICAgIEFGTV9TVEFUVVNfRU9MKCBzdHJlYW0gKSAgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgd2hpbGUgKCAxICkKLSAgICAgIHsKLSAgICAgICAgLyogc2tpcCBjdXJyZW50IGNvbHVtbiAqLwotICAgICAgICB3aGlsZSAoICFBRk1fU1RBVFVTX0VPQyggc3RyZWFtICkgKQotICAgICAgICAgIGFmbV9zdHJlYW1fcmVhZF9vbmUoIHN0cmVhbSApOwotCi0gICAgICAgIHN0cmVhbS0+c3RhdHVzID0gQUZNX1NUUkVBTV9TVEFUVVNfTk9STUFMOwotICAgICAgICBrZXkgPSBhZm1fc3RyZWFtX3JlYWRfb25lKCBzdHJlYW0gKTsKLQotICAgICAgICAvKiBza2lwIGVtcHR5IGNvbHVtbiAqLwotICAgICAgICBpZiAoICFrZXkgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAhQUZNX1NUQVRVU19FT0YoIHN0cmVhbSApICYmCi0gICAgICAgICAgICAgQUZNX1NUQVRVU19FT0MoIHN0cmVhbSApICApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBsZW4gKQotICAgICAgKmxlbiA9ICgga2V5ICkgPyAoRlRfT2Zmc2V0KUFGTV9TVFJFQU1fS0VZX0xFTiggc3RyZWFtLCBrZXkgKQotICAgICAgICAgICAgICAgICAgICAgOiAwOwotCi0gICAgcmV0dXJuIGtleTsKLSAgfQotCi0KLSAgc3RhdGljIEFGTV9Ub2tlbgotICBhZm1fdG9rZW5pemUoIGNvbnN0IGNoYXIqICBrZXksCi0gICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICAgIGxlbiApCi0gIHsKLSAgICBpbnQgIG47Ci0KLQotICAgIGZvciAoIG4gPSAwOyBuIDwgTl9BRk1fVE9LRU5TOyBuKysgKQotICAgIHsKLSAgICAgIGlmICggKiggYWZtX2tleV90YWJsZVtuXSApID09ICprZXkgKQotICAgICAgewotICAgICAgICBmb3IgKCA7IG4gPCBOX0FGTV9UT0tFTlM7IG4rKyApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoICooIGFmbV9rZXlfdGFibGVbbl0gKSAhPSAqa2V5ICkKLSAgICAgICAgICAgIHJldHVybiBBRk1fVE9LRU5fVU5LTk9XTjsKLQotICAgICAgICAgIGlmICggZnRfc3RybmNtcCggYWZtX2tleV90YWJsZVtuXSwga2V5LCBsZW4gKSA9PSAwICkKLSAgICAgICAgICAgIHJldHVybiAoQUZNX1Rva2VuKSBuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEFGTV9UT0tFTl9VTktOT1dOOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgYWZtX3BhcnNlcl9pbml0KCBBRk1fUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgbGltaXQgKQotICB7Ci0gICAgQUZNX1N0cmVhbSAgc3RyZWFtID0gTlVMTDsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLQotCi0gICAgaWYgKCBGVF9ORVcoIHN0cmVhbSApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIHN0cmVhbS0+Y3Vyc29yID0gc3RyZWFtLT5iYXNlID0gYmFzZTsKLSAgICBzdHJlYW0tPmxpbWl0ICA9IGxpbWl0OwotCi0gICAgLyogZG9uJ3Qgc2tpcCB0aGUgZmlyc3QgbGluZSBkdXJpbmcgdGhlIGZpcnN0IGNhbGwgKi8KLSAgICBzdHJlYW0tPnN0YXR1cyA9IEFGTV9TVFJFQU1fU1RBVFVTX0VPTDsKLQotICAgIHBhcnNlci0+bWVtb3J5ICAgID0gbWVtb3J5OwotICAgIHBhcnNlci0+c3RyZWFtICAgID0gc3RyZWFtOwotICAgIHBhcnNlci0+Rm9udEluZm8gID0gTlVMTDsKLSAgICBwYXJzZXItPmdldF9pbmRleCA9IE5VTEw7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIGFmbV9wYXJzZXJfZG9uZSggQUZNX1BhcnNlciAgcGFyc2VyICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gcGFyc2VyLT5tZW1vcnk7Ci0KLQotICAgIEZUX0ZSRUUoIHBhcnNlci0+c3RyZWFtICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBhZm1fcGFyc2VyX3JlYWRfaW50KCBBRk1fUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCogICAgIGFpbnQgKQotICB7Ci0gICAgQUZNX1ZhbHVlUmVjICB2YWw7Ci0KLQotICAgIHZhbC50eXBlID0gQUZNX1ZBTFVFX1RZUEVfSU5URUdFUjsKLQotICAgIGlmICggYWZtX3BhcnNlcl9yZWFkX3ZhbHMoIHBhcnNlciwgJnZhbCwgMSApID09IDEgKQotICAgIHsKLSAgICAgICphaW50ID0gdmFsLnUuaTsKLQotICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBTeW50YXhfRXJyb3IgKTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGFmbV9wYXJzZV90cmFja19rZXJuKCBBRk1fUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgQUZNX0ZvbnRJbmZvICAgZmkgPSBwYXJzZXItPkZvbnRJbmZvOwotICAgIEFGTV9UcmFja0tlcm4gIHRrOwotICAgIGNoYXIqICAgICAgICAgIGtleTsKLSAgICBGVF9PZmZzZXQgICAgICBsZW47Ci0gICAgaW50ICAgICAgICAgICAgbiA9IC0xOwotICAgIEZUX0ludCAgICAgICAgIHRtcDsKLQotCi0gICAgaWYgKCBhZm1fcGFyc2VyX3JlYWRfaW50KCBwYXJzZXIsICZ0bXAgKSApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgIGlmICggdG1wIDwgMCApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICBmaS0+TnVtVHJhY2tLZXJuID0gKEZUX1VJbnQpdG1wOwotCi0gICAgaWYgKCBmaS0+TnVtVHJhY2tLZXJuICkKLSAgICB7Ci0gICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHBhcnNlci0+bWVtb3J5OwotICAgICAgRlRfRXJyb3IgICBlcnJvcjsKLQotCi0gICAgICBpZiAoIEZUX1FORVdfQVJSQVkoIGZpLT5UcmFja0tlcm5zLCBmaS0+TnVtVHJhY2tLZXJuICkgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgd2hpbGUgKCAoIGtleSA9IGFmbV9wYXJzZXJfbmV4dF9rZXkoIHBhcnNlciwgMSwgJmxlbiApICkgIT0gMCApCi0gICAgewotICAgICAgQUZNX1ZhbHVlUmVjICBzaGFyZWRfdmFsc1s1XTsKLQotCi0gICAgICBzd2l0Y2ggKCBhZm1fdG9rZW5pemUoIGtleSwgbGVuICkgKQotICAgICAgewotICAgICAgY2FzZSBBRk1fVE9LRU5fVFJBQ0tLRVJOOgotICAgICAgICBuKys7Ci0KLSAgICAgICAgaWYgKCBuID49IChpbnQpZmktPk51bVRyYWNrS2VybiApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIHRrID0gZmktPlRyYWNrS2VybnMgKyBuOwotCi0gICAgICAgIHNoYXJlZF92YWxzWzBdLnR5cGUgPSBBRk1fVkFMVUVfVFlQRV9JTlRFR0VSOwotICAgICAgICBzaGFyZWRfdmFsc1sxXS50eXBlID0gQUZNX1ZBTFVFX1RZUEVfRklYRUQ7Ci0gICAgICAgIHNoYXJlZF92YWxzWzJdLnR5cGUgPSBBRk1fVkFMVUVfVFlQRV9GSVhFRDsKLSAgICAgICAgc2hhcmVkX3ZhbHNbM10udHlwZSA9IEFGTV9WQUxVRV9UWVBFX0ZJWEVEOwotICAgICAgICBzaGFyZWRfdmFsc1s0XS50eXBlID0gQUZNX1ZBTFVFX1RZUEVfRklYRUQ7Ci0gICAgICAgIGlmICggYWZtX3BhcnNlcl9yZWFkX3ZhbHMoIHBhcnNlciwgc2hhcmVkX3ZhbHMsIDUgKSAhPSA1ICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgdGstPmRlZ3JlZSAgICAgPSBzaGFyZWRfdmFsc1swXS51Lmk7Ci0gICAgICAgIHRrLT5taW5fcHRzaXplID0gc2hhcmVkX3ZhbHNbMV0udS5mOwotICAgICAgICB0ay0+bWluX2tlcm4gICA9IHNoYXJlZF92YWxzWzJdLnUuZjsKLSAgICAgICAgdGstPm1heF9wdHNpemUgPSBzaGFyZWRfdmFsc1szXS51LmY7Ci0gICAgICAgIHRrLT5tYXhfa2VybiAgID0gc2hhcmVkX3ZhbHNbNF0udS5mOwotCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFGTV9UT0tFTl9FTkRUUkFDS0tFUk46Ci0gICAgICBjYXNlIEFGTV9UT0tFTl9FTkRLRVJOREFUQToKLSAgICAgIGNhc2UgQUZNX1RPS0VOX0VOREZPTlRNRVRSSUNTOgotICAgICAgICBmaS0+TnVtVHJhY2tLZXJuID0gKEZUX1VJbnQpKCBuICsgMSApOwotICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgICBjYXNlIEFGTV9UT0tFTl9VTktOT1dOOgotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotICAgIH0KLQotICBGYWlsOgotICAgIHJldHVybiBGVF9USFJPVyggU3ludGF4X0Vycm9yICk7Ci0gIH0KLQotCi0jdW5kZWYgIEtFUk5fSU5ERVgKLSNkZWZpbmUgS0VSTl9JTkRFWCggZzEsIGcyICkgICggKCAoRlRfVUxvbmcpZzEgPDwgMTYgKSB8IGcyICkKLQotCi0gIC8qIGNvbXBhcmUgdHdvIGtlcm5pbmcgcGFpcnMgKi8KLSAgRlRfQ0FMTEJBQ0tfREVGKCBpbnQgKQotICBhZm1fY29tcGFyZV9rZXJuX3BhaXJzKCBjb25zdCB2b2lkKiAgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogIGIgKQotICB7Ci0gICAgQUZNX0tlcm5QYWlyICBrcDEgPSAoQUZNX0tlcm5QYWlyKWE7Ci0gICAgQUZNX0tlcm5QYWlyICBrcDIgPSAoQUZNX0tlcm5QYWlyKWI7Ci0KLSAgICBGVF9VTG9uZyAgaW5kZXgxID0gS0VSTl9JTkRFWCgga3AxLT5pbmRleDEsIGtwMS0+aW5kZXgyICk7Ci0gICAgRlRfVUxvbmcgIGluZGV4MiA9IEtFUk5fSU5ERVgoIGtwMi0+aW5kZXgxLCBrcDItPmluZGV4MiApOwotCi0KLSAgICBpZiAoIGluZGV4MSA+IGluZGV4MiApCi0gICAgICByZXR1cm4gMTsKLSAgICBlbHNlIGlmICggaW5kZXgxIDwgaW5kZXgyICkKLSAgICAgIHJldHVybiAtMTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGFmbV9wYXJzZV9rZXJuX3BhaXJzKCBBRk1fUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgQUZNX0ZvbnRJbmZvICBmaSA9IHBhcnNlci0+Rm9udEluZm87Ci0gICAgQUZNX0tlcm5QYWlyICBrcDsKLSAgICBjaGFyKiAgICAgICAgIGtleTsKLSAgICBGVF9PZmZzZXQgICAgIGxlbjsKLSAgICBpbnQgICAgICAgICAgIG4gPSAtMTsKLSAgICBGVF9JbnQgICAgICAgIHRtcDsKLQotCi0gICAgaWYgKCBhZm1fcGFyc2VyX3JlYWRfaW50KCBwYXJzZXIsICZ0bXAgKSApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICBpZiAoIHRtcCA8IDAgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgZmktPk51bUtlcm5QYWlyID0gKEZUX1VJbnQpdG1wOwotCi0gICAgaWYgKCBmaS0+TnVtS2VyblBhaXIgKQotICAgIHsKLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gcGFyc2VyLT5tZW1vcnk7Ci0gICAgICBGVF9FcnJvciAgIGVycm9yOwotCi0KLSAgICAgIGlmICggRlRfUU5FV19BUlJBWSggZmktPktlcm5QYWlycywgZmktPk51bUtlcm5QYWlyICkgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgd2hpbGUgKCAoIGtleSA9IGFmbV9wYXJzZXJfbmV4dF9rZXkoIHBhcnNlciwgMSwgJmxlbiApICkgIT0gMCApCi0gICAgewotICAgICAgQUZNX1Rva2VuICB0b2tlbiA9IGFmbV90b2tlbml6ZSgga2V5LCBsZW4gKTsKLQotCi0gICAgICBzd2l0Y2ggKCB0b2tlbiApCi0gICAgICB7Ci0gICAgICBjYXNlIEFGTV9UT0tFTl9LUDoKLSAgICAgIGNhc2UgQUZNX1RPS0VOX0tQWDoKLSAgICAgIGNhc2UgQUZNX1RPS0VOX0tQWToKLSAgICAgICAgewotICAgICAgICAgIEZUX0ludCAgICAgICAgcjsKLSAgICAgICAgICBBRk1fVmFsdWVSZWMgIHNoYXJlZF92YWxzWzRdOwotCi0KLSAgICAgICAgICBuKys7Ci0KLSAgICAgICAgICBpZiAoIG4gPj0gKGludClmaS0+TnVtS2VyblBhaXIgKQotICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAga3AgPSBmaS0+S2VyblBhaXJzICsgbjsKLQotICAgICAgICAgIHNoYXJlZF92YWxzWzBdLnR5cGUgPSBBRk1fVkFMVUVfVFlQRV9JTkRFWDsKLSAgICAgICAgICBzaGFyZWRfdmFsc1sxXS50eXBlID0gQUZNX1ZBTFVFX1RZUEVfSU5ERVg7Ci0gICAgICAgICAgc2hhcmVkX3ZhbHNbMl0udHlwZSA9IEFGTV9WQUxVRV9UWVBFX0lOVEVHRVI7Ci0gICAgICAgICAgc2hhcmVkX3ZhbHNbM10udHlwZSA9IEFGTV9WQUxVRV9UWVBFX0lOVEVHRVI7Ci0gICAgICAgICAgciA9IGFmbV9wYXJzZXJfcmVhZF92YWxzKCBwYXJzZXIsIHNoYXJlZF92YWxzLCA0ICk7Ci0gICAgICAgICAgaWYgKCByIDwgMyApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICAvKiBpbmRleCB2YWx1ZXMgY2FuJ3QgYmUgbmVnYXRpdmUgKi8KLSAgICAgICAgICBrcC0+aW5kZXgxID0gc2hhcmVkX3ZhbHNbMF0udS51OwotICAgICAgICAgIGtwLT5pbmRleDIgPSBzaGFyZWRfdmFsc1sxXS51LnU7Ci0gICAgICAgICAgaWYgKCB0b2tlbiA9PSBBRk1fVE9LRU5fS1BZICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBrcC0+eCA9IDA7Ci0gICAgICAgICAgICBrcC0+eSA9IHNoYXJlZF92YWxzWzJdLnUuaTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGtwLT54ID0gc2hhcmVkX3ZhbHNbMl0udS5pOwotICAgICAgICAgICAga3AtPnkgPSAoIHRva2VuID09IEFGTV9UT0tFTl9LUCAmJiByID09IDQgKQotICAgICAgICAgICAgICAgICAgICAgID8gc2hhcmVkX3ZhbHNbM10udS5pIDogMDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQUZNX1RPS0VOX0VOREtFUk5QQUlSUzoKLSAgICAgIGNhc2UgQUZNX1RPS0VOX0VOREtFUk5EQVRBOgotICAgICAgY2FzZSBBRk1fVE9LRU5fRU5ERk9OVE1FVFJJQ1M6Ci0gICAgICAgIGZpLT5OdW1LZXJuUGFpciA9IChGVF9VSW50KSggbiArIDEgKTsKLSAgICAgICAgZnRfcXNvcnQoIGZpLT5LZXJuUGFpcnMsIGZpLT5OdW1LZXJuUGFpciwKLSAgICAgICAgICAgICAgICAgIHNpemVvZiAoIEFGTV9LZXJuUGFpclJlYyApLAotICAgICAgICAgICAgICAgICAgYWZtX2NvbXBhcmVfa2Vybl9wYWlycyApOwotICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgICBjYXNlIEFGTV9UT0tFTl9VTktOT1dOOgotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotICAgIH0KLQotICBGYWlsOgotICAgIHJldHVybiBGVF9USFJPVyggU3ludGF4X0Vycm9yICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBhZm1fcGFyc2Vfa2Vybl9kYXRhKCBBRk1fUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBjaGFyKiAgICAgIGtleTsKLSAgICBGVF9PZmZzZXQgIGxlbjsKLQotCi0gICAgd2hpbGUgKCAoIGtleSA9IGFmbV9wYXJzZXJfbmV4dF9rZXkoIHBhcnNlciwgMSwgJmxlbiApICkgIT0gMCApCi0gICAgewotICAgICAgc3dpdGNoICggYWZtX3Rva2VuaXplKCBrZXksIGxlbiApICkKLSAgICAgIHsKLSAgICAgIGNhc2UgQUZNX1RPS0VOX1NUQVJUVFJBQ0tLRVJOOgotICAgICAgICBlcnJvciA9IGFmbV9wYXJzZV90cmFja19rZXJuKCBwYXJzZXIgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBBRk1fVE9LRU5fU1RBUlRLRVJOUEFJUlM6Ci0gICAgICBjYXNlIEFGTV9UT0tFTl9TVEFSVEtFUk5QQUlSUzA6Ci0gICAgICAgIGVycm9yID0gYWZtX3BhcnNlX2tlcm5fcGFpcnMoIHBhcnNlciApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFGTV9UT0tFTl9FTkRLRVJOREFUQToKLSAgICAgIGNhc2UgQUZNX1RPS0VOX0VOREZPTlRNRVRSSUNTOgotICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgICBjYXNlIEFGTV9UT0tFTl9VTktOT1dOOgotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotICAgIH0KLQotICBGYWlsOgotICAgIHJldHVybiBGVF9USFJPVyggU3ludGF4X0Vycm9yICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBhZm1fcGFyc2VyX3NraXBfc2VjdGlvbiggQUZNX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGTV9Ub2tlbiAgIGVuZF9zZWN0aW9uICkKLSAgewotICAgIGNoYXIqICAgICAga2V5OwotICAgIEZUX09mZnNldCAgbGVuOwotCi0KLSAgICB3aGlsZSAoIG4tLSA+IDAgKQotICAgIHsKLSAgICAgIGtleSA9IGFmbV9wYXJzZXJfbmV4dF9rZXkoIHBhcnNlciwgMSwgTlVMTCApOwotICAgICAgaWYgKCAha2V5ICkKLSAgICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgIHdoaWxlICggKCBrZXkgPSBhZm1fcGFyc2VyX25leHRfa2V5KCBwYXJzZXIsIDEsICZsZW4gKSApICE9IDAgKQotICAgIHsKLSAgICAgIEFGTV9Ub2tlbiAgdG9rZW4gPSBhZm1fdG9rZW5pemUoIGtleSwgbGVuICk7Ci0KLQotICAgICAgaWYgKCB0b2tlbiA9PSBlbmRfc2VjdGlvbiB8fCB0b2tlbiA9PSBBRk1fVE9LRU5fRU5ERk9OVE1FVFJJQ1MgKQotICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgIH0KLQotICBGYWlsOgotICAgIHJldHVybiBGVF9USFJPVyggU3ludGF4X0Vycm9yICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBhZm1fcGFyc2VyX3BhcnNlKCBBRk1fUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBwYXJzZXItPm1lbW9yeTsKLSAgICBBRk1fRm9udEluZm8gIGZpICAgICA9IHBhcnNlci0+Rm9udEluZm87Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvciAgPSBGVF9FUlIoIFN5bnRheF9FcnJvciApOwotICAgIGNoYXIqICAgICAgICAga2V5OwotICAgIEZUX09mZnNldCAgICAgbGVuOwotICAgIEZUX0ludCAgICAgICAgbWV0cmljc19zZXRzID0gMDsKLQotCi0gICAgaWYgKCAhZmkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBrZXkgPSBhZm1fcGFyc2VyX25leHRfa2V5KCBwYXJzZXIsIDEsICZsZW4gKTsKLSAgICBpZiAoICFrZXkgfHwgbGVuICE9IDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgIGZ0X3N0cm5jbXAoIGtleSwgIlN0YXJ0Rm9udE1ldHJpY3MiLCAxNiApICE9IDAgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICB3aGlsZSAoICgga2V5ID0gYWZtX3BhcnNlcl9uZXh0X2tleSggcGFyc2VyLCAxLCAmbGVuICkgKSAhPSAwICkKLSAgICB7Ci0gICAgICBBRk1fVmFsdWVSZWMgIHNoYXJlZF92YWxzWzRdOwotCi0KLSAgICAgIHN3aXRjaCAoIGFmbV90b2tlbml6ZSgga2V5LCBsZW4gKSApCi0gICAgICB7Ci0gICAgICBjYXNlIEFGTV9UT0tFTl9NRVRSSUNTU0VUUzoKLSAgICAgICAgaWYgKCBhZm1fcGFyc2VyX3JlYWRfaW50KCBwYXJzZXIsICZtZXRyaWNzX3NldHMgKSApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIGlmICggbWV0cmljc19zZXRzICE9IDAgJiYgbWV0cmljc19zZXRzICE9IDIgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0KLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQUZNX1RPS0VOX0lTQ0lERk9OVDoKLSAgICAgICAgc2hhcmVkX3ZhbHNbMF0udHlwZSA9IEFGTV9WQUxVRV9UWVBFX0JPT0w7Ci0gICAgICAgIGlmICggYWZtX3BhcnNlcl9yZWFkX3ZhbHMoIHBhcnNlciwgc2hhcmVkX3ZhbHMsIDEgKSAhPSAxICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgZmktPklzQ0lERm9udCA9IHNoYXJlZF92YWxzWzBdLnUuYjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQUZNX1RPS0VOX0ZPTlRCQk9YOgotICAgICAgICBzaGFyZWRfdmFsc1swXS50eXBlID0gQUZNX1ZBTFVFX1RZUEVfRklYRUQ7Ci0gICAgICAgIHNoYXJlZF92YWxzWzFdLnR5cGUgPSBBRk1fVkFMVUVfVFlQRV9GSVhFRDsKLSAgICAgICAgc2hhcmVkX3ZhbHNbMl0udHlwZSA9IEFGTV9WQUxVRV9UWVBFX0ZJWEVEOwotICAgICAgICBzaGFyZWRfdmFsc1szXS50eXBlID0gQUZNX1ZBTFVFX1RZUEVfRklYRUQ7Ci0gICAgICAgIGlmICggYWZtX3BhcnNlcl9yZWFkX3ZhbHMoIHBhcnNlciwgc2hhcmVkX3ZhbHMsIDQgKSAhPSA0ICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgZmktPkZvbnRCQm94LnhNaW4gPSBzaGFyZWRfdmFsc1swXS51LmY7Ci0gICAgICAgIGZpLT5Gb250QkJveC55TWluID0gc2hhcmVkX3ZhbHNbMV0udS5mOwotICAgICAgICBmaS0+Rm9udEJCb3gueE1heCA9IHNoYXJlZF92YWxzWzJdLnUuZjsKLSAgICAgICAgZmktPkZvbnRCQm94LnlNYXggPSBzaGFyZWRfdmFsc1szXS51LmY7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFGTV9UT0tFTl9BU0NFTkRFUjoKLSAgICAgICAgc2hhcmVkX3ZhbHNbMF0udHlwZSA9IEFGTV9WQUxVRV9UWVBFX0ZJWEVEOwotICAgICAgICBpZiAoIGFmbV9wYXJzZXJfcmVhZF92YWxzKCBwYXJzZXIsIHNoYXJlZF92YWxzLCAxICkgIT0gMSApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIGZpLT5Bc2NlbmRlciA9IHNoYXJlZF92YWxzWzBdLnUuZjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQUZNX1RPS0VOX0RFU0NFTkRFUjoKLSAgICAgICAgc2hhcmVkX3ZhbHNbMF0udHlwZSA9IEFGTV9WQUxVRV9UWVBFX0ZJWEVEOwotICAgICAgICBpZiAoIGFmbV9wYXJzZXJfcmVhZF92YWxzKCBwYXJzZXIsIHNoYXJlZF92YWxzLCAxICkgIT0gMSApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIGZpLT5EZXNjZW5kZXIgPSBzaGFyZWRfdmFsc1swXS51LmY7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFGTV9UT0tFTl9TVEFSVENIQVJNRVRSSUNTOgotICAgICAgICB7Ci0gICAgICAgICAgRlRfSW50ICBuID0gMDsKLQotCi0gICAgICAgICAgaWYgKCBhZm1fcGFyc2VyX3JlYWRfaW50KCBwYXJzZXIsICZuICkgKQotICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgZXJyb3IgPSBhZm1fcGFyc2VyX3NraXBfc2VjdGlvbiggcGFyc2VyLCBuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFGTV9UT0tFTl9FTkRDSEFSTUVUUklDUyApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEFGTV9UT0tFTl9TVEFSVEtFUk5EQVRBOgotICAgICAgICBlcnJvciA9IGFmbV9wYXJzZV9rZXJuX2RhdGEoIHBhcnNlciApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIC8qIGZhbGwgdGhyb3VnaCBzaW5jZSB3ZSBvbmx5IHN1cHBvcnQga2VybiBkYXRhICovCi0KLSAgICAgIGNhc2UgQUZNX1RPS0VOX0VOREZPTlRNRVRSSUNTOgotICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgRmFpbDoKLSAgICBGVF9GUkVFKCBmaS0+VHJhY2tLZXJucyApOwotICAgIGZpLT5OdW1UcmFja0tlcm4gPSAwOwotCi0gICAgRlRfRlJFRSggZmktPktlcm5QYWlycyApOwotICAgIGZpLT5OdW1LZXJuUGFpciA9IDA7Ci0KLSAgICBmaS0+SXNDSURGb250ID0gMDsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L2FmbXBhcnNlLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvYWZtcGFyc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyMmM0ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvYWZtcGFyc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGFmbXBhcnNlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBRk0gcGFyc2VyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0FGTVBBUlNFX0hfXwotI2RlZmluZSBfX0FGTVBBUlNFX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgYWZtX3BhcnNlcl9pbml0KCBBRk1fUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgbGltaXQgKTsKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgYWZtX3BhcnNlcl9kb25lKCBBRk1fUGFyc2VyICBwYXJzZXIgKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIGFmbV9wYXJzZXJfcGFyc2UoIEFGTV9QYXJzZXIgIHBhcnNlciApOwotCi0KLSAgZW51bSAgQUZNX1ZhbHVlVHlwZV8KLSAgewotICAgIEFGTV9WQUxVRV9UWVBFX1NUUklORywKLSAgICBBRk1fVkFMVUVfVFlQRV9OQU1FLAotICAgIEFGTV9WQUxVRV9UWVBFX0ZJWEVELCAgIC8qIHJlYWwgbnVtYmVyICovCi0gICAgQUZNX1ZBTFVFX1RZUEVfSU5URUdFUiwKLSAgICBBRk1fVkFMVUVfVFlQRV9CT09MLAotICAgIEFGTV9WQUxVRV9UWVBFX0lOREVYICAgIC8qIGdseXBoIGluZGV4ICovCi0gIH07Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgQUZNX1ZhbHVlUmVjXwotICB7Ci0gICAgZW51bSBBRk1fVmFsdWVUeXBlXyAgdHlwZTsKLSAgICB1bmlvbgotICAgIHsKLSAgICAgIGNoYXIqICAgICBzOwotICAgICAgRlRfRml4ZWQgIGY7Ci0gICAgICBGVF9JbnQgICAgaTsKLSAgICAgIEZUX1VJbnQgICB1OwotICAgICAgRlRfQm9vbCAgIGI7Ci0KLSAgICB9IHU7Ci0KLSAgfSBBRk1fVmFsdWVSZWMsICpBRk1fVmFsdWU7Ci0KLSNkZWZpbmUgIEFGTV9NQVhfQVJHVU1FTlRTICA1Ci0KLSAgRlRfTE9DQUwoIEZUX0ludCApCi0gIGFmbV9wYXJzZXJfcmVhZF92YWxzKCBBRk1fUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBBRk1fVmFsdWUgICB2YWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgbiApOwotCi0gIC8qIHJlYWQgdGhlIG5leHQga2V5IGZyb20gdGhlIG5leHQgbGluZSBvciBjb2x1bW4gKi8KLSAgRlRfTE9DQUwoIGNoYXIqICkKLSAgYWZtX3BhcnNlcl9uZXh0X2tleSggQUZNX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9PZmZzZXQqICBsZW4gKTsKLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19BRk1QQVJTRV9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC9wc2F1eC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3BzYXV4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMWQ5YWEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3BzYXV4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2F1eC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgYXV4aWxpYXJ5IFBvc3RTY3JpcHQgZHJpdmVyIGNvbXBvbmVudCAoYm9keSBvbmx5KS4gICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVAotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlICJwc29ianMuYyIKLSNpbmNsdWRlICJwc2F1eG1vZC5jIgotI2luY2x1ZGUgInQxZGVjb2RlLmMiCi0jaW5jbHVkZSAidDFjbWFwLmMiCi0KLSNpZm5kZWYgVDFfQ09ORklHX09QVElPTl9OT19BRk0KLSNpbmNsdWRlICJhZm1wYXJzZS5jIgotI2VuZGlmCi0KLSNpbmNsdWRlICJwc2NvbnYuYyIKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC9wc2F1eGVyci5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3BzYXV4ZXJyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NzEyZjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3BzYXV4ZXJyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2F1eGVyci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUFMgYXV4aWxpYXJ5IG1vZHVsZSBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIFBTIGF1eGlsaWFyeSBtb2R1bGUgZXJyb3IgZW51bWVyYXRpb24gKi8KLSAgLyogY29uc3RhbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1BTQVVYRVJSX0hfXwotI2RlZmluZSBfX1BTQVVYRVJSX0hfXwotCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKLQotI3VuZGVmIF9fRlRFUlJPUlNfSF9fCi0KLSN1bmRlZiAgRlRfRVJSX1BSRUZJWAotI2RlZmluZSBGVF9FUlJfUFJFRklYICBQU2F1eF9FcnJfCi0jZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfUFNhdXgKLQotI2luY2x1ZGUgRlRfRVJST1JTX0gKLQotI2VuZGlmIC8qIF9fUFNBVVhFUlJfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNhdXhtb2QuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC9wc2F1eG1vZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmZjYWIwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC9wc2F1eG1vZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzYXV4bW9kLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBhdXhpbGlhcnkgUG9zdFNjcmlwdCBtb2R1bGUgaW1wbGVtZW50YXRpb24gKGJvZHkpLiAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAicHNhdXhtb2QuaCIKLSNpbmNsdWRlICJwc29ianMuaCIKLSNpbmNsdWRlICJ0MWRlY29kZS5oIgotI2luY2x1ZGUgInQxY21hcC5oIgotCi0jaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fQUZNCi0jaW5jbHVkZSAiYWZtcGFyc2UuaCIKLSNlbmRpZgotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGCi0gIGNvbnN0IFBTX1RhYmxlX0Z1bmNzUmVjICBwc190YWJsZV9mdW5jcyA9Ci0gIHsKLSAgICBwc190YWJsZV9uZXcsCi0gICAgcHNfdGFibGVfZG9uZSwKLSAgICBwc190YWJsZV9hZGQsCi0gICAgcHNfdGFibGVfcmVsZWFzZQotICB9OwotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGCi0gIGNvbnN0IFBTX1BhcnNlcl9GdW5jc1JlYyAgcHNfcGFyc2VyX2Z1bmNzID0KLSAgewotICAgIHBzX3BhcnNlcl9pbml0LAotICAgIHBzX3BhcnNlcl9kb25lLAotICAgIHBzX3BhcnNlcl9za2lwX3NwYWNlcywKLSAgICBwc19wYXJzZXJfc2tpcF9QU190b2tlbiwKLSAgICBwc19wYXJzZXJfdG9faW50LAotICAgIHBzX3BhcnNlcl90b19maXhlZCwKLSAgICBwc19wYXJzZXJfdG9fYnl0ZXMsCi0gICAgcHNfcGFyc2VyX3RvX2Nvb3JkX2FycmF5LAotICAgIHBzX3BhcnNlcl90b19maXhlZF9hcnJheSwKLSAgICBwc19wYXJzZXJfdG9fdG9rZW4sCi0gICAgcHNfcGFyc2VyX3RvX3Rva2VuX2FycmF5LAotICAgIHBzX3BhcnNlcl9sb2FkX2ZpZWxkLAotICAgIHBzX3BhcnNlcl9sb2FkX2ZpZWxkX3RhYmxlCi0gIH07Ci0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYKLSAgY29uc3QgVDFfQnVpbGRlcl9GdW5jc1JlYyAgdDFfYnVpbGRlcl9mdW5jcyA9Ci0gIHsKLSAgICB0MV9idWlsZGVyX2luaXQsCi0gICAgdDFfYnVpbGRlcl9kb25lLAotICAgIHQxX2J1aWxkZXJfY2hlY2tfcG9pbnRzLAotICAgIHQxX2J1aWxkZXJfYWRkX3BvaW50LAotICAgIHQxX2J1aWxkZXJfYWRkX3BvaW50MSwKLSAgICB0MV9idWlsZGVyX2FkZF9jb250b3VyLAotICAgIHQxX2J1aWxkZXJfc3RhcnRfcG9pbnQsCi0gICAgdDFfYnVpbGRlcl9jbG9zZV9jb250b3VyCi0gIH07Ci0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYKLSAgY29uc3QgVDFfRGVjb2Rlcl9GdW5jc1JlYyAgdDFfZGVjb2Rlcl9mdW5jcyA9Ci0gIHsKLSAgICB0MV9kZWNvZGVyX2luaXQsCi0gICAgdDFfZGVjb2Rlcl9kb25lLAotICAgIHQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MKLSAgfTsKLQotCi0jaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fQUZNCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRgotICBjb25zdCBBRk1fUGFyc2VyX0Z1bmNzUmVjICBhZm1fcGFyc2VyX2Z1bmNzID0KLSAgewotICAgIGFmbV9wYXJzZXJfaW5pdCwKLSAgICBhZm1fcGFyc2VyX2RvbmUsCi0gICAgYWZtX3BhcnNlcl9wYXJzZQotICB9OwotI2VuZGlmCi0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYKLSAgY29uc3QgVDFfQ01hcF9DbGFzc2VzUmVjICB0MV9jbWFwX2NsYXNzZXMgPQotICB7Ci0gICAgJnQxX2NtYXBfc3RhbmRhcmRfY2xhc3NfcmVjLAotICAgICZ0MV9jbWFwX2V4cGVydF9jbGFzc19yZWMsCi0gICAgJnQxX2NtYXBfY3VzdG9tX2NsYXNzX3JlYywKLSAgICAmdDFfY21hcF91bmljb2RlX2NsYXNzX3JlYwotICB9OwotCi0KLSAgc3RhdGljCi0gIGNvbnN0IFBTQXV4X0ludGVyZmFjZSAgcHNhdXhfaW50ZXJmYWNlID0KLSAgewotICAgICZwc190YWJsZV9mdW5jcywKLSAgICAmcHNfcGFyc2VyX2Z1bmNzLAotICAgICZ0MV9idWlsZGVyX2Z1bmNzLAotICAgICZ0MV9kZWNvZGVyX2Z1bmNzLAotICAgIHQxX2RlY3J5cHQsCi0KLSAgICAoY29uc3QgVDFfQ01hcF9DbGFzc2VzUmVjKikgJnQxX2NtYXBfY2xhc3NlcywKLQotI2lmbmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX0FGTQotICAgICZhZm1fcGFyc2VyX2Z1bmNzLAotI2Vsc2UKLSAgICAwLAotI2VuZGlmCi0gIH07Ci0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYKLSAgY29uc3QgRlRfTW9kdWxlX0NsYXNzICBwc2F1eF9tb2R1bGVfY2xhc3MgPQotICB7Ci0gICAgMCwKLSAgICBzaXplb2YgKCBGVF9Nb2R1bGVSZWMgKSwKLSAgICAicHNhdXgiLAotICAgIDB4MjAwMDBMLAotICAgIDB4MjAwMDBMLAotCi0gICAgJnBzYXV4X2ludGVyZmFjZSwgIC8qIG1vZHVsZS1zcGVjaWZpYyBpbnRlcmZhY2UgKi8KLQotICAgIChGVF9Nb2R1bGVfQ29uc3RydWN0b3IpMCwKLSAgICAoRlRfTW9kdWxlX0Rlc3RydWN0b3IpIDAsCi0gICAgKEZUX01vZHVsZV9SZXF1ZXN0ZXIpICAwCi0gIH07Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNhdXhtb2QuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC9wc2F1eG1vZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTZhOGY5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC9wc2F1eG1vZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNhdXhtb2QuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIGF1eGlsaWFyeSBQb3N0U2NyaXB0IG1vZHVsZSBpbXBsZW1lbnRhdGlvbiAoc3BlY2lmaWNhdGlvbikuICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAwLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fUFNBVVhNT0RfSF9fCi0jZGVmaW5lIF9fUFNBVVhNT0RfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9NT0RVTEVfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSNlcnJvciAidGhpcyBtb2R1bGUgZG9lcyBub3Qgc3VwcG9ydCBQSUMgeWV0IgotI2VuZGlmCi0KLQotICBGVF9FWFBPUlRfVkFSKCBjb25zdCBGVF9Nb2R1bGVfQ2xhc3MgKSAgcHNhdXhfZHJpdmVyX2NsYXNzOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fUFNBVVhNT0RfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNjb252LmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNjb252LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYTc0MTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3BzY29udi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzY29udi5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBTb21lIGNvbnZlbmllbmNlIGNvbnZlcnNpb25zIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0KLSNpbmNsdWRlICJwc2NvbnYuaCIKLSNpbmNsdWRlICJwc2F1eGVyci5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfcHNjb252Ci0KLQotICAvKiBUaGUgZm9sbG93aW5nIGFycmF5IGlzIHVzZWQgYnkgdmFyaW91cyBmdW5jdGlvbnMgdG8gcXVpY2tseSBjb252ZXJ0ICovCi0gIC8qIGRpZ2l0cyAoYm90aCBkZWNpbWFsIGFuZCBub24tZGVjaW1hbCkgaW50byBudW1iZXJzLiAgICAgICAgICAgICAgICAgKi8KLQotI2lmICdBJyA9PSA2NQotICAvKiBBU0NJSSAqLwotCi0gIHN0YXRpYyBjb25zdCBGVF9DaGFyICBmdF9jaGFyX3RhYmxlWzEyOF0gPQotICB7Ci0gICAgLyogMHgwMCAqLwotICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgIC0xLCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LAotICAgIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgIC0xLCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LAotICAgIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICB9OwotCi0gIC8qIG5vIGNoYXJhY3RlciA+PSAweDgwIGNhbiByZXByZXNlbnQgYSB2YWxpZCBudW1iZXIgKi8KLSNkZWZpbmUgT1AgID49Ci0KLSNlbmRpZiAvKiAnQScgPT0gNjUgKi8KLQotI2lmICdBJyA9PSAxOTMKLSAgLyogRUJDRElDICovCi0KLSAgc3RhdGljIGNvbnN0IEZUX0NoYXIgIGZ0X2NoYXJfdGFibGVbMTI4XSA9Ci0gIHsKLSAgICAvKiAweDgwICovCi0gICAgLTEsIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgLTEsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgLTEsIC0xLCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgLTEsIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgLTEsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgLTEsIC0xLCAyOCwgMjksIDMwLCAzMSwgMzIsIDMzLCAzNCwgMzUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCi0gIH07Ci0KLSAgLyogbm8gY2hhcmFjdGVyIDwgMHg4MCBjYW4gcmVwcmVzZW50IGEgdmFsaWQgbnVtYmVyICovCi0jZGVmaW5lIE9QICA8Ci0KLSNlbmRpZiAvKiAnQScgPT0gMTkzICovCi0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0xvbmcgKQotICBQU19Db252X1N0cnRvbCggRlRfQnl0ZSoqICBjdXJzb3IsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBiYXNlICkKLSAgewotICAgIEZUX0J5dGUqICBwID0gKmN1cnNvcjsKLQotICAgIEZUX0xvbmcgICBudW0gICAgICAgICAgID0gMDsKLSAgICBGVF9Cb29sICAgc2lnbiAgICAgICAgICA9IDA7Ci0gICAgRlRfQm9vbCAgIGhhdmVfb3ZlcmZsb3cgPSAwOwotCi0gICAgRlRfTG9uZyAgIG51bV9saW1pdDsKLSAgICBGVF9DaGFyICAgY19saW1pdDsKLQotCi0gICAgaWYgKCBwID49IGxpbWl0ICkKLSAgICAgIGdvdG8gQmFkOwotCi0gICAgaWYgKCBiYXNlIDwgMiB8fCBiYXNlID4gMzYgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFNCgoICIhISFJTlZBTElEIEJBU0U6ISEhIiApKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlmICggKnAgPT0gJy0nIHx8ICpwID09ICcrJyApCi0gICAgewotICAgICAgc2lnbiA9IEZUX0JPT0woICpwID09ICctJyApOwotCi0gICAgICBwKys7Ci0gICAgICBpZiAoIHAgPT0gbGltaXQgKQotICAgICAgICBnb3RvIEJhZDsKLSAgICB9Ci0KLSAgICBudW1fbGltaXQgPSAweDdGRkZGRkZGTCAvIGJhc2U7Ci0gICAgY19saW1pdCAgID0gKEZUX0NoYXIpKCAweDdGRkZGRkZGTCAlIGJhc2UgKTsKLQotICAgIGZvciAoIDsgcCA8IGxpbWl0OyBwKysgKQotICAgIHsKLSAgICAgIEZUX0NoYXIgIGM7Ci0KLQotICAgICAgaWYgKCBJU19QU19TUEFDRSggKnAgKSB8fCAqcCBPUCAweDgwICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGMgPSBmdF9jaGFyX3RhYmxlWypwICYgMHg3Rl07Ci0KLSAgICAgIGlmICggYyA8IDAgfHwgYyA+PSBiYXNlICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmICggbnVtID4gbnVtX2xpbWl0IHx8ICggbnVtID09IG51bV9saW1pdCAmJiBjID4gY19saW1pdCApICkKLSAgICAgICAgaGF2ZV9vdmVyZmxvdyA9IDE7Ci0gICAgICBlbHNlCi0gICAgICAgIG51bSA9IG51bSAqIGJhc2UgKyBjOwotICAgIH0KLQotICAgICpjdXJzb3IgPSBwOwotCi0gICAgaWYgKCBoYXZlX292ZXJmbG93ICkKLSAgICB7Ci0gICAgICBudW0gPSAweDdGRkZGRkZGTDsKLSAgICAgIEZUX1RSQUNFNCgoICIhISFPVkVSRkxPVzohISEiICkpOwotICAgIH0KLQotICAgIGlmICggc2lnbiApCi0gICAgICBudW0gPSAtbnVtOwotCi0gICAgcmV0dXJuIG51bTsKLQotICBCYWQ6Ci0gICAgRlRfVFJBQ0U0KCggIiEhIUVORCBPRiBEQVRBOiEhISIgKSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfTG9uZyApCi0gIFBTX0NvbnZfVG9JbnQoIEZUX0J5dGUqKiAgY3Vyc29yLAotICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0ICkKLQotICB7Ci0gICAgRlRfQnl0ZSogIHAgPSAqY3Vyc29yOwotICAgIEZUX0J5dGUqICBjdXJwOwotCi0gICAgRlRfTG9uZyAgIG51bTsKLQotCi0gICAgY3VycCA9IHA7Ci0gICAgbnVtICA9IFBTX0NvbnZfU3RydG9sKCAmcCwgbGltaXQsIDEwICk7Ci0KLSAgICBpZiAoIHAgPT0gY3VycCApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGlmICggcCA8IGxpbWl0ICYmICpwID09ICcjJyApCi0gICAgewotICAgICAgcCsrOwotCi0gICAgICBjdXJwID0gcDsKLSAgICAgIG51bSAgPSBQU19Db252X1N0cnRvbCggJnAsIGxpbWl0LCBudW0gKTsKLQotICAgICAgaWYgKCBwID09IGN1cnAgKQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAqY3Vyc29yID0gcDsKLQotICAgIHJldHVybiBudW07Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRml4ZWQgKQotICBQU19Db252X1RvRml4ZWQoIEZUX0J5dGUqKiAgY3Vyc29yLAotICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBwb3dlcl90ZW4gKQotICB7Ci0gICAgRlRfQnl0ZSogIHAgPSAqY3Vyc29yOwotICAgIEZUX0J5dGUqICBjdXJwOwotCi0gICAgRlRfRml4ZWQgIGludGVncmFsID0gMDsKLSAgICBGVF9Mb25nICAgZGVjaW1hbCAgPSAwOwotICAgIEZUX0xvbmcgICBkaXZpZGVyICA9IDE7Ci0KLSAgICBGVF9Cb29sICAgc2lnbiAgICAgICAgICAgPSAwOwotICAgIEZUX0Jvb2wgICBoYXZlX292ZXJmbG93ICA9IDA7Ci0gICAgRlRfQm9vbCAgIGhhdmVfdW5kZXJmbG93ID0gMDsKLQotCi0gICAgaWYgKCBwID49IGxpbWl0ICkKLSAgICAgIGdvdG8gQmFkOwotCi0gICAgaWYgKCAqcCA9PSAnLScgfHwgKnAgPT0gJysnICkKLSAgICB7Ci0gICAgICBzaWduID0gRlRfQk9PTCggKnAgPT0gJy0nICk7Ci0KLSAgICAgIHArKzsKLSAgICAgIGlmICggcCA9PSBsaW1pdCApCi0gICAgICAgIGdvdG8gQmFkOwotICAgIH0KLQotICAgIC8qIHJlYWQgdGhlIGludGVnZXIgcGFydCAqLwotICAgIGlmICggKnAgIT0gJy4nICkKLSAgICB7Ci0gICAgICBjdXJwICAgICA9IHA7Ci0gICAgICBpbnRlZ3JhbCA9IFBTX0NvbnZfVG9JbnQoICZwLCBsaW1pdCApOwotCi0gICAgICBpZiAoIHAgPT0gY3VycCApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgICBpZiAoIGludGVncmFsID4gMHg3RkZGICkKLSAgICAgICAgaGF2ZV9vdmVyZmxvdyA9IDE7Ci0gICAgICBlbHNlCi0gICAgICAgIGludGVncmFsID0gKEZUX0ZpeGVkKSggKEZUX1VJbnQzMilpbnRlZ3JhbCA8PCAxNiApOwotICAgIH0KLQotICAgIC8qIHJlYWQgdGhlIGRlY2ltYWwgcGFydCAqLwotICAgIGlmICggcCA8IGxpbWl0ICYmICpwID09ICcuJyApCi0gICAgewotICAgICAgcCsrOwotCi0gICAgICBmb3IgKCA7IHAgPCBsaW1pdDsgcCsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfQ2hhciAgYzsKLQotCi0gICAgICAgIGlmICggSVNfUFNfU1BBQ0UoICpwICkgfHwgKnAgT1AgMHg4MCApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgYyA9IGZ0X2NoYXJfdGFibGVbKnAgJiAweDdGXTsKLQotICAgICAgICBpZiAoIGMgPCAwIHx8IGMgPj0gMTAgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIG9ubHkgYWRkIGRpZ2l0IGlmIHdlIGRvbid0IG92ZXJmbG93ICovCi0gICAgICAgIGlmICggZGl2aWRlciA8IDB4Q0NDQ0NDQ0wgJiYgZGVjaW1hbCA8IDB4Q0NDQ0NDQ0wgKQotICAgICAgICB7Ci0gICAgICAgICAgZGVjaW1hbCA9IGRlY2ltYWwgKiAxMCArIGM7Ci0KLSAgICAgICAgICBpZiAoICFpbnRlZ3JhbCAmJiBwb3dlcl90ZW4gPiAwICkKLSAgICAgICAgICAgIHBvd2VyX3Rlbi0tOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGRpdmlkZXIgKj0gMTA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiByZWFkIGV4cG9uZW50LCBpZiBhbnkgKi8KLSAgICBpZiAoIHAgKyAxIDwgbGltaXQgJiYgKCAqcCA9PSAnZScgfHwgKnAgPT0gJ0UnICkgKQotICAgIHsKLSAgICAgIEZUX0xvbmcgIGV4cG9uZW50OwotCi0KLSAgICAgIHArKzsKLQotICAgICAgY3VycCAgICAgPSBwOwotICAgICAgZXhwb25lbnQgPSBQU19Db252X1RvSW50KCAmcCwgbGltaXQgKTsKLQotICAgICAgaWYgKCBjdXJwID09IHAgKQotICAgICAgICByZXR1cm4gMDsKLQotICAgICAgLyogYXJiaXRyYXJpbHkgbGltaXQgZXhwb25lbnQgKi8KLSAgICAgIGlmICggZXhwb25lbnQgPiAxMDAwICkKLSAgICAgICAgaGF2ZV9vdmVyZmxvdyA9IDE7Ci0gICAgICBlbHNlIGlmICggZXhwb25lbnQgPCAtMTAwMCApCi0gICAgICAgIGhhdmVfdW5kZXJmbG93ID0gMTsKLSAgICAgIGVsc2UKLSAgICAgICAgcG93ZXJfdGVuICs9IGV4cG9uZW50OwotICAgIH0KLQotICAgICpjdXJzb3IgPSBwOwotCi0gICAgaWYgKCAhaW50ZWdyYWwgJiYgIWRlY2ltYWwgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoIGhhdmVfb3ZlcmZsb3cgKQotICAgICAgZ290byBPdmVyZmxvdzsKLSAgICBpZiAoIGhhdmVfdW5kZXJmbG93ICkKLSAgICAgIGdvdG8gVW5kZXJmbG93OwotCi0gICAgd2hpbGUgKCBwb3dlcl90ZW4gPiAwICkKLSAgICB7Ci0gICAgICBpZiAoIGludGVncmFsID49IDB4Q0NDQ0NDQ0wgKQotICAgICAgICBnb3RvIE92ZXJmbG93OwotICAgICAgaW50ZWdyYWwgKj0gMTA7Ci0KLSAgICAgIGlmICggZGVjaW1hbCA+PSAweENDQ0NDQ0NMICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBkaXZpZGVyID09IDEgKQotICAgICAgICAgIGdvdG8gT3ZlcmZsb3c7Ci0gICAgICAgIGRpdmlkZXIgLz0gMTA7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGRlY2ltYWwgKj0gMTA7Ci0KLSAgICAgIHBvd2VyX3Rlbi0tOwotICAgIH0KLQotICAgIHdoaWxlICggcG93ZXJfdGVuIDwgMCApCi0gICAgewotICAgICAgaW50ZWdyYWwgLz0gMTA7Ci0gICAgICBpZiAoIGRpdmlkZXIgPCAweENDQ0NDQ0NMICkKLSAgICAgICAgZGl2aWRlciAqPSAxMDsKLSAgICAgIGVsc2UKLSAgICAgICAgZGVjaW1hbCAvPSAxMDsKLQotICAgICAgaWYgKCAhaW50ZWdyYWwgJiYgIWRlY2ltYWwgKQotICAgICAgICBnb3RvIFVuZGVyZmxvdzsKLQotICAgICAgcG93ZXJfdGVuKys7Ci0gICAgfQotCi0gICAgaWYgKCBkZWNpbWFsICkKLSAgICB7Ci0gICAgICBkZWNpbWFsID0gRlRfRGl2Rml4KCBkZWNpbWFsLCBkaXZpZGVyICk7Ci0gICAgICAvKiBpdCdzIG5vdCBuZWNlc3NhcnkgdG8gY2hlY2sgdGhpcyBhZGRpdGlvbiBmb3Igb3ZlcmZsb3cgKi8KLSAgICAgIC8qIGR1ZSB0byB0aGUgc3RydWN0dXJlIG9mIHRoZSByZWFsIG51bWJlciByZXByZXNlbnRhdGlvbiAqLwotICAgICAgaW50ZWdyYWwgKz0gZGVjaW1hbDsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICBpZiAoIHNpZ24gKQotICAgICAgaW50ZWdyYWwgPSAtaW50ZWdyYWw7Ci0KLSAgICByZXR1cm4gaW50ZWdyYWw7Ci0KLSAgQmFkOgotICAgIEZUX1RSQUNFNCgoICIhISFFTkQgT0YgREFUQTohISEiICkpOwotICAgIHJldHVybiAwOwotCi0gIE92ZXJmbG93OgotICAgIGludGVncmFsID0gMHg3RkZGRkZGRkw7Ci0gICAgRlRfVFJBQ0U0KCggIiEhIU9WRVJGTE9XOiEhISIgKSk7Ci0gICAgZ290byBFeGl0OwotCi0gIFVuZGVyZmxvdzoKLSAgICBGVF9UUkFDRTQoKCAiISEhVU5ERVJGTE9XOiEhISIgKSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0jaWYgMAotICBGVF9MT0NBTF9ERUYoIEZUX1VJbnQgKQotICBQU19Db252X1N0cmluZ0RlY29kZSggRlRfQnl0ZSoqICBjdXJzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9PZmZzZXQgIG4gKQotICB7Ci0gICAgRlRfQnl0ZSogIHA7Ci0gICAgRlRfVUludCAgIHIgPSAwOwotCi0KLSAgICBmb3IgKCBwID0gKmN1cnNvcjsgciA8IG4gJiYgcCA8IGxpbWl0OyBwKysgKQotICAgIHsKLSAgICAgIEZUX0J5dGUgIGI7Ci0KLQotICAgICAgaWYgKCAqcCAhPSAnXFwnICkKLSAgICAgIHsKLSAgICAgICAgYnVmZmVyW3IrK10gPSAqcDsKLQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgcCsrOwotCi0gICAgICBzd2l0Y2ggKCAqcCApCi0gICAgICB7Ci0gICAgICBjYXNlICduJzoKLSAgICAgICAgYiA9ICdcbic7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAncic6Ci0gICAgICAgIGIgPSAnXHInOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ3QnOgotICAgICAgICBiID0gJ1x0JzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdiJzoKLSAgICAgICAgYiA9ICdcYic7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnZic6Ci0gICAgICAgIGIgPSAnXGYnOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgcCsrOwotICAgICAgICBpZiAoICpwICE9ICdcbicgKQotICAgICAgICB7Ci0gICAgICAgICAgYiA9ICpwOwotCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgLyogbm8gYnJlYWsgKi8KLSAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgY29udGludWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgaWYgKCBJU19QU19ESUdJVCggKnAgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBiID0gKnAgLSAnMCc7Ci0KLSAgICAgICAgICBwKys7Ci0KLSAgICAgICAgICBpZiAoIElTX1BTX0RJR0lUKCAqcCApICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBiID0gYiAqIDggKyAqcCAtICcwJzsKLQotICAgICAgICAgICAgcCsrOwotCi0gICAgICAgICAgICBpZiAoIElTX1BTX0RJR0lUKCAqcCApICkKLSAgICAgICAgICAgICAgYiA9IGIgKiA4ICsgKnAgLSAnMCc7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJ1ZmZlcltyKytdID0gYjsKLSAgICAgICAgICAgICAgYiA9ICpwOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgYnVmZmVyW3IrK10gPSBiOwotICAgICAgICAgICAgYiA9ICpwOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgYiA9ICpwOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgYnVmZmVyW3IrK10gPSBiOwotICAgIH0KLQotICAgICpjdXJzb3IgPSBwOwotCi0gICAgcmV0dXJuIHI7Ci0gIH0KLSNlbmRpZiAvKiAwICovCi0KLQotICBGVF9MT0NBTF9ERUYoIEZUX1VJbnQgKQotICBQU19Db252X0FTQ0lJSGV4RGVjb2RlKCBGVF9CeXRlKiogIGN1cnNvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX09mZnNldCAgbiApCi0gIHsKLSAgICBGVF9CeXRlKiAgcDsKLSAgICBGVF9VSW50ICAgciAgID0gMDsKLSAgICBGVF9VSW50ICAgdyAgID0gMDsKLSAgICBGVF9VSW50ICAgcGFkID0gMHgwMTsKLQotCi0gICAgbiAqPSAyOwotCi0jaWYgMQotCi0gICAgcCA9ICpjdXJzb3I7Ci0KLSAgICBpZiAoIHAgPj0gbGltaXQgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoIG4gPiAoRlRfVUludCkoIGxpbWl0IC0gcCApICkKLSAgICAgIG4gPSAoRlRfVUludCkoIGxpbWl0IC0gcCApOwotCi0gICAgLyogd2UgdHJ5IHRvIHByb2Nlc3MgdHdvIG5pYmJsZXMgYXQgYSB0aW1lIHRvIGJlIGFzIGZhc3QgYXMgcG9zc2libGUgKi8KLSAgICBmb3IgKCA7IHIgPCBuOyByKysgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIGMgPSBwW3JdOwotCi0KLSAgICAgIGlmICggSVNfUFNfU1BBQ0UoIGMgKSApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBpZiAoIGMgT1AgMHg4MCApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBjID0gKEZUX1VJbnQpZnRfY2hhcl90YWJsZVtjICYgMHg3Rl07Ci0gICAgICBpZiAoIGMgPj0gMTYgKQotICAgICAgICBicmVhazsKLQotICAgICAgcGFkID0gKCBwYWQgPDwgNCApIHwgYzsKLSAgICAgIGlmICggcGFkICYgMHgxMDAgKQotICAgICAgewotICAgICAgICBidWZmZXJbdysrXSA9IChGVF9CeXRlKXBhZDsKLSAgICAgICAgcGFkICAgICAgICAgPSAweDAxOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggcGFkICE9IDB4MDEgKQotICAgICAgYnVmZmVyW3crK10gPSAoRlRfQnl0ZSkoIHBhZCA8PCA0ICk7Ci0KLSAgICAqY3Vyc29yID0gcCArIHI7Ci0KLSAgICByZXR1cm4gdzsKLQotI2Vsc2UgLyogMCAqLwotCi0gICAgZm9yICggciA9IDA7IHIgPCBuOyByKysgKQotICAgIHsKLSAgICAgIEZUX0NoYXIgIGM7Ci0KLQotICAgICAgaWYgKCBJU19QU19TUEFDRSggKnAgKSApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBpZiAoICpwIE9QIDB4ODAgKQotICAgICAgICBicmVhazsKLQotICAgICAgYyA9IGZ0X2NoYXJfdGFibGVbKnAgJiAweDdGXTsKLQotICAgICAgaWYgKCAodW5zaWduZWQpYyA+PSAxNiApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBpZiAoIHIgJiAxICkKLSAgICAgIHsKLSAgICAgICAgKmJ1ZmZlciA9IChGVF9CeXRlKSgqYnVmZmVyICsgYyk7Ci0gICAgICAgIGJ1ZmZlcisrOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICAqYnVmZmVyID0gKEZUX0J5dGUpKGMgPDwgNCk7Ci0KLSAgICAgIHIrKzsKLSAgICB9Ci0KLSAgICAqY3Vyc29yID0gcDsKLQotICAgIHJldHVybiAoIHIgKyAxICkgLyAyOwotCi0jZW5kaWYgLyogMCAqLwotCi0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfVUludCApCi0gIFBTX0NvbnZfRWV4ZWNEZWNvZGUoIEZUX0J5dGUqKiAgIGN1cnNvciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICAgbiwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgc2VlZCApCi0gIHsKLSAgICBGVF9CeXRlKiAgcDsKLSAgICBGVF9VSW50ICAgcjsKLSAgICBGVF9VSW50ICAgcyA9ICpzZWVkOwotCi0KLSNpZiAxCi0KLSAgICBwID0gKmN1cnNvcjsKLQotICAgIGlmICggcCA+PSBsaW1pdCApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGlmICggbiA+IChGVF9VSW50KShsaW1pdCAtIHApICkKLSAgICAgIG4gPSAoRlRfVUludCkobGltaXQgLSBwKTsKLQotICAgIGZvciAoIHIgPSAwOyByIDwgbjsgcisrICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICB2YWwgPSBwW3JdOwotICAgICAgRlRfVUludCAgYiAgID0gKCB2YWwgXiAoIHMgPj4gOCApICk7Ci0KLQotICAgICAgcyAgICAgICAgID0gKCAodmFsICsgcykqNTI4NDVVICsgMjI3MTkgKSAmIDB4RkZGRlU7Ci0gICAgICBidWZmZXJbcl0gPSAoRlRfQnl0ZSkgYjsKLSAgICB9Ci0KLSAgICAqY3Vyc29yID0gcCArIG47Ci0gICAgKnNlZWQgICA9IChGVF9VU2hvcnQpczsKLQotI2Vsc2UgLyogMCAqLwotCi0gICAgZm9yICggciA9IDAsIHAgPSAqY3Vyc29yOyByIDwgbiAmJiBwIDwgbGltaXQ7IHIrKywgcCsrICkKLSAgICB7Ci0gICAgICBGVF9CeXRlICBiID0gKEZUX0J5dGUpKCAqcCBeICggcyA+PiA4ICkgKTsKLQotCi0gICAgICBzID0gKEZUX1VTaG9ydCkoICggKnAgKyBzICkgKiA1Mjg0NVUgKyAyMjcxOSApOwotICAgICAgKmJ1ZmZlcisrID0gYjsKLSAgICB9Ci0gICAgKmN1cnNvciA9IHA7Ci0gICAgKnNlZWQgICA9IHM7Ci0KLSNlbmRpZiAvKiAwICovCi0KLSAgICByZXR1cm4gcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3BzY29udi5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3BzY29udi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGYxZmY3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC9wc2NvbnYuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzY29udi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBTb21lIGNvbnZlbmllbmNlIGNvbnZlcnNpb25zIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1BTQ09OVl9IX18KLSNkZWZpbmUgX19QU0NPTlZfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfTE9DQUwoIEZUX0xvbmcgKQotICBQU19Db252X1N0cnRvbCggRlRfQnl0ZSoqICBjdXJzb3IsCi0gICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBiYXNlICk7Ci0KLQotICBGVF9MT0NBTCggRlRfTG9uZyApCi0gIFBTX0NvbnZfVG9JbnQoIEZUX0J5dGUqKiAgY3Vyc29yLAotICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0ICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0ZpeGVkICkKLSAgUFNfQ29udl9Ub0ZpeGVkKCBGVF9CeXRlKiogIGN1cnNvciwKLSAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgcG93ZXJfdGVuICk7Ci0KLSNpZiAwCi0gIEZUX0xPQ0FMKCBGVF9VSW50ICkKLSAgUFNfQ29udl9TdHJpbmdEZWNvZGUoIEZUX0J5dGUqKiAgY3Vyc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICBuICk7Ci0jZW5kaWYKLQotICBGVF9MT0NBTCggRlRfVUludCApCi0gIFBTX0NvbnZfQVNDSUlIZXhEZWNvZGUoIEZUX0J5dGUqKiAgY3Vyc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT2Zmc2V0ICBuICk7Ci0KLSAgRlRfTE9DQUwoIEZUX1VJbnQgKQotICBQU19Db252X0VleGVjRGVjb2RlKCBGVF9CeXRlKiogICBjdXJzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX09mZnNldCAgIG4sCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCogIHNlZWQgKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1BTQ09OVl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC9wc29ianMuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC9wc29ianMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzYzdlNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNvYmpzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzb2Jqcy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXhpbGlhcnkgZnVuY3Rpb25zIGZvciBQb3N0U2NyaXB0IGZvbnRzIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLQotI2luY2x1ZGUgInBzb2Jqcy5oIgotI2luY2x1ZGUgInBzY29udi5oIgotCi0jaW5jbHVkZSAicHNhdXhlcnIuaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3Bzb2JqcwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU19UQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcHNfdGFibGVfbmV3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5pdGlhbGl6ZXMgYSBQU19UYWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFibGUgIDo6IFRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY291bnQgIDo6IFRoZSB0YWJsZSBzaXplID0gdGhlIG1heGltdW0gbnVtYmVyIG9mIGVsZW1lbnRzLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgOjogVGhlIG1lbW9yeSBvYmplY3QgdG8gdXNlIGZvciBhbGwgc3Vic2VxdWVudCAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIHJlYWxsb2NhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgcHNfdGFibGVfbmV3KCBQU19UYWJsZSAgIHRhYmxlLAotICAgICAgICAgICAgICAgIEZUX0ludCAgICAgY291bnQsCi0gICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICB0YWJsZS0+bWVtb3J5ID0gbWVtb3J5OwotICAgIGlmICggRlRfTkVXX0FSUkFZKCB0YWJsZS0+ZWxlbWVudHMsIGNvdW50ICkgfHwKLSAgICAgICAgIEZUX05FV19BUlJBWSggdGFibGUtPmxlbmd0aHMsICBjb3VudCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHRhYmxlLT5tYXhfZWxlbXMgPSBjb3VudDsKLSAgICB0YWJsZS0+aW5pdCAgICAgID0gMHhERUFEQkVFRlVMOwotICAgIHRhYmxlLT5udW1fZWxlbXMgPSAwOwotICAgIHRhYmxlLT5ibG9jayAgICAgPSBOVUxMOwotICAgIHRhYmxlLT5jYXBhY2l0eSAgPSAwOwotICAgIHRhYmxlLT5jdXJzb3IgICAgPSAwOwotCi0gICAgKihQU19UYWJsZV9GdW5jc1JlYyopJnRhYmxlLT5mdW5jcyA9IHBzX3RhYmxlX2Z1bmNzOwotCi0gIEV4aXQ6Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBGVF9GUkVFKCB0YWJsZS0+ZWxlbWVudHMgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgc2hpZnRfZWxlbWVudHMoIFBTX1RhYmxlICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICBvbGRfYmFzZSApCi0gIHsKLSAgICBGVF9QdHJEaXN0ICBkZWx0YSAgPSB0YWJsZS0+YmxvY2sgLSBvbGRfYmFzZTsKLSAgICBGVF9CeXRlKiogICBvZmZzZXQgPSB0YWJsZS0+ZWxlbWVudHM7Ci0gICAgRlRfQnl0ZSoqICAgbGltaXQgID0gb2Zmc2V0ICsgdGFibGUtPm1heF9lbGVtczsKLQotCi0gICAgZm9yICggOyBvZmZzZXQgPCBsaW1pdDsgb2Zmc2V0KysgKQotICAgIHsKLSAgICAgIGlmICggb2Zmc2V0WzBdICkKLSAgICAgICAgb2Zmc2V0WzBdICs9IGRlbHRhOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJlYWxsb2NhdGVfdDFfdGFibGUoIFBTX1RhYmxlICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX09mZnNldCAgbmV3X3NpemUgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgICA9IHRhYmxlLT5tZW1vcnk7Ci0gICAgRlRfQnl0ZSogICBvbGRfYmFzZSA9IHRhYmxlLT5ibG9jazsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotCi0KLSAgICAvKiBhbGxvY2F0ZSBuZXcgYmFzZSBibG9jayAqLwotICAgIGlmICggRlRfQUxMT0MoIHRhYmxlLT5ibG9jaywgbmV3X3NpemUgKSApCi0gICAgewotICAgICAgdGFibGUtPmJsb2NrID0gb2xkX2Jhc2U7Ci0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgLyogY29weSBlbGVtZW50cyBhbmQgc2hpZnQgb2Zmc2V0cyAqLwotICAgIGlmICggb2xkX2Jhc2UgKQotICAgIHsKLSAgICAgIEZUX01FTV9DT1BZKCB0YWJsZS0+YmxvY2ssIG9sZF9iYXNlLCB0YWJsZS0+Y2FwYWNpdHkgKTsKLSAgICAgIHNoaWZ0X2VsZW1lbnRzKCB0YWJsZSwgb2xkX2Jhc2UgKTsKLSAgICAgIEZUX0ZSRUUoIG9sZF9iYXNlICk7Ci0gICAgfQotCi0gICAgdGFibGUtPmNhcGFjaXR5ID0gbmV3X3NpemU7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwc190YWJsZV9hZGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBZGRzIGFuIG9iamVjdCB0byBhIFBTX1RhYmxlLCBwb3NzaWJseSBncm93aW5nIGl0cyBtZW1vcnkgYmxvY2suICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWJsZSAgOjogVGhlIHRhcmdldCB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpZHggICAgOjogVGhlIGluZGV4IG9mIHRoZSBvYmplY3QgaW4gdGhlIHRhYmxlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG9iamVjdCA6OiBUaGUgYWRkcmVzcyBvZiB0aGUgb2JqZWN0IHRvIGNvcHkgaW4gbWVtb3J5LiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGVuZ3RoIDo6IFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIHNvdXJjZSBvYmplY3QuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gIEFuIGVycm9yIGlzIHJldHVybmVkIGlmIGEgICovCi0gIC8qICAgIHJlYWxsb2NhdGlvbiBmYWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHBzX3RhYmxlX2FkZCggUFNfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgIEZUX0ludCAgICBpZHgsCi0gICAgICAgICAgICAgICAgdm9pZCogICAgIG9iamVjdCwKLSAgICAgICAgICAgICAgICBGVF9VSW50ICAgbGVuZ3RoICkKLSAgewotICAgIGlmICggaWR4IDwgMCB8fCBpZHggPj0gdGFibGUtPm1heF9lbGVtcyApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAicHNfdGFibGVfYWRkOiBpbnZhbGlkIGluZGV4XG4iICkpOwotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgfQotCi0gICAgLyogZ3JvdyB0aGUgYmFzZSBibG9jayBpZiBuZWVkZWQgKi8KLSAgICBpZiAoIHRhYmxlLT5jdXJzb3IgKyBsZW5ndGggPiB0YWJsZS0+Y2FwYWNpdHkgKQotICAgIHsKLSAgICAgIEZUX0Vycm9yICAgIGVycm9yOwotICAgICAgRlRfT2Zmc2V0ICAgbmV3X3NpemUgPSB0YWJsZS0+Y2FwYWNpdHk7Ci0gICAgICBGVF9QdHJEaXN0ICBpbl9vZmZzZXQ7Ci0KLQotICAgICAgaW5fb2Zmc2V0ID0gKEZUX0J5dGUqKW9iamVjdCAtIHRhYmxlLT5ibG9jazsKLSAgICAgIGlmICggaW5fb2Zmc2V0IDwgMCB8fCAoRlRfT2Zmc2V0KWluX29mZnNldCA+PSB0YWJsZS0+Y2FwYWNpdHkgKQotICAgICAgICBpbl9vZmZzZXQgPSAtMTsKLQotICAgICAgd2hpbGUgKCBuZXdfc2l6ZSA8IHRhYmxlLT5jdXJzb3IgKyBsZW5ndGggKQotICAgICAgewotICAgICAgICAvKiBpbmNyZWFzZSBzaXplIGJ5IDI1JSBhbmQgcm91bmQgdXAgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGUKLSAgICAgICAgICAgb2YgMTAyNCAqLwotICAgICAgICBuZXdfc2l6ZSArPSAoIG5ld19zaXplID4+IDIgKSArIDE7Ci0gICAgICAgIG5ld19zaXplICA9IEZUX1BBRF9DRUlMKCBuZXdfc2l6ZSwgMTAyNCApOwotICAgICAgfQotCi0gICAgICBlcnJvciA9IHJlYWxsb2NhdGVfdDFfdGFibGUoIHRhYmxlLCBuZXdfc2l6ZSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgaWYgKCBpbl9vZmZzZXQgPj0gMCApCi0gICAgICAgIG9iamVjdCA9IHRhYmxlLT5ibG9jayArIGluX29mZnNldDsKLSAgICB9Ci0KLSAgICAvKiBhZGQgdGhlIG9iamVjdCB0byB0aGUgYmFzZSBibG9jayBhbmQgYWRqdXN0IG9mZnNldCAqLwotICAgIHRhYmxlLT5lbGVtZW50c1tpZHhdID0gdGFibGUtPmJsb2NrICsgdGFibGUtPmN1cnNvcjsKLSAgICB0YWJsZS0+bGVuZ3RocyBbaWR4XSA9IGxlbmd0aDsKLSAgICBGVF9NRU1fQ09QWSggdGFibGUtPmJsb2NrICsgdGFibGUtPmN1cnNvciwgb2JqZWN0LCBsZW5ndGggKTsKLQotICAgIHRhYmxlLT5jdXJzb3IgKz0gbGVuZ3RoOwotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBzX3RhYmxlX2RvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmFsaXplcyBhIFBTX1RhYmxlUmVjIChpLmUuLCByZWFsbG9jYXRlIGl0IHRvIGl0cyBjdXJyZW50ICAgICAgICAqLwotICAvKiAgICBjdXJzb3IpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWJsZSA6OiBUaGUgdGFyZ2V0IHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgTk9UIHJlbGVhc2UgdGhlIGhlYXAncyBtZW1vcnkgYmxvY2suICBJdCBpcyB1cCAgKi8KLSAgLyogICAgdG8gdGhlIGNhbGxlciB0byBjbGVhbiBpdCwgb3IgcmVmZXJlbmNlIGl0IGluIGl0cyBvd24gc3RydWN0dXJlcy4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBwc190YWJsZV9kb25lKCBQU19UYWJsZSAgdGFibGUgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSB0YWJsZS0+bWVtb3J5OwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfQnl0ZSogICBvbGRfYmFzZSA9IHRhYmxlLT5ibG9jazsKLQotCi0gICAgLyogc2hvdWxkIG5ldmVyIGZhaWwsIGJlY2F1c2UgcmVjLmN1cnNvciA8PSByZWMuc2l6ZSAqLwotICAgIGlmICggIW9sZF9iYXNlICkKLSAgICAgIHJldHVybjsKLQotICAgIGlmICggRlRfQUxMT0MoIHRhYmxlLT5ibG9jaywgdGFibGUtPmN1cnNvciApICkKLSAgICAgIHJldHVybjsKLSAgICBGVF9NRU1fQ09QWSggdGFibGUtPmJsb2NrLCBvbGRfYmFzZSwgdGFibGUtPmN1cnNvciApOwotICAgIHNoaWZ0X2VsZW1lbnRzKCB0YWJsZSwgb2xkX2Jhc2UgKTsKLQotICAgIHRhYmxlLT5jYXBhY2l0eSA9IHRhYmxlLT5jdXJzb3I7Ci0gICAgRlRfRlJFRSggb2xkX2Jhc2UgKTsKLQotICAgIEZUX1VOVVNFRCggZXJyb3IgKTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgcHNfdGFibGVfcmVsZWFzZSggUFNfVGFibGUgIHRhYmxlICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gdGFibGUtPm1lbW9yeTsKLQotCi0gICAgaWYgKCAoRlRfVUxvbmcpdGFibGUtPmluaXQgPT0gMHhERUFEQkVFRlVMICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCB0YWJsZS0+YmxvY2sgKTsKLSAgICAgIEZUX0ZSRUUoIHRhYmxlLT5lbGVtZW50cyApOwotICAgICAgRlRfRlJFRSggdGFibGUtPmxlbmd0aHMgKTsKLSAgICAgIHRhYmxlLT5pbml0ID0gMDsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMSBQQVJTRVIgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogZmlyc3QgY2hhcmFjdGVyIG11c3QgYmUgYWxyZWFkeSBwYXJ0IG9mIHRoZSBjb21tZW50ICovCi0KLSAgc3RhdGljIHZvaWQKLSAgc2tpcF9jb21tZW50KCBGVF9CeXRlKiAgKmFjdXIsCi0gICAgICAgICAgICAgICAgRlRfQnl0ZSogICBsaW1pdCApCi0gIHsKLSAgICBGVF9CeXRlKiAgY3VyID0gKmFjdXI7Ci0KLQotICAgIHdoaWxlICggY3VyIDwgbGltaXQgKQotICAgIHsKLSAgICAgIGlmICggSVNfUFNfTkVXTElORSggKmN1ciApICkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjdXIrKzsKLSAgICB9Ci0KLSAgICAqYWN1ciA9IGN1cjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgc2tpcF9zcGFjZXMoIEZUX0J5dGUqICAqYWN1ciwKLSAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQgKQotICB7Ci0gICAgRlRfQnl0ZSogIGN1ciA9ICphY3VyOwotCi0KLSAgICB3aGlsZSAoIGN1ciA8IGxpbWl0ICkKLSAgICB7Ci0gICAgICBpZiAoICFJU19QU19TUEFDRSggKmN1ciApICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCAqY3VyID09ICclJyApCi0gICAgICAgICAgLyogQWNjb3JkaW5nIHRvIHRoZSBQTFJNLCBhIGNvbW1lbnQgaXMgZXF1YWwgdG8gYSBzcGFjZS4gKi8KLSAgICAgICAgICBza2lwX2NvbW1lbnQoICZjdXIsIGxpbWl0ICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGN1cisrOwotICAgIH0KLQotICAgICphY3VyID0gY3VyOwotICB9Ci0KLQotI2RlZmluZSBJU19PQ1RBTF9ESUdJVCggYyApICggJzAnIDw9IChjKSAmJiAoYykgPD0gJzcnICkKLQotCi0gIC8qIGZpcnN0IGNoYXJhY3RlciBtdXN0IGJlIGAoJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogKmFjdXIgaXMgcG9zaXRpb25lZCBhdCB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBjbG9zaW5nIGApJyAqLwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBza2lwX2xpdGVyYWxfc3RyaW5nKCBGVF9CeXRlKiAgKmFjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQgKQotICB7Ci0gICAgRlRfQnl0ZSogICAgICBjdXIgICA9ICphY3VyOwotICAgIEZUX0ludCAgICAgICAgZW1iZWQgPSAwOwotICAgIEZUX0Vycm9yICAgICAgZXJyb3IgPSBGVF9FUlIoIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICB1bnNpZ25lZCBpbnQgIGk7Ci0KLQotICAgIHdoaWxlICggY3VyIDwgbGltaXQgKQotICAgIHsKLSAgICAgIEZUX0J5dGUgIGMgPSAqY3VyOwotCi0KLSAgICAgICsrY3VyOwotCi0gICAgICBpZiAoIGMgPT0gJ1xcJyApCi0gICAgICB7Ci0gICAgICAgIC8qIFJlZCBCb29rIDNyZCBlZC4sIHNlY3Rpb24gYExpdGVyYWwgVGV4dCBTdHJpbmdzJywgcC4gMjk6ICAgICAqLwotICAgICAgICAvKiBBIGJhY2tzbGFzaCBjYW4gaW50cm9kdWNlIHRocmVlIGRpZmZlcmVudCB0eXBlcyAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogb2YgZXNjYXBlIHNlcXVlbmNlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgLSBhIHNwZWNpYWwgZXNjYXBlZCBjaGFyIGxpa2UgXHIsIFxuLCBldGMuICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgIC0gYSBvbmUtLCB0d28tLCBvciB0aHJlZS1kaWdpdCBvY3RhbCBudW1iZXIgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAtIG5vbmUgb2YgdGhlIGFib3ZlIGluIHdoaWNoIGNhc2UgdGhlIGJhY2tzbGFzaCBpcyBpZ25vcmVkICovCi0KLSAgICAgICAgaWYgKCBjdXIgPT0gbGltaXQgKQotICAgICAgICAgIC8qIGVycm9yIChvciB0byBiZSBpZ25vcmVkPykgKi8KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBzd2l0Y2ggKCAqY3VyICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHNraXAgYHNwZWNpYWwnIGVzY2FwZSAqLwotICAgICAgICBjYXNlICduJzoKLSAgICAgICAgY2FzZSAncic6Ci0gICAgICAgIGNhc2UgJ3QnOgotICAgICAgICBjYXNlICdiJzoKLSAgICAgICAgY2FzZSAnZic6Ci0gICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgY2FzZSAnKCc6Ci0gICAgICAgIGNhc2UgJyknOgotICAgICAgICAgICsrY3VyOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgLyogc2tpcCBvY3RhbCBlc2NhcGUgb3IgaWdub3JlIGJhY2tzbGFzaCAqLwotICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgMyAmJiBjdXIgPCBsaW1pdDsgKytpICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoICFJU19PQ1RBTF9ESUdJVCggKmN1ciApICkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICsrY3VyOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoIGMgPT0gJygnICkKLSAgICAgICAgZW1iZWQrKzsKLSAgICAgIGVsc2UgaWYgKCBjID09ICcpJyApCi0gICAgICB7Ci0gICAgICAgIGVtYmVkLS07Ci0gICAgICAgIGlmICggZW1iZWQgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgICphY3VyID0gY3VyOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBmaXJzdCBjaGFyYWN0ZXIgbXVzdCBiZSBgPCcgKi8KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgc2tpcF9zdHJpbmcoIEZUX0J5dGUqICAqYWN1ciwKLSAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQgKQotICB7Ci0gICAgRlRfQnl0ZSogIGN1ciA9ICphY3VyOwotICAgIEZUX0Vycm9yICBlcnIgPSAgRlRfRXJyX09rOwotCi0KLSAgICB3aGlsZSAoICsrY3VyIDwgbGltaXQgKQotICAgIHsKLSAgICAgIC8qIEFsbCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgYXJlIGlnbm9yZWQuICovCi0gICAgICBza2lwX3NwYWNlcyggJmN1ciwgbGltaXQgKTsKLSAgICAgIGlmICggY3VyID49IGxpbWl0ICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmICggIUlTX1BTX1hESUdJVCggKmN1ciApICkKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKCBjdXIgPCBsaW1pdCAmJiAqY3VyICE9ICc+JyApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAic2tpcF9zdHJpbmc6IG1pc3NpbmcgY2xvc2luZyBkZWxpbWl0ZXIgYD4nXG4iICkpOwotICAgICAgZXJyID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgY3VyKys7Ci0KLSAgICAqYWN1ciA9IGN1cjsKLSAgICByZXR1cm4gZXJyOwotICB9Ci0KLQotICAvKiBmaXJzdCBjaGFyYWN0ZXIgbXVzdCBiZSB0aGUgb3BlbmluZyBicmFjZSB0aGF0ICovCi0gIC8qIHN0YXJ0cyB0aGUgcHJvY2VkdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiBOQjogWyBhbmQgXSBuZWVkIG5vdCBtYXRjaDogICAgICAgICAgICAgICAgICAgICovCi0gIC8qIGAvZm9vIHtbfSBkZWYnIGlzIGEgdmFsaWQgUG9zdFNjcmlwdCBmcmFnbWVudCwgKi8KLSAgLyogZXZlbiB3aXRoaW4gYSBUeXBlMSBmb250ICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBza2lwX3Byb2NlZHVyZSggRlRfQnl0ZSogICphY3VyLAotICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBsaW1pdCApCi0gIHsKLSAgICBGVF9CeXRlKiAgY3VyOwotICAgIEZUX0ludCAgICBlbWJlZCA9IDA7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBGVF9BU1NFUlQoICoqYWN1ciA9PSAneycgKTsKLQotICAgIGZvciAoIGN1ciA9ICphY3VyOyBjdXIgPCBsaW1pdCAmJiBlcnJvciA9PSBGVF9FcnJfT2s7ICsrY3VyICkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCAqY3VyICkKLSAgICAgIHsKLSAgICAgIGNhc2UgJ3snOgotICAgICAgICArK2VtYmVkOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAnfSc6Ci0gICAgICAgIC0tZW1iZWQ7Ci0gICAgICAgIGlmICggZW1iZWQgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICArK2N1cjsKLSAgICAgICAgICBnb3RvIGVuZDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAnKCc6Ci0gICAgICAgIGVycm9yID0gc2tpcF9saXRlcmFsX3N0cmluZyggJmN1ciwgbGltaXQgKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgJzwnOgotICAgICAgICBlcnJvciA9IHNraXBfc3RyaW5nKCAmY3VyLCBsaW1pdCApOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAnJSc6Ci0gICAgICAgIHNraXBfY29tbWVudCggJmN1ciwgbGltaXQgKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gIGVuZDoKLSAgICBpZiAoIGVtYmVkICE9IDAgKQotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotCi0gICAgKmFjdXIgPSBjdXI7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBbGwgZXhwb3J0ZWQgcGFyc2luZyByb3V0aW5lcyBoYW5kbGUgbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCBzdG9wIGF0ICovCi0gIC8qIHRoZSBmaXJzdCBjaGFyYWN0ZXIgd2hpY2ggaXNuJ3QgcGFydCBvZiB0aGUganVzdCBoYW5kbGVkIHRva2VuLiAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBwc19wYXJzZXJfc2tpcF9QU190b2tlbiggUFNfUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgLyogTm90ZTogUG9zdFNjcmlwdCBhbGxvd3MgYW55IG5vbi1kZWxpbWl0aW5nLCBub24td2hpdGVzcGFjZSAgICAgICAgKi8KLSAgICAvKiAgICAgICBjaGFyYWN0ZXIgaW4gYSBuYW1lIChQUyBSZWYgTWFudWFsLCAzcmQgZWQsIHAzMSkuICAgICAgICAgICAqLwotICAgIC8qICAgICAgIFBvc3RTY3JpcHQgZGVsaW1pdGVycyBhcmUgKCwgKSwgPCwgPiwgWywgXSwgeywgfSwgLywgYW5kICUuICovCi0KLSAgICBGVF9CeXRlKiAgY3VyICAgPSBwYXJzZXItPmN1cnNvcjsKLSAgICBGVF9CeXRlKiAgbGltaXQgPSBwYXJzZXItPmxpbWl0OwotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0gICAgc2tpcF9zcGFjZXMoICZjdXIsIGxpbWl0ICk7ICAgICAgICAgICAgIC8qIHRoaXMgYWxzbyBza2lwcyBjb21tZW50cyAqLwotICAgIGlmICggY3VyID49IGxpbWl0ICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIHNlbGYtZGVsaW1pdGluZywgc2luZ2xlLWNoYXJhY3RlciB0b2tlbnMgKi8KLSAgICBpZiAoICpjdXIgPT0gJ1snIHx8ICpjdXIgPT0gJ10nICkKLSAgICB7Ci0gICAgICBjdXIrKzsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBza2lwIGJhbGFuY2VkIGV4cHJlc3Npb25zIChwcm9jZWR1cmVzIGFuZCBzdHJpbmdzKSAqLwotCi0gICAgaWYgKCAqY3VyID09ICd7JyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogey4uLn0gKi8KLSAgICB7Ci0gICAgICBlcnJvciA9IHNraXBfcHJvY2VkdXJlKCAmY3VyLCBsaW1pdCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggKmN1ciA9PSAnKCcgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICguLi4pICovCi0gICAgewotICAgICAgZXJyb3IgPSBza2lwX2xpdGVyYWxfc3RyaW5nKCAmY3VyLCBsaW1pdCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggKmN1ciA9PSAnPCcgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDwuLi4+ICovCi0gICAgewotICAgICAgaWYgKCBjdXIgKyAxIDwgbGltaXQgJiYgKihjdXIgKyAxKSA9PSAnPCcgKSAgIC8qIDw8ICovCi0gICAgICB7Ci0gICAgICAgIGN1cisrOwotICAgICAgICBjdXIrKzsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgZXJyb3IgPSBza2lwX3N0cmluZyggJmN1ciwgbGltaXQgKTsKLQotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggKmN1ciA9PSAnPicgKQotICAgIHsKLSAgICAgIGN1cisrOwotICAgICAgaWYgKCBjdXIgPj0gbGltaXQgfHwgKmN1ciAhPSAnPicgKSAgICAgICAgICAgICAvKiA+PiAqLwotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJwc19wYXJzZXJfc2tpcF9QU190b2tlbjoiCi0gICAgICAgICAgICAgICAgICAgIiB1bmV4cGVjdGVkIGNsb3NpbmcgZGVsaW1pdGVyIGA+J1xuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgICBjdXIrKzsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoICpjdXIgPT0gJy8nICkKLSAgICAgIGN1cisrOwotCi0gICAgLyogYW55dGhpbmcgZWxzZSAqLwotICAgIHdoaWxlICggY3VyIDwgbGltaXQgKQotICAgIHsKLSAgICAgIC8qICpjdXIgbWlnaHQgYmUgaW52YWxpZCAoZS5nLiwgJyknIG9yICd9JyksIGJ1dCB0aGlzICAgKi8KLSAgICAgIC8qIGlzIGhhbmRsZWQgYnkgdGhlIHRlc3QgYGN1ciA9PSBwYXJzZXItPmN1cnNvcicgYmVsb3cgKi8KLSAgICAgIGlmICggSVNfUFNfREVMSU0oICpjdXIgKSApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBjdXIrKzsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGN1ciA8IGxpbWl0ICYmIGN1ciA9PSBwYXJzZXItPmN1cnNvciApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAicHNfcGFyc2VyX3NraXBfUFNfdG9rZW46IgotICAgICAgICAgICAgICAgICAiIGN1cnJlbnQgdG9rZW4gaXMgYCVjJyB3aGljaCBpcyBzZWxmLWRlbGltaXRpbmdcbiIKLSAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICIKLSAgICAgICAgICAgICAgICAgIiBidXQgaW52YWxpZCBhdCB0aGlzIHBvaW50XG4iLAotICAgICAgICAgICAgICAgICAqY3VyICkpOwotCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgfQotCi0gICAgaWYgKCBjdXIgPiBsaW1pdCApCi0gICAgICBjdXIgPSBsaW1pdDsKLQotICAgIHBhcnNlci0+ZXJyb3IgID0gZXJyb3I7Ci0gICAgcGFyc2VyLT5jdXJzb3IgPSBjdXI7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHBzX3BhcnNlcl9za2lwX3NwYWNlcyggUFNfUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgc2tpcF9zcGFjZXMoICZwYXJzZXItPmN1cnNvciwgcGFyc2VyLT5saW1pdCApOwotICB9Ci0KLQotICAvKiBgdG9rZW4nIGhlcmUgbWVhbnMgZWl0aGVyIHNvbWV0aGluZyBiZXR3ZWVuIGJhbGFuY2VkIGRlbGltaXRlcnMgKi8KLSAgLyogb3IgdGhlIG5leHQgdG9rZW47IHRoZSBkZWxpbWl0ZXJzIGFyZSBub3QgcmVtb3ZlZC4gICAgICAgICAgICAgICovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgcHNfcGFyc2VyX3RvX3Rva2VuKCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICBUMV9Ub2tlbiAgIHRva2VuICkKLSAgewotICAgIEZUX0J5dGUqICBjdXI7Ci0gICAgRlRfQnl0ZSogIGxpbWl0OwotICAgIEZUX0ludCAgICBlbWJlZDsKLQotCi0gICAgdG9rZW4tPnR5cGUgID0gVDFfVE9LRU5fVFlQRV9OT05FOwotICAgIHRva2VuLT5zdGFydCA9IE5VTEw7Ci0gICAgdG9rZW4tPmxpbWl0ID0gTlVMTDsKLQotICAgIC8qIGZpcnN0IG9mIGFsbCwgc2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KLSAgICBwc19wYXJzZXJfc2tpcF9zcGFjZXMoIHBhcnNlciApOwotCi0gICAgY3VyICAgPSBwYXJzZXItPmN1cnNvcjsKLSAgICBsaW1pdCA9IHBhcnNlci0+bGltaXQ7Ci0KLSAgICBpZiAoIGN1ciA+PSBsaW1pdCApCi0gICAgICByZXR1cm47Ci0KLSAgICBzd2l0Y2ggKCAqY3VyICkKLSAgICB7Ci0gICAgICAvKioqKioqKioqKioqKiBjaGVjayBmb3IgbGl0ZXJhbCBzdHJpbmcgKioqKioqKioqKioqKioqKiovCi0gICAgY2FzZSAnKCc6Ci0gICAgICB0b2tlbi0+dHlwZSAgPSBUMV9UT0tFTl9UWVBFX1NUUklORzsKLSAgICAgIHRva2VuLT5zdGFydCA9IGN1cjsKLQotICAgICAgaWYgKCBza2lwX2xpdGVyYWxfc3RyaW5nKCAmY3VyLCBsaW1pdCApID09IEZUX0Vycl9PayApCi0gICAgICAgIHRva2VuLT5saW1pdCA9IGN1cjsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKioqKioqKioqKioqKiBjaGVjayBmb3IgcHJvZ3JhbXMvYXJyYXkgKioqKioqKioqKioqKioqKiovCi0gICAgY2FzZSAneyc6Ci0gICAgICB0b2tlbi0+dHlwZSAgPSBUMV9UT0tFTl9UWVBFX0FSUkFZOwotICAgICAgdG9rZW4tPnN0YXJ0ID0gY3VyOwotCi0gICAgICBpZiAoIHNraXBfcHJvY2VkdXJlKCAmY3VyLCBsaW1pdCApID09IEZUX0Vycl9PayApCi0gICAgICAgIHRva2VuLT5saW1pdCA9IGN1cjsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKioqKioqKioqKioqKiBjaGVjayBmb3IgdGFibGUvYXJyYXkgKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAvKiBYWFg6IGluIHRoZW9yeSB3ZSBzaG91bGQgYWxzbyBsb29rIGZvciAiPDwiICAgICAgICAgICovCi0gICAgICAvKiAgICAgIHNpbmNlIHRoaXMgaXMgc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQgdG8gIlsiOyAgICovCi0gICAgICAvKiAgICAgIGluIHByYWN0aWNlIGl0IGRvZXNuJ3QgbWF0dGVyICg/KSAgICAgICAgICAgICAgICovCi0gICAgY2FzZSAnWyc6Ci0gICAgICB0b2tlbi0+dHlwZSAgPSBUMV9UT0tFTl9UWVBFX0FSUkFZOwotICAgICAgZW1iZWQgICAgICAgID0gMTsKLSAgICAgIHRva2VuLT5zdGFydCA9IGN1cisrOwotCi0gICAgICAvKiB3ZSBuZWVkIHRoaXMgdG8gY2F0Y2ggYFsgXScgKi8KLSAgICAgIHBhcnNlci0+Y3Vyc29yID0gY3VyOwotICAgICAgcHNfcGFyc2VyX3NraXBfc3BhY2VzKCBwYXJzZXIgKTsKLSAgICAgIGN1ciA9IHBhcnNlci0+Y3Vyc29yOwotCi0gICAgICB3aGlsZSAoIGN1ciA8IGxpbWl0ICYmICFwYXJzZXItPmVycm9yICkKLSAgICAgIHsKLSAgICAgICAgLyogWFhYOiB0aGlzIGlzIHdyb25nIGJlY2F1c2UgaXQgZG9lcyBub3QgICAgICAqLwotICAgICAgICAvKiAgICAgIHNraXAgY29tbWVudHMsIHByb2NlZHVyZXMsIGFuZCBzdHJpbmdzICovCi0gICAgICAgIGlmICggKmN1ciA9PSAnWycgKQotICAgICAgICAgIGVtYmVkKys7Ci0gICAgICAgIGVsc2UgaWYgKCAqY3VyID09ICddJyApCi0gICAgICAgIHsKLSAgICAgICAgICBlbWJlZC0tOwotICAgICAgICAgIGlmICggZW1iZWQgPD0gMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgdG9rZW4tPmxpbWl0ID0gKytjdXI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwYXJzZXItPmN1cnNvciA9IGN1cjsKLSAgICAgICAgcHNfcGFyc2VyX3NraXBfUFNfdG9rZW4oIHBhcnNlciApOwotICAgICAgICAvKiB3ZSBuZWVkIHRoaXMgdG8gY2F0Y2ggYFtYWFggXScgKi8KLSAgICAgICAgcHNfcGFyc2VyX3NraXBfc3BhY2VzICAoIHBhcnNlciApOwotICAgICAgICBjdXIgPSBwYXJzZXItPmN1cnNvcjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiAqKioqKioqKioqKiogb3RoZXJ3aXNlLCBpdCBpcyBhbnkgdG9rZW4gKioqKioqKioqKioqKiovCi0gICAgZGVmYXVsdDoKLSAgICAgIHRva2VuLT5zdGFydCA9IGN1cjsKLSAgICAgIHRva2VuLT50eXBlICA9ICggKmN1ciA9PSAnLycgPyBUMV9UT0tFTl9UWVBFX0tFWSA6IFQxX1RPS0VOX1RZUEVfQU5ZICk7Ci0gICAgICBwc19wYXJzZXJfc2tpcF9QU190b2tlbiggcGFyc2VyICk7Ci0gICAgICBjdXIgPSBwYXJzZXItPmN1cnNvcjsKLSAgICAgIGlmICggIXBhcnNlci0+ZXJyb3IgKQotICAgICAgICB0b2tlbi0+bGltaXQgPSBjdXI7Ci0gICAgfQotCi0gICAgaWYgKCAhdG9rZW4tPmxpbWl0ICkKLSAgICB7Ci0gICAgICB0b2tlbi0+c3RhcnQgPSBOVUxMOwotICAgICAgdG9rZW4tPnR5cGUgID0gVDFfVE9LRU5fVFlQRV9OT05FOwotICAgIH0KLQotICAgIHBhcnNlci0+Y3Vyc29yID0gY3VyOwotICB9Ci0KLQotICAvKiBOQjogYHRva2VucycgY2FuIGJlIE5VTEwgaWYgd2Ugb25seSB3YW50IHRvIGNvdW50ICovCi0gIC8qIHRoZSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBwc19wYXJzZXJfdG9fdG9rZW5fYXJyYXkoIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1Rva2VuICAgdG9rZW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbWF4X3Rva2VucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQqICAgIHBudW1fdG9rZW5zICkKLSAgewotICAgIFQxX1Rva2VuUmVjICBtYXN0ZXI7Ci0KLQotICAgICpwbnVtX3Rva2VucyA9IC0xOwotCi0gICAgLyogdGhpcyBhbHNvIGhhbmRsZXMgbGVhZGluZyB3aGl0ZXNwYWNlICovCi0gICAgcHNfcGFyc2VyX3RvX3Rva2VuKCBwYXJzZXIsICZtYXN0ZXIgKTsKLQotICAgIGlmICggbWFzdGVyLnR5cGUgPT0gVDFfVE9LRU5fVFlQRV9BUlJBWSApCi0gICAgewotICAgICAgRlRfQnl0ZSogIG9sZF9jdXJzb3IgPSBwYXJzZXItPmN1cnNvcjsKLSAgICAgIEZUX0J5dGUqICBvbGRfbGltaXQgID0gcGFyc2VyLT5saW1pdDsKLSAgICAgIFQxX1Rva2VuICBjdXIgICAgICAgID0gdG9rZW5zOwotICAgICAgVDFfVG9rZW4gIGxpbWl0ICAgICAgPSBjdXIgKyBtYXhfdG9rZW5zOwotCi0KLSAgICAgIC8qIGRvbid0IGluY2x1ZGUgb3V0ZXJtb3N0IGRlbGltaXRlcnMgKi8KLSAgICAgIHBhcnNlci0+Y3Vyc29yID0gbWFzdGVyLnN0YXJ0ICsgMTsKLSAgICAgIHBhcnNlci0+bGltaXQgID0gbWFzdGVyLmxpbWl0IC0gMTsKLQotICAgICAgd2hpbGUgKCBwYXJzZXItPmN1cnNvciA8IHBhcnNlci0+bGltaXQgKQotICAgICAgewotICAgICAgICBUMV9Ub2tlblJlYyAgdG9rZW47Ci0KLQotICAgICAgICBwc19wYXJzZXJfdG9fdG9rZW4oIHBhcnNlciwgJnRva2VuICk7Ci0gICAgICAgIGlmICggIXRva2VuLnR5cGUgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmICggdG9rZW5zICE9IE5VTEwgJiYgY3VyIDwgbGltaXQgKQotICAgICAgICAgICpjdXIgPSB0b2tlbjsKLQotICAgICAgICBjdXIrKzsKLSAgICAgIH0KLQotICAgICAgKnBudW1fdG9rZW5zID0gKEZUX0ludCkoIGN1ciAtIHRva2VucyApOwotCi0gICAgICBwYXJzZXItPmN1cnNvciA9IG9sZF9jdXJzb3I7Ci0gICAgICBwYXJzZXItPmxpbWl0ICA9IG9sZF9saW1pdDsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIGZpcnN0IGNoYXJhY3RlciBtdXN0IGJlIGEgZGVsaW1pdGVyIG9yIGEgcGFydCBvZiBhIG51bWJlciAqLwotICAvKiBOQjogYGNvb3JkcycgY2FuIGJlIE5VTEwgaWYgd2UganVzdCB3YW50IHRvIHNraXAgdGhlICAgICAgKi8KLSAgLyogICAgIGFycmF5OyBpbiB0aGlzIGNhc2Ugd2UgaWdub3JlIGBtYXhfY29vcmRzJyAgICAgICAgICAgICovCi0KLSAgc3RhdGljIEZUX0ludAotICBwc190b2Nvb3JkYXJyYXkoIEZUX0J5dGUqICAqYWN1ciwKLSAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgbWF4X2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCogIGNvb3JkcyApCi0gIHsKLSAgICBGVF9CeXRlKiAgY3VyICAgPSAqYWN1cjsKLSAgICBGVF9JbnQgICAgY291bnQgPSAwOwotICAgIEZUX0J5dGUgICBjLCBlbmRlcjsKLQotCi0gICAgaWYgKCBjdXIgPj0gbGltaXQgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogY2hlY2sgZm9yIHRoZSBiZWdpbm5pbmcgb2YgYW4gYXJyYXk7IG90aGVyd2lzZSwgb25seSBvbmUgbnVtYmVyICovCi0gICAgLyogd2lsbCBiZSByZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgYyAgICAgPSAqY3VyOwotICAgIGVuZGVyID0gMDsKLQotICAgIGlmICggYyA9PSAnWycgKQotICAgICAgZW5kZXIgPSAnXSc7Ci0gICAgZWxzZSBpZiAoIGMgPT0gJ3snICkKLSAgICAgIGVuZGVyID0gJ30nOwotCi0gICAgaWYgKCBlbmRlciApCi0gICAgICBjdXIrKzsKLQotICAgIC8qIG5vdywgcmVhZCB0aGUgY29vcmRpbmF0ZXMgKi8KLSAgICB3aGlsZSAoIGN1ciA8IGxpbWl0ICkKLSAgICB7Ci0gICAgICBGVF9TaG9ydCAgZHVtbXk7Ci0gICAgICBGVF9CeXRlKiAgb2xkX2N1cjsKLQotCi0gICAgICAvKiBza2lwIHdoaXRlc3BhY2UgaW4gZnJvbnQgb2YgZGF0YSAqLwotICAgICAgc2tpcF9zcGFjZXMoICZjdXIsIGxpbWl0ICk7Ci0gICAgICBpZiAoIGN1ciA+PSBsaW1pdCApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgaWYgKCAqY3VyID09IGVuZGVyICkKLSAgICAgIHsKLSAgICAgICAgY3VyKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBvbGRfY3VyID0gY3VyOwotCi0gICAgICBpZiAoIGNvb3JkcyAhPSBOVUxMICYmIGNvdW50ID49IG1heF9jb29yZHMgKQotICAgICAgICBicmVhazsKLQotICAgICAgLyogY2FsbCBQU19Db252X1RvRml4ZWQoKSBldmVuIGlmIGNvb3JkcyA9PSBOVUxMICovCi0gICAgICAvKiB0byBwcm9wZXJseSBwYXJzZSBudW1iZXIgYXQgYGN1cicgICAgICAgICAgICAgKi8KLSAgICAgICooIGNvb3JkcyAhPSBOVUxMID8gJmNvb3Jkc1tjb3VudF0gOiAmZHVtbXkgKSA9Ci0gICAgICAgIChGVF9TaG9ydCkoIFBTX0NvbnZfVG9GaXhlZCggJmN1ciwgbGltaXQsIDAgKSA+PiAxNiApOwotCi0gICAgICBpZiAoIG9sZF9jdXIgPT0gY3VyICkKLSAgICAgIHsKLSAgICAgICAgY291bnQgPSAtMTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBjb3VudCsrOwotCi0gICAgICBpZiAoICFlbmRlciApCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICBFeGl0OgotICAgICphY3VyID0gY3VyOwotICAgIHJldHVybiBjb3VudDsKLSAgfQotCi0KLSAgLyogZmlyc3QgY2hhcmFjdGVyIG11c3QgYmUgYSBkZWxpbWl0ZXIgb3IgYSBwYXJ0IG9mIGEgbnVtYmVyICovCi0gIC8qIE5COiBgdmFsdWVzJyBjYW4gYmUgTlVMTCBpZiB3ZSBqdXN0IHdhbnQgdG8gc2tpcCB0aGUgICAgICAqLwotICAvKiAgICAgYXJyYXk7IGluIHRoaXMgY2FzZSB3ZSBpZ25vcmUgYG1heF92YWx1ZXMnICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIHJldHVybiBudW1iZXIgb2Ygc3VjY2Vzc2Z1bGx5IHBhcnNlZCB2YWx1ZXMgICAgICAgICAgICAgICAqLwotCi0gIHN0YXRpYyBGVF9JbnQKLSAgcHNfdG9maXhlZGFycmF5KCBGVF9CeXRlKiAgKmFjdXIsCi0gICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIG1heF92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBwb3dlcl90ZW4gKQotICB7Ci0gICAgRlRfQnl0ZSogIGN1ciAgID0gKmFjdXI7Ci0gICAgRlRfSW50ICAgIGNvdW50ID0gMDsKLSAgICBGVF9CeXRlICAgYywgZW5kZXI7Ci0KLQotICAgIGlmICggY3VyID49IGxpbWl0ICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIENoZWNrIGZvciB0aGUgYmVnaW5uaW5nIG9mIGFuIGFycmF5LiAgT3RoZXJ3aXNlLCBvbmx5IG9uZSBudW1iZXIgKi8KLSAgICAvKiB3aWxsIGJlIHJlYWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgYyAgICAgPSAqY3VyOwotICAgIGVuZGVyID0gMDsKLQotICAgIGlmICggYyA9PSAnWycgKQotICAgICAgZW5kZXIgPSAnXSc7Ci0gICAgZWxzZSBpZiAoIGMgPT0gJ3snICkKLSAgICAgIGVuZGVyID0gJ30nOwotCi0gICAgaWYgKCBlbmRlciApCi0gICAgICBjdXIrKzsKLQotICAgIC8qIG5vdywgcmVhZCB0aGUgdmFsdWVzICovCi0gICAgd2hpbGUgKCBjdXIgPCBsaW1pdCApCi0gICAgewotICAgICAgRlRfRml4ZWQgIGR1bW15OwotICAgICAgRlRfQnl0ZSogIG9sZF9jdXI7Ci0KLQotICAgICAgLyogc2tpcCB3aGl0ZXNwYWNlIGluIGZyb250IG9mIGRhdGEgKi8KLSAgICAgIHNraXBfc3BhY2VzKCAmY3VyLCBsaW1pdCApOwotICAgICAgaWYgKCBjdXIgPj0gbGltaXQgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGlmICggKmN1ciA9PSBlbmRlciApCi0gICAgICB7Ci0gICAgICAgIGN1cisrOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgb2xkX2N1ciA9IGN1cjsKLQotICAgICAgaWYgKCB2YWx1ZXMgIT0gTlVMTCAmJiBjb3VudCA+PSBtYXhfdmFsdWVzICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGNhbGwgUFNfQ29udl9Ub0ZpeGVkKCkgZXZlbiBpZiBjb29yZHMgPT0gTlVMTCAqLwotICAgICAgLyogdG8gcHJvcGVybHkgcGFyc2UgbnVtYmVyIGF0IGBjdXInICAgICAgICAgICAgICovCi0gICAgICAqKCB2YWx1ZXMgIT0gTlVMTCA/ICZ2YWx1ZXNbY291bnRdIDogJmR1bW15ICkgPQotICAgICAgICBQU19Db252X1RvRml4ZWQoICZjdXIsIGxpbWl0LCBwb3dlcl90ZW4gKTsKLQotICAgICAgaWYgKCBvbGRfY3VyID09IGN1ciApCi0gICAgICB7Ci0gICAgICAgIGNvdW50ID0gLTE7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgY291bnQrKzsKLQotICAgICAgaWYgKCAhZW5kZXIgKQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICAqYWN1ciA9IGN1cjsKLSAgICByZXR1cm4gY291bnQ7Ci0gIH0KLQotCi0jaWYgMAotCi0gIHN0YXRpYyBGVF9TdHJpbmcqCi0gIHBzX3Rvc3RyaW5nKCBGVF9CeXRlKiogIGN1cnNvciwKLSAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQsCi0gICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9CeXRlKiAgICBjdXIgPSAqY3Vyc29yOwotICAgIEZUX1VJbnQgICAgIGxlbiA9IDA7Ci0gICAgRlRfSW50ICAgICAgY291bnQ7Ci0gICAgRlRfU3RyaW5nKiAgcmVzdWx0OwotICAgIEZUX0Vycm9yICAgIGVycm9yOwotCi0KLSAgICAvKiBYWFg6IHNvbWUgc3R1cGlkIGZvbnRzIGhhdmUgYSBgTm90aWNlJyBvciBgQ29weXJpZ2h0JyBzdHJpbmcgICAgICovCi0gICAgLyogICAgICB0aGF0IHNpbXBseSBkb2Vzbid0IGJlZ2luIHdpdGggYW4gb3BlbmluZyBwYXJlbnRoZXNpcywgZXZlbiAqLwotICAgIC8qICAgICAgdGhvdWdoIHRoZXkgaGF2ZSBhIGNsb3Npbmcgb25lISAgRS5nLiAiYW11bmNpYWwucGZiIiAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICBXZSBtdXN0IGRlYWwgd2l0aCB0aGVzZSBpbGwtZmF0ZWQgY2FzZXMgdGhlcmUuICBOb3RlIHRoYXQgICAqLwotICAgIC8qICAgICAgdGhlc2UgZm9udHMgZGlkbid0IHdvcmsgd2l0aCB0aGUgb2xkIFR5cGUgMSBkcml2ZXIgYXMgdGhlICAgKi8KLSAgICAvKiAgICAgIG5vdGljZS9jb3B5cmlnaHQgd2FzIG5vdCByZWNvZ25pemVkIGFzIGEgdmFsaWQgc3RyaW5nIHRva2VuICovCi0gICAgLyogICAgICBhbmQgbWFkZSB0aGUgb2xkIHRva2VuIHBhcnNlciBjb21taXQgZXJyb3JzLiAgICAgICAgICAgICAgICAqLwotCi0gICAgd2hpbGUgKCBjdXIgPCBsaW1pdCAmJiAoICpjdXIgPT0gJyAnIHx8ICpjdXIgPT0gJ1x0JyApICkKLSAgICAgIGN1cisrOwotICAgIGlmICggY3VyICsgMSA+PSBsaW1pdCApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGlmICggKmN1ciA9PSAnKCcgKQotICAgICAgY3VyKys7ICAvKiBza2lwIHRoZSBvcGVuaW5nIHBhcmVudGhlc2lzLCBpZiB0aGVyZSBpcyBvbmUgKi8KLQotICAgICpjdXJzb3IgPSBjdXI7Ci0gICAgY291bnQgICA9IDA7Ci0KLSAgICAvKiB0aGVuLCBjb3VudCBpdHMgbGVuZ3RoICovCi0gICAgZm9yICggOyBjdXIgPCBsaW1pdDsgY3VyKysgKQotICAgIHsKLSAgICAgIGlmICggKmN1ciA9PSAnKCcgKQotICAgICAgICBjb3VudCsrOwotCi0gICAgICBlbHNlIGlmICggKmN1ciA9PSAnKScgKQotICAgICAgewotICAgICAgICBjb3VudC0tOwotICAgICAgICBpZiAoIGNvdW50IDwgMCApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgbGVuID0gKEZUX1VJbnQpKCBjdXIgLSAqY3Vyc29yICk7Ci0gICAgaWYgKCBjdXIgPj0gbGltaXQgfHwgRlRfQUxMT0MoIHJlc3VsdCwgbGVuICsgMSApICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgLyogbm93IGNvcHkgdGhlIHN0cmluZyAqLwotICAgIEZUX01FTV9DT1BZKCByZXN1bHQsICpjdXJzb3IsIGxlbiApOwotICAgIHJlc3VsdFtsZW5dID0gJ1wwJzsKLSAgICAqY3Vyc29yID0gY3VyOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotI2VuZGlmIC8qIDAgKi8KLQotCi0gIHN0YXRpYyBpbnQKLSAgcHNfdG9ib29sKCBGVF9CeXRlKiAgKmFjdXIsCi0gICAgICAgICAgICAgRlRfQnl0ZSogICBsaW1pdCApCi0gIHsKLSAgICBGVF9CeXRlKiAgY3VyICAgID0gKmFjdXI7Ci0gICAgRlRfQm9vbCAgIHJlc3VsdCA9IDA7Ci0KLQotICAgIC8qIHJldHVybiAxIGlmIHdlIGZpbmQgYHRydWUnLCAwIG90aGVyd2lzZSAqLwotICAgIGlmICggY3VyICsgMyA8IGxpbWl0ICYmCi0gICAgICAgICBjdXJbMF0gPT0gJ3QnICAgJiYKLSAgICAgICAgIGN1clsxXSA9PSAncicgICAmJgotICAgICAgICAgY3VyWzJdID09ICd1JyAgICYmCi0gICAgICAgICBjdXJbM10gPT0gJ2UnICAgKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICBjdXIgICArPSA1OwotICAgIH0KLSAgICBlbHNlIGlmICggY3VyICsgNCA8IGxpbWl0ICYmCi0gICAgICAgICAgICAgIGN1clswXSA9PSAnZicgICAmJgotICAgICAgICAgICAgICBjdXJbMV0gPT0gJ2EnICAgJiYKLSAgICAgICAgICAgICAgY3VyWzJdID09ICdsJyAgICYmCi0gICAgICAgICAgICAgIGN1clszXSA9PSAncycgICAmJgotICAgICAgICAgICAgICBjdXJbNF0gPT0gJ2UnICAgKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IDA7Ci0gICAgICBjdXIgICArPSA2OwotICAgIH0KLQotICAgICphY3VyID0gY3VyOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qIGxvYWQgYSBzaW1wbGUgZmllbGQgKGkuZS4gbm9uLXRhYmxlKSBpbnRvIHRoZSBjdXJyZW50IGxpc3Qgb2Ygb2JqZWN0cyAqLwotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBwc19wYXJzZXJfbG9hZF9maWVsZCggUFNfUGFyc2VyICAgICAgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxX0ZpZWxkICBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiAgICAgICAgICBvYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIG1heF9vYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgIHBmbGFncyApCi0gIHsKLSAgICBUMV9Ub2tlblJlYyAgIHRva2VuOwotICAgIEZUX0J5dGUqICAgICAgY3VyOwotICAgIEZUX0J5dGUqICAgICAgbGltaXQ7Ci0gICAgRlRfVUludCAgICAgICBjb3VudDsKLSAgICBGVF9VSW50ICAgICAgIGlkeDsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yOwotICAgIFQxX0ZpZWxkVHlwZSAgdHlwZTsKLQotCi0gICAgLyogdGhpcyBhbHNvIHNraXBzIGxlYWRpbmcgd2hpdGVzcGFjZSAqLwotICAgIHBzX3BhcnNlcl90b190b2tlbiggcGFyc2VyLCAmdG9rZW4gKTsKLSAgICBpZiAoICF0b2tlbi50eXBlICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIGNvdW50ID0gMTsKLSAgICBpZHggICA9IDA7Ci0gICAgY3VyICAgPSB0b2tlbi5zdGFydDsKLSAgICBsaW1pdCA9IHRva2VuLmxpbWl0OwotCi0gICAgdHlwZSA9IGZpZWxkLT50eXBlOwotCi0gICAgLyogd2UgbXVzdCBkZXRlY3QgYXJyYXlzIGluIC9Gb250QkJveCAqLwotICAgIGlmICggdHlwZSA9PSBUMV9GSUVMRF9UWVBFX0JCT1ggKQotICAgIHsKLSAgICAgIFQxX1Rva2VuUmVjICB0b2tlbjI7Ci0gICAgICBGVF9CeXRlKiAgICAgb2xkX2N1ciAgID0gcGFyc2VyLT5jdXJzb3I7Ci0gICAgICBGVF9CeXRlKiAgICAgb2xkX2xpbWl0ID0gcGFyc2VyLT5saW1pdDsKLQotCi0gICAgICAvKiBkb24ndCBpbmNsdWRlIGRlbGltaXRlcnMgKi8KLSAgICAgIHBhcnNlci0+Y3Vyc29yID0gdG9rZW4uc3RhcnQgKyAxOwotICAgICAgcGFyc2VyLT5saW1pdCAgPSB0b2tlbi5saW1pdCAtIDE7Ci0KLSAgICAgIHBzX3BhcnNlcl90b190b2tlbiggcGFyc2VyLCAmdG9rZW4yICk7Ci0gICAgICBwYXJzZXItPmN1cnNvciA9IG9sZF9jdXI7Ci0gICAgICBwYXJzZXItPmxpbWl0ICA9IG9sZF9saW1pdDsKLQotICAgICAgaWYgKCB0b2tlbjIudHlwZSA9PSBUMV9UT0tFTl9UWVBFX0FSUkFZICkKLSAgICAgIHsKLSAgICAgICAgdHlwZSA9IFQxX0ZJRUxEX1RZUEVfTU1fQkJPWDsKLSAgICAgICAgZ290byBGaWVsZEFycmF5OwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICggdG9rZW4udHlwZSA9PSBUMV9UT0tFTl9UWVBFX0FSUkFZICkKLSAgICB7Ci0gICAgICBjb3VudCA9IG1heF9vYmplY3RzOwotCi0gICAgRmllbGRBcnJheToKLSAgICAgIC8qIGlmIHRoaXMgaXMgYW4gYXJyYXkgYW5kIHdlIGhhdmUgbm8gYmxlbmQsIGFuIGVycm9yIG9jY3VycyAqLwotICAgICAgaWYgKCBtYXhfb2JqZWN0cyA9PSAwICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBpZHggPSAxOwotCi0gICAgICAvKiBkb24ndCBpbmNsdWRlIGRlbGltaXRlcnMgKi8KLSAgICAgIGN1cisrOwotICAgICAgbGltaXQtLTsKLSAgICB9Ci0KLSAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgaWR4KysgKQotICAgIHsKLSAgICAgIEZUX0J5dGUqICAgIHEgPSAoRlRfQnl0ZSopb2JqZWN0c1tpZHhdICsgZmllbGQtPm9mZnNldDsKLSAgICAgIEZUX0xvbmcgICAgIHZhbDsKLSAgICAgIEZUX1N0cmluZyogIHN0cmluZzsKLQotCi0gICAgICBza2lwX3NwYWNlcyggJmN1ciwgbGltaXQgKTsKLQotICAgICAgc3dpdGNoICggdHlwZSApCi0gICAgICB7Ci0gICAgICBjYXNlIFQxX0ZJRUxEX1RZUEVfQk9PTDoKLSAgICAgICAgdmFsID0gcHNfdG9ib29sKCAmY3VyLCBsaW1pdCApOwotICAgICAgICBnb3RvIFN0b3JlX0ludGVnZXI7Ci0KLSAgICAgIGNhc2UgVDFfRklFTERfVFlQRV9GSVhFRDoKLSAgICAgICAgdmFsID0gUFNfQ29udl9Ub0ZpeGVkKCAmY3VyLCBsaW1pdCwgMCApOwotICAgICAgICBnb3RvIFN0b3JlX0ludGVnZXI7Ci0KLSAgICAgIGNhc2UgVDFfRklFTERfVFlQRV9GSVhFRF8xMDAwOgotICAgICAgICB2YWwgPSBQU19Db252X1RvRml4ZWQoICZjdXIsIGxpbWl0LCAzICk7Ci0gICAgICAgIGdvdG8gU3RvcmVfSW50ZWdlcjsKLQotICAgICAgY2FzZSBUMV9GSUVMRF9UWVBFX0lOVEVHRVI6Ci0gICAgICAgIHZhbCA9IFBTX0NvbnZfVG9JbnQoICZjdXIsIGxpbWl0ICk7Ci0gICAgICAgIC8qIGZhbGwgdGhyb3VnaCAqLwotCi0gICAgICBTdG9yZV9JbnRlZ2VyOgotICAgICAgICBzd2l0Y2ggKCBmaWVsZC0+c2l6ZSApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAoOCAvIEZUX0NIQVJfQklUKToKLSAgICAgICAgICAqKEZUX0J5dGUqKXEgPSAoRlRfQnl0ZSl2YWw7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAoMTYgLyBGVF9DSEFSX0JJVCk6Ci0gICAgICAgICAgKihGVF9VU2hvcnQqKXEgPSAoRlRfVVNob3J0KXZhbDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICgzMiAvIEZUX0NIQVJfQklUKToKLSAgICAgICAgICAqKEZUX1VJbnQzMiopcSA9IChGVF9VSW50MzIpdmFsOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIC8qIGZvciA2NC1iaXQgc3lzdGVtcyAqLwotICAgICAgICAgICooRlRfTG9uZyopcSA9IHZhbDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBUMV9GSUVMRF9UWVBFX1NUUklORzoKLSAgICAgIGNhc2UgVDFfRklFTERfVFlQRV9LRVk6Ci0gICAgICAgIHsKLSAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHBhcnNlci0+bWVtb3J5OwotICAgICAgICAgIEZUX1VJbnQgICAgbGVuICAgID0gKEZUX1VJbnQpKCBsaW1pdCAtIGN1ciApOwotCi0KLSAgICAgICAgICBpZiAoIGN1ciA+PSBsaW1pdCApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIC8qIHdlIGFsbG93IGJvdGggYSBzdHJpbmcgb3IgYSBuYW1lICAgKi8KLSAgICAgICAgICAvKiBmb3IgY2FzZXMgbGlrZSAvRm9udE5hbWUgKGZvbykgZGVmICovCi0gICAgICAgICAgaWYgKCB0b2tlbi50eXBlID09IFQxX1RPS0VOX1RZUEVfS0VZICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBkb24ndCBpbmNsdWRlIGxlYWRpbmcgYC8nICovCi0gICAgICAgICAgICBsZW4tLTsKLSAgICAgICAgICAgIGN1cisrOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIGlmICggdG9rZW4udHlwZSA9PSBUMV9UT0tFTl9UWVBFX1NUUklORyApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogZG9uJ3QgaW5jbHVkZSBkZWxpbWl0aW5nIHBhcmVudGhlc2VzICAgICovCi0gICAgICAgICAgICAvKiBYWFggd2UgZG9uJ3QgaGFuZGxlIDw8Li4uPj4gaGVyZSAgICAgICAgKi8KLSAgICAgICAgICAgIC8qIFhYWCBzaG91bGQgd2UgY29udmVydCBvY3RhbCBlc2NhcGVzPyAgICAqLwotICAgICAgICAgICAgLyogICAgIGlmIHNvLCB3aGF0IGVuY29kaW5nIHNob3VsZCB3ZSB1c2U/ICovCi0gICAgICAgICAgICBjdXIrKzsKLSAgICAgICAgICAgIGxlbiAtPSAyOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRVJST1IoKCAicHNfcGFyc2VyX2xvYWRfZmllbGQ6IgotICAgICAgICAgICAgICAgICAgICAgICAiIGV4cGVjdGVkIGEgbmFtZSBvciBzdHJpbmdcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICIKLSAgICAgICAgICAgICAgICAgICAgICAgIiBidXQgZm91bmQgdG9rZW4gb2YgdHlwZSAlZCBpbnN0ZWFkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi50eXBlICkpOwotICAgICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIGZvciB0aGlzIHRvIHdvcmsgKEZUX1N0cmluZyoqKXEgbXVzdCBoYXZlIGJlZW4gKi8KLSAgICAgICAgICAvKiBpbml0aWFsaXplZCB0byBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgaWYgKCAqKEZUX1N0cmluZyoqKXEgIT0gTlVMTCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVFJBQ0UwKCggInBzX3BhcnNlcl9sb2FkX2ZpZWxkOiBvdmVyd3JpdGluZyBmaWVsZCAlc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5pZGVudCApKTsKLSAgICAgICAgICAgIEZUX0ZSRUUoICooRlRfU3RyaW5nKiopcSApOwotICAgICAgICAgICAgKihGVF9TdHJpbmcqKilxID0gTlVMTDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoIEZUX0FMTE9DKCBzdHJpbmcsIGxlbiArIDEgKSApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICBGVF9NRU1fQ09QWSggc3RyaW5nLCBjdXIsIGxlbiApOwotICAgICAgICAgIHN0cmluZ1tsZW5dID0gMDsKLQotICAgICAgICAgICooRlRfU3RyaW5nKiopcSA9IHN0cmluZzsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBUMV9GSUVMRF9UWVBFX0JCT1g6Ci0gICAgICAgIHsKLSAgICAgICAgICBGVF9GaXhlZCAgdGVtcFs0XTsKLSAgICAgICAgICBGVF9CQm94KiAgYmJveCA9IChGVF9CQm94KilxOwotICAgICAgICAgIEZUX0ludCAgICByZXN1bHQ7Ci0KLQotICAgICAgICAgIHJlc3VsdCA9IHBzX3RvZml4ZWRhcnJheSggJmN1ciwgbGltaXQsIDQsIHRlbXAsIDAgKTsKLQotICAgICAgICAgIGlmICggcmVzdWx0IDwgNCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRVJST1IoKCAicHNfcGFyc2VyX2xvYWRfZmllbGQ6IgotICAgICAgICAgICAgICAgICAgICAgICAiIGV4cGVjdGVkIGZvdXIgaW50ZWdlcnMgaW4gYm91bmRpbmcgYm94XG4iICkpOwotICAgICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgIH0KLQotICAgICAgICAgIGJib3gtPnhNaW4gPSBGVF9Sb3VuZEZpeCggdGVtcFswXSApOwotICAgICAgICAgIGJib3gtPnlNaW4gPSBGVF9Sb3VuZEZpeCggdGVtcFsxXSApOwotICAgICAgICAgIGJib3gtPnhNYXggPSBGVF9Sb3VuZEZpeCggdGVtcFsyXSApOwotICAgICAgICAgIGJib3gtPnlNYXggPSBGVF9Sb3VuZEZpeCggdGVtcFszXSApOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFQxX0ZJRUxEX1RZUEVfTU1fQkJPWDoKLSAgICAgICAgewotICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gcGFyc2VyLT5tZW1vcnk7Ci0gICAgICAgICAgRlRfRml4ZWQqICB0ZW1wOwotICAgICAgICAgIEZUX0ludCAgICAgcmVzdWx0OwotICAgICAgICAgIEZUX1VJbnQgICAgaTsKLQotCi0gICAgICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIHRlbXAsIG1heF9vYmplY3RzICogNCApICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgNDsgaSsrICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBwc190b2ZpeGVkYXJyYXkoICZjdXIsIGxpbWl0LCAoRlRfSW50KW1heF9vYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wICsgaSAqIG1heF9vYmplY3RzLCAwICk7Ci0gICAgICAgICAgICBpZiAoIHJlc3VsdCA8IDAgfHwgKEZUX1VJbnQpcmVzdWx0IDwgbWF4X29iamVjdHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9FUlJPUigoICJwc19wYXJzZXJfbG9hZF9maWVsZDoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiBleHBlY3RlZCAlZCBpbnRlZ2VyJXMgaW4gdGhlICVzIHN1YmFycmF5XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIG9mIC9Gb250QkJveCBpbiB0aGUgL0JsZW5kIGRpY3Rpb25hcnlcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4X29iamVjdHMsIG1heF9vYmplY3RzID4gMSA/ICJzIiA6ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGkgPT0gMCA/ICJmaXJzdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoIGkgPT0gMSA/ICJzZWNvbmQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoIGkgPT0gMiA/ICJ0aGlyZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogImZvdXJ0aCIgKSApICkpOwotICAgICAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICAgICAgICAgICAgRlRfRlJFRSggdGVtcCApOwotICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNraXBfc3BhY2VzKCAmY3VyLCBsaW1pdCApOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbWF4X29iamVjdHM7IGkrKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfQkJveCogIGJib3ggPSAoRlRfQkJveCopb2JqZWN0c1tpXTsKLQotCi0gICAgICAgICAgICBiYm94LT54TWluID0gRlRfUm91bmRGaXgoIHRlbXBbaSAgICAgICAgICAgICAgICAgIF0gKTsKLSAgICAgICAgICAgIGJib3gtPnlNaW4gPSBGVF9Sb3VuZEZpeCggdGVtcFtpICsgICAgIG1heF9vYmplY3RzXSApOwotICAgICAgICAgICAgYmJveC0+eE1heCA9IEZUX1JvdW5kRml4KCB0ZW1wW2kgKyAyICogbWF4X29iamVjdHNdICk7Ci0gICAgICAgICAgICBiYm94LT55TWF4ID0gRlRfUm91bmRGaXgoIHRlbXBbaSArIDMgKiBtYXhfb2JqZWN0c10gKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBGVF9GUkVFKCB0ZW1wICk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8qIGFuIGVycm9yIG9jY3VycmVkICovCi0gICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLSAgICB9Ci0KLSNpZiAwICAvKiBvYnNvbGV0ZSAtLSBrZWVwIGZvciByZWZlcmVuY2UgKi8KLSAgICBpZiAoIHBmbGFncyApCi0gICAgICAqcGZsYWdzIHw9IDFMIDw8IGZpZWxkLT5mbGFnX2JpdDsKLSNlbHNlCi0gICAgRlRfVU5VU0VEKCBwZmxhZ3MgKTsKLSNlbmRpZgotCi0gICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgRmFpbDoKLSAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgZ290byBFeGl0OwotICB9Ci0KLQotI2RlZmluZSBUMV9NQVhfVEFCTEVfRUxFTUVOVFMgIDMyCi0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgcHNfcGFyc2VyX2xvYWRfZmllbGRfdGFibGUoIFBTX1BhcnNlciAgICAgICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMV9GaWVsZCAgZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogICAgICAgICAgb2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBtYXhfb2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgICBwZmxhZ3MgKQotICB7Ci0gICAgVDFfVG9rZW5SZWMgIGVsZW1lbnRzW1QxX01BWF9UQUJMRV9FTEVNRU5UU107Ci0gICAgVDFfVG9rZW4gICAgIHRva2VuOwotICAgIEZUX0ludCAgICAgICBudW1fZWxlbWVudHM7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX0J5dGUqICAgICBvbGRfY3Vyc29yOwotICAgIEZUX0J5dGUqICAgICBvbGRfbGltaXQ7Ci0gICAgVDFfRmllbGRSZWMgIGZpZWxkcmVjID0gKihUMV9GaWVsZClmaWVsZDsKLQotCi0gICAgZmllbGRyZWMudHlwZSA9IFQxX0ZJRUxEX1RZUEVfSU5URUdFUjsKLSAgICBpZiAoIGZpZWxkLT50eXBlID09IFQxX0ZJRUxEX1RZUEVfRklYRURfQVJSQVkgfHwKLSAgICAgICAgIGZpZWxkLT50eXBlID09IFQxX0ZJRUxEX1RZUEVfQkJPWCAgICAgICAgKQotICAgICAgZmllbGRyZWMudHlwZSA9IFQxX0ZJRUxEX1RZUEVfRklYRUQ7Ci0KLSAgICBwc19wYXJzZXJfdG9fdG9rZW5fYXJyYXkoIHBhcnNlciwgZWxlbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9NQVhfVEFCTEVfRUxFTUVOVFMsICZudW1fZWxlbWVudHMgKTsKLSAgICBpZiAoIG51bV9lbGVtZW50cyA8IDAgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfRVJSKCBJZ25vcmUgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0gICAgaWYgKCAoRlRfVUludCludW1fZWxlbWVudHMgPiBmaWVsZC0+YXJyYXlfbWF4ICkKLSAgICAgIG51bV9lbGVtZW50cyA9IChGVF9JbnQpZmllbGQtPmFycmF5X21heDsKLQotICAgIG9sZF9jdXJzb3IgPSBwYXJzZXItPmN1cnNvcjsKLSAgICBvbGRfbGltaXQgID0gcGFyc2VyLT5saW1pdDsKLQotICAgIC8qIHdlIHN0b3JlIHRoZSBlbGVtZW50cyBjb3VudCBpZiBuZWNlc3Nhcnk7ICAgICAgICAgICAqLwotICAgIC8qIHdlIGZ1cnRoZXIgYXNzdW1lIHRoYXQgYGNvdW50X29mZnNldCcgY2FuJ3QgYmUgemVybyAqLwotICAgIGlmICggZmllbGQtPnR5cGUgIT0gVDFfRklFTERfVFlQRV9CQk9YICYmIGZpZWxkLT5jb3VudF9vZmZzZXQgIT0gMCApCi0gICAgICAqKEZUX0J5dGUqKSggKEZUX0J5dGUqKW9iamVjdHNbMF0gKyBmaWVsZC0+Y291bnRfb2Zmc2V0ICkgPQotICAgICAgICAoRlRfQnl0ZSludW1fZWxlbWVudHM7Ci0KLSAgICAvKiB3ZSBub3cgbG9hZCBlYWNoIGVsZW1lbnQsIGFkanVzdGluZyB0aGUgZmllbGQub2Zmc2V0IG9uIGVhY2ggb25lICovCi0gICAgdG9rZW4gPSBlbGVtZW50czsKLSAgICBmb3IgKCA7IG51bV9lbGVtZW50cyA+IDA7IG51bV9lbGVtZW50cy0tLCB0b2tlbisrICkKLSAgICB7Ci0gICAgICBwYXJzZXItPmN1cnNvciA9IHRva2VuLT5zdGFydDsKLSAgICAgIHBhcnNlci0+bGltaXQgID0gdG9rZW4tPmxpbWl0OwotCi0gICAgICBlcnJvciA9IHBzX3BhcnNlcl9sb2FkX2ZpZWxkKCBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmllbGRyZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X29iamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGZpZWxkcmVjLm9mZnNldCArPSBmaWVsZHJlYy5zaXplOwotICAgIH0KLQotI2lmIDAgIC8qIG9ic29sZXRlIC0tIGtlZXAgZm9yIHJlZmVyZW5jZSAqLwotICAgIGlmICggcGZsYWdzICkKLSAgICAgICpwZmxhZ3MgfD0gMUwgPDwgZmllbGQtPmZsYWdfYml0OwotI2Vsc2UKLSAgICBGVF9VTlVTRUQoIHBmbGFncyApOwotI2VuZGlmCi0KLSAgICBwYXJzZXItPmN1cnNvciA9IG9sZF9jdXJzb3I7Ci0gICAgcGFyc2VyLT5saW1pdCAgPSBvbGRfbGltaXQ7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfTG9uZyApCi0gIHBzX3BhcnNlcl90b19pbnQoIFBTX1BhcnNlciAgcGFyc2VyICkKLSAgewotICAgIHBzX3BhcnNlcl9za2lwX3NwYWNlcyggcGFyc2VyICk7Ci0gICAgcmV0dXJuIFBTX0NvbnZfVG9JbnQoICZwYXJzZXItPmN1cnNvciwgcGFyc2VyLT5saW1pdCApOwotICB9Ci0KLQotICAvKiBmaXJzdCBjaGFyYWN0ZXIgbXVzdCBiZSBgPCcgaWYgYGRlbGltaXRlcnMnIGlzIG5vbi16ZXJvICovCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHBzX3BhcnNlcl90b19ieXRlcyggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9PZmZzZXQgIG1heF9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIHBudW1fYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICBkZWxpbWl0ZXJzICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9CeXRlKiAgY3VyOwotCi0KLSAgICBwc19wYXJzZXJfc2tpcF9zcGFjZXMoIHBhcnNlciApOwotICAgIGN1ciA9IHBhcnNlci0+Y3Vyc29yOwotCi0gICAgaWYgKCBjdXIgPj0gcGFyc2VyLT5saW1pdCApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIGRlbGltaXRlcnMgKQotICAgIHsKLSAgICAgIGlmICggKmN1ciAhPSAnPCcgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJwc19wYXJzZXJfdG9fYnl0ZXM6IE1pc3Npbmcgc3RhcnRpbmcgZGVsaW1pdGVyIGA8J1xuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIGN1cisrOwotICAgIH0KLQotICAgICpwbnVtX2J5dGVzID0gUFNfQ29udl9BU0NJSUhleERlY29kZSggJmN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+bGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9ieXRlcyApOwotCi0gICAgaWYgKCBkZWxpbWl0ZXJzICkKLSAgICB7Ci0gICAgICBpZiAoIGN1ciA8IHBhcnNlci0+bGltaXQgJiYgKmN1ciAhPSAnPicgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJwc19wYXJzZXJfdG9fYnl0ZXM6IE1pc3NpbmcgY2xvc2luZyBkZWxpbWl0ZXIgYD4nXG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgY3VyKys7Ci0gICAgfQotCi0gICAgcGFyc2VyLT5jdXJzb3IgPSBjdXI7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRml4ZWQgKQotICBwc19wYXJzZXJfdG9fZml4ZWQoIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgcG93ZXJfdGVuICkKLSAgewotICAgIHBzX3BhcnNlcl9za2lwX3NwYWNlcyggcGFyc2VyICk7Ci0gICAgcmV0dXJuIFBTX0NvbnZfVG9GaXhlZCggJnBhcnNlci0+Y3Vyc29yLCBwYXJzZXItPmxpbWl0LCBwb3dlcl90ZW4gKTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9JbnQgKQotICBwc19wYXJzZXJfdG9fY29vcmRfYXJyYXkoIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgbWF4X2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCogIGNvb3JkcyApCi0gIHsKLSAgICBwc19wYXJzZXJfc2tpcF9zcGFjZXMoIHBhcnNlciApOwotICAgIHJldHVybiBwc190b2Nvb3JkYXJyYXkoICZwYXJzZXItPmN1cnNvciwgcGFyc2VyLT5saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfY29vcmRzLCBjb29yZHMgKTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9JbnQgKQotICBwc19wYXJzZXJfdG9fZml4ZWRfYXJyYXkoIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgbWF4X3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIHZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIHBvd2VyX3RlbiApCi0gIHsKLSAgICBwc19wYXJzZXJfc2tpcF9zcGFjZXMoIHBhcnNlciApOwotICAgIHJldHVybiBwc190b2ZpeGVkYXJyYXkoICZwYXJzZXItPmN1cnNvciwgcGFyc2VyLT5saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdmFsdWVzLCB2YWx1ZXMsIHBvd2VyX3RlbiApOwotICB9Ci0KLQotI2lmIDAKLQotICBGVF9MT0NBTF9ERUYoIEZUX1N0cmluZyogKQotICBUMV9Ub1N0cmluZyggUFNfUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgcmV0dXJuIHBzX3Rvc3RyaW5nKCAmcGFyc2VyLT5jdXJzb3IsIHBhcnNlci0+bGltaXQsIHBhcnNlci0+bWVtb3J5ICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfQm9vbCApCi0gIFQxX1RvQm9vbCggUFNfUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgcmV0dXJuIHBzX3RvYm9vbCggJnBhcnNlci0+Y3Vyc29yLCBwYXJzZXItPmxpbWl0ICk7Ci0gIH0KLQotI2VuZGlmIC8qIDAgKi8KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHBzX3BhcnNlcl9pbml0KCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYmFzZSwKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgbGltaXQsCi0gICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApCi0gIHsKLSAgICBwYXJzZXItPmVycm9yICA9IEZUX0Vycl9PazsKLSAgICBwYXJzZXItPmJhc2UgICA9IGJhc2U7Ci0gICAgcGFyc2VyLT5saW1pdCAgPSBsaW1pdDsKLSAgICBwYXJzZXItPmN1cnNvciA9IGJhc2U7Ci0gICAgcGFyc2VyLT5tZW1vcnkgPSBtZW1vcnk7Ci0gICAgcGFyc2VyLT5mdW5jcyAgPSBwc19wYXJzZXJfZnVuY3M7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHBzX3BhcnNlcl9kb25lKCBQU19QYXJzZXIgIHBhcnNlciApCi0gIHsKLSAgICBGVF9VTlVTRUQoIHBhcnNlciApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgVDEgQlVJTERFUiAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0MV9idWlsZGVyX2luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbml0aWFsaXplcyBhIGdpdmVuIGdseXBoIGJ1aWxkZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBidWlsZGVyIDo6IEEgcG9pbnRlciB0byB0aGUgZ2x5cGggYnVpbGRlciB0byBpbml0aWFsaXplLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgIDo6IFRoZSBjdXJyZW50IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgICAgOjogVGhlIGN1cnJlbnQgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZ2x5cGggICA6OiBUaGUgY3VycmVudCBnbHlwaCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBoaW50aW5nIDo6IFdoZXRoZXIgaGludGluZyBzaG91bGQgYmUgYXBwbGllZC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHQxX2J1aWxkZXJfaW5pdCggVDFfQnVpbGRlciAgICBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICBGVF9TaXplICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgIGhpbnRpbmcgKQotICB7Ci0gICAgYnVpbGRlci0+cGFyc2Vfc3RhdGUgPSBUMV9QYXJzZV9TdGFydDsKLSAgICBidWlsZGVyLT5sb2FkX3BvaW50cyA9IDE7Ci0KLSAgICBidWlsZGVyLT5mYWNlICAgPSBmYWNlOwotICAgIGJ1aWxkZXItPmdseXBoICA9IGdseXBoOwotICAgIGJ1aWxkZXItPm1lbW9yeSA9IGZhY2UtPm1lbW9yeTsKLQotICAgIGlmICggZ2x5cGggKQotICAgIHsKLSAgICAgIEZUX0dseXBoTG9hZGVyICBsb2FkZXIgPSBnbHlwaC0+aW50ZXJuYWwtPmxvYWRlcjsKLQotCi0gICAgICBidWlsZGVyLT5sb2FkZXIgID0gbG9hZGVyOwotICAgICAgYnVpbGRlci0+YmFzZSAgICA9ICZsb2FkZXItPmJhc2Uub3V0bGluZTsKLSAgICAgIGJ1aWxkZXItPmN1cnJlbnQgPSAmbG9hZGVyLT5jdXJyZW50Lm91dGxpbmU7Ci0gICAgICBGVF9HbHlwaExvYWRlcl9SZXdpbmQoIGxvYWRlciApOwotCi0gICAgICBidWlsZGVyLT5oaW50c19nbG9iYWxzID0gc2l6ZS0+aW50ZXJuYWw7Ci0gICAgICBidWlsZGVyLT5oaW50c19mdW5jcyAgID0gTlVMTDsKLQotICAgICAgaWYgKCBoaW50aW5nICkKLSAgICAgICAgYnVpbGRlci0+aGludHNfZnVuY3MgPSBnbHlwaC0+aW50ZXJuYWwtPmdseXBoX2hpbnRzOwotICAgIH0KLQotICAgIGJ1aWxkZXItPnBvc194ID0gMDsKLSAgICBidWlsZGVyLT5wb3NfeSA9IDA7Ci0KLSAgICBidWlsZGVyLT5sZWZ0X2JlYXJpbmcueCA9IDA7Ci0gICAgYnVpbGRlci0+bGVmdF9iZWFyaW5nLnkgPSAwOwotICAgIGJ1aWxkZXItPmFkdmFuY2UueCAgICAgID0gMDsKLSAgICBidWlsZGVyLT5hZHZhbmNlLnkgICAgICA9IDA7Ci0KLSAgICBidWlsZGVyLT5mdW5jcyA9IHQxX2J1aWxkZXJfZnVuY3M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHQxX2J1aWxkZXJfZG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmFsaXplcyBhIGdpdmVuIGdseXBoIGJ1aWxkZXIuICBJdHMgY29udGVudHMgY2FuIHN0aWxsIGJlIHVzZWQgICAqLwotICAvKiAgICBhZnRlciB0aGUgY2FsbCwgYnV0IHRoZSBmdW5jdGlvbiBzYXZlcyBpbXBvcnRhbnQgaW5mb3JtYXRpb24gICAgICAgKi8KLSAgLyogICAgd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIGdseXBoIHNsb3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnVpbGRlciA6OiBBIHBvaW50ZXIgdG8gdGhlIGdseXBoIGJ1aWxkZXIgdG8gZmluYWxpemUuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICB0MV9idWlsZGVyX2RvbmUoIFQxX0J1aWxkZXIgIGJ1aWxkZXIgKQotICB7Ci0gICAgRlRfR2x5cGhTbG90ICBnbHlwaCA9IGJ1aWxkZXItPmdseXBoOwotCi0KLSAgICBpZiAoIGdseXBoICkKLSAgICAgIGdseXBoLT5vdXRsaW5lID0gKmJ1aWxkZXItPmJhc2U7Ci0gIH0KLQotCi0gIC8qIGNoZWNrIHRoYXQgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGZvciBgY291bnQnIG1vcmUgcG9pbnRzICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0MV9idWlsZGVyX2NoZWNrX3BvaW50cyggVDFfQnVpbGRlciAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIGNvdW50ICkKLSAgewotICAgIHJldHVybiBGVF9HTFlQSExPQURFUl9DSEVDS19QT0lOVFMoIGJ1aWxkZXItPmxvYWRlciwgY291bnQsIDAgKTsKLSAgfQotCi0KLSAgLyogYWRkIGEgbmV3IHBvaW50LCBkbyBub3QgY2hlY2sgc3BhY2UgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdDFfYnVpbGRlcl9hZGRfcG9pbnQoIFQxX0J1aWxkZXIgIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUgICAgIGZsYWcgKQotICB7Ci0gICAgRlRfT3V0bGluZSogIG91dGxpbmUgPSBidWlsZGVyLT5jdXJyZW50OwotCi0KLSAgICBpZiAoIGJ1aWxkZXItPmxvYWRfcG9pbnRzICkKLSAgICB7Ci0gICAgICBGVF9WZWN0b3IqICBwb2ludCAgID0gb3V0bGluZS0+cG9pbnRzICsgb3V0bGluZS0+bl9wb2ludHM7Ci0gICAgICBGVF9CeXRlKiAgICBjb250cm9sID0gKEZUX0J5dGUqKW91dGxpbmUtPnRhZ3MgKyBvdXRsaW5lLT5uX3BvaW50czsKLQotCi0gICAgICBwb2ludC0+eCA9IEZJWEVEX1RPX0lOVCggeCApOwotICAgICAgcG9pbnQtPnkgPSBGSVhFRF9UT19JTlQoIHkgKTsKLSAgICAgICpjb250cm9sID0gKEZUX0J5dGUpKCBmbGFnID8gRlRfQ1VSVkVfVEFHX09OIDogRlRfQ1VSVkVfVEFHX0NVQklDICk7Ci0gICAgfQotICAgIG91dGxpbmUtPm5fcG9pbnRzKys7Ci0gIH0KLQotCi0gIC8qIGNoZWNrIHNwYWNlIGZvciBhIG5ldyBvbi1jdXJ2ZSBwb2ludCwgdGhlbiBhZGQgaXQgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHQxX2J1aWxkZXJfYWRkX3BvaW50MSggVDFfQnVpbGRlciAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIHkgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBlcnJvciA9IHQxX2J1aWxkZXJfY2hlY2tfcG9pbnRzKCBidWlsZGVyLCAxICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgdDFfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDEgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogY2hlY2sgc3BhY2UgZm9yIGEgbmV3IGNvbnRvdXIsIHRoZW4gYWRkIGl0ICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0MV9idWlsZGVyX2FkZF9jb250b3VyKCBUMV9CdWlsZGVyICBidWlsZGVyICkKLSAgewotICAgIEZUX091dGxpbmUqICBvdXRsaW5lID0gYnVpbGRlci0+Y3VycmVudDsKLSAgICBGVF9FcnJvciAgICAgZXJyb3I7Ci0KLQotICAgIC8qIHRoaXMgbWlnaHQgaGFwcGVuIGluIGludmFsaWQgZm9udHMgKi8KLSAgICBpZiAoICFvdXRsaW5lICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJ0MV9idWlsZGVyX2FkZF9jb250b3VyOiBubyBvdXRsaW5lIHRvIGFkZCBwb2ludHMgdG9cbiIgKSk7Ci0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICB9Ci0KLSAgICBpZiAoICFidWlsZGVyLT5sb2FkX3BvaW50cyApCi0gICAgewotICAgICAgb3V0bGluZS0+bl9jb250b3VycysrOwotICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgICB9Ci0KLSAgICBlcnJvciA9IEZUX0dMWVBITE9BREVSX0NIRUNLX1BPSU5UUyggYnVpbGRlci0+bG9hZGVyLCAwLCAxICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGlmICggb3V0bGluZS0+bl9jb250b3VycyA+IDAgKQotICAgICAgICBvdXRsaW5lLT5jb250b3Vyc1tvdXRsaW5lLT5uX2NvbnRvdXJzIC0gMV0gPQotICAgICAgICAgIChzaG9ydCkoIG91dGxpbmUtPm5fcG9pbnRzIC0gMSApOwotCi0gICAgICBvdXRsaW5lLT5uX2NvbnRvdXJzKys7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBpZiBhIHBhdGggd2FzIGJlZ3VuLCBhZGQgaXRzIGZpcnN0IG9uLWN1cnZlIHBvaW50ICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0MV9idWlsZGVyX3N0YXJ0X3BvaW50KCBUMV9CdWlsZGVyICBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB5ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0VSUiggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotCi0KLSAgICAvKiB0ZXN0IHdoZXRoZXIgd2UgYXJlIGJ1aWxkaW5nIGEgbmV3IGNvbnRvdXIgKi8KLQotICAgIGlmICggYnVpbGRlci0+cGFyc2Vfc3RhdGUgPT0gVDFfUGFyc2VfSGF2ZV9QYXRoICkKLSAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBidWlsZGVyLT5wYXJzZV9zdGF0ZSA9IFQxX1BhcnNlX0hhdmVfUGF0aDsKLSAgICAgIGVycm9yID0gdDFfYnVpbGRlcl9hZGRfY29udG91ciggYnVpbGRlciApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICBlcnJvciA9IHQxX2J1aWxkZXJfYWRkX3BvaW50MSggYnVpbGRlciwgeCwgeSApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogY2xvc2UgdGhlIGN1cnJlbnQgY29udG91ciAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICB0MV9idWlsZGVyX2Nsb3NlX2NvbnRvdXIoIFQxX0J1aWxkZXIgIGJ1aWxkZXIgKQotICB7Ci0gICAgRlRfT3V0bGluZSogIG91dGxpbmUgPSBidWlsZGVyLT5jdXJyZW50OwotICAgIEZUX0ludCAgICAgICBmaXJzdDsKLQotCi0gICAgaWYgKCAhb3V0bGluZSApCi0gICAgICByZXR1cm47Ci0KLSAgICBmaXJzdCA9IG91dGxpbmUtPm5fY29udG91cnMgPD0gMQotICAgICAgICAgICAgPyAwIDogb3V0bGluZS0+Y29udG91cnNbb3V0bGluZS0+bl9jb250b3VycyAtIDJdICsgMTsKLQotICAgIC8qIFdlIG11c3Qgbm90IGluY2x1ZGUgdGhlIGxhc3QgcG9pbnQgaW4gdGhlIHBhdGggaWYgaXQgKi8KLSAgICAvKiBpcyBsb2NhdGVkIG9uIHRoZSBmaXJzdCBwb2ludC4gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBvdXRsaW5lLT5uX3BvaW50cyA+IDEgKQotICAgIHsKLSAgICAgIEZUX1ZlY3RvciogIHAxICAgICAgPSBvdXRsaW5lLT5wb2ludHMgKyBmaXJzdDsKLSAgICAgIEZUX1ZlY3RvciogIHAyICAgICAgPSBvdXRsaW5lLT5wb2ludHMgKyBvdXRsaW5lLT5uX3BvaW50cyAtIDE7Ci0gICAgICBGVF9CeXRlKiAgICBjb250cm9sID0gKEZUX0J5dGUqKW91dGxpbmUtPnRhZ3MgKyBvdXRsaW5lLT5uX3BvaW50cyAtIDE7Ci0KLQotICAgICAgLyogYGRlbGV0ZScgbGFzdCBwb2ludCBvbmx5IGlmIGl0IGNvaW5jaWRlcyB3aXRoIHRoZSBmaXJzdCAqLwotICAgICAgLyogcG9pbnQgYW5kIGl0IGlzIG5vdCBhIGNvbnRyb2wgcG9pbnQgKHdoaWNoIGNhbiBoYXBwZW4pLiAqLwotICAgICAgaWYgKCBwMS0+eCA9PSBwMi0+eCAmJiBwMS0+eSA9PSBwMi0+eSApCi0gICAgICAgIGlmICggKmNvbnRyb2wgPT0gRlRfQ1VSVkVfVEFHX09OICkKLSAgICAgICAgICBvdXRsaW5lLT5uX3BvaW50cy0tOwotICAgIH0KLQotICAgIGlmICggb3V0bGluZS0+bl9jb250b3VycyA+IDAgKQotICAgIHsKLSAgICAgIC8qIERvbid0IGFkZCBjb250b3VycyBvbmx5IGNvbnNpc3Rpbmcgb2Ygb25lIHBvaW50LCBpLmUuLCAgKi8KLSAgICAgIC8qIGNoZWNrIHdoZXRoZXIgdGhlIGZpcnN0IGFuZCB0aGUgbGFzdCBwb2ludCBpcyB0aGUgc2FtZS4gKi8KLSAgICAgIGlmICggZmlyc3QgPT0gb3V0bGluZS0+bl9wb2ludHMgLSAxICkKLSAgICAgIHsKLSAgICAgICAgb3V0bGluZS0+bl9jb250b3Vycy0tOwotICAgICAgICBvdXRsaW5lLT5uX3BvaW50cy0tOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBvdXRsaW5lLT5jb250b3Vyc1tvdXRsaW5lLT5uX2NvbnRvdXJzIC0gMV0gPQotICAgICAgICAgIChzaG9ydCkoIG91dGxpbmUtPm5fcG9pbnRzIC0gMSApOwotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9USEVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdDFfZGVjcnlwdCggRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgIEZUX09mZnNldCAgbGVuZ3RoLAotICAgICAgICAgICAgICBGVF9VU2hvcnQgIHNlZWQgKQotICB7Ci0gICAgUFNfQ29udl9FZXhlY0RlY29kZSggJmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgKyBsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmc2VlZCApOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNvYmpzLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvcHNvYmpzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmODc5YzEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3Bzb2Jqcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzb2Jqcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBdXhpbGlhcnkgZnVuY3Rpb25zIGZvciBQb3N0U2NyaXB0IGZvbnRzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1BTT0JKU19IX18KLSNkZWZpbmUgX19QU09CSlNfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1RBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFCi0gIGNvbnN0IFBTX1RhYmxlX0Z1bmNzUmVjICAgIHBzX3RhYmxlX2Z1bmNzOwotCi0gIEZUX0NBTExCQUNLX1RBQkxFCi0gIGNvbnN0IFBTX1BhcnNlcl9GdW5jc1JlYyAgIHBzX3BhcnNlcl9mdW5jczsKLQotICBGVF9DQUxMQkFDS19UQUJMRQotICBjb25zdCBUMV9CdWlsZGVyX0Z1bmNzUmVjICB0MV9idWlsZGVyX2Z1bmNzOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgcHNfdGFibGVfbmV3KCBQU19UYWJsZSAgIHRhYmxlLAotICAgICAgICAgICAgICAgIEZUX0ludCAgICAgY291bnQsCi0gICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBwc190YWJsZV9hZGQoIFBTX1RhYmxlICB0YWJsZSwKLSAgICAgICAgICAgICAgICBGVF9JbnQgICAgaWR4LAotICAgICAgICAgICAgICAgIHZvaWQqICAgICBvYmplY3QsCi0gICAgICAgICAgICAgICAgRlRfVUludCAgIGxlbmd0aCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgcHNfdGFibGVfZG9uZSggUFNfVGFibGUgIHRhYmxlICk7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHBzX3RhYmxlX3JlbGVhc2UoIFBTX1RhYmxlICB0YWJsZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxIFBBUlNFUiAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHBzX3BhcnNlcl9za2lwX3NwYWNlcyggUFNfUGFyc2VyICBwYXJzZXIgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHBzX3BhcnNlcl9za2lwX1BTX3Rva2VuKCBQU19QYXJzZXIgIHBhcnNlciApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgcHNfcGFyc2VyX3RvX3Rva2VuKCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICBUMV9Ub2tlbiAgIHRva2VuICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBwc19wYXJzZXJfdG9fdG9rZW5fYXJyYXkoIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1Rva2VuICAgdG9rZW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbWF4X3Rva2VucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQqICAgIHBudW1fdG9rZW5zICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgcHNfcGFyc2VyX2xvYWRfZmllbGQoIFBTX1BhcnNlciAgICAgICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUMV9GaWVsZCAgZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogICAgICAgICAgb2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBtYXhfb2JqZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgICBwZmxhZ3MgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBwc19wYXJzZXJfbG9hZF9maWVsZF90YWJsZSggUFNfUGFyc2VyICAgICAgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxX0ZpZWxkICBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiAgICAgICAgICBvYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIG1heF9vYmplY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICAgICAgIHBmbGFncyApOwotCi0gIEZUX0xPQ0FMKCBGVF9Mb25nICkKLSAgcHNfcGFyc2VyX3RvX2ludCggUFNfUGFyc2VyICBwYXJzZXIgKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHBzX3BhcnNlcl90b19ieXRlcyggUFNfUGFyc2VyICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9PZmZzZXQgIG1heF9ieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIHBudW1fYnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICBkZWxpbWl0ZXJzICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRml4ZWQgKQotICBwc19wYXJzZXJfdG9fZml4ZWQoIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgcG93ZXJfdGVuICk7Ci0KLQotICBGVF9MT0NBTCggRlRfSW50ICkKLSAgcHNfcGFyc2VyX3RvX2Nvb3JkX2FycmF5KCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIG1heF9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2hvcnQqICBjb29yZHMgKTsKLQotICBGVF9MT0NBTCggRlRfSW50ICkKLSAgcHNfcGFyc2VyX3RvX2ZpeGVkX2FycmF5KCBQU19QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIG1heF92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBwb3dlcl90ZW4gKTsKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgcHNfcGFyc2VyX2luaXQoIFBTX1BhcnNlciAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBiYXNlLAotICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBwc19wYXJzZXJfZG9uZSggUFNfUGFyc2VyICBwYXJzZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMSBCVUlMREVSICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgdDFfYnVpbGRlcl9pbml0KCBUMV9CdWlsZGVyICAgIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1NpemUgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgIGdseXBoLAotICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgaGludGluZyApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgdDFfYnVpbGRlcl9kb25lKCBUMV9CdWlsZGVyICBidWlsZGVyICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdDFfYnVpbGRlcl9jaGVja19wb2ludHMoIFQxX0J1aWxkZXIgIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICBjb3VudCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgdDFfYnVpbGRlcl9hZGRfcG9pbnQoIFQxX0J1aWxkZXIgIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB4LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUgICAgIGZsYWcgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0MV9idWlsZGVyX2FkZF9wb2ludDEoIFQxX0J1aWxkZXIgIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICB5ICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdDFfYnVpbGRlcl9hZGRfY29udG91ciggVDFfQnVpbGRlciAgYnVpbGRlciApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdDFfYnVpbGRlcl9zdGFydF9wb2ludCggVDFfQnVpbGRlciAgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeSApOwotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0MV9idWlsZGVyX2Nsb3NlX2NvbnRvdXIoIFQxX0J1aWxkZXIgIGJ1aWxkZXIgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVEhFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgdDFfZGVjcnlwdCggRlRfQnl0ZSogICBidWZmZXIsCi0gICAgICAgICAgICAgIEZUX09mZnNldCAgbGVuZ3RoLAotICAgICAgICAgICAgICBGVF9VU2hvcnQgIHNlZWQgKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1BTT0JKU19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC90MWNtYXAuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC90MWNtYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUyZDQzMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNhdXgvdDFjbWFwLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDFjbWFwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFR5cGUgMSBjaGFyYWN0ZXIgbWFwIHN1cHBvcnQgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSAidDFjbWFwLmgiCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgInBzYXV4ZXJyLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgVFlQRTEgU1RBTkRBUkQgKEFORCBFWFBFUlQpIEVOQ09ESU5HIENNQVBTICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgdm9pZAotICB0MV9jbWFwX3N0ZF9pbml0KCBUMV9DTWFwU3RkICBjbWFwLAotICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICBpc19leHBlcnQgKQotICB7Ci0gICAgVDFfRmFjZSAgICAgICAgICAgICBmYWNlICAgID0gKFQxX0ZhY2UpRlRfQ01BUF9GQUNFKCBjbWFwICk7Ci0gICAgRlRfU2VydmljZV9Qc0NNYXBzICBwc25hbWVzID0gKEZUX1NlcnZpY2VfUHNDTWFwcylmYWNlLT5wc25hbWVzOwotCi0KLSAgICBjbWFwLT5udW1fZ2x5cGhzICAgID0gKEZUX1VJbnQpZmFjZS0+dHlwZTEubnVtX2dseXBoczsKLSAgICBjbWFwLT5nbHlwaF9uYW1lcyAgID0gKGNvbnN0IGNoYXIqIGNvbnN0KilmYWNlLT50eXBlMS5nbHlwaF9uYW1lczsKLSAgICBjbWFwLT5zaWRfdG9fc3RyaW5nID0gcHNuYW1lcy0+YWRvYmVfc3RkX3N0cmluZ3M7Ci0gICAgY21hcC0+Y29kZV90b19zaWQgICA9IGlzX2V4cGVydCA/IHBzbmFtZXMtPmFkb2JlX2V4cGVydF9lbmNvZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwc25hbWVzLT5hZG9iZV9zdGRfZW5jb2Rpbmc7Ci0KLSAgICBGVF9BU1NFUlQoIGNtYXAtPmNvZGVfdG9fc2lkICE9IE5VTEwgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgdDFfY21hcF9zdGRfZG9uZSggVDFfQ01hcFN0ZCAgY21hcCApCi0gIHsKLSAgICBjbWFwLT5udW1fZ2x5cGhzICAgID0gMDsKLSAgICBjbWFwLT5nbHlwaF9uYW1lcyAgID0gTlVMTDsKLSAgICBjbWFwLT5zaWRfdG9fc3RyaW5nID0gTlVMTDsKLSAgICBjbWFwLT5jb2RlX3RvX3NpZCAgID0gTlVMTDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgdDFfY21hcF9zdGRfY2hhcl9pbmRleCggVDFfQ01hcFN0ZCAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgY2hhcl9jb2RlICkKLSAgewotICAgIEZUX1VJbnQgIHJlc3VsdCA9IDA7Ci0KLQotICAgIGlmICggY2hhcl9jb2RlIDwgMjU2ICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICAgICAgY29kZSwgbjsKLSAgICAgIGNvbnN0IGNoYXIqICBnbHlwaF9uYW1lOwotCi0KLSAgICAgIC8qIGNvbnZlcnQgY2hhcmFjdGVyIGNvZGUgdG8gQWRvYmUgU0lEIHN0cmluZyAqLwotICAgICAgY29kZSAgICAgICA9IGNtYXAtPmNvZGVfdG9fc2lkW2NoYXJfY29kZV07Ci0gICAgICBnbHlwaF9uYW1lID0gY21hcC0+c2lkX3RvX3N0cmluZyggY29kZSApOwotCi0gICAgICAvKiBsb29rIGZvciB0aGUgY29ycmVzcG9uZGluZyBnbHlwaCBuYW1lICovCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IGNtYXAtPm51bV9nbHlwaHM7IG4rKyApCi0gICAgICB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIGduYW1lID0gY21hcC0+Z2x5cGhfbmFtZXNbbl07Ci0KLQotICAgICAgICBpZiAoIGduYW1lICYmIGduYW1lWzBdID09IGdseXBoX25hbWVbMF0gICYmCi0gICAgICAgICAgICAgZnRfc3RyY21wKCBnbmFtZSwgZ2x5cGhfbmFtZSApID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gbjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludDMyICkKLSAgdDFfY21hcF9zdGRfY2hhcl9uZXh0KCBUMV9DTWFwU3RkICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICAqcGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9VSW50ICAgIHJlc3VsdCAgICA9IDA7Ci0gICAgRlRfVUludDMyICBjaGFyX2NvZGUgPSAqcGNoYXJfY29kZSArIDE7Ci0KLQotICAgIHdoaWxlICggY2hhcl9jb2RlIDwgMjU2ICkKLSAgICB7Ci0gICAgICByZXN1bHQgPSB0MV9jbWFwX3N0ZF9jaGFyX2luZGV4KCBjbWFwLCBjaGFyX2NvZGUgKTsKLSAgICAgIGlmICggcmVzdWx0ICE9IDAgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGNoYXJfY29kZSsrOwotICAgIH0KLSAgICBjaGFyX2NvZGUgPSAwOwotCi0gIEV4aXQ6Ci0gICAgKnBjaGFyX2NvZGUgPSBjaGFyX2NvZGU7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHQxX2NtYXBfc3RhbmRhcmRfaW5pdCggVDFfQ01hcFN0ZCAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBwb2ludGVyICkKLSAgewotICAgIEZUX1VOVVNFRCggcG9pbnRlciApOwotCi0KLSAgICB0MV9jbWFwX3N0ZF9pbml0KCBjbWFwLCAwICk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFX0RFRiBjb25zdCBGVF9DTWFwX0NsYXNzUmVjCi0gIHQxX2NtYXBfc3RhbmRhcmRfY2xhc3NfcmVjID0KLSAgewotICAgIHNpemVvZiAoIFQxX0NNYXBTdGRSZWMgKSwKLQotICAgIChGVF9DTWFwX0luaXRGdW5jKSAgICAgdDFfY21hcF9zdGFuZGFyZF9pbml0LAotICAgIChGVF9DTWFwX0RvbmVGdW5jKSAgICAgdDFfY21hcF9zdGRfZG9uZSwKLSAgICAoRlRfQ01hcF9DaGFySW5kZXhGdW5jKXQxX2NtYXBfc3RkX2NoYXJfaW5kZXgsCi0gICAgKEZUX0NNYXBfQ2hhck5leHRGdW5jKSB0MV9jbWFwX3N0ZF9jaGFyX25leHQsCi0KLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCi0gIH07Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdDFfY21hcF9leHBlcnRfaW5pdCggVDFfQ01hcFN0ZCAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgcG9pbnRlciApCi0gIHsKLSAgICBGVF9VTlVTRUQoIHBvaW50ZXIgKTsKLQotCi0gICAgdDFfY21hcF9zdGRfaW5pdCggY21hcCwgMSApOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGIGNvbnN0IEZUX0NNYXBfQ2xhc3NSZWMKLSAgdDFfY21hcF9leHBlcnRfY2xhc3NfcmVjID0KLSAgewotICAgIHNpemVvZiAoIFQxX0NNYXBTdGRSZWMgKSwKLQotICAgIChGVF9DTWFwX0luaXRGdW5jKSAgICAgdDFfY21hcF9leHBlcnRfaW5pdCwKLSAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIHQxX2NtYXBfc3RkX2RvbmUsCi0gICAgKEZUX0NNYXBfQ2hhckluZGV4RnVuYyl0MV9jbWFwX3N0ZF9jaGFyX2luZGV4LAotICAgIChGVF9DTWFwX0NoYXJOZXh0RnVuYykgdDFfY21hcF9zdGRfY2hhcl9uZXh0LAotCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAotICB9OwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICBUWVBFMSBDVVNUT00gRU5DT0RJTkcgQ01BUCAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdDFfY21hcF9jdXN0b21faW5pdCggVDFfQ01hcEN1c3RvbSAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgICAgcG9pbnRlciApCi0gIHsKLSAgICBUMV9GYWNlICAgICAgZmFjZSAgICAgPSAoVDFfRmFjZSlGVF9DTUFQX0ZBQ0UoIGNtYXAgKTsKLSAgICBUMV9FbmNvZGluZyAgZW5jb2RpbmcgPSAmZmFjZS0+dHlwZTEuZW5jb2Rpbmc7Ci0KLSAgICBGVF9VTlVTRUQoIHBvaW50ZXIgKTsKLQotCi0gICAgY21hcC0+Zmlyc3QgICA9IChGVF9VSW50KWVuY29kaW5nLT5jb2RlX2ZpcnN0OwotICAgIGNtYXAtPmNvdW50ICAgPSAoRlRfVUludCllbmNvZGluZy0+Y29kZV9sYXN0IC0gY21hcC0+Zmlyc3Q7Ci0gICAgY21hcC0+aW5kaWNlcyA9IGVuY29kaW5nLT5jaGFyX2luZGV4OwotCi0gICAgRlRfQVNTRVJUKCBjbWFwLT5pbmRpY2VzICE9IE5VTEwgKTsKLSAgICBGVF9BU1NFUlQoIGVuY29kaW5nLT5jb2RlX2ZpcnN0IDw9IGVuY29kaW5nLT5jb2RlX2xhc3QgKTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICB0MV9jbWFwX2N1c3RvbV9kb25lKCBUMV9DTWFwQ3VzdG9tICBjbWFwICkKLSAgewotICAgIGNtYXAtPmluZGljZXMgPSBOVUxMOwotICAgIGNtYXAtPmZpcnN0ICAgPSAwOwotICAgIGNtYXAtPmNvdW50ICAgPSAwOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICB0MV9jbWFwX2N1c3RvbV9jaGFyX2luZGV4KCBUMV9DTWFwQ3VzdG9tICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICAgICBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfVUludCAgICByZXN1bHQgPSAwOwotCi0KLSAgICBpZiAoICggY2hhcl9jb2RlID49IGNtYXAtPmZpcnN0ICkgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgKCBjaGFyX2NvZGUgPCAoIGNtYXAtPmZpcnN0ICsgY21hcC0+Y291bnQgKSApICkKLSAgICAgIHJlc3VsdCA9IGNtYXAtPmluZGljZXNbY2hhcl9jb2RlXTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludDMyICkKLSAgdDFfY21hcF9jdXN0b21fY2hhcl9uZXh0KCBUMV9DTWFwQ3VzdG9tICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgICAgKnBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfVUludCAgICByZXN1bHQgPSAwOwotICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlID0gKnBjaGFyX2NvZGU7Ci0KLQotICAgICsrY2hhcl9jb2RlOwotCi0gICAgaWYgKCBjaGFyX2NvZGUgPCBjbWFwLT5maXJzdCApCi0gICAgICBjaGFyX2NvZGUgPSBjbWFwLT5maXJzdDsKLQotICAgIGZvciAoIDsgY2hhcl9jb2RlIDwgKCBjbWFwLT5maXJzdCArIGNtYXAtPmNvdW50ICk7IGNoYXJfY29kZSsrICkKLSAgICB7Ci0gICAgICByZXN1bHQgPSBjbWFwLT5pbmRpY2VzW2NoYXJfY29kZV07Ci0gICAgICBpZiAoIHJlc3VsdCAhPSAwICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGNoYXJfY29kZSA9IDA7Ci0KLSAgRXhpdDoKLSAgICAqcGNoYXJfY29kZSA9IGNoYXJfY29kZTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYgY29uc3QgRlRfQ01hcF9DbGFzc1JlYwotICB0MV9jbWFwX2N1c3RvbV9jbGFzc19yZWMgPQotICB7Ci0gICAgc2l6ZW9mICggVDFfQ01hcEN1c3RvbVJlYyApLAotCi0gICAgKEZUX0NNYXBfSW5pdEZ1bmMpICAgICB0MV9jbWFwX2N1c3RvbV9pbml0LAotICAgIChGVF9DTWFwX0RvbmVGdW5jKSAgICAgdDFfY21hcF9jdXN0b21fZG9uZSwKLSAgICAoRlRfQ01hcF9DaGFySW5kZXhGdW5jKXQxX2NtYXBfY3VzdG9tX2NoYXJfaW5kZXgsCi0gICAgKEZUX0NNYXBfQ2hhck5leHRGdW5jKSB0MV9jbWFwX2N1c3RvbV9jaGFyX25leHQsCi0KLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMCi0gIH07Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICBUWVBFMSBTWU5USEVUSUMgVU5JQ09ERSBFTkNPRElORyBDTUFQICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBGVF9DQUxMQkFDS19ERUYoIGNvbnN0IGNoYXIgKiApCi0gIHBzYXV4X2dldF9nbHlwaF9uYW1lKCBUMV9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgaWR4ICkKLSAgewotICAgIHJldHVybiBmYWNlLT50eXBlMS5nbHlwaF9uYW1lc1tpZHhdOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdDFfY21hcF91bmljb2RlX2luaXQoIFBTX1VuaWNvZGVzICB1bmljb2RlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICBwb2ludGVyICkKLSAgewotICAgIFQxX0ZhY2UgICAgICAgICAgICAgZmFjZSAgICA9IChUMV9GYWNlKUZUX0NNQVBfRkFDRSggdW5pY29kZXMgKTsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgIG1lbW9yeSAgPSBGVF9GQUNFX01FTU9SWSggZmFjZSApOwotICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lcyA9IChGVF9TZXJ2aWNlX1BzQ01hcHMpZmFjZS0+cHNuYW1lczsKLQotICAgIEZUX1VOVVNFRCggcG9pbnRlciApOwotCi0KLSAgICByZXR1cm4gcHNuYW1lcy0+dW5pY29kZXNfaW5pdCggbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpZmFjZS0+dHlwZTEubnVtX2dseXBocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBTX0dldEdseXBoTmFtZUZ1bmMpJnBzYXV4X2dldF9nbHlwaF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFNfRnJlZUdseXBoTmFtZUZ1bmMpTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1BvaW50ZXIpZmFjZSApOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICB0MV9jbWFwX3VuaWNvZGVfZG9uZSggUFNfVW5pY29kZXMgIHVuaWNvZGVzICkKLSAgewotICAgIEZUX0ZhY2UgICAgZmFjZSAgID0gRlRfQ01BUF9GQUNFKCB1bmljb2RlcyApOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gRlRfRkFDRV9NRU1PUlkoIGZhY2UgKTsKLQotCi0gICAgRlRfRlJFRSggdW5pY29kZXMtPm1hcHMgKTsKLSAgICB1bmljb2Rlcy0+bnVtX21hcHMgPSAwOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICB0MV9jbWFwX3VuaWNvZGVfY2hhcl9pbmRleCggUFNfVW5pY29kZXMgIHVuaWNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgIGNoYXJfY29kZSApCi0gIHsKLSAgICBUMV9GYWNlICAgICAgICAgICAgIGZhY2UgICAgPSAoVDFfRmFjZSlGVF9DTUFQX0ZBQ0UoIHVuaWNvZGVzICk7Ci0gICAgRlRfU2VydmljZV9Qc0NNYXBzICBwc25hbWVzID0gKEZUX1NlcnZpY2VfUHNDTWFwcylmYWNlLT5wc25hbWVzOwotCi0KLSAgICByZXR1cm4gcHNuYW1lcy0+dW5pY29kZXNfY2hhcl9pbmRleCggdW5pY29kZXMsIGNoYXJfY29kZSApOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQzMiApCi0gIHQxX2NtYXBfdW5pY29kZV9jaGFyX25leHQoIFBTX1VuaWNvZGVzICB1bmljb2RlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgKnBjaGFyX2NvZGUgKQotICB7Ci0gICAgVDFfRmFjZSAgICAgICAgICAgICBmYWNlICAgID0gKFQxX0ZhY2UpRlRfQ01BUF9GQUNFKCB1bmljb2RlcyApOwotICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lcyA9IChGVF9TZXJ2aWNlX1BzQ01hcHMpZmFjZS0+cHNuYW1lczsKLQotCi0gICAgcmV0dXJuIHBzbmFtZXMtPnVuaWNvZGVzX2NoYXJfbmV4dCggdW5pY29kZXMsIHBjaGFyX2NvZGUgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGIGNvbnN0IEZUX0NNYXBfQ2xhc3NSZWMKLSAgdDFfY21hcF91bmljb2RlX2NsYXNzX3JlYyA9Ci0gIHsKLSAgICBzaXplb2YgKCBQU19Vbmljb2Rlc1JlYyApLAotCi0gICAgKEZUX0NNYXBfSW5pdEZ1bmMpICAgICB0MV9jbWFwX3VuaWNvZGVfaW5pdCwKLSAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIHQxX2NtYXBfdW5pY29kZV9kb25lLAotICAgIChGVF9DTWFwX0NoYXJJbmRleEZ1bmMpdDFfY21hcF91bmljb2RlX2NoYXJfaW5kZXgsCi0gICAgKEZUX0NNYXBfQ2hhck5leHRGdW5jKSB0MV9jbWFwX3VuaWNvZGVfY2hhcl9uZXh0LAotCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAotICB9OwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3QxY21hcC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3QxY21hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGJhMDZjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC90MWNtYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0MWNtYXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHlwZSAxIGNoYXJhY3RlciBtYXAgc3VwcG9ydCAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDItMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19UMUNNQVBfSF9fCi0jZGVmaW5lIF9fVDFDTUFQX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFlQRTFfVFlQRVNfSAotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICBUWVBFMSBTVEFOREFSRCAoQU5EIEVYUEVSVCkgRU5DT0RJTkcgQ01BUFMgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIHN0YW5kYXJkIChhbmQgZXhwZXJ0KSBlbmNvZGluZyBjbWFwcyAqLwotICB0eXBlZGVmIHN0cnVjdCBUMV9DTWFwU3RkUmVjXyogIFQxX0NNYXBTdGQ7Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQxX0NNYXBTdGRSZWNfCi0gIHsKLSAgICBGVF9DTWFwUmVjICAgICAgICAgICAgICAgIGNtYXA7Ci0KLSAgICBjb25zdCBGVF9VU2hvcnQqICAgICAgICAgIGNvZGVfdG9fc2lkOwotICAgIFBTX0Fkb2JlX1N0ZF9TdHJpbmdzRnVuYyAgc2lkX3RvX3N0cmluZzsKLQotICAgIEZUX1VJbnQgICAgICAgICAgICAgICAgICAgbnVtX2dseXBoczsKLSAgICBjb25zdCBjaGFyKiBjb25zdCogICAgICAgIGdseXBoX25hbWVzOwotCi0gIH0gVDFfQ01hcFN0ZFJlYzsKLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFIGNvbnN0IEZUX0NNYXBfQ2xhc3NSZWMKLSAgdDFfY21hcF9zdGFuZGFyZF9jbGFzc19yZWM7Ci0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEUgY29uc3QgRlRfQ01hcF9DbGFzc1JlYwotICB0MV9jbWFwX2V4cGVydF9jbGFzc19yZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICBUWVBFMSBDVVNUT00gRU5DT0RJTkcgQ01BUCAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIHN0cnVjdCBUMV9DTWFwQ3VzdG9tUmVjXyogIFQxX0NNYXBDdXN0b207Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFQxX0NNYXBDdXN0b21SZWNfCi0gIHsKLSAgICBGVF9DTWFwUmVjICBjbWFwOwotICAgIEZUX1VJbnQgICAgIGZpcnN0OwotICAgIEZUX1VJbnQgICAgIGNvdW50OwotICAgIEZUX1VTaG9ydCogIGluZGljZXM7Ci0KLSAgfSBUMV9DTWFwQ3VzdG9tUmVjOwotCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEUgY29uc3QgRlRfQ01hcF9DbGFzc1JlYwotICB0MV9jbWFwX2N1c3RvbV9jbGFzc19yZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgVFlQRTEgU1lOVEhFVElDIFVOSUNPREUgRU5DT0RJTkcgQ01BUCAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiB1bmljb2RlIChzeW50aGV0aWMpIGNtYXBzICovCi0KLSAgRlRfQ0FMTEJBQ0tfVEFCTEUgY29uc3QgRlRfQ01hcF9DbGFzc1JlYwotICB0MV9jbWFwX3VuaWNvZGVfY2xhc3NfcmVjOwotCi0gLyogKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1QxQ01BUF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC90MWRlY29kZS5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3QxZGVjb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMTk5MjguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3QxZGVjb2RlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxZGVjb2RlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQb3N0U2NyaXB0IFR5cGUgMSBkZWNvZGluZyByb3V0aW5lcyAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfSElOVFNfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0KLSNpbmNsdWRlICJ0MWRlY29kZS5oIgotI2luY2x1ZGUgInBzb2Jqcy5oIgotCi0jaW5jbHVkZSAicHNhdXhlcnIuaCIKLQotLyogZW5zdXJlIHByb3BlciBzaWduIGV4dGVuc2lvbiAqLwotI2RlZmluZSBGaXgySW50KCBmICkgICggKEZUX0ludCkoRlRfU2hvcnQpKCAoZikgPj4gMTYgKSApCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdDFkZWNvZGUKLQotCi0gIHR5cGVkZWYgZW51bSAgVDFfT3BlcmF0b3JfCi0gIHsKLSAgICBvcF9ub25lID0gMCwKLSAgICBvcF9lbmRjaGFyLAotICAgIG9wX2hzYncsCi0gICAgb3Bfc2VhYywKLSAgICBvcF9zYncsCi0gICAgb3BfY2xvc2VwYXRoLAotICAgIG9wX2hsaW5ldG8sCi0gICAgb3BfaG1vdmV0bywKLSAgICBvcF9odmN1cnZldG8sCi0gICAgb3BfcmxpbmV0bywKLSAgICBvcF9ybW92ZXRvLAotICAgIG9wX3JyY3VydmV0bywKLSAgICBvcF92aGN1cnZldG8sCi0gICAgb3BfdmxpbmV0bywKLSAgICBvcF92bW92ZXRvLAotICAgIG9wX2RvdHNlY3Rpb24sCi0gICAgb3BfaHN0ZW0sCi0gICAgb3BfaHN0ZW0zLAotICAgIG9wX3ZzdGVtLAotICAgIG9wX3ZzdGVtMywKLSAgICBvcF9kaXYsCi0gICAgb3BfY2FsbG90aGVyc3ViciwKLSAgICBvcF9jYWxsc3ViciwKLSAgICBvcF9wb3AsCi0gICAgb3BfcmV0dXJuLAotICAgIG9wX3NldGN1cnJlbnRwb2ludCwKLSAgICBvcF91bmtub3duMTUsCi0KLSAgICBvcF9tYXggICAgLyogbmV2ZXIgcmVtb3ZlIHRoaXMgb25lICovCi0KLSAgfSBUMV9PcGVyYXRvcjsKLQotCi0gIHN0YXRpYwotICBjb25zdCBGVF9JbnQgIHQxX2FyZ3NfY291bnRbb3BfbWF4XSA9Ci0gIHsKLSAgICAwLCAvKiBub25lICovCi0gICAgMCwgLyogZW5kY2hhciAqLwotICAgIDIsIC8qIGhzYncgKi8KLSAgICA1LCAvKiBzZWFjICovCi0gICAgNCwgLyogc2J3ICovCi0gICAgMCwgLyogY2xvc2VwYXRoICovCi0gICAgMSwgLyogaGxpbmV0byAqLwotICAgIDEsIC8qIGhtb3ZldG8gKi8KLSAgICA0LCAvKiBodmN1cnZldG8gKi8KLSAgICAyLCAvKiBybGluZXRvICovCi0gICAgMiwgLyogcm1vdmV0byAqLwotICAgIDYsIC8qIHJyY3VydmV0byAqLwotICAgIDQsIC8qIHZoY3VydmV0byAqLwotICAgIDEsIC8qIHZsaW5ldG8gKi8KLSAgICAxLCAvKiB2bW92ZXRvICovCi0gICAgMCwgLyogZG90c2VjdGlvbiAqLwotICAgIDIsIC8qIGhzdGVtICovCi0gICAgNiwgLyogaHN0ZW0zICovCi0gICAgMiwgLyogdnN0ZW0gKi8KLSAgICA2LCAvKiB2c3RlbTMgKi8KLSAgICAyLCAvKiBkaXYgKi8KLSAgIC0xLCAvKiBjYWxsb3RoZXJzdWJyICovCi0gICAgMSwgLyogY2FsbHN1YnIgKi8KLSAgICAwLCAvKiBwb3AgKi8KLSAgICAwLCAvKiByZXR1cm4gKi8KLSAgICAyLCAvKiBzZXRjdXJyZW50cG9pbnQgKi8KLSAgICAyICAvKiBvcGNvZGUgMTUgKHVuZG9jdW1lbnRlZCBhbmQgb2Jzb2xldGUpICovCi0gIH07Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0MV9sb29rdXBfZ2x5cGhfYnlfc3RkY2hhcmNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb29rcyB1cCBhIGdpdmVuIGdseXBoIGJ5IGl0cyBTdGFuZGFyZEVuY29kaW5nIGNoYXJjb2RlLiAgVXNlZCB0byAgKi8KLSAgLyogICAgaW1wbGVtZW50IHRoZSBTRUFDIFR5cGUgMSBvcGVyYXRvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgOjogVGhlIGN1cnJlbnQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyY29kZSA6OiBUaGUgY2hhcmFjdGVyIGNvZGUgdG8gbG9vayBmb3IuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGdseXBoIGluZGV4IGluIHRoZSBmb250IGZhY2UuICBSZXR1cm5zIC0xIGlmIHRoZSBjb3JyZXNwb25kaW5nICAgKi8KLSAgLyogICAgZ2x5cGggd2Fzbid0IGZvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfSW50Ci0gIHQxX2xvb2t1cF9nbHlwaF9ieV9zdGRjaGFyY29kZSggVDFfRGVjb2RlciAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICBjaGFyY29kZSApCi0gIHsKLSAgICBGVF9VSW50ICAgICAgICAgICAgIG47Ci0gICAgY29uc3QgRlRfU3RyaW5nKiAgICBnbHlwaF9uYW1lOwotICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lcyA9IGRlY29kZXItPnBzbmFtZXM7Ci0KLQotICAgIC8qIGNoZWNrIHJhbmdlIG9mIHN0YW5kYXJkIGNoYXIgY29kZSAqLwotICAgIGlmICggY2hhcmNvZGUgPCAwIHx8IGNoYXJjb2RlID4gMjU1ICkKLSAgICAgIHJldHVybiAtMTsKLQotICAgIGdseXBoX25hbWUgPSBwc25hbWVzLT5hZG9iZV9zdGRfc3RyaW5ncygKLSAgICAgICAgICAgICAgICAgICBwc25hbWVzLT5hZG9iZV9zdGRfZW5jb2RpbmdbY2hhcmNvZGVdKTsKLQotICAgIGZvciAoIG4gPSAwOyBuIDwgZGVjb2Rlci0+bnVtX2dseXBoczsgbisrICkKLSAgICB7Ci0gICAgICBGVF9TdHJpbmcqICBuYW1lID0gKEZUX1N0cmluZyopZGVjb2Rlci0+Z2x5cGhfbmFtZXNbbl07Ci0KLQotICAgICAgaWYgKCBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgIG5hbWVbMF0gPT0gZ2x5cGhfbmFtZVswXSAgICAgICAgICAgJiYKLSAgICAgICAgICAgZnRfc3RyY21wKCBuYW1lLCBnbHlwaF9uYW1lICkgPT0gMCApCi0gICAgICAgIHJldHVybiAoRlRfSW50KW47Ci0gICAgfQotCi0gICAgcmV0dXJuIC0xOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0MW9wZXJhdG9yX3NlYWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbXBsZW1lbnRzIHRoZSBgc2VhYycgVHlwZSAxIG9wZXJhdG9yIGZvciBhIFR5cGUgMSBkZWNvZGVyLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZWNvZGVyIDo6IFRoZSBjdXJyZW50IENJRCBkZWNvZGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFzYiAgICAgOjogVGhlIGFjY2VudCdzIHNpZGUgYmVhcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWR4ICAgICA6OiBUaGUgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIGFjY2VudC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhZHkgICAgIDo6IFRoZSB2ZXJ0aWNhbCBvZmZzZXQgb2YgdGhlIGFjY2VudC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJjaGFyICAgOjogVGhlIGJhc2UgY2hhcmFjdGVyJ3MgU3RhbmRhcmRFbmNvZGluZyBjaGFyY29kZS4gICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYWNoYXIgICA6OiBUaGUgYWNjZW50IGNoYXJhY3RlcidzIFN0YW5kYXJkRW5jb2RpbmcgY2hhcmNvZGUuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgdDFvcGVyYXRvcl9zZWFjKCBUMV9EZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgIGFzYiwKLSAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICBhZHgsCi0gICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgYWR5LAotICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIGJjaGFyLAotICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgIGFjaGFyICkKLSAgewotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICBGVF9JbnQgICAgICAgYmNoYXJfaW5kZXgsIGFjaGFyX2luZGV4OwotI2lmIDAKLSAgICBGVF9JbnQgICAgICAgbl9iYXNlX3BvaW50czsKLSAgICBGVF9PdXRsaW5lKiAgYmFzZSA9IGRlY29kZXItPmJ1aWxkZXIuYmFzZTsKLSNlbmRpZgotICAgIEZUX1ZlY3RvciAgICBsZWZ0X2JlYXJpbmcsIGFkdmFuY2U7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgVDFfRmFjZSAgICAgIGZhY2UgID0gKFQxX0ZhY2UpZGVjb2Rlci0+YnVpbGRlci5mYWNlOwotI2VuZGlmCi0KLQotICAgIGlmICggZGVjb2Rlci0+c2VhYyApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAidDFvcGVyYXRvcl9zZWFjOiBpbnZhbGlkIG5lc3RlZCBzZWFjXG4iICkpOwotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBTeW50YXhfRXJyb3IgKTsKLSAgICB9Ci0KLSAgICBpZiAoIGRlY29kZXItPmJ1aWxkZXIubWV0cmljc19vbmx5ICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJ0MW9wZXJhdG9yX3NlYWM6IHVuZXhwZWN0ZWQgc2VhY1xuIiApKTsKLSAgICAgIHJldHVybiBGVF9USFJPVyggU3ludGF4X0Vycm9yICk7Ci0gICAgfQotCi0gICAgLyogc2VhYyB3ZWlyZG5lc3MgKi8KLSAgICBhZHggKz0gZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcueDsKLQotICAgIC8qIGBnbHlwaF9uYW1lcycgaXMgc2V0IHRvIDAgZm9yIENJRCBmb250cyB3aGljaCBkbyBub3QgKi8KLSAgICAvKiBpbmNsdWRlIGFuIGVuY29kaW5nLiAgSG93IGNhbiB3ZSBkZWFsIHdpdGggdGhlc2U/ICAgICovCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgIGlmICggZGVjb2Rlci0+Z2x5cGhfbmFtZXMgPT0gMCAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgIWZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSApCi0jZWxzZQotICAgIGlmICggZGVjb2Rlci0+Z2x5cGhfbmFtZXMgPT0gMCApCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCAqLwotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInQxb3BlcmF0b3Jfc2VhYzoiCi0gICAgICAgICAgICAgICAgICIgZ2x5cGggbmFtZXMgdGFibGUgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGZvbnRcbiIgKSk7Ci0gICAgICByZXR1cm4gRlRfVEhST1coIFN5bnRheF9FcnJvciApOwotICAgIH0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICBpZiAoIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSApCi0gICAgewotICAgICAgLyogdGhlIGNhbGxlciBtdXN0IGhhbmRsZSB0aGUgZm9udCBlbmNvZGluZyBhbHNvICovCi0gICAgICBiY2hhcl9pbmRleCA9IGJjaGFyOwotICAgICAgYWNoYXJfaW5kZXggPSBhY2hhcjsKLSAgICB9Ci0gICAgZWxzZQotI2VuZGlmCi0gICAgewotICAgICAgYmNoYXJfaW5kZXggPSB0MV9sb29rdXBfZ2x5cGhfYnlfc3RkY2hhcmNvZGUoIGRlY29kZXIsIGJjaGFyICk7Ci0gICAgICBhY2hhcl9pbmRleCA9IHQxX2xvb2t1cF9nbHlwaF9ieV9zdGRjaGFyY29kZSggZGVjb2RlciwgYWNoYXIgKTsKLSAgICB9Ci0KLSAgICBpZiAoIGJjaGFyX2luZGV4IDwgMCB8fCBhY2hhcl9pbmRleCA8IDAgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInQxb3BlcmF0b3Jfc2VhYzoiCi0gICAgICAgICAgICAgICAgICIgaW52YWxpZCBzZWFjIGNoYXJhY3RlciBjb2RlIGFyZ3VtZW50c1xuIiApKTsKLSAgICAgIHJldHVybiBGVF9USFJPVyggU3ludGF4X0Vycm9yICk7Ci0gICAgfQotCi0gICAgLyogaWYgd2UgYXJlIHRyeWluZyB0byBsb2FkIGEgY29tcG9zaXRlIGdseXBoLCBkbyBub3QgbG9hZCB0aGUgKi8KLSAgICAvKiBhY2NlbnQgY2hhcmFjdGVyIGFuZCByZXR1cm4gdGhlIGFycmF5IG9mIHN1YmdseXBocy4gICAgICAgICAqLwotICAgIGlmICggZGVjb2Rlci0+YnVpbGRlci5ub19yZWN1cnNlICkKLSAgICB7Ci0gICAgICBGVF9HbHlwaFNsb3QgICAgZ2x5cGggID0gKEZUX0dseXBoU2xvdClkZWNvZGVyLT5idWlsZGVyLmdseXBoOwotICAgICAgRlRfR2x5cGhMb2FkZXIgIGxvYWRlciA9IGdseXBoLT5pbnRlcm5hbC0+bG9hZGVyOwotICAgICAgRlRfU3ViR2x5cGggICAgIHN1Ymc7Ci0KLQotICAgICAgLyogcmVhbGxvY2F0ZSBzdWJnbHlwaCBhcnJheSBpZiBuZWNlc3NhcnkgKi8KLSAgICAgIGVycm9yID0gRlRfR2x5cGhMb2FkZXJfQ2hlY2tTdWJHbHlwaHMoIGxvYWRlciwgMiApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgc3ViZyA9IGxvYWRlci0+Y3VycmVudC5zdWJnbHlwaHM7Ci0KLSAgICAgIC8qIHN1YmdseXBoIDAgPSBiYXNlIGNoYXJhY3RlciAqLwotICAgICAgc3ViZy0+aW5kZXggPSBiY2hhcl9pbmRleDsKLSAgICAgIHN1YmctPmZsYWdzID0gRlRfU1VCR0xZUEhfRkxBR19BUkdTX0FSRV9YWV9WQUxVRVMgfAotICAgICAgICAgICAgICAgICAgICBGVF9TVUJHTFlQSF9GTEFHX1VTRV9NWV9NRVRSSUNTOwotICAgICAgc3ViZy0+YXJnMSAgPSAwOwotICAgICAgc3ViZy0+YXJnMiAgPSAwOwotICAgICAgc3ViZysrOwotCi0gICAgICAvKiBzdWJnbHlwaCAxID0gYWNjZW50IGNoYXJhY3RlciAqLwotICAgICAgc3ViZy0+aW5kZXggPSBhY2hhcl9pbmRleDsKLSAgICAgIHN1YmctPmZsYWdzID0gRlRfU1VCR0xZUEhfRkxBR19BUkdTX0FSRV9YWV9WQUxVRVM7Ci0gICAgICBzdWJnLT5hcmcxICA9IChGVF9JbnQpRklYRURfVE9fSU5UKCBhZHggLSBhc2IgKTsKLSAgICAgIHN1YmctPmFyZzIgID0gKEZUX0ludClGSVhFRF9UT19JTlQoIGFkeSApOwotCi0gICAgICAvKiBzZXQgdXAgcmVtYWluaW5nIGdseXBoIGZpZWxkcyAqLwotICAgICAgZ2x5cGgtPm51bV9zdWJnbHlwaHMgPSAyOwotICAgICAgZ2x5cGgtPnN1YmdseXBocyAgICAgPSBsb2FkZXItPmJhc2Uuc3ViZ2x5cGhzOwotICAgICAgZ2x5cGgtPmZvcm1hdCAgICAgICAgPSBGVF9HTFlQSF9GT1JNQVRfQ09NUE9TSVRFOwotCi0gICAgICBsb2FkZXItPmN1cnJlbnQubnVtX3N1YmdseXBocyA9IDI7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogRmlyc3QgbG9hZCBgYmNoYXInIGluIGJ1aWxkZXIgKi8KLSAgICAvKiBub3cgbG9hZCB0aGUgdW5zY2FsZWQgb3V0bGluZSAqLwotCi0gICAgRlRfR2x5cGhMb2FkZXJfUHJlcGFyZSggZGVjb2Rlci0+YnVpbGRlci5sb2FkZXIgKTsgIC8qIHByZXBhcmUgbG9hZGVyICovCi0KLSAgICAvKiB0aGUgc2VhYyBvcGVyYXRvciBtdXN0IG5vdCBiZSBuZXN0ZWQgKi8KLSAgICBkZWNvZGVyLT5zZWFjID0gVFJVRTsKLSAgICBlcnJvciA9IHQxX2RlY29kZXJfcGFyc2VfZ2x5cGgoIGRlY29kZXIsIChGVF9VSW50KWJjaGFyX2luZGV4ICk7Ci0gICAgZGVjb2Rlci0+c2VhYyA9IEZBTFNFOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogc2F2ZSB0aGUgbGVmdCBiZWFyaW5nIGFuZCB3aWR0aCBvZiB0aGUgYmFzZSBjaGFyYWN0ZXIgKi8KLSAgICAvKiBhcyB0aGV5IHdpbGwgYmUgZXJhc2VkIGJ5IHRoZSBuZXh0IGxvYWQuICAgICAgICAgICAgICAqLwotCi0gICAgbGVmdF9iZWFyaW5nID0gZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmc7Ci0gICAgYWR2YW5jZSAgICAgID0gZGVjb2Rlci0+YnVpbGRlci5hZHZhbmNlOwotCi0gICAgZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcueCA9IDA7Ci0gICAgZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcueSA9IDA7Ci0KLSAgICBkZWNvZGVyLT5idWlsZGVyLnBvc194ID0gYWR4IC0gYXNiOwotICAgIGRlY29kZXItPmJ1aWxkZXIucG9zX3kgPSBhZHk7Ci0KLSAgICAvKiBOb3cgbG9hZCBgYWNoYXInIG9uIHRvcCBvZiAqLwotICAgIC8qIHRoZSBiYXNlIG91dGxpbmUgICAgICAgICAgICovCi0KLSAgICAvKiB0aGUgc2VhYyBvcGVyYXRvciBtdXN0IG5vdCBiZSBuZXN0ZWQgKi8KLSAgICBkZWNvZGVyLT5zZWFjID0gVFJVRTsKLSAgICBlcnJvciA9IHQxX2RlY29kZXJfcGFyc2VfZ2x5cGgoIGRlY29kZXIsIChGVF9VSW50KWFjaGFyX2luZGV4ICk7Ci0gICAgZGVjb2Rlci0+c2VhYyA9IEZBTFNFOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogcmVzdG9yZSB0aGUgbGVmdCBzaWRlIGJlYXJpbmcgYW5kICAgKi8KLSAgICAvKiBhZHZhbmNlIHdpZHRoIG9mIHRoZSBiYXNlIGNoYXJhY3RlciAqLwotCi0gICAgZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcgPSBsZWZ0X2JlYXJpbmc7Ci0gICAgZGVjb2Rlci0+YnVpbGRlci5hZHZhbmNlICAgICAgPSBhZHZhbmNlOwotCi0gICAgZGVjb2Rlci0+YnVpbGRlci5wb3NfeCA9IDA7Ci0gICAgZGVjb2Rlci0+YnVpbGRlci5wb3NfeSA9IDA7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBhcnNlcyBhIGdpdmVuIFR5cGUgMSBjaGFyc3RyaW5ncyBwcm9ncmFtLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlY29kZXIgICAgICAgICA6OiBUaGUgY3VycmVudCBUeXBlIDEgZGVjb2Rlci4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY2hhcnN0cmluZ19iYXNlIDo6IFRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNoYXJzdHJpbmcgc3RyZWFtLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjaGFyc3RyaW5nX2xlbiAgOjogVGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgY2hhcnN0cmluZyBzdHJlYW0uICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzKCBUMV9EZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICBjaGFyc3RyaW5nX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGNoYXJzdHJpbmdfbGVuICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3I7Ci0gICAgVDFfRGVjb2Rlcl9ab25lICB6b25lOwotICAgIEZUX0J5dGUqICAgICAgICAgaXA7Ci0gICAgRlRfQnl0ZSogICAgICAgICBsaW1pdDsKLSAgICBUMV9CdWlsZGVyICAgICAgIGJ1aWxkZXIgPSAmZGVjb2Rlci0+YnVpbGRlcjsKLSAgICBGVF9Qb3MgICAgICAgICAgIHgsIHksIG9yaWdfeCwgb3JpZ195OwotICAgIEZUX0ludCAgICAgICAgICAga25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgICA9IDA7Ci0gICAgRlRfSW50ICAgICAgICAgICB1bmtub3duX290aGVyc3Vicl9yZXN1bHRfY250ID0gMDsKLSAgICBGVF9Cb29sICAgICAgICAgIGxhcmdlX2ludDsKLSAgICBGVF9GaXhlZCAgICAgICAgIHNlZWQ7Ci0KLSAgICBUMV9IaW50c19GdW5jcyAgIGhpbnRlcjsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgRlRfQm9vbCAgICAgICAgICBib2wgPSBUUlVFOwotI2VuZGlmCi0KLQotICAgIC8qIGNvbXB1dGUgcmFuZG9tIHNlZWQgZnJvbSBzdGFjayBhZGRyZXNzIG9mIHBhcmFtZXRlciAqLwotICAgIHNlZWQgPSAoRlRfRml4ZWQpKCAoIChGVF9PZmZzZXQpKGNoYXIqKSZzZWVkICAgICAgICAgICAgXgotICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9PZmZzZXQpKGNoYXIqKSZkZWNvZGVyICAgICAgICAgXgotICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9PZmZzZXQpKGNoYXIqKSZjaGFyc3RyaW5nX2Jhc2UgKSAmCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxPTkdfTUFYICAgICAgICAgICAgICAgICAgICAgICAgICk7Ci0gICAgc2VlZCA9ICggc2VlZCBeICggc2VlZCA+PiAxMCApIF4gKCBzZWVkID4+IDIwICkgKSAmIDB4RkZGRkw7Ci0gICAgaWYgKCBzZWVkID09IDAgKQotICAgICAgc2VlZCA9IDB4NzM4NDsKLQotICAgIC8qIEZpcnN0IG9mIGFsbCwgaW5pdGlhbGl6ZSB0aGUgZGVjb2RlciAqLwotICAgIGRlY29kZXItPnRvcCAgPSBkZWNvZGVyLT5zdGFjazsKLSAgICBkZWNvZGVyLT56b25lID0gZGVjb2Rlci0+em9uZXM7Ci0gICAgem9uZSAgICAgICAgICA9IGRlY29kZXItPnpvbmVzOwotCi0gICAgYnVpbGRlci0+cGFyc2Vfc3RhdGUgPSBUMV9QYXJzZV9TdGFydDsKLQotICAgIGhpbnRlciA9IChUMV9IaW50c19GdW5jcylidWlsZGVyLT5oaW50c19mdW5jczsKLQotICAgIC8qIGEgZm9udCB0aGF0IHJlYWRzIEJ1aWxkQ2hhckFycmF5IHdpdGhvdXQgc2V0dGluZyAqLwotICAgIC8qIGl0cyB2YWx1ZXMgZmlyc3QgaXMgYnVnZ3ksIGJ1dCAuLi4gICAgICAgICAgICAgICAqLwotICAgIEZUX0FTU0VSVCggKCBkZWNvZGVyLT5sZW5fYnVpbGRjaGFyID09IDAgKSA9PQotICAgICAgICAgICAgICAgKCBkZWNvZGVyLT5idWlsZGNoYXIgPT0gTlVMTCApICApOwotCi0gICAgaWYgKCBkZWNvZGVyLT5idWlsZGNoYXIgJiYgZGVjb2Rlci0+bGVuX2J1aWxkY2hhciA+IDAgKQotICAgICAgZnRfbWVtc2V0KCAmZGVjb2Rlci0+YnVpbGRjaGFyWzBdLAotICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICBzaXplb2YgKCBkZWNvZGVyLT5idWlsZGNoYXJbMF0gKSAqIGRlY29kZXItPmxlbl9idWlsZGNoYXIgKTsKLQotICAgIEZUX1RSQUNFNCgoICJcbiIKLSAgICAgICAgICAgICAgICAiU3RhcnQgY2hhcnN0cmluZ1xuIiApKTsKLQotICAgIHpvbmUtPmJhc2UgICAgICAgICAgID0gY2hhcnN0cmluZ19iYXNlOwotICAgIGxpbWl0ID0gem9uZS0+bGltaXQgID0gY2hhcnN0cmluZ19iYXNlICsgY2hhcnN0cmluZ19sZW47Ci0gICAgaXAgICAgPSB6b25lLT5jdXJzb3IgPSB6b25lLT5iYXNlOwotCi0gICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLSAgICB4ID0gb3JpZ194ID0gYnVpbGRlci0+cG9zX3g7Ci0gICAgeSA9IG9yaWdfeSA9IGJ1aWxkZXItPnBvc195OwotCi0gICAgLyogYmVnaW4gaGludHMgcmVjb3JkaW5nIHNlc3Npb24sIGlmIGFueSAqLwotICAgIGlmICggaGludGVyICkKLSAgICAgIGhpbnRlci0+b3BlbiggaGludGVyLT5oaW50cyApOwotCi0gICAgbGFyZ2VfaW50ID0gRkFMU0U7Ci0KLSAgICAvKiBub3csIGV4ZWN1dGUgbG9vcCAqLwotICAgIHdoaWxlICggaXAgPCBsaW1pdCApCi0gICAgewotICAgICAgRlRfTG9uZyogICAgIHRvcCAgID0gZGVjb2Rlci0+dG9wOwotICAgICAgVDFfT3BlcmF0b3IgIG9wICAgID0gb3Bfbm9uZTsKLSAgICAgIEZUX0ludDMyICAgICB2YWx1ZSA9IDA7Ci0KLQotICAgICAgRlRfQVNTRVJUKCBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9PSAwICAgfHwKLSAgICAgICAgICAgICAgICAgdW5rbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9PSAwICk7Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgaWYgKCBib2wgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTUoKCAiICglZCkiLCBkZWNvZGVyLT50b3AgLSBkZWNvZGVyLT5zdGFjayApKTsKLSAgICAgICAgYm9sID0gRkFMU0U7Ci0gICAgICB9Ci0jZW5kaWYKLQotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBEZWNvZGUgb3BlcmF0b3Igb3Igb3BlcmFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIC8qIGZpcnN0IG9mIGFsbCwgZGVjb21wcmVzcyBvcGVyYXRvciBvciB2YWx1ZSAqLwotICAgICAgc3dpdGNoICggKmlwKysgKQotICAgICAgewotICAgICAgY2FzZSAxOgotICAgICAgICBvcCA9IG9wX2hzdGVtOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAzOgotICAgICAgICBvcCA9IG9wX3ZzdGVtOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNDoKLSAgICAgICAgb3AgPSBvcF92bW92ZXRvOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNToKLSAgICAgICAgb3AgPSBvcF9ybGluZXRvOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNjoKLSAgICAgICAgb3AgPSBvcF9obGluZXRvOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNzoKLSAgICAgICAgb3AgPSBvcF92bGluZXRvOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgODoKLSAgICAgICAgb3AgPSBvcF9ycmN1cnZldG87Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA5OgotICAgICAgICBvcCA9IG9wX2Nsb3NlcGF0aDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwOgotICAgICAgICBvcCA9IG9wX2NhbGxzdWJyOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTE6Ci0gICAgICAgIG9wID0gb3BfcmV0dXJuOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAxMzoKLSAgICAgICAgb3AgPSBvcF9oc2J3OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTQ6Ci0gICAgICAgIG9wID0gb3BfZW5kY2hhcjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMTU6ICAgICAgICAgIC8qIHVuZG9jdW1lbnRlZCwgb2Jzb2xldGUgb3BlcmF0b3IgKi8KLSAgICAgICAgb3AgPSBvcF91bmtub3duMTU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDIxOgotICAgICAgICBvcCA9IG9wX3Jtb3ZldG87Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyMjoKLSAgICAgICAgb3AgPSBvcF9obW92ZXRvOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAzMDoKLSAgICAgICAgb3AgPSBvcF92aGN1cnZldG87Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAzMToKLSAgICAgICAgb3AgPSBvcF9odmN1cnZldG87Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDEyOgotICAgICAgICBpZiAoIGlwID4gbGltaXQgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgZXNjYXBlICgxMitFT0YpXG4iICkpOwotICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoICggKmlwKysgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgMDoKLSAgICAgICAgICBvcCA9IG9wX2RvdHNlY3Rpb247Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICBvcCA9IG9wX3ZzdGVtMzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgIG9wID0gb3BfaHN0ZW0zOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgb3AgPSBvcF9zZWFjOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgb3AgPSBvcF9zYnc7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgb3AgPSBvcF9kaXY7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgb3AgPSBvcF9jYWxsb3RoZXJzdWJyOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDE3OgotICAgICAgICAgIG9wID0gb3BfcG9wOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIDMzOgotICAgICAgICAgIG9wID0gb3Bfc2V0Y3VycmVudHBvaW50OwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgZXNjYXBlICgxMislZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICBpcFstMV0gKSk7Ci0gICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMjU1OiAgICAvKiBmb3VyIGJ5dGVzIGludGVnZXIgKi8KLSAgICAgICAgaWYgKCBpcCArIDQgPiBsaW1pdCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICIgdW5leHBlY3RlZCBFT0YgaW4gaW50ZWdlclxuIiApKTsKLSAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHZhbHVlID0gKEZUX0ludDMyKSggKCAoRlRfVUludDMyKWlwWzBdIDw8IDI0ICkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKEZUX1VJbnQzMilpcFsxXSA8PCAxNiApIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIChGVF9VSW50MzIpaXBbMl0gPDwgOCAgKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludDMyKWlwWzNdICAgICAgICAgKTsKLSAgICAgICAgaXAgKz0gNDsKLQotICAgICAgICAvKiBBY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24sIHZhbHVlcyA+IDMyMDAwIG9yIDwgLTMyMDAwIG11c3QgKi8KLSAgICAgICAgLyogYmUgZm9sbG93ZWQgYnkgYSBgZGl2JyBvcGVyYXRvciB0byBtYWtlIHRoZSByZXN1bHQgYmUgaW4gdGhlICAgICovCi0gICAgICAgIC8qIHJhbmdlIFstMzIwMDA7MzIwMDBdLiAgV2UgZXhwZWN0IHRoYXQgdGhlIHNlY29uZCBhcmd1bWVudCBvZiAgICAqLwotICAgICAgICAvKiBgZGl2JyBpcyBub3QgYSBsYXJnZSBudW1iZXIuICBBZGRpdGlvbmFsbHksIHdlIGRvbid0IGhhbmRsZSAgICAgKi8KLSAgICAgICAgLyogc3R1ZmYgbGlrZSBgPGxhcmdlMT4gPGxhcmdlMj4gPG51bT4gZGl2IDxudW0+IGRpdicgb3IgICAgICAgICAgICovCi0gICAgICAgIC8qIDxsYXJnZTE+IDxsYXJnZTI+IDxudW0+IGRpdiBkaXYnLiAgVGhpcyBpcyBwcm9iYWJseSBub3QgYWxsb3dlZCAqLwotICAgICAgICAvKiBhbnl3YXkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCB2YWx1ZSA+IDMyMDAwIHx8IHZhbHVlIDwgLTMyMDAwICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggbGFyZ2VfaW50ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICAgIiBubyBgZGl2JyBhZnRlciBsYXJnZSBpbnRlZ2VyXG4iICkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBsYXJnZV9pbnQgPSBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmICggIWxhcmdlX2ludCApCi0gICAgICAgICAgICB2YWx1ZSA9IChGVF9JbnQzMikoIChGVF9VSW50MzIpdmFsdWUgPDwgMTYgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBpZiAoIGlwWy0xXSA+PSAzMiApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGlwWy0xXSA8IDI0NyApCi0gICAgICAgICAgICB2YWx1ZSA9IChGVF9JbnQzMilpcFstMV0gLSAxMzk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggKytpcCA+IGxpbWl0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiB1bmV4cGVjdGVkIEVPRiBpbiBpbnRlZ2VyXG4iICkpOwotICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBpcFstMl0gPCAyNTEgKQotICAgICAgICAgICAgICB2YWx1ZSA9ICAgICggKCBpcFstMl0gLSAyNDcgKSAqIDI1NiApICsgaXBbLTFdICsgMTA4OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICB2YWx1ZSA9IC0oICggKCBpcFstMl0gLSAyNTEgKSAqIDI1NiApICsgaXBbLTFdICsgMTA4ICk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCAhbGFyZ2VfaW50ICkKLSAgICAgICAgICAgIHZhbHVlID0gKEZUX0ludDMyKSggKEZUX1VJbnQzMil2YWx1ZSA8PCAxNiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIEZUX0VSUk9SKCggInQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IgotICAgICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIGJ5dGUgKCVkKVxuIiwgaXBbLTFdICkpOwotICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggdW5rbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA+IDAgKQotICAgICAgewotICAgICAgICBzd2l0Y2ggKCBvcCApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBvcF9jYWxsc3VicjoKLSAgICAgICAgY2FzZSBvcF9yZXR1cm46Ci0gICAgICAgIGNhc2Ugb3Bfbm9uZToKLSAgICAgICAgY2FzZSBvcF9wb3A6Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAvKiBhbGwgb3BlcmFuZHMgaGF2ZSBiZWVuIHRyYW5zZmVycmVkIGJ5IHByZXZpb3VzIHBvcHMgKi8KLSAgICAgICAgICB1bmtub3duX290aGVyc3Vicl9yZXN1bHRfY250ID0gMDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoIGxhcmdlX2ludCAmJiAhKCBvcCA9PSBvcF9ub25lIHx8IG9wID09IG9wX2RpdiApICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgICAgIiBubyBgZGl2JyBhZnRlciBsYXJnZSBpbnRlZ2VyXG4iICkpOwotCi0gICAgICAgIGxhcmdlX2ludCA9IEZBTFNFOwotICAgICAgfQotCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICBQdXNoIHZhbHVlIG9uIHN0YWNrLCBvciBwcm9jZXNzIG9wZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggb3AgPT0gb3Bfbm9uZSApCi0gICAgICB7Ci0gICAgICAgIGlmICggdG9wIC0gZGVjb2Rlci0+c3RhY2sgPj0gVDFfTUFYX0NIQVJTVFJJTkdTX09QRVJBTkRTICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0VSUk9SKCggInQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IHN0YWNrIG92ZXJmbG93XG4iICkpOwotICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICB9Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICBpZiAoIGxhcmdlX2ludCApCi0gICAgICAgICAgRlRfVFJBQ0U0KCggIiAlbGQiLCB2YWx1ZSApKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIEZUX1RSQUNFNCgoICIgJWxkIiwgRml4MkludCggdmFsdWUgKSApKTsKLSNlbmRpZgotCi0gICAgICAgICp0b3ArKyAgICAgICA9IHZhbHVlOwotICAgICAgICBkZWNvZGVyLT50b3AgPSB0b3A7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggb3AgPT0gb3BfY2FsbG90aGVyc3ViciApICAvKiBjYWxsb3RoZXJzdWJyICovCi0gICAgICB7Ci0gICAgICAgIEZUX0ludCAgc3Vicl9ubzsKLSAgICAgICAgRlRfSW50ICBhcmdfY250OwotCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICBGVF9UUkFDRTQoKCAiIGNhbGxvdGhlcnN1YnJcbiIgKSk7Ci0gICAgICAgIGJvbCA9IFRSVUU7Ci0jZW5kaWYKLQotICAgICAgICBpZiAoIHRvcCAtIGRlY29kZXItPnN0YWNrIDwgMiApCi0gICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7Ci0KLSAgICAgICAgdG9wIC09IDI7Ci0KLSAgICAgICAgc3Vicl9ubyA9IEZpeDJJbnQoIHRvcFsxXSApOwotICAgICAgICBhcmdfY250ID0gRml4MkludCggdG9wWzBdICk7Ci0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIHJlbW92ZSBhbGwgb3BlcmFuZHMgdG8gY2FsbG90aGVyc3ViciBmcm9tIHRoZSBzdGFjayAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBmb3IgaGFuZGxlZCBvdGhlcnN1YnJzLCB3aGVyZSB3ZSBrbm93IHRoZSBudW1iZXIgb2YgICAgICovCi0gICAgICAgIC8qIGFyZ3VtZW50cywgd2UgaW5jcmVhc2UgdGhlIHN0YWNrIGJ5IHRoZSB2YWx1ZSBvZiAgICAgICAgKi8KLSAgICAgICAgLyoga25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIGZvciB1bmhhbmRsZWQgb3RoZXJzdWJycyB0aGUgZm9sbG93aW5nIHBvcHMgYWRqdXN0IHRoZSAgKi8KLSAgICAgICAgLyogc3RhY2sgcG9pbnRlciBhcyBuZWNlc3NhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgIGlmICggYXJnX2NudCA+IHRvcCAtIGRlY29kZXItPnN0YWNrICkKLSAgICAgICAgICBnb3RvIFN0YWNrX1VuZGVyZmxvdzsKLQotICAgICAgICB0b3AgLT0gYXJnX2NudDsKLQotICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCAgID0gMDsKLSAgICAgICAgdW5rbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IDA7Ci0KLSAgICAgICAgLyogWFhYIFRPRE86IFRoZSBjaGVja3MgdG8gYGFyZ19jb3VudCA9PSA8d2hhdGV2ZXI+JyAgICAgICAqLwotICAgICAgICAvKiBtaWdodCBub3QgYmUgY29ycmVjdDsgYW4gb3RoZXJzdWJyIGV4cGVjdHMgYSBjZXJ0YWluICAgICovCi0gICAgICAgIC8qIG51bWJlciBvZiBvcGVyYW5kcyBvbiB0aGUgUG9zdFNjcmlwdCBzdGFjayAoYXMgb3Bwb3NlZCAgKi8KLSAgICAgICAgLyogdG8gdGhlIFQxIHN0YWNrKSBidXQgaXQgZG9lc24ndCBoYXZlIHRvIHB1dCB0aGVtIHRoZXJlICAqLwotICAgICAgICAvKiBieSBpdHNlbGY7IHByZXZpb3VzIG90aGVyc3VicnMgbWlnaHQgaGF2ZSBsZWZ0IHRoZSAgICAgICovCi0gICAgICAgIC8qIG9wZXJhbmRzIHRoZXJlIGlmIHRoZXkgd2VyZSBub3QgZm9sbG93ZWQgYnkgYW4gICAgICAgICAgKi8KLSAgICAgICAgLyogYXBwcm9wcmlhdGUgbnVtYmVyIG9mIHBvcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIE9uIHRoZSBvdGhlciBoYW5kLCBBZG9iZSBSZWFkZXIgNy4wLjggZm9yIExpbnV4IGRvZXNuJ3QgKi8KLSAgICAgICAgLyogYWNjZXB0IGEgZm9udCB0aGF0IGNvbnRhaW5zIGNoYXJzdHJpbmdzIGxpa2UgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAxMDAgMjAwIDIgMjAgY2FsbG90aGVyc3ViciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgIDMwMCAxIDIwIGNhbGxvdGhlcnN1YnIgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIFBlcmhhcHMgdGhpcyBpcyB0aGUgcmVhc29uIHdoeSBCdWlsZENoYXJBcnJheSBleGlzdHMuICAgKi8KLQotICAgICAgICBzd2l0Y2ggKCBzdWJyX25vICkKLSAgICAgICAgewotICAgICAgICBjYXNlIDA6ICAgICAgICAgICAgICAgICAgICAgLyogZW5kIGZsZXggZmVhdHVyZSAqLwotICAgICAgICAgIGlmICggYXJnX2NudCAhPSAzICkKLSAgICAgICAgICAgIGdvdG8gVW5leHBlY3RlZF9PdGhlclN1YnI7Ci0KLSAgICAgICAgICBpZiAoIGRlY29kZXItPmZsZXhfc3RhdGUgICAgICAgPT0gMCB8fAotICAgICAgICAgICAgICAgZGVjb2Rlci0+bnVtX2ZsZXhfdmVjdG9ycyAhPSA3ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICAgIiB1bmV4cGVjdGVkIGZsZXggZW5kXG4iICkpOwotICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogdGhlIHR3byBgcmVzdWx0cycgYXJlIHBvcHBlZCBieSB0aGUgZm9sbG93aW5nIHNldGN1cnJlbnRwb2ludCAqLwotICAgICAgICAgIHRvcFswXSA9IHg7Ci0gICAgICAgICAgdG9wWzFdID0geTsKLSAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IDI7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0IGZsZXggZmVhdHVyZSAqLwotICAgICAgICAgIGlmICggYXJnX2NudCAhPSAwICkKLSAgICAgICAgICAgIGdvdG8gVW5leHBlY3RlZF9PdGhlclN1YnI7Ci0KLSAgICAgICAgICBkZWNvZGVyLT5mbGV4X3N0YXRlICAgICAgICA9IDE7Ci0gICAgICAgICAgZGVjb2Rlci0+bnVtX2ZsZXhfdmVjdG9ycyAgPSAwOwotICAgICAgICAgIGlmICggKCBlcnJvciA9IHQxX2J1aWxkZXJfc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSApCi0gICAgICAgICAgICAgICAgICE9IEZUX0Vycl9PayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICggZXJyb3IgPSB0MV9idWlsZGVyX2NoZWNrX3BvaW50cyggYnVpbGRlciwgNiApICkKLSAgICAgICAgICAgICAgICAgIT0gRlRfRXJyX09rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgIC8qIGFkZCBmbGV4IHZlY3RvcnMgKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIGlkeDsKLQotCi0gICAgICAgICAgICBpZiAoIGFyZ19jbnQgIT0gMCApCi0gICAgICAgICAgICAgIGdvdG8gVW5leHBlY3RlZF9PdGhlclN1YnI7Ci0KLSAgICAgICAgICAgIGlmICggZGVjb2Rlci0+ZmxleF9zdGF0ZSA9PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiBtaXNzaW5nIGZsZXggc3RhcnRcbiIgKSk7Ci0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBub3RlIHRoYXQgd2Ugc2hvdWxkIG5vdCBhZGQgYSBwb2ludCBmb3IgaW5kZXggMDsgKi8KLSAgICAgICAgICAgIC8qIHRoaXMgd2lsbCBtb3ZlIG91ciBjdXJyZW50IHBvc2l0aW9uIHRvIHRoZSBmbGV4ICAqLwotICAgICAgICAgICAgLyogcG9pbnQgd2l0aG91dCBhZGRpbmcgYW55IHBvaW50IHRvIHRoZSBvdXRsaW5lICAgICovCi0gICAgICAgICAgICBpZHggPSBkZWNvZGVyLT5udW1fZmxleF92ZWN0b3JzKys7Ci0gICAgICAgICAgICBpZiAoIGlkeCA+IDAgJiYgaWR4IDwgNyApCi0gICAgICAgICAgICAgIHQxX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSkoIGlkeCA9PSAzIHx8IGlkeCA9PSA2ICkgKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAgICAgIC8qIGNoYW5nZSBoaW50cyAqLwotICAgICAgICAgIGlmICggYXJnX2NudCAhPSAxICkKLSAgICAgICAgICAgIGdvdG8gVW5leHBlY3RlZF9PdGhlclN1YnI7Ci0KLSAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IDE7Ci0KLSAgICAgICAgICBpZiAoIGhpbnRlciApCi0gICAgICAgICAgICBoaW50ZXItPnJlc2V0KCBoaW50ZXItPmhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpYnVpbGRlci0+Y3VycmVudC0+bl9wb2ludHMgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDEyOgotICAgICAgICBjYXNlIDEzOgotICAgICAgICAgIC8qIGNvdW50ZXIgY29udHJvbCBoaW50cywgY2xlYXIgc3RhY2sgKi8KLSAgICAgICAgICB0b3AgPSBkZWNvZGVyLT5zdGFjazsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE0OgotICAgICAgICBjYXNlIDE1OgotICAgICAgICBjYXNlIDE2OgotICAgICAgICBjYXNlIDE3OgotICAgICAgICBjYXNlIDE4OiAgICAgICAgICAgICAgICAgICAgLyogbXVsdGlwbGUgbWFzdGVycyAqLwotICAgICAgICAgIHsKLSAgICAgICAgICAgIFBTX0JsZW5kICBibGVuZCA9IGRlY29kZXItPmJsZW5kOwotICAgICAgICAgICAgRlRfVUludCAgIG51bV9wb2ludHMsIG5uLCBtbTsKLSAgICAgICAgICAgIEZUX0xvbmcqICBkZWx0YTsKLSAgICAgICAgICAgIEZUX0xvbmcqICB2YWx1ZXM7Ci0KLQotICAgICAgICAgICAgaWYgKCAhYmxlbmQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiIHVuZXhwZWN0ZWQgbXVsdGlwbGUgbWFzdGVycyBvcGVyYXRvclxuIiApKTsKLSAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG51bV9wb2ludHMgPSAoRlRfVUludClzdWJyX25vIC0gMTMgKyAoIHN1YnJfbm8gPT0gMTggKTsKLSAgICAgICAgICAgIGlmICggYXJnX2NudCAhPSAoRlRfSW50KSggbnVtX3BvaW50cyAqIGJsZW5kLT5udW1fZGVzaWducyApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiBpbmNvcnJlY3QgbnVtYmVyIG9mIG11bHRpcGxlIG1hc3RlcnMgYXJndW1lbnRzXG4iICkpOwotICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogV2Ugd2FudCB0byBjb21wdXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAvKiAgIGEwKncwICsgYTEqdzEgKyAuLi4gKyBhayp3ayAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qIGJ1dCB3ZSBvbmx5IGhhdmUgYTAsIGExLWEwLCBhMi1hMCwgLi4uLCBhay1hMC4gICAgICAgICovCi0gICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogSG93ZXZlciwgZ2l2ZW4gdGhhdCB3MCArIHcxICsgLi4uICsgd2sgPT0gMSwgd2UgY2FuICAgKi8KLSAgICAgICAgICAgIC8qIHJld3JpdGUgaXQgZWFzaWx5IGFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogICBhMCArIChhMS1hMCkqdzEgKyAoYTItYTApKncyICsgLi4uICsgKGFrLWEwKSp3ayAgICAgKi8KLSAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAvKiB3aGVyZSBrID09IG51bV9kZXNpZ25zLTEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qIEkgZ3Vlc3MgdGhhdCdzIHdoeSBpdCdzIHdyaXR0ZW4gaW4gdGhpcyBgY29tcGFjdCcgICAgICovCi0gICAgICAgICAgICAvKiBmb3JtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGRlbHRhICA9IHRvcCArIG51bV9wb2ludHM7Ci0gICAgICAgICAgICB2YWx1ZXMgPSB0b3A7Ci0gICAgICAgICAgICBmb3IgKCBubiA9IDA7IG5uIDwgbnVtX3BvaW50czsgbm4rKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0xvbmcgIHRtcCA9IHZhbHVlc1swXTsKLQotCi0gICAgICAgICAgICAgIGZvciAoIG1tID0gMTsgbW0gPCBibGVuZC0+bnVtX2Rlc2lnbnM7IG1tKysgKQotICAgICAgICAgICAgICAgIHRtcCArPSBGVF9NdWxGaXgoICpkZWx0YSsrLCBibGVuZC0+d2VpZ2h0X3ZlY3RvclttbV0gKTsKLQotICAgICAgICAgICAgICAqdmFsdWVzKysgPSB0bXA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGtub3duX290aGVyc3Vicl9yZXN1bHRfY250ID0gKEZUX0ludCludW1fcG9pbnRzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotCi0gICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgLyogPGlkeD4gMSAxOSBjYWxsb3RoZXJzdWJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qID0+IHJlcGxhY2UgZWxlbWVudHMgc3RhcnRpbmcgZnJvbSBpbmRleCBjdmkoIDxpZHg+ICkgKi8KLSAgICAgICAgICAvKiAgICBvZiBCdWlsZENoYXJBcnJheSB3aXRoIFdlaWdodFZlY3RvciAgICAgICAgICAgICAgICovCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfSW50ICAgIGlkeDsKLSAgICAgICAgICAgIFBTX0JsZW5kICBibGVuZCA9IGRlY29kZXItPmJsZW5kOwotCi0KLSAgICAgICAgICAgIGlmICggYXJnX2NudCAhPSAxIHx8IGJsZW5kID09IE5VTEwgKQotICAgICAgICAgICAgICBnb3RvIFVuZXhwZWN0ZWRfT3RoZXJTdWJyOwotCi0gICAgICAgICAgICBpZHggPSBGaXgySW50KCB0b3BbMF0gKTsKLQotICAgICAgICAgICAgaWYgKCBpZHggPCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgIChGVF9VSW50KWlkeCArIGJsZW5kLT5udW1fZGVzaWducyA+IGRlY29kZXItPmxlbl9idWlsZGNoYXIgKQotICAgICAgICAgICAgICBnb3RvIFVuZXhwZWN0ZWRfT3RoZXJTdWJyOwotCi0gICAgICAgICAgICBmdF9tZW1jcHkoICZkZWNvZGVyLT5idWlsZGNoYXJbaWR4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgYmxlbmQtPndlaWdodF92ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgIGJsZW5kLT5udW1fZGVzaWducyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggYmxlbmQtPndlaWdodF92ZWN0b3JbMF0gKSApOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDIwOgotICAgICAgICAgIC8qIDxhcmcxPiA8YXJnMj4gMiAyMCBjYWxsb3RoZXJzdWJyIHBvcCAgICovCi0gICAgICAgICAgLyogPT0+IHB1c2ggPGFyZzE+ICsgPGFyZzI+IG9udG8gVDEgc3RhY2sgKi8KLSAgICAgICAgICBpZiAoIGFyZ19jbnQgIT0gMiApCi0gICAgICAgICAgICBnb3RvIFVuZXhwZWN0ZWRfT3RoZXJTdWJyOwotCi0gICAgICAgICAgdG9wWzBdICs9IHRvcFsxXTsgLyogWFhYIChvdmVyfHVuZGVyKWZsb3cgKi8KLQotICAgICAgICAgIGtub3duX290aGVyc3Vicl9yZXN1bHRfY250ID0gMTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDIxOgotICAgICAgICAgIC8qIDxhcmcxPiA8YXJnMj4gMiAyMSBjYWxsb3RoZXJzdWJyIHBvcCAgICovCi0gICAgICAgICAgLyogPT0+IHB1c2ggPGFyZzE+IC0gPGFyZzI+IG9udG8gVDEgc3RhY2sgKi8KLSAgICAgICAgICBpZiAoIGFyZ19jbnQgIT0gMiApCi0gICAgICAgICAgICBnb3RvIFVuZXhwZWN0ZWRfT3RoZXJTdWJyOwotCi0gICAgICAgICAgdG9wWzBdIC09IHRvcFsxXTsgLyogWFhYIChvdmVyfHVuZGVyKWZsb3cgKi8KLQotICAgICAgICAgIGtub3duX290aGVyc3Vicl9yZXN1bHRfY250ID0gMTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDIyOgotICAgICAgICAgIC8qIDxhcmcxPiA8YXJnMj4gMiAyMiBjYWxsb3RoZXJzdWJyIHBvcCAgICovCi0gICAgICAgICAgLyogPT0+IHB1c2ggPGFyZzE+ICogPGFyZzI+IG9udG8gVDEgc3RhY2sgKi8KLSAgICAgICAgICBpZiAoIGFyZ19jbnQgIT0gMiApCi0gICAgICAgICAgICBnb3RvIFVuZXhwZWN0ZWRfT3RoZXJTdWJyOwotCi0gICAgICAgICAgdG9wWzBdID0gRlRfTXVsRml4KCB0b3BbMF0sIHRvcFsxXSApOwotCi0gICAgICAgICAga25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgPSAxOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMjM6Ci0gICAgICAgICAgLyogPGFyZzE+IDxhcmcyPiAyIDIzIGNhbGxvdGhlcnN1YnIgcG9wICAgKi8KLSAgICAgICAgICAvKiA9PT4gcHVzaCA8YXJnMT4gLyA8YXJnMj4gb250byBUMSBzdGFjayAqLwotICAgICAgICAgIGlmICggYXJnX2NudCAhPSAyIHx8IHRvcFsxXSA9PSAwICkKLSAgICAgICAgICAgIGdvdG8gVW5leHBlY3RlZF9PdGhlclN1YnI7Ci0KLSAgICAgICAgICB0b3BbMF0gPSBGVF9EaXZGaXgoIHRvcFswXSwgdG9wWzFdICk7Ci0KLSAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IDE7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyNDoKLSAgICAgICAgICAvKiA8dmFsPiA8aWR4PiAyIDI0IGNhbGxvdGhlcnN1YnIgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qID09PiBzZXQgQnVpbGRDaGFyQXJyYXlbY3ZpKCA8aWR4PiApXSA9IDx2YWw+ICovCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfSW50ICAgIGlkeDsKLSAgICAgICAgICAgIFBTX0JsZW5kICBibGVuZCA9IGRlY29kZXItPmJsZW5kOwotCi0KLSAgICAgICAgICAgIGlmICggYXJnX2NudCAhPSAyIHx8IGJsZW5kID09IE5VTEwgKQotICAgICAgICAgICAgICBnb3RvIFVuZXhwZWN0ZWRfT3RoZXJTdWJyOwotCi0gICAgICAgICAgICBpZHggPSBGaXgySW50KCB0b3BbMV0gKTsKLQotICAgICAgICAgICAgaWYgKCBpZHggPCAwIHx8IChGVF9VSW50KSBpZHggPj0gZGVjb2Rlci0+bGVuX2J1aWxkY2hhciApCi0gICAgICAgICAgICAgIGdvdG8gVW5leHBlY3RlZF9PdGhlclN1YnI7Ci0KLSAgICAgICAgICAgIGRlY29kZXItPmJ1aWxkY2hhcltpZHhdID0gdG9wWzBdOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDI1OgotICAgICAgICAgIC8qIDxpZHg+IDEgMjUgY2FsbG90aGVyc3ViciBwb3AgICAgICAgICovCi0gICAgICAgICAgLyogPT0+IHB1c2ggQnVpbGRDaGFyQXJyYXlbY3ZpKCBpZHggKV0gKi8KLSAgICAgICAgICAvKiAgICAgb250byBUMSBzdGFjayAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0ludCAgICBpZHg7Ci0gICAgICAgICAgICBQU19CbGVuZCAgYmxlbmQgPSBkZWNvZGVyLT5ibGVuZDsKLQotCi0gICAgICAgICAgICBpZiAoIGFyZ19jbnQgIT0gMSB8fCBibGVuZCA9PSBOVUxMICkKLSAgICAgICAgICAgICAgZ290byBVbmV4cGVjdGVkX090aGVyU3VicjsKLQotICAgICAgICAgICAgaWR4ID0gRml4MkludCggdG9wWzBdICk7Ci0KLSAgICAgICAgICAgIGlmICggaWR4IDwgMCB8fCAoRlRfVUludCkgaWR4ID49IGRlY29kZXItPmxlbl9idWlsZGNoYXIgKQotICAgICAgICAgICAgICBnb3RvIFVuZXhwZWN0ZWRfT3RoZXJTdWJyOwotCi0gICAgICAgICAgICB0b3BbMF0gPSBkZWNvZGVyLT5idWlsZGNoYXJbaWR4XTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IDE7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSNpZiAwCi0gICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgLyogPHZhbD4gbWFyayA8aWR4PiA9PT4gc2V0IEJ1aWxkQ2hhckFycmF5W2N2aSggPGlkeD4gKV0gPSA8dmFsPiwgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICBsZWF2ZSBtYXJrIG9uIFQxIHN0YWNrICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIDx2YWw+IDxpZHg+ICAgICAgPT0+IHNldCBCdWlsZENoYXJBcnJheVtjdmkoIDxpZHg+ICldID0gPHZhbD4gICovCi0gICAgICAgICAgWFhYIHdoaWNoIHJvdXRpbmUgaGFzIGxlZnQgaXRzIG1hcmsgb24gdGhlIChQb3N0U2NyaXB0KSBzdGFjaz87Ci0gICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLQotICAgICAgICBjYXNlIDI3OgotICAgICAgICAgIC8qIDxyZXMxPiA8cmVzMj4gPHZhbDE+IDx2YWwyPiA0IDI3IGNhbGxvdGhlcnN1YnIgcG9wICovCi0gICAgICAgICAgLyogPT0+IHB1c2ggPHJlczE+IG9udG8gVDEgc3RhY2sgaWYgPHZhbDE+IDw9IDx2YWwyPiwgKi8KLSAgICAgICAgICAvKiAgICAgb3RoZXJ3aXNlIHB1c2ggPHJlczI+ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGlmICggYXJnX2NudCAhPSA0ICkKLSAgICAgICAgICAgIGdvdG8gVW5leHBlY3RlZF9PdGhlclN1YnI7Ci0KLSAgICAgICAgICBpZiAoIHRvcFsyXSA+IHRvcFszXSApCi0gICAgICAgICAgICB0b3BbMF0gPSB0b3BbMV07Ci0KLSAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCA9IDE7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAyODoKLSAgICAgICAgICAvKiAwIDI4IGNhbGxvdGhlcnN1YnIgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogPT4gcHVzaCByYW5kb20gdmFsdWUgZnJvbSBpbnRlcnZhbCBbMCwgMSkgb250byBzdGFjayAqLwotICAgICAgICAgIGlmICggYXJnX2NudCAhPSAwICkKLSAgICAgICAgICAgIGdvdG8gVW5leHBlY3RlZF9PdGhlclN1YnI7Ci0KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9GaXhlZCAgUmFuZDsKLQotCi0gICAgICAgICAgICBSYW5kID0gc2VlZDsKLSAgICAgICAgICAgIGlmICggUmFuZCA+PSAweDgwMDBMICkKLSAgICAgICAgICAgICAgUmFuZCsrOwotCi0gICAgICAgICAgICB0b3BbMF0gPSBSYW5kOwotCi0gICAgICAgICAgICBzZWVkID0gRlRfTXVsRml4KCBzZWVkLCAweDEwMDAwTCAtIHNlZWQgKTsKLSAgICAgICAgICAgIGlmICggc2VlZCA9PSAwICkKLSAgICAgICAgICAgICAgc2VlZCArPSAweDI4NzM7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAga25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgPSAxOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgaWYgKCBhcmdfY250ID49IDAgJiYgc3Vicl9ubyA+PSAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICAgIiB1bmtub3duIG90aGVyc3ViciBbJWQgJWRdLCB3aXNoIG1lIGx1Y2tcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgIGFyZ19jbnQsIHN1YnJfbm8gKSk7Ci0gICAgICAgICAgICB1bmtub3duX290aGVyc3Vicl9yZXN1bHRfY250ID0gYXJnX2NudDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KLQotICAgICAgICBVbmV4cGVjdGVkX090aGVyU3VicjoKLSAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBvdGhlcnN1YnIgWyVkICVkXVxuIiwgYXJnX2NudCwgc3Vicl9ubyApKTsKLSAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHRvcCArPSBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudDsKLQotICAgICAgICBkZWNvZGVyLT50b3AgPSB0b3A7Ci0gICAgICB9Ci0gICAgICBlbHNlICAvKiBnZW5lcmFsIG9wZXJhdG9yICovCi0gICAgICB7Ci0gICAgICAgIEZUX0ludCAgbnVtX2FyZ3MgPSB0MV9hcmdzX2NvdW50W29wXTsKLQotCi0gICAgICAgIEZUX0FTU0VSVCggbnVtX2FyZ3MgPj0gMCApOwotCi0gICAgICAgIGlmICggdG9wIC0gZGVjb2Rlci0+c3RhY2sgPCBudW1fYXJncyApCi0gICAgICAgICAgZ290byBTdGFja19VbmRlcmZsb3c7Ci0KLSAgICAgICAgLyogWFhYIE9wZXJhdG9ycyB1c3VhbGx5IHRha2UgdGhlaXIgb3BlcmFuZHMgZnJvbSB0aGUgICAgICAgICovCi0gICAgICAgIC8qICAgICBib3R0b20gb2YgdGhlIHN0YWNrLCBpLmUuLCB0aGUgb3BlcmFuZHMgYXJlICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgZGVjb2Rlci0+c3RhY2tbMF0sIC4uLiwgZGVjb2Rlci0+c3RhY2tbbnVtX2FyZ3MgLSAxXTsgKi8KLSAgICAgICAgLyogICAgIG9ubHkgZGl2LCBjYWxsc3ViciwgYW5kIGNhbGxvdGhlcnN1YnIgYXJlIGRpZmZlcmVudC4gICovCi0gICAgICAgIC8qICAgICBJbiBwcmFjdGljZSBpdCBkb2Vzbid0IG1hdHRlciAoPykuICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLQotICAgICAgICBzd2l0Y2ggKCBvcCApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBvcF9jYWxsc3VicjoKLSAgICAgICAgY2FzZSBvcF9kaXY6Ci0gICAgICAgIGNhc2Ugb3BfY2FsbG90aGVyc3VicjoKLSAgICAgICAgY2FzZSBvcF9wb3A6Ci0gICAgICAgIGNhc2Ugb3BfcmV0dXJuOgotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgaWYgKCB0b3AgLSBkZWNvZGVyLT5zdGFjayAhPSBudW1fYXJncyApCi0gICAgICAgICAgICBGVF9UUkFDRTAoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHRvbyBtdWNoIG9wZXJhbmRzIG9uIHRoZSBzdGFjayIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgKHNlZW4gJWQsIGV4cGVjdGVkICVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvcCAtIGRlY29kZXItPnN0YWNrLCBudW1fYXJncyApKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0gICAgICAgIHRvcCAtPSBudW1fYXJnczsKLQotICAgICAgICBzd2l0Y2ggKCBvcCApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBvcF9lbmRjaGFyOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgZW5kY2hhclxuIiApKTsKLQotICAgICAgICAgIHQxX2J1aWxkZXJfY2xvc2VfY29udG91ciggYnVpbGRlciApOwotCi0gICAgICAgICAgLyogY2xvc2UgaGludHMgcmVjb3JkaW5nIHNlc3Npb24gKi8KLSAgICAgICAgICBpZiAoIGhpbnRlciApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBoaW50ZXItPmNsb3NlKCBoaW50ZXItPmhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludClidWlsZGVyLT5jdXJyZW50LT5uX3BvaW50cyApICkKLSAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0KLSAgICAgICAgICAgIC8qIGFwcGx5IGhpbnRzIHRvIHRoZSBsb2FkZWQgZ2x5cGggb3V0bGluZSBub3cgKi8KLSAgICAgICAgICAgIGVycm9yID0gaGludGVyLT5hcHBseSggaGludGVyLT5oaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci0+Y3VycmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFBTSF9HbG9iYWxzKWJ1aWxkZXItPmhpbnRzX2dsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXItPmhpbnRfbW9kZSApOwotICAgICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBhZGQgY3VycmVudCBvdXRsaW5lIHRvIHRoZSBnbHlwaCBzbG90ICovCi0gICAgICAgICAgRlRfR2x5cGhMb2FkZXJfQWRkKCBidWlsZGVyLT5sb2FkZXIgKTsKLQotICAgICAgICAgIC8qIHRoZSBjb21waWxlciBzaG91bGQgb3B0aW1pemUgYXdheSB0aGlzIGVtcHR5IGxvb3AgYnV0IC4uLiAqLwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLQotICAgICAgICAgIGlmICggZGVjb2Rlci0+bGVuX2J1aWxkY2hhciA+IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgICAgICAgICAgRlRfVFJBQ0U0KCggIkJ1aWxkQ2hhckFycmF5ID0gWyAiICkpOwotCi0gICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGRlY29kZXItPmxlbl9idWlsZGNoYXI7ICsraSApCi0gICAgICAgICAgICAgIEZUX1RSQUNFNCgoICIlZCAiLCBkZWNvZGVyLT5idWlsZGNoYXJbaV0gKSk7Ci0KLSAgICAgICAgICAgIEZUX1RSQUNFNCgoICJdXG4iICkpOwotICAgICAgICAgIH0KLQotI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLSAgICAgICAgICBGVF9UUkFDRTQoKCAiXG4iICkpOwotCi0gICAgICAgICAgLyogcmV0dXJuIG5vdyEgKi8KLSAgICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgICAgIGNhc2Ugb3BfaHNidzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGhzYnciICkpOwotCi0gICAgICAgICAgYnVpbGRlci0+cGFyc2Vfc3RhdGUgPSBUMV9QYXJzZV9IYXZlX1dpZHRoOwotCi0gICAgICAgICAgYnVpbGRlci0+bGVmdF9iZWFyaW5nLnggKz0gdG9wWzBdOwotICAgICAgICAgIGJ1aWxkZXItPmFkdmFuY2UueCAgICAgICA9IHRvcFsxXTsKLSAgICAgICAgICBidWlsZGVyLT5hZHZhbmNlLnkgICAgICAgPSAwOwotCi0gICAgICAgICAgb3JpZ194ID0geCA9IGJ1aWxkZXItPnBvc194ICsgdG9wWzBdOwotICAgICAgICAgIG9yaWdfeSA9IHkgPSBidWlsZGVyLT5wb3NfeTsKLQotICAgICAgICAgIEZUX1VOVVNFRCggb3JpZ195ICk7Ci0KLSAgICAgICAgICAvKiB0aGUgYG1ldHJpY3Nfb25seScgaW5kaWNhdGVzIHRoYXQgd2Ugb25seSB3YW50IHRvIGNvbXB1dGUgKi8KLSAgICAgICAgICAvKiB0aGUgZ2x5cGgncyBtZXRyaWNzIChsc2IgKyBhZHZhbmNlIHdpZHRoKSwgbm90IGxvYWQgdGhlICAgKi8KLSAgICAgICAgICAvKiByZXN0IG9mIGl0OyBzbyBleGl0IGltbWVkaWF0ZWx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoIGJ1aWxkZXItPm1ldHJpY3Nfb25seSApCi0gICAgICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF9zZWFjOgotICAgICAgICAgIHJldHVybiB0MW9wZXJhdG9yX3NlYWMoIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcFsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BbMl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4MkludCggdG9wWzNdICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4MkludCggdG9wWzRdICkgKTsKLQotICAgICAgICBjYXNlIG9wX3NidzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHNidyIgKSk7Ci0KLSAgICAgICAgICBidWlsZGVyLT5wYXJzZV9zdGF0ZSA9IFQxX1BhcnNlX0hhdmVfV2lkdGg7Ci0KLSAgICAgICAgICBidWlsZGVyLT5sZWZ0X2JlYXJpbmcueCArPSB0b3BbMF07Ci0gICAgICAgICAgYnVpbGRlci0+bGVmdF9iZWFyaW5nLnkgKz0gdG9wWzFdOwotICAgICAgICAgIGJ1aWxkZXItPmFkdmFuY2UueCAgICAgICA9IHRvcFsyXTsKLSAgICAgICAgICBidWlsZGVyLT5hZHZhbmNlLnkgICAgICAgPSB0b3BbM107Ci0KLSAgICAgICAgICB4ID0gYnVpbGRlci0+cG9zX3ggKyB0b3BbMF07Ci0gICAgICAgICAgeSA9IGJ1aWxkZXItPnBvc195ICsgdG9wWzFdOwotCi0gICAgICAgICAgLyogdGhlIGBtZXRyaWNzX29ubHknIGluZGljYXRlcyB0aGF0IHdlIG9ubHkgd2FudCB0byBjb21wdXRlICovCi0gICAgICAgICAgLyogdGhlIGdseXBoJ3MgbWV0cmljcyAobHNiICsgYWR2YW5jZSB3aWR0aCksIG5vdCBsb2FkIHRoZSAgICovCi0gICAgICAgICAgLyogcmVzdCBvZiBpdDsgc28gZXhpdCBpbW1lZGlhdGVseSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgaWYgKCBidWlsZGVyLT5tZXRyaWNzX29ubHkgKQotICAgICAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugb3BfY2xvc2VwYXRoOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgY2xvc2VwYXRoIiApKTsKLQotICAgICAgICAgIC8qIGlmIHRoZXJlIGlzIG5vIHBhdGgsIGBjbG9zZXBhdGgnIGlzIGEgbm8tb3AgKi8KLSAgICAgICAgICBpZiAoIGJ1aWxkZXItPnBhcnNlX3N0YXRlID09IFQxX1BhcnNlX0hhdmVfUGF0aCAgIHx8Ci0gICAgICAgICAgICAgICBidWlsZGVyLT5wYXJzZV9zdGF0ZSA9PSBUMV9QYXJzZV9IYXZlX01vdmV0byApCi0gICAgICAgICAgICB0MV9idWlsZGVyX2Nsb3NlX2NvbnRvdXIoIGJ1aWxkZXIgKTsKLQotICAgICAgICAgIGJ1aWxkZXItPnBhcnNlX3N0YXRlID0gVDFfUGFyc2VfSGF2ZV9XaWR0aDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIG9wX2hsaW5ldG86Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBobGluZXRvIiApKTsKLQotICAgICAgICAgIGlmICggKCBlcnJvciA9IHQxX2J1aWxkZXJfc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSApCi0gICAgICAgICAgICAgICAgICE9IEZUX0Vycl9PayApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICB4ICs9IHRvcFswXTsKLSAgICAgICAgICBnb3RvIEFkZF9MaW5lOwotCi0gICAgICAgIGNhc2Ugb3BfaG1vdmV0bzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGhtb3ZldG8iICkpOwotCi0gICAgICAgICAgeCArPSB0b3BbMF07Ci0gICAgICAgICAgaWYgKCAhZGVjb2Rlci0+ZmxleF9zdGF0ZSApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBidWlsZGVyLT5wYXJzZV9zdGF0ZSA9PSBUMV9QYXJzZV9TdGFydCApCi0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgICAgYnVpbGRlci0+cGFyc2Vfc3RhdGUgPSBUMV9QYXJzZV9IYXZlX01vdmV0bzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF9odmN1cnZldG86Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBodmN1cnZldG8iICkpOwotCi0gICAgICAgICAgaWYgKCAoIGVycm9yID0gdDFfYnVpbGRlcl9zdGFydF9wb2ludCggYnVpbGRlciwgeCwgeSApICkKLSAgICAgICAgICAgICAgICAgIT0gRlRfRXJyX09rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgKCBlcnJvciA9IHQxX2J1aWxkZXJfY2hlY2tfcG9pbnRzKCBidWlsZGVyLCAzICkgKQotICAgICAgICAgICAgICAgICAhPSBGVF9FcnJfT2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgIHggKz0gdG9wWzBdOwotICAgICAgICAgIHQxX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0gICAgICAgICAgeCArPSB0b3BbMV07Ci0gICAgICAgICAgeSArPSB0b3BbMl07Ci0gICAgICAgICAgdDFfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLSAgICAgICAgICB5ICs9IHRvcFszXTsKLSAgICAgICAgICB0MV9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMSApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugb3BfcmxpbmV0bzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHJsaW5ldG8iICkpOwotCi0gICAgICAgICAgaWYgKCAoIGVycm9yID0gdDFfYnVpbGRlcl9zdGFydF9wb2ludCggYnVpbGRlciwgeCwgeSApICkKLSAgICAgICAgICAgICAgICAgIT0gRlRfRXJyX09rICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgIHggKz0gdG9wWzBdOwotICAgICAgICAgIHkgKz0gdG9wWzFdOwotCi0gICAgICAgIEFkZF9MaW5lOgotICAgICAgICAgIGlmICggKCBlcnJvciA9IHQxX2J1aWxkZXJfYWRkX3BvaW50MSggYnVpbGRlciwgeCwgeSApICkKLSAgICAgICAgICAgICAgICAgIT0gRlRfRXJyX09rICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIG9wX3Jtb3ZldG86Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBybW92ZXRvIiApKTsKLQotICAgICAgICAgIHggKz0gdG9wWzBdOwotICAgICAgICAgIHkgKz0gdG9wWzFdOwotICAgICAgICAgIGlmICggIWRlY29kZXItPmZsZXhfc3RhdGUgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggYnVpbGRlci0+cGFyc2Vfc3RhdGUgPT0gVDFfUGFyc2VfU3RhcnQgKQotICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICAgIGJ1aWxkZXItPnBhcnNlX3N0YXRlID0gVDFfUGFyc2VfSGF2ZV9Nb3ZldG87Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugb3BfcnJjdXJ2ZXRvOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgcnJjdXJ2ZXRvIiApKTsKLQotICAgICAgICAgIGlmICggKCBlcnJvciA9IHQxX2J1aWxkZXJfc3RhcnRfcG9pbnQoIGJ1aWxkZXIsIHgsIHkgKSApCi0gICAgICAgICAgICAgICAgICE9IEZUX0Vycl9PayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICggZXJyb3IgPSB0MV9idWlsZGVyX2NoZWNrX3BvaW50cyggYnVpbGRlciwgMyApICkKLSAgICAgICAgICAgICAgICAgIT0gRlRfRXJyX09rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICB4ICs9IHRvcFswXTsKLSAgICAgICAgICB5ICs9IHRvcFsxXTsKLSAgICAgICAgICB0MV9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMCApOwotCi0gICAgICAgICAgeCArPSB0b3BbMl07Ci0gICAgICAgICAgeSArPSB0b3BbM107Ci0gICAgICAgICAgdDFfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLQotICAgICAgICAgIHggKz0gdG9wWzRdOwotICAgICAgICAgIHkgKz0gdG9wWzVdOwotICAgICAgICAgIHQxX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAxICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF92aGN1cnZldG86Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiB2aGN1cnZldG8iICkpOwotCi0gICAgICAgICAgaWYgKCAoIGVycm9yID0gdDFfYnVpbGRlcl9zdGFydF9wb2ludCggYnVpbGRlciwgeCwgeSApICkKLSAgICAgICAgICAgICAgICAgIT0gRlRfRXJyX09rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgKCBlcnJvciA9IHQxX2J1aWxkZXJfY2hlY2tfcG9pbnRzKCBidWlsZGVyLCAzICkgKQotICAgICAgICAgICAgICAgICAhPSBGVF9FcnJfT2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgIHkgKz0gdG9wWzBdOwotICAgICAgICAgIHQxX2J1aWxkZXJfYWRkX3BvaW50KCBidWlsZGVyLCB4LCB5LCAwICk7Ci0gICAgICAgICAgeCArPSB0b3BbMV07Ci0gICAgICAgICAgeSArPSB0b3BbMl07Ci0gICAgICAgICAgdDFfYnVpbGRlcl9hZGRfcG9pbnQoIGJ1aWxkZXIsIHgsIHksIDAgKTsKLSAgICAgICAgICB4ICs9IHRvcFszXTsKLSAgICAgICAgICB0MV9idWlsZGVyX2FkZF9wb2ludCggYnVpbGRlciwgeCwgeSwgMSApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugb3BfdmxpbmV0bzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIHZsaW5ldG8iICkpOwotCi0gICAgICAgICAgaWYgKCAoIGVycm9yID0gdDFfYnVpbGRlcl9zdGFydF9wb2ludCggYnVpbGRlciwgeCwgeSApICkKLSAgICAgICAgICAgICAgICAgIT0gRlRfRXJyX09rICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgIHkgKz0gdG9wWzBdOwotICAgICAgICAgIGdvdG8gQWRkX0xpbmU7Ci0KLSAgICAgICAgY2FzZSBvcF92bW92ZXRvOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgdm1vdmV0byIgKSk7Ci0KLSAgICAgICAgICB5ICs9IHRvcFswXTsKLSAgICAgICAgICBpZiAoICFkZWNvZGVyLT5mbGV4X3N0YXRlICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGJ1aWxkZXItPnBhcnNlX3N0YXRlID09IFQxX1BhcnNlX1N0YXJ0ICkKLSAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgICBidWlsZGVyLT5wYXJzZV9zdGF0ZSA9IFQxX1BhcnNlX0hhdmVfTW92ZXRvOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIG9wX2RpdjoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGRpdiIgKSk7Ci0KLSAgICAgICAgICAvKiBpZiBgbGFyZ2VfaW50JyBpcyBzZXQsIHdlIGRpdmlkZSB1bnNjYWxlZCBudW1iZXJzOyAqLwotICAgICAgICAgIC8qIG90aGVyd2lzZSwgd2UgZGl2aWRlIG51bWJlcnMgaW4gMTYuMTYgZm9ybWF0IC0tICAgICovCi0gICAgICAgICAgLyogaW4gYm90aCBjYXNlcywgaXQgaXMgdGhlIHNhbWUgb3BlcmF0aW9uICAgICAgICAgICAgKi8KLSAgICAgICAgICAqdG9wID0gRlRfRGl2Rml4KCB0b3BbMF0sIHRvcFsxXSApOwotICAgICAgICAgICsrdG9wOwotCi0gICAgICAgICAgbGFyZ2VfaW50ID0gRkFMU0U7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF9jYWxsc3VicjoKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9JbnQgIGlkeDsKLQotCi0gICAgICAgICAgICBGVF9UUkFDRTQoKCAiIGNhbGxzdWJyIiApKTsKLQotICAgICAgICAgICAgaWR4ID0gRml4MkludCggdG9wWzBdICk7Ci0gICAgICAgICAgICBpZiAoIGlkeCA8IDAgfHwgaWR4ID49IGRlY29kZXItPm51bV9zdWJycyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0VSUk9SKCggInQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IgotICAgICAgICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBzdWJycyBpbmRleFxuIiApKTsKLSAgICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggem9uZSAtIGRlY29kZXItPnpvbmVzID49IFQxX01BWF9TVUJSU19DQUxMUyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0VSUk9SKCggInQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IgotICAgICAgICAgICAgICAgICAgICAgICAgICIgdG9vIG1hbnkgbmVzdGVkIHN1YnJzXG4iICkpOwotICAgICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgem9uZS0+Y3Vyc29yID0gaXA7ICAvKiBzYXZlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gcG9pbnRlciAqLwotCi0gICAgICAgICAgICB6b25lKys7Ci0KLSAgICAgICAgICAgIC8qIFRoZSBUeXBlIDEgZHJpdmVyIHN0b3JlcyBzdWJyb3V0aW5lcyB3aXRob3V0IHRoZSBzZWVkIGJ5dGVzLiAqLwotICAgICAgICAgICAgLyogVGhlIENJRCBkcml2ZXIgc3RvcmVzIHN1YnJvdXRpbmVzIHdpdGggc2VlZCBieXRlcy4gIFRoaXMgICAgICovCi0gICAgICAgICAgICAvKiBjYXNlIGlzIHRha2VuIGNhcmUgb2Ygd2hlbiBkZWNvZGVyLT5zdWJyc19sZW4gPT0gMC4gICAgICAgICAgKi8KLSAgICAgICAgICAgIHpvbmUtPmJhc2UgPSBkZWNvZGVyLT5zdWJyc1tpZHhdOwotCi0gICAgICAgICAgICBpZiAoIGRlY29kZXItPnN1YnJzX2xlbiApCi0gICAgICAgICAgICAgIHpvbmUtPmxpbWl0ID0gem9uZS0+YmFzZSArIGRlY29kZXItPnN1YnJzX2xlbltpZHhdOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvKiBXZSBhcmUgdXNpbmcgc3Vicm91dGluZXMgZnJvbSBhIENJRCBmb250LiAgV2UgbXVzdCBhZGp1c3QgKi8KLSAgICAgICAgICAgICAgLyogZm9yIHRoZSBzZWVkIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgIHpvbmUtPmJhc2UgICs9ICggZGVjb2Rlci0+bGVuSVYgPj0gMCA/IGRlY29kZXItPmxlbklWIDogMCApOwotICAgICAgICAgICAgICB6b25lLT5saW1pdCAgPSBkZWNvZGVyLT5zdWJyc1tpZHggKyAxXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgem9uZS0+Y3Vyc29yID0gem9uZS0+YmFzZTsKLQotICAgICAgICAgICAgaWYgKCAhem9uZS0+YmFzZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0VSUk9SKCggInQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IgotICAgICAgICAgICAgICAgICAgICAgICAgICIgaW52b2tpbmcgZW1wdHkgc3VicnNcbiIgKSk7Ci0gICAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWNvZGVyLT56b25lID0gem9uZTsKLSAgICAgICAgICAgIGlwICAgICAgICAgICAgPSB6b25lLT5iYXNlOwotICAgICAgICAgICAgbGltaXQgICAgICAgICA9IHpvbmUtPmxpbWl0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotCi0gICAgICAgIGNhc2Ugb3BfcG9wOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgcG9wIiApKTsKLQotICAgICAgICAgIGlmICgga25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQgPiAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudC0tOwotICAgICAgICAgICAgLyogaWdub3JlLCB3ZSBwdXNoZWQgdGhlIG9wZXJhbmRzIG91cnNlbHZlcyAqLwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCB1bmtub3duX290aGVyc3Vicl9yZXN1bHRfY250ID09IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0VSUk9SKCggInQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3M6IgotICAgICAgICAgICAgICAgICAgICAgICAiIG5vIG1vcmUgb3BlcmFuZHMgZm9yIG90aGVyc3ViclxuIiApKTsKLSAgICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICAgIH0KLQotICAgICAgICAgIHVua25vd25fb3RoZXJzdWJyX3Jlc3VsdF9jbnQtLTsKLSAgICAgICAgICB0b3ArKzsgICAvKiBgcHVzaCcgdGhlIG9wZXJhbmQgdG8gY2FsbG90aGVyc3ViciBvbnRvIHRoZSBzdGFjayAqLwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugb3BfcmV0dXJuOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgcmV0dXJuIiApKTsKLQotICAgICAgICAgIGlmICggem9uZSA8PSBkZWNvZGVyLT56b25lcyApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgICAgICAgICIgdW5leHBlY3RlZCByZXR1cm5cbiIgKSk7Ci0gICAgICAgICAgICBnb3RvIFN5bnRheF9FcnJvcjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICB6b25lLS07Ci0gICAgICAgICAgaXAgICAgICAgICAgICA9IHpvbmUtPmN1cnNvcjsKLSAgICAgICAgICBsaW1pdCAgICAgICAgID0gem9uZS0+bGltaXQ7Ci0gICAgICAgICAgZGVjb2Rlci0+em9uZSA9IHpvbmU7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF9kb3RzZWN0aW9uOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgZG90c2VjdGlvbiIgKSk7Ci0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIG9wX2hzdGVtOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgaHN0ZW0iICkpOwotCi0gICAgICAgICAgLyogcmVjb3JkIGhvcml6b250YWwgaGludCAqLwotICAgICAgICAgIGlmICggaGludGVyICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiB0b3BbMF0gKz0gYnVpbGRlci0+bGVmdF9iZWFyaW5nLnk7ICovCi0gICAgICAgICAgICBoaW50ZXItPnN0ZW0oIGhpbnRlci0+aGludHMsIDEsIHRvcCApOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIG9wX2hzdGVtMzoKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiIGhzdGVtMyIgKSk7Ci0KLSAgICAgICAgICAvKiByZWNvcmQgaG9yaXpvbnRhbCBjb3VudGVyLWNvbnRyb2xsZWQgaGludHMgKi8KLSAgICAgICAgICBpZiAoIGhpbnRlciApCi0gICAgICAgICAgICBoaW50ZXItPnN0ZW0zKCBoaW50ZXItPmhpbnRzLCAxLCB0b3AgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIG9wX3ZzdGVtOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgdnN0ZW0iICkpOwotCi0gICAgICAgICAgLyogcmVjb3JkIHZlcnRpY2FsIGhpbnQgKi8KLSAgICAgICAgICBpZiAoIGhpbnRlciApCi0gICAgICAgICAgewotICAgICAgICAgICAgdG9wWzBdICs9IG9yaWdfeDsKLSAgICAgICAgICAgIGhpbnRlci0+c3RlbSggaGludGVyLT5oaW50cywgMCwgdG9wICk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Ugb3BfdnN0ZW0zOgotICAgICAgICAgIEZUX1RSQUNFNCgoICIgdnN0ZW0zIiApKTsKLQotICAgICAgICAgIC8qIHJlY29yZCB2ZXJ0aWNhbCBjb3VudGVyLWNvbnRyb2xsZWQgaGludHMgKi8KLSAgICAgICAgICBpZiAoIGhpbnRlciApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfUG9zICBkeCA9IG9yaWdfeDsKLQotCi0gICAgICAgICAgICB0b3BbMF0gKz0gZHg7Ci0gICAgICAgICAgICB0b3BbMl0gKz0gZHg7Ci0gICAgICAgICAgICB0b3BbNF0gKz0gZHg7Ci0gICAgICAgICAgICBoaW50ZXItPnN0ZW0zKCBoaW50ZXItPmhpbnRzLCAwLCB0b3AgKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF9zZXRjdXJyZW50cG9pbnQ6Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBzZXRjdXJyZW50cG9pbnQiICkpOwotCi0gICAgICAgICAgLyogRnJvbSB0aGUgVDEgc3BlY2lmaWNhdGlvbiwgc2VjdGlvbiA2LjQ6ICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICBUaGUgc2V0Y3VycmVudHBvaW50IGNvbW1hbmQgaXMgdXNlZCBvbmx5IGluICAgICAgICAgICovCi0gICAgICAgICAgLyogICBjb25qdW5jdGlvbiB3aXRoIHJlc3VsdHMgZnJvbSBPdGhlclN1YnJzIHByb2NlZHVyZXMuICovCi0KLSAgICAgICAgICAvKiBrbm93bl9vdGhlcnN1YnJfcmVzdWx0X2NudCAhPSAwIGlzIGFscmVhZHkgaGFuZGxlZCAgICAgKi8KLSAgICAgICAgICAvKiBhYm92ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgIC8qIE5vdGUsIGhvd2V2ZXIsIHRoYXQgYm90aCBHaG9zdHNjcmlwdCBhbmQgQWRvYmUgICAgICAgICAqLwotICAgICAgICAgIC8qIERpc3RpbGxlciBoYW5kbGUgdGhpcyBzaXR1YXRpb24gYnkgc2lsZW50bHkgaWdub3JpbmcgICAqLwotICAgICAgICAgIC8qIHRoZSBpbmFwcHJvcHJpYXRlIGBzZXRjdXJyZW50cG9pbnQnIGluc3RydWN0aW9uLiAgU28gICAqLwotICAgICAgICAgIC8qIHdlIGRvIHRoZSBzYW1lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmIDAKLQotICAgICAgICAgIGlmICggZGVjb2Rlci0+ZmxleF9zdGF0ZSAhPSAxICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX3BhcnNlX2NoYXJzdHJpbmdzOiIKLSAgICAgICAgICAgICAgICAgICAgICAgIiB1bmV4cGVjdGVkIGBzZXRjdXJyZW50cG9pbnQnXG4iICkpOwotICAgICAgICAgICAgZ290byBTeW50YXhfRXJyb3I7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIC4uLgotI2VuZGlmCi0KLSAgICAgICAgICB4ID0gdG9wWzBdOwotICAgICAgICAgIHkgPSB0b3BbMV07Ci0gICAgICAgICAgZGVjb2Rlci0+ZmxleF9zdGF0ZSA9IDA7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBvcF91bmtub3duMTU6Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggIiBvcGNvZGVfMTUiICkpOwotICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gZXhjZXB0IHRvIHBvcCB0aGUgdHdvIGFyZ3VtZW50cyAqLwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgRlRfRVJST1IoKCAidDFfZGVjb2Rlcl9wYXJzZV9jaGFyc3RyaW5nczoiCi0gICAgICAgICAgICAgICAgICAgICAiIHVuaGFuZGxlZCBvcGNvZGUgJWRcbiIsIG9wICkpOwotICAgICAgICAgIGdvdG8gU3ludGF4X0Vycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogWFhYIE9wZXJhdG9ycyB1c3VhbGx5IGNsZWFyIHRoZSBvcGVyYW5kIHN0YWNrOyAgKi8KLSAgICAgICAgLyogICAgIG9ubHkgZGl2LCBjYWxsc3ViciwgY2FsbG90aGVyc3ViciwgcG9wLCBhbmQgKi8KLSAgICAgICAgLyogICAgIHJldHVybiBhcmUgZGlmZmVyZW50LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgIEluIHByYWN0aWNlIGl0IGRvZXNuJ3QgbWF0dGVyICg/KS4gICAgICAgICAgKi8KLQotICAgICAgICBkZWNvZGVyLT50b3AgPSB0b3A7Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICBGVF9UUkFDRTQoKCAiXG4iICkpOwotICAgICAgICBib2wgPSBUUlVFOwotI2VuZGlmCi0KLSAgICAgIH0gLyogZ2VuZXJhbCBvcGVyYXRvciBwcm9jZXNzaW5nICovCi0KLSAgICB9IC8qIHdoaWxlIGlwIDwgbGltaXQgKi8KLQotICAgIEZUX1RSQUNFNCgoICIuLmVuZC4uXG5cbiIgKSk7Ci0KLSAgRmFpbDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgU3ludGF4X0Vycm9yOgotICAgIHJldHVybiBGVF9USFJPVyggU3ludGF4X0Vycm9yICk7Ci0KLSAgU3RhY2tfVW5kZXJmbG93OgotICAgIHJldHVybiBGVF9USFJPVyggU3RhY2tfVW5kZXJmbG93ICk7Ci0gIH0KLQotCi0gIC8qIHBhcnNlIGEgc2luZ2xlIFR5cGUgMSBnbHlwaCAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdDFfZGVjb2Rlcl9wYXJzZV9nbHlwaCggVDFfRGVjb2RlciAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZ2x5cGggKQotICB7Ci0gICAgcmV0dXJuIGRlY29kZXItPnBhcnNlX2NhbGxiYWNrKCBkZWNvZGVyLCBnbHlwaCApOwotICB9Ci0KLQotICAvKiBpbml0aWFsaXplIFQxIGRlY29kZXIgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHQxX2RlY29kZXJfaW5pdCggVDFfRGVjb2RlciAgICAgICAgICAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1NpemUgICAgICAgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAgICAgICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogICAgICAgICAgICBnbHlwaF9uYW1lcywKLSAgICAgICAgICAgICAgICAgICBQU19CbGVuZCAgICAgICAgICAgICBibGVuZCwKLSAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgICAgICBoaW50aW5nLAotICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICAgICAgIGhpbnRfbW9kZSwKLSAgICAgICAgICAgICAgICAgICBUMV9EZWNvZGVyX0NhbGxiYWNrICBwYXJzZV9jYWxsYmFjayApCi0gIHsKLSAgICBGVF9NRU1fWkVSTyggZGVjb2Rlciwgc2l6ZW9mICggKmRlY29kZXIgKSApOwotCi0gICAgLyogcmV0cmlldmUgUFNOYW1lcyBpbnRlcmZhY2UgZnJvbSBsaXN0IG9mIGN1cnJlbnQgbW9kdWxlcyAqLwotICAgIHsKLSAgICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lczsKLQotCi0gICAgICBGVF9GQUNFX0ZJTkRfR0xPQkFMX1NFUlZJQ0UoIGZhY2UsIHBzbmFtZXMsIFBPU1RTQ1JJUFRfQ01BUFMgKTsKLSAgICAgIGlmICggIXBzbmFtZXMgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJ0MV9kZWNvZGVyX2luaXQ6IgotICAgICAgICAgICAgICAgICAgICIgdGhlIGBwc25hbWVzJyBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZVxuIiApKTsKLSAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLSAgICAgIH0KLQotICAgICAgZGVjb2Rlci0+cHNuYW1lcyA9IHBzbmFtZXM7Ci0gICAgfQotCi0gICAgdDFfYnVpbGRlcl9pbml0KCAmZGVjb2Rlci0+YnVpbGRlciwgZmFjZSwgc2l6ZSwgc2xvdCwgaGludGluZyApOwotCi0gICAgLyogZGVjb2Rlci0+YnVpbGRjaGFyIGFuZCBkZWNvZGVyLT5sZW5fYnVpbGRjaGFyIGhhdmUgdG8gYmUgICovCi0gICAgLyogaW5pdGlhbGl6ZWQgYnkgdGhlIGNhbGxlciBzaW5jZSB3ZSBjYW5ub3Qga25vdyB0aGUgbGVuZ3RoICovCi0gICAgLyogb2YgdGhlIEJ1aWxkQ2hhckFycmF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBkZWNvZGVyLT5udW1fZ2x5cGhzICAgICA9IChGVF9VSW50KWZhY2UtPm51bV9nbHlwaHM7Ci0gICAgZGVjb2Rlci0+Z2x5cGhfbmFtZXMgICAgPSBnbHlwaF9uYW1lczsKLSAgICBkZWNvZGVyLT5oaW50X21vZGUgICAgICA9IGhpbnRfbW9kZTsKLSAgICBkZWNvZGVyLT5ibGVuZCAgICAgICAgICA9IGJsZW5kOwotICAgIGRlY29kZXItPnBhcnNlX2NhbGxiYWNrID0gcGFyc2VfY2FsbGJhY2s7Ci0KLSAgICBkZWNvZGVyLT5mdW5jcyAgICAgICAgICA9IHQxX2RlY29kZXJfZnVuY3M7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKiBmaW5hbGl6ZSBUMSBkZWNvZGVyICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHQxX2RlY29kZXJfZG9uZSggVDFfRGVjb2RlciAgZGVjb2RlciApCi0gIHsKLSAgICB0MV9idWlsZGVyX2RvbmUoICZkZWNvZGVyLT5idWlsZGVyICk7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2F1eC90MWRlY29kZS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3QxZGVjb2RlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MzA3OGYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzYXV4L3QxZGVjb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0MWRlY29kZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUG9zdFNjcmlwdCBUeXBlIDEgZGVjb2Rpbmcgcm91dGluZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19UMURFQ09ERV9IX18KLSNkZWZpbmUgX19UMURFQ09ERV9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RZUEUxX1RZUEVTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0NBTExCQUNLX1RBQkxFCi0gIGNvbnN0IFQxX0RlY29kZXJfRnVuY3NSZWMgIHQxX2RlY29kZXJfZnVuY3M7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0MV9kZWNvZGVyX3BhcnNlX2dseXBoKCBUMV9EZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnbHlwaF9pbmRleCApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHQxX2RlY29kZXJfcGFyc2VfY2hhcnN0cmluZ3MoIFQxX0RlY29kZXIgIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGxlbiApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHQxX2RlY29kZXJfaW5pdCggVDFfRGVjb2RlciAgICAgICAgICAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICBGVF9GYWNlICAgICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1NpemUgICAgICAgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAgICAgICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogICAgICAgICAgICBnbHlwaF9uYW1lcywKLSAgICAgICAgICAgICAgICAgICBQU19CbGVuZCAgICAgICAgICAgICBibGVuZCwKLSAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgICAgICBoaW50aW5nLAotICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICAgICAgIGhpbnRfbW9kZSwKLSAgICAgICAgICAgICAgICAgICBUMV9EZWNvZGVyX0NhbGxiYWNrICBwYXJzZV9nbHlwaCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgdDFfZGVjb2Rlcl9kb25lKCBUMV9EZWNvZGVyICBkZWNvZGVyICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19UMURFQ09ERV9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9KYW1maWxlIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL0phbWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYjNiZTEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jIEZyZWVUeXBlIDIgc3JjL3BzaGludGVyIEphbWZpbGUKLSMKLSMgQ29weXJpZ2h0IDIwMDEtMjAxNSBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLVN1YkRpciAgRlQyX1RPUCAkKEZUMl9TUkNfRElSKSBwc2hpbnRlciA7Ci0KLXsKLSAgbG9jYWwgIF9zb3VyY2VzIDsKLQotICBpZiAkKEZUMl9NVUxUSSkKLSAgewotICAgIF9zb3VyY2VzID0gcHNoYWxnbwotICAgICAgICAgICAgICAgcHNoZ2xvYgotICAgICAgICAgICAgICAgcHNobW9kCi0gICAgICAgICAgICAgICBwc2hwaWMKLSAgICAgICAgICAgICAgIHBzaHJlYwotICAgICAgICAgICAgICAgOwotICB9Ci0gIGVsc2UKLSAgewotICAgIF9zb3VyY2VzID0gcHNoaW50ZXIgOwotICB9Ci0KLSAgTGlicmFyeSAgJChGVDJfTElCKSA6ICQoX3NvdXJjZXMpLmMgOwotfQotCi0jIGVuZCBvZiBzcmMvcHNoaW50ZXIgSmFtZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaGFsZ28uYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hhbGdvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNjU0Y2IuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaGFsZ28uYworKysgL2Rldi9udWxsCkBAIC0xLDIxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNoYWxnby5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBvc3RTY3JpcHQgaGludGluZyBhbGdvcml0aG0gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KLS8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ICi0jaW5jbHVkZSAicHNoYWxnby5oIgotCi0jaW5jbHVkZSAicHNobnRlcnIuaCIKLQotCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3BzaGFsZ28yCi0KLQotI2lmZGVmIERFQlVHX0hJTlRFUgotICBQU0hfSGludF9UYWJsZSAgcHNfZGVidWdfaGludF90YWJsZSA9IE5VTEw7Ci0gIFBTSF9IaW50RnVuYyAgICBwc19kZWJ1Z19oaW50X2Z1bmMgID0gTlVMTDsKLSAgUFNIX0dseXBoICAgICAgIHBzX2RlYnVnX2dseXBoICAgICAgPSBOVUxMOwotI2VuZGlmCi0KLQotI2RlZmluZSAgQ09NUFVURV9JTkZMRVhTICAvKiBjb21wdXRlIGluZmxlY3Rpb24gcG9pbnRzIHRvIG9wdGltaXplIGBTJyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgc2ltaWxhciBnbHlwaHMgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgQkFTSUMgSElOVFMgUkVDT1JESU5HUyAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogcmV0dXJuIHRydWUgaWYgdHdvIHN0ZW0gaGludHMgb3ZlcmxhcCAqLwotICBzdGF0aWMgRlRfSW50Ci0gIHBzaF9oaW50X292ZXJsYXAoIFBTSF9IaW50ICBoaW50MSwKLSAgICAgICAgICAgICAgICAgICAgUFNIX0hpbnQgIGhpbnQyICkKLSAgewotICAgIHJldHVybiBoaW50MS0+b3JnX3BvcyArIGhpbnQxLT5vcmdfbGVuID49IGhpbnQyLT5vcmdfcG9zICYmCi0gICAgICAgICAgIGhpbnQyLT5vcmdfcG9zICsgaGludDItPm9yZ19sZW4gPj0gaGludDEtPm9yZ19wb3M7Ci0gIH0KLQotCi0gIC8qIGRlc3Ryb3kgaGludHMgdGFibGUgKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2hpbnRfdGFibGVfZG9uZSggUFNIX0hpbnRfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICAgbWVtb3J5ICkKLSAgewotICAgIEZUX0ZSRUUoIHRhYmxlLT56b25lcyApOwotICAgIHRhYmxlLT5udW1fem9uZXMgPSAwOwotICAgIHRhYmxlLT56b25lICAgICAgPSBOVUxMOwotCi0gICAgRlRfRlJFRSggdGFibGUtPnNvcnQgKTsKLSAgICBGVF9GUkVFKCB0YWJsZS0+aGludHMgKTsKLSAgICB0YWJsZS0+bnVtX2hpbnRzICAgPSAwOwotICAgIHRhYmxlLT5tYXhfaGludHMgICA9IDA7Ci0gICAgdGFibGUtPnNvcnRfZ2xvYmFsID0gTlVMTDsKLSAgfQotCi0KLSAgLyogZGVhY3RpdmF0ZSBhbGwgaGludHMgaW4gYSB0YWJsZSAqLwotICBzdGF0aWMgdm9pZAotICBwc2hfaGludF90YWJsZV9kZWFjdGl2YXRlKCBQU0hfSGludF9UYWJsZSAgdGFibGUgKQotICB7Ci0gICAgRlRfVUludCAgIGNvdW50ID0gdGFibGUtPm1heF9oaW50czsKLSAgICBQU0hfSGludCAgaGludCAgPSB0YWJsZS0+aGludHM7Ci0KLQotICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBoaW50KysgKQotICAgIHsKLSAgICAgIHBzaF9oaW50X2RlYWN0aXZhdGUoIGhpbnQgKTsKLSAgICAgIGhpbnQtPm9yZGVyID0gLTE7Ci0gICAgfQotICB9Ci0KLQotICAvKiBpbnRlcm5hbCBmdW5jdGlvbiB0byByZWNvcmQgYSBuZXcgaGludCAqLwotICBzdGF0aWMgdm9pZAotICBwc2hfaGludF90YWJsZV9yZWNvcmQoIFBTSF9IaW50X1RhYmxlICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgaWR4ICkKLSAgewotICAgIFBTSF9IaW50ICBoaW50ID0gdGFibGUtPmhpbnRzICsgaWR4OwotCi0KLSAgICBpZiAoIGlkeCA+PSB0YWJsZS0+bWF4X2hpbnRzICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTAoKCAicHNoX2hpbnRfdGFibGVfcmVjb3JkOiBpbnZhbGlkIGhpbnQgaW5kZXggJWRcbiIsIGlkeCApKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBpZ25vcmUgYWN0aXZlIGhpbnRzICovCi0gICAgaWYgKCBwc2hfaGludF9pc19hY3RpdmUoIGhpbnQgKSApCi0gICAgICByZXR1cm47Ci0KLSAgICBwc2hfaGludF9hY3RpdmF0ZSggaGludCApOwotCi0gICAgLyogbm93IHNjYW4gdGhlIGN1cnJlbnQgYWN0aXZlIGhpbnQgc2V0IHRvIGNoZWNrICovCi0gICAgLyogd2hldGhlciBgaGludCcgb3ZlcmxhcHMgd2l0aCBhbm90aGVyIGhpbnQgICAgICovCi0gICAgewotICAgICAgUFNIX0hpbnQqICBzb3J0ZWQgPSB0YWJsZS0+c29ydF9nbG9iYWw7Ci0gICAgICBGVF9VSW50ICAgIGNvdW50ICA9IHRhYmxlLT5udW1faGludHM7Ci0gICAgICBQU0hfSGludCAgIGhpbnQyOwotCi0KLSAgICAgIGhpbnQtPnBhcmVudCA9IE5VTEw7Ci0gICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgc29ydGVkKysgKQotICAgICAgewotICAgICAgICBoaW50MiA9IHNvcnRlZFswXTsKLQotICAgICAgICBpZiAoIHBzaF9oaW50X292ZXJsYXAoIGhpbnQsIGhpbnQyICkgKQotICAgICAgICB7Ci0gICAgICAgICAgaGludC0+cGFyZW50ID0gaGludDI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIHRhYmxlLT5udW1faGludHMgPCB0YWJsZS0+bWF4X2hpbnRzICkKLSAgICAgIHRhYmxlLT5zb3J0X2dsb2JhbFt0YWJsZS0+bnVtX2hpbnRzKytdID0gaGludDsKLSAgICBlbHNlCi0gICAgICBGVF9UUkFDRTAoKCAicHNoX2hpbnRfdGFibGVfcmVjb3JkOiB0b28gbWFueSBzb3J0ZWQgaGludHMhICBCVUchXG4iICkpOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBwc2hfaGludF90YWJsZV9yZWNvcmRfbWFzayggUFNIX0hpbnRfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNfTWFzayAgICAgICAgIGhpbnRfbWFzayApCi0gIHsKLSAgICBGVF9JbnQgICAgbWFzayA9IDAsIHZhbCA9IDA7Ci0gICAgRlRfQnl0ZSogIGN1cnNvciA9IGhpbnRfbWFzay0+Ynl0ZXM7Ci0gICAgRlRfVUludCAgIGlkeCwgbGltaXQ7Ci0KLQotICAgIGxpbWl0ID0gaGludF9tYXNrLT5udW1fYml0czsKLQotICAgIGZvciAoIGlkeCA9IDA7IGlkeCA8IGxpbWl0OyBpZHgrKyApCi0gICAgewotICAgICAgaWYgKCBtYXNrID09IDAgKQotICAgICAgewotICAgICAgICB2YWwgID0gKmN1cnNvcisrOwotICAgICAgICBtYXNrID0gMHg4MDsKLSAgICAgIH0KLQotICAgICAgaWYgKCB2YWwgJiBtYXNrICkKLSAgICAgICAgcHNoX2hpbnRfdGFibGVfcmVjb3JkKCB0YWJsZSwgaWR4ICk7Ci0KLSAgICAgIG1hc2sgPj49IDE7Ci0gICAgfQotICB9Ci0KLQotICAvKiBjcmVhdGUgaGludHMgdGFibGUgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHBzaF9oaW50X3RhYmxlX2luaXQoIFBTSF9IaW50X1RhYmxlICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgUFNfSGludF9UYWJsZSAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICBQU19NYXNrX1RhYmxlICAgaGludF9tYXNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgUFNfTWFza19UYWJsZSAgIGNvdW50ZXJfbWFza3MsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgICBtZW1vcnkgKQotICB7Ci0gICAgRlRfVUludCAgIGNvdW50OwotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotICAgIEZUX1VOVVNFRCggY291bnRlcl9tYXNrcyApOwotCi0KLSAgICBjb3VudCA9IGhpbnRzLT5udW1faGludHM7Ci0KLSAgICAvKiBhbGxvY2F0ZSBvdXIgdGFibGVzICovCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIHRhYmxlLT5zb3J0LCAgMiAqIGNvdW50ICAgICApIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIHRhYmxlLT5oaW50cywgICAgIGNvdW50ICAgICApIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIHRhYmxlLT56b25lcywgMiAqIGNvdW50ICsgMSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHRhYmxlLT5tYXhfaGludHMgICA9IGNvdW50OwotICAgIHRhYmxlLT5zb3J0X2dsb2JhbCA9IHRhYmxlLT5zb3J0ICsgY291bnQ7Ci0gICAgdGFibGUtPm51bV9oaW50cyAgID0gMDsKLSAgICB0YWJsZS0+bnVtX3pvbmVzICAgPSAwOwotICAgIHRhYmxlLT56b25lICAgICAgICA9IE5VTEw7Ci0KLSAgICAvKiBpbml0aWFsaXplIHRoZSBgdGFibGUtPmhpbnRzJyBhcnJheSAqLwotICAgIHsKLSAgICAgIFBTSF9IaW50ICB3cml0ZSA9IHRhYmxlLT5oaW50czsKLSAgICAgIFBTX0hpbnQgICByZWFkICA9IGhpbnRzLT5oaW50czsKLQotCi0gICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgd3JpdGUrKywgcmVhZCsrICkKLSAgICAgIHsKLSAgICAgICAgd3JpdGUtPm9yZ19wb3MgPSByZWFkLT5wb3M7Ci0gICAgICAgIHdyaXRlLT5vcmdfbGVuID0gcmVhZC0+bGVuOwotICAgICAgICB3cml0ZS0+ZmxhZ3MgICA9IHJlYWQtPmZsYWdzOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIHdlIG5vdyBuZWVkIHRvIGRldGVybWluZSB0aGUgaW5pdGlhbCBgcGFyZW50JyBzdGVtczsgZmlyc3QgICovCi0gICAgLyogYWN0aXZhdGUgdGhlIGhpbnRzIHRoYXQgYXJlIGdpdmVuIGJ5IHRoZSBpbml0aWFsIGhpbnQgbWFza3MgKi8KLSAgICBpZiAoIGhpbnRfbWFza3MgKQotICAgIHsKLSAgICAgIFBTX01hc2sgIG1hc2sgPSBoaW50X21hc2tzLT5tYXNrczsKLQotCi0gICAgICBjb3VudCAgICAgICAgICAgICA9IGhpbnRfbWFza3MtPm51bV9tYXNrczsKLSAgICAgIHRhYmxlLT5oaW50X21hc2tzID0gaGludF9tYXNrczsKLQotICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIG1hc2srKyApCi0gICAgICAgIHBzaF9oaW50X3RhYmxlX3JlY29yZF9tYXNrKCB0YWJsZSwgbWFzayApOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHksIGRvIGEgbGluZWFyIHBhcnNlIGluIGNhc2Ugc29tZSBoaW50cyB3ZXJlIGxlZnQgYWxvbmUgKi8KLSAgICBpZiAoIHRhYmxlLT5udW1faGludHMgIT0gdGFibGUtPm1heF9oaW50cyApCi0gICAgewotICAgICAgRlRfVUludCAgaWR4OwotCi0KLSAgICAgIEZUX1RSQUNFMCgoICJwc2hfaGludF90YWJsZV9pbml0OiBtaXNzaW5nL2luY29ycmVjdCBoaW50IG1hc2tzXG4iICkpOwotCi0gICAgICBjb3VudCA9IHRhYmxlLT5tYXhfaGludHM7Ci0gICAgICBmb3IgKCBpZHggPSAwOyBpZHggPCBjb3VudDsgaWR4KysgKQotICAgICAgICBwc2hfaGludF90YWJsZV9yZWNvcmQoIHRhYmxlLCBpZHggKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9oaW50X3RhYmxlX2FjdGl2YXRlX21hc2soIFBTSF9IaW50X1RhYmxlICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNfTWFzayAgICAgICAgIGhpbnRfbWFzayApCi0gIHsKLSAgICBGVF9JbnQgICAgbWFzayA9IDAsIHZhbCA9IDA7Ci0gICAgRlRfQnl0ZSogIGN1cnNvciA9IGhpbnRfbWFzay0+Ynl0ZXM7Ci0gICAgRlRfVUludCAgIGlkeCwgbGltaXQsIGNvdW50OwotCi0KLSAgICBsaW1pdCA9IGhpbnRfbWFzay0+bnVtX2JpdHM7Ci0gICAgY291bnQgPSAwOwotCi0gICAgcHNoX2hpbnRfdGFibGVfZGVhY3RpdmF0ZSggdGFibGUgKTsKLQotICAgIGZvciAoIGlkeCA9IDA7IGlkeCA8IGxpbWl0OyBpZHgrKyApCi0gICAgewotICAgICAgaWYgKCBtYXNrID09IDAgKQotICAgICAgewotICAgICAgICB2YWwgID0gKmN1cnNvcisrOwotICAgICAgICBtYXNrID0gMHg4MDsKLSAgICAgIH0KLQotICAgICAgaWYgKCB2YWwgJiBtYXNrICkKLSAgICAgIHsKLSAgICAgICAgUFNIX0hpbnQgIGhpbnQgPSAmdGFibGUtPmhpbnRzW2lkeF07Ci0KLQotICAgICAgICBpZiAoICFwc2hfaGludF9pc19hY3RpdmUoIGhpbnQgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50ICAgICBjb3VudDI7Ci0KLSNpZiAwCi0gICAgICAgICAgUFNIX0hpbnQqICBzb3J0ID0gdGFibGUtPnNvcnQ7Ci0gICAgICAgICAgUFNIX0hpbnQgICBoaW50MjsKLQotCi0gICAgICAgICAgZm9yICggY291bnQyID0gY291bnQ7IGNvdW50MiA+IDA7IGNvdW50Mi0tLCBzb3J0KysgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGhpbnQyID0gc29ydFswXTsKLSAgICAgICAgICAgIGlmICggcHNoX2hpbnRfb3ZlcmxhcCggaGludCwgaGludDIgKSApCi0gICAgICAgICAgICAgIEZUX1RSQUNFMCgoICJwc2hfaGludF90YWJsZV9hY3RpdmF0ZV9tYXNrOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3VuZCBvdmVybGFwcGluZyBoaW50c1xuIiApKQotICAgICAgICAgIH0KLSNlbHNlCi0gICAgICAgICAgY291bnQyID0gMDsKLSNlbmRpZgotCi0gICAgICAgICAgaWYgKCBjb3VudDIgPT0gMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgcHNoX2hpbnRfYWN0aXZhdGUoIGhpbnQgKTsKLSAgICAgICAgICAgIGlmICggY291bnQgPCB0YWJsZS0+bWF4X2hpbnRzICkKLSAgICAgICAgICAgICAgdGFibGUtPnNvcnRbY291bnQrK10gPSBoaW50OwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBGVF9UUkFDRTAoKCAicHNoX2hpbnRfdGFibGVhY3RpdmF0ZV9tYXNrOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiB0b28gbWFueSBhY3RpdmUgaGludHNcbiIgKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIG1hc2sgPj49IDE7Ci0gICAgfQotICAgIHRhYmxlLT5udW1faGludHMgPSBjb3VudDsKLQotICAgIC8qIG5vdywgc29ydCB0aGUgaGludHM7IHRoZXkgYXJlIGd1YXJhbnRlZWQgdG8gbm90IG92ZXJsYXAgKi8KLSAgICAvKiBzbyB3ZSBjYW4gY29tcGFyZSB0aGVpciAib3JnX3BvcyIgZmllbGQgZGlyZWN0bHkgICAgICAgICovCi0gICAgewotICAgICAgRlRfSW50ICAgICBpMSwgaTI7Ci0gICAgICBQU0hfSGludCAgIGhpbnQxLCBoaW50MjsKLSAgICAgIFBTSF9IaW50KiAgc29ydCA9IHRhYmxlLT5zb3J0OwotCi0KLSAgICAgIC8qIGEgc2ltcGxlIGJ1YmJsZSBzb3J0IHdpbGwgZG8sIHNpbmNlIGluIDk5JSBvZiBjYXNlcywgdGhlIGhpbnRzICovCi0gICAgICAvKiB3aWxsIGJlIGFscmVhZHkgc29ydGVkIC0tIGFuZCB0aGUgc29ydCB3aWxsIGJlIGxpbmVhciAgICAgICAgICAqLwotICAgICAgZm9yICggaTEgPSAxOyBpMSA8IChGVF9JbnQpY291bnQ7IGkxKysgKQotICAgICAgewotICAgICAgICBoaW50MSA9IHNvcnRbaTFdOwotICAgICAgICBmb3IgKCBpMiA9IGkxIC0gMTsgaTIgPj0gMDsgaTItLSApCi0gICAgICAgIHsKLSAgICAgICAgICBoaW50MiA9IHNvcnRbaTJdOwotCi0gICAgICAgICAgaWYgKCBoaW50Mi0+b3JnX3BvcyA8IGhpbnQxLT5vcmdfcG9zICkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgc29ydFtpMiArIDFdID0gaGludDI7Ci0gICAgICAgICAgc29ydFtpMl0gICAgID0gaGludDE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgIEhJTlRTIEdSSUQtRklUVElORyBBTkQgT1BUSU1JWkFUSU9OICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgMQotICBzdGF0aWMgRlRfUG9zCi0gIHBzaF9kaW1lbnNpb25fcXVhbnRpemVfbGVuKCBQU0hfRGltZW5zaW9uICBkaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICBkb19zbmFwcGluZyApCi0gIHsKLSAgICBpZiAoIGxlbiA8PSA2NCApCi0gICAgICBsZW4gPSA2NDsKLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfUG9zICBkZWx0YSA9IGxlbiAtIGRpbS0+c3Rkdy53aWR0aHNbMF0uY3VyOwotCi0KLSAgICAgIGlmICggZGVsdGEgPCAwICkKLSAgICAgICAgZGVsdGEgPSAtZGVsdGE7Ci0KLSAgICAgIGlmICggZGVsdGEgPCA0MCApCi0gICAgICB7Ci0gICAgICAgIGxlbiA9IGRpbS0+c3Rkdy53aWR0aHNbMF0uY3VyOwotICAgICAgICBpZiAoIGxlbiA8IDQ4ICkKLSAgICAgICAgICBsZW4gPSA0ODsKLSAgICAgIH0KLQotICAgICAgaWYgKCBsZW4gPCAzICogNjQgKQotICAgICAgewotICAgICAgICBkZWx0YSA9ICggbGVuICYgNjMgKTsKLSAgICAgICAgbGVuICAmPSAtNjQ7Ci0KLSAgICAgICAgaWYgKCBkZWx0YSA8IDEwICkKLSAgICAgICAgICBsZW4gKz0gZGVsdGE7Ci0KLSAgICAgICAgZWxzZSBpZiAoIGRlbHRhIDwgMzIgKQotICAgICAgICAgIGxlbiArPSAxMDsKLQotICAgICAgICBlbHNlIGlmICggZGVsdGEgPCA1NCApCi0gICAgICAgICAgbGVuICs9IDU0OwotCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBsZW4gKz0gZGVsdGE7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGxlbiA9IEZUX1BJWF9ST1VORCggbGVuICk7Ci0gICAgfQotCi0gICAgaWYgKCBkb19zbmFwcGluZyApCi0gICAgICBsZW4gPSBGVF9QSVhfUk9VTkQoIGxlbiApOwotCi0gICAgcmV0dXJuICBsZW47Ci0gIH0KLSNlbmRpZiAvKiAwICovCi0KLQotI2lmZGVmIERFQlVHX0hJTlRFUgotCi0gIHN0YXRpYyB2b2lkCi0gIHBzX3NpbXBsZV9zY2FsZSggUFNIX0hpbnRfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICAgICBzY2FsZSwKLSAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICAgICAgZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIGRpbWVuc2lvbiApCi0gIHsKLSAgICBGVF9VSW50ICBjb3VudDsKLQotCi0gICAgZm9yICggY291bnQgPSAwOyBjb3VudCA8IHRhYmxlLT5tYXhfaGludHM7IGNvdW50KysgKQotICAgIHsKLSAgICAgIFBTSF9IaW50ICBoaW50ID0gdGFibGUtPmhpbnRzICsgY291bnQ7Ci0KLQotICAgICAgaGludC0+Y3VyX3BvcyA9IEZUX011bEZpeCggaGludC0+b3JnX3Bvcywgc2NhbGUgKSArIGRlbHRhOwotICAgICAgaGludC0+Y3VyX2xlbiA9IEZUX011bEZpeCggaGludC0+b3JnX2xlbiwgc2NhbGUgKTsKLQotICAgICAgaWYgKCBwc19kZWJ1Z19oaW50X2Z1bmMgKQotICAgICAgICBwc19kZWJ1Z19oaW50X2Z1bmMoIGhpbnQsIGRpbWVuc2lvbiApOwotICAgIH0KLSAgfQotCi0jZW5kaWYgLyogREVCVUdfSElOVEVSICovCi0KLQotICBzdGF0aWMgRlRfRml4ZWQKLSAgcHNoX2hpbnRfc25hcF9zdGVtX3NpZGVfZGVsdGEoIEZUX0ZpeGVkICBwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgbGVuICkKLSAgewotICAgIEZUX0ZpeGVkICBkZWx0YTEgPSBGVF9QSVhfUk9VTkQoIHBvcyApIC0gcG9zOwotICAgIEZUX0ZpeGVkICBkZWx0YTIgPSBGVF9QSVhfUk9VTkQoIHBvcyArIGxlbiApIC0gcG9zIC0gbGVuOwotCi0KLSAgICBpZiAoIEZUX0FCUyggZGVsdGExICkgPD0gRlRfQUJTKCBkZWx0YTIgKSApCi0gICAgICByZXR1cm4gZGVsdGExOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBkZWx0YTI7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9oaW50X2FsaWduKCBQU0hfSGludCAgICAgaGludCwKLSAgICAgICAgICAgICAgICAgIFBTSF9HbG9iYWxzICBnbG9iYWxzLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgIGRpbWVuc2lvbiwKLSAgICAgICAgICAgICAgICAgIFBTSF9HbHlwaCAgICBnbHlwaCApCi0gIHsKLSAgICBQU0hfRGltZW5zaW9uICBkaW0gICA9ICZnbG9iYWxzLT5kaW1lbnNpb25bZGltZW5zaW9uXTsKLSAgICBGVF9GaXhlZCAgICAgICBzY2FsZSA9IGRpbS0+c2NhbGVfbXVsdDsKLSAgICBGVF9GaXhlZCAgICAgICBkZWx0YSA9IGRpbS0+c2NhbGVfZGVsdGE7Ci0KLQotICAgIGlmICggIXBzaF9oaW50X2lzX2ZpdHRlZCggaGludCApICkKLSAgICB7Ci0gICAgICBGVF9Qb3MgIHBvcyA9IEZUX011bEZpeCggaGludC0+b3JnX3Bvcywgc2NhbGUgKSArIGRlbHRhOwotICAgICAgRlRfUG9zICBsZW4gPSBGVF9NdWxGaXgoIGhpbnQtPm9yZ19sZW4sIHNjYWxlICk7Ci0KLSAgICAgIEZUX0ludCAgICAgICAgICAgIGRvX3NuYXBwaW5nOwotICAgICAgRlRfUG9zICAgICAgICAgICAgZml0X2xlbjsKLSAgICAgIFBTSF9BbGlnbm1lbnRSZWMgIGFsaWduOwotCi0KLSAgICAgIC8qIGlnbm9yZSBzdGVtIGFsaWdubWVudHMgd2hlbiByZXF1ZXN0ZWQgdGhyb3VnaCB0aGUgaGludCBmbGFncyAqLwotICAgICAgaWYgKCAoIGRpbWVuc2lvbiA9PSAwICYmICFnbHlwaC0+ZG9faG9yel9oaW50cyApIHx8Ci0gICAgICAgICAgICggZGltZW5zaW9uID09IDEgJiYgIWdseXBoLT5kb192ZXJ0X2hpbnRzICkgKQotICAgICAgewotICAgICAgICBoaW50LT5jdXJfcG9zID0gcG9zOwotICAgICAgICBoaW50LT5jdXJfbGVuID0gbGVuOwotCi0gICAgICAgIHBzaF9oaW50X3NldF9maXR0ZWQoIGhpbnQgKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICAvKiBwZXJmb3JtIHN0ZW0gc25hcHBpbmcgd2hlbiByZXF1ZXN0ZWQgLSB0aGlzIGlzIG5lY2Vzc2FyeQotICAgICAgICogZm9yIG1vbm9jaHJvbWUgYW5kIExDRCBoaW50aW5nIG1vZGVzIG9ubHkKLSAgICAgICAqLwotICAgICAgZG9fc25hcHBpbmcgPSAoIGRpbWVuc2lvbiA9PSAwICYmIGdseXBoLT5kb19ob3J6X3NuYXBwaW5nICkgfHwKLSAgICAgICAgICAgICAgICAgICAgKCBkaW1lbnNpb24gPT0gMSAmJiBnbHlwaC0+ZG9fdmVydF9zbmFwcGluZyApOwotCi0gICAgICBoaW50LT5jdXJfbGVuID0gZml0X2xlbiA9IGxlbjsKLQotICAgICAgLyogY2hlY2sgYmx1ZSB6b25lcyBmb3IgaG9yaXpvbnRhbCBzdGVtcyAqLwotICAgICAgYWxpZ24uYWxpZ24gICAgID0gUFNIX0JMVUVfQUxJR05fTk9ORTsKLSAgICAgIGFsaWduLmFsaWduX2JvdCA9IGFsaWduLmFsaWduX3RvcCA9IDA7Ci0KLSAgICAgIGlmICggZGltZW5zaW9uID09IDEgKQotICAgICAgICBwc2hfYmx1ZXNfc25hcF9zdGVtKCAmZ2xvYmFscy0+Ymx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnQtPm9yZ19wb3MgKyBoaW50LT5vcmdfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaW50LT5vcmdfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxpZ24gKTsKLQotICAgICAgc3dpdGNoICggYWxpZ24uYWxpZ24gKQotICAgICAgewotICAgICAgY2FzZSBQU0hfQkxVRV9BTElHTl9UT1A6Ci0gICAgICAgIC8qIHRoZSB0b3Agb2YgdGhlIHN0ZW0gaXMgYWxpZ25lZCBhZ2FpbnN0IGEgYmx1ZSB6b25lICovCi0gICAgICAgIGhpbnQtPmN1cl9wb3MgPSBhbGlnbi5hbGlnbl90b3AgLSBmaXRfbGVuOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBQU0hfQkxVRV9BTElHTl9CT1Q6Ci0gICAgICAgIC8qIHRoZSBib3R0b20gb2YgdGhlIHN0ZW0gaXMgYWxpZ25lZCBhZ2FpbnN0IGEgYmx1ZSB6b25lICovCi0gICAgICAgIGhpbnQtPmN1cl9wb3MgPSBhbGlnbi5hbGlnbl9ib3Q7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFBTSF9CTFVFX0FMSUdOX1RPUCB8IFBTSF9CTFVFX0FMSUdOX0JPVDoKLSAgICAgICAgLyogYm90aCBlZGdlcyBvZiB0aGUgc3RlbSBhcmUgYWxpZ25lZCBhZ2FpbnN0IGJsdWUgem9uZXMgKi8KLSAgICAgICAgaGludC0+Y3VyX3BvcyA9IGFsaWduLmFsaWduX2JvdDsKLSAgICAgICAgaGludC0+Y3VyX2xlbiA9IGFsaWduLmFsaWduX3RvcCAtIGFsaWduLmFsaWduX2JvdDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHsKLSAgICAgICAgICBQU0hfSGludCAgcGFyZW50ID0gaGludC0+cGFyZW50OwotCi0KLSAgICAgICAgICBpZiAoIHBhcmVudCApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfUG9zICBwYXJfb3JnX2NlbnRlciwgcGFyX2N1cl9jZW50ZXI7Ci0gICAgICAgICAgICBGVF9Qb3MgIGN1cl9vcmdfY2VudGVyLCBjdXJfZGVsdGE7Ci0KLQotICAgICAgICAgICAgLyogZW5zdXJlIHRoYXQgcGFyZW50IGlzIGFscmVhZHkgZml0dGVkICovCi0gICAgICAgICAgICBpZiAoICFwc2hfaGludF9pc19maXR0ZWQoIHBhcmVudCApICkKLSAgICAgICAgICAgICAgcHNoX2hpbnRfYWxpZ24oIHBhcmVudCwgZ2xvYmFscywgZGltZW5zaW9uLCBnbHlwaCApOwotCi0gICAgICAgICAgICAvKiBrZWVwIG9yaWdpbmFsIHJlbGF0aW9uIGJldHdlZW4gaGludHMsIHRoaXMgaXMsIHVzZSB0aGUgKi8KLSAgICAgICAgICAgIC8qIHNjYWxlZCBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBjZW50ZXJzIG9mIHRoZSBoaW50cyB0byAgICAqLwotICAgICAgICAgICAgLyogY29tcHV0ZSB0aGUgbmV3IHBvc2l0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwYXJfb3JnX2NlbnRlciA9IHBhcmVudC0+b3JnX3BvcyArICggcGFyZW50LT5vcmdfbGVuID4+IDEgKTsKLSAgICAgICAgICAgIHBhcl9jdXJfY2VudGVyID0gcGFyZW50LT5jdXJfcG9zICsgKCBwYXJlbnQtPmN1cl9sZW4gPj4gMSApOwotICAgICAgICAgICAgY3VyX29yZ19jZW50ZXIgPSBoaW50LT5vcmdfcG9zICAgKyAoIGhpbnQtPm9yZ19sZW4gICA+PiAxICk7Ci0KLSAgICAgICAgICAgIGN1cl9kZWx0YSA9IEZUX011bEZpeCggY3VyX29yZ19jZW50ZXIgLSBwYXJfb3JnX2NlbnRlciwgc2NhbGUgKTsKLSAgICAgICAgICAgIHBvcyAgICAgICA9IHBhcl9jdXJfY2VudGVyICsgY3VyX2RlbHRhIC0gKCBsZW4gPj4gMSApOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGhpbnQtPmN1cl9wb3MgPSBwb3M7Ci0gICAgICAgICAgaGludC0+Y3VyX2xlbiA9IGZpdF9sZW47Ci0KLSAgICAgICAgICAvKiBTdGVtIGFkanVzdG1lbnQgdHJpZXMgdG8gc25hcCBzdGVtIHdpZHRocyB0byBzdGFuZGFyZAotICAgICAgICAgICAqIG9uZXMuICBUaGlzIGlzIGltcG9ydGFudCB0byBwcmV2ZW50IHVucGxlYXNhbnQgcm91bmRpbmcKLSAgICAgICAgICAgKiBhcnRlZmFjdHMuCi0gICAgICAgICAgICovCi0gICAgICAgICAgaWYgKCBnbHlwaC0+ZG9fc3RlbV9hZGp1c3QgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggbGVuIDw9IDY0ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogdGhlIHN0ZW0gaXMgbGVzcyB0aGFuIG9uZSBwaXhlbDsgd2Ugd2lsbCBjZW50ZXIgaXQKLSAgICAgICAgICAgICAgICogYXJvdW5kIHRoZSBuZWFyZXN0IHBpeGVsIGNlbnRlcgotICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgaWYgKCBsZW4gPj0gMzIgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSB3aGVyZSB3ZSBhbHNvIHdpZGVuIHRoZSBzdGVtCi0gICAgICAgICAgICAgICAgICogYW5kIGFsaWduIGl0IHRvIHRoZSBwaXhlbCBncmlkLgotICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICogICBzdGVtX2NlbnRlciAgICAgICAgICA9IHBvcyArIChsZW4vMikKLSAgICAgICAgICAgICAgICAgKiAgIG5lYXJlc3RfcGl4ZWxfY2VudGVyID0gRlRfUk9VTkQoc3RlbV9jZW50ZXItMzIpKzMyCi0gICAgICAgICAgICAgICAgICogICBuZXdfcG9zICAgICAgICAgICAgICA9IG5lYXJlc3RfcGl4ZWxfY2VudGVyLTMyCi0gICAgICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICA9IEZUX1JPVU5EKHN0ZW1fY2VudGVyLTMyKQotICAgICAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgPSBGVF9GTE9PUihzdGVtX2NlbnRlci0zMiszMikKLSAgICAgICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgID0gRlRfRkxPT1Ioc3RlbV9jZW50ZXIpCi0gICAgICAgICAgICAgICAgICogICBuZXdfbGVuICAgICAgICAgICAgICA9IDY0Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgcG9zID0gRlRfUElYX0ZMT09SKCBwb3MgKyAoIGxlbiA+PiAxICkgKTsKLSAgICAgICAgICAgICAgICBsZW4gPSA2NDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlIGlmICggbGVuID4gMCApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIGEgdmVyeSBzbWFsbCBzdGVtOyB3ZSBzaW1wbHkgYWxpZ24gaXQgdG8gdGhlCi0gICAgICAgICAgICAgICAgICogcGl4ZWwgZ3JpZCwgdHJ5aW5nIHRvIGZpbmQgdGhlIG1pbmltdW0gZGlzcGxhY2VtZW50LgotICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICogbGVmdCAgICAgICAgICAgICAgID0gcG9zCi0gICAgICAgICAgICAgICAgICogcmlnaHQgICAgICAgICAgICAgID0gcG9zICsgbGVuCi0gICAgICAgICAgICAgICAgICogbGVmdF9uZWFyZXN0X2VkZ2UgID0gUk9VTkQocG9zKQotICAgICAgICAgICAgICAgICAqIHJpZ2h0X25lYXJlc3RfZWRnZSA9IFJPVU5EKHJpZ2h0KQotICAgICAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgICAgICogaWYgKCBBQlMobGVmdF9uZWFyZXN0X2VkZ2UgLSBsZWZ0KSA8PQotICAgICAgICAgICAgICAgICAqICAgICAgQUJTKHJpZ2h0X25lYXJlc3RfZWRnZSAtIHJpZ2h0KSApCi0gICAgICAgICAgICAgICAgICogICAgbmV3X3BvcyA9IGxlZnQKLSAgICAgICAgICAgICAgICAgKiBlbHNlCi0gICAgICAgICAgICAgICAgICogICAgbmV3X3BvcyA9IHJpZ2h0Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgRlRfUG9zICBsZWZ0X25lYXJlc3QgID0gRlRfUElYX1JPVU5EKCBwb3MgKTsKLSAgICAgICAgICAgICAgICBGVF9Qb3MgIHJpZ2h0X25lYXJlc3QgPSBGVF9QSVhfUk9VTkQoIHBvcyArIGxlbiApOwotICAgICAgICAgICAgICAgIEZUX1BvcyAgbGVmdF9kaXNwICAgICA9IGxlZnRfbmVhcmVzdCAtIHBvczsKLSAgICAgICAgICAgICAgICBGVF9Qb3MgIHJpZ2h0X2Rpc3AgICAgPSByaWdodF9uZWFyZXN0IC0gKCBwb3MgKyBsZW4gKTsKLQotCi0gICAgICAgICAgICAgICAgaWYgKCBsZWZ0X2Rpc3AgPCAwICkKLSAgICAgICAgICAgICAgICAgIGxlZnRfZGlzcCA9IC1sZWZ0X2Rpc3A7Ci0gICAgICAgICAgICAgICAgaWYgKCByaWdodF9kaXNwIDwgMCApCi0gICAgICAgICAgICAgICAgICByaWdodF9kaXNwID0gLXJpZ2h0X2Rpc3A7Ci0gICAgICAgICAgICAgICAgaWYgKCBsZWZ0X2Rpc3AgPD0gcmlnaHRfZGlzcCApCi0gICAgICAgICAgICAgICAgICBwb3MgPSBsZWZ0X25lYXJlc3Q7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgcG9zID0gcmlnaHRfbmVhcmVzdDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiB0aGlzIGlzIGEgZ2hvc3Qgc3RlbTsgd2Ugc2ltcGx5IHJvdW5kIGl0ICovCi0gICAgICAgICAgICAgICAgcG9zID0gRlRfUElYX1JPVU5EKCBwb3MgKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBsZW4gPSBwc2hfZGltZW5zaW9uX3F1YW50aXplX2xlbiggZGltLCBsZW4sIDAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBub3cgdGhhdCB3ZSBoYXZlIGEgZ29vZCBoaW50ZWQgc3RlbSB3aWR0aCwgdHJ5IHRvIHBvc2l0aW9uICovCi0gICAgICAgICAgLyogdGhlIHN0ZW0gYWxvbmcgYSBwaXhlbCBncmlkIGludGVnZXIgY29vcmRpbmF0ZSAgICAgICAgICAgICAqLwotICAgICAgICAgIGhpbnQtPmN1cl9wb3MgPSBwb3MgKyBwc2hfaGludF9zbmFwX3N0ZW1fc2lkZV9kZWx0YSggcG9zLCBsZW4gKTsKLSAgICAgICAgICBoaW50LT5jdXJfbGVuID0gbGVuOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggZG9fc25hcHBpbmcgKQotICAgICAgewotICAgICAgICBwb3MgPSBoaW50LT5jdXJfcG9zOwotICAgICAgICBsZW4gPSBoaW50LT5jdXJfbGVuOwotCi0gICAgICAgIGlmICggbGVuIDwgNjQgKQotICAgICAgICAgIGxlbiA9IDY0OwotICAgICAgICBlbHNlCi0gICAgICAgICAgbGVuID0gRlRfUElYX1JPVU5EKCBsZW4gKTsKLQotICAgICAgICBzd2l0Y2ggKCBhbGlnbi5hbGlnbiApCi0gICAgICAgIHsKLSAgICAgICAgICBjYXNlIFBTSF9CTFVFX0FMSUdOX1RPUDoKLSAgICAgICAgICAgIGhpbnQtPmN1cl9wb3MgPSBhbGlnbi5hbGlnbl90b3AgLSBsZW47Ci0gICAgICAgICAgICBoaW50LT5jdXJfbGVuID0gbGVuOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIFBTSF9CTFVFX0FMSUdOX0JPVDoKLSAgICAgICAgICAgIGhpbnQtPmN1cl9sZW4gPSBsZW47Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgUFNIX0JMVUVfQUxJR05fQk9UIHwgUFNIX0JMVUVfQUxJR05fVE9QOgotICAgICAgICAgICAgLyogZG9uJ3QgdG91Y2ggKi8KLSAgICAgICAgICAgIGJyZWFrOwotCi0KLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaGludC0+Y3VyX2xlbiA9IGxlbjsKLSAgICAgICAgICAgIGlmICggbGVuICYgNjQgKQotICAgICAgICAgICAgICBwb3MgPSBGVF9QSVhfRkxPT1IoIHBvcyArICggbGVuID4+IDEgKSApICsgMzI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHBvcyA9IEZUX1BJWF9ST1VORCggcG9zICsgKCBsZW4gPj4gMSApICk7Ci0KLSAgICAgICAgICAgIGhpbnQtPmN1cl9wb3MgPSBwb3MgLSAoIGxlbiA+PiAxICk7Ci0gICAgICAgICAgICBoaW50LT5jdXJfbGVuID0gbGVuOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHBzaF9oaW50X3NldF9maXR0ZWQoIGhpbnQgKTsKLQotI2lmZGVmIERFQlVHX0hJTlRFUgotICAgICAgaWYgKCBwc19kZWJ1Z19oaW50X2Z1bmMgKQotICAgICAgICBwc19kZWJ1Z19oaW50X2Z1bmMoIGhpbnQsIGRpbWVuc2lvbiApOwotI2VuZGlmCi0gICAgfQotICB9Ci0KLQotI2lmIDAgIC8qIG5vdCB1c2VkIGZvciBub3csIGV4cGVyaW1lbnRhbCAqLwotCi0gLyoKLSAgKiAgQSB2YXJpYW50IHRvIHBlcmZvcm0gImxpZ2h0IiBoaW50aW5nIChpLmUuIEZUX1JFTkRFUl9NT0RFX0xJR0hUKQotICAqICBvZiBzdGVtcwotICAqLwotICBzdGF0aWMgdm9pZAotICBwc2hfaGludF9hbGlnbl9saWdodCggUFNIX0hpbnQgICAgIGhpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBQU0hfR2xvYmFscyAgZ2xvYmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICBkaW1lbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBQU0hfR2x5cGggICAgZ2x5cGggKQotICB7Ci0gICAgUFNIX0RpbWVuc2lvbiAgZGltICAgPSAmZ2xvYmFscy0+ZGltZW5zaW9uW2RpbWVuc2lvbl07Ci0gICAgRlRfRml4ZWQgICAgICAgc2NhbGUgPSBkaW0tPnNjYWxlX211bHQ7Ci0gICAgRlRfRml4ZWQgICAgICAgZGVsdGEgPSBkaW0tPnNjYWxlX2RlbHRhOwotCi0KLSAgICBpZiAoICFwc2hfaGludF9pc19maXR0ZWQoIGhpbnQgKSApCi0gICAgewotICAgICAgRlRfUG9zICBwb3MgPSBGVF9NdWxGaXgoIGhpbnQtPm9yZ19wb3MsIHNjYWxlICkgKyBkZWx0YTsKLSAgICAgIEZUX1BvcyAgbGVuID0gRlRfTXVsRml4KCBoaW50LT5vcmdfbGVuLCBzY2FsZSApOwotCi0gICAgICBGVF9Qb3MgIGZpdF9sZW47Ci0KLSAgICAgIFBTSF9BbGlnbm1lbnRSZWMgIGFsaWduOwotCi0KLSAgICAgIC8qIGlnbm9yZSBzdGVtIGFsaWdubWVudHMgd2hlbiByZXF1ZXN0ZWQgdGhyb3VnaCB0aGUgaGludCBmbGFncyAqLwotICAgICAgaWYgKCAoIGRpbWVuc2lvbiA9PSAwICYmICFnbHlwaC0+ZG9faG9yel9oaW50cyApIHx8Ci0gICAgICAgICAgICggZGltZW5zaW9uID09IDEgJiYgIWdseXBoLT5kb192ZXJ0X2hpbnRzICkgKQotICAgICAgewotICAgICAgICBoaW50LT5jdXJfcG9zID0gcG9zOwotICAgICAgICBoaW50LT5jdXJfbGVuID0gbGVuOwotCi0gICAgICAgIHBzaF9oaW50X3NldF9maXR0ZWQoIGhpbnQgKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBmaXRfbGVuID0gbGVuOwotCi0gICAgICBoaW50LT5jdXJfbGVuID0gZml0X2xlbjsKLQotICAgICAgLyogY2hlY2sgYmx1ZSB6b25lcyBmb3IgaG9yaXpvbnRhbCBzdGVtcyAqLwotICAgICAgYWxpZ24uYWxpZ24gPSBQU0hfQkxVRV9BTElHTl9OT05FOwotICAgICAgYWxpZ24uYWxpZ25fYm90ID0gYWxpZ24uYWxpZ25fdG9wID0gMDsKLQotICAgICAgaWYgKCBkaW1lbnNpb24gPT0gMSApCi0gICAgICAgIHBzaF9ibHVlc19zbmFwX3N0ZW0oICZnbG9iYWxzLT5ibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludC0+b3JnX3BvcyArIGhpbnQtPm9yZ19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpbnQtPm9yZ19wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbGlnbiApOwotCi0gICAgICBzd2l0Y2ggKCBhbGlnbi5hbGlnbiApCi0gICAgICB7Ci0gICAgICBjYXNlIFBTSF9CTFVFX0FMSUdOX1RPUDoKLSAgICAgICAgLyogdGhlIHRvcCBvZiB0aGUgc3RlbSBpcyBhbGlnbmVkIGFnYWluc3QgYSBibHVlIHpvbmUgKi8KLSAgICAgICAgaGludC0+Y3VyX3BvcyA9IGFsaWduLmFsaWduX3RvcCAtIGZpdF9sZW47Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFBTSF9CTFVFX0FMSUdOX0JPVDoKLSAgICAgICAgLyogdGhlIGJvdHRvbSBvZiB0aGUgc3RlbSBpcyBhbGlnbmVkIGFnYWluc3QgYSBibHVlIHpvbmUgKi8KLSAgICAgICAgaGludC0+Y3VyX3BvcyA9IGFsaWduLmFsaWduX2JvdDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgUFNIX0JMVUVfQUxJR05fVE9QIHwgUFNIX0JMVUVfQUxJR05fQk9UOgotICAgICAgICAvKiBib3RoIGVkZ2VzIG9mIHRoZSBzdGVtIGFyZSBhbGlnbmVkIGFnYWluc3QgYmx1ZSB6b25lcyAqLwotICAgICAgICBoaW50LT5jdXJfcG9zID0gYWxpZ24uYWxpZ25fYm90OwotICAgICAgICBoaW50LT5jdXJfbGVuID0gYWxpZ24uYWxpZ25fdG9wIC0gYWxpZ24uYWxpZ25fYm90OwotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgIFBTSF9IaW50ICBwYXJlbnQgPSBoaW50LT5wYXJlbnQ7Ci0KLQotICAgICAgICAgIGlmICggcGFyZW50ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9Qb3MgIHBhcl9vcmdfY2VudGVyLCBwYXJfY3VyX2NlbnRlcjsKLSAgICAgICAgICAgIEZUX1BvcyAgY3VyX29yZ19jZW50ZXIsIGN1cl9kZWx0YTsKLQotCi0gICAgICAgICAgICAvKiBlbnN1cmUgdGhhdCBwYXJlbnQgaXMgYWxyZWFkeSBmaXR0ZWQgKi8KLSAgICAgICAgICAgIGlmICggIXBzaF9oaW50X2lzX2ZpdHRlZCggcGFyZW50ICkgKQotICAgICAgICAgICAgICBwc2hfaGludF9hbGlnbl9saWdodCggcGFyZW50LCBnbG9iYWxzLCBkaW1lbnNpb24sIGdseXBoICk7Ci0KLSAgICAgICAgICAgIHBhcl9vcmdfY2VudGVyID0gcGFyZW50LT5vcmdfcG9zICsgKCBwYXJlbnQtPm9yZ19sZW4gLyAyICk7Ci0gICAgICAgICAgICBwYXJfY3VyX2NlbnRlciA9IHBhcmVudC0+Y3VyX3BvcyArICggcGFyZW50LT5jdXJfbGVuIC8gMiApOwotICAgICAgICAgICAgY3VyX29yZ19jZW50ZXIgPSBoaW50LT5vcmdfcG9zICAgKyAoIGhpbnQtPm9yZ19sZW4gICAvIDIgKTsKLQotICAgICAgICAgICAgY3VyX2RlbHRhID0gRlRfTXVsRml4KCBjdXJfb3JnX2NlbnRlciAtIHBhcl9vcmdfY2VudGVyLCBzY2FsZSApOwotICAgICAgICAgICAgcG9zICAgICAgID0gcGFyX2N1cl9jZW50ZXIgKyBjdXJfZGVsdGEgLSAoIGxlbiA+PiAxICk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogU3RlbXMgbGVzcyB0aGFuIG9uZSBwaXhlbCB3aWRlIGFyZSBlYXN5IC0tIHdlIHdhbnQgdG8KLSAgICAgICAgICAgKiBtYWtlIHRoZW0gYXMgZGFyayBhcyBwb3NzaWJsZSwgc28gdGhleSBtdXN0IGZhbGwgd2l0aGluCi0gICAgICAgICAgICogb25lIHBpeGVsLiAgSWYgdGhlIHN0ZW0gaXMgc3BsaXQgYmV0d2VlbiB0d28gcGl4ZWxzCi0gICAgICAgICAgICogdGhlbiBzbmFwIHRoZSBlZGdlIHRoYXQgaXMgbmVhcmVyIHRvIHRoZSBwaXhlbCBib3VuZGFyeQotICAgICAgICAgICAqIHRvIHRoZSBwaXhlbCBib3VuZGFyeS4KLSAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoIGxlbiA8PSA2NCApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCAoIHBvcyArIGxlbiArIDYzICkgLyA2NCAgIT0gcG9zIC8gNjQgKyAxICkKLSAgICAgICAgICAgICAgcG9zICs9IHBzaF9oaW50X3NuYXBfc3RlbV9zaWRlX2RlbHRhICggcG9zLCBsZW4gKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBQb3NpdGlvbiBzdGVtcyBvdGhlciB0byBtaW5pbWl6ZSB0aGUgYW1vdW50IG9mIG1pZC1ncmF5cy4KLSAgICAgICAgICAgKiBUaGVyZSBhcmUsIGluIGdlbmVyYWwsIHR3byBwb3NpdGlvbnMgdGhhdCBkbyB0aGlzLAotICAgICAgICAgICAqIGlsbHVzdHJhdGVkIGFzIEEpIGFuZCBCKSBiZWxvdy4KLSAgICAgICAgICAgKgotICAgICAgICAgICAqICAgKyAgICAgICAgICAgICAgICAgICArICAgICAgICAgICAgICAgICAgICsgICAgICAgICAgICAgICAgICAgKwotICAgICAgICAgICAqCi0gICAgICAgICAgICogQSkgICAgICAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAotICAgICAgICAgICAqIEIpICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAotICAgICAgICAgICAqIEMpICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKLSAgICAgICAgICAgKgotICAgICAgICAgICAqIFBvc2l0aW9uIEEpIChzcGxpdCB0aGUgZXhjZXNzIHN0ZW0gZXF1YWxseSkgc2hvdWxkIGJlIGJldHRlcgotICAgICAgICAgICAqIGZvciBzdGVtcyBvZiB3aWR0aCBOICsgZiB3aGVyZSBmIDwgMC41LgotICAgICAgICAgICAqCi0gICAgICAgICAgICogUG9zaXRpb24gQikgKHNwbGl0IHRoZSBkZWZpY2llbmN5IGVxdWFsbHkpIHNob3VsZCBiZSBiZXR0ZXIKLSAgICAgICAgICAgKiBmb3Igc3RlbXMgb2Ygd2lkdGggTiArIGYgd2hlcmUgZiA+IDAuNS4KLSAgICAgICAgICAgKgotICAgICAgICAgICAqIEl0IHR1cm5zIG91dCB0aG91Z2ggdGhhdCBtaW5pbWl6aW5nIHRoZSB0b3RhbCBudW1iZXIgb2YgbGl0Ci0gICAgICAgICAgICogcGl4ZWxzIGlzIGFsc28gaW1wb3J0YW50LCBzbyBwb3NpdGlvbiBDKSwgd2l0aCBvbmUgZWRnZQotICAgICAgICAgICAqIGFsaWduZWQgd2l0aCBhIHBpeGVsIGJvdW5kYXJ5IGlzIGFjdHVhbGx5IHByZWZlcmFibGUKLSAgICAgICAgICAgKiB0byBBKS4gIFRoZXJlIGFyZSBhbHNvIG1vcmUgcG9zc2liaWxlIHBvc2l0aW9ucyBmb3IgQykgdGhhbgotICAgICAgICAgICAqIGZvciBBKSBvciBCKSwgc28gaXQgaW52b2x2ZXMgbGVzcyBkaXN0b3J0aW9uIG9mIHRoZSBvdmVyYWxsCi0gICAgICAgICAgICogY2hhcmFjdGVyIHNoYXBlLgotICAgICAgICAgICAqLwotICAgICAgICAgIGVsc2UgLyogbGVuID4gNjQgKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9GaXhlZCAgZnJhY19sZW4gPSBsZW4gJiA2MzsKLSAgICAgICAgICAgIEZUX0ZpeGVkICBjZW50ZXIgPSBwb3MgKyAoIGxlbiA+PiAxICk7Ci0gICAgICAgICAgICBGVF9GaXhlZCAgZGVsdGFfYSwgZGVsdGFfYjsKLQotCi0gICAgICAgICAgICBpZiAoICggbGVuIC8gNjQgKSAmIDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBkZWx0YV9hID0gRlRfUElYX0ZMT09SKCBjZW50ZXIgKSArIDMyIC0gY2VudGVyOwotICAgICAgICAgICAgICBkZWx0YV9iID0gRlRfUElYX1JPVU5EKCBjZW50ZXIgKSAtIGNlbnRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZGVsdGFfYSA9IEZUX1BJWF9ST1VORCggY2VudGVyICkgLSBjZW50ZXI7Ci0gICAgICAgICAgICAgIGRlbHRhX2IgPSBGVF9QSVhfRkxPT1IoIGNlbnRlciApICsgMzIgLSBjZW50ZXI7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFdlIGNob29zZSBiZXR3ZWVuIEIpIGFuZCBDKSBhYm92ZSBiYXNlZCBvbiB0aGUgYW1vdW50Ci0gICAgICAgICAgICAgKiBvZiBmcmFjdGluYWwgc3RlbSB3aWR0aDsgZm9yIHNtYWxsIGFtb3VudHMsIGNob29zZQotICAgICAgICAgICAgICogQykgYWx3YXlzLCBmb3IgbGFyZ2UgYW1vdW50cywgQikgYWx3YXlzLCBhbmQgaW5iZXR3ZWVuLAotICAgICAgICAgICAgICogcGljayB3aGljaGV2ZXIgb25lIGludm9sdmVzIGxlc3Mgc3RlbSBtb3ZlbWVudC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCBmcmFjX2xlbiA8IDMyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcG9zICs9IHBzaF9oaW50X3NuYXBfc3RlbV9zaWRlX2RlbHRhICggcG9zLCBsZW4gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBmcmFjX2xlbiA8IDQ4ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfRml4ZWQgIHNpZGVfZGVsdGEgPSBwc2hfaGludF9zbmFwX3N0ZW1fc2lkZV9kZWx0YSAoIHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiApOwotCi0gICAgICAgICAgICAgIGlmICggRlRfQUJTKCBzaWRlX2RlbHRhICkgPCBGVF9BQlMoIGRlbHRhX2IgKSApCi0gICAgICAgICAgICAgICAgcG9zICs9IHNpZGVfZGVsdGE7Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBwb3MgKz0gZGVsdGFfYjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcG9zICs9IGRlbHRhX2I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaGludC0+Y3VyX3BvcyA9IHBvczsKLSAgICAgICAgfQotICAgICAgfSAgLyogc3dpdGNoICovCi0KLSAgICAgIHBzaF9oaW50X3NldF9maXR0ZWQoIGhpbnQgKTsKLQotI2lmZGVmIERFQlVHX0hJTlRFUgotICAgICAgaWYgKCBwc19kZWJ1Z19oaW50X2Z1bmMgKQotICAgICAgICBwc19kZWJ1Z19oaW50X2Z1bmMoIGhpbnQsIGRpbWVuc2lvbiApOwotI2VuZGlmCi0gICAgfQotICB9Ci0KLSNlbmRpZiAvKiAwICovCi0KLQotICBzdGF0aWMgdm9pZAotICBwc2hfaGludF90YWJsZV9hbGlnbl9oaW50cyggUFNIX0hpbnRfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNIX0dsb2JhbHMgICAgIGdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgZGltZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNIX0dseXBoICAgICAgIGdseXBoICkKLSAgewotICAgIFBTSF9IaW50ICAgICAgIGhpbnQ7Ci0gICAgRlRfVUludCAgICAgICAgY291bnQ7Ci0KLSNpZmRlZiBERUJVR19ISU5URVIKLQotICAgIFBTSF9EaW1lbnNpb24gIGRpbSAgID0gJmdsb2JhbHMtPmRpbWVuc2lvbltkaW1lbnNpb25dOwotICAgIEZUX0ZpeGVkICAgICAgIHNjYWxlID0gZGltLT5zY2FsZV9tdWx0OwotICAgIEZUX0ZpeGVkICAgICAgIGRlbHRhID0gZGltLT5zY2FsZV9kZWx0YTsKLQotCi0gICAgaWYgKCBwc19kZWJ1Z19ub192ZXJ0X2hpbnRzICYmIGRpbWVuc2lvbiA9PSAwICkKLSAgICB7Ci0gICAgICBwc19zaW1wbGVfc2NhbGUoIHRhYmxlLCBzY2FsZSwgZGVsdGEsIGRpbWVuc2lvbiApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICggcHNfZGVidWdfbm9faG9yel9oaW50cyAmJiBkaW1lbnNpb24gPT0gMSApCi0gICAgewotICAgICAgcHNfc2ltcGxlX3NjYWxlKCB0YWJsZSwgc2NhbGUsIGRlbHRhLCBkaW1lbnNpb24gKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSNlbmRpZiAvKiBERUJVR19ISU5URVIqLwotCi0gICAgaGludCAgPSB0YWJsZS0+aGludHM7Ci0gICAgY291bnQgPSB0YWJsZS0+bWF4X2hpbnRzOwotCi0gICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIGhpbnQrKyApCi0gICAgICBwc2hfaGludF9hbGlnbiggaGludCwgZ2xvYmFscywgZGltZW5zaW9uLCBnbHlwaCApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgUE9JTlRTIElOVEVSUE9MQVRJT04gUk9VVElORVMgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSB4eERFQlVHX1pPTkVTCi0KLQotI2lmZGVmIERFQlVHX1pPTkVTCi0KLSNpbmNsdWRlIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0gKLQotICBzdGF0aWMgdm9pZAotICBwc2hfcHJpbnRfem9uZSggUFNIX1pvbmUgIHpvbmUgKQotICB7Ci0gICAgcHJpbnRmKCAiem9uZSBbc2NhbGUsZGVsdGEsbWluLG1heF0gPSBbJS4zZiwlLjNmLCVkLCVkXVxuIiwKLSAgICAgICAgICAgICB6b25lLT5zY2FsZSAvIDY1NTM2LjAsCi0gICAgICAgICAgICAgem9uZS0+ZGVsdGEgLyA2NC4wLAotICAgICAgICAgICAgIHpvbmUtPm1pbiwKLSAgICAgICAgICAgICB6b25lLT5tYXggKTsKLSAgfQotCi0jZW5kaWYgLyogREVCVUdfWk9ORVMgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgSElOVEVSIEdMWVBIIE1BTkFHRU1FTlQgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lICBwc2hfY29ybmVyX2lzX2ZsYXQgICAgICBmdF9jb3JuZXJfaXNfZmxhdAotI2RlZmluZSAgcHNoX2Nvcm5lcl9vcmllbnRhdGlvbiAgZnRfY29ybmVyX29yaWVudGF0aW9uCi0KLQotI2lmZGVmIENPTVBVVEVfSU5GTEVYUwotCi0gIC8qIGNvbXB1dGUgYWxsIGluZmxleCBwb2ludHMgaW4gYSBnaXZlbiBnbHlwaCAqLwotICBzdGF0aWMgdm9pZAotICBwc2hfZ2x5cGhfY29tcHV0ZV9pbmZsZWN0aW9ucyggUFNIX0dseXBoICBnbHlwaCApCi0gIHsKLSAgICBGVF9VSW50ICBuOwotCi0KLSAgICBmb3IgKCBuID0gMDsgbiA8IGdseXBoLT5udW1fY29udG91cnM7IG4rKyApCi0gICAgewotICAgICAgUFNIX1BvaW50ICBmaXJzdCwgc3RhcnQsIGVuZCwgYmVmb3JlLCBhZnRlcjsKLSAgICAgIEZUX1BvcyAgICAgaW5feCwgaW5feSwgb3V0X3gsIG91dF95OwotICAgICAgRlRfSW50ICAgICBvcmllbnRfcHJldiwgb3JpZW50X2N1cjsKLSAgICAgIEZUX0ludCAgICAgZmluaXNoZWQgPSAwOwotCi0KLSAgICAgIC8qIHdlIG5lZWQgYXQgbGVhc3QgNCBwb2ludHMgdG8gY3JlYXRlIGFuIGluZmxlY3Rpb24gcG9pbnQgKi8KLSAgICAgIGlmICggZ2x5cGgtPmNvbnRvdXJzW25dLmNvdW50IDwgNCApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAvKiBjb21wdXRlIGZpcnN0IHNlZ21lbnQgaW4gY29udG91ciAqLwotICAgICAgZmlyc3QgPSBnbHlwaC0+Y29udG91cnNbbl0uc3RhcnQ7Ci0KLSAgICAgIHN0YXJ0ID0gZW5kID0gZmlyc3Q7Ci0gICAgICBkbwotICAgICAgewotICAgICAgICBlbmQgPSBlbmQtPm5leHQ7Ci0gICAgICAgIGlmICggZW5kID09IGZpcnN0ICkKLSAgICAgICAgICBnb3RvIFNraXA7Ci0KLSAgICAgICAgaW5feCA9IGVuZC0+b3JnX3UgLSBzdGFydC0+b3JnX3U7Ci0gICAgICAgIGluX3kgPSBlbmQtPm9yZ192IC0gc3RhcnQtPm9yZ192OwotCi0gICAgICB9IHdoaWxlICggaW5feCA9PSAwICYmIGluX3kgPT0gMCApOwotCi0gICAgICAvKiBleHRlbmQgdGhlIHNlZ21lbnQgc3RhcnQgd2hlbmV2ZXIgcG9zc2libGUgKi8KLSAgICAgIGJlZm9yZSA9IHN0YXJ0OwotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgIHN0YXJ0ICA9IGJlZm9yZTsKLSAgICAgICAgICBiZWZvcmUgPSBiZWZvcmUtPnByZXY7Ci0gICAgICAgICAgaWYgKCBiZWZvcmUgPT0gZmlyc3QgKQotICAgICAgICAgICAgZ290byBTa2lwOwotCi0gICAgICAgICAgb3V0X3ggPSBzdGFydC0+b3JnX3UgLSBiZWZvcmUtPm9yZ191OwotICAgICAgICAgIG91dF95ID0gc3RhcnQtPm9yZ192IC0gYmVmb3JlLT5vcmdfdjsKLQotICAgICAgICB9IHdoaWxlICggb3V0X3ggPT0gMCAmJiBvdXRfeSA9PSAwICk7Ci0KLSAgICAgICAgb3JpZW50X3ByZXYgPSBwc2hfY29ybmVyX29yaWVudGF0aW9uKCBpbl94LCBpbl95LCBvdXRfeCwgb3V0X3kgKTsKLQotICAgICAgfSB3aGlsZSAoIG9yaWVudF9wcmV2ID09IDAgKTsKLQotICAgICAgZmlyc3QgPSBzdGFydDsKLSAgICAgIGluX3ggID0gb3V0X3g7Ci0gICAgICBpbl95ICA9IG91dF95OwotCi0gICAgICAvKiBub3csIHByb2Nlc3MgYWxsIHNlZ21lbnRzIGluIHRoZSBjb250b3VyICovCi0gICAgICBkbwotICAgICAgewotICAgICAgICAvKiBmaXJzdCwgZXh0ZW5kIGN1cnJlbnQgc2VnbWVudCdzIGVuZCB3aGVuZXZlciBwb3NzaWJsZSAqLwotICAgICAgICBhZnRlciA9IGVuZDsKLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgIGRvCi0gICAgICAgICAgewotICAgICAgICAgICAgZW5kICAgPSBhZnRlcjsKLSAgICAgICAgICAgIGFmdGVyID0gYWZ0ZXItPm5leHQ7Ci0gICAgICAgICAgICBpZiAoIGFmdGVyID09IGZpcnN0ICkKLSAgICAgICAgICAgICAgZmluaXNoZWQgPSAxOwotCi0gICAgICAgICAgICBvdXRfeCA9IGFmdGVyLT5vcmdfdSAtIGVuZC0+b3JnX3U7Ci0gICAgICAgICAgICBvdXRfeSA9IGFmdGVyLT5vcmdfdiAtIGVuZC0+b3JnX3Y7Ci0KLSAgICAgICAgICB9IHdoaWxlICggb3V0X3ggPT0gMCAmJiBvdXRfeSA9PSAwICk7Ci0KLSAgICAgICAgICBvcmllbnRfY3VyID0gcHNoX2Nvcm5lcl9vcmllbnRhdGlvbiggaW5feCwgaW5feSwgb3V0X3gsIG91dF95ICk7Ci0KLSAgICAgICAgfSB3aGlsZSAoIG9yaWVudF9jdXIgPT0gMCApOwotCi0gICAgICAgIGlmICggKCBvcmllbnRfY3VyIF4gb3JpZW50X3ByZXYgKSA8IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgZG8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwc2hfcG9pbnRfc2V0X2luZmxleCggc3RhcnQgKTsKLSAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnQtPm5leHQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIHdoaWxlICggc3RhcnQgIT0gZW5kICk7Ci0KLSAgICAgICAgICBwc2hfcG9pbnRfc2V0X2luZmxleCggc3RhcnQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXJ0ICAgICAgID0gZW5kOwotICAgICAgICBlbmQgICAgICAgICA9IGFmdGVyOwotICAgICAgICBvcmllbnRfcHJldiA9IG9yaWVudF9jdXI7Ci0gICAgICAgIGluX3ggICAgICAgID0gb3V0X3g7Ci0gICAgICAgIGluX3kgICAgICAgID0gb3V0X3k7Ci0KLSAgICAgIH0gd2hpbGUgKCAhZmluaXNoZWQgKTsKLQotICAgIFNraXA6Ci0gICAgICA7Ci0gICAgfQotICB9Ci0KLSNlbmRpZiAvKiBDT01QVVRFX0lORkxFWFMgKi8KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9nbHlwaF9kb25lKCBQU0hfR2x5cGggIGdseXBoICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gZ2x5cGgtPm1lbW9yeTsKLQotCi0gICAgcHNoX2hpbnRfdGFibGVfZG9uZSggJmdseXBoLT5oaW50X3RhYmxlc1sxXSwgbWVtb3J5ICk7Ci0gICAgcHNoX2hpbnRfdGFibGVfZG9uZSggJmdseXBoLT5oaW50X3RhYmxlc1swXSwgbWVtb3J5ICk7Ci0KLSAgICBGVF9GUkVFKCBnbHlwaC0+cG9pbnRzICk7Ci0gICAgRlRfRlJFRSggZ2x5cGgtPmNvbnRvdXJzICk7Ci0KLSAgICBnbHlwaC0+bnVtX3BvaW50cyAgID0gMDsKLSAgICBnbHlwaC0+bnVtX2NvbnRvdXJzID0gMDsKLQotICAgIGdseXBoLT5tZW1vcnkgPSBOVUxMOwotICB9Ci0KLQotICBzdGF0aWMgaW50Ci0gIHBzaF9jb21wdXRlX2RpciggRlRfUG9zICBkeCwKLSAgICAgICAgICAgICAgICAgICBGVF9Qb3MgIGR5ICkKLSAgewotICAgIEZUX1BvcyAgYXgsIGF5OwotICAgIGludCAgICAgcmVzdWx0ID0gUFNIX0RJUl9OT05FOwotCi0KLSAgICBheCA9IEZUX0FCUyggZHggKTsKLSAgICBheSA9IEZUX0FCUyggZHkgKTsKLQotICAgIGlmICggYXkgKiAxMiA8IGF4ICkKLSAgICB7Ci0gICAgICAvKiB8ZHl8IDw8PCB8ZHh8ICBtZWFucyBhIG5lYXItaG9yaXpvbnRhbCBzZWdtZW50ICovCi0gICAgICByZXN1bHQgPSAoIGR4ID49IDAgKSA/IFBTSF9ESVJfUklHSFQgOiBQU0hfRElSX0xFRlQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBheCAqIDEyIDwgYXkgKQotICAgIHsKLSAgICAgIC8qIHxkeHwgPDw8IHxkeXwgIG1lYW5zIGEgbmVhci12ZXJ0aWNhbCBzZWdtZW50ICovCi0gICAgICByZXN1bHQgPSAoIGR5ID49IDAgKSA/IFBTSF9ESVJfVVAgOiBQU0hfRElSX0RPV047Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyogbG9hZCBvdXRsaW5lIHBvaW50IGNvb3JkaW5hdGVzIGludG8gaGludGVyIGdseXBoICovCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9nbHlwaF9sb2FkX3BvaW50cyggUFNIX0dseXBoICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGRpbWVuc2lvbiApCi0gIHsKLSAgICBGVF9WZWN0b3IqICB2ZWMgICA9IGdseXBoLT5vdXRsaW5lLT5wb2ludHM7Ci0gICAgUFNIX1BvaW50ICAgcG9pbnQgPSBnbHlwaC0+cG9pbnRzOwotICAgIEZUX1VJbnQgICAgIGNvdW50ID0gZ2x5cGgtPm51bV9wb2ludHM7Ci0KLQotICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBwb2ludCsrLCB2ZWMrKyApCi0gICAgewotICAgICAgcG9pbnQtPmZsYWdzMiA9IDA7Ci0gICAgICBwb2ludC0+aGludCAgID0gTlVMTDsKLSAgICAgIGlmICggZGltZW5zaW9uID09IDAgKQotICAgICAgewotICAgICAgICBwb2ludC0+b3JnX3UgPSB2ZWMtPng7Ci0gICAgICAgIHBvaW50LT5vcmdfdiA9IHZlYy0+eTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcG9pbnQtPm9yZ191ID0gdmVjLT55OwotICAgICAgICBwb2ludC0+b3JnX3YgPSB2ZWMtPng7Ci0gICAgICB9Ci0KLSNpZmRlZiBERUJVR19ISU5URVIKLSAgICAgIHBvaW50LT5vcmdfeCA9IHZlYy0+eDsKLSAgICAgIHBvaW50LT5vcmdfeSA9IHZlYy0+eTsKLSNlbmRpZgotCi0gICAgfQotICB9Ci0KLQotICAvKiBzYXZlIGhpbnRlZCBwb2ludCBjb29yZGluYXRlcyBiYWNrIHRvIG91dGxpbmUgKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2dseXBoX3NhdmVfcG9pbnRzKCBQU0hfR2x5cGggIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgZGltZW5zaW9uICkKLSAgewotICAgIEZUX1VJbnQgICAgIG47Ci0gICAgUFNIX1BvaW50ICAgcG9pbnQgPSBnbHlwaC0+cG9pbnRzOwotICAgIEZUX1ZlY3RvciogIHZlYyAgID0gZ2x5cGgtPm91dGxpbmUtPnBvaW50czsKLSAgICBjaGFyKiAgICAgICB0YWdzICA9IGdseXBoLT5vdXRsaW5lLT50YWdzOwotCi0KLSAgICBmb3IgKCBuID0gMDsgbiA8IGdseXBoLT5udW1fcG9pbnRzOyBuKysgKQotICAgIHsKLSAgICAgIGlmICggZGltZW5zaW9uID09IDAgKQotICAgICAgICB2ZWNbbl0ueCA9IHBvaW50LT5jdXJfdTsKLSAgICAgIGVsc2UKLSAgICAgICAgdmVjW25dLnkgPSBwb2ludC0+Y3VyX3U7Ci0KLSAgICAgIGlmICggcHNoX3BvaW50X2lzX3N0cm9uZyggcG9pbnQgKSApCi0gICAgICAgIHRhZ3Nbbl0gfD0gKGNoYXIpKCAoIGRpbWVuc2lvbiA9PSAwICkgPyAzMiA6IDY0ICk7Ci0KLSNpZmRlZiBERUJVR19ISU5URVIKLQotICAgICAgaWYgKCBkaW1lbnNpb24gPT0gMCApCi0gICAgICB7Ci0gICAgICAgIHBvaW50LT5jdXJfeCAgID0gcG9pbnQtPmN1cl91OwotICAgICAgICBwb2ludC0+ZmxhZ3NfeCA9IHBvaW50LT5mbGFnczIgfCBwb2ludC0+ZmxhZ3M7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHBvaW50LT5jdXJfeSAgID0gcG9pbnQtPmN1cl91OwotICAgICAgICBwb2ludC0+ZmxhZ3NfeSA9IHBvaW50LT5mbGFnczIgfCBwb2ludC0+ZmxhZ3M7Ci0gICAgICB9Ci0KLSNlbmRpZgotCi0gICAgICBwb2ludCsrOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHBzaF9nbHlwaF9pbml0KCBQU0hfR2x5cGggICAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgIFBTX0hpbnRzICAgICBwc19oaW50cywKLSAgICAgICAgICAgICAgICAgIFBTSF9HbG9iYWxzICBnbG9iYWxzICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnk7Ci0KLQotICAgIC8qIGNsZWFyIGFsbCBmaWVsZHMgKi8KLSAgICBGVF9NRU1fWkVSTyggZ2x5cGgsIHNpemVvZiAoICpnbHlwaCApICk7Ci0KLSAgICBtZW1vcnkgPSBnbHlwaC0+bWVtb3J5ID0gZ2xvYmFscy0+bWVtb3J5OwotCi0gICAgLyogYWxsb2NhdGUgYW5kIHNldHVwIHBvaW50cyArIGNvbnRvdXJzIGFycmF5cyAqLwotICAgIGlmICggRlRfTkVXX0FSUkFZKCBnbHlwaC0+cG9pbnRzLCAgIG91dGxpbmUtPm5fcG9pbnRzICAgKSB8fAotICAgICAgICAgRlRfTkVXX0FSUkFZKCBnbHlwaC0+Y29udG91cnMsIG91dGxpbmUtPm5fY29udG91cnMgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBnbHlwaC0+bnVtX3BvaW50cyAgID0gKEZUX1VJbnQpb3V0bGluZS0+bl9wb2ludHM7Ci0gICAgZ2x5cGgtPm51bV9jb250b3VycyA9IChGVF9VSW50KW91dGxpbmUtPm5fY29udG91cnM7Ci0KLSAgICB7Ci0gICAgICBGVF9VSW50ICAgICAgZmlyc3QgPSAwLCBuZXh0LCBuOwotICAgICAgUFNIX1BvaW50ICAgIHBvaW50cyAgPSBnbHlwaC0+cG9pbnRzOwotICAgICAgUFNIX0NvbnRvdXIgIGNvbnRvdXIgPSBnbHlwaC0+Y29udG91cnM7Ci0KLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBnbHlwaC0+bnVtX2NvbnRvdXJzOyBuKysgKQotICAgICAgewotICAgICAgICBGVF9VSW50ICAgIGNvdW50OwotICAgICAgICBQU0hfUG9pbnQgIHBvaW50OwotCi0KLSAgICAgICAgbmV4dCAgPSAoRlRfVUludClvdXRsaW5lLT5jb250b3Vyc1tuXSArIDE7Ci0gICAgICAgIGNvdW50ID0gbmV4dCAtIGZpcnN0OwotCi0gICAgICAgIGNvbnRvdXItPnN0YXJ0ID0gcG9pbnRzICsgZmlyc3Q7Ci0gICAgICAgIGNvbnRvdXItPmNvdW50ID0gY291bnQ7Ci0KLSAgICAgICAgaWYgKCBjb3VudCA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgcG9pbnQgPSBwb2ludHMgKyBmaXJzdDsKLQotICAgICAgICAgIHBvaW50LT5wcmV2ICAgID0gcG9pbnRzICsgbmV4dCAtIDE7Ci0gICAgICAgICAgcG9pbnQtPmNvbnRvdXIgPSBjb250b3VyOwotCi0gICAgICAgICAgZm9yICggOyBjb3VudCA+IDE7IGNvdW50LS0gKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBvaW50WzBdLm5leHQgPSBwb2ludCArIDE7Ci0gICAgICAgICAgICBwb2ludFsxXS5wcmV2ID0gcG9pbnQ7Ci0gICAgICAgICAgICBwb2ludCsrOwotICAgICAgICAgICAgcG9pbnQtPmNvbnRvdXIgPSBjb250b3VyOwotICAgICAgICAgIH0KLSAgICAgICAgICBwb2ludC0+bmV4dCA9IHBvaW50cyArIGZpcnN0OwotICAgICAgICB9Ci0KLSAgICAgICAgY29udG91cisrOwotICAgICAgICBmaXJzdCA9IG5leHQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgewotICAgICAgUFNIX1BvaW50ICAgcG9pbnRzID0gZ2x5cGgtPnBvaW50czsKLSAgICAgIFBTSF9Qb2ludCAgIHBvaW50ICA9IHBvaW50czsKLSAgICAgIEZUX1ZlY3RvciogIHZlYyAgICA9IG91dGxpbmUtPnBvaW50czsKLSAgICAgIEZUX1VJbnQgICAgIG47Ci0KLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBnbHlwaC0+bnVtX3BvaW50czsgbisrLCBwb2ludCsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfSW50ICBuX3ByZXYgPSAoRlRfSW50KSggcG9pbnQtPnByZXYgLSBwb2ludHMgKTsKLSAgICAgICAgRlRfSW50ICBuX25leHQgPSAoRlRfSW50KSggcG9pbnQtPm5leHQgLSBwb2ludHMgKTsKLSAgICAgICAgRlRfUG9zICBkeGksIGR5aSwgZHhvLCBkeW87Ci0KLQotICAgICAgICBpZiAoICEoIG91dGxpbmUtPnRhZ3Nbbl0gJiBGVF9DVVJWRV9UQUdfT04gKSApCi0gICAgICAgICAgcG9pbnQtPmZsYWdzID0gUFNIX1BPSU5UX09GRjsKLQotICAgICAgICBkeGkgPSB2ZWNbbl0ueCAtIHZlY1tuX3ByZXZdLng7Ci0gICAgICAgIGR5aSA9IHZlY1tuXS55IC0gdmVjW25fcHJldl0ueTsKLQotICAgICAgICBwb2ludC0+ZGlyX2luID0gKEZUX0NoYXIpcHNoX2NvbXB1dGVfZGlyKCBkeGksIGR5aSApOwotCi0gICAgICAgIGR4byA9IHZlY1tuX25leHRdLnggLSB2ZWNbbl0ueDsKLSAgICAgICAgZHlvID0gdmVjW25fbmV4dF0ueSAtIHZlY1tuXS55OwotCi0gICAgICAgIHBvaW50LT5kaXJfb3V0ID0gKEZUX0NoYXIpcHNoX2NvbXB1dGVfZGlyKCBkeG8sIGR5byApOwotCi0gICAgICAgIC8qIGRldGVjdCBzbW9vdGggcG9pbnRzICovCi0gICAgICAgIGlmICggcG9pbnQtPmZsYWdzICYgUFNIX1BPSU5UX09GRiApCi0gICAgICAgICAgcG9pbnQtPmZsYWdzIHw9IFBTSF9QT0lOVF9TTU9PVEg7Ci0KLSAgICAgICAgZWxzZSBpZiAoIHBvaW50LT5kaXJfaW4gPT0gcG9pbnQtPmRpcl9vdXQgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBwb2ludC0+ZGlyX291dCAhPSBQU0hfRElSX05PTkUgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICBwc2hfY29ybmVyX2lzX2ZsYXQoIGR4aSwgZHlpLCBkeG8sIGR5byApICkKLSAgICAgICAgICAgIHBvaW50LT5mbGFncyB8PSBQU0hfUE9JTlRfU01PT1RIOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZ2x5cGgtPm91dGxpbmUgPSBvdXRsaW5lOwotICAgIGdseXBoLT5nbG9iYWxzID0gZ2xvYmFsczsKLQotI2lmZGVmIENPTVBVVEVfSU5GTEVYUwotICAgIHBzaF9nbHlwaF9sb2FkX3BvaW50cyggZ2x5cGgsIDAgKTsKLSAgICBwc2hfZ2x5cGhfY29tcHV0ZV9pbmZsZWN0aW9ucyggZ2x5cGggKTsKLSNlbmRpZiAvKiBDT01QVVRFX0lORkxFWFMgKi8KLQotICAgIC8qIG5vdyBkZWFsIHdpdGggaGludHMgdGFibGVzICovCi0gICAgZXJyb3IgPSBwc2hfaGludF90YWJsZV9pbml0KCAmZ2x5cGgtPmhpbnRfdGFibGVzIFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc19oaW50cy0+ZGltZW5zaW9uWzBdLmhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzX2hpbnRzLT5kaW1lbnNpb25bMF0ubWFza3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHNfaGludHMtPmRpbWVuc2lvblswXS5jb3VudGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZXJyb3IgPSBwc2hfaGludF90YWJsZV9pbml0KCAmZ2x5cGgtPmhpbnRfdGFibGVzIFsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwc19oaW50cy0+ZGltZW5zaW9uWzFdLmhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBzX2hpbnRzLT5kaW1lbnNpb25bMV0ubWFza3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHNfaGludHMtPmRpbWVuc2lvblsxXS5jb3VudGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBjb21wdXRlIGFsbCBleHRyZW1hIGluIGEgZ2x5cGggZm9yIGEgZ2l2ZW4gZGltZW5zaW9uICovCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9nbHlwaF9jb21wdXRlX2V4dHJlbWEoIFBTSF9HbHlwaCAgZ2x5cGggKQotICB7Ci0gICAgRlRfVUludCAgbjsKLQotCi0gICAgLyogZmlyc3Qgb2YgYWxsLCBjb21wdXRlIGFsbCBsb2NhbCBleHRyZW1hICovCi0gICAgZm9yICggbiA9IDA7IG4gPCBnbHlwaC0+bnVtX2NvbnRvdXJzOyBuKysgKQotICAgIHsKLSAgICAgIFBTSF9Qb2ludCAgZmlyc3QgPSBnbHlwaC0+Y29udG91cnNbbl0uc3RhcnQ7Ci0gICAgICBQU0hfUG9pbnQgIHBvaW50LCBiZWZvcmUsIGFmdGVyOwotCi0KLSAgICAgIGlmICggZ2x5cGgtPmNvbnRvdXJzW25dLmNvdW50ID09IDAgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgcG9pbnQgID0gZmlyc3Q7Ci0gICAgICBiZWZvcmUgPSBwb2ludDsKLQotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgYmVmb3JlID0gYmVmb3JlLT5wcmV2OwotICAgICAgICBpZiAoIGJlZm9yZSA9PSBmaXJzdCApCi0gICAgICAgICAgZ290byBTa2lwOwotCi0gICAgICB9IHdoaWxlICggYmVmb3JlLT5vcmdfdSA9PSBwb2ludC0+b3JnX3UgKTsKLQotICAgICAgZmlyc3QgPSBwb2ludCA9IGJlZm9yZS0+bmV4dDsKLQotICAgICAgZm9yICg7OykKLSAgICAgIHsKLSAgICAgICAgYWZ0ZXIgPSBwb2ludDsKLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgIGFmdGVyID0gYWZ0ZXItPm5leHQ7Ci0gICAgICAgICAgaWYgKCBhZnRlciA9PSBmaXJzdCApCi0gICAgICAgICAgICBnb3RvIE5leHQ7Ci0KLSAgICAgICAgfSB3aGlsZSAoIGFmdGVyLT5vcmdfdSA9PSBwb2ludC0+b3JnX3UgKTsKLQotICAgICAgICBpZiAoIGJlZm9yZS0+b3JnX3UgPCBwb2ludC0+b3JnX3UgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBhZnRlci0+b3JnX3UgPCBwb2ludC0+b3JnX3UgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIGxvY2FsIG1heGltdW0gKi8KLSAgICAgICAgICAgIGdvdG8gRXh0cmVtdW07Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgLyogYmVmb3JlLT5vcmdfdSA+IHBvaW50LT5vcmdfdSAqLwotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBhZnRlci0+b3JnX3UgPiBwb2ludC0+b3JnX3UgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIGxvY2FsIG1pbmltdW0gKi8KLSAgICAgICAgICBFeHRyZW11bToKLSAgICAgICAgICAgIGRvCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBzaF9wb2ludF9zZXRfZXh0cmVtdW0oIHBvaW50ICk7Ci0gICAgICAgICAgICAgIHBvaW50ID0gcG9pbnQtPm5leHQ7Ci0KLSAgICAgICAgICAgIH0gd2hpbGUgKCBwb2ludCAhPSBhZnRlciApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJlZm9yZSA9IGFmdGVyLT5wcmV2OwotICAgICAgICBwb2ludCAgPSBhZnRlcjsKLQotICAgICAgfSAvKiBmb3IgICovCi0KLSAgICBOZXh0OgotICAgICAgOwotICAgIH0KLQotICAgIC8qIGZvciBlYWNoIGV4dHJlbXVtLCBkZXRlcm1pbmUgaXRzIGRpcmVjdGlvbiBhbG9uZyB0aGUgKi8KLSAgICAvKiBvcnRob2dvbmFsIGF4aXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZm9yICggbiA9IDA7IG4gPCBnbHlwaC0+bnVtX3BvaW50czsgbisrICkKLSAgICB7Ci0gICAgICBQU0hfUG9pbnQgIHBvaW50LCBiZWZvcmUsIGFmdGVyOwotCi0KLSAgICAgIHBvaW50ICA9ICZnbHlwaC0+cG9pbnRzW25dOwotICAgICAgYmVmb3JlID0gcG9pbnQ7Ci0gICAgICBhZnRlciAgPSBwb2ludDsKLQotICAgICAgaWYgKCBwc2hfcG9pbnRfaXNfZXh0cmVtdW0oIHBvaW50ICkgKQotICAgICAgewotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgYmVmb3JlID0gYmVmb3JlLT5wcmV2OwotICAgICAgICAgIGlmICggYmVmb3JlID09IHBvaW50ICkKLSAgICAgICAgICAgIGdvdG8gU2tpcDsKLQotICAgICAgICB9IHdoaWxlICggYmVmb3JlLT5vcmdfdiA9PSBwb2ludC0+b3JnX3YgKTsKLQotICAgICAgICBkbwotICAgICAgICB7Ci0gICAgICAgICAgYWZ0ZXIgPSBhZnRlci0+bmV4dDsKLSAgICAgICAgICBpZiAoIGFmdGVyID09IHBvaW50ICkKLSAgICAgICAgICAgIGdvdG8gU2tpcDsKLQotICAgICAgICB9IHdoaWxlICggYWZ0ZXItPm9yZ192ID09IHBvaW50LT5vcmdfdiApOwotICAgICAgfQotCi0gICAgICBpZiAoIGJlZm9yZS0+b3JnX3YgPCBwb2ludC0+b3JnX3YgJiYKLSAgICAgICAgICAgYWZ0ZXItPm9yZ192ICA+IHBvaW50LT5vcmdfdiApCi0gICAgICB7Ci0gICAgICAgIHBzaF9wb2ludF9zZXRfcG9zaXRpdmUoIHBvaW50ICk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggYmVmb3JlLT5vcmdfdiA+IHBvaW50LT5vcmdfdiAmJgotICAgICAgICAgICAgICAgIGFmdGVyLT5vcmdfdiAgPCBwb2ludC0+b3JnX3YgKQotICAgICAgewotICAgICAgICBwc2hfcG9pbnRfc2V0X25lZ2F0aXZlKCBwb2ludCApOwotICAgICAgfQotCi0gICAgU2tpcDoKLSAgICAgIDsKLSAgICB9Ci0gIH0KLQotCi0gIC8qIG1ham9yX2RpciBpcyB0aGUgZGlyZWN0aW9uIGZvciBwb2ludHMgb24gdGhlIGJvdHRvbS9sZWZ0IG9mIHRoZSBzdGVtOyAqLwotICAvKiBQb2ludHMgb24gdGhlIHRvcC9yaWdodCBvZiB0aGUgc3RlbSB3aWxsIGhhdmUgYSBkaXJlY3Rpb24gb2YgICAgICAgICAgKi8KLSAgLyogLW1ham9yX2Rpci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2hpbnRfdGFibGVfZmluZF9zdHJvbmdfcG9pbnRzKCBQU0hfSGludF9UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNIX1BvaW50ICAgICAgIHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgdGhyZXNob2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICBtYWpvcl9kaXIgKQotICB7Ci0gICAgUFNIX0hpbnQqICBzb3J0ICAgICAgPSB0YWJsZS0+c29ydDsKLSAgICBGVF9VSW50ICAgIG51bV9oaW50cyA9IHRhYmxlLT5udW1faGludHM7Ci0KLQotICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBwb2ludCsrICkKLSAgICB7Ci0gICAgICBGVF9JbnQgIHBvaW50X2RpciA9IDA7Ci0gICAgICBGVF9Qb3MgIG9yZ191ICAgICA9IHBvaW50LT5vcmdfdTsKLQotCi0gICAgICBpZiAoIHBzaF9wb2ludF9pc19zdHJvbmcoIHBvaW50ICkgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgaWYgKCBQU0hfRElSX0NPTVBBUkUoIHBvaW50LT5kaXJfaW4sIG1ham9yX2RpciApICkKLSAgICAgICAgcG9pbnRfZGlyID0gcG9pbnQtPmRpcl9pbjsKLQotICAgICAgZWxzZSBpZiAoIFBTSF9ESVJfQ09NUEFSRSggcG9pbnQtPmRpcl9vdXQsIG1ham9yX2RpciApICkKLSAgICAgICAgcG9pbnRfZGlyID0gcG9pbnQtPmRpcl9vdXQ7Ci0KLSAgICAgIGlmICggcG9pbnRfZGlyICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBwb2ludF9kaXIgPT0gbWFqb3JfZGlyICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgIG5uOwotCi0KLSAgICAgICAgICBmb3IgKCBubiA9IDA7IG5uIDwgbnVtX2hpbnRzOyBubisrICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBQU0hfSGludCAgaGludCA9IHNvcnRbbm5dOwotICAgICAgICAgICAgRlRfUG9zICAgIGQgICAgPSBvcmdfdSAtIGhpbnQtPm9yZ19wb3M7Ci0KLQotICAgICAgICAgICAgaWYgKCBkIDwgdGhyZXNob2xkICYmIC1kIDwgdGhyZXNob2xkICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHNoX3BvaW50X3NldF9zdHJvbmcoIHBvaW50ICk7Ci0gICAgICAgICAgICAgIHBvaW50LT5mbGFnczIgfD0gUFNIX1BPSU5UX0VER0VfTUlOOwotICAgICAgICAgICAgICBwb2ludC0+aGludCAgICA9IGhpbnQ7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggcG9pbnRfZGlyID09IC1tYWpvcl9kaXIgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUludCAgbm47Ci0KLQotICAgICAgICAgIGZvciAoIG5uID0gMDsgbm4gPCBudW1faGludHM7IG5uKysgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFBTSF9IaW50ICBoaW50ID0gc29ydFtubl07Ci0gICAgICAgICAgICBGVF9Qb3MgICAgZCAgICA9IG9yZ191IC0gaGludC0+b3JnX3BvcyAtIGhpbnQtPm9yZ19sZW47Ci0KLQotICAgICAgICAgICAgaWYgKCBkIDwgdGhyZXNob2xkICYmIC1kIDwgdGhyZXNob2xkICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcHNoX3BvaW50X3NldF9zdHJvbmcoIHBvaW50ICk7Ci0gICAgICAgICAgICAgIHBvaW50LT5mbGFnczIgfD0gUFNIX1BPSU5UX0VER0VfTUFYOwotICAgICAgICAgICAgICBwb2ludC0+aGludCAgICA9IGhpbnQ7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0jaWYgMQotICAgICAgZWxzZSBpZiAoIHBzaF9wb2ludF9pc19leHRyZW11bSggcG9pbnQgKSApCi0gICAgICB7Ci0gICAgICAgIC8qIHRyZWF0IGV4dHJlbWEgYXMgc3BlY2lhbCBjYXNlcyBmb3Igc3RlbSBlZGdlIGFsaWdubWVudCAqLwotICAgICAgICBGVF9VSW50ICBubiwgbWluX2ZsYWcsIG1heF9mbGFnOwotCi0KLSAgICAgICAgaWYgKCBtYWpvcl9kaXIgPT0gUFNIX0RJUl9IT1JJWk9OVEFMICkKLSAgICAgICAgewotICAgICAgICAgIG1pbl9mbGFnID0gUFNIX1BPSU5UX1BPU0lUSVZFOwotICAgICAgICAgIG1heF9mbGFnID0gUFNIX1BPSU5UX05FR0FUSVZFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG1pbl9mbGFnID0gUFNIX1BPSU5UX05FR0FUSVZFOwotICAgICAgICAgIG1heF9mbGFnID0gUFNIX1BPSU5UX1BPU0lUSVZFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBwb2ludC0+ZmxhZ3MyICYgbWluX2ZsYWcgKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yICggbm4gPSAwOyBubiA8IG51bV9oaW50czsgbm4rKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgUFNIX0hpbnQgIGhpbnQgPSBzb3J0W25uXTsKLSAgICAgICAgICAgIEZUX1BvcyAgICBkICAgID0gb3JnX3UgLSBoaW50LT5vcmdfcG9zOwotCi0KLSAgICAgICAgICAgIGlmICggZCA8IHRocmVzaG9sZCAmJiAtZCA8IHRocmVzaG9sZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBvaW50LT5mbGFnczIgfD0gUFNIX1BPSU5UX0VER0VfTUlOOwotICAgICAgICAgICAgICBwb2ludC0+aGludCAgICA9IGhpbnQ7Ci0gICAgICAgICAgICAgIHBzaF9wb2ludF9zZXRfc3Ryb25nKCBwb2ludCApOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHBvaW50LT5mbGFnczIgJiBtYXhfZmxhZyApCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKCBubiA9IDA7IG5uIDwgbnVtX2hpbnRzOyBubisrICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBQU0hfSGludCAgaGludCA9IHNvcnRbbm5dOwotICAgICAgICAgICAgRlRfUG9zICAgIGQgICAgPSBvcmdfdSAtIGhpbnQtPm9yZ19wb3MgLSBoaW50LT5vcmdfbGVuOwotCi0KLSAgICAgICAgICAgIGlmICggZCA8IHRocmVzaG9sZCAmJiAtZCA8IHRocmVzaG9sZCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHBvaW50LT5mbGFnczIgfD0gUFNIX1BPSU5UX0VER0VfTUFYOwotICAgICAgICAgICAgICBwb2ludC0+aGludCAgICA9IGhpbnQ7Ci0gICAgICAgICAgICAgIHBzaF9wb2ludF9zZXRfc3Ryb25nKCBwb2ludCApOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHBvaW50LT5oaW50ID09IE5VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yICggbm4gPSAwOyBubiA8IG51bV9oaW50czsgbm4rKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgUFNIX0hpbnQgIGhpbnQgPSBzb3J0W25uXTsKLQotCi0gICAgICAgICAgICBpZiAoIG9yZ191ID49IGhpbnQtPm9yZ19wb3MgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgb3JnX3UgPD0gaGludC0+b3JnX3BvcyArIGhpbnQtPm9yZ19sZW4gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwb2ludC0+aGludCA9IGhpbnQ7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0jZW5kaWYgLyogMSAqLwotICAgIH0KLSAgfQotCi0KLSAgLyogdGhlIGFjY2VwdGVkIHNoaWZ0IGZvciBzdHJvbmcgcG9pbnRzIGluIGZyYWN0aW9uYWwgcGl4ZWxzICovCi0jZGVmaW5lIFBTSF9TVFJPTkdfVEhSRVNIT0xEICAzMgotCi0gIC8qIHRoZSBtYXhpbXVtIHNoaWZ0IHZhbHVlIGluIGZvbnQgdW5pdHMgKi8KLSNkZWZpbmUgUFNIX1NUUk9OR19USFJFU0hPTERfTUFYSU1VTSAgMzAKLQotCi0gIC8qIGZpbmQgc3Ryb25nIHBvaW50cyBpbiBhIGdseXBoICovCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9nbHlwaF9maW5kX3N0cm9uZ19wb2ludHMoIFBTSF9HbHlwaCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgZGltZW5zaW9uICkKLSAgewotICAgIC8qIGEgcG9pbnQgaXMgYHN0cm9uZycgaWYgaXQgaXMgbG9jYXRlZCBvbiBhIHN0ZW0gZWRnZSBhbmQgICAgICAgKi8KLSAgICAvKiBoYXMgYW4gYGluJyBvciBgb3V0JyB0YW5nZW50IHBhcmFsbGVsIHRvIHRoZSBoaW50J3MgZGlyZWN0aW9uICovCi0KLSAgICBQU0hfSGludF9UYWJsZSAgdGFibGUgICAgID0gJmdseXBoLT5oaW50X3RhYmxlc1tkaW1lbnNpb25dOwotICAgIFBTX01hc2sgICAgICAgICBtYXNrICAgICAgPSB0YWJsZS0+aGludF9tYXNrcy0+bWFza3M7Ci0gICAgRlRfVUludCAgICAgICAgIG51bV9tYXNrcyA9IHRhYmxlLT5oaW50X21hc2tzLT5udW1fbWFza3M7Ci0gICAgRlRfVUludCAgICAgICAgIGZpcnN0ICAgICA9IDA7Ci0gICAgRlRfSW50ICAgICAgICAgIG1ham9yX2RpciA9IGRpbWVuc2lvbiA9PSAwID8gUFNIX0RJUl9WRVJUSUNBTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFBTSF9ESVJfSE9SSVpPTlRBTDsKLSAgICBQU0hfRGltZW5zaW9uICAgZGltICAgICAgID0gJmdseXBoLT5nbG9iYWxzLT5kaW1lbnNpb25bZGltZW5zaW9uXTsKLSAgICBGVF9GaXhlZCAgICAgICAgc2NhbGUgICAgID0gZGltLT5zY2FsZV9tdWx0OwotICAgIEZUX0ludCAgICAgICAgICB0aHJlc2hvbGQ7Ci0KLQotICAgIHRocmVzaG9sZCA9IChGVF9JbnQpRlRfRGl2Rml4KCBQU0hfU1RST05HX1RIUkVTSE9MRCwgc2NhbGUgKTsKLSAgICBpZiAoIHRocmVzaG9sZCA+IFBTSF9TVFJPTkdfVEhSRVNIT0xEX01BWElNVU0gKQotICAgICAgdGhyZXNob2xkID0gUFNIX1NUUk9OR19USFJFU0hPTERfTUFYSU1VTTsKLQotICAgIC8qIHByb2Nlc3Mgc2Vjb25kYXJ5IGhpbnRzIHRvIGBzZWxlY3RlZCcgcG9pbnRzICovCi0gICAgaWYgKCBudW1fbWFza3MgPiAxICYmIGdseXBoLT5udW1fcG9pbnRzID4gMCApCi0gICAgewotICAgICAgLyogdGhlIGBlbmRjaGFyJyBvcCBjYW4gcmVkdWNlIHRoZSBudW1iZXIgb2YgcG9pbnRzICovCi0gICAgICBmaXJzdCA9IG1hc2stPmVuZF9wb2ludCA+IGdseXBoLT5udW1fcG9pbnRzCi0gICAgICAgICAgICAgICAgPyBnbHlwaC0+bnVtX3BvaW50cwotICAgICAgICAgICAgICAgIDogbWFzay0+ZW5kX3BvaW50OwotICAgICAgbWFzaysrOwotICAgICAgZm9yICggOyBudW1fbWFza3MgPiAxOyBudW1fbWFza3MtLSwgbWFzaysrICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgbmV4dCA9IEZUX01JTiggbWFzay0+ZW5kX3BvaW50LCBnbHlwaC0+bnVtX3BvaW50cyApOwotCi0KLSAgICAgICAgaWYgKCBuZXh0ID4gZmlyc3QgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUludCAgICBjb3VudCA9IG5leHQgLSBmaXJzdDsKLSAgICAgICAgICBQU0hfUG9pbnQgIHBvaW50ID0gZ2x5cGgtPnBvaW50cyArIGZpcnN0OwotCi0KLSAgICAgICAgICBwc2hfaGludF90YWJsZV9hY3RpdmF0ZV9tYXNrKCB0YWJsZSwgbWFzayApOwotCi0gICAgICAgICAgcHNoX2hpbnRfdGFibGVfZmluZF9zdHJvbmdfcG9pbnRzKCB0YWJsZSwgcG9pbnQsIGNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkLCBtYWpvcl9kaXIgKTsKLSAgICAgICAgfQotICAgICAgICBmaXJzdCA9IG5leHQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogcHJvY2VzcyBwcmltYXJ5IGhpbnRzIGZvciBhbGwgcG9pbnRzICovCi0gICAgaWYgKCBudW1fbWFza3MgPT0gMSApCi0gICAgewotICAgICAgRlRfVUludCAgICBjb3VudCA9IGdseXBoLT5udW1fcG9pbnRzOwotICAgICAgUFNIX1BvaW50ICBwb2ludCA9IGdseXBoLT5wb2ludHM7Ci0KLQotICAgICAgcHNoX2hpbnRfdGFibGVfYWN0aXZhdGVfbWFzayggdGFibGUsIHRhYmxlLT5oaW50X21hc2tzLT5tYXNrcyApOwotCi0gICAgICBwc2hfaGludF90YWJsZV9maW5kX3N0cm9uZ19wb2ludHMoIHRhYmxlLCBwb2ludCwgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCwgbWFqb3JfZGlyICk7Ci0gICAgfQotCi0gICAgLyogbm93LCBjZXJ0YWluIHBvaW50cyBtYXkgaGF2ZSBiZWVuIGF0dGFjaGVkIHRvIGEgaGludCBhbmQgKi8KLSAgICAvKiBub3QgbWFya2VkIGFzIHN0cm9uZzsgdXBkYXRlIHRoZWlyIGZsYWdzIHRoZW4gICAgICAgICAgICAqLwotICAgIHsKLSAgICAgIEZUX1VJbnQgICAgY291bnQgPSBnbHlwaC0+bnVtX3BvaW50czsKLSAgICAgIFBTSF9Qb2ludCAgcG9pbnQgPSBnbHlwaC0+cG9pbnRzOwotCi0KLSAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBwb2ludCsrICkKLSAgICAgICAgaWYgKCBwb2ludC0+aGludCAmJiAhcHNoX3BvaW50X2lzX3N0cm9uZyggcG9pbnQgKSApCi0gICAgICAgICAgcHNoX3BvaW50X3NldF9zdHJvbmcoIHBvaW50ICk7Ci0gICAgfQotICB9Ci0KLQotICAvKiBmaW5kIHBvaW50cyBpbiBhIGdseXBoIHdoaWNoIGFyZSBpbiBhIGJsdWUgem9uZSBhbmQgaGF2ZSBgaW4nIG9yICovCi0gIC8qIGBvdXQnIHRhbmdlbnRzIHBhcmFsbGVsIHRvIHRoZSBob3Jpem9udGFsIGF4aXMgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNoX2dseXBoX2ZpbmRfYmx1ZV9wb2ludHMoIFBTSF9CbHVlcyAgYmx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQU0hfR2x5cGggIGdseXBoICkKLSAgewotICAgIFBTSF9CbHVlX1RhYmxlICB0YWJsZTsKLSAgICBQU0hfQmx1ZV9ab25lICAgem9uZTsKLSAgICBGVF9VSW50ICAgICAgICAgZ2x5cGhfY291bnQgPSBnbHlwaC0+bnVtX3BvaW50czsKLSAgICBGVF9VSW50ICAgICAgICAgYmx1ZV9jb3VudDsKLSAgICBQU0hfUG9pbnQgICAgICAgcG9pbnQgPSBnbHlwaC0+cG9pbnRzOwotCi0KLSAgICBmb3IgKCA7IGdseXBoX2NvdW50ID4gMDsgZ2x5cGhfY291bnQtLSwgcG9pbnQrKyApCi0gICAgewotICAgICAgRlRfUG9zICB5OwotCi0KLSAgICAgIC8qIGNoZWNrIHRhbmdlbnRzICovCi0gICAgICBpZiAoICFQU0hfRElSX0NPTVBBUkUoIHBvaW50LT5kaXJfaW4sICBQU0hfRElSX0hPUklaT05UQUwgKSAmJgotICAgICAgICAgICAhUFNIX0RJUl9DT01QQVJFKCBwb2ludC0+ZGlyX291dCwgUFNIX0RJUl9IT1JJWk9OVEFMICkgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgLyogc2tpcCBzdHJvbmcgcG9pbnRzICovCi0gICAgICBpZiAoIHBzaF9wb2ludF9pc19zdHJvbmcoIHBvaW50ICkgKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgeSA9IHBvaW50LT5vcmdfdTsKLQotICAgICAgLyogbG9vayB1cCB0b3Agem9uZXMgKi8KLSAgICAgIHRhYmxlICAgICAgPSAmYmx1ZXMtPm5vcm1hbF90b3A7Ci0gICAgICBibHVlX2NvdW50ID0gdGFibGUtPmNvdW50OwotICAgICAgem9uZSAgICAgICA9IHRhYmxlLT56b25lczsKLQotICAgICAgZm9yICggOyBibHVlX2NvdW50ID4gMDsgYmx1ZV9jb3VudC0tLCB6b25lKysgKQotICAgICAgewotICAgICAgICBGVF9Qb3MgIGRlbHRhID0geSAtIHpvbmUtPm9yZ19ib3R0b207Ci0KLQotICAgICAgICBpZiAoIGRlbHRhIDwgLWJsdWVzLT5ibHVlX2Z1enogKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmICggeSA8PSB6b25lLT5vcmdfdG9wICsgYmx1ZXMtPmJsdWVfZnV6eiApCi0gICAgICAgICAgaWYgKCBibHVlcy0+bm9fb3ZlcnNob290cyB8fCBkZWx0YSA8PSBibHVlcy0+Ymx1ZV90aHJlc2hvbGQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBvaW50LT5jdXJfdSA9IHpvbmUtPmN1cl9ib3R0b207Ci0gICAgICAgICAgICBwc2hfcG9pbnRfc2V0X3N0cm9uZyggcG9pbnQgKTsKLSAgICAgICAgICAgIHBzaF9wb2ludF9zZXRfZml0dGVkKCBwb2ludCApOwotICAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogbG9vayB1cCBib3R0b20gem9uZXMgKi8KLSAgICAgIHRhYmxlICAgICAgPSAmYmx1ZXMtPm5vcm1hbF9ib3R0b207Ci0gICAgICBibHVlX2NvdW50ID0gdGFibGUtPmNvdW50OwotICAgICAgem9uZSAgICAgICA9IHRhYmxlLT56b25lcyArIGJsdWVfY291bnQgLSAxOwotCi0gICAgICBmb3IgKCA7IGJsdWVfY291bnQgPiAwOyBibHVlX2NvdW50LS0sIHpvbmUtLSApCi0gICAgICB7Ci0gICAgICAgIEZUX1BvcyAgZGVsdGEgPSB6b25lLT5vcmdfdG9wIC0geTsKLQotCi0gICAgICAgIGlmICggZGVsdGEgPCAtYmx1ZXMtPmJsdWVfZnV6eiApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaWYgKCB5ID49IHpvbmUtPm9yZ19ib3R0b20gLSBibHVlcy0+Ymx1ZV9mdXp6ICkKLSAgICAgICAgICBpZiAoIGJsdWVzLT5ub19vdmVyc2hvb3RzIHx8IGRlbHRhIDwgYmx1ZXMtPmJsdWVfdGhyZXNob2xkICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwb2ludC0+Y3VyX3UgPSB6b25lLT5jdXJfdG9wOwotICAgICAgICAgICAgcHNoX3BvaW50X3NldF9zdHJvbmcoIHBvaW50ICk7Ci0gICAgICAgICAgICBwc2hfcG9pbnRfc2V0X2ZpdHRlZCggcG9pbnQgKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKiBpbnRlcnBvbGF0ZSBzdHJvbmcgcG9pbnRzIHdpdGggdGhlIGhlbHAgb2YgaGludGVkIGNvb3JkaW5hdGVzICovCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9nbHlwaF9pbnRlcnBvbGF0ZV9zdHJvbmdfcG9pbnRzKCBQU0hfR2x5cGggIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBkaW1lbnNpb24gKQotICB7Ci0gICAgUFNIX0RpbWVuc2lvbiAgZGltICAgPSAmZ2x5cGgtPmdsb2JhbHMtPmRpbWVuc2lvbltkaW1lbnNpb25dOwotICAgIEZUX0ZpeGVkICAgICAgIHNjYWxlID0gZGltLT5zY2FsZV9tdWx0OwotCi0gICAgRlRfVUludCAgICAgICAgY291bnQgPSBnbHlwaC0+bnVtX3BvaW50czsKLSAgICBQU0hfUG9pbnQgICAgICBwb2ludCA9IGdseXBoLT5wb2ludHM7Ci0KLQotICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBwb2ludCsrICkKLSAgICB7Ci0gICAgICBQU0hfSGludCAgaGludCA9IHBvaW50LT5oaW50OwotCi0KLSAgICAgIGlmICggaGludCApCi0gICAgICB7Ci0gICAgICAgIEZUX1BvcyAgZGVsdGE7Ci0KLQotICAgICAgICBpZiAoIHBzaF9wb2ludF9pc19lZGdlX21pbiggcG9pbnQgKSApCi0gICAgICAgICAgcG9pbnQtPmN1cl91ID0gaGludC0+Y3VyX3BvczsKLQotICAgICAgICBlbHNlIGlmICggcHNoX3BvaW50X2lzX2VkZ2VfbWF4KCBwb2ludCApICkKLSAgICAgICAgICBwb2ludC0+Y3VyX3UgPSBoaW50LT5jdXJfcG9zICsgaGludC0+Y3VyX2xlbjsKLQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBkZWx0YSA9IHBvaW50LT5vcmdfdSAtIGhpbnQtPm9yZ19wb3M7Ci0KLSAgICAgICAgICBpZiAoIGRlbHRhIDw9IDAgKQotICAgICAgICAgICAgcG9pbnQtPmN1cl91ID0gaGludC0+Y3VyX3BvcyArIEZUX011bEZpeCggZGVsdGEsIHNjYWxlICk7Ci0KLSAgICAgICAgICBlbHNlIGlmICggZGVsdGEgPj0gaGludC0+b3JnX2xlbiApCi0gICAgICAgICAgICBwb2ludC0+Y3VyX3UgPSBoaW50LT5jdXJfcG9zICsgaGludC0+Y3VyX2xlbiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggZGVsdGEgLSBoaW50LT5vcmdfbGVuLCBzY2FsZSApOwotCi0gICAgICAgICAgZWxzZSAvKiBoaW50LT5vcmdfbGVuID4gMCAqLwotICAgICAgICAgICAgcG9pbnQtPmN1cl91ID0gaGludC0+Y3VyX3BvcyArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bERpdiggZGVsdGEsIGhpbnQtPmN1cl9sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludC0+b3JnX2xlbiApOwotICAgICAgICB9Ci0gICAgICAgIHBzaF9wb2ludF9zZXRfZml0dGVkKCBwb2ludCApOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSNkZWZpbmUgIFBTSF9NQVhfU1RST05HX0lOVEVSTkFMICAxNgotCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9nbHlwaF9pbnRlcnBvbGF0ZV9ub3JtYWxfcG9pbnRzKCBQU0hfR2x5cGggIGdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBkaW1lbnNpb24gKQotICB7Ci0KLSNpZiAxCi0gICAgLyogZmlyc3QgdGVjaG5pcXVlOiBhIHBvaW50IGlzIHN0cm9uZyBpZiBpdCBpcyBhIGxvY2FsIGV4dHJlbXVtICovCi0KLSAgICBQU0hfRGltZW5zaW9uICBkaW0gICAgPSAmZ2x5cGgtPmdsb2JhbHMtPmRpbWVuc2lvbltkaW1lbnNpb25dOwotICAgIEZUX0ZpeGVkICAgICAgIHNjYWxlICA9IGRpbS0+c2NhbGVfbXVsdDsKLSAgICBGVF9NZW1vcnkgICAgICBtZW1vcnkgPSBnbHlwaC0+bWVtb3J5OwotCi0gICAgUFNIX1BvaW50KiAgICAgc3Ryb25ncyAgICAgPSBOVUxMOwotICAgIFBTSF9Qb2ludCAgICAgIHN0cm9uZ3NfMFtQU0hfTUFYX1NUUk9OR19JTlRFUk5BTF07Ci0gICAgRlRfVUludCAgICAgICAgbnVtX3N0cm9uZ3MgPSAwOwotCi0gICAgUFNIX1BvaW50ICAgICAgcG9pbnRzID0gZ2x5cGgtPnBvaW50czsKLSAgICBQU0hfUG9pbnQgICAgICBwb2ludHNfZW5kID0gcG9pbnRzICsgZ2x5cGgtPm51bV9wb2ludHM7Ci0gICAgUFNIX1BvaW50ICAgICAgcG9pbnQ7Ci0KLQotICAgIC8qIGZpcnN0IGNvdW50IHRoZSBudW1iZXIgb2Ygc3Ryb25nIHBvaW50cyAqLwotICAgIGZvciAoIHBvaW50ID0gcG9pbnRzOyBwb2ludCA8IHBvaW50c19lbmQ7IHBvaW50KysgKQotICAgIHsKLSAgICAgIGlmICggcHNoX3BvaW50X2lzX3N0cm9uZyggcG9pbnQgKSApCi0gICAgICAgIG51bV9zdHJvbmdzKys7Ci0gICAgfQotCi0gICAgaWYgKCBudW1fc3Ryb25ncyA9PSAwICkgIC8qIG5vdGhpbmcgdG8gZG8gaGVyZSAqLwotICAgICAgcmV0dXJuOwotCi0gICAgLyogYWxsb2NhdGUgYW4gYXJyYXkgdG8gc3RvcmUgYSBsaXN0IG9mIHBvaW50cywgKi8KLSAgICAvKiBzdG9yZWQgaW4gaW5jcmVhc2luZyBvcmdfdSBvcmRlciAgICAgICAgICAgICAqLwotICAgIGlmICggbnVtX3N0cm9uZ3MgPD0gUFNIX01BWF9TVFJPTkdfSU5URVJOQUwgKQotICAgICAgc3Ryb25ncyA9IHN0cm9uZ3NfMDsKLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBzdHJvbmdzLCBudW1fc3Ryb25ncyApICkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG51bV9zdHJvbmdzID0gMDsKLSAgICBmb3IgKCBwb2ludCA9IHBvaW50czsgcG9pbnQgPCBwb2ludHNfZW5kOyBwb2ludCsrICkKLSAgICB7Ci0gICAgICBQU0hfUG9pbnQqICBpbnNlcnQ7Ci0KLQotICAgICAgaWYgKCAhcHNoX3BvaW50X2lzX3N0cm9uZyggcG9pbnQgKSApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBmb3IgKCBpbnNlcnQgPSBzdHJvbmdzICsgbnVtX3N0cm9uZ3M7IGluc2VydCA+IHN0cm9uZ3M7IGluc2VydC0tICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBpbnNlcnRbLTFdLT5vcmdfdSA8PSBwb2ludC0+b3JnX3UgKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGluc2VydFswXSA9IGluc2VydFstMV07Ci0gICAgICB9Ci0gICAgICBpbnNlcnRbMF0gPSBwb2ludDsKLSAgICAgIG51bV9zdHJvbmdzKys7Ci0gICAgfQotCi0gICAgLyogbm93IHRyeSB0byBpbnRlcnBvbGF0ZSBhbGwgbm9ybWFsIHBvaW50cyAqLwotICAgIGZvciAoIHBvaW50ID0gcG9pbnRzOyBwb2ludCA8IHBvaW50c19lbmQ7IHBvaW50KysgKQotICAgIHsKLSAgICAgIGlmICggcHNoX3BvaW50X2lzX3N0cm9uZyggcG9pbnQgKSApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAvKiBzb21ldGltZXMsIHNvbWUgbG9jYWwgZXh0cmVtYSBhcmUgc21vb3RoIHBvaW50cyAqLwotICAgICAgaWYgKCBwc2hfcG9pbnRfaXNfc21vb3RoKCBwb2ludCApICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBwb2ludC0+ZGlyX2luID09IFBTSF9ESVJfTk9ORSAgIHx8Ci0gICAgICAgICAgICAgcG9pbnQtPmRpcl9pbiAhPSBwb2ludC0+ZGlyX291dCApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgaWYgKCAhcHNoX3BvaW50X2lzX2V4dHJlbXVtKCBwb2ludCApICYmCi0gICAgICAgICAgICAgIXBzaF9wb2ludF9pc19pbmZsZXgoIHBvaW50ICkgICApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgcG9pbnQtPmZsYWdzICY9IH5QU0hfUE9JTlRfU01PT1RIOwotICAgICAgfQotCi0gICAgICAvKiBmaW5kIGJlc3QgZW5jbG9zaW5nIHBvaW50IGNvb3JkaW5hdGVzIHRoZW4gaW50ZXJwb2xhdGUgKi8KLSAgICAgIHsKLSAgICAgICAgUFNIX1BvaW50ICAgYmVmb3JlLCBhZnRlcjsKLSAgICAgICAgRlRfVUludCAgICAgbm47Ci0KLQotICAgICAgICBmb3IgKCBubiA9IDA7IG5uIDwgbnVtX3N0cm9uZ3M7IG5uKysgKQotICAgICAgICAgIGlmICggc3Ryb25nc1tubl0tPm9yZ191ID4gcG9pbnQtPm9yZ191ICkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGlmICggbm4gPT0gMCApICAvKiBwb2ludCBiZWZvcmUgdGhlIGZpcnN0IHN0cm9uZyBwb2ludCAqLwotICAgICAgICB7Ci0gICAgICAgICAgYWZ0ZXIgPSBzdHJvbmdzWzBdOwotCi0gICAgICAgICAgcG9pbnQtPmN1cl91ID0gYWZ0ZXItPmN1cl91ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggcG9pbnQtPm9yZ191IC0gYWZ0ZXItPm9yZ191LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGJlZm9yZSA9IHN0cm9uZ3Nbbm4gLSAxXTsKLQotICAgICAgICAgIGZvciAoIG5uID0gbnVtX3N0cm9uZ3M7IG5uID4gMDsgbm4tLSApCi0gICAgICAgICAgICBpZiAoIHN0cm9uZ3Nbbm4gLSAxXS0+b3JnX3UgPCBwb2ludC0+b3JnX3UgKQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGlmICggbm4gPT0gbnVtX3N0cm9uZ3MgKSAgLyogcG9pbnQgaXMgYWZ0ZXIgbGFzdCBzdHJvbmcgcG9pbnQgKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBiZWZvcmUgPSBzdHJvbmdzW25uIC0gMV07Ci0KLSAgICAgICAgICAgIHBvaW50LT5jdXJfdSA9IGJlZm9yZS0+Y3VyX3UgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxGaXgoIHBvaW50LT5vcmdfdSAtIGJlZm9yZS0+b3JnX3UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1BvcyAgdTsKLQotCi0gICAgICAgICAgICBhZnRlciA9IHN0cm9uZ3Nbbm5dOwotCi0gICAgICAgICAgICAvKiBub3cgaW50ZXJwb2xhdGUgcG9pbnQgYmV0d2VlbiBiZWZvcmUgYW5kIGFmdGVyICovCi0gICAgICAgICAgICB1ID0gcG9pbnQtPm9yZ191OwotCi0gICAgICAgICAgICBpZiAoIHUgPT0gYmVmb3JlLT5vcmdfdSApCi0gICAgICAgICAgICAgIHBvaW50LT5jdXJfdSA9IGJlZm9yZS0+Y3VyX3U7Ci0KLSAgICAgICAgICAgIGVsc2UgaWYgKCB1ID09IGFmdGVyLT5vcmdfdSApCi0gICAgICAgICAgICAgIHBvaW50LT5jdXJfdSA9IGFmdGVyLT5jdXJfdTsKLQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICBwb2ludC0+Y3VyX3UgPSBiZWZvcmUtPmN1cl91ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxEaXYoIHUgLSBiZWZvcmUtPm9yZ191LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXItPmN1cl91IC0gYmVmb3JlLT5jdXJfdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyLT5vcmdfdSAtIGJlZm9yZS0+b3JnX3UgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHNoX3BvaW50X3NldF9maXR0ZWQoIHBvaW50ICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBzdHJvbmdzICE9IHN0cm9uZ3NfMCApCi0gICAgICBGVF9GUkVFKCBzdHJvbmdzICk7Ci0KLSNlbmRpZiAvKiAxICovCi0KLSAgfQotCi0KLSAgLyogaW50ZXJwb2xhdGUgb3RoZXIgcG9pbnRzICovCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9nbHlwaF9pbnRlcnBvbGF0ZV9vdGhlcl9wb2ludHMoIFBTSF9HbHlwaCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgZGltZW5zaW9uICkKLSAgewotICAgIFBTSF9EaW1lbnNpb24gIGRpbSAgICAgICAgICA9ICZnbHlwaC0+Z2xvYmFscy0+ZGltZW5zaW9uW2RpbWVuc2lvbl07Ci0gICAgRlRfRml4ZWQgICAgICAgc2NhbGUgICAgICAgID0gZGltLT5zY2FsZV9tdWx0OwotICAgIEZUX0ZpeGVkICAgICAgIGRlbHRhICAgICAgICA9IGRpbS0+c2NhbGVfZGVsdGE7Ci0gICAgUFNIX0NvbnRvdXIgICAgY29udG91ciAgICAgID0gZ2x5cGgtPmNvbnRvdXJzOwotICAgIEZUX1VJbnQgICAgICAgIG51bV9jb250b3VycyA9IGdseXBoLT5udW1fY29udG91cnM7Ci0KLQotICAgIGZvciAoIDsgbnVtX2NvbnRvdXJzID4gMDsgbnVtX2NvbnRvdXJzLS0sIGNvbnRvdXIrKyApCi0gICAgewotICAgICAgUFNIX1BvaW50ICBzdGFydCA9IGNvbnRvdXItPnN0YXJ0OwotICAgICAgUFNIX1BvaW50ICBmaXJzdCwgbmV4dCwgcG9pbnQ7Ci0gICAgICBGVF9VSW50ICAgIGZpdF9jb3VudDsKLQotCi0gICAgICAvKiBjb3VudCB0aGUgbnVtYmVyIG9mIHN0cm9uZyBwb2ludHMgaW4gdGhpcyBjb250b3VyICovCi0gICAgICBuZXh0ICAgICAgPSBzdGFydCArIGNvbnRvdXItPmNvdW50OwotICAgICAgZml0X2NvdW50ID0gMDsKLSAgICAgIGZpcnN0ICAgICA9IE5VTEw7Ci0KLSAgICAgIGZvciAoIHBvaW50ID0gc3RhcnQ7IHBvaW50IDwgbmV4dDsgcG9pbnQrKyApCi0gICAgICAgIGlmICggcHNoX3BvaW50X2lzX2ZpdHRlZCggcG9pbnQgKSApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoICFmaXJzdCApCi0gICAgICAgICAgICBmaXJzdCA9IHBvaW50OwotCi0gICAgICAgICAgZml0X2NvdW50Kys7Ci0gICAgICAgIH0KLQotICAgICAgLyogaWYgdGhlcmUgYXJlIGxlc3MgdGhhbiAyIGZpdHRlZCBwb2ludHMgaW4gdGhlIGNvbnRvdXIsIHdlICovCi0gICAgICAvKiBzaW1wbHkgc2NhbGUgYW5kIGV2ZW50dWFsbHkgdHJhbnNsYXRlIHRoZSBjb250b3VyIHBvaW50cyAgKi8KLSAgICAgIGlmICggZml0X2NvdW50IDwgMiApCi0gICAgICB7Ci0gICAgICAgIGlmICggZml0X2NvdW50ID09IDEgKQotICAgICAgICAgIGRlbHRhID0gZmlyc3QtPmN1cl91IC0gRlRfTXVsRml4KCBmaXJzdC0+b3JnX3UsIHNjYWxlICk7Ci0KLSAgICAgICAgZm9yICggcG9pbnQgPSBzdGFydDsgcG9pbnQgPCBuZXh0OyBwb2ludCsrICkKLSAgICAgICAgICBpZiAoIHBvaW50ICE9IGZpcnN0ICkKLSAgICAgICAgICAgIHBvaW50LT5jdXJfdSA9IEZUX011bEZpeCggcG9pbnQtPm9yZ191LCBzY2FsZSApICsgZGVsdGE7Ci0KLSAgICAgICAgZ290byBOZXh0X0NvbnRvdXI7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHRoZXJlIGFyZSBtb3JlIHRoYW4gMiBzdHJvbmcgcG9pbnRzIGluIHRoaXMgY29udG91cjsgd2UgKi8KLSAgICAgIC8qIG5lZWQgdG8gaW50ZXJwb2xhdGUgd2VhayBwb2ludHMgYmV0d2VlbiB0aGVtICAgICAgICAgICAgKi8KLSAgICAgIHN0YXJ0ID0gZmlyc3Q7Ci0gICAgICBkbwotICAgICAgewotICAgICAgICAvKiBza2lwIGNvbnNlY3V0aXZlIGZpdHRlZCBwb2ludHMgKi8KLSAgICAgICAgZm9yICg7OykKLSAgICAgICAgewotICAgICAgICAgIG5leHQgPSBmaXJzdC0+bmV4dDsKLSAgICAgICAgICBpZiAoIG5leHQgPT0gc3RhcnQgKQotICAgICAgICAgICAgZ290byBOZXh0X0NvbnRvdXI7Ci0KLSAgICAgICAgICBpZiAoICFwc2hfcG9pbnRfaXNfZml0dGVkKCBuZXh0ICkgKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBmaXJzdCA9IG5leHQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBmaW5kIG5leHQgZml0dGVkIHBvaW50IGFmdGVyIHVuZml0dGVkIG9uZSAqLwotICAgICAgICBmb3IgKDs7KQotICAgICAgICB7Ci0gICAgICAgICAgbmV4dCA9IG5leHQtPm5leHQ7Ci0gICAgICAgICAgaWYgKCBwc2hfcG9pbnRfaXNfZml0dGVkKCBuZXh0ICkgKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBub3cgaW50ZXJwb2xhdGUgYmV0d2VlbiB0aGVtICovCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Qb3MgICAgb3JnX2EsIG9yZ19hYiwgY3VyX2EsIGN1cl9hYjsKLSAgICAgICAgICBGVF9Qb3MgICAgb3JnX2MsIG9yZ19hYywgY3VyX2M7Ci0gICAgICAgICAgRlRfRml4ZWQgIHNjYWxlX2FiOwotCi0KLSAgICAgICAgICBpZiAoIGZpcnN0LT5vcmdfdSA8PSBuZXh0LT5vcmdfdSApCi0gICAgICAgICAgewotICAgICAgICAgICAgb3JnX2EgID0gZmlyc3QtPm9yZ191OwotICAgICAgICAgICAgY3VyX2EgID0gZmlyc3QtPmN1cl91OwotICAgICAgICAgICAgb3JnX2FiID0gbmV4dC0+b3JnX3UgLSBvcmdfYTsKLSAgICAgICAgICAgIGN1cl9hYiA9IG5leHQtPmN1cl91IC0gY3VyX2E7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBvcmdfYSAgPSBuZXh0LT5vcmdfdTsKLSAgICAgICAgICAgIGN1cl9hICA9IG5leHQtPmN1cl91OwotICAgICAgICAgICAgb3JnX2FiID0gZmlyc3QtPm9yZ191IC0gb3JnX2E7Ci0gICAgICAgICAgICBjdXJfYWIgPSBmaXJzdC0+Y3VyX3UgLSBjdXJfYTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzY2FsZV9hYiA9IDB4MTAwMDBMOwotICAgICAgICAgIGlmICggb3JnX2FiID4gMCApCi0gICAgICAgICAgICBzY2FsZV9hYiA9IEZUX0RpdkZpeCggY3VyX2FiLCBvcmdfYWIgKTsKLQotICAgICAgICAgIHBvaW50ID0gZmlyc3QtPm5leHQ7Ci0gICAgICAgICAgZG8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBvcmdfYyAgPSBwb2ludC0+b3JnX3U7Ci0gICAgICAgICAgICBvcmdfYWMgPSBvcmdfYyAtIG9yZ19hOwotCi0gICAgICAgICAgICBpZiAoIG9yZ19hYyA8PSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogb24gdGhlIGxlZnQgb2YgdGhlIGludGVycG9sYXRpb24gem9uZSAqLwotICAgICAgICAgICAgICBjdXJfYyA9IGN1cl9hICsgRlRfTXVsRml4KCBvcmdfYWMsIHNjYWxlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggb3JnX2FjID49IG9yZ19hYiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIG9uIHRoZSByaWdodCBvbiB0aGUgaW50ZXJwb2xhdGlvbiB6b25lICovCi0gICAgICAgICAgICAgIGN1cl9jID0gY3VyX2EgKyBjdXJfYWIgKyBGVF9NdWxGaXgoIG9yZ19hYyAtIG9yZ19hYiwgc2NhbGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogd2l0aGluIHRoZSBpbnRlcnBvbGF0aW9uIHpvbmUgKi8KLSAgICAgICAgICAgICAgY3VyX2MgPSBjdXJfYSArIEZUX011bEZpeCggb3JnX2FjLCBzY2FsZV9hYiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwb2ludC0+Y3VyX3UgPSBjdXJfYzsKLQotICAgICAgICAgICAgcG9pbnQgPSBwb2ludC0+bmV4dDsKLQotICAgICAgICAgIH0gd2hpbGUgKCBwb2ludCAhPSBuZXh0ICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBrZWVwIGdvaW5nIHVudGlsIGFsbCBwb2ludHMgaW4gdGhlIGNvbnRvdXJzIGhhdmUgYmVlbiBwcm9jZXNzZWQgKi8KLSAgICAgICAgZmlyc3QgPSBuZXh0OwotCi0gICAgICB9IHdoaWxlICggZmlyc3QgIT0gc3RhcnQgKTsKLQotICAgIE5leHRfQ29udG91cjoKLSAgICAgIDsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgIEhJR0gtTEVWRUwgSU5URVJGQUNFICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0Vycm9yCi0gIHBzX2hpbnRzX2FwcGx5KCBQU19IaW50cyAgICAgICAgcHNfaGludHMsCi0gICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgIFBTSF9HbG9iYWxzICAgICBnbG9iYWxzLAotICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIGhpbnRfbW9kZSApCi0gIHsKLSAgICBQU0hfR2x5cGhSZWMgIGdseXBocmVjOwotICAgIFBTSF9HbHlwaCAgICAgZ2x5cGggPSAmZ2x5cGhyZWM7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvcjsKLSNpZmRlZiBERUJVR19ISU5URVIKLSAgICBGVF9NZW1vcnkgICAgIG1lbW9yeTsKLSNlbmRpZgotICAgIEZUX0ludCAgICAgICAgZGltZW5zaW9uOwotCi0KLSAgICAvKiBzb21ldGhpbmcgdG8gZG8/ICovCi0gICAgaWYgKCBvdXRsaW5lLT5uX3BvaW50cyA9PSAwIHx8IG91dGxpbmUtPm5fY29udG91cnMgPT0gMCApCi0gICAgICByZXR1cm4gRlRfRXJyX09rOwotCi0jaWZkZWYgREVCVUdfSElOVEVSCi0KLSAgICBtZW1vcnkgPSBnbG9iYWxzLT5tZW1vcnk7Ci0KLSAgICBpZiAoIHBzX2RlYnVnX2dseXBoICkKLSAgICB7Ci0gICAgICBwc2hfZ2x5cGhfZG9uZSggcHNfZGVidWdfZ2x5cGggKTsKLSAgICAgIEZUX0ZSRUUoIHBzX2RlYnVnX2dseXBoICk7Ci0gICAgfQotCi0gICAgaWYgKCBGVF9ORVcoIGdseXBoICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgcHNfZGVidWdfZ2x5cGggPSBnbHlwaDsKLQotI2VuZGlmIC8qIERFQlVHX0hJTlRFUiAqLwotCi0gICAgZXJyb3IgPSBwc2hfZ2x5cGhfaW5pdCggZ2x5cGgsIG91dGxpbmUsIHBzX2hpbnRzLCBnbG9iYWxzICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiB0cnkgdG8gb3B0aW1pemUgdGhlIHlfc2NhbGUgc28gdGhhdCB0aGUgdG9wIG9mIG5vbi1jYXBpdGFsIGxldHRlcnMKLSAgICAgKiBpcyBhbGlnbmVkIG9uIGEgcGl4ZWwgYm91bmRhcnkgd2hlbmV2ZXIgcG9zc2libGUKLSAgICAgKi8KLSAgICB7Ci0gICAgICBQU0hfRGltZW5zaW9uICBkaW1feCA9ICZnbHlwaC0+Z2xvYmFscy0+ZGltZW5zaW9uWzBdOwotICAgICAgUFNIX0RpbWVuc2lvbiAgZGltX3kgPSAmZ2x5cGgtPmdsb2JhbHMtPmRpbWVuc2lvblsxXTsKLQotICAgICAgRlRfRml4ZWQgIHhfc2NhbGUgPSBkaW1feC0+c2NhbGVfbXVsdDsKLSAgICAgIEZUX0ZpeGVkICB5X3NjYWxlID0gZGltX3ktPnNjYWxlX211bHQ7Ci0KLSAgICAgIEZUX0ZpeGVkICBvbGRfeF9zY2FsZSA9IHhfc2NhbGU7Ci0gICAgICBGVF9GaXhlZCAgb2xkX3lfc2NhbGUgPSB5X3NjYWxlOwotCi0gICAgICBGVF9GaXhlZCAgc2NhbGVkOwotICAgICAgRlRfRml4ZWQgIGZpdHRlZDsKLQotICAgICAgRlRfQm9vbCAgcmVzY2FsZSA9IEZBTFNFOwotCi0KLSAgICAgIHNjYWxlZCA9IEZUX011bEZpeCggZ2xvYmFscy0+Ymx1ZXMubm9ybWFsX3RvcC56b25lcy0+b3JnX3JlZiwgeV9zY2FsZSApOwotICAgICAgZml0dGVkID0gRlRfUElYX1JPVU5EKCBzY2FsZWQgKTsKLQotICAgICAgaWYgKCBmaXR0ZWQgIT0gMCAmJiBzY2FsZWQgIT0gZml0dGVkICkKLSAgICAgIHsKLSAgICAgICAgcmVzY2FsZSA9IFRSVUU7Ci0KLSAgICAgICAgeV9zY2FsZSA9IEZUX011bERpdiggeV9zY2FsZSwgZml0dGVkLCBzY2FsZWQgKTsKLQotICAgICAgICBpZiAoIGZpdHRlZCA8IHNjYWxlZCApCi0gICAgICAgICAgeF9zY2FsZSAtPSB4X3NjYWxlIC8gNTA7Ci0KLSAgICAgICAgcHNoX2dsb2JhbHNfc2V0X3NjYWxlKCBnbHlwaC0+Z2xvYmFscywgeF9zY2FsZSwgeV9zY2FsZSwgMCwgMCApOwotICAgICAgfQotCi0gICAgICBnbHlwaC0+ZG9faG9yel9oaW50cyA9IDE7Ci0gICAgICBnbHlwaC0+ZG9fdmVydF9oaW50cyA9IDE7Ci0KLSAgICAgIGdseXBoLT5kb19ob3J6X3NuYXBwaW5nID0gRlRfQk9PTCggaGludF9tb2RlID09IEZUX1JFTkRFUl9NT0RFX01PTk8gfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludF9tb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRCAgKTsKLQotICAgICAgZ2x5cGgtPmRvX3ZlcnRfc25hcHBpbmcgPSBGVF9CT09MKCBoaW50X21vZGUgPT0gRlRfUkVOREVSX01PREVfTU9OTyAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGludF9tb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRF9WICk7Ci0KLSAgICAgIGdseXBoLT5kb19zdGVtX2FkanVzdCAgID0gRlRfQk9PTCggaGludF9tb2RlICE9IEZUX1JFTkRFUl9NT0RFX0xJR0hUICk7Ci0KLSAgICAgIGZvciAoIGRpbWVuc2lvbiA9IDA7IGRpbWVuc2lvbiA8IDI7IGRpbWVuc2lvbisrICkKLSAgICAgIHsKLSAgICAgICAgLyogbG9hZCBvdXRsaW5lIGNvb3JkaW5hdGVzIGludG8gZ2x5cGggKi8KLSAgICAgICAgcHNoX2dseXBoX2xvYWRfcG9pbnRzKCBnbHlwaCwgZGltZW5zaW9uICk7Ci0KLSAgICAgICAgLyogY29tcHV0ZSBsb2NhbCBleHRyZW1hICovCi0gICAgICAgIHBzaF9nbHlwaF9jb21wdXRlX2V4dHJlbWEoIGdseXBoICk7Ci0KLSAgICAgICAgLyogY29tcHV0ZSBhbGlnbmVkIHN0ZW0vaGludHMgcG9zaXRpb25zICovCi0gICAgICAgIHBzaF9oaW50X3RhYmxlX2FsaWduX2hpbnRzKCAmZ2x5cGgtPmhpbnRfdGFibGVzW2RpbWVuc2lvbl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaC0+Z2xvYmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoICk7Ci0KLSAgICAgICAgLyogZmluZCBzdHJvbmcgcG9pbnRzLCBhbGlnbiB0aGVtLCB0aGVuIGludGVycG9sYXRlIG90aGVycyAqLwotICAgICAgICBwc2hfZ2x5cGhfZmluZF9zdHJvbmdfcG9pbnRzKCBnbHlwaCwgZGltZW5zaW9uICk7Ci0gICAgICAgIGlmICggZGltZW5zaW9uID09IDEgKQotICAgICAgICAgIHBzaF9nbHlwaF9maW5kX2JsdWVfcG9pbnRzKCAmZ2xvYmFscy0+Ymx1ZXMsIGdseXBoICk7Ci0gICAgICAgIHBzaF9nbHlwaF9pbnRlcnBvbGF0ZV9zdHJvbmdfcG9pbnRzKCBnbHlwaCwgZGltZW5zaW9uICk7Ci0gICAgICAgIHBzaF9nbHlwaF9pbnRlcnBvbGF0ZV9ub3JtYWxfcG9pbnRzKCBnbHlwaCwgZGltZW5zaW9uICk7Ci0gICAgICAgIHBzaF9nbHlwaF9pbnRlcnBvbGF0ZV9vdGhlcl9wb2ludHMoIGdseXBoLCBkaW1lbnNpb24gKTsKLQotICAgICAgICAvKiBzYXZlIGhpbnRlZCBjb29yZGluYXRlcyBiYWNrIHRvIG91dGxpbmUgKi8KLSAgICAgICAgcHNoX2dseXBoX3NhdmVfcG9pbnRzKCBnbHlwaCwgZGltZW5zaW9uICk7Ci0KLSAgICAgICAgaWYgKCByZXNjYWxlICkKLSAgICAgICAgICBwc2hfZ2xvYmFsc19zZXRfc2NhbGUoIGdseXBoLT5nbG9iYWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkX3hfc2NhbGUsIG9sZF95X3NjYWxlLCAwLCAwICk7Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0KLSNpZm5kZWYgREVCVUdfSElOVEVSCi0gICAgcHNoX2dseXBoX2RvbmUoIGdseXBoICk7Ci0jZW5kaWYKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaGFsZ28uaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hhbGdvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNzNlNWUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaGFsZ28uaAorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2hhbGdvLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUG9zdFNjcmlwdCBoaW50aW5nIGFsZ29yaXRobSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19QU0hBTEdPX0hfXwotI2RlZmluZSBfX1BTSEFMR09fSF9fCi0KLQotI2luY2x1ZGUgInBzaHJlYy5oIgotI2luY2x1ZGUgInBzaGdsb2IuaCIKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qIGhhbmRsZSB0byBIaW50IHN0cnVjdHVyZSAqLwotICB0eXBlZGVmIHN0cnVjdCBQU0hfSGludFJlY18qICBQU0hfSGludDsKLQotCi0gIC8qIGhpbnQgYml0LWZsYWdzICovCi0jZGVmaW5lIFBTSF9ISU5UX0dIT1NUICAgUFNfSElOVF9GTEFHX0dIT1NUCi0jZGVmaW5lIFBTSF9ISU5UX0JPVFRPTSAgUFNfSElOVF9GTEFHX0JPVFRPTQotI2RlZmluZSBQU0hfSElOVF9BQ1RJVkUgIDRVCi0jZGVmaW5lIFBTSF9ISU5UX0ZJVFRFRCAgOFUKLQotCi0jZGVmaW5lIHBzaF9oaW50X2lzX2FjdGl2ZSggeCApICAoICggKHgpLT5mbGFncyAmIFBTSF9ISU5UX0FDVElWRSApICE9IDAgKQotI2RlZmluZSBwc2hfaGludF9pc19naG9zdCggeCApICAgKCAoICh4KS0+ZmxhZ3MgJiBQU0hfSElOVF9HSE9TVCAgKSAhPSAwICkKLSNkZWZpbmUgcHNoX2hpbnRfaXNfZml0dGVkKCB4ICkgICggKCAoeCktPmZsYWdzICYgUFNIX0hJTlRfRklUVEVEICkgIT0gMCApCi0KLSNkZWZpbmUgcHNoX2hpbnRfYWN0aXZhdGUoIHggKSAgICAoeCktPmZsYWdzIHw9ICBQU0hfSElOVF9BQ1RJVkUKLSNkZWZpbmUgcHNoX2hpbnRfZGVhY3RpdmF0ZSggeCApICAoeCktPmZsYWdzICY9IH5QU0hfSElOVF9BQ1RJVkUKLSNkZWZpbmUgcHNoX2hpbnRfc2V0X2ZpdHRlZCggeCApICAoeCktPmZsYWdzIHw9ICBQU0hfSElOVF9GSVRURUQKLQotCi0gIC8qIGhpbnQgc3RydWN0dXJlICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU0hfSGludFJlY18KLSAgewotICAgIEZUX0ludCAgICBvcmdfcG9zOwotICAgIEZUX0ludCAgICBvcmdfbGVuOwotICAgIEZUX1BvcyAgICBjdXJfcG9zOwotICAgIEZUX1BvcyAgICBjdXJfbGVuOwotICAgIEZUX1VJbnQgICBmbGFnczsKLSAgICBQU0hfSGludCAgcGFyZW50OwotICAgIEZUX0ludCAgICBvcmRlcjsKLQotICB9IFBTSF9IaW50UmVjOwotCi0KLSAgLyogdGhpcyBpcyBhbiBpbnRlcnBvbGF0aW9uIHpvbmUgdXNlZCBmb3Igc3Ryb25nIHBvaW50czsgICovCi0gIC8qIHdlYWsgcG9pbnRzIGFyZSBpbnRlcnBvbGF0ZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHN0cm9uZyAqLwotICAvKiBuZWlnaGJvdXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTSF9ab25lUmVjXwotICB7Ci0gICAgRlRfRml4ZWQgIHNjYWxlOwotICAgIEZUX0ZpeGVkICBkZWx0YTsKLSAgICBGVF9Qb3MgICAgbWluOwotICAgIEZUX1BvcyAgICBtYXg7Ci0KLSAgfSBQU0hfWm9uZVJlYywgKlBTSF9ab25lOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTSF9IaW50X1RhYmxlUmVjXwotICB7Ci0gICAgRlRfVUludCAgICAgICAgbWF4X2hpbnRzOwotICAgIEZUX1VJbnQgICAgICAgIG51bV9oaW50czsKLSAgICBQU0hfSGludCAgICAgICBoaW50czsKLSAgICBQU0hfSGludCogICAgICBzb3J0OwotICAgIFBTSF9IaW50KiAgICAgIHNvcnRfZ2xvYmFsOwotICAgIEZUX1VJbnQgICAgICAgIG51bV96b25lczsKLSAgICBQU0hfWm9uZVJlYyogICB6b25lczsKLSAgICBQU0hfWm9uZSAgICAgICB6b25lOwotICAgIFBTX01hc2tfVGFibGUgIGhpbnRfbWFza3M7Ci0gICAgUFNfTWFza19UYWJsZSAgY291bnRlcl9tYXNrczsKLQotICB9IFBTSF9IaW50X1RhYmxlUmVjLCAqUFNIX0hpbnRfVGFibGU7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCBQU0hfUG9pbnRSZWNfKiAgICBQU0hfUG9pbnQ7Ci0gIHR5cGVkZWYgc3RydWN0IFBTSF9Db250b3VyUmVjXyogIFBTSF9Db250b3VyOwotCi0gIGVudW0KLSAgewotICAgIFBTSF9ESVJfTk9ORSAgPSAgNCwKLSAgICBQU0hfRElSX1VQICAgID0gLTEsCi0gICAgUFNIX0RJUl9ET1dOICA9ICAxLAotICAgIFBTSF9ESVJfTEVGVCAgPSAtMiwKLSAgICBQU0hfRElSX1JJR0hUID0gIDIKLSAgfTsKLQotI2RlZmluZSBQU0hfRElSX0hPUklaT05UQUwgIDIKLSNkZWZpbmUgUFNIX0RJUl9WRVJUSUNBTCAgICAxCi0KLSNkZWZpbmUgUFNIX0RJUl9DT01QQVJFKCBkMSwgZDIgKSAgICggKGQxKSA9PSAoZDIpIHx8IChkMSkgPT0gLShkMikgKQotI2RlZmluZSBQU0hfRElSX0lTX0hPUklaT05UQUwoIGQgKSAgUFNIX0RJUl9DT01QQVJFKCBkLCBQU0hfRElSX0hPUklaT05UQUwgKQotI2RlZmluZSBQU0hfRElSX0lTX1ZFUlRJQ0FMKCBkICkgICAgUFNIX0RJUl9DT01QQVJFKCBkLCBQU0hfRElSX1ZFUlRJQ0FMICkKLQotCi0gIC8qIHRoZSBmb2xsb3dpbmcgYml0LWZsYWdzIGFyZSBjb21wdXRlZCBvbmNlIGJ5IHRoZSBnbHlwaCAqLwotICAvKiBhbmFseXplciwgZm9yIGJvdGggZGltZW5zaW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUFNIX1BPSU5UX09GRiAgICAgMVUgICAgICAvKiBwb2ludCBpcyBvZmYgdGhlIGN1cnZlICovCi0jZGVmaW5lIFBTSF9QT0lOVF9TTU9PVEggIDJVICAgICAgLyogcG9pbnQgaXMgc21vb3RoICAgICAgICAqLwotI2RlZmluZSBQU0hfUE9JTlRfSU5GTEVYICA0VSAgICAgIC8qIHBvaW50IGlzIGluZmxlY3Rpb24gICAgKi8KLQotCi0jZGVmaW5lIHBzaF9wb2ludF9pc19zbW9vdGgoIHAgKSAgKCAocCktPmZsYWdzICYgUFNIX1BPSU5UX1NNT09USCApCi0jZGVmaW5lIHBzaF9wb2ludF9pc19vZmYoIHAgKSAgICAgKCAocCktPmZsYWdzICYgUFNIX1BPSU5UX09GRiAgICApCi0jZGVmaW5lIHBzaF9wb2ludF9pc19pbmZsZXgoIHAgKSAgKCAocCktPmZsYWdzICYgUFNIX1BPSU5UX0lORkxFWCApCi0KLSNkZWZpbmUgcHNoX3BvaW50X3NldF9zbW9vdGgoIHAgKSAgKHApLT5mbGFncyB8PSBQU0hfUE9JTlRfU01PT1RICi0jZGVmaW5lIHBzaF9wb2ludF9zZXRfb2ZmKCBwICkgICAgIChwKS0+ZmxhZ3MgfD0gUFNIX1BPSU5UX09GRgotI2RlZmluZSBwc2hfcG9pbnRfc2V0X2luZmxleCggcCApICAocCktPmZsYWdzIHw9IFBTSF9QT0lOVF9JTkZMRVgKLQotCi0gIC8qIHRoZSBmb2xsb3dpbmcgYml0LWZsYWdzIGFyZSByZS1jb21wdXRlZCBmb3IgZWFjaCBkaW1lbnNpb24gKi8KLSNkZWZpbmUgUFNIX1BPSU5UX1NUUk9ORyAgICAgIDE2VSAvKiBwb2ludCBpcyBzdHJvbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBQU0hfUE9JTlRfRklUVEVEICAgICAgMzJVIC8qIHBvaW50IGlzIGFscmVhZHkgZml0dGVkICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFBTSF9QT0lOVF9FWFRSRU1VTSAgICA2NFUgLyogcG9pbnQgaXMgbG9jYWwgZXh0cmVtdW0gICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUFNIX1BPSU5UX1BPU0lUSVZFICAgMTI4VSAvKiBleHRyZW11bSBoYXMgcG9zaXRpdmUgY29udG91ciBmbG93ICAgICAgICAqLwotI2RlZmluZSBQU0hfUE9JTlRfTkVHQVRJVkUgICAyNTZVIC8qIGV4dHJlbXVtIGhhcyBuZWdhdGl2ZSBjb250b3VyIGZsb3cgICAgICAgICovCi0jZGVmaW5lIFBTSF9QT0lOVF9FREdFX01JTiAgIDUxMlUgLyogcG9pbnQgaXMgYWxpZ25lZCB0byBsZWZ0L2JvdHRvbSBzdGVtIGVkZ2UgKi8KLSNkZWZpbmUgUFNIX1BPSU5UX0VER0VfTUFYICAxMDI0VSAvKiBwb2ludCBpcyBhbGlnbmVkIHRvIHRvcC9yaWdodCBzdGVtIGVkZ2UgICAqLwotCi0KLSNkZWZpbmUgcHNoX3BvaW50X2lzX3N0cm9uZyggcCApICAgICggKHApLT5mbGFnczIgJiBQU0hfUE9JTlRfU1RST05HICkKLSNkZWZpbmUgcHNoX3BvaW50X2lzX2ZpdHRlZCggcCApICAgICggKHApLT5mbGFnczIgJiBQU0hfUE9JTlRfRklUVEVEICkKLSNkZWZpbmUgcHNoX3BvaW50X2lzX2V4dHJlbXVtKCBwICkgICggKHApLT5mbGFnczIgJiBQU0hfUE9JTlRfRVhUUkVNVU0gKQotI2RlZmluZSBwc2hfcG9pbnRfaXNfcG9zaXRpdmUoIHAgKSAgKCAocCktPmZsYWdzMiAmIFBTSF9QT0lOVF9QT1NJVElWRSApCi0jZGVmaW5lIHBzaF9wb2ludF9pc19uZWdhdGl2ZSggcCApICAoIChwKS0+ZmxhZ3MyICYgUFNIX1BPSU5UX05FR0FUSVZFICkKLSNkZWZpbmUgcHNoX3BvaW50X2lzX2VkZ2VfbWluKCBwICkgICggKHApLT5mbGFnczIgJiBQU0hfUE9JTlRfRURHRV9NSU4gKQotI2RlZmluZSBwc2hfcG9pbnRfaXNfZWRnZV9tYXgoIHAgKSAgKCAocCktPmZsYWdzMiAmIFBTSF9QT0lOVF9FREdFX01BWCApCi0KLSNkZWZpbmUgcHNoX3BvaW50X3NldF9zdHJvbmcoIHAgKSAgICAocCktPmZsYWdzMiB8PSBQU0hfUE9JTlRfU1RST05HCi0jZGVmaW5lIHBzaF9wb2ludF9zZXRfZml0dGVkKCBwICkgICAgKHApLT5mbGFnczIgfD0gUFNIX1BPSU5UX0ZJVFRFRAotI2RlZmluZSBwc2hfcG9pbnRfc2V0X2V4dHJlbXVtKCBwICkgIChwKS0+ZmxhZ3MyIHw9IFBTSF9QT0lOVF9FWFRSRU1VTQotI2RlZmluZSBwc2hfcG9pbnRfc2V0X3Bvc2l0aXZlKCBwICkgIChwKS0+ZmxhZ3MyIHw9IFBTSF9QT0lOVF9QT1NJVElWRQotI2RlZmluZSBwc2hfcG9pbnRfc2V0X25lZ2F0aXZlKCBwICkgIChwKS0+ZmxhZ3MyIHw9IFBTSF9QT0lOVF9ORUdBVElWRQotI2RlZmluZSBwc2hfcG9pbnRfc2V0X2VkZ2VfbWluKCBwICkgIChwKS0+ZmxhZ3MyIHw9IFBTSF9QT0lOVF9FREdFX01JTgotI2RlZmluZSBwc2hfcG9pbnRfc2V0X2VkZ2VfbWF4KCBwICkgIChwKS0+ZmxhZ3MyIHw9IFBTSF9QT0lOVF9FREdFX01BWAotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTSF9Qb2ludFJlY18KLSAgewotICAgIFBTSF9Qb2ludCAgICBwcmV2OwotICAgIFBTSF9Qb2ludCAgICBuZXh0OwotICAgIFBTSF9Db250b3VyICBjb250b3VyOwotICAgIEZUX1VJbnQgICAgICBmbGFnczsKLSAgICBGVF9VSW50ICAgICAgZmxhZ3MyOwotICAgIEZUX0NoYXIgICAgICBkaXJfaW47Ci0gICAgRlRfQ2hhciAgICAgIGRpcl9vdXQ7Ci0gICAgUFNIX0hpbnQgICAgIGhpbnQ7Ci0gICAgRlRfUG9zICAgICAgIG9yZ191OwotICAgIEZUX1BvcyAgICAgICBvcmdfdjsKLSAgICBGVF9Qb3MgICAgICAgY3VyX3U7Ci0jaWZkZWYgREVCVUdfSElOVEVSCi0gICAgRlRfUG9zICAgICAgIG9yZ194OwotICAgIEZUX1BvcyAgICAgICBjdXJfeDsKLSAgICBGVF9Qb3MgICAgICAgb3JnX3k7Ci0gICAgRlRfUG9zICAgICAgIGN1cl95OwotICAgIEZUX1VJbnQgICAgICBmbGFnc194OwotICAgIEZUX1VJbnQgICAgICBmbGFnc195OwotI2VuZGlmCi0KLSAgfSBQU0hfUG9pbnRSZWM7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgUFNIX0NvbnRvdXJSZWNfCi0gIHsKLSAgICBQU0hfUG9pbnQgIHN0YXJ0OwotICAgIEZUX1VJbnQgICAgY291bnQ7Ci0KLSAgfSBQU0hfQ29udG91clJlYzsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBQU0hfR2x5cGhSZWNfCi0gIHsKLSAgICBGVF9VSW50ICAgICAgICAgICAgbnVtX3BvaW50czsKLSAgICBGVF9VSW50ICAgICAgICAgICAgbnVtX2NvbnRvdXJzOwotCi0gICAgUFNIX1BvaW50ICAgICAgICAgIHBvaW50czsKLSAgICBQU0hfQ29udG91ciAgICAgICAgY29udG91cnM7Ci0KLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5OwotICAgIEZUX091dGxpbmUqICAgICAgICBvdXRsaW5lOwotICAgIFBTSF9HbG9iYWxzICAgICAgICBnbG9iYWxzOwotICAgIFBTSF9IaW50X1RhYmxlUmVjICBoaW50X3RhYmxlc1syXTsKLQotICAgIEZUX0Jvb2wgICAgICAgICAgICB2ZXJ0aWNhbDsKLSAgICBGVF9JbnQgICAgICAgICAgICAgbWFqb3JfZGlyOwotICAgIEZUX0ludCAgICAgICAgICAgICBtaW5vcl9kaXI7Ci0KLSAgICBGVF9Cb29sICAgICAgICAgICAgZG9faG9yel9oaW50czsKLSAgICBGVF9Cb29sICAgICAgICAgICAgZG9fdmVydF9oaW50czsKLSAgICBGVF9Cb29sICAgICAgICAgICAgZG9faG9yel9zbmFwcGluZzsKLSAgICBGVF9Cb29sICAgICAgICAgICAgZG9fdmVydF9zbmFwcGluZzsKLSAgICBGVF9Cb29sICAgICAgICAgICAgZG9fc3RlbV9hZGp1c3Q7Ci0KLSAgfSBQU0hfR2x5cGhSZWMsICpQU0hfR2x5cGg7Ci0KLQotI2lmZGVmIERFQlVHX0hJTlRFUgotICBleHRlcm4gUFNIX0hpbnRfVGFibGUgIHBzX2RlYnVnX2hpbnRfdGFibGU7Ci0KLSAgdHlwZWRlZiB2b2lkCi0gICgqUFNIX0hpbnRGdW5jKSggUFNIX0hpbnQgIGhpbnQsCi0gICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgIHZlcnRpY2FsICk7Ci0KLSAgZXh0ZXJuIFBTSF9IaW50RnVuYyAgICBwc19kZWJ1Z19oaW50X2Z1bmM7Ci0KLSAgZXh0ZXJuIFBTSF9HbHlwaCAgICAgICBwc19kZWJ1Z19nbHlwaDsKLSNlbmRpZgotCi0KLSAgZXh0ZXJuIEZUX0Vycm9yCi0gIHBzX2hpbnRzX2FwcGx5KCBQU19IaW50cyAgICAgICAgcHNfaGludHMsCi0gICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgIFBTSF9HbG9iYWxzICAgICBnbG9iYWxzLAotICAgICAgICAgICAgICAgICAgRlRfUmVuZGVyX01vZGUgIGhpbnRfbW9kZSApOwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19QU0hBTEdPX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaGdsb2IuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hnbG9iLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MTZiZGMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaGdsb2IuYworKysgL2Rldi9udWxsCkBAIC0xLDc5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2hnbG9iLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUG9zdFNjcmlwdCBoaW50ZXIgZ2xvYmFsIGhpbnRpbmcgbWFuYWdlbWVudCAoYm9keSkuICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEluc3BpcmVkIGJ5IHRoZSBuZXcgYXV0by1oaW50ZXIgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KLS8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgInBzaGdsb2IuaCIKLQotI2lmZGVmIERFQlVHX0hJTlRFUgotICBQU0hfR2xvYmFscyAgcHNfZGVidWdfZ2xvYmFscyA9IE5VTEw7Ci0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgU1RBTkRBUkQgV0lEVEhTICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogc2NhbGUgdGhlIHdpZHRocy9oZWlnaHRzIHRhYmxlICovCi0gIHN0YXRpYyB2b2lkCi0gIHBzaF9nbG9iYWxzX3NjYWxlX3dpZHRocyggUFNIX0dsb2JhbHMgIGdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIGRpcmVjdGlvbiApCi0gIHsKLSAgICBQU0hfRGltZW5zaW9uICBkaW0gICA9ICZnbG9iYWxzLT5kaW1lbnNpb25bZGlyZWN0aW9uXTsKLSAgICBQU0hfV2lkdGhzICAgICBzdGR3ICA9ICZkaW0tPnN0ZHc7Ci0gICAgRlRfVUludCAgICAgICAgY291bnQgPSBzdGR3LT5jb3VudDsKLSAgICBQU0hfV2lkdGggICAgICB3aWR0aCA9IHN0ZHctPndpZHRoczsKLSAgICBQU0hfV2lkdGggICAgICBzdGFuZCA9IHdpZHRoOyAgICAgICAgICAgICAgIC8qIHN0YW5kYXJkIHdpZHRoL2hlaWdodCAqLwotICAgIEZUX0ZpeGVkICAgICAgIHNjYWxlID0gZGltLT5zY2FsZV9tdWx0OwotCi0KLSAgICBpZiAoIGNvdW50ID4gMCApCi0gICAgewotICAgICAgd2lkdGgtPmN1ciA9IEZUX011bEZpeCggd2lkdGgtPm9yZywgc2NhbGUgKTsKLSAgICAgIHdpZHRoLT5maXQgPSBGVF9QSVhfUk9VTkQoIHdpZHRoLT5jdXIgKTsKLQotICAgICAgd2lkdGgrKzsKLSAgICAgIGNvdW50LS07Ci0KLSAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCB3aWR0aCsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfUG9zICB3LCBkaXN0OwotCi0KLSAgICAgICAgdyAgICA9IEZUX011bEZpeCggd2lkdGgtPm9yZywgc2NhbGUgKTsKLSAgICAgICAgZGlzdCA9IHcgLSBzdGFuZC0+Y3VyOwotCi0gICAgICAgIGlmICggZGlzdCA8IDAgKQotICAgICAgICAgIGRpc3QgPSAtZGlzdDsKLQotICAgICAgICBpZiAoIGRpc3QgPCAxMjggKQotICAgICAgICAgIHcgPSBzdGFuZC0+Y3VyOwotCi0gICAgICAgIHdpZHRoLT5jdXIgPSB3OwotICAgICAgICB3aWR0aC0+Zml0ID0gRlRfUElYX1JPVU5EKCB3ICk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotI2lmIDAKLQotICAvKiBvcmdfd2lkdGggaXMgaXMgZm9udCB1bml0cywgcmVzdWx0IGluIGRldmljZSBwaXhlbHMsIDI2LjYgZm9ybWF0ICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfUG9zICkKLSAgcHNoX2RpbWVuc2lvbl9zbmFwX3dpZHRoKCBQU0hfRGltZW5zaW9uICBkaW1lbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgb3JnX3dpZHRoICkKLSAgewotICAgIEZUX1VJbnQgIG47Ci0gICAgRlRfUG9zICAgd2lkdGggICAgID0gRlRfTXVsRml4KCBvcmdfd2lkdGgsIGRpbWVuc2lvbi0+c2NhbGVfbXVsdCApOwotICAgIEZUX1BvcyAgIGJlc3QgICAgICA9IDY0ICsgMzIgKyAyOwotICAgIEZUX1BvcyAgIHJlZmVyZW5jZSA9IHdpZHRoOwotCi0KLSAgICBmb3IgKCBuID0gMDsgbiA8IGRpbWVuc2lvbi0+c3Rkdy5jb3VudDsgbisrICkKLSAgICB7Ci0gICAgICBGVF9Qb3MgIHc7Ci0gICAgICBGVF9Qb3MgIGRpc3Q7Ci0KLQotICAgICAgdyA9IGRpbWVuc2lvbi0+c3Rkdy53aWR0aHNbbl0uY3VyOwotICAgICAgZGlzdCA9IHdpZHRoIC0gdzsKLSAgICAgIGlmICggZGlzdCA8IDAgKQotICAgICAgICBkaXN0ID0gLWRpc3Q7Ci0gICAgICBpZiAoIGRpc3QgPCBiZXN0ICkKLSAgICAgIHsKLSAgICAgICAgYmVzdCAgICAgID0gZGlzdDsKLSAgICAgICAgcmVmZXJlbmNlID0gdzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIHdpZHRoID49IHJlZmVyZW5jZSApCi0gICAgewotICAgICAgd2lkdGggLT0gMHgyMTsKLSAgICAgIGlmICggd2lkdGggPCByZWZlcmVuY2UgKQotICAgICAgICB3aWR0aCA9IHJlZmVyZW5jZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHdpZHRoICs9IDB4MjE7Ci0gICAgICBpZiAoIHdpZHRoID4gcmVmZXJlbmNlICkKLSAgICAgICAgd2lkdGggPSByZWZlcmVuY2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHdpZHRoOwotICB9Ci0KLSNlbmRpZiAvKiAwICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgIEJMVUUgWk9ORVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgdm9pZAotICBwc2hfYmx1ZXNfc2V0X3pvbmVzXzAoIFBTSF9CbHVlcyAgICAgICB0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICAgICAgIGlzX290aGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgcmVhZF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCogICAgICAgcmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBQU0hfQmx1ZV9UYWJsZSAgdG9wX3RhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIFBTSF9CbHVlX1RhYmxlICBib3RfdGFibGUgKQotICB7Ci0gICAgRlRfVUludCAgY291bnRfdG9wID0gdG9wX3RhYmxlLT5jb3VudDsKLSAgICBGVF9VSW50ICBjb3VudF9ib3QgPSBib3RfdGFibGUtPmNvdW50OwotICAgIEZUX0Jvb2wgIGZpcnN0ICAgICA9IDE7Ci0KLSAgICBGVF9VTlVTRUQoIHRhcmdldCApOwotCi0KLSAgICBmb3IgKCA7IHJlYWRfY291bnQgPiAxOyByZWFkX2NvdW50IC09IDIgKQotICAgIHsKLSAgICAgIEZUX0ludCAgICAgICAgIHJlZmVyZW5jZSwgZGVsdGE7Ci0gICAgICBGVF9VSW50ICAgICAgICBjb3VudDsKLSAgICAgIFBTSF9CbHVlX1pvbmUgIHpvbmVzLCB6b25lOwotICAgICAgRlRfQm9vbCAgICAgICAgdG9wOwotCi0KLSAgICAgIC8qIHJlYWQgYmx1ZSB6b25lIGVudHJ5LCBhbmQgc2VsZWN0IHRhcmdldCB0b3AvYm90dG9tIHpvbmUgKi8KLSAgICAgIHRvcCA9IDA7Ci0gICAgICBpZiAoIGZpcnN0IHx8IGlzX290aGVycyApCi0gICAgICB7Ci0gICAgICAgIHJlZmVyZW5jZSA9IHJlYWRbMV07Ci0gICAgICAgIGRlbHRhICAgICA9IHJlYWRbMF0gLSByZWZlcmVuY2U7Ci0KLSAgICAgICAgem9uZXMgPSBib3RfdGFibGUtPnpvbmVzOwotICAgICAgICBjb3VudCA9IGNvdW50X2JvdDsKLSAgICAgICAgZmlyc3QgPSAwOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZWZlcmVuY2UgPSByZWFkWzBdOwotICAgICAgICBkZWx0YSAgICAgPSByZWFkWzFdIC0gcmVmZXJlbmNlOwotCi0gICAgICAgIHpvbmVzID0gdG9wX3RhYmxlLT56b25lczsKLSAgICAgICAgY291bnQgPSBjb3VudF90b3A7Ci0gICAgICAgIHRvcCAgID0gMTsKLSAgICAgIH0KLQotICAgICAgLyogaW5zZXJ0IGludG8gc29ydGVkIHRhYmxlICovCi0gICAgICB6b25lID0gem9uZXM7Ci0gICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgem9uZSsrICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCByZWZlcmVuY2UgPCB6b25lLT5vcmdfcmVmICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBpZiAoIHJlZmVyZW5jZSA9PSB6b25lLT5vcmdfcmVmICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0ludCAgZGVsdGEwID0gem9uZS0+b3JnX2RlbHRhOwotCi0KLSAgICAgICAgICAvKiB3ZSBoYXZlIHR3byB6b25lcyBvbiB0aGUgc2FtZSByZWZlcmVuY2UgcG9zaXRpb24gLS0gKi8KLSAgICAgICAgICAvKiBvbmx5IGtlZXAgdGhlIGxhcmdlc3Qgb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBpZiAoIGRlbHRhIDwgMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBkZWx0YSA8IGRlbHRhMCApCi0gICAgICAgICAgICAgIHpvbmUtPm9yZ19kZWx0YSA9IGRlbHRhOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBkZWx0YSA+IGRlbHRhMCApCi0gICAgICAgICAgICAgIHpvbmUtPm9yZ19kZWx0YSA9IGRlbHRhOwotICAgICAgICAgIH0KLSAgICAgICAgICBnb3RvIFNraXA7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgICAgICB6b25lW2NvdW50XSA9IHpvbmVbY291bnQtMV07Ci0KLSAgICAgIHpvbmUtPm9yZ19yZWYgICA9IHJlZmVyZW5jZTsKLSAgICAgIHpvbmUtPm9yZ19kZWx0YSA9IGRlbHRhOwotCi0gICAgICBpZiAoIHRvcCApCi0gICAgICAgIGNvdW50X3RvcCsrOwotICAgICAgZWxzZQotICAgICAgICBjb3VudF9ib3QrKzsKLQotICAgIFNraXA6Ci0gICAgICByZWFkICs9IDI7Ci0gICAgfQotCi0gICAgdG9wX3RhYmxlLT5jb3VudCA9IGNvdW50X3RvcDsKLSAgICBib3RfdGFibGUtPmNvdW50ID0gY291bnRfYm90OwotICB9Ci0KLQotICAvKiBSZS1yZWFkIGJsdWUgem9uZXMgZnJvbSB0aGUgb3JpZ2luYWwgZm9udHMgYW5kIHN0b3JlIHRoZW0gaW50byBvdXQgKi8KLSAgLyogcHJpdmF0ZSBzdHJ1Y3R1cmUuICBUaGlzIGZ1bmN0aW9uIHJlLW9yZGVycywgc2FuaXRpemVzIGFuZCAgICAgICAgICovCi0gIC8qIGZ1enotZXhwYW5kcyB0aGUgem9uZXMgYXMgd2VsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBwc2hfYmx1ZXNfc2V0X3pvbmVzKCBQU0hfQmx1ZXMgIHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfU2hvcnQqICBibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBjb3VudF9vdGhlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1Nob3J0KiAgb3RoZXJfYmx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgZnV6eiwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBmYW1pbHkgKQotICB7Ci0gICAgUFNIX0JsdWVfVGFibGUgIHRvcF90YWJsZSwgYm90X3RhYmxlOwotICAgIEZUX1VJbnQgICAgICAgICBjb3VudF90b3AsIGNvdW50X2JvdDsKLQotCi0gICAgaWYgKCBmYW1pbHkgKQotICAgIHsKLSAgICAgIHRvcF90YWJsZSA9ICZ0YXJnZXQtPmZhbWlseV90b3A7Ci0gICAgICBib3RfdGFibGUgPSAmdGFyZ2V0LT5mYW1pbHlfYm90dG9tOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdG9wX3RhYmxlID0gJnRhcmdldC0+bm9ybWFsX3RvcDsKLSAgICAgIGJvdF90YWJsZSA9ICZ0YXJnZXQtPm5vcm1hbF9ib3R0b207Ci0gICAgfQotCi0gICAgLyogcmVhZCB0aGUgaW5wdXQgYmx1ZSB6b25lcywgYW5kIGJ1aWxkIHR3byBzb3J0ZWQgdGFibGVzICAqLwotICAgIC8qIChvbmUgZm9yIHRoZSB0b3Agem9uZXMsIHRoZSBvdGhlciBmb3IgdGhlIGJvdHRvbSB6b25lcykgKi8KLSAgICB0b3BfdGFibGUtPmNvdW50ID0gMDsKLSAgICBib3RfdGFibGUtPmNvdW50ID0gMDsKLQotICAgIC8qIGZpcnN0LCB0aGUgYmx1ZXMgKi8KLSAgICBwc2hfYmx1ZXNfc2V0X3pvbmVzXzAoIHRhcmdldCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LCBibHVlcywgdG9wX3RhYmxlLCBib3RfdGFibGUgKTsKLSAgICBwc2hfYmx1ZXNfc2V0X3pvbmVzXzAoIHRhcmdldCwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50X290aGVycywgb3RoZXJfYmx1ZXMsIHRvcF90YWJsZSwgYm90X3RhYmxlICk7Ci0KLSAgICBjb3VudF90b3AgPSB0b3BfdGFibGUtPmNvdW50OwotICAgIGNvdW50X2JvdCA9IGJvdF90YWJsZS0+Y291bnQ7Ci0KLSAgICAvKiBzYW5pdGl6ZSB0b3AgdGFibGUgKi8KLSAgICBpZiAoIGNvdW50X3RvcCA+IDAgKQotICAgIHsKLSAgICAgIFBTSF9CbHVlX1pvbmUgIHpvbmUgPSB0b3BfdGFibGUtPnpvbmVzOwotCi0KLSAgICAgIGZvciAoIGNvdW50ID0gY291bnRfdG9wOyBjb3VudCA+IDA7IGNvdW50LS0sIHpvbmUrKyApCi0gICAgICB7Ci0gICAgICAgIEZUX0ludCAgZGVsdGE7Ci0KLQotICAgICAgICBpZiAoIGNvdW50ID4gMSApCi0gICAgICAgIHsKLSAgICAgICAgICBkZWx0YSA9IHpvbmVbMV0ub3JnX3JlZiAtIHpvbmVbMF0ub3JnX3JlZjsKLSAgICAgICAgICBpZiAoIHpvbmUtPm9yZ19kZWx0YSA+IGRlbHRhICkKLSAgICAgICAgICAgIHpvbmUtPm9yZ19kZWx0YSA9IGRlbHRhOwotICAgICAgICB9Ci0KLSAgICAgICAgem9uZS0+b3JnX2JvdHRvbSA9IHpvbmUtPm9yZ19yZWY7Ci0gICAgICAgIHpvbmUtPm9yZ190b3AgICAgPSB6b25lLT5vcmdfZGVsdGEgKyB6b25lLT5vcmdfcmVmOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIHNhbml0aXplIGJvdHRvbSB0YWJsZSAqLwotICAgIGlmICggY291bnRfYm90ID4gMCApCi0gICAgewotICAgICAgUFNIX0JsdWVfWm9uZSAgem9uZSA9IGJvdF90YWJsZS0+em9uZXM7Ci0KLQotICAgICAgZm9yICggY291bnQgPSBjb3VudF9ib3Q7IGNvdW50ID4gMDsgY291bnQtLSwgem9uZSsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfSW50ICBkZWx0YTsKLQotCi0gICAgICAgIGlmICggY291bnQgPiAxICkKLSAgICAgICAgewotICAgICAgICAgIGRlbHRhID0gem9uZVswXS5vcmdfcmVmIC0gem9uZVsxXS5vcmdfcmVmOwotICAgICAgICAgIGlmICggem9uZS0+b3JnX2RlbHRhIDwgZGVsdGEgKQotICAgICAgICAgICAgem9uZS0+b3JnX2RlbHRhID0gZGVsdGE7Ci0gICAgICAgIH0KLQotICAgICAgICB6b25lLT5vcmdfdG9wICAgID0gem9uZS0+b3JnX3JlZjsKLSAgICAgICAgem9uZS0+b3JnX2JvdHRvbSA9IHpvbmUtPm9yZ19kZWx0YSArIHpvbmUtPm9yZ19yZWY7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogZXhwYW5kIHRvcCBhbmQgYm90dG9tIHRhYmxlcyB3aXRoIGJsdWUgZnV6eiAqLwotICAgIHsKLSAgICAgIEZUX0ludCAgICAgICAgIGRpbSwgdG9wLCBib3QsIGRlbHRhOwotICAgICAgUFNIX0JsdWVfWm9uZSAgem9uZTsKLQotCi0gICAgICB6b25lICA9IHRvcF90YWJsZS0+em9uZXM7Ci0gICAgICBjb3VudCA9IGNvdW50X3RvcDsKLQotICAgICAgZm9yICggZGltID0gMTsgZGltID49IDA7IGRpbS0tICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBjb3VudCA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogZXhwYW5kIHRoZSBib3R0b20gb2YgdGhlIGxvd2VzdCB6b25lIG5vcm1hbGx5ICovCi0gICAgICAgICAgem9uZS0+b3JnX2JvdHRvbSAtPSBmdXp6OwotCi0gICAgICAgICAgLyogZXhwYW5kIHRoZSB0b3AgYW5kIGJvdHRvbSBvZiBpbnRlcm1lZGlhdGUgem9uZXM7ICAgICovCi0gICAgICAgICAgLyogY2hlY2tpbmcgdGhhdCB0aGUgaW50ZXJ2YWwgaXMgc21hbGxlciB0aGFuIHRoZSBmdXp6ICovCi0gICAgICAgICAgdG9wID0gem9uZS0+b3JnX3RvcDsKLQotICAgICAgICAgIGZvciAoIGNvdW50LS07IGNvdW50ID4gMDsgY291bnQtLSApCi0gICAgICAgICAgewotICAgICAgICAgICAgYm90ICAgPSB6b25lWzFdLm9yZ19ib3R0b207Ci0gICAgICAgICAgICBkZWx0YSA9IGJvdCAtIHRvcDsKLQotICAgICAgICAgICAgaWYgKCBkZWx0YSAvIDIgPCBmdXp6ICkKLSAgICAgICAgICAgICAgem9uZVswXS5vcmdfdG9wID0gem9uZVsxXS5vcmdfYm90dG9tID0gdG9wICsgZGVsdGEgLyAyOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB6b25lWzBdLm9yZ190b3AgICAgPSB0b3AgKyBmdXp6OwotICAgICAgICAgICAgICB6b25lWzFdLm9yZ19ib3R0b20gPSBib3QgLSBmdXp6OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB6b25lKys7Ci0gICAgICAgICAgICB0b3AgPSB6b25lLT5vcmdfdG9wOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIGV4cGFuZCB0aGUgdG9wIG9mIHRoZSBoaWdoZXN0IHpvbmUgbm9ybWFsbHkgKi8KLSAgICAgICAgICB6b25lLT5vcmdfdG9wID0gdG9wICsgZnV6ejsKLSAgICAgICAgfQotICAgICAgICB6b25lICA9IGJvdF90YWJsZS0+em9uZXM7Ci0gICAgICAgIGNvdW50ID0gY291bnRfYm90OwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyogcmVzZXQgdGhlIGJsdWVzIHRhYmxlIHdoZW4gdGhlIGRldmljZSB0cmFuc2Zvcm0gY2hhbmdlcyAqLwotICBzdGF0aWMgdm9pZAotICBwc2hfYmx1ZXNfc2NhbGVfem9uZXMoIFBTSF9CbHVlcyAgYmx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICBzY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgIGRlbHRhICkKLSAgewotICAgIEZUX1VJbnQgICAgICAgICBjb3VudDsKLSAgICBGVF9VSW50ICAgICAgICAgbnVtOwotICAgIFBTSF9CbHVlX1RhYmxlICB0YWJsZSA9IE5VTEw7Ci0KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBEZXRlcm1pbmUgd2hldGhlciB3ZSBuZWVkIHRvIHN1cHByZXNzIG92ZXJzaG9vdHMgb3IgICAgKi8KLSAgICAvKiBub3QuICBXZSBzaW1wbHkgbmVlZCB0byBjb21wYXJlIHRoZSB2ZXJ0aWNhbCBzY2FsZSAgICAgKi8KLSAgICAvKiBwYXJhbWV0ZXIgdG8gdGhlIHJhdyBibHVlc2NhbGUgdmFsdWUuICBIZXJlIGlzIHdoeTogICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgIFdlIG5lZWQgdG8gc3VwcHJlc3Mgb3ZlcnNob290cyBmb3IgYWxsIHBvaW50c2l6ZXMuICAgKi8KLSAgICAvKiAgIEF0IDMwMGRwaSB0aGF0IHNhdGlzZmllczogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgIHBvaW50c2l6ZSA8IDI0MCpibHVlc2NhbGUgKyAwLjQ5ICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgIFRoaXMgY29ycmVzcG9uZHMgdG86ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgIHBpeGVsc2l6ZSA8IDEwMDAqYmx1ZXNjYWxlICsgNDkvMjQgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgIHNjYWxlKkVNX1NpemUgPCAxMDAwKmJsdWVzY2FsZSArIDQ5LzI0ICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgIEhvd2V2ZXIsIGZvciBub3JtYWwgVHlwZSAxIGZvbnRzLCBFTV9TaXplIGlzIDEwMDAhICAgKi8KLSAgICAvKiAgIFdlIHRodXMgb25seSBjaGVjazogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgIHNjYWxlIDwgYmx1ZXNjYWxlICsgNDkvMjQwMDAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgIHdoaWNoIHdlIHNob3J0ZW4gdG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICJzY2FsZSA8IGJsdWVzY2FsZSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBOb3RlIHRoYXQgYGJsdWVfc2NhbGUnIGlzIHN0b3JlZCAxMDAwIHRpbWVzIGl0cyByZWFsICAgKi8KLSAgICAvKiB2YWx1ZSwgYW5kIHRoYXQgYHNjYWxlJyBjb252ZXJ0cyBmcm9tIGZvbnQgdW5pdHMgdG8gICAgKi8KLSAgICAvKiBmcmFjdGlvbmFsIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIC8qIDEwMDAgLyA2NCA9IDEyNSAvIDggKi8KLSAgICBpZiAoIHNjYWxlID49IDB4MjBDNDlCQUwgKQotICAgICAgYmx1ZXMtPm5vX292ZXJzaG9vdHMgPSBGVF9CT09MKCBzY2FsZSA8IGJsdWVzLT5ibHVlX3NjYWxlICogOCAvIDEyNSApOwotICAgIGVsc2UKLSAgICAgIGJsdWVzLT5ub19vdmVyc2hvb3RzID0gRlRfQk9PTCggc2NhbGUgKiAxMjUgPCBibHVlcy0+Ymx1ZV9zY2FsZSAqIDggKTsKLQotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICBUaGUgYmx1ZSB0aHJlc2hvbGQgaXMgdGhlIGZvbnQgdW5pdHMgZGlzdGFuY2UgdW5kZXIgICAqLwotICAgIC8qICB3aGljaCBvdmVyc2hvb3RzIGFyZSBzdXBwcmVzc2VkIGR1ZSB0byB0aGUgQmx1ZVNoaWZ0ICAqLwotICAgIC8qICBldmVuIGlmIHRoZSBzY2FsZSBpcyBncmVhdGVyIHRoYW4gQmx1ZVNjYWxlLiAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICBJdCBpcyB0aGUgc21hbGxlc3QgZGlzdGFuY2Ugc3VjaCB0aGF0ICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgIGRpc3QgPD0gQmx1ZVNoaWZ0ICYmIGRpc3Qqc2NhbGUgPD0gMC41IHBpeGVscyAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHsKLSAgICAgIEZUX0ludCAgdGhyZXNob2xkID0gYmx1ZXMtPmJsdWVfc2hpZnQ7Ci0KLQotICAgICAgd2hpbGUgKCB0aHJlc2hvbGQgPiAwICYmIEZUX011bEZpeCggdGhyZXNob2xkLCBzY2FsZSApID4gMzIgKQotICAgICAgICB0aHJlc2hvbGQtLTsKLQotICAgICAgYmx1ZXMtPmJsdWVfdGhyZXNob2xkID0gdGhyZXNob2xkOwotICAgIH0KLQotICAgIGZvciAoIG51bSA9IDA7IG51bSA8IDQ7IG51bSsrICkKLSAgICB7Ci0gICAgICBQU0hfQmx1ZV9ab25lICB6b25lOwotCi0KLSAgICAgIHN3aXRjaCAoIG51bSApCi0gICAgICB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgIHRhYmxlID0gJmJsdWVzLT5ub3JtYWxfdG9wOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgdGFibGUgPSAmYmx1ZXMtPm5vcm1hbF9ib3R0b207Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAyOgotICAgICAgICB0YWJsZSA9ICZibHVlcy0+ZmFtaWx5X3RvcDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0YWJsZSA9ICZibHVlcy0+ZmFtaWx5X2JvdHRvbTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHpvbmUgID0gdGFibGUtPnpvbmVzOwotICAgICAgY291bnQgPSB0YWJsZS0+Y291bnQ7Ci0gICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgem9uZSsrICkKLSAgICAgIHsKLSAgICAgICAgem9uZS0+Y3VyX3RvcCAgICA9IEZUX011bEZpeCggem9uZS0+b3JnX3RvcCwgICAgc2NhbGUgKSArIGRlbHRhOwotICAgICAgICB6b25lLT5jdXJfYm90dG9tID0gRlRfTXVsRml4KCB6b25lLT5vcmdfYm90dG9tLCBzY2FsZSApICsgZGVsdGE7Ci0gICAgICAgIHpvbmUtPmN1cl9yZWYgICAgPSBGVF9NdWxGaXgoIHpvbmUtPm9yZ19yZWYsICAgIHNjYWxlICkgKyBkZWx0YTsKLSAgICAgICAgem9uZS0+Y3VyX2RlbHRhICA9IEZUX011bEZpeCggem9uZS0+b3JnX2RlbHRhLCAgc2NhbGUgKTsKLQotICAgICAgICAvKiByb3VuZCBzY2FsZWQgcmVmZXJlbmNlIHBvc2l0aW9uICovCi0gICAgICAgIHpvbmUtPmN1cl9yZWYgPSBGVF9QSVhfUk9VTkQoIHpvbmUtPmN1cl9yZWYgKTsKLQotI2lmIDAKLSAgICAgICAgaWYgKCB6b25lLT5jdXJfcmVmID4gem9uZS0+Y3VyX3RvcCApCi0gICAgICAgICAgem9uZS0+Y3VyX3JlZiAtPSA2NDsKLSAgICAgICAgZWxzZSBpZiAoIHpvbmUtPmN1cl9yZWYgPCB6b25lLT5jdXJfYm90dG9tICkKLSAgICAgICAgICB6b25lLT5jdXJfcmVmICs9IDY0OwotI2VuZGlmCi0gICAgICB9Ci0gICAgfQotCi0gICAgLyogcHJvY2VzcyB0aGUgZmFtaWxpZXMgbm93ICovCi0KLSAgICBmb3IgKCBudW0gPSAwOyBudW0gPCAyOyBudW0rKyApCi0gICAgewotICAgICAgUFNIX0JsdWVfWm9uZSAgIHpvbmUxLCB6b25lMjsKLSAgICAgIEZUX1VJbnQgICAgICAgICBjb3VudDEsIGNvdW50MjsKLSAgICAgIFBTSF9CbHVlX1RhYmxlICBub3JtYWwsIGZhbWlseTsKLQotCi0gICAgICBzd2l0Y2ggKCBudW0gKQotICAgICAgewotICAgICAgY2FzZSAwOgotICAgICAgICBub3JtYWwgPSAmYmx1ZXMtPm5vcm1hbF90b3A7Ci0gICAgICAgIGZhbWlseSA9ICZibHVlcy0+ZmFtaWx5X3RvcDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIG5vcm1hbCA9ICZibHVlcy0+bm9ybWFsX2JvdHRvbTsKLSAgICAgICAgZmFtaWx5ID0gJmJsdWVzLT5mYW1pbHlfYm90dG9tOwotICAgICAgfQotCi0gICAgICB6b25lMSAgPSBub3JtYWwtPnpvbmVzOwotICAgICAgY291bnQxID0gbm9ybWFsLT5jb3VudDsKLQotICAgICAgZm9yICggOyBjb3VudDEgPiAwOyBjb3VudDEtLSwgem9uZTErKyApCi0gICAgICB7Ci0gICAgICAgIC8qIHRyeSB0byBmaW5kIGEgZmFtaWx5IHpvbmUgd2hvc2UgcmVmZXJlbmNlIHBvc2l0aW9uIGlzIGxlc3MgKi8KLSAgICAgICAgLyogdGhhbiAxIHBpeGVsIGZhciBmcm9tIHRoZSBjdXJyZW50IHpvbmUgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICB6b25lMiAgPSBmYW1pbHktPnpvbmVzOwotICAgICAgICBjb3VudDIgPSBmYW1pbHktPmNvdW50OwotCi0gICAgICAgIGZvciAoIDsgY291bnQyID4gMDsgY291bnQyLS0sIHpvbmUyKysgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfUG9zICBEZWx0YTsKLQotCi0gICAgICAgICAgRGVsdGEgPSB6b25lMS0+b3JnX3JlZiAtIHpvbmUyLT5vcmdfcmVmOwotICAgICAgICAgIGlmICggRGVsdGEgPCAwICkKLSAgICAgICAgICAgIERlbHRhID0gLURlbHRhOwotCi0gICAgICAgICAgaWYgKCBGVF9NdWxGaXgoIERlbHRhLCBzY2FsZSApIDwgNjQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHpvbmUxLT5jdXJfdG9wICAgID0gem9uZTItPmN1cl90b3A7Ci0gICAgICAgICAgICB6b25lMS0+Y3VyX2JvdHRvbSA9IHpvbmUyLT5jdXJfYm90dG9tOwotICAgICAgICAgICAgem9uZTEtPmN1cl9yZWYgICAgPSB6b25lMi0+Y3VyX3JlZjsKLSAgICAgICAgICAgIHpvbmUxLT5jdXJfZGVsdGEgID0gem9uZTItPmN1cl9kZWx0YTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyogY2FsY3VsYXRlIHRoZSBtYXhpbXVtIGhlaWdodCBvZiBnaXZlbiBibHVlIHpvbmVzICovCi0gIHN0YXRpYyBGVF9TaG9ydAotICBwc2hfY2FsY19tYXhfaGVpZ2h0KCBGVF9VSW50ICAgICAgICAgIG51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU2hvcnQqICB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1Nob3J0ICAgICAgICAgY3VyX21heCApCi0gIHsKLSAgICBGVF9VSW50ICBjb3VudDsKLQotCi0gICAgZm9yICggY291bnQgPSAwOyBjb3VudCA8IG51bTsgY291bnQgKz0gMiApCi0gICAgewotICAgICAgRlRfU2hvcnQgIGN1cl9oZWlnaHQgPSB2YWx1ZXNbY291bnQgKyAxXSAtIHZhbHVlc1tjb3VudF07Ci0KLQotICAgICAgaWYgKCBjdXJfaGVpZ2h0ID4gY3VyX21heCApCi0gICAgICAgIGN1cl9tYXggPSBjdXJfaGVpZ2h0OwotICAgIH0KLQotICAgIHJldHVybiBjdXJfbWF4OwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBwc2hfYmx1ZXNfc25hcF9zdGVtKCBQU0hfQmx1ZXMgICAgICBibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgc3RlbV90b3AsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIHN0ZW1fYm90LAotICAgICAgICAgICAgICAgICAgICAgICBQU0hfQWxpZ25tZW50ICBhbGlnbm1lbnQgKQotICB7Ci0gICAgUFNIX0JsdWVfVGFibGUgIHRhYmxlOwotICAgIEZUX1VJbnQgICAgICAgICBjb3VudDsKLSAgICBGVF9Qb3MgICAgICAgICAgZGVsdGE7Ci0gICAgUFNIX0JsdWVfWm9uZSAgIHpvbmU7Ci0gICAgRlRfSW50ICAgICAgICAgIG5vX3Nob290czsKLQotCi0gICAgYWxpZ25tZW50LT5hbGlnbiA9IFBTSF9CTFVFX0FMSUdOX05PTkU7Ci0KLSAgICBub19zaG9vdHMgPSBibHVlcy0+bm9fb3ZlcnNob290czsKLQotICAgIC8qIGxvb2sgdXAgc3RlbSB0b3AgaW4gdG9wIHpvbmVzIHRhYmxlICovCi0gICAgdGFibGUgPSAmYmx1ZXMtPm5vcm1hbF90b3A7Ci0gICAgY291bnQgPSB0YWJsZS0+Y291bnQ7Ci0gICAgem9uZSAgPSB0YWJsZS0+em9uZXM7Ci0KLSAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgem9uZSsrICkKLSAgICB7Ci0gICAgICBkZWx0YSA9IHN0ZW1fdG9wIC0gem9uZS0+b3JnX2JvdHRvbTsKLSAgICAgIGlmICggZGVsdGEgPCAtYmx1ZXMtPmJsdWVfZnV6eiApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBpZiAoIHN0ZW1fdG9wIDw9IHpvbmUtPm9yZ190b3AgKyBibHVlcy0+Ymx1ZV9mdXp6ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBub19zaG9vdHMgfHwgZGVsdGEgPD0gYmx1ZXMtPmJsdWVfdGhyZXNob2xkICkKLSAgICAgICAgewotICAgICAgICAgIGFsaWdubWVudC0+YWxpZ24gICAgfD0gUFNIX0JMVUVfQUxJR05fVE9QOwotICAgICAgICAgIGFsaWdubWVudC0+YWxpZ25fdG9wID0gem9uZS0+Y3VyX3JlZjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBsb29rIHVwIHN0ZW0gYm90dG9tIGluIGJvdHRvbSB6b25lcyB0YWJsZSAqLwotICAgIHRhYmxlID0gJmJsdWVzLT5ub3JtYWxfYm90dG9tOwotICAgIGNvdW50ID0gdGFibGUtPmNvdW50OwotICAgIHpvbmUgID0gdGFibGUtPnpvbmVzICsgY291bnQtMTsKLQotICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCB6b25lLS0gKQotICAgIHsKLSAgICAgIGRlbHRhID0gem9uZS0+b3JnX3RvcCAtIHN0ZW1fYm90OwotICAgICAgaWYgKCBkZWx0YSA8IC1ibHVlcy0+Ymx1ZV9mdXp6ICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmICggc3RlbV9ib3QgPj0gem9uZS0+b3JnX2JvdHRvbSAtIGJsdWVzLT5ibHVlX2Z1enogKQotICAgICAgewotICAgICAgICBpZiAoIG5vX3Nob290cyB8fCBkZWx0YSA8IGJsdWVzLT5ibHVlX3RocmVzaG9sZCApCi0gICAgICAgIHsKLSAgICAgICAgICBhbGlnbm1lbnQtPmFsaWduICAgIHw9IFBTSF9CTFVFX0FMSUdOX0JPVDsKLSAgICAgICAgICBhbGlnbm1lbnQtPmFsaWduX2JvdCA9IHpvbmUtPmN1cl9yZWY7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUwgSElOVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgdm9pZAotICBwc2hfZ2xvYmFsc19kZXN0cm95KCBQU0hfR2xvYmFscyAgZ2xvYmFscyApCi0gIHsKLSAgICBpZiAoIGdsb2JhbHMgKQotICAgIHsKLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5OwotCi0KLSAgICAgIG1lbW9yeSA9IGdsb2JhbHMtPm1lbW9yeTsKLSAgICAgIGdsb2JhbHMtPmRpbWVuc2lvblswXS5zdGR3LmNvdW50ID0gMDsKLSAgICAgIGdsb2JhbHMtPmRpbWVuc2lvblsxXS5zdGR3LmNvdW50ID0gMDsKLQotICAgICAgZ2xvYmFscy0+Ymx1ZXMubm9ybWFsX3RvcC5jb3VudCAgICA9IDA7Ci0gICAgICBnbG9iYWxzLT5ibHVlcy5ub3JtYWxfYm90dG9tLmNvdW50ID0gMDsKLSAgICAgIGdsb2JhbHMtPmJsdWVzLmZhbWlseV90b3AuY291bnQgICAgPSAwOwotICAgICAgZ2xvYmFscy0+Ymx1ZXMuZmFtaWx5X2JvdHRvbS5jb3VudCA9IDA7Ci0KLSAgICAgIEZUX0ZSRUUoIGdsb2JhbHMgKTsKLQotI2lmZGVmIERFQlVHX0hJTlRFUgotICAgICAgcHNfZGVidWdfZ2xvYmFscyA9IE5VTEw7Ci0jZW5kaWYKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwc2hfZ2xvYmFsc19uZXcoIEZUX01lbW9yeSAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgIFQxX1ByaXZhdGUqICAgcHJpdiwKLSAgICAgICAgICAgICAgICAgICBQU0hfR2xvYmFscyAgKmFnbG9iYWxzICkKLSAgewotICAgIFBTSF9HbG9iYWxzICBnbG9iYWxzID0gTlVMTDsKLSAgICBGVF9FcnJvciAgICAgZXJyb3I7Ci0KLQotICAgIGlmICggIUZUX05FVyggZ2xvYmFscyApICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICAgIGNvdW50OwotICAgICAgRlRfU2hvcnQqICByZWFkOwotCi0KLSAgICAgIGdsb2JhbHMtPm1lbW9yeSA9IG1lbW9yeTsKLQotICAgICAgLyogY29weSBzdGFuZGFyZCB3aWR0aHMgKi8KLSAgICAgIHsKLSAgICAgICAgUFNIX0RpbWVuc2lvbiAgZGltICAgPSAmZ2xvYmFscy0+ZGltZW5zaW9uWzFdOwotICAgICAgICBQU0hfV2lkdGggICAgICB3cml0ZSA9IGRpbS0+c3Rkdy53aWR0aHM7Ci0KLQotICAgICAgICB3cml0ZS0+b3JnID0gcHJpdi0+c3RhbmRhcmRfd2lkdGhbMF07Ci0gICAgICAgIHdyaXRlKys7Ci0KLSAgICAgICAgcmVhZCA9IHByaXYtPnNuYXBfd2lkdGhzOwotICAgICAgICBmb3IgKCBjb3VudCA9IHByaXYtPm51bV9zbmFwX3dpZHRoczsgY291bnQgPiAwOyBjb3VudC0tICkKLSAgICAgICAgewotICAgICAgICAgIHdyaXRlLT5vcmcgPSAqcmVhZDsKLSAgICAgICAgICB3cml0ZSsrOwotICAgICAgICAgIHJlYWQrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGRpbS0+c3Rkdy5jb3VudCA9IHByaXYtPm51bV9zbmFwX3dpZHRocyArIDE7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNvcHkgc3RhbmRhcmQgaGVpZ2h0cyAqLwotICAgICAgewotICAgICAgICBQU0hfRGltZW5zaW9uICBkaW0gPSAmZ2xvYmFscy0+ZGltZW5zaW9uWzBdOwotICAgICAgICBQU0hfV2lkdGggICAgICB3cml0ZSA9IGRpbS0+c3Rkdy53aWR0aHM7Ci0KLQotICAgICAgICB3cml0ZS0+b3JnID0gcHJpdi0+c3RhbmRhcmRfaGVpZ2h0WzBdOwotICAgICAgICB3cml0ZSsrOwotICAgICAgICByZWFkID0gcHJpdi0+c25hcF9oZWlnaHRzOwotICAgICAgICBmb3IgKCBjb3VudCA9IHByaXYtPm51bV9zbmFwX2hlaWdodHM7IGNvdW50ID4gMDsgY291bnQtLSApCi0gICAgICAgIHsKLSAgICAgICAgICB3cml0ZS0+b3JnID0gKnJlYWQ7Ci0gICAgICAgICAgd3JpdGUrKzsKLSAgICAgICAgICByZWFkKys7Ci0gICAgICAgIH0KLQotICAgICAgICBkaW0tPnN0ZHcuY291bnQgPSBwcml2LT5udW1fc25hcF9oZWlnaHRzICsgMTsKLSAgICAgIH0KLQotICAgICAgLyogY29weSBibHVlIHpvbmVzICovCi0gICAgICBwc2hfYmx1ZXNfc2V0X3pvbmVzKCAmZ2xvYmFscy0+Ymx1ZXMsIHByaXYtPm51bV9ibHVlX3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPmJsdWVfdmFsdWVzLCBwcml2LT5udW1fb3RoZXJfYmx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5vdGhlcl9ibHVlcywgcHJpdi0+Ymx1ZV9mdXp6LCAwICk7Ci0KLSAgICAgIHBzaF9ibHVlc19zZXRfem9uZXMoICZnbG9iYWxzLT5ibHVlcywgcHJpdi0+bnVtX2ZhbWlseV9ibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPmZhbWlseV9ibHVlcywgcHJpdi0+bnVtX2ZhbWlseV9vdGhlcl9ibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPmZhbWlseV9vdGhlcl9ibHVlcywgcHJpdi0+Ymx1ZV9mdXp6LCAxICk7Ci0KLSAgICAgIC8qIGxpbWl0IHRoZSBCbHVlU2NhbGUgdmFsdWUgdG8gYDEgLyBtYXhfb2ZfYmx1ZV96b25lX2hlaWdodHMnICovCi0gICAgICB7Ci0gICAgICAgIEZUX0ZpeGVkICBtYXhfc2NhbGU7Ci0gICAgICAgIEZUX1Nob3J0ICBtYXhfaGVpZ2h0ID0gMTsKLQotCi0gICAgICAgIG1heF9oZWlnaHQgPSBwc2hfY2FsY19tYXhfaGVpZ2h0KCBwcml2LT5udW1fYmx1ZV92YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5ibHVlX3ZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9oZWlnaHQgKTsKLSAgICAgICAgbWF4X2hlaWdodCA9IHBzaF9jYWxjX21heF9oZWlnaHQoIHByaXYtPm51bV9vdGhlcl9ibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPm90aGVyX2JsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2hlaWdodCApOwotICAgICAgICBtYXhfaGVpZ2h0ID0gcHNoX2NhbGNfbWF4X2hlaWdodCggcHJpdi0+bnVtX2ZhbWlseV9ibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPmZhbWlseV9ibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9oZWlnaHQgKTsKLSAgICAgICAgbWF4X2hlaWdodCA9IHBzaF9jYWxjX21heF9oZWlnaHQoIHByaXYtPm51bV9mYW1pbHlfb3RoZXJfYmx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5mYW1pbHlfb3RoZXJfYmx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfaGVpZ2h0ICk7Ci0KLSAgICAgICAgLyogQmx1ZVNjYWxlIGlzIHNjYWxlZCAxMDAwIHRpbWVzICovCi0gICAgICAgIG1heF9zY2FsZSA9IEZUX0RpdkZpeCggMTAwMCwgbWF4X2hlaWdodCApOwotICAgICAgICBnbG9iYWxzLT5ibHVlcy5ibHVlX3NjYWxlID0gcHJpdi0+Ymx1ZV9zY2FsZSA8IG1heF9zY2FsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHByaXYtPmJsdWVfc2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtYXhfc2NhbGU7Ci0gICAgICB9Ci0KLSAgICAgIGdsb2JhbHMtPmJsdWVzLmJsdWVfc2hpZnQgPSBwcml2LT5ibHVlX3NoaWZ0OwotICAgICAgZ2xvYmFscy0+Ymx1ZXMuYmx1ZV9mdXp6ICA9IHByaXYtPmJsdWVfZnV6ejsKLQotICAgICAgZ2xvYmFscy0+ZGltZW5zaW9uWzBdLnNjYWxlX211bHQgID0gMDsKLSAgICAgIGdsb2JhbHMtPmRpbWVuc2lvblswXS5zY2FsZV9kZWx0YSA9IDA7Ci0gICAgICBnbG9iYWxzLT5kaW1lbnNpb25bMV0uc2NhbGVfbXVsdCAgPSAwOwotICAgICAgZ2xvYmFscy0+ZGltZW5zaW9uWzFdLnNjYWxlX2RlbHRhID0gMDsKLQotI2lmZGVmIERFQlVHX0hJTlRFUgotICAgICAgcHNfZGVidWdfZ2xvYmFscyA9IGdsb2JhbHM7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICAqYWdsb2JhbHMgPSBnbG9iYWxzOwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgcHNoX2dsb2JhbHNfc2V0X3NjYWxlKCBQU0hfR2xvYmFscyAgZ2xvYmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICAgeF9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICAgeV9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICAgeF9kZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCAgICAgeV9kZWx0YSApCi0gIHsKLSAgICBQU0hfRGltZW5zaW9uICBkaW07Ci0KLQotICAgIGRpbSA9ICZnbG9iYWxzLT5kaW1lbnNpb25bMF07Ci0gICAgaWYgKCB4X3NjYWxlICE9IGRpbS0+c2NhbGVfbXVsdCAgfHwKLSAgICAgICAgIHhfZGVsdGEgIT0gZGltLT5zY2FsZV9kZWx0YSApCi0gICAgewotICAgICAgZGltLT5zY2FsZV9tdWx0ICA9IHhfc2NhbGU7Ci0gICAgICBkaW0tPnNjYWxlX2RlbHRhID0geF9kZWx0YTsKLQotICAgICAgcHNoX2dsb2JhbHNfc2NhbGVfd2lkdGhzKCBnbG9iYWxzLCAwICk7Ci0gICAgfQotCi0gICAgZGltID0gJmdsb2JhbHMtPmRpbWVuc2lvblsxXTsKLSAgICBpZiAoIHlfc2NhbGUgIT0gZGltLT5zY2FsZV9tdWx0ICB8fAotICAgICAgICAgeV9kZWx0YSAhPSBkaW0tPnNjYWxlX2RlbHRhICkKLSAgICB7Ci0gICAgICBkaW0tPnNjYWxlX211bHQgID0geV9zY2FsZTsKLSAgICAgIGRpbS0+c2NhbGVfZGVsdGEgPSB5X2RlbHRhOwotCi0gICAgICBwc2hfZ2xvYmFsc19zY2FsZV93aWR0aHMoIGdsb2JhbHMsIDEgKTsKLSAgICAgIHBzaF9ibHVlc19zY2FsZV96b25lcyggJmdsb2JhbHMtPmJsdWVzLCB5X3NjYWxlLCB5X2RlbHRhICk7Ci0gICAgfQotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBwc2hfZ2xvYmFsc19mdW5jc19pbml0KCBQU0hfR2xvYmFsc19GdW5jc1JlYyogIGZ1bmNzICkKLSAgewotICAgIGZ1bmNzLT5jcmVhdGUgICAgPSBwc2hfZ2xvYmFsc19uZXc7Ci0gICAgZnVuY3MtPnNldF9zY2FsZSA9IHBzaF9nbG9iYWxzX3NldF9zY2FsZTsKLSAgICBmdW5jcy0+ZGVzdHJveSAgID0gcHNoX2dsb2JhbHNfZGVzdHJveTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaGdsb2IuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hnbG9iLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNzZkZjcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaGdsb2IuaAorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2hnbG9iLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUG9zdFNjcmlwdCBoaW50ZXIgZ2xvYmFsIGhpbnRpbmcgbWFuYWdlbWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19QU0hHTE9CX0hfXwotI2RlZmluZSBfX1BTSEdMT0JfSF9fCi0KLQotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9ISU5UU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgIEdMT0JBTCBISU5UUyBJTlRFUk5BTFMgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQGNvbnN0YW50OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTX0dMT0JBTFNfTUFYX0JMVUVfWk9ORVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQGRlc2NyaXB0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBibHVlIHpvbmVzIGluIGEgZm9udCBnbG9iYWwgaGludHMgc3RydWN0dXJlLiAqLwotICAvKiAgICBTZWUgQFBTX0dsb2JhbHNfQmx1ZXNSZWMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFBTX0dMT0JBTFNfTUFYX0JMVUVfWk9ORVMgIDE2Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEBjb25zdGFudDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQU19HTE9CQUxTX01BWF9TVERfV0lEVEhTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEBkZXNjcmlwdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhbmRhcmQgYW5kIHNuYXAgd2lkdGhzIGluIGVpdGhlciB0aGUgICAgICAgKi8KLSAgLyogICAgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBkaXJlY3Rpb24uICBTZWUgQFBTX0dsb2JhbHNfV2lkdGhzUmVjLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBQU19HTE9CQUxTX01BWF9TVERfV0lEVEhTICAxNgotCi0KLSAgLyogc3RhbmRhcmQgYW5kIHNuYXAgd2lkdGggKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTSF9XaWR0aFJlY18KLSAgewotICAgIEZUX0ludCAgb3JnOwotICAgIEZUX1BvcyAgY3VyOwotICAgIEZUX1BvcyAgZml0OwotCi0gIH0gUFNIX1dpZHRoUmVjLCAqUFNIX1dpZHRoOwotCi0KLSAgLyogc3RhbmRhcmQgYW5kIHNuYXAgd2lkdGhzIHRhYmxlICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU0hfV2lkdGhzUmVjXwotICB7Ci0gICAgRlRfVUludCAgICAgICBjb3VudDsKLSAgICBQU0hfV2lkdGhSZWMgIHdpZHRoc1tQU19HTE9CQUxTX01BWF9TVERfV0lEVEhTXTsKLQotICB9IFBTSF9XaWR0aHNSZWMsICpQU0hfV2lkdGhzOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTSF9EaW1lbnNpb25SZWNfCi0gIHsKLSAgICBQU0hfV2lkdGhzUmVjICBzdGR3OwotICAgIEZUX0ZpeGVkICAgICAgIHNjYWxlX211bHQ7Ci0gICAgRlRfRml4ZWQgICAgICAgc2NhbGVfZGVsdGE7Ci0KLSAgfSBQU0hfRGltZW5zaW9uUmVjLCAqUFNIX0RpbWVuc2lvbjsKLQotCi0gIC8qIGJsdWUgem9uZSBkZXNjcmlwdG9yICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU0hfQmx1ZV9ab25lUmVjXwotICB7Ci0gICAgRlRfSW50ICBvcmdfcmVmOwotICAgIEZUX0ludCAgb3JnX2RlbHRhOwotICAgIEZUX0ludCAgb3JnX3RvcDsKLSAgICBGVF9JbnQgIG9yZ19ib3R0b207Ci0KLSAgICBGVF9Qb3MgIGN1cl9yZWY7Ci0gICAgRlRfUG9zICBjdXJfZGVsdGE7Ci0gICAgRlRfUG9zICBjdXJfYm90dG9tOwotICAgIEZUX1BvcyAgY3VyX3RvcDsKLQotICB9IFBTSF9CbHVlX1pvbmVSZWMsICpQU0hfQmx1ZV9ab25lOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTSF9CbHVlX1RhYmxlUmVjXwotICB7Ci0gICAgRlRfVUludCAgICAgICAgICAgY291bnQ7Ci0gICAgUFNIX0JsdWVfWm9uZVJlYyAgem9uZXNbUFNfR0xPQkFMU19NQVhfQkxVRV9aT05FU107Ci0KLSAgfSBQU0hfQmx1ZV9UYWJsZVJlYywgKlBTSF9CbHVlX1RhYmxlOwotCi0KLSAgLyogYmx1ZSB6b25lcyB0YWJsZSAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNIX0JsdWVzUmVjXwotICB7Ci0gICAgUFNIX0JsdWVfVGFibGVSZWMgIG5vcm1hbF90b3A7Ci0gICAgUFNIX0JsdWVfVGFibGVSZWMgIG5vcm1hbF9ib3R0b207Ci0gICAgUFNIX0JsdWVfVGFibGVSZWMgIGZhbWlseV90b3A7Ci0gICAgUFNIX0JsdWVfVGFibGVSZWMgIGZhbWlseV9ib3R0b207Ci0KLSAgICBGVF9GaXhlZCAgICAgICAgICAgYmx1ZV9zY2FsZTsKLSAgICBGVF9JbnQgICAgICAgICAgICAgYmx1ZV9zaGlmdDsKLSAgICBGVF9JbnQgICAgICAgICAgICAgYmx1ZV90aHJlc2hvbGQ7Ci0gICAgRlRfSW50ICAgICAgICAgICAgIGJsdWVfZnV6ejsKLSAgICBGVF9Cb29sICAgICAgICAgICAgbm9fb3ZlcnNob290czsKLQotICB9IFBTSF9CbHVlc1JlYywgKlBTSF9CbHVlczsKLQotCi0gIC8qIGZvbnQgZ2xvYmFscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIGRpbWVuc2lvbiAwID0+IFggY29vcmRpbmF0ZXMgKyB2ZXJ0aWNhbCBoaW50cy9zdGVtcyAgICovCi0gIC8qIGRpbWVuc2lvbiAxID0+IFkgY29vcmRpbmF0ZXMgKyBob3Jpem9udGFsIGhpbnRzL3N0ZW1zICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU0hfR2xvYmFsc1JlY18KLSAgewotICAgIEZUX01lbW9yeSAgICAgICAgIG1lbW9yeTsKLSAgICBQU0hfRGltZW5zaW9uUmVjICBkaW1lbnNpb25bMl07Ci0gICAgUFNIX0JsdWVzUmVjICAgICAgYmx1ZXM7Ci0KLSAgfSBQU0hfR2xvYmFsc1JlYzsKLQotCi0jZGVmaW5lIFBTSF9CTFVFX0FMSUdOX05PTkUgIDAKLSNkZWZpbmUgUFNIX0JMVUVfQUxJR05fVE9QICAgMQotI2RlZmluZSBQU0hfQkxVRV9BTElHTl9CT1QgICAyCi0KLQotICB0eXBlZGVmIHN0cnVjdCAgUFNIX0FsaWdubWVudFJlY18KLSAgewotICAgIGludCAgICAgYWxpZ247Ci0gICAgRlRfUG9zICBhbGlnbl90b3A7Ci0gICAgRlRfUG9zICBhbGlnbl9ib3Q7Ci0KLSAgfSBQU0hfQWxpZ25tZW50UmVjLCAqUFNIX0FsaWdubWVudDsKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgcHNoX2dsb2JhbHNfZnVuY3NfaW5pdCggUFNIX0dsb2JhbHNfRnVuY3NSZWMqICBmdW5jcyApOwotCi0KLSNpZiAwCi0gIC8qIHNuYXAgYSBzdGVtIHdpZHRoIHRvIGZpdHRlciBjb29yZGluYXRlcy4gIGBvcmdfd2lkdGgnIGlzIGluIGZvbnQgKi8KLSAgLyogdW5pdHMuICBUaGUgcmVzdWx0IGlzIGluIGRldmljZSBwaXhlbHMgKDI2LjYgZm9ybWF0KS4gICAgICAgICAgICAqLwotICBGVF9MT0NBTCggRlRfUG9zICkKLSAgcHNoX2RpbWVuc2lvbl9zbmFwX3dpZHRoKCBQU0hfRGltZW5zaW9uICBkaW1lbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgb3JnX3dpZHRoICk7Ci0jZW5kaWYKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHBzaF9nbG9iYWxzX3NldF9zY2FsZSggUFNIX0dsb2JhbHMgIGdsb2JhbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgIHhfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgIHlfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgIHhfZGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICAgIHlfZGVsdGEgKTsKLQotICAvKiBzbmFwIGEgc3RlbSB0byBvbmUgb3IgdHdvIGJsdWUgem9uZXMgKi8KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBwc2hfYmx1ZXNfc25hcF9zdGVtKCBQU0hfQmx1ZXMgICAgICBibHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgc3RlbV90b3AsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIHN0ZW1fYm90LAotICAgICAgICAgICAgICAgICAgICAgICBQU0hfQWxpZ25tZW50ICBhbGlnbm1lbnQgKTsKLSAgLyogKi8KLQotI2lmZGVmIERFQlVHX0hJTlRFUgotICBleHRlcm4gUFNIX0dsb2JhbHMgIHBzX2RlYnVnX2dsb2JhbHM7Ci0jZW5kaWYKLQotCi1GVF9FTkRfSEVBREVSCi0KLQotI2VuZGlmIC8qIF9fUFNIR0xPQl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hpbnRlci5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaGludGVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNjVmZTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaGludGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2hpbnRlci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgUG9zdFNjcmlwdCBIaW50aW5nIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVAotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlICJwc2hwaWMuYyIKLSNpbmNsdWRlICJwc2hyZWMuYyIKLSNpbmNsdWRlICJwc2hnbG9iLmMiCi0jaW5jbHVkZSAicHNoYWxnby5jIgotI2luY2x1ZGUgInBzaG1vZC5jIgotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaG1vZC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaG1vZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjFiNDY4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2htb2QuYworKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2htb2QuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgUG9zdFNjcmlwdCBoaW50ZXIgbW9kdWxlIGltcGxlbWVudGF0aW9uIChib2R5KS4gICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSAicHNocmVjLmgiCi0jaW5jbHVkZSAicHNoYWxnby5oIgotI2luY2x1ZGUgInBzaHBpYy5oIgotCi0KLSAgLyogdGhlIFBvc3RzY3JpcHQgSGludGVyIG1vZHVsZSBzdHJ1Y3R1cmUgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTX0hpbnRlcl9Nb2R1bGVfUmVjXwotICB7Ci0gICAgRlRfTW9kdWxlUmVjICAgICAgICAgIHJvb3Q7Ci0gICAgUFNfSGludHNSZWMgICAgICAgICAgIHBzX2hpbnRzOwotCi0gICAgUFNIX0dsb2JhbHNfRnVuY3NSZWMgIGdsb2JhbHNfZnVuY3M7Ci0gICAgVDFfSGludHNfRnVuY3NSZWMgICAgIHQxX2Z1bmNzOwotICAgIFQyX0hpbnRzX0Z1bmNzUmVjICAgICB0Ml9mdW5jczsKLQotICB9IFBTX0hpbnRlcl9Nb2R1bGVSZWMsICpQU19IaW50ZXJfTW9kdWxlOwotCi0KLSAgLyogZmluYWxpemUgbW9kdWxlICovCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIHBzX2hpbnRlcl9kb25lKCBQU19IaW50ZXJfTW9kdWxlICBtb2R1bGUgKQotICB7Ci0gICAgbW9kdWxlLT50MV9mdW5jcy5oaW50cyA9IE5VTEw7Ci0gICAgbW9kdWxlLT50Ml9mdW5jcy5oaW50cyA9IE5VTEw7Ci0KLSAgICBwc19oaW50c19kb25lKCAmbW9kdWxlLT5wc19oaW50cyApOwotICB9Ci0KLQotICAvKiBpbml0aWFsaXplIG1vZHVsZSwgY3JlYXRlIGhpbnRzIHJlY29yZGVyIGFuZCB0aGUgaW50ZXJmYWNlICovCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBwc19oaW50ZXJfaW5pdCggUFNfSGludGVyX01vZHVsZSAgbW9kdWxlICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbW9kdWxlLT5yb290Lm1lbW9yeTsKLSAgICB2b2lkKiAgICAgIHBoICAgICA9ICZtb2R1bGUtPnBzX2hpbnRzOwotCi0KLSAgICBwc19oaW50c19pbml0KCAmbW9kdWxlLT5wc19oaW50cywgbWVtb3J5ICk7Ci0KLSAgICBwc2hfZ2xvYmFsc19mdW5jc19pbml0KCAmbW9kdWxlLT5nbG9iYWxzX2Z1bmNzICk7Ci0KLSAgICB0MV9oaW50c19mdW5jc19pbml0KCAmbW9kdWxlLT50MV9mdW5jcyApOwotICAgIG1vZHVsZS0+dDFfZnVuY3MuaGludHMgPSAoVDFfSGludHMpcGg7Ci0KLSAgICB0Ml9oaW50c19mdW5jc19pbml0KCAmbW9kdWxlLT50Ml9mdW5jcyApOwotICAgIG1vZHVsZS0+dDJfZnVuY3MuaGludHMgPSAoVDJfSGludHMpcGg7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgLyogcmV0dXJucyBnbG9iYWwgaGludHMgaW50ZXJmYWNlICovCi0gIEZUX0NBTExCQUNLX0RFRiggUFNIX0dsb2JhbHNfRnVuY3MgKQotICBwc2hpbnRlcl9nZXRfZ2xvYmFsc19mdW5jcyggRlRfTW9kdWxlICBtb2R1bGUgKQotICB7Ci0gICAgcmV0dXJuICYoKFBTX0hpbnRlcl9Nb2R1bGUpbW9kdWxlKS0+Z2xvYmFsc19mdW5jczsKLSAgfQotCi0KLSAgLyogcmV0dXJuIFR5cGUgMSBoaW50cyBpbnRlcmZhY2UgKi8KLSAgRlRfQ0FMTEJBQ0tfREVGKCBUMV9IaW50c19GdW5jcyApCi0gIHBzaGludGVyX2dldF90MV9mdW5jcyggRlRfTW9kdWxlICBtb2R1bGUgKQotICB7Ci0gICAgcmV0dXJuICYoKFBTX0hpbnRlcl9Nb2R1bGUpbW9kdWxlKS0+dDFfZnVuY3M7Ci0gIH0KLQotCi0gIC8qIHJldHVybiBUeXBlIDIgaGludHMgaW50ZXJmYWNlICovCi0gIEZUX0NBTExCQUNLX0RFRiggVDJfSGludHNfRnVuY3MgKQotICBwc2hpbnRlcl9nZXRfdDJfZnVuY3MoIEZUX01vZHVsZSAgbW9kdWxlICkKLSAgewotICAgIHJldHVybiAmKChQU19IaW50ZXJfTW9kdWxlKW1vZHVsZSktPnQyX2Z1bmNzOwotICB9Ci0KLQotICBGVF9ERUZJTkVfUFNISU5URVJfSU5URVJGQUNFKAotICAgIHBzaGludGVyX2ludGVyZmFjZSwKLSAgICBwc2hpbnRlcl9nZXRfZ2xvYmFsc19mdW5jcywKLSAgICBwc2hpbnRlcl9nZXRfdDFfZnVuY3MsCi0gICAgcHNoaW50ZXJfZ2V0X3QyX2Z1bmNzICkKLQotCi0gIEZUX0RFRklORV9NT0RVTEUoCi0gICAgcHNoaW50ZXJfbW9kdWxlX2NsYXNzLAotCi0gICAgMCwKLSAgICBzaXplb2YgKCBQU19IaW50ZXJfTW9kdWxlUmVjICksCi0gICAgInBzaGludGVyIiwKLSAgICAweDEwMDAwTCwKLSAgICAweDIwMDAwTCwKLQotICAgICZQU0hJTlRFUl9JTlRFUkZBQ0VfR0VULCAgICAgICAgICAgICAgLyogbW9kdWxlLXNwZWNpZmljIGludGVyZmFjZSAqLwotCi0gICAgKEZUX01vZHVsZV9Db25zdHJ1Y3Rvcilwc19oaW50ZXJfaW5pdCwKLSAgICAoRlRfTW9kdWxlX0Rlc3RydWN0b3IpIHBzX2hpbnRlcl9kb25lLAotICAgIChGVF9Nb2R1bGVfUmVxdWVzdGVyKSAgTlVMTCApICAgLyogbm8gYWRkaXRpb25hbCBpbnRlcmZhY2UgZm9yIG5vdyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaG1vZC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaG1vZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNThkODU2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2htb2QuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzaG1vZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQb3N0U2NyaXB0IGhpbnRlciBtb2R1bGUgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1BTSE1PRF9IX18KLSNkZWZpbmUgX19QU0hNT0RfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9NT0RVTEVfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfREVDTEFSRV9NT0RVTEUoIHBzaGludGVyX21vZHVsZV9jbGFzcyApCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1BTSE1PRF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hudGVyci5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaG50ZXJyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzkwYTguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaG50ZXJyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2hudGVyci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUFMgSGludGVyIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDMtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIFBTSGludGVyIGVycm9yIGVudW1lcmF0aW9uIGNvbnN0YW50cy4gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fUFNITlRFUlJfSF9fCi0jZGVmaW5lIF9fUFNITlRFUlJfSF9fCi0KLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAotCi0jdW5kZWYgX19GVEVSUk9SU19IX18KLQotI3VuZGVmICBGVF9FUlJfUFJFRklYCi0jZGVmaW5lIEZUX0VSUl9QUkVGSVggIFBTSF9FcnJfCi0jZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfUFNoaW50ZXIKLQotI2luY2x1ZGUgRlRfRVJST1JTX0gKLQotI2VuZGlmIC8qIF9fUFNITlRFUlJfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNoaW50ZXIvcHNocGljLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNoaW50ZXIvcHNocGljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZDhmYjkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaHBpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNocGljLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHNlcnZpY2VzIGZvciBwc2hpbnRlciBtb2R1bGUuICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgInBzaHBpYy5oIgotI2luY2x1ZGUgInBzaG50ZXJyLmgiCi0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSAgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBQSUMgaW5pdCBmdW5jdGlvbnMgZnJvbSBwc2htb2QuYyAqLwotICB2b2lkCi0gIEZUX0luaXRfQ2xhc3NfcHNoaW50ZXJfaW50ZXJmYWNlKCBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFNIaW50ZXJfSW50ZXJmYWNlKiAgY2xhenogKTsKLQotICB2b2lkCi0gIHBzaGludGVyX21vZHVsZV9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9QSUNfQ29udGFpbmVyKiAgcGljX2NvbnRhaW5lciA9ICZsaWJyYXJ5LT5waWNfY29udGFpbmVyOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICBpZiAoIHBpY19jb250YWluZXItPnBzaGludGVyICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCBwaWNfY29udGFpbmVyLT5wc2hpbnRlciApOwotICAgICAgcGljX2NvbnRhaW5lci0+cHNoaW50ZXIgPSBOVUxMOwotICAgIH0KLSAgfQotCi0KLSAgRlRfRXJyb3IKLSAgcHNoaW50ZXJfbW9kdWxlX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yICAgICAgICAgPSBGVF9FcnJfT2s7Ci0gICAgUFNIaW50ZXJQSUMqICAgICAgIGNvbnRhaW5lciAgICAgPSBOVUxMOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICAvKiBhbGxvY2F0ZSBwb2ludGVyLCBjbGVhciBhbmQgc2V0IGdsb2JhbCBjb250YWluZXIgcG9pbnRlciAqLwotICAgIGlmICggRlRfQUxMT0MoIGNvbnRhaW5lciwgc2l6ZW9mICggKmNvbnRhaW5lciApICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIEZUX01FTV9TRVQoIGNvbnRhaW5lciwgMCwgc2l6ZW9mICggKmNvbnRhaW5lciApICk7Ci0gICAgcGljX2NvbnRhaW5lci0+cHNoaW50ZXIgPSBjb250YWluZXI7Ci0KLSAgICAvKiBhZGQgY2FsbCB0byBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiB3aGVuIHlvdSBhZGQgbmV3IHNjcmlwdHMgKi8KLSAgICBGVF9Jbml0X0NsYXNzX3BzaGludGVyX2ludGVyZmFjZSgKLSAgICAgIGxpYnJhcnksICZjb250YWluZXItPnBzaGludGVyX2ludGVyZmFjZSApOwotCi0gICAgaWYgKCBlcnJvciApCi0gICAgICBwc2hpbnRlcl9tb2R1bGVfY2xhc3NfcGljX2ZyZWUoIGxpYnJhcnkgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hwaWMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hwaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2EzNWNkNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNoaW50ZXIvcHNocGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2hwaWMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIHBzaGludGVyIG1vZHVsZS4gKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19QU0hQSUNfSF9fCi0jZGVmaW5lIF9fUFNIUElDX0hfXwotCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BJQ19ICi0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIFBTSElOVEVSX0lOVEVSRkFDRV9HRVQgIHBzaGludGVyX2ludGVyZmFjZQotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0hJTlRTX0gKLQotRlRfQkVHSU5fSEVBREVSCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTSGludGVyUElDXwotICB7Ci0gICAgUFNIaW50ZXJfSW50ZXJmYWNlICBwc2hpbnRlcl9pbnRlcmZhY2U7Ci0KLSAgfSBQU0hpbnRlclBJQzsKLQotCi0jZGVmaW5lIEdFVF9QSUMoIGxpYiApICAoIChQU0hpbnRlclBJQyopKCAobGliKS0+cGljX2NvbnRhaW5lci5wc2hpbnRlciApICkKLQotI2RlZmluZSBQU0hJTlRFUl9JTlRFUkZBQ0VfR0VUICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+cHNoaW50ZXJfaW50ZXJmYWNlICkKLQotICAvKiBzZWUgcHNocGljLmMgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiAqLwotICB2b2lkCi0gIHBzaGludGVyX21vZHVsZV9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0gIEZUX0Vycm9yCi0gIHBzaGludGVyX21vZHVsZV9jbGFzc19waWNfaW5pdCggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gLyogKi8KLQotI2VuZGlmIC8qIF9fUFNIUElDX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaHJlYy5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaHJlYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODg5NWZjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hyZWMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNocmVjLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIFBvc3RTY3JpcHQgaGludHMgcmVjb3JkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ICi0KLSNpbmNsdWRlICJwc2hyZWMuaCIKLSNpbmNsdWRlICJwc2hhbGdvLmgiCi0KLSNpbmNsdWRlICJwc2hudGVyci5oIgotCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3BzaHJlYwotCi0jaWZkZWYgREVCVUdfSElOVEVSCi0gIFBTX0hpbnRzICBwc19kZWJ1Z19oaW50cyAgICAgICAgID0gTlVMTDsKLSAgaW50ICAgICAgIHBzX2RlYnVnX25vX2hvcnpfaGludHMgPSAwOwotICBpbnQgICAgICAgcHNfZGVidWdfbm9fdmVydF9oaW50cyA9IDA7Ci0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICBQU19ISU5UIE1BTkFHRU1FTlQgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIGRlc3Ryb3kgaGludHMgdGFibGUgKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNfaGludF90YWJsZV9kb25lKCBQU19IaW50X1RhYmxlICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICBtZW1vcnkgKQotICB7Ci0gICAgRlRfRlJFRSggdGFibGUtPmhpbnRzICk7Ci0gICAgdGFibGUtPm51bV9oaW50cyA9IDA7Ci0gICAgdGFibGUtPm1heF9oaW50cyA9IDA7Ci0gIH0KLQotCi0gIC8qIGVuc3VyZSB0aGF0IGEgdGFibGUgY2FuIGNvbnRhaW4gImNvdW50IiBlbGVtZW50cyAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfaGludF90YWJsZV9lbnN1cmUoIFBTX0hpbnRfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICBtZW1vcnkgKQotICB7Ci0gICAgRlRfVUludCAgIG9sZF9tYXggPSB0YWJsZS0+bWF4X2hpbnRzOwotICAgIEZUX1VJbnQgICBuZXdfbWF4ID0gY291bnQ7Ci0gICAgRlRfRXJyb3IgIGVycm9yICAgPSBGVF9FcnJfT2s7Ci0KLQotICAgIGlmICggbmV3X21heCA+IG9sZF9tYXggKQotICAgIHsKLSAgICAgIC8qIHRyeSB0byBncm93IHRoZSB0YWJsZSAqLwotICAgICAgbmV3X21heCA9IEZUX1BBRF9DRUlMKCBuZXdfbWF4LCA4ICk7Ci0gICAgICBpZiAoICFGVF9SRU5FV19BUlJBWSggdGFibGUtPmhpbnRzLCBvbGRfbWF4LCBuZXdfbWF4ICkgKQotICAgICAgICB0YWJsZS0+bWF4X2hpbnRzID0gbmV3X21heDsKLSAgICB9Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfaGludF90YWJsZV9hbGxvYyggUFNfSGludF9UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgUFNfSGludCAgICAgICAqYWhpbnQgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX1VJbnQgICBjb3VudDsKLSAgICBQU19IaW50ICAgaGludCA9IE5VTEw7Ci0KLQotICAgIGNvdW50ID0gdGFibGUtPm51bV9oaW50czsKLSAgICBjb3VudCsrOwotCi0gICAgaWYgKCBjb3VudCA+PSB0YWJsZS0+bWF4X2hpbnRzICkKLSAgICB7Ci0gICAgICBlcnJvciA9IHBzX2hpbnRfdGFibGVfZW5zdXJlKCB0YWJsZSwgY291bnQsIG1lbW9yeSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBoaW50ICAgICAgICA9IHRhYmxlLT5oaW50cyArIGNvdW50IC0gMTsKLSAgICBoaW50LT5wb3MgICA9IDA7Ci0gICAgaGludC0+bGVuICAgPSAwOwotICAgIGhpbnQtPmZsYWdzID0gMDsKLQotICAgIHRhYmxlLT5udW1faGludHMgPSBjb3VudDsKLQotICBFeGl0OgotICAgICphaGludCA9IGhpbnQ7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgUFNfTUFTSyBNQU5BR0VNRU5UICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBkZXN0cm95IG1hc2sgKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNfbWFza19kb25lKCBQU19NYXNrICAgIG1hc2ssCi0gICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKQotICB7Ci0gICAgRlRfRlJFRSggbWFzay0+Ynl0ZXMgKTsKLSAgICBtYXNrLT5udW1fYml0cyAgPSAwOwotICAgIG1hc2stPm1heF9iaXRzICA9IDA7Ci0gICAgbWFzay0+ZW5kX3BvaW50ID0gMDsKLSAgfQotCi0KLSAgLyogZW5zdXJlIHRoYXQgYSBtYXNrIGNhbiBjb250YWluICJjb3VudCIgYml0cyAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfbWFza19lbnN1cmUoIFBTX01hc2sgICAgbWFzaywKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9VSW50ICAgb2xkX21heCA9ICggbWFzay0+bWF4X2JpdHMgKyA3ICkgPj4gMzsKLSAgICBGVF9VSW50ICAgbmV3X21heCA9ICggY291bnQgICAgICAgICAgKyA3ICkgPj4gMzsKLSAgICBGVF9FcnJvciAgZXJyb3IgICA9IEZUX0Vycl9PazsKLQotCi0gICAgaWYgKCBuZXdfbWF4ID4gb2xkX21heCApCi0gICAgewotICAgICAgbmV3X21heCA9IEZUX1BBRF9DRUlMKCBuZXdfbWF4LCA4ICk7Ci0gICAgICBpZiAoICFGVF9SRU5FV19BUlJBWSggbWFzay0+Ynl0ZXMsIG9sZF9tYXgsIG5ld19tYXggKSApCi0gICAgICAgIG1hc2stPm1heF9iaXRzID0gbmV3X21heCAqIDg7Ci0gICAgfQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogdGVzdCBhIGJpdCB2YWx1ZSBpbiBhIGdpdmVuIG1hc2sgKi8KLSAgc3RhdGljIEZUX0ludAotICBwc19tYXNrX3Rlc3RfYml0KCBQU19NYXNrICBtYXNrLAotICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICBpZHggKQotICB7Ci0gICAgaWYgKCAoRlRfVUludClpZHggPj0gbWFzay0+bnVtX2JpdHMgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gbWFzay0+Ynl0ZXNbaWR4ID4+IDNdICYgKCAweDgwID4+ICggaWR4ICYgNyApICk7Ci0gIH0KLQotCi0gIC8qIGNsZWFyIGEgZ2l2ZW4gYml0ICovCi0gIHN0YXRpYyB2b2lkCi0gIHBzX21hc2tfY2xlYXJfYml0KCBQU19NYXNrICBtYXNrLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgaWR4ICkKLSAgewotICAgIEZUX0J5dGUqICBwOwotCi0KLSAgICBpZiAoIGlkeCA+PSBtYXNrLT5udW1fYml0cyApCi0gICAgICByZXR1cm47Ci0KLSAgICBwICAgID0gbWFzay0+Ynl0ZXMgKyAoIGlkeCA+PiAzICk7Ci0gICAgcFswXSA9IChGVF9CeXRlKSggcFswXSAmIH4oIDB4ODAgPj4gKCBpZHggJiA3ICkgKSApOwotICB9Ci0KLQotICAvKiBzZXQgYSBnaXZlbiBiaXQsIHBvc3NpYmx5IGdyb3cgdGhlIG1hc2sgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHBzX21hc2tfc2V0X2JpdCggUFNfTWFzayAgICBtYXNrLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgaWR4LAotICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9CeXRlKiAgcDsKLQotCi0gICAgaWYgKCBpZHggPj0gbWFzay0+bnVtX2JpdHMgKQotICAgIHsKLSAgICAgIGVycm9yID0gcHNfbWFza19lbnN1cmUoIG1hc2ssIGlkeCArIDEsIG1lbW9yeSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgbWFzay0+bnVtX2JpdHMgPSBpZHggKyAxOwotICAgIH0KLQotICAgIHAgICAgPSBtYXNrLT5ieXRlcyArICggaWR4ID4+IDMgKTsKLSAgICBwWzBdID0gKEZUX0J5dGUpKCBwWzBdIHwgKCAweDgwID4+ICggaWR4ICYgNyApICkgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogZGVzdHJveSBtYXNrIHRhYmxlICovCi0gIHN0YXRpYyB2b2lkCi0gIHBzX21hc2tfdGFibGVfZG9uZSggUFNfTWFza19UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgbWVtb3J5ICkKLSAgewotICAgIEZUX1VJbnQgIGNvdW50ID0gdGFibGUtPm1heF9tYXNrczsKLSAgICBQU19NYXNrICBtYXNrICA9IHRhYmxlLT5tYXNrczsKLQotCi0gICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIG1hc2srKyApCi0gICAgICBwc19tYXNrX2RvbmUoIG1hc2ssIG1lbW9yeSApOwotCi0gICAgRlRfRlJFRSggdGFibGUtPm1hc2tzICk7Ci0gICAgdGFibGUtPm51bV9tYXNrcyA9IDA7Ci0gICAgdGFibGUtPm1heF9tYXNrcyA9IDA7Ci0gIH0KLQotCi0gIC8qIGVuc3VyZSB0aGF0IGEgbWFzayB0YWJsZSBjYW4gY29udGFpbiAiY291bnQiIG1hc2tzICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwc19tYXNrX3RhYmxlX2Vuc3VyZSggUFNfTWFza19UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9VSW50ICAgb2xkX21heCA9IHRhYmxlLT5tYXhfbWFza3M7Ci0gICAgRlRfVUludCAgIG5ld19tYXggPSBjb3VudDsKLSAgICBGVF9FcnJvciAgZXJyb3IgICA9IEZUX0Vycl9PazsKLQotCi0gICAgaWYgKCBuZXdfbWF4ID4gb2xkX21heCApCi0gICAgewotICAgICAgbmV3X21heCA9IEZUX1BBRF9DRUlMKCBuZXdfbWF4LCA4ICk7Ci0gICAgICBpZiAoICFGVF9SRU5FV19BUlJBWSggdGFibGUtPm1hc2tzLCBvbGRfbWF4LCBuZXdfbWF4ICkgKQotICAgICAgICB0YWJsZS0+bWF4X21hc2tzID0gbmV3X21heDsKLSAgICB9Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBhbGxvY2F0ZSBhIG5ldyBtYXNrIGluIGEgdGFibGUgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHBzX21hc2tfdGFibGVfYWxsb2MoIFBTX01hc2tfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgIFBTX01hc2sgICAgICAgKmFtYXNrICkKLSAgewotICAgIEZUX1VJbnQgICBjb3VudDsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgUFNfTWFzayAgIG1hc2sgID0gTlVMTDsKLQotCi0gICAgY291bnQgPSB0YWJsZS0+bnVtX21hc2tzOwotICAgIGNvdW50Kys7Ci0KLSAgICBpZiAoIGNvdW50ID4gdGFibGUtPm1heF9tYXNrcyApCi0gICAgewotICAgICAgZXJyb3IgPSBwc19tYXNrX3RhYmxlX2Vuc3VyZSggdGFibGUsIGNvdW50LCBtZW1vcnkgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgbWFzayAgICAgICAgICAgICA9IHRhYmxlLT5tYXNrcyArIGNvdW50IC0gMTsKLSAgICBtYXNrLT5udW1fYml0cyAgID0gMDsKLSAgICBtYXNrLT5lbmRfcG9pbnQgID0gMDsKLSAgICB0YWJsZS0+bnVtX21hc2tzID0gY291bnQ7Ci0KLSAgRXhpdDoKLSAgICAqYW1hc2sgPSBtYXNrOwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogcmV0dXJuIGxhc3QgaGludCBtYXNrIGluIGEgdGFibGUsIGNyZWF0ZSBvbmUgaWYgdGhlIHRhYmxlIGlzIGVtcHR5ICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwc19tYXNrX3RhYmxlX2xhc3QoIFBTX01hc2tfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICBQU19NYXNrICAgICAgICphbWFzayApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfVUludCAgIGNvdW50OwotICAgIFBTX01hc2sgICBtYXNrOwotCi0KLSAgICBjb3VudCA9IHRhYmxlLT5udW1fbWFza3M7Ci0gICAgaWYgKCBjb3VudCA9PSAwICkKLSAgICB7Ci0gICAgICBlcnJvciA9IHBzX21hc2tfdGFibGVfYWxsb2MoIHRhYmxlLCBtZW1vcnksICZtYXNrICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLSAgICBlbHNlCi0gICAgICBtYXNrID0gdGFibGUtPm1hc2tzICsgY291bnQgLSAxOwotCi0gIEV4aXQ6Ci0gICAgKmFtYXNrID0gbWFzazsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIHNldCBhIG5ldyBtYXNrIHRvIGEgZ2l2ZW4gYml0IHJhbmdlICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwc19tYXNrX3RhYmxlX3NldF9iaXRzKCBQU19NYXNrX1RhYmxlICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBiaXRfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgYml0X2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICAgbWVtb3J5ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBQU19NYXNrICAgbWFzazsKLQotCi0gICAgZXJyb3IgPSBwc19tYXNrX3RhYmxlX2xhc3QoIHRhYmxlLCBtZW1vcnksICZtYXNrICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBlcnJvciA9IHBzX21hc2tfZW5zdXJlKCBtYXNrLCBiaXRfY291bnQsIG1lbW9yeSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgbWFzay0+bnVtX2JpdHMgPSBiaXRfY291bnQ7Ci0KLSAgICAvKiBub3csIGNvcHkgYml0cyAqLwotICAgIHsKLSAgICAgIEZUX0J5dGUqICByZWFkICA9IChGVF9CeXRlKilzb3VyY2UgKyAoIGJpdF9wb3MgPj4gMyApOwotICAgICAgRlRfSW50ICAgIHJtYXNrID0gMHg4MCA+PiAoIGJpdF9wb3MgJiA3ICk7Ci0gICAgICBGVF9CeXRlKiAgd3JpdGUgPSBtYXNrLT5ieXRlczsKLSAgICAgIEZUX0ludCAgICB3bWFzayA9IDB4ODA7Ci0gICAgICBGVF9JbnQgICAgdmFsOwotCi0KLSAgICAgIGZvciAoIDsgYml0X2NvdW50ID4gMDsgYml0X2NvdW50LS0gKQotICAgICAgewotICAgICAgICB2YWwgPSB3cml0ZVswXSAmIH53bWFzazsKLQotICAgICAgICBpZiAoIHJlYWRbMF0gJiBybWFzayApCi0gICAgICAgICAgdmFsIHw9IHdtYXNrOwotCi0gICAgICAgIHdyaXRlWzBdID0gKEZUX0J5dGUpdmFsOwotCi0gICAgICAgIHJtYXNrID4+PSAxOwotICAgICAgICBpZiAoIHJtYXNrID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgcmVhZCsrOwotICAgICAgICAgIHJtYXNrID0gMHg4MDsKLSAgICAgICAgfQotCi0gICAgICAgIHdtYXNrID4+PSAxOwotICAgICAgICBpZiAoIHdtYXNrID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgd3JpdGUrKzsKLSAgICAgICAgICB3bWFzayA9IDB4ODA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIHRlc3Qgd2hldGhlciB0d28gbWFza3MgaW4gYSB0YWJsZSBpbnRlcnNlY3QgKi8KLSAgc3RhdGljIEZUX0ludAotICBwc19tYXNrX3RhYmxlX3Rlc3RfaW50ZXJzZWN0KCBQU19NYXNrX1RhYmxlICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgaW5kZXgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICBpbmRleDIgKQotICB7Ci0gICAgUFNfTWFzayAgIG1hc2sxICA9IHRhYmxlLT5tYXNrcyArIGluZGV4MTsKLSAgICBQU19NYXNrICAgbWFzazIgID0gdGFibGUtPm1hc2tzICsgaW5kZXgyOwotICAgIEZUX0J5dGUqICBwMSAgICAgPSBtYXNrMS0+Ynl0ZXM7Ci0gICAgRlRfQnl0ZSogIHAyICAgICA9IG1hc2syLT5ieXRlczsKLSAgICBGVF9VSW50ICAgY291bnQxID0gbWFzazEtPm51bV9iaXRzOwotICAgIEZUX1VJbnQgICBjb3VudDIgPSBtYXNrMi0+bnVtX2JpdHM7Ci0gICAgRlRfVUludCAgIGNvdW50OwotCi0KLSAgICBjb3VudCA9IEZUX01JTiggY291bnQxLCBjb3VudDIgKTsKLSAgICBmb3IgKCA7IGNvdW50ID49IDg7IGNvdW50IC09IDggKQotICAgIHsKLSAgICAgIGlmICggcDFbMF0gJiBwMlswXSApCi0gICAgICAgIHJldHVybiAxOwotCi0gICAgICBwMSsrOwotICAgICAgcDIrKzsKLSAgICB9Ci0KLSAgICBpZiAoIGNvdW50ID09IDAgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gKCBwMVswXSAmIHAyWzBdICkgJiB+KCAweEZGID4+IGNvdW50ICk7Ci0gIH0KLQotCi0gIC8qIG1lcmdlIHR3byBtYXNrcywgdXNlZCBieSBwc19tYXNrX3RhYmxlX21lcmdlX2FsbCAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfbWFza190YWJsZV9tZXJnZSggUFNfTWFza19UYWJsZSAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgIGluZGV4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgaW5kZXgyLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICBtZW1vcnkgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICAvKiBzd2FwIGluZGV4MSBhbmQgaW5kZXgyIHNvIHRoYXQgaW5kZXgxIDwgaW5kZXgyICovCi0gICAgaWYgKCBpbmRleDEgPiBpbmRleDIgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIHRlbXA7Ci0KLQotICAgICAgdGVtcCAgID0gaW5kZXgxOwotICAgICAgaW5kZXgxID0gaW5kZXgyOwotICAgICAgaW5kZXgyID0gdGVtcDsKLSAgICB9Ci0KLSAgICBpZiAoIGluZGV4MSA8IGluZGV4MiAmJiBpbmRleDIgPCB0YWJsZS0+bnVtX21hc2tzICkKLSAgICB7Ci0gICAgICAvKiB3ZSBuZWVkIHRvIG1lcmdlIHRoZSBiaXRzZXRzIG9mIGluZGV4MSBhbmQgaW5kZXgyIHdpdGggYSAqLwotICAgICAgLyogc2ltcGxlIHVuaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIFBTX01hc2sgIG1hc2sxICA9IHRhYmxlLT5tYXNrcyArIGluZGV4MTsKLSAgICAgIFBTX01hc2sgIG1hc2syICA9IHRhYmxlLT5tYXNrcyArIGluZGV4MjsKLSAgICAgIEZUX1VJbnQgIGNvdW50MSA9IG1hc2sxLT5udW1fYml0czsKLSAgICAgIEZUX1VJbnQgIGNvdW50MiA9IG1hc2syLT5udW1fYml0czsKLSAgICAgIEZUX0ludCAgIGRlbHRhOwotCi0KLSAgICAgIGlmICggY291bnQyID4gMCApCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgICBwb3M7Ci0gICAgICAgIEZUX0J5dGUqICByZWFkOwotICAgICAgICBGVF9CeXRlKiAgd3JpdGU7Ci0KLQotICAgICAgICAvKiBpZiAiY291bnQyIiBpcyBncmVhdGVyIHRoYW4gImNvdW50MSIsIHdlIG5lZWQgdG8gZ3JvdyB0aGUgKi8KLSAgICAgICAgLyogZmlyc3QgYml0c2V0LCBhbmQgY2xlYXIgdGhlIGhpZ2hlc3QgYml0cyAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggY291bnQyID4gY291bnQxICkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gcHNfbWFza19lbnN1cmUoIG1hc2sxLCBjb3VudDIsIG1lbW9yeSApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgZm9yICggcG9zID0gY291bnQxOyBwb3MgPCBjb3VudDI7IHBvcysrICkKLSAgICAgICAgICAgIHBzX21hc2tfY2xlYXJfYml0KCBtYXNrMSwgcG9zICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBtZXJnZSAodW5pdGUpIHRoZSBiaXRzZXRzICovCi0gICAgICAgIHJlYWQgID0gbWFzazItPmJ5dGVzOwotICAgICAgICB3cml0ZSA9IG1hc2sxLT5ieXRlczsKLSAgICAgICAgcG9zICAgPSAoIGNvdW50MiArIDcgKSA+PiAzOwotCi0gICAgICAgIGZvciAoIDsgcG9zID4gMDsgcG9zLS0gKQotICAgICAgICB7Ci0gICAgICAgICAgd3JpdGVbMF0gPSAoRlRfQnl0ZSkoIHdyaXRlWzBdIHwgcmVhZFswXSApOwotICAgICAgICAgIHdyaXRlKys7Ci0gICAgICAgICAgcmVhZCsrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIE5vdywgcmVtb3ZlICJtYXNrMiIgZnJvbSB0aGUgbGlzdC4gIFdlIG5lZWQgdG8ga2VlcCB0aGUgbWFza3MgKi8KLSAgICAgIC8qIHNvcnRlZCBpbiBvcmRlciBvZiBpbXBvcnRhbmNlLCBzbyBtb3ZlIHRhYmxlIGVsZW1lbnRzLiAgICAgICAgKi8KLSAgICAgIG1hc2syLT5udW1fYml0cyAgPSAwOwotICAgICAgbWFzazItPmVuZF9wb2ludCA9IDA7Ci0KLSAgICAgIC8qIG51bWJlciBvZiBtYXNrcyB0byBtb3ZlICovCi0gICAgICBkZWx0YSA9IChGVF9JbnQpKCB0YWJsZS0+bnVtX21hc2tzIC0gMSAtIGluZGV4MiApOwotICAgICAgaWYgKCBkZWx0YSA+IDAgKQotICAgICAgewotICAgICAgICAvKiBtb3ZlIHRvIGVuZCBvZiB0YWJsZSBmb3IgcmV1c2UgKi8KLSAgICAgICAgUFNfTWFza1JlYyAgZHVtbXkgPSAqbWFzazI7Ci0KLQotICAgICAgICBmdF9tZW1tb3ZlKCBtYXNrMiwKLSAgICAgICAgICAgICAgICAgICAgbWFzazIgKyAxLAotICAgICAgICAgICAgICAgICAgICAoRlRfVUludClkZWx0YSAqIHNpemVvZiAoIFBTX01hc2tSZWMgKSApOwotCi0gICAgICAgIG1hc2syW2RlbHRhXSA9IGR1bW15OwotICAgICAgfQotCi0gICAgICB0YWJsZS0+bnVtX21hc2tzLS07Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIEZUX1RSQUNFMCgoICJwc19tYXNrX3RhYmxlX21lcmdlOiBpZ25vcmluZyBpbnZhbGlkIGluZGljZXMgKCVkLCVkKVxuIiwKLSAgICAgICAgICAgICAgICAgIGluZGV4MSwgaW5kZXgyICkpOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBUcnkgdG8gbWVyZ2UgYWxsIG1hc2tzIGluIGEgZ2l2ZW4gdGFibGUuICBUaGlzIGlzIHVzZWQgdG8gbWVyZ2UgKi8KLSAgLyogYWxsIGNvdW50ZXIgbWFza3MgaW50byBpbmRlcGVuZGVudCBjb3VudGVyICJwYXRocyIuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfbWFza190YWJsZV9tZXJnZV9hbGwoIFBTX01hc2tfVGFibGUgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgbWVtb3J5ICkKLSAgewotICAgIEZUX0ludCAgICBpbmRleDEsIGluZGV4MjsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIC8qIGJvdGggbG9vcHMgZ28gZG93biB0byAwLCB0aHVzIEZUX0ludCBmb3IgaW5kZXgxIGFuZCBpbmRleDIgKi8KLSAgICBmb3IgKCBpbmRleDEgPSAoRlRfSW50KXRhYmxlLT5udW1fbWFza3MgLSAxOyBpbmRleDEgPiAwOyBpbmRleDEtLSApCi0gICAgewotICAgICAgZm9yICggaW5kZXgyID0gaW5kZXgxIC0gMTsgaW5kZXgyID49IDA7IGluZGV4Mi0tICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBwc19tYXNrX3RhYmxlX3Rlc3RfaW50ZXJzZWN0KCB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludClpbmRleDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpaW5kZXgyICkgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSBwc19tYXNrX3RhYmxlX21lcmdlKCB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KWluZGV4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KWluZGV4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgUFNfRElNRU5TSU9OIE1BTkFHRU1FTlQgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogZmluYWxpemUgYSBnaXZlbiBkaW1lbnNpb24gKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNfZGltZW5zaW9uX2RvbmUoIFBTX0RpbWVuc2lvbiAgZGltZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgKQotICB7Ci0gICAgcHNfbWFza190YWJsZV9kb25lKCAmZGltZW5zaW9uLT5jb3VudGVycywgbWVtb3J5ICk7Ci0gICAgcHNfbWFza190YWJsZV9kb25lKCAmZGltZW5zaW9uLT5tYXNrcywgICAgbWVtb3J5ICk7Ci0gICAgcHNfaGludF90YWJsZV9kb25lKCAmZGltZW5zaW9uLT5oaW50cywgICAgbWVtb3J5ICk7Ci0gIH0KLQotCi0gIC8qIGluaXRpYWxpemUgYSBnaXZlbiBkaW1lbnNpb24gKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNfZGltZW5zaW9uX2luaXQoIFBTX0RpbWVuc2lvbiAgZGltZW5zaW9uICkKLSAgewotICAgIGRpbWVuc2lvbi0+aGludHMubnVtX2hpbnRzICAgID0gMDsKLSAgICBkaW1lbnNpb24tPm1hc2tzLm51bV9tYXNrcyAgICA9IDA7Ci0gICAgZGltZW5zaW9uLT5jb3VudGVycy5udW1fbWFza3MgPSAwOwotICB9Ci0KLQotI2lmIDAKLQotICAvKiBzZXQgYSBiaXQgYXQgYSBnaXZlbiBpbmRleCBpbiB0aGUgY3VycmVudCBoaW50IG1hc2sgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHBzX2RpbWVuc2lvbl9zZXRfbWFza19iaXQoIFBTX0RpbWVuc2lvbiAgZGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgKQotICB7Ci0gICAgUFNfTWFzayAgIG1hc2s7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICAvKiBnZXQgbGFzdCBoaW50IG1hc2sgKi8KLSAgICBlcnJvciA9IHBzX21hc2tfdGFibGVfbGFzdCggJmRpbS0+bWFza3MsIG1lbW9yeSwgJm1hc2sgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGVycm9yID0gcHNfbWFza19zZXRfYml0KCBtYXNrLCBpZHgsIG1lbW9yeSApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLSNlbmRpZgotCi0gIC8qIHNldCB0aGUgZW5kIHBvaW50IGluIGEgbWFzaywgY2FsbGVkIGZyb20gIkVuZCIgJiAiUmVzZXQiIG1ldGhvZHMgKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNfZGltZW5zaW9uX2VuZF9tYXNrKCBQU19EaW1lbnNpb24gIGRpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGVuZF9wb2ludCApCi0gIHsKLSAgICBGVF9VSW50ICBjb3VudCA9IGRpbS0+bWFza3MubnVtX21hc2tzOwotCi0KLSAgICBpZiAoIGNvdW50ID4gMCApCi0gICAgewotICAgICAgUFNfTWFzayAgbWFzayA9IGRpbS0+bWFza3MubWFza3MgKyBjb3VudCAtIDE7Ci0KLQotICAgICAgbWFzay0+ZW5kX3BvaW50ID0gZW5kX3BvaW50OwotICAgIH0KLSAgfQotCi0KLSAgLyogc2V0IHRoZSBlbmQgcG9pbnQgaW4gdGhlIGN1cnJlbnQgbWFzaywgdGhlbiBjcmVhdGUgYSBuZXcgZW1wdHkgb25lICovCi0gIC8qIChjYWxsZWQgYnkgIlJlc2V0IiBtZXRob2QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfZGltZW5zaW9uX3Jlc2V0X21hc2soIFBTX0RpbWVuc2lvbiAgZGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBlbmRfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSApCi0gIHsKLSAgICBQU19NYXNrICBtYXNrOwotCi0KLSAgICAvKiBlbmQgY3VycmVudCBtYXNrICovCi0gICAgcHNfZGltZW5zaW9uX2VuZF9tYXNrKCBkaW0sIGVuZF9wb2ludCApOwotCi0gICAgLyogYWxsb2NhdGUgbmV3IG9uZSAqLwotICAgIHJldHVybiBwc19tYXNrX3RhYmxlX2FsbG9jKCAmZGltLT5tYXNrcywgbWVtb3J5LCAmbWFzayApOwotICB9Ci0KLQotICAvKiBzZXQgYSBuZXcgbWFzaywgY2FsbGVkIGZyb20gdGhlICJUMlN0ZW0iIG1ldGhvZCAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfZGltZW5zaW9uX3NldF9tYXNrX2JpdHMoIFBTX0RpbWVuc2lvbiAgICBkaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CeXRlKiAgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIHNvdXJjZV9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgc291cmNlX2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgZW5kX3BvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIC8qIHJlc2V0IGN1cnJlbnQgbWFzaywgaWYgYW55ICovCi0gICAgZXJyb3IgPSBwc19kaW1lbnNpb25fcmVzZXRfbWFzayggZGltLCBlbmRfcG9pbnQsIG1lbW9yeSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogc2V0IGJpdHMgaW4gbmV3IG1hc2sgKi8KLSAgICBlcnJvciA9IHBzX21hc2tfdGFibGVfc2V0X2JpdHMoICZkaW0tPm1hc2tzLCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfcG9zLCBzb3VyY2VfYml0cywgbWVtb3J5ICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGFkZCBhIG5ldyBzaW5nbGUgc3RlbSAoY2FsbGVkIGZyb20gIlQxU3RlbSIgbWV0aG9kKSAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgcHNfZGltZW5zaW9uX2FkZF90MXN0ZW0oIFBTX0RpbWVuc2lvbiAgZGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICBwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICphaW5kZXggKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX1VJbnQgICBmbGFncyA9IDA7Ci0KLQotICAgIC8qIGRldGVjdCBnaG9zdCBzdGVtICovCi0gICAgaWYgKCBsZW4gPCAwICkKLSAgICB7Ci0gICAgICBmbGFncyB8PSBQU19ISU5UX0ZMQUdfR0hPU1Q7Ci0gICAgICBpZiAoIGxlbiA9PSAtMjEgKQotICAgICAgewotICAgICAgICBmbGFncyB8PSBQU19ISU5UX0ZMQUdfQk9UVE9NOwotICAgICAgICBwb3MgICArPSBsZW47Ci0gICAgICB9Ci0gICAgICBsZW4gPSAwOwotICAgIH0KLQotICAgIGlmICggYWluZGV4ICkKLSAgICAgICphaW5kZXggPSAtMTsKLQotICAgIC8qIG5vdywgbG9va3VwIHN0ZW0gaW4gdGhlIGN1cnJlbnQgaGludHMgdGFibGUgKi8KLSAgICB7Ci0gICAgICBQU19NYXNrICBtYXNrOwotICAgICAgRlRfVUludCAgaWR4OwotICAgICAgRlRfVUludCAgbWF4ICA9IGRpbS0+aGludHMubnVtX2hpbnRzOwotICAgICAgUFNfSGludCAgaGludCA9IGRpbS0+aGludHMuaGludHM7Ci0KLQotICAgICAgZm9yICggaWR4ID0gMDsgaWR4IDwgbWF4OyBpZHgrKywgaGludCsrICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBoaW50LT5wb3MgPT0gcG9zICYmIGhpbnQtPmxlbiA9PSBsZW4gKQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvKiB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBoaW50IGluIHRoZSB0YWJsZSAqLwotICAgICAgaWYgKCBpZHggPj0gbWF4ICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBwc19oaW50X3RhYmxlX2FsbG9jKCAmZGltLT5oaW50cywgbWVtb3J5LCAmaGludCApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgaGludC0+cG9zICAgPSBwb3M7Ci0gICAgICAgIGhpbnQtPmxlbiAgID0gbGVuOwotICAgICAgICBoaW50LT5mbGFncyA9IGZsYWdzOwotICAgICAgfQotCi0gICAgICAvKiBub3csIHN0b3JlIHRoZSBoaW50IGluIHRoZSBjdXJyZW50IG1hc2sgKi8KLSAgICAgIGVycm9yID0gcHNfbWFza190YWJsZV9sYXN0KCAmZGltLT5tYXNrcywgbWVtb3J5LCAmbWFzayApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZXJyb3IgPSBwc19tYXNrX3NldF9iaXQoIG1hc2ssIGlkeCwgbWVtb3J5ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBpZiAoIGFpbmRleCApCi0gICAgICAgICphaW5kZXggPSAoRlRfSW50KWlkeDsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGFkZCBhICJoc3RlbTMvdnN0ZW0zIiBjb3VudGVyIHRvIG91ciBkaW1lbnNpb24gdGFibGUgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHBzX2RpbWVuc2lvbl9hZGRfY291bnRlciggUFNfRGltZW5zaW9uICBkaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICBoaW50MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgIGhpbnQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgaGludDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yICAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfVUludCAgIGNvdW50ICAgPSBkaW0tPmNvdW50ZXJzLm51bV9tYXNrczsKLSAgICBQU19NYXNrICAgY291bnRlciA9IGRpbS0+Y291bnRlcnMubWFza3M7Ci0KLQotICAgIC8qIHRyeSB0byBmaW5kIGFuIGV4aXN0aW5nIGNvdW50ZXIgbWFzayB0aGF0IGFscmVhZHkgdXNlcyAqLwotICAgIC8qIG9uZSBvZiB0aGVzZSBzdGVtcyBoZXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBjb3VudGVyKysgKQotICAgIHsKLSAgICAgIGlmICggcHNfbWFza190ZXN0X2JpdCggY291bnRlciwgaGludDEgKSB8fAotICAgICAgICAgICBwc19tYXNrX3Rlc3RfYml0KCBjb3VudGVyLCBoaW50MiApIHx8Ci0gICAgICAgICAgIHBzX21hc2tfdGVzdF9iaXQoIGNvdW50ZXIsIGhpbnQzICkgKQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBjcmVhdGUgYSBuZXcgY291bnRlciB3aGVuIG5lZWRlZCAqLwotICAgIGlmICggY291bnQgPT0gMCApCi0gICAgewotICAgICAgZXJyb3IgPSBwc19tYXNrX3RhYmxlX2FsbG9jKCAmZGltLT5jb3VudGVycywgbWVtb3J5LCAmY291bnRlciApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBub3csIHNldCB0aGUgYml0cyBmb3Igb3VyIGhpbnRzIGluIHRoZSBjb3VudGVyIG1hc2sgKi8KLSAgICBpZiAoIGhpbnQxID49IDAgKQotICAgIHsKLSAgICAgIGVycm9yID0gcHNfbWFza19zZXRfYml0KCBjb3VudGVyLCAoRlRfVUludCloaW50MSwgbWVtb3J5ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggaGludDIgPj0gMCApCi0gICAgewotICAgICAgZXJyb3IgPSBwc19tYXNrX3NldF9iaXQoIGNvdW50ZXIsIChGVF9VSW50KWhpbnQyLCBtZW1vcnkgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBoaW50MyA+PSAwICkKLSAgICB7Ci0gICAgICBlcnJvciA9IHBzX21hc2tfc2V0X2JpdCggY291bnRlciwgKEZUX1VJbnQpaGludDMsIG1lbW9yeSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGVuZCBvZiByZWNvcmRpbmcgc2Vzc2lvbiBmb3IgYSBnaXZlbiBkaW1lbnNpb24gKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHBzX2RpbWVuc2lvbl9lbmQoIFBTX0RpbWVuc2lvbiAgZGltLAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGVuZF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgKQotICB7Ci0gICAgLyogZW5kIGhpbnQgbWFzayB0YWJsZSAqLwotICAgIHBzX2RpbWVuc2lvbl9lbmRfbWFzayggZGltLCBlbmRfcG9pbnQgKTsKLQotICAgIC8qIG1lcmdlIGFsbCBjb3VudGVyIG1hc2tzIGludG8gaW5kZXBlbmRlbnQgInBhdGhzIiAqLwotICAgIHJldHVybiBwc19tYXNrX3RhYmxlX21lcmdlX2FsbCggJmRpbS0+Y291bnRlcnMsIG1lbW9yeSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgIFBTX1JFQ09SREVSIE1BTkFHRU1FTlQgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIGRlc3Ryb3kgaGludHMgKi8KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBwc19oaW50c19kb25lKCBQU19IaW50cyAgaGludHMgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBoaW50cy0+bWVtb3J5OwotCi0KLSAgICBwc19kaW1lbnNpb25fZG9uZSggJmhpbnRzLT5kaW1lbnNpb25bMF0sIG1lbW9yeSApOwotICAgIHBzX2RpbWVuc2lvbl9kb25lKCAmaGludHMtPmRpbWVuc2lvblsxXSwgbWVtb3J5ICk7Ci0KLSAgICBoaW50cy0+ZXJyb3IgID0gRlRfRXJyX09rOwotICAgIGhpbnRzLT5tZW1vcnkgPSBOVUxMOwotICB9Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHBzX2hpbnRzX2luaXQoIFBTX0hpbnRzICAgaGludHMsCi0gICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICkKLSAgewotICAgIEZUX01FTV9aRVJPKCBoaW50cywgc2l6ZW9mICggKmhpbnRzICkgKTsKLSAgICBoaW50cy0+bWVtb3J5ID0gbWVtb3J5OwotICB9Ci0KLQotICAvKiBpbml0aWFsaXplIGEgaGludHMgZm9yIGEgbmV3IHNlc3Npb24gKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNfaGludHNfb3BlbiggUFNfSGludHMgICAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgUFNfSGludF9UeXBlICBoaW50X3R5cGUgKQotICB7Ci0gICAgaGludHMtPmVycm9yICAgICA9IEZUX0Vycl9PazsKLSAgICBoaW50cy0+aGludF90eXBlID0gaGludF90eXBlOwotCi0gICAgcHNfZGltZW5zaW9uX2luaXQoICZoaW50cy0+ZGltZW5zaW9uWzBdICk7Ci0gICAgcHNfZGltZW5zaW9uX2luaXQoICZoaW50cy0+ZGltZW5zaW9uWzFdICk7Ci0gIH0KLQotCi0gIC8qIGFkZCBvbmUgb3IgbW9yZSBzdGVtcyB0byB0aGUgY3VycmVudCBoaW50cyB0YWJsZSAqLwotICBzdGF0aWMgdm9pZAotICBwc19oaW50c19zdGVtKCBQU19IaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgIEZUX1VJbnQgICBkaW1lbnNpb24sCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgRlRfTG9uZyogIHN0ZW1zICkKLSAgewotICAgIFBTX0RpbWVuc2lvbiAgZGltOwotCi0KLSAgICBpZiAoIGhpbnRzLT5lcnJvciApCi0gICAgICByZXR1cm47Ci0KLSAgICAvKiBsaW1pdCAiZGltZW5zaW9uIiB0byAwLi4xICovCi0gICAgaWYgKCBkaW1lbnNpb24gPiAxICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTAoKCAicHNfaGludHNfc3RlbTogaW52YWxpZCBkaW1lbnNpb24gKCVkKSB1c2VkXG4iLAotICAgICAgICAgICAgICAgICAgZGltZW5zaW9uICkpOwotICAgICAgZGltZW5zaW9uID0gKCBkaW1lbnNpb24gIT0gMCApOwotICAgIH0KLQotICAgIC8qIHJlY29yZCB0aGUgc3RlbXMgaW4gdGhlIGN1cnJlbnQgaGludHMvbWFza3MgdGFibGUgKi8KLSAgICAvKiAoVHlwZSAxICYgMidzIGBoc3RlbScgb3IgYHZzdGVtJyBvcGVyYXRvcnMpICAgICAgICovCi0gICAgZGltID0gJmhpbnRzLT5kaW1lbnNpb25bZGltZW5zaW9uXTsKLQotICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBzdGVtcyArPSAyICkKLSAgICB7Ci0gICAgICBGVF9FcnJvciAgIGVycm9yOwotICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBoaW50cy0+bWVtb3J5OwotCi0KLSAgICAgIGVycm9yID0gcHNfZGltZW5zaW9uX2FkZF90MXN0ZW0oIGRpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9JbnQpc3RlbXNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfSW50KXN0ZW1zWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggInBzX2hpbnRzX3N0ZW06IGNvdWxkIG5vdCBhZGQgc3RlbSIKLSAgICAgICAgICAgICAgICAgICAiICglZCwlZCkgdG8gaGludHMgdGFibGVcbiIsIHN0ZW1zWzBdLCBzdGVtc1sxXSApKTsKLQotICAgICAgICBoaW50cy0+ZXJyb3IgPSBlcnJvcjsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyogYWRkIG9uZSBUeXBlMSBjb3VudGVyIHN0ZW0gdG8gdGhlIGN1cnJlbnQgaGludHMgdGFibGUgKi8KLSAgc3RhdGljIHZvaWQKLSAgcHNfaGludHNfdDFzdGVtMyggUFNfSGludHMgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBkaW1lbnNpb24sCi0gICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgc3RlbXMgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoICFoaW50cy0+ZXJyb3IgKQotICAgIHsKLSAgICAgIFBTX0RpbWVuc2lvbiAgZGltOwotICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBoaW50cy0+bWVtb3J5OwotICAgICAgRlRfSW50ICAgICAgICBjb3VudDsKLSAgICAgIEZUX0ludCAgICAgICAgaWR4WzNdOwotCi0KLSAgICAgIC8qIGxpbWl0ICJkaW1lbnNpb24iIHRvIDAuLjEgKi8KLSAgICAgIGlmICggZGltZW5zaW9uID4gMSApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMCgoICJwc19oaW50c190MXN0ZW0zOiBpbnZhbGlkIGRpbWVuc2lvbiAoJWQpIHVzZWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbiApKTsKLSAgICAgICAgZGltZW5zaW9uID0gKCBkaW1lbnNpb24gIT0gMCApOwotICAgICAgfQotCi0gICAgICBkaW0gPSAmaGludHMtPmRpbWVuc2lvbltkaW1lbnNpb25dOwotCi0gICAgICAvKiB0aGVyZSBtdXN0IGJlIDYgZWxlbWVudHMgaW4gdGhlICdzdGVtJyBhcnJheSAqLwotICAgICAgaWYgKCBoaW50cy0+aGludF90eXBlID09IFBTX0hJTlRfVFlQRV8xICkKLSAgICAgIHsKLSAgICAgICAgLyogYWRkIHRoZSB0aHJlZSBzdGVtcyB0byBvdXIgaGludHMvbWFza3MgdGFibGUgKi8KLSAgICAgICAgZm9yICggY291bnQgPSAwOyBjb3VudCA8IDM7IGNvdW50KyssIHN0ZW1zICs9IDIgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSBwc19kaW1lbnNpb25fYWRkX3Qxc3RlbSggZGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9JbnQpRklYRURfVE9fSU5UKCBzdGVtc1swXSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9JbnQpRklYRURfVE9fSU5UKCBzdGVtc1sxXSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSwgJmlkeFtjb3VudF0gKTsKLSAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIG5vdywgYWRkIHRoZSBoaW50cyB0byB0aGUgY291bnRlcnMgdGFibGUgKi8KLSAgICAgICAgZXJyb3IgPSBwc19kaW1lbnNpb25fYWRkX2NvdW50ZXIoIGRpbSwgaWR4WzBdLCBpZHhbMV0sIGlkeFsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggInBzX2hpbnRzX3Qxc3RlbTM6IGNhbGxlZCB3aXRoIGludmFsaWQgaGludCB0eXBlXG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm47Ci0KLSAgRmFpbDoKLSAgICBGVF9FUlJPUigoICJwc19oaW50c190MXN0ZW0zOiBjb3VsZCBub3QgYWRkIGNvdW50ZXIgc3RlbXMgdG8gdGFibGVcbiIgKSk7Ci0gICAgaGludHMtPmVycm9yID0gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIHJlc2V0IGhpbnRzIChvbmx5IHdpdGggVHlwZSAxIGhpbnRzKSAqLwotICBzdGF0aWMgdm9pZAotICBwc19oaW50c190MXJlc2V0KCBQU19IaW50cyAgaGludHMsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICBlbmRfcG9pbnQgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoICFoaW50cy0+ZXJyb3IgKQotICAgIHsKLSAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gaGludHMtPm1lbW9yeTsKLQotCi0gICAgICBpZiAoIGhpbnRzLT5oaW50X3R5cGUgPT0gUFNfSElOVF9UWVBFXzEgKQotICAgICAgewotICAgICAgICBlcnJvciA9IHBzX2RpbWVuc2lvbl9yZXNldF9tYXNrKCAmaGludHMtPmRpbWVuc2lvblswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX3BvaW50LCBtZW1vcnkgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIGVycm9yID0gcHNfZGltZW5zaW9uX3Jlc2V0X21hc2soICZoaW50cy0+ZGltZW5zaW9uWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfcG9pbnQsIG1lbW9yeSApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGludmFsaWQgaGludCB0eXBlICovCi0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm47Ci0KLSAgRmFpbDoKLSAgICBoaW50cy0+ZXJyb3IgPSBlcnJvcjsKLSAgfQotCi0KLSAgLyogVHlwZTIgImhpbnRtYXNrIiBvcGVyYXRvciwgYWRkIGEgbmV3IGhpbnRtYXNrIHRvIGVhY2ggZGlyZWN0aW9uICovCi0gIHN0YXRpYyB2b2lkCi0gIHBzX2hpbnRzX3QybWFzayggUFNfSGludHMgICAgICAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICBlbmRfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIGJpdF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9CeXRlKiAgYnl0ZXMgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBpZiAoICFoaW50cy0+ZXJyb3IgKQotICAgIHsKLSAgICAgIFBTX0RpbWVuc2lvbiAgZGltICAgID0gaGludHMtPmRpbWVuc2lvbjsKLSAgICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ID0gaGludHMtPm1lbW9yeTsKLSAgICAgIEZUX1VJbnQgICAgICAgY291bnQxID0gZGltWzBdLmhpbnRzLm51bV9oaW50czsKLSAgICAgIEZUX1VJbnQgICAgICAgY291bnQyID0gZGltWzFdLmhpbnRzLm51bV9oaW50czsKLQotCi0gICAgICAvKiBjaGVjayBiaXQgY291bnQ7IG11c3QgYmUgZXF1YWwgdG8gY3VycmVudCB0b3RhbCBoaW50IGNvdW50ICovCi0gICAgICBpZiAoIGJpdF9jb3VudCAhPSAgY291bnQxICsgY291bnQyICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UwKCggInBzX2hpbnRzX3QybWFzazoiCi0gICAgICAgICAgICAgICAgICAgICIgY2FsbGVkIHdpdGggaW52YWxpZCBiaXRjb3VudCAlZCAoaW5zdGVhZCBvZiAlZClcbiIsCi0gICAgICAgICAgICAgICAgICAgYml0X2NvdW50LCBjb3VudDEgKyBjb3VudDIgKSk7Ci0KLSAgICAgICAgLyogc2ltcGx5IGlnbm9yZSB0aGUgb3BlcmF0b3IgKi8KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICAvKiBzZXQtdXAgbmV3IGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGhpbnQgbWFzayBub3cgKi8KLSAgICAgIGVycm9yID0gcHNfZGltZW5zaW9uX3NldF9tYXNrX2JpdHMoICZkaW1bMF0sIGJ5dGVzLCBjb3VudDIsIGNvdW50MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9wb2ludCwgbWVtb3J5ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBlcnJvciA9IHBzX2RpbWVuc2lvbl9zZXRfbWFza19iaXRzKCAmZGltWzFdLCBieXRlcywgMCwgY291bnQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kX3BvaW50LCBtZW1vcnkgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgfQotICAgIHJldHVybjsKLQotICBGYWlsOgotICAgIGhpbnRzLT5lcnJvciA9IGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBwc19oaW50c190MmNvdW50ZXIoIFBTX0hpbnRzICAgICAgICBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgYml0X2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX0J5dGUqICBieXRlcyApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIGlmICggIWhpbnRzLT5lcnJvciApCi0gICAgewotICAgICAgUFNfRGltZW5zaW9uICBkaW0gICAgPSBoaW50cy0+ZGltZW5zaW9uOwotICAgICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBoaW50cy0+bWVtb3J5OwotICAgICAgRlRfVUludCAgICAgICBjb3VudDEgPSBkaW1bMF0uaGludHMubnVtX2hpbnRzOwotICAgICAgRlRfVUludCAgICAgICBjb3VudDIgPSBkaW1bMV0uaGludHMubnVtX2hpbnRzOwotCi0KLSAgICAgIC8qIGNoZWNrIGJpdCBjb3VudCwgbXVzdCBiZSBlcXVhbCB0byBjdXJyZW50IHRvdGFsIGhpbnQgY291bnQgKi8KLSAgICAgIGlmICggYml0X2NvdW50ICE9ICBjb3VudDEgKyBjb3VudDIgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTAoKCAicHNfaGludHNfdDJjb3VudGVyOiIKLSAgICAgICAgICAgICAgICAgICAgIiBjYWxsZWQgd2l0aCBpbnZhbGlkIGJpdGNvdW50ICVkIChpbnN0ZWFkIG9mICVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICBiaXRfY291bnQsIGNvdW50MSArIGNvdW50MiApKTsKLQotICAgICAgICAvKiBzaW1wbHkgaWdub3JlIHRoZSBvcGVyYXRvciAqLwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIC8qIHNldC11cCBuZXcgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgaGludCBtYXNrIG5vdyAqLwotICAgICAgZXJyb3IgPSBwc19kaW1lbnNpb25fc2V0X21hc2tfYml0cyggJmRpbVswXSwgYnl0ZXMsIDAsIGNvdW50MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIG1lbW9yeSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgZXJyb3IgPSBwc19kaW1lbnNpb25fc2V0X21hc2tfYml0cyggJmRpbVsxXSwgYnl0ZXMsIGNvdW50MSwgY291bnQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgbWVtb3J5ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotICAgIH0KLSAgICByZXR1cm47Ci0KLSAgRmFpbDoKLSAgICBoaW50cy0+ZXJyb3IgPSBlcnJvcjsKLSAgfQotCi0KLSAgLyogZW5kIHJlY29yZGluZyBzZXNzaW9uICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwc19oaW50c19jbG9zZSggUFNfSGludHMgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGVuZF9wb2ludCApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIGVycm9yID0gaGludHMtPmVycm9yOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSA9IGhpbnRzLT5tZW1vcnk7Ci0gICAgICBQU19EaW1lbnNpb24gIGRpbSAgICA9IGhpbnRzLT5kaW1lbnNpb247Ci0KLQotICAgICAgZXJyb3IgPSBwc19kaW1lbnNpb25fZW5kKCAmZGltWzBdLCBlbmRfcG9pbnQsIG1lbW9yeSApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgewotICAgICAgICBlcnJvciA9IHBzX2RpbWVuc2lvbl9lbmQoICZkaW1bMV0sIGVuZF9wb2ludCwgbWVtb3J5ICk7Ci0gICAgICB9Ci0gICAgfQotCi0jaWZkZWYgREVCVUdfSElOVEVSCi0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgcHNfZGVidWdfaGludHMgPSBoaW50czsKLSNlbmRpZgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgIFRZUEUgMSBISU5UUyBSRUNPUkRJTkcgSU5URVJGQUNFICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgc3RhdGljIHZvaWQKLSAgdDFfaGludHNfb3BlbiggVDFfSGludHMgIGhpbnRzICkKLSAgewotICAgIHBzX2hpbnRzX29wZW4oIChQU19IaW50cyloaW50cywgUFNfSElOVF9UWVBFXzEgKTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkCi0gIHQxX2hpbnRzX3N0ZW0oIFQxX0hpbnRzICAgaGludHMsCi0gICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZGltZW5zaW9uLAotICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApCi0gIHsKLSAgICBGVF9Qb3MgIHN0ZW1zWzJdOwotCi0KLSAgICBzdGVtc1swXSA9IEZJWEVEX1RPX0lOVCggY29vcmRzWzBdICk7Ci0gICAgc3RlbXNbMV0gPSBGSVhFRF9UT19JTlQoIGNvb3Jkc1sxXSApOwotCi0gICAgcHNfaGludHNfc3RlbSggKFBTX0hpbnRzKWhpbnRzLCBkaW1lbnNpb24sIDEsIHN0ZW1zICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHQxX2hpbnRzX2Z1bmNzX2luaXQoIFQxX0hpbnRzX0Z1bmNzUmVjKiAgZnVuY3MgKQotICB7Ci0gICAgRlRfTUVNX1pFUk8oIChjaGFyKilmdW5jcywgc2l6ZW9mICggKmZ1bmNzICkgKTsKLQotICAgIGZ1bmNzLT5vcGVuICA9IChUMV9IaW50c19PcGVuRnVuYykgICAgdDFfaGludHNfb3BlbjsKLSAgICBmdW5jcy0+Y2xvc2UgPSAoVDFfSGludHNfQ2xvc2VGdW5jKSAgIHBzX2hpbnRzX2Nsb3NlOwotICAgIGZ1bmNzLT5zdGVtICA9IChUMV9IaW50c19TZXRTdGVtRnVuYykgdDFfaGludHNfc3RlbTsKLSAgICBmdW5jcy0+c3RlbTMgPSAoVDFfSGludHNfU2V0U3RlbTNGdW5jKXBzX2hpbnRzX3Qxc3RlbTM7Ci0gICAgZnVuY3MtPnJlc2V0ID0gKFQxX0hpbnRzX1Jlc2V0RnVuYykgICBwc19oaW50c190MXJlc2V0OwotICAgIGZ1bmNzLT5hcHBseSA9IChUMV9IaW50c19BcHBseUZ1bmMpICAgcHNfaGludHNfYXBwbHk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICBUWVBFIDIgSElOVFMgUkVDT1JESU5HIElOVEVSRkFDRSAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyB2b2lkCi0gIHQyX2hpbnRzX29wZW4oIFQyX0hpbnRzICBoaW50cyApCi0gIHsKLSAgICBwc19oaW50c19vcGVuKCAoUFNfSGludHMpaGludHMsIFBTX0hJTlRfVFlQRV8yICk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHQyX2hpbnRzX3N0ZW1zKCBUMl9IaW50cyAgIGhpbnRzLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBkaW1lbnNpb24sCi0gICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKQotICB7Ci0gICAgRlRfUG9zICBzdGVtc1szMl0sIHk7Ci0gICAgRlRfSW50ICB0b3RhbCA9IGNvdW50LCBuOwotCi0KLSAgICB5ID0gMDsKLSAgICB3aGlsZSAoIHRvdGFsID4gMCApCi0gICAgewotICAgICAgLyogZGV0ZXJtaW5lIG51bWJlciBvZiBzdGVtcyB0byB3cml0ZSAqLwotICAgICAgY291bnQgPSB0b3RhbDsKLSAgICAgIGlmICggY291bnQgPiAxNiApCi0gICAgICAgIGNvdW50ID0gMTY7Ci0KLSAgICAgIC8qIGNvbXB1dGUgaW50ZWdlciBzdGVtIHBvc2l0aW9ucyBpbiBmb250IHVuaXRzICovCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IGNvdW50ICogMjsgbisrICkKLSAgICAgIHsKLSAgICAgICAgeSAgICAgICArPSBjb29yZHNbbl07Ci0gICAgICAgIHN0ZW1zW25dID0gRklYRURfVE9fSU5UKCB5ICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNvbXB1dGUgbGVuZ3RocyAqLwotICAgICAgZm9yICggbiA9IDA7IG4gPCBjb3VudCAqIDI7IG4gKz0gMiApCi0gICAgICAgIHN0ZW1zW24gKyAxXSA9IHN0ZW1zW24gKyAxXSAtIHN0ZW1zW25dOwotCi0gICAgICAvKiBhZGQgdGhlbSB0byB0aGUgY3VycmVudCBkaW1lbnNpb24gKi8KLSAgICAgIHBzX2hpbnRzX3N0ZW0oIChQU19IaW50cyloaW50cywgZGltZW5zaW9uLCBjb3VudCwgc3RlbXMgKTsKLQotICAgICAgdG90YWwgLT0gY291bnQ7Ci0gICAgfQotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICB0Ml9oaW50c19mdW5jc19pbml0KCBUMl9IaW50c19GdW5jc1JlYyogIGZ1bmNzICkKLSAgewotICAgIEZUX01FTV9aRVJPKCBmdW5jcywgc2l6ZW9mICggKmZ1bmNzICkgKTsKLQotICAgIGZ1bmNzLT5vcGVuICAgID0gKFQyX0hpbnRzX09wZW5GdW5jKSAgIHQyX2hpbnRzX29wZW47Ci0gICAgZnVuY3MtPmNsb3NlICAgPSAoVDJfSGludHNfQ2xvc2VGdW5jKSAgcHNfaGludHNfY2xvc2U7Ci0gICAgZnVuY3MtPnN0ZW1zICAgPSAoVDJfSGludHNfU3RlbXNGdW5jKSAgdDJfaGludHNfc3RlbXM7Ci0gICAgZnVuY3MtPmhpbnRtYXNrPSAoVDJfSGludHNfTWFza0Z1bmMpICAgcHNfaGludHNfdDJtYXNrOwotICAgIGZ1bmNzLT5jb3VudGVyID0gKFQyX0hpbnRzX0NvdW50ZXJGdW5jKXBzX2hpbnRzX3QyY291bnRlcjsKLSAgICBmdW5jcy0+YXBwbHkgICA9IChUMl9IaW50c19BcHBseUZ1bmMpICBwc19oaW50c19hcHBseTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaHJlYy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzaGludGVyL3BzaHJlYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjFhZDk0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc2hpbnRlci9wc2hyZWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc2hyZWMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUG9zdHNjcmlwdCAoVHlwZTEvVHlwZTIpIGhpbnRzIHJlY29yZGVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBUaGUgZnVuY3Rpb25zIGRlZmluZWQgaGVyZSBhcmUgY2FsbGVkIGZyb20gdGhlIFR5cGUgMSwgQ0lEIGFuZCBDRkYgICAgKi8KLSAgLyogIGZvbnQgZHJpdmVycyB0byByZWNvcmQgdGhlIGhpbnRzIG9mIGEgZ2l2ZW4gY2hhcmFjdGVyL2dseXBoLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBUaGUgaGludHMgYXJlIHJlY29yZGVkIGluIGEgdW5pZmllZCBmb3JtYXQsIGFuZCBhcmUgbGF0ZXIgcHJvY2Vzc2VkICAgKi8KLSAgLyogIGJ5IHRoZSBgb3B0aW1pemVyJyBhbmQgYGZpdHRlcicgdG8gYWRqdXN0IHRoZSBvdXRsaW5lcyB0byB0aGUgcGl4ZWwgICAqLwotICAvKiAgZ3JpZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19QU0hSRUNfSF9fCi0jZGVmaW5lIF9fUFNIUkVDX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9ISU5UU19ICi0jaW5jbHVkZSAicHNoZ2xvYi5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICBHTFlQSCBISU5UUyBSRUNPUkRFUiBJTlRFUk5BTFMgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyogaGFuZGxlIHRvIGhpbnQgcmVjb3JkICovCi0gIHR5cGVkZWYgc3RydWN0IFBTX0hpbnRSZWNfKiAgUFNfSGludDsKLQotICAvKiBoaW50IHR5cGVzICovCi0gIHR5cGVkZWYgZW51bSAgUFNfSGludF9UeXBlXwotICB7Ci0gICAgUFNfSElOVF9UWVBFXzEgPSAxLAotICAgIFBTX0hJTlRfVFlQRV8yID0gMgotCi0gIH0gUFNfSGludF9UeXBlOwotCi0KLSAgLyogaGludCBmbGFncyAqLwotI2RlZmluZSBQU19ISU5UX0ZMQUdfR0hPU1QgICAxVQotI2RlZmluZSBQU19ISU5UX0ZMQUdfQk9UVE9NICAyVQotCi0KLSAgLyogaGludCBkZXNjcmlwdG9yICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU19IaW50UmVjXwotICB7Ci0gICAgRlRfSW50ICAgcG9zOwotICAgIEZUX0ludCAgIGxlbjsKLSAgICBGVF9VSW50ICBmbGFnczsKLQotICB9IFBTX0hpbnRSZWM7Ci0KLQotI2RlZmluZSBwc19oaW50X2lzX2FjdGl2ZSggeCApICAoICh4KS0+ZmxhZ3MgJiBQU19ISU5UX0ZMQUdfQUNUSVZFICkKLSNkZWZpbmUgcHNfaGludF9pc19naG9zdCggeCApICAgKCAoeCktPmZsYWdzICYgUFNfSElOVF9GTEFHX0dIT1NUICApCi0jZGVmaW5lIHBzX2hpbnRfaXNfYm90dG9tKCB4ICkgICggKHgpLT5mbGFncyAmIFBTX0hJTlRfRkxBR19CT1RUT00gKQotCi0KLSAgLyogaGludHMgdGFibGUgZGVzY3JpcHRvciAqLwotICB0eXBlZGVmIHN0cnVjdCAgUFNfSGludF9UYWJsZVJlY18KLSAgewotICAgIEZUX1VJbnQgIG51bV9oaW50czsKLSAgICBGVF9VSW50ICBtYXhfaGludHM7Ci0gICAgUFNfSGludCAgaGludHM7Ci0KLSAgfSBQU19IaW50X1RhYmxlUmVjLCAqUFNfSGludF9UYWJsZTsKLQotCi0gIC8qIGhpbnQgYW5kIGNvdW50ZXIgbWFzayBkZXNjcmlwdG9yICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU19NYXNrUmVjXwotICB7Ci0gICAgRlRfVUludCAgIG51bV9iaXRzOwotICAgIEZUX1VJbnQgICBtYXhfYml0czsKLSAgICBGVF9CeXRlKiAgYnl0ZXM7Ci0gICAgRlRfVUludCAgIGVuZF9wb2ludDsKLQotICB9IFBTX01hc2tSZWMsICpQU19NYXNrOwotCi0KLSAgLyogbWFza3MgYW5kIGNvdW50ZXJzIHRhYmxlIGRlc2NyaXB0b3IgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFBTX01hc2tfVGFibGVSZWNfCi0gIHsKLSAgICBGVF9VSW50ICBudW1fbWFza3M7Ci0gICAgRlRfVUludCAgbWF4X21hc2tzOwotICAgIFBTX01hc2sgIG1hc2tzOwotCi0gIH0gUFNfTWFza19UYWJsZVJlYywgKlBTX01hc2tfVGFibGU7Ci0KLQotIC8qIGRpbWVuc2lvbi1zcGVjaWZpYyBoaW50cyBkZXNjcmlwdG9yICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU19EaW1lbnNpb25SZWNfCi0gIHsKLSAgICBQU19IaW50X1RhYmxlUmVjICBoaW50czsKLSAgICBQU19NYXNrX1RhYmxlUmVjICBtYXNrczsKLSAgICBQU19NYXNrX1RhYmxlUmVjICBjb3VudGVyczsKLQotICB9IFBTX0RpbWVuc2lvblJlYywgKlBTX0RpbWVuc2lvbjsKLQotCi0gIC8qIGdseXBoIGhpbnRzIGRlc2NyaXB0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIGRpbWVuc2lvbiAwID0+IFggY29vcmRpbmF0ZXMgKyB2ZXJ0aWNhbCBoaW50cy9zdGVtcyAgICovCi0gIC8qIGRpbWVuc2lvbiAxID0+IFkgY29vcmRpbmF0ZXMgKyBob3Jpem9udGFsIGhpbnRzL3N0ZW1zICovCi0gIHR5cGVkZWYgc3RydWN0ICBQU19IaW50c1JlY18KLSAgewotICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5OwotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3I7Ci0gICAgRlRfVUludDMyICAgICAgICBtYWdpYzsKLSAgICBQU19IaW50X1R5cGUgICAgIGhpbnRfdHlwZTsKLSAgICBQU19EaW1lbnNpb25SZWMgIGRpbWVuc2lvblsyXTsKLQotICB9IFBTX0hpbnRzUmVjLCAqUFNfSGludHM7Ci0KLSAgLyogKi8KLQotICAvKiBpbml0aWFsaXplIGhpbnRzIHJlY29yZGVyICovCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgcHNfaGludHNfaW5pdCggUFNfSGludHMgICBoaW50cywKLSAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICBtZW1vcnkgKTsKLQotICAvKiBmaW5hbGl6ZSBoaW50cyByZWNvcmRlciAqLwotICBGVF9MT0NBTCggdm9pZCApCi0gIHBzX2hpbnRzX2RvbmUoIFBTX0hpbnRzICBoaW50cyApOwotCi0gIC8qIGluaXRpYWxpemUgVHlwZTEgaGludHMgcmVjb3JkZXIgaW50ZXJmYWNlICovCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgdDFfaGludHNfZnVuY3NfaW5pdCggVDFfSGludHNfRnVuY3NSZWMqICBmdW5jcyApOwotCi0gIC8qIGluaXRpYWxpemUgVHlwZTIgaGludHMgcmVjb3JkZXIgaW50ZXJmYWNlICovCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgdDJfaGludHNfZnVuY3NfaW5pdCggVDJfSGludHNfRnVuY3NSZWMqICBmdW5jcyApOwotCi0KLSNpZmRlZiBERUJVR19ISU5URVIKLSAgZXh0ZXJuIFBTX0hpbnRzICBwc19kZWJ1Z19oaW50czsKLSAgZXh0ZXJuICBpbnQgICAgICBwc19kZWJ1Z19ub19ob3J6X2hpbnRzOwotICBleHRlcm4gIGludCAgICAgIHBzX2RlYnVnX25vX3ZlcnRfaGludHM7Ci0jZW5kaWYKLQotIC8qICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0KLSNlbmRpZiAvKiBfX1BTX0hJTlRFUl9SRUNPUkRfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNuYW1lcy9KYW1maWxlIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzbmFtZXMvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRjYzhiOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNuYW1lcy9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBGcmVlVHlwZSAyIHNyYy9wc25hbWVzIEphbWZpbGUKLSMKLSMgQ29weXJpZ2h0IDIwMDEtMjAxNSBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLVN1YkRpciAgRlQyX1RPUCAkKEZUMl9TUkNfRElSKSBwc25hbWVzIDsKLQotewotICBsb2NhbCAgX3NvdXJjZXMgOwotCi0gIGlmICQoRlQyX01VTFRJKQotICB7Ci0gICAgX3NvdXJjZXMgPSBwc21vZHVsZQotICAgICAgICAgICAgICAgcHNwaWMKLSAgICAgICAgICAgICAgIDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBfc291cmNlcyA9IHBzbmFtZXMgOwotICB9Ci0KLSAgTGlicmFyeSAgJChGVDJfTElCKSA6ICQoX3NvdXJjZXMpLmMgOwotfQotCi0jIGVuZCBvZiBzcmMvcHNuYW1lcyBKYW1maWxlCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNuYW1lcy9wc21vZHVsZS5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzbmFtZXMvcHNtb2R1bGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYwNGMyZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNuYW1lcy9wc21vZHVsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzbW9kdWxlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQU05hbWVzIG1vZHVsZSBpbXBsZW1lbnRhdGlvbiAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19ICi0KLSNpbmNsdWRlICJwc21vZHVsZS5oIgotI2luY2x1ZGUgInBzdGFibGVzLmgiCi0KLSNpbmNsdWRlICJwc25hbWVyci5oIgotI2luY2x1ZGUgInBzcGljLmgiCi0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0FET0JFX0dMWVBIX0xJU1QKLQotCi0jZGVmaW5lIFZBUklBTlRfQklUICAgICAgICAgMHg4MDAwMDAwMFVMCi0jZGVmaW5lIEJBU0VfR0xZUEgoIGNvZGUgKSAgKCAoRlRfVUludDMyKSggKGNvZGUpICYgflZBUklBTlRfQklUICkgKQotCi0KLSAgLyogUmV0dXJuIHRoZSBVbmljb2RlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBnbHlwaC4gIE5vdGUgdGhhdCAqLwotICAvKiB3ZSBkbyBkZWFsIHdpdGggZ2x5cGggdmFyaWFudHMgYnkgZGV0ZWN0aW5nIGEgbm9uLWluaXRpYWwgZG90IGluICAgICovCi0gIC8qIHRoZSBuYW1lLCBhcyBpbiBgQS5zd2FzaCcgb3IgYGUuZmluYWwnOyBpbiB0aGlzIGNhc2UsIHRoZSAgICAgICAgICAgKi8KLSAgLyogVkFSSUFOVF9CSVQgaXMgc2V0IGluIHRoZSByZXR1cm4gdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9VSW50MzIKLSAgcHNfdW5pY29kZV92YWx1ZSggY29uc3QgY2hhciogIGdseXBoX25hbWUgKQotICB7Ci0gICAgLyogSWYgdGhlIG5hbWUgYmVnaW5zIHdpdGggYHVuaScsIHRoZW4gdGhlIGdseXBoIG5hbWUgbWF5IGJlIGEgKi8KLSAgICAvKiBoYXJkLWNvZGVkIHVuaWNvZGUgY2hhcmFjdGVyIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggZ2x5cGhfbmFtZVswXSA9PSAndScgJiYKLSAgICAgICAgIGdseXBoX25hbWVbMV0gPT0gJ24nICYmCi0gICAgICAgICBnbHlwaF9uYW1lWzJdID09ICdpJyApCi0gICAgewotICAgICAgLyogZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG5leHQgZm91ciBjaGFyYWN0ZXJzIGZvbGxvd2luZyBhcmUgKi8KLSAgICAgIC8qIGhleGFkZWNpbWFsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIC8qIFhYWDogQWRkIGNvZGUgdG8gZGVhbCB3aXRoIGxpZ2F0dXJlcywgaS5lLiBnbHlwaCBuYW1lcyBsaWtlICovCi0gICAgICAvKiAgICAgIGB1bmlYWFhYWVlZWVpaWlonLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBGVF9JbnQgICAgICAgY291bnQ7Ci0gICAgICBGVF9VSW50MzIgICAgdmFsdWUgPSAwOwotICAgICAgY29uc3QgY2hhciogIHAgICAgID0gZ2x5cGhfbmFtZSArIDM7Ci0KLQotICAgICAgZm9yICggY291bnQgPSA0OyBjb3VudCA+IDA7IGNvdW50LS0sIHArKyApCi0gICAgICB7Ci0gICAgICAgIGNoYXIgICAgICAgICAgYyA9ICpwOwotICAgICAgICB1bnNpZ25lZCBpbnQgIGQ7Ci0KLQotICAgICAgICBkID0gKHVuc2lnbmVkIGNoYXIpYyAtICcwJzsKLSAgICAgICAgaWYgKCBkID49IDEwICkKLSAgICAgICAgewotICAgICAgICAgIGQgPSAodW5zaWduZWQgY2hhciljIC0gJ0EnOwotICAgICAgICAgIGlmICggZCA+PSA2ICkKLSAgICAgICAgICAgIGQgPSAxNjsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBkICs9IDEwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogRXhpdCBpZiBhIG5vbi11cHBlcmNhc2UgaGV4YWRlY2ltYWwgY2hhcmFjdGVyIHdhcyBmb3VuZCAgICovCi0gICAgICAgIC8qIC0tIHRoaXMgYWxzbyBjYXRjaGVzIGNoYXJhY3RlciBjb2RlcyBiZWxvdyBgMCcgc2luY2Ugc3VjaCAqLwotICAgICAgICAvKiBuZWdhdGl2ZSBudW1iZXJzIGNhc3QgdG8gYHVuc2lnbmVkIGludCcgYXJlIGZhciB0b28gYmlnLiAgKi8KLSAgICAgICAgaWYgKCBkID49IDE2ICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICB2YWx1ZSA9ICggdmFsdWUgPDwgNCApICsgZDsKLSAgICAgIH0KLQotICAgICAgLyogdGhlcmUgbXVzdCBiZSBleGFjdGx5IGZvdXIgaGV4IGRpZ2l0cyAqLwotICAgICAgaWYgKCBjb3VudCA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCAqcCA9PSAnXDAnICkKLSAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIGlmICggKnAgPT0gJy4nICkKLSAgICAgICAgICByZXR1cm4gKEZUX1VJbnQzMikoIHZhbHVlIHwgVkFSSUFOVF9CSVQgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBJZiB0aGUgbmFtZSBiZWdpbnMgd2l0aCBgdScsIGZvbGxvd2VkIGJ5IGZvdXIgdG8gc2l4IHVwcGVyY2FzZSAqLwotICAgIC8qIGhleGFkZWNpbWFsIGRpZ2l0cywgaXQgaXMgYSBoYXJkLWNvZGVkIHVuaWNvZGUgY2hhcmFjdGVyIGNvZGUuICovCi0gICAgaWYgKCBnbHlwaF9uYW1lWzBdID09ICd1JyApCi0gICAgewotICAgICAgRlRfSW50ICAgICAgIGNvdW50OwotICAgICAgRlRfVUludDMyICAgIHZhbHVlID0gMDsKLSAgICAgIGNvbnN0IGNoYXIqICBwICAgICA9IGdseXBoX25hbWUgKyAxOwotCi0KLSAgICAgIGZvciAoIGNvdW50ID0gNjsgY291bnQgPiAwOyBjb3VudC0tLCBwKysgKQotICAgICAgewotICAgICAgICBjaGFyICAgICAgICAgIGMgPSAqcDsKLSAgICAgICAgdW5zaWduZWQgaW50ICBkOwotCi0KLSAgICAgICAgZCA9ICh1bnNpZ25lZCBjaGFyKWMgLSAnMCc7Ci0gICAgICAgIGlmICggZCA+PSAxMCApCi0gICAgICAgIHsKLSAgICAgICAgICBkID0gKHVuc2lnbmVkIGNoYXIpYyAtICdBJzsKLSAgICAgICAgICBpZiAoIGQgPj0gNiApCi0gICAgICAgICAgICBkID0gMTY7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgZCArPSAxMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZCA+PSAxNiApCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgdmFsdWUgPSAoIHZhbHVlIDw8IDQgKSArIGQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggY291bnQgPD0gMiApCi0gICAgICB7Ci0gICAgICAgIGlmICggKnAgPT0gJ1wwJyApCi0gICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICBpZiAoICpwID09ICcuJyApCi0gICAgICAgICAgcmV0dXJuIChGVF9VSW50MzIpKCB2YWx1ZSB8IFZBUklBTlRfQklUICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogTG9vayBmb3IgYSBub24taW5pdGlhbCBkb3QgaW4gdGhlIGdseXBoIG5hbWUgaW4gb3JkZXIgdG8gKi8KLSAgICAvKiBmaW5kIHZhcmlhbnRzIGxpa2UgYEEuc3dhc2gnLCBgZS5maW5hbCcsIGV0Yy4gICAgICAgICAgICAqLwotICAgIHsKLSAgICAgIGNvbnN0IGNoYXIqICBwICAgPSBnbHlwaF9uYW1lOwotICAgICAgY29uc3QgY2hhciogIGRvdCA9IE5VTEw7Ci0KLQotICAgICAgZm9yICggOyAqcDsgcCsrICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCAqcCA9PSAnLicgJiYgcCA+IGdseXBoX25hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgZG90ID0gcDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBub3cgbG9vayB1cCB0aGUgZ2x5cGggaW4gdGhlIEFkb2JlIEdseXBoIExpc3QgKi8KLSAgICAgIGlmICggIWRvdCApCi0gICAgICAgIHJldHVybiAoRlRfVUludDMyKWZ0X2dldF9hZG9iZV9nbHlwaF9pbmRleCggZ2x5cGhfbmFtZSwgcCApOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gKEZUX1VJbnQzMikoIGZ0X2dldF9hZG9iZV9nbHlwaF9pbmRleCggZ2x5cGhfbmFtZSwgZG90ICkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUklBTlRfQklUICk7Ci0gICAgfQotICB9Ci0KLQotICAvKiBmdF9xc29ydCBjYWxsYmFjayB0byBzb3J0IHRoZSB1bmljb2RlIG1hcCAqLwotICBGVF9DQUxMQkFDS19ERUYoIGludCApCi0gIGNvbXBhcmVfdW5pX21hcHMoIGNvbnN0IHZvaWQqICBhLAotICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiAgYiApCi0gIHsKLSAgICBQU19VbmlNYXAqICBtYXAxID0gKFBTX1VuaU1hcCopYTsKLSAgICBQU19VbmlNYXAqICBtYXAyID0gKFBTX1VuaU1hcCopYjsKLSAgICBGVF9VSW50MzIgICB1bmljb2RlMSA9IEJBU0VfR0xZUEgoIG1hcDEtPnVuaWNvZGUgKTsKLSAgICBGVF9VSW50MzIgICB1bmljb2RlMiA9IEJBU0VfR0xZUEgoIG1hcDItPnVuaWNvZGUgKTsKLQotCi0gICAgLyogc29ydCBiYXNlIGdseXBocyBiZWZvcmUgZ2x5cGggdmFyaWFudHMgKi8KLSAgICBpZiAoIHVuaWNvZGUxID09IHVuaWNvZGUyICkKLSAgICB7Ci0gICAgICBpZiAoIG1hcDEtPnVuaWNvZGUgPiBtYXAyLT51bmljb2RlICkKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICBlbHNlIGlmICggbWFwMS0+dW5pY29kZSA8IG1hcDItPnVuaWNvZGUgKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCB1bmljb2RlMSA+IHVuaWNvZGUyICkKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICBlbHNlIGlmICggdW5pY29kZTEgPCB1bmljb2RlMiApCi0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0KLQotICAvKiBzdXBwb3J0IGZvciBleHRyYSBnbHlwaHMgbm90IGhhbmRsZWQgKHdlbGwpIGluIEFHTDsgKi8KLSAgLyogd2UgYWRkIGV4dHJhIG1hcHBpbmdzIGZvciB0aGVtIGlmIG5lY2Vzc2FyeSAgICAgICAgICovCi0KLSNkZWZpbmUgRVhUUkFfR0xZUEhfTElTVF9TSVpFICAxMAotCi0gIHN0YXRpYyBjb25zdCBGVF9VSW50MzIgIGZ0X2V4dHJhX2dseXBoX3VuaWNvZGVzW0VYVFJBX0dMWVBIX0xJU1RfU0laRV0gPQotICB7Ci0gICAgLyogV0dMIDQgKi8KLSAgICAweDAzOTQsCi0gICAgMHgwM0E5LAotICAgIDB4MjIxNSwKLSAgICAweDAwQUQsCi0gICAgMHgwMkM5LAotICAgIDB4MDNCQywKLSAgICAweDIyMTksCi0gICAgMHgwMEEwLAotICAgIC8qIFJvbWFuaWFuICovCi0gICAgMHgwMjFBLAotICAgIDB4MDIxQgotICB9OwotCi0gIHN0YXRpYyBjb25zdCBjaGFyICBmdF9leHRyYV9nbHlwaF9uYW1lc1tdID0KLSAgewotICAgICdEJywnZScsJ2wnLCd0JywnYScsMCwKLSAgICAnTycsJ20nLCdlJywnZycsJ2EnLDAsCi0gICAgJ2YnLCdyJywnYScsJ2MnLCd0JywnaScsJ28nLCduJywwLAotICAgICdoJywneScsJ3AnLCdoJywnZScsJ24nLDAsCi0gICAgJ20nLCdhJywnYycsJ3InLCdvJywnbicsMCwKLSAgICAnbScsJ3UnLDAsCi0gICAgJ3AnLCdlJywncicsJ2knLCdvJywnZCcsJ2MnLCdlJywnbicsJ3QnLCdlJywncicsJ2UnLCdkJywwLAotICAgICdzJywncCcsJ2EnLCdjJywnZScsMCwKLSAgICAnVCcsJ2MnLCdvJywnbScsJ20nLCdhJywnYScsJ2MnLCdjJywnZScsJ24nLCd0JywwLAotICAgICd0JywnYycsJ28nLCdtJywnbScsJ2EnLCdhJywnYycsJ2MnLCdlJywnbicsJ3QnLDAKLSAgfTsKLQotICBzdGF0aWMgY29uc3QgRlRfSW50Ci0gIGZ0X2V4dHJhX2dseXBoX25hbWVfb2Zmc2V0c1tFWFRSQV9HTFlQSF9MSVNUX1NJWkVdID0KLSAgewotICAgICAwLAotICAgICA2LAotICAgIDEyLAotICAgIDIxLAotICAgIDI4LAotICAgIDM1LAotICAgIDM4LAotICAgIDUzLAotICAgIDU5LAotICAgIDcyCi0gIH07Ci0KLQotICBzdGF0aWMgdm9pZAotICBwc19jaGVja19leHRyYV9nbHlwaF9uYW1lKCBjb25zdCBjaGFyKiAgZ25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCogICAgIGV4dHJhX2dseXBocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgKnN0YXRlcyApCi0gIHsKLSAgICBGVF9VSW50ICBuOwotCi0KLSAgICBmb3IgKCBuID0gMDsgbiA8IEVYVFJBX0dMWVBIX0xJU1RfU0laRTsgbisrICkKLSAgICB7Ci0gICAgICBpZiAoIGZ0X3N0cmNtcCggZnRfZXh0cmFfZ2x5cGhfbmFtZXMgKwotICAgICAgICAgICAgICAgICAgICAgICAgZnRfZXh0cmFfZ2x5cGhfbmFtZV9vZmZzZXRzW25dLCBnbmFtZSApID09IDAgKQotICAgICAgewotICAgICAgICBpZiAoIHN0YXRlc1tuXSA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIC8qIG1hcmsgdGhpcyBleHRyYSBnbHlwaCBhcyBhIGNhbmRpZGF0ZSBmb3IgdGhlIGNtYXAgKi8KLSAgICAgICAgICBzdGF0ZXNbbl0gICAgID0gMTsKLSAgICAgICAgICBleHRyYV9nbHlwaHNbbl0gPSBnbHlwaDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHBzX2NoZWNrX2V4dHJhX2dseXBoX3VuaWNvZGUoIEZUX1VJbnQzMiAgdW5pX2NoYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAqc3RhdGVzICkKLSAgewotICAgIEZUX1VJbnQgIG47Ci0KLQotICAgIGZvciAoIG4gPSAwOyBuIDwgRVhUUkFfR0xZUEhfTElTVF9TSVpFOyBuKysgKQotICAgIHsKLSAgICAgIGlmICggdW5pX2NoYXIgPT0gZnRfZXh0cmFfZ2x5cGhfdW5pY29kZXNbbl0gKQotICAgICAgewotICAgICAgICAvKiBkaXNhYmxlIHRoaXMgZXh0cmEgZ2x5cGggZnJvbSBiZWluZyBhZGRlZCB0byB0aGUgY21hcCAqLwotICAgICAgICBzdGF0ZXNbbl0gPSAyOwotCi0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qIEJ1aWxkIGEgdGFibGUgdGhhdCBtYXBzIFVuaWNvZGUgdmFsdWVzIHRvIGdseXBoIGluZGljZXMuICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwc191bmljb2Rlc19pbml0KCBGVF9NZW1vcnkgICAgICAgICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICBQU19Vbmljb2RlcyAgICAgICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgICBudW1fZ2x5cGhzLAotICAgICAgICAgICAgICAgICAgICBQU19HZXRHbHlwaE5hbWVGdW5jICAgZ2V0X2dseXBoX25hbWUsCi0gICAgICAgICAgICAgICAgICAgIFBTX0ZyZWVHbHlwaE5hbWVGdW5jICBmcmVlX2dseXBoX25hbWUsCi0gICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICAgICAgICAgICBnbHlwaF9kYXRhICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotICAgIEZUX1VJbnQgIGV4dHJhX2dseXBoX2xpc3Rfc3RhdGVzW10gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKLSAgICBGVF9VSW50ICBleHRyYV9nbHlwaHNbRVhUUkFfR0xZUEhfTElTVF9TSVpFXTsKLQotCi0gICAgLyogd2UgZmlyc3QgYWxsb2NhdGUgdGhlIHRhYmxlICovCi0gICAgdGFibGUtPm51bV9tYXBzID0gMDsKLSAgICB0YWJsZS0+bWFwcyAgICAgPSBOVUxMOwotCi0gICAgaWYgKCAhRlRfTkVXX0FSUkFZKCB0YWJsZS0+bWFwcywgbnVtX2dseXBocyArIEVYVFJBX0dMWVBIX0xJU1RfU0laRSApICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICAgICBuOwotICAgICAgRlRfVUludCAgICAgY291bnQ7Ci0gICAgICBQU19VbmlNYXAqICBtYXA7Ci0gICAgICBGVF9VSW50MzIgICB1bmlfY2hhcjsKLQotCi0gICAgICBtYXAgPSB0YWJsZS0+bWFwczsKLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fZ2x5cGhzOyBuKysgKQotICAgICAgewotICAgICAgICBjb25zdCBjaGFyKiAgZ25hbWUgPSBnZXRfZ2x5cGhfbmFtZSggZ2x5cGhfZGF0YSwgbiApOwotCi0KLSAgICAgICAgaWYgKCBnbmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICBwc19jaGVja19leHRyYV9nbHlwaF9uYW1lKCBnbmFtZSwgbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9nbHlwaHMsIGV4dHJhX2dseXBoX2xpc3Rfc3RhdGVzICk7Ci0gICAgICAgICAgdW5pX2NoYXIgPSBwc191bmljb2RlX3ZhbHVlKCBnbmFtZSApOwotCi0gICAgICAgICAgaWYgKCBCQVNFX0dMWVBIKCB1bmlfY2hhciApICE9IDAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHBzX2NoZWNrX2V4dHJhX2dseXBoX3VuaWNvZGUoIHVuaV9jaGFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfZ2x5cGhfbGlzdF9zdGF0ZXMgKTsKLSAgICAgICAgICAgIG1hcC0+dW5pY29kZSAgICAgPSB1bmlfY2hhcjsKLSAgICAgICAgICAgIG1hcC0+Z2x5cGhfaW5kZXggPSBuOwotICAgICAgICAgICAgbWFwKys7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCBmcmVlX2dseXBoX25hbWUgKQotICAgICAgICAgICAgZnJlZV9nbHlwaF9uYW1lKCBnbHlwaF9kYXRhLCBnbmFtZSApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgRVhUUkFfR0xZUEhfTElTVF9TSVpFOyBuKysgKQotICAgICAgewotICAgICAgICBpZiAoIGV4dHJhX2dseXBoX2xpc3Rfc3RhdGVzW25dID09IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogVGhpcyBnbHlwaCBuYW1lIGhhcyBhbiBhZGRpdGlvbmFsIHJlcHJlc2VudGF0aW9uLiAqLwotICAgICAgICAgIC8qIEFkZCBpdCB0byB0aGUgY21hcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgIG1hcC0+dW5pY29kZSAgICAgPSBmdF9leHRyYV9nbHlwaF91bmljb2Rlc1tuXTsKLSAgICAgICAgICBtYXAtPmdseXBoX2luZGV4ID0gZXh0cmFfZ2x5cGhzW25dOwotICAgICAgICAgIG1hcCsrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIG5vdyBjb21wcmVzcyB0aGUgdGFibGUgYSBiaXQgKi8KLSAgICAgIGNvdW50ID0gKEZUX1VJbnQpKCBtYXAgLSB0YWJsZS0+bWFwcyApOwotCi0gICAgICBpZiAoIGNvdW50ID09IDAgKQotICAgICAgewotICAgICAgICAvKiBObyB1bmljb2RlIGNoYXJzIGhlcmUhICovCi0gICAgICAgIEZUX0ZSRUUoIHRhYmxlLT5tYXBzICk7Ci0gICAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBOb19Vbmljb2RlX0dseXBoX05hbWUgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogUmVhbGxvY2F0ZSBpZiB0aGUgbnVtYmVyIG9mIHVzZWQgZW50cmllcyBpcyBtdWNoIHNtYWxsZXIuICovCi0gICAgICAgIGlmICggY291bnQgPCBudW1fZ2x5cGhzIC8gMiApCi0gICAgICAgIHsKLSAgICAgICAgICAodm9pZClGVF9SRU5FV19BUlJBWSggdGFibGUtPm1hcHMsIG51bV9nbHlwaHMsIGNvdW50ICk7Ci0gICAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBTb3J0IHRoZSB0YWJsZSBpbiBpbmNyZWFzaW5nIG9yZGVyIG9mIHVuaWNvZGUgdmFsdWVzLCAqLwotICAgICAgICAvKiB0YWtpbmcgY2FyZSBvZiBnbHlwaCB2YXJpYW50cy4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBmdF9xc29ydCggdGFibGUtPm1hcHMsIGNvdW50LCBzaXplb2YgKCBQU19VbmlNYXAgKSwKLSAgICAgICAgICAgICAgICAgIGNvbXBhcmVfdW5pX21hcHMgKTsKLSAgICAgIH0KLQotICAgICAgdGFibGUtPm51bV9tYXBzID0gY291bnQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfVUludAotICBwc191bmljb2Rlc19jaGFyX2luZGV4KCBQU19Vbmljb2RlcyAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgICB1bmljb2RlICkKLSAgewotICAgIFBTX1VuaU1hcCAgKm1pbiwgKm1heCwgKm1pZCwgKnJlc3VsdCA9IE5VTEw7Ci0KLQotICAgIC8qIFBlcmZvcm0gYSBiaW5hcnkgc2VhcmNoIG9uIHRoZSB0YWJsZS4gKi8KLQotICAgIG1pbiA9IHRhYmxlLT5tYXBzOwotICAgIG1heCA9IG1pbiArIHRhYmxlLT5udW1fbWFwcyAtIDE7Ci0KLSAgICB3aGlsZSAoIG1pbiA8PSBtYXggKQotICAgIHsKLSAgICAgIEZUX1VJbnQzMiAgYmFzZV9nbHlwaDsKLQotCi0gICAgICBtaWQgPSBtaW4gKyAoICggbWF4IC0gbWluICkgPj4gMSApOwotCi0gICAgICBpZiAoIG1pZC0+dW5pY29kZSA9PSB1bmljb2RlICkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gbWlkOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgYmFzZV9nbHlwaCA9IEJBU0VfR0xZUEgoIG1pZC0+dW5pY29kZSApOwotCi0gICAgICBpZiAoIGJhc2VfZ2x5cGggPT0gdW5pY29kZSApCi0gICAgICAgIHJlc3VsdCA9IG1pZDsgLyogcmVtZW1iZXIgbWF0Y2ggYnV0IGNvbnRpbnVlIHNlYXJjaCBmb3IgYmFzZSBnbHlwaCAqLwotCi0gICAgICBpZiAoIG1pbiA9PSBtYXggKQotICAgICAgICBicmVhazsKLQotICAgICAgaWYgKCBiYXNlX2dseXBoIDwgdW5pY29kZSApCi0gICAgICAgIG1pbiA9IG1pZCArIDE7Ci0gICAgICBlbHNlCi0gICAgICAgIG1heCA9IG1pZCAtIDE7Ci0gICAgfQotCi0gICAgaWYgKCByZXN1bHQgKQotICAgICAgcmV0dXJuIHJlc3VsdC0+Z2x5cGhfaW5kZXg7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9VSW50MzIKLSAgcHNfdW5pY29kZXNfY2hhcl9uZXh0KCBQU19Vbmljb2RlcyAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAgKnVuaWNvZGUgKQotICB7Ci0gICAgRlRfVUludCAgICByZXN1bHQgICAgPSAwOwotICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlID0gKnVuaWNvZGUgKyAxOwotCi0KLSAgICB7Ci0gICAgICBGVF9VSW50ICAgICBtaW4gPSAwOwotICAgICAgRlRfVUludCAgICAgbWF4ID0gdGFibGUtPm51bV9tYXBzOwotICAgICAgRlRfVUludCAgICAgbWlkOwotICAgICAgUFNfVW5pTWFwKiAgbWFwOwotICAgICAgRlRfVUludDMyICAgYmFzZV9nbHlwaDsKLQotCi0gICAgICB3aGlsZSAoIG1pbiA8IG1heCApCi0gICAgICB7Ci0gICAgICAgIG1pZCA9IG1pbiArICggKCBtYXggLSBtaW4gKSA+PiAxICk7Ci0gICAgICAgIG1hcCA9IHRhYmxlLT5tYXBzICsgbWlkOwotCi0gICAgICAgIGlmICggbWFwLT51bmljb2RlID09IGNoYXJfY29kZSApCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSBtYXAtPmdseXBoX2luZGV4OwotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotCi0gICAgICAgIGJhc2VfZ2x5cGggPSBCQVNFX0dMWVBIKCBtYXAtPnVuaWNvZGUgKTsKLQotICAgICAgICBpZiAoIGJhc2VfZ2x5cGggPT0gY2hhcl9jb2RlICkKLSAgICAgICAgICByZXN1bHQgPSBtYXAtPmdseXBoX2luZGV4OwotCi0gICAgICAgIGlmICggYmFzZV9nbHlwaCA8IGNoYXJfY29kZSApCi0gICAgICAgICAgbWluID0gbWlkICsgMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIG1heCA9IG1pZDsKLSAgICAgIH0KLQotICAgICAgaWYgKCByZXN1bHQgKQotICAgICAgICBnb3RvIEV4aXQ7ICAgICAgICAgICAgICAgLyogd2UgaGF2ZSBhIHZhcmlhbnQgZ2x5cGggKi8KLQotICAgICAgLyogd2UgZGlkbid0IGZpbmQgaXQ7IGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhIG1hcCBqdXN0IGFib3ZlIGl0ICovCi0gICAgICBjaGFyX2NvZGUgPSAwOwotCi0gICAgICBpZiAoIG1pbiA8IHRhYmxlLT5udW1fbWFwcyApCi0gICAgICB7Ci0gICAgICAgIG1hcCAgICAgICA9IHRhYmxlLT5tYXBzICsgbWluOwotICAgICAgICByZXN1bHQgICAgPSBtYXAtPmdseXBoX2luZGV4OwotICAgICAgICBjaGFyX2NvZGUgPSBCQVNFX0dMWVBIKCBtYXAtPnVuaWNvZGUgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICAqdW5pY29kZSA9IGNoYXJfY29kZTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fQURPQkVfR0xZUEhfTElTVCAqLwotCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIqCi0gIHBzX2dldF9tYWNpbnRvc2hfbmFtZSggRlRfVUludCAgbmFtZV9pbmRleCApCi0gIHsKLSAgICBpZiAoIG5hbWVfaW5kZXggPj0gRlRfTlVNX01BQ19OQU1FUyApCi0gICAgICBuYW1lX2luZGV4ID0gMDsKLQotICAgIHJldHVybiBmdF9zdGFuZGFyZF9nbHlwaF9uYW1lcyArIGZ0X21hY19uYW1lc1tuYW1lX2luZGV4XTsKLSAgfQotCi0KLSAgc3RhdGljIGNvbnN0IGNoYXIqCi0gIHBzX2dldF9zdGFuZGFyZF9zdHJpbmdzKCBGVF9VSW50ICBzaWQgKQotICB7Ci0gICAgaWYgKCBzaWQgPj0gRlRfTlVNX1NJRF9OQU1FUyApCi0gICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiBmdF9zdGFuZGFyZF9nbHlwaF9uYW1lcyArIGZ0X3NpZF9uYW1lc1tzaWRdOwotICB9Ci0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fQURPQkVfR0xZUEhfTElTVAotCi0gIEZUX0RFRklORV9TRVJWSUNFX1BTQ01BUFNSRUMoCi0gICAgcHNjbWFwc19pbnRlcmZhY2UsCi0gICAgKFBTX1VuaWNvZGVfVmFsdWVGdW5jKSAgICAgcHNfdW5pY29kZV92YWx1ZSwKLSAgICAoUFNfVW5pY29kZXNfSW5pdEZ1bmMpICAgICBwc191bmljb2Rlc19pbml0LAotICAgIChQU19Vbmljb2Rlc19DaGFySW5kZXhGdW5jKXBzX3VuaWNvZGVzX2NoYXJfaW5kZXgsCi0gICAgKFBTX1VuaWNvZGVzX0NoYXJOZXh0RnVuYykgcHNfdW5pY29kZXNfY2hhcl9uZXh0LAotCi0gICAgKFBTX01hY2ludG9zaF9OYW1lRnVuYykgICAgcHNfZ2V0X21hY2ludG9zaF9uYW1lLAotICAgIChQU19BZG9iZV9TdGRfU3RyaW5nc0Z1bmMpIHBzX2dldF9zdGFuZGFyZF9zdHJpbmdzLAotCi0gICAgdDFfc3RhbmRhcmRfZW5jb2RpbmcsCi0gICAgdDFfZXhwZXJ0X2VuY29kaW5nICkKLQotI2Vsc2UKLQotICBGVF9ERUZJTkVfU0VSVklDRV9QU0NNQVBTUkVDKAotICAgIHBzY21hcHNfaW50ZXJmYWNlLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0KLSAgICAoUFNfTWFjaW50b3NoX05hbWVGdW5jKSAgICBwc19nZXRfbWFjaW50b3NoX25hbWUsCi0gICAgKFBTX0Fkb2JlX1N0ZF9TdHJpbmdzRnVuYykgcHNfZ2V0X3N0YW5kYXJkX3N0cmluZ3MsCi0KLSAgICB0MV9zdGFuZGFyZF9lbmNvZGluZywKLSAgICB0MV9leHBlcnRfZW5jb2RpbmcgKQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9BRE9CRV9HTFlQSF9MSVNUICovCi0KLQotICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUMxKAotICAgIHBzY21hcHNfc2VydmljZXMsCi0gICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0NNQVBTLCAmUFNDTUFQU19JTlRFUkZBQ0VfR0VUICkKLQotCi0gIHN0YXRpYyBGVF9Qb2ludGVyCi0gIHBzbmFtZXNfZ2V0X3NlcnZpY2UoIEZUX01vZHVsZSAgICBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBzZXJ2aWNlX2lkICkKLSAgewotICAgIC8qIFBTQ01BUFNfU0VSVklDRVNfR0VUIGRlcmVmZXJlbmNlcyBgbGlicmFyeScgaW4gUElDIG1vZGUgKi8KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotICAgIEZUX0xpYnJhcnkgIGxpYnJhcnk7Ci0KLQotICAgIGlmICggIW1vZHVsZSApCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICBsaWJyYXJ5ID0gbW9kdWxlLT5saWJyYXJ5OwotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0jZWxzZQotICAgIEZUX1VOVVNFRCggbW9kdWxlICk7Ci0jZW5kaWYKLQotICAgIHJldHVybiBmdF9zZXJ2aWNlX2xpc3RfbG9va3VwKCBQU0NNQVBTX1NFUlZJQ0VTX0dFVCwgc2VydmljZV9pZCApOwotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgKi8KLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotI2RlZmluZSBQVVRfUFNfTkFNRVNfU0VSVklDRSggYSApICBOVUxMCi0jZWxzZQotI2RlZmluZSBQVVRfUFNfTkFNRVNfU0VSVklDRSggYSApICBhCi0jZW5kaWYKLQotICBGVF9ERUZJTkVfTU9EVUxFKAotICAgIHBzbmFtZXNfbW9kdWxlX2NsYXNzLAotCi0gICAgMCwgIC8qIHRoaXMgaXMgbm90IGEgZm9udCBkcml2ZXIsIG5vciBhIHJlbmRlcmVyICovCi0gICAgc2l6ZW9mICggRlRfTW9kdWxlUmVjICksCi0KLSAgICAicHNuYW1lcyIsICAvKiBkcml2ZXIgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4MTAwMDBMLCAgIC8qIGRyaXZlciB2ZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgyMDAwMEwsICAgLyogZHJpdmVyIHJlcXVpcmVzIEZyZWVUeXBlIDIgb3IgYWJvdmUgKi8KLQotICAgIFBVVF9QU19OQU1FU19TRVJWSUNFKAotICAgICAgKHZvaWQqKSZQU0NNQVBTX0lOVEVSRkFDRV9HRVQgKSwgICAvKiBtb2R1bGUgc3BlY2lmaWMgaW50ZXJmYWNlICovCi0gICAgKEZUX01vZHVsZV9Db25zdHJ1Y3RvcilOVUxMLAotICAgIChGVF9Nb2R1bGVfRGVzdHJ1Y3RvcikgTlVMTCwKLSAgICAoRlRfTW9kdWxlX1JlcXVlc3RlcikgIFBVVF9QU19OQU1FU19TRVJWSUNFKCBwc25hbWVzX2dldF9zZXJ2aWNlICkgKQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzbmFtZXMvcHNtb2R1bGUuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc25hbWVzL3BzbW9kdWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NWYzMjIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzbmFtZXMvcHNtb2R1bGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzbW9kdWxlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBIaWdoLWxldmVsIFBTTmFtZXMgbW9kdWxlIGludGVyZmFjZSAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1BTTU9EVUxFX0hfXwotI2RlZmluZSBfX1BTTU9EVUxFX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfTU9EVUxFX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0RFQ0xBUkVfTU9EVUxFKCBwc25hbWVzX21vZHVsZV9jbGFzcyApCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19QU01PRFVMRV9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc25hbWVzL3BzbmFtZXJyLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNuYW1lcy9wc25hbWVyci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWNjMjQ3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc25hbWVzL3BzbmFtZXJyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc25hbWVyci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUFMgbmFtZXMgbW9kdWxlIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDEtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBkZWZpbmUgdGhlIFBTIG5hbWVzIG1vZHVsZSBlcnJvciBlbnVtZXJhdGlvbiAgICAgKi8KLSAgLyogY29uc3RhbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1BTTkFNRVJSX0hfXwotI2RlZmluZSBfX1BTTkFNRVJSX0hfXwotCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKLQotI3VuZGVmIF9fRlRFUlJPUlNfSF9fCi0KLSN1bmRlZiAgRlRfRVJSX1BSRUZJWAotI2RlZmluZSBGVF9FUlJfUFJFRklYICBQU25hbWVzX0Vycl8KLSNkZWZpbmUgRlRfRVJSX0JBU0UgICAgRlRfTW9kX0Vycl9QU25hbWVzCi0KLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0KLSNlbmRpZiAvKiBfX1BTTkFNRVJSX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzbmFtZXMvcHNuYW1lcy5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzbmFtZXMvcHNuYW1lcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDM4NTk2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc25hbWVzL3BzbmFtZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBzbmFtZXMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBQU05hbWVzIG1vZHVsZSBjb21wb25lbnQgKGJvZHkgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgInBzcGljLmMiCi0jaW5jbHVkZSAicHNtb2R1bGUuYyIKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc25hbWVzL3BzcGljLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNuYW1lcy9wc3BpYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzk0Zjk3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc25hbWVzL3BzcGljLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwc3BpYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIHBzbmFtZXMgbW9kdWxlLiAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfRlJFRVRZUEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSAicHNwaWMuaCIKLSNpbmNsdWRlICJwc25hbWVyci5oIgotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0gIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgUElDIGluaXQgZnVuY3Rpb25zIGZyb20gcHNtb2R1bGUuYyAqLwotICBGVF9FcnJvcgotICBGVF9DcmVhdGVfQ2xhc3NfcHNjbWFwc19zZXJ2aWNlcyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiogIG91dHB1dF9jbGFzcyApOwotICB2b2lkCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfcHNjbWFwc19zZXJ2aWNlcyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogKTsKLQotICB2b2lkCi0gIEZUX0luaXRfQ2xhc3NfcHNjbWFwc19pbnRlcmZhY2UoIEZUX0xpYnJhcnkgICAgICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VfUHNDTWFwc1JlYyogIGNsYXp6ICk7Ci0KLQotICB2b2lkCi0gIHBzbmFtZXNfbW9kdWxlX2NsYXNzX3BpY19mcmVlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeSAgICAgICAgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLQotICAgIGlmICggcGljX2NvbnRhaW5lci0+cHNuYW1lcyApCi0gICAgewotICAgICAgUFNNb2R1bGVQSUMqICBjb250YWluZXIgPSAoUFNNb2R1bGVQSUMqKXBpY19jb250YWluZXItPnBzbmFtZXM7Ci0KLQotICAgICAgaWYgKCBjb250YWluZXItPnBzY21hcHNfc2VydmljZXMgKQotICAgICAgICBGVF9EZXN0cm95X0NsYXNzX3BzY21hcHNfc2VydmljZXMoIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLT5wc2NtYXBzX3NlcnZpY2VzICk7Ci0gICAgICBjb250YWluZXItPnBzY21hcHNfc2VydmljZXMgPSBOVUxMOwotICAgICAgRlRfRlJFRSggY29udGFpbmVyICk7Ci0gICAgICBwaWNfY29udGFpbmVyLT5wc25hbWVzID0gTlVMTDsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0Vycm9yCi0gIHBzbmFtZXNfbW9kdWxlX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yICAgICAgICAgPSBGVF9FcnJfT2s7Ci0gICAgUFNNb2R1bGVQSUMqICAgICAgIGNvbnRhaW5lciAgICAgPSBOVUxMOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICAvKiBhbGxvY2F0ZSBwb2ludGVyLCBjbGVhciBhbmQgc2V0IGdsb2JhbCBjb250YWluZXIgcG9pbnRlciAqLwotICAgIGlmICggRlRfQUxMT0MoIGNvbnRhaW5lciwgc2l6ZW9mICggKmNvbnRhaW5lciApICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIEZUX01FTV9TRVQoIGNvbnRhaW5lciwgMCwgc2l6ZW9mICggKmNvbnRhaW5lciApICk7Ci0gICAgcGljX2NvbnRhaW5lci0+cHNuYW1lcyA9IGNvbnRhaW5lcjsKLQotICAgIC8qIGluaXRpYWxpemUgcG9pbnRlciB0YWJsZSAtICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIHRoaXMgaXMgaG93IHRoZSBtb2R1bGUgdXN1YWxseSBleHBlY3RzIHRoaXMgZGF0YSAqLwotICAgIGVycm9yID0gRlRfQ3JlYXRlX0NsYXNzX3BzY21hcHNfc2VydmljZXMoCi0gICAgICAgICAgICAgIGxpYnJhcnksICZjb250YWluZXItPnBzY21hcHNfc2VydmljZXMgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLSAgICBGVF9Jbml0X0NsYXNzX3BzY21hcHNfaW50ZXJmYWNlKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZXItPnBzY21hcHNfaW50ZXJmYWNlICk7Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHBzbmFtZXNfbW9kdWxlX2NsYXNzX3BpY19mcmVlKCBsaWJyYXJ5ICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNuYW1lcy9wc3BpYy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzbmFtZXMvcHNwaWMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQzMjI1YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcHNuYW1lcy9wc3BpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHNwaWMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHNlcnZpY2VzIGZvciBwc25hbWVzIG1vZHVsZS4gICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fUFNQSUNfSF9fCi0jZGVmaW5lIF9fUFNQSUNfSF9fCi0KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfUElDX0gKLQotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSNkZWZpbmUgUFNDTUFQU19TRVJWSUNFU19HRVQgICBwc2NtYXBzX3NlcnZpY2VzCi0jZGVmaW5lIFBTQ01BUFNfSU5URVJGQUNFX0dFVCAgcHNjbWFwc19pbnRlcmZhY2UKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX0NNQVBTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICB0eXBlZGVmIHN0cnVjdCAgUFNNb2R1bGVQSUNfCi0gIHsKLSAgICBGVF9TZXJ2aWNlRGVzY1JlYyogICAgIHBzY21hcHNfc2VydmljZXM7Ci0gICAgRlRfU2VydmljZV9Qc0NNYXBzUmVjICBwc2NtYXBzX2ludGVyZmFjZTsKLQotICB9IFBTTW9kdWxlUElDOwotCi0KLSNkZWZpbmUgR0VUX1BJQyggbGliICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKFBTTW9kdWxlUElDKikoKGxpYiktPnBpY19jb250YWluZXIucHNuYW1lcykgKQotI2RlZmluZSBQU0NNQVBTX1NFUlZJQ0VTX0dFVCAgICggR0VUX1BJQyggbGlicmFyeSApLT5wc2NtYXBzX3NlcnZpY2VzICkKLSNkZWZpbmUgUFNDTUFQU19JTlRFUkZBQ0VfR0VUICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+cHNjbWFwc19pbnRlcmZhY2UgKQotCi0KLSAgLyogc2VlIHBzcGljLmMgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiAqLwotICB2b2lkCi0gIHBzbmFtZXNfbW9kdWxlX2NsYXNzX3BpY19mcmVlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLSAgRlRfRXJyb3IKLSAgcHNuYW1lc19tb2R1bGVfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotIC8qICovCi0KLSNlbmRpZiAvKiBfX1BTUElDX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzbmFtZXMvcHN0YWJsZXMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9wc25hbWVzL3BzdGFibGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMzFjMzEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3BzbmFtZXMvcHN0YWJsZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcHN0YWJsZXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFBvc3RTY3JpcHQgZ2x5cGggbmFtZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIFRoaXMgZmlsZSBoYXMgYmVlbiBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSAtLSBkbyBub3QgZWRpdCEgKi8KLQotCi0gIHN0YXRpYyBjb25zdCBjaGFyICBmdF9zdGFuZGFyZF9nbHlwaF9uYW1lc1szNjk2XSA9Ci0gIHsKLSAgICAnLicsJ24nLCd1JywnbCcsJ2wnLCAwLAotICAgICduJywnbycsJ24nLCdtJywnYScsJ3InLCdrJywnaScsJ24nLCdnJywncicsJ2UnLCd0JywndScsJ3InLCduJywgMCwKLSAgICAnbicsJ28nLCd0JywnZScsJ3EnLCd1JywnYScsJ2wnLCAwLAotICAgICdpJywnbicsJ2YnLCdpJywnbicsJ2knLCd0JywneScsIDAsCi0gICAgJ2wnLCdlJywncycsJ3MnLCdlJywncScsJ3UnLCdhJywnbCcsIDAsCi0gICAgJ2cnLCdyJywnZScsJ2EnLCd0JywnZScsJ3InLCdlJywncScsJ3UnLCdhJywnbCcsIDAsCi0gICAgJ3AnLCdhJywncicsJ3QnLCdpJywnYScsJ2wnLCdkJywnaScsJ2YnLCdmJywgMCwKLSAgICAncycsJ3UnLCdtJywnbScsJ2EnLCd0JywnaScsJ28nLCduJywgMCwKLSAgICAncCcsJ3InLCdvJywnZCcsJ3UnLCdjJywndCcsIDAsCi0gICAgJ3AnLCdpJywgMCwKLSAgICAnaScsJ24nLCd0JywnZScsJ2cnLCdyJywnYScsJ2wnLCAwLAotICAgICdPJywnbScsJ2UnLCdnJywnYScsIDAsCi0gICAgJ3InLCdhJywnZCcsJ2knLCdjJywnYScsJ2wnLCAwLAotICAgICdhJywncCcsJ3AnLCdyJywnbycsJ3gnLCdlJywncScsJ3UnLCdhJywnbCcsIDAsCi0gICAgJ0QnLCdlJywnbCcsJ3QnLCdhJywgMCwKLSAgICAnbicsJ28nLCduJywnYicsJ3InLCdlJywnYScsJ2snLCdpJywnbicsJ2cnLCdzJywncCcsJ2EnLCdjJywnZScsIDAsCi0gICAgJ2wnLCdvJywneicsJ2UnLCduJywnZycsJ2UnLCAwLAotICAgICdhJywncCcsJ3AnLCdsJywnZScsIDAsCi0gICAgJ2YnLCdyJywnYScsJ24nLCdjJywgMCwKLSAgICAnRycsJ2InLCdyJywnZScsJ3YnLCdlJywgMCwKLSAgICAnZycsJ2InLCdyJywnZScsJ3YnLCdlJywgMCwKLSAgICAnSScsJ2QnLCdvJywndCcsJ2EnLCdjJywnYycsJ2UnLCduJywndCcsIDAsCi0gICAgJ1MnLCdjJywnZScsJ2QnLCdpJywnbCcsJ2wnLCdhJywgMCwKLSAgICAncycsJ2MnLCdlJywnZCcsJ2knLCdsJywnbCcsJ2EnLCAwLAotICAgICdDJywnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAotICAgICdjJywnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAotICAgICdDJywnYycsJ2EnLCdyJywnbycsJ24nLCAwLAotICAgICdjJywnYycsJ2EnLCdyJywnbycsJ24nLCAwLAotICAgICdkJywnYycsJ3InLCdvJywnYScsJ3QnLCAwLAotICAgICcuJywnbicsJ28nLCd0JywnZCcsJ2UnLCdmJywgMCwKLSAgICAncycsJ3AnLCdhJywnYycsJ2UnLCAwLAotICAgICdlJywneCcsJ2MnLCdsJywnYScsJ20nLCAwLAotICAgICdxJywndScsJ28nLCd0JywnZScsJ2QnLCdiJywnbCcsIDAsCi0gICAgJ24nLCd1JywnbScsJ2InLCdlJywncicsJ3MnLCdpJywnZycsJ24nLCAwLAotICAgICdkJywnbycsJ2wnLCdsJywnYScsJ3InLCAwLAotICAgICdwJywnZScsJ3InLCdjJywnZScsJ24nLCd0JywgMCwKLSAgICAnYScsJ20nLCdwJywnZScsJ3InLCdzJywnYScsJ24nLCdkJywgMCwKLSAgICAncScsJ3UnLCdvJywndCcsJ2UnLCdyJywnaScsJ2cnLCdoJywndCcsIDAsCi0gICAgJ3AnLCdhJywncicsJ2UnLCduJywnbCcsJ2UnLCdmJywndCcsIDAsCi0gICAgJ3AnLCdhJywncicsJ2UnLCduJywncicsJ2knLCdnJywnaCcsJ3QnLCAwLAotICAgICdhJywncycsJ3QnLCdlJywncicsJ2knLCdzJywnaycsIDAsCi0gICAgJ3AnLCdsJywndScsJ3MnLCAwLAotICAgICdjJywnbycsJ20nLCdtJywnYScsIDAsCi0gICAgJ2gnLCd5JywncCcsJ2gnLCdlJywnbicsIDAsCi0gICAgJ3AnLCdlJywncicsJ2knLCdvJywnZCcsIDAsCi0gICAgJ3MnLCdsJywnYScsJ3MnLCdoJywgMCwKLSAgICAneicsJ2UnLCdyJywnbycsIDAsCi0gICAgJ28nLCduJywnZScsIDAsCi0gICAgJ3QnLCd3JywnbycsIDAsCi0gICAgJ3QnLCdoJywncicsJ2UnLCdlJywgMCwKLSAgICAnZicsJ28nLCd1JywncicsIDAsCi0gICAgJ2YnLCdpJywndicsJ2UnLCAwLAotICAgICdzJywnaScsJ3gnLCAwLAotICAgICdzJywnZScsJ3YnLCdlJywnbicsIDAsCi0gICAgJ2UnLCdpJywnZycsJ2gnLCd0JywgMCwKLSAgICAnbicsJ2knLCduJywnZScsIDAsCi0gICAgJ2MnLCdvJywnbCcsJ28nLCduJywgMCwKLSAgICAncycsJ2UnLCdtJywnaScsJ2MnLCdvJywnbCcsJ28nLCduJywgMCwKLSAgICAnbCcsJ2UnLCdzJywncycsIDAsCi0gICAgJ2UnLCdxJywndScsJ2EnLCdsJywgMCwKLSAgICAnZycsJ3InLCdlJywnYScsJ3QnLCdlJywncicsIDAsCi0gICAgJ3EnLCd1JywnZScsJ3MnLCd0JywnaScsJ28nLCduJywgMCwKLSAgICAnYScsJ3QnLCAwLAotICAgICdBJywgMCwKLSAgICAnQicsIDAsCi0gICAgJ0MnLCAwLAotICAgICdEJywgMCwKLSAgICAnRScsIDAsCi0gICAgJ0YnLCAwLAotICAgICdHJywgMCwKLSAgICAnSCcsIDAsCi0gICAgJ0knLCAwLAotICAgICdKJywgMCwKLSAgICAnSycsIDAsCi0gICAgJ0wnLCAwLAotICAgICdNJywgMCwKLSAgICAnTicsIDAsCi0gICAgJ08nLCAwLAotICAgICdQJywgMCwKLSAgICAnUScsIDAsCi0gICAgJ1InLCAwLAotICAgICdTJywgMCwKLSAgICAnVCcsIDAsCi0gICAgJ1UnLCAwLAotICAgICdWJywgMCwKLSAgICAnVycsIDAsCi0gICAgJ1gnLCAwLAotICAgICdZJywgMCwKLSAgICAnWicsIDAsCi0gICAgJ2InLCdyJywnYScsJ2MnLCdrJywnZScsJ3QnLCdsJywnZScsJ2YnLCd0JywgMCwKLSAgICAnYicsJ2EnLCdjJywnaycsJ3MnLCdsJywnYScsJ3MnLCdoJywgMCwKLSAgICAnYicsJ3InLCdhJywnYycsJ2snLCdlJywndCcsJ3InLCdpJywnZycsJ2gnLCd0JywgMCwKLSAgICAnYScsJ3MnLCdjJywnaScsJ2knLCdjJywnaScsJ3InLCdjJywndScsJ20nLCAwLAotICAgICd1JywnbicsJ2QnLCdlJywncicsJ3MnLCdjJywnbycsJ3InLCdlJywgMCwKLSAgICAncScsJ3UnLCdvJywndCcsJ2UnLCdsJywnZScsJ2YnLCd0JywgMCwKLSAgICAnYScsIDAsCi0gICAgJ2InLCAwLAotICAgICdjJywgMCwKLSAgICAnZCcsIDAsCi0gICAgJ2UnLCAwLAotICAgICdmJywgMCwKLSAgICAnZycsIDAsCi0gICAgJ2gnLCAwLAotICAgICdpJywgMCwKLSAgICAnaicsIDAsCi0gICAgJ2snLCAwLAotICAgICdsJywgMCwKLSAgICAnbScsIDAsCi0gICAgJ24nLCAwLAotICAgICdvJywgMCwKLSAgICAncCcsIDAsCi0gICAgJ3EnLCAwLAotICAgICdyJywgMCwKLSAgICAncycsIDAsCi0gICAgJ3QnLCAwLAotICAgICd1JywgMCwKLSAgICAndicsIDAsCi0gICAgJ3cnLCAwLAotICAgICd4JywgMCwKLSAgICAneScsIDAsCi0gICAgJ3onLCAwLAotICAgICdiJywncicsJ2EnLCdjJywnZScsJ2wnLCdlJywnZicsJ3QnLCAwLAotICAgICdiJywnYScsJ3InLCAwLAotICAgICdiJywncicsJ2EnLCdjJywnZScsJ3InLCdpJywnZycsJ2gnLCd0JywgMCwKLSAgICAnYScsJ3MnLCdjJywnaScsJ2knLCd0JywnaScsJ2wnLCdkJywnZScsIDAsCi0gICAgJ2UnLCd4JywnYycsJ2wnLCdhJywnbScsJ2QnLCdvJywndycsJ24nLCAwLAotICAgICdjJywnZScsJ24nLCd0JywgMCwKLSAgICAncycsJ3QnLCdlJywncicsJ2wnLCdpJywnbicsJ2cnLCAwLAotICAgICdmJywncicsJ2EnLCdjJywndCcsJ2knLCdvJywnbicsIDAsCi0gICAgJ3knLCdlJywnbicsIDAsCi0gICAgJ2YnLCdsJywnbycsJ3InLCdpJywnbicsIDAsCi0gICAgJ3MnLCdlJywnYycsJ3QnLCdpJywnbycsJ24nLCAwLAotICAgICdjJywndScsJ3InLCdyJywnZScsJ24nLCdjJywneScsIDAsCi0gICAgJ3EnLCd1JywnbycsJ3QnLCdlJywncycsJ2knLCduJywnZycsJ2wnLCdlJywgMCwKLSAgICAncScsJ3UnLCdvJywndCcsJ2UnLCdkJywnYicsJ2wnLCdsJywnZScsJ2YnLCd0JywgMCwKLSAgICAnZycsJ3UnLCdpJywnbCcsJ2wnLCdlJywnbScsJ28nLCd0JywnbCcsJ2UnLCdmJywndCcsIDAsCi0gICAgJ2cnLCd1JywnaScsJ2wnLCdzJywnaScsJ24nLCdnJywnbCcsJ2wnLCdlJywnZicsJ3QnLCAwLAotICAgICdnJywndScsJ2knLCdsJywncycsJ2knLCduJywnZycsJ2wnLCdyJywnaScsJ2cnLCdoJywndCcsIDAsCi0gICAgJ2YnLCdpJywgMCwKLSAgICAnZicsJ2wnLCAwLAotICAgICdlJywnbicsJ2QnLCdhJywncycsJ2gnLCAwLAotICAgICdkJywnYScsJ2cnLCdnJywnZScsJ3InLCAwLAotICAgICdkJywnYScsJ2cnLCdnJywnZScsJ3InLCdkJywnYicsJ2wnLCAwLAotICAgICdwJywnZScsJ3InLCdpJywnbycsJ2QnLCdjJywnZScsJ24nLCd0JywnZScsJ3InLCdlJywnZCcsIDAsCi0gICAgJ3AnLCdhJywncicsJ2EnLCdnJywncicsJ2EnLCdwJywnaCcsIDAsCi0gICAgJ2InLCd1JywnbCcsJ2wnLCdlJywndCcsIDAsCi0gICAgJ3EnLCd1JywnbycsJ3QnLCdlJywncycsJ2knLCduJywnZycsJ2wnLCdiJywnYScsJ3MnLCdlJywgMCwKLSAgICAncScsJ3UnLCdvJywndCcsJ2UnLCdkJywnYicsJ2wnLCdiJywnYScsJ3MnLCdlJywgMCwKLSAgICAncScsJ3UnLCdvJywndCcsJ2UnLCdkJywnYicsJ2wnLCdyJywnaScsJ2cnLCdoJywndCcsIDAsCi0gICAgJ2cnLCd1JywnaScsJ2wnLCdsJywnZScsJ20nLCdvJywndCcsJ3InLCdpJywnZycsJ2gnLCd0JywgMCwKLSAgICAnZScsJ2wnLCdsJywnaScsJ3AnLCdzJywnaScsJ3MnLCAwLAotICAgICdwJywnZScsJ3InLCd0JywnaCcsJ28nLCd1JywncycsJ2EnLCduJywnZCcsIDAsCi0gICAgJ3EnLCd1JywnZScsJ3MnLCd0JywnaScsJ28nLCduJywnZCcsJ28nLCd3JywnbicsIDAsCi0gICAgJ2cnLCdyJywnYScsJ3YnLCdlJywgMCwKLSAgICAnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAotICAgICdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywgMCwKLSAgICAndCcsJ2knLCdsJywnZCcsJ2UnLCAwLAotICAgICdtJywnYScsJ2MnLCdyJywnbycsJ24nLCAwLAotICAgICdiJywncicsJ2UnLCd2JywnZScsIDAsCi0gICAgJ2QnLCdvJywndCcsJ2EnLCdjJywnYycsJ2UnLCduJywndCcsIDAsCi0gICAgJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKLSAgICAncicsJ2knLCduJywnZycsIDAsCi0gICAgJ2MnLCdlJywnZCcsJ2knLCdsJywnbCcsJ2EnLCAwLAotICAgICdoJywndScsJ24nLCdnJywnYScsJ3InLCd1JywnbScsJ2wnLCdhJywndScsJ3QnLCAwLAotICAgICdvJywnZycsJ28nLCduJywnZScsJ2snLCAwLAotICAgICdjJywnYScsJ3InLCdvJywnbicsIDAsCi0gICAgJ2UnLCdtJywnZCcsJ2EnLCdzJywnaCcsIDAsCi0gICAgJ0EnLCdFJywgMCwKLSAgICAnbycsJ3InLCdkJywnZicsJ2UnLCdtJywnaScsJ24nLCdpJywnbicsJ2UnLCAwLAotICAgICdMJywncycsJ2wnLCdhJywncycsJ2gnLCAwLAotICAgICdPJywncycsJ2wnLCdhJywncycsJ2gnLCAwLAotICAgICdPJywnRScsIDAsCi0gICAgJ28nLCdyJywnZCcsJ20nLCdhJywncycsJ2MnLCd1JywnbCcsJ2knLCduJywnZScsIDAsCi0gICAgJ2EnLCdlJywgMCwKLSAgICAnZCcsJ28nLCd0JywnbCcsJ2UnLCdzJywncycsJ2knLCAwLAotICAgICdsJywncycsJ2wnLCdhJywncycsJ2gnLCAwLAotICAgICdvJywncycsJ2wnLCdhJywncycsJ2gnLCAwLAotICAgICdvJywnZScsIDAsCi0gICAgJ2cnLCdlJywncicsJ20nLCdhJywnbicsJ2QnLCdiJywnbCcsJ3MnLCAwLAotICAgICdvJywnbicsJ2UnLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ2wnLCdvJywnZycsJ2knLCdjJywnYScsJ2wnLCduJywnbycsJ3QnLCAwLAotICAgICdtJywndScsIDAsCi0gICAgJ3QnLCdyJywnYScsJ2QnLCdlJywnbScsJ2EnLCdyJywnaycsIDAsCi0gICAgJ0UnLCd0JywnaCcsIDAsCi0gICAgJ28nLCduJywnZScsJ2gnLCdhJywnbCcsJ2YnLCAwLAotICAgICdwJywnbCcsJ3UnLCdzJywnbScsJ2knLCduJywndScsJ3MnLCAwLAotICAgICdUJywnaCcsJ28nLCdyJywnbicsIDAsCi0gICAgJ28nLCduJywnZScsJ3EnLCd1JywnYScsJ3InLCd0JywnZScsJ3InLCAwLAotICAgICdkJywnaScsJ3YnLCdpJywnZCcsJ2UnLCAwLAotICAgICdiJywncicsJ28nLCdrJywnZScsJ24nLCdiJywnYScsJ3InLCAwLAotICAgICdkJywnZScsJ2cnLCdyJywnZScsJ2UnLCAwLAotICAgICd0JywnaCcsJ28nLCdyJywnbicsIDAsCi0gICAgJ3QnLCdoJywncicsJ2UnLCdlJywncScsJ3UnLCdhJywncicsJ3QnLCdlJywncicsJ3MnLCAwLAotICAgICd0JywndycsJ28nLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ3InLCdlJywnZycsJ2knLCdzJywndCcsJ2UnLCdyJywnZScsJ2QnLCAwLAotICAgICdtJywnaScsJ24nLCd1JywncycsIDAsCi0gICAgJ2UnLCd0JywnaCcsIDAsCi0gICAgJ20nLCd1JywnbCcsJ3QnLCdpJywncCcsJ2wnLCd5JywgMCwKLSAgICAndCcsJ2gnLCdyJywnZScsJ2UnLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ2MnLCdvJywncCcsJ3knLCdyJywnaScsJ2cnLCdoJywndCcsIDAsCi0gICAgJ0EnLCdhJywnYycsJ3UnLCd0JywnZScsIDAsCi0gICAgJ0EnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywgMCwKLSAgICAnQScsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKLSAgICAnQScsJ2cnLCdyJywnYScsJ3YnLCdlJywgMCwKLSAgICAnQScsJ3InLCdpJywnbicsJ2cnLCAwLAotICAgICdBJywndCcsJ2knLCdsJywnZCcsJ2UnLCAwLAotICAgICdDJywnYycsJ2UnLCdkJywnaScsJ2wnLCdsJywnYScsIDAsCi0gICAgJ0UnLCdhJywnYycsJ3UnLCd0JywnZScsIDAsCi0gICAgJ0UnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywgMCwKLSAgICAnRScsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKLSAgICAnRScsJ2cnLCdyJywnYScsJ3YnLCdlJywgMCwKLSAgICAnSScsJ2EnLCdjJywndScsJ3QnLCdlJywgMCwKLSAgICAnSScsJ2MnLCdpJywncicsJ2MnLCd1JywnbScsJ2YnLCdsJywnZScsJ3gnLCAwLAotICAgICdJJywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCAwLAotICAgICdJJywnZycsJ3InLCdhJywndicsJ2UnLCAwLAotICAgICdOJywndCcsJ2knLCdsJywnZCcsJ2UnLCAwLAotICAgICdPJywnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAotICAgICdPJywnYycsJ2knLCdyJywnYycsJ3UnLCdtJywnZicsJ2wnLCdlJywneCcsIDAsCi0gICAgJ08nLCdkJywnaScsJ2UnLCdyJywnZScsJ3MnLCdpJywncycsIDAsCi0gICAgJ08nLCdnJywncicsJ2EnLCd2JywnZScsIDAsCi0gICAgJ08nLCd0JywnaScsJ2wnLCdkJywnZScsIDAsCi0gICAgJ1MnLCdjJywnYScsJ3InLCdvJywnbicsIDAsCi0gICAgJ1UnLCdhJywnYycsJ3UnLCd0JywnZScsIDAsCi0gICAgJ1UnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywgMCwKLSAgICAnVScsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKLSAgICAnVScsJ2cnLCdyJywnYScsJ3YnLCdlJywgMCwKLSAgICAnWScsJ2EnLCdjJywndScsJ3QnLCdlJywgMCwKLSAgICAnWScsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKLSAgICAnWicsJ2MnLCdhJywncicsJ28nLCduJywgMCwKLSAgICAnYScsJ2EnLCdjJywndScsJ3QnLCdlJywgMCwKLSAgICAnYScsJ2MnLCdpJywncicsJ2MnLCd1JywnbScsJ2YnLCdsJywnZScsJ3gnLCAwLAotICAgICdhJywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCAwLAotICAgICdhJywnZycsJ3InLCdhJywndicsJ2UnLCAwLAotICAgICdhJywncicsJ2knLCduJywnZycsIDAsCi0gICAgJ2EnLCd0JywnaScsJ2wnLCdkJywnZScsIDAsCi0gICAgJ2MnLCdjJywnZScsJ2QnLCdpJywnbCcsJ2wnLCdhJywgMCwKLSAgICAnZScsJ2EnLCdjJywndScsJ3QnLCdlJywgMCwKLSAgICAnZScsJ2MnLCdpJywncicsJ2MnLCd1JywnbScsJ2YnLCdsJywnZScsJ3gnLCAwLAotICAgICdlJywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCAwLAotICAgICdlJywnZycsJ3InLCdhJywndicsJ2UnLCAwLAotICAgICdpJywnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAotICAgICdpJywnYycsJ2knLCdyJywnYycsJ3UnLCdtJywnZicsJ2wnLCdlJywneCcsIDAsCi0gICAgJ2knLCdkJywnaScsJ2UnLCdyJywnZScsJ3MnLCdpJywncycsIDAsCi0gICAgJ2knLCdnJywncicsJ2EnLCd2JywnZScsIDAsCi0gICAgJ24nLCd0JywnaScsJ2wnLCdkJywnZScsIDAsCi0gICAgJ28nLCdhJywnYycsJ3UnLCd0JywnZScsIDAsCi0gICAgJ28nLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywgMCwKLSAgICAnbycsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywgMCwKLSAgICAnbycsJ2cnLCdyJywnYScsJ3YnLCdlJywgMCwKLSAgICAnbycsJ3QnLCdpJywnbCcsJ2QnLCdlJywgMCwKLSAgICAncycsJ2MnLCdhJywncicsJ28nLCduJywgMCwKLSAgICAndScsJ2EnLCdjJywndScsJ3QnLCdlJywgMCwKLSAgICAndScsJ2MnLCdpJywncicsJ2MnLCd1JywnbScsJ2YnLCdsJywnZScsJ3gnLCAwLAotICAgICd1JywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCAwLAotICAgICd1JywnZycsJ3InLCdhJywndicsJ2UnLCAwLAotICAgICd5JywnYScsJ2MnLCd1JywndCcsJ2UnLCAwLAotICAgICd5JywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCAwLAotICAgICd6JywnYycsJ2EnLCdyJywnbycsJ24nLCAwLAotICAgICdlJywneCcsJ2MnLCdsJywnYScsJ20nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0gnLCd1JywnbicsJ2cnLCdhJywncicsJ3UnLCdtJywnbCcsJ2EnLCd1JywndCcsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnZCcsJ28nLCdsJywnbCcsJ2EnLCdyJywnbycsJ2wnLCdkJywncycsJ3QnLCd5JywnbCcsJ2UnLCAwLAotICAgICdkJywnbycsJ2wnLCdsJywnYScsJ3InLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ2EnLCdtJywncCcsJ2UnLCdyJywncycsJ2EnLCduJywnZCcsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnQScsJ2MnLCd1JywndCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ3AnLCdhJywncicsJ2UnLCduJywnbCcsJ2UnLCdmJywndCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAncCcsJ2EnLCdyJywnZScsJ24nLCdyJywnaScsJ2cnLCdoJywndCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAndCcsJ3cnLCdvJywnZCcsJ28nLCd0JywnZScsJ24nLCdsJywnZScsJ2EnLCdkJywnZScsJ3InLCAwLAotICAgICdvJywnbicsJ2UnLCdkJywnbycsJ3QnLCdlJywnbicsJ2wnLCdlJywnYScsJ2QnLCdlJywncicsIDAsCi0gICAgJ3onLCdlJywncicsJ28nLCdvJywnbCcsJ2QnLCdzJywndCcsJ3knLCdsJywnZScsIDAsCi0gICAgJ28nLCduJywnZScsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKLSAgICAndCcsJ3cnLCdvJywnbycsJ2wnLCdkJywncycsJ3QnLCd5JywnbCcsJ2UnLCAwLAotICAgICd0JywnaCcsJ3InLCdlJywnZScsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKLSAgICAnZicsJ28nLCd1JywncicsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKLSAgICAnZicsJ2knLCd2JywnZScsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKLSAgICAncycsJ2knLCd4JywnbycsJ2wnLCdkJywncycsJ3QnLCd5JywnbCcsJ2UnLCAwLAotICAgICdzJywnZScsJ3YnLCdlJywnbicsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKLSAgICAnZScsJ2knLCdnJywnaCcsJ3QnLCdvJywnbCcsJ2QnLCdzJywndCcsJ3knLCdsJywnZScsIDAsCi0gICAgJ24nLCdpJywnbicsJ2UnLCdvJywnbCcsJ2QnLCdzJywndCcsJ3knLCdsJywnZScsIDAsCi0gICAgJ2MnLCdvJywnbScsJ20nLCdhJywncycsJ3UnLCdwJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAotICAgICd0JywnaCcsJ3InLCdlJywnZScsJ3EnLCd1JywnYScsJ3InLCd0JywnZScsJ3InLCdzJywnZScsJ20nLCdkJywnYScsJ3MnLCdoJywgMCwKLSAgICAncCcsJ2UnLCdyJywnaScsJ28nLCdkJywncycsJ3UnLCdwJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAotICAgICdxJywndScsJ2UnLCdzJywndCcsJ2knLCdvJywnbicsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnYScsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnYicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnYycsJ2UnLCduJywndCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZScsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnaScsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnbCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnbScsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnbicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnbycsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAncicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAncycsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAndCcsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZicsJ2YnLCAwLAotICAgICdmJywnZicsJ2knLCAwLAotICAgICdmJywnZicsJ2wnLCAwLAotICAgICdwJywnYScsJ3InLCdlJywnbicsJ2wnLCdlJywnZicsJ3QnLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ3AnLCdhJywncicsJ2UnLCduJywncicsJ2knLCdnJywnaCcsJ3QnLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ0MnLCdpJywncicsJ2MnLCd1JywnbScsJ2YnLCdsJywnZScsJ3gnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ2gnLCd5JywncCcsJ2gnLCdlJywnbicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnRycsJ3InLCdhJywndicsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0EnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0InLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0MnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0QnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0YnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0cnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0gnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0knLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0onLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0snLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0wnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ00nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ04nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ08nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1AnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1EnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1InLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1MnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1QnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1YnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1cnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1gnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1knLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1onLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ2MnLCdvJywnbCcsJ28nLCduJywnbScsJ28nLCduJywnZScsJ3QnLCdhJywncicsJ3knLCAwLAotICAgICdvJywnbicsJ2UnLCdmJywnaScsJ3QnLCd0JywnZScsJ2QnLCAwLAotICAgICdyJywndScsJ3AnLCdpJywnYScsJ2gnLCAwLAotICAgICdUJywnaScsJ2wnLCdkJywnZScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnZScsJ3gnLCdjJywnbCcsJ2EnLCdtJywnZCcsJ28nLCd3JywnbicsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnYycsJ2UnLCduJywndCcsJ28nLCdsJywnZCcsJ3MnLCd0JywneScsJ2wnLCdlJywgMCwKLSAgICAnTCcsJ3MnLCdsJywnYScsJ3MnLCdoJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdTJywnYycsJ2EnLCdyJywnbycsJ24nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1onLCdjJywnYScsJ3InLCdvJywnbicsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnRCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0InLCdyJywnZScsJ3YnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdDJywnYScsJ3InLCdvJywnbicsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnRCcsJ28nLCd0JywnYScsJ2MnLCdjJywnZScsJ24nLCd0JywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdNJywnYScsJ2MnLCdyJywnbycsJ24nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ2YnLCdpJywnZycsJ3UnLCdyJywnZScsJ2QnLCdhJywncycsJ2gnLCAwLAotICAgICdoJywneScsJ3AnLCdoJywnZScsJ24nLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ08nLCdnJywnbycsJ24nLCdlJywnaycsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnUicsJ2knLCduJywnZycsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnQycsJ2UnLCdkJywnaScsJ2wnLCdsJywnYScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAncScsJ3UnLCdlJywncycsJ3QnLCdpJywnbycsJ24nLCdkJywnbycsJ3cnLCduJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdvJywnbicsJ2UnLCdlJywnaScsJ2cnLCdoJywndCcsJ2gnLCAwLAotICAgICd0JywnaCcsJ3InLCdlJywnZScsJ2UnLCdpJywnZycsJ2gnLCd0JywnaCcsJ3MnLCAwLAotICAgICdmJywnaScsJ3YnLCdlJywnZScsJ2knLCdnJywnaCcsJ3QnLCdoJywncycsIDAsCi0gICAgJ3MnLCdlJywndicsJ2UnLCduJywnZScsJ2knLCdnJywnaCcsJ3QnLCdoJywncycsIDAsCi0gICAgJ28nLCduJywnZScsJ3QnLCdoJywnaScsJ3InLCdkJywgMCwKLSAgICAndCcsJ3cnLCdvJywndCcsJ2gnLCdpJywncicsJ2QnLCdzJywgMCwKLSAgICAneicsJ2UnLCdyJywnbycsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZicsJ28nLCd1JywncicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZicsJ2knLCd2JywnZScsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAncycsJ2knLCd4JywncycsJ3UnLCdwJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAotICAgICdzJywnZScsJ3YnLCdlJywnbicsJ3MnLCd1JywncCcsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZScsJ2knLCdnJywnaCcsJ3QnLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ24nLCdpJywnbicsJ2UnLCdzJywndScsJ3AnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ3onLCdlJywncicsJ28nLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ28nLCduJywnZScsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAndCcsJ3cnLCdvJywnaScsJ24nLCdmJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAotICAgICd0JywnaCcsJ3InLCdlJywnZScsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZicsJ28nLCd1JywncicsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZicsJ2knLCd2JywnZScsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAncycsJ2knLCd4JywnaScsJ24nLCdmJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAotICAgICdzJywnZScsJ3YnLCdlJywnbicsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnZScsJ2knLCdnJywnaCcsJ3QnLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ24nLCdpJywnbicsJ2UnLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ2MnLCdlJywnbicsJ3QnLCdpJywnbicsJ2YnLCdlJywncicsJ2knLCdvJywncicsIDAsCi0gICAgJ2QnLCdvJywnbCcsJ2wnLCdhJywncicsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAncCcsJ2UnLCdyJywnaScsJ28nLCdkJywnaScsJ24nLCdmJywnZScsJ3InLCdpJywnbycsJ3InLCAwLAotICAgICdjJywnbycsJ20nLCdtJywnYScsJ2knLCduJywnZicsJ2UnLCdyJywnaScsJ28nLCdyJywgMCwKLSAgICAnQScsJ2cnLCdyJywnYScsJ3YnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdBJywnYScsJ2MnLCd1JywndCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0EnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdBJywndCcsJ2knLCdsJywnZCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0EnLCdkJywnaScsJ2UnLCdyJywnZScsJ3MnLCdpJywncycsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnQScsJ3InLCdpJywnbicsJ2cnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0EnLCdFJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdDJywnYycsJ2UnLCdkJywnaScsJ2wnLCdsJywnYScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnRScsJ2cnLCdyJywnYScsJ3YnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdFJywnYScsJ2MnLCd1JywndCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0UnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdFJywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ0knLCdnJywncicsJ2EnLCd2JywnZScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnSScsJ2EnLCdjJywndScsJ3QnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdJJywnYycsJ2knLCdyJywnYycsJ3UnLCdtJywnZicsJ2wnLCdlJywneCcsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnSScsJ2QnLCdpJywnZScsJ3InLCdlJywncycsJ2knLCdzJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdFJywndCcsJ2gnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ04nLCd0JywnaScsJ2wnLCdkJywnZScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnTycsJ2cnLCdyJywnYScsJ3YnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdPJywnYScsJ2MnLCd1JywndCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ08nLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdPJywndCcsJ2knLCdsJywnZCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ08nLCdkJywnaScsJ2UnLCdyJywnZScsJ3MnLCdpJywncycsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnTycsJ0UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ08nLCdzJywnbCcsJ2EnLCdzJywnaCcsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnVScsJ2cnLCdyJywnYScsJ3YnLCdlJywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdVJywnYScsJ2MnLCd1JywndCcsJ2UnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1UnLCdjJywnaScsJ3InLCdjJywndScsJ20nLCdmJywnbCcsJ2UnLCd4JywncycsJ20nLCdhJywnbCcsJ2wnLCAwLAotICAgICdVJywnZCcsJ2knLCdlJywncicsJ2UnLCdzJywnaScsJ3MnLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1knLCdhJywnYycsJ3UnLCd0JywnZScsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnVCcsJ2gnLCdvJywncicsJ24nLCdzJywnbScsJ2EnLCdsJywnbCcsIDAsCi0gICAgJ1knLCdkJywnaScsJ2UnLCdyJywnZScsJ3MnLCdpJywncycsJ3MnLCdtJywnYScsJ2wnLCdsJywgMCwKLSAgICAnMCcsJzAnLCcxJywnLicsJzAnLCcwJywnMCcsIDAsCi0gICAgJzAnLCcwJywnMScsJy4nLCcwJywnMCcsJzEnLCAwLAotICAgICcwJywnMCcsJzEnLCcuJywnMCcsJzAnLCcyJywgMCwKLSAgICAnMCcsJzAnLCcxJywnLicsJzAnLCcwJywnMycsIDAsCi0gICAgJ0InLCdsJywnYScsJ2MnLCdrJywgMCwKLSAgICAnQicsJ28nLCdsJywnZCcsIDAsCi0gICAgJ0InLCdvJywnbycsJ2snLCAwLAotICAgICdMJywnaScsJ2cnLCdoJywndCcsIDAsCi0gICAgJ00nLCdlJywnZCcsJ2knLCd1JywnbScsIDAsCi0gICAgJ1InLCdlJywnZycsJ3UnLCdsJywnYScsJ3InLCAwLAotICAgICdSJywnbycsJ20nLCdhJywnbicsIDAsCi0gICAgJ1MnLCdlJywnbScsJ2knLCdiJywnbycsJ2wnLCdkJywgMCwKLSAgfTsKLQotCi0jZGVmaW5lIEZUX05VTV9NQUNfTkFNRVMgIDI1OAotCi0gIC8qIFZhbHVlcyBhcmUgb2Zmc2V0cyBpbnRvIHRoZSBgZnRfc3RhbmRhcmRfZ2x5cGhfbmFtZXMnIHRhYmxlICovCi0KLSAgc3RhdGljIGNvbnN0IHNob3J0ICBmdF9tYWNfbmFtZXNbRlRfTlVNX01BQ19OQU1FU10gPQotICB7Ci0gICAgIDI1MywgICAwLCAgIDYsIDI2MSwgMjY3LCAyNzQsIDI4MywgMjk0LCAzMDEsIDMwOSwgNzU4LCAzMzAsIDM0MCwgMzUxLAotICAgICAzNjAsIDM2NSwgMzcxLCAzNzgsIDM4NSwgMzkxLCAzOTYsIDQwMCwgNDA0LCA0MTAsIDQxNSwgNDIwLCA0MjQsIDQzMCwKLSAgICAgNDM2LCA0NDEsIDQ0NywgNDU3LCA0NjIsIDQ2OCwgNDc2LCA0ODUsIDQ4OCwgNDkwLCA0OTIsIDQ5NCwgNDk2LCA0OTgsCi0gICAgIDUwMCwgNTAyLCA1MDQsIDUwNiwgNTA4LCA1MTAsIDUxMiwgNTE0LCA1MTYsIDUxOCwgNTIwLCA1MjIsIDUyNCwgNTI2LAotICAgICA1MjgsIDUzMCwgNTMyLCA1MzQsIDUzNiwgNTM4LCA1NDAsIDU1MiwgNTYyLCA1NzUsIDU4NywgOTc5LCA2MDgsIDYxMCwKLSAgICAgNjEyLCA2MTQsIDYxNiwgNjE4LCA2MjAsIDYyMiwgNjI0LCA2MjYsIDYyOCwgNjMwLCA2MzIsIDYzNCwgNjM2LCA2MzgsCi0gICAgIDY0MCwgNjQyLCA2NDQsIDY0NiwgNjQ4LCA2NTAsIDY1MiwgNjU0LCA2NTYsIDY1OCwgNjYwLCA2NzAsIDY3NCwgNjg1LAotICAgIDEzNzUsMTM5MiwxNDA1LDE0MTQsMTQ4NiwxNTEyLDE1NjIsMTYwMywxNjMyLDE2MTAsMTYyMiwxNjQ1LDE2MzksMTY1MiwKLSAgICAxNjYxLDE2OTAsMTY2OCwxNjgwLDE2OTcsMTcyNiwxNzA0LDE3MTYsMTczMywxNzQwLDE3NjksMTc0NywxNzU5LDE3NzYsCi0gICAgMTc5MCwxODE5LDE3OTcsMTgwOSwgODM5LDEyNjMsIDcwNywgNzEyLCA3NDEsIDg4MSwgODcxLDExNjAsMTMwMiwxMzQ2LAotICAgIDExOTcsIDk4NSwxMDMxLCAgMjMsMTA4NiwxMTA4LCAgMzIsMTIxOSwgIDQxLCAgNTEsIDczMCwxMTk0LCAgNjQsICA3NiwKLSAgICAgIDg2LCAgOTQsICA5NywxMDg5LDExMTgsIDEwNiwxMTMxLDExNTAsIDk2NiwgNjk2LDExODMsIDExMiwgNzM0LCAxMjAsCi0gICAgIDEzMiwgNzgzLCA5MzAsIDk0NSwgMTM4LDEzODUsMTM5OCwxNTI5LDExMTUsMTE1NywgODMyLDEwNzksIDc3MCwgOTE2LAotICAgICA1OTgsIDMxOSwxMjQ2LCAxNTUsMTgzMywxNTg2LCA3MjEsIDc0OSwgNzk3LCA4MTEsIDgyNiwgODI5LCA4NDYsIDg1NiwKLSAgICAgODg4LCA5MDMsIDk1NCwxMzYzLDE0MjEsMTM1NiwxNDMzLDE0NDMsMTQ1MCwxNDU3LDE0NjksMTQ3OSwxNDkzLDE1MDAsCi0gICAgIDE2MywxNTIyLDE1NDMsMTU1MCwxNTcyLDExMzQsIDk5MSwxMDAyLDEwMDgsMTAxNSwxMDIxLDEwNDAsMTA0NSwxMDUzLAotICAgIDEwNjYsMTA3MywxMTAxLDExNDMsMTUzNiwxNzgzLDE1OTYsMTg0MywxMjUzLDEyMDcsMTMxOSwxNTc5LDE4MjYsMTIyOSwKLSAgICAxMjcwLDEzMTMsMTMyMywxMTcxLDEyOTAsMTMzMiwxMjExLDEyMzUsMTI3NiwgMTY5LCAxNzUsIDE4MiwgMTg5LCAyMDAsCi0gICAgIDIwOSwgMjE4LCAyMjUsIDIzMiwgMjM5LCAyNDYKLSAgfTsKLQotCi0jZGVmaW5lIEZUX05VTV9TSURfTkFNRVMgIDM5MQotCi0gIC8qIFZhbHVlcyBhcmUgb2Zmc2V0cyBpbnRvIHRoZSBgZnRfc3RhbmRhcmRfZ2x5cGhfbmFtZXMnIHRhYmxlICovCi0KLSAgc3RhdGljIGNvbnN0IHNob3J0ICBmdF9zaWRfbmFtZXNbRlRfTlVNX1NJRF9OQU1FU10gPQotICB7Ci0gICAgIDI1MywgMjYxLCAyNjcsIDI3NCwgMjgzLCAyOTQsIDMwMSwgMzA5LCAzMTksIDMzMCwgMzQwLCAzNTEsIDM2MCwgMzY1LAotICAgICAzNzEsIDM3OCwgMzg1LCAzOTEsIDM5NiwgNDAwLCA0MDQsIDQxMCwgNDE1LCA0MjAsIDQyNCwgNDMwLCA0MzYsIDQ0MSwKLSAgICAgNDQ3LCA0NTcsIDQ2MiwgNDY4LCA0NzYsIDQ4NSwgNDg4LCA0OTAsIDQ5MiwgNDk0LCA0OTYsIDQ5OCwgNTAwLCA1MDIsCi0gICAgIDUwNCwgNTA2LCA1MDgsIDUxMCwgNTEyLCA1MTQsIDUxNiwgNTE4LCA1MjAsIDUyMiwgNTI0LCA1MjYsIDUyOCwgNTMwLAotICAgICA1MzIsIDUzNCwgNTM2LCA1MzgsIDU0MCwgNTUyLCA1NjIsIDU3NSwgNTg3LCA1OTgsIDYwOCwgNjEwLCA2MTIsIDYxNCwKLSAgICAgNjE2LCA2MTgsIDYyMCwgNjIyLCA2MjQsIDYyNiwgNjI4LCA2MzAsIDYzMiwgNjM0LCA2MzYsIDYzOCwgNjQwLCA2NDIsCi0gICAgIDY0NCwgNjQ2LCA2NDgsIDY1MCwgNjUyLCA2NTQsIDY1NiwgNjU4LCA2NjAsIDY3MCwgNjc0LCA2ODUsIDY5NiwgNzA3LAotICAgICA3MTIsIDcyMSwgNzMwLCA3MzQsIDc0MSwgNzQ5LCA3NTgsIDc3MCwgNzgzLCA3OTcsIDgxMSwgODI2LCA4MjksIDgzMiwKLSAgICAgODM5LCA4NDYsIDg1NiwgODcxLCA4ODEsIDg4OCwgOTAzLCA5MTYsIDkzMCwgOTQ1LCA5NTQsIDk2NiwgOTc5LCA5ODUsCi0gICAgIDk5MSwxMDAyLDEwMDgsMTAxNSwxMDIxLDEwMzEsMTA0MCwxMDQ1LDEwNTMsMTA2NiwxMDczLDEwNzksMTA4NiwxMDg5LAotICAgIDExMDEsMTEwOCwxMTE1LDExMTgsMTEzMSwxMTM0LDExNDMsMTE1MCwxMTU3LDExNjAsMTE3MSwxMTgzLDExOTQsMTE5NywKLSAgICAxMjA3LDEyMTEsMTIxOSwxMjI5LDEyMzUsMTI0NiwxMjUzLDEyNjMsMTI3MCwxMjc2LDEyOTAsMTMwMiwxMzEzLDEzMTksCi0gICAgMTMyMywxMzMyLDEzNDYsMTM1NiwxMzYzLDEzNzUsMTM4NSwxMzkyLDEzOTgsMTQwNSwxNDE0LDE0MjEsMTQzMywxNDQzLAotICAgIDE0NTAsMTQ1NywxNDY5LDE0NzksMTQ4NiwxNDkzLDE1MDAsMTUxMiwxNTIyLDE1MjksMTUzNiwxNTQzLDE1NTAsMTU2MiwKLSAgICAxNTcyLDE1NzksMTU4NiwxNTk2LDE2MDMsMTYxMCwxNjIyLDE2MzIsMTYzOSwxNjQ1LDE2NTIsMTY2MSwxNjY4LDE2ODAsCi0gICAgMTY5MCwxNjk3LDE3MDQsMTcxNiwxNzI2LDE3MzMsMTc0MCwxNzQ3LDE3NTksMTc2OSwxNzc2LDE3ODMsMTc5MCwxNzk3LAotICAgIDE4MDksMTgxOSwxODI2LDE4MzMsMTg0MywxODUwLDE4NjIsMTg4MCwxODk1LDE5MTAsMTkyNSwxOTM2LDE5NTQsMTk3MywKLSAgICAxOTg4LDIwMDMsMjAxNiwyMDI4LDIwNDAsMjA1NCwyMDY3LDIwODAsMjA5MiwyMTA2LDIxMjAsMjEzMywyMTQ3LDIxNjcsCi0gICAgMjE4MiwyMTk2LDIyMDYsMjIxNiwyMjI5LDIyMzksMjI0OSwyMjU5LDIyNjksMjI3OSwyMjg5LDIyOTksMjMwOSwyMzE5LAotICAgIDIzMjksMjMzMiwyMzM2LDIzNDAsMjM1OCwyMzc3LDIzOTMsMjQwOCwyNDE5LDI0MjYsMjQzMywyNDQwLDI0NDcsMjQ1NCwKLSAgICAyNDYxLDI0NjgsMjQ3NSwyNDgyLDI0ODksMjQ5NiwyNTAzLDI1MTAsMjUxNywyNTI0LDI1MzEsMjUzOCwyNTQ1LDI1NTIsCi0gICAgMjU1OSwyNTY2LDI1NzMsMjU4MCwyNTg3LDI1OTQsMjYwMSwyNjE1LDI2MjUsMjYzMiwyNjQzLDI2NTksMjY3MiwyNjg0LAotICAgIDI2OTYsMjcwOCwyNzIyLDI3MzMsMjc0NCwyNzU5LDI3NzEsMjc4MiwyNzk3LDI4MDksMjgxOSwyODMyLDI4NTAsMjg2MCwKLSAgICAyODczLDI4ODUsMjg5OCwyOTA3LDI5MTcsMjkzMCwyOTQzLDI5NTYsMjk2OCwyOTgyLDI5OTYsMzAwOSwzMDIyLDMwMzQsCi0gICAgMzA0NiwzMDYwLDMwNzMsMzA4NiwzMDk4LDMxMTIsMzEyNiwzMTM5LDMxNTIsMzE2NywzMTgyLDMxOTYsMzIwOCwzMjIwLAotICAgIDMyMzcsMzI0OSwzMjY0LDMyNzUsMzI4MywzMjk3LDMzMDksMzMyMSwzMzM4LDMzNTMsMzM2NSwzMzc3LDMzOTQsMzQwOSwKLSAgICAzNDE4LDM0MzAsMzQ0MiwzNDU0LDM0NzEsMzQ4MywzNDk4LDM1MDYsMzUxOCwzNTMwLDM1NDIsMzU1OSwzNTc0LDM1ODYsCi0gICAgMzU5NywzNjEyLDM2MjAsMzYyOCwzNjM2LDM2NDQsMzY1MCwzNjU1LDM2NjAsMzY2NiwzNjczLDM2ODEsMzY4NwotICB9OwotCi0KLSAgLyogdGhlIGZvbGxvd2luZyBhcmUgaW5kaWNlcyBpbnRvIHRoZSBTSUQgbmFtZSB0YWJsZSAqLwotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgIHQxX3N0YW5kYXJkX2VuY29kaW5nWzI1Nl0gPQotICB7Ci0gICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLSAgICAgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgMTYsCi0gICAgIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsIDMyLAotICAgICAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwKLSAgICAgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywgNjQsCi0gICAgIDY1LCA2NiwgNjcsIDY4LCA2OSwgNzAsIDcxLCA3MiwgNzMsIDc0LCA3NSwgNzYsIDc3LCA3OCwgNzksIDgwLAotICAgICA4MSwgODIsIDgzLCA4NCwgODUsIDg2LCA4NywgODgsIDg5LCA5MCwgOTEsIDkyLCA5MywgOTQsIDk1LCAgMCwKLSAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0gICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotICAgICAgMCwgOTYsIDk3LCA5OCwgOTksMTAwLDEwMSwxMDIsMTAzLDEwNCwxMDUsMTA2LDEwNywxMDgsMTA5LDExMCwKLSAgICAgIDAsMTExLDExMiwxMTMsMTE0LCAgMCwxMTUsMTE2LDExNywxMTgsMTE5LDEyMCwxMjEsMTIyLCAgMCwxMjMsCi0gICAgICAwLDEyNCwxMjUsMTI2LDEyNywxMjgsMTI5LDEzMCwxMzEsICAwLDEzMiwxMzMsICAwLDEzNCwxMzUsMTM2LAotICAgIDEzNywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLSAgICAgIDAsMTM4LCAgMCwxMzksICAwLCAgMCwgIDAsICAwLDE0MCwxNDEsMTQyLDE0MywgIDAsICAwLCAgMCwgIDAsCi0gICAgICAwLDE0NCwgIDAsICAwLCAgMCwxNDUsICAwLCAgMCwxNDYsMTQ3LDE0OCwxNDksICAwLCAgMCwgIDAsICAwCi0gIH07Ci0KLQotICAvKiB0aGUgZm9sbG93aW5nIGFyZSBpbmRpY2VzIGludG8gdGhlIFNJRCBuYW1lIHRhYmxlICovCi0gIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCAgdDFfZXhwZXJ0X2VuY29kaW5nWzI1Nl0gPQotICB7Ci0gICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotICAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwKLSAgICAgIDEsMjI5LDIzMCwgIDAsMjMxLDIzMiwyMzMsMjM0LDIzNSwyMzYsMjM3LDIzOCwgMTMsIDE0LCAxNSwgOTksCi0gICAgMjM5LDI0MCwyNDEsMjQyLDI0MywyNDQsMjQ1LDI0NiwyNDcsMjQ4LCAyNywgMjgsMjQ5LDI1MCwyNTEsMjUyLAotICAgICAgMCwyNTMsMjU0LDI1NSwyNTYsMjU3LCAgMCwgIDAsICAwLDI1OCwgIDAsICAwLDI1OSwyNjAsMjYxLDI2MiwKLSAgICAgIDAsICAwLDI2MywyNjQsMjY1LCAgMCwyNjYsMTA5LDExMCwyNjcsMjY4LDI2OSwgIDAsMjcwLDI3MSwyNzIsCi0gICAgMjczLDI3NCwyNzUsMjc2LDI3NywyNzgsMjc5LDI4MCwyODEsMjgyLDI4MywyODQsMjg1LDI4NiwyODcsMjg4LAotICAgIDI4OSwyOTAsMjkxLDI5MiwyOTMsMjk0LDI5NSwyOTYsMjk3LDI5OCwyOTksMzAwLDMwMSwzMDIsMzAzLCAgMCwKLSAgICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCi0gICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLAotICAgICAgMCwzMDQsMzA1LDMwNiwgIDAsICAwLDMwNywzMDgsMzA5LDMxMCwzMTEsICAwLDMxMiwgIDAsICAwLDMxMywKLSAgICAgIDAsICAwLDMxNCwzMTUsICAwLCAgMCwzMTYsMzE3LDMxOCwgIDAsICAwLCAgMCwxNTgsMTU1LDE2MywzMTksCi0gICAgMzIwLDMyMSwzMjIsMzIzLDMyNCwzMjUsICAwLCAgMCwzMjYsMTUwLDE2NCwxNjksMzI3LDMyOCwzMjksMzMwLAotICAgIDMzMSwzMzIsMzMzLDMzNCwzMzUsMzM2LDMzNywzMzgsMzM5LDM0MCwzNDEsMzQyLDM0MywzNDQsMzQ1LDM0NiwKLSAgICAzNDcsMzQ4LDM0OSwzNTAsMzUxLDM1MiwzNTMsMzU0LDM1NSwzNTYsMzU3LDM1OCwzNTksMzYwLDM2MSwzNjIsCi0gICAgMzYzLDM2NCwzNjUsMzY2LDM2NywzNjgsMzY5LDM3MCwzNzEsMzcyLDM3MywzNzQsMzc1LDM3NiwzNzcsMzc4Ci0gIH07Ci0KLQotICAvKgotICAgKiAgVGhpcyB0YWJsZSBpcyBhIGNvbXByZXNzZWQgdmVyc2lvbiBvZiB0aGUgQWRvYmUgR2x5cGggTGlzdCAoQUdMKSwKLSAgICogIG9wdGltaXplZCBmb3IgZWZmaWNpZW50IHNlYXJjaGluZy4gIEl0IGhhcyBiZWVuIGdlbmVyYXRlZCBieSB0aGUKLSAgICogIGBnbG5hbWVzLnB5JyBweXRob24gc2NyaXB0IGxvY2F0ZWQgaW4gdGhlIGBzcmMvdG9vbHMnIGRpcmVjdG9yeS4KLSAgICoKLSAgICogIFRoZSBsb29rdXAgZnVuY3Rpb24gdG8gZ2V0IHRoZSBVbmljb2RlIHZhbHVlIGZvciBhIGdpdmVuIHN0cmluZwotICAgKiAgaXMgZGVmaW5lZCBiZWxvdyB0aGUgdGFibGUuCi0gICAqLwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9BRE9CRV9HTFlQSF9MSVNUCi0KLSAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgIGZ0X2Fkb2JlX2dseXBoX2xpc3RbNTU5OTdMXSA9Ci0gIHsKLSAgICAgIDAsIDUyLCAgMCwxMDYsICAyLDE2NywgIDMsIDYzLCAgNCwyMjAsICA2LDEyNSwgIDksMTQzLCAxMCwgMjMsCi0gICAgIDExLDEzNywgMTIsMTk5LCAxNCwyNDYsIDE1LCA4NywgMTYsMjMzLCAxNywyMTksIDE4LDEwNCwgMTksIDg4LAotICAgICAyMiwxMTAsIDIzLCAzMiwgMjMsIDcxLCAyNCwgNzcsIDI3LDE1NiwgMjksIDczLCAzMSwyNDcsIDMyLDEwNywKLSAgICAgMzIsMjIyLCAzMywgNTUsIDM0LDE1NCwgMzUsMjE4LCA1OCwgMTAsIDY0LDEyMiwgNzIsMTg4LCA4MCwxMDksCi0gICAgIDg4LDEwNCwgOTMsIDYxLCA5OCwxNjgsMTA2LCA5MSwxMTQsMTExLDExNSwyMzcsMTIyLDE4MCwxMjcsMjU1LAotICAgIDEzNSwxNjQsMTQzLDEzMiwxNDksMjEzLDE1OCwxMDgsMTYxLDExNSwxNjgsMTc1LDE4MywxNDcsMTk3LDE5OSwKLSAgICAyMDIsIDI1LDIwNCwxNjYsMjA4LDIwOSwyMDksIDgxLDIxNSwgMjYsIDY1LDE0MywgIDAsIDY1LCAgMCwxNDAsCi0gICAgICAwLDE3NSwgIDAsMTkzLCAgMSwgMTUsICAxLDE0NywgIDEsMjMzLCAgMSwyNTEsICAyLCAgNywgIDIsIDQwLAotICAgICAgMiwgNTcsICAyLCA4MiwgIDIsIDkxLCAgMiwxMjgsICAyLDEzNiwgIDIsMTU0LCA2OSwxMzEsICAwLDE5OCwKLSAgICAgIDAsMTUwLCAgMCwxNTgsICAwLDE2NywyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgIDEsMjUyLDIzNywyMjUsCi0gICAgMjI3LDI0MiwyMzksMTEwLDEyOCwgIDEsMjI2LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMzAsMjI1LAotICAgIDIyNywyNDUsMjQ0LDEwMSwxMjksICAwLDE5MywgIDAsMTg1LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywKLSAgICAyMjUsMjI2LDI0MiwyMjksMjQ2LDEwMSwxMzQsICAxLCAgMiwgIDAsMjEzLCAgMCwyMjEsICAwLDIzMiwgIDAsCi0gICAgMjQzLCAgMCwyNTEsICAxLCAgNywyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsMTc0LDIyNywyNDksMjQyLAotICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMDgsMjI4LDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwKLSAgICAxMjgsIDMwLDE4MiwyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwgMzAsMTc2LDIzMiwyMzksMjM5LDIzNSwyMjUsCi0gICAgMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMTc4LDI0NCwyMzMsMjM2LDIyOCwxMDEsMTI4LCAzMCwxODAsIDk5LAotICAgICAgNCwgIDEsIDI1LCAgMSwgMzIsICAxLDEyMSwgIDEsMTM3LDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLDIwNSwKLSAgICAyMzMsMjQyLCA5OSwgIDIsICAxLCA0MCwgIDEsIDQ1LDIzNiwxMDEsMTI4LCAzNiwxODIsMjQ1LDIzNywyMzAsCi0gICAgMjM2LDIyOSwxMjAsMTM0LCAgMCwxOTQsICAxLCA2NiwgIDEsIDc0LCAgMSwgODUsICAxLCA5MywgIDEsMTA1LAotICAgICAgMSwxMTMsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLDE2NCwyMjgsMjM5LDI0NCwyMjYsMjI5LDIzNiwKLSAgICAyMzksMTE5LDEyOCwgMzAsMTcyLDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAzMCwxNjYsMjMyLDIzOSwyMzksCi0gICAgMjM1LDIyNSwyMjYsMjM5LDI0NiwxMDEsMTI4LCAzMCwxNjgsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LAotICAgIDIyNiwyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwgMzAsMTcwLDI0NSwyNDQsMTAxLDEyOSwyNDYsMjAxLCAgMSwKLSAgICAxMjksMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDE4MCwyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksCi0gICAgMTI4LCAgNCwgMTYsMTAwLCAgMywgIDEsMTU1LCAgMSwxNjUsICAxLDIwOSwyMjYsMjM2LDIzMSwyNDIsMjI1LAotICAgIDI0NiwxMDEsMTI4LCAgMiwgIDAsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEzMSwgIDAsMTk2LCAgMSwKLSAgICAxODEsICAxLDE5MiwgIDEsMjAxLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMTAsCi0gICAgMjM3LDIyNSwyMjcsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMjIsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LAotICAgIDIyOCwyMzksMTE2LCAgMiwgIDEsMjE2LCAgMSwyMjQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDE2MCwKLSAgICAyMzcsMjI1LDIyNywyNDIsMjM5LDExMCwxMjgsICAxLDIyNCwyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOSwgIDAsCi0gICAgMTkyLCAgMSwyNDMsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDIyNCwyMzIsMjM5LDIzOSwyMzUsMjI1LAotICAgIDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDE2MiwxMDUsICAyLCAgMiwgMTMsICAyLCAyNSwyMjksMjI3LDI0OSwKLSAgICAyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDIxMiwyMzgsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwyMjgsCi0gICAgMjI2LDI0MiwyMjksMjQ2LDEwMSwxMjgsICAyLCAgMiwyMzYsMjQwLDIzMiwgOTcsMTI5LCAgMywxNDUsICAyLAotICAgICA0OSwyNDQsMjM5LDIzOCwyMzksMTE1LDEyOCwgIDMsMTM0LDEwOSwgIDIsICAyLCA2MywgIDIsIDcxLDIyNSwKLSAgICAyMjcsMjQyLDIzOSwxMTAsMTI4LCAgMSwgIDAsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsCi0gICAgMjU1LCAzMywyMzksMjMxLDIzOSwyMzgsMjI5LDEwNywxMjgsICAxLCAgNCwyNDIsMjMzLDIzOCwxMDMsMTMxLAotICAgICAgMCwxOTcsICAyLDEwNCwgIDIsMTEyLCAgMiwxMjAsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLDI1MCwKLSAgICAyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsICAwLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMjksCi0gICAgMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LCA5NywyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOSwgIDAsMTk1LAotICAgICAgMiwxNDYsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDIyNywyNDksMjI2LDIyNSwyNDIsMjM3LDIyOSwKLSAgICAyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNDksIDY2LDEzNywgIDAsIDY2LCAgMiwxODksICAyLDE5OCwgIDIsCi0gICAgMjIzLCAgMywgIDMsICAzLCAxMCwgIDMsIDIyLCAgMywgMzQsICAzLCA0NiwgIDMsIDU0LDIyNywyMzMsMjQyLAotICAgIDIyNywyMzYsMTAxLDEyOCwgMzYsMTgzLDIyOCwyMzksMTE2LCAgMiwgIDIsMjA2LCAgMiwyMTUsMjI1LDIyNywKLSAgICAyMjcsMjI5LDIzOCwxMTYsMTI4LCAzMCwgIDIsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCAgNCwxMDEsCi0gICAgICAzLCAgMiwyMzEsICAyLDI0MiwgIDIsMjU0LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LAotICAgICAgNCwgMTcsMjM4LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNTAsMjQ0LCA5NywKLSAgICAxMjgsICAzLDE0NiwyMzIsMjM5LDIzOSwxMDcsMTI4LCAgMSwxMjksMjM2LDIzMywyMzgsMjI5LDIyNiwyMjksCi0gICAgMjM2LDIzOSwxMTksMTI4LCAzMCwgIDYsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LAotICAgIDI1NSwgMzQsMjQyLDIyOSwyNDYsMjI5LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NiwyNDQsMjQzLDIzNywKLSAgICAyMjUsMjM2LDEwOCwxMjgsMjQ3LCA5OCwyNDQsMjM5LDI0MCwyMjYsMjI1LDExNCwxMjgsICAxLDEzMCwgNjcsCi0gICAgMTM3LCAgMCwgNjcsICAzLCA4NSwgIDMsMTI3LCAgMywxOTMsICAzLDIxMCwgIDMsMjI0LCAgNCwxNzEsICA0LAotICAgIDE4OCwgIDQsMjAwLCAgNCwyMTIsIDk3LCAgMywgIDMsIDkzLCAgMywxMDQsICAzLDExMSwyMjUsMjQyLDIzNywKLSAgICAyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDYyLDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLCAgNiwyNDIsCi0gICAgMjM5LDExMCwxMjksMjQ2LDIwMiwgIDMsMTE5LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NiwyNDUsIDk5LAotICAgICAgMywgIDMsMTM1LCAgMywxNDIsICAzLDE3MSwyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwgMTIsMjI5LDIyOCwKLSAgICAyMzMsMjM2LDIzNiwgOTcsMTMwLCAgMCwxOTksICAzLDE1NSwgIDMsMTYzLDIyNSwyMjcsMjQ1LDI0NCwxMDEsCi0gICAgMTI4LCAzMCwgIDgsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDIzMSwyMzMsMjQyLCA5OSwgIDIsICAzLAotICAgIDE3OSwgIDMsMTg0LDIzNiwxMDEsMTI4LCAzNiwxODQsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTI4LCAgMSwKLSAgICAgIDgsMjI4LDIzOSwxMTYsMTI5LCAgMSwgMTAsICAzLDIwMSwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsCi0gICAgICAxLCAxMCwyMjksMjI4LDIzMywyMzYsMjM2LDIyNSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTg0LAotICAgIDEwNCwgIDQsICAzLDIzNCwgIDMsMjQ2LCAgNCwxNjEsICA0LDE2NSwyMjUsMjI1LDI0MiwyMzcsMjI5LDIzOCwKLSAgICAyMzMsMjI1LDExMCwxMjgsICA1LCA3MywxMDEsICA2LCAgNCwgIDQsICA0LCAyNCwgIDQsIDM1LCAgNCwxMDMsCi0gICAgICA0LDExNSwgIDQsMTM2LDIyNSwyMjYsMjM1LDIzMiwyMjUsMjQzLDIzMywyMjUsMjM4LDIyNywyNDksMjQyLAotICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxODgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwKLSAgICAxMjgsICA0LCAzOSwxMDAsICAyLCAgNCwgNDEsICA0LCA4NSwyMjksMjQzLDIyNywyMjksMjM4LDIyOCwyMjksCi0gICAgMTE0LCAgMiwgIDQsIDU0LCAgNCwgNzQsMjI1LDIyNiwyMzUsMjMyLDIyNSwyNDMsMjMzLDIyNSwyMzgsMjI3LAotICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE5MCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwKLSAgICAyMzMsIDk5LDEyOCwgIDQsMTgyLDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDI0MywyMjcsMjQ5LDI0MiwyMzMsCi0gICAgMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjQ0LDIzMiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLAotICAgIDEyOCwgIDUsIDY3LDIzNSwyMzIsMjI1LDIzNSwyMjUsMjQzLDI0MywyMzMsMjI1LDIzOCwyMjcsMjQ5LDI0MiwKLSAgICAyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjAzLDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwyMzYsCi0gICAgMjQzLDI0NCwyNDIsMjM5LDIzNSwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgIDE4NCwxMDUsMTI4LCAgMywxNjcsMjM5LDIzOSwxMDcsMTI4LCAgMSwxMzUsMjMzLDI0MiwyMjcsMjQ1LDIzNywKLSAgICAyMzAsMjM2LDIyOSwyNDgsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ2LDI0NiwyMzcsMjM5LDIzOCwyMzksCi0gICAgMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAzNSwyMzksMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LAotICAgIDExMCwxMjgsICA1LCA4MSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsIDk5LCA2OCwxNDIsICAwLCA2OCwKLSAgICAgIDQsMjUyLCAgNSwgMTAsICA1LCAzNiwgIDUsIDk2LCAgNSwxMjEsICA1LDE2NiwgIDUsMTczLCAgNSwyMzEsCi0gICAgICA1LDI0NCwgIDYsICAwLCAgNiwgMTIsICA2LCAyOCwgIDYsIDQ4LCAgNiwgNTcsIDkwLDEyOSwgIDEsMjQxLAotICAgICAgNSwgIDIsMjI3LDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLDE5NiwgOTcsICAyLCAgNSwgMTYsICA1LCAyNywKLSAgICAyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDUyLDIzMCwyNDIsMjMzLDIyNywyMjUsCi0gICAgMTEwLDEyOCwgIDEsMTM3LCA5OSwgIDQsICA1LCA0NiwgIDUsIDUzLCAgNSwgNjIsICA1LCA4OSwyMjUsMjQyLAotICAgIDIzOSwxMTAsMTI4LCAgMSwgMTQsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI4LCAzMCwgMTYsMjMzLDI0MiwKLSAgICAgOTksICAyLCAgNSwgNzAsICA1LCA3NSwyMzYsMTAxLDEyOCwgMzYsMTg1LDI0NSwyMzcsMjMwLDIzNiwyMjksCi0gICAgMjQ4LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgMTgsMjQyLDIzOSwyMjUsMTE2LDEyOCwgIDEsIDE2LAotICAgIDIyOCwyMzksMTE2LCAgMiwgIDUsMTA0LCAgNSwxMTMsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAzMCwKLSAgICAgMTAsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCAxMiwxMDEsICAzLCAgNSwxMjksICA1LDE0MCwgIDUsCi0gICAgMTUwLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgMjAsMjMzLDIyNywyMzksMjQwLAotICAgIDI0NCwyMzMsIDk5LDEyOCwgIDMsMjM4LDIzNiwyNDQsIDk3LDEyOSwgMzQsICA2LCAgNSwxNTgsMjMxLDI0MiwKLSAgICAyMjksMjI5LDEwNywxMjgsICAzLDE0OCwyMzIsMjM5LDIzOSwxMDcsMTI4LCAgMSwxMzgsMTA1LCAgMiwgIDUsCi0gICAgMTc5LCAgNSwyMTgsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTMxLDI0NiwyMDMsICA1LDE5NCwgIDUsMjAyLAotICAgICAgNSwyMTAsMTkzLDIyNywyNDUsMjQ0LDEwMSwxMjgsMjQ2LDIwNCwxOTksMjQyLDIyNSwyNDYsMTAxLDEyOCwKLSAgICAyNDYsMjA1LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxNjgsMjMxLDIyNSwyMzcsMjM3LDIyNSwyMzEsCi0gICAgMjQyLDIyOSwyMjksMTA3LDEyOCwgIDMsMjIwLDIzNCwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLAotICAgICA5OSwxMjgsICA0LCAgMiwyMzYsMjMzLDIzOCwyMjksMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCAxNCwKLSAgICAyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAzNiwyMzksMjQ0LDIyNSwyMjcsCi0gICAgMjI3LDIyOSwyMzgsMjQ0LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NiwyNDcsMTE1LCAgMiwgIDYsIDM0LAotICAgICAgNiwgNDEsMjM2LDIyNSwyNDMsMTA0LDEyOCwgIDEsIDE2LDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDEwMCwKLSAgICAyNDQsMjM5LDI0MCwyMjYsMjI1LDExNCwxMjgsICAxLDEzOSwxMjIsMTMxLCAgMSwyNDIsICA2LCA2NywgIDYsCi0gICAgIDc1LCAgNiwxMTIsMjI3LDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLDE5NywxMDEsICAyLCAgNiwgODEsICA2LAotICAgIDEwMSwyMjUsMjI2LDIzNSwyMzIsMjI1LDI0MywyMzMsMjI1LDIzOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwKLSAgICAyMzMsIDk5LDEyOCwgIDQsMjI0LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgIDUsCi0gICAgMjMyLDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDE1LCA2OSwxNDYsICAwLAotICAgICA2OSwgIDYsMTY1LCAgNiwxODMsICA2LDE5MSwgIDcsIDg5LCAgNywxNTMsICA3LDE2NSwgIDcsMTgzLCAgNywKLSAgICAyMTEsICA4LCAgNywgIDgsIDM2LCAgOCwgOTQsICA4LDE2OSwgIDgsMTg5LCAgOCwyMDgsICA4LDI0OCwgIDksCi0gICAgIDQ0LCAgOSwxMDksICA5LDExNSwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOSwgIDAsMjAxLCAgNiwxNzUsMjQzLAotICAgIDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDIzMywyMjYsMjQyLDIyOSwyNDYsMTAxLDEyOCwgIDEsIDIwLCA5OSwKLSAgICAgIDUsICA2LDIwMywgIDYsMjEwLCAgNiwyMjQsICA2LDIzNiwgIDcsIDc5LDIyNSwyNDIsMjM5LDExMCwxMjgsCi0gICAgICAxLCAyNiwyMjksMjI4LDIzMywyMzYsMjM2LDIyNSwyMjYsMjQyLDIyOSwyNDYsMTAxLDEyOCwgMzAsIDI4LAotICAgIDIzMiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDUzLDIzMywyNDIsIDk5LCAgMiwKLSAgICAgIDYsMjQ0LCAgNiwyNDksMjM2LDEwMSwxMjgsIDM2LDE4NiwyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwxMzUsCi0gICAgICAwLDIwMiwgIDcsIDE2LCAgNywgMjQsICA3LCAzMiwgIDcsIDQzLCAgNywgNTEsICA3LCA2MywgIDcsIDcxLAotICAgIDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwxOTAsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCAyNCwKLSAgICAyMjgsMjM5LDI0NCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTk4LDIzMSwyNDIsMjI1LDI0NiwxMDEsCi0gICAgMTI4LCAzMCwxOTIsMjMyLDIzOSwyMzksMjM1LDIyNSwyMjYsMjM5LDI0NiwxMDEsMTI4LCAzMCwxOTQsMjQzLAotICAgIDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDIzNCwyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwgMzAsMTk2LDI0OSwKLSAgICAyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCAgNCwxMDAsICAzLCAgNywgOTcsICA3LDEwNywgIDcsCi0gICAgMTI3LDIyNiwyMzYsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAyLCAgNCwyMzMsMjI5LDI0MiwyMjksMjQzLAotICAgIDIzMywxMTUsMTI5LCAgMCwyMDMsICA3LDExOSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMjM1LDIzOSwKLSAgICAxMTYsMTMwLCAgMSwgMjIsICA3LDEzNiwgIDcsMTQ1LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgIDEsCi0gICAgIDIyLDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxODQsMjMwLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LAotICAgIDIzMywgOTksMTI4LCAgNCwgMzYsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjksICAwLDIwMCwgIDcsMTc1LDI0MywKLSAgICAyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyMzIsMTA0LCAgMiwgIDcsMTg5LCAgNywyMDAsMjI1LDI0MiwyMzcsCi0gICAgMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA1NSwyMzksMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLAotICAgIDEyOCwgMzAsMTg2LDEwNSwgIDMsICA3LDIxOSwgIDcsMjMwLCAgNywyNDUsMjMxLDIzMiwyNDQsMjQyLDIzOSwKLSAgICAyMzcsMjI1LDExMCwxMjgsIDMzLDEwMywyMzgsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwyMjgsMjI2LDI0MiwyMjksCi0gICAgMjQ2LDEwMSwxMjgsICAyLCAgNiwyMzksMjQ0LDIzMywyMzAsMjMzLDIyOSwyMjgsMjI3LDI0OSwyNDIsMjMzLAotICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDEwMCwxMDgsICAyLCAgOCwgMTMsICA4LCAyNCwyMjcsMjQ5LDI0MiwKLSAgICAyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDI3LDIyOSwyNDYsMjI5LDIzOCwyNDIsMjM5LDIzNywyMjUsCi0gICAgMTEwLDEyOCwgMzMsMTA2LDEwOSwgIDMsICA4LCA0NCwgIDgsIDcyLCAgOCwgODMsMjI1LDIyNywyNDIsMjM5LAotICAgIDExMCwxMzAsICAxLCAxOCwgIDgsIDU2LCAgOCwgNjQsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLCAyMiwKLSAgICAyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwgMzAsIDIwLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksCi0gICAgMTI4LCAgNCwgMjgsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAzNywxMTAsICA0LAotICAgICAgOCwxMDQsICA4LDExNSwgIDgsMTM1LCAgOCwxNTQsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwKLSAgICAxMjgsICA0LCAyOSwyMjgsMjI5LDI0MywyMjcsMjI5LDIzOCwyMjgsMjI5LDI0MiwyMjcsMjQ5LDI0MiwyMzMsCi0gICAgMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTYyLDEwMywxMjksICAxLCA3NCwgIDgsMTQxLDIzMiwyMjksMjI3LAotICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE2NCwyMzIsMjM5LDIzOSwyMzUsMjI3LDI0OSwKLSAgICAyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE5OSwxMTEsICAyLCAgOCwxNzUsICA4LDE4MywyMzEsCi0gICAgMjM5LDIzOCwyMjksMTA3LDEyOCwgIDEsIDI0LDI0MCwyMjksMTEwLDEyOCwgIDEsMTQ0LDI0MCwyNDMsMjMzLAotICAgIDIzNiwyMzksMTEwLDEyOSwgIDMsMTQ5LCAgOCwyMDAsMjQ0LDIzOSwyMzgsMjM5LDExNSwxMjgsICAzLDEzNiwKLSAgICAxMTQsICAyLCAgOCwyMTQsICA4LDIyNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCi0gICAgIDMyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwxMjksICAxLDE0MiwgIDgsMjM3LDIyNywyNDksMjQyLAotICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNDUsMTE1LCAgNCwgIDksICAyLCAgOSwgMTMsICA5LCAzMywKLSAgICAgIDksIDM3LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgMzMsMjI4LDIyOSwyNDMsCi0gICAgMjI3LDIyOSwyMzgsMjI4LDIyOSwyNDIsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgIDE3MCwxMDQsMTI4LCAgMSwxNjksMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTAxLDExNiwgIDMsICA5LCA1MiwKLSAgICAgIDksIDc4LCAgOSwgOTIsIDk3LDEzMCwgIDMsMTUxLCAgOSwgNjAsICA5LCA3MCwyNDIsMjM3LDIyOSwyMzgsCi0gICAgMjMzLDIyNSwxMTAsMTI4LCAgNSwgNTYsMjQ0LDIzOSwyMzgsMjM5LDExNSwxMjgsICAzLDEzNywxMDQsMTI5LAotICAgICAgMCwyMDgsICA5LCA4NCwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMjQwLDIzMywyMzYsMjI4LDEwMSwKLSAgICAxMjksIDMwLDE4OCwgIDksMTAxLDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgMjYsMjQ1LDI0MiwxMTEsCi0gICAgMTI4LCAzMiwxNzIsMjUwLDEwNCwxMzAsICAxLDE4MywgIDksMTI0LCAgOSwxMzIsMjI3LDIyNSwyNDIsMjM5LAotICAgIDExMCwxMjgsICAxLDIzOCwyNDIsMjI5LDI0NiwyMjksMjQyLDI0MywyMjksMTAwLDEyOCwgIDEsMTg0LCA3MCwKLSAgICAxMzYsICAwLCA3MCwgIDksMTYzLCAgOSwxNzIsICA5LDE4NCwgIDksMjEyLCAgOSwyMTksICA5LDI0OCwgMTAsCi0gICAgICA0LCAxMCwgMTUsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwxODcsMjI4LDIzOSwyNDQsMjI1LAotICAgIDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAzMCwgMzAsMTAxLCAgMiwgIDksMTkwLCAgOSwyMDIsMjMyLDIyNSwKLSAgICAyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgODYsMjMzLDIyNywyMzksMjQwLDI0NCwyMzMsCi0gICAgIDk5LDEyOCwgIDMsMjI4LDIzMiwyMzksMjM5LDEwNywxMjgsICAxLDE0NSwxMDUsICAyLCAgOSwyMjUsICA5LAotICAgIDIzOCwyNDQsMjI1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMTQsMjQ2LDIyOSwKLSAgICAyNDIsMjM5LDIzNywyMjUsMTEwLDEyOCwgMzMsMTAwLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsCi0gICAgMTAxLDEyOCwyNTUsIDM4LDIzOSwyNDUsMjQyLDI0MiwyMzksMjM3LDIyNSwxMTAsMTI4LCAzMywgOTksMjQzLAotICAgIDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDEwMiwgNzEsMTQwLCAgMCwgNzEsIDEwLCA1MSwgMTAsIDYxLCAxMCwKLSAgICAxMDcsIDEwLDExNSwgMTAsMTc2LCAxMCwxOTMsIDEwLDIwNSwgMTEsIDM5LCAxMSwgNTIsIDExLCA2NSwgMTEsCi0gICAgIDkwLCAxMSwxMDcsMTk0LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTM1LCA5NywgIDMsIDEwLAotICAgICA2OSwgMTAsIDc2LCAxMCwgOTQsMjI3LDI0NSwyNDQsMTAxLDEyOCwgIDEsMjQ0LDIzNywyMzcsIDk3LDEyOSwKLSAgICAgIDMsMTQ3LCAxMCwgODQsMjI1LDIzMCwyNDIsMjMzLDIyNywyMjUsMTEwLDEyOCwgIDEsMTQ4LDIzOCwyMzEsCi0gICAgMjMzLDIyNSwyMjcsMjM5LDI0MCwyNDQsMjMzLCA5OSwxMjgsICAzLDIzNCwyMjYsMjQyLDIyOSwyNDYsMTAxLAotICAgIDEyOCwgIDEsIDMwLCA5OSwgIDQsIDEwLDEyNSwgMTAsMTMyLCAxMCwxNDEsIDEwLDE2MywyMjUsMjQyLDIzOSwKLSAgICAxMTAsMTI4LCAgMSwyMzAsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI4LCAgMSwgMzQsMjMzLDI0MiwgOTksCi0gICAgICAyLCAxMCwxNDksIDEwLDE1NCwyMzYsMTAxLDEyOCwgMzYsMTg4LDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLAotICAgIDEyOCwgIDEsIDI4LDIzOSwyMzcsMjM3LDIyNSwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsICAxLCAzNCwKLSAgICAyMjgsMjM5LDExNiwxMjksICAxLCAzMiwgMTAsMTg0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgIDEsCi0gICAgIDMyLDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDE5LDEwNCwgIDMsIDEwLAotICAgIDIxMywgMTAsMjI2LCAxMSwgMzMsMjI1LDIyOCwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwKLSAgICAgIDUsIDY2LDEwMSwgIDMsIDEwLDIzNCwgMTAsMjU1LCAxMSwgMTYsMjM3LDIzMywyMjgsMjI4LDIzNiwyMjksCi0gICAgMjMyLDIzOSwyMzksMjM1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNDgsMjQzLAotICAgIDI0NCwyNDIsMjM5LDIzNSwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE0NiwKLSAgICAyNDUsMjQwLDI0NCwyNDUsMjQyLDIzOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCi0gICAgMTQ0LDIzOSwyMzksMTA3LDEyOCwgIDEsMTQ3LDIzMywyMzcsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LAotICAgIDExMCwxMjgsICA1LCA1MSwyMzQsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKLSAgICAgIDMsMTA5LCAgMiwgMTEsIDcxLCAxMSwgNzksMjI1LDIyNywyNDIsMjM5LDExMCwxMjgsIDMwLCAzMiwyMzksCi0gICAgMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDM5LDI0MiwyMjUsMjQ2LDEwMSwxMjksMjQ2LAotICAgIDIwNiwgMTEsIDk5LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywgOTYsMTE1LCAgMiwgMTEsMTEzLCAxMSwKLSAgICAxMjksMjM3LDIyNSwyMzYsMTA4LDEyOSwyNDcsMTAzLCAxMSwxMjIsMjMyLDIzOSwyMzksMTA3LDEyOCwgIDIsCi0gICAgMTU1LDI0NCwyNDIsMjM5LDIzNSwxMDEsMTI4LCAgMSwyMjgsIDcyLDE0MCwgIDAsIDcyLCAxMSwxNjUsIDExLAotICAgIDE5MCwgMTEsMTk4LCAxMSwyMDgsIDEyLCAxNywgMTIsIDQwLCAxMiwgNzcsIDEyLDExNywgMTIsMTI5LCAxMiwKLSAgICAxNTcsIDEyLDE2NSwgMTIsMTg5LDE3NywxODQsIDUzLCAgMywgMTEsMTc1LCAxMSwxODAsIDExLDE4NSwxNzksCi0gICAgIDUxLDEyOCwgMzcsMjA3LDE4MCwgNTEsMTI4LCAzNywxNzAsMTgxLCA0OSwxMjgsIDM3LDE3MSwxNzgsMTc4LAotICAgIDE3NiwxODMsIDUxLDEyOCwgMzcsMTYxLDIwOCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDIwMywKLSAgICAgOTcsICAzLCAxMSwyMTYsIDExLDIzNiwgMTIsICAwLDIyNSwyMjYsMjM1LDIzMiwyMjUsMjQzLDIzMywyMjUsCi0gICAgMjM4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNjgsMjI4LDIyOSwyNDMsMjI3LAotICAgIDIyOSwyMzgsMjI4LDIyOSwyNDIsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE3OCwKLSAgICAyNDIsMjI4LDI0MywyMzMsMjMxLDIzOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCi0gICAgIDQyLCA5OCwgIDIsIDEyLCAyMywgMTIsIDI4LDIyNSwxMTQsMTI4LCAgMSwgMzgsMjQyLDIyOSwyNDYsMjI5LAotICAgIDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgNDIsIDk5LCAgMiwgMTIsIDQ2LCAxMiwgNTUsMjI5LDIyOCwKLSAgICAyMzMsMjM2LDIzNiwgOTcsMTI4LCAzMCwgNDAsMjMzLDI0MiwgOTksICAyLCAxMiwgNjMsIDEyLCA2OCwyMzYsCi0gICAgMTAxLDEyOCwgMzYsMTg5LDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOCwgIDEsIDM2LDEwMCwgIDIsIDEyLAotICAgICA4MywgMTIsIDkzLDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjgsIDMwLCAzOCwyMzksMTE2LCAgMiwKLSAgICAgMTIsMTAwLCAxMiwxMDksMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAzMCwgMzQsMjI2LDIyOSwyMzYsCi0gICAgMjM5LDExOSwxMjgsIDMwLCAzNiwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LAotICAgICA0MCwxMTEsICAyLCAxMiwxMzUsIDEyLDE0NiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwKLSAgICAgIDUsIDY0LDI0MiwyMzMsMjI3LDIzOSwyNDAsMjQ0LDIzMywgOTksMTI4LCAgMywyMzIsMjQzLDIzNywyMjUsCi0gICAgMjM2LDEwOCwxMjgsMjQ3LDEwNCwyNDUsMjM4LDIzMSwyMjUsMjQyLDI0NSwyMzcsMjM2LDIyNSwyNDUsMTE2LAotICAgIDEyOSwyNDYsMjA3LCAxMiwxODEsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ2LDI0OCwyNTAsMjQzLDI0MSwKLSAgICAyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNDQsIDczLDE0NiwgIDAsIDczLCAxMiwyMzksIDEyLDI1MSwgMTIsCi0gICAgMjU1LCAxMywgMTEsIDEzLCAyOSwgMTMsIDM3LCAxMywgOTQsIDEzLDE4MSwgMTMsMjE0LCAxMywyMjQsIDEzLAotICAgIDI0MiwgMTMsMjU0LCAxNCwgNDgsIDE0LCA4NiwgMTQsIDk5LCAxNCwxNjYsIDE0LDE4NywgMTQsMjA1LDE5MywKLSAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDQ3LCA3NCwxMjgsICAxLCA1MCwyMTMsCi0gICAgMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA0NiwyMjUsMjI3LDI0NSwyNDQsMTAxLAotICAgIDEyOSwgIDAsMjA1LCAxMywgMjEsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDIzNywyMjYsMjQyLDIyOSwKLSAgICAyNDYsMTAxLDEyOCwgIDEsIDQ0LCA5OSwgIDMsIDEzLCA0NSwgMTMsIDUyLCAxMywgODQsMjI1LDI0MiwyMzksCi0gICAgMTEwLDEyOCwgIDEsMjA3LDIzMywyNDIsIDk5LCAgMiwgMTMsIDYwLCAxMywgNjUsMjM2LDEwMSwxMjgsIDM2LAotICAgIDE5MCwyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwxMjksICAwLDIwNiwgMTMsIDc2LDI0MywyMzcsMjI1LDIzNiwKLSAgICAxMDgsMTI4LDI0NywyMzgsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsICA2LDEwMCwgIDMsCi0gICAgIDEzLDEwMiwgMTMsMTEyLCAxMywxNTUsMjI2LDIzNiwyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwgIDIsICA4LAotICAgIDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMzEsICAwLDIwNywgMTMsMTI4LCAxMywxMzYsIDEzLDE0NywKLSAgICAyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsIDQ2LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksCi0gICAgMTI4LCAgNCwyMjgsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDIzOSwyMzksMTE2LDEzMCwgIDEsIDQ4LAotICAgICAxMywxNjQsIDEzLDE3MywyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsICAxLCA0OCwyMjYsMjI5LDIzNiwKLSAgICAyMzksMTE5LDEyOCwgMzAsMjAyLDEwMSwgIDIsIDEzLDE4NywgMTMsMjAzLDIyNiwyNDIsMjI5LDI0NiwyMjksCi0gICAgMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDIxNCwyMjcsMjQ5LDI0MiwyMzMsMjM2LAotICAgIDIzNiwyMzMsIDk5LDEyOCwgIDQsIDIxLDIzMCwyNDIsMjI1LDIzNSwyNDQsMjQ1LDExNCwxMjgsIDMzLCAxNywKLSAgICAyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOSwgIDAsMjA0LCAxMywyMzQsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsCi0gICAgMjQ3LDIzNiwyMzIsMjM5LDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDIwMCwxMDUsICAzLAotICAgICAxNCwgIDYsIDE0LCAxNywgMTQsIDMyLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKLSAgICAgMjQsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LDIyNiwyNDIsMjI5LDI0NiwxMDEsMTI4LCAgMiwgMTAsCi0gICAgMjQzLDIzMiwyMzksMjQyLDI0NCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDI1LAotICAgIDEwOSwgIDIsIDE0LCA1NCwgMTQsIDc1LDIyNSwyMjcsMjQyLDIzOSwxMTAsMTI5LCAgMSwgNDIsIDE0LCA2NCwKLSAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjI2LDIzOSwyMzgsMjM5LDI0MywyNDAsCi0gICAgMjI1LDIyNywxMDEsMTI4LDI1NSwgNDEsMjM4LDIzMywyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLAotICAgIDEyOCwgIDUsIDU5LDExMSwgIDMsIDE0LDEwNywgMTQsMTE4LCAxNCwxMjYsMjI3LDI0OSwyNDIsMjMzLDIzNiwKLSAgICAyMzYsMjMzLCA5OSwxMjgsICA0LCAgMSwyMzEsMjM5LDIzOCwyMjksMTA3LDEyOCwgIDEsIDQ2LDI0NCwgOTcsCi0gICAgMTMxLCAgMywxNTMsIDE0LDEzNywgMTQsMTQ3LCAxNCwxNTgsMjI1LDIzMCwyNDIsMjMzLDIyNywyMjUsMTEwLAotICAgIDEyOCwgIDEsMTUwLDIyOCwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTI4LCAgMywxNzAsMjQ0LDIzOSwKLSAgICAyMzgsMjM5LDExNSwxMjgsICAzLDEzOCwxMTUsICAyLCAxNCwxNzIsIDE0LDE3OSwyMzcsMjI1LDIzNiwxMDgsCi0gICAgMTI4LDI0NywxMDUsMjQ0LDI0MiwyMzksMjM1LDEwMSwxMjgsICAxLDE1MSwyNDQsMjMzLDIzNiwyMjgsMTAxLAotICAgIDEyOSwgIDEsIDQwLCAxNCwxOTcsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCA0NCwyNTAsMjMyLDIzMywKLSAgICAyNDQsMjQzLCA5NywgIDIsIDE0LDIxNiwgMTQsMjI3LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksCi0gICAgMTI4LCAgNCwxMTYsMjI4LDIyNiwyMzYsMjMxLDI0MiwyMjUsMjQ2LDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LAotICAgIDIzNiwyMzMsIDk5LDEyOCwgIDQsMTE4LCA3NCwxMzQsICAwLCA3NCwgMTUsICA2LCAxNSwgMTgsIDE1LCA0MSwKLSAgICAgMTUsIDUzLCAxNSwgNjcsIDE1LCA3OSwyMjUsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsCi0gICAgICA1LCA2NSwyMjcsMjMzLDI0MiwgOTksICAyLCAxNSwgMjcsIDE1LCAzMiwyMzYsMTAxLDEyOCwgMzYsMTkxLAotICAgIDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOCwgIDEsIDUyLDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwKLSAgICAyMzMsIDk5LDEyOCwgIDQsICA4LDIzMiwyMjksMjMyLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsCi0gICAgMTI4LCAgNSwgNzUsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNDIsMjQzLAotICAgIDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDEwNiwgNzUsMTQwLCAgMCwgNzUsIDE1LDExNSwgMTUsMTI1LCAxNSwKLSAgICAxMzUsIDE2LCAxOCwgMTYsIDY1LCAxNiwgNzYsIDE2LDEwNiwgMTYsMTQzLCAxNiwxNTYsIDE2LDE2OCwgMTYsCi0gICAgMTgwLCAxNiwyMDgsMTk0LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTMzLDIwMywyNDMsMjQxLAotICAgIDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDIwNSwgOTcsICA3LCAxNSwxNTEsIDE1LDE2OSwgMTUsMTkxLCAxNSwKLSAgICAyMTEsIDE1LDIyNiwgMTUsMjMyLCAxNSwyNDksMjI2LDIyNSwyNDMsMjMyLDIzNSwyMzMsMjQyLDIyNywyNDksCi0gICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNjAsIDk5LCAgMiwgMTUsMTc1LCAxNSwxODEsMjQ1LAotICAgIDI0NCwxMDEsMTI4LCAzMCwgNDgsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDI2LDIyOCwKLSAgICAyMjksMjQzLDIyNywyMjksMjM4LDIyOCwyMjksMjQyLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksCi0gICAgMTI4LCAgNCwxNTQsMjMyLDIzOSwyMzksMjM1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LAotICAgICAgNCwxOTUsMjQwLDI0MCwgOTcsMTI4LCAgMywxNTQsMjQzLDI0NCwyNDIsMjM5LDIzNSwyMjksMjI3LDI0OSwKLSAgICAyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE1OCwyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsCi0gICAgMjM2LDI0MywyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LAotICAgICAgNCwxNTYsIDk5LCAgNCwgMTYsIDI4LCAxNiwgMzUsIDE2LCA0NCwgMTYsIDUyLDIyNSwyNDIsMjM5LDExMCwKLSAgICAxMjgsICAxLDIzMiwyMjksMjI4LDIzMywyMzYsMjM2LCA5NywxMjgsICAxLCA1NCwyMzMsMjQyLDIyNywyMzYsCi0gICAgMTAxLDEyOCwgMzYsMTkyLDIzOSwyMzcsMjM3LDIyNSwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsICAxLAotICAgICA1NCwyMjgsMjM5LDI0NCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDUwLDEwMSwgIDIsIDE2LCA4MiwKLSAgICAgMTYsIDk0LDIzMiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDg0LDIzOCwyMjUsCi0gICAgMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDYzLDEwNCwgIDMsIDE2LDExNCwgMTYsMTI2LAotICAgICAxNiwxMzcsMjI1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgMzcsMjI5LDIzMywKLSAgICAyMjcsMjM5LDI0MCwyNDQsMjMzLCA5OSwxMjgsICAzLDIzMCwyMzksMjM5LDEwNywxMjgsICAxLDE1MiwyMzQsCi0gICAgMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgMTIsMjM2LDIzMywyMzgsMjI5LAotICAgIDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgNTIsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywKLSAgICAxMDEsMTI4LDI1NSwgNDMsMjM5LDI0MCwyNDAsIDk3LCAgMiwgMTYsMTg5LCAxNiwyMDAsMjI3LDI0OSwyNDIsCi0gICAgMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDEyOCwyMzEsMjQyLDIyOSwyMjksMTA3LDEyOCwgIDMsMjIyLAotICAgIDExNSwgIDIsIDE2LDIxNCwgMTYsMjI2LDIzMywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsMTEwLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDEwNywgNzYsMTM4LCAgMCwgNzYsIDE3LCAgMSwgMTcsCi0gICAgICA1LCAxNywgIDksIDE3LCAyOSwgMTcsIDk1LCAxNywxMzMsIDE3LDE0NywgMTcsMTY1LCAxNywxNzcsIDE3LAotICAgIDE4OSwgNzQsMTI4LCAgMSwxOTksIDc2LDEyOCwyNDYsMTkxLCA5NywgIDIsIDE3LCAxNSwgMTcsIDIyLDIyNywKLSAgICAyNDUsMjQ0LDEwMSwxMjgsICAxLCA1NywyMzcsMjI2LDIyOCwgOTcsMTI4LCAgMywxNTUsIDk5LCAgNCwgMTcsCi0gICAgIDM5LCAxNywgNDYsIDE3LCA1NSwgMTcsIDgyLDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLCA2MSwyMjksMjI4LAotICAgIDIzMywyMzYsMjM2LCA5NywxMjgsICAxLCA1OSwyMzMsMjQyLCA5OSwgIDIsIDE3LCA2MywgMTcsIDY4LDIzNiwKLSAgICAxMDEsMTI4LCAzNiwxOTMsMjQ1LDIzNywyMzAsMjM2LDIyOSwyNDgsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsCi0gICAgIDMwLCA2MCwyMzksMjM3LDIzNywyMjUsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAgMSwgNTksMjI4LAotICAgIDIzOSwxMTYsMTMwLCAgMSwgNjMsIDE3LDEwNSwgMTcsMTE0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwKLSAgICAgIDEsIDYzLDIyNiwyMjksMjM2LDIzOSwxMTksMTI5LCAzMCwgNTQsIDE3LDEyNCwyMzcsMjI1LDIyNywyNDIsCi0gICAgMjM5LDExMCwxMjgsIDMwLCA1NiwyMzMsMjQ3LDIzOCwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLAotICAgIDEyOCwgIDUsIDYwLDEwNiwxMjksICAxLDIwMCwgMTcsMTUzLDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwKLSAgICAyMzMsIDk5LDEyOCwgIDQsICA5LDIzNiwyMzMsMjM4LDIyOSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsCi0gICAgIDU4LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDQ0LDExNSwgIDIsIDE3LAotICAgIDE5NSwgMTcsMjEyLDIzNiwyMjUsMjQzLDEwNCwxMjksICAxLCA2NSwgMTcsMjA0LDI0MywyMzcsMjI1LDIzNiwKLSAgICAxMDgsMTI4LDI0NiwyNDksMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTA4LCA3NywxMzcsICAwLCA3NywgMTcsCi0gICAgMjQxLCAxNywyNTEsIDE4LCAyNCwgMTgsIDMzLCAxOCwgNTgsIDE4LCA3MSwgMTgsIDgzLCAxOCwgOTEsIDE4LAotICAgIDEwMCwxOTQsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxMzQsMjI1LCA5OSwgIDIsIDE4LCAgMiwKLSAgICAgMTgsIDE4LDI0MiwyMzksMTEwLDEyOSwyNDYsMjA4LCAxOCwgMTAsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsCi0gICAgMjQ3LDE3NSwyNDUsMjQ0LDEwMSwxMjgsIDMwLCA2MiwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM2LAotICAgIDE5NCwyMjgsMjM5LDExNiwgIDIsIDE4LCA0MSwgMTgsIDUwLDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwKLSAgICAgMzAsIDY0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgNjYsMjI5LDIzOCwyMjUsMjQyLDIzNywyMjksCi0gICAgMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDY4LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLAotICAgIDEyOCwyNTUsIDQ1LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxMDksMjQ0LDI0NSwyNDIsMjM4LDIyOSwKLSAgICAxMDAsMTI4LCAgMSwxNTYsMTE3LDEyOCwgIDMsMTU2LCA3OCwxNDEsICAwLCA3OCwgMTgsMTM0LCAxOCwxMzgsCi0gICAgIDE4LDE0NiwgMTgsMjEyLCAxOCwyMzcsIDE4LDI0OCwgMTksICAzLCAxOSwgMjEsIDE5LCAzMywgMTksIDQ1LAotICAgICAxOSwgNTgsIDE5LCA2NiwgMTksIDg0LCA3NCwxMjgsICAxLDIwMiwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwKLSAgICAgIDEsIDY3LCA5OSwgIDQsIDE4LDE1NiwgMTgsMTYzLCAxOCwxNzIsIDE4LDE5OSwyMjUsMjQyLDIzOSwxMTAsCi0gICAgMTI4LCAgMSwgNzEsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI4LCAgMSwgNjksMjMzLDI0MiwgOTksICAyLAotICAgICAxOCwxODAsIDE4LDE4NSwyMzYsMTAxLDEyOCwgMzYsMTk1LDI0NSwyMzcsMjMwLDIzNiwyMjksMjQ4LDIyNiwKLSAgICAyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgNzQsMjM5LDIzNywyMzcsMjI1LDIyNSwyMjcsMjI3LDIyOSwyMzgsCi0gICAgMTE2LDEyOCwgIDEsIDY5LDIyOCwyMzksMTE2LCAgMiwgMTgsMjIwLCAxOCwyMjksMjI1LDIyNywyMjcsMjI5LAotICAgIDIzOCwxMTYsMTI4LCAzMCwgNjgsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCA3MCwyMzIsMjM5LDIzOSwKLSAgICAyMzUsMjM2LDIyOSwyMzAsMTE2LDEyOCwgIDEsMTU3LDIzMywyMzgsMjI5LDI0MiwyMzksMjM3LDIyNSwxMTAsCi0gICAgMTI4LCAzMywxMDQsMTA2LDEyOSwgIDEsMjAzLCAxOSwgIDksMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LAotICAgIDIzMywgOTksMTI4LCAgNCwgMTAsMjM2LDIzMywyMzgsMjI5LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwKLSAgICAgNzIsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNDYsMjM5LDI0NywyMjUsCi0gICAgMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDcwLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LAotICAgIDI0NywxMTAsMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjksICAwLDIwOSwgMTksIDc2LDI0MywyMzcsMjI1LDIzNiwKLSAgICAxMDgsMTI4LDI0NywyNDEsMTE3LDEyOCwgIDMsMTU3LCA3OSwxNDEsICAwLCA3OSwgMTksMTE4LCAxOSwxMzIsCi0gICAgIDE5LDE1MCwgMTksMjAzLCAyMCwgNzgsIDIwLDE1MiwgMjAsMTg3LCAyMSwgNDgsIDIxLCA2OSwgMjEsMjEzLAotICAgICAyMSwyMjMsIDIxLDI1NCwgMjIsIDUzLCA2OSwxMjksICAxLCA4MiwgMTksMTI0LDI0MywyMzcsMjI1LDIzNiwKLSAgICAxMDgsMTI4LDI0NiwyNTAsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjksICAwLDIxMSwgMTksMTQyLDI0MywyMzcsCi0gICAgMjI1LDIzNiwxMDgsMTI4LDI0NywyNDMsIDk4LCAgMiwgMTksMTU2LCAxOSwxOTYsMjI1LDI0MiwyNDIsMjI5LAotICAgIDEwMCwgIDIsIDE5LDE2NiwgMTksMTc3LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKLSAgICAyMzIsMjI4LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDI0MywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsCi0gICAgIDk5LDEyOCwgIDQsMjM0LDI0MiwyMjksMjQ2LDEwMSwxMjgsICAxLCA3OCwgOTksICA0LCAxOSwyMTMsIDE5LAotICAgIDIyMCwgMTksMjM1LCAyMCwgNjgsMjI1LDI0MiwyMzksMTEwLDEyOCwgIDEsMjA5LDIyOSwyMzgsMjQ0LDIyOSwKLSAgICAyNDIsMjI5LDIyOCwyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwgIDEsMTU5LDIzMywyNDIsIDk5LCAgMiwgMTksCi0gICAgMjQzLCAxOSwyNDgsMjM2LDEwMSwxMjgsIDM2LDE5NiwyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwxMzQsICAwLAotICAgIDIxMiwgMjAsIDEzLCAyMCwgMjEsIDIwLCAzMiwgMjAsIDQwLCAyMCwgNTIsIDIwLCA2MCwyMjUsMjI3LDI0NSwKLSAgICAyNDQsMTAxLDEyOCwgMzAsMjA4LDIyOCwyMzksMjQ0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwyMTYsCi0gICAgMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLDIxMCwyMzIsMjM5LDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LAotICAgIDEwMSwxMjgsIDMwLDIxMiwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMjQ0LDI0NCwyMzMsMjM2LDIyOCwKLSAgICAxMDEsMTI4LCAzMCwyMTQsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDMwLDEwMCwgIDMsCi0gICAgIDIwLCA4NiwgMjAsMTA5LCAyMCwxNDIsMjI2LDEwOCwgIDIsIDIwLCA5MywgMjAsMTAxLDIyNSwyMjcsMjQ1LAotICAgIDI0NCwxMDEsMTI4LCAgMSwgODAsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAyLCAxMiwyMzMsMjI5LDI0MiwKLSAgICAyMjksMjQzLDIzMywxMTUsMTMwLCAgMCwyMTQsIDIwLDEyMywgMjAsMTM0LDIyNywyNDksMjQyLDIzMywyMzYsCi0gICAgMjM2LDIzMywgOTksMTI4LCAgNCwyMzAsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI0NiwyMzksMjQ0LAotICAgIDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwyMDQsMTAzLCAgMiwgMjAsMTU4LCAyMCwxNzAsMjM5LDIzOCwKLSAgICAyMjksMjM1LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NiwyNTEsMjQyLDIyNSwyNDYsMTAxLDEyOSwgIDAsCi0gICAgMjEwLCAyMCwxNzksMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI0MiwxMDQsICA0LCAyMCwxOTcsIDIwLAotICAgIDIwOCwgMjAsMjEyLCAyMSwgMzQsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA4NSwKLSAgICAxMDksMTI4LCAzMywgMzgsMTExLCAgMiwgMjAsMjE4LCAyMCwyMjgsMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsCi0gICAgMTAxLDEyOCwgMzAsMjA2LDI0MiwxMTAsMTMzLCAgMSwxNjAsIDIwLDI0MywgMjAsMjUxLCAyMSwgIDYsIDIxLAotICAgICAxNCwgMjEsIDI2LDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwyMTgsMjI4LDIzOSwyNDQsMjI2LDIyOSwKLSAgICAyMzYsMjM5LDExOSwxMjgsIDMwLDIyNiwyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwgMzAsMjIwLDIzMiwyMzksCi0gICAgMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMjIyLDI0NCwyMzMsMjM2LDIyOCwxMDEsMTI4LAotICAgICAzMCwyMjQsMjQ1LDIzOCwyMzEsMjI1LDI0MiwyNDUsMjM3LDIzNiwyMjUsMjQ1LDExNiwxMjgsICAxLCA4MCwKLSAgICAxMDUsMTI5LCAgMSwxNjIsIDIxLCA1NCwyMzgsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwyMjgsMjI2LDI0MiwyMjksCi0gICAgMjQ2LDEwMSwxMjgsICAyLCAxNCwxMDksICA0LCAyMSwgNzksIDIxLDEwNywgMjEsMTg0LCAyMSwyMDIsMjI1LAotICAgIDIyNywyNDIsMjM5LDExMCwxMzAsICAxLCA3NiwgMjEsIDkxLCAyMSwgOTksMjI1LDIyNywyNDUsMjQ0LDEwMSwKLSAgICAxMjgsIDMwLCA4MiwyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwgMzAsIDgwLDIyOSwyMzEsIDk3LDEzMiwgMzMsCi0gICAgIDM4LCAyMSwxMjEsIDIxLDEzMiwgMjEsMTQwLCAyMSwxNTYsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLAotICAgICA5OSwxMjgsICA0LCA5NiwyMzEsMjQyLDIyOSwyMjksMTA3LDEyOCwgIDMsMTY5LDI0MiwyMzksMjQ1LDIzOCwKLSAgICAyMjgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDEyMiwxMTYsICAyLCAyMSwxNjIsCi0gICAgIDIxLDE3NywyMzMsMjQ0LDIzNiwyMzksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgIDEyNCwyMzksMjM4LDIzOSwxMTUsMTI4LCAgMywxNDMsMjMzLDIyNywyNDIsMjM5LDExMCwxMjksICAzLDE1OSwKLSAgICAgMjEsMTk0LDI0NCwyMzksMjM4LDIzOSwxMTUsMTI4LCAgMywxNDAsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsCi0gICAgMjI3LDEwMSwxMjgsMjU1LCA0NywyMzgsMjI5LDI0MiwyMzksMjM3LDIyNSwxMTAsMTI4LCAzMywgOTYsMTExLAotICAgICAgMiwgMjEsMjI5LCAyMSwyNDgsMjMxLDIzOSwyMzgsMjI5LDEwNywxMjksICAxLDIzNCwgMjEsMjM5LDIzNywKLSAgICAyMjUsMjI3LDI0MiwyMzksMTEwLDEyOCwgIDEsMjM2LDI0MCwyMjksMTEwLDEyOCwgIDEsMTM0LDExNSwgIDMsCi0gICAgIDIyLCAgNiwgMjIsIDMzLCAyMiwgNDAsMjM2LDIyNSwyNDMsMTA0LDEzMCwgIDAsMjE2LCAyMiwgMTcsIDIyLAotICAgICAyNSwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgIDEsMjU0LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywKLSAgICAyNDgsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTExLDI0NCwyNDIsMjM5LDIzNSwyMjksMjI1LDIyNywyNDUsCi0gICAgMjQ0LDEwMSwxMjgsICAxLDI1NCwxMTYsICAyLCAyMiwgNTksIDIyLCA3MCwyMjcsMjQ5LDI0MiwyMzMsMjM2LAotICAgIDIzNiwyMzMsIDk5LDEyOCwgIDQsMTI2LDIzMywyMzYsMjI4LDEwMSwxMzEsICAwLDIxMywgMjIsIDgzLCAyMiwKLSAgICAgOTEsIDIyLDEwMiwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsIDc2LDIyOCwyMzMsMjI5LDI0MiwyMjksCi0gICAgMjQzLDIzMywxMTUsMTI4LCAzMCwgNzgsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI0NSwgODAsMTM2LAotICAgICAgMCwgODAsIDIyLDEzMCwgMjIsMTM4LCAyMiwxNDcsIDIyLDE1OSwgMjIsMjExLCAyMiwyMjcsIDIyLDI0NiwKLSAgICAgMjMsICAyLDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwgODQsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsCi0gICAgMTI4LCAzNiwxOTcsMjI4LDIzOSwyNDQsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAzMCwgODYsMTAxLAotICAgICAgMywgMjIsMTY3LCAyMiwxNzgsIDIyLDE5MCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsIDMxLDIzMiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDc0LDIzNywyMzMsCi0gICAgMjI4LDIyOCwyMzYsMjI5LDIzMiwyMzksMjM5LDIzNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAotICAgIDEyOCwgIDQsMTY2LDEwNCwgIDIsIDIyLDIxNywgMjIsMjIxLDEwNSwxMjgsICAzLDE2NiwyMzksMjM5LDEwNywKLSAgICAxMjgsICAxLDE2NCwxMDUsMTI5LCAgMywxNjAsIDIyLDIzMywyNDcsMjQyLDIyNSwyNDIsMjM3LDIyOSwyMzgsCi0gICAgMjMzLDIyNSwxMTAsMTI4LCAgNSwgODMsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LAotICAgIDI1NSwgNDgsMTE1LCAgMiwgMjMsICA4LCAyMywgMjUsMTA1LDEyOSwgIDMsMTY4LCAyMywgMTQsMjI3LDI0OSwKLSAgICAyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDExMiwyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxMTIsCi0gICAgIDgxLDEzMSwgIDAsIDgxLCAyMywgNDIsIDIzLCA1MSwgMjMsIDYzLDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLAotICAgIDEyOCwgMzYsMTk4LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDQ5LDI0MywKLSAgICAyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxMTMsIDgyLDEzOCwgIDAsIDgyLCAyMywgOTUsIDIzLDExOSwgMjMsCi0gICAgMTY2LCAyMywyMTcsIDIzLDIzMCwgMjMsMjQwLCAyMywyNDUsIDI0LCAxOSwgMjQsIDMxLCAyNCwgNDMsIDk3LAotICAgICAgMiwgMjMsMTAxLCAyMywxMTIsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA3NiwKLSAgICAyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMSwgODQsIDk5LCAgNCwgMjMsMTI5LCAyMywxMzYsIDIzLDE0NSwgMjMsCi0gICAgMTUzLDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLCA4OCwyMjksMjI4LDIzMywyMzYsMjM2LCA5NywxMjgsICAxLAotICAgICA4NiwyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMTk5LDIzOSwyMzcsMjM3LDIyNSwyMjUsMjI3LDIyNywKLSAgICAyMjksMjM4LDExNiwxMjgsICAxLCA4NiwxMDAsICAyLCAyMywxNzIsIDIzLDE4MiwyMjYsMjM2LDIzMSwyNDIsCi0gICAgMjI1LDI0NiwxMDEsMTI4LCAgMiwgMTYsMjM5LDExNiwgIDIsIDIzLDE4OSwgMjMsMTk4LDIyNSwyMjcsMjI3LAotICAgIDIyOSwyMzgsMTE2LDEyOCwgMzAsIDg4LDIyNiwyMjksMjM2LDIzOSwxMTksMTI5LCAzMCwgOTAsIDIzLDIwOCwKLSAgICAyMzcsMjI1LDIyNywyNDIsMjM5LDExMCwxMjgsIDMwLCA5MiwyMjksMjMyLDIyNSwyNDIsMjM3LDIyOSwyMzgsCi0gICAgMjMzLDIyNSwxMTAsMTI4LCAgNSwgODAsMjMwLDI0MiwyMjUsMjM1LDI0NCwyNDUsMTE0LDEyOCwgMzMsIDI4LAotICAgIDIzMiwxMTEsMTI4LCAgMywxNjEsMjMzLDExMCwgIDIsIDIzLDI1MiwgMjQsICA1LDIzMSwyNDMsMjM3LDIyNSwKLSAgICAyMzYsMTA4LDEyOCwyNDYsMjUyLDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LDIyNiwyNDIsMjI5LDI0NiwxMDEsCi0gICAgMTI4LCAgMiwgMTgsMjM2LDIzMywyMzgsMjI5LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgOTQsMjM3LAotICAgIDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNTAsMjQzLDIzNywyMjUsMjM2LDEwOCwKLSAgICAxMjksMjQ3LDExNCwgMjQsIDUzLDIzMywyMzgsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwxMDAsMTI5LCAgMiwxMjksCi0gICAgIDI0LCA2NiwyNDMsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgIDIsMTgyLCA4MywxMzksICAwLAotICAgICA4MywgMjQsMTAzLCAyNiwgMTcsIDI2LCA1NSwgMjYsMTgyLCAyNiwyMjEsIDI2LDI1MCwgMjcsIDg0LCAyNywKLSAgICAxMDUsIDI3LDExNywgMjcsMTM1LCAyNywxNDMsIDcwLCAgNiwgMjQsMTE3LCAyNCwyMDksIDI0LDI0MSwgMjUsCi0gICAgIDc3LCAyNSwxMTksIDI1LDIyMSwgNDgsICA5LCAyNCwxMzcsIDI0LDE0NSwgMjQsMTUzLCAyNCwxNjEsIDI0LAotICAgIDE2OSwgMjQsMTc3LCAyNCwxODUsIDI0LDE5MywgMjQsMjAxLDE3NywxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywKLSAgICAgMTIsMTc4LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCAyMCwxNzksMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsCi0gICAgIDE2LDE4MCwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgMjQsMTgxLDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LAotICAgICA2MCwxODIsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsIDQ0LDE4MywxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywKLSAgICAgNTIsMTg0LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCAyOCwxODUsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsCi0gICAgIDM2LCA0OSwgIDMsIDI0LDIxNywgMjQsMjI1LCAyNCwyMzMsMTc2LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LAotICAgICAgMCwxNzcsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsICAyLDE4NSwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywKLSAgICAgOTcsIDUwLCAgOSwgMjUsICA1LCAyNSwgMTMsIDI1LCAyMSwgMjUsIDI5LCAyNSwgMzcsIDI1LCA0NSwgMjUsCi0gICAgIDUzLCAyNSwgNjEsIDI1LCA2OSwxNzYsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsIDk4LDE3NywxNzYsMTc2LAotICAgIDE3NiwgNDgsMTI4LCAzNywgODYsMTc4LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCA4NSwxNzksMTc2LDE3NiwKLSAgICAxNzYsIDQ4LDEyOCwgMzcsIDk5LDE4MCwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgODEsMTgxLDE3NiwxNzYsCi0gICAgMTc2LCA0OCwxMjgsIDM3LCA4NywxODIsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsIDkzLDE4MywxNzYsMTc2LAotICAgIDE3NiwgNDgsMTI4LCAzNywgOTIsMTg0LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCA5MSwgNTEsICA0LCAyNSwKLSAgICAgODcsIDI1LCA5NSwgMjUsMTAzLCAyNSwxMTEsMTgyLDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCA5NCwxODMsCi0gICAgMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsIDk1LDE4NCwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgOTAsMTg1LAotICAgIDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCA4NCwgNTIsIDEwLCAyNSwxNDEsIDI1LDE0OSwgMjUsMTU3LCAyNSwKLSAgICAxNjUsIDI1LDE3MywgMjUsMTgxLCAyNSwxODksIDI1LDE5NywgMjUsMjA1LCAyNSwyMTMsMTc2LDE3NiwxNzYsCi0gICAgMTc2LCA0OCwxMjgsIDM3LDEwNSwxNzcsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsMTAyLDE3OCwxNzYsMTc2LAotICAgIDE3NiwgNDgsMTI4LCAzNywgOTYsMTc5LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCA4MCwxODAsMTc2LDE3NiwKLSAgICAxNzYsIDQ4LDEyOCwgMzcsMTA4LDE4MSwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywxMDMsMTgyLDE3NiwxNzYsCi0gICAgMTc2LCA0OCwxMjgsIDM3LDEwNCwxODMsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsMTAwLDE4NCwxNzYsMTc2LAotICAgIDE3NiwgNDgsMTI4LCAzNywxMDEsMTg1LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LCA4OSwgNTMsICA1LCAyNSwKLSAgICAyMzMsIDI1LDI0MSwgMjUsMjQ5LCAyNiwgIDEsIDI2LCAgOSwxNzYsMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsCi0gICAgIDg4LDE3NywxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywgODIsMTc4LDE3NiwxNzYsMTc2LCA0OCwxMjgsIDM3LAotICAgICA4MywxNzksMTc2LDE3NiwxNzYsIDQ4LDEyOCwgMzcsMTA3LDE4MCwxNzYsMTc2LDE3NiwgNDgsMTI4LCAzNywKLSAgICAxMDYsIDk3LCAgMiwgMjYsIDIzLCAyNiwgNDQsMjI3LDI0NSwyNDQsMTAxLDEyOSwgIDEsIDkwLCAyNiwgMzIsCi0gICAgMjI4LDIzOSwyNDQsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAzMCwxMDAsMjM3LDI0MCwyMzMsMjMxLAotICAgIDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDIyNCwgOTksICA1LCAyNiwgNjcsIDI2LCA5OCwgMjYsMTA3LCAyNiwKLSAgICAxNDcsIDI2LDE2OSwyMjUsMjQyLDIzOSwxMTAsMTMwLCAgMSwgOTYsIDI2LCA3OCwgMjYsIDkwLDIyOCwyMzksCi0gICAgMjQ0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsMTAyLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LAotICAgIDI0NiwyNTMsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI4LCAgMSwgOTQsMjMyLDI0NywgOTcsMTMwLCAgMSwKLSAgICAxNDMsIDI2LDExNywgMjYsMTI4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMTYsCi0gICAgMjI4LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDI0MywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAotICAgIDEyOCwgIDQsMjE4LDIzMywyNDIsIDk5LCAgMiwgMjYsMTU1LCAyNiwxNjAsMjM2LDEwMSwxMjgsIDM2LDIwMCwKLSAgICAyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwxMjgsICAxLCA5MiwyMzksMjM3LDIzNywyMjUsMjI1LDIyNywyMjcsCi0gICAgMjI5LDIzOCwxMTYsMTI4LCAgMiwgMjQsMjI4LDIzOSwxMTYsICAyLCAyNiwxOTAsIDI2LDE5OSwyMjUsMjI3LAotICAgIDIyNywyMjksMjM4LDExNiwxMjgsIDMwLCA5NiwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOSwgMzAsIDk4LCAyNiwKLSAgICAyMDksMjI4LDIzOSwyNDQsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAzMCwxMDQsMTAxLCAgMiwgMjYsCi0gICAgMjI3LCAyNiwyMzksMjMyLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNzcsMjQ2LAotICAgIDIyOSwyMzgsMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsIDMzLDEwMiwxMDQsICA1LCAyNywgIDYsIDI3LCAzNCwKLSAgICAgMjcsIDQ4LCAyNywgNTksIDI3LCA3MiwgOTcsICAyLCAyNywgMTIsIDI3LCAyMywyMjUsMjQyLDIzNywyMjksCi0gICAgMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDcxLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LAotICAgICAgNCwgNDAsMjI3LDIzMiwyMjUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA0MSwKLSAgICAyMjksMjMzLDIyNywyMzksMjQwLDI0NCwyMzMsIDk5LDEyOCwgIDMsMjI2LDIzMiwyMjUsMjI3LDI0OSwyNDIsCi0gICAgMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE4NiwyMzMsMjM3LDIyNSwyMjcsMjM5LDI0MCwyNDQsMjMzLAotICAgICA5OSwxMjgsICAzLDIzNiwxMDUsICAyLCAyNywgOTAsIDI3LCA5NiwyMzEsMjM3LCA5NywxMjgsICAzLDE2MywKLSAgICAyNDgsMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsIDMzLDEwMSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsCi0gICAgMjI3LDEwMSwxMjgsMjU1LCA1MSwyMzksMjMwLDI0NCwyNDMsMjMzLDIzMSwyMzgsMjI3LDI0OSwyNDIsMjMzLAotICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA0NCwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTE1LDI0NCwKLSAgICAyMzMsMjMxLDIzNywyMjUsMjMxLDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDIxOCwgODQsMTQxLCAgMCwgODQsCi0gICAgIDI3LDE4NiwgMjcsMTkxLCAyNywxOTcsIDI4LCAgNywgMjgsIDMyLCAyOCwgOTYsIDI4LDE0NywgMjgsMTc3LAotICAgICAyOCwxODksIDI4LDIwMSwgMjgsMjQ2LCAyOSwgIDYsIDI5LCA0NiwyMjUsMTE3LDEyOCwgIDMsMTY0LDIyNiwKLSAgICAyMjUsMTE0LDEyOCwgIDEsMTAyLCA5OSwgIDQsIDI3LDIwNywgMjcsMjE0LCAyNywyMjMsIDI3LDI1MCwyMjUsCi0gICAgMjQyLDIzOSwxMTAsMTI4LCAgMSwxMDAsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI4LCAgMSwgOTgsMjMzLAotICAgIDI0MiwgOTksICAyLCAyNywyMzEsIDI3LDIzNiwyMzYsMTAxLDEyOCwgMzYsMjAxLDI0NSwyMzcsMjMwLDIzNiwKLSAgICAyMjksMjQ4LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxMTIsMjM5LDIzNywyMzcsMjI1LDIyNSwyMjcsCi0gICAgMjI3LDIyOSwyMzgsMTE2LDEyOCwgIDEsIDk4LDIyOCwyMzksMTE2LCAgMiwgMjgsIDE1LCAyOCwgMjQsMjI1LAotICAgIDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAzMCwxMDYsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDEwOCwKLSAgICAxMDEsICA0LCAyOCwgNDIsIDI4LCA1MywgMjgsIDczLCAyOCwgODIsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCi0gICAgMjMzLCA5OSwxMjgsICA0LCAzNCwyMjgsMjI5LDI0MywyMjcsMjI5LDIzOCwyMjgsMjI5LDI0MiwyMjcsMjQ5LAotICAgIDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTcyLDIzOCwyNDIsMjM5LDIzNywyMjUsMTEwLDEyOCwKLSAgICAgMzMsMTA1LDI0NCwyNDMsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxODAsCi0gICAgMTA0LCAgMywgMjgsMTA0LCAyOCwxMTAsIDI4LDEzNiwyMjksMjQ0LCA5NywxMjgsICAzLDE1MiwxMTEsICAyLAotICAgICAyOCwxMTYsIDI4LDEyMSwyMzksMTA3LDEyOCwgIDEsMTcyLDI0MiwxMTAsMTI5LCAgMCwyMjIsIDI4LDEyOCwKLSAgICAyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMjU0LDI0MiwyMjksMjI5LDI0MiwyMzksMjM3LDIyNSwxMTAsCi0gICAgMTI4LCAzMywgOTgsMTA1LCAgMiwgMjgsMTUzLCAyOCwxNjQsMjM2LDIyOCwyMjksMjQzLDIzNywyMjUsMjM2LAotICAgIDEwOCwxMjgsMjQ2LDI1NCwyNDcsMjM4LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwKLSAgICAgNzksMjM2LDIzMywyMzgsMjI5LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxMTAsMjM3LDIzOSwyMzgsCi0gICAgMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNTIsMTExLCAgMiwgMjgsMjA3LCAyOCwyMTgsMjI1LAotICAgIDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA1NywyMzgsMTAxLCAgMywgMjgsMjI3LCAyOCwKLSAgICAyMzQsIDI4LDI0MCwyMzAsMjMzLDI0NiwxMDEsMTI4LCAgMSwxODgsMjQzLDIzMywxMjAsMTI4LCAgMSwxMzIsCi0gICAgMjQ0LDI0NywxMTEsMTI4LCAgMSwxNjcsMjQyLDIyOSwyNDQsMjQyLDIzOSwyMzAsMjM2LDIyOSwyNDgsMjMyLAotICAgIDIzOSwyMzksMTA3LDEyOCwgIDEsMTc0LDExNSwgIDMsIDI5LCAxNCwgMjksIDI2LCAyOSwgMzksMjI5LDIyNywKLSAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgMzgsMjMyLDIyOSwyMjcsMjQ5LDI0MiwyMzMsCi0gICAgMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDExLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDExNiwxMTksICAyLAotICAgICAyOSwgNTIsIDI5LCA2NCwyMjksMjM2LDI0NiwyMjksMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsIDMzLDEwNywKLSAgICAyMzksMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsIDMzLCA5NywgODUsMTQyLCAgMCwgODUsIDI5LDEwNSwgMjksCi0gICAgMTIzLCAyOSwxMzEsIDI5LDE5OCwgMzAsIDY5LCAzMCwgODcsIDMwLDE5OCwgMzAsMjE0LCAzMCwyMjYsIDMxLAotICAgICAyMSwgMzEsIDMwLCAzMSwxNDIsIDMxLDE0OSwgMzEsMjE5LDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI5LCAgMCwKLSAgICAyMTgsIDI5LDExNSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMjUwLDIyNiwyNDIsMjI5LDI0NiwxMDEsCi0gICAgMTI4LCAgMSwxMDgsIDk5LCAgMywgMjksMTM5LCAyOSwxNDYsIDI5LDE4OCwyMjUsMjQyLDIzOSwxMTAsMTI4LAotICAgICAgMSwyMTEsMjMzLDI0MiwgOTksICAyLCAyOSwxNTQsIDI5LDE1OSwyMzYsMTAxLDEyOCwgMzYsMjAyLDI0NSwKLSAgICAyMzcsMjMwLDIzNiwyMjksMTIwLDEzMCwgIDAsMjE5LCAyOSwxNzIsIDI5LDE4MCwyMjYsMjI5LDIzNiwyMzksCi0gICAgMTE5LDEyOCwgMzAsMTE4LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywyNTEsMjQ5LDI0MiwyMzMsMjM2LAotICAgIDIzNiwyMzMsIDk5LDEyOCwgIDQsIDM1LDEwMCwgIDMsIDI5LDIwNiwgMjksMjI5LCAzMCwgNTksMjI2LDEwOCwKLSAgICAgIDIsIDI5LDIxMywgMjksMjIxLDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMSwxMTIsMjMxLDI0MiwyMjUsCi0gICAgMjQ2LDEwMSwxMjgsICAyLCAyMCwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTM0LCAgMCwyMjAsIDI5LAotICAgIDI1MSwgMzAsICAzLCAzMCwgMTEsIDMwLCAzNCwgMzAsIDQyLCAzMCwgNTEsMjI1LDIyNywyNDUsMjQ0LDEwMSwKLSAgICAxMjgsICAxLDIxNSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTE0LCA5OSwgIDIsIDMwLCAxNywgMzAsCi0gICAgIDI0LDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLDIxNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LAotICAgICAgNCwyNDAsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAxLDIxOSwyMzcsMjI1LDIyNywyNDIsMjM5LDExMCwKLSAgICAxMjgsICAxLDIxMywyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMjUyLDIzOSwyNDQsMjI2LDIyOSwyMzYsCi0gICAgMjM5LDExOSwxMjgsIDMwLDIyOCwyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOSwgIDAsMjE3LCAzMCwgNzksMjQzLAotICAgIDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDI0OSwxMDQsICAyLCAzMCwgOTMsIDMwLDE3MSwxMTEsICAyLCAzMCwKLSAgICAgOTksIDMwLDEwOSwyMzksMjM1LDIyNSwyMjYsMjM5LDI0NiwxMDEsMTI4LCAzMCwyMzAsMjQyLDExMCwxMzMsCi0gICAgICAxLDE3NSwgMzAsMTI0LCAzMCwxMzIsIDMwLDE0MywgMzAsMTUxLCAzMCwxNjMsMjI1LDIyNywyNDUsMjQ0LAotICAgIDEwMSwxMjgsIDMwLDIzMiwyMjgsMjM5LDI0NCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMjQwLDIzMSwKLSAgICAyNDIsMjI1LDI0NiwxMDEsMTI4LCAzMCwyMzQsMjMyLDIzOSwyMzksMjM1LDIyNSwyMjYsMjM5LDI0NiwxMDEsCi0gICAgMTI4LCAzMCwyMzYsMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjgsIDMwLDIzOCwyNDUsMjM4LDIzMSwyMjUsMjQyLAotICAgIDI0NSwyMzcsMjM2LDIyNSwyNDUsMTE2LDEyOSwgIDEsMTEyLCAzMCwxODcsMjI3LDI0OSwyNDIsMjMzLDIzNiwKLSAgICAyMzYsMjMzLCA5OSwxMjgsICA0LDI0MiwyMzMsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksMjI4LDIyNiwyNDIsCi0gICAgMjI5LDI0NiwxMDEsMTI4LCAgMiwgMjIsMjM1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LAotICAgICAgNCwxMjAsMTA5LCAgMiwgMzAsMjMyLCAzMSwgMTAsMjI1LDIyNywyNDIsMjM5LDExMCwxMzAsICAxLDEwNiwKLSAgICAgMzAsMjQ0LCAzMCwyNTUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDIzOCwyMjgsCi0gICAgMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEyOCwgMzAsMTIyLDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LAotICAgIDIyNywxMDEsMTI4LDI1NSwgNTMsMjM5LDIzMSwyMzksMjM4LDIyOSwxMDcsMTI4LCAgMSwxMTQsMjQwLDI0MywKLSAgICAyMzMsMjM2LDIzOSwxMTAsMTMzLCAgMywxNjUsIDMxLCA0OSwgMzEsIDUzLCAzMSwgOTAsIDMxLDEyMSwgMzEsCi0gICAgMTM0LCA0OSwxMjgsICAzLDIxMCwgOTcsICAyLCAzMSwgNTksIDMxLCA4MSwyMjcsMjQ1LDI0NCwyMjksMjMyLAotICAgIDIzOSwyMzksMjM1LDI0MywyNDksMjM3LDIyNiwyMzksMjM2LDIzMSwyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywKLSAgICAyMTEsMjMwLDI0MiwyMzMsMjI3LDIyNSwxMTAsMTI4LCAgMSwxNzcsMjI4LDIzMywyMjksMjQyLDIyOSwyNDMsCi0gICAgMjMzLDExNSwxMjksICAzLDE3MSwgMzEsMTAzLDIzMiwyMzksMjM5LDIzNSwyNDMsMjQ5LDIzNywyMjYsMjM5LAotICAgIDIzNiwyMzEsMjQyLDIyOSwyMjksMTA3LDEyOCwgIDMsMjEyLDIzMiwyMzksMjM5LDIzNSwyNDMsMjQ5LDIzNywKLSAgICAyMjYsMjM5LDEwOCwxMjgsICAzLDIxMCwyNDQsMjM5LDIzOCwyMzksMTE1LDEyOCwgIDMsMTQyLDI0MiwyMzMsCi0gICAgMjM4LDEwMywxMjgsICAxLDExMCwxMTUsICAzLCAzMSwxNTcsIDMxLDE3MiwgMzEsMTc5LDIzMiwyMzksMjQyLAotICAgIDI0NCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDE0LDIzNywyMjUsMjM2LDEwOCwKLSAgICAxMjgsMjQ3LDExNywyNDQsMjQyLDIyNSwyMzMsMjMxLDIzMiwxMTYsICAyLCAzMSwxOTEsIDMxLDIwMiwyMjcsCi0gICAgMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTc0LDI0MywyNDQsMjQyLDIzOSwyMzUsMjI5LAotICAgIDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNzYsMjQ0LDIzMywyMzYsMjI4LDEwMSwKLSAgICAxMzAsICAxLDEwNCwgMzEsMjMxLCAzMSwyMzksMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLDEyMCwyMjYsCi0gICAgMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTE2LCA4NiwxMzYsICAwLCA4NiwgMzIsIDExLCAzMiwgMjAsIDMyLAotICAgICAzMSwgMzIsIDYwLCAzMiwgNjcsIDMyLCA3OSwgMzIsIDkxLCAzMiwgOTksMjI3LDIzMywyNDIsMjI3LDIzNiwKLSAgICAxMDEsMTI4LCAzNiwyMDMsMjI4LDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDEyNiwxMDEsCi0gICAgICAyLCAzMiwgMzcsIDMyLCA0OCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDE4LAotICAgIDI0NywyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDc4LDIzMiwyMzksMjM5LDEwNywKLSAgICAxMjgsICAxLDE3OCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA1NCwyMzksCi0gICAgMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA3MiwyNDMsMjM3LDIyNSwyMzYsMTA4LAotICAgIDEyOCwyNDcsMTE4LDI0NCwyMzMsMjM2LDIyOCwxMDEsMTI4LCAzMCwxMjQsIDg3LDEzNCwgIDAsIDg3LCAzMiwKLSAgICAxMjMsIDMyLDEzMSwgMzIsMTU0LCAzMiwxOTQsIDMyLDIwMiwgMzIsMjE0LDIyNSwyMjcsMjQ1LDI0NCwxMDEsCi0gICAgMTI4LCAzMCwxMzAsMjI3LDIzMywyNDIsIDk5LCAgMiwgMzIsMTQwLCAzMiwxNDUsMjM2LDEwMSwxMjgsIDM2LAotICAgIDIwNCwyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwxMjgsICAxLDExNiwxMDAsICAyLCAzMiwxNjAsIDMyLDE3MCwKLSAgICAyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywxMTUsMTI4LCAzMCwxMzIsMjM5LDExNiwgIDIsIDMyLDE3NywgMzIsCi0gICAgMTg2LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsMTM0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LAotICAgICAzMCwxMzYsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLDEyOCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwKLSAgICAyMjUsMjI3LDEwMSwxMjgsMjU1LCA1NSwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMTE5LCA4OCwxMzQsCi0gICAgICAwLCA4OCwgMzIsMjM4LCAzMiwyNDcsIDMzLCAxOCwgMzMsIDMxLCAzMywgMzUsIDMzLCA0NywyMjcsMjMzLAotICAgIDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM2LDIwNSwxMDAsICAyLCAzMiwyNTMsIDMzLCAgNywyMzMsMjI5LDI0MiwKLSAgICAyMjksMjQzLDIzMywxMTUsMTI4LCAzMCwxNDAsMjM5LDI0NCwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsCi0gICAgIDMwLDEzOCwyMjksMjMyLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgNjEsMTA1LAotICAgIDEyOCwgIDMsMTU4LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDU2LDI0MywKLSAgICAyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxMjAsIDg5LDEzOSwgIDAsIDg5LCAzMywgODEsIDMzLDExNiwgMzMsCi0gICAgMTM5LCAzMywxODksIDMzLDIyOCwgMzMsMjM2LCAzMywyNTMsIDM0LCA0MCwgMzQsIDUyLCAzNCwgNjAsIDM0LAotICAgICA2OCwgOTcsICAyLCAzMywgODcsIDMzLDEwNCwyMjcsMjQ1LDI0NCwxMDEsMTI5LCAgMCwyMjEsIDMzLCA5NiwKLSAgICAyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNDcsMjUzLDI0NCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsCi0gICAgIDk5LDEyOCwgIDQsIDk4LDIyNywyMzMsMjQyLCA5OSwgIDIsIDMzLDEyNSwgMzMsMTMwLDIzNiwxMDEsMTI4LAotICAgICAzNiwyMDYsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTI4LCAgMSwxMTgsMTAwLCAgMiwgMzMsMTQ1LCAzMywKLSAgICAxNjUsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEyOSwgIDEsMTIwLCAzMywxNTcsMjQzLDIzNywyMjUsCi0gICAgMjM2LDEwOCwxMjgsMjQ3LDI1NSwyMzksMTE2LCAgMiwgMzMsMTcyLCAzMywxODEsMjI1LDIyNywyMjcsMjI5LAotICAgIDIzOCwxMTYsMTI4LCAzMCwxNDIsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDI0NCwyMjksMTE0LCAgMiwKLSAgICAgMzMsMTk2LCAzMywyMDgsMjMzLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNDMsCi0gICAgMjQ1LDIyOCwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywyNDMsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLAotICAgICA5OSwxMjgsICA0LDI0OCwyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwgMzAsMjQyLDIzMiwyMzksMjM5LDEwNywKLSAgICAxMjksICAxLDE3OSwgMzMsMjQ1LDIyNSwyMjYsMjM5LDI0NiwxMDEsMTI4LCAzMCwyNDYsMTA1LCAgMywgMzQsCi0gICAgICA1LCAzNCwgMTYsIDM0LCAyNywyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDY5LAotICAgIDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgIDcsMjQ3LDIzOCwyMjUsMjQyLDIzNywKLSAgICAyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDgyLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsCi0gICAgMTAxLDEyOCwyNTUsIDU3LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxMjEsMjQ0LDIzMywyMzYsMjI4LAotICAgIDEwMSwxMjgsIDMwLDI0OCwyNDUsMTE1LCAgMiwgMzQsIDc1LCAzNCwxMTMsMjI2LDIzMywxMDMsICAyLCAzNCwKLSAgICAgODMsIDM0LCA5NCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTA2LDIzMywyMzksCi0gICAgMjQ0LDIzMywyMzAsMjMzLDIyOSwyMjgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgIDEwOCwyMzYsMjMzLDI0NCwyNDQsMjM2LDEwMSwgIDIsIDM0LDEyNCwgMzQsMTM1LDIyNywyNDksMjQyLDIzMywKLSAgICAyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMDIsMjMzLDIzOSwyNDQsMjMzLDIzMCwyMzMsMjI5LDIyOCwyMjcsCi0gICAgMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTA0LCA5MCwxMzYsICAwLCA5MCwgMzQsMTc0LAotICAgICAzNCwxOTgsIDM0LDI0MywgMzUsIDE0LCAzNSwgODEsIDM1LDE3MywgMzUsMTg1LCAzNSwxOTcsIDk3LCAgMiwKLSAgICAgMzQsMTgwLCAzNCwxOTEsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA1NCwyMjcsCi0gICAgMjQ1LDI0NCwxMDEsMTI4LCAgMSwxMjEsIDk5LCAgMiwgMzQsMjA0LCAzNCwyMjEsMjI1LDI0MiwyMzksMTEwLAotICAgIDEyOSwgIDEsMTI1LCAzNCwyMTMsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ2LDI1NSwyMzMsMjQyLCA5OSwKLSAgICAgIDIsIDM0LDIyOSwgMzQsMjM0LDIzNiwxMDEsMTI4LCAzNiwyMDcsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsCi0gICAgMTI4LCAzMCwxNDQsMjI4LDIzOSwxMTYsMTMwLCAgMSwxMjMsIDM0LDI1MywgMzUsICA2LDIyNSwyMjcsMjI3LAotICAgIDIyOSwyMzgsMTE2LDEyOCwgIDEsMTIzLDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxNDYsMTAxLCAgMywKLSAgICAgMzUsIDIyLCAzNSwgMzMsIDM1LCA3NiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCi0gICAgIDIzLDEwMCwgIDIsIDM1LCAzOSwgMzUsIDU4LDIyOSwyNDMsMjI3LDIyOSwyMzgsMjI4LDIyOSwyNDIsMjI3LAotICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE1MiwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywKLSAgICAyNDMsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDIyMiwyNDQsIDk3LDEyOCwgIDMsCi0gICAgMTUwLDIzMiwxMDEsICA0LCAzNSwgOTIsIDM1LDEwMywgMzUsMTE5LCAzNSwxMzAsMjI1LDI0MiwyMzcsMjI5LAotICAgIDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA1OCwyMjYsMjQyLDIyOSwyNDYsMjI5LDIyNywyNDksMjQyLDIzMywKLSAgICAyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxOTMsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsCi0gICAgICA0LCAyMiwxMDAsICAyLCAzNSwxMzYsIDM1LDE1NSwyMjksMjQzLDIyNywyMjksMjM4LDIyOCwyMjksMjQyLAotICAgIDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNTAsMjMzLDIyOSwyNDIsMjI5LDI0MywKLSAgICAyMzMsMjQzLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMjAsMjM2LDIzMywyMzgsCi0gICAgMjI5LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxNDgsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LAotICAgIDIyNywxMDEsMTI4LDI1NSwgNTgsMTE1LCAgMiwgMzUsMjAzLCAzNSwyMTAsMjM3LDIyNSwyMzYsMTA4LDEyOCwKLSAgICAyNDcsMTIyLDI0NCwyNDIsMjM5LDIzNSwxMDEsMTI4LCAgMSwxODEsIDk3LDE1OCwgIDAsIDk3LCAzNiwgMjYsCi0gICAgIDM4LDE1NCwgMzksICA0LCAzOSwgNjgsIDM5LDEzMiwgMzksMTk2LCA0MCwgIDQsIDQwLCA2OCwgNDAsMTI2LAotICAgICA0MCwxOTAsIDQxLCA3MCwgNDEsMjE3LCA0MiwxMzcsIDQyLDIzNywgNDMsIDE3LCA0OSwxOTIsIDQ5LDIyOSwKLSAgICAgNTAsICAwLCA1MCwyMjUsIDUxLCAgNywgNTIsIDk2LCA1MiwxNjgsIDUzLDEyMywgNTMsMTMyLCA1NCwgIDUsCi0gICAgIDU2LCAxMywgNTcsICAzLCA1NywgNTAsIDU3LDIwMSwgNTcsMjE1LCA0OSwxMzgsIDM5LCAgMSwgMzYsIDUwLAotICAgICAzNiwxMTQsIDM2LDE1NCwgMzYsMjE4LCAzNywgMjYsIDM3LCA5MCwgMzcsMTU0LCAzNywyMTgsIDM4LCAyNiwKLSAgICAgMzgsIDkwLCA0OCwxMzgsIDM5LCAzMywgMzYsIDc0LCAzNiwgNzgsIDM2LCA4MiwgMzYsIDg2LCAzNiwgOTAsCi0gICAgIDM2LCA5NCwgMzYsIDk4LCAzNiwxMDIsIDM2LDEwNiwgMzYsMTEwLCA0OCwxMjgsIDM5LCA5NCwgNDksMTI4LAotICAgICAzOSwgOTcsIDUwLDEyOCwgMzksIDk4LCA1MSwxMjgsIDM5LCA5OSwgNTIsMTI4LCAzOSwxMDAsIDUzLDEyOCwKLSAgICAgMzksIDE2LCA1NCwxMjgsIDM5LDEwMSwgNTUsMTI4LCAzOSwxMDIsIDU2LDEyOCwgMzksMTAzLCA1NywxMjgsCi0gICAgIDM4LCA5NiwgNDksMTM0LCAzOCwgMjcsIDM2LDEzMCwgMzYsMTM0LCAzNiwxMzgsIDM2LDE0MiwgMzYsMTQ2LAotICAgICAzNiwxNTAsIDQ4LDEyOCwgMzgsMTAxLCA0OSwxMjgsIDM4LDEwMiwgNTAsMTI4LCAzOCwgOTksIDU1LDEyOCwKLSAgICAgMzksICA5LCA1NiwxMjgsIDM5LCAgOCwgNTcsMTI4LCAzOSwgIDcsIDUwLDEzOCwgMzgsIDMwLCAzNiwxNzgsCi0gICAgIDM2LDE4MiwgMzYsMTg2LCAzNiwxOTAsIDM2LDE5NCwgMzYsMTk4LCAzNiwyMDIsIDM2LDIwNiwgMzYsMjEwLAotICAgICAzNiwyMTQsIDQ4LDEyOCwgMzYsIDk2LCA0OSwxMjgsIDM2LCA5NywgNTAsMTI4LCAzNiwgOTgsIDUxLDEyOCwKLSAgICAgMzYsIDk5LCA1MiwxMjgsIDM2LDEwMCwgNTMsMTI4LCAzNiwxMDEsIDU0LDEyOCwgMzYsMTAyLCA1NSwxMjgsCi0gICAgIDM2LDEwMywgNTYsMTI4LCAzNiwxMDQsIDU3LDEyOCwgMzYsMTA1LCA1MSwxMzgsIDM5LCAxMiwgMzYsMjQyLAotICAgICAzNiwyNDYsIDM2LDI1MCwgMzYsMjU0LCAzNywgIDIsIDM3LCAgNiwgMzcsIDEwLCAzNywgMTQsIDM3LCAxOCwKLSAgICAgMzcsIDIyLCA0OCwxMjgsIDM5LDExOCwgNDksMTI4LCAzOSwxMTksIDUwLDEyOCwgMzksMTIwLCA1MSwxMjgsCi0gICAgIDM5LDEyMSwgNTIsMTI4LCAzOSwxMjIsIDUzLDEyOCwgMzksMTIzLCA1NCwxMjgsIDM5LDEyNCwgNTUsMTI4LAotICAgICAzOSwxMjUsIDU2LDEyOCwgMzksMTI2LCA1NywxMjgsIDM5LDEyNywgNTIsMTM4LCAzOSwgMTMsIDM3LCA1MCwKLSAgICAgMzcsIDU0LCAzNywgNTgsIDM3LCA2MiwgMzcsIDY2LCAzNywgNzAsIDM3LCA3NCwgMzcsIDc4LCAzNywgODIsCi0gICAgIDM3LCA4NiwgNDgsMTI4LCAzOSwxMjgsIDQ5LDEyOCwgMzksMTI5LCA1MCwxMjgsIDM5LDEzMCwgNTEsMTI4LAotICAgICAzOSwxMzEsIDUyLDEyOCwgMzksMTMyLCA1MywxMjgsIDM5LDEzMywgNTQsMTI4LCAzOSwxMzQsIDU1LDEyOCwKLSAgICAgMzksMTM1LCA1NiwxMjgsIDM5LDEzNiwgNTcsMTI4LCAzOSwxMzcsIDUzLDEzOCwgMzksIDE0LCAzNywxMTQsCi0gICAgIDM3LDExOCwgMzcsMTIyLCAzNywxMjYsIDM3LDEzMCwgMzcsMTM0LCAzNywxMzgsIDM3LDE0MiwgMzcsMTQ2LAotICAgICAzNywxNTAsIDQ4LDEyOCwgMzksMTM4LCA0OSwxMjgsIDM5LDEzOSwgNTAsMTI4LCAzOSwxNDAsIDUxLDEyOCwKLSAgICAgMzksMTQxLCA1MiwxMjgsIDM5LDE0MiwgNTMsMTI4LCAzOSwxNDMsIDU0LDEyOCwgMzksMTQ0LCA1NSwxMjgsCi0gICAgIDM5LDE0NSwgNTYsMTI4LCAzOSwxNDYsIDU3LDEyOCwgMzksMTQ3LCA1NCwxMzgsIDM5LCAxNSwgMzcsMTc4LAotICAgICAzNywxODIsIDM3LDE4NiwgMzcsMTkwLCAzNywxOTQsIDM3LDE5OCwgMzcsMjAyLCAzNywyMDYsIDM3LDIxMCwKLSAgICAgMzcsMjE0LCA0OCwxMjgsIDM5LDE0OCwgNDksMTI4LCAzMywxNDYsIDUwLDEyOCwgMzksMTYzLCA1MSwxMjgsCi0gICAgIDMzLDE0OCwgNTIsMTI4LCAzMywxNDksIDUzLDEyOCwgMzksMTUzLCA1NCwxMjgsIDM5LDE1NSwgNTUsMTI4LAotICAgICAzOSwxNTYsIDU2LDEyOCwgMzksMTU3LCA1NywxMjgsIDM5LDE1OCwgNTUsMTM4LCAzOSwgMTcsIDM3LDI0MiwKLSAgICAgMzcsMjQ2LCAzNywyNTAsIDM3LDI1NCwgMzgsICAyLCAzOCwgIDYsIDM4LCAxMCwgMzgsIDE0LCAzOCwgMTgsCi0gICAgIDM4LCAyMiwgNDgsMTI4LCAzOSwxNTksIDQ5LDEyOCwgMzksMTYwLCA1MCwxMjgsIDM5LDE2MSwgNTEsMTI4LAotICAgICAzOSwxNjIsIDUyLDEyOCwgMzksMTY0LCA1MywxMjgsIDM5LDE2NSwgNTQsMTI4LCAzOSwxNjYsIDU1LDEyOCwKLSAgICAgMzksMTY3LCA1NiwxMjgsIDM5LDE2OCwgNTcsMTI4LCAzOSwxNjksIDU2LDEzOCwgMzksIDE4LCAzOCwgNTAsCi0gICAgIDM4LCA1NCwgMzgsIDU4LCAzOCwgNjIsIDM4LCA2NiwgMzgsIDcwLCAzOCwgNzQsIDM4LCA3OCwgMzgsIDgyLAotICAgICAzOCwgODYsIDQ4LDEyOCwgMzksMTcxLCA0OSwxMjgsIDM5LDE3MywgNTAsMTI4LCAzOSwxNzUsIDUxLDEyOCwKLSAgICAgMzksMTc4LCA1MiwxMjgsIDM5LDE3OSwgNTMsMTI4LCAzOSwxODEsIDU0LDEyOCwgMzksMTg0LCA1NSwxMjgsCi0gICAgIDM5LDE4NiwgNTYsMTI4LCAzOSwxODcsIDU3LDEyOCwgMzksMTg4LCA1NywxMzgsIDM5LCAxOSwgMzgsMTE0LAotICAgICAzOCwxMTgsIDM4LDEyMiwgMzgsMTI2LCAzOCwxMzAsIDM4LDEzNCwgMzgsMTM4LCAzOCwxNDIsIDM4LDE0NiwKLSAgICAgMzgsMTUwLCA0OCwxMjgsIDM5LDE4OSwgNDksMTI4LCAzOSwxOTAsIDUwLDEyOCwgMzksMTU0LCA1MSwxMjgsCi0gICAgIDM5LDE3MCwgNTIsMTI4LCAzOSwxODIsIDUzLDEyOCwgMzksMTg1LCA1NCwxMjgsIDM5LDE1MiwgNTUsMTI4LAotICAgICAzOSwxODAsIDU2LDEyOCwgMzksMTgzLCA1NywxMjgsIDM5LDE3MiwgNTAsMTM4LCAzOSwgIDIsIDM4LDE3OCwKLSAgICAgMzgsMjI0LCAzOCwyMjgsIDM4LDIzMiwgMzgsMjM2LCAzOCwyNDAsIDM4LDI0NCwgMzgsMjQ4LCAzOCwyNTIsCi0gICAgIDM5LCAgMCwgNDgsMTM1LCAzOSwgMjAsIDM4LDE5NiwgMzgsMjAwLCAzOCwyMDQsIDM4LDIwOCwgMzgsMjEyLAotICAgICAzOCwyMTYsIDM4LDIyMCwgNDgsMTI4LCAzOSwxNzQsIDQ5LDEyOCwgMzksMTc3LCA1MCwxMjgsIDM5LCAgMywKLSAgICAgNTEsMTI4LCAzOSwgODAsIDUyLDEyOCwgMzksIDgyLCA1MywxMjgsIDM5LDExMCwgNTQsMTI4LCAzOSwxMTIsCi0gICAgIDQ5LDEyOCwgMzksIDIxLCA1MCwxMjgsIDM5LCAyMiwgNTEsMTI4LCAzOSwgMjMsIDUyLDEyOCwgMzksIDI0LAotICAgICA1MywxMjgsIDM5LCAyNSwgNTQsMTI4LCAzOSwgMjYsIDU1LDEyOCwgMzksIDI3LCA1NiwxMjgsIDM5LCAyOCwKLSAgICAgNTcsMTI4LCAzOSwgMzQsIDUxLDEzOCwgMzksICA0LCAzOSwgMjgsIDM5LCAzMiwgMzksIDM2LCAzOSwgNDAsCi0gICAgIDM5LCA0NCwgMzksIDQ4LCAzOSwgNTIsIDM5LCA1NiwgMzksIDYwLCAzOSwgNjQsIDQ4LDEyOCwgMzksIDM1LAotICAgICA0OSwxMjgsIDM5LCAzNiwgNTAsMTI4LCAzOSwgMzcsIDUxLDEyOCwgMzksIDM4LCA1MiwxMjgsIDM5LCAzOSwKLSAgICAgNTMsMTI4LCAzOCwgIDUsIDU0LDEyOCwgMzksIDQxLCA1NSwxMjgsIDM5LCA0MiwgNTYsMTI4LCAzOSwgNDMsCi0gICAgIDU3LDEyOCwgMzksIDQ0LCA1MiwxMzgsIDM4LCAxNCwgMzksIDkyLCAzOSwgOTYsIDM5LDEwMCwgMzksMTA0LAotICAgICAzOSwxMDgsIDM5LDExMiwgMzksMTE2LCAzOSwxMjAsIDM5LDEyNCwgMzksMTI4LCA0OCwxMjgsIDM5LCA0NSwKLSAgICAgNDksMTI4LCAzOSwgNDYsIDUwLDEyOCwgMzksIDQ3LCA1MSwxMjgsIDM5LCA0OCwgNTIsMTI4LCAzOSwgNDksCi0gICAgIDUzLDEyOCwgMzksIDUwLCA1NCwxMjgsIDM5LCA1MSwgNTUsMTI4LCAzOSwgNTIsIDU2LDEyOCwgMzksIDUzLAotICAgICA1NywxMjgsIDM5LCA1NCwgNTMsMTM4LCAzOSwgIDYsIDM5LDE1NiwgMzksMTYwLCAzOSwxNjQsIDM5LDE2OCwKLSAgICAgMzksMTcyLCAzOSwxNzYsIDM5LDE4MCwgMzksMTg0LCAzOSwxODgsIDM5LDE5MiwgNDgsMTI4LCAzOSwgNTUsCi0gICAgIDQ5LDEyOCwgMzksIDU2LCA1MCwxMjgsIDM5LCA1NywgNTEsMTI4LCAzOSwgNTgsIDUyLDEyOCwgMzksIDU5LAotICAgICA1MywxMjgsIDM5LCA2MCwgNTQsMTI4LCAzOSwgNjEsIDU1LDEyOCwgMzksIDYyLCA1NiwxMjgsIDM5LCA2MywKLSAgICAgNTcsMTI4LCAzOSwgNjQsIDU0LDEzOCwgMzksIDI5LCAzOSwyMjAsIDM5LDIyNCwgMzksMjI4LCAzOSwyMzIsCi0gICAgIDM5LDIzNiwgMzksMjQwLCAzOSwyNDQsIDM5LDI0OCwgMzksMjUyLCA0MCwgIDAsIDQ4LDEyOCwgMzksIDY1LAotICAgICA0OSwxMjgsIDM5LCA2NiwgNTAsMTI4LCAzOSwgNjcsIDUxLDEyOCwgMzksIDY4LCA1MiwxMjgsIDM5LCA2OSwKLSAgICAgNTMsMTI4LCAzOSwgNzAsIDU0LDEyOCwgMzksIDcxLCA1NSwxMjgsIDM5LCA3MiwgNTYsMTI4LCAzOSwgNzMsCi0gICAgIDU3LDEyOCwgMzksIDc0LCA1NSwxMzgsIDM5LCAzMCwgNDAsIDI4LCA0MCwgMzIsIDQwLCAzNiwgNDAsIDQwLAotICAgICA0MCwgNDQsIDQwLCA0OCwgNDAsIDUyLCA0MCwgNTYsIDQwLCA2MCwgNDAsIDY0LCA0OCwxMjgsIDM5LCA3NSwKLSAgICAgNDksMTI4LCAzNywyMDcsIDUwLDEyOCwgMzksIDc3LCA1MSwxMjgsIDM3LDE2MCwgNTIsMTI4LCAzOSwgNzksCi0gICAgIDUzLDEyOCwgMzksIDgxLCA1NCwxMjgsIDM3LDE3OCwgNTUsMTI4LCAzNywxODgsIDU2LDEyOCwgMzcsMTk4LAotICAgICA1NywxMjgsIDM5LCA4NiwgNTYsMTM3LCAzOSwgMzEsIDQwLCA5MCwgNDAsIDk0LCA0MCwgOTgsIDQwLDEwMiwKLSAgICAgNDAsMTA2LCA0MCwxMTAsIDQwLDExNCwgNDAsMTE4LCA0MCwxMjIsIDQ5LDEyOCwgMzcsMjE1LCA1MCwxMjgsCi0gICAgIDM5LCA4OCwgNTEsMTI4LCAzOSwgODksIDUyLDEyOCwgMzksIDkwLCA1MywxMjgsIDM5LDExMSwgNTQsMTI4LAotICAgICAzOSwxMTMsIDU1LDEyOCwgMzksMTE0LCA1NiwxMjgsIDM5LDExNSwgNTcsMTI4LCAzOSwxMDQsIDU3LDEzOCwKLSAgICAgMzksIDMyLCA0MCwxNTAsIDQwLDE1NCwgNDAsMTU4LCA0MCwxNjIsIDQwLDE2NiwgNDAsMTcwLCA0MCwxNzQsCi0gICAgIDQwLDE3OCwgNDAsMTgyLCA0MCwxODYsIDQ4LDEyOCwgMzksMTA1LCA0OSwxMjgsIDM5LDEwOCwgNTAsMTI4LAotICAgICAzOSwxMDksIDUxLDEyOCwgMzksMTA2LCA1MiwxMjgsIDM5LDEwNywgNTMsMTI4LCAzOSwxMTYsIDU0LDEyOCwKLSAgICAgMzksMTE3LCA1NSwxMjgsIDM5LCA5MSwgNTYsMTI4LCAzOSwgOTIsIDU3LDEyOCwgMzksIDkzLCA5NywgIDcsCi0gICAgIDQwLDIwNiwgNDAsMjE2LCA0MCwyMjMsIDQwLDIzMCwgNDAsMjU1LCA0MSwgMTUsIDQxLCAyNiwyMjYsMjI5LAotICAgIDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxMzQsMjI3LDI0NSwyNDQsMTAxLDEyOCwgIDAsMjI1LDIyOCwKLSAgICAyMjksMjQ2LCA5NywxMjgsICA5LCAgNiwyMzEsMTE3LCAgMiwgNDAsMjM3LCA0MCwyNDYsMjM0LDIyNSwyNDIsCi0gICAgMjI1LDI0NCwxMDUsMTI4LCAxMCwxMzQsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgIDYsMjM3LAotICAgIDIyNSwyNDQsMjQyLDIyNSwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDYyLDI0MiwKLSAgICAyNDUsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgIDMsMjQ2LDIzOSwyNDcsMjI5LDIzNiwyNDMsCi0gICAgMjMzLDIzMSwxMTAsICAzLCA0MSwgNDIsIDQxLCA1MiwgNDEsIDU5LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LAotICAgIDEwNSwxMjgsICA5LDE5MCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNjIsMjMxLDI0NSwyMzQsMjI1LDI0MiwKLSAgICAyMjUsMjQ0LDEwNSwxMjgsIDEwLDE5MCwgOTgsICA0LCA0MSwgODAsIDQxLDEyMSwgNDEsMTMwLCA0MSwxNDAsCi0gICAgMjI2LDI0MiwyMjksMjQ2LDIzMywyMjUsMjQ0LDIzMywyMzksMTEwLCAgMiwgNDEsIDk1LCA0MSwxMTAsMjM3LAotICAgIDIyNSwyNDIsMjM1LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgOTUsMjQzLDIzMywKLSAgICAyMzEsMjM4LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LDExMiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsCi0gICAgICA5LDEzMywyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgMjYsMjQyLDIyOSwyNDYsMTAxLAotICAgIDEzNCwgIDEsICAzLCA0MSwxNTksIDQxLDE2NywgNDEsMTc4LCA0MSwxODksIDQxLDE5NywgNDEsMjA5LDIyNSwKLSAgICAyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwxNzUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsCi0gICAgICA0LDIwOSwyMjgsMjM5LDI0NCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTgzLDIzMSwyNDIsMjI1LAotICAgIDI0NiwxMDEsMTI4LCAzMCwxNzcsMjMyLDIzOSwyMzksMjM1LDIyNSwyMjYsMjM5LDI0NiwxMDEsMTI4LCAzMCwKLSAgICAxNzksMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjgsIDMwLDE4MSwgOTksICA0LCA0MSwyMjcsIDQxLDIzNCwgNDIsCi0gICAgIDU3LCA0MiwxMjcsMjI1LDI0MiwyMzksMTEwLDEyOCwgIDEsMjA2LDIzMywyNDIsIDk5LCAgMiwgNDEsMjQyLAotICAgICA0MSwyNDcsMjM2LDEwMSwxMjgsIDM2LDIwOCwyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwxMzMsICAwLDIyNiwKLSAgICAgNDIsIDEwLCA0MiwgMTgsIDQyLCAyOSwgNDIsIDM3LCA0MiwgNDksMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsCi0gICAgIDMwLDE2NSwyMjgsMjM5LDI0NCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTczLDIzMSwyNDIsMjI1LAotICAgIDI0NiwxMDEsMTI4LCAzMCwxNjcsMjMyLDIzOSwyMzksMjM1LDIyNSwyMjYsMjM5LDI0NiwxMDEsMTI4LCAzMCwKLSAgICAxNjksMjQ0LDIzMywyMzYsMjI4LDEwMSwxMjgsIDMwLDE3MSwyNDUsMjQ0LDEwMSwxMzMsICAwLDE4MCwgNDIsCi0gICAgIDczLCA0MiwgODQsIDQyLDEwMSwgNDIsMTA4LCA0MiwxMTcsMjI2LDIyOSwyMzYsMjM5LDI0NywyMjcsMjM3LAotICAgICA5OCwxMjgsICAzLCAyMywgOTksICAyLCA0MiwgOTAsIDQyLCA5NSwyMzcsIDk4LDEyOCwgIDMsICAxLDIzOSwKLSAgICAyMzcsIDk4LDEyOCwgIDMsICAxLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA4NCwyMzYsMjM5LDI0NywyMzcsCi0gICAgMjM5LDEwMCwxMjgsICAyLDIwNywyNDQsMjM5LDIzOCwyMjksMjI3LDIzNywgOTgsMTI4LCAgMywgNjUsMjQ5LAotICAgIDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDQ4LDEwMCwgIDUsIDQyLDE0OSwgNDIsMTU5LCA0MiwKLSAgICAxNzMsIDQyLDE3OSwgNDIsMjEzLDIyNiwyMzYsMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAyLCAgMSwyMjgsCi0gICAgMjI1LDIzNSwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsMTEzLDIyOSwyNDYsIDk3LAotICAgIDEyOCwgIDksICA1LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMzAsICAwLDIyOCwgNDIsMTkzLCA0MiwKLSAgICAyMDQsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDIxMSwyMzcsMjI1LDIyNywyNDIsCi0gICAgMjM5LDExMCwxMjgsICAxLDIyMywyMzksMTE2LCAgMiwgNDIsMjIwLCA0MiwyMjgsMjI2LDIyOSwyMzYsMjM5LAotICAgIDExOSwxMjgsIDMwLDE2MSwyMzcsMjI1LDIyNywyNDIsMjM5LDExMCwxMjgsICAxLDIyNSwxMDEsMTMxLCAgMCwKLSAgICAyMzAsIDQyLDI0NywgNDIsMjU1LCA0MywgIDgsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLDI1MywyMzUsCi0gICAgMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA4MCwyMzcsMjI1LDIyNywyNDIsMjM5LDExMCwxMjgsICAxLAotICAgIDIyNywyMzAsMjMzLDEwNSwgIDYsIDQzLCAzMywgNDMsIDUzLCA0NSwyNDYsIDQ1LDI1MiwgNDYsIDExLCA0OSwKLSAgICAxMTEsIDQ4LCAgMiwgNDMsIDM5LCA0MywgNDYsMTc2LDE3OCwxNzYsIDU2LDEyOCwgMzIsIDIxLDE4NCwxODUsCi0gICAgMTgwLCA0OSwxMjgsIDMyLDE2NCwxNzcsIDQ4LCAgMywgNDMsIDYyLCA0NSwgODYsIDQ1LDIyMSwgNDgsICA5LAotICAgICA0MywgODIsIDQzLDEwMiwgNDMsMTY0LCA0MywyMjYsIDQ0LCAzMiwgNDQsIDk0LCA0NCwxNTYsIDQ0LDIxOCwKLSAgICAgNDUsIDI0LCA0OSwgIDMsIDQzLCA5MCwgNDMsIDk0LCA0MywgOTgsIDU1LDEyOCwgIDQsIDE2LCA1NiwxMjgsCi0gICAgICA0LCAxNywgNTcsMTI4LCAgNCwgMTgsIDUwLCAxMCwgNDMsMTI0LCA0MywxMjgsIDQzLDEzMiwgNDMsMTM2LAotICAgICA0MywxNDAsIDQzLDE0NCwgNDMsMTQ4LCA0MywxNTIsIDQzLDE1NiwgNDMsMTYwLCA0OCwxMjgsICA0LCAxOSwKLSAgICAgNDksMTI4LCAgNCwgMjAsIDUwLDEyOCwgIDQsIDIxLCA1MSwxMjgsICA0LCAgMSwgNTIsMTI4LCAgNCwgMjIsCi0gICAgIDUzLDEyOCwgIDQsIDIzLCA1NCwxMjgsICA0LCAyNCwgNTUsMTI4LCAgNCwgMjUsIDU2LDEyOCwgIDQsIDI2LAotICAgICA1NywxMjgsICA0LCAyNywgNTEsIDEwLCA0MywxODYsIDQzLDE5MCwgNDMsMTk0LCA0MywxOTgsIDQzLDIwMiwKLSAgICAgNDMsMjA2LCA0MywyMTAsIDQzLDIxNCwgNDMsMjE4LCA0MywyMjIsIDQ4LDEyOCwgIDQsIDI4LCA0OSwxMjgsCi0gICAgICA0LCAyOSwgNTAsMTI4LCAgNCwgMzAsIDUxLDEyOCwgIDQsIDMxLCA1MiwxMjgsICA0LCAzMiwgNTMsMTI4LAotICAgICAgNCwgMzMsIDU0LDEyOCwgIDQsIDM0LCA1NSwxMjgsICA0LCAzNSwgNTYsMTI4LCAgNCwgMzYsIDU3LDEyOCwKLSAgICAgIDQsIDM3LCA1MiwgMTAsIDQzLDI0OCwgNDMsMjUyLCA0NCwgIDAsIDQ0LCAgNCwgNDQsICA4LCA0NCwgMTIsCi0gICAgIDQ0LCAxNiwgNDQsIDIwLCA0NCwgMjQsIDQ0LCAyOCwgNDgsMTI4LCAgNCwgMzgsIDQ5LDEyOCwgIDQsIDM5LAotICAgICA1MCwxMjgsICA0LCA0MCwgNTEsMTI4LCAgNCwgNDEsIDUyLDEyOCwgIDQsIDQyLCA1MywxMjgsICA0LCA0MywKLSAgICAgNTQsMTI4LCAgNCwgNDQsIDU1LDEyOCwgIDQsIDQ1LCA1NiwxMjgsICA0LCA0NiwgNTcsMTI4LCAgNCwgNDcsCi0gICAgIDUzLCAxMCwgNDQsIDU0LCA0NCwgNTgsIDQ0LCA2MiwgNDQsIDY2LCA0NCwgNzAsIDQ0LCA3NCwgNDQsIDc4LAotICAgICA0NCwgODIsIDQ0LCA4NiwgNDQsIDkwLCA0OCwxMjgsICA0LDE0NCwgNDksMTI4LCAgNCwgIDIsIDUwLDEyOCwKLSAgICAgIDQsICAzLCA1MSwxMjgsICA0LCAgNCwgNTIsMTI4LCAgNCwgIDUsIDUzLDEyOCwgIDQsICA2LCA1NCwxMjgsCi0gICAgICA0LCAgNywgNTUsMTI4LCAgNCwgIDgsIDU2LDEyOCwgIDQsICA5LCA1NywxMjgsICA0LCAxMCwgNTQsIDEwLAotICAgICA0NCwxMTYsIDQ0LDEyMCwgNDQsMTI0LCA0NCwxMjgsIDQ0LDEzMiwgNDQsMTM2LCA0NCwxNDAsIDQ0LDE0NCwKLSAgICAgNDQsMTQ4LCA0NCwxNTIsIDQ4LDEyOCwgIDQsIDExLCA0OSwxMjgsICA0LCAxMiwgNTAsMTI4LCAgNCwgMTQsCi0gICAgIDUxLDEyOCwyNDYsMTk2LCA1MiwxMjgsMjQ2LDE5NywgNTMsMTI4LCAgNCwgNDgsIDU0LDEyOCwgIDQsIDQ5LAotICAgICA1NSwxMjgsICA0LCA1MCwgNTYsMTI4LCAgNCwgNTEsIDU3LDEyOCwgIDQsIDUyLCA1NSwgMTAsIDQ0LDE3OCwKLSAgICAgNDQsMTgyLCA0NCwxODYsIDQ0LDE5MCwgNDQsMTk0LCA0NCwxOTgsIDQ0LDIwMiwgNDQsMjA2LCA0NCwyMTAsCi0gICAgIDQ0LDIxNCwgNDgsMTI4LCAgNCwgNTMsIDQ5LDEyOCwgIDQsIDgxLCA1MCwxMjgsICA0LCA1NCwgNTEsMTI4LAotICAgICAgNCwgNTUsIDUyLDEyOCwgIDQsIDU2LCA1MywxMjgsICA0LCA1NywgNTQsMTI4LCAgNCwgNTgsIDU1LDEyOCwKLSAgICAgIDQsIDU5LCA1NiwxMjgsICA0LCA2MCwgNTcsMTI4LCAgNCwgNjEsIDU2LCAxMCwgNDQsMjQwLCA0NCwyNDQsCi0gICAgIDQ0LDI0OCwgNDQsMjUyLCA0NSwgIDAsIDQ1LCAgNCwgNDUsICA4LCA0NSwgMTIsIDQ1LCAxNiwgNDUsIDIwLAotICAgICA0OCwxMjgsICA0LCA2MiwgNDksMTI4LCAgNCwgNjMsIDUwLDEyOCwgIDQsIDY0LCA1MSwxMjgsICA0LCA2NSwKLSAgICAgNTIsMTI4LCAgNCwgNjYsIDUzLDEyOCwgIDQsIDY3LCA1NCwxMjgsICA0LCA2OCwgNTUsMTI4LCAgNCwgNjksCi0gICAgIDU2LDEyOCwgIDQsIDcwLCA1NywxMjgsICA0LCA3MSwgNTcsIDEwLCA0NSwgNDYsIDQ1LCA1MCwgNDUsIDU0LAotICAgICA0NSwgNTgsIDQ1LCA2MiwgNDUsIDY2LCA0NSwgNzAsIDQ1LCA3NCwgNDUsIDc4LCA0NSwgODIsIDQ4LDEyOCwKLSAgICAgIDQsIDcyLCA0OSwxMjgsICA0LCA3MywgNTAsMTI4LCAgNCwgNzQsIDUxLDEyOCwgIDQsIDc1LCA1MiwxMjgsCi0gICAgICA0LCA3NiwgNTMsMTI4LCAgNCwgNzcsIDU0LDEyOCwgIDQsIDc4LCA1NSwxMjgsICA0LCA3OSwgNTYsMTI4LAotICAgICAgNCwxNDUsIDU3LDEyOCwgIDQsIDgyLCA0OSwgIDQsIDQ1LCA5NiwgNDUsMTU4LCA0NSwxNjMsIDQ1LDE4OSwKLSAgICAgNDgsIDEwLCA0NSwxMTgsIDQ1LDEyMiwgNDUsMTI2LCA0NSwxMzAsIDQ1LDEzNCwgNDUsMTM4LCA0NSwxNDIsCi0gICAgIDQ1LDE0NiwgNDUsMTUwLCA0NSwxNTQsIDQ4LDEyOCwgIDQsIDgzLCA0OSwxMjgsICA0LCA4NCwgNTAsMTI4LAotICAgICAgNCwgODUsIDUxLDEyOCwgIDQsIDg2LCA1MiwxMjgsICA0LCA4NywgNTMsMTI4LCAgNCwgODgsIDU0LDEyOCwKLSAgICAgIDQsIDg5LCA1NSwxMjgsICA0LCA5MCwgNTYsMTI4LCAgNCwgOTEsIDU3LDEyOCwgIDQsIDkyLDE3NywgNDgsCi0gICAgMTI4LCAgNCwgOTQsIDUyLCAgNCwgNDUsMTczLCA0NSwxNzcsIDQ1LDE4MSwgNDUsMTg1LCA1MywxMjgsICA0LAotICAgICAxNSwgNTQsMTI4LCAgNCwgOTgsIDU1LDEyOCwgIDQsMTE0LCA1NiwxMjgsICA0LDExNiwgNTcsICA1LCA0NSwKLSAgICAyMDEsIDQ1LDIwNSwgNDUsMjA5LCA0NSwyMTMsIDQ1LDIxNywgNTAsMTI4LDI0NiwxOTgsIDUxLDEyOCwgIDQsCi0gICAgIDk1LCA1MiwxMjgsICA0LCA5OSwgNTMsMTI4LCAgNCwxMTUsIDU0LDEyOCwgIDQsMTE3LCA1NiwgIDIsIDQ1LAotICAgIDIyNywgNDUsMjQxLCA1MSwgIDIsIDQ1LDIzMywgNDUsMjM3LCA0OSwxMjgsMjQ2LDE5OSwgNTAsMTI4LDI0NiwKLSAgICAyMDAsMTgwLCA1NCwxMjgsICA0LDIxNywxNzgsMTg1LCA1NywxMjgsIDMyLCAxNCwxNzksIDQ4LCAgMiwgNDYsCi0gICAgICAzLCA0NiwgIDcsIDQ4LDEyOCwgMzIsIDE1LCA0OSwxMjgsIDMyLCAxMywxODEsIDU1LCAgNywgNDYsIDI4LAotICAgICA0NiwgOTgsIDQ3LDE2MywgNDcsMjQwLCA0OCwxOTcsIDQ5LCAzNCwgNDksMTA1LCA1MSwgIDIsIDQ2LCAzNCwKLSAgICAgNDYsIDQ4LCA1NiwgIDIsIDQ2LCA0MCwgNDYsIDQ0LCA0OSwxMjgsICA2LDEwNiwgNTYsMTI4LCAgNiwgMTIsCi0gICAgIDU3LCAgOCwgNDYsIDY2LCA0NiwgNzAsIDQ2LCA3NCwgNDYsIDc4LCA0NiwgODIsIDQ2LCA4NiwgNDYsIDkwLAotICAgICA0NiwgOTQsIDUwLDEyOCwgIDYsIDk2LCA1MSwxMjgsICA2LCA5NywgNTIsMTI4LCAgNiwgOTgsIDUzLDEyOCwKLSAgICAgIDYsIDk5LCA1NCwxMjgsICA2LDEwMCwgNTUsMTI4LCAgNiwxMDEsIDU2LDEyOCwgIDYsMTAyLCA1NywxMjgsCi0gICAgICA2LDEwMywgNTIsICA3LCA0NiwxMTQsIDQ2LDE0NiwgNDYsMjA4LCA0NywgMTQsIDQ3LCA0NiwgNDcsMTAyLAotICAgICA0NywxNTgsIDQ4LCAgNSwgNDYsMTI2LCA0NiwxMzAsIDQ2LDEzNCwgNDYsMTM4LCA0NiwxNDIsIDQ4LDEyOCwKLSAgICAgIDYsMTA0LCA0OSwxMjgsICA2LDEwNSwgNTEsMTI4LCAgNiwgMjcsIDU1LDEyOCwgIDYsIDMxLCA1NywxMjgsCi0gICAgICA2LCAzMywgNDksIDEwLCA0NiwxNjgsIDQ2LDE3MiwgNDYsMTc2LCA0NiwxODAsIDQ2LDE4NCwgNDYsMTg4LAotICAgICA0NiwxOTIsIDQ2LDE5NiwgNDYsMjAwLCA0NiwyMDQsIDQ4LDEyOCwgIDYsIDM0LCA0OSwxMjgsICA2LCAzNSwKLSAgICAgNTAsMTI4LCAgNiwgMzYsIDUxLDEyOCwgIDYsIDM3LCA1MiwxMjgsICA2LCAzOCwgNTMsMTI4LCAgNiwgMzksCi0gICAgIDU0LDEyOCwgIDYsIDQwLCA1NSwxMjgsICA2LCA0MSwgNTYsMTI4LCAgNiwgNDIsIDU3LDEyOCwgIDYsIDQzLAotICAgICA1MCwgMTAsIDQ2LDIzMCwgNDYsMjM0LCA0NiwyMzgsIDQ2LDI0MiwgNDYsMjQ2LCA0NiwyNTAsIDQ2LDI1NCwKLSAgICAgNDcsICAyLCA0NywgIDYsIDQ3LCAxMCwgNDgsMTI4LCAgNiwgNDQsIDQ5LDEyOCwgIDYsIDQ1LCA1MCwxMjgsCi0gICAgICA2LCA0NiwgNTEsMTI4LCAgNiwgNDcsIDUyLDEyOCwgIDYsIDQ4LCA1MywxMjgsICA2LCA0OSwgNTQsMTI4LAotICAgICAgNiwgNTAsIDU1LDEyOCwgIDYsIDUxLCA1NiwxMjgsICA2LCA1MiwgNTcsMTI4LCAgNiwgNTMsIDUxLCAgNSwKLSAgICAgNDcsIDI2LCA0NywgMzAsIDQ3LCAzNCwgNDcsIDM4LCA0NywgNDIsIDQ4LDEyOCwgIDYsIDU0LCA0OSwxMjgsCi0gICAgICA2LCA1NSwgNTAsMTI4LCAgNiwgNTYsIDUxLDEyOCwgIDYsIDU3LCA1MiwxMjgsICA2LCA1OCwgNTIsICA5LAotICAgICA0NywgNjYsIDQ3LCA3MCwgNDcsIDc0LCA0NywgNzgsIDQ3LCA4MiwgNDcsIDg2LCA0NywgOTAsIDQ3LCA5NCwKLSAgICAgNDcsIDk4LCA0OCwxMjgsICA2LCA2NCwgNDksMTI4LCAgNiwgNjUsIDUwLDEyOCwgIDYsIDY2LCA1MSwxMjgsCi0gICAgICA2LCA2NywgNTIsMTI4LCAgNiwgNjgsIDUzLDEyOCwgIDYsIDY5LCA1NCwxMjgsICA2LCA3MCwgNTYsMTI4LAotICAgICAgNiwgNzIsIDU3LDEyOCwgIDYsIDczLCA1MywgIDksIDQ3LDEyMiwgNDcsMTI2LCA0NywxMzAsIDQ3LDEzNCwKLSAgICAgNDcsMTM4LCA0NywxNDIsIDQ3LDE0NiwgNDcsMTUwLCA0NywxNTQsIDQ4LDEyOCwgIDYsIDc0LCA0OSwxMjgsCi0gICAgICA2LCA3NSwgNTAsMTI4LCAgNiwgNzYsIDUxLDEyOCwgIDYsIDc3LCA1MiwxMjgsICA2LCA3OCwgNTMsMTI4LAotICAgICAgNiwgNzksIDU0LDEyOCwgIDYsIDgwLCA1NSwxMjgsICA2LCA4MSwgNTYsMTI4LCAgNiwgODIsMTgzLCA0OCwKLSAgICAxMjgsICA2LCA3MSwgNTMsICAzLCA0NywxNzEsIDQ3LDIwMywgNDcsMjM1LCA0OCwgIDUsIDQ3LDE4MywgNDcsCi0gICAgMTg3LCA0NywxOTEsIDQ3LDE5NSwgNDcsMTk5LCA1MywxMjgsICA2LDE2NCwgNTQsMTI4LCAgNiwxMjYsIDU1LAotICAgIDEyOCwgIDYsMTM0LCA1NiwxMjgsICA2LDE1MiwgNTcsMTI4LCAgNiwxNzUsIDQ5LCAgNSwgNDcsMjE1LCA0NywKLSAgICAyMTksIDQ3LDIyMywgNDcsMjI3LCA0NywyMzEsIDQ5LDEyOCwgIDYsMTIxLCA1MCwxMjgsICA2LDEzNiwgNTEsCi0gICAgMTI4LCAgNiwxNDUsIDUyLDEyOCwgIDYsMTg2LCA1NywxMjgsICA2LDIxMCwxNzksIDUyLDEyOCwgIDYsMjEzLAotICAgICA1NCwgIDcsIDQ4LCAgMCwgNDgsICA1LCA0OCwgMTAsIDQ4LCAxNSwgNDgsIDUzLCA0OCwxMTUsIDQ4LDE3NywKLSAgICAxNzksIDU0LDEyOCwgMzIsMTcwLDE4MCwgNTMsMTI4LCAgNSwxOTAsMTgxLCA1NiwxMjgsICA1LDE5NSwgNTQsCi0gICAgICA2LCA0OCwgMjksIDQ4LCAzMywgNDgsIDM3LCA0OCwgNDEsIDQ4LCA0NSwgNDgsIDQ5LCA1MiwxMjgsICA1LAotICAgIDIwOCwgNTMsMTI4LCAgNSwyMDksIDU0LDEyOCwgIDUsMjEwLCA1NSwxMjgsICA1LDIxMSwgNTYsMTI4LCAgNSwKLSAgICAyMTIsIDU3LDEyOCwgIDUsMjEzLCA1NSwgMTAsIDQ4LCA3NSwgNDgsIDc5LCA0OCwgODMsIDQ4LCA4NywgNDgsCi0gICAgIDkxLCA0OCwgOTUsIDQ4LCA5OSwgNDgsMTAzLCA0OCwxMDcsIDQ4LDExMSwgNDgsMTI4LCAgNSwyMTQsIDQ5LAotICAgIDEyOCwgIDUsMjE1LCA1MCwxMjgsICA1LDIxNiwgNTEsMTI4LCAgNSwyMTcsIDUyLDEyOCwgIDUsMjE4LCA1MywKLSAgICAxMjgsICA1LDIxOSwgNTQsMTI4LCAgNSwyMjAsIDU1LDEyOCwgIDUsMjIxLCA1NiwxMjgsICA1LDIyMiwgNTcsCi0gICAgMTI4LCAgNSwyMjMsIDU2LCAxMCwgNDgsMTM3LCA0OCwxNDEsIDQ4LDE0NSwgNDgsMTQ5LCA0OCwxNTMsIDQ4LAotICAgIDE1NywgNDgsMTYxLCA0OCwxNjUsIDQ4LDE2OSwgNDgsMTczLCA0OCwxMjgsICA1LDIyNCwgNDksMTI4LCAgNSwKLSAgICAyMjUsIDUwLDEyOCwgIDUsMjI2LCA1MSwxMjgsICA1LDIyNywgNTIsMTI4LCAgNSwyMjgsIDUzLDEyOCwgIDUsCi0gICAgMjI5LCA1NCwxMjgsICA1LDIzMCwgNTUsMTI4LCAgNSwyMzEsIDU2LDEyOCwgIDUsMjMyLCA1NywxMjgsICA1LAotICAgIDIzMywgNTcsICAzLCA0OCwxODUsIDQ4LDE4OSwgNDgsMTkzLCA0OCwxMjgsICA1LDIzNCwgNTIsMTI4LDI1MSwKLSAgICAgNDIsIDUzLDEyOCwyNTEsIDQzLCA1NSwgIDQsIDQ4LDIwNywgNDgsMjIxLCA0OCwyNDEsIDQ4LDI0NiwgNDgsCi0gICAgICAyLCA0OCwyMTMsIDQ4LDIxNywgNDgsMTI4LDI1MSwgNzUsIDUzLDEyOCwyNTEsIDMxLCA0OSwgIDMsIDQ4LAotICAgIDIyOSwgNDgsMjMzLCA0OCwyMzcsIDU0LDEyOCwgIDUsMjQwLCA1NSwxMjgsICA1LDI0MSwgNTYsMTI4LCAgNSwKLSAgICAyNDIsMTc4LCA1MSwxMjgsMjUxLCA1MywgNTcsICA3LCA0OSwgIDYsIDQ5LCAxMCwgNDksIDE0LCA0OSwgMTgsCi0gICAgIDQ5LCAyMiwgNDksIDI2LCA0OSwgMzAsIDUxLDEyOCwgIDUsMTgwLCA1MiwxMjgsICA1LDE4MSwgNTMsMTI4LAotICAgICAgNSwxODIsIDU0LDEyOCwgIDUsMTg3LCA1NSwxMjgsICA1LDE4NCwgNTYsMTI4LCAgNSwxODMsIDU3LDEyOCwKLSAgICAgIDUsMTc2LCA1NiwgIDMsIDQ5LCA0MiwgNDksIDg2LCA0OSwgOTEsIDQ4LCAgNywgNDksIDU4LCA0OSwgNjIsCi0gICAgIDQ5LCA2NiwgNDksIDcwLCA0OSwgNzQsIDQ5LCA3OCwgNDksIDgyLCA0OCwxMjgsICA1LDE3OCwgNDksMTI4LAotICAgICAgNSwxNzcsIDUwLDEyOCwgIDUsMTc5LCA1MSwxMjgsICA1LDE5NCwgNTIsMTI4LCAgNSwxOTMsIDU0LDEyOCwKLSAgICAgIDUsMTg1LCA1NSwxMjgsICA1LDE4OCwxNzksIDU3LDEyOCwgIDUsMTg5LCA1MiwgIDIsIDQ5LCA5NywgNDksCi0gICAgMTAxLCA0OSwxMjgsICA1LDE5MSwgNTAsMTI4LCAgNSwxOTIsMTg1LDE3OCwgNTcsMTI4LCAgMiwxODgsIDU0LAotICAgICAgMywgNDksMTE5LCA0OSwxNzgsIDQ5LDE4NSwgNDksICA0LCA0OSwxMjksIDQ5LDE0NSwgNDksMTUxLCA0OSwKLSAgICAxNzIsIDUwLCAgMiwgNDksMTM1LCA0OSwxNDAsMTgwLCA1NiwxMjgsIDMzLCAgNSwxODQsIDU3LDEyOCwgMzMsCi0gICAgIDE5LDE3OSwxODEsIDUwLDEyOCwgMzMsIDIyLDE4MSwgNTUsICAzLCA0OSwxNjAsIDQ5LDE2NCwgNDksMTY4LAotICAgICA1MSwxMjgsIDMyLCA0NCwgNTIsMTI4LCAzMiwgNDUsIDUzLDEyOCwgMzIsIDQ2LDE4MiwxODIsIDUyLDEyOCwKLSAgICAgMzIsIDEyLDE3OSwxNzcsMTgyLCA1NSwxMjgsICA2LDEwOSwxODAsMTg1LDE3OSwgNTUsMTI4LCAgMiwxODksCi0gICAgMTAzLCAgMiwgNDksMTk4LCA0OSwyMDUsMjQyLDIyNSwyNDYsMTAxLDEyOCwgIDAsMjI0LDExNywgIDIsIDQ5LAotICAgIDIxMSwgNDksMjIwLDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTMzLDI0MiwyMzcsMjQ1LDIzNSwKLSAgICAyMzIsMTA1LDEyOCwgMTAsICA1LDEwNCwgIDIsIDQ5LDIzNSwgNDksMjQ1LDIzMywyNDIsMjI1LDIzMSwyMjUsCi0gICAgMjM4LCA5NywxMjgsIDQ4LCA2NiwyMzksMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMTYzLAotICAgIDEwNSwgIDcsIDUwLCAxNiwgNTAsIDQxLCA1MCwgNDgsIDUwLCA2MCwgNTAsIDg1LCA1MCwxMDEsIDUwLDE4MSwKLSAgICAgOTgsICAyLCA1MCwgMjIsIDUwLCAzMSwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE0NCwyMzksCi0gICAgMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgMzAsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDE2LAotICAgIDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjEzLDIzMSwxMTcsICAyLCA1MCwKLSAgICAgNjcsIDUwLCA3NiwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE0NCwyNDIsMjM3LDI0NSwyMzUsCi0gICAgMjMyLDEwNSwxMjgsIDEwLCAxNiwyMzcsMjI1LDI0NCwyNDIsMjI1LDIzMSwyNDUsMjQyLDIzNywyNDUsMjM1LAotICAgIDIzMiwxMDUsMTI4LCAxMCwgNzIsMTEwLCAgNSwgNTAsMTEzLCA1MCwxMjIsIDUwLDEzNiwgNTAsMTUyLCA1MCwKLSAgICAxNjcsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNTcsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsCi0gICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIwMiwyMzMsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LAotICAgIDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMDMsMjM3LDIyOSwyMjgsMjMzLDIyNSwyMzYsMjI1LDI0MiwKLSAgICAyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMDQsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwyMjgsMjI2LDI0MiwyMjksCi0gICAgMjQ2LDEwMSwxMjgsICAyLCAgMywyNDYsMjM5LDI0NywyMjksMjM2LDI0MywyMzMsMjMxLDExMCwgIDMsIDUwLAotICAgIDE5NywgNTAsMjA3LCA1MCwyMTQsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjAwLDIyOCwKLSAgICAyMjksMjQ2LCA5NywxMjgsICA5LCA3MiwyMzEsMjQ1LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsCi0gICAgMjAwLDEwNywgIDIsIDUwLDIzMSwgNTAsMjU1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LAotICAgIDE2MiwgNTAsMjQzLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTEzLDIzOSwKLSAgICAyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNzksMTA4LCAgMywgNTEsIDE1LCA1MiwgNzEsIDUyLCA4MCwxMDEsCi0gICAgICAyLCA1MSwgMjEsIDUyLCA2NiwxMDIsMTM2LCAgNSwyMDgsIDUxLCA0MSwgNTEsIDUwLCA1MSwgNjUsIDUxLAotICAgICA3OSwgNTEsMTY4LCA1MSwxODIsIDUyLCAzNywgNTIsIDUxLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwKLSAgICAgIDYsIDM5LDIyOCwyMjUsMjMxLDIyOSwyNDMsMjMyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsCi0gICAgIDQ4LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxNDIsMTA0LAotICAgICAgMiwgNTEsIDg1LCA1MSwxNjAsMjI1LDIzNywyNTAsIDk3LCAgMiwgNTEsIDk0LCA1MSwxMjcsMjI1LDIyNiwKLSAgICAyMzksMjQ2LDEwMSwgIDIsIDUxLDEwNCwgNTEsMTEzLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsCi0gICAgIDM1LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxMzIsMjI2LAotICAgIDIyOSwyMzYsMjM5LDExOSwgIDIsIDUxLDEzNywgNTEsMTQ2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwKLSAgICAgIDYsIDM3LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxMzYsCi0gICAgMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIwOCwyMzYsMjI1LDIzNywyMjksMjI4LDIzMiwyMjksMjI2LAotICAgIDI0MiwyMjksMTE5LDEyOCwyNTEsIDc5LDIzNywgOTcsICAyLCA1MSwxODksIDUxLDIyNSwyMjgsMjI4LDIyNSwKLSAgICAyMjUsMjI2LDIzOSwyNDYsMTAxLCAgMiwgNTEsMjAyLCA1MSwyMTEsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksCi0gICAgMTI4LCAgNiwgMzQsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LAotICAgIDEzMCwyMzUsMjQzLDI0NSwyNDIsIDk3LCAgNCwgNTEsMjM5LCA1MSwyNDgsIDUyLCAgNiwgNTIsIDIyLDIyNSwKLSAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDczLDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsCi0gICAgMjI2LDIzMywgOTksMTI4LDI1NCwyNDAsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LAotICAgIDIyNiwyMzMsIDk5LDEyOCwyNTQsMjQzLDIzNywyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwKLSAgICAyMzMsIDk5LDEyOCwyNTQsMjQ0LDI0MCwyMjUsMjQ0LDIyNSwyMzIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksCi0gICAgMTI4LDI1MSwgNDYsMjQxLDIyNSwyMzcsMjI1LDI0NCwyNDMsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAotICAgIDI1MSwgNDcsMjQwLDEwNCwxMjgsIDMzLCA1MywyMzYsMjI5LDI0MSwyNDUsMjI1LDEwOCwxMjgsIDM0LCA3NiwKLSAgICAyNDAsMjMyLCA5NywxMjksICAzLDE3NywgNTIsIDg4LDI0NCwyMzksMjM4LDIzOSwxMTUsMTI4LCAgMywxNzIsCi0gICAgMTA5LCAgNCwgNTIsMTA2LCA1MiwxMTQsIDUyLDEyNSwgNTIsMTU5LDIyNSwyMjcsMjQyLDIzOSwxMTAsMTI4LAotICAgICAgMSwgIDEsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA2NSwyNDAsMjI5LDI0MiwKLSAgICAyNDMsMjI1LDIzOCwxMDAsMTMwLCAgMCwgMzgsIDUyLDEzOSwgNTIsMTUxLDIzNywyMzksMjM4LDIzOSwyNDMsCi0gICAgMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsICA2LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywgMzgsMjQzLAotICAgIDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxOTQsMTEwLCAgNCwgNTIsMTc4LCA1MiwxODksIDUzLCA1NSwKLSAgICAgNTMsIDY1LDIyNiwyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgMzQsMTAzLCAgNCwgNTIsCi0gICAgMTk5LCA1MiwyMTAsIDUyLDIyNCwgNTMsIDQ3LDIyNiwyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LAotICAgICA0OSwgMzYsMjM1LDIzMiwyMjUsMjM4LDIzNSwyMzIsMjQ1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA5MCwKLSAgICAyMzYsMTAxLDEzMSwgMzQsIDMyLCA1MiwyMzUsIDUzLCAzMiwgNTMsIDM5LDIyNiwyNDIsMjI1LDIyNywyMzUsCi0gICAgMjI5LDExNiwgIDIsIDUyLDI0NywgNTMsIDExLDIzNiwyMjksMjMwLDExNiwxMjksIDQ4LCAgOCwgNTMsICAwLAotICAgIDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LDI1NCwgNjMsMjQyLDIzMywyMzEsMjMyLDExNiwKLSAgICAxMjksIDQ4LCAgOSwgNTMsIDIxLDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LDI1NCwgNjQsCi0gICAgMjM2LDIyOSwyMzAsMTE2LDEyOCwgMzUsIDQxLDI0MiwyMzMsMjMxLDIzMiwxMTYsMTI4LCAzNSwgNDIsMjQzLAotICAgIDI0NCwyNDIsMjM5LDEwOSwxMjgsIDMzLCA0MywyMzksMjQ0LDIyOSwyMzYsMjI5LDIzMywgOTcsMTI4LCAgMywKLSAgICAxMzUsMTE3LCAgMiwgNTMsIDcxLCA1MywgODMsMjI4LDIyNSwyNDQsMjQ0LDIyNSwyMjgsMjI5LDI0NiwgOTcsCi0gICAgMTI4LCAgOSwgODIsMjQzLDI0NiwyMjUsMjQyLCA5NywgIDMsIDUzLCA5NSwgNTMsMTA1LCA1MywxMTIsMjI2LAotICAgIDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTMwLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAgMiwKLSAgICAyMzEsMjQ1LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTMwLDIzOSwyMzEsMjM5LDIzOCwyMjksCi0gICAgMTA3LDEyOCwgIDEsICA1LDExMiwgIDMsIDUzLDE0MCwgNTMsMTY0LCA1MywxOTQsIDk3LCAgMiwgNTMsMTQ2LAotICAgICA1MywxNTgsMjI1LDI0NCwyMzksMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgIDAsMjQyLDIyOSwKLSAgICAxMTAsMTI4LCAzNiwxNTYsMjM5LDI0MywyNDQsMjQyLDIzOSwyNDAsMjMyLDEwMSwgIDIsIDUzLDE3NywgNTMsCi0gICAgMTg4LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgOTAsMjM3LDIzOSwxMDAsMTI4LAotICAgICAgMiwxODgsMTEyLCAgMiwgNTMsMjAwLCA1MywyMDUsMjM2LDEwMSwxMjgsMjQ4LDI1NSwyNDIsMTExLCAgMiwKLSAgICAgNTMsMjEyLCA1MywyMjAsMjI1LDIyNywyMzIsMjI5LDExNSwxMjgsIDM0LCA4MCwxMjAsICAyLCA1MywyMjYsCi0gICAgIDUzLDI0NiwyMjksMjQxLDI0NSwyMjUsMTA4LDEyOSwgMzQsIDcyLCA1MywyMzYsMjM5LDI0MiwyMzMsMjM3LAotICAgIDIyNSwyMzEsMTAxLDEyOCwgMzQsIDgyLDIzMywyMzcsMjI1LDI0NCwyMjksMjM2LDI0OSwyMjksMjQxLDI0NSwKLSAgICAyMjUsMTA4LDEyOCwgMzQsIDY5LDExNCwgIDQsIDU0LCAxNSwgNTQsIDQyLCA1NCwgNDYsIDU0LCA5MSwyMjUsCi0gICAgMjI5LCA5NywgIDIsIDU0LCAyMywgNTQsIDMzLDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LAotICAgIDE0MiwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDE0MSwgOTksMTI4LCAzNSwgMTgsMTA1LCAgMiwKLSAgICAgNTQsIDUyLCA1NCwgNjYsMjMxLDIzMiwyNDQsMjMyLDIyNSwyMzYsMjMwLDI0MiwyMzMsMjM4LDEwMywxMjgsCi0gICAgIDMwLDE1NCwyMzgsMTAzLDEzMCwgIDAsMjI5LCA1NCwgNzUsIDU0LCA4MywyMjUsMjI3LDI0NSwyNDQsMTAxLAotICAgIDEyOCwgIDEsMjUxLDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgIDEsMjQyLDIzOSwxMTksICA4LCA1NCwKLSAgICAxMTEsIDU0LDExOCwgNTQsMjQ3LCA1NSwgNTcsIDU1LDEwNywgNTUsMTYyLCA1NSwxODUsIDU2LCAgNCwyMjYsCi0gICAgMjM5LDI0NCwxMDQsMTI4LCAzMywxNDgsMTAwLCAgMywgNTQsMTI2LCA1NCwxNjUsIDU0LDIxMiwyMjUsMjQzLAotICAgIDEwNCwgIDQsIDU0LDEzOCwgNTQsMTQ1LCA1NCwxNTIsIDU0LDE2MCwyMjgsMjM5LDI0NywxMTAsMTI4LCAzMywKLSAgICAyMjcsMjM2LDIyOSwyMzAsMTE2LDEyOCwgMzMsMjI0LDI0MiwyMzMsMjMxLDIzMiwxMTYsMTI4LCAzMywyMjYsCi0gICAgMjQ1LDExMiwxMjgsIDMzLDIyNSwyMjYsMTA4LCAgNSwgNTQsMTc4LCA1NCwxODUsIDU0LDE5MiwgNTQsMTk5LAotICAgICA1NCwyMDcsMjI2LDIzOSwyNDQsMTA0LDEyOCwgMzMsMjEyLDIyOCwyMzksMjQ3LDExMCwxMjgsIDMzLDIxMSwKLSAgICAyMzYsMjI5LDIzMCwxMTYsMTI4LCAzMywyMDgsMjQyLDIzMywyMzEsMjMyLDExNiwxMjgsIDMzLDIxMCwyNDUsCi0gICAgMTEyLDEyOCwgMzMsMjA5LDIzOSwyNDcsMTEwLDEzMSwgMzMsMTQ3LCA1NCwyMjQsIDU0LDIzMSwgNTQsMjM5LAotICAgIDIzNiwyMjksMjMwLDExNiwxMjgsIDMzLDE1MywyNDIsMjMzLDIzMSwyMzIsMTE2LDEyOCwgMzMsMTUyLDI0NywKLSAgICAyMzIsMjMzLDI0NCwxMDEsMTI4LCAzMywyMzMsMTA0LCAgMiwgNTQsMjUzLCA1NSwgNDgsMjI5LDIyNSwxMDAsCi0gICAgICA0LCA1NSwgIDksIDU1LCAxOSwgNTUsIDI5LCA1NSwgNDAsMjI4LDIzOSwyNDcsMjM4LDIzNywyMzksMTAwLAotICAgIDEyOCwgIDIsMTk3LDIzNiwyMjksMjMwLDI0NCwyMzcsMjM5LDEwMCwxMjgsICAyLDE5NCwyNDIsMjMzLDIzMSwKLSAgICAyMzIsMjQ0LDIzNywyMzksMTAwLDEyOCwgIDIsMTk1LDI0NSwyNDAsMjM3LDIzOSwxMDAsMTI4LCAgMiwxOTYsCi0gICAgMjM5LDI0MiwyMzMsMjUwLDIyOSwxMjAsMTI4LDI0OCwyMzEsMjM2LDIyOSwyMzAsMTE2LDEzMSwgMzMsMTQ0LAotICAgICA1NSwgNzAsIDU1LCA4NywgNTUsIDk5LDIyOCwyMjYsMTA4LDEyOSwgMzMsMjA4LCA1NSwgNzgsMjQzLDI0NCwKLSAgICAyNDIsMjM5LDIzNSwxMDEsMTI4LCAzMywyMDUsMjM5LDI0NiwyMjksMjQyLDI0MiwyMzMsMjMxLDIzMiwxMTYsCi0gICAgMTI4LCAzMywxOTgsMjQ3LDIzMiwyMzMsMjQ0LDEwMSwxMjgsIDMzLDIzMCwyNDIsMjMzLDIzMSwyMzIsMTE2LAotICAgIDEzMiwgMzMsMTQ2LCA1NSwxMjMsIDU1LDEzNSwgNTUsMTQzLCA1NSwxNTQsMjI4LDIyNiwyMzYsMjQzLDI0NCwKLSAgICAyNDIsMjM5LDIzNSwxMDEsMTI4LCAzMywyMDcsMjMyLDIyOSwyMjUsMjQ2LDEyMSwxMjgsIDM5LDE1OCwyMzksCi0gICAgMjQ2LDIyOSwyNDIsMjM2LDIyOSwyMzAsMTE2LDEyOCwgMzMsMTk2LDI0NywyMzIsMjMzLDI0NCwxMDEsMTI4LAotICAgICAzMywyMzIsMjQ0LDIyNSwgOTgsICAyLCA1NSwxNzAsIDU1LDE3NywyMzYsMjI5LDIzMCwxMTYsMTI4LCAzMywKLSAgICAyMjgsMjQyLDIzMywyMzEsMjMyLDExNiwxMjgsIDMzLDIyOSwyNDUsMTEyLDEzMiwgMzMsMTQ1LCA1NSwxOTgsCi0gICAgIDU1LDIyNiwgNTUsMjQ0LCA1NSwyNTIsMTAwLCAgMiwgNTUsMjA0LCA1NSwyMTYsMTEwLDEyOSwgMzMsMTQ5LAotICAgICA1NSwyMTAsMjI2LDI0MywxMDEsMTI4LCAzMywxNjgsMjM5LDI0NywyMzgsMjI2LDIyNSwyNDMsMTAxLDEyOCwKLSAgICAgMzMsMTY4LDIzNiwyMjksMjMwLDExNiwxMjksIDMzLDE1MCwgNTUsMjM1LDIzOSwyMzAsMjI4LDIzOSwyNDcsCi0gICAgMTEwLDEyOCwgMzMsMTk3LDI0MiwyMzMsMjMxLDIzMiwxMTYsMTI4LCAzMywxNTEsMjQ3LDIzMiwyMzMsMjQ0LAotICAgIDEwMSwxMjgsIDMzLDIzMSwyNDYsMjI5LDI0MiwyNDQsMjI5LDEyMCwxMjgsMjQ4LDIzMCwxMTUsICA1LCA1NiwKLSAgICAgMjUsIDU2LDEwMSwgNTYsMTQ2LCA1NiwyMjksIDU2LDIzOSwgOTksICAyLCA1NiwgMzEsIDU2LCA4MywyMzMsCi0gICAgMTA1LCAgMiwgNTYsIDM4LCA1NiwgNjEsMjI3LDIzMywyNDIsMjI3LDI0NSwxMDksMTI5LCAgMCwgOTQsIDU2LAotICAgICA0OSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA2MiwyNDQsMjMzLDIzNiwKLSAgICAyMjgsMTAxLDEyOSwgIDAsMTI2LCA1NiwgNzEsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsCi0gICAgMTI4LDI1NSwgOTQsMjQyLDIzMywyNDAsMTE2LDEyOSwgIDIsIDgxLCA1NiwgOTIsMjQ0LDI0NSwyNDIsMjM4LAotICAgIDIyOSwxMDAsMTI4LCAgMiwgODIsMjM3LDIyNSwyMzYsMTA4LCAgMiwgNTYsMTEwLCA1NiwxMjEsMjMyLDIzMywKLSAgICAyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LCA2NSwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsCi0gICAgIDk3LDEyOSwgNDgsMTYxLCA1NiwxMzQsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LAotICAgIDI1NSwxMDMsMjQ0LDIyOSwyNDIsMjMzLDExNSwgIDIsIDU2LDE1NiwgNTYsMjI1LDEwNywxMzEsICAwLCA0MiwKLSAgICAgNTYsMTY2LCA1NiwxOTQsIDU2LDIxNywgOTcsICAyLCA1NiwxNzIsIDU2LDE4NiwyMzYsMjQ0LDIzOSwyMzgsCi0gICAgMjI5LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTA5LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LAotICAgICAgNiwxMDksMTA5LCAgMiwgNTYsMjAwLCA1NiwyMDYsMjI1LDI0NCwxMDQsMTI4LCAzNCwgMjMsMjM5LDIzOCwKLSAgICAyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAxMCwyNDMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsCi0gICAgIDk3LDEwOSwxMjgsIDMyLCA2NiwyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LDI0NiwyMzMsMjQ5LAotICAgIDIzNywyNDAsMjQ0LDIzOSwyNDQsMjMzLDIyNywyMjUsMjM2LDIzNiwyNDksMjI5LDI0MSwyNDUsMjI1LDEwOCwKLSAgICAxMjgsIDM0LCA2NywxMTYsMTMyLCAgMCwgNjQsIDU3LCAxNSwgNTcsIDIyLCA1NywgMzQsIDU3LCA0MiwyMzMsCi0gICAgMjM2LDIyOCwxMDEsMTI4LCAgMCwyMjcsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LAotICAgIDI1NSwgMzIsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjU0LDEwNywyNDUsMjQyLDIzOCwyMjksMTAwLDEyOCwKLSAgICAgIDIsIDgwLDExNywgIDYsIDU3LCA2NCwgNTcsIDg5LCA1NywgOTYsIDU3LDEyMSwgNTcsMTQxLCA1NywxNTcsCi0gICAgIDk4LCAgMiwgNTcsIDcwLCA1NywgNzksMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNDgsMjM5LAotICAgIDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDMyLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAyMCwKLSAgICAyMzEsMTE3LCAgMiwgNTcsMTAzLCA1NywxMTIsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNDgsCi0gICAgMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMjAsMjM2LDIyOSwyMzgsMjMxLDI0NCwyMzIsMjM3LAotICAgIDIyNSwyNDIsMjM1LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIxNSwyMzcsMjI1LDI0NCwKLSAgICAyNDIsMjI1LDIzMSwyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgNzYsMjQ2LDIzOSwyNDcsCi0gICAgMjI5LDIzNiwyNDMsMjMzLDIzMSwxMTAsICAzLCA1NywxNzMsIDU3LDE4MywgNTcsMTkwLDIyNiwyMjksMjM4LAotICAgIDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIwNCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNzYsMjMxLDI0NSwKLSAgICAyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDIwNCwyNDYsMjI1LDIzMSwyNDIsMjI1LDIzMiwyMjUsCi0gICAgMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDYxLDEyMSwgIDIsIDU3LDIyMSwgNTcsMjMzLDIyNiwyMjUsMjQyLAotICAgIDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsIDk3LDIzMywxMTAsMTMwLCAgNSwyMjYsIDU3LDI0MiwKLSAgICAgNTgsICAxLDIyNSwyMzYsMjQ0LDIzOSwyMzgsMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsCi0gICAgIDMyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjI2LCA5OCwxNDQsICAwLCA5OCwgNTgsIDQ2LAotICAgICA1OCwxODEsIDU4LDE5MiwgNTgsMjAxLCA1OCwyMjYsIDYwLCAxMSwgNjAsIDczLCA2MCwxNDYsIDYyLCA3MiwKLSAgICAgNjIsIDg0LCA2MiwxMjcsIDYyLDEzNSwgNjIsMTQ1LCA2NCwgMTUsIDY0LCAzOSwgNjQsIDQ4LCA5NywgIDcsCi0gICAgIDU4LCA2MiwgNTgsIDcyLCA1OCwgOTYsIDU4LDEwMywgNTgsMTI4LCA1OCwxNTIsIDU4LDE2MywyMjYsMjI5LAotICAgIDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNzIsMjI3LDIzNSwyNDMsMjM2LDIyNSwyNDMsMTA0LDEyOSwKLSAgICAgIDAsIDkyLCA1OCwgODQsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNjAsCi0gICAgMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDQ0LDIzMSwxMTcsICAyLCA1OCwxMTAsIDU4LDExOSwyMzQsMjI1LAotICAgIDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE3MiwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA0NCwKLSAgICAxMDQsICAyLCA1OCwxMzQsIDU4LDE0NCwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMTIsCi0gICAgMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA2MywyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LAotICAgIDEyOCwgNDgsMjA4LDExNCwxMjksICAwLDEyNCwgNTgsMTY5LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwKLSAgICAyMjcsMTAxLDEyOCwyNTUsIDkyLDIyNiwyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwgIDUsCi0gICAgMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwyMDksMjI4LDIzOSwxMTYsICAyLCA1OCwyMDksIDU4LAotICAgIDIxOCwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsIDMwLCAgMywyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwKLSAgICAgMzAsICA1LDEwMSwgIDYsIDU4LDI0MCwgNTksICA1LCA1OSwgMjgsIDU5LDE3MCwgNTksMTgxLCA1OSwxOTMsCi0gICAgMjI1LDIzNywyMjksMjI4LDI0MywyMzMsMjQ4LDI0NCwyMjksMjI5LDIzOCwyNDQsMjMyLDIzOCwyMzksMjQ0LAotICAgIDIyOSwxMTUsMTI4LCAzOCwxMDgsIDk5LCAgMiwgNTksIDExLCA1OSwgMTgsMjI1LDI0NSwyNDMsMTAxLDEyOCwKLSAgICAgMzQsIDUzLDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA0OSwxMDQsICA1LCA1OSwgNDAsCi0gICAgIDU5LCA0OSwgNTksIDYzLCA1OSwgOTMsIDU5LDE1MiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LAotICAgICA0MCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTQ0LDEwNSwKLSAgICAgIDIsIDU5LCA2OSwgNTksIDg0LDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwyNTQsMTQ1LDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTIxLDIzNywxMDEsICAyLAotICAgICA1OSwxMDAsIDU5LDExMywyMjgsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwKLSAgICAxNDYsMjI5LDIzNywxMDUsICAyLCA1OSwxMjEsIDU5LDEzNiwyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsCi0gICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLDE1OSwyNDMsMjM5LDIzNiwyMjUsMjQ0LDIyOSwyMjgsMjI1LAotICAgIDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwgIDgsMjM4LDIzOSwyMzksMjM4LDIzMCwyMzMsMjM4LDIyNSwKLSAgICAyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwxMDksMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsCi0gICAgMjM4LCA5NywxMjgsIDQ4LDIxNywyMzgsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LAotICAgICA5OCwxMTYsMTMyLCAgNSwyMDksIDU5LDIwNSwgNTksMjI1LCA1OSwyNDUsIDU5LDI1NCwgOTcsMTI5LCAgMywKLSAgICAxNzgsIDU5LDIxMSwyNDMsMjQ5LDIzNywyMjYsMjM5LDIzNiwyMzEsMjQyLDIyOSwyMjksMTA3LDEyOCwgIDMsCi0gICAgMjA4LDIyOCwyMjUsMjMxLDIyOSwyNDMsMTA0LDEyOSwyNTEsIDQ5LCA1OSwyMzYsMjMyLDIyOSwyMjYsMjQyLAotICAgIDIyOSwxMTksMTI4LDI1MSwgNDksMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwyMDksMjQyLDIyNSwKLSAgICAyMzAsMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDc2LDEwNCwgIDIsIDYwLCAxNywgNjAsCi0gICAgIDY3LCA5NywgIDMsIDYwLCAyNSwgNjAsIDM1LCA2MCwgNDIsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LAotICAgIDEyOCwgIDksMTczLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA0NSwyMzEsMTE3LCAgMiwgNjAsIDQ5LCA2MCwKLSAgICAgNTgsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNzMsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsCi0gICAgMTI4LCAxMCwgNDUsMjM5LDIzOSwxMDcsMTI4LCAgMiwgODMsMTA1LCAgNSwgNjAsIDg1LCA2MCwgOTYsIDYwLAotICAgIDEwNywgNjAsMTIxLCA2MCwxMzUsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDExNSwKLSAgICAyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMjExLDIzNiwyMjUsMjI2LDIzMywyMjUsCi0gICAgMjM2LDIyNywyMzYsMjMzLDIyNywxMDcsMTI4LCAgMiwxNTIsMjM4LDIyOCwyMzMsMjMxLDI0NSwyNDIsMjM3LAotICAgIDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAgMiwyNDIsMjQ1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwKLSAgICAgNTEsIDQ5LDEwOCwgIDMsIDYwLDE1NCwgNjIsIDU1LCA2MiwgNjYsIDk3LCAgMiwgNjAsMTYwLCA2MiwgNTAsCi0gICAgMjI3LDEwNywgIDYsIDYwLDE3NSwgNjAsMTg0LCA2MCwyMjEsIDYxLDExNCwgNjEsMTY5LCA2MSwyMjEsMjI3LAotICAgIDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNywyMDcsMTAwLCAgMiwgNjAsMTkwLCA2MCwxOTksMjMzLDIyNSwKLSAgICAyMzcsMjM5LDIzOCwxMDAsMTI4LCAzNywxOTgsMjM5LDI0NywyMzgsMjQwLDIzOSwyMzMsMjM4LDI0NCwyMzMsCi0gICAgMjM4LDIzMSwyNDQsMjQyLDIzMywyMjUsMjM4LDIzMSwyMzYsMTAxLDEyOCwgMzcsMTg4LDEwOCwgIDIsIDYwLAotICAgIDIyNywgNjEsIDc0LDEwMSwgIDIsIDYwLDIzMywgNjEsIDEzLDIzMCwyNDQsMjQwLDIzOSwyMzMsMjM4LDI0NCwKLSAgICAyMzMsMjM4LDEwMywgIDIsIDYwLDI0OCwgNjEsICAyLDI0MCwyMzksMjMzLDIzOCwyNDQsMjI5LDExNCwxMjgsCi0gICAgIDM3LDE5NiwyNDQsMjQyLDIzMywyMjUsMjM4LDIzMSwyMzYsMTAxLDEyOCwgMzcsMTkyLDIzOCwyNDQsMjMzLAotICAgIDIyNywyNDUsMjM2LDIyNSwyNDIsMjI2LDI0MiwyMjUsMjI3LDIzNSwyMjksMTE2LCAgMiwgNjEsIDMzLCA2MSwKLSAgICAgNTMsMjM2LDIyOSwyMzAsMTE2LDEyOSwgNDgsIDE2LCA2MSwgNDIsMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsCi0gICAgMjI1LDEwOCwxMjgsMjU0LCA1OSwyNDIsMjMzLDIzMSwyMzIsMTE2LDEyOSwgNDgsIDE3LCA2MSwgNjMsMjQ2LAotICAgIDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwxMjgsMjU0LCA2MCwyMzksMjQ3LDIyOSwxMTQsICAyLCA2MSwKLSAgICAgODMsIDYxLCA5OCwyMzYsMjI5LDIzMCwyNDQsMjQ0LDI0MiwyMzMsMjI1LDIzOCwyMzEsMjM2LDEwMSwxMjgsCi0gICAgIDM3LDIyNywyNDIsMjMzLDIzMSwyMzIsMjQ0LDI0NCwyNDIsMjMzLDIyNSwyMzgsMjMxLDIzNiwxMDEsMTI4LAotICAgICAzNywyMjYsMTE0LCAgMiwgNjEsMTIwLCA2MSwxMzEsMjI5LDIyNywyNDQsMjI1LDIzOCwyMzEsMjM2LDEwMSwKLSAgICAxMjgsIDM3LDE3MiwyMzMsMjMxLDIzMiwyNDQsMjQwLDIzOSwyMzMsMjM4LDI0NCwyMzMsMjM4LDEwMywgIDIsCi0gICAgIDYxLDE0OCwgNjEsMTU4LDI0MCwyMzksMjMzLDIzOCwyNDQsMjI5LDExNCwxMjgsIDM3LDE4NiwyNDQsMjQyLAotICAgIDIzMywyMjUsMjM4LDIzMSwyMzYsMTAxLDEyOCwgMzcsMTgyLDExNSwgIDMsIDYxLDE3NywgNjEsMjA3LCA2MSwKLSAgICAyMTUsMTA5LCAgMiwgNjEsMTgzLCA2MSwxOTUsMjI1LDIzNiwyMzYsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsCi0gICAgMTI4LCAzNywxNzAsMjMzLDIzNiwyMzMsMjM4LDIzMSwyMzAsMjI1LDIyNywxMDEsMTI4LCAzOCwgNTksMjQxLAotICAgIDI0NSwyMjUsMjQyLDEwMSwxMjgsIDM3LDE2MCwyNDQsMjI1LDExNCwxMjgsIDM4LCAgNSwyNDUsMjQwLDExMiwKLSAgICAgIDIsIDYxLDIyOSwgNjIsIDExLDIyOSwxMTQsICAyLCA2MSwyMzYsIDYxLDI1MSwyMzYsMjI5LDIzMCwyNDQsCi0gICAgMjQ0LDI0MiwyMzMsMjI1LDIzOCwyMzEsMjM2LDEwMSwxMjgsIDM3LDIyOCwyNDIsMjMzLDIzMSwyMzIsMjQ0LAotICAgIDI0NCwyNDIsMjMzLDIyNSwyMzgsMjMxLDIzNiwxMDEsMTI4LCAzNywyMjksMjM5LDIzMywyMzgsMjQ0LDIzMywKLSAgICAyMzgsMTAzLCAgMiwgNjIsIDIzLCA2MiwgMzksMjQzLDIzNywyMjUsMjM2LDIzNiwyNDQsMjQyLDIzMywyMjUsCi0gICAgMjM4LDIzMSwyMzYsMTAxLDEyOCwgMzcsMTgwLDI0NCwyNDIsMjMzLDIyNSwyMzgsMjMxLDIzNiwxMDEsMTI4LAotICAgICAzNywxNzgsMjM4LDEwNywxMjgsIDM2LCAzNSwyMzMsMjM4LDIyOSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwKLSAgICAgMzAsICA3LDIzOSwyMjcsMTA3LDEyOCwgMzcsMTM2LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsCi0gICAgMTAxLDEyOCwyNTUsIDY2LDExMSwgIDMsIDYyLCA5MiwgNjIsMTA1LCA2MiwxMTYsMjI2LDIyNSwyMzMsMjM3LAotICAgIDIyNSwyMzMsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDI2LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwKLSAgICAgOTcsMTI4LCA0OCwxMjQsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDIyMCwyNDAsCi0gICAgMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTU3LDI0MSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLAotICAgIDE5NSwxMTQsICA0LCA2MiwxNTUsIDYzLDE0OSwgNjMsMjIyLCA2NCwgIDUsMjI1LCA5OSwgIDIsIDYyLDE2MiwKLSAgICAgNjMsIDU2LDEwMSwgIDMsIDYyLDE3MCwgNjIsMTc1LCA2MiwyNDMsMjI5LDEyMCwxMjgsMjQ4LDI0NCwyMzYsCi0gICAgMjI5LDIzMCwxMTYsMTMzLCAgMCwxMjMsIDYyLDE5MiwgNjIsMTk3LCA2MiwyMTksIDYyLDIyNywgNjIsMjMyLAotICAgIDIyNiwxMTYsMTI4LDI0OCwyNDMsMTA5LCAgMiwgNjIsMjAzLCA2MiwyMDgsMjMzLDEwMCwxMjgsMjQ4LDI0MiwKLSAgICAyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDkxLDI0MywyMzcsMjI1LDIzNiwxMDgsCi0gICAgMTI4LDI1NCwgOTEsMjQ0LDExMiwxMjgsMjQ4LDI0MSwyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LAotICAgIDEyOCwyNTQsIDU1LDI0MiwyMzMsMjMxLDIzMiwxMTYsMTMzLCAgMCwxMjUsIDYzLCAgNSwgNjMsIDEwLCA2MywKLSAgICAgMzIsIDYzLCA0MCwgNjMsIDQ1LDIyNiwxMTYsMTI4LDI0OCwyNTQsMTA5LCAgMiwgNjMsIDE2LCA2MywgMjEsCi0gICAgMjMzLDEwMCwxMjgsMjQ4LDI1MywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDkzLAotICAgIDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI1NCwgOTIsMjQ0LDExMiwxMjgsMjQ4LDI1MiwyNDYsMjI5LDI0MiwKLSAgICAyNDQsMjMzLDIyNywyMjUsMTA4LDEyOCwyNTQsIDU2LDIzNSwyMjksMTE2LCAgMiwgNjMsIDY0LCA2MywxMDYsCi0gICAgMjM2LDIyOSwyMzAsMTE2LDEzMiwgIDAsIDkxLCA2MywgNzksIDYzLCA4NCwgNjMsIDg5LCA2MywxMDEsMjI2LAotICAgIDExNiwxMjgsMjQ4LDI0MCwyMjksMTIwLDEyOCwyNDgsMjM5LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwKLSAgICAyMjcsMTAxLDEyOCwyNTUsIDU5LDI0NCwxMTIsMTI4LDI0OCwyMzgsMjQyLDIzMywyMzEsMjMyLDExNiwxMzIsCi0gICAgICAwLCA5MywgNjMsMTIyLCA2MywxMjcsIDYzLDEzMiwgNjMsMTQ0LDIyNiwxMTYsMTI4LDI0OCwyNTEsMjI5LAotICAgIDEyMCwxMjgsMjQ4LDI1MCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA2MSwKLSAgICAyNDQsMTEyLDEyOCwyNDgsMjQ5LDIyOSwyNDYsMTAxLDEzMSwgIDIsMjE2LCA2MywxNjEsIDYzLDE3MiwgNjMsCi0gICAgMTc4LDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgNDYsMjI3LDIzNywgOTgsMTI4LAotICAgICAgMywgIDYsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDQsMjI5LDEwMCwgIDMsIDYzLDE5MywgNjMsMjA0LCA2MywKLSAgICAyMTAsMjI2LDIyOSwyMzYsMjM5LDI0NywyMjcsMjM3LCA5OCwxMjgsICAzLCA0NywyMjcsMjM3LCA5OCwxMjgsCi0gICAgICAzLCAxNywyMjgsMjM5LDI0NSwyMjYsMjM2LDIyOSwyMjcsMjM3LCA5OCwxMjgsICAzLCA5NywyMzMsMjI4LAotICAgIDIzMSwxMDEsICAyLCA2MywyMzEsIDYzLDI0MiwyMjYsMjI5LDIzNiwyMzksMjQ3LDIyNywyMzcsIDk4LDEyOCwKLSAgICAgIDMsIDQyLDIzMywyMzgsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwyMjgsMjI2LDIyOSwyMzYsMjM5LDI0NywyMjcsCi0gICAgMjM3LCA5OCwxMjgsICAzLCA1OCwyMzksMjM1LDIyOSwyMzgsMjI2LDIyNSwxMTQsMTI4LCAgMCwxNjYsMTE1LAotICAgICAgMiwgNjQsIDIxLCA2NCwgMjksMjQ0LDI0MiwyMzksMjM1LDEwMSwxMjgsICAxLDEyOCwyNDUsMjQwLDIyOSwKLSAgICAyNDIsMjMzLDIzOSwxMTQsMTI4LDI0NiwyMzQsMjQ0LDIzOSwyNDAsMjI2LDIyNSwxMTQsMTI4LCAgMSwxMzEsCi0gICAgMTE3LCAgMywgNjQsIDU2LCA2NCwgNjcsIDY0LCA3OCwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LAotICAgIDEyOCwgNDgsMTE4LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyMTQsMjM2LDEwOCwKLSAgICAgIDIsIDY0LCA4NSwgNjQsMTE1LDIyOSwxMTYsMTMwLCAzMiwgMzQsIDY0LCA5NCwgNjQsMTA0LDIzMywyMzgsCi0gICAgMjQ2LDIyOSwyNDIsMjQzLDEwMSwxMjgsIDM3LDIxNiwyMzksMjQwLDIyOSwyNDIsMjI1LDI0NCwyMzksMTE0LAotICAgIDEyOCwgMzQsIDI1LDI0MywyMjksMjQ5LDEwMSwxMjgsIDM3LDIwNiwgOTksMTQzLCAgMCwgOTksIDY0LDE1NiwKLSAgICAgNjUsMTA1LCA2NSwxMTYsIDY1LDE4MCwgNjUsMjExLCA2NiwgNDgsIDY3LDIxNSwgNjgsMTk5LCA2OSwgNDMsCi0gICAgIDY5LCA5MiwgNzIsIDg0LCA3MiwgOTIsIDcyLDEwMiwgNzIsMTE0LCA3MiwxNDcsIDk3LCAgOSwgNjQsMTc2LAotICAgICA2NCwxODcsIDY0LDE5NywgNjQsMjA0LCA2NCwyMTEsIDY0LDIzNiwgNjQsMjQ2LCA2NSwgNDIsIDY1LCA1MSwKLSAgICAyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsMTEwLDIyNiwyMjksMjM4LDIzMSwyMjUsCi0gICAgMjM2LDEwNSwxMjgsICA5LDE1NCwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMSwgIDcsMjI4LDIyOSwyNDYsIDk3LAotICAgIDEyOCwgIDksIDI2LDIzMSwxMTcsICAyLCA2NCwyMTgsIDY0LDIyNywyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwKLSAgICAxMjgsIDEwLDE1NCwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAyNiwyMzYsMjQzLDI0MSwyNDUsCi0gICAgMjI1LDI0MiwxMDEsMTI4LCA1MSwxMzYsMjM4LDIyOCwyNDIsMjI1LDIyNiwyMzMsMjM4LDIyOCwxMTcsICA0LAotICAgICA2NSwgIDgsIDY1LCAxOCwgNjUsIDI0LCA2NSwgMzEsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwKLSAgICAgIDksMTI5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDE2LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAgMSwyMzEsCi0gICAgMjQ1LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTI5LDI0MCwyNDMsMjM2LDIzOSwyMjcsMTA3LAotICAgIDEyOCwgMzMsMjM0LDExNCwgIDMsIDY1LCA1OSwgNjUsIDY1LCA2NSwgOTEsMjI5LDIzOSwxMDIsMTI4LCAzMywKLSAgICAgIDUsMjM5LDExMCwxMzAsICAyLDE5OSwgNjUsIDc0LCA2NSwgODUsMjI2LDIyOSwyMzYsMjM5LDI0NywyMjcsCi0gICAgMjM3LCA5OCwxMjgsICAzLCA0NCwyMjcsMjM3LCA5OCwxMjgsICAzLCAxMiwyNDIsMjMzLDIyNSwyMzEsMjI5LAotICAgIDI0MiwyMjksMjQ0LDI0NSwyNDIsMTEwLDEyOCwgMzMsMTgxLDIyNiwyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwKLSAgICAxMTEsMTI4LCA0OSwgMjQsIDk5LCAgNCwgNjUsMTI2LCA2NSwxMzMsIDY1LDE1MiwgNjUsMTc0LDIyNSwyNDIsCi0gICAgMjM5LDExMCwxMjgsICAxLCAxMywyMjksMjI4LDIzMywyMzYsMjM2LCA5NywxMjksICAwLDIzMSwgNjUsMTQ0LAotICAgIDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwgIDksMjMzLDI0MiwgOTksICAyLCA2NSwxNjAsIDY1LDE2NSwKLSAgICAyMzYsMTAxLDEyOCwgMzYsMjEwLDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOCwgIDEsICA5LDI0NSwyNDIsCi0gICAgMTA4LDEyOCwgIDIsIDg1LDEwMCwgIDIsIDY1LDE4NiwgNjUsMjAyLDIzOSwxMTYsMTI5LCAgMSwgMTEsIDY1LAotICAgIDE5MywyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsICAxLCAxMSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwKLSAgICAxMjgsIDUxLDE5NywxMDEsICAyLCA2NSwyMTcsIDY1LDIzMywyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOSwgIDAsCi0gICAgMTg0LCA2NSwyMjcsMjI3LDIzNywgOTgsMTI4LCAgMywgMzksMjM4LDExNiwxMzIsICAwLDE2MiwgNjUsMjQ2LAotICAgICA2NiwgMTQsIDY2LCAyNiwgNjYsIDM3LDEwNSwgIDIsIDY1LDI1MiwgNjYsICA0LDIzMSwyNDIsMjI1LDIyOCwKLSAgICAxMDEsMTI4LCAzMywgIDMsMjM4LDIzMCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwyNDYsMjIzLDIzNywyMzksCi0gICAgMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsMjI0LDIzOSwyMzYsMjI4LDI0MywyNDQsMjQ5LAotICAgIDIzNiwxMDEsMTI4LDI0NywxNjIsMjQzLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDIyNCwKLSAgICAxMDQsICA1LCA2NiwgNjAsIDY2LDEyMywgNjYsMTM0LCA2NywgNjIsIDY3LDE1NCwgOTcsICA0LCA2NiwgNzAsCi0gICAgIDY2LCA4MSwgNjYsIDkxLCA2NiwgOTgsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LAotICAgIDEyMSwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNTUsMjI4LDIyOSwyNDYsIDk3LDEyOCwKLSAgICAgIDksIDI3LDIzMSwxMTcsICAyLCA2NiwxMDUsIDY2LDExNCwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsCi0gICAgIDEwLDE1NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAyNywyMjYsMjM5LDI0MCwyMzksMjM3LAotICAgIDIzOSwyMzAsMTExLDEyOCwgNDksIDIwLDEwMSwgIDYsIDY2LDE0OCwgNjYsMTY4LCA2NiwxOTIsIDY3LCAgNCwKLSAgICAgNjcsIDE2LCA2NywgMzcsMjI1LDIyNiwyMzUsMjMyLDIyNSwyNDMsMjMzLDIyNSwyMzgsMjI3LDI0OSwyNDIsCi0gICAgMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE4OSwgOTksICAyLCA2NiwxNzQsIDY2LDE4MiwyMzUsMjM3LAotICAgIDIyNSwyNDIsMTA3LDEyOCwgMzksIDE5LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA3MSwKLSAgICAxMDAsICAyLCA2NiwxOTgsIDY2LDI0MiwyMjksMjQzLDIyNywyMjksMjM4LDIyOCwyMjksMTE0LCAgMiwgNjYsCi0gICAgMjExLCA2NiwyMzEsMjI1LDIyNiwyMzUsMjMyLDIyNSwyNDMsMjMzLDIyNSwyMzgsMjI3LDI0OSwyNDIsMjMzLAotICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE5MSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsMTgzLDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDI0MywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsCi0gICAgIDk5LDEyOCwgIDQsMjQ1LDIzMiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsMTE1LAotICAgIDIzNSwyMzIsMjI1LDIzNSwyMjUsMjQzLDI0MywyMzMsMjI1LDIzOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwKLSAgICAyMzMsIDk5LDEyOCwgIDQsMjA0LDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwyMzYsMjQzLDI0NCwyNDIsCi0gICAgMjM5LDIzNSwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE4NSwxMDUsMTI5LAotICAgICAgMywxOTksIDY3LCA2OCwyMjksMjQ1LDIyNywxMDQsICA0LCA2NywgODEsIDY3LDExNiwgNjcsMTMxLCA2NywKLSAgICAxNDAsIDk3LCAgMiwgNjcsIDg3LCA2NywxMDIsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsCi0gICAgMjI5LDIyNSwxMTAsMTI4LCA1MCwxMTksMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LAotICAgIDExMCwxMjgsIDUwLCAyMywyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwKLSAgICAxMjgsIDUwLDEwNSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA3NCwyNDAsMjI1LDI0MiwyMjksCi0gICAgMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsICA5LDExMSwgIDIsIDY3LDE2MCwgNjcsMjEwLAotICAgIDIyNywxMDQsICAzLCA2NywxNjksIDY3LDE5MSwgNjcsMjAxLDIyNSwxMTAsICAyLCA2NywxNzYsIDY3LDE4NCwKLSAgICAyMzEsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDEwLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAgOCwyMzMsCi0gICAgMjM4LDIzMSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgIDksMjM5LDIyOSwyNDQsMjMyLDIyNSwxMDUsMTI4LAotICAgICAxNCwgMTIsMjM5LDEwNywxMjgsICAxLDEzNiwxMDUsICAyLCA2NywyMjEsIDY4LCA2NywyMjksMjQ1LCA5OSwKLSAgICAgIDUsIDY3LDIzNSwgNjgsIDE0LCA2OCwgMjksIDY4LCAzOCwgNjgsIDUyLCA5NywgIDIsIDY3LDI0MSwgNjgsCi0gICAgICAwLDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsMTE4LAotICAgIDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgMjIsMjI3LDIzMywKLSAgICAyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMDQsMjM1LDIzOSwyNDIsCi0gICAgMjI5LDIyNSwxMTAsMTI4LCA0OSwgNzIsMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LAotICAgIDExMCwxMjgsIDUwLCAgOCwyNDUsMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwKLSAgICAxMjgsIDUwLCAyOCwyNDIsIDk5LCAgMiwgNjgsIDc0LCA2OCwxNjksMjM2LDEwMSwxMzIsIDM3LDIwMywgNjgsCi0gICAgIDg3LCA2OCwgOTgsIDY4LDEwMywgNjgsMTI3LDIzNywyNDUsMjM2LDI0NCwyMzMsMjQwLDIzNiwxMjEsMTI4LAotICAgICAzNCwxNTEsMjM5LDExNiwxMjgsIDM0LDE1MywxMTIsICAyLCA2OCwxMDksIDY4LDExNSwyMzYsMjQ1LDExNSwKLSAgICAxMjgsIDM0LDE0OSwyMzksMjQzLDI0NCwyMjUsMjM2LDIzNywyMjUsMjQyLDEwNywxMjgsIDQ4LCA1NCwyNDcsCi0gICAgMjMzLDI0NCwxMDQsICAyLCA2OCwxMzYsIDY4LDE1MiwyMzYsMjI5LDIzMCwyNDQsMjMyLDIyNSwyMzYsMjMwLAotICAgIDIyNiwyMzYsMjI1LDIyNywxMDcsMTI4LCAzNywyMDgsMjQyLDIzMywyMzEsMjMyLDI0NCwyMzIsMjI1LDIzNiwKLSAgICAyMzAsMjI2LDIzNiwyMjUsMjI3LDEwNywxMjgsIDM3LDIwOSwyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwxMzAsCi0gICAgICAyLDE5OCwgNjgsMTgyLCA2OCwxOTMsMjI2LDIyOSwyMzYsMjM5LDI0NywyMjcsMjM3LCA5OCwxMjgsICAzLAotICAgICA0NSwyMjcsMjM3LCA5OCwxMjgsICAzLCAgMiwxMDgsICAzLCA2OCwyMDcsIDY4LDIxMywgNjksIDExLDIyOSwKLSAgICAyMjUsMTE0LDEyOCwgMzUsIDM5LDIzMywyMjcsMTA3LCAgNCwgNjgsMjI1LCA2OCwyMzYsIDY4LDI0NSwgNjgsCi0gICAgMjU1LDIyNSwyMzYsMjQ2LDIyOSwyMzksMjM2LDIyNSwxMTQsMTI4LCAgMSwxOTQsMjI4LDIyOSwyMzgsMjQ0LAotICAgIDIyNSwxMDgsMTI4LCAgMSwxOTIsMjM2LDIyNSwyNDQsMjI5LDI0MiwyMjUsMTA4LDEyOCwgIDEsMTkzLDI0MiwKLSAgICAyMjksMjQ0LDI0MiwyMzksMjMwLDIzNiwyMjksMTIwLDEyOCwgIDEsMTk1LDI0NSwgOTgsMTI5LCAzOCwgOTksCi0gICAgIDY5LCAxOCwyNDMsMjQ1LDIzMywxMTYsICAyLCA2OSwgMjcsIDY5LCAzNSwyMjYsMjM2LDIyNSwyMjcsMTA3LAotICAgIDEyOCwgMzgsIDk5LDI0NywyMzIsMjMzLDI0NCwxMDEsMTI4LCAzOCwxMDMsMTA5LCAgMywgNjksIDUxLCA2OSwKLSAgICAgNjUsIDY5LCA3NiwyMjcsMjQ1LDIyNiwyMjksMjI4LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsCi0gICAgMTY0LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNjcsMjQzLDI0MSwyNDUsMjI1LAotICAgIDI0MiwyMjksMjI4LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTYwLDExMSwgIDgsIDY5LDExMCwKLSAgICAgNjksMTIxLCA2OSwyMDgsIDcwLDE1MCwgNzEsMTc5LCA3MSwyMTAsIDcyLCA2MSwgNzIsIDcwLDIyNSwyNDIsCi0gICAgMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMjksMjM2LDIzOSwxMTAsMTMxLCAgMCwgNTgsIDY5LAotICAgIDEzMywgNjksMTU4LCA2OSwxNzcsMjM3LDIzOSwxMTAsICAyLCA2OSwxNDEsIDY5LDE0OSwyMjksMjQ0LDIyNSwKLSAgICAyNDIsMTIxLDEyOCwgMzIsMTYxLDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDI2LDExNSwgIDIsCi0gICAgIDY5LDE2NCwgNjksMTcwLDIzMywyMzEsMTEwLDEyOCwgMzIsMTYxLDIzNywyMjUsMjM2LDEwOCwxMjgsMjU0LAotICAgICA4NSwyNDQsMjQyLDIzMywyMjUsMjM4LDIzMSwyNDUsMjM2LDIyNSwxMTQsICAyLCA2OSwxOTIsIDY5LDIwMiwKLSAgICAyMzIsMjI1LDIzNiwyMzAsMjM3LDIzOSwxMDAsMTI4LCAgMiwyMDksMjM3LDIzOSwxMDAsMTI4LCAgMiwyMDgsCi0gICAgMTA5LCAgMiwgNjksMjE0LCA3MCwxNDMsMjM3LCA5NywxMzQsICAwLCA0NCwgNjksMjMxLCA3MCwgMzksIDcwLAotICAgICA1MCwgNzAsIDYyLCA3MCwgOTIsIDcwLDExNSwgOTcsICAzLCA2OSwyMzksIDcwLCAgOSwgNzAsIDE3LDIyNiwKLSAgICAyMzksMjQ2LDEwMSwgIDIsIDY5LDI0OCwgNjksMjU0LDIyNywyMzcsIDk4LDEyOCwgIDMsIDE5LDI0MiwyMzMsCi0gICAgMjMxLDIzMiwyNDQsMjI3LDIzNywgOTgsMTI4LCAgMywgMjEsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsMjQ2LAotICAgIDE5NSwxMTQsICAyLCA3MCwgMjMsIDcwLCAzMCwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgMTIsMjM3LDIyOSwKLSAgICAyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgOTMsMjMzLDIzOCwyMzAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsCi0gICAgMjQ2LDIyNSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAxMiwyNDIsMjI5LAotICAgIDI0NiwyMjksMjQyLDI0MywyMjksMTAwLCAgMiwgNzAsIDc1LCA3MCwgODYsMjI1LDIyNiwyMzksMjQ2LDIyOSwKLSAgICAyMjcsMjM3LCA5OCwxMjgsICAzLCAyMCwyMzcsMjM5LDEwMCwxMjgsICAyLDE4OSwxMTUsICAyLCA3MCwgOTgsCi0gICAgIDcwLDEwNSwyMzcsMjI1LDIzNiwxMDgsMTI4LDI1NCwgODAsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LAotICAgIDEyOCwyNDYsMjI2LDI0NCwyNDUsMjQyLDIzOCwyMjksMTAwLCAgMiwgNzAsMTI2LCA3MCwxMzcsMjI1LDIyNiwKLSAgICAyMzksMjQ2LDIyOSwyMjcsMjM3LCA5OCwxMjgsICAzLCAxOCwyMzcsMjM5LDEwMCwxMjgsICAyLDE4NywyNDAsCi0gICAgMjI1LDI0MywxMTUsMTI4LCAzOCwgNjAsMTEwLCAgMiwgNzAsMTU2LCA3MCwxNjUsMjMxLDI0MiwyNDUsMjI5LAotICAgIDIzOCwxMTYsMTI4LCAzNCwgNjksMTE2LCAgMiwgNzAsMTcxLCA3MCwxODUsMjM5LDI0NSwyNDIsMjMzLDIzOCwKLSAgICAyNDQsMjI5LDIzMSwyNDIsMjI1LDEwOCwxMjgsIDM0LCA0NiwyNDIsMjM5LDEwOCwxNDIsIDM1LCAgMywgNzAsCi0gICAgMjE5LCA3MCwyMjUsIDcwLDI0MCwgNzAsMjU1LCA3MSwgNDMsIDcxLCA4OCwgNzEsMTAyLCA3MSwxMDcsIDcxLAotICAgIDExMiwgNzEsMTE3LCA3MSwxMjMsIDcxLDEyOCwgNzEsMTY5LCA3MSwxNzQsMTkzLDE5NSwgNzUsMTI4LCAgMCwKLSAgICAgIDYsIDY2LCAgMiwgNzAsMjMxLCA3MCwyMzYsMTk3LCA3NiwxMjgsICAwLCAgNywgODMsMTI4LCAgMCwgIDgsCi0gICAgIDY3LCAgMiwgNzAsMjQ2LCA3MCwyNTEsMTkzLCA3OCwxMjgsICAwLCAyNCwgODIsMTI4LCAgMCwgMTMsIDY4LAotICAgICAgMywgNzEsICA3LCA3MSwgMzMsIDcxLCAzOCwgNjcsICA0LCA3MSwgMTcsIDcxLCAyMSwgNzEsIDI1LCA3MSwKLSAgICAgMjksIDQ5LDEyOCwgIDAsIDE3LCA1MCwxMjgsICAwLCAxOCwgNTEsMTI4LCAgMCwgMTksIDUyLDEyOCwgIDAsCi0gICAgIDIwLDE5NywgNzYsMTI4LCAgMCwxMjcsMjA0LCA2OSwxMjgsICAwLCAxNiwgNjksICA1LCA3MSwgNTUsIDcxLAotICAgICA1OSwgNzEsIDY0LCA3MSwgNjksIDcxLCA3NCwgNzcsMTI4LCAgMCwgMjUsMjA2LCA4MSwxMjgsICAwLCAgNSwKLSAgICAyMDcsIDg0LDEyOCwgIDAsICA0LDIxMSwgNjcsMTI4LCAgMCwgMjcsIDg0LCAgMiwgNzEsIDgwLCA3MSwgODQsCi0gICAgIDY2LDEyOCwgIDAsIDIzLCA4OCwxMjgsICAwLCAgMywgNzAsICAyLCA3MSwgOTQsIDcxLCA5OCwgNzAsMTI4LAotICAgICAgMCwgMTIsIDgzLDEyOCwgIDAsIDI4LDE5OSwgODMsMTI4LCAgMCwgMjksMjAwLCA4NCwxMjgsICAwLCAgOSwKLSAgICAyMDQsIDcwLDEyOCwgIDAsIDEwLDIwNiwxOTMsIDc1LDEyOCwgIDAsIDIxLDIxMCwgODMsMTI4LCAgMCwgMzAsCi0gICAgIDgzLCAgNSwgNzEsMTQwLCA3MSwxNDQsIDcxLDE1NCwgNzEsMTU5LCA3MSwxNjQsIDczLDEyOCwgIDAsIDE1LAotICAgICA3OSwxMjksICAwLCAxNCwgNzEsMTUwLCA4NCwxMjgsICAwLCAgMiwyMTIsIDg4LDEyOCwgIDAsICAxLDIxMywKLSAgICAgNjYsMTI4LCAgMCwgMjYsMjE3LCA3OCwxMjgsICAwLCAyMiwyMTMsIDgzLDEyOCwgIDAsIDMxLDIxNCwgODQsCi0gICAgMTI4LCAgMCwgMTEsMjQwLDI0OSwyNDIsMjMzLDIzMSwyMzIsMTE2LDEyOSwgIDAsMTY5LCA3MSwxOTEsMTE1LAotICAgICAgMiwgNzEsMTk3LCA3MSwyMDMsMjI1LDIzOCwxMTUsMTI4LDI0OCwyMzMsMjI5LDI0MiwyMzMsMTAyLDEyOCwKLSAgICAyNDYsMjE3LDExNCwgIDIsIDcxLDIxNiwgNzIsIDQ0LDIzOCwyMjksMjQyLDIyNiwyNDIsMjI1LDIyNywyMzUsCi0gICAgMjI5LDExNiwgIDIsIDcxLDIzMSwgNzIsICA5LDIzNiwyMjksMjMwLDExNiwxMzAsIDQ4LCAxMiwgNzEsMjQyLAotICAgICA3MSwyNTQsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwgOTgsMjQ2LDIyOSwKLSAgICAyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwxMjgsMjU0LCA2NSwyNDIsMjMzLDIzMSwyMzIsMTE2LDEzMCwgNDgsCi0gICAgIDEzLCA3MiwgMjEsIDcyLCAzMywyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LAotICAgICA5OSwyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LDEyOCwyNTQsIDY2LDI0MCwyMzksMjQyLDIyNSwKLSAgICAyNDQsMjMzLDIzOSwyMzgsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxMjcsMjQzLDI0MSwyNDUsCi0gICAgMjI1LDI0MiwxMDEsMTI4LCA1MSwxOTksMjQ2LDIyOSwyNDIsMjM1LDIzMSwyNDMsMjQxLDI0NSwyMjUsMjQyLAotICAgIDEwMSwxMjgsIDUxLDE5OCwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTU4LDI0MiwyNDUsMjUwLDIyOSwKLSAgICAyMzMsMjQyLDExMSwxMjgsIDMyLDE2MiwyNDMsMjQ0LDI0MiwyMjksMjQ0LDIyNywyMzIsMjI5LDEwMCwxMjgsCi0gICAgICAyLDE1MSwyNDUsMTE0LCAgMiwgNzIsMTIxLCA3MiwxMzksMjM2LDEyMSwgIDIsIDcyLDEyOCwgNzIsMTM0LAotICAgIDIyNSwyMzgsMTAwLDEyOCwgMzQsMjA3LDIzOSwxMTQsMTI4LCAzNCwyMDYsMjQyLDIyOSwyMzgsMjI3LDEyMSwKLSAgICAxMjgsICAwLDE2NCwyNDksMTE0LCAgNCwgNzIsMTU4LCA3MiwxNjYsIDcyLDE3MywgNzIsMTgxLDE5NCwyNDIsCi0gICAgMjI5LDI0NiwxMDEsMTI4LDI0NiwyMDksMTk4LDIzNiwyMjksMTIwLDEyOCwyNDYsMjEwLDIyNiwyNDIsMjI5LAotICAgIDI0NiwxMDEsMTI4LDI0NiwyMTIsMjMwLDIzNiwyMjksMTIwLDEyOCwyNDYsMjEzLDEwMCwxNDYsICAwLDEwMCwKLSAgICAgNzIsMjI4LCA3NCwxMTAsIDc1LDEzNCwgNzUsMTk0LCA3NiwxMTQsIDc3LCA2OCwgNzcsMTMwLCA3OCwgNTksCi0gICAgIDc4LCA3MiwgNzgsIDgxLCA3OCwxMDcsIDc4LDEzMiwgNzgsMTQxLCA3OSwyMDgsIDc5LDIxNiwgNzksMjI3LAotICAgICA3OSwyNDcsIDgwLCAxOSwgOTcsIDExLCA3MiwyNTIsIDczLCAgNywgNzMsIDE3LCA3MywgODksIDczLDE1MiwKLSAgICAgNzMsMTYzLCA3MywxNzQsIDczLDI0MywgNzQsIDQ5LCA3NCwgNTUsIDc0LCA4NSwyMjUsMjQyLDIzNywyMjksCi0gICAgMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsMTAwLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LAotICAgIDE2NiwxMDAsICA1LCA3MywgMjksIDczLCAzOCwgNzMsIDQ0LCA3MywgNTgsIDczLCA3NCwyMjUsMjQyLDIyNSwKLSAgICAyMjYsMjMzLCA5OSwxMjgsICA2LCA1NCwyMjksMjQ2LCA5NywxMjgsICA5LCAzOCwyMzAsMjMzLDIzOCwyMjUsCi0gICAgMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTkwLDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LAotICAgIDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE5MSwyMzcsMjI5LDIyOCwyMzMsMjI1LDIzNiwKLSAgICAyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE5MiwxMDMsICAzLCA3MywgOTcsIDczLDExNCwgNzMsCi0gICAgMTI4LDIyOSwyNDMsMTA0LDEyOSwgIDUsMTg4LCA3MywxMDUsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAotICAgICAgNSwxODgsMjMxLDIyOSwxMTQsMTI5LCAzMiwgMzIsIDczLDEyMiwyMjgsMjI2LDEwOCwxMjgsIDMyLCAzMywKLSAgICAxMTcsICAyLCA3MywxMzQsIDczLDE0MywyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE2NiwyNDIsCi0gICAgMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAzOCwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LAotICAgIDEyOCwgNDgsIDk2LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwxOTIsMTA4LCAgMywKLSAgICAgNzMsMTgyLCA3MywxOTEsIDczLDIyOSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA0NywyMjksCi0gICAgMTE2LDEzMCwgIDUsMjExLCA3MywyMDAsIDczLDIyMCwyMjgsMjI1LDIzMSwyMjksMjQzLDEwNCwxMjksMjUxLAotICAgICA1MSwgNzMsMjExLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDUxLDIzMiwyMjksMjI2LDI0MiwKLSAgICAyMjksMTE5LDEyOCwgIDUsMjExLDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksCi0gICAgMTI4LDI1NCwxNzAsMjM3LDIzNywgOTcsICAzLCA3MywyNTMsIDc0LCAgNiwgNzQsIDE4LDIyNSwyNDIsMjI1LAotICAgIDIyNiwyMzMsIDk5LDEyOCwgIDYsIDc5LDIzNiwyMzksMjQ3LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwKLSAgICAgIDYsIDc5LDI0NCwyMjUsMjM4LCA5NywgIDIsIDc0LCAyNywgNzQsIDQxLDIzNiwyNDQsMjM5LDIzOCwyMjksCi0gICAgMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNzYsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LAotICAgICA3NiwyMzgsMjI4LCA5NywxMjgsICA5LDEwMCwyNDIsMjMxLCA5NywgIDIsIDc0LCA2MywgNzQsIDcyLDIzMiwKLSAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTY3LDIzNiwyMjksMjMwLDI0NCwyMzIsMjI5LDIyNiwyNDIsCi0gICAgMjI5LDExOSwxMjgsICA1LDE2NywyNDMsMjMzLDIyNSwyNDAsMjM4LDIyOSwyNDUsMjM3LDIyNSwyNDQsMjI1LAotICAgIDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywyMjcsMjI3LDIzNywgOTgsMTI4LCAgNCwxMzMsIDk4LCAgMywKLSAgICAgNzQsMTE4LCA3NSwxMTUsIDc1LDEyNSwxMDgsICA5LCA3NCwxMzgsIDc0LDE0NiwgNzUsICAzLCA3NSwgMTEsCi0gICAgIDc1LCAyNywgNzUsIDM4LCA3NSwgNTYsIDc1LCA3MCwgNzUsIDgxLDE5OSwyNDIsMjI1LDI0NiwxMDEsMTI4LAotICAgIDI0NiwyMTEsIDk3LCAgMiwgNzQsMTUyLCA3NCwyMDksMjM4LDIzMSwyMzYsMjI5LDIyNiwyNDIsMjI1LDIyNywKLSAgICAyMzUsMjI5LDExNiwgIDIsIDc0LDE2OCwgNzQsMTg4LDIzNiwyMjksMjMwLDExNiwxMjksIDQ4LCAxMCwgNzQsCi0gICAgMTc3LDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LDI1NCwgNjEsMjQyLDIzMywyMzEsMjMyLAotICAgIDExNiwxMjksIDQ4LCAxMSwgNzQsMTk4LDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LDI1NCwKLSAgICAgNjIsMTE0LCAgMiwgNzQsMjE1LCA3NCwyMzYsMjI3LDIzMiwyMzMsMjM4LDI0NiwyMjksMjQyLDI0NCwyMjksCi0gICAgMjI4LDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgNDMsMjQyLDIzOSwxMTksICAyLAotICAgICA3NCwyNDQsIDc0LDI1MSwyMzYsMjI5LDIzMCwxMTYsMTI4LCAzMywyMTIsMjQyLDIzMywyMzEsMjMyLDExNiwKLSAgICAxMjgsIDMzLDIxMCwyMjgsMjI1LDIzOCwyMjgsIDk3LDEyOCwgIDksMTAxLDIzMSwyNDIsMjI1LDI0NiwxMDEsCi0gICAgMTI5LDI0NiwyMTQsIDc1LCAyMSwyMjcsMjM3LCA5OCwxMjgsICAzLCAxNSwyMzMsMjM4LDI0NCwyMjksMjMxLAotICAgIDI0MiwyMjUsMTA4LDEyOCwgMzQsIDQ0LDIzNiwyMzksMjQ3LDIzNiwyMzMsMjM4LDEwMSwxMjksIDMyLCAyMywKLSAgICAgNzUsIDUwLDIyNywyMzcsIDk4LDEyOCwgIDMsIDUxLDIzOSwyNDYsMjI5LDI0MiwyMzYsMjMzLDIzOCwyMjksCi0gICAgMjI3LDIzNywgOTgsMTI4LCAgMywgNjMsMjQwLDI0MiwyMzMsMjM3LDIyOSwyMzcsMjM5LDEwMCwxMjgsICAyLAotICAgIDE4NiwyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LCAgMiwgNzUsIDk0LCA3NSwxMDAsMjI2LDIyNSwKLSAgICAxMTQsMTI4LCAzMiwgMjIsMjM2LDIzMywyMzgsMjI5LDIyNSwyMjYsMjM5LDI0NiwyMjksMjI3LDIzNywgOTgsCi0gICAgMTI4LCAgMywgMTQsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksICA5LDI0MywyNDEsMjQ1LAotICAgIDIyNSwyNDIsMTAxLDEyOCwgNTEsMjAwLCA5OSwgIDQsIDc1LDE0NCwgNzUsMTUxLCA3NSwxNjAsIDc1LDE4NywKLSAgICAyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwgMTUsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI4LCAzMCwgMTcsCi0gICAgMjMzLDI0MiwgOTksICAyLCA3NSwxNjgsIDc1LDE3MywyMzYsMTAxLDEyOCwgMzYsMjExLDI0NSwyMzcsMjMwLAotICAgIDIzNiwyMjksMjQ4LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgMTksMjQyLDIzOSwyMjUsMTE2LDEyOCwKLSAgICAgIDEsIDE3LDEwMCwgIDQsIDc1LDIwNCwgNzYsIDI5LCA3NiwgMzksIDc2LCA5MCwgOTcsICA0LCA3NSwyMTQsCi0gICAgIDc1LDIyNCwgNzUsMjMxLCA3NiwgIDAsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTYxLAotICAgIDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAzMywyMzEsMTE3LCAgMiwgNzUsMjM4LCA3NSwyNDcsMjM0LDIyNSwKLSAgICAyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNjEsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMzMsCi0gICAgMTA4LCAgMiwgNzYsICA2LCA3NiwgMTUsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxMzYsMjMwLAotICAgIDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUxLDEzNywyMjgsMjMyLDIyNSwKLSAgICAyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgOTIsMjMyLCA5NywgIDMsIDc2LCA0OCwgNzYsIDU4LCA3NiwgNjUsCi0gICAgMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTYyLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LAotICAgICAzNCwyMzEsMTE3LCAgMiwgNzYsIDcyLCA3NiwgODEsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwKLSAgICAxNjIsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMzQsMjM5LDExNiwgIDIsIDc2LCA5NywgNzYsCi0gICAgMTA2LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsIDExLDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LAotICAgICAzMCwgMTMsMTAxLCAgOCwgNzYsMTMyLCA3NiwxODUsIDc2LDE5MiwgNzYsMjE3LCA3NiwyMjcsIDc2LDIzOCwKLSAgICAgNzcsIDI3LCA3NywgNjMsIDk5LCAgMiwgNzYsMTM4LCA3NiwxNzUsMjMzLDIzNywyMjUsMjM2LDI0MywyMjksCi0gICAgMjQwLDIyNSwyNDIsMjI1LDI0NCwyMzksMTE0LCAgMiwgNzYsMTU2LCA3NiwxNjUsMjI1LDI0MiwyMjUsMjI2LAotICAgIDIzMywgOTksMTI4LCAgNiwxMDcsMjQwLDIyOSwyNDIsMjQzLDIzMywyMjUsMTEwLDEyOCwgIDYsMTA3LDI0OSwKLSAgICAyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA1MiwyMzEsMjQyLDIyOSwxMDEsMTI4LCAgMCwxNzYsCi0gICAgMjMyLDEwNSwgIDIsIDc2LDE5OSwgNzYsMjA4LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTczLAotICAgIDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTAzLDIzMywyMjcsMjM5LDI0MCwyNDQsMjMzLCA5OSwKLSAgICAxMjgsICAzLDIzOSwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMTk5LDEwOCwgIDIsCi0gICAgIDc2LDI0NCwgNzcsIDExLDIyOSwyNDQsMTAxLCAgMiwgNzYsMjUyLCA3NywgIDMsMjM2LDIyOSwyMzAsMTE2LAotICAgIDEyOCwgMzUsIDQzLDI0MiwyMzMsMjMxLDIzMiwxMTYsMTI4LCAzNSwgMzgsMjQ0LCA5NywxMjksICAzLDE4MCwKLSAgICAgNzcsIDE4LDI0NCwyNDUsMjQyLDIzOCwyMjksMTAwLDEyOCwgIDEsMTQxLDIzOCwyMzksMjM3LDIzMywyMzgsCi0gICAgMjI1LDI0NCwyMzksMjQyLDIzNywyMzMsMjM4LDI0NSwyNDMsMjM5LDIzOCwyMjksMjM4LDI0NSwyMzcsMjI5LAotICAgIDI0MiwyMjUsMjQ0LDIzOSwyNDIsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjQ4LDI1MCwKLSAgICAxMDQsMTI4LCAgMiwxNjQsMTA0LCAgMiwgNzcsIDc0LCA3NywxMjQsIDk3LCAgMywgNzcsIDgyLCA3NywgOTIsCi0gICAgIDc3LCA5OSwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNjcsMjI4LDIyOSwyNDYsIDk3LAotICAgIDEyOCwgIDksIDM5LDIzMSwxMTcsICAyLCA3NywxMDYsIDc3LDExNSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwKLSAgICAxMjgsIDEwLDE2NywyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAzOSwyMzksMjM5LDEwNywxMjgsCi0gICAgICAyLCA4NywxMDUsICA2LCA3NywxNDQsIDc3LDE5MywgNzcsMjUzLCA3OCwgIDgsIDc4LCAxOSwgNzgsIDI5LAotICAgICA5NywgIDIsIDc3LDE1MCwgNzcsMTcyLDIzNiwyNDksMjQ0LDIzMywyMzUsMjI1LDI0NCwyMzksMjM4LDIzOSwKLSAgICAxMTUsMTI5LCAgMywxMzMsIDc3LDE2NiwyMjcsMjM3LCA5OCwxMjgsICAzLCA2OCwyMzcsMjM5LDIzOCwxMDAsCi0gICAgMTI5LCAzOCwxMDIsIDc3LDE4MSwyNDMsMjQ1LDIzMywyNDQsMjQ3LDIzMiwyMzMsMjQ0LDEwMSwxMjgsIDM4LAotICAgICA5OCwyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMzMsICAwLDE2OCwgNzcsMjEyLCA3NywyMjAsIDc3LDIzMSwKLSAgICAgNzcsMjM3LCA3NywyNDUsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsMjQ2LDIxNSwyMjYsMjI5LDIzNiwyMzksCi0gICAgMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDM2LDIyNywyMzcsIDk4LDEyOCwgIDMsICA4LDIzMSwyNDIsMjI1LAotICAgIDI0NiwxMDEsMTI4LDI0NiwyMTYsMjQ0LDIzOSwyMzgsMjM5LDExNSwxMjgsICAzLDEzMywyMzIsMjMzLDI0MiwKLSAgICAyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDk4LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsCi0gICAgMTI4LCA0OCwxOTQsMjQ0LDI0NCwyMzksMjM3LDIyNSwyNDIsMTA3LDEyOCwgNDgsICAzLDI0NiwxMDUsICAyLAotICAgICA3OCwgMzYsIDc4LCA0NywyMjgsMTAxLDEyOSwgIDAsMjQ3LCA3OCwgNDMsMTE1LDEyOCwgMzQsIDM1LDI0MywKLSAgICAyMzMsMjM5LDIzOCwyNDMsMjM2LDIyNSwyNDMsMTA0LDEyOCwgMzQsIDIxLDIzNCwyMjksMjI3LDI0OSwyNDIsCi0gICAgMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA4MiwyMzUsMjQzLDIzMiwyMjUsMjI4LDEwMSwxMjgsIDM3LAotICAgIDE0NywxMDgsICAyLCA3OCwgODcsIDc4LCA5OCwyMzMsMjM4LDIyOSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwKLSAgICAgMzAsIDE1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTUxLDEwOSwgIDIsIDc4LDExMywgNzgsCi0gICAgMTIxLDIyNSwyMjcsMjQyLDIzOSwxMTAsMTI4LCAgMSwgMTcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LAotICAgIDEwMSwxMjgsMjU1LCA2OCwyMzgsMjI2LDIzNiwyMzksMjI3LDEwNywxMjgsIDM3LDEzMiwxMTEsIDEwLCA3OCwKLSAgICAxNjMsIDc4LDE3NSwgNzgsMTg1LCA3OCwxOTYsIDc4LDIwNywgNzksIDIzLCA3OSwgMjgsIDc5LCAzOSwgNzksCi0gICAgMTU0LCA3OSwxODAsMjI3LDIzMiwyMjUsMjI4LDIyNSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgMTQsMjI4LAotICAgIDIyOSwyMzUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDIwLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwKLSAgICAgOTcsMTI4LCA0OCwxMDUsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDIwMSwyMzYsCi0gICAgMjM2LDIyNSwxMTQsMTMyLCAgMCwgMzYsIDc4LDIyMiwgNzgsMjMzLCA3OCwyNDUsIDc5LCAgMCwyMzMsMjM4LAotICAgIDIzMCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwyNDYsMjI3LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwKLSAgICAyMjcsMTAxLDEyOCwyNTUsICA0LDIzOSwyMzYsMjI4LDI0MywyNDQsMjQ5LDIzNiwxMDEsMTI4LDI0NywgMzYsCi0gICAgMTE1LCAgMiwgNzksICA2LCA3OSwgMTMsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsMTA1LDI0NSwyNDAsMjI5LAotICAgIDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDIyOCwyMzgsMTAzLDEyOCwgMzIsMTcxLDI0MiwyNDUsMjQzLDI0MSwKLSAgICAyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgMzgsMTE2LCAgNiwgNzksIDUzLCA3OSwgNzAsIDc5LCA5MiwgNzksCi0gICAgMTAzLCA3OSwxMzUsIDc5LDE0MiwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjksICAyLDIxNywgNzksIDY0LAotICAgIDIyNywyMzcsIDk4LDEyOCwgIDMsICA3LDIyNiwyMjksMjM2LDIzOSwyNDcsIDk5LCAgMiwgNzksIDgxLCA3OSwKLSAgICAgODYsMjM3LCA5OCwxMjgsICAzLCAzNSwyMzksMjM3LCA5OCwxMjgsICAzLCAzNSwyMzUsMjI1LDI0NCwyMjUsCi0gICAgMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMjUxLDIzNiwyMjksMjQzLDExNSwgIDIsIDc5LDExMiwgNzksMTE2LAotICAgIDEwNSwxMjgsICAxLCA0OSwxMDYsMTI5LDI0NiwxOTAsIDc5LDEyMiwyNDMsMjQ0LDI0MiwyMzksMjM1LDIyOSwKLSAgICAyMzIsMjM5LDIzOSwxMDcsMTI4LCAgMiwxMzIsMjM3LDIyNSwyNDQsMTA0LDEyOCwgMzQsMTk3LDI0NCwyMjksCi0gICAgMjI4LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzcsMjA0LDI0NSwyMjYsMjM2LDIyOSwyNDksMjM5LAotICAgIDIyOCwyNDAsMjI1LDI0NCwyMjUsMTA0LDEyOSwyNTEsIDMxLCA3OSwxNzEsMjMyLDIyOSwyMjYsMjQyLDIyOSwKLSAgICAxMTksMTI4LDI1MSwgMzEsMjQ3LDIzOCwyNDQsMjI1LDIyNywxMDcsICAyLCA3OSwxOTEsIDc5LDIwMiwyMjYsCi0gICAgMjI5LDIzNiwyMzksMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDMwLDIzNywyMzksMTAwLDEyOCwgIDIsMjEzLAotICAgIDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxNTksMjQzLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwKLSAgICAxMjgsMjQ2LDIzNSwxMTYsICAyLCA3OSwyMzMsIDc5LDIzOSwyMjUsMjMzLDEwOCwxMjgsICAyLCA4NiwyMzksCi0gICAgMjQwLDIyNiwyMjUsMTE0LDEyOCwgIDEsMTQwLDExNywgIDIsIDc5LDI1MywgODAsICA4LDIzMiwyMzMsMjQyLAotICAgIDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMDEsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywKLSAgICAxMjgsIDQ4LDE5NywxMjIsMTMyLCAgMSwyNDMsIDgwLCAzMSwgODAsIDQwLCA4MCwgNTksIDgwLCA5NiwyMjUsCi0gICAgMjM2LDI0NCwyMzksMjM4LDEwMSwxMjgsICAyLDE2MywgOTksICAyLCA4MCwgNDYsIDgwLCA1MywyMjUsMjQyLAotICAgIDIzOSwxMTAsMTI4LCAgMSwxOTgsMjQ1LDI0MiwxMDgsMTI4LCAgMiwxNjUsMTAxLCAgMiwgODAsIDY1LCA4MCwKLSAgICAgODUsMjI1LDIyNiwyMzUsMjMyLDIyNSwyNDMsMjMzLDIyNSwyMzgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCi0gICAgMjMzLCA5OSwxMjgsICA0LDIyNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDg1LAotICAgIDIzMiwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA5NSwxMDEsMTUxLCAgMCwKLSAgICAxMDEsIDgwLDE1OSwgODAsMTc4LCA4MCwyMTIsIDgxLDE4NiwgODEsMjQ4LCA4MiwgMjUsIDgyLCAzNywgODIsCi0gICAgIDYwLCA4MiwxMTMsIDgzLDIyNSwgODQsIDI3LCA4NCwxMjksIDg0LDI0NSwgODUsMTI0LCA4NSwxOTksIDg1LAotICAgIDIzMCwgODYsIDM2LCA4NiwgODksIDg3LCAyNCwgODcsMTU3LCA4NywxNzcsIDg3LDIyMSwgODgsIDU2LCA5NywKLSAgICAgIDIsIDgwLDE2NSwgODAsMTcyLDIyNywyNDUsMjQ0LDEwMSwxMjgsICAwLDIzMywyNDIsMjQ0LDEwNCwxMjgsCi0gICAgIDM4LCA2NSwgOTgsICAzLCA4MCwxODYsIDgwLDE5NSwgODAsMjA1LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LAotICAgIDEyOCwgIDksMTQzLDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAyOCwyNDIsMjI5LDI0NiwKLSAgICAxMDEsMTI4LCAgMSwgMjEsIDk5LCAgNSwgODAsMjI0LCA4MSwgNDEsIDgxLCA1NSwgODEsIDg3LCA4MSwxNzYsCi0gICAgIDk3LCAgMiwgODAsMjMwLCA4MSwgMzUsMjM4LDIyOCwyNDIsIDk3LCAgMywgODAsMjQxLCA4MCwyNDgsIDgxLAotICAgICAgMywyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgMTMsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwKLSAgICAxMjgsIDEwLDE0MSwyNDYsMjM5LDI0NywyMjksMjM2LDI0MywyMzMsMjMxLDExMCwgIDIsIDgxLCAxNywgODEsCi0gICAgIDI0LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA2OSwyMzEsMjQ1LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LAotICAgIDEyOCwgMTAsMTk3LDI0MiwyMzksMTEwLDEyOCwgIDEsIDI3LDIyOSwyMjgsMjMzLDIzNiwyMzYsMjI1LDIyNiwKLSAgICAyNDIsMjI5LDI0NiwxMDEsMTI4LCAzMCwgMjksMTA0LCAgMiwgODEsIDYxLCA4MSwgNzIsMjI1LDI0MiwyMzcsCi0gICAgMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDEwMSwyNDksMjMzLDI0NywyMzgsMjI1LDI0MiwyMzcsMjI5LAotICAgIDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDEzNSwyMzMsMjQyLCA5OSwgIDIsIDgxLCA5NSwgODEsMTAwLDIzNiwKLSAgICAxMDEsMTI4LCAzNiwyMTIsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTM0LCAgMCwyMzQsIDgxLDEyMSwgODEsCi0gICAgMTI5LCA4MSwxMzcsIDgxLDE0OCwgODEsMTU2LCA4MSwxNjgsMjI1LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLAotICAgIDE5MSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDI1LDIyOCwyMzksMjQ0LDIyNiwyMjksMjM2LDIzOSwKLSAgICAxMTksMTI4LCAzMCwxOTksMjMxLDI0MiwyMjUsMjQ2LDEwMSwxMjgsIDMwLDE5MywyMzIsMjM5LDIzOSwyMzUsCi0gICAgMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLDE5NSwyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwgMzAsMTk3LAotICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA4NCwxMDAsICA0LCA4MSwxOTYsIDgxLDIwNiwKLSAgICAgODEsMjEyLCA4MSwyMjIsMjI2LDIzNiwyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwgIDIsICA1LDIyOSwyNDYsCi0gICAgIDk3LDEyOCwgIDksIDE1LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjgsICAwLDIzNSwyMzksMTE2LAotICAgIDEzMCwgIDEsIDIzLCA4MSwyMzEsIDgxLDI0MCwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsICAxLCAyMywKLSAgICAyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTg1LDEwMSwgIDIsIDgxLDI1NCwgODIsICA5LDIzMSwyNDUsCi0gICAgMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMTUsMjM3LDIyNSwyNDQsMjQyLDIyNSwyMzEsMjQ1LAotICAgIDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDcxLDIzMCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwKLSAgICAyMzMsIDk5LDEyOCwgIDQsIDY4LDEwMywgIDIsIDgyLCA0MywgODIsIDUwLDI0MiwyMjUsMjQ2LDEwMSwxMjgsCi0gICAgICAwLDIzMiwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNDMsMTA0LCAgNCwgODIsIDcwLAotICAgICA4MiwgODEsIDgyLCA5MiwgODIsMTAyLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwKLSAgICAxMDMsMjI2LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAyOSwyMzMsMjQyLDIyNSwyMzEsCi0gICAgMjI1LDIzOCwgOTcsMTI4LCA0OCwgNzIsMjM5LDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwxMjgsIDMwLAotICAgIDE4NywxMDUsICA0LCA4MiwxMjMsIDgyLDEzNCwgODMsMTkyLCA4MywyMDcsMjI2LDIzOSwyNDAsMjM5LDIzNywKLSAgICAyMzksMjMwLDExMSwxMjgsIDQ5LCAzMSwyMzEsMjMyLDExNiwxNDIsICAwLCA1NiwgODIsMTY4LCA4MiwxNzcsCi0gICAgIDgyLDE4NywgODIsMjE3LCA4MiwyMjQsIDgzLCAgNiwgODMsIDMxLCA4MywgNzYsIDgzLDExMCwgODMsMTIyLAotICAgICA4MywxMzMsIDgzLDE2NiwgODMsMTc0LCA4MywxODUsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwKLSAgICAxMDQsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjM4LDIyNywyMzMsMjQyLDIyNywyMzYsCi0gICAgMTAxLDEyOSwgMzYsMTAzLCA4MiwxOTgsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDMsMjI5LDI0MywyMjUsMjM4LAotICAgIDI0MywyNDMsMjI5LDI0MiwyMzMsMTAyLDEyOCwgMzksMTQ1LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LDExMCwKLSAgICAyMjksMjI5LDExMCwgIDIsIDgyLDIzMiwgODIsMjQxLDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsCi0gICAgMTEzLDExMiwgIDIsIDgyLDI0NywgODIsMjU0LDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDEzMywyMjksMjQyLAotICAgIDIzMywyMzksMTAwLDEyOCwgMzYsMTUzLDIzMSwxMTcsICAyLCA4MywgMTMsIDgzLCAyMiwyMzQsMjI1LDI0MiwKLSAgICAyMjUsMjQ0LDEwNSwxMjgsIDEwLDIzOCwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLDExMCwxMDQsCi0gICAgICAyLCA4MywgMzcsIDgzLCA2MywgOTcsICAyLCA4MywgNDMsIDgzLCA1NCwyMjcsMjM1LDIyNSwyNDIsMjI1LAotICAgIDIyNiwyMzMsIDk5LDEyOCwgIDYsMTA0LDIzOCwyMzEsMjUwLDIzMiwyMzksMTE3LDEyOCwgNDgsIDQwLDIzOCwKLSAgICAyMzksMjQ0LDIyOSwyMjYsMjI5LDIyNSwyMzcsMjI5LDEwMCwxMjgsIDM4LDEwNywxMDUsICAyLCA4MywgODIsCi0gICAgIDgzLDEwMCwyMjgsMjI5LDIzOSwyMzEsMjQyLDIyNSwyNDAsMjMyLDIzMywyMjcsMjQwLDIyNSwyNDIsMjI5LAotICAgIDExMCwxMjgsIDUwLCAzOSwyMzgsMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwxMzYsMjM3LDIzOSwKLSAgICAyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMjQsMjM5LDIzNiwyMjgsMjQzLDI0NCwyNDksCi0gICAgMjM2LDEwMSwxMjgsMjQ3LCA1NiwxMTIsICAyLCA4MywxMzksIDgzLDE0NiwyMjUsMjQyLDIyOSwxMTAsMTI4LAotICAgICAzNiwxMjMsMjI5LDExNCwgIDIsIDgzLDE1MywgODMsMTU5LDIzMywyMzksMTAwLDEyOCwgMzYsMTQzLDI0MywKLSAgICAyMzMsMjI1LDExMCwxMjgsICA2LDI0OCwyNDIsMjM5LDIzNywyMjUsMTEwLDEyOCwgMzMsMTE5LDI0MywyNDUsCi0gICAgMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwxMjAsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDg4LAotICAgIDIzOCwyNDYsMjI5LDI0MiwyNDQsMjI5LDIyOCwyMjYsMjQyLDIyOSwyNDYsMTAxLDEyOCwgIDIsICA3LDIzOSwKLSAgICAyNDQsMjMzLDIzMCwyMzMsMjI5LDIyOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCi0gICAgMTAxLDEwNywgIDIsIDgzLDIzMSwgODMsMjU1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LAotICAgIDE2OCwgODMsMjQzLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTE2LDExMSwKLSAgICAgIDIsIDg0LCAgNSwgODQsIDIwLDIzOCwyMzUsMjI1LDI0MiwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsCi0gICAgMTA1LDEyOCwgMTAsMTE2LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA4NCwxMDgsICAzLCA4NCwgMzUsIDg0LAotICAgICA0NiwgODQsMTA3LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNTksMTAxLCAgMiwKLSAgICAgODQsIDUyLCA4NCwgNTksMjM3LDIyOSwyMzgsMTE2LDEyOCwgMzQsICA4LDI0NiwyMjksMTEwLCAgMywgODQsCi0gICAgIDY5LCA4NCwgNzgsIDg0LCA5OSwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM2LDEwNiwxMTIsICAyLAotICAgICA4NCwgODQsIDg0LCA5MSwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxMjYsMjI5LDI0MiwyMzMsMjM5LDEwMCwKLSAgICAxMjgsIDM2LDE0NiwyNDIsMjM5LDIzNywyMjUsMTEwLDEyOCwgMzMsMTIyLDIzNiwyMzMsMjQwLDI0MywyMzMsCi0gICAgMTE1LDEyOSwgMzIsIDM4LCA4NCwxMTgsMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwxMjgsIDM0LAotICAgIDIzOCwxMDksICA1LCA4NCwxNDEsIDg0LDE2OSwgODQsMTgwLCA4NCwyMDAsIDg0LDIxMSwyMjUsMjI3LDI0MiwKLSAgICAyMzksMTEwLDEzMCwgIDEsIDE5LCA4NCwxNTMsIDg0LDE2MSwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsCi0gICAgIDIzLDIzMSwyNDIsMjI1LDI0NiwxMDEsMTI4LCAzMCwgMjEsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLAotICAgICA5OSwxMjgsICA0LCA2MCwyMjgsMjI1LDI0MywxMDQsMTI5LCAzMiwgMjAsIDg0LDE4OSwyNDYsMjI5LDI0MiwKLSAgICAyNDQsMjMzLDIyNywyMjUsMTA4LDEyOCwyNTQsIDQ5LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsCi0gICAgMTI4LDI1NSwgNjksMTEyLCAgMiwgODQsMjE3LCA4NCwyMzcsMjMyLDIyNSwyNDMsMjMzLDI0MywyMzcsMjI1LAotICAgIDI0MiwyMzUsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA5MSwyNDQsMjQ5LDI0MywKLSAgICAyMjksMTE2LDEyOCwgMzQsICA1LDExMCwgIDYsIDg1LCAgMywgODUsIDE0LCA4NSwgMjUsIDg1LCA2OSwgODUsCi0gICAgMTAxLCA4NSwxMTYsMjI2LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAzNSwyMjcsMjQ5LAotICAgIDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDYxLDEwMCwgIDIsIDg1LCAzMSwgODUsIDUwLDIyNSwKLSAgICAyNDMsMTA0LDEyOSwgMzIsIDE5LCA4NSwgMzksMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwxMjgsCi0gICAgMjU0LCA1MCwyMjksMjQzLDIyNywyMjksMjM4LDIyOCwyMjksMjQyLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LAotICAgIDIzMywgOTksMTI4LCAgNCwxNjMsMTAzLDEzMCwgIDEsIDc1LCA4NSwgNzcsIDg1LCA4OCwyMjYsMjM5LDI0MCwKLSAgICAyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDM3LDIzMiwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCi0gICAgMjMzLCA5OSwxMjgsICA0LDE2NSwyMzIsMjM5LDIzOSwyMzUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLAotICAgICA5OSwxMjgsICA0LDIwMCwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwgMzIsICAyLDExMSwgIDMsIDg1LDEzMiwKLSAgICAgODUsMTQwLCA4NSwxNDksMjMxLDIzOSwyMzgsMjI5LDEwNywxMjgsICAxLCAyNSwyMzUsMjM5LDI0MiwyMjksCi0gICAgMjI1LDExMCwxMjgsIDQ5LCA4MywyNDAsMjI5LDExMCwxMzAsICAyLCA5MSwgODUsMTU5LCA4NSwxNjgsMjI3LAotICAgIDIzNiwyMzksMjQzLDIyOSwxMDAsMTI4LCAgMiwxNTQsMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwKLSAgICAxMzAsICAyLCA5MiwgODUsMTgzLCA4NSwxOTIsMjI3LDIzNiwyMzksMjQzLDIyOSwxMDAsMTI4LCAgMiwgOTQsCi0gICAgMjMyLDIzOSwyMzksMTA3LDEyOCwgIDIsIDkzLDExMiwgIDIsIDg1LDIwNSwgODUsMjEyLDIyNSwyNDIsMjI5LAotICAgIDExMCwxMjgsIDM2LDE2MCwyNDMsMjMzLDIzNiwyMzksMTEwLDEyOSwgIDMsMTgxLCA4NSwyMjIsMjQ0LDIzOSwKLSAgICAyMzgsMjM5LDExNSwxMjgsICAzLDE3MywyNDEsMTE3LCAgMiwgODUsMjM3LCA4NiwgMjUsMjI1LDEwOCwxMzAsCi0gICAgICAwLCA2MSwgODUsMjQ2LCA4NiwgIDIsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LAotICAgIDI1NSwgMjksMTE1LCAgMiwgODYsICA4LCA4NiwgMTUsMjM3LDIyNSwyMzYsMTA4LDEyOCwyNTQsMTAyLDI0NSwKLSAgICAyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLDEyNCwyMzMsMjQ2LDIyNSwyMzYsMjI5LDIzOCwyMjcsCi0gICAgMTAxLDEyOCwgMzQsIDk3LDExNCwgIDMsIDg2LCA0NCwgODYsIDU1LCA4NiwgNjYsMjI2LDIzOSwyNDAsMjM5LAotICAgIDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAzOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsIDY0LDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwxMjksICAyLCA4OCwgODYsIDc4LDIyNywyNDksCi0gICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNzcsMTE1LCAgNiwgODYsMTAzLCA4NiwxMTQsIDg2LAotICAgIDEzNCwgODYsMjE1LCA4NywgIDQsIDg3LCAxNCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsIDY1LDIyOCwyMjksMjQzLDIyNywyMjksMjM4LDIyOCwyMjksMjQyLDIyNywyNDksMjQyLDIzMywyMzYsCi0gICAgMjM2LDIzMywgOTksMTI4LCAgNCwxNzEsMTA0LDEzMiwgIDIsMTMxLCA4NiwxNDYsIDg2LDE1MywgODYsMTg0LAotICAgICA4NiwxOTksMjI3LDI0NSwyNDIsMTA4LDEyOCwgIDIsMTM0LDIzOSwyNDIsMTE2LCAgMiwgODYsMTYxLCA4NiwKLSAgICAxNjgsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDE0LDI0NiwyMzksMjQ3LDIyOSwyMzYsMjQzLDIzMywyMzEsCi0gICAgMjM4LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA3MCwyNDIsMjI5LDI0NiwyMjksMjQyLDI0MywyMjksMjI4LAotICAgIDIzNiwyMzksMjM5LDExMiwxMjgsICAxLDE3MCwyNDMsMjQxLDI0NSwyMjUsMjQ0LDI0MiwyMjksMjQ2LDIyOSwKLSAgICAyNDIsMjQzLDIyOSwxMDAsMTI4LCAgMiwxMzMsMjM3LDIyNSwyMzYsMTA4LCAgMiwgODYsMjI0LCA4NiwyMzUsCi0gICAgMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LCA3MSwyMzUsMjI1LDI0NCwyMjUsMjM1LAotICAgIDIyNSwyMzgsIDk3LDEyOSwgNDgsMTY3LCA4NiwyNDgsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwKLSAgICAxMDQsMTI4LDI1NSwxMDYsMjQ0LDIzMywyMzcsMjI1LDI0NCwyMjksMTAwLDEyOCwgMzMsIDQ2LDI0NSwyNDAsCi0gICAgMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDIzNiwxMTYsICA1LCA4NywgMzYsIDg3LCA2MiwgODcsIDY2LAotICAgICA4NywgODMsIDg3LDE0OSwgOTcsMTMwLCAgMywxODMsIDg3LCA0NCwgODcsIDU0LDI0MiwyMzcsMjI5LDIzOCwKLSAgICAyMzMsMjI1LDExMCwxMjgsICA1LDEwNCwyNDQsMjM5LDIzOCwyMzksMTE1LDEyOCwgIDMsMTc0LDEwNCwxMjgsCi0gICAgICAwLDI0MCwyMzMsMjM2LDIyOCwxMDEsMTI5LCAzMCwxODksIDg3LCA3NSwyMjYsMjI5LDIzNiwyMzksMTE5LAotICAgIDEyOCwgMzAsIDI3LDIzOCwyMjUsMjMyLDI0NCwgOTcsICAzLCA4NywgOTUsIDg3LDEyNywgODcsMTM2LDIzMCwKLSAgICAyMzksMjQ1LDIzNSwxMDQsICAyLCA4NywxMDUsIDg3LDExNCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsCi0gICAgICA1LDE0NSwyMzYsMjI5LDIzMCwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNDUsMjMyLAotICAgIDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNDUsMjM2LDIyOSwyMzAsMjQ0LDIzMiwyMjksMjI2LDI0MiwKLSAgICAyMjksMTE5LDEyOCwgIDUsMTQ1LDI0NSwyNDIsMjM4LDIyOSwxMDAsMTI4LCAgMSwyMjEsMTE3LCAgMiwgODcsCi0gICAgMTYzLCA4NywxNzIsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgOTcsMjQyLDExMSwxMjgsIDMyLAotICAgIDE3MiwyNDYsMjM5LDI0NywyMjksMjM2LDI0MywyMzMsMjMxLDExMCwgIDMsIDg3LDE5MywgODcsMjAzLCA4NywKLSAgICAyMTAsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTk5LDIyOCwyMjksMjQ2LCA5NywxMjgsCi0gICAgICA5LCA3MSwyMzEsMjQ1LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTk5LDEyMCwgIDIsIDg3LAotICAgIDIyNywgODgsIDQ0LDIyNywyMzYsMjI1LDEwOSwxMzIsICAwLCAzMywgODcsMjQyLCA4NywyNTMsIDg4LCAyNCwKLSAgICAgODgsIDM2LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgOTIsMTAwLCAgMiwgODgsCi0gICAgICAzLCA4OCwgIDgsMjI2LDEwOCwxMjgsIDMyLCA2MCwyMzksMjQ3LDExMCwxMjksICAwLDE2MSwgODgsIDE2LAotICAgIDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywxNjEsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywKLSAgICAxMDEsMTI4LDI1NSwgIDEsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LCAzMywyMzMsMjQzLDI0NCwyMjksCi0gICAgMjM4LDI0NCwyMzMsMjI1LDEwOCwxMjgsIDM0LCAgMywyNTAsMTA0LDEzMSwgIDIsMTQ2LCA4OCwgNjcsIDg4LAotICAgICA4NiwgODgsIDk3LCA5OSwgIDIsIDg4LCA3MywgODgsIDgwLDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLDIzOSwKLSAgICAyNDUsMjQyLDEwOCwxMjgsICAyLDE0NywyNDIsMjI5LDI0NiwyMjksMjQyLDI0MywyMjksMTAwLDEyOCwgIDEsCi0gICAgMTg1LDI0NCwyMjUsMjMzLDEwOCwxMjgsICAxLDE4NiwxMDIsMTQwLCAgMCwxMDIsIDg4LDEzMiwgODgsMjE0LAotICAgICA4OCwyMjUsIDg4LDIzNCwgODgsMjQ2LCA4OSwgOTMsIDg5LDEwOSwgOTEsMTE3LCA5MSwxMzAsIDkxLDE1NiwKLSAgICAgOTMsIDMzLCA5MywgNDEsIDk3LCAgNCwgODgsMTQyLCA4OCwxNDksIDg4LDE2MCwgODgsMTcxLDIyOCwyMjksCi0gICAgMjQ2LCA5NywxMjgsICA5LCA5NCwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDk0LAotICAgIDIzMiwyNDIsMjI5LDIzOCwyMzIsMjI5LDIzMywxMTYsMTI4LCAzMywgIDksMjQ0LDIzMiwgOTcsICAzLCA4OCwKLSAgICAxODEsIDg4LDE5MCwgODgsMjAyLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDc4LDIzNiwyMzksCi0gICAgMjQ3LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDc4LDI0NCwyMjUsMjM4LDIyNSwyNDIsMjI1LAotICAgIDIyNiwyMzMsIDk5LDEyOCwgIDYsIDc1LDIyNiwyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwKLSAgICAgIDgsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwyMTMsMjI4LDIzOSwyNDQsMjI1LDIyNywyMjcsCi0gICAgMjI5LDIzOCwxMTYsMTI4LCAzMCwgMzEsMTAxLCAgMywgODgsMjU0LCA4OSwgNzYsIDg5LCA4NiwxMDQsICA0LAotICAgICA4OSwgIDgsIDg5LCAzMSwgODksIDQ1LCA4OSwgNjEsMjI1LDExNCwgIDIsIDg5LCAxNSwgODksIDIyLDIyNSwKLSAgICAyMjYsMjMzLCA5OSwxMjgsICA2LCA2NSwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDEzNCwyMzAsCi0gICAgMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjEwLDIzMywyMzgsMjMzLAotICAgIDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIxMSwyMzcsMjI5LDIyOCwKLSAgICAyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIxMiwyMzMsMjI3LDIzOSwyNDAsCi0gICAgMjQ0LDIzMywgOTksMTI4LCAgMywyMjksMjM3LDIyNSwyMzYsMTAxLDEyOCwgMzgsIDY0LDEwMiwxMzAsMjUxLAotICAgICAgMCwgODksMTAxLCA4OSwxMDUsMTA1LDEyOCwyNTEsICAzLDEwOCwxMjgsMjUxLCAgNCwxMDUsMTM2LDI1MSwKLSAgICAgIDEsIDg5LDEyOSwgODksMTY5LCA4OSwxODAsIDg5LDIwMiwgOTAsIDY4LCA5MCwgODUsIDkwLCA5MywgOTAsCi0gICAgMTA2LDIzMCwyNDQsMjI5LDIyOSwxMTAsICAyLCA4OSwxMzksIDg5LDE0OCwyMjcsMjMzLDI0MiwyMjcsMjM2LAotICAgIDEwMSwxMjgsIDM2LDExMCwxMTIsICAyLCA4OSwxNTQsIDg5LDE2MSwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwKLSAgICAxMzAsMjI5LDI0MiwyMzMsMjM5LDEwMCwxMjgsIDM2LDE1MCwyMzEsMjQ1LDI0MiwyMjksMjI4LDIyNSwyNDMsCi0gICAgMTA0LDEyOCwgMzIsIDE4LDIzNiwyMzYsMjI5LDEwMCwgIDIsIDg5LDE4OSwgODksMTk1LDIyNiwyMzksMTIwLAotICAgIDEyOCwgMzcsMTYwLDI0MiwyMjksMjI3LDExNiwxMjgsIDM3LDE3MiwyMzgsMjI1LDEwOCwgIDUsIDg5LDIxNiwKLSAgICAgODksMjU1LCA5MCwgMTYsIDkwLCAzMywgOTAsIDQ5LDIzNSwyMjUsMTAyLDEzMCwgIDUsMjE4LCA4OSwyMjYsCi0gICAgIDg5LDI0NiwyMjgsMjI1LDIzMSwyMjksMjQzLDEwNCwxMjksMjUxLCA1OCwgODksMjM3LDIzMiwyMjksMjI2LAotICAgIDI0MiwyMjksMTE5LDEyOCwyNTEsIDU4LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjE4LDIzNywKLSAgICAyMjksMTA5LDEyOSwgIDUsMjIxLCA5MCwgIDcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwyMjEsCi0gICAgMjM4LDI0NSwxMTAsMTI5LCAgNSwyMjMsIDkwLCAyNCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LAotICAgIDIyMywyNDAsMTAxLDEyOSwgIDUsMjI3LCA5MCwgNDAsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwKLSAgICAyMjcsMjQ0LDI0MywyMjUsMjI4LDEwNSwxMjksICA1LDIyOSwgOTAsIDU5LDIzMiwyMjksMjI2LDI0MiwyMjksCi0gICAgMTE5LDEyOCwgIDUsMjI5LDI0MiwyNDMsMjQ0LDI0NCwyMzksMjM4LDIyOSwyMjcsMjMyLDIzMywyMzgsMjI5LAotICAgIDI0MywxMDEsMTI4LCAgMiwyMDEsMjQzLDIzMiwyMjksMjQ5LDEwMSwxMjgsIDM3LDIwMSwyNDQsMjI1LDIyNywKLSAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMTUsMjQ2LDEwMSwxNDIsICAwLCA1MywgOTAsCi0gICAgMTM5LCA5MCwxNDgsIDkwLDE1OCwgOTAsMTg4LCA5MCwxOTUsIDkwLDIwNSwgOTAsMjMwLCA5MSwgIDEsIDkxLAotICAgICAzNSwgOTEsIDQ3LCA5MSwgNTgsIDkxLCA5MSwgOTEsIDk5LCA5MSwxMTAsMjI1LDI0MiwyMjUsMjI2LDIzMywKLSAgICAgOTksMTI4LCAgNiwxMDEsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjM1LDIyNywyMzMsCi0gICAgMjQyLDIyNywyMzYsMTAxLDEyOSwgMzYsMTAwLCA5MCwxNjksMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDMsMjI5LAotICAgIDI0MywyMjUsMjM4LDI0MywyNDMsMjI5LDI0MiwyMzMsMTAyLDEyOCwgMzksMTQyLDIyOCwyMjksMjQ2LCA5NywKLSAgICAxMjgsICA5LDEwNywyMjksMjMzLDIzMSwyMzIsMjQ0LDIzMiwxMTUsMTI4LCAzMywgOTMsMjMxLDExNywgIDIsCi0gICAgIDkwLDIxMiwgOTAsMjIxLDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMjM1LDI0MiwyMzcsMjQ1LAotICAgIDIzNSwyMzIsMTA1LDEyOCwgMTAsMTA3LDIzMiwgOTcsICAyLCA5MCwyMzcsIDkwLDI0OCwyMjcsMjM1LDIyNSwKLSAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTAxLDIzOCwyMzEsMjUwLDIzMiwyMzksMTE3LDEyOCwgNDgsCi0gICAgIDM3LDEwNSwgIDIsIDkxLCAgNywgOTEsIDI1LDIyOCwyMjksMjM5LDIzMSwyNDIsMjI1LDI0MCwyMzIsMjMzLAotICAgIDIyNywyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDM2LDIzOCwyMzAsMjI5LDI0MiwyMzMsMjM5LDExNCwKLSAgICAxMjgsIDMyLDEzMywyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAyMSwyMzksCi0gICAgMjM2LDIyOCwyNDMsMjQ0LDI0OSwyMzYsMTAxLDEyOCwyNDcsIDUzLDExMiwgIDIsIDkxLCA2NCwgOTEsIDcxLAotICAgIDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDEyMCwyMjksMTE0LCAgMiwgOTEsIDc4LCA5MSwgODQsMjMzLDIzOSwKLSAgICAxMDAsMTI4LCAzNiwxNDAsMjQzLDIzMywyMjUsMTEwLDEyOCwgIDYsMjQ1LDI0MiwyMzksMjM3LDIyNSwxMTAsCi0gICAgMTI4LCAzMywxMTYsMjQzLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLDExNywyNDQsMjMyLAotICAgIDIyNSwxMDUsMTI4LCAxNCwgODUsMTA4LDEyOSwyNTEsICAyLCA5MSwxMjMsMjM5LDI0MiwyMzMsMTEwLDEyOCwKLSAgICAgIDEsMTQ2LDEwOSwgIDIsIDkxLDEzNiwgOTEsMTQ3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsCi0gICAgMTI4LDI1NSwgNzAsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNTMsMTExLCAgNCwgOTEsMTY2LAotICAgICA5MSwxODgsIDkxLDIwMCwgOTEsMjA3LDIzMCwgOTcsICAyLCA5MSwxNzMsIDkxLDE4MSwyMzgsMjQ0LDIzMiwKLSAgICAyMjUsMTA1LDEyOCwgMTQsIDMxLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAyOSwyMzgsMjMxLDIzNywyMjUsCi0gICAgMjM4LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA3OSwyNDIsMjI1LDIzNiwxMDgsMTI4LCAzNCwgIDAsMjQ1LAotICAgIDExNCwxNDIsICAwLCA1MiwgOTEsMjQwLCA5MSwyNDksIDkyLCAgMywgOTIsIDMzLCA5MiwgNDAsIDkyLCA2NSwKLSAgICAgOTIsIDkyLCA5MiwxMjYsIDkyLDEzOCwgOTIsMTU3LCA5MiwxNjgsIDkyLDIwMSwgOTIsMjA5LCA5MiwyMjAsCi0gICAgMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxMDAsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LAotICAgIDEyOCwgIDksMjM0LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOSwgMzYsIDk5LCA5MiwgMTQsMjMzLDIzOCwKLSAgICAyNDYsMjI5LDI0MiwyNDMsMjI5LDI0MywyMjUsMjM4LDI0MywyNDMsMjI5LDI0MiwyMzMsMTAyLDEyOCwgMzksCi0gICAgMTQxLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LDEwNiwyMzEsMTE3LCAgMiwgOTIsIDQ3LCA5MiwgNTYsMjM0LAotICAgIDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwyMzQsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwKLSAgICAxMDYsMjMyLCA5NywgIDIsIDkyLCA3MiwgOTIsIDgzLDIyNywyMzUsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksCi0gICAgMTI4LCAgNiwxMDAsMjM4LDIzMSwyNTAsMjMyLDIzOSwxMTcsMTI4LCA0OCwgMzYsMTA1LCAgMiwgOTIsIDk4LAotICAgICA5MiwxMTYsMjI4LDIyOSwyMzksMjMxLDI0MiwyMjUsMjQwLDIzMiwyMzMsMjI3LDI0MCwyMjUsMjQyLDIyOSwKLSAgICAxMTAsMTI4LCA1MCwgMzUsMjM4LDIzMCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsMTMyLDIzNywyMzksCi0gICAgMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDIwLDIzOCwyNDUsMjM3LDIyOSwyNDIsMjI1LAotICAgIDI0NCwyMzksMjQyLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDI0NywyMzksMjM2LDIyOCwKLSAgICAyNDMsMjQ0LDI0OSwyMzYsMTAxLDEyOCwyNDcsIDUyLDExMiwgIDIsIDkyLDE3NCwgOTIsMTgxLDIyNSwyNDIsCi0gICAgMjI5LDExMCwxMjgsIDM2LDExOSwyMjksMTE0LCAgMiwgOTIsMTg4LCA5MiwxOTQsMjMzLDIzOSwxMDAsMTI4LAotICAgICAzNiwxMzksMjQzLDIzMywyMjUsMTEwLDEyOCwgIDYsMjQ0LDI0MiwyMzksMjM3LDIyNSwxMTAsMTI4LCAzMywKLSAgICAxMTUsMjQzLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLDExNiwxMTYsICAyLCA5MiwyMjYsCi0gICAgIDkzLCAgOCwyMjksMjI5LDExMCwgIDIsIDkyLDIzNCwgOTIsMjQzLDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLAotICAgIDEyOCwgMzYsMTA5LDExMiwgIDIsIDkyLDI0OSwgOTMsICAwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDEyOSwKLSAgICAyMjksMjQyLDIzMywyMzksMTAwLDEyOCwgMzYsMTQ5LDEwNCwgIDIsIDkzLCAxNCwgOTMsIDE5LDIyNSwxMDUsCi0gICAgMTI4LCAxNCwgODQsMjQ0LDIzOSwyMzgsMjI5LDIyNywyMzIsMjMzLDIzOCwyMjksMjQzLDEwMSwxMjgsICAyLAotICAgIDIwMywyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTYxLDI0MiwgOTcsICAyLCA5MywgNDgsIDkzLCA1NiwKLSAgICAyMjcsMjQ0LDIzMywyMzksMTEwLDEyOCwgMzIsIDY4LDIzOCwgOTksMTI4LCAzMiwxNjMsMTAzLDE0NCwgIDAsCi0gICAgMTAzLCA5MywgOTcsIDk0LCA0MywgOTQsIDY2LCA5NCwxMjcsIDk0LDE0NCwgOTUsIDY1LCA5NiwgNTgsIDk2LAotICAgIDE0MywgOTYsMTU2LCA5NywgMTQsIDk3LCAzOSwgOTcsIDY3LCA5NywgODksIDk4LCAzNCwgOTgsIDU2LCA5OCwKLSAgICAxNTgsIDk3LCAgOSwgOTMsMTE3LCA5MywxMjcsIDkzLDEzNCwgOTMsMTQxLCA5MywyMDUsIDkzLDIzMCwgOTMsCi0gICAgMjQxLCA5MywyNTIsIDk0LCAzMCwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNTEsMjI3LAotICAgIDI0NSwyNDQsMTAxLDEyOCwgIDEsMjQ1LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAyMywxMDIsICA0LCA5MywKLSAgICAxNTEsIDkzLDE2MCwgOTMsMTc0LCA5MywxOTAsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxNzUsCi0gICAgMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUxLDE0NywyMzMsMjM4LAotICAgIDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxNDgsMjM3LDIyOSwKLSAgICAyMjgsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxNDksMjMxLDExNywgIDIsCi0gICAgIDkzLDIxMiwgOTMsMjIxLDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTUxLDI0MiwyMzcsMjQ1LAotICAgIDIzNSwyMzIsMTA1LDEyOCwgMTAsIDIzLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwKLSAgICAgNzYsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE3MiwyMzcsMjM3LCA5NywxMzAsCi0gICAgICAzLDE3OSwgOTQsICA2LCA5NCwgMTksMjM2LDIyNSwyNDQsMjMzLDIzOCwyNDMsMjM3LDIyNSwyMzYsMTA4LAotICAgIDEyOCwgIDIsIDk5LDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAgMiwyMjQsMjM4LDIzMSwKLSAgICAyMzMsMjI1LDIyNywyMzksMjQwLDI0NCwyMzMsIDk5LDEyOCwgIDMsMjM1LCA5OCwgIDIsIDk0LCA0OSwgOTQsCi0gICAgIDU5LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAxMywyNDIsMjI5LDI0NiwxMDEsMTI4LAotICAgICAgMSwgMzEsIDk5LCAgNCwgOTQsIDc2LCA5NCwgODMsIDk0LCA5MiwgOTQsMTE0LDIyNSwyNDIsMjM5LDExMCwKLSAgICAxMjgsICAxLDIzMSwyMjksMjI4LDIzMywyMzYsMjM2LCA5NywxMjgsICAxLCAzNSwyMzMsMjQyLCA5OSwgIDIsCi0gICAgIDk0LDEwMCwgOTQsMTA1LDIzNiwxMDEsMTI4LCAzNiwyMTQsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTI4LAotICAgICAgMSwgMjksMjM5LDIzNywyMzcsMjI1LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgIDEsIDM1LDIyOCwKLSAgICAyMzksMTE2LDEyOSwgIDEsIDMzLCA5NCwxMzUsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAgMSwgMzMsCi0gICAgMTAxLCAgNiwgOTQsMTU4LCA5NCwxNjksIDk0LDE4MCwgOTQsMTkxLCA5NCwyMTAsIDk1LCA1NiwyMjcsMjQ5LAotICAgIDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDUxLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwKLSAgICAgOTcsMTI4LCA0OCwgODIsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE3OCwyMzksCi0gICAgMjM3LDIyOSwyNDQsMjQyLDIzMywyMjcsMjI1LDIzNiwyMzYsMjQ5LDIyOSwyNDEsMjQ1LDIyNSwxMDgsMTI4LAotICAgICAzNCwgODEsMTE0LCAgMywgOTQsMjE4LCA5NSwgMTEsIDk1LCAyMSwyMjksMjQzLDEwNCwgIDMsIDk0LDIyOCwKLSAgICAgOTQsMjQzLCA5NCwyNTIsMjI1LDIyNywyMjcsMjI5LDIzOCwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksCi0gICAgMTI4LCAgNSwxNTYsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwyNDMsMjM3LDI0NSwyNDEsMjI4LAotICAgIDIyNSwyMzcsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNTcsMjM3LDIyNSwyMzgsMjI4LDIyNiwKLSAgICAyMzYsMTE1LDEyOCwgIDAsMjIzLDI0MywyMzIsMjI1LDI0OSwyMzMsMTA5LCAgMiwgOTUsIDMyLCA5NSwgNDcsCi0gICAgMjI1LDIyNywyMjcsMjI5LDIzOCwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNTgsMjMyLAotICAgIDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwyNDQsMjQ0LDIyNSwyMzcsMjI1LDI0MiwxMDcsMTI4LCA0OCwKLSAgICAgMTksMTA0LCAgNSwgOTUsIDc3LCA5NSwyMTAsIDk2LCAxNywgOTYsIDQyLCA5NiwgNDgsIDk3LCAgNCwgOTUsCi0gICAgIDg3LCA5NSwgOTcsIDk1LDEyMCwgOTUsMTQ1LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LAotICAgIDE1MiwxMDAsICAyLCA5NSwxMDMsIDk1LDExNCwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwKLSAgICAgIDUsMTE0LDIyOSwyNDYsIDk3LDEyOCwgIDksIDI0LDIzMSwxMTcsICAyLCA5NSwxMjcsIDk1LDEzNiwyMzQsCi0gICAgMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE1MiwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLAotICAgICAyNCwyMzMsMTEwLCAgNCwgOTUsMTU2LCA5NSwxNjUsIDk1LDE3OSwgOTUsMTk1LDIyNSwyNDIsMjI1LDIyNiwKLSAgICAyMzMsIDk5LDEyOCwgIDYsIDU4LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksCi0gICAgMTI4LDI1NCwyMDYsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LAotICAgIDEyOCwyNTQsMjA3LDIzNywyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwKLSAgICAyNTQsMjA4LDEwMSwgIDMsIDk1LDIxOCwgOTUsMjM5LCA5NiwgIDAsMjM3LDIzMywyMjgsMjI4LDIzNiwyMjksCi0gICAgMjMyLDIzOSwyMzksMjM1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNDksMjQzLAotICAgIDI0NCwyNDIsMjM5LDIzNSwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE0NywKLSAgICAyNDUsMjQwLDI0NCwyNDUsMjQyLDIzOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCi0gICAgMTQ1LDIzMiwgOTcsICAyLCA5NiwgMjQsIDk2LCAzMSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgOTAsMjMxLAotICAgIDI0NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA5MCwyMzksMjM5LDEwNywxMjgsICAyLCA5NiwKLSAgICAyNTAsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNDcsMTA1LCAgMywgOTYsIDY2LCA5NiwgNzcsCi0gICAgIDk2LCA4OCwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDc4LDIzNSwyMjUsMjQ0LAotICAgIDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwxNzQsMTA5LCAgMiwgOTYsIDk0LCA5NiwxMDUsMjI1LDI0MiwKLSAgICAyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LCA5OSwyMjksMTA4LDEzMCwgIDUsMjEwLCA5NiwxMTQsCi0gICAgIDk2LDEzNCwyMjgsMjI1LDIzMSwyMjksMjQzLDEwNCwxMjksMjUxLCA1MCwgOTYsMTI1LDIzMiwyMjksMjI2LAotICAgIDI0MiwyMjksMTE5LDEyOCwyNTEsIDUwLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjEwLDIzNCwKLSAgICAyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA4MywyMzYsMjM5LDI0NCwyNDQsCi0gICAgMjI1LDEwOCwgIDIsIDk2LDE2NywgOTYsMTg0LDIzMywyMzgsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwyMjgsMjQzLAotICAgIDI0NCwyNDIsMjM5LDIzNSwxMDEsMTI4LCAgMSwxOTAsMjQzLDI0NCwyMzksMTEyLDEzMiwgIDIsMTQ4LCA5NiwKLSAgICAxOTksIDk2LDIxMCwgOTYsMjE2LCA5NiwyNDgsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDQsMjI5LDEwMCwxMjgsCi0gICAgICAyLDE1MCwyMzcsMjM5LDEwMCwxMjgsICAyLDE5MiwyNDIsMjI5LDI0NiwyMjksMjQyLDI0MywyMjksMTAwLAotICAgIDEzMCwgIDIsMTQ5LCA5NiwyMzEsIDk2LDIzNywyMzcsMjM5LDEwMCwxMjgsICAyLDE5MywyNDMsMjQ1LDI0MCwKLSAgICAyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgIDIsMjI4LDI0MywyNDQsMjQyLDIzOSwyMzUsMTAxLDEyOSwgIDIsCi0gICAgMTYxLCA5NywgIDMsMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwxMjgsICAyLDE2MiwxMDksICAyLAotICAgICA5NywgMjAsIDk3LCAyOCwyMjUsMjI3LDI0MiwyMzksMTEwLDEyOCwgMzAsIDMzLDIzOSwyMzgsMjM5LDI0MywKLSAgICAyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNzEsMTExLCAgMiwgOTcsIDQ1LCA5NywgNTYsMjMyLDIzMywyNDIsCi0gICAgMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LCA4NCwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LAotICAgIDEyOCwgNDgsMTgwLDI0MCwgOTcsICAyLCA5NywgNzQsIDk3LCA4MCwyNDIsMjI5LDExMCwxMjgsIDM2LDE2MiwKLSAgICAyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE3MiwxMTQsICAyLCA5NywgOTUsIDk3LDE5MiwgOTcsCi0gICAgICAyLCA5NywxMDEsIDk3LDEwOSwyMjgsMjMzLDIyOSwyMzgsMTE2LDEyOCwgMzQsICA3LDI0NiwxMDEsMTM0LAotICAgICAgMCwgOTYsIDk3LDEyNiwgOTcsMTM3LCA5NywxNTQsIDk3LDE2MSwgOTcsMTcwLCA5NywxODIsMjI2LDIyOSwKLSAgICAyMzYsMjM5LDI0NywyMjcsMjM3LCA5OCwxMjgsICAzLCAyMiwgOTksICAyLCA5NywxNDMsIDk3LDE0OCwyMzcsCi0gICAgIDk4LDEyOCwgIDMsICAwLDIzOSwyMzcsIDk4LDEyOCwgIDMsICAwLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LAotICAgICA4MywyMzYsMjM5LDI0NywyMzcsMjM5LDEwMCwxMjgsICAyLDIwNiwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwKLSAgICAyMjUsMjI3LDEwMSwxMjgsMjU1LCA2NCwyNDQsMjM5LDIzOCwyMjksMjI3LDIzNywgOTgsMTI4LCAgMywgNjQsCi0gICAgMjI5LDIyNSwyNDQsMjI5LDExNCwxMzIsICAwLCA2MiwgOTcsMjA4LCA5NywyMjcsIDk3LDIzOSwgOTgsIDI2LAotICAgIDIyOSwyNDEsMjQ1LDIyNSwxMDgsMTI5LCAzNCwxMDEsIDk3LDIxOCwyMzksMjQyLDIzNiwyMjksMjQzLDExNSwKLSAgICAxMjgsIDM0LDIxOSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAzMCwxMTEsCi0gICAgICAyLCA5NywyNDUsIDk4LCAxNSwxMTQsICAyLCA5NywyNTEsIDk4LCAgOCwyMjksMjQxLDI0NSwyMzMsMjQ2LAotICAgIDIyNSwyMzYsMjI5LDIzOCwxMTYsMTI4LCAzNCwxMTUsMjM2LDIyOSwyNDMsMTE1LDEyOCwgMzQsMTE5LDI0NiwKLSAgICAyMjksMjQyLDIyOSwyNDEsMjQ1LDIyNSwxMDgsMTI4LCAzNCwxMDMsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsCi0gICAgMjU0LDEwMSwxMTUsICAyLCA5OCwgNDAsIDk4LCA0OCwyMjcsMjQyLDIzMywyNDAsMTE2LDEyOCwgIDIsIDk3LAotICAgIDI0NCwyNDIsMjM5LDIzNSwxMDEsMTI4LCAgMSwyMjksMTE3LCAgNCwgOTgsIDY2LCA5OCwgNzcsIDk4LDEzNCwKLSAgICAgOTgsMTQ1LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgODAsMjMzLDEwOCwgIDIsCi0gICAgIDk4LCA4NCwgOTgsMTA5LDIzNiwyMjksMjM3LDIzOSwxMTYsICAyLCA5OCwgOTQsIDk4LDEwMSwyMzYsMjI5LAotICAgIDIzMCwxMTYsMTI4LCAgMCwxNzEsMjQyLDIzMywyMzEsMjMyLDExNiwxMjgsICAwLDE4NywyNDMsMjMzLDIzOCwKLSAgICAyMzEsMTA4LCAgMiwgOTgsMTE5LCA5OCwxMjYsMjM2LDIyOSwyMzAsMTE2LDEyOCwgMzIsIDU3LDI0MiwyMzMsCi0gICAgMjMxLDIzMiwxMTYsMTI4LCAzMiwgNTgsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LAotICAgIDE3NiwyNDIsMjI1LDIzNywyNDUsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgMjQsMjQ5LDI0MywKLSAgICAyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMjAxLDEwNCwxNDQsICAwLDEwNCwgOTgsMjA0LDEwMSwgOTAsCi0gICAgMTAxLDEyNSwxMDEsMTYyLDEwMSwyMDIsMTAzLCA5MCwxMDMsMTEwLDEwNCwgNzUsMTA0LCA4NywxMDQsIDk5LAotICAgIDEwNSwxNjcsMTA1LDE3NSwxMDUsMTg2LDEwNSwxOTUsMTA2LCAxOSwxMDYsIDIzLCA5NywgMTMsIDk4LDIzMiwKLSAgICAgOTksIDE1LCA5OSwgMjUsIDk5LCA1NSwgOTksIDgwLCA5OSwxNTgsIDk5LDE3MCwgOTksMTk1LCA5OSwyMTAsCi0gICAgIDk5LDIzOSwgOTksMjUyLDEwMCwgNTQsMTAwLCA2MywgOTcsICAyLCA5OCwyMzgsIDk5LCAgMSwyMjYsMjM1LAotICAgIDIzMiwyMjUsMjQzLDIzMywyMjUsMjM4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKLSAgICAxNjksMjM2LDI0NCwyMzksMjM4LDIyOSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LDE5MywyMjYsCi0gICAgMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxODUsMjI4LDEwMSwgIDIsIDk5LCAzMiwgOTksIDUwLAotICAgIDI0MywyMjcsMjI5LDIzOCwyMjgsMjI5LDI0MiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsMTc5LDI0NiwgOTcsMTI4LCAgOSwgNTcsMjMxLDExNywgIDIsIDk5LCA2MiwgOTksIDcxLDIzNCwyMjUsCi0gICAgMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTg1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDU3LAotICAgIDEwNCwgIDQsIDk5LCA5MCwgOTksIDk5LCA5OSwxMTMsIDk5LDE0MywyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwKLSAgICAxMjgsICA2LCA0NSwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsCi0gICAgMTYyLDEwNSwgIDIsIDk5LDExOSwgOTksMTM0LDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LAotICAgIDIyNiwyMzMsIDk5LDEyOCwyNTQsMTYzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTExLDIzNywKLSAgICAyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTY0LDIzMywyNDQsCi0gICAgMjQ1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDQyLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LAotICAgIDIzOCwgOTcsMTI5LCA0OCwyMDcsIDk5LDE4MywyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwKLSAgICAxMjgsMjU1LDEzOCwyMzYsMjI1LDIzOCwyNDQsMjMxLDI0NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsCi0gICAgIDEwLCA3NywyMzcsMjUwLCA5NywgIDIsIDk5LDIxOCwgOTksMjI3LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LAotICAgIDEyOCwgIDYsIDMzLDIzNiwyMzksMjQ3LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDMzLDIzOCwKLSAgICAyMzEsMjQ1LDIzNiwyMzAsMjMzLDIzNiwyMzYsMjI5LDExNCwxMjgsIDQ5LDEwMCwxMTQsICAyLDEwMCwgIDIsCi0gICAgMTAwLCAxOCwyMjgsMjQzLDIzMywyMzEsMjM4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LAotICAgICAgNCwgNzQsMjQwLDIzOSwyMzksMTEwLCAgMiwxMDAsIDI3LDEwMCwgNDAsMjM2LDIyOSwyMzAsMjQ0LDIyNiwKLSAgICAyMjUsMjQyLDIyNiwyNDUsMTEyLDEyOCwgMzMsMTg4LDI0MiwyMzMsMjMxLDIzMiwyNDQsMjI2LDIyNSwyNDIsCi0gICAgMjI2LDI0NSwxMTIsMTI4LCAzMywxOTIsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwyMDIsMjQ0LAotICAgIDIyNSwxMDIsICAzLDEwMCwgNzMsMTAwLDE2NSwxMDEsICAwLDI0MCwyMjUsMjQ0LDIyNSwxMDQsMTM0LCAgNSwKLSAgICAxNzgsMTAwLCA5MywxMDAsIDk4LDEwMCwxMTIsMTAwLDEyMSwxMDAsMTM2LDEwMCwxNTIsMTc3LCA1NCwxMjgsCi0gICAgICA1LDE3OCwgNTAsICAyLDEwMCwxMDQsMTAwLDEwOCwgNTEsMTI4LCAgNSwxNzgsMTAyLDEyOCwgIDUsMTc4LAotICAgIDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTc4LDIzOCwyMjUsMjQyLDI0MiwyMzksMjQ3LDIzMiwKLSAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTc4LDI0MSwyNDUsMjI1LDI0MiwyNDQsMjI5LDI0MiwyMzIsCi0gICAgMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3OCwyNDcsMjMzLDIyOCwyMjksMjMyLDIyOSwyMjYsMjQyLAotICAgIDIyOSwxMTksMTI4LCAgNSwxNzgsMjQxLDIyNSwyMzcsMjI1LDI0NCwxMTUsMTM1LCAgNSwxNzksMTAwLDE4OCwKLSAgICAxMDAsMTkzLDEwMCwxOTgsMTAwLDIwMywxMDAsMjEyLDEwMCwyMjcsMTAwLDI0MywxNzcsIDk4LDEyOCwgIDUsCi0gICAgMTc5LDE3OCwgNTYsMTI4LCAgNSwxNzksMTc5LCA1MiwxMjgsICA1LDE3OSwyMzIsMjI5LDIyNiwyNDIsMjI5LAotICAgIDExOSwxMjgsICA1LDE3OSwyMzgsMjI1LDI0MiwyNDIsMjM5LDI0NywyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwKLSAgICAxMjgsICA1LDE3OSwyNDEsMjQ1LDIyNSwyNDIsMjQ0LDIyOSwyNDIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksCi0gICAgMTI4LCAgNSwxNzksMjQ3LDIzMywyMjgsMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTc5LAotICAgIDI0MywyMjksMjMxLDIzOSwxMDgsMTM1LCAgNSwxNzcsMTAxLCAyMiwxMDEsIDI3LDEwMSwgMzIsMTAxLCAzNywKLSAgICAxMDEsIDQ2LDEwMSwgNjEsMTAxLCA3NywxNzcsIDU1LDEyOCwgIDUsMTc3LDE3OCwgNTIsMTI4LCAgNSwxNzcsCi0gICAgMTc5LCA0OCwxMjgsICA1LDE3NywyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3NywyMzgsMjI1LAotICAgIDI0MiwyNDIsMjM5LDI0NywyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3NywyNDEsMjQ1LDIyNSwKLSAgICAyNDIsMjQ0LDIyOSwyNDIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNzcsMjQ3LDIzMywyMjgsCi0gICAgMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTc3LCA5OCwgIDMsMTAxLCA5OCwxMDEsMTAzLAotICAgIDEwMSwxMTMsMjI1LDExNCwxMjgsICAxLCAzOSwyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsMTI4LCA0OSwKLSAgICAgMTUsMjQyLDIyOSwyNDYsMjI5LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgNDMsIDk5LCAgMiwxMDEsCi0gICAgMTMxLDEwMSwxNDAsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI4LCAzMCwgNDEsMjMzLDI0MiwgOTksICAyLAotICAgIDEwMSwxNDgsMTAxLDE1MywyMzYsMTAxLDEyOCwgMzYsMjE1LDI0NSwyMzcsMjMwLDIzNiwyMjksMTIwLDEyOCwKLSAgICAgIDEsIDM3LDEwMCwgIDIsMTAxLDE2OCwxMDEsMTc4LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjgsCi0gICAgIDMwLCAzOSwyMzksMTE2LCAgMiwxMDEsMTg1LDEwMSwxOTQsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LAotICAgICAzMCwgMzUsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCAzNywxMDEsMTM2LCAgNSwyMTIsMTAxLDIyMiwKLSAgICAxMDEsMjU1LDEwMiwgMTksMTAyLDI0OCwxMDMsICA4LDEwMywgNTMsMTAzLCA2MiwxMDMsIDc1LDIyNSwyNDIsCi0gICAgMTE2LDEyOSwgMzgsMTAxLDEwMSwyMzAsMjQzLDI0NSwyMzMsMTE2LCAgMiwxMDEsMjM5LDEwMSwyNDcsMjI2LAotICAgIDIzNiwyMjUsMjI3LDEwNywxMjgsIDM4LDEwMSwyNDcsMjMyLDIzMywyNDQsMTAxLDEyOCwgMzgsIDk3LDIyOCwKLSAgICAyMjUsMjMxLDIyOSwyNDMsMTA0LDEyOSwyNTEsIDUyLDEwMiwgMTAsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksCi0gICAgMTI4LDI1MSwgNTIsMTA0LCAgNiwxMDIsIDMzLDEwMiwgNjEsMTAyLCA2OSwxMDIsMTE5LDEwMiwxNjUsMTAyLAotICAgIDIxNCwgOTcsICAyLDEwMiwgMzksMTAyLCA1MywyMzYsMjQ0LDIzOSwyMzgsMjI5LDIyNSwyNDIsMjI1LDIyNiwKLSAgICAyMzMsIDk5LDEyOCwgIDYsMTkzLDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNzEsMjI5LDIyNiwyNDIsCi0gICAgMjI5LDExOSwxMjgsICA1LDIxMiwyMzAsMjMzLDIzOCwyMjUsMjM2LCA5NywgIDIsMTAyLCA4MCwxMDIsMTExLAotICAgIDIzNiwxMTYsICAyLDEwMiwgODcsMTAyLCA5OSwyMzksMjM4LDIyOSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwKLSAgICAxMjgsMjUxLDE2NywyNDQsMjQ3LDIzOSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIzNCwyNDIsCi0gICAgMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjM0LDIzMiwyMjUsMjM3LDI1MCwyMjUsMjI1LDIyNiwyMzksMjQ2LAotICAgIDEwMSwgIDIsMTAyLDEzNCwxMDIsMTQ4LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywKLSAgICAgOTksMTI4LDI1MSwxNjUsMjMzLDI0MywyMzksMjM2LDIyNSwyNDQsMjI5LDIyOCwyMjUsMjQyLDIyNSwyMjYsCi0gICAgMjMzLCA5OSwxMjgsMjUxLDE2NCwxMDUsICAyLDEwMiwxNzEsMTAyLDIwNSwyMzgsMjMzLDI0NCwyMzMsMjI1LAotICAgIDIzNiwgOTcsICAyLDEwMiwxODMsMTAyLDE5NywyMzYsMjQ0LDIzOSwyMzgsMjI5LDIyNSwyNDIsMjI1LDIyNiwKLSAgICAyMzMsIDk5LDEyOCwyNTEsMTY4LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMzUsMjQyLDIyNSwyMzEsCi0gICAgMjI1LDIzOCwgOTcsMTI4LCA0OCwxMjAsMjM3LDIyOSwyMjgsMjMzLDIyNSwyMzYsIDk3LCAgMiwxMDIsMjI2LAotICAgIDEwMiwyNDAsMjM2LDI0NCwyMzksMjM4LDIyOSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUxLDE2OSwKLSAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjM2LDIzMywyNDMsMjI5LDIzMywyMjksMjQyLDIyNSwyNDMsCi0gICAgMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDEyMywxMDcsICAyLDEwMywgMTQsMTAzLCAzOCwyMjUsMjQ0LAotICAgIDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyMTYsMTAzLCAyNiwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywKLSAgICAyMjgsMjQ0LDEwNCwxMjgsMjU1LDE0MSwyNDUsMjQ0LDIyNSwyMjUsMjQyLDI0NSwyNDMsMjQxLDI0NSwyMjUsCi0gICAgMjQyLDEwMSwxMjgsIDUxLCA1NCwyMzgsMjMxLDIzMiwyMzksMjM5LDEwNywxMjgsICAyLDEwMywyNDIsMjQ1LAotICAgIDI0NCwyNDUsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgNTcsMTE2LDEyOSwgIDUsMjE1LDEwMywKLSAgICAgODEsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwyMTUsMjMyLDIzOSwyMzksMTA3LDEyOSwgIDIsCi0gICAgMTAyLDEwMywgOTksMjQzLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsICAyLDE3NywxMDUsICA0LAotICAgIDEwMywxMjAsMTAzLDIwNSwxMDMsMjE2LDEwMywyNDEsMjI5LDI0NSwxMDQsICA0LDEwMywxMzIsMTAzLDE2NywKLSAgICAxMDMsMTgyLDEwMywxOTEsIDk3LCAgMiwxMDMsMTM4LDEwMywxNTMsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksCi0gICAgMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMjMsMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LAotICAgIDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAyNywyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwKLSAgICAyMjksMjI1LDExMCwxMjgsIDUwLDEwOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA3OCwyNDAsCi0gICAgMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsIDEzLDIzMiwyMzMsMjQyLAotICAgIDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMTQsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywKLSAgICAxMjksIDQ4LDIxMCwxMDMsMjI5LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsCi0gICAgMTM5LDI0MiwyMzMsMTEzLDEzNCwgIDUsMTgwLDEwNCwgIDMsMTA0LCAgOCwxMDQsIDIyLDEwNCwgMzEsMTA0LAotICAgICA0NiwxMDQsIDYyLDE3NywgNTIsMTI4LCAgNSwxODAsIDUwLCAgMiwxMDQsIDE0LDEwNCwgMTgsIDQ5LDEyOCwKLSAgICAgIDUsMTgwLDEwMCwxMjgsICA1LDE4MCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4MCwyMzgsCi0gICAgMjI1LDI0MiwyNDIsMjM5LDI0NywyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4MCwyNDEsMjQ1LAotICAgIDIyNSwyNDIsMjQ0LDIyOSwyNDIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODAsMjQ3LDIzMywKLSAgICAyMjgsMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTgwLDIzNiwyMzMsMjM4LDIyOSwyMjYsCi0gICAgMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTUwLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLAotICAgIDEyOCwyNTUsIDcyLDExMSwgIDksMTA0LDExOSwxMDQsMTMwLDEwNCwxNTQsMTA0LDE3OSwxMDUsIDExLDEwNSwKLSAgICAgMjQsMTA1LDExMCwxMDUsMTUwLDEwNSwxNjEsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsCi0gICAgICA1LDExMiwyMzIsMTA1LCAgMiwxMDQsMTM3LDEwNCwxNDUsMjQwLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LAotICAgICA0MywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEyMywyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwKLSAgICAyMzgsIDk3LDEyOSwgNDgsMjE5LDEwNCwxNjcsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsCi0gICAgMTI4LDI1NSwxNDIsMjM2LDIyNSwxMDksMTM1LCAgNSwxODUsMTA0LDE5OSwxMDQsMjA0LDEwNCwyMDksMTA0LAotICAgIDIxNCwxMDQsMjIzLDEwNCwyMzgsMTA0LDI1NCwxNzcsIDU3LDEyOCwgIDUsMTg1LDE3OCwgNTQsMTI4LCAgNSwKLSAgICAxODUsMTc5LCA1MCwxMjgsICA1LDE4NSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4NSwyMzgsCi0gICAgMjI1LDI0MiwyNDIsMjM5LDI0NywyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4NSwyNDEsMjQ1LAotICAgIDIyNSwyNDIsMjQ0LDIyOSwyNDIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODUsMjQ3LDIzMywKLSAgICAyMjgsMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTg1LDIzOCwyMzksMjM1LDIzMiwyNDUsCi0gICAgMjM1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA0NiwxMTEsICAyLDEwNSwgMzAsMTA1LDEwMCwxMDcsICA0LAotICAgIDEwNSwgNDAsMTA1LCA1MiwxMDUsIDU4LDEwNSwgODAsMjI1LDIyNiwyMzksMjQ2LDIyOSwyMjcsMjM5LDIzNywKLSAgICAgOTgsMTI4LCAgMywgIDksMjI3LDIzNywgOTgsMTI4LCAgMywgIDksMjQwLDIyNSwyMzYsMjI1LDI0NCwyMjUsCi0gICAgMjM2LDIzMywyNTAsMjI5LDIyOCwyMjYsMjI5LDIzNiwyMzksMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDMzLAotICAgIDI0MiwyMjksMjQ0LDI0MiwyMzksMjMwLDIzNiwyMjksMjQ4LDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywKLSAgICAgOTgsMTI4LCAgMywgMzQsMjM4LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDY2LDExNCwgIDIsCi0gICAgMTA1LDExNiwxMDUsMTQzLDEwNSwgIDIsMTA1LDEyMiwxMDUsMTMxLDIyNywyMzksMjQwLDI0NCwyMzMsIDk5LAotICAgIDEyOCwgIDMsMjMzLDI1MCwyMzksMjM4LDI0NCwyMjUsMjM2LDIyNiwyMjUsMTE0LDEyOCwgMzIsIDIxLDIzOCwKLSAgICAyMjcsMjM3LCA5OCwxMjgsICAzLCAyNywyNDQsMjQzLDI0MCwyNDIsMjMzLDIzOCwyMzEsMTE1LDEyOCwgMzgsCi0gICAgMTA0LDI0NSwyNDMsMTAxLDEyOCwgMzUsICAyLDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxNjMsMjQzLAotICAgIDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsICAyLDE3NiwyNDQsMjQ1LDI0MiwyMzgsMjI5LDEwMCwKLSAgICAxMjgsICAyLDEwMSwxMTcsICA0LDEwNSwyMDUsMTA1LDIxNiwxMDUsMjI5LDEwNSwyNTQsMjMyLDIzMywyNDIsCi0gICAgMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDExNywyMzMsMjMzLDI0NCwyMzksMjQzLDI0MSwyNDUsMjI1LAotICAgIDI0MiwxMDEsMTI4LCA1MSwgNTEsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIxMywKLSAgICAxMDUsMjQyLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTQwLDIzOCwyMzEsCi0gICAgMjI1LDI0MiwyNDUsMjM3LDIzNiwyMjUsMjQ1LDExNiwxMjksICAyLDIyMSwxMDYsIDEzLDIyNywyMzcsIDk4LAotICAgIDEyOCwgIDMsIDExLDExOCwxMjgsICAxLDE0OSwyNDksMjQwLDIzMiwyMjksMTEwLDEzMiwgIDAsIDQ1LDEwNiwKLSAgICAgMzksMTA2LCA1MCwxMDYsIDYyLDEwNiwgODUsMjMzLDIzOCwyMzAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsCi0gICAgMjQ2LDIyOSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAxMywxMTUsICAyLAotICAgIDEwNiwgNjgsMTA2LCA3NSwyMzcsMjI1LDIzNiwxMDgsMTI4LDI1NCwgOTksMjQ1LDI0MCwyMjksMjQyLDIzMywKLSAgICAyMzksMTE0LDEyOCwyNDYsMjMwLDI0NCwyNDcsMTExLDEyOCwgMzIsIDE2LDEwNSwxNDksICAwLDEwNSwxMDYsCi0gICAgMTM3LDEwNiwxNjAsMTA2LDE5NCwxMDYsMjQxLDExMCwxMjMsMTEwLDI0MywxMTEsIDI0LDExMSwgNTEsMTExLAotICAgIDIxMywxMTEsMjE3LDExMSwyNTUsMTEyLCAyMSwxMTIsMTA1LDExMywgMTQsMTEzLCA4OSwxMTMsIDk3LDExMywKLSAgICAxMTAsMTEzLDE5NywxMTMsMjU0LDExNCwgMjYsMTE0LCA3MCwyMjUsIDk5LCAgMiwxMDYsMTQ0LDEwNiwxNTAsCi0gICAgMjQ1LDI0NCwxMDEsMTI4LCAgMCwyMzcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDc5LAotICAgICA5OCwgIDMsMTA2LDE2OCwxMDYsMTc3LDEwNiwxODcsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwKLSAgICAxMzUsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDM5LDI0MiwyMjksMjQ2LDEwMSwxMjgsCi0gICAgICAxLCA0NSwgOTksICAzLDEwNiwyMDIsMTA2LDIwOSwxMDYsMjMxLDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLAotICAgIDIwOCwyMzMsMjQyLCA5OSwgIDIsMTA2LDIxNywxMDYsMjIyLDIzNiwxMDEsMTI4LCAzNiwyMTYsMjQ1LDIzNywKLSAgICAyMzAsMjM2LDIyOSwxMjAsMTI4LCAgMCwyMzgsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCi0gICAgIDg2LDEwMCwgIDQsMTA2LDI1MSwxMDcsICA1LDExMCwgODAsMTEwLDExMywyMjYsMjM2LDIzMSwyNDIsMjI1LAotICAgIDI0NiwxMDEsMTI4LCAgMiwgIDksMTAxLCAgMiwxMDcsIDExLDExMCwgNzUsMjM5LDIzMSwyNDIsMjI1LDI0MCwKLSAgICAxMDQsICA3LDEwNywgMzIsMTA3LCA0NiwxMDcsIDU5LDEwOSwyNDQsMTEwLCAxOSwxMTAsIDMyLDExMCwgNDQsCi0gICAgMjI5LDIyNSwyNDIsMjQ0LDIzMiwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDUwLDE0MywyMzAsMjMzLAotICAgIDI0MiwyMjksMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCA1MCwxMzksMjMzLCA5OSwgMTQsMTA3LCA5MCwKLSAgICAxMDcsMTA2LDEwNywyMDUsMTA4LCAgMywxMDgsIDY5LDEwOCwgOTgsMTA4LDExNCwxMDgsMTcxLDEwOCwyMjAsCi0gICAgMTA4LDIzMiwxMDksICAzLDEwOSwgNzAsMTA5LDIwOCwxMDksMjM3LDIyNSwyMzYsMjM2LDIzMywyMjUsMjM4LAotICAgIDIyNywyMjksMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCA2MywgOTksICA0LDEwNywxMTYsMTA3LDEyNywKLSAgICAxMDcsMTQxLDEwNywxNDgsMjI1LDIzNiwyMzYsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCA1OCwyMjksCi0gICAgMjM4LDI0NCwyNDIsMjI5LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgNTAsMTY1LDIzNiwyMzksMjQzLAotICAgIDEwMSwxMjgsIDQ4LCAgNiwxMTEsICAzLDEwNywxNTYsMTA3LDE3MSwxMDcsMTkxLDIzNywyMzcsIDk3LDEyOSwKLSAgICAgNDgsICAxLDEwNywxNjQsMjM2LDIyOSwyMzAsMTE2LDEyOCwyNTUsMTAwLDIzOCwyMzEsMjQyLDIyNSwyNDQsCi0gICAgMjQ1LDIzNiwyMjUsMjQ0LDIzMywyMzksMjM4LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNTUsMjQyLAotICAgIDI0MiwyMjksMjI3LDI0NCwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDUwLDE2MywxMDEsICAzLDEwNywKLSAgICAyMTMsMTA3LDIyNSwxMDcsMjQyLDIyNSwyNDIsMjQ0LDIzMiwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsCi0gICAgIDQ3LDIzOCwyNDQsMjI5LDI0MiwyNDAsMjQyLDIzMywyNDMsMjI5LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LAotICAgICA1MCwgNjEsMjQ4LDIyNywyMjksMjM2LDIzNiwyMjksMjM4LDI0NCwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwKLSAgICAxMjgsIDUwLDE1NywxMDIsICAyLDEwOCwgIDksMTA4LCAyNCwyMjksMjQzLDI0NCwyMzMsMjQ2LDIyNSwyMzYsCi0gICAgMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCA2NCwxMDUsICAyLDEwOCwgMzAsMTA4LCA1OSwyMzgsMjI1LAotICAgIDIzOCwyMjcsMjMzLDIyNSwxMDgsICAyLDEwOCwgNDIsMTA4LCA1MSwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwKLSAgICAxMjgsIDUwLDE1MCwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDU0LDI0MiwyMjksMjQwLDIyNSwyNDIsCi0gICAgMjI5LDExMCwxMjgsIDUwLCA0MywxMDQsICAyLDEwOCwgNzUsMTA4LCA4NiwyMjUsMjQ2LDIyOSwyNDAsMjI1LAotICAgIDI0MiwyMjksMTEwLDEyOCwgNTAsIDUwLDIzMywyMzEsMjMyLDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwKLSAgICAgNTAsMTY0LDIzMywyNDQsMjI5LDI0MiwyMjUsMjQ0LDIzMywyMzksMjM4LDIzNywyMjUsMjQyLDEwNywxMjgsCi0gICAgIDQ4LCAgNSwxMDgsICAzLDEwOCwxMjIsMTA4LDE0OCwxMDgsMTYwLDIyNSwyMjYsMjM5LDExNCwgIDIsMTA4LAotICAgIDEzMSwxMDgsMTQwLDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgNTAsMTUyLDI0MCwyMjUsMjQyLDIyOSwKLSAgICAxMTAsMTI4LCA1MCwgNTYsMjI5LDIzMCwyNDQsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCA1MCwxNjcsCi0gICAgMjM5LDI0NywyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDUwLDE2NiwxMDksICAyLDEwOCwxNzcsMTA4LAotICAgIDIwOSwxMDEsICAyLDEwOCwxODMsMTA4LDE5OCwyMjgsMjMzLDIyNywyMzMsMjM4LDIyOSwyMjcsMjMzLDI0MiwKLSAgICAyMjcsMjM2LDEwMSwxMjgsIDUwLDE2OSwyNDQsMjI1LDIzNiwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsCi0gICAgIDQ2LDIzOSwyMzksMjM4LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNDIsMjM4LDIyNSwyMzcsMjI5LAotICAgIDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNTIsMTEyLCAgMiwxMDgsMjM4LDEwOCwyNDYsMjI5LDI0MiwKLSAgICAyMzMsMjM5LDEwMCwxMjgsIDQ4LCAgMiwyNDIsMjMzLDIzOCwyNDQsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsCi0gICAgMTI4LCA1MCwxNTgsMTE0LCAgMiwxMDksICA5LDEwOSwgNTcsMTAxLCAgMywxMDksIDE3LDEwOSwgMjgsMTA5LAotICAgICA0MywyMjUsMjI3LDIzMiwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDY3LDI0MCwyNDIsMjI5LDI0MywKLSAgICAyMjksMjM4LDI0NCwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDU3LDI0MywyMzksMjQ1LDI0MiwyMjcsCi0gICAgMjI5LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNjIsMjMzLDIzMSwyMzIsMjQ0LDIyNywyMzMsMjQyLAotICAgIDIyNywyMzYsMTAxLDEyOCwgNTAsMTY4LDExNSwgIDUsMTA5LCA4MiwxMDksMTExLDEwOSwxMjUsMTA5LDE1MCwKLSAgICAxMDksMTc4LDEwMSwgIDIsMTA5LCA4OCwxMDksMTAxLDIyNywyNDIsMjI5LDI0NCwyMjcsMjMzLDI0MiwyMjcsCi0gICAgMjM2LDEwMSwxMjgsIDUwLDE1MywyMzYsMjMwLDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNjYsMjM5LAotICAgIDIyNywyMzMsMjI5LDI0NCwyNDksMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCA1MSwxMTIsICAyLDEwOSwKLSAgICAxMzEsMTA5LDEzNywyMjUsMjI3LDEwMSwxMjgsIDQ4LCAgMCwyMjksMjI3LDIzMywyMjUsMjM2LDI0MCwyMjUsCi0gICAgMjQyLDIyOSwxMTAsMTI4LCA1MCwgNTMsMTE2LCAgMiwxMDksMTU2LDEwOSwxNjcsMjM5LDIyNywyMzUsMjQwLAotICAgIDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCA0OSwyNDUsMjI4LDI0OSwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwKLSAgICAgNTAsIDU5LDExNywgIDIsMTA5LDE4NCwxMDksMTkzLDIzOCwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsCi0gICAgIDQ4LDI0MCwyMjksMjQyLDI0NiwyMzMsMjQzLDIyOSwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDYwLAotICAgIDExOSwgIDIsMTA5LDIxNCwxMDksMjI2LDIyNSwyNDQsMjI5LDI0MiwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwKLSAgICAgNTAsIDQ0LDIzOSwyMzksMjI4LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNDUsMjUwLDIyOSwyNDIsCi0gICAgMTExLDEyOCwgNDgsICA3LDEwOSwgIDIsMTA5LDI1MCwxMTAsICA3LDIyOSwyNDQsMjI1LDIzNiwyMjcsMjMzLAotICAgIDI0MiwyMjcsMjM2LDEwMSwxMjgsIDUwLDE0MiwyMzksMjM5LDIzOCwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwKLSAgICAxMjgsIDUwLDEzOCwyMzgsMjI1LDIzNywyMjksMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCA1MCwxNDgsCi0gICAgMjQzLDI0NSwyMzgsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCA1MCwxNDQsMTE5LCAgMiwxMTAsIDUwLAotICAgIDExMCwgNjMsMjI1LDI0NCwyMjksMjQyLDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgNTAsMTQwLDIzOSwKLSAgICAyMzksMjI4LDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgNTAsMTQxLDI0NiwgOTcsMTI4LCAgOSwgIDcsCi0gICAgMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEzMCwgIDAsMjM5LDExMCwgOTQsMTEwLDEwMiwyMjUsMjI3LAotICAgIDI0NSwyNDQsMTAxLDEyOCwgMzAsIDQ3LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKLSAgICAyMjksMjM5LDI0NCwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMjAzLDEwMSwgIDMsMTEwLDEzMSwxMTAsCi0gICAgMTQ3LDExMCwxNTgsMjI2LDI0MiwyMjksMjQ2LDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LAotICAgIDEyOCwgIDQsMjE1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNTMsMjQ1LDIzOCwKLSAgICAxMDMsICA0LDExMCwxNzAsMTEwLDIwNSwxMTAsMjIwLDExMCwyMjksIDk3LCAgMiwxMTAsMTc2LDExMCwxOTEsCi0gICAgMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMTcsMjQwLAotICAgIDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAyMSwyMjcsMjMzLDI0MiwKLSAgICAyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLDEwMywyMzUsMjM5LDI0MiwyMjksCi0gICAgMjI1LDExMCwxMjgsIDQ5LCA3MSwyNDAsMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLAotICAgIDEyOCwgNTAsICA3LDEwMywgIDIsMTEwLDI0OSwxMTEsICAwLDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAwLDIzNiwKLSAgICAxMTcsICAyLDExMSwgIDYsMTExLCAxNSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDEzNSwyNDIsCi0gICAgMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAgNywxMDQsICAyLDExMSwgMzAsMTExLCA0MCwyMzMsMjQyLAotICAgIDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgNjgsMjM5LDIzOSwyMzUsMjI1LDIyNiwyMzksMjQ2LDEwMSwKLSAgICAxMjgsIDMwLDIwMSwxMDUsICA4LDExMSwgNjksMTExLCA3OSwxMTEsIDkwLDExMSwgOTcsMTExLDEyMiwxMTEsCi0gICAgMTM4LDExMSwxNTMsMTExLDE2OSwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxMzYsMjI3LAotICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA1NiwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwKLSAgICAgIDgsMjMxLDExNywgIDIsMTExLDEwNCwxMTEsMTEzLDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsCi0gICAgMTM2LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsICA4LDIzNywyMjUsMjQ0LDI0MiwyMjUsMjMxLAotICAgIDI0NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA2NCwyMzgsMjQ2LDIyOSwyNDIsMjQ0LDIyOSwKLSAgICAyMjgsMjI2LDI0MiwyMjksMjQ2LDEwMSwxMjgsICAyLCAxMSwyNDMsMjMyLDIzOSwyNDIsMjQ0LDIyNywyNDksCi0gICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNTcsMjQ2LDIzOSwyNDcsMjI5LDIzNiwyNDMsMjMzLAotICAgIDIzMSwxMTAsICAzLDExMSwxODUsMTExLDE5NSwxMTEsMjAyLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwKLSAgICAxMjgsICA5LDE5MiwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNjQsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsCi0gICAgMjQ0LDEwNSwxMjgsIDEwLDE5MiwxMDYsMTI4LCAgMSwgNTEsMTA3LCAgMiwxMTEsMjIzLDExMSwyNDcsMjI1LAotICAgIDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMTY0LDExMSwyMzUsMjMyLDIyNSwyMzYsMjMwLDI0NywKLSAgICAyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMTQsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA5OSwxMDgsCi0gICAgICAyLDExMiwgIDUsMTEyLCAxMCwyMjgsMTAxLDEyOCwgIDIsMjIwLDI0NSwyNDksMjMyLDIyOSwyMjYsMjQyLAotICAgIDIyOSwxMTksMTI4LCAgNSwxNzIsMTA5LCAgMiwxMTIsIDI3LDExMiwgOTQsIDk3LCAgMywxMTIsIDM1LDExMiwKLSAgICAgNTUsMTEyLCA4MCwyMjcsMjQyLDIzOSwxMTAsMTI5LCAgMSwgNDMsMTEyLCA0NCwyMjcsMjQ5LDI0MiwyMzMsCi0gICAgMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjI3LDIzMSwyMjksMjM5LDI0MiwyMjUsMjQwLDI0MCwyNDIsMjM5LAotICAgIDI0OCwyMzMsMjM3LDIyNSwyNDQsMjI5LDIzNiwyNDksMjI5LDI0MSwyNDUsMjI1LDEwOCwxMjgsIDM0LCA4MywKLSAgICAyNDQsMjQyLDIyNSwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDYzLDIzOSwyMzgsCi0gICAgMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNzMsMTEwLCAgNSwxMTIsMTE3LDExMiwxMjcsMTEyLAotICAgIDEzNiwxMTIsMTQ4LDExMiwyMzIsMjI3LDI0MiwyMjksMjM3LDIyOSwyMzgsMTE2LDEyOCwgMzQsICA2LDIzMCwKLSAgICAyMzMsMjM4LDIzMywyNDQsMTIxLDEyOCwgMzQsIDMwLDIzMywyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsCi0gICAgMTEwLDEyOCwgIDUsMTA3LDExNiwgIDIsMTEyLDE1NCwxMTIsMjIyLDEwMSwgIDIsMTEyLDE2MCwxMTIsMjExLAotICAgIDIzMSwyNDIsMjI1LDEwOCwxMzEsIDM0LCA0MywxMTIsMTczLDExMiwxOTEsMTEyLDE5NiwgOTgsICAyLDExMiwKLSAgICAxNzksMTEyLDE4NywyMzksMjQ0LDI0NCwyMzksMTA5LDEyOCwgMzUsIDMzLDExNiwxMjgsIDM1LCAzMywyMjksCi0gICAgMTIwLDEyOCwyNDgsMjQ1LDExNiwgIDIsMTEyLDIwMiwxMTIsMjA3LDIzOSwxMTIsMTI4LCAzNSwgMzIsMTEyLAotICAgIDEyOCwgMzUsIDMyLDI0MiwyNDMsMjI5LDIyNywyNDQsMjMzLDIzOSwxMTAsMTI4LCAzNCwgNDEsMjMzLDI0MywKLSAgICAyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsICA1LDExOCwgIDMsMTEyLDI0MCwxMTIsMjQ5LDExMywgIDIsCi0gICAgMjI2LDI0NSwyMzYsMjM2LDIyOSwxMTYsMTI4LCAzNywyMTYsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LAotICAgICAzNywyMTcsMjQzLDIzNywyMzMsMjM2LDIyOSwyMzAsMjI1LDIyNywxMDEsMTI4LCAzOCwgNTksMTExLCAgMywKLSAgICAxMTMsIDIyLDExMywgMzMsMTEzLCA0MSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCi0gICAgIDgxLDIzMSwyMzksMjM4LDIyOSwxMDcsMTI4LCAgMSwgNDcsMjQ0LCA5NywxMzEsICAzLDE4NSwxMTMsIDUyLAotICAgIDExMywgNzMsMTEzLCA4MSwyMjgsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEyOSwgIDMsMjAyLDExMywKLSAgICAgNjUsMjQ0LDIzOSwyMzgsMjM5LDExNSwxMjgsICAzLDE0NCwyMzYsMjI1LDI0NCwyMzMsMTEwLDEyOCwgIDIsCi0gICAgMTA1LDI0NCwyMzksMjM4LDIzOSwxMTUsMTI4LCAgMywxNzUsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LAotICAgIDE2NCwyNDIsMjMzLDIzMSwyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwxMTQsMTE1LCAgNCwKLSAgICAxMTMsMTIwLDExMywxNjUsMTEzLDE3OSwxMTMsMTg3LDIzNywyMjUsMjM2LDEwOCwgIDIsMTEzLDEyOSwxMTMsCi0gICAgMTQwLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgNjcsMjM1LDIyNSwyNDQsMjI1LAotICAgIDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDE2MywxMTMsMTUzLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwKLSAgICAyNDQsMTA0LDEyOCwyNTUsMTA0LDI0MywyMzIsMjI1LDI0MiwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsCi0gICAgMTI4LCAgOSwyNTAsMjQ0LDI0MiwyMzksMjM1LDEwMSwxMjgsICAyLDEwNCwyNDUsMjQwLDIyOSwyNDIsMjMzLAotICAgIDIzOSwxMTQsMTI4LDI0NiwyMzcsMTE2LCAgMiwxMTMsMjAzLDExMywyMzcsMjI5LDI0MiwyMjUsMjQ0LDIzMywKLSAgICAyMzksMTEwLCAgMiwxMTMsMjE1LDExMywyMjYsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsCi0gICAgIDQ4LDE1NywyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMjUzLDIzMywyMzYsMjI4LAotICAgIDEwMSwxMjksICAxLCA0MSwxMTMsMjQ2LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgNDUsMTE3LCAgMiwKLSAgICAxMTQsICA0LDExNCwgMTUsMjI2LDIzOSwyNDAsMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCA0MSwyMjcsCi0gICAgMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDc4LDI0NiwyMzksMjQ3LDIyOSwyMzYsMjQzLAotICAgIDIzMywyMzEsMTEwLCAgMywxMTQsIDQyLDExNCwgNTIsMTE0LCA1OSwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwKLSAgICAxMDUsMTI4LCAgOSwxOTEsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDYzLDIzMSwyNDUsMjM0LDIyNSwyNDIsCi0gICAgMjI1LDI0NCwxMDUsMTI4LCAxMCwxOTEsMjUwLDIzMiwyMzMsMjQ0LDI0MywgOTcsICAyLDExNCwgODEsMTE0LAotICAgICA5MiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTE3LDIyOCwyMjYsMjM2LDIzMSwKLSAgICAyNDIsMjI1LDI0NiwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDExOSwxMDYsCi0gICAgMTM4LCAgMCwxMDYsMTE0LDEzNSwxMTQsMTk4LDExNCwyMDksMTE1LCAgMywxMTUsIDE5LDExNSwxMzIsMTE1LAotICAgIDIwMSwxMTUsMjA2LDExNSwyMTgsMTE1LDIyNiwgOTcsICA0LDExNCwxNDUsMTE0LDE1NiwxMTQsMTY2LDExNCwKLSAgICAxNzMsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDExMywyMjYsMjI5LDIzOCwyMzEsCi0gICAgMjI1LDIzNiwxMDUsMTI4LCAgOSwxNTYsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDI4LDIzMSwxMTcsICAyLAotICAgIDExNCwxODAsMTE0LDE4OSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE1NiwyNDIsMjM3LDI0NSwKLSAgICAyMzUsMjMyLDEwNSwxMjgsIDEwLCAyOCwyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksCi0gICAgIDE2LCA5OSwgIDMsMTE0LDIxNywxMTQsMjI0LDExNCwyNDYsMjI1LDI0MiwyMzksMTEwLDEyOCwgIDEsMjQwLAotICAgIDIzMywyNDIsIDk5LCAgMiwxMTQsMjMyLDExNCwyMzcsMjM2LDEwMSwxMjgsIDM2LDIxNywyNDUsMjM3LDIzMCwKLSAgICAyMzYsMjI5LDEyMCwxMjgsICAxLCA1MywyNDIsMjM5LDI0MywyNDMsMjI5LDIyOCwyNDQsMjI1LDIzMywxMDgsCi0gICAgMTI4LCAgMiwxNTcsMjI4LDIzOSwyNDQsMjM2LDIyOSwyNDMsMjQzLDI0MywyNDQsMjQyLDIzOSwyMzUsMTAxLAotICAgIDEyOCwgIDIsIDk1LDEwMSwgIDMsMTE1LCAyNywxMTUsIDM4LDExNSwxMDMsMjI3LDI0OSwyNDIsMjMzLDIzNiwKLSAgICAyMzYsMjMzLCA5OSwxMjgsICA0LCA4OCwyMjksMTA5LCAgNCwxMTUsIDQ5LDExNSwgNTgsMTE1LCA3MiwxMTUsCi0gICAgIDg4LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDQ0LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LAotICAgIDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxNTgsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwKLSAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTU5LDIzNywyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsCi0gICAgMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTYwLDEwNCwgIDIsMTE1LDEwOSwxMTUsMTE4LDIyNSwyNDIsMjI1LAotICAgIDIyNiwyMzMsIDk5LDEyOCwgIDYsMTUyLDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywKLSAgICAgOTksMTI4LDI1MSwxMzksMTA0LCAgMiwxMTUsMTM4LDExNSwxODgsIDk3LCAgMywxMTUsMTQ2LDExNSwxNTYsCi0gICAgMTE1LDE2MywyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNTcsMjI4LDIyOSwyNDYsIDk3LAotICAgIDEyOCwgIDksIDI5LDIzMSwxMTcsICAyLDExNSwxNzAsMTE1LDE3OSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwKLSAgICAxMjgsIDEwLDE1NywyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAyOSwyMjksMjMyLDIyNSwyNDIsCi0gICAgMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMjMsMjMzLDExNSwxMjgsIDQ4LCAgNCwyMzcsMjM5LAotICAgIDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA3NCwyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwKLSAgICAgMzYsMTY1LDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAgMiwxNzgsMTA3LDE0NiwgIDAsCi0gICAgMTA3LDExNiwgMjEsMTE4LDExMCwxMTgsMTIxLDExOCwxODMsMTE4LDE5NCwxMTksIDI4LDExOSwgNDIsMTIwLAotICAgIDE1MCwxMjEsIDkwLDEyMSwxMDMsMTIxLDEyOSwxMjEsMTc4LDEyMiwgNjAsMTIyLCA4MiwxMjIsIDk1LDEyMiwKLSAgICAxMTgsMTIyLDE2MCwxMjIsMTcwLCA5NywgMTIsMTE2LCA0NywxMTYsIDc5LDExNiwxMDEsMTE2LDEzMSwxMTYsCi0gICAgMjQ1LDExNywgMTQsMTE3LCA0NCwxMTcsIDY5LDExNywxNzUsMTE3LDE4OSwxMTgsIDU2LDExOCwgODUsIDk4LAotICAgICAgMiwxMTYsIDUzLDExNiwgNzAsMjI1LDI0MywyMzIsMjM1LDIzMywyNDIsMjI3LDI0OSwyNDIsMjMzLDIzNiwKLSAgICAyMzYsMjMzLCA5OSwxMjgsICA0LDE2MSwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE0OSwgOTksCi0gICAgICAyLDExNiwgODUsMTE2LCA5MSwyNDUsMjQ0LDEwMSwxMjgsIDMwLCA0OSwyNDksMjQyLDIzMywyMzYsMjM2LAotICAgIDIzMywgOTksMTI4LCAgNCwgNTgsMjI4LDEwMSwgIDIsMTE2LDEwOCwxMTYsMTI2LDI0MywyMjcsMjI5LDIzOCwKLSAgICAyMjgsMjI5LDI0MiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTU1LDI0NiwgOTcsCi0gICAgMTI4LCAgOSwgMjEsMTAyLDEzNSwgIDUsMjE5LDExNiwxNDksMTE2LDE1OCwxMTYsMTc4LDExNiwxOTIsMTE2LAotICAgIDIwMSwxMTYsMjE3LDExNiwyMzIsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNjcsMjI4LDIyNSwKLSAgICAyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwgNTksMTE2LDE2OSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsCi0gICAgMjUxLCA1OSwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjE4LAotICAgIDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjE5LDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwKLSAgICAyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIxOSwyMzcsMjI5LDIyOCwyMzMsMjI1LDIzNiwyMjUsCi0gICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIyMCwyNDIsMjI1LDIzMCwyMjksMjMyLDIyOSwyMjYsMjQyLAotICAgIDIyOSwxMTksMTI4LDI1MSwgNzcsMjMxLDExNywgIDIsMTE2LDI1MiwxMTcsICA1LDIzNCwyMjUsMjQyLDIyNSwKLSAgICAyNDQsMTA1LDEyOCwgMTAsMTQ5LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDIxLDEwNCwgIDIsCi0gICAgMTE3LCAyMCwxMTcsIDMwLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LCA3NSwyMzksMjM5LAotICAgIDIzNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTk2LDIzNSwyMjUsMjQ0LDIyNSwKLSAgICAyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwxNzEsMTE3LCA1NywyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsCi0gICAgMjQ0LDEwNCwxMjgsMjU1LDExOCwxMTIsICAyLDExNywgNzUsMTE3LCA5NiwyNDAsIDk3LDEyOSwgIDMsMTg2LAotICAgIDExNywgODIsMjQzLDI0OSwyMzcsMjI2LDIzOSwyMzYsMjMxLDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDI0MCwKLSAgICAyNDksMjI5LDIzOSwyNDUsMTEwLCAgMywxMTcsMTA4LDExNywxMjIsMTE3LDE1NiwyMzcsMjMzLDIyOSwyNDUsCi0gICAgMjM3LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTEzLDExMiwgIDIsMTE3LDEyOCwxMTcsMTQzLAotICAgIDIzMiwyMzMsMjI5LDI0NSwyNDAsMjMyLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTMyLDIzMywKLSAgICAyMjksMjQ1LDI0MCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDEyMCwyNDMsMjQzLDIyNSwyMzgsCi0gICAgMjMxLDI0MCwyMzMsMjI5LDI0NSwyNDAsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMjEsMjQyLAotICAgIDIzOSwyNDIsMjMzLDIzMywyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCAxMywxMTUsICA1LDExNywKLSAgICAyMDEsMTE3LDI0NSwxMTgsICA0LDExOCwgMTIsMTE4LCA0MCwyMzIsMjMzLDIyOCwyMjUsMjI1LDI0NSwyNDQsCi0gICAgMTExLCAgMiwxMTcsMjE0LDExNywyMjMsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNjQsMjM4LAotICAgIDIzOSwyNDMsMjMzLDIyOCwyMjksMjI2LDIyOSwyMjUsMjQyLDIzMywyMzgsMjMxLDIyNSwyNDIsMjI1LDIyNiwKLSAgICAyMzMsIDk5LDEyOCwgIDYsIDY0LDIzNywyMjUsMjM2LDIzNiwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsCi0gICAgIDk3LDEyOCwgNDgsMjQ1LDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxMzIsMjQyLCA5NywgIDIsMTE4LAotICAgICAxOSwxMTgsIDI4LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDgwLDI0NCwyMjUsMjM4LDIyNSwKLSAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDc3LDI0NCwyNDIsMjM5LDIzNSwyMjksMjI3LDI0OSwyNDIsCi0gICAgMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE1OSwyNDQsMjI1LDIzMiwyMzMsMjQyLDIyNSwyNDAsMjQyLAotICAgIDIzOSwyMzYsMjM5LDIzOCwyMzEsMjM3LDIyNSwyNDIsMjM1LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwKLSAgICAyNDQsMTA0LDEyOCwyNTUsMTEyLDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwyMzYsMjQzLDI0NCwyNDIsCi0gICAgMjM5LDIzNSwyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE1NywyMjYsMjM5LAotICAgIDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDE0LCA5OSwgIDQsMTE4LDEzMSwxMTgsMTUzLDExOCwKLSAgICAxNjIsMTE4LDE3MCwgOTcsICAyLDExOCwxMzcsMTE4LDE0NywyMzYsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsCi0gICAgMTI4LCA1MSwxMzcsMjQyLDIzOSwxMTAsMTI4LCAgMSwyMzMsMjI5LDIyOCwyMzMsMjM2LDIzNiwgOTcsMTI4LAotICAgICAgMSwgNTUsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM2LDIxOCwyMzksMjM3LDIzNywyMjUsMjI1LDIyNywKLSAgICAyMjcsMjI5LDIzOCwxMTYsMTI4LCAgMSwgNTUsMjI4LDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsCi0gICAgIDMwLCA1MSwxMDEsICA0LDExOCwyMDQsMTE4LDIzMSwxMTksICAwLDExOSwgMTIsMTA0LCAgMiwxMTgsMjEwLAotICAgIDExOCwyMjEsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDEzMiwyMzMsMjQyLDIyNSwKLSAgICAyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgODEsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksCi0gICAgIDQ4LDE3NywxMTgsMjQ0LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTIxLAotICAgIDIzOCwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsMTExLDI0MywyMzcsMjI1LDIzNiwKLSAgICAyMzYsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDI0NiwyMzEsMjQyLDIyOSwyMjksCi0gICAgMjM4LDIzNiwyMjUsMjM4LDIyOCwyMzMsIDk5LDEyOCwgIDEsIDU2LDEwNCwgIDYsMTE5LCA1NiwxMTksMTg1LAotICAgIDExOSwxOTYsMTE5LDIyMSwxMjAsIDUyLDEyMCwxNDAsIDk3LCAgNSwxMTksIDY4LDExOSwgNzgsMTE5LCA4OSwKLSAgICAxMTksIDk2LDExOSwxMjEsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTUwLDIyNywyNDksCi0gICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNjksMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDIyLAotICAgIDIzMSwxMTcsICAyLDExOSwxMDMsMTE5LDExMiwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE1MCwKLSAgICAyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAyMiwxMDQsICA0LDExOSwxMzEsMTE5LDE0MCwxMTksCi0gICAgMTU0LDExOSwxNzAsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNDYsMjMwLDIzMywyMzgsMjI1LAotICAgIDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE2NiwyMzMsMjM4LDIzMywyNDQsMjMzLDIyNSwKLSAgICAyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxNjcsMjM3LDIyOSwyMjgsMjMzLDIyNSwyMzYsCi0gICAgMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxNjgsMjI5LDIzMywyMjcsMjM5LDI0MCwyNDQsMjMzLAotICAgICA5OSwxMjgsICAzLDIzMSwyMzIsIDk3LCAgMiwxMTksMjAzLDExOSwyMTAsMjI4LDIyOSwyNDYsIDk3LDEyOCwKLSAgICAgIDksIDg5LDIzMSwyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgODksMjMzLDIyOSwyNDUsCi0gICAgMjM1LDEwNCwgIDQsMTE5LDIzNSwxMjAsIDE0LDEyMCwgMjksMTIwLCAzOCwgOTcsICAyLDExOSwyNDEsMTIwLAotICAgICAgMCwyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLDEyMCwKLSAgICAyNDAsMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsIDI0LDIyNywyMzMsCi0gICAgMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsMTA2LDIzNSwyMzksMjQyLAotICAgIDIyOSwyMjUsMTEwLDEyOCwgNDksIDc1LDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwKLSAgICAxMTAsMTI4LCA1MCwgMTAsMTExLCAgNCwxMjAsIDYyLDEyMCwxMTEsMTIwLDEyMSwxMjAsMTI2LDIzNSwxMDQsCi0gICAgICA0LDEyMCwgNzMsMTIwLCA4MiwxMjAsIDkxLDEyMCwxMDEsMjI1LDIzMywyNDQsMjMyLDIyNSwxMDUsMTI4LAotICAgICAxNCwgIDIsMjM5LDIzOCwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgIDUsMjQ1LDIyNSwyNDQsMjQ0LDIzMiwKLSAgICAyMjUsMTA1LDEyOCwgMTQsICAzLDI0NywyMjUsMjMzLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAgNCwyMzcsCi0gICAgMjQ1LDI0NCwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgOTEsMjM5LDEwNywxMjgsICAxLDE1MywyNDIsMjI1LAotICAgIDIzNSwyMzIsMjI1LDIzOCwyMzEsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsICA2LDI1MCwyNDMsMjQxLDI0NSwKLSAgICAyMjUsMjQyLDEwMSwxMjgsIDUxLDE0NSwxMDUsICA0LDEyMCwxNjAsMTIwLDE3MSwxMjAsMTk2LDEyMCwyNDUsCi0gICAgMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LCA3NywyMzUsMjI1LDI0NCwyMjUsMjM1LAotICAgIDIyNSwyMzgsIDk3LDEyOSwgNDgsMTczLDEyMCwxODQsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwKLSAgICAxMDQsMTI4LDI1NSwxMTksMjQyLDExMSwgIDMsMTIwLDIwNSwxMjAsMjIwLDEyMCwyMzYsMjMxLDI0NSwyNDIsCi0gICAgMjI1LDIzNywyNDUsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgMjEsMjM3LDIyOSwyMjksMjQ0LAotICAgIDIzOSwyNDIsMjQ1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDIyLDI0MywyNDEsMjQ1LDIyNSwKLSAgICAyNDIsMTAxLDEyOCwgNTEsIDIwLDI0OSwyMjksMjM5LDEwNywgIDUsMTIxLCAgNCwxMjEsIDM5LDEyMSwgNTQsCi0gICAgMTIxLCA2MywxMjEsIDc3LCA5NywgIDIsMTIxLCAxMCwxMjEsIDI1LDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LAotICAgIDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsMTEwLDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwKLSAgICAyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgMTQsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsCi0gICAgMjI5LDIyNSwxMTAsMTI4LCA1MCwgOTYsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNDksMjQwLAotICAgIDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAgMCwyNDMsMjMzLDIzOSwKLSAgICAyNDMsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNTEsMjM0LDIyOSwyMjcsMjQ5LDI0MiwyMzMsCi0gICAgMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDkyLDEwOCwgIDIsMTIxLDEwOSwxMjEsMTIwLDIzMywyMzgsMjI5LAotICAgIDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwgNTMsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwKLSAgICAxNTIsMTA5LCAgMywxMjEsMTM3LDEyMSwxNTEsMTIxLDE2MiwyMjcsMjQ1LDIyNiwyMjksMjI4LDI0MywyNDEsCi0gICAgMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTY2LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LAotICAgIDI1NSwgNzUsMjQzLDI0MSwyNDUsMjI1LDI0MiwyMjksMjI4LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwKLSAgICAgNTEsMTYyLDExMSwgIDUsMTIxLDE5MCwxMjEsMjE2LDEyMSwyNTQsMTIyLCAxMCwxMjIsIDI0LDEwNCwgIDIsCi0gICAgMTIxLDE5NiwxMjEsMjA2LDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LCA4MywyMzcsMjQzLAotICAgIDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxOTIsMjM1LCA5NywgIDIsMTIxLDIyMywxMjEsMjMxLDIzMywKLSAgICAyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgIDEsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwxNzksCi0gICAgMTIxLDI0MiwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEyMiwyMzksMjQwLAotICAgIDIzOSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCAzMCwyNDAsMjQwLDIyNSwyMjcsMjQ5LDI0MiwKLSAgICAyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTI5LDExNCwgIDIsMTIyLCAzMCwxMjIsIDUwLDIyOSwyMjUsCi0gICAgMjM4LDI0MywyNDQsMjI1LDIzOCwyMjgsMjI1LDI0MiwyMjgsMjQzLDI0OSwyMzcsMjI2LDIzOSwxMDgsMTI4LAotICAgICA1MCwxMjcsMjM5LDIzOCwyMzMsMjQzLDIyNywyMzcsIDk4LDEyOCwgIDMsIDY3LDI0MCwgOTcsICAyLDEyMiwKLSAgICAgNjcsMTIyLCA3MywyNDIsMjI5LDExMCwxMjgsIDM2LDE2NiwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsCi0gICAgIDUxLDE3MCwyNDMsMjMzLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMTEsMTE2LAotICAgICAgMiwxMjIsMTAxLDEyMiwxMTAsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwyMDcsMjQ1LDI0MiwKLSAgICAyMzgsMjI5LDEwMCwxMjgsICAyLDE1OCwxMTcsICAyLDEyMiwxMjQsMTIyLDEzNSwyMzIsMjMzLDI0MiwyMjUsCi0gICAgMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDc5LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LAotICAgICA0OCwxNzUsMTIyLDE0OCwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEyMCwKLSAgICAyNDYsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxODQsMjQ3LDI0MywyNDEsMjQ1LDIyNSwyNDIsCi0gICAgMTAxLDEyOCwgNTEsMTkwLDEwOCwxNDYsICAwLDEwOCwxMjIsMjIwLDEyNCwyNDcsMTI1LCAyMCwxMjUsIDg2LAotICAgIDEyNSwxMjQsMTI2LCAyMCwxMjYsIDI5LDEyNiwgNDUsMTI2LCA2OSwxMjYsIDg3LDEyNiwyMDUsMTI2LDI0NiwKLSAgICAxMjcsMTI1LDEyNywxMzMsMTI3LDE2NiwxMjcsMTc1LDEyNywxODMsMTI3LDI0NSwgOTcsICA3LDEyMiwyMzYsCi0gICAgMTIyLDI0NiwxMjIsMjUzLDEyMywgIDQsMTIzLCAyOSwxMjMsIDQ1LDEyNCwyMzUsMjI2LDIyOSwyMzgsMjMxLAotICAgIDIyNSwyMzYsMTA1LDEyOCwgIDksMTc4LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLCA1OCwyMjgsMjI5LDI0NiwKLSAgICAgOTcsMTI4LCAgOSwgNTAsMjMxLDExNywgIDIsMTIzLCAxMSwxMjMsIDIwLDIzNCwyMjUsMjQyLDIyNSwyNDQsCi0gICAgMTA1LDEyOCwgMTAsMTc4LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDUwLDIzNSwyMzUsMjMyLAotICAgIDIyNSwyMzgsMjMxLDI0OSwyMjUsMjM5LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA2OSwxMDksIDEwLDEyMywKLSAgICAgNjcsMTI0LCAgNiwxMjQsIDIzLDEyNCwgNjEsMTI0LCA3NSwxMjQsIDk0LDEyNCwxMTAsMTI0LDEzMCwxMjQsCi0gICAgMTUwLDEyNCwxNzMsIDk3LCAgMiwxMjMsIDczLDEyMywyNTQsMjM2LDIyOSwxMDIsICA0LDEyMywgODUsMTIzLAotICAgICA5OSwxMjMsMTkxLDEyMywyMDgsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwKLSAgICAxMjgsMjU0LDI1MiwyMzIsMjI1LDIzNywyNTAsIDk3LCAgMiwxMjMsMTA5LDEyMywxNTAsMjI1LDIyNiwyMzksCi0gICAgMjQ2LDEwMSwgIDIsMTIzLDExOSwxMjMsMTMzLDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LAotICAgIDIzMywgOTksMTI4LDI1NCwyNDgsMjMzLDI0MywyMzksMjM2LDIyNSwyNDQsMjI5LDIyOCwyMjUsMjQyLDIyNSwKLSAgICAyMjYsMjMzLCA5OSwxMjgsMjU0LDI0NywyMjYsMjI5LDIzNiwyMzksMTE5LCAgMiwxMjMsMTYwLDEyMywxNzQsCi0gICAgMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDI1MCwyMzMsMjQzLAotICAgIDIzOSwyMzYsMjI1LDI0NCwyMjksMjI4LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjQ5LDIzMywKLSAgICAyNDMsMjM5LDIzNiwyMjUsMjQ0LDIyOSwyMjgsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyNTEsCi0gICAgMjM3LDIyNSwyMjgsMjI4LDIyNSwyMjUsMjI2LDIzOSwyNDYsMTAxLCAgMiwxMjMsMjIzLDEyMywyMzcsMjMwLAotICAgIDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDI0NiwyMzMsMjQzLDIzOSwKLSAgICAyMzYsMjI1LDI0NCwyMjksMjI4LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjQ1LDI0MiwyMjUsCi0gICAgMjI2LDIzMywgOTksMTI4LCAgNiwgNjgsMjI2LDIyOCwgOTcsMTI5LCAgMywxODcsMTI0LCAxNCwyNDMsMjQ0LAotICAgIDI0MiwyMzksMjM1LDEwMSwxMjgsICAxLDE1NSwyMjksMTAwLDEzMCwgIDUsMjIwLDEyNCwgMzIsMTI0LCA1MiwKLSAgICAyMjgsMjI1LDIzMSwyMjksMjQzLDEwNCwxMjksMjUxLCA2MCwxMjQsIDQzLDIzMiwyMjksMjI2LDI0MiwyMjksCi0gICAgMTE5LDEyOCwyNTEsIDYwLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjIwLDIzMCwyMzMsMjM4LAotICAgIDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMjIsMjMyLDIyNSwyMzIsMjMzLDIzOCwKLSAgICAyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsMjAyLDIzMywyMzgsCi0gICAgMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDIyMywyMzQsMjI5LAotICAgIDIyOSwyMzcsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwKLSAgICAyNTIsMjAxLDIzNSwyMzIsMjI1LDIzMiwyMzMsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsCi0gICAgMjI2LDIzMywgOTksMTI4LDI1MiwyMDMsMjM2LDIyNSwyMzcsMjMyLDIyOSwyMzIsMjMzLDI0MywyMzksMjM2LAotICAgIDIyNSwyNDQsMjI5LDIyOCwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUzLDI0MiwyMzcsMTAxLCAgMiwKLSAgICAxMjQsMTgwLDEyNCwxOTMsMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsCi0gICAgMjI0LDIyOSwxMDksICAyLDEyNCwyMDAsMTI0LDIxOSwyMzIsMjI1LDIzMiwyMzMsMjM4LDIzMywyNDQsMjMzLAotICAgIDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MywxMzYsMjMzLDIzOCwyMzMsMjQ0LDIzMywKLSAgICAyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsMjA0LDI0MiwyMzEsMjI5LDIyNywyMzMsCi0gICAgMjQyLDIyNywyMzYsMTAxLDEyOCwgMzcsMjM5LCA5OCwgIDMsMTI0LDI1NSwxMjUsICA0LDEyNSwgMTAsMjI1LAotICAgIDExNCwxMjgsICAxLDE1NCwyMjksMjM2LDExNiwxMjgsICAyLDEwOCwyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwKLSAgICAxMTEsMTI4LCA0OSwgMTIsIDk5LCAgNCwxMjUsIDMwLDEyNSwgMzcsMTI1LCA0NiwxMjUsIDczLDIyNSwyNDIsCi0gICAgMjM5LDExMCwxMjgsICAxLCA2MiwyMjksMjI4LDIzMywyMzYsMjM2LCA5NywxMjgsICAxLCA2MCwyMzMsMjQyLAotICAgICA5OSwgIDIsMTI1LCA1NCwxMjUsIDU5LDIzNiwxMDEsMTI4LCAzNiwyMTksMjQ1LDIzNywyMzAsMjM2LDIyOSwKLSAgICAyNDgsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCA2MSwyMzksMjM3LDIzNywyMjUsMjI1LDIyNywyMjcsCi0gICAgMjI5LDIzOCwxMTYsMTI4LCAgMSwgNjAsMjI4LDIzOSwxMTYsMTMwLCAgMSwgNjQsMTI1LCA5NiwxMjUsMTA1LAotICAgIDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgIDEsIDY0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI5LCAzMCwKLSAgICAgNTUsMTI1LDExNSwyMzcsMjI1LDIyNywyNDIsMjM5LDExMCwxMjgsIDMwLCA1NywxMDEsICAzLDEyNSwxMzIsCi0gICAgMTI1LDE3MCwxMjYsIDE1LDIzMCwxMTYsICAyLDEyNSwxMzksMTI1LDE1NSwyMjUsMjM4LDIzMSwyMzYsMjI5LAotICAgIDIyNSwyMjYsMjM5LDI0NiwyMjksMjI3LDIzNywgOTgsMTI4LCAgMywgMjYsMjQ0LDIyNSwyMjcsMjM1LDIyNiwKLSAgICAyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgMjQsMjQzLDExNSwxMzIsICAwLCA2MCwxMjUsCi0gICAgMTgzLDEyNSwyMDUsMTI1LDIxNywxMjYsICA3LDIyOSwyNDEsMjQ1LDIyNSwxMDgsMTI5LCAzNCwxMDAsMTI1LAotICAgIDE5MywyMzksMjQyLDIzMSwyNDIsMjI5LDIyNSwyNDQsMjI5LDExNCwxMjgsIDM0LDIxOCwyMzcsMjM5LDIzOCwKLSAgICAyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAyOCwxMTEsICAyLDEyNSwyMjMsMTI1LDI1MiwxMTQsCi0gICAgICAyLDEyNSwyMjksMTI1LDI0MiwyMjksMjQxLDI0NSwyMzMsMjQ2LDIyNSwyMzYsMjI5LDIzOCwxMTYsMTI4LAotICAgICAzNCwxMTQsMjMxLDI0MiwyMjksMjI1LDI0NCwyMjksMTE0LDEyOCwgMzQsMTE4LDI0NiwyMjksMjQyLDIyOSwKLSAgICAyNDEsMjQ1LDIyNSwxMDgsMTI4LCAzNCwxMDIsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjU0LDEwMCwyNTAsCi0gICAgMTA0LDEyOCwgIDIsMTEwLDIzMCwyMjYsMjM2LDIzOSwyMjcsMTA3LDEyOCwgMzcsMTQwLDIzMiwyMzksMjM5LAotICAgIDIzNSwyNDIsMjI5LDI0NCwyNDIsMjM5LDIzMCwyMzYsMjI5LDEyMCwxMjgsICAyLDEwOSwxMDUsICAyLDEyNiwKLSAgICAgNTEsMTI2LCA1NiwyNDIsIDk3LDEyOCwgMzIsMTY0LDI0NywyMzgsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsCi0gICAgMjI1LDExMCwxMjgsICA1LDEwOCwxMDYsMTI5LCAgMSwyMDEsMTI2LCA3NSwyMjksMjI3LDI0OSwyNDIsMjMzLAotICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA4OSwxMDgsMTMyLDI0NiwxOTIsMTI2LCA5OSwxMjYsMTIzLDEyNiwKLSAgICAxMzQsMTI2LDE0MywgOTcsICAyLDEyNiwxMDUsMTI2LDExMiwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNTEsCi0gICAgMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE3OSwyMzMsMjM4LDIyOSwyMjYsMjI5LAotICAgIDIzNiwyMzksMTE5LDEyOCwgMzAsIDU5LDIzNiwyMjUsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDUyLDI0NiwKLSAgICAyMzksMjI3LDIyNSwyMzYsMjMzLCA5OSwgIDMsMTI2LDE1NywxMjYsMTY3LDEyNiwxNzQsMjI2LDIyOSwyMzgsCi0gICAgMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjI1LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA5NywyNDYsMjM5LAotICAgIDI0NywyMjksMjM2LDI0MywyMzMsMjMxLDExMCwgIDIsMTI2LDE4OCwxMjYsMTk4LDIyNiwyMjksMjM4LDIzMSwKLSAgICAyMjUsMjM2LDEwNSwxMjgsICA5LDIyNywyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgOTksMTA5LCAgMywxMjYsCi0gICAgMjEzLDEyNiwyMjYsMTI2LDIzNywyMzMsMjI4LDIyOCwyMzYsMjI5LDI0NCwyMzMsMjM2LDIyOCwxMDEsMTI4LAotICAgICAgMiwxMDcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA3NiwyNDMsMjQxLDI0NSwKLSAgICAyMjUsMjQyLDEwMSwxMjgsIDUxLDIwOCwxMTEsICA2LDEyNywgIDQsMTI3LCAxNiwxMjcsIDU4LDEyNywgNjksCi0gICAgMTI3LCA3NSwxMjcsMTE3LDIyNywyMzIsMjQ1LDIzNiwyMjUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDQ0LAotICAgIDIzMSwyMzMsMjI3LDIyNSwxMDgsICAzLDEyNywgMjgsMTI3LCAzNCwxMjcsIDUzLDIyNSwyMzgsMTAwLDEyOCwKLSAgICAgMzQsIDM5LDIzOCwyMzksMTE2LDEyOSwgIDAsMTcyLDEyNywgNDIsMjQyLDIyOSwyNDYsMjI5LDI0MiwyNDMsCi0gICAgMjI5LDEwMCwxMjgsIDM1LCAxNiwyMzksMTE0LDEyOCwgMzQsIDQwLDIzNiwyMzMsMjM4LDIzMSwyNDQsMjMyLAotICAgIDIyNSwxMDUsMTI4LCAxNCwgMzcsMjM4LDIzMSwxMTUsMTI4LCAgMSwxMjcsMjQ3LDIzNiwyMzMsMjM4LDEwMSwKLSAgICAgIDIsMTI3LCA4NSwxMjcsMTA4LCA5OSwgIDIsMTI3LCA5MSwxMjcsMTAzLDIyOSwyMzgsMjQ0LDIyOSwyNDIsCi0gICAgMjM2LDIzMywyMzgsMTAxLDEyOCwyNTQsIDc4LDIzNywgOTgsMTI4LCAgMywgNTAsMjI4LDIyNSwyNDMsMjMyLAotICAgIDIyOSwxMDAsMTI4LDI1NCwgNzcsMjUwLDIyOSwyMzgsMjMxLDEwMSwxMjgsIDM3LDIwMiwyNDAsMjI1LDI0MiwKLSAgICAyMjksMTEwLDEyOCwgMzYsMTY3LDExNSwgIDMsMTI3LDE0MSwxMjcsMTQ4LDEyNywxNTYsMjM2LDIyNSwyNDMsCi0gICAgMTA0LDEyOCwgIDEsIDY2LDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCAzMywgMTksMjQ1LDI0MCwyMjksMjQyLAotICAgIDIzMywyMzksMTE0LDEyOCwyNDYsMjM4LDI0NCwyNDMsMjMyLDIyNSwyMjgsMTAxLDEyOCwgMzcsMTQ1LDI0NSwKLSAgICAyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgMzgsMjQ2LDIzOSwyMjcsMjI1LDIzNiwyMzMsIDk5LCAgMywxMjcsCi0gICAgMTk3LDEyNywyMDcsMTI3LDIxNCwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNDAsMjI4LAotICAgIDIyOSwyNDYsIDk3LDEyOCwgIDksIDEyLDI0NiwyMzksMjQ3LDIyOSwyMzYsMjQzLDIzMywyMzEsMTEwLCAgMiwKLSAgICAxMjcsMjI4LDEyNywyMzgsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjI2LDIyOCwyMjksCi0gICAgMjQ2LCA5NywxMjgsICA5LCA5OCwyNDgsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwyMTEsMTA5LAotICAgIDE0NCwgIDAsMTA5LDEyOCwgMzUsMTMwLDE0NCwxMzAsMTY5LDEzMCwxOTYsMTMwLDIyMSwxMzIsIDE4LDEzMiwKLSAgICAgNDAsMTMzLCA5NSwxMzMsMTI1LDEzMywxNzQsMTM0LCAyNSwxMzQsIDQ3LDEzNCwgNzIsMTM0LCA4MSwxMzUsCi0gICAgMTA4LDEzNSwxMzYsIDk3LCAxMiwxMjgsIDYxLDEyOCwgNzEsMTI4LDEzNSwxMjgsMTQyLDEyOCwxNjcsMTI4LAotICAgIDIxNSwxMzAsIDUxLDEzMCwgNzYsMTMwLCA4MSwxMzAsIDk1LDEzMCwxMDcsMTMwLDExMiwyMjYsMjI5LDIzOCwKLSAgICAyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNzQsIDk5LCAgMiwxMjgsIDc3LDEyOCwxMjksMjQyLDIzOSwxMTAsCi0gICAgMTMyLCAgMCwxNzUsMTI4LCA5MSwxMjgsMTAyLDEyOCwxMDgsMTI4LDExNywyMjYsMjI5LDIzNiwyMzksMjQ3LAotICAgIDIyNywyMzcsIDk4LDEyOCwgIDMsIDQ5LDIyNywyMzcsIDk4LDEyOCwgIDMsICA0LDIzNiwyMzksMjQ3LDIzNywKLSAgICAyMzksMTAwLDEyOCwgIDIsMjA1LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsCi0gICAgMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsIDYzLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA0NiwyMzEsMTE3LAotICAgICAgMiwxMjgsMTQ5LDEyOCwxNTgsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNzQsMjQyLDIzNywKLSAgICAyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgNDYsMTA0LCAgMiwxMjgsMTczLDEyOCwyMDUsMjI1LDI0MCwyMjUsCi0gICAgMjM1LDEwNCwgIDIsMTI4LDE4MywxMjgsMTkyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTY0LAotICAgIDIzNiwyMjksMjMwLDI0NCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE2NCwyMzMsMjQyLDIyNSwKLSAgICAyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMjYsMTA1LCAgNSwxMjgsMjI3LDEyOSwgNDAsMTI5LDEwMywxMjksCi0gICAgMTMzLDEzMCwgMzksMjI3LDIzMiwyMjUsMjQ0LDI0NCwyMjUsMjQ3LCA5NywgIDMsMTI4LDI0MiwxMjksIDE3LAotICAgIDEyOSwgMjQsMjM2LDIzOSwxMTksICAyLDEyOCwyNTAsMTI5LCAgNSwyMzYsMjI5LDIzMCwyNDQsMjQ0LDIzMiwKLSAgICAyMjUsMTA1LDEyOCwyNDgsMTQ5LDI0MiwyMzMsMjMxLDIzMiwyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwyNDgsCi0gICAgMTQ4LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA3NSwyNDUsMjQwLDI0MCwyMjksMjQyLDIzNiwyMjksMjMwLAotICAgIDI0NCwyNDQsMjMyLDIyNSwxMDUsMTI4LDI0OCwxNDcsMjI5LDEwNywgIDMsMTI5LCA0OSwxMjksIDgwLDEyOSwKLSAgICAgODcsMjM2LDIzOSwxMTksICAyLDEyOSwgNTcsMTI5LCA2OCwyMzYsMjI5LDIzMCwyNDQsMjQ0LDIzMiwyMjUsCi0gICAgMTA1LDEyOCwyNDgsMTQwLDI0MiwyMzMsMjMxLDIzMiwyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwyNDgsMTM5LAotICAgIDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA3MiwyNDUsMjQwLDI0MCwyMjksMjQyLDIzNiwyMjksMjMwLDI0NCwKLSAgICAyNDQsMjMyLDIyNSwxMDUsMTI4LDI0OCwxMzgsMjMyLDIyNSwyMzgsMjI1LDIzNSwyMjUsMTE2LCAgMiwxMjksCi0gICAgMTE1LDEyOSwxMjYsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsMjQ4LDEzMiwyNDQsMjMyLAotICAgIDIyNSwxMDUsMTI4LCAxNCwgNDksMTE2LCAgMywxMjksMTQxLDEyOSwxNjksMTI5LDIzMiwyMjUsMjMzLDIzNSwKLSAgICAyMzIsMTE3LCAgMiwxMjksMTUxLDEyOSwxNjIsMjM2LDIyOSwyMzAsMjQ0LDI0NCwyMzIsMjI1LDEwNSwxMjgsCi0gICAgMjQ4LDEzNywyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNzEsMjMyLDExMSwgIDMsMTI5LDE3OCwxMjksMjA5LAotICAgIDEyOSwyMTYsMjM2LDIzOSwxMTksICAyLDEyOSwxODYsMTI5LDE5NywyMzYsMjI5LDIzMCwyNDQsMjQ0LDIzMiwKLSAgICAyMjUsMTA1LDEyOCwyNDgsMTQzLDI0MiwyMzMsMjMxLDIzMiwyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwyNDgsCi0gICAgMTQyLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA3MywyNDUsMjQwLDI0MCwyMjksMjQyLDIzNiwyMjksMjMwLAotICAgIDI0NCwyNDQsMjMyLDIyNSwxMDUsMTI4LDI0OCwxNDEsMjQyLDEwNSwgIDMsMTI5LDI0MSwxMzAsIDE2LDEzMCwKLSAgICAgMjMsMjM2LDIzOSwxMTksICAyLDEyOSwyNDksMTMwLCAgNCwyMzYsMjI5LDIzMCwyNDQsMjQ0LDIzMiwyMjUsCi0gICAgMTA1LDEyOCwyNDgsMTQ2LDI0MiwyMzMsMjMxLDIzMiwyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwyNDgsMTQ1LAotICAgIDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA3NCwyNDUsMjQwLDI0MCwyMjksMjQyLDIzNiwyMjksMjMwLDI0NCwKLSAgICAyNDQsMjMyLDIyNSwxMDUsMTI4LDI0OCwxNDQsMjQ5LDIyNSwyMzcsMjM5LDIzNSwyNDQsMjMyLDIyNSwxMDUsCi0gICAgMTI4LCAxNCwgNzAsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIyMiwxMzAsIDY0LAotICAgIDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTQzLDIzNiwxMDEsMTI4LCAzOCwKLSAgICAgNjYsMjM4LDI0MywyNDksMjM5LDIzOCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCA3MSwyNDEsCi0gICAgMjI1LDIzMCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE5MCwyNDIsMTE1LDEyOCwgMzgsIDY2LAotICAgIDExNSwgIDIsMTMwLDExOCwxMzAsMTM2LDIzOSwyNDIsMjI1LDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LDIzMiwKLSAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTc1LDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxMzEsCi0gICAgIDk4LCAgMiwxMzAsMTUwLDEzMCwxNjAsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksICA3LAotICAgIDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMjEyLCA5OSwgIDIsMTMwLDE3NSwxMzAsMTgzLDIzMywKLSAgICAyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwyMjAsMjQ1LDIyNiwyMjksMjI4LDI0MywyNDEsMjQ1LDIyNSwyNDIsCi0gICAgMTAxLDEyOCwgNTEsMTY1LDIyOCwyMzksMTE2LCAgMiwxMzAsMjA0LDEzMCwyMTMsMjI1LDIyNywyMjcsMjI5LAotICAgIDIzOCwxMTYsMTI4LCAzMCwgNjUsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCA2NywxMDEsICA3LDEzMCwKLSAgICAyMzcsMTMxLDEwOCwxMzEsMTE5LDEzMSwxMzQsMTMxLDE1OSwxMzEsMTk2LDEzMSwyMDgsMTAxLCAgMiwxMzAsCi0gICAgMjQzLDEzMSwgOTUsMTA5LCAgNCwxMzAsMjUzLDEzMSwgIDYsMTMxLCAyMCwxMzEsIDM2LDIyNSwyNDIsMjI1LAotICAgIDIyNiwyMzMsIDk5LDEyOCwgIDYsIDY5LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywKLSAgICAgOTksMTI4LDI1NCwyMjYsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwyNTQsMjI3LDIzNywxMDEsICAyLDEzMSwgNDMsMTMxLCA1NiwyMjgsMjMzLDIyNSwyMzYsMjI1LAotICAgIDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMjgsMjI5LDIzNywxMDUsICAyLDEzMSwgNjQsMTMxLCA3OSwKLSAgICAyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLDIwOSwyNDMsCi0gICAgMjM5LDIzNiwyMjUsMjQ0LDIyOSwyMjgsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwgNzIsMjQ0LAotICAgIDIzOSwyNDIsMjQ1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDc3LDIzMiwyMzMsMjQyLDIyNSwKLSAgICAyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMjksMjMzLDI1MCwyMzMsMjI5LDI0MiwyMjUsMjQzLDI0MSwyNDUsCi0gICAgMjI1LDI0MiwxMDEsMTI4LCA1MSwxMjYsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LAotICAgIDIyNSwxMzEsMTQ3LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTQ2LDEwOSwKLSAgICAxMzAsICA1LDIyMiwxMzEsMTY3LDEzMSwxODcsMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwgNjIsCi0gICAgMTMxLDE3OCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA2MiwyMzIsMjI5LDIyNiwyNDIsMjI5LAotICAgIDExOSwxMjgsICA1LDIyMiwyMzgsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDExNiwKLSAgICAyNDIsMjM1LDIzMiwgOTcsICAzLDEzMSwyMTksMTMxLDIyOCwxMzIsICA1LDIzMiwyMjksMjI2LDI0MiwyMjksCi0gICAgMTE5LDEyOCwgIDUsMTY1LDIzNSwyMjksMjMwLDI0NSwyMzYsIDk3LCAgMiwxMzEsMjM5LDEzMSwyNDgsMjMyLAotICAgIDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNjYsMjM2LDIyOSwyMzAsMjQ0LDIzMiwyMjksMjI2LDI0MiwKLSAgICAyMjksMTE5LDEyOCwgIDUsMTY2LDIzNiwyMjksMjMwLDI0NCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsCi0gICAgICA1LDE2NSwxMDQsICAyLDEzMiwgMjQsMTMyLCAzMCwyMzksMjM5LDEwNywxMjgsICAyLDExMywyNTAsMjQzLAotICAgIDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNDYsMTA1LCAgNiwxMzIsIDU0LDEzMiwgOTEsMTMyLDIyOCwKLSAgICAxMzIsMjM5LDEzMywgIDgsMTMzLCA2NSwyMjgsMTAwLCAgMiwxMzIsIDYxLDEzMiwgODYsMjM2LDIyOSwyMjgsCi0gICAgMjM5LDI0NCwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsMjI1LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLAotICAgIDIyOCwyNDQsMTA0LDEyOCwyNTUsMTAxLDIzOSwxMTYsMTI4LCAgMCwxODMsMjI5LDI0NSwxMDksICA1LDEzMiwKLSAgICAxMDUsMTMyLDE0MCwxMzIsMTU1LDEzMiwxNjQsMTMyLDIxNSwgOTcsICAyLDEzMiwxMTEsMTMyLDEyNiwyMjcsCi0gICAgMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLDExNCwyNDAsMjI1LAotICAgIDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsIDE4LDIyNywyMzMsMjQyLDIyNywKLSAgICAyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsMTAwLDIzNSwyMzksMjQyLDIyOSwyMjUsCi0gICAgMTEwLDEyOCwgNDksIDY1LDExMiwgIDIsMTMyLDE3MCwxMzIsMjAyLCA5NywgIDIsMTMyLDE3NiwxMzIsMTkwLAotICAgIDIzOCwyNDMsMjMzLDIzOSwyNDMsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMTIsMjQyLDIyOSwKLSAgICAyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgIDQsMjMzLDIyOSwyNDUsMjQwLDIzNSwyMzksCi0gICAgMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTEwLDI0MywyMzMsMjM5LDI0MywyMzUsMjM5LDI0MiwyMjksMjI1LAotICAgIDExMCwxMjgsIDQ5LDExMSwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTI3LDIzNSwKLSAgICAyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyMjMsMTMyLDI1MiwyMzIsMjI1LDIzNiwyMzAsCi0gICAgMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDE0NCwyMzgsMTE3LCAgMiwxMzMsIDE1LDEzMywgNjAsMTE1LAotICAgIDEzMiwgMzQsIDE4LDEzMywgMjcsMTMzLCAzOCwxMzMsIDQ3LDEzMywgNTMsMjI2LDIyOSwyMzYsMjM5LDI0NywKLSAgICAyMjcsMjM3LCA5OCwxMjgsICAzLCAzMiwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM0LDE1MCwyMzcsCi0gICAgMjM5LDEwMCwxMjgsICAyLDIxNSwyNDAsMjM2LDI0NSwxMTUsMTI4LCAzNCwgMTksMjQ0LDEwMSwxMjgsIDMyLAotICAgICA1MCwyNDIsMTA1LCAgMiwxMzMsIDcyLDEzMywgODYsMjI2LDIyNSwyMjUsMjQyLDI0NSwyNDMsMjQxLDI0NSwKLSAgICAyMjUsMjQyLDEwMSwxMjgsIDUxLCA3NCwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCA3MywxMDgsCi0gICAgICAyLDEzMywxMDEsMTMzLDExNiwyMzksMjM4LDIzMSwyMzYsMjI5LDIzMSwyNDQsMjQ1LDI0MiwyMzgsMjI5LAotICAgIDEwMCwxMjgsICAyLDExMiwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE1MCwxMDksICAzLDEzMywKLSAgICAxMzMsMTMzLDE0NywxMzMsMTU4LDIyNywyNDUsMjI2LDIyOSwyMjgsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsCi0gICAgMTI4LCA1MSwxNjMsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA3NywyNDMsMjQxLAotICAgIDI0NSwyMjUsMjQyLDIyOSwyMjgsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNTksMTExLCAgNSwKLSAgICAxMzMsMTg2LDEzMywyMTIsMTMzLDIzNywxMzMsMjQ3LDEzNCwgIDAsMTA0LCAgMiwxMzMsMTkyLDEzMywyMDIsCi0gICAgMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTMwLDIzNywyNDMsMjQxLDI0NSwyMjUsMjQyLAotICAgIDEwMSwxMjgsIDUxLDE5MywyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjI2LDEzMywKLSAgICAyMjUsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxNDcsMjM2LDI0MywyNDEsCi0gICAgMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMjE0LDIzNywyMjUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDMzLAotICAgIDI0NiwyMjksMjQyLDI0MywyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjksIDUxLDE2NywxMzQsIDE1LDIyOCwKLSAgICAyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE2OCwyNDAsIDk3LCAgMiwxMzQsIDMyLDEzNCwgMzgsCi0gICAgMjQyLDIyOSwxMTAsMTI4LCAzNiwxNjgsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNzEsMTE1LAotICAgICAgMiwxMzQsIDUzLDEzNCwgNjIsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNzksMjQ1LDI0MCwKLSAgICAyMjksMjQyLDIzMywyMzksMTE0LDEyOCwyNDYsMjM5LDI0NCwyNDUsMjQyLDIzOCwyMjksMTAwLDEyOCwgIDIsCi0gICAgMTExLDExNywxNDEsICAwLDE4MSwxMzQsMTExLDEzNCwxMTUsMTM0LDEyNSwxMzQsMTQ5LDEzNCwxNTksMTM0LAotICAgIDE4MSwxMzQsMTkyLDEzNCwyMTcsMTM0LDI0MCwxMzQsMjUwLDEzNSwgMjQsMTM1LCA4OCwxMzUsIDk4LCA0OSwKLSAgICAxMjgsICAwLDE4MSwyMjUsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxMzAsMjI3LDEwNCwgIDIsCi0gICAgMTM0LDEzMiwxMzQsMTQyLDIzMSwyNDIsMjI5LDIyNSwyNDQsMjI5LDExNCwxMjgsIDM0LDEwNywyMzYsMjI5LAotICAgIDI0MywxMTUsMTI4LCAzNCwxMDYsMjMwLDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTQwLDEwMywKLSAgICAgIDIsMTM0LDE2NSwxMzQsMTcyLDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDE4OCwyNDMsMjQxLDI0NSwyMjUsCi0gICAgMjQyLDEwMSwxMjgsIDUxLDE0MSwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTI4LAotICAgIDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyMjQsMTM0LDIwNSwyMzIsMjI1LDIzNiwKLSAgICAyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDE0NSwxMDgsICAyLDEzNCwyMjMsMTM0LDIzMiwyNDMsCi0gICAgMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE0OSwyNDQsMjMzLDI0MCwyMzYsMTIxLDEyOCwgIDAsMjE1LAotICAgIDIzNywyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE1NSwyMzgsMjI1LDEwNCwgIDIsMTM1LCAgMiwKLSAgICAxMzUsIDExLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTYzLDIzNiwyMjksMjMwLDI0NCwyMzIsCi0gICAgMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE2MywxMTUsICAyLDEzNSwgMzAsMTM1LCA3OSwyMzMsIDk5LAotICAgICAgMywxMzUsIDM5LDEzNSwgNTYsMTM1LCA2NywyMjUsMjM2LDIzOCwyMzksMjQ0LDEwMSwxMjksIDM4LDEwNiwKLSAgICAxMzUsIDUwLDIyOCwyMjYsMTA4LDEyOCwgMzgsMTA3LDIzMCwyMzYsMjI1LDI0NCwyNDMsMjMzLDIzMSwxMTAsCi0gICAgMTI4LCAzOCwxMDksMjQzLDIzMiwyMjUsMjQyLDI0MCwyNDMsMjMzLDIzMSwxMTAsMTI4LCAzOCwxMTEsMjQzLAotICAgIDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNzgsMjQ2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwKLSAgICAgNTEsMTgyLDI0NywyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDE4OCwxMTgsICAyLDEzNSwxMTQsCi0gICAgMTM1LDEyNywyMzcsMjI5LDIzMSwyMjUsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxODUsMjQzLAotICAgIDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxODMsMTE5LCAgMiwxMzUsMTQyLDEzNSwxNTUsMjM3LDIyOSwKLSAgICAyMzEsMjI1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTkxLDI0MywyNDEsMjQ1LDIyNSwyNDIsCi0gICAgMTAxLDEyOCwgNTEsMTg5LDExMCwxNTAsICAwLDExMCwxMzUsMjEyLDEzNiwgOTAsMTM2LDExNCwxMzYsMTgwLAotICAgIDEzNiwyMDUsMTM3LCAgNywxMzcsIDE3LDEzNywgODQsMTM3LDEyNywxMzksMTYxLDEzOSwxNzksMTM5LDIwNCwKLSAgICAxMzksMjM1LDE0MCwgIDUsMTQwLCA3MCwxNDIsIDUyLDE0MiwgNjAsMTQyLCA4NSwxNDIsIDkzLDE0MywgNjEsCi0gICAgMTQzLCA3MSwxNDMsIDgxLCA5NywgIDgsMTM1LDIzMCwxMzUsMjUwLDEzNiwgIDEsMTM2LCAgOCwxMzYsIDMzLAotICAgIDEzNiwgNDQsMTM2LCA2OSwxMzYsIDgxLCA5OCwgIDIsMTM1LDIzNiwxMzUsMjQ1LDIyOSwyMzgsMjMxLDIyNSwKLSAgICAyMzYsMTA1LDEyOCwgIDksMTY4LDIzNiwgOTcsMTI4LCAzNCwgIDcsMjI3LDI0NSwyNDQsMTAxLDEyOCwgIDEsCi0gICAgIDY4LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA0MCwyMzEsMTE3LCAgMiwxMzYsIDE1LDEzNiwgMjQsMjM0LAotICAgIDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNjgsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwKLSAgICAgNDAsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEwNiwyMzUsMjI1LDI0NCwyMjUsCi0gICAgMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjAyLDEzNiwgNTcsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LAotICAgIDI0NCwxMDQsMTI4LDI1NSwxMzMsMjQwLDIzOSwyNDMsMjQ0LDI0MiwyMzksMjQwLDIzMiwxMDEsMTI4LCAgMSwKLSAgICAgNzMsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxMjksIDk4LCAgMiwxMzYsIDk2LDEzNiwxMDYsCi0gICAgMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDExLDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LAotICAgICAgMCwxNjAsIDk5LCAgNCwxMzYsMTI0LDEzNiwxMzEsMTM2LDE0MCwxMzYsMTY3LDIyNSwyNDIsMjM5LDExMCwKLSAgICAxMjgsICAxLCA3MiwyMjksMjI4LDIzMywyMzYsMjM2LCA5NywxMjgsICAxLCA3MCwyMzMsMjQyLCA5OSwgIDIsCi0gICAgMTM2LDE0OCwxMzYsMTUzLDIzNiwxMDEsMTI4LCAzNiwyMjEsMjQ1LDIzNywyMzAsMjM2LDIyOSwyNDgsMjI2LAotICAgIDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLCA3NSwyMzksMjM3LDIzNywyMjUsMjI1LDIyNywyMjcsMjI5LDIzOCwKLSAgICAxMTYsMTI4LCAgMSwgNzAsMjI4LDIzOSwxMTYsICAyLDEzNiwxODgsMTM2LDE5NywyMjUsMjI3LDIyNywyMjksCi0gICAgMjM4LDExNiwxMjgsIDMwLCA2OSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDcxLDEwMSwgIDMsMTM2LAotICAgIDIxMywxMzYsMjI0LDEzNiwyNDksMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEwOSwKLSAgICAyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjA1LDEzNiwyMzcsMjMyLDIyNSwyMzYsCi0gICAgMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMzYsMjQ3LDI0MywyMzIsMjI5LDI0MSwyMjksMjM2LAotICAgIDI0MywyMzMsMjMxLDExMCwxMjgsIDMyLDE3MCwyMzAsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwKLSAgICAxMzksMTAzLCAgMiwxMzcsIDIzLDEzNywgNzMsIDk3LCAgMywxMzcsIDMxLDEzNywgNDEsMTM3LCA0OCwyMjYsCi0gICAgMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNTMsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDI1LAotICAgIDIzMSwxMTcsICAyLDEzNywgNTUsMTM3LCA2NCwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE1MywKLSAgICAyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAyNSwyMzksMjM4LDIzMSwyNDUsMjQ0LDIzMiwyMjUsCi0gICAgMTA1LDEyOCwgMTQsICA3LDEwNCwgIDIsMTM3LCA5MCwxMzcsMTAwLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LAotICAgICA5NywxMjgsIDQ4LDE0NywyMzksMjM5LDEwNywgIDIsMTM3LDEwOCwxMzcsMTE1LDIzNiwyMjksMjMwLDExNiwKLSAgICAxMjgsICAyLDExNCwyNDIsMjI5LDI0NCwyNDIsMjM5LDIzMCwyMzYsMjI5LDEyMCwxMjgsICAyLDExNSwxMDUsCi0gICAgICA0LDEzNywxMzcsMTM4LCA1MCwxMzgsIDYxLDEzOCwxMTksMjI5LDI0NSwxMTAsICA3LDEzNywxNTUsMTM3LAotICAgIDE5MCwxMzcsMjIyLDEzNywyMzYsMTM3LDI0NSwxMzgsIDIyLDEzOCwgMzUsIDk3LCAgMiwxMzcsMTYxLDEzNywKLSAgICAxNzYsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMTEsCi0gICAgMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAxNSwyMjcsMTA1LAotICAgICAgMiwxMzcsMTk3LDEzNywyMDksMjI5LDI0NSwyMjcsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwKLSAgICAgNTMsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsIDk3LDIzMiwyMzMsCi0gICAgMjI5LDI0NSwyMzIsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNTQsMjM1LDIzOSwyNDIsMjI5LAotICAgIDIyNSwxMTAsMTI4LCA0OSwgNTIsMjQwLCA5NywgIDIsMTM3LDI1MiwxMzgsIDEwLDIzOCwyNDMsMjMzLDIzOSwKLSAgICAyNDMsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMDQsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsCi0gICAgMjI5LDIyNSwxMTAsMTI4LCA1MCwgIDEsMjQzLDIzMywyMzksMjQzLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLAotICAgIDEyOCwgNDksMTAzLDI0NCwyMzMsMjM1LDIyOSwyNDUsMjQ0LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwKLSAgICAgNDksMTAyLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMDcsMTA3LCAgMiwxMzgsCi0gICAgIDY3LDEzOCwgOTEsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjAzLDEzOCwgNzksMjMyLAotICAgIDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMzQsMjMyLDIyNSwyMzIsMjMzLDExNiwKLSAgICAgIDIsMTM4LDEwMSwxMzgsMTEyLDIzNiwyMjksMjMwLDI0NCwyNDQsMjMyLDIyNSwxMDUsMTI4LDI0OCwxNTMsCi0gICAgMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDc3LDIzOCwxMDEsMTQxLCAgMCwgNTcsMTM4LDE1MCwxMzgsMTU5LAotICAgIDEzOCwxNjksMTM4LDE5OSwxMzgsMjA2LDEzOCwyMzEsMTM5LCAgMiwxMzksIDM2LDEzOSwgNDgsMTM5LCA1OSwKLSAgICAxMzksIDkyLDEzOSwxMDAsMTM5LDExMSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LDEwNSwyMjYsCi0gICAgMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMzksMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI5LAotICAgICAzNiwxMDQsMTM4LDE4MCwyMzMsMjM4LDI0NiwyMjksMjQyLDI0MywyMjksMjQzLDIyNSwyMzgsMjQzLDI0MywKLSAgICAyMjksMjQyLDIzMywxMDIsMTI4LCAzOSwxNDYsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksMTExLDIzMSwxMTcsCi0gICAgICAyLDEzOCwyMTMsMTM4LDIyMiwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDIzOSwyNDIsMjM3LAotICAgIDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLDExMSwyMzIsIDk3LCAgMiwxMzgsMjM4LDEzOCwyNDksMjI3LDIzNSwKLSAgICAyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LDEwNSwyMzgsMjMxLDI1MCwyMzIsMjM5LDExNywxMjgsCi0gICAgIDQ4LCA0MSwxMDUsICAyLDEzOSwgIDgsMTM5LCAyNiwyMjgsMjI5LDIzOSwyMzEsMjQyLDIyNSwyNDAsMjMyLAotICAgIDIzMywyMjcsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCA0MCwyMzgsMjMwLDIyOSwyNDIsMjMzLDIzOSwKLSAgICAxMTQsMTI4LCAzMiwxMzcsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMjUsCi0gICAgMjM5LDIzNiwyMjgsMjQzLDI0NCwyNDksMjM2LDEwMSwxMjgsMjQ3LCA1NywxMTIsICAyLDEzOSwgNjUsMTM5LAotICAgICA3MiwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxMjQsMjI5LDExNCwgIDIsMTM5LCA3OSwxMzksIDg1LDIzMywKLSAgICAyMzksMTAwLDEyOCwgMzYsMTQ0LDI0MywyMzMsMjI1LDExMCwxMjgsICA2LDI0OSwyNDIsMjM5LDIzNywyMjUsCi0gICAgMTEwLDEyOCwgMzMsMTIwLDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwxMjEsMTE2LAotICAgICAgMiwxMzksMTE3LDEzOSwxNTUsMjI5LDIyOSwxMTAsICAyLDEzOSwxMjUsMTM5LDEzNCwyMjcsMjMzLDI0MiwKLSAgICAyMjcsMjM2LDEwMSwxMjgsIDM2LDExNCwxMTIsICAyLDEzOSwxNDAsMTM5LDE0NywyMjUsMjQyLDIyOSwxMTAsCi0gICAgMTI4LCAzNiwxMzQsMjI5LDI0MiwyMzMsMjM5LDEwMCwxMjgsIDM2LDE1NCwyMzIsMjI1LDEwNSwxMjgsIDE0LAotICAgICA4OSwxMDYsMTI5LCAgMSwyMDQsMTM5LDE2NywyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwKLSAgICAxMjgsICA0LCA5MCwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjQzLDEzOSwxOTIsCi0gICAgMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxNTcsMTA4LCAgMiwxMzksMjEwLAotICAgIDEzOSwyMjQsMjI5LDIzMSwyNDIsMjMzLDIzMSwyMzIsMjQ0LDIzNiwyMzksMjM4LDEwMywxMjgsICAxLDE1OCwKLSAgICAyMzMsMjM4LDIyOSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsIDczLDEwOSwgIDIsMTM5LDI0MSwxMzksCi0gICAgMjUyLDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgNzgsMjQzLDI0MSwyNDUsMjI1LAotICAgIDI0MiwxMDEsMTI4LCA1MSwxNTQsMTEwLCAgMiwxNDAsIDExLDE0MCwgNjEsIDk3LCAgMywxNDAsIDE5LDE0MCwKLSAgICAgMjksMTQwLCAzNiwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxNjMsMjI4LDIyOSwyNDYsCi0gICAgIDk3LDEyOCwgIDksIDM1LDIzMSwxMTcsICAyLDE0MCwgNDMsMTQwLCA1MiwyMzQsMjI1LDI0MiwyMjUsMjQ0LAotICAgIDEwNSwxMjgsIDEwLDE2MywyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCAzNSwyMzgsMjI1LDIyOCwKLSAgICAyMjksMjQ2LCA5NywxMjgsICA5LCA0MSwxMTEsICA2LDE0MCwgODQsMTQwLCA5NSwxNDAsMTIwLDE0MCwxNjEsCi0gICAgMTQxLDExMywxNDIsIDQwLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMTAsMjM1LAotICAgIDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIwNiwxNDAsMTA4LDIzMiwyMjUsMjM2LDIzMCwKLSAgICAyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTM3LDExMCwgIDMsMTQwLDEyOCwxNDAsMTQ0LDE0MCwxNTMsCi0gICAgMjI2LDI0MiwyMjksMjI1LDIzNSwyMzMsMjM4LDIzMSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwgIDAsMTYwLAotICAgIDIyOSwyMzgsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDE5LDI0NSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwKLSAgICAgMjUsMjM5LDExMCwgIDcsMTQwLDE3OCwxNDAsMTg3LDE0MCwyMDEsMTQwLDIzNSwxNDAsMjUxLDE0MSwgMzYsCi0gICAgMTQxLCA5NSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA3MCwyMzAsMjMzLDIzOCwyMjUsMjM2LAotICAgIDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjMwLDIzMSwyMzIsMjQ1LDIzOCwyMzgsIDk3LCAgMiwKLSAgICAxNDAsMjEyLDE0MCwyMjEsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxODYsMjMwLDIzMywyMzgsCi0gICAgMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUxLDE1OSwyMzMsMjM4LDIzMywyNDQsMjMzLAotICAgIDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwyMzEsMjM0LDIyOSwyMjksMjM3LDEwNSwKLSAgICAgIDIsMTQxLCAgNSwxNDEsIDIwLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwyNTIsMjEwLDI0MywyMzksMjM2LDIyNSwyNDQsMjI5LDIyOCwyMjUsMjQyLDIyNSwyMjYsMjMzLAotICAgICA5OSwxMjgsMjUyLCA3NSwyMzcsMTAxLCAgMiwxNDEsIDQzLDE0MSwgNTYsMjI4LDIzMywyMjUsMjM2LDIyNSwKLSAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjMyLDIyOSwyMzcsMTA1LCAgMiwxNDEsIDY0LDE0MSwgNzksCi0gICAgMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwyMTMsMjQzLAotICAgIDIzOSwyMzYsMjI1LDI0NCwyMjksMjI4LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsIDc4LDIzOCwKLSAgICAyMzksMjM5LDIzOCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsCi0gICAgMTQxLDExNiwgIDcsMTQxLDEyOSwxNDEsMTQwLDE0MSwxNjksMTQxLDIwNCwxNDEsMjE2LDE0MSwyMzYsMTQyLAotICAgICAgNiwyMjcsMjM5LDIzOCwyNDQsMjI1LDIzMywyMzgsMTE1LDEyOCwgMzQsIDEyLDEwMSwgIDIsMTQxLDE0NiwKLSAgICAxNDEsMTYyLDIzNiwyMjksMjM3LDIyOSwyMzgsMTE2LDEyOSwgMzQsICA5LDE0MSwxNTcsMjM5LDEwMiwxMjgsCi0gICAgIDM0LCAgOSwyNDEsMjQ1LDIyNSwxMDgsMTI4LCAzNCwgOTYsMjMxLDI0MiwyMjksMjI1LDI0NCwyMjksMTE0LAotICAgIDEyOSwgMzQsMTExLDE0MSwxODEsMjM4LDIzOSwxMTQsICAyLDE0MSwxODksMTQxLDE5NywyMjksMjQxLDI0NSwKLSAgICAyMjUsMTA4LDEyOCwgMzQsMTEzLDIzNiwyMjksMjQzLDExNSwxMjgsIDM0LDEyMSwyMzMsMjI4LDIyOSwyMzgsCi0gICAgMjQ0LDIzMywyMjcsMjI1LDEwOCwxMjgsIDM0LCA5OCwyMzYsMjI5LDI0MywxMTUsMTI5LCAzNCwxMTAsMTQxLAotICAgIDIyNSwyMzgsMjM5LDI0MiwyMjksMjQxLDI0NSwyMjUsMTA4LDEyOCwgMzQsMTEyLDExMiwgIDIsMTQxLDI0MiwKLSAgICAxNDEsMjUyLDIyNSwyNDIsMjI1LDIzNiwyMzYsMjI5LDEwOCwxMjgsIDM0LCAzOCwyNDIsMjI5LDIyNywyMjksCi0gICAgMjI4LDIyOSwxMTUsMTI4LCAzNCwxMjgsMjQzLDExNywgIDMsMTQyLCAxNSwxNDIsIDIyLDE0MiwgMzEsMjI2LAotICAgIDI0MywyMjksMTE2LDEyOCwgMzQsMTMyLDIyNywyMjcsMjI5LDIyOSwyMjgsMTE1LDEyOCwgMzQsMTI5LDI0MCwKLSAgICAyMjksMjQyLDI0MywyMjksMTE2LDEyOCwgMzQsMTMzLDI0NywyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsCi0gICAgMTEwLDEyOCwgIDUsMTE4LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxNjksMTE1LCAgMiwxNDIsIDY2LAotICAgIDE0MiwgNzUsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxNzcsMjQ1LDI0MCwyMjksMjQyLDIzMywKLSAgICAyMzksMTE0LDEyOCwgMzIsMTI3LDI0NCwyMzMsMjM2LDIyOCwxMDEsMTI4LCAgMCwyNDEsMTE3LDEzMiwgIDMsCi0gICAgMTg5LDE0MiwxMDUsMTQyLDExNiwxNDIsMTk3LDE0MywgMjQsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LAotICAgICA5NywxMjgsIDQ4LDEwOCwxMDcsICAyLDE0MiwxMjIsMTQyLDE0NiwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwKLSAgICAgOTcsMTI5LCA0OCwyMDQsMTQyLDEzNCwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsCi0gICAgMjU1LDEzNSwyNDQsIDk3LCAgMywxNDIsMTU1LDE0MiwxNjUsMTQyLDE3MiwyMjYsMjI5LDIzOCwyMzEsMjI1LAotICAgIDIzNiwxMDUsMTI4LCAgOSwxODgsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDYwLDIzMSwxMTcsICAyLDE0MiwKLSAgICAxNzksMTQyLDE4OCwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE4OCwyNDIsMjM3LDI0NSwyMzUsCi0gICAgMjMyLDEwNSwxMjgsIDEwLCA2MCwxMDksICAyLDE0MiwyMDMsMTQyLDIzNywyMjYsMjI5LDI0MiwyNDMsMjMzLAotICAgIDIzMSwxMTAsMTMwLCAgMCwgMzUsMTQyLDIxNywxNDIsMjI5LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwKLSAgICAyMjcsMTAxLDEyOCwyNTUsICAzLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI1NCwgOTUsMjI5LDExNCwgIDIsCi0gICAgMTQyLDI0NCwxNDMsIDIwLDIyNSwyMzYsMjQzLDIzMywyMzEsMTEwLCAgMiwxNDIsMjU1LDE0MywgIDcsMjMxLAotICAgIDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDExNiwyMzYsMjM5LDI0NywyMjksMjQyLDIzMSwyNDIsMjI5LDIyOSwKLSAgICAxMDcsMTI4LCAgMywxMTcsMTExLDEyOCwgMzMsIDIyLDExMCwxMzAsICA1LDIyNCwxNDMsIDMyLDE0MywgNTIsCi0gICAgMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwgNjQsMTQzLCA0MywyMzIsMjI5LDIyNiwyNDIsMjI5LAotICAgIDExOSwxMjgsMjUxLCA2NCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIyNCwyNDYsMjQzLDI0MSwKLSAgICAyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxODEsMjQ3LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsCi0gICAgMTg3LDI0OSwgOTcsICAzLDE0MywgOTAsMTQzLDEwMCwxNDMsMTA3LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LAotICAgIDEwNSwxMjgsICA5LDE1OCwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgMzAsMjMxLDExNywgIDIsMTQzLDExNCwKLSAgICAxNDMsMTIzLDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTU4LDI0MiwyMzcsMjQ1LDIzNSwyMzIsCi0gICAgMTA1LDEyOCwgMTAsIDMwLDExMSwxNDcsICAwLDExMSwxNDMsMTc0LDE0MywxOTYsMTQ0LCAxOCwxNDQsMTg4LAotICAgIDE0NSwgIDQsMTQ1LCAxOSwxNDUsIDU5LDE0NSwxODIsMTQ1LDIwMywxNDUsMjQxLDE0NSwyNTIsMTQ2LDE3NCwKLSAgICAxNDgsICA4LDE0OCwgNzIsMTQ4LDEwNSwxNDgsMTUxLDE0OSwgMjQsMTQ5LCA3MSwxNDksIDgzLCA5NywgIDIsCi0gICAgMTQzLDE4MCwxNDMsMTg3LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAwLDI0MywyMzgsMjMxLDI0NCwyMzIsMjI1LAotICAgIDEwNSwxMjgsIDE0LCA0NSwgOTgsICA0LDE0MywyMDYsMTQzLDI0OCwxNDQsICAxLDE0NCwgMTEsMjI1LDI0MiwKLSAgICAyNDIsMjI5LDEwMCwxMzAsICAyLDExNywxNDMsMjE4LDE0MywyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsCi0gICAgMjMzLCA5OSwxMjgsICA0LDIzMywyMjgsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMjQzLDIyNywyNDksMjQyLAotICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMzUsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwKLSAgICAxNDcsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDI3LDI0MiwyMjksMjQ2LDEwMSwxMjgsCi0gICAgICAxLCA3OSwgOTksICAzLDE0NCwgMjYsMTQ0LCA5OSwxNDQsMTc4LCA5NywgIDIsMTQ0LCAzMiwxNDQsIDkzLAotICAgIDIzOCwyMjgsMjQyLCA5NywgIDMsMTQ0LCA0MywxNDQsIDUwLDE0NCwgNjEsMjI4LDIyOSwyNDYsIDk3LDEyOCwKLSAgICAgIDksIDE3LDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNDUsMjQ2LDIzOSwyNDcsCi0gICAgMjI5LDIzNiwyNDMsMjMzLDIzMSwxMTAsICAyLDE0NCwgNzUsMTQ0LCA4MiwyMjgsMjI5LDI0NiwgOTcsMTI4LAotICAgICAgOSwgNzMsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDIwMSwyNDIsMjM5LDExMCwKLSAgICAxMjgsICAxLDIxMCwyMzMsMjQyLCA5OSwgIDIsMTQ0LDEwNywxNDQsMTEyLDIzNiwxMDEsMTI4LCAzNiwyMjIsCi0gICAgMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTMzLCAgMCwyNDQsMTQ0LDEzMSwxNDQsMTM5LDE0NCwxNTAsMTQ0LAotICAgIDE1OCwxNDQsMTcwLDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwyMDksMjI4LDIzOSwyNDQsMjI2LDIyOSwKLSAgICAyMzYsMjM5LDExOSwxMjgsIDMwLDIxNywyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwgMzAsMjExLDIzMiwyMzksCi0gICAgMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMjEzLDI0NCwyMzMsMjM2LDIyOCwxMDEsMTI4LAotICAgICAzMCwyMTUsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDYyLDEwMCwgIDQsMTQ0LDE5OCwKLSAgICAxNDQsMjIxLDE0NCwyMjcsMTQ0LDI1MCwyMjYsMTA4LCAgMiwxNDQsMjA1LDE0NCwyMTMsMjI1LDIyNywyNDUsCi0gICAgMjQ0LDEwMSwxMjgsICAxLCA4MSwyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwgIDIsIDEzLDIyOSwyNDYsIDk3LAotICAgIDEyOCwgIDksIDE5LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDExNSwxMjksICAwLDI0NiwxNDQsMjM5LDIyNywKLSAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMzEsMjM5LDI0NCwyMjYsMjI5LDIzNiwyMzksCi0gICAgMTE5LDEyOCwgMzAsMjA1LDEwMSwxMjksICAxLCA4MywxNDUsIDEwLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLAotICAgIDEyOCwgNDksIDkwLDEwMywgIDMsMTQ1LCAyNywxNDUsIDQyLDE0NSwgNDksMjM5LDIzOCwyMjksMTA3LDEyOSwKLSAgICAgIDIsMjE5LDE0NSwgMzYsMjI3LDIzNywgOTgsMTI4LCAgMywgNDAsMjQyLDIyNSwyNDYsMTAxLDEyOCwgIDAsCi0gICAgMjQyLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE0NywxMDQsICA0LDE0NSwgNjksMTQ1LAotICAgICA4MCwxNDUsIDkwLDE0NSwxNjgsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDEzMywKLSAgICAyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgNzQsMTExLCAgMiwxNDUsIDk2LDE0NSwxMDYsCi0gICAgMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMjA3LDI0MiwxMTAsMTMzLCAgMSwxNjEsMTQ1LAotICAgIDEyMSwxNDUsMTI5LDE0NSwxNDAsMTQ1LDE0OCwxNDUsMTYwLDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwKLSAgICAyMTksMjI4LDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDIyNywyMzEsMjQyLDIyNSwyNDYsCi0gICAgMTAxLDEyOCwgMzAsMjIxLDIzMiwyMzksMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMjIzLAotICAgIDI0NCwyMzMsMjM2LDIyOCwxMDEsMTI4LCAzMCwyMjUsMjQ1LDIzOCwyMzEsMjI1LDI0MiwyNDUsMjM3LDIzNiwKLSAgICAyMjUsMjQ1LDExNiwxMjgsICAxLCA4MSwxMDUsMTI5LCAgMSwxNjMsMTQ1LDE4OCwyMzgsMjQ2LDIyOSwyNDIsCi0gICAgMjQ0LDIyOSwyMjgsMjI2LDI0MiwyMjksMjQ2LDEwMSwxMjgsICAyLCAxNSwxMDcsICAyLDE0NSwyMDksMTQ1LAotICAgIDIzMywyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwxNzAsMTQ1LDIyMSwyMzIsMjI1LDIzNiwKLSAgICAyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDExNywyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksCi0gICAgIDg3LDIzNiwyMjksMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNzEsMTA5LCAgNiwxNDYsIDEwLAotICAgIDE0NiwgMzgsMTQ2LCA0NSwxNDYsMTM0LDE0NiwxNDUsMTQ2LDE2MywyMjUsMjI3LDI0MiwyMzksMTEwLDEzMCwKLSAgICAgIDEsIDc3LDE0NiwgMjIsMTQ2LCAzMCwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsIDgzLDIzMSwyNDIsCi0gICAgMjI1LDI0NiwxMDEsMTI4LCAzMCwgODEsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDgwLDIyOSwyMzEsIDk3LAotICAgIDEzMywgIDMsMjAxLDE0NiwgNjEsMTQ2LCA2NSwxNDYsIDc2LDE0NiwgOTAsMTQ2LDEwNiwgNDksMTI4LCAgMywKLSAgICAyMTQsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA5NywyMzYsMjI1LDI0NCwyMzMsCi0gICAgMjM4LDIyNywyMzYsMjM5LDI0MywyMjksMTAwLDEyOCwgIDIsMTE5LDI0MiwyMzksMjQ1LDIzOCwyMjgsMjI3LAotICAgIDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDEyMywxMTYsICAyLDE0NiwxMTIsMTQ2LDEyNywKLSAgICAyMzMsMjQ0LDIzNiwyMzksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDEyNSwyMzksCi0gICAgMjM4LDIzOSwxMTUsMTI4LCAgMywyMDYsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLAotICAgIDIwOCwyMzMsMjI3LDI0MiwyMzksMTEwLDEyOSwgIDMsMTkxLDE0NiwxNTUsMjQ0LDIzOSwyMzgsMjM5LDExNSwKLSAgICAxMjgsICAzLDIwNCwyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDc5LDIzOCwxMDEsCi0gICAgMTQ1LCAgMCwgNDksMTQ2LDIxMywxNDYsMjIyLDE0NiwyMzIsMTQ3LCAgNiwxNDcsIDMxLDE0NywgNDAsMTQ3LAotICAgICA0OSwxNDcsIDc0LDE0NywxMDgsMTQ3LDE0MiwxNDcsMTU0LDE0NywxNzMsMTQ3LDE4NCwxNDcsMjE3LDE0NywKLSAgICAyMjcsMTQ3LDIzNSwxNDcsMjQ2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDk3LDIyNiwyMjksCi0gICAgMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIzMSwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjksIDM2LAotICAgICA5NiwxNDYsMjQzLDIzMywyMzgsMjQ2LDIyOSwyNDIsMjQzLDIyOSwyNDMsMjI1LDIzOCwyNDMsMjQzLDIyOSwKLSAgICAyNDIsMjMzLDEwMiwxMjgsIDM5LDEzOCwxMDAsICAyLDE0NywgMTIsMTQ3LCAxOCwyMjksMjQ2LCA5NywxMjgsCi0gICAgICA5LDEwMywyMzksMjQ0LDIyOSwyMzgsMjM2LDIyOSwyMjUsMjI4LDIyOSwxMTQsMTI4LCAzMiwgMzYsMjI5LAotICAgIDIzMywyMzEsMjMyLDI0NCwxMDQsMTI4LCAzMywgOTEsMjMwLDIzMywyNDQsMjQ0LDIyOSwxMDAsMTI4LDI0NiwKLSAgICAyMjAsMjMxLDExNywgIDIsMTQ3LCA1NiwxNDcsIDY1LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsCi0gICAgMjMxLDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsMTAzLDIzMiwgOTcsICAzLDE0NywgODMsMTQ3LAotICAgICA5NCwxNDcsIDk5LDIyNywyMzUsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgOTcsMjM2LDEwMiwKLSAgICAxMjgsICAwLDE4OSwyMzgsMjMxLDI1MCwyMzIsMjM5LDExNywxMjgsIDQ4LCAzMywxMDUsICAyLDE0NywxMTQsCi0gICAgMTQ3LDEzMiwyMjgsMjI5LDIzOSwyMzEsMjQyLDIyNSwyNDAsMjMyLDIzMywyMjcsMjQwLDIyNSwyNDIsMjI5LAotICAgIDExMCwxMjgsIDUwLCAzMiwyMzgsMjMwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwxMjksMjM3LDIzOSwKLSAgICAyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgMTcsMjM4LDI0NSwyMzcsMjI5LDI0MiwyMjUsCi0gICAgMjQ0LDIzOSwyNDIsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjQ0LDIzOSwyMzYsMjI4LAotICAgIDI0MywyNDQsMjQ5LDIzNiwxMDEsMTI4LDI0NywgNDksMTEyLCAgMiwxNDcsMTkwLDE0NywxOTcsMjI1LDI0MiwKLSAgICAyMjksMTEwLDEyOCwgMzYsMTE2LDIyOSwxMTQsICAyLDE0NywyMDQsMTQ3LDIxMCwyMzMsMjM5LDEwMCwxMjgsCi0gICAgIDM2LDEzNiwyNDMsMjMzLDIyNSwxMTAsMTI4LCAgNiwyNDEsMjQxLDI0NSwyMjUsMjQyLDI0NCwyMjksMTE0LAotICAgIDEyOCwgIDAsMTg4LDI0MiwyMzksMjM3LDIyNSwxMTAsMTI4LCAzMywxMTIsMjQzLDI0NSwyNDAsMjI5LDI0MiwKLSAgICAyMzMsMjM5LDExNCwxMjgsICAwLDE4NSwyNDQsMTA0LCAgMiwxNDcsMjUzLDE0OCwgIDIsMjI1LDEwNSwxMjgsCi0gICAgIDE0LCA4MSwyMzMsMjQyLDEwMCwxMjgsIDMzLCA4MywxMTEsICAzLDE0OCwgMTYsMTQ4LCA1MCwxNDgsIDY2LAotICAgIDEwMywgIDIsMTQ4LCAyMiwxNDgsIDQwLDIzOSwyMzgsMjI5LDEwNywxMjksICAxLDIzNSwxNDgsIDMxLDIzNywKLSAgICAyMjUsMjI3LDI0MiwyMzksMTEwLDEyOCwgIDEsMjM3LDI0NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsCi0gICAgIDEwLCAxOSwyMzcsMjI1LDI0NCwyNDIsMjI1LDIzMSwyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LAotICAgICAxMCwgNzUsMjQwLDIyOSwxMTAsMTI4LCAgMiwgODQsMTEyLCAgMywxNDgsIDgwLDE0OCwgODcsMTQ4LCA5OCwKLSAgICAyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxNzAsMjI5LDIzOCwyMjYsMjQ1LDIzNiwyMzYsMjI5LDExNiwxMjgsCi0gICAgIDM3LDIzMCwyNDQsMjMzLDIzOSwxMTAsMTI4LCAzNSwgMzcsMTE0LCAgMiwxNDgsMTExLDE0OCwxNDAsMTAwLAotICAgICAgMiwxNDgsMTE3LDE0OCwxMjgsMjMwLDIyOSwyMzcsMjMzLDIzOCwyMzMsMjM4LDEwMSwxMjgsICAwLDE3MCwKLSAgICAyMzcsMjI1LDI0MywyMjcsMjQ1LDIzNiwyMzMsMjM4LDEwMSwxMjgsICAwLDE4NiwyNDQsMjMyLDIzOSwyMzEsCi0gICAgMjM5LDIzOCwyMjUsMTA4LDEyOCwgMzQsIDMxLDExNSwgIDUsMTQ4LDE2MywxNDgsMTk1LDE0OCwyMTIsMTQ5LAotICAgICAgMSwxNDksIDE0LDIzMiwyMzksMjQyLDExNiwgIDIsMTQ4LDE3MiwxNDgsMTc5LDIyOCwyMjksMjQ2LCA5NywKLSAgICAxMjgsICA5LCAxOCwyNDYsMjM5LDI0NywyMjksMjM2LDI0MywyMzMsMjMxLDIzOCwyMjgsMjI5LDI0NiwgOTcsCi0gICAgMTI4LCAgOSwgNzQsMjM2LDIyNSwyNDMsMTA0LDEyOSwgIDAsMjQ4LDE0OCwyMDQsMjI1LDIyNywyNDUsMjQ0LAotICAgIDEwMSwxMjgsICAxLDI1NSwyMzcsMjI1LDIzNiwxMDgsICAyLDE0OCwyMjEsMTQ4LDIzMiwyMzIsMjMzLDI0MiwKLSAgICAyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsIDczLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsCi0gICAgMTI5LCA0OCwxNjksMTQ4LDI0NSwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LAotICAgIDEwNywyNDQsMjQyLDIzOSwyMzUsMjI5LDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAgMSwyNTUsMjQ1LDI0MCwKLSAgICAyMjksMjQyLDIzMywyMzksMTE0LDEyOCwyNDYsMjQwLDExNiwgIDIsMTQ5LCAzMCwxNDksIDQxLDIyNywyNDksCi0gICAgMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMjcsMjMzLDIzNiwyMjgsMTAxLDEzMCwgIDAsMjQ1LAotICAgIDE0OSwgNTIsMTQ5LCA2MCwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsIDc3LDIyOCwyMzMsMjI5LDI0MiwKLSAgICAyMjksMjQzLDIzMywxMTUsMTI4LCAzMCwgNzksMjQ1LDIyNiwyMzksMjQwLDIzOSwyMzcsMjM5LDIzMCwxMTEsCi0gICAgMTI4LCA0OSwgMzMsMTE4LCAgMiwxNDksIDg5LDE0OSwxNzAsMjI5LDExNCwgIDIsMTQ5LCA5NiwxNDksMTYyLAotICAgIDIzNiwyMzMsMjM4LDEwMSwxMzEsIDMyLCA2MiwxNDksMTA5LDE0OSwxMzIsMTQ5LDE1NSwgOTksICAyLDE0OSwKLSAgICAxMTUsMTQ5LDEyNywyMjksMjM4LDI0NCwyMjksMjQyLDIzNiwyMzMsMjM4LDEwMSwxMjgsMjU0LCA3NCwyMzcsCi0gICAgIDk4LDEyOCwgIDMsICA1LDEwMCwgIDIsMTQ5LDEzOCwxNDksMTQ2LDIyNSwyNDMsMjMyLDIyOSwxMDAsMTI4LAotICAgIDI1NCwgNzMsMjI2LDIzNiwyNDcsMjI1LDI0NiwxMjEsMTI4LDI1NCwgNzYsMjQ3LDIyNSwyNDYsMTIxLDEyOCwKLSAgICAyNTQsIDc1LDI0MywyMjcsMjM5LDI0MiwxMDEsMTI4LCAgMCwxNzUsMjM5LDI0NywyMjksMjM2LDI0MywyMzMsCi0gICAgMjMxLDExMCwgIDMsMTQ5LDE4NSwxNDksMTk1LDE0OSwyMDIsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LAotICAgIDEyOCwgIDksMjAzLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA3NSwyMzEsMjQ1LDIzNCwyMjUsMjQyLDIyNSwKLSAgICAyNDQsMTA1LDEyOCwgMTAsMjAzLDExMiwxNDUsICAwLDExMiwxNDksMjUxLDE1MiwxMjMsMTUyLDEzNCwxNTIsCi0gICAgMTQzLDE1MiwxNTUsMTU0LCA4MCwxNTQsIDkwLDE1NSwgODIsMTU2LDEwMSwxNTYsMTkxLDE1NiwyMTcsMTU3LAotICAgICA5MiwxNTcsMTAwLDE1OCwgIDIsMTU4LCA2MCwxNTgsIDg4LDE1OCwgOTgsIDk3LCAxNCwxNTAsIDI1LDE1MCwKLSAgICAgNTcsMTUwLCA2NywxNTAsIDc0LDE1MCwgODEsMTUwLDEyOSwxNTAsMTQwLDE1MCwxNTQsMTUwLDE2NSwxNTAsCi0gICAgMjEyLDE1MCwyMjYsMTUxLDIzOCwxNTIsIDIxLDE1MiwxMTEsIDk3LCAgMiwxNTAsIDMxLDE1MCwgNDMsMjM3LAotICAgIDI0MCwyNDMsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxMjgsMjQzLDIyOSwyMzgsMjQ0LDIzOSwKLSAgICAyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCA0MywyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsCi0gICAgMTI4LCAgOSwxNzAsMjI3LDI0NSwyNDQsMTAxLDEyOCwgMzAsIDg1LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LAotICAgICA0MiwxMDMsICAyLDE1MCwgODcsMTUwLDEwNSwxMDEsICAyLDE1MCwgOTMsMTUwLDEwMCwyMjgsMjM5LDI0NywKLSAgICAxMTAsMTI4LCAzMywyMjMsMjQ1LDExMiwxMjgsIDMzLDIyMiwxMTcsICAyLDE1MCwxMTEsMTUwLDEyMCwyMzQsCi0gICAgMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE3MCwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLAotICAgICA0MiwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTEzLDIzMywyNDksMjI1LDIzOCwKLSAgICAyMzgsMjM5LDIzMywyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNDcsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsCi0gICAgMjM4LCA5NywxMjgsIDQ4LDIwOSwxMDgsICAyLDE1MCwxNzEsMTUwLDE5NiwyMjUsMjQ0LDIyNSwyMzYsMjMzLAotICAgIDI1MCwyMjUsMjQ0LDIzMywyMzksMjM4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywyMjcsMjI3LDIzNywKLSAgICAgOTgsMTI4LCAgNCwxMzIsMjM5LDIyNywyMzIsMjM1LDIyNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsCi0gICAgIDk5LDEyOCwgIDQsMTkyLDIzOCwyNDMsMjMzLDIzOSwyNDMsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LAotICAgICA0OSwxMjcsMTE0LCAgMywxNTAsMjM0LDE1MCwyNTUsMTUxLDIyNywgOTcsICAyLDE1MCwyNDAsMTUwLDI0OCwKLSAgICAyMzEsMjQyLDIyNSwyNDAsMTA0LDEyOCwgIDAsMTgyLDIzNiwyMzYsMjI5LDEwOCwxMjgsIDM0LCAzNywyMjksCi0gICAgMTEwLCAgMiwxNTEsICA2LDE1MSwxMTYsMjM2LDIyOSwyMzAsMTE2LDEzNiwgIDAsIDQwLDE1MSwgMjksMTUxLAotICAgICA0NCwxNTEsIDQ5LDE1MSwgNTQsMTUxLCA2NSwxNTEsIDc3LDE1MSwxMDAsMTUxLDEwNSwyMjUsMjM2LDI0NCwKLSAgICAyMzksMjM4LDIyOSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUzLCA2MiwyMjYsMTE2LDEyOCwyNDgsCi0gICAgMjM3LDIyOSwxMjAsMTI4LDI0OCwyMzYsMjMzLDIzOCwyMzAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLAotICAgIDE0MSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAgOCwxMTUsICAyLDE1MSwKLSAgICAgODMsMTUxLCA5MCwyMzcsMjI1LDIzNiwxMDgsMTI4LDI1NCwgODksMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksCi0gICAgMTE0LDEyOCwgMzIsMTI1LDI0NCwxMTIsMTI4LDI0OCwyMzUsMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LAotICAgIDEwOCwxMjgsMjU0LCA1MywyNDIsMjMzLDIzMSwyMzIsMTE2LDEzNiwgIDAsIDQxLDE1MSwxNDAsMTUxLDE1NSwKLSAgICAxNTEsMTYwLDE1MSwxNjUsMTUxLDE3NiwxNTEsMTg4LDE1MSwyMTEsMTUxLDIxNiwyMjUsMjM2LDI0NCwyMzksCi0gICAgMjM4LDIyOSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUzLCA2MywyMjYsMTE2LDEyOCwyNDgsMjQ4LAotICAgIDIyOSwxMjAsMTI4LDI0OCwyNDcsMjMzLDIzOCwyMzAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLDE0MiwKLSAgICAyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAgOSwxMTUsICAyLDE1MSwxOTQsCi0gICAgMTUxLDIwMSwyMzcsMjI1LDIzNiwxMDgsMTI4LDI1NCwgOTAsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LAotICAgIDEyOCwgMzIsMTI2LDI0NCwxMTIsMTI4LDI0OCwyNDYsMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwKLSAgICAxMjgsMjU0LCA1NCwyNDQsMjMzLDIyNSwyMzYsMjI4LDIzMywyMzAsMTAyLDEyOCwgMzQsICAyLDExNSwgIDMsCi0gICAgMTUxLDI0NiwxNTIsICAxLDE1MiwgMTMsMjI5LDI0MSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LAotICAgIDE5MiwyMzIsMjQ0LDIyNSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE1MywyNDEsMjQ1LDIyNSwKLSAgICAyNDIsMTAxLDEyOCwgNTEsMTY5LDI0NCwyMjUsMTA0LDEzNCwgIDUsMTgzLDE1MiwgMzksMTUyLCA1MywxNTIsCi0gICAgIDU4LDE1MiwgNjcsMTUyLCA4MiwxNTIsIDk4LCA0OSwgIDIsMTUyLCA0NSwxNTIsIDQ5LCA0OSwxMjgsICA1LAotICAgIDE4MywxMDAsMTI4LCAgNSwxODMsMTc4LCA5NywxMjgsICA1LDE4MywyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwKLSAgICAxMjgsICA1LDE4MywyMzgsMjI1LDI0MiwyNDIsMjM5LDI0NywyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsCi0gICAgICA1LDE4MywyNDEsMjQ1LDIyNSwyNDIsMjQ0LDIyOSwyNDIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAotICAgICAgNSwxODMsMjQ3LDIzMywyMjgsMjI5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTgzLDI1MCwKLSAgICAyMjksMjQyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTYxLDIyNiwyMzksMjQwLDIzOSwyMzcsCi0gICAgMjM5LDIzMCwxMTEsMTI4LCA0OSwgIDYsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwyMjMsMjI4LAotICAgIDIzOSwyNDQsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAzMCwgODcsMTAxLDEzNywgIDUsMjI4LDE1MiwKLSAgICAxNzcsMTUyLDE4OCwxNTIsMjA4LDE1MiwyMjAsMTUyLDI0MCwxNTMsIDg2LDE1MywgOTcsMTUzLDExOCwxNTQsCi0gICAgIDczLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNjMsMjI4LDIyNSwyMzEsMjI5LAotICAgIDI0MywxMDQsMTI5LDI1MSwgNjgsMTUyLDE5OSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA2OCwKLSAgICAyMjksMjUwLDIzMywyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCA1OSwyMzAsMjMzLDIzOCwyMjUsCi0gICAgMjM2LDIyOCwyMjUsMjMxLDIyOSwyNDMsMjMyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDY3LAotICAgIDEwNCwgIDUsMTUyLDI1MiwxNTMsIDE5LDE1MywgMjcsMTUzLCA0MSwxNTMsIDcxLDIyNSwxMTQsICAyLDE1MywKLSAgICAgIDMsMTUzLCAxMCwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxMjYsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsCi0gICAgMTI4LCAgNSwxMjIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDIyOCwyMzAsMjMzLDIzOCwyMjUsMjM2LAotICAgIDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTEsIDg3LDEwNSwgIDIsMTUzLCA0NywxNTMsIDYyLDIzOCwKLSAgICAyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTEsIDg4LDI0MiwyMjUsCi0gICAgMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTIyLDIzNywyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LAotICAgIDIyNiwyMzMsIDk5LDEyOCwyNTEsIDg5LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwKLSAgICAyMTgsMjM3LDIzMywyMjgsMjI4LDIzNiwyMjksMjMyLDIzOSwyMzksMjM1LDIyNywyNDksMjQyLDIzMywyMzYsCi0gICAgMjM2LDIzMywgOTksMTI4LCAgNCwxNjcsMTE0LCAgNSwxNTMsMTMwLDE1MywxNDIsMTUzLDE4NCwxNTQsIDQ5LAotICAgIDE1NCwgNjIsMjI1LDIzMCwyMjksMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LDI1MSwgNzgsMjI3LDIyOSwKLSAgICAyMzgsMTE2LDEzMSwgIDAsIDM3LDE1MywxNTUsMTUzLDE2NCwxNTMsMTc2LDIyNSwyNDIsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwgIDYsMTA2LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsICA1LAotICAgIDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI1NCwxMDYsMTA1LCAgMiwxNTMsMTkwLDE1NCwgMzEsMjM5LDEwMCwKLSAgICAxMzQsICAwLCA0NiwxNTMsMjA3LDE1MywyMTgsMTUzLDIyOSwxNTMsMjQxLDE1MywyNTIsMTU0LCAgOCwyMjUsCi0gICAgMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsMTM3LDIyNywyMjksMjM4LDI0NCwyMjksMjQyLAotICAgIDIyOSwxMDAsMTI4LCAgMCwxODMsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwKLSAgICAgOTcsMjMzLDIzOCwyMzAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDIzMSwyMzcsMjM5LDIzOCwyMzksCi0gICAgMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAxNCwxMTUsICAyLDE1NCwgMTQsMTU0LCAyMSwyMzcsMjI1LAotICAgIDIzNiwxMDgsMTI4LDI1NCwgODIsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwyNDYsMjMyLDI0MywKLSAgICAyNDAsMjM5LDIzNywyMjksMjM4LDIzMywyMzEsMjQyLDIyOSwyMjksMjM1LDIyNywyMzcsIDk4LDEyOCwgIDMsCi0gICAgIDY2LDI0MCwyMjksMjM4LDIyOCwyMzMsMjI3LDI0NSwyMzYsMjI1LDExNCwxMjgsIDM0LDE2NSwyNDQsMjMyLAotICAgIDIzOSwyNDUsMjQzLDIyNSwyMzgsMTAwLDEyOCwgMzIsIDQ4LDI0MywyMjksMjQ0LCA5NywxMjgsIDMyLDE2NywKLSAgICAyMzAsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwxMzgsMTA0LCAgMywxNTQsIDk4LDE1NCwxNDgsCi0gICAgMTU1LCAyOSwgOTcsICAzLDE1NCwxMDYsMTU0LDExNiwxNTQsMTIzLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LAotICAgIDEwNSwxMjgsICA5LDE3MSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNDMsMjMxLDExNywgIDIsMTU0LDEzMCwKLSAgICAxNTQsMTM5LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTcxLDI0MiwyMzcsMjQ1LDIzNSwyMzIsCi0gICAgMTA1LDEyOCwgMTAsIDQzLDEwNSwxMzMsICAzLDE5OCwxNTQsMTYyLDE1NCwxNjYsMTU0LDI1MiwxNTUsICA0LAotICAgIDE1NSwgMTUsIDQ5LDEyOCwgIDMsMjEzLDIyOSwyNDUsMjQwLDEwNCwgIDQsMTU0LDE3OSwxNTQsMjE0LDE1NCwKLSAgICAyMjksMTU0LDIzOCwgOTcsICAyLDE1NCwxODUsMTU0LDIwMCwyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzUsCi0gICAgMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLDEyMiwyNDAsMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLAotICAgIDIyOSwyMjUsMTEwLDEyOCwgNTAsIDI2LDIyNywyMzMsMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwKLSAgICAyMjUsMTEwLDEyOCwgNTAsMTA4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDc3LDI0MCwyMjUsCi0gICAgMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgMTIsMjM2LDIyNSwyNDQsMjMzLAotICAgIDExMCwxMjgsICAyLDEyMCwyMzgsMjQ0LDIzMiwyNDUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDU4LDI0MywKLSAgICAyNDksMjM3LDIyNiwyMzksMjM2LDIzMSwyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywyMTMsMTExLCAgMywxNTUsCi0gICAgIDM3LDE1NSwgNDIsMTU1LCA2OCwyMzksMTA3LDEyOCwgIDEsMTY1LDI0MCwxMDQsICAyLDE1NSwgNDksMTU1LAotICAgICA1OCwyMjUsMjM4LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAzMCwyNDUsMjM4LDIzMSwyNDQsMjMyLDIyNSwKLSAgICAxMDUsMTI4LCAxNCwgMjgsMjQzLDIyNSwyMzcsMjQwLDIzMiwyMjUsMjM5LDI0NCwyMzIsMjI1LDEwNSwxMjgsCi0gICAgIDE0LCAzMiwxMDUsMTMzLCAgMywxOTIsMTU1LCA5NiwxNTYsIDUyLDE1NiwgNjMsMTU2LCA3NCwxNTYsIDg4LAotICAgIDIyOSwyNDUsMTEyLCAgNiwxNTUsMTEyLDE1NSwxNDcsMTU1LDE3OSwxNTUsMjA3LDE1NSwyMjEsMTU2LCAxNywKLSAgICAgOTcsICAyLDE1NSwxMTgsMTU1LDEzMywyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksCi0gICAgMjI1LDExMCwxMjgsIDUwLDExNSwyNDAsMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLAotICAgIDEyOCwgNTAsIDE5LDIyNywxMDUsICAyLDE1NSwxNTQsMTU1LDE2NiwyMjksMjQ1LDIyNywyMzUsMjM5LDI0MiwKLSAgICAyMjksMjI1LDExMCwxMjgsIDQ5LDExOCwyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsCi0gICAgMTI4LCA1MCwxMDEsMTA3LCAgMiwxNTUsMTg1LDE1NSwxOTksMjMzLDI0OSwyMjksMjM5LDIzNSwyMzUsMjM5LAotICAgIDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDExNCwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDY2LDI0MCwKLSAgICAyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwgIDUsMjQzLDIzMywyMzksCi0gICAgMTE1LCAgMiwxNTUsMjMwLDE1NiwgIDIsMTA3LCAgMiwxNTUsMjM2LDE1NSwyNTAsMjMzLDI0OSwyMjksMjM5LAotICAgIDIzNSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDExNiwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwKLSAgICAgNDksIDY4LDI0NCwyMzMsMjM1LDIyOSwyNDUsMjQ0LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksCi0gICAgMTE3LDExNiwgIDIsMTU2LCAyMywxNTYsIDM4LDIzMiwyMzMsMjI5LDI0NSwyNDQsMjMyLDIzNSwyMzksMjQyLAotICAgIDIyOSwyMjUsMTEwLDEyOCwgNDksMTE5LDIzMywyMzUsMjI5LDI0NSwyNDQsMjM1LDIzOSwyNDIsMjI5LDIyNSwKLSAgICAxMTAsMTI4LCA0OSwxMTUsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDExNiwyMzUsCi0gICAgMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMjEyLDI0MywyNDksMjM3LDIyNiwyMzksMjM2LAotICAgIDIzMSwyNDIsMjI5LDIyOSwxMDcsMTI4LCAgMywyMTQsMjQ3LDI0MiwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywKLSAgICAyMjUsMTEwLDEyOCwgIDUsMTMxLDIzNiwyNDUsMTE1LDEzMiwgIDAsIDQzLDE1NiwxMTUsMTU2LDEyNiwxNTYsCi0gICAgMTM1LDE1NiwxNjgsMjI2LDIyOSwyMzYsMjM5LDI0NywyMjcsMjM3LCA5OCwxMjgsICAzLCAzMSwyMjcsMjMzLAotICAgIDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM0LDE0OSwxMDksICAyLDE1NiwxNDEsMTU2LDE0OCwyMzMsMjM4LDI0NSwKLSAgICAxMTUsMTI4LCAgMCwxNzcsMTExLCAgMiwxNTYsMTU0LDE1NiwxNTgsMTAwLDEyOCwgIDIsMjE0LDIzOCwyMzksCi0gICAgMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCAxMSwxMTUsICAyLDE1NiwxNzQsMTU2LDE4MSwyMzcsMjI1LAotICAgIDIzNiwxMDgsMTI4LDI1NCwgOTgsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsMTIyLDEwOSwKLSAgICAgIDIsMTU2LDE5NywxNTYsMjA4LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgODAsCi0gICAgMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwyMTYsMTExLCAgNSwxNTYsMjI5LDE1NiwyNDAsMTU3LAotICAgICA1MSwxNTcsIDYyLDE1NywgNzIsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEyNSwKLSAgICAyMzMsMjM4LDI0NCwyMzMsMjM4LDIzMSwyMzMsMjM4LDIyOCwyMjksMTIwLCAgNCwxNTcsICA0LDE1NywgMTYsCi0gICAgMTU3LCAyOCwxNTcsIDQxLDIyOCwyMzksMjQ3LDIzOCwyNDcsMjMyLDIzMywyNDQsMTAxLDEyOCwgMzgsIDMxLAotICAgIDIzNiwyMjksMjMwLDI0NCwyNDcsMjMyLDIzMywyNDQsMTAxLDEyOCwgMzgsIDI4LDI0MiwyMzMsMjMxLDIzMiwKLSAgICAyNDQsMjQ3LDIzMiwyMzMsMjQ0LDEwMSwxMjgsIDM4LCAzMCwyNDUsMjQwLDI0NywyMzIsMjMzLDI0NCwxMDEsCi0gICAgMTI4LCAzOCwgMjksMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDIyMSwyNDAsMjM2LAotICAgIDIyNSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgMjcsMjQzLDI0NCwyMjUsMjM2LDIzNywyMjUsMjQyLDEwNywKLSAgICAxMjksIDQ4LCAxOCwxNTcsIDg1LDIzMCwyMjUsMjI3LDEwMSwxMjgsIDQ4LCAzMiwyNDAsMjI1LDI0MiwyMjksCi0gICAgMTEwLDEyOCwgMzYsMTcxLDExNCwgIDMsMTU3LDEwOCwxNTcsMTM0LDE1NywxNTksMTAxLCAgMiwxNTcsMTE0LAotICAgIDE1NywxMjIsMjI3LDIyOSwyMjgsMjI5LDExNSwxMjgsIDM0LDEyMiwyNDMsMjI3LDI0MiwyMzMsMjQwLDI0NCwKLSAgICAyMzMsMjM5LDExMCwxMjgsIDMzLCAzMCwyMzMsMjM3LDEwMSwgIDIsMTU3LDE0MiwxNTcsMTQ4LDIzNywyMzksCi0gICAgMTAwLDEyOCwgIDIsMTg1LDI0MiwyMjksMjQ2LDIyOSwyNDIsMjQzLDIyOSwxMDAsMTI4LCAzMiwgNTMsMTExLAotICAgICAgNCwxNTcsMTY5LDE1NywxNzYsMTU3LDE4NiwxNTcsMTk5LDIyOCwyNDUsMjI3LDExNiwxMjgsIDM0LCAxNSwKLSAgICAyMzQsMjI5LDIyNywyNDQsMjMzLDI0NiwxMDEsMTI4LCAzNSwgIDUsMjM2LDIzOSwyMzgsMjMxLDIyOSwyMjgsCi0gICAgMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMjUyLDExMiwgIDIsMTU3LDIwNSwxNTcsMjQyLDEwMSwgIDIsMTU3LAotICAgIDIxMSwxNTcsMjE4LDIzNiwyMzYsMjM5LDExNCwxMjgsIDM1LCAyNCwyNDIsMjQzLDExNywgIDIsMTU3LDIyNiwKLSAgICAxNTcsMjMzLDIyNiwyNDMsMjI5LDExNiwxMjgsIDM0LDEzMCwyNDAsMjI5LDI0MiwyNDMsMjI5LDExNiwxMjgsCi0gICAgIDM0LDEzMSwyMzksMjQyLDI0NCwyMzMsMjM5LDExMCwxMjksIDM0LCA1NSwxNTcsMjUzLDIyNSwxMDgsMTI4LAotICAgICAzNCwgMjksMTE1LCAgMiwxNTgsICA4LDE1OCwgNTEsMTA1LDEzMCwgIDMsMjAwLDE1OCwgMTYsMTU4LCAyNywKLSAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTEzLDIzNiwyMzMsMjQwLDIzOCwyMjksCi0gICAgMjQ1LDIzNywyMjUsMjQ0LDIyNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsMjI3LDIyNywyMzcsIDk4LAotICAgIDEyOCwgIDQsMTM0LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTc2LDExNywgIDIsMTU4LCA2NiwKLSAgICAxNTgsIDc3LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMTksMjM1LDIyNSwyNDQsCi0gICAgMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDIxNSwyNDYsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LAotICAgICA1MSwxODAsMjQ3LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTg2LDExMywxMzYsICAwLDExMywKLSAgICAxNTgsMTI4LDE1OSwxNzcsMTU5LDE4OCwxNTksMTk3LDE1OSwyMDQsMTU5LDIxNiwxNTksMjU0LDE2MCwgIDYsCi0gICAgIDk3LCAgNCwxNTgsMTM4LDE1OCwxNjEsMTU4LDIyNSwxNTksMTYwLDEwMCwgIDIsMTU4LDE0NCwxNTgsMTUwLAotICAgIDIyOSwyNDYsIDk3LDEyOCwgIDksIDg4LDIzNywyMjUsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwKLSAgICAxNjgsMTAyLCAgNCwxNTgsMTcxLDE1OCwxODAsMTU4LDE5NCwxNTgsMjEwLDIyNSwyNDIsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwgIDYsIDY2LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LAotICAgIDI1NCwyMTQsMjMzLDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwKLSAgICAyNTQsMjE1LDIzNywyMjksMjI4LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsCi0gICAgMjE2LDIzNywyMjUsMjQ0LDExNSwxMzYsICA1LDE4NCwxNTgsMjQ4LDE1OSwgMTIsMTU5LCAyNiwxNTksIDMxLAotICAgIDE1OSwgMzYsMTU5LCA0NSwxNTksIDYwLDE1OSwxNDcsIDQ5LCAgMywxNTksICAwLDE1OSwgIDQsMTU5LCAgOCwKLSAgICAgNDgsMTI4LCAgNSwxODQsIDk3LDEyOCwgIDUsMTg0LCA5OSwxMjgsICA1LDE4NCwgNTAsICAyLDE1OSwgMTgsCi0gICAgMTU5LCAyMiwgNTUsMTI4LCAgNSwxODQsIDU3LDEyOCwgIDUsMTg0LDE3OSwgNTEsMTI4LCAgNSwxODQsMjI4LAotICAgIDEwMSwxMjgsICA1LDE4NCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4NCwyMzgsMjI1LDI0MiwKLSAgICAyNDIsMjM5LDI0NywyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4NCwxMTMsICAyLDE1OSwgNjYsCi0gICAgMTU5LDEzMiwyMjUsMjQ0LDIyNSwxMTAsICA0LDE1OSwgNzksMTU5LCA4OCwxNTksMTAzLDE1OSwxMTksMjMyLAotICAgIDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODQsMjM4LDIyNSwyNDIsMjQyLDIzOSwyNDcsMjMyLDIyOSwKLSAgICAyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODQsMjQxLDI0NSwyMjUsMjQyLDI0NCwyMjksMjQyLDIzMiwyMjksCi0gICAgMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTg0LDI0NywyMzMsMjI4LDIyOSwyMzIsMjI5LDIyNiwyNDIsMjI5LAotICAgIDExOSwxMjgsICA1LDE4NCwyNDUsMjI1LDI0MiwyNDQsMjI5LDI0MiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwKLSAgICAxMjgsICA1LDE4NCwyNDcsMjMzLDIyOCwyMjksMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODQsCi0gICAgMjQyLDIzOCwyMjksMjQ5LDI0MCwyMjUsMjQyLDIyNSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LAotICAgIDE1OSwyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDE3LDIyNywyMzMsMjQyLDIyNywKLSAgICAyMzYsMTAxLDEyOCwgMzYsMjI0LDIzMiwyMzksMjM5LDEwNywxMjgsICAyLDE2MCwyMzcsMjM5LDIzOCwyMzksCi0gICAgMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA4MSwyMzksMTAyLDEzMCwgIDUsMjMxLDE1OSwyMjUsMTU5LAotICAgIDI0NSwyMjgsMjI1LDIzMSwyMjksMjQzLDEwNCwxMjksMjUxLCA3MSwxNTksMjM2LDIzMiwyMjksMjI2LDI0MiwKLSAgICAyMjksMTE5LDEyOCwyNTEsIDcxLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjMxLDI0MCwyMjUsCi0gICAgMjQyLDIyOSwxMTAsMTI4LCAzNiwxNzIsMTE3LCAgNCwxNjAsIDE2LDE2MCwgMjgsMTYwLDExNywxNjAsMjA0LAotICAgIDIyNSwyNDIsMjQ0LDIyOSwyNDIsMjM4LDIzOSwyNDQsMTAxLDEyOCwgMzgsMTA1LDIyNiwyNDUsMjQ0LDExNSwKLSAgICAxMzUsICA1LDE4NywxNjAsIDQ5LDE2MCwgNTQsMTYwLCA1OSwxNjAsIDY0LDE2MCwgNzMsMTYwLCA4OCwxNjAsCi0gICAgMTA0LDE3NywgNTYsMTI4LCAgNSwxODcsMTc4LCA1MywxMjgsICA1LDE4NywxNzksIDQ5LDEyOCwgIDUsMTg3LAotICAgIDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTg3LDIzOCwyMjUsMjQyLDI0MiwyMzksMjQ3LDIzMiwKLSAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTg3LDI0MSwyNDUsMjI1LDI0MiwyNDQsMjI5LDI0MiwyMzIsCi0gICAgMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4NywyNDcsMjMzLDIyOCwyMjksMjMyLDIyOSwyMjYsMjQyLAotICAgIDIyOSwxMTksMTI4LCAgNSwxODcsMjI5LDI0MywyNDQsMjMzLDIzOSwxMTAsMTMzLCAgMCwgNjMsMTYwLDEzNiwKLSAgICAxNjAsMTU5LDE2MCwxNzYsMTYwLDE4NCwxNjAsMTk2LDIyNSwxMTQsICAyLDE2MCwxNDMsMTYwLDE1MCwyMjUsCi0gICAgMjI2LDIzMywgOTksMTI4LCAgNiwgMzEsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgOTQsMjI4LAotICAgIDIzOSwyNDcsMTEwLDEyOSwgIDAsMTkxLDE2MCwxNjgsMjQzLDIzNywyMjUsMjM2LDEwOCwxMjgsMjQ3LDE5MSwKLSAgICAyMzEsMjQyLDIyOSwyMjksMTA3LDEyOCwgIDMsMTI2LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsCi0gICAgMTAxLDEyOCwyNTUsIDMxLDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI0NywgNjMsMjM5LDI0NCwxMDEsICA0LAotICAgIDE2MCwyMTYsMTYxLCAzMSwxNjEsIDUxLDE2MSwgODAsMjI4LDIyNiwxMDgsMTMzLCAgMCwgMzQsMTYwLDIzMiwKLSAgICAxNjAsMjM5LDE2MCwyNDYsMTYxLCAgMiwxNjEsIDIzLDIyNiwyMjUsMjQzLDEwMSwxMjgsIDMyLCAzMCwyMzYsCi0gICAgMjI5LDIzMCwxMTYsMTI4LCAzMiwgMjgsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LAotICAgIDI1NSwgIDIsMjQwLDI0MiwyMzMsMjM3LDEwMSwxMjksIDQ4LCAzMCwxNjEsIDEyLDI0MiwyMjksMjQ2LDIyOSwKLSAgICAyNDIsMjQzLDIyOSwxMDAsMTI4LCA0OCwgMjksMjQyLDIzMywyMzEsMjMyLDExNiwxMjgsIDMyLCAyOSwyMzYsCi0gICAgMjI5LDIzMCwxMTYsMTI5LCAzMiwgMjQsMTYxLCA0MCwyNDIsMjI5LDI0NiwyMjksMjQyLDI0MywyMjksMTAwLAotICAgIDEyOCwgMzIsIDI3LDExNCwgIDIsMTYxLCA1NywxNjEsIDY3LDIyOSwyNDYsMjI5LDI0MiwyNDMsMjI5LDEwMCwKLSAgICAxMjgsIDMyLCAyNywyMzMsMjMxLDIzMiwxMTYsMTI5LCAzMiwgMjUsMTYxLCA3NiwxMTAsMTI4LCAgMSwgNzMsCi0gICAgMjQzLDIzMywyMzgsMjMxLDEwOCwgIDIsMTYxLCA5MCwxNjEsIDk3LDIyNiwyMjUsMjQzLDEwMSwxMjgsIDMyLAotICAgICAyNiwxMDEsMTI5LCAgMCwgMzksMTYxLDEwMywyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwKLSAgICAxMjgsMjU1LCAgNywxMTQsMTQ1LCAgMCwxMTQsMTYxLDE1MywxNjIsMTU3LDE2MiwxNjgsMTYyLDIxNSwxNjMsCi0gICAgIDEwLDE2NCwgMjcsMTY0LCA1MSwxNjQsMTQ2LDE2NiwxODAsMTY2LDIxNywxNjYsMjI5LDE2NywgMjcsMTY3LAotICAgICAzNSwxNjcsMTk3LDE2NywyMDgsMTY3LDI0MywxNjgsIDg3LCA5NywgMTEsMTYxLDE3NywxNjEsMTg4LDE2MSwKLSAgICAxOTgsMTYxLDIwNSwxNjIsIDE0LDE2MiwgMzAsMTYyLCA1NSwxNjIsIDY2LDE2MiwgOTEsMTYyLDExNCwxNjIsCi0gICAgMTUxLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMjQsMjI2LDIyOSwyMzgsMjMxLAotICAgIDIyNSwyMzYsMTA1LDEyOCwgIDksMTc2LDIyNywyNDUsMjQ0LDEwMSwxMjgsICAxLCA4NSwxMDAsICA0LDE2MSwKLSAgICAyMTUsMTYxLDIyMSwxNjEsMjM1LDE2MiwgIDUsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNDgsMjMzLDIyNywyMjUsCi0gICAgMTA4LDEyOSwgMzQsIDI2LDE2MSwyMzAsMjI5LDEyMCwxMjgsMjQ4LDIyOSwyMzksMjQ2LDIyOSwyNDIsMjQzLAotICAgIDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOSwgNTEsMTc0LDE2MSwyNTEsMjI4LDI0MywyNDEsMjQ1LDIyNSwKLSAgICAyNDIsMTAxLDEyOCwgNTEsMTc1LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMTczLDIzMCwxMDEsCi0gICAgMTI5LCAgNSwxOTEsMTYyLCAyMSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE5MSwyMzEsMTE3LAotICAgICAgMiwxNjIsIDM3LDE2MiwgNDYsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxNzYsMjQyLDIzNywKLSAgICAyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgNDgsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsCi0gICAgIDQ4LDEzNywyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjMzLDE2MiwgNzksMjMyLAotICAgIDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxNTEsMjM2LDIzOSwyNDcsMjI5LDI0MiwKLSAgICAyMjgsMjMzLDIyNSwyMzEsMjM5LDIzOCwyMjUsMjM2LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsCi0gICAgICA5LDI0MSwxMDksICAyLDE2MiwxMjAsMTYyLDE0MywyMzMsMjI4LDIyOCwyMzYsMjI5LDIyOCwyMzMsMjI1LAotICAgIDIzMSwyMzksMjM4LDIyNSwyMzYsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjQwLDI0MywKLSAgICAyMzIsMjM5LDI0MiwxMTAsMTI4LCAgMiwxMDAsMjQ0LDIzMywxMTEsMTI4LCAzNCwgNTQsMjI2LDIzOSwyNDAsCi0gICAgMjM5LDIzNywyMzksMjMwLDExMSwxMjgsIDQ5LCAyMiwgOTksICA0LDE2MiwxNzgsMTYyLDE4NSwxNjIsMTk0LAotICAgIDE2MiwyMDIsMjI1LDI0MiwyMzksMTEwLDEyOCwgIDEsIDg5LDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwKLSAgICAgIDEsIDg3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwyMjUsMjM5LDIzNywyMzcsMjI1LDIyNSwyMjcsCi0gICAgMjI3LDIyOSwyMzgsMTE2LDEyOCwgIDEsIDg3LDEwMCwgIDIsMTYyLDIyMSwxNjIsMjMxLDIyNiwyMzYsMjMxLAotICAgIDI0MiwyMjUsMjQ2LDEwMSwxMjgsICAyLCAxNywyMzksMTE2LCAgMiwxNjIsMjM4LDE2MiwyNDcsMjI1LDIyNywKLSAgICAyMjcsMjI5LDIzOCwxMTYsMTI4LCAzMCwgODksMjI2LDIyOSwyMzYsMjM5LDExOSwxMjksIDMwLCA5MSwxNjMsCi0gICAgICAxLDIzNywyMjUsMjI3LDI0MiwyMzksMTEwLDEyOCwgMzAsIDkzLDEwMSwgIDYsMTYzLCAyNCwxNjMsIDY5LAotICAgIDE2MywxMDQsMTYzLDE1OSwxNjMsMTg0LDE2MywyMTcsMTAyLCAgMiwxNjMsIDMwLDE2MywgNDMsMjI5LDI0MiwKLSAgICAyMjksMjM4LDIyNywyMjksMjM3LDIyNSwyNDIsMTA3LDEyOCwgMzIsIDU5LDIzNiwyMjksMjQ4LDI0MywxMTcsCi0gICAgICAyLDE2MywgNTMsMTYzLCA2MCwyMjYsMjQzLDIyOSwxMTYsMTI4LCAzNCwxMzQsMjQwLDIyOSwyNDIsMjQzLAotICAgIDIyOSwxMTYsMTI4LCAzNCwxMzUsMjMxLDIzMywyNDMsMjQ0LDIyOSwxMTQsICAyLDE2MywgODAsMTYzLCA4NSwKLSAgICAyMjksMTAwLDEyOCwgIDAsMTc0LDExNSwgIDIsMTYzLCA5MSwxNjMsIDk3LDIyNSwyMzgsMTE1LDEyOCwyNDgsCi0gICAgMjMyLDIyOSwyNDIsMjMzLDEwMiwxMjgsMjQ2LDIxOCwxMDQsICAzLDE2MywxMTIsMTYzLDEzNSwxNjMsMTQ5LAotICAgIDIyNSwxMTQsICAyLDE2MywxMTksMTYzLDEyNiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNDksMjM3LDIyOSwKLSAgICAyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMjgsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsCi0gICAgMjMzLCA5OSwxMjgsMjU0LDE3NCwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxNDAsMjM1LAotICAgIDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIzNiwxNjMsMTcyLDIzMiwyMjUsMjM2LDIzMCwKLSAgICAyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTU0LDI0MywxMDQsMTMwLCAgNSwyMzIsMTYzLDE5MywxNjMsCi0gICAgMjA4LDIyOCwyMjUsMjMxLDIyOSwyNDMsMjMyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDcyLAotICAgIDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjMyLDExOCwgIDMsMTYzLDIyNSwxNjMsMjM4LDE2NCwKLSAgICAgMTQsMjI5LDI0MiwyNDMsMjI5LDIyOCwyNDQsMjMzLDIzNiwyMjgsMTAxLDEyOCwgMzQsIDYxLDIzMywgOTcsCi0gICAgICAyLDE2MywyNDUsMTYzLDI1NCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE1MSwyMzcsMjQ1LAotICAgIDIzMSwyNDIsMjI1LDI0MywyMzIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNTEsMjM2LDIzOSwKLSAgICAyMzEsMjMzLDIyNywyMjUsMjM2LDIzOCwyMzksMTE2LDEyOCwgMzUsIDE2LDIzMCwyMzMsMjQzLDIzMiwyMzIsCi0gICAgMjM5LDIzOSwxMDcsMTI5LCAgMiwxMjYsMTY0LCA0MCwyNDIsMjI5LDI0NiwyMjksMjQyLDI0MywyMjksMTAwLAotICAgIDEyOCwgIDIsMTI3LDEwNCwgIDIsMTY0LCA1NywxNjQsIDgwLCA5NywgIDIsMTY0LCA2MywxNjQsIDczLDIyNiwKLSAgICAyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIyMSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgOTMsCi0gICAgMTExLDEzMSwgIDMsMTkzLDE2NCwgOTAsMTY0LDExOSwxNjQsMTMzLDIzOSwxMDcsMTI5LCAgMiwxMjUsMTY0LAotICAgICA5NywyNDQsMjQ1LDI0MiwyMzgsMjI5LDEwMCwxMjksICAyLDEyMywxNjQsMTA4LDI0MywyNDUsMjQwLDIyOSwKLSAgICAyNDIsMjMzLDIzOSwxMTQsMTI4LCAgMiwxODEsMjQzLDI0OSwyMzcsMjI2LDIzOSwyMzYsMjMxLDI0MiwyMjksCi0gICAgMjI5LDEwNywxMjgsICAzLDI0MSwyNDQsMjMzLDIyNywyMzIsMjM5LDIzOSwyMzUsMjM3LDIzOSwxMDAsMTI4LAotICAgICAgMiwyMjIsMTA1LCAgNiwxNjQsMTYwLDE2NSwyMDQsMTY1LDI1MCwxNjYsICA1LDE2NiwgMzAsMTY2LDE2NiwKLSAgICAyMjksMjQ1LDEwOCwgIDksMTY0LDE4MiwxNjQsMjE3LDE2NCwyMzIsMTY0LDI0NiwxNjUsIDM2LDE2NSwgNTAsCi0gICAgMTY1LDEzNiwxNjUsMTQ5LDE2NSwxODQsIDk3LCAgMiwxNjQsMTg4LDE2NCwyMDMsMjI3LDIzMywyNDIsMjI3LAotICAgIDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA1MCwxMTMsMjQwLDIyNSwyNDIsMjI5LDIzOCwKLSAgICAyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAxNywyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzUsCi0gICAgMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCA5OSwyMzIsMjMzLDIyOSwyNDUsMjMyLDIzNSwyMzksMjQyLAotICAgIDIyOSwyMjUsMTEwLDEyOCwgNDksIDY0LDEwNywgIDIsMTY0LDI1MiwxNjUsIDI4LDIzMywyNDksMjI5LDIzOSwKLSAgICAxMDcsICAyLDE2NSwgIDYsMTY1LCAxNSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA1OCwyNDMsCi0gICAgMjMzLDIzOSwyNDMsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMDUsMjM5LDI0MiwyMjksMjI1LAotICAgIDExMCwxMjgsIDQ5LCA1NywyMzcsMjMzLDIyOSwyNDUsMjM3LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwKLSAgICAgNDksIDU5LDExMiwgIDMsMTY1LCA1OCwxNjUsIDkwLDE2NSwxMDUsIDk3LCAgMiwxNjUsIDY0LDE2NSwgNzgsCi0gICAgMjM4LDI0MywyMzMsMjM5LDI0MywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDEwOCwyNDIsMjI5LAotICAgIDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLCAgMywyMzIsMjMzLDIyOSwyNDUsMjQwLDIzMiwKLSAgICAyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA2MywyMzMsMjI5LDI0NSwxMTIsICAyLDE2NSwxMTQsCi0gICAgMTY1LDEyMywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA2MCwyNDMsMjMzLDIzOSwyNDMsMjM1LAotICAgIDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMDcsMjQzLDIzMywyMzksMjQzLDIzNSwyMzksMjQyLDIyOSwKLSAgICAyMjUsMTEwLDEyOCwgNDksIDYxLDExNiwgIDIsMTY1LDE1NSwxNjUsMTcwLDIzMiwyMzMsMjI5LDI0NSwyNDQsCi0gICAgMjMyLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDYyLDIzMywyMzUsMjI5LDI0NSwyNDQsMjM1LAotICAgIDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMDYsMjQ5LDIyOSwyMzksMjQyLDIzMywyMzgsMjMyLDIzMywKLSAgICAyMjksMjQ1LDIzMiwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDEwOSwyMzEsMjMyLDExNiwgIDIsCi0gICAgMTY1LDIxMiwxNjUsMjIwLDIyNSwyMzgsMjMxLDIzNiwxMDEsMTI4LCAzNCwgMzEsMTE2LCAgMiwxNjUsMjI2LAotICAgIDE2NSwyNDAsMjI1LDIyNywyMzUsMjI2LDIyOSwyMzYsMjM5LDI0NywyMjcsMjM3LCA5OCwxMjgsICAzLCAyNSwKLSAgICAyNDIsMjMzLDIyNSwyMzgsMjMxLDIzNiwxMDEsMTI4LCAzNCwxOTEsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsCi0gICAgMjM4LCA5NywxMjgsIDQ4LDEzOCwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjM0LAotICAgIDE2NiwgMTgsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxNTIsMTEwLCAgMiwKLSAgICAxNjYsIDM2LDE2NiwxNTIsMTAzLDEzMSwgIDIsMjE4LDE2NiwgNDYsMTY2LCA1NywxNjYsIDYzLDIyNiwyMjksCi0gICAgMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgMzcsMjI3LDIzNywgOTgsMTI4LCAgMywgMTAsMjMyLAotICAgIDIyNSwyMzYsMTAyLCAgMiwxNjYsIDcyLDE2NiwxMTgsMjM2LDIyOSwyMzAsMTE2LDEzMSwgIDIsMTkxLDE2NiwKLSAgICAgODUsMTY2LCA5NiwxNjYsMTA3LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwgODksCi0gICAgMjI2LDIyOSwyMzYsMjM5LDI0NywyMjcsMjM3LCA5OCwxMjgsICAzLCAyOCwyMjcsMjI5LDIzOCwyNDQsMjI5LAotICAgIDI0MiwyMjksMTAwLDEyOCwgIDIsMjExLDI0MiwyMzMsMjMxLDIzMiwxMTYsMTMwLCAgMiwxOTAsMTY2LDEzMCwKLSAgICAxNjYsMTQxLDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgNTcsMjI3LDIyOSwyMzgsCi0gICAgMjQ0LDIyOSwyNDIsMjI5LDEwMCwxMjgsICAyLDIxMCwyNDYsMjI5LDI0MiwyNDQsMjI5LDIyOCwyMjYsMjQyLAotICAgIDIyOSwyNDYsMTAxLDEyOCwgIDIsIDE5LDI0NCwyNDQsMjM5LDI0MiwyNDUsMjQzLDI0MSwyNDUsMjI1LDI0MiwKLSAgICAxMDEsMTI4LCA1MSwgODEsMTA4LCAgMiwxNjYsMTg2LDE2NiwxOTcsMjMzLDIzOCwyMjksMjI2LDIyOSwyMzYsCi0gICAgMjM5LDExOSwxMjgsIDMwLCA5NSwyMzksMjM4LDIzMSwyMzYsMjI5LDEwMywxMjksICAyLDEyNCwxNjYsMjA4LAotICAgIDI0NCwyNDUsMjQyLDIzOCwyMjksMTAwLDEyOCwgIDIsMTIyLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwKLSAgICAyMjcsMTAxLDEyOCwyNTUsIDgyLDExMSwgIDMsMTY2LDIzNywxNjYsMjQ4LDE2NywgMTcsMjMyLDIzMywyNDIsCi0gICAgMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE0MSwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LAotICAgIDEyOSwgNDgsMjM3LDE2NywgIDUsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwKLSAgICAxNTUsMjQyLDI0NSwyMjUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDM1LDI0MCwyMjUsMjQyLDIyOSwxMTAsCi0gICAgMTI4LCAzNiwxNzMsMTE0LCAgMywxNjcsIDQzLDE2NywgNzksMTY3LDEwOSwgOTcsICAzLDE2NywgNTEsMTY3LAotICAgICA2MSwxNjcsIDY4LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIyMCwyMjgsMjI5LDI0NiwKLSAgICAgOTcsMTI4LCAgOSwgNDksMjMxLDI0NSwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLCA5MiwyMjksCi0gICAgMTA0LCAgMiwxNjcsIDg2LDE2NywgOTUsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxNDUsMjMwLAotICAgIDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUxLDE0MSwyNDYsMjM5LDIyNywKLSAgICAyMjUsMjM2LDIzMywgOTksICA0LDE2NywxMjUsMTY3LDEzNSwxNjcsMTQyLDE2NywxNTMsMjI2LDIyOSwyMzgsCi0gICAgMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjI0LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA5NiwyMzEsMjQ1LAotICAgIDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMjI0LDI0NiwyMzksMjQ3LDIyOSwyMzYsMjQzLDIzMywKLSAgICAyMzEsMTEwLCAgMywxNjcsMTY5LDE2NywxNzksMTY3LDE4NiwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsCi0gICAgMTI4LCAgOSwxOTYsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDY4LDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LAotICAgIDI0NCwxMDUsMTI4LCAxMCwxOTYsMjQzLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsMjQ2LDI0MSwKLSAgICAxMTYsICAyLDE2NywyMTQsMTY3LDIyMiwyMjYsMjM2LDIzOSwyMjcsMTA3LDEyOCwgMzcsMTQ0LDI0NSwyNDIsCi0gICAgMjM4LDIyOSwxMDAsMTI5LCAgMiwxMjEsMTY3LDIzMiwyNDMsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LAotICAgIDEyOCwgIDIsMTgwLDExNywgIDQsMTY3LDI1MywxNjgsICA4LDE2OCwgMzMsMTY4LCA4MCwyMzIsMjMzLDI0MiwKLSAgICAyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTM5LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsCi0gICAgMTI5LCA0OCwyMzUsMTY4LCAyMSwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LAotICAgIDE1MywxMTIsICAyLDE2OCwgMzksMTY4LCA3NCwyMjksMTAxLCAgMiwxNjgsIDQ2LDE2OCwgNjAsMjM3LDIyNSwKLSAgICAyNDIsMjM1LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDI0MiwyNDMsMjMzLDIzMSwyMzgsCi0gICAgMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMjQzLDIzMywyMjUsMTA0LDEyOCwyNDYsMjIxLAotICAgIDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAzNiwyNDYsMjM5LDIyNywyMjUsMjM2LDIzMywgOTksICA0LDE2OCwKLSAgICAxMDMsMTY4LDExMywxNjgsMTIwLDE2OCwxMzEsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksCi0gICAgMTM5LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCAxMSwyMzEsMjQ1LDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LAotICAgIDEyOCwgMTAsMTM5LDI0NiwyMzksMjQ3LDIyOSwyMzYsMjQzLDIzMywyMzEsMTEwLCAgMywxNjgsMTQ3LDE2OCwKLSAgICAxNTcsMTY4LDE2NCwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxOTUsMjI4LDIyOSwyNDYsCi0gICAgIDk3LDEyOCwgIDksIDY3LDIzMSwyNDUsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxOTUsMTE1LAotICAgIDE0NywgIDAsMTE1LDE2OCwyMTcsMTcwLDE4NywxNzAsMTk4LDE3MSwgNjgsMTcxLDEwNywxNzQsIDQ5LDE3NCwKLSAgICAgNjAsMTc2LDIwMywxNzksIDg1LDE3OSwxMzEsMTc5LDE1OCwxODAsIDkzLDE4MCwxNjAsMTgxLDE5MywxODEsCi0gICAgMjAzLDE4MiwxMzMsMTgyLDIwNiwxODMsMTIwLDE4MywxMzAsIDk3LCAgOSwxNjgsMjM3LDE2OCwyNDcsMTY5LAotICAgICAxMiwxNjksIDg0LDE2OSwxMDksMTY5LDEyMCwxNjksMTQ1LDE2OSwxNzcsMTY5LDIxNywyMjYsMjI5LDIzOCwKLSAgICAyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxODQsMjI3LDI0NSwyNDQsMTAxLDEyOSwgIDEsIDkxLDE2OSwgIDAsCi0gICAgMjI4LDIzOSwyNDQsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAzMCwxMDEsMTAwLCAgNSwxNjksIDI0LAotICAgIDE2OSwgMzMsMTY5LCAzOSwxNjksIDUzLDE2OSwgNjksMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwKLSAgICAgNTMsMjI5LDI0NiwgOTcsMTI4LCAgOSwgNTYsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsCi0gICAgMjMzLCA5OSwxMjgsMjU0LDE4NiwyMzMsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LAotICAgIDIzMywgOTksMTI4LDI1NCwxODcsMjM3LDIyOSwyMjgsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywKLSAgICAgOTksMTI4LDI1NCwxODgsMjMxLDExNywgIDIsMTY5LCA5MSwxNjksMTAwLDIzNCwyMjUsMjQyLDIyNSwyNDQsCi0gICAgMTA1LDEyOCwgMTAsMTg0LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDU2LDIzMiwyMzMsMjQyLAotICAgIDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgODUsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywKLSAgICAxMjksIDQ4LDE4MSwxNjksMTMzLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsCi0gICAgMTIzLDIzNiwyMzYsMjI1LDIzNiwyMzYsMjI1LDIzMiwyMzksMjQ1LDIyNSwyMzYsMjI1LDI0OSwyMzIsMjI5LAotICAgIDI0NywyMjUsMjQzLDIyNSwyMzYsMjM2LDIyNSwyMzcsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MywKLSAgICAyNTAsMjM3LDIyOSwyMzUsMTA0LDEzMCwgIDUsMjI1LDE2OSwxODgsMTY5LDIwOCwyMjgsMjI1LDIzMSwyMjksCi0gICAgMjQzLDEwNCwxMjksMjUxLCA2NSwxNjksMTk5LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDY1LAotICAgIDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjI1LDI0MiwgOTcsICA1LDE2OSwyMzAsMTcwLCA0OCwKLSAgICAxNzAsIDU2LDE3MCwxMDYsMTcwLDExNCwgOTcsICA1LDE2OSwyNDIsMTY5LDI1MCwxNzAsICAyLDE3MCwgMzMsCi0gICAgMTcwLCA0MSwyMjUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDUwLDIyOSwyNDQsMjMyLDIyNSwxMDUsMTI4LAotICAgICAxNCwgNjUsMjMzLDIzNywyMjUsMjMzLDEwOSwgIDIsMTcwLCAxMiwxNzAsIDIzLDIyNSwyMzYsMjI1LDIzMywKLSAgICAyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNjgsMjQ1LDIyNSwyMzgsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsCi0gICAgIDY3LDIzNywyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNTEsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDQ4LAotICAgIDIyOSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNjQsMTA1LCAgMywxNzAsIDY0LDE3MCwgODgsMTcwLCA5OSwKLSAgICAxMDUsICAyLDE3MCwgNzAsMTcwLCA4MSwyMzYsMjI5LDIzMCwyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwyNDgsCi0gICAgMTM0LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA1MywyMzYsMjI5LDIzMCwyNDQsMjQ0LDIzMiwyMjUsMTA1LAotICAgIDEyOCwyNDgsMTMzLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA1MiwyMzksMjQ0LDIzMiwyMjUsMTA1LDEyOCwKLSAgICAgMTQsIDY2LDExNywgIDMsMTcwLDEyMiwxNzAsMTcyLDE3MCwxNzksMTAxLCAgMywxNzAsMTMwLDE3MCwxNTQsCi0gICAgMTcwLDE2NSwxMDEsICAyLDE3MCwxMzYsMTcwLDE0NywyMzYsMjI5LDIzMCwyNDQsMjQ0LDIzMiwyMjUsMTA1LAotICAgIDEyOCwyNDgsMTM2LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA1NSwyMzYsMjI5LDIzMCwyNDQsMjQ0LDIzMiwKLSAgICAyMjUsMTA1LDEyOCwyNDgsMTM1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA1NCwyNDQsMjMyLDIyNSwxMDUsCi0gICAgMTI4LCAxNCwgNTYsMjQ1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA1NywyMjYsMjM5LDI0MCwyMzksMjM3LAotICAgIDIzOSwyMzAsMTExLDEyOCwgNDksIDI1LCA5OSwgIDUsMTcwLDIxMCwxNzAsMjMxLDE3MCwyNDAsMTcxLCAzMywKLSAgICAxNzEsIDU1LDIyNSwyNDIsMjM5LDExMCwxMjksICAxLCA5NywxNzAsMjE5LDIyOCwyMzksMjQ0LDIyNSwyMjcsCi0gICAgMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsMTAzLDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgIDEsIDk1LAotICAgIDIzMiwyNDcsIDk3LDEzMSwgIDIsIDg5LDE3MCwyNTIsMTcxLCAgNywxNzEsIDI2LDIyNywyNDksMjQyLDIzMywKLSAgICAyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwyMTcsMjI4LDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDI0MywyMjcsCi0gICAgMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjE5LDIzMiwyMzksMjM5LDEwNywxMjgsICAyLAotICAgICA5MCwyMzMsMjQyLCA5OSwgIDIsMTcxLCA0MSwxNzEsIDQ2LDIzNiwxMDEsMTI4LCAzNiwyMjYsMjQ1LDIzNywKLSAgICAyMzAsMjM2LDIyOSwxMjAsMTI4LCAgMSwgOTMsMjM5LDIzNywyMzcsMjI1LDIyNSwyMjcsMjI3LDIyOSwyMzgsCi0gICAgMTE2LDEyOCwgIDIsIDI1LDIyOCwyMzksMTE2LCAgMiwxNzEsIDc2LDE3MSwgODUsMjI1LDIyNywyMjcsMjI5LAotICAgIDIzOCwxMTYsMTI4LCAzMCwgOTcsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjksIDMwLCA5OSwxNzEsIDk1LDIyOCwKLSAgICAyMzksMjQ0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsMTA1LDEwMSwgIDksMTcxLDEyNywxNzEsCi0gICAgMTQzLDE3MSwxNzgsMTcxLDI0MywxNzIsIDkwLDE3MiwxMTcsMTcyLDE0MiwxNzIsMjIzLDE3MiwyNTAsMjI1LAotICAgIDIzMSwyNDUsMjM2LDIzNiwyMjYsMjI5LDIzNiwyMzksMjQ3LDIyNywyMzcsIDk4LDEyOCwgIDMsIDYwLCA5OSwKLSAgICAgIDIsMTcxLDE0OSwxNzEsMTcxLDIzOSwyMzgsMTAwLDEyOSwgMzIsIDUxLDE3MSwxNTcsMjQ0LDIzOSwyMzgsCi0gICAgMjI5LDIyNywyMzIsMjMzLDIzOCwyMjksMjQzLDEwMSwxMjgsICAyLDIwMiwyNDQsMjMzLDIzOSwxMTAsMTI4LAotICAgICAgMCwxNjcsMjI5LDExMCwgIDQsMTcxLDE4OSwxNzEsMTk4LDE3MSwyMTIsMTcxLDIyOCwyMjUsMjQyLDIyNSwKLSAgICAyMjYsMjMzLCA5OSwxMjgsICA2LCA1MSwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwyNTQsMTc4LDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLAotICAgICA5OSwxMjgsMjU0LDE3OSwyMzcsMjI5LDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwKLSAgICAxMjgsMjU0LDE4MCwyMzEsMjM5LDEwOCwxMzUsICA1LDE4MiwxNzIsICA3LDE3MiwgMjEsMTcyLCAyNiwxNzIsCi0gICAgIDM1LDE3MiwgNTAsMTcyLCA2NiwxNzIsIDc3LCA0OSwgIDIsMTcyLCAxMywxNzIsIDE3LCA1MSwxMjgsICA1LAotICAgIDE4MiwxMDIsMTI4LCAgNSwxODIsMTc4LCA5OSwxMjgsICA1LDE4MiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwKLSAgICAxMjgsICA1LDE4MiwyMzgsMjI1LDI0MiwyNDIsMjM5LDI0NywyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsCi0gICAgICA1LDE4MiwyNDEsMjQ1LDIyNSwyNDIsMjQ0LDIyOSwyNDIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAotICAgICAgNSwxODIsMjQ0LDIyNSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE0NiwyNDcsMjMzLDIyOCwKLSAgICAyMjksMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODIsMTA0LCAgMiwxNzIsIDk2LDE3MiwxMDcsCi0gICAgMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDEyNSwyMzMsMjQyLDIyNSwyMzEsMjI1LAotICAgIDIzOCwgOTcsMTI4LCA0OCwgOTEsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDE4NywKLSAgICAxNzIsMTMwLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTI2LDIzNywxMDUsCi0gICAgICAyLDE3MiwxNDksMTcyLDE5MiwyMjcsMjM5LDIzNiwyMzksMTEwLDEzMSwgIDAsIDU5LDE3MiwxNjMsMTcyLAotICAgIDE3MiwxNzIsMTg0LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDI3LDIzNywyMzksMjM4LDIzOSwKLSAgICAyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDI3LDI0MywyMzcsMjI1LDIzNiwxMDgsMTI4LDI1NCwgODQsCi0gICAgMjQ2LDIzOSwyMzMsMjI3LDIyOSwyMjgsMjM3LDIyNSwyNDIsMjM1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LAotICAgIDE1NiwxNzIsMjExLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTU5LDIzOCwKLSAgICAxMTYsICAyLDE3MiwyMzAsMTcyLDI0MCwyMzMsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgMzQsCi0gICAgMjM5LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsIDM1LDI0NiwyMjksMTEwLDE0MiwgIDAsIDU1LAotICAgIDE3MywgMjgsMTczLCAzNywxNzMsIDQ3LDE3MywgNzcsMTczLCA4NCwxNzMsIDk0LDE3MywxMTksMTczLDE0NiwKLSAgICAxNzMsMTgwLDE3MywxOTIsMTczLDIwMywxNzMsMjM2LDE3MywyNDQsMTczLDI1NSwyMjUsMjQyLDIyNSwyMjYsCi0gICAgMjMzLCA5OSwxMjgsICA2LDEwMywyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMzcsMjI3LAotICAgIDIzMywyNDIsMjI3LDIzNiwxMDEsMTI5LCAzNiwxMDIsMTczLCA1OCwyMzMsMjM4LDI0NiwyMjksMjQyLDI0MywKLSAgICAyMjksMjQzLDIyNSwyMzgsMjQzLDI0MywyMjksMjQyLDIzMywxMDIsMTI4LCAzOSwxNDQsMjI4LDIyOSwyNDYsCi0gICAgIDk3LDEyOCwgIDksMTA5LDIyOSwyMzMsMjMxLDIzMiwyNDQsMjMyLDExNSwxMjgsIDMzLCA5NCwyMzEsMTE3LAotICAgICAgMiwxNzMsMTAxLDE3MywxMTAsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwyMzcsMjQyLDIzNywKLSAgICAyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwxMDksMjMyLCA5NywgIDIsMTczLDEyNiwxNzMsMTM3LDIyNywyMzUsCi0gICAgMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxMDMsMjM4LDIzMSwyNTAsMjMyLDIzOSwxMTcsMTI4LAotICAgICA0OCwgMzksMTA1LCAgMiwxNzMsMTUyLDE3MywxNzAsMjI4LDIyOSwyMzksMjMxLDI0MiwyMjUsMjQwLDIzMiwKLSAgICAyMzMsMjI3LDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgMzgsMjM4LDIzMCwyMjksMjQyLDIzMywyMzksCi0gICAgMTE0LDEyOCwgMzIsMTM1LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDIzLAotICAgIDIzOSwyMzYsMjI4LDI0MywyNDQsMjQ5LDIzNiwxMDEsMTI4LDI0NywgNTUsMTEyLCAgMiwxNzMsMjA5LDE3MywKLSAgICAyMTYsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTIyLDIyOSwxMTQsICAyLDE3MywyMjMsMTczLDIyOSwyMzMsCi0gICAgMjM5LDEwMCwxMjgsIDM2LDE0MiwyNDMsMjMzLDIyNSwxMTAsMTI4LCAgNiwyNDcsMjQyLDIzOSwyMzcsMjI1LAotICAgIDExMCwxMjgsIDMzLDExOCwyNDMsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsMTE5LDExNiwKLSAgICAgIDIsMTc0LCAgNSwxNzQsIDQzLDIyOSwyMjksMTEwLCAgMiwxNzQsIDEzLDE3NCwgMjIsMjI3LDIzMywyNDIsCi0gICAgMjI3LDIzNiwxMDEsMTI4LCAzNiwxMTIsMTEyLCAgMiwxNzQsIDI4LDE3NCwgMzUsMjI1LDI0MiwyMjksMTEwLAotICAgIDEyOCwgMzYsMTMyLDIyOSwyNDIsMjMzLDIzOSwxMDAsMTI4LCAzNiwxNTIsMjMyLDIyNSwxMDUsMTI4LCAxNCwKLSAgICAgODcsMjMwLDI0NCwyMzIsMjQ5LDI0MCwyMzIsMjI5LDExMCwxMjgsICAwLDE3MywxMDQsICA3LDE3NCwgNzYsCi0gICAgMTc1LCA1MCwxNzUsIDYxLDE3NSwgNzUsMTc2LCAyMCwxNzYsIDMzLDE3NiwxOTcsIDk3LCAgNiwxNzQsIDkwLAotICAgIDE3NCwxMDEsMTc0LDExMSwxNzQsMTIyLDE3NSwgIDksMTc1LCAzNCwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywKLSAgICAyMjUsMTEwLDEyOCwgIDUsMTE5LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE4MiwyMjcsCi0gICAgMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDcyLDEwMCwgIDIsMTc0LDEyOCwxNzQsMjI0LAotICAgIDIyOCwgOTcsICA0LDE3NCwxMzksMTc0LDE0OCwxNzQsMTc5LDE3NCwxOTMsMjI1LDI0MiwyMjUsMjI2LDIzMywKLSAgICAgOTksMTI4LCAgNiwgODEsMjI4LDIyNSwyMzcsMjM3LCA5NywgIDIsMTc0LDE1OCwxNzQsMTY3LDIyNSwyNDIsCi0gICAgMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsIDk3LDI0NCwyMjUsMjM4LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LAotICAgIDEyOCwyNTIsIDk0LDIzMCwyMjUsMjQ0LDIzMiwyMjUsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwKLSAgICAgOTYsMjM1LDIyNSwyNDMsMjQyLCA5NywgIDIsMTc0LDIwMywxNzQsMjEyLDIyNSwyNDIsMjI1LDIyNiwyMzMsCi0gICAgIDk5LDEyOCwyNTIsIDk4LDI0NCwyMjUsMjM4LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsIDk1LAotICAgIDEwMSwxMzIsIDM3LDE0NiwxNzQsMjM2LDE3NCwyNDMsMTc0LDI1MSwxNzUsICA0LDIyOCwyMjUsMjQyLDEwNywKLSAgICAxMjgsIDM3LDE0NywyMzYsMjMzLDIzMSwyMzIsMTE2LDEyOCwgMzcsMTQ1LDIzNywyMjksMjI4LDIzMywyNDUsCi0gICAgMTA5LDEyOCwgMzcsMTQ2LDI0NiwgOTcsMTI4LCAgOSwgNTQsMjMxLDExNywgIDIsMTc1LCAxNiwxNzUsIDI1LAotICAgIDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTgyLDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwKLSAgICAgMTAsIDU0LDIzNiwyNDMsMjMyLDIyOSwyMzYsMjI5LDI0NCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsCi0gICAgICA1LDE0NywyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDIxLDIyNywyMzIsMjI1LAotICAgIDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNzMsMTAxLCAgNCwxNzUsIDg1LDE3NSwKLSAgICAxNTAsMTc1LDE2MCwxNzUsMTc3LDIyOSwxMTAsICA0LDE3NSwgOTYsMTc1LDEwNSwxNzUsMTE5LDE3NSwxMzUsCi0gICAgMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNTIsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLAotICAgIDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE4MiwyMzMsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwKLSAgICAyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxODMsMjM3LDIyOSwyMjgsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsCi0gICAgMjI2LDIzMywgOTksMTI4LDI1NCwxODQsMjMzLDIyNywyMzksMjQwLDI0NCwyMzMsIDk5LDEyOCwgIDMsMjI3LAotICAgIDI0MSwyMjksMTA4LDEyOSwgMzIsMTcwLDE3NSwxNjgsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAzMiwKLSAgICAxNzAsMjQ2LCA5NywxMzQsICA1LDE3NiwxNzUsMTk0LDE3NSwyMDksMTc1LDIyMywxNzUsMjMyLDE3NSwyNDcsCi0gICAgMTc2LCAgNywgNDksICAyLDE3NSwyMDAsMTc1LDIwNSwxNzcsIDUzLDEyOCwgIDUsMTc2LCA1MywxMjgsICA1LAotICAgIDE3NiwgNTAsICAyLDE3NSwyMTUsMTc1LDIxOSwgNTAsMTI4LCAgNSwxNzYsMTAxLDEyOCwgIDUsMTc2LDIzMiwKLSAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTc2LDIzOCwyMjUsMjQyLDI0MiwyMzksMjQ3LDIzMiwyMjksCi0gICAgMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTc2LDI0MSwyNDUsMjI1LDI0MiwyNDQsMjI5LDI0MiwyMzIsMjI5LAotICAgIDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3NiwyNDcsMjMzLDIyOCwyMjksMjMyLDIyOSwyMjYsMjQyLDIyOSwKLSAgICAxMTksMTI4LCAgNSwxNzYsMjMyLDIyNSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsCi0gICAgMTg3LDEwNSwgIDIsMTc2LCAzOSwxNzYsIDUwLDIzNywyMjUsMjI3LDIzOSwyNDAsMjQ0LDIzMywgOTksMTI4LAotICAgICAgMywyMzcsMTEwLDEzMSwgIDUsMjMzLDE3NiwgNjAsMTc2LDE0MywxNzYsMTUyLDEwMCwgIDIsMTc2LCA2NiwKLSAgICAxNzYsMTMyLDIyNSwyMzEsMjI5LDI0MywxMDQsMTMwLDI1MSwgNzMsMTc2LCA3OCwxNzYsIDg3LDIzMiwyMjksCi0gICAgMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDczLDExNSwgIDIsMTc2LCA5MywxNzYsMTEzLDIzMiwyMzMsMjM4LAotICAgIDIyOCwyMzksMTE2LDEyOSwyNTEsIDQ0LDE3NiwxMDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LDI1MSwKLSAgICAgNDQsMjMzLDIzOCwyMjgsMjM5LDExNiwxMjksMjUxLCA0NSwxNzYsMTIzLDIzMiwyMjksMjI2LDI0MiwyMjksCi0gICAgMTE5LDEyOCwyNTEsIDQ1LDIzOSwyNDQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxOTMsMjMyLAotICAgIDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwyMzMsMTE1LCAgMiwxNzYsMTU4LDE3NiwxNzgsMjMyLDIzMywKLSAgICAyMzgsMjI4LDIzOSwxMTYsMTI5LDI1MSwgNDIsMTc2LDE2OSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsCi0gICAgMjUxLCA0MiwyMzMsMjM4LDIyOCwyMzksMTE2LDEyOSwyNTEsIDQzLDE3NiwxODgsMjMyLDIyOSwyMjYsMjQyLAotICAgIDIyOSwxMTksMTI4LDI1MSwgNDMsMjM5LDIzOSwxMDcsMTI4LCAgMiwxMzAsMTA1LCAgOCwxNzYsMjIxLDE3NywKLSAgICAgIDksMTc3LCAyMCwxNzcsIDQ1LDE3NywgNzUsMTc3LCA4MywxNzcsIDk2LDE3OCwgMTEsMjMxLDIzNywgOTcsCi0gICAgMTMxLCAgMywxOTUsMTc2LDIzMywxNzYsMjM3LDE3NiwyNDUsIDQ5LDEyOCwgIDMsMTk0LDIzMCwyMzMsMjM4LAotICAgIDIyNSwxMDgsMTI4LCAgMywxOTQsMjM2LDI0NSwyMzgsMjI1LDI0NCwyMjksMjQzLDI0OSwyMzcsMjI2LDIzOSwKLSAgICAyMzYsMjMxLDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDI0MiwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsCi0gICAgIDk3LDEyOCwgNDgsIDg3LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwxODMsMTc3LAotICAgICAzMywyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEyNCwyMzYsMjQ1LDExMywKLSAgICAgIDIsMTc3LCA1MywxNzcsIDYyLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTg5LDIzNiwyMjksCi0gICAgMjMwLDI0NCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE4OSwyMzcsMjMzLDIzNiwyMjUsMTE0LAotICAgIDEyOCwgMzQsIDYwLDIzOCwyMjgsMjM5LDI0NCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE5NCwKLSAgICAyMzksMTE1LCAgNiwxNzcsMTExLDE3NywxNDYsMTc3LDE3OCwxNzcsMjA2LDE3NywyMjAsMTc3LDI1MiwgOTcsCi0gICAgICAyLDE3NywxMTcsMTc3LDEzMiwyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LAotICAgIDExMCwxMjgsIDUwLDExNiwyNDAsMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwKLSAgICAgNTAsIDIwLDIyNywxMDUsICAyLDE3NywxNTMsMTc3LDE2NSwyMjksMjQ1LDIyNywyMzUsMjM5LDI0MiwyMjksCi0gICAgMjI1LDExMCwxMjgsIDQ5LDEyNiwyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LAotICAgICA1MCwxMDIsMTA3LCAgMiwxNzcsMTg0LDE3NywxOTgsMjMzLDI0OSwyMjksMjM5LDIzNSwyMzUsMjM5LDI0MiwKLSAgICAyMjksMjI1LDExMCwxMjgsIDQ5LDEyMiwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDY5LDIzOCwyMzMsCi0gICAgMjI5LDI0NSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMjMsMTEyLCAgMiwxNzcsMjI2LAotICAgIDE3NywyMzksMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsICA2LDIzMywKLSAgICAyMjksMjQ1LDI0MCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDEyNSwyNDQsMjMzLDIzNSwyMjksCi0gICAgMjQ1LDI0NCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDEyNCwxMjAsMTQxLCAgMCwgNTQsMTc4LAotICAgICA0MSwxNzgsIDUwLDE3OCwgNjAsMTc4LCA5MCwxNzgsIDk3LDE3OCwxMjIsMTc4LDE0OSwxNzgsMTgzLDE3OCwKLSAgICAxOTUsMTc4LDIwNiwxNzgsMjM5LDE3OCwyNDcsMTc5LCAgMiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCi0gICAgICA2LDEwMiwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMzYsMjI3LDIzMywyNDIsMjI3LAotICAgIDIzNiwxMDEsMTI5LCAzNiwxMDEsMTc4LCA3MSwyMzMsMjM4LDI0NiwyMjksMjQyLDI0MywyMjksMjQzLDIyNSwKLSAgICAyMzgsMjQzLDI0MywyMjksMjQyLDIzMywxMDIsMTI4LCAzOSwxNDMsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksCi0gICAgMTA4LDIzMSwxMTcsICAyLDE3OCwxMDQsMTc4LDExMywyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLAotICAgIDIzNiwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLDEwOCwyMzIsIDk3LCAgMiwxNzgsMTI5LDE3OCwKLSAgICAxNDAsMjI3LDIzNSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LDEwMiwyMzgsMjMxLDI1MCwyMzIsCi0gICAgMjM5LDExNywxMjgsIDQ4LCAzOCwxMDUsICAyLDE3OCwxNTUsMTc4LDE3MywyMjgsMjI5LDIzOSwyMzEsMjQyLAotICAgIDIyNSwyNDAsMjMyLDIzMywyMjcsMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDUwLCAzNywyMzgsMjMwLDIyOSwKLSAgICAyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwxMzQsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsCi0gICAgMTI4LDI1NSwgMjIsMjM5LDIzNiwyMjgsMjQzLDI0NCwyNDksMjM2LDEwMSwxMjgsMjQ3LCA1NCwxMTIsICAyLAotICAgIDE3OCwyMTIsMTc4LDIxOSwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxMjEsMjI5LDExNCwgIDIsMTc4LDIyNiwKLSAgICAxNzgsMjMyLDIzMywyMzksMTAwLDEyOCwgMzYsMTQxLDI0MywyMzMsMjI1LDExMCwxMjgsICA2LDI0NiwyNDIsCi0gICAgMjM5LDIzNywyMjUsMTEwLDEyOCwgMzMsMTE3LDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LAotICAgICAzMiwxMTgsMTE2LCAgMiwxNzksICA4LDE3OSwgNzksMjI5LDIyOSwxMTAsICAyLDE3OSwgMTYsMTc5LCA1OCwKLSAgICAgOTksICAyLDE3OSwgMjIsMTc5LCAzMCwyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMTExLDI0NSwyNDIsCi0gICAgMjQyLDIyOSwyMzgsMjI3LDI0OSwyMjgsMjI5LDIzOCwyMzksMjM3LDIzMywyMzgsMjI1LDI0NCwyMzksMjQyLAotICAgIDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDI0OSwxMTIsICAyLDE3OSwgNjQsMTc5LCA3MSwKLSAgICAyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxMzEsMjI5LDI0MiwyMzMsMjM5LDEwMCwxMjgsIDM2LDE1MSwyMzIsCi0gICAgMjI1LDEwNSwxMjgsIDE0LCA4NiwxMDgsICAyLDE3OSwgOTEsMTc5LDExMSwyMjUsMjQzLDEwNCwxMjksICAwLAotICAgICA0NywxNzksIDk5LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDE1LDIzOSwKLSAgICAyMzgsMTAzLDEyOSwgIDEsMTI3LDE3OSwxMTksMjI4LDIzOSwyNDQsMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsCi0gICAgMTI4LCAzMCwxNTUsMTA5LCAgMiwxNzksMTM3LDE3OSwxNDcsMjMzLDIzNiwyMjksMjMwLDIyNSwyMjcsMTAxLAotICAgIDEyOCwgMzgsIDU4LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgODMsMTExLCAgNiwKLSAgICAxNzksMTcyLDE3OSwyMjIsMTc5LDIzMywxODAsICAyLDE4MCwgNDcsMTgwLCA1OCwxMDIsICAyLDE3OSwxNzgsCi0gICAgMTc5LDE5MiwyNDAsMjI1LDI0MywyNDUsMjQxLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTk1LAotICAgIDExNiwgIDIsMTc5LDE5OCwxNzksMjA3LDIzMiwyNDksMjQwLDIzMiwyMjksMTEwLDEyOCwgIDAsMTczLDI0MywKLSAgICAyMzMsMjMxLDIzOCwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDc2LDIzMiwyMzMsCi0gICAgMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgOTMsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LAotICAgICA5NywxMjksIDQ4LDE4OSwxNzksMjQ2LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwKLSAgICAyNTUsMTI3LDIzNiwyMzMsMjI4LDI0NSwxMTUsICAyLDE4MCwgMTIsMTgwLCAyOSwyMzYsMjM5LDIzOCwyMzEsCi0gICAgMjM5LDI0NiwyMjksMjQyLDIzNiwyMjUsMjQ5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDU2LDI0MywyMzIsMjM5LAotICAgIDI0MiwyNDQsMjM5LDI0NiwyMjksMjQyLDIzNiwyMjUsMjQ5LDIyNywyMzcsIDk4LDEyOCwgIDMsIDU1LDI0MiwKLSAgICAyNDUsMjQzLDIzMywyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNDEsMTE1LCAgMywxODAsIDY2LDE4MCwgNzYsCi0gICAgMTgwLCA4NCwyMjUsMjM2LDIyNSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNDAsMjM5LDI0NCwyMzIsMjI1LAotICAgIDEwNSwxMjgsIDE0LCAxMSwyNDUsMjI1LDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCA0MiwyNDAsIDk3LCAgMywKLSAgICAxODAsMTAyLDE4MCwxMjIsMTgwLDE1NCwyMjcsMTAxLDEyOSwgIDAsIDMyLDE4MCwxMDksMjMyLDIyNSwyMjcsCi0gICAgMjM1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDAsIDMyLDIyOCwxMDEsMTI5LCAzOCwgOTYsMTgwLAotICAgIDEyOSwyNDMsMjQ1LDIzMywxMTYsICAyLDE4MCwxMzgsMTgwLDE0NiwyMjYsMjM2LDIyNSwyMjcsMTA3LDEyOCwKLSAgICAgMzgsIDk2LDI0NywyMzIsMjMzLDI0NCwxMDEsMTI4LCAzOCwxMDAsMjQyLDIyOSwxMTAsMTI4LCAzNiwxNzQsCi0gICAgMjQxLDI0NSwyMjUsMjQyLDEwMSwgMTEsMTgwLDE4OCwxODAsMTk5LDE4MCwyMTMsMTgwLDIzOCwxODAsMjU1LAotICAgIDE4MSwgMjUsMTgxLCA0MCwxODEsIDczLDE4MSwxMDAsMTgxLDE1NiwxODEsMTcxLDIyNiwyMjksMjM2LDIzOSwKLSAgICAyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgNTksIDk5LCAgMiwxODAsMjA1LDE4MCwyMDksIDk5LDEyOCwgNTEsCi0gICAgMTk2LDEwOSwxMjgsIDUxLDE1NywyMjgsMjMzLDIyNSwyMzEsMjM5LDIzOCwyMjUsMjM2LDIyNywyNDIsMjM5LAotICAgIDI0MywyNDMsMjMyLDIyNSwyNDQsMjI3LDIzMiwyMzAsMjMzLDIzNiwxMDgsMTI4LCAzNywxNjksMjMyLDIzOSwKLSAgICAyNDIsMjMzLDI1MCwyMzksMjM4LDI0NCwyMjUsMjM2LDIzMCwyMzMsMjM2LDEwOCwxMjgsIDM3LDE2NCwxMDcsCi0gICAgICAyLDE4MSwgIDUsMTgxLCAgOSwxMDMsMTI4LCA1MSwxNDMsMTA5LDEyOSwgNTEsMTU4LDE4MSwgMTUsMjI3LAotICAgIDIyNSwyNDAsMjMzLDI0NCwyMjUsMTA4LDEyOCwgNTEsMjA2LDEwOCwgIDIsMTgxLCAzMSwxODEsIDM1LDExMCwKLSAgICAxMjgsIDUxLDIwOSwyMzksMTAzLDEyOCwgNTEsMjEwLDEwOSwgIDQsMTgxLCA1MCwxODEsIDU0LDE4MSwgNTksCi0gICAgMTgxLCA2MywxMDMsMTI4LCA1MSwxNDIsMjMzLDEwOCwxMjgsIDUxLDIxMywxMDksMTI4LCA1MSwxNTYsMjQzLAotICAgIDI0MSwyNDUsMjI1LDI0MiwyMjksMTAwLDEyOCwgNTEsMTYxLDIzOSwyNDIsMjQ0LDIzMiwyMzksMjMxLDIzOSwKLSAgICAyMzgsMjI1LDIzNiwyMjcsMjQyLDIzOSwyNDMsMjQzLDIzMiwyMjUsMjQ0LDIyNywyMzIsMjMwLDIzMywyMzYsCi0gICAgMTA4LDEyOCwgMzcsMTY2LDI0NSwyNDAsMjQwLDIyOSwxMTQsICAyLDE4MSwxMTAsMTgxLDEzMywyMzYsMjI5LAotICAgIDIzMCwyNDQsMjQ0LDIzOSwyMzYsMjM5LDI0NywyMjksMjQyLDI0MiwyMzMsMjMxLDIzMiwyNDQsMjMwLDIzMywKLSAgICAyMzYsMTA4LDEyOCwgMzcsMTY3LDI0MiwyMzMsMjMxLDIzMiwyNDQsMjQ0LDIzOSwyMzYsMjM5LDI0NywyMjksCi0gICAgMjQyLDIzNiwyMjksMjMwLDI0NCwyMzAsMjMzLDIzNiwxMDgsMTI4LCAzNywxNjgsMjQ2LDIyOSwyNDIsMjQ0LAotICAgIDIzMywyMjcsMjI1LDIzNiwyMzAsMjMzLDIzNiwxMDgsMTI4LCAzNywxNjUsMjQ3LDIzMiwyMzMsMjQ0LDIyOSwKLSAgICAyNDcsMjMzLDI0NCwyMzIsMjQzLDIzNywyMjUsMjM2LDIzNiwyMjYsMjM2LDIyNSwyMjcsMTA3LDEyOCwgMzcsCi0gICAgMTYzLDI0MiwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDIxOSwxMTUsICAyLDE4MSwyMDksMTgyLAotICAgIDEyMywgOTcsICA0LDE4MSwyMTksMTgxLDIyOSwxODEsMjM2LDE4MSwyNDcsMjI2LDIyOSwyMzgsMjMxLDIyNSwKLSAgICAyMzYsMTA1LDEyOCwgIDksMTgzLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA1NSwyMzEsMjQ1LDIzNCwyMjUsCi0gICAgMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTgzLDIzOCwxMDMsICA4LDE4MiwgMTAsMTgyLCAyNCwxODIsIDM4LAotICAgIDE4MiwgNTIsMTgyLCA2NywxODIsIDgxLDE4MiwgOTUsMTgyLDEwOCwyMjcsMjMzLDIyOSwyNDUsMjI3LDIzNSwKLSAgICAyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDczLDIzMiwyMzMsMjI5LDI0NSwyMzIsMjM1LDIzOSwyNDIsCi0gICAgMjI5LDIyNSwxMTAsMTI4LCA0OSwxMzMsMjMzLDIyOSwyNDUsMjM4LDIzMSwyMzUsMjM5LDI0MiwyMjksMjI1LAotICAgIDExMCwxMjgsIDQ5LDEyOCwyMzUsMjMzLDI0OSwyMjksMjM5LDIzNSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwKLSAgICAxMjgsIDQ5LCA1MCwyMzgsMjMzLDIyOSwyNDUsMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksCi0gICAgMTAxLDI0MCwyMzMsMjI5LDI0NSwyNDAsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgNjcsMjQzLAotICAgIDIzMywyMzksMjQzLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDcwLDI0NCwyMzMsMjM1LDIyOSwKLSAgICAyNDUsMjQ0LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDU2LDI0NSwyNDAsMjI5LDI0MiwyMzMsCi0gICAgMjM5LDExNCwxMjgsMjQ2LDI0MiwxMTYsICAyLDE4MiwxMzksMTgyLDE2MiwyMjksMjQyLDIzNiwyMzMsMjM4LAotICAgIDEwMywxMjksICAwLDE2MywxODIsMTUwLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwKLSAgICAyNTUsMjI1LDI0MiwyMzksMjM1LDEwMSwgIDIsMTgyLDE3MSwxODIsMTg4LDIzNiwyMzksMjM4LDIzMSwyMzksCi0gICAgMjQ2LDIyOSwyNDIsMjM2LDIyNSwyNDksMjI3LDIzNywgOTgsMTI4LCAgMywgNTQsMjQzLDIzMiwyMzksMjQyLAotICAgIDI0NCwyMzksMjQ2LDIyOSwyNDIsMjM2LDIyNSwyNDksMjI3LDIzNywgOTgsMTI4LCAgMywgNTMsMTE3LCAgNywKLSAgICAxODIsMjIyLDE4MiwyNTQsMTgzLCAyMCwxODMsIDMxLDE4MywgNzIsMTgzLCA4MiwxODMsIDg2LDIyNiwyNDMsCi0gICAgMjI5LDExNiwxMzAsIDM0LDEzMCwxODIsMjMzLDE4MiwyNDQsMjM4LDIzOSwyNDQsMjI5LDI0MSwyNDUsMjI1LAotICAgIDEwOCwxMjgsIDM0LDEzOCwyMzksMjQyLDIyOSwyNDEsMjQ1LDIyNSwxMDgsMTI4LCAzNCwxMzQsIDk5LCAgMiwKLSAgICAxODMsICA0LDE4MywgMTIsMjI3LDIyOSwyMjksMjI4LDExNSwxMjgsIDM0LDEyMywyMzIsMjQ0LDIzMiwyMjUsCi0gICAgMTE2LDEyOCwgMzQsIDExLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgODksMTA3LAotICAgICAgMiwxODMsIDM3LDE4MywgNjEsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMTg1LDE4MywKLSAgICAgNDksMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMjUsMjQ1LDIzOCwyMjUsCi0gICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA4MiwyMzcsMjM3LDIyNSwyNDQsMjMzLDIzOSwxMTAsMTI4LAotICAgICAzNCwgMTcsMTEwLDEyOCwgMzgsIDYwLDI0MCwyMjksMjQyLDI0MywyMjksMTE2LDEzMCwgMzQsMTMxLDE4MywKLSAgICAgOTksMTgzLDExMCwyMzgsMjM5LDI0NCwyMjksMjQxLDI0NSwyMjUsMTA4LDEyOCwgMzQsMTM5LDIzOSwyNDIsCi0gICAgMjI5LDI0MSwyNDUsMjI1LDEwOCwxMjgsIDM0LDEzNSwyNDYsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LAotICAgICA1MSwyMjAsMjQ5LDIzOSwyNDUsMjQ3LDIyNSwyMjksMjQyLDIyNSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwKLSAgICAxMjgsIDUxLDEyNCwxMTYsMTQ0LCAgMCwxMTYsMTgzLDE4MywxODQsMTkyLDE4NCwyMTMsMTg1LDEwMCwxODUsCi0gICAgMTQwLDE4NywxODgsMTkxLCA3MCwxOTIsMTQ1LDE5MiwxNTcsMTkyLDE2OSwxOTMsMjAyLDE5MywyMjcsMTk0LAotICAgICA1NywxOTQsMjM3LDE5NSwxNjUsMTk1LDI1NSwgOTcsIDEwLDE4MywyMDUsMTgzLDIxNSwxODMsMjM2LDE4MywKLSAgICAyNDMsMTg0LCAxMiwxODQsIDkwLDE4NCwxMDcsMTg0LDEzMiwxODQsMTQ2LDE4NCwxNTAsMjI2LDIyOSwyMzgsCi0gICAgMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTY0LDIyNywxMDcsICAyLDE4MywyMjIsMTgzLDIyOSwyMjgsMjM5LAotICAgIDI0NywxMTAsMTI4LCAzNCwxNjQsMjM2LDIyOSwyMzAsMTE2LDEyOCwgMzQsMTYzLDIyOCwyMjksMjQ2LCA5NywKLSAgICAxMjgsICA5LCAzNiwyMzEsMTE3LCAgMiwxODMsMjUwLDE4NCwgIDMsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsCi0gICAgMTI4LCAxMCwxNjQsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMzYsMTA0LCAgNCwxODQsIDIyLAotICAgIDE4NCwgMzEsMTg0LCA0NSwxODQsIDc1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDU1LDIzMCwKLSAgICAyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxOTQsMTA1LCAgMiwxODQsCi0gICAgIDUxLDE4NCwgNjYsMjM4LDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LAotICAgIDI1NCwxOTUsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgOTUsMjM3LDIyOSwyMjgsMjMzLDIyNSwKLSAgICAyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxOTYsMjMzLDI0MywyNDksMjM5LDI0NSwyMjksCi0gICAgMjQyLDIyNSwyNDMsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLDEyNSwyMzUsMjI1LDI0NCwyMjUsMjM1LAotICAgIDIyNSwyMzgsIDk3LDEyOSwgNDgsMTkxLDE4NCwxMjAsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwKLSAgICAxMDQsMTI4LDI1NSwxMjgsMjQ0LDI0NywyMjksMjI5LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCi0gICAgICA2LCA2NCwxMTcsMTI4LCAgMywxOTYsMTE4LDEzMCwgIDUsMjM0LDE4NCwxNTgsMTg0LDE4MywyMjgsMjI1LAotICAgIDIzMSwyMjksMTE1LDEyOSwyNTEsIDc0LDE4NCwxNjgsMTA0LDEyOSwyNTEsIDc0LDE4NCwxNzQsMjMyLDIyOSwKLSAgICAyMjYsMjQyLDIyOSwxMTksMTI4LDI1MSwgNzQsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwyMzQsCi0gICAgIDk4LCAgMiwxODQsMTk4LDE4NCwyMDMsMjI1LDExNCwxMjgsICAxLDEwMywyMzksMjQwLDIzOSwyMzcsMjM5LAotICAgIDIzMCwxMTEsMTI4LCA0OSwgMTAsIDk5LCAgNiwxODQsMjI3LDE4NCwyMzQsMTg0LDI0MSwxODQsMjUwLDE4NSwKLSAgICAgNjAsMTg1LCA4NywyMjUsMjQyLDIzOSwxMTAsMTI4LCAgMSwxMDEsMjI3LDI0NSwyNDIsMTA4LDEyOCwgIDIsCi0gICAgMTY4LDIyOSwyMjgsMjMzLDIzNiwyMzYsIDk3LDEyOCwgIDEsIDk5LDIzMiwyMjksMTA0LCAgNCwxODUsICA2LAotICAgIDE4NSwgMTUsMTg1LCAyOSwxODUsIDQ1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMTM0LDIzMCwKLSAgICAyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxMjMsMjMzLDIzOCwyMzMsCi0gICAgMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTEsMTI0LDIzNywyMjksMjI4LAotICAgIDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTEsMTI1LDIzMywyNDIsIDk5LCAgMiwKLSAgICAxODUsIDY4LDE4NSwgNzMsMjM2LDEwMSwxMjgsIDM2LDIyNywyNDUsMjM3LDIzMCwyMzYsMjI5LDI0OCwyMjYsCi0gICAgMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTEzLDIzOSwyMzcsMjM3LDIyNSwyMjUsMjI3LDIyNywyMjksMjM4LAotICAgIDExNiwxMjgsICAxLCA5OSwxMDAsICAyLDE4NSwxMDYsMTg1LDExNiwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywKLSAgICAxMTUsMTI4LCAzMCwxNTEsMjM5LDExNiwgIDIsMTg1LDEyMywxODUsMTMyLDIyNSwyMjcsMjI3LDIyOSwyMzgsCi0gICAgMTE2LDEyOCwgMzAsMTA3LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxMDksMTAxLCAgOSwxODUsMTYwLAotICAgIDE4NSwxNzEsMTg1LDE5MSwxODYsMjAxLDE4NiwyMjYsMTg3LCAzNCwxODcsMTAxLDE4NywxMDYsMTg3LDE1OCwKLSAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDY2LDIyOCwyMjksMjQzLDIyNywyMjksCi0gICAgMjM4LDIyOCwyMjksMjQyLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxNzMsMTA0LAotICAgICAgNywxODUsMjA3LDE4NSwyMTYsMTg1LDIzMCwxODYsIDE0LDE4NiwgNDQsMTg2LCA4NSwxODYsMTgzLDIyNSwKLSAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDQyLDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsCi0gICAgMjI2LDIzMywgOTksMTI4LDI1NCwxNTAsMjMyLDIyNSwyMzIsMTA1LCAgMiwxODUsMjM5LDE4NSwyNTQsMjM4LAotICAgIDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwxNjIsMjQzLDIzOSwKLSAgICAyMzYsMjI1LDI0NCwyMjksMjI4LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsIDEyLDEwNSwgIDIsCi0gICAgMTg2LCAyMCwxODYsIDM1LDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LAotICAgIDEyOCwyNTQsMTUxLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTAyLDIzNCwyMjksMjI5LDIzNywKLSAgICAxMDUsICAyLDE4NiwgNTQsMTg2LCA2OSwyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsCi0gICAgMjMzLCA5OSwxMjgsMjUyLDE2MSwyNDMsMjM5LDIzNiwyMjUsMjQ0LDIyOSwyMjgsMjI1LDI0MiwyMjUsMjI2LAotICAgIDIzMywgOTksMTI4LDI1MiwgMTEsMTA5LCAgMiwxODYsIDkxLDE4NiwxMjUsMjI1LDI0MiwyMjYsMjQ1LDI0NCwKLSAgICAgOTcsICAyLDE4NiwxMDIsMTg2LDExMSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA0MSwyMzAsCi0gICAgMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMTQ4LDEwMSwgIDIsMTg2LAotICAgIDEzMSwxODYsMTQ0LDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE1MiwKLSAgICAyMjksMjM3LDEwNSwgIDIsMTg2LDE1MiwxODYsMTY3LDIzOCwyMzMsMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsCi0gICAgMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTIsMTY0LDI0MywyMzksMjM2LDIyNSwyNDQsMjI5LDIyOCwyMjUsMjQyLAotICAgIDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLCAxNCwyMzgsMjM5LDIzOSwyMzgsMjMwLDIzMywyMzgsMjI1LDIzNiwKLSAgICAyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLDExNSwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsCi0gICAgIDk3LDEyOSwgNDgsMTk4LDE4NiwyMTQsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LAotICAgIDI1NSwxMzEsMTA4LCAgMiwxODYsMjMyLDE4NiwyNTEsMjI5LDI0MCwyMzIsMjM5LDIzOCwxMDEsMTI5LCAzMywKLSAgICAgMzMsMTg2LDI0MywyMjYsMjM2LDIyNSwyMjcsMTA3LDEyOCwgMzgsIDE0LDIzMywyNDMsMjMyLCA5NywgIDIsCi0gICAgMTg3LCAgNCwxODcsIDE5LDIzMSwyMjksMjI4LDIzOSwyMzYsMjI1LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LAotICAgIDEyOCwgIDUsMTYwLDI0MSwyMjksMjQ0LDIyNSwyMzgsMjI1LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwKLSAgICAgIDUsMTY5LDExMCwgIDQsMTg3LCA0NCwxODcsIDUzLDE4NywgNzIsMTg3LCA5MywyMjcsMjMzLDI0MiwyMjcsCi0gICAgMjM2LDEwMSwxMjgsIDM2LDEwNSwyMzMsMjI4LDIyOSwyMzksMjMxLDI0MiwyMjUsMjQwLDIzMiwyMzMsMjI3LAotICAgIDI0MCwyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgNDEsMTEyLCAgMiwxODcsIDc4LDE4NywgODUsMjI1LDI0MiwKLSAgICAyMjksMTEwLDEyOCwgMzYsMTI1LDIyOSwyNDIsMjMzLDIzOSwxMDAsMTI4LCAzNiwxNDUsMjQyLDIzOSwyMzcsCi0gICAgMjI1LDExMCwxMjgsIDMzLDEyMSwyNDMsMTA0LDEyOCwgIDIsMTY3LDExNiwxMzEsICA1LDIxNiwxODcsMTE2LAotICAgIDE4NywxMzYsMTg3LDE0NSwyMjgsMjI1LDIzMSwyMjksMjQzLDEwNCwxMjksMjUxLCA1NiwxODcsMTI3LDIzMiwKLSAgICAyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDU2LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsCi0gICAgMjE2LDI0MywyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE4MSwyNDYsMjMzLAotICAgIDExNCwgIDIsMTg3LDE2NiwxODcsMTc1LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTU1LDIzNiwKLSAgICAyMjksMjMwLDI0NCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE1NSwxMDQsICA2LDE4NywyMDIsCi0gICAgMTg4LCA5OCwxODgsMjIwLDE4OSwgOTYsMTkwLCAgMywxOTEsIDYwLCA5NywgIDUsMTg3LDIxNCwxODcsMjI0LAotICAgIDE4NywyMzEsMTg4LCAgMCwxODgsIDI5LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE2NSwKLSAgICAyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgMzcsMjMxLDExNywgIDIsMTg3LDIzOCwxODcsMjQ3LDIzNCwyMjUsCi0gICAgMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTY1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDM3LAotICAgIDEwOCwgIDIsMTg4LCAgNiwxODgsIDE1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDQ4LDIzMCwKLSAgICAyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxNzIsMjM4LDI0NCwyMzIsCi0gICAgMjI1LDIzNSwyMzIsMjI1LDExNiwgIDMsMTg4LCA0NCwxODgsIDc1LDE4OCwgODIsMjM2LDIzOSwxMTksICAyLAotICAgIDE4OCwgNTIsMTg4LCA2MywyMzYsMjI5LDIzMCwyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwyNDgsMTUyLDI0MiwKLSAgICAyMzMsMjMxLDIzMiwyNDQsMjQ0LDIzMiwyMjUsMTA1LDEyOCwyNDgsMTUxLDI0NCwyMzIsMjI1LDEwNSwxMjgsCi0gICAgIDE0LCA3NiwyNDUsMjQwLDI0MCwyMjksMjQyLDIzNiwyMjksMjMwLDI0NCwyNDQsMjMyLDIyNSwxMDUsMTI4LAotICAgIDI0OCwxNTAsMTAxLCAgMywxODgsMTA2LDE4OCwxNzAsMTg4LDE5MywxMDQsICA0LDE4OCwxMTYsMTg4LDEyNSwKLSAgICAxODgsMTM5LDE4OCwxNTUsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgNDMsMjMwLDIzMywyMzgsCi0gICAgMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDE1NCwyMzMsMjM4LDIzMywyNDQsMjMzLAotICAgIDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxNTUsMjM3LDIyOSwyMjgsMjMzLDIyNSwKLSAgICAyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxNTYsMjQyLDEwMSwgIDIsMTg4LDE3NywxODgsCi0gICAgMTg2LDIyOSwyNDgsMjMzLDI0MywyNDQsMTE1LDEyOCwgMzQsICAzLDIzMCwyMzksMjQyLDEwMSwxMjgsIDM0LAotICAgICA1MiwyNDQsIDk3LDEzMCwgIDMsMTg0LDE4OCwyMDIsMTg4LDIwNiwgNDksMTI4LCAgMywyMDksMjQzLDI0OSwKLSAgICAyMzcsMjI2LDIzOSwyMzYsMjMxLDI0MiwyMjksMjI5LDEwNywxMjgsICAzLDIwOSwxMDUsICAyLDE4OCwyMjYsCi0gICAgMTg5LCA1NiwyMjksMjQ1LDI0NCwxMDQsICA0LDE4OCwyMzksMTg5LCAxOCwxODksIDMzLDE4OSwgNDIsIDk3LAotICAgICAgMiwxODgsMjQ1LDE4OSwgIDQsMjI3LDIzMywyNDIsMjI3LDIzNiwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwKLSAgICAxMTAsMTI4LCA1MCwxMjEsMjQwLDIyNSwyNDIsMjI5LDIzOCwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsCi0gICAgIDUwLCAyNSwyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLAotICAgIDEwNywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA3NiwyNDAsMjI1LDI0MiwyMjksMjM4LDIzNSwKLSAgICAyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsIDExLDI0MiwyNDQsMjI5LDIyOSwxMTAsICAyLDE4OSwgNjYsCi0gICAgMTg5LCA3NSwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsIDM2LDEwOCwxMTIsICAyLDE4OSwgODEsMTg5LAotICAgICA4OCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxMjgsMjI5LDI0MiwyMzMsMjM5LDEwMCwxMjgsIDM2LDE0OCwKLSAgICAxMTEsICA2LDE4OSwxMTAsMTg5LDEyNywxODksMTMyLDE4OSwxNDYsMTg5LDE1MSwxODksMjA0LDIzOCwyMjUsCi0gICAgMjM4LDIzMSwyMzcsMjM5LDIzOCwyNDQsMjMyLDIzOSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgMTcsMjM5LAotICAgIDEwNywxMjgsICAxLDE3MywyNDAsMjMyLDI0NSwyNDQsMjMyLDIyNSwyMzksMjQ0LDIzMiwyMjUsMTA1LDEyOCwKLSAgICAgMTQsIDE4LDI0MiwxMTAsMTI4LCAgMCwyNTQsMjQ0LDEwNCwgIDMsMTg5LDE2MCwxODksMTg0LDE4OSwxOTQsCi0gICAgIDk3LCAgMiwxODksMTY2LDE4OSwxNzYsMjMyLDIyNSwyMzgsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDIzLAotICAgIDIzOCwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgMTYsMjM5LDIzOCwyMzEsMjQ0LDIzMiwyMjUsMTA1LDEyOCwKLSAgICAgMTQsIDI0LDI0NSwyMzgsMjMxLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAyMiwyNDUsMjQzLDIyNSwyMzgsCi0gICAgMTAwLCAgMiwxODksMjE0LDE4OSwyMjUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LAotICAgIDEzMCwyNDMsMjQzLDIyOSwyNDAsMjI1LDI0MiwyMjUsMjQ0LDIzOSwxMTQsICAyLDE4OSwyNDAsMTg5LDI0OSwKLSAgICAyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LDEwOCwyNDAsMjI5LDI0MiwyNDMsMjMzLDIyNSwxMTAsCi0gICAgMTI4LCAgNiwxMDgsMjQyLDIyOSwxMDEsMTQ0LCAgMCwgNTEsMTkwLCA0MSwxOTAsIDUwLDE5MCwgNjAsMTkwLAotICAgICA5MCwxOTAsIDk3LDE5MCwxMDcsMTkwLDEzMiwxOTAsMTU5LDE5MCwxOTMsMTkwLDIwNSwxOTAsMjI0LDE5MCwKLSAgICAyMzUsMTkxLCAxMiwxOTEsIDM0LDE5MSwgNDIsMTkxLCA1MywyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsCi0gICAgICA2LCA5OSwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyMzMsMjI3LDIzMywyNDIsMjI3LAotICAgIDIzNiwxMDEsMTI5LCAzNiwgOTgsMTkwLCA3MSwyMzMsMjM4LDI0NiwyMjksMjQyLDI0MywyMjksMjQzLDIyNSwKLSAgICAyMzgsMjQzLDI0MywyMjksMjQyLDIzMywxMDIsMTI4LCAzOSwxNDAsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksCi0gICAgMTA1LDIyOSwyMzMsMjMxLDIzMiwyNDQsMjMyLDExNSwxMjgsIDMzLCA5MiwyMzEsMTE3LCAgMiwxOTAsMTE0LAotICAgIDE5MCwxMjMsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwyMzMsMjQyLDIzNywyNDUsMjM1LDIzMiwKLSAgICAxMDUsMTI4LCAxMCwxMDUsMjMyLCA5NywgIDIsMTkwLDEzOSwxOTAsMTUwLDIyNywyMzUsMjI1LDI0MiwyMjUsCi0gICAgMjI2LDIzMywgOTksMTI4LCAgNiwgOTksMjM4LDIzMSwyNTAsMjMyLDIzOSwxMTcsMTI4LCA0OCwgMzUsMTA1LAotICAgICAgMiwxOTAsMTY1LDE5MCwxODMsMjI4LDIyOSwyMzksMjMxLDI0MiwyMjUsMjQwLDIzMiwyMzMsMjI3LDI0MCwKLSAgICAyMjUsMjQyLDIyOSwxMTAsMTI4LCA1MCwgMzQsMjM4LDIzMCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgMzIsCi0gICAgMTMxLDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDE5LDIzOCwyNDUsMjM3LAotICAgIDIyOSwyNDIsMjI1LDI0NCwyMzksMjQyLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDI0NiwKLSAgICAyMzksMjM2LDIyOCwyNDMsMjQ0LDI0OSwyMzYsMTAxLDEyOCwyNDcsIDUxLDExMiwgIDIsMTkwLDI0MSwxOTAsCi0gICAgMjQ4LDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDExOCwyMjksMTE0LCAgMiwxOTAsMjU1LDE5MSwgIDUsMjMzLAotICAgIDIzOSwxMDAsMTI4LCAzNiwxMzgsMjQzLDIzMywyMjUsMTEwLDEyOCwgIDYsMjQzLDI0MSwyNDUsMjI1LDI0MiwKLSAgICAyNDQsMjI5LDI0MiwxMTUsMTI5LCAgMCwxOTAsMTkxLCAyNSwyMjksMjM3LDIyOCwyMjUsMjQzLDEwNCwxMjgsCi0gICAgMjQ2LDIyMiwyNDIsMjM5LDIzNywyMjUsMTEwLDEyOCwgMzMsMTE0LDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLAotICAgIDIzOSwxMTQsMTI4LCAgMCwxNzksMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDgzLDI1MCwyNDMsMjQxLDI0NSwKLSAgICAyMjUsMjQyLDEwMSwxMjgsIDUxLDE0OCwxMDUsICA3LDE5MSwgODYsMTkxLCA5NywxOTEsMjEyLDE5MiwgNTQsCi0gICAgMTkyLCA2NiwxOTIsMTE1LDE5MiwxMzIsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LAotICAgICA5NywxMDcsICAyLDE5MSwxMDMsMTkxLDEyNywyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwKLSAgICAxOTMsMTkxLDExNSwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDEyOSwyMjksCi0gICAgMjQ1LDExNiwgIDQsMTkxLDEzOSwxOTEsMTc0LDE5MSwxODksMTkxLDE5OCwgOTcsICAyLDE5MSwxNDUsMTkxLAotICAgIDE2MCwyMjcsMjMzLDI0MiwyMjcsMjM2LDIyOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDUwLDExMiwKLSAgICAyNDAsMjI1LDI0MiwyMjksMjM4LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsIDE2LDIyNywyMzMsCi0gICAgMjQyLDIyNywyMzYsMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNTAsIDk4LDIzNSwyMzksMjQyLAotICAgIDIyOSwyMjUsMTEwLDEyOCwgNDksIDU1LDI0MCwyMjUsMjQyLDIyOSwyMzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwKLSAgICAxMTAsMTI4LCA1MCwgIDIsMjM2LDIyOCwxMDEsMTMzLCAgMiwyMjAsMTkxLDIyOCwxOTEsMjM5LDE5MiwgIDAsCi0gICAgMTkyLCAxMiwxOTIsIDQwLDIyNiwyMjksMjM2LDIzOSwyNDcsMjI3LDIzNywgOTgsMTI4LCAgMywgNDgsIDk5LAotICAgICAgMiwxOTEsMjQ1LDE5MSwyNTAsMjM3LCA5OCwxMjgsICAzLCAgMywyMzksMjM3LCA5OCwxMjgsICAzLCAgMywKLSAgICAyMjgsMjM5LDI0NSwyMjYsMjM2LDIyOSwyMjcsMjM3LCA5OCwxMjgsICAzLCA5NiwxMTEsICAyLDE5MiwgMTgsCi0gICAgMTkyLCAyOCwyNDAsMjI5LDI0MiwyMjUsMjQ0LDIzOSwxMTQsMTI4LCAzNCwgNjAsMjQ2LDIyOSwyNDIsMjM2LAotICAgIDIyNSwyNDksMjI3LDIzNywgOTgsMTI4LCAgMywgNTIsMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LDIzNiwKLSAgICAyMjcsMjM3LCA5OCwxMjgsICAzLCA2MiwyMzcsMjI5LDI0MywyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjgsCi0gICAgIDM0LDE1MSwxMTIsICAyLDE5MiwgNzIsMTkyLDEwMiwyMjksMjMyLCA5NywgIDIsMTkyLCA4MCwxOTIsIDg5LAotICAgIDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTUwLDIzNiwyMjksMjMwLDI0NCwyMzIsMjI5LDIyNiwKLSAgICAyNDIsMjI5LDExOSwxMjgsICA1LDE1MCwyNDAsMjMzLDIzMSwyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsCi0gICAgMTI4LCAxMCwxMTIsMjQ0LDIzNiwyMzksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLDIyNywyMjcsMjM3LAotICAgICA5OCwxMjgsICA0LDEzMSwyNDcsMjM4LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwKLSAgICAxMjcsMjM2LDIzMywyMzgsMjI5LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxMTEsMjM3LDIzOSwyMzgsCi0gICAgMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgODQsMTExLCAgNywxOTIsMTg1LDE5MiwxOTYsMTkyLAotICAgIDIwNywxOTIsMjMyLDE5MywgOTYsMTkzLDEwOCwxOTMsMTkyLDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwKLSAgICAxMTAsMTI4LCAgNSwxMDUsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEwNCwyMzUsCi0gICAgMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjAwLDE5MiwyMjAsMjMyLDIyNSwyMzYsMjMwLAotICAgIDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMzIsMTEwLCAgMywxOTIsMjQwLDE5MywgODIsMTkzLCA4NywKLSAgICAxMDEsICA0LDE5MiwyNTAsMTkzLCA2MywxOTMsIDcwLDE5MywgNzYsMjI2LDIyNSwxMTQsICA0LDE5MywgIDYsCi0gICAgMTkzLCAzNSwxOTMsIDQ1LDE5MywgNTQsMjI5LDI0OCwyNDQsMjQyLCA5NywgIDIsMTkzLCAxNiwxOTMsIDI2LAotICAgIDIzMiwyMzMsMjMxLDIzMiwyMzcsMjM5LDEwMCwxMjgsICAyLDIyOSwyMzYsMjM5LDI0NywyMzcsMjM5LDEwMCwKLSAgICAxMjgsICAyLDIzMywyMzIsMjMzLDIzMSwyMzIsMjM3LDIzOSwxMDAsMTI4LCAgMiwyMzAsMjM2LDIzOSwyNDcsCi0gICAgMjM3LDIzOSwxMDAsMTI4LCAgMiwyMzIsMjM3LDIzMywyMjgsMjM3LDIzOSwxMDAsMTI4LCAgMiwyMzEsMjMwLAotICAgIDIzMywyNDYsMTAxLDEyOCwgIDEsMTg5LDI0MywyMzMsMTIwLDEyOCwgIDEsMTMzLDI0NCwyNDcsMTExLDEyOCwKLSAgICAgIDEsMTY4LDIzOSwxMTUsMTI4LCAgMywxMzIsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgMzksCi0gICAgMjQwLDIyNSwyNDQsMjI1LDIzNSwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgMTUsMjQyLDI0NCwyMzksMjMzLAotICAgIDI0MywyMjksMjQzLDIzMiwyMjksMjM2LDIzNiwyMjYsMjQyLDIyNSwyMjcsMjM1LDIyOSwxMTYsICAyLDE5MywKLSAgICAxMzEsMTkzLDE2MSwyMzYsMjI5LDIzMCwxMTYsMTMwLCA0OCwgMjAsMTkzLDE0MiwxOTMsMTUwLDI0MywyMzcsCi0gICAgMjI1LDIzNiwxMDgsMTI4LDI1NCwgOTMsMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwxMjgsMjU0LAotICAgICA1NywyNDIsMjMzLDIzMSwyMzIsMTE2LDEzMCwgNDgsIDIxLDE5MywxNzMsMTkzLDE4MSwyNDMsMjM3LDIyNSwKLSAgICAyMzYsMTA4LDEyOCwyNTQsIDk0LDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LDI1NCwgNTgsCi0gICAgMjQ0LDIyNSwyMzksMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDIxLDI0MCwgOTcsICAyLDE5MywyMDksMTkzLAotICAgIDIyMSwyMzYsMjI1LDI0NCwyMjUsMjM2LDIzMiwyMzksMjM5LDEwNywxMjgsICAxLDE3MSwyNDIsMjI5LDExMCwKLSAgICAxMjgsIDM2LDE3NSwxMTQsICAzLDE5MywyMzUsMTk0LCAxMCwxOTQsIDI1LDIyNSwyMjgsMjI5LDIzNywyMjUsCi0gICAgMjQyLDEwNywxMjksIDMzLCAzNCwxOTMsMjQ3LDExNSwgIDIsMTkzLDI1MywxOTQsICAzLDIyNSwyMzgsMTE1LAotICAgIDEyOCwyNDgsMjM0LDIyOSwyNDIsMjMzLDEwMiwxMjgsMjQ2LDIxOSwyMjksMjQ0LDI0MiwyMzksMjMwLDIzNiwKLSAgICAyMjksMjQ4LDIzMiwyMzksMjM5LDEwNywxMjgsICAyLDEzNiwyMzMsMjI1LDEwMywgIDQsMTk0LCAzNywxOTQsCi0gICAgIDQyLDE5NCwgNDcsMTk0LCA1MiwyMjgsMTEwLDEyOCwgMzcsMTg4LDIzNiwxMDIsMTI4LCAzNywxOTYsMjQyLAotICAgIDExNiwxMjgsIDM3LDE4NiwyNDUsMTEyLDEyOCwgMzcsMTc4LDExNSwxMzIsICAyLDE2NiwxOTQsIDY5LDE5NCwKLSAgICAxMDgsMTk0LDIxNCwxOTQsMjI3LDIyNSwyMjgsMTA1LDEzMCwgIDUsMjMwLDE5NCwgNzksMTk0LCA5OSwyMjgsCi0gICAgMjI1LDIzMSwyMjksMjQzLDEwNCwxMjksMjUxLCA3MCwxOTQsIDkwLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LAotICAgIDEyOCwyNTEsIDcwLDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjMwLDEwMSwgIDIsMTk0LDExNCwKLSAgICAxOTQsMTI1LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNzAsMjQyLDEwMSwxMzQsCi0gICAgICA1LDE4MSwxOTQsMTQyLDE5NCwxNTYsMTk0LDE2MSwxOTQsMTcwLDE5NCwxODUsMTk0LDIwMSwgNDksICAyLAotICAgIDE5NCwxNDgsMTk0LDE1MiwgNTAsMTI4LCAgNSwxODEsMTAxLDEyOCwgIDUsMTgxLDE3OCwgOTgsMTI4LCAgNSwKLSAgICAxODEsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODEsMjM4LDIyNSwyNDIsMjQyLDIzOSwyNDcsCi0gICAgMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxODEsMjQxLDI0NSwyMjUsMjQyLDI0NCwyMjksMjQyLAotICAgIDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMTgxLDI0NywyMzMsMjI4LDIyOSwyMzIsMjI5LDIyNiwKLSAgICAyNDIsMjI5LDExOSwxMjgsICA1LDE4MSwyMzIsMjI5LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksCi0gICAgMTI4LCAgNCwgOTEsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwyNDYsMjQzLDExNiwgIDQsMTk0LAotICAgIDI0NywxOTUsIDQxLDE5NSwxMDYsMTk1LDE1NywgOTcsICAzLDE5NCwyNTUsMTk1LCAgOSwxOTUsIDE2LDIyNiwKLSAgICAyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE1OSwyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgMzEsCi0gICAgMjMxLDExNywgIDIsMTk1LCAyMywxOTUsIDMyLDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTU5LAotICAgIDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsIDMxLDIyOSwxMDQsICA0LDE5NSwgNTIsMTk1LCA2MSwKLSAgICAxOTUsIDc1LDE5NSwgOTEsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwxMjEsMjMwLDIzMywyMzgsCi0gICAgMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUxLDEwMywyMzMsMjM4LDIzMywyNDQsMjMzLAotICAgIDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxMDQsMjM3LDIyOSwyMjgsMjMzLDIyNSwKLSAgICAyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MSwxMDUsMjMyLCA5NywgIDMsMTk1LDExNSwxOTUsCi0gICAgMTI1LDE5NSwxMzIsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTYwLDIyOCwyMjksMjQ2LAotICAgICA5NywxMjgsICA5LCAzMiwyMzEsMTE3LCAgMiwxOTUsMTM5LDE5NSwxNDgsMjM0LDIyNSwyNDIsMjI1LDI0NCwKLSAgICAxMDUsMTI4LCAxMCwxNjAsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgMzIsMjQ1LDI0MiwyMzgsCi0gICAgMjI5LDEwMCwxMjgsICAyLDEzNSwxMTcsICAzLDE5NSwxNzMsMTk1LDE4NCwxOTUsMjA5LDIzMiwyMzMsMjQyLAotICAgIDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMDAsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywKLSAgICAxMjksIDQ4LDE5NiwxOTUsMTk3LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsCi0gICAgMTMwLDI0MywyMzcsMjI1LDIzNiwxMDgsICAyLDE5NSwyMTksMTk1LDIzMCwyMzIsMjMzLDI0MiwyMjUsMjMxLAotICAgIDIyNSwyMzgsIDk3LDEyOCwgNDgsIDk5LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwKLSAgICAxOTUsMTk1LDI0MywyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDExMSwxMTksCi0gICAgICAyLDE5NiwgIDUsMTk2LDExMCwxMDEsICAyLDE5NiwgMTEsMTk2LCA1OSwyMzYsMjQ2LDEwMSwgIDMsMTk2LAotICAgICAyMSwxOTYsIDMwLDE5NiwgNTEsMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwxMDcsMTEyLCAgMiwKLSAgICAxOTYsIDM2LDE5NiwgNDMsMjI1LDI0MiwyMjksMTEwLDEyOCwgMzYsMTI3LDIyOSwyNDIsMjMzLDIzOSwxMDAsCi0gICAgMTI4LCAzNiwxNDcsMjQyLDIzOSwyMzcsMjI1LDExMCwxMjgsIDMzLDEyMywyMzgsMjQ0LDEyMSwgIDMsMTk2LAotICAgICA2OSwxOTYsIDc4LDE5NiwgODksMjI3LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI4LCAzNiwxMTUsMjMyLDIyNSwKLSAgICAyMzgsMjMxLDI1MCwyMzIsMjM5LDExNywxMjgsIDgzLCA2OCwxMTIsICAyLDE5NiwgOTUsMTk2LDEwMiwyMjUsCi0gICAgMjQyLDIyOSwxMTAsMTI4LCAzNiwxMzUsMjI5LDI0MiwyMzMsMjM5LDEwMCwxMjgsIDM2LDE1NSwxMTEsMTQyLAotICAgICAgMCwgNTAsMTk2LDE0MiwxOTYsMTUxLDE5NiwxNjEsMTk2LDE5MSwxOTYsMjQzLDE5NywgMTIsMTk3LCAzOSwKLSAgICAxOTcsIDczLDE5NywgODUsMTk3LDEwNCwxOTcsMTE1LDE5NywxNDgsMTk3LDE1NiwxOTcsMTgwLDIyNSwyNDIsCi0gICAgMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDk4LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LAotICAgIDIzMiwyMjcsMjMzLDI0MiwyMjcsMjM2LDEwMSwxMjksIDM2LCA5NywxOTYsMTcyLDIzMywyMzgsMjQ2LDIyOSwKLSAgICAyNDIsMjQzLDIyOSwyNDMsMjI1LDIzOCwyNDMsMjQzLDIyOSwyNDIsMjMzLDEwMiwxMjgsIDM5LDEzOSwxMDAsCi0gICAgICAyLDE5NiwxOTcsMTk2LDIwMywyMjksMjQ2LCA5NywxMjgsICA5LDEwNCwyMzksMTE2LCAgMiwxOTYsMjEwLAotICAgIDE5NiwyMjEsMjI5LDIzOCwyMzYsMjI5LDIyNSwyMjgsMjI5LDExNCwxMjgsIDMyLCAzNywyMzYsMjI5LDIyNSwKLSAgICAyMjgsMjI5LDExNCwxMjksIDMyLCAzNywxOTYsMjMyLDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsCi0gICAgMTI4LDI1NCwgNDgsMjMxLDExNywgIDIsMTk2LDI1MCwxOTcsICAzLDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LAotICAgIDEyOCwgMTAsMjMyLDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsMTA0LDIzMiwgOTcsICAyLDE5NywKLSAgICAgMTksMTk3LCAzMCwyMjcsMjM1LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDk4LDIzOCwyMzEsCi0gICAgMjUwLDIzMiwyMzksMTE3LDEyOCwgNDgsIDM0LDEwNSwgIDIsMTk3LCA0NSwxOTcsIDYzLDIyOCwyMjksMjM5LAotICAgIDIzMSwyNDIsMjI1LDI0MCwyMzIsMjMzLDIyNywyNDAsMjI1LDI0MiwyMjksMTEwLDEyOCwgNTAsIDMzLDIzOCwKLSAgICAyMzAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsIDMyLDEzMCwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsCi0gICAgMjI3LDEwMSwxMjgsMjU1LCAxOCwyMzgsMjQ1LDIzNywyMjksMjQyLDIyNSwyNDQsMjM5LDI0MiwyMjYsMjI5LAotICAgIDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwyNDUsMjM5LDIzNiwyMjgsMjQzLDI0NCwyNDksMjM2LDEwMSwKLSAgICAxMjgsMjQ3LCA1MCwxMTIsICAyLDE5NywxMjEsMTk3LDEyOCwyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxMTcsCi0gICAgMjI5LDExNCwgIDIsMTk3LDEzNSwxOTcsMTQxLDIzMywyMzksMTAwLDEyOCwgMzYsMTM3LDI0MywyMzMsMjI1LAotICAgIDExMCwxMjgsICA2LDI0MiwyNDIsMjM5LDIzNywyMjUsMTEwLDEyOCwgMzMsMTEzLDExNSwgIDIsMTk3LDE2MiwKLSAgICAxOTcsMTcwLDI0NCwyNDIsMjM5LDIzNSwxMDEsMTI4LCAgMSwxODcsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksCi0gICAgMTE0LDEyOCwgIDAsMTc4LDI0NCwxMDQsICAyLDE5NywxODcsMTk3LDE5MiwyMjUsMTA1LDEyOCwgMTQsIDgyLAotICAgIDIzMywyNDIsMjI4LDExNSwxMjgsIDMzLCA4NCwxMTcsMTQ1LCAgMCwxMTcsMTk3LDIzNywxOTcsMjQ1LDE5OCwKLSAgICAgMzAsMTk4LCA4NywxOTgsMjI1LDE5OSwgIDYsMTk5LDEyOSwxOTksMTQ1LDE5OSwxOTYsMjAwLCAxMCwyMDAsCi0gICAgIDkxLDIwMCwxMDAsMjAwLDIxOSwyMDAsMjQzLDIwMSwgOTUsMjAxLDEyMywyMDEsMjM3LDIyNSwyMjcsMjQ1LAotICAgIDI0NCwxMDEsMTI4LCAgMCwyNTAsIDk4LCAgNCwxOTcsMjU1LDE5OCwgIDQsMTk4LCAxMywxOTgsIDIzLDIyNSwKLSAgICAxMTQsMTI4LCAgMiwxMzcsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwxMzcsMjM5LDI0MCwyMzksCi0gICAgMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDQwLDI0MiwyMjksMjQ2LDEwMSwxMjgsICAxLDEwOSwgOTksICAzLAotICAgIDE5OCwgMzgsMTk4LCA0NSwxOTgsIDc3LDIyNSwyNDIsMjM5LDExMCwxMjgsICAxLDIxMiwyMzMsMjQyLCA5OSwKLSAgICAgIDIsMTk4LCA1MywxOTgsIDU4LDIzNiwxMDEsMTI4LCAzNiwyMjgsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsCi0gICAgMTI5LCAgMCwyNTEsMTk4LCA2OSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTE5LDI0OSwyNDIsMjMzLAotICAgIDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LCA2NywxMDAsICA1LDE5OCwgOTksMTk4LDExMCwxOTgsMTMzLDE5OCwKLSAgICAxMzksMTk4LDIxNSwyMjUsMjQ0LDI0NCwyMjUsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDgxLDIyNiwxMDgsCi0gICAgICAyLDE5OCwxMTcsMTk4LDEyNSwyMjUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgIDEsMTEzLDIzMSwyNDIsMjI1LAotICAgIDI0NiwxMDEsMTI4LCAgMiwgMjEsMjI5LDI0NiwgOTcsMTI4LCAgOSwgIDksMjMzLDIyOSwyNDIsMjI5LDI0MywKLSAgICAyMzMsMTE1LDEzMywgIDAsMjUyLDE5OCwxNTksMTk4LDE2NywxOTgsMTc1LDE5OCwxOTgsMTk4LDIwNiwyMjUsCi0gICAgMjI3LDI0NSwyNDQsMTAxLDEyOCwgIDEsMjE2LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxMTUsIDk5LAotICAgICAgMiwxOTgsMTgxLDE5OCwxODgsMjI1LDI0MiwyMzksMTEwLDEyOCwgIDEsMjE4LDI0OSwyNDIsMjMzLDIzNiwKLSAgICAyMzYsMjMzLCA5OSwxMjgsICA0LDI0MSwyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwgIDEsMjIwLDIzNywyMjUsCi0gICAgMjI3LDI0MiwyMzksMTEwLDEyOCwgIDEsMjE0LDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLAotICAgIDIyOSwxMDMsICAyLDE5OCwyMzEsMTk4LDIzOCwyNDIsMjI1LDI0NiwxMDEsMTI4LCAgMCwyNDksMTE3LCAgMiwKLSAgICAxOTgsMjQ0LDE5OCwyNTMsMjM0LDIyNSwyNDIsMjI1LDI0NCwxMDUsMTI4LCAxMCwxMzcsMjQyLDIzNywyNDUsCi0gICAgMjM1LDIzMiwxMDUsMTI4LCAxMCwgIDksMTA0LCAgMywxOTksIDE0LDE5OSwgMjQsMTk5LDEwMiwyMzMsMjQyLAotICAgIDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwgNzAsMTExLCAgMiwxOTksIDMwLDE5OSwgNDAsMjM5LDIzNSwKLSAgICAyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMjMxLDI0MiwxMTAsMTMzLCAgMSwxNzYsMTk5LCA1NSwxOTksCi0gICAgIDYzLDE5OSwgNzQsMTk5LCA4MiwxOTksIDk0LDIyNSwyMjcsMjQ1LDI0NCwxMDEsMTI4LCAzMCwyMzMsMjI4LAotICAgIDIzOSwyNDQsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDI0MSwyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwKLSAgICAgMzAsMjM1LDIzMiwyMzksMjM5LDIzNSwyMjUsMjI2LDIzOSwyNDYsMTAxLDEyOCwgMzAsMjM3LDI0NCwyMzMsCi0gICAgMjM2LDIyOCwxMDEsMTI4LCAzMCwyMzksMjQ1LDIzOCwyMzEsMjI1LDI0MiwyNDUsMjM3LDIzNiwyMjUsMjQ1LAotICAgIDExNiwxMjksICAxLDExMywxOTksMTE4LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwKLSAgICAyNDMsMjMzLDIzOCwyNDYsMjI5LDI0MiwyNDQsMjI5LDIyOCwyMjYsMjQyLDIyOSwyNDYsMTAxLDEyOCwgIDIsCi0gICAgIDIzLDEwNywgIDMsMTk5LDE1MywxOTksMTc3LDE5OSwxODgsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LAotICAgIDEyOSwgNDgsMTY2LDE5OSwxNjUsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwKLSAgICAxMTUsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDEyMSwyMzksMjQyLDIyOSwyMjUsCi0gICAgMTEwLDEyOCwgNDksIDkyLDEwOSwgIDIsMTk5LDIwMiwxOTksMjU1LCA5NywgIDIsMTk5LDIwOCwxOTksMjQxLAotICAgIDIyNywyNDIsMjM5LDExMCwxMzAsICAxLDEwNywxOTksMjE5LDE5OSwyMzAsMjI3LDI0OSwyNDIsMjMzLDIzNiwKLSAgICAyMzYsMjMzLCA5OSwxMjgsICA0LDIzOSwyMjgsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEyOCwgMzAsCi0gICAgMTIzLDI0NCwyNDIsMjI1LDIzMSwyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgNjUsMjM5LAotICAgIDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA4NSwxMTAsICAyLDIwMCwgMTYsMjAwLCA3MSwKLSAgICAyMjgsMjI5LDI0MiwyNDMsMjI3LDIzOSwyNDIsMTAxLDEzMiwgIDAsIDk1LDIwMCwgMzUsMjAwLCA0MSwyMDAsCi0gICAgIDUzLDIwMCwgNjQsMjI4LDIyNiwxMDgsMTI4LCAzMiwgMjMsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LAotICAgIDIyNywxMDEsMTI4LDI1NSwgNjMsMjQ2LDIyOSwyNDIsMjQ0LDIzMywyMjcsMjI1LDEwOCwxMjgsMjU0LCA1MSwKLSAgICAyNDcsMjI1LDI0NiwxMjEsMTI4LDI1NCwgNzksMTA1LCAgMiwyMDAsIDc3LDIwMCwgODIsMjM5LDExMCwxMjgsCi0gICAgIDM0LCA0MiwyNDYsMjI5LDI0MiwyNDMsMjI1LDEwOCwxMjgsIDM0LCAgMCwyMzksMjMxLDIzOSwyMzgsMjI5LAotICAgIDEwNywxMjgsICAxLDExNSwxMTIsICA1LDIwMCwxMTIsMjAwLDExOSwyMDAsMTI3LDIwMCwxNDIsMjAwLDE5MywKLSAgICAyMjUsMjQyLDIyOSwxMTAsMTI4LCAzNiwxNzYsMjI2LDIzNiwyMzksMjI3LDEwNywxMjgsIDM3LDEyOCwyNDAsCi0gICAgMjI5LDI0MiwyMjgsMjM5LDI0NCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE5NiwyNDMsMjMzLAotICAgIDIzNiwyMzksMTEwLDEzMSwgIDMsMTk3LDIwMCwxNTYsMjAwLDE3NywyMDAsMTg1LDIyOCwyMzMsMjI5LDI0MiwKLSAgICAyMjksMjQzLDIzMywxMTUsMTI5LCAgMywyMDMsMjAwLDE2OSwyNDQsMjM5LDIzOCwyMzksMTE1LDEyOCwgIDMsCi0gICAgMTc2LDIzNiwyMjUsMjQ0LDIzMywxMTAsMTI4LCAgMiwxMzgsMjQ0LDIzOSwyMzgsMjM5LDExNSwxMjgsICAzLAotICAgIDIwNSwyNDQsMjI1LDIyNywxMDcsICAyLDIwMCwyMDIsMjAwLDIxMywyMjYsMjI5LDIzNiwyMzksMjQ3LDIyNywKLSAgICAyMzcsIDk4LDEyOCwgIDMsIDI5LDIzNywyMzksMTAwLDEyOCwgIDIsMjEyLDExNCwgIDIsMjAwLDIyNSwyMDAsCi0gICAgMjM3LDIyNSwyMzEsMjQ1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsMTE1LDIzMywyMzgsMTAzLAotICAgIDEyOCwgIDEsMTExLDExNSwgIDMsMjAwLDI1MSwyMDEsIDEwLDIwMSwgNTUsMjMyLDIzOSwyNDIsMjQ0LDIyNywKLSAgICAyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgOTQsMjM3LDIyNSwyMzYsMTA4LCAgMiwyMDEsCi0gICAgIDE5LDIwMSwgMzAsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LCA2OSwyMzUsMjI1LAotICAgIDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMTY1LDIwMSwgNDMsMjMyLDIyNSwyMzYsMjMwLDI0NywKLSAgICAyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMDUsMjQ0LDI0MiwyMjUsMjMzLDIzMSwyMzIsMTE2LCAgMiwyMDEsCi0gICAgIDY3LDIwMSwgNzgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE3NSwyNDMsMjQ0LAotICAgIDI0MiwyMzksMjM1LDIyOSwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTc3LDI0NCwKLSAgICAyMzMsMjM2LDIyOCwxMDEsMTMwLCAgMSwxMDUsMjAxLDEwNywyMDEsMTE1LDIyNSwyMjcsMjQ1LDI0NCwxMDEsCi0gICAgMTI4LCAzMCwxMjEsMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDExNywxMTcsICA1LDIwMSwxMzUsMjAxLAotICAgIDE0NSwyMDEsMTUyLDIwMSwxNzcsMjAxLDE5MywyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwKLSAgICAxMzgsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDEwLDIzMSwxMTcsICAyLDIwMSwxNTksMjAxLDE2OCwyMzQsCi0gICAgMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDEzOCwyNDIsMjM3LDI0NSwyMzUsMjMyLDEwNSwxMjgsIDEwLAotICAgICAxMCwyMzcsMjI1LDI0NCwyNDIsMjI1LDIzMSwyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwKLSAgICAgNjYsMjQ2LDIzOSwyNDcsMjI5LDIzNiwyNDMsMjMzLDIzMSwxMTAsICAzLDIwMSwyMDksMjAxLDIxOSwyMDEsCi0gICAgMjI2LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDE5NCwyMjgsMjI5LDI0NiwgOTcsMTI4LAotICAgICAgOSwgNjYsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDE5NCwyNDYsMjM5LDI0NywKLSAgICAyMjksMjM2LDI0MywyMzMsMjMxLDExMCwgIDMsMjAxLDI1MywyMDIsICA3LDIwMiwgMTQsMjI2LDIyOSwyMzgsCi0gICAgMjMxLDIyNSwyMzYsMTA1LDEyOCwgIDksMTkzLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA2NSwyMzEsMjQ1LAotICAgIDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTkzLDExOCwxMzksICAwLDExOCwyMDIsIDUxLDIwMiwKLSAgICAxOTksMjAyLDIwOCwyMDIsMjE5LDIwMywxNDgsMjAzLDE1NSwyMDMsMjUzLDIwNCwgIDksMjA0LDEwOSwyMDQsCi0gICAgMTE3LDIwNCwxMzgsIDk3LCAgNCwyMDIsIDYxLDIwMiwgNjgsMjAyLCA5MywyMDIsMTA0LDIyOCwyMjksMjQ2LAotICAgICA5NywxMjgsICA5LCA1MywyMzEsMTE3LCAgMiwyMDIsIDc1LDIwMiwgODQsMjM0LDIyNSwyNDIsMjI1LDI0NCwKLSAgICAxMDUsMTI4LCAxMCwxODEsMjQyLDIzNywyNDUsMjM1LDIzMiwxMDUsMTI4LCAxMCwgNTMsMjM1LDIyNSwyNDQsCi0gICAgMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDI0NywxMTgsMTMyLCAgNSwyMTMsMjAyLDExNiwyMDIsMTQzLAotICAgIDIwMiwxNzUsMjAyLDE4NywyMjgsMjI1LDIzMSwyMjksMjQzLDEwNCwxMzAsMjUxLCA1MywyMDIsMTI5LDIwMiwKLSAgICAxMzQsMTgyLCA1MywxMjgsMjUxLCA1MywyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA1MywxMDQsCi0gICAgICAyLDIwMiwxNDksMjAyLDE1NywyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjEzLDIzOSwyMzYsMjI1LAotICAgIDEwOSwxMjksMjUxLCA3NSwyMDIsMTY2LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwyNTEsIDc1LDI0NiwKLSAgICAyMjUsMjQ2LDIzMiwyMjksMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjQwLDI0OSwyMzksMjI4LDIzMiwyMjksCi0gICAgMjI2LDI0MiwyMjksMTE5LDEyOCwgIDUsMjQxLDIyNywyMzMsMjQyLDIyNywyMzYsMTAxLDEyOCwgMzYsMjI5LAotICAgIDIyOCwyMzksMjQ0LDIyNiwyMjksMjM2LDIzOSwxMTksMTI4LCAzMCwxMjcsMTAxLCAgNiwyMDIsMjMzLDIwMiwKLSAgICAyNDQsMjAzLCA1MiwyMDMsIDYzLDIwMywgNjksMjAzLDEzNiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsCi0gICAgIDk5LDEyOCwgIDQsIDUwLDEwNCwgIDQsMjAyLDI1NCwyMDMsICA3LDIwMywgMjEsMjAzLCAzNywyMjUsMjQyLAotICAgIDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LDE2NCwyMzAsMjMzLDIzOCwyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwKLSAgICAyMzMsIDk5LDEyOCwyNTEsMTA3LDIzMywyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsCi0gICAgMjMzLCA5OSwxMjgsMjUxLDEwOCwyMzcsMjI5LDIyOCwyMzMsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLAotICAgICA5OSwxMjgsMjUxLDEwOSwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMjQ5LDIzOCwKLSAgICAyNDUsMTE1LDEyOCwgMzgsIDY0LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LCAgMiwyMDMsIDgwLDIwMywgODYsCi0gICAgMjI2LDIyNSwxMTQsMTI4LCAgMCwxMjQsMjM2LDIzMywyMzgsMTAxLCAgNCwyMDMsIDk5LDIwMywxMTAsMjAzLAotICAgIDEyMSwyMDMsMTMwLDIyNSwyMjYsMjM5LDI0NiwyMjksMjI3LDIzNywgOTgsMTI4LCAgMywgMTMsMjI2LDIyOSwKLSAgICAyMzYsMjM5LDI0NywyMjcsMjM3LCA5OCwxMjgsICAzLCA0MSwyMzYsMjM5LDI0NywyMzcsMjM5LDEwMCwxMjgsCi0gICAgICAyLDIwNCwyMzcsMjM5LDEwMCwxMjgsICAyLDIwMCwyNDcsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LAotICAgIDExMCwxMjgsICA1LDEyNiwyMzIsMjM5LDIzOSwxMDcsMTI4LCAgMiwxMzksMTA1LCAgMywyMDMsMTYzLDIwMywKLSAgICAxNzQsMjAzLDIxMywyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMjQ4LDI0MiwyMjUsCi0gICAgMjM3LCA5NywgIDMsMjAzLDE4NSwyMDMsMTk1LDIwMywyMDIsMjI2LDIyOSwyMzgsMjMxLDIyNSwyMzYsMTA1LAotICAgIDEyOCwgIDksMjA1LDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA3NywyMzEsMjQ1LDIzNCwyMjUsMjQyLDIyNSwKLSAgICAyNDQsMTA1LDEyOCwgMTAsMjA1LDI0MywyMjUsMjQyLDIzMSwgOTcsICAzLDIwMywyMjUsMjAzLDIzNSwyMDMsCi0gICAgMjQyLDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDEzMSwyMjgsMjI5LDI0NiwgOTcsMTI4LAotICAgICAgOSwgIDMsMjMxLDI0NSwyMzQsMjI1LDI0MiwyMjUsMjQ0LDEwNSwxMjgsIDEwLDEzMSwyMzcsMjM5LDIzOCwKLSAgICAyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LCA4NiwxMTEsICAzLDIwNCwgMTcsMjA0LCAyOCwyMDQsCi0gICAgIDk4LDIyNSwyNDIsMjM3LDIyOSwyMzgsMjMzLDIyNSwxMTAsMTI4LCAgNSwxMjAsMjMzLDIyNywyMjksMTAwLAotICAgICAgMiwyMDQsIDM3LDIwNCwgNzMsMjMzLDI0NCwyMjksMjQyLDIyNSwyNDQsMjMzLDIzOSwxMTAsICAyLDIwNCwKLSAgICAgNTEsMjA0LCA2MiwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTU4LDIzNSwyMjUsCi0gICAgMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyNTQsMjM3LDIyNSwyNDIsMjM1LDIzNSwyMjUsMjM4LAotICAgICA5NywxMjksIDQ4LDE1NSwyMDQsIDg2LDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwKLSAgICAyNTUsMTU4LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyNTAsMjQwLDIyNSwyNDIsCi0gICAgMjI5LDExMCwxMjgsIDM2LDE3NywxMTYsICAyLDIwNCwxMjMsMjA0LDEzMCwyMzMsMjM2LDIyOCwxMDEsMTI4LAotICAgICAzMCwxMjUsMjQ1LDI0MiwyMzgsMjI5LDEwMCwxMjgsICAyLDE0MCwxMTcsICAyLDIwNCwxNDQsMjA0LDE1NSwKLSAgICAyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTQ4LDIzNSwyMjUsMjQ0LDIyNSwyMzUsCi0gICAgMjI1LDIzOCwgOTcsMTI4LCA0OCwyNDQsMTE5LDE0MywgIDAsMTE5LDIwNCwyMDAsMjA1LDE3NywyMDUsMTg3LAotICAgIDIwNSwyMTAsMjA1LDI1MCwyMDYsIDYxLDIwNiwgNjksMjA4LCA0MCwyMDgsIDgxLDIwOCwgOTMsMjA4LDE2OCwKLSAgICAyMDgsMTc2LDIwOCwxODMsMjA4LDE5NCwyMDgsMjAzLCA5NywgIDgsMjA0LDIxOCwyMDQsMjI1LDIwNCwyMzUsCi0gICAgMjA0LDI0NiwyMDUsIDI4LDIwNSwgNjAsMjA1LCA3MiwyMDUsMTA4LDIyNywyNDUsMjQ0LDEwMSwxMjgsIDMwLAotICAgIDEzMSwyMjksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgODksMjMyLDIzMywyNDIsMjI1LDIzMSwKLSAgICAyMjUsMjM4LCA5NywxMjgsIDQ4LDE0MywxMDcsICAyLDIwNCwyNTIsMjA1LCAyMCwyMjUsMjQ0LDIyNSwyMzUsCi0gICAgMjI1LDIzOCwgOTcsMTI5LCA0OCwyMzksMjA1LCAgOCwyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LAotICAgIDEwNCwxMjgsMjU1LDE1NiwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDg4LDI0MywyMzcsMjI1LDIzNiwKLSAgICAxMDgsICAyLDIwNSwgMzgsMjA1LCA0OSwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsCi0gICAgMTQyLDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwyMzgsMjQ0LDI0NCwyMzksMjQzLAotICAgIDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCA1MSwgODcsMTE4LCAgMiwyMDUsIDc4LDIwNSwgODYsMjI5LDIyOCwKLSAgICAyMjUsMjQzLDEwNCwxMjgsIDQ4LCAyOCwyNDksMjQ1LDIzOCwyMjgsMjI5LDI0MiwyNDMsMjI3LDIzOSwyNDIsCi0gICAgMjI5LDI0NiwyMjksMjQyLDI0NCwyMzMsMjI3LDIyNSwxMDgsMTI4LDI1NCwgNTIsMTE5LCAgMywyMDUsMTE2LAotICAgIDIwNSwxMjUsMjA1LDEzOSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA3MiwyMzAsMjMzLDIzOCwKLSAgICAyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjM4LDIzMiwyMjUsMjM3LDI1MCwyMjUsCi0gICAgMjI1LDIyNiwyMzksMjQ2LDEwMSwgIDIsMjA1LDE1NCwyMDUsMTYzLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LAotICAgIDEyOCwgIDYsIDM2LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwKLSAgICAxMzQsMjI2LDI0MywyNDEsMjQ1LDIyNSwyNDIsMTAxLDEyOCwgNTEsMjIxLDIyNywyMzMsMjQyLCA5OSwgIDIsCi0gICAgMjA1LDE5NiwyMDUsMjAxLDIzNiwxMDEsMTI4LCAzNiwyMzAsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTI4LAotICAgICAgMSwxMTcsMTAwLCAgMiwyMDUsMjE2LDIwNSwyMjYsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEyOCwKLSAgICAgMzAsMTMzLDIzOSwxMTYsICAyLDIwNSwyMzMsMjA1LDI0MiwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsCi0gICAgIDMwLDEzNSwyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMTM3LDEwMSwgIDQsMjA2LCAgNCwyMDYsIDE1LAotICAgIDIwNiwgMjcsMjA2LCA1MSwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsIDk3LDEyOCwgNDgsMTQ1LDIzMywKLSAgICAyMjksMjQyLDI0MywyNDQsMjQyLDIyNSwyNDMsMTE1LDEyOCwgMzMsIDI0LDEwNywgIDIsMjA2LCAzMywyMDYsCi0gICAgIDQzLDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDI0MSwyMzksMjQyLDIyOSwyMjUsMTEwLAotICAgIDEyOCwgNDksIDk0LDIzOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA5MywyMzEsMjQyLDIyNSwKLSAgICAyNDYsMTAxLDEyOCwgMzAsMTI5LDIzMiwyMzMsMjQ0LDEwMSwgIDgsMjA2LCA5MCwyMDYsIDk5LDIwNiwxODMsCi0gICAgMjA3LCAxNywyMDcsMTAxLDIwNywxNDYsMjA3LDE5OCwyMDcsMjU0LDIyNiwyNDUsMjM2LDIzNiwyMjksMTE2LAotICAgIDEyOCwgMzcsMjMwLCA5OSwgIDIsMjA2LDEwNSwyMDYsMTI1LDIzMywyNDIsMjI3LDIzNiwxMDEsMTI5LCAzNywKLSAgICAyMDMsMjA2LDExNSwyMzMsMjM4LDI0NiwyMjksMjQyLDI0MywxMDEsMTI4LCAzNywyMTcsMjM5LDI0MiwyMzgsCi0gICAgMjI5LDI0MiwyMjYsMjQyLDIyNSwyMjcsMjM1LDIyOSwxMTYsICAyLDIwNiwxNDIsMjA2LDE2MiwyMzYsMjI5LAotICAgIDIzMCwxMTYsMTI5LCA0OCwgMTQsMjA2LDE1MSwyNDYsMjI5LDI0MiwyNDQsMjMzLDIyNywyMjUsMTA4LDEyOCwKLSAgICAyNTQsIDY3LDI0MiwyMzMsMjMxLDIzMiwxMTYsMTI5LCA0OCwgMTUsMjA2LDE3MiwyNDYsMjI5LDI0MiwyNDQsCi0gICAgMjMzLDIyNywyMjUsMTA4LDEyOCwyNTQsIDY4LDEwMCwgIDIsMjA2LDE4OSwyMDYsMjMwLDIzMywyMjUsMjM3LAotICAgIDIzOSwyMzgsMTAwLDEyOSwgMzcsMTk5LDIwNiwyMDAsMjI3LDIzOSwyMzgsMjQ0LDIyNSwyMzMsMjM4LDIzMywKLSAgICAyMzgsMjMxLDIyNiwyMzYsMjI1LDIyNywyMzUsMjQzLDIzNywyMjUsMjM2LDIzNiwyMjgsMjMzLDIyNSwyMzcsCi0gICAgMjM5LDIzOCwxMDAsMTI4LCAzNywyMDAsMjM5LDI0NywyMzgsMjQwLDIzOSwyMzMsMjM4LDI0NCwyMzMsMjM4LAotICAgIDEwMywgIDIsMjA2LDI0NiwyMDcsICA2LDI0MywyMzcsMjI1LDIzNiwyMzYsMjQ0LDI0MiwyMzMsMjI1LDIzOCwKLSAgICAyMzEsMjM2LDEwMSwxMjgsIDM3LDE5MSwyNDQsMjQyLDIzMywyMjUsMjM4LDIzMSwyMzYsMTAxLDEyOCwgMzcsCi0gICAgMTg5LDIzNiwxMDEsICAyLDIwNywgMjQsMjA3LCA2NiwyMzAsMjQ0LDI0MCwyMzksMjMzLDIzOCwyNDQsMjMzLAotICAgIDIzOCwxMDMsICAyLDIwNywgMzksMjA3LCA1NSwyNDMsMjM3LDIyNSwyMzYsMjM2LDI0NCwyNDIsMjMzLDIyNSwKLSAgICAyMzgsMjMxLDIzNiwxMDEsMTI4LCAzNywxOTUsMjQ0LDI0MiwyMzMsMjI1LDIzOCwyMzEsMjM2LDEwMSwxMjgsCi0gICAgIDM3LDE5MywyMzgsMjQ0LDIzMywyMjcsMjQ1LDIzNiwyMjUsMjQyLDIyNiwyNDIsMjI1LDIyNywyMzUsMjI5LAotICAgIDExNiwgIDIsMjA3LCA4NiwyMDcsIDkzLDIzNiwyMjksMjMwLDExNiwxMjgsIDQ4LCAyMiwyNDIsMjMzLDIzMSwKLSAgICAyMzIsMTE2LDEyOCwgNDgsIDIzLDI0MiwyMzMsMjMxLDIzMiwyNDQsMjQwLDIzOSwyMzMsMjM4LDI0NCwyMzMsCi0gICAgMjM4LDEwMywgIDIsMjA3LDExOSwyMDcsMTM1LDI0MywyMzcsMjI1LDIzNiwyMzYsMjQ0LDI0MiwyMzMsMjI1LAotICAgIDIzOCwyMzEsMjM2LDEwMSwxMjgsIDM3LDE4NSwyNDQsMjQyLDIzMywyMjUsMjM4LDIzMSwyMzYsMTAxLDEyOCwKLSAgICAgMzcsMTgzLDExNSwgIDMsMjA3LDE1NCwyMDcsMTg0LDIwNywxOTIsMTA5LCAgMiwyMDcsMTYwLDIwNywxNzIsCi0gICAgMjI1LDIzNiwyMzYsMjQzLDI0MSwyNDUsMjI1LDI0MiwxMDEsMTI4LCAzNywxNzEsMjMzLDIzNiwyMzMsMjM4LAotICAgIDIzMSwyMzAsMjI1LDIyNywxMDEsMTI4LCAzOCwgNTgsMjQxLDI0NSwyMjUsMjQyLDEwMSwxMjgsIDM3LDE2MSwKLSAgICAyNDQsMjI1LDExNCwxMjgsIDM4LCAgNiwxMTYsICAyLDIwNywyMDQsMjA3LDIxNSwyMjksMjM2LDIyOSwyNDAsCi0gICAgMjMyLDIzOSwyMzgsMTAxLDEyOCwgMzgsIDE1LDIzOSwyNDIsMjQ0LDIzOSwyMzMsMjQzLDIyOSwyNDMsMjMyLAotICAgIDIyOSwyMzYsMjM2LDIyNiwyNDIsMjI1LDIyNywyMzUsMjI5LDExNiwgIDIsMjA3LDIzOSwyMDcsMjQ2LDIzNiwKLSAgICAyMjksMjMwLDExNiwxMjgsIDQ4LCAyNCwyNDIsMjMzLDIzMSwyMzIsMTE2LDEyOCwgNDgsIDI1LDI0NSwyNDAsCi0gICAgMjQwLDIzOSwyMzMsMjM4LDI0NCwyMzMsMjM4LDEwMywgIDIsMjA4LCAxMywyMDgsIDI5LDI0MywyMzcsMjI1LAotICAgIDIzNiwyMzYsMjQ0LDI0MiwyMzMsMjI1LDIzOCwyMzEsMjM2LDEwMSwxMjgsIDM3LDE4MSwyNDQsMjQyLDIzMywKLSAgICAyMjUsMjM4LDIzMSwyMzYsMTAxLDEyOCwgMzcsMTc5LDEwNSwgIDIsMjA4LCA0NiwyMDgsIDU3LDIzMiwyMzMsCi0gICAgMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxNDQsMTA3LCAgMiwyMDgsIDYzLDIwOCwgNzMsMjI1LAotICAgIDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMjQwLDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwKLSAgICAgOTUsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgODcsMTExLCAgNCwyMDgsCi0gICAgMTAzLDIwOCwxMTQsMjA4LDEzOSwyMDgsMTU3LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LAotICAgICA0OCwxNDYsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDI0MiwyMDgsMTI3LDIzMiwKLSAgICAyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTAyLDExMCwxMjksIDMyLDE2OSwyMDgsCi0gICAgMTQ1LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsMjMwLDI0NywyMjUsMjI5LAotICAgIDIzOCwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgMzksMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDE3OCwKLSAgICAyNDIsMjMzLDIzOCwxMDMsMTI4LCAzMCwxNTIsMjQzLDI0NSwyNDAsMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsCi0gICAgICAyLDE4MywyNDQsMjQ1LDI0MiwyMzgsMjI5LDEwMCwxMjgsICAyLDE0MSwyNDksMjM4LDExMCwxMjgsICAxLAotICAgIDE5MSwxMjAsMTM3LCAgMCwxMjAsMjA4LDIzMSwyMDgsMjQyLDIwOCwyNTMsMjA5LCAgNiwyMDksIDMzLDIwOSwKLSAgICAgNDYsMjA5LCA1MCwyMDksIDYyLDIwOSwgNzAsMjI1LDIyNiwyMzksMjQ2LDIyOSwyMjcsMjM3LCA5OCwxMjgsCi0gICAgICAzLCA2MSwyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDE4LDIyNywyMzMsMjQyLAotICAgIDIyNywyMzYsMTAxLDEyOCwgMzYsMjMxLDEwMCwgIDIsMjA5LCAxMiwyMDksIDIyLDIzMywyMjksMjQyLDIyOSwKLSAgICAyNDMsMjMzLDExNSwxMjgsIDMwLDE0MSwyMzksMjQ0LDIyNSwyMjcsMjI3LDIyOSwyMzgsMTE2LDEyOCwgMzAsCi0gICAgMTM5LDIyOSwyMzIsMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDEwOSwxMDUsMTI4LAotICAgICAgMywxOTAsMjM3LDIzOSwyMzgsMjM5LDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LDI1NSwgODgsMjQwLDIyNSwKLSAgICAyNDIsMjI5LDExMCwxMjgsIDM2LDE3OSwyNDMsMjQ1LDI0MCwyMjksMjQyLDIzMywyMzksMTE0LDEyOCwgIDIsCi0gICAgMjI3LDEyMSwxNDMsICAwLDEyMSwyMDksMTE1LDIxMCwgNzQsMjEwLCA5NywyMTAsMTM3LDIxMiwxMDMsMjEyLAotICAgIDExMSwyMTIsMTI4LDIxMiwxOTIsMjEyLDIwNCwyMTMsMjAxLDIxMywyNDEsMjEzLDI1MywyMTQsICA4LDIxNCwKLSAgICAgMjksMjE1LCAgMiwgOTcsIDExLDIwOSwxMzksMjA5LDE1MSwyMDksMTYxLDIwOSwxNjgsMjA5LDE3NSwyMDksCi0gICAgMTg1LDIwOSwyMTAsMjA5LDIyMSwyMTAsICAzLDIxMCwgMTYsMjEwLCA2MiwyMjUsMjI4LDIzOSwyNDMsMjQxLAotICAgIDI0NSwyMjUsMjQyLDEwMSwxMjgsIDUxLCA3OCwyMjYsMjI5LDIzOCwyMzEsMjI1LDIzNiwxMDUsMTI4LCAgOSwKLSAgICAxNzUsMjI3LDI0NSwyNDQsMTAxLDEyOCwgIDAsMjUzLDIyOCwyMjksMjQ2LCA5NywxMjgsICA5LCA0NywyMjksCi0gICAgMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwgODIsMjMxLDExNywgIDIsMjA5LDE5MiwyMDksMjAxLAotICAgIDIzNCwyMjUsMjQyLDIyNSwyNDQsMTA1LDEyOCwgMTAsMTc1LDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwKLSAgICAgMTAsIDQ3LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMzIsMTA3LCAgMiwyMDksCi0gICAgMjI3LDIwOSwyNTEsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjI4LDIwOSwyMzksMjMyLAotICAgIDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxNDgsMjM5LDI0MiwyMjksMjI1LDExMCwKLSAgICAxMjgsIDQ5LCA4MSwyMzcsMjI1LDIzNSwyMzUsMjI1LDIzOCwyNDQsMjMyLDIyNSwxMDUsMTI4LCAxNCwgNzgsCi0gICAgMjQzLDIzNywyMjUsMjM2LDEwOCwgIDIsMjEwLCAyNiwyMTAsIDM3LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LAotICAgIDIzOCwgOTcsMTI4LCA0OCwxMzEsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIyNywKLSAgICAyMTAsIDUwLDIzMiwyMjUsMjM2LDIzMCwyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTA4LDI0NCwyMjcsCi0gICAgMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDk5LDIyNywyMzMsMjQyLCA5OSwgIDIsMjEwLAotICAgICA4MywyMTAsIDg4LDIzNiwxMDEsMTI4LCAzNiwyMzIsMjQ1LDIzNywyMzAsMjM2LDIyOSwxMjAsMTI4LCAgMSwKLSAgICAxMTksMTAwLCAgMiwyMTAsMTAzLDIxMCwxMTMsMjMzLDIyOSwyNDIsMjI5LDI0MywyMzMsMTE1LDEyOCwgIDAsCi0gICAgMjU1LDIzOSwxMTYsICAyLDIxMCwxMjAsMjEwLDEyOSwyMjUsMjI3LDIyNywyMjksMjM4LDExNiwxMjgsIDMwLAotICAgIDE0MywyMjYsMjI5LDIzNiwyMzksMTE5LDEyOCwgMzAsMjQ1LDEwMSwgIDcsMjEwLDE1MywyMTEsMTYxLDIxMSwKLSAgICAxNzAsMjExLDE4OCwyMTEsMjIwLDIxMiwgNDAsMjEyLCA5MSwxMDQsICA4LDIxMCwxNzEsMjEwLDE4MCwyMTAsCi0gICAgMjE0LDIxMCwyMjgsMjExLCA0NSwyMTEsIDYxLDIxMSwxMjAsMjExLDEzOCwyMjUsMjQyLDIyNSwyMjYsMjMzLAotICAgICA5OSwxMjgsICA2LCA3NCwyMjYsMjI1LDI0MiwyNDIsMjI5LDEwMSwgIDIsMjEwLDE5MSwyMTAsMjAwLDIyNSwKLSAgICAyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsMjEwLDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsCi0gICAgMjI2LDIzMywgOTksMTI4LDI1MSwxNzUsMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLAotICAgICA5OSwxMjgsMjU0LDI0MiwyMzIsMjI1LDIzNywyNTAsMjI1LDIyNSwyMjYsMjM5LDI0NiwxMDEsICA0LDIxMCwKLSAgICAyNDcsMjExLCAgMCwyMTEsIDE0LDIxMSwgMzAsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LCAgNiwgMzgsCi0gICAgMjMwLDIzMywyMzgsMjI1LDIzNiwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjU0LDEzOCwyMzMsMjM4LAotICAgIDIzMywyNDQsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxMzksMjM3LDIyOSwKLSAgICAyMjgsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxNDAsMjMzLDIzOCwyMzMsCi0gICAgMjQ0LDIzMywyMjUsMjM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwyNTQsMjQzLDIzNywxMDEsICAyLAotICAgIDIxMSwgNjgsMjExLCA4MSwyMjgsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwKLSAgICAyNDQsMjI5LDIzNywxMDUsICAyLDIxMSwgODksMjExLDEwNCwyMzgsMjMzLDI0NCwyMzMsMjI1LDIzNiwyMjUsCi0gICAgMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsMjUyLDIyMSwyNDMsMjM5LDIzNiwyMjUsMjQ0LDIyOSwyMjgsMjI1LAotICAgIDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwgODgsMjM4LDIzOSwyMzksMjM4LDIzMCwyMzMsMjM4LDIyNSwKLSAgICAyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1MiwxNDgsMjQ0LDIzMiwyNDIsMjI5LDIyOSwyMjgsCi0gICAgMjM5LDI0NCwyNDMsMjI2LDIyOSwyMzYsMjM5LDI0NywyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LAotICAgIDIwOSwyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA4NiwxMTAsMTI5LCAgMCwxNjUsMjExLDE3NiwKLSAgICAyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LDEwMSwxMjgsMjU1LDIyOSwxMTEsICAyLDIxMSwxOTQsCi0gICAgMjExLDIwMywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA4NSwyNDIsMjMzLDIzOCwyMzIsMjMzLAotICAgIDIyOSwyNDUsMjMyLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTM0LDExNCwgIDMsMjExLDIyOCwKLSAgICAyMTIsICA4LDIxMiwgMjAsMjI1LDIzMiwyMjYsMjI5LDIzOCwyNDksMjM5LDIzNywxMTEsICAyLDIxMSwyNDIsCi0gICAgMjExLDI1MSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3MCwyMzYsMjI5LDIzMCwyNDQsMjMyLAotICAgIDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwxNzAsMjMzLDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywKLSAgICAgOTksMTI4LCAgNCwgNzUsMjQ1LDIyOCwyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywyNDMsMjI3LDI0OSwyNDIsCi0gICAgMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDI0OSwyNDMsMjMzLDIyOSwyNDUsMjM4LDEwMywgIDMsMjEyLAotICAgICA1MywyMTIsIDYyLDIxMiwgNzgsMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMjksMjQwLDIyNSwKLSAgICAyMzgsMjQzLDIzMywyMzksMjQzLDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTMxLDI0MywyMzMsCi0gICAgMjM5LDI0MywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDEzMCwyNDQsMjMzLDI0NiwyMzIsMjI5LAotICAgIDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE1NCwyMzEsMjQyLDIyNSwyNDYsMTAxLDEyOCwgMzAsMjQzLDIzMiwKLSAgICAyMzksMjM5LDEwNywxMjksICAxLDE4MCwyMTIsMTIwLDIyNSwyMjYsMjM5LDI0NiwxMDEsMTI4LCAzMCwyNDcsCi0gICAgMTA1LCAgNSwyMTIsMTQwLDIxMiwxNTEsMjEyLDE2MiwyMTIsMTcxLDIxMiwxNzksMjI1LDI0MiwyMzcsMjI5LAotICAgIDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDExNywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwKLSAgICAgIDQsIDg3LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksIDk4LDIzOCwyNDksMjI1LDIzOCwxMDMsCi0gICAgMTI4LCAzOCwgNDcsMjQ3LDIzOCwyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsMTMwLAotICAgIDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsIDg5LDExMSwgIDcsMjEyLDIyMCwKLSAgICAyMTMsIDM0LDIxMywgNDUsMjEzLCA1NSwyMTMsIDkzLDIxMywxMzksMjEzLDE0OCwxMDAsMTMxLCAgNSwyMTcsCi0gICAgMjEyLDIzMCwyMTIsMjUwLDIxMywgIDMsMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwgNTcsMjEyLAotICAgIDI0MSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA1NywyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwKLSAgICAxMjgsICA1LDIxNywyNDksMjM5LDEwMCwgIDIsMjEzLCAxMSwyMTMsIDIwLDIzMiwyMjksMjI2LDI0MiwyMjksCi0gICAgMTE5LDEyOCwgIDUsMjQyLDI0MCwyMjUsMjQ0LDIyNSwyMzIsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LAotICAgIDI1MSwgMzEsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsIDQ4LDEzNiwyMzMsMjM1LDIzOSwKLSAgICAyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMzcsMTA3LCAgMiwyMTMsIDYxLDIxMywgODUsMjI1LDI0NCwyMjUsCi0gICAgMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjMyLDIxMywgNzMsMjMyLDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LAotICAgIDI0NCwxMDQsMTI4LDI1NSwxNTAsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LCA5MSwyNDMsMjM3LDIyNSwKLSAgICAyMzYsMTA4LCAgMiwyMTMsMTAzLDIxMywxMTQsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsCi0gICAgIDQ4LDEzNSwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOSwgNDgsMjMxLDIxMywxMjcsMjMyLAotICAgIDIyNSwyMzYsMjMwLDI0NywyMzMsMjI4LDI0NCwxMDQsMTI4LDI1NSwxMTAsMjQ0LDIzMSwyNDIsMjI5LDIyOSwKLSAgICAxMDcsMTI4LCAgMywyNDMsMTIxLCAgMiwyMTMsMTU0LDIxMywxOTEsIDk3LCAgMiwyMTMsMTYwLDIxMywxNzAsCi0gICAgMjI5LDIzNSwyMzksMjQyLDIyOSwyMjUsMTEwLDEyOCwgNDksMTM2LDEwNywgIDIsMjEzLDE3NiwyMTMsMTg0LAotICAgIDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LCA0OSwxMzUsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDM0LDIzMywKLSAgICAyMzgsMjMxLDI0NCwyMzIsMjI1LDEwNSwxMjgsIDE0LCAxMywxMTIsICAyLDIxMywyMDcsMjEzLDIxNCwyMjUsCi0gICAgMjQyLDIyOSwxMTAsMTI4LCAzNiwxODAsMjM5LDIzMSwyMjksMjMxLDI0MiwyMjUsMjM3LDIzNywyMjksMjM4LAotICAgIDEwNSwxMjksICAzLDEyMiwyMTMsMjMwLDIzMSwyNDIsMjI5LDIyOSwyMzUsMjI3LDIzNywgOTgsMTI4LCAgMywKLSAgICAgNjksMTE0LDEyOSwgIDEsMTY2LDIxMywyNDcsMjMzLDIzOCwxMDMsMTI4LCAzMCwxNTMsMjQzLDI0NSwyNDAsCi0gICAgMjI5LDI0MiwyMzMsMjM5LDExNCwxMjgsICAyLDE4NCwxMTYsICAyLDIxNCwgMTQsMjE0LCAyMSwyMzMsMjM2LAotICAgIDIyOCwxMDEsMTI4LCAzMCwyNDksMjQ1LDI0MiwyMzgsMjI5LDEwMCwxMjgsICAyLDE0MiwxMTcsICA1LDIxNCwKLSAgICAgNDEsMjE0LCA1MiwyMTQsIDYyLDIxNCwxMDAsMjE0LDIzMiwyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwyMzgsCi0gICAgIDk3LDEyOCwgNDgsMTM0LDIzMywyMzUsMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDE0MCwxMDcsICAyLAotICAgIDIxNCwgNjgsMjE0LCA5MiwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI5LCA0OCwyMzAsMjE0LCA4MCwKLSAgICAyMzIsMjI1LDIzNiwyMzAsMjQ3LDIzMywyMjgsMjQ0LDEwNCwxMjgsMjU1LDE0OSwyMzksMjQyLDIyOSwyMjUsCi0gICAgMTEwLDEyOCwgNDksIDk2LDExNSwgIDMsMjE0LDEwOCwyMTQsMTQ2LDIxNCwxODcsMjI2LDIzMywxMDMsICAyLAotICAgIDIxNCwxMTYsMjE0LDEyNywyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTA3LDIzMywKLSAgICAyMzksMjQ0LDIzMywyMzAsMjMzLDIyOSwyMjgsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsCi0gICAgICA0LDEwOSwyMzYsMjMzLDI0NCwyNDQsMjM2LDEwMSwgIDIsMjE0LDE1NywyMTQsMTY4LDIyNywyNDksMjQyLAotICAgIDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwxMDMsMjMzLDIzOSwyNDQsMjMzLDIzMCwyMzMsMjI5LDIyOCwKLSAgICAyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMTA1LDIzNywyMjUsMjM2LDEwOCwgIDIsCi0gICAgMjE0LDE5NiwyMTQsMjA3LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LCA0OCwxMzMsMjM1LAotICAgIDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjksIDQ4LDIyOSwyMTQsMjIwLDIzMiwyMjUsMjM2LDIzMCwKLSAgICAyNDcsMjMzLDIyOCwyNDQsMTA0LDEyOCwyNTUsMTA5LDI0OSwxMDEsICAyLDIxNCwyMzksMjE0LDI0OCwyMzUsCi0gICAgMjM5LDI0MiwyMjksMjI1LDExMCwxMjgsIDQ5LDEzOSwyMzksMjM1LDIzOSwyNDIsMjI5LDIyNSwxMTAsMTI4LAotICAgICA0OSwxMzgsMjQ5LCA5NywgIDIsMjE1LCAgOSwyMTUsIDE5LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwKLSAgICAxMjgsICA5LDIyMywyMjgsMjI5LDI0NiwgOTcsMTI4LCAgOSwgOTUsMTIyLDE0MiwgIDAsMTIyLDIxNSwgNTgsCi0gICAgMjE2LCA2NiwyMTYsIDc3LDIxNiwxMjAsMjE2LDE0NywyMTcsMTgyLDIxOCwgMzQsMjE4LCA3NiwyMTgsIDg4LAotICAgIDIxOCwxMDAsMjE4LDEyOCwyMTgsMTM2LDIxOCwxNTIsMjE4LDE2MSwgOTcsIDEwLDIxNSwgODAsMjE1LCA5MSwKLSAgICAyMTUsIDk4LDIxNSwxMDUsMjE1LDExNiwyMTUsMTk0LDIxNSwyMjQsMjE1LDIzNSwyMTYsIDE1LDIxNiwgMjcsCi0gICAgMjI1LDI0MiwyMzcsMjI5LDIzOCwyMzMsMjI1LDExMCwxMjgsICA1LDEwMiwyMjcsMjQ1LDI0NCwxMDEsMTI4LAotICAgICAgMSwxMjIsMjI4LDIyOSwyNDYsIDk3LDEyOCwgIDksIDkxLDIzMSwyNDUsMjQyLDIzNywyNDUsMjM1LDIzMiwKLSAgICAxMDUsMTI4LCAxMCwgOTEsMTA0LCAgNCwyMTUsMTI2LDIxNSwxMzUsMjE1LDE0OSwyMTUsMTc5LDIyNSwyNDIsCi0gICAgMjI1LDIyNiwyMzMsIDk5LDEyOCwgIDYsIDU2LDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LAotICAgIDIzMywgOTksMTI4LDI1NCwxOTgsMTA1LCAgMiwyMTUsMTU1LDIxNSwxNzAsMjM4LDIzMywyNDQsMjMzLDIyNSwKLSAgICAyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxOTksMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsCi0gICAgMTI4LCA0OCwgODYsMjM3LDIyOSwyMjgsMjMzLDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LAotICAgIDI1NCwyMDAsMjMzLDExMCwgIDIsMjE1LDIwMSwyMTUsMjEwLDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LDEyOCwKLSAgICAgIDYsIDUwLDIzMCwyMzMsMjM4LDIyNSwyMzYsMjI1LDI0MiwyMjUsMjI2LDIzMywgOTksMTI4LDI1NCwxNzYsCi0gICAgMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE4MiwyNDEsMjI5LDEwMiwgIDIsMjE1LAotICAgIDI0MywyMTYsICAxLDIzMSwyMjUsMjI4LDIzOSwyMzYsMjMyLDIyOSwyMjYsMjQyLDIyOSwxMTksMTI4LCAgNSwKLSAgICAxNDksMjQxLDIyNSwyNDQsMjI1LDIzOCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE0OCwyNDIsCi0gICAgMjQxLDIyNSwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE1MiwyNDksMjMzLDExMCwxMzAsICA1LAotICAgIDIxNCwyMTYsIDM3LDIxNiwgNTcsMjI4LDIyNSwyMzEsMjI5LDI0MywxMDQsMTI5LDI1MSwgNTQsMjE2LCA0OCwKLSAgICAyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsMjUxLCA1NCwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsCi0gICAgICA1LDIxNCwyMjYsMjM5LDI0MCwyMzksMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDIzLCA5OSwgIDMsMjE2LAotICAgICA4NSwyMTYsIDkyLDIxNiwxMTQsMjI1LDI0MiwyMzksMTEwLDEyOCwgIDEsMTI2LDIzMywyNDIsIDk5LCAgMiwKLSAgICAyMTYsMTAwLDIxNiwxMDUsMjM2LDEwMSwxMjgsIDM2LDIzMywyNDUsMjM3LDIzMCwyMzYsMjI5LDEyMCwxMjgsCi0gICAgIDMwLDE0NSwyNDUsMjQyLDEwOCwxMjgsICAyLDE0NSwyMjgsMjM5LDExNiwxMzAsICAxLDEyNCwyMTYsMTMwLAotICAgIDIxNiwxMzksMjI1LDIyNywyMjcsMjI5LDIzOCwxMTYsMTI4LCAgMSwxMjQsMjI2LDIyOSwyMzYsMjM5LDExOSwKLSAgICAxMjgsIDMwLDE0NywxMDEsICA2LDIxNiwxNjEsMjE2LDE3MiwyMTYsMjE1LDIxNiwyMjYsMjE2LDIzNywyMTcsCi0gICAgMTc3LDIyNywyNDksMjQyLDIzMywyMzYsMjM2LDIzMywgOTksMTI4LCAgNCwgNTUsMTAwLCAgMiwyMTYsMTc4LAotICAgIDIxNiwxOTcsMjI5LDI0MywyMjcsMjI5LDIzOCwyMjgsMjI5LDI0MiwyMjcsMjQ5LDI0MiwyMzMsMjM2LDIzNiwKLSAgICAyMzMsIDk5LDEyOCwgIDQsMTUzLDIzMywyMjksMjQyLDIyOSwyNDMsMjMzLDI0MywyMjcsMjQ5LDI0MiwyMzMsCi0gICAgMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsMjIzLDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LDIzOCwgOTcsMTI4LAotICAgICA0OCwgOTIsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE4OCwyNDIsMTExLDE0MCwKLSAgICAgIDAsIDQ4LDIxNywgMTAsMjE3LCAxOSwyMTcsIDI5LDIxNywgMzYsMjE3LCA2MSwyMTcsIDc0LDIxNywgODUsCi0gICAgMjE3LCA5NywyMTcsMTA4LDIxNywxMTgsMjE3LDEyOSwyMTcsMTM2LDIyNSwyNDIsMjI1LDIyNiwyMzMsIDk5LAotICAgIDEyOCwgIDYsIDk2LDIyNiwyMjksMjM4LDIzMSwyMjUsMjM2LDEwNSwxMjgsICA5LDIzMCwyMjgsMjI5LDI0NiwKLSAgICAgOTcsMTI4LCAgOSwxMDIsMjMxLDExNywgIDIsMjE3LCA0MywyMTcsIDUyLDIzNCwyMjUsMjQyLDIyNSwyNDQsCi0gICAgMTA1LDEyOCwgMTAsMjMwLDI0MiwyMzcsMjQ1LDIzNSwyMzIsMTA1LDEyOCwgMTAsMTAyLDIzMiwyMjUsMjI3LAotICAgIDIzNSwyMjUsMjQyLDIyNSwyMjYsMjMzLCA5OSwxMjgsICA2LCA5NiwyMzMsMjM4LDIzMCwyMjksMjQyLDIzMywKLSAgICAyMzksMTE0LDEyOCwgMzIsMTI4LDIzNywyMzksMjM4LDIzOSwyNDMsMjQwLDIyNSwyMjcsMTAxLDEyOCwyNTUsCi0gICAgIDE2LDIzOSwyMzYsMjI4LDI0MywyNDQsMjQ5LDIzNiwxMDEsMTI4LDI0NywgNDgsMjQwLDIyOSwyNDIsMjQzLAotICAgIDIzMywyMjUsMTEwLDEyOCwgIDYsMjQwLDI0MywyNDUsMjQwLDIyOSwyNDIsMjMzLDIzOSwxMTQsMTI4LCAzMiwKLSAgICAxMTIsMjQ0LDIzMiwyMjUsMTA1LDEyOCwgMTQsIDgwLDI0NywyMzMsMjI4LDI0NCwxMDQsICAzLDIxNywxNDgsCi0gICAgMjE3LDE1NywyMTcsMTY5LDIzNCwyMzksMjMzLDIzOCwyMjksMTE0LDEyOCwyNTQsMjU1LDIzOCwyMzksMjM4LAotICAgIDIzNCwyMzksMjMzLDIzOCwyMjksMTE0LDEyOCwgMzIsIDEyLDI0MywyNDAsMjI1LDIyNywxMDEsMTI4LCAzMiwKLSAgICAgMTEsMjQ0LCA5NywxMjgsICAzLDE4MiwxMDQsICAyLDIxNywxODgsMjE3LDE5OSwyMjYsMjM5LDI0MCwyMzksCi0gICAgMjM3LDIzOSwyMzAsMTExLDEyOCwgNDksIDE5LDEwMSwgIDQsMjE3LDIwOSwyMTcsMjIwLDIxNywyMzYsMjE3LAotICAgIDI0NywyMjUsMjQyLDIzNywyMjksMjM4LDIzMywyMjUsMTEwLDEyOCwgIDUsMTA2LDIyNiwyNDIsMjI5LDI0NiwKLSAgICAyMjksMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE5NCwyMjcsMjQ5LDI0MiwyMzMsCi0gICAgMjM2LDIzNiwyMzMsIDk5LDEyOCwgIDQsIDU0LDEwMCwgIDIsMjE3LDI1MywyMTgsIDE2LDIyOSwyNDMsMjI3LAotICAgIDIyOSwyMzgsMjI4LDIyOSwyNDIsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsICA0LDE1MSwKLSAgICAyMzMsMjI5LDI0MiwyMjksMjQzLDIzMywyNDMsMjI3LDI0OSwyNDIsMjMzLDIzNiwyMzYsMjMzLCA5OSwxMjgsCi0gICAgICA0LDIyMSwxMDUsICAzLDIxOCwgNDIsMjE4LCA1MywyMTgsIDY0LDIzMiwyMzMsMjQyLDIyNSwyMzEsMjI1LAotICAgIDIzOCwgOTcsMTI4LCA0OCwgODgsMjM1LDIyNSwyNDQsMjI1LDIzNSwyMjUsMjM4LCA5NywxMjgsIDQ4LDE4NCwKLSAgICAyMzgsMjM5LDI0MiwyMzIsMjI5LDIyNiwyNDIsMjI5LDExOSwxMjgsICA1LDE3NCwyMzYsMjMzLDIzOCwyMjksCi0gICAgMjI2LDIyOSwyMzYsMjM5LDExOSwxMjgsIDMwLDE0OSwyMzcsMjM5LDIzOCwyMzksMjQzLDI0MCwyMjUsMjI3LAotICAgIDEwMSwxMjgsMjU1LCA5MCwxMTEsICAyLDIxOCwxMDYsMjE4LDExNywyMzIsMjMzLDI0MiwyMjUsMjMxLDIyNSwKLSAgICAyMzgsIDk3LDEyOCwgNDgsIDk0LDIzNSwyMjUsMjQ0LDIyNSwyMzUsMjI1LDIzOCwgOTcsMTI4LCA0OCwxOTAsCi0gICAgMjQwLDIyNSwyNDIsMjI5LDExMCwxMjgsIDM2LDE4MSwyNDIsMjI5LDI0NCwyNDIsMjM5LDIzMCwyMzYsMjI5LAotICAgIDI0OCwyMzIsMjM5LDIzOSwxMDcsMTI4LCAgMiwxNDQsMjQzLDI0NCwyNDIsMjM5LDIzNSwxMDEsMTI4LCAgMSwKLSAgICAxODIsMTE3LCAgMiwyMTgsMTY3LDIxOCwxNzgsMjMyLDIzMywyNDIsMjI1LDIzMSwyMjUsMjM4LCA5NywxMjgsCi0gICAgIDQ4LCA5MCwyMzUsMjI1LDI0NCwyMjUsMjM1LDIyNSwyMzgsIDk3LDEyOCwgNDgsMTg2Ci0gIH07Ci0KLQotICAvKgotICAgKiAgVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyB0aGUgY29tcHJlc3NlZCB0YWJsZSBlZmZpY2llbnRseS4KLSAgICovCi0gIHN0YXRpYyB1bnNpZ25lZCBsb25nCi0gIGZ0X2dldF9hZG9iZV9nbHlwaF9pbmRleCggY29uc3QgY2hhciogIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIGxpbWl0ICkKLSAgewotICAgIGludCAgICAgICAgICAgICAgICAgICBjID0gMDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgY291bnQsIG1pbiwgbWF4OwotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqICBwID0gZnRfYWRvYmVfZ2x5cGhfbGlzdDsKLQotCi0gICAgaWYgKCBuYW1lID09IDAgfHwgbmFtZSA+PSBsaW1pdCApCi0gICAgICBnb3RvIE5vdEZvdW5kOwotCi0gICAgYyAgICAgPSAqbmFtZSsrOwotICAgIGNvdW50ID0gcFsxXTsKLSAgICBwICAgICs9IDI7Ci0KLSAgICBtaW4gPSAwOwotICAgIG1heCA9IGNvdW50OwotCi0gICAgd2hpbGUgKCBtaW4gPCBtYXggKQotICAgIHsKLSAgICAgIGludCAgICAgICAgICAgICAgICAgICBtaWQgPSAoIG1pbiArIG1heCApID4+IDE7Ci0gICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiAgcSAgID0gcCArIG1pZCAqIDI7Ci0gICAgICBpbnQgICAgICAgICAgICAgICAgICAgYzI7Ci0KLQotICAgICAgcSA9IGZ0X2Fkb2JlX2dseXBoX2xpc3QgKyAoICggKGludClxWzBdIDw8IDggKSB8IHFbMV0gKTsKLQotICAgICAgYzIgPSBxWzBdICYgMTI3OwotICAgICAgaWYgKCBjMiA9PSBjICkKLSAgICAgIHsKLSAgICAgICAgcCA9IHE7Ci0gICAgICAgIGdvdG8gRm91bmQ7Ci0gICAgICB9Ci0gICAgICBpZiAoIGMyIDwgYyApCi0gICAgICAgIG1pbiA9IG1pZCArIDE7Ci0gICAgICBlbHNlCi0gICAgICAgIG1heCA9IG1pZDsKLSAgICB9Ci0gICAgZ290byBOb3RGb3VuZDsKLQotICBGb3VuZDoKLSAgICBmb3IgKDs7KQotICAgIHsKLSAgICAgIC8qIGFzc2VydCAoKnAgJiAxMjcpID09IGMgKi8KLQotICAgICAgaWYgKCBuYW1lID49IGxpbWl0ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCAocFswXSAmIDEyOCkgPT0gMCAmJgotICAgICAgICAgICAgIChwWzFdICYgMTI4KSAhPSAwICkKLSAgICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpKCAoIChpbnQpcFsyXSA8PCA4ICkgfCBwWzNdICk7Ci0KLSAgICAgICAgZ290byBOb3RGb3VuZDsKLSAgICAgIH0KLSAgICAgIGMgPSAqbmFtZSsrOwotICAgICAgaWYgKCBwWzBdICYgMTI4ICkKLSAgICAgIHsKLSAgICAgICAgcCsrOwotICAgICAgICBpZiAoIGMgIT0gKHBbMF0gJiAxMjcpICkKLSAgICAgICAgICBnb3RvIE5vdEZvdW5kOwotCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBwKys7Ci0gICAgICBjb3VudCA9IHBbMF0gJiAxMjc7Ci0gICAgICBpZiAoIHBbMF0gJiAxMjggKQotICAgICAgICBwICs9IDI7Ci0KLSAgICAgIHArKzsKLQotICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0sIHAgKz0gMiApCi0gICAgICB7Ci0gICAgICAgIGludCAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAoIChpbnQpcFswXSA8PCA4ICkgfCBwWzFdOwotICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiAgcSAgICAgID0gZnRfYWRvYmVfZ2x5cGhfbGlzdCArIG9mZnNldDsKLQotICAgICAgICBpZiAoIGMgPT0gKCBxWzBdICYgMTI3ICkgKQotICAgICAgICB7Ci0gICAgICAgICAgcCA9IHE7Ci0gICAgICAgICAgZ290byBOZXh0SXRlcjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZ290byBOb3RGb3VuZDsKLQotICAgIE5leHRJdGVyOgotICAgICAgOwotICAgIH0KLQotICBOb3RGb3VuZDoKLSAgICByZXR1cm4gMDsKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9BRE9CRV9HTFlQSF9MSVNUICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL0phbWZpbGUgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL0phbWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZGY1NjguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotIyBGcmVlVHlwZSAyIHNyYy9yYXN0ZXIgSmFtZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5Ci0jIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KLSMKLSMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCBtb2RpZmllZCwKLSMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAotIyBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgdGhpcyBmaWxlIHlvdQotIyBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdAotIyBmdWxseS4KLQotU3ViRGlyICBGVDJfVE9QICQoRlQyX1NSQ19ESVIpIHJhc3RlciA7Ci0KLXsKLSAgbG9jYWwgIF9zb3VyY2VzIDsKLQotICBpZiAkKEZUMl9NVUxUSSkKLSAgewotICAgIF9zb3VyY2VzID0gZnRyYXN0ZXIKLSAgICAgICAgICAgICAgIGZ0cmVuZDEKLSAgICAgICAgICAgICAgIHJhc3RwaWMKLSAgICAgICAgICAgICAgIDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBfc291cmNlcyA9IHJhc3RlciA7Ci0gIH0KLQotICBMaWJyYXJ5ICAkKEZUMl9MSUIpIDogJChfc291cmNlcykuYyA7Ci19Ci0KLSMgZW5kIG9mIHNyYy9yYXN0ZXIgSmFtZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9mdG1pc2MuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9yYXN0ZXIvZnRtaXNjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4N2UwYjYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9mdG1pc2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdG1pc2MuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgTWlzY2VsbGFuZW91cyBtYWNyb3MgZm9yIHN0YW5kLWFsb25lIHJhc3Rlcml6ZXIgKHNwZWNpZmljYXRpb24gICAgICAgKi8KLS8qICAgIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCAgICAgICAgKi8KLS8qICBtb2RpZmllZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyAqbm90KiBwb3J0YWJsZSEgIFlvdSBoYXZlIHRvIGFkYXB0ICovCi0gIC8qIGl0cyBkZWZpbml0aW9ucyB0byB5b3VyIHBsYXRmb3JtLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19GVE1JU0NfSF9fCi0jZGVmaW5lIF9fRlRNSVNDX0hfXwotCi0KLSAgLyogbWVtc2V0ICovCi0jaW5jbHVkZSBGVF9DT05GSUdfU1RBTkRBUkRfTElCUkFSWV9ICi0KLSNkZWZpbmUgRlRfQkVHSU5fSEVBREVSCi0jZGVmaW5lIEZUX0VORF9IRUFERVIKLQotI2RlZmluZSBGVF9MT0NBTF9ERUYoIHggKSAgIHN0YXRpYyB4Ci0KLQotICAvKiBmcm9tIGluY2x1ZGUvZnJlZXR5cGUvZnR0eXBlcy5oICovCi0KLSAgdHlwZWRlZiB1bnNpZ25lZCBjaGFyICBGVF9CeXRlOwotICB0eXBlZGVmIHNpZ25lZCBpbnQgICAgIEZUX0ludDsKLSAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICBGVF9VSW50OwotICB0eXBlZGVmIHNpZ25lZCBsb25nICAgIEZUX0xvbmc7Ci0gIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgRlRfVUxvbmc7Ci0gIHR5cGVkZWYgc2lnbmVkIGxvbmcgICAgRlRfRjI2RG90NjsKLSAgdHlwZWRlZiBpbnQgICAgICAgICAgICBGVF9FcnJvcjsKLQotI2RlZmluZSBGVF9NQUtFX1RBRyggX3gxLCBfeDIsIF94MywgX3g0ICkgXAotICAgICAgICAgICggKCAoRlRfVUxvbmcpX3gxIDw8IDI0ICkgfCAgICAgXAotICAgICAgICAgICAgKCAoRlRfVUxvbmcpX3gyIDw8IDE2ICkgfCAgICAgXAotICAgICAgICAgICAgKCAoRlRfVUxvbmcpX3gzIDw8ICA4ICkgfCAgICAgXAotICAgICAgICAgICAgICAoRlRfVUxvbmcpX3g0ICAgICAgICAgKQotCi0KLSAgLyogZnJvbSBpbmNsdWRlL2ZyZWV0eXBlL2Z0c3lzdGVtLmggKi8KLQotICB0eXBlZGVmIHN0cnVjdCBGVF9NZW1vcnlSZWNfKiAgRlRfTWVtb3J5OwotCi0gIHR5cGVkZWYgdm9pZCogKCpGVF9BbGxvY19GdW5jKSggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICBzaXplICk7Ci0KLSAgdHlwZWRlZiB2b2lkICgqRlRfRnJlZV9GdW5jKSggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgYmxvY2sgKTsKLQotICB0eXBlZGVmIHZvaWQqICgqRlRfUmVhbGxvY19GdW5jKSggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgIGN1cl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyAgICAgICBuZXdfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgYmxvY2sgKTsKLQotICB0eXBlZGVmIHN0cnVjdCBGVF9NZW1vcnlSZWNfCi0gIHsKLSAgICB2b2lkKiAgICAgICAgICAgIHVzZXI7Ci0KLSAgICBGVF9BbGxvY19GdW5jICAgIGFsbG9jOwotICAgIEZUX0ZyZWVfRnVuYyAgICAgZnJlZTsKLSAgICBGVF9SZWFsbG9jX0Z1bmMgIHJlYWxsb2M7Ci0KLSAgfSBGVF9NZW1vcnlSZWM7Ci0KLQotICAvKiBmcm9tIHNyYy9mdGNhbGMuYyAqLwotCi0jaWYgKCBkZWZpbmVkIF9XSU4zMiB8fCBkZWZpbmVkIF9XSU42NCApCi0KLSAgdHlwZWRlZiBfX2ludDY0ICBGVF9JbnQ2NDsKLQotI2Vsc2UKLQotI2luY2x1ZGUgImludHR5cGVzLmgiCi0KLSAgdHlwZWRlZiBpbnQ2NF90ICBGVF9JbnQ2NDsKLQotI2VuZGlmCi0KLQotICBzdGF0aWMgRlRfTG9uZwotICBGVF9NdWxEaXYoIEZUX0xvbmcgIGEsCi0gICAgICAgICAgICAgRlRfTG9uZyAgYiwKLSAgICAgICAgICAgICBGVF9Mb25nICBjICkKLSAgewotICAgIEZUX0ludCAgIHM7Ci0gICAgRlRfTG9uZyAgZDsKLQotCi0gICAgcyA9IDE7Ci0gICAgaWYgKCBhIDwgMCApIHsgYSA9IC1hOyBzID0gLTE7IH0KLSAgICBpZiAoIGIgPCAwICkgeyBiID0gLWI7IHMgPSAtczsgfQotICAgIGlmICggYyA8IDAgKSB7IGMgPSAtYzsgcyA9IC1zOyB9Ci0KLSAgICBkID0gKEZUX0xvbmcpKCBjID4gMCA/ICggKEZUX0ludDY0KWEgKiBiICsgKCBjID4+IDEgKSApIC8gYwotICAgICAgICAgICAgICAgICAgICAgICAgIDogMHg3RkZGRkZGRkwgKTsKLQotICAgIHJldHVybiAoIHMgPiAwICkgPyBkIDogLWQ7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9Mb25nCi0gIEZUX011bERpdl9Ob19Sb3VuZCggRlRfTG9uZyAgYSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICBiLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgIGMgKQotICB7Ci0gICAgRlRfSW50ICAgczsKLSAgICBGVF9Mb25nICBkOwotCi0KLSAgICBzID0gMTsKLSAgICBpZiAoIGEgPCAwICkgeyBhID0gLWE7IHMgPSAtMTsgfQotICAgIGlmICggYiA8IDAgKSB7IGIgPSAtYjsgcyA9IC1zOyB9Ci0gICAgaWYgKCBjIDwgMCApIHsgYyA9IC1jOyBzID0gLXM7IH0KLQotICAgIGQgPSAoRlRfTG9uZykoIGMgPiAwID8gKEZUX0ludDY0KWEgKiBiIC8gYwotICAgICAgICAgICAgICAgICAgICAgICAgIDogMHg3RkZGRkZGRkwgKTsKLQotICAgIHJldHVybiAoIHMgPiAwICkgPyBkIDogLWQ7Ci0gIH0KLQotI2VuZGlmIC8qIF9fRlRNSVNDX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9mdHJhc3Rlci5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9mdHJhc3Rlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGJhYjk4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9yYXN0ZXIvZnRyYXN0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDMyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRyYXN0ZXIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBnbHlwaCByYXN0ZXJpemVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBjYW4gYmUgY29tcGlsZWQgd2l0aG91dCB0aGUgcmVzdCBvZiB0aGUgRnJlZVR5cGUgZW5naW5lLCBieSAqLwotICAvKiBkZWZpbmluZyB0aGUgX1NUQU5EQUxPTkVfIG1hY3JvIHdoZW4gY29tcGlsaW5nIGl0LiAgWW91IGFsc28gbmVlZCB0byAgKi8KLSAgLyogcHV0IHRoZSBmaWxlcyBgZnRpbWFnZS5oJyBhbmQgYGZ0bWlzYy5oJyBpbnRvIHRoZSAkKGluY2RpcikgICAgICAgICAgICovCi0gIC8qIGRpcmVjdG9yeS4gIFR5cGljYWxseSwgeW91IHNob3VsZCBkbyBzb21ldGhpbmcgbGlrZSAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBjb3B5IGBzcmMvcmFzdGVyL2Z0cmFzdGVyLmMnICh0aGlzIGZpbGUpIHRvIHlvdXIgY3VycmVudCBkaXJlY3RvcnkgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIGNvcHkgYGluY2x1ZGUvZnJlZXR5cGUvZnRpbWFnZS5oJyBhbmQgYHNyYy9yYXN0ZXIvZnRtaXNjLmgnIHRvIHlvdXIgKi8KLSAgLyogICBjdXJyZW50IGRpcmVjdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtIGNvbXBpbGUgYGZ0cmFzdGVyJyB3aXRoIHRoZSBfU1RBTkRBTE9ORV8gbWFjcm8gZGVmaW5lZCwgYXMgaW4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBjYyAtYyAtRF9TVEFOREFMT05FXyBmdHJhc3Rlci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIHJlbmRlcmVyIGNhbiBiZSBpbml0aWFsaXplZCB3aXRoIGEgY2FsbCB0byAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIGBmdF9zdGFuZGFyZF9yYXN0ZXIucmFzdGVyX25ldyc7IGEgYml0bWFwIGNhbiBiZSBnZW5lcmF0ZWQgICAgICAgICAgICAqLwotICAvKiB3aXRoIGEgY2FsbCB0byBgZnRfc3RhbmRhcmRfcmFzdGVyLnJhc3Rlcl9yZW5kZXInLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNlZSB0aGUgY29tbWVudHMgYW5kIGRvY3VtZW50YXRpb24gaW4gdGhlIGZpbGUgYGZ0aW1hZ2UuaCcgZm9yIG1vcmUgICAqLwotICAvKiBkZXRhaWxzIG9uIGhvdyB0aGUgcmFzdGVyIHdvcmtzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGlzIGEgcmV3cml0ZSBvZiB0aGUgRnJlZVR5cGUgMS54IHNjYW4tbGluZSBjb252ZXJ0ZXIgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgX1NUQU5EQUxPTkVfCi0KLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlbmRlciBwb29sIHVzZWQgYnkgdGhlIHNjYW4tbGluZSBjb252ZXJ0ZXIgICovCi0gIC8qIHRvIGRvIGFsbCBvZiBpdHMgd29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9SRU5ERVJfUE9PTF9TSVpFICAxNjM4NEwKLQotI2RlZmluZSBGVF9DT05GSUdfU1RBTkRBUkRfTElCUkFSWV9IICA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4gICAgICAgICAgIC8qIGZvciBtZW1zZXQgKi8KLQotI2luY2x1ZGUgImZ0bWlzYy5oIgotI2luY2x1ZGUgImZ0aW1hZ2UuaCIKLQotI2Vsc2UgLyogIV9TVEFOREFMT05FXyAqLwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlICJmdHJhc3Rlci5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19IICAgLyogZm9yIEZUX011bERpdiBhbmQgRlRfTXVsRGl2X05vX1JvdW5kICovCi0KLSNpbmNsdWRlICJyYXN0cGljLmgiCi0KLSNlbmRpZiAvKiAhX1NUQU5EQUxPTkVfICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEEgc2ltcGxlIHRlY2huaWNhbCBub3RlIG9uIGhvdyB0aGUgcmFzdGVyIHdvcmtzICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQ29udmVydGluZyBhbiBvdXRsaW5lIGludG8gYSBiaXRtYXAgaXMgYWNoaWV2ZWQgaW4gc2V2ZXJhbCBzdGVwczogICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAxIC0gRGVjb21wb3NpbmcgdGhlIG91dGxpbmUgaW50byBzdWNjZXNzaXZlIGBwcm9maWxlcycuICBFYWNoICAgICAgICovCi0gIC8qICAgICAgIHByb2ZpbGUgaXMgc2ltcGx5IGFuIGFycmF5IG9mIHNjYW5saW5lIGludGVyc2VjdGlvbnMgb24gYSBnaXZlbiAqLwotICAvKiAgICAgICBkaW1lbnNpb24uICBBIHByb2ZpbGUncyBtYWluIGF0dHJpYnV0ZXMgYXJlICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgIG8gaXRzIHNjYW5saW5lIHBvc2l0aW9uIGJvdW5kYXJpZXMsIGkuZS4gYFltaW4nIGFuZCBgWW1heCcgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgbyBhbiBhcnJheSBvZiBpbnRlcnNlY3Rpb24gY29vcmRpbmF0ZXMgZm9yIGVhY2ggc2NhbmxpbmUgICAgICAgICovCi0gIC8qICAgICAgICAgYmV0d2VlbiBgWW1pbicgYW5kIGBZbWF4JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgbyBhIGRpcmVjdGlvbiwgaW5kaWNhdGluZyB3aGV0aGVyIGl0IHdhcyBidWlsdCBnb2luZyBgdXAnIG9yICAgICovCi0gIC8qICAgICAgICAgYGRvd24nLCBhcyB0aGlzIGlzIHZlcnkgaW1wb3J0YW50IGZvciBmaWxsaW5nIHJ1bGVzICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgbyBpdHMgZHJvcC1vdXQgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIDIgLSBTd2VlcGluZyB0aGUgdGFyZ2V0IG1hcCdzIHNjYW5saW5lcyBpbiBvcmRlciB0byBjb21wdXRlIHNlZ21lbnQgKi8KLSAgLyogICAgICAgYHNwYW5zJyB3aGljaCBhcmUgdGhlbiBmaWxsZWQuICBBZGRpdGlvbmFsbHksIHRoaXMgcGFzcyAgICAgICAgICovCi0gIC8qICAgICAgIHBlcmZvcm1zIGRyb3Atb3V0IGNvbnRyb2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGUgb3V0bGluZSBkYXRhIGlzIHBhcnNlZCBkdXJpbmcgc3RlcCAxIG9ubHkuICBUaGUgcHJvZmlsZXMgYXJlICAgICovCi0gIC8qICAgYnVpbHQgZnJvbSB0aGUgYm90dG9tIG9mIHRoZSByZW5kZXIgcG9vbCwgdXNlZCBhcyBhIHN0YWNrLiAgVGhlICAgICAqLwotICAvKiAgIGZvbGxvd2luZyBncmFwaGljcyBzaG93cyB0aGUgcHJvZmlsZSBsaXN0IHVuZGVyIGNvbnN0cnVjdGlvbjogICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIF8gXyAgICAqLwotICAvKiAgICB8ICAgICAgICAgfCAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAgICAgKi8KLSAgLyogICAgfCBwcm9maWxlIHwgY29vcmRpbmF0ZXMgZm9yIHwgcHJvZmlsZSB8IGNvb3JkaW5hdGVzIGZvciB8LS0+ICAgICAgICovCi0gIC8qICAgIHwgICAgMSAgICB8ICBwcm9maWxlIDEgICAgICB8ICAgIDIgICAgfCAgcHJvZmlsZSAyICAgICAgfC0tPiAgICAgICAqLwotICAvKiAgICB8X19fX19fX19ffF9fX19fX19fX19fX19fX19ffF9fX19fX19fX3xfX19fX19fX19fX19fX19fX3xfXyBfIF8gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIF4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAqLwotICAvKiAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgKi8KLSAgLyogc3RhcnQgb2YgcmVuZGVyIHBvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcCAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoZSB0b3Agb2YgdGhlIHByb2ZpbGUgc3RhY2sgaXMga2VwdCBpbiB0aGUgYHRvcCcgdmFyaWFibGUuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgQXMgeW91IGNhbiBzZWUsIGEgcHJvZmlsZSByZWNvcmQgaXMgcHVzaGVkIG9uIHRvcCBvZiB0aGUgcmVuZGVyICAgICAqLwotICAvKiAgIHBvb2wsIHdoaWNoIGlzIHRoZW4gZm9sbG93ZWQgYnkgaXRzIGNvb3JkaW5hdGVzL2ludGVyc2VjdGlvbnMuICBJZiAgKi8KLSAgLyogICBhIGNoYW5nZSBvZiBkaXJlY3Rpb24gaXMgZGV0ZWN0ZWQgaW4gdGhlIG91dGxpbmUsIGEgbmV3IHByb2ZpbGUgaXMgICovCi0gIC8qICAgZ2VuZXJhdGVkIHVudGlsIHRoZSBlbmQgb2YgdGhlIG91dGxpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOb3RlIHRoYXQgd2hlbiBhbGwgcHJvZmlsZXMgaGF2ZSBiZWVuIGdlbmVyYXRlZCwgdGhlIGZ1bmN0aW9uICAgICAgICovCi0gIC8qICAgRmluYWxpemVfUHJvZmlsZV9UYWJsZSgpIGlzIHVzZWQgdG8gcmVjb3JkLCBmb3IgZWFjaCBwcm9maWxlLCBpdHMgICAqLwotICAvKiAgIGJvdHRvbS1tb3N0IHNjYW5saW5lIGFzIHdlbGwgYXMgdGhlIHNjYW5saW5lIGFib3ZlIGl0cyB1cG1vc3QgICAgICAgKi8KLSAgLyogICBib3VuZGFyeS4gIFRoZXNlIHBvc2l0aW9ucyBhcmUgY2FsbGVkIGB5LXR1cm5zJyBiZWNhdXNlIHRoZXkgKHNvcnQgICovCi0gIC8qICAgb2YpIGNvcnJlc3BvbmQgdG8gbG9jYWwgZXh0cmVtYS4gIFRoZXkgYXJlIHN0b3JlZCBpbiBhIHNvcnRlZCBsaXN0ICAqLwotICAvKiAgIGJ1aWx0IGZyb20gdGhlIHRvcCBvZiB0aGUgcmVuZGVyIHBvb2wgYXMgYSBkb3dud2FyZHMgc3RhY2s6ICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgXyBfIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgPC0tfCBzb3J0ZWQgbGlzdCBvZiAgICAgfCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgIDwtLXwgIGV4dHJlbWEgc2NhbmxpbmVzIHwgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgIF8gXyBfX19fX19fX19fX19fX19fX198X19fX19fX19fX19fX19fX19fX198ICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgbWF4QnVmZiAgICAgICAgICAgc2l6ZUJ1ZmYgPSBlbmQgb2YgcG9vbCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoaXMgbGlzdCBpcyBsYXRlciB1c2VkIGR1cmluZyB0aGUgc3dlZXAgcGhhc2UgaW4gb3JkZXIgdG8gICAgICAgICAgKi8KLSAgLyogICBvcHRpbWl6ZSBwZXJmb3JtYW5jZSAoc2VlIHRlY2huaWNhbCBub3RlIG9uIHRoZSBzd2VlcCBiZWxvdykuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE9mIGNvdXJzZSwgdGhlIHJhc3RlciBkZXRlY3RzIHdoZXRoZXIgdGhlIHR3byBzdGFja3MgY29sbGlkZSBhbmQgICAgKi8KLSAgLyogICBoYW5kbGVzIHRoZSBzaXR1YXRpb24gcHJvcGVybHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi0gIC8qKiAgQ09ORklHVVJBVElPTiBNQUNST1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwotICAvKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qIGRlZmluZSBERUJVR19SQVNURVIgaWYgeW91IHdhbnQgdG8gY29tcGlsZSBhIGRlYnVnZ2luZyB2ZXJzaW9uICovCi0vKiAjZGVmaW5lIERFQlVHX1JBU1RFUiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLSAgLyoqICBPVEhFUiBNQUNST1MgKGRvIG5vdCBjaGFuZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi0gIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfcmFzdGVyCi0KLQotI2lmZGVmIF9TVEFOREFMT05FXwotCi0gIC8qIEF1eGlsaWFyeSBtYWNyb3MgZm9yIHRva2VuIGNvbmNhdGVuYXRpb24uICovCi0jZGVmaW5lIEZUX0VSUl9YQ0FUKCB4LCB5ICkgIHggIyMgeQotI2RlZmluZSBGVF9FUlJfQ0FUKCB4LCB5ICkgICBGVF9FUlJfWENBVCggeCwgeSApCi0KLSNkZWZpbmUgRlRfTUFYKCBhLCBiICkgICggKGEpID4gKGIpID8gKGEpIDogKGIpICkKLQotICAvKiBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyB1bnVzZWQuICovCi0gIC8qIEl0cyBwdXJwb3NlIGlzIHNpbXBseSB0byByZWR1Y2UgY29tcGlsZXIgd2FybmluZ3MuICBOb3RlIGFsc28gdGhhdCAgKi8KLSAgLyogc2ltcGx5IGRlZmluaW5nIGl0IGFzIGAodm9pZCl4JyBkb2Vzbid0IGF2b2lkIHdhcm5pbmdzIHdpdGggY2VydGFpbiAqLwotICAvKiBBTlNJIGNvbXBpbGVycyAoZS5nLiBMQ0MpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX1VOVVNFRCggeCApICAoeCkgPSAoeCkKLQotICAvKiBEaXNhYmxlIHRoZSB0cmFjaW5nIG1lY2hhbmlzbSBmb3Igc2ltcGxpY2l0eSAtLSBkZXZlbG9wZXJzIGNhbiAgICAgICovCi0gIC8qIGFjdGl2YXRlIGl0IGVhc2lseSBieSByZWRlZmluaW5nIHRoZXNlIG1hY3Jvcy4gICAgICAgICAgICAgICAgICAgICAgKi8KLSNpZm5kZWYgRlRfRVJST1IKLSNkZWZpbmUgRlRfRVJST1IoIHggKSAgZG8geyB9IHdoaWxlICggMCApICAgICAvKiBub3RoaW5nICovCi0jZW5kaWYKLQotI2lmbmRlZiBGVF9UUkFDRQotI2RlZmluZSBGVF9UUkFDRSggeCApICAgZG8geyB9IHdoaWxlICggMCApICAgIC8qIG5vdGhpbmcgKi8KLSNkZWZpbmUgRlRfVFJBQ0UxKCB4ICkgIGRvIHsgfSB3aGlsZSAoIDAgKSAgICAvKiBub3RoaW5nICovCi0jZGVmaW5lIEZUX1RSQUNFNiggeCApICBkbyB7IH0gd2hpbGUgKCAwICkgICAgLyogbm90aGluZyAqLwotI2RlZmluZSBGVF9UUkFDRTcoIHggKSAgZG8geyB9IHdoaWxlICggMCApICAgIC8qIG5vdGhpbmcgKi8KLSNlbmRpZgotCi0jaWZuZGVmIEZUX1RIUk9XCi0jZGVmaW5lIEZUX1RIUk9XKCBlICkgIEZUX0VSUl9DQVQoIFJhc3Rlcl9FcnJfLCBlICkKLSNlbmRpZgotCi0jZGVmaW5lIFJhc3Rlcl9FcnJfTm9uZSAgICAgICAgICAwCi0jZGVmaW5lIFJhc3Rlcl9FcnJfTm90X0luaSAgICAgIC0xCi0jZGVmaW5lIFJhc3Rlcl9FcnJfT3ZlcmZsb3cgICAgIC0yCi0jZGVmaW5lIFJhc3Rlcl9FcnJfTmVnX0hlaWdodCAgIC0zCi0jZGVmaW5lIFJhc3Rlcl9FcnJfSW52YWxpZCAgICAgIC00Ci0jZGVmaW5lIFJhc3Rlcl9FcnJfVW5zdXBwb3J0ZWQgIC01Ci0KLSNkZWZpbmUgZnRfbWVtc2V0ICBtZW1zZXQKLQotI2RlZmluZSBGVF9ERUZJTkVfUkFTVEVSX0ZVTkNTKCBjbGFzc18sIGdseXBoX2Zvcm1hdF8sIHJhc3Rlcl9uZXdfLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhc3Rlcl9yZXNldF8sIHJhc3Rlcl9zZXRfbW9kZV8sICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFzdGVyX3JlbmRlcl8sIHJhc3Rlcl9kb25lXyApICAgICAgXAotICAgICAgICAgIGNvbnN0IEZUX1Jhc3Rlcl9GdW5jcyBjbGFzc18gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGdseXBoX2Zvcm1hdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcmFzdGVyX25ld18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICByYXN0ZXJfcmVzZXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHJhc3Rlcl9zZXRfbW9kZV8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcmFzdGVyX3JlbmRlcl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICByYXN0ZXJfZG9uZV8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIH07Ci0KLSNlbHNlIC8qICFfU1RBTkRBTE9ORV8gKi8KLQotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0ggICAgICAgLyogZm9yIEZUX1RSQUNFLCBGVF9FUlJPUiwgYW5kIEZUX1RIUk9XICovCi0KLSNpbmNsdWRlICJyYXN0ZXJycy5oIgotCi0jZGVmaW5lIFJhc3Rlcl9FcnJfTm9uZSAgICAgICAgIEZUX0Vycl9PawotI2RlZmluZSBSYXN0ZXJfRXJyX05vdF9JbmkgICAgICBSYXN0ZXJfRXJyX1Jhc3Rlcl9VbmluaXRpYWxpemVkCi0jZGVmaW5lIFJhc3Rlcl9FcnJfT3ZlcmZsb3cgICAgIFJhc3Rlcl9FcnJfUmFzdGVyX092ZXJmbG93Ci0jZGVmaW5lIFJhc3Rlcl9FcnJfTmVnX0hlaWdodCAgIFJhc3Rlcl9FcnJfUmFzdGVyX05lZ2F0aXZlX0hlaWdodAotI2RlZmluZSBSYXN0ZXJfRXJyX0ludmFsaWQgICAgICBSYXN0ZXJfRXJyX0ludmFsaWRfT3V0bGluZQotI2RlZmluZSBSYXN0ZXJfRXJyX1Vuc3VwcG9ydGVkICBSYXN0ZXJfRXJyX0Nhbm5vdF9SZW5kZXJfR2x5cGgKLQotCi0jZW5kaWYgLyogIV9TVEFOREFMT05FXyAqLwotCi0KLSNpZm5kZWYgRlRfTUVNX1NFVAotI2RlZmluZSBGVF9NRU1fU0VUKCBkLCBzLCBjICkgIGZ0X21lbXNldCggZCwgcywgYyApCi0jZW5kaWYKLQotI2lmbmRlZiBGVF9NRU1fWkVSTwotI2RlZmluZSBGVF9NRU1fWkVSTyggZGVzdCwgY291bnQgKSAgRlRfTUVNX1NFVCggZGVzdCwgMCwgY291bnQgKQotI2VuZGlmCi0KLSAgLyogRk11bERpdiBtZWFucyBgRmFzdCBNdWxEaXYnOyBpdCBpcyB1c2VkIGluIGNhc2Ugd2hlcmUgYGInIGlzICAgICAgICovCi0gIC8qIHR5cGljYWxseSBhIHNtYWxsIHZhbHVlIGFuZCB0aGUgcmVzdWx0IG9mIGEqYiBpcyBrbm93biB0byBmaXQgaW50byAqLwotICAvKiAzMiBiaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgRk11bERpdiggYSwgYiwgYyApICAoIChhKSAqIChiKSAvIChjKSApCi0KLSAgLyogT24gdGhlIG90aGVyIGhhbmQsIFNNdWxEaXYgbWVhbnMgYFNsb3cgTXVsRGl2JywgYW5kIGlzIHVzZWQgdHlwaWNhbGx5ICovCi0gIC8qIGZvciBjbGlwcGluZyBjb21wdXRhdGlvbnMuICBJdCBzaW1wbHkgdXNlcyB0aGUgRlRfTXVsRGl2KCkgZnVuY3Rpb24gICAqLwotICAvKiBkZWZpbmVkIGluIGBmdGNhbGMuaCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU011bERpdiAgICAgICAgICAgRlRfTXVsRGl2Ci0jZGVmaW5lIFNNdWxEaXZfTm9fUm91bmQgIEZUX011bERpdl9Ob19Sb3VuZAotCi0gIC8qIFRoZSByYXN0ZXJpemVyIGlzIGEgdmVyeSBnZW5lcmFsIHB1cnBvc2UgY29tcG9uZW50OyBwbGVhc2UgbGVhdmUgKi8KLSAgLyogdGhlIGZvbGxvd2luZyByZWRlZmluaXRpb25zIHRoZXJlICh5b3UgbmV2ZXIga25vdyB5b3VyIHRhcmdldCAgICAqLwotICAvKiBlbnZpcm9ubWVudCkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZm5kZWYgVFJVRQotI2RlZmluZSBUUlVFICAgMQotI2VuZGlmCi0KLSNpZm5kZWYgRkFMU0UKLSNkZWZpbmUgRkFMU0UgIDAKLSNlbmRpZgotCi0jaWZuZGVmIE5VTEwKLSNkZWZpbmUgTlVMTCAgKHZvaWQqKTAKLSNlbmRpZgotCi0jaWZuZGVmIFNVQ0NFU1MKLSNkZWZpbmUgU1VDQ0VTUyAgMAotI2VuZGlmCi0KLSNpZm5kZWYgRkFJTFVSRQotI2RlZmluZSBGQUlMVVJFICAxCi0jZW5kaWYKLQotCi0jZGVmaW5lIE1heEJlemllciAgMzIgICAvKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RhY2tlZCBCZXppZXIgY3VydmVzLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0dGluZyB0aGlzIGNvbnN0YW50IHRvIG1vcmUgdGhhbiAzMiBpcyBhICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHB1cmUgd2FzdGUgb2Ygc3BhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNkZWZpbmUgUGl4ZWxfQml0cyAgNiAgIC8qIGZyYWN0aW9uYWwgYml0cyBvZiAqaW5wdXQqIGNvb3JkaW5hdGVzICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwotICAvKiogIFNJTVBMRSBUWVBFIERFQ0xBUkFUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLSAgLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICB0eXBlZGVmIGludCAgICAgICAgICAgICBJbnQ7Ci0gIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgIFVJbnQ7Ci0gIHR5cGVkZWYgc2hvcnQgICAgICAgICAgIFNob3J0OwotICB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICBVU2hvcnQsICpQVVNob3J0OwotICB0eXBlZGVmIGxvbmcgICAgICAgICAgICBMb25nLCAqUExvbmc7Ci0gIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIFVMb25nOwotCi0gIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgIEJ5dGUsICpQQnl0ZTsKLSAgdHlwZWRlZiBjaGFyICAgICAgICAgICAgQm9vbDsKLQotCi0gIHR5cGVkZWYgdW5pb24gIEFsaWdubWVudF8KLSAgewotICAgIExvbmcgICAgbDsKLSAgICB2b2lkKiAgIHA7Ci0gICAgdm9pZCAgKCpmKSh2b2lkKTsKLQotICB9IEFsaWdubWVudCwgKlBBbGlnbm1lbnQ7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgVFBvaW50XwotICB7Ci0gICAgTG9uZyAgeDsKLSAgICBMb25nICB5OwotCi0gIH0gVFBvaW50OwotCi0KLSAgLyogdmFsdWVzIGZvciB0aGUgYGZsYWdzJyBiaXQgZmllbGQgKi8KLSNkZWZpbmUgRmxvd19VcCAgICAgICAgICAgMHgwOFUKLSNkZWZpbmUgT3ZlcnNob290X1RvcCAgICAgMHgxMFUKLSNkZWZpbmUgT3ZlcnNob290X0JvdHRvbSAgMHgyMFUKLQotCi0gIC8qIFN0YXRlcyBvZiBlYWNoIGxpbmUsIGFyYywgYW5kIHByb2ZpbGUgKi8KLSAgdHlwZWRlZiBlbnVtICBUU3RhdGVzXwotICB7Ci0gICAgVW5rbm93bl9TdGF0ZSwKLSAgICBBc2NlbmRpbmdfU3RhdGUsCi0gICAgRGVzY2VuZGluZ19TdGF0ZSwKLSAgICBGbGF0X1N0YXRlCi0KLSAgfSBUU3RhdGVzOwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgVFByb2ZpbGVfICBUUHJvZmlsZTsKLSAgdHlwZWRlZiBUUHJvZmlsZSogICAgICAgICBQUHJvZmlsZTsKLQotICBzdHJ1Y3QgIFRQcm9maWxlXwotICB7Ci0gICAgRlRfRjI2RG90NiAgWDsgICAgICAgICAgIC8qIGN1cnJlbnQgY29vcmRpbmF0ZSBkdXJpbmcgc3dlZXAgICAgICAgICAgKi8KLSAgICBQUHJvZmlsZSAgICBsaW5rOyAgICAgICAgLyogbGluayB0byBuZXh0IHByb2ZpbGUgKHZhcmlvdXMgcHVycG9zZXMpICAqLwotICAgIFBMb25nICAgICAgIG9mZnNldDsgICAgICAvKiBzdGFydCBvZiBwcm9maWxlJ3MgZGF0YSBpbiByZW5kZXIgcG9vbCAgICovCi0gICAgVVNob3J0ICAgICAgZmxhZ3M7ICAgICAgIC8qIEJpdCAwLTI6IGRyb3Atb3V0IG1vZGUgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQml0IDM6IHByb2ZpbGUgb3JpZW50YXRpb24gKHVwL2Rvd24pICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCaXQgNDogaXMgdG9wIHByb2ZpbGU/ICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJpdCA1OiBpcyBib3R0b20gcHJvZmlsZT8gICAgICAgICAgICAgICAgKi8KLSAgICBMb25nICAgICAgICBoZWlnaHQ7ICAgICAgLyogcHJvZmlsZSdzIGhlaWdodCBpbiBzY2FubGluZXMgICAgICAgICAgICAqLwotICAgIExvbmcgICAgICAgIHN0YXJ0OyAgICAgICAvKiBwcm9maWxlJ3Mgc3RhcnRpbmcgc2NhbmxpbmUgICAgICAgICAgICAgICovCi0KLSAgICBJbnQgICAgICAgICBjb3VudEw7ICAgICAgLyogbnVtYmVyIG9mIGxpbmVzIHRvIHN0ZXAgYmVmb3JlIHRoaXMgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcm9maWxlIGJlY29tZXMgZHJhd2FibGUgICAgICAgICAgICAgICAgICovCi0KLSAgICBQUHJvZmlsZSAgICBuZXh0OyAgICAgICAgLyogbmV4dCBwcm9maWxlIGluIHNhbWUgY29udG91ciwgdXNlZCAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkdXJpbmcgZHJvcC1vdXQgY29udHJvbCAgICAgICAgICAgICAgICAgICovCi0gIH07Ci0KLSAgdHlwZWRlZiBQUHJvZmlsZSAgIFRQcm9maWxlTGlzdDsKLSAgdHlwZWRlZiBQUHJvZmlsZSogIFBQcm9maWxlTGlzdDsKLQotCi0gIC8qIFNpbXBsZSByZWNvcmQgdXNlZCB0byBpbXBsZW1lbnQgYSBzdGFjayBvZiBiYW5kcywgcmVxdWlyZWQgKi8KLSAgLyogYnkgdGhlIHN1Yi1iYW5kaW5nIG1lY2hhbmlzbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgYmxhY2tfVEJhbmRfCi0gIHsKLSAgICBTaG9ydCAgeV9taW47ICAgLyogYmFuZCdzIG1pbmltdW0gKi8KLSAgICBTaG9ydCAgeV9tYXg7ICAgLyogYmFuZCdzIG1heGltdW0gKi8KLQotICB9IGJsYWNrX1RCYW5kOwotCi0KLSNkZWZpbmUgQWxpZ25Qcm9maWxlU2l6ZSBcCi0gICggKCBzaXplb2YgKCBUUHJvZmlsZSApICsgc2l6ZW9mICggQWxpZ25tZW50ICkgLSAxICkgLyBzaXplb2YgKCBMb25nICkgKQotCi0KLSN1bmRlZiBSQVNfQVJHCi0jdW5kZWYgUkFTX0FSR1MKLSN1bmRlZiBSQVNfVkFSCi0jdW5kZWYgUkFTX1ZBUlMKLQotI2lmZGVmIEZUX1NUQVRJQ19SQVNURVIKLQotCi0jZGVmaW5lIFJBU19BUkdTICAgICAgIC8qIHZvaWQgKi8KLSNkZWZpbmUgUkFTX0FSRyAgICAgICAgLyogdm9pZCAqLwotCi0jZGVmaW5lIFJBU19WQVJTICAgICAgIC8qIHZvaWQgKi8KLSNkZWZpbmUgUkFTX1ZBUiAgICAgICAgLyogdm9pZCAqLwotCi0jZGVmaW5lIEZUX1VOVVNFRF9SQVNURVIgIGRvIHsgfSB3aGlsZSAoIDAgKQotCi0KLSNlbHNlIC8qICFGVF9TVEFUSUNfUkFTVEVSICovCi0KLQotI2RlZmluZSBSQVNfQVJHUyAgICAgICBibGFja19QV29ya2VyICB3b3JrZXIsCi0jZGVmaW5lIFJBU19BUkcgICAgICAgIGJsYWNrX1BXb3JrZXIgIHdvcmtlcgotCi0jZGVmaW5lIFJBU19WQVJTICAgICAgIHdvcmtlciwKLSNkZWZpbmUgUkFTX1ZBUiAgICAgICAgd29ya2VyCi0KLSNkZWZpbmUgRlRfVU5VU0VEX1JBU1RFUiAgRlRfVU5VU0VEKCB3b3JrZXIgKQotCi0KLSNlbmRpZiAvKiAhRlRfU1RBVElDX1JBU1RFUiAqLwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgYmxhY2tfVFdvcmtlcl8gIGJsYWNrX1RXb3JrZXIsICpibGFja19QV29ya2VyOwotCi0KLSAgLyogcHJvdG90eXBlcyB1c2VkIGZvciBzd2VlcCBmdW5jdGlvbiBkaXNwYXRjaCAqLwotICB0eXBlZGVmIHZvaWQKLSAgRnVuY3Rpb25fU3dlZXBfSW5pdCggUkFTX0FSR1MgU2hvcnQqICBtaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3J0KiAgbWF4ICk7Ci0KLSAgdHlwZWRlZiB2b2lkCi0gIEZ1bmN0aW9uX1N3ZWVwX1NwYW4oIFJBU19BUkdTIFNob3J0ICAgICAgIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICB4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFByb2ZpbGUgICAgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFByb2ZpbGUgICAgcmlnaHQgKTsKLQotICB0eXBlZGVmIHZvaWQKLSAgRnVuY3Rpb25fU3dlZXBfU3RlcCggUkFTX0FSRyApOwotCi0KLSAgLyogTk9URTogVGhlc2Ugb3BlcmF0aW9ucyBhcmUgb25seSB2YWxpZCBvbiAyJ3MgY29tcGxlbWVudCBwcm9jZXNzb3JzICovCi0jdW5kZWYgRkxPT1IKLSN1bmRlZiBDRUlMSU5HCi0jdW5kZWYgVFJVTkMKLSN1bmRlZiBTQ0FMRUQKLQotI2RlZmluZSBGTE9PUiggeCApICAgICggKHgpICYgLXJhcy5wcmVjaXNpb24gKQotI2RlZmluZSBDRUlMSU5HKCB4ICkgICggKCAoeCkgKyByYXMucHJlY2lzaW9uIC0gMSApICYgLXJhcy5wcmVjaXNpb24gKQotI2RlZmluZSBUUlVOQyggeCApICAgICggKExvbmcpKHgpID4+IHJhcy5wcmVjaXNpb25fYml0cyApCi0jZGVmaW5lIEZSQUMoIHggKSAgICAgKCAoeCkgJiAoIHJhcy5wcmVjaXNpb24gLSAxICkgKQotI2RlZmluZSBTQ0FMRUQoIHggKSAgICggKCAoeCkgPCAwID8gLSggLSh4KSA8PCByYXMuc2NhbGVfc2hpZnQgKSAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAoICAoeCkgPDwgcmFzLnNjYWxlX3NoaWZ0ICkgKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAtIHJhcy5wcmVjaXNpb25faGFsZiApCi0KLSNkZWZpbmUgSVNfQk9UVE9NX09WRVJTSE9PVCggeCApIFwKLSAgICAgICAgICAoQm9vbCkoIENFSUxJTkcoIHggKSAtIHggPj0gcmFzLnByZWNpc2lvbl9oYWxmICkKLSNkZWZpbmUgSVNfVE9QX09WRVJTSE9PVCggeCApICAgIFwKLSAgICAgICAgICAoQm9vbCkoIHggLSBGTE9PUiggeCApID49IHJhcy5wcmVjaXNpb25faGFsZiApCi0KLSAgLyogVGhlIG1vc3QgdXNlZCB2YXJpYWJsZXMgYXJlIHBvc2l0aW9uZWQgYXQgdGhlIHRvcCBvZiB0aGUgc3RydWN0dXJlLiAqLwotICAvKiBUaHVzLCB0aGVpciBvZmZzZXQgY2FuIGJlIGNvZGVkIHdpdGggbGVzcyBvcGNvZGVzLCByZXN1bHRpbmcgaW4gYSAgICovCi0gIC8qIHNtYWxsZXIgZXhlY3V0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBzdHJ1Y3QgIGJsYWNrX1RXb3JrZXJfCi0gIHsKLSAgICBJbnQgICAgICAgICBwcmVjaXNpb25fYml0czsgICAgIC8qIHByZWNpc2lvbiByZWxhdGVkIHZhcmlhYmxlcyAgICAgICAgICovCi0gICAgSW50ICAgICAgICAgcHJlY2lzaW9uOwotICAgIEludCAgICAgICAgIHByZWNpc2lvbl9oYWxmOwotICAgIEludCAgICAgICAgIHByZWNpc2lvbl9zaGlmdDsKLSAgICBJbnQgICAgICAgICBwcmVjaXNpb25fc3RlcDsKLSAgICBJbnQgICAgICAgICBwcmVjaXNpb25faml0dGVyOwotCi0gICAgSW50ICAgICAgICAgc2NhbGVfc2hpZnQ7ICAgICAgICAvKiA9PSBwcmVjaXNpb25fc2hpZnQgICBmb3IgYml0bWFwcyAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogPT0gcHJlY2lzaW9uX3NoaWZ0KzEgZm9yIHBpeG1hcHMgICAgKi8KLQotICAgIFBMb25nICAgICAgIGJ1ZmY7ICAgICAgICAgICAgICAgLyogVGhlIHByb2ZpbGVzIGJ1ZmZlciAgICAgICAgICAgICAgICAgKi8KLSAgICBQTG9uZyAgICAgICBzaXplQnVmZjsgICAgICAgICAgIC8qIFJlbmRlciBwb29sIHNpemUgICAgICAgICAgICAgICAgICAgICovCi0gICAgUExvbmcgICAgICAgbWF4QnVmZjsgICAgICAgICAgICAvKiBQcm9maWxlcyBidWZmZXIgc2l6ZSAgICAgICAgICAgICAgICAqLwotICAgIFBMb25nICAgICAgIHRvcDsgICAgICAgICAgICAgICAgLyogQ3VycmVudCBjdXJzb3IgaW4gYnVmZmVyICAgICAgICAgICAgKi8KLQotICAgIEZUX0Vycm9yICAgIGVycm9yOwotCi0gICAgSW50ICAgICAgICAgbnVtVHVybnM7ICAgICAgICAgICAvKiBudW1iZXIgb2YgWS10dXJucyBpbiBvdXRsaW5lICAgICAgICAqLwotCi0gICAgVFBvaW50KiAgICAgYXJjOyAgICAgICAgICAgICAgICAvKiBjdXJyZW50IEJlemllciBhcmMgcG9pbnRlciAgICAgICAgICAqLwotCi0gICAgVVNob3J0ICAgICAgYldpZHRoOyAgICAgICAgICAgICAvKiB0YXJnZXQgYml0bWFwIHdpZHRoICAgICAgICAgICAgICAgICAqLwotICAgIFBCeXRlICAgICAgIGJUYXJnZXQ7ICAgICAgICAgICAgLyogdGFyZ2V0IGJpdG1hcCBidWZmZXIgICAgICAgICAgICAgICAgKi8KLSAgICBQQnl0ZSAgICAgICBnVGFyZ2V0OyAgICAgICAgICAgIC8qIHRhcmdldCBwaXhtYXAgYnVmZmVyICAgICAgICAgICAgICAgICovCi0KLSAgICBMb25nICAgICAgICBsYXN0WCwgbGFzdFk7Ci0gICAgTG9uZyAgICAgICAgbWluWSwgbWF4WTsKLQotICAgIFVTaG9ydCAgICAgIG51bV9Qcm9mczsgICAgICAgICAgLyogY3VycmVudCBudW1iZXIgb2YgcHJvZmlsZXMgICAgICAgICAgKi8KLQotICAgIEJvb2wgICAgICAgIGZyZXNoOyAgICAgICAgICAgICAgLyogc2lnbmFscyBhIGZyZXNoIG5ldyBwcm9maWxlIHdoaWNoICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGBzdGFydCcgZmllbGQgbXVzdCBiZSBjb21wbGV0ZWQgICAgICovCi0gICAgQm9vbCAgICAgICAgam9pbnQ7ICAgICAgICAgICAgICAvKiBzaWduYWxzIHRoYXQgdGhlIGxhc3QgYXJjIGVuZGVkICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXhhY3RseSBvbiBhIHNjYW5saW5lLiAgQWxsb3dzICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlbW92YWwgb2YgZG91YmxldHMgICAgICAgICAgICAgICAgICovCi0gICAgUFByb2ZpbGUgICAgY1Byb2ZpbGU7ICAgICAgICAgICAvKiBjdXJyZW50IHByb2ZpbGUgICAgICAgICAgICAgICAgICAgICAqLwotICAgIFBQcm9maWxlICAgIGZQcm9maWxlOyAgICAgICAgICAgLyogaGVhZCBvZiBsaW5rZWQgbGlzdCBvZiBwcm9maWxlcyAgICAgKi8KLSAgICBQUHJvZmlsZSAgICBnUHJvZmlsZTsgICAgICAgICAgIC8qIGNvbnRvdXIncyBmaXJzdCBwcm9maWxlIGluIGNhc2UgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvZiBpbXBhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgVFN0YXRlcyAgICAgc3RhdGU7ICAgICAgICAgICAgICAvKiByZW5kZXJpbmcgc3RhdGUgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgRlRfQml0bWFwICAgdGFyZ2V0OyAgICAgICAgICAgICAvKiBkZXNjcmlwdGlvbiBvZiB0YXJnZXQgYml0L3BpeG1hcCAgICAqLwotICAgIEZUX091dGxpbmUgIG91dGxpbmU7Ci0KLSAgICBMb25nICAgICAgICB0cmFjZU9mczsgICAgICAgICAgIC8qIGN1cnJlbnQgb2Zmc2V0IGluIHRhcmdldCBiaXRtYXAgICAgICovCi0gICAgTG9uZyAgICAgICAgdHJhY2VHOyAgICAgICAgICAgICAvKiBjdXJyZW50IG9mZnNldCBpbiB0YXJnZXQgcGl4bWFwICAgICAqLwotCi0gICAgU2hvcnQgICAgICAgdHJhY2VJbmNyOyAgICAgICAgICAvKiBzd2VlcCdzIGluY3JlbWVudCBpbiB0YXJnZXQgYml0bWFwICAqLwotCi0gICAgLyogZGlzcGF0Y2ggdmFyaWFibGVzICovCi0KLSAgICBGdW5jdGlvbl9Td2VlcF9Jbml0KiAgUHJvY19Td2VlcF9Jbml0OwotICAgIEZ1bmN0aW9uX1N3ZWVwX1NwYW4qICBQcm9jX1N3ZWVwX1NwYW47Ci0gICAgRnVuY3Rpb25fU3dlZXBfU3BhbiogIFByb2NfU3dlZXBfRHJvcDsKLSAgICBGdW5jdGlvbl9Td2VlcF9TdGVwKiAgUHJvY19Td2VlcF9TdGVwOwotCi0gICAgQnl0ZSAgICAgICAgZHJvcE91dENvbnRyb2w7ICAgICAvKiBjdXJyZW50IGRyb3Bfb3V0IGNvbnRyb2wgbWV0aG9kICAgICAqLwotCi0gICAgQm9vbCAgICAgICAgc2Vjb25kX3Bhc3M7ICAgICAgICAvKiBpbmRpY2F0ZXMgd2hldGhlciBhIGhvcml6b250YWwgcGFzcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hvdWxkIGJlIHBlcmZvcm1lZCB0byBjb250cm9sICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRyb3Atb3V0IGFjY3VyYXRlbHkgd2hlbiBjYWxsaW5nICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZW5kZXJfR2x5cGguICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgVFBvaW50ICAgICAgYXJjc1szICogTWF4QmV6aWVyICsgMV07IC8qIFRoZSBCZXppZXIgc3RhY2sgICAgICAgICAgICAgICAqLwotCi0gICAgYmxhY2tfVEJhbmQgIGJhbmRfc3RhY2tbMTZdOyAgICAvKiBiYW5kIHN0YWNrIHVzZWQgZm9yIHN1Yi1iYW5kaW5nICAgICAqLwotICAgIEludCAgICAgICAgICBiYW5kX3RvcDsgICAgICAgICAgLyogYmFuZCBzdGFjayB0b3AgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICB9OwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIGJsYWNrX1RSYXN0ZXJfCi0gIHsKLSAgICB2b2lkKiAgICAgICAgICBtZW1vcnk7Ci0KLSAgfSBibGFja19UUmFzdGVyLCAqYmxhY2tfUFJhc3RlcjsKLQotI2lmZGVmIEZUX1NUQVRJQ19SQVNURVIKLQotICBzdGF0aWMgYmxhY2tfVFdvcmtlciAgY3VyX3JhczsKLSNkZWZpbmUgcmFzICBjdXJfcmFzCi0KLSNlbHNlIC8qICFGVF9TVEFUSUNfUkFTVEVSICovCi0KLSNkZWZpbmUgcmFzICAoKndvcmtlcikKLQotI2VuZGlmIC8qICFGVF9TVEFUSUNfUkFTVEVSICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwotICAvKiogIFBST0ZJTEVTIENPTVBVVEFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLSAgLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNldF9IaWdoX1ByZWNpc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNldCBwcmVjaXNpb24gdmFyaWFibGVzIGFjY29yZGluZyB0byBwYXJhbSBmbGFnLiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEhpZ2ggOjogU2V0IHRvIFRydWUgZm9yIGhpZ2ggcHJlY2lzaW9uICh0eXBpY2FsbHkgZm9yIHBwZW0gPCAyNCksICAqLwotICAvKiAgICAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIFNldF9IaWdoX1ByZWNpc2lvbiggUkFTX0FSR1MgSW50ICBIaWdoICkKLSAgewotICAgIC8qCi0gICAgICogYHByZWNpc2lvbl9zdGVwJyBpcyB1c2VkIGluIGBCZXppZXJfVXAnIHRvIGRlY2lkZSB3aGVuIHRvIHNwbGl0IGEKLSAgICAgKiBnaXZlbiB5LW1vbm90b25vdXMgQmV6aWVyIGFyYyB0aGF0IGNyb3NzZXMgYSBzY2FubGluZSBiZWZvcmUKLSAgICAgKiBhcHByb3hpbWF0aW5nIGl0IGFzIGEgc3RyYWlnaHQgc2VnbWVudC4gIFRoZSBkZWZhdWx0IHZhbHVlIG9mIDMyIChmb3IKLSAgICAgKiBsb3cgYWNjdXJhY3kpIGNvcnJlc3BvbmRzIHRvCi0gICAgICoKLSAgICAgKiAgIDMyIC8gNjQgPT0gMC41IHBpeGVscywKLSAgICAgKgotICAgICAqIHdoaWxlIGZvciB0aGUgaGlnaCBhY2N1cmFjeSBjYXNlIHdlIGhhdmUKLSAgICAgKgotICAgICAqICAgMjU2IC8gKDEgPDwgMTIpID0gMC4wNjI1IHBpeGVscy4KLSAgICAgKgotICAgICAqIGBwcmVjaXNpb25faml0dGVyJyBpcyBhbiBlcHNpbG9uIHRocmVzaG9sZCB1c2VkIGluCi0gICAgICogYFZlcnRpY2FsX1N3ZWVwX1NwYW4nIHRvIGRlYWwgd2l0aCBzbWFsbCBpbXBlcmZlY3Rpb25zIGluIHRoZSBCZXppZXIKLSAgICAgKiBkZWNvbXBvc2l0aW9uIChhZnRlciBhbGwsIHdlIGFyZSB3b3JraW5nIHdpdGggYXBwcm94aW1hdGlvbnMgb25seSk7Ci0gICAgICogaXQgYXZvaWRzIHN3aXRjaGluZyBvbiBhZGRpdGlvbmFsIHBpeGVscyB3aGljaCB3b3VsZCBjYXVzZSBhcnRpZmFjdHMKLSAgICAgKiBvdGhlcndpc2UuCi0gICAgICoKLSAgICAgKiBUaGUgdmFsdWUgb2YgYHByZWNpc2lvbl9qaXR0ZXInIGhhcyBiZWVuIGRldGVybWluZWQgaGV1cmlzdGljYWxseS4KLSAgICAgKgotICAgICAqLwotCi0gICAgaWYgKCBIaWdoICkKLSAgICB7Ci0gICAgICByYXMucHJlY2lzaW9uX2JpdHMgICA9IDEyOwotICAgICAgcmFzLnByZWNpc2lvbl9zdGVwICAgPSAyNTY7Ci0gICAgICByYXMucHJlY2lzaW9uX2ppdHRlciA9IDMwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmFzLnByZWNpc2lvbl9iaXRzICAgPSA2OwotICAgICAgcmFzLnByZWNpc2lvbl9zdGVwICAgPSAzMjsKLSAgICAgIHJhcy5wcmVjaXNpb25faml0dGVyID0gMjsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTYoKCAiU2V0X0hpZ2hfUHJlY2lzaW9uKCVzKVxuIiwgSGlnaCA/ICJ0cnVlIiA6ICJmYWxzZSIgKSk7Ci0KLSAgICByYXMucHJlY2lzaW9uICAgICAgID0gMSA8PCByYXMucHJlY2lzaW9uX2JpdHM7Ci0gICAgcmFzLnByZWNpc2lvbl9oYWxmICA9IHJhcy5wcmVjaXNpb24gLyAyOwotICAgIHJhcy5wcmVjaXNpb25fc2hpZnQgPSByYXMucHJlY2lzaW9uX2JpdHMgLSBQaXhlbF9CaXRzOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBOZXdfUHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDcmVhdGUgYSBuZXcgcHJvZmlsZSBpbiB0aGUgcmVuZGVyIHBvb2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhU3RhdGUgICAgOjogVGhlIHN0YXRlL29yaWVudGF0aW9uIG9mIHRoZSBuZXcgcHJvZmlsZS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG92ZXJzaG9vdCA6OiBXaGV0aGVyIHRoZSBwcm9maWxlJ3MgdW5yb3VuZGVkIHN0YXJ0IHBvc2l0aW9uICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgZGlmZmVycyBieSBhdCBsZWFzdCBhIGhhbGYgcGl4ZWwuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFNVQ0NFU1Mgb24gc3VjY2Vzcy4gIEZBSUxVUkUgaW4gY2FzZSBvZiBvdmVyZmxvdyBvciBvZiBpbmNvaGVyZW50ICAgKi8KLSAgLyogICBwcm9maWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgQm9vbAotICBOZXdfUHJvZmlsZSggUkFTX0FSR1MgVFN0YXRlcyAgYVN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbCAgICAgb3ZlcnNob290ICkKLSAgewotICAgIGlmICggIXJhcy5mUHJvZmlsZSApCi0gICAgewotICAgICAgcmFzLmNQcm9maWxlICA9IChQUHJvZmlsZSlyYXMudG9wOwotICAgICAgcmFzLmZQcm9maWxlICA9IHJhcy5jUHJvZmlsZTsKLSAgICAgIHJhcy50b3AgICAgICArPSBBbGlnblByb2ZpbGVTaXplOwotICAgIH0KLQotICAgIGlmICggcmFzLnRvcCA+PSByYXMubWF4QnVmZiApCi0gICAgewotICAgICAgcmFzLmVycm9yID0gRlRfVEhST1coIE92ZXJmbG93ICk7Ci0gICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICB9Ci0KLSAgICByYXMuY1Byb2ZpbGUtPmZsYWdzICA9IDA7Ci0gICAgcmFzLmNQcm9maWxlLT5zdGFydCAgPSAwOwotICAgIHJhcy5jUHJvZmlsZS0+aGVpZ2h0ID0gMDsKLSAgICByYXMuY1Byb2ZpbGUtPm9mZnNldCA9IHJhcy50b3A7Ci0gICAgcmFzLmNQcm9maWxlLT5saW5rICAgPSAoUFByb2ZpbGUpMDsKLSAgICByYXMuY1Byb2ZpbGUtPm5leHQgICA9IChQUHJvZmlsZSkwOwotICAgIHJhcy5jUHJvZmlsZS0+ZmxhZ3MgID0gcmFzLmRyb3BPdXRDb250cm9sOwotCi0gICAgc3dpdGNoICggYVN0YXRlICkKLSAgICB7Ci0gICAgY2FzZSBBc2NlbmRpbmdfU3RhdGU6Ci0gICAgICByYXMuY1Byb2ZpbGUtPmZsYWdzIHw9IEZsb3dfVXA7Ci0gICAgICBpZiAoIG92ZXJzaG9vdCApCi0gICAgICAgIHJhcy5jUHJvZmlsZS0+ZmxhZ3MgfD0gT3ZlcnNob290X0JvdHRvbTsKLQotICAgICAgRlRfVFJBQ0U2KCggIiAgbmV3IGFzY2VuZGluZyBwcm9maWxlID0gJXBcbiIsIHJhcy5jUHJvZmlsZSApKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBEZXNjZW5kaW5nX1N0YXRlOgotICAgICAgaWYgKCBvdmVyc2hvb3QgKQotICAgICAgICByYXMuY1Byb2ZpbGUtPmZsYWdzIHw9IE92ZXJzaG9vdF9Ub3A7Ci0gICAgICBGVF9UUkFDRTYoKCAiICBuZXcgZGVzY2VuZGluZyBwcm9maWxlID0gJXBcbiIsIHJhcy5jUHJvZmlsZSApKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEZUX0VSUk9SKCggIk5ld19Qcm9maWxlOiBpbnZhbGlkIHByb2ZpbGUgZGlyZWN0aW9uXG4iICkpOwotICAgICAgcmFzLmVycm9yID0gRlRfVEhST1coIEludmFsaWQgKTsKLSAgICAgIHJldHVybiBGQUlMVVJFOwotICAgIH0KLQotICAgIGlmICggIXJhcy5nUHJvZmlsZSApCi0gICAgICByYXMuZ1Byb2ZpbGUgPSByYXMuY1Byb2ZpbGU7Ci0KLSAgICByYXMuc3RhdGUgPSBhU3RhdGU7Ci0gICAgcmFzLmZyZXNoID0gVFJVRTsKLSAgICByYXMuam9pbnQgPSBGQUxTRTsKLQotICAgIHJldHVybiBTVUNDRVNTOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBFbmRfUHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaW5hbGl6ZSB0aGUgY3VycmVudCBwcm9maWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdmVyc2hvb3QgOjogV2hldGhlciB0aGUgcHJvZmlsZSdzIHVucm91bmRlZCBlbmQgcG9zaXRpb24gZGlmZmVycyAgKi8KLSAgLyogICAgICAgICAgICAgICAgIGJ5IGF0IGxlYXN0IGEgaGFsZiBwaXhlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU1VDQ0VTUyBvbiBzdWNjZXNzLiAgRkFJTFVSRSBpbiBjYXNlIG9mIG92ZXJmbG93IG9yIGluY29oZXJlbmN5LiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgQm9vbAotICBFbmRfUHJvZmlsZSggUkFTX0FSR1MgQm9vbCAgb3ZlcnNob290ICkKLSAgewotICAgIExvbmcgIGg7Ci0KLQotICAgIGggPSAoTG9uZykoIHJhcy50b3AgLSByYXMuY1Byb2ZpbGUtPm9mZnNldCApOwotCi0gICAgaWYgKCBoIDwgMCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiRW5kX1Byb2ZpbGU6IG5lZ2F0aXZlIGhlaWdodCBlbmNvdW50ZXJlZFxuIiApKTsKLSAgICAgIHJhcy5lcnJvciA9IEZUX1RIUk9XKCBOZWdfSGVpZ2h0ICk7Ci0gICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICB9Ci0KLSAgICBpZiAoIGggPiAwICkKLSAgICB7Ci0gICAgICBQUHJvZmlsZSAgb2xkUHJvZmlsZTsKLQotCi0gICAgICBGVF9UUkFDRTYoKCAiICBlbmRpbmcgcHJvZmlsZSAlcCwgc3RhcnQgPSAlbGQsIGhlaWdodCA9ICVsZFxuIiwKLSAgICAgICAgICAgICAgICAgIHJhcy5jUHJvZmlsZSwgcmFzLmNQcm9maWxlLT5zdGFydCwgaCApKTsKLQotICAgICAgcmFzLmNQcm9maWxlLT5oZWlnaHQgPSBoOwotICAgICAgaWYgKCBvdmVyc2hvb3QgKQotICAgICAgewotICAgICAgICBpZiAoIHJhcy5jUHJvZmlsZS0+ZmxhZ3MgJiBGbG93X1VwICkKLSAgICAgICAgICByYXMuY1Byb2ZpbGUtPmZsYWdzIHw9IE92ZXJzaG9vdF9Ub3A7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICByYXMuY1Byb2ZpbGUtPmZsYWdzIHw9IE92ZXJzaG9vdF9Cb3R0b207Ci0gICAgICB9Ci0KLSAgICAgIG9sZFByb2ZpbGUgICA9IHJhcy5jUHJvZmlsZTsKLSAgICAgIHJhcy5jUHJvZmlsZSA9IChQUHJvZmlsZSlyYXMudG9wOwotCi0gICAgICByYXMudG9wICs9IEFsaWduUHJvZmlsZVNpemU7Ci0KLSAgICAgIHJhcy5jUHJvZmlsZS0+aGVpZ2h0ID0gMDsKLSAgICAgIHJhcy5jUHJvZmlsZS0+b2Zmc2V0ID0gcmFzLnRvcDsKLQotICAgICAgb2xkUHJvZmlsZS0+bmV4dCA9IHJhcy5jUHJvZmlsZTsKLSAgICAgIHJhcy5udW1fUHJvZnMrKzsKLSAgICB9Ci0KLSAgICBpZiAoIHJhcy50b3AgPj0gcmFzLm1heEJ1ZmYgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMSgoICJvdmVyZmxvdyBpbiBFbmRfUHJvZmlsZVxuIiApKTsKLSAgICAgIHJhcy5lcnJvciA9IEZUX1RIUk9XKCBPdmVyZmxvdyApOwotICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0gICAgfQotCi0gICAgcmFzLmpvaW50ID0gRkFMU0U7Ci0KLSAgICByZXR1cm4gU1VDQ0VTUzsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5zZXJ0X1lfVHVybiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5zZXJ0IGEgc2FsaWVudCBpbnRvIHRoZSBzb3J0ZWQgbGlzdCBwbGFjZWQgb24gdG9wIG9mIHRoZSByZW5kZXIgICovCi0gIC8qICAgIHBvb2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5ldyB5IHNjYW5saW5lIHBvc2l0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNVQ0NFU1Mgb24gc3VjY2Vzcy4gIEZBSUxVUkUgaW4gY2FzZSBvZiBvdmVyZmxvdy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEJvb2wKLSAgSW5zZXJ0X1lfVHVybiggUkFTX0FSR1MgSW50ICB5ICkKLSAgewotICAgIFBMb25nICB5X3R1cm5zOwotICAgIEludCAgICBuOwotCi0KLSAgICBuICAgICAgID0gcmFzLm51bVR1cm5zIC0gMTsKLSAgICB5X3R1cm5zID0gcmFzLnNpemVCdWZmIC0gcmFzLm51bVR1cm5zOwotCi0gICAgLyogbG9vayBmb3IgZmlyc3QgeSB2YWx1ZSB0aGF0IGlzIDw9ICovCi0gICAgd2hpbGUgKCBuID49IDAgJiYgeSA8IHlfdHVybnNbbl0gKQotICAgICAgbi0tOwotCi0gICAgLyogaWYgaXQgaXMgPCwgc2ltcGx5IGluc2VydCBpdCwgaWdub3JlIGlmID09ICovCi0gICAgaWYgKCBuID49IDAgJiYgeSA+IHlfdHVybnNbbl0gKQotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgSW50ICB5MiA9IChJbnQpeV90dXJuc1tuXTsKLQotCi0gICAgICAgIHlfdHVybnNbbl0gPSB5OwotICAgICAgICB5ID0geTI7Ci0gICAgICB9IHdoaWxlICggLS1uID49IDAgKTsKLQotICAgIGlmICggbiA8IDAgKQotICAgIHsKLSAgICAgIHJhcy5tYXhCdWZmLS07Ci0gICAgICBpZiAoIHJhcy5tYXhCdWZmIDw9IHJhcy50b3AgKQotICAgICAgewotICAgICAgICByYXMuZXJyb3IgPSBGVF9USFJPVyggT3ZlcmZsb3cgKTsKLSAgICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0gICAgICB9Ci0gICAgICByYXMubnVtVHVybnMrKzsKLSAgICAgIHJhcy5zaXplQnVmZlstcmFzLm51bVR1cm5zXSA9IHk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFNVQ0NFU1M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmFsaXplX1Byb2ZpbGVfVGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFkanVzdCBhbGwgbGlua3MgaW4gdGhlIHByb2ZpbGVzIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNVQ0NFU1Mgb24gc3VjY2Vzcy4gIEZBSUxVUkUgaW4gY2FzZSBvZiBvdmVyZmxvdy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEJvb2wKLSAgRmluYWxpemVfUHJvZmlsZV9UYWJsZSggUkFTX0FSRyApCi0gIHsKLSAgICBVU2hvcnQgICAgbjsKLSAgICBQUHJvZmlsZSAgcDsKLQotCi0gICAgbiA9IHJhcy5udW1fUHJvZnM7Ci0gICAgcCA9IHJhcy5mUHJvZmlsZTsKLQotICAgIGlmICggbiA+IDEgJiYgcCApCi0gICAgewotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgSW50ICBib3R0b20sIHRvcDsKLQotCi0gICAgICAgIGlmICggbiA+IDEgKQotICAgICAgICAgIHAtPmxpbmsgPSAoUFByb2ZpbGUpKCBwLT5vZmZzZXQgKyBwLT5oZWlnaHQgKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHAtPmxpbmsgPSBOVUxMOwotCi0gICAgICAgIGlmICggcC0+ZmxhZ3MgJiBGbG93X1VwICkKLSAgICAgICAgewotICAgICAgICAgIGJvdHRvbSA9IChJbnQpcC0+c3RhcnQ7Ci0gICAgICAgICAgdG9wICAgID0gKEludCkoIHAtPnN0YXJ0ICsgcC0+aGVpZ2h0IC0gMSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGJvdHRvbSAgICAgPSAoSW50KSggcC0+c3RhcnQgLSBwLT5oZWlnaHQgKyAxICk7Ci0gICAgICAgICAgdG9wICAgICAgICA9IChJbnQpcC0+c3RhcnQ7Ci0gICAgICAgICAgcC0+c3RhcnQgICA9IGJvdHRvbTsKLSAgICAgICAgICBwLT5vZmZzZXQgKz0gcC0+aGVpZ2h0IC0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggSW5zZXJ0X1lfVHVybiggUkFTX1ZBUlMgYm90dG9tICkgIHx8Ci0gICAgICAgICAgICAgSW5zZXJ0X1lfVHVybiggUkFTX1ZBUlMgdG9wICsgMSApICkKLSAgICAgICAgICByZXR1cm4gRkFJTFVSRTsKLQotICAgICAgICBwID0gcC0+bGluazsKLSAgICAgIH0gd2hpbGUgKCAtLW4gKTsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgcmFzLmZQcm9maWxlID0gTlVMTDsKLQotICAgIHJldHVybiBTVUNDRVNTOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTcGxpdF9Db25pYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTdWJkaXZpZGUgb25lIGNvbmljIEJlemllciBpbnRvIHR3byBqb2ludCBzdWItYXJjcyBpbiB0aGUgQmV6aWVyICAgKi8KLSAgLyogICAgc3RhY2suICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTm9uZSAoc3ViZGl2aWRlZCBCZXppZXIgaXMgdGFrZW4gZnJvbSB0aGUgdG9wIG9mIHRoZSBzdGFjaykuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyByb3V0aW5lIGlzIHRoZSBgYmVlZicgb2YgdGhpcyBjb21wb25lbnQuICBJdCBpcyAgX3RoZV8gaW5uZXIgICovCi0gIC8qICAgIGxvb3AgdGhhdCBzaG91bGQgYmUgb3B0aW1pemVkIHRvIGhlbGwgdG8gZ2V0IHRoZSBiZXN0IHBlcmZvcm1hbmNlLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgU3BsaXRfQ29uaWMoIFRQb2ludCogIGJhc2UgKQotICB7Ci0gICAgTG9uZyAgYSwgYjsKLQotCi0gICAgYmFzZVs0XS54ID0gYmFzZVsyXS54OwotICAgIGIgPSBiYXNlWzFdLng7Ci0gICAgYSA9IGJhc2VbM10ueCA9ICggYmFzZVsyXS54ICsgYiApIC8gMjsKLSAgICBiID0gYmFzZVsxXS54ID0gKCBiYXNlWzBdLnggKyBiICkgLyAyOwotICAgIGJhc2VbMl0ueCA9ICggYSArIGIgKSAvIDI7Ci0KLSAgICBiYXNlWzRdLnkgPSBiYXNlWzJdLnk7Ci0gICAgYiA9IGJhc2VbMV0ueTsKLSAgICBhID0gYmFzZVszXS55ID0gKCBiYXNlWzJdLnkgKyBiICkgLyAyOwotICAgIGIgPSBiYXNlWzFdLnkgPSAoIGJhc2VbMF0ueSArIGIgKSAvIDI7Ci0gICAgYmFzZVsyXS55ID0gKCBhICsgYiApIC8gMjsKLQotICAgIC8qIGhhbmQgb3B0aW1pemVkLiAgZ2NjIGRvZXNuJ3Qgc2VlbSB0byBiZSB0b28gZ29vZCBhdCBjb21tb24gICAgICAqLwotICAgIC8qIGV4cHJlc3Npb24gc3Vic3RpdHV0aW9uIGFuZCBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nIDstKSAgICAgICAgICAqLwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTcGxpdF9DdWJpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTdWJkaXZpZGUgYSB0aGlyZC1vcmRlciBCZXppZXIgYXJjIGludG8gdHdvIGpvaW50IHN1Yi1hcmNzIGluIHRoZSAgKi8KLSAgLyogICAgQmV6aWVyIHN0YWNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyByb3V0aW5lIGlzIHRoZSBgYmVlZicgb2YgdGhlIGNvbXBvbmVudC4gIEl0IGlzIG9uZSBvZiBfdGhlXyAgICovCi0gIC8qICAgIGlubmVyIGxvb3BzIHRoYXQgc2hvdWxkIGJlIG9wdGltaXplZCBsaWtlIGhlbGwgdG8gZ2V0IHRoZSBiZXN0ICAgICAqLwotICAvKiAgICBwZXJmb3JtYW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIFNwbGl0X0N1YmljKCBUUG9pbnQqICBiYXNlICkKLSAgewotICAgIExvbmcgIGEsIGIsIGMsIGQ7Ci0KLQotICAgIGJhc2VbNl0ueCA9IGJhc2VbM10ueDsKLSAgICBjID0gYmFzZVsxXS54OwotICAgIGQgPSBiYXNlWzJdLng7Ci0gICAgYmFzZVsxXS54ID0gYSA9ICggYmFzZVswXS54ICsgYyArIDEgKSA+PiAxOwotICAgIGJhc2VbNV0ueCA9IGIgPSAoIGJhc2VbM10ueCArIGQgKyAxICkgPj4gMTsKLSAgICBjID0gKCBjICsgZCArIDEgKSA+PiAxOwotICAgIGJhc2VbMl0ueCA9IGEgPSAoIGEgKyBjICsgMSApID4+IDE7Ci0gICAgYmFzZVs0XS54ID0gYiA9ICggYiArIGMgKyAxICkgPj4gMTsKLSAgICBiYXNlWzNdLnggPSAoIGEgKyBiICsgMSApID4+IDE7Ci0KLSAgICBiYXNlWzZdLnkgPSBiYXNlWzNdLnk7Ci0gICAgYyA9IGJhc2VbMV0ueTsKLSAgICBkID0gYmFzZVsyXS55OwotICAgIGJhc2VbMV0ueSA9IGEgPSAoIGJhc2VbMF0ueSArIGMgKyAxICkgPj4gMTsKLSAgICBiYXNlWzVdLnkgPSBiID0gKCBiYXNlWzNdLnkgKyBkICsgMSApID4+IDE7Ci0gICAgYyA9ICggYyArIGQgKyAxICkgPj4gMTsKLSAgICBiYXNlWzJdLnkgPSBhID0gKCBhICsgYyArIDEgKSA+PiAxOwotICAgIGJhc2VbNF0ueSA9IGIgPSAoIGIgKyBjICsgMSApID4+IDE7Ci0gICAgYmFzZVszXS55ID0gKCBhICsgYiArIDEgKSA+PiAxOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMaW5lX1VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlIHRoZSB4LWNvb3JkaW5hdGVzIG9mIGFuIGFzY2VuZGluZyBsaW5lIHNlZ21lbnQgYW5kIHN0b3JlICAgKi8KLSAgLyogICAgdGhlbSBpbiB0aGUgcmVuZGVyIHBvb2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeDEgICA6OiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3Mgc3RhcnQgcG9pbnQuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5MSAgIDo6IFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHNlZ21lbnQncyBzdGFydCBwb2ludC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHgyICAgOjogVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgc2VnbWVudCdzIGVuZCBwb2ludC4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeTIgICA6OiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3MgZW5kIHBvaW50LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtaW55IDo6IEEgbG93ZXIgdmVydGljYWwgY2xpcHBpbmcgYm91bmQgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1heHkgOjogQW4gdXBwZXIgdmVydGljYWwgY2xpcHBpbmcgYm91bmQgdmFsdWUuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNVQ0NFU1Mgb24gc3VjY2VzcywgRkFJTFVSRSBvbiByZW5kZXIgcG9vbCBvdmVyZmxvdy4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEJvb2wKLSAgTGluZV9VcCggUkFTX0FSR1MgTG9uZyAgeDEsCi0gICAgICAgICAgICAgICAgICAgIExvbmcgIHkxLAotICAgICAgICAgICAgICAgICAgICBMb25nICB4MiwKLSAgICAgICAgICAgICAgICAgICAgTG9uZyAgeTIsCi0gICAgICAgICAgICAgICAgICAgIExvbmcgIG1pbnksCi0gICAgICAgICAgICAgICAgICAgIExvbmcgIG1heHkgKQotICB7Ci0gICAgTG9uZyAgIER4LCBEeTsKLSAgICBJbnQgICAgZTEsIGUyLCBmMSwgZjIsIHNpemU7ICAgICAvKiBYWFg6IGlzIGBTaG9ydCcgc3VmZmljaWVudD8gKi8KLSAgICBMb25nICAgSXgsIFJ4LCBBeDsKLQotICAgIFBMb25nICB0b3A7Ci0KLQotICAgIER4ID0geDIgLSB4MTsKLSAgICBEeSA9IHkyIC0geTE7Ci0KLSAgICBpZiAoIER5IDw9IDAgfHwgeTIgPCBtaW55IHx8IHkxID4gbWF4eSApCi0gICAgICByZXR1cm4gU1VDQ0VTUzsKLQotICAgIGlmICggeTEgPCBtaW55ICkKLSAgICB7Ci0gICAgICAvKiBUYWtlIGNhcmU6IG1pbnkteTEgY2FuIGJlIGEgdmVyeSBsYXJnZSB2YWx1ZTsgd2UgdXNlICAgICAqLwotICAgICAgLyogICAgICAgICAgICBhIHNsb3cgTXVsRGl2IGZ1bmN0aW9uIHRvIGF2b2lkIGNsaXBwaW5nIGJ1Z3MgKi8KLSAgICAgIHgxICs9IFNNdWxEaXYoIER4LCBtaW55IC0geTEsIER5ICk7Ci0gICAgICBlMSAgPSAoSW50KVRSVU5DKCBtaW55ICk7Ci0gICAgICBmMSAgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZTEgPSAoSW50KVRSVU5DKCB5MSApOwotICAgICAgZjEgPSAoSW50KUZSQUMoIHkxICk7Ci0gICAgfQotCi0gICAgaWYgKCB5MiA+IG1heHkgKQotICAgIHsKLSAgICAgIC8qIHgyICs9IEZNdWxEaXYoIER4LCBtYXh5IC0geTIsIER5ICk7ICBVTk5FQ0VTU0FSWSAqLwotICAgICAgZTIgID0gKEludClUUlVOQyggbWF4eSApOwotICAgICAgZjIgID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGUyID0gKEludClUUlVOQyggeTIgKTsKLSAgICAgIGYyID0gKEludClGUkFDKCB5MiApOwotICAgIH0KLQotICAgIGlmICggZjEgPiAwICkKLSAgICB7Ci0gICAgICBpZiAoIGUxID09IGUyICkKLSAgICAgICAgcmV0dXJuIFNVQ0NFU1M7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHgxICs9IFNNdWxEaXYoIER4LCByYXMucHJlY2lzaW9uIC0gZjEsIER5ICk7Ci0gICAgICAgIGUxICs9IDE7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGlmICggcmFzLmpvaW50ICkKLSAgICAgIHsKLSAgICAgICAgcmFzLnRvcC0tOwotICAgICAgICByYXMuam9pbnQgPSBGQUxTRTsKLSAgICAgIH0KLQotICAgIHJhcy5qb2ludCA9IChjaGFyKSggZjIgPT0gMCApOwotCi0gICAgaWYgKCByYXMuZnJlc2ggKQotICAgIHsKLSAgICAgIHJhcy5jUHJvZmlsZS0+c3RhcnQgPSBlMTsKLSAgICAgIHJhcy5mcmVzaCAgICAgICAgICAgPSBGQUxTRTsKLSAgICB9Ci0KLSAgICBzaXplID0gZTIgLSBlMSArIDE7Ci0gICAgaWYgKCByYXMudG9wICsgc2l6ZSA+PSByYXMubWF4QnVmZiApCi0gICAgewotICAgICAgcmFzLmVycm9yID0gRlRfVEhST1coIE92ZXJmbG93ICk7Ci0gICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICB9Ci0KLSAgICBpZiAoIER4ID4gMCApCi0gICAgewotICAgICAgSXggPSBTTXVsRGl2X05vX1JvdW5kKCByYXMucHJlY2lzaW9uLCBEeCwgRHkgKTsKLSAgICAgIFJ4ID0gKCByYXMucHJlY2lzaW9uICogRHggKSAlIER5OwotICAgICAgRHggPSAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgSXggPSAtU011bERpdl9Ob19Sb3VuZCggcmFzLnByZWNpc2lvbiwgLUR4LCBEeSApOwotICAgICAgUnggPSAoIHJhcy5wcmVjaXNpb24gKiAtRHggKSAlIER5OwotICAgICAgRHggPSAtMTsKLSAgICB9Ci0KLSAgICBBeCAgPSAtRHk7Ci0gICAgdG9wID0gcmFzLnRvcDsKLQotICAgIHdoaWxlICggc2l6ZSA+IDAgKQotICAgIHsKLSAgICAgICp0b3ArKyA9IHgxOwotCi0gICAgICB4MSArPSBJeDsKLSAgICAgIEF4ICs9IFJ4OwotICAgICAgaWYgKCBBeCA+PSAwICkKLSAgICAgIHsKLSAgICAgICAgQXggLT0gRHk7Ci0gICAgICAgIHgxICs9IER4OwotICAgICAgfQotICAgICAgc2l6ZS0tOwotICAgIH0KLQotICAgIHJhcy50b3AgPSB0b3A7Ci0gICAgcmV0dXJuIFNVQ0NFU1M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExpbmVfRG93biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGUgdGhlIHgtY29vcmRpbmF0ZXMgb2YgYW4gZGVzY2VuZGluZyBsaW5lIHNlZ21lbnQgYW5kIHN0b3JlICAqLwotICAvKiAgICB0aGVtIGluIHRoZSByZW5kZXIgcG9vbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB4MSAgIDo6IFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIHNlZ21lbnQncyBzdGFydCBwb2ludC4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHkxICAgOjogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgc2VnbWVudCdzIHN0YXJ0IHBvaW50LiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgeDIgICA6OiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3MgZW5kIHBvaW50LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB5MiAgIDo6IFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHNlZ21lbnQncyBlbmQgcG9pbnQuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbnkgOjogQSBsb3dlciB2ZXJ0aWNhbCBjbGlwcGluZyBib3VuZCB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4eSA6OiBBbiB1cHBlciB2ZXJ0aWNhbCBjbGlwcGluZyBib3VuZCB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU1VDQ0VTUyBvbiBzdWNjZXNzLCBGQUlMVVJFIG9uIHJlbmRlciBwb29sIG92ZXJmbG93LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgQm9vbAotICBMaW5lX0Rvd24oIFJBU19BUkdTIExvbmcgIHgxLAotICAgICAgICAgICAgICAgICAgICAgIExvbmcgIHkxLAotICAgICAgICAgICAgICAgICAgICAgIExvbmcgIHgyLAotICAgICAgICAgICAgICAgICAgICAgIExvbmcgIHkyLAotICAgICAgICAgICAgICAgICAgICAgIExvbmcgIG1pbnksCi0gICAgICAgICAgICAgICAgICAgICAgTG9uZyAgbWF4eSApCi0gIHsKLSAgICBCb29sICByZXN1bHQsIGZyZXNoOwotCi0KLSAgICBmcmVzaCAgPSByYXMuZnJlc2g7Ci0KLSAgICByZXN1bHQgPSBMaW5lX1VwKCBSQVNfVkFSUyB4MSwgLXkxLCB4MiwgLXkyLCAtbWF4eSwgLW1pbnkgKTsKLQotICAgIGlmICggZnJlc2ggJiYgIXJhcy5mcmVzaCApCi0gICAgICByYXMuY1Byb2ZpbGUtPnN0YXJ0ID0gLXJhcy5jUHJvZmlsZS0+c3RhcnQ7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiBBIGZ1bmN0aW9uIHR5cGUgZGVzY3JpYmluZyB0aGUgZnVuY3Rpb25zIHVzZWQgdG8gc3BsaXQgQmV6aWVyIGFyY3MgKi8KLSAgdHlwZWRlZiB2b2lkICAoKlRTcGxpdHRlcikoIFRQb2ludCogIGJhc2UgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEJlemllcl9VcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGUgdGhlIHgtY29vcmRpbmF0ZXMgb2YgYW4gYXNjZW5kaW5nIEJlemllciBhcmMgYW5kIHN0b3JlICAgICAqLwotICAvKiAgICB0aGVtIGluIHRoZSByZW5kZXIgcG9vbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkZWdyZWUgICA6OiBUaGUgZGVncmVlIG9mIHRoZSBCZXppZXIgYXJjIChlaXRoZXIgMiBvciAzKS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNwbGl0dGVyIDo6IFRoZSBmdW5jdGlvbiB0byBzcGxpdCBCZXppZXIgYXJjcy4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWlueSAgICAgOjogQSBsb3dlciB2ZXJ0aWNhbCBjbGlwcGluZyBib3VuZCB2YWx1ZS4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXh5ICAgICA6OiBBbiB1cHBlciB2ZXJ0aWNhbCBjbGlwcGluZyBib3VuZCB2YWx1ZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTVUNDRVNTIG9uIHN1Y2Nlc3MsIEZBSUxVUkUgb24gcmVuZGVyIHBvb2wgb3ZlcmZsb3cuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBCb29sCi0gIEJlemllcl9VcCggUkFTX0FSR1MgSW50ICAgICAgICBkZWdyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgVFNwbGl0dGVyICBzcGxpdHRlciwKLSAgICAgICAgICAgICAgICAgICAgICBMb25nICAgICAgIG1pbnksCi0gICAgICAgICAgICAgICAgICAgICAgTG9uZyAgICAgICBtYXh5ICkKLSAgewotICAgIExvbmcgICB5MSwgeTIsIGUsIGUyLCBlMDsKLSAgICBTaG9ydCAgZjE7Ci0KLSAgICBUUG9pbnQqICBhcmM7Ci0gICAgVFBvaW50KiAgc3RhcnRfYXJjOwotCi0gICAgUExvbmcgdG9wOwotCi0KLSAgICBhcmMgPSByYXMuYXJjOwotICAgIHkxICA9IGFyY1tkZWdyZWVdLnk7Ci0gICAgeTIgID0gYXJjWzBdLnk7Ci0gICAgdG9wID0gcmFzLnRvcDsKLQotICAgIGlmICggeTIgPCBtaW55IHx8IHkxID4gbWF4eSApCi0gICAgICBnb3RvIEZpbjsKLQotICAgIGUyID0gRkxPT1IoIHkyICk7Ci0KLSAgICBpZiAoIGUyID4gbWF4eSApCi0gICAgICBlMiA9IG1heHk7Ci0KLSAgICBlMCA9IG1pbnk7Ci0KLSAgICBpZiAoIHkxIDwgbWlueSApCi0gICAgICBlID0gbWlueTsKLSAgICBlbHNlCi0gICAgewotICAgICAgZSAgPSBDRUlMSU5HKCB5MSApOwotICAgICAgZjEgPSAoU2hvcnQpKCBGUkFDKCB5MSApICk7Ci0gICAgICBlMCA9IGU7Ci0KLSAgICAgIGlmICggZjEgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggcmFzLmpvaW50ICkKLSAgICAgICAgewotICAgICAgICAgIHRvcC0tOwotICAgICAgICAgIHJhcy5qb2ludCA9IEZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgKnRvcCsrID0gYXJjW2RlZ3JlZV0ueDsKLQotICAgICAgICBlICs9IHJhcy5wcmVjaXNpb247Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCByYXMuZnJlc2ggKQotICAgIHsKLSAgICAgIHJhcy5jUHJvZmlsZS0+c3RhcnQgPSBUUlVOQyggZTAgKTsKLSAgICAgIHJhcy5mcmVzaCA9IEZBTFNFOwotICAgIH0KLQotICAgIGlmICggZTIgPCBlICkKLSAgICAgIGdvdG8gRmluOwotCi0gICAgaWYgKCAoIHRvcCArIFRSVU5DKCBlMiAtIGUgKSArIDEgKSA+PSByYXMubWF4QnVmZiApCi0gICAgewotICAgICAgcmFzLnRvcCAgID0gdG9wOwotICAgICAgcmFzLmVycm9yID0gRlRfVEhST1coIE92ZXJmbG93ICk7Ci0gICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICB9Ci0KLSAgICBzdGFydF9hcmMgPSBhcmM7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgIHJhcy5qb2ludCA9IEZBTFNFOwotCi0gICAgICB5MiA9IGFyY1swXS55OwotCi0gICAgICBpZiAoIHkyID4gZSApCi0gICAgICB7Ci0gICAgICAgIHkxID0gYXJjW2RlZ3JlZV0ueTsKLSAgICAgICAgaWYgKCB5MiAtIHkxID49IHJhcy5wcmVjaXNpb25fc3RlcCApCi0gICAgICAgIHsKLSAgICAgICAgICBzcGxpdHRlciggYXJjICk7Ci0gICAgICAgICAgYXJjICs9IGRlZ3JlZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAqdG9wKysgPSBhcmNbZGVncmVlXS54ICsgRk11bERpdiggYXJjWzBdLnggLSBhcmNbZGVncmVlXS54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlIC0geTEsIHkyIC0geTEgKTsKLSAgICAgICAgICBhcmMgLT0gZGVncmVlOwotICAgICAgICAgIGUgICArPSByYXMucHJlY2lzaW9uOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICggeTIgPT0gZSApCi0gICAgICAgIHsKLSAgICAgICAgICByYXMuam9pbnQgID0gVFJVRTsKLSAgICAgICAgICAqdG9wKysgICAgID0gYXJjWzBdLng7Ci0KLSAgICAgICAgICBlICs9IHJhcy5wcmVjaXNpb247Ci0gICAgICAgIH0KLSAgICAgICAgYXJjIC09IGRlZ3JlZTsKLSAgICAgIH0KLSAgICB9IHdoaWxlICggYXJjID49IHN0YXJ0X2FyYyAmJiBlIDw9IGUyICk7Ci0KLSAgRmluOgotICAgIHJhcy50b3AgID0gdG9wOwotICAgIHJhcy5hcmMgLT0gZGVncmVlOwotICAgIHJldHVybiBTVUNDRVNTOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBCZXppZXJfRG93biAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlIHRoZSB4LWNvb3JkaW5hdGVzIG9mIGFuIGRlc2NlbmRpbmcgQmV6aWVyIGFyYyBhbmQgc3RvcmUgICAgKi8KLSAgLyogICAgdGhlbSBpbiB0aGUgcmVuZGVyIHBvb2wuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVncmVlICAgOjogVGhlIGRlZ3JlZSBvZiB0aGUgQmV6aWVyIGFyYyAoZWl0aGVyIDIgb3IgMykuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzcGxpdHRlciA6OiBUaGUgZnVuY3Rpb24gdG8gc3BsaXQgQmV6aWVyIGFyY3MuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1pbnkgICAgIDo6IEEgbG93ZXIgdmVydGljYWwgY2xpcHBpbmcgYm91bmQgdmFsdWUuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4eSAgICAgOjogQW4gdXBwZXIgdmVydGljYWwgY2xpcHBpbmcgYm91bmQgdmFsdWUuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU1VDQ0VTUyBvbiBzdWNjZXNzLCBGQUlMVVJFIG9uIHJlbmRlciBwb29sIG92ZXJmbG93LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgQm9vbAotICBCZXppZXJfRG93biggUkFTX0FSR1MgSW50ICAgICAgICBkZWdyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBUU3BsaXR0ZXIgIHNwbGl0dGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgTG9uZyAgICAgICBtaW55LAotICAgICAgICAgICAgICAgICAgICAgICAgTG9uZyAgICAgICBtYXh5ICkKLSAgewotICAgIFRQb2ludCogIGFyYyA9IHJhcy5hcmM7Ci0gICAgQm9vbCAgICAgcmVzdWx0LCBmcmVzaDsKLQotCi0gICAgYXJjWzBdLnkgPSAtYXJjWzBdLnk7Ci0gICAgYXJjWzFdLnkgPSAtYXJjWzFdLnk7Ci0gICAgYXJjWzJdLnkgPSAtYXJjWzJdLnk7Ci0gICAgaWYgKCBkZWdyZWUgPiAyICkKLSAgICAgIGFyY1szXS55ID0gLWFyY1szXS55OwotCi0gICAgZnJlc2ggPSByYXMuZnJlc2g7Ci0KLSAgICByZXN1bHQgPSBCZXppZXJfVXAoIFJBU19WQVJTIGRlZ3JlZSwgc3BsaXR0ZXIsIC1tYXh5LCAtbWlueSApOwotCi0gICAgaWYgKCBmcmVzaCAmJiAhcmFzLmZyZXNoICkKLSAgICAgIHJhcy5jUHJvZmlsZS0+c3RhcnQgPSAtcmFzLmNQcm9maWxlLT5zdGFydDsKLQotICAgIGFyY1swXS55ID0gLWFyY1swXS55OwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExpbmVfVG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluamVjdCBhIG5ldyBsaW5lIHNlZ21lbnQgYW5kIGFkanVzdCB0aGUgUHJvZmlsZXMgbGlzdC4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeCA6OiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3MgZW5kIHBvaW50IChpdHMgc3RhcnQgcG9pbnQgICAqLwotICAvKiAgICAgICAgaXMgc3RvcmVkIGluIGBsYXN0WCcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeSA6OiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBzZWdtZW50J3MgZW5kIHBvaW50IChpdHMgc3RhcnQgcG9pbnQgICAqLwotICAvKiAgICAgICAgaXMgc3RvcmVkIGluIGBsYXN0WScpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFNVQ0NFU1Mgb24gc3VjY2VzcywgRkFJTFVSRSBvbiByZW5kZXIgcG9vbCBvdmVyZmxvdyBvciBpbmNvcnJlY3QgICAgKi8KLSAgLyogICBwcm9maWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgQm9vbAotICBMaW5lX1RvKCBSQVNfQVJHUyBMb25nICB4LAotICAgICAgICAgICAgICAgICAgICBMb25nICB5ICkKLSAgewotICAgIC8qIEZpcnN0LCBkZXRlY3QgYSBjaGFuZ2Ugb2YgZGlyZWN0aW9uICovCi0KLSAgICBzd2l0Y2ggKCByYXMuc3RhdGUgKQotICAgIHsKLSAgICBjYXNlIFVua25vd25fU3RhdGU6Ci0gICAgICBpZiAoIHkgPiByYXMubGFzdFkgKQotICAgICAgewotICAgICAgICBpZiAoIE5ld19Qcm9maWxlKCBSQVNfVkFSUyBBc2NlbmRpbmdfU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTX0JPVFRPTV9PVkVSU0hPT1QoIHJhcy5sYXN0WSApICkgKQotICAgICAgICAgIHJldHVybiBGQUlMVVJFOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIHkgPCByYXMubGFzdFkgKQotICAgICAgICAgIGlmICggTmV3X1Byb2ZpbGUoIFJBU19WQVJTIERlc2NlbmRpbmdfU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfVE9QX09WRVJTSE9PVCggcmFzLmxhc3RZICkgKSApCi0gICAgICAgICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBc2NlbmRpbmdfU3RhdGU6Ci0gICAgICBpZiAoIHkgPCByYXMubGFzdFkgKQotICAgICAgewotICAgICAgICBpZiAoIEVuZF9Qcm9maWxlKCBSQVNfVkFSUyBJU19UT1BfT1ZFUlNIT09UKCByYXMubGFzdFkgKSApIHx8Ci0gICAgICAgICAgICAgTmV3X1Byb2ZpbGUoIFJBU19WQVJTIERlc2NlbmRpbmdfU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTX1RPUF9PVkVSU0hPT1QoIHJhcy5sYXN0WSApICkgKQotICAgICAgICAgIHJldHVybiBGQUlMVVJFOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERlc2NlbmRpbmdfU3RhdGU6Ci0gICAgICBpZiAoIHkgPiByYXMubGFzdFkgKQotICAgICAgewotICAgICAgICBpZiAoIEVuZF9Qcm9maWxlKCBSQVNfVkFSUyBJU19CT1RUT01fT1ZFUlNIT09UKCByYXMubGFzdFkgKSApIHx8Ci0gICAgICAgICAgICAgTmV3X1Byb2ZpbGUoIFJBU19WQVJTIEFzY2VuZGluZ19TdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNfQk9UVE9NX09WRVJTSE9PVCggcmFzLmxhc3RZICkgKSApCi0gICAgICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICA7Ci0gICAgfQotCi0gICAgLyogVGhlbiBjb21wdXRlIHRoZSBsaW5lcyAqLwotCi0gICAgc3dpdGNoICggcmFzLnN0YXRlICkKLSAgICB7Ci0gICAgY2FzZSBBc2NlbmRpbmdfU3RhdGU6Ci0gICAgICBpZiAoIExpbmVfVXAoIFJBU19WQVJTIHJhcy5sYXN0WCwgcmFzLmxhc3RZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5LCByYXMubWluWSwgcmFzLm1heFkgKSApCi0gICAgICAgIHJldHVybiBGQUlMVVJFOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERlc2NlbmRpbmdfU3RhdGU6Ci0gICAgICBpZiAoIExpbmVfRG93biggUkFTX1ZBUlMgcmFzLmxhc3RYLCByYXMubGFzdFksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgeSwgcmFzLm1pblksIHJhcy5tYXhZICkgKQotICAgICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIDsKLSAgICB9Ci0KLSAgICByYXMubGFzdFggPSB4OwotICAgIHJhcy5sYXN0WSA9IHk7Ci0KLSAgICByZXR1cm4gU1VDQ0VTUzsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29uaWNfVG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5qZWN0IGEgbmV3IGNvbmljIGFyYyBhbmQgYWRqdXN0IHRoZSBwcm9maWxlIGxpc3QuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBjeCA6OiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBhcmMncyBuZXcgY29udHJvbCBwb2ludC4gICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGN5IDo6IFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGFyYydzIG5ldyBjb250cm9sIHBvaW50LiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeCAgOjogVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgYXJjJ3MgZW5kIHBvaW50IChpdHMgc3RhcnQgcG9pbnQgaXMgICAqLwotICAvKiAgICAgICAgIHN0b3JlZCBpbiBgbGFzdFgnKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeSAgOjogVGhlIHktY29vcmRpbmF0ZSBvZiB0aGUgYXJjJ3MgZW5kIHBvaW50IChpdHMgc3RhcnQgcG9pbnQgaXMgICAqLwotICAvKiAgICAgICAgIHN0b3JlZCBpbiBgbGFzdFknKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFNVQ0NFU1Mgb24gc3VjY2VzcywgRkFJTFVSRSBvbiByZW5kZXIgcG9vbCBvdmVyZmxvdyBvciBpbmNvcnJlY3QgICAgKi8KLSAgLyogICBwcm9maWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgQm9vbAotICBDb25pY19UbyggUkFTX0FSR1MgTG9uZyAgY3gsCi0gICAgICAgICAgICAgICAgICAgICBMb25nICBjeSwKLSAgICAgICAgICAgICAgICAgICAgIExvbmcgIHgsCi0gICAgICAgICAgICAgICAgICAgICBMb25nICB5ICkKLSAgewotICAgIExvbmcgICAgIHkxLCB5MiwgeTMsIHgzLCB5bWluLCB5bWF4OwotICAgIFRTdGF0ZXMgIHN0YXRlX2JlejsKLQotCi0gICAgcmFzLmFyYyAgICAgID0gcmFzLmFyY3M7Ci0gICAgcmFzLmFyY1syXS54ID0gcmFzLmxhc3RYOwotICAgIHJhcy5hcmNbMl0ueSA9IHJhcy5sYXN0WTsKLSAgICByYXMuYXJjWzFdLnggPSBjeDsKLSAgICByYXMuYXJjWzFdLnkgPSBjeTsKLSAgICByYXMuYXJjWzBdLnggPSB4OwotICAgIHJhcy5hcmNbMF0ueSA9IHk7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgIHkxID0gcmFzLmFyY1syXS55OwotICAgICAgeTIgPSByYXMuYXJjWzFdLnk7Ci0gICAgICB5MyA9IHJhcy5hcmNbMF0ueTsKLSAgICAgIHgzID0gcmFzLmFyY1swXS54OwotCi0gICAgICAvKiBmaXJzdCwgY2F0ZWdvcml6ZSB0aGUgQmV6aWVyIGFyYyAqLwotCi0gICAgICBpZiAoIHkxIDw9IHkzICkKLSAgICAgIHsKLSAgICAgICAgeW1pbiA9IHkxOwotICAgICAgICB5bWF4ID0geTM7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHltaW4gPSB5MzsKLSAgICAgICAgeW1heCA9IHkxOwotICAgICAgfQotCi0gICAgICBpZiAoIHkyIDwgeW1pbiB8fCB5MiA+IHltYXggKQotICAgICAgewotICAgICAgICAvKiB0aGlzIGFyYyBoYXMgbm8gZ2l2ZW4gZGlyZWN0aW9uLCBzcGxpdCBpdCEgKi8KLSAgICAgICAgU3BsaXRfQ29uaWMoIHJhcy5hcmMgKTsKLSAgICAgICAgcmFzLmFyYyArPSAyOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHkxID09IHkzICkKLSAgICAgIHsKLSAgICAgICAgLyogdGhpcyBhcmMgaXMgZmxhdCwgaWdub3JlIGl0IGFuZCBwb3AgaXQgZnJvbSB0aGUgQmV6aWVyIHN0YWNrICovCi0gICAgICAgIHJhcy5hcmMgLT0gMjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogdGhlIGFyYyBpcyB5LW1vbm90b25vdXMsIGVpdGhlciBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZyAqLwotICAgICAgICAvKiBkZXRlY3QgYSBjaGFuZ2Ugb2YgZGlyZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHN0YXRlX2JleiA9IHkxIDwgeTMgPyBBc2NlbmRpbmdfU3RhdGUgOiBEZXNjZW5kaW5nX1N0YXRlOwotICAgICAgICBpZiAoIHJhcy5zdGF0ZSAhPSBzdGF0ZV9iZXogKQotICAgICAgICB7Ci0gICAgICAgICAgQm9vbCAgbyA9IHN0YXRlX2JleiA9PSBBc2NlbmRpbmdfU3RhdGUgPyBJU19CT1RUT01fT1ZFUlNIT09UKCB5MSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBJU19UT1BfT1ZFUlNIT09UKCB5MSApOwotCi0KLSAgICAgICAgICAvKiBmaW5hbGl6ZSBjdXJyZW50IHByb2ZpbGUgaWYgYW55ICovCi0gICAgICAgICAgaWYgKCByYXMuc3RhdGUgIT0gVW5rbm93bl9TdGF0ZSAmJgotICAgICAgICAgICAgICAgRW5kX1Byb2ZpbGUoIFJBU19WQVJTIG8gKSAgKQotICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgLyogY3JlYXRlIGEgbmV3IHByb2ZpbGUgKi8KLSAgICAgICAgICBpZiAoIE5ld19Qcm9maWxlKCBSQVNfVkFSUyBzdGF0ZV9iZXosIG8gKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBub3cgY2FsbCB0aGUgYXBwcm9wcmlhdGUgcm91dGluZSAqLwotICAgICAgICBpZiAoIHN0YXRlX2JleiA9PSBBc2NlbmRpbmdfU3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBCZXppZXJfVXAoIFJBU19WQVJTIDIsIFNwbGl0X0NvbmljLCByYXMubWluWSwgcmFzLm1heFkgKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGlmICggQmV6aWVyX0Rvd24oIFJBU19WQVJTIDIsIFNwbGl0X0NvbmljLCByYXMubWluWSwgcmFzLm1heFkgKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0KLSAgICB9IHdoaWxlICggcmFzLmFyYyA+PSByYXMuYXJjcyApOwotCi0gICAgcmFzLmxhc3RYID0geDM7Ci0gICAgcmFzLmxhc3RZID0geTM7Ci0KLSAgICByZXR1cm4gU1VDQ0VTUzsKLQotICBGYWlsOgotICAgIHJldHVybiBGQUlMVVJFOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDdWJpY19UbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbmplY3QgYSBuZXcgY3ViaWMgYXJjIGFuZCBhZGp1c3QgdGhlIHByb2ZpbGUgbGlzdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGN4MSA6OiBUaGUgeC1jb29yZGluYXRlIG9mIHRoZSBhcmMncyBmaXJzdCBuZXcgY29udHJvbCBwb2ludC4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgY3kxIDo6IFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGFyYydzIGZpcnN0IG5ldyBjb250cm9sIHBvaW50LiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBjeDIgOjogVGhlIHgtY29vcmRpbmF0ZSBvZiB0aGUgYXJjJ3Mgc2Vjb25kIG5ldyBjb250cm9sIHBvaW50LiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGN5MiA6OiBUaGUgeS1jb29yZGluYXRlIG9mIHRoZSBhcmMncyBzZWNvbmQgbmV3IGNvbnRyb2wgcG9pbnQuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeCAgIDo6IFRoZSB4LWNvb3JkaW5hdGUgb2YgdGhlIGFyYydzIGVuZCBwb2ludCAoaXRzIHN0YXJ0IHBvaW50IGlzICAqLwotICAvKiAgICAgICAgICBzdG9yZWQgaW4gYGxhc3RYJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgeSAgIDo6IFRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIGFyYydzIGVuZCBwb2ludCAoaXRzIHN0YXJ0IHBvaW50IGlzICAqLwotICAvKiAgICAgICAgICBzdG9yZWQgaW4gYGxhc3RZJykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFNVQ0NFU1Mgb24gc3VjY2VzcywgRkFJTFVSRSBvbiByZW5kZXIgcG9vbCBvdmVyZmxvdyBvciBpbmNvcnJlY3QgICAgKi8KLSAgLyogICBwcm9maWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgQm9vbAotICBDdWJpY19UbyggUkFTX0FSR1MgTG9uZyAgY3gxLAotICAgICAgICAgICAgICAgICAgICAgTG9uZyAgY3kxLAotICAgICAgICAgICAgICAgICAgICAgTG9uZyAgY3gyLAotICAgICAgICAgICAgICAgICAgICAgTG9uZyAgY3kyLAotICAgICAgICAgICAgICAgICAgICAgTG9uZyAgeCwKLSAgICAgICAgICAgICAgICAgICAgIExvbmcgIHkgKQotICB7Ci0gICAgTG9uZyAgICAgeTEsIHkyLCB5MywgeTQsIHg0LCB5bWluMSwgeW1heDEsIHltaW4yLCB5bWF4MjsKLSAgICBUU3RhdGVzICBzdGF0ZV9iZXo7Ci0KLQotICAgIHJhcy5hcmMgICAgICA9IHJhcy5hcmNzOwotICAgIHJhcy5hcmNbM10ueCA9IHJhcy5sYXN0WDsKLSAgICByYXMuYXJjWzNdLnkgPSByYXMubGFzdFk7Ci0gICAgcmFzLmFyY1syXS54ID0gY3gxOwotICAgIHJhcy5hcmNbMl0ueSA9IGN5MTsKLSAgICByYXMuYXJjWzFdLnggPSBjeDI7Ci0gICAgcmFzLmFyY1sxXS55ID0gY3kyOwotICAgIHJhcy5hcmNbMF0ueCA9IHg7Ci0gICAgcmFzLmFyY1swXS55ID0geTsKLQotICAgIGRvCi0gICAgewotICAgICAgeTEgPSByYXMuYXJjWzNdLnk7Ci0gICAgICB5MiA9IHJhcy5hcmNbMl0ueTsKLSAgICAgIHkzID0gcmFzLmFyY1sxXS55OwotICAgICAgeTQgPSByYXMuYXJjWzBdLnk7Ci0gICAgICB4NCA9IHJhcy5hcmNbMF0ueDsKLQotICAgICAgLyogZmlyc3QsIGNhdGVnb3JpemUgdGhlIEJlemllciBhcmMgKi8KLQotICAgICAgaWYgKCB5MSA8PSB5NCApCi0gICAgICB7Ci0gICAgICAgIHltaW4xID0geTE7Ci0gICAgICAgIHltYXgxID0geTQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHltaW4xID0geTQ7Ci0gICAgICAgIHltYXgxID0geTE7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggeTIgPD0geTMgKQotICAgICAgewotICAgICAgICB5bWluMiA9IHkyOwotICAgICAgICB5bWF4MiA9IHkzOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB5bWluMiA9IHkzOwotICAgICAgICB5bWF4MiA9IHkyOwotICAgICAgfQotCi0gICAgICBpZiAoIHltaW4yIDwgeW1pbjEgfHwgeW1heDIgPiB5bWF4MSApCi0gICAgICB7Ci0gICAgICAgIC8qIHRoaXMgYXJjIGhhcyBubyBnaXZlbiBkaXJlY3Rpb24sIHNwbGl0IGl0ISAqLwotICAgICAgICBTcGxpdF9DdWJpYyggcmFzLmFyYyApOwotICAgICAgICByYXMuYXJjICs9IDM7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggeTEgPT0geTQgKQotICAgICAgewotICAgICAgICAvKiB0aGlzIGFyYyBpcyBmbGF0LCBpZ25vcmUgaXQgYW5kIHBvcCBpdCBmcm9tIHRoZSBCZXppZXIgc3RhY2sgKi8KLSAgICAgICAgcmFzLmFyYyAtPSAzOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzdGF0ZV9iZXogPSAoIHkxIDw9IHk0ICkgPyBBc2NlbmRpbmdfU3RhdGUgOiBEZXNjZW5kaW5nX1N0YXRlOwotCi0gICAgICAgIC8qIGRldGVjdCBhIGNoYW5nZSBvZiBkaXJlY3Rpb24gKi8KLSAgICAgICAgaWYgKCByYXMuc3RhdGUgIT0gc3RhdGVfYmV6ICkKLSAgICAgICAgewotICAgICAgICAgIEJvb2wgIG8gPSBzdGF0ZV9iZXogPT0gQXNjZW5kaW5nX1N0YXRlID8gSVNfQk9UVE9NX09WRVJTSE9PVCggeTEgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogSVNfVE9QX09WRVJTSE9PVCggeTEgKTsKLQotCi0gICAgICAgICAgLyogZmluYWxpemUgY3VycmVudCBwcm9maWxlIGlmIGFueSAqLwotICAgICAgICAgIGlmICggcmFzLnN0YXRlICE9IFVua25vd25fU3RhdGUgJiYKLSAgICAgICAgICAgICAgIEVuZF9Qcm9maWxlKCBSQVNfVkFSUyBvICkgICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICAgIGlmICggTmV3X1Byb2ZpbGUoIFJBU19WQVJTIHN0YXRlX2JleiwgbyApICkKLSAgICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNvbXB1dGUgaW50ZXJzZWN0aW9ucyAqLwotICAgICAgICBpZiAoIHN0YXRlX2JleiA9PSBBc2NlbmRpbmdfU3RhdGUgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBCZXppZXJfVXAoIFJBU19WQVJTIDMsIFNwbGl0X0N1YmljLCByYXMubWluWSwgcmFzLm1heFkgKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGlmICggQmV6aWVyX0Rvd24oIFJBU19WQVJTIDMsIFNwbGl0X0N1YmljLCByYXMubWluWSwgcmFzLm1heFkgKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0KLSAgICB9IHdoaWxlICggcmFzLmFyYyA+PSByYXMuYXJjcyApOwotCi0gICAgcmFzLmxhc3RYID0geDQ7Ci0gICAgcmFzLmxhc3RZID0geTQ7Ci0KLSAgICByZXR1cm4gU1VDQ0VTUzsKLQotICBGYWlsOgotICAgIHJldHVybiBGQUlMVVJFOwotICB9Ci0KLQotI3VuZGVmICBTV0FQXwotI2RlZmluZSBTV0FQXyggeCwgeSApICBkbyAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMb25nICBzd2FwID0geDsgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICB4ID0geTsgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBzd2FwOyAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKCAwICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlY29tcG9zZV9DdXJ2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNjYW4gdGhlIG91dGxpbmUgYXJyYXlzIGluIG9yZGVyIHRvIGVtaXQgaW5kaXZpZHVhbCBzZWdtZW50cyBhbmQgICAqLwotICAvKiAgICBCZXppZXJzIGJ5IGNhbGxpbmcgTGluZV9UbygpIGFuZCBCZXppZXJfVG8oKS4gIEl0IGhhbmRsZXMgYWxsICAgICAgKi8KLSAgLyogICAgd2VpcmQgY2FzZXMsIGxpa2Ugd2hlbiB0aGUgZmlyc3QgcG9pbnQgaXMgb2ZmIHRoZSBjdXJ2ZSwgb3Igd2hlbiAgICovCi0gIC8qICAgIHRoZXJlIGFyZSBzaW1wbHkgbm8gYG9uJyBwb2ludHMgaW4gdGhlIGNvbnRvdXIhICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZpcnN0ICAgOjogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBwb2ludCBpbiB0aGUgY29udG91ci4gICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbGFzdCAgICA6OiBUaGUgaW5kZXggb2YgdGhlIGxhc3QgcG9pbnQgaW4gdGhlIGNvbnRvdXIuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmbGlwcGVkIDo6IElmIHNldCwgZmxpcCB0aGUgZGlyZWN0aW9uIG9mIHRoZSBjdXJ2ZS4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTVUNDRVNTIG9uIHN1Y2Nlc3MsIEZBSUxVUkUgb24gZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBCb29sCi0gIERlY29tcG9zZV9DdXJ2ZSggUkFTX0FSR1MgVVNob3J0ICBmaXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU2hvcnQgIGxhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ICAgICBmbGlwcGVkICkKLSAgewotICAgIEZUX1ZlY3RvciAgIHZfbGFzdDsKLSAgICBGVF9WZWN0b3IgICB2X2NvbnRyb2w7Ci0gICAgRlRfVmVjdG9yICAgdl9zdGFydDsKLQotICAgIEZUX1ZlY3RvciogIHBvaW50czsKLSAgICBGVF9WZWN0b3IqICBwb2ludDsKLSAgICBGVF9WZWN0b3IqICBsaW1pdDsKLSAgICBjaGFyKiAgICAgICB0YWdzOwotCi0gICAgVUludCAgICAgICAgdGFnOyAgICAgICAvKiBjdXJyZW50IHBvaW50J3Mgc3RhdGUgICAgICAgICAgICovCi0KLQotICAgIHBvaW50cyA9IHJhcy5vdXRsaW5lLnBvaW50czsKLSAgICBsaW1pdCAgPSBwb2ludHMgKyBsYXN0OwotCi0gICAgdl9zdGFydC54ID0gU0NBTEVEKCBwb2ludHNbZmlyc3RdLnggKTsKLSAgICB2X3N0YXJ0LnkgPSBTQ0FMRUQoIHBvaW50c1tmaXJzdF0ueSApOwotICAgIHZfbGFzdC54ICA9IFNDQUxFRCggcG9pbnRzW2xhc3RdLnggKTsKLSAgICB2X2xhc3QueSAgPSBTQ0FMRUQoIHBvaW50c1tsYXN0XS55ICk7Ci0KLSAgICBpZiAoIGZsaXBwZWQgKQotICAgIHsKLSAgICAgIFNXQVBfKCB2X3N0YXJ0LngsIHZfc3RhcnQueSApOwotICAgICAgU1dBUF8oIHZfbGFzdC54LCB2X2xhc3QueSApOwotICAgIH0KLQotICAgIHZfY29udHJvbCA9IHZfc3RhcnQ7Ci0KLSAgICBwb2ludCA9IHBvaW50cyArIGZpcnN0OwotICAgIHRhZ3MgID0gcmFzLm91dGxpbmUudGFncyArIGZpcnN0OwotCi0gICAgLyogc2V0IHNjYW4gbW9kZSBpZiBuZWNlc3NhcnkgKi8KLSAgICBpZiAoIHRhZ3NbMF0gJiBGVF9DVVJWRV9UQUdfSEFTX1NDQU5NT0RFICkKLSAgICAgIHJhcy5kcm9wT3V0Q29udHJvbCA9IChCeXRlKXRhZ3NbMF0gPj4gNTsKLQotICAgIHRhZyA9IEZUX0NVUlZFX1RBRyggdGFnc1swXSApOwotCi0gICAgLyogQSBjb250b3VyIGNhbm5vdCBzdGFydCB3aXRoIGEgY3ViaWMgY29udHJvbCBwb2ludCEgKi8KLSAgICBpZiAoIHRhZyA9PSBGVF9DVVJWRV9UQUdfQ1VCSUMgKQotICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAvKiBjaGVjayBmaXJzdCBwb2ludCB0byBkZXRlcm1pbmUgb3JpZ2luICovCi0gICAgaWYgKCB0YWcgPT0gRlRfQ1VSVkVfVEFHX0NPTklDICkKLSAgICB7Ci0gICAgICAvKiBmaXJzdCBwb2ludCBpcyBjb25pYyBjb250cm9sLiAgWWVzLCB0aGlzIGhhcHBlbnMuICovCi0gICAgICBpZiAoIEZUX0NVUlZFX1RBRyggcmFzLm91dGxpbmUudGFnc1tsYXN0XSApID09IEZUX0NVUlZFX1RBR19PTiApCi0gICAgICB7Ci0gICAgICAgIC8qIHN0YXJ0IGF0IGxhc3QgcG9pbnQgaWYgaXQgaXMgb24gdGhlIGN1cnZlICovCi0gICAgICAgIHZfc3RhcnQgPSB2X2xhc3Q7Ci0gICAgICAgIGxpbWl0LS07Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGlmIGJvdGggZmlyc3QgYW5kIGxhc3QgcG9pbnRzIGFyZSBjb25pYywgICAgICAgICAqLwotICAgICAgICAvKiBzdGFydCBhdCB0aGVpciBtaWRkbGUgYW5kIHJlY29yZCBpdHMgcG9zaXRpb24gICAgKi8KLSAgICAgICAgLyogZm9yIGNsb3N1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHZfc3RhcnQueCA9ICggdl9zdGFydC54ICsgdl9sYXN0LnggKSAvIDI7Ci0gICAgICAgIHZfc3RhcnQueSA9ICggdl9zdGFydC55ICsgdl9sYXN0LnkgKSAvIDI7Ci0KLSAgICAgLyogdl9sYXN0ID0gdl9zdGFydDsgKi8KLSAgICAgIH0KLSAgICAgIHBvaW50LS07Ci0gICAgICB0YWdzLS07Ci0gICAgfQotCi0gICAgcmFzLmxhc3RYID0gdl9zdGFydC54OwotICAgIHJhcy5sYXN0WSA9IHZfc3RhcnQueTsKLQotICAgIHdoaWxlICggcG9pbnQgPCBsaW1pdCApCi0gICAgewotICAgICAgcG9pbnQrKzsKLSAgICAgIHRhZ3MrKzsKLQotICAgICAgdGFnID0gRlRfQ1VSVkVfVEFHKCB0YWdzWzBdICk7Ci0KLSAgICAgIHN3aXRjaCAoIHRhZyApCi0gICAgICB7Ci0gICAgICBjYXNlIEZUX0NVUlZFX1RBR19PTjogIC8qIGVtaXQgYSBzaW5nbGUgbGluZV90byAqLwotICAgICAgICB7Ci0gICAgICAgICAgTG9uZyAgeCwgeTsKLQotCi0gICAgICAgICAgeCA9IFNDQUxFRCggcG9pbnQtPnggKTsKLSAgICAgICAgICB5ID0gU0NBTEVEKCBwb2ludC0+eSApOwotICAgICAgICAgIGlmICggZmxpcHBlZCApCi0gICAgICAgICAgICBTV0FQXyggeCwgeSApOwotCi0gICAgICAgICAgaWYgKCBMaW5lX1RvKCBSQVNfVkFSUyB4LCB5ICkgKQotICAgICAgICAgICAgZ290byBGYWlsOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgIGNhc2UgRlRfQ1VSVkVfVEFHX0NPTklDOiAgLyogY29uc3VtZSBjb25pYyBhcmNzICovCi0gICAgICAgIHZfY29udHJvbC54ID0gU0NBTEVEKCBwb2ludFswXS54ICk7Ci0gICAgICAgIHZfY29udHJvbC55ID0gU0NBTEVEKCBwb2ludFswXS55ICk7Ci0KLSAgICAgICAgaWYgKCBmbGlwcGVkICkKLSAgICAgICAgICBTV0FQXyggdl9jb250cm9sLngsIHZfY29udHJvbC55ICk7Ci0KLSAgICAgIERvX0NvbmljOgotICAgICAgICBpZiAoIHBvaW50IDwgbGltaXQgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVmVjdG9yICB2X21pZGRsZTsKLSAgICAgICAgICBMb25nICAgICAgIHgsIHk7Ci0KLQotICAgICAgICAgIHBvaW50Kys7Ci0gICAgICAgICAgdGFncysrOwotICAgICAgICAgIHRhZyA9IEZUX0NVUlZFX1RBRyggdGFnc1swXSApOwotCi0gICAgICAgICAgeCA9IFNDQUxFRCggcG9pbnRbMF0ueCApOwotICAgICAgICAgIHkgPSBTQ0FMRUQoIHBvaW50WzBdLnkgKTsKLQotICAgICAgICAgIGlmICggZmxpcHBlZCApCi0gICAgICAgICAgICBTV0FQXyggeCwgeSApOwotCi0gICAgICAgICAgaWYgKCB0YWcgPT0gRlRfQ1VSVkVfVEFHX09OICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIENvbmljX1RvKCBSQVNfVkFSUyB2X2NvbnRyb2wueCwgdl9jb250cm9sLnksIHgsIHkgKSApCi0gICAgICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggdGFnICE9IEZUX0NVUlZFX1RBR19DT05JQyApCi0gICAgICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgICAgICAgIHZfbWlkZGxlLnggPSAoIHZfY29udHJvbC54ICsgeCApIC8gMjsKLSAgICAgICAgICB2X21pZGRsZS55ID0gKCB2X2NvbnRyb2wueSArIHkgKSAvIDI7Ci0KLSAgICAgICAgICBpZiAoIENvbmljX1RvKCBSQVNfVkFSUyB2X2NvbnRyb2wueCwgdl9jb250cm9sLnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9taWRkbGUueCwgIHZfbWlkZGxlLnkgKSApCi0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgICB2X2NvbnRyb2wueCA9IHg7Ci0gICAgICAgICAgdl9jb250cm9sLnkgPSB5OwotCi0gICAgICAgICAgZ290byBEb19Db25pYzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggQ29uaWNfVG8oIFJBU19WQVJTIHZfY29udHJvbC54LCB2X2NvbnRyb2wueSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdl9zdGFydC54LCAgIHZfc3RhcnQueSApICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgZ290byBDbG9zZTsKLQotICAgICAgZGVmYXVsdDogIC8qIEZUX0NVUlZFX1RBR19DVUJJQyAqLwotICAgICAgICB7Ci0gICAgICAgICAgTG9uZyAgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MzsKLQotCi0gICAgICAgICAgaWYgKCBwb2ludCArIDEgPiBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgIEZUX0NVUlZFX1RBRyggdGFnc1sxXSApICE9IEZUX0NVUlZFX1RBR19DVUJJQyApCi0gICAgICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgICAgICAgIHBvaW50ICs9IDI7Ci0gICAgICAgICAgdGFncyAgKz0gMjsKLQotICAgICAgICAgIHgxID0gU0NBTEVEKCBwb2ludFstMl0ueCApOwotICAgICAgICAgIHkxID0gU0NBTEVEKCBwb2ludFstMl0ueSApOwotICAgICAgICAgIHgyID0gU0NBTEVEKCBwb2ludFstMV0ueCApOwotICAgICAgICAgIHkyID0gU0NBTEVEKCBwb2ludFstMV0ueSApOwotCi0gICAgICAgICAgaWYgKCBmbGlwcGVkICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBTV0FQXyggeDEsIHkxICk7Ci0gICAgICAgICAgICBTV0FQXyggeDIsIHkyICk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCBwb2ludCA8PSBsaW1pdCApCi0gICAgICAgICAgewotICAgICAgICAgICAgeDMgPSBTQ0FMRUQoIHBvaW50WzBdLnggKTsKLSAgICAgICAgICAgIHkzID0gU0NBTEVEKCBwb2ludFswXS55ICk7Ci0KLSAgICAgICAgICAgIGlmICggZmxpcHBlZCApCi0gICAgICAgICAgICAgIFNXQVBfKCB4MywgeTMgKTsKLQotICAgICAgICAgICAgaWYgKCBDdWJpY19UbyggUkFTX1ZBUlMgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MyApICkKLSAgICAgICAgICAgICAgZ290byBGYWlsOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCBDdWJpY19UbyggUkFTX1ZBUlMgeDEsIHkxLCB4MiwgeTIsIHZfc3RhcnQueCwgdl9zdGFydC55ICkgKQotICAgICAgICAgICAgZ290byBGYWlsOwotICAgICAgICAgIGdvdG8gQ2xvc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBjbG9zZSB0aGUgY29udG91ciB3aXRoIGEgbGluZSBzZWdtZW50ICovCi0gICAgaWYgKCBMaW5lX1RvKCBSQVNfVkFSUyB2X3N0YXJ0LngsIHZfc3RhcnQueSApICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICBDbG9zZToKLSAgICByZXR1cm4gU1VDQ0VTUzsKLQotICBJbnZhbGlkX091dGxpbmU6Ci0gICAgcmFzLmVycm9yID0gRlRfVEhST1coIEludmFsaWQgKTsKLQotICBGYWlsOgotICAgIHJldHVybiBGQUlMVVJFOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb252ZXJ0X0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb252ZXJ0IGEgZ2x5cGggaW50byBhIHNlcmllcyBvZiBzZWdtZW50cyBhbmQgYXJjcyBhbmQgbWFrZSBhICAgICAgKi8KLSAgLyogICAgcHJvZmlsZXMgbGlzdCB3aXRoIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmxpcHBlZCA6OiBJZiBzZXQsIGZsaXAgdGhlIGRpcmVjdGlvbiBvZiBjdXJ2ZS4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU1VDQ0VTUyBvbiBzdWNjZXNzLCBGQUlMVVJFIGlmIGFueSBlcnJvciB3YXMgZW5jb3VudGVyZWQgZHVyaW5nICAgICovCi0gIC8qICAgIHJlbmRlcmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEJvb2wKLSAgQ29udmVydF9HbHlwaCggUkFTX0FSR1MgSW50ICBmbGlwcGVkICkKLSAgewotICAgIEludCAgIGk7Ci0gICAgVUludCAgc3RhcnQ7Ci0KLQotICAgIHJhcy5mUHJvZmlsZSA9IE5VTEw7Ci0gICAgcmFzLmpvaW50ICAgID0gRkFMU0U7Ci0gICAgcmFzLmZyZXNoICAgID0gRkFMU0U7Ci0KLSAgICByYXMubWF4QnVmZiAgPSByYXMuc2l6ZUJ1ZmYgLSBBbGlnblByb2ZpbGVTaXplOwotCi0gICAgcmFzLm51bVR1cm5zID0gMDsKLQotICAgIHJhcy5jUHJvZmlsZSAgICAgICAgID0gKFBQcm9maWxlKXJhcy50b3A7Ci0gICAgcmFzLmNQcm9maWxlLT5vZmZzZXQgPSByYXMudG9wOwotICAgIHJhcy5udW1fUHJvZnMgICAgICAgID0gMDsKLQotICAgIHN0YXJ0ID0gMDsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgcmFzLm91dGxpbmUubl9jb250b3VyczsgaSsrICkKLSAgICB7Ci0gICAgICBQUHJvZmlsZSAgbGFzdFByb2ZpbGU7Ci0gICAgICBCb29sICAgICAgbzsKLQotCi0gICAgICByYXMuc3RhdGUgICAgPSBVbmtub3duX1N0YXRlOwotICAgICAgcmFzLmdQcm9maWxlID0gTlVMTDsKLQotICAgICAgaWYgKCBEZWNvbXBvc2VfQ3VydmUoIFJBU19WQVJTIChVU2hvcnQpc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVTaG9ydClyYXMub3V0bGluZS5jb250b3Vyc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGlwcGVkICkgKQotICAgICAgICByZXR1cm4gRkFJTFVSRTsKLQotICAgICAgc3RhcnQgPSAoVVNob3J0KXJhcy5vdXRsaW5lLmNvbnRvdXJzW2ldICsgMTsKLQotICAgICAgLyogd2UgbXVzdCBub3cgY2hlY2sgd2hldGhlciB0aGUgZXh0cmVtZSBhcmNzIGpvaW4gb3Igbm90ICovCi0gICAgICBpZiAoIEZSQUMoIHJhcy5sYXN0WSApID09IDAgJiYKLSAgICAgICAgICAgcmFzLmxhc3RZID49IHJhcy5taW5ZICAmJgotICAgICAgICAgICByYXMubGFzdFkgPD0gcmFzLm1heFkgICkKLSAgICAgICAgaWYgKCByYXMuZ1Byb2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICggcmFzLmdQcm9maWxlLT5mbGFncyAmIEZsb3dfVXAgKSA9PQotICAgICAgICAgICAgICAgKCByYXMuY1Byb2ZpbGUtPmZsYWdzICYgRmxvd19VcCApICkKLSAgICAgICAgICByYXMudG9wLS07Ci0gICAgICAgIC8qIE5vdGUgdGhhdCByYXMuZ1Byb2ZpbGUgY2FuIGJlIG5pbCBpZiB0aGUgY29udG91ciB3YXMgdG9vIHNtYWxsICovCi0gICAgICAgIC8qIHRvIGJlIGRyYXduLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIGxhc3RQcm9maWxlID0gcmFzLmNQcm9maWxlOwotICAgICAgaWYgKCByYXMudG9wICE9IHJhcy5jUHJvZmlsZS0+b2Zmc2V0ICYmCi0gICAgICAgICAgICggcmFzLmNQcm9maWxlLT5mbGFncyAmIEZsb3dfVXAgKSApCi0gICAgICAgIG8gPSBJU19UT1BfT1ZFUlNIT09UKCByYXMubGFzdFkgKTsKLSAgICAgIGVsc2UKLSAgICAgICAgbyA9IElTX0JPVFRPTV9PVkVSU0hPT1QoIHJhcy5sYXN0WSApOwotICAgICAgaWYgKCBFbmRfUHJvZmlsZSggUkFTX1ZBUlMgbyApICkKLSAgICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0KLSAgICAgIC8qIGNsb3NlIHRoZSBgbmV4dCBwcm9maWxlIGluIGNvbnRvdXInIGxpbmtlZCBsaXN0ICovCi0gICAgICBpZiAoIHJhcy5nUHJvZmlsZSApCi0gICAgICAgIGxhc3RQcm9maWxlLT5uZXh0ID0gcmFzLmdQcm9maWxlOwotICAgIH0KLQotICAgIGlmICggRmluYWxpemVfUHJvZmlsZV9UYWJsZSggUkFTX1ZBUiApICkKLSAgICAgIHJldHVybiBGQUlMVVJFOwotCi0gICAgcmV0dXJuIChCb29sKSggcmFzLnRvcCA8IHJhcy5tYXhCdWZmID8gU1VDQ0VTUyA6IEZBSUxVUkUgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KLSAgLyoqICBTQ0FOLUxJTkUgU1dFRVBTIEFORCBEUkFXSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiovCi0gIC8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBJbml0X0xpbmtlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5pdGlhbGl6ZXMgYW4gZW1wdHkgbGlua2VkIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbml0X0xpbmtlZCggVFByb2ZpbGVMaXN0KiAgbCApCi0gIHsKLSAgICAqbCA9IE5VTEw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIEluc05ldyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbnNlcnRzIGEgbmV3IHByb2ZpbGUgaW4gYSBsaW5rZWQgbGlzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc05ldyggUFByb2ZpbGVMaXN0ICBsaXN0LAotICAgICAgICAgIFBQcm9maWxlICAgICAgcHJvZmlsZSApCi0gIHsKLSAgICBQUHJvZmlsZSAgKm9sZCwgY3VycmVudDsKLSAgICBMb25nICAgICAgIHg7Ci0KLQotICAgIG9sZCAgICAgPSBsaXN0OwotICAgIGN1cnJlbnQgPSAqb2xkOwotICAgIHggICAgICAgPSBwcm9maWxlLT5YOwotCi0gICAgd2hpbGUgKCBjdXJyZW50ICkKLSAgICB7Ci0gICAgICBpZiAoIHggPCBjdXJyZW50LT5YICkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBvbGQgICAgID0gJmN1cnJlbnQtPmxpbms7Ci0gICAgICBjdXJyZW50ID0gKm9sZDsKLSAgICB9Ci0KLSAgICBwcm9maWxlLT5saW5rID0gY3VycmVudDsKLSAgICAqb2xkICAgICAgICAgID0gcHJvZmlsZTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgRGVsT2xkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlbW92ZXMgYW4gb2xkIHByb2ZpbGUgZnJvbSBhIGxpbmtlZCBsaXN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgRGVsT2xkKCBQUHJvZmlsZUxpc3QgIGxpc3QsCi0gICAgICAgICAgUFByb2ZpbGUgICAgICBwcm9maWxlICkKLSAgewotICAgIFBQcm9maWxlICAqb2xkLCBjdXJyZW50OwotCi0KLSAgICBvbGQgICAgID0gbGlzdDsKLSAgICBjdXJyZW50ID0gKm9sZDsKLQotICAgIHdoaWxlICggY3VycmVudCApCi0gICAgewotICAgICAgaWYgKCBjdXJyZW50ID09IHByb2ZpbGUgKQotICAgICAgewotICAgICAgICAqb2xkID0gY3VycmVudC0+bGluazsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBvbGQgICAgID0gJmN1cnJlbnQtPmxpbms7Ci0gICAgICBjdXJyZW50ID0gKm9sZDsKLSAgICB9Ci0KLSAgICAvKiB3ZSBzaG91bGQgbmV2ZXIgZ2V0IHRoZXJlLCB1bmxlc3MgdGhlIHByb2ZpbGUgd2FzIG5vdCBwYXJ0IG9mICovCi0gICAgLyogdGhlIGxpc3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBTb3J0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU29ydHMgYSB0cmFjZSBsaXN0LiAgSW4gOTUlLCB0aGUgbGlzdCBpcyBhbHJlYWR5IHNvcnRlZC4gIFdlIG5lZWQgICovCi0gIC8qICAgIGFuIGFsZ29yaXRobSB3aGljaCBpcyBmYXN0IGluIHRoaXMgY2FzZS4gIEJ1YmJsZSBzb3J0IGlzIGVub3VnaCAgICAqLwotICAvKiAgICBhbmQgc2ltcGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIFNvcnQoIFBQcm9maWxlTGlzdCAgbGlzdCApCi0gIHsKLSAgICBQUHJvZmlsZSAgKm9sZCwgY3VycmVudCwgbmV4dDsKLQotCi0gICAgLyogRmlyc3QsIHNldCB0aGUgbmV3IFggY29vcmRpbmF0ZSBvZiBlYWNoIHByb2ZpbGUgKi8KLSAgICBjdXJyZW50ID0gKmxpc3Q7Ci0gICAgd2hpbGUgKCBjdXJyZW50ICkKLSAgICB7Ci0gICAgICBjdXJyZW50LT5YICAgICAgID0gKmN1cnJlbnQtPm9mZnNldDsKLSAgICAgIGN1cnJlbnQtPm9mZnNldCArPSAoIGN1cnJlbnQtPmZsYWdzICYgRmxvd19VcCApID8gMSA6IC0xOwotICAgICAgY3VycmVudC0+aGVpZ2h0LS07Ci0gICAgICBjdXJyZW50ID0gY3VycmVudC0+bGluazsKLSAgICB9Ci0KLSAgICAvKiBUaGVuIHNvcnQgdGhlbSAqLwotICAgIG9sZCAgICAgPSBsaXN0OwotICAgIGN1cnJlbnQgPSAqb2xkOwotCi0gICAgaWYgKCAhY3VycmVudCApCi0gICAgICByZXR1cm47Ci0KLSAgICBuZXh0ID0gY3VycmVudC0+bGluazsKLQotICAgIHdoaWxlICggbmV4dCApCi0gICAgewotICAgICAgaWYgKCBjdXJyZW50LT5YIDw9IG5leHQtPlggKQotICAgICAgewotICAgICAgICBvbGQgICAgID0gJmN1cnJlbnQtPmxpbms7Ci0gICAgICAgIGN1cnJlbnQgPSAqb2xkOwotCi0gICAgICAgIGlmICggIWN1cnJlbnQgKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgKm9sZCAgICAgICAgICA9IG5leHQ7Ci0gICAgICAgIGN1cnJlbnQtPmxpbmsgPSBuZXh0LT5saW5rOwotICAgICAgICBuZXh0LT5saW5rICAgID0gY3VycmVudDsKLQotICAgICAgICBvbGQgICAgID0gbGlzdDsKLSAgICAgICAgY3VycmVudCA9ICpvbGQ7Ci0gICAgICB9Ci0KLSAgICAgIG5leHQgPSBjdXJyZW50LT5saW5rOwotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVmVydGljYWwgU3dlZXAgUHJvY2VkdXJlIFNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBUaGVzZSBmb3VyIHJvdXRpbmVzIGFyZSB1c2VkIGR1cmluZyB0aGUgdmVydGljYWwgYmxhY2svd2hpdGUgc3dlZXAgICAqLwotICAvKiAgcGhhc2UgYnkgdGhlIGdlbmVyaWMgRHJhd19Td2VlcCgpIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyB2b2lkCi0gIFZlcnRpY2FsX1N3ZWVwX0luaXQoIFJBU19BUkdTIFNob3J0KiAgbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG9ydCogIG1heCApCi0gIHsKLSAgICBMb25nICBwaXRjaCA9IHJhcy50YXJnZXQucGl0Y2g7Ci0KLSAgICBGVF9VTlVTRUQoIG1heCApOwotCi0KLSAgICByYXMudHJhY2VJbmNyID0gKFNob3J0KS1waXRjaDsKLSAgICByYXMudHJhY2VPZnMgID0gLSptaW4gKiBwaXRjaDsKLSAgICBpZiAoIHBpdGNoID4gMCApCi0gICAgICByYXMudHJhY2VPZnMgKz0gKExvbmcpKCByYXMudGFyZ2V0LnJvd3MgLSAxICkgKiBwaXRjaDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgVmVydGljYWxfU3dlZXBfU3BhbiggUkFTX0FSR1MgU2hvcnQgICAgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUHJvZmlsZSAgICBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUHJvZmlsZSAgICByaWdodCApCi0gIHsKLSAgICBMb25nICAgZTEsIGUyOwotICAgIEJ5dGUqICB0YXJnZXQ7Ci0KLSAgICBJbnQgIGRyb3BPdXRDb250cm9sID0gbGVmdC0+ZmxhZ3MgJiA3OwotCi0gICAgRlRfVU5VU0VEKCB5ICk7Ci0gICAgRlRfVU5VU0VEKCBsZWZ0ICk7Ci0gICAgRlRfVU5VU0VEKCByaWdodCApOwotCi0KLSAgICAvKiBpbiBoaWdoLXByZWNpc2lvbiBtb2RlLCB3ZSBuZWVkIDEyIGRpZ2l0cyBhZnRlciB0aGUgY29tbWEgdG8gKi8KLSAgICAvKiByZXByZXNlbnQgbXVsdGlwbGVzIG9mIDEvKDE8PDEyKSA9IDEvNDA5NiAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9UUkFDRTcoKCAiICB5PSVkIHg9WyUuMTJmOyUuMTJmXSwgZHJvcC1vdXQ9JWQiLAotICAgICAgICAgICAgICAgIHksCi0gICAgICAgICAgICAgICAgeDEgLyAoZG91YmxlKXJhcy5wcmVjaXNpb24sCi0gICAgICAgICAgICAgICAgeDIgLyAoZG91YmxlKXJhcy5wcmVjaXNpb24sCi0gICAgICAgICAgICAgICAgZHJvcE91dENvbnRyb2wgKSk7Ci0KLSAgICAvKiBEcm9wLW91dCBjb250cm9sICovCi0KLSAgICBlMSA9IFRSVU5DKCBDRUlMSU5HKCB4MSApICk7Ci0KLSAgICBpZiAoIGRyb3BPdXRDb250cm9sICE9IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICB4MiAtIHgxIC0gcmFzLnByZWNpc2lvbiA8PSByYXMucHJlY2lzaW9uX2ppdHRlciApCi0gICAgICBlMiA9IGUxOwotICAgIGVsc2UKLSAgICAgIGUyID0gVFJVTkMoIEZMT09SKCB4MiApICk7Ci0KLSAgICBpZiAoIGUyID49IDAgJiYgZTEgPCByYXMuYldpZHRoICkKLSAgICB7Ci0gICAgICBJbnQgICBjMSwgYzI7Ci0gICAgICBCeXRlICBmMSwgZjI7Ci0KLQotICAgICAgaWYgKCBlMSA8IDAgKQotICAgICAgICBlMSA9IDA7Ci0gICAgICBpZiAoIGUyID49IHJhcy5iV2lkdGggKQotICAgICAgICBlMiA9IHJhcy5iV2lkdGggLSAxOwotCi0gICAgICBGVF9UUkFDRTcoKCAiIC0+IHg9WyVkOyVkXSIsIGUxLCBlMiApKTsKLQotICAgICAgYzEgPSAoU2hvcnQpKCBlMSA+PiAzICk7Ci0gICAgICBjMiA9IChTaG9ydCkoIGUyID4+IDMgKTsKLQotICAgICAgZjEgPSAoQnl0ZSkgICggMHhGRiA+PiAoIGUxICYgNyApICk7Ci0gICAgICBmMiA9IChCeXRlKSB+KCAweDdGID4+ICggZTIgJiA3ICkgKTsKLQotICAgICAgdGFyZ2V0ID0gcmFzLmJUYXJnZXQgKyByYXMudHJhY2VPZnMgKyBjMTsKLSAgICAgIGMyIC09IGMxOwotCi0gICAgICBpZiAoIGMyID4gMCApCi0gICAgICB7Ci0gICAgICAgIHRhcmdldFswXSB8PSBmMTsKLQotICAgICAgICAvKiBtZW1zZXQoKSBpcyBzbG93ZXIgdGhhbiB0aGUgZm9sbG93aW5nIGNvZGUgb24gbWFueSBwbGF0Zm9ybXMuICovCi0gICAgICAgIC8qIFRoaXMgaXMgZHVlIHRvIHRoZSBmYWN0IHRoYXQsIGluIHRoZSB2YXN0IG1ham9yaXR5IG9mIGNhc2VzLCAgKi8KLSAgICAgICAgLyogdGhlIHNwYW4gbGVuZ3RoIGluIGJ5dGVzIGlzIHJlbGF0aXZlbHkgc21hbGwuICAgICAgICAgICAgICAgICAqLwotICAgICAgICBjMi0tOwotICAgICAgICB3aGlsZSAoIGMyID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAqKCsrdGFyZ2V0KSA9IDB4RkY7Ci0gICAgICAgICAgYzItLTsKLSAgICAgICAgfQotICAgICAgICB0YXJnZXRbMV0gfD0gZjI7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgICp0YXJnZXQgfD0gKCBmMSAmIGYyICk7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U3KCggIlxuIiApKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgVmVydGljYWxfU3dlZXBfRHJvcCggUkFTX0FSR1MgU2hvcnQgICAgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUHJvZmlsZSAgICBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUHJvZmlsZSAgICByaWdodCApCi0gIHsKLSAgICBMb25nICAgZTEsIGUyLCBweGw7Ci0gICAgU2hvcnQgIGMxLCBmMTsKLQotCi0gICAgRlRfVFJBQ0U3KCggIiAgeT0lZCB4PVslLjEyZjslLjEyZl0iLAotICAgICAgICAgICAgICAgIHksCi0gICAgICAgICAgICAgICAgeDEgLyAoZG91YmxlKXJhcy5wcmVjaXNpb24sCi0gICAgICAgICAgICAgICAgeDIgLyAoZG91YmxlKXJhcy5wcmVjaXNpb24gKSk7Ci0KLSAgICAvKiBEcm9wLW91dCBjb250cm9sICovCi0KLSAgICAvKiAgIGUyICAgICAgICAgICAgeDIgICAgICAgICAgICAgICAgICAgIHgxICAgICAgICAgICBlMSAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICovCi0gICAgLyogICArLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKyAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHYgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIHBpeGVsICAgICAgICAgY29udG91ciAgICAgICAgICAgICAgY29udG91ciAgICAgICBwaXhlbCAgKi8KLSAgICAvKiBjZW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyICovCi0KLSAgICAvKiBkcm9wLW91dCBtb2RlICAgIHNjYW4gY29udmVyc2lvbiBydWxlcyAoYXMgZGVmaW5lZCBpbiBPcGVuVHlwZSkgKi8KLSAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLSAgICAvKiAgMCAgICAgICAgICAgICAgICAxLCAyLCAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgMSAgICAgICAgICAgICAgICAxLCAyLCA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgMiAgICAgICAgICAgICAgICAxLCAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgMyAgICAgICAgICAgICAgICBzYW1lIGFzIG1vZGUgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgNCAgICAgICAgICAgICAgICAxLCAyLCA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgNSAgICAgICAgICAgICAgICAxLCAyLCA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgNiwgNyAgICAgICAgICAgICBzYW1lIGFzIG1vZGUgMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIGUxICA9IENFSUxJTkcoIHgxICk7Ci0gICAgZTIgID0gRkxPT1IgICggeDIgKTsKLSAgICBweGwgPSBlMTsKLQotICAgIGlmICggZTEgPiBlMiApCi0gICAgewotICAgICAgSW50ICBkcm9wT3V0Q29udHJvbCA9IGxlZnQtPmZsYWdzICYgNzsKLQotCi0gICAgICBGVF9UUkFDRTcoKCAiLCBkcm9wLW91dD0lZCIsIGRyb3BPdXRDb250cm9sICkpOwotCi0gICAgICBpZiAoIGUxID09IGUyICsgcmFzLnByZWNpc2lvbiApCi0gICAgICB7Ci0gICAgICAgIHN3aXRjaCAoIGRyb3BPdXRDb250cm9sICkKLSAgICAgICAgewotICAgICAgICBjYXNlIDA6IC8qIHNpbXBsZSBkcm9wLW91dHMgaW5jbHVkaW5nIHN0dWJzICovCi0gICAgICAgICAgcHhsID0gZTI7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA0OiAvKiBzbWFydCBkcm9wLW91dHMgaW5jbHVkaW5nIHN0dWJzICovCi0gICAgICAgICAgcHhsID0gRkxPT1IoICggeDEgKyB4MiAtIDEgKSAvIDIgKyByYXMucHJlY2lzaW9uX2hhbGYgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE6IC8qIHNpbXBsZSBkcm9wLW91dHMgZXhjbHVkaW5nIHN0dWJzICovCi0gICAgICAgIGNhc2UgNTogLyogc21hcnQgZHJvcC1vdXRzIGV4Y2x1ZGluZyBzdHVicyAgKi8KLQotICAgICAgICAgIC8qIERyb3Atb3V0IENvbnRyb2wgUnVsZXMgIzQgYW5kICM2ICovCi0KLSAgICAgICAgICAvKiBUaGUgc3BlY2lmaWNhdGlvbiBuZWl0aGVyIHByb3ZpZGVzIGFuIGV4YWN0IGRlZmluaXRpb24gKi8KLSAgICAgICAgICAvKiBvZiBhIGBzdHViJyBub3IgZ2l2ZXMgZXhhY3QgcnVsZXMgdG8gZXhjbHVkZSB0aGVtLiAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBIZXJlIHRoZSBjb25zdHJhaW50cyB3ZSB1c2UgdG8gcmVjb2duaXplIGEgc3R1Yi4gICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgdXBwZXIgc3R1YjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgIC0gUF9MZWZ0IGFuZCBQX1JpZ2h0IGFyZSBpbiB0aGUgc2FtZSBjb250b3VyICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgIC0gUF9SaWdodCBpcyB0aGUgc3VjY2Vzc29yIG9mIFBfTGVmdCBpbiB0aGF0IGNvbnRvdXIgKi8KLSAgICAgICAgICAvKiAgIC0geSBpcyB0aGUgdG9wIG9mIFBfTGVmdCBhbmQgUF9SaWdodCAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgbG93ZXIgc3R1YjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgIC0gUF9MZWZ0IGFuZCBQX1JpZ2h0IGFyZSBpbiB0aGUgc2FtZSBjb250b3VyICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgIC0gUF9MZWZ0IGlzIHRoZSBzdWNjZXNzb3Igb2YgUF9SaWdodCBpbiB0aGF0IGNvbnRvdXIgKi8KLSAgICAgICAgICAvKiAgIC0geSBpcyB0aGUgYm90dG9tIG9mIFBfTGVmdCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBXZSBkcmF3IGEgc3R1YiBpZiB0aGUgZm9sbG93aW5nIGNvbnN0cmFpbnRzIGFyZSBtZXQuICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgIC0gZm9yIGFuIHVwcGVyIG9yIGxvd2VyIHN0dWIsIHRoZXJlIGlzIHRvcCBvciBib3R0b20gKi8KLSAgICAgICAgICAvKiAgICAgb3ZlcnNob290LCByZXNwZWN0aXZlbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgIC0gdGhlIGNvdmVyZWQgaW50ZXJ2YWwgaXMgZ3JlYXRlciBvciBlcXVhbCB0byBhIGhhbGYgKi8KLSAgICAgICAgICAvKiAgICAgcGl4ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgIC8qIHVwcGVyIHN0dWIgdGVzdCAqLwotICAgICAgICAgIGlmICggbGVmdC0+bmV4dCA9PSByaWdodCAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgbGVmdC0+aGVpZ2h0IDw9IDAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgISggbGVmdC0+ZmxhZ3MgJiBPdmVyc2hvb3RfVG9wICAgJiYKLSAgICAgICAgICAgICAgICAgIHgyIC0geDEgPj0gcmFzLnByZWNpc2lvbl9oYWxmICkgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgLyogbG93ZXIgc3R1YiB0ZXN0ICovCi0gICAgICAgICAgaWYgKCByaWdodC0+bmV4dCA9PSBsZWZ0ICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgbGVmdC0+c3RhcnQgPT0geSAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICEoIGxlZnQtPmZsYWdzICYgT3ZlcnNob290X0JvdHRvbSAmJgotICAgICAgICAgICAgICAgICAgeDIgLSB4MSA+PSByYXMucHJlY2lzaW9uX2hhbGYgICkgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgaWYgKCBkcm9wT3V0Q29udHJvbCA9PSAxICkKLSAgICAgICAgICAgIHB4bCA9IGUyOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHB4bCA9IEZMT09SKCAoIHgxICsgeDIgLSAxICkgLyAyICsgcmFzLnByZWNpc2lvbl9oYWxmICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDogLyogbW9kZXMgMiwgMywgNiwgNyAqLwotICAgICAgICAgIGdvdG8gRXhpdDsgIC8qIG5vIGRyb3Atb3V0IGNvbnRyb2wgKi8KLSAgICAgICAgfQotCi0gICAgICAgIC8qIHVuZG9jdW1lbnRlZCBidXQgY29uZmlybWVkOiBJZiB0aGUgZHJvcC1vdXQgd291bGQgcmVzdWx0IGluIGEgICovCi0gICAgICAgIC8qIHBpeGVsIG91dHNpZGUgb2YgdGhlIGJvdW5kaW5nIGJveCwgdXNlIHRoZSBwaXhlbCBpbnNpZGUgb2YgdGhlICovCi0gICAgICAgIC8qIGJvdW5kaW5nIGJveCBpbnN0ZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggcHhsIDwgMCApCi0gICAgICAgICAgcHhsID0gZTE7Ci0gICAgICAgIGVsc2UgaWYgKCBUUlVOQyggcHhsICkgPj0gcmFzLmJXaWR0aCApCi0gICAgICAgICAgcHhsID0gZTI7Ci0KLSAgICAgICAgLyogY2hlY2sgdGhhdCB0aGUgb3RoZXIgcGl4ZWwgaXNuJ3Qgc2V0ICovCi0gICAgICAgIGUxID0gcHhsID09IGUxID8gZTIgOiBlMTsKLQotICAgICAgICBlMSA9IFRSVU5DKCBlMSApOwotCi0gICAgICAgIGMxID0gKFNob3J0KSggZTEgPj4gMyApOwotICAgICAgICBmMSA9IChTaG9ydCkoIGUxICYgIDcgKTsKLQotICAgICAgICBpZiAoIGUxID49IDAgJiYgZTEgPCByYXMuYldpZHRoICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgcmFzLmJUYXJnZXRbcmFzLnRyYWNlT2ZzICsgYzFdICYgKCAweDgwID4+IGYxICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGUxID0gVFJVTkMoIHB4bCApOwotCi0gICAgaWYgKCBlMSA+PSAwICYmIGUxIDwgcmFzLmJXaWR0aCApCi0gICAgewotICAgICAgRlRfVFJBQ0U3KCggIiAtPiB4PSVkIChkcm9wLW91dCkiLCBlMSApKTsKLQotICAgICAgYzEgPSAoU2hvcnQpKCBlMSA+PiAzICk7Ci0gICAgICBmMSA9IChTaG9ydCkoIGUxICYgNyApOwotCi0gICAgICByYXMuYlRhcmdldFtyYXMudHJhY2VPZnMgKyBjMV0gfD0gKGNoYXIpKCAweDgwID4+IGYxICk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgRlRfVFJBQ0U3KCggIlxuIiApKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgVmVydGljYWxfU3dlZXBfU3RlcCggUkFTX0FSRyApCi0gIHsKLSAgICByYXMudHJhY2VPZnMgKz0gcmFzLnRyYWNlSW5jcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBIb3Jpem9udGFsIFN3ZWVwIFByb2NlZHVyZSBTZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhlc2UgZm91ciByb3V0aW5lcyBhcmUgdXNlZCBkdXJpbmcgdGhlIGhvcml6b250YWwgYmxhY2svd2hpdGUgICAgICovCi0gIC8qICBzd2VlcCBwaGFzZSBieSB0aGUgZ2VuZXJpYyBEcmF3X1N3ZWVwKCkgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgc3RhdGljIHZvaWQKLSAgSG9yaXpvbnRhbF9Td2VlcF9Jbml0KCBSQVNfQVJHUyBTaG9ydCogIG1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG9ydCogIG1heCApCi0gIHsKLSAgICAvKiBub3RoaW5nLCByZWFsbHkgKi8KLSAgICBGVF9VTlVTRURfUkFTVEVSOwotICAgIEZUX1VOVVNFRCggbWluICk7Ci0gICAgRlRfVU5VU0VEKCBtYXggKTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgSG9yaXpvbnRhbF9Td2VlcF9TcGFuKCBSQVNfQVJHUyBTaG9ydCAgICAgICB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQcm9maWxlICAgIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFByb2ZpbGUgICAgcmlnaHQgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBsZWZ0ICk7Ci0gICAgRlRfVU5VU0VEKCByaWdodCApOwotCi0KLSAgICBpZiAoIHgyIC0geDEgPCByYXMucHJlY2lzaW9uICkKLSAgICB7Ci0gICAgICBMb25nICBlMSwgZTI7Ci0KLQotICAgICAgRlRfVFJBQ0U3KCggIiAgeD0lZCB5PVslLjEyZjslLjEyZl0iLAotICAgICAgICAgICAgICAgICAgeSwKLSAgICAgICAgICAgICAgICAgIHgxIC8gKGRvdWJsZSlyYXMucHJlY2lzaW9uLAotICAgICAgICAgICAgICAgICAgeDIgLyAoZG91YmxlKXJhcy5wcmVjaXNpb24gKSk7Ci0KLSAgICAgIGUxID0gQ0VJTElORyggeDEgKTsKLSAgICAgIGUyID0gRkxPT1IgICggeDIgKTsKLQotICAgICAgaWYgKCBlMSA9PSBlMiApCi0gICAgICB7Ci0gICAgICAgIGUxID0gVFJVTkMoIGUxICk7Ci0KLSAgICAgICAgaWYgKCBlMSA+PSAwICYmIChVTG9uZyllMSA8IHJhcy50YXJnZXQucm93cyApCi0gICAgICAgIHsKLSAgICAgICAgICBCeXRlICAgZjE7Ci0gICAgICAgICAgUEJ5dGUgIGJpdHM7Ci0gICAgICAgICAgUEJ5dGUgIHA7Ci0KLQotICAgICAgICAgIEZUX1RSQUNFNygoICIgLT4geT0lZCAoZHJvcC1vdXQpIiwgZTEgKSk7Ci0KLSAgICAgICAgICBiaXRzID0gcmFzLmJUYXJnZXQgKyAoIHkgPj4gMyApOwotICAgICAgICAgIGYxICAgPSAoQnl0ZSkoIDB4ODAgPj4gKCB5ICYgNyApICk7Ci0gICAgICAgICAgcCAgICA9IGJpdHMgLSBlMSAqIHJhcy50YXJnZXQucGl0Y2g7Ci0KLSAgICAgICAgICBpZiAoIHJhcy50YXJnZXQucGl0Y2ggPiAwICkKLSAgICAgICAgICAgIHAgKz0gKExvbmcpKCByYXMudGFyZ2V0LnJvd3MgLSAxICkgKiByYXMudGFyZ2V0LnBpdGNoOwotCi0gICAgICAgICAgcFswXSB8PSBmMTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBGVF9UUkFDRTcoKCAiXG4iICkpOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgSG9yaXpvbnRhbF9Td2VlcF9Ecm9wKCBSQVNfQVJHUyBTaG9ydCAgICAgICB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgIHgyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBQcm9maWxlICAgIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFByb2ZpbGUgICAgcmlnaHQgKQotICB7Ci0gICAgTG9uZyAgIGUxLCBlMiwgcHhsOwotICAgIFBCeXRlICBiaXRzOwotICAgIEJ5dGUgICBmMTsKLQotCi0gICAgRlRfVFJBQ0U3KCggIiAgeD0lZCB5PVslLjEyZjslLjEyZl0iLAotICAgICAgICAgICAgICAgIHksCi0gICAgICAgICAgICAgICAgeDEgLyAoZG91YmxlKXJhcy5wcmVjaXNpb24sCi0gICAgICAgICAgICAgICAgeDIgLyAoZG91YmxlKXJhcy5wcmVjaXNpb24gKSk7Ci0KLSAgICAvKiBEdXJpbmcgdGhlIGhvcml6b250YWwgc3dlZXAsIHdlIG9ubHkgdGFrZSBjYXJlIG9mIGRyb3Atb3V0cyAqLwotCi0gICAgLyogZTEgICAgICsgICAgICAgPC0tIHBpeGVsIGNlbnRlciAqLwotICAgIC8qICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiB4MSAgLS0tKy0tPiAgICA8LS0gY29udG91ciAgICAgICovCi0gICAgLyogICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiB4MiAgPC0tKy0tLSAgICA8LS0gY29udG91ciAgICAgICovCi0gICAgLyogICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBlMiAgICAgKyAgICAgICA8LS0gcGl4ZWwgY2VudGVyICovCi0KLSAgICBlMSAgPSBDRUlMSU5HKCB4MSApOwotICAgIGUyICA9IEZMT09SICAoIHgyICk7Ci0gICAgcHhsID0gZTE7Ci0KLSAgICBpZiAoIGUxID4gZTIgKQotICAgIHsKLSAgICAgIEludCAgZHJvcE91dENvbnRyb2wgPSBsZWZ0LT5mbGFncyAmIDc7Ci0KLQotICAgICAgRlRfVFJBQ0U3KCggIiwgZHJvcG91dD0lZCIsIGRyb3BPdXRDb250cm9sICkpOwotCi0gICAgICBpZiAoIGUxID09IGUyICsgcmFzLnByZWNpc2lvbiApCi0gICAgICB7Ci0gICAgICAgIHN3aXRjaCAoIGRyb3BPdXRDb250cm9sICkKLSAgICAgICAgewotICAgICAgICBjYXNlIDA6IC8qIHNpbXBsZSBkcm9wLW91dHMgaW5jbHVkaW5nIHN0dWJzICovCi0gICAgICAgICAgcHhsID0gZTI7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSA0OiAvKiBzbWFydCBkcm9wLW91dHMgaW5jbHVkaW5nIHN0dWJzICovCi0gICAgICAgICAgcHhsID0gRkxPT1IoICggeDEgKyB4MiAtIDEgKSAvIDIgKyByYXMucHJlY2lzaW9uX2hhbGYgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDE6IC8qIHNpbXBsZSBkcm9wLW91dHMgZXhjbHVkaW5nIHN0dWJzICovCi0gICAgICAgIGNhc2UgNTogLyogc21hcnQgZHJvcC1vdXRzIGV4Y2x1ZGluZyBzdHVicyAgKi8KLSAgICAgICAgICAvKiBzZWUgVmVydGljYWxfU3dlZXBfRHJvcCBmb3IgZGV0YWlscyAqLwotCi0gICAgICAgICAgLyogcmlnaHRtb3N0IHN0dWIgdGVzdCAqLwotICAgICAgICAgIGlmICggbGVmdC0+bmV4dCA9PSByaWdodCAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgbGVmdC0+aGVpZ2h0IDw9IDAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgISggbGVmdC0+ZmxhZ3MgJiBPdmVyc2hvb3RfVG9wICAgJiYKLSAgICAgICAgICAgICAgICAgIHgyIC0geDEgPj0gcmFzLnByZWNpc2lvbl9oYWxmICkgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgLyogbGVmdG1vc3Qgc3R1YiB0ZXN0ICovCi0gICAgICAgICAgaWYgKCByaWdodC0+bmV4dCA9PSBsZWZ0ICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgbGVmdC0+c3RhcnQgPT0geSAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICEoIGxlZnQtPmZsYWdzICYgT3ZlcnNob290X0JvdHRvbSAmJgotICAgICAgICAgICAgICAgICAgeDIgLSB4MSA+PSByYXMucHJlY2lzaW9uX2hhbGYgICkgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgaWYgKCBkcm9wT3V0Q29udHJvbCA9PSAxICkKLSAgICAgICAgICAgIHB4bCA9IGUyOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHB4bCA9IEZMT09SKCAoIHgxICsgeDIgLSAxICkgLyAyICsgcmFzLnByZWNpc2lvbl9oYWxmICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDogLyogbW9kZXMgMiwgMywgNiwgNyAqLwotICAgICAgICAgIGdvdG8gRXhpdDsgIC8qIG5vIGRyb3Atb3V0IGNvbnRyb2wgKi8KLSAgICAgICAgfQotCi0gICAgICAgIC8qIHVuZG9jdW1lbnRlZCBidXQgY29uZmlybWVkOiBJZiB0aGUgZHJvcC1vdXQgd291bGQgcmVzdWx0IGluIGEgICovCi0gICAgICAgIC8qIHBpeGVsIG91dHNpZGUgb2YgdGhlIGJvdW5kaW5nIGJveCwgdXNlIHRoZSBwaXhlbCBpbnNpZGUgb2YgdGhlICovCi0gICAgICAgIC8qIGJvdW5kaW5nIGJveCBpbnN0ZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggcHhsIDwgMCApCi0gICAgICAgICAgcHhsID0gZTE7Ci0gICAgICAgIGVsc2UgaWYgKCAoVUxvbmcpKCBUUlVOQyggcHhsICkgKSA+PSByYXMudGFyZ2V0LnJvd3MgKQotICAgICAgICAgIHB4bCA9IGUyOwotCi0gICAgICAgIC8qIGNoZWNrIHRoYXQgdGhlIG90aGVyIHBpeGVsIGlzbid0IHNldCAqLwotICAgICAgICBlMSA9IHB4bCA9PSBlMSA/IGUyIDogZTE7Ci0KLSAgICAgICAgZTEgPSBUUlVOQyggZTEgKTsKLQotICAgICAgICBiaXRzID0gcmFzLmJUYXJnZXQgKyAoIHkgPj4gMyApOwotICAgICAgICBmMSAgID0gKEJ5dGUpKCAweDgwID4+ICggeSAmIDcgKSApOwotCi0gICAgICAgIGJpdHMgLT0gZTEgKiByYXMudGFyZ2V0LnBpdGNoOwotICAgICAgICBpZiAoIHJhcy50YXJnZXQucGl0Y2ggPiAwICkKLSAgICAgICAgICBiaXRzICs9IChMb25nKSggcmFzLnRhcmdldC5yb3dzIC0gMSApICogcmFzLnRhcmdldC5waXRjaDsKLQotICAgICAgICBpZiAoIGUxID49IDAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIChVTG9uZyllMSA8IHJhcy50YXJnZXQucm93cyAmJgotICAgICAgICAgICAgICpiaXRzICYgZjEgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgZTEgPSBUUlVOQyggcHhsICk7Ci0KLSAgICBpZiAoIGUxID49IDAgJiYgKFVMb25nKWUxIDwgcmFzLnRhcmdldC5yb3dzICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTcoKCAiIC0+IHk9JWQgKGRyb3Atb3V0KSIsIGUxICkpOwotCi0gICAgICBiaXRzICA9IHJhcy5iVGFyZ2V0ICsgKCB5ID4+IDMgKTsKLSAgICAgIGYxICAgID0gKEJ5dGUpKCAweDgwID4+ICggeSAmIDcgKSApOwotICAgICAgYml0cyAtPSBlMSAqIHJhcy50YXJnZXQucGl0Y2g7Ci0KLSAgICAgIGlmICggcmFzLnRhcmdldC5waXRjaCA+IDAgKQotICAgICAgICBiaXRzICs9IChMb25nKSggcmFzLnRhcmdldC5yb3dzIC0gMSApICogcmFzLnRhcmdldC5waXRjaDsKLQotICAgICAgYml0c1swXSB8PSBmMTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICBGVF9UUkFDRTcoKCAiXG4iICkpOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBIb3Jpem9udGFsX1N3ZWVwX1N0ZXAoIFJBU19BUkcgKQotICB7Ci0gICAgLyogTm90aGluZywgcmVhbGx5ICovCi0gICAgRlRfVU5VU0VEX1JBU1RFUjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgR2VuZXJpYyBTd2VlcCBEcmF3aW5nIHJvdXRpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIHN0YXRpYyBCb29sCi0gIERyYXdfU3dlZXAoIFJBU19BUkcgKQotICB7Ci0gICAgU2hvcnQgICAgICAgICB5LCB5X2NoYW5nZSwgeV9oZWlnaHQ7Ci0KLSAgICBQUHJvZmlsZSAgICAgIFAsIFEsIFBfTGVmdCwgUF9SaWdodDsKLQotICAgIFNob3J0ICAgICAgICAgbWluX1ksIG1heF9ZLCB0b3AsIGJvdHRvbSwgZHJvcG91dHM7Ci0KLSAgICBMb25nICAgICAgICAgIHgxLCB4MiwgeHMsIGUxLCBlMjsKLQotICAgIFRQcm9maWxlTGlzdCAgd2FpdGluZzsKLSAgICBUUHJvZmlsZUxpc3QgIGRyYXdfbGVmdCwgZHJhd19yaWdodDsKLQotCi0gICAgLyogaW5pdGlhbGl6ZSBlbXB0eSBsaW5rZWQgbGlzdHMgKi8KLQotICAgIEluaXRfTGlua2VkKCAmd2FpdGluZyApOwotCi0gICAgSW5pdF9MaW5rZWQoICZkcmF3X2xlZnQgICk7Ci0gICAgSW5pdF9MaW5rZWQoICZkcmF3X3JpZ2h0ICk7Ci0KLSAgICAvKiBmaXJzdCwgY29tcHV0ZSBtaW4gYW5kIG1heCBZICovCi0KLSAgICBQICAgICA9IHJhcy5mUHJvZmlsZTsKLSAgICBtYXhfWSA9IChTaG9ydClUUlVOQyggcmFzLm1pblkgKTsKLSAgICBtaW5fWSA9IChTaG9ydClUUlVOQyggcmFzLm1heFkgKTsKLQotICAgIHdoaWxlICggUCApCi0gICAgewotICAgICAgUSA9IFAtPmxpbms7Ci0KLSAgICAgIGJvdHRvbSA9IChTaG9ydClQLT5zdGFydDsKLSAgICAgIHRvcCAgICA9IChTaG9ydCkoIFAtPnN0YXJ0ICsgUC0+aGVpZ2h0IC0gMSApOwotCi0gICAgICBpZiAoIG1pbl9ZID4gYm90dG9tICkKLSAgICAgICAgbWluX1kgPSBib3R0b207Ci0gICAgICBpZiAoIG1heF9ZIDwgdG9wICkKLSAgICAgICAgbWF4X1kgPSB0b3A7Ci0KLSAgICAgIFAtPlggPSAwOwotICAgICAgSW5zTmV3KCAmd2FpdGluZywgUCApOwotCi0gICAgICBQID0gUTsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayB0aGUgWS10dXJucyAqLwotICAgIGlmICggcmFzLm51bVR1cm5zID09IDAgKQotICAgIHsKLSAgICAgIHJhcy5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkICk7Ci0gICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICB9Ci0KLSAgICAvKiBub3cgaW5pdGlhbGl6ZSB0aGUgc3dlZXAgKi8KLQotICAgIHJhcy5Qcm9jX1N3ZWVwX0luaXQoIFJBU19WQVJTICZtaW5fWSwgJm1heF9ZICk7Ci0KLSAgICAvKiB0aGVuIGNvbXB1dGUgdGhlIGRpc3RhbmNlIG9mIGVhY2ggcHJvZmlsZSBmcm9tIG1pbl9ZICovCi0KLSAgICBQID0gd2FpdGluZzsKLQotICAgIHdoaWxlICggUCApCi0gICAgewotICAgICAgUC0+Y291bnRMID0gUC0+c3RhcnQgLSBtaW5fWTsKLSAgICAgIFAgPSBQLT5saW5rOwotICAgIH0KLQotICAgIC8qIGxldCdzIGdvICovCi0KLSAgICB5ICAgICAgICA9IG1pbl9ZOwotICAgIHlfaGVpZ2h0ID0gMDsKLQotICAgIGlmICggcmFzLm51bVR1cm5zID4gMCAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICByYXMuc2l6ZUJ1ZmZbLXJhcy5udW1UdXJuc10gPT0gbWluX1kgKQotICAgICAgcmFzLm51bVR1cm5zLS07Ci0KLSAgICB3aGlsZSAoIHJhcy5udW1UdXJucyA+IDAgKQotICAgIHsKLSAgICAgIC8qIGNoZWNrIHdhaXRpbmcgbGlzdCBmb3IgbmV3IGFjdGl2YXRpb25zICovCi0KLSAgICAgIFAgPSB3YWl0aW5nOwotCi0gICAgICB3aGlsZSAoIFAgKQotICAgICAgewotICAgICAgICBRID0gUC0+bGluazsKLSAgICAgICAgUC0+Y291bnRMIC09IHlfaGVpZ2h0OwotICAgICAgICBpZiAoIFAtPmNvdW50TCA9PSAwICkKLSAgICAgICAgewotICAgICAgICAgIERlbE9sZCggJndhaXRpbmcsIFAgKTsKLQotICAgICAgICAgIGlmICggUC0+ZmxhZ3MgJiBGbG93X1VwICkKLSAgICAgICAgICAgIEluc05ldyggJmRyYXdfbGVmdCwgIFAgKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBJbnNOZXcoICZkcmF3X3JpZ2h0LCBQICk7Ci0gICAgICAgIH0KLQotICAgICAgICBQID0gUTsKLSAgICAgIH0KLQotICAgICAgLyogc29ydCB0aGUgZHJhd2luZyBsaXN0cyAqLwotCi0gICAgICBTb3J0KCAmZHJhd19sZWZ0ICk7Ci0gICAgICBTb3J0KCAmZHJhd19yaWdodCApOwotCi0gICAgICB5X2NoYW5nZSA9IChTaG9ydClyYXMuc2l6ZUJ1ZmZbLXJhcy5udW1UdXJucy0tXTsKLSAgICAgIHlfaGVpZ2h0ID0gKFNob3J0KSggeV9jaGFuZ2UgLSB5ICk7Ci0KLSAgICAgIHdoaWxlICggeSA8IHlfY2hhbmdlICkKLSAgICAgIHsKLSAgICAgICAgLyogbGV0J3MgdHJhY2UgKi8KLQotICAgICAgICBkcm9wb3V0cyA9IDA7Ci0KLSAgICAgICAgUF9MZWZ0ICA9IGRyYXdfbGVmdDsKLSAgICAgICAgUF9SaWdodCA9IGRyYXdfcmlnaHQ7Ci0KLSAgICAgICAgd2hpbGUgKCBQX0xlZnQgKQotICAgICAgICB7Ci0gICAgICAgICAgeDEgPSBQX0xlZnQgLT5YOwotICAgICAgICAgIHgyID0gUF9SaWdodC0+WDsKLQotICAgICAgICAgIGlmICggeDEgPiB4MiApCi0gICAgICAgICAgewotICAgICAgICAgICAgeHMgPSB4MTsKLSAgICAgICAgICAgIHgxID0geDI7Ci0gICAgICAgICAgICB4MiA9IHhzOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGUxID0gRkxPT1IoIHgxICk7Ci0gICAgICAgICAgZTIgPSBDRUlMSU5HKCB4MiApOwotCi0gICAgICAgICAgaWYgKCB4MiAtIHgxIDw9IHJhcy5wcmVjaXNpb24gJiYKLSAgICAgICAgICAgICAgIGUxICE9IHgxICYmIGUyICE9IHgyICAgICApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBlMSA+IGUyIHx8IGUyID09IGUxICsgcmFzLnByZWNpc2lvbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEludCAgZHJvcE91dENvbnRyb2wgPSBQX0xlZnQtPmZsYWdzICYgNzsKLQotCi0gICAgICAgICAgICAgIGlmICggZHJvcE91dENvbnRyb2wgIT0gMiApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBhIGRyb3Atb3V0IHdhcyBkZXRlY3RlZCAqLwotCi0gICAgICAgICAgICAgICAgUF9MZWZ0IC0+WCA9IHgxOwotICAgICAgICAgICAgICAgIFBfUmlnaHQtPlggPSB4MjsKLQotICAgICAgICAgICAgICAgIC8qIG1hcmsgcHJvZmlsZSBmb3IgZHJvcC1vdXQgcHJvY2Vzc2luZyAqLwotICAgICAgICAgICAgICAgIFBfTGVmdC0+Y291bnRMID0gMTsKLSAgICAgICAgICAgICAgICBkcm9wb3V0cysrOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgZ290byBTa2lwX1RvX05leHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgcmFzLlByb2NfU3dlZXBfU3BhbiggUkFTX1ZBUlMgeSwgeDEsIHgyLCBQX0xlZnQsIFBfUmlnaHQgKTsKLQotICAgICAgICBTa2lwX1RvX05leHQ6Ci0KLSAgICAgICAgICBQX0xlZnQgID0gUF9MZWZ0LT5saW5rOwotICAgICAgICAgIFBfUmlnaHQgPSBQX1JpZ2h0LT5saW5rOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogaGFuZGxlIGRyb3Atb3V0cyBfYWZ0ZXJfIHRoZSBzcGFuIGRyYXdpbmcgLS0gICAgICAgKi8KLSAgICAgICAgLyogZHJvcC1vdXQgcHJvY2Vzc2luZyBoYXMgYmVlbiBtb3ZlZCBvdXQgb2YgdGhlIGxvb3AgKi8KLSAgICAgICAgLyogZm9yIHBlcmZvcm1hbmNlIHR1bmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBkcm9wb3V0cyA+IDAgKQotICAgICAgICAgIGdvdG8gU2Nhbl9Ecm9wT3V0czsKLQotICAgICAgTmV4dF9MaW5lOgotCi0gICAgICAgIHJhcy5Qcm9jX1N3ZWVwX1N0ZXAoIFJBU19WQVIgKTsKLQotICAgICAgICB5Kys7Ci0KLSAgICAgICAgaWYgKCB5IDwgeV9jaGFuZ2UgKQotICAgICAgICB7Ci0gICAgICAgICAgU29ydCggJmRyYXdfbGVmdCAgKTsKLSAgICAgICAgICBTb3J0KCAmZHJhd19yaWdodCApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIG5vdyBmaW5hbGl6ZSB0aGUgcHJvZmlsZXMgdGhhdCBuZWVkIGl0ICovCi0KLSAgICAgIFAgPSBkcmF3X2xlZnQ7Ci0gICAgICB3aGlsZSAoIFAgKQotICAgICAgewotICAgICAgICBRID0gUC0+bGluazsKLSAgICAgICAgaWYgKCBQLT5oZWlnaHQgPT0gMCApCi0gICAgICAgICAgRGVsT2xkKCAmZHJhd19sZWZ0LCBQICk7Ci0gICAgICAgIFAgPSBROwotICAgICAgfQotCi0gICAgICBQID0gZHJhd19yaWdodDsKLSAgICAgIHdoaWxlICggUCApCi0gICAgICB7Ci0gICAgICAgIFEgPSBQLT5saW5rOwotICAgICAgICBpZiAoIFAtPmhlaWdodCA9PSAwICkKLSAgICAgICAgICBEZWxPbGQoICZkcmF3X3JpZ2h0LCBQICk7Ci0gICAgICAgIFAgPSBROwotICAgICAgfQotICAgIH0KLQotICAgIC8qIGZvciBncmF5LXNjYWxpbmcsIGZsdXNoIHRoZSBiaXRtYXAgc2NhbmxpbmUgY2FjaGUgKi8KLSAgICB3aGlsZSAoIHkgPD0gbWF4X1kgKQotICAgIHsKLSAgICAgIHJhcy5Qcm9jX1N3ZWVwX1N0ZXAoIFJBU19WQVIgKTsKLSAgICAgIHkrKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gU1VDQ0VTUzsKLQotICBTY2FuX0Ryb3BPdXRzOgotCi0gICAgUF9MZWZ0ICA9IGRyYXdfbGVmdDsKLSAgICBQX1JpZ2h0ID0gZHJhd19yaWdodDsKLQotICAgIHdoaWxlICggUF9MZWZ0ICkKLSAgICB7Ci0gICAgICBpZiAoIFBfTGVmdC0+Y291bnRMICkKLSAgICAgIHsKLSAgICAgICAgUF9MZWZ0LT5jb3VudEwgPSAwOwotI2lmIDAKLSAgICAgICAgZHJvcG91dHMtLTsgIC8qIC0tIHRoaXMgaXMgdXNlZnVsIHdoZW4gZGVidWdnaW5nIG9ubHkgKi8KLSNlbmRpZgotICAgICAgICByYXMuUHJvY19Td2VlcF9Ecm9wKCBSQVNfVkFSUyB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQX0xlZnQtPlgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBfUmlnaHQtPlgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBfTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUF9SaWdodCApOwotICAgICAgfQotCi0gICAgICBQX0xlZnQgID0gUF9MZWZ0LT5saW5rOwotICAgICAgUF9SaWdodCA9IFBfUmlnaHQtPmxpbms7Ci0gICAgfQotCi0gICAgZ290byBOZXh0X0xpbmU7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlbmRlcl9TaW5nbGVfUGFzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBlcmZvcm0gb25lIHN3ZWVwIHdpdGggc3ViLWJhbmRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZsaXBwZWQgOjogSWYgc2V0LCBmbGlwIHRoZSBkaXJlY3Rpb24gb2YgdGhlIG91dGxpbmUuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlbmRlcmVyIGVycm9yIGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIGludAotICBSZW5kZXJfU2luZ2xlX1Bhc3MoIFJBU19BUkdTIEJvb2wgIGZsaXBwZWQgKQotICB7Ci0gICAgU2hvcnQgIGksIGosIGs7Ci0KLQotICAgIHdoaWxlICggcmFzLmJhbmRfdG9wID49IDAgKQotICAgIHsKLSAgICAgIHJhcy5tYXhZID0gKExvbmcpcmFzLmJhbmRfc3RhY2tbcmFzLmJhbmRfdG9wXS55X21heCAqIHJhcy5wcmVjaXNpb247Ci0gICAgICByYXMubWluWSA9IChMb25nKXJhcy5iYW5kX3N0YWNrW3Jhcy5iYW5kX3RvcF0ueV9taW4gKiByYXMucHJlY2lzaW9uOwotCi0gICAgICByYXMudG9wID0gcmFzLmJ1ZmY7Ci0KLSAgICAgIHJhcy5lcnJvciA9IFJhc3Rlcl9FcnJfTm9uZTsKLQotICAgICAgaWYgKCBDb252ZXJ0X0dseXBoKCBSQVNfVkFSUyBmbGlwcGVkICkgKQotICAgICAgewotICAgICAgICBpZiAoIHJhcy5lcnJvciAhPSBSYXN0ZXJfRXJyX092ZXJmbG93ICkKLSAgICAgICAgICByZXR1cm4gRkFJTFVSRTsKLQotICAgICAgICByYXMuZXJyb3IgPSBSYXN0ZXJfRXJyX05vbmU7Ci0KLSAgICAgICAgLyogc3ViLWJhbmRpbmcgKi8KLQotI2lmZGVmIERFQlVHX1JBU1RFUgotICAgICAgICBDbGVhckJhbmQoIFJBU19WQVJTIFRSVU5DKCByYXMubWluWSApLCBUUlVOQyggcmFzLm1heFkgKSApOwotI2VuZGlmCi0KLSAgICAgICAgaSA9IHJhcy5iYW5kX3N0YWNrW3Jhcy5iYW5kX3RvcF0ueV9taW47Ci0gICAgICAgIGogPSByYXMuYmFuZF9zdGFja1tyYXMuYmFuZF90b3BdLnlfbWF4OwotCi0gICAgICAgIGsgPSAoU2hvcnQpKCAoIGkgKyBqICkgLyAyICk7Ci0KLSAgICAgICAgaWYgKCByYXMuYmFuZF90b3AgPj0gNyB8fCBrIDwgaSApCi0gICAgICAgIHsKLSAgICAgICAgICByYXMuYmFuZF90b3AgPSAwOwotICAgICAgICAgIHJhcy5lcnJvciAgICA9IEZUX1RIUk9XKCBJbnZhbGlkICk7Ci0KLSAgICAgICAgICByZXR1cm4gcmFzLmVycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgcmFzLmJhbmRfc3RhY2tbcmFzLmJhbmRfdG9wICsgMV0ueV9taW4gPSBrOwotICAgICAgICByYXMuYmFuZF9zdGFja1tyYXMuYmFuZF90b3AgKyAxXS55X21heCA9IGo7Ci0KLSAgICAgICAgcmFzLmJhbmRfc3RhY2tbcmFzLmJhbmRfdG9wXS55X21heCA9IChTaG9ydCkoIGsgLSAxICk7Ci0KLSAgICAgICAgcmFzLmJhbmRfdG9wKys7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICggcmFzLmZQcm9maWxlICkKLSAgICAgICAgICBpZiAoIERyYXdfU3dlZXAoIFJBU19WQVIgKSApCi0gICAgICAgICAgICAgcmV0dXJuIHJhcy5lcnJvcjsKLSAgICAgICAgcmFzLmJhbmRfdG9wLS07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIFNVQ0NFU1M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlbmRlcl9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlbmRlciBhIGdseXBoIGluIGEgYml0bWFwLiAgU3ViLWJhbmRpbmcgaWYgbmVlZGVkLiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIFJlbmRlcl9HbHlwaCggUkFTX0FSRyApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIFNldF9IaWdoX1ByZWNpc2lvbiggUkFTX1ZBUlMgcmFzLm91dGxpbmUuZmxhZ3MgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT1VUTElORV9ISUdIX1BSRUNJU0lPTiApOwotICAgIHJhcy5zY2FsZV9zaGlmdCA9IHJhcy5wcmVjaXNpb25fc2hpZnQ7Ci0KLSAgICBpZiAoIHJhcy5vdXRsaW5lLmZsYWdzICYgRlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFMgKQotICAgICAgcmFzLmRyb3BPdXRDb250cm9sID0gMjsKLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCByYXMub3V0bGluZS5mbGFncyAmIEZUX09VVExJTkVfU01BUlRfRFJPUE9VVFMgKQotICAgICAgICByYXMuZHJvcE91dENvbnRyb2wgPSA0OwotICAgICAgZWxzZQotICAgICAgICByYXMuZHJvcE91dENvbnRyb2wgPSAwOwotCi0gICAgICBpZiAoICEoIHJhcy5vdXRsaW5lLmZsYWdzICYgRlRfT1VUTElORV9JTkNMVURFX1NUVUJTICkgKQotICAgICAgICByYXMuZHJvcE91dENvbnRyb2wgKz0gMTsKLSAgICB9Ci0KLSAgICByYXMuc2Vjb25kX3Bhc3MgPSAoQm9vbCkoICEoIHJhcy5vdXRsaW5lLmZsYWdzICAgICAgJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfT1VUTElORV9TSU5HTEVfUEFTUyApICk7Ci0KLSAgICAvKiBWZXJ0aWNhbCBTd2VlcCAqLwotICAgIEZUX1RSQUNFNygoICJWZXJ0aWNhbCBwYXNzIChmdHJhc3RlcilcbiIgKSk7Ci0KLSAgICByYXMuUHJvY19Td2VlcF9Jbml0ID0gVmVydGljYWxfU3dlZXBfSW5pdDsKLSAgICByYXMuUHJvY19Td2VlcF9TcGFuID0gVmVydGljYWxfU3dlZXBfU3BhbjsKLSAgICByYXMuUHJvY19Td2VlcF9Ecm9wID0gVmVydGljYWxfU3dlZXBfRHJvcDsKLSAgICByYXMuUHJvY19Td2VlcF9TdGVwID0gVmVydGljYWxfU3dlZXBfU3RlcDsKLQotICAgIHJhcy5iYW5kX3RvcCAgICAgICAgICAgID0gMDsKLSAgICByYXMuYmFuZF9zdGFja1swXS55X21pbiA9IDA7Ci0gICAgcmFzLmJhbmRfc3RhY2tbMF0ueV9tYXggPSAoU2hvcnQpKCByYXMudGFyZ2V0LnJvd3MgLSAxICk7Ci0KLSAgICByYXMuYldpZHRoICA9IChVU2hvcnQpcmFzLnRhcmdldC53aWR0aDsKLSAgICByYXMuYlRhcmdldCA9IChCeXRlKilyYXMudGFyZ2V0LmJ1ZmZlcjsKLQotICAgIGlmICggKCBlcnJvciA9IFJlbmRlcl9TaW5nbGVfUGFzcyggUkFTX1ZBUlMgMCApICkgIT0gMCApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBIb3Jpem9udGFsIFN3ZWVwICovCi0gICAgaWYgKCByYXMuc2Vjb25kX3Bhc3MgJiYgcmFzLmRyb3BPdXRDb250cm9sICE9IDIgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFNygoICJIb3Jpem9udGFsIHBhc3MgKGZ0cmFzdGVyKVxuIiApKTsKLQotICAgICAgcmFzLlByb2NfU3dlZXBfSW5pdCA9IEhvcml6b250YWxfU3dlZXBfSW5pdDsKLSAgICAgIHJhcy5Qcm9jX1N3ZWVwX1NwYW4gPSBIb3Jpem9udGFsX1N3ZWVwX1NwYW47Ci0gICAgICByYXMuUHJvY19Td2VlcF9Ecm9wID0gSG9yaXpvbnRhbF9Td2VlcF9Ecm9wOwotICAgICAgcmFzLlByb2NfU3dlZXBfU3RlcCA9IEhvcml6b250YWxfU3dlZXBfU3RlcDsKLQotICAgICAgcmFzLmJhbmRfdG9wICAgICAgICAgICAgPSAwOwotICAgICAgcmFzLmJhbmRfc3RhY2tbMF0ueV9taW4gPSAwOwotICAgICAgcmFzLmJhbmRfc3RhY2tbMF0ueV9tYXggPSAoU2hvcnQpKCByYXMudGFyZ2V0LndpZHRoIC0gMSApOwotCi0gICAgICBpZiAoICggZXJyb3IgPSBSZW5kZXJfU2luZ2xlX1Bhc3MoIFJBU19WQVJTIDEgKSApICE9IDAgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgcmV0dXJuIFJhc3Rlcl9FcnJfTm9uZTsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfYmxhY2tfaW5pdCggYmxhY2tfUFJhc3RlciAgcmFzdGVyICkKLSAgewotICAgIEZUX1VOVVNFRCggcmFzdGVyICk7Ci0gIH0KLQotCi0gIC8qKioqIFJBU1RFUiBPQkpFQ1QgQ1JFQVRJT046IEluIHN0YW5kYWxvbmUgbW9kZSwgd2Ugc2ltcGx5IHVzZSAqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgYSBzdGF0aWMgb2JqZWN0LiAgICAgICAgICAgICAgICAgICoqKioqLwotCi0KLSNpZmRlZiBfU1RBTkRBTE9ORV8KLQotCi0gIHN0YXRpYyBpbnQKLSAgZnRfYmxhY2tfbmV3KCB2b2lkKiAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgRlRfUmFzdGVyICAqYXJhc3RlciApCi0gIHsKLSAgICAgc3RhdGljIGJsYWNrX1RSYXN0ZXIgIHRoZV9yYXN0ZXI7Ci0gICAgIEZUX1VOVVNFRCggbWVtb3J5ICk7Ci0KLQotICAgICAqYXJhc3RlciA9IChGVF9SYXN0ZXIpJnRoZV9yYXN0ZXI7Ci0gICAgIEZUX01FTV9aRVJPKCAmdGhlX3Jhc3Rlciwgc2l6ZW9mICggdGhlX3Jhc3RlciApICk7Ci0gICAgIGZ0X2JsYWNrX2luaXQoICZ0aGVfcmFzdGVyICk7Ci0KLSAgICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGZ0X2JsYWNrX2RvbmUoIEZUX1Jhc3RlciAgcmFzdGVyICkKLSAgewotICAgIC8qIG5vdGhpbmcgKi8KLSAgICBGVF9VTlVTRUQoIHJhc3RlciApOwotICB9Ci0KLQotI2Vsc2UgLyogIV9TVEFOREFMT05FXyAqLwotCi0KLSAgc3RhdGljIGludAotICBmdF9ibGFja19uZXcoIEZUX01lbW9yeSAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgYmxhY2tfUFJhc3RlciAgKmFyYXN0ZXIgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgZXJyb3I7Ci0gICAgYmxhY2tfUFJhc3RlciAgcmFzdGVyID0gTlVMTDsKLQotCi0gICAgKmFyYXN0ZXIgPSAwOwotICAgIGlmICggIUZUX05FVyggcmFzdGVyICkgKQotICAgIHsKLSAgICAgIHJhc3Rlci0+bWVtb3J5ID0gbWVtb3J5OwotICAgICAgZnRfYmxhY2tfaW5pdCggcmFzdGVyICk7Ci0KLSAgICAgICphcmFzdGVyID0gcmFzdGVyOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfYmxhY2tfZG9uZSggYmxhY2tfUFJhc3RlciAgcmFzdGVyICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gKEZUX01lbW9yeSlyYXN0ZXItPm1lbW9yeTsKLQotCi0gICAgRlRfRlJFRSggcmFzdGVyICk7Ci0gIH0KLQotCi0jZW5kaWYgLyogIV9TVEFOREFMT05FXyAqLwotCi0KLSAgc3RhdGljIHZvaWQKLSAgZnRfYmxhY2tfcmVzZXQoIGJsYWNrX1BSYXN0ZXIgIHJhc3RlciwKLSAgICAgICAgICAgICAgICAgIGNoYXIqICAgICAgICAgIHBvb2xfYmFzZSwKLSAgICAgICAgICAgICAgICAgIExvbmcgICAgICAgICAgIHBvb2xfc2l6ZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIHJhc3RlciApOwotICAgIEZUX1VOVVNFRCggcG9vbF9iYXNlICk7Ci0gICAgRlRfVU5VU0VEKCBwb29sX3NpemUgKTsKLSAgfQotCi0KLSAgc3RhdGljIGludAotICBmdF9ibGFja19zZXRfbW9kZSggYmxhY2tfUFJhc3RlciAgcmFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgVUxvbmcgICAgICAgICAgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgIHBhbGV0dGUgKQotICB7Ci0gICAgRlRfVU5VU0VEKCByYXN0ZXIgKTsKLSAgICBGVF9VTlVTRUQoIG1vZGUgKTsKLSAgICBGVF9VTlVTRUQoIHBhbGV0dGUgKTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBzdGF0aWMgaW50Ci0gIGZ0X2JsYWNrX3JlbmRlciggYmxhY2tfUFJhc3RlciAgICAgICAgICAgIHJhc3RlciwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9SYXN0ZXJfUGFyYW1zKiAgcGFyYW1zICkKLSAgewotICAgIGNvbnN0IEZUX091dGxpbmUqICBvdXRsaW5lICAgID0gKGNvbnN0IEZUX091dGxpbmUqKXBhcmFtcy0+c291cmNlOwotICAgIGNvbnN0IEZUX0JpdG1hcCogICB0YXJnZXRfbWFwID0gcGFyYW1zLT50YXJnZXQ7Ci0KLSAgICBibGFja19UV29ya2VyICB3b3JrZXJbMV07Ci0KLSAgICBMb25nICBidWZmZXJbRlRfTUFYKCBGVF9SRU5ERVJfUE9PTF9TSVpFLCAyMDQ4ICkgLyBzaXplb2YgKCBMb25nICldOwotCi0KLSAgICBpZiAoICFyYXN0ZXIgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBOb3RfSW5pICk7Ci0KLSAgICBpZiAoICFvdXRsaW5lICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZCApOwotCi0gICAgLyogcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZSBvdXRsaW5lIGlzIGVtcHR5ICovCi0gICAgaWYgKCBvdXRsaW5lLT5uX3BvaW50cyA9PSAwIHx8IG91dGxpbmUtPm5fY29udG91cnMgPD0gMCApCi0gICAgICByZXR1cm4gUmFzdGVyX0Vycl9Ob25lOwotCi0gICAgaWYgKCAhb3V0bGluZS0+Y29udG91cnMgfHwgIW91dGxpbmUtPnBvaW50cyApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWQgKTsKLQotICAgIGlmICggb3V0bGluZS0+bl9wb2ludHMgIT0KLSAgICAgICAgICAgb3V0bGluZS0+Y29udG91cnNbb3V0bGluZS0+bl9jb250b3VycyAtIDFdICsgMSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWQgKTsKLQotICAgIC8qIHRoaXMgdmVyc2lvbiBvZiB0aGUgcmFzdGVyIGRvZXMgbm90IHN1cHBvcnQgZGlyZWN0IHJlbmRlcmluZywgc29ycnkgKi8KLSAgICBpZiAoIHBhcmFtcy0+ZmxhZ3MgJiBGVF9SQVNURVJfRkxBR19ESVJFQ1QgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbnN1cHBvcnRlZCApOwotCi0gICAgaWYgKCBwYXJhbXMtPmZsYWdzICYgRlRfUkFTVEVSX0ZMQUdfQUEgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbnN1cHBvcnRlZCApOwotCi0gICAgaWYgKCAhdGFyZ2V0X21hcCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWQgKTsKLQotICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgICBpZiAoICF0YXJnZXRfbWFwLT53aWR0aCB8fCAhdGFyZ2V0X21hcC0+cm93cyApCi0gICAgICByZXR1cm4gUmFzdGVyX0Vycl9Ob25lOwotCi0gICAgaWYgKCAhdGFyZ2V0X21hcC0+YnVmZmVyICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZCApOwotCi0gICAgcmFzLm91dGxpbmUgPSAqb3V0bGluZTsKLSAgICByYXMudGFyZ2V0ICA9ICp0YXJnZXRfbWFwOwotCi0gICAgd29ya2VyLT5idWZmICAgICA9IGJ1ZmZlcjsKLSAgICB3b3JrZXItPnNpemVCdWZmID0gKCZidWZmZXIpWzFdOyAvKiBQb2ludHMgdG8gcmlnaHQgYWZ0ZXIgYnVmZmVyLiAqLwotCi0gICAgcmV0dXJuIFJlbmRlcl9HbHlwaCggUkFTX1ZBUiApOwotICB9Ci0KLQotICBGVF9ERUZJTkVfUkFTVEVSX0ZVTkNTKAotICAgIGZ0X3N0YW5kYXJkX3Jhc3RlciwKLQotICAgIEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FLAotCi0gICAgKEZUX1Jhc3Rlcl9OZXdfRnVuYykgICAgIGZ0X2JsYWNrX25ldywKLSAgICAoRlRfUmFzdGVyX1Jlc2V0X0Z1bmMpICAgZnRfYmxhY2tfcmVzZXQsCi0gICAgKEZUX1Jhc3Rlcl9TZXRfTW9kZV9GdW5jKWZ0X2JsYWNrX3NldF9tb2RlLAotICAgIChGVF9SYXN0ZXJfUmVuZGVyX0Z1bmMpICBmdF9ibGFja19yZW5kZXIsCi0gICAgKEZUX1Jhc3Rlcl9Eb25lX0Z1bmMpICAgIGZ0X2JsYWNrX2RvbmUgKQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9mdHJhc3Rlci5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9mdHJhc3Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjcwZDQ4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9yYXN0ZXIvZnRyYXN0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cmFzdGVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgZ2x5cGggcmFzdGVyaXplciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQgICAgICAgICovCi0vKiAgbW9kaWZpZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUUkFTVEVSX0hfXwotI2RlZmluZSBfX0ZUUkFTVEVSX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICi0jaW5jbHVkZSBGVF9JTUFHRV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgaWYgeW91IGFyZSB1c2luZyBmdHJhc3Rlci5jIGFzIGEgICAgICAgICAqLwotICAvKiBzdGFuZGFsb25lIG1vZHVsZSwgZnVsbHkgaW5kZXBlbmRlbnQgb2YgRnJlZVR5cGUuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAjZGVmaW5lIF9TVEFOREFMT05FXyAqLwotCi0gIEZUX0VYUE9SVF9WQVIoIGNvbnN0IEZUX1Jhc3Rlcl9GdW5jcyApICBmdF9zdGFuZGFyZF9yYXN0ZXI7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19GVFJBU1RFUl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9yYXN0ZXIvZnRyZW5kMS5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9mdHJlbmQxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMTQzOTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9mdHJlbmQxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRyZW5kMS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBnbHlwaCByYXN0ZXJpemVyIGludGVyZmFjZSAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSAiZnRyZW5kMS5oIgotI2luY2x1ZGUgImZ0cmFzdGVyLmgiCi0jaW5jbHVkZSAicmFzdHBpYy5oIgotCi0jaW5jbHVkZSAicmFzdGVycnMuaCIKLQotCi0gIC8qIGluaXRpYWxpemUgcmVuZGVyZXIgLS0gaW5pdCBpdHMgcmFzdGVyICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9yYXN0ZXIxX2luaXQoIEZUX1JlbmRlcmVyICByZW5kZXIgKQotICB7Ci0gICAgRlRfTGlicmFyeSAgbGlicmFyeSA9IEZUX01PRFVMRV9MSUJSQVJZKCByZW5kZXIgKTsKLQotCi0gICAgcmVuZGVyLT5jbGF6ei0+cmFzdGVyX2NsYXNzLT5yYXN0ZXJfcmVzZXQoIHJlbmRlci0+cmFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5LT5yYXN0ZXJfcG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeS0+cmFzdGVyX3Bvb2xfc2l6ZSApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyogc2V0IHJlbmRlci1zcGVjaWZpYyBtb2RlICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9yYXN0ZXIxX3NldF9tb2RlKCBGVF9SZW5kZXJlciAgcmVuZGVyLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgbW9kZV90YWcsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1BvaW50ZXIgICBkYXRhICkKLSAgewotICAgIC8qIHdlIHNpbXBseSBwYXNzIGl0IHRvIHRoZSByYXN0ZXIgKi8KLSAgICByZXR1cm4gcmVuZGVyLT5jbGF6ei0+cmFzdGVyX2NsYXNzLT5yYXN0ZXJfc2V0X21vZGUoIHJlbmRlci0+cmFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZV90YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICk7Ci0gIH0KLQotCi0gIC8qIHRyYW5zZm9ybSBhIGdpdmVuIGdseXBoIGltYWdlICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9yYXN0ZXIxX3RyYW5zZm9ybSggRlRfUmVuZGVyZXIgICAgICAgcmVuZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAgICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX01hdHJpeCogIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIGRlbHRhICkKLSAgewotICAgIEZUX0Vycm9yIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoIHNsb3QtPmZvcm1hdCAhPSByZW5kZXItPmdseXBoX2Zvcm1hdCApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggbWF0cml4ICkKLSAgICAgIEZUX091dGxpbmVfVHJhbnNmb3JtKCAmc2xvdC0+b3V0bGluZSwgbWF0cml4ICk7Ci0KLSAgICBpZiAoIGRlbHRhICkKLSAgICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCAmc2xvdC0+b3V0bGluZSwgZGVsdGEtPngsIGRlbHRhLT55ICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIHJldHVybiB0aGUgZ2x5cGgncyBjb250cm9sIGJveCAqLwotICBzdGF0aWMgdm9pZAotICBmdF9yYXN0ZXIxX2dldF9jYm94KCBGVF9SZW5kZXJlciAgIHJlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICBzbG90LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9CQm94KiAgICAgIGNib3ggKQotICB7Ci0gICAgRlRfTUVNX1pFUk8oIGNib3gsIHNpemVvZiAoICpjYm94ICkgKTsKLQotICAgIGlmICggc2xvdC0+Zm9ybWF0ID09IHJlbmRlci0+Z2x5cGhfZm9ybWF0ICkKLSAgICAgIEZUX091dGxpbmVfR2V0X0NCb3goICZzbG90LT5vdXRsaW5lLCBjYm94ICk7Ci0gIH0KLQotCi0gIC8qIGNvbnZlcnQgYSBzbG90J3MgZ2x5cGggaW1hZ2UgaW50byBhIGJpdG1hcCAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfcmFzdGVyMV9yZW5kZXIoIEZUX1JlbmRlcmVyICAgICAgIHJlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgICBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgb3JpZ2luICkKLSAgewotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICBGVF9PdXRsaW5lKiAgb3V0bGluZTsKLSAgICBGVF9CQm94ICAgICAgY2JveCwgY2JveDA7Ci0gICAgRlRfVUludCAgICAgIHdpZHRoLCBoZWlnaHQsIHBpdGNoOwotICAgIEZUX0JpdG1hcCogICBiaXRtYXA7Ci0gICAgRlRfTWVtb3J5ICAgIG1lbW9yeTsKLQotICAgIEZUX1Jhc3Rlcl9QYXJhbXMgIHBhcmFtczsKLQotCi0gICAgLyogY2hlY2sgZ2x5cGggaW1hZ2UgZm9ybWF0ICovCi0gICAgaWYgKCBzbG90LT5mb3JtYXQgIT0gcmVuZGVyLT5nbHlwaF9mb3JtYXQgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayByZW5kZXJpbmcgbW9kZSAqLwotICAgIGlmICggbW9kZSAhPSBGVF9SRU5ERVJfTU9ERV9NT05PICkKLSAgICB7Ci0gICAgICAvKiByYXN0ZXIxIGlzIG9ubHkgY2FwYWJsZSBvZiBwcm9kdWNpbmcgbW9ub2Nocm9tZSBiaXRtYXBzICovCi0gICAgICByZXR1cm4gRlRfVEhST1coIENhbm5vdF9SZW5kZXJfR2x5cGggKTsKLSAgICB9Ci0KLSAgICBvdXRsaW5lID0gJnNsb3QtPm91dGxpbmU7Ci0KLSAgICAvKiB0cmFuc2xhdGUgdGhlIG91dGxpbmUgdG8gdGhlIG5ldyBvcmlnaW4gaWYgbmVlZGVkICovCi0gICAgaWYgKCBvcmlnaW4gKQotICAgICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoIG91dGxpbmUsIG9yaWdpbi0+eCwgb3JpZ2luLT55ICk7Ci0KLSAgICAvKiBjb21wdXRlIHRoZSBjb250cm9sIGJveCwgYW5kIGdyaWQgZml0IGl0ICovCi0gICAgRlRfT3V0bGluZV9HZXRfQ0JveCggb3V0bGluZSwgJmNib3gwICk7Ci0KLSAgICAvKiB1bmRvY3VtZW50ZWQgYnV0IGNvbmZpcm1lZDogYmJveCB2YWx1ZXMgZ2V0IHJvdW5kZWQgKi8KLSNpZiAxCi0gICAgY2JveC54TWluID0gRlRfUElYX1JPVU5EKCBjYm94MC54TWluICk7Ci0gICAgY2JveC55TWluID0gRlRfUElYX1JPVU5EKCBjYm94MC55TWluICk7Ci0gICAgY2JveC54TWF4ID0gRlRfUElYX1JPVU5EKCBjYm94MC54TWF4ICk7Ci0gICAgY2JveC55TWF4ID0gRlRfUElYX1JPVU5EKCBjYm94MC55TWF4ICk7Ci0jZWxzZQotICAgIGNib3gueE1pbiA9IEZUX1BJWF9GTE9PUiggY2JveC54TWluICk7Ci0gICAgY2JveC55TWluID0gRlRfUElYX0ZMT09SKCBjYm94LnlNaW4gKTsKLSAgICBjYm94LnhNYXggPSBGVF9QSVhfQ0VJTCggY2JveC54TWF4ICk7Ci0gICAgY2JveC55TWF4ID0gRlRfUElYX0NFSUwoIGNib3gueU1heCApOwotI2VuZGlmCi0KLSAgICAvKiBJZiBlaXRoZXIgYHdpZHRoJyBvciBgaGVpZ2h0JyByb3VuZCB0byAwLCB0cnkgICAgKi8KLSAgICAvKiBleHBsaWNpdGx5IHJvdW5kaW5nIHVwL2Rvd24uICBJbiB0aGUgY2FzZSBvZiAgICAgKi8KLSAgICAvKiBnbHlwaHMgY29udGFpbmluZyBvbmx5IG9uZSB2ZXJ5IG5hcnJvdyBmZWF0dXJlLCAgKi8KLSAgICAvKiB0aGlzIGdpdmVzIHRoZSBkcm9wLW91dCBjb21wZW5zYXRpb24gaW4gdGhlIHNjYW4gKi8KLSAgICAvKiBjb252ZXJzaW9uIGNvZGUgYSBjaGFuY2UgdG8gZG8gaXRzIHN0dWZmLiAgICAgICAgKi8KLSAgICB3aWR0aCAgPSAoRlRfVUludCkoICggY2JveC54TWF4IC0gY2JveC54TWluICkgPj4gNiApOwotICAgIGlmICggd2lkdGggPT0gMCApCi0gICAgewotICAgICAgY2JveC54TWluID0gRlRfUElYX0ZMT09SKCBjYm94MC54TWluICk7Ci0gICAgICBjYm94LnhNYXggPSBGVF9QSVhfQ0VJTCggY2JveDAueE1heCApOwotCi0gICAgICB3aWR0aCA9IChGVF9VSW50KSggKCBjYm94LnhNYXggLSBjYm94LnhNaW4gKSA+PiA2ICk7Ci0gICAgfQotCi0gICAgaGVpZ2h0ID0gKEZUX1VJbnQpKCAoIGNib3gueU1heCAtIGNib3gueU1pbiApID4+IDYgKTsKLSAgICBpZiAoIGhlaWdodCA9PSAwICkKLSAgICB7Ci0gICAgICBjYm94LnlNaW4gPSBGVF9QSVhfRkxPT1IoIGNib3gwLnlNaW4gKTsKLSAgICAgIGNib3gueU1heCA9IEZUX1BJWF9DRUlMKCBjYm94MC55TWF4ICk7Ci0KLSAgICAgIGhlaWdodCA9IChGVF9VSW50KSggKCBjYm94LnlNYXggLSBjYm94LnlNaW4gKSA+PiA2ICk7Ci0gICAgfQotCi0gICAgaWYgKCB3aWR0aCA+IEZUX1VTSE9SVF9NQVggfHwgaGVpZ2h0ID4gRlRfVVNIT1JUX01BWCApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGJpdG1hcCA9ICZzbG90LT5iaXRtYXA7Ci0gICAgbWVtb3J5ID0gcmVuZGVyLT5yb290Lm1lbW9yeTsKLQotICAgIC8qIHJlbGVhc2Ugb2xkIGJpdG1hcCBidWZmZXIgKi8KLSAgICBpZiAoIHNsb3QtPmludGVybmFsLT5mbGFncyAmIEZUX0dMWVBIX09XTl9CSVRNQVAgKQotICAgIHsKLSAgICAgIEZUX0ZSRUUoIGJpdG1hcC0+YnVmZmVyICk7Ci0gICAgICBzbG90LT5pbnRlcm5hbC0+ZmxhZ3MgJj0gfkZUX0dMWVBIX09XTl9CSVRNQVA7Ci0gICAgfQotCi0gICAgcGl0Y2ggICAgICAgICAgICAgID0gKCAoIHdpZHRoICsgMTUgKSA+PiA0ICkgPDwgMTsKLSAgICBiaXRtYXAtPnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX01PTk87Ci0KLSAgICBiaXRtYXAtPndpZHRoID0gd2lkdGg7Ci0gICAgYml0bWFwLT5yb3dzICA9IGhlaWdodDsKLSAgICBiaXRtYXAtPnBpdGNoID0gKGludClwaXRjaDsKLQotICAgIGlmICggRlRfQUxMT0NfTVVMVCggYml0bWFwLT5idWZmZXIsIHBpdGNoLCBoZWlnaHQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBzbG90LT5pbnRlcm5hbC0+ZmxhZ3MgfD0gRlRfR0xZUEhfT1dOX0JJVE1BUDsKLQotICAgIC8qIHRyYW5zbGF0ZSBvdXRsaW5lIHRvIHJlbmRlciBpdCBpbnRvIHRoZSBiaXRtYXAgKi8KLSAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggb3V0bGluZSwgLWNib3gueE1pbiwgLWNib3gueU1pbiApOwotCi0gICAgLyogc2V0IHVwIHBhcmFtZXRlcnMgKi8KLSAgICBwYXJhbXMudGFyZ2V0ID0gYml0bWFwOwotICAgIHBhcmFtcy5zb3VyY2UgPSBvdXRsaW5lOwotICAgIHBhcmFtcy5mbGFncyAgPSAwOwotCi0gICAgLyogcmVuZGVyIG91dGxpbmUgaW50byB0aGUgYml0bWFwICovCi0gICAgZXJyb3IgPSByZW5kZXItPnJhc3Rlcl9yZW5kZXIoIHJlbmRlci0+cmFzdGVyLCAmcGFyYW1zICk7Ci0KLSAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggb3V0bGluZSwgY2JveC54TWluLCBjYm94LnlNaW4gKTsKLQotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgc2xvdC0+Zm9ybWF0ICAgICAgPSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQOwotICAgIHNsb3QtPmJpdG1hcF9sZWZ0ID0gKEZUX0ludCkoIGNib3gueE1pbiA+PiA2ICk7Ci0gICAgc2xvdC0+Yml0bWFwX3RvcCAgPSAoRlRfSW50KSggY2JveC55TWF4ID4+IDYgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfREVGSU5FX1JFTkRFUkVSKCBmdF9yYXN0ZXIxX3JlbmRlcmVyX2NsYXNzLAotCi0gICAgICBGVF9NT0RVTEVfUkVOREVSRVIsCi0gICAgICBzaXplb2YgKCBGVF9SZW5kZXJlclJlYyApLAotCi0gICAgICAicmFzdGVyMSIsCi0gICAgICAweDEwMDAwTCwKLSAgICAgIDB4MjAwMDBMLAotCi0gICAgICAwLCAgICAvKiBtb2R1bGUgc3BlY2lmaWMgaW50ZXJmYWNlICovCi0KLSAgICAgIChGVF9Nb2R1bGVfQ29uc3RydWN0b3IpZnRfcmFzdGVyMV9pbml0LAotICAgICAgKEZUX01vZHVsZV9EZXN0cnVjdG9yKSAwLAotICAgICAgKEZUX01vZHVsZV9SZXF1ZXN0ZXIpICAwCi0gICAgLAotCi0gICAgRlRfR0xZUEhfRk9STUFUX09VVExJTkUsCi0KLSAgICAoRlRfUmVuZGVyZXJfUmVuZGVyRnVuYykgICBmdF9yYXN0ZXIxX3JlbmRlciwKLSAgICAoRlRfUmVuZGVyZXJfVHJhbnNmb3JtRnVuYylmdF9yYXN0ZXIxX3RyYW5zZm9ybSwKLSAgICAoRlRfUmVuZGVyZXJfR2V0Q0JveEZ1bmMpICBmdF9yYXN0ZXIxX2dldF9jYm94LAotICAgIChGVF9SZW5kZXJlcl9TZXRNb2RlRnVuYykgIGZ0X3Jhc3RlcjFfc2V0X21vZGUsCi0KLSAgICAoRlRfUmFzdGVyX0Z1bmNzKikgICAgJkZUX1NUQU5EQVJEX1JBU1RFUl9HRVQKLSAgKQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9mdHJlbmQxLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL2Z0cmVuZDEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRjNWQxMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL2Z0cmVuZDEuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0cmVuZDEuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgZ2x5cGggcmFzdGVyaXplciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX0ZUUkVORDFfSF9fCi0jZGVmaW5lIF9fRlRSRU5EMV9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1JFTkRFUl9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICBGVF9ERUNMQVJFX1JFTkRFUkVSKCBmdF9yYXN0ZXIxX3JlbmRlcmVyX2NsYXNzICkKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUUkVORDFfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL3Jhc3Rlci5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9yYXN0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiYjE2ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL3Jhc3Rlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcmFzdGVyLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIG1vbm9jaHJvbWUgcmFzdGVyZXIgbW9kdWxlIGNvbXBvbmVudCAoYm9keSBvbmx5KS4gICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAicmFzdHBpYy5jIgotI2luY2x1ZGUgImZ0cmFzdGVyLmMiCi0jaW5jbHVkZSAiZnRyZW5kMS5jIgotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9yYXN0ZXJycy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9yYXN0ZXJycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2YwMGJjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9yYXN0ZXIvcmFzdGVycnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHJhc3RlcnJzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBtb25vY2hyb21lIHJlbmRlcmVyIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgbW9ub2Nocm9tZSByZW5kZXJlciBlcnJvciBlbnVtZXJhdGlvbiAqLwotICAvKiBjb25zdGFudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fUkFTVEVSUlNfSF9fCi0jZGVmaW5lIF9fUkFTVEVSUlNfSF9fCi0KLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAotCi0jdW5kZWYgX19GVEVSUk9SU19IX18KLQotI3VuZGVmICBGVF9FUlJfUFJFRklYCi0jZGVmaW5lIEZUX0VSUl9QUkVGSVggIFJhc3Rlcl9FcnJfCi0jZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfUmFzdGVyCi0KLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0KLSNlbmRpZiAvKiBfX1JBU1RFUlJTX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9yYXN0cGljLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL3Jhc3RwaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlN2VjMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvcmFzdGVyL3Jhc3RwaWMuYworKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHJhc3RwaWMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3IgcmFzdGVyIG1vZHVsZS4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlICJyYXN0cGljLmgiCi0jaW5jbHVkZSAicmFzdGVycnMuaCIKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotICAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIFBJQyBpbml0IGZ1bmN0aW9ucyBmcm9tIGZ0cmFzdGVyLmMgKi8KLSAgdm9pZAotICBGVF9Jbml0X0NsYXNzX2Z0X3N0YW5kYXJkX3Jhc3RlciggRlRfUmFzdGVyX0Z1bmNzKiAgZnVuY3MgKTsKLQotCi0gIHZvaWQKLSAgZnRfcmFzdGVyMV9yZW5kZXJlcl9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9QSUNfQ29udGFpbmVyKiAgcGljX2NvbnRhaW5lciA9ICZsaWJyYXJ5LT5waWNfY29udGFpbmVyOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICBpZiAoIHBpY19jb250YWluZXItPnJhc3RlciApCi0gICAgewotICAgICAgUmFzdGVyUElDKiAgY29udGFpbmVyID0gKFJhc3RlclBJQyopcGljX2NvbnRhaW5lci0+cmFzdGVyOwotCi0KLSAgICAgIGlmICggLS1jb250YWluZXItPnJlZl9jb3VudCApCi0gICAgICAgIHJldHVybjsKLSAgICAgIEZUX0ZSRUUoIGNvbnRhaW5lciApOwotICAgICAgcGljX2NvbnRhaW5lci0+cmFzdGVyID0gTlVMTDsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0Vycm9yCi0gIGZ0X3Jhc3RlcjFfcmVuZGVyZXJfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgRlRfUElDX0NvbnRhaW5lciogIHBpY19jb250YWluZXIgPSAmbGlicmFyeS0+cGljX2NvbnRhaW5lcjsKLSAgICBGVF9FcnJvciAgICAgICAgICAgZXJyb3IgICAgICAgICA9IEZUX0Vycl9PazsKLSAgICBSYXN0ZXJQSUMqICAgICAgICAgY29udGFpbmVyICAgICA9IE5VTEw7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeSAgICAgICAgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLQotICAgIC8qIFhYWDogc2luY2UgdGhpcyBmdW5jdGlvbiBhbHNvIHNlcnZlZCB0aGUgbm8gbG9uZ2VyIGF2YWlsYWJsZSAgKi8KLSAgICAvKiAgICAgIHJhc3RlcjUgcmVuZGVyZXIgaXQgdXNlcyByZWZlcmVuY2UgY291bnRpbmcsIHdoaWNoIGNvdWxkICovCi0gICAgLyogICAgICBiZSByZW1vdmVkIG5vdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggcGljX2NvbnRhaW5lci0+cmFzdGVyICkKLSAgICB7Ci0gICAgICAoKFJhc3RlclBJQyopcGljX2NvbnRhaW5lci0+cmFzdGVyKS0+cmVmX2NvdW50Kys7Ci0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgLyogYWxsb2NhdGUgcG9pbnRlciwgY2xlYXIgYW5kIHNldCBnbG9iYWwgY29udGFpbmVyIHBvaW50ZXIgKi8KLSAgICBpZiAoIEZUX0FMTE9DKCBjb250YWluZXIsIHNpemVvZiAoICpjb250YWluZXIgKSApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICBGVF9NRU1fU0VUKCBjb250YWluZXIsIDAsIHNpemVvZiAoICpjb250YWluZXIgKSApOwotICAgIHBpY19jb250YWluZXItPnJhc3RlciA9IGNvbnRhaW5lcjsKLQotICAgIGNvbnRhaW5lci0+cmVmX2NvdW50ID0gMTsKLQotICAgIC8qIGluaXRpYWxpemUgcG9pbnRlciB0YWJsZSAtICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIHRoaXMgaXMgaG93IHRoZSBtb2R1bGUgdXN1YWxseSBleHBlY3RzIHRoaXMgZGF0YSAqLwotICAgIEZUX0luaXRfQ2xhc3NfZnRfc3RhbmRhcmRfcmFzdGVyKCAmY29udGFpbmVyLT5mdF9zdGFuZGFyZF9yYXN0ZXIgKTsKLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9yYXN0ZXIvcmFzdHBpYy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9yYXN0cGljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwODk5NmEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Jhc3Rlci9yYXN0cGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICByYXN0cGljLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIHJhc3RlciBtb2R1bGUuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19SQVNUUElDX0hfXwotI2RlZmluZSBfX1JBU1RQSUNfSF9fCi0KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfUElDX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0jZGVmaW5lIEZUX1NUQU5EQVJEX1JBU1RFUl9HRVQgIGZ0X3N0YW5kYXJkX3Jhc3RlcgotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gIHR5cGVkZWYgc3RydWN0ICBSYXN0ZXJQSUNfCi0gIHsKLSAgICBpbnQgICAgICAgICAgICAgIHJlZl9jb3VudDsKLSAgICBGVF9SYXN0ZXJfRnVuY3MgIGZ0X3N0YW5kYXJkX3Jhc3RlcjsKLQotICB9IFJhc3RlclBJQzsKLQotCi0jZGVmaW5lIEdFVF9QSUMoIGxpYiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKFJhc3RlclBJQyopKCAobGliKS0+cGljX2NvbnRhaW5lci5yYXN0ZXIgKSApCi0jZGVmaW5lIEZUX1NUQU5EQVJEX1JBU1RFUl9HRVQgICggR0VUX1BJQyggbGlicmFyeSApLT5mdF9zdGFuZGFyZF9yYXN0ZXIgKQotCi0KLSAgLyogc2VlIHJhc3RwaWMuYyBmb3IgdGhlIGltcGxlbWVudGF0aW9uICovCi0gIHZvaWQKLSAgZnRfcmFzdGVyMV9yZW5kZXJlcl9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0gIEZUX0Vycm9yCi0gIGZ0X3Jhc3RlcjFfcmVuZGVyZXJfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAvKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1JBU1RQSUNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9KYW1maWxlIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5OGQxMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotIyBGcmVlVHlwZSAyIHNyYy9zZm50IEphbWZpbGUKLSMKLSMgQ29weXJpZ2h0IDIwMDEtMjAxNSBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLVN1YkRpciAgRlQyX1RPUCAkKEZUMl9TUkNfRElSKSBzZm50IDsKLQotewotICBsb2NhbCAgX3NvdXJjZXMgOwotCi0gIGlmICQoRlQyX01VTFRJKQotICB7Ci0gICAgX3NvdXJjZXMgPSBwbmdzaGltCi0gICAgICAgICAgICAgICBzZmRyaXZlcgotICAgICAgICAgICAgICAgc2ZudHBpYwotICAgICAgICAgICAgICAgc2ZvYmpzCi0gICAgICAgICAgICAgICB0dGJkZgotICAgICAgICAgICAgICAgdHRjbWFwCi0gICAgICAgICAgICAgICB0dGtlcm4KLSAgICAgICAgICAgICAgIHR0bG9hZAotICAgICAgICAgICAgICAgdHRtdHgKLSAgICAgICAgICAgICAgIHR0cG9zdAotICAgICAgICAgICAgICAgdHRzYml0Ci0gICAgICAgICAgICAgICA7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgX3NvdXJjZXMgPSBzZm50IDsKLSAgfQotCi0gIExpYnJhcnkgICQoRlQyX0xJQikgOiAkKF9zb3VyY2VzKS5jIDsKLX0KLQotIyBlbmQgb2Ygc3JjL3NmbnQgSmFtZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvcG5nc2hpbS5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvcG5nc2hpbS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTYwNDUyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3BuZ3NoaW0uYworKysgL2Rldi9udWxsCkBAIC0xLDM3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwbmdzaGltLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUE5HIEJpdG1hcCBnbHlwaCBzdXBwb3J0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMTMtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEdvb2dsZSwgSW5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXcml0dGVuIGJ5IFN0dWFydCBHaWxsIGFuZCBCZWhkYWQgRXNmYWhib2QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLSNpbmNsdWRlIEZUX0NPTkZJR19TVEFOREFSRF9MSUJSQVJZX0gKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9VU0VfUE5HCi0KLSAgLyogV2UgYWx3YXlzIGluY2x1ZGUgPHN0am1wLmg+LCBzbyBtYWtlIGxpYnBuZyBzaHV0IHVwISAqLwotI2RlZmluZSBQTkdfU0tJUF9TRVRKTVBfQ0hFQ0sgMQotI2luY2x1ZGUgPHBuZy5oPgotI2luY2x1ZGUgInBuZ3NoaW0uaCIKLQotI2luY2x1ZGUgInNmZXJyb3JzLmgiCi0KLQotICAvKiBUaGlzIGNvZGUgaXMgZnJlZWx5IGJhc2VkIG9uIGNhaXJvLXBuZy5jLiAgVGhlcmUncyBzbyBtYW55IHdheXMgKi8KLSAgLyogdG8gY2FsbCBsaWJwbmcsIGFuZCB0aGUgd2F5IGNhaXJvIGRvZXMgaXQgaXMgZGVmYWN0byBzdGFuZGFyZC4gICovCi0KLSAgc3RhdGljIHVuc2lnbmVkIGludAotICBtdWx0aXBseV9hbHBoYSggdW5zaWduZWQgaW50ICBhbHBoYSwKLSAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAgY29sb3IgKQotICB7Ci0gICAgdW5zaWduZWQgaW50ICB0ZW1wID0gYWxwaGEgKiBjb2xvciArIDB4ODA7Ci0KLQotICAgIHJldHVybiAoIHRlbXAgKyAoIHRlbXAgPj4gOCApICkgPj4gODsKLSAgfQotCi0KLSAgLyogUHJlbXVsdGlwbGllcyBkYXRhIGFuZCBjb252ZXJ0cyBSR0JBIGJ5dGVzID0+IG5hdGl2ZSBlbmRpYW4uICovCi0gIHN0YXRpYyB2b2lkCi0gIHByZW11bHRpcGx5X2RhdGEoIHBuZ19zdHJ1Y3RwICAgIHBuZywKLSAgICAgICAgICAgICAgICAgICAgcG5nX3Jvd19pbmZvcCAgcm93X2luZm8sCi0gICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlcCAgICAgIGRhdGEgKQotICB7Ci0gICAgdW5zaWduZWQgaW50ICBpOwotCi0gICAgRlRfVU5VU0VEKCBwbmcgKTsKLQotCi0gICAgZm9yICggaSA9IDA7IGkgPCByb3dfaW5mby0+cm93Ynl0ZXM7IGkgKz0gNCApCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciogIGJhc2UgID0gJmRhdGFbaV07Ci0gICAgICB1bnNpZ25lZCBpbnQgICAgYWxwaGEgPSBiYXNlWzNdOwotCi0KLSAgICAgIGlmICggYWxwaGEgPT0gMCApCi0gICAgICAgIGJhc2VbMF0gPSBiYXNlWzFdID0gYmFzZVsyXSA9IGJhc2VbM10gPSAwOwotCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHVuc2lnbmVkIGludCAgcmVkICAgPSBiYXNlWzBdOwotICAgICAgICB1bnNpZ25lZCBpbnQgIGdyZWVuID0gYmFzZVsxXTsKLSAgICAgICAgdW5zaWduZWQgaW50ICBibHVlICA9IGJhc2VbMl07Ci0KLQotICAgICAgICBpZiAoIGFscGhhICE9IDB4RkYgKQotICAgICAgICB7Ci0gICAgICAgICAgcmVkICAgPSBtdWx0aXBseV9hbHBoYSggYWxwaGEsIHJlZCAgICk7Ci0gICAgICAgICAgZ3JlZW4gPSBtdWx0aXBseV9hbHBoYSggYWxwaGEsIGdyZWVuICk7Ci0gICAgICAgICAgYmx1ZSAgPSBtdWx0aXBseV9hbHBoYSggYWxwaGEsIGJsdWUgICk7Ci0gICAgICAgIH0KLQotICAgICAgICBiYXNlWzBdID0gKHVuc2lnbmVkIGNoYXIpYmx1ZTsKLSAgICAgICAgYmFzZVsxXSA9ICh1bnNpZ25lZCBjaGFyKWdyZWVuOwotICAgICAgICBiYXNlWzJdID0gKHVuc2lnbmVkIGNoYXIpcmVkOwotICAgICAgICBiYXNlWzNdID0gKHVuc2lnbmVkIGNoYXIpYWxwaGE7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKiBDb252ZXJ0cyBSR0J4IGJ5dGVzIHRvIEJHUkEuICovCi0gIHN0YXRpYyB2b2lkCi0gIGNvbnZlcnRfYnl0ZXNfdG9fZGF0YSggcG5nX3N0cnVjdHAgICAgcG5nLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19yb3dfaW5mb3AgIHJvd19pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19ieXRlcCAgICAgIGRhdGEgKQotICB7Ci0gICAgdW5zaWduZWQgaW50ICBpOwotCi0gICAgRlRfVU5VU0VEKCBwbmcgKTsKLQotCi0gICAgZm9yICggaSA9IDA7IGkgPCByb3dfaW5mby0+cm93Ynl0ZXM7IGkgKz0gNCApCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciogIGJhc2UgID0gJmRhdGFbaV07Ci0gICAgICB1bnNpZ25lZCBpbnQgICAgcmVkICAgPSBiYXNlWzBdOwotICAgICAgdW5zaWduZWQgaW50ICAgIGdyZWVuID0gYmFzZVsxXTsKLSAgICAgIHVuc2lnbmVkIGludCAgICBibHVlICA9IGJhc2VbMl07Ci0KLQotICAgICAgYmFzZVswXSA9ICh1bnNpZ25lZCBjaGFyKWJsdWU7Ci0gICAgICBiYXNlWzFdID0gKHVuc2lnbmVkIGNoYXIpZ3JlZW47Ci0gICAgICBiYXNlWzJdID0gKHVuc2lnbmVkIGNoYXIpcmVkOwotICAgICAgYmFzZVszXSA9IDB4RkY7Ci0gICAgfQotICB9Ci0KLQotICAvKiBVc2UgZXJyb3IgY2FsbGJhY2sgdG8gYXZvaWQgcG5nIHdyaXRpbmcgdG8gc3RkZXJyLiAqLwotICBzdGF0aWMgdm9pZAotICBlcnJvcl9jYWxsYmFjayggcG5nX3N0cnVjdHAgICAgICBwbmcsCi0gICAgICAgICAgICAgICAgICBwbmdfY29uc3RfY2hhcnAgIGVycm9yX21zZyApCi0gIHsKLSAgICBGVF9FcnJvciogIGVycm9yID0gKEZUX0Vycm9yKilwbmdfZ2V0X2Vycm9yX3B0ciggcG5nICk7Ci0KLSAgICBGVF9VTlVTRUQoIGVycm9yX21zZyApOwotCi0KLSAgICAqZXJyb3IgPSBGVF9USFJPVyggT3V0X09mX01lbW9yeSApOwotI2lmZGVmIFBOR19TRVRKTVBfU1VQUE9SVEVECi0gICAgZnRfbG9uZ2ptcCggcG5nX2ptcGJ1ZiggcG5nICksIDEgKTsKLSNlbmRpZgotICAgIC8qIGlmIHdlIGdldCBoZXJlLCB0aGVuIHdlIGhhdmUgbm8gY2hvaWNlIGJ1dCB0byBhYm9ydCAuLi4gKi8KLSAgfQotCi0KLSAgLyogVXNlIHdhcm5pbmcgY2FsbGJhY2sgdG8gYXZvaWQgcG5nIHdyaXRpbmcgdG8gc3RkZXJyLiAqLwotICBzdGF0aWMgdm9pZAotICB3YXJuaW5nX2NhbGxiYWNrKCBwbmdfc3RydWN0cCAgICAgIHBuZywKLSAgICAgICAgICAgICAgICAgICAgcG5nX2NvbnN0X2NoYXJwICBlcnJvcl9tc2cgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBwbmcgKTsKLSAgICBGVF9VTlVTRUQoIGVycm9yX21zZyApOwotCi0gICAgLyogSnVzdCBpZ25vcmUgd2FybmluZ3MuICovCi0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHJlYWRfZGF0YV9mcm9tX0ZUX1N0cmVhbSggcG5nX3N0cnVjdHAgIHBuZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfYnl0ZXAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfc2l6ZV90ICAgbGVuZ3RoICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgcG5nX3ZvaWRwICBwICAgICAgPSBwbmdfZ2V0X2lvX3B0ciggcG5nICk7Ci0gICAgRlRfU3RyZWFtICBzdHJlYW0gPSAoRlRfU3RyZWFtKXA7Ci0KLQotICAgIGlmICggRlRfRlJBTUVfRU5URVIoIGxlbmd0aCApICkKLSAgICB7Ci0gICAgICBGVF9FcnJvciogIGUgPSAoRlRfRXJyb3IqKXBuZ19nZXRfZXJyb3JfcHRyKCBwbmcgKTsKLQotCi0gICAgICAqZSA9IEZUX1RIUk9XKCBJbnZhbGlkX1N0cmVhbV9SZWFkICk7Ci0gICAgICBwbmdfZXJyb3IoIHBuZywgTlVMTCApOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbWVtY3B5KCBkYXRhLCBzdHJlYW0tPmN1cnNvciwgbGVuZ3RoICk7Ci0KLSAgICBGVF9GUkFNRV9FWElUKCk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBMb2FkX1NCaXRfUG5nKCBGVF9HbHlwaFNsb3QgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICAgeF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICAgeV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICAgcGl4X2JpdHMsCi0gICAgICAgICAgICAgICAgIFRUX1NCaXRfTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICBwbmdfbGVuLAotICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgIHBvcHVsYXRlX21hcF9hbmRfbWV0cmljcyApCi0gIHsKLSAgICBGVF9CaXRtYXAgICAgKm1hcCAgID0gJnNsb3QtPmJpdG1hcDsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX1N0cmVhbVJlYyAgc3RyZWFtOwotCi0gICAgcG5nX3N0cnVjdHAgIHBuZzsKLSAgICBwbmdfaW5mb3AgICAgaW5mbzsKLSAgICBwbmdfdWludF8zMiAgaW1nV2lkdGgsIGltZ0hlaWdodDsKLQotICAgIGludCAgICAgICAgIGJpdGRlcHRoLCBjb2xvcl90eXBlLCBpbnRlcmxhY2U7Ci0gICAgRlRfSW50ICAgICAgaTsKLSAgICBwbmdfYnl0ZSogICpyb3dzID0gTlVMTDsgLyogcGFjaWZ5IGNvbXBpbGVyICovCi0KLQotICAgIGlmICggeF9vZmZzZXQgPCAwIHx8Ci0gICAgICAgICB5X29mZnNldCA8IDAgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoICFwb3B1bGF0ZV9tYXBfYW5kX21ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICggKEZUX1VJbnQpeF9vZmZzZXQgKyBtZXRyaWNzLT53aWR0aCAgPiBtYXAtPndpZHRoIHx8Ci0gICAgICAgICAgIChGVF9VSW50KXlfb2Zmc2V0ICsgbWV0cmljcy0+aGVpZ2h0ID4gbWFwLT5yb3dzICB8fAotICAgICAgICAgICBwaXhfYml0cyAhPSAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgbWFwLT5waXhlbF9tb2RlICE9IEZUX1BJWEVMX01PREVfQkdSQSAgICAgICAgICAgICkgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBGVF9TdHJlYW1fT3Blbk1lbW9yeSggJnN0cmVhbSwgZGF0YSwgcG5nX2xlbiApOwotCi0gICAgcG5nID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCggUE5HX0xJQlBOR19WRVJfU1RSSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nX2NhbGxiYWNrICk7Ci0gICAgaWYgKCAhcG5nICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBPdXRfT2ZfTWVtb3J5ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaW5mbyA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QoIHBuZyApOwotICAgIGlmICggIWluZm8gKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIE91dF9PZl9NZW1vcnkgKTsKLSAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCAmcG5nLCBOVUxMLCBOVUxMICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBmdF9zZXRqbXAoIHBuZ19qbXBidWYoIHBuZyApICkgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRGVzdHJveUV4aXQ7Ci0gICAgfQotCi0gICAgcG5nX3NldF9yZWFkX2ZuKCBwbmcsICZzdHJlYW0sIHJlYWRfZGF0YV9mcm9tX0ZUX1N0cmVhbSApOwotCi0gICAgcG5nX3JlYWRfaW5mbyggcG5nLCBpbmZvICk7Ci0gICAgcG5nX2dldF9JSERSKCBwbmcsIGluZm8sCi0gICAgICAgICAgICAgICAgICAmaW1nV2lkdGgsICZpbWdIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAmYml0ZGVwdGgsICZjb2xvcl90eXBlLCAmaW50ZXJsYWNlLAotICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCApOwotCi0gICAgaWYgKCBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgKCAhcG9wdWxhdGVfbWFwX2FuZF9tZXRyaWNzICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICggKEZUX0ludClpbWdXaWR0aCAgIT0gbWV0cmljcy0+d2lkdGggIHx8Ci0gICAgICAgICAgICAgKEZUX0ludClpbWdIZWlnaHQgIT0gbWV0cmljcy0+aGVpZ2h0ICkgKSApCi0gICAgICBnb3RvIERlc3Ryb3lFeGl0OwotCi0gICAgaWYgKCBwb3B1bGF0ZV9tYXBfYW5kX21ldHJpY3MgKQotICAgIHsKLSAgICAgIEZUX1VMb25nICBzaXplOwotCi0KLSAgICAgIG1ldHJpY3MtPndpZHRoICA9IChGVF9VU2hvcnQpaW1nV2lkdGg7Ci0gICAgICBtZXRyaWNzLT5oZWlnaHQgPSAoRlRfVVNob3J0KWltZ0hlaWdodDsKLQotICAgICAgbWFwLT53aWR0aCAgICAgID0gbWV0cmljcy0+d2lkdGg7Ci0gICAgICBtYXAtPnJvd3MgICAgICAgPSBtZXRyaWNzLT5oZWlnaHQ7Ci0gICAgICBtYXAtPnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX0JHUkE7Ci0gICAgICBtYXAtPnBpdGNoICAgICAgPSAoaW50KSggbWFwLT53aWR0aCAqIDQgKTsKLSAgICAgIG1hcC0+bnVtX2dyYXlzICA9IDI1NjsKLQotICAgICAgLyogcmVqZWN0IHRvbyBsYXJnZSBiaXRtYXBzIHNpbWlsYXJseSB0byB0aGUgcmFzdGVyaXplciAqLwotICAgICAgaWYgKCBtYXAtPnJvd3MgPiAweDdGRkYgfHwgbWFwLT53aWR0aCA+IDB4N0ZGRiApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEFycmF5X1Rvb19MYXJnZSApOwotICAgICAgICBnb3RvIERlc3Ryb3lFeGl0OwotICAgICAgfQotCi0gICAgICAvKiB0aGlzIGRvZXNuJ3Qgb3ZlcmZsb3c6IDB4N0ZGRiAqIDB4N0ZGRiAqIDQgPCAyXjMyICovCi0gICAgICBzaXplID0gbWFwLT5yb3dzICogKEZUX1VMb25nKW1hcC0+cGl0Y2g7Ci0KLSAgICAgIGVycm9yID0gZnRfZ2x5cGhzbG90X2FsbG9jX2JpdG1hcCggc2xvdCwgc2l6ZSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRGVzdHJveUV4aXQ7Ci0gICAgfQotCi0gICAgLyogY29udmVydCBwYWxldHRlL2dyYXkgaW1hZ2UgdG8gcmdiICovCi0gICAgaWYgKCBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgKQotICAgICAgcG5nX3NldF9wYWxldHRlX3RvX3JnYiggcG5nICk7Ci0KLSAgICAvKiBleHBhbmQgZ3JheSBiaXQgZGVwdGggaWYgbmVlZGVkICovCi0gICAgaWYgKCBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVkgKQotICAgIHsKLSNpZiBQTkdfTElCUE5HX1ZFUiA+PSAxMDIwOQotICAgICAgcG5nX3NldF9leHBhbmRfZ3JheV8xXzJfNF90b184KCBwbmcgKTsKLSNlbHNlCi0gICAgICBwbmdfc2V0X2dyYXlfMV8yXzRfdG9fOCggcG5nICk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICAvKiB0cmFuc2Zvcm0gdHJhbnNwYXJlbmN5IHRvIGFscGhhICovCi0gICAgaWYgKCBwbmdfZ2V0X3ZhbGlkKHBuZywgaW5mbywgUE5HX0lORk9fdFJOUyApICkKLSAgICAgIHBuZ19zZXRfdFJOU190b19hbHBoYSggcG5nICk7Ci0KLSAgICBpZiAoIGJpdGRlcHRoID09IDE2ICkKLSAgICAgIHBuZ19zZXRfc3RyaXBfMTYoIHBuZyApOwotCi0gICAgaWYgKCBiaXRkZXB0aCA8IDggKQotICAgICAgcG5nX3NldF9wYWNraW5nKCBwbmcgKTsKLQotICAgIC8qIGNvbnZlcnQgZ3JheXNjYWxlIHRvIFJHQiAqLwotICAgIGlmICggY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICAgICAgIHx8Ci0gICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX0dSQVlfQUxQSEEgKQotICAgICAgcG5nX3NldF9ncmF5X3RvX3JnYiggcG5nICk7Ci0KLSAgICBpZiAoIGludGVybGFjZSAhPSBQTkdfSU5URVJMQUNFX05PTkUgKQotICAgICAgcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcoIHBuZyApOwotCi0gICAgcG5nX3NldF9maWxsZXIoIHBuZywgMHhGRiwgUE5HX0ZJTExFUl9BRlRFUiApOwotCi0gICAgLyogcmVjaGVjayBoZWFkZXIgYWZ0ZXIgc2V0dGluZyBFWFBBTkQgb3B0aW9ucyAqLwotICAgIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKHBuZywgaW5mbyApOwotICAgIHBuZ19nZXRfSUhEUiggcG5nLCBpbmZvLAotICAgICAgICAgICAgICAgICAgJmltZ1dpZHRoLCAmaW1nSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgJmJpdGRlcHRoLCAmY29sb3JfdHlwZSwgJmludGVybGFjZSwKLSAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwgKTsKLQotICAgIGlmICggYml0ZGVwdGggIT0gOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICEoIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCICAgICAgIHx8Ci0gICAgICAgICAgIGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfUkdCX0FMUEhBICkgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRGVzdHJveUV4aXQ7Ci0gICAgfQotCi0gICAgc3dpdGNoICggY29sb3JfdHlwZSApCi0gICAgewotICAgIGRlZmF1bHQ6Ci0gICAgICAvKiBTaG91bGRuJ3QgaGFwcGVuLCBidXQgZmFsbCB0aHJvdWdoLiAqLwotCi0gICAgY2FzZSBQTkdfQ09MT1JfVFlQRV9SR0JfQUxQSEE6Ci0gICAgICBwbmdfc2V0X3JlYWRfdXNlcl90cmFuc2Zvcm1fZm4oIHBuZywgcHJlbXVsdGlwbHlfZGF0YSApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBOR19DT0xPUl9UWVBFX1JHQjoKLSAgICAgIC8qIEh1bW0sIHRoaXMgc21lbGxzLiAgQ2Fycnkgb24gdGhvdWdoLiAqLwotICAgICAgcG5nX3NldF9yZWFkX3VzZXJfdHJhbnNmb3JtX2ZuKCBwbmcsIGNvbnZlcnRfYnl0ZXNfdG9fZGF0YSApOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIHJvd3MsIGltZ0hlaWdodCApICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBPdXRfT2ZfTWVtb3J5ICk7Ci0gICAgICBnb3RvIERlc3Ryb3lFeGl0OwotICAgIH0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgKEZUX0ludClpbWdIZWlnaHQ7IGkrKyApCi0gICAgICByb3dzW2ldID0gbWFwLT5idWZmZXIgKyAoIHlfb2Zmc2V0ICsgaSApICogbWFwLT5waXRjaCArIHhfb2Zmc2V0ICogNDsKLQotICAgIHBuZ19yZWFkX2ltYWdlKCBwbmcsIHJvd3MgKTsKLQotICAgIEZUX0ZSRUUoIHJvd3MgKTsKLQotICAgIHBuZ19yZWFkX2VuZCggcG5nLCBpbmZvICk7Ci0KLSAgRGVzdHJveUV4aXQ6Ci0gICAgcG5nX2Rlc3Ryb3lfcmVhZF9zdHJ1Y3QoICZwbmcsICZpbmZvLCBOVUxMICk7Ci0gICAgRlRfU3RyZWFtX0Nsb3NlKCAmc3RyZWFtICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fVVNFX1BORyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvcG5nc2hpbS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvcG5nc2hpbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2M1YzJiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3BuZ3NoaW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBuZ3NoaW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBQTkcgQml0bWFwIGdseXBoIHN1cHBvcnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAxMy0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgR29vZ2xlLCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdyaXR0ZW4gYnkgU3R1YXJ0IEdpbGwgYW5kIEJlaGRhZCBFc2ZhaGJvZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19QTkdTSElNX0hfXwotI2RlZmluZSBfX1BOR1NISU1fSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAidHRsb2FkLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1VTRV9QTkcKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBMb2FkX1NCaXRfUG5nKCBGVF9HbHlwaFNsb3QgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICAgeF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICAgeV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICAgcGl4X2JpdHMsCi0gICAgICAgICAgICAgICAgIFRUX1NCaXRfTWV0cmljcyAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICBwbmdfbGVuLAotICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgIHBvcHVsYXRlX21hcF9hbmRfbWV0cmljcyApOwotCi0jZW5kaWYKLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19QTkdTSElNX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvc2Zkcml2ZXIuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3NmZHJpdmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhM2YwZDkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvc2Zkcml2ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDUzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzZmRyaXZlci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSGlnaC1sZXZlbCBTRk5UIGRyaXZlciBpbnRlcmZhY2UgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0ZOVF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLQotI2luY2x1ZGUgInNmZHJpdmVyLmgiCi0jaW5jbHVkZSAidHRsb2FkLmgiCi0jaW5jbHVkZSAic2ZvYmpzLmgiCi0jaW5jbHVkZSAic2ZudHBpYy5oIgotCi0jaW5jbHVkZSAic2ZlcnJvcnMuaCIKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUwotI2luY2x1ZGUgInR0c2JpdC5oIgotI2VuZGlmCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMKLSNpbmNsdWRlICJ0dHBvc3QuaCIKLSNlbmRpZgotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9CREYKLSNpbmNsdWRlICJ0dGJkZi5oIgotI2luY2x1ZGUgRlRfU0VSVklDRV9CREZfSAotI2VuZGlmCi0KLSNpbmNsdWRlICJ0dGNtYXAuaCIKLSNpbmNsdWRlICJ0dGtlcm4uaCIKLSNpbmNsdWRlICJ0dG10eC5oIgotCi0jaW5jbHVkZSBGVF9TRVJWSUNFX0dMWVBIX0RJQ1RfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX05BTUVfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9TRk5UX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfVFRfQ01BUF9ICi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9zZmRyaXZlcgotCi0KLSAgLyoKLSAgICogIFNGTlQgVEFCTEUgU0VSVklDRQotICAgKgotICAgKi8KLQotICBzdGF0aWMgdm9pZCoKLSAgZ2V0X3NmbnRfdGFibGUoIFRUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfU2ZudF9UYWcgIHRhZyApCi0gIHsKLSAgICB2b2lkKiAgdGFibGU7Ci0KLQotICAgIHN3aXRjaCAoIHRhZyApCi0gICAgewotICAgIGNhc2UgRlRfU0ZOVF9IRUFEOgotICAgICAgdGFibGUgPSAmZmFjZS0+aGVhZGVyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZUX1NGTlRfSEhFQToKLSAgICAgIHRhYmxlID0gJmZhY2UtPmhvcml6b250YWw7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRlRfU0ZOVF9WSEVBOgotICAgICAgdGFibGUgPSBmYWNlLT52ZXJ0aWNhbF9pbmZvID8gJmZhY2UtPnZlcnRpY2FsIDogTlVMTDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGVF9TRk5UX09TMjoKLSAgICAgIHRhYmxlID0gZmFjZS0+b3MyLnZlcnNpb24gPT0gMHhGRkZGVSA/IE5VTEwgOiAmZmFjZS0+b3MyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZUX1NGTlRfUE9TVDoKLSAgICAgIHRhYmxlID0gJmZhY2UtPnBvc3RzY3JpcHQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRlRfU0ZOVF9NQVhQOgotICAgICAgdGFibGUgPSAmZmFjZS0+bWF4X3Byb2ZpbGU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRlRfU0ZOVF9QQ0xUOgotICAgICAgdGFibGUgPSBmYWNlLT5wY2x0LlZlcnNpb24gPyAmZmFjZS0+cGNsdCA6IE5VTEw7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICB0YWJsZSA9IE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRhYmxlOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgc2ZudF90YWJsZV9pbmZvKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICp0YWcsCi0gICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICpvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICpsZW5ndGggKQotICB7Ci0gICAgaWYgKCAhb2Zmc2V0IHx8ICFsZW5ndGggKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBpZiAoICF0YWcgKQotICAgICAgKmxlbmd0aCA9IGZhY2UtPm51bV90YWJsZXM7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICggaWR4ID49IGZhY2UtPm51bV90YWJsZXMgKQotICAgICAgICByZXR1cm4gRlRfVEhST1coIFRhYmxlX01pc3NpbmcgKTsKLQotICAgICAgKnRhZyAgICA9IGZhY2UtPmRpcl90YWJsZXNbaWR4XS5UYWc7Ci0gICAgICAqb2Zmc2V0ID0gZmFjZS0+ZGlyX3RhYmxlc1tpZHhdLk9mZnNldDsKLSAgICAgICpsZW5ndGggPSBmYWNlLT5kaXJfdGFibGVzW2lkeF0uTGVuZ3RoOwotICAgIH0KLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0RFRklORV9TRVJWSUNFX1NGTlRfVEFCTEVSRUMoCi0gICAgc2ZudF9zZXJ2aWNlX3NmbnRfdGFibGUsCi0gICAgKEZUX1NGTlRfVGFibGVMb2FkRnVuYyl0dF9mYWNlX2xvYWRfYW55LAotICAgIChGVF9TRk5UX1RhYmxlR2V0RnVuYykgZ2V0X3NmbnRfdGFibGUsCi0gICAgKEZUX1NGTlRfVGFibGVJbmZvRnVuYylzZm50X3RhYmxlX2luZm8gKQotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMKLQotICAvKgotICAgKiAgR0xZUEggRElDVCBTRVJWSUNFCi0gICAqCi0gICAqLwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBzZm50X2dldF9nbHlwaF9uYW1lKCBUVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBidWZmZXJfbWF4ICkKLSAgewotICAgIEZUX1N0cmluZyogIGduYW1lOwotICAgIEZUX0Vycm9yICAgIGVycm9yOwotCi0KLSAgICBlcnJvciA9IHR0X2ZhY2VfZ2V0X3BzX25hbWUoIGZhY2UsIGdseXBoX2luZGV4LCAmZ25hbWUgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgICBGVF9TVFJDUFlOKCBidWZmZXIsIGduYW1lLCBidWZmZXJfbWF4ICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9VSW50Ci0gIHNmbnRfZ2V0X25hbWVfaW5kZXgoIFRUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmluZyogIGdseXBoX25hbWUgKQotICB7Ci0gICAgRlRfRmFjZSAgcm9vdCA9ICZmYWNlLT5yb290OwotCi0gICAgRlRfVUludCAgaSwgbWF4X2dpZCA9IEZUX1VJTlRfTUFYOwotCi0KLSAgICBpZiAoIHJvb3QtPm51bV9nbHlwaHMgPCAwICkKLSAgICAgIHJldHVybiAwOwotICAgIGVsc2UgaWYgKCAoRlRfVUxvbmcpcm9vdC0+bnVtX2dseXBocyA8IEZUX1VJTlRfTUFYICkKLSAgICAgIG1heF9naWQgPSAoRlRfVUludClyb290LT5udW1fZ2x5cGhzOwotICAgIGVsc2UKLSAgICAgIEZUX1RSQUNFMCgoICJJZ25vcmUgZ2x5cGggbmFtZXMgZm9yIGludmFsaWQgR0lEIDB4JTA4eCAtIDB4JTA4eFxuIiwKLSAgICAgICAgICAgICAgICAgIEZUX1VJTlRfTUFYLCByb290LT5udW1fZ2x5cGhzICkpOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBtYXhfZ2lkOyBpKysgKQotICAgIHsKLSAgICAgIEZUX1N0cmluZyogIGduYW1lOwotICAgICAgRlRfRXJyb3IgICAgZXJyb3IgPSB0dF9mYWNlX2dldF9wc19uYW1lKCBmYWNlLCBpLCAmZ25hbWUgKTsKLQotCi0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGlmICggIWZ0X3N0cmNtcCggZ2x5cGhfbmFtZSwgZ25hbWUgKSApCi0gICAgICAgIHJldHVybiBpOwotICAgIH0KLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRV9HTFlQSERJQ1RSRUMoCi0gICAgc2ZudF9zZXJ2aWNlX2dseXBoX2RpY3QsCi0gICAgKEZUX0dseXBoRGljdF9HZXROYW1lRnVuYykgIHNmbnRfZ2V0X2dseXBoX25hbWUsCi0gICAgKEZUX0dseXBoRGljdF9OYW1lSW5kZXhGdW5jKXNmbnRfZ2V0X25hbWVfaW5kZXggKQotCi0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgKi8KLQotCi0gIC8qCi0gICAqICBQT1NUU0NSSVBUIE5BTUUgU0VSVklDRQotICAgKgotICAgKi8KLQotICBzdGF0aWMgY29uc3QgY2hhcioKLSAgc2ZudF9nZXRfcHNfbmFtZSggVFRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBGVF9JbnQgICAgICAgbiwgZm91bmRfd2luLCBmb3VuZF9hcHBsZTsKLSAgICBjb25zdCBjaGFyKiAgcmVzdWx0ID0gTlVMTDsKLQotCi0gICAgLyogc2hvdWxkbid0IGhhcHBlbiwgYnV0IGp1c3QgaW4gY2FzZSB0byBhdm9pZCBtZW1vcnkgbGVha3MgKi8KLSAgICBpZiAoIGZhY2UtPnBvc3RzY3JpcHRfbmFtZSApCi0gICAgICByZXR1cm4gZmFjZS0+cG9zdHNjcmlwdF9uYW1lOwotCi0gICAgLyogc2NhbiB0aGUgbmFtZSB0YWJsZSB0byBzZWUgd2hldGhlciB3ZSBoYXZlIGEgUG9zdHNjcmlwdCBuYW1lIGhlcmUsICovCi0gICAgLyogZWl0aGVyIGluIE1hY2ludG9zaCBvciBXaW5kb3dzIHBsYXRmb3JtIGVuY29kaW5ncyAgICAgICAgICAgICAgICAgICovCi0gICAgZm91bmRfd2luICAgPSAtMTsKLSAgICBmb3VuZF9hcHBsZSA9IC0xOwotCi0gICAgZm9yICggbiA9IDA7IG4gPCBmYWNlLT5udW1fbmFtZXM7IG4rKyApCi0gICAgewotICAgICAgVFRfTmFtZUVudHJ5UmVjKiAgbmFtZSA9IGZhY2UtPm5hbWVfdGFibGUubmFtZXMgKyBuOwotCi0KLSAgICAgIGlmICggbmFtZS0+bmFtZUlEID09IDYgJiYgbmFtZS0+c3RyaW5nTGVuZ3RoID4gMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggbmFtZS0+cGxhdGZvcm1JRCA9PSAzICAgICAmJgotICAgICAgICAgICAgIG5hbWUtPmVuY29kaW5nSUQgPT0gMSAgICAgJiYKLSAgICAgICAgICAgICBuYW1lLT5sYW5ndWFnZUlEID09IDB4NDA5ICkKLSAgICAgICAgICBmb3VuZF93aW4gPSBuOwotCi0gICAgICAgIGlmICggbmFtZS0+cGxhdGZvcm1JRCA9PSAxICYmCi0gICAgICAgICAgICAgbmFtZS0+ZW5jb2RpbmdJRCA9PSAwICYmCi0gICAgICAgICAgICAgbmFtZS0+bGFuZ3VhZ2VJRCA9PSAwICkKLSAgICAgICAgICBmb3VuZF9hcHBsZSA9IG47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBmb3VuZF93aW4gIT0gLTEgKQotICAgIHsKLSAgICAgIEZUX01lbW9yeSAgICAgICAgIG1lbW9yeSA9IGZhY2UtPnJvb3QubWVtb3J5OwotICAgICAgVFRfTmFtZUVudHJ5UmVjKiAgbmFtZSAgID0gZmFjZS0+bmFtZV90YWJsZS5uYW1lcyArIGZvdW5kX3dpbjsKLSAgICAgIEZUX1VJbnQgICAgICAgICAgIGxlbiAgICA9IG5hbWUtPnN0cmluZ0xlbmd0aCAvIDI7Ci0gICAgICBGVF9FcnJvciAgICAgICAgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0KLSAgICAgIEZUX1VOVVNFRCggZXJyb3IgKTsKLQotCi0gICAgICBpZiAoICFGVF9BTExPQyggcmVzdWx0LCBuYW1lLT5zdHJpbmdMZW5ndGggKyAxICkgKQotICAgICAgewotICAgICAgICBGVF9TdHJlYW0gICBzdHJlYW0gPSBmYWNlLT5uYW1lX3RhYmxlLnN0cmVhbTsKLSAgICAgICAgRlRfU3RyaW5nKiAgciAgICAgID0gKEZUX1N0cmluZyopcmVzdWx0OwotICAgICAgICBGVF9DaGFyKiAgICBwOwotCi0KLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggbmFtZS0+c3RyaW5nT2Zmc2V0ICkgfHwKLSAgICAgICAgICAgICBGVF9GUkFNRV9FTlRFUiggbmFtZS0+c3RyaW5nTGVuZ3RoICkgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfRlJFRSggcmVzdWx0ICk7Ci0gICAgICAgICAgbmFtZS0+c3RyaW5nTGVuZ3RoID0gMDsKLSAgICAgICAgICBuYW1lLT5zdHJpbmdPZmZzZXQgPSAwOwotICAgICAgICAgIEZUX0ZSRUUoIG5hbWUtPnN0cmluZyApOwotCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgcCA9IChGVF9DaGFyKilzdHJlYW0tPmN1cnNvcjsKLQotICAgICAgICBmb3IgKCA7IGxlbiA+IDA7IGxlbi0tLCBwICs9IDIgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBwWzBdID09IDAgJiYgcFsxXSA+PSAzMiApCi0gICAgICAgICAgICAqcisrID0gcFsxXTsKLSAgICAgICAgfQotICAgICAgICAqciA9ICdcMCc7Ci0KLSAgICAgICAgRlRfRlJBTUVfRVhJVCgpOwotICAgICAgfQotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggZm91bmRfYXBwbGUgIT0gLTEgKQotICAgIHsKLSAgICAgIEZUX01lbW9yeSAgICAgICAgIG1lbW9yeSA9IGZhY2UtPnJvb3QubWVtb3J5OwotICAgICAgVFRfTmFtZUVudHJ5UmVjKiAgbmFtZSAgID0gZmFjZS0+bmFtZV90YWJsZS5uYW1lcyArIGZvdW5kX2FwcGxlOwotICAgICAgRlRfVUludCAgICAgICAgICAgbGVuICAgID0gbmFtZS0+c3RyaW5nTGVuZ3RoOwotICAgICAgRlRfRXJyb3IgICAgICAgICAgZXJyb3IgID0gRlRfRXJyX09rOwotCi0gICAgICBGVF9VTlVTRUQoIGVycm9yICk7Ci0KLQotICAgICAgaWYgKCAhRlRfQUxMT0MoIHJlc3VsdCwgbGVuICsgMSApICkKLSAgICAgIHsKLSAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gPSBmYWNlLT5uYW1lX3RhYmxlLnN0cmVhbTsKLQotCi0gICAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIG5hbWUtPnN0cmluZ09mZnNldCApIHx8Ci0gICAgICAgICAgICAgRlRfU1RSRUFNX1JFQUQoIHJlc3VsdCwgbGVuICkgICAgICAgICkKLSAgICAgICAgewotICAgICAgICAgIG5hbWUtPnN0cmluZ09mZnNldCA9IDA7Ci0gICAgICAgICAgbmFtZS0+c3RyaW5nTGVuZ3RoID0gMDsKLSAgICAgICAgICBGVF9GUkVFKCBuYW1lLT5zdHJpbmcgKTsKLSAgICAgICAgICBGVF9GUkVFKCByZXN1bHQgKTsKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLSAgICAgICAgKChjaGFyKilyZXN1bHQpW2xlbl0gPSAnXDAnOwotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIGZhY2UtPnBvc3RzY3JpcHRfbmFtZSA9IHJlc3VsdDsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRV9QU0ZPTlROQU1FUkVDKAotICAgIHNmbnRfc2VydmljZV9wc19uYW1lLAotICAgIChGVF9Qc05hbWVfR2V0RnVuYylzZm50X2dldF9wc19uYW1lICkKLQotCi0gIC8qCi0gICAqICBUVCBDTUFQIElORk8KLSAgICovCi0gIEZUX0RFRklORV9TRVJWSUNFX1RUQ01BUFNSRUMoCi0gICAgdHRfc2VydmljZV9nZXRfY21hcF9pbmZvLAotICAgIChUVF9DTWFwX0luZm9fR2V0RnVuYyl0dF9nZXRfY21hcF9pbmZvICkKLQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9CREYKLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgc2ZudF9nZXRfY2hhcnNldF9pZCggVFRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgKmFjaGFyc2V0X2VuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgKmFjaGFyc2V0X3JlZ2lzdHJ5ICkKLSAgewotICAgIEJERl9Qcm9wZXJ0eVJlYyAgZW5jb2RpbmcsIHJlZ2lzdHJ5OwotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3I7Ci0KLQotICAgIC8qIFhYWDogSSBkb24ndCBrbm93IHdoZXRoZXIgdGhpcyBpcyBjb3JyZWN0LCBzaW5jZQotICAgICAqICAgICAgdHRfZmFjZV9maW5kX2JkZl9wcm9wIG9ubHkgcmV0dXJucyBzb21ldGhpbmcgY29ycmVjdCBpZiB3ZSBoYXZlCi0gICAgICogICAgICBwcmV2aW91c2x5IHNlbGVjdGVkIGEgc2l6ZSB0aGF0IGlzIGxpc3RlZCBpbiB0aGUgQkRGIHRhYmxlLgotICAgICAqICAgICAgU2hvdWxkIHdlIGNoYW5nZSB0aGUgQkRGIHRhYmxlIGZvcm1hdCB0byBpbmNsdWRlIHNpbmdsZSBvZmZzZXRzCi0gICAgICogICAgICBmb3IgYENIQVJTRVRfUkVHSVNUUlknIGFuZCBgQ0hBUlNFVF9FTkNPRElORyc/Ci0gICAgICovCi0gICAgZXJyb3IgPSB0dF9mYWNlX2ZpbmRfYmRmX3Byb3AoIGZhY2UsICJDSEFSU0VUX1JFR0lTVFJZIiwgJnJlZ2lzdHJ5ICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGVycm9yID0gdHRfZmFjZV9maW5kX2JkZl9wcm9wKCBmYWNlLCAiQ0hBUlNFVF9FTkNPRElORyIsICZlbmNvZGluZyApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgewotICAgICAgICBpZiAoIHJlZ2lzdHJ5LnR5cGUgPT0gQkRGX1BST1BFUlRZX1RZUEVfQVRPTSAmJgotICAgICAgICAgICAgIGVuY29kaW5nLnR5cGUgPT0gQkRGX1BST1BFUlRZX1RZUEVfQVRPTSApCi0gICAgICAgIHsKLSAgICAgICAgICAqYWNoYXJzZXRfZW5jb2RpbmcgPSBlbmNvZGluZy51LmF0b207Ci0gICAgICAgICAgKmFjaGFyc2V0X3JlZ2lzdHJ5ID0gcmVnaXN0cnkudS5hdG9tOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9ERUZJTkVfU0VSVklDRV9CREZSZWMoCi0gICAgc2ZudF9zZXJ2aWNlX2JkZiwKLSAgICAoRlRfQkRGX0dldENoYXJzZXRJZEZ1bmMpc2ZudF9nZXRfY2hhcnNldF9pZCwKLSAgICAoRlRfQkRGX0dldFByb3BlcnR5RnVuYykgdHRfZmFjZV9maW5kX2JkZl9wcm9wICkKLQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9CREYgKi8KLQotCi0gIC8qCi0gICAqICBTRVJWSUNFIExJU1QKLSAgICovCi0KLSNpZiBkZWZpbmVkIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUyAmJiBkZWZpbmVkIFRUX0NPTkZJR19PUFRJT05fQkRGCi0gIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzUoCi0gICAgc2ZudF9zZXJ2aWNlcywKLSAgICBGVF9TRVJWSUNFX0lEX1NGTlRfVEFCTEUsICAgICAgICAgICAmU0ZOVF9TRVJWSUNFX1NGTlRfVEFCTEVfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9GT05UX05BTUUsICZTRk5UX1NFUlZJQ0VfUFNfTkFNRV9HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9HTFlQSF9ESUNULCAgICAgICAgICAgJlNGTlRfU0VSVklDRV9HTFlQSF9ESUNUX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX0JERiwgICAgICAgICAgICAgICAgICAmU0ZOVF9TRVJWSUNFX0JERl9HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9UVF9DTUFQLCAgICAgICAgICAgICAgJlRUX1NFUlZJQ0VfQ01BUF9JTkZPX0dFVCApCi0jZWxpZiBkZWZpbmVkIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM0KAotICAgIHNmbnRfc2VydmljZXMsCi0gICAgRlRfU0VSVklDRV9JRF9TRk5UX1RBQkxFLCAgICAgICAgICAgJlNGTlRfU0VSVklDRV9TRk5UX1RBQkxFX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX1BPU1RTQ1JJUFRfRk9OVF9OQU1FLCAmU0ZOVF9TRVJWSUNFX1BTX05BTUVfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfR0xZUEhfRElDVCwgICAgICAgICAgICZTRk5UX1NFUlZJQ0VfR0xZUEhfRElDVF9HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9UVF9DTUFQLCAgICAgICAgICAgICAgJlRUX1NFUlZJQ0VfQ01BUF9JTkZPX0dFVCApCi0jZWxpZiBkZWZpbmVkIFRUX0NPTkZJR19PUFRJT05fQkRGCi0gIEZUX0RFRklORV9TRVJWSUNFREVTQ1JFQzQoCi0gICAgc2ZudF9zZXJ2aWNlcywKLSAgICBGVF9TRVJWSUNFX0lEX1NGTlRfVEFCTEUsICAgICAgICAgICAmU0ZOVF9TRVJWSUNFX1NGTlRfVEFCTEVfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9GT05UX05BTUUsICZTRk5UX1NFUlZJQ0VfUFNfTkFNRV9HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9CREYsICAgICAgICAgICAgICAgICAgJlNGTlRfU0VSVklDRV9CREZfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfVFRfQ01BUCwgICAgICAgICAgICAgICZUVF9TRVJWSUNFX0NNQVBfSU5GT19HRVQgKQotI2Vsc2UKLSAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDMygKLSAgICBzZm50X3NlcnZpY2VzLAotICAgIEZUX1NFUlZJQ0VfSURfU0ZOVF9UQUJMRSwgICAgICAgICAgICZTRk5UX1NFUlZJQ0VfU0ZOVF9UQUJMRV9HRVQsCi0gICAgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0ZPTlRfTkFNRSwgJlNGTlRfU0VSVklDRV9QU19OQU1FX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX1RUX0NNQVAsICAgICAgICAgICAgICAmVFRfU0VSVklDRV9DTUFQX0lORk9fR0VUICkKLSNlbmRpZgotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9Nb2R1bGVfSW50ZXJmYWNlICkKLSAgc2ZudF9nZXRfaW50ZXJmYWNlKCBGVF9Nb2R1bGUgICAgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBtb2R1bGVfaW50ZXJmYWNlICkKLSAgewotICAgIC8qIFNGTlRfU0VSVklDRVNfR0VUIGRlcmVmZXJlbmNlcyBgbGlicmFyeScgaW4gUElDIG1vZGUgKi8KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotICAgIEZUX0xpYnJhcnkgIGxpYnJhcnk7Ci0KLQotICAgIGlmICggIW1vZHVsZSApCi0gICAgICByZXR1cm4gTlVMTDsKLSAgICBsaWJyYXJ5ID0gbW9kdWxlLT5saWJyYXJ5OwotICAgIGlmICggIWxpYnJhcnkgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0jZWxzZQotICAgIEZUX1VOVVNFRCggbW9kdWxlICk7Ci0jZW5kaWYKLQotICAgIHJldHVybiBmdF9zZXJ2aWNlX2xpc3RfbG9va3VwKCBTRk5UX1NFUlZJQ0VTX0dFVCwgbW9kdWxlX2ludGVyZmFjZSApOwotICB9Ci0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUwotI2RlZmluZSBQVVRfRU1CRURERURfQklUTUFQUyggYSApICBhCi0jZWxzZQotI2RlZmluZSBQVVRfRU1CRURERURfQklUTUFQUyggYSApICBOVUxMCi0jZW5kaWYKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotI2RlZmluZSBQVVRfUFNfTkFNRVMoIGEgKSAgYQotI2Vsc2UKLSNkZWZpbmUgUFVUX1BTX05BTUVTKCBhICkgIE5VTEwKLSNlbmRpZgotCi0gIEZUX0RFRklORV9TRk5UX0lOVEVSRkFDRSgKLSAgICBzZm50X2ludGVyZmFjZSwKLSAgICB0dF9mYWNlX2dvdG9fdGFibGUsCi0KLSAgICBzZm50X2luaXRfZmFjZSwKLSAgICBzZm50X2xvYWRfZmFjZSwKLSAgICBzZm50X2RvbmVfZmFjZSwKLSAgICBzZm50X2dldF9pbnRlcmZhY2UsCi0KLSAgICB0dF9mYWNlX2xvYWRfYW55LAotCi0gICAgdHRfZmFjZV9sb2FkX2hlYWQsCi0gICAgdHRfZmFjZV9sb2FkX2hoZWEsCi0gICAgdHRfZmFjZV9sb2FkX2NtYXAsCi0gICAgdHRfZmFjZV9sb2FkX21heHAsCi0gICAgdHRfZmFjZV9sb2FkX29zMiwKLSAgICB0dF9mYWNlX2xvYWRfcG9zdCwKLQotICAgIHR0X2ZhY2VfbG9hZF9uYW1lLAotICAgIHR0X2ZhY2VfZnJlZV9uYW1lLAotCi0gICAgdHRfZmFjZV9sb2FkX2tlcm4sCi0gICAgdHRfZmFjZV9sb2FkX2dhc3AsCi0gICAgdHRfZmFjZV9sb2FkX3BjbHQsCi0KLSAgICAvKiBzZWUgYHR0bG9hZC5oJyAqLwotICAgIFBVVF9FTUJFRERFRF9CSVRNQVBTKCB0dF9mYWNlX2xvYWRfYmhlZCApLAotCi0gICAgUFVUX0VNQkVEREVEX0JJVE1BUFMoIHR0X2ZhY2VfbG9hZF9zYml0X2ltYWdlICksCi0KLSAgICAvKiBzZWUgYHR0cG9zdC5oJyAqLwotICAgIFBVVF9QU19OQU1FUyggdHRfZmFjZV9nZXRfcHNfbmFtZSAgICksCi0gICAgUFVUX1BTX05BTUVTKCB0dF9mYWNlX2ZyZWVfcHNfbmFtZXMgKSwKLQotICAgIC8qIHNpbmNlIHZlcnNpb24gMi4xLjggKi8KLSAgICB0dF9mYWNlX2dldF9rZXJuaW5nLAotCi0gICAgLyogc2luY2UgdmVyc2lvbiAyLjIgKi8KLSAgICB0dF9mYWNlX2xvYWRfZm9udF9kaXIsCi0gICAgdHRfZmFjZV9sb2FkX2htdHgsCi0KLSAgICAvKiBzZWUgYHR0c2JpdC5oJyBhbmQgYHNmbnQuaCcgKi8KLSAgICBQVVRfRU1CRURERURfQklUTUFQUyggdHRfZmFjZV9sb2FkX3NiaXQgKSwKLSAgICBQVVRfRU1CRURERURfQklUTUFQUyggdHRfZmFjZV9mcmVlX3NiaXQgKSwKLQotICAgIFBVVF9FTUJFRERFRF9CSVRNQVBTKCB0dF9mYWNlX3NldF9zYml0X3N0cmlrZSAgICAgKSwKLSAgICBQVVRfRU1CRURERURfQklUTUFQUyggdHRfZmFjZV9sb2FkX3N0cmlrZV9tZXRyaWNzICksCi0KLSAgICB0dF9mYWNlX2dldF9tZXRyaWNzLAotCi0gICAgdHRfZmFjZV9nZXRfbmFtZQotICApCi0KLQotICBGVF9ERUZJTkVfTU9EVUxFKAotICAgIHNmbnRfbW9kdWxlX2NsYXNzLAotCi0gICAgMCwgIC8qIG5vdCBhIGZvbnQgZHJpdmVyIG9yIHJlbmRlcmVyICovCi0gICAgc2l6ZW9mICggRlRfTW9kdWxlUmVjICksCi0KLSAgICAic2ZudCIsICAgICAvKiBkcml2ZXIgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIDB4MTAwMDBMLCAgIC8qIGRyaXZlciB2ZXJzaW9uIDEuMCAgICAgICAgICAgICAgICAgICAgICovCi0gICAgMHgyMDAwMEwsICAgLyogZHJpdmVyIHJlcXVpcmVzIEZyZWVUeXBlIDIuMCBvciBoaWdoZXIgKi8KLQotICAgIChjb25zdCB2b2lkKikmU0ZOVF9JTlRFUkZBQ0VfR0VULCAgLyogbW9kdWxlIHNwZWNpZmljIGludGVyZmFjZSAqLwotCi0gICAgKEZUX01vZHVsZV9Db25zdHJ1Y3RvcikwLAotICAgIChGVF9Nb2R1bGVfRGVzdHJ1Y3RvcikgMCwKLSAgICAoRlRfTW9kdWxlX1JlcXVlc3RlcikgIHNmbnRfZ2V0X2ludGVyZmFjZSApCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9zZmRyaXZlci5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvc2Zkcml2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0MTE5Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9zZmRyaXZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc2Zkcml2ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEhpZ2gtbGV2ZWwgU0ZOVCBkcml2ZXIgaW50ZXJmYWNlIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fU0ZEUklWRVJfSF9fCi0jZGVmaW5lIF9fU0ZEUklWRVJfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9NT0RVTEVfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfREVDTEFSRV9NT0RVTEUoIHNmbnRfbW9kdWxlX2NsYXNzICkKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1NGRFJJVkVSX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvc2ZlcnJvcnMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3NmZXJyb3JzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYmVmM2YuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvc2ZlcnJvcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHNmZXJyb3JzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBTRk5UIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgU0ZOVCBlcnJvciBlbnVtZXJhdGlvbiBjb25zdGFudHMuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19TRkVSUk9SU19IX18KLSNkZWZpbmUgX19TRkVSUk9SU19IX18KLQotI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19ICi0KLSN1bmRlZiBfX0ZURVJST1JTX0hfXwotCi0jdW5kZWYgIEZUX0VSUl9QUkVGSVgKLSNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgU0ZOVF9FcnJfCi0jZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfU0ZOVAotCi0jaW5jbHVkZSBGVF9FUlJPUlNfSAotCi0jZW5kaWYgLyogX19TRkVSUk9SU19IX18gKi8KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9zZm50LmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9zZm50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOGI1ZjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvc2ZudC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc2ZudC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFNpbmdsZSBvYmplY3QgbGlicmFyeSBjb21wb25lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIEZUX01BS0VfT1BUSU9OX1NJTkdMRV9PQkpFQ1QKLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAic2ZudHBpYy5jIgotI2luY2x1ZGUgInR0bG9hZC5jIgotI2luY2x1ZGUgInR0bXR4LmMiCi0jaW5jbHVkZSAidHRjbWFwLmMiCi0jaW5jbHVkZSAidHRrZXJuLmMiCi0jaW5jbHVkZSAic2ZvYmpzLmMiCi0jaW5jbHVkZSAic2Zkcml2ZXIuYyIKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUwotI2luY2x1ZGUgInBuZ3NoaW0uYyIKLSNpbmNsdWRlICJ0dHNiaXQuYyIKLSNlbmRpZgotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTCi0jaW5jbHVkZSAidHRwb3N0LmMiCi0jZW5kaWYKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fQkRGCi0jaW5jbHVkZSAidHRiZGYuYyIKLSNlbmRpZgotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3NmbnRwaWMuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3NmbnRwaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFhZjRiYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9zZm50cGljLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgc2ZudHBpYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSBGcmVlVHlwZSBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIHNlcnZpY2VzIGZvciBzZm50IG1vZHVsZS4gICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA5LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBPcmFuIEFncmEgYW5kIE1pY2tleSBHYWJlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotI2luY2x1ZGUgInNmbnRwaWMuaCIKLSNpbmNsdWRlICJzZmVycm9ycy5oIgotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0gIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgUElDIGluaXQgZnVuY3Rpb25zIGZyb20gc2Zkcml2ZXIuYyAqLwotICBGVF9FcnJvcgotICBGVF9DcmVhdGVfQ2xhc3Nfc2ZudF9zZXJ2aWNlcyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiogIG91dHB1dF9jbGFzcyApOwotICB2b2lkCi0gIEZUX0Rlc3Ryb3lfQ2xhc3Nfc2ZudF9zZXJ2aWNlcyggRlRfTGlicmFyeSAgICAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogKTsKLSAgdm9pZAotICBGVF9Jbml0X0NsYXNzX3NmbnRfc2VydmljZV9iZGYoIEZUX1NlcnZpY2VfQkRGUmVjKiAgY2xhenogKTsKLSAgdm9pZAotICBGVF9Jbml0X0NsYXNzX3NmbnRfaW50ZXJmYWNlKCBGVF9MaWJyYXJ5ICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNGTlRfSW50ZXJmYWNlKiAgY2xhenogKTsKLSAgdm9pZAotICBGVF9Jbml0X0NsYXNzX3NmbnRfc2VydmljZV9nbHlwaF9kaWN0KAotICAgIEZUX0xpYnJhcnkgICAgICAgICAgICAgICAgbGlicmFyeSwKLSAgICBGVF9TZXJ2aWNlX0dseXBoRGljdFJlYyogIGNsYXp6ICk7Ci0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc19zZm50X3NlcnZpY2VfcHNfbmFtZSgKLSAgICBGVF9MaWJyYXJ5ICAgICAgICAgICAgICAgICBsaWJyYXJ5LAotICAgIEZUX1NlcnZpY2VfUHNGb250TmFtZVJlYyogIGNsYXp6ICk7Ci0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc190dF9zZXJ2aWNlX2dldF9jbWFwX2luZm8oCi0gICAgRlRfTGlicmFyeSAgICAgICAgICAgICAgbGlicmFyeSwKLSAgICBGVF9TZXJ2aWNlX1RUQ01hcHNSZWMqICBjbGF6eiApOwotICB2b2lkCi0gIEZUX0luaXRfQ2xhc3Nfc2ZudF9zZXJ2aWNlX3NmbnRfdGFibGUoCi0gICAgRlRfU2VydmljZV9TRk5UX1RhYmxlUmVjKiAgY2xhenogKTsKLQotCi0gIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgUElDIGluaXQgZnVuY3Rpb25zIGZyb20gdHRjbWFwLmMgKi8KLSAgRlRfRXJyb3IKLSAgRlRfQ3JlYXRlX0NsYXNzX3R0X2NtYXBfY2xhc3NlcyggRlRfTGlicmFyeSAgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9DTWFwX0NsYXNzKiogIG91dHB1dF9jbGFzcyApOwotICB2b2lkCi0gIEZUX0Rlc3Ryb3lfQ2xhc3NfdHRfY21hcF9jbGFzc2VzKCBGVF9MaWJyYXJ5ICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX0NNYXBfQ2xhc3MqICBjbGF6eiApOwotCi0KLSAgdm9pZAotICBzZm50X21vZHVsZV9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9QSUNfQ29udGFpbmVyKiAgcGljX2NvbnRhaW5lciA9ICZsaWJyYXJ5LT5waWNfY29udGFpbmVyOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICBpZiAoIHBpY19jb250YWluZXItPnNmbnQgKQotICAgIHsKLSAgICAgIHNmbnRNb2R1bGVQSUMqICBjb250YWluZXIgPSAoc2ZudE1vZHVsZVBJQyopcGljX2NvbnRhaW5lci0+c2ZudDsKLQotCi0gICAgICBpZiAoIGNvbnRhaW5lci0+c2ZudF9zZXJ2aWNlcyApCi0gICAgICAgIEZUX0Rlc3Ryb3lfQ2xhc3Nfc2ZudF9zZXJ2aWNlcyggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXItPnNmbnRfc2VydmljZXMgKTsKLSAgICAgIGNvbnRhaW5lci0+c2ZudF9zZXJ2aWNlcyA9IE5VTEw7Ci0KLSAgICAgIGlmICggY29udGFpbmVyLT50dF9jbWFwX2NsYXNzZXMgKQotICAgICAgICBGVF9EZXN0cm95X0NsYXNzX3R0X2NtYXBfY2xhc3NlcyggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci0+dHRfY21hcF9jbGFzc2VzICk7Ci0gICAgICBjb250YWluZXItPnR0X2NtYXBfY2xhc3NlcyA9IE5VTEw7Ci0KLSAgICAgIEZUX0ZSRUUoIGNvbnRhaW5lciApOwotICAgICAgcGljX2NvbnRhaW5lci0+c2ZudCA9IE5VTEw7Ci0gICAgfQotICB9Ci0KLQotICBGVF9FcnJvcgotICBzZm50X21vZHVsZV9jbGFzc19waWNfaW5pdCggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9QSUNfQ29udGFpbmVyKiAgcGljX2NvbnRhaW5lciA9ICZsaWJyYXJ5LT5waWNfY29udGFpbmVyOwotICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvciAgICAgICAgID0gRlRfRXJyX09rOwotICAgIHNmbnRNb2R1bGVQSUMqICAgICBjb250YWluZXIgICAgID0gTlVMTDsKLSAgICBGVF9NZW1vcnkgICAgICAgICAgbWVtb3J5ICAgICAgICA9IGxpYnJhcnktPm1lbW9yeTsKLQotCi0gICAgLyogYWxsb2NhdGUgcG9pbnRlciwgY2xlYXIgYW5kIHNldCBnbG9iYWwgY29udGFpbmVyIHBvaW50ZXIgKi8KLSAgICBpZiAoIEZUX0FMTE9DKCBjb250YWluZXIsIHNpemVvZiAoICpjb250YWluZXIgKSApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICBGVF9NRU1fU0VUKCBjb250YWluZXIsIDAsIHNpemVvZiAoICpjb250YWluZXIgKSApOwotICAgIHBpY19jb250YWluZXItPnNmbnQgPSBjb250YWluZXI7Ci0KLSAgICAvKiBpbml0aWFsaXplIHBvaW50ZXIgdGFibGUgLSAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiB0aGlzIGlzIGhvdyB0aGUgbW9kdWxlIHVzdWFsbHkgZXhwZWN0cyB0aGlzIGRhdGEgKi8KLSAgICBlcnJvciA9IEZUX0NyZWF0ZV9DbGFzc19zZm50X3NlcnZpY2VzKCBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZXItPnNmbnRfc2VydmljZXMgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGVycm9yID0gRlRfQ3JlYXRlX0NsYXNzX3R0X2NtYXBfY2xhc3NlcyggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb250YWluZXItPnR0X2NtYXBfY2xhc3NlcyApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgRlRfSW5pdF9DbGFzc19zZm50X3NlcnZpY2VfZ2x5cGhfZGljdCgKLSAgICAgIGxpYnJhcnksICZjb250YWluZXItPnNmbnRfc2VydmljZV9nbHlwaF9kaWN0ICk7Ci0gICAgRlRfSW5pdF9DbGFzc19zZm50X3NlcnZpY2VfcHNfbmFtZSgKLSAgICAgIGxpYnJhcnksICZjb250YWluZXItPnNmbnRfc2VydmljZV9wc19uYW1lICk7Ci0gICAgRlRfSW5pdF9DbGFzc190dF9zZXJ2aWNlX2dldF9jbWFwX2luZm8oCi0gICAgICBsaWJyYXJ5LCAmY29udGFpbmVyLT50dF9zZXJ2aWNlX2dldF9jbWFwX2luZm8gKTsKLSAgICBGVF9Jbml0X0NsYXNzX3NmbnRfc2VydmljZV9zZm50X3RhYmxlKAotICAgICAgJmNvbnRhaW5lci0+c2ZudF9zZXJ2aWNlX3NmbnRfdGFibGUgKTsKLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0JERgotICAgIEZUX0luaXRfQ2xhc3Nfc2ZudF9zZXJ2aWNlX2JkZiggJmNvbnRhaW5lci0+c2ZudF9zZXJ2aWNlX2JkZiApOwotI2VuZGlmCi0gICAgRlRfSW5pdF9DbGFzc19zZm50X2ludGVyZmFjZSggbGlicmFyeSwgJmNvbnRhaW5lci0+c2ZudF9pbnRlcmZhY2UgKTsKLQotICBFeGl0OgotICAgIGlmICggZXJyb3IgKQotICAgICAgc2ZudF9tb2R1bGVfY2xhc3NfcGljX2ZyZWUoIGxpYnJhcnkgKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9zZm50cGljLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9zZm50cGljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5OWJlNmEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvc2ZudHBpYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHNmbnRwaWMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3Igc2ZudCBtb2R1bGUuICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1NGTlRQSUNfSF9fCi0jZGVmaW5lIF9fU0ZOVFBJQ19IX18KLQotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QSUNfSAotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBTRk5UX1NFUlZJQ0VTX0dFVCAgICAgICAgICAgIHNmbnRfc2VydmljZXMKLSNkZWZpbmUgU0ZOVF9TRVJWSUNFX0dMWVBIX0RJQ1RfR0VUICBzZm50X3NlcnZpY2VfZ2x5cGhfZGljdAotI2RlZmluZSBTRk5UX1NFUlZJQ0VfUFNfTkFNRV9HRVQgICAgIHNmbnRfc2VydmljZV9wc19uYW1lCi0jZGVmaW5lIFRUX1NFUlZJQ0VfQ01BUF9JTkZPX0dFVCAgICAgdHRfc2VydmljZV9nZXRfY21hcF9pbmZvCi0jZGVmaW5lIFRUX0NNQVBfQ0xBU1NFU19HRVQgICAgICAgICAgdHRfY21hcF9jbGFzc2VzCi0jZGVmaW5lIFNGTlRfU0VSVklDRV9TRk5UX1RBQkxFX0dFVCAgc2ZudF9zZXJ2aWNlX3NmbnRfdGFibGUKLSNkZWZpbmUgU0ZOVF9TRVJWSUNFX0JERl9HRVQgICAgICAgICBzZm50X3NlcnZpY2VfYmRmCi0jZGVmaW5lIFNGTlRfSU5URVJGQUNFX0dFVCAgICAgICAgICAgc2ZudF9pbnRlcmZhY2UKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICAvKiBzb21lIGluY2x1ZGUgZmlsZXMgcmVxdWlyZWQgZm9yIG1lbWJlcnMgb2Ygc2ZudE1vZHVsZVBJQyAqLwotI2luY2x1ZGUgRlRfU0VSVklDRV9HTFlQSF9ESUNUX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9OQU1FX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfU0ZOVF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1RUX0NNQVBfSAotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9CREYKLSNpbmNsdWRlICJ0dGJkZi5oIgotI2luY2x1ZGUgRlRfU0VSVklDRV9CREZfSAotI2VuZGlmCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRk5UX0gKLSNpbmNsdWRlICJ0dGNtYXAuaCIKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICB0eXBlZGVmIHN0cnVjdCAgc2ZudE1vZHVsZVBJQ18KLSAgewotICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgICAgICAgc2ZudF9zZXJ2aWNlczsKLSAgICBGVF9TZXJ2aWNlX0dseXBoRGljdFJlYyAgIHNmbnRfc2VydmljZV9nbHlwaF9kaWN0OwotICAgIEZUX1NlcnZpY2VfUHNGb250TmFtZVJlYyAgc2ZudF9zZXJ2aWNlX3BzX25hbWU7Ci0gICAgRlRfU2VydmljZV9UVENNYXBzUmVjICAgICB0dF9zZXJ2aWNlX2dldF9jbWFwX2luZm87Ci0gICAgVFRfQ01hcF9DbGFzcyogICAgICAgICAgICB0dF9jbWFwX2NsYXNzZXM7Ci0gICAgRlRfU2VydmljZV9TRk5UX1RhYmxlUmVjICBzZm50X3NlcnZpY2Vfc2ZudF90YWJsZTsKLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0JERgotICAgIEZUX1NlcnZpY2VfQkRGUmVjICAgICAgICAgc2ZudF9zZXJ2aWNlX2JkZjsKLSNlbmRpZgotICAgIFNGTlRfSW50ZXJmYWNlICAgICAgICAgICAgc2ZudF9pbnRlcmZhY2U7Ci0KLSAgfSBzZm50TW9kdWxlUElDOwotCi0KLSNkZWZpbmUgR0VUX1BJQyggbGliICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIChzZm50TW9kdWxlUElDKikoIChsaWIpLT5waWNfY29udGFpbmVyLnNmbnQgKSApCi0KLSNkZWZpbmUgU0ZOVF9TRVJWSUNFU19HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+c2ZudF9zZXJ2aWNlcyApCi0jZGVmaW5lIFNGTlRfU0VSVklDRV9HTFlQSF9ESUNUX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT5zZm50X3NlcnZpY2VfZ2x5cGhfZGljdCApCi0jZGVmaW5lIFNGTlRfU0VSVklDRV9QU19OQU1FX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT5zZm50X3NlcnZpY2VfcHNfbmFtZSApCi0jZGVmaW5lIFRUX1NFUlZJQ0VfQ01BUF9JTkZPX0dFVCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+dHRfc2VydmljZV9nZXRfY21hcF9pbmZvICkKLSNkZWZpbmUgVFRfQ01BUF9DTEFTU0VTX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT50dF9jbWFwX2NsYXNzZXMgKQotI2RlZmluZSBTRk5UX1NFUlZJQ0VfU0ZOVF9UQUJMRV9HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+c2ZudF9zZXJ2aWNlX3NmbnRfdGFibGUgKQotI2RlZmluZSBTRk5UX1NFUlZJQ0VfQkRGX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT5zZm50X3NlcnZpY2VfYmRmICkKLSNkZWZpbmUgU0ZOVF9JTlRFUkZBQ0VfR0VUICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPnNmbnRfaW50ZXJmYWNlICkKLQotCi0gIC8qIHNlZSBzZm50cGljLmMgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiAqLwotICB2b2lkCi0gIHNmbnRfbW9kdWxlX2NsYXNzX3BpY19mcmVlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLSAgRlRfRXJyb3IKLSAgc2ZudF9tb2R1bGVfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gIC8qICovCi0KLSNlbmRpZiAvKiBfX1NGTlRQSUNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9zZm9ianMuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3Nmb2Jqcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGQzYWRlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3Nmb2Jqcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzZm9ianMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgU0ZOVCBvYmplY3QgbWFuYWdlbWVudCAoYmFzZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgInNmb2Jqcy5oIgotI2luY2x1ZGUgInR0bG9hZC5oIgotI2luY2x1ZGUgInR0Y21hcC5oIgotI2luY2x1ZGUgInR0a2Vybi5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0ZOVF9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9JRFNfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAotI2luY2x1ZGUgRlRfU0ZOVF9OQU1FU19ICi0jaW5jbHVkZSBGVF9HWklQX0gKLSNpbmNsdWRlICJzZmVycm9ycy5oIgotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9CREYKLSNpbmNsdWRlICJ0dGJkZi5oIgotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV9zZm9ianMKLQotCi0KLSAgLyogY29udmVydCBhIFVURi0xNiBuYW1lIGVudHJ5IHRvIEFTQ0lJICovCi0gIHN0YXRpYyBGVF9TdHJpbmcqCi0gIHR0X25hbWVfZW50cnlfYXNjaWlfZnJvbV91dGYxNiggVFRfTmFtZUVudHJ5ICBlbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9TdHJpbmcqICBzdHJpbmcgPSBOVUxMOwotICAgIEZUX1VJbnQgICAgIGxlbiwgY29kZSwgbjsKLSAgICBGVF9CeXRlKiAgICByZWFkICAgPSAoRlRfQnl0ZSopZW50cnktPnN0cmluZzsKLSAgICBGVF9FcnJvciAgICBlcnJvcjsKLQotCi0gICAgbGVuID0gKEZUX1VJbnQpZW50cnktPnN0cmluZ0xlbmd0aCAvIDI7Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggc3RyaW5nLCBsZW4gKyAxICkgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBmb3IgKCBuID0gMDsgbiA8IGxlbjsgbisrICkKLSAgICB7Ci0gICAgICBjb2RlID0gRlRfTkVYVF9VU0hPUlQoIHJlYWQgKTsKLQotICAgICAgaWYgKCBjb2RlID09IDAgKQotICAgICAgICBicmVhazsKLQotICAgICAgaWYgKCBjb2RlIDwgMzIgfHwgY29kZSA+IDEyNyApCi0gICAgICAgIGNvZGUgPSAnPyc7Ci0KLSAgICAgIHN0cmluZ1tuXSA9IChjaGFyKWNvZGU7Ci0gICAgfQotCi0gICAgc3RyaW5nW25dID0gMDsKLQotICAgIHJldHVybiBzdHJpbmc7Ci0gIH0KLQotCi0gIC8qIGNvbnZlcnQgYW4gQXBwbGUgUm9tYW4gb3Igc3ltYm9sIG5hbWUgZW50cnkgdG8gQVNDSUkgKi8KLSAgc3RhdGljIEZUX1N0cmluZyoKLSAgdHRfbmFtZV9lbnRyeV9hc2NpaV9mcm9tX290aGVyKCBUVF9OYW1lRW50cnkgIGVudHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ICkKLSAgewotICAgIEZUX1N0cmluZyogIHN0cmluZyA9IE5VTEw7Ci0gICAgRlRfVUludCAgICAgbGVuLCBjb2RlLCBuOwotICAgIEZUX0J5dGUqICAgIHJlYWQgICA9IChGVF9CeXRlKillbnRyeS0+c3RyaW5nOwotICAgIEZUX0Vycm9yICAgIGVycm9yOwotCi0KLSAgICBsZW4gPSAoRlRfVUludCllbnRyeS0+c3RyaW5nTGVuZ3RoOwotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIHN0cmluZywgbGVuICsgMSApICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgZm9yICggbiA9IDA7IG4gPCBsZW47IG4rKyApCi0gICAgewotICAgICAgY29kZSA9ICpyZWFkKys7Ci0KLSAgICAgIGlmICggY29kZSA9PSAwICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmICggY29kZSA8IDMyIHx8IGNvZGUgPiAxMjcgKQotICAgICAgICBjb2RlID0gJz8nOwotCi0gICAgICBzdHJpbmdbbl0gPSAoY2hhciljb2RlOwotICAgIH0KLQotICAgIHN0cmluZ1tuXSA9IDA7Ci0KLSAgICByZXR1cm4gc3RyaW5nOwotICB9Ci0KLQotICB0eXBlZGVmIEZUX1N0cmluZyogICgqVFRfTmFtZUVudHJ5X0NvbnZlcnRGdW5jKSggVFRfTmFtZUVudHJ5ICBlbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgbWVtb3J5ICk7Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIHNmbnQuaCAqLwotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2dldF9uYW1lKCBUVF9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgIG5hbWVpZCwKLSAgICAgICAgICAgICAgICAgICAgRlRfU3RyaW5nKiogIG5hbWUgKQotICB7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgZXJyb3IgID0gRlRfRXJyX09rOwotICAgIEZUX1N0cmluZyogICAgICAgIHJlc3VsdCA9IE5VTEw7Ci0gICAgRlRfVVNob3J0ICAgICAgICAgbjsKLSAgICBUVF9OYW1lRW50cnlSZWMqICByZWM7Ci0gICAgRlRfSW50ICAgICAgICAgICAgZm91bmRfYXBwbGUgICAgICAgICA9IC0xOwotICAgIEZUX0ludCAgICAgICAgICAgIGZvdW5kX2FwcGxlX3JvbWFuICAgPSAtMTsKLSAgICBGVF9JbnQgICAgICAgICAgICBmb3VuZF9hcHBsZV9lbmdsaXNoID0gLTE7Ci0gICAgRlRfSW50ICAgICAgICAgICAgZm91bmRfd2luICAgICAgICAgICA9IC0xOwotICAgIEZUX0ludCAgICAgICAgICAgIGZvdW5kX3VuaWNvZGUgICAgICAgPSAtMTsKLQotICAgIEZUX0Jvb2wgICAgICAgICAgIGlzX2VuZ2xpc2ggPSAwOwotCi0gICAgVFRfTmFtZUVudHJ5X0NvbnZlcnRGdW5jICBjb252ZXJ0OwotCi0KLSAgICBGVF9BU1NFUlQoIG5hbWUgKTsKLQotICAgIHJlYyA9IGZhY2UtPm5hbWVfdGFibGUubmFtZXM7Ci0gICAgZm9yICggbiA9IDA7IG4gPCBmYWNlLT5udW1fbmFtZXM7IG4rKywgcmVjKysgKQotICAgIHsKLSAgICAgIC8qIEFjY29yZGluZyB0byB0aGUgT3BlblR5cGUgMS4zIHNwZWNpZmljYXRpb24sIG9ubHkgTWljcm9zb2Z0IG9yICAqLwotICAgICAgLyogQXBwbGUgcGxhdGZvcm0gSURzIG1pZ2h0IGJlIHVzZWQgaW4gdGhlIGBuYW1lJyB0YWJsZS4gIFRoZSAgICAgICovCi0gICAgICAvKiBgVW5pY29kZScgcGxhdGZvcm0gaXMgcmVzZXJ2ZWQgZm9yIHRoZSBgY21hcCcgdGFibGUsIGFuZCB0aGUgICAgKi8KLSAgICAgIC8qIGBJU08nIG9uZSBpcyBkZXByZWNhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBIb3dldmVyLCB0aGUgQXBwbGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiBkb2Vzbid0IHNheSB0aGUgc2FtZSAgKi8KLSAgICAgIC8qIHRoaW5nIGFuZCBnb2VzIHRvIHN1Z2dlc3QgdGhhdCBhbGwgVW5pY29kZSBgbmFtZScgdGFibGUgZW50cmllcyAqLwotICAgICAgLyogc2hvdWxkIGJlIGNvZGVkIGluIFVURi0xNiAoaW4gYmlnLWVuZGlhbiBmb3JtYXQgSSBzdXBwb3NlKS4gICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggcmVjLT5uYW1lSUQgPT0gbmFtZWlkICYmIHJlYy0+c3RyaW5nTGVuZ3RoID4gMCApCi0gICAgICB7Ci0gICAgICAgIHN3aXRjaCAoIHJlYy0+cGxhdGZvcm1JRCApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSBUVF9QTEFURk9STV9BUFBMRV9VTklDT0RFOgotICAgICAgICBjYXNlIFRUX1BMQVRGT1JNX0lTTzoKLSAgICAgICAgICAvKiB0aGVyZSBpcyBgbGFuZ3VhZ2VJRCcgdG8gY2hlY2sgdGhlcmUuICBXZSBzaG91bGQgdXNlIHRoaXMgKi8KLSAgICAgICAgICAvKiBmaWVsZCBvbmx5IGFzIGEgbGFzdCBzb2x1dGlvbiB3aGVuIG5vdGhpbmcgZWxzZSBpcyAgICAgICAgKi8KLSAgICAgICAgICAvKiBhdmFpbGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBmb3VuZF91bmljb2RlID0gbjsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFRUX1BMQVRGT1JNX01BQ0lOVE9TSDoKLSAgICAgICAgICAvKiBUaGlzIGlzIGEgYml0IHNwZWNpYWwgYmVjYXVzZSBzb21lIGZvbnRzIHdpbGwgdXNlIGVpdGhlciAgICAqLwotICAgICAgICAgIC8qIGFuIEVuZ2xpc2ggbGFuZ3VhZ2UgaWQsIG9yIGEgUm9tYW4gZW5jb2RpbmcgaWQsIHRvIGluZGljYXRlICovCi0gICAgICAgICAgLyogdGhlIEVuZ2xpc2ggdmVyc2lvbiBvZiBpdHMgZm9udCBuYW1lLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGlmICggcmVjLT5sYW5ndWFnZUlEID09IFRUX01BQ19MQU5HSURfRU5HTElTSCApCi0gICAgICAgICAgICBmb3VuZF9hcHBsZV9lbmdsaXNoID0gbjsKLSAgICAgICAgICBlbHNlIGlmICggcmVjLT5lbmNvZGluZ0lEID09IFRUX01BQ19JRF9ST01BTiApCi0gICAgICAgICAgICBmb3VuZF9hcHBsZV9yb21hbiA9IG47Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUVF9QTEFURk9STV9NSUNST1NPRlQ6Ci0gICAgICAgICAgLyogd2Ugb25seSB0YWtlIGEgbm9uLUVuZ2xpc2ggbmFtZSB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgKi8KLSAgICAgICAgICAvKiBlbHNlIGF2YWlsYWJsZSBpbiB0aGUgZm9udCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgaWYgKCBmb3VuZF93aW4gPT0gLTEgfHwgKCByZWMtPmxhbmd1YWdlSUQgJiAweDNGRiApID09IDB4MDA5ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKCByZWMtPmVuY29kaW5nSUQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgY2FzZSBUVF9NU19JRF9TWU1CT0xfQ1M6Ci0gICAgICAgICAgICBjYXNlIFRUX01TX0lEX1VOSUNPREVfQ1M6Ci0gICAgICAgICAgICBjYXNlIFRUX01TX0lEX1VDU180OgotICAgICAgICAgICAgICBpc19lbmdsaXNoID0gRlRfQk9PTCggKCByZWMtPmxhbmd1YWdlSUQgJiAweDNGRiApID09IDB4MDA5ICk7Ci0gICAgICAgICAgICAgIGZvdW5kX3dpbiAgPSBuOwotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGZvdW5kX2FwcGxlID0gZm91bmRfYXBwbGVfcm9tYW47Ci0gICAgaWYgKCBmb3VuZF9hcHBsZV9lbmdsaXNoID49IDAgKQotICAgICAgZm91bmRfYXBwbGUgPSBmb3VuZF9hcHBsZV9lbmdsaXNoOwotCi0gICAgLyogc29tZSBmb250cyBjb250YWluIGludmFsaWQgVW5pY29kZSBvciBNYWNpbnRvc2ggZm9ybWF0dGVkIGVudHJpZXM7ICovCi0gICAgLyogd2Ugd2lsbCB0aHVzIGZhdm9yIG5hbWVzIGVuY29kZWQgaW4gV2luZG93cyBmb3JtYXRzIGlmIGF2YWlsYWJsZSAgICovCi0gICAgLyogKHByb3ZpZGVkIGl0IGlzIGFuIEVuZ2xpc2ggbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgY29udmVydCA9IE5VTEw7Ci0gICAgaWYgKCBmb3VuZF93aW4gPj0gMCAmJiAhKCBmb3VuZF9hcHBsZSA+PSAwICYmICFpc19lbmdsaXNoICkgKQotICAgIHsKLSAgICAgIHJlYyA9IGZhY2UtPm5hbWVfdGFibGUubmFtZXMgKyBmb3VuZF93aW47Ci0gICAgICBzd2l0Y2ggKCByZWMtPmVuY29kaW5nSUQgKQotICAgICAgewotICAgICAgICAvKiBhbGwgVW5pY29kZSBzdHJpbmdzIGFyZSBlbmNvZGVkIHVzaW5nIFVURi0xNkJFICovCi0gICAgICBjYXNlIFRUX01TX0lEX1VOSUNPREVfQ1M6Ci0gICAgICBjYXNlIFRUX01TX0lEX1NZTUJPTF9DUzoKLSAgICAgICAgY29udmVydCA9IHR0X25hbWVfZW50cnlfYXNjaWlfZnJvbV91dGYxNjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVFRfTVNfSURfVUNTXzQ6Ci0gICAgICAgIC8qIEFwcGFyZW50bHksIGlmIHRoaXMgdmFsdWUgaXMgZm91bmQgaW4gYSBuYW1lIHRhYmxlIGVudHJ5LCBpdCBpcyAqLwotICAgICAgICAvKiBkb2N1bWVudGVkIGFzIGBmdWxsIFVuaWNvZGUgcmVwZXJ0b2lyZScuICBFeHBlcmllbmNlIHdpdGggdGhlICAgKi8KLSAgICAgICAgLyogTXNHb3RoaWMgZm9udCBzaGlwcGVkIHdpdGggV2luZG93cyBWaXN0YSBzaG93cyB0aGF0IHRoaXMgcmVhbGx5ICovCi0gICAgICAgIC8qIG1lYW5zIFVURi0xNiBlbmNvZGVkIG5hbWVzIChVQ1MtNCB2YWx1ZXMgYXJlIG9ubHkgdXNlZCB3aXRoaW4gICAqLwotICAgICAgICAvKiBjaGFybWFwcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgY29udmVydCA9IHR0X25hbWVfZW50cnlfYXNjaWlfZnJvbV91dGYxNjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoIGZvdW5kX2FwcGxlID49IDAgKQotICAgIHsKLSAgICAgIHJlYyAgICAgPSBmYWNlLT5uYW1lX3RhYmxlLm5hbWVzICsgZm91bmRfYXBwbGU7Ci0gICAgICBjb252ZXJ0ID0gdHRfbmFtZV9lbnRyeV9hc2NpaV9mcm9tX290aGVyOwotICAgIH0KLSAgICBlbHNlIGlmICggZm91bmRfdW5pY29kZSA+PSAwICkKLSAgICB7Ci0gICAgICByZWMgICAgID0gZmFjZS0+bmFtZV90YWJsZS5uYW1lcyArIGZvdW5kX3VuaWNvZGU7Ci0gICAgICBjb252ZXJ0ID0gdHRfbmFtZV9lbnRyeV9hc2NpaV9mcm9tX3V0ZjE2OwotICAgIH0KLQotICAgIGlmICggcmVjICYmIGNvbnZlcnQgKQotICAgIHsKLSAgICAgIGlmICggcmVjLT5zdHJpbmcgPT0gTlVMTCApCi0gICAgICB7Ci0gICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gZmFjZS0+bmFtZV90YWJsZS5zdHJlYW07Ci0KLQotICAgICAgICBpZiAoIEZUX1FORVdfQVJSQVkgKCByZWMtPnN0cmluZywgcmVjLT5zdHJpbmdMZW5ndGggKSB8fAotICAgICAgICAgICAgIEZUX1NUUkVBTV9TRUVLKCByZWMtPnN0cmluZ09mZnNldCApICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgIEZUX1NUUkVBTV9SRUFEKCByZWMtPnN0cmluZywgcmVjLT5zdHJpbmdMZW5ndGggKSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9GUkVFKCByZWMtPnN0cmluZyApOwotICAgICAgICAgIHJlYy0+c3RyaW5nTGVuZ3RoID0gMDsKLSAgICAgICAgICByZXN1bHQgICAgICAgICAgICA9IE5VTEw7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHJlc3VsdCA9IGNvbnZlcnQoIHJlYywgbWVtb3J5ICk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgKm5hbWUgPSByZXN1bHQ7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRW5jb2RpbmcKLSAgc2ZudF9maW5kX2VuY29kaW5nKCBpbnQgIHBsYXRmb3JtX2lkLAotICAgICAgICAgICAgICAgICAgICAgIGludCAgZW5jb2RpbmdfaWQgKQotICB7Ci0gICAgdHlwZWRlZiBzdHJ1Y3QgIFRFbmNvZGluZ18KLSAgICB7Ci0gICAgICBpbnQgICAgICAgICAgcGxhdGZvcm1faWQ7Ci0gICAgICBpbnQgICAgICAgICAgZW5jb2RpbmdfaWQ7Ci0gICAgICBGVF9FbmNvZGluZyAgZW5jb2Rpbmc7Ci0KLSAgICB9IFRFbmNvZGluZzsKLQotICAgIHN0YXRpYwotICAgIGNvbnN0IFRFbmNvZGluZyAgdHRfZW5jb2RpbmdzW10gPQotICAgIHsKLSAgICAgIHsgVFRfUExBVEZPUk1fSVNPLCAgICAgICAgICAgLTEsICAgICAgICAgICAgICAgICAgRlRfRU5DT0RJTkdfVU5JQ09ERSB9LAotCi0gICAgICB7IFRUX1BMQVRGT1JNX0FQUExFX1VOSUNPREUsIC0xLCAgICAgICAgICAgICAgICAgIEZUX0VOQ09ESU5HX1VOSUNPREUgfSwKLQotICAgICAgeyBUVF9QTEFURk9STV9NQUNJTlRPU0gsICAgICBUVF9NQUNfSURfUk9NQU4sICAgICBGVF9FTkNPRElOR19BUFBMRV9ST01BTiB9LAotCi0gICAgICB7IFRUX1BMQVRGT1JNX01JQ1JPU09GVCwgICAgIFRUX01TX0lEX1NZTUJPTF9DUywgIEZUX0VOQ09ESU5HX01TX1NZTUJPTCB9LAotICAgICAgeyBUVF9QTEFURk9STV9NSUNST1NPRlQsICAgICBUVF9NU19JRF9VQ1NfNCwgICAgICBGVF9FTkNPRElOR19VTklDT0RFIH0sCi0gICAgICB7IFRUX1BMQVRGT1JNX01JQ1JPU09GVCwgICAgIFRUX01TX0lEX1VOSUNPREVfQ1MsIEZUX0VOQ09ESU5HX1VOSUNPREUgfSwKLSAgICAgIHsgVFRfUExBVEZPUk1fTUlDUk9TT0ZULCAgICAgVFRfTVNfSURfU0pJUywgICAgICAgRlRfRU5DT0RJTkdfU0pJUyB9LAotICAgICAgeyBUVF9QTEFURk9STV9NSUNST1NPRlQsICAgICBUVF9NU19JRF9HQjIzMTIsICAgICBGVF9FTkNPRElOR19HQjIzMTIgfSwKLSAgICAgIHsgVFRfUExBVEZPUk1fTUlDUk9TT0ZULCAgICAgVFRfTVNfSURfQklHXzUsICAgICAgRlRfRU5DT0RJTkdfQklHNSB9LAotICAgICAgeyBUVF9QTEFURk9STV9NSUNST1NPRlQsICAgICBUVF9NU19JRF9XQU5TVU5HLCAgICBGVF9FTkNPRElOR19XQU5TVU5HIH0sCi0gICAgICB7IFRUX1BMQVRGT1JNX01JQ1JPU09GVCwgICAgIFRUX01TX0lEX0pPSEFCLCAgICAgIEZUX0VOQ09ESU5HX0pPSEFCIH0KLSAgICB9OwotCi0gICAgY29uc3QgVEVuY29kaW5nICAqY3VyLCAqbGltaXQ7Ci0KLQotICAgIGN1ciAgID0gdHRfZW5jb2RpbmdzOwotICAgIGxpbWl0ID0gY3VyICsgc2l6ZW9mICggdHRfZW5jb2RpbmdzICkgLyBzaXplb2YgKCB0dF9lbmNvZGluZ3NbMF0gKTsKLQotICAgIGZvciAoIDsgY3VyIDwgbGltaXQ7IGN1cisrICkKLSAgICB7Ci0gICAgICBpZiAoIGN1ci0+cGxhdGZvcm1faWQgPT0gcGxhdGZvcm1faWQgKQotICAgICAgewotICAgICAgICBpZiAoIGN1ci0+ZW5jb2RpbmdfaWQgPT0gZW5jb2RpbmdfaWQgfHwKLSAgICAgICAgICAgICBjdXItPmVuY29kaW5nX2lkID09IC0xICAgICAgICAgICkKLSAgICAgICAgICByZXR1cm4gY3VyLT5lbmNvZGluZzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRU5DT0RJTkdfTk9ORTsKLSAgfQotCi0KLSNkZWZpbmUgV1JJVEVfVVNIT1JUKCBwLCB2ICkgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICoocCkrKyA9IChGVF9CeXRlKSggKHYpID4+IDggKTsgXAotICAgICAgICAgICAgKihwKSsrID0gKEZUX0J5dGUpKCAodikgPj4gMCApOyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9IHdoaWxlICggMCApCi0KLSNkZWZpbmUgV1JJVEVfVUxPTkcoIHAsIHYgKSAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICoocCkrKyA9IChGVF9CeXRlKSggKHYpID4+IDI0ICk7IFwKLSAgICAgICAgICAgICoocCkrKyA9IChGVF9CeXRlKSggKHYpID4+IDE2ICk7IFwKLSAgICAgICAgICAgICoocCkrKyA9IChGVF9CeXRlKSggKHYpID4+ICA4ICk7IFwKLSAgICAgICAgICAgICoocCkrKyA9IChGVF9CeXRlKSggKHYpID4+ICAwICk7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9IHdoaWxlICggMCApCi0KLQotICBzdGF0aWMgdm9pZAotICBzZm50X3N0cmVhbV9jbG9zZSggRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLQotCi0gICAgRlRfRlJFRSggc3RyZWFtLT5iYXNlICk7Ci0KLSAgICBzdHJlYW0tPnNpemUgID0gMDsKLSAgICBzdHJlYW0tPmJhc2UgID0gTlVMTDsKLSAgICBzdHJlYW0tPmNsb3NlID0gTlVMTDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBpbnQgKQotICBjb21wYXJlX29mZnNldHMoIGNvbnN0IHZvaWQqICBhLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqICBiICkKLSAgewotICAgIFdPRkZfVGFibGUgIHRhYmxlMSA9ICooV09GRl9UYWJsZSopYTsKLSAgICBXT0ZGX1RhYmxlICB0YWJsZTIgPSAqKFdPRkZfVGFibGUqKWI7Ci0KLSAgICBGVF9VTG9uZyAgb2Zmc2V0MSA9IHRhYmxlMS0+T2Zmc2V0OwotICAgIEZUX1VMb25nICBvZmZzZXQyID0gdGFibGUyLT5PZmZzZXQ7Ci0KLQotICAgIGlmICggb2Zmc2V0MSA+IG9mZnNldDIgKQotICAgICAgcmV0dXJuIDE7Ci0gICAgZWxzZSBpZiAoIG9mZnNldDEgPCBvZmZzZXQyICkKLSAgICAgIHJldHVybiAtMTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgLyogUmVwbGFjZSBgZmFjZS0+cm9vdC5zdHJlYW0nIHdpdGggYSBzdHJlYW0gY29udGFpbmluZyB0aGUgZXh0cmFjdGVkICovCi0gIC8qIFNGTlQgb2YgYSBXT0ZGIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB3b2ZmX29wZW5fZm9udCggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBUVF9GYWNlICAgIGZhY2UgKQotICB7Ci0gICAgRlRfTWVtb3J5ICAgICAgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotICAgIEZUX0Vycm9yICAgICAgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0KLSAgICBXT0ZGX0hlYWRlclJlYyAgd29mZjsKLSAgICBXT0ZGX1RhYmxlICAgICAgdGFibGVzICA9IE5VTEw7Ci0gICAgV09GRl9UYWJsZSogICAgIGluZGljZXMgPSBOVUxMOwotCi0gICAgRlRfVUxvbmcgICAgICAgIHdvZmZfb2Zmc2V0OwotCi0gICAgRlRfQnl0ZSogICAgICAgIHNmbnQgICAgICAgID0gTlVMTDsKLSAgICBGVF9TdHJlYW0gICAgICAgc2ZudF9zdHJlYW0gPSBOVUxMOwotCi0gICAgRlRfQnl0ZSogICAgICAgIHNmbnRfaGVhZGVyOwotICAgIEZUX1VMb25nICAgICAgICBzZm50X29mZnNldDsKLQotICAgIEZUX0ludCAgICAgICAgICBubjsKLSAgICBGVF9VTG9uZyAgICAgICAgb2xkX3RhZyA9IDA7Ci0KLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIHdvZmZfaGVhZGVyX2ZpZWxkc1tdID0KLSAgICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFdPRkZfSGVhZGVyUmVjCi0KLSAgICAgIEZUX0ZSQU1FX1NUQVJUKCA0NCApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIHNpZ25hdHVyZSApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIGZsYXZvciApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIGxlbmd0aCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIG51bV90YWJsZXMgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCByZXNlcnZlZCApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIHRvdGFsU2ZudFNpemUgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtYWpvclZlcnNpb24gKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtaW5vclZlcnNpb24gKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcgKCBtZXRhT2Zmc2V0ICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggbWV0YUxlbmd0aCApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIG1ldGFPcmlnTGVuZ3RoICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggcHJpdk9mZnNldCApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIHByaXZMZW5ndGggKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLQotICAgIEZUX0FTU0VSVCggc3RyZWFtID09IGZhY2UtPnJvb3Quc3RyZWFtICk7Ci0gICAgRlRfQVNTRVJUKCBGVF9TVFJFQU1fUE9TKCkgPT0gMCApOwotCi0gICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIHdvZmZfaGVhZGVyX2ZpZWxkcywgJndvZmYgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgcmVjdXJzZSBiYWNrIGhlcmUgb3IgaGl0IFRUQyBjb2RlLiAqLwotICAgIGlmICggd29mZi5mbGF2b3IgPT0gVFRBR193T0ZGIHx8IHdvZmYuZmxhdm9yID09IFRUQUdfdHRjZiApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLQotICAgIC8qIE1pc2NlbGxhbmVvdXMgY2hlY2tzLiAqLwotICAgIGlmICggd29mZi5sZW5ndGggIT0gc3RyZWFtLT5zaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgIHdvZmYubnVtX3RhYmxlcyA9PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICA0NCArIHdvZmYubnVtX3RhYmxlcyAqIDIwVUwgPj0gd29mZi5sZW5ndGggICAgICAgICAgICAgICB8fAotICAgICAgICAgMTIgKyB3b2ZmLm51bV90YWJsZXMgKiAxNlVMID49IHdvZmYudG90YWxTZm50U2l6ZSAgICAgICAgfHwKLSAgICAgICAgICggd29mZi50b3RhbFNmbnRTaXplICYgMyApICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAoIHdvZmYubWV0YU9mZnNldCA9PSAwICYmICggd29mZi5tZXRhTGVuZ3RoICE9IDAgICAgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29mZi5tZXRhT3JpZ0xlbmd0aCAhPSAwICkgKSB8fAotICAgICAgICAgKCB3b2ZmLm1ldGFMZW5ndGggIT0gMCAmJiB3b2ZmLm1ldGFPcmlnTGVuZ3RoID09IDAgKSAgICAgfHwKLSAgICAgICAgICggd29mZi5wcml2T2Zmc2V0ID09IDAgJiYgd29mZi5wcml2TGVuZ3RoICE9IDAgKSAgICAgICAgICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotCi0gICAgaWYgKCBGVF9BTExPQyggc2ZudCwgd29mZi50b3RhbFNmbnRTaXplICkgfHwKLSAgICAgICAgIEZUX05FVyggc2ZudF9zdHJlYW0gKSAgICAgICAgICAgICAgICApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBzZm50X2hlYWRlciA9IHNmbnQ7Ci0KLSAgICAvKiBXcml0ZSBzZm50IGhlYWRlci4gKi8KLSAgICB7Ci0gICAgICBGVF9VSW50ICBzZWFyY2hSYW5nZSwgZW50cnlTZWxlY3RvciwgcmFuZ2VTaGlmdCwgeDsKLQotCi0gICAgICB4ICAgICAgICAgICAgID0gd29mZi5udW1fdGFibGVzOwotICAgICAgZW50cnlTZWxlY3RvciA9IDA7Ci0gICAgICB3aGlsZSAoIHggKQotICAgICAgewotICAgICAgICB4ICAgICAgICAgICAgPj49IDE7Ci0gICAgICAgIGVudHJ5U2VsZWN0b3IgKz0gMTsKLSAgICAgIH0KLSAgICAgIGVudHJ5U2VsZWN0b3ItLTsKLQotICAgICAgc2VhcmNoUmFuZ2UgPSAoIDEgPDwgZW50cnlTZWxlY3RvciApICogMTY7Ci0gICAgICByYW5nZVNoaWZ0ICA9IHdvZmYubnVtX3RhYmxlcyAqIDE2IC0gc2VhcmNoUmFuZ2U7Ci0KLSAgICAgIFdSSVRFX1VMT05HICggc2ZudF9oZWFkZXIsIHdvZmYuZmxhdm9yICk7Ci0gICAgICBXUklURV9VU0hPUlQoIHNmbnRfaGVhZGVyLCB3b2ZmLm51bV90YWJsZXMgKTsKLSAgICAgIFdSSVRFX1VTSE9SVCggc2ZudF9oZWFkZXIsIHNlYXJjaFJhbmdlICk7Ci0gICAgICBXUklURV9VU0hPUlQoIHNmbnRfaGVhZGVyLCBlbnRyeVNlbGVjdG9yICk7Ci0gICAgICBXUklURV9VU0hPUlQoIHNmbnRfaGVhZGVyLCByYW5nZVNoaWZ0ICk7Ci0gICAgfQotCi0gICAgLyogV2hpbGUgdGhlIGVudHJpZXMgaW4gdGhlIHNmbnQgaGVhZGVyIG11c3QgYmUgc29ydGVkIGJ5IHRoZSAqLwotICAgIC8qIHRhZyB2YWx1ZSwgdGhlIHRhYmxlcyB0aGVtc2VsdmVzIGFyZSBub3QuICBXZSB0aHVzIGhhdmUgdG8gKi8KLSAgICAvKiBzb3J0IHRoZW0gYnkgb2Zmc2V0IGFuZCBjaGVjayB0aGF0IHRoZXkgZG9uJ3Qgb3ZlcmxhcC4gICAgICovCi0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggdGFibGVzLCB3b2ZmLm51bV90YWJsZXMgKSAgfHwKLSAgICAgICAgIEZUX05FV19BUlJBWSggaW5kaWNlcywgd29mZi5udW1fdGFibGVzICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgRlRfVFJBQ0UyKCggIlxuIgotICAgICAgICAgICAgICAgICIgIHRhZyAgICBvZmZzZXQgICAgY29tcExlbiAgb3JpZ0xlbiAgY2hlY2tzdW1cbiIKLSAgICAgICAgICAgICAgICAiICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICkpOwotCi0gICAgaWYgKCBGVF9GUkFNRV9FTlRFUiggMjBMICogd29mZi5udW1fdGFibGVzICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZm9yICggbm4gPSAwOyBubiA8IHdvZmYubnVtX3RhYmxlczsgbm4rKyApCi0gICAgewotICAgICAgV09GRl9UYWJsZSAgdGFibGUgPSB0YWJsZXMgKyBubjsKLQotICAgICAgdGFibGUtPlRhZyAgICAgICAgPSBGVF9HRVRfVEFHNCgpOwotICAgICAgdGFibGUtPk9mZnNldCAgICAgPSBGVF9HRVRfVUxPTkcoKTsKLSAgICAgIHRhYmxlLT5Db21wTGVuZ3RoID0gRlRfR0VUX1VMT05HKCk7Ci0gICAgICB0YWJsZS0+T3JpZ0xlbmd0aCA9IEZUX0dFVF9VTE9ORygpOwotICAgICAgdGFibGUtPkNoZWNrU3VtICAgPSBGVF9HRVRfVUxPTkcoKTsKLQotICAgICAgRlRfVFJBQ0UyKCggIiAgJWMlYyVjJWMgICUwOGx4ICAlMDhseCAgJTA4bHggICUwOGx4XG4iLAotICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCB0YWJsZS0+VGFnID4+IDI0ICksCi0gICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIHRhYmxlLT5UYWcgPj4gMTYgKSwKLSAgICAgICAgICAgICAgICAgIChGVF9DaGFyKSggdGFibGUtPlRhZyA+PiA4ICApLAotICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCB0YWJsZS0+VGFnICAgICAgICksCi0gICAgICAgICAgICAgICAgICB0YWJsZS0+T2Zmc2V0LAotICAgICAgICAgICAgICAgICAgdGFibGUtPkNvbXBMZW5ndGgsCi0gICAgICAgICAgICAgICAgICB0YWJsZS0+T3JpZ0xlbmd0aCwKLSAgICAgICAgICAgICAgICAgIHRhYmxlLT5DaGVja1N1bSApKTsKLQotICAgICAgaWYgKCB0YWJsZS0+VGFnIDw9IG9sZF90YWcgKQotICAgICAgewotICAgICAgICBGVF9GUkFNRV9FWElUKCk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBvbGRfdGFnICAgICA9IHRhYmxlLT5UYWc7Ci0gICAgICBpbmRpY2VzW25uXSA9IHRhYmxlOwotICAgIH0KLQotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICAgIC8qIFNvcnQgYnkgb2Zmc2V0LiAqLwotCi0gICAgZnRfcXNvcnQoIGluZGljZXMsCi0gICAgICAgICAgICAgIHdvZmYubnVtX3RhYmxlcywKLSAgICAgICAgICAgICAgc2l6ZW9mICggV09GRl9UYWJsZSApLAotICAgICAgICAgICAgICBjb21wYXJlX29mZnNldHMgKTsKLQotICAgIC8qIENoZWNrIG9mZnNldHMgYW5kIGxlbmd0aHMuICovCi0KLSAgICB3b2ZmX29mZnNldCA9IDQ0ICsgd29mZi5udW1fdGFibGVzICogMjBMOwotICAgIHNmbnRfb2Zmc2V0ID0gMTIgKyB3b2ZmLm51bV90YWJsZXMgKiAxNkw7Ci0KLSAgICBmb3IgKCBubiA9IDA7IG5uIDwgd29mZi5udW1fdGFibGVzOyBubisrICkKLSAgICB7Ci0gICAgICBXT0ZGX1RhYmxlICB0YWJsZSA9IGluZGljZXNbbm5dOwotCi0KLSAgICAgIGlmICggdGFibGUtPk9mZnNldCAhPSB3b2ZmX29mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICB0YWJsZS0+Q29tcExlbmd0aCA+IHdvZmYubGVuZ3RoICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIHRhYmxlLT5PZmZzZXQgPiB3b2ZmLmxlbmd0aCAtIHRhYmxlLT5Db21wTGVuZ3RoICAgICAgfHwKLSAgICAgICAgICAgdGFibGUtPk9yaWdMZW5ndGggPiB3b2ZmLnRvdGFsU2ZudFNpemUgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBzZm50X29mZnNldCA+IHdvZmYudG90YWxTZm50U2l6ZSAtIHRhYmxlLT5PcmlnTGVuZ3RoIHx8Ci0gICAgICAgICAgIHRhYmxlLT5Db21wTGVuZ3RoID4gdGFibGUtPk9yaWdMZW5ndGggICAgICAgICAgICAgICAgKQotICAgICAgewotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgdGFibGUtPk9yaWdPZmZzZXQgPSBzZm50X29mZnNldDsKLQotICAgICAgLyogVGhlIG9mZnNldHMgbXVzdCBiZSBtdWx0aXBsZXMgb2YgNC4gKi8KLSAgICAgIHdvZmZfb2Zmc2V0ICs9ICggdGFibGUtPkNvbXBMZW5ndGggKyAzICkgJiB+M1U7Ci0gICAgICBzZm50X29mZnNldCArPSAoIHRhYmxlLT5PcmlnTGVuZ3RoICsgMyApICYgfjNVOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRmluYWwgY2hlY2tzIQotICAgICAqCi0gICAgICogV2UgZG9uJ3QgZGVjb2RlIGFuZCBjaGVjayB0aGUgbWV0YWRhdGEgYmxvY2suCi0gICAgICogV2UgZG9uJ3QgY2hlY2sgdGFibGUgY2hlY2tzdW1zIGVpdGhlci4KLSAgICAgKiBCdXQgb3RoZXIgdGhhbiB0aG9zZSwgSSB0aGluayB3ZSBpbXBsZW1lbnQgYWxsCi0gICAgICogYE1VU1QnIGNoZWNrcyBmcm9tIHRoZSBzcGVjLgotICAgICAqLwotCi0gICAgaWYgKCB3b2ZmLm1ldGFPZmZzZXQgKQotICAgIHsKLSAgICAgIGlmICggd29mZi5tZXRhT2Zmc2V0ICE9IHdvZmZfb2Zmc2V0ICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgd29mZi5tZXRhT2Zmc2V0ICsgd29mZi5tZXRhTGVuZ3RoID4gd29mZi5sZW5ndGggKQotICAgICAgewotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgLyogV2UgaGF2ZSBwYWRkaW5nIG9ubHkgLi4uICovCi0gICAgICB3b2ZmX29mZnNldCArPSB3b2ZmLm1ldGFMZW5ndGg7Ci0gICAgfQotCi0gICAgaWYgKCB3b2ZmLnByaXZPZmZzZXQgKQotICAgIHsKLSAgICAgIC8qIC4uLiBpZiBpdCBpc24ndCB0aGUgbGFzdCBibG9jay4gKi8KLSAgICAgIHdvZmZfb2Zmc2V0ID0gKCB3b2ZmX29mZnNldCArIDMgKSAmIH4zVTsKLQotICAgICAgaWYgKCB3b2ZmLnByaXZPZmZzZXQgIT0gd29mZl9vZmZzZXQgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICB3b2ZmLnByaXZPZmZzZXQgKyB3b2ZmLnByaXZMZW5ndGggPiB3b2ZmLmxlbmd0aCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICAvKiBObyBwYWRkaW5nIGZvciB0aGUgbGFzdCBibG9jay4gKi8KLSAgICAgIHdvZmZfb2Zmc2V0ICs9IHdvZmYucHJpdkxlbmd0aDsKLSAgICB9Ci0KLSAgICBpZiAoIHNmbnRfb2Zmc2V0ICE9IHdvZmYudG90YWxTZm50U2l6ZSB8fAotICAgICAgICAgd29mZl9vZmZzZXQgIT0gd29mZi5sZW5ndGggICAgICAgICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogV3JpdGUgdGhlIHRhYmxlcy4gKi8KLQotICAgIGZvciAoIG5uID0gMDsgbm4gPCB3b2ZmLm51bV90YWJsZXM7IG5uKysgKQotICAgIHsKLSAgICAgIFdPRkZfVGFibGUgIHRhYmxlID0gdGFibGVzICsgbm47Ci0KLQotICAgICAgLyogV3JpdGUgU0ZOVCB0YWJsZSBlbnRyeS4gKi8KLSAgICAgIFdSSVRFX1VMT05HKCBzZm50X2hlYWRlciwgdGFibGUtPlRhZyApOwotICAgICAgV1JJVEVfVUxPTkcoIHNmbnRfaGVhZGVyLCB0YWJsZS0+Q2hlY2tTdW0gKTsKLSAgICAgIFdSSVRFX1VMT05HKCBzZm50X2hlYWRlciwgdGFibGUtPk9yaWdPZmZzZXQgKTsKLSAgICAgIFdSSVRFX1VMT05HKCBzZm50X2hlYWRlciwgdGFibGUtPk9yaWdMZW5ndGggKTsKLQotICAgICAgLyogV3JpdGUgdGFibGUgZGF0YS4gKi8KLSAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIHRhYmxlLT5PZmZzZXQgKSAgICAgfHwKLSAgICAgICAgICAgRlRfRlJBTUVfRU5URVIoIHRhYmxlLT5Db21wTGVuZ3RoICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGlmICggdGFibGUtPkNvbXBMZW5ndGggPT0gdGFibGUtPk9yaWdMZW5ndGggKQotICAgICAgewotICAgICAgICAvKiBVbmNvbXByZXNzZWQgZGF0YTsganVzdCBjb3B5LiAqLwotICAgICAgICBmdF9tZW1jcHkoIHNmbnQgKyB0YWJsZS0+T3JpZ09mZnNldCwKLSAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmN1cnNvciwKLSAgICAgICAgICAgICAgICAgICB0YWJsZS0+T3JpZ0xlbmd0aCApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX1pMSUIKLQotICAgICAgICAvKiBVbmNvbXByZXNzIHdpdGggemxpYi4gKi8KLSAgICAgICAgRlRfVUxvbmcgIG91dHB1dF9sZW4gPSB0YWJsZS0+T3JpZ0xlbmd0aDsKLQotCi0gICAgICAgIGVycm9yID0gRlRfR3ppcF9VbmNvbXByZXNzKCBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZm50ICsgdGFibGUtPk9yaWdPZmZzZXQsICZvdXRwdXRfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5jdXJzb3IsIHRhYmxlLT5Db21wTGVuZ3RoICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgaWYgKCBvdXRwdXRfbGVuICE9IHRhYmxlLT5PcmlnTGVuZ3RoICkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLQotI2Vsc2UgLyogIUZUX0NPTkZJR19PUFRJT05fVVNFX1pMSUIgKi8KLQotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLSAgICAgICAgZ290byBFeGl0OwotCi0jZW5kaWYgLyogIUZUX0NPTkZJR19PUFRJT05fVVNFX1pMSUIgKi8KLSAgICAgIH0KLQotICAgICAgRlRfRlJBTUVfRVhJVCgpOwotCi0gICAgICAvKiBXZSBkb24ndCBjaGVjayB3aGV0aGVyIHRoZSBwYWRkaW5nIGJ5dGVzIGluIHRoZSBXT0ZGIGZpbGUgYXJlICAgICAqLwotICAgICAgLyogYWN0dWFsbHkgJ1wwJy4gIEZvciB0aGUgb3V0cHV0LCBob3dldmVyLCB3ZSBkbyBzZXQgdGhlbSBwcm9wZXJseS4gKi8KLSAgICAgIHNmbnRfb2Zmc2V0ID0gdGFibGUtPk9yaWdPZmZzZXQgKyB0YWJsZS0+T3JpZ0xlbmd0aDsKLSAgICAgIHdoaWxlICggc2ZudF9vZmZzZXQgJiAzICkKLSAgICAgIHsKLSAgICAgICAgc2ZudFtzZm50X29mZnNldF0gPSAnXDAnOwotICAgICAgICBzZm50X29mZnNldCsrOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIE9rISAgRmluYWxseSByZWFkeS4gIFN3YXAgb3V0IHN0cmVhbSBhbmQgcmV0dXJuLiAqLwotICAgIEZUX1N0cmVhbV9PcGVuTWVtb3J5KCBzZm50X3N0cmVhbSwgc2ZudCwgd29mZi50b3RhbFNmbnRTaXplICk7Ci0gICAgc2ZudF9zdHJlYW0tPm1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotICAgIHNmbnRfc3RyZWFtLT5jbG9zZSAgPSBzZm50X3N0cmVhbV9jbG9zZTsKLQotICAgIEZUX1N0cmVhbV9GcmVlKAotICAgICAgZmFjZS0+cm9vdC5zdHJlYW0sCi0gICAgICAoIGZhY2UtPnJvb3QuZmFjZV9mbGFncyAmIEZUX0ZBQ0VfRkxBR19FWFRFUk5BTF9TVFJFQU0gKSAhPSAwICk7Ci0KLSAgICBmYWNlLT5yb290LnN0cmVhbSA9IHNmbnRfc3RyZWFtOwotCi0gICAgZmFjZS0+cm9vdC5mYWNlX2ZsYWdzICY9IH5GVF9GQUNFX0ZMQUdfRVhURVJOQUxfU1RSRUFNOwotCi0gIEV4aXQ6Ci0gICAgRlRfRlJFRSggdGFibGVzICk7Ci0gICAgRlRfRlJFRSggaW5kaWNlcyApOwotCi0gICAgaWYgKCBlcnJvciApCi0gICAgewotICAgICAgRlRfRlJFRSggc2ZudCApOwotICAgICAgRlRfU3RyZWFtX0Nsb3NlKCBzZm50X3N0cmVhbSApOwotICAgICAgRlRfRlJFRSggc2ZudF9zdHJlYW0gKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0jdW5kZWYgV1JJVEVfVVNIT1JUCi0jdW5kZWYgV1JJVEVfVUxPTkcKLQotCi0gIC8qIEZpbGwgaW4gZmFjZS0+dHRjX2hlYWRlci4gIElmIHRoZSBmb250IGlzIG5vdCBhIFRUQywgaXQgaXMgKi8KLSAgLyogc3ludGhlc2l6ZWQgaW50byBhIFRUQyB3aXRoIG9uZSBvZmZzZXQgdGFibGUuICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgc2ZudF9vcGVuX2ZvbnQoIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICBmYWNlICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9VTG9uZyAgIHRhZywgb2Zmc2V0OwotCi0gICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICB0dGNfaGVhZGVyX2ZpZWxkc1tdID0KLSAgICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFRUQ19IZWFkZXJSZWMKLQotICAgICAgRlRfRlJBTUVfU1RBUlQoIDggKSwKLSAgICAgICAgRlRfRlJBTUVfTE9ORyggdmVyc2lvbiApLAotICAgICAgICBGVF9GUkFNRV9MT05HKCBjb3VudCAgICksICAvKiB0aGlzIGlzIFVMb25nIGluIHRoZSBzcGVjcyAqLwotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotCi0gICAgZmFjZS0+dHRjX2hlYWRlci50YWcgICAgID0gMDsKLSAgICBmYWNlLT50dGNfaGVhZGVyLnZlcnNpb24gPSAwOwotICAgIGZhY2UtPnR0Y19oZWFkZXIuY291bnQgICA9IDA7Ci0KLSAgcmV0cnk6Ci0gICAgb2Zmc2V0ID0gRlRfU1RSRUFNX1BPUygpOwotCi0gICAgaWYgKCBGVF9SRUFEX1VMT05HKCB0YWcgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBpZiAoIHRhZyA9PSBUVEFHX3dPRkYgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICJzZm50X29wZW5fZm9udDogZmlsZSBpcyBhIFdPRkY7IHN5bnRoZXNpemluZyBTRk5UXG4iICkpOwotCi0gICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBvZmZzZXQgKSApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgZXJyb3IgPSB3b2ZmX29wZW5fZm9udCggc3RyZWFtLCBmYWNlICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICAvKiBTd2FwIG91dCBzdHJlYW0gYW5kIHJldHJ5ISAqLwotICAgICAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07Ci0gICAgICBnb3RvIHJldHJ5OwotICAgIH0KLQotICAgIGlmICggdGFnICE9IDB4MDAwMTAwMDBVTCAmJgotICAgICAgICAgdGFnICE9IFRUQUdfdHRjZiAgICAmJgotICAgICAgICAgdGFnICE9IFRUQUdfT1RUTyAgICAmJgotICAgICAgICAgdGFnICE9IFRUQUdfdHJ1ZSAgICAmJgotICAgICAgICAgdGFnICE9IFRUQUdfdHlwMSAgICAmJgotICAgICAgICAgdGFnICE9IDB4MDAwMjAwMDBVTCApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggIiAgbm90IGEgZm9udCB1c2luZyB0aGUgU0ZOVCBjb250YWluZXIgZm9ybWF0XG4iICkpOwotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0gICAgfQotCi0gICAgZmFjZS0+dHRjX2hlYWRlci50YWcgPSBUVEFHX3R0Y2Y7Ci0KLSAgICBpZiAoIHRhZyA9PSBUVEFHX3R0Y2YgKQotICAgIHsKLSAgICAgIEZUX0ludCAgbjsKLQotCi0gICAgICBGVF9UUkFDRTMoKCAic2ZudF9vcGVuX2ZvbnQ6IGZpbGUgaXMgYSBjb2xsZWN0aW9uXG4iICkpOwotCi0gICAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggdHRjX2hlYWRlcl9maWVsZHMsICZmYWNlLT50dGNfaGVhZGVyICkgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgIGlmICggZmFjZS0+dHRjX2hlYWRlci5jb3VudCA9PSAwICkKLSAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0KLSAgICAgIC8qIGEgcm91Z2ggc2l6ZSBlc3RpbWF0ZTogbGV0J3MgY29uc2VydmF0aXZlbHkgYXNzdW1lIHRoYXQgdGhlcmUgICAqLwotICAgICAgLyogaXMganVzdCBhIHNpbmdsZSB0YWJsZSBpbmZvIGluIGVhY2ggc3ViZm9udCBoZWFkZXIgKDEyICsgMTYqMSA9ICovCi0gICAgICAvKiAyOCBieXRlcyksIHRodXMgd2UgaGF2ZSAoYXQgbGVhc3QpIGAxMiArIDQqY291bnQnIGJ5dGVzIGZvciB0aGUgKi8KLSAgICAgIC8qIHNpemUgb2YgdGhlIFRUQyBoZWFkZXIgcGx1cyBgMjgqY291bnQnIGJ5dGVzIGZvciBhbGwgc3ViZm9udCAgICAqLwotICAgICAgLyogaGVhZGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIChGVF9VTG9uZylmYWNlLT50dGNfaGVhZGVyLmNvdW50ID4gc3RyZWFtLT5zaXplIC8gKCAyOCArIDQgKSApCi0gICAgICAgIHJldHVybiBGVF9USFJPVyggQXJyYXlfVG9vX0xhcmdlICk7Ci0KLSAgICAgIC8qIG5vdyByZWFkIHRoZSBvZmZzZXRzIG9mIGVhY2ggZm9udCBpbiB0aGUgZmlsZSAqLwotICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIGZhY2UtPnR0Y19oZWFkZXIub2Zmc2V0cywgZmFjZS0+dHRjX2hlYWRlci5jb3VudCApICkKLSAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICBpZiAoIEZUX0ZSQU1FX0VOVEVSKCBmYWNlLT50dGNfaGVhZGVyLmNvdW50ICogNEwgKSApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBmYWNlLT50dGNfaGVhZGVyLmNvdW50OyBuKysgKQotICAgICAgICBmYWNlLT50dGNfaGVhZGVyLm9mZnNldHNbbl0gPSBGVF9HRVRfVUxPTkcoKTsKLQotICAgICAgRlRfRlJBTUVfRVhJVCgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfVFJBQ0UzKCggInNmbnRfb3Blbl9mb250OiBzeW50aGVzaXplIFRUQ1xuIiApKTsKLQotICAgICAgZmFjZS0+dHRjX2hlYWRlci52ZXJzaW9uID0gMSA8PCAxNjsKLSAgICAgIGZhY2UtPnR0Y19oZWFkZXIuY291bnQgICA9IDE7Ci0KLSAgICAgIGlmICggRlRfTkVXKCBmYWNlLT50dGNfaGVhZGVyLm9mZnNldHMgKSApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgZmFjZS0+dHRjX2hlYWRlci5vZmZzZXRzWzBdID0gb2Zmc2V0OwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHNmbnRfaW5pdF9mYWNlKCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBUVF9GYWNlICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgZmFjZV9pbnN0YW5jZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICBGVF9QYXJhbWV0ZXIqICBwYXJhbXMgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvcjsKLSAgICBGVF9MaWJyYXJ5ICAgIGxpYnJhcnkgPSBmYWNlLT5yb290LmRyaXZlci0+cm9vdC5saWJyYXJ5OwotICAgIFNGTlRfU2VydmljZSAgc2ZudDsKLSAgICBGVF9JbnQgICAgICAgIGZhY2VfaW5kZXg7Ci0KLQotICAgIC8qIGZvciBub3csIHBhcmFtZXRlcnMgYXJlIHVudXNlZCAqLwotICAgIEZUX1VOVVNFRCggbnVtX3BhcmFtcyApOwotICAgIEZUX1VOVVNFRCggcGFyYW1zICk7Ci0KLQotICAgIHNmbnQgPSAoU0ZOVF9TZXJ2aWNlKWZhY2UtPnNmbnQ7Ci0gICAgaWYgKCAhc2ZudCApCi0gICAgewotICAgICAgc2ZudCA9IChTRk5UX1NlcnZpY2UpRlRfR2V0X01vZHVsZV9JbnRlcmZhY2UoIGxpYnJhcnksICJzZm50IiApOwotICAgICAgaWYgKCAhc2ZudCApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggInNmbnRfaW5pdF9mYWNlOiBjYW5ub3QgYWNjZXNzIGBzZm50JyBtb2R1bGVcbiIgKSk7Ci0gICAgICAgIHJldHVybiBGVF9USFJPVyggTWlzc2luZ19Nb2R1bGUgKTsKLSAgICAgIH0KLQotICAgICAgZmFjZS0+c2ZudCAgICAgICA9IHNmbnQ7Ci0gICAgICBmYWNlLT5nb3RvX3RhYmxlID0gc2ZudC0+Z290b190YWJsZTsKLSAgICB9Ci0KLSAgICBGVF9GQUNFX0ZJTkRfR0xPQkFMX1NFUlZJQ0UoIGZhY2UsIGZhY2UtPnBzbmFtZXMsIFBPU1RTQ1JJUFRfQ01BUFMgKTsKLQotICAgIEZUX1RSQUNFMigoICJTRk5UIGRyaXZlclxuIiApKTsKLQotICAgIGVycm9yID0gc2ZudF9vcGVuX2ZvbnQoIHN0cmVhbSwgZmFjZSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgLyogU3RyZWFtIG1heSBoYXZlIGNoYW5nZWQgaW4gc2ZudF9vcGVuX2ZvbnQuICovCi0gICAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07Ci0KLSAgICBGVF9UUkFDRTIoKCAic2ZudF9pbml0X2ZhY2U6ICUwOHAsICVsZFxuIiwgZmFjZSwgZmFjZV9pbnN0YW5jZV9pbmRleCApKTsKLQotICAgIGZhY2VfaW5kZXggPSBGVF9BQlMoIGZhY2VfaW5zdGFuY2VfaW5kZXggKSAmIDB4RkZGRjsKLQotICAgIGlmICggZmFjZV9pbmRleCA+PSBmYWNlLT50dGNfaGVhZGVyLmNvdW50ICkKLSAgICB7Ci0gICAgICBpZiAoIGZhY2VfaW5zdGFuY2VfaW5kZXggPj0gMCApCi0gICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZWxzZQotICAgICAgICBmYWNlX2luZGV4ID0gMDsKLSAgICB9Ci0KLSAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBmYWNlLT50dGNfaGVhZGVyLm9mZnNldHNbZmFjZV9pbmRleF0gKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiBjaGVjayB3aGV0aGVyIHdlIGhhdmUgYSB2YWxpZCBUcnVlVHlwZSBmaWxlICovCi0gICAgZXJyb3IgPSBzZm50LT5sb2FkX2ZvbnRfZGlyKCBmYWNlLCBzdHJlYW0gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgICB7Ci0gICAgICBGVF9VTG9uZyAgIGZ2YXJfbGVuOwotICAgICAgRlRfVVNob3J0ICBudW1faW5zdGFuY2VzOwotICAgICAgRlRfSW50ICAgICBpbnN0YW5jZV9pbmRleDsKLQotCi0gICAgICBpbnN0YW5jZV9pbmRleCA9IEZUX0FCUyggZmFjZV9pbnN0YW5jZV9pbmRleCApID4+IDE2OwotCi0gICAgICAvKiB0ZXN0IHdoZXRoZXIgY3VycmVudCBmYWNlIGlzIGEgR1ggZm9udCB3aXRoIG5hbWVkIGluc3RhbmNlcyAqLwotICAgICAgaWYgKCBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2Z2YXIsIHN0cmVhbSwgJmZ2YXJfbGVuICkgfHwKLSAgICAgICAgICAgZnZhcl9sZW4gPCAyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIEZUX1NUUkVBTV9TS0lQKCAxMiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBGVF9SRUFEX1VTSE9SVCggbnVtX2luc3RhbmNlcyApICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICBudW1faW5zdGFuY2VzID0gMDsKLQotICAgICAgLyogd2Ugc3VwcG9ydCBhdCBtb3N0IDJeMTUgLSAxIGluc3RhbmNlcyAqLwotICAgICAgaWYgKCBudW1faW5zdGFuY2VzID49ICggMVUgPDwgMTUgKSAtIDEgKQotICAgICAgewotICAgICAgICBpZiAoIGZhY2VfaW5zdGFuY2VfaW5kZXggPj0gMCApCi0gICAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBudW1faW5zdGFuY2VzID0gMDsKLSAgICAgIH0KLQotICAgICAgLyogaW5zdGFuY2UgaW5kaWNlcyBpbiBgZmFjZV9pbnN0YW5jZV9pbmRleCcgc3RhcnQgd2l0aCBpbmRleCAxLCAqLwotICAgICAgLyogdGh1cyBgPicgYW5kIG5vdCBgPj0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBpbnN0YW5jZV9pbmRleCA+IG51bV9pbnN0YW5jZXMgKQotICAgICAgewotICAgICAgICBpZiAoIGZhY2VfaW5zdGFuY2VfaW5kZXggPj0gMCApCi0gICAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBudW1faW5zdGFuY2VzID0gMDsKLSAgICAgIH0KLQotICAgICAgZmFjZS0+cm9vdC5zdHlsZV9mbGFncyA9IChGVF9Mb25nKW51bV9pbnN0YW5jZXMgPDwgMTY7Ci0gICAgfQotI2VuZGlmCi0KLSAgICBmYWNlLT5yb290Lm51bV9mYWNlcyAgPSBmYWNlLT50dGNfaGVhZGVyLmNvdW50OwotICAgIGZhY2UtPnJvb3QuZmFjZV9pbmRleCA9IGZhY2VfaW5kZXg7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0jZGVmaW5lIExPQURfKCB4ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfVFJBQ0UyKCggImAiICN4ICInICIgKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfVFJBQ0UzKCggIi0tPlxuIiApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZXJyb3IgPSBzZm50LT5sb2FkXyAjIyB4KCBmYWNlLCBzdHJlYW0gKTsgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlRfVFJBQ0UyKCggIiVzXG4iLCAoICFlcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICA/ICJsb2FkZWQiICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICA6IEZUX0VSUl9FUSggZXJyb3IsIFRhYmxlX01pc3NpbmcgKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgID8gIm1pc3NpbmciICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDogImZhaWxlZCB0byBsb2FkIiApKTsgICAgICAgICAgICBcCi0gICAgRlRfVFJBQ0UzKCggIlxuIiApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gd2hpbGUgKCAwICkKLQotI2RlZmluZSBMT0FETV8oIHgsIHZlcnRpY2FsICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1RSQUNFMigoICJgJXMiICN4ICInICIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIHZlcnRpY2FsID8gInZlcnRpY2FsICIgOiAiIiApKTsgICAgICAgICAgICAgXAotICAgIEZUX1RSQUNFMygoICItLT5cbiIgKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGVycm9yID0gc2ZudC0+bG9hZF8gIyMgeCggZmFjZSwgc3RyZWFtLCB2ZXJ0aWNhbCApOyAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZUX1RSQUNFMigoICIlc1xuIiwgKCAhZXJyb3IgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgPyAibG9hZGVkIiAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgOiBGVF9FUlJfRVEoIGVycm9yLCBUYWJsZV9NaXNzaW5nICkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJtaXNzaW5nIiAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJmYWlsZWQgdG8gbG9hZCIgKSk7ICAgICAgICAgICAgXAotICAgIEZUX1RSQUNFMygoICJcbiIgKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IHdoaWxlICggMCApCi0KLSNkZWZpbmUgR0VUX05BTUUoIGlkLCBmaWVsZCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlcnJvciA9IHR0X2ZhY2VfZ2V0X25hbWUoIGZhY2UsIFRUX05BTUVfSURfICMjIGlkLCBmaWVsZCApOyBcCi0gICAgaWYgKCBlcnJvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgZ290byBFeGl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoIDAgKQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHNmbnRfbG9hZF9mYWNlKCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBUVF9GYWNlICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgZmFjZV9pbnN0YW5jZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICBGVF9QYXJhbWV0ZXIqICBwYXJhbXMgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvcjsKLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMKLSAgICBGVF9FcnJvciAgICAgIHBzbmFtZXNfZXJyb3I7Ci0jZW5kaWYKLSAgICBGVF9Cb29sICAgICAgIGhhc19vdXRsaW5lOwotICAgIEZUX0Jvb2wgICAgICAgaXNfYXBwbGVfc2JpdDsKLSAgICBGVF9Cb29sICAgICAgIGlzX2FwcGxlX3NiaXg7Ci0gICAgRlRfQm9vbCAgICAgICBpZ25vcmVfcHJlZmVycmVkX2ZhbWlseSAgICA9IEZBTFNFOwotICAgIEZUX0Jvb2wgICAgICAgaWdub3JlX3ByZWZlcnJlZF9zdWJmYW1pbHkgPSBGQUxTRTsKLQotICAgIFNGTlRfU2VydmljZSAgc2ZudCA9IChTRk5UX1NlcnZpY2UpZmFjZS0+c2ZudDsKLQotICAgIEZUX1VOVVNFRCggZmFjZV9pbnN0YW5jZV9pbmRleCApOwotCi0KLSAgICAvKiBDaGVjayBwYXJhbWV0ZXJzICovCi0KLSAgICB7Ci0gICAgICBGVF9JbnQgIGk7Ci0KLQotICAgICAgZm9yICggaSA9IDA7IGkgPCBudW1fcGFyYW1zOyBpKysgKQotICAgICAgewotICAgICAgICBpZiAoIHBhcmFtc1tpXS50YWcgPT0gRlRfUEFSQU1fVEFHX0lHTk9SRV9QUkVGRVJSRURfRkFNSUxZICkKLSAgICAgICAgICBpZ25vcmVfcHJlZmVycmVkX2ZhbWlseSA9IFRSVUU7Ci0gICAgICAgIGVsc2UgaWYgKCBwYXJhbXNbaV0udGFnID09IEZUX1BBUkFNX1RBR19JR05PUkVfUFJFRkVSUkVEX1NVQkZBTUlMWSApCi0gICAgICAgICAgaWdub3JlX3ByZWZlcnJlZF9zdWJmYW1pbHkgPSBUUlVFOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIExvYWQgdGFibGVzICovCi0KLSAgICAvKiBXZSBub3cgc3VwcG9ydCB0d28gU0ZOVC1iYXNlZCBiaXRtYXBwZWQgZm9udCBmb3JtYXRzLiAgVGhleSAqLwotICAgIC8qIGFyZSByZWNvZ25pemVkIGVhc2lseSBhcyB0aGV5IGRvIG5vdCBpbmNsdWRlIGEgYGdseWYnICAgICAgICovCi0gICAgLyogdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFRoZSBmaXJzdCBmb3JtYXQgY29tZXMgZnJvbSBBcHBsZSwgYW5kIHVzZXMgYSB0YWJsZSBuYW1lZCAgICovCi0gICAgLyogYGJoZWQnIGluc3RlYWQgb2YgYGhlYWQnIHRvIHN0b3JlIHRoZSBmb250IGhlYWRlciAodXNpbmcgICAgKi8KLSAgICAvKiB0aGUgc2FtZSBmb3JtYXQpLiAgSXQgYWxzbyBkb2Vzbid0IGluY2x1ZGUgaG9yaXpvbnRhbCBhbmQgICAqLwotICAgIC8qIHZlcnRpY2FsIG1ldHJpY3MgdGFibGVzIChpLmUuIGBoaGVhJyBhbmQgYHZoZWEnIHRhYmxlcyBhcmUgICovCi0gICAgLyogbWlzc2luZykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFRoZSBvdGhlciBmb3JtYXQgY29tZXMgZnJvbSBNaWNyb3NvZnQsIGFuZCBpcyB1c2VkIHdpdGggICAgICovCi0gICAgLyogV2luQ0UvUG9ja2V0UEMuICBJdCBsb29rcyBsaWtlIGEgc3RhbmRhcmQgVFRGLCBleGNlcHQgdGhhdCAgKi8KLSAgICAvKiBpdCBkb2Vzbid0IGNvbnRhaW4gb3V0bGluZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBGVF9UUkFDRTIoKCAic2ZudF9sb2FkX2ZhY2U6ICUwOHBcblxuIiwgZmFjZSApKTsKLQotICAgIC8qIGRvIHdlIGhhdmUgb3V0bGluZXMgaW4gdGhlcmU/ICovCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgIGhhc19vdXRsaW5lID0gRlRfQk9PTCggZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlICE9IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0X2ZhY2VfbG9va3VwX3RhYmxlKCBmYWNlLCBUVEFHX2dseWYgKSAgICAhPSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0dF9mYWNlX2xvb2t1cF90YWJsZSggZmFjZSwgVFRBR19DRkYgKSAgICAgIT0gMCApOwotI2Vsc2UKLSAgICBoYXNfb3V0bGluZSA9IEZUX0JPT0woIHR0X2ZhY2VfbG9va3VwX3RhYmxlKCBmYWNlLCBUVEFHX2dseWYgKSAhPSAwIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICB0dF9mYWNlX2xvb2t1cF90YWJsZSggZmFjZSwgVFRBR19DRkYgKSAgIT0gMCApOwotI2VuZGlmCi0KLSAgICBpc19hcHBsZV9zYml0ID0gMDsKLSAgICBpc19hcHBsZV9zYml4ID0gIWZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfc2JpeCwgc3RyZWFtLCAwICk7Ci0KLSAgICAvKiBBcHBsZSAnc2JpeCcgY29sb3IgYml0bWFwcyBhcmUgcmVuZGVyZWQgc2NhbGVkIGFuZCB0aGVuIHRoZSAnZ2x5ZicKLSAgICAgKiBvdXRsaW5lIHJlbmRlcmVkIG9uIHRvcC4gIFdlIGRvbid0IHN1cHBvcnQgdGhhdCB5ZXQsIHNvIGp1c3QgaWdub3JlCi0gICAgICogdGhlICdnbHlmJyBvdXRsaW5lIGFuZCBhZHZlcnRpc2UgaXQgYXMgYSBiaXRtYXAtb25seSBmb250LiAqLwotICAgIGlmICggaXNfYXBwbGVfc2JpeCApCi0gICAgICBoYXNfb3V0bGluZSA9IEZBTFNFOwotCi0gICAgLyogaWYgdGhpcyBmb250IGRvZXNuJ3QgY29udGFpbiBvdXRsaW5lcywgd2UgdHJ5IHRvIGxvYWQgKi8KLSAgICAvKiBhIGBiaGVkJyB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggIWhhc19vdXRsaW5lICYmIHNmbnQtPmxvYWRfYmhlZCApCi0gICAgewotICAgICAgTE9BRF8oIGJoZWQgKTsKLSAgICAgIGlzX2FwcGxlX3NiaXQgPSBGVF9CT09MKCAhZXJyb3IgKTsKLSAgICB9Ci0KLSAgICAvKiBsb2FkIHRoZSBmb250IGhlYWRlciAoYGhlYWQnIHRhYmxlKSBpZiB0aGlzIGlzbid0IGFuIEFwcGxlICovCi0gICAgLyogc2JpdCBmb250IGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggIWlzX2FwcGxlX3NiaXQgfHwgaXNfYXBwbGVfc2JpeCApCi0gICAgewotICAgICAgTE9BRF8oIGhlYWQgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBmYWNlLT5oZWFkZXIuVW5pdHNfUGVyX0VNID09IDAgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLQotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIHRoZSBmb2xsb3dpbmcgdGFibGVzIGFyZSBvZnRlbiBub3QgcHJlc2VudCBpbiBlbWJlZGRlZCBUcnVlVHlwZSAqLwotICAgIC8qIGZvbnRzIHdpdGhpbiBQREYgZG9jdW1lbnRzLCBzbyBkb24ndCBjaGVjayBmb3IgdGhlbS4gICAgICAgICAgICAqLwotICAgIExPQURfKCBtYXhwICk7Ci0gICAgTE9BRF8oIGNtYXAgKTsKLQotICAgIC8qIHRoZSBmb2xsb3dpbmcgdGFibGVzIGFyZSBvcHRpb25hbCBpbiBQQ0wgZm9udHMgLS0gKi8KLSAgICAvKiBkb24ndCBjaGVjayBmb3IgZXJyb3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTE9BRF8oIG5hbWUgKTsKLSAgICBMT0FEXyggcG9zdCApOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTCi0gICAgcHNuYW1lc19lcnJvciA9IGVycm9yOwotI2VuZGlmCi0KLSAgICAvKiBkbyBub3QgbG9hZCB0aGUgbWV0cmljcyBoZWFkZXJzIGFuZCB0YWJsZXMgaWYgdGhpcyBpcyBhbiBBcHBsZSAqLwotICAgIC8qIHNiaXQgZm9udCBmaWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCAhaXNfYXBwbGVfc2JpdCApCi0gICAgewotICAgICAgLyogbG9hZCB0aGUgYGhoZWEnIGFuZCBgaG10eCcgdGFibGVzICovCi0gICAgICBMT0FETV8oIGhoZWEsIDAgKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgIHsKLSAgICAgICAgTE9BRE1fKCBobXR4LCAwICk7Ci0gICAgICAgIGlmICggRlRfRVJSX0VRKCBlcnJvciwgVGFibGVfTWlzc2luZyApICkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEhtdHhfVGFibGVfTWlzc2luZyApOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgICAgICAgIC8qIElmIHRoaXMgaXMgYW4gaW5jcmVtZW50YWxseSBsb2FkZWQgZm9udCBhbmQgdGhlcmUgYXJlICovCi0gICAgICAgICAgLyogb3ZlcnJpZGluZyBtZXRyaWNzLCB0b2xlcmF0ZSBhIG1pc3NpbmcgYGhtdHgnIHRhYmxlLiAgKi8KLSAgICAgICAgICBpZiAoIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSAgICAgICAgICAmJgotICAgICAgICAgICAgICAgZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlLT5mdW5jcy0+Ci0gICAgICAgICAgICAgICAgIGdldF9nbHlwaF9tZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGZhY2UtPmhvcml6b250YWwubnVtYmVyX09mX0hNZXRyaWNzID0gMDsKLSAgICAgICAgICAgIGVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gRlRfRXJyX09rOwotICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggRlRfRVJSX0VRKCBlcnJvciwgVGFibGVfTWlzc2luZyApICkKLSAgICAgIHsKLSAgICAgICAgLyogTm8gYGhoZWEnIHRhYmxlIG5lY2Vzc2FyeSBmb3IgU0ZOVCBNYWMgZm9udHMuICovCi0gICAgICAgIGlmICggZmFjZS0+Zm9ybWF0X3RhZyA9PSBUVEFHX3RydWUgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0UyKCggIlRoaXMgaXMgYW4gU0ZOVCBNYWMgZm9udC5cbiIgKSk7Ci0KLSAgICAgICAgICBoYXNfb3V0bGluZSA9IDA7Ci0gICAgICAgICAgZXJyb3IgICAgICAgPSBGVF9FcnJfT2s7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSG9yaXpfSGVhZGVyX01pc3NpbmcgKTsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICAgICAgICAvKiBJZiB0aGlzIGlzIGFuIGluY3JlbWVudGFsbHkgbG9hZGVkIGZvbnQgYW5kIHRoZXJlIGFyZSAqLwotICAgICAgICAgIC8qIG92ZXJyaWRpbmcgbWV0cmljcywgdG9sZXJhdGUgYSBtaXNzaW5nIGBoaGVhJyB0YWJsZS4gICovCi0gICAgICAgICAgaWYgKCBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+ZnVuY3MtPgotICAgICAgICAgICAgICAgICBnZXRfZ2x5cGhfbWV0cmljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmYWNlLT5ob3Jpem9udGFsLm51bWJlcl9PZl9ITWV0cmljcyA9IDA7Ci0gICAgICAgICAgICBlcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEZUX0Vycl9PazsKLSAgICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIHRyeSB0byBsb2FkIHRoZSBgdmhlYScgYW5kIGB2bXR4JyB0YWJsZXMgKi8KLSAgICAgIExPQURNXyggaGhlYSwgMSApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgewotICAgICAgICBMT0FETV8oIGhtdHgsIDEgKTsKLSAgICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICAgIGZhY2UtPnZlcnRpY2FsX2luZm8gPSAxOwotICAgICAgfQotCi0gICAgICBpZiAoIGVycm9yICYmIEZUX0VSUl9ORVEoIGVycm9yLCBUYWJsZV9NaXNzaW5nICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIExPQURfKCBvczIgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgewotICAgICAgICAvKiB3ZSB0cmVhdCB0aGUgdGFibGUgYXMgbWlzc2luZyBpZiB0aGVyZSBhcmUgYW55IGVycm9ycyAqLwotICAgICAgICBmYWNlLT5vczIudmVyc2lvbiA9IDB4RkZGRlU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogdGhlIG9wdGlvbmFsIHRhYmxlcyAqLwotCi0gICAgLyogZW1iZWRkZWQgYml0bWFwIHN1cHBvcnQgKi8KLSAgICBpZiAoIHNmbnQtPmxvYWRfZWJsYyApCi0gICAgewotICAgICAgTE9BRF8oIGVibGMgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgewotICAgICAgICAvKiBhIGZvbnQgd2hpY2ggY29udGFpbnMgbmVpdGhlciBiaXRtYXBzIG5vciBvdXRsaW5lcyBpcyAqLwotICAgICAgICAvKiBzdGlsbCB2YWxpZCAoYWx0aG91Z2ggcmF0aGVyIHVzZWxlc3MgaW4gbW9zdCBjYXNlcyk7ICAqLwotICAgICAgICAvKiBob3dldmVyLCB5b3UgY2FuIGZpbmQgc3VjaCBzdHJpcHBlZCBmb250cyBpbiBQREZzICAgICAqLwotICAgICAgICBpZiAoIEZUX0VSUl9FUSggZXJyb3IsIFRhYmxlX01pc3NpbmcgKSApCi0gICAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgTE9BRF8oIHBjbHQgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICB7Ci0gICAgICBpZiAoIEZUX0VSUl9ORVEoIGVycm9yLCBUYWJsZV9NaXNzaW5nICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGZhY2UtPnBjbHQuVmVyc2lvbiA9IDA7Ci0gICAgfQotCi0gICAgLyogY29uc2lkZXIgdGhlIGtlcm5pbmcgYW5kIGdhc3AgdGFibGVzIGFzIG9wdGlvbmFsICovCi0gICAgTE9BRF8oIGdhc3AgKTsKLSAgICBMT0FEXygga2VybiApOwotCi0gICAgZmFjZS0+cm9vdC5udW1fZ2x5cGhzID0gZmFjZS0+bWF4X3Byb2ZpbGUubnVtR2x5cGhzOwotCi0gICAgLyogQml0IDggb2YgdGhlIGBmc1NlbGVjdGlvbicgZmllbGQgaW4gdGhlIGBPUy8yJyB0YWJsZSBkZW5vdGVzICAqLwotICAgIC8qIGEgV1dTLW9ubHkgZm9udCBmYWNlLiAgYFdXUycgc3RhbmRzIGZvciBgd2VpZ2h0Jywgd2lkdGgnLCBhbmQgKi8KLSAgICAvKiBgc2xvcGUnLCBhIHRlcm0gdXNlZCBieSBNaWNyb3NvZnQncyBXaW5kb3dzIFByZXNlbnRhdGlvbiAgICAgICovCi0gICAgLyogRm91bmRhdGlvbiAoV1BGKS4gIFRoaXMgZmxhZyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGluIHZlcnNpb24gICAqLwotICAgIC8qIDEuNSBvZiB0aGUgT3BlblR5cGUgc3BlY2lmaWNhdGlvbiAoTWF5IDIwMDgpLiAgICAgICAgICAgICAgICAgKi8KLQotICAgIGZhY2UtPnJvb3QuZmFtaWx5X25hbWUgPSBOVUxMOwotICAgIGZhY2UtPnJvb3Quc3R5bGVfbmFtZSAgPSBOVUxMOwotICAgIGlmICggZmFjZS0+b3MyLnZlcnNpb24gIT0gMHhGRkZGVSAmJiBmYWNlLT5vczIuZnNTZWxlY3Rpb24gJiAyNTYgKQotICAgIHsKLSAgICAgIGlmICggIWlnbm9yZV9wcmVmZXJyZWRfZmFtaWx5ICkKLSAgICAgICAgR0VUX05BTUUoIFBSRUZFUlJFRF9GQU1JTFksICZmYWNlLT5yb290LmZhbWlseV9uYW1lICk7Ci0gICAgICBpZiAoICFmYWNlLT5yb290LmZhbWlseV9uYW1lICkKLSAgICAgICAgR0VUX05BTUUoIEZPTlRfRkFNSUxZLCAmZmFjZS0+cm9vdC5mYW1pbHlfbmFtZSApOwotCi0gICAgICBpZiAoICFpZ25vcmVfcHJlZmVycmVkX3N1YmZhbWlseSApCi0gICAgICAgIEdFVF9OQU1FKCBQUkVGRVJSRURfU1VCRkFNSUxZLCAmZmFjZS0+cm9vdC5zdHlsZV9uYW1lICk7Ci0gICAgICBpZiAoICFmYWNlLT5yb290LnN0eWxlX25hbWUgKQotICAgICAgICBHRVRfTkFNRSggRk9OVF9TVUJGQU1JTFksICZmYWNlLT5yb290LnN0eWxlX25hbWUgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEdFVF9OQU1FKCBXV1NfRkFNSUxZLCAmZmFjZS0+cm9vdC5mYW1pbHlfbmFtZSApOwotICAgICAgaWYgKCAhZmFjZS0+cm9vdC5mYW1pbHlfbmFtZSAmJiAhaWdub3JlX3ByZWZlcnJlZF9mYW1pbHkgKQotICAgICAgICBHRVRfTkFNRSggUFJFRkVSUkVEX0ZBTUlMWSwgJmZhY2UtPnJvb3QuZmFtaWx5X25hbWUgKTsKLSAgICAgIGlmICggIWZhY2UtPnJvb3QuZmFtaWx5X25hbWUgKQotICAgICAgICBHRVRfTkFNRSggRk9OVF9GQU1JTFksICZmYWNlLT5yb290LmZhbWlseV9uYW1lICk7Ci0KLSAgICAgIEdFVF9OQU1FKCBXV1NfU1VCRkFNSUxZLCAmZmFjZS0+cm9vdC5zdHlsZV9uYW1lICk7Ci0gICAgICBpZiAoICFmYWNlLT5yb290LnN0eWxlX25hbWUgJiYgIWlnbm9yZV9wcmVmZXJyZWRfc3ViZmFtaWx5ICkKLSAgICAgICAgR0VUX05BTUUoIFBSRUZFUlJFRF9TVUJGQU1JTFksICZmYWNlLT5yb290LnN0eWxlX25hbWUgKTsKLSAgICAgIGlmICggIWZhY2UtPnJvb3Quc3R5bGVfbmFtZSApCi0gICAgICAgIEdFVF9OQU1FKCBGT05UX1NVQkZBTUlMWSwgJmZhY2UtPnJvb3Quc3R5bGVfbmFtZSApOwotICAgIH0KLQotICAgIC8qIG5vdyBzZXQgdXAgcm9vdCBmaWVsZHMgKi8KLSAgICB7Ci0gICAgICBGVF9GYWNlICByb290ICA9ICZmYWNlLT5yb290OwotICAgICAgRlRfTG9uZyAgZmxhZ3MgPSByb290LT5mYWNlX2ZsYWdzOwotCi0KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogQ29tcHV0ZSBmYWNlIGZsYWdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIGZhY2UtPnNiaXRfdGFibGVfdHlwZSA9PSBUVF9TQklUX1RBQkxFX1RZUEVfQ0JMQyB8fAotICAgICAgICAgICBmYWNlLT5zYml0X3RhYmxlX3R5cGUgPT0gVFRfU0JJVF9UQUJMRV9UWVBFX1NCSVggKQotICAgICAgICBmbGFncyB8PSBGVF9GQUNFX0ZMQUdfQ09MT1I7ICAgICAgLyogY29sb3IgZ2x5cGhzICovCi0KLSAgICAgIGlmICggaGFzX291dGxpbmUgPT0gVFJVRSApCi0gICAgICAgIGZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRTsgICAvKiBzY2FsYWJsZSBvdXRsaW5lcyAqLwotCi0gICAgICAvKiBUaGUgc2ZudCBkcml2ZXIgb25seSBzdXBwb3J0cyBiaXRtYXAgZm9udHMgbmF0aXZlbHksIHRodXMgd2UgKi8KLSAgICAgIC8qIGRvbid0IHNldCBGVF9GQUNFX0ZMQUdfSElOVEVSLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX1NGTlQgICAgICAgfCAgLyogU0ZOVCBmaWxlIGZvcm1hdCAgKi8KLSAgICAgICAgICAgICAgIEZUX0ZBQ0VfRkxBR19IT1JJWk9OVEFMOyAgIC8qIGhvcml6b250YWwgZGF0YSAgICovCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMKLSAgICAgIGlmICggIXBzbmFtZXNfZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgIGZhY2UtPnBvc3RzY3JpcHQuRm9ybWF0VHlwZSAhPSAweDAwMDMwMDAwTCApCi0gICAgICAgIGZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19HTFlQSF9OQU1FUzsKLSNlbmRpZgotCi0gICAgICAvKiBmaXhlZCB3aWR0aCBmb250PyAqLwotICAgICAgaWYgKCBmYWNlLT5wb3N0c2NyaXB0LmlzRml4ZWRQaXRjaCApCi0gICAgICAgIGZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19GSVhFRF9XSURUSDsKLQotICAgICAgLyogdmVydGljYWwgaW5mb3JtYXRpb24/ICovCi0gICAgICBpZiAoIGZhY2UtPnZlcnRpY2FsX2luZm8gKQotICAgICAgICBmbGFncyB8PSBGVF9GQUNFX0ZMQUdfVkVSVElDQUw7Ci0KLSAgICAgIC8qIGtlcm5pbmcgYXZhaWxhYmxlID8gKi8KLSAgICAgIGlmICggVFRfRkFDRV9IQVNfS0VSTklORyggZmFjZSApICkKLSAgICAgICAgZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0tFUk5JTkc7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0gICAgICAvKiBEb24ndCBib3RoZXIgdG8gbG9hZCB0aGUgdGFibGVzIHVubGVzcyBzb21lYm9keSBhc2tzIGZvciB0aGVtLiAqLwotICAgICAgLyogTm8gbmVlZCB0byBkbyB3b3JrIHdoaWNoIHdpbGwgKHByb2JhYmx5KSBub3QgYmUgdXNlZC4gICAgICAgICAgKi8KLSAgICAgIGlmICggdHRfZmFjZV9sb29rdXBfdGFibGUoIGZhY2UsIFRUQUdfZ2x5ZiApICE9IDAgJiYKLSAgICAgICAgICAgdHRfZmFjZV9sb29rdXBfdGFibGUoIGZhY2UsIFRUQUdfZnZhciApICE9IDAgJiYKLSAgICAgICAgICAgdHRfZmFjZV9sb29rdXBfdGFibGUoIGZhY2UsIFRUQUdfZ3ZhciApICE9IDAgKQotICAgICAgICBmbGFncyB8PSBGVF9GQUNFX0ZMQUdfTVVMVElQTEVfTUFTVEVSUzsKLSNlbmRpZgotCi0gICAgICByb290LT5mYWNlX2ZsYWdzID0gZmxhZ3M7Ci0KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogQ29tcHV0ZSBzdHlsZSBmbGFncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIGZsYWdzID0gMDsKLSAgICAgIGlmICggaGFzX291dGxpbmUgPT0gVFJVRSAmJiBmYWNlLT5vczIudmVyc2lvbiAhPSAweEZGRkZVICkKLSAgICAgIHsKLSAgICAgICAgLyogV2UgaGF2ZSBhbiBPUy8yIHRhYmxlOyB1c2UgdGhlIGBmc1NlbGVjdGlvbicgZmllbGQuICBCaXQgOSAqLwotICAgICAgICAvKiBpbmRpY2F0ZXMgYW4gb2JsaXF1ZSBmb250IGZhY2UuICBUaGlzIGZsYWcgaGFzIGJlZW4gICAgICAgICovCi0gICAgICAgIC8qIGludHJvZHVjZWQgaW4gdmVyc2lvbiAxLjUgb2YgdGhlIE9wZW5UeXBlIHNwZWNpZmljYXRpb24uICAgKi8KLQotICAgICAgICBpZiAoIGZhY2UtPm9zMi5mc1NlbGVjdGlvbiAmIDUxMiApICAgICAgIC8qIGJpdCA5ICovCi0gICAgICAgICAgZmxhZ3MgfD0gRlRfU1RZTEVfRkxBR19JVEFMSUM7Ci0gICAgICAgIGVsc2UgaWYgKCBmYWNlLT5vczIuZnNTZWxlY3Rpb24gJiAxICkgICAgLyogYml0IDAgKi8KLSAgICAgICAgICBmbGFncyB8PSBGVF9TVFlMRV9GTEFHX0lUQUxJQzsKLQotICAgICAgICBpZiAoIGZhY2UtPm9zMi5mc1NlbGVjdGlvbiAmIDMyICkgICAgICAgIC8qIGJpdCA1ICovCi0gICAgICAgICAgZmxhZ3MgfD0gRlRfU1RZTEVfRkxBR19CT0xEOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiB0aGlzIGlzIGFuIG9sZCBNYWMgZm9udCwgdXNlIHRoZSBoZWFkZXIgZmllbGQgKi8KLQotICAgICAgICBpZiAoIGZhY2UtPmhlYWRlci5NYWNfU3R5bGUgJiAxICkKLSAgICAgICAgICBmbGFncyB8PSBGVF9TVFlMRV9GTEFHX0JPTEQ7Ci0KLSAgICAgICAgaWYgKCBmYWNlLT5oZWFkZXIuTWFjX1N0eWxlICYgMiApCi0gICAgICAgICAgZmxhZ3MgfD0gRlRfU1RZTEVfRkxBR19JVEFMSUM7Ci0gICAgICB9Ci0KLSAgICAgIHJvb3QtPnN0eWxlX2ZsYWdzIHw9IGZsYWdzOwotCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIFBvbGlzaCB0aGUgY2hhcm1hcHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICBUcnkgdG8gc2V0IHRoZSBjaGFybWFwIGVuY29kaW5nIGFjY29yZGluZyB0byB0aGUgcGxhdGZvcm0gJiAgICAgKi8KLSAgICAgIC8qICAgZW5jb2RpbmcgSUQgb2YgZWFjaCBjaGFybWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICB0dF9mYWNlX2J1aWxkX2NtYXBzKCBmYWNlICk7ICAvKiBpZ25vcmUgZXJyb3JzICovCi0KLQotICAgICAgLyogc2V0IHRoZSBlbmNvZGluZyBmaWVsZHMgKi8KLSAgICAgIHsKLSAgICAgICAgRlRfSW50ICBtOwotCi0KLSAgICAgICAgZm9yICggbSA9IDA7IG0gPCByb290LT5udW1fY2hhcm1hcHM7IG0rKyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9DaGFyTWFwICBjaGFybWFwID0gcm9vdC0+Y2hhcm1hcHNbbV07Ci0KLQotICAgICAgICAgIGNoYXJtYXAtPmVuY29kaW5nID0gc2ZudF9maW5kX2VuY29kaW5nKCBjaGFybWFwLT5wbGF0Zm9ybV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcm1hcC0+ZW5jb2RpbmdfaWQgKTsKLQotI2lmIDAKLSAgICAgICAgICBpZiAoIHJvb3QtPmNoYXJtYXAgICAgID09IE5VTEwgJiYKLSAgICAgICAgICAgICAgIGNoYXJtYXAtPmVuY29kaW5nID09IEZUX0VOQ09ESU5HX1VOSUNPREUgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIHNldCAncm9vdC0+Y2hhcm1hcCcgdG8gdGhlIGZpcnN0IFVuaWNvZGUgZW5jb2Rpbmcgd2UgZmluZCAqLwotICAgICAgICAgICAgcm9vdC0+Y2hhcm1hcCA9IGNoYXJtYXA7Ci0gICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgIH0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUwotCi0gICAgICAvKgotICAgICAgICogIE5vdyBhbGxvY2F0ZSB0aGUgcm9vdCBhcnJheSBvZiBGVF9CaXRtYXBfU2l6ZSByZWNvcmRzIGFuZAotICAgICAgICogIHBvcHVsYXRlIHRoZW0uICBVbmZvcnR1bmF0ZWx5LCBpdCBpc24ndCBwb3NzaWJsZSB0byBpbmRpY2F0ZSBiaXQKLSAgICAgICAqICBkZXB0aHMgaW4gdGhlIEZUX0JpdG1hcF9TaXplIHJlY29yZC4gIFRoaXMgaXMgYSBkZXNpZ24gZXJyb3IuCi0gICAgICAgKi8KLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgaSwgY291bnQ7Ci0KLQotICAgICAgICBjb3VudCA9IGZhY2UtPnNiaXRfbnVtX3N0cmlrZXM7Ci0KLSAgICAgICAgaWYgKCBjb3VudCA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfTWVtb3J5ICAgICAgICBtZW1vcnkgICA9IGZhY2UtPnJvb3Quc3RyZWFtLT5tZW1vcnk7Ci0gICAgICAgICAgRlRfVVNob3J0ICAgICAgICBlbV9zaXplICA9IGZhY2UtPmhlYWRlci5Vbml0c19QZXJfRU07Ci0gICAgICAgICAgRlRfU2hvcnQgICAgICAgICBhdmd3aWR0aCA9IGZhY2UtPm9zMi54QXZnQ2hhcldpZHRoOwotICAgICAgICAgIEZUX1NpemVfTWV0cmljcyAgbWV0cmljczsKLQotCi0gICAgICAgICAgaWYgKCBlbV9zaXplID09IDAgfHwgZmFjZS0+b3MyLnZlcnNpb24gPT0gMHhGRkZGVSApCi0gICAgICAgICAgewotICAgICAgICAgICAgYXZnd2lkdGggPSAxOwotICAgICAgICAgICAgZW1fc2l6ZSA9IDE7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIHJvb3QtPmF2YWlsYWJsZV9zaXplcywgY291bnQgKSApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX0JpdG1hcF9TaXplKiAgYnNpemUgPSByb290LT5hdmFpbGFibGVfc2l6ZXMgKyBpOwotCi0KLSAgICAgICAgICAgIGVycm9yID0gc2ZudC0+bG9hZF9zdHJpa2VfbWV0cmljcyggZmFjZSwgaSwgJm1ldHJpY3MgKTsKLSAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICAgIGJzaXplLT5oZWlnaHQgPSAoRlRfU2hvcnQpKCBtZXRyaWNzLmhlaWdodCA+PiA2ICk7Ci0gICAgICAgICAgICBic2l6ZS0+d2lkdGggPSAoRlRfU2hvcnQpKAotICAgICAgICAgICAgICAgICggYXZnd2lkdGggKiBtZXRyaWNzLnhfcHBlbSArIGVtX3NpemUgLyAyICkgLyBlbV9zaXplICk7Ci0KLSAgICAgICAgICAgIGJzaXplLT54X3BwZW0gPSBtZXRyaWNzLnhfcHBlbSA8PCA2OwotICAgICAgICAgICAgYnNpemUtPnlfcHBlbSA9IG1ldHJpY3MueV9wcGVtIDw8IDY7Ci0KLSAgICAgICAgICAgIC8qIGFzc3VtZSA3MmRwaSAqLwotICAgICAgICAgICAgYnNpemUtPnNpemUgICA9IG1ldHJpY3MueV9wcGVtIDw8IDY7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgcm9vdC0+ZmFjZV9mbGFncyAgICAgfD0gRlRfRkFDRV9GTEFHX0ZJWEVEX1NJWkVTOwotICAgICAgICAgIHJvb3QtPm51bV9maXhlZF9zaXplcyA9IChGVF9JbnQpY291bnQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUyAqLwotCi0gICAgICAvKiBhIGZvbnQgd2l0aCBubyBiaXRtYXBzIGFuZCBubyBvdXRsaW5lcyBpcyBzY2FsYWJsZTsgKi8KLSAgICAgIC8qIGl0IGhhcyBvbmx5IGVtcHR5IGdseXBocyB0aGVuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCAhRlRfSEFTX0ZJWEVEX1NJWkVTKCByb290ICkgJiYgIUZUX0lTX1NDQUxBQkxFKCByb290ICkgKQotICAgICAgICByb290LT5mYWNlX2ZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19TQ0FMQUJMRTsKLQotCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICBTZXQgdXAgbWV0cmljcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBGVF9JU19TQ0FMQUJMRSggcm9vdCApICkKLSAgICAgIHsKLSAgICAgICAgLyogWFhYIFdoYXQgYWJvdXQgaWYgb3V0bGluZSBoZWFkZXIgaXMgbWlzc2luZyAqLwotICAgICAgICAvKiAgICAgKGUuZy4gc2ZudCB3cmFwcGVkIGJpdG1hcCk/ICAgICAgICAgICAgICovCi0gICAgICAgIHJvb3QtPmJib3gueE1pbiAgICA9IGZhY2UtPmhlYWRlci54TWluOwotICAgICAgICByb290LT5iYm94LnlNaW4gICAgPSBmYWNlLT5oZWFkZXIueU1pbjsKLSAgICAgICAgcm9vdC0+YmJveC54TWF4ICAgID0gZmFjZS0+aGVhZGVyLnhNYXg7Ci0gICAgICAgIHJvb3QtPmJib3gueU1heCAgICA9IGZhY2UtPmhlYWRlci55TWF4OwotICAgICAgICByb290LT51bml0c19wZXJfRU0gPSBmYWNlLT5oZWFkZXIuVW5pdHNfUGVyX0VNOwotCi0KLSAgICAgICAgLyogWFhYOiBDb21wdXRpbmcgdGhlIGFzY2VuZGVyL2Rlc2NlbmRlci9oZWlnaHQgaXMgdmVyeSBkaWZmZXJlbnQgKi8KLSAgICAgICAgLyogICAgICBmcm9tIHdoYXQgdGhlIHNwZWNpZmljYXRpb24gdGVsbHMgeW91LiAgQXBwYXJlbnRseSwgd2UgICAgKi8KLSAgICAgICAgLyogICAgICBtdXN0IGJlIGNhcmVmdWwgYmVjYXVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAtIG5vdCBhbGwgZm9udHMgaGF2ZSBhbiBPUy8yIHRhYmxlOyBpbiB0aGlzIGNhc2UsIHdlIHRha2UgKi8KLSAgICAgICAgLyogICAgICAgIHRoZSB2YWx1ZXMgaW4gdGhlIGhvcml6b250YWwgaGVhZGVyLiAgSG93ZXZlciwgdGhlc2UgICAgKi8KLSAgICAgICAgLyogICAgICAgIHZhbHVlcyB2ZXJ5IG9mdGVuIGFyZSBub3QgcmVsaWFibGUuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAtIG90aGVyd2lzZSwgdGhlIGNvcnJlY3QgdHlwb2dyYXBoaWMgdmFsdWVzIGFyZSBpbiB0aGUgICAgKi8KLSAgICAgICAgLyogICAgICAgIHNUeXBvQXNjZW5kZXIsIHNUeXBvRGVzY2VuZGVyICYgc1R5cG9MaW5lR2FwIGZpZWxkcy4gICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgIEhvd2V2ZXIsIGNlcnRhaW4gZm9udHMgaGF2ZSB0aGVzZSBmaWVsZHMgc2V0IHRvIDAuICAgICAgKi8KLSAgICAgICAgLyogICAgICAgIFJhdGhlciwgdGhleSBoYXZlIHVzV2luQXNjZW50ICYgdXNXaW5EZXNjZW50IGNvcnJlY3RseSAgKi8KLSAgICAgICAgLyogICAgICAgIHNldCAoYnV0IHdpdGggZGlmZmVyZW50IHZhbHVlcykuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICBBcyBhbiBleGFtcGxlLCBBcmlhbCBOYXJyb3cgaXMgaW1wbGVtZW50ZWQgdGhyb3VnaCBmb3VyICAgKi8KLSAgICAgICAgLyogICAgICBmaWxlcyBBUklBTE4uVFRGLCBBUklBTE5JLlRURiwgQVJJQUxOQi5UVEYgJiBBUklBTE5CSS5UVEYgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICBTdHJhbmdlbHksIGFsbCBmb250cyBoYXZlIHRoZSBzYW1lIHZhbHVlcyBpbiB0aGVpciAgICAgICAgKi8KLSAgICAgICAgLyogICAgICBzVHlwb1hYWCBmaWVsZHMsIGV4Y2VwdCBBUklBTE5CIHdoaWNoIHNldHMgdGhlbSB0byAwLiAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICBPbiB0aGUgb3RoZXIgaGFuZCwgdGhleSBhbGwgaGF2ZSBkaWZmZXJlbnQgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICB1c1dpbkFzY2VudC9EZXNjZW50IHZhbHVlcyAtLSBhcyBhIGNvbmNsdXNpb24sIHRoZSBPUy8yICAgKi8KLSAgICAgICAgLyogICAgICB0YWJsZSBjYW5ub3QgYmUgdXNlZCB0byBjb21wdXRlIHRoZSB0ZXh0IGhlaWdodCByZWxpYWJseSEgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAvKiBUaGUgYXNjZW5kZXIgYW5kIGRlc2NlbmRlciBhcmUgdGFrZW4gZnJvbSB0aGUgYGhoZWEnIHRhYmxlLiAqLwotICAgICAgICAvKiBJZiB6ZXJvLCB0aGV5IGFyZSB0YWtlbiBmcm9tIHRoZSBgT1MvMicgdGFibGUuICAgICAgICAgICAgICAqLwotCi0gICAgICAgIHJvb3QtPmFzY2VuZGVyICA9IGZhY2UtPmhvcml6b250YWwuQXNjZW5kZXI7Ci0gICAgICAgIHJvb3QtPmRlc2NlbmRlciA9IGZhY2UtPmhvcml6b250YWwuRGVzY2VuZGVyOwotCi0gICAgICAgIHJvb3QtPmhlaWdodCA9IHJvb3QtPmFzY2VuZGVyIC0gcm9vdC0+ZGVzY2VuZGVyICsKLSAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+aG9yaXpvbnRhbC5MaW5lX0dhcDsKLQotICAgICAgICBpZiAoICEoIHJvb3QtPmFzY2VuZGVyIHx8IHJvb3QtPmRlc2NlbmRlciApICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggZmFjZS0+b3MyLnZlcnNpb24gIT0gMHhGRkZGVSApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBmYWNlLT5vczIuc1R5cG9Bc2NlbmRlciB8fCBmYWNlLT5vczIuc1R5cG9EZXNjZW5kZXIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByb290LT5hc2NlbmRlciAgPSBmYWNlLT5vczIuc1R5cG9Bc2NlbmRlcjsKLSAgICAgICAgICAgICAgcm9vdC0+ZGVzY2VuZGVyID0gZmFjZS0+b3MyLnNUeXBvRGVzY2VuZGVyOwotCi0gICAgICAgICAgICAgIHJvb3QtPmhlaWdodCA9IHJvb3QtPmFzY2VuZGVyIC0gcm9vdC0+ZGVzY2VuZGVyICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+b3MyLnNUeXBvTGluZUdhcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcm9vdC0+YXNjZW5kZXIgID0gIChGVF9TaG9ydClmYWNlLT5vczIudXNXaW5Bc2NlbnQ7Ci0gICAgICAgICAgICAgIHJvb3QtPmRlc2NlbmRlciA9IC0oRlRfU2hvcnQpZmFjZS0+b3MyLnVzV2luRGVzY2VudDsKLQotICAgICAgICAgICAgICByb290LT5oZWlnaHQgPSByb290LT5hc2NlbmRlciAtIHJvb3QtPmRlc2NlbmRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByb290LT5tYXhfYWR2YW5jZV93aWR0aCAgPQotICAgICAgICAgIChGVF9TaG9ydClmYWNlLT5ob3Jpem9udGFsLmFkdmFuY2VfV2lkdGhfTWF4OwotICAgICAgICByb290LT5tYXhfYWR2YW5jZV9oZWlnaHQgPQotICAgICAgICAgIChGVF9TaG9ydCkoIGZhY2UtPnZlcnRpY2FsX2luZm8gPyBmYWNlLT52ZXJ0aWNhbC5hZHZhbmNlX0hlaWdodF9NYXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcm9vdC0+aGVpZ2h0ICk7Ci0KLSAgICAgICAgLyogU2VlIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9PcGVuVHlwZS9PVFNwZWMvcG9zdC5odG0gLS0gKi8KLSAgICAgICAgLyogQWRqdXN0IHVuZGVybGluZSBwb3NpdGlvbiBmcm9tIHRvcCBlZGdlIHRvIGNlbnRyZSBvZiAgICAgKi8KLSAgICAgICAgLyogc3Ryb2tlIHRvIGNvbnZlcnQgVHJ1ZVR5cGUgbWVhbmluZyB0byBGcmVlVHlwZSBtZWFuaW5nLiAgKi8KLSAgICAgICAgcm9vdC0+dW5kZXJsaW5lX3Bvc2l0aW9uICA9IGZhY2UtPnBvc3RzY3JpcHQudW5kZXJsaW5lUG9zaXRpb24gLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+cG9zdHNjcmlwdC51bmRlcmxpbmVUaGlja25lc3MgLyAyOwotICAgICAgICByb290LT51bmRlcmxpbmVfdGhpY2tuZXNzID0gZmFjZS0+cG9zdHNjcmlwdC51bmRlcmxpbmVUaGlja25lc3M7Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICBGVF9UUkFDRTIoKCAic2ZudF9sb2FkX2ZhY2U6IGRvbmVcbiIgKSk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0jdW5kZWYgTE9BRF8KLSN1bmRlZiBMT0FETV8KLSN1bmRlZiBHRVRfTkFNRQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgc2ZudF9kb25lX2ZhY2UoIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnk7Ci0gICAgU0ZOVF9TZXJ2aWNlICBzZm50OwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybjsKLQotICAgIG1lbW9yeSA9IGZhY2UtPnJvb3QubWVtb3J5OwotICAgIHNmbnQgICA9IChTRk5UX1NlcnZpY2UpZmFjZS0+c2ZudDsKLQotICAgIGlmICggc2ZudCApCi0gICAgewotICAgICAgLyogZGVzdHJveSB0aGUgcG9zdHNjcmlwdCBuYW1lcyB0YWJsZSBpZiBpdCBpcyBsb2FkZWQgKi8KLSAgICAgIGlmICggc2ZudC0+ZnJlZV9wc25hbWVzICkKLSAgICAgICAgc2ZudC0+ZnJlZV9wc25hbWVzKCBmYWNlICk7Ci0KLSAgICAgIC8qIGRlc3Ryb3kgdGhlIGVtYmVkZGVkIGJpdG1hcHMgdGFibGUgaWYgaXQgaXMgbG9hZGVkICovCi0gICAgICBpZiAoIHNmbnQtPmZyZWVfZWJsYyApCi0gICAgICAgIHNmbnQtPmZyZWVfZWJsYyggZmFjZSApOwotICAgIH0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fQkRGCi0gICAgLyogZnJlZWluZyB0aGUgZW1iZWRkZWQgQkRGIHByb3BlcnRpZXMgKi8KLSAgICB0dF9mYWNlX2ZyZWVfYmRmX3Byb3BzKCBmYWNlICk7Ci0jZW5kaWYKLQotICAgIC8qIGZyZWVpbmcgdGhlIGtlcm5pbmcgdGFibGUgKi8KLSAgICB0dF9mYWNlX2RvbmVfa2VybiggZmFjZSApOwotCi0gICAgLyogZnJlZWluZyB0aGUgY29sbGVjdGlvbiB0YWJsZSAqLwotICAgIEZUX0ZSRUUoIGZhY2UtPnR0Y19oZWFkZXIub2Zmc2V0cyApOwotICAgIGZhY2UtPnR0Y19oZWFkZXIuY291bnQgPSAwOwotCi0gICAgLyogZnJlZWluZyB0YWJsZSBkaXJlY3RvcnkgKi8KLSAgICBGVF9GUkVFKCBmYWNlLT5kaXJfdGFibGVzICk7Ci0gICAgZmFjZS0+bnVtX3RhYmxlcyA9IDA7Ci0KLSAgICB7Ci0gICAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IEZUX0ZBQ0VfU1RSRUFNKCBmYWNlICk7Ci0KLQotICAgICAgLyogc2ltcGx5IHJlbGVhc2UgdGhlICdjbWFwJyB0YWJsZSBmcmFtZSAqLwotICAgICAgRlRfRlJBTUVfUkVMRUFTRSggZmFjZS0+Y21hcF90YWJsZSApOwotICAgICAgZmFjZS0+Y21hcF9zaXplID0gMDsKLSAgICB9Ci0KLSAgICAvKiBmcmVlaW5nIHRoZSBob3Jpem9udGFsIG1ldHJpY3MgKi8KLSAgICB7Ci0gICAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IEZUX0ZBQ0VfU1RSRUFNKCBmYWNlICk7Ci0KLQotICAgICAgRlRfRlJBTUVfUkVMRUFTRSggZmFjZS0+aG9yel9tZXRyaWNzICk7Ci0gICAgICBGVF9GUkFNRV9SRUxFQVNFKCBmYWNlLT52ZXJ0X21ldHJpY3MgKTsKLSAgICAgIGZhY2UtPmhvcnpfbWV0cmljc19zaXplID0gMDsKLSAgICAgIGZhY2UtPnZlcnRfbWV0cmljc19zaXplID0gMDsKLSAgICB9Ci0KLSAgICAvKiBmcmVlaW5nIHRoZSB2ZXJ0aWNhbCBvbmVzLCBpZiBhbnkgKi8KLSAgICBpZiAoIGZhY2UtPnZlcnRpY2FsX2luZm8gKQotICAgIHsKLSAgICAgIEZUX0ZSRUUoIGZhY2UtPnZlcnRpY2FsLmxvbmdfbWV0cmljcyAgKTsKLSAgICAgIEZUX0ZSRUUoIGZhY2UtPnZlcnRpY2FsLnNob3J0X21ldHJpY3MgKTsKLSAgICAgIGZhY2UtPnZlcnRpY2FsX2luZm8gPSAwOwotICAgIH0KLQotICAgIC8qIGZyZWVpbmcgdGhlIGdhc3AgdGFibGUgKi8KLSAgICBGVF9GUkVFKCBmYWNlLT5nYXNwLmdhc3BSYW5nZXMgKTsKLSAgICBmYWNlLT5nYXNwLm51bVJhbmdlcyA9IDA7Ci0KLSAgICAvKiBmcmVlaW5nIHRoZSBuYW1lIHRhYmxlICovCi0gICAgaWYgKCBzZm50ICkKLSAgICAgIHNmbnQtPmZyZWVfbmFtZSggZmFjZSApOwotCi0gICAgLyogZnJlZWluZyBmYW1pbHkgYW5kIHN0eWxlIG5hbWUgKi8KLSAgICBGVF9GUkVFKCBmYWNlLT5yb290LmZhbWlseV9uYW1lICk7Ci0gICAgRlRfRlJFRSggZmFjZS0+cm9vdC5zdHlsZV9uYW1lICk7Ci0KLSAgICAvKiBmcmVlaW5nIHNiaXQgc2l6ZSB0YWJsZSAqLwotICAgIEZUX0ZSRUUoIGZhY2UtPnJvb3QuYXZhaWxhYmxlX3NpemVzICk7Ci0gICAgZmFjZS0+cm9vdC5udW1fZml4ZWRfc2l6ZXMgPSAwOwotCi0gICAgRlRfRlJFRSggZmFjZS0+cG9zdHNjcmlwdF9uYW1lICk7Ci0KLSAgICBmYWNlLT5zZm50ID0gTlVMTDsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvc2ZvYmpzLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9zZm9ianMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU1Zjg2Ny4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC9zZm9ianMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHNmb2Jqcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBTRk5UIG9iamVjdCBtYW5hZ2VtZW50IChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1NGT0JKU19IX18KLSNkZWZpbmUgX19TRk9CSlNfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRk5UX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX09CSkVDVFNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgc2ZudF9pbml0X2ZhY2UoIEZUX1N0cmVhbSAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIFRUX0ZhY2UgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBmYWNlX2luc3RhbmNlX2luZGV4LAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHNmbnRfbG9hZF9mYWNlKCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICBUVF9GYWNlICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgZmFjZV9pbnN0YW5jZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgICBGVF9QYXJhbWV0ZXIqICBwYXJhbXMgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHNmbnRfZG9uZV9mYWNlKCBUVF9GYWNlICBmYWNlICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9nZXRfbmFtZSggVFRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICBuYW1laWQsCi0gICAgICAgICAgICAgICAgICAgIEZUX1N0cmluZyoqICBuYW1lICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19TRkRSSVZFUl9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0YmRmLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dGJkZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOThiNzgxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0YmRmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRiZGYuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlIGFuZCBPcGVuVHlwZSBlbWJlZGRlZCBCREYgcHJvcGVydGllcyAoYm9keSkuICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLSNpbmNsdWRlICJ0dGJkZi5oIgotCi0jaW5jbHVkZSAic2ZlcnJvcnMuaCIKLQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9CREYKLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90dGJkZgotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdHRfZmFjZV9mcmVlX2JkZl9wcm9wcyggVFRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBUVF9CREYgIGJkZiA9ICZmYWNlLT5iZGY7Ci0KLQotICAgIGlmICggYmRmLT5sb2FkZWQgKQotICAgIHsKLSAgICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gRlRfRkFDRShmYWNlKS0+c3RyZWFtOwotCi0KLSAgICAgIGlmICggYmRmLT50YWJsZSAhPSBOVUxMICkKLSAgICAgICAgRlRfRlJBTUVfUkVMRUFTRSggYmRmLT50YWJsZSApOwotCi0gICAgICBiZGYtPnRhYmxlX2VuZCAgICA9IE5VTEw7Ci0gICAgICBiZGYtPnN0cmluZ3MgICAgICA9IE5VTEw7Ci0gICAgICBiZGYtPnN0cmluZ3Nfc2l6ZSA9IDA7Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfZmFjZV9sb2FkX2JkZl9wcm9wcyggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBUVF9CREYgICAgYmRmID0gJmZhY2UtPmJkZjsKLSAgICBGVF9VTG9uZyAgbGVuZ3RoOwotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgRlRfWkVSTyggYmRmICk7Ci0KLSAgICBlcnJvciA9IHR0X2ZhY2VfZ290b190YWJsZSggZmFjZSwgVFRBR19CREYsIHN0cmVhbSwgJmxlbmd0aCApOwotICAgIGlmICggZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgIGxlbmd0aCA8IDggICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICBGVF9GUkFNRV9FWFRSQUNUKCBsZW5ndGgsIGJkZi0+dGFibGUgKSApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGJkZi0+dGFibGVfZW5kID0gYmRmLT50YWJsZSArIGxlbmd0aDsKLQotICAgIHsKLSAgICAgIEZUX0J5dGUqICAgcCAgICAgICAgICAgPSBiZGYtPnRhYmxlOwotICAgICAgRlRfVUludCAgICB2ZXJzaW9uICAgICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBGVF9VSW50ICAgIG51bV9zdHJpa2VzID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIEZUX1VMb25nICAgc3RyaW5ncyAgICAgPSBGVF9ORVhUX1VMT05HICggcCApOwotICAgICAgRlRfVUludCAgICBjb3VudDsKLSAgICAgIEZUX0J5dGUqICAgc3RyaWtlOwotCi0KLSAgICAgIGlmICggdmVyc2lvbiAhPSAweDAwMDEgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIHN0cmluZ3MgPCA4ICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAoIHN0cmluZ3MgLSA4ICkgLyA0IDwgbnVtX3N0cmlrZXMgfHwKLSAgICAgICAgICAgc3RyaW5ncyArIDEgPiBsZW5ndGggICAgICAgICAgICAgICkKLSAgICAgIHsKLSAgICAgICAgZ290byBCYWRUYWJsZTsKLSAgICAgIH0KLQotICAgICAgYmRmLT5udW1fc3RyaWtlcyAgPSBudW1fc3RyaWtlczsKLSAgICAgIGJkZi0+c3RyaW5ncyAgICAgID0gYmRmLT50YWJsZSArIHN0cmluZ3M7Ci0gICAgICBiZGYtPnN0cmluZ3Nfc2l6ZSA9IGxlbmd0aCAtIHN0cmluZ3M7Ci0KLSAgICAgIGNvdW50ICA9IGJkZi0+bnVtX3N0cmlrZXM7Ci0gICAgICBwICAgICAgPSBiZGYtPnRhYmxlICsgODsKLSAgICAgIHN0cmlrZSA9IHAgKyBjb3VudCAqIDQ7Ci0KLQotICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgICAgewotICAgICAgICBGVF9VSW50ICBudW1faXRlbXMgPSBGVF9QRUVLX1VTSE9SVCggcCArIDIgKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiAgV2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgdmFsdWUgc2V0cyB0aGVtc2VsdmVzLCBzaW5jZSB0aGlzCi0gICAgICAgICAqICBpcyBkb25lIGxhdGVyLgotICAgICAgICAgKi8KLSAgICAgICAgc3RyaWtlICs9IDEwICogbnVtX2l0ZW1zOwotCi0gICAgICAgIHAgKz0gNDsKLSAgICAgIH0KLQotICAgICAgaWYgKCBzdHJpa2UgPiBiZGYtPnN0cmluZ3MgKQotICAgICAgICBnb3RvIEJhZFRhYmxlOwotICAgIH0KLQotICAgIGJkZi0+bG9hZGVkID0gMTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLQotICBCYWRUYWJsZToKLSAgICBGVF9GUkFNRV9SRUxFQVNFKCBiZGYtPnRhYmxlICk7Ci0gICAgRlRfWkVSTyggYmRmICk7Ci0gICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgIGdvdG8gRXhpdDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfZmluZF9iZGZfcHJvcCggVFRfRmFjZSAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAgICAgICBwcm9wZXJ0eV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJERl9Qcm9wZXJ0eVJlYyAgKmFwcm9wICkKLSAgewotICAgIFRUX0JERiAgICAgYmRmICAgPSAmZmFjZS0+YmRmOwotICAgIEZUX1NpemUgICAgc2l6ZSAgPSBGVF9GQUNFKGZhY2UpLT5zaXplOwotICAgIEZUX0Vycm9yICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfQnl0ZSogICBwOwotICAgIEZUX1VJbnQgICAgY291bnQ7Ci0gICAgRlRfQnl0ZSogICBzdHJpa2U7Ci0gICAgRlRfT2Zmc2V0ICBwcm9wZXJ0eV9sZW47Ci0KLQotICAgIGFwcm9wLT50eXBlID0gQkRGX1BST1BFUlRZX1RZUEVfTk9ORTsKLQotICAgIGlmICggYmRmLT5sb2FkZWQgPT0gMCApCi0gICAgewotICAgICAgZXJyb3IgPSB0dF9mYWNlX2xvYWRfYmRmX3Byb3BzKCBmYWNlLCBGVF9GQUNFKCBmYWNlICktPnN0cmVhbSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBjb3VudCAgPSBiZGYtPm51bV9zdHJpa2VzOwotICAgIHAgICAgICA9IGJkZi0+dGFibGUgKyA4OwotICAgIHN0cmlrZSA9IHAgKyA0ICogY291bnQ7Ci0KLSAgICBlcnJvciA9IEZUX0VSUiggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgaWYgKCBzaXplID09IE5VTEwgfHwgcHJvcGVydHlfbmFtZSA9PSBOVUxMICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHByb3BlcnR5X2xlbiA9IGZ0X3N0cmxlbiggcHJvcGVydHlfbmFtZSApOwotICAgIGlmICggcHJvcGVydHlfbGVuID09IDAgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIF9wcGVtICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBGVF9VSW50ICBfY291bnQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgICBpZiAoIF9wcGVtID09IHNpemUtPm1ldHJpY3MueV9wcGVtICkKLSAgICAgIHsKLSAgICAgICAgY291bnQgPSBfY291bnQ7Ci0gICAgICAgIGdvdG8gRm91bmRTdHJpa2U7Ci0gICAgICB9Ci0KLSAgICAgIHN0cmlrZSArPSAxMCAqIF9jb3VudDsKLSAgICB9Ci0gICAgZ290byBFeGl0OwotCi0gIEZvdW5kU3RyaWtlOgotICAgIHAgPSBzdHJpa2U7Ci0gICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIHR5cGUgPSBGVF9QRUVLX1VTSE9SVCggcCArIDQgKTsKLQotICAgICAgaWYgKCAoIHR5cGUgJiAweDEwICkgIT0gMCApCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQzMiAgbmFtZV9vZmZzZXQgPSBGVF9QRUVLX1VMT05HKCBwICAgICApOwotICAgICAgICBGVF9VSW50MzIgIHZhbHVlICAgICAgID0gRlRfUEVFS19VTE9ORyggcCArIDYgKTsKLQotICAgICAgICAvKiBiZSBhIGJpdCBwYXJhbm9pZCBmb3IgaW52YWxpZCBlbnRyaWVzIGhlcmUgKi8KLSAgICAgICAgaWYgKCBuYW1lX29mZnNldCA8IGJkZi0+c3RyaW5nc19zaXplICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIHByb3BlcnR5X2xlbiA8IGJkZi0+c3RyaW5nc19zaXplIC0gbmFtZV9vZmZzZXQgICAgICYmCi0gICAgICAgICAgICAgZnRfc3RybmNtcCggcHJvcGVydHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopYmRmLT5zdHJpbmdzICsgbmFtZV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYmRmLT5zdHJpbmdzX3NpemUgLSBuYW1lX29mZnNldCApID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgc3dpdGNoICggdHlwZSAmIDB4MEYgKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDB4MDA6ICAvKiBzdHJpbmcgKi8KLSAgICAgICAgICBjYXNlIDB4MDE6ICAvKiBhdG9tcyAqLwotICAgICAgICAgICAgLyogY2hlY2sgdGhhdCB0aGUgY29udGVudCBpcyByZWFsbHkgMC10ZXJtaW5hdGVkICovCi0gICAgICAgICAgICBpZiAoIHZhbHVlIDwgYmRmLT5zdHJpbmdzX3NpemUgJiYKLSAgICAgICAgICAgICAgICAgZnRfbWVtY2hyKCBiZGYtPnN0cmluZ3MgKyB2YWx1ZSwgMCwgYmRmLT5zdHJpbmdzX3NpemUgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGFwcm9wLT50eXBlICAgPSBCREZfUFJPUEVSVFlfVFlQRV9BVE9NOwotICAgICAgICAgICAgICBhcHJvcC0+dS5hdG9tID0gKGNvbnN0IGNoYXIqKWJkZi0+c3RyaW5ncyArIHZhbHVlOwotICAgICAgICAgICAgICBlcnJvciAgICAgICAgID0gRlRfRXJyX09rOwotICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgMHgwMjoKLSAgICAgICAgICAgIGFwcm9wLT50eXBlICAgICAgPSBCREZfUFJPUEVSVFlfVFlQRV9JTlRFR0VSOwotICAgICAgICAgICAgYXByb3AtPnUuaW50ZWdlciA9IChGVF9JbnQzMil2YWx1ZTsKLSAgICAgICAgICAgIGVycm9yICAgICAgICAgICAgPSBGVF9FcnJfT2s7Ci0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgICBjYXNlIDB4MDM6Ci0gICAgICAgICAgICBhcHJvcC0+dHlwZSAgICAgICA9IEJERl9QUk9QRVJUWV9UWVBFX0NBUkRJTkFMOwotICAgICAgICAgICAgYXByb3AtPnUuY2FyZGluYWwgPSB2YWx1ZTsKLSAgICAgICAgICAgIGVycm9yICAgICAgICAgICAgID0gRlRfRXJyX09rOwotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHAgKz0gMTA7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX0JERiAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRiZGYuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0YmRmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNGJhNDguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRiZGYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0YmRmLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBhbmQgT3BlblR5cGUgZW1iZWRkZWQgQkRGIHByb3BlcnRpZXMgKHNwZWNpZmljYXRpb24pLiAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1RUQkRGX0hfXwotI2RlZmluZSBfX1RUQkRGX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgInR0bG9hZC5oIgotI2luY2x1ZGUgRlRfQkRGX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgdHRfZmFjZV9mcmVlX2JkZl9wcm9wcyggVFRfRmFjZSAgZmFjZSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9maW5kX2JkZl9wcm9wKCBUVF9GYWNlICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICAgICAgIHByb3BlcnR5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQkRGX1Byb3BlcnR5UmVjICAqYXByb3AgKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1RUQkRGX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRjbWFwLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dGNtYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkOWFiZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dGNtYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDM3MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRjbWFwLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlIGNoYXJhY3RlciBtYXBwaW5nIHRhYmxlIChjbWFwKSBzdXBwb3J0IChib2R5KS4gICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLQotI2luY2x1ZGUgInNmZXJyb3JzLmgiICAgICAgICAgICAvKiBtdXN0IGNvbWUgYmVmb3JlIEZUX0lOVEVSTkFMX1ZBTElEQVRFX0ggKi8KLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfVkFMSURBVEVfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlICJ0dGxvYWQuaCIKLSNpbmNsdWRlICJ0dGNtYXAuaCIKLSNpbmNsdWRlICJzZm50cGljLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90dGNtYXAKLQotCi0jZGVmaW5lIFRUX1BFRUtfU0hPUlQgICBGVF9QRUVLX1NIT1JUCi0jZGVmaW5lIFRUX1BFRUtfVVNIT1JUICBGVF9QRUVLX1VTSE9SVAotI2RlZmluZSBUVF9QRUVLX1VJTlQyNCAgRlRfUEVFS19VT0ZGMwotI2RlZmluZSBUVF9QRUVLX0xPTkcgICAgRlRfUEVFS19MT05HCi0jZGVmaW5lIFRUX1BFRUtfVUxPTkcgICBGVF9QRUVLX1VMT05HCi0KLSNkZWZpbmUgVFRfTkVYVF9TSE9SVCAgIEZUX05FWFRfU0hPUlQKLSNkZWZpbmUgVFRfTkVYVF9VU0hPUlQgIEZUX05FWFRfVVNIT1JUCi0jZGVmaW5lIFRUX05FWFRfVUlOVDI0ICBGVF9ORVhUX1VPRkYzCi0jZGVmaW5lIFRUX05FWFRfTE9ORyAgICBGVF9ORVhUX0xPTkcKLSNkZWZpbmUgVFRfTkVYVF9VTE9ORyAgIEZUX05FWFRfVUxPTkcKLQotCi0gIC8qIFRvbyBsYXJnZSBnbHlwaCBpbmRleCByZXR1cm4gdmFsdWVzIGFyZSBjYXVnaHQgaW4gYEZUX0dldF9DaGFyX0luZGV4JyAqLwotICAvKiBhbmQgYEZUX0dldF9OZXh0X0NoYXInICh0aGUgbGF0dGVyIGNhbGxzIHRoZSBpbnRlcm5hbCBgbmV4dCcgZnVuY3Rpb24gKi8KLSAgLyogYWdhaW4gaW4gdGhpcyBjYXNlKS4gIFRvIG1hcmsgY2hhcmFjdGVyIGNvZGUgcmV0dXJuIHZhbHVlcyBhcyBpbnZhbGlkICovCi0gIC8qIGl0IGlzIHN1ZmZpY2llbnQgdG8gc2V0IHRoZSBjb3JyZXNwb25kaW5nIGdseXBoIGluZGV4IHJldHVybiB2YWx1ZSB0byAqLwotICAvKiB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwX2luaXQoIFRUX0NNYXAgICBjbWFwLAotICAgICAgICAgICAgICAgIEZUX0J5dGUqICB0YWJsZSApCi0gIHsKLSAgICBjbWFwLT5kYXRhID0gdGFibGU7Ci0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9STUFUIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUQUJMRSBPVkVSVklFVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5BTUUgICAgICAgIE9GRlNFVCAgICAgICAgIFRZUEUgICAgICAgICAgREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZm9ybWF0ICAgICAgMCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICBtdXN0IGJlIDAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGxlbmd0aCAgICAgIDIgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgdGFibGUgbGVuZ3RoIGluIGJ5dGVzICAgICAgKi8KLSAgLyogICBsYW5ndWFnZSAgICA0ICAgICAgICAgICAgICBVU0hPUlQgICAgICAgIE1hYyBsYW5ndWFnZSBjb2RlICAgICAgICAgICovCi0gIC8qICAgZ2x5cGhfaWRzICAgNiAgICAgICAgICAgICAgQllURVsyNTZdICAgICBhcnJheSBvZiBnbHlwaCBpbmRpY2VzICAgICAqLwotICAvKiAgICAgICAgICAgICAgIDI2MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMAotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwMF92YWxpZGF0ZSggRlRfQnl0ZSogICAgICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1ZhbGlkYXRvciAgdmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZSogIHA7Ci0gICAgRlRfVUludCAgIGxlbmd0aDsKLQotCi0gICAgaWYgKCB0YWJsZSArIDIgKyAyID4gdmFsaWQtPmxpbWl0ICkKLSAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOwotCi0gICAgcCAgICAgID0gdGFibGUgKyAyOyAgICAgICAgICAgLyogc2tpcCBmb3JtYXQgKi8KLSAgICBsZW5ndGggPSBUVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgaWYgKCB0YWJsZSArIGxlbmd0aCA+IHZhbGlkLT5saW1pdCB8fCBsZW5ndGggPCAyNjIgKQotICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICAvKiBjaGVjayBnbHlwaCBpbmRpY2VzIHdoZW5ldmVyIG5lY2Vzc2FyeSAqLwotICAgIGlmICggdmFsaWQtPmxldmVsID49IEZUX1ZBTElEQVRFX1RJR0hUICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBuLCBpZHg7Ci0KLQotICAgICAgcCA9IHRhYmxlICsgNjsKLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgMjU2OyBuKysgKQotICAgICAgewotICAgICAgICBpZHggPSAqcCsrOwotICAgICAgICBpZiAoIGlkeCA+PSBUVF9WQUxJRF9HTFlQSF9DT1VOVCggdmFsaWQgKSApCi0gICAgICAgICAgRlRfSU5WQUxJRF9HTFlQSF9JRDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICB0dF9jbWFwMF9jaGFyX2luZGV4KCBUVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlICkKLSAgewotICAgIEZUX0J5dGUqICB0YWJsZSA9IGNtYXAtPmRhdGE7Ci0KLQotICAgIHJldHVybiBjaGFyX2NvZGUgPCAyNTYgPyB0YWJsZVs2ICsgY2hhcl9jb2RlXSA6IDA7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludDMyICkKLSAgdHRfY21hcDBfY2hhcl9uZXh0KCBUVF9DTWFwICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgKnBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfQnl0ZSogICB0YWJsZSAgICA9IGNtYXAtPmRhdGE7Ci0gICAgRlRfVUludDMyICBjaGFyY29kZSA9ICpwY2hhcl9jb2RlOwotICAgIEZUX1VJbnQzMiAgcmVzdWx0ICAgPSAwOwotICAgIEZUX1VJbnQgICAgZ2luZGV4ICAgPSAwOwotCi0KLSAgICB0YWJsZSArPSA2OyAgLyogZ28gdG8gZ2x5cGggSURzICovCi0gICAgd2hpbGUgKCArK2NoYXJjb2RlIDwgMjU2ICkKLSAgICB7Ci0gICAgICBnaW5kZXggPSB0YWJsZVtjaGFyY29kZV07Ci0gICAgICBpZiAoIGdpbmRleCAhPSAwICkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gY2hhcmNvZGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgICpwY2hhcl9jb2RlID0gcmVzdWx0OwotICAgIHJldHVybiBnaW5kZXg7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwMF9nZXRfaW5mbyggVFRfQ01hcCAgICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcEluZm8gICpjbWFwX2luZm8gKQotICB7Ci0gICAgRlRfQnl0ZSogIHAgPSBjbWFwLT5kYXRhICsgNDsKLQotCi0gICAgY21hcF9pbmZvLT5mb3JtYXQgICA9IDA7Ci0gICAgY21hcF9pbmZvLT5sYW5ndWFnZSA9IChGVF9VTG9uZylUVF9QRUVLX1VTSE9SVCggcCApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfREVGSU5FX1RUX0NNQVAoCi0gICAgdHRfY21hcDBfY2xhc3NfcmVjLAotICAgIHNpemVvZiAoIFRUX0NNYXBSZWMgKSwKLQotICAgIChGVF9DTWFwX0luaXRGdW5jKSAgICAgdHRfY21hcF9pbml0LAotICAgIChGVF9DTWFwX0RvbmVGdW5jKSAgICAgTlVMTCwKLSAgICAoRlRfQ01hcF9DaGFySW5kZXhGdW5jKXR0X2NtYXAwX2NoYXJfaW5kZXgsCi0gICAgKEZUX0NNYXBfQ2hhck5leHRGdW5jKSB0dF9jbWFwMF9jaGFyX25leHQsCi0KLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0KLSAgICAwLAotICAgIChUVF9DTWFwX1ZhbGlkYXRlRnVuYyl0dF9jbWFwMF92YWxpZGF0ZSwKLSAgICAoVFRfQ01hcF9JbmZvX0dldEZ1bmMpdHRfY21hcDBfZ2V0X2luZm8gKQotCi0jZW5kaWYgLyogVFRfQ09ORklHX0NNQVBfRk9STUFUXzAgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgRk9STUFUIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqIFRoaXMgaXMgdXNlZCBmb3IgY2VydGFpbiBDSksgZW5jb2RpbmdzIHRoYXQgZW5jb2RlIHRleHQgaW4gYSAgKioqKiovCi0gIC8qKioqKiBtaXhlZCA4LzE2IGJpdHMgZW5jb2RpbmcgYWxvbmcgdGhlIGZvbGxvd2luZyBsaW5lcy4gICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICogQ2VydGFpbiBieXRlIHZhbHVlcyBjb3JyZXNwb25kIHRvIGFuIDgtYml0IGNoYXJhY3RlciBjb2RlICAgKioqKiovCi0gIC8qKioqKiAgICh0eXBpY2FsbHkgaW4gdGhlIHJhbmdlIDAuLjEyNyBmb3IgQVNDSUkgY29tcGF0aWJpbGl0eSkuICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICogQ2VydGFpbiBieXRlIHZhbHVlcyBzaWduYWwgdGhlIGZpcnN0IGJ5dGUgb2YgYSAyLWJ5dGUgICAgICAgKioqKiovCi0gIC8qKioqKiAgIGNoYXJhY3RlciBjb2RlIChidXQgdGhlc2UgdmFsdWVzIGFyZSBhbHNvIHZhbGlkIGFzIHRoZSAgICAgICoqKioqLwotICAvKioqKiogICBzZWNvbmQgYnl0ZSBvZiBhIDItYnl0ZSBjaGFyYWN0ZXIpLiAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiBUaGUgZm9sbG93aW5nIGNoYXJtYXAgbG9va3VwIGFuZCBpdGVyYXRpb24gZnVuY3Rpb25zIGFsbCAgICAgICoqKioqLwotICAvKioqKiogYXNzdW1lIHRoYXQgdGhlIHZhbHVlIGBjaGFyY29kZScgZnVsZmlsbHMgdGhlIGZvbGxvd2luZy4gICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgIC0gRm9yIG9uZSBieXRlIGNoYXJhY3RlcnMsIGBjaGFyY29kZScgaXMgc2ltcGx5IHRoZSAgICAgICAgICoqKioqLwotICAvKioqKiogICAgIGNoYXJhY3RlciBjb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgIC0gRm9yIHR3byBieXRlIGNoYXJhY3RlcnMsIGBjaGFyY29kZScgaXMgdGhlIDItYnl0ZSAgICAgICAgICoqKioqLwotICAvKioqKiogICAgIGNoYXJhY3RlciBjb2RlIGluIGJpZyBlbmRpYW4gZm9ybWF0LiAgTW9yZSBwcmVjaXNlbHk6ICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAoY2hhcmNvZGUgPj4gOCkgICAgaXMgdGhlIGZpcnN0IGJ5dGUgdmFsdWUgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgKGNoYXJjb2RlICYgMHhGRikgIGlzIHRoZSBzZWNvbmQgYnl0ZSB2YWx1ZSAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiBOb3RlIHRoYXQgbm90IGFsbCB2YWx1ZXMgb2YgYGNoYXJjb2RlJyBhcmUgdmFsaWQgYWNjb3JkaW5nICAgICoqKioqLwotICAvKioqKiogdG8gdGhlc2UgcnVsZXMsIGFuZCB0aGUgZnVuY3Rpb24gbW9kZXJhdGVseSBjaGVja3MgdGhlICAgICAgICAqKioqKi8KLSAgLyoqKioqIGFyZ3VtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUQUJMRSBPVkVSVklFVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5BTUUgICAgICAgIE9GRlNFVCAgICAgICAgIFRZUEUgICAgICAgICAgICBERVNDUklQVElPTiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZm9ybWF0ICAgICAgMCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgIG11c3QgYmUgMiAgICAgICAgICAgICAgICAqLwotICAvKiAgIGxlbmd0aCAgICAgIDIgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICB0YWJsZSBsZW5ndGggaW4gYnl0ZXMgICAgKi8KLSAgLyogICBsYW5ndWFnZSAgICA0ICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgTWFjIGxhbmd1YWdlIGNvZGUgICAgICAgICovCi0gIC8qICAga2V5cyAgICAgICAgNiAgICAgICAgICAgICAgVVNIT1JUWzI1Nl0gICAgIHN1Yi1oZWFkZXIga2V5cyAgICAgICAgICAqLwotICAvKiAgIHN1YnMgICAgICAgIDUxOCAgICAgICAgICAgIFNVQkhFQURbTlNVQlNdICBzdWItaGVhZGVycyBhcnJheSAgICAgICAgKi8KLSAgLyogICBnbHlwaF9pZHMgICA1MTgrTlNVQio4ICAgICBVU0hPUlRbXSAgICAgICAgZ2x5cGggSUQgYXJyYXkgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgYGtleXMnIHRhYmxlIGlzIHVzZWQgdG8gbWFwIGNoYXJjb2RlIGhpZ2gtYnl0ZXMgdG8gc3ViLWhlYWRlcnMuICAgKi8KLSAgLyogVGhlIHZhbHVlIG9mIGBOU1VCUycgaXMgdGhlIG51bWJlciBvZiBzdWItaGVhZGVycyBkZWZpbmVkIGluIHRoZSAgICAgICovCi0gIC8qIHRhYmxlIGFuZCBpcyBjb21wdXRlZCBieSBmaW5kaW5nIHRoZSBtYXhpbXVtIG9mIHRoZSBga2V5cycgdGFibGUuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSB0aGF0IGZvciBhbnkgbiwgYGtleXNbbl0nIGlzIGEgYnl0ZSBvZmZzZXQgd2l0aGluIHRoZSBgc3VicycgICAgICovCi0gIC8qIHRhYmxlLCBpLmUuLCBpdCBpcyB0aGUgY29ycmVzcG9uZGluZyBzdWItaGVhZGVyIGluZGV4IG11bHRpcGxpZWQgICAgICAqLwotICAvKiBieSA4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEVhY2ggc3ViLWhlYWRlciBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOQU1FICAgICAgICBPRkZTRVQgICAgICBUWVBFICAgICAgICAgICAgREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGZpcnN0ICAgICAgIDAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICBmaXJzdCB2YWxpZCBsb3ctYnl0ZSAgICAgICAgKi8KLSAgLyogICBjb3VudCAgICAgICAyICAgICAgICAgICBVU0hPUlQgICAgICAgICAgbnVtYmVyIG9mIHZhbGlkIGxvdy1ieXRlcyAgICovCi0gIC8qICAgZGVsdGEgICAgICAgNCAgICAgICAgICAgU0hPUlQgICAgICAgICAgIHNlZSBiZWxvdyAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIG9mZnNldCAgICAgIDYgICAgICAgICAgIFVTSE9SVCAgICAgICAgICBzZWUgYmVsb3cgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEEgc3ViLWhlYWRlciBkZWZpbmVzLCBmb3IgZWFjaCBoaWdoLWJ5dGUsIHRoZSByYW5nZSBvZiB2YWxpZCAgICAgICAgICAqLwotICAvKiBsb3ctYnl0ZXMgd2l0aGluIHRoZSBjaGFybWFwLiAgTm90ZSB0aGF0IHRoZSByYW5nZSBkZWZpbmVkIGJ5IGBmaXJzdCcgKi8KLSAgLyogYW5kIGBjb3VudCcgbXVzdCBiZSBjb21wbGV0ZWx5IGluY2x1ZGVkIGluIHRoZSBpbnRlcnZhbCBbMC4uMjU1XSAgICAgICovCi0gIC8qIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSWYgYSBjaGFyYWN0ZXIgY29kZSBpcyBjb250YWluZWQgd2l0aGluIGEgZ2l2ZW4gc3ViLWhlYWRlciwgdGhlbiAgICAgICovCi0gIC8qIG1hcHBpbmcgaXQgdG8gYSBnbHlwaCBpbmRleCBpcyBkb25lIGFzIGZvbGxvd3MuICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogKiBUaGUgdmFsdWUgb2YgYG9mZnNldCcgaXMgcmVhZC4gIFRoaXMgaXMgYSBfYnl0ZV8gZGlzdGFuY2UgZnJvbSB0aGUgICovCi0gIC8qICAgbG9jYXRpb24gb2YgdGhlIGBvZmZzZXQnIGZpZWxkIGl0c2VsZiBpbnRvIGEgc2xpY2Ugb2YgdGhlICAgICAgICAgICAqLwotICAvKiAgIGBnbHlwaF9pZHMnIHRhYmxlLiAgTGV0J3MgY2FsbCBpdCBgc2xpY2UnIChpdCBpcyBhIFVTSE9SVFtdLCB0b28pLiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICogVGhlIHZhbHVlIGBzbGljZVtjaGFyLmxvIC0gZmlyc3RdJyBpcyByZWFkLiAgSWYgaXQgaXMgMCwgdGhlcmUgaXMgICAqLwotICAvKiAgIG5vIGdseXBoIGZvciB0aGUgY2hhcmNvZGUuICBPdGhlcndpc2UsIHRoZSB2YWx1ZSBvZiBgZGVsdGEnIGlzICAgICAgKi8KLSAgLyogICBhZGRlZCB0byBpdCAobW9kdWxvIDY1NTM2KSB0byBmb3JtIGEgbmV3IGdseXBoIGluZGV4LiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJdCBpcyB1cCB0byB0aGUgdmFsaWRhdGlvbiByb3V0aW5lIHRvIGNoZWNrIHRoYXQgYWxsIG9mZnNldHMgZmFsbCAgICAgKi8KLSAgLyogd2l0aGluIHRoZSBnbHlwaCBJRHMgdGFibGUgKGFuZCBub3Qgd2l0aGluIHRoZSBgc3VicycgdGFibGUgaXRzZWxmIG9yICovCi0gIC8qIG91dHNpZGUgb2YgdGhlIENNYXApLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8yCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXAyX3ZhbGlkYXRlKCBGVF9CeXRlKiAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICB2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlKiAgcDsKLSAgICBGVF9VSW50ICAgbGVuZ3RoOwotCi0gICAgRlRfVUludCAgIG4sIG1heF9zdWJzOwotICAgIEZUX0J5dGUqICBrZXlzOyAgICAgICAgLyoga2V5cyB0YWJsZSAgICAgKi8KLSAgICBGVF9CeXRlKiAgc3ViczsgICAgICAgIC8qIHN1Yi1oZWFkZXJzICAgICovCi0gICAgRlRfQnl0ZSogIGdseXBoX2lkczsgICAvKiBnbHlwaCBJRCBhcnJheSAqLwotCi0KLSAgICBpZiAoIHRhYmxlICsgMiArIDIgPiB2YWxpZC0+bGltaXQgKQotICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICBwICAgICAgPSB0YWJsZSArIDI7ICAgICAgICAgICAvKiBza2lwIGZvcm1hdCAqLwotICAgIGxlbmd0aCA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBpZiAoIHRhYmxlICsgbGVuZ3RoID4gdmFsaWQtPmxpbWl0IHx8IGxlbmd0aCA8IDYgKyA1MTIgKQotICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICBrZXlzID0gdGFibGUgKyA2OwotCi0gICAgLyogcGFyc2Uga2V5cyB0byBjb21wdXRlIHN1Yi1oZWFkZXJzIGNvdW50ICovCi0gICAgcCAgICAgICAgPSBrZXlzOwotICAgIG1heF9zdWJzID0gMDsKLSAgICBmb3IgKCBuID0gMDsgbiA8IDI1NjsgbisrICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBpZHggPSBUVF9ORVhUX1VTSE9SVCggcCApOwotCi0KLSAgICAgIC8qIHZhbHVlIG11c3QgYmUgbXVsdGlwbGUgb2YgOCAqLwotICAgICAgaWYgKCB2YWxpZC0+bGV2ZWwgPj0gRlRfVkFMSURBVEVfUEFSQU5PSUQgJiYgKCBpZHggJiA3ICkgIT0gMCApCi0gICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgaWR4ID4+PSAzOwotCi0gICAgICBpZiAoIGlkeCA+IG1heF9zdWJzICkKLSAgICAgICAgbWF4X3N1YnMgPSBpZHg7Ci0gICAgfQotCi0gICAgRlRfQVNTRVJUKCBwID09IHRhYmxlICsgNTE4ICk7Ci0KLSAgICBzdWJzICAgICAgPSBwOwotICAgIGdseXBoX2lkcyA9IHN1YnMgKyAoIG1heF9zdWJzICsgMSApICogODsKLSAgICBpZiAoIGdseXBoX2lkcyA+IHZhbGlkLT5saW1pdCApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIC8qIHBhcnNlIHN1Yi1oZWFkZXJzICovCi0gICAgZm9yICggbiA9IDA7IG4gPD0gbWF4X3N1YnM7IG4rKyApCi0gICAgewotICAgICAgRlRfVUludCAgZmlyc3RfY29kZSwgY29kZV9jb3VudCwgb2Zmc2V0OwotICAgICAgRlRfSW50ICAgZGVsdGE7Ci0KLQotICAgICAgZmlyc3RfY29kZSA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBjb2RlX2NvdW50ID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIGRlbHRhICAgICAgPSBUVF9ORVhUX1NIT1JUKCBwICk7Ci0gICAgICBvZmZzZXQgICAgID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgICAgLyogbWFueSBEeW5hbGFiIGZvbnRzIGhhdmUgZW1wdHkgc3ViLWhlYWRlcnMgKi8KLSAgICAgIGlmICggY29kZV9jb3VudCA9PSAwICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIC8qIGNoZWNrIHJhbmdlIHdpdGhpbiAwLi4yNTUgKi8KLSAgICAgIGlmICggdmFsaWQtPmxldmVsID49IEZUX1ZBTElEQVRFX1BBUkFOT0lEICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBmaXJzdF9jb2RlID49IDI1NiB8fCBmaXJzdF9jb2RlICsgY29kZV9jb3VudCA+IDI1NiApCi0gICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotICAgICAgfQotCi0gICAgICAvKiBjaGVjayBvZmZzZXQgKi8KLSAgICAgIGlmICggb2Zmc2V0ICE9IDAgKQotICAgICAgewotICAgICAgICBGVF9CeXRlKiAgaWRzOwotCi0KLSAgICAgICAgaWRzID0gcCAtIDIgKyBvZmZzZXQ7Ci0gICAgICAgIGlmICggaWRzIDwgZ2x5cGhfaWRzIHx8IGlkcyArIGNvZGVfY291bnQgKiAyID4gdGFibGUgKyBsZW5ndGggKQotICAgICAgICAgIEZUX0lOVkFMSURfT0ZGU0VUOwotCi0gICAgICAgIC8qIGNoZWNrIGdseXBoIElEcyAqLwotICAgICAgICBpZiAoIHZhbGlkLT5sZXZlbCA+PSBGVF9WQUxJREFURV9USUdIVCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9CeXRlKiAgbGltaXQgPSBwICsgY29kZV9jb3VudCAqIDI7Ci0gICAgICAgICAgRlRfVUludCAgIGlkeDsKLQotCi0gICAgICAgICAgZm9yICggOyBwIDwgbGltaXQ7ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpZHggPSBUVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgICAgICAgaWYgKCBpZHggIT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlkeCA9IChGVF9VSW50KSggKEZUX0ludClpZHggKyBkZWx0YSApICYgMHhGRkZGVTsKLSAgICAgICAgICAgICAgaWYgKCBpZHggPj0gVFRfVkFMSURfR0xZUEhfQ09VTlQoIHZhbGlkICkgKQotICAgICAgICAgICAgICAgIEZUX0lOVkFMSURfR0xZUEhfSUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyogcmV0dXJuIHN1YiBoZWFkZXIgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIGNoYXJhY3RlciBjb2RlICovCi0gIC8qIE5VTEwgb24gaW52YWxpZCBjaGFyY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfQnl0ZSoKLSAgdHRfY21hcDJfZ2V0X3N1YmhlYWRlciggRlRfQnl0ZSogICB0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfQnl0ZSogIHJlc3VsdCA9IE5VTEw7Ci0KLQotICAgIGlmICggY2hhcl9jb2RlIDwgMHgxMDAwMFVMICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICAgY2hhcl9sbyA9IChGVF9VSW50KSggY2hhcl9jb2RlICYgMHhGRiApOwotICAgICAgRlRfVUludCAgIGNoYXJfaGkgPSAoRlRfVUludCkoIGNoYXJfY29kZSA+PiA4ICk7Ci0gICAgICBGVF9CeXRlKiAgcCAgICAgICA9IHRhYmxlICsgNjsgICAgLyoga2V5cyB0YWJsZSAqLwotICAgICAgRlRfQnl0ZSogIHN1YnMgICAgPSB0YWJsZSArIDUxODsgIC8qIHN1YmhlYWRlcnMgdGFibGUgKi8KLSAgICAgIEZUX0J5dGUqICBzdWI7Ci0KLQotICAgICAgaWYgKCBjaGFyX2hpID09IDAgKQotICAgICAgewotICAgICAgICAvKiBhbiA4LWJpdCBjaGFyYWN0ZXIgY29kZSAtLSB3ZSB1c2Ugc3ViSGVhZGVyIDAgaW4gdGhpcyBjYXNlICovCi0gICAgICAgIC8qIHRvIHRlc3Qgd2hldGhlciB0aGUgY2hhcmFjdGVyIGNvZGUgaXMgaW4gdGhlIGNoYXJtYXAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBzdWIgPSBzdWJzOyAgLyoganVtcCB0byBmaXJzdCBzdWItaGVhZGVyICovCi0KLSAgICAgICAgLyogY2hlY2sgdGhhdCB0aGUgc3ViLWhlYWRlciBmb3IgdGhpcyBieXRlIGlzIDAsIHdoaWNoICovCi0gICAgICAgIC8qIGluZGljYXRlcyB0aGF0IGl0IGlzIHJlYWxseSBhIHZhbGlkIG9uZS1ieXRlIHZhbHVlICAqLwotICAgICAgICAvKiBPdGhlcndpc2UsIHJldHVybiAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIHAgKz0gY2hhcl9sbyAqIDI7Ci0gICAgICAgIGlmICggVFRfUEVFS19VU0hPUlQoIHAgKSAhPSAwICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGEgMTYtYml0IGNoYXJhY3RlciBjb2RlICovCi0KLSAgICAgICAgLyoganVtcCB0byBrZXkgZW50cnkgICovCi0gICAgICAgIHAgICs9IGNoYXJfaGkgKiAyOwotICAgICAgICAvKiBqdW1wIHRvIHN1Yi1oZWFkZXIgKi8KLSAgICAgICAgc3ViID0gc3VicyArICggRlRfUEFEX0ZMT09SKCBUVF9QRUVLX1VTSE9SVCggcCApLCA4ICkgKTsKLQotICAgICAgICAvKiBjaGVjayB0aGF0IHRoZSBoaWdoIGJ5dGUgaXNuJ3QgYSB2YWxpZCBvbmUtYnl0ZSB2YWx1ZSAqLwotICAgICAgICBpZiAoIHN1YiA9PSBzdWJzICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgICByZXN1bHQgPSBzdWI7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgdHRfY21hcDJfY2hhcl9pbmRleCggVFRfQ01hcCAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9CeXRlKiAgdGFibGUgICA9IGNtYXAtPmRhdGE7Ci0gICAgRlRfVUludCAgIHJlc3VsdCAgPSAwOwotICAgIEZUX0J5dGUqICBzdWJoZWFkZXI7Ci0KLQotICAgIHN1YmhlYWRlciA9IHR0X2NtYXAyX2dldF9zdWJoZWFkZXIoIHRhYmxlLCBjaGFyX2NvZGUgKTsKLSAgICBpZiAoIHN1YmhlYWRlciApCi0gICAgewotICAgICAgRlRfQnl0ZSogIHAgICA9IHN1YmhlYWRlcjsKLSAgICAgIEZUX1VJbnQgICBpZHggPSAoRlRfVUludCkoY2hhcl9jb2RlICYgMHhGRik7Ci0gICAgICBGVF9VSW50ICAgc3RhcnQsIGNvdW50OwotICAgICAgRlRfSW50ICAgIGRlbHRhOwotICAgICAgRlRfVUludCAgIG9mZnNldDsKLQotCi0gICAgICBzdGFydCAgPSBUVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgY291bnQgID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIGRlbHRhICA9IFRUX05FWFRfU0hPUlQgKCBwICk7Ci0gICAgICBvZmZzZXQgPSBUVF9QRUVLX1VTSE9SVCggcCApOwotCi0gICAgICBpZHggLT0gc3RhcnQ7Ci0gICAgICBpZiAoIGlkeCA8IGNvdW50ICYmIG9mZnNldCAhPSAwICkKLSAgICAgIHsKLSAgICAgICAgcCAgKz0gb2Zmc2V0ICsgMiAqIGlkeDsKLSAgICAgICAgaWR4ID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKLQotICAgICAgICBpZiAoIGlkeCAhPSAwICkKLSAgICAgICAgICByZXN1bHQgPSAoRlRfVUludCkoIChGVF9JbnQpaWR4ICsgZGVsdGEgKSAmIDB4RkZGRlU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50MzIgKQotICB0dF9jbWFwMl9jaGFyX25leHQoIFRUX0NNYXAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAqcGNoYXJjb2RlICkKLSAgewotICAgIEZUX0J5dGUqICAgdGFibGUgICAgPSBjbWFwLT5kYXRhOwotICAgIEZUX1VJbnQgICAgZ2luZGV4ICAgPSAwOwotICAgIEZUX1VJbnQzMiAgcmVzdWx0ICAgPSAwOwotICAgIEZUX1VJbnQzMiAgY2hhcmNvZGUgPSAqcGNoYXJjb2RlICsgMTsKLSAgICBGVF9CeXRlKiAgIHN1YmhlYWRlcjsKLQotCi0gICAgd2hpbGUgKCBjaGFyY29kZSA8IDB4MTAwMDBVTCApCi0gICAgewotICAgICAgc3ViaGVhZGVyID0gdHRfY21hcDJfZ2V0X3N1YmhlYWRlciggdGFibGUsIGNoYXJjb2RlICk7Ci0gICAgICBpZiAoIHN1YmhlYWRlciApCi0gICAgICB7Ci0gICAgICAgIEZUX0J5dGUqICBwICAgICAgID0gc3ViaGVhZGVyOwotICAgICAgICBGVF9VSW50ICAgc3RhcnQgICA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgIEZUX1VJbnQgICBjb3VudCAgID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgRlRfSW50ICAgIGRlbHRhICAgPSBUVF9ORVhUX1NIT1JUICggcCApOwotICAgICAgICBGVF9VSW50ICAgb2Zmc2V0ICA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0gICAgICAgIEZUX1VJbnQgICBjaGFyX2xvID0gKEZUX1VJbnQpKCBjaGFyY29kZSAmIDB4RkYgKTsKLSAgICAgICAgRlRfVUludCAgIHBvcywgaWR4OwotCi0KLSAgICAgICAgaWYgKCBvZmZzZXQgPT0gMCApCi0gICAgICAgICAgZ290byBOZXh0X1N1YkhlYWRlcjsKLQotICAgICAgICBpZiAoIGNoYXJfbG8gPCBzdGFydCApCi0gICAgICAgIHsKLSAgICAgICAgICBjaGFyX2xvID0gc3RhcnQ7Ci0gICAgICAgICAgcG9zICAgICA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIHBvcyA9IChGVF9VSW50KSggY2hhcl9sbyAtIHN0YXJ0ICk7Ci0KLSAgICAgICAgcCAgICAgICArPSBvZmZzZXQgKyBwb3MgKiAyOwotICAgICAgICBjaGFyY29kZSA9IEZUX1BBRF9GTE9PUiggY2hhcmNvZGUsIDI1NiApICsgY2hhcl9sbzsKLQotICAgICAgICBmb3IgKCA7IHBvcyA8IGNvdW50OyBwb3MrKywgY2hhcmNvZGUrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBpZHggPSBUVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgICAgICAgaWYgKCBpZHggIT0gMCApCi0gICAgICAgICAgewotICAgICAgICAgICAgZ2luZGV4ID0gKEZUX1VJbnQpKCAoRlRfSW50KWlkeCArIGRlbHRhICkgJiAweEZGRkZVOwotICAgICAgICAgICAgaWYgKCBnaW5kZXggIT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IGNoYXJjb2RlOwotICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIGp1bXAgdG8gbmV4dCBzdWItaGVhZGVyLCBpLmUuIGhpZ2hlciBieXRlIHZhbHVlICovCi0gICAgTmV4dF9TdWJIZWFkZXI6Ci0gICAgICBjaGFyY29kZSA9IEZUX1BBRF9GTE9PUiggY2hhcmNvZGUsIDI1NiApICsgMjU2OwotICAgIH0KLQotICBFeGl0OgotICAgICpwY2hhcmNvZGUgPSByZXN1bHQ7Ci0KLSAgICByZXR1cm4gZ2luZGV4OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdHRfY21hcDJfZ2V0X2luZm8oIFRUX0NNYXAgICAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgIFRUX0NNYXBJbmZvICAqY21hcF9pbmZvICkKLSAgewotICAgIEZUX0J5dGUqICBwID0gY21hcC0+ZGF0YSArIDQ7Ci0KLQotICAgIGNtYXBfaW5mby0+Zm9ybWF0ICAgPSAyOwotICAgIGNtYXBfaW5mby0+bGFuZ3VhZ2UgPSAoRlRfVUxvbmcpVFRfUEVFS19VU0hPUlQoIHAgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0RFRklORV9UVF9DTUFQKAotICAgIHR0X2NtYXAyX2NsYXNzX3JlYywKLSAgICBzaXplb2YgKCBUVF9DTWFwUmVjICksCi0KLSAgICAoRlRfQ01hcF9Jbml0RnVuYykgICAgIHR0X2NtYXBfaW5pdCwKLSAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIE5VTEwsCi0gICAgKEZUX0NNYXBfQ2hhckluZGV4RnVuYyl0dF9jbWFwMl9jaGFyX2luZGV4LAotICAgIChGVF9DTWFwX0NoYXJOZXh0RnVuYykgdHRfY21hcDJfY2hhcl9uZXh0LAotCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotCi0gICAgMiwKLSAgICAoVFRfQ01hcF9WYWxpZGF0ZUZ1bmMpdHRfY21hcDJfdmFsaWRhdGUsCi0gICAgKFRUX0NNYXBfSW5mb19HZXRGdW5jKXR0X2NtYXAyX2dldF9pbmZvICkKLQotI2VuZGlmIC8qIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8yICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVQgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRBQkxFIE9WRVJWSUVXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTkFNRSAgICAgICAgICBPRkZTRVQgICAgICAgICBUWVBFICAgICAgICAgICAgICBERVNDUklQVElPTiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmb3JtYXQgICAgICAgIDAgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgIG11c3QgYmUgNCAgICAgICAgICAgICovCi0gIC8qICAgbGVuZ3RoICAgICAgICAyICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICB0YWJsZSBsZW5ndGggICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYnl0ZXMgICAgICAgICAgICAgKi8KLSAgLyogICBsYW5ndWFnZSAgICAgIDQgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgIE1hYyBsYW5ndWFnZSBjb2RlICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHNlZ0NvdW50WDIgICAgNiAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgMipOVU1fU0VHUyAgICAgICAgICAgKi8KLSAgLyogICBzZWFyY2hSYW5nZSAgIDggICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgIDIqKDEgPDwgTE9HX1NFR1MpICAgICovCi0gIC8qICAgZW50cnlTZWxlY3RvciAxMCAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgICBMT0dfU0VHUyAgICAgICAgICAgICAqLwotICAvKiAgIHJhbmdlU2hpZnQgICAgMTIgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICAgc2VnQ291bnRYMiAtICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoUmFuZ2UgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGVuZENvdW50ICAgICAgMTQgICAgICAgICAgICAgVVNIT1JUW05VTV9TRUdTXSAgZW5kIGNoYXJjb2RlIGZvciAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggc2VnbWVudDsgbGFzdCAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyAweEZGRkYgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBwYWQgICAgICAgICAgIDE0K05VTV9TRUdTKjIgIFVTSE9SVCAgICAgICAgICAgIHBhZGRpbmcgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHN0YXJ0Q291bnQgICAgMTYrTlVNX1NFR1MqMiAgVVNIT1JUW05VTV9TRUdTXSAgZmlyc3QgY2hhcmNvZGUgZm9yICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2ggc2VnbWVudCAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGlkRGVsdGEgICAgICAgMTYrTlVNX1NFR1MqNCAgU0hPUlRbTlVNX1NFR1NdICAgZGVsdGEgZm9yIGVhY2ggICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQgICAgICAgICAgICAgICovCi0gIC8qICAgaWRPZmZzZXQgICAgICAxNitOVU1fU0VHUyo2ICBTSE9SVFtOVU1fU0VHU10gICByYW5nZSBvZmZzZXQgZm9yICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCBzZWdtZW50OyBjYW4gYmUgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm8gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGdseXBoSWRzICAgICAgMTYrTlVNX1NFR1MqOCAgVVNIT1JUW10gICAgICAgICAgYXJyYXkgb2YgZ2x5cGggSUQgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlcyAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBDaGFyYWN0ZXIgY29kZXMgYXJlIG1vZGVsbGVkIGJ5IGEgc2VyaWVzIG9mIG9yZGVyZWQgKGluY3JlYXNpbmcpICAgICAgKi8KLSAgLyogaW50ZXJ2YWxzIGNhbGxlZCBzZWdtZW50cy4gIEVhY2ggc2VnbWVudCBoYXMgc3RhcnQgYW5kIGVuZCBjb2RlcywgICAgICovCi0gIC8qIHByb3ZpZGVkIGJ5IHRoZSBgc3RhcnRDb3VudCcgYW5kIGBlbmRDb3VudCcgYXJyYXlzLiAgU2VnbWVudHMgbXVzdCAgICAqLwotICAvKiBub3Qgb3ZlcmxhcCwgYW5kIHRoZSBsYXN0IHNlZ21lbnQgc2hvdWxkIGFsd2F5cyBjb250YWluIHRoZSB2YWx1ZSAgICAgKi8KLSAgLyogMHhGRkZGIGZvciBgZW5kQ291bnQnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgZmllbGRzIGBzZWFyY2hSYW5nZScsIGBlbnRyeVNlbGVjdG9yJyBhbmQgYHJhbmdlU2hpZnQnIGFyZSBiZXR0ZXIgKi8KLSAgLyogaWdub3JlZCAodGhleSBhcmUgdHJhY2VzIG9mIG92ZXItZW5naW5lZXJpbmcgaW4gdGhlIFRydWVUeXBlICAgICAgICAgICovCi0gIC8qIHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRWFjaCBzZWdtZW50IGFsc28gaGFzIGEgc2lnbmVkIGBkZWx0YScsIGFzIHdlbGwgYXMgYW4gb3B0aW9uYWwgb2Zmc2V0ICovCi0gIC8qIHdpdGhpbiB0aGUgYGdseXBoSWRzJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSWYgYSBzZWdtZW50J3MgaWRPZmZzZXQgaXMgMCwgdGhlIGdseXBoIGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gYW55ICAgICovCi0gIC8qIGNoYXJjb2RlIHdpdGhpbiB0aGUgc2VnbWVudCBpcyBvYnRhaW5lZCBieSBhZGRpbmcgdGhlIHZhbHVlIG9mICAgICAgICAqLwotICAvKiBgaWREZWx0YScgZGlyZWN0bHkgdG8gdGhlIGNoYXJjb2RlLCBtb2R1bG8gNjU1MzYuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE90aGVyd2lzZSwgYSBnbHlwaCBpbmRleCBpcyB0YWtlbiBmcm9tIHRoZSBnbHlwaCBJRHMgc3ViLWFycmF5IGZvciAgICAqLwotICAvKiB0aGUgc2VnbWVudCwgYW5kIHRoZSB2YWx1ZSBvZiBgaWREZWx0YScgaXMgYWRkZWQgdG8gaXQuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGaW5hbGx5LCBub3RlIHRoYXQgYSBsb3Qgb2YgZm9udHMgY29udGFpbiBhbiBpbnZhbGlkIGxhc3Qgc2VnbWVudCwgICAgKi8KLSAgLyogd2hlcmUgYHN0YXJ0JyBhbmQgYGVuZCcgYXJlIGNvcnJlY3RseSBzZXQgdG8gMHhGRkZGIGJ1dCBib3RoIGBkZWx0YScgICovCi0gIC8qIGFuZCBgb2Zmc2V0JyBhcmUgaW5jb3JyZWN0IChlLmcuLCBgb3BlbnNfX18udHRmJyB3aGljaCBjb21lcyB3aXRoICAgICAqLwotICAvKiBPcGVuT2ZmaWNlLm9yZykuICBXZSBuZWVkIHNwZWNpYWwgY29kZSB0byBkZWFsIHdpdGggdGhlbSBjb3JyZWN0bHkuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfNAotCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9DTWFwNFJlY18KLSAgewotICAgIFRUX0NNYXBSZWMgIGNtYXA7Ci0gICAgRlRfVUludDMyICAgY3VyX2NoYXJjb2RlOyAgIC8qIGN1cnJlbnQgY2hhcmNvZGUgKi8KLSAgICBGVF9VSW50ICAgICBjdXJfZ2luZGV4OyAgICAgLyogY3VycmVudCBnbHlwaCBpbmRleCAqLwotCi0gICAgRlRfVUludCAgICAgbnVtX3JhbmdlczsKLSAgICBGVF9VSW50ICAgICBjdXJfcmFuZ2U7Ci0gICAgRlRfVUludCAgICAgY3VyX3N0YXJ0OwotICAgIEZUX1VJbnQgICAgIGN1cl9lbmQ7Ci0gICAgRlRfSW50ICAgICAgY3VyX2RlbHRhOwotICAgIEZUX0J5dGUqICAgIGN1cl92YWx1ZXM7Ci0KLSAgfSBUVF9DTWFwNFJlYywgKlRUX0NNYXA0OwotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXA0X2luaXQoIFRUX0NNYXA0ICBjbWFwLAotICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgdGFibGUgKQotICB7Ci0gICAgRlRfQnl0ZSogIHA7Ci0KLQotICAgIGNtYXAtPmNtYXAuZGF0YSAgICA9IHRhYmxlOwotCi0gICAgcCAgICAgICAgICAgICAgICAgID0gdGFibGUgKyA2OwotICAgIGNtYXAtPm51bV9yYW5nZXMgICA9IEZUX1BFRUtfVVNIT1JUKCBwICkgPj4gMTsKLSAgICBjbWFwLT5jdXJfY2hhcmNvZGUgPSAoRlRfVUludDMyKTB4RkZGRkZGRkZVTDsKLSAgICBjbWFwLT5jdXJfZ2luZGV4ICAgPSAwOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0ludAotICB0dF9jbWFwNF9zZXRfcmFuZ2UoIFRUX0NNYXA0ICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICByYW5nZV9pbmRleCApCi0gIHsKLSAgICBGVF9CeXRlKiAgdGFibGUgPSBjbWFwLT5jbWFwLmRhdGE7Ci0gICAgRlRfQnl0ZSogIHA7Ci0gICAgRlRfVUludCAgIG51bV9yYW5nZXMgPSBjbWFwLT5udW1fcmFuZ2VzOwotCi0KLSAgICB3aGlsZSAoIHJhbmdlX2luZGV4IDwgbnVtX3JhbmdlcyApCi0gICAgewotICAgICAgRlRfVUludCAgb2Zmc2V0OwotCi0KLSAgICAgIHAgICAgICAgICAgICAgPSB0YWJsZSArIDE0ICsgcmFuZ2VfaW5kZXggKiAyOwotICAgICAgY21hcC0+Y3VyX2VuZCA9IEZUX1BFRUtfVVNIT1JUKCBwICk7Ci0KLSAgICAgIHAgICAgICAgICAgICAgICs9IDIgKyBudW1fcmFuZ2VzICogMjsKLSAgICAgIGNtYXAtPmN1cl9zdGFydCA9IEZUX1BFRUtfVVNIT1JUKCBwICk7Ci0KLSAgICAgIHAgICAgICAgICAgICAgICs9IG51bV9yYW5nZXMgKiAyOwotICAgICAgY21hcC0+Y3VyX2RlbHRhID0gRlRfUEVFS19TSE9SVCggcCApOwotCi0gICAgICBwICAgICArPSBudW1fcmFuZ2VzICogMjsKLSAgICAgIG9mZnNldCA9IEZUX1BFRUtfVVNIT1JUKCBwICk7Ci0KLSAgICAgIC8qIHNvbWUgZm9udHMgaGF2ZSBhbiBpbmNvcnJlY3QgbGFzdCBzZWdtZW50OyAqLwotICAgICAgLyogd2UgaGF2ZSB0byBjYXRjaCBpdCAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIHJhbmdlX2luZGV4ICAgICA+PSBudW1fcmFuZ2VzIC0gMSAmJgotICAgICAgICAgICBjbWFwLT5jdXJfc3RhcnQgPT0gMHhGRkZGVSAgICAgICAgJiYKLSAgICAgICAgICAgY21hcC0+Y3VyX2VuZCAgID09IDB4RkZGRlUgICAgICAgICkKLSAgICAgIHsKLSAgICAgICAgVFRfRmFjZSAgIGZhY2UgID0gKFRUX0ZhY2UpY21hcC0+Y21hcC5jbWFwLmNoYXJtYXAuZmFjZTsKLSAgICAgICAgRlRfQnl0ZSogIGxpbWl0ID0gZmFjZS0+Y21hcF90YWJsZSArIGZhY2UtPmNtYXBfc2l6ZTsKLQotCi0gICAgICAgIGlmICggb2Zmc2V0ICYmIHAgKyBvZmZzZXQgKyAyID4gbGltaXQgKQotICAgICAgICB7Ci0gICAgICAgICAgY21hcC0+Y3VyX2RlbHRhID0gMTsKLSAgICAgICAgICBvZmZzZXQgICAgICAgICAgPSAwOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggb2Zmc2V0ICE9IDB4RkZGRlUgKQotICAgICAgewotICAgICAgICBjbWFwLT5jdXJfdmFsdWVzID0gb2Zmc2V0ID8gcCArIG9mZnNldCA6IE5VTEw7Ci0gICAgICAgIGNtYXAtPmN1cl9yYW5nZSAgPSByYW5nZV9pbmRleDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHdlIHNraXAgZW1wdHkgc2VnbWVudHMgKi8KLSAgICAgIHJhbmdlX2luZGV4Kys7Ci0gICAgfQotCi0gICAgcmV0dXJuIC0xOwotICB9Ci0KLQotICAvKiBzZWFyY2ggdGhlIGluZGV4IG9mIHRoZSBjaGFyY29kZSBuZXh0IHRvIGNtYXAtPmN1cl9jaGFyY29kZTsgKi8KLSAgLyogY2FsbGVyIHNob3VsZCBjYWxsIHR0X2NtYXA0X3NldF9yYW5nZSB3aXRoIHByb3BlciByYW5nZSAgICAgICovCi0gIC8qIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgdHRfY21hcDRfbmV4dCggVFRfQ01hcDQgIGNtYXAgKQotICB7Ci0gICAgRlRfVUludCAgY2hhcmNvZGU7Ci0KLQotICAgIGlmICggY21hcC0+Y3VyX2NoYXJjb2RlID49IDB4RkZGRlVMICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIGNoYXJjb2RlID0gKEZUX1VJbnQpY21hcC0+Y3VyX2NoYXJjb2RlICsgMTsKLQotICAgIGlmICggY2hhcmNvZGUgPCBjbWFwLT5jdXJfc3RhcnQgKQotICAgICAgY2hhcmNvZGUgPSBjbWFwLT5jdXJfc3RhcnQ7Ci0KLSAgICBmb3IgKCA7OyApCi0gICAgewotICAgICAgRlRfQnl0ZSogIHZhbHVlcyA9IGNtYXAtPmN1cl92YWx1ZXM7Ci0gICAgICBGVF9VSW50ICAgZW5kICAgID0gY21hcC0+Y3VyX2VuZDsKLSAgICAgIEZUX0ludCAgICBkZWx0YSAgPSBjbWFwLT5jdXJfZGVsdGE7Ci0KLQotICAgICAgaWYgKCBjaGFyY29kZSA8PSBlbmQgKQotICAgICAgewotICAgICAgICBpZiAoIHZhbHVlcyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9CeXRlKiAgcCA9IHZhbHVlcyArIDIgKiAoIGNoYXJjb2RlIC0gY21hcC0+Y3VyX3N0YXJ0ICk7Ci0KLQotICAgICAgICAgIGRvCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVUludCAgZ2luZGV4ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotCi0gICAgICAgICAgICBpZiAoIGdpbmRleCAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgZ2luZGV4ID0gKEZUX1VJbnQpKCAoRlRfSW50KWdpbmRleCArIGRlbHRhICkgJiAweEZGRkZVOwotICAgICAgICAgICAgICBpZiAoIGdpbmRleCAhPSAwICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNtYXAtPmN1cl9jaGFyY29kZSA9IGNoYXJjb2RlOwotICAgICAgICAgICAgICAgIGNtYXAtPmN1cl9naW5kZXggICA9IGdpbmRleDsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IHdoaWxlICggKytjaGFyY29kZSA8PSBlbmQgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBkbwotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1VJbnQgIGdpbmRleCA9IChGVF9VSW50KSggKEZUX0ludCljaGFyY29kZSArIGRlbHRhICkgJiAweEZGRkZVOwotCi0KLSAgICAgICAgICAgIGlmICggZ2luZGV4ICE9IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBjbWFwLT5jdXJfY2hhcmNvZGUgPSBjaGFyY29kZTsKLSAgICAgICAgICAgICAgY21hcC0+Y3VyX2dpbmRleCAgID0gZ2luZGV4OwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSB3aGlsZSAoICsrY2hhcmNvZGUgPD0gZW5kICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogd2UgbmVlZCB0byBmaW5kIGFub3RoZXIgcmFuZ2UgKi8KLSAgICAgIGlmICggdHRfY21hcDRfc2V0X3JhbmdlKCBjbWFwLCBjbWFwLT5jdXJfcmFuZ2UgKyAxICkgPCAwICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGlmICggY2hhcmNvZGUgPCBjbWFwLT5jdXJfc3RhcnQgKQotICAgICAgICBjaGFyY29kZSA9IGNtYXAtPmN1cl9zdGFydDsKLSAgICB9Ci0KLSAgRmFpbDoKLSAgICBjbWFwLT5jdXJfY2hhcmNvZGUgPSAoRlRfVUludDMyKTB4RkZGRkZGRkZVTDsKLSAgICBjbWFwLT5jdXJfZ2luZGV4ICAgPSAwOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdHRfY21hcDRfdmFsaWRhdGUoIEZUX0J5dGUqICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIHZhbGlkICkKLSAgewotICAgIEZUX0J5dGUqICBwOwotICAgIEZUX1VJbnQgICBsZW5ndGg7Ci0KLSAgICBGVF9CeXRlICAgKmVuZHMsICpzdGFydHMsICpvZmZzZXRzLCAqZGVsdGFzLCAqZ2x5cGhfaWRzOwotICAgIEZUX1VJbnQgICBudW1fc2VnczsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIGlmICggdGFibGUgKyAyICsgMiA+IHZhbGlkLT5saW1pdCApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIHAgICAgICA9IHRhYmxlICsgMjsgICAgICAgICAgIC8qIHNraXAgZm9ybWF0ICovCi0gICAgbGVuZ3RoID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIC8qIGluIGNlcnRhaW4gZm9udHMsIHRoZSBgbGVuZ3RoJyBmaWVsZCBpcyBpbnZhbGlkIGFuZCBnb2VzICovCi0gICAgLyogb3V0IG9mIGJvdW5kLiAgV2UgdHJ5IHRvIGNvcnJlY3QgdGhpcyBoZXJlLi4uICAgICAgICAgICAgKi8KLSAgICBpZiAoIHRhYmxlICsgbGVuZ3RoID4gdmFsaWQtPmxpbWl0ICkKLSAgICB7Ci0gICAgICBpZiAoIHZhbGlkLT5sZXZlbCA+PSBGVF9WQUxJREFURV9USUdIVCApCi0gICAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOwotCi0gICAgICBsZW5ndGggPSAoRlRfVUludCkoIHZhbGlkLT5saW1pdCAtIHRhYmxlICk7Ci0gICAgfQotCi0gICAgaWYgKCBsZW5ndGggPCAxNiApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIHAgICAgICAgID0gdGFibGUgKyA2OwotICAgIG51bV9zZWdzID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsgICAvKiByZWFkIHNlZ0NvdW50WDIgKi8KLQotICAgIGlmICggdmFsaWQtPmxldmVsID49IEZUX1ZBTElEQVRFX1BBUkFOT0lEICkKLSAgICB7Ci0gICAgICAvKiBjaGVjayB0aGF0IHdlIGhhdmUgYW4gZXZlbiB2YWx1ZSBoZXJlICovCi0gICAgICBpZiAoIG51bV9zZWdzICYgMSApCi0gICAgICAgIEZUX0lOVkFMSURfREFUQTsKLSAgICB9Ci0KLSAgICBudW1fc2VncyAvPSAyOwotCi0gICAgaWYgKCBsZW5ndGggPCAxNiArIG51bV9zZWdzICogMiAqIDQgKQotICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICAvKiBjaGVjayB0aGUgc2VhcmNoIHBhcmFtZXRlcnMgLSBldmVuIHRob3VnaCB3ZSBuZXZlciB1c2UgdGhlbSAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCB2YWxpZC0+bGV2ZWwgPj0gRlRfVkFMSURBVEVfUEFSQU5PSUQgKQotICAgIHsKLSAgICAgIC8qIGNoZWNrIHRoZSB2YWx1ZXMgb2YgYHNlYXJjaFJhbmdlJywgYGVudHJ5U2VsZWN0b3InLCBgcmFuZ2VTaGlmdCcgKi8KLSAgICAgIEZUX1VJbnQgIHNlYXJjaF9yYW5nZSAgID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIEZUX1VJbnQgIGVudHJ5X3NlbGVjdG9yID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIEZUX1VJbnQgIHJhbmdlX3NoaWZ0ICAgID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLQotCi0gICAgICBpZiAoICggc2VhcmNoX3JhbmdlIHwgcmFuZ2Vfc2hpZnQgKSAmIDEgKSAgLyogbXVzdCBiZSBldmVuIHZhbHVlcyAqLwotICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICAgIHNlYXJjaF9yYW5nZSAvPSAyOwotICAgICAgcmFuZ2Vfc2hpZnQgIC89IDI7Ci0KLSAgICAgIC8qIGBzZWFyY2ggcmFuZ2UnIGlzIHRoZSBncmVhdGVzdCBwb3dlciBvZiAyIHRoYXQgaXMgPD0gbnVtX3NlZ3MgKi8KLQotICAgICAgaWYgKCBzZWFyY2hfcmFuZ2UgICAgICAgICAgICAgICAgPiBudW1fc2VncyAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgc2VhcmNoX3JhbmdlICogMiAgICAgICAgICAgIDwgbnVtX3NlZ3MgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIHNlYXJjaF9yYW5nZSArIHJhbmdlX3NoaWZ0ICE9IG51bV9zZWdzICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICBzZWFyY2hfcmFuZ2UgICAgICAgICAgICAgICAhPSAoIDFVIDw8IGVudHJ5X3NlbGVjdG9yICkgKQotICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0gICAgfQotCi0gICAgZW5kcyAgICAgID0gdGFibGUgICArIDE0OwotICAgIHN0YXJ0cyAgICA9IHRhYmxlICAgKyAxNiArIG51bV9zZWdzICogMjsKLSAgICBkZWx0YXMgICAgPSBzdGFydHMgICsgbnVtX3NlZ3MgKiAyOwotICAgIG9mZnNldHMgICA9IGRlbHRhcyAgKyBudW1fc2VncyAqIDI7Ci0gICAgZ2x5cGhfaWRzID0gb2Zmc2V0cyArIG51bV9zZWdzICogMjsKLQotICAgIC8qIGNoZWNrIGxhc3Qgc2VnbWVudDsgaXRzIGVuZCBjb3VudCB2YWx1ZSBtdXN0IGJlIDB4RkZGRiAqLwotICAgIGlmICggdmFsaWQtPmxldmVsID49IEZUX1ZBTElEQVRFX1BBUkFOT0lEICkKLSAgICB7Ci0gICAgICBwID0gZW5kcyArICggbnVtX3NlZ3MgLSAxICkgKiAyOwotICAgICAgaWYgKCBUVF9QRUVLX1VTSE9SVCggcCApICE9IDB4RkZGRlUgKQotICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0gICAgfQotCi0gICAgewotICAgICAgRlRfVUludCAgIHN0YXJ0LCBlbmQsIG9mZnNldCwgbjsKLSAgICAgIEZUX1VJbnQgICBsYXN0X3N0YXJ0ID0gMCwgbGFzdF9lbmQgPSAwOwotICAgICAgRlRfSW50ICAgIGRlbHRhOwotICAgICAgRlRfQnl0ZSogIHBfc3RhcnQgICA9IHN0YXJ0czsKLSAgICAgIEZUX0J5dGUqICBwX2VuZCAgICAgPSBlbmRzOwotICAgICAgRlRfQnl0ZSogIHBfZGVsdGEgICA9IGRlbHRhczsKLSAgICAgIEZUX0J5dGUqICBwX29mZnNldCAgPSBvZmZzZXRzOwotCi0KLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX3NlZ3M7IG4rKyApCi0gICAgICB7Ci0gICAgICAgIHAgICAgICA9IHBfb2Zmc2V0OwotICAgICAgICBzdGFydCAgPSBUVF9ORVhUX1VTSE9SVCggcF9zdGFydCApOwotICAgICAgICBlbmQgICAgPSBUVF9ORVhUX1VTSE9SVCggcF9lbmQgKTsKLSAgICAgICAgZGVsdGEgID0gVFRfTkVYVF9TSE9SVCggcF9kZWx0YSApOwotICAgICAgICBvZmZzZXQgPSBUVF9ORVhUX1VTSE9SVCggcF9vZmZzZXQgKTsKLQotICAgICAgICBpZiAoIHN0YXJ0ID4gZW5kICkKLSAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICAgICAgLyogdGhpcyB0ZXN0IHNob3VsZCBiZSBwZXJmb3JtZWQgYXQgZGVmYXVsdCB2YWxpZGF0aW9uIGxldmVsOyAqLwotICAgICAgICAvKiB1bmZvcnR1bmF0ZWx5LCBzb21lIHBvcHVsYXIgQXNpYW4gZm9udHMgaGF2ZSBvdmVybGFwcGluZyAgICovCi0gICAgICAgIC8qIHJhbmdlcyBpbiB0aGVpciBjaGFybWFwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIHN0YXJ0IDw9IGxhc3RfZW5kICYmIG4gPiAwICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggdmFsaWQtPmxldmVsID49IEZUX1ZBTElEQVRFX1RJR0hUICkKLSAgICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogYWxsb3cgb3ZlcmxhcHBpbmcgc2VnbWVudHMsIHByb3ZpZGVkIHRoZWlyIHN0YXJ0IHBvaW50cyAqLwotICAgICAgICAgICAgLyogYW5kIGVuZCBwb2ludHMsIHJlc3BlY3RpdmVseSwgYXJlIGluIGFzY2VuZGluZyBvcmRlciAgICAqLwotICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKCBsYXN0X3N0YXJ0ID4gc3RhcnQgfHwgbGFzdF9lbmQgPiBlbmQgKQotICAgICAgICAgICAgICBlcnJvciB8PSBUVF9DTUFQX0ZMQUdfVU5TT1JURUQ7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGVycm9yIHw9IFRUX0NNQVBfRkxBR19PVkVSTEFQUElORzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIG9mZnNldCAmJiBvZmZzZXQgIT0gMHhGRkZGVSApCi0gICAgICAgIHsKLSAgICAgICAgICBwICs9IG9mZnNldDsgIC8qIHN0YXJ0IG9mIGdseXBoIElEIGFycmF5ICovCi0KLSAgICAgICAgICAvKiBjaGVjayB0aGF0IHdlIHBvaW50IHdpdGhpbiB0aGUgZ2x5cGggSURzIHRhYmxlIG9ubHkgKi8KLSAgICAgICAgICBpZiAoIHZhbGlkLT5sZXZlbCA+PSBGVF9WQUxJREFURV9USUdIVCApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBwIDwgZ2x5cGhfaWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICBwICsgKCBlbmQgLSBzdGFydCArIDEgKSAqIDIgPiB0YWJsZSArIGxlbmd0aCApCi0gICAgICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLyogU29tZSBmb250cyBoYW5kbGUgdGhlIGxhc3Qgc2VnbWVudCBpbmNvcnJlY3RseS4gIEluICovCi0gICAgICAgICAgLyogdGhlb3J5LCAweEZGRkYgbWlnaHQgcG9pbnQgdG8gYW4gb3JkaW5hcnkgZ2x5cGggLS0gICovCi0gICAgICAgICAgLyogYSBjbWFwIDQgaXMgdmVyc2F0aWxlIGFuZCBjb3VsZCBiZSB1c2VkIGZvciBhbnkgICAgICovCi0gICAgICAgICAgLyogZW5jb2RpbmcsIG5vdCBvbmx5IFVuaWNvZGUuICBIb3dldmVyLCByZWFsaXR5IHNob3dzICovCi0gICAgICAgICAgLyogdGhhdCBmYXIgdG9vIG1hbnkgZm9udHMgYXJlIHNsb3BweSBhbmQgaW5jb3JyZWN0bHkgICovCi0gICAgICAgICAgLyogc2V0IGFsbCBmaWVsZHMgYnV0IGBzdGFydCcgYW5kIGBlbmQnIGZvciB0aGUgbGFzdCAgICovCi0gICAgICAgICAgLyogc2VnbWVudCBpZiBpdCBjb250YWlucyBvbmx5IGEgc2luZ2xlIGNoYXJhY3Rlci4gICAgICovCi0gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogV2UgdGh1cyBvbWl0IHRoZSB0ZXN0IGhlcmUsIGRlbGF5aW5nIGl0IHRvIHRoZSAgICAgICovCi0gICAgICAgICAgLyogcm91dGluZXMgdGhhdCBhY3R1YWxseSBhY2Nlc3MgdGhlIGNtYXAuICAgICAgICAgICAgICovCi0gICAgICAgICAgZWxzZSBpZiAoIG4gIT0gbnVtX3NlZ3MgLSAxICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICAgICAhKCBzdGFydCA9PSAweEZGRkZVICYmIGVuZCA9PSAweEZGRkZVICkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggcCA8IGdseXBoX2lkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgIHAgKyAoIGVuZCAtIHN0YXJ0ICsgMSApICogMiA+IHZhbGlkLT5saW1pdCApCi0gICAgICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBjaGVjayBnbHlwaCBpbmRpY2VzIHdpdGhpbiB0aGUgc2VnbWVudCByYW5nZSAqLwotICAgICAgICAgIGlmICggdmFsaWQtPmxldmVsID49IEZUX1ZBTElEQVRFX1RJR0hUICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9VSW50ICBpLCBpZHg7Ci0KLQotICAgICAgICAgICAgZm9yICggaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZHggPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgICAgICAgICBpZiAoIGlkeCAhPSAwICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlkeCA9IChGVF9VSW50KSggKEZUX0ludClpZHggKyBkZWx0YSApICYgMHhGRkZGVTsKLQotICAgICAgICAgICAgICAgIGlmICggaWR4ID49IFRUX1ZBTElEX0dMWVBIX0NPVU5UKCB2YWxpZCApICkKLSAgICAgICAgICAgICAgICAgIEZUX0lOVkFMSURfR0xZUEhfSUQ7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIG9mZnNldCA9PSAweEZGRkZVICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHNvbWUgZm9udHMgKGVycm9uZW91c2x5PykgdXNlIGEgcmFuZ2Ugb2Zmc2V0IG9mIDB4RkZGRiAqLwotICAgICAgICAgIC8qIHRvIG1lYW4gbWlzc2luZyBnbHlwaCBpbiBjbWFwIHRhYmxlICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGlmICggdmFsaWQtPmxldmVsID49IEZUX1ZBTElEQVRFX1BBUkFOT0lEICAgIHx8Ci0gICAgICAgICAgICAgICBuICE9IG51bV9zZWdzIC0gMSAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICEoIHN0YXJ0ID09IDB4RkZGRlUgJiYgZW5kID09IDB4RkZGRlUgKSApCi0gICAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0gICAgICAgIH0KLQotICAgICAgICBsYXN0X3N0YXJ0ID0gc3RhcnQ7Ci0gICAgICAgIGxhc3RfZW5kICAgPSBlbmQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfVUludAotICB0dF9jbWFwNF9jaGFyX21hcF9saW5lYXIoIFRUX0NNYXAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyKiAgcGNoYXJjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgIG5leHQgKQotICB7Ci0gICAgVFRfRmFjZSAgIGZhY2UgID0gKFRUX0ZhY2UpY21hcC0+Y21hcC5jaGFybWFwLmZhY2U7Ci0gICAgRlRfQnl0ZSogIGxpbWl0ID0gZmFjZS0+Y21hcF90YWJsZSArIGZhY2UtPmNtYXBfc2l6ZTsKLQotCi0gICAgRlRfVUludCAgICBudW1fc2VnczIsIHN0YXJ0LCBlbmQsIG9mZnNldDsKLSAgICBGVF9JbnQgICAgIGRlbHRhOwotICAgIEZUX1VJbnQgICAgaSwgbnVtX3NlZ3M7Ci0gICAgRlRfVUludDMyICBjaGFyY29kZSA9ICpwY2hhcmNvZGU7Ci0gICAgRlRfVUludCAgICBnaW5kZXggICA9IDA7Ci0gICAgRlRfQnl0ZSogICBwOwotICAgIEZUX0J5dGUqICAgcTsKLQotCi0gICAgcCA9IGNtYXAtPmRhdGEgKyA2OwotICAgIG51bV9zZWdzMiA9IEZUX1BBRF9GTE9PUiggVFRfUEVFS19VU0hPUlQoIHAgKSwgMiApOwotCi0gICAgbnVtX3NlZ3MgPSBudW1fc2VnczIgPj4gMTsKLQotICAgIGlmICggIW51bV9zZWdzICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgaWYgKCBuZXh0ICkKLSAgICAgIGNoYXJjb2RlKys7Ci0KLSAgICBpZiAoIGNoYXJjb2RlID4gMHhGRkZGVSApCi0gICAgICByZXR1cm4gMDsKLQotICAgIC8qIGxpbmVhciBzZWFyY2ggKi8KLSAgICBwID0gY21hcC0+ZGF0YSArIDE0OyAgICAgICAgICAgICAgIC8qIGVuZHMgdGFibGUgICAqLwotICAgIHEgPSBjbWFwLT5kYXRhICsgMTYgKyBudW1fc2VnczI7ICAgLyogc3RhcnRzIHRhYmxlICovCi0KLSAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9zZWdzOyBpKysgKQotICAgIHsKLSAgICAgIGVuZCAgID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIHN0YXJ0ID0gVFRfTkVYVF9VU0hPUlQoIHEgKTsKLQotICAgICAgaWYgKCBjaGFyY29kZSA8IHN0YXJ0ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBuZXh0ICkKLSAgICAgICAgICBjaGFyY29kZSA9IHN0YXJ0OwotICAgICAgICBlbHNlCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICBBZ2FpbjoKLSAgICAgIGlmICggY2hhcmNvZGUgPD0gZW5kICkKLSAgICAgIHsKLSAgICAgICAgRlRfQnl0ZSogIHI7Ci0KLQotICAgICAgICByICAgICAgID0gcSAtIDIgKyBudW1fc2VnczI7Ci0gICAgICAgIGRlbHRhICAgPSBUVF9QRUVLX1NIT1JUKCByICk7Ci0gICAgICAgIHIgICAgICArPSBudW1fc2VnczI7Ci0gICAgICAgIG9mZnNldCAgPSBUVF9QRUVLX1VTSE9SVCggciApOwotCi0gICAgICAgIC8qIHNvbWUgZm9udHMgaGF2ZSBhbiBpbmNvcnJlY3QgbGFzdCBzZWdtZW50OyAqLwotICAgICAgICAvKiB3ZSBoYXZlIHRvIGNhdGNoIGl0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBpID49IG51bV9zZWdzIC0gMSAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgc3RhcnQgPT0gMHhGRkZGVSAmJiBlbmQgPT0gMHhGRkZGVSApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIG9mZnNldCAmJiByICsgb2Zmc2V0ICsgMiA+IGxpbWl0ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBkZWx0YSAgPSAxOwotICAgICAgICAgICAgb2Zmc2V0ID0gMDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIG9mZnNldCA9PSAweEZGRkZVICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpZiAoIG9mZnNldCApCi0gICAgICAgIHsKLSAgICAgICAgICByICs9IG9mZnNldCArICggY2hhcmNvZGUgLSBzdGFydCApICogMjsKLQotICAgICAgICAgIC8qIGlmIHIgPiBsaW1pdCwgdGhlIHdob2xlIHNlZ21lbnQgaXMgaW52YWxpZCAqLwotICAgICAgICAgIGlmICggbmV4dCAmJiByID4gbGltaXQgKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICBnaW5kZXggPSBUVF9QRUVLX1VTSE9SVCggciApOwotICAgICAgICAgIGlmICggZ2luZGV4ICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBnaW5kZXggPSAoRlRfVUludCkoIChGVF9JbnQpZ2luZGV4ICsgZGVsdGEgKSAmIDB4RkZGRlU7Ci0gICAgICAgICAgICBpZiAoIGdpbmRleCA+PSAoRlRfVUludClmYWNlLT5yb290Lm51bV9nbHlwaHMgKQotICAgICAgICAgICAgICBnaW5kZXggPSAwOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBnaW5kZXggPSAoRlRfVUludCkoIChGVF9JbnQpY2hhcmNvZGUgKyBkZWx0YSApICYgMHhGRkZGVTsKLQotICAgICAgICAgIGlmICggbmV4dCAmJiBnaW5kZXggPj0gKEZUX1VJbnQpZmFjZS0+cm9vdC5udW1fZ2x5cGhzICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiB3ZSBoYXZlIGFuIGludmFsaWQgZ2x5cGggaW5kZXg7IGlmIHRoZXJlIGlzIGFuIG92ZXJmbG93LCAqLwotICAgICAgICAgICAgLyogd2UgY2FuIGFkanVzdCBgY2hhcmNvZGUnLCBvdGhlcndpc2UgdGhlIHdob2xlIHNlZ21lbnQgaXMgKi8KLSAgICAgICAgICAgIC8qIGludmFsaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBnaW5kZXggPSAwOwotCi0gICAgICAgICAgICBpZiAoIChGVF9JbnQpY2hhcmNvZGUgKyBkZWx0YSA8IDAgJiYKLSAgICAgICAgICAgICAgICAgKEZUX0ludCllbmQgKyBkZWx0YSA+PSAwICAgICApCi0gICAgICAgICAgICAgIGNoYXJjb2RlID0gKEZUX1VJbnQpKCAtZGVsdGEgKTsKLQotICAgICAgICAgICAgZWxzZSBpZiAoIChGVF9JbnQpY2hhcmNvZGUgKyBkZWx0YSA8IDB4MTAwMDBMICYmCi0gICAgICAgICAgICAgICAgICAgICAgKEZUX0ludCllbmQgKyBkZWx0YSA+PSAweDEwMDAwTCAgICAgKQotICAgICAgICAgICAgICBjaGFyY29kZSA9IChGVF9VSW50KSggMHgxMDAwMEwgLSBkZWx0YSApOwotCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggbmV4dCAmJiAhZ2luZGV4ICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggY2hhcmNvZGUgPj0gMHhGRkZGVSApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNoYXJjb2RlKys7Ci0gICAgICAgICAgZ290byBBZ2FpbjsKLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggbmV4dCApCi0gICAgICAqcGNoYXJjb2RlID0gY2hhcmNvZGU7Ci0KLSAgICByZXR1cm4gZ2luZGV4OwotICB9Ci0KLQotICBzdGF0aWMgRlRfVUludAotICB0dF9jbWFwNF9jaGFyX21hcF9iaW5hcnkoIFRUX0NNYXAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyKiAgcGNoYXJjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgIG5leHQgKQotICB7Ci0gICAgRlRfVUludCAgIG51bV9zZWdzMiwgc3RhcnQsIGVuZCwgb2Zmc2V0OwotICAgIEZUX0ludCAgICBkZWx0YTsKLSAgICBGVF9VSW50ICAgbWF4LCBtaW4sIG1pZCwgbnVtX3NlZ3M7Ci0gICAgRlRfVUludCAgIGNoYXJjb2RlID0gKEZUX1VJbnQpKnBjaGFyY29kZTsKLSAgICBGVF9VSW50ICAgZ2luZGV4ICAgPSAwOwotICAgIEZUX0J5dGUqICBwOwotCi0KLSAgICBwID0gY21hcC0+ZGF0YSArIDY7Ci0gICAgbnVtX3NlZ3MyID0gRlRfUEFEX0ZMT09SKCBUVF9QRUVLX1VTSE9SVCggcCApLCAyICk7Ci0KLSAgICBpZiAoICFudW1fc2VnczIgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBudW1fc2VncyA9IG51bV9zZWdzMiA+PiAxOwotCi0gICAgLyogbWFrZSBjb21waWxlciBoYXBweSAqLwotICAgIG1pZCA9IG51bV9zZWdzOwotICAgIGVuZCA9IDB4RkZGRlU7Ci0KLSAgICBpZiAoIG5leHQgKQotICAgICAgY2hhcmNvZGUrKzsKLQotICAgIG1pbiA9IDA7Ci0gICAgbWF4ID0gbnVtX3NlZ3M7Ci0KLSAgICAvKiBiaW5hcnkgc2VhcmNoICovCi0gICAgd2hpbGUgKCBtaW4gPCBtYXggKQotICAgIHsKLSAgICAgIG1pZCAgICA9ICggbWluICsgbWF4ICkgPj4gMTsKLSAgICAgIHAgICAgICA9IGNtYXAtPmRhdGEgKyAxNCArIG1pZCAqIDI7Ci0gICAgICBlbmQgICAgPSBUVF9QRUVLX1VTSE9SVCggcCApOwotICAgICAgcCAgICAgKz0gMiArIG51bV9zZWdzMjsKLSAgICAgIHN0YXJ0ICA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0KLSAgICAgIGlmICggY2hhcmNvZGUgPCBzdGFydCApCi0gICAgICAgIG1heCA9IG1pZDsKLSAgICAgIGVsc2UgaWYgKCBjaGFyY29kZSA+IGVuZCApCi0gICAgICAgIG1pbiA9IG1pZCArIDE7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHAgICAgICs9IG51bV9zZWdzMjsKLSAgICAgICAgZGVsdGEgID0gVFRfUEVFS19TSE9SVCggcCApOwotICAgICAgICBwICAgICArPSBudW1fc2VnczI7Ci0gICAgICAgIG9mZnNldCA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0KLSAgICAgICAgLyogc29tZSBmb250cyBoYXZlIGFuIGluY29ycmVjdCBsYXN0IHNlZ21lbnQ7ICovCi0gICAgICAgIC8qIHdlIGhhdmUgdG8gY2F0Y2ggaXQgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpZiAoIG1pZCA+PSBudW1fc2VncyAtIDEgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICBzdGFydCA9PSAweEZGRkZVICYmIGVuZCA9PSAweEZGRkZVICkKLSAgICAgICAgewotICAgICAgICAgIFRUX0ZhY2UgICBmYWNlICA9IChUVF9GYWNlKWNtYXAtPmNtYXAuY2hhcm1hcC5mYWNlOwotICAgICAgICAgIEZUX0J5dGUqICBsaW1pdCA9IGZhY2UtPmNtYXBfdGFibGUgKyBmYWNlLT5jbWFwX3NpemU7Ci0KLQotICAgICAgICAgIGlmICggb2Zmc2V0ICYmIHAgKyBvZmZzZXQgKyAyID4gbGltaXQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGRlbHRhICA9IDE7Ci0gICAgICAgICAgICBvZmZzZXQgPSAwOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIHNlYXJjaCB0aGUgZmlyc3Qgc2VnbWVudCBjb250YWluaW5nIGBjaGFyY29kZScgKi8KLSAgICAgICAgaWYgKCBjbWFwLT5mbGFncyAmIFRUX0NNQVBfRkxBR19PVkVSTEFQUElORyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50ICBpOwotCi0KLSAgICAgICAgICAvKiBjYWxsIHRoZSBjdXJyZW50IHNlZ21lbnQgYG1heCcgKi8KLSAgICAgICAgICBtYXggPSBtaWQ7Ci0KLSAgICAgICAgICBpZiAoIG9mZnNldCA9PSAweEZGRkZVICkKLSAgICAgICAgICAgIG1pZCA9IG1heCArIDE7Ci0KLSAgICAgICAgICAvKiBzZWFyY2ggaW4gc2VnbWVudHMgYmVmb3JlIHRoZSBjdXJyZW50IHNlZ21lbnQgKi8KLSAgICAgICAgICBmb3IgKCBpID0gbWF4IDsgaSA+IDA7IGktLSApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVUludCAgIHByZXZfZW5kOwotICAgICAgICAgICAgRlRfQnl0ZSogIG9sZF9wOwotCi0KLSAgICAgICAgICAgIG9sZF9wICAgID0gcDsKLSAgICAgICAgICAgIHAgICAgICAgID0gY21hcC0+ZGF0YSArIDE0ICsgKCBpIC0gMSApICogMjsKLSAgICAgICAgICAgIHByZXZfZW5kID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKLQotICAgICAgICAgICAgaWYgKCBjaGFyY29kZSA+IHByZXZfZW5kICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcCA9IG9sZF9wOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZW5kICAgID0gcHJldl9lbmQ7Ci0gICAgICAgICAgICBwICAgICArPSAyICsgbnVtX3NlZ3MyOwotICAgICAgICAgICAgc3RhcnQgID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKLSAgICAgICAgICAgIHAgICAgICs9IG51bV9zZWdzMjsKLSAgICAgICAgICAgIGRlbHRhICA9IFRUX1BFRUtfU0hPUlQoIHAgKTsKLSAgICAgICAgICAgIHAgICAgICs9IG51bV9zZWdzMjsKLSAgICAgICAgICAgIG9mZnNldCA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0KLSAgICAgICAgICAgIGlmICggb2Zmc2V0ICE9IDB4RkZGRlUgKQotICAgICAgICAgICAgICBtaWQgPSBpIC0gMTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvKiBubyBsdWNrICovCi0gICAgICAgICAgaWYgKCBtaWQgPT0gbWF4ICsgMSApCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYgKCBpICE9IG1heCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHAgICAgICA9IGNtYXAtPmRhdGEgKyAxNCArIG1heCAqIDI7Ci0gICAgICAgICAgICAgIGVuZCAgICA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0gICAgICAgICAgICAgIHAgICAgICs9IDIgKyBudW1fc2VnczI7Ci0gICAgICAgICAgICAgIHN0YXJ0ICA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0gICAgICAgICAgICAgIHAgICAgICs9IG51bV9zZWdzMjsKLSAgICAgICAgICAgICAgZGVsdGEgID0gVFRfUEVFS19TSE9SVCggcCApOwotICAgICAgICAgICAgICBwICAgICArPSBudW1fc2VnczI7Ci0gICAgICAgICAgICAgIG9mZnNldCA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1pZCA9IG1heDsKLQotICAgICAgICAgICAgLyogc2VhcmNoIGluIHNlZ21lbnRzIGFmdGVyIHRoZSBjdXJyZW50IHNlZ21lbnQgKi8KLSAgICAgICAgICAgIGZvciAoIGkgPSBtYXggKyAxOyBpIDwgbnVtX3NlZ3M7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX1VJbnQgIG5leHRfZW5kLCBuZXh0X3N0YXJ0OwotCi0KLSAgICAgICAgICAgICAgcCAgICAgICAgICA9IGNtYXAtPmRhdGEgKyAxNCArIGkgKiAyOwotICAgICAgICAgICAgICBuZXh0X2VuZCAgID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKLSAgICAgICAgICAgICAgcCAgICAgICAgICs9IDIgKyBudW1fc2VnczI7Ci0gICAgICAgICAgICAgIG5leHRfc3RhcnQgPSBUVF9QRUVLX1VTSE9SVCggcCApOwotCi0gICAgICAgICAgICAgIGlmICggY2hhcmNvZGUgPCBuZXh0X3N0YXJ0ICkKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBlbmQgICAgPSBuZXh0X2VuZDsKLSAgICAgICAgICAgICAgc3RhcnQgID0gbmV4dF9zdGFydDsKLSAgICAgICAgICAgICAgcCAgICAgKz0gbnVtX3NlZ3MyOwotICAgICAgICAgICAgICBkZWx0YSAgPSBUVF9QRUVLX1NIT1JUKCBwICk7Ci0gICAgICAgICAgICAgIHAgICAgICs9IG51bV9zZWdzMjsKLSAgICAgICAgICAgICAgb2Zmc2V0ID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKLQotICAgICAgICAgICAgICBpZiAoIG9mZnNldCAhPSAweEZGRkZVICkKLSAgICAgICAgICAgICAgICBtaWQgPSBpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaS0tOwotCi0gICAgICAgICAgICAvKiBzdGlsbCBubyBsdWNrICovCi0gICAgICAgICAgICBpZiAoIG1pZCA9PSBtYXggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtaWQgPSBpOwotCi0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIC8qIGVuZCwgc3RhcnQsIGRlbHRhLCBhbmQgb2Zmc2V0IGFyZSBmb3IgdGhlIGkndGggc2VnbWVudCAqLwotICAgICAgICAgIGlmICggbWlkICE9IGkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHAgICAgICA9IGNtYXAtPmRhdGEgKyAxNCArIG1pZCAqIDI7Ci0gICAgICAgICAgICBlbmQgICAgPSBUVF9QRUVLX1VTSE9SVCggcCApOwotICAgICAgICAgICAgcCAgICAgKz0gMiArIG51bV9zZWdzMjsKLSAgICAgICAgICAgIHN0YXJ0ICA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0gICAgICAgICAgICBwICAgICArPSBudW1fc2VnczI7Ci0gICAgICAgICAgICBkZWx0YSAgPSBUVF9QRUVLX1NIT1JUKCBwICk7Ci0gICAgICAgICAgICBwICAgICArPSBudW1fc2VnczI7Ci0gICAgICAgICAgICBvZmZzZXQgPSBUVF9QRUVLX1VTSE9SVCggcCApOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIG9mZnNldCA9PSAweEZGRkZVICkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBvZmZzZXQgKQotICAgICAgICB7Ci0gICAgICAgICAgcCArPSBvZmZzZXQgKyAoIGNoYXJjb2RlIC0gc3RhcnQgKSAqIDI7Ci0gICAgICAgICAgZ2luZGV4ID0gVFRfUEVFS19VU0hPUlQoIHAgKTsKLSAgICAgICAgICBpZiAoIGdpbmRleCAhPSAwICkKLSAgICAgICAgICAgIGdpbmRleCA9IChGVF9VSW50KSggKEZUX0ludClnaW5kZXggKyBkZWx0YSApICYgMHhGRkZGVTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgZ2luZGV4ID0gKEZUX1VJbnQpKCAoRlRfSW50KWNoYXJjb2RlICsgZGVsdGEgKSAmIDB4RkZGRlU7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCBuZXh0ICkKLSAgICB7Ci0gICAgICBUVF9DTWFwNCAgY21hcDQgPSAoVFRfQ01hcDQpY21hcDsKLQotCi0gICAgICAvKiBpZiBgY2hhcmNvZGUnIGlzIG5vdCBpbiBhbnkgc2VnbWVudCwgdGhlbiBgbWlkJyBpcyAqLwotICAgICAgLyogdGhlIHNlZ21lbnQgbmVhcmVzdCB0byBgY2hhcmNvZGUnICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgaWYgKCBjaGFyY29kZSA+IGVuZCApCi0gICAgICB7Ci0gICAgICAgIG1pZCsrOwotICAgICAgICBpZiAoIG1pZCA9PSBudW1fc2VncyApCi0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggdHRfY21hcDRfc2V0X3JhbmdlKCBjbWFwNCwgbWlkICkgKQotICAgICAgewotICAgICAgICBpZiAoIGdpbmRleCApCi0gICAgICAgICAgKnBjaGFyY29kZSA9IGNoYXJjb2RlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjbWFwNC0+Y3VyX2NoYXJjb2RlID0gY2hhcmNvZGU7Ci0KLSAgICAgICAgaWYgKCBnaW5kZXggKQotICAgICAgICAgIGNtYXA0LT5jdXJfZ2luZGV4ID0gZ2luZGV4OwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBjbWFwNC0+Y3VyX2NoYXJjb2RlID0gY2hhcmNvZGU7Ci0gICAgICAgICAgdHRfY21hcDRfbmV4dCggY21hcDQgKTsKLSAgICAgICAgICBnaW5kZXggPSBjbWFwNC0+Y3VyX2dpbmRleDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZ2luZGV4ICkKLSAgICAgICAgICAqcGNoYXJjb2RlID0gY21hcDQtPmN1cl9jaGFyY29kZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZ2luZGV4OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICB0dF9jbWFwNF9jaGFyX2luZGV4KCBUVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlICkKLSAgewotICAgIGlmICggY2hhcl9jb2RlID49IDB4MTAwMDBVTCApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGlmICggY21hcC0+ZmxhZ3MgJiBUVF9DTUFQX0ZMQUdfVU5TT1JURUQgKQotICAgICAgcmV0dXJuIHR0X2NtYXA0X2NoYXJfbWFwX2xpbmVhciggY21hcCwgJmNoYXJfY29kZSwgMCApOwotICAgIGVsc2UKLSAgICAgIHJldHVybiB0dF9jbWFwNF9jaGFyX21hcF9iaW5hcnkoIGNtYXAsICZjaGFyX2NvZGUsIDAgKTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50MzIgKQotICB0dF9jbWFwNF9jaGFyX25leHQoIFRUX0NNYXAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAqcGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9VSW50ICBnaW5kZXg7Ci0KLQotICAgIGlmICggKnBjaGFyX2NvZGUgPj0gMHhGRkZGVSApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGlmICggY21hcC0+ZmxhZ3MgJiBUVF9DTUFQX0ZMQUdfVU5TT1JURUQgKQotICAgICAgZ2luZGV4ID0gdHRfY21hcDRfY2hhcl9tYXBfbGluZWFyKCBjbWFwLCBwY2hhcl9jb2RlLCAxICk7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFRUX0NNYXA0ICBjbWFwNCA9IChUVF9DTWFwNCljbWFwOwotCi0KLSAgICAgIC8qIG5vIG5lZWQgdG8gc2VhcmNoICovCi0gICAgICBpZiAoICpwY2hhcl9jb2RlID09IGNtYXA0LT5jdXJfY2hhcmNvZGUgKQotICAgICAgewotICAgICAgICB0dF9jbWFwNF9uZXh0KCBjbWFwNCApOwotICAgICAgICBnaW5kZXggPSBjbWFwNC0+Y3VyX2dpbmRleDsKLSAgICAgICAgaWYgKCBnaW5kZXggKQotICAgICAgICAgICpwY2hhcl9jb2RlID0gY21hcDQtPmN1cl9jaGFyY29kZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgZ2luZGV4ID0gdHRfY21hcDRfY2hhcl9tYXBfYmluYXJ5KCBjbWFwLCBwY2hhcl9jb2RlLCAxICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGdpbmRleDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXA0X2dldF9pbmZvKCBUVF9DTWFwICAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICBUVF9DTWFwSW5mbyAgKmNtYXBfaW5mbyApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCA9IGNtYXAtPmRhdGEgKyA0OwotCi0KLSAgICBjbWFwX2luZm8tPmZvcm1hdCAgID0gNDsKLSAgICBjbWFwX2luZm8tPmxhbmd1YWdlID0gKEZUX1VMb25nKVRUX1BFRUtfVVNIT1JUKCBwICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9ERUZJTkVfVFRfQ01BUCgKLSAgICB0dF9jbWFwNF9jbGFzc19yZWMsCi0gICAgc2l6ZW9mICggVFRfQ01hcDRSZWMgKSwKLSAgICAoRlRfQ01hcF9Jbml0RnVuYykgICAgIHR0X2NtYXA0X2luaXQsCi0gICAgKEZUX0NNYXBfRG9uZUZ1bmMpICAgICBOVUxMLAotICAgIChGVF9DTWFwX0NoYXJJbmRleEZ1bmMpdHRfY21hcDRfY2hhcl9pbmRleCwKLSAgICAoRlRfQ01hcF9DaGFyTmV4dEZ1bmMpIHR0X2NtYXA0X2NoYXJfbmV4dCwKLQotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLQotICAgIDQsCi0gICAgKFRUX0NNYXBfVmFsaWRhdGVGdW5jKXR0X2NtYXA0X3ZhbGlkYXRlLAotICAgIChUVF9DTWFwX0luZm9fR2V0RnVuYyl0dF9jbWFwNF9nZXRfaW5mbyApCi0KLSNlbmRpZiAvKiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfNCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVQgNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUQUJMRSBPVkVSVklFVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5BTUUgICAgICAgIE9GRlNFVCAgICAgICAgICBUWVBFICAgICAgICAgICAgIERFU0NSSVBUSU9OICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZm9ybWF0ICAgICAgIDAgICAgICAgICAgICAgIFVTSE9SVCAgICAgICAgICAgbXVzdCBiZSA2ICAgICAgICAgICAgICAqLwotICAvKiAgIGxlbmd0aCAgICAgICAyICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgIHRhYmxlIGxlbmd0aCBpbiBieXRlcyAgKi8KLSAgLyogICBsYW5ndWFnZSAgICAgNCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICBNYWMgbGFuZ3VhZ2UgY29kZSAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGZpcnN0ICAgICAgICA2ICAgICAgICAgICAgICBVU0hPUlQgICAgICAgICAgIGZpcnN0IHNlZ21lbnQgY29kZSAgICAgKi8KLSAgLyogICBjb3VudCAgICAgICAgOCAgICAgICAgICAgICAgVVNIT1JUICAgICAgICAgICBzZWdtZW50IHNpemUgaW4gY2hhcnMgICovCi0gIC8qICAgZ2x5cGhJZHMgICAgIDEwICAgICAgICAgICAgIFVTSE9SVFtjb3VudF0gICAgZ2x5cGggSURzICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSB2ZXJ5IHNpbXBsaWZpZWQgc2VnbWVudCBtYXBwaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZkZWYgVFRfQ09ORklHX0NNQVBfRk9STUFUXzYKLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdHRfY21hcDZfdmFsaWRhdGUoIEZUX0J5dGUqICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIHZhbGlkICkKLSAgewotICAgIEZUX0J5dGUqICBwOwotICAgIEZUX1VJbnQgICBsZW5ndGgsIGNvdW50OwotCi0KLSAgICBpZiAoIHRhYmxlICsgMTAgPiB2YWxpZC0+bGltaXQgKQotICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICBwICAgICAgPSB0YWJsZSArIDI7Ci0gICAgbGVuZ3RoID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgIHAgICAgICA9IHRhYmxlICsgODsgICAgICAgICAgICAgLyogc2tpcCBsYW5ndWFnZSBhbmQgc3RhcnQgaW5kZXggKi8KLSAgICBjb3VudCAgPSBUVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgaWYgKCB0YWJsZSArIGxlbmd0aCA+IHZhbGlkLT5saW1pdCB8fCBsZW5ndGggPCAxMCArIGNvdW50ICogMiApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIC8qIGNoZWNrIGdseXBoIGluZGljZXMgKi8KLSAgICBpZiAoIHZhbGlkLT5sZXZlbCA+PSBGVF9WQUxJREFURV9USUdIVCApCi0gICAgewotICAgICAgRlRfVUludCAgZ2luZGV4OwotCi0KLSAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tICkKLSAgICAgIHsKLSAgICAgICAgZ2luZGV4ID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgaWYgKCBnaW5kZXggPj0gVFRfVkFMSURfR0xZUEhfQ09VTlQoIHZhbGlkICkgKQotICAgICAgICAgIEZUX0lOVkFMSURfR0xZUEhfSUQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgdHRfY21hcDZfY2hhcl9pbmRleCggVFRfQ01hcCAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9CeXRlKiAgdGFibGUgID0gY21hcC0+ZGF0YTsKLSAgICBGVF9VSW50ICAgcmVzdWx0ID0gMDsKLSAgICBGVF9CeXRlKiAgcCAgICAgID0gdGFibGUgKyA2OwotICAgIEZUX1VJbnQgICBzdGFydCAgPSBUVF9ORVhUX1VTSE9SVCggcCApOwotICAgIEZUX1VJbnQgICBjb3VudCAgPSBUVF9ORVhUX1VTSE9SVCggcCApOwotICAgIEZUX1VJbnQgICBpZHggICAgPSAoRlRfVUludCkoIGNoYXJfY29kZSAtIHN0YXJ0ICk7Ci0KLQotICAgIGlmICggaWR4IDwgY291bnQgKQotICAgIHsKLSAgICAgIHAgKz0gMiAqIGlkeDsKLSAgICAgIHJlc3VsdCA9IFRUX1BFRUtfVVNIT1JUKCBwICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50MzIgKQotICB0dF9jbWFwNl9jaGFyX25leHQoIFRUX0NNYXAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAqcGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9CeXRlKiAgIHRhYmxlICAgICA9IGNtYXAtPmRhdGE7Ci0gICAgRlRfVUludDMyICByZXN1bHQgICAgPSAwOwotICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlID0gKnBjaGFyX2NvZGUgKyAxOwotICAgIEZUX1VJbnQgICAgZ2luZGV4ICAgID0gMDsKLQotICAgIEZUX0J5dGUqICAgcCAgICAgICAgID0gdGFibGUgKyA2OwotICAgIEZUX1VJbnQgICAgc3RhcnQgICAgID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBGVF9VSW50ICAgIGNvdW50ICAgICA9IFRUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgRlRfVUludCAgICBpZHg7Ci0KLQotICAgIGlmICggY2hhcl9jb2RlID49IDB4MTAwMDBVTCApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGlmICggY2hhcl9jb2RlIDwgc3RhcnQgKQotICAgICAgY2hhcl9jb2RlID0gc3RhcnQ7Ci0KLSAgICBpZHggPSAoRlRfVUludCkoIGNoYXJfY29kZSAtIHN0YXJ0ICk7Ci0gICAgcCAgKz0gMiAqIGlkeDsKLQotICAgIGZvciAoIDsgaWR4IDwgY291bnQ7IGlkeCsrICkKLSAgICB7Ci0gICAgICBnaW5kZXggPSBUVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgaWYgKCBnaW5kZXggIT0gMCApCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGNoYXJfY29kZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggY2hhcl9jb2RlID49IDB4RkZGRlUgKQotICAgICAgICByZXR1cm4gMDsKLQotICAgICAgY2hhcl9jb2RlKys7Ci0gICAgfQotCi0gICAgKnBjaGFyX2NvZGUgPSByZXN1bHQ7Ci0gICAgcmV0dXJuIGdpbmRleDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXA2X2dldF9pbmZvKCBUVF9DTWFwICAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICBUVF9DTWFwSW5mbyAgKmNtYXBfaW5mbyApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCA9IGNtYXAtPmRhdGEgKyA0OwotCi0KLSAgICBjbWFwX2luZm8tPmZvcm1hdCAgID0gNjsKLSAgICBjbWFwX2luZm8tPmxhbmd1YWdlID0gKEZUX1VMb25nKVRUX1BFRUtfVVNIT1JUKCBwICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9ERUZJTkVfVFRfQ01BUCgKLSAgICB0dF9jbWFwNl9jbGFzc19yZWMsCi0gICAgc2l6ZW9mICggVFRfQ01hcFJlYyApLAotCi0gICAgKEZUX0NNYXBfSW5pdEZ1bmMpICAgICB0dF9jbWFwX2luaXQsCi0gICAgKEZUX0NNYXBfRG9uZUZ1bmMpICAgICBOVUxMLAotICAgIChGVF9DTWFwX0NoYXJJbmRleEZ1bmMpdHRfY21hcDZfY2hhcl9pbmRleCwKLSAgICAoRlRfQ01hcF9DaGFyTmV4dEZ1bmMpIHR0X2NtYXA2X2NoYXJfbmV4dCwKLQotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLQotICAgIDYsCi0gICAgKFRUX0NNYXBfVmFsaWRhdGVGdW5jKXR0X2NtYXA2X3ZhbGlkYXRlLAotICAgIChUVF9DTWFwX0luZm9fR2V0RnVuYyl0dF9jbWFwNl9nZXRfaW5mbyApCi0KLSNlbmRpZiAvKiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfNiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVQgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogSXQgaXMgaGFyZCB0byBjb21wbGV0ZWx5IHVuZGVyc3RhbmQgd2hhdCB0aGUgT3BlblR5cGUgc3BlYyAgICAqKioqKi8KLSAgLyoqKioqIHNheXMgYWJvdXQgdGhpcyBmb3JtYXQsIGJ1dCBoZXJlIGlzIG15IGNvbmNsdXNpb24uICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogVGhlIHB1cnBvc2Ugb2YgdGhpcyBmb3JtYXQgaXMgdG8gZWFzaWx5IG1hcCBVVEYtMTYgdGV4dCB0byAgICAqKioqKi8KLSAgLyoqKioqIGdseXBoIGluZGljZXMuICBCYXNpY2FsbHksIHRoZSBgY2hhcl9jb2RlJyBtdXN0IGJlIGluIG9uZSBvZiAgKioqKiovCi0gIC8qKioqKiB0aGUgZm9sbG93aW5nIGZvcm1hdHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgLSBBIDE2LWJpdCB2YWx1ZSB0aGF0IGlzbid0IHBhcnQgb2YgdGhlIFVuaWNvZGUgU3Vycm9nYXRlcyAgKioqKiovCi0gIC8qKioqKiAgICAgQXJlYSAoaS5lLiBVK0Q4MDAtVStERkZGKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgLSBBIDMyLWJpdCB2YWx1ZSwgbWFkZSBvZiB0d28gc3Vycm9nYXRlIHZhbHVlcywgaS5lLi4gaWYgICAgKioqKiovCi0gIC8qKioqKiAgICAgYGNoYXJfY29kZSA9IChjaGFyX2hpIDw8IDE2KSB8IGNoYXJfbG8nLCB0aGVuIGJvdGggICAgICAgICoqKioqLwotICAvKioqKiogICAgIGBjaGFyX2hpJyBhbmQgYGNoYXJfbG8nIG11c3QgYmUgaW4gdGhlIFN1cnJvZ2F0ZXMgQXJlYS4gICAqKioqKi8KLSAgLyoqKioqICAgICAgQXJlYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogVGhlIGBpczMyJyB0YWJsZSBlbWJlZGRlZCBpbiB0aGUgY2hhcm1hcCBpbmRpY2F0ZXMgd2hldGhlciBhICAqKioqKi8KLSAgLyoqKioqIGdpdmVuIDE2LWJpdCB2YWx1ZSBpcyBpbiB0aGUgc3Vycm9nYXRlcyBhcmVhIG9yIG5vdC4gICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogU28sIGZvciBhbnkgZ2l2ZW4gYGNoYXJfY29kZScsIHdlIGNhbiBhc3NlcnQgdGhlIGZvbGxvd2luZy4gICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgIElmIGBjaGFyX2hpID09IDAnIHRoZW4gd2UgbXVzdCBoYXZlIGBpczMyW2NoYXJfbG9dID09IDAnLiAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgSWYgYGNoYXJfaGkgIT0gMCcgdGhlbiB3ZSBtdXN0IGhhdmUgYm90aCAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgIGBpczMyW2NoYXJfaGldICE9IDAnIGFuZCBgaXMzMltjaGFyX2xvXSAhPSAwJy4gICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVEFCTEUgT1ZFUlZJRVcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBOQU1FICAgICAgICBPRkZTRVQgICAgICAgICBUWVBFICAgICAgICBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGZvcm1hdCAgICAgIDAgICAgICAgICAgICAgIFVTSE9SVCAgICAgIG11c3QgYmUgOCAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICByZXNlcnZlZCAgICAyICAgICAgICAgICAgICBVU0hPUlQgICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgbGVuZ3RoICAgICAgNCAgICAgICAgICAgICAgVUxPTkcgICAgICAgbGVuZ3RoIGluIGJ5dGVzICAgICAgICAgICAgICAqLwotICAvKiAgIGxhbmd1YWdlICAgIDggICAgICAgICAgICAgIFVMT05HICAgICAgIE1hYyBsYW5ndWFnZSBjb2RlICAgICAgICAgICAgKi8KLSAgLyogICBpczMyICAgICAgICAxMiAgICAgICAgICAgICBCWVRFWzgxOTJdICAzMi1iaXRuZXNzIGJpdG1hcCAgICAgICAgICAgICovCi0gIC8qICAgY291bnQgICAgICAgODIwNCAgICAgICAgICAgVUxPTkcgICAgICAgbnVtYmVyIG9mIGdyb3VwcyAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgYGNvdW50JyBncm91cHMgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXQ6ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHN0YXJ0ICAgICAgIDAgICAgICAgICAgICAgIFVMT05HICAgICAgIGZpcnN0IGNoYXJjb2RlICAgICAgICAgICAgICAgKi8KLSAgLyogICBlbmQgICAgICAgICA0ICAgICAgICAgICAgICBVTE9ORyAgICAgICBsYXN0IGNoYXJjb2RlICAgICAgICAgICAgICAgICovCi0gIC8qICAgc3RhcnRJZCAgICAgOCAgICAgICAgICAgICAgVUxPTkcgICAgICAgc3RhcnQgZ2x5cGggSUQgZm9yIHRoZSBncm91cCAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF84Ci0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXA4X3ZhbGlkYXRlKCBGVF9CeXRlKiAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICB2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlKiAgIHAgPSB0YWJsZSArIDQ7Ci0gICAgRlRfQnl0ZSogICBpczMyOwotICAgIEZUX1VJbnQzMiAgbGVuZ3RoOwotICAgIEZUX1VJbnQzMiAgbnVtX2dyb3VwczsKLQotCi0gICAgaWYgKCB0YWJsZSArIDE2ICsgODE5MiA+IHZhbGlkLT5saW1pdCApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIGxlbmd0aCA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBpZiAoIGxlbmd0aCA+IChGVF9VSW50MzIpKCB2YWxpZC0+bGltaXQgLSB0YWJsZSApIHx8IGxlbmd0aCA8IDgxOTIgKyAxNiApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIGlzMzIgICAgICAgPSB0YWJsZSArIDEyOwotICAgIHAgICAgICAgICAgPSBpczMyICArIDgxOTI7ICAgICAgICAgIC8qIHNraXAgYGlzMzInIGFycmF5ICovCi0gICAgbnVtX2dyb3VwcyA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgIC8qIHAgKyBudW1fZ3JvdXBzICogMTIgPiB2YWxpZC0+bGltaXQgPyAqLwotICAgIGlmICggbnVtX2dyb3VwcyA+IChGVF9VSW50MzIpKCB2YWxpZC0+bGltaXQgLSBwICkgLyAxMiApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIC8qIGNoZWNrIGdyb3VwcywgdGhleSBtdXN0IGJlIGluIGluY3JlYXNpbmcgb3JkZXIgKi8KLSAgICB7Ci0gICAgICBGVF9VSW50MzIgIG4sIHN0YXJ0LCBlbmQsIHN0YXJ0X2lkLCBjb3VudCwgbGFzdCA9IDA7Ci0KLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fZ3JvdXBzOyBuKysgKQotICAgICAgewotICAgICAgICBGVF9VSW50ICAgaGksIGxvOwotCi0KLSAgICAgICAgc3RhcnQgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICAgIGVuZCAgICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgICBzdGFydF9pZCA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgICAgICBpZiAoIHN0YXJ0ID4gZW5kICkKLSAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICAgICAgaWYgKCBuID4gMCAmJiBzdGFydCA8PSBsYXN0ICkKLSAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICAgICAgaWYgKCB2YWxpZC0+bGV2ZWwgPj0gRlRfVkFMSURBVEVfVElHSFQgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUludDMyICBkID0gZW5kIC0gc3RhcnQ7Ci0KLQotICAgICAgICAgIC8qIHN0YXJ0X2lkICsgZW5kIC0gc3RhcnQgPj0gVFRfVkFMSURfR0xZUEhfQ09VTlQoIHZhbGlkICkgPyAqLwotICAgICAgICAgIGlmICggZCA+IFRUX1ZBTElEX0dMWVBIX0NPVU5UKCB2YWxpZCApICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICBzdGFydF9pZCA+PSBUVF9WQUxJRF9HTFlQSF9DT1VOVCggdmFsaWQgKSAtIGQgKQotICAgICAgICAgICAgRlRfSU5WQUxJRF9HTFlQSF9JRDsKLQotICAgICAgICAgIGNvdW50ID0gKEZUX1VJbnQzMikoIGVuZCAtIHN0YXJ0ICsgMSApOwotCi0gICAgICAgICAgaWYgKCBzdGFydCAmIH4weEZGRkZVICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBzdGFydF9oaSAhPSAwOyBjaGVjayB0aGF0IGlzMzJbaV0gaXMgMSBmb3IgZWFjaCBpIGluICovCi0gICAgICAgICAgICAvKiB0aGUgYGhpJyBhbmQgYGxvJyBvZiB0aGUgcmFuZ2UgW3N0YXJ0Li5lbmRdICAgICAgICAgICovCi0gICAgICAgICAgICBmb3IgKCA7IGNvdW50ID4gMDsgY291bnQtLSwgc3RhcnQrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGhpID0gKEZUX1VJbnQpKCBzdGFydCA+PiAxNiApOwotICAgICAgICAgICAgICBsbyA9IChGVF9VSW50KSggc3RhcnQgJiAweEZGRkZVICk7Ci0KLSAgICAgICAgICAgICAgaWYgKCAoaXMzMltoaSA+PiAzXSAmICggMHg4MCA+PiAoIGhpICYgNyApICkgKSA9PSAwICkKLSAgICAgICAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICAgICAgICAgICAgaWYgKCAoaXMzMltsbyA+PiAzXSAmICggMHg4MCA+PiAoIGxvICYgNyApICkgKSA9PSAwICkKLSAgICAgICAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvKiBzdGFydF9oaSA9PSAwOyBjaGVjayB0aGF0IGlzMzJbaV0gaXMgMCBmb3IgZWFjaCBpIGluICovCi0gICAgICAgICAgICAvKiB0aGUgcmFuZ2UgW3N0YXJ0Li5lbmRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgIC8qIGVuZF9oaSBjYW5ub3QgYmUgIT0gMCEgKi8KLSAgICAgICAgICAgIGlmICggZW5kICYgfjB4RkZGRlUgKQotICAgICAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICAgICAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBzdGFydCsrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbG8gPSAoRlRfVUludCkoIHN0YXJ0ICYgMHhGRkZGVSApOwotCi0gICAgICAgICAgICAgIGlmICggKGlzMzJbbG8gPj4gM10gJiAoIDB4ODAgPj4gKCBsbyAmIDcgKSApICkgIT0gMCApCi0gICAgICAgICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGxhc3QgPSBlbmQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgdHRfY21hcDhfY2hhcl9pbmRleCggVFRfQ01hcCAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9CeXRlKiAgIHRhYmxlICAgICAgPSBjbWFwLT5kYXRhOwotICAgIEZUX1VJbnQgICAgcmVzdWx0ICAgICA9IDA7Ci0gICAgRlRfQnl0ZSogICBwICAgICAgICAgID0gdGFibGUgKyA4MjA0OwotICAgIEZUX1VJbnQzMiAgbnVtX2dyb3VwcyA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBGVF9VSW50MzIgIHN0YXJ0LCBlbmQsIHN0YXJ0X2lkOwotCi0KLSAgICBmb3IgKCA7IG51bV9ncm91cHMgPiAwOyBudW1fZ3JvdXBzLS0gKQotICAgIHsKLSAgICAgIHN0YXJ0ICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgZW5kICAgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICBzdGFydF9pZCA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgICAgaWYgKCBjaGFyX2NvZGUgPCBzdGFydCApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBpZiAoIGNoYXJfY29kZSA8PSBlbmQgKQotICAgICAgewotICAgICAgICBpZiAoIHN0YXJ0X2lkID4gMHhGRkZGRkZGRlVMIC0gKCBjaGFyX2NvZGUgLSBzdGFydCApICkKLSAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICByZXN1bHQgPSAoRlRfVUludCkoIHN0YXJ0X2lkICsgKCBjaGFyX2NvZGUgLSBzdGFydCApICk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQzMiApCi0gIHR0X2NtYXA4X2NoYXJfbmV4dCggVFRfQ01hcCAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICpwY2hhcl9jb2RlICkKLSAgewotICAgIEZUX0ZhY2UgICAgZmFjZSAgICAgICA9IGNtYXAtPmNtYXAuY2hhcm1hcC5mYWNlOwotICAgIEZUX1VJbnQzMiAgcmVzdWx0ICAgICA9IDA7Ci0gICAgRlRfVUludDMyICBjaGFyX2NvZGU7Ci0gICAgRlRfVUludCAgICBnaW5kZXggICAgID0gMDsKLSAgICBGVF9CeXRlKiAgIHRhYmxlICAgICAgPSBjbWFwLT5kYXRhOwotICAgIEZUX0J5dGUqICAgcCAgICAgICAgICA9IHRhYmxlICsgODIwNDsKLSAgICBGVF9VSW50MzIgIG51bV9ncm91cHMgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgRlRfVUludDMyICBzdGFydCwgZW5kLCBzdGFydF9pZDsKLQotCi0gICAgaWYgKCAqcGNoYXJfY29kZSA+PSAweEZGRkZGRkZGVUwgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjaGFyX2NvZGUgPSAqcGNoYXJfY29kZSArIDE7Ci0KLSAgICBwID0gdGFibGUgKyA4MjA4OwotCi0gICAgZm9yICggOyBudW1fZ3JvdXBzID4gMDsgbnVtX2dyb3Vwcy0tICkKLSAgICB7Ci0gICAgICBzdGFydCAgICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgIGVuZCAgICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgc3RhcnRfaWQgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAgIGlmICggY2hhcl9jb2RlIDwgc3RhcnQgKQotICAgICAgICBjaGFyX2NvZGUgPSBzdGFydDsKLQotICAgIEFnYWluOgotICAgICAgaWYgKCBjaGFyX2NvZGUgPD0gZW5kICkKLSAgICAgIHsKLSAgICAgICAgLyogaWdub3JlIGludmFsaWQgZ3JvdXAgKi8KLSAgICAgICAgaWYgKCBzdGFydF9pZCA+IDB4RkZGRkZGRkZVTCAtICggY2hhcl9jb2RlIC0gc3RhcnQgKSApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgZ2luZGV4ID0gKEZUX1VJbnQpKCBzdGFydF9pZCArICggY2hhcl9jb2RlIC0gc3RhcnQgKSApOwotCi0gICAgICAgIC8qIGRvZXMgZmlyc3QgZWxlbWVudCBvZiBncm91cCBwb2ludCB0byBgLm5vdGRlZicgZ2x5cGg/ICovCi0gICAgICAgIGlmICggZ2luZGV4ID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBjaGFyX2NvZGUgPj0gMHhGRkZGRkZGRlVMICkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2hhcl9jb2RlKys7Ci0gICAgICAgICAgZ290byBBZ2FpbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGlmIGBnaW5kZXgnIGlzIGludmFsaWQsIHRoZSByZW1haW5pbmcgdmFsdWVzICovCi0gICAgICAgIC8qIGluIHRoaXMgZ3JvdXAgYXJlIGludmFsaWQsIHRvbyAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggZ2luZGV4ID49IChGVF9VSW50KWZhY2UtPm51bV9nbHlwaHMgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIHJlc3VsdCA9IGNoYXJfY29kZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgKnBjaGFyX2NvZGUgPSByZXN1bHQ7Ci0gICAgcmV0dXJuIGdpbmRleDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXA4X2dldF9pbmZvKCBUVF9DTWFwICAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICBUVF9DTWFwSW5mbyAgKmNtYXBfaW5mbyApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCA9IGNtYXAtPmRhdGEgKyA4OwotCi0KLSAgICBjbWFwX2luZm8tPmZvcm1hdCAgID0gODsKLSAgICBjbWFwX2luZm8tPmxhbmd1YWdlID0gKEZUX1VMb25nKVRUX1BFRUtfVUxPTkcoIHAgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0RFRklORV9UVF9DTUFQKAotICAgIHR0X2NtYXA4X2NsYXNzX3JlYywKLSAgICBzaXplb2YgKCBUVF9DTWFwUmVjICksCi0KLSAgICAoRlRfQ01hcF9Jbml0RnVuYykgICAgIHR0X2NtYXBfaW5pdCwKLSAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIE5VTEwsCi0gICAgKEZUX0NNYXBfQ2hhckluZGV4RnVuYyl0dF9jbWFwOF9jaGFyX2luZGV4LAotICAgIChGVF9DTWFwX0NoYXJOZXh0RnVuYykgdHRfY21hcDhfY2hhcl9uZXh0LAotCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotCi0gICAgOCwKLSAgICAoVFRfQ01hcF9WYWxpZGF0ZUZ1bmMpdHRfY21hcDhfdmFsaWRhdGUsCi0gICAgKFRUX0NNYXBfSW5mb19HZXRGdW5jKXR0X2NtYXA4X2dldF9pbmZvICkKLQotI2VuZGlmIC8qIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF84ICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgIEZPUk1BVCAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRBQkxFIE9WRVJWSUVXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTkFNRSAgICAgIE9GRlNFVCAgVFlQRSAgICAgICAgICAgICAgIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmb3JtYXQgICAgIDAgICAgICBVU0hPUlQgICAgICAgICAgICAgbXVzdCBiZSAxMCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgcmVzZXJ2ZWQgICAyICAgICAgVVNIT1JUICAgICAgICAgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGxlbmd0aCAgICAgNCAgICAgIFVMT05HICAgICAgICAgICAgICBsZW5ndGggaW4gYnl0ZXMgICAgICAgICAgICAgICAgKi8KLSAgLyogICBsYW5ndWFnZSAgIDggICAgICBVTE9ORyAgICAgICAgICAgICAgTWFjIGxhbmd1YWdlIGNvZGUgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHN0YXJ0ICAgICAxMiAgICAgIFVMT05HICAgICAgICAgICAgICBmaXJzdCBjaGFyIGluIHJhbmdlICAgICAgICAgICAgKi8KLSAgLyogICBjb3VudCAgICAgMTYgICAgICBVTE9ORyAgICAgICAgICAgICAgbnVtYmVyIG9mIGNoYXJzIGluIHJhbmdlICAgICAgICovCi0gIC8qICAgZ2x5cGhJZHMgIDIwICAgICAgVVNIT1JUW2NvdW50XSAgICAgIGdseXBoIGluZGljZXMgY292ZXJlZCAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xMAotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwMTBfdmFsaWRhdGUoIEZUX0J5dGUqICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICB2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCA9IHRhYmxlICsgNDsKLSAgICBGVF9VTG9uZyAgbGVuZ3RoLCBjb3VudDsKLQotCi0gICAgaWYgKCB0YWJsZSArIDIwID4gdmFsaWQtPmxpbWl0ICkKLSAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOwotCi0gICAgbGVuZ3RoID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgIHAgICAgICA9IHRhYmxlICsgMTY7Ci0gICAgY291bnQgID0gVFRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgaWYgKCBsZW5ndGggPiAoRlRfVUxvbmcpKCB2YWxpZC0+bGltaXQgLSB0YWJsZSApIHx8Ci0gICAgICAgICAvKiBsZW5ndGggPCAyMCArIGNvdW50ICogMiA/ICovCi0gICAgICAgICBsZW5ndGggPCAyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAoIGxlbmd0aCAtIDIwICkgLyAyIDwgY291bnQgICAgICAgICAgICAgICAgICkKLSAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOwotCi0gICAgLyogY2hlY2sgZ2x5cGggaW5kaWNlcyAqLwotICAgIGlmICggdmFsaWQtPmxldmVsID49IEZUX1ZBTElEQVRFX1RJR0hUICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBnaW5kZXg7Ci0KLQotICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgICAgewotICAgICAgICBnaW5kZXggPSBUVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgICBpZiAoIGdpbmRleCA+PSBUVF9WQUxJRF9HTFlQSF9DT1VOVCggdmFsaWQgKSApCi0gICAgICAgICAgRlRfSU5WQUxJRF9HTFlQSF9JRDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICB0dF9jbWFwMTBfY2hhcl9pbmRleCggVFRfQ01hcCAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfQnl0ZSogICB0YWJsZSAgPSBjbWFwLT5kYXRhOwotICAgIEZUX1VJbnQgICAgcmVzdWx0ID0gMDsKLSAgICBGVF9CeXRlKiAgIHAgICAgICA9IHRhYmxlICsgMTI7Ci0gICAgRlRfVUludDMyICBzdGFydCAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgRlRfVUludDMyICBjb3VudCAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgRlRfVUludDMyICBpZHg7Ci0KLQotICAgIGlmICggY2hhcl9jb2RlIDwgc3RhcnQgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZHggPSBjaGFyX2NvZGUgLSBzdGFydDsKLQotICAgIGlmICggaWR4IDwgY291bnQgKQotICAgIHsKLSAgICAgIHAgICAgICs9IDIgKiBpZHg7Ci0gICAgICByZXN1bHQgPSBUVF9QRUVLX1VTSE9SVCggcCApOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludDMyICkKLSAgdHRfY21hcDEwX2NoYXJfbmV4dCggVFRfQ01hcCAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAqcGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9CeXRlKiAgIHRhYmxlICAgICA9IGNtYXAtPmRhdGE7Ci0gICAgRlRfVUludDMyICBjaGFyX2NvZGU7Ci0gICAgRlRfVUludCAgICBnaW5kZXggICAgPSAwOwotICAgIEZUX0J5dGUqICAgcCAgICAgICAgID0gdGFibGUgKyAxMjsKLSAgICBGVF9VSW50MzIgIHN0YXJ0ICAgICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBGVF9VSW50MzIgIGNvdW50ICAgICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBGVF9VSW50MzIgIGlkeDsKLQotCi0gICAgaWYgKCAqcGNoYXJfY29kZSA+PSAweEZGRkZGRkZGVUwgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjaGFyX2NvZGUgPSAqcGNoYXJfY29kZSArIDE7Ci0KLSAgICBpZiAoIGNoYXJfY29kZSA8IHN0YXJ0ICkKLSAgICAgIGNoYXJfY29kZSA9IHN0YXJ0OwotCi0gICAgaWR4ID0gY2hhcl9jb2RlIC0gc3RhcnQ7Ci0gICAgcCAgKz0gMiAqIGlkeDsKLQotICAgIGZvciAoIDsgaWR4IDwgY291bnQ7IGlkeCsrICkKLSAgICB7Ci0gICAgICBnaW5kZXggPSBUVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgaWYgKCBnaW5kZXggIT0gMCApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBpZiAoIGNoYXJfY29kZSA+PSAweEZGRkZGRkZGVUwgKQotICAgICAgICByZXR1cm4gMDsKLQotICAgICAgY2hhcl9jb2RlKys7Ci0gICAgfQotCi0gICAgKnBjaGFyX2NvZGUgPSBjaGFyX2NvZGU7Ci0gICAgcmV0dXJuIGdpbmRleDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9FcnJvciApCi0gIHR0X2NtYXAxMF9nZXRfaW5mbyggVFRfQ01hcCAgICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgIFRUX0NNYXBJbmZvICAqY21hcF9pbmZvICkKLSAgewotICAgIEZUX0J5dGUqICBwID0gY21hcC0+ZGF0YSArIDg7Ci0KLQotICAgIGNtYXBfaW5mby0+Zm9ybWF0ICAgPSAxMDsKLSAgICBjbWFwX2luZm8tPmxhbmd1YWdlID0gKEZUX1VMb25nKVRUX1BFRUtfVUxPTkcoIHAgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0RFRklORV9UVF9DTUFQKAotICAgIHR0X2NtYXAxMF9jbGFzc19yZWMsCi0gICAgc2l6ZW9mICggVFRfQ01hcFJlYyApLAotCi0gICAgKEZUX0NNYXBfSW5pdEZ1bmMpICAgICB0dF9jbWFwX2luaXQsCi0gICAgKEZUX0NNYXBfRG9uZUZ1bmMpICAgICBOVUxMLAotICAgIChGVF9DTWFwX0NoYXJJbmRleEZ1bmMpdHRfY21hcDEwX2NoYXJfaW5kZXgsCi0gICAgKEZUX0NNYXBfQ2hhck5leHRGdW5jKSB0dF9jbWFwMTBfY2hhcl9uZXh0LAotCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotCi0gICAgMTAsCi0gICAgKFRUX0NNYXBfVmFsaWRhdGVGdW5jKXR0X2NtYXAxMF92YWxpZGF0ZSwKLSAgICAoVFRfQ01hcF9JbmZvX0dldEZ1bmMpdHRfY21hcDEwX2dldF9pbmZvICkKLQotI2VuZGlmIC8qIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xMCAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVQgMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUQUJMRSBPVkVSVklFVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5BTUUgICAgICAgIE9GRlNFVCAgICAgVFlQRSAgICAgICBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZm9ybWF0ICAgICAgMCAgICAgICAgICBVU0hPUlQgICAgIG11c3QgYmUgMTIgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHJlc2VydmVkICAgIDIgICAgICAgICAgVVNIT1JUICAgICByZXNlcnZlZCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBsZW5ndGggICAgICA0ICAgICAgICAgIFVMT05HICAgICAgbGVuZ3RoIGluIGJ5dGVzICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgbGFuZ3VhZ2UgICAgOCAgICAgICAgICBVTE9ORyAgICAgIE1hYyBsYW5ndWFnZSBjb2RlICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGNvdW50ICAgICAgIDEyICAgICAgICAgVUxPTkcgICAgICBudW1iZXIgb2YgZ3JvdXBzICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGhlYWRlciBpcyBmb2xsb3dlZCBieSBgY291bnQnIGdyb3VwcyBvZiB0aGUgZm9sbG93aW5nIGZvcm1hdDogICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgc3RhcnQgICAgICAgMCAgICAgICAgICBVTE9ORyAgICAgIGZpcnN0IGNoYXJjb2RlICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGVuZCAgICAgICAgIDQgICAgICAgICAgVUxPTkcgICAgICBsYXN0IGNoYXJjb2RlICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBzdGFydElkICAgICA4ICAgICAgICAgIFVMT05HICAgICAgc3RhcnQgZ2x5cGggSUQgZm9yIHRoZSBncm91cCAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZkZWYgVFRfQ09ORklHX0NNQVBfRk9STUFUXzEyCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0NNYXAxMlJlY18KLSAgewotICAgIFRUX0NNYXBSZWMgIGNtYXA7Ci0gICAgRlRfQm9vbCAgICAgdmFsaWQ7Ci0gICAgRlRfVUxvbmcgICAgY3VyX2NoYXJjb2RlOwotICAgIEZUX1VJbnQgICAgIGN1cl9naW5kZXg7Ci0gICAgRlRfVUxvbmcgICAgY3VyX2dyb3VwOwotICAgIEZUX1VMb25nICAgIG51bV9ncm91cHM7Ci0KLSAgfSBUVF9DTWFwMTJSZWMsICpUVF9DTWFwMTI7Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdHRfY21hcDEyX2luaXQoIFRUX0NNYXAxMiAgY21hcCwKLSAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgdGFibGUgKQotICB7Ci0gICAgY21hcC0+Y21hcC5kYXRhICA9IHRhYmxlOwotCi0gICAgdGFibGUgICAgICAgICAgICs9IDEyOwotICAgIGNtYXAtPm51bV9ncm91cHMgPSBGVF9QRUVLX1VMT05HKCB0YWJsZSApOwotCi0gICAgY21hcC0+dmFsaWQgICAgICA9IDA7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdHRfY21hcDEyX3ZhbGlkYXRlKCBGVF9CeXRlKiAgICAgIHRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1ZhbGlkYXRvciAgdmFsaWQgKQotICB7Ci0gICAgRlRfQnl0ZSogIHA7Ci0gICAgRlRfVUxvbmcgIGxlbmd0aDsKLSAgICBGVF9VTG9uZyAgbnVtX2dyb3VwczsKLQotCi0gICAgaWYgKCB0YWJsZSArIDE2ID4gdmFsaWQtPmxpbWl0ICkKLSAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOwotCi0gICAgcCAgICAgID0gdGFibGUgKyA0OwotICAgIGxlbmd0aCA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgIHAgICAgICAgICAgPSB0YWJsZSArIDEyOwotICAgIG51bV9ncm91cHMgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICBpZiAoIGxlbmd0aCA+IChGVF9VTG9uZykoIHZhbGlkLT5saW1pdCAtIHRhYmxlICkgfHwKLSAgICAgICAgIC8qIGxlbmd0aCA8IDE2ICsgMTIgKiBudW1fZ3JvdXBzID8gKi8KLSAgICAgICAgIGxlbmd0aCA8IDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICggbGVuZ3RoIC0gMTYgKSAvIDEyIDwgbnVtX2dyb3VwcyAgICAgICAgICAgKQotICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICAvKiBjaGVjayBncm91cHMsIHRoZXkgbXVzdCBiZSBpbiBpbmNyZWFzaW5nIG9yZGVyICovCi0gICAgewotICAgICAgRlRfVUxvbmcgIG4sIHN0YXJ0LCBlbmQsIHN0YXJ0X2lkLCBsYXN0ID0gMDsKLQotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9ncm91cHM7IG4rKyApCi0gICAgICB7Ci0gICAgICAgIHN0YXJ0ICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgICBlbmQgICAgICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgICAgc3RhcnRfaWQgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAgICAgaWYgKCBzdGFydCA+IGVuZCApCi0gICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gICAgICAgIGlmICggbiA+IDAgJiYgc3RhcnQgPD0gbGFzdCApCi0gICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gICAgICAgIGlmICggdmFsaWQtPmxldmVsID49IEZUX1ZBTElEQVRFX1RJR0hUICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQzMiAgZCA9IGVuZCAtIHN0YXJ0OwotCi0KLSAgICAgICAgICAvKiBzdGFydF9pZCArIGVuZCAtIHN0YXJ0ID49IFRUX1ZBTElEX0dMWVBIX0NPVU5UKCB2YWxpZCApID8gKi8KLSAgICAgICAgICBpZiAoIGQgPiBUVF9WQUxJRF9HTFlQSF9DT1VOVCggdmFsaWQgKSAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgc3RhcnRfaWQgPj0gVFRfVkFMSURfR0xZUEhfQ09VTlQoIHZhbGlkICkgLSBkICkKLSAgICAgICAgICAgIEZUX0lOVkFMSURfR0xZUEhfSUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBsYXN0ID0gZW5kOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qIHNlYXJjaCB0aGUgaW5kZXggb2YgdGhlIGNoYXJjb2RlIG5leHQgdG8gY21hcC0+Y3VyX2NoYXJjb2RlICovCi0gIC8qIGNtYXAtPmN1cl9ncm91cCBzaG91bGQgYmUgc2V0IHVwIHByb3Blcmx5IGJ5IGNhbGxlciAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIHR0X2NtYXAxMl9uZXh0KCBUVF9DTWFwMTIgIGNtYXAgKQotICB7Ci0gICAgRlRfRmFjZSAgIGZhY2UgPSBjbWFwLT5jbWFwLmNtYXAuY2hhcm1hcC5mYWNlOwotICAgIEZUX0J5dGUqICBwOwotICAgIEZUX1VMb25nICBzdGFydCwgZW5kLCBzdGFydF9pZCwgY2hhcl9jb2RlOwotICAgIEZUX1VMb25nICBuOwotICAgIEZUX1VJbnQgICBnaW5kZXg7Ci0KLQotICAgIGlmICggY21hcC0+Y3VyX2NoYXJjb2RlID49IDB4RkZGRkZGRkZVTCApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICBjaGFyX2NvZGUgPSBjbWFwLT5jdXJfY2hhcmNvZGUgKyAxOwotCi0gICAgZm9yICggbiA9IGNtYXAtPmN1cl9ncm91cDsgbiA8IGNtYXAtPm51bV9ncm91cHM7IG4rKyApCi0gICAgewotICAgICAgcCAgICAgICAgPSBjbWFwLT5jbWFwLmRhdGEgKyAxNiArIDEyICogbjsKLSAgICAgIHN0YXJ0ICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgZW5kICAgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICBzdGFydF9pZCA9IFRUX1BFRUtfVUxPTkcoIHAgKTsKLQotICAgICAgaWYgKCBjaGFyX2NvZGUgPCBzdGFydCApCi0gICAgICAgIGNoYXJfY29kZSA9IHN0YXJ0OwotCi0gICAgQWdhaW46Ci0gICAgICBpZiAoIGNoYXJfY29kZSA8PSBlbmQgKQotICAgICAgewotICAgICAgICAvKiBpZ25vcmUgaW52YWxpZCBncm91cCAqLwotICAgICAgICBpZiAoIHN0YXJ0X2lkID4gMHhGRkZGRkZGRlVMIC0gKCBjaGFyX2NvZGUgLSBzdGFydCApICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBnaW5kZXggPSAoRlRfVUludCkoIHN0YXJ0X2lkICsgKCBjaGFyX2NvZGUgLSBzdGFydCApICk7Ci0KLSAgICAgICAgLyogZG9lcyBmaXJzdCBlbGVtZW50IG9mIGdyb3VwIHBvaW50IHRvIGAubm90ZGVmJyBnbHlwaD8gKi8KLSAgICAgICAgaWYgKCBnaW5kZXggPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGNoYXJfY29kZSA+PSAweEZGRkZGRkZGVUwgKQotICAgICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgICAgY2hhcl9jb2RlKys7Ci0gICAgICAgICAgZ290byBBZ2FpbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGlmIGBnaW5kZXgnIGlzIGludmFsaWQsIHRoZSByZW1haW5pbmcgdmFsdWVzICovCi0gICAgICAgIC8qIGluIHRoaXMgZ3JvdXAgYXJlIGludmFsaWQsIHRvbyAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggZ2luZGV4ID49IChGVF9VSW50KWZhY2UtPm51bV9nbHlwaHMgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGNtYXAtPmN1cl9jaGFyY29kZSA9IGNoYXJfY29kZTsKLSAgICAgICAgY21hcC0+Y3VyX2dpbmRleCAgID0gZ2luZGV4OwotICAgICAgICBjbWFwLT5jdXJfZ3JvdXAgICAgPSBuOwotCi0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgRmFpbDoKLSAgICBjbWFwLT52YWxpZCA9IDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9VSW50Ci0gIHR0X2NtYXAxMl9jaGFyX21hcF9iaW5hcnkoIFRUX0NNYXAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiogIHBjaGFyX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgIG5leHQgKQotICB7Ci0gICAgRlRfVUludCAgICBnaW5kZXggICAgID0gMDsKLSAgICBGVF9CeXRlKiAgIHAgICAgICAgICAgPSBjbWFwLT5kYXRhICsgMTI7Ci0gICAgRlRfVUludDMyICBudW1fZ3JvdXBzID0gVFRfUEVFS19VTE9ORyggcCApOwotICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlICA9ICpwY2hhcl9jb2RlOwotICAgIEZUX1VJbnQzMiAgc3RhcnQsIGVuZCwgc3RhcnRfaWQ7Ci0gICAgRlRfVUludDMyICBtYXgsIG1pbiwgbWlkOwotCi0KLSAgICBpZiAoICFudW1fZ3JvdXBzICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgLyogbWFrZSBjb21waWxlciBoYXBweSAqLwotICAgIG1pZCA9IG51bV9ncm91cHM7Ci0gICAgZW5kID0gMHhGRkZGRkZGRlVMOwotCi0gICAgaWYgKCBuZXh0ICkKLSAgICB7Ci0gICAgICBpZiAoIGNoYXJfY29kZSA+PSAweEZGRkZGRkZGVUwgKQotICAgICAgICByZXR1cm4gMDsKLQotICAgICAgY2hhcl9jb2RlKys7Ci0gICAgfQotCi0gICAgbWluID0gMDsKLSAgICBtYXggPSBudW1fZ3JvdXBzOwotCi0gICAgLyogYmluYXJ5IHNlYXJjaCAqLwotICAgIHdoaWxlICggbWluIDwgbWF4ICkKLSAgICB7Ci0gICAgICBtaWQgPSAoIG1pbiArIG1heCApID4+IDE7Ci0gICAgICBwICAgPSBjbWFwLT5kYXRhICsgMTYgKyAxMiAqIG1pZDsKLQotICAgICAgc3RhcnQgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICBlbmQgICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgICAgaWYgKCBjaGFyX2NvZGUgPCBzdGFydCApCi0gICAgICAgIG1heCA9IG1pZDsKLSAgICAgIGVsc2UgaWYgKCBjaGFyX2NvZGUgPiBlbmQgKQotICAgICAgICBtaW4gPSBtaWQgKyAxOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBzdGFydF9pZCA9IFRUX1BFRUtfVUxPTkcoIHAgKTsKLQotICAgICAgICAvKiByZWplY3QgaW52YWxpZCBnbHlwaCBpbmRleCAqLwotICAgICAgICBpZiAoIHN0YXJ0X2lkID4gMHhGRkZGRkZGRlVMIC0gKCBjaGFyX2NvZGUgLSBzdGFydCApICkKLSAgICAgICAgICBnaW5kZXggPSAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgZ2luZGV4ID0gKEZUX1VJbnQpKCBzdGFydF9pZCArICggY2hhcl9jb2RlIC0gc3RhcnQgKSApOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIG5leHQgKQotICAgIHsKLSAgICAgIEZUX0ZhY2UgICAgZmFjZSAgID0gY21hcC0+Y21hcC5jaGFybWFwLmZhY2U7Ci0gICAgICBUVF9DTWFwMTIgIGNtYXAxMiA9IChUVF9DTWFwMTIpY21hcDsKLQotCi0gICAgICAvKiBpZiBgY2hhcl9jb2RlJyBpcyBub3QgaW4gYW55IGdyb3VwLCB0aGVuIGBtaWQnIGlzICovCi0gICAgICAvKiB0aGUgZ3JvdXAgbmVhcmVzdCB0byBgY2hhcl9jb2RlJyAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIGlmICggY2hhcl9jb2RlID4gZW5kICkKLSAgICAgIHsKLSAgICAgICAgbWlkKys7Ci0gICAgICAgIGlmICggbWlkID09IG51bV9ncm91cHMgKQotICAgICAgICAgIHJldHVybiAwOwotICAgICAgfQotCi0gICAgICBjbWFwMTItPnZhbGlkICAgICAgICA9IDE7Ci0gICAgICBjbWFwMTItPmN1cl9jaGFyY29kZSA9IGNoYXJfY29kZTsKLSAgICAgIGNtYXAxMi0+Y3VyX2dyb3VwICAgID0gbWlkOwotCi0gICAgICBpZiAoIGdpbmRleCA+PSAoRlRfVUludClmYWNlLT5udW1fZ2x5cGhzICkKLSAgICAgICAgZ2luZGV4ID0gMDsKLQotICAgICAgaWYgKCAhZ2luZGV4ICkKLSAgICAgIHsKLSAgICAgICAgdHRfY21hcDEyX25leHQoIGNtYXAxMiApOwotCi0gICAgICAgIGlmICggY21hcDEyLT52YWxpZCApCi0gICAgICAgICAgZ2luZGV4ID0gY21hcDEyLT5jdXJfZ2luZGV4OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBjbWFwMTItPmN1cl9naW5kZXggPSBnaW5kZXg7Ci0KLSAgICAgICpwY2hhcl9jb2RlID0gY21hcDEyLT5jdXJfY2hhcmNvZGU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGdpbmRleDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgdHRfY21hcDEyX2NoYXJfaW5kZXgoIFRUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlICkKLSAgewotICAgIHJldHVybiB0dF9jbWFwMTJfY2hhcl9tYXBfYmluYXJ5KCBjbWFwLCAmY2hhcl9jb2RlLCAwICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludDMyICkKLSAgdHRfY21hcDEyX2NoYXJfbmV4dCggVFRfQ01hcCAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAqcGNoYXJfY29kZSApCi0gIHsKLSAgICBUVF9DTWFwMTIgIGNtYXAxMiA9IChUVF9DTWFwMTIpY21hcDsKLSAgICBGVF9VSW50ICAgIGdpbmRleDsKLQotCi0gICAgLyogbm8gbmVlZCB0byBzZWFyY2ggKi8KLSAgICBpZiAoIGNtYXAxMi0+dmFsaWQgJiYgY21hcDEyLT5jdXJfY2hhcmNvZGUgPT0gKnBjaGFyX2NvZGUgKQotICAgIHsKLSAgICAgIHR0X2NtYXAxMl9uZXh0KCBjbWFwMTIgKTsKLSAgICAgIGlmICggY21hcDEyLT52YWxpZCApCi0gICAgICB7Ci0gICAgICAgIGdpbmRleCAgICAgID0gY21hcDEyLT5jdXJfZ2luZGV4OwotICAgICAgICAqcGNoYXJfY29kZSA9IChGVF9VSW50MzIpY21hcDEyLT5jdXJfY2hhcmNvZGU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGdpbmRleCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGdpbmRleCA9IHR0X2NtYXAxMl9jaGFyX21hcF9iaW5hcnkoIGNtYXAsIHBjaGFyX2NvZGUsIDEgKTsKLQotICAgIHJldHVybiBnaW5kZXg7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwMTJfZ2V0X2luZm8oIFRUX0NNYXAgICAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICBUVF9DTWFwSW5mbyAgKmNtYXBfaW5mbyApCi0gIHsKLSAgICBGVF9CeXRlKiAgcCA9IGNtYXAtPmRhdGEgKyA4OwotCi0KLSAgICBjbWFwX2luZm8tPmZvcm1hdCAgID0gMTI7Ci0gICAgY21hcF9pbmZvLT5sYW5ndWFnZSA9IChGVF9VTG9uZylUVF9QRUVLX1VMT05HKCBwICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9ERUZJTkVfVFRfQ01BUCgKLSAgICB0dF9jbWFwMTJfY2xhc3NfcmVjLAotICAgIHNpemVvZiAoIFRUX0NNYXAxMlJlYyApLAotCi0gICAgKEZUX0NNYXBfSW5pdEZ1bmMpICAgICB0dF9jbWFwMTJfaW5pdCwKLSAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIE5VTEwsCi0gICAgKEZUX0NNYXBfQ2hhckluZGV4RnVuYyl0dF9jbWFwMTJfY2hhcl9pbmRleCwKLSAgICAoRlRfQ01hcF9DaGFyTmV4dEZ1bmMpIHR0X2NtYXAxMl9jaGFyX25leHQsCi0KLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0KLSAgICAxMiwKLSAgICAoVFRfQ01hcF9WYWxpZGF0ZUZ1bmMpdHRfY21hcDEyX3ZhbGlkYXRlLAotICAgIChUVF9DTWFwX0luZm9fR2V0RnVuYyl0dF9jbWFwMTJfZ2V0X2luZm8gKQotCi0jZW5kaWYgLyogVFRfQ09ORklHX0NNQVBfRk9STUFUXzEyICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgIEZPUk1BVCAxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRBQkxFIE9WRVJWSUVXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAtLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgTkFNRSAgICAgICAgT0ZGU0VUICAgICBUWVBFICAgICAgIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBmb3JtYXQgICAgICAwICAgICAgICAgIFVTSE9SVCAgICAgbXVzdCBiZSAxMyAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgcmVzZXJ2ZWQgICAgMiAgICAgICAgICBVU0hPUlQgICAgIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGxlbmd0aCAgICAgIDQgICAgICAgICAgVUxPTkcgICAgICBsZW5ndGggaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBsYW5ndWFnZSAgICA4ICAgICAgICAgIFVMT05HICAgICAgTWFjIGxhbmd1YWdlIGNvZGUgICAgICAgICAgICAgICAgICovCi0gIC8qICAgY291bnQgICAgICAgMTIgICAgICAgICBVTE9ORyAgICAgIG51bWJlciBvZiBncm91cHMgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgaGVhZGVyIGlzIGZvbGxvd2VkIGJ5IGBjb3VudCcgZ3JvdXBzIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBzdGFydCAgICAgICAwICAgICAgICAgIFVMT05HICAgICAgZmlyc3QgY2hhcmNvZGUgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZW5kICAgICAgICAgNCAgICAgICAgICBVTE9ORyAgICAgIGxhc3QgY2hhcmNvZGUgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGdseXBoSWQgICAgIDggICAgICAgICAgVUxPTkcgICAgICBnbHlwaCBJRCBmb3IgdGhlIHdob2xlIGdyb3VwICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTMKLQotICB0eXBlZGVmIHN0cnVjdCAgVFRfQ01hcDEzUmVjXwotICB7Ci0gICAgVFRfQ01hcFJlYyAgY21hcDsKLSAgICBGVF9Cb29sICAgICB2YWxpZDsKLSAgICBGVF9VTG9uZyAgICBjdXJfY2hhcmNvZGU7Ci0gICAgRlRfVUludCAgICAgY3VyX2dpbmRleDsKLSAgICBGVF9VTG9uZyAgICBjdXJfZ3JvdXA7Ci0gICAgRlRfVUxvbmcgICAgbnVtX2dyb3VwczsKLQotICB9IFRUX0NNYXAxM1JlYywgKlRUX0NNYXAxMzsKLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwMTNfaW5pdCggVFRfQ01hcDEzICBjbWFwLAotICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICB0YWJsZSApCi0gIHsKLSAgICBjbWFwLT5jbWFwLmRhdGEgID0gdGFibGU7Ci0KLSAgICB0YWJsZSAgICAgICAgICAgKz0gMTI7Ci0gICAgY21hcC0+bnVtX2dyb3VwcyA9IEZUX1BFRUtfVUxPTkcoIHRhYmxlICk7Ci0KLSAgICBjbWFwLT52YWxpZCAgICAgID0gMDsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwMTNfdmFsaWRhdGUoIEZUX0J5dGUqICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICB2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlKiAgcDsKLSAgICBGVF9VTG9uZyAgbGVuZ3RoOwotICAgIEZUX1VMb25nICBudW1fZ3JvdXBzOwotCi0KLSAgICBpZiAoIHRhYmxlICsgMTYgPiB2YWxpZC0+bGltaXQgKQotICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICBwICAgICAgPSB0YWJsZSArIDQ7Ci0gICAgbGVuZ3RoID0gVFRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgcCAgICAgICAgICA9IHRhYmxlICsgMTI7Ci0gICAgbnVtX2dyb3VwcyA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgIGlmICggbGVuZ3RoID4gKEZUX1VMb25nKSggdmFsaWQtPmxpbWl0IC0gdGFibGUgKSB8fAotICAgICAgICAgLyogbGVuZ3RoIDwgMTYgKyAxMiAqIG51bV9ncm91cHMgPyAqLwotICAgICAgICAgbGVuZ3RoIDwgMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgKCBsZW5ndGggLSAxNiApIC8gMTIgPCBudW1fZ3JvdXBzICAgICAgICAgICApCi0gICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgIC8qIGNoZWNrIGdyb3VwcywgdGhleSBtdXN0IGJlIGluIGluY3JlYXNpbmcgb3JkZXIgKi8KLSAgICB7Ci0gICAgICBGVF9VTG9uZyAgbiwgc3RhcnQsIGVuZCwgZ2x5cGhfaWQsIGxhc3QgPSAwOwotCi0KLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX2dyb3VwczsgbisrICkKLSAgICAgIHsKLSAgICAgICAgc3RhcnQgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICAgIGVuZCAgICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgICBnbHlwaF9pZCA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgICAgICBpZiAoIHN0YXJ0ID4gZW5kICkKLSAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICAgICAgaWYgKCBuID4gMCAmJiBzdGFydCA8PSBsYXN0ICkKLSAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICAgICAgaWYgKCB2YWxpZC0+bGV2ZWwgPj0gRlRfVkFMSURBVEVfVElHSFQgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBnbHlwaF9pZCA+PSBUVF9WQUxJRF9HTFlQSF9DT1VOVCggdmFsaWQgKSApCi0gICAgICAgICAgICBGVF9JTlZBTElEX0dMWVBIX0lEOwotICAgICAgICB9Ci0KLSAgICAgICAgbGFzdCA9IGVuZDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKiBzZWFyY2ggdGhlIGluZGV4IG9mIHRoZSBjaGFyY29kZSBuZXh0IHRvIGNtYXAtPmN1cl9jaGFyY29kZSAqLwotICAvKiBjbWFwLT5jdXJfZ3JvdXAgc2hvdWxkIGJlIHNldCB1cCBwcm9wZXJseSBieSBjYWxsZXIgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICB0dF9jbWFwMTNfbmV4dCggVFRfQ01hcDEzICBjbWFwICkKLSAgewotICAgIEZUX0ZhY2UgICBmYWNlID0gY21hcC0+Y21hcC5jbWFwLmNoYXJtYXAuZmFjZTsKLSAgICBGVF9CeXRlKiAgcDsKLSAgICBGVF9VTG9uZyAgc3RhcnQsIGVuZCwgZ2x5cGhfaWQsIGNoYXJfY29kZTsKLSAgICBGVF9VTG9uZyAgbjsKLSAgICBGVF9VSW50ICAgZ2luZGV4OwotCi0KLSAgICBpZiAoIGNtYXAtPmN1cl9jaGFyY29kZSA+PSAweEZGRkZGRkZGVUwgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgY2hhcl9jb2RlID0gY21hcC0+Y3VyX2NoYXJjb2RlICsgMTsKLQotICAgIGZvciAoIG4gPSBjbWFwLT5jdXJfZ3JvdXA7IG4gPCBjbWFwLT5udW1fZ3JvdXBzOyBuKysgKQotICAgIHsKLSAgICAgIHAgICAgICAgID0gY21hcC0+Y21hcC5kYXRhICsgMTYgKyAxMiAqIG47Ci0gICAgICBzdGFydCAgICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgIGVuZCAgICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgZ2x5cGhfaWQgPSBUVF9QRUVLX1VMT05HKCBwICk7Ci0KLSAgICAgIGlmICggY2hhcl9jb2RlIDwgc3RhcnQgKQotICAgICAgICBjaGFyX2NvZGUgPSBzdGFydDsKLQotICAgICAgaWYgKCBjaGFyX2NvZGUgPD0gZW5kICkKLSAgICAgIHsKLSAgICAgICAgZ2luZGV4ID0gKEZUX1VJbnQpZ2x5cGhfaWQ7Ci0KLSAgICAgICAgaWYgKCBnaW5kZXggJiYgZ2luZGV4IDwgKEZUX1VJbnQpZmFjZS0+bnVtX2dseXBocyApCi0gICAgICAgIHsKLSAgICAgICAgICBjbWFwLT5jdXJfY2hhcmNvZGUgPSBjaGFyX2NvZGU7Ci0gICAgICAgICAgY21hcC0+Y3VyX2dpbmRleCAgID0gZ2luZGV4OwotICAgICAgICAgIGNtYXAtPmN1cl9ncm91cCAgICA9IG47Ci0KLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgRmFpbDoKLSAgICBjbWFwLT52YWxpZCA9IDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9VSW50Ci0gIHR0X2NtYXAxM19jaGFyX21hcF9iaW5hcnkoIFRUX0NNYXAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiogIHBjaGFyX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgIG5leHQgKQotICB7Ci0gICAgRlRfVUludCAgICBnaW5kZXggICAgID0gMDsKLSAgICBGVF9CeXRlKiAgIHAgICAgICAgICAgPSBjbWFwLT5kYXRhICsgMTI7Ci0gICAgRlRfVUludDMyICBudW1fZ3JvdXBzID0gVFRfUEVFS19VTE9ORyggcCApOwotICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlICA9ICpwY2hhcl9jb2RlOwotICAgIEZUX1VJbnQzMiAgc3RhcnQsIGVuZDsKLSAgICBGVF9VSW50MzIgIG1heCwgbWluLCBtaWQ7Ci0KLQotICAgIGlmICggIW51bV9ncm91cHMgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCi0gICAgbWlkID0gbnVtX2dyb3VwczsKLSAgICBlbmQgPSAweEZGRkZGRkZGVUw7Ci0KLSAgICBpZiAoIG5leHQgKQotICAgIHsKLSAgICAgIGlmICggY2hhcl9jb2RlID49IDB4RkZGRkZGRkZVTCApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgICBjaGFyX2NvZGUrKzsKLSAgICB9Ci0KLSAgICBtaW4gPSAwOwotICAgIG1heCA9IG51bV9ncm91cHM7Ci0KLSAgICAvKiBiaW5hcnkgc2VhcmNoICovCi0gICAgd2hpbGUgKCBtaW4gPCBtYXggKQotICAgIHsKLSAgICAgIG1pZCA9ICggbWluICsgbWF4ICkgPj4gMTsKLSAgICAgIHAgICA9IGNtYXAtPmRhdGEgKyAxNiArIDEyICogbWlkOwotCi0gICAgICBzdGFydCA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgIGVuZCAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgICBpZiAoIGNoYXJfY29kZSA8IHN0YXJ0ICkKLSAgICAgICAgbWF4ID0gbWlkOwotICAgICAgZWxzZSBpZiAoIGNoYXJfY29kZSA+IGVuZCApCi0gICAgICAgIG1pbiA9IG1pZCArIDE7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGdpbmRleCA9IChGVF9VSW50KVRUX1BFRUtfVUxPTkcoIHAgKTsKLQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIG5leHQgKQotICAgIHsKLSAgICAgIEZUX0ZhY2UgICAgZmFjZSAgID0gY21hcC0+Y21hcC5jaGFybWFwLmZhY2U7Ci0gICAgICBUVF9DTWFwMTMgIGNtYXAxMyA9IChUVF9DTWFwMTMpY21hcDsKLQotCi0gICAgICAvKiBpZiBgY2hhcl9jb2RlJyBpcyBub3QgaW4gYW55IGdyb3VwLCB0aGVuIGBtaWQnIGlzICovCi0gICAgICAvKiB0aGUgZ3JvdXAgbmVhcmVzdCB0byBgY2hhcl9jb2RlJyAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIGlmICggY2hhcl9jb2RlID4gZW5kICkKLSAgICAgIHsKLSAgICAgICAgbWlkKys7Ci0gICAgICAgIGlmICggbWlkID09IG51bV9ncm91cHMgKQotICAgICAgICAgIHJldHVybiAwOwotICAgICAgfQotCi0gICAgICBjbWFwMTMtPnZhbGlkICAgICAgICA9IDE7Ci0gICAgICBjbWFwMTMtPmN1cl9jaGFyY29kZSA9IGNoYXJfY29kZTsKLSAgICAgIGNtYXAxMy0+Y3VyX2dyb3VwICAgID0gbWlkOwotCi0gICAgICBpZiAoIGdpbmRleCA+PSAoRlRfVUludClmYWNlLT5udW1fZ2x5cGhzICkKLSAgICAgICAgZ2luZGV4ID0gMDsKLQotICAgICAgaWYgKCAhZ2luZGV4ICkKLSAgICAgIHsKLSAgICAgICAgdHRfY21hcDEzX25leHQoIGNtYXAxMyApOwotCi0gICAgICAgIGlmICggY21hcDEzLT52YWxpZCApCi0gICAgICAgICAgZ2luZGV4ID0gY21hcDEzLT5jdXJfZ2luZGV4OwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBjbWFwMTMtPmN1cl9naW5kZXggPSBnaW5kZXg7Ci0KLSAgICAgICpwY2hhcl9jb2RlID0gY21hcDEzLT5jdXJfY2hhcmNvZGU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGdpbmRleDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgdHRfY21hcDEzX2NoYXJfaW5kZXgoIFRUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcl9jb2RlICkKLSAgewotICAgIHJldHVybiB0dF9jbWFwMTNfY2hhcl9tYXBfYmluYXJ5KCBjbWFwLCAmY2hhcl9jb2RlLCAwICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludDMyICkKLSAgdHRfY21hcDEzX2NoYXJfbmV4dCggVFRfQ01hcCAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAqcGNoYXJfY29kZSApCi0gIHsKLSAgICBUVF9DTWFwMTMgIGNtYXAxMyA9IChUVF9DTWFwMTMpY21hcDsKLSAgICBGVF9VSW50ICAgIGdpbmRleDsKLQotCi0gICAgLyogbm8gbmVlZCB0byBzZWFyY2ggKi8KLSAgICBpZiAoIGNtYXAxMy0+dmFsaWQgJiYgY21hcDEzLT5jdXJfY2hhcmNvZGUgPT0gKnBjaGFyX2NvZGUgKQotICAgIHsKLSAgICAgIHR0X2NtYXAxM19uZXh0KCBjbWFwMTMgKTsKLSAgICAgIGlmICggY21hcDEzLT52YWxpZCApCi0gICAgICB7Ci0gICAgICAgIGdpbmRleCAgICAgID0gY21hcDEzLT5jdXJfZ2luZGV4OwotICAgICAgICAqcGNoYXJfY29kZSA9IGNtYXAxMy0+Y3VyX2NoYXJjb2RlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBnaW5kZXggPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBnaW5kZXggPSB0dF9jbWFwMTNfY2hhcl9tYXBfYmluYXJ5KCBjbWFwLCBwY2hhcl9jb2RlLCAxICk7Ci0KLSAgICByZXR1cm4gZ2luZGV4OwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdHRfY21hcDEzX2dldF9pbmZvKCBUVF9DTWFwICAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcEluZm8gICpjbWFwX2luZm8gKQotICB7Ci0gICAgRlRfQnl0ZSogIHAgPSBjbWFwLT5kYXRhICsgODsKLQotCi0gICAgY21hcF9pbmZvLT5mb3JtYXQgICA9IDEzOwotICAgIGNtYXBfaW5mby0+bGFuZ3VhZ2UgPSAoRlRfVUxvbmcpVFRfUEVFS19VTE9ORyggcCApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfREVGSU5FX1RUX0NNQVAoCi0gICAgdHRfY21hcDEzX2NsYXNzX3JlYywKLSAgICBzaXplb2YgKCBUVF9DTWFwMTNSZWMgKSwKLQotICAgIChGVF9DTWFwX0luaXRGdW5jKSAgICAgdHRfY21hcDEzX2luaXQsCi0gICAgKEZUX0NNYXBfRG9uZUZ1bmMpICAgICBOVUxMLAotICAgIChGVF9DTWFwX0NoYXJJbmRleEZ1bmMpdHRfY21hcDEzX2NoYXJfaW5kZXgsCi0gICAgKEZUX0NNYXBfQ2hhck5leHRGdW5jKSB0dF9jbWFwMTNfY2hhcl9uZXh0LAotCi0gICAgTlVMTCwKLSAgICBOVUxMLAotICAgIE5VTEwsCi0gICAgTlVMTCwKLSAgICBOVUxMLAotCi0gICAgMTMsCi0gICAgKFRUX0NNYXBfVmFsaWRhdGVGdW5jKXR0X2NtYXAxM192YWxpZGF0ZSwKLSAgICAoVFRfQ01hcF9JbmZvX0dldEZ1bmMpdHRfY21hcDEzX2dldF9pbmZvICkKLQotI2VuZGlmIC8qIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xMyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9STUFUIDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUQUJMRSBPVkVSVklFVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIE5BTUUgICAgICAgICBPRkZTRVQgIFRZUEUgICAgREVTQ1JJUFRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgZm9ybWF0ICAgICAgICAgMCAgICAgVVNIT1JUICBtdXN0IGJlIDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIGxlbmd0aCAgICAgICAgIDIgICAgIFVMT05HICAgdGFibGUgbGVuZ3RoIGluIGJ5dGVzICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBudW1TZWxlY3RvciAgICA2ICAgICBVTE9ORyAgIG51bWJlciBvZiB2YXJpYXRpb24gc2VsLiByZWNvcmRzICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGb2xsb3dlZCBieSBudW1TZWxlY3RvciByZWNvcmRzLCBlYWNoIG9mIHdoaWNoIGxvb2tzIGxpa2UgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgdmFyU2VsZWN0b3IgICAgMCAgICAgVUlOVDI0ICBVbmljb2RlIGNvZGVwb2ludCBvZiBzZWwuICAgICAgICAgICAgICAqLwotICAvKiAgIGRlZmF1bHRPZmYgICAgIDMgICAgIFVMT05HICAgb2Zmc2V0IHRvIGEgZGVmYXVsdCBVVlMgdGFibGUgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJpbmcgYW55IHZhcmlhbnRzIHRvIGJlIGZvdW5kIGluICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbm9ybWFsIFVuaWNvZGUgc3VidGFibGUuICAgICAgICAgICAqLwotICAvKiAgIG5vbkRlZk9mZiAgICAgIDcgICAgIFVMT05HICAgb2Zmc2V0IHRvIGEgbm9uLWRlZmF1bHQgVVZTIHRhYmxlICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJpbmcgYW55IHZhcmlhbnRzIG5vdCBpbiB0aGUgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZCBjbWFwLCB3aXRoIEdJRHMgaGVyZSAgICAgICAgICAqLwotICAvKiAoZWl0aGVyIG9mZnNldCBtYXkgYmUgMCBOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNlbGVjdG9ycyBhcmUgc29ydGVkIGJ5IGNvZGUgcG9pbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSBkZWZhdWx0IFVuaWNvZGUgVmFyaWF0aW9uIFNlbGVjdG9yIChVVlMpIHN1YnRhYmxlIGlzIGp1c3QgYSBsaXN0IG9mICovCi0gIC8qIHJhbmdlcyBvZiBjb2RlIHBvaW50cyB3aGljaCBhcmUgdG8gYmUgZm91bmQgaW4gdGhlIHN0YW5kYXJkIGNtYXAuICBObyAqLwotICAvKiBnbHlwaCBJRHMgKEdJRHMpIGhlcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgbnVtUmFuZ2VzICAgICAgMCAgICAgVUxPTkcgICBudW1iZXIgb2YgcmFuZ2VzIGZvbGxvd2luZyAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSByYW5nZSBsb29rcyBsaWtlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHVuaVN0YXJ0ICAgICAgIDAgICAgIFVJTlQyNCAgY29kZSBwb2ludCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgYWRkaXRpb25hbENudCAgMyAgICAgVUJZVEUgICBjb3VudCBvZiBhZGRpdGlvbmFsIGNoYXJhY3RlcnMgaW4gdGhpcyAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgKHplcm8gbWVhbnMgYSByYW5nZSBvZiBhIHNpbmdsZSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBSYW5nZXMgYXJlIHNvcnRlZCBieSBgdW5pU3RhcnQnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEEgbm9uLWRlZmF1bHQgVW5pY29kZSBWYXJpYXRpb24gU2VsZWN0b3IgKFVWUykgc3VidGFibGUgaXMgYSBsaXN0IG9mICAqLwotICAvKiBtYXBwaW5ncyBmcm9tIGNvZGVwb2ludCB0byBHSUQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgbnVtTWFwcGluZ3MgICAgMCAgICAgVUxPTkcgICBudW1iZXIgb2YgbWFwcGluZ3MgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQSByYW5nZSBsb29rcyBsaWtlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIHVuaVN0YXJ0ICAgICAgIDAgICAgIFVJTlQyNCAgY29kZSBwb2ludCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgR0lEICAgICAgICAgICAgMyAgICAgVVNIT1JUICBhbmQgaXRzIEdJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUmFuZ2VzIGFyZSBzb3J0ZWQgYnkgYHVuaVN0YXJ0Jy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMTQKLQotICB0eXBlZGVmIHN0cnVjdCAgVFRfQ01hcDE0UmVjXwotICB7Ci0gICAgVFRfQ01hcFJlYyAgY21hcDsKLSAgICBGVF9VTG9uZyAgICBudW1fc2VsZWN0b3JzOwotCi0gICAgLyogVGhpcyBhcnJheSBpcyB1c2VkIHRvIHN0b3JlIHRoZSByZXN1bHRzIG9mIHZhcmlvdXMKLSAgICAgKiBjbWFwIDE0IHF1ZXJ5IGZ1bmN0aW9ucy4gIFRoZSBkYXRhIGlzIG92ZXJ3cml0dGVuCi0gICAgICogb24gZWFjaCBjYWxsIHRvIHRoZXNlIGZ1bmN0aW9ucy4KLSAgICAgKi8KLSAgICBGVF9VSW50MzIgICBtYXhfcmVzdWx0czsKLSAgICBGVF9VSW50MzIqICByZXN1bHRzOwotICAgIEZUX01lbW9yeSAgIG1lbW9yeTsKLQotICB9IFRUX0NNYXAxNFJlYywgKlRUX0NNYXAxNDsKLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIHR0X2NtYXAxNF9kb25lKCBUVF9DTWFwMTQgIGNtYXAgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBjbWFwLT5tZW1vcnk7Ci0KLQotICAgIGNtYXAtPm1heF9yZXN1bHRzID0gMDsKLSAgICBpZiAoIG1lbW9yeSAhPSBOVUxMICYmIGNtYXAtPnJlc3VsdHMgIT0gTlVMTCApCi0gICAgICBGVF9GUkVFKCBjbWFwLT5yZXN1bHRzICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9jbWFwMTRfZW5zdXJlKCBUVF9DTWFwMTQgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgbnVtX3Jlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICkKLSAgewotICAgIEZUX1VJbnQzMiAgb2xkX21heCA9IGNtYXAtPm1heF9yZXN1bHRzOwotICAgIEZUX0Vycm9yICAgZXJyb3IgICA9IEZUX0Vycl9PazsKLQotCi0gICAgaWYgKCBudW1fcmVzdWx0cyA+IGNtYXAtPm1heF9yZXN1bHRzICkKLSAgICB7Ci0gICAgICAgY21hcC0+bWVtb3J5ID0gbWVtb3J5OwotCi0gICAgICAgaWYgKCBGVF9RUkVORVdfQVJSQVkoIGNtYXAtPnJlc3VsdHMsIG9sZF9tYXgsIG51bV9yZXN1bHRzICkgKQotICAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICAgY21hcC0+bWF4X3Jlc3VsdHMgPSBudW1fcmVzdWx0czsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwMTRfaW5pdCggVFRfQ01hcDE0ICBjbWFwLAotICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICB0YWJsZSApCi0gIHsKLSAgICBjbWFwLT5jbWFwLmRhdGEgPSB0YWJsZTsKLQotICAgIHRhYmxlICAgICAgICAgICAgICAgKz0gNjsKLSAgICBjbWFwLT5udW1fc2VsZWN0b3JzICA9IEZUX1BFRUtfVUxPTkcoIHRhYmxlICk7Ci0gICAgY21hcC0+bWF4X3Jlc3VsdHMgICAgPSAwOwotICAgIGNtYXAtPnJlc3VsdHMgICAgICAgID0gTlVMTDsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICB0dF9jbWFwMTRfdmFsaWRhdGUoIEZUX0J5dGUqICAgICAgdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVmFsaWRhdG9yICB2YWxpZCApCi0gIHsKLSAgICBGVF9CeXRlKiAgcDsKLSAgICBGVF9VTG9uZyAgbGVuZ3RoOwotICAgIEZUX1VMb25nICBudW1fc2VsZWN0b3JzOwotCi0KLSAgICBpZiAoIHRhYmxlICsgMiArIDQgKyA0ID4gdmFsaWQtPmxpbWl0ICkKLSAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOwotCi0gICAgcCAgICAgICAgICAgICA9IHRhYmxlICsgMjsKLSAgICBsZW5ndGggICAgICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgIG51bV9zZWxlY3RvcnMgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICBpZiAoIGxlbmd0aCA+IChGVF9VTG9uZykoIHZhbGlkLT5saW1pdCAtIHRhYmxlICkgfHwKLSAgICAgICAgIC8qIGxlbmd0aCA8IDEwICsgMTEgKiBudW1fc2VsZWN0b3JzID8gKi8KLSAgICAgICAgIGxlbmd0aCA8IDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICggbGVuZ3RoIC0gMTAgKSAvIDExIDwgbnVtX3NlbGVjdG9ycyAgICAgICAgKQotICAgICAgRlRfSU5WQUxJRF9UT09fU0hPUlQ7Ci0KLSAgICAvKiBjaGVjayBzZWxlY3RvcnMsIHRoZXkgbXVzdCBiZSBpbiBpbmNyZWFzaW5nIG9yZGVyICovCi0gICAgewotICAgICAgLyogd2Ugc3RhcnQgbGFzdFZhclNlbCBhdCAxIGJlY2F1c2UgYSB2YXJpYW50IHNlbGVjdG9yIHZhbHVlIG9mIDAKLSAgICAgICAqIGlzbid0IHZhbGlkLgotICAgICAgICovCi0gICAgICBGVF9VTG9uZyAgbiwgbGFzdFZhclNlbCA9IDE7Ci0KLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fc2VsZWN0b3JzOyBuKysgKQotICAgICAgewotICAgICAgICBGVF9VTG9uZyAgdmFyU2VsICAgID0gVFRfTkVYVF9VSU5UMjQoIHAgKTsKLSAgICAgICAgRlRfVUxvbmcgIGRlZk9mZiAgICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgICAgRlRfVUxvbmcgIG5vbmRlZk9mZiA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLQotCi0gICAgICAgIGlmICggZGVmT2ZmID49IGxlbmd0aCB8fCBub25kZWZPZmYgPj0gbGVuZ3RoICkKLSAgICAgICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgICAgICBpZiAoIHZhclNlbCA8IGxhc3RWYXJTZWwgKQotICAgICAgICAgIEZUX0lOVkFMSURfREFUQTsKLQotICAgICAgICBsYXN0VmFyU2VsID0gdmFyU2VsICsgMTsKLQotICAgICAgICAvKiBjaGVjayB0aGUgZGVmYXVsdCB0YWJsZSAodGhlc2UgZ2x5cGhzIHNob3VsZCBiZSByZWFjaGVkICAgICAqLwotICAgICAgICAvKiB0aHJvdWdoIHRoZSBub3JtYWwgVW5pY29kZSBjbWFwLCBubyBHSURzLCBqdXN0IGNoZWNrIG9yZGVyKSAqLwotICAgICAgICBpZiAoIGRlZk9mZiAhPSAwICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0J5dGUqICBkZWZwICAgICAgPSB0YWJsZSArIGRlZk9mZjsKLSAgICAgICAgICBGVF9VTG9uZyAgbnVtUmFuZ2VzID0gVFRfTkVYVF9VTE9ORyggZGVmcCApOwotICAgICAgICAgIEZUX1VMb25nICBpOwotICAgICAgICAgIEZUX1VMb25nICBsYXN0QmFzZSAgPSAwOwotCi0KLSAgICAgICAgICAvKiBkZWZwICsgbnVtUmFuZ2VzICogNCA+IHZhbGlkLT5saW1pdCA/ICovCi0gICAgICAgICAgaWYgKCBudW1SYW5nZXMgPiAoRlRfVUxvbmcpKCB2YWxpZC0+bGltaXQgLSBkZWZwICkgLyA0ICkKLSAgICAgICAgICAgIEZUX0lOVkFMSURfVE9PX1NIT1JUOwotCi0gICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBudW1SYW5nZXM7ICsraSApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVUxvbmcgIGJhc2UgPSBUVF9ORVhUX1VJTlQyNCggZGVmcCApOwotICAgICAgICAgICAgRlRfVUxvbmcgIGNudCAgPSBGVF9ORVhUX0JZVEUoIGRlZnAgKTsKLQotCi0gICAgICAgICAgICBpZiAoIGJhc2UgKyBjbnQgPj0gMHgxMTAwMDBVTCApICAgICAgICAgICAgICAvKiBlbmQgb2YgVW5pY29kZSAqLwotICAgICAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICAgICAgICAgIGlmICggYmFzZSA8IGxhc3RCYXNlICkKLSAgICAgICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gICAgICAgICAgICBsYXN0QmFzZSA9IGJhc2UgKyBjbnQgKyAxVTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBhbmQgdGhlIG5vbi1kZWZhdWx0IHRhYmxlICh0aGVzZSBnbHlwaHMgYXJlIHNwZWNpZmllZCBoZXJlKSAqLwotICAgICAgICBpZiAoIG5vbmRlZk9mZiAhPSAwICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0J5dGUqICBuZHAgICAgICAgICA9IHRhYmxlICsgbm9uZGVmT2ZmOwotICAgICAgICAgIEZUX1VMb25nICBudW1NYXBwaW5ncyA9IFRUX05FWFRfVUxPTkcoIG5kcCApOwotICAgICAgICAgIEZUX1VMb25nICBpLCBsYXN0VW5pICA9IDA7Ci0KLQotICAgICAgICAgIC8qIG51bU1hcHBpbmdzICogNCA+IChGVF9VTG9uZykoIHZhbGlkLT5saW1pdCAtIG5kcCApID8gKi8KLSAgICAgICAgICBpZiAoIG51bU1hcHBpbmdzID4gKCAoRlRfVUxvbmcpKCB2YWxpZC0+bGltaXQgLSBuZHAgKSApIC8gNCApCi0gICAgICAgICAgICBGVF9JTlZBTElEX1RPT19TSE9SVDsKLQotICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtTWFwcGluZ3M7ICsraSApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVUxvbmcgIHVuaSA9IFRUX05FWFRfVUlOVDI0KCBuZHAgKTsKLSAgICAgICAgICAgIEZUX1VMb25nICBnaWQgPSBUVF9ORVhUX1VTSE9SVCggbmRwICk7Ci0KLQotICAgICAgICAgICAgaWYgKCB1bmkgPj0gMHgxMTAwMDBVTCApICAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIFVuaWNvZGUgKi8KLSAgICAgICAgICAgICAgRlRfSU5WQUxJRF9EQVRBOwotCi0gICAgICAgICAgICBpZiAoIHVuaSA8IGxhc3RVbmkgKQotICAgICAgICAgICAgICBGVF9JTlZBTElEX0RBVEE7Ci0KLSAgICAgICAgICAgIGxhc3RVbmkgPSB1bmkgKyAxVTsKLQotICAgICAgICAgICAgaWYgKCB2YWxpZC0+bGV2ZWwgPj0gRlRfVkFMSURBVEVfVElHSFQgICAgJiYKLSAgICAgICAgICAgICAgICAgZ2lkID49IFRUX1ZBTElEX0dMWVBIX0NPVU5UKCB2YWxpZCApICkKLSAgICAgICAgICAgICAgRlRfSU5WQUxJRF9HTFlQSF9JRDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX1VJbnQgKQotICB0dF9jbWFwMTRfY2hhcl9pbmRleCggVFRfQ01hcCAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBjbWFwICk7Ci0gICAgRlRfVU5VU0VEKCBjaGFyX2NvZGUgKTsKLQotICAgIC8qIFRoaXMgY2FuJ3QgaGFwcGVuICovCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludDMyICkKLSAgdHRfY21hcDE0X2NoYXJfbmV4dCggVFRfQ01hcCAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludDMyICAqcGNoYXJfY29kZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGNtYXAgKTsKLQotICAgIC8qIFRoaXMgY2FuJ3QgaGFwcGVuICovCi0gICAgKnBjaGFyX2NvZGUgPSAwOwotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgdHRfY21hcDE0X2dldF9pbmZvKCBUVF9DTWFwICAgICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcEluZm8gICpjbWFwX2luZm8gKQotICB7Ci0gICAgRlRfVU5VU0VEKCBjbWFwICk7Ci0KLSAgICBjbWFwX2luZm8tPmZvcm1hdCAgID0gMTQ7Ci0gICAgLyogc3VidGFibGUgMTQgZG9lcyBub3QgZGVmaW5lIGEgbGFuZ3VhZ2UgZmllbGQgKi8KLSAgICBjbWFwX2luZm8tPmxhbmd1YWdlID0gMHhGRkZGRkZGRlVMOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1VJbnQKLSAgdHRfY21hcDE0X2NoYXJfbWFwX2RlZl9iaW5hcnkoIEZUX0J5dGUgICAgKmJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfVUludDMyICBudW1SYW5nZXMgPSBUVF9QRUVLX1VMT05HKCBiYXNlICk7Ci0gICAgRlRfVUludDMyICBtYXgsIG1pbjsKLQotCi0gICAgbWluID0gMDsKLSAgICBtYXggPSBudW1SYW5nZXM7Ci0KLSAgICBiYXNlICs9IDQ7Ci0KLSAgICAvKiBiaW5hcnkgc2VhcmNoICovCi0gICAgd2hpbGUgKCBtaW4gPCBtYXggKQotICAgIHsKLSAgICAgIEZUX1VJbnQzMiAgbWlkICAgPSAoIG1pbiArIG1heCApID4+IDE7Ci0gICAgICBGVF9CeXRlKiAgIHAgICAgID0gYmFzZSArIDQgKiBtaWQ7Ci0gICAgICBGVF9VTG9uZyAgIHN0YXJ0ID0gVFRfTkVYVF9VSU5UMjQoIHAgKTsKLSAgICAgIEZUX1VJbnQgICAgY250ICAgPSBGVF9ORVhUX0JZVEUoIHAgKTsKLQotCi0gICAgICBpZiAoIGNoYXJfY29kZSA8IHN0YXJ0ICkKLSAgICAgICAgbWF4ID0gbWlkOwotICAgICAgZWxzZSBpZiAoIGNoYXJfY29kZSA+IHN0YXJ0K2NudCApCi0gICAgICAgIG1pbiA9IG1pZCArIDE7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1VJbnQKLSAgdHRfY21hcDE0X2NoYXJfbWFwX25vbmRlZl9iaW5hcnkoIEZUX0J5dGUgICAgKmJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgICBjaGFyX2NvZGUgKQotICB7Ci0gICAgRlRfVUludDMyICBudW1NYXBwaW5ncyA9IFRUX1BFRUtfVUxPTkcoIGJhc2UgKTsKLSAgICBGVF9VSW50MzIgIG1heCwgbWluOwotCi0KLSAgICBtaW4gPSAwOwotICAgIG1heCA9IG51bU1hcHBpbmdzOwotCi0gICAgYmFzZSArPSA0OwotCi0gICAgLyogYmluYXJ5IHNlYXJjaCAqLwotICAgIHdoaWxlICggbWluIDwgbWF4ICkKLSAgICB7Ci0gICAgICBGVF9VSW50MzIgIG1pZCA9ICggbWluICsgbWF4ICkgPj4gMTsKLSAgICAgIEZUX0J5dGUqICAgcCAgID0gYmFzZSArIDUgKiBtaWQ7Ci0gICAgICBGVF9VSW50MzIgIHVuaSA9IChGVF9VSW50MzIpVFRfTkVYVF9VSU5UMjQoIHAgKTsKLQotCi0gICAgICBpZiAoIGNoYXJfY29kZSA8IHVuaSApCi0gICAgICAgIG1heCA9IG1pZDsKLSAgICAgIGVsc2UgaWYgKCBjaGFyX2NvZGUgPiB1bmkgKQotICAgICAgICBtaW4gPSBtaWQgKyAxOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gVFRfUEVFS19VU0hPUlQoIHAgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0J5dGUqCi0gIHR0X2NtYXAxNF9maW5kX3ZhcmlhbnQoIEZUX0J5dGUgICAgKmJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgIHZhcmlhbnRDb2RlICkKLSAgewotICAgIEZUX1VJbnQzMiAgbnVtVmFyID0gVFRfUEVFS19VTE9ORyggYmFzZSApOwotICAgIEZUX1VJbnQzMiAgbWF4LCBtaW47Ci0KLQotICAgIG1pbiA9IDA7Ci0gICAgbWF4ID0gbnVtVmFyOwotCi0gICAgYmFzZSArPSA0OwotCi0gICAgLyogYmluYXJ5IHNlYXJjaCAqLwotICAgIHdoaWxlICggbWluIDwgbWF4ICkKLSAgICB7Ci0gICAgICBGVF9VSW50MzIgIG1pZCAgICA9ICggbWluICsgbWF4ICkgPj4gMTsKLSAgICAgIEZUX0J5dGUqICAgcCAgICAgID0gYmFzZSArIDExICogbWlkOwotICAgICAgRlRfVUxvbmcgICB2YXJTZWwgPSBUVF9ORVhUX1VJTlQyNCggcCApOwotCi0KLSAgICAgIGlmICggdmFyaWFudENvZGUgPCB2YXJTZWwgKQotICAgICAgICBtYXggPSBtaWQ7Ci0gICAgICBlbHNlIGlmICggdmFyaWFudENvZGUgPiB2YXJTZWwgKQotICAgICAgICBtaW4gPSBtaWQgKyAxOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gcDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50ICkKLSAgdHRfY21hcDE0X2NoYXJfdmFyX2luZGV4KCBUVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcCAgICB1Y21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50MzIgIGNoYXJjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgdmFyaWFudFNlbGVjdG9yICkKLSAgewotICAgIEZUX0J5dGUqICBwID0gdHRfY21hcDE0X2ZpbmRfdmFyaWFudCggY21hcC0+ZGF0YSArIDYsIHZhcmlhbnRTZWxlY3RvciApOwotICAgIEZUX1VMb25nICBkZWZPZmY7Ci0gICAgRlRfVUxvbmcgIG5vbmRlZk9mZjsKLQotCi0gICAgaWYgKCAhcCApCi0gICAgICByZXR1cm4gMDsKLQotICAgIGRlZk9mZiAgICA9IFRUX05FWFRfVUxPTkcoIHAgKTsKLSAgICBub25kZWZPZmYgPSBUVF9QRUVLX1VMT05HKCBwICk7Ci0KLSAgICBpZiAoIGRlZk9mZiAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICB0dF9jbWFwMTRfY2hhcl9tYXBfZGVmX2JpbmFyeSggY21hcC0+ZGF0YSArIGRlZk9mZiwgY2hhcmNvZGUgKSApCi0gICAgewotICAgICAgLyogVGhpcyBpcyB0aGUgZGVmYXVsdCB2YXJpYW50IG9mIHRoaXMgY2hhcmNvZGUuICBHSUQgbm90IHN0b3JlZCAqLwotICAgICAgLyogaGVyZTsgc3RvcmVkIGluIHRoZSBub3JtYWwgVW5pY29kZSBjaGFybWFwIGluc3RlYWQuICAgICAgICAgICAqLwotICAgICAgcmV0dXJuIHVjbWFwLT5jbWFwLmNsYXp6LT5jaGFyX2luZGV4KCAmdWNtYXAtPmNtYXAsIGNoYXJjb2RlICk7Ci0gICAgfQotCi0gICAgaWYgKCBub25kZWZPZmYgIT0gMCApCi0gICAgICByZXR1cm4gdHRfY21hcDE0X2NoYXJfbWFwX25vbmRlZl9iaW5hcnkoIGNtYXAtPmRhdGEgKyBub25kZWZPZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJjb2RlICk7Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9JbnQgKQotICB0dF9jbWFwMTRfY2hhcl92YXJfaXNkZWZhdWx0KCBUVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhcmNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgdmFyaWFudFNlbGVjdG9yICkKLSAgewotICAgIEZUX0J5dGUqICBwID0gdHRfY21hcDE0X2ZpbmRfdmFyaWFudCggY21hcC0+ZGF0YSArIDYsIHZhcmlhbnRTZWxlY3RvciApOwotICAgIEZUX1VMb25nICBkZWZPZmY7Ci0gICAgRlRfVUxvbmcgIG5vbmRlZk9mZjsKLQotCi0gICAgaWYgKCAhcCApCi0gICAgICByZXR1cm4gLTE7Ci0KLSAgICBkZWZPZmYgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgbm9uZGVmT2ZmID0gVFRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgaWYgKCBkZWZPZmYgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgdHRfY21hcDE0X2NoYXJfbWFwX2RlZl9iaW5hcnkoIGNtYXAtPmRhdGEgKyBkZWZPZmYsIGNoYXJjb2RlICkgKQotICAgICAgcmV0dXJuIDE7Ci0KLSAgICBpZiAoIG5vbmRlZk9mZiAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgdHRfY21hcDE0X2NoYXJfbWFwX25vbmRlZl9iaW5hcnkoIGNtYXAtPmRhdGEgKyBub25kZWZPZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmNvZGUgKSAhPSAwICAgICAgICAgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfVUludDMyKiApCi0gIHR0X2NtYXAxNF92YXJpYW50cyggVFRfQ01hcCAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICkKLSAgewotICAgIFRUX0NNYXAxNCAgIGNtYXAxNCA9IChUVF9DTWFwMTQpY21hcDsKLSAgICBGVF9VSW50MzIgICBjb3VudCAgPSBjbWFwMTQtPm51bV9zZWxlY3RvcnM7Ci0gICAgRlRfQnl0ZSogICAgcCAgICAgID0gY21hcC0+ZGF0YSArIDEwOwotICAgIEZUX1VJbnQzMiogIHJlc3VsdDsKLSAgICBGVF9VSW50MzIgICBpOwotCi0KLSAgICBpZiAoIHR0X2NtYXAxNF9lbnN1cmUoIGNtYXAxNCwgKCBjb3VudCArIDEgKSwgbWVtb3J5ICkgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICByZXN1bHQgPSBjbWFwMTQtPnJlc3VsdHM7Ci0gICAgZm9yICggaSA9IDA7IGkgPCBjb3VudDsgKytpICkKLSAgICB7Ci0gICAgICByZXN1bHRbaV0gPSAoRlRfVUludDMyKVRUX05FWFRfVUlOVDI0KCBwICk7Ci0gICAgICBwICAgICAgICArPSA4OwotICAgIH0KLSAgICByZXN1bHRbaV0gPSAwOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50MzIgKiApCi0gIHR0X2NtYXAxNF9jaGFyX3ZhcmlhbnRzKCBUVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgY2hhckNvZGUgKQotICB7Ci0gICAgVFRfQ01hcDE0ICAgY21hcDE0ID0gKFRUX0NNYXAxNCkgIGNtYXA7Ci0gICAgRlRfVUludDMyICAgY291bnQgID0gY21hcDE0LT5udW1fc2VsZWN0b3JzOwotICAgIEZUX0J5dGUqICAgIHAgICAgICA9IGNtYXAtPmRhdGEgKyAxMDsKLSAgICBGVF9VSW50MzIqICBxOwotCi0KLSAgICBpZiAoIHR0X2NtYXAxNF9lbnN1cmUoIGNtYXAxNCwgKCBjb3VudCArIDEgKSwgbWVtb3J5ICkgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBmb3IgKCBxID0gY21hcDE0LT5yZXN1bHRzOyBjb3VudCA+IDA7IC0tY291bnQgKQotICAgIHsKLSAgICAgIEZUX1VJbnQzMiAgdmFyU2VsICAgID0gVFRfTkVYVF9VSU5UMjQoIHAgKTsKLSAgICAgIEZUX1VMb25nICAgZGVmT2ZmICAgID0gVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgRlRfVUxvbmcgICBub25kZWZPZmYgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLQotICAgICAgaWYgKCAoIGRlZk9mZiAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIHR0X2NtYXAxNF9jaGFyX21hcF9kZWZfYmluYXJ5KCBjbWFwLT5kYXRhICsgZGVmT2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyQ29kZSApICAgICAgICAgICAgICAgICApIHx8Ci0gICAgICAgICAgICggbm9uZGVmT2ZmICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgdHRfY21hcDE0X2NoYXJfbWFwX25vbmRlZl9iaW5hcnkoIGNtYXAtPmRhdGEgKyBub25kZWZPZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJDb2RlICkgIT0gMCAgICAgICAgICkgKQotICAgICAgewotICAgICAgICBxWzBdID0gdmFyU2VsOwotICAgICAgICBxKys7Ci0gICAgICB9Ci0gICAgfQotICAgIHFbMF0gPSAwOwotCi0gICAgcmV0dXJuIGNtYXAxNC0+cmVzdWx0czsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1VJbnQKLSAgdHRfY21hcDE0X2RlZl9jaGFyX2NvdW50KCBGVF9CeXRlICAqcCApCi0gIHsKLSAgICBGVF9VSW50MzIgIG51bVJhbmdlcyA9IChGVF9VSW50MzIpVFRfTkVYVF9VTE9ORyggcCApOwotICAgIEZUX1VJbnQgICAgdG90ICAgICAgID0gMDsKLQotCi0gICAgcCArPSAzOyAgLyogcG9pbnQgdG8gdGhlIGZpcnN0IGBjbnQnIGZpZWxkICovCi0gICAgZm9yICggOyBudW1SYW5nZXMgPiAwOyBudW1SYW5nZXMtLSApCi0gICAgewotICAgICAgdG90ICs9IDEgKyBwWzBdOwotICAgICAgcCAgICs9IDQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRvdDsKLSAgfQotCi0KLSAgc3RhdGljIEZUX1VJbnQzMioKLSAgdHRfY21hcDE0X2dldF9kZWZfY2hhcnMoIFRUX0NNYXAgICAgY21hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ICkKLSAgewotICAgIFRUX0NNYXAxNCAgIGNtYXAxNCA9IChUVF9DTWFwMTQpIGNtYXA7Ci0gICAgRlRfVUludDMyICAgbnVtUmFuZ2VzOwotICAgIEZUX1VJbnQgICAgIGNudDsKLSAgICBGVF9VSW50MzIqICBxOwotCi0KLSAgICBjbnQgICAgICAgPSB0dF9jbWFwMTRfZGVmX2NoYXJfY291bnQoIHAgKTsKLSAgICBudW1SYW5nZXMgPSAoRlRfVUludDMyKVRUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgIGlmICggdHRfY21hcDE0X2Vuc3VyZSggY21hcDE0LCAoIGNudCArIDEgKSwgbWVtb3J5ICkgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBmb3IgKCBxID0gY21hcDE0LT5yZXN1bHRzOyBudW1SYW5nZXMgPiAwOyAtLW51bVJhbmdlcyApCi0gICAgewotICAgICAgRlRfVUludDMyICB1bmkgPSAoRlRfVUludDMyKVRUX05FWFRfVUlOVDI0KCBwICk7Ci0KLQotICAgICAgY250ID0gRlRfTkVYVF9CWVRFKCBwICkgKyAxOwotICAgICAgZG8KLSAgICAgIHsKLSAgICAgICAgcVswXSAgPSB1bmk7Ci0gICAgICAgIHVuaSAgKz0gMTsKLSAgICAgICAgcSAgICArPSAxOwotCi0gICAgICB9IHdoaWxlICggLS1jbnQgIT0gMCApOwotICAgIH0KLSAgICBxWzBdID0gMDsKLQotICAgIHJldHVybiBjbWFwMTQtPnJlc3VsdHM7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9VSW50MzIqCi0gIHR0X2NtYXAxNF9nZXRfbm9uZGVmX2NoYXJzKCBUVF9DTWFwICAgICBjbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSAgICAqcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgIG1lbW9yeSApCi0gIHsKLSAgICBUVF9DTWFwMTQgICBjbWFwMTQgPSAoVFRfQ01hcDE0KSBjbWFwOwotICAgIEZUX1VJbnQzMiAgIG51bU1hcHBpbmdzOwotICAgIEZUX1VJbnQgICAgIGk7Ci0gICAgRlRfVUludDMyICAqcmV0OwotCi0KLSAgICBudW1NYXBwaW5ncyA9IChGVF9VSW50MzIpVFRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgaWYgKCB0dF9jbWFwMTRfZW5zdXJlKCBjbWFwMTQsICggbnVtTWFwcGluZ3MgKyAxICksIG1lbW9yeSApICkKLSAgICAgIHJldHVybiBOVUxMOwotCi0gICAgcmV0ID0gY21hcDE0LT5yZXN1bHRzOwotICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtTWFwcGluZ3M7ICsraSApCi0gICAgewotICAgICAgcmV0W2ldID0gKEZUX1VJbnQzMilUVF9ORVhUX1VJTlQyNCggcCApOwotICAgICAgcCArPSAyOwotICAgIH0KLSAgICByZXRbaV0gPSAwOwotCi0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9VSW50MzIgKiApCi0gIHR0X2NtYXAxNF92YXJpYW50X2NoYXJzKCBUVF9DTWFwICAgIGNtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQzMiAgdmFyaWFudFNlbGVjdG9yICkKLSAgewotICAgIEZUX0J5dGUgICAgKnAgID0gdHRfY21hcDE0X2ZpbmRfdmFyaWFudCggY21hcC0+ZGF0YSArIDYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50U2VsZWN0b3IgKTsKLSAgICBGVF9JbnQgICAgICBpOwotICAgIEZUX1VMb25nICAgIGRlZk9mZjsKLSAgICBGVF9VTG9uZyAgICBub25kZWZPZmY7Ci0KLQotICAgIGlmICggIXAgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBkZWZPZmYgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgbm9uZGVmT2ZmID0gVFRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgaWYgKCBkZWZPZmYgPT0gMCAmJiBub25kZWZPZmYgPT0gMCApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgIGlmICggZGVmT2ZmID09IDAgKQotICAgICAgcmV0dXJuIHR0X2NtYXAxNF9nZXRfbm9uZGVmX2NoYXJzKCBjbWFwLCBjbWFwLT5kYXRhICsgbm9uZGVmT2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgKTsKLSAgICBlbHNlIGlmICggbm9uZGVmT2ZmID09IDAgKQotICAgICAgcmV0dXJuIHR0X2NtYXAxNF9nZXRfZGVmX2NoYXJzKCBjbWFwLCBjbWFwLT5kYXRhICsgZGVmT2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgLyogQm90aCBhIGRlZmF1bHQgYW5kIGEgbm9uLWRlZmF1bHQgZ2x5cGggc2V0PyAgVGhhdCdzIHByb2JhYmx5IG5vdCAqLwotICAgICAgLyogZ29vZCBmb250IGRlc2lnbiwgYnV0IHRoZSBzcGVjIGFsbG93cyBmb3IgaXQuLi4gICAgICAgICAgICAgICAgICAqLwotICAgICAgVFRfQ01hcDE0ICBjbWFwMTQgPSAoVFRfQ01hcDE0KSBjbWFwOwotICAgICAgRlRfVUludDMyICBudW1SYW5nZXM7Ci0gICAgICBGVF9VSW50MzIgIG51bU1hcHBpbmdzOwotICAgICAgRlRfVUludDMyICBkdW5pOwotICAgICAgRlRfVUludDMyICBkY250OwotICAgICAgRlRfVUludDMyICBudW5pOwotICAgICAgRlRfQnl0ZSogICBkcDsKLSAgICAgIEZUX1VJbnQgICAgZGksIG5pLCBrOwotCi0gICAgICBGVF9VSW50MzIgICpyZXQ7Ci0KLQotICAgICAgcCAgPSBjbWFwLT5kYXRhICsgbm9uZGVmT2ZmOwotICAgICAgZHAgPSBjbWFwLT5kYXRhICsgZGVmT2ZmOwotCi0gICAgICBudW1NYXBwaW5ncyA9IChGVF9VSW50MzIpVFRfTkVYVF9VTE9ORyggcCApOwotICAgICAgZGNudCAgICAgICAgPSB0dF9jbWFwMTRfZGVmX2NoYXJfY291bnQoIGRwICk7Ci0gICAgICBudW1SYW5nZXMgICA9IChGVF9VSW50MzIpVFRfTkVYVF9VTE9ORyggZHAgKTsKLQotICAgICAgaWYgKCBudW1NYXBwaW5ncyA9PSAwICkKLSAgICAgICAgcmV0dXJuIHR0X2NtYXAxNF9nZXRfZGVmX2NoYXJzKCBjbWFwLCBjbWFwLT5kYXRhICsgZGVmT2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSApOwotICAgICAgaWYgKCBkY250ID09IDAgKQotICAgICAgICByZXR1cm4gdHRfY21hcDE0X2dldF9ub25kZWZfY2hhcnMoIGNtYXAsIGNtYXAtPmRhdGEgKyBub25kZWZPZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5ICk7Ci0KLSAgICAgIGlmICggdHRfY21hcDE0X2Vuc3VyZSggY21hcDE0LCAoIGRjbnQgKyBudW1NYXBwaW5ncyArIDEgKSwgbWVtb3J5ICkgKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgICAgcmV0ICA9IGNtYXAxNC0+cmVzdWx0czsKLSAgICAgIGR1bmkgPSAoRlRfVUludDMyKVRUX05FWFRfVUlOVDI0KCBkcCApOwotICAgICAgZGNudCA9IEZUX05FWFRfQllURSggZHAgKTsKLSAgICAgIGRpICAgPSAxOwotICAgICAgbnVuaSA9IChGVF9VSW50MzIpVFRfTkVYVF9VSU5UMjQoIHAgKTsKLSAgICAgIHAgICArPSAyOwotICAgICAgbmkgICA9IDE7Ci0gICAgICBpICAgID0gMDsKLQotICAgICAgZm9yICggOzsgKQotICAgICAgewotICAgICAgICBpZiAoIG51bmkgPiBkdW5pICsgZGNudCApCi0gICAgICAgIHsKLSAgICAgICAgICBmb3IgKCBrID0gMDsgayA8PSBkY250OyArK2sgKQotICAgICAgICAgICAgcmV0W2krK10gPSBkdW5pICsgazsKLQotICAgICAgICAgICsrZGk7Ci0KLSAgICAgICAgICBpZiAoIGRpID4gbnVtUmFuZ2VzICkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgZHVuaSA9IChGVF9VSW50MzIpVFRfTkVYVF9VSU5UMjQoIGRwICk7Ci0gICAgICAgICAgZGNudCA9IEZUX05FWFRfQllURSggZHAgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIG51bmkgPCBkdW5pICkKLSAgICAgICAgICAgIHJldFtpKytdID0gbnVuaTsKLSAgICAgICAgICAvKiBJZiBpdCBpcyB3aXRoaW4gdGhlIGRlZmF1bHQgcmFuZ2UgdGhlbiBpZ25vcmUgaXQgLS0gKi8KLSAgICAgICAgICAvKiB0aGF0IHNob3VsZCBub3QgaGF2ZSBoYXBwZW5lZCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICArK25pOwotICAgICAgICAgIGlmICggbmkgPiBudW1NYXBwaW5ncyApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIG51bmkgPSAoRlRfVUludDMyKVRUX05FWFRfVUlOVDI0KCBwICk7Ci0gICAgICAgICAgcCArPSAyOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggbmkgPD0gbnVtTWFwcGluZ3MgKQotICAgICAgewotICAgICAgICAvKiBJZiB3ZSBnZXQgaGVyZSB0aGVuIHdlIGhhdmUgcnVuIG91dCBvZiBhbGwgZGVmYXVsdCByYW5nZXMuICAgKi8KLSAgICAgICAgLyogV2UgaGF2ZSByZWFkIG9uZSBub24tZGVmYXVsdCBtYXBwaW5nIHdoaWNoIHdlIGhhdmVuJ3Qgc3RvcmVkICovCi0gICAgICAgIC8qIGFuZCB0aGVyZSBtYXkgYmUgb3RoZXJzIHRoYXQgbmVlZCB0byBiZSByZWFkLiAgICAgICAgICAgICAgICAqLwotICAgICAgICByZXRbaSsrXSA9IG51bmk7Ci0gICAgICAgIHdoaWxlICggbmkgPCBudW1NYXBwaW5ncyApCi0gICAgICAgIHsKLSAgICAgICAgICByZXRbaSsrXSA9IChGVF9VSW50MzIpVFRfTkVYVF9VSU5UMjQoIHAgKTsKLSAgICAgICAgICBwICs9IDI7Ci0gICAgICAgICAgKytuaTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoIGRpIDw9IG51bVJhbmdlcyApCi0gICAgICB7Ci0gICAgICAgIC8qIElmIHdlIGdldCBoZXJlIHRoZW4gd2UgaGF2ZSBydW4gb3V0IG9mIGFsbCBub24tZGVmYXVsdCAgICAgKi8KLSAgICAgICAgLyogbWFwcGluZ3MuICBXZSBoYXZlIHJlYWQgb25lIGRlZmF1bHQgcmFuZ2Ugd2hpY2ggd2UgaGF2ZW4ndCAqLwotICAgICAgICAvKiBzdG9yZWQgYW5kIHRoZXJlIG1heSBiZSBvdGhlcnMgdGhhdCBuZWVkIHRvIGJlIHJlYWQuICAgICAgICovCi0gICAgICAgIGZvciAoIGsgPSAwOyBrIDw9IGRjbnQ7ICsrayApCi0gICAgICAgICAgcmV0W2krK10gPSBkdW5pICsgazsKLQotICAgICAgICB3aGlsZSAoIGRpIDwgbnVtUmFuZ2VzICkKLSAgICAgICAgewotICAgICAgICAgIGR1bmkgPSAoRlRfVUludDMyKVRUX05FWFRfVUlOVDI0KCBkcCApOwotICAgICAgICAgIGRjbnQgPSBGVF9ORVhUX0JZVEUoIGRwICk7Ci0KLSAgICAgICAgICBmb3IgKCBrID0gMDsgayA8PSBkY250OyArK2sgKQotICAgICAgICAgICAgcmV0W2krK10gPSBkdW5pICsgazsKLSAgICAgICAgICArK2RpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHJldFtpXSA9IDA7Ci0KLSAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICB9Ci0KLQotICBGVF9ERUZJTkVfVFRfQ01BUCgKLSAgICB0dF9jbWFwMTRfY2xhc3NfcmVjLAotICAgIHNpemVvZiAoIFRUX0NNYXAxNFJlYyApLAotCi0gICAgKEZUX0NNYXBfSW5pdEZ1bmMpICAgICB0dF9jbWFwMTRfaW5pdCwKLSAgICAoRlRfQ01hcF9Eb25lRnVuYykgICAgIHR0X2NtYXAxNF9kb25lLAotICAgIChGVF9DTWFwX0NoYXJJbmRleEZ1bmMpdHRfY21hcDE0X2NoYXJfaW5kZXgsCi0gICAgKEZUX0NNYXBfQ2hhck5leHRGdW5jKSB0dF9jbWFwMTRfY2hhcl9uZXh0LAotCi0gICAgLyogRm9ybWF0IDE0IGV4dGVuc2lvbiBmdW5jdGlvbnMgKi8KLSAgICAoRlRfQ01hcF9DaGFyVmFySW5kZXhGdW5jKSAgICB0dF9jbWFwMTRfY2hhcl92YXJfaW5kZXgsCi0gICAgKEZUX0NNYXBfQ2hhclZhcklzRGVmYXVsdEZ1bmMpdHRfY21hcDE0X2NoYXJfdmFyX2lzZGVmYXVsdCwKLSAgICAoRlRfQ01hcF9WYXJpYW50TGlzdEZ1bmMpICAgICB0dF9jbWFwMTRfdmFyaWFudHMsCi0gICAgKEZUX0NNYXBfQ2hhclZhcmlhbnRMaXN0RnVuYykgdHRfY21hcDE0X2NoYXJfdmFyaWFudHMsCi0gICAgKEZUX0NNYXBfVmFyaWFudENoYXJMaXN0RnVuYykgdHRfY21hcDE0X3ZhcmlhbnRfY2hhcnMsCi0KLSAgICAxNCwKLSAgICAoVFRfQ01hcF9WYWxpZGF0ZUZ1bmMpdHRfY21hcDE0X3ZhbGlkYXRlLAotICAgIChUVF9DTWFwX0luZm9fR2V0RnVuYyl0dF9jbWFwMTRfZ2V0X2luZm8gKQotCi0jZW5kaWYgLyogVFRfQ09ORklHX0NNQVBfRk9STUFUXzE0ICovCi0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0gIHN0YXRpYyBjb25zdCBUVF9DTWFwX0NsYXNzICB0dF9jbWFwX2NsYXNzZXNbXSA9Ci0gIHsKLSNkZWZpbmUgVFRDTUFQQ0lURU0oIGEgKSAgJmEsCi0jaW5jbHVkZSAidHRjbWFwYy5oIgotICAgIE5VTEwsCi0gIH07Ci0KLSNlbHNlIC8qRlRfQ09ORklHX09QVElPTl9QSUMqLwotCi0gIHZvaWQKLSAgRlRfRGVzdHJveV9DbGFzc190dF9jbWFwX2NsYXNzZXMoIEZUX0xpYnJhcnkgICAgICBsaWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcF9DbGFzcyogIGNsYXp6ICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICBpZiAoIGNsYXp6ICkKLSAgICAgIEZUX0ZSRUUoIGNsYXp6ICk7Ci0gIH0KLQotCi0gIEZUX0Vycm9yCi0gIEZUX0NyZWF0ZV9DbGFzc190dF9jbWFwX2NsYXNzZXMoIEZUX0xpYnJhcnkgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfQ01hcF9DbGFzcyoqICBvdXRwdXRfY2xhc3MgKQotICB7Ci0gICAgVFRfQ01hcF9DbGFzcyogICAgIGNsYXp6ICA9IE5VTEw7Ci0gICAgVFRfQ01hcF9DbGFzc1JlYyogIHJlY3M7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLSAgICBpbnQgIGkgPSAwOwotCi0KLSNkZWZpbmUgVFRDTUFQQ0lURU0oIGEgKSBpKys7Ci0jaW5jbHVkZSAidHRjbWFwYy5oIgotCi0gICAgLyogYWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciBib3RoIHRoZSBwb2ludGVycyAqLwotICAgIC8qIHBsdXMgdGVybWluYXRvciBhbmQgdGhlIGNsYXNzIGluc3RhbmNlcyAgICAgKi8KLSAgICBpZiAoIEZUX0FMTE9DKCBjbGF6eiwgc2l6ZW9mICggKmNsYXp6ICkgKiAoIGkgKyAxICkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCBUVF9DTWFwX0NsYXNzUmVjICkgKiBpICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgLyogdGhlIGxvY2F0aW9uIG9mIHRoZSBjbGFzcyBpbnN0YW5jZXMgZm9sbG93cyB0aGUgYXJyYXkgb2YgcG9pbnRlcnMgKi8KLSAgICByZWNzID0gKFRUX0NNYXBfQ2xhc3NSZWMqKSggKGNoYXIqKWNsYXp6ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggKmNsYXp6ICkgKiAoIGkgKyAxICkgKTsKLSAgICBpICAgID0gMDsKLQotI3VuZGVmIFRUQ01BUENJVEVNCi0jZGVmaW5lICBUVENNQVBDSVRFTSggYSApICAgICAgICAgICAgIFwKLSAgICBGVF9Jbml0X0NsYXNzXyAjIyBhKCAmcmVjc1tpXSApOyAgXAotICAgIGNsYXp6W2ldID0gJnJlY3NbaV07ICAgICAgICAgICAgICBcCi0gICAgaSsrOwotI2luY2x1ZGUgInR0Y21hcGMuaCIKLQotICAgIGNsYXp6W2ldID0gTlVMTDsKLQotICAgICpvdXRwdXRfY2xhc3MgPSBjbGF6ejsKLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLSNlbmRpZiAvKkZUX0NPTkZJR19PUFRJT05fUElDKi8KLQotCi0gIC8qIHBhcnNlIHRoZSBgY21hcCcgdGFibGUgYW5kIGJ1aWxkIHRoZSBjb3JyZXNwb25kaW5nIFRUX0NNYXAgb2JqZWN0cyAqLwotICAvKiBpbiB0aGUgY3VycmVudCBmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2J1aWxkX2NtYXBzKCBUVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX0J5dGUqICAgICAgICAgICB0YWJsZSA9IGZhY2UtPmNtYXBfdGFibGU7Ci0gICAgRlRfQnl0ZSogICAgICAgICAgIGxpbWl0ID0gdGFibGUgKyBmYWNlLT5jbWFwX3NpemU7Ci0gICAgRlRfVUludCB2b2xhdGlsZSAgIG51bV9jbWFwczsKLSAgICBGVF9CeXRlKiB2b2xhdGlsZSAgcCAgICAgPSB0YWJsZTsKLSAgICBGVF9MaWJyYXJ5ICAgICAgICAgbGlicmFyeSA9IEZUX0ZBQ0VfTElCUkFSWSggZmFjZSApOwotCi0gICAgRlRfVU5VU0VEKCBsaWJyYXJ5ICk7Ci0KLQotICAgIGlmICggIXAgfHwgcCArIDQgPiBsaW1pdCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLQotICAgIC8qIG9ubHkgcmVjb2duaXplIGZvcm1hdCAwICovCi0gICAgaWYgKCBUVF9ORVhUX1VTSE9SVCggcCApICE9IDAgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInR0X2ZhY2VfYnVpbGRfY21hcHM6IgotICAgICAgICAgICAgICAgICAiIHVuc3VwcG9ydGVkIGBjbWFwJyB0YWJsZSBmb3JtYXQgPSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgVFRfUEVFS19VU0hPUlQoIHAgLSAyICkgKSk7Ci0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICB9Ci0KLSAgICBudW1fY21hcHMgPSBUVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgZm9yICggOyBudW1fY21hcHMgPiAwICYmIHAgKyA4IDw9IGxpbWl0OyBudW1fY21hcHMtLSApCi0gICAgewotICAgICAgRlRfQ2hhck1hcFJlYyAgY2hhcm1hcDsKLSAgICAgIEZUX1VJbnQzMiAgICAgIG9mZnNldDsKLQotCi0gICAgICBjaGFybWFwLnBsYXRmb3JtX2lkID0gVFRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIGNoYXJtYXAuZW5jb2RpbmdfaWQgPSBUVF9ORVhUX1VTSE9SVCggcCApOwotICAgICAgY2hhcm1hcC5mYWNlICAgICAgICA9IEZUX0ZBQ0UoIGZhY2UgKTsKLSAgICAgIGNoYXJtYXAuZW5jb2RpbmcgICAgPSBGVF9FTkNPRElOR19OT05FOyAgLyogd2lsbCBiZSBmaWxsZWQgbGF0ZXIgKi8KLSAgICAgIG9mZnNldCAgICAgICAgICAgICAgPSBUVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAgIGlmICggb2Zmc2V0ICYmIG9mZnNldCA8PSBmYWNlLT5jbWFwX3NpemUgLSAyICkKLSAgICAgIHsKLSAgICAgICAgRlRfQnl0ZSogdm9sYXRpbGUgICAgICAgICAgICAgIGNtYXAgICA9IHRhYmxlICsgb2Zmc2V0OwotICAgICAgICB2b2xhdGlsZSBGVF9VSW50ICAgICAgICAgICAgICAgZm9ybWF0ID0gVFRfUEVFS19VU0hPUlQoIGNtYXAgKTsKLSAgICAgICAgY29uc3QgVFRfQ01hcF9DbGFzcyogdm9sYXRpbGUgIHBjbGF6eiA9IFRUX0NNQVBfQ0xBU1NFU19HRVQ7Ci0gICAgICAgIFRUX0NNYXBfQ2xhc3Mgdm9sYXRpbGUgICAgICAgICBjbGF6ejsKLQotCi0gICAgICAgIGZvciAoIDsgKnBjbGF6ejsgcGNsYXp6KysgKQotICAgICAgICB7Ci0gICAgICAgICAgY2xhenogPSAqcGNsYXp6OwotICAgICAgICAgIGlmICggY2xhenotPmZvcm1hdCA9PSBmb3JtYXQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHZvbGF0aWxlIFRUX1ZhbGlkYXRvclJlYyAgdmFsaWQ7Ci0gICAgICAgICAgICB2b2xhdGlsZSBGVF9FcnJvciAgICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICAgICAgICAgIGZ0X3ZhbGlkYXRvcl9pbml0KCBGVF9WQUxJREFUT1IoICZ2YWxpZCApLCBjbWFwLCBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WQUxJREFURV9ERUZBVUxUICk7Ci0KLSAgICAgICAgICAgIHZhbGlkLm51bV9nbHlwaHMgPSAoRlRfVUludClmYWNlLT5tYXhfcHJvZmlsZS5udW1HbHlwaHM7Ci0KLSAgICAgICAgICAgIGlmICggZnRfc2V0am1wKCBGVF9WQUxJREFUT1IoICZ2YWxpZCApLT5qdW1wX2J1ZmZlcikgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIHZhbGlkYXRlIHRoaXMgY21hcCBzdWItdGFibGUgKi8KLSAgICAgICAgICAgICAgZXJyb3IgPSBjbGF6ei0+dmFsaWRhdGUoIGNtYXAsIEZUX1ZBTElEQVRPUiggJnZhbGlkICkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCB2YWxpZC52YWxpZGF0b3IuZXJyb3IgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX0NNYXAgIHR0Y21hcDsKLQotCi0gICAgICAgICAgICAgIC8qIEl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gc3RvcmUgdGhlIHNpbmdsZSB2YXJpYXRpb24gICAgICAgICAqLwotICAgICAgICAgICAgICAvKiBzZWxlY3RvciBjbWFwIHNvbWV3aGVyZSBzcGVjaWFsLiAgQnV0IGl0IHdvdWxkIGhhdmUgdG8gYmUgKi8KLSAgICAgICAgICAgICAgLyogaW4gdGhlIHB1YmxpYyBGVF9GYWNlUmVjLCBhbmQgd2UgY2FuJ3QgY2hhbmdlIHRoYXQuICAgICAgICovCi0KLSAgICAgICAgICAgICAgaWYgKCAhRlRfQ01hcF9OZXcoIChGVF9DTWFwX0NsYXNzKWNsYXp6LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21hcCwgJmNoYXJtYXAsICZ0dGNtYXAgKSApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBpdCBpcyBzaW1wbGVyIHRvIGRpcmVjdGx5IHNldCBgZmxhZ3MnIHRoYW4gYWRkaW5nICovCi0gICAgICAgICAgICAgICAgLyogYSBwYXJhbWV0ZXIgdG8gRlRfQ01hcF9OZXcgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICgoVFRfQ01hcCl0dGNtYXApLT5mbGFncyA9IChGVF9JbnQpZXJyb3I7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgRlRfVFJBQ0UwKCggInR0X2ZhY2VfYnVpbGRfY21hcHM6IgotICAgICAgICAgICAgICAgICAgICAgICAgICAiIGJyb2tlbiBjbWFwIHN1Yi10YWJsZSBpZ25vcmVkXG4iICkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAqcGNsYXp6ID09IE5VTEwgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0UwKCggInR0X2ZhY2VfYnVpbGRfY21hcHM6IgotICAgICAgICAgICAgICAgICAgICAgICIgdW5zdXBwb3J0ZWQgY21hcCBzdWItdGFibGUgaWdub3JlZFxuIiApKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2dldF9jbWFwX2luZm8oIEZUX0NoYXJNYXAgICAgY2hhcm1hcCwKLSAgICAgICAgICAgICAgICAgICAgVFRfQ01hcEluZm8gICpjbWFwX2luZm8gKQotICB7Ci0gICAgRlRfQ01hcCAgICAgICAgY21hcCAgPSAoRlRfQ01hcCljaGFybWFwOwotICAgIFRUX0NNYXBfQ2xhc3MgIGNsYXp6ID0gKFRUX0NNYXBfQ2xhc3MpY21hcC0+Y2xheno7Ci0KLQotICAgIHJldHVybiBjbGF6ei0+Z2V0X2NtYXBfaW5mbyggY2hhcm1hcCwgY21hcF9pbmZvICk7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0Y21hcC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRjbWFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZWE4ZWUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRjbWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRjbWFwLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlIGNoYXJhY3RlciBtYXBwaW5nIHRhYmxlIChjbWFwKSBzdXBwb3J0IChzcGVjaWZpY2F0aW9uKS4gICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAyLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fVFRDTUFQX0hfXwotI2RlZmluZSBfX1RUQ01BUF9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RSVUVUWVBFX1RZUEVTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1ZBTElEQVRFX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfVFRfQ01BUF9ICi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSNkZWZpbmUgVFRfQ01BUF9GTEFHX1VOU09SVEVEICAgICAxCi0jZGVmaW5lIFRUX0NNQVBfRkxBR19PVkVSTEFQUElORyAgMgotCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9DTWFwUmVjXwotICB7Ci0gICAgRlRfQ01hcFJlYyAgY21hcDsKLSAgICBGVF9CeXRlKiAgICBkYXRhOyAgICAgICAgICAgLyogcG9pbnRlciB0byBpbi1tZW1vcnkgY21hcCB0YWJsZSAqLwotICAgIEZUX0ludCAgICAgIGZsYWdzOyAgICAgICAgICAvKiBmb3IgZm9ybWF0IDQgb25seSAgICAgICAgICAgICAgICovCi0KLSAgfSBUVF9DTWFwUmVjLCAqVFRfQ01hcDsKLQotICB0eXBlZGVmIGNvbnN0IHN0cnVjdCBUVF9DTWFwX0NsYXNzUmVjXyogIFRUX0NNYXBfQ2xhc3M7Ci0KLQotICB0eXBlZGVmIEZUX0Vycm9yCi0gICgqVFRfQ01hcF9WYWxpZGF0ZUZ1bmMpKCBGVF9CeXRlKiAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9WYWxpZGF0b3IgIHZhbGlkICk7Ci0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0NNYXBfQ2xhc3NSZWNfCi0gIHsKLSAgICBGVF9DTWFwX0NsYXNzUmVjICAgICAgY2xheno7Ci0gICAgRlRfVUludCAgICAgICAgICAgICAgIGZvcm1hdDsKLSAgICBUVF9DTWFwX1ZhbGlkYXRlRnVuYyAgdmFsaWRhdGU7Ci0gICAgVFRfQ01hcF9JbmZvX0dldEZ1bmMgIGdldF9jbWFwX2luZm87Ci0KLSAgfSBUVF9DTWFwX0NsYXNzUmVjOwotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9ERUZJTkVfVFRfQ01BUCggY2xhc3NfLCAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplXywgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZV8sICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2luZGV4XywgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfbmV4dF8sICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl92YXJfaW5kZXhfLCAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3Zhcl9kZWZhdWx0XywgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRfbGlzdF8sICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnZhcmlhbnRfbGlzdF8sICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50Y2hhcl9saXN0XywgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF8sICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVfLCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY21hcF9pbmZvXyApICAgIFwKLSAgRlRfQ0FMTEJBQ0tfVEFCTEVfREVGICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBUVF9DTWFwX0NsYXNzUmVjICBjbGFzc18gPSAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB7IHNpemVfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaW5pdF8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBkb25lXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNoYXJfaW5kZXhfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2hhcl9uZXh0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjaGFyX3Zhcl9pbmRleF8sICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNoYXJfdmFyX2RlZmF1bHRfLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgdmFyaWFudF9saXN0XywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjaGFydmFyaWFudF9saXN0XywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHZhcmlhbnRjaGFyX2xpc3RfICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3JtYXRfLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHZhbGlkYXRlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2V0X2NtYXBfaW5mb18gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotI2RlZmluZSBGVF9ERUZJTkVfVFRfQ01BUCggY2xhc3NfLCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplXywgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZV8sICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX2luZGV4XywgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJfbmV4dF8sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl92YXJfaW5kZXhfLCAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3Zhcl9kZWZhdWx0XywgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRfbGlzdF8sICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnZhcmlhbnRfbGlzdF8sICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50Y2hhcl9saXN0XywgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF8sICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVfLCAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfY21hcF9pbmZvXyApICAgICAgICAgICAgIFwKLSAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9Jbml0X0NsYXNzXyAjIyBjbGFzc18oIFRUX0NNYXBfQ2xhc3NSZWMqICBjbGF6eiApICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Y2xhenouc2l6ZSAgICAgICAgICAgICA9IHNpemVfOyAgICAgICAgICAgICAgXAotICAgIGNsYXp6LT5jbGF6ei5pbml0ICAgICAgICAgICAgID0gaW5pdF87ICAgICAgICAgICAgICBcCi0gICAgY2xhenotPmNsYXp6LmRvbmUgICAgICAgICAgICAgPSBkb25lXzsgICAgICAgICAgICAgIFwKLSAgICBjbGF6ei0+Y2xhenouY2hhcl9pbmRleCAgICAgICA9IGNoYXJfaW5kZXhfOyAgICAgICAgXAotICAgIGNsYXp6LT5jbGF6ei5jaGFyX25leHQgICAgICAgID0gY2hhcl9uZXh0XzsgICAgICAgICBcCi0gICAgY2xhenotPmNsYXp6LmNoYXJfdmFyX2luZGV4ICAgPSBjaGFyX3Zhcl9pbmRleF87ICAgIFwKLSAgICBjbGF6ei0+Y2xhenouY2hhcl92YXJfZGVmYXVsdCA9IGNoYXJfdmFyX2RlZmF1bHRfOyAgXAotICAgIGNsYXp6LT5jbGF6ei52YXJpYW50X2xpc3QgICAgID0gdmFyaWFudF9saXN0XzsgICAgICBcCi0gICAgY2xhenotPmNsYXp6LmNoYXJ2YXJpYW50X2xpc3QgPSBjaGFydmFyaWFudF9saXN0XzsgIFwKLSAgICBjbGF6ei0+Y2xhenoudmFyaWFudGNoYXJfbGlzdCA9IHZhcmlhbnRjaGFyX2xpc3RfOyAgXAotICAgIGNsYXp6LT5mb3JtYXQgICAgICAgICAgICAgICAgID0gZm9ybWF0XzsgICAgICAgICAgICBcCi0gICAgY2xhenotPnZhbGlkYXRlICAgICAgICAgICAgICAgPSB2YWxpZGF0ZV87ICAgICAgICAgIFwKLSAgICBjbGF6ei0+Z2V0X2NtYXBfaW5mbyAgICAgICAgICA9IGdldF9jbWFwX2luZm9fOyAgICAgXAotICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1ZhbGlkYXRvclJlY18KLSAgewotICAgIEZUX1ZhbGlkYXRvclJlYyAgdmFsaWRhdG9yOwotICAgIEZUX1VJbnQgICAgICAgICAgbnVtX2dseXBoczsKLQotICB9IFRUX1ZhbGlkYXRvclJlYywgKlRUX1ZhbGlkYXRvcjsKLQotCi0jZGVmaW5lIFRUX1ZBTElEQVRPUiggeCApICAgICAgICAgICggKFRUX1ZhbGlkYXRvcikoIHggKSApCi0jZGVmaW5lIFRUX1ZBTElEX0dMWVBIX0NPVU5UKCB4ICkgIFRUX1ZBTElEQVRPUiggeCApLT5udW1fZ2x5cGhzCi0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2J1aWxkX2NtYXBzKCBUVF9GYWNlICBmYWNlICk7Ci0KLSAgLyogdXNlZCBpbiB0dC1jbWFwcyBzZXJ2aWNlICovCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2dldF9jbWFwX2luZm8oIEZUX0NoYXJNYXAgICAgY2hhcm1hcCwKLSAgICAgICAgICAgICAgICAgICAgVFRfQ01hcEluZm8gICpjbWFwX2luZm8gKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1RUQ01BUF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0Y21hcGMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0Y21hcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE0ODk0MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dGNtYXBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGNtYXBjLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVFQgQ01BUCBjbGFzc2VzIGRlZmluaXRpb25zIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfMAotICBUVENNQVBDSVRFTSggdHRfY21hcDBfY2xhc3NfcmVjICkKLSNlbmRpZgotCi0jaWZkZWYgVFRfQ09ORklHX0NNQVBfRk9STUFUXzIKLSAgVFRDTUFQQ0lURU0oIHR0X2NtYXAyX2NsYXNzX3JlYyApCi0jZW5kaWYKLQotI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF80Ci0gIFRUQ01BUENJVEVNKCB0dF9jbWFwNF9jbGFzc19yZWMgKQotI2VuZGlmCi0KLSNpZmRlZiBUVF9DT05GSUdfQ01BUF9GT1JNQVRfNgotICBUVENNQVBDSVRFTSggdHRfY21hcDZfY2xhc3NfcmVjICkKLSNlbmRpZgotCi0jaWZkZWYgVFRfQ09ORklHX0NNQVBfRk9STUFUXzgKLSAgVFRDTUFQQ0lURU0oIHR0X2NtYXA4X2NsYXNzX3JlYyApCi0jZW5kaWYKLQotI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xMAotICBUVENNQVBDSVRFTSggdHRfY21hcDEwX2NsYXNzX3JlYyApCi0jZW5kaWYKLQotI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xMgotICBUVENNQVBDSVRFTSggdHRfY21hcDEyX2NsYXNzX3JlYyApCi0jZW5kaWYKLQotI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xMwotICBUVENNQVBDSVRFTSggdHRfY21hcDEzX2NsYXNzX3JlYyApCi0jZW5kaWYKLQotI2lmZGVmIFRUX0NPTkZJR19DTUFQX0ZPUk1BVF8xNAotICBUVENNQVBDSVRFTSggdHRfY21hcDE0X2NsYXNzX3JlYyApCi0jZW5kaWYKLQotCi0gIC8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRrZXJuLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dGtlcm4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGZjY2M1My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dGtlcm4uYworKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGtlcm4uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgTG9hZCB0aGUgYmFzaWMgVHJ1ZVR5cGUga2VybmluZyB0YWJsZS4gIFRoaXMgZG9lc24ndCBoYW5kbGUgICAgICAgICAgKi8KLS8qICAgIGtlcm5pbmcgZGF0YSB3aXRoaW4gdGhlIEdQT1MgdGFibGUgYXQgdGhlIG1vbWVudC4gICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLSNpbmNsdWRlICJ0dGtlcm4uaCIKLQotI2luY2x1ZGUgInNmZXJyb3JzLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90dGtlcm4KLQotCi0jdW5kZWYgIFRUX0tFUk5fSU5ERVgKLSNkZWZpbmUgVFRfS0VSTl9JTkRFWCggZzEsIGcyICkgICggKCAoRlRfVUxvbmcpKGcxKSA8PCAxNiApIHwgKGcyKSApCi0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2tlcm4oIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfVUxvbmcgICB0YWJsZV9zaXplOwotICAgIEZUX0J5dGUqICAgcDsKLSAgICBGVF9CeXRlKiAgIHBfbGltaXQ7Ci0gICAgRlRfVUludCAgICBubiwgbnVtX3RhYmxlczsKLSAgICBGVF9VSW50MzIgIGF2YWlsID0gMCwgb3JkZXJlZCA9IDA7Ci0KLQotICAgIC8qIHRoZSBrZXJuIHRhYmxlIGlzIG9wdGlvbmFsOyBleGl0IHNpbGVudGx5IGlmIGl0IGlzIG1pc3NpbmcgKi8KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfa2Vybiwgc3RyZWFtLCAmdGFibGVfc2l6ZSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCB0YWJsZV9zaXplIDwgNCApICAvKiB0aGUgY2FzZSBvZiBhIG1hbGZvcm1lZCB0YWJsZSAqLwotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInR0X2ZhY2VfbG9hZF9rZXJuOiIKLSAgICAgICAgICAgICAgICAgIiBrZXJuaW5nIHRhYmxlIGlzIHRvbyBzbWFsbCAtIGlnbm9yZWRcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBUYWJsZV9NaXNzaW5nICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBGVF9GUkFNRV9FWFRSQUNUKCB0YWJsZV9zaXplLCBmYWNlLT5rZXJuX3RhYmxlICkgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInR0X2ZhY2VfbG9hZF9rZXJuOiIKLSAgICAgICAgICAgICAgICAgIiBjb3VsZCBub3QgZXh0cmFjdCBrZXJuaW5nIHRhYmxlXG4iICkpOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGZhY2UtPmtlcm5fdGFibGVfc2l6ZSA9IHRhYmxlX3NpemU7Ci0KLSAgICBwICAgICAgID0gZmFjZS0+a2Vybl90YWJsZTsKLSAgICBwX2xpbWl0ID0gcCArIHRhYmxlX3NpemU7Ci0KLSAgICBwICAgICAgICAgKz0gMjsgLyogc2tpcCB2ZXJzaW9uICovCi0gICAgbnVtX3RhYmxlcyA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICBpZiAoIG51bV90YWJsZXMgPiAzMiApIC8qIHdlIG9ubHkgc3VwcG9ydCB1cCB0byAzMiBzdWItdGFibGVzICovCi0gICAgICBudW1fdGFibGVzID0gMzI7Ci0KLSAgICBmb3IgKCBubiA9IDA7IG5uIDwgbnVtX3RhYmxlczsgbm4rKyApCi0gICAgewotICAgICAgRlRfVUludCAgICBudW1fcGFpcnMsIGxlbmd0aCwgY292ZXJhZ2U7Ci0gICAgICBGVF9CeXRlKiAgIHBfbmV4dDsKLSAgICAgIEZUX1VJbnQzMiAgbWFzayA9IChGVF9VSW50MzIpMVVMIDw8IG5uOwotCi0KLSAgICAgIGlmICggcCArIDYgPiBwX2xpbWl0ICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIHBfbmV4dCA9IHA7Ci0KLSAgICAgIHAgKz0gMjsgLyogc2tpcCB2ZXJzaW9uICovCi0gICAgICBsZW5ndGggICA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBjb3ZlcmFnZSA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICAgIGlmICggbGVuZ3RoIDw9IDYgKyA4ICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIHBfbmV4dCArPSBsZW5ndGg7Ci0KLSAgICAgIGlmICggcF9uZXh0ID4gcF9saW1pdCApICAvKiBoYW5kbGUgYnJva2VuIHRhYmxlICovCi0gICAgICAgIHBfbmV4dCA9IHBfbGltaXQ7Ci0KLSAgICAgIC8qIG9ubHkgdXNlIGhvcml6b250YWwga2VybmluZyB0YWJsZXMgKi8KLSAgICAgIGlmICggKCBjb3ZlcmFnZSAmIH44VSApICE9IDB4MDAwMSB8fAotICAgICAgICAgICBwICsgOCA+IHBfbGltaXQgICAgICAgICAgICAgICkKLSAgICAgICAgZ290byBOZXh0VGFibGU7Ci0KLSAgICAgIG51bV9wYWlycyA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBwICAgICAgICArPSA2OwotCi0gICAgICBpZiAoICggcF9uZXh0IC0gcCApIDwgNiAqIChpbnQpbnVtX3BhaXJzICkgLyogaGFuZGxlIGJyb2tlbiBjb3VudCAqLwotICAgICAgICBudW1fcGFpcnMgPSAoRlRfVUludCkoICggcF9uZXh0IC0gcCApIC8gNiApOwotCi0gICAgICBhdmFpbCB8PSBtYXNrOwotCi0gICAgICAvKgotICAgICAgICogIE5vdyBjaGVjayB3aGV0aGVyIHRoZSBwYWlycyBpbiB0aGlzIHRhYmxlIGFyZSBvcmRlcmVkLgotICAgICAgICogIFdlIHRoZW4gY2FuIHVzZSBiaW5hcnkgc2VhcmNoLgotICAgICAgICovCi0gICAgICBpZiAoIG51bV9wYWlycyA+IDAgKQotICAgICAgewotICAgICAgICBGVF9VTG9uZyAgY291bnQ7Ci0gICAgICAgIEZUX1VMb25nICBvbGRfcGFpcjsKLQotCi0gICAgICAgIG9sZF9wYWlyID0gRlRfTkVYVF9VTE9ORyggcCApOwotICAgICAgICBwICAgICAgICs9IDI7Ci0KLSAgICAgICAgZm9yICggY291bnQgPSBudW1fcGFpcnMgLSAxOyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUludDMyICBjdXJfcGFpcjsKLQotCi0gICAgICAgICAgY3VyX3BhaXIgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICAgICAgaWYgKCBjdXJfcGFpciA8PSBvbGRfcGFpciApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIHAgKz0gMjsKLSAgICAgICAgICBvbGRfcGFpciA9IGN1cl9wYWlyOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBjb3VudCA9PSAwICkKLSAgICAgICAgICBvcmRlcmVkIHw9IG1hc2s7Ci0gICAgICB9Ci0KLSAgICBOZXh0VGFibGU6Ci0gICAgICBwID0gcF9uZXh0OwotICAgIH0KLQotICAgIGZhY2UtPm51bV9rZXJuX3RhYmxlcyA9IG5uOwotICAgIGZhY2UtPmtlcm5fYXZhaWxfYml0cyA9IGF2YWlsOwotICAgIGZhY2UtPmtlcm5fb3JkZXJfYml0cyA9IG9yZGVyZWQ7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHR0X2ZhY2VfZG9uZV9rZXJuKCBUVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07Ci0KLQotICAgIEZUX0ZSQU1FX1JFTEVBU0UoIGZhY2UtPmtlcm5fdGFibGUgKTsKLSAgICBmYWNlLT5rZXJuX3RhYmxlX3NpemUgPSAwOwotICAgIGZhY2UtPm51bV9rZXJuX3RhYmxlcyA9IDA7Ci0gICAgZmFjZS0+a2Vybl9hdmFpbF9iaXRzID0gMDsKLSAgICBmYWNlLT5rZXJuX29yZGVyX2JpdHMgPSAwOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0ludCApCi0gIHR0X2ZhY2VfZ2V0X2tlcm5pbmcoIFRUX0ZhY2UgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIGxlZnRfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIHJpZ2h0X2dseXBoICkKLSAgewotICAgIEZUX0ludCAgICByZXN1bHQgPSAwOwotICAgIEZUX1VJbnQgICBjb3VudCwgbWFzazsKLSAgICBGVF9CeXRlKiAgcCAgICAgICA9IGZhY2UtPmtlcm5fdGFibGU7Ci0gICAgRlRfQnl0ZSogIHBfbGltaXQgPSBwICsgZmFjZS0+a2Vybl90YWJsZV9zaXplOwotCi0KLSAgICBwICAgKz0gNDsKLSAgICBtYXNrID0gMHgwMDAxOwotCi0gICAgZm9yICggY291bnQgPSBmYWNlLT5udW1fa2Vybl90YWJsZXM7Ci0gICAgICAgICAgY291bnQgPiAwICYmIHAgKyA2IDw9IHBfbGltaXQ7Ci0gICAgICAgICAgY291bnQtLSwgbWFzayA8PD0gMSApCi0gICAgewotICAgICAgRlRfQnl0ZSogYmFzZSAgICAgPSBwOwotICAgICAgRlRfQnl0ZSogbmV4dDsKLSAgICAgIEZUX1VJbnQgIHZlcnNpb24gID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIEZUX1VJbnQgIGxlbmd0aCAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIEZUX1VJbnQgIGNvdmVyYWdlID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIEZUX1VJbnQgIG51bV9wYWlyczsKLSAgICAgIEZUX0ludCAgIHZhbHVlICAgID0gMDsKLQotICAgICAgRlRfVU5VU0VEKCB2ZXJzaW9uICk7Ci0KLQotICAgICAgbmV4dCA9IGJhc2UgKyBsZW5ndGg7Ci0KLSAgICAgIGlmICggbmV4dCA+IHBfbGltaXQgKSAgLyogaGFuZGxlIGJyb2tlbiB0YWJsZSAqLwotICAgICAgICBuZXh0ID0gcF9saW1pdDsKLQotICAgICAgaWYgKCAoIGZhY2UtPmtlcm5fYXZhaWxfYml0cyAmIG1hc2sgKSA9PSAwICkKLSAgICAgICAgZ290byBOZXh0VGFibGU7Ci0KLSAgICAgIGlmICggcCArIDggPiBuZXh0ICkKLSAgICAgICAgZ290byBOZXh0VGFibGU7Ci0KLSAgICAgIG51bV9wYWlycyA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICBwICAgICAgICArPSA2OwotCi0gICAgICBpZiAoICggbmV4dCAtIHAgKSA8IDYgKiAoaW50KW51bV9wYWlycyApICAvKiBoYW5kbGUgYnJva2VuIGNvdW50ICAqLwotICAgICAgICBudW1fcGFpcnMgPSAoRlRfVUludCkoICggbmV4dCAtIHAgKSAvIDYgKTsKLQotICAgICAgc3dpdGNoICggY292ZXJhZ2UgPj4gOCApCi0gICAgICB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgIHsKLSAgICAgICAgICBGVF9VTG9uZyAga2V5MCA9IFRUX0tFUk5fSU5ERVgoIGxlZnRfZ2x5cGgsIHJpZ2h0X2dseXBoICk7Ci0KLQotICAgICAgICAgIGlmICggZmFjZS0+a2Vybl9vcmRlcl9iaXRzICYgbWFzayApICAgLyogYmluYXJ5IHNlYXJjaCAqLwotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1VJbnQgICBtaW4gPSAwOwotICAgICAgICAgICAgRlRfVUludCAgIG1heCA9IG51bV9wYWlyczsKLQotCi0gICAgICAgICAgICB3aGlsZSAoIG1pbiA8IG1heCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX1VJbnQgICBtaWQgPSAoIG1pbiArIG1heCApID4+IDE7Ci0gICAgICAgICAgICAgIEZUX0J5dGUqICBxICAgPSBwICsgNiAqIG1pZDsKLSAgICAgICAgICAgICAgRlRfVUxvbmcgIGtleTsKLQotCi0gICAgICAgICAgICAgIGtleSA9IEZUX05FWFRfVUxPTkcoIHEgKTsKLQotICAgICAgICAgICAgICBpZiAoIGtleSA9PSBrZXkwICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbHVlID0gRlRfUEVFS19TSE9SVCggcSApOwotICAgICAgICAgICAgICAgIGdvdG8gRm91bmQ7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKCBrZXkgPCBrZXkwICkKLSAgICAgICAgICAgICAgICBtaW4gPSBtaWQgKyAxOwotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbWF4ID0gbWlkOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIC8qIGxpbmVhciBzZWFyY2ggKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9VSW50ICBjb3VudDI7Ci0KLQotICAgICAgICAgICAgZm9yICggY291bnQyID0gbnVtX3BhaXJzOyBjb3VudDIgPiAwOyBjb3VudDItLSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX1VMb25nICBrZXkgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0KLQotICAgICAgICAgICAgICBpZiAoIGtleSA9PSBrZXkwICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbHVlID0gRlRfUEVFS19TSE9SVCggcCApOwotICAgICAgICAgICAgICAgIGdvdG8gRm91bmQ7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgcCArPSAyOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgIC8qCi0gICAgICAgICogIFdlIGRvbid0IHN1cHBvcnQgZm9ybWF0IDIgYmVjYXVzZSB3ZSBoYXZlbid0IHNlZW4gYSBzaW5nbGUgZm9udAotICAgICAgICAqICB1c2luZyBpdCBpbiByZWFsIGxpZmUuLi4KLSAgICAgICAgKi8KLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgOwotICAgICAgfQotCi0gICAgICBnb3RvIE5leHRUYWJsZTsKLQotICAgIEZvdW5kOgotICAgICAgaWYgKCBjb3ZlcmFnZSAmIDggKSAvKiBvdmVycmlkZSBvciBhZGQgKi8KLSAgICAgICAgcmVzdWx0ID0gdmFsdWU7Ci0gICAgICBlbHNlCi0gICAgICAgIHJlc3VsdCArPSB2YWx1ZTsKLQotICAgIE5leHRUYWJsZToKLSAgICAgIHAgPSBuZXh0OwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotI3VuZGVmIFRUX0tFUk5fSU5ERVgKLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dGtlcm4uaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0a2Vybi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWNiMjRmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0a2Vybi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRrZXJuLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIExvYWQgdGhlIGJhc2ljIFRydWVUeXBlIGtlcm5pbmcgdGFibGUuICBUaGlzIGRvZXNuJ3QgaGFuZGxlICAgICAgICAgICovCi0vKiAgICBrZXJuaW5nIGRhdGEgd2l0aGluIHRoZSBHUE9TIHRhYmxlIGF0IHRoZSBtb21lbnQuICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1RUS0VSTl9IX18KLSNkZWZpbmUgX19UVEtFUk5fSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFJVRVRZUEVfVFlQRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICApCi0gIHR0X2ZhY2VfbG9hZF9rZXJuKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgdHRfZmFjZV9kb25lX2tlcm4oIFRUX0ZhY2UgIGZhY2UgKTsKLQotICBGVF9MT0NBTCggRlRfSW50ICkKLSAgdHRfZmFjZV9nZXRfa2VybmluZyggVFRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgbGVmdF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgcmlnaHRfZ2x5cGggKTsKLQotI2RlZmluZSBUVF9GQUNFX0hBU19LRVJOSU5HKCBmYWNlICkgICggKGZhY2UpLT5rZXJuX2F2YWlsX2JpdHMgIT0gMCApCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19UVEtFUk5fSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dGxvYWQuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0bG9hZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWJkN2YwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0bG9hZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTM2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGxvYWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgTG9hZCB0aGUgYmFzaWMgVHJ1ZVR5cGUgdGFibGVzLCBpLmUuLCB0YWJsZXMgdGhhdCBjYW4gYmUgZWl0aGVyIGluICAgKi8KLS8qICAgIFRURiBvciBPVEYgZm9udHMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLSNpbmNsdWRlICJ0dGxvYWQuaCIKLQotI2luY2x1ZGUgInNmZXJyb3JzLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90dGxvYWQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9va3VwX3RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvb2tzIGZvciBhIFRydWVUeXBlIHRhYmxlIGJ5IG5hbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBmYWNlIG9iamVjdCBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFnICA6OiBUaGUgc2VhcmNoZWQgdGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBwb2ludGVyIHRvIHRoZSB0YWJsZSBkaXJlY3RvcnkgZW50cnkuICAwIGlmIG5vdCBmb3VuZC4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIFRUX1RhYmxlICApCi0gIHR0X2ZhY2VfbG9va3VwX3RhYmxlKCBUVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICB0YWcgICkKLSAgewotICAgIFRUX1RhYmxlICBlbnRyeTsKLSAgICBUVF9UYWJsZSAgbGltaXQ7Ci0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICBGVF9Cb29sICAgemVyb19sZW5ndGggPSBGQUxTRTsKLSNlbmRpZgotCi0KLSAgICBGVF9UUkFDRTQoKCAidHRfZmFjZV9sb29rdXBfdGFibGU6ICUwOHAsIGAlYyVjJWMlYycgLS0gIiwKLSAgICAgICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgIChGVF9DaGFyKSggdGFnID4+IDI0ICksCi0gICAgICAgICAgICAgICAgKEZUX0NoYXIpKCB0YWcgPj4gMTYgKSwKLSAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIHRhZyA+PiA4ICApLAotICAgICAgICAgICAgICAgIChGVF9DaGFyKSggdGFnICAgICAgICkgKSk7Ci0KLSAgICBlbnRyeSA9IGZhY2UtPmRpcl90YWJsZXM7Ci0gICAgbGltaXQgPSBlbnRyeSArIGZhY2UtPm51bV90YWJsZXM7Ci0KLSAgICBmb3IgKCA7IGVudHJ5IDwgbGltaXQ7IGVudHJ5KysgKQotICAgIHsKLSAgICAgIC8qIEZvciBjb21wYXRpYmlsaXR5IHdpdGggV2luZG93cywgd2UgY29uc2lkZXIgICAgKi8KLSAgICAgIC8qIHplcm8tbGVuZ3RoIHRhYmxlcyB0aGUgc2FtZSBhcyBtaXNzaW5nIHRhYmxlcy4gKi8KLSAgICAgIGlmICggZW50cnktPlRhZyA9PSB0YWcgKQotICAgICAgewotICAgICAgICBpZiAoIGVudHJ5LT5MZW5ndGggIT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTQoKCAiZm91bmQgdGFibGUuXG4iICkpOwotICAgICAgICAgIHJldHVybiBlbnRyeTsKLSAgICAgICAgfQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIHplcm9fbGVuZ3RoID0gVFJVRTsKLSNlbmRpZgotICAgICAgfQotICAgIH0KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgaWYgKCB6ZXJvX2xlbmd0aCApCi0gICAgICBGVF9UUkFDRTQoKCAiaWdub3JpbmcgZW1wdHkgdGFibGVcbiIgKSk7Ci0gICAgZWxzZQotICAgICAgRlRfVFJBQ0U0KCggImNvdWxkIG5vdCBmaW5kIHRhYmxlXG4iICkpOwotI2VuZGlmCi0KLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9nb3RvX3RhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9va3MgZm9yIGEgVHJ1ZVR5cGUgdGFibGUgYnkgbmFtZSwgdGhlbiBzZWVrIGEgc3RyZWFtIHRvIGl0LiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgZmFjZSBvYmplY3QgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0YWcgICAgOjogVGhlIHNlYXJjaGVkIHRhZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBUaGUgc3RyZWFtIHRvIHNlZWsgd2hlbiB0aGUgdGFibGUgaXMgZm91bmQuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlbmd0aCA6OiBUaGUgbGVuZ3RoIG9mIHRoZSB0YWJsZSBpZiBmb3VuZCwgdW5kZWZpbmVkIG90aGVyd2lzZS4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfZ290b190YWJsZSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgdGFnLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgbGVuZ3RoICkKLSAgewotICAgIFRUX1RhYmxlICB0YWJsZTsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIHRhYmxlID0gdHRfZmFjZV9sb29rdXBfdGFibGUoIGZhY2UsIHRhZyApOwotICAgIGlmICggdGFibGUgKQotICAgIHsKLSAgICAgIGlmICggbGVuZ3RoICkKLSAgICAgICAgKmxlbmd0aCA9IHRhYmxlLT5MZW5ndGg7Ci0KLSAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIHRhYmxlLT5PZmZzZXQgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZXJyb3IgPSBGVF9USFJPVyggVGFibGVfTWlzc2luZyApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBIZXJlLCB3ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBjaGVjayB0aGF0IGBudW1fdGFibGVzJyBpcyB2YWxpZCAoYW5kIGFkanVzdCBpdCBpZiBuZWNlc3NhcnkpOyAqLwotICAvKiAgIGFsc28gcmV0dXJuIHRoZSBudW1iZXIgb2YgdmFsaWQgdGFibGUgZW50cmllcyAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBsb29rIGZvciBhIGBoZWFkJyB0YWJsZSwgY2hlY2sgaXRzIHNpemUsIGFuZCBwYXJzZSBpdCB0byBjaGVjayAqLwotICAvKiAgIHdoZXRoZXIgaXRzIGBtYWdpYycgZmllbGQgaXMgY29ycmVjdGx5IHNldCAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBlcnJvcnMgKGV4Y2VwdCBlcnJvcnMgcmV0dXJuZWQgYnkgc3RyZWFtIGhhbmRsaW5nKSAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBTRk5UX0Vycl9Vbmtub3duX0ZpbGVfRm9ybWF0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgbm8gdGFibGUgaXMgZGVmaW5lZCBpbiBkaXJlY3RvcnksIGl0IGlzIG5vdCBzZm50LXdyYXBwZWQgICAqLwotICAvKiAgICAgICBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICBTRk5UX0Vycl9UYWJsZV9NaXNzaW5nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgdGFibGUgZGlyZWN0b3J5IGlzIHZhbGlkLCBidXQgZXNzZW50aWFsIHRhYmxlcyAgICAgICAgICAgICAqLwotICAvKiAgICAgICAoaGVhZC9iaGVkL1NJTkcpIGFyZSBtaXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGNoZWNrX3RhYmxlX2RpciggU0ZOVF9IZWFkZXIgIHNmbnQsCi0gICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgdmFsaWQgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9VU2hvcnQgIG5uLCB2YWxpZF9lbnRyaWVzID0gMDsKLSAgICBGVF9VSW50ICAgIGhhc19oZWFkID0gMCwgaGFzX3NpbmcgPSAwLCBoYXNfbWV0YSA9IDA7Ci0gICAgRlRfVUxvbmcgICBvZmZzZXQgPSBzZm50LT5vZmZzZXQgKyAxMjsKLQotICAgIHN0YXRpYyBjb25zdCBGVF9GcmFtZV9GaWVsZCAgdGFibGVfZGlyX2VudHJ5X2ZpZWxkc1tdID0KLSAgICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFRUX1RhYmxlUmVjCi0KLSAgICAgIEZUX0ZSQU1FX1NUQVJUKCAxNiApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyggVGFnICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HKCBDaGVja1N1bSApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyggT2Zmc2V0ICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HKCBMZW5ndGggKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLQotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIG9mZnNldCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGZvciAoIG5uID0gMDsgbm4gPCBzZm50LT5udW1fdGFibGVzOyBubisrICkKLSAgICB7Ci0gICAgICBUVF9UYWJsZVJlYyAgdGFibGU7Ci0KLQotICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIHRhYmxlX2Rpcl9lbnRyeV9maWVsZHMsICZ0YWJsZSApICkKLSAgICAgIHsKLSAgICAgICAgbm4tLTsKLSAgICAgICAgRlRfVFJBQ0UyKCggImNoZWNrX3RhYmxlX2RpcjoiCi0gICAgICAgICAgICAgICAgICAgICIgY2FuIHJlYWQgb25seSAlZCB0YWJsZSVzIGluIGZvbnQgKGluc3RlYWQgb2YgJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICBubiwgbm4gPT0gMSA/ICIiIDogInMiLCBzZm50LT5udW1fdGFibGVzICkpOwotICAgICAgICBzZm50LT5udW1fdGFibGVzID0gbm47Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvKiB3ZSBpZ25vcmUgaW52YWxpZCB0YWJsZXMgKi8KLQotICAgICAgaWYgKCB0YWJsZS5PZmZzZXQgPiBzdHJlYW0tPnNpemUgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTIoKCAiY2hlY2tfdGFibGVfZGlyOiB0YWJsZSBlbnRyeSAlZCBpbnZhbGlkXG4iLCBubiApKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggdGFibGUuTGVuZ3RoID4gc3RyZWFtLT5zaXplIC0gdGFibGUuT2Zmc2V0ICkKLSAgICAgIHsKLSAgICAgICAgLyogU29tZSB0YWJsZXMgaGF2ZSBzdWNoIGEgc2ltcGxlIHN0cnVjdHVyZSB0aGF0IGNsaXBwaW5nIGl0cyAgICAgKi8KLSAgICAgICAgLyogY29udGVudHMgaXMgaGFybWxlc3MuICBUaGlzIGFsc28gbWFrZXMgRnJlZVR5cGUgbGVzcyBzZW5zaXRpdmUgKi8KLSAgICAgICAgLyogdG8gaW52YWxpZCB0YWJsZSBsZW5ndGhzICh3aGljaCBwcm9ncmFtcyBsaWtlIEFjcm9yZWFkIHNlZW0gdG8gKi8KLSAgICAgICAgLyogaWdub3JlIGluIGdlbmVyYWwpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICBpZiAoIHRhYmxlLlRhZyA9PSBUVEFHX2htdHggfHwKLSAgICAgICAgICAgICB0YWJsZS5UYWcgPT0gVFRBR192bXR4ICkKLSAgICAgICAgICB2YWxpZF9lbnRyaWVzKys7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMigoICJjaGVja190YWJsZV9kaXI6IHRhYmxlIGVudHJ5ICVkIGludmFsaWRcbiIsIG5uICkpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIHZhbGlkX2VudHJpZXMrKzsKLQotICAgICAgaWYgKCB0YWJsZS5UYWcgPT0gVFRBR19oZWFkIHx8IHRhYmxlLlRhZyA9PSBUVEFHX2JoZWQgKQotICAgICAgewotICAgICAgICBGVF9VSW50MzIgIG1hZ2ljOwotCi0KLSNpZm5kZWYgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCi0gICAgICAgIGlmICggdGFibGUuVGFnID09IFRUQUdfaGVhZCApCi0jZW5kaWYKLSAgICAgICAgICBoYXNfaGVhZCA9IDE7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVGhlIHRhYmxlIGxlbmd0aCBzaG91bGQgYmUgMHgzNiwgYnV0IGNlcnRhaW4gZm9udCB0b29scyBtYWtlIGl0Ci0gICAgICAgICAqIDB4MzgsIHNvIHdlIHdpbGwganVzdCBjaGVjayB0aGF0IGl0IGlzIGdyZWF0ZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIE5vdGUgdGhhdCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmljYXRpb24sIHRoZSB0YWJsZSBtdXN0IGJlCi0gICAgICAgICAqIHBhZGRlZCB0byAzMi1iaXQgbGVuZ3RocywgYnV0IHRoaXMgZG9lc24ndCBhcHBseSB0byB0aGUgdmFsdWUgb2YKLSAgICAgICAgICogaXRzIGBMZW5ndGgnIGZpZWxkIQotICAgICAgICAgKgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCB0YWJsZS5MZW5ndGggPCAweDM2ICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFMigoICJjaGVja190YWJsZV9kaXI6IgotICAgICAgICAgICAgICAgICAgICAgICIgYGhlYWQnIG9yIGBiaGVkJyB0YWJsZSB0b28gc21hbGxcbiIgKSk7Ci0gICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggVGFibGVfTWlzc2luZyApOwotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIHRhYmxlLk9mZnNldCArIDEyICkgfHwKLSAgICAgICAgICAgICBGVF9SRUFEX1VMT05HKCBtYWdpYyApICAgICAgICAgICAgICApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGlmICggbWFnaWMgIT0gMHg1RjBGM0NGNVVMICkKLSAgICAgICAgICBGVF9UUkFDRTIoKCAiY2hlY2tfdGFibGVfZGlyOiIKLSAgICAgICAgICAgICAgICAgICAgICAiIGludmFsaWQgbWFnaWMgbnVtYmVyIGluIGBoZWFkJyBvciBgYmhlZCcgdGFibGVcbiIpKTsKLQotICAgICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBvZmZzZXQgKyAoIG5uICsgMSApICogMTYgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHRhYmxlLlRhZyA9PSBUVEFHX1NJTkcgKQotICAgICAgICBoYXNfc2luZyA9IDE7Ci0gICAgICBlbHNlIGlmICggdGFibGUuVGFnID09IFRUQUdfTUVUQSApCi0gICAgICAgIGhhc19tZXRhID0gMTsKLSAgICB9Ci0KLSAgICAqdmFsaWQgPSB2YWxpZF9lbnRyaWVzOwotCi0gICAgaWYgKCAhdmFsaWRfZW50cmllcyApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggImNoZWNrX3RhYmxlX2Rpcjogbm8gdmFsaWQgdGFibGVzIGZvdW5kXG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIGlmIGBzaW5nJyBhbmQgYG1ldGEnIHRhYmxlcyBhcmUgcHJlc2VudCwgdGhlcmUgaXMgbm8gYGhlYWQnIHRhYmxlICovCi0gICAgaWYgKCBoYXNfaGVhZCB8fCAoIGhhc19zaW5nICYmIGhhc19tZXRhICkgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggImNoZWNrX3RhYmxlX2RpcjoiICkpOwotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUwotICAgICAgRlRfVFJBQ0UyKCggIiBuZWl0aGVyIGBoZWFkJywgYGJoZWQnLCBub3IgYHNpbmcnIHRhYmxlIGZvdW5kXG4iICkpOwotI2Vsc2UKLSAgICAgIEZUX1RSQUNFMigoICIgbmVpdGhlciBgaGVhZCcgbm9yIGBzaW5nJyB0YWJsZSBmb3VuZFxuIiApKTsKLSNlbmRpZgotICAgICAgZXJyb3IgPSBGVF9USFJPVyggVGFibGVfTWlzc2luZyApOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX2ZvbnRfZGlyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZHMgdGhlIGhlYWRlciBvZiBhIFNGTlQgZm9udCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzZm50ICAgICAgIDo6IFRoZSBTRk5UIGhlYWRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgc3RyZWFtIGN1cnNvciBtdXN0IGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZvbnQgZGlyZWN0b3J5LiAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfZm9udF9kaXIoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSAgICBTRk5UX0hlYWRlclJlYyAgc2ZudDsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICAgICAgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotICAgIEZUX1VTaG9ydCAgICAgICBubiwgdmFsaWRfZW50cmllczsKLQotICAgIHN0YXRpYyBjb25zdCBGVF9GcmFtZV9GaWVsZCAgb2Zmc2V0X3RhYmxlX2ZpZWxkc1tdID0KLSAgICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFNGTlRfSGVhZGVyUmVjCi0KLSAgICAgIEZUX0ZSQU1FX1NUQVJUKCA4ICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbnVtX3RhYmxlcyApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIHNlYXJjaF9yYW5nZSApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIGVudHJ5X3NlbGVjdG9yICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggcmFuZ2Vfc2hpZnQgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLQotICAgIEZUX1RSQUNFMigoICJ0dF9mYWNlX2xvYWRfZm9udF9kaXI6ICUwOHBcbiIsIGZhY2UgKSk7Ci0KLSAgICAvKiByZWFkIHRoZSBvZmZzZXQgdGFibGUgKi8KLQotICAgIHNmbnQub2Zmc2V0ID0gRlRfU1RSRUFNX1BPUygpOwotCi0gICAgaWYgKCBGVF9SRUFEX1VMT05HKCBzZm50LmZvcm1hdF90YWcgKSAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggb2Zmc2V0X3RhYmxlX2ZpZWxkcywgJnNmbnQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBtYW55IGZvbnRzIGRvbid0IGhhdmUgdGhlc2UgZmllbGRzIHNldCBjb3JyZWN0bHkgKi8KLSNpZiAwCi0gICAgaWYgKCBzZm50LnNlYXJjaF9yYW5nZSAhPSAxIDw8ICggc2ZudC5lbnRyeV9zZWxlY3RvciArIDQgKSAgICAgICAgfHwKLSAgICAgICAgIHNmbnQuc2VhcmNoX3JhbmdlICsgc2ZudC5yYW5nZV9zaGlmdCAhPSBzZm50Lm51bV90YWJsZXMgPDwgNCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSNlbmRpZgotCi0gICAgLyogbG9hZCB0aGUgdGFibGUgZGlyZWN0b3J5ICovCi0KLSAgICBGVF9UUkFDRTIoKCAiLS0gTnVtYmVyIG9mIHRhYmxlczogJTEwdVxuIiwgICAgc2ZudC5udW1fdGFibGVzICkpOwotICAgIEZUX1RSQUNFMigoICItLSBGb3JtYXQgdmVyc2lvbjogICAweCUwOGx4XG4iLCBzZm50LmZvcm1hdF90YWcgKSk7Ci0KLSAgICBpZiAoIHNmbnQuZm9ybWF0X3RhZyAhPSBUVEFHX09UVE8gKQotICAgIHsKLSAgICAgIC8qIGNoZWNrIGZpcnN0ICovCi0gICAgICBlcnJvciA9IGNoZWNrX3RhYmxlX2RpciggJnNmbnQsIHN0cmVhbSwgJnZhbGlkX2VudHJpZXMgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTIoKCAidHRfZmFjZV9sb2FkX2ZvbnRfZGlyOiIKLSAgICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIHRhYmxlIGRpcmVjdG9yeSBmb3IgVHJ1ZVR5cGVcbiIgKSk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgdmFsaWRfZW50cmllcyA9IHNmbnQubnVtX3RhYmxlczsKLQotICAgIGZhY2UtPm51bV90YWJsZXMgPSB2YWxpZF9lbnRyaWVzOwotICAgIGZhY2UtPmZvcm1hdF90YWcgPSBzZm50LmZvcm1hdF90YWc7Ci0KLSAgICBpZiAoIEZUX1FORVdfQVJSQVkoIGZhY2UtPmRpcl90YWJsZXMsIGZhY2UtPm51bV90YWJsZXMgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBzZm50Lm9mZnNldCArIDEyICkgICAgICB8fAotICAgICAgICAgRlRfRlJBTUVfRU5URVIoIHNmbnQubnVtX3RhYmxlcyAqIDE2TCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIEZUX1RSQUNFMigoICJcbiIKLSAgICAgICAgICAgICAgICAiICB0YWcgICAgb2Zmc2V0ICAgIGxlbmd0aCAgIGNoZWNrc3VtXG4iCi0gICAgICAgICAgICAgICAgIiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApKTsKLQotICAgIHZhbGlkX2VudHJpZXMgPSAwOwotICAgIGZvciAoIG5uID0gMDsgbm4gPCBzZm50Lm51bV90YWJsZXM7IG5uKysgKQotICAgIHsKLSAgICAgIFRUX1RhYmxlUmVjICBlbnRyeTsKLSAgICAgIEZUX1VTaG9ydCAgICBpOwotICAgICAgRlRfQm9vbCAgICAgIGR1cGxpY2F0ZTsKLQotCi0gICAgICBlbnRyeS5UYWcgICAgICA9IEZUX0dFVF9UQUc0KCk7Ci0gICAgICBlbnRyeS5DaGVja1N1bSA9IEZUX0dFVF9VTE9ORygpOwotICAgICAgZW50cnkuT2Zmc2V0ICAgPSBGVF9HRVRfVUxPTkcoKTsKLSAgICAgIGVudHJ5Lkxlbmd0aCAgID0gRlRfR0VUX1VMT05HKCk7Ci0KLSAgICAgIC8qIGlnbm9yZSBpbnZhbGlkIHRhYmxlcyB0aGF0IGNhbid0IGJlIHNhbml0aXplZCAqLwotCi0gICAgICBpZiAoIGVudHJ5Lk9mZnNldCA+IHN0cmVhbS0+c2l6ZSApCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgZWxzZSBpZiAoIGVudHJ5Lkxlbmd0aCA+IHN0cmVhbS0+c2l6ZSAtIGVudHJ5Lk9mZnNldCApCi0gICAgICB7Ci0gICAgICAgIGlmICggZW50cnkuVGFnID09IFRUQUdfaG10eCB8fAotICAgICAgICAgICAgIGVudHJ5LlRhZyA9PSBUVEFHX3ZtdHggKQotICAgICAgICB7Ci0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgICBGVF9VTG9uZyAgb2xkX2xlbmd0aCA9IGVudHJ5Lkxlbmd0aDsKLSNlbmRpZgotCi0KLSAgICAgICAgICAvKiBtYWtlIG1ldHJpY3MgdGFibGUgbGVuZ3RoIGEgbXVsdGlwbGUgb2YgNCAqLwotICAgICAgICAgIGVudHJ5Lkxlbmd0aCA9ICggc3RyZWFtLT5zaXplIC0gZW50cnkuT2Zmc2V0ICkgJiB+M1U7Ci0KLSAgICAgICAgICBGVF9UUkFDRTIoKCAiICAlYyVjJWMlYyAgJTA4bHggICUwOGx4ICAlMDhseCIKLSAgICAgICAgICAgICAgICAgICAgICAiIChzYW5pdGl6ZWQ7IG9yaWdpbmFsIGxlbmd0aCAlMDhseCkiLAotICAgICAgICAgICAgICAgICAgICAgIChGVF9DaGFyKSggZW50cnkuVGFnID4+IDI0ICksCi0gICAgICAgICAgICAgICAgICAgICAgKEZUX0NoYXIpKCBlbnRyeS5UYWcgPj4gMTYgKSwKLSAgICAgICAgICAgICAgICAgICAgICAoRlRfQ2hhcikoIGVudHJ5LlRhZyA+PiA4ICApLAotICAgICAgICAgICAgICAgICAgICAgIChGVF9DaGFyKSggZW50cnkuVGFnICAgICAgICksCi0gICAgICAgICAgICAgICAgICAgICAgZW50cnkuT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgIGVudHJ5Lkxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5DaGVja1N1bSwKLSAgICAgICAgICAgICAgICAgICAgICBvbGRfbGVuZ3RoICkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgZWxzZQotICAgICAgICBGVF9UUkFDRTIoKCAiICAlYyVjJWMlYyAgJTA4bHggICUwOGx4ICAlMDhseCIsCi0gICAgICAgICAgICAgICAgICAgIChGVF9DaGFyKSggZW50cnkuVGFnID4+IDI0ICksCi0gICAgICAgICAgICAgICAgICAgIChGVF9DaGFyKSggZW50cnkuVGFnID4+IDE2ICksCi0gICAgICAgICAgICAgICAgICAgIChGVF9DaGFyKSggZW50cnkuVGFnID4+IDggICksCi0gICAgICAgICAgICAgICAgICAgIChGVF9DaGFyKSggZW50cnkuVGFnICAgICAgICksCi0gICAgICAgICAgICAgICAgICAgIGVudHJ5Lk9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgZW50cnkuTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICBlbnRyeS5DaGVja1N1bSApKTsKLSNlbmRpZgotCi0gICAgICAvKiBpZ25vcmUgZHVwbGljYXRlIHRhYmxlcyDigJMgdGhlIGZpcnN0IG9uZSB3aW5zICovCi0gICAgICBkdXBsaWNhdGUgPSAwOwotICAgICAgZm9yICggaSA9IDA7IGkgPCB2YWxpZF9lbnRyaWVzOyBpKysgKQotICAgICAgewotICAgICAgICBpZiAoIGZhY2UtPmRpcl90YWJsZXNbaV0uVGFnID09IGVudHJ5LlRhZyApCi0gICAgICAgIHsKLSAgICAgICAgICBkdXBsaWNhdGUgPSAxOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoIGR1cGxpY2F0ZSApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMigoICIgIChkdXBsaWNhdGUsIGlnbm9yZWQpXG4iICkpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UyKCggIlxuIiApKTsKLQotICAgICAgICAvKiB3ZSBmaW5hbGx5IGhhdmUgYSB2YWxpZCBlbnRyeSAqLwotICAgICAgICBmYWNlLT5kaXJfdGFibGVzW3ZhbGlkX2VudHJpZXMrK10gPSBlbnRyeTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBmaW5hbCBhZGp1c3RtZW50IHRvIG51bWJlciBvZiB0YWJsZXMgKi8KLSAgICBmYWNlLT5udW1fdGFibGVzID0gdmFsaWRfZW50cmllczsKLQotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICAgIEZUX1RSQUNFMigoICJ0YWJsZSBkaXJlY3RvcnkgbG9hZGVkXG5cbiIgKSk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9hbnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWRzIGFueSBmb250IHRhYmxlIGludG8gY2xpZW50IG1lbW9yeS4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBUaGUgZmFjZSBvYmplY3QgdG8gbG9vayBmb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdGFnICAgIDo6IFRoZSB0YWcgb2YgdGFibGUgdG8gbG9hZC4gIFVzZSB0aGUgdmFsdWUgMCBpZiB5b3Ugd2FudCAgICovCi0gIC8qICAgICAgICAgICAgICB0byBhY2Nlc3MgdGhlIHdob2xlIGZvbnQgZmlsZSwgZWxzZSBzZXQgdGhpcyBwYXJhbWV0ZXIgICAqLwotICAvKiAgICAgICAgICAgICAgdG8gYSB2YWxpZCBUcnVlVHlwZSB0YWJsZSB0YWcgdGhhdCB5b3UgY2FuIGZvcmdlIHdpdGggICAgKi8KLSAgLyogICAgICAgICAgICAgIHRoZSBNQUtFX1RUX1RBRyBtYWNyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvZmZzZXQgOjogVGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGUgdGFibGUgKG9yIHRoZSBmaWxlIGlmICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgIHRhZyA9PSAwKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZW5ndGggOjogVGhlIGFkZHJlc3Mgb2YgdGhlIGRlY2lzaW9uIHZhcmlhYmxlOiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIElmIGxlbmd0aCA9PSBOVUxMOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIExvYWRzIHRoZSB3aG9sZSB0YWJsZS4gIFJldHVybnMgYW4gZXJyb3IgaWYgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBgb2Zmc2V0JyA9PSAwISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICBJZiAqbGVuZ3RoID09IDA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBFeGl0cyBpbW1lZGlhdGVseTsgcmV0dXJuaW5nIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuICovCi0gIC8qICAgICAgICAgICAgICAgICAgdGFibGUgb3Igb2YgdGhlIGZvbnQgZmlsZSwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiAqLwotICAvKiAgICAgICAgICAgICAgICAgIGB0YWcnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgIElmICpsZW5ndGggIT0gMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIExvYWRzIHRoZSBuZXh0IGBsZW5ndGgnIGJ5dGVzIG9mIHRhYmxlIG9yIGZvbnQsICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBzdGFydGluZyBhdCBvZmZzZXQgYG9mZnNldCcgKGluIHRhYmxlIG9yIGZvbnQgdG9vKS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYnVmZmVyIDo6IFRoZSBhZGRyZXNzIG9mIHRhcmdldCBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2FueSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHRhZywKLSAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIGxlbmd0aCApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX1N0cmVhbSAgc3RyZWFtOwotICAgIFRUX1RhYmxlICAgdGFibGU7Ci0gICAgRlRfVUxvbmcgICBzaXplOwotCi0KLSAgICBpZiAoIHRhZyAhPSAwICkKLSAgICB7Ci0gICAgICAvKiBsb29rIGZvciB0YWcgaW4gZm9udCBkaXJlY3RvcnkgKi8KLSAgICAgIHRhYmxlID0gdHRfZmFjZV9sb29rdXBfdGFibGUoIGZhY2UsIHRhZyApOwotICAgICAgaWYgKCAhdGFibGUgKQotICAgICAgewotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBUYWJsZV9NaXNzaW5nICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgb2Zmc2V0ICs9IHRhYmxlLT5PZmZzZXQ7Ci0gICAgICBzaXplICAgID0gdGFibGUtPkxlbmd0aDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgLyogdGFnID09IDAgLS0gdGhlIHVzZXIgd2FudHMgdG8gYWNjZXNzIHRoZSBmb250IGZpbGUgZGlyZWN0bHkgKi8KLSAgICAgIHNpemUgPSBmYWNlLT5yb290LnN0cmVhbS0+c2l6ZTsKLQotICAgIGlmICggbGVuZ3RoICYmICpsZW5ndGggPT0gMCApCi0gICAgewotICAgICAgKmxlbmd0aCA9IHNpemU7Ci0KLSAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gICAgfQotCi0gICAgaWYgKCBsZW5ndGggKQotICAgICAgc2l6ZSA9ICpsZW5ndGg7Ci0KLSAgICBzdHJlYW0gPSBmYWNlLT5yb290LnN0cmVhbTsKLSAgICAvKiB0aGUgYGlmJyBpcyBzeW50YWN0aWMgc3VnYXIgZm9yIHBpY2t5IGNvbXBpbGVycyAqLwotICAgIGlmICggRlRfU1RSRUFNX1JFQURfQVQoIG9mZnNldCwgYnVmZmVyLCBzaXplICkgKQotICAgICAgZ290byBFeGl0OwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfZ2VuZXJpY19oZWFkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkcyB0aGUgVHJ1ZVR5cGUgdGFibGUgYGhlYWQnIG9yIGBiaGVkJy4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHR0X2ZhY2VfbG9hZF9nZW5lcmljX2hlYWRlciggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgdGFnICkKLSAgewotICAgIEZUX0Vycm9yICAgIGVycm9yOwotICAgIFRUX0hlYWRlciogIGhlYWRlcjsKLQotICAgIHN0YXRpYyBjb25zdCBGVF9GcmFtZV9GaWVsZCAgaGVhZGVyX2ZpZWxkc1tdID0KLSAgICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFRUX0hlYWRlcgotCi0gICAgICBGVF9GUkFNRV9TVEFSVCggNTQgKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcgKCBUYWJsZV9WZXJzaW9uICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggRm9udF9SZXZpc2lvbiApLAotICAgICAgICBGVF9GUkFNRV9MT05HICAoIENoZWNrU3VtX0FkanVzdCApLAotICAgICAgICBGVF9GUkFNRV9MT05HICAoIE1hZ2ljX051bWJlciApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIEZsYWdzICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggVW5pdHNfUGVyX0VNICksCi0gICAgICAgIEZUX0ZSQU1FX0xPTkcgICggQ3JlYXRlZFswXSApLAotICAgICAgICBGVF9GUkFNRV9MT05HICAoIENyZWF0ZWRbMV0gKSwKLSAgICAgICAgRlRfRlJBTUVfTE9ORyAgKCBNb2RpZmllZFswXSApLAotICAgICAgICBGVF9GUkFNRV9MT05HICAoIE1vZGlmaWVkWzFdICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggeE1pbiApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHlNaW4gKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCB4TWF4ICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggeU1heCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIE1hY19TdHlsZSApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIExvd2VzdF9SZWNfUFBFTSApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIEZvbnRfRGlyZWN0aW9uICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggSW5kZXhfVG9fTG9jX0Zvcm1hdCApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIEdseXBoX0RhdGFfRm9ybWF0ICksCi0gICAgICBGVF9GUkFNRV9FTkQKLSAgICB9OwotCi0KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIHRhZywgc3RyZWFtLCAwICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBoZWFkZXIgPSAmZmFjZS0+aGVhZGVyOwotCi0gICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIGhlYWRlcl9maWVsZHMsIGhlYWRlciApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIEZUX1RSQUNFMygoICJVbml0cyBwZXIgRU06ICU0dVxuIiwgaGVhZGVyLT5Vbml0c19QZXJfRU0gKSk7Ci0gICAgRlRfVFJBQ0UzKCggIkluZGV4VG9Mb2M6ICAgJTRkXG4iLCBoZWFkZXItPkluZGV4X1RvX0xvY19Gb3JtYXQgKSk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfaGVhZCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgcmV0dXJuIHR0X2ZhY2VfbG9hZF9nZW5lcmljX2hlYWRlciggZmFjZSwgc3RyZWFtLCBUVEFHX2hlYWQgKTsKLSAgfQotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2JoZWQoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIHJldHVybiB0dF9mYWNlX2xvYWRfZ2VuZXJpY19oZWFkZXIoIGZhY2UsIHN0cmVhbSwgVFRBR19iaGVkICk7Ci0gIH0KLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUyAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX21heF9wcm9maWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZHMgdGhlIG1heGltdW0gcHJvZmlsZSBpbnRvIGEgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfbWF4cCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yOwotICAgIFRUX01heFByb2ZpbGUqICBtYXhQcm9maWxlID0gJmZhY2UtPm1heF9wcm9maWxlOwotCi0gICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBtYXhwX2ZpZWxkc1tdID0KLSAgICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFRUX01heFByb2ZpbGUKLQotICAgICAgRlRfRlJBTUVfU1RBUlQoIDYgKSwKLSAgICAgICAgRlRfRlJBTUVfTE9ORyAgKCB2ZXJzaW9uICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbnVtR2x5cGhzICksCi0gICAgICBGVF9GUkFNRV9FTkQKLSAgICB9OwotCi0gICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBtYXhwX2ZpZWxkc19leHRyYVtdID0KLSAgICB7Ci0gICAgICBGVF9GUkFNRV9TVEFSVCggMjYgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtYXhQb2ludHMgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtYXhDb250b3VycyApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIG1heENvbXBvc2l0ZVBvaW50cyApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIG1heENvbXBvc2l0ZUNvbnRvdXJzICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbWF4Wm9uZXMgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtYXhUd2lsaWdodFBvaW50cyApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIG1heFN0b3JhZ2UgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtYXhGdW5jdGlvbkRlZnMgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtYXhJbnN0cnVjdGlvbkRlZnMgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtYXhTdGFja0VsZW1lbnRzICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbWF4Q29tcG9uZW50RWxlbWVudHMgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBtYXhDb21wb25lbnREZXB0aCApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotCi0gICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX21heHAsIHN0cmVhbSwgMCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIG1heHBfZmllbGRzLCBtYXhQcm9maWxlICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgbWF4UHJvZmlsZS0+bWF4UG9pbnRzICAgICAgICAgICAgID0gMDsKLSAgICBtYXhQcm9maWxlLT5tYXhDb250b3VycyAgICAgICAgICAgPSAwOwotICAgIG1heFByb2ZpbGUtPm1heENvbXBvc2l0ZVBvaW50cyAgICA9IDA7Ci0gICAgbWF4UHJvZmlsZS0+bWF4Q29tcG9zaXRlQ29udG91cnMgID0gMDsKLSAgICBtYXhQcm9maWxlLT5tYXhab25lcyAgICAgICAgICAgICAgPSAwOwotICAgIG1heFByb2ZpbGUtPm1heFR3aWxpZ2h0UG9pbnRzICAgICA9IDA7Ci0gICAgbWF4UHJvZmlsZS0+bWF4U3RvcmFnZSAgICAgICAgICAgID0gMDsKLSAgICBtYXhQcm9maWxlLT5tYXhGdW5jdGlvbkRlZnMgICAgICAgPSAwOwotICAgIG1heFByb2ZpbGUtPm1heEluc3RydWN0aW9uRGVmcyAgICA9IDA7Ci0gICAgbWF4UHJvZmlsZS0+bWF4U3RhY2tFbGVtZW50cyAgICAgID0gMDsKLSAgICBtYXhQcm9maWxlLT5tYXhTaXplT2ZJbnN0cnVjdGlvbnMgPSAwOwotICAgIG1heFByb2ZpbGUtPm1heENvbXBvbmVudEVsZW1lbnRzICA9IDA7Ci0gICAgbWF4UHJvZmlsZS0+bWF4Q29tcG9uZW50RGVwdGggICAgID0gMDsKLQotICAgIGlmICggbWF4UHJvZmlsZS0+dmVyc2lvbiA+PSAweDEwMDAwTCApCi0gICAgewotICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIG1heHBfZmllbGRzX2V4dHJhLCBtYXhQcm9maWxlICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIFhYWDogYW4gYWRqdXN0bWVudCB0aGF0IGlzIG5lY2Vzc2FyeSB0byBsb2FkIGNlcnRhaW4gKi8KLSAgICAgIC8qICAgICAgYnJva2VuIGZvbnRzIGxpa2UgYEtleXN0cm9rZXMgTVQnIDotKCAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgV2UgYWxsb2NhdGUgNjQgZnVuY3Rpb24gZW50cmllcyBieSBkZWZhdWx0IHdoZW4gICAgKi8KLSAgICAgIC8qICAgdGhlIG1heEZ1bmN0aW9uRGVmcyB2YWx1ZSBpcyBzbWFsbGVyLiAgICAgICAgICAgICAgKi8KLQotICAgICAgaWYgKCBtYXhQcm9maWxlLT5tYXhGdW5jdGlvbkRlZnMgPCA2NCApCi0gICAgICAgIG1heFByb2ZpbGUtPm1heEZ1bmN0aW9uRGVmcyA9IDY0OwotCi0gICAgICAvKiB3ZSBhZGQgNCBwaGFudG9tIHBvaW50cyBsYXRlciAqLwotICAgICAgaWYgKCBtYXhQcm9maWxlLT5tYXhUd2lsaWdodFBvaW50cyA+ICggMHhGRkZGVSAtIDQgKSApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMCgoICJ0dF9mYWNlX2xvYWRfbWF4cDoiCi0gICAgICAgICAgICAgICAgICAgICIgdG9vIG11Y2ggdHdpbGlnaHQgcG9pbnRzIGluIGBtYXhwJyB0YWJsZTtcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICIKLSAgICAgICAgICAgICAgICAgICAgIiBzb21lIGdseXBocyBtaWdodCBiZSByZW5kZXJlZCBpbmNvcnJlY3RseVxuIiApKTsKLQotICAgICAgICBtYXhQcm9maWxlLT5tYXhUd2lsaWdodFBvaW50cyA9IDB4RkZGRlUgLSA0OwotICAgICAgfQotCi0gICAgICAvKiB3ZSBhcmJpdHJhcmlseSBsaW1pdCByZWN1cnNpb24gdG8gYXZvaWQgc3RhY2sgZXhoYXVzdGlvbiAqLwotICAgICAgaWYgKCBtYXhQcm9maWxlLT5tYXhDb21wb25lbnREZXB0aCA+IDEwMCApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMCgoICJ0dF9mYWNlX2xvYWRfbWF4cDoiCi0gICAgICAgICAgICAgICAgICAgICIgYWJub3JtYWxseSBsYXJnZSBjb21wb25lbnQgZGVwdGggKCVkKSBzZXQgdG8gMTAwXG4iLAotICAgICAgICAgICAgICAgICAgICBtYXhQcm9maWxlLT5tYXhDb21wb25lbnREZXB0aCApKTsKLSAgICAgICAgbWF4UHJvZmlsZS0+bWF4Q29tcG9uZW50RGVwdGggPSAxMDA7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgRlRfVFJBQ0UzKCggIm51bUdseXBoczogJXVcbiIsIG1heFByb2ZpbGUtPm51bUdseXBocyApKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX25hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZHMgdGhlIG5hbWUgcmVjb3Jkcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfbmFtZSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotICAgIEZUX1VMb25nICAgICAgdGFibGVfcG9zLCB0YWJsZV9sZW47Ci0gICAgRlRfVUxvbmcgICAgICBzdG9yYWdlX3N0YXJ0LCBzdG9yYWdlX2xpbWl0OwotICAgIEZUX1VJbnQgICAgICAgY291bnQ7Ci0gICAgVFRfTmFtZVRhYmxlICB0YWJsZTsKLQotICAgIHN0YXRpYyBjb25zdCBGVF9GcmFtZV9GaWVsZCAgbmFtZV90YWJsZV9maWVsZHNbXSA9Ci0gICAgewotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBUVF9OYW1lVGFibGVSZWMKLQotICAgICAgRlRfRlJBTUVfU1RBUlQoIDYgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBmb3JtYXQgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBudW1OYW1lUmVjb3JkcyApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIHN0b3JhZ2VPZmZzZXQgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIG5hbWVfcmVjb3JkX2ZpZWxkc1tdID0KLSAgICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFRUX05hbWVFbnRyeVJlYwotCi0gICAgICAvKiBubyBGVF9GUkFNRV9TVEFSVCAqLwotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIHBsYXRmb3JtSUQgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBlbmNvZGluZ0lEICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbGFuZ3VhZ2VJRCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIG5hbWVJRCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIHN0cmluZ0xlbmd0aCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIHN0cmluZ09mZnNldCApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotCi0gICAgdGFibGUgICAgICAgICA9ICZmYWNlLT5uYW1lX3RhYmxlOwotICAgIHRhYmxlLT5zdHJlYW0gPSBzdHJlYW07Ci0KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfbmFtZSwgc3RyZWFtLCAmdGFibGVfbGVuICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICB0YWJsZV9wb3MgPSBGVF9TVFJFQU1fUE9TKCk7Ci0KLQotICAgIGlmICggRlRfU1RSRUFNX1JFQURfRklFTERTKCBuYW1lX3RhYmxlX2ZpZWxkcywgdGFibGUgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBTb21lIHBvcHVsYXIgQXNpYW4gZm9udHMgaGF2ZSBhbiBpbnZhbGlkIGBzdG9yYWdlT2Zmc2V0JyB2YWx1ZSAgICovCi0gICAgLyogKGl0IHNob3VsZCBiZSBhdCBsZWFzdCAiNiArIDEyKm51bV9uYW1lcyIpLiAgSG93ZXZlciwgdGhlIHN0cmluZyAqLwotICAgIC8qIG9mZnNldHMsIGNvbXB1dGVkIGFzICJzdG9yYWdlT2Zmc2V0ICsgZW50cnktPnN0cmluZ09mZnNldCIsIGFyZSAgKi8KLSAgICAvKiB2YWxpZCBwb2ludGVycyB3aXRoaW4gdGhlIG5hbWUgdGFibGUuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFdlIHRodXMgY2FuJ3QgY2hlY2sgYHN0b3JhZ2VPZmZzZXQnIHJpZ2h0IG5vdy4gICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgc3RvcmFnZV9zdGFydCA9IHRhYmxlX3BvcyArIDYgKyAxMip0YWJsZS0+bnVtTmFtZVJlY29yZHM7Ci0gICAgc3RvcmFnZV9saW1pdCA9IHRhYmxlX3BvcyArIHRhYmxlX2xlbjsKLQotICAgIGlmICggc3RvcmFnZV9zdGFydCA+IHN0b3JhZ2VfbGltaXQgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInR0X2ZhY2VfbG9hZF9uYW1lOiBpbnZhbGlkIGBuYW1lJyB0YWJsZVxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIE5hbWVfVGFibGVfTWlzc2luZyApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIEFsbG9jYXRlIHRoZSBhcnJheSBvZiBuYW1lIHJlY29yZHMuICovCi0gICAgY291bnQgICAgICAgICAgICAgICAgID0gdGFibGUtPm51bU5hbWVSZWNvcmRzOwotICAgIHRhYmxlLT5udW1OYW1lUmVjb3JkcyA9IDA7Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggdGFibGUtPm5hbWVzLCBjb3VudCApIHx8Ci0gICAgICAgICBGVF9GUkFNRV9FTlRFUiggY291bnQgKiAxMiApICAgICAgICApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBMb2FkIHRoZSBuYW1lIHJlY29yZHMgYW5kIGRldGVybWluZSBob3cgbXVjaCBzdG9yYWdlIGlzIG5lZWRlZCAqLwotICAgIC8qIHRvIGhvbGQgdGhlIHN0cmluZ3MgdGhlbXNlbHZlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgewotICAgICAgVFRfTmFtZUVudHJ5UmVjKiAgZW50cnkgPSB0YWJsZS0+bmFtZXM7Ci0KLQotICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgICAgewotICAgICAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggbmFtZV9yZWNvcmRfZmllbGRzLCBlbnRyeSApICkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAvKiBjaGVjayB0aGF0IHRoZSBuYW1lIGlzIG5vdCBlbXB0eSAqLwotICAgICAgICBpZiAoIGVudHJ5LT5zdHJpbmdMZW5ndGggPT0gMCApCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLyogY2hlY2sgdGhhdCB0aGUgbmFtZSBzdHJpbmcgaXMgd2l0aGluIHRoZSB0YWJsZSAqLwotICAgICAgICBlbnRyeS0+c3RyaW5nT2Zmc2V0ICs9IHRhYmxlX3BvcyArIHRhYmxlLT5zdG9yYWdlT2Zmc2V0OwotICAgICAgICBpZiAoIGVudHJ5LT5zdHJpbmdPZmZzZXQgICAgICAgICAgICAgICAgICAgICAgIDwgc3RvcmFnZV9zdGFydCB8fAotICAgICAgICAgICAgIGVudHJ5LT5zdHJpbmdPZmZzZXQgKyBlbnRyeS0+c3RyaW5nTGVuZ3RoID4gc3RvcmFnZV9saW1pdCApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBpbnZhbGlkIGVudHJ5IC0gaWdub3JlIGl0ICovCi0gICAgICAgICAgZW50cnktPnN0cmluZ09mZnNldCA9IDA7Ci0gICAgICAgICAgZW50cnktPnN0cmluZ0xlbmd0aCA9IDA7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBlbnRyeSsrOwotICAgICAgfQotCi0gICAgICB0YWJsZS0+bnVtTmFtZVJlY29yZHMgPSAoRlRfVUludCkoIGVudHJ5IC0gdGFibGUtPm5hbWVzICk7Ci0gICAgfQotCi0gICAgRlRfRlJBTUVfRVhJVCgpOwotCi0gICAgLyogZXZlcnl0aGluZyB3ZW50IHdlbGwsIHVwZGF0ZSBmYWNlLT5udW1fbmFtZXMgKi8KLSAgICBmYWNlLT5udW1fbmFtZXMgPSAoRlRfVVNob3J0KSB0YWJsZS0+bnVtTmFtZVJlY29yZHM7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfZnJlZV9uYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVzIHRoZSBuYW1lIHJlY29yZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdHRfZmFjZV9mcmVlX25hbWUoIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBmYWNlLT5yb290LmRyaXZlci0+cm9vdC5tZW1vcnk7Ci0gICAgVFRfTmFtZVRhYmxlICB0YWJsZSAgPSAmZmFjZS0+bmFtZV90YWJsZTsKLSAgICBUVF9OYW1lRW50cnkgIGVudHJ5ICA9IHRhYmxlLT5uYW1lczsKLSAgICBGVF9VSW50ICAgICAgIGNvdW50ICA9IHRhYmxlLT5udW1OYW1lUmVjb3JkczsKLQotCi0gICAgaWYgKCB0YWJsZS0+bmFtZXMgKQotICAgIHsKLSAgICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBlbnRyeSsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfRlJFRSggZW50cnktPnN0cmluZyApOwotICAgICAgICBlbnRyeS0+c3RyaW5nTGVuZ3RoID0gMDsKLSAgICAgIH0KLQotICAgICAgLyogZnJlZSBzdHJpbmdzIHRhYmxlICovCi0gICAgICBGVF9GUkVFKCB0YWJsZS0+bmFtZXMgKTsKLSAgICB9Ci0KLSAgICB0YWJsZS0+bnVtTmFtZVJlY29yZHMgPSAwOwotICAgIHRhYmxlLT5mb3JtYXQgICAgICAgICA9IDA7Ci0gICAgdGFibGUtPnN0b3JhZ2VPZmZzZXQgID0gMDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX2NtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZHMgdGhlIGNtYXAgZGlyZWN0b3J5IGluIGEgZmFjZSBvYmplY3QuICBUaGUgY21hcHMgdGhlbXNlbHZlcyAgICovCi0gIC8qICAgIGFyZSBsb2FkZWQgb24gZGVtYW5kIGluIHRoZSBgdHRjbWFwLmMnIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfY21hcCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfY21hcCwgc3RyZWFtLCAmZmFjZS0+Y21hcF9zaXplICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIEZUX0ZSQU1FX0VYVFJBQ1QoIGZhY2UtPmNtYXBfc2l6ZSwgZmFjZS0+Y21hcF90YWJsZSApICkKLSAgICAgIGZhY2UtPmNtYXBfc2l6ZSA9IDA7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX29zMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZHMgdGhlIE9TMiB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfb3MyKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBUVF9PUzIqICAgb3MyOwotCi0gICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBvczJfZmllbGRzW10gPQotICAgIHsKLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgVFRfT1MyCi0KLSAgICAgIEZUX0ZSQU1FX1NUQVJUKCA3OCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIHZlcnNpb24gKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCB4QXZnQ2hhcldpZHRoICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggdXNXZWlnaHRDbGFzcyApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIHVzV2lkdGhDbGFzcyApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIGZzVHlwZSApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHlTdWJzY3JpcHRYU2l6ZSApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHlTdWJzY3JpcHRZU2l6ZSApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHlTdWJzY3JpcHRYT2Zmc2V0ICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggeVN1YnNjcmlwdFlPZmZzZXQgKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCB5U3VwZXJzY3JpcHRYU2l6ZSApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHlTdXBlcnNjcmlwdFlTaXplICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggeVN1cGVyc2NyaXB0WE9mZnNldCApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHlTdXBlcnNjcmlwdFlPZmZzZXQgKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCB5U3RyaWtlb3V0U2l6ZSApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHlTdHJpa2VvdXRQb3NpdGlvbiApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHNGYW1pbHlDbGFzcyApLAotICAgICAgICBGVF9GUkFNRV9CWVRFICAoIHBhbm9zZVswXSApLAotICAgICAgICBGVF9GUkFNRV9CWVRFICAoIHBhbm9zZVsxXSApLAotICAgICAgICBGVF9GUkFNRV9CWVRFICAoIHBhbm9zZVsyXSApLAotICAgICAgICBGVF9GUkFNRV9CWVRFICAoIHBhbm9zZVszXSApLAotICAgICAgICBGVF9GUkFNRV9CWVRFICAoIHBhbm9zZVs0XSApLAotICAgICAgICBGVF9GUkFNRV9CWVRFICAoIHBhbm9zZVs1XSApLAotICAgICAgICBGVF9GUkFNRV9CWVRFICAoIHBhbm9zZVs2XSApLAotICAgICAgICBGVF9GUkFNRV9CWVRFICAoIHBhbm9zZVs3XSApLAotICAgICAgICBGVF9GUkFNRV9CWVRFICAoIHBhbm9zZVs4XSApLAotICAgICAgICBGVF9GUkFNRV9CWVRFICAoIHBhbm9zZVs5XSApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIHVsVW5pY29kZVJhbmdlMSApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIHVsVW5pY29kZVJhbmdlMiApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIHVsVW5pY29kZVJhbmdlMyApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIHVsVW5pY29kZVJhbmdlNCApLAotICAgICAgICBGVF9GUkFNRV9CWVRFICAoIGFjaFZlbmRJRFswXSApLAotICAgICAgICBGVF9GUkFNRV9CWVRFICAoIGFjaFZlbmRJRFsxXSApLAotICAgICAgICBGVF9GUkFNRV9CWVRFICAoIGFjaFZlbmRJRFsyXSApLAotICAgICAgICBGVF9GUkFNRV9CWVRFICAoIGFjaFZlbmRJRFszXSApLAotCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggZnNTZWxlY3Rpb24gKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCB1c0ZpcnN0Q2hhckluZGV4ICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggdXNMYXN0Q2hhckluZGV4ICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggc1R5cG9Bc2NlbmRlciApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHNUeXBvRGVzY2VuZGVyICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggc1R5cG9MaW5lR2FwICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggdXNXaW5Bc2NlbnQgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCB1c1dpbkRlc2NlbnQgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLSAgICAvKiBgT1MvMicgdmVyc2lvbiAxIGFuZCBuZXdlciAqLwotICAgIHN0YXRpYyBjb25zdCBGVF9GcmFtZV9GaWVsZCAgb3MyX2ZpZWxkc19leHRyYTFbXSA9Ci0gICAgewotICAgICAgRlRfRlJBTUVfU1RBUlQoIDggKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcoIHVsQ29kZVBhZ2VSYW5nZTEgKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcoIHVsQ29kZVBhZ2VSYW5nZTIgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLSAgICAvKiBgT1MvMicgdmVyc2lvbiAyIGFuZCBuZXdlciAqLwotICAgIHN0YXRpYyBjb25zdCBGVF9GcmFtZV9GaWVsZCAgb3MyX2ZpZWxkc19leHRyYTJbXSA9Ci0gICAgewotICAgICAgRlRfRlJBTUVfU1RBUlQoIDEwICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggc3hIZWlnaHQgKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBzQ2FwSGVpZ2h0ICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggdXNEZWZhdWx0Q2hhciApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIHVzQnJlYWtDaGFyICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggdXNNYXhDb250ZXh0ICksCi0gICAgICBGVF9GUkFNRV9FTkQKLSAgICB9OwotCi0gICAgLyogYE9TLzInIHZlcnNpb24gNSBhbmQgbmV3ZXIgKi8KLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIG9zMl9maWVsZHNfZXh0cmE1W10gPQotICAgIHsKLSAgICAgIEZUX0ZSQU1FX1NUQVJUKCA0ICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggdXNMb3dlck9wdGljYWxQb2ludFNpemUgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCB1c1VwcGVyT3B0aWNhbFBvaW50U2l6ZSApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotCi0gICAgLyogV2Ugbm93IHN1cHBvcnQgb2xkIE1hYyBmb250cyB3aGVyZSB0aGUgT1MvMiB0YWJsZSBkb2Vzbid0ICAqLwotICAgIC8qIGV4aXN0LiAgU2ltcGx5IHB1dCwgd2Ugc2V0IHRoZSBgdmVyc2lvbicgZmllbGQgdG8gMHhGRkZGICAgKi8KLSAgICAvKiBhbmQgdGVzdCB0aGlzIHZhbHVlIGVhY2ggdGltZSB3ZSBuZWVkIHRvIGFjY2VzcyB0aGUgdGFibGUuICovCi0gICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX09TMiwgc3RyZWFtLCAwICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBvczIgPSAmZmFjZS0+b3MyOwotCi0gICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIG9zMl9maWVsZHMsIG9zMiApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIG9zMi0+dWxDb2RlUGFnZVJhbmdlMSAgICAgICAgPSAwOwotICAgIG9zMi0+dWxDb2RlUGFnZVJhbmdlMiAgICAgICAgPSAwOwotICAgIG9zMi0+c3hIZWlnaHQgICAgICAgICAgICAgICAgPSAwOwotICAgIG9zMi0+c0NhcEhlaWdodCAgICAgICAgICAgICAgPSAwOwotICAgIG9zMi0+dXNEZWZhdWx0Q2hhciAgICAgICAgICAgPSAwOwotICAgIG9zMi0+dXNCcmVha0NoYXIgICAgICAgICAgICAgPSAwOwotICAgIG9zMi0+dXNNYXhDb250ZXh0ICAgICAgICAgICAgPSAwOwotICAgIG9zMi0+dXNMb3dlck9wdGljYWxQb2ludFNpemUgPSAwOwotICAgIG9zMi0+dXNVcHBlck9wdGljYWxQb2ludFNpemUgPSAweEZGRkY7Ci0KLSAgICBpZiAoIG9zMi0+dmVyc2lvbiA+PSAweDAwMDEgKQotICAgIHsKLSAgICAgIC8qIG9ubHkgdmVyc2lvbiAxIHRhYmxlcyAqLwotICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIG9zMl9maWVsZHNfZXh0cmExLCBvczIgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgaWYgKCBvczItPnZlcnNpb24gPj0gMHgwMDAyICkKLSAgICAgIHsKLSAgICAgICAgLyogb25seSB2ZXJzaW9uIDIgdGFibGVzICovCi0gICAgICAgIGlmICggRlRfU1RSRUFNX1JFQURfRklFTERTKCBvczJfZmllbGRzX2V4dHJhMiwgb3MyICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBpZiAoIG9zMi0+dmVyc2lvbiA+PSAweDAwMDUgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogb25seSB2ZXJzaW9uIDUgdGFibGVzICovCi0gICAgICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIG9zMl9maWVsZHNfZXh0cmE1LCBvczIgKSApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBGVF9UUkFDRTMoKCAic1R5cG9Bc2NlbmRlcjogICU0ZFxuIiwgICBvczItPnNUeXBvQXNjZW5kZXIgKSk7Ci0gICAgRlRfVFJBQ0UzKCggInNUeXBvRGVzY2VuZGVyOiAlNGRcbiIsICAgb3MyLT5zVHlwb0Rlc2NlbmRlciApKTsKLSAgICBGVF9UUkFDRTMoKCAidXNXaW5Bc2NlbnQ6ICAgICU0dVxuIiwgICBvczItPnVzV2luQXNjZW50ICkpOwotICAgIEZUX1RSQUNFMygoICJ1c1dpbkRlc2NlbnQ6ICAgJTR1XG4iLCAgIG9zMi0+dXNXaW5EZXNjZW50ICkpOwotICAgIEZUX1RSQUNFMygoICJmc1NlbGVjdGlvbjogICAgMHglMnhcbiIsIG9zMi0+ZnNTZWxlY3Rpb24gKSk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9wb3N0c2NyaXB0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWRzIHRoZSBQb3N0c2NyaXB0IHRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX3Bvc3QoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgICBlcnJvcjsKLSAgICBUVF9Qb3N0c2NyaXB0KiAgcG9zdCA9ICZmYWNlLT5wb3N0c2NyaXB0OwotCi0gICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBwb3N0X2ZpZWxkc1tdID0KLSAgICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFRUX1Bvc3RzY3JpcHQKLQotICAgICAgRlRfRlJBTUVfU1RBUlQoIDMyICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HKCBGb3JtYXRUeXBlICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HKCBpdGFsaWNBbmdsZSApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCggdW5kZXJsaW5lUG9zaXRpb24gKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQoIHVuZGVybGluZVRoaWNrbmVzcyApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyggaXNGaXhlZFBpdGNoICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HKCBtaW5NZW1UeXBlNDIgKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcoIG1heE1lbVR5cGU0MiApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyggbWluTWVtVHlwZTEgKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcoIG1heE1lbVR5cGUxICksCi0gICAgICBGVF9GUkFNRV9FTkQKLSAgICB9OwotCi0KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfcG9zdCwgc3RyZWFtLCAwICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggcG9zdF9maWVsZHMsIHBvc3QgKSApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAvKiB3ZSBkb24ndCBsb2FkIHRoZSBnbHlwaCBuYW1lcywgd2UgZG8gdGhhdCBpbiBhbm90aGVyICovCi0gICAgLyogbW9kdWxlICh0dHBvc3QpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgRlRfVFJBQ0UzKCggIkZvcm1hdFR5cGU6ICAgMHgleFxuIiwgcG9zdC0+Rm9ybWF0VHlwZSApKTsKLSAgICBGVF9UUkFDRTMoKCAiaXNGaXhlZFBpdGNoOiAgICVzXG4iLCBwb3N0LT5pc0ZpeGVkUGl0Y2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICIgIHllcyIgOiAiICAgbm8iICkpOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX3BjbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZHMgdGhlIFBDTCA1IFRhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfcGNsdCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBwY2x0X2ZpZWxkc1tdID0KLSAgICB7Ci0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFRUX1BDTFQKLQotICAgICAgRlRfRlJBTUVfU1RBUlQoIDU0ICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggVmVyc2lvbiApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIEZvbnROdW1iZXIgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBQaXRjaCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIHhIZWlnaHQgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBTdHlsZSApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIFR5cGVGYW1pbHkgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBDYXBIZWlnaHQgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBTeW1ib2xTZXQgKSwKLSAgICAgICAgRlRfRlJBTUVfQllURVMgKCBUeXBlRmFjZSwgMTYgKSwKLSAgICAgICAgRlRfRlJBTUVfQllURVMgKCBDaGFyYWN0ZXJDb21wbGVtZW50LCA4ICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEVTICggRmlsZU5hbWUsIDYgKSwKLSAgICAgICAgRlRfRlJBTUVfQ0hBUiAgKCBTdHJva2VXZWlnaHQgKSwKLSAgICAgICAgRlRfRlJBTUVfQ0hBUiAgKCBXaWR0aFR5cGUgKSwKLSAgICAgICAgRlRfRlJBTUVfQllURSAgKCBTZXJpZlN0eWxlICksCi0gICAgICAgIEZUX0ZSQU1FX0JZVEUgICggUmVzZXJ2ZWQgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0gICAgVFRfUENMVCogIHBjbHQgPSAmZmFjZS0+cGNsdDsKLQotCi0gICAgLyogb3B0aW9uYWwgdGFibGUgKi8KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfUENMVCwgc3RyZWFtLCAwICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggcGNsdF9maWVsZHMsIHBjbHQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9nYXNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWRzIHRoZSBgZ2FzcCcgdGFibGUgaW50byBhIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2dhc3AoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLQotICAgIEZUX1VJbnQgICAgICAgIGosbnVtX3JhbmdlczsKLSAgICBUVF9HYXNwUmFuZ2UgICBnYXNwcmFuZ2VzID0gTlVMTDsKLQotCi0gICAgLyogdGhlIGdhc3AgdGFibGUgaXMgb3B0aW9uYWwgKi8KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfZ2FzcCwgc3RyZWFtLCAwICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIEZUX0ZSQU1FX0VOVEVSKCA0TCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGZhY2UtPmdhc3AudmVyc2lvbiAgID0gRlRfR0VUX1VTSE9SVCgpOwotICAgIGZhY2UtPmdhc3AubnVtUmFuZ2VzID0gRlRfR0VUX1VTSE9SVCgpOwotCi0gICAgRlRfRlJBTUVfRVhJVCgpOwotCi0gICAgLyogb25seSBzdXBwb3J0IHZlcnNpb25zIDAgYW5kIDEgb2YgdGhlIHRhYmxlICovCi0gICAgaWYgKCBmYWNlLT5nYXNwLnZlcnNpb24gPj0gMiApCi0gICAgewotICAgICAgZmFjZS0+Z2FzcC5udW1SYW5nZXMgPSAwOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIG51bV9yYW5nZXMgPSBmYWNlLT5nYXNwLm51bVJhbmdlczsKLSAgICBGVF9UUkFDRTMoKCAibnVtUmFuZ2VzOiAldVxuIiwgbnVtX3JhbmdlcyApKTsKLQotICAgIGlmICggRlRfUU5FV19BUlJBWSggZmFjZS0+Z2FzcC5nYXNwUmFuZ2VzLCBudW1fcmFuZ2VzICkgfHwKLSAgICAgICAgIEZUX0ZSQU1FX0VOVEVSKCBudW1fcmFuZ2VzICogNEwgKSAgICAgICAgICAgICAgICAgICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGdhc3ByYW5nZXMgPSBmYWNlLT5nYXNwLmdhc3BSYW5nZXM7Ci0KLSAgICBmb3IgKCBqID0gMDsgaiA8IG51bV9yYW5nZXM7IGorKyApCi0gICAgewotICAgICAgZ2FzcHJhbmdlc1tqXS5tYXhQUEVNICA9IEZUX0dFVF9VU0hPUlQoKTsKLSAgICAgIGdhc3ByYW5nZXNbal0uZ2FzcEZsYWcgPSBGVF9HRVRfVVNIT1JUKCk7Ci0KLSAgICAgIEZUX1RSQUNFMygoICJnYXNwUmFuZ2UgJWQ6IHJhbmdlTWF4UFBFTSAlNWQsIHJhbmdlR2FzcEJlaGF2aW9yIDB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICBqLAotICAgICAgICAgICAgICAgICAgZ2FzcHJhbmdlc1tqXS5tYXhQUEVNLAotICAgICAgICAgICAgICAgICAgZ2FzcHJhbmdlc1tqXS5nYXNwRmxhZyApKTsKLSAgICB9Ci0KLSAgICBGVF9GUkFNRV9FWElUKCk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0bG9hZC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRsb2FkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZDkxYzUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRsb2FkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRsb2FkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIExvYWQgdGhlIGJhc2ljIFRydWVUeXBlIHRhYmxlcywgaS5lLiwgdGFibGVzIHRoYXQgY2FuIGJlIGVpdGhlciBpbiAgICovCi0vKiAgICBUVEYgb3IgT1RGIGZvbnRzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1RUTE9BRF9IX18KLSNkZWZpbmUgX19UVExPQURfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFJVRVRZUEVfVFlQRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfTE9DQUwoIFRUX1RhYmxlICApCi0gIHR0X2ZhY2VfbG9va3VwX3RhYmxlKCBUVF9GYWNlICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICB0YWcgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2dvdG9fdGFibGUoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgIHRhZywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogIGxlbmd0aCApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2ZvbnRfZGlyKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9hbnkoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICB0YWcsCi0gICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICBsZW5ndGggKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9oZWFkKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2NtYXAoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfbWF4cCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9uYW1lKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX29zMiggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX3Bvc3QoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfcGNsdCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHR0X2ZhY2VfZnJlZV9uYW1lKCBUVF9GYWNlICBmYWNlICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfZ2FzcCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9iaGVkKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19UVExPQURfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dG10eC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRtdHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzMDlhYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dG10eC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0bXR4LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBMb2FkIHRoZSBtZXRyaWNzIHRhYmxlcyBjb21tb24gdG8gVFRGIGFuZCBPVEYgZm9udHMgKGJvZHkpLiAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNi0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfVEFHU19ICi0jaW5jbHVkZSAidHRtdHguaCIKLQotI2luY2x1ZGUgInNmZXJyb3JzLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90dG10eAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX2htdHggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCB0aGUgYGhtdHgnIG9yIGB2bXR4JyB0YWJsZSBpbnRvIGEgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICA6OiBUaGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHZlcnRpY2FsIDo6IEEgYm9vbGVhbiBmbGFnLiAgSWYgc2V0LCBsb2FkIGB2bXR4Jy4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9obXR4KCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgdmVydGljYWwgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9VTG9uZyAgIHRhZywgdGFibGVfc2l6ZTsKLSAgICBGVF9VTG9uZyogIHB0YWJsZV9vZmZzZXQ7Ci0gICAgRlRfVUxvbmcqICBwdGFibGVfc2l6ZTsKLQotCi0gICAgaWYgKCB2ZXJ0aWNhbCApCi0gICAgewotICAgICAgdGFnICAgICAgICAgICA9IFRUQUdfdm10eDsKLSAgICAgIHB0YWJsZV9vZmZzZXQgPSAmZmFjZS0+dmVydF9tZXRyaWNzX29mZnNldDsKLSAgICAgIHB0YWJsZV9zaXplICAgPSAmZmFjZS0+dmVydF9tZXRyaWNzX3NpemU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0YWcgICAgICAgICAgID0gVFRBR19obXR4OwotICAgICAgcHRhYmxlX29mZnNldCA9ICZmYWNlLT5ob3J6X21ldHJpY3Nfb2Zmc2V0OwotICAgICAgcHRhYmxlX3NpemUgICA9ICZmYWNlLT5ob3J6X21ldHJpY3Nfc2l6ZTsKLSAgICB9Ci0KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIHRhZywgc3RyZWFtLCAmdGFibGVfc2l6ZSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgKnB0YWJsZV9zaXplICAgPSB0YWJsZV9zaXplOwotICAgICpwdGFibGVfb2Zmc2V0ID0gRlRfU1RSRUFNX1BPUygpOwotCi0gIEZhaWw6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfaGhlYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkIHRoZSBgaGhlYScgb3IgJ3ZoZWEnIHRhYmxlIGludG8gYSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgIDo6IFRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydGljYWwgOjogQSBib29sZWFuIGZsYWcuICBJZiBzZXQsIGxvYWQgYHZoZWEnLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2hoZWEoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICB2ZXJ0aWNhbCApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0gICAgVFRfSG9yaUhlYWRlciogIGhlYWRlcjsKLQotICAgIHN0YXRpYyBjb25zdCBGVF9GcmFtZV9GaWVsZCAgbWV0cmljc19oZWFkZXJfZmllbGRzW10gPQotICAgIHsKLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgVFRfSG9yaUhlYWRlcgotCi0gICAgICBGVF9GUkFNRV9TVEFSVCggMzYgKSwKLSAgICAgICAgRlRfRlJBTUVfVUxPTkcgKCBWZXJzaW9uICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggQXNjZW5kZXIgKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBEZXNjZW5kZXIgKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBMaW5lX0dhcCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIGFkdmFuY2VfV2lkdGhfTWF4ICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggbWluX0xlZnRfU2lkZV9CZWFyaW5nICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggbWluX1JpZ2h0X1NpZGVfQmVhcmluZyApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIHhNYXhfRXh0ZW50ICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggY2FyZXRfU2xvcGVfUmlzZSApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIGNhcmV0X1Nsb3BlX1J1biApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIGNhcmV0X09mZnNldCApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIFJlc2VydmVkWzBdICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggUmVzZXJ2ZWRbMV0gKSwKLSAgICAgICAgRlRfRlJBTUVfU0hPUlQgKCBSZXNlcnZlZFsyXSApLAotICAgICAgICBGVF9GUkFNRV9TSE9SVCAoIFJlc2VydmVkWzNdICksCi0gICAgICAgIEZUX0ZSQU1FX1NIT1JUICggbWV0cmljX0RhdGFfRm9ybWF0ICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggbnVtYmVyX09mX0hNZXRyaWNzICksCi0gICAgICBGVF9GUkFNRV9FTkQKLSAgICB9OwotCi0KLSAgICBpZiAoIHZlcnRpY2FsICkKLSAgICB7Ci0gICAgICB2b2lkICAqdiA9ICZmYWNlLT52ZXJ0aWNhbDsKLQotCi0gICAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfdmhlYSwgc3RyZWFtLCAwICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBoZWFkZXIgPSAoVFRfSG9yaUhlYWRlciopdjsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19oaGVhLCBzdHJlYW0sIDAgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGhlYWRlciA9ICZmYWNlLT5ob3Jpem9udGFsOwotICAgIH0KLQotICAgIGlmICggRlRfU1RSRUFNX1JFQURfRklFTERTKCBtZXRyaWNzX2hlYWRlcl9maWVsZHMsIGhlYWRlciApICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIEZUX1RSQUNFMygoICJBc2NlbmRlcjogICAgICAgICAgJTVkXG4iLCBoZWFkZXItPkFzY2VuZGVyICkpOwotICAgIEZUX1RSQUNFMygoICJEZXNjZW5kZXI6ICAgICAgICAgJTVkXG4iLCBoZWFkZXItPkRlc2NlbmRlciApKTsKLSAgICBGVF9UUkFDRTMoKCAibnVtYmVyX09mX01ldHJpY3M6ICU1dVxuIiwgaGVhZGVyLT5udW1iZXJfT2ZfSE1ldHJpY3MgKSk7Ci0KLSAgICBoZWFkZXItPmxvbmdfbWV0cmljcyAgPSBOVUxMOwotICAgIGhlYWRlci0+c2hvcnRfbWV0cmljcyA9IE5VTEw7Ci0KLSAgRmFpbDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfZ2V0X21ldHJpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJldHVybiB0aGUgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBtZXRyaWNzIGluIGZvbnQgdW5pdHMgZm9yIGEgICAgICAqLwotICAvKiAgICBnaXZlbiBnbHlwaC4gIFRoZSB2YWx1ZXMgYXJlIHRoZSBsZWZ0IHNpZGUgYmVhcmluZyAodG9wIHNpZGUgICAgICAgKi8KLSAgLyogICAgYmVhcmluZyBmb3IgdmVydGljYWwgbWV0cmljcykgYW5kIGFkdmFuY2Ugd2lkdGggKGFkdmFuY2UgaGVpZ2h0ICAgICovCi0gIC8qICAgIGZvciB2ZXJ0aWNhbCBtZXRyaWNzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgIDo6IEEgcG9pbnRlciB0byB0aGUgVHJ1ZVR5cGUgZmFjZSBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdmVydGljYWwgOjogSWYgc2V0IHRvIFRSVUUsIGdldCB2ZXJ0aWNhbCBtZXRyaWNzLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnaW5kZXggICA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhYmVhcmluZyA6OiBUaGUgYmVhcmluZywgZWl0aGVyIGxlZnQgc2lkZSBvciB0b3Agc2lkZS4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGFhZHZhbmNlIDo6IFRoZSBhZHZhbmNlIHdpZHRoIG9yIGFkdmFuY2UgaGVpZ2h0LCBkZXBlbmRpbmcgb24gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICB0aGUgYHZlcnRpY2FsJyBmbGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHR0X2ZhY2VfZ2V0X21ldHJpY3MoIFRUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgIHZlcnRpY2FsLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1Nob3J0ICAgKmFiZWFyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICphYWR2YW5jZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0gICAgRlRfU3RyZWFtICAgICAgIHN0cmVhbSA9IGZhY2UtPnJvb3Quc3RyZWFtOwotICAgIFRUX0hvcmlIZWFkZXIqICBoZWFkZXI7Ci0gICAgRlRfVUxvbmcgICAgICAgIHRhYmxlX3BvcywgdGFibGVfc2l6ZSwgdGFibGVfZW5kOwotICAgIEZUX1VTaG9ydCAgICAgICBrOwotCi0KLSAgICBpZiAoIHZlcnRpY2FsICkKLSAgICB7Ci0gICAgICB2b2lkKiAgdiA9ICZmYWNlLT52ZXJ0aWNhbDsKLQotCi0gICAgICBoZWFkZXIgICAgID0gKFRUX0hvcmlIZWFkZXIqKXY7Ci0gICAgICB0YWJsZV9wb3MgID0gZmFjZS0+dmVydF9tZXRyaWNzX29mZnNldDsKLSAgICAgIHRhYmxlX3NpemUgPSBmYWNlLT52ZXJ0X21ldHJpY3Nfc2l6ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGhlYWRlciAgICAgPSAmZmFjZS0+aG9yaXpvbnRhbDsKLSAgICAgIHRhYmxlX3BvcyAgPSBmYWNlLT5ob3J6X21ldHJpY3Nfb2Zmc2V0OwotICAgICAgdGFibGVfc2l6ZSA9IGZhY2UtPmhvcnpfbWV0cmljc19zaXplOwotICAgIH0KLQotICAgIHRhYmxlX2VuZCA9IHRhYmxlX3BvcyArIHRhYmxlX3NpemU7Ci0KLSAgICBrID0gaGVhZGVyLT5udW1iZXJfT2ZfSE1ldHJpY3M7Ci0KLSAgICBpZiAoIGsgPiAwICkKLSAgICB7Ci0gICAgICBpZiAoIGdpbmRleCA8IChGVF9VSW50KWsgKQotICAgICAgewotICAgICAgICB0YWJsZV9wb3MgKz0gNCAqIGdpbmRleDsKLSAgICAgICAgaWYgKCB0YWJsZV9wb3MgKyA0ID4gdGFibGVfZW5kICkKLSAgICAgICAgICBnb3RvIE5vRGF0YTsKLQotICAgICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCB0YWJsZV9wb3MgKSB8fAotICAgICAgICAgICAgIEZUX1JFQURfVVNIT1JUKCAqYWFkdmFuY2UgKSB8fAotICAgICAgICAgICAgIEZUX1JFQURfU0hPUlQoICphYmVhcmluZyApICApCi0gICAgICAgICAgZ290byBOb0RhdGE7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRhYmxlX3BvcyArPSA0ICogKCBrIC0gMSApOwotICAgICAgICBpZiAoIHRhYmxlX3BvcyArIDQgPiB0YWJsZV9lbmQgKQotICAgICAgICAgIGdvdG8gTm9EYXRhOwotCi0gICAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIHRhYmxlX3BvcyApIHx8Ci0gICAgICAgICAgICAgRlRfUkVBRF9VU0hPUlQoICphYWR2YW5jZSApICkKLSAgICAgICAgICBnb3RvIE5vRGF0YTsKLQotICAgICAgICB0YWJsZV9wb3MgKz0gNCArIDIgKiAoIGdpbmRleCAtIGsgKTsKLSAgICAgICAgaWYgKCB0YWJsZV9wb3MgKyAyID4gdGFibGVfZW5kICkKLSAgICAgICAgICAqYWJlYXJpbmcgPSAwOwotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoICFGVF9TVFJFQU1fU0VFSyggdGFibGVfcG9zICkgKQotICAgICAgICAgICAgKHZvaWQpRlRfUkVBRF9TSE9SVCggKmFiZWFyaW5nICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICBOb0RhdGE6Ci0gICAgICAqYWJlYXJpbmcgPSAwOwotICAgICAgKmFhZHZhbmNlID0gMDsKLSAgICB9Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0bXR4LmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dG10eC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTZlZTA2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0bXR4LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dG10eC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgTG9hZCB0aGUgbWV0cmljcyB0YWJsZXMgY29tbW9uIHRvIFRURiBhbmQgT1RGIGZvbnRzIChzcGVjaWZpY2F0aW9uKS4gKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19UVE1UWF9IX18KLSNkZWZpbmUgX19UVE1UWF9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfaGhlYSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgIHZlcnRpY2FsICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfaG10eCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgIHZlcnRpY2FsICk7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHR0X2ZhY2VfZ2V0X21ldHJpY3MoIFRUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgIHZlcnRpY2FsLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1Nob3J0KiAgIGFiZWFyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICBhYWR2YW5jZSApOwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1RUTVRYX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRwb3N0LmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dHBvc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQyOWQxZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dHBvc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDU2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dHBvc3QuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUG9zdGNyaXB0IG5hbWUgdGFibGUgcHJvY2Vzc2luZyBmb3IgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGZvbnRzICAgICAgKi8KLS8qICAgIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBwb3N0IHRhYmxlIGlzIG5vdCBjb21wbGV0ZWx5IGxvYWRlZCBieSB0aGUgY29yZSBlbmdpbmUuICBUaGlzICAgICAqLwotICAvKiBmaWxlIGxvYWRzIHRoZSBtaXNzaW5nIFBTIGdseXBoIG5hbWVzIGFuZCBpbXBsZW1lbnRzIGFuIEFQSSB0byBhY2Nlc3MgKi8KLSAgLyogdGhlbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLSNpbmNsdWRlICJ0dHBvc3QuaCIKLQotI2luY2x1ZGUgInNmZXJyb3JzLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90dHBvc3QKLQotCi0gIC8qIElmIHRoaXMgY29uZmlndXJhdGlvbiBtYWNybyBpcyBkZWZpbmVkLCB3ZSByZWx5IG9uIHRoZSBgUFNOYW1lcycgKi8KLSAgLyogbW9kdWxlIHRvIGdyYWIgdGhlIGdseXBoIG5hbWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTCi0KLQotI2luY2x1ZGUgRlRfU0VSVklDRV9QT1NUU0NSSVBUX0NNQVBTX0gKLQotI2RlZmluZSBNQUNfTkFNRSggeCApICAoRlRfU3RyaW5nKilwc25hbWVzLT5tYWNpbnRvc2hfbmFtZSggKEZUX1VJbnQpKHgpICkKLQotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BPU1RTQ1JJUFRfTkFNRVMgKi8KLQotCi0gICAvKiBPdGhlcndpc2UsIHdlIGlnbm9yZSB0aGUgYFBTTmFtZXMnIG1vZHVsZSwgYW5kIHByb3ZpZGUgb3VyIG93biAgKi8KLSAgIC8qIHRhYmxlIG9mIE1hYyBuYW1lcy4gIFRodXMsIGl0IGlzIHBvc3NpYmxlIHRvIGJ1aWxkIGEgdmVyc2lvbiBvZiAqLwotICAgLyogRnJlZVR5cGUgd2l0aG91dCB0aGUgVHlwZSAxIGRyaXZlciAmIFBTTmFtZXMgbW9kdWxlLiAgICAgICAgICAgICovCi0KLSNkZWZpbmUgTUFDX05BTUUoIHggKSAgKEZUX1N0cmluZyopdHRfcG9zdF9kZWZhdWx0X25hbWVzW3hdCi0KLSAgLyogdGhlIDI1OCBkZWZhdWx0IE1hYyBQUyBnbHlwaCBuYW1lczsgc2VlIGZpbGUgYHRvb2xzL2dsbmFtZXMucHknICovCi0KLSAgc3RhdGljIGNvbnN0IEZUX1N0cmluZyogY29uc3QgIHR0X3Bvc3RfZGVmYXVsdF9uYW1lc1syNThdID0KLSAgewotICAgIC8qICAgMCAqLwotICAgICIubm90ZGVmIiwgIi5udWxsIiwgIm5vbm1hcmtpbmdyZXR1cm4iLCAic3BhY2UiLCAiZXhjbGFtIiwKLSAgICAicXVvdGVkYmwiLCAibnVtYmVyc2lnbiIsICJkb2xsYXIiLCAicGVyY2VudCIsICJhbXBlcnNhbmQiLAotICAgIC8qICAxMCAqLwotICAgICJxdW90ZXNpbmdsZSIsICJwYXJlbmxlZnQiLCAicGFyZW5yaWdodCIsICJhc3RlcmlzayIsICJwbHVzIiwKLSAgICAiY29tbWEiLCAiaHlwaGVuIiwgInBlcmlvZCIsICJzbGFzaCIsICJ6ZXJvIiwKLSAgICAvKiAgMjAgKi8KLSAgICAib25lIiwgInR3byIsICJ0aHJlZSIsICJmb3VyIiwgImZpdmUiLAotICAgICJzaXgiLCAic2V2ZW4iLCAiZWlnaHQiLCAibmluZSIsICJjb2xvbiIsCi0gICAgLyogIDMwICovCi0gICAgInNlbWljb2xvbiIsICJsZXNzIiwgImVxdWFsIiwgImdyZWF0ZXIiLCAicXVlc3Rpb24iLAotICAgICJhdCIsICJBIiwgIkIiLCAiQyIsICJEIiwKLSAgICAvKiAgNDAgKi8KLSAgICAiRSIsICJGIiwgIkciLCAiSCIsICJJIiwKLSAgICAiSiIsICJLIiwgIkwiLCAiTSIsICJOIiwKLSAgICAvKiAgNTAgKi8KLSAgICAiTyIsICJQIiwgIlEiLCAiUiIsICJTIiwKLSAgICAiVCIsICJVIiwgIlYiLCAiVyIsICJYIiwKLSAgICAvKiAgNjAgKi8KLSAgICAiWSIsICJaIiwgImJyYWNrZXRsZWZ0IiwgImJhY2tzbGFzaCIsICJicmFja2V0cmlnaHQiLAotICAgICJhc2NpaWNpcmN1bSIsICJ1bmRlcnNjb3JlIiwgImdyYXZlIiwgImEiLCAiYiIsCi0gICAgLyogIDcwICovCi0gICAgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsCi0gICAgImgiLCAiaSIsICJqIiwgImsiLCAibCIsCi0gICAgLyogIDgwICovCi0gICAgIm0iLCAibiIsICJvIiwgInAiLCAicSIsCi0gICAgInIiLCAicyIsICJ0IiwgInUiLCAidiIsCi0gICAgLyogIDkwICovCi0gICAgInciLCAieCIsICJ5IiwgInoiLCAiYnJhY2VsZWZ0IiwKLSAgICAiYmFyIiwgImJyYWNlcmlnaHQiLCAiYXNjaWl0aWxkZSIsICJBZGllcmVzaXMiLCAiQXJpbmciLAotICAgIC8qIDEwMCAqLwotICAgICJDY2VkaWxsYSIsICJFYWN1dGUiLCAiTnRpbGRlIiwgIk9kaWVyZXNpcyIsICJVZGllcmVzaXMiLAotICAgICJhYWN1dGUiLCAiYWdyYXZlIiwgImFjaXJjdW1mbGV4IiwgImFkaWVyZXNpcyIsICJhdGlsZGUiLAotICAgIC8qIDExMCAqLwotICAgICJhcmluZyIsICJjY2VkaWxsYSIsICJlYWN1dGUiLCAiZWdyYXZlIiwgImVjaXJjdW1mbGV4IiwKLSAgICAiZWRpZXJlc2lzIiwgImlhY3V0ZSIsICJpZ3JhdmUiLCAiaWNpcmN1bWZsZXgiLCAiaWRpZXJlc2lzIiwKLSAgICAvKiAxMjAgKi8KLSAgICAibnRpbGRlIiwgIm9hY3V0ZSIsICJvZ3JhdmUiLCAib2NpcmN1bWZsZXgiLCAib2RpZXJlc2lzIiwKLSAgICAib3RpbGRlIiwgInVhY3V0ZSIsICJ1Z3JhdmUiLCAidWNpcmN1bWZsZXgiLCAidWRpZXJlc2lzIiwKLSAgICAvKiAxMzAgKi8KLSAgICAiZGFnZ2VyIiwgImRlZ3JlZSIsICJjZW50IiwgInN0ZXJsaW5nIiwgInNlY3Rpb24iLAotICAgICJidWxsZXQiLCAicGFyYWdyYXBoIiwgImdlcm1hbmRibHMiLCAicmVnaXN0ZXJlZCIsICJjb3B5cmlnaHQiLAotICAgIC8qIDE0MCAqLwotICAgICJ0cmFkZW1hcmsiLCAiYWN1dGUiLCAiZGllcmVzaXMiLCAibm90ZXF1YWwiLCAiQUUiLAotICAgICJPc2xhc2giLCAiaW5maW5pdHkiLCAicGx1c21pbnVzIiwgImxlc3NlcXVhbCIsICJncmVhdGVyZXF1YWwiLAotICAgIC8qIDE1MCAqLwotICAgICJ5ZW4iLCAibXUiLCAicGFydGlhbGRpZmYiLCAic3VtbWF0aW9uIiwgInByb2R1Y3QiLAotICAgICJwaSIsICJpbnRlZ3JhbCIsICJvcmRmZW1pbmluZSIsICJvcmRtYXNjdWxpbmUiLCAiT21lZ2EiLAotICAgIC8qIDE2MCAqLwotICAgICJhZSIsICJvc2xhc2giLCAicXVlc3Rpb25kb3duIiwgImV4Y2xhbWRvd24iLCAibG9naWNhbG5vdCIsCi0gICAgInJhZGljYWwiLCAiZmxvcmluIiwgImFwcHJveGVxdWFsIiwgIkRlbHRhIiwgImd1aWxsZW1vdGxlZnQiLAotICAgIC8qIDE3MCAqLwotICAgICJndWlsbGVtb3RyaWdodCIsICJlbGxpcHNpcyIsICJub25icmVha2luZ3NwYWNlIiwgIkFncmF2ZSIsICJBdGlsZGUiLAotICAgICJPdGlsZGUiLCAiT0UiLCAib2UiLCAiZW5kYXNoIiwgImVtZGFzaCIsCi0gICAgLyogMTgwICovCi0gICAgInF1b3RlZGJsbGVmdCIsICJxdW90ZWRibHJpZ2h0IiwgInF1b3RlbGVmdCIsICJxdW90ZXJpZ2h0IiwgImRpdmlkZSIsCi0gICAgImxvemVuZ2UiLCAieWRpZXJlc2lzIiwgIllkaWVyZXNpcyIsICJmcmFjdGlvbiIsICJjdXJyZW5jeSIsCi0gICAgLyogMTkwICovCi0gICAgImd1aWxzaW5nbGxlZnQiLCAiZ3VpbHNpbmdscmlnaHQiLCAiZmkiLCAiZmwiLCAiZGFnZ2VyZGJsIiwKLSAgICAicGVyaW9kY2VudGVyZWQiLCAicXVvdGVzaW5nbGJhc2UiLCAicXVvdGVkYmxiYXNlIiwgInBlcnRob3VzYW5kIiwgIkFjaXJjdW1mbGV4IiwKLSAgICAvKiAyMDAgKi8KLSAgICAiRWNpcmN1bWZsZXgiLCAiQWFjdXRlIiwgIkVkaWVyZXNpcyIsICJFZ3JhdmUiLCAiSWFjdXRlIiwKLSAgICAiSWNpcmN1bWZsZXgiLCAiSWRpZXJlc2lzIiwgIklncmF2ZSIsICJPYWN1dGUiLCAiT2NpcmN1bWZsZXgiLAotICAgIC8qIDIxMCAqLwotICAgICJhcHBsZSIsICJPZ3JhdmUiLCAiVWFjdXRlIiwgIlVjaXJjdW1mbGV4IiwgIlVncmF2ZSIsCi0gICAgImRvdGxlc3NpIiwgImNpcmN1bWZsZXgiLCAidGlsZGUiLCAibWFjcm9uIiwgImJyZXZlIiwKLSAgICAvKiAyMjAgKi8KLSAgICAiZG90YWNjZW50IiwgInJpbmciLCAiY2VkaWxsYSIsICJodW5nYXJ1bWxhdXQiLCAib2dvbmVrIiwKLSAgICAiY2Fyb24iLCAiTHNsYXNoIiwgImxzbGFzaCIsICJTY2Fyb24iLCAic2Nhcm9uIiwKLSAgICAvKiAyMzAgKi8KLSAgICAiWmNhcm9uIiwgInpjYXJvbiIsICJicm9rZW5iYXIiLCAiRXRoIiwgImV0aCIsCi0gICAgIllhY3V0ZSIsICJ5YWN1dGUiLCAiVGhvcm4iLCAidGhvcm4iLCAibWludXMiLAotICAgIC8qIDI0MCAqLwotICAgICJtdWx0aXBseSIsICJvbmVzdXBlcmlvciIsICJ0d29zdXBlcmlvciIsICJ0aHJlZXN1cGVyaW9yIiwgIm9uZWhhbGYiLAotICAgICJvbmVxdWFydGVyIiwgInRocmVlcXVhcnRlcnMiLCAiZnJhbmMiLCAiR2JyZXZlIiwgImdicmV2ZSIsCi0gICAgLyogMjUwICovCi0gICAgIklkb3RhY2NlbnQiLCAiU2NlZGlsbGEiLCAic2NlZGlsbGEiLCAiQ2FjdXRlIiwgImNhY3V0ZSIsCi0gICAgIkNjYXJvbiIsICJjY2Fyb24iLCAiZGNyb2F0IiwKLSAgfTsKLQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTICovCi0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgbG9hZF9mb3JtYXRfMjAoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBwb3N0X2xpbWl0ICkKLSAgewotICAgIEZUX01lbW9yeSAgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotICAgIEZUX0Vycm9yICAgIGVycm9yOwotCi0gICAgRlRfSW50ICAgICAgbnVtX2dseXBoczsKLSAgICBGVF9VU2hvcnQgICBudW1fbmFtZXM7Ci0KLSAgICBGVF9VU2hvcnQqICBnbHlwaF9pbmRpY2VzID0gTlVMTDsKLSAgICBGVF9DaGFyKiogICBuYW1lX3N0cmluZ3MgID0gTlVMTDsKLQotCi0gICAgaWYgKCBGVF9SRUFEX1VTSE9SVCggbnVtX2dseXBocyApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIFVORE9DVU1FTlRFRCEgIFRoZSBudW1iZXIgb2YgZ2x5cGhzIGluIHRoaXMgdGFibGUgY2FuIGJlIHNtYWxsZXIgKi8KLSAgICAvKiB0aGFuIHRoZSB2YWx1ZSBpbiB0aGUgbWF4cCB0YWJsZSAoY2YuIGN5YmVyYml0LnR0ZikuICAgICAgICAgICAgICovCi0KLSAgICAvKiBUaGVyZSBhbHJlYWR5IGV4aXN0IGZvbnRzIHdoaWNoIGhhdmUgbW9yZSB0aGFuIDMyNzY4IGdseXBoIG5hbWVzICovCi0gICAgLyogaW4gdGhpcyB0YWJsZSwgc28gdGhlIHRlc3QgZm9yIHRoaXMgdGhyZXNob2xkIGhhcyBiZWVuIGRyb3BwZWQuICAqLwotCi0gICAgaWYgKCBudW1fZ2x5cGhzID4gZmFjZS0+bWF4X3Byb2ZpbGUubnVtR2x5cGhzICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogbG9hZCB0aGUgaW5kaWNlcyAqLwotICAgIHsKLSAgICAgIEZUX0ludCAgbjsKLQotCi0gICAgICBpZiAoIEZUX05FV19BUlJBWSAoIGdseXBoX2luZGljZXMsIG51bV9nbHlwaHMgKSB8fAotICAgICAgICAgICBGVF9GUkFNRV9FTlRFUiggbnVtX2dseXBocyAqIDJMICkgICAgICAgICAgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX2dseXBoczsgbisrICkKLSAgICAgICAgZ2x5cGhfaW5kaWNlc1tuXSA9IEZUX0dFVF9VU0hPUlQoKTsKLQotICAgICAgRlRfRlJBTUVfRVhJVCgpOwotICAgIH0KLQotICAgIC8qIGNvbXB1dGUgbnVtYmVyIG9mIG5hbWVzIHN0b3JlZCBpbiB0YWJsZSAqLwotICAgIHsKLSAgICAgIEZUX0ludCAgbjsKLQotCi0gICAgICBudW1fbmFtZXMgPSAwOwotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9nbHlwaHM7IG4rKyApCi0gICAgICB7Ci0gICAgICAgIEZUX0ludCAgaWR4OwotCi0KLSAgICAgICAgaWR4ID0gZ2x5cGhfaW5kaWNlc1tuXTsKLSAgICAgICAgaWYgKCBpZHggPj0gMjU4ICkKLSAgICAgICAgewotICAgICAgICAgIGlkeCAtPSAyNTc7Ci0gICAgICAgICAgaWYgKCBpZHggPiBudW1fbmFtZXMgKQotICAgICAgICAgICAgbnVtX25hbWVzID0gKEZUX1VTaG9ydClpZHg7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBub3cgbG9hZCB0aGUgbmFtZSBzdHJpbmdzICovCi0gICAgewotICAgICAgRlRfVVNob3J0ICBuOwotCi0KLSAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBuYW1lX3N0cmluZ3MsIG51bV9uYW1lcyApICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9uYW1lczsgbisrICkKLSAgICAgIHsKLSAgICAgICAgRlRfVUludCAgbGVuOwotCi0KLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fUE9TKCkgPj0gcG9zdF9saW1pdCApCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFNigoICJsb2FkX2Zvcm1hdF8yMDogJWQgYnl0ZSBsZWZ0IGluIHBvc3QgdGFibGVcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgcG9zdF9saW1pdCAtIEZUX1NUUkVBTV9QT1MoKSApKTsKLQotICAgICAgICAgIGlmICggRlRfUkVBRF9CWVRFKCBsZW4gKSApCi0gICAgICAgICAgICBnb3RvIEZhaWwxOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBsZW4gPiBwb3N0X2xpbWl0ICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgRlRfU1RSRUFNX1BPUygpID4gcG9zdF9saW1pdCAtIGxlbiApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9JbnQgIGQgPSAoRlRfSW50KXBvc3RfbGltaXQgLSAoRlRfSW50KUZUX1NUUkVBTV9QT1MoKTsKLQotCi0gICAgICAgICAgRlRfRVJST1IoKCAibG9hZF9mb3JtYXRfMjA6IgotICAgICAgICAgICAgICAgICAgICAgIiBleGNlZWRpbmcgc3RyaW5nIGxlbmd0aCAoJWQpLCIKLSAgICAgICAgICAgICAgICAgICAgICIgdHJ1bmNhdGluZyBhdCBlbmQgb2YgcG9zdCB0YWJsZSAoJWQgYnl0ZSBsZWZ0KVxuIiwKLSAgICAgICAgICAgICAgICAgICAgIGxlbiwgZCApKTsKLSAgICAgICAgICBsZW4gPSAoRlRfVUludClGVF9NQVgoIDAsIGQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBuYW1lX3N0cmluZ3Nbbl0sIGxlbiArIDEgKSB8fAotICAgICAgICAgICAgIEZUX1NUUkVBTV9SRUFEKCBuYW1lX3N0cmluZ3Nbbl0sIGxlbiAgICkgKQotICAgICAgICAgIGdvdG8gRmFpbDE7Ci0KLSAgICAgICAgbmFtZV9zdHJpbmdzW25dW2xlbl0gPSAnXDAnOwotICAgICAgfQotCi0gICAgICBpZiAoIG4gPCBudW1fbmFtZXMgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJsb2FkX2Zvcm1hdF8yMDoiCi0gICAgICAgICAgICAgICAgICAgIiBhbGwgZW50cmllcyBpbiBwb3N0IHRhYmxlIGFyZSBhbHJlYWR5IHBhcnNlZCwiCi0gICAgICAgICAgICAgICAgICAgIiB1c2luZyBOVUxMIG5hbWVzIGZvciBnaWQgJWQgLSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgbiwgbnVtX25hbWVzIC0gMSApKTsKLSAgICAgICAgZm9yICggOyBuIDwgbnVtX25hbWVzOyBuKysgKQotICAgICAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBuYW1lX3N0cmluZ3Nbbl0sIDEgKSApCi0gICAgICAgICAgICBnb3RvIEZhaWwxOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIG5hbWVfc3RyaW5nc1tuXVswXSA9ICdcMCc7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogYWxsIHJpZ2h0LCBzZXQgdGFibGUgZmllbGRzIGFuZCBleGl0IHN1Y2Nlc3NmdWxseSAqLwotICAgIHsKLSAgICAgIFRUX1Bvc3RfMjAgIHRhYmxlID0gJmZhY2UtPnBvc3RzY3JpcHRfbmFtZXMubmFtZXMuZm9ybWF0XzIwOwotCi0KLSAgICAgIHRhYmxlLT5udW1fZ2x5cGhzICAgID0gKEZUX1VTaG9ydCludW1fZ2x5cGhzOwotICAgICAgdGFibGUtPm51bV9uYW1lcyAgICAgPSAoRlRfVVNob3J0KW51bV9uYW1lczsKLSAgICAgIHRhYmxlLT5nbHlwaF9pbmRpY2VzID0gZ2x5cGhfaW5kaWNlczsKLSAgICAgIHRhYmxlLT5nbHlwaF9uYW1lcyAgID0gbmFtZV9zdHJpbmdzOwotICAgIH0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gIEZhaWwxOgotICAgIHsKLSAgICAgIEZUX1VTaG9ydCAgbjsKLQotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9uYW1lczsgbisrICkKLSAgICAgICAgRlRfRlJFRSggbmFtZV9zdHJpbmdzW25dICk7Ci0gICAgfQotCi0gIEZhaWw6Ci0gICAgRlRfRlJFRSggbmFtZV9zdHJpbmdzICk7Ci0gICAgRlRfRlJFRSggZ2x5cGhfaW5kaWNlcyApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgbG9hZF9mb3JtYXRfMjUoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBwb3N0X2xpbWl0ICkKLSAgewotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLQotICAgIEZUX0ludCAgICAgbnVtX2dseXBoczsKLSAgICBGVF9DaGFyKiAgIG9mZnNldF90YWJsZSA9IE5VTEw7Ci0KLSAgICBGVF9VTlVTRUQoIHBvc3RfbGltaXQgKTsKLQotCi0gICAgLyogVU5ET0NVTUVOVEVEISAgVGhpcyB2YWx1ZSBhcHBlYXJzIG9ubHkgaW4gdGhlIEFwcGxlIFRUIHNwZWNzLiAqLwotICAgIGlmICggRlRfUkVBRF9VU0hPUlQoIG51bV9nbHlwaHMgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBjaGVjayB0aGUgbnVtYmVyIG9mIGdseXBocyAqLwotICAgIGlmICggbnVtX2dseXBocyA+IGZhY2UtPm1heF9wcm9maWxlLm51bUdseXBocyB8fCBudW1fZ2x5cGhzID4gMjU4ICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIG9mZnNldF90YWJsZSwgbnVtX2dseXBocyApICAgfHwKLSAgICAgICAgIEZUX1NUUkVBTV9SRUFEKCBvZmZzZXRfdGFibGUsIG51bV9nbHlwaHMgKSApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICAvKiBub3cgY2hlY2sgdGhlIG9mZnNldCB0YWJsZSAqLwotICAgIHsKLSAgICAgIEZUX0ludCAgbjsKLQotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9nbHlwaHM7IG4rKyApCi0gICAgICB7Ci0gICAgICAgIEZUX0xvbmcgIGlkeCA9IChGVF9Mb25nKW4gKyBvZmZzZXRfdGFibGVbbl07Ci0KLQotICAgICAgICBpZiAoIGlkeCA8IDAgfHwgaWR4ID4gbnVtX2dseXBocyApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgZ290byBGYWlsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogT0ssIHNldCB0YWJsZSBmaWVsZHMgYW5kIGV4aXQgc3VjY2Vzc2Z1bGx5ICovCi0gICAgewotICAgICAgVFRfUG9zdF8yNSAgdGFibGUgPSAmZmFjZS0+cG9zdHNjcmlwdF9uYW1lcy5uYW1lcy5mb3JtYXRfMjU7Ci0KLQotICAgICAgdGFibGUtPm51bV9nbHlwaHMgPSAoRlRfVVNob3J0KW51bV9nbHlwaHM7Ci0gICAgICB0YWJsZS0+b2Zmc2V0cyAgICA9IG9mZnNldF90YWJsZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gIEZhaWw6Ci0gICAgRlRfRlJFRSggb2Zmc2V0X3RhYmxlICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBsb2FkX3Bvc3RfbmFtZXMoIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfU3RyZWFtICBzdHJlYW07Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9GaXhlZCAgIGZvcm1hdDsKLSAgICBGVF9VTG9uZyAgIHBvc3RfbGVuOwotICAgIEZUX1VMb25nICAgcG9zdF9saW1pdDsKLQotCi0gICAgLyogZ2V0IGEgc3RyZWFtIGZvciB0aGUgZmFjZSdzIHJlc291cmNlICovCi0gICAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07Ci0KLSAgICAvKiBzZWVrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIFBTIG5hbWVzIHRhYmxlICovCi0gICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX3Bvc3QsIHN0cmVhbSwgJnBvc3RfbGVuICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBwb3N0X2xpbWl0ID0gRlRfU1RSRUFNX1BPUygpICsgcG9zdF9sZW47Ci0KLSAgICBmb3JtYXQgPSBmYWNlLT5wb3N0c2NyaXB0LkZvcm1hdFR5cGU7Ci0KLSAgICAvKiBnbyB0byBiZWdpbm5pbmcgb2Ygc3VidGFibGUgKi8KLSAgICBpZiAoIEZUX1NUUkVBTV9TS0lQKCAzMiApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIG5vdyByZWFkIHBvc3RzY3JpcHQgdGFibGUgKi8KLSAgICBpZiAoIGZvcm1hdCA9PSAweDAwMDIwMDAwTCApCi0gICAgICBlcnJvciA9IGxvYWRfZm9ybWF0XzIwKCBmYWNlLCBzdHJlYW0sIHBvc3RfbGltaXQgKTsKLSAgICBlbHNlIGlmICggZm9ybWF0ID09IDB4MDAwMjgwMDBMICkKLSAgICAgIGVycm9yID0gbG9hZF9mb3JtYXRfMjUoIGZhY2UsIHN0cmVhbSwgcG9zdF9saW1pdCApOwotICAgIGVsc2UKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLQotICAgIGZhY2UtPnBvc3RzY3JpcHRfbmFtZXMubG9hZGVkID0gMTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdHRfZmFjZV9mcmVlX3BzX25hbWVzKCBUVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSA9IGZhY2UtPnJvb3QubWVtb3J5OwotICAgIFRUX1Bvc3RfTmFtZXMgIG5hbWVzICA9ICZmYWNlLT5wb3N0c2NyaXB0X25hbWVzOwotICAgIEZUX0ZpeGVkICAgICAgIGZvcm1hdDsKLQotCi0gICAgaWYgKCBuYW1lcy0+bG9hZGVkICkKLSAgICB7Ci0gICAgICBmb3JtYXQgPSBmYWNlLT5wb3N0c2NyaXB0LkZvcm1hdFR5cGU7Ci0KLSAgICAgIGlmICggZm9ybWF0ID09IDB4MDAwMjAwMDBMICkKLSAgICAgIHsKLSAgICAgICAgVFRfUG9zdF8yMCAgdGFibGUgPSAmbmFtZXMtPm5hbWVzLmZvcm1hdF8yMDsKLSAgICAgICAgRlRfVVNob3J0ICAgbjsKLQotCi0gICAgICAgIEZUX0ZSRUUoIHRhYmxlLT5nbHlwaF9pbmRpY2VzICk7Ci0gICAgICAgIHRhYmxlLT5udW1fZ2x5cGhzID0gMDsKLQotICAgICAgICBmb3IgKCBuID0gMDsgbiA8IHRhYmxlLT5udW1fbmFtZXM7IG4rKyApCi0gICAgICAgICAgRlRfRlJFRSggdGFibGUtPmdseXBoX25hbWVzW25dICk7Ci0KLSAgICAgICAgRlRfRlJFRSggdGFibGUtPmdseXBoX25hbWVzICk7Ci0gICAgICAgIHRhYmxlLT5udW1fbmFtZXMgPSAwOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIGZvcm1hdCA9PSAweDAwMDI4MDAwTCApCi0gICAgICB7Ci0gICAgICAgIFRUX1Bvc3RfMjUgIHRhYmxlID0gJm5hbWVzLT5uYW1lcy5mb3JtYXRfMjU7Ci0KLQotICAgICAgICBGVF9GUkVFKCB0YWJsZS0+b2Zmc2V0cyApOwotICAgICAgICB0YWJsZS0+bnVtX2dseXBocyA9IDA7Ci0gICAgICB9Ci0gICAgfQotICAgIG5hbWVzLT5sb2FkZWQgPSAwOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2dldF9wc19uYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHZXQgdGhlIFBvc3RTY3JpcHQgZ2x5cGggbmFtZSBvZiBhIGdseXBoLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGlkeCAgICA6OiBUaGUgZ2x5cGggaW5kZXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBTbmFtZSA6OiBUaGUgYWRkcmVzcyBvZiBhIHN0cmluZyBwb2ludGVyLiAgV2lsbCBiZSBOVUxMIGluIGNhc2UgICAqLwotICAvKiAgICAgICAgICAgICAgb2YgZXJyb3IsIG90aGVyd2lzZSBpdCBpcyBhIHBvaW50ZXIgdG8gdGhlIGdseXBoIG5hbWUuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICBZb3UgbXVzdCBub3QgbW9kaWZ5IHRoZSByZXR1cm5lZCBzdHJpbmchICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfZ2V0X3BzX25hbWUoIFRUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9TdHJpbmcqKiAgUFNuYW1lICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgIGVycm9yOwotICAgIFRUX1Bvc3RfTmFtZXMgIG5hbWVzOwotICAgIEZUX0ZpeGVkICAgICAgIGZvcm1hdDsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUE9TVFNDUklQVF9OQU1FUwotICAgIEZUX1NlcnZpY2VfUHNDTWFwcyAgcHNuYW1lczsKLSNlbmRpZgotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9GYWNlX0hhbmRsZSApOwotCi0gICAgaWYgKCBpZHggPj0gKEZUX1VJbnQpZmFjZS0+bWF4X3Byb2ZpbGUubnVtR2x5cGhzICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9HbHlwaF9JbmRleCApOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QT1NUU0NSSVBUX05BTUVTCi0gICAgcHNuYW1lcyA9IChGVF9TZXJ2aWNlX1BzQ01hcHMpZmFjZS0+cHNuYW1lczsKLSAgICBpZiAoICFwc25hbWVzICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0jZW5kaWYKLQotICAgIG5hbWVzID0gJmZhY2UtPnBvc3RzY3JpcHRfbmFtZXM7Ci0KLSAgICAvKiBgLm5vdGRlZicgYnkgZGVmYXVsdCAqLwotICAgICpQU25hbWUgPSBNQUNfTkFNRSggMCApOwotCi0gICAgZm9ybWF0ID0gZmFjZS0+cG9zdHNjcmlwdC5Gb3JtYXRUeXBlOwotCi0gICAgaWYgKCBmb3JtYXQgPT0gMHgwMDAxMDAwMEwgKQotICAgIHsKLSAgICAgIGlmICggaWR4IDwgMjU4ICkgICAgICAgICAgICAgICAgICAgIC8qIHBhcmFub2lkIGNoZWNraW5nICovCi0gICAgICAgICpQU25hbWUgPSBNQUNfTkFNRSggaWR4ICk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBmb3JtYXQgPT0gMHgwMDAyMDAwMEwgKQotICAgIHsKLSAgICAgIFRUX1Bvc3RfMjAgIHRhYmxlID0gJm5hbWVzLT5uYW1lcy5mb3JtYXRfMjA7Ci0KLQotICAgICAgaWYgKCAhbmFtZXMtPmxvYWRlZCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gbG9hZF9wb3N0X25hbWVzKCBmYWNlICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRW5kOwotICAgICAgfQotCi0gICAgICBpZiAoIGlkeCA8IChGVF9VSW50KXRhYmxlLT5udW1fZ2x5cGhzICkKLSAgICAgIHsKLSAgICAgICAgRlRfVVNob3J0ICBuYW1lX2luZGV4ID0gdGFibGUtPmdseXBoX2luZGljZXNbaWR4XTsKLQotCi0gICAgICAgIGlmICggbmFtZV9pbmRleCA8IDI1OCApCi0gICAgICAgICAgKlBTbmFtZSA9IE1BQ19OQU1FKCBuYW1lX2luZGV4ICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAqUFNuYW1lID0gKEZUX1N0cmluZyopdGFibGUtPmdseXBoX25hbWVzW25hbWVfaW5kZXggLSAyNThdOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICggZm9ybWF0ID09IDB4MDAwMjgwMDBMICkKLSAgICB7Ci0gICAgICBUVF9Qb3N0XzI1ICB0YWJsZSA9ICZuYW1lcy0+bmFtZXMuZm9ybWF0XzI1OwotCi0KLSAgICAgIGlmICggIW5hbWVzLT5sb2FkZWQgKQotICAgICAgewotICAgICAgICBlcnJvciA9IGxvYWRfcG9zdF9uYW1lcyggZmFjZSApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEVuZDsKLSAgICAgIH0KLQotICAgICAgaWYgKCBpZHggPCAoRlRfVUludCl0YWJsZS0+bnVtX2dseXBocyApICAgIC8qIHBhcmFub2lkIGNoZWNraW5nICovCi0gICAgICAgICpQU25hbWUgPSBNQUNfTkFNRSggKEZUX0ludClpZHggKyB0YWJsZS0+b2Zmc2V0c1tpZHhdICk7Ci0gICAgfQotCi0gICAgLyogbm90aGluZyB0byBkbyBmb3IgZm9ybWF0ID09IDB4MDAwMzAwMDBMICovCi0KLSAgRW5kOgotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zZm50L3R0cG9zdC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRwb3N0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZWNhMDIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRwb3N0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dHBvc3QuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgUG9zdGNyaXB0IG5hbWUgdGFibGUgcHJvY2Vzc2luZyBmb3IgVHJ1ZVR5cGUgYW5kIE9wZW5UeXBlIGZvbnRzICAgICAgKi8KLS8qICAgIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fVFRQT1NUX0hfXwotI2RlZmluZSBfX1RUUE9TVF9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0NPTkZJR19DT05GSUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfVFJVRVRZUEVfVFlQRVNfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9nZXRfcHNfbmFtZSggVFRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmluZyoqICBQU25hbWUgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHR0X2ZhY2VfZnJlZV9wc19uYW1lcyggVFRfRmFjZSAgZmFjZSApOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fVFRQT1NUX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRzYml0LmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dHNiaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IzNTFlYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dHNiaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDE0NzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRzYml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlIGFuZCBPcGVuVHlwZSBlbWJlZGRlZCBiaXRtYXAgc3VwcG9ydCAoYm9keSkuICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA1LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDEzIGJ5IEdvb2dsZSwgSW5jLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBHb29nbGUgQXV0aG9yKHMpOiBCZWhkYWQgRXNmYWhib2QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLSNpbmNsdWRlIEZUX0JJVE1BUF9ICi0jaW5jbHVkZSAidHRzYml0LmgiCi0KLSNpbmNsdWRlICJzZmVycm9ycy5oIgotCi0jaW5jbHVkZSAidHRtdHguaCIKLSNpbmNsdWRlICJwbmdzaGltLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90dHNiaXQKLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfc2JpdCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotICAgIEZUX1VMb25nICB0YWJsZV9zaXplOwotCi0KLSAgICBmYWNlLT5zYml0X3RhYmxlICAgICAgID0gTlVMTDsKLSAgICBmYWNlLT5zYml0X3RhYmxlX3NpemUgID0gMDsKLSAgICBmYWNlLT5zYml0X3RhYmxlX3R5cGUgID0gVFRfU0JJVF9UQUJMRV9UWVBFX05PTkU7Ci0gICAgZmFjZS0+c2JpdF9udW1fc3RyaWtlcyA9IDA7Ci0KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfQ0JMQywgc3RyZWFtLCAmdGFibGVfc2l6ZSApOwotICAgIGlmICggIWVycm9yICkKLSAgICAgIGZhY2UtPnNiaXRfdGFibGVfdHlwZSA9IFRUX1NCSVRfVEFCTEVfVFlQRV9DQkxDOwotICAgIGVsc2UKLSAgICB7Ci0gICAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfRUJMQywgc3RyZWFtLCAmdGFibGVfc2l6ZSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19ibG9jLCBzdHJlYW0sICZ0YWJsZV9zaXplICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIGZhY2UtPnNiaXRfdGFibGVfdHlwZSA9IFRUX1NCSVRfVEFCTEVfVFlQRV9FQkxDOwotICAgIH0KLQotICAgIGlmICggZXJyb3IgKQotICAgIHsKLSAgICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19zYml4LCBzdHJlYW0sICZ0YWJsZV9zaXplICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIGZhY2UtPnNiaXRfdGFibGVfdHlwZSA9IFRUX1NCSVRfVEFCTEVfVFlQRV9TQklYOwotICAgIH0KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggdGFibGVfc2l6ZSA8IDggKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInR0X2ZhY2VfbG9hZF9zYml0X3N0cmlrZXM6IHRhYmxlIHRvbyBzaG9ydFxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKCAoRlRfVUludClmYWNlLT5zYml0X3RhYmxlX3R5cGUgKQotICAgIHsKLSAgICBjYXNlIFRUX1NCSVRfVEFCTEVfVFlQRV9FQkxDOgotICAgIGNhc2UgVFRfU0JJVF9UQUJMRV9UWVBFX0NCTEM6Ci0gICAgICB7Ci0gICAgICAgIEZUX0J5dGUqICBwOwotICAgICAgICBGVF9GaXhlZCAgdmVyc2lvbjsKLSAgICAgICAgRlRfVUxvbmcgIG51bV9zdHJpa2VzOwotICAgICAgICBGVF9VSW50ICAgY291bnQ7Ci0KLQotICAgICAgICBpZiAoIEZUX0ZSQU1FX0VYVFJBQ1QoIHRhYmxlX3NpemUsIGZhY2UtPnNiaXRfdGFibGUgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGZhY2UtPnNiaXRfdGFibGVfc2l6ZSA9IHRhYmxlX3NpemU7Ci0KLSAgICAgICAgcCA9IGZhY2UtPnNiaXRfdGFibGU7Ci0KLSAgICAgICAgdmVyc2lvbiAgICAgPSBGVF9ORVhUX0xPTkcoIHAgKTsKLSAgICAgICAgbnVtX3N0cmlrZXMgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAgICAgaWYgKCAoIChGVF9VTG9uZyl2ZXJzaW9uICYgMHhGRkZGMDAwMFVMICkgIT0gMHgwMDAyMDAwMFVMICkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIG51bV9zdHJpa2VzID49IDB4MTAwMDBVTCApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogIENvdW50IHRoZSBudW1iZXIgb2Ygc3RyaWtlcyBhdmFpbGFibGUgaW4gdGhlIHRhYmxlLiAgV2UgYXJlIGEgYml0Ci0gICAgICAgICAqICBwYXJhbm9pZCB0aGVyZSBhbmQgZG9uJ3QgdHJ1c3QgdGhlIGRhdGEuCi0gICAgICAgICAqLwotICAgICAgICBjb3VudCA9IChGVF9VSW50KW51bV9zdHJpa2VzOwotICAgICAgICBpZiAoIDggKyA0OFVMICogY291bnQgPiB0YWJsZV9zaXplICkKLSAgICAgICAgICBjb3VudCA9IChGVF9VSW50KSggKCB0YWJsZV9zaXplIC0gOCApIC8gNDggKTsKLQotICAgICAgICBmYWNlLT5zYml0X251bV9zdHJpa2VzID0gY291bnQ7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVFRfU0JJVF9UQUJMRV9UWVBFX1NCSVg6Ci0gICAgICB7Ci0gICAgICAgIEZUX1VTaG9ydCAgdmVyc2lvbjsKLSAgICAgICAgRlRfVVNob3J0ICBmbGFnczsKLSAgICAgICAgRlRfVUxvbmcgICBudW1fc3RyaWtlczsKLSAgICAgICAgRlRfVUludCAgICBjb3VudDsKLQotCi0gICAgICAgIGlmICggRlRfRlJBTUVfRU5URVIoIDggKSApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIHZlcnNpb24gICAgID0gRlRfR0VUX1VTSE9SVCgpOwotICAgICAgICBmbGFncyAgICAgICA9IEZUX0dFVF9VU0hPUlQoKTsKLSAgICAgICAgbnVtX3N0cmlrZXMgPSBGVF9HRVRfVUxPTkcoKTsKLQotICAgICAgICBGVF9GUkFNRV9FWElUKCk7Ci0KLSAgICAgICAgaWYgKCB2ZXJzaW9uIDwgMSApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQml0IDAgbXVzdCBhbHdheXMgYmUgYDEnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBCaXQgMSBjb250cm9scyB0aGUgb3ZlcmxheSBvZiBiaXRtYXBzIHdpdGggb3V0bGluZXMuICovCi0gICAgICAgIC8qIEFsbCBvdGhlciBiaXRzIHNob3VsZCBiZSB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCAhKCBmbGFncyA9PSAxIHx8IGZsYWdzID09IDMgKSB8fAotICAgICAgICAgICAgIG51bV9zdHJpa2VzID49IDB4MTAwMDBVTCAgICAgICkKLSAgICAgICAgewotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB3ZSBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCBiaXQgMTsgaG93ZXZlciwgaXQgaXMgYmV0dGVyIHRvICovCi0gICAgICAgIC8qIGRyYXcgYXQgbGVhc3Qgc29tZXRoaW5nLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBmbGFncyA9PSAzICkKLSAgICAgICAgICBGVF9UUkFDRTEoKCAidHRfZmFjZV9sb2FkX3NiaXRfc3RyaWtlczoiCi0gICAgICAgICAgICAgICAgICAgICAgIiBzYml4IG92ZXJsYXkgbm90IHN1cHBvcnRlZCB5ZXRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAiCi0gICAgICAgICAgICAgICAgICAgICAgIiBleHBlY3QgYmFkIHJlbmRlcmluZyByZXN1bHRzXG4iICkpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqICBDb3VudCB0aGUgbnVtYmVyIG9mIHN0cmlrZXMgYXZhaWxhYmxlIGluIHRoZSB0YWJsZS4gIFdlIGFyZSBhIGJpdAotICAgICAgICAgKiAgcGFyYW5vaWQgdGhlcmUgYW5kIGRvbid0IHRydXN0IHRoZSBkYXRhLgotICAgICAgICAgKi8KLSAgICAgICAgY291bnQgPSAoRlRfVUludCludW1fc3RyaWtlczsKLSAgICAgICAgaWYgKCA4ICsgNFVMICogY291bnQgPiB0YWJsZV9zaXplICkKLSAgICAgICAgICBjb3VudCA9IChGVF9VSW50KSggKCB0YWJsZV9zaXplIC0gOCApIC8gNCApOwotCi0gICAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIEZUX1NUUkVBTV9QT1MoKSAtIDggKSApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGZhY2UtPnNiaXRfdGFibGVfc2l6ZSA9IDggKyBjb3VudCAqIDQ7Ci0gICAgICAgIGlmICggRlRfRlJBTUVfRVhUUkFDVCggZmFjZS0+c2JpdF90YWJsZV9zaXplLCBmYWNlLT5zYml0X3RhYmxlICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBmYWNlLT5zYml0X251bV9zdHJpa2VzID0gY291bnQ7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoICFlcnJvciApCi0gICAgICBGVF9UUkFDRTMoKCAic2JpdF9udW1fc3RyaWtlczogJXVcbiIsIGZhY2UtPnNiaXRfbnVtX3N0cmlrZXMgKSk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gIEV4aXQ6Ci0gICAgaWYgKCBlcnJvciApCi0gICAgewotICAgICAgaWYgKCBmYWNlLT5zYml0X3RhYmxlICkKLSAgICAgICAgRlRfRlJBTUVfUkVMRUFTRSggZmFjZS0+c2JpdF90YWJsZSApOwotICAgICAgZmFjZS0+c2JpdF90YWJsZV9zaXplID0gMDsKLSAgICAgIGZhY2UtPnNiaXRfdGFibGVfdHlwZSA9IFRUX1NCSVRfVEFCTEVfVFlQRV9OT05FOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdHRfZmFjZV9mcmVlX3NiaXQoIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfU3RyZWFtICBzdHJlYW0gPSBmYWNlLT5yb290LnN0cmVhbTsKLQotCi0gICAgRlRfRlJBTUVfUkVMRUFTRSggZmFjZS0+c2JpdF90YWJsZSApOwotICAgIGZhY2UtPnNiaXRfdGFibGVfc2l6ZSAgPSAwOwotICAgIGZhY2UtPnNiaXRfdGFibGVfdHlwZSAgPSBUVF9TQklUX1RBQkxFX1RZUEVfTk9ORTsKLSAgICBmYWNlLT5zYml0X251bV9zdHJpa2VzID0gMDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2Vfc2V0X3NiaXRfc3RyaWtlKCBUVF9GYWNlICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nKiAgICAgICAgYXN0cmlrZV9pbmRleCApCi0gIHsKLSAgICByZXR1cm4gRlRfTWF0Y2hfU2l6ZSggKEZUX0ZhY2UpZmFjZSwgcmVxLCAwLCBhc3RyaWtlX2luZGV4ICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfc3RyaWtlX21ldHJpY3MoIFRUX0ZhY2UgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICAgc3RyaWtlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemVfTWV0cmljcyogIG1ldHJpY3MgKQotICB7Ci0gICAgaWYgKCBzdHJpa2VfaW5kZXggPj0gKEZUX1VMb25nKWZhY2UtPnNiaXRfbnVtX3N0cmlrZXMgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBzd2l0Y2ggKCAoRlRfVUludClmYWNlLT5zYml0X3RhYmxlX3R5cGUgKQotICAgIHsKLSAgICBjYXNlIFRUX1NCSVRfVEFCTEVfVFlQRV9FQkxDOgotICAgIGNhc2UgVFRfU0JJVF9UQUJMRV9UWVBFX0NCTEM6Ci0gICAgICB7Ci0gICAgICAgIEZUX0J5dGUqICBzdHJpa2U7Ci0KLQotICAgICAgICBzdHJpa2UgPSBmYWNlLT5zYml0X3RhYmxlICsgOCArIHN0cmlrZV9pbmRleCAqIDQ4OwotCi0gICAgICAgIG1ldHJpY3MtPnhfcHBlbSA9IChGVF9VU2hvcnQpc3RyaWtlWzQ0XTsKLSAgICAgICAgbWV0cmljcy0+eV9wcGVtID0gKEZUX1VTaG9ydClzdHJpa2VbNDVdOwotCi0gICAgICAgIG1ldHJpY3MtPmFzY2VuZGVyICA9IChGVF9DaGFyKXN0cmlrZVsxNl0gKiA2NDsgIC8qIGhvcmkuYXNjZW5kZXIgICovCi0gICAgICAgIG1ldHJpY3MtPmRlc2NlbmRlciA9IChGVF9DaGFyKXN0cmlrZVsxN10gKiA2NDsgIC8qIGhvcmkuZGVzY2VuZGVyICovCi0gICAgICAgIG1ldHJpY3MtPmhlaWdodCAgICA9IG1ldHJpY3MtPmFzY2VuZGVyIC0gbWV0cmljcy0+ZGVzY2VuZGVyOwotCi0gICAgICAgIC8qIElzIHRoaXMgY29ycmVjdD8gKi8KLSAgICAgICAgbWV0cmljcy0+bWF4X2FkdmFuY2UgPSAoIChGVF9DaGFyKXN0cmlrZVsyMl0gKyAvKiBtaW5fb3JpZ2luX1NCICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWtlWzE4XSArIC8qIG1heF93aWR0aCAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQ2hhcilzdHJpa2VbMjNdICAgLyogbWluX2FkdmFuY2VfU0IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAqIDY0OwotICAgICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgICAgfQotCi0gICAgY2FzZSBUVF9TQklUX1RBQkxFX1RZUEVfU0JJWDoKLSAgICAgIHsKLSAgICAgICAgRlRfU3RyZWFtICAgICAgIHN0cmVhbSA9IGZhY2UtPnJvb3Quc3RyZWFtOwotICAgICAgICBGVF9VSW50ICAgICAgICAgb2Zmc2V0LCB1cGVtOwotICAgICAgICBGVF9VU2hvcnQgICAgICAgcHBlbSwgcmVzb2x1dGlvbjsKLSAgICAgICAgVFRfSG9yaUhlYWRlciAgKmhvcmk7Ci0gICAgICAgIEZUX1VMb25nICAgICAgICB0YWJsZV9zaXplOwotICAgICAgICBGVF9Qb3MgICAgICAgICAgcHBlbV8sIHVwZW1fOyAvKiB0byByZWR1Y2UgY2FzdHMgKi8KLQotICAgICAgICBGVF9FcnJvciAgZXJyb3I7Ci0gICAgICAgIEZUX0J5dGUqICBwOwotCi0KLSAgICAgICAgcCAgICAgID0gZmFjZS0+c2JpdF90YWJsZSArIDggKyA0ICogc3RyaWtlX2luZGV4OwotICAgICAgICBvZmZzZXQgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAgICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX3NiaXgsIHN0cmVhbSwgJnRhYmxlX3NpemUgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICAgIGlmICggb2Zmc2V0ICsgNCAgPiB0YWJsZV9zaXplICkKLSAgICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLQotICAgICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBGVF9TVFJFQU1fUE9TKCkgKyBvZmZzZXQgKSB8fAotICAgICAgICAgICAgIEZUX0ZSQU1FX0VOVEVSKCA0ICkgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgICAgIHBwZW0gICAgICAgPSBGVF9HRVRfVVNIT1JUKCk7Ci0gICAgICAgIHJlc29sdXRpb24gPSBGVF9HRVRfVVNIT1JUKCk7Ci0KLSAgICAgICAgRlRfVU5VU0VEKCByZXNvbHV0aW9uICk7IC8qIFdoYXQgdG8gZG8gd2l0aCB0aGlzPyAqLwotCi0gICAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICAgICAgICB1cGVtID0gZmFjZS0+aGVhZGVyLlVuaXRzX1Blcl9FTTsKLSAgICAgICAgaG9yaSA9ICZmYWNlLT5ob3Jpem9udGFsOwotCi0gICAgICAgIG1ldHJpY3MtPnhfcHBlbSA9IHBwZW07Ci0gICAgICAgIG1ldHJpY3MtPnlfcHBlbSA9IHBwZW07Ci0KLSAgICAgICAgcHBlbV8gPSAoRlRfUG9zKXBwZW07Ci0gICAgICAgIHVwZW1fID0gKEZUX1Bvcyl1cGVtOwotCi0gICAgICAgIG1ldHJpY3MtPmFzY2VuZGVyICAgID0gcHBlbV8gKiBob3JpLT5Bc2NlbmRlciAqIDY0IC8gdXBlbV87Ci0gICAgICAgIG1ldHJpY3MtPmRlc2NlbmRlciAgID0gcHBlbV8gKiBob3JpLT5EZXNjZW5kZXIgKiA2NCAvIHVwZW1fOwotICAgICAgICBtZXRyaWNzLT5oZWlnaHQgICAgICA9IHBwZW1fICogKCBob3JpLT5Bc2NlbmRlciAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcmktPkRlc2NlbmRlciArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvcmktPkxpbmVfR2FwICkgKiA2NCAvIHVwZW1fOwotICAgICAgICBtZXRyaWNzLT5tYXhfYWR2YW5jZSA9IHBwZW1fICogaG9yaS0+YWR2YW5jZV9XaWR0aF9NYXggKiA2NCAvIHVwZW1fOwotCi0gICAgICAgIHJldHVybiBlcnJvcjsKLSAgICAgIH0KLQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICB9Ci0gIH0KLQotCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9TQml0RGVjb2RlclJlY18KLSAgewotICAgIFRUX0ZhY2UgICAgICAgICAgZmFjZTsKLSAgICBGVF9TdHJlYW0gICAgICAgIHN0cmVhbTsKLSAgICBGVF9CaXRtYXAqICAgICAgIGJpdG1hcDsKLSAgICBUVF9TQml0X01ldHJpY3MgIG1ldHJpY3M7Ci0gICAgRlRfQm9vbCAgICAgICAgICBtZXRyaWNzX2xvYWRlZDsKLSAgICBGVF9Cb29sICAgICAgICAgIGJpdG1hcF9hbGxvY2F0ZWQ7Ci0gICAgRlRfQnl0ZSAgICAgICAgICBiaXRfZGVwdGg7Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgIGViZHRfc3RhcnQ7Ci0gICAgRlRfVUxvbmcgICAgICAgICBlYmR0X3NpemU7Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgIHN0cmlrZV9pbmRleF9hcnJheTsKLSAgICBGVF9VTG9uZyAgICAgICAgIHN0cmlrZV9pbmRleF9jb3VudDsKLSAgICBGVF9CeXRlKiAgICAgICAgIGVibGNfYmFzZTsKLSAgICBGVF9CeXRlKiAgICAgICAgIGVibGNfbGltaXQ7Ci0KLSAgfSBUVF9TQml0RGVjb2RlclJlYywgKlRUX1NCaXREZWNvZGVyOwotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHR0X3NiaXRfZGVjb2Rlcl9pbml0KCBUVF9TQml0RGVjb2RlciAgICAgICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAgICAgIHN0cmlrZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfTWV0cmljc1JlYyogIG1ldHJpY3MgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGZhY2UtPnJvb3Quc3RyZWFtOwotICAgIEZUX1VMb25nICAgZWJkdF9zaXplOwotCi0KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfQ0JEVCwgc3RyZWFtLCAmZWJkdF9zaXplICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfRUJEVCwgc3RyZWFtLCAmZWJkdF9zaXplICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfYmRhdCwgc3RyZWFtLCAmZWJkdF9zaXplICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBkZWNvZGVyLT5mYWNlICAgID0gZmFjZTsKLSAgICBkZWNvZGVyLT5zdHJlYW0gID0gc3RyZWFtOwotICAgIGRlY29kZXItPmJpdG1hcCAgPSAmZmFjZS0+cm9vdC5nbHlwaC0+Yml0bWFwOwotICAgIGRlY29kZXItPm1ldHJpY3MgPSBtZXRyaWNzOwotCi0gICAgZGVjb2Rlci0+bWV0cmljc19sb2FkZWQgICA9IDA7Ci0gICAgZGVjb2Rlci0+Yml0bWFwX2FsbG9jYXRlZCA9IDA7Ci0KLSAgICBkZWNvZGVyLT5lYmR0X3N0YXJ0ID0gRlRfU1RSRUFNX1BPUygpOwotICAgIGRlY29kZXItPmViZHRfc2l6ZSAgPSBlYmR0X3NpemU7Ci0KLSAgICBkZWNvZGVyLT5lYmxjX2Jhc2UgID0gZmFjZS0+c2JpdF90YWJsZTsKLSAgICBkZWNvZGVyLT5lYmxjX2xpbWl0ID0gZmFjZS0+c2JpdF90YWJsZSArIGZhY2UtPnNiaXRfdGFibGVfc2l6ZTsKLQotICAgIC8qIG5vdyBmaW5kIHRoZSBzdHJpa2UgY29ycmVzcG9uZGluZyB0byB0aGUgaW5kZXggKi8KLSAgICB7Ci0gICAgICBGVF9CeXRlKiAgcDsKLQotCi0gICAgICBpZiAoIDggKyA0OCAqIHN0cmlrZV9pbmRleCArIDMgKiA0ICsgMzQgKyAxID4gZmFjZS0+c2JpdF90YWJsZV9zaXplICkKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIHAgPSBkZWNvZGVyLT5lYmxjX2Jhc2UgKyA4ICsgNDggKiBzdHJpa2VfaW5kZXg7Ci0KLSAgICAgIGRlY29kZXItPnN0cmlrZV9pbmRleF9hcnJheSA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgIHAgICAgICAgICAgICAgICAgICAgICAgICAgICs9IDQ7Ci0gICAgICBkZWNvZGVyLT5zdHJpa2VfaW5kZXhfY291bnQgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICBwICAgICAgICAgICAgICAgICAgICAgICAgICArPSAzNDsKLSAgICAgIGRlY29kZXItPmJpdF9kZXB0aCAgICAgICAgICA9ICpwOwotCi0gICAgICAvKiBkZWNvZGVyLT5zdHJpa2VfaW5kZXhfYXJyYXkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICA4ICogZGVjb2Rlci0+c3RyaWtlX2luZGV4X2NvdW50ID4gZmFjZS0+c2JpdF90YWJsZV9zaXplID8gKi8KLSAgICAgIGlmICggZGVjb2Rlci0+c3RyaWtlX2luZGV4X2FycmF5ID4gZmFjZS0+c2JpdF90YWJsZV9zaXplICAgICAgICAgICB8fAotICAgICAgICAgICBkZWNvZGVyLT5zdHJpa2VfaW5kZXhfY291bnQgPgotICAgICAgICAgICAgICggZmFjZS0+c2JpdF90YWJsZV9zaXplIC0gZGVjb2Rlci0+c3RyaWtlX2luZGV4X2FycmF5ICkgLyA4ICkKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgdHRfc2JpdF9kZWNvZGVyX2RvbmUoIFRUX1NCaXREZWNvZGVyICBkZWNvZGVyICkKLSAgewotICAgIEZUX1VOVVNFRCggZGVjb2RlciApOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfc2JpdF9kZWNvZGVyX2FsbG9jX2JpdG1hcCggVFRfU0JpdERlY29kZXIgIGRlY29kZXIgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfVUludCAgICAgd2lkdGgsIGhlaWdodDsKLSAgICBGVF9CaXRtYXAqICBtYXAgPSBkZWNvZGVyLT5iaXRtYXA7Ci0gICAgRlRfVUxvbmcgICAgc2l6ZTsKLQotCi0gICAgaWYgKCAhZGVjb2Rlci0+bWV0cmljc19sb2FkZWQgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICB3aWR0aCAgPSBkZWNvZGVyLT5tZXRyaWNzLT53aWR0aDsKLSAgICBoZWlnaHQgPSBkZWNvZGVyLT5tZXRyaWNzLT5oZWlnaHQ7Ci0KLSAgICBtYXAtPndpZHRoID0gd2lkdGg7Ci0gICAgbWFwLT5yb3dzICA9IGhlaWdodDsKLQotICAgIHN3aXRjaCAoIGRlY29kZXItPmJpdF9kZXB0aCApCi0gICAgewotICAgIGNhc2UgMToKLSAgICAgIG1hcC0+cGl4ZWxfbW9kZSA9IEZUX1BJWEVMX01PREVfTU9OTzsKLSAgICAgIG1hcC0+cGl0Y2ggICAgICA9IChpbnQpKCAoIG1hcC0+d2lkdGggKyA3ICkgPj4gMyApOwotICAgICAgbWFwLT5udW1fZ3JheXMgID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAyOgotICAgICAgbWFwLT5waXhlbF9tb2RlID0gRlRfUElYRUxfTU9ERV9HUkFZMjsKLSAgICAgIG1hcC0+cGl0Y2ggICAgICA9IChpbnQpKCAoIG1hcC0+d2lkdGggKyAzICkgPj4gMiApOwotICAgICAgbWFwLT5udW1fZ3JheXMgID0gNDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA0OgotICAgICAgbWFwLT5waXhlbF9tb2RlID0gRlRfUElYRUxfTU9ERV9HUkFZNDsKLSAgICAgIG1hcC0+cGl0Y2ggICAgICA9IChpbnQpKCAoIG1hcC0+d2lkdGggKyAxICkgPj4gMSApOwotICAgICAgbWFwLT5udW1fZ3JheXMgID0gMTY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgODoKLSAgICAgIG1hcC0+cGl4ZWxfbW9kZSA9IEZUX1BJWEVMX01PREVfR1JBWTsKLSAgICAgIG1hcC0+cGl0Y2ggICAgICA9IChpbnQpKCBtYXAtPndpZHRoICk7Ci0gICAgICBtYXAtPm51bV9ncmF5cyAgPSAyNTY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMzI6Ci0gICAgICBtYXAtPnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX0JHUkE7Ci0gICAgICBtYXAtPnBpdGNoICAgICAgPSAoaW50KSggbWFwLT53aWR0aCAqIDQgKTsKLSAgICAgIG1hcC0+bnVtX2dyYXlzICA9IDI1NjsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBzaXplID0gbWFwLT5yb3dzICogKEZUX1VMb25nKW1hcC0+cGl0Y2g7Ci0KLSAgICAvKiBjaGVjayB0aGF0IHRoZXJlIGlzIG5vIGVtcHR5IGltYWdlICovCi0gICAgaWYgKCBzaXplID09IDAgKQotICAgICAgZ290byBFeGl0OyAgICAgLyogZXhpdCBzdWNjZXNzZnVsbHkhICovCi0KLSAgICBlcnJvciA9IGZ0X2dseXBoc2xvdF9hbGxvY19iaXRtYXAoIGRlY29kZXItPmZhY2UtPnJvb3QuZ2x5cGgsIHNpemUgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGRlY29kZXItPmJpdG1hcF9hbGxvY2F0ZWQgPSAxOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfc2JpdF9kZWNvZGVyX2xvYWRfbWV0cmljcyggVFRfU0JpdERlY29kZXIgIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICpwcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgYmlnICkKLSAgewotICAgIEZUX0J5dGUqICAgICAgICAgcCAgICAgICA9ICpwcDsKLSAgICBUVF9TQml0X01ldHJpY3MgIG1ldHJpY3MgPSBkZWNvZGVyLT5tZXRyaWNzOwotCi0KLSAgICBpZiAoIHAgKyA1ID4gbGltaXQgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgbWV0cmljcy0+aGVpZ2h0ICAgICAgID0gcFswXTsKLSAgICBtZXRyaWNzLT53aWR0aCAgICAgICAgPSBwWzFdOwotICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWCA9IChGVF9DaGFyKXBbMl07Ci0gICAgbWV0cmljcy0+aG9yaUJlYXJpbmdZID0gKEZUX0NoYXIpcFszXTsKLSAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSAgPSBwWzRdOwotCi0gICAgcCArPSA1OwotICAgIGlmICggYmlnICkKLSAgICB7Ci0gICAgICBpZiAoIHAgKyAzID4gbGltaXQgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWCA9IChGVF9DaGFyKXBbMF07Ci0gICAgICBtZXRyaWNzLT52ZXJ0QmVhcmluZ1kgPSAoRlRfQ2hhcilwWzFdOwotICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgID0gcFsyXTsKLQotICAgICAgcCArPSAzOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogYXZvaWQgdW5pbml0aWFsaXplZCBkYXRhIGluIGNhc2UgdGhlcmUgaXMgbm8gdmVydGljYWwgaW5mbyAtLSAqLwotICAgICAgbWV0cmljcy0+dmVydEJlYXJpbmdYID0gMDsKLSAgICAgIG1ldHJpY3MtPnZlcnRCZWFyaW5nWSA9IDA7Ci0gICAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSAgPSAwOwotICAgIH0KLQotICAgIGRlY29kZXItPm1ldHJpY3NfbG9hZGVkID0gMTsKLSAgICAqcHAgPSBwOwotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0KLSAgRmFpbDoKLSAgICBGVF9UUkFDRTEoKCAidHRfc2JpdF9kZWNvZGVyX2xvYWRfbWV0cmljczogYnJva2VuIHRhYmxlXG4iICkpOwotICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICB9Ci0KLQotICAvKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9zYml0X2RlY29kZXJfbG9hZF9pbWFnZSggVFRfU0JpdERlY29kZXIgIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgeF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgeV9wb3MgKTsKLQotICB0eXBlZGVmIEZUX0Vycm9yICAoKlRUX1NCaXREZWNvZGVyX0xvYWRGdW5jKSggVFRfU0JpdERlY29kZXIgIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgICAgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICBwbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgeF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgeV9wb3MgKTsKLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9zYml0X2RlY29kZXJfbG9hZF9ieXRlX2FsaWduZWQoIFRUX1NCaXREZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgeF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHlfcG9zICkKLSAgewotICAgIEZUX0Vycm9yICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX0J5dGUqICAgIGxpbmU7Ci0gICAgRlRfSW50ICAgICAgcGl0Y2gsIHdpZHRoLCBoZWlnaHQsIGxpbmVfYml0cywgaDsKLSAgICBGVF9VSW50ICAgICBiaXRfaGVpZ2h0LCBiaXRfd2lkdGg7Ci0gICAgRlRfQml0bWFwKiAgYml0bWFwOwotCi0KLSAgICAvKiBjaGVjayB0aGF0IHdlIGNhbiB3cml0ZSB0aGUgZ2x5cGggaW50byB0aGUgYml0bWFwICovCi0gICAgYml0bWFwICAgICA9IGRlY29kZXItPmJpdG1hcDsKLSAgICBiaXRfd2lkdGggID0gYml0bWFwLT53aWR0aDsKLSAgICBiaXRfaGVpZ2h0ID0gYml0bWFwLT5yb3dzOwotICAgIHBpdGNoICAgICAgPSBiaXRtYXAtPnBpdGNoOwotICAgIGxpbmUgICAgICAgPSBiaXRtYXAtPmJ1ZmZlcjsKLQotICAgIHdpZHRoICA9IGRlY29kZXItPm1ldHJpY3MtPndpZHRoOwotICAgIGhlaWdodCA9IGRlY29kZXItPm1ldHJpY3MtPmhlaWdodDsKLQotICAgIGxpbmVfYml0cyA9IHdpZHRoICogZGVjb2Rlci0+Yml0X2RlcHRoOwotCi0gICAgaWYgKCB4X3BvcyA8IDAgfHwgKEZUX1VJbnQpKCB4X3BvcyArIHdpZHRoICkgPiBiaXRfd2lkdGggICB8fAotICAgICAgICAgeV9wb3MgPCAwIHx8IChGVF9VSW50KSggeV9wb3MgKyBoZWlnaHQgKSA+IGJpdF9oZWlnaHQgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMSgoICJ0dF9zYml0X2RlY29kZXJfbG9hZF9ieXRlX2FsaWduZWQ6IgotICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIGJpdG1hcCBkaW1lbnNpb25zXG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggcCArICggKCBsaW5lX2JpdHMgKyA3ICkgPj4gMyApICogaGVpZ2h0ID4gbGltaXQgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMSgoICJ0dF9zYml0X2RlY29kZXJfbG9hZF9ieXRlX2FsaWduZWQ6IGJyb2tlbiBiaXRtYXBcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogbm93IGRvIHRoZSBibGl0ICovCi0gICAgbGluZSAgKz0geV9wb3MgKiBwaXRjaCArICggeF9wb3MgPj4gMyApOwotICAgIHhfcG9zICY9IDc7Ci0KLSAgICBpZiAoIHhfcG9zID09IDAgKSAgLyogdGhlIGVhc3kgb25lICovCi0gICAgewotICAgICAgZm9yICggaCA9IGhlaWdodDsgaCA+IDA7IGgtLSwgbGluZSArPSBwaXRjaCApCi0gICAgICB7Ci0gICAgICAgIEZUX0J5dGUqICBwd3JpdGUgPSBsaW5lOwotICAgICAgICBGVF9JbnQgICAgdzsKLQotCi0gICAgICAgIGZvciAoIHcgPSBsaW5lX2JpdHM7IHcgPj0gODsgdyAtPSA4ICkKLSAgICAgICAgewotICAgICAgICAgIHB3cml0ZVswXSA9IChGVF9CeXRlKSggcHdyaXRlWzBdIHwgKnArKyApOwotICAgICAgICAgIHB3cml0ZSAgICs9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHcgPiAwICkKLSAgICAgICAgICBwd3JpdGVbMF0gPSAoRlRfQnl0ZSkoIHB3cml0ZVswXSB8ICggKnArKyAmICggMHhGRjAwVSA+PiB3ICkgKSApOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlICAvKiB4X3BvcyA+IDAgKi8KLSAgICB7Ci0gICAgICBmb3IgKCBoID0gaGVpZ2h0OyBoID4gMDsgaC0tLCBsaW5lICs9IHBpdGNoICkKLSAgICAgIHsKLSAgICAgICAgRlRfQnl0ZSogIHB3cml0ZSA9IGxpbmU7Ci0gICAgICAgIEZUX0ludCAgICB3OwotICAgICAgICBGVF9VSW50ICAgd3ZhbCA9IDA7Ci0KLQotICAgICAgICBmb3IgKCB3ID0gbGluZV9iaXRzOyB3ID49IDg7IHcgLT0gOCApCi0gICAgICAgIHsKLSAgICAgICAgICB3dmFsICAgICAgID0gKEZUX1VJbnQpKCB3dmFsIHwgKnArKyApOwotICAgICAgICAgIHB3cml0ZVswXSAgPSAoRlRfQnl0ZSkoIHB3cml0ZVswXSB8ICggd3ZhbCA+PiB4X3BvcyApICk7Ci0gICAgICAgICAgcHdyaXRlICAgICs9IDE7Ci0gICAgICAgICAgd3ZhbCAgICAgPDw9IDg7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIHcgPiAwICkKLSAgICAgICAgICB3dmFsID0gKEZUX1VJbnQpKCB3dmFsIHwgKCAqcCsrICYgKCAweEZGMDBVID4+IHcgKSApICk7Ci0KLSAgICAgICAgLyogYWxsIGJpdHMgcmVhZCBhbmQgdGhlcmUgYXJlIGB4X3BvcyArIHcnIGJpdHMgdG8gYmUgd3JpdHRlbiAqLwotCi0gICAgICAgIHB3cml0ZVswXSA9IChGVF9CeXRlKSggcHdyaXRlWzBdIHwgKCB3dmFsID4+IHhfcG9zICkgKTsKLQotICAgICAgICBpZiAoIHhfcG9zICsgdyA+IDggKQotICAgICAgICB7Ci0gICAgICAgICAgcHdyaXRlKys7Ci0gICAgICAgICAgd3ZhbCAgICAgPDw9IDg7Ci0gICAgICAgICAgcHdyaXRlWzBdICA9IChGVF9CeXRlKSggcHdyaXRlWzBdIHwgKCB3dmFsID4+IHhfcG9zICkgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIGlmICggIWVycm9yICkKLSAgICAgIEZUX1RSQUNFMygoICJ0dF9zYml0X2RlY29kZXJfbG9hZF9ieXRlX2FsaWduZWQ6IGxvYWRlZFxuIiApKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qCi0gICAqIExvYWQgYSBiaXQtYWxpZ25lZCBiaXRtYXAgKHdpdGggcG9pbnRlciBgcCcpIGludG8gYSBsaW5lLWFsaWduZWQgYml0bWFwCi0gICAqICh3aXRoIHBvaW50ZXIgYHB3cml0ZScpLiAgSW4gdGhlIGV4YW1wbGUgYmVsb3csIHRoZSB3aWR0aCBpcyAzIHBpeGVsLAotICAgKiBhbmQgYHhfcG9zJyBpcyAxIHBpeGVsLgotICAgKgotICAgKiAgICAgICBwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHArMQotICAgKiAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICogICAgIHwgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAgfCA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMCB8Li4uCi0gICAqICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgKiAgICAgICArLS0tLS0tLSsgICArLS0tLS0tLSsgICArLS0tLS0tLSsgLi4uCi0gICAqICAgICAgICAgICAuICAgICAgICAgICAuICAgICAgICAgICAuCi0gICAqICAgICAgICAgICAuICAgICAgICAgICAuICAgICAgICAgICAuCi0gICAqICAgICAgICAgICB2ICAgICAgICAgICAuICAgICAgICAgICAuCi0gICAqICAgICAgICstLS0tLS0tKyAgICAgICAuICAgICAgICAgICAuCi0gICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAuCi0gICAqIHwgNyAgIDYgICA1ICAgNCAgIDMgICAyICAgMSAgIDAgfCAuCi0gICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAuCi0gICAqICAgcHdyaXRlICAgICAgICAgICAgICAuICAgICAgICAgICAuCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAuICAgICAgICAgICAuCi0gICAqICAgICAgICAgICAgICAgICAgICAgICB2ICAgICAgICAgICAuCi0gICAqICAgICAgICAgICAgICAgICAgICstLS0tLS0tKyAgICAgICAuCi0gICAqICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgKiAgICAgICAgICAgICB8IDcgICA2ICAgNSAgIDQgICAzICAgMiAgIDEgICAwIHwKLSAgICogICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAqICAgICAgICAgICAgICAgcHdyaXRlKzEgICAgICAgICAgICAuCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Ci0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstLS0tLS0tKwotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgfCA3ICAgNiAgIDUgICA0ICAgMyAgIDIgICAxICAgMCB8Ci0gICAqICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHB3cml0ZSsyCi0gICAqCi0gICAqLwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9zYml0X2RlY29kZXJfbG9hZF9iaXRfYWxpZ25lZCggVFRfU0JpdERlY29kZXIgIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiAgICAgICAgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICB4X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICB5X3BvcyApCi0gIHsKLSAgICBGVF9FcnJvciAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9CeXRlKiAgICBsaW5lOwotICAgIEZUX0ludCAgICAgIHBpdGNoLCB3aWR0aCwgaGVpZ2h0LCBsaW5lX2JpdHMsIGgsIG5iaXRzOwotICAgIEZUX1VJbnQgICAgIGJpdF9oZWlnaHQsIGJpdF93aWR0aDsKLSAgICBGVF9CaXRtYXAqICBiaXRtYXA7Ci0gICAgRlRfVVNob3J0ICAgcnZhbDsKLQotCi0gICAgLyogY2hlY2sgdGhhdCB3ZSBjYW4gd3JpdGUgdGhlIGdseXBoIGludG8gdGhlIGJpdG1hcCAqLwotICAgIGJpdG1hcCAgICAgPSBkZWNvZGVyLT5iaXRtYXA7Ci0gICAgYml0X3dpZHRoICA9IGJpdG1hcC0+d2lkdGg7Ci0gICAgYml0X2hlaWdodCA9IGJpdG1hcC0+cm93czsKLSAgICBwaXRjaCAgICAgID0gYml0bWFwLT5waXRjaDsKLSAgICBsaW5lICAgICAgID0gYml0bWFwLT5idWZmZXI7Ci0KLSAgICB3aWR0aCAgPSBkZWNvZGVyLT5tZXRyaWNzLT53aWR0aDsKLSAgICBoZWlnaHQgPSBkZWNvZGVyLT5tZXRyaWNzLT5oZWlnaHQ7Ci0KLSAgICBsaW5lX2JpdHMgPSB3aWR0aCAqIGRlY29kZXItPmJpdF9kZXB0aDsKLQotICAgIGlmICggeF9wb3MgPCAwIHx8IChGVF9VSW50KSggeF9wb3MgKyB3aWR0aCApID4gYml0X3dpZHRoICAgfHwKLSAgICAgICAgIHlfcG9zIDwgMCB8fCAoRlRfVUludCkoIHlfcG9zICsgaGVpZ2h0ICkgPiBiaXRfaGVpZ2h0ICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTEoKCAidHRfc2JpdF9kZWNvZGVyX2xvYWRfYml0X2FsaWduZWQ6IgotICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIGJpdG1hcCBkaW1lbnNpb25zXG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggcCArICggKCBsaW5lX2JpdHMgKiBoZWlnaHQgKyA3ICkgPj4gMyApID4gbGltaXQgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMSgoICJ0dF9zYml0X2RlY29kZXJfbG9hZF9iaXRfYWxpZ25lZDogYnJva2VuIGJpdG1hcFxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBub3cgZG8gdGhlIGJsaXQgKi8KLQotICAgIC8qIGFkanVzdCBgbGluZScgdG8gcG9pbnQgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGJpdG1hcCAqLwotICAgIGxpbmUgICs9IHlfcG9zICogcGl0Y2ggKyAoIHhfcG9zID4+IDMgKTsKLSAgICB4X3BvcyAmPSA3OwotCi0gICAgLyogdGhlIGhpZ2hlciBieXRlIG9mIGBydmFsJyBpcyB1c2VkIGFzIGEgYnVmZmVyICovCi0gICAgcnZhbCAgPSAwOwotICAgIG5iaXRzID0gMDsKLQotICAgIGZvciAoIGggPSBoZWlnaHQ7IGggPiAwOyBoLS0sIGxpbmUgKz0gcGl0Y2ggKQotICAgIHsKLSAgICAgIEZUX0J5dGUqICBwd3JpdGUgPSBsaW5lOwotICAgICAgRlRfSW50ICAgIHcgICAgICA9IGxpbmVfYml0czsKLQotCi0gICAgICAvKiBoYW5kbGUgaW5pdGlhbCBieXRlIChpbiB0YXJnZXQgYml0bWFwKSBzcGVjaWFsbHkgaWYgbmVjZXNzYXJ5ICovCi0gICAgICBpZiAoIHhfcG9zICkKLSAgICAgIHsKLSAgICAgICAgdyA9ICggbGluZV9iaXRzIDwgOCAtIHhfcG9zICkgPyBsaW5lX2JpdHMgOiA4IC0geF9wb3M7Ci0KLSAgICAgICAgaWYgKCBoID09IGhlaWdodCApCi0gICAgICAgIHsKLSAgICAgICAgICBydmFsICA9ICpwKys7Ci0gICAgICAgICAgbmJpdHMgPSB4X3BvczsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggbmJpdHMgPCB3ICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggcCA8IGxpbWl0ICkKLSAgICAgICAgICAgIHJ2YWwgfD0gKnArKzsKLSAgICAgICAgICBuYml0cyArPSA4IC0gdzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBydmFsICA+Pj0gODsKLSAgICAgICAgICBuYml0cyAgLT0gdzsKLSAgICAgICAgfQotCi0gICAgICAgICpwd3JpdGUrKyB8PSAoICggcnZhbCA+PiBuYml0cyApICYgMHhGRiApICYKLSAgICAgICAgICAgICAgICAgICAgICggfiggMHhGRiA8PCB3ICkgPDwgKCA4IC0gdyAtIHhfcG9zICkgKTsKLSAgICAgICAgcnZhbCAgICAgPDw9IDg7Ci0KLSAgICAgICAgdyA9IGxpbmVfYml0cyAtIHc7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGhhbmRsZSBtZWRpYWwgYnl0ZXMgKi8KLSAgICAgIGZvciAoIDsgdyA+PSA4OyB3IC09IDggKQotICAgICAgewotICAgICAgICBydmFsICAgICAgfD0gKnArKzsKLSAgICAgICAgKnB3cml0ZSsrIHw9ICggcnZhbCA+PiBuYml0cyApICYgMHhGRjsKLQotICAgICAgICBydmFsIDw8PSA4OwotICAgICAgfQotCi0gICAgICAvKiBoYW5kbGUgZmluYWwgYnl0ZSBpZiBuZWNlc3NhcnkgKi8KLSAgICAgIGlmICggdyA+IDAgKQotICAgICAgewotICAgICAgICBpZiAoIG5iaXRzIDwgdyApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIHAgPCBsaW1pdCApCi0gICAgICAgICAgICBydmFsIHw9ICpwKys7Ci0gICAgICAgICAgKnB3cml0ZSB8PSAoICggcnZhbCA+PiBuYml0cyApICYgMHhGRiApICYgKCAweEZGMDBVID4+IHcgKTsKLSAgICAgICAgICBuYml0cyAgICs9IDggLSB3OwotCi0gICAgICAgICAgcnZhbCA8PD0gODsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAqcHdyaXRlIHw9ICggKCBydmFsID4+IG5iaXRzICkgJiAweEZGICkgJiAoIDB4RkYwMFUgPj4gdyApOwotICAgICAgICAgIG5iaXRzICAgLT0gdzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIGlmICggIWVycm9yICkKLSAgICAgIEZUX1RSQUNFMygoICJ0dF9zYml0X2RlY29kZXJfbG9hZF9iaXRfYWxpZ25lZDogbG9hZGVkXG4iICkpOwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2NvbXBvdW5kKCBUVF9TQml0RGVjb2RlciAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQnl0ZSogICAgICAgIGxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHhfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHlfcG9zICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9VSW50ICAgbnVtX2NvbXBvbmVudHMsIG5uOwotCi0gICAgRlRfQ2hhciAgaG9yaUJlYXJpbmdYID0gKEZUX0NoYXIpZGVjb2Rlci0+bWV0cmljcy0+aG9yaUJlYXJpbmdYOwotICAgIEZUX0NoYXIgIGhvcmlCZWFyaW5nWSA9IChGVF9DaGFyKWRlY29kZXItPm1ldHJpY3MtPmhvcmlCZWFyaW5nWTsKLSAgICBGVF9CeXRlICBob3JpQWR2YW5jZSAgPSAoRlRfQnl0ZSlkZWNvZGVyLT5tZXRyaWNzLT5ob3JpQWR2YW5jZTsKLSAgICBGVF9DaGFyICB2ZXJ0QmVhcmluZ1ggPSAoRlRfQ2hhcilkZWNvZGVyLT5tZXRyaWNzLT52ZXJ0QmVhcmluZ1g7Ci0gICAgRlRfQ2hhciAgdmVydEJlYXJpbmdZID0gKEZUX0NoYXIpZGVjb2Rlci0+bWV0cmljcy0+dmVydEJlYXJpbmdZOwotICAgIEZUX0J5dGUgIHZlcnRBZHZhbmNlICA9IChGVF9CeXRlKWRlY29kZXItPm1ldHJpY3MtPnZlcnRBZHZhbmNlOwotCi0KLSAgICBpZiAoIHAgKyAyID4gbGltaXQgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgbnVtX2NvbXBvbmVudHMgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIGlmICggcCArIDQgKiBudW1fY29tcG9uZW50cyA+IGxpbWl0ICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTEoKCAidHRfc2JpdF9kZWNvZGVyX2xvYWRfY29tcG91bmQ6IGJyb2tlbiB0YWJsZVxuIiApKTsKLSAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTMoKCAidHRfc2JpdF9kZWNvZGVyX2xvYWRfY29tcG91bmQ6IGxvYWRpbmcgJWQgY29tcG9uZW50c1xuIiwKLSAgICAgICAgICAgICAgICBudW1fY29tcG9uZW50cyApKTsKLQotICAgIGZvciAoIG5uID0gMDsgbm4gPCBudW1fY29tcG9uZW50czsgbm4rKyApCi0gICAgewotICAgICAgRlRfVUludCAgZ2luZGV4ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIEZUX0J5dGUgIGR4ICAgICA9IEZUX05FWFRfQllURSggcCApOwotICAgICAgRlRfQnl0ZSAgZHkgICAgID0gRlRfTkVYVF9CWVRFKCBwICk7Ci0KLQotICAgICAgLyogTkI6IGEgcmVjdXJzaXZlIGNhbGwgKi8KLSAgICAgIGVycm9yID0gdHRfc2JpdF9kZWNvZGVyX2xvYWRfaW1hZ2UoIGRlY29kZXIsIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfcG9zICsgZHgsIHlfcG9zICsgZHkgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTMoKCAidHRfc2JpdF9kZWNvZGVyX2xvYWRfY29tcG91bmQ6IGRvbmVcbiIgKSk7Ci0KLSAgICBkZWNvZGVyLT5tZXRyaWNzLT5ob3JpQmVhcmluZ1ggPSBob3JpQmVhcmluZ1g7Ci0gICAgZGVjb2Rlci0+bWV0cmljcy0+aG9yaUJlYXJpbmdZID0gaG9yaUJlYXJpbmdZOwotICAgIGRlY29kZXItPm1ldHJpY3MtPmhvcmlBZHZhbmNlICA9IGhvcmlBZHZhbmNlOwotICAgIGRlY29kZXItPm1ldHJpY3MtPnZlcnRCZWFyaW5nWCA9IHZlcnRCZWFyaW5nWDsKLSAgICBkZWNvZGVyLT5tZXRyaWNzLT52ZXJ0QmVhcmluZ1kgPSB2ZXJ0QmVhcmluZ1k7Ci0gICAgZGVjb2Rlci0+bWV0cmljcy0+dmVydEFkdmFuY2UgID0gdmVydEFkdmFuY2U7Ci0gICAgZGVjb2Rlci0+bWV0cmljcy0+d2lkdGggICAgICAgID0gKEZUX0J5dGUpZGVjb2Rlci0+Yml0bWFwLT53aWR0aDsKLSAgICBkZWNvZGVyLT5tZXRyaWNzLT5oZWlnaHQgICAgICAgPSAoRlRfQnl0ZSlkZWNvZGVyLT5iaXRtYXAtPnJvd3M7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgRmFpbDoKLSAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgZ290byBFeGl0OwotICB9Ci0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX1BORwotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9zYml0X2RlY29kZXJfbG9hZF9wbmcoIFRUX1NCaXREZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0J5dGUqICAgICAgICBsaW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgeF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHlfcG9zICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBGVF9VTG9uZyAgcG5nX2xlbjsKLQotCi0gICAgaWYgKCBsaW1pdCAtIHAgPCA0ICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTEoKCAidHRfc2JpdF9kZWNvZGVyX2xvYWRfcG5nOiBicm9rZW4gYml0bWFwXG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIHBuZ19sZW4gPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgaWYgKCAoRlRfVUxvbmcpKCBsaW1pdCAtIHAgKSA8IHBuZ19sZW4gKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMSgoICJ0dF9zYml0X2RlY29kZXJfbG9hZF9wbmc6IGJyb2tlbiBiaXRtYXBcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgZXJyb3IgPSBMb2FkX1NCaXRfUG5nKCBkZWNvZGVyLT5mYWNlLT5yb290LmdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB5X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXItPmJpdF9kZXB0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXItPm1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLT5zdHJlYW0tPm1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgKTsKLQotICBFeGl0OgotICAgIGlmICggIWVycm9yICkKLSAgICAgIEZUX1RSQUNFMygoICJ0dF9zYml0X2RlY29kZXJfbG9hZF9wbmc6IGxvYWRlZFxuIiApKTsKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fVVNFX1BORyAqLwotCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2JpdG1hcCggVFRfU0JpdERlY29kZXIgIGRlY29kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIGdseXBoX2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgZ2x5cGhfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgIGdseXBoX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHhfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICB5X3BvcyApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gZGVjb2Rlci0+c3RyZWFtOwotICAgIEZUX0J5dGUqICAgcDsKLSAgICBGVF9CeXRlKiAgIHBfbGltaXQ7Ci0gICAgRlRfQnl0ZSogICBkYXRhOwotCi0KLSAgICAvKiBzZWVrIGludG8gdGhlIEVCRFQgdGFibGUgbm93ICovCi0gICAgaWYgKCBnbHlwaF9zdGFydCArIGdseXBoX3NpemUgPiBkZWNvZGVyLT5lYmR0X3NpemUgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBkZWNvZGVyLT5lYmR0X3N0YXJ0ICsgZ2x5cGhfc3RhcnQgKSB8fAotICAgICAgICAgRlRfRlJBTUVfRVhUUkFDVCggZ2x5cGhfc2l6ZSwgZGF0YSApICAgICAgICAgICAgICAgICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHAgICAgICAgPSBkYXRhOwotICAgIHBfbGltaXQgPSBwICsgZ2x5cGhfc2l6ZTsKLQotICAgIC8qIHJlYWQgdGhlIGRhdGEsIGRlcGVuZGluZyBvbiB0aGUgZ2x5cGggZm9ybWF0ICovCi0gICAgc3dpdGNoICggZ2x5cGhfZm9ybWF0ICkKLSAgICB7Ci0gICAgY2FzZSAxOgotICAgIGNhc2UgMjoKLSAgICBjYXNlIDg6Ci0gICAgY2FzZSAxNzoKLSAgICAgIGVycm9yID0gdHRfc2JpdF9kZWNvZGVyX2xvYWRfbWV0cmljcyggZGVjb2RlciwgJnAsIHBfbGltaXQsIDAgKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSA2OgotICAgIGNhc2UgNzoKLSAgICBjYXNlIDk6Ci0gICAgY2FzZSAxODoKLSAgICAgIGVycm9yID0gdHRfc2JpdF9kZWNvZGVyX2xvYWRfbWV0cmljcyggZGVjb2RlciwgJnAsIHBfbGltaXQsIDEgKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIH0KLQotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgewotICAgICAgVFRfU0JpdERlY29kZXJfTG9hZEZ1bmMgIGxvYWRlcjsKLQotCi0gICAgICBzd2l0Y2ggKCBnbHlwaF9mb3JtYXQgKQotICAgICAgewotICAgICAgY2FzZSAxOgotICAgICAgY2FzZSA2OgotICAgICAgICBsb2FkZXIgPSB0dF9zYml0X2RlY29kZXJfbG9hZF9ieXRlX2FsaWduZWQ7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDI6Ci0gICAgICBjYXNlIDc6Ci0gICAgICAgIHsKLSAgICAgICAgICAvKiBEb24ndCB0cnVzdCBgZ2x5cGhfZm9ybWF0Jy4gIEZvciBleGFtcGxlLCBBcHBsZSdzIG1haW4gS29yZWFuICovCi0gICAgICAgICAgLyogc3lzdGVtIGZvbnQsIGBBcHBsZU15dW5nSm8udHRmJyAodmVyc2lvbiA3LjBkMmU2KSwgdXNlcyBnbHlwaCAqLwotICAgICAgICAgIC8qIGZvcm1hdCA3LCBidXQgdGhlIGRhdGEgaXMgZm9ybWF0IDYuICBXZSBjaGVjayB3aGV0aGVyIHdlIGhhdmUgKi8KLSAgICAgICAgICAvKiBhbiBleGNlc3NpdmUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBpbWFnZTogSWYgaXQgaXMgZXF1YWwgdG8gICovCi0gICAgICAgICAgLyogdGhlIHZhbHVlIGZvciBhIGJ5dGUtYWxpZ25lZCBnbHlwaCwgdXNlIHRoZSBvdGhlciBsb2FkaW5nICAgICAqLwotICAgICAgICAgIC8qIHJvdXRpbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogTm90ZSB0aGF0IGZvciBzb21lICh3aWR0aCxoZWlnaHQpIGNvbWJpbmF0aW9ucywgd2hlcmUgdGhlICAgICAqLwotICAgICAgICAgIC8qIHdpZHRoIGlzIG5vdCBhIG11bHRpcGxlIG9mIDgsIHRoZSBzaXplcyBmb3IgYml0LSBhbmQgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBieXRlLWFsaWduZWQgZGF0YSBhcmUgZXF1YWwsIGZvciBleGFtcGxlICg3LDcpIG9yICgxNSw2KS4gIFdlICovCi0gICAgICAgICAgLyogdGhlbiBwcmVmZXIgd2hhdCBgZ2x5cGhfZm9ybWF0JyBzcGVjaWZpZXMuICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgRlRfVUludCAgd2lkdGggID0gZGVjb2Rlci0+bWV0cmljcy0+d2lkdGg7Ci0gICAgICAgICAgRlRfVUludCAgaGVpZ2h0ID0gZGVjb2Rlci0+bWV0cmljcy0+aGVpZ2h0OwotCi0gICAgICAgICAgRlRfVUludCAgYml0X3NpemUgID0gKCB3aWR0aCAqIGhlaWdodCArIDcgKSA+PiAzOwotICAgICAgICAgIEZUX1VJbnQgIGJ5dGVfc2l6ZSA9IGhlaWdodCAqICggKCB3aWR0aCArIDcgKSA+PiAzICk7Ci0KLQotICAgICAgICAgIGlmICggYml0X3NpemUgPCBieXRlX3NpemUgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgYnl0ZV9zaXplID09IChGVF9VSW50KSggcF9saW1pdCAtIHAgKSApCi0gICAgICAgICAgICBsb2FkZXIgPSB0dF9zYml0X2RlY29kZXJfbG9hZF9ieXRlX2FsaWduZWQ7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgbG9hZGVyID0gdHRfc2JpdF9kZWNvZGVyX2xvYWRfYml0X2FsaWduZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgNToKLSAgICAgICAgbG9hZGVyID0gdHRfc2JpdF9kZWNvZGVyX2xvYWRfYml0X2FsaWduZWQ7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDg6Ci0gICAgICAgIGlmICggcCArIDEgPiBwX2xpbWl0ICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgcCArPSAxOyAgLyogc2tpcCBwYWRkaW5nICovCi0gICAgICAgIC8qIGZhbGwtdGhyb3VnaCAqLwotCi0gICAgICBjYXNlIDk6Ci0gICAgICAgIGxvYWRlciA9IHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2NvbXBvdW5kOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAxNzogLyogc21hbGwgbWV0cmljcywgUE5HIGltYWdlIGRhdGEgICAqLwotICAgICAgY2FzZSAxODogLyogYmlnIG1ldHJpY3MsIFBORyBpbWFnZSBkYXRhICAgICAqLwotICAgICAgY2FzZSAxOTogLyogbWV0cmljcyBpbiBFQkxDLCBQTkcgaW1hZ2UgZGF0YSAqLwotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX1BORwotICAgICAgICBsb2FkZXIgPSB0dF9zYml0X2RlY29kZXJfbG9hZF9wbmc7Ci0gICAgICAgIGJyZWFrOwotI2Vsc2UKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggVW5pbXBsZW1lbnRlZF9GZWF0dXJlICk7Ci0gICAgICAgIGdvdG8gRmFpbDsKLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1VTRV9QTkcgKi8KLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggIWRlY29kZXItPmJpdG1hcF9hbGxvY2F0ZWQgKQotICAgICAgewotICAgICAgICBlcnJvciA9IHR0X3NiaXRfZGVjb2Rlcl9hbGxvY19iaXRtYXAoIGRlY29kZXIgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotCi0gICAgICBlcnJvciA9IGxvYWRlciggZGVjb2RlciwgcCwgcF9saW1pdCwgeF9wb3MsIHlfcG9zICk7Ci0gICAgfQotCi0gIEZhaWw6Ci0gICAgRlRfRlJBTUVfUkVMRUFTRSggZGF0YSApOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfc2JpdF9kZWNvZGVyX2xvYWRfaW1hZ2UoIFRUX1NCaXREZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHhfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHlfcG9zICkKLSAgewotICAgIC8qCi0gICAgICogIEZpcnN0LCB3ZSBmaW5kIHRoZSBjb3JyZWN0IHN0cmlrZSByYW5nZSB0aGF0IGFwcGxpZXMgdG8gdGhpcwotICAgICAqICBnbHlwaCBpbmRleC4KLSAgICAgKi8KLQotICAgIEZUX0J5dGUqICBwICAgICAgICAgID0gZGVjb2Rlci0+ZWJsY19iYXNlICsgZGVjb2Rlci0+c3RyaWtlX2luZGV4X2FycmF5OwotICAgIEZUX0J5dGUqICBwX2xpbWl0ICAgID0gZGVjb2Rlci0+ZWJsY19saW1pdDsKLSAgICBGVF9VTG9uZyAgbnVtX3JhbmdlcyA9IGRlY29kZXItPnN0cmlrZV9pbmRleF9jb3VudDsKLSAgICBGVF9VSW50ICAgc3RhcnQsIGVuZCwgaW5kZXhfZm9ybWF0LCBpbWFnZV9mb3JtYXQ7Ci0gICAgRlRfVUxvbmcgIGltYWdlX3N0YXJ0ID0gMCwgaW1hZ2VfZW5kID0gMCwgaW1hZ2Vfb2Zmc2V0OwotCi0KLSAgICBmb3IgKCA7IG51bV9yYW5nZXMgPiAwOyBudW1fcmFuZ2VzLS0gKQotICAgIHsKLSAgICAgIHN0YXJ0ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIGVuZCAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgICAgaWYgKCBnbHlwaF9pbmRleCA+PSBzdGFydCAmJiBnbHlwaF9pbmRleCA8PSBlbmQgKQotICAgICAgICBnb3RvIEZvdW5kUmFuZ2U7Ci0KLSAgICAgIHAgKz0gNDsgIC8qIGlnbm9yZSBpbmRleCBvZmZzZXQgKi8KLSAgICB9Ci0gICAgZ290byBOb0JpdG1hcDsKLQotICBGb3VuZFJhbmdlOgotICAgIGltYWdlX29mZnNldCA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgIC8qIG92ZXJmbG93IGNoZWNrICovCi0gICAgcCA9IGRlY29kZXItPmVibGNfYmFzZSArIGRlY29kZXItPnN0cmlrZV9pbmRleF9hcnJheTsKLSAgICBpZiAoIGltYWdlX29mZnNldCA+IChGVF9VTG9uZykoIHBfbGltaXQgLSBwICkgKQotICAgICAgZ290byBGYWlsdXJlOwotCi0gICAgcCArPSBpbWFnZV9vZmZzZXQ7Ci0gICAgaWYgKCBwICsgOCA+IHBfbGltaXQgKQotICAgICAgZ290byBOb0JpdG1hcDsKLQotICAgIC8qIG5vdyBmaW5kIHRoZSBnbHlwaCdzIGxvY2F0aW9uIGFuZCBleHRlbmQgd2l0aGluIHRoZSBlYmR0IHRhYmxlICovCi0gICAgaW5kZXhfZm9ybWF0ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICBpbWFnZV9mb3JtYXQgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIGltYWdlX29mZnNldCA9IEZUX05FWFRfVUxPTkcgKCBwICk7Ci0KLSAgICBzd2l0Y2ggKCBpbmRleF9mb3JtYXQgKQotICAgIHsKLSAgICBjYXNlIDE6IC8qIDQtYnl0ZSBvZmZzZXRzIHJlbGF0aXZlIHRvIGBpbWFnZV9vZmZzZXQnICovCi0gICAgICBwICs9IDQgKiAoIGdseXBoX2luZGV4IC0gc3RhcnQgKTsKLSAgICAgIGlmICggcCArIDggPiBwX2xpbWl0ICkKLSAgICAgICAgZ290byBOb0JpdG1hcDsKLQotICAgICAgaW1hZ2Vfc3RhcnQgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICBpbWFnZV9lbmQgICA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgICAgaWYgKCBpbWFnZV9zdGFydCA9PSBpbWFnZV9lbmQgKSAgLyogbWlzc2luZyBnbHlwaCAqLwotICAgICAgICBnb3RvIE5vQml0bWFwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDI6IC8qIGJpZyBtZXRyaWNzLCBjb25zdGFudCBpbWFnZSBzaXplICovCi0gICAgICB7Ci0gICAgICAgIEZUX1VMb25nICBpbWFnZV9zaXplOwotCi0KLSAgICAgICAgaWYgKCBwICsgMTIgPiBwX2xpbWl0ICkKLSAgICAgICAgICBnb3RvIE5vQml0bWFwOwotCi0gICAgICAgIGltYWdlX3NpemUgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAgICAgaWYgKCB0dF9zYml0X2RlY29kZXJfbG9hZF9tZXRyaWNzKCBkZWNvZGVyLCAmcCwgcF9saW1pdCwgMSApICkKLSAgICAgICAgICBnb3RvIE5vQml0bWFwOwotCi0gICAgICAgIGltYWdlX3N0YXJ0ID0gaW1hZ2Vfc2l6ZSAqICggZ2x5cGhfaW5kZXggLSBzdGFydCApOwotICAgICAgICBpbWFnZV9lbmQgICA9IGltYWdlX3N0YXJ0ICsgaW1hZ2Vfc2l6ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzOiAvKiAyLWJ5dGUgb2Zmc2V0cyByZWxhdGl2ZSB0byAnaW1hZ2Vfb2Zmc2V0JyAqLwotICAgICAgcCArPSAyICogKCBnbHlwaF9pbmRleCAtIHN0YXJ0ICk7Ci0gICAgICBpZiAoIHAgKyA0ID4gcF9saW1pdCApCi0gICAgICAgIGdvdG8gTm9CaXRtYXA7Ci0KLSAgICAgIGltYWdlX3N0YXJ0ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIGltYWdlX2VuZCAgID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgICAgaWYgKCBpbWFnZV9zdGFydCA9PSBpbWFnZV9lbmQgKSAgLyogbWlzc2luZyBnbHlwaCAqLwotICAgICAgICBnb3RvIE5vQml0bWFwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDQ6IC8qIHNwYXJzZSBnbHlwaCBhcnJheSB3aXRoIChnbHlwaCxvZmZzZXQpIHBhaXJzICovCi0gICAgICB7Ci0gICAgICAgIEZUX1VMb25nICBtbSwgbnVtX2dseXBoczsKLQotCi0gICAgICAgIGlmICggcCArIDQgPiBwX2xpbWl0ICkKLSAgICAgICAgICBnb3RvIE5vQml0bWFwOwotCi0gICAgICAgIG51bV9nbHlwaHMgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0KLSAgICAgICAgLyogb3ZlcmZsb3cgY2hlY2sgZm9yIHAgKyAoIG51bV9nbHlwaHMgKyAxICkgKiA0ICovCi0gICAgICAgIGlmICggcCArIDQgPiBwX2xpbWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgIG51bV9nbHlwaHMgPiAoRlRfVUxvbmcpKCAoICggcF9saW1pdCAtIHAgKSA+PiAyICkgLSAxICkgKQotICAgICAgICAgIGdvdG8gTm9CaXRtYXA7Ci0KLSAgICAgICAgZm9yICggbW0gPSAwOyBtbSA8IG51bV9nbHlwaHM7IG1tKysgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVUludCAgZ2luZGV4ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotCi0gICAgICAgICAgaWYgKCBnaW5kZXggPT0gZ2x5cGhfaW5kZXggKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGltYWdlX3N0YXJ0ID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgICAgIHAgICAgICAgICAgKz0gMjsKLSAgICAgICAgICAgIGltYWdlX2VuZCAgID0gRlRfUEVFS19VU0hPUlQoIHAgKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBwICs9IDI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIG1tID49IG51bV9nbHlwaHMgKQotICAgICAgICAgIGdvdG8gTm9CaXRtYXA7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgNTogLyogY29uc3RhbnQgbWV0cmljcyB3aXRoIHNwYXJzZSBnbHlwaCBjb2RlcyAqLwotICAgIGNhc2UgMTk6Ci0gICAgICB7Ci0gICAgICAgIEZUX1VMb25nICBpbWFnZV9zaXplLCBtbSwgbnVtX2dseXBoczsKLQotCi0gICAgICAgIGlmICggcCArIDE2ID4gcF9saW1pdCApCi0gICAgICAgICAgZ290byBOb0JpdG1hcDsKLQotICAgICAgICBpbWFnZV9zaXplID0gRlRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgICAgIGlmICggdHRfc2JpdF9kZWNvZGVyX2xvYWRfbWV0cmljcyggZGVjb2RlciwgJnAsIHBfbGltaXQsIDEgKSApCi0gICAgICAgICAgZ290byBOb0JpdG1hcDsKLQotICAgICAgICBudW1fZ2x5cGhzID0gRlRfTkVYVF9VTE9ORyggcCApOwotCi0gICAgICAgIC8qIG92ZXJmbG93IGNoZWNrIGZvciBwICsgMiAqIG51bV9nbHlwaHMgKi8KLSAgICAgICAgaWYgKCBudW1fZ2x5cGhzID4gKEZUX1VMb25nKSggKCBwX2xpbWl0IC0gcCApID4+IDEgKSApCi0gICAgICAgICAgZ290byBOb0JpdG1hcDsKLQotICAgICAgICBmb3IgKCBtbSA9IDA7IG1tIDwgbnVtX2dseXBoczsgbW0rKyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VSW50ICBnaW5kZXggPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0KLSAgICAgICAgICBpZiAoIGdpbmRleCA9PSBnbHlwaF9pbmRleCApCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggbW0gPj0gbnVtX2dseXBocyApCi0gICAgICAgICAgZ290byBOb0JpdG1hcDsKLQotICAgICAgICBpbWFnZV9zdGFydCA9IGltYWdlX3NpemUgKiBtbTsKLSAgICAgICAgaW1hZ2VfZW5kICAgPSBpbWFnZV9zdGFydCArIGltYWdlX3NpemU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBnb3RvIE5vQml0bWFwOwotICAgIH0KLQotICAgIGlmICggaW1hZ2Vfc3RhcnQgPiBpbWFnZV9lbmQgKQotICAgICAgZ290byBOb0JpdG1hcDsKLQotICAgIGltYWdlX2VuZCAgLT0gaW1hZ2Vfc3RhcnQ7Ci0gICAgaW1hZ2Vfc3RhcnQgPSBpbWFnZV9vZmZzZXQgKyBpbWFnZV9zdGFydDsKLQotICAgIEZUX1RSQUNFMygoICJ0dF9zYml0X2RlY29kZXJfbG9hZF9pbWFnZToiCi0gICAgICAgICAgICAgICAgIiBmb3VuZCBzYml0IChmb3JtYXQgJWQpIGZvciBnbHlwaCBpbmRleCAlZFxuIiwKLSAgICAgICAgICAgICAgICBpbWFnZV9mb3JtYXQsIGdseXBoX2luZGV4ICkpOwotCi0gICAgcmV0dXJuIHR0X3NiaXRfZGVjb2Rlcl9sb2FkX2JpdG1hcCggZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Vfc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfcG9zICk7Ci0KLSAgRmFpbHVyZToKLSAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLQotICBOb0JpdG1hcDoKLSAgICBGVF9UUkFDRTQoKCAidHRfc2JpdF9kZWNvZGVyX2xvYWRfaW1hZ2U6IgotICAgICAgICAgICAgICAgICIgbm8gc2JpdCBmb3VuZCBmb3IgZ2x5cGggaW5kZXggJWRcbiIsIGdseXBoX2luZGV4ICkpOwotCi0gICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9mYWNlX2xvYWRfc2JpeF9pbWFnZSggVFRfRmFjZSAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAgICAgIHN0cmlrZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwICAgICAgICAgICAqbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9NZXRyaWNzUmVjICAqbWV0cmljcyApCi0gIHsKLSAgICBGVF9VSW50ICAgc2JpeF9wb3MsIHN0cmlrZV9vZmZzZXQsIGdseXBoX3N0YXJ0LCBnbHlwaF9lbmQ7Ci0gICAgRlRfVUxvbmcgIHRhYmxlX3NpemU7Ci0gICAgRlRfSW50ICAgIG9yaWdpbk9mZnNldFgsIG9yaWdpbk9mZnNldFk7Ci0gICAgRlRfVGFnICAgIGdyYXBoaWNUeXBlOwotICAgIEZUX0ludCAgICByZWN1cnNlX2RlcHRoID0gMDsKLQotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBGVF9CeXRlKiAgcDsKLQotICAgIEZUX1VOVVNFRCggbWFwICk7Ci0KLQotICAgIG1ldHJpY3MtPndpZHRoICA9IDA7Ci0gICAgbWV0cmljcy0+aGVpZ2h0ID0gMDsKLQotICAgIHAgPSBmYWNlLT5zYml0X3RhYmxlICsgOCArIDQgKiBzdHJpa2VfaW5kZXg7Ci0gICAgc3RyaWtlX29mZnNldCA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19zYml4LCBzdHJlYW0sICZ0YWJsZV9zaXplICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgc2JpeF9wb3MgPSBGVF9TVFJFQU1fUE9TKCk7Ci0KLSAgcmV0cnk6Ci0gICAgaWYgKCBnbHlwaF9pbmRleCA+IChGVF9VSW50KWZhY2UtPnJvb3QubnVtX2dseXBocyApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGlmICggc3RyaWtlX29mZnNldCA+PSB0YWJsZV9zaXplICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgdGFibGVfc2l6ZSAtIHN0cmlrZV9vZmZzZXQgPCA0ICsgZ2x5cGhfaW5kZXggKiA0ICsgOCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLQotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIHNiaXhfcG9zICsgc3RyaWtlX29mZnNldCArIDQgKyBnbHlwaF9pbmRleCAqIDQgKSB8fAotICAgICAgICAgRlRfRlJBTUVfRU5URVIoIDggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBnbHlwaF9zdGFydCA9IEZUX0dFVF9VTE9ORygpOwotICAgIGdseXBoX2VuZCAgID0gRlRfR0VUX1VMT05HKCk7Ci0KLSAgICBGVF9GUkFNRV9FWElUKCk7Ci0KLSAgICBpZiAoIGdseXBoX3N0YXJ0ID09IGdseXBoX2VuZCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICBpZiAoIGdseXBoX3N0YXJ0ID4gZ2x5cGhfZW5kICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICBnbHlwaF9lbmQgLSBnbHlwaF9zdGFydCA8IDggICAgICAgICAgICB8fAotICAgICAgICAgdGFibGVfc2l6ZSAtIHN0cmlrZV9vZmZzZXQgPCBnbHlwaF9lbmQgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0KLSAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBzYml4X3BvcyArIHN0cmlrZV9vZmZzZXQgKyBnbHlwaF9zdGFydCApIHx8Ci0gICAgICAgICBGVF9GUkFNRV9FTlRFUiggZ2x5cGhfZW5kIC0gZ2x5cGhfc3RhcnQgKSAgICAgICAgICAgICAgICApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBvcmlnaW5PZmZzZXRYID0gRlRfR0VUX1NIT1JUKCk7Ci0gICAgb3JpZ2luT2Zmc2V0WSA9IEZUX0dFVF9TSE9SVCgpOwotCi0gICAgZ3JhcGhpY1R5cGUgPSBGVF9HRVRfVEFHNCgpOwotCi0gICAgc3dpdGNoICggZ3JhcGhpY1R5cGUgKQotICAgIHsKLSAgICBjYXNlIEZUX01BS0VfVEFHKCAnZCcsICd1JywgJ3AnLCAnZScgKToKLSAgICAgIGlmICggcmVjdXJzZV9kZXB0aCA8IDQgKQotICAgICAgewotICAgICAgICBnbHlwaF9pbmRleCA9IEZUX0dFVF9VU0hPUlQoKTsKLSAgICAgICAgRlRfRlJBTUVfRVhJVCgpOwotICAgICAgICByZWN1cnNlX2RlcHRoKys7Ci0gICAgICAgIGdvdG8gcmV0cnk7Ci0gICAgICB9Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRlRfTUFLRV9UQUcoICdwJywgJ24nLCAnZycsICcgJyApOgotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fVVNFX1BORwotICAgICAgZXJyb3IgPSBMb2FkX1NCaXRfUG5nKCBmYWNlLT5yb290LmdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5tZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Y3Vyc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9lbmQgLSBnbHlwaF9zdGFydCAtIDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgKTsKLSNlbHNlCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZUX01BS0VfVEFHKCAnaicsICdwJywgJ2cnLCAnICcgKToKLSAgICBjYXNlIEZUX01BS0VfVEFHKCAndCcsICdpJywgJ2YnLCAnZicgKToKLSAgICBjYXNlIEZUX01BS0VfVEFHKCAncicsICdnJywgJ2InLCAnbCcgKTogLyogdXNlZCBvbiBpT1MgNy4xICovCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmltcGxlbWVudGVkX0ZlYXR1cmUgKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBGVF9TaG9ydCAgIGFiZWFyaW5nOwotICAgICAgRlRfVVNob3J0ICBhYWR2YW5jZTsKLQotCi0gICAgICB0dF9mYWNlX2dldF9tZXRyaWNzKCBmYWNlLCBGQUxTRSwgZ2x5cGhfaW5kZXgsICZhYmVhcmluZywgJmFhZHZhbmNlICk7Ci0KLSAgICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWCA9IChGVF9TaG9ydClvcmlnaW5PZmZzZXRYOwotICAgICAgbWV0cmljcy0+aG9yaUJlYXJpbmdZID0gKEZUX1Nob3J0KSggLW9yaWdpbk9mZnNldFkgKyBtZXRyaWNzLT5oZWlnaHQgKTsKLSAgICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlICA9IChGVF9VU2hvcnQpKCBhYWR2YW5jZSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+cm9vdC5zaXplLT5tZXRyaWNzLnhfcHBlbSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+aGVhZGVyLlVuaXRzX1Blcl9FTSApOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9zYml0X2ltYWdlKCBUVF9GYWNlICAgICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICAgICAgc3RyaWtlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICBsb2FkX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQml0bWFwICAgICAgICAgICAqbWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfU0JpdF9NZXRyaWNzUmVjICAqbWV0cmljcyApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLQotICAgIHN3aXRjaCAoIChGVF9VSW50KWZhY2UtPnNiaXRfdGFibGVfdHlwZSApCi0gICAgewotICAgIGNhc2UgVFRfU0JJVF9UQUJMRV9UWVBFX0VCTEM6Ci0gICAgY2FzZSBUVF9TQklUX1RBQkxFX1RZUEVfQ0JMQzoKLSAgICAgIHsKLSAgICAgICAgVFRfU0JpdERlY29kZXJSZWMgIGRlY29kZXJbMV07Ci0KLQotICAgICAgICBlcnJvciA9IHR0X3NiaXRfZGVjb2Rlcl9pbml0KCBkZWNvZGVyLCBmYWNlLCBzdHJpa2VfaW5kZXgsIG1ldHJpY3MgKTsKLSAgICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSB0dF9zYml0X2RlY29kZXJfbG9hZF9pbWFnZSggZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKTsKLSAgICAgICAgICB0dF9zYml0X2RlY29kZXJfZG9uZSggZGVjb2RlciApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVFRfU0JJVF9UQUJMRV9UWVBFX1NCSVg6Ci0gICAgICBlcnJvciA9IHR0X2ZhY2VfbG9hZF9zYml4X2ltYWdlKCBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWtlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzICk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvKiBGbGF0dGVuIGNvbG9yIGJpdG1hcHMgaWYgY29sb3Igd2FzIG5vdCByZXF1ZXN0ZWQuICovCi0gICAgaWYgKCAhZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAhKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9DT0xPUiApICAgICAgICYmCi0gICAgICAgICBtYXAtPnBpeGVsX21vZGUgPT0gRlRfUElYRUxfTU9ERV9CR1JBICkKLSAgICB7Ci0gICAgICBGVF9CaXRtYXAgICBuZXdfbWFwOwotICAgICAgRlRfTGlicmFyeSAgbGlicmFyeSA9IGZhY2UtPnJvb3QuZ2x5cGgtPmxpYnJhcnk7Ci0KLQotICAgICAgRlRfQml0bWFwX0luaXQoICZuZXdfbWFwICk7Ci0KLSAgICAgIC8qIENvbnZlcnQgdG8gOGJpdCBncmF5c2NhbGUuICovCi0gICAgICBlcnJvciA9IEZUX0JpdG1hcF9Db252ZXJ0KCBsaWJyYXJ5LCBtYXAsICZuZXdfbWFwLCAxICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgRlRfQml0bWFwX0RvbmUoIGxpYnJhcnksICZuZXdfbWFwICk7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG1hcC0+cGl4ZWxfbW9kZSA9IG5ld19tYXAucGl4ZWxfbW9kZTsKLSAgICAgICAgbWFwLT5waXRjaCAgICAgID0gbmV3X21hcC5waXRjaDsKLSAgICAgICAgbWFwLT5udW1fZ3JheXMgID0gbmV3X21hcC5udW1fZ3JheXM7Ci0KLSAgICAgICAgZnRfZ2x5cGhzbG90X3NldF9iaXRtYXAoIGZhY2UtPnJvb3QuZ2x5cGgsIG5ld19tYXAuYnVmZmVyICk7Ci0gICAgICAgIGZhY2UtPnJvb3QuZ2x5cGgtPmludGVybmFsLT5mbGFncyB8PSBGVF9HTFlQSF9PV05fQklUTUFQOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLS8qIEVPRiAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3NmbnQvdHRzYml0LmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dHNiaXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlMTNhZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc2ZudC90dHNiaXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0c2JpdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBhbmQgT3BlblR5cGUgZW1iZWRkZWQgYml0bWFwIHN1cHBvcnQgKHNwZWNpZmljYXRpb24pLiAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1RUU0JJVF9IX18KLSNkZWZpbmUgX19UVFNCSVRfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAidHRsb2FkLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfc2JpdCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHR0X2ZhY2VfZnJlZV9zYml0KCBUVF9GYWNlICBmYWNlICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX3NldF9zYml0X3N0cmlrZSggVFRfRmFjZSAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyogICAgICAgIGFzdHJpa2VfaW5kZXggKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfc3RyaWtlX21ldHJpY3MoIFRUX0ZhY2UgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgICAgc3RyaWtlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NpemVfTWV0cmljcyogIG1ldHJpY3MgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfc2JpdF9pbWFnZSggVFRfRmFjZSAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICAgICAgIHN0cmlrZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgICAgbG9hZF9mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JpdG1hcCAgICAgICAgICAgKm1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUX1NCaXRfTWV0cmljc1JlYyAgKm1ldHJpY3MgKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1RUU0JJVF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvSmFtZmlsZSBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvSmFtZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE4ODdjMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc21vb3RoL0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jIEZyZWVUeXBlIDIgc3JjL3Ntb290aCBKYW1maWxlCi0jCi0jIENvcHlyaWdodCAyMDAxLTIwMTUgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi1TdWJEaXIgIEZUMl9UT1AgJChGVDJfU1JDX0RJUikgc21vb3RoIDsKLQotewotICBsb2NhbCAgX3NvdXJjZXMgOwotCi0gIGlmICQoRlQyX01VTFRJKQotICB7Ci0gICAgX3NvdXJjZXMgPSBmdGdyYXlzCi0gICAgICAgICAgICAgICBmdHNtb290aAotICAgICAgICAgICAgICAgZnRzcGljCi0gICAgICAgICAgICAgICA7Ci0gIH0KLSAgZWxzZQotICB7Ci0gICAgX3NvdXJjZXMgPSBzbW9vdGggOwotICB9Ci0KLSAgTGlicmFyeSAgJChGVDJfTElCKSA6ICQoX3NvdXJjZXMpLmMgOwotfQotCi0jIGVuZCBvZiBzcmMvc21vb3RoIEphbWZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvZnRncmF5cy5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9mdGdyYXlzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMjk0NDUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9mdGdyYXlzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0Z3JheXMuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBIG5ldyBgcGVyZmVjdCcgYW50aS1hbGlhc2luZyByZW5kZXJlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIGZpbGUgY2FuIGJlIGNvbXBpbGVkIHdpdGhvdXQgdGhlIHJlc3Qgb2YgdGhlIEZyZWVUeXBlIGVuZ2luZSwgYnkgKi8KLSAgLyogZGVmaW5pbmcgdGhlIF9TVEFOREFMT05FXyBtYWNybyB3aGVuIGNvbXBpbGluZyBpdC4gIFlvdSBhbHNvIG5lZWQgdG8gICovCi0gIC8qIHB1dCB0aGUgZmlsZXMgYGZ0Z3JheXMuaCcgYW5kIGBmdGltYWdlLmgnIGludG8gdGhlIGN1cnJlbnQgICAgICAgICAgICAqLwotICAvKiBjb21waWxhdGlvbiBkaXJlY3RvcnkuICBUeXBpY2FsbHksIHlvdSBjb3VsZCBkbyBzb21ldGhpbmcgbGlrZSAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gY29weSBgc3JjL3Ntb290aC9mdGdyYXlzLmMnICh0aGlzIGZpbGUpIHRvIHlvdXIgY3VycmVudCBkaXJlY3RvcnkgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBjb3B5IGBpbmNsdWRlL2ZyZWV0eXBlL2Z0aW1hZ2UuaCcgYW5kIGBzcmMvc21vb3RoL2Z0Z3JheXMuaCcgdG8gdGhlICovCi0gIC8qICAgc2FtZSBkaXJlY3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBjb21waWxlIGBmdGdyYXlzJyB3aXRoIHRoZSBfU1RBTkRBTE9ORV8gbWFjcm8gZGVmaW5lZCwgYXMgaW4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgY2MgLWMgLURfU1RBTkRBTE9ORV8gZnRncmF5cy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSByZW5kZXJlciBjYW4gYmUgaW5pdGlhbGl6ZWQgd2l0aCBhIGNhbGwgdG8gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBgZnRfZ3JheV9yYXN0ZXIucmFzdGVyX25ldyc7IGFuIGFudGktYWxpYXNlZCBiaXRtYXAgY2FuIGJlIGdlbmVyYXRlZCAgKi8KLSAgLyogd2l0aCBhIGNhbGwgdG8gYGZ0X2dyYXlfcmFzdGVyLnJhc3Rlcl9yZW5kZXInLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTZWUgdGhlIGNvbW1lbnRzIGFuZCBkb2N1bWVudGF0aW9uIGluIHRoZSBmaWxlIGBmdGltYWdlLmgnIGZvciBtb3JlICAgKi8KLSAgLyogZGV0YWlscyBvbiBob3cgdGhlIHJhc3RlciB3b3Jrcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgaXMgYSBuZXcgYW50aS1hbGlhc2luZyBzY2FuLWNvbnZlcnRlciBmb3IgRnJlZVR5cGUgMi4gIFRoZSAgICAgICAqLwotICAvKiBhbGdvcml0aG0gdXNlZCBoZXJlIGlzIF92ZXJ5XyBkaWZmZXJlbnQgZnJvbSB0aGUgb25lIGluIHRoZSBzdGFuZGFyZCAgKi8KLSAgLyogYGZ0cmFzdGVyJyBtb2R1bGUuICBBY3R1YWxseSwgYGZ0Z3JheXMnIGNvbXB1dGVzIHRoZSBfZXhhY3RfICAgICAgICAgICovCi0gIC8qIGNvdmVyYWdlIG9mIHRoZSBvdXRsaW5lIG9uIGVhY2ggcGl4ZWwgY2VsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSXQgaXMgYmFzZWQgb24gaWRlYXMgdGhhdCBJIGluaXRpYWxseSBmb3VuZCBpbiBSYXBoIExldmllbidzICAgICAgICAgICovCi0gIC8qIGV4Y2VsbGVudCBMaWJBcnQgZ3JhcGhpY3MgbGlicmFyeSAoc2VlIGh0dHA6Ly93d3cubGV2aWVuLmNvbS9saWJhcnQgICAqLwotICAvKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiwgdGhvdWdoIHRoZSB3ZWIgcGFnZXMgZG8gbm90IHRlbGwgYW55dGhpbmcgICAgICAgKi8KLSAgLyogYWJvdXQgdGhlIHJlbmRlcmVyOyB5b3UnbGwgaGF2ZSB0byBkaXZlIGludG8gdGhlIHNvdXJjZSBjb2RlIHRvICAgICAgICovCi0gIC8qIHVuZGVyc3RhbmQgaG93IGl0IHdvcmtzKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTm90ZSwgaG93ZXZlciwgdGhhdCB0aGlzIGlzIGEgX3ZlcnlfIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbiAgICAgICAgICovCi0gIC8qIGNvbXBhcmVkIHRvIFJhcGgncy4gIENvdmVyYWdlIGluZm9ybWF0aW9uIGlzIHN0b3JlZCBpbiBhIHZlcnkgICAgICAgICAqLwotICAvKiBkaWZmZXJlbnQgd2F5LCBhbmQgSSBkb24ndCB1c2Ugc29ydGVkIHZlY3RvciBwYXRocy4gIEFsc28sIGl0IGRvZXNuJ3QgKi8KLSAgLyogdXNlIGZsb2F0aW5nIHBvaW50IHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGlzIHJlbmRlcmVyIGhhcyB0aGUgZm9sbG93aW5nIGFkdmFudGFnZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gSXQgZG9lc24ndCBuZWVkIGFuIGludGVybWVkaWF0ZSBiaXRtYXAuICBJbnN0ZWFkLCBvbmUgY2FuIHN1cHBseSBhICAqLwotICAvKiAgIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgYnkgdGhlIHJlbmRlcmVyIHRvIGRyYXcgZ3JheSAgKi8KLSAgLyogICBzcGFucyBvbiBhbnkgdGFyZ2V0IHN1cmZhY2UuICBZb3UgY2FuIHRodXMgZG8gZGlyZWN0IGNvbXBvc2l0aW9uIG9uICovCi0gIC8qICAgYW55IGtpbmQgb2YgYml0bWFwLCBwcm92aWRlZCB0aGF0IHlvdSBnaXZlIHRoZSByZW5kZXJlciB0aGUgcmlnaHQgICAqLwotICAvKiAgIGNhbGxiYWNrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gQSBwZXJmZWN0IGFudGktYWxpYXNlciwgaS5lLiwgaXQgY29tcHV0ZXMgdGhlIF9leGFjdF8gY292ZXJhZ2Ugb24gICAqLwotICAvKiAgIGVhY2ggcGl4ZWwgY2VsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gSXQgcGVyZm9ybXMgYSBzaW5nbGUgcGFzcyBvbiB0aGUgb3V0bGluZSAodGhlIGBzdGFuZGFyZCcgRlQyICAgICAgICAqLwotICAvKiAgIHJlbmRlcmVyIG1ha2VzIHR3byBwYXNzZXMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gSXQgY2FuIGVhc2lseSBiZSBtb2RpZmllZCB0byByZW5kZXIgdG8gX2FueV8gbnVtYmVyIG9mIGdyYXkgbGV2ZWxzICAqLwotICAvKiAgIGNoZWFwbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gRm9yIHNtYWxsICg8IDIwKSBwaXhlbCBzaXplcywgaXQgaXMgZmFzdGVyIHRoYW4gdGhlIHN0YW5kYXJkICAgICAgICAqLwotICAvKiAgIHJlbmRlcmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2Vfc21vb3RoCi0KLQotI2lmZGVmIF9TVEFOREFMT05FXwotCi0KLSAgLyogVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHJlbmRlciBwb29sIHVzZWQgYnkgdGhlIHNjYW4tbGluZSBjb252ZXJ0ZXIgICovCi0gIC8qIHRvIGRvIGFsbCBvZiBpdHMgd29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9SRU5ERVJfUE9PTF9TSVpFICAxNjM4NEwKLQotCi0gIC8qIEF1eGlsaWFyeSBtYWNyb3MgZm9yIHRva2VuIGNvbmNhdGVuYXRpb24uICovCi0jZGVmaW5lIEZUX0VSUl9YQ0FUKCB4LCB5ICkgIHggIyMgeQotI2RlZmluZSBGVF9FUlJfQ0FUKCB4LCB5ICkgICBGVF9FUlJfWENBVCggeCwgeSApCi0KLSNkZWZpbmUgRlRfQkVHSU5fU1RNTlQgIGRvIHsKLSNkZWZpbmUgRlRfRU5EX1NUTU5UICAgIH0gd2hpbGUgKCAwICkKLQotI2RlZmluZSBGVF9NQVgoIGEsIGIgKSAgKCAoYSkgPiAoYikgPyAoYSkgOiAoYikgKQotI2RlZmluZSBGVF9BQlMoIGEgKSAgICAgKCAoYSkgPCAwID8gLShhKSA6IChhKSApCi0KLQotICAvKgotICAgKiAgQXBwcm94aW1hdGUgc3FydCh4KngreSp5KSB1c2luZyB0aGUgYGFscGhhIG1heCBwbHVzIGJldGEgbWluJwotICAgKiAgYWxnb3JpdGhtLiAgV2UgdXNlIGFscGhhID0gMSwgYmV0YSA9IDMvOCwgZ2l2aW5nIHVzIHJlc3VsdHMgd2l0aCBhCi0gICAqICBsYXJnZXN0IGVycm9yIGxlc3MgdGhhbiA3JSBjb21wYXJlZCB0byB0aGUgZXhhY3QgdmFsdWUuCi0gICAqLwotI2RlZmluZSBGVF9IWVBPVCggeCwgeSApICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCB4ID0gRlRfQUJTKCB4ICksICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHkgPSBGVF9BQlMoIHkgKSwgICAgICAgICAgICAgXAotICAgICAgICAgICAgeCA+IHkgPyB4ICsgKCAzICogeSA+PiAzICkgICBcCi0gICAgICAgICAgICAgICAgICA6IHkgKyAoIDMgKiB4ID4+IDMgKSApCi0KLQotICAvKiBkZWZpbmUgdGhpcyB0byBkdW1wIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiAqLwotLyogI2RlZmluZSBGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHNldGptcC5oPgotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2RlZmluZSBGVF9VSU5UX01BWCAgVUlOVF9NQVgKLSNkZWZpbmUgRlRfSU5UX01BWCAgIElOVF9NQVgKLQotI2RlZmluZSBmdF9tZW1zZXQgICBtZW1zZXQKLQotI2RlZmluZSBmdF9zZXRqbXAgICBzZXRqbXAKLSNkZWZpbmUgZnRfbG9uZ2ptcCAgbG9uZ2ptcAotI2RlZmluZSBmdF9qbXBfYnVmICBqbXBfYnVmCi0KLXR5cGVkZWYgcHRyZGlmZl90ICBGVF9QdHJEaXN0OwotCi0KLSNkZWZpbmUgRXJyUmFzdGVyX0ludmFsaWRfTW9kZSAgICAgIC0yCi0jZGVmaW5lIEVyclJhc3Rlcl9JbnZhbGlkX091dGxpbmUgICAtMQotI2RlZmluZSBFcnJSYXN0ZXJfSW52YWxpZF9Bcmd1bWVudCAgLTMKLSNkZWZpbmUgRXJyUmFzdGVyX01lbW9yeV9PdmVyZmxvdyAgIC00Ci0KLSNkZWZpbmUgRlRfQkVHSU5fSEVBREVSCi0jZGVmaW5lIEZUX0VORF9IRUFERVIKLQotI2luY2x1ZGUgImZ0aW1hZ2UuaCIKLSNpbmNsdWRlICJmdGdyYXlzLmgiCi0KLQotICAvKiBUaGlzIG1hY3JvIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhIGZ1bmN0aW9uIHBhcmFtZXRlciBpcyB1bnVzZWQuICovCi0gIC8qIEl0cyBwdXJwb3NlIGlzIHNpbXBseSB0byByZWR1Y2UgY29tcGlsZXIgd2FybmluZ3MuICBOb3RlIGFsc28gdGhhdCAgKi8KLSAgLyogc2ltcGx5IGRlZmluaW5nIGl0IGFzIGAodm9pZCl4JyBkb2Vzbid0IGF2b2lkIHdhcm5pbmdzIHdpdGggY2VydGFpbiAqLwotICAvKiBBTlNJIGNvbXBpbGVycyAoZS5nLiBMQ0MpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEZUX1VOVVNFRCggeCApICAoeCkgPSAoeCkKLQotCi0gIC8qIHdlIG9ubHkgdXNlIGxldmVsIDUgJiA3IHRyYWNpbmcgbWVzc2FnZXM7IGNmLiBmdGRlYnVnLmggKi8KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0KLSAgdm9pZAotICBGVF9NZXNzYWdlKCBjb25zdCBjaGFyKiAgZm10LAotICAgICAgICAgICAgICAuLi4gKQotICB7Ci0gICAgdmFfbGlzdCAgYXA7Ci0KLQotICAgIHZhX3N0YXJ0KCBhcCwgZm10ICk7Ci0gICAgdmZwcmludGYoIHN0ZGVyciwgZm10LCBhcCApOwotICAgIHZhX2VuZCggYXAgKTsKLSAgfQotCi0KLSAgLyogZW1wdHkgZnVuY3Rpb24gdXNlZnVsIGZvciBzZXR0aW5nIGEgYnJlYWtwb2ludCB0byBjYXRjaCBlcnJvcnMgKi8KLSAgaW50Ci0gIEZUX1Rocm93KCBpbnQgICAgICAgICAgZXJyb3IsCi0gICAgICAgICAgICBpbnQgICAgICAgICAgbGluZSwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlICkKLSAgewotICAgIEZUX1VOVVNFRCggZXJyb3IgKTsKLSAgICBGVF9VTlVTRUQoIGxpbmUgKTsKLSAgICBGVF9VTlVTRUQoIGZpbGUgKTsKLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotICAvKiB3ZSBkb24ndCBoYW5kbGUgdHJhY2luZyBsZXZlbHMgaW4gc3RhbmQtYWxvbmUgbW9kZTsgKi8KLSNpZm5kZWYgRlRfVFJBQ0U1Ci0jZGVmaW5lIEZUX1RSQUNFNSggdmFyZm9ybWF0ICkgIEZUX01lc3NhZ2UgdmFyZm9ybWF0Ci0jZW5kaWYKLSNpZm5kZWYgRlRfVFJBQ0U3Ci0jZGVmaW5lIEZUX1RSQUNFNyggdmFyZm9ybWF0ICkgIEZUX01lc3NhZ2UgdmFyZm9ybWF0Ci0jZW5kaWYKLSNpZm5kZWYgRlRfRVJST1IKLSNkZWZpbmUgRlRfRVJST1IoIHZhcmZvcm1hdCApICAgRlRfTWVzc2FnZSB2YXJmb3JtYXQKLSNlbmRpZgotCi0jZGVmaW5lIEZUX1RIUk9XKCBlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggRlRfVGhyb3coIEZUX0VSUl9DQVQoIEVyclJhc3RlciwgZSApLCAgIFwKLSAgICAgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgX19GSUxFX18gKSAgICAgICAgICAgICAgICAgIHwgXAotICAgICAgICAgICAgRlRfRVJSX0NBVCggRXJyUmFzdGVyLCBlICkgICAgICAgICAgICApCi0KLSNlbHNlIC8qICFGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0jZGVmaW5lIEZUX1RSQUNFNSggeCApICBkbyB7IH0gd2hpbGUgKCAwICkgICAgIC8qIG5vdGhpbmcgKi8KLSNkZWZpbmUgRlRfVFJBQ0U3KCB4ICkgIGRvIHsgfSB3aGlsZSAoIDAgKSAgICAgLyogbm90aGluZyAqLwotI2RlZmluZSBGVF9FUlJPUiggeCApICAgZG8geyB9IHdoaWxlICggMCApICAgICAvKiBub3RoaW5nICovCi0jZGVmaW5lIEZUX1RIUk9XKCBlICkgICBGVF9FUlJfQ0FUKCBFcnJSYXN0ZXJfLCBlICkKLQotCi0jZW5kaWYgLyogIUZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLQotI2RlZmluZSBGVF9ERUZJTkVfT1VUTElORV9GVU5DUyggY2xhc3NfLCAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVfdG9fLCBsaW5lX3RvXywgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25pY190b18sIGN1YmljX3RvXywgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hpZnRfLCBkZWx0YV8gKSAgICAgIFwKLSAgICAgICAgICBzdGF0aWMgY29uc3QgRlRfT3V0bGluZV9GdW5jcyBjbGFzc18gPSAgICAgICBcCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgbW92ZV90b18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGxpbmVfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBjb25pY190b18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgY3ViaWNfdG9fLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHNoaWZ0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBkZWx0YV8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgfTsKLQotI2RlZmluZSBGVF9ERUZJTkVfUkFTVEVSX0ZVTkNTKCBjbGFzc18sIGdseXBoX2Zvcm1hdF8sICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXJfbmV3XywgcmFzdGVyX3Jlc2V0XywgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXJfc2V0X21vZGVfLCByYXN0ZXJfcmVuZGVyXywgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXN0ZXJfZG9uZV8gKSAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNvbnN0IEZUX1Jhc3Rlcl9GdW5jcyBjbGFzc18gPSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZ2x5cGhfZm9ybWF0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcmFzdGVyX25ld18sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcmFzdGVyX3Jlc2V0XywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcmFzdGVyX3NldF9tb2RlXywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcmFzdGVyX3JlbmRlcl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcmFzdGVyX2RvbmVfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgfTsKLQotCi0jZWxzZSAvKiAhX1NUQU5EQUxPTkVfICovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAiZnRncmF5cy5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLQotI2luY2x1ZGUgImZ0c21lcnJzLmgiCi0KLSNpbmNsdWRlICJmdHNwaWMuaCIKLQotI2RlZmluZSBTbW9vdGhfRXJyX0ludmFsaWRfTW9kZSAgICAgU21vb3RoX0Vycl9DYW5ub3RfUmVuZGVyX0dseXBoCi0jZGVmaW5lIFNtb290aF9FcnJfTWVtb3J5X092ZXJmbG93ICBTbW9vdGhfRXJyX091dF9PZl9NZW1vcnkKLSNkZWZpbmUgRXJyUmFzdGVyX01lbW9yeV9PdmVyZmxvdyAgIFNtb290aF9FcnJfT3V0X09mX01lbW9yeQotCi0KLSNlbmRpZiAvKiAhX1NUQU5EQUxPTkVfICovCi0KLQotI2lmbmRlZiBGVF9NRU1fU0VUCi0jZGVmaW5lIEZUX01FTV9TRVQoIGQsIHMsIGMgKSAgZnRfbWVtc2V0KCBkLCBzLCBjICkKLSNlbmRpZgotCi0jaWZuZGVmIEZUX01FTV9aRVJPCi0jZGVmaW5lIEZUX01FTV9aRVJPKCBkZXN0LCBjb3VudCApICBGVF9NRU1fU0VUKCBkZXN0LCAwLCBjb3VudCApCi0jZW5kaWYKLQotICAvKiBhcyB1c3VhbCwgZm9yIHRoZSBzcGVlZCBodW5ncnkgOi0pICovCi0KLSN1bmRlZiBSQVNfQVJHCi0jdW5kZWYgUkFTX0FSR18KLSN1bmRlZiBSQVNfVkFSCi0jdW5kZWYgUkFTX1ZBUl8KLQotI2lmbmRlZiBGVF9TVEFUSUNfUkFTVEVSCi0KLSNkZWZpbmUgUkFTX0FSRyAgIGdyYXlfUFdvcmtlciAgd29ya2VyCi0jZGVmaW5lIFJBU19BUkdfICBncmF5X1BXb3JrZXIgIHdvcmtlciwKLQotI2RlZmluZSBSQVNfVkFSICAgd29ya2VyCi0jZGVmaW5lIFJBU19WQVJfICB3b3JrZXIsCi0KLSNlbHNlIC8qIEZUX1NUQVRJQ19SQVNURVIgKi8KLQotI2RlZmluZSBSQVNfQVJHICAgLyogZW1wdHkgKi8KLSNkZWZpbmUgUkFTX0FSR18gIC8qIGVtcHR5ICovCi0jZGVmaW5lIFJBU19WQVIgICAvKiBlbXB0eSAqLwotI2RlZmluZSBSQVNfVkFSXyAgLyogZW1wdHkgKi8KLQotI2VuZGlmIC8qIEZUX1NUQVRJQ19SQVNURVIgKi8KLQotCi0gIC8qIG11c3QgYmUgYXQgbGVhc3QgNiBiaXRzISAqLwotI2RlZmluZSBQSVhFTF9CSVRTICA4Ci0KLSN1bmRlZiBGTE9PUgotI3VuZGVmIENFSUxJTkcKLSN1bmRlZiBUUlVOQwotI3VuZGVmIFNDQUxFRAotCi0jZGVmaW5lIE9ORV9QSVhFTCAgICAgICAoIDFMIDw8IFBJWEVMX0JJVFMgKQotI2RlZmluZSBUUlVOQyggeCApICAgICAgKCAoVENvb3JkKSggKHgpID4+IFBJWEVMX0JJVFMgKSApCi0jZGVmaW5lIFNVQlBJWEVMUyggeCApICAoIChUUG9zKSh4KSA8PCBQSVhFTF9CSVRTICkKLSNkZWZpbmUgRkxPT1IoIHggKSAgICAgICggKHgpICYgLU9ORV9QSVhFTCApCi0jZGVmaW5lIENFSUxJTkcoIHggKSAgICAoICggKHgpICsgT05FX1BJWEVMIC0gMSApICYgLU9ORV9QSVhFTCApCi0jZGVmaW5lIFJPVU5EKCB4ICkgICAgICAoICggKHgpICsgT05FX1BJWEVMIC8gMiApICYgLU9ORV9QSVhFTCApCi0KLSNpZiBQSVhFTF9CSVRTID49IDYKLSNkZWZpbmUgVVBTQ0FMRSggeCApICAgICggKHgpIDw8ICggUElYRUxfQklUUyAtIDYgKSApCi0jZGVmaW5lIERPV05TQ0FMRSggeCApICAoICh4KSA+PiAoIFBJWEVMX0JJVFMgLSA2ICkgKQotI2Vsc2UKLSNkZWZpbmUgVVBTQ0FMRSggeCApICAgICggKHgpID4+ICggNiAtIFBJWEVMX0JJVFMgKSApCi0jZGVmaW5lIERPV05TQ0FMRSggeCApICAoICh4KSA8PCAoIDYgLSBQSVhFTF9CSVRTICkgKQotI2VuZGlmCi0KLQotICAvKiBDb21wdXRlIGBkaXZpZGVuZCAvIGRpdmlzb3InIGFuZCByZXR1cm4gYm90aCBpdHMgcXVvdGllbnQgYW5kICAgICAqLwotICAvKiByZW1haW5kZXIsIGNhc3QgdG8gYSBzcGVjaWZpYyB0eXBlLiAgVGhpcyBtYWNybyBhbHNvIGVuc3VyZXMgdGhhdCAqLwotICAvKiB0aGUgcmVtYWluZGVyIGlzIGFsd2F5cyBwb3NpdGl2ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBGVF9ESVZfTU9EKCB0eXBlLCBkaXZpZGVuZCwgZGl2aXNvciwgcXVvdGllbnQsIHJlbWFpbmRlciApIFwKLSAgRlRfQkVHSU5fU1RNTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHF1b3RpZW50KSAgPSAodHlwZSkoIChkaXZpZGVuZCkgLyAoZGl2aXNvcikgKTsgICAgICAgICAgICAgICAgXAotICAgIChyZW1haW5kZXIpID0gKHR5cGUpKCAoZGl2aWRlbmQpICUgKGRpdmlzb3IpICk7ICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIChyZW1haW5kZXIpIDwgMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKHF1b3RpZW50KS0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIChyZW1haW5kZXIpICs9ICh0eXBlKShkaXZpc29yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FTkRfU1RNTlQKLQotI2lmZGVmICBfX2FybV9fCi0gIC8qIFdvcmsgYXJvdW5kIGEgYnVnIHNwZWNpZmljIHRvIEdDQyB3aGljaCBtYWtlIHRoZSBjb21waWxlciBmYWlsIHRvICovCi0gIC8qIG9wdGltaXplIGEgZGl2aXNpb24gYW5kIG1vZHVsbyBvcGVyYXRpb24gb24gdGhlIHNhbWUgcGFyYW1ldGVycyAgICovCi0gIC8qIGludG8gYSBzaW5nbGUgY2FsbCB0byBgX19hZWFiaV9pZGl2bW9kJy4gIFNlZSAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBodHRwOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQzNzIxICAgICAgICAgICAgICAgICovCi0jdW5kZWYgRlRfRElWX01PRAotI2RlZmluZSBGVF9ESVZfTU9EKCB0eXBlLCBkaXZpZGVuZCwgZGl2aXNvciwgcXVvdGllbnQsIHJlbWFpbmRlciApIFwKLSAgRlRfQkVHSU5fU1RNTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHF1b3RpZW50KSAgPSAodHlwZSkoIChkaXZpZGVuZCkgLyAoZGl2aXNvcikgKTsgICAgICAgICAgICAgICAgXAotICAgIChyZW1haW5kZXIpID0gKHR5cGUpKCAoZGl2aWRlbmQpIC0gKHF1b3RpZW50KSAqIChkaXZpc29yKSApOyAgIFwKLSAgICBpZiAoIChyZW1haW5kZXIpIDwgMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKHF1b3RpZW50KS0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIChyZW1haW5kZXIpICs9ICh0eXBlKShkaXZpc29yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGVF9FTkRfU1RNTlQKLSNlbmRpZiAvKiBfX2FybV9fICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgVFlQRSBERUZJTklUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiBkb24ndCBjaGFuZ2UgdGhlIGZvbGxvd2luZyB0eXBlcyB0byBGVF9JbnQgb3IgRlRfUG9zLCBzaW5jZSB3ZSBtaWdodCAqLwotICAvKiBuZWVkIHRvIGRlZmluZSB0aGVtIHRvICJmbG9hdCIgb3IgImRvdWJsZSIgd2hlbiBleHBlcmltZW50aW5nIHdpdGggICAqLwotICAvKiBuZXcgYWxnb3JpdGhtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIHR5cGVkZWYgbG9uZyAgVENvb3JkOyAgIC8qIGludGVnZXIgc2NhbmxpbmUvcGl4ZWwgY29vcmRpbmF0ZSAqLwotICB0eXBlZGVmIGxvbmcgIFRQb3M7ICAgICAvKiBzdWItcGl4ZWwgY29vcmRpbmF0ZSAgICAgICAgICAgICAgKi8KLQotICAvKiBkZXRlcm1pbmUgdGhlIHR5cGUgdXNlZCB0byBzdG9yZSBjZWxsIGFyZWFzLiAgVGhpcyBub3JtYWxseSB0YWtlcyBhdCAqLwotICAvKiBsZWFzdCBQSVhFTF9CSVRTKjIgKyAxIGJpdHMuICBPbiAxNi1iaXQgc3lzdGVtcywgd2UgbmVlZCB0byB1c2UgICAgICAqLwotICAvKiBgbG9uZycgaW5zdGVhZCBvZiBgaW50Jywgb3RoZXJ3aXNlIGJhZCB0aGluZ3MgaGFwcGVuICAgICAgICAgICAgICAgICAqLwotCi0jaWYgUElYRUxfQklUUyA8PSA3Ci0KLSAgdHlwZWRlZiBpbnQgIFRBcmVhOwotCi0jZWxzZSAvKiBQSVhFTF9CSVRTID49IDggKi8KLQotICAvKiBhcHByb3hpbWF0ZWx5IGRldGVybWluZSB0aGUgc2l6ZSBvZiBpbnRlZ2VycyB1c2luZyBhbiBBTlNJLUMgaGVhZGVyICovCi0jaWYgRlRfVUlOVF9NQVggPT0gMHhGRkZGVQotICB0eXBlZGVmIGxvbmcgIFRBcmVhOwotI2Vsc2UKLSAgdHlwZWRlZiBpbnQgICBUQXJlYTsKLSNlbmRpZgotCi0jZW5kaWYgLyogUElYRUxfQklUUyA+PSA4ICovCi0KLQotICAvKiBtYXhpbXVtIG51bWJlciBvZiBncmF5IHNwYW5zIGluIGEgY2FsbCB0byB0aGUgc3BhbiBjYWxsYmFjayAqLwotI2RlZmluZSBGVF9NQVhfR1JBWV9TUEFOUyAgMzIKLQotCi0gIHR5cGVkZWYgc3RydWN0IFRDZWxsXyogIFBDZWxsOwotCi0gIHR5cGVkZWYgc3RydWN0ICBUQ2VsbF8KLSAgewotICAgIFRQb3MgICAgeDsgICAgIC8qIHNhbWUgd2l0aCBncmF5X1RXb3JrZXIuZXggICAgKi8KLSAgICBUQ29vcmQgIGNvdmVyOyAvKiBzYW1lIHdpdGggZ3JheV9UV29ya2VyLmNvdmVyICovCi0gICAgVEFyZWEgICBhcmVhOwotICAgIFBDZWxsICAgbmV4dDsKLQotICB9IFRDZWxsOwotCi0KLSNpZiBkZWZpbmVkKCBfTVNDX1ZFUiApICAgICAgLyogVmlzdWFsIEMrKyAoYW5kIEludGVsIEMrKykgKi8KLSAgLyogV2UgZGlzYWJsZSB0aGUgd2FybmluZyBgc3RydWN0dXJlIHdhcyBwYWRkZWQgZHVlIHRvICAgKi8KLSAgLyogX19kZWNsc3BlYyhhbGlnbigpKScgaW4gb3JkZXIgdG8gY29tcGlsZSBjbGVhbmx5IHdpdGggKi8KLSAgLyogdGhlIG1heGltdW0gbGV2ZWwgb2Ygd2FybmluZ3MuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNwcmFnbWEgd2FybmluZyggcHVzaCApCi0jcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MzI0ICkKLSNlbmRpZiAvKiBfTVNDX1ZFUiAqLwotCi0gIHR5cGVkZWYgc3RydWN0ICBncmF5X1RXb3JrZXJfCi0gIHsKLSAgICBmdF9qbXBfYnVmICBqdW1wX2J1ZmZlcjsKLQotICAgIFRDb29yZCAgZXgsIGV5OwotICAgIFRQb3MgICAgbWluX2V4LCBtYXhfZXg7Ci0gICAgVFBvcyAgICBtaW5fZXksIG1heF9leTsKLSAgICBUUG9zICAgIGNvdW50X2V4LCBjb3VudF9leTsKLQotICAgIFRBcmVhICAgYXJlYTsKLSAgICBUQ29vcmQgIGNvdmVyOwotICAgIGludCAgICAgaW52YWxpZDsKLQotICAgIFBDZWxsICAgICAgIGNlbGxzOwotICAgIEZUX1B0ckRpc3QgIG1heF9jZWxsczsKLSAgICBGVF9QdHJEaXN0ICBudW1fY2VsbHM7Ci0KLSAgICBUUG9zICAgIHgsICB5OwotCi0gICAgRlRfVmVjdG9yICAgYmV6X3N0YWNrWzMyICogMyArIDFdOwotICAgIGludCAgICAgICAgIGxldl9zdGFja1szMl07Ci0KLSAgICBGVF9PdXRsaW5lICBvdXRsaW5lOwotICAgIEZUX0JpdG1hcCAgIHRhcmdldDsKLSAgICBGVF9CQm94ICAgICBjbGlwX2JveDsKLQotICAgIEZUX1NwYW4gICAgIGdyYXlfc3BhbnNbRlRfTUFYX0dSQVlfU1BBTlNdOwotICAgIGludCAgICAgICAgIG51bV9ncmF5X3NwYW5zOwotCi0gICAgRlRfUmFzdGVyX1NwYW5fRnVuYyAgcmVuZGVyX3NwYW47Ci0gICAgdm9pZCogICAgICAgICAgICAgICAgcmVuZGVyX3NwYW5fZGF0YTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICBzcGFuX3k7Ci0KLSAgICBpbnQgIGJhbmRfc2l6ZTsKLSAgICBpbnQgIGJhbmRfc2hvb3Q7Ci0KLSAgICB2b2lkKiAgICAgICBidWZmZXI7Ci0gICAgbG9uZyAgICAgICAgYnVmZmVyX3NpemU7Ci0KLSAgICBQQ2VsbCogICAgIHljZWxsczsKLSAgICBUUG9zICAgICAgIHljb3VudDsKLQotICB9IGdyYXlfVFdvcmtlciwgKmdyYXlfUFdvcmtlcjsKLQotI2lmIGRlZmluZWQoIF9NU0NfVkVSICkKLSNwcmFnbWEgd2FybmluZyggcG9wICkKLSNlbmRpZgotCi0KLSNpZm5kZWYgRlRfU1RBVElDX1JBU1RFUgotI2RlZmluZSByYXMgICgqd29ya2VyKQotI2Vsc2UKLSAgc3RhdGljIGdyYXlfVFdvcmtlciAgcmFzOwotI2VuZGlmCi0KLQotICB0eXBlZGVmIHN0cnVjdCBncmF5X1RSYXN0ZXJfCi0gIHsKLSAgICB2b2lkKiAgICAgICAgIG1lbW9yeTsKLQotICB9IGdyYXlfVFJhc3RlciwgKmdyYXlfUFJhc3RlcjsKLQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJbml0aWFsaXplIHRoZSBjZWxscyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIGdyYXlfaW5pdF9jZWxscyggUkFTX0FSR18gdm9pZCogIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nICAgYnl0ZV9zaXplICkKLSAgewotICAgIHJhcy5idWZmZXIgICAgICA9IGJ1ZmZlcjsKLSAgICByYXMuYnVmZmVyX3NpemUgPSBieXRlX3NpemU7Ci0KLSAgICByYXMueWNlbGxzICAgICAgPSAoUENlbGwqKSBidWZmZXI7Ci0gICAgcmFzLmNlbGxzICAgICAgID0gTlVMTDsKLSAgICByYXMubWF4X2NlbGxzICAgPSAwOwotICAgIHJhcy5udW1fY2VsbHMgICA9IDA7Ci0gICAgcmFzLmFyZWEgICAgICAgID0gMDsKLSAgICByYXMuY292ZXIgICAgICAgPSAwOwotICAgIHJhcy5pbnZhbGlkICAgICA9IDE7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ29tcHV0ZSB0aGUgb3V0bGluZSBib3VuZGluZyBib3guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBncmF5X2NvbXB1dGVfY2JveCggUkFTX0FSRyApCi0gIHsKLSAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSA9ICZyYXMub3V0bGluZTsKLSAgICBGVF9WZWN0b3IqICAgdmVjICAgICA9IG91dGxpbmUtPnBvaW50czsKLSAgICBGVF9WZWN0b3IqICAgbGltaXQgICA9IHZlYyArIG91dGxpbmUtPm5fcG9pbnRzOwotCi0KLSAgICBpZiAoIG91dGxpbmUtPm5fcG9pbnRzIDw9IDAgKQotICAgIHsKLSAgICAgIHJhcy5taW5fZXggPSByYXMubWF4X2V4ID0gMDsKLSAgICAgIHJhcy5taW5fZXkgPSByYXMubWF4X2V5ID0gMDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICByYXMubWluX2V4ID0gcmFzLm1heF9leCA9IHZlYy0+eDsKLSAgICByYXMubWluX2V5ID0gcmFzLm1heF9leSA9IHZlYy0+eTsKLQotICAgIHZlYysrOwotCi0gICAgZm9yICggOyB2ZWMgPCBsaW1pdDsgdmVjKysgKQotICAgIHsKLSAgICAgIFRQb3MgIHggPSB2ZWMtPng7Ci0gICAgICBUUG9zICB5ID0gdmVjLT55OwotCi0KLSAgICAgIGlmICggeCA8IHJhcy5taW5fZXggKSByYXMubWluX2V4ID0geDsKLSAgICAgIGlmICggeCA+IHJhcy5tYXhfZXggKSByYXMubWF4X2V4ID0geDsKLSAgICAgIGlmICggeSA8IHJhcy5taW5fZXkgKSByYXMubWluX2V5ID0geTsKLSAgICAgIGlmICggeSA+IHJhcy5tYXhfZXkgKSByYXMubWF4X2V5ID0geTsKLSAgICB9Ci0KLSAgICAvKiB0cnVuY2F0ZSB0aGUgYm91bmRpbmcgYm94IHRvIGludGVnZXIgcGl4ZWxzICovCi0gICAgcmFzLm1pbl9leCA9IHJhcy5taW5fZXggPj4gNjsKLSAgICByYXMubWluX2V5ID0gcmFzLm1pbl9leSA+PiA2OwotICAgIHJhcy5tYXhfZXggPSAoIHJhcy5tYXhfZXggKyA2MyApID4+IDY7Ci0gICAgcmFzLm1heF9leSA9ICggcmFzLm1heF9leSArIDYzICkgPj4gNjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBSZWNvcmQgdGhlIGN1cnJlbnQgY2VsbCBpbiB0aGUgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBQQ2VsbAotICBncmF5X2ZpbmRfY2VsbCggUkFTX0FSRyApCi0gIHsKLSAgICBQQ2VsbCAgKnBjZWxsLCBjZWxsOwotICAgIFRQb3MgICAgeCA9IHJhcy5leDsKLQotCi0gICAgaWYgKCB4ID4gcmFzLmNvdW50X2V4ICkKLSAgICAgIHggPSByYXMuY291bnRfZXg7Ci0KLSAgICBwY2VsbCA9ICZyYXMueWNlbGxzW3Jhcy5leV07Ci0gICAgZm9yICg7OykKLSAgICB7Ci0gICAgICBjZWxsID0gKnBjZWxsOwotICAgICAgaWYgKCBjZWxsID09IE5VTEwgfHwgY2VsbC0+eCA+IHggKQotICAgICAgICBicmVhazsKLQotICAgICAgaWYgKCBjZWxsLT54ID09IHggKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHBjZWxsID0gJmNlbGwtPm5leHQ7Ci0gICAgfQotCi0gICAgaWYgKCByYXMubnVtX2NlbGxzID49IHJhcy5tYXhfY2VsbHMgKQotICAgICAgZnRfbG9uZ2ptcCggcmFzLmp1bXBfYnVmZmVyLCAxICk7Ci0KLSAgICBjZWxsICAgICAgICA9IHJhcy5jZWxscyArIHJhcy5udW1fY2VsbHMrKzsKLSAgICBjZWxsLT54ICAgICA9IHg7Ci0gICAgY2VsbC0+YXJlYSAgPSAwOwotICAgIGNlbGwtPmNvdmVyID0gMDsKLQotICAgIGNlbGwtPm5leHQgID0gKnBjZWxsOwotICAgICpwY2VsbCAgICAgID0gY2VsbDsKLQotICBFeGl0OgotICAgIHJldHVybiBjZWxsOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBncmF5X3JlY29yZF9jZWxsKCBSQVNfQVJHICkKLSAgewotICAgIGlmICggcmFzLmFyZWEgfCByYXMuY292ZXIgKQotICAgIHsKLSAgICAgIFBDZWxsICBjZWxsID0gZ3JheV9maW5kX2NlbGwoIFJBU19WQVIgKTsKLQotCi0gICAgICBjZWxsLT5hcmVhICArPSByYXMuYXJlYTsKLSAgICAgIGNlbGwtPmNvdmVyICs9IHJhcy5jb3ZlcjsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU2V0IHRoZSBjdXJyZW50IGNlbGwgdG8gYSBuZXcgcG9zaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBncmF5X3NldF9jZWxsKCBSQVNfQVJHXyBUQ29vcmQgIGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBUQ29vcmQgIGV5ICkKLSAgewotICAgIC8qIE1vdmUgdGhlIGNlbGwgcG9pbnRlciB0byBhIG5ldyBwb3NpdGlvbi4gIFdlIHNldCB0aGUgYGludmFsaWQnICAgICAgKi8KLSAgICAvKiBmbGFnIHRvIGluZGljYXRlIHRoYXQgdGhlIGNlbGwgaXNuJ3QgcGFydCBvZiB0aG9zZSB3ZSdyZSBpbnRlcmVzdGVkICovCi0gICAgLyogaW4gZHVyaW5nIHRoZSByZW5kZXIgcGhhc2UuICBUaGlzIG1lYW5zIHRoYXQ6ICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAuIHRoZSBuZXcgdmVydGljYWwgcG9zaXRpb24gbXVzdCBiZSB3aXRoaW4gbWluX2V5Li5tYXhfZXktMS4gICAgICAgICovCi0gICAgLyogLiB0aGUgbmV3IGhvcml6b250YWwgcG9zaXRpb24gbXVzdCBiZSBzdHJpY3RseSBsZXNzIHRoYW4gbWF4X2V4ICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBOb3RlIHRoYXQgaWYgYSBjZWxsIGlzIHRvIHRoZSBsZWZ0IG9mIHRoZSBjbGlwcGluZyByZWdpb24sIGl0IGlzICAgICovCi0gICAgLyogYWN0dWFsbHkgc2V0IHRvIHRoZSAobWluX2V4LTEpIGhvcml6b250YWwgcG9zaXRpb24uICAgICAgICAgICAgICAgICAqLwotCi0gICAgLyogQWxsIGNlbGxzIHRoYXQgYXJlIG9uIHRoZSBsZWZ0IG9mIHRoZSBjbGlwcGluZyByZWdpb24gZ28gdG8gdGhlICovCi0gICAgLyogbWluX2V4IC0gMSBob3Jpem9udGFsIHBvc2l0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZXkgLT0gcmFzLm1pbl9leTsKLQotICAgIGlmICggZXggPiByYXMubWF4X2V4ICkKLSAgICAgIGV4ID0gcmFzLm1heF9leDsKLQotICAgIGV4IC09IHJhcy5taW5fZXg7Ci0gICAgaWYgKCBleCA8IDAgKQotICAgICAgZXggPSAtMTsKLQotICAgIC8qIGFyZSB3ZSBtb3ZpbmcgdG8gYSBkaWZmZXJlbnQgY2VsbCA/ICovCi0gICAgaWYgKCBleCAhPSByYXMuZXggfHwgZXkgIT0gcmFzLmV5ICkKLSAgICB7Ci0gICAgICAvKiByZWNvcmQgdGhlIGN1cnJlbnQgb25lIGlmIGl0IGlzIHZhbGlkICovCi0gICAgICBpZiAoICFyYXMuaW52YWxpZCApCi0gICAgICAgIGdyYXlfcmVjb3JkX2NlbGwoIFJBU19WQVIgKTsKLQotICAgICAgcmFzLmFyZWEgID0gMDsKLSAgICAgIHJhcy5jb3ZlciA9IDA7Ci0gICAgICByYXMuZXggICAgPSBleDsKLSAgICAgIHJhcy5leSAgICA9IGV5OwotICAgIH0KLQotICAgIHJhcy5pbnZhbGlkID0gKCAodW5zaWduZWQgaW50KWV5ID49ICh1bnNpZ25lZCBpbnQpcmFzLmNvdW50X2V5IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXggPj0gcmFzLmNvdW50X2V4ICAgICAgICAgICAgICAgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFydCBhIG5ldyBjb250b3VyIGF0IGEgZ2l2ZW4gY2VsbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIGdyYXlfc3RhcnRfY2VsbCggUkFTX0FSR18gVENvb3JkICBleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ29vcmQgIGV5ICkKLSAgewotICAgIGlmICggZXggPiByYXMubWF4X2V4ICkKLSAgICAgIGV4ID0gKFRDb29yZCkoIHJhcy5tYXhfZXggKTsKLQotICAgIGlmICggZXggPCByYXMubWluX2V4ICkKLSAgICAgIGV4ID0gKFRDb29yZCkoIHJhcy5taW5fZXggLSAxICk7Ci0KLSAgICByYXMuYXJlYSAgICA9IDA7Ci0gICAgcmFzLmNvdmVyICAgPSAwOwotICAgIHJhcy5leCAgICAgID0gZXggLSByYXMubWluX2V4OwotICAgIHJhcy5leSAgICAgID0gZXkgLSByYXMubWluX2V5OwotICAgIHJhcy5pbnZhbGlkID0gMDsKLQotICAgIGdyYXlfc2V0X2NlbGwoIFJBU19WQVJfIGV4LCBleSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJlbmRlciBhIHNjYW5saW5lIGFzIG9uZSBvciBtb3JlIGNlbGxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgZ3JheV9yZW5kZXJfc2NhbmxpbmUoIFJBU19BUkdfIFRDb29yZCAgZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUG9zICAgIHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVENvb3JkICB5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRQb3MgICAgeDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQ29vcmQgIHkyICkKLSAgewotICAgIFRDb29yZCAgZXgxLCBleDIsIGZ4MSwgZngyLCBkZWx0YSwgbW9kOwotICAgIGxvbmcgICAgcCwgZmlyc3QsIGR4OwotICAgIGludCAgICAgaW5jcjsKLQotCi0gICAgZHggPSB4MiAtIHgxOwotCi0gICAgZXgxID0gVFJVTkMoIHgxICk7Ci0gICAgZXgyID0gVFJVTkMoIHgyICk7Ci0gICAgZngxID0gKFRDb29yZCkoIHgxIC0gU1VCUElYRUxTKCBleDEgKSApOwotICAgIGZ4MiA9IChUQ29vcmQpKCB4MiAtIFNVQlBJWEVMUyggZXgyICkgKTsKLQotICAgIC8qIHRyaXZpYWwgY2FzZS4gIEhhcHBlbnMgb2Z0ZW4gKi8KLSAgICBpZiAoIHkxID09IHkyICkKLSAgICB7Ci0gICAgICBncmF5X3NldF9jZWxsKCBSQVNfVkFSXyBleDIsIGV5ICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogZXZlcnl0aGluZyBpcyBsb2NhdGVkIGluIGEgc2luZ2xlIGNlbGwuICBUaGF0IGlzIGVhc3khICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBleDEgPT0gZXgyICkKLSAgICB7Ci0gICAgICBkZWx0YSAgICAgID0geTIgLSB5MTsKLSAgICAgIHJhcy5hcmVhICArPSAoVEFyZWEpKCggZngxICsgZngyICkgKiBkZWx0YSk7Ci0gICAgICByYXMuY292ZXIgKz0gZGVsdGE7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogb2ssIHdlJ2xsIGhhdmUgdG8gcmVuZGVyIGEgcnVuIG9mIGFkamFjZW50IGNlbGxzIG9uIHRoZSBzYW1lICovCi0gICAgLyogc2NhbmxpbmUuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgcCAgICAgPSAoIE9ORV9QSVhFTCAtIGZ4MSApICogKCB5MiAtIHkxICk7Ci0gICAgZmlyc3QgPSBPTkVfUElYRUw7Ci0gICAgaW5jciAgPSAxOwotCi0gICAgaWYgKCBkeCA8IDAgKQotICAgIHsKLSAgICAgIHAgICAgID0gZngxICogKCB5MiAtIHkxICk7Ci0gICAgICBmaXJzdCA9IDA7Ci0gICAgICBpbmNyICA9IC0xOwotICAgICAgZHggICAgPSAtZHg7Ci0gICAgfQotCi0gICAgRlRfRElWX01PRCggVENvb3JkLCBwLCBkeCwgZGVsdGEsIG1vZCApOwotCi0gICAgcmFzLmFyZWEgICs9IChUQXJlYSkoKCBmeDEgKyBmaXJzdCApICogZGVsdGEpOwotICAgIHJhcy5jb3ZlciArPSBkZWx0YTsKLQotICAgIGV4MSArPSBpbmNyOwotICAgIGdyYXlfc2V0X2NlbGwoIFJBU19WQVJfIGV4MSwgZXkgKTsKLSAgICB5MSAgKz0gZGVsdGE7Ci0KLSAgICBpZiAoIGV4MSAhPSBleDIgKQotICAgIHsKLSAgICAgIFRDb29yZCAgbGlmdCwgcmVtOwotCi0KLSAgICAgIHAgPSBPTkVfUElYRUwgKiAoIHkyIC0geTEgKyBkZWx0YSApOwotICAgICAgRlRfRElWX01PRCggVENvb3JkLCBwLCBkeCwgbGlmdCwgcmVtICk7Ci0KLSAgICAgIG1vZCAtPSAoaW50KWR4OwotCi0gICAgICBkbwotICAgICAgewotICAgICAgICBkZWx0YSA9IGxpZnQ7Ci0gICAgICAgIG1vZCAgKz0gcmVtOwotICAgICAgICBpZiAoIG1vZCA+PSAwICkKLSAgICAgICAgewotICAgICAgICAgIG1vZCAtPSAoVENvb3JkKWR4OwotICAgICAgICAgIGRlbHRhKys7Ci0gICAgICAgIH0KLQotICAgICAgICByYXMuYXJlYSAgKz0gKFRBcmVhKShPTkVfUElYRUwgKiBkZWx0YSk7Ci0gICAgICAgIHJhcy5jb3ZlciArPSBkZWx0YTsKLSAgICAgICAgeTEgICAgICAgICs9IGRlbHRhOwotICAgICAgICBleDEgICAgICAgKz0gaW5jcjsKLSAgICAgICAgZ3JheV9zZXRfY2VsbCggUkFTX1ZBUl8gZXgxLCBleSApOwotICAgICAgfSB3aGlsZSAoIGV4MSAhPSBleDIgKTsKLSAgICB9Ci0KLSAgICBkZWx0YSAgICAgID0geTIgLSB5MTsKLSAgICByYXMuYXJlYSAgKz0gKFRBcmVhKSgoIGZ4MiArIE9ORV9QSVhFTCAtIGZpcnN0ICkgKiBkZWx0YSk7Ci0gICAgcmFzLmNvdmVyICs9IGRlbHRhOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJlbmRlciBhIGdpdmVuIGxpbmUgYXMgYSBzZXJpZXMgb2Ygc2NhbmxpbmVzLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgZ3JheV9yZW5kZXJfbGluZSggUkFTX0FSR18gVFBvcyAgdG9feCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFBvcyAgdG9feSApCi0gIHsKLSAgICBUQ29vcmQgIGV5MSwgZXkyLCBmeTEsIGZ5MiwgbW9kOwotICAgIFRQb3MgICAgZHgsIGR5LCB4LCB4MjsKLSAgICBsb25nICAgIHAsIGZpcnN0OwotICAgIGludCAgICAgZGVsdGEsIHJlbSwgbGlmdCwgaW5jcjsKLQotCi0gICAgZXkxID0gVFJVTkMoIHJhcy55ICk7Ci0gICAgZXkyID0gVFJVTkMoIHRvX3kgKTsgICAgIC8qIGlmIChleTIgPj0gcmFzLm1heF9leSkgZXkyID0gcmFzLm1heF9leS0xOyAqLwotICAgIGZ5MSA9IChUQ29vcmQpKCByYXMueSAtIFNVQlBJWEVMUyggZXkxICkgKTsKLSAgICBmeTIgPSAoVENvb3JkKSggdG9feSAtIFNVQlBJWEVMUyggZXkyICkgKTsKLQotICAgIGR4ID0gdG9feCAtIHJhcy54OwotICAgIGR5ID0gdG9feSAtIHJhcy55OwotCi0gICAgLyogcGVyZm9ybSB2ZXJ0aWNhbCBjbGlwcGluZyAqLwotICAgIGlmICggKCBleTEgPj0gcmFzLm1heF9leSAmJiBleTIgPj0gcmFzLm1heF9leSApIHx8Ci0gICAgICAgICAoIGV5MSA8ICByYXMubWluX2V5ICYmIGV5MiA8ICByYXMubWluX2V5ICkgKQotICAgICAgZ290byBFbmQ7Ci0KLSAgICAvKiBldmVyeXRoaW5nIGlzIG9uIGEgc2luZ2xlIHNjYW5saW5lICovCi0gICAgaWYgKCBleTEgPT0gZXkyICkKLSAgICB7Ci0gICAgICBncmF5X3JlbmRlcl9zY2FubGluZSggUkFTX1ZBUl8gZXkxLCByYXMueCwgZnkxLCB0b194LCBmeTIgKTsKLSAgICAgIGdvdG8gRW5kOwotICAgIH0KLQotICAgIC8qIHZlcnRpY2FsIGxpbmUgLSBhdm9pZCBjYWxsaW5nIGdyYXlfcmVuZGVyX3NjYW5saW5lICovCi0gICAgaW5jciA9IDE7Ci0KLSAgICBpZiAoIGR4ID09IDAgKQotICAgIHsKLSAgICAgIFRDb29yZCAgZXggICAgID0gVFJVTkMoIHJhcy54ICk7Ci0gICAgICBUQ29vcmQgIHR3b19meCA9IChUQ29vcmQpKCAoIHJhcy54IC0gU1VCUElYRUxTKCBleCApICkgPDwgMSApOwotICAgICAgVEFyZWEgICBhcmVhOwotCi0KLSAgICAgIGZpcnN0ID0gT05FX1BJWEVMOwotICAgICAgaWYgKCBkeSA8IDAgKQotICAgICAgewotICAgICAgICBmaXJzdCA9IDA7Ci0gICAgICAgIGluY3IgID0gLTE7Ci0gICAgICB9Ci0KLSAgICAgIGRlbHRhICAgICAgPSAoaW50KSggZmlyc3QgLSBmeTEgKTsKLSAgICAgIHJhcy5hcmVhICArPSAoVEFyZWEpdHdvX2Z4ICogZGVsdGE7Ci0gICAgICByYXMuY292ZXIgKz0gZGVsdGE7Ci0gICAgICBleTEgICAgICAgKz0gaW5jcjsKLQotICAgICAgZ3JheV9zZXRfY2VsbCggUkFTX1ZBUl8gZXgsIGV5MSApOwotCi0gICAgICBkZWx0YSA9IChpbnQpKCBmaXJzdCArIGZpcnN0IC0gT05FX1BJWEVMICk7Ci0gICAgICBhcmVhICA9IChUQXJlYSl0d29fZnggKiBkZWx0YTsKLSAgICAgIHdoaWxlICggZXkxICE9IGV5MiApCi0gICAgICB7Ci0gICAgICAgIHJhcy5hcmVhICArPSBhcmVhOwotICAgICAgICByYXMuY292ZXIgKz0gZGVsdGE7Ci0gICAgICAgIGV5MSAgICAgICArPSBpbmNyOwotCi0gICAgICAgIGdyYXlfc2V0X2NlbGwoIFJBU19WQVJfIGV4LCBleTEgKTsKLSAgICAgIH0KLQotICAgICAgZGVsdGEgICAgICA9IChpbnQpKCBmeTIgLSBPTkVfUElYRUwgKyBmaXJzdCApOwotICAgICAgcmFzLmFyZWEgICs9IChUQXJlYSl0d29fZnggKiBkZWx0YTsKLSAgICAgIHJhcy5jb3ZlciArPSBkZWx0YTsKLQotICAgICAgZ290byBFbmQ7Ci0gICAgfQotCi0gICAgLyogb2ssIHdlIGhhdmUgdG8gcmVuZGVyIHNldmVyYWwgc2NhbmxpbmVzICovCi0gICAgcCAgICAgPSAoIE9ORV9QSVhFTCAtIGZ5MSApICogZHg7Ci0gICAgZmlyc3QgPSBPTkVfUElYRUw7Ci0gICAgaW5jciAgPSAxOwotCi0gICAgaWYgKCBkeSA8IDAgKQotICAgIHsKLSAgICAgIHAgICAgID0gZnkxICogZHg7Ci0gICAgICBmaXJzdCA9IDA7Ci0gICAgICBpbmNyICA9IC0xOwotICAgICAgZHkgICAgPSAtZHk7Ci0gICAgfQotCi0gICAgRlRfRElWX01PRCggaW50LCBwLCBkeSwgZGVsdGEsIG1vZCApOwotCi0gICAgeCA9IHJhcy54ICsgZGVsdGE7Ci0gICAgZ3JheV9yZW5kZXJfc2NhbmxpbmUoIFJBU19WQVJfIGV5MSwgcmFzLngsIGZ5MSwgeCwgKFRDb29yZClmaXJzdCApOwotCi0gICAgZXkxICs9IGluY3I7Ci0gICAgZ3JheV9zZXRfY2VsbCggUkFTX1ZBUl8gVFJVTkMoIHggKSwgZXkxICk7Ci0KLSAgICBpZiAoIGV5MSAhPSBleTIgKQotICAgIHsKLSAgICAgIHAgICAgID0gT05FX1BJWEVMICogZHg7Ci0gICAgICBGVF9ESVZfTU9EKCBpbnQsIHAsIGR5LCBsaWZ0LCByZW0gKTsKLSAgICAgIG1vZCAtPSAoaW50KWR5OwotCi0gICAgICBkbwotICAgICAgewotICAgICAgICBkZWx0YSA9IGxpZnQ7Ci0gICAgICAgIG1vZCAgKz0gcmVtOwotICAgICAgICBpZiAoIG1vZCA+PSAwICkKLSAgICAgICAgewotICAgICAgICAgIG1vZCAtPSAoaW50KWR5OwotICAgICAgICAgIGRlbHRhKys7Ci0gICAgICAgIH0KLQotICAgICAgICB4MiA9IHggKyBkZWx0YTsKLSAgICAgICAgZ3JheV9yZW5kZXJfc2NhbmxpbmUoIFJBU19WQVJfIGV5MSwgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUQ29vcmQpKCBPTkVfUElYRUwgLSBmaXJzdCApLCB4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUQ29vcmQpZmlyc3QgKTsKLSAgICAgICAgeCA9IHgyOwotCi0gICAgICAgIGV5MSArPSBpbmNyOwotICAgICAgICBncmF5X3NldF9jZWxsKCBSQVNfVkFSXyBUUlVOQyggeCApLCBleTEgKTsKLSAgICAgIH0gd2hpbGUgKCBleTEgIT0gZXkyICk7Ci0gICAgfQotCi0gICAgZ3JheV9yZW5kZXJfc2NhbmxpbmUoIFJBU19WQVJfIGV5MSwgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFRDb29yZCkoIE9ORV9QSVhFTCAtIGZpcnN0ICksIHRvX3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ5MiApOwotCi0gIEVuZDoKLSAgICByYXMueCAgICAgICA9IHRvX3g7Ci0gICAgcmFzLnkgICAgICAgPSB0b195OwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBncmF5X3NwbGl0X2NvbmljKCBGVF9WZWN0b3IqICBiYXNlICkKLSAgewotICAgIFRQb3MgIGEsIGI7Ci0KLQotICAgIGJhc2VbNF0ueCA9IGJhc2VbMl0ueDsKLSAgICBiID0gYmFzZVsxXS54OwotICAgIGEgPSBiYXNlWzNdLnggPSAoIGJhc2VbMl0ueCArIGIgKSAvIDI7Ci0gICAgYiA9IGJhc2VbMV0ueCA9ICggYmFzZVswXS54ICsgYiApIC8gMjsKLSAgICBiYXNlWzJdLnggPSAoIGEgKyBiICkgLyAyOwotCi0gICAgYmFzZVs0XS55ID0gYmFzZVsyXS55OwotICAgIGIgPSBiYXNlWzFdLnk7Ci0gICAgYSA9IGJhc2VbM10ueSA9ICggYmFzZVsyXS55ICsgYiApIC8gMjsKLSAgICBiID0gYmFzZVsxXS55ID0gKCBiYXNlWzBdLnkgKyBiICkgLyAyOwotICAgIGJhc2VbMl0ueSA9ICggYSArIGIgKSAvIDI7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGdyYXlfcmVuZGVyX2NvbmljKCBSQVNfQVJHXyBjb25zdCBGVF9WZWN0b3IqICBjb250cm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgdG8gKQotICB7Ci0gICAgVFBvcyAgICAgICAgZHgsIGR5OwotICAgIFRQb3MgICAgICAgIG1pbiwgbWF4LCB5OwotICAgIGludCAgICAgICAgIHRvcCwgbGV2ZWw7Ci0gICAgaW50KiAgICAgICAgbGV2ZWxzOwotICAgIEZUX1ZlY3RvciogIGFyYzsKLQotCi0gICAgbGV2ZWxzID0gcmFzLmxldl9zdGFjazsKLQotICAgIGFyYyAgICAgID0gcmFzLmJlel9zdGFjazsKLSAgICBhcmNbMF0ueCA9IFVQU0NBTEUoIHRvLT54ICk7Ci0gICAgYXJjWzBdLnkgPSBVUFNDQUxFKCB0by0+eSApOwotICAgIGFyY1sxXS54ID0gVVBTQ0FMRSggY29udHJvbC0+eCApOwotICAgIGFyY1sxXS55ID0gVVBTQ0FMRSggY29udHJvbC0+eSApOwotICAgIGFyY1syXS54ID0gcmFzLng7Ci0gICAgYXJjWzJdLnkgPSByYXMueTsKLSAgICB0b3AgICAgICA9IDA7Ci0KLSAgICBkeCA9IEZUX0FCUyggYXJjWzJdLnggKyBhcmNbMF0ueCAtIDIgKiBhcmNbMV0ueCApOwotICAgIGR5ID0gRlRfQUJTKCBhcmNbMl0ueSArIGFyY1swXS55IC0gMiAqIGFyY1sxXS55ICk7Ci0gICAgaWYgKCBkeCA8IGR5ICkKLSAgICAgIGR4ID0gZHk7Ci0KLSAgICBpZiAoIGR4IDwgT05FX1BJWEVMIC8gNCApCi0gICAgICBnb3RvIERyYXc7Ci0KLSAgICAvKiBzaG9ydC1jdXQgdGhlIGFyYyB0aGF0IGNyb3NzZXMgdGhlIGN1cnJlbnQgYmFuZCAqLwotICAgIG1pbiA9IG1heCA9IGFyY1swXS55OwotCi0gICAgeSA9IGFyY1sxXS55OwotICAgIGlmICggeSA8IG1pbiApIG1pbiA9IHk7Ci0gICAgaWYgKCB5ID4gbWF4ICkgbWF4ID0geTsKLQotICAgIHkgPSBhcmNbMl0ueTsKLSAgICBpZiAoIHkgPCBtaW4gKSBtaW4gPSB5OwotICAgIGlmICggeSA+IG1heCApIG1heCA9IHk7Ci0KLSAgICBpZiAoIFRSVU5DKCBtaW4gKSA+PSByYXMubWF4X2V5IHx8IFRSVU5DKCBtYXggKSA8IHJhcy5taW5fZXkgKQotICAgICAgZ290byBEcmF3OwotCi0gICAgbGV2ZWwgPSAwOwotICAgIGRvCi0gICAgewotICAgICAgZHggPj49IDI7Ci0gICAgICBsZXZlbCsrOwotICAgIH0gd2hpbGUgKCBkeCA+IE9ORV9QSVhFTCAvIDQgKTsKLQotICAgIGxldmVsc1swXSA9IGxldmVsOwotCi0gICAgZG8KLSAgICB7Ci0gICAgICBsZXZlbCA9IGxldmVsc1t0b3BdOwotICAgICAgaWYgKCBsZXZlbCA+IDAgKQotICAgICAgewotICAgICAgICBncmF5X3NwbGl0X2NvbmljKCBhcmMgKTsKLSAgICAgICAgYXJjICs9IDI7Ci0gICAgICAgIHRvcCsrOwotICAgICAgICBsZXZlbHNbdG9wXSA9IGxldmVsc1t0b3AgLSAxXSA9IGxldmVsIC0gMTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICBEcmF3OgotICAgICAgZ3JheV9yZW5kZXJfbGluZSggUkFTX1ZBUl8gYXJjWzBdLngsIGFyY1swXS55ICk7Ci0gICAgICB0b3AtLTsKLSAgICAgIGFyYyAtPSAyOwotCi0gICAgfSB3aGlsZSAoIHRvcCA+PSAwICk7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGdyYXlfc3BsaXRfY3ViaWMoIEZUX1ZlY3RvciogIGJhc2UgKQotICB7Ci0gICAgVFBvcyAgYSwgYiwgYywgZDsKLQotCi0gICAgYmFzZVs2XS54ID0gYmFzZVszXS54OwotICAgIGMgPSBiYXNlWzFdLng7Ci0gICAgZCA9IGJhc2VbMl0ueDsKLSAgICBiYXNlWzFdLnggPSBhID0gKCBiYXNlWzBdLnggKyBjICkgLyAyOwotICAgIGJhc2VbNV0ueCA9IGIgPSAoIGJhc2VbM10ueCArIGQgKSAvIDI7Ci0gICAgYyA9ICggYyArIGQgKSAvIDI7Ci0gICAgYmFzZVsyXS54ID0gYSA9ICggYSArIGMgKSAvIDI7Ci0gICAgYmFzZVs0XS54ID0gYiA9ICggYiArIGMgKSAvIDI7Ci0gICAgYmFzZVszXS54ID0gKCBhICsgYiApIC8gMjsKLQotICAgIGJhc2VbNl0ueSA9IGJhc2VbM10ueTsKLSAgICBjID0gYmFzZVsxXS55OwotICAgIGQgPSBiYXNlWzJdLnk7Ci0gICAgYmFzZVsxXS55ID0gYSA9ICggYmFzZVswXS55ICsgYyApIC8gMjsKLSAgICBiYXNlWzVdLnkgPSBiID0gKCBiYXNlWzNdLnkgKyBkICkgLyAyOwotICAgIGMgPSAoIGMgKyBkICkgLyAyOwotICAgIGJhc2VbMl0ueSA9IGEgPSAoIGEgKyBjICkgLyAyOwotICAgIGJhc2VbNF0ueSA9IGIgPSAoIGIgKyBjICkgLyAyOwotICAgIGJhc2VbM10ueSA9ICggYSArIGIgKSAvIDI7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGdyYXlfcmVuZGVyX2N1YmljKCBSQVNfQVJHXyBjb25zdCBGVF9WZWN0b3IqICBjb250cm9sMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIGNvbnRyb2wyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgdG8gKQotICB7Ci0gICAgRlRfVmVjdG9yKiAgYXJjOwotICAgIFRQb3MgICAgICAgIG1pbiwgbWF4LCB5OwotCi0KLSAgICBhcmMgICAgICA9IHJhcy5iZXpfc3RhY2s7Ci0gICAgYXJjWzBdLnggPSBVUFNDQUxFKCB0by0+eCApOwotICAgIGFyY1swXS55ID0gVVBTQ0FMRSggdG8tPnkgKTsKLSAgICBhcmNbMV0ueCA9IFVQU0NBTEUoIGNvbnRyb2wyLT54ICk7Ci0gICAgYXJjWzFdLnkgPSBVUFNDQUxFKCBjb250cm9sMi0+eSApOwotICAgIGFyY1syXS54ID0gVVBTQ0FMRSggY29udHJvbDEtPnggKTsKLSAgICBhcmNbMl0ueSA9IFVQU0NBTEUoIGNvbnRyb2wxLT55ICk7Ci0gICAgYXJjWzNdLnggPSByYXMueDsKLSAgICBhcmNbM10ueSA9IHJhcy55OwotCi0gICAgLyogU2hvcnQtY3V0IHRoZSBhcmMgdGhhdCBjcm9zc2VzIHRoZSBjdXJyZW50IGJhbmQuICovCi0gICAgbWluID0gbWF4ID0gYXJjWzBdLnk7Ci0KLSAgICB5ID0gYXJjWzFdLnk7Ci0gICAgaWYgKCB5IDwgbWluICkKLSAgICAgIG1pbiA9IHk7Ci0gICAgaWYgKCB5ID4gbWF4ICkKLSAgICAgIG1heCA9IHk7Ci0KLSAgICB5ID0gYXJjWzJdLnk7Ci0gICAgaWYgKCB5IDwgbWluICkKLSAgICAgIG1pbiA9IHk7Ci0gICAgaWYgKCB5ID4gbWF4ICkKLSAgICAgIG1heCA9IHk7Ci0KLSAgICB5ID0gYXJjWzNdLnk7Ci0gICAgaWYgKCB5IDwgbWluICkKLSAgICAgIG1pbiA9IHk7Ci0gICAgaWYgKCB5ID4gbWF4ICkKLSAgICAgIG1heCA9IHk7Ci0KLSAgICBpZiAoIFRSVU5DKCBtaW4gKSA+PSByYXMubWF4X2V5IHx8IFRSVU5DKCBtYXggKSA8IHJhcy5taW5fZXkgKQotICAgICAgZ290byBEcmF3OwotCi0gICAgZm9yICg7OykKLSAgICB7Ci0gICAgICAvKiBEZWNpZGUgd2hldGhlciB0byBzcGxpdCBvciBkcmF3LiBTZWUgYFJhcGlkIFRlcm1pbmF0aW9uICAgICAgICAgICovCi0gICAgICAvKiBFdmFsdWF0aW9uIGZvciBSZWN1cnNpdmUgU3ViZGl2aXNpb24gb2YgQmV6aWVyIEN1cnZlcycgYnkgVGhvbWFzICovCi0gICAgICAvKiBGLiBIYWluLCBhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBodHRwOi8vd3d3LmNpcy5zb3V0aGFsYWJhbWEuZWR1L35oYWluL2dlbmVyYWwvUHVibGljYXRpb25zL0Jlemllci9DYW1lcmEtcmVhZHklMjBDSVNTVDAyJTIwMi5wZGYgKi8KLQotICAgICAgewotICAgICAgICBUUG9zICBkeCwgZHksIGR4XywgZHlfOwotICAgICAgICBUUG9zICBkeDEsIGR5MSwgZHgyLCBkeTI7Ci0gICAgICAgIFRQb3MgIEwsIHMsIHNfbGltaXQ7Ci0KLQotICAgICAgICAvKiBkeCBhbmQgZHkgYXJlIHggYW5kIHkgY29tcG9uZW50cyBvZiB0aGUgUDAtUDMgY2hvcmQgdmVjdG9yLiAqLwotICAgICAgICBkeCA9IGR4XyA9IGFyY1szXS54IC0gYXJjWzBdLng7Ci0gICAgICAgIGR5ID0gZHlfID0gYXJjWzNdLnkgLSBhcmNbMF0ueTsKLQotICAgICAgICBMID0gRlRfSFlQT1QoIGR4XywgZHlfICk7Ci0KLSAgICAgICAgLyogQXZvaWQgcG9zc2libGUgYXJpdGhtZXRpYyBvdmVyZmxvdyBiZWxvdyBieSBzcGxpdHRpbmcuICovCi0gICAgICAgIGlmICggTCA+IDMyNzY3ICkKLSAgICAgICAgICBnb3RvIFNwbGl0OwotCi0gICAgICAgIC8qIE1heCBkZXZpYXRpb24gbWF5IGJlIGFzIG11Y2ggYXMgKHMvTCkgKiAzLzQgKGlmIEhhaW4ncyB2ID0gMSkuICovCi0gICAgICAgIHNfbGltaXQgPSBMICogKFRQb3MpKCBPTkVfUElYRUwgLyA2ICk7Ci0KLSAgICAgICAgLyogcyBpcyBMICogdGhlIHBlcnBlbmRpY3VsYXIgZGlzdGFuY2UgZnJvbSBQMSB0byB0aGUgbGluZSBQMC1QMy4gKi8KLSAgICAgICAgZHgxID0gYXJjWzFdLnggLSBhcmNbMF0ueDsKLSAgICAgICAgZHkxID0gYXJjWzFdLnkgLSBhcmNbMF0ueTsKLSAgICAgICAgcyA9IEZUX0FCUyggZHkgKiBkeDEgLSBkeCAqIGR5MSApOwotCi0gICAgICAgIGlmICggcyA+IHNfbGltaXQgKQotICAgICAgICAgIGdvdG8gU3BsaXQ7Ci0KLSAgICAgICAgLyogcyBpcyBMICogdGhlIHBlcnBlbmRpY3VsYXIgZGlzdGFuY2UgZnJvbSBQMiB0byB0aGUgbGluZSBQMC1QMy4gKi8KLSAgICAgICAgZHgyID0gYXJjWzJdLnggLSBhcmNbMF0ueDsKLSAgICAgICAgZHkyID0gYXJjWzJdLnkgLSBhcmNbMF0ueTsKLSAgICAgICAgcyA9IEZUX0FCUyggZHkgKiBkeDIgLSBkeCAqIGR5MiApOwotCi0gICAgICAgIGlmICggcyA+IHNfbGltaXQgKQotICAgICAgICAgIGdvdG8gU3BsaXQ7Ci0KLSAgICAgICAgLyogU3BsaXQgc3VwZXIgY3Vydnkgc2VnbWVudHMgd2hlcmUgdGhlIG9mZiBwb2ludHMgYXJlIHNvIGZhcgotICAgICAgICAgICBmcm9tIHRoZSBjaG9yZCB0aGF0IHRoZSBhbmdsZXMgUDAtUDEtUDMgb3IgUDAtUDItUDMgYmVjb21lCi0gICAgICAgICAgIGFjdXRlIGFzIGRldGVjdGVkIGJ5IGFwcHJvcHJpYXRlIGRvdCBwcm9kdWN0cy4gKi8KLSAgICAgICAgaWYgKCBkeDEgKiAoIGR4MSAtIGR4ICkgKyBkeTEgKiAoIGR5MSAtIGR5ICkgPiAwIHx8Ci0gICAgICAgICAgICAgZHgyICogKCBkeDIgLSBkeCApICsgZHkyICogKCBkeTIgLSBkeSApID4gMCApCi0gICAgICAgICAgZ290byBTcGxpdDsKLQotICAgICAgICAvKiBObyByZWFzb24gdG8gc3BsaXQuICovCi0gICAgICAgIGdvdG8gRHJhdzsKLSAgICAgIH0KLQotICAgIFNwbGl0OgotICAgICAgZ3JheV9zcGxpdF9jdWJpYyggYXJjICk7Ci0gICAgICBhcmMgKz0gMzsKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgRHJhdzoKLSAgICAgIGdyYXlfcmVuZGVyX2xpbmUoIFJBU19WQVJfIGFyY1swXS54LCBhcmNbMF0ueSApOwotCi0gICAgICBpZiAoIGFyYyA9PSByYXMuYmV6X3N0YWNrICkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBhcmMgLT0gMzsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyBpbnQKLSAgZ3JheV9tb3ZlX3RvKCBjb25zdCBGVF9WZWN0b3IqICB0bywKLSAgICAgICAgICAgICAgICBncmF5X1BXb3JrZXIgICAgICB3b3JrZXIgKQotICB7Ci0gICAgVFBvcyAgeCwgeTsKLQotCi0gICAgLyogcmVjb3JkIGN1cnJlbnQgY2VsbCwgaWYgYW55ICovCi0gICAgaWYgKCAhcmFzLmludmFsaWQgKQotICAgICAgZ3JheV9yZWNvcmRfY2VsbCggUkFTX1ZBUiApOwotCi0gICAgLyogc3RhcnQgdG8gYSBuZXcgcG9zaXRpb24gKi8KLSAgICB4ID0gVVBTQ0FMRSggdG8tPnggKTsKLSAgICB5ID0gVVBTQ0FMRSggdG8tPnkgKTsKLQotICAgIGdyYXlfc3RhcnRfY2VsbCggUkFTX1ZBUl8gVFJVTkMoIHggKSwgVFJVTkMoIHkgKSApOwotCi0gICAgd29ya2VyLT54ID0geDsKLSAgICB3b3JrZXItPnkgPSB5OwotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBzdGF0aWMgaW50Ci0gIGdyYXlfbGluZV90byggY29uc3QgRlRfVmVjdG9yKiAgdG8sCi0gICAgICAgICAgICAgICAgZ3JheV9QV29ya2VyICAgICAgd29ya2VyICkKLSAgewotICAgIGdyYXlfcmVuZGVyX2xpbmUoIFJBU19WQVJfIFVQU0NBTEUoIHRvLT54ICksIFVQU0NBTEUoIHRvLT55ICkgKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgc3RhdGljIGludAotICBncmF5X2NvbmljX3RvKCBjb25zdCBGVF9WZWN0b3IqICBjb250cm9sLAotICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICB0bywKLSAgICAgICAgICAgICAgICAgZ3JheV9QV29ya2VyICAgICAgd29ya2VyICkKLSAgewotICAgIGdyYXlfcmVuZGVyX2NvbmljKCBSQVNfVkFSXyBjb250cm9sLCB0byApOwotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBzdGF0aWMgaW50Ci0gIGdyYXlfY3ViaWNfdG8oIGNvbnN0IEZUX1ZlY3RvciogIGNvbnRyb2wxLAotICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBjb250cm9sMiwKLSAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgdG8sCi0gICAgICAgICAgICAgICAgIGdyYXlfUFdvcmtlciAgICAgIHdvcmtlciApCi0gIHsKLSAgICBncmF5X3JlbmRlcl9jdWJpYyggUkFTX1ZBUl8gY29udHJvbDEsIGNvbnRyb2wyLCB0byApOwotICAgIHJldHVybiAwOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBncmF5X3JlbmRlcl9zcGFuKCBpbnQgICAgICAgICAgICAgeSwKLSAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIGNvdW50LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TcGFuKiAgc3BhbnMsCi0gICAgICAgICAgICAgICAgICAgIGdyYXlfUFdvcmtlciAgICB3b3JrZXIgKQotICB7Ci0gICAgdW5zaWduZWQgY2hhciogIHA7Ci0gICAgRlRfQml0bWFwKiAgICAgIG1hcCA9ICZ3b3JrZXItPnRhcmdldDsKLQotCi0gICAgLyogZmlyc3Qgb2YgYWxsLCBjb21wdXRlIHRoZSBzY2FubGluZSBvZmZzZXQgKi8KLSAgICBwID0gKHVuc2lnbmVkIGNoYXIqKW1hcC0+YnVmZmVyIC0geSAqIG1hcC0+cGl0Y2g7Ci0gICAgaWYgKCBtYXAtPnBpdGNoID49IDAgKQotICAgICAgcCArPSAoIG1hcC0+cm93cyAtIDEgKSAqICh1bnNpZ25lZCBpbnQpbWFwLT5waXRjaDsKLQotICAgIGZvciAoIDsgY291bnQgPiAwOyBjb3VudC0tLCBzcGFucysrICkKLSAgICB7Ci0gICAgICB1bnNpZ25lZCBjaGFyICBjb3ZlcmFnZSA9IHNwYW5zLT5jb3ZlcmFnZTsKLQotCi0gICAgICBpZiAoIGNvdmVyYWdlICkKLSAgICAgIHsKLSAgICAgICAgLyogRm9yIHNtYWxsLXNwYW5zIGl0IGlzIGZhc3RlciB0byBkbyBpdCBieSBvdXJzZWx2ZXMgdGhhbgotICAgICAgICAgKiBjYWxsaW5nIGBtZW1zZXQnLiAgVGhpcyBpcyBtYWlubHkgZHVlIHRvIHRoZSBjb3N0IG9mIHRoZQotICAgICAgICAgKiBmdW5jdGlvbiBjYWxsLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBzcGFucy0+bGVuID49IDggKQotICAgICAgICAgIEZUX01FTV9TRVQoIHAgKyBzcGFucy0+eCwgKHVuc2lnbmVkIGNoYXIpY292ZXJhZ2UsIHNwYW5zLT5sZW4gKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdW5zaWduZWQgY2hhciogIHEgPSBwICsgc3BhbnMtPng7Ci0KLQotICAgICAgICAgIHN3aXRjaCAoIHNwYW5zLT5sZW4gKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDc6ICpxKysgPSAodW5zaWduZWQgY2hhciljb3ZlcmFnZTsKLSAgICAgICAgICBjYXNlIDY6ICpxKysgPSAodW5zaWduZWQgY2hhciljb3ZlcmFnZTsKLSAgICAgICAgICBjYXNlIDU6ICpxKysgPSAodW5zaWduZWQgY2hhciljb3ZlcmFnZTsKLSAgICAgICAgICBjYXNlIDQ6ICpxKysgPSAodW5zaWduZWQgY2hhciljb3ZlcmFnZTsKLSAgICAgICAgICBjYXNlIDM6ICpxKysgPSAodW5zaWduZWQgY2hhciljb3ZlcmFnZTsKLSAgICAgICAgICBjYXNlIDI6ICpxKysgPSAodW5zaWduZWQgY2hhciljb3ZlcmFnZTsKLSAgICAgICAgICBjYXNlIDE6ICpxICAgPSAodW5zaWduZWQgY2hhciljb3ZlcmFnZTsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3JheV9obGluZSggUkFTX0FSR18gVENvb3JkICB4LAotICAgICAgICAgICAgICAgICAgICAgICBUQ29vcmQgIHksCi0gICAgICAgICAgICAgICAgICAgICAgIFRQb3MgICAgYXJlYSwKLSAgICAgICAgICAgICAgICAgICAgICAgVENvb3JkICBhY291bnQgKQotICB7Ci0gICAgaW50ICBjb3ZlcmFnZTsKLQotCi0gICAgLyogY29tcHV0ZSB0aGUgY292ZXJhZ2UgbGluZSdzIGNvdmVyYWdlLCBkZXBlbmRpbmcgb24gdGhlICAgICovCi0gICAgLyogb3V0bGluZSBmaWxsIHJ1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogdGhlIGNvdmVyYWdlIHBlcmNlbnRhZ2UgaXMgYXJlYS8oUElYRUxfQklUUypQSVhFTF9CSVRTKjIpICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgY292ZXJhZ2UgPSAoaW50KSggYXJlYSA+PiAoIFBJWEVMX0JJVFMgKiAyICsgMSAtIDggKSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSByYW5nZSAwLi4yNTYgKi8KLSAgICBpZiAoIGNvdmVyYWdlIDwgMCApCi0gICAgICBjb3ZlcmFnZSA9IC1jb3ZlcmFnZTsKLQotICAgIGlmICggcmFzLm91dGxpbmUuZmxhZ3MgJiBGVF9PVVRMSU5FX0VWRU5fT0REX0ZJTEwgKQotICAgIHsKLSAgICAgIGNvdmVyYWdlICY9IDUxMTsKLQotICAgICAgaWYgKCBjb3ZlcmFnZSA+IDI1NiApCi0gICAgICAgIGNvdmVyYWdlID0gNTEyIC0gY292ZXJhZ2U7Ci0gICAgICBlbHNlIGlmICggY292ZXJhZ2UgPT0gMjU2ICkKLSAgICAgICAgY292ZXJhZ2UgPSAyNTU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBub3JtYWwgbm9uLXplcm8gd2luZGluZyBydWxlICovCi0gICAgICBpZiAoIGNvdmVyYWdlID49IDI1NiApCi0gICAgICAgIGNvdmVyYWdlID0gMjU1OwotICAgIH0KLQotICAgIHkgKz0gKFRDb29yZClyYXMubWluX2V5OwotICAgIHggKz0gKFRDb29yZClyYXMubWluX2V4OwotCi0gICAgLyogRlRfU3Bhbi54IGlzIGEgMTYtYml0IHNob3J0LCBzbyBsaW1pdCBvdXIgY29vcmRpbmF0ZXMgYXBwcm9wcmlhdGVseSAqLwotICAgIGlmICggeCA+PSAzMjc2NyApCi0gICAgICB4ID0gMzI3Njc7Ci0KLSAgICAvKiBGVF9TcGFuLnkgaXMgYW4gaW50ZWdlciwgc28gbGltaXQgb3VyIGNvb3JkaW5hdGVzIGFwcHJvcHJpYXRlbHkgKi8KLSAgICBpZiAoIHkgPj0gRlRfSU5UX01BWCApCi0gICAgICB5ID0gRlRfSU5UX01BWDsKLQotICAgIGlmICggY292ZXJhZ2UgKQotICAgIHsKLSAgICAgIEZUX1NwYW4qICBzcGFuOwotICAgICAgaW50ICAgICAgIGNvdW50OwotCi0KLSAgICAgIC8qIHNlZSB3aGV0aGVyIHdlIGNhbiBhZGQgdGhpcyBzcGFuIHRvIHRoZSBjdXJyZW50IGxpc3QgKi8KLSAgICAgIGNvdW50ID0gcmFzLm51bV9ncmF5X3NwYW5zOwotICAgICAgc3BhbiAgPSByYXMuZ3JheV9zcGFucyArIGNvdW50IC0gMTsKLSAgICAgIGlmICggY291bnQgPiAwICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICByYXMuc3Bhbl95ID09IHkgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgIChpbnQpc3Bhbi0+eCArIHNwYW4tPmxlbiA9PSAoaW50KXggJiYKLSAgICAgICAgICAgc3Bhbi0+Y292ZXJhZ2UgPT0gY292ZXJhZ2UgICAgICAgICApCi0gICAgICB7Ci0gICAgICAgIHNwYW4tPmxlbiA9ICh1bnNpZ25lZCBzaG9ydCkoIHNwYW4tPmxlbiArIGFjb3VudCApOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGlmICggcmFzLnNwYW5feSAhPSB5IHx8IGNvdW50ID49IEZUX01BWF9HUkFZX1NQQU5TICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCByYXMucmVuZGVyX3NwYW4gJiYgY291bnQgPiAwICkKLSAgICAgICAgICByYXMucmVuZGVyX3NwYW4oIHJhcy5zcGFuX3ksIGNvdW50LCByYXMuZ3JheV9zcGFucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhcy5yZW5kZXJfc3Bhbl9kYXRhICk7Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotCi0gICAgICAgIGlmICggY291bnQgPiAwICkKLSAgICAgICAgewotICAgICAgICAgIGludCAgbjsKLQotCi0gICAgICAgICAgRlRfVFJBQ0U3KCggInkgPSAlM2QgIiwgcmFzLnNwYW5feSApKTsKLSAgICAgICAgICBzcGFuID0gcmFzLmdyYXlfc3BhbnM7Ci0gICAgICAgICAgZm9yICggbiA9IDA7IG4gPCBjb3VudDsgbisrLCBzcGFuKysgKQotICAgICAgICAgICAgRlRfVFJBQ0U3KCggIlslZC4uJWRdOiUwMnggIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4tPngsIHNwYW4tPnggKyBzcGFuLT5sZW4gLSAxLCBzcGFuLT5jb3ZlcmFnZSApKTsKLSAgICAgICAgICBGVF9UUkFDRTcoKCAiXG4iICkpOwotICAgICAgICB9Ci0KLSNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0gICAgICAgIHJhcy5udW1fZ3JheV9zcGFucyA9IDA7Ci0gICAgICAgIHJhcy5zcGFuX3kgICAgICAgICA9IChpbnQpeTsKLQotICAgICAgICBzcGFuICA9IHJhcy5ncmF5X3NwYW5zOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBzcGFuKys7Ci0KLSAgICAgIC8qIGFkZCBhIGdyYXkgc3BhbiB0byB0aGUgY3VycmVudCBsaXN0ICovCi0gICAgICBzcGFuLT54ICAgICAgICA9IChzaG9ydCl4OwotICAgICAgc3Bhbi0+bGVuICAgICAgPSAodW5zaWduZWQgc2hvcnQpYWNvdW50OwotICAgICAgc3Bhbi0+Y292ZXJhZ2UgPSAodW5zaWduZWQgY2hhciljb3ZlcmFnZTsKLQotICAgICAgcmFzLm51bV9ncmF5X3NwYW5zKys7Ci0gICAgfQotICB9Ci0KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0KLSAgLyogdG8gYmUgY2FsbGVkIHdoaWxlIGluIHRoZSBkZWJ1Z2dlciAtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogdGhpcyBmdW5jdGlvbiBjYXVzZXMgYSBjb21waWxlciB3YXJuaW5nIHNpbmNlIGl0IGlzIHVudXNlZCBvdGhlcndpc2UgKi8KLSAgc3RhdGljIHZvaWQKLSAgZ3JheV9kdW1wX2NlbGxzKCBSQVNfQVJHICkKLSAgewotICAgIGludCAgeWluZGV4OwotCi0KLSAgICBmb3IgKCB5aW5kZXggPSAwOyB5aW5kZXggPCByYXMueWNvdW50OyB5aW5kZXgrKyApCi0gICAgewotICAgICAgUENlbGwgIGNlbGw7Ci0KLQotICAgICAgcHJpbnRmKCAiJTNkOiIsIHlpbmRleCApOwotCi0gICAgICBmb3IgKCBjZWxsID0gcmFzLnljZWxsc1t5aW5kZXhdOyBjZWxsICE9IE5VTEw7IGNlbGwgPSBjZWxsLT5uZXh0ICkKLSAgICAgICAgcHJpbnRmKCAiICglM2xkLCBjOiU0bGQsIGE6JTZkKSIsIGNlbGwtPngsIGNlbGwtPmNvdmVyLCBjZWxsLT5hcmVhICk7Ci0gICAgICBwcmludGYoICJcbiIgKTsKLSAgICB9Ci0gIH0KLQotI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLQotICBzdGF0aWMgdm9pZAotICBncmF5X3N3ZWVwKCBSQVNfQVJHXyBjb25zdCBGVF9CaXRtYXAqICB0YXJnZXQgKQotICB7Ci0gICAgaW50ICB5aW5kZXg7Ci0KLSAgICBGVF9VTlVTRUQoIHRhcmdldCApOwotCi0KLSAgICBpZiAoIHJhcy5udW1fY2VsbHMgPT0gMCApCi0gICAgICByZXR1cm47Ci0KLSAgICByYXMubnVtX2dyYXlfc3BhbnMgPSAwOwotCi0gICAgRlRfVFJBQ0U3KCggImdyYXlfc3dlZXA6IHN0YXJ0XG4iICkpOwotCi0gICAgZm9yICggeWluZGV4ID0gMDsgeWluZGV4IDwgcmFzLnljb3VudDsgeWluZGV4KysgKQotICAgIHsKLSAgICAgIFBDZWxsICAgY2VsbCAgPSByYXMueWNlbGxzW3lpbmRleF07Ci0gICAgICBUQ29vcmQgIGNvdmVyID0gMDsKLSAgICAgIFRDb29yZCAgeCAgICAgPSAwOwotCi0KLSAgICAgIGZvciAoIDsgY2VsbCAhPSBOVUxMOyBjZWxsID0gY2VsbC0+bmV4dCApCi0gICAgICB7Ci0gICAgICAgIFRQb3MgIGFyZWE7Ci0KLQotICAgICAgICBpZiAoIGNlbGwtPnggPiB4ICYmIGNvdmVyICE9IDAgKQotICAgICAgICAgIGdyYXlfaGxpbmUoIFJBU19WQVJfIHgsIHlpbmRleCwgY292ZXIgKiAoIE9ORV9QSVhFTCAqIDIgKSwKLSAgICAgICAgICAgICAgICAgICAgICBjZWxsLT54IC0geCApOwotCi0gICAgICAgIGNvdmVyICs9IGNlbGwtPmNvdmVyOwotICAgICAgICBhcmVhICAgPSBjb3ZlciAqICggT05FX1BJWEVMICogMiApIC0gY2VsbC0+YXJlYTsKLQotICAgICAgICBpZiAoIGFyZWEgIT0gMCAmJiBjZWxsLT54ID49IDAgKQotICAgICAgICAgIGdyYXlfaGxpbmUoIFJBU19WQVJfIGNlbGwtPngsIHlpbmRleCwgYXJlYSwgMSApOwotCi0gICAgICAgIHggPSBjZWxsLT54ICsgMTsKLSAgICAgIH0KLQotICAgICAgaWYgKCBjb3ZlciAhPSAwICkKLSAgICAgICAgZ3JheV9obGluZSggUkFTX1ZBUl8geCwgeWluZGV4LCBjb3ZlciAqICggT05FX1BJWEVMICogMiApLAotICAgICAgICAgICAgICAgICAgICByYXMuY291bnRfZXggLSB4ICk7Ci0gICAgfQotCi0gICAgaWYgKCByYXMucmVuZGVyX3NwYW4gJiYgcmFzLm51bV9ncmF5X3NwYW5zID4gMCApCi0gICAgICByYXMucmVuZGVyX3NwYW4oIHJhcy5zcGFuX3ksIHJhcy5udW1fZ3JheV9zcGFucywKLSAgICAgICAgICAgICAgICAgICAgICAgcmFzLmdyYXlfc3BhbnMsIHJhcy5yZW5kZXJfc3Bhbl9kYXRhICk7Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotCi0gICAgaWYgKCByYXMubnVtX2dyYXlfc3BhbnMgPiAwICkKLSAgICB7Ci0gICAgICBGVF9TcGFuKiAgc3BhbjsKLSAgICAgIGludCAgICAgICBuOwotCi0KLSAgICAgIEZUX1RSQUNFNygoICJ5ID0gJTNkICIsIHJhcy5zcGFuX3kgKSk7Ci0gICAgICBzcGFuID0gcmFzLmdyYXlfc3BhbnM7Ci0gICAgICBmb3IgKCBuID0gMDsgbiA8IHJhcy5udW1fZ3JheV9zcGFuczsgbisrLCBzcGFuKysgKQotICAgICAgICBGVF9UUkFDRTcoKCAiWyVkLi4lZF06JTAyeCAiLAotICAgICAgICAgICAgICAgICAgICBzcGFuLT54LCBzcGFuLT54ICsgc3Bhbi0+bGVuIC0gMSwgc3Bhbi0+Y292ZXJhZ2UgKSk7Ci0gICAgICBGVF9UUkFDRTcoKCAiXG4iICkpOwotICAgIH0KLQotICAgIEZUX1RSQUNFNygoICJncmF5X3N3ZWVwOiBlbmRcbiIgKSk7Ci0KLSNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9UUkFDRSAqLwotCi0gIH0KLQotCi0jaWZkZWYgX1NUQU5EQUxPTkVfCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBzaG91bGQgb25seSBjb21waWxlIGluIHN0YW5kLWFsb25lIG1vZGUsICAgICAgKi8KLSAgLyogIGkuZS4sIHdoZW4gYnVpbGRpbmcgdGhpcyBjb21wb25lbnQgd2l0aG91dCB0aGUgcmVzdCBvZiBGcmVlVHlwZS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGVF9PdXRsaW5lX0RlY29tcG9zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBXYWxrIG92ZXIgYW4gb3V0bGluZSdzIHN0cnVjdHVyZSB0byBkZWNvbXBvc2UgaXQgaW50byBpbmRpdmlkdWFsICAgKi8KLSAgLyogICAgc2VnbWVudHMgYW5kIELDqXppZXIgYXJjcy4gIFRoaXMgZnVuY3Rpb24gaXMgYWxzbyBhYmxlIHRvIGVtaXQgICAgICAqLwotICAvKiAgICBgbW92ZSB0bycgYW5kIGBjbG9zZSB0bycgb3BlcmF0aW9ucyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgYW5kIGVuZCAgKi8KLSAgLyogICAgb2YgbmV3IGNvbnRvdXJzIGluIHRoZSBvdXRsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgb3V0bGluZSAgICAgICAgOjogQSBwb2ludGVyIHRvIHRoZSBzb3VyY2UgdGFyZ2V0LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdW5jX2ludGVyZmFjZSA6OiBBIHRhYmxlIG9mIGBlbWl0dGVycycsIGkuZS4sIGZ1bmN0aW9uIHBvaW50ZXJzICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIGR1cmluZyBkZWNvbXBvc2l0aW9uIHRvIGluZGljYXRlIHBhdGggICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHVzZXIgICAgICAgICAgIDo6IEEgdHlwZWxlc3MgcG9pbnRlciB3aGljaCBpcyBwYXNzZWQgdG8gZWFjaCAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICBlbWl0dGVyIGR1cmluZyB0aGUgZGVjb21wb3NpdGlvbi4gIEl0IGNhbiBiZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgdXNlZCB0byBzdG9yZSB0aGUgc3RhdGUgZHVyaW5nIHRoZSAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIGRlY29tcG9zaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIGludAotICBGVF9PdXRsaW5lX0RlY29tcG9zZSggY29uc3QgRlRfT3V0bGluZSogICAgICAgIG91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9PdXRsaW5lX0Z1bmNzKiAgZnVuY19pbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgdXNlciApCi0gIHsKLSN1bmRlZiBTQ0FMRUQKLSNkZWZpbmUgU0NBTEVEKCB4ICkgICggKCAoeCkgPDwgc2hpZnQgKSAtIGRlbHRhICkKLQotICAgIEZUX1ZlY3RvciAgIHZfbGFzdDsKLSAgICBGVF9WZWN0b3IgICB2X2NvbnRyb2w7Ci0gICAgRlRfVmVjdG9yICAgdl9zdGFydDsKLQotICAgIEZUX1ZlY3RvciogIHBvaW50OwotICAgIEZUX1ZlY3RvciogIGxpbWl0OwotICAgIGNoYXIqICAgICAgIHRhZ3M7Ci0KLSAgICBpbnQgICAgICAgICBlcnJvcjsKLQotICAgIGludCAgIG47ICAgICAgICAgLyogaW5kZXggb2YgY29udG91ciBpbiBvdXRsaW5lICAgICAqLwotICAgIGludCAgIGZpcnN0OyAgICAgLyogaW5kZXggb2YgZmlyc3QgcG9pbnQgaW4gY29udG91ciAqLwotICAgIGNoYXIgIHRhZzsgICAgICAgLyogY3VycmVudCBwb2ludCdzIHN0YXRlICAgICAgICAgICAqLwotCi0gICAgaW50ICAgc2hpZnQ7Ci0gICAgVFBvcyAgZGVsdGE7Ci0KLQotICAgIGlmICggIW91dGxpbmUgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX091dGxpbmUgKTsKLQotICAgIGlmICggIWZ1bmNfaW50ZXJmYWNlICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgc2hpZnQgPSBmdW5jX2ludGVyZmFjZS0+c2hpZnQ7Ci0gICAgZGVsdGEgPSBmdW5jX2ludGVyZmFjZS0+ZGVsdGE7Ci0gICAgZmlyc3QgPSAwOwotCi0gICAgZm9yICggbiA9IDA7IG4gPCBvdXRsaW5lLT5uX2NvbnRvdXJzOyBuKysgKQotICAgIHsKLSAgICAgIGludCAgbGFzdDsgIC8qIGluZGV4IG9mIGxhc3QgcG9pbnQgaW4gY29udG91ciAqLwotCi0KLSAgICAgIEZUX1RSQUNFNSgoICJGVF9PdXRsaW5lX0RlY29tcG9zZTogT3V0bGluZSAlZFxuIiwgbiApKTsKLQotICAgICAgbGFzdCAgPSBvdXRsaW5lLT5jb250b3Vyc1tuXTsKLSAgICAgIGlmICggbGFzdCA8IDAgKQotICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLSAgICAgIGxpbWl0ID0gb3V0bGluZS0+cG9pbnRzICsgbGFzdDsKLQotICAgICAgdl9zdGFydCAgID0gb3V0bGluZS0+cG9pbnRzW2ZpcnN0XTsKLSAgICAgIHZfc3RhcnQueCA9IFNDQUxFRCggdl9zdGFydC54ICk7Ci0gICAgICB2X3N0YXJ0LnkgPSBTQ0FMRUQoIHZfc3RhcnQueSApOwotCi0gICAgICB2X2xhc3QgICA9IG91dGxpbmUtPnBvaW50c1tsYXN0XTsKLSAgICAgIHZfbGFzdC54ID0gU0NBTEVEKCB2X2xhc3QueCApOwotICAgICAgdl9sYXN0LnkgPSBTQ0FMRUQoIHZfbGFzdC55ICk7Ci0KLSAgICAgIHZfY29udHJvbCA9IHZfc3RhcnQ7Ci0KLSAgICAgIHBvaW50ID0gb3V0bGluZS0+cG9pbnRzICsgZmlyc3Q7Ci0gICAgICB0YWdzICA9IG91dGxpbmUtPnRhZ3MgICArIGZpcnN0OwotICAgICAgdGFnICAgPSBGVF9DVVJWRV9UQUcoIHRhZ3NbMF0gKTsKLQotICAgICAgLyogQSBjb250b3VyIGNhbm5vdCBzdGFydCB3aXRoIGEgY3ViaWMgY29udHJvbCBwb2ludCEgKi8KLSAgICAgIGlmICggdGFnID09IEZUX0NVUlZFX1RBR19DVUJJQyApCi0gICAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotCi0gICAgICAvKiBjaGVjayBmaXJzdCBwb2ludCB0byBkZXRlcm1pbmUgb3JpZ2luICovCi0gICAgICBpZiAoIHRhZyA9PSBGVF9DVVJWRV9UQUdfQ09OSUMgKQotICAgICAgewotICAgICAgICAvKiBmaXJzdCBwb2ludCBpcyBjb25pYyBjb250cm9sLiAgWWVzLCB0aGlzIGhhcHBlbnMuICovCi0gICAgICAgIGlmICggRlRfQ1VSVkVfVEFHKCBvdXRsaW5lLT50YWdzW2xhc3RdICkgPT0gRlRfQ1VSVkVfVEFHX09OICkKLSAgICAgICAgewotICAgICAgICAgIC8qIHN0YXJ0IGF0IGxhc3QgcG9pbnQgaWYgaXQgaXMgb24gdGhlIGN1cnZlICovCi0gICAgICAgICAgdl9zdGFydCA9IHZfbGFzdDsKLSAgICAgICAgICBsaW1pdC0tOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIC8qIGlmIGJvdGggZmlyc3QgYW5kIGxhc3QgcG9pbnRzIGFyZSBjb25pYywgICAgICAgICAqLwotICAgICAgICAgIC8qIHN0YXJ0IGF0IHRoZWlyIG1pZGRsZSBhbmQgcmVjb3JkIGl0cyBwb3NpdGlvbiAgICAqLwotICAgICAgICAgIC8qIGZvciBjbG9zdXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIHZfc3RhcnQueCA9ICggdl9zdGFydC54ICsgdl9sYXN0LnggKSAvIDI7Ci0gICAgICAgICAgdl9zdGFydC55ID0gKCB2X3N0YXJ0LnkgKyB2X2xhc3QueSApIC8gMjsKLQotICAgICAgICAgIHZfbGFzdCA9IHZfc3RhcnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcG9pbnQtLTsKLSAgICAgICAgdGFncy0tOwotICAgICAgfQotCi0gICAgICBGVF9UUkFDRTUoKCAiICBtb3ZlIHRvICglLjJmLCAlLjJmKVxuIiwKLSAgICAgICAgICAgICAgICAgIHZfc3RhcnQueCAvIDY0LjAsIHZfc3RhcnQueSAvIDY0LjAgKSk7Ci0gICAgICBlcnJvciA9IGZ1bmNfaW50ZXJmYWNlLT5tb3ZlX3RvKCAmdl9zdGFydCwgdXNlciApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgd2hpbGUgKCBwb2ludCA8IGxpbWl0ICkKLSAgICAgIHsKLSAgICAgICAgcG9pbnQrKzsKLSAgICAgICAgdGFncysrOwotCi0gICAgICAgIHRhZyA9IEZUX0NVUlZFX1RBRyggdGFnc1swXSApOwotICAgICAgICBzd2l0Y2ggKCB0YWcgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgRlRfQ1VSVkVfVEFHX09OOiAgLyogZW1pdCBhIHNpbmdsZSBsaW5lX3RvICovCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVmVjdG9yICB2ZWM7Ci0KLQotICAgICAgICAgICAgdmVjLnggPSBTQ0FMRUQoIHBvaW50LT54ICk7Ci0gICAgICAgICAgICB2ZWMueSA9IFNDQUxFRCggcG9pbnQtPnkgKTsKLQotICAgICAgICAgICAgRlRfVFJBQ0U1KCggIiAgbGluZSB0byAoJS4yZiwgJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICB2ZWMueCAvIDY0LjAsIHZlYy55IC8gNjQuMCApKTsKLSAgICAgICAgICAgIGVycm9yID0gZnVuY19pbnRlcmZhY2UtPmxpbmVfdG8oICZ2ZWMsIHVzZXIgKTsKLSAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGVF9DVVJWRV9UQUdfQ09OSUM6ICAvKiBjb25zdW1lIGNvbmljIGFyY3MgKi8KLSAgICAgICAgICB2X2NvbnRyb2wueCA9IFNDQUxFRCggcG9pbnQtPnggKTsKLSAgICAgICAgICB2X2NvbnRyb2wueSA9IFNDQUxFRCggcG9pbnQtPnkgKTsKLQotICAgICAgICBEb19Db25pYzoKLSAgICAgICAgICBpZiAoIHBvaW50IDwgbGltaXQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1ZlY3RvciAgdmVjOwotICAgICAgICAgICAgRlRfVmVjdG9yICB2X21pZGRsZTsKLQotCi0gICAgICAgICAgICBwb2ludCsrOwotICAgICAgICAgICAgdGFncysrOwotICAgICAgICAgICAgdGFnID0gRlRfQ1VSVkVfVEFHKCB0YWdzWzBdICk7Ci0KLSAgICAgICAgICAgIHZlYy54ID0gU0NBTEVEKCBwb2ludC0+eCApOwotICAgICAgICAgICAgdmVjLnkgPSBTQ0FMRUQoIHBvaW50LT55ICk7Ci0KLSAgICAgICAgICAgIGlmICggdGFnID09IEZUX0NVUlZFX1RBR19PTiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX1RSQUNFNSgoICIgIGNvbmljIHRvICglLjJmLCAlLjJmKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRoIGNvbnRyb2wgKCUuMmYsICUuMmYpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMueCAvIDY0LjAsIHZlYy55IC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdl9jb250cm9sLnggLyA2NC4wLCB2X2NvbnRyb2wueSAvIDY0LjAgKSk7Ci0gICAgICAgICAgICAgIGVycm9yID0gZnVuY19pbnRlcmZhY2UtPmNvbmljX3RvKCAmdl9jb250cm9sLCAmdmVjLCB1c2VyICk7Ci0gICAgICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggdGFnICE9IEZUX0NVUlZFX1RBR19DT05JQyApCi0gICAgICAgICAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotCi0gICAgICAgICAgICB2X21pZGRsZS54ID0gKCB2X2NvbnRyb2wueCArIHZlYy54ICkgLyAyOwotICAgICAgICAgICAgdl9taWRkbGUueSA9ICggdl9jb250cm9sLnkgKyB2ZWMueSApIC8gMjsKLQotICAgICAgICAgICAgRlRfVFJBQ0U1KCggIiAgY29uaWMgdG8gKCUuMmYsICUuMmYpIgotICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRoIGNvbnRyb2wgKCUuMmYsICUuMmYpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgdl9taWRkbGUueCAvIDY0LjAsIHZfbWlkZGxlLnkgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgdl9jb250cm9sLnggLyA2NC4wLCB2X2NvbnRyb2wueSAvIDY0LjAgKSk7Ci0gICAgICAgICAgICBlcnJvciA9IGZ1bmNfaW50ZXJmYWNlLT5jb25pY190byggJnZfY29udHJvbCwgJnZfbWlkZGxlLCB1c2VyICk7Ci0gICAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgICB2X2NvbnRyb2wgPSB2ZWM7Ci0gICAgICAgICAgICBnb3RvIERvX0NvbmljOwotICAgICAgICAgIH0KLQotICAgICAgICAgIEZUX1RSQUNFNSgoICIgIGNvbmljIHRvICglLjJmLCAlLjJmKSIKLSAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggY29udHJvbCAoJS4yZiwgJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgdl9zdGFydC54IC8gNjQuMCwgdl9zdGFydC55IC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgICB2X2NvbnRyb2wueCAvIDY0LjAsIHZfY29udHJvbC55IC8gNjQuMCApKTsKLSAgICAgICAgICBlcnJvciA9IGZ1bmNfaW50ZXJmYWNlLT5jb25pY190byggJnZfY29udHJvbCwgJnZfc3RhcnQsIHVzZXIgKTsKLSAgICAgICAgICBnb3RvIENsb3NlOwotCi0gICAgICAgIGRlZmF1bHQ6ICAvKiBGVF9DVVJWRV9UQUdfQ1VCSUMgKi8KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9WZWN0b3IgIHZlYzEsIHZlYzI7Ci0KLQotICAgICAgICAgICAgaWYgKCBwb2ludCArIDEgPiBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgRlRfQ1VSVkVfVEFHKCB0YWdzWzFdICkgIT0gRlRfQ1VSVkVfVEFHX0NVQklDICkKLSAgICAgICAgICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAgICAgICAgIHBvaW50ICs9IDI7Ci0gICAgICAgICAgICB0YWdzICArPSAyOwotCi0gICAgICAgICAgICB2ZWMxLnggPSBTQ0FMRUQoIHBvaW50Wy0yXS54ICk7Ci0gICAgICAgICAgICB2ZWMxLnkgPSBTQ0FMRUQoIHBvaW50Wy0yXS55ICk7Ci0KLSAgICAgICAgICAgIHZlYzIueCA9IFNDQUxFRCggcG9pbnRbLTFdLnggKTsKLSAgICAgICAgICAgIHZlYzIueSA9IFNDQUxFRCggcG9pbnRbLTFdLnkgKTsKLQotICAgICAgICAgICAgaWYgKCBwb2ludCA8PSBsaW1pdCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX1ZlY3RvciAgdmVjOwotCi0KLSAgICAgICAgICAgICAgdmVjLnggPSBTQ0FMRUQoIHBvaW50LT54ICk7Ci0gICAgICAgICAgICAgIHZlYy55ID0gU0NBTEVEKCBwb2ludC0+eSApOwotCi0gICAgICAgICAgICAgIEZUX1RSQUNFNSgoICIgIGN1YmljIHRvICglLjJmLCAlLjJmKSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aXRoIGNvbnRyb2xzICglLjJmLCAlLjJmKSBhbmQgKCUuMmYsICUuMmYpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMueCAvIDY0LjAsIHZlYy55IC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMS54IC8gNjQuMCwgdmVjMS55IC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMi54IC8gNjQuMCwgdmVjMi55IC8gNjQuMCApKTsKLSAgICAgICAgICAgICAgZXJyb3IgPSBmdW5jX2ludGVyZmFjZS0+Y3ViaWNfdG8oICZ2ZWMxLCAmdmVjMiwgJnZlYywgdXNlciApOwotICAgICAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGVF9UUkFDRTUoKCAiICBjdWJpYyB0byAoJS4yZiwgJS4yZikiCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHdpdGggY29udHJvbHMgKCUuMmYsICUuMmYpIGFuZCAoJS4yZiwgJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICB2X3N0YXJ0LnggLyA2NC4wLCB2X3N0YXJ0LnkgLyA2NC4wLAotICAgICAgICAgICAgICAgICAgICAgICAgdmVjMS54IC8gNjQuMCwgdmVjMS55IC8gNjQuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIueCAvIDY0LjAsIHZlYzIueSAvIDY0LjAgKSk7Ci0gICAgICAgICAgICBlcnJvciA9IGZ1bmNfaW50ZXJmYWNlLT5jdWJpY190byggJnZlYzEsICZ2ZWMyLCAmdl9zdGFydCwgdXNlciApOwotICAgICAgICAgICAgZ290byBDbG9zZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyogY2xvc2UgdGhlIGNvbnRvdXIgd2l0aCBhIGxpbmUgc2VnbWVudCAqLwotICAgICAgRlRfVFJBQ0U1KCggIiAgbGluZSB0byAoJS4yZiwgJS4yZilcbiIsCi0gICAgICAgICAgICAgICAgICB2X3N0YXJ0LnggLyA2NC4wLCB2X3N0YXJ0LnkgLyA2NC4wICkpOwotICAgICAgZXJyb3IgPSBmdW5jX2ludGVyZmFjZS0+bGluZV90byggJnZfc3RhcnQsIHVzZXIgKTsKLQotICAgQ2xvc2U6Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBmaXJzdCA9IGxhc3QgKyAxOwotICAgIH0KLQotICAgIEZUX1RSQUNFNSgoICJGVF9PdXRsaW5lX0RlY29tcG9zZTogRG9uZVxuIiwgbiApKTsKLSAgICByZXR1cm4gMDsKLQotICBFeGl0OgotICAgIEZUX1RSQUNFNSgoICJGVF9PdXRsaW5lX0RlY29tcG9zZTogRXJyb3IgJWRcbiIsIGVycm9yICkpOwotICAgIHJldHVybiBlcnJvcjsKLQotICBJbnZhbGlkX091dGxpbmU6Ci0gICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX091dGxpbmUgKTsKLSAgfQotCi0jZW5kaWYgLyogX1NUQU5EQUxPTkVfICovCi0KLQotICB0eXBlZGVmIHN0cnVjdCAgZ3JheV9UQmFuZF8KLSAgewotICAgIFRQb3MgIG1pbiwgbWF4OwotCi0gIH0gZ3JheV9UQmFuZDsKLQotCi0gIEZUX0RFRklORV9PVVRMSU5FX0ZVTkNTKAotICAgIGZ1bmNfaW50ZXJmYWNlLAotCi0gICAgKEZUX091dGxpbmVfTW92ZVRvX0Z1bmMpIGdyYXlfbW92ZV90bywKLSAgICAoRlRfT3V0bGluZV9MaW5lVG9fRnVuYykgZ3JheV9saW5lX3RvLAotICAgIChGVF9PdXRsaW5lX0NvbmljVG9fRnVuYylncmF5X2NvbmljX3RvLAotICAgIChGVF9PdXRsaW5lX0N1YmljVG9fRnVuYylncmF5X2N1YmljX3RvLAotICAgIDAsCi0gICAgMCApCi0KLQotICBzdGF0aWMgaW50Ci0gIGdyYXlfY29udmVydF9nbHlwaF9pbm5lciggUkFTX0FSRyApCi0gIHsKLQotICAgIHZvbGF0aWxlIGludCAgZXJyb3IgPSAwOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSAgICAgIEZUX091dGxpbmVfRnVuY3MgZnVuY19pbnRlcmZhY2U7Ci0gICAgICBJbml0X0NsYXNzX2Z1bmNfaW50ZXJmYWNlKCZmdW5jX2ludGVyZmFjZSk7Ci0jZW5kaWYKLQotICAgIGlmICggZnRfc2V0am1wKCByYXMuanVtcF9idWZmZXIgKSA9PSAwICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX091dGxpbmVfRGVjb21wb3NlKCAmcmFzLm91dGxpbmUsICZmdW5jX2ludGVyZmFjZSwgJnJhcyApOwotICAgICAgaWYgKCAhcmFzLmludmFsaWQgKQotICAgICAgICBncmF5X3JlY29yZF9jZWxsKCBSQVNfVkFSICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGVycm9yID0gRlRfVEhST1coIE1lbW9yeV9PdmVyZmxvdyApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgaW50Ci0gIGdyYXlfY29udmVydF9nbHlwaCggUkFTX0FSRyApCi0gIHsKLSAgICBncmF5X1RCYW5kICAgICAgICAgICAgYmFuZHNbNDBdOwotICAgIGdyYXlfVEJhbmQqIHZvbGF0aWxlICBiYW5kOwotICAgIGludCB2b2xhdGlsZSAgICAgICAgICBuLCBudW1fYmFuZHM7Ci0gICAgVFBvcyB2b2xhdGlsZSAgICAgICAgIG1pbiwgbWF4LCBtYXhfeTsKLSAgICBGVF9CQm94KiAgICAgICAgICAgICAgY2xpcDsKLQotCi0gICAgLyogU2V0IHVwIHN0YXRlIGluIHRoZSByYXN0ZXIgb2JqZWN0ICovCi0gICAgZ3JheV9jb21wdXRlX2Nib3goIFJBU19WQVIgKTsKLQotICAgIC8qIGNsaXAgdG8gdGFyZ2V0IGJpdG1hcCwgZXhpdCBpZiBub3RoaW5nIHRvIGRvICovCi0gICAgY2xpcCA9ICZyYXMuY2xpcF9ib3g7Ci0KLSAgICBpZiAoIHJhcy5tYXhfZXggPD0gY2xpcC0+eE1pbiB8fCByYXMubWluX2V4ID49IGNsaXAtPnhNYXggfHwKLSAgICAgICAgIHJhcy5tYXhfZXkgPD0gY2xpcC0+eU1pbiB8fCByYXMubWluX2V5ID49IGNsaXAtPnlNYXggKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoIHJhcy5taW5fZXggPCBjbGlwLT54TWluICkgcmFzLm1pbl9leCA9IGNsaXAtPnhNaW47Ci0gICAgaWYgKCByYXMubWluX2V5IDwgY2xpcC0+eU1pbiApIHJhcy5taW5fZXkgPSBjbGlwLT55TWluOwotCi0gICAgaWYgKCByYXMubWF4X2V4ID4gY2xpcC0+eE1heCApIHJhcy5tYXhfZXggPSBjbGlwLT54TWF4OwotICAgIGlmICggcmFzLm1heF9leSA+IGNsaXAtPnlNYXggKSByYXMubWF4X2V5ID0gY2xpcC0+eU1heDsKLQotICAgIHJhcy5jb3VudF9leCA9IHJhcy5tYXhfZXggLSByYXMubWluX2V4OwotICAgIHJhcy5jb3VudF9leSA9IHJhcy5tYXhfZXkgLSByYXMubWluX2V5OwotCi0gICAgLyogc2V0IHVwIHZlcnRpY2FsIGJhbmRzICovCi0gICAgbnVtX2JhbmRzID0gKGludCkoICggcmFzLm1heF9leSAtIHJhcy5taW5fZXkgKSAvIHJhcy5iYW5kX3NpemUgKTsKLSAgICBpZiAoIG51bV9iYW5kcyA9PSAwICkKLSAgICAgIG51bV9iYW5kcyA9IDE7Ci0gICAgaWYgKCBudW1fYmFuZHMgPj0gMzkgKQotICAgICAgbnVtX2JhbmRzID0gMzk7Ci0KLSAgICByYXMuYmFuZF9zaG9vdCA9IDA7Ci0KLSAgICBtaW4gICA9IHJhcy5taW5fZXk7Ci0gICAgbWF4X3kgPSByYXMubWF4X2V5OwotCi0gICAgZm9yICggbiA9IDA7IG4gPCBudW1fYmFuZHM7IG4rKywgbWluID0gbWF4ICkKLSAgICB7Ci0gICAgICBtYXggPSBtaW4gKyByYXMuYmFuZF9zaXplOwotICAgICAgaWYgKCBuID09IG51bV9iYW5kcyAtIDEgfHwgbWF4ID4gbWF4X3kgKQotICAgICAgICBtYXggPSBtYXhfeTsKLQotICAgICAgYmFuZHNbMF0ubWluID0gbWluOwotICAgICAgYmFuZHNbMF0ubWF4ID0gbWF4OwotICAgICAgYmFuZCAgICAgICAgID0gYmFuZHM7Ci0KLSAgICAgIGRvCi0gICAgICB7Ci0gICAgICAgIFRQb3MgIGJvdHRvbSwgdG9wLCBtaWRkbGU7Ci0gICAgICAgIGludCAgIGVycm9yOwotCi0gICAgICAgIHsKLSAgICAgICAgICBQQ2VsbCAgY2VsbHNfbWF4OwotICAgICAgICAgIGludCAgICB5aW5kZXg7Ci0gICAgICAgICAgbG9uZyAgIGNlbGxfc3RhcnQsIGNlbGxfZW5kLCBjZWxsX21vZDsKLQotCi0gICAgICAgICAgcmFzLnljZWxscyA9IChQQ2VsbCopcmFzLmJ1ZmZlcjsKLSAgICAgICAgICByYXMueWNvdW50ID0gYmFuZC0+bWF4IC0gYmFuZC0+bWluOwotCi0gICAgICAgICAgY2VsbF9zdGFydCA9IChsb25nKXNpemVvZiAoIFBDZWxsICkgKiByYXMueWNvdW50OwotICAgICAgICAgIGNlbGxfbW9kICAgPSBjZWxsX3N0YXJ0ICUgKGxvbmcpc2l6ZW9mICggVENlbGwgKTsKLSAgICAgICAgICBpZiAoIGNlbGxfbW9kID4gMCApCi0gICAgICAgICAgICBjZWxsX3N0YXJ0ICs9IChsb25nKXNpemVvZiAoIFRDZWxsICkgLSBjZWxsX21vZDsKLQotICAgICAgICAgIGNlbGxfZW5kICA9IHJhcy5idWZmZXJfc2l6ZTsKLSAgICAgICAgICBjZWxsX2VuZCAtPSBjZWxsX2VuZCAlIChsb25nKXNpemVvZiAoIFRDZWxsICk7Ci0KLSAgICAgICAgICBjZWxsc19tYXggPSAoUENlbGwpKCAoY2hhciopcmFzLmJ1ZmZlciArIGNlbGxfZW5kICk7Ci0gICAgICAgICAgcmFzLmNlbGxzID0gKFBDZWxsKSggKGNoYXIqKXJhcy5idWZmZXIgKyBjZWxsX3N0YXJ0ICk7Ci0gICAgICAgICAgaWYgKCByYXMuY2VsbHMgPj0gY2VsbHNfbWF4ICkKLSAgICAgICAgICAgIGdvdG8gUmVkdWNlQmFuZHM7Ci0KLSAgICAgICAgICByYXMubWF4X2NlbGxzID0gY2VsbHNfbWF4IC0gcmFzLmNlbGxzOwotICAgICAgICAgIGlmICggcmFzLm1heF9jZWxscyA8IDIgKQotICAgICAgICAgICAgZ290byBSZWR1Y2VCYW5kczsKLQotICAgICAgICAgIGZvciAoIHlpbmRleCA9IDA7IHlpbmRleCA8IHJhcy55Y291bnQ7IHlpbmRleCsrICkKLSAgICAgICAgICAgIHJhcy55Y2VsbHNbeWluZGV4XSA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICByYXMubnVtX2NlbGxzID0gMDsKLSAgICAgICAgcmFzLmludmFsaWQgICA9IDE7Ci0gICAgICAgIHJhcy5taW5fZXkgICAgPSBiYW5kLT5taW47Ci0gICAgICAgIHJhcy5tYXhfZXkgICAgPSBiYW5kLT5tYXg7Ci0gICAgICAgIHJhcy5jb3VudF9leSAgPSBiYW5kLT5tYXggLSBiYW5kLT5taW47Ci0KLSAgICAgICAgZXJyb3IgPSBncmF5X2NvbnZlcnRfZ2x5cGhfaW5uZXIoIFJBU19WQVIgKTsKLQotICAgICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIHsKLSAgICAgICAgICBncmF5X3N3ZWVwKCBSQVNfVkFSXyAmcmFzLnRhcmdldCApOwotICAgICAgICAgIGJhbmQtLTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggZXJyb3IgIT0gRXJyUmFzdGVyX01lbW9yeV9PdmVyZmxvdyApCi0gICAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgIFJlZHVjZUJhbmRzOgotICAgICAgICAvKiByZW5kZXIgcG9vbCBvdmVyZmxvdzsgd2Ugd2lsbCByZWR1Y2UgdGhlIHJlbmRlciBiYW5kIGJ5IGhhbGYgKi8KLSAgICAgICAgYm90dG9tID0gYmFuZC0+bWluOwotICAgICAgICB0b3AgICAgPSBiYW5kLT5tYXg7Ci0gICAgICAgIG1pZGRsZSA9IGJvdHRvbSArICggKCB0b3AgLSBib3R0b20gKSA+PiAxICk7Ci0KLSAgICAgICAgLyogVGhpcyBpcyB0b28gY29tcGxleCBmb3IgYSBzaW5nbGUgc2NhbmxpbmU7IHRoZXJlIG11c3QgKi8KLSAgICAgICAgLyogYmUgc29tZSBwcm9ibGVtcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBtaWRkbGUgPT0gYm90dG9tICkKLSAgICAgICAgewotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgICAgRlRfVFJBQ0U3KCggImdyYXlfY29udmVydF9nbHlwaDogcm90dGVuIGdseXBoXG4iICkpOwotI2VuZGlmCi0gICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGJvdHRvbS10b3AgPj0gcmFzLmJhbmRfc2l6ZSApCi0gICAgICAgICAgcmFzLmJhbmRfc2hvb3QrKzsKLQotICAgICAgICBiYW5kWzFdLm1pbiA9IGJvdHRvbTsKLSAgICAgICAgYmFuZFsxXS5tYXggPSBtaWRkbGU7Ci0gICAgICAgIGJhbmRbMF0ubWluID0gbWlkZGxlOwotICAgICAgICBiYW5kWzBdLm1heCA9IHRvcDsKLSAgICAgICAgYmFuZCsrOwotICAgICAgfSB3aGlsZSAoIGJhbmQgPj0gYmFuZHMgKTsKLSAgICB9Ci0KLSAgICBpZiAoIHJhcy5iYW5kX3Nob290ID4gOCAmJiByYXMuYmFuZF9zaXplID4gMTYgKQotICAgICAgcmFzLmJhbmRfc2l6ZSA9IHJhcy5iYW5kX3NpemUgLyAyOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBpbnQKLSAgZ3JheV9yYXN0ZXJfcmVuZGVyKCBncmF5X1BSYXN0ZXIgICAgICAgICAgICAgcmFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1Jhc3Rlcl9QYXJhbXMqICBwYXJhbXMgKQotICB7Ci0gICAgY29uc3QgRlRfT3V0bGluZSogIG91dGxpbmUgICAgID0gKGNvbnN0IEZUX091dGxpbmUqKXBhcmFtcy0+c291cmNlOwotICAgIGNvbnN0IEZUX0JpdG1hcCogICB0YXJnZXRfbWFwICA9IHBhcmFtcy0+dGFyZ2V0OwotCi0gICAgZ3JheV9UV29ya2VyICB3b3JrZXJbMV07Ci0KLSAgICBUQ2VsbCAgYnVmZmVyW0ZUX01BWCggRlRfUkVOREVSX1BPT0xfU0laRSwgMjA0OCApIC8gc2l6ZW9mICggVENlbGwgKV07Ci0gICAgbG9uZyAgIGJ1ZmZlcl9zaXplID0gc2l6ZW9mICggYnVmZmVyICk7Ci0gICAgaW50ICAgIGJhbmRfc2l6ZSAgID0gKGludCkoIGJ1ZmZlcl9zaXplIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpKCBzaXplb2YgKCBUQ2VsbCApICogOCApICk7Ci0KLQotICAgIGlmICggIXJhc3RlciApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGlmICggIW91dGxpbmUgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX091dGxpbmUgKTsKLQotICAgIC8qIHJldHVybiBpbW1lZGlhdGVseSBpZiB0aGUgb3V0bGluZSBpcyBlbXB0eSAqLwotICAgIGlmICggb3V0bGluZS0+bl9wb2ludHMgPT0gMCB8fCBvdXRsaW5lLT5uX2NvbnRvdXJzIDw9IDAgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoICFvdXRsaW5lLT5jb250b3VycyB8fCAhb3V0bGluZS0+cG9pbnRzICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9PdXRsaW5lICk7Ci0KLSAgICBpZiAoIG91dGxpbmUtPm5fcG9pbnRzICE9Ci0gICAgICAgICAgIG91dGxpbmUtPmNvbnRvdXJzW291dGxpbmUtPm5fY29udG91cnMgLSAxXSArIDEgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX091dGxpbmUgKTsKLQotICAgIC8qIGlmIGRpcmVjdCBtb2RlIGlzIG5vdCBzZXQsIHdlIG11c3QgaGF2ZSBhIHRhcmdldCBiaXRtYXAgKi8KLSAgICBpZiAoICEoIHBhcmFtcy0+ZmxhZ3MgJiBGVF9SQVNURVJfRkxBR19ESVJFQ1QgKSApCi0gICAgewotICAgICAgaWYgKCAhdGFyZ2V0X21hcCApCi0gICAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgICAvKiBub3RoaW5nIHRvIGRvICovCi0gICAgICBpZiAoICF0YXJnZXRfbWFwLT53aWR0aCB8fCAhdGFyZ2V0X21hcC0+cm93cyApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgICBpZiAoICF0YXJnZXRfbWFwLT5idWZmZXIgKQotICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICB9Ci0KLSAgICAvKiB0aGlzIHZlcnNpb24gZG9lcyBub3Qgc3VwcG9ydCBtb25vY2hyb21lIHJlbmRlcmluZyAqLwotICAgIGlmICggISggcGFyYW1zLT5mbGFncyAmIEZUX1JBU1RFUl9GTEFHX0FBICkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX01vZGUgKTsKLQotICAgIC8qIGNvbXB1dGUgY2xpcHBpbmcgYm94ICovCi0gICAgaWYgKCAhKCBwYXJhbXMtPmZsYWdzICYgRlRfUkFTVEVSX0ZMQUdfRElSRUNUICkgKQotICAgIHsKLSAgICAgIC8qIGNvbXB1dGUgY2xpcCBib3ggZnJvbSB0YXJnZXQgcGl4bWFwICovCi0gICAgICByYXMuY2xpcF9ib3gueE1pbiA9IDA7Ci0gICAgICByYXMuY2xpcF9ib3gueU1pbiA9IDA7Ci0gICAgICByYXMuY2xpcF9ib3gueE1heCA9IChGVF9Qb3MpdGFyZ2V0X21hcC0+d2lkdGg7Ci0gICAgICByYXMuY2xpcF9ib3gueU1heCA9IChGVF9Qb3MpdGFyZ2V0X21hcC0+cm93czsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIHBhcmFtcy0+ZmxhZ3MgJiBGVF9SQVNURVJfRkxBR19DTElQICkKLSAgICAgIHJhcy5jbGlwX2JveCA9IHBhcmFtcy0+Y2xpcF9ib3g7Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJhcy5jbGlwX2JveC54TWluID0gLTMyNzY4TDsKLSAgICAgIHJhcy5jbGlwX2JveC55TWluID0gLTMyNzY4TDsKLSAgICAgIHJhcy5jbGlwX2JveC54TWF4ID0gIDMyNzY3TDsKLSAgICAgIHJhcy5jbGlwX2JveC55TWF4ID0gIDMyNzY3TDsKLSAgICB9Ci0KLSAgICBncmF5X2luaXRfY2VsbHMoIFJBU19WQVJfIGJ1ZmZlciwgYnVmZmVyX3NpemUgKTsKLQotICAgIHJhcy5vdXRsaW5lICAgICAgICA9ICpvdXRsaW5lOwotICAgIHJhcy5udW1fY2VsbHMgICAgICA9IDA7Ci0gICAgcmFzLmludmFsaWQgICAgICAgID0gMTsKLSAgICByYXMuYmFuZF9zaXplICAgICAgPSBiYW5kX3NpemU7Ci0gICAgcmFzLm51bV9ncmF5X3NwYW5zID0gMDsKLSAgICByYXMuc3Bhbl95ICAgICAgICAgPSAwOwotCi0gICAgaWYgKCBwYXJhbXMtPmZsYWdzICYgRlRfUkFTVEVSX0ZMQUdfRElSRUNUICkKLSAgICB7Ci0gICAgICByYXMucmVuZGVyX3NwYW4gICAgICA9IChGVF9SYXN0ZXJfU3Bhbl9GdW5jKXBhcmFtcy0+Z3JheV9zcGFuczsKLSAgICAgIHJhcy5yZW5kZXJfc3Bhbl9kYXRhID0gcGFyYW1zLT51c2VyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmFzLnRhcmdldCAgICAgICAgICAgPSAqdGFyZ2V0X21hcDsKLSAgICAgIHJhcy5yZW5kZXJfc3BhbiAgICAgID0gKEZUX1Jhc3Rlcl9TcGFuX0Z1bmMpZ3JheV9yZW5kZXJfc3BhbjsKLSAgICAgIHJhcy5yZW5kZXJfc3Bhbl9kYXRhID0gJnJhczsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ3JheV9jb252ZXJ0X2dseXBoKCBSQVNfVkFSICk7Ci0gIH0KLQotCi0gIC8qKioqIFJBU1RFUiBPQkpFQ1QgQ1JFQVRJT046IEluIHN0YW5kLWFsb25lIG1vZGUsIHdlIHNpbXBseSB1c2UgKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgIGEgc3RhdGljIG9iamVjdC4gICAgICAgICAgICAgICAgICAgKioqKiovCi0KLSNpZmRlZiBfU1RBTkRBTE9ORV8KLQotICBzdGF0aWMgaW50Ci0gIGdyYXlfcmFzdGVyX25ldyggdm9pZCogICAgICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgIEZUX1Jhc3RlciogIGFyYXN0ZXIgKQotICB7Ci0gICAgc3RhdGljIGdyYXlfVFJhc3RlciAgdGhlX3Jhc3RlcjsKLQotICAgIEZUX1VOVVNFRCggbWVtb3J5ICk7Ci0KLQotICAgICphcmFzdGVyID0gKEZUX1Jhc3RlcikmdGhlX3Jhc3RlcjsKLSAgICBGVF9NRU1fWkVSTyggJnRoZV9yYXN0ZXIsIHNpemVvZiAoIHRoZV9yYXN0ZXIgKSApOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIGdyYXlfcmFzdGVyX2RvbmUoIEZUX1Jhc3RlciAgcmFzdGVyICkKLSAgewotICAgIC8qIG5vdGhpbmcgKi8KLSAgICBGVF9VTlVTRUQoIHJhc3RlciApOwotICB9Ci0KLSNlbHNlIC8qICFfU1RBTkRBTE9ORV8gKi8KLQotICBzdGF0aWMgaW50Ci0gIGdyYXlfcmFzdGVyX25ldyggRlRfTWVtb3J5ICAgbWVtb3J5LAotICAgICAgICAgICAgICAgICAgIEZUX1Jhc3RlciogIGFyYXN0ZXIgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvcjsKLSAgICBncmF5X1BSYXN0ZXIgIHJhc3RlciA9IE5VTEw7Ci0KLQotICAgICphcmFzdGVyID0gMDsKLSAgICBpZiAoICFGVF9BTExPQyggcmFzdGVyLCBzaXplb2YgKCBncmF5X1RSYXN0ZXIgKSApICkKLSAgICB7Ci0gICAgICByYXN0ZXItPm1lbW9yeSA9IG1lbW9yeTsKLSAgICAgICphcmFzdGVyICAgICAgID0gKEZUX1Jhc3RlcilyYXN0ZXI7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBncmF5X3Jhc3Rlcl9kb25lKCBGVF9SYXN0ZXIgIHJhc3RlciApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IChGVF9NZW1vcnkpKChncmF5X1BSYXN0ZXIpcmFzdGVyKS0+bWVtb3J5OwotCi0KLSAgICBGVF9GUkVFKCByYXN0ZXIgKTsKLSAgfQotCi0jZW5kaWYgLyogIV9TVEFOREFMT05FXyAqLwotCi0KLSAgc3RhdGljIHZvaWQKLSAgZ3JheV9yYXN0ZXJfcmVzZXQoIEZUX1Jhc3RlciAgcmFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgICBwb29sX2Jhc2UsCi0gICAgICAgICAgICAgICAgICAgICBsb25nICAgICAgIHBvb2xfc2l6ZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIHJhc3RlciApOwotICAgIEZUX1VOVVNFRCggcG9vbF9iYXNlICk7Ci0gICAgRlRfVU5VU0VEKCBwb29sX3NpemUgKTsKLSAgfQotCi0KLSAgc3RhdGljIGludAotICBncmF5X3Jhc3Rlcl9zZXRfbW9kZSggRlRfUmFzdGVyICAgICAgcmFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAgbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVU5VU0VEKCByYXN0ZXIgKTsKLSAgICBGVF9VTlVTRUQoIG1vZGUgKTsKLSAgICBGVF9VTlVTRUQoIGFyZ3MgKTsKLQotCi0gICAgcmV0dXJuIDA7IC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgfQotCi0KLSAgRlRfREVGSU5FX1JBU1RFUl9GVU5DUygKLSAgICBmdF9ncmF5c19yYXN0ZXIsCi0KLSAgICBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSwKLQotICAgIChGVF9SYXN0ZXJfTmV3X0Z1bmMpICAgICBncmF5X3Jhc3Rlcl9uZXcsCi0gICAgKEZUX1Jhc3Rlcl9SZXNldF9GdW5jKSAgIGdyYXlfcmFzdGVyX3Jlc2V0LAotICAgIChGVF9SYXN0ZXJfU2V0X01vZGVfRnVuYylncmF5X3Jhc3Rlcl9zZXRfbW9kZSwKLSAgICAoRlRfUmFzdGVyX1JlbmRlcl9GdW5jKSAgZ3JheV9yYXN0ZXJfcmVuZGVyLAotICAgIChGVF9SYXN0ZXJfRG9uZV9GdW5jKSAgICBncmF5X3Jhc3Rlcl9kb25lICkKLQotCi0vKiBFTkQgKi8KLQotCi0vKiBMb2NhbCBWYXJpYWJsZXM6ICovCi0vKiBjb2Rpbmc6IHV0Zi04ICAgICovCi0vKiBFbmQ6ICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc21vb3RoL2Z0Z3JheXMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvZnRncmF5cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjU3NjAzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvZnRncmF5cy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgZnRncmF5cy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZyZWVUeXBlIHNtb290aCByZW5kZXJlciBkZWNsYXJhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fRlRHUkFZU19IX18KLSNkZWZpbmUgX19GVEdSQVlTX0hfXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSAgZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCi0jaWZkZWYgX1NUQU5EQUxPTkVfCi0jaW5jbHVkZSAiZnRpbWFnZS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19IIC8qIGZvciBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotI2luY2x1ZGUgRlRfSU1BR0VfSAotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRvIG1ha2UgZnRncmF5cy5oIGluZGVwZW5kZW50IGZyb20gY29uZmlndXJhdGlvbiBmaWxlcyB3ZSBjaGVjayAgICAgICAqLwotICAvKiB3aGV0aGVyIEZUX0VYUE9SVF9WQVIgaGFzIGJlZW4gZGVmaW5lZCBhbHJlYWR5LiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9uIHNvbWUgc3lzdGVtcyBhbmQgY29tcGlsZXJzIChXaW4zMiBtb3N0bHkpLCBhbiBleHRyYSBrZXl3b3JkIGlzICAgICAqLwotICAvKiBuZWNlc3NhcnkgdG8gY29tcGlsZSB0aGUgbGlicmFyeSBhcyBhIERMTC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jaWZuZGVmIEZUX0VYUE9SVF9WQVIKLSNkZWZpbmUgRlRfRVhQT1JUX1ZBUiggeCApICBleHRlcm4gIHgKLSNlbmRpZgotCi0gIEZUX0VYUE9SVF9WQVIoIGNvbnN0IEZUX1Jhc3Rlcl9GdW5jcyApICBmdF9ncmF5c19yYXN0ZXI7Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0gIH0KLSNlbmRpZgotCi0jZW5kaWYgLyogX19GVEdSQVlTX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9mdHNtZXJycy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9mdHNtZXJycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzM4YWExLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvZnRzbWVycnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c21lcnJzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBzbW9vdGggcmVuZGVyZXIgZXJyb3IgY29kZXMgKHNwZWNpZmljYXRpb24gb25seSkuICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwMS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgZmlsZSBpcyB1c2VkIHRvIGRlZmluZSB0aGUgc21vb3RoIHJlbmRlcmVyIGVycm9yIGVudW1lcmF0aW9uICAgICAqLwotICAvKiBjb25zdGFudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZuZGVmIF9fRlRTTUVSUlNfSF9fCi0jZGVmaW5lIF9fRlRTTUVSUlNfSF9fCi0KLSNpbmNsdWRlIEZUX01PRFVMRV9FUlJPUlNfSAotCi0jdW5kZWYgX19GVEVSUk9SU19IX18KLQotI3VuZGVmICBGVF9FUlJfUFJFRklYCi0jZGVmaW5lIEZUX0VSUl9QUkVGSVggIFNtb290aF9FcnJfCi0jZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfU21vb3RoCi0KLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0KLSNlbmRpZiAvKiBfX0ZUU01FUlJTX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9mdHNtb290aC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9mdHNtb290aC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjIwNTUwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvZnRzbW9vdGguYworKysgL2Rldi9udWxsCkBAIC0xLDUxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHNtb290aC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQW50aS1hbGlhc2luZyByZW5kZXJlciBpbnRlcmZhY2UgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDAtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9PVVRMSU5FX0gKLSNpbmNsdWRlICJmdHNtb290aC5oIgotI2luY2x1ZGUgImZ0Z3JheXMuaCIKLSNpbmNsdWRlICJmdHNwaWMuaCIKLQotI2luY2x1ZGUgImZ0c21lcnJzLmgiCi0KLQotICAvKiBpbml0aWFsaXplIHJlbmRlcmVyIC0tIGluaXQgaXRzIHJhc3RlciAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfc21vb3RoX2luaXQoIEZUX1JlbmRlcmVyICByZW5kZXIgKQotICB7Ci0gICAgRlRfTGlicmFyeSAgbGlicmFyeSA9IEZUX01PRFVMRV9MSUJSQVJZKCByZW5kZXIgKTsKLQotCi0gICAgcmVuZGVyLT5jbGF6ei0+cmFzdGVyX2NsYXNzLT5yYXN0ZXJfcmVzZXQoIHJlbmRlci0+cmFzdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5LT5yYXN0ZXJfcG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeS0+cmFzdGVyX3Bvb2xfc2l6ZSApOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIC8qIHNldHMgcmVuZGVyLXNwZWNpZmljIG1vZGUgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGZ0X3Ntb290aF9zZXRfbW9kZSggRlRfUmVuZGVyZXIgIHJlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgbW9kZV90YWcsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfUG9pbnRlciAgIGRhdGEgKQotICB7Ci0gICAgLyogd2Ugc2ltcGx5IHBhc3MgaXQgdG8gdGhlIHJhc3RlciAqLwotICAgIHJldHVybiByZW5kZXItPmNsYXp6LT5yYXN0ZXJfY2xhc3MtPnJhc3Rlcl9zZXRfbW9kZSggcmVuZGVyLT5yYXN0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlX3RhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKTsKLSAgfQotCi0gIC8qIHRyYW5zZm9ybSBhIGdpdmVuIGdseXBoIGltYWdlICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zbW9vdGhfdHJhbnNmb3JtKCBGVF9SZW5kZXJlciAgICAgICByZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX01hdHJpeCogIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfVmVjdG9yKiAgZGVsdGEgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoIHNsb3QtPmZvcm1hdCAhPSByZW5kZXItPmdseXBoX2Zvcm1hdCApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggbWF0cml4ICkKLSAgICAgIEZUX091dGxpbmVfVHJhbnNmb3JtKCAmc2xvdC0+b3V0bGluZSwgbWF0cml4ICk7Ci0KLSAgICBpZiAoIGRlbHRhICkKLSAgICAgIEZUX091dGxpbmVfVHJhbnNsYXRlKCAmc2xvdC0+b3V0bGluZSwgZGVsdGEtPngsIGRlbHRhLT55ICk7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIHJldHVybiB0aGUgZ2x5cGgncyBjb250cm9sIGJveCAqLwotICBzdGF0aWMgdm9pZAotICBmdF9zbW9vdGhfZ2V0X2Nib3goIEZUX1JlbmRlcmVyICAgcmVuZGVyLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9CQm94KiAgICAgIGNib3ggKQotICB7Ci0gICAgRlRfTUVNX1pFUk8oIGNib3gsIHNpemVvZiAoICpjYm94ICkgKTsKLQotICAgIGlmICggc2xvdC0+Zm9ybWF0ID09IHJlbmRlci0+Z2x5cGhfZm9ybWF0ICkKLSAgICAgIEZUX091dGxpbmVfR2V0X0NCb3goICZzbG90LT5vdXRsaW5lLCBjYm94ICk7Ci0gIH0KLQotCi0gIC8qIGNvbnZlcnQgYSBzbG90J3MgZ2x5cGggaW1hZ2UgaW50byBhIGJpdG1hcCAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljKCBGVF9SZW5kZXJlciAgICAgICByZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAgICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgICBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIG9yaWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgICByZXF1aXJlZF9tb2RlICkKLSAgewotICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSA9ICZzbG90LT5vdXRsaW5lOwotICAgIEZUX0JpdG1hcCogICBiaXRtYXAgID0gJnNsb3QtPmJpdG1hcDsKLSAgICBGVF9NZW1vcnkgICAgbWVtb3J5ICA9IHJlbmRlci0+cm9vdC5tZW1vcnk7Ci0gICAgRlRfQkJveCAgICAgIGNib3g7Ci0gICAgRlRfUG9zICAgICAgIHhfc2hpZnQgPSAwOwotICAgIEZUX1BvcyAgICAgICB5X3NoaWZ0ID0gMDsKLSAgICBGVF9Qb3MgICAgICAgeF9sZWZ0LCB5X3RvcDsKLSAgICBGVF9Qb3MgICAgICAgd2lkdGgsIGhlaWdodCwgcGl0Y2g7Ci0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HCi0gICAgRlRfUG9zICAgICAgIGhlaWdodF9vcmcsIHdpZHRoX29yZzsKLSNlbmRpZgotICAgIEZUX0ludCAgICAgICBobXVsICAgID0gbW9kZSA9PSBGVF9SRU5ERVJfTU9ERV9MQ0Q7Ci0gICAgRlRfSW50ICAgICAgIHZtdWwgICAgPSBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xDRF9WOwotCi0gICAgRlRfUmFzdGVyX1BhcmFtcyAgcGFyYW1zOwotCi0gICAgRlRfQm9vbCAgaGF2ZV9vdXRsaW5lX3NoaWZ0ZWQgPSBGQUxTRTsKLSAgICBGVF9Cb29sICBoYXZlX2J1ZmZlciAgICAgICAgICA9IEZBTFNFOwotCi0KLSAgICAvKiBjaGVjayBnbHlwaCBpbWFnZSBmb3JtYXQgKi8KLSAgICBpZiAoIHNsb3QtPmZvcm1hdCAhPSByZW5kZXItPmdseXBoX2Zvcm1hdCApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIGNoZWNrIG1vZGUgKi8KLSAgICBpZiAoIG1vZGUgIT0gcmVxdWlyZWRfbW9kZSApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggQ2Fubm90X1JlbmRlcl9HbHlwaCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggb3JpZ2luICkKLSAgICB7Ci0gICAgICB4X3NoaWZ0ID0gb3JpZ2luLT54OwotICAgICAgeV9zaGlmdCA9IG9yaWdpbi0+eTsKLSAgICB9Ci0KLSAgICAvKiBjb21wdXRlIHRoZSBjb250cm9sIGJveCwgYW5kIGdyaWQgZml0IGl0ICovCi0gICAgLyogdGFraW5nIGludG8gYWNjb3VudCB0aGUgb3JpZ2luIHNoaWZ0ICAgICAqLwotICAgIEZUX091dGxpbmVfR2V0X0NCb3goIG91dGxpbmUsICZjYm94ICk7Ci0KLSAgICBjYm94LnhNaW4gPSBGVF9QSVhfRkxPT1IoIGNib3gueE1pbiArIHhfc2hpZnQgKTsKLSAgICBjYm94LnlNaW4gPSBGVF9QSVhfRkxPT1IoIGNib3gueU1pbiArIHlfc2hpZnQgKTsKLSAgICBjYm94LnhNYXggPSBGVF9QSVhfQ0VJTCggY2JveC54TWF4ICsgeF9zaGlmdCApOwotICAgIGNib3gueU1heCA9IEZUX1BJWF9DRUlMKCBjYm94LnlNYXggKyB5X3NoaWZ0ICk7Ci0KLSAgICB4X3NoaWZ0IC09IGNib3gueE1pbjsKLSAgICB5X3NoaWZ0IC09IGNib3gueU1pbjsKLQotICAgIHhfbGVmdCAgPSBjYm94LnhNaW4gPj4gNjsKLSAgICB5X3RvcCAgID0gY2JveC55TWF4ID4+IDY7Ci0KLSAgICB3aWR0aCAgPSAoRlRfVUxvbmcpKCBjYm94LnhNYXggLSBjYm94LnhNaW4gKSA+PiA2OwotICAgIGhlaWdodCA9IChGVF9VTG9uZykoIGNib3gueU1heCAtIGNib3gueU1pbiApID4+IDY7Ci0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcKLSAgICB3aWR0aF9vcmcgID0gd2lkdGg7Ci0gICAgaGVpZ2h0X29yZyA9IGhlaWdodDsKLSNlbmRpZgotCi0gICAgcGl0Y2ggPSB3aWR0aDsKLSAgICBpZiAoIGhtdWwgKQotICAgIHsKLSAgICAgIHdpZHRoICo9IDM7Ci0gICAgICBwaXRjaCAgPSBGVF9QQURfQ0VJTCggd2lkdGgsIDQgKTsKLSAgICB9Ci0KLSAgICBpZiAoIHZtdWwgKQotICAgICAgaGVpZ2h0ICo9IDM7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORwotCi0gICAgaWYgKCBzbG90LT5saWJyYXJ5LT5sY2RfZmlsdGVyX2Z1bmMgKQotICAgIHsKLSAgICAgIEZUX0ludCAgZXh0cmEgPSBzbG90LT5saWJyYXJ5LT5sY2RfZXh0cmE7Ci0KLQotICAgICAgaWYgKCBobXVsICkKLSAgICAgIHsKLSAgICAgICAgeF9zaGlmdCArPSA2NCAqICggZXh0cmEgPj4gMSApOwotICAgICAgICB4X2xlZnQgIC09IGV4dHJhID4+IDE7Ci0gICAgICAgIHdpZHRoICAgKz0gMyAqIGV4dHJhOwotICAgICAgICBwaXRjaCAgICA9IEZUX1BBRF9DRUlMKCB3aWR0aCwgNCApOwotICAgICAgfQotCi0gICAgICBpZiAoIHZtdWwgKQotICAgICAgewotICAgICAgICB5X3NoaWZ0ICs9IDY0ICogKCBleHRyYSA+PiAxICk7Ci0gICAgICAgIHlfdG9wICAgKz0gZXh0cmEgPj4gMTsKLSAgICAgICAgaGVpZ2h0ICArPSAzICogZXh0cmE7Ci0gICAgICB9Ci0gICAgfQotCi0jZW5kaWYKLQotICAgIC8qCi0gICAgICogWFhYOiBvbiAxNmJpdCBzeXN0ZW0sIHdlIHJldHVybiBhbiBlcnJvciBmb3IgaHVnZSBiaXRtYXAKLSAgICAgKiB0byBwcmV2ZW50IGFuIG92ZXJmbG93LgotICAgICAqLwotICAgIGlmICggeF9sZWZ0ID4gRlRfSU5UX01BWCB8fCB5X3RvcCA+IEZUX0lOVF9NQVggfHwKLSAgICAgICAgIHhfbGVmdCA8IEZUX0lOVF9NSU4gfHwgeV90b3AgPCBGVF9JTlRfTUlOICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1BpeGVsX1NpemUgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBSZXF1aXJlZCBjaGVjayBpcyAocGl0Y2ggKiBoZWlnaHQgPCBGVF9VTE9OR19NQVgpLCAgICAgICAgKi8KLSAgICAvKiBidXQgd2UgY2FyZSByZWFsaXN0aWMgY2FzZXMgb25seS4gIEFsd2F5cyBwaXRjaCA8PSB3aWR0aC4gKi8KLSAgICBpZiAoIHdpZHRoID4gMHg3RkZGIHx8IGhlaWdodCA+IDB4N0ZGRiApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljOiBnbHlwaCB0b28gbGFyZ2U6ICV1IHggJXVcbiIsCi0gICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBSYXN0ZXJfT3ZlcmZsb3cgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiByZWxlYXNlIG9sZCBiaXRtYXAgYnVmZmVyICovCi0gICAgaWYgKCBzbG90LT5pbnRlcm5hbC0+ZmxhZ3MgJiBGVF9HTFlQSF9PV05fQklUTUFQICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCBiaXRtYXAtPmJ1ZmZlciApOwotICAgICAgc2xvdC0+aW50ZXJuYWwtPmZsYWdzICY9IH5GVF9HTFlQSF9PV05fQklUTUFQOwotICAgIH0KLQotICAgIC8qIGFsbG9jYXRlIG5ldyBvbmUgKi8KLSAgICBpZiAoIEZUX0FMTE9DKCBiaXRtYXAtPmJ1ZmZlciwgKEZUX1VMb25nKSggcGl0Y2ggKiBoZWlnaHQgKSApICkKLSAgICAgIGdvdG8gRXhpdDsKLSAgICBlbHNlCi0gICAgICBoYXZlX2J1ZmZlciA9IFRSVUU7Ci0KLSAgICBzbG90LT5pbnRlcm5hbC0+ZmxhZ3MgfD0gRlRfR0xZUEhfT1dOX0JJVE1BUDsKLQotICAgIHNsb3QtPmZvcm1hdCAgICAgID0gRlRfR0xZUEhfRk9STUFUX0JJVE1BUDsKLSAgICBzbG90LT5iaXRtYXBfbGVmdCA9IChGVF9JbnQpeF9sZWZ0OwotICAgIHNsb3QtPmJpdG1hcF90b3AgID0gKEZUX0ludCl5X3RvcDsKLQotICAgIGJpdG1hcC0+cGl4ZWxfbW9kZSA9IEZUX1BJWEVMX01PREVfR1JBWTsKLSAgICBiaXRtYXAtPm51bV9ncmF5cyAgPSAyNTY7Ci0gICAgYml0bWFwLT53aWR0aCAgICAgID0gKHVuc2lnbmVkIGludCl3aWR0aDsKLSAgICBiaXRtYXAtPnJvd3MgICAgICAgPSAodW5zaWduZWQgaW50KWhlaWdodDsKLSAgICBiaXRtYXAtPnBpdGNoICAgICAgPSBwaXRjaDsKLQotICAgIC8qIHRyYW5zbGF0ZSBvdXRsaW5lIHRvIHJlbmRlciBpdCBpbnRvIHRoZSBiaXRtYXAgKi8KLSAgICBpZiAoIHhfc2hpZnQgfHwgeV9zaGlmdCApCi0gICAgewotICAgICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoIG91dGxpbmUsIHhfc2hpZnQsIHlfc2hpZnQgKTsKLSAgICAgIGhhdmVfb3V0bGluZV9zaGlmdGVkID0gVFJVRTsKLSAgICB9Ci0KLSAgICAvKiBzZXQgdXAgcGFyYW1ldGVycyAqLwotICAgIHBhcmFtcy50YXJnZXQgPSBiaXRtYXA7Ci0gICAgcGFyYW1zLnNvdXJjZSA9IG91dGxpbmU7Ci0gICAgcGFyYW1zLmZsYWdzICA9IEZUX1JBU1RFUl9GTEFHX0FBOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9SRU5ERVJJTkcKLQotICAgIC8qIGltcGxvZGUgb3V0bGluZSBpZiBuZWVkZWQgKi8KLSAgICB7Ci0gICAgICBGVF9WZWN0b3IqICBwb2ludHMgICAgID0gb3V0bGluZS0+cG9pbnRzOwotICAgICAgRlRfVmVjdG9yKiAgcG9pbnRzX2VuZCA9IHBvaW50cyArIG91dGxpbmUtPm5fcG9pbnRzOwotICAgICAgRlRfVmVjdG9yKiAgdmVjOwotCi0KLSAgICAgIGlmICggaG11bCApCi0gICAgICAgIGZvciAoIHZlYyA9IHBvaW50czsgdmVjIDwgcG9pbnRzX2VuZDsgdmVjKysgKQotICAgICAgICAgIHZlYy0+eCAqPSAzOwotCi0gICAgICBpZiAoIHZtdWwgKQotICAgICAgICBmb3IgKCB2ZWMgPSBwb2ludHM7IHZlYyA8IHBvaW50c19lbmQ7IHZlYysrICkKLSAgICAgICAgICB2ZWMtPnkgKj0gMzsKLSAgICB9Ci0KLSAgICAvKiByZW5kZXIgb3V0bGluZSBpbnRvIHRoZSBiaXRtYXAgKi8KLSAgICBlcnJvciA9IHJlbmRlci0+cmFzdGVyX3JlbmRlciggcmVuZGVyLT5yYXN0ZXIsICZwYXJhbXMgKTsKLQotICAgIC8qIGRlZmxhdGUgb3V0bGluZSBpZiBuZWVkZWQgKi8KLSAgICB7Ci0gICAgICBGVF9WZWN0b3IqICBwb2ludHMgICAgID0gb3V0bGluZS0+cG9pbnRzOwotICAgICAgRlRfVmVjdG9yKiAgcG9pbnRzX2VuZCA9IHBvaW50cyArIG91dGxpbmUtPm5fcG9pbnRzOwotICAgICAgRlRfVmVjdG9yKiAgdmVjOwotCi0KLSAgICAgIGlmICggaG11bCApCi0gICAgICAgIGZvciAoIHZlYyA9IHBvaW50czsgdmVjIDwgcG9pbnRzX2VuZDsgdmVjKysgKQotICAgICAgICAgIHZlYy0+eCAvPSAzOwotCi0gICAgICBpZiAoIHZtdWwgKQotICAgICAgICBmb3IgKCB2ZWMgPSBwb2ludHM7IHZlYyA8IHBvaW50c19lbmQ7IHZlYysrICkKLSAgICAgICAgICB2ZWMtPnkgLz0gMzsKLSAgICB9Ci0KLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggc2xvdC0+bGlicmFyeS0+bGNkX2ZpbHRlcl9mdW5jICkKLSAgICAgIHNsb3QtPmxpYnJhcnktPmxjZF9maWx0ZXJfZnVuYyggYml0bWFwLCBtb2RlLCBzbG90LT5saWJyYXJ5ICk7Ci0KLSNlbHNlIC8qICFGVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX1JFTkRFUklORyAqLwotCi0gICAgLyogcmVuZGVyIG91dGxpbmUgaW50byBiaXRtYXAgKi8KLSAgICBlcnJvciA9IHJlbmRlci0+cmFzdGVyX3JlbmRlciggcmVuZGVyLT5yYXN0ZXIsICZwYXJhbXMgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGV4cGFuZCBpdCBob3Jpem9udGFsbHkgKi8KLSAgICBpZiAoIGhtdWwgKQotICAgIHsKLSAgICAgIEZUX0J5dGUqICBsaW5lID0gYml0bWFwLT5idWZmZXI7Ci0gICAgICBGVF9VSW50ICAgaGg7Ci0KLQotICAgICAgZm9yICggaGggPSBoZWlnaHRfb3JnOyBoaCA+IDA7IGhoLS0sIGxpbmUgKz0gcGl0Y2ggKQotICAgICAgewotICAgICAgICBGVF9VSW50ICAgeHg7Ci0gICAgICAgIEZUX0J5dGUqICBlbmQgPSBsaW5lICsgd2lkdGg7Ci0KLQotICAgICAgICBmb3IgKCB4eCA9IHdpZHRoX29yZzsgeHggPiAwOyB4eC0tICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1VJbnQgIHBpeGVsID0gbGluZVt4eC0xXTsKLQotCi0gICAgICAgICAgZW5kWy0zXSA9IChGVF9CeXRlKXBpeGVsOwotICAgICAgICAgIGVuZFstMl0gPSAoRlRfQnl0ZSlwaXhlbDsKLSAgICAgICAgICBlbmRbLTFdID0gKEZUX0J5dGUpcGl4ZWw7Ci0gICAgICAgICAgZW5kICAgIC09IDM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBleHBhbmQgaXQgdmVydGljYWxseSAqLwotICAgIGlmICggdm11bCApCi0gICAgewotICAgICAgRlRfQnl0ZSogIHJlYWQgID0gYml0bWFwLT5idWZmZXIgKyAoIGhlaWdodCAtIGhlaWdodF9vcmcgKSAqIHBpdGNoOwotICAgICAgRlRfQnl0ZSogIHdyaXRlID0gYml0bWFwLT5idWZmZXI7Ci0gICAgICBGVF9VSW50ICAgaGg7Ci0KLQotICAgICAgZm9yICggaGggPSBoZWlnaHRfb3JnOyBoaCA+IDA7IGhoLS0gKQotICAgICAgewotICAgICAgICBmdF9tZW1jcHkoIHdyaXRlLCByZWFkLCBwaXRjaCApOwotICAgICAgICB3cml0ZSArPSBwaXRjaDsKLQotICAgICAgICBmdF9tZW1jcHkoIHdyaXRlLCByZWFkLCBwaXRjaCApOwotICAgICAgICB3cml0ZSArPSBwaXRjaDsKLQotICAgICAgICBmdF9tZW1jcHkoIHdyaXRlLCByZWFkLCBwaXRjaCApOwotICAgICAgICB3cml0ZSArPSBwaXRjaDsKLSAgICAgICAgcmVhZCAgKz0gcGl0Y2g7Ci0gICAgICB9Ci0gICAgfQotCi0jZW5kaWYgLyogIUZUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfUkVOREVSSU5HICovCi0KLSAgICAvKiBldmVyeXRoaW5nIGlzIGZpbmU7IGRvbid0IGRlYWxsb2NhdGUgYnVmZmVyICovCi0gICAgaGF2ZV9idWZmZXIgPSBGQUxTRTsKLQotICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0gIEV4aXQ6Ci0gICAgaWYgKCBoYXZlX291dGxpbmVfc2hpZnRlZCApCi0gICAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggb3V0bGluZSwgLXhfc2hpZnQsIC15X3NoaWZ0ICk7Ci0gICAgaWYgKCBoYXZlX2J1ZmZlciApCi0gICAgewotICAgICAgRlRfRlJFRSggYml0bWFwLT5idWZmZXIgKTsKLSAgICAgIHNsb3QtPmludGVybmFsLT5mbGFncyAmPSB+RlRfR0xZUEhfT1dOX0JJVE1BUDsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGNvbnZlcnQgYSBzbG90J3MgZ2x5cGggaW1hZ2UgaW50byBhIGJpdG1hcCAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgZnRfc21vb3RoX3JlbmRlciggRlRfUmVuZGVyZXIgICAgICAgcmVuZGVyLAotICAgICAgICAgICAgICAgICAgICBGVF9HbHlwaFNsb3QgICAgICBzbG90LAotICAgICAgICAgICAgICAgICAgICBGVF9SZW5kZXJfTW9kZSAgICBtb2RlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBvcmlnaW4gKQotICB7Ci0gICAgaWYgKCBtb2RlID09IEZUX1JFTkRFUl9NT0RFX0xJR0hUICkKLSAgICAgIG1vZGUgPSBGVF9SRU5ERVJfTU9ERV9OT1JNQUw7Ci0KLSAgICByZXR1cm4gZnRfc21vb3RoX3JlbmRlcl9nZW5lcmljKCByZW5kZXIsIHNsb3QsIG1vZGUsIG9yaWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9SRU5ERVJfTU9ERV9OT1JNQUwgKTsKLSAgfQotCi0KLSAgLyogY29udmVydCBhIHNsb3QncyBnbHlwaCBpbWFnZSBpbnRvIGEgaG9yaXpvbnRhbCBMQ0QgYml0bWFwICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zbW9vdGhfcmVuZGVyX2xjZCggRlRfUmVuZGVyZXIgICAgICAgcmVuZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfR2x5cGhTbG90ICAgICAgc2xvdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICAgIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9WZWN0b3IqICBvcmlnaW4gKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotCi0gICAgZXJyb3IgPSBmdF9zbW9vdGhfcmVuZGVyX2dlbmVyaWMoIHJlbmRlciwgc2xvdCwgbW9kZSwgb3JpZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9SRU5ERVJfTU9ERV9MQ0QgKTsKLSAgICBpZiAoICFlcnJvciApCi0gICAgICBzbG90LT5iaXRtYXAucGl4ZWxfbW9kZSA9IEZUX1BJWEVMX01PREVfTENEOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBjb252ZXJ0IGEgc2xvdCdzIGdseXBoIGltYWdlIGludG8gYSB2ZXJ0aWNhbCBMQ0QgYml0bWFwICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF9zbW9vdGhfcmVuZGVyX2xjZF92KCBGVF9SZW5kZXJlciAgICAgICByZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0dseXBoU2xvdCAgICAgIHNsb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JlbmRlcl9Nb2RlICAgIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1ZlY3RvciogIG9yaWdpbiApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLSAgICBlcnJvciA9IGZ0X3Ntb290aF9yZW5kZXJfZ2VuZXJpYyggcmVuZGVyLCBzbG90LCBtb2RlLCBvcmlnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JFTkRFUl9NT0RFX0xDRF9WICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgc2xvdC0+Yml0bWFwLnBpeGVsX21vZGUgPSBGVF9QSVhFTF9NT0RFX0xDRF9WOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9ERUZJTkVfUkVOREVSRVIoIGZ0X3Ntb290aF9yZW5kZXJlcl9jbGFzcywKLQotICAgICAgRlRfTU9EVUxFX1JFTkRFUkVSLAotICAgICAgc2l6ZW9mICggRlRfUmVuZGVyZXJSZWMgKSwKLQotICAgICAgInNtb290aCIsCi0gICAgICAweDEwMDAwTCwKLSAgICAgIDB4MjAwMDBMLAotCi0gICAgICAwLCAgICAvKiBtb2R1bGUgc3BlY2lmaWMgaW50ZXJmYWNlICovCi0KLSAgICAgIChGVF9Nb2R1bGVfQ29uc3RydWN0b3IpZnRfc21vb3RoX2luaXQsCi0gICAgICAoRlRfTW9kdWxlX0Rlc3RydWN0b3IpIDAsCi0gICAgICAoRlRfTW9kdWxlX1JlcXVlc3RlcikgIDAKLSAgICAsCi0KLSAgICBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSwKLQotICAgIChGVF9SZW5kZXJlcl9SZW5kZXJGdW5jKSAgIGZ0X3Ntb290aF9yZW5kZXIsCi0gICAgKEZUX1JlbmRlcmVyX1RyYW5zZm9ybUZ1bmMpZnRfc21vb3RoX3RyYW5zZm9ybSwKLSAgICAoRlRfUmVuZGVyZXJfR2V0Q0JveEZ1bmMpICBmdF9zbW9vdGhfZ2V0X2Nib3gsCi0gICAgKEZUX1JlbmRlcmVyX1NldE1vZGVGdW5jKSAgZnRfc21vb3RoX3NldF9tb2RlLAotCi0gICAgKEZUX1Jhc3Rlcl9GdW5jcyopICAgICZGVF9HUkFZU19SQVNURVJfR0VUCi0gICkKLQotCi0gIEZUX0RFRklORV9SRU5ERVJFUiggZnRfc21vb3RoX2xjZF9yZW5kZXJlcl9jbGFzcywKLQotICAgICAgRlRfTU9EVUxFX1JFTkRFUkVSLAotICAgICAgc2l6ZW9mICggRlRfUmVuZGVyZXJSZWMgKSwKLQotICAgICAgInNtb290aC1sY2QiLAotICAgICAgMHgxMDAwMEwsCi0gICAgICAweDIwMDAwTCwKLQotICAgICAgMCwgICAgLyogbW9kdWxlIHNwZWNpZmljIGludGVyZmFjZSAqLwotCi0gICAgICAoRlRfTW9kdWxlX0NvbnN0cnVjdG9yKWZ0X3Ntb290aF9pbml0LAotICAgICAgKEZUX01vZHVsZV9EZXN0cnVjdG9yKSAwLAotICAgICAgKEZUX01vZHVsZV9SZXF1ZXN0ZXIpICAwCi0gICAgLAotCi0gICAgRlRfR0xZUEhfRk9STUFUX09VVExJTkUsCi0KLSAgICAoRlRfUmVuZGVyZXJfUmVuZGVyRnVuYykgICBmdF9zbW9vdGhfcmVuZGVyX2xjZCwKLSAgICAoRlRfUmVuZGVyZXJfVHJhbnNmb3JtRnVuYylmdF9zbW9vdGhfdHJhbnNmb3JtLAotICAgIChGVF9SZW5kZXJlcl9HZXRDQm94RnVuYykgIGZ0X3Ntb290aF9nZXRfY2JveCwKLSAgICAoRlRfUmVuZGVyZXJfU2V0TW9kZUZ1bmMpICBmdF9zbW9vdGhfc2V0X21vZGUsCi0KLSAgICAoRlRfUmFzdGVyX0Z1bmNzKikgICAgJkZUX0dSQVlTX1JBU1RFUl9HRVQKLSAgKQotCi0gIEZUX0RFRklORV9SRU5ERVJFUiggZnRfc21vb3RoX2xjZHZfcmVuZGVyZXJfY2xhc3MsCi0KLSAgICAgIEZUX01PRFVMRV9SRU5ERVJFUiwKLSAgICAgIHNpemVvZiAoIEZUX1JlbmRlcmVyUmVjICksCi0KLSAgICAgICJzbW9vdGgtbGNkdiIsCi0gICAgICAweDEwMDAwTCwKLSAgICAgIDB4MjAwMDBMLAotCi0gICAgICAwLCAgICAvKiBtb2R1bGUgc3BlY2lmaWMgaW50ZXJmYWNlICovCi0KLSAgICAgIChGVF9Nb2R1bGVfQ29uc3RydWN0b3IpZnRfc21vb3RoX2luaXQsCi0gICAgICAoRlRfTW9kdWxlX0Rlc3RydWN0b3IpIDAsCi0gICAgICAoRlRfTW9kdWxlX1JlcXVlc3RlcikgIDAKLSAgICAsCi0KLSAgICBGVF9HTFlQSF9GT1JNQVRfT1VUTElORSwKLQotICAgIChGVF9SZW5kZXJlcl9SZW5kZXJGdW5jKSAgIGZ0X3Ntb290aF9yZW5kZXJfbGNkX3YsCi0gICAgKEZUX1JlbmRlcmVyX1RyYW5zZm9ybUZ1bmMpZnRfc21vb3RoX3RyYW5zZm9ybSwKLSAgICAoRlRfUmVuZGVyZXJfR2V0Q0JveEZ1bmMpICBmdF9zbW9vdGhfZ2V0X2Nib3gsCi0gICAgKEZUX1JlbmRlcmVyX1NldE1vZGVGdW5jKSAgZnRfc21vb3RoX3NldF9tb2RlLAotCi0gICAgKEZUX1Jhc3Rlcl9GdW5jcyopICAgICZGVF9HUkFZU19SQVNURVJfR0VUCi0gICkKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvZnRzbW9vdGguaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvZnRzbW9vdGguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY1MDE4Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc21vb3RoL2Z0c21vb3RoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHNtb290aC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQW50aS1hbGlhc2luZyByZW5kZXJlciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVFNNT09USF9IX18KLSNkZWZpbmUgX19GVFNNT09USF9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX1JFTkRFUl9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX05PX1NURF9SQVNURVIKLSAgRlRfREVDTEFSRV9SRU5ERVJFUiggZnRfc3RkX3JlbmRlcmVyX2NsYXNzICkKLSNlbmRpZgotCi0jaWZuZGVmIEZUX0NPTkZJR19PUFRJT05fTk9fU01PT1RIX1JBU1RFUgotICBGVF9ERUNMQVJFX1JFTkRFUkVSKCBmdF9zbW9vdGhfcmVuZGVyZXJfY2xhc3MgKQotCi0gIEZUX0RFQ0xBUkVfUkVOREVSRVIoIGZ0X3Ntb290aF9sY2RfcmVuZGVyZXJfY2xhc3MgKQotCi0gIEZUX0RFQ0xBUkVfUkVOREVSRVIoIGZ0X3Ntb290aF9sY2Rfdl9yZW5kZXJlcl9jbGFzcyApCi0jZW5kaWYKLQotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fRlRTTU9PVEhfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc21vb3RoL2Z0c3BpYy5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3Ntb290aC9mdHNwaWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU2ZWQ1Ny4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc21vb3RoL2Z0c3BpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGZ0c3BpYy5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3Igc21vb3RoIG1vZHVsZS4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlICJmdHNwaWMuaCIKLSNpbmNsdWRlICJmdHNtZXJycy5oIgotCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX1BJQwotCi0gIC8qIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgUElDIGluaXQgZnVuY3Rpb25zIGZyb20gZnRncmF5cy5jICovCi0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc19mdF9ncmF5c19yYXN0ZXIoIEZUX1Jhc3Rlcl9GdW5jcyogIGZ1bmNzICk7Ci0KLQotICB2b2lkCi0gIGZ0X3Ntb290aF9yZW5kZXJlcl9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBGVF9QSUNfQ29udGFpbmVyKiAgcGljX2NvbnRhaW5lciA9ICZsaWJyYXJ5LT5waWNfY29udGFpbmVyOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICBpZiAoIHBpY19jb250YWluZXItPnNtb290aCApCi0gICAgewotICAgICAgU21vb3RoUElDKiAgY29udGFpbmVyID0gKFNtb290aFBJQyopcGljX2NvbnRhaW5lci0+c21vb3RoOwotCi0KLSAgICAgIGlmICggLS1jb250YWluZXItPnJlZl9jb3VudCApCi0gICAgICAgIHJldHVybjsKLQotICAgICAgRlRfRlJFRSggY29udGFpbmVyICk7Ci0gICAgICBwaWNfY29udGFpbmVyLT5zbW9vdGggPSBOVUxMOwotICAgIH0KLSAgfQotCi0KLSAgRlRfRXJyb3IKLSAgZnRfc21vb3RoX3JlbmRlcmVyX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yICAgICAgICAgPSBGVF9FcnJfT2s7Ci0gICAgU21vb3RoUElDKiAgICAgICAgIGNvbnRhaW5lciAgICAgPSBOVUxMOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICAvKiBzaW5jZSB0aGlzIGZ1bmN0aW9uIGFsc28gc2VydmUgc21vb3RoX2xjZCBhbmQgc21vb3RoX2xjZHYgcmVuZGVyZXJzLAotICAgICAgIGl0IGltcGxlbWVudHMgcmVmZXJlbmNlIGNvdW50aW5nICovCi0gICAgaWYgKCBwaWNfY29udGFpbmVyLT5zbW9vdGggKQotICAgIHsKLSAgICAgICgoU21vb3RoUElDKilwaWNfY29udGFpbmVyLT5zbW9vdGgpLT5yZWZfY291bnQrKzsKLSAgICAgIHJldHVybiBlcnJvcjsKLSAgICB9Ci0KLSAgICAvKiBhbGxvY2F0ZSBwb2ludGVyLCBjbGVhciBhbmQgc2V0IGdsb2JhbCBjb250YWluZXIgcG9pbnRlciAqLwotICAgIGlmICggRlRfQUxMT0MoIGNvbnRhaW5lciwgc2l6ZW9mICggKmNvbnRhaW5lciApICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIEZUX01FTV9TRVQoIGNvbnRhaW5lciwgMCwgc2l6ZW9mICggKmNvbnRhaW5lciApICk7Ci0gICAgcGljX2NvbnRhaW5lci0+c21vb3RoID0gY29udGFpbmVyOwotCi0gICAgY29udGFpbmVyLT5yZWZfY291bnQgPSAxOwotCi0gICAgLyogaW5pdGlhbGl6ZSBwb2ludGVyIHRhYmxlIC0gICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogdGhpcyBpcyBob3cgdGhlIG1vZHVsZSB1c3VhbGx5IGV4cGVjdHMgdGhpcyBkYXRhICovCi0gICAgRlRfSW5pdF9DbGFzc19mdF9ncmF5c19yYXN0ZXIoICZjb250YWluZXItPmZ0X2dyYXlzX3Jhc3RlciApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiByZS1yb3V0ZSB0aGVzZSBpbml0IGFuZCBmcmVlIGZ1bmN0aW9ucyB0byB0aGUgYWJvdmUgZnVuY3Rpb25zICovCi0gIEZUX0Vycm9yCi0gIGZ0X3Ntb290aF9sY2RfcmVuZGVyZXJfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgcmV0dXJuIGZ0X3Ntb290aF9yZW5kZXJlcl9jbGFzc19waWNfaW5pdCggbGlicmFyeSApOwotICB9Ci0KLQotICB2b2lkCi0gIGZ0X3Ntb290aF9sY2RfcmVuZGVyZXJfY2xhc3NfcGljX2ZyZWUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKQotICB7Ci0gICAgZnRfc21vb3RoX3JlbmRlcmVyX2NsYXNzX3BpY19mcmVlKCBsaWJyYXJ5ICk7Ci0gIH0KLQotCi0gIEZUX0Vycm9yCi0gIGZ0X3Ntb290aF9sY2R2X3JlbmRlcmVyX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIHJldHVybiBmdF9zbW9vdGhfcmVuZGVyZXJfY2xhc3NfcGljX2luaXQoIGxpYnJhcnkgKTsKLSAgfQotCi0KLSAgdm9pZAotICBmdF9zbW9vdGhfbGNkdl9yZW5kZXJlcl9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApCi0gIHsKLSAgICBmdF9zbW9vdGhfcmVuZGVyZXJfY2xhc3NfcGljX2ZyZWUoIGxpYnJhcnkgKTsKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvZnRzcGljLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc21vb3RoL2Z0c3BpYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzFhZmNmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvZnRzcGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBmdHNwaWMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIHNtb290aCBtb2R1bGUuICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19GVFNQSUNfSF9fCi0jZGVmaW5lIF9fRlRTUElDX0hfXwotCi0KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BJQ19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBGVF9HUkFZU19SQVNURVJfR0VUICBmdF9ncmF5c19yYXN0ZXIKLQotI2Vsc2UgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotICB0eXBlZGVmIHN0cnVjdCAgU21vb3RoUElDXwotICB7Ci0gICAgaW50ICAgICAgICAgICAgICByZWZfY291bnQ7Ci0gICAgRlRfUmFzdGVyX0Z1bmNzICBmdF9ncmF5c19yYXN0ZXI7Ci0KLSAgfSBTbW9vdGhQSUM7Ci0KLQotI2RlZmluZSBHRVRfUElDKCBsaWIgKSBcCi0gICAgICAgICAgKCAoU21vb3RoUElDKikoIChsaWIpLT5waWNfY29udGFpbmVyLnNtb290aCApICkKLSNkZWZpbmUgRlRfR1JBWVNfUkFTVEVSX0dFVCAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPmZ0X2dyYXlzX3Jhc3RlciApCi0KLQotICAvKiBzZWUgZnRzcGljLmMgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiAqLwotICB2b2lkCi0gIGZ0X3Ntb290aF9yZW5kZXJlcl9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0gIHZvaWQKLSAgZnRfc21vb3RoX2xjZF9yZW5kZXJlcl9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0gIHZvaWQKLSAgZnRfc21vb3RoX2xjZHZfcmVuZGVyZXJfY2xhc3NfcGljX2ZyZWUoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotICBGVF9FcnJvcgotICBmdF9zbW9vdGhfcmVuZGVyZXJfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotICBGVF9FcnJvcgotICBmdF9zbW9vdGhfbGNkX3JlbmRlcmVyX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICk7Ci0KLSAgRlRfRXJyb3IKLSAgZnRfc21vb3RoX2xjZHZfcmVuZGVyZXJfY2xhc3NfcGljX2luaXQoIEZUX0xpYnJhcnkgIGxpYnJhcnkgKTsKLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fUElDICovCi0KLSAvKiAqLwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX0ZUU1BJQ19IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvc21vb3RoLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvc21vb3RoL3Ntb290aC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2E0MzQ0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy9zbW9vdGgvc21vb3RoLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBzbW9vdGguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgYW50aS1hbGlhc2luZyByYXN0ZXJlciBtb2R1bGUgY29tcG9uZW50IChib2R5IG9ubHkpLiAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVAotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlICJmdHNwaWMuYyIKLSNpbmNsdWRlICJmdGdyYXlzLmMiCi0jaW5jbHVkZSAiZnRzbW9vdGguYyIKLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS9KYW1maWxlIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL0phbWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4Y2MyNmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL0phbWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0jIEZyZWVUeXBlIDIgc3JjL3RydWV0eXBlIEphbWZpbGUKLSMKLSMgQ29weXJpZ2h0IDIwMDEtMjAxNSBieQotIyBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuCi0jCi0jIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCi0jIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKLSMgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKLSMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKLSMgZnVsbHkuCi0KLVN1YkRpciAgRlQyX1RPUCAkKEZUMl9TUkNfRElSKSB0cnVldHlwZSA7Ci0KLXsKLSAgbG9jYWwgIF9zb3VyY2VzIDsKLQotICBpZiAkKEZUMl9NVUxUSSkKLSAgewotICAgIF9zb3VyY2VzID0gdHRkcml2ZXIKLSAgICAgICAgICAgICAgIHR0Z2xvYWQKLSAgICAgICAgICAgICAgIHR0Z3h2YXIKLSAgICAgICAgICAgICAgIHR0aW50ZXJwCi0gICAgICAgICAgICAgICB0dG9ianMKLSAgICAgICAgICAgICAgIHR0cGljCi0gICAgICAgICAgICAgICB0dHBsb2FkCi0gICAgICAgICAgICAgICB0dHN1YnBpeAotICAgICAgICAgICAgICAgOwotICB9Ci0gIGVsc2UKLSAgewotICAgIF9zb3VyY2VzID0gdHJ1ZXR5cGUgOwotICB9Ci0KLSAgTGlicmFyeSAgJChGVDJfTElCKSA6ICQoX3NvdXJjZXMpLmMgOwotfQotCi0jIGVuZCBvZiBzcmMvdHJ1ZXR5cGUgSmFtZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3RydWV0eXBlLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHJ1ZXR5cGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyOTQzNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHJ1ZXR5cGUuYworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHRydWV0eXBlLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGcmVlVHlwZSBUcnVlVHlwZSBkcml2ZXIgY29tcG9uZW50IChib2R5IG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2RlZmluZSBGVF9NQUtFX09QVElPTl9TSU5HTEVfT0JKRUNUCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgInR0cGljLmMiCi0jaW5jbHVkZSAidHRkcml2ZXIuYyIgICAvKiBkcml2ZXIgaW50ZXJmYWNlICAgICovCi0jaW5jbHVkZSAidHRwbG9hZC5jIiAgICAvKiB0YWJsZXMgbG9hZGVyICAgICAgICovCi0jaW5jbHVkZSAidHRnbG9hZC5jIiAgICAvKiBnbHlwaCBsb2FkZXIgICAgICAgICovCi0jaW5jbHVkZSAidHRvYmpzLmMiICAgICAvKiBvYmplY3QgbWFuYWdlciAgICAgICovCi0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLSNpbmNsdWRlICJ0dGludGVycC5jIgotI2luY2x1ZGUgInR0c3VicGl4LmMiCi0jZW5kaWYKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSNpbmNsdWRlICJ0dGd4dmFyLmMiICAgIC8qIGd4IGRpc3RvcnRhYmxlIGZvbnQgKi8KLSNlbmRpZgotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhiMzBjOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDU2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGRyaXZlci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgZm9udCBkcml2ZXIgaW1wbGVtZW50YXRpb24gKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NGTlRfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9GT05UX0ZPUk1BVF9ICi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0jaW5jbHVkZSBGVF9NVUxUSVBMRV9NQVNURVJTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfTVVMVElQTEVfTUFTVEVSU19ICi0jZW5kaWYKLQotI2luY2x1ZGUgRlRfU0VSVklDRV9UUlVFVFlQRV9FTkdJTkVfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9UUlVFVFlQRV9HTFlGX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUFJPUEVSVElFU19ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9EUklWRVJfSAotCi0jaW5jbHVkZSAidHRkcml2ZXIuaCIKLSNpbmNsdWRlICJ0dGdsb2FkLmgiCi0jaW5jbHVkZSAidHRwbG9hZC5oIgotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotI2luY2x1ZGUgInR0Z3h2YXIuaCIKLSNlbmRpZgotCi0jaW5jbHVkZSAidHRlcnJvcnMuaCIKLQotI2luY2x1ZGUgInR0cGljLmgiCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRkcml2ZXIKLQotCi0gIC8qCi0gICAqICBQUk9QRVJUWSBTRVJWSUNFCi0gICAqCi0gICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfcHJvcGVydHlfc2V0KCBGVF9Nb2R1bGUgICAgbW9kdWxlLCAgICAgICAgIC8qIFRUX0RyaXZlciAqLwotICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBwcm9wZXJ0eV9uYW1lLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqICB2YWx1ZSApCi0gIHsKLSAgICBGVF9FcnJvciAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBUVF9Ecml2ZXIgIGRyaXZlciA9IChUVF9Ecml2ZXIpbW9kdWxlOwotCi0KLSAgICBpZiAoICFmdF9zdHJjbXAoIHByb3BlcnR5X25hbWUsICJpbnRlcnByZXRlci12ZXJzaW9uIiApICkKLSAgICB7Ci0gICAgICBGVF9VSW50KiAgaW50ZXJwcmV0ZXJfdmVyc2lvbiA9IChGVF9VSW50Kil2YWx1ZTsKLQotCi0jaWZuZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotICAgICAgaWYgKCAqaW50ZXJwcmV0ZXJfdmVyc2lvbiAhPSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM1ICkKLSAgICAgICAgZXJyb3IgPSBGVF9FUlIoIFVuaW1wbGVtZW50ZWRfRmVhdHVyZSApOwotICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgIGRyaXZlci0+aW50ZXJwcmV0ZXJfdmVyc2lvbiA9ICppbnRlcnByZXRlcl92ZXJzaW9uOwotCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0UwKCggInR0X3Byb3BlcnR5X3NldDogbWlzc2luZyBwcm9wZXJ0eSBgJXMnXG4iLAotICAgICAgICAgICAgICAgIHByb3BlcnR5X25hbWUgKSk7Ci0gICAgcmV0dXJuIEZUX1RIUk9XKCBNaXNzaW5nX1Byb3BlcnR5ICk7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9wcm9wZXJ0eV9nZXQoIEZUX01vZHVsZSAgICBtb2R1bGUsICAgICAgICAgLyogVFRfRHJpdmVyICovCi0gICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHByb3BlcnR5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogIHZhbHVlICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3IgID0gRlRfRXJyX09rOwotICAgIFRUX0RyaXZlciAgZHJpdmVyID0gKFRUX0RyaXZlciltb2R1bGU7Ci0KLSAgICBGVF9VSW50ICBpbnRlcnByZXRlcl92ZXJzaW9uID0gZHJpdmVyLT5pbnRlcnByZXRlcl92ZXJzaW9uOwotCi0KLSAgICBpZiAoICFmdF9zdHJjbXAoIHByb3BlcnR5X25hbWUsICJpbnRlcnByZXRlci12ZXJzaW9uIiApICkKLSAgICB7Ci0gICAgICBGVF9VSW50KiAgdmFsID0gKEZUX1VJbnQqKXZhbHVlOwotCi0KLSAgICAgICp2YWwgPSBpbnRlcnByZXRlcl92ZXJzaW9uOwotCi0gICAgICByZXR1cm4gZXJyb3I7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0UwKCggInR0X3Byb3BlcnR5X2dldDogbWlzc2luZyBwcm9wZXJ0eSBgJXMnXG4iLAotICAgICAgICAgICAgICAgIHByb3BlcnR5X25hbWUgKSk7Ci0gICAgcmV0dXJuIEZUX1RIUk9XKCBNaXNzaW5nX1Byb3BlcnR5ICk7Ci0gIH0KLQotCi0gIEZUX0RFRklORV9TRVJWSUNFX1BST1BFUlRJRVNSRUMoCi0gICAgdHRfc2VydmljZV9wcm9wZXJ0aWVzLAotICAgIChGVF9Qcm9wZXJ0aWVzX1NldEZ1bmMpdHRfcHJvcGVydHlfc2V0LAotICAgIChGVF9Qcm9wZXJ0aWVzX0dldEZ1bmMpdHRfcHJvcGVydHlfZ2V0ICkKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgIEYgQSBDIEUgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2dldF9rZXJuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZHJpdmVyIG1ldGhvZCB1c2VkIHRvIHJldHVybiB0aGUga2VybmluZyB2ZWN0b3IgYmV0d2VlbiB0d28gICAgICAqLwotICAvKiAgICBnbHlwaHMgb2YgdGhlIHNhbWUgZmFjZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxlZnRfZ2x5cGggIDo6IFRoZSBpbmRleCBvZiB0aGUgbGVmdCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcmlnaHRfZ2x5cGggOjogVGhlIGluZGV4IG9mIHRoZSByaWdodCBnbHlwaCBpbiB0aGUga2VybiBwYWlyLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAga2VybmluZyAgICAgOjogVGhlIGtlcm5pbmcgdmVjdG9yLiAgVGhpcyBpcyBpbiBmb250IHVuaXRzIGZvciAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHNjYWxhYmxlIGZvcm1hdHMsIGFuZCBpbiBwaXhlbHMgZm9yIGZpeGVkLXNpemVzICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBmb3JtYXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbmx5IGhvcml6b250YWwgbGF5b3V0cyAobGVmdC10by1yaWdodCAmIHJpZ2h0LXRvLWxlZnQpIGFyZSAgICAgICAgKi8KLSAgLyogICAgc3VwcG9ydGVkIGJ5IHRoaXMgZnVuY3Rpb24uICBPdGhlciBsYXlvdXRzLCBvciBtb3JlIHNvcGhpc3RpY2F0ZWQgICovCi0gIC8qICAgIGtlcm5pbmdzLCBhcmUgb3V0IG9mIHNjb3BlIG9mIHRoaXMgbWV0aG9kICh0aGUgYmFzaWMgZHJpdmVyICAgICAgICAqLwotICAvKiAgICBpbnRlcmZhY2UgaXMgbWVhbnQgdG8gYmUgc2ltcGxlKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZXkgY2FuIGJlIGltcGxlbWVudGVkIGJ5IGZvcm1hdC1zcGVjaWZpYyBpbnRlcmZhY2VzLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHR0X2dldF9rZXJuaW5nKCBGVF9GYWNlICAgICB0dGZhY2UsICAgICAgICAgIC8qIFRUX0ZhY2UgKi8KLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGxlZnRfZ2x5cGgsCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICByaWdodF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGtlcm5pbmcgKQotICB7Ci0gICAgVFRfRmFjZSAgICAgICBmYWNlID0gKFRUX0ZhY2UpdHRmYWNlOwotICAgIFNGTlRfU2VydmljZSAgc2ZudCA9IChTRk5UX1NlcnZpY2UpZmFjZS0+c2ZudDsKLQotCi0gICAga2VybmluZy0+eCA9IDA7Ci0gICAga2VybmluZy0+eSA9IDA7Ci0KLSAgICBpZiAoIHNmbnQgKQotICAgICAga2VybmluZy0+eCA9IHNmbnQtPmdldF9rZXJuaW5nKCBmYWNlLCBsZWZ0X2dseXBoLCByaWdodF9nbHlwaCApOwotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9nZXRfYWR2YW5jZXMoIEZUX0ZhY2UgICAgdHRmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgIGZsYWdzLAotICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAqYWR2YW5jZXMgKQotICB7Ci0gICAgRlRfVUludCAgbm47Ci0gICAgVFRfRmFjZSAgZmFjZSAgPSAoVFRfRmFjZSkgdHRmYWNlOwotCi0KLSAgICAvKiBYWFg6IFRPRE86IGNoZWNrIGZvciBzYml0cyAqLwotCi0gICAgaWYgKCBmbGFncyAmIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUICkKLSAgICB7Ci0gICAgICBmb3IgKCBubiA9IDA7IG5uIDwgY291bnQ7IG5uKysgKQotICAgICAgewotICAgICAgICBGVF9TaG9ydCAgIHRzYjsKLSAgICAgICAgRlRfVVNob3J0ICBhaDsKLQotCi0gICAgICAgIC8qIHNpbmNlIHdlIGRvbid0IG5lZWQgYHRzYicsIHdlIHVzZSB6ZXJvIGZvciBgeU1heCcgcGFyYW1ldGVyICovCi0gICAgICAgIFRUX0dldF9WTWV0cmljcyggZmFjZSwgc3RhcnQgKyBubiwgMCwgJnRzYiwgJmFoICk7Ci0gICAgICAgIGFkdmFuY2VzW25uXSA9IGFoOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZm9yICggbm4gPSAwOyBubiA8IGNvdW50OyBubisrICkKLSAgICAgIHsKLSAgICAgICAgRlRfU2hvcnQgICBsc2I7Ci0gICAgICAgIEZUX1VTaG9ydCAgYXc7Ci0KLQotICAgICAgICBUVF9HZXRfSE1ldHJpY3MoIGZhY2UsIHN0YXJ0ICsgbm4sICZsc2IsICZhdyApOwotICAgICAgICBhZHZhbmNlc1tubl0gPSBhdzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFMgSSBaIEUgUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0VNQkVEREVEX0JJVE1BUFMKLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfc2l6ZV9zZWxlY3QoIEZUX1NpemUgICBzaXplLAotICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgIHN0cmlrZV9pbmRleCApCi0gIHsKLSAgICBUVF9GYWNlICAgdHRmYWNlID0gKFRUX0ZhY2Upc2l6ZS0+ZmFjZTsKLSAgICBUVF9TaXplICAgdHRzaXplID0gKFRUX1NpemUpc2l6ZTsKLSAgICBGVF9FcnJvciAgZXJyb3IgID0gRlRfRXJyX09rOwotCi0KLSAgICB0dHNpemUtPnN0cmlrZV9pbmRleCA9IHN0cmlrZV9pbmRleDsKLQotICAgIGlmICggRlRfSVNfU0NBTEFCTEUoIHNpemUtPmZhY2UgKSApCi0gICAgewotICAgICAgLyogdXNlIHRoZSBzY2FsZWQgbWV0cmljcywgZXZlbiB3aGVuIHR0X3NpemVfcmVzZXQgZmFpbHMgKi8KLSAgICAgIEZUX1NlbGVjdF9NZXRyaWNzKCBzaXplLT5mYWNlLCBzdHJpa2VfaW5kZXggKTsKLQotICAgICAgdHRfc2l6ZV9yZXNldCggdHRzaXplICk7IC8qIGlnbm9yZSByZXR1cm4gdmFsdWUgKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFNGTlRfU2VydmljZSAgICAgIHNmbnQgICAgPSAoU0ZOVF9TZXJ2aWNlKSB0dGZhY2UtPnNmbnQ7Ci0gICAgICBGVF9TaXplX01ldHJpY3MqICBtZXRyaWNzID0gJnNpemUtPm1ldHJpY3M7Ci0KLQotICAgICAgZXJyb3IgPSBzZm50LT5sb2FkX3N0cmlrZV9tZXRyaWNzKCB0dGZhY2UsIHN0cmlrZV9pbmRleCwgbWV0cmljcyApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIHR0c2l6ZS0+c3RyaWtlX2luZGV4ID0gMHhGRkZGRkZGRlVMOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTICovCi0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfc2l6ZV9yZXF1ZXN0KCBGVF9TaXplICAgICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEgKQotICB7Ci0gICAgVFRfU2l6ZSAgIHR0c2l6ZSA9IChUVF9TaXplKXNpemU7Ci0gICAgRlRfRXJyb3IgIGVycm9yICA9IEZUX0Vycl9PazsKLQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCi0KLSAgICBpZiAoIEZUX0hBU19GSVhFRF9TSVpFUyggc2l6ZS0+ZmFjZSApICkKLSAgICB7Ci0gICAgICBUVF9GYWNlICAgICAgIHR0ZmFjZSA9IChUVF9GYWNlKXNpemUtPmZhY2U7Ci0gICAgICBTRk5UX1NlcnZpY2UgIHNmbnQgICA9IChTRk5UX1NlcnZpY2UpIHR0ZmFjZS0+c2ZudDsKLSAgICAgIEZUX1VMb25nICAgICAgc3RyaWtlX2luZGV4OwotCi0KLSAgICAgIGVycm9yID0gc2ZudC0+c2V0X3NiaXRfc3RyaWtlKCB0dGZhY2UsIHJlcSwgJnN0cmlrZV9pbmRleCApOwotCi0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgdHRzaXplLT5zdHJpa2VfaW5kZXggPSAweEZGRkZGRkZGVUw7Ci0gICAgICBlbHNlCi0gICAgICAgIHJldHVybiB0dF9zaXplX3NlbGVjdCggc2l6ZSwgc3RyaWtlX2luZGV4ICk7Ci0gICAgfQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTICovCi0KLSAgICBGVF9SZXF1ZXN0X01ldHJpY3MoIHNpemUtPmZhY2UsIHJlcSApOwotCi0gICAgaWYgKCBGVF9JU19TQ0FMQUJMRSggc2l6ZS0+ZmFjZSApICkKLSAgICB7Ci0gICAgICBlcnJvciA9IHR0X3NpemVfcmVzZXQoIHR0c2l6ZSApOwotICAgICAgdHRzaXplLT5yb290Lm1ldHJpY3MgPSB0dHNpemUtPm1ldHJpY3M7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9nbHlwaF9sb2FkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGRyaXZlciBtZXRob2QgdXNlZCB0byBsb2FkIGEgZ2x5cGggd2l0aGluIGEgZ2l2ZW4gZ2x5cGggc2xvdC4gICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzbG90ICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IHNsb3Qgb2JqZWN0IHdoZXJlIHRoZSBnbHlwaCAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgd2lsbCBiZSBsb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugc2l6ZSBhdCB3aGljaCB0aGUgZ2x5cGggKi8KLSAgLyogICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzY2FsZWQsIGxvYWRlZCwgZXRjLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGdseXBoIGluIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgIDo6IEEgZmxhZyBpbmRpY2F0aW5nIHdoYXQgdG8gbG9hZCBmb3IgdGhpcyBnbHlwaC4gIFRoZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICBGVF9MT0FEX1hYWCBjb25zdGFudHMgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZ2x5cGggbG9hZGluZyBwcm9jZXNzIChlLmcuLCB3aGV0aGVyIHRoZSBvdXRsaW5lICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBzY2FsZWQsIHdoZXRoZXIgdG8gbG9hZCBiaXRtYXBzIG9yIG5vdCwgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRvIGhpbnQgdGhlIG91dGxpbmUsIGV0YykuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICB0dF9nbHlwaF9sb2FkKCBGVF9HbHlwaFNsb3QgIHR0c2xvdCwgICAgICAvKiBUVF9HbHlwaFNsb3QgKi8KLSAgICAgICAgICAgICAgICAgRlRfU2l6ZSAgICAgICB0dHNpemUsICAgICAgLyogVFRfU2l6ZSAgICAgICovCi0gICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgIEZUX0ludDMyICAgICAgbG9hZF9mbGFncyApCi0gIHsKLSAgICBUVF9HbHlwaFNsb3QgIHNsb3QgPSAoVFRfR2x5cGhTbG90KXR0c2xvdDsKLSAgICBUVF9TaXplICAgICAgIHNpemUgPSAoVFRfU2l6ZSl0dHNpemU7Ci0gICAgRlRfRmFjZSAgICAgICBmYWNlID0gdHRzbG90LT5mYWNlOwotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0KLQotICAgIGlmICggIXNsb3QgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1Nsb3RfSGFuZGxlICk7Ci0KLSAgICBpZiAoICFzaXplICkKLSAgICAgIHJldHVybiBGVF9USFJPVyggSW52YWxpZF9TaXplX0hhbmRsZSApOwotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmFjZV9IYW5kbGUgKTsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICBpZiAoIGdseXBoX2luZGV4ID49IChGVF9VSW50KWZhY2UtPm51bV9nbHlwaHMgJiYKLSAgICAgICAgICFmYWNlLT5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlICAgKQotI2Vsc2UKLSAgICBpZiAoIGdseXBoX2luZGV4ID49IChGVF9VSW50KWZhY2UtPm51bV9nbHlwaHMgKQotI2VuZGlmCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGlmICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fSElOVElORyApCi0gICAgewotICAgICAgLyogYm90aCBGVF9MT0FEX05PX0hJTlRJTkcgYW5kIEZUX0xPQURfTk9fQVVUT0hJTlQgICAqLwotICAgICAgLyogYXJlIG5lY2Vzc2FyeSB0byBkaXNhYmxlIGhpbnRpbmcgZm9yIHRyaWNreSBmb250cyAqLwotCi0gICAgICBpZiAoIEZUX0lTX1RSSUNLWSggZmFjZSApICkKLSAgICAgICAgbG9hZF9mbGFncyAmPSB+RlRfTE9BRF9OT19ISU5USU5HOwotCi0gICAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX0FVVE9ISU5UICkKLSAgICAgICAgbG9hZF9mbGFncyB8PSBGVF9MT0FEX05PX0hJTlRJTkc7Ci0gICAgfQotCi0gICAgaWYgKCBsb2FkX2ZsYWdzICYgKCBGVF9MT0FEX05PX1JFQ1VSU0UgfCBGVF9MT0FEX05PX1NDQUxFICkgKQotICAgIHsKLSAgICAgIGxvYWRfZmxhZ3MgfD0gRlRfTE9BRF9OT19CSVRNQVAgfCBGVF9MT0FEX05PX1NDQUxFOwotCi0gICAgICBpZiAoICFGVF9JU19UUklDS1koIGZhY2UgKSApCi0gICAgICAgIGxvYWRfZmxhZ3MgfD0gRlRfTE9BRF9OT19ISU5USU5HOwotICAgIH0KLQotICAgIC8qIG5vdyBsb2FkIHRoZSBnbHlwaCBvdXRsaW5lIGlmIG5lY2Vzc2FyeSAqLwotICAgIGVycm9yID0gVFRfTG9hZF9HbHlwaCggc2l6ZSwgc2xvdCwgZ2x5cGhfaW5kZXgsIGxvYWRfZmxhZ3MgKTsKLQotICAgIC8qIGZvcmNlIGRyb3Atb3V0IG1vZGUgdG8gMiAtIGlycmVsZXZhbnQgbm93ICovCi0gICAgLyogc2xvdC0+b3V0bGluZS5kcm9wb3V0X21vZGUgPSAyOyAqLwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqICAgICAgICAgICAgICAgIEQgUiBJIFYgRSBSICBJIE4gVCBFIFIgRiBBIEMgRSAgICAgICAgICAgICAgICAgICAqKioqLwotICAvKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKi8KLSAgLyoqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0gIEZUX0RFRklORV9TRVJWSUNFX01VTFRJTUFTVEVSU1JFQygKLSAgICB0dF9zZXJ2aWNlX2d4X211bHRpX21hc3RlcnMsCi0gICAgKEZUX0dldF9NTV9GdW5jKSAgICAgICAgTlVMTCwKLSAgICAoRlRfU2V0X01NX0Rlc2lnbl9GdW5jKSBOVUxMLAotICAgIChGVF9TZXRfTU1fQmxlbmRfRnVuYykgIFRUX1NldF9NTV9CbGVuZCwKLSAgICAoRlRfR2V0X01NX1Zhcl9GdW5jKSAgICBUVF9HZXRfTU1fVmFyLAotICAgIChGVF9TZXRfVmFyX0Rlc2lnbl9GdW5jKVRUX1NldF9WYXJfRGVzaWduICkKLSNlbmRpZgotCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX1RydWVUeXBlRW5naW5lUmVjICB0dF9zZXJ2aWNlX3RydWV0eXBlX2VuZ2luZSA9Ci0gIHsKLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCi0gICAgRlRfVFJVRVRZUEVfRU5HSU5FX1RZUEVfVU5QQVRFTlRFRAotI2Vsc2UKLSAgICBGVF9UUlVFVFlQRV9FTkdJTkVfVFlQRV9QQVRFTlRFRAotI2VuZGlmCi0KLSNlbHNlIC8qICFUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgKi8KLQotICAgIEZUX1RSVUVUWVBFX0VOR0lORV9UWVBFX05PTkUKLQotI2VuZGlmIC8qIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotICB9OwotCi0gIEZUX0RFRklORV9TRVJWSUNFX1RUR0xZRlJFQygKLSAgICB0dF9zZXJ2aWNlX3RydWV0eXBlX2dseWYsCi0gICAgKFRUX0dseWZfR2V0TG9jYXRpb25GdW5jKXR0X2ZhY2VfZ2V0X2xvY2F0aW9uICkKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgRlRfREVGSU5FX1NFUlZJQ0VERVNDUkVDNSgKLSAgICB0dF9zZXJ2aWNlcywKLSAgICBGVF9TRVJWSUNFX0lEX0ZPTlRfRk9STUFULCAgICAgRlRfRk9OVF9GT1JNQVRfVFJVRVRZUEUsCi0gICAgRlRfU0VSVklDRV9JRF9NVUxUSV9NQVNURVJTLCAgICZUVF9TRVJWSUNFX0dYX01VTFRJX01BU1RFUlNfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfVFJVRVRZUEVfRU5HSU5FLCAmdHRfc2VydmljZV90cnVldHlwZV9lbmdpbmUsCi0gICAgRlRfU0VSVklDRV9JRF9UVF9HTFlGLCAgICAgICAgICZUVF9TRVJWSUNFX1RSVUVUWVBFX0dMWUZfR0VULAotICAgIEZUX1NFUlZJQ0VfSURfUFJPUEVSVElFUywgICAgICAmVFRfU0VSVklDRV9QUk9QRVJUSUVTX0dFVCApCi0jZWxzZQotICBGVF9ERUZJTkVfU0VSVklDRURFU0NSRUM0KAotICAgIHR0X3NlcnZpY2VzLAotICAgIEZUX1NFUlZJQ0VfSURfRk9OVF9GT1JNQVQsICAgICBGVF9GT05UX0ZPUk1BVF9UUlVFVFlQRSwKLSAgICBGVF9TRVJWSUNFX0lEX1RSVUVUWVBFX0VOR0lORSwgJnR0X3NlcnZpY2VfdHJ1ZXR5cGVfZW5naW5lLAotICAgIEZUX1NFUlZJQ0VfSURfVFRfR0xZRiwgICAgICAgICAmVFRfU0VSVklDRV9UUlVFVFlQRV9HTFlGX0dFVCwKLSAgICBGVF9TRVJWSUNFX0lEX1BST1BFUlRJRVMsICAgICAgJlRUX1NFUlZJQ0VfUFJPUEVSVElFU19HRVQgKQotI2VuZGlmCi0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX01vZHVsZV9JbnRlcmZhY2UgKQotICB0dF9nZXRfaW50ZXJmYWNlKCBGVF9Nb2R1bGUgICAgZHJpdmVyLCAgICAvKiBUVF9Ecml2ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogIHR0X2ludGVyZmFjZSApCi0gIHsKLSAgICBGVF9MaWJyYXJ5ICAgICAgICAgICBsaWJyYXJ5OwotICAgIEZUX01vZHVsZV9JbnRlcmZhY2UgIHJlc3VsdDsKLSAgICBGVF9Nb2R1bGUgICAgICAgICAgICBzZm50ZDsKLSAgICBTRk5UX1NlcnZpY2UgICAgICAgICBzZm50OwotCi0KLSAgICAvKiBUVF9TRVJWSUNFU19HRVQgZGVyZWZlcmVuY2VzIGBsaWJyYXJ5JyBpbiBQSUMgbW9kZSAqLwotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0gICAgaWYgKCAhZHJpdmVyICkKLSAgICAgIHJldHVybiBOVUxMOwotICAgIGxpYnJhcnkgPSBkcml2ZXItPmxpYnJhcnk7Ci0gICAgaWYgKCAhbGlicmFyeSApCi0gICAgICByZXR1cm4gTlVMTDsKLSNlbmRpZgotCi0gICAgcmVzdWx0ID0gZnRfc2VydmljZV9saXN0X2xvb2t1cCggVFRfU0VSVklDRVNfR0VULCB0dF9pbnRlcmZhY2UgKTsKLSAgICBpZiAoIHJlc3VsdCAhPSBOVUxMICkKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSAgICBpZiAoICFkcml2ZXIgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgbGlicmFyeSA9IGRyaXZlci0+bGlicmFyeTsKLSAgICBpZiAoICFsaWJyYXJ5ICkKLSAgICAgIHJldHVybiBOVUxMOwotI2VuZGlmCi0KLSAgICAvKiBvbmx5IHJldHVybiB0aGUgZGVmYXVsdCBpbnRlcmZhY2UgZnJvbSB0aGUgU0ZOVCBtb2R1bGUgKi8KLSAgICBzZm50ZCA9IEZUX0dldF9Nb2R1bGUoIGxpYnJhcnksICJzZm50IiApOwotICAgIGlmICggc2ZudGQgKQotICAgIHsKLSAgICAgIHNmbnQgPSAoU0ZOVF9TZXJ2aWNlKSggc2ZudGQtPmNsYXp6LT5tb2R1bGVfaW50ZXJmYWNlICk7Ci0gICAgICBpZiAoIHNmbnQgKQotICAgICAgICByZXR1cm4gc2ZudC0+Z2V0X2ludGVyZmFjZSggZHJpdmVyLCB0dF9pbnRlcmZhY2UgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgLyogVGhlIEZUX0RyaXZlckludGVyZmFjZSBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBmdGRyaXZlci5oLiAqLwotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0jZGVmaW5lIFRUX0hJTlRFUl9GTEFHICBGVF9NT0RVTEVfRFJJVkVSX0hBU19ISU5URVIKLSNlbHNlCi0jZGVmaW5lIFRUX0hJTlRFUl9GTEFHICAwCi0jZW5kaWYKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fRU1CRURERURfQklUTUFQUwotI2RlZmluZSBUVF9TSVpFX1NFTEVDVCAgdHRfc2l6ZV9zZWxlY3QKLSNlbHNlCi0jZGVmaW5lIFRUX1NJWkVfU0VMRUNUICAwCi0jZW5kaWYKLQotICBGVF9ERUZJTkVfRFJJVkVSKAotICAgIHR0X2RyaXZlcl9jbGFzcywKLQotICAgICAgRlRfTU9EVUxFX0ZPTlRfRFJJVkVSICAgICB8Ci0gICAgICBGVF9NT0RVTEVfRFJJVkVSX1NDQUxBQkxFIHwKLSAgICAgIFRUX0hJTlRFUl9GTEFHLAotCi0gICAgICBzaXplb2YgKCBUVF9Ecml2ZXJSZWMgKSwKLQotICAgICAgInRydWV0eXBlIiwgICAgICAvKiBkcml2ZXIgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAweDEwMDAwTCwgICAgICAgIC8qIGRyaXZlciB2ZXJzaW9uID09IDEuMCAgICAgICAgICAgICAgICAgKi8KLSAgICAgIDB4MjAwMDBMLCAgICAgICAgLyogZHJpdmVyIHJlcXVpcmVzIEZyZWVUeXBlIDIuMCBvciBhYm92ZSAqLwotCi0gICAgICAodm9pZCopMCwgICAgICAgIC8qIGRyaXZlciBzcGVjaWZpYyBpbnRlcmZhY2UgKi8KLQotICAgICAgdHRfZHJpdmVyX2luaXQsCi0gICAgICB0dF9kcml2ZXJfZG9uZSwKLSAgICAgIHR0X2dldF9pbnRlcmZhY2UsCi0KLSAgICBzaXplb2YgKCBUVF9GYWNlUmVjICksCi0gICAgc2l6ZW9mICggVFRfU2l6ZVJlYyApLAotICAgIHNpemVvZiAoIEZUX0dseXBoU2xvdFJlYyApLAotCi0gICAgdHRfZmFjZV9pbml0LAotICAgIHR0X2ZhY2VfZG9uZSwKLSAgICB0dF9zaXplX2luaXQsCi0gICAgdHRfc2l6ZV9kb25lLAotICAgIHR0X3Nsb3RfaW5pdCwKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgLyogRlRfU2xvdF9Eb25lRnVuYyAqLwotCi0gICAgdHRfZ2x5cGhfbG9hZCwKLQotICAgIHR0X2dldF9rZXJuaW5nLAotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAvKiBGVF9GYWNlX0F0dGFjaEZ1bmMgKi8KLSAgICB0dF9nZXRfYWR2YW5jZXMsCi0KLSAgICB0dF9zaXplX3JlcXVlc3QsCi0gICAgVFRfU0laRV9TRUxFQ1QKLSAgKQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0ZHJpdmVyLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNhY2Q2MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRkcml2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0ZHJpdmVyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBIaWdoLWxldmVsIFRydWVUeXBlIGRyaXZlciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1RURFJJVkVSX0hfXwotI2RlZmluZSBfX1RURFJJVkVSX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfRFJJVkVSX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIEZUX0RFQ0xBUkVfRFJJVkVSKCB0dF9kcml2ZXJfY2xhc3MgKQotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fVFREUklWRVJfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRlcnJvcnMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGVycm9ycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTMyY2Y3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGVycm9ycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRlcnJvcnMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlIGVycm9yIGNvZGVzIChzcGVjaWZpY2F0aW9uIG9ubHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBUcnVlVHlwZSBlcnJvciBlbnVtZXJhdGlvbiAgICAgICAgICAgICovCi0gIC8qIGNvbnN0YW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19UVEVSUk9SU19IX18KLSNkZWZpbmUgX19UVEVSUk9SU19IX18KLQotI2luY2x1ZGUgRlRfTU9EVUxFX0VSUk9SU19ICi0KLSN1bmRlZiBfX0ZURVJST1JTX0hfXwotCi0jdW5kZWYgIEZUX0VSUl9QUkVGSVgKLSNkZWZpbmUgRlRfRVJSX1BSRUZJWCAgVFRfRXJyXwotI2RlZmluZSBGVF9FUlJfQkFTRSAgICBGVF9Nb2RfRXJyX1RydWVUeXBlCi0KLSNpbmNsdWRlIEZUX0VSUk9SU19ICi0KLSNlbmRpZiAvKiBfX1RURVJST1JTX0hfXyAqLwotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGdsb2FkLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRnbG9hZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzkyYWQ0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGdsb2FkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0Z2xvYWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBHbHlwaCBMb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRk5UX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBR1NfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9EUklWRVJfSAotCi0jaW5jbHVkZSAidHRnbG9hZC5oIgotI2luY2x1ZGUgInR0cGxvYWQuaCIKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSNpbmNsdWRlICJ0dGd4dmFyLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgInR0ZXJyb3JzLmgiCi0jaW5jbHVkZSAidHRzdWJwaXguaCIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3R0Z2xvYWQKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQ29tcG9zaXRlIGdseXBoIGZsYWdzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBBUkdTX0FSRV9XT1JEUyAgICAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgQVJHU19BUkVfWFlfVkFMVUVTICAgICAgICAgMHgwMDAyCi0jZGVmaW5lIFJPVU5EX1hZX1RPX0dSSUQgICAgICAgICAgIDB4MDAwNAotI2RlZmluZSBXRV9IQVZFX0FfU0NBTEUgICAgICAgICAgICAweDAwMDgKLS8qIHJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwICovCi0jZGVmaW5lIE1PUkVfQ09NUE9ORU5UUyAgICAgICAgICAgIDB4MDAyMAotI2RlZmluZSBXRV9IQVZFX0FOX1hZX1NDQUxFICAgICAgICAweDAwNDAKLSNkZWZpbmUgV0VfSEFWRV9BXzJYMiAgICAgICAgICAgICAgMHgwMDgwCi0jZGVmaW5lIFdFX0hBVkVfSU5TVFIgICAgICAgICAgICAgIDB4MDEwMAotI2RlZmluZSBVU0VfTVlfTUVUUklDUyAgICAgICAgICAgICAweDAyMDAKLSNkZWZpbmUgT1ZFUkxBUF9DT01QT1VORCAgICAgICAgICAgMHgwNDAwCi0jZGVmaW5lIFNDQUxFRF9DT01QT05FTlRfT0ZGU0VUICAgIDB4MDgwMAotI2RlZmluZSBVTlNDQUxFRF9DT01QT05FTlRfT0ZGU0VUICAweDEwMDAKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUmV0dXJuIHRoZSBob3Jpem9udGFsIG1ldHJpY3MgaW4gZm9udCB1bml0cyBmb3IgYSBnaXZlbiBnbHlwaC4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBUVF9HZXRfSE1ldHJpY3MoIFRUX0ZhY2UgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgIEZUX1Nob3J0KiAgIGxzYiwKLSAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICBhdyApCi0gIHsKLSAgICAoIChTRk5UX1NlcnZpY2UpZmFjZS0+c2ZudCApLT5nZXRfbWV0cmljcyggZmFjZSwgMCwgaWR4LCBsc2IsIGF3ICk7Ci0KLSAgICBGVF9UUkFDRTUoKCAiICBhZHZhbmNlIHdpZHRoIChmb250IHVuaXRzKTogJWRcbiIsICphdyApKTsKLSAgICBGVF9UUkFDRTUoKCAiICBsZWZ0IHNpZGUgYmVhcmluZyAoZm9udCB1bml0cyk6ICVkXG4iLCAqbHNiICkpOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJldHVybiB0aGUgdmVydGljYWwgbWV0cmljcyBpbiBmb250IHVuaXRzIGZvciBhIGdpdmVuIGdseXBoLiAgICAgICAgICAqLwotICAvKiBTZWUgbWFjcm8gYFRUX0xPQURFUl9TRVRfUFAnIGJlbG93IGZvciBleHBsYW5hdGlvbnMuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIFRUX0dldF9WTWV0cmljcyggVFRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeU1heCwKLSAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCogICB0c2IsCi0gICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgYWggKQotICB7Ci0gICAgaWYgKCBmYWNlLT52ZXJ0aWNhbF9pbmZvICkKLSAgICAgICggKFNGTlRfU2VydmljZSlmYWNlLT5zZm50ICktPmdldF9tZXRyaWNzKCBmYWNlLCAxLCBpZHgsIHRzYiwgYWggKTsKLQotICAgIGVsc2UgaWYgKCBmYWNlLT5vczIudmVyc2lvbiAhPSAweEZGRkZVICkKLSAgICB7Ci0gICAgICAqdHNiID0gKEZUX1Nob3J0KSggZmFjZS0+b3MyLnNUeXBvQXNjZW5kZXIgLSB5TWF4ICk7Ci0gICAgICAqYWggID0gKEZUX1VTaG9ydClGVF9BQlMoIGZhY2UtPm9zMi5zVHlwb0FzY2VuZGVyIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+b3MyLnNUeXBvRGVzY2VuZGVyICk7Ci0gICAgfQotCi0gICAgZWxzZQotICAgIHsKLSAgICAgICp0c2IgPSAoRlRfU2hvcnQpKCBmYWNlLT5ob3Jpem9udGFsLkFzY2VuZGVyIC0geU1heCApOwotICAgICAgKmFoICA9IChGVF9VU2hvcnQpRlRfQUJTKCBmYWNlLT5ob3Jpem9udGFsLkFzY2VuZGVyIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+aG9yaXpvbnRhbC5EZXNjZW5kZXIgKTsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTUoKCAiICBhZHZhbmNlIGhlaWdodCAoZm9udCB1bml0cyk6ICVkXG4iLCAqYWggKSk7Ci0gICAgRlRfVFJBQ0U1KCggIiAgdG9wIHNpZGUgYmVhcmluZyAoZm9udCB1bml0cyk6ICVkXG4iLCAqdHNiICkpOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfZ2V0X21ldHJpY3MoIFRUX0xvYWRlciAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBnbHlwaF9pbmRleCApCi0gIHsKLSAgICBUVF9GYWNlICAgIGZhY2UgICA9IGxvYWRlci0+ZmFjZTsKLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICBUVF9Ecml2ZXIgIGRyaXZlciA9IChUVF9Ecml2ZXIpRlRfRkFDRV9EUklWRVIoIGZhY2UgKTsKLSNlbmRpZgotCi0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGxvYWRlci0+c3RyZWFtOwotCi0gICAgRlRfU2hvcnQgICBsZWZ0X2JlYXJpbmcgPSAwLCB0b3BfYmVhcmluZyA9IDA7Ci0gICAgRlRfVVNob3J0ICBhZHZhbmNlX3dpZHRoID0gMCwgYWR2YW5jZV9oZWlnaHQgPSAwOwotCi0gICAgLyogd2UgbXVzdCBwcmVzZXJ2ZSB0aGUgc3RyZWFtIHBvc2l0aW9uICAgICAgICAgICovCi0gICAgLyogKHdoaWNoIGdldHMgYWx0ZXJlZCBieSB0aGUgbWV0cmljcyBmdW5jdGlvbnMpICovCi0gICAgRlRfVUxvbmcgIHBvcyA9IEZUX1NUUkVBTV9QT1MoKTsKLQotCi0gICAgVFRfR2V0X0hNZXRyaWNzKCBmYWNlLCBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICZsZWZ0X2JlYXJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAmYWR2YW5jZV93aWR0aCApOwotICAgIFRUX0dldF9WTWV0cmljcyggZmFjZSwgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICBsb2FkZXItPmJib3gueU1heCwKLSAgICAgICAgICAgICAgICAgICAgICZ0b3BfYmVhcmluZywKLSAgICAgICAgICAgICAgICAgICAgICZhZHZhbmNlX2hlaWdodCApOwotCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggcG9zICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgbG9hZGVyLT5sZWZ0X2JlYXJpbmcgPSBsZWZ0X2JlYXJpbmc7Ci0gICAgbG9hZGVyLT5hZHZhbmNlICAgICAgPSBhZHZhbmNlX3dpZHRoOwotICAgIGxvYWRlci0+dG9wX2JlYXJpbmcgID0gdG9wX2JlYXJpbmc7Ci0gICAgbG9hZGVyLT52YWR2YW5jZSAgICAgPSBhZHZhbmNlX2hlaWdodDsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotICAgIGlmICggZHJpdmVyLT5pbnRlcnByZXRlcl92ZXJzaW9uID09IFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fMzggJiYKLSAgICAgICAgIGxvYWRlci0+ZXhlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICB7Ci0gICAgICBsb2FkZXItPmV4ZWMtPnNwaF90d2Vha19mbGFncyA9IDA7Ci0KLSAgICAgIC8qIFRoaXMgbWF5IG5vdCBiZSB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMsIGJ1dCBpdCB3b3Jrcy4uLiAgKi8KLSAgICAgIC8qIE5vdGUgdGhhdCB3ZSBoYXZlIHRvIHVuY29uZGl0aW9uYWxseSBsb2FkIHRoZSB0d2Vha3Mgc2luY2UgKi8KLSAgICAgIC8qIGl0IGlzIHBvc3NpYmxlIHRoYXQgZ2x5cGhzIGluZGl2aWR1YWxseSBzd2l0Y2ggQ2xlYXJUeXBlJ3MgKi8KLSAgICAgIC8qIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG1vZGUgb24gYW5kIG9mZi4gICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIHNwaF9zZXRfdHdlYWtzKCBsb2FkZXIsIGdseXBoX2luZGV4ICk7Ci0gICAgfQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwotCi0gICAgaWYgKCAhbG9hZGVyLT5saW5lYXJfZGVmICkKLSAgICB7Ci0gICAgICBsb2FkZXItPmxpbmVhcl9kZWYgPSAxOwotICAgICAgbG9hZGVyLT5saW5lYXIgICAgID0gYWR2YW5jZV93aWR0aDsKLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLQotICBzdGF0aWMgdm9pZAotICB0dF9nZXRfbWV0cmljc19pbmNyX292ZXJyaWRlcyggVFRfTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGdseXBoX2luZGV4ICkKLSAgewotICAgIFRUX0ZhY2UgIGZhY2UgPSBsb2FkZXItPmZhY2U7Ci0KLSAgICBGVF9TaG9ydCAgIGxlZnRfYmVhcmluZyA9IDAsIHRvcF9iZWFyaW5nID0gMDsKLSAgICBGVF9VU2hvcnQgIGFkdmFuY2Vfd2lkdGggPSAwLCBhZHZhbmNlX2hlaWdodCA9IDA7Ci0KLQotICAgIC8qIElmIHRoaXMgaXMgYW4gaW5jcmVtZW50YWxseSBsb2FkZWQgZm9udCBjaGVjayB3aGV0aGVyIHRoZXJlIGFyZSAqLwotICAgIC8qIG92ZXJyaWRpbmcgbWV0cmljcyBmb3IgdGhpcyBnbHlwaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+ZnVuY3MtPmdldF9nbHlwaF9tZXRyaWNzICkKLSAgICB7Ci0gICAgICBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzUmVjICBtZXRyaWNzOwotICAgICAgRlRfRXJyb3IgICAgICAgICAgICAgICAgICAgZXJyb3I7Ci0KLQotICAgICAgbWV0cmljcy5iZWFyaW5nX3ggPSBsb2FkZXItPmxlZnRfYmVhcmluZzsKLSAgICAgIG1ldHJpY3MuYmVhcmluZ195ID0gMDsKLSAgICAgIG1ldHJpY3MuYWR2YW5jZSAgID0gbG9hZGVyLT5hZHZhbmNlOwotICAgICAgbWV0cmljcy5hZHZhbmNlX3YgPSAwOwotCi0gICAgICBlcnJvciA9IGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+ZnVuY3MtPmdldF9nbHlwaF9tZXRyaWNzKAotICAgICAgICAgICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+b2JqZWN0LAotICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LCBGQUxTRSwgJm1ldHJpY3MgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGxlZnRfYmVhcmluZyAgPSAoRlRfU2hvcnQpbWV0cmljcy5iZWFyaW5nX3g7Ci0gICAgICBhZHZhbmNlX3dpZHRoID0gKEZUX1VTaG9ydCltZXRyaWNzLmFkdmFuY2U7Ci0KLSNpZiAwCi0KLSAgICAgIC8qIEdXVzogRG8gSSBkbyB0aGUgc2FtZSBmb3IgdmVydGljYWwgbWV0cmljcz8gKi8KLSAgICAgIG1ldHJpY3MuYmVhcmluZ194ID0gMDsKLSAgICAgIG1ldHJpY3MuYmVhcmluZ195ID0gbG9hZGVyLT50b3BfYmVhcmluZzsKLSAgICAgIG1ldHJpY3MuYWR2YW5jZSAgID0gbG9hZGVyLT52YWR2YW5jZTsKLQotICAgICAgZXJyb3IgPSBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPmZ1bmNzLT5nZXRfZ2x5cGhfbWV0cmljcygKLSAgICAgICAgICAgICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPm9iamVjdCwKLSAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwgVFJVRSwgJm1ldHJpY3MgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIHRvcF9iZWFyaW5nICAgID0gKEZUX1Nob3J0KW1ldHJpY3MuYmVhcmluZ195OwotICAgICAgYWR2YW5jZV9oZWlnaHQgPSAoRlRfVVNob3J0KW1ldHJpY3MuYWR2YW5jZTsKLQotI2VuZGlmIC8qIDAgKi8KLQotICAgICAgbG9hZGVyLT5sZWZ0X2JlYXJpbmcgPSBsZWZ0X2JlYXJpbmc7Ci0gICAgICBsb2FkZXItPmFkdmFuY2UgICAgICA9IGFkdmFuY2Vfd2lkdGg7Ci0gICAgICBsb2FkZXItPnRvcF9iZWFyaW5nICA9IHRvcF9iZWFyaW5nOwotICAgICAgbG9hZGVyLT52YWR2YW5jZSAgICAgPSBhZHZhbmNlX2hlaWdodDsKLQotICAgICAgaWYgKCAhbG9hZGVyLT5saW5lYXJfZGVmICkKLSAgICAgIHsKLSAgICAgICAgbG9hZGVyLT5saW5lYXJfZGVmID0gMTsKLSAgICAgICAgbG9hZGVyLT5saW5lYXIgICAgID0gYWR2YW5jZV93aWR0aDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm47Ci0gIH0KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIHVzZWQgYnkgZGVmYXVsdCB3aXRoIFRydWVUeXBlIGZvbnRzLiAgICAgICovCi0gIC8qIEhvd2V2ZXIsIHRoZXkgY2FuIGJlIHJlcGxhY2VkIGJ5IGFsdGVybmF0aXZlcyBpZiB3ZSBuZWVkIHRvIHN1cHBvcnQgICAqLwotICAvKiBUcnVlVHlwZS1jb21wcmVzc2VkIGZvcm1hdHMgKGxpa2UgTWljcm9UeXBlKSBpbiB0aGUgZnV0dXJlLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBUVF9BY2Nlc3NfR2x5cGhfRnJhbWUoIFRUX0xvYWRlciAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBieXRlX2NvdW50ICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfU3RyZWFtICBzdHJlYW0gPSBsb2FkZXItPnN0cmVhbTsKLQotICAgIC8qIGZvciBub24tZGVidWcgbW9kZSAqLwotICAgIEZUX1VOVVNFRCggZ2x5cGhfaW5kZXggKTsKLQotCi0gICAgRlRfVFJBQ0U0KCggIkdseXBoICVsZFxuIiwgZ2x5cGhfaW5kZXggKSk7Ci0KLSAgICAvKiB0aGUgZm9sbG93aW5nIGxpbmUgc2V0cyB0aGUgYGVycm9yJyB2YXJpYWJsZSB0aHJvdWdoIG1hY3JvcyEgKi8KLSAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBvZmZzZXQgKSB8fCBGVF9GUkFNRV9FTlRFUiggYnl0ZV9jb3VudCApICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGxvYWRlci0+Y3Vyc29yID0gc3RyZWFtLT5jdXJzb3I7Ci0gICAgbG9hZGVyLT5saW1pdCAgPSBzdHJlYW0tPmxpbWl0OwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCB2b2lkICkKLSAgVFRfRm9yZ2V0X0dseXBoX0ZyYW1lKCBUVF9Mb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGxvYWRlci0+c3RyZWFtOwotCi0KLSAgICBGVF9GUkFNRV9FWElUKCk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBUVF9Mb2FkX0dseXBoX0hlYWRlciggVFRfTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgRlRfQnl0ZSogIHAgICAgID0gbG9hZGVyLT5jdXJzb3I7Ci0gICAgRlRfQnl0ZSogIGxpbWl0ID0gbG9hZGVyLT5saW1pdDsKLQotCi0gICAgaWYgKCBwICsgMTAgPiBsaW1pdCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfT3V0bGluZSApOwotCi0gICAgbG9hZGVyLT5uX2NvbnRvdXJzID0gRlRfTkVYVF9TSE9SVCggcCApOwotCi0gICAgbG9hZGVyLT5iYm94LnhNaW4gPSBGVF9ORVhUX1NIT1JUKCBwICk7Ci0gICAgbG9hZGVyLT5iYm94LnlNaW4gPSBGVF9ORVhUX1NIT1JUKCBwICk7Ci0gICAgbG9hZGVyLT5iYm94LnhNYXggPSBGVF9ORVhUX1NIT1JUKCBwICk7Ci0gICAgbG9hZGVyLT5iYm94LnlNYXggPSBGVF9ORVhUX1NIT1JUKCBwICk7Ci0KLSAgICBGVF9UUkFDRTUoKCAiICAjIG9mIGNvbnRvdXJzOiAlZFxuIiwgbG9hZGVyLT5uX2NvbnRvdXJzICkpOwotICAgIEZUX1RSQUNFNSgoICIgIHhNaW46ICU0ZCAgeE1heDogJTRkXG4iLCBsb2FkZXItPmJib3gueE1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLT5iYm94LnhNYXggKSk7Ci0gICAgRlRfVFJBQ0U1KCggIiAgeU1pbjogJTRkICB5TWF4OiAlNGRcbiIsIGxvYWRlci0+YmJveC55TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXItPmJib3gueU1heCApKTsKLSAgICBsb2FkZXItPmN1cnNvciA9IHA7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0Vycm9yICkKLSAgVFRfTG9hZF9TaW1wbGVfR2x5cGgoIFRUX0xvYWRlciAgbG9hZCApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0gICAgRlRfQnl0ZSogICAgICAgIHAgICAgICAgICAgPSBsb2FkLT5jdXJzb3I7Ci0gICAgRlRfQnl0ZSogICAgICAgIGxpbWl0ICAgICAgPSBsb2FkLT5saW1pdDsKLSAgICBGVF9HbHlwaExvYWRlciAgZ2xvYWRlciAgICA9IGxvYWQtPmdsb2FkZXI7Ci0gICAgRlRfSW50ICAgICAgICAgIG5fY29udG91cnMgPSBsb2FkLT5uX2NvbnRvdXJzOwotICAgIEZUX091dGxpbmUqICAgICBvdXRsaW5lOwotICAgIEZUX1VTaG9ydCAgICAgICBuX2luczsKLSAgICBGVF9JbnQgICAgICAgICAgbl9wb2ludHM7Ci0gICAgRlRfVUxvbmcgICAgICAgIHRtcDsKLQotICAgIEZUX0J5dGUgICAgICAgICAqZmxhZywgKmZsYWdfbGltaXQ7Ci0gICAgRlRfQnl0ZSAgICAgICAgIGMsIGNvdW50OwotICAgIEZUX1ZlY3RvciAgICAgICAqdmVjLCAqdmVjX2xpbWl0OwotICAgIEZUX1BvcyAgICAgICAgICB4OwotICAgIEZUX1Nob3J0ICAgICAgICAqY29udCwgKmNvbnRfbGltaXQsIHByZXZfY29udDsKLSAgICBGVF9JbnQgICAgICAgICAgeHlfc2l6ZSA9IDA7Ci0KLQotICAgIC8qIGNoZWNrIHRoYXQgd2UgY2FuIGFkZCB0aGUgY29udG91cnMgdG8gdGhlIGdseXBoICovCi0gICAgZXJyb3IgPSBGVF9HTFlQSExPQURFUl9DSEVDS19QT0lOVFMoIGdsb2FkZXIsIDAsIG5fY29udG91cnMgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIC8qIHJlYWRpbmcgdGhlIGNvbnRvdXJzJyBlbmRwb2ludHMgJiBudW1iZXIgb2YgcG9pbnRzICovCi0gICAgY29udCAgICAgICA9IGdsb2FkZXItPmN1cnJlbnQub3V0bGluZS5jb250b3VyczsKLSAgICBjb250X2xpbWl0ID0gY29udCArIG5fY29udG91cnM7Ci0KLSAgICAvKiBjaGVjayBzcGFjZSBmb3IgY29udG91cnMgYXJyYXkgKyBpbnN0cnVjdGlvbnMgY291bnQgKi8KLSAgICBpZiAoIG5fY29udG91cnMgPj0gMHhGRkYgfHwgcCArICggbl9jb250b3VycyArIDEgKSAqIDIgPiBsaW1pdCApCi0gICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgIHByZXZfY29udCA9IEZUX05FWFRfU0hPUlQoIHAgKTsKLQotICAgIGlmICggbl9jb250b3VycyA+IDAgKQotICAgICAgY29udFswXSA9IHByZXZfY29udDsKLQotICAgIGlmICggcHJldl9jb250IDwgMCApCi0gICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgIGZvciAoIGNvbnQrKzsgY29udCA8IGNvbnRfbGltaXQ7IGNvbnQrKyApCi0gICAgewotICAgICAgY29udFswXSA9IEZUX05FWFRfU0hPUlQoIHAgKTsKLSAgICAgIGlmICggY29udFswXSA8PSBwcmV2X2NvbnQgKQotICAgICAgewotICAgICAgICAvKiB1bm9yZGVyZWQgY29udG91cnM6IHRoaXMgaXMgaW52YWxpZCAqLwotICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLSAgICAgIH0KLSAgICAgIHByZXZfY29udCA9IGNvbnRbMF07Ci0gICAgfQotCi0gICAgbl9wb2ludHMgPSAwOwotICAgIGlmICggbl9jb250b3VycyA+IDAgKQotICAgIHsKLSAgICAgIG5fcG9pbnRzID0gY29udFstMV0gKyAxOwotICAgICAgaWYgKCBuX3BvaW50cyA8IDAgKQotICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLSAgICB9Ci0KLSAgICAvKiBub3RlIHRoYXQgd2Ugd2lsbCBhZGQgZm91ciBwaGFudG9tIHBvaW50cyBsYXRlciAqLwotICAgIGVycm9yID0gRlRfR0xZUEhMT0FERVJfQ0hFQ0tfUE9JTlRTKCBnbG9hZGVyLCBuX3BvaW50cyArIDQsIDAgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIC8qIHJlYWRpbmcgdGhlIGJ5dGVjb2RlIGluc3RydWN0aW9ucyAqLwotICAgIGxvYWQtPmdseXBoLT5jb250cm9sX2xlbiAgPSAwOwotICAgIGxvYWQtPmdseXBoLT5jb250cm9sX2RhdGEgPSBOVUxMOwotCi0gICAgaWYgKCBwICsgMiA+IGxpbWl0ICkKLSAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotCi0gICAgbl9pbnMgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotCi0gICAgRlRfVFJBQ0U1KCggIiAgSW5zdHJ1Y3Rpb25zIHNpemU6ICV1XG4iLCBuX2lucyApKTsKLQotICAgIC8qIGNoZWNrIGl0ICovCi0gICAgaWYgKCAoIGxpbWl0IC0gcCApIDwgbl9pbnMgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMCgoICJUVF9Mb2FkX1NpbXBsZV9HbHlwaDogaW5zdHJ1Y3Rpb24gY291bnQgbWlzbWF0Y2hcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBUb29fTWFueV9IaW50cyApOwotICAgICAgZ290byBGYWlsOwotICAgIH0KLQotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotCi0gICAgaWYgKCBJU19ISU5URUQoIGxvYWQtPmxvYWRfZmxhZ3MgKSApCi0gICAgewotICAgICAgLyogd2UgZG9uJ3QgdHJ1c3QgYG1heFNpemVPZkluc3RydWN0aW9ucycgaW4gdGhlIGBtYXhwJyB0YWJsZSAqLwotICAgICAgLyogYW5kIHRodXMgdXBkYXRlIHRoZSBieXRlY29kZSBhcnJheSBzaXplIGJ5IG91cnNlbHZlcyAgICAgICAqLwotCi0gICAgICB0bXAgICA9IGxvYWQtPmV4ZWMtPmdseXBoU2l6ZTsKLSAgICAgIGVycm9yID0gVXBkYXRlX01heCggbG9hZC0+ZXhlYy0+bWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCBGVF9CeXRlICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikmbG9hZC0+ZXhlYy0+Z2x5cGhJbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5faW5zICk7Ci0KLSAgICAgIGxvYWQtPmV4ZWMtPmdseXBoU2l6ZSA9IChGVF9VU2hvcnQpdG1wOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgbG9hZC0+Z2x5cGgtPmNvbnRyb2xfbGVuICA9IG5faW5zOwotICAgICAgbG9hZC0+Z2x5cGgtPmNvbnRyb2xfZGF0YSA9IGxvYWQtPmV4ZWMtPmdseXBoSW5zOwotCi0gICAgICBGVF9NRU1fQ09QWSggbG9hZC0+ZXhlYy0+Z2x5cGhJbnMsIHAsIChGVF9Mb25nKW5faW5zICk7Ci0gICAgfQotCi0jZW5kaWYgLyogVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSICovCi0KLSAgICBwICs9IG5faW5zOwotCi0gICAgb3V0bGluZSA9ICZnbG9hZGVyLT5jdXJyZW50Lm91dGxpbmU7Ci0KLSAgICAvKiByZWFkaW5nIHRoZSBwb2ludCB0YWdzICovCi0gICAgZmxhZyAgICAgICA9IChGVF9CeXRlKilvdXRsaW5lLT50YWdzOwotICAgIGZsYWdfbGltaXQgPSBmbGFnICsgbl9wb2ludHM7Ci0KLSAgICBGVF9BU1NFUlQoIGZsYWcgIT0gTlVMTCApOwotCi0gICAgd2hpbGUgKCBmbGFnIDwgZmxhZ19saW1pdCApCi0gICAgewotICAgICAgaWYgKCBwICsgMSA+IGxpbWl0ICkKLSAgICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAgICpmbGFnKysgPSBjID0gRlRfTkVYVF9CWVRFKCBwICk7Ci0gICAgICBpZiAoIGMgJiA4ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBwICsgMSA+IGxpbWl0ICkKLSAgICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgICAgICBjb3VudCA9IEZUX05FWFRfQllURSggcCApOwotICAgICAgICBpZiAoIGZsYWcgKyAoRlRfSW50KWNvdW50ID4gZmxhZ19saW1pdCApCi0gICAgICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAgICAgZm9yICggOyBjb3VudCA+IDA7IGNvdW50LS0gKQotICAgICAgICAgICpmbGFnKysgPSBjOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIHJlYWRpbmcgdGhlIFggY29vcmRpbmF0ZXMgKi8KLQotICAgIHZlYyAgICAgICA9IG91dGxpbmUtPnBvaW50czsKLSAgICB2ZWNfbGltaXQgPSB2ZWMgKyBuX3BvaW50czsKLSAgICBmbGFnICAgICAgPSAoRlRfQnl0ZSopb3V0bGluZS0+dGFnczsKLSAgICB4ICAgICAgICAgPSAwOwotCi0gICAgaWYgKCBwICsgeHlfc2l6ZSA+IGxpbWl0ICkKLSAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotCi0gICAgZm9yICggOyB2ZWMgPCB2ZWNfbGltaXQ7IHZlYysrLCBmbGFnKysgKQotICAgIHsKLSAgICAgIEZUX1BvcyAgIHkgPSAwOwotICAgICAgRlRfQnl0ZSAgZiA9ICpmbGFnOwotCi0KLSAgICAgIGlmICggZiAmIDIgKQotICAgICAgewotICAgICAgICBpZiAoIHAgKyAxID4gbGltaXQgKQotICAgICAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotCi0gICAgICAgIHkgPSAoRlRfUG9zKUZUX05FWFRfQllURSggcCApOwotICAgICAgICBpZiAoICggZiAmIDE2ICkgPT0gMCApCi0gICAgICAgICAgeSA9IC15OwotICAgICAgfQotICAgICAgZWxzZSBpZiAoICggZiAmIDE2ICkgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggcCArIDIgPiBsaW1pdCApCi0gICAgICAgICAgZ290byBJbnZhbGlkX091dGxpbmU7Ci0KLSAgICAgICAgeSA9IChGVF9Qb3MpRlRfTkVYVF9TSE9SVCggcCApOwotICAgICAgfQotCi0gICAgICB4ICAgICArPSB5OwotICAgICAgdmVjLT54ID0geDsKLSAgICAgIC8qIHRoZSBjYXN0IGlzIGZvciBzdHVwaWQgY29tcGlsZXJzICovCi0gICAgICAqZmxhZyAgPSAoRlRfQnl0ZSkoIGYgJiB+KCAyIHwgMTYgKSApOwotICAgIH0KLQotICAgIC8qIHJlYWRpbmcgdGhlIFkgY29vcmRpbmF0ZXMgKi8KLQotICAgIHZlYyAgICAgICA9IGdsb2FkZXItPmN1cnJlbnQub3V0bGluZS5wb2ludHM7Ci0gICAgdmVjX2xpbWl0ID0gdmVjICsgbl9wb2ludHM7Ci0gICAgZmxhZyAgICAgID0gKEZUX0J5dGUqKW91dGxpbmUtPnRhZ3M7Ci0gICAgeCAgICAgICAgID0gMDsKLQotICAgIGZvciAoIDsgdmVjIDwgdmVjX2xpbWl0OyB2ZWMrKywgZmxhZysrICkKLSAgICB7Ci0gICAgICBGVF9Qb3MgICB5ID0gMDsKLSAgICAgIEZUX0J5dGUgIGYgPSAqZmxhZzsKLQotCi0gICAgICBpZiAoIGYgJiA0ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBwICsgMSA+IGxpbWl0ICkKLSAgICAgICAgICBnb3RvIEludmFsaWRfT3V0bGluZTsKLQotICAgICAgICB5ID0gKEZUX1BvcylGVF9ORVhUX0JZVEUoIHAgKTsKLSAgICAgICAgaWYgKCAoIGYgJiAzMiApID09IDAgKQotICAgICAgICAgIHkgPSAteTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCAoIGYgJiAzMiApID09IDAgKQotICAgICAgewotICAgICAgICBpZiAoIHAgKyAyID4gbGltaXQgKQotICAgICAgICAgIGdvdG8gSW52YWxpZF9PdXRsaW5lOwotCi0gICAgICAgIHkgPSAoRlRfUG9zKUZUX05FWFRfU0hPUlQoIHAgKTsKLSAgICAgIH0KLQotICAgICAgeCAgICAgKz0geTsKLSAgICAgIHZlYy0+eSA9IHg7Ci0gICAgICAvKiB0aGUgY2FzdCBpcyBmb3Igc3R1cGlkIGNvbXBpbGVycyAqLwotICAgICAgKmZsYWcgID0gKEZUX0J5dGUpKCBmICYgRlRfQ1VSVkVfVEFHX09OICk7Ci0gICAgfQotCi0gICAgb3V0bGluZS0+bl9wb2ludHMgICA9IChGVF9TaG9ydCluX3BvaW50czsKLSAgICBvdXRsaW5lLT5uX2NvbnRvdXJzID0gKEZUX1Nob3J0KW5fY29udG91cnM7Ci0KLSAgICBsb2FkLT5jdXJzb3IgPSBwOwotCi0gIEZhaWw6Ci0gICAgcmV0dXJuIGVycm9yOwotCi0gIEludmFsaWRfT3V0bGluZToKLSAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX091dGxpbmUgKTsKLSAgICBnb3RvIEZhaWw7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBUVF9Mb2FkX0NvbXBvc2l0ZV9HbHlwaCggVFRfTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yOwotICAgIEZUX0J5dGUqICAgICAgICBwICAgICAgID0gbG9hZGVyLT5jdXJzb3I7Ci0gICAgRlRfQnl0ZSogICAgICAgIGxpbWl0ICAgPSBsb2FkZXItPmxpbWl0OwotICAgIEZUX0dseXBoTG9hZGVyICBnbG9hZGVyID0gbG9hZGVyLT5nbG9hZGVyOwotICAgIEZUX1N1YkdseXBoICAgICBzdWJnbHlwaDsKLSAgICBGVF9VSW50ICAgICAgICAgbnVtX3N1YmdseXBoczsKLQotCi0gICAgbnVtX3N1YmdseXBocyA9IDA7Ci0KLSAgICBkbwotICAgIHsKLSAgICAgIEZUX0ZpeGVkICB4eCwgeHksIHl5LCB5eDsKLSAgICAgIEZUX1VJbnQgICBjb3VudDsKLQotCi0gICAgICAvKiBjaGVjayB0aGF0IHdlIGNhbiBsb2FkIGEgbmV3IHN1YmdseXBoICovCi0gICAgICBlcnJvciA9IEZUX0dseXBoTG9hZGVyX0NoZWNrU3ViR2x5cGhzKCBnbG9hZGVyLCBudW1fc3ViZ2x5cGhzICsgMSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgLyogY2hlY2sgc3BhY2UgKi8KLSAgICAgIGlmICggcCArIDQgPiBsaW1pdCApCi0gICAgICAgIGdvdG8gSW52YWxpZF9Db21wb3NpdGU7Ci0KLSAgICAgIHN1YmdseXBoID0gZ2xvYWRlci0+Y3VycmVudC5zdWJnbHlwaHMgKyBudW1fc3ViZ2x5cGhzOwotCi0gICAgICBzdWJnbHlwaC0+YXJnMSA9IHN1YmdseXBoLT5hcmcyID0gMDsKLQotICAgICAgc3ViZ2x5cGgtPmZsYWdzID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgIHN1YmdseXBoLT5pbmRleCA9IEZUX05FWFRfVVNIT1JUKCBwICk7Ci0KLSAgICAgIC8qIGNoZWNrIHNwYWNlICovCi0gICAgICBjb3VudCA9IDI7Ci0gICAgICBpZiAoIHN1YmdseXBoLT5mbGFncyAmIEFSR1NfQVJFX1dPUkRTICkKLSAgICAgICAgY291bnQgKz0gMjsKLSAgICAgIGlmICggc3ViZ2x5cGgtPmZsYWdzICYgV0VfSEFWRV9BX1NDQUxFICkKLSAgICAgICAgY291bnQgKz0gMjsKLSAgICAgIGVsc2UgaWYgKCBzdWJnbHlwaC0+ZmxhZ3MgJiBXRV9IQVZFX0FOX1hZX1NDQUxFICkKLSAgICAgICAgY291bnQgKz0gNDsKLSAgICAgIGVsc2UgaWYgKCBzdWJnbHlwaC0+ZmxhZ3MgJiBXRV9IQVZFX0FfMlgyICkKLSAgICAgICAgY291bnQgKz0gODsKLQotICAgICAgaWYgKCBwICsgY291bnQgPiBsaW1pdCApCi0gICAgICAgIGdvdG8gSW52YWxpZF9Db21wb3NpdGU7Ci0KLSAgICAgIC8qIHJlYWQgYXJndW1lbnRzICovCi0gICAgICBpZiAoIHN1YmdseXBoLT5mbGFncyAmIEFSR1NfQVJFX1hZX1ZBTFVFUyApCi0gICAgICB7Ci0gICAgICAgIGlmICggc3ViZ2x5cGgtPmZsYWdzICYgQVJHU19BUkVfV09SRFMgKQotICAgICAgICB7Ci0gICAgICAgICAgc3ViZ2x5cGgtPmFyZzEgPSBGVF9ORVhUX1NIT1JUKCBwICk7Ci0gICAgICAgICAgc3ViZ2x5cGgtPmFyZzIgPSBGVF9ORVhUX1NIT1JUKCBwICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgc3ViZ2x5cGgtPmFyZzEgPSBGVF9ORVhUX0NIQVIoIHAgKTsKLSAgICAgICAgICBzdWJnbHlwaC0+YXJnMiA9IEZUX05FWFRfQ0hBUiggcCApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICggc3ViZ2x5cGgtPmZsYWdzICYgQVJHU19BUkVfV09SRFMgKQotICAgICAgICB7Ci0gICAgICAgICAgc3ViZ2x5cGgtPmFyZzEgPSAoRlRfSW50KUZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgICAgc3ViZ2x5cGgtPmFyZzIgPSAoRlRfSW50KUZUX05FWFRfVVNIT1JUKCBwICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgc3ViZ2x5cGgtPmFyZzEgPSAoRlRfSW50KUZUX05FWFRfQllURSggcCApOwotICAgICAgICAgIHN1YmdseXBoLT5hcmcyID0gKEZUX0ludClGVF9ORVhUX0JZVEUoIHAgKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiByZWFkIHRyYW5zZm9ybSAqLwotICAgICAgeHggPSB5eSA9IDB4MTAwMDBMOwotICAgICAgeHkgPSB5eCA9IDA7Ci0KLSAgICAgIGlmICggc3ViZ2x5cGgtPmZsYWdzICYgV0VfSEFWRV9BX1NDQUxFICkKLSAgICAgIHsKLSAgICAgICAgeHggPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApICogNDsKLSAgICAgICAgeXkgPSB4eDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBzdWJnbHlwaC0+ZmxhZ3MgJiBXRV9IQVZFX0FOX1hZX1NDQUxFICkKLSAgICAgIHsKLSAgICAgICAgeHggPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApICogNDsKLSAgICAgICAgeXkgPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApICogNDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBzdWJnbHlwaC0+ZmxhZ3MgJiBXRV9IQVZFX0FfMlgyICkKLSAgICAgIHsKLSAgICAgICAgeHggPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApICogNDsKLSAgICAgICAgeXggPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApICogNDsKLSAgICAgICAgeHkgPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApICogNDsKLSAgICAgICAgeXkgPSAoRlRfRml4ZWQpRlRfTkVYVF9TSE9SVCggcCApICogNDsKLSAgICAgIH0KLQotICAgICAgc3ViZ2x5cGgtPnRyYW5zZm9ybS54eCA9IHh4OwotICAgICAgc3ViZ2x5cGgtPnRyYW5zZm9ybS54eSA9IHh5OwotICAgICAgc3ViZ2x5cGgtPnRyYW5zZm9ybS55eCA9IHl4OwotICAgICAgc3ViZ2x5cGgtPnRyYW5zZm9ybS55eSA9IHl5OwotCi0gICAgICBudW1fc3ViZ2x5cGhzKys7Ci0KLSAgICB9IHdoaWxlICggc3ViZ2x5cGgtPmZsYWdzICYgTU9SRV9DT01QT05FTlRTICk7Ci0KLSAgICBnbG9hZGVyLT5jdXJyZW50Lm51bV9zdWJnbHlwaHMgPSBudW1fc3ViZ2x5cGhzOwotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0KLSAgICB7Ci0gICAgICBGVF9TdHJlYW0gIHN0cmVhbSA9IGxvYWRlci0+c3RyZWFtOwotCi0KLSAgICAgIC8qIHdlIG11c3QgdW5kbyB0aGUgRlRfRlJBTUVfRU5URVIgaW4gb3JkZXIgdG8gcG9pbnQgKi8KLSAgICAgIC8qIHRvIHRoZSBjb21wb3NpdGUgaW5zdHJ1Y3Rpb25zLCBpZiB3ZSBmaW5kIHNvbWUuICAgKi8KLSAgICAgIC8qIFdlIHdpbGwgcHJvY2VzcyB0aGVtIGxhdGVyLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGxvYWRlci0+aW5zX3BvcyA9IChGVF9VTG9uZykoIEZUX1NUUkVBTV9QT1MoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwIC0gbGltaXQgKTsKLSAgICB9Ci0KLSNlbmRpZgotCi0gICAgbG9hZGVyLT5jdXJzb3IgPSBwOwotCi0gIEZhaWw6Ci0gICAgcmV0dXJuIGVycm9yOwotCi0gIEludmFsaWRfQ29tcG9zaXRlOgotICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQ29tcG9zaXRlICk7Ci0gICAgZ290byBGYWlsOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBUVF9Jbml0X0dseXBoX0xvYWRpbmcoIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgZmFjZS0+YWNjZXNzX2dseXBoX2ZyYW1lICAgPSBUVF9BY2Nlc3NfR2x5cGhfRnJhbWU7Ci0gICAgZmFjZS0+cmVhZF9nbHlwaF9oZWFkZXIgICAgPSBUVF9Mb2FkX0dseXBoX0hlYWRlcjsKLSAgICBmYWNlLT5yZWFkX3NpbXBsZV9nbHlwaCAgICA9IFRUX0xvYWRfU2ltcGxlX0dseXBoOwotICAgIGZhY2UtPnJlYWRfY29tcG9zaXRlX2dseXBoID0gVFRfTG9hZF9Db21wb3NpdGVfR2x5cGg7Ci0gICAgZmFjZS0+Zm9yZ2V0X2dseXBoX2ZyYW1lICAgPSBUVF9Gb3JnZXRfR2x5cGhfRnJhbWU7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHR0X3ByZXBhcmVfem9uZSggVFRfR2x5cGhab25lICB6b25lLAotICAgICAgICAgICAgICAgICAgIEZUX0dseXBoTG9hZCAgbG9hZCwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIHN0YXJ0X3BvaW50LAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgc3RhcnRfY29udG91ciApCi0gIHsKLSAgICB6b25lLT5uX3BvaW50cyAgICA9IChGVF9VU2hvcnQpbG9hZC0+b3V0bGluZS5uX3BvaW50cyAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VU2hvcnQpc3RhcnRfcG9pbnQ7Ci0gICAgem9uZS0+bl9jb250b3VycyAgPSBsb2FkLT5vdXRsaW5lLm5fY29udG91cnMgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfU2hvcnQpc3RhcnRfY29udG91cjsKLSAgICB6b25lLT5vcmcgICAgICAgICA9IGxvYWQtPmV4dHJhX3BvaW50cyArIHN0YXJ0X3BvaW50OwotICAgIHpvbmUtPmN1ciAgICAgICAgID0gbG9hZC0+b3V0bGluZS5wb2ludHMgKyBzdGFydF9wb2ludDsKLSAgICB6b25lLT5vcnVzICAgICAgICA9IGxvYWQtPmV4dHJhX3BvaW50czIgKyBzdGFydF9wb2ludDsKLSAgICB6b25lLT50YWdzICAgICAgICA9IChGVF9CeXRlKilsb2FkLT5vdXRsaW5lLnRhZ3MgKyBzdGFydF9wb2ludDsKLSAgICB6b25lLT5jb250b3VycyAgICA9IChGVF9VU2hvcnQqKWxvYWQtPm91dGxpbmUuY29udG91cnMgKyBzdGFydF9jb250b3VyOwotICAgIHpvbmUtPmZpcnN0X3BvaW50ID0gKEZUX1VTaG9ydClzdGFydF9wb2ludDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfSGludF9HbHlwaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSGludCB0aGUgZ2x5cGggdXNpbmcgdGhlIHpvbmUgcHJlcGFyZWQgYnkgdGhlIGNhbGxlci4gIE5vdGUgdGhhdCAgICovCi0gIC8qICAgIHRoZSB6b25lIGlzIHN1cHBvc2VkIHRvIGluY2x1ZGUgZm91ciBwaGFudG9tIHBvaW50cy4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIFRUX0hpbnRfR2x5cGgoIFRUX0xvYWRlciAgbG9hZGVyLAotICAgICAgICAgICAgICAgICBGVF9Cb29sICAgIGlzX2NvbXBvc2l0ZSApCi0gIHsKLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICBUVF9GYWNlICAgIGZhY2UgICA9IGxvYWRlci0+ZmFjZTsKLSAgICBUVF9Ecml2ZXIgIGRyaXZlciA9IChUVF9Ecml2ZXIpRlRfRkFDRV9EUklWRVIoIGZhY2UgKTsKLSNlbmRpZgotCi0gICAgVFRfR2x5cGhab25lICB6b25lID0gJmxvYWRlci0+em9uZTsKLQotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotICAgIEZUX0xvbmcgICAgICAgbl9pbnM7Ci0jZWxzZQotICAgIEZUX1VOVVNFRCggaXNfY29tcG9zaXRlICk7Ci0jZW5kaWYKLQotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0gICAgaWYgKCBsb2FkZXItPmdseXBoLT5jb250cm9sX2xlbiA+IDB4RkZGRkwgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMSgoICJUVF9IaW50X0dseXBoOiB0b28gbG9uZyBpbnN0cnVjdGlvbnMiICkpOwotICAgICAgRlRfVFJBQ0UxKCggIiAoMHglbHggYnl0ZSkgaXMgdHJ1bmNhdGVkXG4iLAotICAgICAgICAgICAgICAgICBsb2FkZXItPmdseXBoLT5jb250cm9sX2xlbiApKTsKLSAgICB9Ci0gICAgbl9pbnMgPSBsb2FkZXItPmdseXBoLT5jb250cm9sX2xlbjsKLQotICAgIC8qIHNhdmUgb3JpZ2luYWwgcG9pbnQgcG9zaXRpb24gaW4gb3JnICovCi0gICAgaWYgKCBuX2lucyA+IDAgKQotICAgICAgRlRfQVJSQVlfQ09QWSggem9uZS0+b3JnLCB6b25lLT5jdXIsIHpvbmUtPm5fcG9pbnRzICk7Ci0KLSAgICAvKiBSZXNldCBncmFwaGljcyBzdGF0ZS4gKi8KLSAgICBsb2FkZXItPmV4ZWMtPkdTID0gbG9hZGVyLT5zaXplLT5HUzsKLQotICAgIC8qIFhYWDogVU5ET0NVTUVOVEVEISBIaW50aW5nIGluc3RydWN0aW9ucyBvZiBhIGNvbXBvc2l0ZSBnbHlwaCAqLwotICAgIC8qICAgICAgY29tcGxldGVseSByZWZlciB0byB0aGUgKGFscmVhZHkpIGhpbnRlZCBzdWJnbHlwaHMuICAgICAqLwotICAgIGlmICggaXNfY29tcG9zaXRlICkKLSAgICB7Ci0gICAgICBsb2FkZXItPmV4ZWMtPm1ldHJpY3MueF9zY2FsZSA9IDEgPDwgMTY7Ci0gICAgICBsb2FkZXItPmV4ZWMtPm1ldHJpY3MueV9zY2FsZSA9IDEgPDwgMTY7Ci0KLSAgICAgIEZUX0FSUkFZX0NPUFkoIHpvbmUtPm9ydXMsIHpvbmUtPmN1ciwgem9uZS0+bl9wb2ludHMgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGxvYWRlci0+ZXhlYy0+bWV0cmljcy54X3NjYWxlID0gbG9hZGVyLT5zaXplLT5tZXRyaWNzLnhfc2NhbGU7Ci0gICAgICBsb2FkZXItPmV4ZWMtPm1ldHJpY3MueV9zY2FsZSA9IGxvYWRlci0+c2l6ZS0+bWV0cmljcy55X3NjYWxlOwotICAgIH0KLSNlbmRpZgotCi0gICAgLyogcm91bmQgcGhhbnRvbSBwb2ludHMgKi8KLSAgICB6b25lLT5jdXJbem9uZS0+bl9wb2ludHMgLSA0XS54ID0KLSAgICAgIEZUX1BJWF9ST1VORCggem9uZS0+Y3VyW3pvbmUtPm5fcG9pbnRzIC0gNF0ueCApOwotICAgIHpvbmUtPmN1clt6b25lLT5uX3BvaW50cyAtIDNdLnggPQotICAgICAgRlRfUElYX1JPVU5EKCB6b25lLT5jdXJbem9uZS0+bl9wb2ludHMgLSAzXS54ICk7Ci0gICAgem9uZS0+Y3VyW3pvbmUtPm5fcG9pbnRzIC0gMl0ueSA9Ci0gICAgICBGVF9QSVhfUk9VTkQoIHpvbmUtPmN1clt6b25lLT5uX3BvaW50cyAtIDJdLnkgKTsKLSAgICB6b25lLT5jdXJbem9uZS0+bl9wb2ludHMgLSAxXS55ID0KLSAgICAgIEZUX1BJWF9ST1VORCggem9uZS0+Y3VyW3pvbmUtPm5fcG9pbnRzIC0gMV0ueSApOwotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0KLSAgICBpZiAoIG5faW5zID4gMCApCi0gICAgewotICAgICAgRlRfRXJyb3IgIGVycm9yOwotCi0gICAgICBGVF9HbHlwaExvYWRlciAgZ2xvYWRlciAgICAgICAgID0gbG9hZGVyLT5nbG9hZGVyOwotICAgICAgRlRfT3V0bGluZSAgICAgIGN1cnJlbnRfb3V0bGluZSA9IGdsb2FkZXItPmN1cnJlbnQub3V0bGluZTsKLQotCi0gICAgICBUVF9TZXRfQ29kZVJhbmdlKCBsb2FkZXItPmV4ZWMsIHR0X2NvZGVyYW5nZV9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci0+ZXhlYy0+Z2x5cGhJbnMsIG5faW5zICk7Ci0KLSAgICAgIGxvYWRlci0+ZXhlYy0+aXNfY29tcG9zaXRlID0gaXNfY29tcG9zaXRlOwotICAgICAgbG9hZGVyLT5leGVjLT5wdHMgICAgICAgICAgPSAqem9uZTsKLQotICAgICAgZXJyb3IgPSBUVF9SdW5fQ29udGV4dCggbG9hZGVyLT5leGVjICk7Ci0gICAgICBpZiAoIGVycm9yICYmIGxvYWRlci0+ZXhlYy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgLyogc3RvcmUgZHJvcC1vdXQgbW9kZSBpbiBiaXRzIDUtNzsgc2V0IGJpdCAyIGFsc28gYXMgYSBtYXJrZXIgKi8KLSAgICAgIGN1cnJlbnRfb3V0bGluZS50YWdzWzBdIHw9Ci0gICAgICAgICggbG9hZGVyLT5leGVjLT5HUy5zY2FuX3R5cGUgPDwgNSApIHwgRlRfQ1VSVkVfVEFHX0hBU19TQ0FOTU9ERTsKLSAgICB9Ci0KLSNlbmRpZgotCi0gICAgLyogc2F2ZSBnbHlwaCBwaGFudG9tIHBvaW50cyAqLwotICAgIGxvYWRlci0+cHAxID0gem9uZS0+Y3VyW3pvbmUtPm5fcG9pbnRzIC0gNF07Ci0gICAgbG9hZGVyLT5wcDIgPSB6b25lLT5jdXJbem9uZS0+bl9wb2ludHMgLSAzXTsKLSAgICBsb2FkZXItPnBwMyA9IHpvbmUtPmN1clt6b25lLT5uX3BvaW50cyAtIDJdOwotICAgIGxvYWRlci0+cHA0ID0gem9uZS0+Y3VyW3pvbmUtPm5fcG9pbnRzIC0gMV07Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICBpZiAoIGRyaXZlci0+aW50ZXJwcmV0ZXJfdmVyc2lvbiA9PSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM4ICkKLSAgICB7Ci0gICAgICBpZiAoIGxvYWRlci0+ZXhlYy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX0RFRU1CT0xERU4gKQotICAgICAgICBGVF9PdXRsaW5lX0VtYm9sZGVuWFkoICZsb2FkZXItPmdsb2FkZXItPmN1cnJlbnQub3V0bGluZSwgLTI0LCAwICk7Ci0KLSAgICAgIGVsc2UgaWYgKCBsb2FkZXItPmV4ZWMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19FTUJPTERFTiApCi0gICAgICAgIEZUX091dGxpbmVfRW1ib2xkZW5YWSggJmxvYWRlci0+Z2xvYWRlci0+Y3VycmVudC5vdXRsaW5lLCAyNCwgMCApOwotICAgIH0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1Byb2Nlc3NfU2ltcGxlX0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9uY2UgYSBzaW1wbGUgZ2x5cGggaGFzIGJlZW4gbG9hZGVkLCBpdCBuZWVkcyB0byBiZSBwcm9jZXNzZWQuICAgICAqLwotICAvKiAgICBVc3VhbGx5LCB0aGlzIG1lYW5zIHNjYWxpbmcgYW5kIGhpbnRpbmcgdGhyb3VnaCBieXRlY29kZSAgICAgICAgICAgKi8KLSAgLyogICAgaW50ZXJwcmV0YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgVFRfUHJvY2Vzc19TaW1wbGVfR2x5cGgoIFRUX0xvYWRlciAgbG9hZGVyICkKLSAgewotICAgIEZUX0dseXBoTG9hZGVyICBnbG9hZGVyID0gbG9hZGVyLT5nbG9hZGVyOwotICAgIEZUX0Vycm9yICAgICAgICBlcnJvciAgID0gRlRfRXJyX09rOwotICAgIEZUX091dGxpbmUqICAgICBvdXRsaW5lOwotICAgIEZUX0ludCAgICAgICAgICBuX3BvaW50czsKLQotCi0gICAgb3V0bGluZSAgPSAmZ2xvYWRlci0+Y3VycmVudC5vdXRsaW5lOwotICAgIG5fcG9pbnRzID0gb3V0bGluZS0+bl9wb2ludHM7Ci0KLSAgICAvKiBzZXQgcGhhbnRvbSBwb2ludHMgKi8KLQotICAgIG91dGxpbmUtPnBvaW50c1tuX3BvaW50cyAgICBdID0gbG9hZGVyLT5wcDE7Ci0gICAgb3V0bGluZS0+cG9pbnRzW25fcG9pbnRzICsgMV0gPSBsb2FkZXItPnBwMjsKLSAgICBvdXRsaW5lLT5wb2ludHNbbl9wb2ludHMgKyAyXSA9IGxvYWRlci0+cHAzOwotICAgIG91dGxpbmUtPnBvaW50c1tuX3BvaW50cyArIDNdID0gbG9hZGVyLT5wcDQ7Ci0KLSAgICBvdXRsaW5lLT50YWdzW25fcG9pbnRzICAgIF0gPSAwOwotICAgIG91dGxpbmUtPnRhZ3Nbbl9wb2ludHMgKyAxXSA9IDA7Ci0gICAgb3V0bGluZS0+dGFnc1tuX3BvaW50cyArIDJdID0gMDsKLSAgICBvdXRsaW5lLT50YWdzW25fcG9pbnRzICsgM10gPSAwOwotCi0gICAgbl9wb2ludHMgKz0gNDsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLQotICAgIGlmICggbG9hZGVyLT5mYWNlLT5kb2JsZW5kICkKLSAgICB7Ci0gICAgICAvKiBEZWx0YXMgYXBwbHkgdG8gdGhlIHVuc2NhbGVkIGRhdGEuICovCi0gICAgICBlcnJvciA9IFRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzKCBsb2FkZXItPmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZXItPmdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KW5fcG9pbnRzICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgcmV0dXJuIGVycm9yOwotICAgIH0KLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQgKi8KLQotICAgIGlmICggSVNfSElOVEVEKCBsb2FkZXItPmxvYWRfZmxhZ3MgKSApCi0gICAgewotICAgICAgdHRfcHJlcGFyZV96b25lKCAmbG9hZGVyLT56b25lLCAmZ2xvYWRlci0+Y3VycmVudCwgMCwgMCApOwotCi0gICAgICBGVF9BUlJBWV9DT1BZKCBsb2FkZXItPnpvbmUub3J1cywgbG9hZGVyLT56b25lLmN1ciwKLSAgICAgICAgICAgICAgICAgICAgIGxvYWRlci0+em9uZS5uX3BvaW50cyArIDQgKTsKLSAgICB9Ci0KLSAgICB7Ci0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0gICAgICBUVF9GYWNlICAgIGZhY2UgICA9IGxvYWRlci0+ZmFjZTsKLSAgICAgIFRUX0RyaXZlciAgZHJpdmVyID0gKFRUX0RyaXZlcilGVF9GQUNFX0RSSVZFUiggZmFjZSApOwotCi0gICAgICBGVF9TdHJpbmcqICBmYW1pbHkgICAgICAgICA9IGZhY2UtPnJvb3QuZmFtaWx5X25hbWU7Ci0gICAgICBGVF9VSW50ICAgICBwcGVtICAgICAgICAgICA9IGxvYWRlci0+c2l6ZS0+bWV0cmljcy54X3BwZW07Ci0gICAgICBGVF9TdHJpbmcqICBzdHlsZSAgICAgICAgICA9IGZhY2UtPnJvb3Quc3R5bGVfbmFtZTsKLSAgICAgIEZUX1VJbnQgICAgIHhfc2NhbGVfZmFjdG9yID0gMTAwMDsKLSNlbmRpZgotCi0gICAgICBGVF9WZWN0b3IqICB2ZWMgICA9IG91dGxpbmUtPnBvaW50czsKLSAgICAgIEZUX1ZlY3RvciogIGxpbWl0ID0gb3V0bGluZS0+cG9pbnRzICsgbl9wb2ludHM7Ci0KLSAgICAgIEZUX0ZpeGVkICB4X3NjYWxlID0gMDsgLyogcGFjaWZ5IGNvbXBpbGVyICovCi0gICAgICBGVF9GaXhlZCAgeV9zY2FsZSA9IDA7Ci0KLSAgICAgIEZUX0Jvb2wgIGRvX3NjYWxlID0gRkFMU0U7Ci0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotCi0gICAgICBpZiAoIGRyaXZlci0+aW50ZXJwcmV0ZXJfdmVyc2lvbiA9PSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM4ICkKLSAgICAgIHsKLSAgICAgICAgLyogc2NhbGUsIGJ1dCBvbmx5IGlmIGVuYWJsZWQgYW5kIG9ubHkgaWYgVFQgaGludGluZyBpcyBiZWluZyB1c2VkICovCi0gICAgICAgIGlmICggSVNfSElOVEVEKCBsb2FkZXItPmxvYWRfZmxhZ3MgKSApCi0gICAgICAgICAgeF9zY2FsZV9mYWN0b3IgPSBzcGhfdGVzdF90d2Vha194X3NjYWxpbmcoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlci0+Z2x5cGhfaW5kZXggKTsKLSAgICAgICAgLyogc2NhbGUgdGhlIGdseXBoICovCi0gICAgICAgIGlmICggKCBsb2FkZXItPmxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgPT0gMCB8fAotICAgICAgICAgICAgIHhfc2NhbGVfZmFjdG9yICE9IDEwMDAgICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICB7Ci0gICAgICAgICAgeF9zY2FsZSA9IEZUX011bERpdiggbG9hZGVyLT5zaXplLT5tZXRyaWNzLnhfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpeF9zY2FsZV9mYWN0b3IsIDEwMDAgKTsKLSAgICAgICAgICB5X3NjYWxlID0gbG9hZGVyLT5zaXplLT5tZXRyaWNzLnlfc2NhbGU7Ci0KLSAgICAgICAgICAvKiBjb21wZW5zYXRlIGZvciBhbnkgc2NhbGluZyBieSBkZS9lbWJvbGRlbmluZzsgKi8KLSAgICAgICAgICAvKiB0aGUgYW1vdW50IHdhcyBkZXRlcm1pbmVkIHZpYSBleHBlcmltZW50YXRpb24gKi8KLSAgICAgICAgICBpZiAoIHhfc2NhbGVfZmFjdG9yICE9IDEwMDAgJiYgcHBlbSA+IDExICkKLSAgICAgICAgICAgIEZUX091dGxpbmVfRW1ib2xkZW5YWSggb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsRml4KCAxMjgwICogcHBlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwIC0geF9zY2FsZV9mYWN0b3IgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCApOwotICAgICAgICAgIGRvX3NjYWxlID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0KLSAgICAgIHsKLSAgICAgICAgLyogc2NhbGUgdGhlIGdseXBoICovCi0gICAgICAgIGlmICggKCBsb2FkZXItPmxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICB4X3NjYWxlID0gbG9hZGVyLT5zaXplLT5tZXRyaWNzLnhfc2NhbGU7Ci0gICAgICAgICAgeV9zY2FsZSA9IGxvYWRlci0+c2l6ZS0+bWV0cmljcy55X3NjYWxlOwotCi0gICAgICAgICAgZG9fc2NhbGUgPSBUUlVFOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggZG9fc2NhbGUgKQotICAgICAgewotICAgICAgICBmb3IgKCA7IHZlYyA8IGxpbWl0OyB2ZWMrKyApCi0gICAgICAgIHsKLSAgICAgICAgICB2ZWMtPnggPSBGVF9NdWxGaXgoIHZlYy0+eCwgeF9zY2FsZSApOwotICAgICAgICAgIHZlYy0+eSA9IEZUX011bEZpeCggdmVjLT55LCB5X3NjYWxlICk7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2FkZXItPnBwMSA9IG91dGxpbmUtPnBvaW50c1tuX3BvaW50cyAtIDRdOwotICAgICAgICBsb2FkZXItPnBwMiA9IG91dGxpbmUtPnBvaW50c1tuX3BvaW50cyAtIDNdOwotICAgICAgICBsb2FkZXItPnBwMyA9IG91dGxpbmUtPnBvaW50c1tuX3BvaW50cyAtIDJdOwotICAgICAgICBsb2FkZXItPnBwNCA9IG91dGxpbmUtPnBvaW50c1tuX3BvaW50cyAtIDFdOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggSVNfSElOVEVEKCBsb2FkZXItPmxvYWRfZmxhZ3MgKSApCi0gICAgewotICAgICAgbG9hZGVyLT56b25lLm5fcG9pbnRzICs9IDQ7Ci0KLSAgICAgIGVycm9yID0gVFRfSGludF9HbHlwaCggbG9hZGVyLCAwICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Qcm9jZXNzX0NvbXBvc2l0ZV9Db21wb25lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbmNlIGEgY29tcG9zaXRlIGNvbXBvbmVudCBoYXMgYmVlbiBsb2FkZWQsIGl0IG5lZWRzIHRvIGJlICAgICAgICAgKi8KLSAgLyogICAgcHJvY2Vzc2VkLiAgVXN1YWxseSwgdGhpcyBtZWFucyB0cmFuc2Zvcm1pbmcgYW5kIHRyYW5zbGF0aW5nLiAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgVFRfUHJvY2Vzc19Db21wb3NpdGVfQ29tcG9uZW50KCBUVF9Mb2FkZXIgICAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1N1YkdseXBoICBzdWJnbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgc3RhcnRfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgIG51bV9iYXNlX3BvaW50cyApCi0gIHsKLSAgICBGVF9HbHlwaExvYWRlciAgZ2xvYWRlciA9IGxvYWRlci0+Z2xvYWRlcjsKLSAgICBGVF9PdXRsaW5lICAgICAgY3VycmVudDsKLSAgICBGVF9Cb29sICAgICAgICAgaGF2ZV9zY2FsZTsKLSAgICBGVF9Qb3MgICAgICAgICAgeCwgeTsKLQotCi0gICAgY3VycmVudC5wb2ludHMgICA9IGdsb2FkZXItPmJhc2Uub3V0bGluZS5wb2ludHMgKwotICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9iYXNlX3BvaW50czsKLSAgICBjdXJyZW50Lm5fcG9pbnRzID0gZ2xvYWRlci0+YmFzZS5vdXRsaW5lLm5fcG9pbnRzIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAoc2hvcnQpbnVtX2Jhc2VfcG9pbnRzOwotCi0gICAgaGF2ZV9zY2FsZSA9IEZUX0JPT0woIHN1YmdseXBoLT5mbGFncyAmICggV0VfSEFWRV9BX1NDQUxFICAgICB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VfSEFWRV9BTl9YWV9TQ0FMRSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VfSEFWRV9BXzJYMiAgICAgICApICk7Ci0KLSAgICAvKiBwZXJmb3JtIHRoZSB0cmFuc2Zvcm0gcmVxdWlyZWQgZm9yIHRoaXMgc3ViZ2x5cGggKi8KLSAgICBpZiAoIGhhdmVfc2NhbGUgKQotICAgICAgRlRfT3V0bGluZV9UcmFuc2Zvcm0oICZjdXJyZW50LCAmc3ViZ2x5cGgtPnRyYW5zZm9ybSApOwotCi0gICAgLyogZ2V0IG9mZnNldCAqLwotICAgIGlmICggISggc3ViZ2x5cGgtPmZsYWdzICYgQVJHU19BUkVfWFlfVkFMVUVTICkgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgICAgIG51bV9wb2ludHMgPSAoRlRfVUludClnbG9hZGVyLT5iYXNlLm91dGxpbmUubl9wb2ludHM7Ci0gICAgICBGVF9VSW50ICAgICBrID0gKEZUX1VJbnQpc3ViZ2x5cGgtPmFyZzE7Ci0gICAgICBGVF9VSW50ICAgICBsID0gKEZUX1VJbnQpc3ViZ2x5cGgtPmFyZzI7Ci0gICAgICBGVF9WZWN0b3IqICBwMTsKLSAgICAgIEZUX1ZlY3RvciogIHAyOwotCi0KLSAgICAgIC8qIG1hdGNoIGwtdGggcG9pbnQgb2YgdGhlIG5ld2x5IGxvYWRlZCBjb21wb25lbnQgdG8gdGhlIGstdGggcG9pbnQgKi8KLSAgICAgIC8qIG9mIHRoZSBwcmV2aW91c2x5IGxvYWRlZCBjb21wb25lbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgLyogY2hhbmdlIHRvIHRoZSBwb2ludCBudW1iZXJzIHVzZWQgYnkgb3VyIG91dGxpbmUgKi8KLSAgICAgIGsgKz0gc3RhcnRfcG9pbnQ7Ci0gICAgICBsICs9IG51bV9iYXNlX3BvaW50czsKLSAgICAgIGlmICggayA+PSBudW1fYmFzZV9wb2ludHMgfHwKLSAgICAgICAgICAgbCA+PSBudW1fcG9pbnRzICAgICAgKQotICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQ29tcG9zaXRlICk7Ci0KLSAgICAgIHAxID0gZ2xvYWRlci0+YmFzZS5vdXRsaW5lLnBvaW50cyArIGs7Ci0gICAgICBwMiA9IGdsb2FkZXItPmJhc2Uub3V0bGluZS5wb2ludHMgKyBsOwotCi0gICAgICB4ID0gcDEtPnggLSBwMi0+eDsKLSAgICAgIHkgPSBwMS0+eSAtIHAyLT55OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgeCA9IHN1YmdseXBoLT5hcmcxOwotICAgICAgeSA9IHN1YmdseXBoLT5hcmcyOwotCi0gICAgICBpZiAoICF4ICYmICF5ICkKLSAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLQotICAgICAgLyogVXNlIGEgZGVmYXVsdCB2YWx1ZSBkZXBlbmRlbnQgb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIFRUX0NPTkZJR19PUFRJT05fQ09NUE9ORU5UX09GRlNFVF9TQ0FMRUQuICBUaGlzIGlzIHVzZWZ1bCBmb3Igb2xkICovCi0gICAgICAvKiBUVCBmb250cyB3aGljaCBkb24ndCBzZXQgdGhlIHh4eF9DT01QT05FTlRfT0ZGU0VUIGJpdC4gICAgICAgICAgICAqLwotCi0gICAgICBpZiAoIGhhdmVfc2NhbGUgJiYKLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0NPTVBPTkVOVF9PRkZTRVRfU0NBTEVECi0gICAgICAgICAgICEoIHN1YmdseXBoLT5mbGFncyAmIFVOU0NBTEVEX0NPTVBPTkVOVF9PRkZTRVQgKSApCi0jZWxzZQotICAgICAgICAgICAgKCBzdWJnbHlwaC0+ZmxhZ3MgJiBTQ0FMRURfQ09NUE9ORU5UX09GRlNFVCApICkKLSNlbmRpZgotICAgICAgewotCi0jaWYgMAotCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogVGhpcyBhbGdvcml0aG0gaXMgd2hhdCBBcHBsZSBkb2N1bWVudHMuICBCdXQgaXQgZG9lc24ndCB3b3JrLiAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBpbnQgIGEgPSBzdWJnbHlwaC0+dHJhbnNmb3JtLnh4ID4gMCA/ICBzdWJnbHlwaC0+dHJhbnNmb3JtLnh4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogLXN1YmdseXBoLT50cmFuc2Zvcm0ueHg7Ci0gICAgICAgIGludCAgYiA9IHN1YmdseXBoLT50cmFuc2Zvcm0ueXggPiAwID8gIHN1YmdseXBoLT50cmFuc2Zvcm0ueXgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAtc3ViZ2x5cGgtPnRyYW5zZm9ybS55eDsKLSAgICAgICAgaW50ICBjID0gc3ViZ2x5cGgtPnRyYW5zZm9ybS54eSA+IDAgPyAgc3ViZ2x5cGgtPnRyYW5zZm9ybS54eQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IC1zdWJnbHlwaC0+dHJhbnNmb3JtLnh5OwotICAgICAgICBpbnQgIGQgPSBzdWJnbHlwaC0+dHJhbnNmb3JtLnl5ID4gMCA/IHN1YmdseXBoLT50cmFuc2Zvcm0ueXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAtc3ViZ2x5cGgtPnRyYW5zZm9ybS55eTsKLSAgICAgICAgaW50ICBtID0gYSA+IGIgPyBhIDogYjsKLSAgICAgICAgaW50ICBuID0gYyA+IGQgPyBjIDogZDsKLQotCi0gICAgICAgIGlmICggYSAtIGIgPD0gMzMgJiYgYSAtIGIgPj0gLTMzICkKLSAgICAgICAgICBtICo9IDI7Ci0gICAgICAgIGlmICggYyAtIGQgPD0gMzMgJiYgYyAtIGQgPj0gLTMzICkKLSAgICAgICAgICBuICo9IDI7Ci0gICAgICAgIHggPSBGVF9NdWxGaXgoIHgsIG0gKTsKLSAgICAgICAgeSA9IEZUX011bEZpeCggeSwgbiApOwotCi0jZWxzZSAvKiAxICovCi0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBUaGlzIGFsZ29yaXRobSBpcyBhIGd1ZXNzIGFuZCB3b3JrcyBtdWNoIGJldHRlciB0aGFuIHRoZSBhYm92ZS4gKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIEZUX0ZpeGVkICBtYWNfeHNjYWxlID0gRlRfSHlwb3QoIHN1YmdseXBoLT50cmFuc2Zvcm0ueHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmdseXBoLT50cmFuc2Zvcm0ueHkgKTsKLSAgICAgICAgRlRfRml4ZWQgIG1hY195c2NhbGUgPSBGVF9IeXBvdCggc3ViZ2x5cGgtPnRyYW5zZm9ybS55eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZ2x5cGgtPnRyYW5zZm9ybS55eCApOwotCi0KLSAgICAgICAgeCA9IEZUX011bEZpeCggeCwgbWFjX3hzY2FsZSApOwotICAgICAgICB5ID0gRlRfTXVsRml4KCB5LCBtYWNfeXNjYWxlICk7Ci0KLSNlbmRpZiAvKiAxICovCi0KLSAgICAgIH0KLQotICAgICAgaWYgKCAhKCBsb2FkZXItPmxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgKQotICAgICAgewotICAgICAgICBGVF9GaXhlZCAgeF9zY2FsZSA9IGxvYWRlci0+c2l6ZS0+bWV0cmljcy54X3NjYWxlOwotICAgICAgICBGVF9GaXhlZCAgeV9zY2FsZSA9IGxvYWRlci0+c2l6ZS0+bWV0cmljcy55X3NjYWxlOwotCi0KLSAgICAgICAgeCA9IEZUX011bEZpeCggeCwgeF9zY2FsZSApOwotICAgICAgICB5ID0gRlRfTXVsRml4KCB5LCB5X3NjYWxlICk7Ci0KLSAgICAgICAgaWYgKCBzdWJnbHlwaC0+ZmxhZ3MgJiBST1VORF9YWV9UT19HUklEICkKLSAgICAgICAgewotICAgICAgICAgIHggPSBGVF9QSVhfUk9VTkQoIHggKTsKLSAgICAgICAgICB5ID0gRlRfUElYX1JPVU5EKCB5ICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIHggfHwgeSApCi0gICAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggJmN1cnJlbnQsIHgsIHkgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1Byb2Nlc3NfQ29tcG9zaXRlX0dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IGZyb20gVFRfUHJvY2Vzc19TaW1wbGVfR2x5cGgsIGluIHRoYXQgICAqLwotICAvKiAgICBpdHMgc29sZSBwdXJwb3NlIGlzIHRvIGhpbnQgdGhlIGdseXBoLiAgVGh1cyB0aGlzIGZ1bmN0aW9uIGlzICAgICAgKi8KLSAgLyogICAgb25seSBhdmFpbGFibGUgd2hlbiBieXRlY29kZSBpbnRlcnByZXRlciBpcyBlbmFibGVkLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgVFRfUHJvY2Vzc19Db21wb3NpdGVfR2x5cGgoIFRUX0xvYWRlciAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBzdGFydF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgc3RhcnRfY29udG91ciApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgZXJyb3I7Ci0gICAgRlRfT3V0bGluZSogIG91dGxpbmU7Ci0gICAgRlRfVUludCAgICAgIGk7Ci0KLQotICAgIG91dGxpbmUgPSAmbG9hZGVyLT5nbG9hZGVyLT5iYXNlLm91dGxpbmU7Ci0KLSAgICAvKiBtYWtlIHJvb20gZm9yIHBoYW50b20gcG9pbnRzICovCi0gICAgZXJyb3IgPSBGVF9HTFlQSExPQURFUl9DSEVDS19QT0lOVFMoIGxvYWRlci0+Z2xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZS0+bl9wb2ludHMgKyA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICBvdXRsaW5lLT5wb2ludHNbb3V0bGluZS0+bl9wb2ludHMgICAgXSA9IGxvYWRlci0+cHAxOwotICAgIG91dGxpbmUtPnBvaW50c1tvdXRsaW5lLT5uX3BvaW50cyArIDFdID0gbG9hZGVyLT5wcDI7Ci0gICAgb3V0bGluZS0+cG9pbnRzW291dGxpbmUtPm5fcG9pbnRzICsgMl0gPSBsb2FkZXItPnBwMzsKLSAgICBvdXRsaW5lLT5wb2ludHNbb3V0bGluZS0+bl9wb2ludHMgKyAzXSA9IGxvYWRlci0+cHA0OwotCi0gICAgb3V0bGluZS0+dGFnc1tvdXRsaW5lLT5uX3BvaW50cyAgICBdID0gMDsKLSAgICBvdXRsaW5lLT50YWdzW291dGxpbmUtPm5fcG9pbnRzICsgMV0gPSAwOwotICAgIG91dGxpbmUtPnRhZ3Nbb3V0bGluZS0+bl9wb2ludHMgKyAyXSA9IDA7Ci0gICAgb3V0bGluZS0+dGFnc1tvdXRsaW5lLT5uX3BvaW50cyArIDNdID0gMDsKLQotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotCi0gICAgewotICAgICAgRlRfU3RyZWFtICBzdHJlYW0gPSBsb2FkZXItPnN0cmVhbTsKLSAgICAgIEZUX1VTaG9ydCAgbl9pbnMsIG1heF9pbnM7Ci0gICAgICBGVF9VTG9uZyAgIHRtcDsKLQotCi0gICAgICAvKiBUVF9Mb2FkX0NvbXBvc2l0ZV9HbHlwaCBvbmx5IGdpdmVzIHVzIHRoZSBvZmZzZXQgb2YgaW5zdHJ1Y3Rpb25zICovCi0gICAgICAvKiBzbyB3ZSByZWFkIHRoZW0gaGVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCBsb2FkZXItPmluc19wb3MgKSB8fAotICAgICAgICAgICBGVF9SRUFEX1VTSE9SVCggbl9pbnMgKSAgICAgICAgICAgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgIEZUX1RSQUNFNSgoICIgIEluc3RydWN0aW9ucyBzaXplID0gJWRcbiIsIG5faW5zICkpOwotCi0gICAgICAvKiBjaGVjayBpdCAqLwotICAgICAgbWF4X2lucyA9IGxvYWRlci0+ZmFjZS0+bWF4X3Byb2ZpbGUubWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zOwotICAgICAgaWYgKCBuX2lucyA+IG1heF9pbnMgKQotICAgICAgewotICAgICAgICAvKiBkb24ndCB0cnVzdCBgbWF4U2l6ZU9mSW5zdHJ1Y3Rpb25zJzsgKi8KLSAgICAgICAgLyogb25seSBkbyBhIHJvdWdoIHNhZmV0eSBjaGVjayAgICAgICAgICovCi0gICAgICAgIGlmICggKEZUX0ludCluX2lucyA+IGxvYWRlci0+Ynl0ZV9sZW4gKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0UxKCggIlRUX1Byb2Nlc3NfQ29tcG9zaXRlX0dseXBoOiIKLSAgICAgICAgICAgICAgICAgICAgICAiIHRvbyBtYW55IGluc3RydWN0aW9ucyAoJWQpIGZvciBnbHlwaCB3aXRoIGxlbmd0aCAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICBuX2lucywgbG9hZGVyLT5ieXRlX2xlbiApKTsKLSAgICAgICAgICByZXR1cm4gRlRfVEhST1coIFRvb19NYW55X0hpbnRzICk7Ci0gICAgICAgIH0KLQotICAgICAgICB0bXAgICA9IGxvYWRlci0+ZXhlYy0+Z2x5cGhTaXplOwotICAgICAgICBlcnJvciA9IFVwZGF0ZV9NYXgoIGxvYWRlci0+ZXhlYy0+bWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mICggRlRfQnl0ZSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikmbG9hZGVyLT5leGVjLT5nbHlwaElucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX2lucyApOwotCi0gICAgICAgIGxvYWRlci0+ZXhlYy0+Z2x5cGhTaXplID0gKEZUX1VTaG9ydCl0bXA7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIHJldHVybiBlcnJvcjsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBuX2lucyA9PSAwICkKLSAgICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLQotICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRCggbG9hZGVyLT5leGVjLT5nbHlwaElucywgbl9pbnMgKSApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLQotICAgICAgbG9hZGVyLT5nbHlwaC0+Y29udHJvbF9kYXRhID0gbG9hZGVyLT5leGVjLT5nbHlwaEluczsKLSAgICAgIGxvYWRlci0+Z2x5cGgtPmNvbnRyb2xfbGVuICA9IG5faW5zOwotICAgIH0KLQotI2VuZGlmCi0KLSAgICB0dF9wcmVwYXJlX3pvbmUoICZsb2FkZXItPnpvbmUsICZsb2FkZXItPmdsb2FkZXItPmJhc2UsCi0gICAgICAgICAgICAgICAgICAgICBzdGFydF9wb2ludCwgc3RhcnRfY29udG91ciApOwotCi0gICAgLyogU29tZSBwb2ludHMgYXJlIGxpa2VseSB0b3VjaGVkIGR1cmluZyBleGVjdXRpb24gb2YgICovCi0gICAgLyogaW5zdHJ1Y3Rpb25zIG9uIGNvbXBvbmVudHMuICBTbyBsZXQncyB1bnRvdWNoIHRoZW0uICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBsb2FkZXItPnpvbmUubl9wb2ludHM7IGkrKyApCi0gICAgICBsb2FkZXItPnpvbmUudGFnc1tpXSAmPSB+RlRfQ1VSVkVfVEFHX1RPVUNIX0JPVEg7Ci0KLSAgICBsb2FkZXItPnpvbmUubl9wb2ludHMgKz0gNDsKLQotICAgIHJldHVybiBUVF9IaW50X0dseXBoKCBsb2FkZXIsIDEgKTsKLSAgfQotCi0KLSAgLyoKLSAgICogQ2FsY3VsYXRlIHRoZSBwaGFudG9tIHBvaW50cwotICAgKgotICAgKiBEZWZpbmluZyB0aGUgcmlnaHQgc2lkZSBiZWFyaW5nIChyc2IpIGFzCi0gICAqCi0gICAqICAgcnNiID0gYXcgLSAobHNiICsgeG1heCAtIHhtaW4pCi0gICAqCi0gICAqICh3aXRoIGBhdycgdGhlIGFkdmFuY2Ugd2lkdGgsIGBsc2InIHRoZSBsZWZ0IHNpZGUgYmVhcmluZywgYW5kIGB4bWluJwotICAgKiBhbmQgYHhtYXgnIHRoZSBnbHlwaCdzIG1pbmltdW0gYW5kIG1heGltdW0geCB2YWx1ZSksIHRoZSBPcGVuVHlwZQotICAgKiBzcGVjaWZpY2F0aW9uIGRlZmluZXMgdGhlIGluaXRpYWwgcG9zaXRpb24gb2YgaG9yaXpvbnRhbCBwaGFudG9tIHBvaW50cwotICAgKiBhcwotICAgKgotICAgKiAgIHBwMSA9IChyb3VuZCh4bWluIC0gbHNiKSwgMCkgICAgICAsCi0gICAqICAgcHAyID0gKHJvdW5kKHBwMSArIGF3KSwgMCkgICAgICAgIC4KLSAgICoKLSAgICogTm90ZSB0aGF0IHRoZSByb3VuZGluZyB0byB0aGUgZ3JpZCAoaW4gdGhlIGRldmljZSBzcGFjZSkgaXMgbm90Ci0gICAqIGRvY3VtZW50ZWQgY3VycmVudGx5IGluIHRoZSBzcGVjaWZpY2F0aW9uLgotICAgKgotICAgKiBIb3dldmVyLCB0aGUgc3BlY2lmaWNhdGlvbiBsYWNrcyB0aGUgcHJlY2lzZSBkZWZpbml0aW9uIG9mIHZlcnRpY2FsCi0gICAqIHBoYW50b20gcG9pbnRzLiAgR3JlZyBIaXRjaGNvY2sgcHJvdmlkZWQgdGhlIGZvbGxvd2luZyBleHBsYW5hdGlvbi4KLSAgICoKLSAgICogLSBhIGB2bXR4JyB0YWJsZSBpcyBwcmVzZW50Ci0gICAqCi0gICAqICAgRm9yIGFueSBnbHlwaCwgdGhlIG1pbmltdW0gYW5kIG1heGltdW0geSB2YWx1ZXMgKGB5bWluJyBhbmQgYHltYXgnKQotICAgKiAgIGFyZSBnaXZlbiBpbiB0aGUgYGdseWYnIHRhYmxlLCB0aGUgdG9wIHNpZGUgYmVhcmluZyAodHNiKSBhbmQgYWR2YW5jZQotICAgKiAgIGhlaWdodCAoYWgpIGFyZSBnaXZlbiBpbiB0aGUgYHZtdHgnIHRhYmxlLiAgVGhlIGJvdHRvbSBzaWRlIGJlYXJpbmcKLSAgICogICAoYnNiKSBpcyB0aGVuIGNhbGN1bGF0ZWQgYXMKLSAgICoKLSAgICogICAgIGJzYiA9IGFoIC0gKHRzYiArIHltYXggLSB5bWluKSAgICAgICAsCi0gICAqCi0gICAqICAgYW5kIHRoZSBpbml0aWFsIHBvc2l0aW9uIG9mIHZlcnRpY2FsIHBoYW50b20gcG9pbnRzIGlzCi0gICAqCi0gICAqICAgICBwcDMgPSAoeCwgcm91bmQoeW1heCArIHRzYikpICAgICAgICwKLSAgICogICAgIHBwNCA9ICh4LCByb3VuZChwcDMgLSBhaCkpICAgICAgICAgLgotICAgKgotICAgKiAgIFNlZSBiZWxvdyBmb3IgdmFsdWUgYHgnLgotICAgKgotICAgKiAtIG5vIGB2bXR4JyB0YWJsZSBpbiB0aGUgZm9udAotICAgKgotICAgKiAgIElmIHRoZXJlIGlzIGFuIGBPUy8yJyB0YWJsZSwgd2Ugc2V0Ci0gICAqCi0gICAqICAgICBEZWZhdWx0QXNjZW5kZXIgPSBzVHlwb0FzY2VuZGVyICAgICAgICwKLSAgICogICAgIERlZmF1bHREZXNjZW5kZXIgPSBzVHlwb0Rlc2NlbmRlciAgICAgLAotICAgKgotICAgKiAgIG90aGVyd2lzZSB3ZSB1c2UgZGF0YSBmcm9tIHRoZSBgaGhlYScgdGFibGU6Ci0gICAqCi0gICAqICAgICBEZWZhdWx0QXNjZW5kZXIgPSBBc2NlbmRlciAgICAgICAgICwKLSAgICogICAgIERlZmF1bHREZXNjZW5kZXIgPSBEZXNjZW5kZXIgICAgICAgLgotICAgKgotICAgKiAgIFdpdGggdGhlc2UgdHdvIHZhcmlhYmxlcyB3ZSBjYW4gbm93IHNldAotICAgKgotICAgKiAgICAgYWggPSBEZWZhdWx0QXNjZW5kZXIgLSBzRGVmYXVsdERlc2NlbmRlciAgICAsCi0gICAqICAgICB0c2IgPSBEZWZhdWx0QXNjZW5kZXIgLSB5TWF4ICAgICAgICAgICAgICAgICwKLSAgICoKLSAgICogICBhbmQgcHJvY2VlZCBhcyBpZiBhIGB2bXR4JyB0YWJsZSB3YXMgcHJlc2VudC4KLSAgICoKLSAgICogVXN1YWxseSB3ZSBoYXZlCi0gICAqCi0gICAqICAgeCA9IGF3IC8gMiAgICAgICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSkKLSAgICoKLSAgICogYnV0IHRoZXJlIGlzIG9uZSBjb21wYXRpYmlsaXR5IGNhc2Ugd2hlcmUgaXQgY2FuIGJlIHNldCB0bwotICAgKgotICAgKiAgIHggPSAtRGVmYXVsdERlc2NlbmRlciAtCi0gICAqICAgICAgICAgKChEZWZhdWx0QXNjZW5kZXIgLSBEZWZhdWx0RGVzY2VuZGVyIC0gYXcpIC8gMikgICAgIC4gICAgICAoMikKLSAgICoKLSAgICogYW5kIGFub3RoZXIgb25lIHdpdGgKLSAgICoKLSAgICogICB4ID0gMCAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzKQotICAgKgotICAgKiBJbiBXaW5kb3dzLCB0aGUgaGlzdG9yeSBvZiB0aG9zZSB2YWx1ZXMgaXMgcXVpdGUgY29tcGxpY2F0ZWQsCi0gICAqIGRlcGVuZGluZyBvbiB0aGUgaGludGluZyBlbmdpbmUgKHRoYXQgaXMsIHRoZSBncmFwaGljcyBmcmFtZXdvcmspLgotICAgKgotICAgKiAgIGZyYW1ld29yayAgICAgICAgZnJvbSAgICAgICAgICAgICAgICAgdG8gICAgICAgZm9ybXVsYQotICAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgKiAgICBHREkgICAgICAgV2luZG93cyA5OCAgICAgICAgICAgICAgIGN1cnJlbnQgICAgICAoMSkKLSAgICogICAgICAgICAgICAgIChXaW5kb3dzIDIwMDAgZm9yIE5UKQotICAgKiAgICBHREkrICAgICAgV2luZG93cyBYUCAgICAgICAgICAgICAgIFdpbmRvd3MgNyAgICAoMikKLSAgICogICAgR0RJKyAgICAgIFdpbmRvd3MgOCAgICAgICAgICAgICAgICBjdXJyZW50ICAgICAgKDMpCi0gICAqICAgIERXcml0ZSAgICBXaW5kb3dzIDcgICAgICAgICAgICAgICAgY3VycmVudCAgICAgICgzKQotICAgKgotICAgKiBGb3Igc2ltcGxpY2l0eSwgRnJlZVR5cGUgdXNlcyAoMSkgZm9yIGdyYXlzY2FsZSBzdWJwaXhlbCBoaW50aW5nIGFuZAotICAgKiAoMykgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4KLSAgICoKLSAgICovCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0KLSNkZWZpbmUgVFRfTE9BREVSX1NFVF9QUCggbG9hZGVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEZUX0Jvb2wgIHN1YnBpeGVsX2hpbnRpbmdfID0gbG9hZGVyLT5leGVjICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBsb2FkZXItPmV4ZWMtPnN1YnBpeGVsX2hpbnRpbmcgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEZUX0Jvb2wgIGdyYXlzY2FsZV8gICAgICAgID0gbG9hZGVyLT5leGVjICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBsb2FkZXItPmV4ZWMtPmdyYXlzY2FsZSAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEZUX0Jvb2wgIHVzZV9hd18yXyAgICAgICAgID0gKEZUX0Jvb2wpKCBzdWJwaXhlbF9oaW50aW5nXyAmJiAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JheXNjYWxlXyAgICAgICAgKTsgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAobG9hZGVyKS0+cHAxLnggPSAobG9hZGVyKS0+YmJveC54TWluIC0gKGxvYWRlciktPmxlZnRfYmVhcmluZzsgXAotICAgICAgICAgICAgKGxvYWRlciktPnBwMS55ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIChsb2FkZXIpLT5wcDIueCA9IChsb2FkZXIpLT5wcDEueCArIChsb2FkZXIpLT5hZHZhbmNlOyAgICAgICAgICBcCi0gICAgICAgICAgICAobG9hZGVyKS0+cHAyLnkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIChsb2FkZXIpLT5wcDMueCA9IHVzZV9hd18yXyA/IChsb2FkZXIpLT5hZHZhbmNlIC8gMiA6IDA7ICAgICAgICBcCi0gICAgICAgICAgICAobG9hZGVyKS0+cHAzLnkgPSAobG9hZGVyKS0+YmJveC55TWF4ICsgKGxvYWRlciktPnRvcF9iZWFyaW5nOyAgXAotICAgICAgICAgICAgKGxvYWRlciktPnBwNC54ID0gdXNlX2F3XzJfID8gKGxvYWRlciktPmFkdmFuY2UgLyAyIDogMDsgICAgICAgIFwKLSAgICAgICAgICAgIChsb2FkZXIpLT5wcDQueSA9IChsb2FkZXIpLT5wcDMueSAtIChsb2FkZXIpLT52YWR2YW5jZTsgICAgICAgICBcCi0gICAgICAgICAgfSB3aGlsZSAoIDAgKQotCi0jZWxzZSAvKiAhVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0KLSNkZWZpbmUgVFRfTE9BREVSX1NFVF9QUCggbG9hZGVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIChsb2FkZXIpLT5wcDEueCA9IChsb2FkZXIpLT5iYm94LnhNaW4gLSAobG9hZGVyKS0+bGVmdF9iZWFyaW5nOyBcCi0gICAgICAgICAgICAobG9hZGVyKS0+cHAxLnkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgKGxvYWRlciktPnBwMi54ID0gKGxvYWRlciktPnBwMS54ICsgKGxvYWRlciktPmFkdmFuY2U7ICAgICAgICAgIFwKLSAgICAgICAgICAgIChsb2FkZXIpLT5wcDIueSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgKGxvYWRlciktPnBwMy54ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIChsb2FkZXIpLT5wcDMueSA9IChsb2FkZXIpLT5iYm94LnlNYXggKyAobG9hZGVyKS0+dG9wX2JlYXJpbmc7ICBcCi0gICAgICAgICAgICAobG9hZGVyKS0+cHA0LnggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgKGxvYWRlciktPnBwNC55ID0gKGxvYWRlciktPnBwMy55IC0gKGxvYWRlciktPnZhZHZhbmNlOyAgICAgICAgIFwKLSAgICAgICAgICB9IHdoaWxlICggMCApCi0KLSNlbmRpZiAvKiAhVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsb2FkX3RydWV0eXBlX2dseXBoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkcyBhIGdpdmVuIHRydWV0eXBlIGdseXBoLiAgSGFuZGxlcyBjb21wb3NpdGVzIGFuZCB1c2VzIGEgICAgICAgKi8KLSAgLyogICAgVFRfTG9hZGVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgbG9hZF90cnVldHlwZV9nbHlwaCggVFRfTG9hZGVyICBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgcmVjdXJzZV9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgICBoZWFkZXJfb25seSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3IgICAgICAgID0gRlRfRXJyX09rOwotICAgIEZUX0ZpeGVkICAgICAgICB4X3NjYWxlLCB5X3NjYWxlOwotICAgIEZUX1VMb25nICAgICAgICBvZmZzZXQ7Ci0gICAgVFRfRmFjZSAgICAgICAgIGZhY2UgICAgICAgICA9IGxvYWRlci0+ZmFjZTsKLSAgICBGVF9HbHlwaExvYWRlciAgZ2xvYWRlciAgICAgID0gbG9hZGVyLT5nbG9hZGVyOwotICAgIEZUX0Jvb2wgICAgICAgICBvcGVuZWRfZnJhbWUgPSAwOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgIEZUX1N0cmVhbVJlYyAgICBpbmNfc3RyZWFtOwotICAgIEZUX0RhdGEgICAgICAgICBnbHlwaF9kYXRhOwotICAgIEZUX0Jvb2wgICAgICAgICBnbHlwaF9kYXRhX2xvYWRlZCA9IDA7Ci0jZW5kaWYKLQotCi0gICAgLyogc29tZSBmb250cyBoYXZlIGFuIGluY29ycmVjdCB2YWx1ZSBvZiBgbWF4Q29tcG9uZW50RGVwdGgnLCAqLwotICAgIC8qIHRodXMgd2UgYWxsb3cgZGVwdGggMSB0byBjYXRjaCB0aGUgbWFqb3JpdHkgb2YgdGhlbSAgICAgICAgKi8KLSAgICBpZiAoIHJlY3Vyc2VfY291bnQgPiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgcmVjdXJzZV9jb3VudCA+IGZhY2UtPm1heF9wcm9maWxlLm1heENvbXBvbmVudERlcHRoICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0NvbXBvc2l0ZSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotI2lmbmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgLyogY2hlY2sgZ2x5cGggaW5kZXggKi8KLSAgICBpZiAoIGdseXBoX2luZGV4ID49IChGVF9VSW50KWZhY2UtPnJvb3QubnVtX2dseXBocyApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9HbHlwaF9JbmRleCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLSNlbmRpZgotCi0gICAgbG9hZGVyLT5nbHlwaF9pbmRleCA9IGdseXBoX2luZGV4OwotCi0gICAgaWYgKCAoIGxvYWRlci0+bG9hZF9mbGFncyAmIEZUX0xPQURfTk9fU0NBTEUgKSA9PSAwICkKLSAgICB7Ci0gICAgICB4X3NjYWxlID0gbG9hZGVyLT5zaXplLT5tZXRyaWNzLnhfc2NhbGU7Ci0gICAgICB5X3NjYWxlID0gbG9hZGVyLT5zaXplLT5tZXRyaWNzLnlfc2NhbGU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB4X3NjYWxlID0gMHgxMDAwMEw7Ci0gICAgICB5X3NjYWxlID0gMHgxMDAwMEw7Ci0gICAgfQotCi0gICAgLyogU2V0IGBvZmZzZXQnIHRvIHRoZSBzdGFydCBvZiB0aGUgZ2x5cGggcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mICovCi0gICAgLyogdGhlIGBnbHlmJyB0YWJsZSwgYW5kIGBieXRlX2xlbicgdG8gdGhlIGxlbmd0aCBvZiB0aGUgZ2x5cGggaW4gICovCi0gICAgLyogYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0KLSAgICAvKiBJZiB3ZSBhcmUgbG9hZGluZyBnbHlwaCBkYXRhIHZpYSB0aGUgaW5jcmVtZW50YWwgaW50ZXJmYWNlLCBzZXQgKi8KLSAgICAvKiB0aGUgbG9hZGVyIHN0cmVhbSB0byBhIG1lbW9yeSBzdHJlYW0gcmVhZGluZyB0aGUgZGF0YSByZXR1cm5lZCAgKi8KLSAgICAvKiBieSB0aGUgaW50ZXJmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSApCi0gICAgewotICAgICAgZXJyb3IgPSBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPmZ1bmNzLT5nZXRfZ2x5cGhfZGF0YSgKLSAgICAgICAgICAgICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPm9iamVjdCwKLSAgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwgJmdseXBoX2RhdGEgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGdseXBoX2RhdGFfbG9hZGVkID0gMTsKLSAgICAgIG9mZnNldCAgICAgICAgICAgID0gMDsKLSAgICAgIGxvYWRlci0+Ynl0ZV9sZW4gID0gZ2x5cGhfZGF0YS5sZW5ndGg7Ci0KLSAgICAgIEZUX01FTV9aRVJPKCAmaW5jX3N0cmVhbSwgc2l6ZW9mICggaW5jX3N0cmVhbSApICk7Ci0gICAgICBGVF9TdHJlYW1fT3Blbk1lbW9yeSggJmluY19zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfZGF0YS5wb2ludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VTG9uZylnbHlwaF9kYXRhLmxlbmd0aCApOwotCi0gICAgICBsb2FkZXItPnN0cmVhbSA9ICZpbmNfc3RyZWFtOwotICAgIH0KLSAgICBlbHNlCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMICovCi0KLSAgICAgIG9mZnNldCA9IHR0X2ZhY2VfZ2V0X2xvY2F0aW9uKCBmYWNlLCBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludCopJmxvYWRlci0+Ynl0ZV9sZW4gKTsKLQotICAgIGlmICggbG9hZGVyLT5ieXRlX2xlbiA+IDAgKQotICAgIHsKLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgICAvKiBmb3IgdGhlIGluY3JlbWVudGFsIGludGVyZmFjZSwgYGdseWZfb2Zmc2V0JyBpcyBhbHdheXMgemVybyAqLwotICAgICAgaWYgKCAhbG9hZGVyLT5nbHlmX29mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICFmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgKQotI2Vsc2UKLSAgICAgIGlmICggIWxvYWRlci0+Z2x5Zl9vZmZzZXQgKQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwgKi8KLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UyKCggIm5vIGBnbHlmJyB0YWJsZSBidXQgbm9uLXplcm8gYGxvY2EnIGVudHJ5XG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1RhYmxlICk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgZXJyb3IgPSBmYWNlLT5hY2Nlc3NfZ2x5cGhfZnJhbWUoIGxvYWRlciwgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLT5nbHlmX29mZnNldCArIG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVUludClsb2FkZXItPmJ5dGVfbGVuICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBvcGVuZWRfZnJhbWUgPSAxOwotCi0gICAgICAvKiByZWFkIGdseXBoIGhlYWRlciBmaXJzdCAqLwotICAgICAgZXJyb3IgPSBmYWNlLT5yZWFkX2dseXBoX2hlYWRlciggbG9hZGVyICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiB0aGUgbWV0cmljcyBtdXN0IGJlIGNvbXB1dGVkIGFmdGVyIGxvYWRpbmcgdGhlIGdseXBoIGhlYWRlciAqLwotICAgICAgLyogc2luY2Ugd2UgbmVlZCB0aGUgZ2x5cGgncyBgeU1heCcgdmFsdWUgaW4gY2FzZSB0aGUgdmVydGljYWwgKi8KLSAgICAgIC8qIG1ldHJpY3MgbXVzdCBiZSBlbXVsYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBlcnJvciA9IHR0X2dldF9tZXRyaWNzKCBsb2FkZXIsIGdseXBoX2luZGV4ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBpZiAoIGhlYWRlcl9vbmx5ICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGlmICggbG9hZGVyLT5ieXRlX2xlbiA9PSAwIHx8IGxvYWRlci0+bl9jb250b3VycyA9PSAwICkKLSAgICB7Ci0gICAgICBsb2FkZXItPmJib3gueE1pbiA9IDA7Ci0gICAgICBsb2FkZXItPmJib3gueE1heCA9IDA7Ci0gICAgICBsb2FkZXItPmJib3gueU1pbiA9IDA7Ci0gICAgICBsb2FkZXItPmJib3gueU1heCA9IDA7Ci0KLSAgICAgIGVycm9yID0gdHRfZ2V0X21ldHJpY3MoIGxvYWRlciwgZ2x5cGhfaW5kZXggKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGlmICggaGVhZGVyX29ubHkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIC8qIG11c3QgaW5pdGlhbGl6ZSBwb2ludHMgYmVmb3JlIChwb3NzaWJseSkgb3ZlcnJpZGluZyAqLwotICAgICAgLyogZ2x5cGggbWV0cmljcyBmcm9tIHRoZSBpbmNyZW1lbnRhbCBpbnRlcmZhY2UgICAgICAgICovCi0gICAgICBUVF9MT0FERVJfU0VUX1BQKCBsb2FkZXIgKTsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICAgIHR0X2dldF9tZXRyaWNzX2luY3Jfb3ZlcnJpZGVzKCBsb2FkZXIsIGdseXBoX2luZGV4ICk7Ci0jZW5kaWYKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLQotICAgICAgaWYgKCBsb2FkZXItPmZhY2UtPmRvYmxlbmQgKQotICAgICAgewotICAgICAgICAvKiBhIHNtYWxsIG91dGxpbmUgc3RydWN0dXJlIHdpdGggZm91ciBlbGVtZW50cyBmb3IgKi8KLSAgICAgICAgLyogY29tbXVuaWNhdGlvbiB3aXRoIGBUVF9WYXJ5X0FwcGx5X0dseXBoX0RlbHRhcycgICovCi0gICAgICAgIEZUX1ZlY3RvciAgIHBvaW50c1s0XTsKLSAgICAgICAgY2hhciAgICAgICAgdGFnc1s0XSAgICAgPSB7IDEsIDEsIDEsIDEgfTsKLSAgICAgICAgc2hvcnQgICAgICAgY29udG91cnNbNF0gPSB7IDAsIDEsIDIsIDMgfTsKLSAgICAgICAgRlRfT3V0bGluZSAgb3V0bGluZTsKLQotCi0gICAgICAgIHBvaW50c1swXS54ID0gbG9hZGVyLT5wcDEueDsKLSAgICAgICAgcG9pbnRzWzBdLnkgPSBsb2FkZXItPnBwMS55OwotICAgICAgICBwb2ludHNbMV0ueCA9IGxvYWRlci0+cHAyLng7Ci0gICAgICAgIHBvaW50c1sxXS55ID0gbG9hZGVyLT5wcDIueTsKLQotICAgICAgICBwb2ludHNbMl0ueCA9IGxvYWRlci0+cHAzLng7Ci0gICAgICAgIHBvaW50c1syXS55ID0gbG9hZGVyLT5wcDMueTsKLSAgICAgICAgcG9pbnRzWzNdLnggPSBsb2FkZXItPnBwNC54OwotICAgICAgICBwb2ludHNbM10ueSA9IGxvYWRlci0+cHA0Lnk7Ci0KLSAgICAgICAgb3V0bGluZS5uX3BvaW50cyAgID0gNDsKLSAgICAgICAgb3V0bGluZS5uX2NvbnRvdXJzID0gNDsKLSAgICAgICAgb3V0bGluZS5wb2ludHMgICAgID0gcG9pbnRzOwotICAgICAgICBvdXRsaW5lLnRhZ3MgICAgICAgPSB0YWdzOwotICAgICAgICBvdXRsaW5lLmNvbnRvdXJzICAgPSBjb250b3VyczsKLQotICAgICAgICAvKiB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgc2NhbGluZyAqLwotICAgICAgICBlcnJvciA9IFRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzKCBsb2FkZXItPmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpb3V0bGluZS5uX3BvaW50cyApOwotICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgbG9hZGVyLT5wcDEueCA9IHBvaW50c1swXS54OwotICAgICAgICBsb2FkZXItPnBwMS55ID0gcG9pbnRzWzBdLnk7Ci0gICAgICAgIGxvYWRlci0+cHAyLnggPSBwb2ludHNbMV0ueDsKLSAgICAgICAgbG9hZGVyLT5wcDIueSA9IHBvaW50c1sxXS55OwotCi0gICAgICAgIGxvYWRlci0+cHAzLnggPSBwb2ludHNbMl0ueDsKLSAgICAgICAgbG9hZGVyLT5wcDMueSA9IHBvaW50c1syXS55OwotICAgICAgICBsb2FkZXItPnBwNC54ID0gcG9pbnRzWzNdLng7Ci0gICAgICAgIGxvYWRlci0+cHA0LnkgPSBwb2ludHNbM10ueTsKLSAgICAgIH0KLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQgKi8KLQotICAgICAgLyogc2NhbGUgcGhhbnRvbSBwb2ludHMsIGlmIG5lY2Vzc2FyeTsgKi8KLSAgICAgIC8qIHRoZXkgZ2V0IHJvdW5kZWQgaW4gYFRUX0hpbnRfR2x5cGgnICovCi0gICAgICBpZiAoICggbG9hZGVyLT5sb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSApID09IDAgKQotICAgICAgewotICAgICAgICBsb2FkZXItPnBwMS54ID0gRlRfTXVsRml4KCBsb2FkZXItPnBwMS54LCB4X3NjYWxlICk7Ci0gICAgICAgIGxvYWRlci0+cHAyLnggPSBGVF9NdWxGaXgoIGxvYWRlci0+cHAyLngsIHhfc2NhbGUgKTsKLSAgICAgICAgLyogcHAxLnkgYW5kIHBwMi55IGFyZSBhbHdheXMgemVybyAqLwotCi0gICAgICAgIGxvYWRlci0+cHAzLnggPSBGVF9NdWxGaXgoIGxvYWRlci0+cHAzLngsIHhfc2NhbGUgKTsKLSAgICAgICAgbG9hZGVyLT5wcDMueSA9IEZUX011bEZpeCggbG9hZGVyLT5wcDMueSwgeV9zY2FsZSApOwotICAgICAgICBsb2FkZXItPnBwNC54ID0gRlRfTXVsRml4KCBsb2FkZXItPnBwNC54LCB4X3NjYWxlICk7Ci0gICAgICAgIGxvYWRlci0+cHA0LnkgPSBGVF9NdWxGaXgoIGxvYWRlci0+cHA0LnksIHlfc2NhbGUgKTsKLSAgICAgIH0KLQotICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLyogbXVzdCBpbml0aWFsaXplIHBoYW50b20gcG9pbnRzIGJlZm9yZSAocG9zc2libHkpIG92ZXJyaWRpbmcgKi8KLSAgICAvKiBnbHlwaCBtZXRyaWNzIGZyb20gdGhlIGluY3JlbWVudGFsIGludGVyZmFjZSAgICAgICAgICAgICAgICAqLwotICAgIFRUX0xPQURFUl9TRVRfUFAoIGxvYWRlciApOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgIHR0X2dldF9tZXRyaWNzX2luY3Jfb3ZlcnJpZGVzKCBsb2FkZXIsIGdseXBoX2luZGV4ICk7Ci0jZW5kaWYKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgLyogaWYgaXQgaXMgYSBzaW1wbGUgZ2x5cGgsIGxvYWQgaXQgKi8KLQotICAgIGlmICggbG9hZGVyLT5uX2NvbnRvdXJzID4gMCApCi0gICAgewotICAgICAgZXJyb3IgPSBmYWNlLT5yZWFkX3NpbXBsZV9nbHlwaCggbG9hZGVyICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiBhbGwgZGF0YSBoYXZlIGJlZW4gcmVhZCAqLwotICAgICAgZmFjZS0+Zm9yZ2V0X2dseXBoX2ZyYW1lKCBsb2FkZXIgKTsKLSAgICAgIG9wZW5lZF9mcmFtZSA9IDA7Ci0KLSAgICAgIGVycm9yID0gVFRfUHJvY2Vzc19TaW1wbGVfR2x5cGgoIGxvYWRlciApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgRlRfR2x5cGhMb2FkZXJfQWRkKCBnbG9hZGVyICk7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAvKiBvdGhlcndpc2UsIGxvYWQgYSBjb21wb3NpdGUhICovCi0gICAgZWxzZSBpZiAoIGxvYWRlci0+bl9jb250b3VycyA9PSAtMSApCi0gICAgewotICAgICAgRlRfVUludCAgIHN0YXJ0X3BvaW50OwotICAgICAgRlRfVUludCAgIHN0YXJ0X2NvbnRvdXI7Ci0gICAgICBGVF9VTG9uZyAgaW5zX3BvczsgIC8qIHBvc2l0aW9uIG9mIGNvbXBvc2l0ZSBpbnN0cnVjdGlvbnMsIGlmIGFueSAqLwotCi0KLSAgICAgIHN0YXJ0X3BvaW50ICAgPSAoRlRfVUludClnbG9hZGVyLT5iYXNlLm91dGxpbmUubl9wb2ludHM7Ci0gICAgICBzdGFydF9jb250b3VyID0gKEZUX1VJbnQpZ2xvYWRlci0+YmFzZS5vdXRsaW5lLm5fY29udG91cnM7Ci0KLSAgICAgIC8qIGZvciBlYWNoIHN1YmdseXBoLCByZWFkIGNvbXBvc2l0ZSBoZWFkZXIgKi8KLSAgICAgIGVycm9yID0gZmFjZS0+cmVhZF9jb21wb3NpdGVfZ2x5cGgoIGxvYWRlciApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgLyogc3RvcmUgdGhlIG9mZnNldCBvZiBpbnN0cnVjdGlvbnMgKi8KLSAgICAgIGluc19wb3MgPSBsb2FkZXItPmluc19wb3M7Ci0KLSAgICAgIC8qIGFsbCBkYXRhIHdlIG5lZWQgYXJlIHJlYWQgKi8KLSAgICAgIGZhY2UtPmZvcmdldF9nbHlwaF9mcmFtZSggbG9hZGVyICk7Ci0gICAgICBvcGVuZWRfZnJhbWUgPSAwOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotCi0gICAgICBpZiAoIGZhY2UtPmRvYmxlbmQgKQotICAgICAgewotICAgICAgICBzaG9ydCAgICAgICAgaSwgbGltaXQ7Ci0gICAgICAgIEZUX1N1YkdseXBoICBzdWJnbHlwaDsKLQotICAgICAgICBGVF9PdXRsaW5lICBvdXRsaW5lOwotICAgICAgICBGVF9WZWN0b3IqICBwb2ludHMgICA9IE5VTEw7Ci0gICAgICAgIGNoYXIqICAgICAgIHRhZ3MgICAgID0gTlVMTDsKLSAgICAgICAgc2hvcnQqICAgICAgY29udG91cnMgPSBOVUxMOwotCi0gICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0KLQotICAgICAgICBsaW1pdCA9IChzaG9ydClnbG9hZGVyLT5jdXJyZW50Lm51bV9zdWJnbHlwaHM7Ci0KLSAgICAgICAgLyogY29uc3RydWN0IGFuIG91dGxpbmUgc3RydWN0dXJlIGZvciAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogY29tbXVuaWNhdGlvbiB3aXRoIGBUVF9WYXJ5X0FwcGx5X0dseXBoX0RlbHRhcycgKi8KLSAgICAgICAgb3V0bGluZS5uX3BvaW50cyAgID0gKHNob3J0KSggZ2xvYWRlci0+Y3VycmVudC5udW1fc3ViZ2x5cGhzICsgNCApOwotICAgICAgICBvdXRsaW5lLm5fY29udG91cnMgPSBvdXRsaW5lLm5fcG9pbnRzOwotCi0gICAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBwb2ludHMsIG91dGxpbmUubl9wb2ludHMgKSAgIHx8Ci0gICAgICAgICAgICAgRlRfTkVXX0FSUkFZKCB0YWdzLCBvdXRsaW5lLm5fcG9pbnRzICkgICAgIHx8Ci0gICAgICAgICAgICAgRlRfTkVXX0FSUkFZKCBjb250b3Vycywgb3V0bGluZS5uX3BvaW50cyApICkKLSAgICAgICAgICBnb3RvIEV4aXQxOwotCi0gICAgICAgIHN1YmdseXBoID0gZ2xvYWRlci0+Y3VycmVudC5zdWJnbHlwaHM7Ci0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBsaW1pdDsgaSsrLCBzdWJnbHlwaCsrICkKLSAgICAgICAgewotICAgICAgICAgIC8qIGFwcGx5aW5nIGRlbHRhcyBmb3IgYW5jaG9yIHBvaW50cyBkb2Vzbid0IG1ha2Ugc2Vuc2UsICovCi0gICAgICAgICAgLyogYnV0IHdlIGRvbid0IGhhdmUgdG8gc3BlY2lhbGx5IGNoZWNrIHRoaXMgc2luY2UgICAgICAgKi8KLSAgICAgICAgICAvKiB1bnVzZWQgZGVsdGEgdmFsdWVzIGFyZSB6ZXJvIGFueXdheXMgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIHBvaW50c1tpXS54ID0gc3ViZ2x5cGgtPmFyZzE7Ci0gICAgICAgICAgcG9pbnRzW2ldLnkgPSBzdWJnbHlwaC0+YXJnMjsKLSAgICAgICAgICB0YWdzW2ldICAgICA9IDE7Ci0gICAgICAgICAgY29udG91cnNbaV0gPSBpOwotICAgICAgICB9Ci0KLSAgICAgICAgcG9pbnRzW2ldLnggPSBsb2FkZXItPnBwMS54OwotICAgICAgICBwb2ludHNbaV0ueSA9IGxvYWRlci0+cHAxLnk7Ci0gICAgICAgIHRhZ3NbaV0gICAgID0gMTsKLSAgICAgICAgY29udG91cnNbaV0gPSBpOwotCi0gICAgICAgIGkrKzsKLSAgICAgICAgcG9pbnRzW2ldLnggPSBsb2FkZXItPnBwMi54OwotICAgICAgICBwb2ludHNbaV0ueSA9IGxvYWRlci0+cHAyLnk7Ci0gICAgICAgIHRhZ3NbaV0gICAgID0gMTsKLSAgICAgICAgY29udG91cnNbaV0gPSBpOwotCi0gICAgICAgIGkrKzsKLSAgICAgICAgcG9pbnRzW2ldLnggPSBsb2FkZXItPnBwMy54OwotICAgICAgICBwb2ludHNbaV0ueSA9IGxvYWRlci0+cHAzLnk7Ci0gICAgICAgIHRhZ3NbaV0gICAgID0gMTsKLSAgICAgICAgY29udG91cnNbaV0gPSBpOwotCi0gICAgICAgIGkrKzsKLSAgICAgICAgcG9pbnRzW2ldLnggPSBsb2FkZXItPnBwNC54OwotICAgICAgICBwb2ludHNbaV0ueSA9IGxvYWRlci0+cHA0Lnk7Ci0gICAgICAgIHRhZ3NbaV0gICAgID0gMTsKLSAgICAgICAgY29udG91cnNbaV0gPSBpOwotCi0gICAgICAgIG91dGxpbmUucG9pbnRzICAgPSBwb2ludHM7Ci0gICAgICAgIG91dGxpbmUudGFncyAgICAgPSB0YWdzOwotICAgICAgICBvdXRsaW5lLmNvbnRvdXJzID0gY29udG91cnM7Ci0KLSAgICAgICAgLyogdGhpcyBjYWxsIHByb3ZpZGVzIGFkZGl0aW9uYWwgb2Zmc2V0cyAqLwotICAgICAgICAvKiBmb3IgZWFjaCBjb21wb25lbnQncyB0cmFuc2xhdGlvbiAgICAgICovCi0gICAgICAgIGlmICggKCBlcnJvciA9IFRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzKAotICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJm91dGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpb3V0bGluZS5uX3BvaW50cyApICkgIT0gMCApCi0gICAgICAgICAgZ290byBFeGl0MTsKLQotICAgICAgICBzdWJnbHlwaCA9IGdsb2FkZXItPmN1cnJlbnQuc3ViZ2x5cGhzOwotCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbGltaXQ7IGkrKywgc3ViZ2x5cGgrKyApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBYWFg6IG92ZXJmbG93IGNoZWNrIGZvciBzdWJnbHlwaC0+e2FyZzEsYXJnMn0uICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgIERlbHRhcyBtdXN0IGJlIHdpdGhpbiBzaWduZWQgMTYtYml0LCAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgIGJ1dCB0aGUgcmVzdHJpY3Rpb24gb2Ygc3VtbWVkIGRlbHRhcyBpcyBub3QgY2xlYXIgKi8KLSAgICAgICAgICBzdWJnbHlwaC0+YXJnMSA9IChGVF9JbnQxNilwb2ludHNbaV0ueDsKLSAgICAgICAgICBzdWJnbHlwaC0+YXJnMiA9IChGVF9JbnQxNilwb2ludHNbaV0ueTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvYWRlci0+cHAxLnggPSBwb2ludHNbaSArIDBdLng7Ci0gICAgICAgIGxvYWRlci0+cHAxLnkgPSBwb2ludHNbaSArIDBdLnk7Ci0gICAgICAgIGxvYWRlci0+cHAyLnggPSBwb2ludHNbaSArIDFdLng7Ci0gICAgICAgIGxvYWRlci0+cHAyLnkgPSBwb2ludHNbaSArIDFdLnk7Ci0KLSAgICAgICAgbG9hZGVyLT5wcDMueCA9IHBvaW50c1tpICsgMl0ueDsKLSAgICAgICAgbG9hZGVyLT5wcDMueSA9IHBvaW50c1tpICsgMl0ueTsKLSAgICAgICAgbG9hZGVyLT5wcDQueCA9IHBvaW50c1tpICsgM10ueDsKLSAgICAgICAgbG9hZGVyLT5wcDQueSA9IHBvaW50c1tpICsgM10ueTsKLQotICAgICAgRXhpdDE6Ci0gICAgICAgIEZUX0ZSRUUoIG91dGxpbmUucG9pbnRzICk7Ci0gICAgICAgIEZUX0ZSRUUoIG91dGxpbmUudGFncyApOwotICAgICAgICBGVF9GUkVFKCBvdXRsaW5lLmNvbnRvdXJzICk7Ci0KLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVCAqLwotCi0gICAgICAvKiBzY2FsZSBwaGFudG9tIHBvaW50cywgaWYgbmVjZXNzYXJ5OyAqLwotICAgICAgLyogdGhleSBnZXQgcm91bmRlZCBpbiBgVFRfSGludF9HbHlwaCcgKi8KLSAgICAgIGlmICggKCBsb2FkZXItPmxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIGxvYWRlci0+cHAxLnggPSBGVF9NdWxGaXgoIGxvYWRlci0+cHAxLngsIHhfc2NhbGUgKTsKLSAgICAgICAgbG9hZGVyLT5wcDIueCA9IEZUX011bEZpeCggbG9hZGVyLT5wcDIueCwgeF9zY2FsZSApOwotICAgICAgICAvKiBwcDEueSBhbmQgcHAyLnkgYXJlIGFsd2F5cyB6ZXJvICovCi0KLSAgICAgICAgbG9hZGVyLT5wcDMueCA9IEZUX011bEZpeCggbG9hZGVyLT5wcDMueCwgeF9zY2FsZSApOwotICAgICAgICBsb2FkZXItPnBwMy55ID0gRlRfTXVsRml4KCBsb2FkZXItPnBwMy55LCB5X3NjYWxlICk7Ci0gICAgICAgIGxvYWRlci0+cHA0LnggPSBGVF9NdWxGaXgoIGxvYWRlci0+cHA0LngsIHhfc2NhbGUgKTsKLSAgICAgICAgbG9hZGVyLT5wcDQueSA9IEZUX011bEZpeCggbG9hZGVyLT5wcDQueSwgeV9zY2FsZSApOwotICAgICAgfQotCi0gICAgICAvKiBpZiB0aGUgZmxhZyBGVF9MT0FEX05PX1JFQ1VSU0UgaXMgc2V0LCB3ZSByZXR1cm4gdGhlIHN1YmdseXBoICovCi0gICAgICAvKiBgYXMgaXMnIGluIHRoZSBnbHlwaCBzbG90ICh0aGUgY2xpZW50IGFwcGxpY2F0aW9uIHdpbGwgYmUgICAgICovCi0gICAgICAvKiByZXNwb25zaWJsZSBmb3IgaW50ZXJwcmV0aW5nIHRoZXNlIGRhdGEpLi4uICAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIGxvYWRlci0+bG9hZF9mbGFncyAmIEZUX0xPQURfTk9fUkVDVVJTRSApCi0gICAgICB7Ci0gICAgICAgIEZUX0dseXBoTG9hZGVyX0FkZCggZ2xvYWRlciApOwotICAgICAgICBsb2FkZXItPmdseXBoLT5mb3JtYXQgPSBGVF9HTFlQSF9GT1JNQVRfQ09NUE9TSVRFOwotCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgICAgICBuLCBudW1fYmFzZV9wb2ludHM7Ci0gICAgICAgIEZUX1N1YkdseXBoICBzdWJnbHlwaCAgICAgICA9IE5VTEw7Ci0KLSAgICAgICAgRlRfVUludCAgICAgIG51bV9wb2ludHMgICAgID0gc3RhcnRfcG9pbnQ7Ci0gICAgICAgIEZUX1VJbnQgICAgICBudW1fc3ViZ2x5cGhzICA9IGdsb2FkZXItPmN1cnJlbnQubnVtX3N1YmdseXBoczsKLSAgICAgICAgRlRfVUludCAgICAgIG51bV9iYXNlX3N1YmdzID0gZ2xvYWRlci0+YmFzZS5udW1fc3ViZ2x5cGhzOwotCi0gICAgICAgIEZUX1N0cmVhbSAgICBvbGRfc3RyZWFtICAgICA9IGxvYWRlci0+c3RyZWFtOwotICAgICAgICBGVF9JbnQgICAgICAgb2xkX2J5dGVfbGVuICAgPSBsb2FkZXItPmJ5dGVfbGVuOwotCi0KLSAgICAgICAgRlRfR2x5cGhMb2FkZXJfQWRkKCBnbG9hZGVyICk7Ci0KLSAgICAgICAgLyogcmVhZCBlYWNoIHN1YmdseXBoIGluZGVwZW5kZW50bHkgKi8KLSAgICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fc3ViZ2x5cGhzOyBuKysgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVmVjdG9yICBwcFs0XTsKLQotCi0gICAgICAgICAgLyogRWFjaCB0aW1lIHdlIGNhbGwgbG9hZF90cnVldHlwZV9nbHlwaCBpbiB0aGlzIGxvb3AsIHRoZSAgICovCi0gICAgICAgICAgLyogdmFsdWUgb2YgYGdsb2FkZXIuYmFzZS5zdWJnbHlwaHMnIGNhbiBjaGFuZ2UgZHVlIHRvIHRhYmxlICovCi0gICAgICAgICAgLyogcmVhbGxvY2F0aW9ucy4gIFdlIHRodXMgbmVlZCB0byByZWNvbXB1dGUgdGhlIHN1YmdseXBoICAgICovCi0gICAgICAgICAgLyogcG9pbnRlciBvbiBlYWNoIGl0ZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgc3ViZ2x5cGggPSBnbG9hZGVyLT5iYXNlLnN1YmdseXBocyArIG51bV9iYXNlX3N1YmdzICsgbjsKLQotICAgICAgICAgIHBwWzBdID0gbG9hZGVyLT5wcDE7Ci0gICAgICAgICAgcHBbMV0gPSBsb2FkZXItPnBwMjsKLSAgICAgICAgICBwcFsyXSA9IGxvYWRlci0+cHAzOwotICAgICAgICAgIHBwWzNdID0gbG9hZGVyLT5wcDQ7Ci0KLSAgICAgICAgICBudW1fYmFzZV9wb2ludHMgPSAoRlRfVUludClnbG9hZGVyLT5iYXNlLm91dGxpbmUubl9wb2ludHM7Ci0KLSAgICAgICAgICBlcnJvciA9IGxvYWRfdHJ1ZXR5cGVfZ2x5cGgoIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KXN1YmdseXBoLT5pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2VfY291bnQgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UgKTsKLSAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICAgIC8qIHJlc3RvcmUgc3ViZ2x5cGggcG9pbnRlciAqLwotICAgICAgICAgIHN1YmdseXBoID0gZ2xvYWRlci0+YmFzZS5zdWJnbHlwaHMgKyBudW1fYmFzZV9zdWJncyArIG47Ci0KLSAgICAgICAgICAvKiByZXN0b3JlIHBoYW50b20gcG9pbnRzIGlmIG5lY2Vzc2FyeSAqLwotICAgICAgICAgIGlmICggISggc3ViZ2x5cGgtPmZsYWdzICYgVVNFX01ZX01FVFJJQ1MgKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgbG9hZGVyLT5wcDEgPSBwcFswXTsKLSAgICAgICAgICAgIGxvYWRlci0+cHAyID0gcHBbMV07Ci0gICAgICAgICAgICBsb2FkZXItPnBwMyA9IHBwWzJdOwotICAgICAgICAgICAgbG9hZGVyLT5wcDQgPSBwcFszXTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBudW1fcG9pbnRzID0gKEZUX1VJbnQpZ2xvYWRlci0+YmFzZS5vdXRsaW5lLm5fcG9pbnRzOwotCi0gICAgICAgICAgaWYgKCBudW1fcG9pbnRzID09IG51bV9iYXNlX3BvaW50cyApCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIC8qIGdsb2FkZXItPmJhc2Uub3V0bGluZSBjb25zaXN0cyBvZiB0aHJlZSBwYXJ0czogICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIDAgLSgxKS0+IHN0YXJ0X3BvaW50IC0oMiktPiBudW1fYmFzZV9wb2ludHMgLSgzKS0+IG5fcG9pbnRzLiAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICgxKTogZXhpc3RzIGZyb20gdGhlIGJlZ2lubmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICgyKTogY29tcG9uZW50cyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQgc28gZmFyICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICgzKTogdGhlIG5ld2x5IGxvYWRlZCBjb21wb25lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIGVycm9yID0gVFRfUHJvY2Vzc19Db21wb3NpdGVfQ29tcG9uZW50KCBsb2FkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX2Jhc2VfcG9pbnRzICk7Ci0gICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBsb2FkZXItPnN0cmVhbSAgID0gb2xkX3N0cmVhbTsKLSAgICAgICAgbG9hZGVyLT5ieXRlX2xlbiA9IG9sZF9ieXRlX2xlbjsKLQotICAgICAgICAvKiBwcm9jZXNzIHRoZSBnbHlwaCAqLwotICAgICAgICBsb2FkZXItPmluc19wb3MgPSBpbnNfcG9zOwotICAgICAgICBpZiAoIElTX0hJTlRFRCggbG9hZGVyLT5sb2FkX2ZsYWdzICkgJiYKLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLSAgICAgICAgICAgICBzdWJnbHlwaC0+ZmxhZ3MgJiBXRV9IQVZFX0lOU1RSICYmCi0jZW5kaWYKLSAgICAgICAgICAgICBudW1fcG9pbnRzID4gc3RhcnRfcG9pbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSBUVF9Qcm9jZXNzX0NvbXBvc2l0ZV9HbHlwaCggbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3BvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2NvbnRvdXIgKTsKLSAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogaW52YWxpZCBjb21wb3NpdGUgY291bnQgKG5lZ2F0aXZlIGJ1dCBub3QgLTEpICovCi0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX091dGxpbmUgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBFeGl0OgotCi0gICAgaWYgKCBvcGVuZWRfZnJhbWUgKQotICAgICAgZmFjZS0+Zm9yZ2V0X2dseXBoX2ZyYW1lKCBsb2FkZXIgKTsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLQotICAgIGlmICggZ2x5cGhfZGF0YV9sb2FkZWQgKQotICAgICAgZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlLT5mdW5jcy0+ZnJlZV9nbHlwaF9kYXRhKAotICAgICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPm9iamVjdCwKLSAgICAgICAgJmdseXBoX2RhdGEgKTsKLQotI2VuZGlmCi0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBjb21wdXRlX2dseXBoX21ldHJpY3MoIFRUX0xvYWRlciAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZ2x5cGhfaW5kZXggKQotICB7Ci0gICAgVFRfRmFjZSAgICBmYWNlICAgPSBsb2FkZXItPmZhY2U7Ci0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0gICAgVFRfRHJpdmVyICBkcml2ZXIgPSAoVFRfRHJpdmVyKUZUX0ZBQ0VfRFJJVkVSKCBmYWNlICk7Ci0jZW5kaWYKLQotICAgIEZUX0JCb3ggICAgICAgYmJveDsKLSAgICBGVF9GaXhlZCAgICAgIHlfc2NhbGU7Ci0gICAgVFRfR2x5cGhTbG90ICBnbHlwaCA9IGxvYWRlci0+Z2x5cGg7Ci0gICAgVFRfU2l6ZSAgICAgICBzaXplICA9IGxvYWRlci0+c2l6ZTsKLQotCi0gICAgeV9zY2FsZSA9IDB4MTAwMDBMOwotICAgIGlmICggKCBsb2FkZXItPmxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgPT0gMCApCi0gICAgICB5X3NjYWxlID0gc2l6ZS0+cm9vdC5tZXRyaWNzLnlfc2NhbGU7Ci0KLSAgICBpZiAoIGdseXBoLT5mb3JtYXQgIT0gRlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURSApCi0gICAgICBGVF9PdXRsaW5lX0dldF9DQm94KCAmZ2x5cGgtPm91dGxpbmUsICZiYm94ICk7Ci0gICAgZWxzZQotICAgICAgYmJveCA9IGxvYWRlci0+YmJveDsKLQotICAgIC8qIGdldCB0aGUgZGV2aWNlLWluZGVwZW5kZW50IGhvcml6b250YWwgYWR2YW5jZTsgaXQgaXMgc2NhbGVkIGxhdGVyICovCi0gICAgLyogYnkgdGhlIGJhc2UgbGF5ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBnbHlwaC0+bGluZWFySG9yaUFkdmFuY2UgPSBsb2FkZXItPmxpbmVhcjsKLQotICAgIGdseXBoLT5tZXRyaWNzLmhvcmlCZWFyaW5nWCA9IGJib3gueE1pbjsKLSAgICBnbHlwaC0+bWV0cmljcy5ob3JpQmVhcmluZ1kgPSBiYm94LnlNYXg7Ci0gICAgZ2x5cGgtPm1ldHJpY3MuaG9yaUFkdmFuY2UgID0gbG9hZGVyLT5wcDIueCAtIGxvYWRlci0+cHAxLng7Ci0KLSAgICAvKiBhZGp1c3QgYWR2YW5jZSB3aWR0aCB0byB0aGUgdmFsdWUgY29udGFpbmVkIGluIHRoZSBoZG14IHRhYmxlICovCi0gICAgLyogdW5sZXNzIEZUX0xPQURfQ09NUFVURV9NRVRSSUNTIGlzIHNldCAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggIWZhY2UtPnBvc3RzY3JpcHQuaXNGaXhlZFBpdGNoICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgSVNfSElOVEVEKCBsb2FkZXItPmxvYWRfZmxhZ3MgKSAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgISggbG9hZGVyLT5sb2FkX2ZsYWdzICYgRlRfTE9BRF9DT01QVVRFX01FVFJJQ1MgKSApCi0gICAgewotICAgICAgRlRfQnl0ZSogIHdpZHRocDsKLQotCi0gICAgICB3aWR0aHAgPSB0dF9mYWNlX2dldF9kZXZpY2VfbWV0cmljcyggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLT5yb290Lm1ldHJpY3MueF9wcGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4ICk7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLQotICAgICAgaWYgKCBkcml2ZXItPmludGVycHJldGVyX3ZlcnNpb24gPT0gVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zOCApCi0gICAgICB7Ci0gICAgICAgIEZUX0Jvb2wgIGlnbm9yZV94X21vZGU7Ci0KLQotICAgICAgICBpZ25vcmVfeF9tb2RlID0gRlRfQk9PTCggRlRfTE9BRF9UQVJHRVRfTU9ERSggbG9hZGVyLT5sb2FkX2ZsYWdzICkgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JFTkRFUl9NT0RFX01PTk8gKTsKLQotICAgICAgICBpZiAoIHdpZHRocCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgKCAoIGlnbm9yZV94X21vZGUgJiYgbG9hZGVyLT5leGVjLT5jb21wYXRpYmxlX3dpZHRocyApIHx8Ci0gICAgICAgICAgICAgICAgIWlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgU1BIX09QVElPTl9CSVRNQVBfV0lEVEhTICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgKQotICAgICAgICAgIGdseXBoLT5tZXRyaWNzLmhvcmlBZHZhbmNlID0gKndpZHRocCAqIDY0OwotICAgICAgfQotICAgICAgZWxzZQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0KLSAgICAgIHsKLSAgICAgICAgaWYgKCB3aWR0aHAgKQotICAgICAgICAgIGdseXBoLT5tZXRyaWNzLmhvcmlBZHZhbmNlID0gKndpZHRocCAqIDY0OwotICAgICAgfQotICAgIH0KLQotICAgIC8qIHNldCBnbHlwaCBkaW1lbnNpb25zICovCi0gICAgZ2x5cGgtPm1ldHJpY3Mud2lkdGggID0gYmJveC54TWF4IC0gYmJveC54TWluOwotICAgIGdseXBoLT5tZXRyaWNzLmhlaWdodCA9IGJib3gueU1heCAtIGJib3gueU1pbjsKLQotICAgIC8qIE5vdyB0YWtlIGNhcmUgb2YgdmVydGljYWwgbWV0cmljcy4gIEluIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzICovCi0gICAgLyogbm8gdmVydGljYWwgaW5mb3JtYXRpb24gd2l0aGluIHRoZSBmb250IChyZWxhdGl2ZWx5IGNvbW1vbiksICAgKi8KLSAgICAvKiBjcmVhdGUgc29tZSBtZXRyaWNzIG1hbnVhbGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHsKLSAgICAgIEZUX1BvcyAgdG9wOyAgICAgIC8qIHNjYWxlZCB2ZXJ0aWNhbCB0b3Agc2lkZSBiZWFyaW5nICAqLwotICAgICAgRlRfUG9zICBhZHZhbmNlOyAgLyogc2NhbGVkIHZlcnRpY2FsIGFkdmFuY2UgaGVpZ2h0ICAgICovCi0KLQotICAgICAgLyogR2V0IHRoZSB1bnNjYWxlZCB0b3AgYmVhcmluZyBhbmQgYWR2YW5jZSBoZWlnaHQuICovCi0gICAgICBpZiAoIGZhY2UtPnZlcnRpY2FsX2luZm8gICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgZmFjZS0+dmVydGljYWwubnVtYmVyX09mX1ZNZXRyaWNzID4gMCApCi0gICAgICB7Ci0gICAgICAgIHRvcCA9IChGVF9TaG9ydClGVF9EaXZGaXgoIGxvYWRlci0+cHAzLnkgLSBiYm94LnlNYXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfc2NhbGUgKTsKLQotICAgICAgICBpZiAoIGxvYWRlci0+cHAzLnkgPD0gbG9hZGVyLT5wcDQueSApCi0gICAgICAgICAgYWR2YW5jZSA9IDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBhZHZhbmNlID0gKEZUX1VTaG9ydClGVF9EaXZGaXgoIGxvYWRlci0+cHAzLnkgLSBsb2FkZXItPnBwNC55LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeV9zY2FsZSApOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBGVF9Qb3MgIGhlaWdodDsKLQotCi0gICAgICAgIC8qIFhYWCBDb21wdXRlIHRvcCBzaWRlIGJlYXJpbmcgYW5kIGFkdmFuY2UgaGVpZ2h0IGluICAqLwotICAgICAgICAvKiAgICAgR2V0X1ZNZXRyaWNzIGluc3RlYWQgb2YgaGVyZS4gICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAvKiBOT1RFOiBUaGUgT1MvMiB2YWx1ZXMgYXJlIHRoZSBvbmx5IGBwb3J0YWJsZScgb25lcywgKi8KLSAgICAgICAgLyogICAgICAgd2hpY2ggaXMgd2h5IHdlIHVzZSB0aGVtLCBpZiB0aGVyZSBpcyBhbiBPUy8yICovCi0gICAgICAgIC8qICAgICAgIHRhYmxlIGluIHRoZSBmb250LiAgT3RoZXJ3aXNlLCB3ZSB1c2UgdGhlICAgICAqLwotICAgICAgICAvKiAgICAgICB2YWx1ZXMgZGVmaW5lZCBpbiB0aGUgaG9yaXpvbnRhbCBoZWFkZXIuICAgICAgKi8KLQotICAgICAgICBoZWlnaHQgPSAoRlRfU2hvcnQpRlRfRGl2Rml4KCBiYm94LnlNYXggLSBiYm94LnlNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfc2NhbGUgKTsKLSAgICAgICAgaWYgKCBmYWNlLT5vczIudmVyc2lvbiAhPSAweEZGRkZVICkKLSAgICAgICAgICBhZHZhbmNlID0gKEZUX1BvcykoIGZhY2UtPm9zMi5zVHlwb0FzY2VuZGVyIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm9zMi5zVHlwb0Rlc2NlbmRlciApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgYWR2YW5jZSA9IChGVF9Qb3MpKCBmYWNlLT5ob3Jpem9udGFsLkFzY2VuZGVyIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmhvcml6b250YWwuRGVzY2VuZGVyICk7Ci0KLSAgICAgICAgdG9wID0gKCBhZHZhbmNlIC0gaGVpZ2h0ICkgLyAyOwotICAgICAgfQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgICAgewotICAgICAgICBGVF9JbmNyZW1lbnRhbF9JbnRlcmZhY2VSZWMqICBpbmNyOwotICAgICAgICBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzUmVjICAgICBtZXRyaWNzOwotICAgICAgICBGVF9FcnJvciAgICAgICAgICAgICAgICAgICAgICBlcnJvcjsKLQotCi0gICAgICAgIGluY3IgPSBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2U7Ci0KLSAgICAgICAgLyogSWYgdGhpcyBpcyBhbiBpbmNyZW1lbnRhbGx5IGxvYWRlZCBmb250IHNlZSBpZiB0aGVyZSBhcmUgKi8KLSAgICAgICAgLyogb3ZlcnJpZGluZyBtZXRyaWNzIGZvciB0aGlzIGdseXBoLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBpbmNyICYmIGluY3ItPmZ1bmNzLT5nZXRfZ2x5cGhfbWV0cmljcyApCi0gICAgICAgIHsKLSAgICAgICAgICBtZXRyaWNzLmJlYXJpbmdfeCA9IDA7Ci0gICAgICAgICAgbWV0cmljcy5iZWFyaW5nX3kgPSB0b3A7Ci0gICAgICAgICAgbWV0cmljcy5hZHZhbmNlICAgPSBhZHZhbmNlOwotCi0gICAgICAgICAgZXJyb3IgPSBpbmNyLT5mdW5jcy0+Z2V0X2dseXBoX21ldHJpY3MoIGluY3ItPm9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXRyaWNzICk7Ci0gICAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSAgICAgICAgICB0b3AgICAgID0gbWV0cmljcy5iZWFyaW5nX3k7Ci0gICAgICAgICAgYWR2YW5jZSA9IG1ldHJpY3MuYWR2YW5jZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBHV1c6IERvIHZlcnRpY2FsIG1ldHJpY3MgZ2V0IGxvYWRlZCBpbmNyZW1lbnRhbGx5IHRvbz8gKi8KLQotI2VuZGlmIC8qIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwgKi8KLQotICAgICAgZ2x5cGgtPmxpbmVhclZlcnRBZHZhbmNlID0gYWR2YW5jZTsKLQotICAgICAgLyogc2NhbGUgdGhlIG1ldHJpY3MgKi8KLSAgICAgIGlmICggISggbG9hZGVyLT5sb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSApICkKLSAgICAgIHsKLSAgICAgICAgdG9wICAgICA9IEZUX011bEZpeCggdG9wLCAgICAgeV9zY2FsZSApOwotICAgICAgICBhZHZhbmNlID0gRlRfTXVsRml4KCBhZHZhbmNlLCB5X3NjYWxlICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIFhYWDogZm9yIG5vdywgd2UgaGF2ZSBubyBiZXR0ZXIgYWxnb3JpdGhtIGZvciB0aGUgbHNiLCBidXQgaXQgKi8KLSAgICAgIC8qICAgICAgc2hvdWxkIHdvcmsgZmluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGdseXBoLT5tZXRyaWNzLnZlcnRCZWFyaW5nWCA9IGdseXBoLT5tZXRyaWNzLmhvcmlCZWFyaW5nWCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoLT5tZXRyaWNzLmhvcmlBZHZhbmNlIC8gMjsKLSAgICAgIGdseXBoLT5tZXRyaWNzLnZlcnRCZWFyaW5nWSA9IHRvcDsKLSAgICAgIGdseXBoLT5tZXRyaWNzLnZlcnRBZHZhbmNlICA9IGFkdmFuY2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIGxvYWRfc2JpdF9pbWFnZSggVFRfU2l6ZSAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgIFRUX0dseXBoU2xvdCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgICAgIGxvYWRfZmxhZ3MgKQotICB7Ci0gICAgVFRfRmFjZSAgICAgICAgICAgICBmYWNlOwotICAgIFNGTlRfU2VydmljZSAgICAgICAgc2ZudDsKLSAgICBGVF9TdHJlYW0gICAgICAgICAgIHN0cmVhbTsKLSAgICBGVF9FcnJvciAgICAgICAgICAgIGVycm9yOwotICAgIFRUX1NCaXRfTWV0cmljc1JlYyAgbWV0cmljczsKLQotCi0gICAgZmFjZSAgID0gKFRUX0ZhY2UpZ2x5cGgtPmZhY2U7Ci0gICAgc2ZudCAgID0gKFNGTlRfU2VydmljZSlmYWNlLT5zZm50OwotICAgIHN0cmVhbSA9IGZhY2UtPnJvb3Quc3RyZWFtOwotCi0gICAgZXJyb3IgPSBzZm50LT5sb2FkX3NiaXRfaW1hZ2UoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUtPnN0cmlrZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9VSW50KWxvYWRfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdseXBoLT5iaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXRyaWNzICk7Ci0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIGdseXBoLT5vdXRsaW5lLm5fcG9pbnRzICAgPSAwOwotICAgICAgZ2x5cGgtPm91dGxpbmUubl9jb250b3VycyA9IDA7Ci0KLSAgICAgIGdseXBoLT5tZXRyaWNzLndpZHRoICA9IChGVF9Qb3MpbWV0cmljcy53aWR0aCAgKiA2NDsKLSAgICAgIGdseXBoLT5tZXRyaWNzLmhlaWdodCA9IChGVF9Qb3MpbWV0cmljcy5oZWlnaHQgKiA2NDsKLQotICAgICAgZ2x5cGgtPm1ldHJpY3MuaG9yaUJlYXJpbmdYID0gKEZUX1BvcyltZXRyaWNzLmhvcmlCZWFyaW5nWCAqIDY0OwotICAgICAgZ2x5cGgtPm1ldHJpY3MuaG9yaUJlYXJpbmdZID0gKEZUX1BvcyltZXRyaWNzLmhvcmlCZWFyaW5nWSAqIDY0OwotICAgICAgZ2x5cGgtPm1ldHJpY3MuaG9yaUFkdmFuY2UgID0gKEZUX1BvcyltZXRyaWNzLmhvcmlBZHZhbmNlICAqIDY0OwotCi0gICAgICBnbHlwaC0+bWV0cmljcy52ZXJ0QmVhcmluZ1ggPSAoRlRfUG9zKW1ldHJpY3MudmVydEJlYXJpbmdYICogNjQ7Ci0gICAgICBnbHlwaC0+bWV0cmljcy52ZXJ0QmVhcmluZ1kgPSAoRlRfUG9zKW1ldHJpY3MudmVydEJlYXJpbmdZICogNjQ7Ci0gICAgICBnbHlwaC0+bWV0cmljcy52ZXJ0QWR2YW5jZSAgPSAoRlRfUG9zKW1ldHJpY3MudmVydEFkdmFuY2UgICogNjQ7Ci0KLSAgICAgIGdseXBoLT5mb3JtYXQgPSBGVF9HTFlQSF9GT1JNQVRfQklUTUFQOwotCi0gICAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCApCi0gICAgICB7Ci0gICAgICAgIGdseXBoLT5iaXRtYXBfbGVmdCA9IG1ldHJpY3MudmVydEJlYXJpbmdYOwotICAgICAgICBnbHlwaC0+Yml0bWFwX3RvcCAgPSBtZXRyaWNzLnZlcnRCZWFyaW5nWTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZ2x5cGgtPmJpdG1hcF9sZWZ0ID0gbWV0cmljcy5ob3JpQmVhcmluZ1g7Ci0gICAgICAgIGdseXBoLT5iaXRtYXBfdG9wICA9IG1ldHJpY3MuaG9yaUJlYXJpbmdZOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTICovCi0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfbG9hZGVyX2luaXQoIFRUX0xvYWRlciAgICAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgVFRfU2l6ZSAgICAgICBzaXplLAotICAgICAgICAgICAgICAgICAgVFRfR2x5cGhTbG90ICBnbHlwaCwKLSAgICAgICAgICAgICAgICAgIEZUX0ludDMyICAgICAgbG9hZF9mbGFncywKLSAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgICAgZ2x5Zl90YWJsZV9vbmx5ICkKLSAgewotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotICAgIFRUX0ZhY2UgICAgZmFjZTsKLSAgICBGVF9TdHJlYW0gIHN0cmVhbTsKLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLSAgICBGVF9Cb29sICAgIHBlZGFudGljID0gRlRfQk9PTCggbG9hZF9mbGFncyAmIEZUX0xPQURfUEVEQU5USUMgKTsKLSNlbmRpZgotCi0KLSAgICBmYWNlICAgPSAoVFRfRmFjZSlnbHlwaC0+ZmFjZTsKLSAgICBzdHJlYW0gPSBmYWNlLT5yb290LnN0cmVhbTsKLQotICAgIEZUX01FTV9aRVJPKCBsb2FkZXIsIHNpemVvZiAoIFRUX0xvYWRlclJlYyApICk7Ci0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotICAgIC8qIGxvYWQgZXhlY3V0aW9uIGNvbnRleHQgKi8KLSAgICBpZiAoIElTX0hJTlRFRCggbG9hZF9mbGFncyApICYmICFnbHlmX3RhYmxlX29ubHkgKQotICAgIHsKLSAgICAgIFRUX0V4ZWNDb250ZXh0ICBleGVjOwotICAgICAgRlRfQm9vbCAgICAgICAgIGdyYXlzY2FsZTsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotICAgICAgVFRfRHJpdmVyICBkcml2ZXIgPSAoVFRfRHJpdmVyKUZUX0ZBQ0VfRFJJVkVSKCBmYWNlICk7Ci0KLSAgICAgIEZUX0Jvb2wgIHN1YnBpeGVsX2hpbnRpbmcgPSBGQUxTRTsKLQotI2lmIDAKLSAgICAgIC8qIG5vdCB1c2VkIHlldCAqLwotICAgICAgRlRfQm9vbCAgY29tcGF0aWJsZV93aWR0aHM7Ci0gICAgICBGVF9Cb29sICBzeW1tZXRyaWNhbF9zbW9vdGhpbmc7Ci0gICAgICBGVF9Cb29sICBiZ3I7Ci0gICAgICBGVF9Cb29sICB2ZXJ0aWNhbF9sY2Q7Ci0gICAgICBGVF9Cb29sICBzdWJwaXhlbF9wb3NpdGlvbmVkOwotICAgICAgRlRfQm9vbCAgZ3JheV9jbGVhcnR5cGU7Ci0jZW5kaWYKLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KLQotICAgICAgRlRfQm9vbCAgcmVleGVjdXRlID0gRkFMU0U7Ci0KLQotICAgICAgaWYgKCBzaXplLT5ieXRlY29kZV9yZWFkeSA8IDAgfHwgc2l6ZS0+Y3Z0X3JlYWR5IDwgMCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gdHRfc2l6ZV9yZWFkeV9ieXRlY29kZSggc2l6ZSwgcGVkYW50aWMgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoIHNpemUtPmJ5dGVjb2RlX3JlYWR5ICkKLSAgICAgICAgcmV0dXJuIHNpemUtPmJ5dGVjb2RlX3JlYWR5OwotICAgICAgZWxzZSBpZiAoIHNpemUtPmN2dF9yZWFkeSApCi0gICAgICAgIHJldHVybiBzaXplLT5jdnRfcmVhZHk7Ci0KLSAgICAgIC8qIHF1ZXJ5IG5ldyBleGVjdXRpb24gY29udGV4dCAqLwotICAgICAgZXhlYyA9IHNpemUtPmNvbnRleHQ7Ci0gICAgICBpZiAoICFleGVjICkKLSAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBDb3VsZF9Ob3RfRmluZF9Db250ZXh0ICk7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLQotICAgICAgaWYgKCBkcml2ZXItPmludGVycHJldGVyX3ZlcnNpb24gPT0gVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zOCApCi0gICAgICB7Ci0gICAgICAgIHN1YnBpeGVsX2hpbnRpbmcgPSBGVF9CT09MKCAoIEZUX0xPQURfVEFSR0VUX01PREUoIGxvYWRfZmxhZ3MgKSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9SRU5ERVJfTU9ERV9NT05PICAgICAgICAgICAgICAgKSAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQSF9PUFRJT05fU0VUX1NVQlBJWEVMICAgICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgaWYgKCBzdWJwaXhlbF9oaW50aW5nICkKLSAgICAgICAgICBncmF5c2NhbGUgPSBGQUxTRTsKLSAgICAgICAgZWxzZSBpZiAoIFNQSF9PUFRJT05fU0VUX0dSQVlTQ0FMRSApCi0gICAgICAgIHsKLSAgICAgICAgICBncmF5c2NhbGUgICAgICAgID0gVFJVRTsKLSAgICAgICAgICBzdWJwaXhlbF9oaW50aW5nID0gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGdyYXlzY2FsZSA9IEZBTFNFOwotCi0gICAgICAgIGlmICggRlRfSVNfVFJJQ0tZKCBnbHlwaC0+ZmFjZSApICkKLSAgICAgICAgICBzdWJwaXhlbF9oaW50aW5nID0gRkFMU0U7Ci0KLSAgICAgICAgZXhlYy0+aWdub3JlX3hfbW9kZSAgICAgID0gc3VicGl4ZWxfaGludGluZyB8fCBncmF5c2NhbGU7Ci0gICAgICAgIGV4ZWMtPnJhc3Rlcml6ZXJfdmVyc2lvbiA9IFNQSF9PUFRJT05fU0VUX1JBU1RFUklaRVJfVkVSU0lPTjsKLSAgICAgICAgaWYgKCBleGVjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfUkFTVEVSSVpFUl8zNSApCi0gICAgICAgICAgZXhlYy0+cmFzdGVyaXplcl92ZXJzaW9uID0gVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zNTsKLQotI2lmIDEKLSAgICAgICAgZXhlYy0+Y29tcGF0aWJsZV93aWR0aHMgICAgID0gU1BIX09QVElPTl9TRVRfQ09NUEFUSUJMRV9XSURUSFM7Ci0gICAgICAgIGV4ZWMtPnN5bW1ldHJpY2FsX3Ntb290aGluZyA9IFRSVUU7Ci0gICAgICAgIGV4ZWMtPmJnciAgICAgICAgICAgICAgICAgICA9IEZBTFNFOwotICAgICAgICBleGVjLT52ZXJ0aWNhbF9sY2QgICAgICAgICAgPSBGQUxTRTsKLSAgICAgICAgZXhlYy0+c3VicGl4ZWxfcG9zaXRpb25lZCAgID0gVFJVRTsKLSAgICAgICAgZXhlYy0+Z3JheV9jbGVhcnR5cGUgICAgICAgID0gRkFMU0U7Ci0jZWxzZSAvKiAwICovCi0gICAgICAgIGV4ZWMtPmNvbXBhdGlibGVfd2lkdGhzID0KLSAgICAgICAgICBGVF9CT09MKCBGVF9MT0FEX1RBUkdFVF9NT0RFKCBsb2FkX2ZsYWdzICkgIT0KLSAgICAgICAgICAgICAgICAgICBUVF9MT0FEX0NPTVBBVElCTEVfV0lEVEhTICk7Ci0gICAgICAgIGV4ZWMtPnN5bW1ldHJpY2FsX3Ntb290aGluZyA9Ci0gICAgICAgICAgRlRfQk9PTCggRlRfTE9BRF9UQVJHRVRfTU9ERSggbG9hZF9mbGFncyApICE9Ci0gICAgICAgICAgICAgICAgICAgVFRfTE9BRF9TWU1NRVRSSUNBTF9TTU9PVEhJTkcgKTsKLSAgICAgICAgZXhlYy0+YmdyID0KLSAgICAgICAgICBGVF9CT09MKCBGVF9MT0FEX1RBUkdFVF9NT0RFKCBsb2FkX2ZsYWdzICkgIT0KLSAgICAgICAgICAgICAgICAgICBUVF9MT0FEX0JHUiApOwotICAgICAgICBleGVjLT52ZXJ0aWNhbF9sY2QgPQotICAgICAgICAgIEZUX0JPT0woIEZUX0xPQURfVEFSR0VUX01PREUoIGxvYWRfZmxhZ3MgKSAhPQotICAgICAgICAgICAgICAgICAgIFRUX0xPQURfVkVSVElDQUxfTENEICk7Ci0gICAgICAgIGV4ZWMtPnN1YnBpeGVsX3Bvc2l0aW9uZWQgPQotICAgICAgICAgIEZUX0JPT0woIEZUX0xPQURfVEFSR0VUX01PREUoIGxvYWRfZmxhZ3MgKSAhPQotICAgICAgICAgICAgICAgICAgIFRUX0xPQURfU1VCUElYRUxfUE9TSVRJT05FRCApOwotICAgICAgICBleGVjLT5ncmF5X2NsZWFydHlwZSA9Ci0gICAgICAgICAgRlRfQk9PTCggRlRfTE9BRF9UQVJHRVRfTU9ERSggbG9hZF9mbGFncyApICE9Ci0gICAgICAgICAgICAgICAgICAgVFRfTE9BRF9HUkFZX0NMRUFSVFlQRSApOwotI2VuZGlmIC8qIDAgKi8KLQotICAgICAgfQotICAgICAgZWxzZQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0KLSAgICAgIHsKLSAgICAgICAgZ3JheXNjYWxlID0gRlRfQk9PTCggRlRfTE9BRF9UQVJHRVRfTU9ERSggbG9hZF9mbGFncyApICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JFTkRFUl9NT0RFX01PTk8gKTsKLSAgICAgIH0KLQotICAgICAgZXJyb3IgPSBUVF9Mb2FkX0NvbnRleHQoIGV4ZWMsIGZhY2UsIHNpemUgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICByZXR1cm4gZXJyb3I7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLQotICAgICAgaWYgKCBkcml2ZXItPmludGVycHJldGVyX3ZlcnNpb24gPT0gVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zOCApCi0gICAgICB7Ci0gICAgICAgIC8qIGEgY2hhbmdlIGZyb20gbW9ubyB0byBzdWJwaXhlbCByZW5kZXJpbmcgKGFuZCB2aWNlIHZlcnNhKSAqLwotICAgICAgICAvKiByZXF1aXJlcyBhIHJlLWV4ZWN1dGlvbiBvZiB0aGUgQ1ZUIHByb2dyYW0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBzdWJwaXhlbF9oaW50aW5nICE9IGV4ZWMtPnN1YnBpeGVsX2hpbnRpbmcgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0U0KCggInR0X2xvYWRlcl9pbml0OiBzdWJwaXhlbCBoaW50aW5nIGNoYW5nZSwiCi0gICAgICAgICAgICAgICAgICAgICAgIiByZS1leGVjdXRpbmcgYHByZXAnIHRhYmxlXG4iICkpOwotCi0gICAgICAgICAgZXhlYy0+c3VicGl4ZWxfaGludGluZyA9IHN1YnBpeGVsX2hpbnRpbmc7Ci0gICAgICAgICAgcmVleGVjdXRlICAgICAgICAgICAgICA9IFRSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBhIGNoYW5nZSBmcm9tIG1vbm8gdG8gZ3JheXNjYWxlIHJlbmRlcmluZyAoYW5kIHZpY2UgdmVyc2EpICovCi0gICAgICAgIC8qIHJlcXVpcmVzIGEgcmUtZXhlY3V0aW9uIG9mIHRoZSBDVlQgcHJvZ3JhbSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBncmF5c2NhbGUgIT0gZXhlYy0+Z3JheXNjYWxlICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFNCgoICJ0dF9sb2FkZXJfaW5pdDogZ3JheXNjYWxlIGhpbnRpbmcgY2hhbmdlLCIKLSAgICAgICAgICAgICAgICAgICAgICAiIHJlLWV4ZWN1dGluZyBgcHJlcCcgdGFibGVcbiIgKSk7Ci0KLSAgICAgICAgICBleGVjLT5ncmF5c2NhbGUgPSBncmF5c2NhbGU7Ci0gICAgICAgICAgcmVleGVjdXRlICAgICAgID0gVFJVRTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0KLSAgICAgIHsKLSAgICAgICAgLyogYSBjaGFuZ2UgZnJvbSBtb25vIHRvIGdyYXlzY2FsZSByZW5kZXJpbmcgKGFuZCB2aWNlIHZlcnNhKSAqLwotICAgICAgICAvKiByZXF1aXJlcyBhIHJlLWV4ZWN1dGlvbiBvZiB0aGUgQ1ZUIHByb2dyYW0gICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggZ3JheXNjYWxlICE9IGV4ZWMtPmdyYXlzY2FsZSApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9UUkFDRTQoKCAidHRfbG9hZGVyX2luaXQ6IGdyYXlzY2FsZSBoaW50aW5nIGNoYW5nZSwiCi0gICAgICAgICAgICAgICAgICAgICAgIiByZS1leGVjdXRpbmcgYHByZXAnIHRhYmxlXG4iICkpOwotCi0gICAgICAgICAgZXhlYy0+Z3JheXNjYWxlID0gZ3JheXNjYWxlOwotICAgICAgICAgIHJlZXhlY3V0ZSAgICAgICA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCByZWV4ZWN1dGUgKQotICAgICAgewotICAgICAgICBGVF9VSW50ICBpOwotCi0KLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBzaXplLT5jdnRfc2l6ZTsgaSsrICkKLSAgICAgICAgICBzaXplLT5jdnRbaV0gPSBGVF9NdWxGaXgoIGZhY2UtPmN2dFtpXSwgc2l6ZS0+dHRtZXRyaWNzLnNjYWxlICk7Ci0gICAgICAgIGVycm9yID0gdHRfc2l6ZV9ydW5fcHJlcCggc2l6ZSwgcGVkYW50aWMgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgcmV0dXJuIGVycm9yOwotICAgICAgfQotCi0gICAgICAvKiBjaGVjayB3aGV0aGVyIHRoZSBjdnQgcHJvZ3JhbSBoYXMgZGlzYWJsZWQgaGludGluZyAqLwotICAgICAgaWYgKCBleGVjLT5HUy5pbnN0cnVjdF9jb250cm9sICYgMSApCi0gICAgICAgIGxvYWRfZmxhZ3MgfD0gRlRfTE9BRF9OT19ISU5USU5HOwotCi0gICAgICAvKiBsb2FkIGRlZmF1bHQgZ3JhcGhpY3Mgc3RhdGUgLS0gaWYgbmVlZGVkICovCi0gICAgICBpZiAoIGV4ZWMtPkdTLmluc3RydWN0X2NvbnRyb2wgJiAyICkKLSAgICAgICAgZXhlYy0+R1MgPSB0dF9kZWZhdWx0X2dyYXBoaWNzX3N0YXRlOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0gICAgICAvKiBjaGVjayB3aGV0aGVyIHdlIGhhdmUgYSBmb250IGhpbnRlZCBmb3IgQ2xlYXJUeXBlIC0tICAgICAgICAgICAqLwotICAgICAgLyogbm90ZSB0aGF0IHRoaXMgZmxhZyBjYW4gYWxzbyBiZSBtb2RpZmllZCBpbiBhIGdseXBoJ3MgYnl0ZWNvZGUgKi8KLSAgICAgIGlmICggZXhlYy0+R1MuaW5zdHJ1Y3RfY29udHJvbCAmIDQgKQotICAgICAgICBleGVjLT5pZ25vcmVfeF9tb2RlID0gMDsKLSNlbmRpZgotCi0gICAgICBleGVjLT5wZWRhbnRpY19oaW50aW5nID0gRlRfQk9PTCggbG9hZF9mbGFncyAmIEZUX0xPQURfUEVEQU5USUMgKTsKLSAgICAgIGxvYWRlci0+ZXhlYyA9IGV4ZWM7Ci0gICAgICBsb2FkZXItPmluc3RydWN0aW9ucyA9IGV4ZWMtPmdseXBoSW5zOwotICAgIH0KLQotI2VuZGlmIC8qIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0gICAgLyogc2VlayB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBnbHlwaCB0YWJsZSAtLSBmb3IgVHlwZSA0MiBmb250cyAgICAgKi8KLSAgICAvKiB0aGUgdGFibGUgbWlnaHQgYmUgYWNjZXNzZWQgZnJvbSBhIFBvc3RzY3JpcHQgc3RyZWFtIG9yIHNvbWV0aGluZyAqLwotICAgIC8qIGVsc2UuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0KLSAgICBpZiAoIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSApCi0gICAgICBsb2FkZXItPmdseWZfb2Zmc2V0ID0gMDsKLSAgICBlbHNlCi0KLSNlbmRpZgotCi0gICAgewotICAgICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2dseWYsIHN0cmVhbSwgMCApOwotCi0gICAgICBpZiAoIEZUX0VSUl9FUSggZXJyb3IsIFRhYmxlX01pc3NpbmcgKSApCi0gICAgICAgIGxvYWRlci0+Z2x5Zl9vZmZzZXQgPSAwOwotICAgICAgZWxzZSBpZiAoIGVycm9yICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAidHRfbG9hZGVyX2luaXQ6IGNvdWxkIG5vdCBhY2Nlc3MgZ2x5cGggdGFibGVcbiIgKSk7Ci0gICAgICAgIHJldHVybiBlcnJvcjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgbG9hZGVyLT5nbHlmX29mZnNldCA9IEZUX1NUUkVBTV9QT1MoKTsKLSAgICB9Ci0KLSAgICAvKiBnZXQgZmFjZSdzIGdseXBoIGxvYWRlciAqLwotICAgIGlmICggIWdseWZfdGFibGVfb25seSApCi0gICAgewotICAgICAgRlRfR2x5cGhMb2FkZXIgIGdsb2FkZXIgPSBnbHlwaC0+aW50ZXJuYWwtPmxvYWRlcjsKLQotCi0gICAgICBGVF9HbHlwaExvYWRlcl9SZXdpbmQoIGdsb2FkZXIgKTsKLSAgICAgIGxvYWRlci0+Z2xvYWRlciA9IGdsb2FkZXI7Ci0gICAgfQotCi0gICAgbG9hZGVyLT5sb2FkX2ZsYWdzID0gKEZUX1VMb25nKWxvYWRfZmxhZ3M7Ci0KLSAgICBsb2FkZXItPmZhY2UgICA9IGZhY2U7Ci0gICAgbG9hZGVyLT5zaXplICAgPSBzaXplOwotICAgIGxvYWRlci0+Z2x5cGggID0gKEZUX0dseXBoU2xvdClnbHlwaDsKLSAgICBsb2FkZXItPnN0cmVhbSA9IHN0cmVhbTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0xvYWRfR2x5cGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgZnVuY3Rpb24gdXNlZCB0byBsb2FkIGEgc2luZ2xlIGdseXBoIHdpdGhpbiBhIGdpdmVuIGdseXBoIHNsb3QsICAqLwotICAvKiAgICBmb3IgYSBnaXZlbiBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaCAgICAgICA6OiBBIGhhbmRsZSB0byBhIHRhcmdldCBzbG90IG9iamVjdCB3aGVyZSB0aGUgZ2x5cGggICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgd2lsbCBiZSBsb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc291cmNlIGZhY2Ugc2l6ZSBhdCB3aGljaCB0aGUgZ2x5cGggKi8KLSAgLyogICAgICAgICAgICAgICAgICAgbXVzdCBiZSBzY2FsZWQvbG9hZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGdseXBoIGluIHRoZSBmb250IGZpbGUuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGxvYWRfZmxhZ3MgIDo6IEEgZmxhZyBpbmRpY2F0aW5nIHdoYXQgdG8gbG9hZCBmb3IgdGhpcyBnbHlwaC4gIFRoZSAqLwotICAvKiAgICAgICAgICAgICAgICAgICBGVF9MT0FEX1hYWCBjb25zdGFudHMgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZ2x5cGggbG9hZGluZyBwcm9jZXNzIChlLmcuLCB3aGV0aGVyIHRoZSBvdXRsaW5lICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBzY2FsZWQsIHdoZXRoZXIgdG8gbG9hZCBiaXRtYXBzIG9yIG5vdCwgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICB3aGV0aGVyIHRvIGhpbnQgdGhlIG91dGxpbmUsIGV0YykuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUVF9Mb2FkX0dseXBoKCBUVF9TaXplICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgIFRUX0dseXBoU2xvdCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgIEZUX0ludDMyICAgICAgbG9hZF9mbGFncyApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgIGVycm9yOwotICAgIFRUX0xvYWRlclJlYyAgbG9hZGVyOwotCi0KLSAgICBGVF9UUkFDRTEoKCAiVFRfTG9hZF9HbHlwaDogZ2x5cGggaW5kZXggJWRcbiIsIGdseXBoX2luZGV4ICkpOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTCi0KLSAgICAvKiB0cnkgdG8gbG9hZCBlbWJlZGRlZCBiaXRtYXAgaWYgYW55ICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogWFhYOiBUaGUgY29udmVudGlvbiBzaG91bGQgYmUgZW1waGFzaXplZCBpbiAgICAgKi8KLSAgICAvKiAgICAgIHRoZSBkb2N1bWVudHMgYmVjYXVzZSBpdCBjYW4gYmUgY29uZnVzaW5nLiAqLwotICAgIGlmICggc2l6ZS0+c3RyaWtlX2luZGV4ICE9IDB4RkZGRkZGRkZVTCAgICAgICYmCi0gICAgICAgICAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX0JJVE1BUCApID09IDAgKQotICAgIHsKLSAgICAgIGVycm9yID0gbG9hZF9zYml0X2ltYWdlKCBzaXplLCBnbHlwaCwgZ2x5cGhfaW5kZXgsIGxvYWRfZmxhZ3MgKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBGVF9JU19TQ0FMQUJMRSggZ2x5cGgtPmZhY2UgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBmb3IgdGhlIGJib3ggd2UgbmVlZCB0aGUgaGVhZGVyIG9ubHkgKi8KLSAgICAgICAgICAodm9pZCl0dF9sb2FkZXJfaW5pdCggJmxvYWRlciwgc2l6ZSwgZ2x5cGgsIGxvYWRfZmxhZ3MsIFRSVUUgKTsKLSAgICAgICAgICAodm9pZClsb2FkX3RydWV0eXBlX2dseXBoKCAmbG9hZGVyLCBnbHlwaF9pbmRleCwgMCwgVFJVRSApOwotICAgICAgICAgIGdseXBoLT5saW5lYXJIb3JpQWR2YW5jZSA9IGxvYWRlci5saW5lYXI7Ci0gICAgICAgICAgZ2x5cGgtPmxpbmVhclZlcnRBZHZhbmNlID0gbG9hZGVyLnZhZHZhbmNlOwotCi0gICAgICAgICAgLyogc2FuaXR5IGNoZWNrczogaWYgYHh4eEFkdmFuY2UnIGluIHRoZSBzYml0IG1ldHJpYyAqLwotICAgICAgICAgIC8qIHN0cnVjdHVyZSBpc24ndCBzZXQsIHVzZSBgbGluZWFyWFhYQWR2YW5jZScgICAgICAqLwotICAgICAgICAgIGlmICggIWdseXBoLT5tZXRyaWNzLmhvcmlBZHZhbmNlICYmIGdseXBoLT5saW5lYXJIb3JpQWR2YW5jZSApCi0gICAgICAgICAgICBnbHlwaC0+bWV0cmljcy5ob3JpQWR2YW5jZSA9Ci0gICAgICAgICAgICAgIEZUX011bEZpeCggZ2x5cGgtPmxpbmVhckhvcmlBZHZhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUtPnJvb3QubWV0cmljcy54X3NjYWxlICk7Ci0gICAgICAgICAgaWYgKCAhZ2x5cGgtPm1ldHJpY3MudmVydEFkdmFuY2UgJiYgZ2x5cGgtPmxpbmVhclZlcnRBZHZhbmNlICkKLSAgICAgICAgICAgIGdseXBoLT5tZXRyaWNzLnZlcnRBZHZhbmNlID0KLSAgICAgICAgICAgICAgRlRfTXVsRml4KCBnbHlwaC0+bGluZWFyVmVydEFkdmFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS0+cm9vdC5tZXRyaWNzLnlfc2NhbGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gICAgICB9Ci0gICAgfQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9FTUJFRERFRF9CSVRNQVBTICovCi0KLSAgICAvKiBpZiBGVF9MT0FEX05PX1NDQUxFIGlzIG5vdCBzZXQsIGB0dG1ldHJpY3MnIG11c3QgYmUgdmFsaWQgKi8KLSAgICBpZiAoICEoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICkgJiYgIXNpemUtPnR0bWV0cmljcy52YWxpZCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfU2l6ZV9IYW5kbGUgKTsKLQotICAgIGlmICggbG9hZF9mbGFncyAmIEZUX0xPQURfU0JJVFNfT05MWSApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGVycm9yID0gdHRfbG9hZGVyX2luaXQoICZsb2FkZXIsIHNpemUsIGdseXBoLCBsb2FkX2ZsYWdzLCBGQUxTRSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgZ2x5cGgtPmZvcm1hdCAgICAgICAgPSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORTsKLSAgICBnbHlwaC0+bnVtX3N1YmdseXBocyA9IDA7Ci0gICAgZ2x5cGgtPm91dGxpbmUuZmxhZ3MgPSAwOwotCi0gICAgLyogbWFpbiBsb2FkaW5nIGxvb3AgKi8KLSAgICBlcnJvciA9IGxvYWRfdHJ1ZXR5cGVfZ2x5cGgoICZsb2FkZXIsIGdseXBoX2luZGV4LCAwLCBGQUxTRSApOwotICAgIGlmICggIWVycm9yICkKLSAgICB7Ci0gICAgICBpZiAoIGdseXBoLT5mb3JtYXQgPT0gRlRfR0xZUEhfRk9STUFUX0NPTVBPU0lURSApCi0gICAgICB7Ci0gICAgICAgIGdseXBoLT5udW1fc3ViZ2x5cGhzID0gbG9hZGVyLmdsb2FkZXItPmJhc2UubnVtX3N1YmdseXBoczsKLSAgICAgICAgZ2x5cGgtPnN1YmdseXBocyAgICAgPSBsb2FkZXIuZ2xvYWRlci0+YmFzZS5zdWJnbHlwaHM7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGdseXBoLT5vdXRsaW5lICAgICAgICA9IGxvYWRlci5nbG9hZGVyLT5iYXNlLm91dGxpbmU7Ci0gICAgICAgIGdseXBoLT5vdXRsaW5lLmZsYWdzICY9IH5GVF9PVVRMSU5FX1NJTkdMRV9QQVNTOwotCi0gICAgICAgIC8qIFRyYW5zbGF0ZSBhcnJheSBzbyB0aGF0ICgwLDApIGlzIHRoZSBnbHlwaCdzIG9yaWdpbi4gIE5vdGUgICovCi0gICAgICAgIC8qIHRoYXQgdGhpcyBiZWhhdmlvdXIgaXMgaW5kZXBlbmRlbnQgb24gdGhlIHZhbHVlIG9mIGJpdCAxIG9mICovCi0gICAgICAgIC8qIHRoZSBgZmxhZ3MnIGZpZWxkIGluIHRoZSBgaGVhZCcgdGFibGUgLS0gYXQgbGVhc3QgbWFqb3IgICAgICovCi0gICAgICAgIC8qIGFwcGxpY2F0aW9ucyBsaWtlIEFjcm9yZWFkIGluZGljYXRlIHRoYXQuICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGlmICggbG9hZGVyLnBwMS54ICkKLSAgICAgICAgICBGVF9PdXRsaW5lX1RyYW5zbGF0ZSggJmdseXBoLT5vdXRsaW5lLCAtbG9hZGVyLnBwMS54LCAwICk7Ci0gICAgICB9Ci0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotICAgICAgaWYgKCBJU19ISU5URUQoIGxvYWRfZmxhZ3MgKSApCi0gICAgICB7Ci0gICAgICAgIGlmICggbG9hZGVyLmV4ZWMtPkdTLnNjYW5fY29udHJvbCApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBjb252ZXJ0IHNjYW4gY29udmVyc2lvbiBtb2RlIHRvIEZUX09VVExJTkVfWFhYIGZsYWdzICovCi0gICAgICAgICAgc3dpdGNoICggbG9hZGVyLmV4ZWMtPkdTLnNjYW5fdHlwZSApCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgMDogLyogc2ltcGxlIGRyb3Atb3V0cyBpbmNsdWRpbmcgc3R1YnMgKi8KLSAgICAgICAgICAgIGdseXBoLT5vdXRsaW5lLmZsYWdzIHw9IEZUX09VVExJTkVfSU5DTFVERV9TVFVCUzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTogLyogc2ltcGxlIGRyb3Atb3V0cyBleGNsdWRpbmcgc3R1YnMgKi8KLSAgICAgICAgICAgIC8qIG5vdGhpbmc7IGl0J3MgdGhlIGRlZmF1bHQgcmVuZGVyaW5nIG1vZGUgKi8KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgNDogLyogc21hcnQgZHJvcC1vdXRzIGluY2x1ZGluZyBzdHVicyAqLwotICAgICAgICAgICAgZ2x5cGgtPm91dGxpbmUuZmxhZ3MgfD0gRlRfT1VUTElORV9TTUFSVF9EUk9QT1VUUyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PVVRMSU5FX0lOQ0xVREVfU1RVQlM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDU6IC8qIHNtYXJ0IGRyb3Atb3V0cyBleGNsdWRpbmcgc3R1YnMgICovCi0gICAgICAgICAgICBnbHlwaC0+b3V0bGluZS5mbGFncyB8PSBGVF9PVVRMSU5FX1NNQVJUX0RST1BPVVRTOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBkZWZhdWx0OiAvKiBubyBkcm9wLW91dCBjb250cm9sICovCi0gICAgICAgICAgICBnbHlwaC0+b3V0bGluZS5mbGFncyB8PSBGVF9PVVRMSU5FX0lHTk9SRV9EUk9QT1VUUzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgZ2x5cGgtPm91dGxpbmUuZmxhZ3MgfD0gRlRfT1VUTElORV9JR05PUkVfRFJPUE9VVFM7Ci0gICAgICB9Ci0KLSNlbmRpZiAvKiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgKi8KLQotICAgICAgZXJyb3IgPSBjb21wdXRlX2dseXBoX21ldHJpY3MoICZsb2FkZXIsIGdseXBoX2luZGV4ICk7Ci0gICAgfQotCi0gICAgLyogU2V0IHRoZSBgaGlnaCBwcmVjaXNpb24nIGJpdCBmbGFnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogVGhpcyBpcyBfY3JpdGljYWxfIHRvIGdldCBjb3JyZWN0IG91dHB1dCBmb3IgbW9ub2Nocm9tZSAgICAgICovCi0gICAgLyogVHJ1ZVR5cGUgZ2x5cGhzIGF0IGFsbCBzaXplcyB1c2luZyB0aGUgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIuICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCAhKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSApICYmCi0gICAgICAgICBzaXplLT5yb290Lm1ldHJpY3MueV9wcGVtIDwgMjQgICAgICkKLSAgICAgIGdseXBoLT5vdXRsaW5lLmZsYWdzIHw9IEZUX09VVExJTkVfSElHSF9QUkVDSVNJT047Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGdsb2FkLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRnbG9hZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTMyNTVlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGdsb2FkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dGdsb2FkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUgR2x5cGggTG9hZGVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19UVEdMT0FEX0hfXwotI2RlZmluZSBfX1RUR0xPQURfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAidHRvYmpzLmgiCi0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLSNpbmNsdWRlICJ0dGludGVycC5oIgotI2VuZGlmCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIFRUX0luaXRfR2x5cGhfTG9hZGluZyggVFRfRmFjZSAgZmFjZSApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgVFRfR2V0X0hNZXRyaWNzKCBUVF9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCogICBsc2IsCi0gICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgYXcgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIFRUX0dldF9WTWV0cmljcyggVFRfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgeU1heCwKLSAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCogICB0c2IsCi0gICAgICAgICAgICAgICAgICAgRlRfVVNob3J0KiAgYWggKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBUVF9Mb2FkX0dseXBoKCBUVF9TaXplICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgIFRUX0dseXBoU2xvdCAgZ2x5cGgsCi0gICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgIEZUX0ludDMyICAgICAgbG9hZF9mbGFncyApOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fVFRHTE9BRF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGd4dmFyLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRneHZhci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDllMjUwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGd4dmFyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0Z3h2YXIuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZSBHWCBGb250IFZhcmlhdGlvbiBsb2FkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwNC0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgV2VybmVyIExlbWJlcmcsIGFuZCBHZW9yZ2UgV2lsbGlhbXMuICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFwcGxlIGRvY3VtZW50cyB0aGUgYGZ2YXInLCBgZ3ZhcicsIGBjdmFyJywgYW5kIGBhdmFyJyB0YWJsZXMgYXQgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZm9udHMvVHJ1ZVR5cGUtUmVmZXJlbmNlLU1hbnVhbC9STTA2L0NoYXA2W2ZnY2FddmFyLmh0bWwgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBkb2N1bWVudGF0aW9uIGZvciBgZnZhcicgaXMgaW5jb25zaXN0ZW50LiAgQXQgb25lIHBvaW50IGl0IHNheXMgICAqLwotICAvKiB0aGF0IGBjb3VudFNpemVQYWlycycgc2hvdWxkIGJlIDMsIGF0IGFub3RoZXIgcG9pbnQgMi4gIEl0IHNob3VsZCAgICAgKi8KLSAgLyogYmUgMi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgYGd2YXInIGlzIG5vdCBpbnRlbGxpZ2libGU7IGBjdmFyJyByZWZlcnMgeW91ICAgKi8KLSAgLyogdG8gYGd2YXInIGFuZCBpcyB0aHVzIGFsc28gaW5jb21wcmVoZW5zaWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgZG9jdW1lbnRhdGlvbiBmb3IgYGF2YXInIGFwcGVhcnMgY29ycmVjdCwgYnV0IEFwcGxlIGhhcyBubyBmb250cyAgKi8KLSAgLyogd2l0aCBhbiBgYXZhcicgdGFibGUsIHNvIGl0IGlzIGhhcmQgdG8gdGVzdC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNYW55IHRoYW5rcyB0byBKb2huIEplbmtpbnMgKGF0IEFwcGxlKSBpbiBmaWd1cmluZyB0aGlzIG91dC4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBcHBsZSdzIGBrZXJuJyB0YWJsZSBoYXMgc29tZSByZWZlcmVuY2VzIHRvIHR1cGxlIGluZGljZXMsIGJ1dCBhcyAgICAgKi8KLSAgLyogdGhlcmUgaXMgbm8gaW5kaWNhdGlvbiB3aGVyZSB0aGVzZSBpbmRpY2VzIGFyZSBkZWZpbmVkLCBub3IgaG93IHRvICAgICovCi0gIC8qIGludGVycG9sYXRlIHRoZSBrZXJuaW5nIHZhbHVlcyAoZGlmZmVyZW50IHR1cGxlcyBoYXZlIGRpZmZlcmVudCAgICAgICAqLwotICAvKiBjbGFzc2VzKSB0aGlzIGlzc3VlIGlzIGlnbm9yZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU0ZOVF9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLSNpbmNsdWRlIEZUX01VTFRJUExFX01BU1RFUlNfSAotCi0jaW5jbHVkZSAidHRwbG9hZC5oIgotI2luY2x1ZGUgInR0Z3h2YXIuaCIKLQotI2luY2x1ZGUgInR0ZXJyb3JzLmgiCi0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLQotCi0jZGVmaW5lIEZUX1N0cmVhbV9GVGVsbCggc3RyZWFtICkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIChGVF9VTG9uZykoIChzdHJlYW0pLT5jdXJzb3IgLSAoc3RyZWFtKS0+YmFzZSApCi0jZGVmaW5lIEZUX1N0cmVhbV9TZWVrU2V0KCBzdHJlYW0sIG9mZiApICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggKHN0cmVhbSktPmN1cnNvciA9IChzdHJlYW0pLT5iYXNlICsgKG9mZikgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRneHZhcgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICBJbnRlcm5hbCBSb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBBTExfUE9JTlRTIGlzIHVzZWQgaW4gYGZ0X3Zhcl9yZWFkcGFja2VkcG9pbnRzJy4gIEl0ICAgICAgICAqLwotICAvKiBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBhIGRlbHRhIGZvciBldmVyeSBwb2ludCB3aXRob3V0IG5lZWRpbmcgdG8gICAgKi8KLSAgLyogZW51bWVyYXRlIGFsbCBvZiB0aGVtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIGVuc3VyZSB0aGF0IHZhbHVlIGAwJyBoYXMgdGhlIHNhbWUgd2lkdGggYXMgYSBwb2ludGVyICovCi0jZGVmaW5lIEFMTF9QT0lOVFMgIChGVF9VU2hvcnQqKX4oRlRfUHRyRGlzdCkwCi0KLQotI2RlZmluZSBHWF9QVF9QT0lOVFNfQVJFX1dPUkRTICAgICAgMHg4MFUKLSNkZWZpbmUgR1hfUFRfUE9JTlRfUlVOX0NPVU5UX01BU0sgIDB4N0ZVCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF92YXJfcmVhZHBhY2tlZHBvaW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZWFkIGEgc2V0IG9mIHBvaW50cyB0byB3aGljaCB0aGUgZm9sbG93aW5nIGRlbHRhcyB3aWxsIGFwcGx5LiAgICAgKi8KLSAgLyogICAgUG9pbnRzIGFyZSBwYWNrZWQgd2l0aCBhIHJ1biBsZW5ndGggZW5jb2RpbmcuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtICAgIDo6IFRoZSBkYXRhIHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8T3V0cHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9pbnRfY250IDo6IFRoZSBudW1iZXIgb2YgcG9pbnRzIHJlYWQuICBBIHplcm8gdmFsdWUgbWVhbnMgdGhhdCAgICovCi0gIC8qICAgICAgICAgICAgICAgICBhbGwgcG9pbnRzIGluIHRoZSBnbHlwaCB3aWxsIGJlIGFmZmVjdGVkLCB3aXRob3V0ICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgZW51bWVyYXRpbmcgdGhlbSBpbmRpdmlkdWFsbHkuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBbiBhcnJheSBvZiBGVF9VU2hvcnQgY29udGFpbmluZyB0aGUgYWZmZWN0ZWQgcG9pbnRzIG9yIHRoZSAgICAgICAgKi8KLSAgLyogICAgc3BlY2lhbCB2YWx1ZSBBTExfUE9JTlRTLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfVVNob3J0KgotICBmdF92YXJfcmVhZHBhY2tlZHBvaW50cyggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgKnBvaW50X2NudCApCi0gIHsKLSAgICBGVF9VU2hvcnQgKnBvaW50cyA9IE5VTEw7Ci0gICAgRlRfVUludCAgICBuOwotICAgIEZUX1VJbnQgICAgcnVuY250OwotICAgIEZUX1VJbnQgICAgaSwgajsKLSAgICBGVF9VU2hvcnQgIGZpcnN0OwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gc3RyZWFtLT5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0KLSAgICBGVF9VTlVTRUQoIGVycm9yICk7Ci0KLQotICAgICpwb2ludF9jbnQgPSAwOwotCi0gICAgbiA9IEZUX0dFVF9CWVRFKCk7Ci0gICAgaWYgKCBuID09IDAgKQotICAgICAgcmV0dXJuIEFMTF9QT0lOVFM7Ci0KLSAgICBpZiAoIG4gJiBHWF9QVF9QT0lOVFNfQVJFX1dPUkRTICkKLSAgICB7Ci0gICAgICBuICAmPSBHWF9QVF9QT0lOVF9SVU5fQ09VTlRfTUFTSzsKLSAgICAgIG4gPDw9IDg7Ci0gICAgICBuICB8PSBGVF9HRVRfQllURSgpOwotICAgIH0KLQotICAgIGlmICggRlRfTkVXX0FSUkFZKCBwb2ludHMsIG4gKSApCi0gICAgICByZXR1cm4gTlVMTDsKLQotICAgICpwb2ludF9jbnQgPSBuOwotCi0gICAgaSA9IDA7Ci0gICAgd2hpbGUgKCBpIDwgbiApCi0gICAgewotICAgICAgcnVuY250ID0gRlRfR0VUX0JZVEUoKTsKLSAgICAgIGlmICggcnVuY250ICYgR1hfUFRfUE9JTlRTX0FSRV9XT1JEUyApCi0gICAgICB7Ci0gICAgICAgIHJ1bmNudCAgICAgJj0gR1hfUFRfUE9JTlRfUlVOX0NPVU5UX01BU0s7Ci0gICAgICAgIGZpcnN0ICAgICAgID0gRlRfR0VUX1VTSE9SVCgpOwotICAgICAgICBwb2ludHNbaSsrXSA9IGZpcnN0OwotCi0gICAgICAgIGlmICggcnVuY250IDwgMSB8fCBpICsgcnVuY250ID4gbiApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIC8qIGZpcnN0IHBvaW50IG5vdCBpbmNsdWRlZCBpbiBydW4gY291bnQgKi8KLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBydW5jbnQ7IGorKyApCi0gICAgICAgIHsKLSAgICAgICAgICBmaXJzdCAgICAgICs9IEZUX0dFVF9VU0hPUlQoKTsKLSAgICAgICAgICBwb2ludHNbaSsrXSA9IGZpcnN0OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGZpcnN0ICAgICAgID0gRlRfR0VUX0JZVEUoKTsKLSAgICAgICAgcG9pbnRzW2krK10gPSBmaXJzdDsKLQotICAgICAgICBpZiAoIHJ1bmNudCA8IDEgfHwgaSArIHJ1bmNudCA+IG4gKQotICAgICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IHJ1bmNudDsgaisrICkKLSAgICAgICAgewotICAgICAgICAgIGZpcnN0ICAgICAgKz0gRlRfR0VUX0JZVEUoKTsKLSAgICAgICAgICBwb2ludHNbaSsrXSA9IGZpcnN0OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIHBvaW50czsKLSAgfQotCi0KLSNkZWZpbmUgR1hfRFRfREVMVEFTX0FSRV9aRVJPICAgICAgIDB4ODBVCi0jZGVmaW5lIEdYX0RUX0RFTFRBU19BUkVfV09SRFMgICAgICAweDQwVQotI2RlZmluZSBHWF9EVF9ERUxUQV9SVU5fQ09VTlRfTUFTSyAgMHgzRlUKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X3Zhcl9yZWFkcGFja2VkZGVsdGFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlYWQgYSBzZXQgb2YgZGVsdGFzLiAgVGhlc2UgYXJlIHBhY2tlZCBzbGlnaHRseSBkaWZmZXJlbnRseSB0aGFuICAqLwotICAvKiAgICBwb2ludHMuICBJbiBwYXJ0aWN1bGFyIHRoZXJlIGlzIG5vIG92ZXJhbGwgY291bnQuICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgOjogVGhlIGRhdGEgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRlbHRhX2NudCA6OiBUaGUgbnVtYmVyIG9mIGRlbHRhcyB0byBiZSByZWFkLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFuIGFycmF5IG9mIEZUX1Nob3J0IGNvbnRhaW5pbmcgdGhlIGRlbHRhcyBmb3IgdGhlIGFmZmVjdGVkICAgICAgICAqLwotICAvKiAgICBwb2ludHMuICAoVGhpcyBvbmx5IGdldHMgdGhlIGRlbHRhcyBmb3Igb25lIGRpbWVuc2lvbi4gIEl0IHdpbGwgICAgKi8KLSAgLyogICAgZ2VuZXJhbGx5IGJlIGNhbGxlZCB0d2ljZSwgb25jZSBmb3IgeCwgb25jZSBmb3IgeS4gIFdoZW4gdXNlZCBpbiAgICovCi0gIC8qICAgIGN2dCB0YWJsZSwgaXQgd2lsbCBvbmx5IGJlIGNhbGxlZCBvbmNlLikgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX1Nob3J0KgotICBmdF92YXJfcmVhZHBhY2tlZGRlbHRhcyggRlRfU3RyZWFtICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGRlbHRhX2NudCApCi0gIHsKLSAgICBGVF9TaG9ydCAgKmRlbHRhcyA9IE5VTEw7Ci0gICAgRlRfVUludCAgICBydW5jbnQsIGNudDsKLSAgICBGVF9VSW50ICAgIGksIGo7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBGVF9FcnJvciAgIGVycm9yICA9IEZUX0Vycl9PazsKLQotICAgIEZUX1VOVVNFRCggZXJyb3IgKTsKLQotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIGRlbHRhcywgZGVsdGFfY250ICkgKQotICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBpID0gMDsKLSAgICB3aGlsZSAoIGkgPCBkZWx0YV9jbnQgKQotICAgIHsKLSAgICAgIHJ1bmNudCA9IEZUX0dFVF9CWVRFKCk7Ci0gICAgICBjbnQgICAgPSBydW5jbnQgJiBHWF9EVF9ERUxUQV9SVU5fQ09VTlRfTUFTSzsKLQotICAgICAgaWYgKCBydW5jbnQgJiBHWF9EVF9ERUxUQVNfQVJFX1pFUk8gKQotICAgICAgewotICAgICAgICAvKiBgcnVuY250JyB6ZXJvZXMgZ2V0IGFkZGVkICovCi0gICAgICAgIGZvciAoIGogPSAwOyBqIDw9IGNudCAmJiBpIDwgZGVsdGFfY250OyBqKysgKQotICAgICAgICAgIGRlbHRhc1tpKytdID0gMDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBydW5jbnQgJiBHWF9EVF9ERUxUQVNfQVJFX1dPUkRTICkKLSAgICAgIHsKLSAgICAgICAgLyogYHJ1bmNudCcgc2hvcnRzIGZyb20gdGhlIHN0YWNrICovCi0gICAgICAgIGZvciAoIGogPSAwOyBqIDw9IGNudCAmJiBpIDwgZGVsdGFfY250OyBqKysgKQotICAgICAgICAgIGRlbHRhc1tpKytdID0gRlRfR0VUX1NIT1JUKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGBydW5jbnQnIHNpZ25lZCBieXRlcyBmcm9tIHRoZSBzdGFjayAqLwotICAgICAgICBmb3IgKCBqID0gMDsgaiA8PSBjbnQgJiYgaSA8IGRlbHRhX2NudDsgaisrICkKLSAgICAgICAgICBkZWx0YXNbaSsrXSA9IEZUX0dFVF9DSEFSKCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggaiA8PSBjbnQgKQotICAgICAgewotICAgICAgICAvKiBiYWQgZm9ybWF0ICovCi0gICAgICAgIEZUX0ZSRUUoIGRlbHRhcyApOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gZGVsdGFzOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF92YXJfbG9hZF9hdmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQYXJzZSB0aGUgYGF2YXInIHRhYmxlIGlmIHByZXNlbnQuICBJdCBuZWVkIG5vdCBiZSwgc28gd2UgcmV0dXJuICAgKi8KLSAgLyogICAgbm90aGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSA6OiBUaGUgZm9udCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBmdF92YXJfbG9hZF9hdmFyKCBUVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX1N0cmVhbSAgICAgICBzdHJlYW0gPSBGVF9GQUNFX1NUUkVBTSggZmFjZSApOwotICAgIEZUX01lbW9yeSAgICAgICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBHWF9CbGVuZCAgICAgICAgYmxlbmQgID0gZmFjZS0+YmxlbmQ7Ci0gICAgR1hfQVZhclNlZ21lbnQgIHNlZ21lbnQ7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIEZUX0xvbmcgICAgICAgICB2ZXJzaW9uOwotICAgIEZUX0xvbmcgICAgICAgICBheGlzQ291bnQ7Ci0gICAgRlRfSW50ICAgICAgICAgIGksIGo7Ci0gICAgRlRfVUxvbmcgICAgICAgIHRhYmxlX2xlbjsKLQotICAgIEZUX1VOVVNFRCggZXJyb3IgKTsKLQotCi0gICAgRlRfVFJBQ0UyKCggIkFWQVIgIiApKTsKLQotICAgIGJsZW5kLT5hdmFyX2NoZWNrZWQgPSBUUlVFOwotICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19hdmFyLCBzdHJlYW0sICZ0YWJsZV9sZW4gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiaXMgbWlzc2luZ1xuIiApKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIEZUX0ZSQU1FX0VOVEVSKCB0YWJsZV9sZW4gKSApCi0gICAgICByZXR1cm47Ci0KLSAgICB2ZXJzaW9uICAgPSBGVF9HRVRfTE9ORygpOwotICAgIGF4aXNDb3VudCA9IEZUX0dFVF9MT05HKCk7Ci0KLSAgICBpZiAoIHZlcnNpb24gIT0gMHgwMDAxMDAwMEwgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICJiYWQgdGFibGUgdmVyc2lvblxuIiApKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTIoKCAibG9hZGVkXG4iICkpOwotCi0gICAgaWYgKCBheGlzQ291bnQgIT0gKEZUX0xvbmcpYmxlbmQtPm1tdmFyLT5udW1fYXhpcyApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggImZ0X3Zhcl9sb2FkX2F2YXI6IG51bWJlciBvZiBheGVzIGluIGBhdmFyJyBhbmQgYGN2YXInXG4iCi0gICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgdGFibGUgYXJlIGRpZmZlcmVudFxuIiApKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggYmxlbmQtPmF2YXJfc2VnbWVudCwgYXhpc0NvdW50ICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgc2VnbWVudCA9ICZibGVuZC0+YXZhcl9zZWdtZW50WzBdOwotICAgIGZvciAoIGkgPSAwOyBpIDwgYXhpc0NvdW50OyBpKyssIHNlZ21lbnQrKyApCi0gICAgewotICAgICAgRlRfVFJBQ0U1KCggIiAgYXhpcyAlZDpcbiIsIGkgKSk7Ci0KLSAgICAgIHNlZ21lbnQtPnBhaXJDb3VudCA9IEZUX0dFVF9VU0hPUlQoKTsKLSAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBzZWdtZW50LT5jb3JyZXNwb25kZW5jZSwgc2VnbWVudC0+cGFpckNvdW50ICkgKQotICAgICAgewotICAgICAgICAvKiBGYWlsdXJlLiAgRnJlZSBldmVyeXRoaW5nIHdlIGhhdmUgZG9uZSBzbyBmYXIuICBXZSBtdXN0IGRvICovCi0gICAgICAgIC8qIGl0IHJpZ2h0IG5vdyBzaW5jZSBsb2FkaW5nIHRoZSBgYXZhcicgdGFibGUgaXMgb3B0aW9uYWwuICAgKi8KLQotICAgICAgICBmb3IgKCBqID0gaSAtIDE7IGogPj0gMDsgai0tICkKLSAgICAgICAgICBGVF9GUkVFKCBibGVuZC0+YXZhcl9zZWdtZW50W2pdLmNvcnJlc3BvbmRlbmNlICk7Ci0KLSAgICAgICAgRlRfRlJFRSggYmxlbmQtPmF2YXJfc2VnbWVudCApOwotICAgICAgICBibGVuZC0+YXZhcl9zZWdtZW50ID0gTlVMTDsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBmb3IgKCBqID0gMDsgaiA8IHNlZ21lbnQtPnBhaXJDb3VudDsgaisrICkKLSAgICAgIHsKLSAgICAgICAgLyogY29udmVydCB0byBGaXhlZCAqLwotICAgICAgICBzZWdtZW50LT5jb3JyZXNwb25kZW5jZVtqXS5mcm9tQ29vcmQgPSBGVF9HRVRfU0hPUlQoKSAqIDQ7Ci0gICAgICAgIHNlZ21lbnQtPmNvcnJlc3BvbmRlbmNlW2pdLnRvQ29vcmQgICA9IEZUX0dFVF9TSE9SVCgpICogNDsKLQotICAgICAgICBGVF9UUkFDRTUoKCAiICAgIG1hcHBpbmcgJS40ZiB0byAlLjRmXG4iLAotICAgICAgICAgICAgICAgICAgICBzZWdtZW50LT5jb3JyZXNwb25kZW5jZVtqXS5mcm9tQ29vcmQgLyA2NTUzNi4wLAotICAgICAgICAgICAgICAgICAgICBzZWdtZW50LT5jb3JyZXNwb25kZW5jZVtqXS50b0Nvb3JkIC8gNjU1MzYuMCApKTsKLSAgICAgIH0KLQotICAgICAgRlRfVFJBQ0U1KCggIlxuIiApKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICBGVF9GUkFNRV9FWElUKCk7Ci0gIH0KLQotCi0gIHR5cGVkZWYgc3RydWN0ICBHWF9HVmFyX0hlYWRfCi0gIHsKLSAgICBGVF9Mb25nICAgIHZlcnNpb247Ci0gICAgRlRfVVNob3J0ICBheGlzQ291bnQ7Ci0gICAgRlRfVVNob3J0ICBnbG9iYWxDb29yZENvdW50OwotICAgIEZUX1VMb25nICAgb2Zmc2V0VG9Db29yZDsKLSAgICBGVF9VU2hvcnQgIGdseXBoQ291bnQ7Ci0gICAgRlRfVVNob3J0ICBmbGFnczsKLSAgICBGVF9VTG9uZyAgIG9mZnNldFRvRGF0YTsKLQotICB9IEdYX0dWYXJfSGVhZDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZ0X3Zhcl9sb2FkX2d2YXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFBhcnNlIHRoZSBgZ3ZhcicgdGFibGUgaWYgcHJlc2VudC4gIElmIGBmdmFyJyBpcyB0aGVyZSwgYGd2YXInIGhhZCAqLwotICAvKiAgICBiZXR0ZXIgYmUgdGhlcmUgdG9vLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IFRoZSBmb250IGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBmdF92YXJfbG9hZF9ndmFyKCBUVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX1N0cmVhbSAgICAgc3RyZWFtID0gRlRfRkFDRV9TVFJFQU0oIGZhY2UgKTsKLSAgICBGVF9NZW1vcnkgICAgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotICAgIEdYX0JsZW5kICAgICAgYmxlbmQgID0gZmFjZS0+YmxlbmQ7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvcjsKLSAgICBGVF9VSW50ICAgICAgIGksIGo7Ci0gICAgRlRfVUxvbmcgICAgICB0YWJsZV9sZW47Ci0gICAgRlRfVUxvbmcgICAgICBndmFyX3N0YXJ0OwotICAgIEZUX1VMb25nICAgICAgb2Zmc2V0VG9EYXRhOwotICAgIEdYX0dWYXJfSGVhZCAgZ3Zhcl9oZWFkOwotCi0gICAgc3RhdGljIGNvbnN0IEZUX0ZyYW1lX0ZpZWxkICBndmFyX2ZpZWxkc1tdID0KLSAgICB7Ci0KLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgR1hfR1Zhcl9IZWFkCi0KLSAgICAgIEZUX0ZSQU1FX1NUQVJUKCAyMCApLAotICAgICAgICBGVF9GUkFNRV9MT05HICAoIHZlcnNpb24gKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBheGlzQ291bnQgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBnbG9iYWxDb29yZENvdW50ICksCi0gICAgICAgIEZUX0ZSQU1FX1VMT05HICggb2Zmc2V0VG9Db29yZCApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIGdseXBoQ291bnQgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBmbGFncyApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIG9mZnNldFRvRGF0YSApLAotICAgICAgRlRfRlJBTUVfRU5ECi0gICAgfTsKLQotCi0gICAgRlRfVFJBQ0UyKCggIkdWQVIgIiApKTsKLQotICAgIGlmICggKCBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRBR19ndmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGFibGVfbGVuICkgKSAhPSAwICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiaXMgbWlzc2luZ1xuIiApKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBndmFyX3N0YXJ0ID0gRlRfU1RSRUFNX1BPUyggKTsKLSAgICBpZiAoIEZUX1NUUkVBTV9SRUFEX0ZJRUxEUyggZ3Zhcl9maWVsZHMsICZndmFyX2hlYWQgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBibGVuZC0+dHVwbGVjb3VudCAgPSBndmFyX2hlYWQuZ2xvYmFsQ29vcmRDb3VudDsKLSAgICBibGVuZC0+Z3ZfZ2x5cGhjbnQgPSBndmFyX2hlYWQuZ2x5cGhDb3VudDsKLSAgICBvZmZzZXRUb0RhdGEgICAgICAgPSBndmFyX3N0YXJ0ICsgZ3Zhcl9oZWFkLm9mZnNldFRvRGF0YTsKLQotICAgIGlmICggZ3Zhcl9oZWFkLnZlcnNpb24gIT0gMHgwMDAxMDAwMEwgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMSgoICJiYWQgdGFibGUgdmVyc2lvblxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTIoKCAibG9hZGVkXG4iICkpOwotCi0gICAgaWYgKCBndmFyX2hlYWQuYXhpc0NvdW50ICE9IChGVF9VU2hvcnQpYmxlbmQtPm1tdmFyLT5udW1fYXhpcyApCi0gICAgewotICAgICAgRlRfVFJBQ0UxKCggImZ0X3Zhcl9sb2FkX2d2YXI6IG51bWJlciBvZiBheGVzIGluIGBndmFyJyBhbmQgYGN2YXInXG4iCi0gICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgdGFibGUgYXJlIGRpZmZlcmVudFxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTUoKCAiZ3ZhcjogdGhlcmUgYXJlICVkIHNoYXJlZCBjb29yZGluYXRlczpcbiIsCi0gICAgICAgICAgICAgICAgYmxlbmQtPnR1cGxlY291bnQgKSk7Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggYmxlbmQtPmdseXBob2Zmc2V0cywgYmxlbmQtPmd2X2dseXBoY250ICsgMSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggZ3Zhcl9oZWFkLmZsYWdzICYgMSApCi0gICAgewotICAgICAgLyogbG9uZyBvZmZzZXRzIChvbmUgbW9yZSBvZmZzZXQgdGhhbiBnbHlwaHMsIHRvIG1hcmsgc2l6ZSBvZiBsYXN0KSAqLwotICAgICAgaWYgKCBGVF9GUkFNRV9FTlRFUiggKCBibGVuZC0+Z3ZfZ2x5cGhjbnQgKyAxICkgKiA0TCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBmb3IgKCBpID0gMDsgaSA8PSBibGVuZC0+Z3ZfZ2x5cGhjbnQ7IGkrKyApCi0gICAgICAgIGJsZW5kLT5nbHlwaG9mZnNldHNbaV0gPSBvZmZzZXRUb0RhdGEgKyBGVF9HRVRfVUxPTkcoKTsKLQotICAgICAgRlRfRlJBTUVfRVhJVCgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogc2hvcnQgb2Zmc2V0cyAob25lIG1vcmUgb2Zmc2V0IHRoYW4gZ2x5cGhzLCB0byBtYXJrIHNpemUgb2YgbGFzdCkgKi8KLSAgICAgIGlmICggRlRfRlJBTUVfRU5URVIoICggYmxlbmQtPmd2X2dseXBoY250ICsgMSApICogMkwgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZm9yICggaSA9IDA7IGkgPD0gYmxlbmQtPmd2X2dseXBoY250OyBpKysgKQotICAgICAgICBibGVuZC0+Z2x5cGhvZmZzZXRzW2ldID0gb2Zmc2V0VG9EYXRhICsgRlRfR0VUX1VTSE9SVCgpICogMjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWFhYOiBVbmRvY3VtZW50ZWQ6IGAqMichICovCi0KLSAgICAgIEZUX0ZSQU1FX0VYSVQoKTsKLSAgICB9Ci0KLSAgICBpZiAoIGJsZW5kLT50dXBsZWNvdW50ICE9IDAgKQotICAgIHsKLSAgICAgIGlmICggRlRfTkVXX0FSUkFZKCBibGVuZC0+dHVwbGVjb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ3Zhcl9oZWFkLmF4aXNDb3VudCAqIGJsZW5kLT50dXBsZWNvdW50ICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGd2YXJfc3RhcnQgKyBndmFyX2hlYWQub2Zmc2V0VG9Db29yZCApICAgICAgICAgfHwKLSAgICAgICAgICAgRlRfRlJBTUVfRU5URVIoIGJsZW5kLT50dXBsZWNvdW50ICogZ3Zhcl9oZWFkLmF4aXNDb3VudCAqIDJMICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgYmxlbmQtPnR1cGxlY291bnQ7IGkrKyApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFNSgoICIgIFsgIiApKTsKLSAgICAgICAgZm9yICggaiA9IDAgOyBqIDwgKEZUX1VJbnQpZ3Zhcl9oZWFkLmF4aXNDb3VudDsgaisrICkKLSAgICAgICAgewotICAgICAgICAgIGJsZW5kLT50dXBsZWNvb3Jkc1tpICogZ3Zhcl9oZWFkLmF4aXNDb3VudCArIGpdID0KLSAgICAgICAgICAgIEZUX0dFVF9TSE9SVCgpICogNDsgICAgICAgICAgICAgICAgIC8qIGNvbnZlcnQgdG8gRlRfRml4ZWQgKi8KLSAgICAgICAgICBGVF9UUkFDRTUoKCAiJS40ZiAiLAotICAgICAgICAgICAgYmxlbmQtPnR1cGxlY29vcmRzW2kgKiBndmFyX2hlYWQuYXhpc0NvdW50ICsgal0gLyA2NTUzNi4wICkpOwotICAgICAgICB9Ci0gICAgICAgIEZUX1RSQUNFNSgoICJdXG4iICkpOwotICAgICAgfQotCi0gICAgICBGVF9UUkFDRTUoKCAiXG4iICkpOwotCi0gICAgICBGVF9GUkFNRV9FWElUKCk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmdF92YXJfYXBwbHlfdHVwbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGaWd1cmUgb3V0IHdoZXRoZXIgYSBnaXZlbiB0dXBsZSAoZGVzaWduKSBhcHBsaWVzIHRvIHRoZSBjdXJyZW50ICAgKi8KLSAgLyogICAgYmxlbmQsIGFuZCBpZiBzbywgd2hhdCBpcyB0aGUgc2NhbGluZyBmYWN0b3IuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmxlbmQgICAgICAgICAgIDo6IFRoZSBjdXJyZW50IGJsZW5kIG9mIHRoZSBmb250LiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dXBsZUluZGV4ICAgICAgOjogQSBmbGFnIHNheWluZyB3aGV0aGVyIHRoaXMgaXMgYW4gaW50ZXJtZWRpYXRlICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIHR1cGxlIG9yIG5vdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dXBsZV9jb29yZHMgICAgOjogVGhlIGNvb3JkaW5hdGVzIG9mIHRoZSB0dXBsZSBpbiBub3JtYWxpemVkIGF4aXMgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIHVuaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpbV9zdGFydF9jb29yZHMgOjogVGhlIGluaXRpYWwgY29vcmRpbmF0ZXMgd2hlcmUgdGhpcyB0dXBsZSBzdGFydHMgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIHRvIGFwcGx5IChmb3IgaW50ZXJtZWRpYXRlIGNvb3JkaW5hdGVzKS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBpbV9lbmRfY29vcmRzICAgOjogVGhlIGZpbmFsIGNvb3JkaW5hdGVzIGFmdGVyIHdoaWNoIHRoaXMgdHVwbGUgbm8gKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIGxvbmdlciBhcHBsaWVzIChmb3IgaW50ZXJtZWRpYXRlIGNvb3JkaW5hdGVzKS4gICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQW4gRlRfRml4ZWQgdmFsdWUgY29udGFpbmluZyB0aGUgc2NhbGluZyBmYWN0b3IuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRml4ZWQKLSAgZnRfdmFyX2FwcGx5X3R1cGxlKCBHWF9CbGVuZCAgIGJsZW5kLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgdHVwbGVJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIHR1cGxlX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGltX3N0YXJ0X2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGltX2VuZF9jb29yZHMgKQotICB7Ci0gICAgRlRfVUludCAgIGk7Ci0gICAgRlRfRml4ZWQgIGFwcGx5ID0gMHgxMDAwMEw7Ci0KLQotICAgIGZvciAoIGkgPSAwOyBpIDwgYmxlbmQtPm51bV9heGlzOyBpKysgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFNigoICIgICAgYXhpcyBjb29yZGluYXRlICVkICglLjRmKTpcbiIsCi0gICAgICAgICAgICAgICAgICBpLCBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSAvIDY1NTM2LjAgKSk7Ci0KLSAgICAgIC8qIEl0J3Mgbm90IGNsZWFyIHdoeSAoZm9yIGludGVybWVkaWF0ZSB0dXBsZXMpIHdlIGRvbid0IG5lZWQgICAgICovCi0gICAgICAvKiB0byBjaGVjayBhZ2FpbnN0IHN0YXJ0L2VuZCAtLSB0aGUgZG9jdW1lbnRhdGlvbiBzYXlzIHdlIGRvbid0LiAqLwotICAgICAgLyogU2ltaWxhcmx5LCBpdCdzIHVuY2xlYXIgd2h5IHdlIGRvbid0IG5lZWQgdG8gc2NhbGUgYWxvbmcgdGhlICAgKi8KLSAgICAgIC8qIGF4aXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIGlmICggdHVwbGVfY29vcmRzW2ldID09IDAgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTYoKCAiICAgICAgdHVwbGUgY29vcmRpbmF0ZSBpcyB6ZXJvLCBpZ25vcmVkXG4iLCBpICkpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgZWxzZSBpZiAoIGJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2ldID09IDAgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTYoKCAiICAgICAgYXhpcyBjb29yZGluYXRlIGlzIHplcm8sIHN0b3BcbiIgKSk7Ci0gICAgICAgIGFwcGx5ID0gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKCAoIGJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2ldIDwgMCAmJiB0dXBsZV9jb29yZHNbaV0gPiAwICkgfHwKLSAgICAgICAgICAgICAgICAoIGJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2ldID4gMCAmJiB0dXBsZV9jb29yZHNbaV0gPCAwICkgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTYoKCAiICAgICAgdHVwbGUgY29vcmRpbmF0ZSB2YWx1ZSAlLjRmIGlzIGV4Y2VlZGVkLCBzdG9wXG4iLAotICAgICAgICAgICAgICAgICAgICB0dXBsZV9jb29yZHNbaV0gLyA2NTUzNi4wICkpOwotICAgICAgICBhcHBseSA9IDA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBlbHNlIGlmICggISggdHVwbGVJbmRleCAmIEdYX1RJX0lOVEVSTUVESUFURV9UVVBMRSApICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0U2KCggIiAgICAgIHR1cGxlIGNvb3JkaW5hdGUgdmFsdWUgJS40ZiBmaXRzXG4iLAotICAgICAgICAgICAgICAgICAgICB0dXBsZV9jb29yZHNbaV0gLyA2NTUzNi4wICkpOwotICAgICAgICAvKiBub3QgYW4gaW50ZXJtZWRpYXRlIHR1cGxlICovCi0gICAgICAgIGFwcGx5ID0gRlRfTXVsRml4KCBhcHBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2ldID4gMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2ldCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogLWJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2ldICk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKCBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSA8IGltX3N0YXJ0X2Nvb3Jkc1tpXSB8fAotICAgICAgICAgICAgICAgIGJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2ldID4gaW1fZW5kX2Nvb3Jkc1tpXSAgICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0U2KCggIiAgICAgIGludGVybWVkaWF0ZSB0dXBsZSByYW5nZSBbJS40ZjslLjRmXSBpcyBleGNlZWRlZCwiCi0gICAgICAgICAgICAgICAgICAgICIgc3RvcFxuIiwKLSAgICAgICAgICAgICAgICAgICAgaW1fc3RhcnRfY29vcmRzW2ldIC8gNjU1MzYuMCwKLSAgICAgICAgICAgICAgICAgICAgaW1fZW5kX2Nvb3Jkc1tpXSAvIDY1NTM2LjAgKSk7Ci0gICAgICAgIGFwcGx5ID0gMDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UgaWYgKCBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSA8IHR1cGxlX2Nvb3Jkc1tpXSApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFNigoICIgICAgICBpbnRlcm1lZGlhdGUgdHVwbGUgcmFuZ2UgWyUuNGY7JS40Zl0gZml0c1xuIiwKLSAgICAgICAgICAgICAgICAgICAgaW1fc3RhcnRfY29vcmRzW2ldIC8gNjU1MzYuMCwKLSAgICAgICAgICAgICAgICAgICAgaW1fZW5kX2Nvb3Jkc1tpXSAvIDY1NTM2LjAgKSk7Ci0gICAgICAgIGFwcGx5ID0gRlRfTXVsRGl2KCBhcHBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2ldIC0gaW1fc3RhcnRfY29vcmRzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGVfY29vcmRzW2ldIC0gaW1fc3RhcnRfY29vcmRzW2ldICk7Ci0gICAgICB9Ci0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0U2KCggIiAgICAgIGludGVybWVkaWF0ZSB0dXBsZSByYW5nZSBbJS40ZjslLjRmXSBmaXRzXG4iLAotICAgICAgICAgICAgICAgICAgICBpbV9zdGFydF9jb29yZHNbaV0gLyA2NTUzNi4wLAotICAgICAgICAgICAgICAgICAgICBpbV9lbmRfY29vcmRzW2ldIC8gNjU1MzYuMCApKTsKLSAgICAgICAgYXBwbHkgPSBGVF9NdWxEaXYoIGFwcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1fZW5kX2Nvb3Jkc1tpXSAtIGJsZW5kLT5ub3JtYWxpemVkY29vcmRzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1fZW5kX2Nvb3Jkc1tpXSAtIHR1cGxlX2Nvb3Jkc1tpXSApOwotICAgICAgfQotICAgIH0KLQotICAgIEZUX1RSQUNFNigoICIgICAgYXBwbHkgZmFjdG9yIGlzICUuNGZcbiIsIGFwcGx5IC8gNjU1MzYuMCApKTsKLQotICAgIHJldHVybiBhcHBseTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgTVVMVElQTEUgTUFTVEVSUyBTRVJWSUNFIEZVTkNUSU9OUyAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICB0eXBlZGVmIHN0cnVjdCAgR1hfRlZhcl9IZWFkXwotICB7Ci0gICAgRlRfTG9uZyAgICB2ZXJzaW9uOwotICAgIEZUX1VTaG9ydCAgb2Zmc2V0VG9EYXRhOwotICAgIEZUX1VTaG9ydCAgY291bnRTaXplUGFpcnM7Ci0gICAgRlRfVVNob3J0ICBheGlzQ291bnQ7Ci0gICAgRlRfVVNob3J0ICBheGlzU2l6ZTsKLSAgICBGVF9VU2hvcnQgIGluc3RhbmNlQ291bnQ7Ci0gICAgRlRfVVNob3J0ICBpbnN0YW5jZVNpemU7Ci0KLSAgfSBHWF9GVmFyX0hlYWQ7Ci0KLQotICB0eXBlZGVmIHN0cnVjdCAgZnZhcl9heGlzXwotICB7Ci0gICAgRlRfVUxvbmcgICBheGlzVGFnOwotICAgIEZUX0ZpeGVkICAgbWluVmFsdWU7Ci0gICAgRlRfRml4ZWQgICBkZWZhdWx0VmFsdWU7Ci0gICAgRlRfRml4ZWQgICBtYXhWYWx1ZTsKLSAgICBGVF9VU2hvcnQgIGZsYWdzOwotICAgIEZUX1VTaG9ydCAgbmFtZUlEOwotCi0gIH0gR1hfRlZhcl9BeGlzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfR2V0X01NX1ZhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ2hlY2sgdGhhdCB0aGUgZm9udCdzIGBmdmFyJyB0YWJsZSBpcyB2YWxpZCwgcGFyc2UgaXQsIGFuZCByZXR1cm4gICovCi0gIC8qICAgIHRob3NlIGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBUaGUgZm9udCBmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgVFRfR2V0X01NX1ZhciBpbml0aWFsaXplcyB0aGUgYmxlbmQgc3RydWN0dXJlLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXN0ZXIgOjogVGhlIGBmdmFyJyBkYXRhIChtdXN0IGJlIGZyZWVkIGJ5IGNhbGxlcikuICBDYW4gYmUgTlVMTCwgKi8KLSAgLyogICAgICAgICAgICAgIHdoaWNoIG1ha2VzIHRoaXMgZnVuY3Rpb24gc2ltcGx5IGxvYWQgTU0gc3VwcG9ydC4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVFRfR2V0X01NX1ZhciggVFRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgIEZUX01NX1ZhciogICptYXN0ZXIgKQotICB7Ci0gICAgRlRfU3RyZWFtICAgICAgICAgICAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgICAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0gICAgRlRfVUxvbmcgICAgICAgICAgICAgdGFibGVfbGVuOwotICAgIEZUX0Vycm9yICAgICAgICAgICAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBGVF9VTG9uZyAgICAgICAgICAgICBmdmFyX3N0YXJ0OwotICAgIEZUX0ludCAgICAgICAgICAgICAgIGksIGo7Ci0gICAgRlRfTU1fVmFyKiAgICAgICAgICAgbW12YXIgPSBOVUxMOwotICAgIEZUX0ZpeGVkKiAgICAgICAgICAgIG5leHRfY29vcmRzOwotICAgIEZUX1N0cmluZyogICAgICAgICAgIG5leHRfbmFtZTsKLSAgICBGVF9WYXJfQXhpcyogICAgICAgICBhOwotICAgIEZUX1Zhcl9OYW1lZF9TdHlsZSogIG5zOwotICAgIEdYX0ZWYXJfSGVhZCAgICAgICAgIGZ2YXJfaGVhZDsKLQotICAgIHN0YXRpYyBjb25zdCBGVF9GcmFtZV9GaWVsZCAgZnZhcl9maWVsZHNbXSA9Ci0gICAgewotCi0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIEdYX0ZWYXJfSGVhZAotCi0gICAgICBGVF9GUkFNRV9TVEFSVCggMTYgKSwKLSAgICAgICAgRlRfRlJBTUVfTE9ORyAgKCB2ZXJzaW9uICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggb2Zmc2V0VG9EYXRhICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggY291bnRTaXplUGFpcnMgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBheGlzQ291bnQgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBheGlzU2l6ZSApLAotICAgICAgICBGVF9GUkFNRV9VU0hPUlQoIGluc3RhbmNlQ291bnQgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBpbnN0YW5jZVNpemUgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgRlRfRnJhbWVfRmllbGQgIGZ2YXJheGlzX2ZpZWxkc1tdID0KLSAgICB7Ci0KLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgR1hfRlZhcl9BeGlzCi0KLSAgICAgIEZUX0ZSQU1FX1NUQVJUKCAyMCApLAotICAgICAgICBGVF9GUkFNRV9VTE9ORyAoIGF4aXNUYWcgKSwKLSAgICAgICAgRlRfRlJBTUVfTE9ORyAgKCBtaW5WYWx1ZSApLAotICAgICAgICBGVF9GUkFNRV9MT05HICAoIGRlZmF1bHRWYWx1ZSApLAotICAgICAgICBGVF9GUkFNRV9MT05HICAoIG1heFZhbHVlICksCi0gICAgICAgIEZUX0ZSQU1FX1VTSE9SVCggZmxhZ3MgKSwKLSAgICAgICAgRlRfRlJBTUVfVVNIT1JUKCBuYW1lSUQgKSwKLSAgICAgIEZUX0ZSQU1FX0VORAotICAgIH07Ci0KLQotICAgIC8qIHJlYWQgdGhlIGZvbnQgZGF0YSBhbmQgc2V0IHVwIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAqLwotICAgIC8qIGlmIG5vdCBhbHJlYWR5IGRvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgaWYgKCBmYWNlLT5ibGVuZCA9PSBOVUxMICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiRlZBUiAiICkpOwotCi0gICAgICAvKiBib3RoIGBmdmFyJyBhbmQgYGd2YXInIG11c3QgYmUgcHJlc2VudCAqLwotICAgICAgaWYgKCAoIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19ndmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCAmdGFibGVfbGVuICkgKSAhPSAwICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UxKCggIlxuIgotICAgICAgICAgICAgICAgICAgICAiVFRfR2V0X01NX1ZhcjogYGd2YXInIHRhYmxlIGlzIG1pc3NpbmdcbiIgKSk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgaWYgKCAoIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19mdmFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCAmdGFibGVfbGVuICkgKSAhPSAwICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UxKCggImlzIG1pc3NpbmdcbiIgKSk7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIH0KLQotICAgICAgZnZhcl9zdGFydCA9IEZUX1NUUkVBTV9QT1MoICk7Ci0KLSAgICAgIGlmICggRlRfU1RSRUFNX1JFQURfRklFTERTKCBmdmFyX2ZpZWxkcywgJmZ2YXJfaGVhZCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBpZiAoIGZ2YXJfaGVhZC52ZXJzaW9uICE9IChGVF9Mb25nKTB4MDAwMTAwMDBMICAgICAgICAgICAgICAgICAgICAgIHx8Ci0jaWYgMAotICAgICAgICAgICAvKiBmb250cyBsaWtlIGBKYW1SZWd1bGFyLnR0ZicgaGF2ZSBhbiBpbmNvcnJlY3QgdmFsdWUgZm9yICovCi0gICAgICAgICAgIC8qIGBjb3VudFNpemVQYWlycyc7IHNpbmNlIHZhbHVlIDIgaXMgaGFyZC1jb2RlZCBpbiBgZnZhcicgKi8KLSAgICAgICAgICAgLyogdmVyc2lvbiAxLjAsIHdlIHNpbXBseSBpZ25vcmUgaXQgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICBmdmFyX2hlYWQuY291bnRTaXplUGFpcnMgIT0gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotI2VuZGlmCi0gICAgICAgICAgIGZ2YXJfaGVhZC5heGlzU2l6ZSAhPSAyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgIC8qIGF4aXNDb3VudCBsaW1pdCBpbXBsaWVkIGJ5IDE2LWJpdCBpbnN0YW5jZVNpemUgKi8KLSAgICAgICAgICAgZnZhcl9oZWFkLmF4aXNDb3VudCA+IDB4M0ZGRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgZnZhcl9oZWFkLmluc3RhbmNlU2l6ZSAhPSA0ICsgNCAqIGZ2YXJfaGVhZC5heGlzQ291bnQgICAgICAgICAgfHwKLSAgICAgICAgICAgLyogaW5zdGFuY2VDb3VudCBsaW1pdCBpbXBsaWVkIGJ5IGxpbWl0ZWQgcmFuZ2Ugb2YgbmFtZSBJRHMgKi8KLSAgICAgICAgICAgZnZhcl9oZWFkLmluc3RhbmNlQ291bnQgPiAweDdFRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgZnZhcl9oZWFkLm9mZnNldFRvRGF0YSArIGZ2YXJfaGVhZC5heGlzQ291bnQgKiAyMFUgKwotICAgICAgICAgICAgIGZ2YXJfaGVhZC5pbnN0YW5jZUNvdW50ICogZnZhcl9oZWFkLmluc3RhbmNlU2l6ZSA+IHRhYmxlX2xlbiApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMSgoICJcbiIKLSAgICAgICAgICAgICAgICAgICAgIlRUX0dldF9NTV9WYXI6IGludmFsaWQgYGZ2YXInIGhlYWRlclxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIEZUX1RSQUNFMigoICJsb2FkZWRcbiIgKSk7Ci0KLSAgICAgIEZUX1RSQUNFNSgoICJudW1iZXIgb2YgR1ggc3R5bGUgYXhlczogJWRcbiIsIGZ2YXJfaGVhZC5heGlzQ291bnQgKSk7Ci0KLSAgICAgIGlmICggRlRfTkVXKCBmYWNlLT5ibGVuZCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAvKiBjYW5ub3Qgb3ZlcmZsb3cgMzItYml0IGFyaXRobWV0aWMgYmVjYXVzZSBvZiBsaW1pdHMgYWJvdmUgKi8KLSAgICAgIGZhY2UtPmJsZW5kLT5tbXZhcl9sZW4gPQotICAgICAgICBzaXplb2YgKCBGVF9NTV9WYXIgKSArCi0gICAgICAgIGZ2YXJfaGVhZC5heGlzQ291bnQgKiBzaXplb2YgKCBGVF9WYXJfQXhpcyApICsKLSAgICAgICAgZnZhcl9oZWFkLmluc3RhbmNlQ291bnQgKiBzaXplb2YgKCBGVF9WYXJfTmFtZWRfU3R5bGUgKSArCi0gICAgICAgIGZ2YXJfaGVhZC5pbnN0YW5jZUNvdW50ICogZnZhcl9oZWFkLmF4aXNDb3VudCAqIHNpemVvZiAoIEZUX0ZpeGVkICkgKwotICAgICAgICA1ICogZnZhcl9oZWFkLmF4aXNDb3VudDsKLQotICAgICAgaWYgKCBGVF9BTExPQyggbW12YXIsIGZhY2UtPmJsZW5kLT5tbXZhcl9sZW4gKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIGZhY2UtPmJsZW5kLT5tbXZhciA9IG1tdmFyOwotCi0gICAgICAvKiBzZXQgdXAgcG9pbnRlcnMgYW5kIG9mZnNldHMgaW50byB0aGUgYG1tdmFyJyBhcnJheTsgKi8KLSAgICAgIC8qIHRoZSBkYXRhIGdldHMgZmlsbGVkIGluIGxhdGVyIG9uICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBtbXZhci0+bnVtX2F4aXMgPQotICAgICAgICBmdmFyX2hlYWQuYXhpc0NvdW50OwotICAgICAgbW12YXItPm51bV9kZXNpZ25zID0KLSAgICAgICAgfjBVOyAgICAgICAgICAgICAgICAgICAvKiBtZWFuaW5nbGVzcyBpbiB0aGlzIGNvbnRleHQ7IGVhY2ggZ2x5cGggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtYXkgaGF2ZSBhIGRpZmZlcmVudCBudW1iZXIgb2YgZGVzaWducyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAob3IgdHVwbGVzLCBhcyBjYWxsZWQgYnkgQXBwbGUpICAgICAgICAgKi8KLSAgICAgIG1tdmFyLT5udW1fbmFtZWRzdHlsZXMgPQotICAgICAgICBmdmFyX2hlYWQuaW5zdGFuY2VDb3VudDsKLSAgICAgIG1tdmFyLT5heGlzID0KLSAgICAgICAgKEZUX1Zhcl9BeGlzKikmKCBtbXZhclsxXSApOwotICAgICAgbW12YXItPm5hbWVkc3R5bGUgPQotICAgICAgICAoRlRfVmFyX05hbWVkX1N0eWxlKikmKCBtbXZhci0+YXhpc1tmdmFyX2hlYWQuYXhpc0NvdW50XSApOwotCi0gICAgICBuZXh0X2Nvb3JkcyA9Ci0gICAgICAgIChGVF9GaXhlZCopJiggbW12YXItPm5hbWVkc3R5bGVbZnZhcl9oZWFkLmluc3RhbmNlQ291bnRdICk7Ci0gICAgICBmb3IgKCBpID0gMDsgaSA8IGZ2YXJfaGVhZC5pbnN0YW5jZUNvdW50OyBpKysgKQotICAgICAgewotICAgICAgICBtbXZhci0+bmFtZWRzdHlsZVtpXS5jb29yZHMgID0gbmV4dF9jb29yZHM7Ci0gICAgICAgIG5leHRfY29vcmRzICAgICAgICAgICAgICAgICArPSBmdmFyX2hlYWQuYXhpc0NvdW50OwotICAgICAgfQotCi0gICAgICBuZXh0X25hbWUgPSAoRlRfU3RyaW5nKiluZXh0X2Nvb3JkczsKLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgZnZhcl9oZWFkLmF4aXNDb3VudDsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgbW12YXItPmF4aXNbaV0ubmFtZSAgPSBuZXh0X25hbWU7Ci0gICAgICAgIG5leHRfbmFtZSAgICAgICAgICAgKz0gNTsKLSAgICAgIH0KLQotICAgICAgLyogbm93IGZpbGwgaW4gdGhlIGRhdGEgKi8KLQotICAgICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggZnZhcl9zdGFydCArIGZ2YXJfaGVhZC5vZmZzZXRUb0RhdGEgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgYSA9IG1tdmFyLT5heGlzOwotICAgICAgZm9yICggaSA9IDA7IGkgPCBmdmFyX2hlYWQuYXhpc0NvdW50OyBpKysgKQotICAgICAgewotICAgICAgICBHWF9GVmFyX0F4aXMgIGF4aXNfcmVjOwotCi0KLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fUkVBRF9GSUVMRFMoIGZ2YXJheGlzX2ZpZWxkcywgJmF4aXNfcmVjICkgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgYS0+dGFnICAgICA9IGF4aXNfcmVjLmF4aXNUYWc7Ci0gICAgICAgIGEtPm1pbmltdW0gPSBheGlzX3JlYy5taW5WYWx1ZTsKLSAgICAgICAgYS0+ZGVmICAgICA9IGF4aXNfcmVjLmRlZmF1bHRWYWx1ZTsKLSAgICAgICAgYS0+bWF4aW11bSA9IGF4aXNfcmVjLm1heFZhbHVlOwotICAgICAgICBhLT5zdHJpZCAgID0gYXhpc19yZWMubmFtZUlEOwotCi0gICAgICAgIGEtPm5hbWVbMF0gPSAoRlRfU3RyaW5nKSggICBhLT50YWcgPj4gMjQgKTsKLSAgICAgICAgYS0+bmFtZVsxXSA9IChGVF9TdHJpbmcpKCAoIGEtPnRhZyA+PiAxNiApICYgMHhGRiApOwotICAgICAgICBhLT5uYW1lWzJdID0gKEZUX1N0cmluZykoICggYS0+dGFnID4+ICA4ICkgJiAweEZGICk7Ci0gICAgICAgIGEtPm5hbWVbM10gPSAoRlRfU3RyaW5nKSggKCBhLT50YWcgICAgICAgKSAmIDB4RkYgKTsKLSAgICAgICAgYS0+bmFtZVs0XSA9ICdcMCc7Ci0KLSAgICAgICAgRlRfVFJBQ0U1KCggIiAgXCIlc1wiOiBtaW5pbXVtPSUuNGYsIGRlZmF1bHQ9JS40ZiwgbWF4aW11bT0lLjRmXG4iLAotICAgICAgICAgICAgICAgICAgICBhLT5uYW1lLAotICAgICAgICAgICAgICAgICAgICBhLT5taW5pbXVtIC8gNjU1MzYuMCwKLSAgICAgICAgICAgICAgICAgICAgYS0+ZGVmIC8gNjU1MzYuMCwKLSAgICAgICAgICAgICAgICAgICAgYS0+bWF4aW11bSAvIDY1NTM2LjAgKSk7Ci0KLSAgICAgICAgYSsrOwotICAgICAgfQotCi0gICAgICBGVF9UUkFDRTUoKCAiXG4iICkpOwotCi0gICAgICBucyA9IG1tdmFyLT5uYW1lZHN0eWxlOwotICAgICAgZm9yICggaSA9IDA7IGkgPCBmdmFyX2hlYWQuaW5zdGFuY2VDb3VudDsgaSsrLCBucysrICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBGVF9GUkFNRV9FTlRFUiggNEwgKyA0TCAqIGZ2YXJfaGVhZC5heGlzQ291bnQgKSApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIG5zLT5zdHJpZCAgICAgICA9ICAgIEZUX0dFVF9VU0hPUlQoKTsKLSAgICAgICAgKHZvaWQpIC8qIGZsYWdzID0gKi8gRlRfR0VUX1VTSE9SVCgpOwotCi0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgZnZhcl9oZWFkLmF4aXNDb3VudDsgaisrICkKLSAgICAgICAgICBucy0+Y29vcmRzW2pdID0gRlRfR0VUX0xPTkcoKTsKLQotICAgICAgICBGVF9GUkFNRV9FWElUKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogZmlsbCB0aGUgb3V0cHV0IGFycmF5IGlmIHJlcXVlc3RlZCAqLwotCi0gICAgaWYgKCBtYXN0ZXIgIT0gTlVMTCApCi0gICAgewotICAgICAgRlRfVUludCAgbjsKLQotCi0gICAgICBpZiAoIEZUX0FMTE9DKCBtbXZhciwgZmFjZS0+YmxlbmQtPm1tdmFyX2xlbiApICkKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgRlRfTUVNX0NPUFkoIG1tdmFyLCBmYWNlLT5ibGVuZC0+bW12YXIsIGZhY2UtPmJsZW5kLT5tbXZhcl9sZW4gKTsKLQotICAgICAgbW12YXItPmF4aXMgPQotICAgICAgICAoRlRfVmFyX0F4aXMqKSYoIG1tdmFyWzFdICk7Ci0gICAgICBtbXZhci0+bmFtZWRzdHlsZSA9Ci0gICAgICAgIChGVF9WYXJfTmFtZWRfU3R5bGUqKSYoIG1tdmFyLT5heGlzW21tdmFyLT5udW1fYXhpc10gKTsKLSAgICAgIG5leHRfY29vcmRzID0KLSAgICAgICAgKEZUX0ZpeGVkKikmKCBtbXZhci0+bmFtZWRzdHlsZVttbXZhci0+bnVtX25hbWVkc3R5bGVzXSApOwotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IG1tdmFyLT5udW1fbmFtZWRzdHlsZXM7IG4rKyApCi0gICAgICB7Ci0gICAgICAgIG1tdmFyLT5uYW1lZHN0eWxlW25dLmNvb3JkcyAgPSBuZXh0X2Nvb3JkczsKLSAgICAgICAgbmV4dF9jb29yZHMgICAgICAgICAgICAgICAgICs9IG1tdmFyLT5udW1fYXhpczsKLSAgICAgIH0KLQotICAgICAgYSAgICAgICAgID0gbW12YXItPmF4aXM7Ci0gICAgICBuZXh0X25hbWUgPSAoRlRfU3RyaW5nKiluZXh0X2Nvb3JkczsKLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgbW12YXItPm51bV9heGlzOyBuKysgKQotICAgICAgewotICAgICAgICBhLT5uYW1lID0gbmV4dF9uYW1lOwotCi0gICAgICAgIC8qIHN0YW5kYXJkIFBvc3RTY3JpcHQgbmFtZXMgZm9yIHNvbWUgc3RhbmRhcmQgYXBwbGUgdGFncyAqLwotICAgICAgICBpZiAoIGEtPnRhZyA9PSBUVEFHX3dnaHQgKQotICAgICAgICAgIGEtPm5hbWUgPSAoY2hhciopIldlaWdodCI7Ci0gICAgICAgIGVsc2UgaWYgKCBhLT50YWcgPT0gVFRBR193ZHRoICkKLSAgICAgICAgICBhLT5uYW1lID0gKGNoYXIqKSJXaWR0aCI7Ci0gICAgICAgIGVsc2UgaWYgKCBhLT50YWcgPT0gVFRBR19vcHN6ICkKLSAgICAgICAgICBhLT5uYW1lID0gKGNoYXIqKSJPcHRpY2FsU2l6ZSI7Ci0gICAgICAgIGVsc2UgaWYgKCBhLT50YWcgPT0gVFRBR19zbG50ICkKLSAgICAgICAgICBhLT5uYW1lID0gKGNoYXIqKSJTbGFudCI7Ci0KLSAgICAgICAgbmV4dF9uYW1lICs9IDU7Ci0gICAgICAgIGErKzsKLSAgICAgIH0KLQotICAgICAgKm1hc3RlciA9IG1tdmFyOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU2V0X01NX0JsZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2V0IHRoZSBibGVuZCAobm9ybWFsaXplZCkgY29vcmRpbmF0ZXMgZm9yIHRoaXMgaW5zdGFuY2Ugb2YgdGhlICAgICovCi0gIC8qICAgIGZvbnQuICBDaGVjayB0aGF0IHRoZSBgZ3ZhcicgdGFibGUgaXMgcmVhc29uYWJsZSBhbmQgZG9lcyBzb21lICAgICAqLwotICAvKiAgICBpbml0aWFsIHByZXBhcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgIDo6IFRoZSBmb250LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBJbml0aWFsaXplIHRoZSBibGVuZCBzdHJ1Y3R1cmUgd2l0aCBgZ3ZhcicgZGF0YS4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2Nvb3JkcyA6OiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb29yZGluYXRlcy4gIElmIGl0IGlzICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBheGVzLCBpZ25vcmUgdGhlIGV4Y2VzcyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHZhbHVlcy4gIElmIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF4ZXMsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB1c2UgdGhlIGRlZmF1bHQgdmFsdWUgKDApIGZvciB0aGUgcmVtYWluaW5nIGF4ZXMuICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb29yZHMgICAgIDo6IEFuIGFycmF5IG9mIGBudW1fY29vcmRzJywgZWFjaCBiZXR3ZWVuIFstMSwxXS4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUVF9TZXRfTU1fQmxlbmQoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgR1hfQmxlbmQgICAgYmxlbmQ7Ci0gICAgRlRfTU1fVmFyKiAgbW12YXI7Ci0gICAgRlRfVUludCAgICAgaTsKLSAgICBGVF9NZW1vcnkgICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLQotICAgIGVudW0KLSAgICB7Ci0gICAgICBtY3Z0X3JldGFpbiwKLSAgICAgIG1jdnRfbW9kaWZ5LAotICAgICAgbWN2dF9sb2FkCi0KLSAgICB9IG1hbmFnZUN2dDsKLQotCi0gICAgZmFjZS0+ZG9ibGVuZCA9IEZBTFNFOwotCi0gICAgaWYgKCBmYWNlLT5ibGVuZCA9PSBOVUxMICkKLSAgICB7Ci0gICAgICBpZiAoICggZXJyb3IgPSBUVF9HZXRfTU1fVmFyKCBmYWNlLCBOVUxMICkgKSAhPSAwICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGJsZW5kID0gZmFjZS0+YmxlbmQ7Ci0gICAgbW12YXIgPSBibGVuZC0+bW12YXI7Ci0KLSAgICBpZiAoIG51bV9jb29yZHMgPiBtbXZhci0+bnVtX2F4aXMgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICJUVF9TZXRfTU1fQmxlbmQ6IG9ubHkgdXNpbmcgZmlyc3QgJWQgb2YgJWQgY29vcmRpbmF0ZXNcbiIsCi0gICAgICAgICAgICAgICAgICBtbXZhci0+bnVtX2F4aXMsIG51bV9jb29yZHMgKSk7Ci0gICAgICBudW1fY29vcmRzID0gbW12YXItPm51bV9heGlzOwotICAgIH0KLQotICAgIEZUX1RSQUNFNSgoICJub3JtYWxpemVkIGRlc2lnbiBjb29yZGluYXRlczpcbiIgKSk7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IG51bV9jb29yZHM7IGkrKyApCi0gICAgewotICAgICAgRlRfVFJBQ0U1KCggIiAgJS40ZlxuIiwgY29vcmRzW2ldIC8gNjU1MzYuMCApKTsKLSAgICAgIGlmICggY29vcmRzW2ldIDwgLTB4MDAwMTAwMDBMIHx8IGNvb3Jkc1tpXSA+IDB4MDAwMTAwMDBMICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UxKCggIlRUX1NldF9NTV9CbGVuZDogbm9ybWFsaXplZCBkZXNpZ24gY29vcmRpbmF0ZSAlLjRmXG4iCi0gICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgIGlzIG91dCBvZiByYW5nZSBbLTE7MV1cbiIsCi0gICAgICAgICAgICAgICAgICAgIGNvb3Jkc1tpXSAvIDY1NTM2LjAgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotICAgIH0KLQotICAgIEZUX1RSQUNFNSgoICJcbiIgKSk7Ci0KLSAgICBpZiAoIGJsZW5kLT5nbHlwaG9mZnNldHMgPT0gTlVMTCApCi0gICAgICBpZiAoICggZXJyb3IgPSBmdF92YXJfbG9hZF9ndmFyKCBmYWNlICkgKSAhPSAwICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgaWYgKCBibGVuZC0+bm9ybWFsaXplZGNvb3JkcyA9PSBOVUxMICkKLSAgICB7Ci0gICAgICBpZiAoIEZUX05FV19BUlJBWSggYmxlbmQtPm5vcm1hbGl6ZWRjb29yZHMsIG1tdmFyLT5udW1fYXhpcyApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBtYW5hZ2VDdnQgPSBtY3Z0X21vZGlmeTsKLQotICAgICAgLyogSWYgd2UgaGF2ZSBub3Qgc2V0IHRoZSBibGVuZCBjb29yZGluYXRlcyBiZWZvcmUgdGhpcywgdGhlbiB0aGUgICovCi0gICAgICAvKiBjdnQgdGFibGUgd2lsbCBzdGlsbCBiZSB3aGF0IHdlIHJlYWQgZnJvbSB0aGUgYGN2dCAnIHRhYmxlIGFuZCAgKi8KLSAgICAgIC8qIHdlIGRvbid0IG5lZWQgdG8gcmVsb2FkIGl0LiAgV2UgbWF5IG5lZWQgdG8gY2hhbmdlIGl0IHRob3VnaC4uLiAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbWFuYWdlQ3Z0ID0gbWN2dF9yZXRhaW47Ci0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX2Nvb3JkczsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSAhPSBjb29yZHNbaV0gKQotICAgICAgICB7Ci0gICAgICAgICAgbWFuYWdlQ3Z0ID0gbWN2dF9sb2FkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoIDsgaSA8IG1tdmFyLT5udW1fYXhpczsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBibGVuZC0+bm9ybWFsaXplZGNvb3Jkc1tpXSAhPSAwICkKLSAgICAgICAgewotICAgICAgICAgIG1hbmFnZUN2dCA9IG1jdnRfbG9hZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBJZiB3ZSBkb24ndCBjaGFuZ2UgdGhlIGJsZW5kIGNvb3JkcyB0aGVuIHdlIGRvbid0IG5lZWQgdG8gZG8gICovCi0gICAgICAvKiBhbnl0aGluZyB0byB0aGUgY3Z0IHRhYmxlLiAgSXQgd2lsbCBiZSBjb3JyZWN0LiAgT3RoZXJ3aXNlIHdlICovCi0gICAgICAvKiBubyBsb25nZXIgaGF2ZSB0aGUgb3JpZ2luYWwgY3Z0IChpdCB3YXMgbW9kaWZpZWQgd2hlbiB3ZSBzZXQgICovCi0gICAgICAvKiB0aGUgYmxlbmQgbGFzdCB0aW1lKSwgc28gd2UgbXVzdCByZWxvYWQgYW5kIHRoZW4gbW9kaWZ5IGl0LiAgICovCi0gICAgfQotCi0gICAgYmxlbmQtPm51bV9heGlzID0gbW12YXItPm51bV9heGlzOwotICAgIEZUX01FTV9DT1BZKCBibGVuZC0+bm9ybWFsaXplZGNvb3JkcywKLSAgICAgICAgICAgICAgICAgY29vcmRzLAotICAgICAgICAgICAgICAgICBudW1fY29vcmRzICogc2l6ZW9mICggRlRfRml4ZWQgKSApOwotCi0gICAgZmFjZS0+ZG9ibGVuZCA9IFRSVUU7Ci0KLSAgICBpZiAoIGZhY2UtPmN2dCAhPSBOVUxMICkKLSAgICB7Ci0gICAgICBzd2l0Y2ggKCBtYW5hZ2VDdnQgKQotICAgICAgewotICAgICAgY2FzZSBtY3Z0X2xvYWQ6Ci0gICAgICAgIC8qIFRoZSBjdnQgdGFibGUgaGFzIGJlZW4gbG9hZGVkIGFscmVhZHk7IGV2ZXJ5IHRpbWUgd2UgY2hhbmdlIHRoZSAqLwotICAgICAgICAvKiBibGVuZCB3ZSBtYXkgbmVlZCB0byByZWxvYWQgYW5kIHJlbW9kaWZ5IHRoZSBjdnQgdGFibGUuICAgICAgICAgKi8KLSAgICAgICAgRlRfRlJFRSggZmFjZS0+Y3Z0ICk7Ci0gICAgICAgIGZhY2UtPmN2dCA9IE5VTEw7Ci0KLSAgICAgICAgZXJyb3IgPSB0dF9mYWNlX2xvYWRfY3Z0KCBmYWNlLCBmYWNlLT5yb290LnN0cmVhbSApOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBtY3Z0X21vZGlmeToKLSAgICAgICAgLyogVGhlIG9yaWdpbmFsIGN2dCB0YWJsZSBpcyBpbiBtZW1vcnkuICBBbGwgd2UgbmVlZCB0byBkbyBpcyAqLwotICAgICAgICAvKiBhcHBseSB0aGUgYGN2YXInIHRhYmxlIChpZiBhbnkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGVycm9yID0gdHRfZmFjZV92YXJ5X2N2dCggZmFjZSwgZmFjZS0+cm9vdC5zdHJlYW0gKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgbWN2dF9yZXRhaW46Ci0gICAgICAgIC8qIFRoZSBjdnQgdGFibGUgaXMgY29ycmVjdCBmb3IgdGhpcyBzZXQgb2YgY29vcmRpbmF0ZXMuICovCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfU2V0X1Zhcl9EZXNpZ24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2V0IHRoZSBjb29yZGluYXRlcyBmb3IgdGhlIGluc3RhbmNlLCBtZWFzdXJlZCBpbiB0aGUgdXNlciAgICAgICAgICovCi0gIC8qICAgIGNvb3JkaW5hdGUgc3lzdGVtLiAgUGFyc2UgdGhlIGBhdmFyJyB0YWJsZSAoaWYgcHJlc2VudCkgdG8gY29udmVydCAqLwotICAvKiAgICBmcm9tIHVzZXIgdG8gbm9ybWFsaXplZCBjb29yZGluYXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgICAgIDo6IFRoZSBmb250IGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBJbml0aWFsaXplIHRoZSBibGVuZCBzdHJ1Y3Qgd2l0aCBgZ3ZhcicgZGF0YS4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbnVtX2Nvb3JkcyA6OiBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb29yZGluYXRlcy4gIElmIGl0IGlzICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBheGVzLCBpZ25vcmUgdGhlIGV4Y2VzcyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIHZhbHVlcy4gIElmIGl0IGlzIHNtYWxsZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGF4ZXMsICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICB1c2UgdGhlIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgcmVtYWluaW5nIGF4ZXMuICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb29yZHMgICAgIDo6IEEgY29vcmRpbmF0ZSBhcnJheSB3aXRoIGBudW1fY29vcmRzJyBlbGVtZW50cy4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUVF9TZXRfVmFyX0Rlc2lnbiggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICAgIGVycm9yICAgICAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfRml4ZWQqICAgICAgIG5vcm1hbGl6ZWQgPSBOVUxMOwotICAgIEdYX0JsZW5kICAgICAgICBibGVuZDsKLSAgICBGVF9NTV9WYXIqICAgICAgbW12YXI7Ci0gICAgRlRfVUludCAgICAgICAgIGksIGo7Ci0gICAgRlRfVmFyX0F4aXMqICAgIGE7Ci0gICAgR1hfQVZhclNlZ21lbnQgIGF2OwotICAgIEZUX01lbW9yeSAgICAgICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLQotCi0gICAgaWYgKCBmYWNlLT5ibGVuZCA9PSBOVUxMICkKLSAgICB7Ci0gICAgICBpZiAoICggZXJyb3IgPSBUVF9HZXRfTU1fVmFyKCBmYWNlLCBOVUxMICkgKSAhPSAwICkKLSAgICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGJsZW5kID0gZmFjZS0+YmxlbmQ7Ci0gICAgbW12YXIgPSBibGVuZC0+bW12YXI7Ci0KLSAgICBpZiAoIG51bV9jb29yZHMgPiBtbXZhci0+bnVtX2F4aXMgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICJUVF9TZXRfVmFyX0Rlc2lnbjoiCi0gICAgICAgICAgICAgICAgICAiIG9ubHkgdXNpbmcgZmlyc3QgJWQgb2YgJWQgY29vcmRpbmF0ZXNcbiIsCi0gICAgICAgICAgICAgICAgICBtbXZhci0+bnVtX2F4aXMsIG51bV9jb29yZHMgKSk7Ci0gICAgICBudW1fY29vcmRzID0gbW12YXItPm51bV9heGlzOwotICAgIH0KLQotICAgIC8qIEF4aXMgbm9ybWFsaXphdGlvbiBpcyBhIHR3byBzdGFnZSBwcm9jZXNzLiAgRmlyc3Qgd2Ugbm9ybWFsaXplICovCi0gICAgLyogYmFzZWQgb24gdGhlIFttaW4sZGVmLG1heF0gdmFsdWVzIGZvciB0aGUgYXhpcyB0byBiZSBbLTEsMCwxXS4gKi8KLSAgICAvKiBUaGVuLCBpZiB0aGVyZSdzIGFuIGBhdmFyJyB0YWJsZSwgd2UgcmVub3JtYWxpemUgdGhpcyByYW5nZS4gICAqLwotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIG5vcm1hbGl6ZWQsIG1tdmFyLT5udW1fYXhpcyApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIEZUX1RSQUNFNSgoICJkZXNpZ24gY29vcmRpbmF0ZXM6XG4iICkpOwotCi0gICAgYSA9IG1tdmFyLT5heGlzOwotICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX2Nvb3JkczsgaSsrLCBhKysgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFNSgoICIgICUuNGZcbiIsIGNvb3Jkc1tpXSAvIDY1NTM2LjAgKSk7Ci0gICAgICBpZiAoIGNvb3Jkc1tpXSA+IGEtPm1heGltdW0gfHwgY29vcmRzW2ldIDwgYS0+bWluaW11bSApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMSgoICJUVF9TZXRfVmFyX0Rlc2lnbjogbm9ybWFsaXplZCBkZXNpZ24gY29vcmRpbmF0ZSAlLjRmXG4iCi0gICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgaXMgb3V0IG9mIHJhbmdlIFslLjRmOyUuNGZdXG4iLAotICAgICAgICAgICAgICAgICAgICBjb29yZHNbaV0gLyA2NTUzNi4wLAotICAgICAgICAgICAgICAgICAgICBhLT5taW5pbXVtIC8gNjU1MzYuMCwKLSAgICAgICAgICAgICAgICAgICAgYS0+bWF4aW11bSAvIDY1NTM2LjAgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBpZiAoIGNvb3Jkc1tpXSA8IGEtPmRlZiApCi0gICAgICAgIG5vcm1hbGl6ZWRbaV0gPSAtRlRfRGl2Rml4KCBjb29yZHNbaV0gLSBhLT5kZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5taW5pbXVtIC0gYS0+ZGVmICk7Ci0gICAgICBlbHNlIGlmICggYS0+bWF4aW11bSA9PSBhLT5kZWYgKQotICAgICAgICBub3JtYWxpemVkW2ldID0gMDsKLSAgICAgIGVsc2UKLSAgICAgICAgbm9ybWFsaXplZFtpXSA9IEZUX0RpdkZpeCggY29vcmRzW2ldIC0gYS0+ZGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLT5tYXhpbXVtIC0gYS0+ZGVmICk7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U1KCggIlxuIiApKTsKLQotICAgIGZvciAoIDsgaSA8IG1tdmFyLT5udW1fYXhpczsgaSsrICkKLSAgICAgIG5vcm1hbGl6ZWRbaV0gPSAwOwotCi0gICAgaWYgKCAhYmxlbmQtPmF2YXJfY2hlY2tlZCApCi0gICAgICBmdF92YXJfbG9hZF9hdmFyKCBmYWNlICk7Ci0KLSAgICBpZiAoIGJsZW5kLT5hdmFyX3NlZ21lbnQgIT0gTlVMTCApCi0gICAgewotICAgICAgRlRfVFJBQ0U1KCggIm5vcm1hbGl6ZWQgZGVzaWduIGNvb3JkaW5hdGVzIgotICAgICAgICAgICAgICAgICAgIiBiZWZvcmUgYXBwbHlpbmcgYGF2YXInIGRhdGE6XG4iICkpOwotCi0gICAgICBhdiA9IGJsZW5kLT5hdmFyX3NlZ21lbnQ7Ci0gICAgICBmb3IgKCBpID0gMDsgaSA8IG1tdmFyLT5udW1fYXhpczsgaSsrLCBhdisrICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggaiA9IDE7IGogPCAoRlRfVUludClhdi0+cGFpckNvdW50OyBqKysgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVFJBQ0U1KCggIiAgJS40ZlxuIiwgbm9ybWFsaXplZFtpXSAvIDY1NTM2LjAgKSk7Ci0gICAgICAgICAgaWYgKCBub3JtYWxpemVkW2ldIDwgYXYtPmNvcnJlc3BvbmRlbmNlW2pdLmZyb21Db29yZCApCi0gICAgICAgICAgewotICAgICAgICAgICAgbm9ybWFsaXplZFtpXSA9Ci0gICAgICAgICAgICAgIEZUX011bERpdiggbm9ybWFsaXplZFtpXSAtIGF2LT5jb3JyZXNwb25kZW5jZVtqIC0gMV0uZnJvbUNvb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGF2LT5jb3JyZXNwb25kZW5jZVtqXS50b0Nvb3JkIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2LT5jb3JyZXNwb25kZW5jZVtqIC0gMV0udG9Db29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBhdi0+Y29ycmVzcG9uZGVuY2Vbal0uZnJvbUNvb3JkIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2LT5jb3JyZXNwb25kZW5jZVtqIC0gMV0uZnJvbUNvb3JkICkgKwotICAgICAgICAgICAgICBhdi0+Y29ycmVzcG9uZGVuY2VbaiAtIDFdLnRvQ29vcmQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBlcnJvciA9IFRUX1NldF9NTV9CbGVuZCggZmFjZSwgbW12YXItPm51bV9heGlzLCBub3JtYWxpemVkICk7Ci0KLSAgRXhpdDoKLSAgICBGVF9GUkVFKCBub3JtYWxpemVkICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICBHWCBWQVIgUEFSU0lORyBST1VUSU5FUyAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfdmFyeV9jdnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1vZGlmeSB0aGUgbG9hZGVkIGN2dCB0YWJsZSBhY2NvcmRpbmcgdG8gdGhlIGBjdmFyJyB0YWJsZSBhbmQgdGhlICAqLwotICAvKiAgICBmb250J3MgYmxlbmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogQSBoYW5kbGUgdG8gdGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE1vc3QgZXJyb3JzIGFyZSBpZ25vcmVkLiAgSXQgaXMgcGVyZmVjdGx5IHZhbGlkIG5vdCB0byBoYXZlIGEgICAgICAqLwotICAvKiAgICBgY3ZhcicgdGFibGUgZXZlbiBpZiB0aGVyZSBpcyBhIGBndmFyJyBhbmQgYGZ2YXInIHRhYmxlLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX3ZhcnlfY3Z0KCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIEZUX0Vycm9yICAgIGVycm9yOwotICAgIEZUX01lbW9yeSAgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotICAgIEZUX1VMb25nICAgIHRhYmxlX3N0YXJ0OwotICAgIEZUX1VMb25nICAgIHRhYmxlX2xlbjsKLSAgICBGVF9VSW50ICAgICB0dXBsZUNvdW50OwotICAgIEZUX1VMb25nICAgIG9mZnNldFRvRGF0YTsKLSAgICBGVF9VTG9uZyAgICBoZXJlOwotICAgIEZUX1VJbnQgICAgIGksIGo7Ci0gICAgRlRfRml4ZWQqICAgdHVwbGVfY29vcmRzICAgID0gTlVMTDsKLSAgICBGVF9GaXhlZCogICBpbV9zdGFydF9jb29yZHMgPSBOVUxMOwotICAgIEZUX0ZpeGVkKiAgIGltX2VuZF9jb29yZHMgICA9IE5VTEw7Ci0gICAgR1hfQmxlbmQgICAgYmxlbmQgICAgICAgICAgID0gZmFjZS0+YmxlbmQ7Ci0gICAgRlRfVUludCAgICAgcG9pbnRfY291bnQ7Ci0gICAgRlRfVVNob3J0KiAgbG9jYWxwb2ludHM7Ci0gICAgRlRfU2hvcnQqICAgZGVsdGFzOwotCi0KLSAgICBGVF9UUkFDRTIoKCAiQ1ZBUiAiICkpOwotCi0gICAgaWYgKCBibGVuZCA9PSBOVUxMICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiXG4iCi0gICAgICAgICAgICAgICAgICAidHRfZmFjZV92YXJ5X2N2dDogbm8gYmxlbmQgc3BlY2lmaWVkXG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBmYWNlLT5jdnQgPT0gTlVMTCApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggIlxuIgotICAgICAgICAgICAgICAgICAgInR0X2ZhY2VfdmFyeV9jdnQ6IG5vIGBjdnQgJyB0YWJsZVxuIiApKTsKLSAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIGVycm9yID0gZmFjZS0+Z290b190YWJsZSggZmFjZSwgVFRBR19jdmFyLCBzdHJlYW0sICZ0YWJsZV9sZW4gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTIoKCAiaXMgbWlzc2luZ1xuIiApKTsKLQotICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBGVF9GUkFNRV9FTlRFUiggdGFibGVfbGVuICkgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIHRhYmxlX3N0YXJ0ID0gRlRfU3RyZWFtX0ZUZWxsKCBzdHJlYW0gKTsKLSAgICBpZiAoIEZUX0dFVF9MT05HKCkgIT0gMHgwMDAxMDAwMEwgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICJiYWQgdGFibGUgdmVyc2lvblxuIiApKTsKLQotICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgICBnb3RvIEZFeGl0OwotICAgIH0KLQotICAgIEZUX1RSQUNFMigoICJsb2FkZWRcbiIgKSk7Ci0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggdHVwbGVfY29vcmRzLCBibGVuZC0+bnVtX2F4aXMgKSAgICB8fAotICAgICAgICAgRlRfTkVXX0FSUkFZKCBpbV9zdGFydF9jb29yZHMsIGJsZW5kLT5udW1fYXhpcyApIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIGltX2VuZF9jb29yZHMsIGJsZW5kLT5udW1fYXhpcyApICAgKQotICAgICAgZ290byBGRXhpdDsKLQotICAgIHR1cGxlQ291bnQgICA9IEZUX0dFVF9VU0hPUlQoKTsKLSAgICBvZmZzZXRUb0RhdGEgPSB0YWJsZV9zdGFydCArIEZUX0dFVF9VU0hPUlQoKTsKLQotICAgIC8qIFRoZSBkb2N1bWVudGF0aW9uIGltcGxpZXMgdGhlcmUgYXJlIGZsYWdzIHBhY2tlZCBpbnRvIHRoZSAgICAgICAgKi8KLSAgICAvKiB0dXBsZWNvdW50LCBidXQgSm9obiBKZW5raW5zIHNheXMgdGhhdCBzaGFyZWQgcG9pbnRzIGRvbid0IGFwcGx5ICovCi0gICAgLyogdG8gYGN2YXInLCBhbmQgbm8gb3RoZXIgZmxhZ3MgYXJlIGRlZmluZWQuICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgRlRfVFJBQ0U1KCggImN2YXI6IHRoZXJlIGFyZSAlZCB0dXBsZXM6XG4iLCB0dXBsZUNvdW50ICkpOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCAoIHR1cGxlQ291bnQgJiAweEZGRiApOyBpKysgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgICB0dXBsZURhdGFTaXplOwotICAgICAgRlRfVUludCAgIHR1cGxlSW5kZXg7Ci0gICAgICBGVF9GaXhlZCAgYXBwbHk7Ci0KLQotICAgICAgRlRfVFJBQ0U2KCggIiAgdHVwbGUgJWQ6XG4iLCBpICkpOwotCi0gICAgICB0dXBsZURhdGFTaXplID0gRlRfR0VUX1VTSE9SVCgpOwotICAgICAgdHVwbGVJbmRleCAgICA9IEZUX0dFVF9VU0hPUlQoKTsKLQotICAgICAgLyogVGhlcmUgaXMgbm8gcHJvdmlzaW9uIGhlcmUgZm9yIGEgZ2xvYmFsIHR1cGxlIGNvb3JkaW5hdGUgc2VjdGlvbiwgKi8KLSAgICAgIC8qIHNvIEpvaG4gc2F5cy4gIFRoZXJlIGFyZSBubyB0dXBsZSBpbmRpY2VzLCBqdXN0IGVtYmVkZGVkIHR1cGxlcy4gICovCi0KLSAgICAgIGlmICggdHVwbGVJbmRleCAmIEdYX1RJX0VNQkVEREVEX1RVUExFX0NPT1JEICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBibGVuZC0+bnVtX2F4aXM7IGorKyApCi0gICAgICAgICAgdHVwbGVfY29vcmRzW2pdID0gRlRfR0VUX1NIT1JUKCkgKiA0OyAgLyogY29udmVydCBmcm9tICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNob3J0IGZyYWMgdG8gZml4ZWQgKi8KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogc2tpcCB0aGlzIHR1cGxlOyBpdCBtYWtlcyBubyBzZW5zZSAqLwotCi0gICAgICAgIGlmICggdHVwbGVJbmRleCAmIEdYX1RJX0lOVEVSTUVESUFURV9UVVBMRSApCi0gICAgICAgICAgZm9yICggaiA9IDA7IGogPCAyICogYmxlbmQtPm51bV9heGlzOyBqKysgKQotICAgICAgICAgICAgKHZvaWQpRlRfR0VUX1NIT1JUKCk7Ci0KLSAgICAgICAgb2Zmc2V0VG9EYXRhICs9IHR1cGxlRGF0YVNpemU7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBpZiAoIHR1cGxlSW5kZXggJiBHWF9USV9JTlRFUk1FRElBVEVfVFVQTEUgKQotICAgICAgewotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGJsZW5kLT5udW1fYXhpczsgaisrICkKLSAgICAgICAgICBpbV9zdGFydF9jb29yZHNbal0gPSBGVF9HRVRfU0hPUlQoKSAqIDQ7Ci0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgYmxlbmQtPm51bV9heGlzOyBqKysgKQotICAgICAgICAgIGltX2VuZF9jb29yZHNbal0gPSBGVF9HRVRfU0hPUlQoKSAqIDQ7Ci0gICAgICB9Ci0KLSAgICAgIGFwcGx5ID0gZnRfdmFyX2FwcGx5X3R1cGxlKCBibGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVVNob3J0KXR1cGxlSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGVfY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltX3N0YXJ0X2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbV9lbmRfY29vcmRzICk7Ci0gICAgICBpZiAoIC8qIHR1cGxlIGlzbid0IGFjdGl2ZSBmb3Igb3VyIGJsZW5kICovCi0gICAgICAgICAgIGFwcGx5ID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAvKiBnbG9iYWwgcG9pbnRzIG5vdCBhbGxvd2VkLCAgICAgICAgICAgKi8KLSAgICAgICAgICAgLyogaWYgdGhleSBhcmVuJ3QgbG9jYWwsIG1ha2VzIG5vIHNlbnNlICovCi0gICAgICAgICAgICEoIHR1cGxlSW5kZXggJiBHWF9USV9QUklWQVRFX1BPSU5UX05VTUJFUlMgKSApCi0gICAgICB7Ci0gICAgICAgIG9mZnNldFRvRGF0YSArPSB0dXBsZURhdGFTaXplOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaGVyZSA9IEZUX1N0cmVhbV9GVGVsbCggc3RyZWFtICk7Ci0KLSAgICAgIEZUX1N0cmVhbV9TZWVrU2V0KCBzdHJlYW0sIG9mZnNldFRvRGF0YSApOwotCi0gICAgICBsb2NhbHBvaW50cyA9IGZ0X3Zhcl9yZWFkcGFja2VkcG9pbnRzKCBzdHJlYW0sICZwb2ludF9jb3VudCApOwotICAgICAgZGVsdGFzICAgICAgPSBmdF92YXJfcmVhZHBhY2tlZGRlbHRhcyggc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRfY291bnQgPT0gMCA/IGZhY2UtPmN2dF9zaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcG9pbnRfY291bnQgKTsKLSAgICAgIGlmICggbG9jYWxwb2ludHMgPT0gTlVMTCB8fCBkZWx0YXMgPT0gTlVMTCApCi0gICAgICAgIDsgLyogZmFpbHVyZSwgaWdub3JlIGl0ICovCi0KLSAgICAgIGVsc2UgaWYgKCBsb2NhbHBvaW50cyA9PSBBTExfUE9JTlRTICkKLSAgICAgIHsKLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICBpbnQgIGNvdW50ID0gMDsKLSNlbmRpZgotCi0KLSAgICAgICAgRlRfVFJBQ0U3KCggIiAgICBDVlQgZGVsdGFzOlxuIiApKTsKLQotICAgICAgICAvKiB0aGlzIG1lYW5zIHRoYXQgdGhlcmUgYXJlIGRlbHRhcyBmb3IgZXZlcnkgZW50cnkgaW4gY3Z0ICovCi0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgZmFjZS0+Y3Z0X3NpemU7IGorKyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Mb25nICBvcmlnX2N2dCA9IGZhY2UtPmN2dFtqXTsKLQotCi0gICAgICAgICAgZmFjZS0+Y3Z0W2pdID0gKEZUX1Nob3J0KSggb3JpZ19jdnQgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX011bEZpeCggZGVsdGFzW2pdLCBhcHBseSApICk7Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICAgIGlmICggb3JpZ19jdnQgIT0gZmFjZS0+Y3Z0W2pdICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9UUkFDRTcoKCAiICAgICAgJWQ6ICVkIC0+ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgaiwgb3JpZ19jdnQsIGZhY2UtPmN2dFtqXSApKTsKLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIH0KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIGlmICggIWNvdW50ICkKLSAgICAgICAgICBGVF9UUkFDRTcoKCAiICAgICAgbm9uZVxuIiApKTsKLSNlbmRpZgotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgaW50ICBjb3VudCA9IDA7Ci0jZW5kaWYKLQotCi0gICAgICAgIEZUX1RSQUNFNygoICIgICAgQ1ZUIGRlbHRhczpcbiIgKSk7Ci0KLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBwb2ludF9jb3VudDsgaisrICkKLSAgICAgICAgewotICAgICAgICAgIGludCAgICAgIHBpbmRleCAgID0gbG9jYWxwb2ludHNbal07Ci0gICAgICAgICAgRlRfTG9uZyAgb3JpZ19jdnQgPSBmYWNlLT5jdnRbcGluZGV4XTsKLQotCi0gICAgICAgICAgZmFjZS0+Y3Z0W3BpbmRleF0gPSAoRlRfU2hvcnQpKCBvcmlnX2N2dCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9NdWxGaXgoIGRlbHRhc1tqXSwgYXBwbHkgKSApOwotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgICBpZiAoIG9yaWdfY3Z0ICE9IGZhY2UtPmN2dFtwaW5kZXhdICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9UUkFDRTcoKCAiICAgICAgJWQ6ICVkIC0+ICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgcGluZGV4LCBvcmlnX2N2dCwgZmFjZS0+Y3Z0W3BpbmRleF0gKSk7Ci0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICB9Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICBpZiAoICFjb3VudCApCi0gICAgICAgICAgRlRfVFJBQ0U3KCggIiAgICAgIG5vbmVcbiIgKSk7Ci0jZW5kaWYKLSAgICAgIH0KLQotICAgICAgaWYgKCBsb2NhbHBvaW50cyAhPSBBTExfUE9JTlRTICkKLSAgICAgICAgRlRfRlJFRSggbG9jYWxwb2ludHMgKTsKLSAgICAgIEZUX0ZSRUUoIGRlbHRhcyApOwotCi0gICAgICBvZmZzZXRUb0RhdGEgKz0gdHVwbGVEYXRhU2l6ZTsKLQotICAgICAgRlRfU3RyZWFtX1NlZWtTZXQoIHN0cmVhbSwgaGVyZSApOwotICAgIH0KLQotICAgIEZUX1RSQUNFNSgoICJcbiIgKSk7Ci0KLSAgRkV4aXQ6Ci0gICAgRlRfRlJBTUVfRVhJVCgpOwotCi0gIEV4aXQ6Ci0gICAgRlRfRlJFRSggdHVwbGVfY29vcmRzICk7Ci0gICAgRlRfRlJFRSggaW1fc3RhcnRfY29vcmRzICk7Ci0gICAgRlRfRlJFRSggaW1fZW5kX2Nvb3JkcyApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKiBTaGlmdCB0aGUgb3JpZ2luYWwgY29vcmRpbmF0ZXMgb2YgYWxsIHBvaW50cyBiZXR3ZWVuIGluZGljZXMgYHAxJyAqLwotICAvKiBhbmQgYHAyJywgdXNpbmcgdGhlIHNhbWUgZGlmZmVyZW5jZSBhcyBnaXZlbiBieSBpbmRleCBgcmVmJy4gICAgICAqLwotCi0gIC8qIG1vZGVsZWQgYWZ0ZXIgYGFmX2l1cF9zaGlmdCcgKi8KLQotICBzdGF0aWMgdm9pZAotICB0dF9kZWx0YV9zaGlmdCggaW50ICAgICAgICAgcDEsCi0gICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBwMiwKLSAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHJlZiwKLSAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIGluX3BvaW50cywKLSAgICAgICAgICAgICAgICAgIEZUX1ZlY3RvciogIG91dF9wb2ludHMgKQotICB7Ci0gICAgaW50ICAgICAgICBwOwotICAgIEZUX1ZlY3RvciAgZGVsdGE7Ci0KLQotICAgIGRlbHRhLnggPSBvdXRfcG9pbnRzW3JlZl0ueCAtIGluX3BvaW50c1tyZWZdLng7Ci0gICAgZGVsdGEueSA9IG91dF9wb2ludHNbcmVmXS55IC0gaW5fcG9pbnRzW3JlZl0ueTsKLQotICAgIGlmICggZGVsdGEueCA9PSAwICYmIGRlbHRhLnkgPT0gMCApCi0gICAgICByZXR1cm47Ci0KLSAgICBmb3IgKCBwID0gcDE7IHAgPCByZWY7IHArKyApCi0gICAgewotICAgICAgb3V0X3BvaW50c1twXS54ICs9IGRlbHRhLng7Ci0gICAgICBvdXRfcG9pbnRzW3BdLnkgKz0gZGVsdGEueTsKLSAgICB9Ci0KLSAgICBmb3IgKCBwID0gcmVmICsgMTsgcCA8PSBwMjsgcCsrICkKLSAgICB7Ci0gICAgICBvdXRfcG9pbnRzW3BdLnggKz0gZGVsdGEueDsKLSAgICAgIG91dF9wb2ludHNbcF0ueSArPSBkZWx0YS55OwotICAgIH0KLSAgfQotCi0KLSAgLyogSW50ZXJwb2xhdGUgdGhlIG9yaWdpbmFsIGNvb3JkaW5hdGVzIG9mIGFsbCBwb2ludHMgd2l0aCBpbmRpY2VzICovCi0gIC8qIGJldHdlZW4gYHAxJyBhbmQgYHAyJywgdXNpbmcgYHJlZjEnIGFuZCBgcmVmMicgYXMgdGhlIHJlZmVyZW5jZSAqLwotICAvKiBwb2ludCBpbmRpY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAvKiBtb2RlbGVkIGFmdGVyIGBhZl9pdXBfaW50ZXJwJywgYF9pdXBfd29ya2VyX2ludGVycG9sYXRlJywgYW5kICovCi0gIC8qIGBJbnNfSVVQJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBzdGF0aWMgdm9pZAotICB0dF9kZWx0YV9pbnRlcnBvbGF0ZSggaW50ICAgICAgICAgcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICBwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgIHJlZjEsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICByZWYyLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgaW5fcG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgb3V0X3BvaW50cyApCi0gIHsKLSAgICBpbnQgIHAsIGk7Ci0KLSAgICBGVF9Qb3MgIG91dCwgaW4xLCBpbjIsIG91dDEsIG91dDIsIGQxLCBkMjsKLQotCi0gICAgaWYgKCBwMSA+IHAyICkKLSAgICAgIHJldHVybjsKLQotICAgIC8qIGhhbmRsZSBib3RoIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGNvb3JkaW5hdGVzICovCi0gICAgZm9yICggaSA9IDA7IGkgPD0gMTsgaSsrICkKLSAgICB7Ci0gICAgICAvKiBzaGlmdCBhcnJheSBwb2ludGVycyBzbyB0aGF0IHdlIGNhbiBhY2Nlc3MgYGZvby55JyBhcyBgZm9vLngnICovCi0gICAgICBpbl9wb2ludHMgID0gKEZUX1ZlY3RvciopKCAoRlRfUG9zKilpbl9wb2ludHMgKyBpICk7Ci0gICAgICBvdXRfcG9pbnRzID0gKEZUX1ZlY3RvciopKCAoRlRfUG9zKilvdXRfcG9pbnRzICsgaSApOwotCi0gICAgICBpZiAoIGluX3BvaW50c1tyZWYxXS54ID4gaW5fcG9pbnRzW3JlZjJdLnggKQotICAgICAgewotICAgICAgICBwICAgID0gcmVmMTsKLSAgICAgICAgcmVmMSA9IHJlZjI7Ci0gICAgICAgIHJlZjIgPSBwOwotICAgICAgfQotCi0gICAgICBpbjEgID0gaW5fcG9pbnRzW3JlZjFdLng7Ci0gICAgICBpbjIgID0gaW5fcG9pbnRzW3JlZjJdLng7Ci0gICAgICBvdXQxID0gb3V0X3BvaW50c1tyZWYxXS54OwotICAgICAgb3V0MiA9IG91dF9wb2ludHNbcmVmMl0ueDsKLSAgICAgIGQxICAgPSBvdXQxIC0gaW4xOwotICAgICAgZDIgICA9IG91dDIgLSBpbjI7Ci0KLSAgICAgIGlmICggb3V0MSA9PSBvdXQyIHx8IGluMSA9PSBpbjIgKQotICAgICAgewotICAgICAgICBmb3IgKCBwID0gcDE7IHAgPD0gcDI7IHArKyApCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQgPSBpbl9wb2ludHNbcF0ueDsKLQotICAgICAgICAgIGlmICggb3V0IDw9IGluMSApCi0gICAgICAgICAgICBvdXQgKz0gZDE7Ci0gICAgICAgICAgZWxzZSBpZiAoIG91dCA+PSBpbjIgKQotICAgICAgICAgICAgb3V0ICs9IGQyOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIG91dCA9IG91dDE7Ci0KLSAgICAgICAgICBvdXRfcG9pbnRzW3BdLnggPSBvdXQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgRlRfRml4ZWQgIHNjYWxlID0gRlRfRGl2Rml4KCBvdXQyIC0gb3V0MSwgaW4yIC0gaW4xICk7Ci0KLQotICAgICAgICBmb3IgKCBwID0gcDE7IHAgPD0gcDI7IHArKyApCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQgPSBpbl9wb2ludHNbcF0ueDsKLQotICAgICAgICAgIGlmICggb3V0IDw9IGluMSApCi0gICAgICAgICAgICBvdXQgKz0gZDE7Ci0gICAgICAgICAgZWxzZSBpZiAoIG91dCA+PSBpbjIgKQotICAgICAgICAgICAgb3V0ICs9IGQyOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIG91dCA9IG91dDEgKyBGVF9NdWxGaXgoIG91dCAtIGluMSwgc2NhbGUgKTsKLQotICAgICAgICAgIG91dF9wb2ludHNbcF0ueCA9IG91dDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyogSW50ZXJwb2xhdGUgcG9pbnRzIHdpdGhvdXQgZGVsdGEgdmFsdWVzLCBzaW1pbGFyIHRvICovCi0gIC8qIHRoZSBgSVVQJyBoaW50aW5nIGluc3RydWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIG1vZGVsZWQgYWZ0ZXIgYEluc19JVVAgKi8KLQotICBzdGF0aWMgdm9pZAotICB0dF9oYW5kbGVfZGVsdGFzKCBGVF9PdXRsaW5lKiAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAgIGluX3BvaW50cywKLSAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCogICAgIGhhc19kZWx0YSApCi0gIHsKLSAgICBGVF9WZWN0b3IqICBvdXRfcG9pbnRzOwotCi0gICAgRlRfSW50ICBmaXJzdF9wb2ludDsKLSAgICBGVF9JbnQgIGVuZF9wb2ludDsKLQotICAgIEZUX0ludCAgZmlyc3RfZGVsdGE7Ci0gICAgRlRfSW50ICBjdXJfZGVsdGE7Ci0KLSAgICBGVF9JbnQgICAgcG9pbnQ7Ci0gICAgRlRfU2hvcnQgIGNvbnRvdXI7Ci0KLQotICAgIC8qIGlnbm9yZSBlbXB0eSBvdXRsaW5lcyAqLwotICAgIGlmICggIW91dGxpbmUtPm5fY29udG91cnMgKQotICAgICAgcmV0dXJuOwotCi0gICAgb3V0X3BvaW50cyA9IG91dGxpbmUtPnBvaW50czsKLQotICAgIGNvbnRvdXIgPSAwOwotICAgIHBvaW50ICAgPSAwOwotCi0gICAgZG8KLSAgICB7Ci0gICAgICBlbmRfcG9pbnQgICA9IG91dGxpbmUtPmNvbnRvdXJzW2NvbnRvdXJdOwotICAgICAgZmlyc3RfcG9pbnQgPSBwb2ludDsKLQotICAgICAgLyogc2VhcmNoIGZpcnN0IHBvaW50IHRoYXQgaGFzIGEgZGVsdGEgKi8KLSAgICAgIHdoaWxlICggcG9pbnQgPD0gZW5kX3BvaW50ICYmICFoYXNfZGVsdGFbcG9pbnRdICkKLSAgICAgICAgcG9pbnQrKzsKLQotICAgICAgaWYgKCBwb2ludCA8PSBlbmRfcG9pbnQgKQotICAgICAgewotICAgICAgICBmaXJzdF9kZWx0YSA9IHBvaW50OwotICAgICAgICBjdXJfZGVsdGEgICA9IHBvaW50OwotCi0gICAgICAgIHBvaW50Kys7Ci0KLSAgICAgICAgd2hpbGUgKCBwb2ludCA8PSBlbmRfcG9pbnQgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogc2VhcmNoIG5leHQgcG9pbnQgdGhhdCBoYXMgYSBkZWx0YSAgKi8KLSAgICAgICAgICAvKiBhbmQgaW50ZXJwb2xhdGUgaW50ZXJtZWRpYXRlIHBvaW50cyAqLwotICAgICAgICAgIGlmICggaGFzX2RlbHRhW3BvaW50XSApCi0gICAgICAgICAgewotICAgICAgICAgICAgdHRfZGVsdGFfaW50ZXJwb2xhdGUoIGN1cl9kZWx0YSArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQgLSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9kZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9wb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X3BvaW50cyApOwotICAgICAgICAgICAgY3VyX2RlbHRhID0gcG9pbnQ7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgcG9pbnQrKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHNoaWZ0IGNvbnRvdXIgaWYgd2Ugb25seSBoYXZlIGEgc2luZ2xlIGRlbHRhICovCi0gICAgICAgIGlmICggY3VyX2RlbHRhID09IGZpcnN0X2RlbHRhICkKLSAgICAgICAgICB0dF9kZWx0YV9zaGlmdCggZmlyc3RfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2RlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9wb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9wb2ludHMgKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogb3RoZXJ3aXNlIGhhbmRsZSByZW1haW5pbmcgcG9pbnRzICAgICAgICovCi0gICAgICAgICAgLyogYXQgdGhlIGVuZCBhbmQgYmVnaW5uaW5nIG9mIHRoZSBjb250b3VyICovCi0gICAgICAgICAgdHRfZGVsdGFfaW50ZXJwb2xhdGUoIGN1cl9kZWx0YSArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2RlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9kZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fcG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfcG9pbnRzICk7Ci0KLSAgICAgICAgICBpZiAoIGZpcnN0X2RlbHRhID4gMCApCi0gICAgICAgICAgICB0dF9kZWx0YV9pbnRlcnBvbGF0ZSggZmlyc3RfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfZGVsdGEgLSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9kZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9kZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbl9wb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X3BvaW50cyApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjb250b3VyKys7Ci0KLSAgICB9IHdoaWxlICggY29udG91ciA8IG91dGxpbmUtPm5fY29udG91cnMgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfVmFyeV9BcHBseV9HbHlwaF9EZWx0YXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQXBwbHkgdGhlIGFwcHJvcHJpYXRlIGRlbHRhcyB0byB0aGUgY3VycmVudCBnbHlwaC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBnbHlwaF9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGdseXBoIGJlaW5nIG1vZGlmaWVkLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG5fcG9pbnRzICAgIDo6IFRoZSBudW1iZXIgb2YgdGhlIHBvaW50cyBpbiB0aGUgZ2x5cGgsIGluY2x1ZGluZyAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBwaGFudG9tIHBvaW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBvdXRsaW5lICAgICA6OiBUaGUgb3V0bGluZSB0byBjaGFuZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUVF9WYXJ5X0FwcGx5X0dseXBoX0RlbHRhcyggVFRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBuX3BvaW50cyApCi0gIHsKLSAgICBGVF9TdHJlYW0gICBzdHJlYW0gPSBmYWNlLT5yb290LnN0cmVhbTsKLSAgICBGVF9NZW1vcnkgICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBHWF9CbGVuZCAgICBibGVuZCAgPSBmYWNlLT5ibGVuZDsKLQotICAgIEZUX1ZlY3RvciogIHBvaW50c19vcmcgPSBOVUxMOwotICAgIEZUX0Jvb2wqICAgIGhhc19kZWx0YSAgPSBOVUxMOwotCi0gICAgRlRfRXJyb3IgICAgZXJyb3I7Ci0gICAgRlRfVUxvbmcgICAgZ2x5cGhfc3RhcnQ7Ci0gICAgRlRfVUludCAgICAgdHVwbGVDb3VudDsKLSAgICBGVF9VTG9uZyAgICBvZmZzZXRUb0RhdGE7Ci0gICAgRlRfVUxvbmcgICAgaGVyZTsKLSAgICBGVF9VSW50ICAgICBpLCBqOwotICAgIEZUX0ZpeGVkKiAgIHR1cGxlX2Nvb3JkcyAgICA9IE5VTEw7Ci0gICAgRlRfRml4ZWQqICAgaW1fc3RhcnRfY29vcmRzID0gTlVMTDsKLSAgICBGVF9GaXhlZCogICBpbV9lbmRfY29vcmRzICAgPSBOVUxMOwotICAgIEZUX1VJbnQgICAgIHBvaW50X2NvdW50LCBzcG9pbnRfY291bnQgPSAwOwotICAgIEZUX1VTaG9ydCogIHNoYXJlZHBvaW50cyA9IE5VTEw7Ci0gICAgRlRfVVNob3J0KiAgbG9jYWxwb2ludHMgID0gTlVMTDsKLSAgICBGVF9VU2hvcnQqICBwb2ludHM7Ci0gICAgRlRfU2hvcnQgICAgKmRlbHRhc194LCAqZGVsdGFzX3k7Ci0KLQotICAgIGlmICggIWZhY2UtPmRvYmxlbmQgfHwgYmxlbmQgPT0gTlVMTCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGlmICggZ2x5cGhfaW5kZXggPj0gYmxlbmQtPmd2X2dseXBoY250ICAgICAgfHwKLSAgICAgICAgIGJsZW5kLT5nbHlwaG9mZnNldHNbZ2x5cGhfaW5kZXhdID09Ci0gICAgICAgICAgIGJsZW5kLT5nbHlwaG9mZnNldHNbZ2x5cGhfaW5kZXggKyAxXSApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggIlRUX1ZhcnlfQXBwbHlfR2x5cGhfRGVsdGFzOiIKLSAgICAgICAgICAgICAgICAgICIgbm8gdmFyaWF0aW9uIGRhdGEgZm9yIHRoaXMgZ2x5cGhcbiIgKSk7Ci0gICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgIH0KLQotICAgIGlmICggRlRfTkVXX0FSUkFZKCBwb2ludHNfb3JnLCBuX3BvaW50cyApIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIGhhc19kZWx0YSwgbl9wb2ludHMgKSAgKQotICAgICAgZ290byBGYWlsMTsKLQotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIGJsZW5kLT5nbHlwaG9mZnNldHNbZ2x5cGhfaW5kZXhdICkgICB8fAotICAgICAgICAgRlRfRlJBTUVfRU5URVIoIGJsZW5kLT5nbHlwaG9mZnNldHNbZ2x5cGhfaW5kZXggKyAxXSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZC0+Z2x5cGhvZmZzZXRzW2dseXBoX2luZGV4XSApICkKLSAgICAgIGdvdG8gRmFpbDE7Ci0KLSAgICBnbHlwaF9zdGFydCA9IEZUX1N0cmVhbV9GVGVsbCggc3RyZWFtICk7Ci0KLSAgICAvKiBlYWNoIHNldCBvZiBnbHlwaCB2YXJpYXRpb24gZGF0YSBpcyBmb3JtYXR0ZWQgc2ltaWxhcmx5IHRvIGBjdmFyJyAqLwotICAgIC8qIChleGNlcHQgd2UgZ2V0IHNoYXJlZCBwb2ludHMgYW5kIGdsb2JhbCB0dXBsZXMpICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBpZiAoIEZUX05FV19BUlJBWSggdHVwbGVfY29vcmRzLCBibGVuZC0+bnVtX2F4aXMgKSAgICB8fAotICAgICAgICAgRlRfTkVXX0FSUkFZKCBpbV9zdGFydF9jb29yZHMsIGJsZW5kLT5udW1fYXhpcyApIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIGltX2VuZF9jb29yZHMsIGJsZW5kLT5udW1fYXhpcyApICAgKQotICAgICAgZ290byBGYWlsMjsKLQotICAgIHR1cGxlQ291bnQgICA9IEZUX0dFVF9VU0hPUlQoKTsKLSAgICBvZmZzZXRUb0RhdGEgPSBnbHlwaF9zdGFydCArIEZUX0dFVF9VU0hPUlQoKTsKLQotICAgIGlmICggdHVwbGVDb3VudCAmIEdYX1RDX1RVUExFU19TSEFSRV9QT0lOVF9OVU1CRVJTICkKLSAgICB7Ci0gICAgICBoZXJlID0gRlRfU3RyZWFtX0ZUZWxsKCBzdHJlYW0gKTsKLQotICAgICAgRlRfU3RyZWFtX1NlZWtTZXQoIHN0cmVhbSwgb2Zmc2V0VG9EYXRhICk7Ci0KLSAgICAgIHNoYXJlZHBvaW50cyA9IGZ0X3Zhcl9yZWFkcGFja2VkcG9pbnRzKCBzdHJlYW0sICZzcG9pbnRfY291bnQgKTsKLSAgICAgIG9mZnNldFRvRGF0YSA9IEZUX1N0cmVhbV9GVGVsbCggc3RyZWFtICk7Ci0KLSAgICAgIEZUX1N0cmVhbV9TZWVrU2V0KCBzdHJlYW0sIGhlcmUgKTsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTUoKCAiZ3ZhcjogdGhlcmUgYXJlICVkIHR1cGxlczpcbiIsIHR1cGxlQ291bnQgKSk7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8ICggdHVwbGVDb3VudCAmIEdYX1RDX1RVUExFX0NPVU5UX01BU0sgKTsgaSsrICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICAgdHVwbGVEYXRhU2l6ZTsKLSAgICAgIEZUX1VJbnQgICB0dXBsZUluZGV4OwotICAgICAgRlRfRml4ZWQgIGFwcGx5OwotCi0KLSAgICAgIEZUX1RSQUNFNigoICIgIHR1cGxlICVkOlxuIiwgaSApKTsKLQotICAgICAgdHVwbGVEYXRhU2l6ZSA9IEZUX0dFVF9VU0hPUlQoKTsKLSAgICAgIHR1cGxlSW5kZXggICAgPSBGVF9HRVRfVVNIT1JUKCk7Ci0KLSAgICAgIGlmICggdHVwbGVJbmRleCAmIEdYX1RJX0VNQkVEREVEX1RVUExFX0NPT1JEICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBibGVuZC0+bnVtX2F4aXM7IGorKyApCi0gICAgICAgICAgdHVwbGVfY29vcmRzW2pdID0gRlRfR0VUX1NIT1JUKCkgKiA0OyAgIC8qIGNvbnZlcnQgZnJvbSAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2hvcnQgZnJhYyB0byBmaXhlZCAqLwotICAgICAgfQotICAgICAgZWxzZSBpZiAoICggdHVwbGVJbmRleCAmIEdYX1RJX1RVUExFX0lOREVYX01BU0sgKSA+PSBibGVuZC0+dHVwbGVjb3VudCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgICAgZ290byBGYWlsMjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgRlRfTUVNX0NPUFkoCi0gICAgICAgICAgdHVwbGVfY29vcmRzLAotICAgICAgICAgICZibGVuZC0+dHVwbGVjb29yZHNbKCB0dXBsZUluZGV4ICYgMHhGRkYgKSAqIGJsZW5kLT5udW1fYXhpc10sCi0gICAgICAgICAgYmxlbmQtPm51bV9heGlzICogc2l6ZW9mICggRlRfRml4ZWQgKSApOwotCi0gICAgICBpZiAoIHR1cGxlSW5kZXggJiBHWF9USV9JTlRFUk1FRElBVEVfVFVQTEUgKQotICAgICAgewotICAgICAgICBmb3IgKCBqID0gMDsgaiA8IGJsZW5kLT5udW1fYXhpczsgaisrICkKLSAgICAgICAgICBpbV9zdGFydF9jb29yZHNbal0gPSBGVF9HRVRfU0hPUlQoKSAqIDQ7Ci0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgYmxlbmQtPm51bV9heGlzOyBqKysgKQotICAgICAgICAgIGltX2VuZF9jb29yZHNbal0gPSBGVF9HRVRfU0hPUlQoKSAqIDQ7Ci0gICAgICB9Ci0KLSAgICAgIGFwcGx5ID0gZnRfdmFyX2FwcGx5X3R1cGxlKCBibGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVVNob3J0KXR1cGxlSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGVfY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltX3N0YXJ0X2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbV9lbmRfY29vcmRzICk7Ci0KLSAgICAgIGlmICggYXBwbHkgPT0gMCApICAgICAgICAgICAgICAvKiB0dXBsZSBpc24ndCBhY3RpdmUgZm9yIG91ciBibGVuZCAqLwotICAgICAgewotICAgICAgICBvZmZzZXRUb0RhdGEgKz0gdHVwbGVEYXRhU2l6ZTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGhlcmUgPSBGVF9TdHJlYW1fRlRlbGwoIHN0cmVhbSApOwotCi0gICAgICBpZiAoIHR1cGxlSW5kZXggJiBHWF9USV9QUklWQVRFX1BPSU5UX05VTUJFUlMgKQotICAgICAgewotICAgICAgICBGVF9TdHJlYW1fU2Vla1NldCggc3RyZWFtLCBvZmZzZXRUb0RhdGEgKTsKLQotICAgICAgICBsb2NhbHBvaW50cyA9IGZ0X3Zhcl9yZWFkcGFja2VkcG9pbnRzKCBzdHJlYW0sICZwb2ludF9jb3VudCApOwotICAgICAgICBwb2ludHMgICAgICA9IGxvY2FscG9pbnRzOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBwb2ludHMgICAgICA9IHNoYXJlZHBvaW50czsKLSAgICAgICAgcG9pbnRfY291bnQgPSBzcG9pbnRfY291bnQ7Ci0gICAgICB9Ci0KLSAgICAgIGRlbHRhc194ID0gZnRfdmFyX3JlYWRwYWNrZWRkZWx0YXMoIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2NvdW50ID09IDAgPyBuX3BvaW50cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBvaW50X2NvdW50ICk7Ci0gICAgICBkZWx0YXNfeSA9IGZ0X3Zhcl9yZWFkcGFja2VkZGVsdGFzKCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9jb3VudCA9PSAwID8gbl9wb2ludHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBwb2ludF9jb3VudCApOwotCi0gICAgICBpZiAoIHBvaW50cyA9PSBOVUxMIHx8IGRlbHRhc195ID09IE5VTEwgfHwgZGVsdGFzX3ggPT0gTlVMTCApCi0gICAgICAgIDsgLyogZmFpbHVyZSwgaWdub3JlIGl0ICovCi0KLSAgICAgIGVsc2UgaWYgKCBwb2ludHMgPT0gQUxMX1BPSU5UUyApCi0gICAgICB7Ci0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgaW50ICBjb3VudCA9IDA7Ci0jZW5kaWYKLQotCi0gICAgICAgIEZUX1RSQUNFNygoICIgICAgcG9pbnQgZGVsdGFzOlxuIiApKTsKLQotICAgICAgICAvKiB0aGlzIG1lYW5zIHRoYXQgdGhlcmUgYXJlIGRlbHRhcyBmb3IgZXZlcnkgcG9pbnQgaW4gdGhlIGdseXBoICovCi0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgbl9wb2ludHM7IGorKyApCi0gICAgICAgIHsKLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICAgIEZUX1ZlY3RvciAgcG9pbnRfb3JnID0gb3V0bGluZS0+cG9pbnRzW2pdOwotI2VuZGlmCi0KLQotICAgICAgICAgIG91dGxpbmUtPnBvaW50c1tqXS54ICs9IEZUX011bEZpeCggZGVsdGFzX3hbal0sIGFwcGx5ICk7Ci0gICAgICAgICAgb3V0bGluZS0+cG9pbnRzW2pdLnkgKz0gRlRfTXVsRml4KCBkZWx0YXNfeVtqXSwgYXBwbHkgKTsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgICAgaWYgKCAoIHBvaW50X29yZy54ICE9IG91dGxpbmUtPnBvaW50c1tqXS54ICkgfHwKLSAgICAgICAgICAgICAgICggcG9pbnRfb3JnLnkgIT0gb3V0bGluZS0+cG9pbnRzW2pdLnkgKSApCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfVFJBQ0U3KCggIiAgICAgICVkOiAoJWQsICVkKSAtPiAoJWQsICVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGosCi0gICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9vcmcueCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X29yZy55LAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZS0+cG9pbnRzW2pdLngsCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lLT5wb2ludHNbal0ueSApKTsKLSAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIH0KLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICAgIGlmICggIWNvdW50ICkKLSAgICAgICAgICBGVF9UUkFDRTcoKCAiICAgICAgbm9uZVxuIiApKTsKLSNlbmRpZgotICAgICAgfQotCi0gICAgICBlbHNlCi0gICAgICB7Ci0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLSAgICAgICAgaW50ICBjb3VudCA9IDA7Ci0jZW5kaWYKLQotCi0gICAgICAgIC8qIHdlIGhhdmUgdG8gaW50ZXJwb2xhdGUgdGhlIG1pc3NpbmcgZGVsdGFzIHNpbWlsYXIgdG8gdGhlICovCi0gICAgICAgIC8qIElVUCBieXRlY29kZSBpbnN0cnVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgbl9wb2ludHM7IGorKyApCi0gICAgICAgIHsKLSAgICAgICAgICBwb2ludHNfb3JnW2pdID0gb3V0bGluZS0+cG9pbnRzW2pdOwotICAgICAgICAgIGhhc19kZWx0YVtqXSAgPSBGQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgcG9pbnRfY291bnQ7IGorKyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9VU2hvcnQgIGlkeCA9IGxvY2FscG9pbnRzW2pdOwotCi0KLSAgICAgICAgICBpZiAoIGlkeCA+PSBuX3BvaW50cyApCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIGhhc19kZWx0YVtpZHhdID0gVFJVRTsKLQotICAgICAgICAgIG91dGxpbmUtPnBvaW50c1tpZHhdLnggKz0gRlRfTXVsRml4KCBkZWx0YXNfeFtqXSwgYXBwbHkgKTsKLSAgICAgICAgICBvdXRsaW5lLT5wb2ludHNbaWR4XS55ICs9IEZUX011bEZpeCggZGVsdGFzX3lbal0sIGFwcGx5ICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBubyBuZWVkIHRvIGhhbmRsZSBwaGFudG9tIHBvaW50cyBoZXJlLCAgICAgICovCi0gICAgICAgIC8qIHNpbmNlIHNvbGl0YXJ5IHBvaW50cyBjYW4ndCBiZSBpbnRlcnBvbGF0ZWQgKi8KLSAgICAgICAgdHRfaGFuZGxlX2RlbHRhcyggb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzX29yZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2RlbHRhICk7Ci0KLSNpZmRlZiBGVF9ERUJVR19MRVZFTF9UUkFDRQotICAgICAgICBGVF9UUkFDRTcoKCAiICAgIHBvaW50IGRlbHRhczpcbiIgKSk7Ci0KLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBuX3BvaW50czsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCAoIHBvaW50c19vcmdbal0ueCAhPSBvdXRsaW5lLT5wb2ludHNbal0ueCApIHx8Ci0gICAgICAgICAgICAgICAoIHBvaW50c19vcmdbal0ueSAhPSBvdXRsaW5lLT5wb2ludHNbal0ueSApICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9UUkFDRTcoKCAiICAgICAgJWQ6ICglZCwgJWQpIC0+ICglZCwgJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgaiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50c19vcmdbal0ueCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50c19vcmdbal0ueSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmUtPnBvaW50c1tqXS54LAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZS0+cG9pbnRzW2pdLnkgKSk7Ci0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggIWNvdW50ICkKLSAgICAgICAgICBGVF9UUkFDRTcoKCAiICAgICAgbm9uZVxuIiApKTsKLSNlbmRpZgotICAgICAgfQotCi0gICAgICBpZiAoIGxvY2FscG9pbnRzICE9IEFMTF9QT0lOVFMgKQotICAgICAgICBGVF9GUkVFKCBsb2NhbHBvaW50cyApOwotICAgICAgRlRfRlJFRSggZGVsdGFzX3ggKTsKLSAgICAgIEZUX0ZSRUUoIGRlbHRhc195ICk7Ci0KLSAgICAgIG9mZnNldFRvRGF0YSArPSB0dXBsZURhdGFTaXplOwotCi0gICAgICBGVF9TdHJlYW1fU2Vla1NldCggc3RyZWFtLCBoZXJlICk7Ci0gICAgfQotCi0gICAgRlRfVFJBQ0U1KCggIlxuIiApKTsKLQotICBGYWlsMjoKLSAgICBGVF9GUkVFKCB0dXBsZV9jb29yZHMgKTsKLSAgICBGVF9GUkVFKCBpbV9zdGFydF9jb29yZHMgKTsKLSAgICBGVF9GUkVFKCBpbV9lbmRfY29vcmRzICk7Ci0KLSAgICBGVF9GUkFNRV9FWElUKCk7Ci0KLSAgRmFpbDE6Ci0gICAgRlRfRlJFRSggcG9pbnRzX29yZyApOwotICAgIEZUX0ZSRUUoIGhhc19kZWx0YSApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9kb25lX2JsZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlIHRoZSBibGVuZCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHR0X2RvbmVfYmxlbmQoIEZUX01lbW9yeSAgbWVtb3J5LAotICAgICAgICAgICAgICAgICBHWF9CbGVuZCAgIGJsZW5kICkKLSAgewotICAgIGlmICggYmxlbmQgIT0gTlVMTCApCi0gICAgewotICAgICAgRlRfVUludCAgaTsKLQotCi0gICAgICBGVF9GUkVFKCBibGVuZC0+bm9ybWFsaXplZGNvb3JkcyApOwotICAgICAgRlRfRlJFRSggYmxlbmQtPm1tdmFyICk7Ci0KLSAgICAgIGlmICggYmxlbmQtPmF2YXJfc2VnbWVudCAhPSBOVUxMICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggaSA9IDA7IGkgPCBibGVuZC0+bnVtX2F4aXM7IGkrKyApCi0gICAgICAgICAgRlRfRlJFRSggYmxlbmQtPmF2YXJfc2VnbWVudFtpXS5jb3JyZXNwb25kZW5jZSApOwotICAgICAgICBGVF9GUkVFKCBibGVuZC0+YXZhcl9zZWdtZW50ICk7Ci0gICAgICB9Ci0KLSAgICAgIEZUX0ZSRUUoIGJsZW5kLT50dXBsZWNvb3JkcyApOwotICAgICAgRlRfRlJFRSggYmxlbmQtPmdseXBob2Zmc2V0cyApOwotICAgICAgRlRfRlJFRSggYmxlbmQgKTsKLSAgICB9Ci0gIH0KLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGd4dmFyLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRneHZhci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjBkNGQ2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGd4dmFyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRneHZhci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlIEdYIEZvbnQgVmFyaWF0aW9uIGxvYWRlciAoc3BlY2lmaWNhdGlvbikgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDA0LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBXZXJuZXIgTGVtYmVyZyBhbmQgR2VvcmdlIFdpbGxpYW1zLiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fVFRHWFZBUl9IX18KLSNkZWZpbmUgX19UVEdYVkFSX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgInR0b2Jqcy5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR1hfQVZhckNvcnJlc3BvbmRlbmNlUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQSBkYXRhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYHNob3J0RnJhY0NvcnJlc3BvbmRlbmNlJyBpbiBgYXZhcicgICovCi0gIC8qICAgIHRhYmxlIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWNhdGlvbnMgZnJvbSBBcHBsZS4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEdYX0FWYXJDb3JyZXNwb25kZW5jZVJlY18KLSAgewotICAgIEZUX0ZpeGVkICBmcm9tQ29vcmQ7Ci0gICAgRlRfRml4ZWQgIHRvQ29vcmQ7Ci0KLSAgfSBHWF9BVmFyQ29ycmVzcG9uZGVuY2VSZWNfLCAqR1hfQVZhckNvcnJlc3BvbmRlbmNlOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8U3RydWN0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR1hfQVZhclJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGF0YSBmcm9tIHRoZSBzZWdtZW50IGZpZWxkIG9mIGBhdmFyJyB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZXJlIGlzIG9uZSBvZiB0aGVzZSBmb3IgZWFjaCBheGlzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEdYX0FWYXJTZWdtZW50UmVjXwotICB7Ci0gICAgRlRfVVNob3J0ICAgICAgICAgICAgICBwYWlyQ291bnQ7Ci0gICAgR1hfQVZhckNvcnJlc3BvbmRlbmNlICBjb3JyZXNwb25kZW5jZTsgLyogYXJyYXkgd2l0aCBwYWlyQ291bnQgZW50cmllcyAqLwotCi0gIH0gR1hfQVZhclNlZ21lbnRSZWMsICpHWF9BVmFyU2VnbWVudDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFN0cnVjdD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdYX0JsZW5kUmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERhdGEgZm9yIGludGVycG9sYXRpbmcgYSBmb250IGZyb20gYSBkaXN0b3J0YWJsZSBmb250IHNwZWNpZmllZCAgICAqLwotICAvKiAgICBieSB0aGUgR1ggKnZhciB0YWJsZXMgKFtmZ2NhXXZhcikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGaWVsZHM+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fYXhpcyAgICAgICAgIDo6IFRoZSBudW1iZXIgb2YgYXhlcyBhbG9uZyB3aGljaCBpbnRlcnBvbGF0aW9uICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGhhcHBlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBub3JtYWxpemVkY29vcmRzIDo6IEEgbm9ybWFsaXplZCB2YWx1ZSAoYmV0d2VlbiBbLTEsMV0pIGluZGljYXRpbmcgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29udHJpYnV0aW9uIGFsb25nIGVhY2ggYXhpcyB0byB0aGUgZmluYWwgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJwb2xhdGVkIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIEdYX0JsZW5kUmVjXwotICB7Ci0gICAgRlRfVUludCAgICAgICAgIG51bV9heGlzOwotICAgIEZUX0ZpeGVkKiAgICAgICBub3JtYWxpemVkY29vcmRzOwotCi0gICAgRlRfTU1fVmFyKiAgICAgIG1tdmFyOwotICAgIEZUX09mZnNldCAgICAgICBtbXZhcl9sZW47Ci0KLSAgICBGVF9Cb29sICAgICAgICAgYXZhcl9jaGVja2VkOwotICAgIEdYX0FWYXJTZWdtZW50ICBhdmFyX3NlZ21lbnQ7Ci0KLSAgICBGVF9VSW50ICAgICAgICAgdHVwbGVjb3VudDsgICAgICAvKiBzaGFyZWQgdHVwbGVzIGluIGBndmFyJyAgICAgICAgICAgKi8KLSAgICBGVF9GaXhlZCogICAgICAgdHVwbGVjb29yZHM7ICAgICAvKiB0dXBsZWNvb3Jkc1t0dXBsZWNvdW50XVtudW1fYXhpc10gKi8KLQotICAgIEZUX1VJbnQgICAgICAgICBndl9nbHlwaGNudDsKLSAgICBGVF9VTG9uZyogICAgICAgZ2x5cGhvZmZzZXRzOwotCi0gIH0gR1hfQmxlbmRSZWM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxlbnVtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHWF9UdXBsZUNvdW50RmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGbGFncyB1c2VkIHdpdGhpbiB0aGUgYFR1cGxlQ291bnQnIGZpZWxkIG9mIHRoZSBgZ3ZhcicgdGFibGUuICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZW51bSAgR1hfVHVwbGVDb3VudEZsYWdzXwotICB7Ci0gICAgR1hfVENfVFVQTEVTX1NIQVJFX1BPSU5UX05VTUJFUlMgPSAweDgwMDAsCi0gICAgR1hfVENfUkVTRVJWRURfVFVQTEVfRkxBR1MgICAgICAgPSAweDcwMDAsCi0gICAgR1hfVENfVFVQTEVfQ09VTlRfTUFTSyAgICAgICAgICAgPSAweDBGRkYKLQotICB9IEdYX1R1cGxlQ291bnRGbGFnczsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPGVudW0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEdYX1R1cGxlSW5kZXhGbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZsYWdzIHVzZWQgd2l0aGluIHRoZSBgVHVwbGVJbmRleCcgZmllbGQgb2YgdGhlIGBndmFyJyBhbmQgYGN2YXInICAqLwotICAvKiAgICB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZW51bSAgR1hfVHVwbGVJbmRleEZsYWdzXwotICB7Ci0gICAgR1hfVElfRU1CRURERURfVFVQTEVfQ09PUkQgID0gMHg4MDAwLAotICAgIEdYX1RJX0lOVEVSTUVESUFURV9UVVBMRSAgICA9IDB4NDAwMCwKLSAgICBHWF9USV9QUklWQVRFX1BPSU5UX05VTUJFUlMgPSAweDIwMDAsCi0gICAgR1hfVElfUkVTRVJWRURfVFVQTEVfRkxBRyAgID0gMHgxMDAwLAotICAgIEdYX1RJX1RVUExFX0lOREVYX01BU0sgICAgICA9IDB4MEZGRgotCi0gIH0gR1hfVHVwbGVJbmRleEZsYWdzOwotCi0KLSNkZWZpbmUgVFRBR193Z2h0ICBGVF9NQUtFX1RBRyggJ3cnLCAnZycsICdoJywgJ3QnICkKLSNkZWZpbmUgVFRBR193ZHRoICBGVF9NQUtFX1RBRyggJ3cnLCAnZCcsICd0JywgJ2gnICkKLSNkZWZpbmUgVFRBR19vcHN6ICBGVF9NQUtFX1RBRyggJ28nLCAncCcsICdzJywgJ3onICkKLSNkZWZpbmUgVFRBR19zbG50ICBGVF9NQUtFX1RBRyggJ3MnLCAnbCcsICduJywgJ3QnICkKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFRUX1NldF9NTV9CbGVuZCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFRUX1NldF9WYXJfRGVzaWduKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIG51bV9jb29yZHMsCi0gICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFRUX0dldF9NTV9WYXIoIFRUX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICBGVF9NTV9WYXIqICAqbWFzdGVyICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX3ZhcnlfY3Z0KCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBUVF9WYXJ5X0FwcGx5X0dseXBoX0RlbHRhcyggVFRfRmFjZSAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9PdXRsaW5lKiAgb3V0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICBuX3BvaW50cyApOwotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0dF9kb25lX2JsZW5kKCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgR1hfQmxlbmQgICBibGVuZCApOwotCi0KLUZUX0VORF9IRUFERVIKLQotCi0jZW5kaWYgLyogX19UVEdYVkFSX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0aW50ZXJwLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUyYTgyYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRpbnRlcnAuYworKysgL2Rldi9udWxsCkBAIC0xLDgyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRpbnRlcnAuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlIGJ5dGVjb2RlIGludGVycHJldGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKiBHcmVnIEhpdGNoY29jayBmcm9tIE1pY3Jvc29mdCBoYXMgaGVscGVkIGEgbG90IGluIHJlc29sdmluZyB1bmNsZWFyICovCi0vKiBpc3N1ZXM7IG1hbnkgdGhhbmtzISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLSNpbmNsdWRlIEZUX1RSSUdPTk9NRVRSWV9ICi0jaW5jbHVkZSBGVF9TWVNURU1fSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfRFJJVkVSX0gKLQotI2luY2x1ZGUgInR0aW50ZXJwLmgiCi0jaW5jbHVkZSAidHRlcnJvcnMuaCIKLSNpbmNsdWRlICJ0dHN1YnBpeC5oIgotCi0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIG1hY3JvIEZUX0NPTVBPTkVOVCBpcyB1c2VkIGluIHRyYWNlIG1vZGUuICBJdCBpcyBhbiBpbXBsaWNpdCAgICAgICovCi0gIC8qIHBhcmFtZXRlciBvZiB0aGUgRlRfVFJBQ0UoKSBhbmQgRlRfRVJST1IoKSBtYWNyb3MsIHVzZWQgdG8gcHJpbnQvbG9nICAqLwotICAvKiBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jdW5kZWYgIEZUX0NPTVBPTkVOVAotI2RlZmluZSBGVF9DT01QT05FTlQgIHRyYWNlX3R0aW50ZXJwCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEluIG9yZGVyIHRvIGRldGVjdCBpbmZpbml0ZSBsb29wcyBpbiB0aGUgY29kZSwgd2Ugc2V0IHVwIGEgY291bnRlciAgICAqLwotICAvKiB3aXRoaW4gdGhlIHJ1biBsb29wLiAgQSBzaW5nbGUgc3Ryb2tlIG9mIGludGVycHJldGF0aW9uIGlzIG5vdyAgICAgICAgKi8KLSAgLyogbGltaXRlZCB0byBhIG1heGltdW0gbnVtYmVyIG9mIG9wY29kZXMgZGVmaW5lZCBiZWxvdy4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBNQVhfUlVOTkFCTEVfT1BDT0RFUyAgMTAwMDAwMEwKLQotCi0jZGVmaW5lIFNVQlBJWEVMX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoICgoVFRfRHJpdmVyKUZUX0ZBQ0VfRFJJVkVSKCBleGMtPmZhY2UgKSktPmludGVycHJldGVyX3ZlcnNpb24gPT0gXAotICAgICAgICAgICAgVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zOCApCi0KLQotI2RlZmluZSBQUk9KRUNUKCB2MSwgdjIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBleGMtPmZ1bmNfcHJvamVjdCggZXhjLCAodjEpLT54IC0gKHYyKS0+eCwgKHYxKS0+eSAtICh2MiktPnkgKQotCi0jZGVmaW5lIERVQUxQUk9KKCB2MSwgdjIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBleGMtPmZ1bmNfZHVhbHByb2ooIGV4YywgKHYxKS0+eCAtICh2MiktPngsICh2MSktPnkgLSAodjIpLT55ICkKLQotI2RlZmluZSBGQVNUX1BST0pFQ1QoIHYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGV4Yy0+ZnVuY19wcm9qZWN0KCBleGMsICh2KS0+eCwgKHYpLT55ICkKLQotI2RlZmluZSBGQVNUX0RVQUxQUk9KKCB2ICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBleGMtPmZ1bmNfZHVhbHByb2ooIGV4YywgKHYpLT54LCAodiktPnkgKQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJbnN0cnVjdGlvbiBkaXNwYXRjaCBmdW5jdGlvbiwgYXMgdXNlZCBieSB0aGUgaW50ZXJwcmV0ZXIuICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgdm9pZCAgKCpUSW5zdHJ1Y3Rpb25fRnVuY3Rpb24pKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVHdvIHNpbXBsZSBib3VuZHMtY2hlY2tpbmcgbWFjcm9zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBCT1VORFMoIHgsIG4gKSAgICggKEZUX1VJbnQpKHgpICA+PSAoRlRfVUludCkobikgICkKLSNkZWZpbmUgQk9VTkRTTCggeCwgbiApICAoIChGVF9VTG9uZykoeCkgPj0gKEZUX1VMb25nKShuKSApCi0KLQotI3VuZGVmICBTVUNDRVNTCi0jZGVmaW5lIFNVQ0NFU1MgIDAKLQotI3VuZGVmICBGQUlMVVJFCi0jZGVmaW5lIEZBSUxVUkUgIDEKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCi0jZGVmaW5lIEdVRVNTX1ZFQ1RPUiggViApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCBleGMtPmZhY2UtPnVucGF0ZW50ZWRfaGludGluZyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGV4Yy0+R1MuVi54ID0gKEZUX0YyRG90MTQpKCBleGMtPkdTLmJvdGhfeF9heGlzID8gMHg0MDAwIDogMCApOyBcCi0gICAgICBleGMtPkdTLlYueSA9IChGVF9GMkRvdDE0KSggZXhjLT5HUy5ib3RoX3hfYXhpcyA/IDAgOiAweDQwMDAgKTsgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIEdVRVNTX1ZFQ1RPUiggViApICBkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICBDT0RFUkFOR0UgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0dvdG9fQ29kZVJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFN3aXRjaGVzIHRvIGEgbmV3IGNvZGUgcmFuZ2UgKHVwZGF0ZXMgdGhlIGNvZGUgcmVsYXRlZCBlbGVtZW50cyBpbiAqLwotICAvKiAgICBgZXhlYycsIGFuZCBgSVAnKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICByYW5nZSA6OiBUaGUgbmV3IGV4ZWN1dGlvbiBjb2RlIHJhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIElQICAgIDo6IFRoZSBuZXcgSVAgaW4gdGhlIG5ldyBjb2RlIHJhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4ZWMgIDo6IFRoZSB0YXJnZXQgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgVFRfR290b19Db2RlUmFuZ2UoIFRUX0V4ZWNDb250ZXh0ICBleGVjLAotICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgIHJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyAgICAgICAgIElQICkKLSAgewotICAgIFRUX0NvZGVSYW5nZSogIGNvZGVyYW5nZTsKLQotCi0gICAgRlRfQVNTRVJUKCByYW5nZSA+PSAxICYmIHJhbmdlIDw9IDMgKTsKLQotICAgIGNvZGVyYW5nZSA9ICZleGVjLT5jb2RlUmFuZ2VUYWJsZVtyYW5nZSAtIDFdOwotCi0gICAgRlRfQVNTRVJUKCBjb2RlcmFuZ2UtPmJhc2UgIT0gTlVMTCApOwotCi0gICAgLyogTk9URTogQmVjYXVzZSB0aGUgbGFzdCBpbnN0cnVjdGlvbiBvZiBhIHByb2dyYW0gbWF5IGJlIGEgQ0FMTCAqLwotICAgIC8qICAgICAgIHdoaWNoIHdpbGwgcmV0dXJuIHRvIHRoZSBmaXJzdCBieXRlICphZnRlciogdGhlIGNvZGUgICAgKi8KLSAgICAvKiAgICAgICByYW5nZSwgd2UgdGVzdCBmb3IgSVAgPD0gU2l6ZSBpbnN0ZWFkIG9mIElQIDwgU2l6ZS4gICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIEZUX0FTU0VSVCggSVAgPD0gY29kZXJhbmdlLT5zaXplICk7Ci0KLSAgICBleGVjLT5jb2RlICAgICA9IGNvZGVyYW5nZS0+YmFzZTsKLSAgICBleGVjLT5jb2RlU2l6ZSA9IGNvZGVyYW5nZS0+c2l6ZTsKLSAgICBleGVjLT5JUCAgICAgICA9IElQOwotICAgIGV4ZWMtPmN1clJhbmdlID0gcmFuZ2U7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NldF9Db2RlUmFuZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNldHMgYSBjb2RlIHJhbmdlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhbmdlICA6OiBUaGUgY29kZSByYW5nZSBpbmRleC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzZSAgIDo6IFRoZSBuZXcgY29kZSBiYXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZW5ndGggOjogVGhlIHJhbmdlIHNpemUgaW4gYnl0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBleGVjICAgOjogVGhlIHRhcmdldCBleGVjdXRpb24gY29udGV4dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIFRUX1NldF9Db2RlUmFuZ2UoIFRUX0V4ZWNDb250ZXh0ICBleGVjLAotICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICBiYXNlLAotICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICAgbGVuZ3RoICkKLSAgewotICAgIEZUX0FTU0VSVCggcmFuZ2UgPj0gMSAmJiByYW5nZSA8PSAzICk7Ci0KLSAgICBleGVjLT5jb2RlUmFuZ2VUYWJsZVtyYW5nZSAtIDFdLmJhc2UgPSAoRlRfQnl0ZSopYmFzZTsKLSAgICBleGVjLT5jb2RlUmFuZ2VUYWJsZVtyYW5nZSAtIDFdLnNpemUgPSBsZW5ndGg7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0NsZWFyX0NvZGVSYW5nZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENsZWFycyBhIGNvZGUgcmFuZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJhbmdlIDo6IFRoZSBjb2RlIHJhbmdlIGluZGV4LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4ZWMgIDo6IFRoZSB0YXJnZXQgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgVFRfQ2xlYXJfQ29kZVJhbmdlKCBUVF9FeGVjQ29udGV4dCAgZXhlYywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgcmFuZ2UgKQotICB7Ci0gICAgRlRfQVNTRVJUKCByYW5nZSA+PSAxICYmIHJhbmdlIDw9IDMgKTsKLQotICAgIGV4ZWMtPmNvZGVSYW5nZVRhYmxlW3JhbmdlIC0gMV0uYmFzZSA9IE5VTEw7Ci0gICAgZXhlYy0+Y29kZVJhbmdlVGFibGVbcmFuZ2UgLSAxXS5zaXplID0gMDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBFWEVDVVRJT04gQ09OVEVYVCBST1VUSU5FUyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfRG9uZV9Db250ZXh0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGVzdHJveXMgYSBnaXZlbiBjb250ZXh0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZXhlYyAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtZW1vcnkgOjogQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBPbmx5IHRoZSBnbHlwaCBsb2FkZXIgYW5kIGRlYnVnZ2VyIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24uICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIFRUX0RvbmVfQ29udGV4dCggVFRfRXhlY0NvbnRleHQgIGV4ZWMgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBleGVjLT5tZW1vcnk7Ci0KLQotICAgIC8qIHBvaW50cyB6b25lICovCi0gICAgZXhlYy0+bWF4UG9pbnRzICAgPSAwOwotICAgIGV4ZWMtPm1heENvbnRvdXJzID0gMDsKLQotICAgIC8qIGZyZWUgc3RhY2sgKi8KLSAgICBGVF9GUkVFKCBleGVjLT5zdGFjayApOwotICAgIGV4ZWMtPnN0YWNrU2l6ZSA9IDA7Ci0KLSAgICAvKiBmcmVlIGNhbGwgc3RhY2sgKi8KLSAgICBGVF9GUkVFKCBleGVjLT5jYWxsU3RhY2sgKTsKLSAgICBleGVjLT5jYWxsU2l6ZSA9IDA7Ci0gICAgZXhlYy0+Y2FsbFRvcCAgPSAwOwotCi0gICAgLyogZnJlZSBnbHlwaCBjb2RlIHJhbmdlICovCi0gICAgRlRfRlJFRSggZXhlYy0+Z2x5cGhJbnMgKTsKLSAgICBleGVjLT5nbHlwaFNpemUgPSAwOwotCi0gICAgZXhlYy0+c2l6ZSA9IE5VTEw7Ci0gICAgZXhlYy0+ZmFjZSA9IE5VTEw7Ci0KLSAgICBGVF9GUkVFKCBleGVjICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRpYWxpemVzIGEgY29udGV4dCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSA6OiBBIGhhbmRsZSB0byB0aGUgcGFyZW50IG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4ZWMgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGV4ZWN1dGlvbiBjb250ZXh0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIEluaXRfQ29udGV4dCggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCi0gICAgICAgICAgICAgICAgRlRfTWVtb3J5ICAgICAgIG1lbW9yeSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIEZUX1RSQUNFMSgoICJJbml0X0NvbnRleHQ6IG5ldyBvYmplY3QgYXQgMHglMDhwXG4iLCBleGVjICkpOwotCi0gICAgZXhlYy0+bWVtb3J5ICAgPSBtZW1vcnk7Ci0gICAgZXhlYy0+Y2FsbFNpemUgPSAzMjsKLQotICAgIGlmICggRlRfTkVXX0FSUkFZKCBleGVjLT5jYWxsU3RhY2ssIGV4ZWMtPmNhbGxTaXplICkgKQotICAgICAgZ290byBGYWlsX01lbW9yeTsKLQotICAgIC8qIGFsbCB2YWx1ZXMgaW4gdGhlIGNvbnRleHQgYXJlIHNldCB0byAwIGFscmVhZHksIGJ1dCB0aGlzIGlzICovCi0gICAgLyogaGVyZSBhcyBhIHJlbWFpbmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBleGVjLT5tYXhQb2ludHMgICA9IDA7Ci0gICAgZXhlYy0+bWF4Q29udG91cnMgPSAwOwotCi0gICAgZXhlYy0+c3RhY2tTaXplID0gMDsKLSAgICBleGVjLT5nbHlwaFNpemUgPSAwOwotCi0gICAgZXhlYy0+c3RhY2sgICAgID0gTlVMTDsKLSAgICBleGVjLT5nbHlwaElucyAgPSBOVUxMOwotCi0gICAgZXhlYy0+ZmFjZSA9IE5VTEw7Ci0gICAgZXhlYy0+c2l6ZSA9IE5VTEw7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotCi0gIEZhaWxfTWVtb3J5OgotICAgIEZUX0VSUk9SKCggIkluaXRfQ29udGV4dDogbm90IGVub3VnaCBtZW1vcnkgZm9yICVwXG4iLCBleGVjICkpOwotICAgIFRUX0RvbmVfQ29udGV4dCggZXhlYyApOwotCi0gICAgcmV0dXJuIGVycm9yOwotIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFVwZGF0ZV9NYXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENoZWNrcyB0aGUgc2l6ZSBvZiBhIGJ1ZmZlciBhbmQgcmVhbGxvY2F0ZXMgaXQgaWYgbmVjZXNzYXJ5LiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHBhcmVudCBtZW1vcnkgb2JqZWN0LiAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbXVsdGlwbGllciA6OiBUaGUgc2l6ZSBpbiBieXRlcyBvZiBlYWNoIGVsZW1lbnQgaW4gdGhlIGJ1ZmZlci4gICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBuZXdfbWF4ICAgIDo6IFRoZSBuZXcgY2FwYWNpdHkgKHNpemUpIG9mIHRoZSBidWZmZXIuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgICAgIDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBidWZmZXIncyBjdXJyZW50IHNpemUgZXhwcmVzc2VkICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBpbiBlbGVtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBidWZmICAgICAgIDo6IFRoZSBhZGRyZXNzIG9mIHRoZSBidWZmZXIgYmFzZSBwb2ludGVyLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBVcGRhdGVfTWF4KCBGVF9NZW1vcnkgIG1lbW9yeSwKLSAgICAgICAgICAgICAgRlRfVUxvbmcqICBzaXplLAotICAgICAgICAgICAgICBGVF9VTG9uZyAgIG11bHRpcGxpZXIsCi0gICAgICAgICAgICAgIHZvaWQqICAgICAgX3BidWZmLAotICAgICAgICAgICAgICBGVF9VTG9uZyAgIG5ld19tYXggKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotICAgIHZvaWQqKiAgICBwYnVmZiA9ICh2b2lkKiopX3BidWZmOwotCi0KLSAgICBpZiAoICpzaXplIDwgbmV3X21heCApCi0gICAgewotICAgICAgaWYgKCBGVF9SRUFMTE9DKCAqcGJ1ZmYsICpzaXplICogbXVsdGlwbGllciwgbmV3X21heCAqIG11bHRpcGxpZXIgKSApCi0gICAgICAgIHJldHVybiBlcnJvcjsKLSAgICAgICpzaXplID0gbmV3X21heDsKLSAgICB9Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9Mb2FkX0NvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBQcmVwYXJlIGFuIGV4ZWN1dGlvbiBjb250ZXh0IGZvciBnbHlwaCBoaW50aW5nLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlIDo6IEEgaGFuZGxlIHRvIHRoZSBzb3VyY2UgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4ZWMgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBleGVjdXRpb24gY29udGV4dC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9ubHkgdGhlIGdseXBoIGxvYWRlciBhbmQgZGVidWdnZXIgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbi4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIFRUX0xvYWRfQ29udGV4dCggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCi0gICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgVFRfU2l6ZSAgICAgICAgIHNpemUgKQotICB7Ci0gICAgRlRfSW50ICAgICAgICAgIGk7Ci0gICAgRlRfVUxvbmcgICAgICAgIHRtcDsKLSAgICBUVF9NYXhQcm9maWxlKiAgbWF4cDsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0KLQotICAgIGV4ZWMtPmZhY2UgPSBmYWNlOwotICAgIG1heHAgICAgICAgPSAmZmFjZS0+bWF4X3Byb2ZpbGU7Ci0gICAgZXhlYy0+c2l6ZSA9IHNpemU7Ci0KLSAgICBpZiAoIHNpemUgKQotICAgIHsKLSAgICAgIGV4ZWMtPm51bUZEZWZzICAgPSBzaXplLT5udW1fZnVuY3Rpb25fZGVmczsKLSAgICAgIGV4ZWMtPm1heEZEZWZzICAgPSBzaXplLT5tYXhfZnVuY3Rpb25fZGVmczsKLSAgICAgIGV4ZWMtPm51bUlEZWZzICAgPSBzaXplLT5udW1faW5zdHJ1Y3Rpb25fZGVmczsKLSAgICAgIGV4ZWMtPm1heElEZWZzICAgPSBzaXplLT5tYXhfaW5zdHJ1Y3Rpb25fZGVmczsKLSAgICAgIGV4ZWMtPkZEZWZzICAgICAgPSBzaXplLT5mdW5jdGlvbl9kZWZzOwotICAgICAgZXhlYy0+SURlZnMgICAgICA9IHNpemUtPmluc3RydWN0aW9uX2RlZnM7Ci0gICAgICBleGVjLT50dF9tZXRyaWNzID0gc2l6ZS0+dHRtZXRyaWNzOwotICAgICAgZXhlYy0+bWV0cmljcyAgICA9IHNpemUtPm1ldHJpY3M7Ci0KLSAgICAgIGV4ZWMtPm1heEZ1bmMgICAgPSBzaXplLT5tYXhfZnVuYzsKLSAgICAgIGV4ZWMtPm1heElucyAgICAgPSBzaXplLT5tYXhfaW5zOwotCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IFRUX01BWF9DT0RFX1JBTkdFUzsgaSsrICkKLSAgICAgICAgZXhlYy0+Y29kZVJhbmdlVGFibGVbaV0gPSBzaXplLT5jb2RlUmFuZ2VUYWJsZVtpXTsKLQotICAgICAgLyogc2V0IGdyYXBoaWNzIHN0YXRlICovCi0gICAgICBleGVjLT5HUyA9IHNpemUtPkdTOwotCi0gICAgICBleGVjLT5jdnRTaXplID0gc2l6ZS0+Y3Z0X3NpemU7Ci0gICAgICBleGVjLT5jdnQgICAgID0gc2l6ZS0+Y3Z0OwotCi0gICAgICBleGVjLT5zdG9yZVNpemUgPSBzaXplLT5zdG9yYWdlX3NpemU7Ci0gICAgICBleGVjLT5zdG9yYWdlICAgPSBzaXplLT5zdG9yYWdlOwotCi0gICAgICBleGVjLT50d2lsaWdodCAgPSBzaXplLT50d2lsaWdodDsKLQotICAgICAgLyogSW4gY2FzZSBvZiBtdWx0aS10aHJlYWRpbmcgaXQgY2FuIGhhcHBlbiB0aGF0IHRoZSBvbGQgc2l6ZSBvYmplY3QgKi8KLSAgICAgIC8qIG5vIGxvbmdlciBleGlzdHMsIHRodXMgd2UgbXVzdCBjbGVhciBhbGwgZ2x5cGggem9uZSByZWZlcmVuY2VzLiAgICovCi0gICAgICBmdF9tZW1zZXQoICZleGVjLT56cDAsIDAsIHNpemVvZiAoIGV4ZWMtPnpwMCApICk7Ci0gICAgICBleGVjLT56cDEgPSBleGVjLT56cDA7Ci0gICAgICBleGVjLT56cDIgPSBleGVjLT56cDA7Ci0gICAgfQotCi0gICAgLyogWFhYOiBXZSByZXNlcnZlIGEgbGl0dGxlIG1vcmUgZWxlbWVudHMgb24gdGhlIHN0YWNrIHRvIGRlYWwgc2FmZWx5ICovCi0gICAgLyogICAgICB3aXRoIGJyb2tlbiBmb250cyBsaWtlIGFyaWFsYnMsIGNvdXJicywgdGltZXNicywgZXRjLiAgICAgICAgICovCi0gICAgdG1wID0gKEZUX1VMb25nKWV4ZWMtPnN0YWNrU2l6ZTsKLSAgICBlcnJvciA9IFVwZGF0ZV9NYXgoIGV4ZWMtPm1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ0bXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YgKCBGVF9GMjZEb3Q2ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopJmV4ZWMtPnN0YWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgbWF4cC0+bWF4U3RhY2tFbGVtZW50cyArIDMyICk7Ci0gICAgZXhlYy0+c3RhY2tTaXplID0gKEZUX0xvbmcpdG1wOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgdG1wID0gZXhlYy0+Z2x5cGhTaXplOwotICAgIGVycm9yID0gVXBkYXRlX01heCggZXhlYy0+bWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgJnRtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiAoIEZUX0J5dGUgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikmZXhlYy0+Z2x5cGhJbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXhwLT5tYXhTaXplT2ZJbnN0cnVjdGlvbnMgKTsKLSAgICBleGVjLT5nbHlwaFNpemUgPSAoRlRfVVNob3J0KXRtcDsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGV4ZWMtPnB0cy5uX3BvaW50cyAgID0gMDsKLSAgICBleGVjLT5wdHMubl9jb250b3VycyA9IDA7Ci0KLSAgICBleGVjLT56cDEgPSBleGVjLT5wdHM7Ci0gICAgZXhlYy0+enAyID0gZXhlYy0+cHRzOwotICAgIGV4ZWMtPnpwMCA9IGV4ZWMtPnB0czsKLQotICAgIGV4ZWMtPmluc3RydWN0aW9uX3RyYXAgPSBGQUxTRTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX1NhdmVfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNhdmVzIHRoZSBjb2RlIHJhbmdlcyBpbiBhIGBzaXplJyBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4ZWMgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBleGVjdXRpb24gY29udGV4dC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9ubHkgdGhlIGdseXBoIGxvYWRlciBhbmQgZGVidWdnZXIgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbi4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgVFRfU2F2ZV9Db250ZXh0KCBUVF9FeGVjQ29udGV4dCAgZXhlYywKLSAgICAgICAgICAgICAgICAgICBUVF9TaXplICAgICAgICAgc2l6ZSApCi0gIHsKLSAgICBGVF9JbnQgIGk7Ci0KLQotICAgIC8qIFhYWDogV2lsbCBwcm9iYWJseSBkaXNhcHBlYXIgc29vbiB3aXRoIGFsbCB0aGUgY29kZSByYW5nZSAqLwotICAgIC8qICAgICAgbWFuYWdlbWVudCwgd2hpY2ggaXMgbm93IHJhdGhlciBvYnNvbGV0ZS4gICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHNpemUtPm51bV9mdW5jdGlvbl9kZWZzICAgID0gZXhlYy0+bnVtRkRlZnM7Ci0gICAgc2l6ZS0+bnVtX2luc3RydWN0aW9uX2RlZnMgPSBleGVjLT5udW1JRGVmczsKLQotICAgIHNpemUtPm1heF9mdW5jID0gZXhlYy0+bWF4RnVuYzsKLSAgICBzaXplLT5tYXhfaW5zICA9IGV4ZWMtPm1heEluczsKLQotICAgIGZvciAoIGkgPSAwOyBpIDwgVFRfTUFYX0NPREVfUkFOR0VTOyBpKysgKQotICAgICAgc2l6ZS0+Y29kZVJhbmdlVGFibGVbaV0gPSBleGVjLT5jb2RlUmFuZ2VUYWJsZVtpXTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfUnVuX0NvbnRleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRXhlY3V0ZXMgb25lIG9yIG1vcmUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBleGVjdXRpb24gY29udGV4dC4gICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGVidWcgOjogQSBCb29sZWFuIGZsYWcuICBJZiBzZXQsIHRoZSBmdW5jdGlvbiBzZXRzIHNvbWUgaW50ZXJuYWwgICovCi0gIC8qICAgICAgICAgICAgIHZhcmlhYmxlcyBhbmQgcmV0dXJucyBpbW1lZGlhdGVseSwgb3RoZXJ3aXNlIFRUX1J1bklucygpICAqLwotICAvKiAgICAgICAgICAgICBpcyBjYWxsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgIFRoaXMgaXMgY29tbWVudGVkIG91dCBjdXJyZW50bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4ZWMgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZXhlY3V0aW9uIGNvbnRleHQuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRydWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIFRUX1J1bl9Db250ZXh0KCBUVF9FeGVjQ29udGV4dCAgZXhlYyApCi0gIHsKLSAgICBUVF9Hb3RvX0NvZGVSYW5nZSggZXhlYywgdHRfY29kZXJhbmdlX2dseXBoLCAwICk7Ci0KLSAgICBleGVjLT56cDAgPSBleGVjLT5wdHM7Ci0gICAgZXhlYy0+enAxID0gZXhlYy0+cHRzOwotICAgIGV4ZWMtPnpwMiA9IGV4ZWMtPnB0czsKLQotICAgIGV4ZWMtPkdTLmdlcDAgPSAxOwotICAgIGV4ZWMtPkdTLmdlcDEgPSAxOwotICAgIGV4ZWMtPkdTLmdlcDIgPSAxOwotCi0gICAgZXhlYy0+R1MucHJvalZlY3Rvci54ID0gMHg0MDAwOwotICAgIGV4ZWMtPkdTLnByb2pWZWN0b3IueSA9IDB4MDAwMDsKLQotICAgIGV4ZWMtPkdTLmZyZWVWZWN0b3IgPSBleGVjLT5HUy5wcm9qVmVjdG9yOwotICAgIGV4ZWMtPkdTLmR1YWxWZWN0b3IgPSBleGVjLT5HUy5wcm9qVmVjdG9yOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSAgICBleGVjLT5HUy5ib3RoX3hfYXhpcyA9IFRSVUU7Ci0jZW5kaWYKLQotICAgIGV4ZWMtPkdTLnJvdW5kX3N0YXRlID0gMTsKLSAgICBleGVjLT5HUy5sb29wICAgICAgICA9IDE7Ci0KLSAgICAvKiBzb21lIGdseXBocyBsZWF2ZSBzb21ldGhpbmcgb24gdGhlIHN0YWNrLiBzbyB3ZSBjbGVhbiBpdCAqLwotICAgIC8qIGJlZm9yZSBhIG5ldyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZXhlYy0+dG9wICAgICA9IDA7Ci0gICAgZXhlYy0+Y2FsbFRvcCA9IDA7Ci0KLSAgICByZXR1cm4gZXhlYy0+ZmFjZS0+aW50ZXJwcmV0ZXIoIGV4ZWMgKTsKLSAgfQotCi0KLSAgLyogVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGBzY2FuX2NvbnRyb2wnIGlzIGRvY3VtZW50ZWQgYXMgRkFMU0UgaW4gdGhlICovCi0gIC8qIFRydWVUeXBlIHNwZWNpZmljYXRpb24uICBUaGlzIGlzIGNvbmZ1c2luZyBzaW5jZSBpdCBpbXBsaWVzIGEgICAgICAqLwotICAvKiBCb29sZWFuIHZhbHVlLiAgSG93ZXZlciwgdGhpcyBpcyBub3QgdGhlIGNhc2UsIHRodXMgYm90aCB0aGUgICAgICAgKi8KLSAgLyogZGVmYXVsdCB2YWx1ZXMgb2Ygb3VyIGBzY2FuX3R5cGUnIGFuZCBgc2Nhbl9jb250cm9sJyBmaWVsZHMgKHdoaWNoICovCi0gIC8qIHRoZSBkb2N1bWVudGF0aW9uJ3MgYHNjYW5fY29udHJvbCcgdmFyaWFibGUgaXMgc3BsaXQgaW50bykgYXJlICAgICAqLwotICAvKiB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBjb25zdCBUVF9HcmFwaGljc1N0YXRlICB0dF9kZWZhdWx0X2dyYXBoaWNzX3N0YXRlID0KLSAgewotICAgIDAsIDAsIDAsCi0gICAgeyAweDQwMDAsIDAgfSwKLSAgICB7IDB4NDAwMCwgMCB9LAotICAgIHsgMHg0MDAwLCAwIH0sCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORwotICAgIFRSVUUsCi0jZW5kaWYKLQotICAgIDEsIDY0LCAxLAotICAgIFRSVUUsIDY4LCAwLCAwLCA5LCAzLAotICAgIDAsIEZBTFNFLCAwLCAxLCAxLCAxCi0gIH07Ci0KLQotICAvKiBkb2N1bWVudGF0aW9uIGlzIGluIHR0aW50ZXJwLmggKi8KLQotICBGVF9FWFBPUlRfREVGKCBUVF9FeGVjQ29udGV4dCApCi0gIFRUX05ld19Db250ZXh0KCBUVF9Ecml2ZXIgIGRyaXZlciApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLSAgICBGVF9FcnJvciAgIGVycm9yOwotCi0gICAgVFRfRXhlY0NvbnRleHQgIGV4ZWMgPSBOVUxMOwotCi0KLSAgICBpZiAoICFkcml2ZXIgKQotICAgICAgZ290byBGYWlsOwotCi0gICAgbWVtb3J5ID0gZHJpdmVyLT5yb290LnJvb3QubWVtb3J5OwotCi0gICAgLyogYWxsb2NhdGUgb2JqZWN0ICovCi0gICAgaWYgKCBGVF9ORVcoIGV4ZWMgKSApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICAvKiBpbml0aWFsaXplIGl0OyBpbiBjYXNlIG9mIGVycm9yIHRoaXMgZGVhbGxvY2F0ZXMgYGV4ZWMnIHRvbyAqLwotICAgIGVycm9yID0gSW5pdF9Db250ZXh0KCBleGVjLCBtZW1vcnkgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIHJldHVybiBleGVjOwotCi0gIEZhaWw6Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQmVmb3JlIGFuIG9wY29kZSBpcyBleGVjdXRlZCwgdGhlIGludGVycHJldGVyIHZlcmlmaWVzIHRoYXQgdGhlcmUgYXJlICovCi0gIC8qIGVub3VnaCBhcmd1bWVudHMgb24gdGhlIHN0YWNrLCB3aXRoIHRoZSBoZWxwIG9mIHRoZSBgUG9wX1B1c2hfQ291bnQnICAqLwotICAvKiB0YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZvciBlYWNoIG9wY29kZSwgdGhlIGZpcnN0IGNvbHVtbiBnaXZlcyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0aGF0ICAqLwotICAvKiBhcmUgcG9wcGVkIGZyb20gdGhlIHN0YWNrOyB0aGUgc2Vjb25kIG9uZSBnaXZlcyB0aGUgbnVtYmVyIG9mIHRob3NlICAgKi8KLSAgLyogdGhhdCBhcmUgcHVzaGVkIGluIHJlc3VsdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGVzIHdoaWNoIGhhdmUgYSB2YXJ5aW5nIG51bWJlciBvZiBwYXJhbWV0ZXJzIGluIHRoZSBkYXRhIHN0cmVhbSAgKi8KLSAgLyogKE5QVVNIQiwgTlBVU0hXKSBhcmUgaGFuZGxlZCBzcGVjaWFsbHk7IHRoZXkgaGF2ZSBhIG5lZ2F0aXZlIHZhbHVlIGluICovCi0gIC8qIHRoZSBgb3Bjb2RlX2xlbmd0aCcgdGFibGUsIGFuZCB0aGUgdmFsdWUgaW4gYFBvcF9QdXNoX0NvdW50JyBpcyBzZXQgICAqLwotICAvKiB0byB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSN1bmRlZiAgUEFDSwotI2RlZmluZSBQQUNLKCB4LCB5ICkgICggKCB4IDw8IDQgKSB8IHkgKQotCi0KLSAgc3RhdGljCi0gIGNvbnN0IEZUX0J5dGUgIFBvcF9QdXNoX0NvdW50WzI1Nl0gPQotICB7Ci0gICAgLyogb3Bjb2RlcyBhcmUgZ2F0aGVyZWQgaW4gZ3JvdXBzIG9mIDE2ICovCi0gICAgLyogcGxlYXNlIGtlZXAgdGhlIHNwYWNlcyBhcyB0aGV5IGFyZSAgICovCi0KLSAgICAvKiAgU1ZUQ0EgIHkgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIFNWVENBICB4ICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBTUHZUQ0EgeSAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgU1B2VENBIHggICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIFNGdlRDQSB5ICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBTRnZUQ0EgeCAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgU1B2VEwgLy8gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIFNQdlRMICsgICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBTRnZUTCAvLyAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgU0Z2VEwgKyAgICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIFNQdkZTICAgICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBTRnZGUyAgICAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgR1B2ICAgICAgICovICBQQUNLKCAwLCAyICksCi0gICAgLyogIEdGdiAgICAgICAqLyAgUEFDSyggMCwgMiApLAotICAgIC8qICBTRnZUUHYgICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSVNFQ1QgICAgICovICBQQUNLKCA1LCAwICksCi0KLSAgICAvKiAgU1JQMCAgICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIFNSUDEgICAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBTUlAyICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU1pQMCAgICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIFNaUDEgICAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBTWlAyICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU1pQUyAgICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIFNMT09QICAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBSVEcgICAgICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgUlRIRyAgICAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIFNNRCAgICAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBFTFNFICAgICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSk1QUiAgICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIFNDdlRDaSAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBTU3dDaSAgICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU1NXICAgICAgICovICBQQUNLKCAxLCAwICksCi0KLSAgICAvKiAgRFVQICAgICAgICovICBQQUNLKCAxLCAyICksCi0gICAgLyogIFBPUCAgICAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBDTEVBUiAgICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgU1dBUCAgICAgICovICBQQUNLKCAyLCAyICksCi0gICAgLyogIERFUFRIICAgICAqLyAgUEFDSyggMCwgMSApLAotICAgIC8qICBDSU5ERVggICAgKi8gIFBBQ0soIDEsIDEgKSwKLSAgICAvKiAgTUlOREVYICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIEFsaWduUFRTICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBJTlNfJDI4ICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgVVRQICAgICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIExPT1BDQUxMICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBDQUxMICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgRkRFRiAgICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIEVOREYgICAgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBNREFQWzBdICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURBUFsxXSAgICovICBQQUNLKCAxLCAwICksCi0KLSAgICAvKiAgSVVQWzBdICAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIElVUFsxXSAgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBTSFBbMF0gICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgU0hQWzFdICAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIFNIQ1swXSAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBTSENbMV0gICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU0haWzBdICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIFNIWlsxXSAgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBTSFBJWCAgICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgSVAgICAgICAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIE1TSVJQWzBdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNU0lSUFsxXSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgQWxpZ25SUCAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIFJUREcgICAgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBNSUFQWzBdICAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlBUFsxXSAgICovICBQQUNLKCAyLCAwICksCi0KLSAgICAvKiAgTlB1c2hCICAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIE5QdXNoVyAgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBXUyAgICAgICAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgUlMgICAgICAgICovICBQQUNLKCAxLCAxICksCi0gICAgLyogIFdDdnRQICAgICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBSQ3Z0ICAgICAgKi8gIFBBQ0soIDEsIDEgKSwKLSAgICAvKiAgR0NbMF0gICAgICovICBQQUNLKCAxLCAxICksCi0gICAgLyogIEdDWzFdICAgICAqLyAgUEFDSyggMSwgMSApLAotICAgIC8qICBTQ0ZTICAgICAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTURbMF0gICAgICovICBQQUNLKCAyLCAxICksCi0gICAgLyogIE1EWzFdICAgICAqLyAgUEFDSyggMiwgMSApLAotICAgIC8qICBNUFBFTSAgICAgKi8gIFBBQ0soIDAsIDEgKSwKLSAgICAvKiAgTVBTICAgICAgICovICBQQUNLKCAwLCAxICksCi0gICAgLyogIEZsaXBPTiAgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBGbGlwT0ZGICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgREVCVUcgICAgICovICBQQUNLKCAxLCAwICksCi0KLSAgICAvKiAgTFQgICAgICAgICovICBQQUNLKCAyLCAxICksCi0gICAgLyogIExURVEgICAgICAqLyAgUEFDSyggMiwgMSApLAotICAgIC8qICBHVCAgICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKLSAgICAvKiAgR1RFUSAgICAgICovICBQQUNLKCAyLCAxICksCi0gICAgLyogIEVRICAgICAgICAqLyAgUEFDSyggMiwgMSApLAotICAgIC8qICBORVEgICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKLSAgICAvKiAgT0REICAgICAgICovICBQQUNLKCAxLCAxICksCi0gICAgLyogIEVWRU4gICAgICAqLyAgUEFDSyggMSwgMSApLAotICAgIC8qICBJRiAgICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgRUlGICAgICAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIEFORCAgICAgICAqLyAgUEFDSyggMiwgMSApLAotICAgIC8qICBPUiAgICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKLSAgICAvKiAgTk9UICAgICAgICovICBQQUNLKCAxLCAxICksCi0gICAgLyogIERlbHRhUDEgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBTREIgICAgICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU0RTICAgICAgICovICBQQUNLKCAxLCAwICksCi0KLSAgICAvKiAgQUREICAgICAgICovICBQQUNLKCAyLCAxICksCi0gICAgLyogIFNVQiAgICAgICAqLyAgUEFDSyggMiwgMSApLAotICAgIC8qICBESVYgICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKLSAgICAvKiAgTVVMICAgICAgICovICBQQUNLKCAyLCAxICksCi0gICAgLyogIEFCUyAgICAgICAqLyAgUEFDSyggMSwgMSApLAotICAgIC8qICBORUcgICAgICAgKi8gIFBBQ0soIDEsIDEgKSwKLSAgICAvKiAgRkxPT1IgICAgICovICBQQUNLKCAxLCAxICksCi0gICAgLyogIENFSUxJTkcgICAqLyAgUEFDSyggMSwgMSApLAotICAgIC8qICBST1VORFswXSAgKi8gIFBBQ0soIDEsIDEgKSwKLSAgICAvKiAgUk9VTkRbMV0gICovICBQQUNLKCAxLCAxICksCi0gICAgLyogIFJPVU5EWzJdICAqLyAgUEFDSyggMSwgMSApLAotICAgIC8qICBST1VORFszXSAgKi8gIFBBQ0soIDEsIDEgKSwKLSAgICAvKiAgTlJPVU5EWzBdICovICBQQUNLKCAxLCAxICksCi0gICAgLyogIE5ST1VORFsxXSAqLyAgUEFDSyggMSwgMSApLAotICAgIC8qICBOUk9VTkRbMl0gKi8gIFBBQ0soIDEsIDEgKSwKLSAgICAvKiAgTlJPVU5EWzNdICovICBQQUNLKCAxLCAxICksCi0KLSAgICAvKiAgV0N2dEYgICAgICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIERlbHRhUDIgICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBEZWx0YVAzICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgRGVsdGFDblswXSAqLyBQQUNLKCAxLCAwICksCi0gICAgLyogIERlbHRhQ25bMV0gKi8gUEFDSyggMSwgMCApLAotICAgIC8qICBEZWx0YUNuWzJdICovIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU1JPVU5EICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIFM0NVJvdW5kICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBKUk9UICAgICAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgSlJPRiAgICAgICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIFJPRkYgICAgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJDdCICAgKi8gIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgUlVURyAgICAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIFJEVEcgICAgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBTQU5HVyAgICAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgQUEgICAgICAgICovICBQQUNLKCAxLCAwICksCi0KLSAgICAvKiAgRmxpcFBUICAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIEZsaXBSZ09OICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBGbGlwUmdPRkYgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgSU5TXyQ4MyAgICovICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kODQgICAqLyAgUEFDSyggMCwgMCApLAotICAgIC8qICBTY2FuQ1RSTCAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgU0RQdlRMWzBdICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIFNEUHZUTFsxXSAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBHZXRJTkZPICAgKi8gIFBBQ0soIDEsIDEgKSwKLSAgICAvKiAgSURFRiAgICAgICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIFJPTEwgICAgICAqLyAgUEFDSyggMywgMyApLAotICAgIC8qICBNQVggICAgICAgKi8gIFBBQ0soIDIsIDEgKSwKLSAgICAvKiAgTUlOICAgICAgICovICBQQUNLKCAyLCAxICksCi0gICAgLyogIFNjYW5UWVBFICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBJbnN0Q1RSTCAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgSU5TXyQ4RiAgICovICBQQUNLKCAwLCAwICksCi0KLSAgICAvKiAgSU5TXyQ5MCAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kOTEgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJDkyICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyQ5MyAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kOTQgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJDk1ICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyQ5NiAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kOTcgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJDk4ICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyQ5OSAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kOUEgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJDlCICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyQ5QyAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kOUQgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJDlFICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyQ5RiAgKi8gICBQQUNLKCAwLCAwICksCi0KLSAgICAvKiAgSU5TXyRBMCAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kQTEgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJEEyICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyRBMyAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kQTQgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJEE1ICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyRBNiAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kQTcgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJEE4ICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyRBOSAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kQUEgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJEFCICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyRBQyAgKi8gICBQQUNLKCAwLCAwICksCi0gICAgLyogIElOU18kQUQgICovICAgUEFDSyggMCwgMCApLAotICAgIC8qICBJTlNfJEFFICAqLyAgIFBBQ0soIDAsIDAgKSwKLSAgICAvKiAgSU5TXyRBRiAgKi8gICBQQUNLKCAwLCAwICksCi0KLSAgICAvKiAgUHVzaEJbMF0gICovICBQQUNLKCAwLCAxICksCi0gICAgLyogIFB1c2hCWzFdICAqLyAgUEFDSyggMCwgMiApLAotICAgIC8qICBQdXNoQlsyXSAgKi8gIFBBQ0soIDAsIDMgKSwKLSAgICAvKiAgUHVzaEJbM10gICovICBQQUNLKCAwLCA0ICksCi0gICAgLyogIFB1c2hCWzRdICAqLyAgUEFDSyggMCwgNSApLAotICAgIC8qICBQdXNoQls1XSAgKi8gIFBBQ0soIDAsIDYgKSwKLSAgICAvKiAgUHVzaEJbNl0gICovICBQQUNLKCAwLCA3ICksCi0gICAgLyogIFB1c2hCWzddICAqLyAgUEFDSyggMCwgOCApLAotICAgIC8qICBQdXNoV1swXSAgKi8gIFBBQ0soIDAsIDEgKSwKLSAgICAvKiAgUHVzaFdbMV0gICovICBQQUNLKCAwLCAyICksCi0gICAgLyogIFB1c2hXWzJdICAqLyAgUEFDSyggMCwgMyApLAotICAgIC8qICBQdXNoV1szXSAgKi8gIFBBQ0soIDAsIDQgKSwKLSAgICAvKiAgUHVzaFdbNF0gICovICBQQUNLKCAwLCA1ICksCi0gICAgLyogIFB1c2hXWzVdICAqLyAgUEFDSyggMCwgNiApLAotICAgIC8qICBQdXNoV1s2XSAgKi8gIFBBQ0soIDAsIDcgKSwKLSAgICAvKiAgUHVzaFdbN10gICovICBQQUNLKCAwLCA4ICksCi0KLSAgICAvKiAgTURSUFswMF0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMDFdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzAyXSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFswM10gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMDRdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzA1XSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFswNl0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMDddICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzA4XSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFswOV0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMTBdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzExXSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFsxMl0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMTNdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzE0XSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFsxNV0gICovICBQQUNLKCAxLCAwICksCi0KLSAgICAvKiAgTURSUFsxNl0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMTddICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzE4XSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFsxOV0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMjBdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzIxXSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFsyMl0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMjNdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzI0XSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFsyNV0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMjZdICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzI3XSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFsyOF0gICovICBQQUNLKCAxLCAwICksCi0gICAgLyogIE1EUlBbMjldICAqLyAgUEFDSyggMSwgMCApLAotICAgIC8qICBNRFJQWzMwXSAgKi8gIFBBQ0soIDEsIDAgKSwKLSAgICAvKiAgTURSUFszMV0gICovICBQQUNLKCAxLCAwICksCi0KLSAgICAvKiAgTUlSUFswMF0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMDFdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzAyXSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFswM10gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMDRdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzA1XSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFswNl0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMDddICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzA4XSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFswOV0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMTBdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzExXSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFsxMl0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMTNdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzE0XSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFsxNV0gICovICBQQUNLKCAyLCAwICksCi0KLSAgICAvKiAgTUlSUFsxNl0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMTddICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzE4XSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFsxOV0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMjBdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzIxXSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFsyMl0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMjNdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzI0XSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFsyNV0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMjZdICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzI3XSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFsyOF0gICovICBQQUNLKCAyLCAwICksCi0gICAgLyogIE1JUlBbMjldICAqLyAgUEFDSyggMiwgMCApLAotICAgIC8qICBNSVJQWzMwXSAgKi8gIFBBQ0soIDIsIDAgKSwKLSAgICAvKiAgTUlSUFszMV0gICovICBQQUNLKCAyLCAwICkKLSAgfTsKLQotCi0jaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKLQotICAvKiB0aGUgZmlyc3QgaGV4IGRpZ2l0IGdpdmVzIHRoZSBsZW5ndGggb2YgdGhlIG9wY29kZSBuYW1lOyB0aGUgc3BhY2UgKi8KLSAgLyogYWZ0ZXIgdGhlIGRpZ2l0IGlzIGhlcmUganVzdCB0byBpbmNyZWFzZSByZWFkYWJpbGl0eSBvZiB0aGUgc291cmNlICovCi0gIC8qIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIHN0YXRpYwotICBjb25zdCBjaGFyKiAgY29uc3Qgb3Bjb2RlX25hbWVbMjU2XSA9Ci0gIHsKLSAgICAiNyBTVlRDQSB5IiwKLSAgICAiNyBTVlRDQSB4IiwKLSAgICAiOCBTUHZUQ0EgeSIsCi0gICAgIjggU1B2VENBIHgiLAotICAgICI4IFNGdlRDQSB5IiwKLSAgICAiOCBTRnZUQ0EgeCIsCi0gICAgIjggU1B2VEwgfHwiLAotICAgICI3IFNQdlRMICsiLAotICAgICI4IFNGdlRMIHx8IiwKLSAgICAiNyBTRnZUTCArIiwKLSAgICAiNSBTUHZGUyIsCi0gICAgIjUgU0Z2RlMiLAotICAgICIzIEdQdiIsCi0gICAgIjMgR0Z2IiwKLSAgICAiNiBTRnZUUHYiLAotICAgICI1IElTRUNUIiwKLQotICAgICI0IFNSUDAiLAotICAgICI0IFNSUDEiLAotICAgICI0IFNSUDIiLAotICAgICI0IFNaUDAiLAotICAgICI0IFNaUDEiLAotICAgICI0IFNaUDIiLAotICAgICI0IFNaUFMiLAotICAgICI1IFNMT09QIiwKLSAgICAiMyBSVEciLAotICAgICI0IFJUSEciLAotICAgICIzIFNNRCIsCi0gICAgIjQgRUxTRSIsCi0gICAgIjQgSk1QUiIsCi0gICAgIjYgU0N2VENpIiwKLSAgICAiNSBTU3dDaSIsCi0gICAgIjMgU1NXIiwKLQotICAgICIzIERVUCIsCi0gICAgIjMgUE9QIiwKLSAgICAiNSBDTEVBUiIsCi0gICAgIjQgU1dBUCIsCi0gICAgIjUgREVQVEgiLAotICAgICI2IENJTkRFWCIsCi0gICAgIjYgTUlOREVYIiwKLSAgICAiOCBBbGlnblBUUyIsCi0gICAgIjcgSU5TXyQyOCIsCi0gICAgIjMgVVRQIiwKLSAgICAiOCBMT09QQ0FMTCIsCi0gICAgIjQgQ0FMTCIsCi0gICAgIjQgRkRFRiIsCi0gICAgIjQgRU5ERiIsCi0gICAgIjcgTURBUFswXSIsCi0gICAgIjcgTURBUFsxXSIsCi0KLSAgICAiNiBJVVBbMF0iLAotICAgICI2IElVUFsxXSIsCi0gICAgIjYgU0hQWzBdIiwKLSAgICAiNiBTSFBbMV0iLAotICAgICI2IFNIQ1swXSIsCi0gICAgIjYgU0hDWzFdIiwKLSAgICAiNiBTSFpbMF0iLAotICAgICI2IFNIWlsxXSIsCi0gICAgIjUgU0hQSVgiLAotICAgICIyIElQIiwKLSAgICAiOCBNU0lSUFswXSIsCi0gICAgIjggTVNJUlBbMV0iLAotICAgICI3IEFsaWduUlAiLAotICAgICI0IFJUREciLAotICAgICI3IE1JQVBbMF0iLAotICAgICI3IE1JQVBbMV0iLAotCi0gICAgIjYgTlB1c2hCIiwKLSAgICAiNiBOUHVzaFciLAotICAgICIyIFdTIiwKLSAgICAiMiBSUyIsCi0gICAgIjUgV0N2dFAiLAotICAgICI0IFJDdnQiLAotICAgICI1IEdDWzBdIiwKLSAgICAiNSBHQ1sxXSIsCi0gICAgIjQgU0NGUyIsCi0gICAgIjUgTURbMF0iLAotICAgICI1IE1EWzFdIiwKLSAgICAiNSBNUFBFTSIsCi0gICAgIjMgTVBTIiwKLSAgICAiNiBGbGlwT04iLAotICAgICI3IEZsaXBPRkYiLAotICAgICI1IERFQlVHIiwKLQotICAgICIyIExUIiwKLSAgICAiNCBMVEVRIiwKLSAgICAiMiBHVCIsCi0gICAgIjQgR1RFUSIsCi0gICAgIjIgRVEiLAotICAgICIzIE5FUSIsCi0gICAgIjMgT0REIiwKLSAgICAiNCBFVkVOIiwKLSAgICAiMiBJRiIsCi0gICAgIjMgRUlGIiwKLSAgICAiMyBBTkQiLAotICAgICIyIE9SIiwKLSAgICAiMyBOT1QiLAotICAgICI3IERlbHRhUDEiLAotICAgICIzIFNEQiIsCi0gICAgIjMgU0RTIiwKLQotICAgICIzIEFERCIsCi0gICAgIjMgU1VCIiwKLSAgICAiMyBESVYiLAotICAgICIzIE1VTCIsCi0gICAgIjMgQUJTIiwKLSAgICAiMyBORUciLAotICAgICI1IEZMT09SIiwKLSAgICAiNyBDRUlMSU5HIiwKLSAgICAiOCBST1VORFswXSIsCi0gICAgIjggUk9VTkRbMV0iLAotICAgICI4IFJPVU5EWzJdIiwKLSAgICAiOCBST1VORFszXSIsCi0gICAgIjkgTlJPVU5EWzBdIiwKLSAgICAiOSBOUk9VTkRbMV0iLAotICAgICI5IE5ST1VORFsyXSIsCi0gICAgIjkgTlJPVU5EWzNdIiwKLQotICAgICI1IFdDdnRGIiwKLSAgICAiNyBEZWx0YVAyIiwKLSAgICAiNyBEZWx0YVAzIiwKLSAgICAiQSBEZWx0YUNuWzBdIiwKLSAgICAiQSBEZWx0YUNuWzFdIiwKLSAgICAiQSBEZWx0YUNuWzJdIiwKLSAgICAiNiBTUk9VTkQiLAotICAgICI4IFM0NVJvdW5kIiwKLSAgICAiNCBKUk9UIiwKLSAgICAiNCBKUk9GIiwKLSAgICAiNCBST0ZGIiwKLSAgICAiNyBJTlNfJDdCIiwKLSAgICAiNCBSVVRHIiwKLSAgICAiNCBSRFRHIiwKLSAgICAiNSBTQU5HVyIsCi0gICAgIjIgQUEiLAotCi0gICAgIjYgRmxpcFBUIiwKLSAgICAiOCBGbGlwUmdPTiIsCi0gICAgIjkgRmxpcFJnT0ZGIiwKLSAgICAiNyBJTlNfJDgzIiwKLSAgICAiNyBJTlNfJDg0IiwKLSAgICAiOCBTY2FuQ1RSTCIsCi0gICAgIjkgU0RQdlRMWzBdIiwKLSAgICAiOSBTRFB2VExbMV0iLAotICAgICI3IEdldElORk8iLAotICAgICI0IElERUYiLAotICAgICI0IFJPTEwiLAotICAgICIzIE1BWCIsCi0gICAgIjMgTUlOIiwKLSAgICAiOCBTY2FuVFlQRSIsCi0gICAgIjggSW5zdENUUkwiLAotICAgICI3IElOU18kOEYiLAotCi0gICAgIjcgSU5TXyQ5MCIsCi0gICAgIjcgSU5TXyQ5MSIsCi0gICAgIjcgSU5TXyQ5MiIsCi0gICAgIjcgSU5TXyQ5MyIsCi0gICAgIjcgSU5TXyQ5NCIsCi0gICAgIjcgSU5TXyQ5NSIsCi0gICAgIjcgSU5TXyQ5NiIsCi0gICAgIjcgSU5TXyQ5NyIsCi0gICAgIjcgSU5TXyQ5OCIsCi0gICAgIjcgSU5TXyQ5OSIsCi0gICAgIjcgSU5TXyQ5QSIsCi0gICAgIjcgSU5TXyQ5QiIsCi0gICAgIjcgSU5TXyQ5QyIsCi0gICAgIjcgSU5TXyQ5RCIsCi0gICAgIjcgSU5TXyQ5RSIsCi0gICAgIjcgSU5TXyQ5RiIsCi0KLSAgICAiNyBJTlNfJEEwIiwKLSAgICAiNyBJTlNfJEExIiwKLSAgICAiNyBJTlNfJEEyIiwKLSAgICAiNyBJTlNfJEEzIiwKLSAgICAiNyBJTlNfJEE0IiwKLSAgICAiNyBJTlNfJEE1IiwKLSAgICAiNyBJTlNfJEE2IiwKLSAgICAiNyBJTlNfJEE3IiwKLSAgICAiNyBJTlNfJEE4IiwKLSAgICAiNyBJTlNfJEE5IiwKLSAgICAiNyBJTlNfJEFBIiwKLSAgICAiNyBJTlNfJEFCIiwKLSAgICAiNyBJTlNfJEFDIiwKLSAgICAiNyBJTlNfJEFEIiwKLSAgICAiNyBJTlNfJEFFIiwKLSAgICAiNyBJTlNfJEFGIiwKLQotICAgICI4IFB1c2hCWzBdIiwKLSAgICAiOCBQdXNoQlsxXSIsCi0gICAgIjggUHVzaEJbMl0iLAotICAgICI4IFB1c2hCWzNdIiwKLSAgICAiOCBQdXNoQls0XSIsCi0gICAgIjggUHVzaEJbNV0iLAotICAgICI4IFB1c2hCWzZdIiwKLSAgICAiOCBQdXNoQls3XSIsCi0gICAgIjggUHVzaFdbMF0iLAotICAgICI4IFB1c2hXWzFdIiwKLSAgICAiOCBQdXNoV1syXSIsCi0gICAgIjggUHVzaFdbM10iLAotICAgICI4IFB1c2hXWzRdIiwKLSAgICAiOCBQdXNoV1s1XSIsCi0gICAgIjggUHVzaFdbNl0iLAotICAgICI4IFB1c2hXWzddIiwKLQotICAgICI4IE1EUlBbMDBdIiwKLSAgICAiOCBNRFJQWzAxXSIsCi0gICAgIjggTURSUFswMl0iLAotICAgICI4IE1EUlBbMDNdIiwKLSAgICAiOCBNRFJQWzA0XSIsCi0gICAgIjggTURSUFswNV0iLAotICAgICI4IE1EUlBbMDZdIiwKLSAgICAiOCBNRFJQWzA3XSIsCi0gICAgIjggTURSUFswOF0iLAotICAgICI4IE1EUlBbMDldIiwKLSAgICAiOCBNRFJQWzEwXSIsCi0gICAgIjggTURSUFsxMV0iLAotICAgICI4IE1EUlBbMTJdIiwKLSAgICAiOCBNRFJQWzEzXSIsCi0gICAgIjggTURSUFsxNF0iLAotICAgICI4IE1EUlBbMTVdIiwKLQotICAgICI4IE1EUlBbMTZdIiwKLSAgICAiOCBNRFJQWzE3XSIsCi0gICAgIjggTURSUFsxOF0iLAotICAgICI4IE1EUlBbMTldIiwKLSAgICAiOCBNRFJQWzIwXSIsCi0gICAgIjggTURSUFsyMV0iLAotICAgICI4IE1EUlBbMjJdIiwKLSAgICAiOCBNRFJQWzIzXSIsCi0gICAgIjggTURSUFsyNF0iLAotICAgICI4IE1EUlBbMjVdIiwKLSAgICAiOCBNRFJQWzI2XSIsCi0gICAgIjggTURSUFsyN10iLAotICAgICI4IE1EUlBbMjhdIiwKLSAgICAiOCBNRFJQWzI5XSIsCi0gICAgIjggTURSUFszMF0iLAotICAgICI4IE1EUlBbMzFdIiwKLQotICAgICI4IE1JUlBbMDBdIiwKLSAgICAiOCBNSVJQWzAxXSIsCi0gICAgIjggTUlSUFswMl0iLAotICAgICI4IE1JUlBbMDNdIiwKLSAgICAiOCBNSVJQWzA0XSIsCi0gICAgIjggTUlSUFswNV0iLAotICAgICI4IE1JUlBbMDZdIiwKLSAgICAiOCBNSVJQWzA3XSIsCi0gICAgIjggTUlSUFswOF0iLAotICAgICI4IE1JUlBbMDldIiwKLSAgICAiOCBNSVJQWzEwXSIsCi0gICAgIjggTUlSUFsxMV0iLAotICAgICI4IE1JUlBbMTJdIiwKLSAgICAiOCBNSVJQWzEzXSIsCi0gICAgIjggTUlSUFsxNF0iLAotICAgICI4IE1JUlBbMTVdIiwKLQotICAgICI4IE1JUlBbMTZdIiwKLSAgICAiOCBNSVJQWzE3XSIsCi0gICAgIjggTUlSUFsxOF0iLAotICAgICI4IE1JUlBbMTldIiwKLSAgICAiOCBNSVJQWzIwXSIsCi0gICAgIjggTUlSUFsyMV0iLAotICAgICI4IE1JUlBbMjJdIiwKLSAgICAiOCBNSVJQWzIzXSIsCi0gICAgIjggTUlSUFsyNF0iLAotICAgICI4IE1JUlBbMjVdIiwKLSAgICAiOCBNSVJQWzI2XSIsCi0gICAgIjggTUlSUFsyN10iLAotICAgICI4IE1JUlBbMjhdIiwKLSAgICAiOCBNSVJQWzI5XSIsCi0gICAgIjggTUlSUFszMF0iLAotICAgICI4IE1JUlBbMzFdIgotICB9OwotCi0jZW5kaWYgLyogRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KLQotCi0gIHN0YXRpYwotICBjb25zdCBGVF9DaGFyICBvcGNvZGVfbGVuZ3RoWzI1Nl0gPQotICB7Ci0gICAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLAotICAgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsCi0gICAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwKLQotICAgLTEsLTIsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsCi0gICAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLAotICAgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsCi0KLSAgICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLAotICAgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsCi0gICAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwKLSAgICAyLCAzLCA0LCA1LCAgNiwgNywgOCwgOSwgIDMsIDUsIDcsIDksIDExLDEzLDE1LDE3LAotCi0gICAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLAotICAgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsCi0gICAgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMQotICB9OwotCi0jdW5kZWYgUEFDSwotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9OT19BU1NFTUJMRVIKLQotI2lmIGRlZmluZWQoIF9fYXJtX18gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIFwKLSAgICAoIGRlZmluZWQoIF9fdGh1bWIyX18gKSB8fCAhZGVmaW5lZCggX190aHVtYl9fICkgKQotCi0jZGVmaW5lIFRUX011bEZpeDE0ICBUVF9NdWxGaXgxNF9hcm0KLQotICBzdGF0aWMgRlRfSW50MzIKLSAgVFRfTXVsRml4MTRfYXJtKCBGVF9JbnQzMiAgYSwKLSAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgYiApCi0gIHsKLSAgICBGVF9JbnQzMiAgdCwgdDI7Ci0KLQotI2lmIGRlZmluZWQoIF9fQ0NfQVJNICkgfHwgZGVmaW5lZCggX19BUk1DQ19fICkKLQotICAgIF9fYXNtCi0gICAgewotICAgICAgc211bGwgdDIsIHQsICBiLCAgYSAgICAgICAgICAgLyogKGxvPXQyLGhpPXQpID0gYSpiICovCi0gICAgICBtb3YgICBhLCAgdCwgIGFzciAjMzEgICAgICAgICAvKiBhICAgPSAoaGkgPj4gMzEpICovCi0gICAgICBhZGQgICBhLCAgYSwgICMweDIwMDAgICAgICAgICAvKiBhICArPSAweDIwMDAgKi8KLSAgICAgIGFkZHMgIHQyLCB0MiwgYSAgICAgICAgICAgICAgIC8qIHQyICs9IGEgKi8KLSAgICAgIGFkYyAgIHQsICB0LCAgIzAgICAgICAgICAgICAgIC8qIHQgICs9IGNhcnJ5ICovCi0gICAgICBtb3YgICBhLCAgdDIsIGxzciAjMTQgICAgICAgICAvKiBhICAgPSB0MiA+PiAxNCAqLwotICAgICAgb3JyICAgYSwgIGEsICB0LCAgbHNsICMxOCAgICAgLyogYSAgfD0gdCA8PCAxOCAqLwotICAgIH0KLQotI2VsaWYgZGVmaW5lZCggX19HTlVDX18gKQotCi0gICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKAotICAgICAgInNtdWxsICAlMSwgJTIsICU0LCAlM1xuXHQiICAgICAgIC8qIChsbz0lMSxoaT0lMikgPSBhKmIgKi8KLSAgICAgICJtb3YgICAgJTAsICUyLCBhc3IgIzMxXG5cdCIgICAgICAvKiAlMCAgPSAoaGkgPj4gMzEpICovCi0jaWYgZGVmaW5lZCggX19jbGFuZ19fICkgJiYgZGVmaW5lZCggX190aHVtYjJfXyApCi0gICAgICAiYWRkLncgICUwLCAlMCwgIzB4MjAwMFxuXHQiICAgICAgLyogJTAgKz0gMHgyMDAwICovCi0jZWxzZQotICAgICAgImFkZCAgICAlMCwgJTAsICMweDIwMDBcblx0IiAgICAgIC8qICUwICs9IDB4MjAwMCAqLwotI2VuZGlmCi0gICAgICAiYWRkcyAgICUxLCAlMSwgJTBcblx0IiAgICAgICAgICAgLyogJTEgKz0gJTAgKi8KLSAgICAgICJhZGMgICAgJTIsICUyLCAjMFxuXHQiICAgICAgICAgICAvKiAlMiArPSBjYXJyeSAqLwotICAgICAgIm1vdiAgICAlMCwgJTEsIGxzciAjMTRcblx0IiAgICAgIC8qICUwICA9ICUxID4+IDE2ICovCi0gICAgICAib3JyICAgICUwLCAlMCwgJTIsIGxzbCAjMThcblx0IiAgLyogJTAgfD0gJTIgPDwgMTYgKi8KLSAgICAgIDogIj1yIihhKSwgIj0mciIodDIpLCAiPSZyIih0KQotICAgICAgOiAiciIoYSksICJyIihiKQotICAgICAgOiAiY2MiICk7Ci0KLSNlbmRpZgotCi0gICAgcmV0dXJuIGE7Ci0gIH0KLQotI2VuZGlmIC8qIF9fYXJtX18gJiYgKCBfX3RodW1iMl9fIHx8ICFfX3RodW1iX18gKSAqLwotCi0jZW5kaWYgLyogIUZUX0NPTkZJR19PUFRJT05fTk9fQVNTRU1CTEVSICovCi0KLQotI2lmIGRlZmluZWQoIF9fR05VQ19fICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBcCi0gICAgKCBkZWZpbmVkKCBfX2kzODZfXyApIHx8IGRlZmluZWQoIF9feDg2XzY0X18gKSApCi0KLSNkZWZpbmUgVFRfTXVsRml4MTQgIFRUX011bEZpeDE0X2xvbmdfbG9uZwotCi0gIC8qIFRlbXBvcmFyaWx5IGRpc2FibGUgdGhlIHdhcm5pbmcgdGhhdCBDOTAgZG9lc24ndCBzdXBwb3J0IGBsb25nIGxvbmcnLiAqLwotI2lmICggX19HTlVDX18gKiAxMDAgKyBfX0dOVUNfTUlOT1JfXyApID49IDQwNgotI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCi0jZW5kaWYKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdsb25nLWxvbmciCi0KLSAgLyogVGhpcyBpcyBkZWNsYXJlZCBgbm9pbmxpbmUnIGJlY2F1c2UgaW5saW5pbmcgdGhlIGZ1bmN0aW9uIHJlc3VsdHMgKi8KLSAgLyogaW4gc2xvd2VyIGNvZGUuICBUaGUgYHB1cmUnIGF0dHJpYnV0ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcmVzdWx0ICAgKi8KLSAgLyogb25seSBkZXBlbmRzIG9uIHRoZSBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIF9fYXR0cmlidXRlX18oKCBub2lubGluZSApKQotICAgICAgICAgX19hdHRyaWJ1dGVfXygoIHB1cmUgKSkgRlRfSW50MzIKLSAgVFRfTXVsRml4MTRfbG9uZ19sb25nKCBGVF9JbnQzMiAgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgYiApCi0gIHsKLQotICAgIGxvbmcgbG9uZyAgcmV0ID0gKGxvbmcgbG9uZylhICogYjsKLQotICAgIC8qIFRoZSBmb2xsb3dpbmcgbGluZSBhc3N1bWVzIHRoYXQgcmlnaHQgc2hpZnRpbmcgb2Ygc2lnbmVkIHZhbHVlcyAqLwotICAgIC8qIHdpbGwgYWN0dWFsbHkgcHJlc2VydmUgdGhlIHNpZ24gYml0LiAgVGhlIGV4YWN0IGJlaGF2aW91ciBpcyAgICAqLwotICAgIC8qIHVuZGVmaW5lZCwgYnV0IHRoaXMgaXMgdHJ1ZSBvbiB4ODYgYW5kIHg4Nl82NC4gICAgICAgICAgICAgICAgICAqLwotICAgIGxvbmcgbG9uZyAgdG1wID0gcmV0ID4+IDYzOwotCi0KLSAgICByZXQgKz0gMHgyMDAwICsgdG1wOwotCi0gICAgcmV0dXJuIChGVF9JbnQzMikoIHJldCA+PiAxNCApOwotICB9Ci0KLSNpZiAoIF9fR05VQ19fICogMTAwICsgX19HTlVDX01JTk9SX18gKSA+PSA0MDYKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcG9wCi0jZW5kaWYKLQotI2VuZGlmIC8qIF9fR05VQ19fICYmICggX19pMzg2X18gfHwgX194ODZfNjRfXyApICovCi0KLQotI2lmbmRlZiBUVF9NdWxGaXgxNAotCi0gIC8qIENvbXB1dGUgKGEqYikvMl4xNCB3aXRoIG1heGltdW0gYWNjdXJhY3kgYW5kIHJvdW5kaW5nLiAgKi8KLSAgLyogVGhpcyBpcyBvcHRpbWl6ZWQgdG8gYmUgZmFzdGVyIHRoYW4gY2FsbGluZyBGVF9NdWxGaXgoKSAqLwotICAvKiBmb3IgcGxhdGZvcm1zIHdoZXJlIHNpemVvZihpbnQpID09IDIuICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9JbnQzMgotICBUVF9NdWxGaXgxNCggRlRfSW50MzIgIGEsCi0gICAgICAgICAgICAgICBGVF9JbnQgICAgYiApCi0gIHsKLSAgICBGVF9JbnQzMiAgIHNpZ247Ci0gICAgRlRfVUludDMyICBhaCwgYWwsIG1pZCwgbG8sIGhpOwotCi0KLSAgICBzaWduID0gYSBeIGI7Ci0KLSAgICBpZiAoIGEgPCAwICkKLSAgICAgIGEgPSAtYTsKLSAgICBpZiAoIGIgPCAwICkKLSAgICAgIGIgPSAtYjsKLQotICAgIGFoID0gKEZUX1VJbnQzMikoICggYSA+PiAxNiApICYgMHhGRkZGVSApOwotICAgIGFsID0gKEZUX1VJbnQzMikoIGEgJiAweEZGRkZVICk7Ci0KLSAgICBsbyAgICA9IGFsICogYjsKLSAgICBtaWQgICA9IGFoICogYjsKLSAgICBoaSAgICA9IG1pZCA+PiAxNjsKLSAgICBtaWQgICA9ICggbWlkIDw8IDE2ICkgKyAoIDEgPDwgMTMgKTsgLyogcm91bmRpbmcgKi8KLSAgICBsbyAgICs9IG1pZDsKLSAgICBpZiAoIGxvIDwgbWlkICkKLSAgICAgIGhpICs9IDE7Ci0KLSAgICBtaWQgPSAoIGxvID4+IDE0ICkgfCAoIGhpIDw8IDE4ICk7Ci0KLSAgICByZXR1cm4gc2lnbiA+PSAwID8gKEZUX0ludDMyKW1pZCA6IC0oRlRfSW50MzIpbWlkOwotICB9Ci0KLSNlbmRpZiAgLyogIVRUX011bEZpeDE0ICovCi0KLQotI2lmIGRlZmluZWQoIF9fR05VQ19fICkgICAgICAgICYmIFwKLSAgICAoIGRlZmluZWQoIF9faTM4Nl9fICkgICB8fCAgICBcCi0gICAgICBkZWZpbmVkKCBfX3g4Nl82NF9fICkgfHwgICAgXAotICAgICAgZGVmaW5lZCggX19hcm1fXyApICAgICkKLQotI2RlZmluZSBUVF9Eb3RGaXgxNCAgVFRfRG90Rml4MTRfbG9uZ19sb25nCi0KLSNpZiAoIF9fR05VQ19fICogMTAwICsgX19HTlVDX01JTk9SX18gKSA+PSA0MDYKLSNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAotI2VuZGlmCi0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XbG9uZy1sb25nIgotCi0gIHN0YXRpYyBfX2F0dHJpYnV0ZV9fKCggcHVyZSApKSBGVF9JbnQzMgotICBUVF9Eb3RGaXgxNF9sb25nX2xvbmcoIEZUX0ludDMyICBheCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgIGJ4LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICBieSApCi0gIHsKLSAgICAvKiBUZW1wb3JhcmlseSBkaXNhYmxlIHRoZSB3YXJuaW5nIHRoYXQgQzkwIGRvZXNuJ3Qgc3VwcG9ydCAqLwotICAgIC8qIGBsb25nIGxvbmcnLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBsb25nIGxvbmcgIHRlbXAxID0gKGxvbmcgbG9uZylheCAqIGJ4OwotICAgIGxvbmcgbG9uZyAgdGVtcDIgPSAobG9uZyBsb25nKWF5ICogYnk7Ci0KLQotICAgIHRlbXAxICs9IHRlbXAyOwotICAgIHRlbXAyICA9IHRlbXAxID4+IDYzOwotICAgIHRlbXAxICs9IDB4MjAwMCArIHRlbXAyOwotCi0gICAgcmV0dXJuIChGVF9JbnQzMikoIHRlbXAxID4+IDE0ICk7Ci0KLSAgfQotCi0jaWYgKCBfX0dOVUNfXyAqIDEwMCArIF9fR05VQ19NSU5PUl9fICkgPj0gNDA2Ci0jcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAotI2VuZGlmCi0KLSNlbmRpZiAvKiBfX0dOVUNfXyAmJiAoX19hcm1fXyB8fCBfX2kzODZfXyB8fCBfX3g4Nl82NF9fKSAqLwotCi0KLSNpZm5kZWYgVFRfRG90Rml4MTQKLQotICAvKiBjb21wdXRlIChheCpieCtheSpieSkvMl4xNCB3aXRoIG1heGltdW0gYWNjdXJhY3kgYW5kIHJvdW5kaW5nICovCi0gIHN0YXRpYyBGVF9JbnQzMgotICBUVF9Eb3RGaXgxNCggRlRfSW50MzIgIGF4LAotICAgICAgICAgICAgICAgRlRfSW50MzIgIGF5LAotICAgICAgICAgICAgICAgRlRfSW50ICAgIGJ4LAotICAgICAgICAgICAgICAgRlRfSW50ICAgIGJ5ICkKLSAgewotICAgIEZUX0ludDMyICAgbSwgcywgaGkxLCBoaTIsIGhpOwotICAgIEZUX1VJbnQzMiAgbCwgbG8xLCBsbzIsIGxvOwotCi0KLSAgICAvKiBjb21wdXRlIGF4KmJ4IGFzIDY0LWJpdCB2YWx1ZSAqLwotICAgIGwgPSAoRlRfVUludDMyKSggKCBheCAmIDB4RkZGRlUgKSAqIGJ4ICk7Ci0gICAgbSA9ICggYXggPj4gMTYgKSAqIGJ4OwotCi0gICAgbG8xID0gbCArICggKEZUX1VJbnQzMiltIDw8IDE2ICk7Ci0gICAgaGkxID0gKCBtID4+IDE2ICkgKyAoIChGVF9JbnQzMilsID4+IDMxICkgKyAoIGxvMSA8IGwgKTsKLQotICAgIC8qIGNvbXB1dGUgYXkqYnkgYXMgNjQtYml0IHZhbHVlICovCi0gICAgbCA9IChGVF9VSW50MzIpKCAoIGF5ICYgMHhGRkZGVSApICogYnkgKTsKLSAgICBtID0gKCBheSA+PiAxNiApICogYnk7Ci0KLSAgICBsbzIgPSBsICsgKCAoRlRfVUludDMyKW0gPDwgMTYgKTsKLSAgICBoaTIgPSAoIG0gPj4gMTYgKSArICggKEZUX0ludDMyKWwgPj4gMzEgKSArICggbG8yIDwgbCApOwotCi0gICAgLyogYWRkIHRoZW0gKi8KLSAgICBsbyA9IGxvMSArIGxvMjsKLSAgICBoaSA9IGhpMSArIGhpMiArICggbG8gPCBsbzEgKTsKLQotICAgIC8qIGRpdmlkZSB0aGUgcmVzdWx0IGJ5IDJeMTQgd2l0aCByb3VuZGluZyAqLwotICAgIHMgICA9IGhpID4+IDMxOwotICAgIGwgICA9IGxvICsgKEZUX1VJbnQzMilzOwotICAgIGhpICs9IHMgKyAoIGwgPCBsbyApOwotICAgIGxvICA9IGw7Ci0KLSAgICBsICAgPSBsbyArIDB4MjAwMFU7Ci0gICAgaGkgKz0gKCBsIDwgbG8gKTsKLQotICAgIHJldHVybiAoRlRfSW50MzIpKCAoIChGVF9VSW50MzIpaGkgPDwgMTggKSB8ICggbCA+PiAxNCApICk7Ci0gIH0KLQotI2VuZGlmIC8qIFRUX0RvdEZpeDE0ICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDdXJyZW50X1JhdGlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm5zIHRoZSBjdXJyZW50IGFzcGVjdCByYXRpbyBzY2FsaW5nIGZhY3RvciBkZXBlbmRpbmcgb24gdGhlICAgKi8KLSAgLyogICAgcHJvamVjdGlvbiB2ZWN0b3IncyBzdGF0ZSBhbmQgZGV2aWNlIHJlc29sdXRpb25zLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGFzcGVjdCByYXRpbyBpbiAxNi4xNiBmb3JtYXQsIGFsd2F5cyA8PSAxLjAgLiAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfTG9uZwotICBDdXJyZW50X1JhdGlvKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIGlmICggIWV4Yy0+dHRfbWV0cmljcy5yYXRpbyApCi0gICAgewotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCi0gICAgICBpZiAoIGV4Yy0+ZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBleGMtPkdTLmJvdGhfeF9heGlzICkKLSAgICAgICAgICBleGMtPnR0X21ldHJpY3MucmF0aW8gPSBleGMtPnR0X21ldHJpY3MueF9yYXRpbzsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5yYXRpbyA9IGV4Yy0+dHRfbWV0cmljcy55X3JhdGlvOwotICAgICAgfQotICAgICAgZWxzZQotI2VuZGlmCi0gICAgICB7Ci0gICAgICAgIGlmICggZXhjLT5HUy5wcm9qVmVjdG9yLnkgPT0gMCApCi0gICAgICAgICAgZXhjLT50dF9tZXRyaWNzLnJhdGlvID0gZXhjLT50dF9tZXRyaWNzLnhfcmF0aW87Ci0KLSAgICAgICAgZWxzZSBpZiAoIGV4Yy0+R1MucHJvalZlY3Rvci54ID09IDAgKQotICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5yYXRpbyA9IGV4Yy0+dHRfbWV0cmljcy55X3JhdGlvOwotCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIEZUX0YyNkRvdDYgIHgsIHk7Ci0KLQotICAgICAgICAgIHggPSBUVF9NdWxGaXgxNCggZXhjLT50dF9tZXRyaWNzLnhfcmF0aW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLnByb2pWZWN0b3IueCApOwotICAgICAgICAgIHkgPSBUVF9NdWxGaXgxNCggZXhjLT50dF9tZXRyaWNzLnlfcmF0aW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLnByb2pWZWN0b3IueSApOwotICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5yYXRpbyA9IEZUX0h5cG90KCB4LCB5ICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGV4Yy0+dHRfbWV0cmljcy5yYXRpbzsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9Mb25nICkKLSAgQ3VycmVudF9QcGVtKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIHJldHVybiBleGMtPnR0X21ldHJpY3MucHBlbTsKLSAgfQotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9Mb25nICkKLSAgQ3VycmVudF9QcGVtX1N0cmV0Y2hlZCggVFRfRXhlY0NvbnRleHQgIGV4YyApCi0gIHsKLSAgICByZXR1cm4gRlRfTXVsRml4KCBleGMtPnR0X21ldHJpY3MucHBlbSwgQ3VycmVudF9SYXRpbyggZXhjICkgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGdW5jdGlvbnMgcmVsYXRlZCB0byB0aGUgY29udHJvbCB2YWx1ZSB0YWJsZSAoQ1ZUKS4gICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgRlRfQ0FMTEJBQ0tfREVGKCBGVF9GMjZEb3Q2ICkKLSAgUmVhZF9DVlQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgaWR4ICkKLSAgewotICAgIHJldHVybiBleGMtPmN2dFtpZHhdOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX0YyNkRvdDYgKQotICBSZWFkX0NWVF9TdHJldGNoZWQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgIGlkeCApCi0gIHsKLSAgICByZXR1cm4gRlRfTXVsRml4KCBleGMtPmN2dFtpZHhdLCBDdXJyZW50X1JhdGlvKCBleGMgKSApOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICBXcml0ZV9DVlQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgIGlkeCwKLSAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgdmFsdWUgKQotICB7Ci0gICAgZXhjLT5jdnRbaWR4XSA9IHZhbHVlOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICBXcml0ZV9DVlRfU3RyZXRjaGVkKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgaWR4LAotICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgdmFsdWUgKQotICB7Ci0gICAgZXhjLT5jdnRbaWR4XSA9IEZUX0RpdkZpeCggdmFsdWUsIEN1cnJlbnRfUmF0aW8oIGV4YyApICk7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggdm9pZCApCi0gIE1vdmVfQ1ZUKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgIGlkeCwKLSAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICB2YWx1ZSApCi0gIHsKLSAgICBleGMtPmN2dFtpZHhdICs9IHZhbHVlOwotICB9Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIHZvaWQgKQotICBNb3ZlX0NWVF9TdHJldGNoZWQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgdmFsdWUgKQotICB7Ci0gICAgZXhjLT5jdnRbaWR4XSArPSBGVF9EaXZGaXgoIHZhbHVlLCBDdXJyZW50X1JhdGlvKCBleGMgKSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHZXRTaG9ydElucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm5zIGEgc2hvcnQgaW50ZWdlciB0YWtlbiBmcm9tIHRoZSBpbnN0cnVjdGlvbiBzdHJlYW0gYXQgICAgICAgKi8KLSAgLyogICAgYWRkcmVzcyBJUC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU2hvcnQgcmVhZCBhdCBjb2RlW0lQXS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBvbmUgY291bGQgYmVjb21lIGEgbWFjcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfU2hvcnQKLSAgR2V0U2hvcnRJbnMoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQotICB7Ci0gICAgLyogUmVhZGluZyBhIGJ5dGUgc3RyZWFtIHNvIHRoZXJlIGlzIG5vIGVuZGlhbmVzcyAoRGF2ZVApICovCi0gICAgZXhjLT5JUCArPSAyOwotICAgIHJldHVybiAoRlRfU2hvcnQpKCAoIGV4Yy0+Y29kZVtleGMtPklQIC0gMl0gPDwgOCApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPmNvZGVbZXhjLT5JUCAtIDFdICAgICAgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5zX0dvdG9fQ29kZVJhbmdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgR29lcyB0byBhIGNlcnRhaW4gY29kZSByYW5nZSBpbiB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtLiAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYVJhbmdlIDo6IFRoZSBpbmRleCBvZiB0aGUgY29kZSByYW5nZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBhSVAgICAgOjogVGhlIG5ldyBJUCBhZGRyZXNzIGluIHRoZSBjb2RlIHJhbmdlLiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTVUNDRVNTIG9yIEZBSUxVUkUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9Cb29sCi0gIEluc19Hb3RvX0NvZGVSYW5nZSggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgYVJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICBhSVAgKQotICB7Ci0gICAgVFRfQ29kZVJhbmdlKiAgcmFuZ2U7Ci0KLQotICAgIGlmICggYVJhbmdlIDwgMSB8fCBhUmFuZ2UgPiAzICkKLSAgICB7Ci0gICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEJhZF9Bcmd1bWVudCApOwotICAgICAgcmV0dXJuIEZBSUxVUkU7Ci0gICAgfQotCi0gICAgcmFuZ2UgPSAmZXhjLT5jb2RlUmFuZ2VUYWJsZVthUmFuZ2UgLSAxXTsKLQotICAgIGlmICggcmFuZ2UtPmJhc2UgPT0gTlVMTCApICAgICAvKiBpbnZhbGlkIGNvZGVyYW5nZSAqLwotICAgIHsKLSAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Db2RlUmFuZ2UgKTsKLSAgICAgIHJldHVybiBGQUlMVVJFOwotICAgIH0KLQotICAgIC8qIE5PVEU6IEJlY2F1c2UgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gb2YgYSBwcm9ncmFtIG1heSBiZSBhIENBTEwgKi8KLSAgICAvKiAgICAgICB3aGljaCB3aWxsIHJldHVybiB0byB0aGUgZmlyc3QgYnl0ZSAqYWZ0ZXIqIHRoZSBjb2RlICAgICovCi0gICAgLyogICAgICAgcmFuZ2UsIHdlIHRlc3QgZm9yIGFJUCA8PSBTaXplLCBpbnN0ZWFkIG9mIGFJUCA8IFNpemUuICAqLwotCi0gICAgaWYgKCBhSVAgPiByYW5nZS0+c2l6ZSApCi0gICAgewotICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBDb2RlX092ZXJmbG93ICk7Ci0gICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICB9Ci0KLSAgICBleGMtPmNvZGUgICAgID0gcmFuZ2UtPmJhc2U7Ci0gICAgZXhjLT5jb2RlU2l6ZSA9IHJhbmdlLT5zaXplOwotICAgIGV4Yy0+SVAgICAgICAgPSBhSVA7Ci0gICAgZXhjLT5jdXJSYW5nZSA9IGFSYW5nZTsKLQotICAgIHJldHVybiBTVUNDRVNTOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEaXJlY3RfTW92ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBNb3ZlcyBhIHBvaW50IGJ5IGEgZ2l2ZW4gZGlzdGFuY2UgYWxvbmcgdGhlIGZyZWVkb20gdmVjdG9yLiAgVGhlICAgKi8KLSAgLyogICAgcG9pbnQgd2lsbCBiZSBgdG91Y2hlZCcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcG9pbnQgICAgOjogVGhlIGluZGV4IG9mIHRoZSBwb2ludCB0byBtb3ZlLiAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkaXN0YW5jZSA6OiBUaGUgZGlzdGFuY2UgdG8gYXBwbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB6b25lICAgICA6OiBUaGUgYWZmZWN0ZWQgZ2x5cGggem9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIERpcmVjdF9Nb3ZlKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgVFRfR2x5cGhab25lICAgIHpvbmUsCi0gICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICAgcG9pbnQsCi0gICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgZGlzdGFuY2UgKQotICB7Ci0gICAgRlRfRjI2RG90NiAgdjsKLQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSAgICBGVF9BU1NFUlQoICFleGMtPmZhY2UtPnVucGF0ZW50ZWRfaGludGluZyApOwotI2VuZGlmCi0KLSAgICB2ID0gZXhjLT5HUy5mcmVlVmVjdG9yLng7Ci0KLSAgICBpZiAoIHYgIT0gMCApCi0gICAgewotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotICAgICAgaWYgKCAhU1VCUElYRUxfSElOVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgKCAhZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfQUxMT1dfWF9ETU9WRSApICkgKQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwotICAgICAgICB6b25lLT5jdXJbcG9pbnRdLnggKz0gRlRfTXVsRGl2KCBkaXN0YW5jZSwgdiwgZXhjLT5GX2RvdF9QICk7Ci0KLSAgICAgIHpvbmUtPnRhZ3NbcG9pbnRdIHw9IEZUX0NVUlZFX1RBR19UT1VDSF9YOwotICAgIH0KLQotICAgIHYgPSBleGMtPkdTLmZyZWVWZWN0b3IueTsKLQotICAgIGlmICggdiAhPSAwICkKLSAgICB7Ci0gICAgICB6b25lLT5jdXJbcG9pbnRdLnkgKz0gRlRfTXVsRGl2KCBkaXN0YW5jZSwgdiwgZXhjLT5GX2RvdF9QICk7Ci0KLSAgICAgIHpvbmUtPnRhZ3NbcG9pbnRdIHw9IEZUX0NVUlZFX1RBR19UT1VDSF9ZOwotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRGlyZWN0X01vdmVfT3JpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTW92ZXMgdGhlICpvcmlnaW5hbCogcG9zaXRpb24gb2YgYSBwb2ludCBieSBhIGdpdmVuIGRpc3RhbmNlIGFsb25nICovCi0gIC8qICAgIHRoZSBmcmVlZG9tIHZlY3Rvci4gIE9idmlvdXNseSwgdGhlIHBvaW50IHdpbGwgbm90IGJlIGB0b3VjaGVkJy4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBvaW50ICAgIDo6IFRoZSBpbmRleCBvZiB0aGUgcG9pbnQgdG8gbW92ZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGlzdGFuY2UgOjogVGhlIGRpc3RhbmNlIHRvIGFwcGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgem9uZSAgICAgOjogVGhlIGFmZmVjdGVkIGdseXBoIHpvbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBEaXJlY3RfTW92ZV9PcmlnKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgICAgICBUVF9HbHlwaFpvbmUgICAgem9uZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgIHBvaW50LAotICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgZGlzdGFuY2UgKQotICB7Ci0gICAgRlRfRjI2RG90NiAgdjsKLQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSAgICBGVF9BU1NFUlQoICFleGMtPmZhY2UtPnVucGF0ZW50ZWRfaGludGluZyApOwotI2VuZGlmCi0KLSAgICB2ID0gZXhjLT5HUy5mcmVlVmVjdG9yLng7Ci0KLSAgICBpZiAoIHYgIT0gMCApCi0gICAgICB6b25lLT5vcmdbcG9pbnRdLnggKz0gRlRfTXVsRGl2KCBkaXN0YW5jZSwgdiwgZXhjLT5GX2RvdF9QICk7Ci0KLSAgICB2ID0gZXhjLT5HUy5mcmVlVmVjdG9yLnk7Ci0KLSAgICBpZiAoIHYgIT0gMCApCi0gICAgICB6b25lLT5vcmdbcG9pbnRdLnkgKz0gRlRfTXVsRGl2KCBkaXN0YW5jZSwgdiwgZXhjLT5GX2RvdF9QICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3BlY2lhbCB2ZXJzaW9ucyBvZiBEaXJlY3RfTW92ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoZSBmb2xsb3dpbmcgdmVyc2lvbnMgYXJlIHVzZWQgd2hlbmV2ZXIgYm90aCB2ZWN0b3JzIGFyZSBib3RoICAgICAgKi8KLSAgLyogICBhbG9uZyBvbmUgb2YgdGhlIGNvb3JkaW5hdGUgdW5pdCB2ZWN0b3JzLCBpLmUuIGluIDkwJSBvZiB0aGUgY2FzZXMuICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIHN0YXRpYyB2b2lkCi0gIERpcmVjdF9Nb3ZlX1goIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgIFRUX0dseXBoWm9uZSAgICB6b25lLAotICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICAgcG9pbnQsCi0gICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGV4YyApOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0gICAgaWYgKCAhU1VCUElYRUxfSElOVElORyAgIHx8Ci0gICAgICAgICAhZXhjLT5pZ25vcmVfeF9tb2RlICkKLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KLSAgICAgIHpvbmUtPmN1cltwb2ludF0ueCArPSBkaXN0YW5jZTsKLQotICAgIHpvbmUtPnRhZ3NbcG9pbnRdICB8PSBGVF9DVVJWRV9UQUdfVE9VQ0hfWDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgRGlyZWN0X01vdmVfWSggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgICAgVFRfR2x5cGhab25lICAgIHpvbmUsCi0gICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgICBwb2ludCwKLSAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGRpc3RhbmNlICkKLSAgewotICAgIEZUX1VOVVNFRCggZXhjICk7Ci0KLSAgICB6b25lLT5jdXJbcG9pbnRdLnkgKz0gZGlzdGFuY2U7Ci0gICAgem9uZS0+dGFnc1twb2ludF0gIHw9IEZUX0NVUlZFX1RBR19UT1VDSF9ZOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNwZWNpYWwgdmVyc2lvbnMgb2YgRGlyZWN0X01vdmVfT3JpZygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBUaGUgZm9sbG93aW5nIHZlcnNpb25zIGFyZSB1c2VkIHdoZW5ldmVyIGJvdGggdmVjdG9ycyBhcmUgYm90aCAgICAgICovCi0gIC8qICAgYWxvbmcgb25lIG9mIHRoZSBjb29yZGluYXRlIHVuaXQgdmVjdG9ycywgaS5lLiBpbiA5MCUgb2YgdGhlIGNhc2VzLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBzdGF0aWMgdm9pZAotICBEaXJlY3RfTW92ZV9PcmlnX1goIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgICAgICAgVFRfR2x5cGhab25lICAgIHpvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgIHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGV4YyApOwotCi0gICAgem9uZS0+b3JnW3BvaW50XS54ICs9IGRpc3RhbmNlOwotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBEaXJlY3RfTW92ZV9PcmlnX1koIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgICAgICAgVFRfR2x5cGhab25lICAgIHpvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgIHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGV4YyApOwotCi0gICAgem9uZS0+b3JnW3BvaW50XS55ICs9IGRpc3RhbmNlOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZF9Ob25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEb2VzIG5vdCByb3VuZCwgYnV0IGFkZHMgZW5naW5lIGNvbXBlbnNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkaXN0YW5jZSAgICAgOjogVGhlIGRpc3RhbmNlIChub3QpIHRvIHJvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbXBlbnNhdGlvbiA6OiBUaGUgZW5naW5lIGNvbXBlbnNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBjb21wZW5zYXRlZCBkaXN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBUcnVlVHlwZSBzcGVjaWZpY2F0aW9uIHNheXMgdmVyeSBmZXcgYWJvdXQgdGhlIHJlbGF0aW9uc2hpcCAgICAqLwotICAvKiAgICBiZXR3ZWVuIHJvdW5kaW5nIGFuZCBlbmdpbmUgY29tcGVuc2F0aW9uLiAgSG93ZXZlciwgaXQgc2VlbXMgZnJvbSAgKi8KLSAgLyogICAgdGhlIGRlc2NyaXB0aW9uIG9mIHN1cGVyIHJvdW5kIHRoYXQgd2Ugc2hvdWxkIGFkZCB0aGUgY29tcGVuc2F0aW9uICovCi0gIC8qICAgIGJlZm9yZSByb3VuZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0YyNkRvdDYKLSAgUm91bmRfTm9uZSggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGRpc3RhbmNlLAotICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgY29tcGVuc2F0aW9uICkKLSAgewotICAgIEZUX0YyNkRvdDYgIHZhbDsKLQotICAgIEZUX1VOVVNFRCggZXhjICk7Ci0KLQotICAgIGlmICggZGlzdGFuY2UgPj0gMCApCi0gICAgewotICAgICAgdmFsID0gZGlzdGFuY2UgKyBjb21wZW5zYXRpb247Ci0gICAgICBpZiAoIHZhbCA8IDAgKQotICAgICAgICB2YWwgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdmFsID0gZGlzdGFuY2UgLSBjb21wZW5zYXRpb247Ci0gICAgICBpZiAoIHZhbCA+IDAgKQotICAgICAgICB2YWwgPSAwOwotICAgIH0KLSAgICByZXR1cm4gdmFsOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZF9Ub19HcmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZHMgdmFsdWUgdG8gZ3JpZCBhZnRlciBhZGRpbmcgZW5naW5lIGNvbXBlbnNhdGlvbi4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkaXN0YW5jZSAgICAgOjogVGhlIGRpc3RhbmNlIHRvIHJvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbXBlbnNhdGlvbiA6OiBUaGUgZW5naW5lIGNvbXBlbnNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kZWQgZGlzdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0YyNkRvdDYKLSAgUm91bmRfVG9fR3JpZCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgY29tcGVuc2F0aW9uICkKLSAgewotICAgIEZUX0YyNkRvdDYgIHZhbDsKLQotICAgIEZUX1VOVVNFRCggZXhjICk7Ci0KLQotICAgIGlmICggZGlzdGFuY2UgPj0gMCApCi0gICAgewotICAgICAgdmFsID0gRlRfUElYX1JPVU5EKCBkaXN0YW5jZSArIGNvbXBlbnNhdGlvbiApOwotICAgICAgaWYgKCB2YWwgPCAwICkKLSAgICAgICAgdmFsID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHZhbCA9IC1GVF9QSVhfUk9VTkQoIGNvbXBlbnNhdGlvbiAtIGRpc3RhbmNlICk7Ci0gICAgICBpZiAoIHZhbCA+IDAgKQotICAgICAgICB2YWwgPSAwOwotICAgIH0KLQotICAgIHJldHVybiB2YWw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kX1RvX0hhbGZfR3JpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kcyB2YWx1ZSB0byBoYWxmIGdyaWQgYWZ0ZXIgYWRkaW5nIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRpc3RhbmNlICAgICA6OiBUaGUgZGlzdGFuY2UgdG8gcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29tcGVuc2F0aW9uIDo6IFRoZSBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRlZCBkaXN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRjI2RG90NgotICBSb3VuZF9Ub19IYWxmX0dyaWQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBjb21wZW5zYXRpb24gKQotICB7Ci0gICAgRlRfRjI2RG90NiAgdmFsOwotCi0gICAgRlRfVU5VU0VEKCBleGMgKTsKLQotCi0gICAgaWYgKCBkaXN0YW5jZSA+PSAwICkKLSAgICB7Ci0gICAgICB2YWwgPSBGVF9QSVhfRkxPT1IoIGRpc3RhbmNlICsgY29tcGVuc2F0aW9uICkgKyAzMjsKLSAgICAgIGlmICggdmFsIDwgMCApCi0gICAgICAgIHZhbCA9IDMyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdmFsID0gLSggRlRfUElYX0ZMT09SKCBjb21wZW5zYXRpb24gLSBkaXN0YW5jZSApICsgMzIgKTsKLSAgICAgIGlmICggdmFsID4gMCApCi0gICAgICAgIHZhbCA9IC0zMjsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmFsOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZF9Eb3duX1RvX0dyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZHMgdmFsdWUgZG93biB0byBncmlkIGFmdGVyIGFkZGluZyBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkaXN0YW5jZSAgICAgOjogVGhlIGRpc3RhbmNlIHRvIHJvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGNvbXBlbnNhdGlvbiA6OiBUaGUgZW5naW5lIGNvbXBlbnNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kZWQgZGlzdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0YyNkRvdDYKLSAgUm91bmRfRG93bl9Ub19HcmlkKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgY29tcGVuc2F0aW9uICkKLSAgewotICAgIEZUX0YyNkRvdDYgIHZhbDsKLQotICAgIEZUX1VOVVNFRCggZXhjICk7Ci0KLQotICAgIGlmICggZGlzdGFuY2UgPj0gMCApCi0gICAgewotICAgICAgdmFsID0gRlRfUElYX0ZMT09SKCBkaXN0YW5jZSArIGNvbXBlbnNhdGlvbiApOwotICAgICAgaWYgKCB2YWwgPCAwICkKLSAgICAgICAgdmFsID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHZhbCA9IC1GVF9QSVhfRkxPT1IoIGNvbXBlbnNhdGlvbiAtIGRpc3RhbmNlICk7Ci0gICAgICBpZiAoIHZhbCA+IDAgKQotICAgICAgICB2YWwgPSAwOwotICAgIH0KLQotICAgIHJldHVybiB2YWw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kX1VwX1RvX0dyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kcyB2YWx1ZSB1cCB0byBncmlkIGFmdGVyIGFkZGluZyBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRpc3RhbmNlICAgICA6OiBUaGUgZGlzdGFuY2UgdG8gcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29tcGVuc2F0aW9uIDo6IFRoZSBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRlZCBkaXN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRjI2RG90NgotICBSb3VuZF9VcF9Ub19HcmlkKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBjb21wZW5zYXRpb24gKQotICB7Ci0gICAgRlRfRjI2RG90NiAgdmFsOwotCi0gICAgRlRfVU5VU0VEKCBleGMgKTsKLQotCi0gICAgaWYgKCBkaXN0YW5jZSA+PSAwICkKLSAgICB7Ci0gICAgICB2YWwgPSBGVF9QSVhfQ0VJTCggZGlzdGFuY2UgKyBjb21wZW5zYXRpb24gKTsKLSAgICAgIGlmICggdmFsIDwgMCApCi0gICAgICAgIHZhbCA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB2YWwgPSAtRlRfUElYX0NFSUwoIGNvbXBlbnNhdGlvbiAtIGRpc3RhbmNlICk7Ci0gICAgICBpZiAoIHZhbCA+IDAgKQotICAgICAgICB2YWwgPSAwOwotICAgIH0KLQotICAgIHJldHVybiB2YWw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kX1RvX0RvdWJsZV9HcmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kcyB2YWx1ZSB0byBkb3VibGUgZ3JpZCBhZnRlciBhZGRpbmcgZW5naW5lIGNvbXBlbnNhdGlvbi4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRpc3RhbmNlICAgICA6OiBUaGUgZGlzdGFuY2UgdG8gcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29tcGVuc2F0aW9uIDo6IFRoZSBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRlZCBkaXN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRjI2RG90NgotICBSb3VuZF9Ub19Eb3VibGVfR3JpZCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBjb21wZW5zYXRpb24gKQotICB7Ci0gICAgRlRfRjI2RG90NiB2YWw7Ci0KLSAgICBGVF9VTlVTRUQoIGV4YyApOwotCi0KLSAgICBpZiAoIGRpc3RhbmNlID49IDAgKQotICAgIHsKLSAgICAgIHZhbCA9IEZUX1BBRF9ST1VORCggZGlzdGFuY2UgKyBjb21wZW5zYXRpb24sIDMyICk7Ci0gICAgICBpZiAoIHZhbCA8IDAgKQotICAgICAgICB2YWwgPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdmFsID0gLUZUX1BBRF9ST1VORCggY29tcGVuc2F0aW9uIC0gZGlzdGFuY2UsIDMyICk7Ci0gICAgICBpZiAoIHZhbCA+IDAgKQotICAgICAgICB2YWwgPSAwOwotICAgIH0KLQotICAgIHJldHVybiB2YWw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJvdW5kX1N1cGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFN1cGVyLXJvdW5kcyB2YWx1ZSB0byBncmlkIGFmdGVyIGFkZGluZyBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRpc3RhbmNlICAgICA6OiBUaGUgZGlzdGFuY2UgdG8gcm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgY29tcGVuc2F0aW9uIDo6IFRoZSBlbmdpbmUgY29tcGVuc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRlZCBkaXN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIFRydWVUeXBlIHNwZWNpZmljYXRpb24gc2F5cyB2ZXJ5IGZldyBhYm91dCB0aGUgcmVsYXRpb25zaGlwICAgICovCi0gIC8qICAgIGJldHdlZW4gcm91bmRpbmcgYW5kIGVuZ2luZSBjb21wZW5zYXRpb24uICBIb3dldmVyLCBpdCBzZWVtcyBmcm9tICAqLwotICAvKiAgICB0aGUgZGVzY3JpcHRpb24gb2Ygc3VwZXIgcm91bmQgdGhhdCB3ZSBzaG91bGQgYWRkIHRoZSBjb21wZW5zYXRpb24gKi8KLSAgLyogICAgYmVmb3JlIHJvdW5kaW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRjI2RG90NgotICBSb3VuZF9TdXBlciggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBjb21wZW5zYXRpb24gKQotICB7Ci0gICAgRlRfRjI2RG90NiAgdmFsOwotCi0KLSAgICBpZiAoIGRpc3RhbmNlID49IDAgKQotICAgIHsKLSAgICAgIHZhbCA9ICggZGlzdGFuY2UgLSBleGMtPnBoYXNlICsgZXhjLT50aHJlc2hvbGQgKyBjb21wZW5zYXRpb24gKSAmCi0gICAgICAgICAgICAgIC1leGMtPnBlcmlvZDsKLSAgICAgIHZhbCArPSBleGMtPnBoYXNlOwotICAgICAgaWYgKCB2YWwgPCAwICkKLSAgICAgICAgdmFsID0gZXhjLT5waGFzZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHZhbCA9IC0oICggZXhjLT50aHJlc2hvbGQgLSBleGMtPnBoYXNlIC0gZGlzdGFuY2UgKyBjb21wZW5zYXRpb24gKSAmCi0gICAgICAgICAgICAgICAtZXhjLT5wZXJpb2QgKTsKLSAgICAgIHZhbCAtPSBleGMtPnBoYXNlOwotICAgICAgaWYgKCB2YWwgPiAwICkKLSAgICAgICAgdmFsID0gLWV4Yy0+cGhhc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHZhbDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUm91bmRfU3VwZXJfNDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgU3VwZXItcm91bmRzIHZhbHVlIHRvIGdyaWQgYWZ0ZXIgYWRkaW5nIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZGlzdGFuY2UgICAgIDo6IFRoZSBkaXN0YW5jZSB0byByb3VuZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBjb21wZW5zYXRpb24gOjogVGhlIGVuZ2luZSBjb21wZW5zYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSb3VuZGVkIGRpc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGVyZSBpcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIGZvciBSb3VuZF9TdXBlcl80NSgpIGFzIHdlIG1heSBuZWVkICAgKi8KLSAgLyogICAgZ3JlYXRlciBwcmVjaXNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRjI2RG90NgotICBSb3VuZF9TdXBlcl80NSggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBjb21wZW5zYXRpb24gKQotICB7Ci0gICAgRlRfRjI2RG90NiAgdmFsOwotCi0KLSAgICBpZiAoIGRpc3RhbmNlID49IDAgKQotICAgIHsKLSAgICAgIHZhbCA9ICggKCBkaXN0YW5jZSAtIGV4Yy0+cGhhc2UgKyBleGMtPnRocmVzaG9sZCArIGNvbXBlbnNhdGlvbiApIC8KLSAgICAgICAgICAgICAgICBleGMtPnBlcmlvZCApICogZXhjLT5wZXJpb2Q7Ci0gICAgICB2YWwgKz0gZXhjLT5waGFzZTsKLSAgICAgIGlmICggdmFsIDwgMCApCi0gICAgICAgIHZhbCA9IGV4Yy0+cGhhc2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB2YWwgPSAtKCAoICggZXhjLT50aHJlc2hvbGQgLSBleGMtPnBoYXNlIC0gZGlzdGFuY2UgKyBjb21wZW5zYXRpb24gKSAvCi0gICAgICAgICAgICAgICAgICAgZXhjLT5wZXJpb2QgKSAqIGV4Yy0+cGVyaW9kICk7Ci0gICAgICB2YWwgLT0gZXhjLT5waGFzZTsKLSAgICAgIGlmICggdmFsID4gMCApCi0gICAgICAgIHZhbCA9IC1leGMtPnBoYXNlOwotICAgIH0KLQotICAgIHJldHVybiB2YWw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGVfUm91bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFNldHMgdGhlIHJvdW5kaW5nIG1vZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJvdW5kX21vZGUgOjogVGhlIHJvdW5kaW5nIG1vZGUgdG8gYmUgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgQ29tcHV0ZV9Sb3VuZCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgICAgRlRfQnl0ZSAgICAgICAgIHJvdW5kX21vZGUgKQotICB7Ci0gICAgc3dpdGNoICggcm91bmRfbW9kZSApCi0gICAgewotICAgIGNhc2UgVFRfUm91bmRfT2ZmOgotICAgICAgZXhjLT5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfTm9uZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUVF9Sb3VuZF9Ub19HcmlkOgotICAgICAgZXhjLT5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfVG9fR3JpZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUVF9Sb3VuZF9VcF9Ub19HcmlkOgotICAgICAgZXhjLT5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfVXBfVG9fR3JpZDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUVF9Sb3VuZF9Eb3duX1RvX0dyaWQ6Ci0gICAgICBleGMtPmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9Eb3duX1RvX0dyaWQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVFRfUm91bmRfVG9fSGFsZl9HcmlkOgotICAgICAgZXhjLT5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfVG9fSGFsZl9HcmlkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFRUX1JvdW5kX1RvX0RvdWJsZV9HcmlkOgotICAgICAgZXhjLT5mdW5jX3JvdW5kID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfVG9fRG91YmxlX0dyaWQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVFRfUm91bmRfU3VwZXI6Ci0gICAgICBleGMtPmZ1bmNfcm91bmQgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9TdXBlcjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUVF9Sb3VuZF9TdXBlcl80NToKLSAgICAgIGV4Yy0+ZnVuY19yb3VuZCA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX1N1cGVyXzQ1OwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZXRTdXBlclJvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBTZXRzIFN1cGVyIFJvdW5kIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHcmlkUGVyaW9kIDo6IFRoZSBncmlkIHBlcmlvZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNlbGVjdG9yICAgOjogVGhlIFNST1VORCBvcGNvZGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgU2V0U3VwZXJSb3VuZCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgICAgRlRfRjJEb3QxNCAgICAgIEdyaWRQZXJpb2QsCi0gICAgICAgICAgICAgICAgIEZUX0xvbmcgICAgICAgICBzZWxlY3RvciApCi0gIHsKLSAgICBzd2l0Y2ggKCAoRlRfSW50KSggc2VsZWN0b3IgJiAweEMwICkgKQotICAgIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgZXhjLT5wZXJpb2QgPSBHcmlkUGVyaW9kIC8gMjsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMHg0MDoKLSAgICAgICAgZXhjLT5wZXJpb2QgPSBHcmlkUGVyaW9kOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAweDgwOgotICAgICAgICBleGMtPnBlcmlvZCA9IEdyaWRQZXJpb2QgKiAyOwotICAgICAgICBicmVhazsKLQotICAgICAgLyogVGhpcyBvcGNvZGUgaXMgcmVzZXJ2ZWQsIGJ1dC4uLiAqLwotICAgICAgY2FzZSAweEMwOgotICAgICAgICBleGMtPnBlcmlvZCA9IEdyaWRQZXJpb2Q7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHN3aXRjaCAoIChGVF9JbnQpKCBzZWxlY3RvciAmIDB4MzAgKSApCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIGV4Yy0+cGhhc2UgPSAwOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDB4MTA6Ci0gICAgICBleGMtPnBoYXNlID0gZXhjLT5wZXJpb2QgLyA0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDB4MjA6Ci0gICAgICBleGMtPnBoYXNlID0gZXhjLT5wZXJpb2QgLyAyOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDB4MzA6Ci0gICAgICBleGMtPnBoYXNlID0gZXhjLT5wZXJpb2QgKiAzIC8gNDsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmICggKCBzZWxlY3RvciAmIDB4MEYgKSA9PSAwICkKLSAgICAgIGV4Yy0+dGhyZXNob2xkID0gZXhjLT5wZXJpb2QgLSAxOwotICAgIGVsc2UKLSAgICAgIGV4Yy0+dGhyZXNob2xkID0gKCAoRlRfSW50KSggc2VsZWN0b3IgJiAweDBGICkgLSA0ICkgKiBleGMtPnBlcmlvZCAvIDg7Ci0KLSAgICAvKiBjb252ZXJ0IHRvIEYyNkRvdDYgZm9ybWF0ICovCi0gICAgZXhjLT5wZXJpb2QgICAgPj49IDg7Ci0gICAgZXhjLT5waGFzZSAgICAgPj49IDg7Ci0gICAgZXhjLT50aHJlc2hvbGQgPj49IDg7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFByb2plY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGVzIHRoZSBwcm9qZWN0aW9uIG9mIHZlY3RvciBnaXZlbiBieSAodjItdjEpIGFsb25nIHRoZSAgICAgICAqLwotICAvKiAgICBjdXJyZW50IHByb2plY3Rpb24gdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2MSA6OiBGaXJzdCBpbnB1dCB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdjIgOjogU2Vjb25kIGlucHV0IHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGRpc3RhbmNlIGluIEYyNmRvdDYgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRjI2RG90NgotICBQcm9qZWN0KCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICBGVF9Qb3MgICAgICAgICAgZHgsCi0gICAgICAgICAgIEZUX1BvcyAgICAgICAgICBkeSApCi0gIHsKLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORwotICAgIEZUX0FTU0VSVCggIWV4Yy0+ZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICk7Ci0jZW5kaWYKLQotICAgIHJldHVybiBUVF9Eb3RGaXgxNCggZHgsIGR5LAotICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5HUy5wcm9qVmVjdG9yLngsCi0gICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLnByb2pWZWN0b3IueSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBEdWFsX1Byb2plY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlcyB0aGUgcHJvamVjdGlvbiBvZiB0aGUgdmVjdG9yIGdpdmVuIGJ5ICh2Mi12MSkgYWxvbmcgdGhlICAgKi8KLSAgLyogICAgY3VycmVudCBkdWFsIHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdjEgOjogRmlyc3QgaW5wdXQgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHYyIDo6IFNlY29uZCBpbnB1dCB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBkaXN0YW5jZSBpbiBGMjZkb3Q2IGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIEZUX0YyNkRvdDYKLSAgRHVhbF9Qcm9qZWN0KCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgICBkeCwKLSAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICAgZHkgKQotICB7Ci0gICAgcmV0dXJuIFRUX0RvdEZpeDE0KCBkeCwgZHksCi0gICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLmR1YWxWZWN0b3IueCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+R1MuZHVhbFZlY3Rvci55ICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFByb2plY3RfeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIENvbXB1dGVzIHRoZSBwcm9qZWN0aW9uIG9mIHRoZSB2ZWN0b3IgZ2l2ZW4gYnkgKHYyLXYxKSBhbG9uZyB0aGUgICAqLwotICAvKiAgICBob3Jpem9udGFsIGF4aXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2MSA6OiBGaXJzdCBpbnB1dCB2ZWN0b3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdjIgOjogU2Vjb25kIGlucHV0IHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhlIGRpc3RhbmNlIGluIEYyNmRvdDYgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfRjI2RG90NgotICBQcm9qZWN0X3goIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgRlRfUG9zICAgICAgICAgIGR4LAotICAgICAgICAgICAgIEZUX1BvcyAgICAgICAgICBkeSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGV4YyApOwotICAgIEZUX1VOVVNFRCggZHkgKTsKLQotICAgIHJldHVybiBkeDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUHJvamVjdF95ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgQ29tcHV0ZXMgdGhlIHByb2plY3Rpb24gb2YgdGhlIHZlY3RvciBnaXZlbiBieSAodjItdjEpIGFsb25nIHRoZSAgICovCi0gIC8qICAgIHZlcnRpY2FsIGF4aXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHYxIDo6IEZpcnN0IGlucHV0IHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB2MiA6OiBTZWNvbmQgaW5wdXQgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgZGlzdGFuY2UgaW4gRjI2ZG90NiBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9GMjZEb3Q2Ci0gIFByb2plY3RfeSggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICAgZHgsCi0gICAgICAgICAgICAgRlRfUG9zICAgICAgICAgIGR5ICkKLSAgewotICAgIEZUX1VOVVNFRCggZXhjICk7Ci0gICAgRlRfVU5VU0VEKCBkeCApOwotCi0gICAgcmV0dXJuIGR5OwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlX0Z1bmNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBDb21wdXRlcyB0aGUgcHJvamVjdGlvbiBhbmQgbW92ZW1lbnQgZnVuY3Rpb24gcG9pbnRlcnMgYWNjb3JkaW5nICAgKi8KLSAgLyogICAgdG8gdGhlIGN1cnJlbnQgZ3JhcGhpY3Mgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBDb21wdXRlX0Z1bmNzKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCi0gICAgaWYgKCBleGMtPmZhY2UtPnVucGF0ZW50ZWRfaGludGluZyApCi0gICAgewotICAgICAgLyogSWYgYm90aCB2ZWN0b3JzIHBvaW50IHJpZ2h0d2FyZHMgYWxvbmcgdGhlIHggYXhpcywgc2V0ICAgICAgICAgICovCi0gICAgICAvKiBgYm90aC14LWF4aXMnIHRydWUsIG90aGVyd2lzZSBzZXQgaXQgZmFsc2UuICBUaGUgeCB2YWx1ZXMgb25seSAgKi8KLSAgICAgIC8qIG5lZWQgYmUgdGVzdGVkIGJlY2F1c2UgdGhlIHZlY3RvciBoYXMgYmVlbiBub3JtYWxpc2VkIHRvIGEgdW5pdCAqLwotICAgICAgLyogdmVjdG9yIG9mIGxlbmd0aCAweDQwMDAgPSB1bml0eS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICBleGMtPkdTLmJvdGhfeF9heGlzID0gKEZUX0Jvb2wpKCBleGMtPkdTLnByb2pWZWN0b3IueCA9PSAweDQwMDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci54ID09IDB4NDAwMCApOwotCi0gICAgICAvKiBUaHJvdyBhd2F5IHByb2plY3Rpb24gYW5kIGZyZWVkb20gdmVjdG9yIGluZm9ybWF0aW9uICovCi0gICAgICAvKiBiZWNhdXNlIHRoZSBwYXRlbnRzIGRvbid0IGFsbG93IHRoZW0gdG8gYmUgc3RvcmVkLiAgICovCi0gICAgICAvKiBUaGUgcmVsZXZhbnQgVVMgUGF0ZW50cyBhcmUgNTE1NTgwNSBhbmQgNTMyNTQ3OS4gICAgICovCi0gICAgICBleGMtPkdTLnByb2pWZWN0b3IueCA9IDA7Ci0gICAgICBleGMtPkdTLnByb2pWZWN0b3IueSA9IDA7Ci0gICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCA9IDA7Ci0gICAgICBleGMtPkdTLmZyZWVWZWN0b3IueSA9IDA7Ci0KLSAgICAgIGlmICggZXhjLT5HUy5ib3RoX3hfYXhpcyApCi0gICAgICB7Ci0gICAgICAgIGV4Yy0+ZnVuY19wcm9qZWN0ICAgPSBQcm9qZWN0X3g7Ci0gICAgICAgIGV4Yy0+ZnVuY19tb3ZlICAgICAgPSBEaXJlY3RfTW92ZV9YOwotICAgICAgICBleGMtPmZ1bmNfbW92ZV9vcmlnID0gRGlyZWN0X01vdmVfT3JpZ19YOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBleGMtPmZ1bmNfcHJvamVjdCAgID0gUHJvamVjdF95OwotICAgICAgICBleGMtPmZ1bmNfbW92ZSAgICAgID0gRGlyZWN0X01vdmVfWTsKLSAgICAgICAgZXhjLT5mdW5jX21vdmVfb3JpZyA9IERpcmVjdF9Nb3ZlX09yaWdfWTsKLSAgICAgIH0KLQotICAgICAgaWYgKCBleGMtPkdTLmR1YWxWZWN0b3IueCA9PSAweDQwMDAgKQotICAgICAgICBleGMtPmZ1bmNfZHVhbHByb2ogPSBQcm9qZWN0X3g7Ci0gICAgICBlbHNlIGlmICggZXhjLT5HUy5kdWFsVmVjdG9yLnkgPT0gMHg0MDAwICkKLSAgICAgICAgZXhjLT5mdW5jX2R1YWxwcm9qID0gUHJvamVjdF95OwotICAgICAgZWxzZQotICAgICAgICBleGMtPmZ1bmNfZHVhbHByb2ogPSBEdWFsX1Byb2plY3Q7Ci0KLSAgICAgIC8qIEZvcmNlIHJlY2FsY3VsYXRpb24gb2YgY2FjaGVkIGFzcGVjdCByYXRpbyAqLwotICAgICAgZXhjLT50dF9tZXRyaWNzLnJhdGlvID0gMDsKLQotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORyAqLwotCi0gICAgaWYgKCBleGMtPkdTLmZyZWVWZWN0b3IueCA9PSAweDQwMDAgKQotICAgICAgZXhjLT5GX2RvdF9QID0gZXhjLT5HUy5wcm9qVmVjdG9yLng7Ci0gICAgZWxzZSBpZiAoIGV4Yy0+R1MuZnJlZVZlY3Rvci55ID09IDB4NDAwMCApCi0gICAgICBleGMtPkZfZG90X1AgPSBleGMtPkdTLnByb2pWZWN0b3IueTsKLSAgICBlbHNlCi0gICAgICBleGMtPkZfZG90X1AgPQotICAgICAgICAoIChGVF9Mb25nKWV4Yy0+R1MucHJvalZlY3Rvci54ICogZXhjLT5HUy5mcmVlVmVjdG9yLnggKwotICAgICAgICAgIChGVF9Mb25nKWV4Yy0+R1MucHJvalZlY3Rvci55ICogZXhjLT5HUy5mcmVlVmVjdG9yLnkgKSA+PiAxNDsKLQotICAgIGlmICggZXhjLT5HUy5wcm9qVmVjdG9yLnggPT0gMHg0MDAwICkKLSAgICAgIGV4Yy0+ZnVuY19wcm9qZWN0ID0gKFRUX1Byb2plY3RfRnVuYylQcm9qZWN0X3g7Ci0gICAgZWxzZSBpZiAoIGV4Yy0+R1MucHJvalZlY3Rvci55ID09IDB4NDAwMCApCi0gICAgICBleGMtPmZ1bmNfcHJvamVjdCA9IChUVF9Qcm9qZWN0X0Z1bmMpUHJvamVjdF95OwotICAgIGVsc2UKLSAgICAgIGV4Yy0+ZnVuY19wcm9qZWN0ID0gKFRUX1Byb2plY3RfRnVuYylQcm9qZWN0OwotCi0gICAgaWYgKCBleGMtPkdTLmR1YWxWZWN0b3IueCA9PSAweDQwMDAgKQotICAgICAgZXhjLT5mdW5jX2R1YWxwcm9qID0gKFRUX1Byb2plY3RfRnVuYylQcm9qZWN0X3g7Ci0gICAgZWxzZSBpZiAoIGV4Yy0+R1MuZHVhbFZlY3Rvci55ID09IDB4NDAwMCApCi0gICAgICBleGMtPmZ1bmNfZHVhbHByb2ogPSAoVFRfUHJvamVjdF9GdW5jKVByb2plY3RfeTsKLSAgICBlbHNlCi0gICAgICBleGMtPmZ1bmNfZHVhbHByb2ogPSAoVFRfUHJvamVjdF9GdW5jKUR1YWxfUHJvamVjdDsKLQotICAgIGV4Yy0+ZnVuY19tb3ZlICAgICAgPSAoVFRfTW92ZV9GdW5jKURpcmVjdF9Nb3ZlOwotICAgIGV4Yy0+ZnVuY19tb3ZlX29yaWcgPSAoVFRfTW92ZV9GdW5jKURpcmVjdF9Nb3ZlX09yaWc7Ci0KLSAgICBpZiAoIGV4Yy0+Rl9kb3RfUCA9PSAweDQwMDBMICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+R1MuZnJlZVZlY3Rvci54ID09IDB4NDAwMCApCi0gICAgICB7Ci0gICAgICAgIGV4Yy0+ZnVuY19tb3ZlICAgICAgPSAoVFRfTW92ZV9GdW5jKURpcmVjdF9Nb3ZlX1g7Ci0gICAgICAgIGV4Yy0+ZnVuY19tb3ZlX29yaWcgPSAoVFRfTW92ZV9GdW5jKURpcmVjdF9Nb3ZlX09yaWdfWDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKCBleGMtPkdTLmZyZWVWZWN0b3IueSA9PSAweDQwMDAgKQotICAgICAgewotICAgICAgICBleGMtPmZ1bmNfbW92ZSAgICAgID0gKFRUX01vdmVfRnVuYylEaXJlY3RfTW92ZV9ZOwotICAgICAgICBleGMtPmZ1bmNfbW92ZV9vcmlnID0gKFRUX01vdmVfRnVuYylEaXJlY3RfTW92ZV9PcmlnX1k7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogYXQgc21hbGwgc2l6ZXMsIEZfZG90X1AgY2FuIGJlY29tZSB0b28gc21hbGwsIHJlc3VsdGluZyAgICovCi0gICAgLyogaW4gb3ZlcmZsb3dzIGFuZCBgc3Bpa2VzJyBpbiBhIG51bWJlciBvZiBnbHlwaHMgbGlrZSBgdycuICovCi0KLSAgICBpZiAoIEZUX0FCUyggZXhjLT5GX2RvdF9QICkgPCAweDQwMEwgKQotICAgICAgZXhjLT5GX2RvdF9QID0gMHg0MDAwTDsKLQotICAgIC8qIERpc2FibGUgY2FjaGVkIGFzcGVjdCByYXRpbyAqLwotICAgIGV4Yy0+dHRfbWV0cmljcy5yYXRpbyA9IDA7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vcm1hbGl6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE5vcm1zIGEgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFZ4IDo6IFRoZSBob3Jpem9udGFsIGlucHV0IHZlY3RvciBjb29yZGluYXRlLiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBWeSA6OiBUaGUgdmVydGljYWwgaW5wdXQgdmVjdG9yIGNvb3JkaW5hdGUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSICA6OiBUaGUgbm9ybWVkIHVuaXQgdmVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSZXR1cm5zIEZBSUxVUkUgaWYgYSB2ZWN0b3IgcGFyYW1ldGVyIGlzIHplcm8uICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxOb3RlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbiBjYXNlIFZ4IGFuZCBWeSBhcmUgYm90aCB6ZXJvLCBgTm9ybWFsaXplJyByZXR1cm5zIFNVQ0NFU1MsIGFuZCAgKi8KLSAgLyogICAgUiBpcyB1bmRlZmluZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgRlRfQm9vbAotICBOb3JtYWxpemUoIEZUX0YyNkRvdDYgICAgICBWeCwKLSAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgVnksCi0gICAgICAgICAgICAgRlRfVW5pdFZlY3RvciogIFIgKQotICB7Ci0gICAgRlRfVmVjdG9yIFY7Ci0KLQotICAgIGlmICggVnggPT0gMCAmJiBWeSA9PSAwICkKLSAgICB7Ci0gICAgICAvKiBYWFg6IFVORE9DVU1FTlRFRCEgSXQgc2VlbXMgdGhhdCBpdCBpcyBwb3NzaWJsZSB0byB0cnkgICAqLwotICAgICAgLyogICAgICB0byBub3JtYWxpemUgdGhlIHZlY3RvciAoMCwwKS4gIFJldHVybiBpbW1lZGlhdGVseS4gKi8KLSAgICAgIHJldHVybiBTVUNDRVNTOwotICAgIH0KLQotICAgIFYueCA9IFZ4OwotICAgIFYueSA9IFZ5OwotCi0gICAgRlRfVmVjdG9yX05vcm1MZW4oICZWICk7Ci0KLSAgICBSLT54ID0gKEZUX0YyRG90MTQpKCBWLnggLyA0ICk7Ci0gICAgUi0+eSA9IChGVF9GMkRvdDE0KSggVi55IC8gNCApOwotCi0gICAgcmV0dXJuIFNVQ0NFU1M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSGVyZSB3ZSBzdGFydCB3aXRoIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdmFyaW91cyBvcGNvZGVzLiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIEFSUkFZX0JPVU5EX0VSUk9SICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7IFwKLSAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gd2hpbGUgKDApCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1QUEVNW106ICAgICAgTWVhc3VyZSBQaXhlbCBQZXIgRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gRXVpbnQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfTVBQRU0oIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgYXJnc1swXSA9IGV4Yy0+ZnVuY19jdXJfcHBlbSggZXhjICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTVBTW106ICAgICAgICBNZWFzdXJlIFBvaW50IFNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg0QyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiBFdWludDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19NUFMoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIC8qIE5vdGU6IFRoZSBwb2ludCBzaXplIHNob3VsZCBiZSBpcnJlbGV2YW50IGluIGEgZ2l2ZW4gZm9udCBwcm9ncmFtOyAqLwotICAgIC8qICAgICAgIHdlIHRodXMgZGVjaWRlIHRvIHJldHVybiBvbmx5IHRoZSBQUEVNIHZhbHVlLiAgICAgICAgICAgICAgICAqLwotI2lmIDAKLSAgICBhcmdzWzBdID0gZXhjLT5tZXRyaWNzLnBvaW50U2l6ZTsKLSNlbHNlCi0gICAgYXJnc1swXSA9IGV4Yy0+ZnVuY19jdXJfcHBlbSggZXhjICk7Ci0jZW5kaWYKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEVVBbXTogICAgICAgIERVUGxpY2F0ZSB0aGUgc3RhY2sncyB0b3AgZWxlbWVudCAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IC0tPiBTdGtFbHQgU3RrRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0RVUCggRlRfTG9uZyogIGFyZ3MgKQotICB7Ci0gICAgYXJnc1sxXSA9IGFyZ3NbMF07Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUE9QW106ICAgICAgICBQT1AgdGhlIHN0YWNrJ3MgdG9wIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIFN0a0VsdCAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19QT1AoIHZvaWQgKQotICB7Ci0gICAgLyogbm90aGluZyB0byBkbyAqLwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIENMRUFSW106ICAgICAgQ0xFQVIgdGhlIGVudGlyZSBzdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBTdGtFbHQuLi4gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfQ0xFQVIoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQotICB7Ci0gICAgZXhjLT5uZXdfdG9wID0gMDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTV0FQW106ICAgICAgIFNXQVAgdGhlIHN0YWNrJ3MgdG9wIHR3byBlbGVtZW50cyAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDIzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgMiAqIFN0a0VsdCAtLT4gMiAqIFN0a0VsdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NXQVAoIEZUX0xvbmcqICBhcmdzICkKLSAgewotICAgIEZUX0xvbmcgIEw7Ci0KLQotICAgIEwgICAgICAgPSBhcmdzWzBdOwotICAgIGFyZ3NbMF0gPSBhcmdzWzFdOwotICAgIGFyZ3NbMV0gPSBMOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERFUFRIW106ICAgICAgcmV0dXJuIHRoZSBzdGFjayBERVBUSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfREVQVEgoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgYXJnc1swXSA9IGV4Yy0+dG9wOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIExUW106ICAgICAgICAgTGVzcyBUaGFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBpbnQzMj8gaW50MzI/IC0tPiBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfTFQoIEZUX0xvbmcqICBhcmdzICkKLSAgewotICAgIGFyZ3NbMF0gPSAoIGFyZ3NbMF0gPCBhcmdzWzFdICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTFRFUVtdOiAgICAgICBMZXNzIFRoYW4gb3IgRVF1YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGludDMyPyBpbnQzMj8gLS0+IGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19MVEVRKCBGVF9Mb25nKiAgYXJncyApCi0gIHsKLSAgICBhcmdzWzBdID0gKCBhcmdzWzBdIDw9IGFyZ3NbMV0gKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHVFtdOiAgICAgICAgIEdyZWF0ZXIgVGhhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IGludDMyPyAtLT4gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0dUKCBGVF9Mb25nKiAgYXJncyApCi0gIHsKLSAgICBhcmdzWzBdID0gKCBhcmdzWzBdID4gYXJnc1sxXSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEdURVFbXTogICAgICAgR3JlYXRlciBUaGFuIG9yIEVRdWFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBpbnQzMj8gaW50MzI/IC0tPiBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfR1RFUSggRlRfTG9uZyogIGFyZ3MgKQotICB7Ci0gICAgYXJnc1swXSA9ICggYXJnc1swXSA+PSBhcmdzWzFdICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRVFbXTogICAgICAgICBFUXVhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIFN0a0VsdCBTdGtFbHQgLS0+IGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19FUSggRlRfTG9uZyogIGFyZ3MgKQotICB7Ci0gICAgYXJnc1swXSA9ICggYXJnc1swXSA9PSBhcmdzWzFdICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTkVRW106ICAgICAgICBOb3QgRVF1YWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIFN0a0VsdCBTdGtFbHQgLS0+IGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19ORVEoIEZUX0xvbmcqICBhcmdzICkKLSAgewotICAgIGFyZ3NbMF0gPSAoIGFyZ3NbMF0gIT0gYXJnc1sxXSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9ERFtdOiAgICAgICAgSXMgT0REICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfT0REKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBhcmdzWzBdID0gKCAoIGV4Yy0+ZnVuY19yb3VuZCggZXhjLCBhcmdzWzBdLCAwICkgJiAxMjcgKSA9PSA2NCApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEVWRU5bXTogICAgICAgSXMgRVZFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfRVZFTiggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIGFyZ3NbMF0gPSAoICggZXhjLT5mdW5jX3JvdW5kKCBleGMsIGFyZ3NbMF0sIDAgKSAmIDEyNyApID09IDAgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBTkRbXTogICAgICAgIGxvZ2ljYWwgQU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDVBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4gdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0FORCggRlRfTG9uZyogIGFyZ3MgKQotICB7Ci0gICAgYXJnc1swXSA9ICggYXJnc1swXSAmJiBhcmdzWzFdICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT1JbXTogICAgICAgICBsb2dpY2FsIE9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1QiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+IHVpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19PUiggRlRfTG9uZyogIGFyZ3MgKQotICB7Ci0gICAgYXJnc1swXSA9ICggYXJnc1swXSB8fCBhcmdzWzFdICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTk9UW106ICAgICAgICBsb2dpY2FsIE5PVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1QyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIFN0a0VsdCAtLT4gdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19OT1QoIEZUX0xvbmcqICBhcmdzICkKLSAgewotICAgIGFyZ3NbMF0gPSAhYXJnc1swXTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBRERbXTogICAgICAgIEFERCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDYwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0FERCggRlRfTG9uZyogIGFyZ3MgKQotICB7Ci0gICAgYXJnc1swXSArPSBhcmdzWzFdOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNVQltdOiAgICAgICAgU1VCdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiBmMjYuNiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU1VCKCBGVF9Mb25nKiAgYXJncyApCi0gIHsKLSAgICBhcmdzWzBdIC09IGFyZ3NbMV07Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRElWW106ICAgICAgICBESVZpZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg2MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IGYyNi42IC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19ESVYoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIGlmICggYXJnc1sxXSA9PSAwICkKLSAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggRGl2aWRlX0J5X1plcm8gKTsKLSAgICBlbHNlCi0gICAgICBhcmdzWzBdID0gRlRfTXVsRGl2X05vX1JvdW5kKCBhcmdzWzBdLCA2NEwsIGFyZ3NbMV0gKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNVUxbXTogICAgICAgIE1VTHRpcGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX01VTCggRlRfTG9uZyogIGFyZ3MgKQotICB7Ci0gICAgYXJnc1swXSA9IEZUX011bERpdiggYXJnc1swXSwgYXJnc1sxXSwgNjRMICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQUJTW106ICAgICAgICBBQlNvbHV0ZSB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19BQlMoIEZUX0xvbmcqICBhcmdzICkKLSAgewotICAgIGFyZ3NbMF0gPSBGVF9BQlMoIGFyZ3NbMF0gKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBORUdbXTogICAgICAgIE5FR2F0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDY1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiBmMjYuNiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX05FRyggRlRfTG9uZyogIGFyZ3MgKQotICB7Ci0gICAgYXJnc1swXSA9IC1hcmdzWzBdOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZMT09SW106ICAgICAgRkxPT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfRkxPT1IoIEZUX0xvbmcqICBhcmdzICkKLSAgewotICAgIGFyZ3NbMF0gPSBGVF9QSVhfRkxPT1IoIGFyZ3NbMF0gKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBDRUlMSU5HW106ICAgIENFSUxJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDY3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0NFSUxJTkcoIEZUX0xvbmcqICBhcmdzICkKLSAgewotICAgIGFyZ3NbMF0gPSBGVF9QSVhfQ0VJTCggYXJnc1swXSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJTW106ICAgICAgICAgUmVhZCBTdG9yZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+IHVpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfUlMoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0KLSAgICBGVF9VTG9uZyAgSSA9IChGVF9VTG9uZylhcmdzWzBdOwotCi0KLSAgICBpZiAoIEJPVU5EU0woIEksIGV4Yy0+c3RvcmVTaXplICkgKQotICAgIHsKLSAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgQVJSQVlfQk9VTkRfRVJST1I7Ci0gICAgICBlbHNlCi0gICAgICAgIGFyZ3NbMF0gPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogc3VicGl4ZWwgaGludGluZyAtIGF2b2lkIFR5cGVtYW4gRHN0cm9rZSBhbmQgKi8KLSAgICAgIC8qIElTdHJva2UgYW5kIFZhY3Vmb3JtIHJvdW5kcyAgICAgICAgICAgICAgICAgICovCi0gICAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAoICggSSA9PSAyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICggZXhjLT5mYWNlLT5zcGhfZm91bmRfZnVuY19mbGFncyAmCi0gICAgICAgICAgICAgICAgICggU1BIX0ZERUZfU1BBQ0lOR18xIHwKLSAgICAgICAgICAgICAgICAgICBTUEhfRkRFRl9TUEFDSU5HXzIgKSAgICAgICAgICApICkgfHwKLSAgICAgICAgICAgICAoIEkgPT0gMjIgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICggZXhjLT5zcGhfaW5fZnVuY19mbGFncyAgICYKLSAgICAgICAgICAgICAgICAgU1BIX0ZERUZfVFlQRU1BTl9TVFJPS0VTICkgKSAgICAgICAgfHwKLSAgICAgICAgICAgICAoIEkgPT0gOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAoIGV4Yy0+ZmFjZS0+c3BoX2ZvdW5kX2Z1bmNfZmxhZ3MgJgotICAgICAgICAgICAgICAgICBTUEhfRkRFRl9WQUNVRk9STV9ST1VORF8xICAgICAgICkgJiYKLSAgICAgICAgICAgICAgIGV4Yy0+aXVwX2NhbGxlZCAgICAgICAgICAgICAgICAgICAgICkgKSApCi0gICAgICAgIGFyZ3NbMF0gPSAwOwotICAgICAgZWxzZQotICAgICAgICBhcmdzWzBdID0gZXhjLT5zdG9yYWdlW0ldOwotICAgIH0KLQotI2Vsc2UgLyogIVRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwotCi0gICAgRlRfVUxvbmcgIEkgPSAoRlRfVUxvbmcpYXJnc1swXTsKLQotCi0gICAgaWYgKCBCT1VORFNMKCBJLCBleGMtPnN0b3JlU2l6ZSApICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIEFSUkFZX0JPVU5EX0VSUk9SOwotICAgICAgZWxzZQotICAgICAgICBhcmdzWzBdID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgYXJnc1swXSA9IGV4Yy0+c3RvcmFnZVtJXTsKLQotI2VuZGlmIC8qICFUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXU1tdOiAgICAgICAgIFdyaXRlIFN0b3JlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1dTKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VMb25nICBJID0gKEZUX1VMb25nKWFyZ3NbMF07Ci0KLQotICAgIGlmICggQk9VTkRTTCggSSwgZXhjLT5zdG9yZVNpemUgKSApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBBUlJBWV9CT1VORF9FUlJPUjsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZXhjLT5zdG9yYWdlW0ldID0gYXJnc1sxXTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBXQ1ZUUFtdOiAgICAgIFdyaXRlIENWVCBpbiBQaXhlbCB1bml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZjI2LjYgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1dDVlRQKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VMb25nICBJID0gKEZUX1VMb25nKWFyZ3NbMF07Ci0KLQotICAgIGlmICggQk9VTkRTTCggSSwgZXhjLT5jdnRTaXplICkgKQotICAgIHsKLSAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgQVJSQVlfQk9VTkRfRVJST1I7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGV4Yy0+ZnVuY193cml0ZV9jdnQoIGV4YywgSSwgYXJnc1sxXSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFdDVlRGW106ICAgICAgV3JpdGUgQ1ZUIGluIEZ1bml0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfV0NWVEYoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVUxvbmcgIEkgPSAoRlRfVUxvbmcpYXJnc1swXTsKLQotCi0gICAgaWYgKCBCT1VORFNMKCBJLCBleGMtPmN2dFNpemUgKSApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBBUlJBWV9CT1VORF9FUlJPUjsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZXhjLT5jdnRbSV0gPSBGVF9NdWxGaXgoIGFyZ3NbMV0sIGV4Yy0+dHRfbWV0cmljcy5zY2FsZSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJDVlRbXTogICAgICAgUmVhZCBDVlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+IGYyNi42ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfUkNWVCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VMb25nICBJID0gKEZUX1VMb25nKWFyZ3NbMF07Ci0KLQotICAgIGlmICggQk9VTkRTTCggSSwgZXhjLT5jdnRTaXplICkgKQotICAgIHsKLSAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgQVJSQVlfQk9VTkRfRVJST1I7Ci0gICAgICBlbHNlCi0gICAgICAgIGFyZ3NbMF0gPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBhcmdzWzBdID0gZXhjLT5mdW5jX3JlYWRfY3Z0KCBleGMsIEkgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBQVtdOiAgICAgICAgIEFkanVzdCBBbmdsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDdGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0FBKCB2b2lkICkKLSAgewotICAgIC8qIGludGVudGlvbmFsbHkgbm8gbG9uZ2VyIHN1cHBvcnRlZCAqLwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERFQlVHW106ICAgICAgREVCVUcuICBVbnN1cHBvcnRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOb3RlOiBUaGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gcG9wcyBhIHZhbHVlIGZyb20gdGhlIHN0YWNrLiAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19ERUJVRyggVFRfRXhlY0NvbnRleHQgIGV4YyApCi0gIHsKLSAgICBleGMtPmVycm9yID0gRlRfVEhST1coIERlYnVnX09wQ29kZSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJPVU5EW2FiXTogICAgUk9VTkQgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NjgtMHg2QiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfUk9VTkQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgYXJnc1swXSA9IGV4Yy0+ZnVuY19yb3VuZCgKLSAgICAgICAgICAgICAgICBleGMsCi0gICAgICAgICAgICAgICAgYXJnc1swXSwKLSAgICAgICAgICAgICAgICBleGMtPnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1tleGMtPm9wY29kZSAtIDB4NjhdICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTlJPVU5EW2FiXTogICBObyBST1VORGluZyBvZiB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg2Qy0weDZGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyNi42IC0tPiBmMjYuNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19OUk9VTkQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIGFyZ3NbMF0gPSBSb3VuZF9Ob25lKAotICAgICAgICAgICAgICAgIGV4YywKLSAgICAgICAgICAgICAgICBhcmdzWzBdLAotICAgICAgICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zW2V4Yy0+b3Bjb2RlIC0gMHg2Q10gKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNQVhbXTogICAgICAgIE1BWGltdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IGludDMyPyAtLT4gaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX01BWCggRlRfTG9uZyogIGFyZ3MgKQotICB7Ci0gICAgaWYgKCBhcmdzWzFdID4gYXJnc1swXSApCi0gICAgICBhcmdzWzBdID0gYXJnc1sxXTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNSU5bXTogICAgICAgIE1JTmltdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDY5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IGludDMyPyAtLT4gaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX01JTiggRlRfTG9uZyogIGFyZ3MgKQotICB7Ci0gICAgaWYgKCBhcmdzWzFdIDwgYXJnc1swXSApCi0gICAgICBhcmdzWzBdID0gYXJnc1sxXTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNSU5ERVhbXTogICAgIE1vdmUgSU5ERVhlZCBlbGVtZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDI2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IC0tPiBTdGtFbHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX01JTkRFWCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfTG9uZyAgTCwgSzsKLQotCi0gICAgTCA9IGFyZ3NbMF07Ci0KLSAgICBpZiAoIEwgPD0gMCB8fCBMID4gZXhjLT5hcmdzICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEsgPSBleGMtPnN0YWNrW2V4Yy0+YXJncyAtIExdOwotCi0gICAgICBGVF9BUlJBWV9NT1ZFKCAmZXhjLT5zdGFja1tleGMtPmFyZ3MgLSBMICAgIF0sCi0gICAgICAgICAgICAgICAgICAgICAmZXhjLT5zdGFja1tleGMtPmFyZ3MgLSBMICsgMV0sCi0gICAgICAgICAgICAgICAgICAgICAoIEwgLSAxICkgKTsKLQotICAgICAgZXhjLT5zdGFja1tleGMtPmFyZ3MgLSAxXSA9IEs7Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIENJTkRFWFtdOiAgICAgQ29weSBJTkRFWGVkIGVsZW1lbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBpbnQzMiAtLT4gU3RrRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfQ0lOREVYKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBGVF9Mb25nICBMOwotCi0KLSAgICBMID0gYXJnc1swXTsKLQotICAgIGlmICggTCA8PSAwIHx8IEwgPiBleGMtPmFyZ3MgKQotICAgIHsKLSAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwotICAgICAgYXJnc1swXSA9IDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGFyZ3NbMF0gPSBleGMtPnN0YWNrW2V4Yy0+YXJncyAtIExdOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJPTExbXTogICAgICAgUk9MTCB0b3AgdGhyZWUgZWxlbWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4OEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAzICogU3RrRWx0IC0tPiAzICogU3RrRWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfUk9MTCggRlRfTG9uZyogIGFyZ3MgKQotICB7Ci0gICAgRlRfTG9uZyAgQSwgQiwgQzsKLQotCi0gICAgQSA9IGFyZ3NbMl07Ci0gICAgQiA9IGFyZ3NbMV07Ci0gICAgQyA9IGFyZ3NbMF07Ci0KLSAgICBhcmdzWzJdID0gQzsKLSAgICBhcmdzWzFdID0gQTsKLSAgICBhcmdzWzBdID0gQjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNQU5BR0lORyBUSEUgRkxPVyBPRiBDT05UUk9MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTTE9PUFtdOiAgICAgIFNldCBMT09QIHZhcmlhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgaW50MzI/IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NMT09QKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIGlmICggYXJnc1swXSA8IDAgKQotICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBCYWRfQXJndW1lbnQgKTsKLSAgICBlbHNlCi0gICAgICBleGMtPkdTLmxvb3AgPSBhcmdzWzBdOwotICB9Ci0KLQotICBzdGF0aWMgRlRfQm9vbAotICBTa2lwQ29kZSggVFRfRXhlY0NvbnRleHQgIGV4YyApCi0gIHsKLSAgICBleGMtPklQICs9IGV4Yy0+bGVuZ3RoOwotCi0gICAgaWYgKCBleGMtPklQIDwgZXhjLT5jb2RlU2l6ZSApCi0gICAgewotICAgICAgZXhjLT5vcGNvZGUgPSBleGMtPmNvZGVbZXhjLT5JUF07Ci0KLSAgICAgIGV4Yy0+bGVuZ3RoID0gb3Bjb2RlX2xlbmd0aFtleGMtPm9wY29kZV07Ci0gICAgICBpZiAoIGV4Yy0+bGVuZ3RoIDwgMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggZXhjLT5JUCArIDEgPj0gZXhjLT5jb2RlU2l6ZSApCi0gICAgICAgICAgZ290byBGYWlsX092ZXJmbG93OwotICAgICAgICBleGMtPmxlbmd0aCA9IDIgLSBleGMtPmxlbmd0aCAqIGV4Yy0+Y29kZVtleGMtPklQICsgMV07Ci0gICAgICB9Ci0KLSAgICAgIGlmICggZXhjLT5JUCArIGV4Yy0+bGVuZ3RoIDw9IGV4Yy0+Y29kZVNpemUgKQotICAgICAgICByZXR1cm4gU1VDQ0VTUzsKLSAgICB9Ci0KLSAgRmFpbF9PdmVyZmxvdzoKLSAgICBleGMtPmVycm9yID0gRlRfVEhST1coIENvZGVfT3ZlcmZsb3cgKTsKLSAgICByZXR1cm4gRkFJTFVSRTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJRltdOiAgICAgICAgIElGIHRlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0lGKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX0ludCAgIG5JZnM7Ci0gICAgRlRfQm9vbCAgT3V0OwotCi0KLSAgICBpZiAoIGFyZ3NbMF0gIT0gMCApCi0gICAgICByZXR1cm47Ci0KLSAgICBuSWZzID0gMTsKLSAgICBPdXQgPSAwOwotCi0gICAgZG8KLSAgICB7Ci0gICAgICBpZiAoIFNraXBDb2RlKCBleGMgKSA9PSBGQUlMVVJFICkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBzd2l0Y2ggKCBleGMtPm9wY29kZSApCi0gICAgICB7Ci0gICAgICBjYXNlIDB4NTg6ICAgICAgLyogSUYgKi8KLSAgICAgICAgbklmcysrOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSAweDFCOiAgICAgIC8qIEVMU0UgKi8KLSAgICAgICAgT3V0ID0gRlRfQk9PTCggbklmcyA9PSAxICk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIDB4NTk6ICAgICAgLyogRUlGICovCi0gICAgICAgIG5JZnMtLTsKLSAgICAgICAgT3V0ID0gRlRfQk9PTCggbklmcyA9PSAwICk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0gd2hpbGUgKCBPdXQgPT0gMCApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEVMU0VbXTogICAgICAgRUxTRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfRUxTRSggVFRfRXhlY0NvbnRleHQgIGV4YyApCi0gIHsKLSAgICBGVF9JbnQgIG5JZnM7Ci0KLQotICAgIG5JZnMgPSAxOwotCi0gICAgZG8KLSAgICB7Ci0gICAgICBpZiAoIFNraXBDb2RlKCBleGMgKSA9PSBGQUlMVVJFICkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBzd2l0Y2ggKCBleGMtPm9wY29kZSApCi0gICAgICB7Ci0gICAgICBjYXNlIDB4NTg6ICAgIC8qIElGICovCi0gICAgICAgIG5JZnMrKzsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgMHg1OTogICAgLyogRUlGICovCi0gICAgICAgIG5JZnMtLTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSB3aGlsZSAoIG5JZnMgIT0gMCApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEVJRltdOiAgICAgICAgRW5kIElGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfRUlGKCB2b2lkICkKLSAgewotICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBKTVBSW106ICAgICAgIEp1TVAgUmVsYXRpdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDFDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgaW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0pNUFIoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBpZiAoIGFyZ3NbMF0gPT0gMCAmJiBleGMtPmFyZ3MgPT0gMCApCi0gICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEJhZF9Bcmd1bWVudCApOwotICAgIGV4Yy0+SVAgKz0gYXJnc1swXTsKLSAgICBpZiAoIGV4Yy0+SVAgPCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICggZXhjLT5jYWxsVG9wID4gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgIGV4Yy0+SVAgPiBleGMtPmNhbGxTdGFja1tleGMtPmNhbGxUb3AgLSAxXS5EZWYtPmVuZCApICkKLSAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggQmFkX0FyZ3VtZW50ICk7Ci0gICAgZXhjLT5zdGVwX2lucyA9IEZBTFNFOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEpST1RbXTogICAgICAgSnVtcCBSZWxhdGl2ZSBPbiBUcnVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBTdGtFbHQgaW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfSlJPVCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIGlmICggYXJnc1sxXSAhPSAwICkKLSAgICAgIEluc19KTVBSKCBleGMsIGFyZ3MgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBKUk9GW106ICAgICAgIEp1bXAgUmVsYXRpdmUgT24gRmFsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDc5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgU3RrRWx0IGludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0pST0YoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBpZiAoIGFyZ3NbMV0gPT0gMCApCi0gICAgICBJbnNfSk1QUiggZXhjLCBhcmdzICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogREVGSU5JTkcgQU5EIFVTSU5HIEZVTkNUSU9OUyBBTkQgSU5TVFJVQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRkRFRltdOiAgICAgICBGdW5jdGlvbiBERUZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgyQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19GREVGKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVUxvbmcgICAgICAgbjsKLSAgICBUVF9EZWZSZWNvcmQqICByZWM7Ci0gICAgVFRfRGVmUmVjb3JkKiAgbGltaXQ7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICAvKiBhcmd1bWVudHMgdG8gb3Bjb2RlcyBhcmUgc2tpcHBlZCBieSBgU0tJUF9Db2RlJyAqLwotICAgIEZUX0J5dGUgICAgb3Bjb2RlX3BhdHRlcm5bOV1bMTJdID0gewotICAgICAgICAgICAgICAgICAvKiAjMCBpbmxpbmUgZGVsdGEgZnVuY3Rpb24gMSAqLwotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgMHg0QiwgLyogUFBFTSAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4NTMsIC8qIEdURVEgICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDIzLCAvKiBTV0FQICAgICovCi0gICAgICAgICAgICAgICAgICAgMHg0QiwgLyogUFBFTSAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4NTEsIC8qIExURVEgICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDVBLCAvKiBBTkQgICAgICovCi0gICAgICAgICAgICAgICAgICAgMHg1OCwgLyogSUYgICAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4MzgsIC8qICAgU0hQSVggKi8KLSAgICAgICAgICAgICAgICAgICAweDFCLCAvKiBFTFNFICAgICovCi0gICAgICAgICAgICAgICAgICAgMHgyMSwgLyogICBQT1AgICAqLwotICAgICAgICAgICAgICAgICAgIDB4MjEsIC8qICAgUE9QICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDU5ICAvKiBFSUYgICAgICovCi0gICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgIC8qICMxIGlubGluZSBkZWx0YSBmdW5jdGlvbiAyICovCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAweDRCLCAvKiBQUEVNICAgICovCi0gICAgICAgICAgICAgICAgICAgMHg1NCwgLyogRVEgICAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4NTgsIC8qIElGICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDM4LCAvKiAgIFNIUElYICovCi0gICAgICAgICAgICAgICAgICAgMHgxQiwgLyogRUxTRSAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4MjEsIC8qICAgUE9QICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDIxLCAvKiAgIFBPUCAgICovCi0gICAgICAgICAgICAgICAgICAgMHg1OSAgLyogRUlGICAgICAqLwotICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAvKiAjMiBkaWFnb25hbCBzdHJva2UgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIDB4MjAsIC8qIERVUCAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDIwLCAvKiBEVVAgICAgICovCi0gICAgICAgICAgICAgICAgICAgMHhCMCwgLyogUFVTSEJfMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgMSAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDYwLCAvKiBBREQgICAgICovCi0gICAgICAgICAgICAgICAgICAgMHg0NiwgLyogR0NfY3VyICAqLwotICAgICAgICAgICAgICAgICAgIDB4QjAsIC8qIFBVU0hCXzEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIDY0ICAgICovCi0gICAgICAgICAgICAgICAgICAgMHgyMywgLyogU1dBUCAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4NDIgIC8qIFdTICAgICAgKi8KLSAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgLyogIzMgVmFjdUZvcm1Sb3VuZCBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgMHg0NSwgLyogUkNWVCAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4MjMsIC8qIFNXQVAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDQ2LCAvKiBHQ19jdXIgICovCi0gICAgICAgICAgICAgICAgICAgMHg2MCwgLyogQUREICAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4MjAsIC8qIERVUCAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAweEIwICAvKiBQVVNIQl8xICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyogICAzOCAgICAqLwotICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAvKiAjNCBUVEZhdXRvaGludCBieXRlY29kZSAob2xkKSAqLwotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgMHgyMCwgLyogRFVQICAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4NjQsIC8qIEFCUyAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAweEIwLCAvKiBQVVNIQl8xICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyogICAzMiAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4NjAsIC8qIEFERCAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDY2LCAvKiBGTE9PUiAgICovCi0gICAgICAgICAgICAgICAgICAgMHgyMywgLyogU1dBUCAgICAqLwotICAgICAgICAgICAgICAgICAgIDB4QjAgIC8qIFBVU0hCXzEgKi8KLSAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgLyogIzUgc3BhY2luZyBmdW5jdGlvbiAxICovCi0gICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAweDAxLCAvKiBTVlRDQV94ICovCi0gICAgICAgICAgICAgICAgICAgMHhCMCwgLyogUFVTSEJfMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgMjQgICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDQzLCAvKiBSUyAgICAgICovCi0gICAgICAgICAgICAgICAgICAgMHg1OCAgLyogSUYgICAgICAqLwotICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAvKiAjNiBzcGFjaW5nIGZ1bmN0aW9uIDIgKi8KLSAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIDB4MDEsIC8qIFNWVENBX3ggKi8KLSAgICAgICAgICAgICAgICAgICAweDE4LCAvKiBSVEcgICAgICovCi0gICAgICAgICAgICAgICAgICAgMHhCMCwgLyogUFVTSEJfMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgMjQgICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDQzLCAvKiBSUyAgICAgICovCi0gICAgICAgICAgICAgICAgICAgMHg1OCAgLyogSUYgICAgICAqLwotICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAvKiAjNyBUeXBlTWFuIFRhbGsgRGlhZ0VuZEN0cmwgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIDB4MDEsIC8qIFNWVENBX3ggKi8KLSAgICAgICAgICAgICAgICAgICAweDIwLCAvKiBEVVAgICAgICovCi0gICAgICAgICAgICAgICAgICAgMHhCMCwgLyogUFVTSEJfMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgMyAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAweDI1LCAvKiBDSU5ERVggICovCi0gICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgIC8qICM4IFR5cGVNYW4gVGFsayBBbGlnbiAqLwotICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgMHgwNiwgLyogU1BWVEwgICAqLwotICAgICAgICAgICAgICAgICAgIDB4N0QsIC8qIFJEVEcgICAgKi8KLSAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgIH07Ci0gICAgRlRfVVNob3J0ICBvcGNvZGVfcGF0dGVybnMgICA9IDk7Ci0gICAgRlRfVVNob3J0ICBvcGNvZGVfcG9pbnRlcls5XSA9IHsgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKLSAgICBGVF9VU2hvcnQgIG9wY29kZV9zaXplWzldICAgID0geyAxMiwgOCwgOCwgNiwgNywgNCwgNSwgNCwgMiB9OwotICAgIEZUX1VTaG9ydCAgaTsKLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KLQotCi0gICAgLyogc29tZSBmb250IHByb2dyYW1zIGFyZSBicm9rZW4gZW5vdWdoIHRvIHJlZGVmaW5lIGZ1bmN0aW9ucyEgKi8KLSAgICAvKiBXZSB3aWxsIHRoZW4gcGFyc2UgdGhlIGN1cnJlbnQgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgcmVjICAgPSBleGMtPkZEZWZzOwotICAgIGxpbWl0ID0gcmVjICsgZXhjLT5udW1GRGVmczsKLSAgICBuICAgICA9IChGVF9VTG9uZylhcmdzWzBdOwotCi0gICAgZm9yICggOyByZWMgPCBsaW1pdDsgcmVjKysgKQotICAgIHsKLSAgICAgIGlmICggcmVjLT5vcGMgPT0gbiApCi0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmICggcmVjID09IGxpbWl0ICkKLSAgICB7Ci0gICAgICAvKiBjaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCByb29tIGZvciBuZXcgZnVuY3Rpb25zICovCi0gICAgICBpZiAoIGV4Yy0+bnVtRkRlZnMgPj0gZXhjLT5tYXhGRGVmcyApCi0gICAgICB7Ci0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggVG9vX01hbnlfRnVuY3Rpb25fRGVmcyApOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBleGMtPm51bUZEZWZzKys7Ci0gICAgfQotCi0gICAgLyogQWx0aG91Z2ggRkRFRiB0YWtlcyB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciwgICovCi0gICAgLyogZnVuYyAjIG11c3QgYmUgd2l0aGluIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyICovCi0gICAgaWYgKCBuID4gMHhGRkZGVSApCi0gICAgewotICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBUb29fTWFueV9GdW5jdGlvbl9EZWZzICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcmVjLT5yYW5nZSAgICAgICAgICA9IGV4Yy0+Y3VyUmFuZ2U7Ci0gICAgcmVjLT5vcGMgICAgICAgICAgICA9IChGVF9VSW50MTYpbjsKLSAgICByZWMtPnN0YXJ0ICAgICAgICAgID0gZXhjLT5JUCArIDE7Ci0gICAgcmVjLT5hY3RpdmUgICAgICAgICA9IFRSVUU7Ci0gICAgcmVjLT5pbmxpbmVfZGVsdGEgICA9IEZBTFNFOwotICAgIHJlYy0+c3BoX2ZkZWZfZmxhZ3MgPSAweDAwMDA7Ci0KLSAgICBpZiAoIG4gPiBleGMtPm1heEZ1bmMgKQotICAgICAgZXhjLT5tYXhGdW5jID0gKEZUX1VJbnQxNiluOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0gICAgLyogV2UgZG9uJ3Qga25vdyBmb3Igc3VyZSB0aGVzZSBhcmUgdHlwZW1hbiBmdW5jdGlvbnMsICovCi0gICAgLyogaG93ZXZlciB0aGV5IGFyZSBvbmx5IGFjdGl2ZSB3aGVuIFJTIDIyIGlzIGNhbGxlZCAgICovCi0gICAgaWYgKCBuID49IDY0ICYmIG4gPD0gNjYgKQotICAgICAgcmVjLT5zcGhfZmRlZl9mbGFncyB8PSBTUEhfRkRFRl9UWVBFTUFOX1NUUk9LRVM7Ci0jZW5kaWYKLQotICAgIC8qIE5vdyBza2lwIHRoZSB3aG9sZSBmdW5jdGlvbiBkZWZpbml0aW9uLiAqLwotICAgIC8qIFdlIGRvbid0IGFsbG93IG5lc3RlZCBJREVGUyAmIEZERUZzLiAgICAqLwotCi0gICAgd2hpbGUgKCBTa2lwQ29kZSggZXhjICkgPT0gU1VDQ0VTUyApCi0gICAgewotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0KLSAgICAgIGlmICggU1VCUElYRUxfSElOVElORyApCi0gICAgICB7Ci0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgb3Bjb2RlX3BhdHRlcm5zOyBpKysgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBvcGNvZGVfcG9pbnRlcltpXSA8IG9wY29kZV9zaXplW2ldICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgIGV4Yy0+b3Bjb2RlID09IG9wY29kZV9wYXR0ZXJuW2ldW29wY29kZV9wb2ludGVyW2ldXSApCi0gICAgICAgICAgewotICAgICAgICAgICAgb3Bjb2RlX3BvaW50ZXJbaV0gKz0gMTsKLQotICAgICAgICAgICAgaWYgKCBvcGNvZGVfcG9pbnRlcltpXSA9PSBvcGNvZGVfc2l6ZVtpXSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZUX1RSQUNFNigoICJzcGg6IEZ1bmN0aW9uICVkLCBvcGNvZGUgcHRybjogJWQsICVzICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPmZhY2UtPnJvb3QuZmFtaWx5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+ZmFjZS0+cm9vdC5zdHlsZV9uYW1lICkpOwotCi0gICAgICAgICAgICAgIHN3aXRjaCAoIGkgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICByZWMtPnNwaF9mZGVmX2ZsYWdzICAgICAgICAgICAgIHw9IFNQSF9GREVGX0lOTElORV9ERUxUQV8xOwotICAgICAgICAgICAgICAgIGV4Yy0+ZmFjZS0+c3BoX2ZvdW5kX2Z1bmNfZmxhZ3MgfD0gU1BIX0ZERUZfSU5MSU5FX0RFTFRBXzE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIHJlYy0+c3BoX2ZkZWZfZmxhZ3MgICAgICAgICAgICAgfD0gU1BIX0ZERUZfSU5MSU5FX0RFTFRBXzI7Ci0gICAgICAgICAgICAgICAgZXhjLT5mYWNlLT5zcGhfZm91bmRfZnVuY19mbGFncyB8PSBTUEhfRkRFRl9JTkxJTkVfREVMVEFfMjsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgc3dpdGNoICggbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLyogbmVlZHMgdG8gYmUgaW1wbGVtZW50ZWQgc3RpbGwgKi8KLSAgICAgICAgICAgICAgICBjYXNlIDU4OgotICAgICAgICAgICAgICAgICAgcmVjLT5zcGhfZmRlZl9mbGFncyAgICAgICAgICAgICB8PSBTUEhfRkRFRl9ESUFHT05BTF9TVFJPS0U7Ci0gICAgICAgICAgICAgICAgICBleGMtPmZhY2UtPnNwaF9mb3VuZF9mdW5jX2ZsYWdzIHw9IFNQSF9GREVGX0RJQUdPTkFMX1NUUk9LRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHN3aXRjaCAoIG4gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICByZWMtPnNwaF9mZGVmX2ZsYWdzICAgICAgICAgICAgIHw9IFNQSF9GREVGX1ZBQ1VGT1JNX1JPVU5EXzE7Ci0gICAgICAgICAgICAgICAgICBleGMtPmZhY2UtPnNwaF9mb3VuZF9mdW5jX2ZsYWdzIHw9IFNQSF9GREVGX1ZBQ1VGT1JNX1JPVU5EXzE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAvKiBwcm9iYWJseSBub3QgbmVjZXNzYXJ5IHRvIGRldGVjdCBhbnltb3JlICovCi0gICAgICAgICAgICAgICAgcmVjLT5zcGhfZmRlZl9mbGFncyAgICAgICAgICAgICB8PSBTUEhfRkRFRl9UVEZBVVRPSElOVF8xOwotICAgICAgICAgICAgICAgIGV4Yy0+ZmFjZS0+c3BoX2ZvdW5kX2Z1bmNfZmxhZ3MgfD0gU1BIX0ZERUZfVFRGQVVUT0hJTlRfMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgc3dpdGNoICggbiApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICAgICAgcmVjLT5zcGhfZmRlZl9mbGFncyAgICAgICAgICAgICB8PSBTUEhfRkRFRl9TUEFDSU5HXzE7Ci0gICAgICAgICAgICAgICAgICBleGMtPmZhY2UtPnNwaF9mb3VuZF9mdW5jX2ZsYWdzIHw9IFNQSF9GREVGX1NQQUNJTkdfMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICAgIHN3aXRjaCAoIG4gKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgICAgIHJlYy0+c3BoX2ZkZWZfZmxhZ3MgICAgICAgICAgICAgfD0gU1BIX0ZERUZfU1BBQ0lOR18yOwotICAgICAgICAgICAgICAgICAgZXhjLT5mYWNlLT5zcGhfZm91bmRfZnVuY19mbGFncyB8PSBTUEhfRkRFRl9TUEFDSU5HXzI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgIHJlYy0+c3BoX2ZkZWZfZmxhZ3MgICAgICAgICAgICAgfD0gU1BIX0ZERUZfVFlQRU1BTl9ESUFHRU5EQ1RSTDsKLSAgICAgICAgICAgICAgICAgZXhjLT5mYWNlLT5zcGhfZm91bmRfZnVuY19mbGFncyB8PSBTUEhfRkRFRl9UWVBFTUFOX0RJQUdFTkRDVFJMOwotICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgY2FzZSA4OgotI2lmIDAKLSAgICAgICAgICAgICAgICAgcmVjLT5zcGhfZmRlZl9mbGFncyAgICAgICAgICAgICB8PSBTUEhfRkRFRl9UWVBFTUFOX0RJQUdFTkRDVFJMOwotICAgICAgICAgICAgICAgICBleGMtPmZhY2UtPnNwaF9mb3VuZF9mdW5jX2ZsYWdzIHw9IFNQSF9GREVGX1RZUEVNQU5fRElBR0VORENUUkw7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgb3Bjb2RlX3BvaW50ZXJbaV0gPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIG9wY29kZV9wb2ludGVyW2ldID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFNldCBzcGhfY29tcGF0aWJpbGl0eV9tb2RlIG9ubHkgd2hlbiBkZWx0YXMgYXJlIGRldGVjdGVkICovCi0gICAgICAgIGV4Yy0+ZmFjZS0+c3BoX2NvbXBhdGliaWxpdHlfbW9kZSA9Ci0gICAgICAgICAgKCAoIGV4Yy0+ZmFjZS0+c3BoX2ZvdW5kX2Z1bmNfZmxhZ3MgJiBTUEhfRkRFRl9JTkxJTkVfREVMVEFfMSApIHwKLSAgICAgICAgICAgICggZXhjLT5mYWNlLT5zcGhfZm91bmRfZnVuY19mbGFncyAmIFNQSF9GREVGX0lOTElORV9ERUxUQV8yICkgKTsKLSAgICAgIH0KLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwotCi0gICAgICBzd2l0Y2ggKCBleGMtPm9wY29kZSApCi0gICAgICB7Ci0gICAgICBjYXNlIDB4ODk6ICAgIC8qIElERUYgKi8KLSAgICAgIGNhc2UgMHgyQzogICAgLyogRkRFRiAqLwotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIE5lc3RlZF9ERUZTICk7Ci0gICAgICAgIHJldHVybjsKLQotICAgICAgY2FzZSAweDJEOiAgIC8qIEVOREYgKi8KLSAgICAgICAgcmVjLT5lbmQgPSBleGMtPklQOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEVOREZbXTogICAgICAgRU5EIEZ1bmN0aW9uIGRlZmluaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfRU5ERiggVFRfRXhlY0NvbnRleHQgIGV4YyApCi0gIHsKLSAgICBUVF9DYWxsUmVjKiAgcFJlYzsKLQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0gICAgZXhjLT5zcGhfaW5fZnVuY19mbGFncyA9IDB4MDAwMDsKLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KLQotICAgIGlmICggZXhjLT5jYWxsVG9wIDw9IDAgKSAgICAgLyogV2UgZW5jb3VudGVyZWQgYW4gRU5ERiB3aXRob3V0IGEgY2FsbCAqLwotICAgIHsKLSAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggRU5ERl9Jbl9FeGVjX1N0cmVhbSApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGV4Yy0+Y2FsbFRvcC0tOwotCi0gICAgcFJlYyA9ICZleGMtPmNhbGxTdGFja1tleGMtPmNhbGxUb3BdOwotCi0gICAgcFJlYy0+Q3VyX0NvdW50LS07Ci0KLSAgICBleGMtPnN0ZXBfaW5zID0gRkFMU0U7Ci0KLSAgICBpZiAoIHBSZWMtPkN1cl9Db3VudCA+IDAgKQotICAgIHsKLSAgICAgIGV4Yy0+Y2FsbFRvcCsrOwotICAgICAgZXhjLT5JUCA9IHBSZWMtPkRlZi0+c3RhcnQ7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIC8qIExvb3AgdGhyb3VnaCB0aGUgY3VycmVudCBmdW5jdGlvbiAqLwotICAgICAgSW5zX0dvdG9fQ29kZVJhbmdlKCBleGMsIHBSZWMtPkNhbGxlcl9SYW5nZSwgcFJlYy0+Q2FsbGVyX0lQICk7Ci0KLSAgICAvKiBFeGl0IHRoZSBjdXJyZW50IGNhbGwgZnJhbWUuICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAvKiBOT1RFOiBJZiB0aGUgbGFzdCBpbnN0cnVjdGlvbiBvZiBhIHByb2dyYW0gaXMgYSAgICovCi0gICAgLyogICAgICAgQ0FMTCBvciBMT09QQ0FMTCwgdGhlIHJldHVybiBhZGRyZXNzIGlzICAgICAqLwotICAgIC8qICAgICAgIGFsd2F5cyBvdXQgb2YgdGhlIGNvZGUgcmFuZ2UuICBUaGlzIGlzIGEgICAgKi8KLSAgICAvKiAgICAgICB2YWxpZCBhZGRyZXNzLCBhbmQgaXQgaXMgd2h5IHdlIGRvIG5vdCB0ZXN0ICovCi0gICAgLyogICAgICAgdGhlIHJlc3VsdCBvZiBJbnNfR290b19Db2RlUmFuZ2UoKSBoZXJlISAgICAqLwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIENBTExbXTogICAgICAgQ0FMTCBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MkIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzI/IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfQ0FMTCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VMb25nICAgICAgIEY7Ci0gICAgVFRfQ2FsbFJlYyogICAgcENyZWM7Ci0gICAgVFRfRGVmUmVjb3JkKiAgZGVmOwotCi0KLSAgICAvKiBmaXJzdCBvZiBhbGwsIGNoZWNrIHRoZSBpbmRleCAqLwotCi0gICAgRiA9IChGVF9VTG9uZylhcmdzWzBdOwotICAgIGlmICggQk9VTkRTTCggRiwgZXhjLT5tYXhGdW5jICsgMSApICkKLSAgICAgIGdvdG8gRmFpbDsKLQotICAgIC8qIEV4Y2VwdCBmb3Igc29tZSBvbGQgQXBwbGUgZm9udHMsIGFsbCBmdW5jdGlvbnMgaW4gYSBUcnVlVHlwZSAqLwotICAgIC8qIGZvbnQgYXJlIGRlZmluZWQgaW4gaW5jcmVhc2luZyBvcmRlciwgc3RhcnRpbmcgZnJvbSAwLiAgVGhpcyAqLwotICAgIC8qIG1lYW5zIHRoYXQgd2Ugbm9ybWFsbHkgaGF2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgIGV4Yy0+bWF4RnVuYysxID09IGV4Yy0+bnVtRkRlZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgIGV4Yy0+RkRlZnNbbl0ub3BjID09IG4gZm9yIG4gaW4gMC4uZXhjLT5tYXhGdW5jICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIElmIHRoaXMgaXNuJ3QgdHJ1ZSwgd2UgbmVlZCB0byBsb29rIHVwIHRoZSBmdW5jdGlvbiB0YWJsZS4gICAqLwotCi0gICAgZGVmID0gZXhjLT5GRGVmcyArIEY7Ci0gICAgaWYgKCBleGMtPm1heEZ1bmMgKyAxICE9IGV4Yy0+bnVtRkRlZnMgfHwgZGVmLT5vcGMgIT0gRiApCi0gICAgewotICAgICAgLyogbG9vayB1cCB0aGUgRkRlZnMgdGFibGUgKi8KLSAgICAgIFRUX0RlZlJlY29yZCogIGxpbWl0OwotCi0KLSAgICAgIGRlZiAgID0gZXhjLT5GRGVmczsKLSAgICAgIGxpbWl0ID0gZGVmICsgZXhjLT5udW1GRGVmczsKLQotICAgICAgd2hpbGUgKCBkZWYgPCBsaW1pdCAmJiBkZWYtPm9wYyAhPSBGICkKLSAgICAgICAgZGVmKys7Ci0KLSAgICAgIGlmICggZGVmID09IGxpbWl0ICkKLSAgICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgIC8qIGNoZWNrIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIGFjdGl2ZSAqLwotICAgIGlmICggIWRlZi0+YWN0aXZlICkKLSAgICAgIGdvdG8gRmFpbDsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotICAgIGlmICggU1VCUElYRUxfSElOVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAoICggZXhjLT5pdXBfY2FsbGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19OT19DQUxMX0FGVEVSX0lVUCApICkgfHwKLSAgICAgICAgICAgKCBkZWYtPnNwaF9mZGVmX2ZsYWdzICYgU1BIX0ZERUZfVkFDVUZPUk1fUk9VTkRfMSApICAgICAgICApICkKLSAgICAgIGdvdG8gRmFpbDsKLSAgICBlbHNlCi0gICAgICBleGMtPnNwaF9pbl9mdW5jX2ZsYWdzID0gZGVmLT5zcGhfZmRlZl9mbGFnczsKLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KLQotICAgIC8qIGNoZWNrIHRoZSBjYWxsIHN0YWNrICovCi0gICAgaWYgKCBleGMtPmNhbGxUb3AgPj0gZXhjLT5jYWxsU2l6ZSApCi0gICAgewotICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBTdGFja19PdmVyZmxvdyApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHBDcmVjID0gZXhjLT5jYWxsU3RhY2sgKyBleGMtPmNhbGxUb3A7Ci0KLSAgICBwQ3JlYy0+Q2FsbGVyX1JhbmdlID0gZXhjLT5jdXJSYW5nZTsKLSAgICBwQ3JlYy0+Q2FsbGVyX0lQICAgID0gZXhjLT5JUCArIDE7Ci0gICAgcENyZWMtPkN1cl9Db3VudCAgICA9IDE7Ci0gICAgcENyZWMtPkRlZiAgICAgICAgICA9IGRlZjsKLQotICAgIGV4Yy0+Y2FsbFRvcCsrOwotCi0gICAgSW5zX0dvdG9fQ29kZVJhbmdlKCBleGMsIGRlZi0+cmFuZ2UsIGRlZi0+c3RhcnQgKTsKLQotICAgIGV4Yy0+c3RlcF9pbnMgPSBGQUxTRTsKLQotICAgIHJldHVybjsKLQotICBGYWlsOgotICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBMT09QQ0FMTFtdOiAgIExPT1AgYW5kIENBTEwgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDJBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyPyBFaW50MTY/IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0xPT1BDQUxMKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VMb25nICAgICAgIEY7Ci0gICAgVFRfQ2FsbFJlYyogICAgcENyZWM7Ci0gICAgVFRfRGVmUmVjb3JkKiAgZGVmOwotCi0KLSAgICAvKiBmaXJzdCBvZiBhbGwsIGNoZWNrIHRoZSBpbmRleCAqLwotICAgIEYgPSAoRlRfVUxvbmcpYXJnc1sxXTsKLSAgICBpZiAoIEJPVU5EU0woIEYsIGV4Yy0+bWF4RnVuYyArIDEgKSApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICAvKiBFeGNlcHQgZm9yIHNvbWUgb2xkIEFwcGxlIGZvbnRzLCBhbGwgZnVuY3Rpb25zIGluIGEgVHJ1ZVR5cGUgKi8KLSAgICAvKiBmb250IGFyZSBkZWZpbmVkIGluIGluY3JlYXNpbmcgb3JkZXIsIHN0YXJ0aW5nIGZyb20gMC4gIFRoaXMgKi8KLSAgICAvKiBtZWFucyB0aGF0IHdlIG5vcm1hbGx5IGhhdmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICBleGMtPm1heEZ1bmMrMSA9PSBleGMtPm51bUZEZWZzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICBleGMtPkZEZWZzW25dLm9wYyA9PSBuIGZvciBuIGluIDAuLmV4Yy0+bWF4RnVuYyAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiBJZiB0aGlzIGlzbid0IHRydWUsIHdlIG5lZWQgdG8gbG9vayB1cCB0aGUgZnVuY3Rpb24gdGFibGUuICAgKi8KLQotICAgIGRlZiA9IGV4Yy0+RkRlZnMgKyBGOwotICAgIGlmICggZXhjLT5tYXhGdW5jICsgMSAhPSBleGMtPm51bUZEZWZzIHx8IGRlZi0+b3BjICE9IEYgKQotICAgIHsKLSAgICAgIC8qIGxvb2sgdXAgdGhlIEZEZWZzIHRhYmxlICovCi0gICAgICBUVF9EZWZSZWNvcmQqICBsaW1pdDsKLQotCi0gICAgICBkZWYgICA9IGV4Yy0+RkRlZnM7Ci0gICAgICBsaW1pdCA9IGRlZiArIGV4Yy0+bnVtRkRlZnM7Ci0KLSAgICAgIHdoaWxlICggZGVmIDwgbGltaXQgJiYgZGVmLT5vcGMgIT0gRiApCi0gICAgICAgIGRlZisrOwotCi0gICAgICBpZiAoIGRlZiA9PSBsaW1pdCApCi0gICAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICAvKiBjaGVjayB0aGF0IHRoZSBmdW5jdGlvbiBpcyBhY3RpdmUgKi8KLSAgICBpZiAoICFkZWYtPmFjdGl2ZSApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAoIGRlZi0+c3BoX2ZkZWZfZmxhZ3MgJiBTUEhfRkRFRl9WQUNVRk9STV9ST1VORF8xICkgKQotICAgICAgZ290byBGYWlsOwotICAgIGVsc2UKLSAgICAgIGV4Yy0+c3BoX2luX2Z1bmNfZmxhZ3MgPSBkZWYtPnNwaF9mZGVmX2ZsYWdzOwotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwotCi0gICAgLyogY2hlY2sgc3RhY2sgKi8KLSAgICBpZiAoIGV4Yy0+Y2FsbFRvcCA+PSBleGMtPmNhbGxTaXplICkKLSAgICB7Ci0gICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIFN0YWNrX092ZXJmbG93ICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCBhcmdzWzBdID4gMCApCi0gICAgewotICAgICAgcENyZWMgPSBleGMtPmNhbGxTdGFjayArIGV4Yy0+Y2FsbFRvcDsKLQotICAgICAgcENyZWMtPkNhbGxlcl9SYW5nZSA9IGV4Yy0+Y3VyUmFuZ2U7Ci0gICAgICBwQ3JlYy0+Q2FsbGVyX0lQICAgID0gZXhjLT5JUCArIDE7Ci0gICAgICBwQ3JlYy0+Q3VyX0NvdW50ICAgID0gKEZUX0ludClhcmdzWzBdOwotICAgICAgcENyZWMtPkRlZiAgICAgICAgICA9IGRlZjsKLQotICAgICAgZXhjLT5jYWxsVG9wKys7Ci0KLSAgICAgIEluc19Hb3RvX0NvZGVSYW5nZSggZXhjLCBkZWYtPnJhbmdlLCBkZWYtPnN0YXJ0ICk7Ci0KLSAgICAgIGV4Yy0+c3RlcF9pbnMgPSBGQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci0KLSAgRmFpbDoKLSAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSURFRltdOiAgICAgICBJbnN0cnVjdGlvbiBERUZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg4OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIEVpbnQ4IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19JREVGKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgVFRfRGVmUmVjb3JkKiAgZGVmOwotICAgIFRUX0RlZlJlY29yZCogIGxpbWl0OwotCi0KLSAgICAvKiAgRmlyc3Qgb2YgYWxsLCBsb29rIGZvciB0aGUgc2FtZSBmdW5jdGlvbiBpbiBvdXIgdGFibGUgKi8KLQotICAgIGRlZiAgID0gZXhjLT5JRGVmczsKLSAgICBsaW1pdCA9IGRlZiArIGV4Yy0+bnVtSURlZnM7Ci0KLSAgICBmb3IgKCA7IGRlZiA8IGxpbWl0OyBkZWYrKyApCi0gICAgICBpZiAoIGRlZi0+b3BjID09IChGVF9VTG9uZylhcmdzWzBdICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBpZiAoIGRlZiA9PSBsaW1pdCApCi0gICAgewotICAgICAgLyogY2hlY2sgdGhhdCB0aGVyZSBpcyBlbm91Z2ggcm9vbSBmb3IgYSBuZXcgaW5zdHJ1Y3Rpb24gKi8KLSAgICAgIGlmICggZXhjLT5udW1JRGVmcyA+PSBleGMtPm1heElEZWZzICkKLSAgICAgIHsKLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBUb29fTWFueV9JbnN0cnVjdGlvbl9EZWZzICk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGV4Yy0+bnVtSURlZnMrKzsKLSAgICB9Ci0KLSAgICAvKiBvcGNvZGUgbXVzdCBiZSB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VyICovCi0gICAgaWYgKCAwID4gYXJnc1swXSB8fCBhcmdzWzBdID4gMHgwMEZGICkKLSAgICB7Ci0gICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIFRvb19NYW55X0luc3RydWN0aW9uX0RlZnMgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBkZWYtPm9wYyAgICA9IChGVF9CeXRlKWFyZ3NbMF07Ci0gICAgZGVmLT5zdGFydCAgPSBleGMtPklQICsgMTsKLSAgICBkZWYtPnJhbmdlICA9IGV4Yy0+Y3VyUmFuZ2U7Ci0gICAgZGVmLT5hY3RpdmUgPSBUUlVFOwotCi0gICAgaWYgKCAoRlRfVUxvbmcpYXJnc1swXSA+IGV4Yy0+bWF4SW5zICkKLSAgICAgIGV4Yy0+bWF4SW5zID0gKEZUX0J5dGUpYXJnc1swXTsKLQotICAgIC8qIE5vdyBza2lwIHRoZSB3aG9sZSBmdW5jdGlvbiBkZWZpbml0aW9uLiAqLwotICAgIC8qIFdlIGRvbid0IGFsbG93IG5lc3RlZCBJREVGcyAmIEZERUZzLiAgICAqLwotCi0gICAgd2hpbGUgKCBTa2lwQ29kZSggZXhjICkgPT0gU1VDQ0VTUyApCi0gICAgewotICAgICAgc3dpdGNoICggZXhjLT5vcGNvZGUgKQotICAgICAgewotICAgICAgY2FzZSAweDg5OiAgIC8qIElERUYgKi8KLSAgICAgIGNhc2UgMHgyQzogICAvKiBGREVGICovCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggTmVzdGVkX0RFRlMgKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgY2FzZSAweDJEOiAgIC8qIEVOREYgKi8KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBQVVNISU5HIERBVEEgT05UTyBUSEUgSU5URVJQUkVURVIgU1RBQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBOUFVTSEJbXTogICAgIFBVU0ggTiBCeXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+IHVpbnQzMi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX05QVVNIQiggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVVNob3J0ICBMLCBLOwotCi0KLSAgICBMID0gKEZUX1VTaG9ydClleGMtPmNvZGVbZXhjLT5JUCArIDFdOwotCi0gICAgaWYgKCBCT1VORFMoIEwsIGV4Yy0+c3RhY2tTaXplICsgMSAtIGV4Yy0+dG9wICkgKQotICAgIHsKLSAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggU3RhY2tfT3ZlcmZsb3cgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKCBLID0gMTsgSyA8PSBMOyBLKysgKQotICAgICAgYXJnc1tLIC0gMV0gPSBleGMtPmNvZGVbZXhjLT5JUCArIEsgKyAxXTsKLQotICAgIGV4Yy0+bmV3X3RvcCArPSBMOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE5QVVNIV1tdOiAgICAgUFVTSCBOIFdvcmRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gaW50MzIuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfTlBVU0hXKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBGVF9VU2hvcnQgIEwsIEs7Ci0KLQotICAgIEwgPSAoRlRfVVNob3J0KWV4Yy0+Y29kZVtleGMtPklQICsgMV07Ci0KLSAgICBpZiAoIEJPVU5EUyggTCwgZXhjLT5zdGFja1NpemUgKyAxIC0gZXhjLT50b3AgKSApCi0gICAgewotICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBTdGFja19PdmVyZmxvdyApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGV4Yy0+SVAgKz0gMjsKLQotICAgIGZvciAoIEsgPSAwOyBLIDwgTDsgSysrICkKLSAgICAgIGFyZ3NbS10gPSBHZXRTaG9ydElucyggZXhjICk7Ci0KLSAgICBleGMtPnN0ZXBfaW5zID0gRkFMU0U7Ci0gICAgZXhjLT5uZXdfdG9wICs9IEw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUFVTSEJbYWJjXTogICBQVVNIIEJ5dGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHhCMC0weEI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiB1aW50MzIuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19QVVNIQiggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBGVF9VU2hvcnQgIEwsIEs7Ci0KLQotICAgIEwgPSAoRlRfVVNob3J0KSggZXhjLT5vcGNvZGUgLSAweEIwICsgMSApOwotCi0gICAgaWYgKCBCT1VORFMoIEwsIGV4Yy0+c3RhY2tTaXplICsgMSAtIGV4Yy0+dG9wICkgKQotICAgIHsKLSAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggU3RhY2tfT3ZlcmZsb3cgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKCBLID0gMTsgSyA8PSBMOyBLKysgKQotICAgICAgYXJnc1tLIC0gMV0gPSBleGMtPmNvZGVbZXhjLT5JUCArIEtdOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFBVU0hXW2FiY106ICAgUFVTSCBXb3JkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4QjgtMHhCRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gaW50MzIuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfUFVTSFcoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVVNob3J0ICBMLCBLOwotCi0KLSAgICBMID0gKEZUX1VTaG9ydCkoIGV4Yy0+b3Bjb2RlIC0gMHhCOCArIDEgKTsKLQotICAgIGlmICggQk9VTkRTKCBMLCBleGMtPnN0YWNrU2l6ZSArIDEgLSBleGMtPnRvcCApICkKLSAgICB7Ci0gICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIFN0YWNrX092ZXJmbG93ICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZXhjLT5JUCsrOwotCi0gICAgZm9yICggSyA9IDA7IEsgPCBMOyBLKysgKQotICAgICAgYXJnc1tLXSA9IEdldFNob3J0SW5zKCBleGMgKTsKLQotICAgIGV4Yy0+c3RlcF9pbnMgPSBGQUxTRTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNQU5BR0lORyBUSEUgR1JBUEhJQ1MgU1RBVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgc3RhdGljIEZUX0Jvb2wKLSAgSW5zX1N4VlRMKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgICBhSWR4MSwKLSAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICAgYUlkeDIsCi0gICAgICAgICAgICAgRlRfVW5pdFZlY3RvciogIFZlYyApCi0gIHsKLSAgICBGVF9Mb25nICAgICBBLCBCLCBDOwotICAgIEZUX1ZlY3RvciogIHAxOwotICAgIEZUX1ZlY3RvciogIHAyOwotCi0gICAgRlRfQnl0ZSAgb3Bjb2RlID0gZXhjLT5vcGNvZGU7Ci0KLQotICAgIGlmICggQk9VTkRTKCBhSWR4MSwgZXhjLT56cDIubl9wb2ludHMgKSB8fAotICAgICAgICAgQk9VTkRTKCBhSWR4MiwgZXhjLT56cDEubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICByZXR1cm4gRkFJTFVSRTsKLSAgICB9Ci0KLSAgICBwMSA9IGV4Yy0+enAxLmN1ciArIGFJZHgyOwotICAgIHAyID0gZXhjLT56cDIuY3VyICsgYUlkeDE7Ci0KLSAgICBBID0gcDEtPnggLSBwMi0+eDsKLSAgICBCID0gcDEtPnkgLSBwMi0+eTsKLQotICAgIC8qIElmIHAxID09IHAyLCBTUHZUTCBhbmQgU0Z2VEwgYmVoYXZlIHRoZSBzYW1lIGFzICovCi0gICAgLyogU1B2VENBW1hdIGFuZCBTRnZUQ0FbWF0sIHJlc3BlY3RpdmVseS4gICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIENvbmZpcm1lZCBieSBHcmVnIEhpdGNoY29jay4gICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBpZiAoIEEgPT0gMCAmJiBCID09IDAgKQotICAgIHsKLSAgICAgIEEgICAgICA9IDB4NDAwMDsKLSAgICAgIG9wY29kZSA9IDA7Ci0gICAgfQotCi0gICAgaWYgKCAoIG9wY29kZSAmIDEgKSAhPSAwICkKLSAgICB7Ci0gICAgICBDID0gIEI7ICAgLyogY291bnRlciBjbG9ja3dpc2Ugcm90YXRpb24gKi8KLSAgICAgIEIgPSAgQTsKLSAgICAgIEEgPSAtQzsKLSAgICB9Ci0KLSAgICBOb3JtYWxpemUoIEEsIEIsIFZlYyApOwotCi0gICAgcmV0dXJuIFNVQ0NFU1M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1ZUQ0FbYV06ICAgICBTZXQgKEYgYW5kIFApIFZlY3RvcnMgdG8gQ29vcmRpbmF0ZSBBeGlzICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgwMC0weDAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNQdlRDQVthXTogICAgU2V0IFBWZWN0b3IgdG8gQ29vcmRpbmF0ZSBBeGlzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MDItMHgwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTRnZUQ0FbYV06ICAgIFNldCBGVmVjdG9yIHRvIENvb3JkaW5hdGUgQXhpcyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDA0LTB4MDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1N4eVRDQSggVFRfRXhlY0NvbnRleHQgIGV4YyApCi0gIHsKLSAgICBGVF9TaG9ydCAgQUEsIEJCOwotCi0gICAgRlRfQnl0ZSAgb3Bjb2RlID0gZXhjLT5vcGNvZGU7Ci0KLQotICAgIEFBID0gKEZUX1Nob3J0KSggKCBvcGNvZGUgJiAxICkgPDwgMTQgKTsKLSAgICBCQiA9IChGVF9TaG9ydCkoIEFBIF4gMHg0MDAwICk7Ci0KLSAgICBpZiAoIG9wY29kZSA8IDQgKQotICAgIHsKLSAgICAgIGV4Yy0+R1MucHJvalZlY3Rvci54ID0gQUE7Ci0gICAgICBleGMtPkdTLnByb2pWZWN0b3IueSA9IEJCOwotCi0gICAgICBleGMtPkdTLmR1YWxWZWN0b3IueCA9IEFBOwotICAgICAgZXhjLT5HUy5kdWFsVmVjdG9yLnkgPSBCQjsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgR1VFU1NfVkVDVE9SKCBwcm9qVmVjdG9yICk7Ci0KLSAgICBpZiAoICggb3Bjb2RlICYgMiApID09IDAgKQotICAgIHsKLSAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci54ID0gQUE7Ci0gICAgICBleGMtPkdTLmZyZWVWZWN0b3IueSA9IEJCOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBHVUVTU19WRUNUT1IoIGZyZWVWZWN0b3IgKTsKLQotICAgIENvbXB1dGVfRnVuY3MoIGV4YyApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNQdlRMW2FdOiAgICAgU2V0IFBWZWN0b3IgVG8gTGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MDYtMHgwNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU1BWVEwoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgaWYgKCBJbnNfU3hWVEwoIGV4YywKLSAgICAgICAgICAgICAgICAgICAgKEZUX1VTaG9ydClhcmdzWzFdLAotICAgICAgICAgICAgICAgICAgICAoRlRfVVNob3J0KWFyZ3NbMF0sCi0gICAgICAgICAgICAgICAgICAgICZleGMtPkdTLnByb2pWZWN0b3IgKSA9PSBTVUNDRVNTICkKLSAgICB7Ci0gICAgICBleGMtPkdTLmR1YWxWZWN0b3IgPSBleGMtPkdTLnByb2pWZWN0b3I7Ci0gICAgICBHVUVTU19WRUNUT1IoIGZyZWVWZWN0b3IgKTsKLSAgICAgIENvbXB1dGVfRnVuY3MoIGV4YyApOwotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTRnZUTFthXTogICAgIFNldCBGVmVjdG9yIFRvIExpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDA4LTB4MDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NGVlRMKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIGlmICggSW5zX1N4VlRMKCBleGMsCi0gICAgICAgICAgICAgICAgICAgIChGVF9VU2hvcnQpYXJnc1sxXSwKLSAgICAgICAgICAgICAgICAgICAgKEZUX1VTaG9ydClhcmdzWzBdLAotICAgICAgICAgICAgICAgICAgICAmZXhjLT5HUy5mcmVlVmVjdG9yICkgPT0gU1VDQ0VTUyApCi0gICAgewotICAgICAgR1VFU1NfVkVDVE9SKCBwcm9qVmVjdG9yICk7Ci0gICAgICBDb21wdXRlX0Z1bmNzKCBleGMgKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0Z2VFB2W106ICAgICBTZXQgRlZlY3RvciBUbyBQVmVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgwRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TRlZUUFYoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQotICB7Ci0gICAgR1VFU1NfVkVDVE9SKCBwcm9qVmVjdG9yICk7Ci0gICAgZXhjLT5HUy5mcmVlVmVjdG9yID0gZXhjLT5HUy5wcm9qVmVjdG9yOwotICAgIENvbXB1dGVfRnVuY3MoIGV4YyApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNQdkZTW106ICAgICAgU2V0IFBWZWN0b3IgRnJvbSBTdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMi4xNCBmMi4xNCAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU1BWRlMoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfU2hvcnQgIFM7Ci0gICAgRlRfTG9uZyAgIFgsIFk7Ci0KLQotICAgIC8qIE9ubHkgdXNlIGxvdyAxNmJpdHMsIHRoZW4gc2lnbiBleHRlbmQgKi8KLSAgICBTID0gKEZUX1Nob3J0KWFyZ3NbMV07Ci0gICAgWSA9IChGVF9Mb25nKVM7Ci0gICAgUyA9IChGVF9TaG9ydClhcmdzWzBdOwotICAgIFggPSAoRlRfTG9uZylTOwotCi0gICAgTm9ybWFsaXplKCBYLCBZLCAmZXhjLT5HUy5wcm9qVmVjdG9yICk7Ci0KLSAgICBleGMtPkdTLmR1YWxWZWN0b3IgPSBleGMtPkdTLnByb2pWZWN0b3I7Ci0gICAgR1VFU1NfVkVDVE9SKCBmcmVlVmVjdG9yICk7Ci0gICAgQ29tcHV0ZV9GdW5jcyggZXhjICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0Z2RlNbXTogICAgICBTZXQgRlZlY3RvciBGcm9tIFN0YWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgwQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGYyLjE0IGYyLjE0IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TRlZGUyggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBGVF9TaG9ydCAgUzsKLSAgICBGVF9Mb25nICAgWCwgWTsKLQotCi0gICAgLyogT25seSB1c2UgbG93IDE2Yml0cywgdGhlbiBzaWduIGV4dGVuZCAqLwotICAgIFMgPSAoRlRfU2hvcnQpYXJnc1sxXTsKLSAgICBZID0gKEZUX0xvbmcpUzsKLSAgICBTID0gKEZUX1Nob3J0KWFyZ3NbMF07Ci0gICAgWCA9IFM7Ci0KLSAgICBOb3JtYWxpemUoIFgsIFksICZleGMtPkdTLmZyZWVWZWN0b3IgKTsKLSAgICBHVUVTU19WRUNUT1IoIHByb2pWZWN0b3IgKTsKLSAgICBDb21wdXRlX0Z1bmNzKCBleGMgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBHUHZbXTogICAgICAgIEdldCBQcm9qZWN0aW9uIFZlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDBDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgZWYyLjE0IC0tPiBlZjIuMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0dQViggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSAgICBpZiAoIGV4Yy0+ZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICkKLSAgICB7Ci0gICAgICBhcmdzWzBdID0gZXhjLT5HUy5ib3RoX3hfYXhpcyA/IDB4NDAwMCA6IDA7Ci0gICAgICBhcmdzWzFdID0gZXhjLT5HUy5ib3RoX3hfYXhpcyA/IDAgOiAweDQwMDA7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBhcmdzWzBdID0gZXhjLT5HUy5wcm9qVmVjdG9yLng7Ci0gICAgICBhcmdzWzFdID0gZXhjLT5HUy5wcm9qVmVjdG9yLnk7Ci0gICAgfQotI2Vsc2UKLSAgICBhcmdzWzBdID0gZXhjLT5HUy5wcm9qVmVjdG9yLng7Ci0gICAgYXJnc1sxXSA9IGV4Yy0+R1MucHJvalZlY3Rvci55OwotI2VuZGlmCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR0Z2W106ICAgICAgICBHZXQgRnJlZWRvbSBWZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgwRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIGVmMi4xNCAtLT4gZWYyLjE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19HRlYoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCi0gICAgaWYgKCBleGMtPmZhY2UtPnVucGF0ZW50ZWRfaGludGluZyApCi0gICAgewotICAgICAgYXJnc1swXSA9IGV4Yy0+R1MuYm90aF94X2F4aXMgPyAweDQwMDAgOiAwOwotICAgICAgYXJnc1sxXSA9IGV4Yy0+R1MuYm90aF94X2F4aXMgPyAwIDogMHg0MDAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgYXJnc1swXSA9IGV4Yy0+R1MuZnJlZVZlY3Rvci54OwotICAgICAgYXJnc1sxXSA9IGV4Yy0+R1MuZnJlZVZlY3Rvci55OwotICAgIH0KLSNlbHNlCi0gICAgYXJnc1swXSA9IGV4Yy0+R1MuZnJlZVZlY3Rvci54OwotICAgIGFyZ3NbMV0gPSBleGMtPkdTLmZyZWVWZWN0b3IueTsKLSNlbmRpZgotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNSUDBbXTogICAgICAgU2V0IFJlZmVyZW5jZSBQb2ludCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU1JQMCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIGV4Yy0+R1MucnAwID0gKEZUX1VTaG9ydClhcmdzWzBdOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNSUDFbXTogICAgICAgU2V0IFJlZmVyZW5jZSBQb2ludCAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU1JQMSggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIGV4Yy0+R1MucnAxID0gKEZUX1VTaG9ydClhcmdzWzBdOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNSUDJbXTogICAgICAgU2V0IFJlZmVyZW5jZSBQb2ludCAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU1JQMiggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIGV4Yy0+R1MucnAyID0gKEZUX1VTaG9ydClhcmdzWzBdOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNNRFtdOiAgICAgICAgU2V0IE1pbmltdW0gRGlzdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU01EKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBleGMtPkdTLm1pbmltdW1fZGlzdGFuY2UgPSBhcmdzWzBdOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNDVlRDSVtdOiAgICAgU2V0IENvbnRyb2wgVmFsdWUgVGFibGUgQ3V0IEluICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0NWVENJKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBleGMtPkdTLmNvbnRyb2xfdmFsdWVfY3V0aW4gPSAoRlRfRjI2RG90NilhcmdzWzBdOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNTV0NJW106ICAgICAgU2V0IFNpbmdsZSBXaWR0aCBDdXQgSW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU1NXQ0koIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgZXhjLT5HUy5zaW5nbGVfd2lkdGhfY3V0aW4gPSAoRlRfRjI2RG90NilhcmdzWzBdOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNTV1tdOiAgICAgICAgU2V0IFNpbmdsZSBXaWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MUYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBpbnQzMj8gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU1NXKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBleGMtPkdTLnNpbmdsZV93aWR0aF92YWx1ZSA9IEZUX011bEZpeCggYXJnc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT50dF9tZXRyaWNzLnNjYWxlICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRkxJUE9OW106ICAgICBTZXQgYXV0by1GTElQIHRvIE9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg0RCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19GTElQT04oIFRUX0V4ZWNDb250ZXh0ICBleGMgKQotICB7Ci0gICAgZXhjLT5HUy5hdXRvX2ZsaXAgPSBUUlVFOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZMSVBPRkZbXTogICAgU2V0IGF1dG8tRkxJUCB0byBPRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfRkxJUE9GRiggVFRfRXhlY0NvbnRleHQgIGV4YyApCi0gIHsKLSAgICBleGMtPkdTLmF1dG9fZmxpcCA9IEZBTFNFOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNBTkdXW106ICAgICAgU2V0IEFOR2xlIFdlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4N0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0FOR1coIHZvaWQgKQotICB7Ci0gICAgLyogaW5zdHJ1Y3Rpb24gbm90IHN1cHBvcnRlZCBhbnltb3JlICovCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0RCW106ICAgICAgICBTZXQgRGVsdGEgQmFzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg1RSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TREIoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIGV4Yy0+R1MuZGVsdGFfYmFzZSA9IChGVF9VU2hvcnQpYXJnc1swXTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTRFNbXTogICAgICAgIFNldCBEZWx0YSBTaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDVGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NEUyggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgaWYgKCAoRlRfVUxvbmcpYXJnc1swXSA+IDZVTCApCi0gICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEJhZF9Bcmd1bWVudCApOwotICAgIGVsc2UKLSAgICAgIGV4Yy0+R1MuZGVsdGFfc2hpZnQgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUlRIR1tdOiAgICAgICBSb3VuZCBUbyBIYWxmIEdyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19SVEhHKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIGV4Yy0+R1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9Ub19IYWxmX0dyaWQ7Ci0gICAgZXhjLT5mdW5jX3JvdW5kICAgICA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX1RvX0hhbGZfR3JpZDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBSVEdbXTogICAgICAgIFJvdW5kIFRvIEdyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDE4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1JURyggVFRfRXhlY0NvbnRleHQgIGV4YyApCi0gIHsKLSAgICBleGMtPkdTLnJvdW5kX3N0YXRlID0gVFRfUm91bmRfVG9fR3JpZDsKLSAgICBleGMtPmZ1bmNfcm91bmQgICAgID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfVG9fR3JpZDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qIFJUREdbXTogICAgICAgUm91bmQgVG8gRG91YmxlIEdyaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4M0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfUlRERyggVFRfRXhlY0NvbnRleHQgIGV4YyApCi0gIHsKLSAgICBleGMtPkdTLnJvdW5kX3N0YXRlID0gVFRfUm91bmRfVG9fRG91YmxlX0dyaWQ7Ci0gICAgZXhjLT5mdW5jX3JvdW5kICAgICA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX1RvX0RvdWJsZV9HcmlkOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogUlVUR1tdOiAgICAgICBSb3VuZCBVcCBUbyBHcmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg3QyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19SVVRHKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIGV4Yy0+R1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9VcF9Ub19HcmlkOwotICAgIGV4Yy0+ZnVuY19yb3VuZCAgICAgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9VcF9Ub19HcmlkOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJEVEdbXTogICAgICAgUm91bmQgRG93biBUbyBHcmlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4N0QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfUkRURyggVFRfRXhlY0NvbnRleHQgIGV4YyApCi0gIHsKLSAgICBleGMtPkdTLnJvdW5kX3N0YXRlID0gVFRfUm91bmRfRG93bl9Ub19HcmlkOwotICAgIGV4Yy0+ZnVuY19yb3VuZCAgICAgPSAoVFRfUm91bmRfRnVuYylSb3VuZF9Eb3duX1RvX0dyaWQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUk9GRltdOiAgICAgICBSb3VuZCBPRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg3QSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19ST0ZGKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIGV4Yy0+R1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9PZmY7Ci0gICAgZXhjLT5mdW5jX3JvdW5kICAgICA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX05vbmU7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1JPVU5EW106ICAgICBTdXBlciBST1VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIEVpbnQ4IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TUk9VTkQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIFNldFN1cGVyUm91bmQoIGV4YywgMHg0MDAwLCBhcmdzWzBdICk7Ci0KLSAgICBleGMtPkdTLnJvdW5kX3N0YXRlID0gVFRfUm91bmRfU3VwZXI7Ci0gICAgZXhjLT5mdW5jX3JvdW5kICAgICA9IChUVF9Sb3VuZF9GdW5jKVJvdW5kX1N1cGVyOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFM0NVJPVU5EW106ICAgU3VwZXIgUk9VTkQgNDUgZGVncmVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfUzQ1Uk9VTkQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgU2V0U3VwZXJSb3VuZCggZXhjLCAweDJENDEsIGFyZ3NbMF0gKTsKLQotICAgIGV4Yy0+R1Mucm91bmRfc3RhdGUgPSBUVF9Sb3VuZF9TdXBlcl80NTsKLSAgICBleGMtPmZ1bmNfcm91bmQgICAgID0gKFRUX1JvdW5kX0Z1bmMpUm91bmRfU3VwZXJfNDU7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR0NbYV06ICAgICAgICBHZXQgQ29vcmRpbmF0ZSBwcm9qZWN0ZWQgb250byAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg0Ni0weDQ3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFhYWDogVU5ET0NVTUVOVEVEOiBNZWFzdXJlcyBmcm9tIHRoZSBvcmlnaW5hbCBnbHlwaCBtdXN0IGJlIHRha2VuICAgICAqLwotICAvKiAgICAgIGFsb25nIHRoZSBkdWFsIHByb2plY3Rpb24gdmVjdG9yISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19HQyggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBGVF9VTG9uZyAgICBMOwotICAgIEZUX0YyNkRvdDYgIFI7Ci0KLQotICAgIEwgPSAoRlRfVUxvbmcpYXJnc1swXTsKLQotICAgIGlmICggQk9VTkRTTCggTCwgZXhjLT56cDIubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICBSID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICggZXhjLT5vcGNvZGUgJiAxICkKLSAgICAgICAgUiA9IEZBU1RfRFVBTFBST0ooICZleGMtPnpwMi5vcmdbTF0gKTsKLSAgICAgIGVsc2UKLSAgICAgICAgUiA9IEZBU1RfUFJPSkVDVCggJmV4Yy0+enAyLmN1cltMXSApOwotICAgIH0KLQotICAgIGFyZ3NbMF0gPSBSOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNDRlNbXTogICAgICAgU2V0IENvb3JkaW5hdGUgRnJvbSBTdGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4NDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBGb3JtdWxhOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgT0EgOj0gT0EgKyAoIHZhbHVlIC0gT0EucCApLyggZi5wICkgKiBmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NDRlMoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBGVF9Mb25nICAgIEs7Ci0gICAgRlRfVVNob3J0ICBMOwotCi0KLSAgICBMID0gKEZUX1VTaG9ydClhcmdzWzBdOwotCi0gICAgaWYgKCBCT1VORFMoIEwsIGV4Yy0+enAyLm5fcG9pbnRzICkgKQotICAgIHsKLSAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEsgPSBGQVNUX1BST0pFQ1QoICZleGMtPnpwMi5jdXJbTF0gKTsKLQotICAgIGV4Yy0+ZnVuY19tb3ZlKCBleGMsICZleGMtPnpwMiwgTCwgYXJnc1sxXSAtIEsgKTsKLQotICAgIC8qIFVORE9DVU1FTlRFRCEgIFRoZSBNUyByYXN0ZXJpemVyIGRvZXMgdGhhdCB3aXRoICovCi0gICAgLyogdHdpbGlnaHQgcG9pbnRzIChjb25maXJtZWQgYnkgR3JlZyBIaXRjaGNvY2spICAgKi8KLSAgICBpZiAoIGV4Yy0+R1MuZ2VwMiA9PSAwICkKLSAgICAgIGV4Yy0+enAyLm9yZ1tMXSA9IGV4Yy0+enAyLmN1cltMXTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNRFthXTogICAgICAgIE1lYXN1cmUgRGlzdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDQ5LTB4NEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4gZjI2LjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogWFhYOiBVTkRPQ1VNRU5URUQ6IE1lYXN1cmUgdGFrZW4gaW4gdGhlIG9yaWdpbmFsIGdseXBoIG11c3QgYmUgYWxvbmcgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICB0aGUgZHVhbCBwcm9qZWN0aW9uIHZlY3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogWFhYOiBVTkRPQ1VNRU5URUQ6IEZsYWcgYXR0cmlidXRlcyBhcmUgaW52ZXJ0ZWQhICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgIDAgPT4gbWVhc3VyZSBkaXN0YW5jZSBpbiBvcmlnaW5hbCBvdXRsaW5lICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAxID0+IG1lYXN1cmUgZGlzdGFuY2UgaW4gZ3JpZC1maXR0ZWQgb3V0bGluZSAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFhYWDogVU5ET0NVTUVOVEVEOiBgenAwIC0genAxJywgYW5kIG5vdCBgenAyIC0genAxISAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX01EKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VTaG9ydCAgIEssIEw7Ci0gICAgRlRfRjI2RG90NiAgRDsKLQotCi0gICAgSyA9IChGVF9VU2hvcnQpYXJnc1sxXTsKLSAgICBMID0gKEZUX1VTaG9ydClhcmdzWzBdOwotCi0gICAgaWYgKCBCT1VORFMoIEwsIGV4Yy0+enAwLm5fcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EUyggSywgZXhjLT56cDEubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICBEID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICggZXhjLT5vcGNvZGUgJiAxICkKLSAgICAgICAgRCA9IFBST0pFQ1QoIGV4Yy0+enAwLmN1ciArIEwsIGV4Yy0+enAxLmN1ciArIEsgKTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLyogWFhYOiBVTkRPQ1VNRU5URUQ6IHR3aWxpZ2h0IHpvbmUgc3BlY2lhbCBjYXNlICovCi0KLSAgICAgICAgaWYgKCBleGMtPkdTLmdlcDAgPT0gMCB8fCBleGMtPkdTLmdlcDEgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9WZWN0b3IqICB2ZWMxID0gZXhjLT56cDAub3JnICsgTDsKLSAgICAgICAgICBGVF9WZWN0b3IqICB2ZWMyID0gZXhjLT56cDEub3JnICsgSzsKLQotCi0gICAgICAgICAgRCA9IERVQUxQUk9KKCB2ZWMxLCB2ZWMyICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgRlRfVmVjdG9yKiAgdmVjMSA9IGV4Yy0+enAwLm9ydXMgKyBMOwotICAgICAgICAgIEZUX1ZlY3RvciogIHZlYzIgPSBleGMtPnpwMS5vcnVzICsgSzsKLQotCi0gICAgICAgICAgaWYgKCBleGMtPm1ldHJpY3MueF9zY2FsZSA9PSBleGMtPm1ldHJpY3MueV9zY2FsZSApCi0gICAgICAgICAgewotICAgICAgICAgICAgLyogdGhpcyBzaG91bGQgYmUgZmFzdGVyICovCi0gICAgICAgICAgICBEID0gRFVBTFBST0ooIHZlYzEsIHZlYzIgKTsKLSAgICAgICAgICAgIEQgPSBGVF9NdWxGaXgoIEQsIGV4Yy0+bWV0cmljcy54X3NjYWxlICk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9WZWN0b3IgIHZlYzsKLQotCi0gICAgICAgICAgICB2ZWMueCA9IEZUX011bEZpeCggdmVjMS0+eCAtIHZlYzItPngsIGV4Yy0+bWV0cmljcy54X3NjYWxlICk7Ci0gICAgICAgICAgICB2ZWMueSA9IEZUX011bEZpeCggdmVjMS0+eSAtIHZlYzItPnksIGV4Yy0+bWV0cmljcy55X3NjYWxlICk7Ci0KLSAgICAgICAgICAgIEQgPSBGQVNUX0RVQUxQUk9KKCAmdmVjICk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0gICAgLyogRGlzYWJsZSBUeXBlIDIgVmFjdWZvcm0gUm91bmRzIC0gZS5nLiBBcmlhbCBOYXJyb3cgKi8KLSAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgICAmJgotICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICYmCi0gICAgICAgICBGVF9BQlMoIEQgKSA9PSA2NCAgKQotICAgICAgRCArPSAxOwotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwotCi0gICAgYXJnc1swXSA9IEQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0RQdlRMW2FdOiAgICBTZXQgRHVhbCBQVmVjdG9yIHRvIExpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg4Ni0weDg3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TRFBWVEwoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX0xvbmcgICAgQSwgQiwgQzsKLSAgICBGVF9VU2hvcnQgIHAxLCBwMjsgICAgICAgICAgICAvKiB3YXMgRlRfSW50IGluIHBhcyB0eXBlIEVSUk9SICovCi0KLSAgICBGVF9CeXRlICBvcGNvZGUgPSBleGMtPm9wY29kZTsKLQotCi0gICAgcDEgPSAoRlRfVVNob3J0KWFyZ3NbMV07Ci0gICAgcDIgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0KLSAgICBpZiAoIEJPVU5EUyggcDIsIGV4Yy0+enAxLm5fcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EUyggcDEsIGV4Yy0+enAyLm5fcG9pbnRzICkgKQotICAgIHsKLSAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHsKLSAgICAgIEZUX1ZlY3RvciogdjEgPSBleGMtPnpwMS5vcmcgKyBwMjsKLSAgICAgIEZUX1ZlY3RvciogdjIgPSBleGMtPnpwMi5vcmcgKyBwMTsKLQotCi0gICAgICBBID0gdjEtPnggLSB2Mi0+eDsKLSAgICAgIEIgPSB2MS0+eSAtIHYyLT55OwotCi0gICAgICAvKiBJZiB2MSA9PSB2MiwgU0RQdlRMIGJlaGF2ZXMgdGhlIHNhbWUgYXMgKi8KLSAgICAgIC8qIFNWVENBW1hdLCByZXNwZWN0aXZlbHkuICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBDb25maXJtZWQgYnkgR3JlZyBIaXRjaGNvY2suICAgICAgICAgICAgKi8KLQotICAgICAgaWYgKCBBID09IDAgJiYgQiA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgQSAgICAgID0gMHg0MDAwOwotICAgICAgICBvcGNvZGUgPSAwOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICggKCBvcGNvZGUgJiAxICkgIT0gMCApCi0gICAgewotICAgICAgQyA9ICBCOyAgIC8qIGNvdW50ZXIgY2xvY2t3aXNlIHJvdGF0aW9uICovCi0gICAgICBCID0gIEE7Ci0gICAgICBBID0gLUM7Ci0gICAgfQotCi0gICAgTm9ybWFsaXplKCBBLCBCLCAmZXhjLT5HUy5kdWFsVmVjdG9yICk7Ci0KLSAgICB7Ci0gICAgICBGVF9WZWN0b3IqICB2MSA9IGV4Yy0+enAxLmN1ciArIHAyOwotICAgICAgRlRfVmVjdG9yKiAgdjIgPSBleGMtPnpwMi5jdXIgKyBwMTsKLQotCi0gICAgICBBID0gdjEtPnggLSB2Mi0+eDsKLSAgICAgIEIgPSB2MS0+eSAtIHYyLT55OwotCi0gICAgICBpZiAoIEEgPT0gMCAmJiBCID09IDAgKQotICAgICAgewotICAgICAgICBBICAgICAgPSAweDQwMDA7Ci0gICAgICAgIG9wY29kZSA9IDA7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCAoIG9wY29kZSAmIDEgKSAhPSAwICkKLSAgICB7Ci0gICAgICBDID0gIEI7ICAgLyogY291bnRlciBjbG9ja3dpc2Ugcm90YXRpb24gKi8KLSAgICAgIEIgPSAgQTsKLSAgICAgIEEgPSAtQzsKLSAgICB9Ci0KLSAgICBOb3JtYWxpemUoIEEsIEIsICZleGMtPkdTLnByb2pWZWN0b3IgKTsKLSAgICBHVUVTU19WRUNUT1IoIGZyZWVWZWN0b3IgKTsKLSAgICBDb21wdXRlX0Z1bmNzKCBleGMgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTWlAwW106ICAgICAgIFNldCBab25lIFBvaW50ZXIgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NaUDAoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBzd2l0Y2ggKCAoRlRfSW50KWFyZ3NbMF0gKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBleGMtPnpwMCA9IGV4Yy0+dHdpbGlnaHQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMToKLSAgICAgIGV4Yy0+enAwID0gZXhjLT5wdHM7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBleGMtPkdTLmdlcDAgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU1pQMVtdOiAgICAgICBTZXQgWm9uZSBQb2ludGVyIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TWlAxKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgc3dpdGNoICggKEZUX0ludClhcmdzWzBdICkKLSAgICB7Ci0gICAgY2FzZSAwOgotICAgICAgZXhjLT56cDEgPSBleGMtPnR3aWxpZ2h0OwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE6Ci0gICAgICBleGMtPnpwMSA9IGV4Yy0+cHRzOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZXhjLT5HUy5nZXAxID0gKEZUX1VTaG9ydClhcmdzWzBdOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNaUDJbXTogICAgICAgU2V0IFpvbmUgUG9pbnRlciAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU1pQMiggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIHN3aXRjaCAoIChGVF9JbnQpYXJnc1swXSApCi0gICAgewotICAgIGNhc2UgMDoKLSAgICAgIGV4Yy0+enAyID0gZXhjLT50d2lsaWdodDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAxOgotICAgICAgZXhjLT56cDIgPSBleGMtPnB0czsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGV4Yy0+R1MuZ2VwMiA9IChGVF9VU2hvcnQpYXJnc1swXTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTWlBTW106ICAgICAgIFNldCBab25lIFBvaW50ZXJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NaUFMoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBzd2l0Y2ggKCAoRlRfSW50KWFyZ3NbMF0gKQotICAgIHsKLSAgICBjYXNlIDA6Ci0gICAgICBleGMtPnpwMCA9IGV4Yy0+dHdpbGlnaHQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgMToKLSAgICAgIGV4Yy0+enAwID0gZXhjLT5wdHM7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBleGMtPnpwMSA9IGV4Yy0+enAwOwotICAgIGV4Yy0+enAyID0gZXhjLT56cDA7Ci0KLSAgICBleGMtPkdTLmdlcDAgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0gICAgZXhjLT5HUy5nZXAxID0gKEZUX1VTaG9ydClhcmdzWzBdOwotICAgIGV4Yy0+R1MuZ2VwMiA9IChGVF9VU2hvcnQpYXJnc1swXTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJTlNUQ1RSTFtdOiAgIElOU1RydWN0aW9uIENvblRSb0wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDhFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgaW50MzIgaW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0lOU1RDVFJMKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VMb25nICBLLCBMLCBLZjsKLQotCi0gICAgSyA9IChGVF9VTG9uZylhcmdzWzFdOwotICAgIEwgPSAoRlRfVUxvbmcpYXJnc1swXTsKLQotICAgIC8qIHNlbGVjdG9yIHZhbHVlcyBjYW5ub3QgYmUgYE9SJ2VkOyAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiB0aGV5IGFyZSBpbmRpY2VzIHN0YXJ0aW5nIHdpdGggaW5kZXggMSwgbm90IGZsYWdzICovCi0gICAgaWYgKCBLIDwgMSB8fCBLID4gMyApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLyogY29udmVydCBpbmRleCB0byBmbGFnIHZhbHVlICovCi0gICAgS2YgPSAxIDw8ICggSyAtIDEgKTsKLQotICAgIGlmICggTCAhPSAwICkKLSAgICB7Ci0gICAgICAvKiBhcmd1bWVudHMgdG8gc2VsZWN0b3JzIGxvb2sgbGlrZSBmbGFnIHZhbHVlcyAqLwotICAgICAgaWYgKCBMICE9IEtmICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIGV4Yy0+R1MuaW5zdHJ1Y3RfY29udHJvbCAmPSB+KEZUX0J5dGUpS2Y7Ci0gICAgZXhjLT5HUy5pbnN0cnVjdF9jb250cm9sIHw9IChGVF9CeXRlKUw7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICAvKiBJTlNUQ1RSTCBtb2RpZnlpbmcgZmxhZyAzIGFsc28gaGFzIGFuIGVmZmVjdCAqLwotICAgIC8qIG91dHNpZGUgb2YgdGhlIENWVCBwcm9ncmFtICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBLID09IDMgKQotICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlID0gRlRfQk9PTCggTCA9PSA0ICk7Ci0jZW5kaWYKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTQ0FOQ1RSTFtdOiAgIFNDQU4gQ29uVFJvTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDg1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyPyAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX1NDQU5DVFJMKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX0ludCAgQTsKLQotCi0gICAgLyogR2V0IFRocmVzaG9sZCAqLwotICAgIEEgPSAoRlRfSW50KSggYXJnc1swXSAmIDB4RkYgKTsKLQotICAgIGlmICggQSA9PSAweEZGICkKLSAgICB7Ci0gICAgICBleGMtPkdTLnNjYW5fY29udHJvbCA9IFRSVUU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKCBBID09IDAgKQotICAgIHsKLSAgICAgIGV4Yy0+R1Muc2Nhbl9jb250cm9sID0gRkFMU0U7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCAoIGFyZ3NbMF0gJiAweDEwMCApICE9IDAgJiYgZXhjLT50dF9tZXRyaWNzLnBwZW0gPD0gQSApCi0gICAgICBleGMtPkdTLnNjYW5fY29udHJvbCA9IFRSVUU7Ci0KLSAgICBpZiAoICggYXJnc1swXSAmIDB4MjAwICkgIT0gMCAmJiBleGMtPnR0X21ldHJpY3Mucm90YXRlZCApCi0gICAgICBleGMtPkdTLnNjYW5fY29udHJvbCA9IFRSVUU7Ci0KLSAgICBpZiAoICggYXJnc1swXSAmIDB4NDAwICkgIT0gMCAmJiBleGMtPnR0X21ldHJpY3Muc3RyZXRjaGVkICkKLSAgICAgIGV4Yy0+R1Muc2Nhbl9jb250cm9sID0gVFJVRTsKLQotICAgIGlmICggKCBhcmdzWzBdICYgMHg4MDAgKSAhPSAwICYmIGV4Yy0+dHRfbWV0cmljcy5wcGVtID4gQSApCi0gICAgICBleGMtPkdTLnNjYW5fY29udHJvbCA9IEZBTFNFOwotCi0gICAgaWYgKCAoIGFyZ3NbMF0gJiAweDEwMDAgKSAhPSAwICYmIGV4Yy0+dHRfbWV0cmljcy5yb3RhdGVkICkKLSAgICAgIGV4Yy0+R1Muc2Nhbl9jb250cm9sID0gRkFMU0U7Ci0KLSAgICBpZiAoICggYXJnc1swXSAmIDB4MjAwMCApICE9IDAgJiYgZXhjLT50dF9tZXRyaWNzLnN0cmV0Y2hlZCApCi0gICAgICBleGMtPkdTLnNjYW5fY29udHJvbCA9IEZBTFNFOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNDQU5UWVBFW106ICAgU0NBTiBUWVBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4OEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzI/IC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0NBTlRZUEUoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgaWYgKCBhcmdzWzBdID49IDAgKQotICAgICAgZXhjLT5HUy5zY2FuX3R5cGUgPSAoRlRfSW50KWFyZ3NbMF07Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTUFOQUdJTkcgT1VUTElORVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRkxJUFBUW106ICAgICBGTElQIFBvaW5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg4MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMi4uLiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19GTElQUFQoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQotICB7Ci0gICAgRlRfVVNob3J0ICBwb2ludDsKLQotCi0gICAgaWYgKCBleGMtPnRvcCA8IGV4Yy0+R1MubG9vcCApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIFRvb19GZXdfQXJndW1lbnRzICk7Ci0gICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0gICAgd2hpbGUgKCBleGMtPkdTLmxvb3AgPiAwICkKLSAgICB7Ci0gICAgICBleGMtPmFyZ3MtLTsKLQotICAgICAgcG9pbnQgPSAoRlRfVVNob3J0KWV4Yy0+c3RhY2tbZXhjLT5hcmdzXTsKLQotICAgICAgaWYgKCBCT1VORFMoIHBvaW50LCBleGMtPnB0cy5uX3BvaW50cyApICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICB7Ci0gICAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBleGMtPnB0cy50YWdzW3BvaW50XSBePSBGVF9DVVJWRV9UQUdfT047Ci0KLSAgICAgIGV4Yy0+R1MubG9vcC0tOwotICAgIH0KLQotICBGYWlsOgotICAgIGV4Yy0+R1MubG9vcCA9IDE7Ci0gICAgZXhjLT5uZXdfdG9wID0gZXhjLT5hcmdzOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZMSVBSR09OW106ICAgRkxJUCBSYW5HZSBPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4ODEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfRkxJUFJHT04oIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVVNob3J0ICBJLCBLLCBMOwotCi0KLSAgICBLID0gKEZUX1VTaG9ydClhcmdzWzFdOwotICAgIEwgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0KLSAgICBpZiAoIEJPVU5EUyggSywgZXhjLT5wdHMubl9wb2ludHMgKSB8fAotICAgICAgICAgQk9VTkRTKCBMLCBleGMtPnB0cy5uX3BvaW50cyApICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKCBJID0gTDsgSSA8PSBLOyBJKysgKQotICAgICAgZXhjLT5wdHMudGFnc1tJXSB8PSBGVF9DVVJWRV9UQUdfT047Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRkxJUFJHT0ZGOiAgICBGTElQIFJhbkdlIE9GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg4MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19GTElQUkdPRkYoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VTaG9ydCAgSSwgSywgTDsKLQotCi0gICAgSyA9IChGVF9VU2hvcnQpYXJnc1sxXTsKLSAgICBMID0gKEZUX1VTaG9ydClhcmdzWzBdOwotCi0gICAgaWYgKCBCT1VORFMoIEssIGV4Yy0+cHRzLm5fcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EUyggTCwgZXhjLT5wdHMubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yICggSSA9IEw7IEkgPD0gSzsgSSsrICkKLSAgICAgIGV4Yy0+cHRzLnRhZ3NbSV0gJj0gfkZUX0NVUlZFX1RBR19PTjsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Jvb2wKLSAgQ29tcHV0ZV9Qb2ludF9EaXNwbGFjZW1lbnQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2KiAgICAgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYqICAgICB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRfR2x5cGhab25lICAgIHpvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VU2hvcnQqICAgICAgcmVmcCApCi0gIHsKLSAgICBUVF9HbHlwaFpvbmVSZWMgIHpwOwotICAgIEZUX1VTaG9ydCAgICAgICAgcDsKLSAgICBGVF9GMjZEb3Q2ICAgICAgIGQ7Ci0KLQotICAgIGlmICggZXhjLT5vcGNvZGUgJiAxICkKLSAgICB7Ci0gICAgICB6cCA9IGV4Yy0+enAwOwotICAgICAgcCAgPSBleGMtPkdTLnJwMTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHpwID0gZXhjLT56cDE7Ci0gICAgICBwICA9IGV4Yy0+R1MucnAyOwotICAgIH0KLQotICAgIGlmICggQk9VTkRTKCBwLCB6cC5uX3BvaW50cyApICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgICpyZWZwID0gMDsKLSAgICAgIHJldHVybiBGQUlMVVJFOwotICAgIH0KLQotICAgICp6b25lID0genA7Ci0gICAgKnJlZnAgPSBwOwotCi0gICAgZCA9IFBST0pFQ1QoIHpwLmN1ciArIHAsIHpwLm9yZyArIHAgKTsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCi0gICAgaWYgKCBleGMtPmZhY2UtPnVucGF0ZW50ZWRfaGludGluZyApCi0gICAgewotICAgICAgaWYgKCBleGMtPkdTLmJvdGhfeF9heGlzICkKLSAgICAgIHsKLSAgICAgICAgKnggPSBkOwotICAgICAgICAqeSA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICp4ID0gMDsKLSAgICAgICAgKnkgPSBkOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0jZW5kaWYKLSAgICB7Ci0gICAgICAqeCA9IEZUX011bERpdiggZCwgKEZUX0xvbmcpZXhjLT5HUy5mcmVlVmVjdG9yLngsIGV4Yy0+Rl9kb3RfUCApOwotICAgICAgKnkgPSBGVF9NdWxEaXYoIGQsIChGVF9Mb25nKWV4Yy0+R1MuZnJlZVZlY3Rvci55LCBleGMtPkZfZG90X1AgKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gU1VDQ0VTUzsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgTW92ZV9acDJfUG9pbnQoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgICBGVF9VU2hvcnQgICAgICAgcG9pbnQsCi0gICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgZHgsCi0gICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgZHksCi0gICAgICAgICAgICAgICAgICBGVF9Cb29sICAgICAgICAgdG91Y2ggKQotICB7Ci0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSAgICBpZiAoIGV4Yy0+ZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+R1MuYm90aF94X2F4aXMgKQotICAgICAgewotICAgICAgICBleGMtPnpwMi5jdXJbcG9pbnRdLnggKz0gZHg7Ci0gICAgICAgIGlmICggdG91Y2ggKQotICAgICAgICAgIGV4Yy0+enAyLnRhZ3NbcG9pbnRdIHw9IEZUX0NVUlZFX1RBR19UT1VDSF9YOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBleGMtPnpwMi5jdXJbcG9pbnRdLnkgKz0gZHk7Ci0gICAgICAgIGlmICggdG91Y2ggKQotICAgICAgICAgIGV4Yy0+enAyLnRhZ3NbcG9pbnRdIHw9IEZUX0NVUlZFX1RBR19UT1VDSF9ZOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKCBleGMtPkdTLmZyZWVWZWN0b3IueCAhPSAwICkKLSAgICB7Ci0gICAgICBleGMtPnpwMi5jdXJbcG9pbnRdLnggKz0gZHg7Ci0gICAgICBpZiAoIHRvdWNoICkKLSAgICAgICAgZXhjLT56cDIudGFnc1twb2ludF0gfD0gRlRfQ1VSVkVfVEFHX1RPVUNIX1g7Ci0gICAgfQotCi0gICAgaWYgKCBleGMtPkdTLmZyZWVWZWN0b3IueSAhPSAwICkKLSAgICB7Ci0gICAgICBleGMtPnpwMi5jdXJbcG9pbnRdLnkgKz0gZHk7Ci0gICAgICBpZiAoIHRvdWNoICkKLSAgICAgICAgZXhjLT56cDIudGFnc1twb2ludF0gfD0gRlRfQ1VSVkVfVEFHX1RPVUNIX1k7Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNIUFthXTogICAgICAgU0hpZnQgUG9pbnQgYnkgdGhlIGxhc3QgcG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MzItMHgzMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIuLi4gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0hQKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIFRUX0dseXBoWm9uZVJlYyAgenA7Ci0gICAgRlRfVVNob3J0ICAgICAgICByZWZwOwotCi0gICAgRlRfRjI2RG90NiAgICAgICBkeCwgZHk7Ci0gICAgRlRfVVNob3J0ICAgICAgICBwb2ludDsKLQotCi0gICAgaWYgKCBleGMtPnRvcCA8IGV4Yy0+R1MubG9vcCApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0gICAgaWYgKCBDb21wdXRlX1BvaW50X0Rpc3BsYWNlbWVudCggZXhjLCAmZHgsICZkeSwgJnpwLCAmcmVmcCApICkKLSAgICAgIHJldHVybjsKLQotICAgIHdoaWxlICggZXhjLT5HUy5sb29wID4gMCApCi0gICAgewotICAgICAgZXhjLT5hcmdzLS07Ci0gICAgICBwb2ludCA9IChGVF9VU2hvcnQpZXhjLT5zdGFja1tleGMtPmFyZ3NdOwotCi0gICAgICBpZiAoIEJPVU5EUyggcG9pbnQsIGV4Yy0+enAyLm5fcG9pbnRzICkgKQotICAgICAgewotICAgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIHsKLSAgICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0gICAgICAvKiBkb2Vzbid0IGZvbGxvdyBDbGVhcnR5cGUgc3BlYyBidXQgcHJvZHVjZXMgYmV0dGVyIHJlc3VsdCAqLwotICAgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgJiYKLSAgICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICkKLSAgICAgICAgTW92ZV9acDJfUG9pbnQoIGV4YywgcG9pbnQsIDAsIGR5LCBUUlVFICk7Ci0gICAgICBlbHNlCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0gICAgICAgIE1vdmVfWnAyX1BvaW50KCBleGMsIHBvaW50LCBkeCwgZHksIFRSVUUgKTsKLQotICAgICAgZXhjLT5HUy5sb29wLS07Ci0gICAgfQotCi0gIEZhaWw6Ci0gICAgZXhjLT5HUy5sb29wID0gMTsKLSAgICBleGMtPm5ld190b3AgPSBleGMtPmFyZ3M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0hDW2FdOiAgICAgICBTSGlmdCBDb250b3VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgzNC0zNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFVORE9DVU1FTlRFRDogQWNjb3JkaW5nIHRvIEdyZWcgSGl0Y2hjb2NrLCB0aGVyZSBpcyBvbmUgKHZpcnR1YWwpICAgICAqLwotICAvKiAgICAgICAgICAgICAgIGNvbnRvdXIgaW4gdGhlIHR3aWxpZ2h0IHpvbmUsIG5hbWVseSBjb250b3VyIG51bWJlciAgICAgKi8KLSAgLyogICAgICAgICAgICAgICB6ZXJvIHdoaWNoIGluY2x1ZGVzIGFsbCBwb2ludHMgb2YgaXQuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0hDKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBUVF9HbHlwaFpvbmVSZWMgIHpwOwotICAgIEZUX1VTaG9ydCAgICAgICAgcmVmcDsKLSAgICBGVF9GMjZEb3Q2ICAgICAgIGR4LCBkeTsKLQotICAgIEZUX1Nob3J0ICAgICAgICAgY29udG91ciwgYm91bmRzOwotICAgIEZUX1VTaG9ydCAgICAgICAgc3RhcnQsIGxpbWl0LCBpOwotCi0KLSAgICBjb250b3VyID0gKEZUX1Nob3J0KWFyZ3NbMF07Ci0gICAgYm91bmRzICA9ICggZXhjLT5HUy5nZXAyID09IDAgKSA/IDEgOiBleGMtPnpwMi5uX2NvbnRvdXJzOwotCi0gICAgaWYgKCBCT1VORFMoIGNvbnRvdXIsIGJvdW5kcyApICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoIENvbXB1dGVfUG9pbnRfRGlzcGxhY2VtZW50KCBleGMsICZkeCwgJmR5LCAmenAsICZyZWZwICkgKQotICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCBjb250b3VyID09IDAgKQotICAgICAgc3RhcnQgPSAwOwotICAgIGVsc2UKLSAgICAgIHN0YXJ0ID0gKEZUX1VTaG9ydCkoIGV4Yy0+enAyLmNvbnRvdXJzW2NvbnRvdXIgLSAxXSArIDEgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT56cDIuZmlyc3RfcG9pbnQgKTsKLQotICAgIC8qIHdlIHVzZSB0aGUgbnVtYmVyIG9mIHBvaW50cyBpZiBpbiB0aGUgdHdpbGlnaHQgem9uZSAqLwotICAgIGlmICggZXhjLT5HUy5nZXAyID09IDAgKQotICAgICAgbGltaXQgPSBleGMtPnpwMi5uX3BvaW50czsKLSAgICBlbHNlCi0gICAgICBsaW1pdCA9IChGVF9VU2hvcnQpKCBleGMtPnpwMi5jb250b3Vyc1tjb250b3VyXSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPnpwMi5maXJzdF9wb2ludCArIDEgKTsKLQotICAgIGZvciAoIGkgPSBzdGFydDsgaSA8IGxpbWl0OyBpKysgKQotICAgIHsKLSAgICAgIGlmICggenAuY3VyICE9IGV4Yy0+enAyLmN1ciB8fCByZWZwICE9IGkgKQotICAgICAgICBNb3ZlX1pwMl9Qb2ludCggZXhjLCBpLCBkeCwgZHksIFRSVUUgKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU0haW2FdOiAgICAgICBTSGlmdCBab25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgzNi0zNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19TSFooIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIFRUX0dseXBoWm9uZVJlYyAgenA7Ci0gICAgRlRfVVNob3J0ICAgICAgICByZWZwOwotICAgIEZUX0YyNkRvdDYgICAgICAgZHgsCi0gICAgICAgICAgICAgICAgICAgICBkeTsKLQotICAgIEZUX1VTaG9ydCAgICAgICAgbGltaXQsIGk7Ci0KLQotICAgIGlmICggQk9VTkRTKCBhcmdzWzBdLCAyICkgKQotICAgIHsKLSAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICggQ29tcHV0ZV9Qb2ludF9EaXNwbGFjZW1lbnQoIGV4YywgJmR4LCAmZHksICZ6cCwgJnJlZnAgKSApCi0gICAgICByZXR1cm47Ci0KLSAgICAvKiBYWFg6IFVORE9DVU1FTlRFRCEgU0haIGRvZXNuJ3QgbW92ZSB0aGUgcGhhbnRvbSBwb2ludHMuICAgICAqLwotICAgIC8qICAgICAgVHdpbGlnaHQgem9uZSBoYXMgbm8gcmVhbCBjb250b3Vycywgc28gdXNlIGBuX3BvaW50cycuICovCi0gICAgLyogICAgICBOb3JtYWwgem9uZSdzIGBuX3BvaW50cycgaW5jbHVkZXMgcGhhbnRvbXMsIHNvIG11c3QgICAgKi8KLSAgICAvKiAgICAgIHVzZSBlbmQgb2YgbGFzdCBjb250b3VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggZXhjLT5HUy5nZXAyID09IDAgKQotICAgICAgbGltaXQgPSAoRlRfVVNob3J0KWV4Yy0+enAyLm5fcG9pbnRzOwotICAgIGVsc2UgaWYgKCBleGMtPkdTLmdlcDIgPT0gMSAmJiBleGMtPnpwMi5uX2NvbnRvdXJzID4gMCApCi0gICAgICBsaW1pdCA9IChGVF9VU2hvcnQpKCBleGMtPnpwMi5jb250b3Vyc1tleGMtPnpwMi5uX2NvbnRvdXJzIC0gMV0gKyAxICk7Ci0gICAgZWxzZQotICAgICAgbGltaXQgPSAwOwotCi0gICAgLyogWFhYOiBVTkRPQ1VNRU5URUQhIFNIWiBkb2Vzbid0IHRvdWNoIHRoZSBwb2ludHMgKi8KLSAgICBmb3IgKCBpID0gMDsgaSA8IGxpbWl0OyBpKysgKQotICAgIHsKLSAgICAgIGlmICggenAuY3VyICE9IGV4Yy0+enAyLmN1ciB8fCByZWZwICE9IGkgKQotICAgICAgICBNb3ZlX1pwMl9Qb2ludCggZXhjLCBpLCBkeCwgZHksIEZBTFNFICk7Ci0gICAgfQotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNIUElYW106ICAgICAgU0hpZnQgcG9pbnRzIGJ5IGEgUElYZWwgYW1vdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiB1aW50MzIuLi4gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfU0hQSVgoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfRjI2RG90NiAgZHgsIGR5OwotICAgIEZUX1VTaG9ydCAgIHBvaW50OwotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotICAgIEZUX0ludCAgICAgIEIxLCBCMjsKLSNlbmRpZgotCi0KLSAgICBpZiAoIGV4Yy0+dG9wIDwgZXhjLT5HUy5sb29wICsgMSApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSAgICBpZiAoIGV4Yy0+ZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+R1MuYm90aF94X2F4aXMgKQotICAgICAgewotICAgICAgICBkeCA9IChGVF9VSW50MzIpYXJnc1swXTsKLSAgICAgICAgZHkgPSAwOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBkeCA9IDA7Ci0gICAgICAgIGR5ID0gKEZUX1VJbnQzMilhcmdzWzBdOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0jZW5kaWYKLSAgICB7Ci0gICAgICBkeCA9IFRUX011bEZpeDE0KCBhcmdzWzBdLCBleGMtPkdTLmZyZWVWZWN0b3IueCApOwotICAgICAgZHkgPSBUVF9NdWxGaXgxNCggYXJnc1swXSwgZXhjLT5HUy5mcmVlVmVjdG9yLnkgKTsKLSAgICB9Ci0KLSAgICB3aGlsZSAoIGV4Yy0+R1MubG9vcCA+IDAgKQotICAgIHsKLSAgICAgIGV4Yy0+YXJncy0tOwotCi0gICAgICBwb2ludCA9IChGVF9VU2hvcnQpZXhjLT5zdGFja1tleGMtPmFyZ3NdOwotCi0gICAgICBpZiAoIEJPVU5EUyggcG9pbnQsIGV4Yy0+enAyLm5fcG9pbnRzICkgKQotICAgICAgewotICAgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIHsKLSAgICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0gICAgICB7Ci0gICAgICAgIC8qICBJZiBub3QgdXNpbmcgaWdub3JlX3hfbW9kZSByZW5kZXJpbmcsIGFsbG93IFpQMiBtb3ZlLiAgICAgICAgKi8KLSAgICAgICAgLyogIElmIGlubGluZSBkZWx0YXMgYXJlbid0IGFsbG93ZWQsIHNraXAgWlAyIG1vdmUuICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgSWYgdXNpbmcgaWdub3JlX3hfbW9kZSByZW5kZXJpbmcsIGFsbG93IFpQMiBwb2ludCBtb3ZlIGlmOiAgICovCi0gICAgICAgIC8qICAgLSBmcmVlZG9tIHZlY3RvciBpcyB5IGFuZCBzcGhfY29tcGF0aWJpbGl0eV9tb2RlIGlzIG9mZiAgICAgKi8KLSAgICAgICAgLyogICAtIHRoZSBnbHlwaCBpcyBjb21wb3NpdGUgYW5kIHRoZSBtb3ZlIGlzIGluIHRoZSBZIGRpcmVjdGlvbiAqLwotICAgICAgICAvKiAgIC0gdGhlIGdseXBoIGlzIHNwZWNpZmljYWxseSBzZXQgdG8gYWxsb3cgU0hQSVggbW92ZXMgICAgICAgICovCi0gICAgICAgIC8qICAgLSB0aGUgbW92ZSBpcyBvbiBhIHByZXZpb3VzbHkgWS10b3VjaGVkIHBvaW50ICAgICAgICAgICAgICAgKi8KLQotICAgICAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgICAmJgotICAgICAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBzYXZlIHBvaW50IGZvciBsYXRlciBjb21wYXJpc29uICovCi0gICAgICAgICAgaWYgKCBleGMtPkdTLmZyZWVWZWN0b3IueSAhPSAwICkKLSAgICAgICAgICAgIEIxID0gZXhjLT56cDIuY3VyW3BvaW50XS55OwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIEIxID0gZXhjLT56cDIuY3VyW3BvaW50XS54OwotCi0gICAgICAgICAgaWYgKCAhZXhjLT5mYWNlLT5zcGhfY29tcGF0aWJpbGl0eV9tb2RlICYmCi0gICAgICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueSAhPSAwICAgICAgICAgICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBNb3ZlX1pwMl9Qb2ludCggZXhjLCBwb2ludCwgZHgsIGR5LCBUUlVFICk7Ci0KLSAgICAgICAgICAgIC8qIHNhdmUgbmV3IHBvaW50ICovCi0gICAgICAgICAgICBpZiAoIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICE9IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBCMiA9IGV4Yy0+enAyLmN1cltwb2ludF0ueTsKLQotICAgICAgICAgICAgICAvKiByZXZlcnNlIGFueSBkaXNhbGxvd2VkIG1vdmVzICovCi0gICAgICAgICAgICAgIGlmICggKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19TS0lQX05PTlBJWEVMX1lfTU9WRVMgKSAmJgotICAgICAgICAgICAgICAgICAgICggQjEgJiA2MyApICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAoIEIyICYgNjMgKSAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgQjEgIT0gQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgTW92ZV9acDJfUG9pbnQoIGV4YywgcG9pbnQsIC1keCwgLWR5LCBUUlVFICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKCBleGMtPmZhY2UtPnNwaF9jb21wYXRpYmlsaXR5X21vZGUgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfUk9VTkRfTk9OUElYRUxfWV9NT1ZFUyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGR4ID0gRlRfUElYX1JPVU5EKCBCMSArIGR4ICkgLSBCMTsKLSAgICAgICAgICAgICAgZHkgPSBGVF9QSVhfUk9VTkQoIEIxICsgZHkgKSAtIEIxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBza2lwIHBvc3QtaXVwIGRlbHRhcyAqLwotICAgICAgICAgICAgaWYgKCBleGMtPml1cF9jYWxsZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAoICggZXhjLT5zcGhfaW5fZnVuY19mbGFncyAmIFNQSF9GREVGX0lOTElORV9ERUxUQV8xICkgfHwKLSAgICAgICAgICAgICAgICAgICAoIGV4Yy0+c3BoX2luX2Z1bmNfZmxhZ3MgJiBTUEhfRkRFRl9JTkxJTkVfREVMVEFfMiApICkgKQotICAgICAgICAgICAgICBnb3RvIFNraXA7Ci0KLSAgICAgICAgICAgIGlmICggISggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfQUxXQVlTX1NLSVBfREVMVEFQICkgJiYKLSAgICAgICAgICAgICAgICAgICggKCBleGMtPmlzX2NvbXBvc2l0ZSAmJiBleGMtPkdTLmZyZWVWZWN0b3IueSAhPSAwICkgfHwKLSAgICAgICAgICAgICAgICAgICAgKCBleGMtPnpwMi50YWdzW3BvaW50XSAmIEZUX0NVUlZFX1RBR19UT1VDSF9ZICkgICAgfHwKLSAgICAgICAgICAgICAgICAgICAgKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19ET19TSFBJWCApICAgICAgKSAgKQotICAgICAgICAgICAgICBNb3ZlX1pwMl9Qb2ludCggZXhjLCBwb2ludCwgMCwgZHksIFRSVUUgKTsKLQotICAgICAgICAgICAgLyogc2F2ZSBuZXcgcG9pbnQgKi8KLSAgICAgICAgICAgIGlmICggZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEIyID0gZXhjLT56cDIuY3VyW3BvaW50XS55OwotCi0gICAgICAgICAgICAgIC8qIHJldmVyc2UgYW55IGRpc2FsbG93ZWQgbW92ZXMgKi8KLSAgICAgICAgICAgICAgaWYgKCAoIEIxICYgNjMgKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgICAgKCBCMiAmIDYzICkgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgIEIxICE9IEIyICAgICAgICAgKQotICAgICAgICAgICAgICAgIE1vdmVfWnAyX1BvaW50KCBleGMsIHBvaW50LCAwLCAtZHksIFRSVUUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoIGV4Yy0+c3BoX2luX2Z1bmNfZmxhZ3MgJiBTUEhfRkRFRl9UWVBFTUFOX0RJQUdFTkRDVFJMICkKLSAgICAgICAgICAgIE1vdmVfWnAyX1BvaW50KCBleGMsIHBvaW50LCBkeCwgZHksIFRSVUUgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgTW92ZV9acDJfUG9pbnQoIGV4YywgcG9pbnQsIGR4LCBkeSwgVFJVRSApOwotICAgICAgfQotCi0gICAgU2tpcDoKLQotI2Vsc2UgLyogIVRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwotCi0gICAgICBNb3ZlX1pwMl9Qb2ludCggZXhjLCBwb2ludCwgZHgsIGR5LCBUUlVFICk7Ci0KLSNlbmRpZiAvKiAhVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0KLSAgICAgIGV4Yy0+R1MubG9vcC0tOwotICAgIH0KLQotICBGYWlsOgotICAgIGV4Yy0+R1MubG9vcCA9IDE7Ci0gICAgZXhjLT5uZXdfdG9wID0gZXhjLT5hcmdzOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1TSVJQW2FdOiAgICAgTW92ZSBTdGFjayBJbmRpcmVjdCBSZWxhdGl2ZSBQb3NpdGlvbiAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4M0EtMHgzQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBmMjYuNiB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfTVNJUlAoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVVNob3J0ICAgcG9pbnQ7Ci0gICAgRlRfRjI2RG90NiAgZGlzdGFuY2U7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICBGVF9GMjZEb3Q2ICBjb250cm9sX3ZhbHVlX2N1dGluID0gMDsgLyogcGFjaWZ5IGNvbXBpbGVyICovCi0KLQotICAgIGlmICggU1VCUElYRUxfSElOVElORyApCi0gICAgewotICAgICAgY29udHJvbF92YWx1ZV9jdXRpbiA9IGV4Yy0+R1MuY29udHJvbF92YWx1ZV9jdXRpbjsKLQotICAgICAgaWYgKCBleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAhKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19OT1JNQUxfUk9VTkQgKSApCi0gICAgICAgIGNvbnRyb2xfdmFsdWVfY3V0aW4gPSAwOwotICAgIH0KLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwotCi0gICAgcG9pbnQgPSAoRlRfVVNob3J0KWFyZ3NbMF07Ci0KLSAgICBpZiAoIEJPVU5EUyggcG9pbnQsICAgICAgIGV4Yy0+enAxLm5fcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EUyggZXhjLT5HUy5ycDAsIGV4Yy0+enAwLm5fcG9pbnRzICkgKQotICAgIHsKLSAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIFVORE9DVU1FTlRFRCEgIFRoZSBNUyByYXN0ZXJpemVyIGRvZXMgdGhhdCB3aXRoICovCi0gICAgLyogdHdpbGlnaHQgcG9pbnRzIChjb25maXJtZWQgYnkgR3JlZyBIaXRjaGNvY2spICAgKi8KLSAgICBpZiAoIGV4Yy0+R1MuZ2VwMSA9PSAwICkKLSAgICB7Ci0gICAgICBleGMtPnpwMS5vcmdbcG9pbnRdID0gZXhjLT56cDAub3JnW2V4Yy0+R1MucnAwXTsKLSAgICAgIGV4Yy0+ZnVuY19tb3ZlX29yaWcoIGV4YywgJmV4Yy0+enAxLCBwb2ludCwgYXJnc1sxXSApOwotICAgICAgZXhjLT56cDEuY3VyW3BvaW50XSA9IGV4Yy0+enAxLm9yZ1twb2ludF07Ci0gICAgfQotCi0gICAgZGlzdGFuY2UgPSBQUk9KRUNUKCBleGMtPnpwMS5jdXIgKyBwb2ludCwgZXhjLT56cDAuY3VyICsgZXhjLT5HUy5ycDAgKTsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotICAgIC8qIHN1YnBpeGVsIGhpbnRpbmcgLSBtYWtlIE1TSVJQIHJlc3BlY3QgQ1ZUIGN1dC1pbjsgKi8KLSAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIEZUX0FCUyggZGlzdGFuY2UgLSBhcmdzWzFdICkgPj0gY29udHJvbF92YWx1ZV9jdXRpbiApCi0gICAgICBkaXN0YW5jZSA9IGFyZ3NbMV07Ci0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0KLSAgICBleGMtPmZ1bmNfbW92ZSggZXhjLCAmZXhjLT56cDEsIHBvaW50LCBhcmdzWzFdIC0gZGlzdGFuY2UgKTsKLQotICAgIGV4Yy0+R1MucnAxID0gZXhjLT5HUy5ycDA7Ci0gICAgZXhjLT5HUy5ycDIgPSBwb2ludDsKLQotICAgIGlmICggKCBleGMtPm9wY29kZSAmIDEgKSAhPSAwICkKLSAgICAgIGV4Yy0+R1MucnAwID0gcG9pbnQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTURBUFthXTogICAgICBNb3ZlIERpcmVjdCBBYnNvbHV0ZSBQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgyRS0weDJGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19NREFQKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVVNob3J0ICAgcG9pbnQ7Ci0gICAgRlRfRjI2RG90NiAgY3VyX2Rpc3Q7Ci0gICAgRlRfRjI2RG90NiAgZGlzdGFuY2U7Ci0KLQotICAgIHBvaW50ID0gKEZUX1VTaG9ydClhcmdzWzBdOwotCi0gICAgaWYgKCBCT1VORFMoIHBvaW50LCBleGMtPnpwMC5uX3BvaW50cyApICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoICggZXhjLT5vcGNvZGUgJiAxICkgIT0gMCApCi0gICAgewotICAgICAgY3VyX2Rpc3QgPSBGQVNUX1BST0pFQ1QoICZleGMtPnpwMC5jdXJbcG9pbnRdICk7Ci0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0gICAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgICAgICAgICAgJiYKLSAgICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAmJgotICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCAhPSAwICkKLSAgICAgICAgZGlzdGFuY2UgPSBSb3VuZF9Ob25lKAotICAgICAgICAgICAgICAgICAgICAgZXhjLAotICAgICAgICAgICAgICAgICAgICAgY3VyX2Rpc3QsCi0gICAgICAgICAgICAgICAgICAgICBleGMtPnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1swXSApIC0gY3VyX2Rpc3Q7Ci0gICAgICBlbHNlCi0jZW5kaWYKLSAgICAgICAgZGlzdGFuY2UgPSBleGMtPmZ1bmNfcm91bmQoCi0gICAgICAgICAgICAgICAgICAgICBleGMsCi0gICAgICAgICAgICAgICAgICAgICBjdXJfZGlzdCwKLSAgICAgICAgICAgICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zWzBdICkgLSBjdXJfZGlzdDsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgZGlzdGFuY2UgPSAwOwotCi0gICAgZXhjLT5mdW5jX21vdmUoIGV4YywgJmV4Yy0+enAwLCBwb2ludCwgZGlzdGFuY2UgKTsKLQotICAgIGV4Yy0+R1MucnAwID0gcG9pbnQ7Ci0gICAgZXhjLT5HUy5ycDEgPSBwb2ludDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBNSUFQW2FdOiAgICAgIE1vdmUgSW5kaXJlY3QgQWJzb2x1dGUgUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDNFLTB4M0YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX01JQVAoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBGVF9VTG9uZyAgICBjdnRFbnRyeTsKLSAgICBGVF9VU2hvcnQgICBwb2ludDsKLSAgICBGVF9GMjZEb3Q2ICBkaXN0YW5jZTsKLSAgICBGVF9GMjZEb3Q2ICBvcmdfZGlzdDsKLSAgICBGVF9GMjZEb3Q2ICBjb250cm9sX3ZhbHVlX2N1dGluOwotCi0KLSAgICBjb250cm9sX3ZhbHVlX2N1dGluID0gZXhjLT5HUy5jb250cm9sX3ZhbHVlX2N1dGluOwotICAgIGN2dEVudHJ5ICAgICAgICAgICAgPSAoRlRfVUxvbmcpYXJnc1sxXTsKLSAgICBwb2ludCAgICAgICAgICAgICAgID0gKEZUX1VTaG9ydClhcmdzWzBdOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0gICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci54ICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueSA9PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgISggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfTk9STUFMX1JPVU5EICkgKQotICAgICAgY29udHJvbF92YWx1ZV9jdXRpbiA9IDA7Ci0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0KLSAgICBpZiAoIEJPVU5EUyggcG9pbnQsICAgICBleGMtPnpwMC5uX3BvaW50cyApIHx8Ci0gICAgICAgICBCT1VORFNMKCBjdnRFbnRyeSwgZXhjLT5jdnRTaXplICkgICAgICApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0gICAgLyogVU5ET0NVTUVOVEVEISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogVGhlIGJlaGF2aW91ciBvZiBhbiBNSUFQIGluc3RydWN0aW9uIGlzIHF1aXRlIGRpZmZlcmVudCB3aGVuIHVzZWQgICovCi0gICAgLyogaW4gdGhlIHR3aWxpZ2h0IHpvbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogRmlyc3QsIG5vIGNvbnRyb2wgdmFsdWUgY3V0LWluIHRlc3QgaXMgcGVyZm9ybWVkIGFzIGl0IHdvdWxkIGZhaWwgICovCi0gICAgLyogYW55d2F5LiAgU2Vjb25kLCB0aGUgb3JpZ2luYWwgcG9pbnQsIGkuZS4gKG9yZ194LG9yZ195KSBvZiAgICAgICAgICovCi0gICAgLyogenAwLnBvaW50LCBpcyBzZXQgdG8gdGhlIGFic29sdXRlLCB1bnJvdW5kZWQgZGlzdGFuY2UgZm91bmQgaW4gdGhlICovCi0gICAgLyogQ1ZULiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogVGhpcyBpcyB1c2VkIGluIHRoZSBDVlQgcHJvZ3JhbXMgb2YgdGhlIE1pY3Jvc29mdCBmb250cyBBcmlhbCwgICAgICovCi0gICAgLyogVGltZXMsIGV0Yy4sIGluIG9yZGVyIHRvIHJlLWFkanVzdCBzb21lIGtleSBmb250IGhlaWdodHMuICBJdCAgICAgICovCi0gICAgLyogYWxsb3dzIHRoZSB1c2Ugb2YgdGhlIElQIGluc3RydWN0aW9uIGluIHRoZSB0d2lsaWdodCB6b25lLCB3aGljaCAgICovCi0gICAgLyogb3RoZXJ3aXNlIHdvdWxkIGJlIGludmFsaWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uLiAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogV2UgaW1wbGVtZW50IGl0IHdpdGggYSBzcGVjaWFsIHNlcXVlbmNlIGZvciB0aGUgdHdpbGlnaHQgem9uZS4gICAgICovCi0gICAgLyogVGhpcyBpcyBhIGJhZCBoYWNrLCBidXQgaXQgc2VlbXMgdG8gd29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogQ29uZmlybWVkIGJ5IEdyZWcgSGl0Y2hjb2NrLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBkaXN0YW5jZSA9IGV4Yy0+ZnVuY19yZWFkX2N2dCggZXhjLCBjdnRFbnRyeSApOwotCi0gICAgaWYgKCBleGMtPkdTLmdlcDAgPT0gMCApICAgLyogSWYgaW4gdHdpbGlnaHQgem9uZSAqLwotICAgIHsKLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICAgIC8qIE9ubHkgYWRqdXN0IGlmIG5vdCBpbiBzcGhfY29tcGF0aWJpbGl0eV9tb2RlIG9yIGlnbm9yZV94X21vZGUuICovCi0gICAgICAvKiBEZXRlcm1pbmVkIHZpYSBleHBlcmltZW50YXRpb24gYW5kIG1heSBiZSBpbmNvcnJlY3QuLi4gICAgICAgICAqLwotICAgICAgaWYgKCAhU1VCUElYRUxfSElOVElORyAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAoICFleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAhZXhjLT5mYWNlLT5zcGhfY29tcGF0aWJpbGl0eV9tb2RlICkgKQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwotICAgICAgICBleGMtPnpwMC5vcmdbcG9pbnRdLnggPSBUVF9NdWxGaXgxNCggZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCApOwotICAgICAgZXhjLT56cDAub3JnW3BvaW50XS55ID0gVFRfTXVsRml4MTQoIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICksCi0gICAgICBleGMtPnpwMC5jdXJbcG9pbnRdICAgPSBleGMtPnpwMC5vcmdbcG9pbnRdOwotICAgIH0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfTUlBUF9IQUNLICkgJiYKLSAgICAgICAgIGRpc3RhbmNlID4gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICE9IDAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgZGlzdGFuY2UgPSAwOwotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwotCi0gICAgb3JnX2Rpc3QgPSBGQVNUX1BST0pFQ1QoICZleGMtPnpwMC5jdXJbcG9pbnRdICk7Ci0KLSAgICBpZiAoICggZXhjLT5vcGNvZGUgJiAxICkgIT0gMCApICAgLyogcm91bmRpbmcgYW5kIGNvbnRyb2wgY3V0LWluIGZsYWcgKi8KLSAgICB7Ci0gICAgICBpZiAoIEZUX0FCUyggZGlzdGFuY2UgLSBvcmdfZGlzdCApID4gY29udHJvbF92YWx1ZV9jdXRpbiApCi0gICAgICAgIGRpc3RhbmNlID0gb3JnX2Rpc3Q7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICAgIGlmICggU1VCUElYRUxfSElOVElORyAgICAgICAgICAmJgotICAgICAgICAgICBleGMtPmlnbm9yZV94X21vZGUgICAgICAgICYmCi0gICAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci54ICE9IDAgKQotICAgICAgICBkaXN0YW5jZSA9IFJvdW5kX05vbmUoIGV4YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1swXSApOwotICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgIGRpc3RhbmNlID0gZXhjLT5mdW5jX3JvdW5kKCBleGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zWzBdICk7Ci0gICAgfQotCi0gICAgZXhjLT5mdW5jX21vdmUoIGV4YywgJmV4Yy0+enAwLCBwb2ludCwgZGlzdGFuY2UgLSBvcmdfZGlzdCApOwotCi0gIEZhaWw6Ci0gICAgZXhjLT5HUy5ycDAgPSBwb2ludDsKLSAgICBleGMtPkdTLnJwMSA9IHBvaW50OwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1EUlBbYWJjZGVdOiAgTW92ZSBEaXJlY3QgUmVsYXRpdmUgUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4QzAtMHhERiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfTURSUCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VTaG9ydCAgIHBvaW50OwotICAgIEZUX0YyNkRvdDYgIG9yZ19kaXN0LCBkaXN0YW5jZSwgbWluaW11bV9kaXN0YW5jZTsKLQotCi0gICAgbWluaW11bV9kaXN0YW5jZSA9IGV4Yy0+R1MubWluaW11bV9kaXN0YW5jZTsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotICAgIGlmICggU1VCUElYRUxfSElOVElORyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueCAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgISggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfTk9STUFMX1JPVU5EICkgKQotICAgICAgbWluaW11bV9kaXN0YW5jZSA9IDA7Ci0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0KLSAgICBwb2ludCA9IChGVF9VU2hvcnQpYXJnc1swXTsKLQotICAgIGlmICggQk9VTkRTKCBwb2ludCwgICAgICAgZXhjLT56cDEubl9wb2ludHMgKSB8fAotICAgICAgICAgQk9VTkRTKCBleGMtPkdTLnJwMCwgZXhjLT56cDAubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0gICAgLyogWFhYOiBJcyB0aGVyZSBzb21lIHVuZG9jdW1lbnRlZCBmZWF0dXJlIHdoaWxlIGluIHRoZSAqLwotICAgIC8qICAgICAgdHdpbGlnaHQgem9uZT8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIC8qIFhYWDogVU5ET0NVTUVOVEVEOiB0d2lsaWdodCB6b25lIHNwZWNpYWwgY2FzZSAqLwotCi0gICAgaWYgKCBleGMtPkdTLmdlcDAgPT0gMCB8fCBleGMtPkdTLmdlcDEgPT0gMCApCi0gICAgewotICAgICAgRlRfVmVjdG9yKiAgdmVjMSA9ICZleGMtPnpwMS5vcmdbcG9pbnRdOwotICAgICAgRlRfVmVjdG9yKiAgdmVjMiA9ICZleGMtPnpwMC5vcmdbZXhjLT5HUy5ycDBdOwotCi0KLSAgICAgIG9yZ19kaXN0ID0gRFVBTFBST0ooIHZlYzEsIHZlYzIgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEZUX1ZlY3RvciogIHZlYzEgPSAmZXhjLT56cDEub3J1c1twb2ludF07Ci0gICAgICBGVF9WZWN0b3IqICB2ZWMyID0gJmV4Yy0+enAwLm9ydXNbZXhjLT5HUy5ycDBdOwotCi0KLSAgICAgIGlmICggZXhjLT5tZXRyaWNzLnhfc2NhbGUgPT0gZXhjLT5tZXRyaWNzLnlfc2NhbGUgKQotICAgICAgewotICAgICAgICAvKiB0aGlzIHNob3VsZCBiZSBmYXN0ZXIgKi8KLSAgICAgICAgb3JnX2Rpc3QgPSBEVUFMUFJPSiggdmVjMSwgdmVjMiApOwotICAgICAgICBvcmdfZGlzdCA9IEZUX011bEZpeCggb3JnX2Rpc3QsIGV4Yy0+bWV0cmljcy54X3NjYWxlICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEZUX1ZlY3RvciAgdmVjOwotCi0KLSAgICAgICAgdmVjLnggPSBGVF9NdWxGaXgoIHZlYzEtPnggLSB2ZWMyLT54LCBleGMtPm1ldHJpY3MueF9zY2FsZSApOwotICAgICAgICB2ZWMueSA9IEZUX011bEZpeCggdmVjMS0+eSAtIHZlYzItPnksIGV4Yy0+bWV0cmljcy55X3NjYWxlICk7Ci0KLSAgICAgICAgb3JnX2Rpc3QgPSBGQVNUX0RVQUxQUk9KKCAmdmVjICk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogc2luZ2xlIHdpZHRoIGN1dC1pbiB0ZXN0ICovCi0KLSAgICBpZiAoIEZUX0FCUyggb3JnX2Rpc3QgLSBleGMtPkdTLnNpbmdsZV93aWR0aF92YWx1ZSApIDwKLSAgICAgICAgIGV4Yy0+R1Muc2luZ2xlX3dpZHRoX2N1dGluICkKLSAgICB7Ci0gICAgICBpZiAoIG9yZ19kaXN0ID49IDAgKQotICAgICAgICBvcmdfZGlzdCA9IGV4Yy0+R1Muc2luZ2xlX3dpZHRoX3ZhbHVlOwotICAgICAgZWxzZQotICAgICAgICBvcmdfZGlzdCA9IC1leGMtPkdTLnNpbmdsZV93aWR0aF92YWx1ZTsKLSAgICB9Ci0KLSAgICAvKiByb3VuZCBmbGFnICovCi0KLSAgICBpZiAoICggZXhjLT5vcGNvZGUgJiA0ICkgIT0gMCApCi0gICAgewotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotICAgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgICAgICAgICYmCi0gICAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgJiYKLSAgICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnggIT0gMCApCi0gICAgICAgIGRpc3RhbmNlID0gUm91bmRfTm9uZSgKLSAgICAgICAgICAgICAgICAgICAgIGV4YywKLSAgICAgICAgICAgICAgICAgICAgIG9yZ19kaXN0LAotICAgICAgICAgICAgICAgICAgICAgZXhjLT50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbZXhjLT5vcGNvZGUgJiAzXSApOwotICAgICAgZWxzZQotI2VuZGlmCi0gICAgICAgIGRpc3RhbmNlID0gZXhjLT5mdW5jX3JvdW5kKAotICAgICAgICAgICAgICAgICAgICAgZXhjLAotICAgICAgICAgICAgICAgICAgICAgb3JnX2Rpc3QsCi0gICAgICAgICAgICAgICAgICAgICBleGMtPnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1tleGMtPm9wY29kZSAmIDNdICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGRpc3RhbmNlID0gUm91bmRfTm9uZSgKLSAgICAgICAgICAgICAgICAgICBleGMsCi0gICAgICAgICAgICAgICAgICAgb3JnX2Rpc3QsCi0gICAgICAgICAgICAgICAgICAgZXhjLT50dF9tZXRyaWNzLmNvbXBlbnNhdGlvbnNbZXhjLT5vcGNvZGUgJiAzXSApOwotCi0gICAgLyogbWluaW11bSBkaXN0YW5jZSBmbGFnICovCi0KLSAgICBpZiAoICggZXhjLT5vcGNvZGUgJiA4ICkgIT0gMCApCi0gICAgewotICAgICAgaWYgKCBvcmdfZGlzdCA+PSAwICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBkaXN0YW5jZSA8IG1pbmltdW1fZGlzdGFuY2UgKQotICAgICAgICAgIGRpc3RhbmNlID0gbWluaW11bV9kaXN0YW5jZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCBkaXN0YW5jZSA+IC1taW5pbXVtX2Rpc3RhbmNlICkKLSAgICAgICAgICBkaXN0YW5jZSA9IC1taW5pbXVtX2Rpc3RhbmNlOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIG5vdyBtb3ZlIHRoZSBwb2ludCAqLwotCi0gICAgb3JnX2Rpc3QgPSBQUk9KRUNUKCBleGMtPnpwMS5jdXIgKyBwb2ludCwgZXhjLT56cDAuY3VyICsgZXhjLT5HUy5ycDAgKTsKLQotICAgIGV4Yy0+ZnVuY19tb3ZlKCBleGMsICZleGMtPnpwMSwgcG9pbnQsIGRpc3RhbmNlIC0gb3JnX2Rpc3QgKTsKLQotICBGYWlsOgotICAgIGV4Yy0+R1MucnAxID0gZXhjLT5HUy5ycDA7Ci0gICAgZXhjLT5HUy5ycDIgPSBwb2ludDsKLQotICAgIGlmICggKCBleGMtPm9wY29kZSAmIDE2ICkgIT0gMCApCi0gICAgICBleGMtPkdTLnJwMCA9IHBvaW50OwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE1JUlBbYWJjZGVdOiAgTW92ZSBJbmRpcmVjdCBSZWxhdGl2ZSBQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4RTAtMHhGRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICBpbnQzMj8gdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfTUlSUCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VTaG9ydCAgIHBvaW50OwotICAgIEZUX1VMb25nICAgIGN2dEVudHJ5OwotCi0gICAgRlRfRjI2RG90NiAgY3Z0X2Rpc3QsCi0gICAgICAgICAgICAgICAgZGlzdGFuY2UsCi0gICAgICAgICAgICAgICAgY3VyX2Rpc3QsCi0gICAgICAgICAgICAgICAgb3JnX2Rpc3QsCi0gICAgICAgICAgICAgICAgY29udHJvbF92YWx1ZV9jdXRpbiwKLSAgICAgICAgICAgICAgICBtaW5pbXVtX2Rpc3RhbmNlOwotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotICAgIEZUX0ludCAgICAgIEIxICAgICAgICAgICA9IDA7IC8qIHBhY2lmeSBjb21waWxlciAqLwotICAgIEZUX0ludCAgICAgIEIyICAgICAgICAgICA9IDA7Ci0gICAgRlRfQm9vbCAgICAgcmV2ZXJzZV9tb3ZlID0gRkFMU0U7Ci0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0KLQotICAgIG1pbmltdW1fZGlzdGFuY2UgICAgPSBleGMtPkdTLm1pbmltdW1fZGlzdGFuY2U7Ci0gICAgY29udHJvbF92YWx1ZV9jdXRpbiA9IGV4Yy0+R1MuY29udHJvbF92YWx1ZV9jdXRpbjsKLSAgICBwb2ludCAgICAgICAgICAgICAgID0gKEZUX1VTaG9ydClhcmdzWzBdOwotICAgIGN2dEVudHJ5ICAgICAgICAgICAgPSAoRlRfVUxvbmcpKCBhcmdzWzFdICsgMSApOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0gICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci54ICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAhKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19OT1JNQUxfUk9VTkQgKSApCi0gICAgICBjb250cm9sX3ZhbHVlX2N1dGluID0gbWluaW11bV9kaXN0YW5jZSA9IDA7Ci0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0KLSAgICAvKiBYWFg6IFVORE9DVU1FTlRFRCEgY3Z0Wy0xXSA9IDAgYWx3YXlzICovCi0KLSAgICBpZiAoIEJPVU5EUyggcG9pbnQsICAgICAgIGV4Yy0+enAxLm5fcG9pbnRzICkgfHwKLSAgICAgICAgIEJPVU5EU0woIGN2dEVudHJ5LCAgIGV4Yy0+Y3Z0U2l6ZSArIDEgKSAgfHwKLSAgICAgICAgIEJPVU5EUyggZXhjLT5HUy5ycDAsIGV4Yy0+enAwLm5fcG9pbnRzICkgKQotICAgIHsKLSAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwotICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgIGlmICggIWN2dEVudHJ5ICkKLSAgICAgIGN2dF9kaXN0ID0gMDsKLSAgICBlbHNlCi0gICAgICBjdnRfZGlzdCA9IGV4Yy0+ZnVuY19yZWFkX2N2dCggZXhjLCBjdnRFbnRyeSAtIDEgKTsKLQotICAgIC8qIHNpbmdsZSB3aWR0aCB0ZXN0ICovCi0KLSAgICBpZiAoIEZUX0FCUyggY3Z0X2Rpc3QgLSBleGMtPkdTLnNpbmdsZV93aWR0aF92YWx1ZSApIDwKLSAgICAgICAgIGV4Yy0+R1Muc2luZ2xlX3dpZHRoX2N1dGluICkKLSAgICB7Ci0gICAgICBpZiAoIGN2dF9kaXN0ID49IDAgKQotICAgICAgICBjdnRfZGlzdCA9ICBleGMtPkdTLnNpbmdsZV93aWR0aF92YWx1ZTsKLSAgICAgIGVsc2UKLSAgICAgICAgY3Z0X2Rpc3QgPSAtZXhjLT5HUy5zaW5nbGVfd2lkdGhfdmFsdWU7Ci0gICAgfQotCi0gICAgLyogVU5ET0NVTUVOVEVEISAgVGhlIE1TIHJhc3Rlcml6ZXIgZG9lcyB0aGF0IHdpdGggKi8KLSAgICAvKiB0d2lsaWdodCBwb2ludHMgKGNvbmZpcm1lZCBieSBHcmVnIEhpdGNoY29jaykgICAqLwotICAgIGlmICggZXhjLT5HUy5nZXAxID09IDAgKQotICAgIHsKLSAgICAgIGV4Yy0+enAxLm9yZ1twb2ludF0ueCA9IGV4Yy0+enAwLm9yZ1tleGMtPkdTLnJwMF0ueCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9NdWxGaXgxNCggY3Z0X2Rpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnggKTsKLSAgICAgIGV4Yy0+enAxLm9yZ1twb2ludF0ueSA9IGV4Yy0+enAwLm9yZ1tleGMtPkdTLnJwMF0ueSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVF9NdWxGaXgxNCggY3Z0X2Rpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnkgKTsKLSAgICAgIGV4Yy0+enAxLmN1cltwb2ludF0gICA9IGV4Yy0+enAxLm9yZ1twb2ludF07Ci0gICAgfQotCi0gICAgb3JnX2Rpc3QgPSBEVUFMUFJPSiggJmV4Yy0+enAxLm9yZ1twb2ludF0sICZleGMtPnpwMC5vcmdbZXhjLT5HUy5ycDBdICk7Ci0gICAgY3VyX2Rpc3QgPSBQUk9KRUNUICggJmV4Yy0+enAxLmN1cltwb2ludF0sICZleGMtPnpwMC5jdXJbZXhjLT5HUy5ycDBdICk7Ci0KLSAgICAvKiBhdXRvLWZsaXAgdGVzdCAqLwotCi0gICAgaWYgKCBleGMtPkdTLmF1dG9fZmxpcCApCi0gICAgewotICAgICAgaWYgKCAoIG9yZ19kaXN0IF4gY3Z0X2Rpc3QgKSA8IDAgKQotICAgICAgICBjdnRfZGlzdCA9IC1jdnRfZGlzdDsKLSAgICB9Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBleGMtPkdTLmZyZWVWZWN0b3IueSAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfVElNRVNfTkVXX1JPTUFOX0hBQ0sgKSApCi0gICAgewotICAgICAgaWYgKCBjdXJfZGlzdCA8IC02NCApCi0gICAgICAgIGN2dF9kaXN0IC09IDE2OwotICAgICAgZWxzZSBpZiAoIGN1cl9kaXN0ID4gNjQgJiYgY3VyX2Rpc3QgPCA4NCApCi0gICAgICAgIGN2dF9kaXN0ICs9IDMyOwotICAgIH0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KLQotICAgIC8qIGNvbnRyb2wgdmFsdWUgY3V0LWluIGFuZCByb3VuZCAqLwotCi0gICAgaWYgKCAoIGV4Yy0+b3Bjb2RlICYgNCApICE9IDAgKQotICAgIHsKLSAgICAgIC8qIFhYWDogVU5ET0NVTUVOVEVEISAgT25seSBwZXJmb3JtIGN1dC1pbiB0ZXN0IHdoZW4gYm90aCBwb2ludHMgKi8KLSAgICAgIC8qICAgICAgcmVmZXIgdG8gdGhlIHNhbWUgem9uZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgaWYgKCBleGMtPkdTLmdlcDAgPT0gZXhjLT5HUy5nZXAxICkKLSAgICAgIHsKLSAgICAgICAgLyogWFhYOiBBY2NvcmRpbmcgdG8gR3JlZyBIaXRjaGNvY2ssIHRoZSBmb2xsb3dpbmcgd29yZGluZyBpcyAqLwotICAgICAgICAvKiAgICAgIHRoZSByaWdodCBvbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogICAgICAgIFdoZW4gdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdmFsdWUgaW4gICAqLwotICAgICAgICAvKiAgICAgICAgdGhlIHRhYmxlIFtDVlRdIGFuZCB0aGUgbWVhc3VyZW1lbnQgZGlyZWN0bHkgZnJvbSAgICovCi0gICAgICAgIC8qICAgICAgICB0aGUgb3V0bGluZSBpcyBfZ3JlYXRlcl8gdGhhbiB0aGUgY3V0X2luIHZhbHVlLCB0aGUgKi8KLSAgICAgICAgLyogICAgICAgIG91dGxpbmUgbWVhc3VyZW1lbnQgaXMgdXNlZC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgVGhpcyBpcyBmcm9tIGBpbnN0Z2x5LmRvYycuICBUaGUgZGVzY3JpcHRpb24gaW4gICAgICAgKi8KLSAgICAgICAgLyogICAgICBgdHRpbnN0Mi5kb2MnLCB2ZXJzaW9uIDEuNjYsIGlzIHRodXMgaW5jb3JyZWN0IHNpbmNlICAqLwotICAgICAgICAvKiAgICAgIGl0IGltcGxpZXMgYD49JyBpbnN0ZWFkIG9mIGA+Jy4gICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgaWYgKCBGVF9BQlMoIGN2dF9kaXN0IC0gb3JnX2Rpc3QgKSA+IGNvbnRyb2xfdmFsdWVfY3V0aW4gKQotICAgICAgICAgIGN2dF9kaXN0ID0gb3JnX2Rpc3Q7Ci0gICAgICB9Ci0KLSAgICAgIGRpc3RhbmNlID0gZXhjLT5mdW5jX3JvdW5kKAotICAgICAgICAgICAgICAgICAgIGV4YywKLSAgICAgICAgICAgICAgICAgICBjdnRfZGlzdCwKLSAgICAgICAgICAgICAgICAgICBleGMtPnR0X21ldHJpY3MuY29tcGVuc2F0aW9uc1tleGMtPm9wY29kZSAmIDNdICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICAgIC8qIGRvIGN2dCBjdXQtaW4gYWx3YXlzIGluIE1JUlAgZm9yIHNwaCAqLwotICAgICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgICAgICAgICAgICYmCi0gICAgICAgICAgIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAgJiYKLSAgICAgICAgICAgZXhjLT5HUy5nZXAwID09IGV4Yy0+R1MuZ2VwMSApCi0gICAgICB7Ci0gICAgICAgIGlmICggRlRfQUJTKCBjdnRfZGlzdCAtIG9yZ19kaXN0ICkgPiBjb250cm9sX3ZhbHVlX2N1dGluICkKLSAgICAgICAgICBjdnRfZGlzdCA9IG9yZ19kaXN0OwotICAgICAgfQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwotCi0gICAgICBkaXN0YW5jZSA9IFJvdW5kX05vbmUoCi0gICAgICAgICAgICAgICAgICAgZXhjLAotICAgICAgICAgICAgICAgICAgIGN2dF9kaXN0LAotICAgICAgICAgICAgICAgICAgIGV4Yy0+dHRfbWV0cmljcy5jb21wZW5zYXRpb25zW2V4Yy0+b3Bjb2RlICYgM10gKTsKLSAgICB9Ci0KLSAgICAvKiBtaW5pbXVtIGRpc3RhbmNlIHRlc3QgKi8KLQotICAgIGlmICggKCBleGMtPm9wY29kZSAmIDggKSAhPSAwICkKLSAgICB7Ci0gICAgICBpZiAoIG9yZ19kaXN0ID49IDAgKQotICAgICAgewotICAgICAgICBpZiAoIGRpc3RhbmNlIDwgbWluaW11bV9kaXN0YW5jZSApCi0gICAgICAgICAgZGlzdGFuY2UgPSBtaW5pbXVtX2Rpc3RhbmNlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoIGRpc3RhbmNlID4gLW1pbmltdW1fZGlzdGFuY2UgKQotICAgICAgICAgIGRpc3RhbmNlID0gLW1pbmltdW1fZGlzdGFuY2U7Ci0gICAgICB9Ci0gICAgfQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0gICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICkKLSAgICB7Ci0gICAgICBCMSA9IGV4Yy0+enAxLmN1cltwb2ludF0ueTsKLQotICAgICAgLyogUm91bmQgbW92ZXMgaWYgbmVjZXNzYXJ5ICovCi0gICAgICBpZiAoIGV4Yy0+aWdub3JlX3hfbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfUk9VTkRfTk9OUElYRUxfWV9NT1ZFUyApICkKLSAgICAgICAgZGlzdGFuY2UgPSBGVF9QSVhfUk9VTkQoIEIxICsgZGlzdGFuY2UgLSBjdXJfZGlzdCApIC0gQjEgKyBjdXJfZGlzdDsKLQotICAgICAgaWYgKCBleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgKCBleGMtPm9wY29kZSAmIDE2ICkgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAoIGV4Yy0+b3Bjb2RlICYgOCApID09IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfQ09VUklFUl9ORVdfMl9IQUNLICkgKQotICAgICAgICBkaXN0YW5jZSArPSA2NDsKLSAgICB9Ci0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0KLSAgICBleGMtPmZ1bmNfbW92ZSggZXhjLCAmZXhjLT56cDEsIHBvaW50LCBkaXN0YW5jZSAtIGN1cl9kaXN0ICk7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgKQotICAgIHsKLSAgICAgIEIyID0gZXhjLT56cDEuY3VyW3BvaW50XS55OwotCi0gICAgICAvKiBSZXZlcnNlIG1vdmUgaWYgbmVjZXNzYXJ5ICovCi0gICAgICBpZiAoIGV4Yy0+aWdub3JlX3hfbW9kZSApCi0gICAgICB7Ci0gICAgICAgIGlmICggZXhjLT5mYWNlLT5zcGhfY29tcGF0aWJpbGl0eV9tb2RlICYmCi0gICAgICAgICAgICAgZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCAgICAgICAgICYmCi0gICAgICAgICAgICAgKCBCMSAmIDYzICkgPT0gMCAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgKCBCMiAmIDYzICkgIT0gMCAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICByZXZlcnNlX21vdmUgPSBUUlVFOwotCi0gICAgICAgIGlmICggKCBleGMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19TS0lQX05PTlBJWEVMX1lfTU9WRVMgKSAmJgotICAgICAgICAgICAgIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAoIEIyICYgNjMgKSAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgKCBCMSAmIDYzICkgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgcmV2ZXJzZV9tb3ZlID0gVFJVRTsKLSAgICAgIH0KLQotICAgICAgaWYgKCByZXZlcnNlX21vdmUgKQotICAgICAgICBleGMtPmZ1bmNfbW92ZSggZXhjLCAmZXhjLT56cDEsIHBvaW50LCAtKCBkaXN0YW5jZSAtIGN1cl9kaXN0ICkgKTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KLQotICBGYWlsOgotICAgIGV4Yy0+R1MucnAxID0gZXhjLT5HUy5ycDA7Ci0KLSAgICBpZiAoICggZXhjLT5vcGNvZGUgJiAxNiApICE9IDAgKQotICAgICAgZXhjLT5HUy5ycDAgPSBwb2ludDsKLQotICAgIGV4Yy0+R1MucnAyID0gcG9pbnQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogQUxJR05SUFtdOiAgICBBTElHTiBSZWxhdGl2ZSBQb2ludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgzQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiB1aW50MzIuLi4gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19BTElHTlJQKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIEZUX1VTaG9ydCAgIHBvaW50OwotICAgIEZUX0YyNkRvdDYgIGRpc3RhbmNlOwotCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZXhjLT5pZ25vcmVfeF9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBleGMtPml1cF9jYWxsZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfTk9fQUxJR05SUF9BRlRFUl9JVVAgKSApCi0gICAgewotICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwotICAgICAgZ290byBGYWlsOwotICAgIH0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KLQotICAgIGlmICggZXhjLT50b3AgPCBleGMtPkdTLmxvb3AgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgQk9VTkRTKCBleGMtPkdTLnJwMCwgZXhjLT56cDAubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0gICAgd2hpbGUgKCBleGMtPkdTLmxvb3AgPiAwICkKLSAgICB7Ci0gICAgICBleGMtPmFyZ3MtLTsKLQotICAgICAgcG9pbnQgPSAoRlRfVVNob3J0KWV4Yy0+c3RhY2tbZXhjLT5hcmdzXTsKLQotICAgICAgaWYgKCBCT1VORFMoIHBvaW50LCBleGMtPnpwMS5uX3BvaW50cyApICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICB7Ci0gICAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBkaXN0YW5jZSA9IFBST0pFQ1QoIGV4Yy0+enAxLmN1ciArIHBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+enAwLmN1ciArIGV4Yy0+R1MucnAwICk7Ci0KLSAgICAgICAgZXhjLT5mdW5jX21vdmUoIGV4YywgJmV4Yy0+enAxLCBwb2ludCwgLWRpc3RhbmNlICk7Ci0gICAgICB9Ci0KLSAgICAgIGV4Yy0+R1MubG9vcC0tOwotICAgIH0KLQotICBGYWlsOgotICAgIGV4Yy0+R1MubG9vcCA9IDE7Ci0gICAgZXhjLT5uZXdfdG9wID0gZXhjLT5hcmdzOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElTRUNUW106ICAgICAgbW92ZXMgcG9pbnQgdG8gSW50ZXJTRUNUaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MEYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICA1ICogdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfSVNFQ1QoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVVNob3J0ICAgcG9pbnQsCi0gICAgICAgICAgICAgICAgYTAsIGExLAotICAgICAgICAgICAgICAgIGIwLCBiMTsKLQotICAgIEZUX0YyNkRvdDYgIGRpc2NyaW1pbmFudCwgZG90cHJvZHVjdDsKLQotICAgIEZUX0YyNkRvdDYgIGR4LCAgZHksCi0gICAgICAgICAgICAgICAgZGF4LCBkYXksCi0gICAgICAgICAgICAgICAgZGJ4LCBkYnk7Ci0KLSAgICBGVF9GMjZEb3Q2ICB2YWw7Ci0KLSAgICBGVF9WZWN0b3IgICBSOwotCi0KLSAgICBwb2ludCA9IChGVF9VU2hvcnQpYXJnc1swXTsKLQotICAgIGEwID0gKEZUX1VTaG9ydClhcmdzWzFdOwotICAgIGExID0gKEZUX1VTaG9ydClhcmdzWzJdOwotICAgIGIwID0gKEZUX1VTaG9ydClhcmdzWzNdOwotICAgIGIxID0gKEZUX1VTaG9ydClhcmdzWzRdOwotCi0gICAgaWYgKCBCT1VORFMoIGIwLCAgICBleGMtPnpwMC5uX3BvaW50cyApIHx8Ci0gICAgICAgICBCT1VORFMoIGIxLCAgICBleGMtPnpwMC5uX3BvaW50cyApIHx8Ci0gICAgICAgICBCT1VORFMoIGEwLCAgICBleGMtPnpwMS5uX3BvaW50cyApIHx8Ci0gICAgICAgICBCT1VORFMoIGExLCAgICBleGMtPnpwMS5uX3BvaW50cyApIHx8Ci0gICAgICAgICBCT1VORFMoIHBvaW50LCBleGMtPnpwMi5uX3BvaW50cyApICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBDcmFtZXIncyBydWxlICovCi0KLSAgICBkYnggPSBleGMtPnpwMC5jdXJbYjFdLnggLSBleGMtPnpwMC5jdXJbYjBdLng7Ci0gICAgZGJ5ID0gZXhjLT56cDAuY3VyW2IxXS55IC0gZXhjLT56cDAuY3VyW2IwXS55OwotCi0gICAgZGF4ID0gZXhjLT56cDEuY3VyW2ExXS54IC0gZXhjLT56cDEuY3VyW2EwXS54OwotICAgIGRheSA9IGV4Yy0+enAxLmN1clthMV0ueSAtIGV4Yy0+enAxLmN1clthMF0ueTsKLQotICAgIGR4ID0gZXhjLT56cDAuY3VyW2IwXS54IC0gZXhjLT56cDEuY3VyW2EwXS54OwotICAgIGR5ID0gZXhjLT56cDAuY3VyW2IwXS55IC0gZXhjLT56cDEuY3VyW2EwXS55OwotCi0gICAgZGlzY3JpbWluYW50ID0gRlRfTXVsRGl2KCBkYXgsIC1kYnksIDB4NDAgKSArCi0gICAgICAgICAgICAgICAgICAgRlRfTXVsRGl2KCBkYXksIGRieCwgMHg0MCApOwotICAgIGRvdHByb2R1Y3QgICA9IEZUX011bERpdiggZGF4LCBkYngsIDB4NDAgKSArCi0gICAgICAgICAgICAgICAgICAgRlRfTXVsRGl2KCBkYXksIGRieSwgMHg0MCApOwotCi0gICAgLyogVGhlIGRpc2NyaW1pbmFudCBhYm92ZSBpcyBhY3R1YWxseSBhIGNyb3NzIHByb2R1Y3Qgb2YgdmVjdG9ycyAgICAgKi8KLSAgICAvKiBkYSBhbmQgZGIuIFRvZ2V0aGVyIHdpdGggdGhlIGRvdCBwcm9kdWN0LCB0aGV5IGNhbiBiZSB1c2VkIGFzICAgICAqLwotICAgIC8qIHN1cnJvZ2F0ZXMgZm9yIHNpbmUgYW5kIGNvc2luZSBvZiB0aGUgYW5nbGUgYmV0d2VlbiB0aGUgdmVjdG9ycy4gICovCi0gICAgLyogSW5kZWVkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICBkb3Rwcm9kdWN0ICAgPSB8ZGF8fGRifGNvcyhhbmdsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgIGRpc2NyaW1pbmFudCA9IHxkYXx8ZGJ8c2luKGFuZ2xlKSAgICAgLiAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogV2UgdXNlIHRoZXNlIGVxdWF0aW9ucyB0byByZWplY3QgZ3JhemluZyBpbnRlcnNlY3Rpb25zIGJ5ICAgICAgICAgKi8KLSAgICAvKiB0aHJlc2hvbGRpbmcgYWJzKHRhbihhbmdsZSkpIGF0IDEvMTksIGNvcnJlc3BvbmRpbmcgdG8gMyBkZWdyZWVzLiAqLwotICAgIGlmICggMTkgKiBGVF9BQlMoIGRpc2NyaW1pbmFudCApID4gRlRfQUJTKCBkb3Rwcm9kdWN0ICkgKQotICAgIHsKLSAgICAgIHZhbCA9IEZUX011bERpdiggZHgsIC1kYnksIDB4NDAgKSArIEZUX011bERpdiggZHksIGRieCwgMHg0MCApOwotCi0gICAgICBSLnggPSBGVF9NdWxEaXYoIHZhbCwgZGF4LCBkaXNjcmltaW5hbnQgKTsKLSAgICAgIFIueSA9IEZUX011bERpdiggdmFsLCBkYXksIGRpc2NyaW1pbmFudCApOwotCi0gICAgICBleGMtPnpwMi5jdXJbcG9pbnRdLnggPSBleGMtPnpwMS5jdXJbYTBdLnggKyBSLng7Ci0gICAgICBleGMtPnpwMi5jdXJbcG9pbnRdLnkgPSBleGMtPnpwMS5jdXJbYTBdLnkgKyBSLnk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvKiBlbHNlLCB0YWtlIHRoZSBtaWRkbGUgb2YgdGhlIG1pZGRsZXMgb2YgQSBhbmQgQiAqLwotCi0gICAgICBleGMtPnpwMi5jdXJbcG9pbnRdLnggPSAoIGV4Yy0+enAxLmN1clthMF0ueCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+enAxLmN1clthMV0ueCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+enAwLmN1cltiMF0ueCArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+enAwLmN1cltiMV0ueCApIC8gNDsKLSAgICAgIGV4Yy0+enAyLmN1cltwb2ludF0ueSA9ICggZXhjLT56cDEuY3VyW2EwXS55ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT56cDEuY3VyW2ExXS55ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT56cDAuY3VyW2IwXS55ICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT56cDAuY3VyW2IxXS55ICkgLyA0OwotICAgIH0KLQotICAgIGV4Yy0+enAyLnRhZ3NbcG9pbnRdIHw9IEZUX0NVUlZFX1RBR19UT1VDSF9CT1RIOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFMSUdOUFRTW106ICAgQUxJR04gUG9pblRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIgdWludDMyIC0tPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBzdGF0aWMgdm9pZAotICBJbnNfQUxJR05QVFMoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVVNob3J0ICAgcDEsIHAyOwotICAgIEZUX0YyNkRvdDYgIGRpc3RhbmNlOwotCi0KLSAgICBwMSA9IChGVF9VU2hvcnQpYXJnc1swXTsKLSAgICBwMiA9IChGVF9VU2hvcnQpYXJnc1sxXTsKLQotICAgIGlmICggQk9VTkRTKCBwMSwgZXhjLT56cDEubl9wb2ludHMgKSB8fAotICAgICAgICAgQk9VTkRTKCBwMiwgZXhjLT56cDAubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZGlzdGFuY2UgPSBQUk9KRUNUKCBleGMtPnpwMC5jdXIgKyBwMiwgZXhjLT56cDEuY3VyICsgcDEgKSAvIDI7Ci0KLSAgICBleGMtPmZ1bmNfbW92ZSggZXhjLCAmZXhjLT56cDEsIHAxLCBkaXN0YW5jZSApOwotICAgIGV4Yy0+ZnVuY19tb3ZlKCBleGMsICZleGMtPnpwMCwgcDIsIC1kaXN0YW5jZSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIElQW106ICAgICAgICAgSW50ZXJwb2xhdGUgUG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBPcGNvZGUgcmFuZ2U6IDB4MzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU3RhY2s6ICAgICAgICB1aW50MzIuLi4gLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIFNPTUVUSU1FUywgRFVNQkVSIENPREUgSVMgQkVUVEVSIENPREUgKi8KLQotICBzdGF0aWMgdm9pZAotICBJbnNfSVAoIFRUX0V4ZWNDb250ZXh0ICBleGMgKQotICB7Ci0gICAgRlRfRjI2RG90NiAgb2xkX3JhbmdlLCBjdXJfcmFuZ2U7Ci0gICAgRlRfVmVjdG9yKiAgb3J1c19iYXNlOwotICAgIEZUX1ZlY3RvciogIGN1cl9iYXNlOwotICAgIEZUX0ludCAgICAgIHR3aWxpZ2h0OwotCi0KLSAgICBpZiAoIGV4Yy0+dG9wIDwgZXhjLT5HUy5sb29wICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFdlIG5lZWQgdG8gZGVhbCBpbiBhIHNwZWNpYWwgd2F5IHdpdGggdGhlIHR3aWxpZ2h0IHpvbmUuCi0gICAgICogT3RoZXJ3aXNlLCBieSBkZWZpbml0aW9uLCB0aGUgdmFsdWUgb2YgZXhjLT50d2lsaWdodC5vcnVzW25dIGlzICgwLDApLAotICAgICAqIGZvciBldmVyeSBuLgotICAgICAqLwotICAgIHR3aWxpZ2h0ID0gZXhjLT5HUy5nZXAwID09IDAgfHwgZXhjLT5HUy5nZXAxID09IDAgfHwgZXhjLT5HUy5nZXAyID09IDA7Ci0KLSAgICBpZiAoIEJPVU5EUyggZXhjLT5HUy5ycDEsIGV4Yy0+enAwLm5fcG9pbnRzICkgKQotICAgIHsKLSAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwotICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgIGlmICggdHdpbGlnaHQgKQotICAgICAgb3J1c19iYXNlID0gJmV4Yy0+enAwLm9yZ1tleGMtPkdTLnJwMV07Ci0gICAgZWxzZQotICAgICAgb3J1c19iYXNlID0gJmV4Yy0+enAwLm9ydXNbZXhjLT5HUy5ycDFdOwotCi0gICAgY3VyX2Jhc2UgPSAmZXhjLT56cDAuY3VyW2V4Yy0+R1MucnAxXTsKLQotICAgIC8qIFhYWDogVGhlcmUgYXJlIHNvbWUgZ2x5cGhzIGluIHNvbWUgYnJhaW5kZWFkIGJ1dCBwb3B1bGFyICovCi0gICAgLyogICAgICBmb250cyBvdXQgdGhlcmUgKGUuZy4gW2FldV1ncmF2ZSBpbiBtb25vdHlwZS50dGYpICAgKi8KLSAgICAvKiAgICAgIGNhbGxpbmcgSVBbXSB3aXRoIGJhZCB2YWx1ZXMgb2YgcnBbMTJdLiAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgRG8gc29tZXRoaW5nIHNhbmUgd2hlbiB0aGlzIG9kZCB0aGluZyBoYXBwZW5zLiAgICAgICovCi0gICAgaWYgKCBCT1VORFMoIGV4Yy0+R1MucnAxLCBleGMtPnpwMC5uX3BvaW50cyApIHx8Ci0gICAgICAgICBCT1VORFMoIGV4Yy0+R1MucnAyLCBleGMtPnpwMS5uX3BvaW50cyApICkKLSAgICB7Ci0gICAgICBvbGRfcmFuZ2UgPSAwOwotICAgICAgY3VyX3JhbmdlID0gMDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICggdHdpbGlnaHQgKQotICAgICAgICBvbGRfcmFuZ2UgPSBEVUFMUFJPSiggJmV4Yy0+enAxLm9yZ1tleGMtPkdTLnJwMl0sIG9ydXNfYmFzZSApOwotICAgICAgZWxzZSBpZiAoIGV4Yy0+bWV0cmljcy54X3NjYWxlID09IGV4Yy0+bWV0cmljcy55X3NjYWxlICkKLSAgICAgICAgb2xkX3JhbmdlID0gRFVBTFBST0ooICZleGMtPnpwMS5vcnVzW2V4Yy0+R1MucnAyXSwgb3J1c19iYXNlICk7Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEZUX1ZlY3RvciAgdmVjOwotCi0KLSAgICAgICAgdmVjLnggPSBGVF9NdWxGaXgoIGV4Yy0+enAxLm9ydXNbZXhjLT5HUy5ycDJdLnggLSBvcnVzX2Jhc2UtPngsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPm1ldHJpY3MueF9zY2FsZSApOwotICAgICAgICB2ZWMueSA9IEZUX011bEZpeCggZXhjLT56cDEub3J1c1tleGMtPkdTLnJwMl0ueSAtIG9ydXNfYmFzZS0+eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+bWV0cmljcy55X3NjYWxlICk7Ci0KLSAgICAgICAgb2xkX3JhbmdlID0gRkFTVF9EVUFMUFJPSiggJnZlYyApOwotICAgICAgfQotCi0gICAgICBjdXJfcmFuZ2UgPSBQUk9KRUNUKCAmZXhjLT56cDEuY3VyW2V4Yy0+R1MucnAyXSwgY3VyX2Jhc2UgKTsKLSAgICB9Ci0KLSAgICBmb3IgKCA7IGV4Yy0+R1MubG9vcCA+IDA7IC0tZXhjLT5HUy5sb29wICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICAgICBwb2ludCA9IChGVF9VSW50KWV4Yy0+c3RhY2tbLS1leGMtPmFyZ3NdOwotICAgICAgRlRfRjI2RG90NiAgb3JnX2Rpc3QsIGN1cl9kaXN0LCBuZXdfZGlzdDsKLQotCi0gICAgICAvKiBjaGVjayBwb2ludCBib3VuZHMgKi8KLSAgICAgIGlmICggQk9VTkRTKCBwb2ludCwgZXhjLT56cDIubl9wb2ludHMgKSApCi0gICAgICB7Ci0gICAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgewotICAgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9SZWZlcmVuY2UgKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggdHdpbGlnaHQgKQotICAgICAgICBvcmdfZGlzdCA9IERVQUxQUk9KKCAmZXhjLT56cDIub3JnW3BvaW50XSwgb3J1c19iYXNlICk7Ci0gICAgICBlbHNlIGlmICggZXhjLT5tZXRyaWNzLnhfc2NhbGUgPT0gZXhjLT5tZXRyaWNzLnlfc2NhbGUgKQotICAgICAgICBvcmdfZGlzdCA9IERVQUxQUk9KKCAmZXhjLT56cDIub3J1c1twb2ludF0sIG9ydXNfYmFzZSApOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBGVF9WZWN0b3IgIHZlYzsKLQotCi0gICAgICAgIHZlYy54ID0gRlRfTXVsRml4KCBleGMtPnpwMi5vcnVzW3BvaW50XS54IC0gb3J1c19iYXNlLT54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjLT5tZXRyaWNzLnhfc2NhbGUgKTsKLSAgICAgICAgdmVjLnkgPSBGVF9NdWxGaXgoIGV4Yy0+enAyLm9ydXNbcG9pbnRdLnkgLSBvcnVzX2Jhc2UtPnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPm1ldHJpY3MueV9zY2FsZSApOwotCi0gICAgICAgIG9yZ19kaXN0ID0gRkFTVF9EVUFMUFJPSiggJnZlYyApOwotICAgICAgfQotCi0gICAgICBjdXJfZGlzdCA9IFBST0pFQ1QoICZleGMtPnpwMi5jdXJbcG9pbnRdLCBjdXJfYmFzZSApOwotCi0gICAgICBpZiAoIG9yZ19kaXN0ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBvbGRfcmFuZ2UgKQotICAgICAgICAgIG5ld19kaXN0ID0gRlRfTXVsRGl2KCBvcmdfZGlzdCwgY3VyX3JhbmdlLCBvbGRfcmFuZ2UgKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgLyogVGhpcyBpcyB0aGUgc2FtZSBhcyB3aGF0IE1TIGRvZXMgZm9yIHRoZSBpbnZhbGlkIGNhc2U6ICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgIGRlbHRhID0gKE9yaWdpbmFsX1B0IC0gT3JpZ2luYWxfUlAxKSAtICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICAgICAgICAgIChDdXJyZW50X1B0IC0gQ3VycmVudF9SUDEpICAgICAgICAgOyAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBJbiBGcmVlVHlwZSBzcGVhazogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgZGVsdGEgPSBvcmdfZGlzdCAtIGN1cl9kaXN0ICAgICAgICAgIC4gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogV2UgbW92ZSBgcG9pbnQnIGJ5IGBuZXdfZGlzdCAtIGN1cl9kaXN0JyBhZnRlciBsZWF2aW5nICAqLwotICAgICAgICAgIC8qIHRoaXMgYmxvY2ssIHRodXMgd2UgaGF2ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICBuZXdfZGlzdCAtIGN1cl9kaXN0ID0gZGVsdGEgICAgICAgICAgICAgICAgICAgLCAgICAgICAqLwotICAgICAgICAgIC8qICAgbmV3X2Rpc3QgLSBjdXJfZGlzdCA9IG9yZ19kaXN0IC0gY3VyX2Rpc3QgICAgICwgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgbmV3X2Rpc3QgPSBvcmdfZGlzdCAgICAgICAgICAgICAgICAuICAgICAgICovCi0KLSAgICAgICAgICBuZXdfZGlzdCA9IG9yZ19kaXN0OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIG5ld19kaXN0ID0gMDsKLQotICAgICAgZXhjLT5mdW5jX21vdmUoIGV4YywKLSAgICAgICAgICAgICAgICAgICAgICAmZXhjLT56cDIsCi0gICAgICAgICAgICAgICAgICAgICAgKEZUX1VTaG9ydClwb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICBuZXdfZGlzdCAtIGN1cl9kaXN0ICk7Ci0gICAgfQotCi0gIEZhaWw6Ci0gICAgZXhjLT5HUy5sb29wID0gMTsKLSAgICBleGMtPm5ld190b3AgPSBleGMtPmFyZ3M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVVRQW2FdOiAgICAgICBVblRvdWNoIFBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHgyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIEluc19VVFAoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgIEZUX0xvbmcqICAgICAgICBhcmdzICkKLSAgewotICAgIEZUX1VTaG9ydCAgcG9pbnQ7Ci0gICAgRlRfQnl0ZSAgICBtYXNrOwotCi0KLSAgICBwb2ludCA9IChGVF9VU2hvcnQpYXJnc1swXTsKLQotICAgIGlmICggQk9VTkRTKCBwb2ludCwgZXhjLT56cDAubl9wb2ludHMgKSApCi0gICAgewotICAgICAgaWYgKCBleGMtPnBlZGFudGljX2hpbnRpbmcgKQotICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbWFzayA9IDB4RkY7Ci0KLSAgICBpZiAoIGV4Yy0+R1MuZnJlZVZlY3Rvci54ICE9IDAgKQotICAgICAgbWFzayAmPSB+RlRfQ1VSVkVfVEFHX1RPVUNIX1g7Ci0KLSAgICBpZiAoIGV4Yy0+R1MuZnJlZVZlY3Rvci55ICE9IDAgKQotICAgICAgbWFzayAmPSB+RlRfQ1VSVkVfVEFHX1RPVUNIX1k7Ci0KLSAgICBleGMtPnpwMC50YWdzW3BvaW50XSAmPSBtYXNrOwotICB9Ci0KLQotICAvKiBMb2NhbCB2YXJpYWJsZXMgZm9yIEluc19JVVA6ICovCi0gIHR5cGVkZWYgc3RydWN0ICBJVVBfV29ya2VyUmVjXwotICB7Ci0gICAgRlRfVmVjdG9yKiAgb3JnczsgICAvKiBvcmlnaW5hbCBhbmQgY3VycmVudCBjb29yZGluYXRlICovCi0gICAgRlRfVmVjdG9yKiAgY3VyczsgICAvKiBhcnJheXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfVmVjdG9yKiAgb3J1czsKLSAgICBGVF9VSW50ICAgICBtYXhfcG9pbnRzOwotCi0gIH0gSVVQX1dvcmtlclJlYywgKklVUF9Xb3JrZXI7Ci0KLQotICBzdGF0aWMgdm9pZAotICBfaXVwX3dvcmtlcl9zaGlmdCggSVVQX1dvcmtlciAgd29ya2VyLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgcDEsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBwMiwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHAgKQotICB7Ci0gICAgRlRfVUludCAgICAgaTsKLSAgICBGVF9GMjZEb3Q2ICBkeDsKLQotCi0gICAgZHggPSB3b3JrZXItPmN1cnNbcF0ueCAtIHdvcmtlci0+b3Jnc1twXS54OwotICAgIGlmICggZHggIT0gMCApCi0gICAgewotICAgICAgZm9yICggaSA9IHAxOyBpIDwgcDsgaSsrICkKLSAgICAgICAgd29ya2VyLT5jdXJzW2ldLnggKz0gZHg7Ci0KLSAgICAgIGZvciAoIGkgPSBwICsgMTsgaSA8PSBwMjsgaSsrICkKLSAgICAgICAgd29ya2VyLT5jdXJzW2ldLnggKz0gZHg7Ci0gICAgfQotICB9Ci0KLQotICBzdGF0aWMgdm9pZAotICBfaXVwX3dvcmtlcl9pbnRlcnBvbGF0ZSggSVVQX1dvcmtlciAgd29ya2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgcDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHJlZjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICByZWYyICkKLSAgewotICAgIEZUX1VJbnQgICAgIGk7Ci0gICAgRlRfRjI2RG90NiAgb3J1czEsIG9ydXMyLCBvcmcxLCBvcmcyLCBjdXIxLCBjdXIyLCBkZWx0YTEsIGRlbHRhMjsKLQotCi0gICAgaWYgKCBwMSA+IHAyICkKLSAgICAgIHJldHVybjsKLQotICAgIGlmICggQk9VTkRTKCByZWYxLCB3b3JrZXItPm1heF9wb2ludHMgKSB8fAotICAgICAgICAgQk9VTkRTKCByZWYyLCB3b3JrZXItPm1heF9wb2ludHMgKSApCi0gICAgICByZXR1cm47Ci0KLSAgICBvcnVzMSA9IHdvcmtlci0+b3J1c1tyZWYxXS54OwotICAgIG9ydXMyID0gd29ya2VyLT5vcnVzW3JlZjJdLng7Ci0KLSAgICBpZiAoIG9ydXMxID4gb3J1czIgKQotICAgIHsKLSAgICAgIEZUX0YyNkRvdDYgIHRtcF9vOwotICAgICAgRlRfVUludCAgICAgdG1wX3I7Ci0KLQotICAgICAgdG1wX28gPSBvcnVzMTsKLSAgICAgIG9ydXMxID0gb3J1czI7Ci0gICAgICBvcnVzMiA9IHRtcF9vOwotCi0gICAgICB0bXBfciA9IHJlZjE7Ci0gICAgICByZWYxICA9IHJlZjI7Ci0gICAgICByZWYyICA9IHRtcF9yOwotICAgIH0KLQotICAgIG9yZzEgICA9IHdvcmtlci0+b3Jnc1tyZWYxXS54OwotICAgIG9yZzIgICA9IHdvcmtlci0+b3Jnc1tyZWYyXS54OwotICAgIGN1cjEgICA9IHdvcmtlci0+Y3Vyc1tyZWYxXS54OwotICAgIGN1cjIgICA9IHdvcmtlci0+Y3Vyc1tyZWYyXS54OwotICAgIGRlbHRhMSA9IGN1cjEgLSBvcmcxOwotICAgIGRlbHRhMiA9IGN1cjIgLSBvcmcyOwotCi0gICAgaWYgKCBjdXIxID09IGN1cjIgfHwgb3J1czEgPT0gb3J1czIgKQotICAgIHsKLQotICAgICAgLyogdHJpdmlhbCBzbmFwIG9yIHNoaWZ0IG9mIHVudG91Y2hlZCBwb2ludHMgKi8KLSAgICAgIGZvciAoIGkgPSBwMTsgaSA8PSBwMjsgaSsrICkKLSAgICAgIHsKLSAgICAgICAgRlRfRjI2RG90NiAgeCA9IHdvcmtlci0+b3Jnc1tpXS54OwotCi0KLSAgICAgICAgaWYgKCB4IDw9IG9yZzEgKQotICAgICAgICAgIHggKz0gZGVsdGExOwotCi0gICAgICAgIGVsc2UgaWYgKCB4ID49IG9yZzIgKQotICAgICAgICAgIHggKz0gZGVsdGEyOwotCi0gICAgICAgIGVsc2UKLSAgICAgICAgICB4ID0gY3VyMTsKLQotICAgICAgICB3b3JrZXItPmN1cnNbaV0ueCA9IHg7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBGVF9GaXhlZCAgc2NhbGUgICAgICAgPSAwOwotICAgICAgRlRfQm9vbCAgIHNjYWxlX3ZhbGlkID0gMDsKLQotCi0gICAgICAvKiBpbnRlcnBvbGF0aW9uICovCi0gICAgICBmb3IgKCBpID0gcDE7IGkgPD0gcDI7IGkrKyApCi0gICAgICB7Ci0gICAgICAgIEZUX0YyNkRvdDYgIHggPSB3b3JrZXItPm9yZ3NbaV0ueDsKLQotCi0gICAgICAgIGlmICggeCA8PSBvcmcxICkKLSAgICAgICAgICB4ICs9IGRlbHRhMTsKLQotICAgICAgICBlbHNlIGlmICggeCA+PSBvcmcyICkKLSAgICAgICAgICB4ICs9IGRlbHRhMjsKLQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoICFzY2FsZV92YWxpZCApCi0gICAgICAgICAgewotICAgICAgICAgICAgc2NhbGVfdmFsaWQgPSAxOwotICAgICAgICAgICAgc2NhbGUgICAgICAgPSBGVF9EaXZGaXgoIGN1cjIgLSBjdXIxLCBvcnVzMiAtIG9ydXMxICk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgeCA9IGN1cjEgKyBGVF9NdWxGaXgoIHdvcmtlci0+b3J1c1tpXS54IC0gb3J1czEsIHNjYWxlICk7Ci0gICAgICAgIH0KLSAgICAgICAgd29ya2VyLT5jdXJzW2ldLnggPSB4OwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBJVVBbYV06ICAgICAgIEludGVycG9sYXRlIFVudG91Y2hlZCBQb2ludHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDMwLTB4MzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0lVUCggVFRfRXhlY0NvbnRleHQgIGV4YyApCi0gIHsKLSAgICBJVVBfV29ya2VyUmVjICBWOwotICAgIEZUX0J5dGUgICAgICAgIG1hc2s7Ci0KLSAgICBGVF9VSW50ICAgZmlyc3RfcG9pbnQ7ICAgLyogZmlyc3QgcG9pbnQgb2YgY29udG91ciAgICAgICAgKi8KLSAgICBGVF9VSW50ICAgZW5kX3BvaW50OyAgICAgLyogZW5kIHBvaW50IChsYXN0KzEpIG9mIGNvbnRvdXIgKi8KLQotICAgIEZUX1VJbnQgICBmaXJzdF90b3VjaGVkOyAvKiBmaXJzdCB0b3VjaGVkIHBvaW50IGluIGNvbnRvdXIgICAqLwotICAgIEZUX1VJbnQgICBjdXJfdG91Y2hlZDsgICAvKiBjdXJyZW50IHRvdWNoZWQgcG9pbnQgaW4gY29udG91ciAqLwotCi0gICAgRlRfVUludCAgIHBvaW50OyAgICAgICAgIC8qIGN1cnJlbnQgcG9pbnQgICAqLwotICAgIEZUX1Nob3J0ICBjb250b3VyOyAgICAgICAvKiBjdXJyZW50IGNvbnRvdXIgKi8KLQotCi0gICAgLyogaWdub3JlIGVtcHR5IG91dGxpbmVzICovCi0gICAgaWYgKCBleGMtPnB0cy5uX2NvbnRvdXJzID09IDAgKQotICAgICAgcmV0dXJuOwotCi0gICAgaWYgKCBleGMtPm9wY29kZSAmIDEgKQotICAgIHsKLSAgICAgIG1hc2sgICA9IEZUX0NVUlZFX1RBR19UT1VDSF9YOwotICAgICAgVi5vcmdzID0gZXhjLT5wdHMub3JnOwotICAgICAgVi5jdXJzID0gZXhjLT5wdHMuY3VyOwotICAgICAgVi5vcnVzID0gZXhjLT5wdHMub3J1czsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG1hc2sgICA9IEZUX0NVUlZFX1RBR19UT1VDSF9ZOwotICAgICAgVi5vcmdzID0gKEZUX1ZlY3RvciopKCAoRlRfUG9zKilleGMtPnB0cy5vcmcgKyAxICk7Ci0gICAgICBWLmN1cnMgPSAoRlRfVmVjdG9yKikoIChGVF9Qb3MqKWV4Yy0+cHRzLmN1ciArIDEgKTsKLSAgICAgIFYub3J1cyA9IChGVF9WZWN0b3IqKSggKEZUX1BvcyopZXhjLT5wdHMub3J1cyArIDEgKTsKLSAgICB9Ci0gICAgVi5tYXhfcG9pbnRzID0gZXhjLT5wdHMubl9wb2ludHM7Ci0KLSAgICBjb250b3VyID0gMDsKLSAgICBwb2ludCAgID0gMDsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotICAgIGlmICggU1VCUElYRUxfSElOVElORyAgICYmCi0gICAgICAgICBleGMtPmlnbm9yZV94X21vZGUgKQotICAgIHsKLSAgICAgIGV4Yy0+aXVwX2NhbGxlZCA9IFRSVUU7Ci0gICAgICBpZiAoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX1NLSVBfSVVQICkKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KLQotICAgIGRvCi0gICAgewotICAgICAgZW5kX3BvaW50ICAgPSBleGMtPnB0cy5jb250b3Vyc1tjb250b3VyXSAtIGV4Yy0+cHRzLmZpcnN0X3BvaW50OwotICAgICAgZmlyc3RfcG9pbnQgPSBwb2ludDsKLQotICAgICAgaWYgKCBCT1VORFMoIGVuZF9wb2ludCwgZXhjLT5wdHMubl9wb2ludHMgKSApCi0gICAgICAgIGVuZF9wb2ludCA9IGV4Yy0+cHRzLm5fcG9pbnRzIC0gMTsKLQotICAgICAgd2hpbGUgKCBwb2ludCA8PSBlbmRfcG9pbnQgJiYgKCBleGMtPnB0cy50YWdzW3BvaW50XSAmIG1hc2sgKSA9PSAwICkKLSAgICAgICAgcG9pbnQrKzsKLQotICAgICAgaWYgKCBwb2ludCA8PSBlbmRfcG9pbnQgKQotICAgICAgewotICAgICAgICBmaXJzdF90b3VjaGVkID0gcG9pbnQ7Ci0gICAgICAgIGN1cl90b3VjaGVkICAgPSBwb2ludDsKLQotICAgICAgICBwb2ludCsrOwotCi0gICAgICAgIHdoaWxlICggcG9pbnQgPD0gZW5kX3BvaW50ICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggKCBleGMtPnB0cy50YWdzW3BvaW50XSAmIG1hc2sgKSAhPSAwICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBfaXVwX3dvcmtlcl9pbnRlcnBvbGF0ZSggJlYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3RvdWNoZWQgKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50IC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfdG91Y2hlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludCApOwotICAgICAgICAgICAgY3VyX3RvdWNoZWQgPSBwb2ludDsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBwb2ludCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBjdXJfdG91Y2hlZCA9PSBmaXJzdF90b3VjaGVkICkKLSAgICAgICAgICBfaXVwX3dvcmtlcl9zaGlmdCggJlYsIGZpcnN0X3BvaW50LCBlbmRfcG9pbnQsIGN1cl90b3VjaGVkICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIF9pdXBfd29ya2VyX2ludGVycG9sYXRlKCAmViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VTaG9ydCkoIGN1cl90b3VjaGVkICsgMSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRfcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl90b3VjaGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF90b3VjaGVkICk7Ci0KLSAgICAgICAgICBpZiAoIGZpcnN0X3RvdWNoZWQgPiAwICkKLSAgICAgICAgICAgIF9pdXBfd29ya2VyX2ludGVycG9sYXRlKCAmViwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9wb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF90b3VjaGVkIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfdG91Y2hlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF90b3VjaGVkICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNvbnRvdXIrKzsKLSAgICB9IHdoaWxlICggY29udG91ciA8IGV4Yy0+cHRzLm5fY29udG91cnMgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBERUxUQVBuW106ICAgIERFTFRBIGV4Y2VwdGlvbnMgUDEsIFAyLCBQMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDVELDB4NzEsMHg3MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyICgyICogdWludDMyKS4uLiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0RFTFRBUCggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVUxvbmcgICBudW1wLCBrOwotICAgIEZUX1VTaG9ydCAgQTsKLSAgICBGVF9VTG9uZyAgIEMsIFA7Ci0gICAgRlRfTG9uZyAgICBCOwotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotICAgIEZUX1VTaG9ydCAgQjEsIEIyOwotCi0KLSAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZXhjLT5pdXBfY2FsbGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfTk9fREVMVEFQX0FGVEVSX0lVUCApICkKLSAgICAgIGdvdG8gRmFpbDsKLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KLQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSAgICAvKiBEZWx0YSBoaW50aW5nIGlzIGNvdmVyZWQgYnkgVVMgUGF0ZW50IDUxNTk2NjguICovCi0gICAgaWYgKCBleGMtPmZhY2UtPnVucGF0ZW50ZWRfaGludGluZyApCi0gICAgewotICAgICAgRlRfTG9uZyAgbiA9IGFyZ3NbMF0gKiAyOwotCi0KLSAgICAgIGlmICggZXhjLT5hcmdzIDwgbiApCi0gICAgICB7Ci0gICAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIFRvb19GZXdfQXJndW1lbnRzICk7Ci0gICAgICAgIG4gPSBleGMtPmFyZ3M7Ci0gICAgICB9Ci0KLSAgICAgIGV4Yy0+YXJncyAtPSBuOwotICAgICAgZXhjLT5uZXdfdG9wID0gZXhjLT5hcmdzOwotICAgICAgcmV0dXJuOwotICAgIH0KLSNlbmRpZgotCi0gICAgUCAgICA9IChGVF9VTG9uZylleGMtPmZ1bmNfY3VyX3BwZW0oIGV4YyApOwotICAgIG51bXAgPSAoRlRfVUxvbmcpYXJnc1swXTsgICAvKiBzb21lIHBvaW50cyB0aGVvcmV0aWNhbGx5IG1heSBvY2N1ciBtb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gb25jZSwgdGh1cyBVU2hvcnQgaXNuJ3QgZW5vdWdoICovCi0KLSAgICBmb3IgKCBrID0gMTsgayA8PSBudW1wOyBrKysgKQotICAgIHsKLSAgICAgIGlmICggZXhjLT5hcmdzIDwgMiApCi0gICAgICB7Ci0gICAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIFRvb19GZXdfQXJndW1lbnRzICk7Ci0gICAgICAgIGV4Yy0+YXJncyA9IDA7Ci0gICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLQotICAgICAgZXhjLT5hcmdzIC09IDI7Ci0KLSAgICAgIEEgPSAoRlRfVVNob3J0KWV4Yy0+c3RhY2tbZXhjLT5hcmdzICsgMV07Ci0gICAgICBCID0gZXhjLT5zdGFja1tleGMtPmFyZ3NdOwotCi0gICAgICAvKiBYWFg6IEJlY2F1c2Ugc29tZSBwb3B1bGFyIGZvbnRzIGNvbnRhaW4gc29tZSBpbnZhbGlkIERlbHRhUCAqLwotICAgICAgLyogICAgICBpbnN0cnVjdGlvbnMsIHdlIHNpbXBseSBpZ25vcmUgdGhlbSB3aGVuIHRoZSBzdGFja2VkICAgKi8KLSAgICAgIC8qICAgICAgcG9pbnQgcmVmZXJlbmNlIGlzIG9mZiBsaW1pdCwgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuICovCi0gICAgICAvKiAgICAgIGVycm9yLiAgQXMgYSBkZWx0YSBpbnN0cnVjdGlvbiBkb2Vzbid0IGNoYW5nZSBhIGdseXBoICAqLwotICAgICAgLyogICAgICBpbiBncmVhdCB3YXlzLCB0aGlzIHNob3VsZG4ndCBiZSBhIHByb2JsZW0uICAgICAgICAgICAgKi8KLQotICAgICAgaWYgKCAhQk9VTkRTKCBBLCBleGMtPnpwMC5uX3BvaW50cyApICkKLSAgICAgIHsKLSAgICAgICAgQyA9ICggKEZUX1VMb25nKUIgJiAweEYwICkgPj4gNDsKLQotICAgICAgICBzd2l0Y2ggKCBleGMtPm9wY29kZSApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAweDVEOgotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg3MToKLSAgICAgICAgICBDICs9IDE2OwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg3MjoKLSAgICAgICAgICBDICs9IDMyOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgQyArPSBleGMtPkdTLmRlbHRhX2Jhc2U7Ci0KLSAgICAgICAgaWYgKCBQID09IEMgKQotICAgICAgICB7Ci0gICAgICAgICAgQiA9ICggKEZUX1VMb25nKUIgJiAweEYgKSAtIDg7Ci0gICAgICAgICAgaWYgKCBCID49IDAgKQotICAgICAgICAgICAgQisrOwotICAgICAgICAgIEIgKj0gMUwgPDwgKCA2IC0gZXhjLT5HUy5kZWx0YV9zaGlmdCApOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0KLSAgICAgICAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiAgQWxsb3cgZGVsdGEgbW92ZSBpZgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqICAtIG5vdCB1c2luZyBpZ25vcmVfeF9tb2RlIHJlbmRlcmluZywKLSAgICAgICAgICAgICAqICAtIGdseXBoIGlzIHNwZWNpZmljYWxseSBzZXQgdG8gYWxsb3cgaXQsIG9yCi0gICAgICAgICAgICAgKiAgLSBnbHlwaCBpcyBjb21wb3NpdGUgYW5kIGZyZWVkb20gdmVjdG9yIGlzIG5vdCBpbiBzdWJwaXhlbAotICAgICAgICAgICAgICogICAgZGlyZWN0aW9uLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoICFleGMtPmlnbm9yZV94X21vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfQUxXQVlTX0RPX0RFTFRBUCApIHx8Ci0gICAgICAgICAgICAgICAgICggZXhjLT5pc19jb21wb3NpdGUgJiYgZXhjLT5HUy5mcmVlVmVjdG9yLnkgIT0gMCApICAgICkKLSAgICAgICAgICAgICAgZXhjLT5mdW5jX21vdmUoIGV4YywgJmV4Yy0+enAwLCBBLCBCICk7Ci0KLSAgICAgICAgICAgIC8qIE90aGVyd2lzZSwgYXBwbHkgc3VicGl4ZWwgaGludGluZyBhbmQgY29tcGF0aWJpbGl0eSBtb2RlICovCi0gICAgICAgICAgICAvKiBydWxlcywgYWx3YXlzIHNraXBwaW5nIGRlbHRhcyBpbiBzdWJwaXhlbCBkaXJlY3Rpb24uICAgICAqLwotICAgICAgICAgICAgZWxzZSBpZiAoIGV4Yy0+aWdub3JlX3hfbW9kZSAmJiBleGMtPkdTLmZyZWVWZWN0b3IueSAhPSAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgLyogc2F2ZSB0aGUgeSB2YWx1ZSBvZiB0aGUgcG9pbnQgbm93OyBjb21wYXJlIGFmdGVyIG1vdmUgKi8KLSAgICAgICAgICAgICAgQjEgPSAoRlRfVVNob3J0KWV4Yy0+enAwLmN1cltBXS55OwotCi0gICAgICAgICAgICAgIC8qIFN0YW5kYXJkIHN1YnBpeGVsIGhpbnRpbmc6IEFsbG93IHkgbW92ZSBmb3IgeS10b3VjaGVkICovCi0gICAgICAgICAgICAgIC8qIHBvaW50cy4gIFRoaXMgbWVzc2VzIHVwIERlamFWdSAuLi4gICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgIGlmICggIWV4Yy0+ZmFjZS0+c3BoX2NvbXBhdGliaWxpdHlfbW9kZSAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICggZXhjLT56cDAudGFnc1tBXSAmIEZUX0NVUlZFX1RBR19UT1VDSF9ZICkgKQotICAgICAgICAgICAgICAgIGV4Yy0+ZnVuY19tb3ZlKCBleGMsICZleGMtPnpwMCwgQSwgQiApOwotCi0gICAgICAgICAgICAgIC8qIGNvbXBhdGliaWxpdHkgbW9kZSAqLwotICAgICAgICAgICAgICBlbHNlIGlmICggZXhjLT5mYWNlLT5zcGhfY29tcGF0aWJpbGl0eV9tb2RlICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICEoIGV4Yy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX0FMV0FZU19TS0lQX0RFTFRBUCApICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgJiBTUEhfVFdFQUtfUk9VTkRfTk9OUElYRUxfWV9NT1ZFUyApCi0gICAgICAgICAgICAgICAgICBCID0gRlRfUElYX1JPVU5EKCBCMSArIEIgKSAtIEIxOwotCi0gICAgICAgICAgICAgICAgLyogQWxsb3cgZGVsdGEgbW92ZSBpZiB1c2luZyBzcGhfY29tcGF0aWJpbGl0eV9tb2RlLCAgICovCi0gICAgICAgICAgICAgICAgLyogSVVQIGhhcyBub3QgYmVlbiBjYWxsZWQsIGFuZCBwb2ludCBpcyB0b3VjaGVkIG9uIFkuICovCi0gICAgICAgICAgICAgICAgaWYgKCAhZXhjLT5pdXBfY2FsbGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAoIGV4Yy0+enAwLnRhZ3NbQV0gJiBGVF9DVVJWRV9UQUdfVE9VQ0hfWSApICkKLSAgICAgICAgICAgICAgICAgIGV4Yy0+ZnVuY19tb3ZlKCBleGMsICZleGMtPnpwMCwgQSwgQiApOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgQjIgPSAoRlRfVVNob3J0KWV4Yy0+enAwLmN1cltBXS55OwotCi0gICAgICAgICAgICAgIC8qIFJldmVyc2UgdGhpcyBtb3ZlIGlmIGl0IHJlc3VsdHMgaW4gYSBkaXNhbGxvd2VkIG1vdmUgKi8KLSAgICAgICAgICAgICAgaWYgKCBleGMtPkdTLmZyZWVWZWN0b3IueSAhPSAwICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICAgICggKCBleGMtPmZhY2UtPnNwaF9jb21wYXRpYmlsaXR5X21vZGUgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgKCBCMSAmIDYzICkgPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICggQjIgJiA2MyApICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAoICggZXhjLT5zcGhfdHdlYWtfZmxhZ3MgICAgICAgICAgICAgICAgICAgJgotICAgICAgICAgICAgICAgICAgICAgICAgIFNQSF9UV0VBS19TS0lQX05PTlBJWEVMX1lfTU9WRVNfREVMVEFQICkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgKCBCMSAmIDYzICkgIT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICAgICAgICAgICggQjIgJiA2MyApICE9IDAgICAgICAgICAgICAgICAgICAgICAgICAgICApICkgKQotICAgICAgICAgICAgICAgIGV4Yy0+ZnVuY19tb3ZlKCBleGMsICZleGMtPnpwMCwgQSwgLUIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwotCi0gICAgICAgICAgICBleGMtPmZ1bmNfbW92ZSggZXhjLCAmZXhjLT56cDAsIEEsIEIgKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX1JlZmVyZW5jZSApOwotICAgIH0KLQotICBGYWlsOgotICAgIGV4Yy0+bmV3X3RvcCA9IGV4Yy0+YXJnczsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBERUxUQUNuW106ICAgIERFTFRBIGV4Y2VwdGlvbnMgQzEsIEMyLCBDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogT3Bjb2RlIHJhbmdlOiAweDczLDB4NzQsMHg3NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN0YWNrOiAgICAgICAgdWludDMyICgyICogdWludDMyKS4uLiAtLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0RFTFRBQyggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgRlRfTG9uZyogICAgICAgIGFyZ3MgKQotICB7Ci0gICAgRlRfVUxvbmcgIG51bXAsIGs7Ci0gICAgRlRfVUxvbmcgIEEsIEMsIFA7Ci0gICAgRlRfTG9uZyAgIEI7Ci0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCi0gICAgLyogRGVsdGEgaGludGluZyBpcyBjb3ZlcmVkIGJ5IFVTIFBhdGVudCA1MTU5NjY4LiAqLwotICAgIGlmICggZXhjLT5mYWNlLT51bnBhdGVudGVkX2hpbnRpbmcgKQotICAgIHsKLSAgICAgIEZUX0xvbmcgIG4gPSBhcmdzWzBdICogMjsKLQotCi0gICAgICBpZiAoIGV4Yy0+YXJncyA8IG4gKQotICAgICAgewotICAgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBUb29fRmV3X0FyZ3VtZW50cyApOwotICAgICAgICBuID0gZXhjLT5hcmdzOwotICAgICAgfQotCi0gICAgICBleGMtPmFyZ3MgLT0gbjsKLSAgICAgIGV4Yy0+bmV3X3RvcCA9IGV4Yy0+YXJnczsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLQotICAgIFAgICAgPSAoRlRfVUxvbmcpZXhjLT5mdW5jX2N1cl9wcGVtKCBleGMgKTsKLSAgICBudW1wID0gKEZUX1VMb25nKWFyZ3NbMF07Ci0KLSAgICBmb3IgKCBrID0gMTsgayA8PSBudW1wOyBrKysgKQotICAgIHsKLSAgICAgIGlmICggZXhjLT5hcmdzIDwgMiApCi0gICAgICB7Ci0gICAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIFRvb19GZXdfQXJndW1lbnRzICk7Ci0gICAgICAgIGV4Yy0+YXJncyA9IDA7Ci0gICAgICAgIGdvdG8gRmFpbDsKLSAgICAgIH0KLQotICAgICAgZXhjLT5hcmdzIC09IDI7Ci0KLSAgICAgIEEgPSAoRlRfVUxvbmcpZXhjLT5zdGFja1tleGMtPmFyZ3MgKyAxXTsKLSAgICAgIEIgPSBleGMtPnN0YWNrW2V4Yy0+YXJnc107Ci0KLSAgICAgIGlmICggQk9VTkRTTCggQSwgZXhjLT5jdnRTaXplICkgKQotICAgICAgewotICAgICAgICBpZiAoIGV4Yy0+cGVkYW50aWNfaGludGluZyApCi0gICAgICAgIHsKLSAgICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIEMgPSAoIChGVF9VTG9uZylCICYgMHhGMCApID4+IDQ7Ci0KLSAgICAgICAgc3dpdGNoICggZXhjLT5vcGNvZGUgKQotICAgICAgICB7Ci0gICAgICAgIGNhc2UgMHg3MzoKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NzQ6Ci0gICAgICAgICAgQyArPSAxNjsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NzU6Ci0gICAgICAgICAgQyArPSAzMjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIEMgKz0gZXhjLT5HUy5kZWx0YV9iYXNlOwotCi0gICAgICAgIGlmICggUCA9PSBDICkKLSAgICAgICAgewotICAgICAgICAgIEIgPSAoIChGVF9VTG9uZylCICYgMHhGICkgLSA4OwotICAgICAgICAgIGlmICggQiA+PSAwICkKLSAgICAgICAgICAgIEIrKzsKLSAgICAgICAgICBCICo9IDFMIDw8ICggNiAtIGV4Yy0+R1MuZGVsdGFfc2hpZnQgKTsKLQotICAgICAgICAgIGV4Yy0+ZnVuY19tb3ZlX2N2dCggZXhjLCBBLCBCICk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgRmFpbDoKLSAgICBleGMtPm5ld190b3AgPSBleGMtPmFyZ3M7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTUlTQy4gSU5TVFJVQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogR0VUSU5GT1tdOiAgICBHRVQgSU5GT3JtYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIE9wY29kZSByYW5nZTogMHg4OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTdGFjazogICAgICAgIHVpbnQzMiAtLT4gdWludDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFhYWDogVU5ET0NVTUVOVEVEOiBTZWxlY3RvciBiaXRzIGhpZ2hlciB0aGFuIDkgYXJlIGN1cnJlbnRseSAoTWF5ICAgICAqLwotICAvKiAgICAgIDIwMTUpIG5vdCBkb2N1bWVudGVkIGluIHRoZSBPcGVuVHlwZSBzcGVjaWZpY2F0aW9uLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgU2VsZWN0b3IgYml0IDExIGlzIGluY29ycmVjdGx5IGRlc2NyaWJlZCBhcyBiaXQgOCwgd2hpbGUgdGhlICAgICAqLwotICAvKiAgICAgIHJlYWwgbWVhbmluZyBvZiBiaXQgOCAodmVydGljYWwgTENEIHN1YnBpeGVscykgc3RheXMgICAgICAgICAgICAgKi8KLSAgLyogICAgICB1bmRvY3VtZW50ZWQuICBUaGUgc2FtZSBtaXN0YWtlIGNhbiBiZSBmb3VuZCBpbiBHcmVnIEhpdGNoY29jaydzICovCi0gIC8qICAgICAgd2hpdGVwYXBlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgc3RhdGljIHZvaWQKLSAgSW5zX0dFVElORk8oIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICBGVF9Mb25nKiAgICAgICAgYXJncyApCi0gIHsKLSAgICBGVF9Mb25nICBLOwotCi0KLSAgICBLID0gMDsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBSQVNURVJJWkVSIFZFUlNJT04gICAgICAgICAgICovCi0gICAgLyogU2VsZWN0b3IgQml0OiAgMCAgICAgICAgICAgICAqLwotICAgIC8qIFJldHVybiBCaXQocyk6IDAtNyAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgICAgJiYKLSAgICAgICAgICggYXJnc1swXSAmIDEgKSAhPSAwICAmJgotICAgICAgICAgZXhjLT5zdWJwaXhlbF9oaW50aW5nICkKLSAgICB7Ci0gICAgICBpZiAoIGV4Yy0+aWdub3JlX3hfbW9kZSApCi0gICAgICB7Ci0gICAgICAgIC8qIGlmIGluIENsZWFyVHlwZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBtb2RlLCAgICAgICAgKi8KLSAgICAgICAgLyogd2Ugc29tZXRpbWVzIGNoYW5nZSB0aGUgVHJ1ZVR5cGUgdmVyc2lvbiBkeW5hbWljYWxseSAqLwotICAgICAgICBLID0gZXhjLT5yYXN0ZXJpemVyX3ZlcnNpb247Ci0gICAgICAgIEZUX1RSQUNFNigoICJTZXR0aW5nIHJhc3Rlcml6ZXIgdmVyc2lvbiAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgZXhjLT5yYXN0ZXJpemVyX3ZlcnNpb24gKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIEsgPSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM4OwotICAgIH0KLSAgICBlbHNlCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0gICAgICBpZiAoICggYXJnc1swXSAmIDEgKSAhPSAwICkKLSAgICAgICAgSyA9IFRUX0lOVEVSUFJFVEVSX1ZFUlNJT05fMzU7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogR0xZUEggUk9UQVRFRCAgICAgICAgICAgICAgICAqLwotICAgIC8qIFNlbGVjdG9yIEJpdDogIDEgICAgICAgICAgICAgKi8KLSAgICAvKiBSZXR1cm4gQml0KHMpOiA4ICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggKCBhcmdzWzBdICYgMiApICE9IDAgJiYgZXhjLT50dF9tZXRyaWNzLnJvdGF0ZWQgKQotICAgICAgSyB8PSAweDgwOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIEdMWVBIIFNUUkVUQ0hFRCAgICAgICAgICAgICAgKi8KLSAgICAvKiBTZWxlY3RvciBCaXQ6ICAyICAgICAgICAgICAgICovCi0gICAgLyogUmV0dXJuIEJpdChzKTogOSAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoICggYXJnc1swXSAmIDQgKSAhPSAwICYmIGV4Yy0+dHRfbWV0cmljcy5zdHJldGNoZWQgKQotICAgICAgSyB8PSAxIDw8IDg7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogSElOVElORyBGT1IgR1JBWVNDQUxFICAgICAgICAqLwotICAgIC8qIFNlbGVjdG9yIEJpdDogIDUgICAgICAgICAgICAgKi8KLSAgICAvKiBSZXR1cm4gQml0KHMpOiAxMiAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggKCBhcmdzWzBdICYgMzIgKSAhPSAwICYmIGV4Yy0+Z3JheXNjYWxlICkKLSAgICAgIEsgfD0gMSA8PCAxMjsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotCi0gICAgaWYgKCBTVUJQSVhFTF9ISU5USU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBleGMtPnJhc3Rlcml6ZXJfdmVyc2lvbiA+PSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM1ICkKLSAgICB7Ci0KLSAgICAgIGlmICggZXhjLT5yYXN0ZXJpemVyX3ZlcnNpb24gPj0gMzcgKQotICAgICAgewotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qIEhJTlRJTkcgRk9SIFNVQlBJWEVMICAgICAgICAgKi8KLSAgICAgICAgLyogU2VsZWN0b3IgQml0OiAgNiAgICAgICAgICAgICAqLwotICAgICAgICAvKiBSZXR1cm4gQml0KHMpOiAxMyAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCAoIGFyZ3NbMF0gJiA2NCApICE9IDAgJiYgZXhjLT5zdWJwaXhlbF9oaW50aW5nICkKLSAgICAgICAgICBLIHw9IDEgPDwgMTM7Ci0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvKiBDT01QQVRJQkxFIFdJRFRIUyBFTkFCTEVEICAgICovCi0gICAgICAgIC8qIFNlbGVjdG9yIEJpdDogIDcgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogUmV0dXJuIEJpdChzKTogMTQgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIEZ1bmN0aW9uYWxpdHkgc3RpbGwgbmVlZHMgdG8gYmUgYWRkZWQgKi8KLSAgICAgICAgaWYgKCAoIGFyZ3NbMF0gJiAxMjggKSAhPSAwICYmIGV4Yy0+Y29tcGF0aWJsZV93aWR0aHMgKQotICAgICAgICAgIEsgfD0gMSA8PCAxNDsKLQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qIFZFUlRJQ0FMIExDRCBTVUJQSVhFTFM/ICAgICAgKi8KLSAgICAgICAgLyogU2VsZWN0b3IgQml0OiAgOCAgICAgICAgICAgICAqLwotICAgICAgICAvKiBSZXR1cm4gQml0KHMpOiAxNSAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogRnVuY3Rpb25hbGl0eSBzdGlsbCBuZWVkcyB0byBiZSBhZGRlZCAqLwotICAgICAgICBpZiAoICggYXJnc1swXSAmIDI1NiApICE9IDAgJiYgZXhjLT52ZXJ0aWNhbF9sY2QgKQotICAgICAgICAgIEsgfD0gMSA8PCAxNTsKLQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qIEhJTlRJTkcgRk9SIEJHUj8gICAgICAgICAgICAgKi8KLSAgICAgICAgLyogU2VsZWN0b3IgQml0OiAgOSAgICAgICAgICAgICAqLwotICAgICAgICAvKiBSZXR1cm4gQml0KHMpOiAxNiAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogRnVuY3Rpb25hbGl0eSBzdGlsbCBuZWVkcyB0byBiZSBhZGRlZCAqLwotICAgICAgICBpZiAoICggYXJnc1swXSAmIDUxMiApICE9IDAgJiYgZXhjLT5iZ3IgKQotICAgICAgICAgIEsgfD0gMSA8PCAxNjsKLQotICAgICAgICBpZiAoIGV4Yy0+cmFzdGVyaXplcl92ZXJzaW9uID49IDM4ICkKLSAgICAgICAgewotICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAvKiBTVUJQSVhFTCBQT1NJVElPTkVEPyAgICAgICAgICovCi0gICAgICAgICAgLyogU2VsZWN0b3IgQml0OiAgMTAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIFJldHVybiBCaXQocyk6IDE3ICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogRnVuY3Rpb25hbGl0eSBzdGlsbCBuZWVkcyB0byBiZSBhZGRlZCAqLwotICAgICAgICAgIGlmICggKCBhcmdzWzBdICYgMTAyNCApICE9IDAgJiYgZXhjLT5zdWJwaXhlbF9wb3NpdGlvbmVkICkKLSAgICAgICAgICAgIEsgfD0gMSA8PCAxNzsKLQotICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAvKiBTWU1NRVRSSUNBTCBTTU9PVEhJTkcgICAgICAgICovCi0gICAgICAgICAgLyogU2VsZWN0b3IgQml0OiAgMTEgICAgICAgICAgICAqLwotICAgICAgICAgIC8qIFJldHVybiBCaXQocyk6IDE4ICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogRnVuY3Rpb25hbGl0eSBzdGlsbCBuZWVkcyB0byBiZSBhZGRlZCAqLwotICAgICAgICAgIGlmICggKCBhcmdzWzBdICYgMjA0OCApICE9IDAgJiYgZXhjLT5zeW1tZXRyaWNhbF9zbW9vdGhpbmcgKQotICAgICAgICAgICAgSyB8PSAxIDw8IDE4OwotCi0gICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgIC8qIEdSQVkgQ0xFQVJUWVBFICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBTZWxlY3RvciBCaXQ6ICAxMiAgICAgICAgICAgICovCi0gICAgICAgICAgLyogUmV0dXJuIEJpdChzKTogMTkgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiBGdW5jdGlvbmFsaXR5IHN0aWxsIG5lZWRzIHRvIGJlIGFkZGVkICovCi0gICAgICAgICAgaWYgKCAoIGFyZ3NbMF0gJiA0MDk2ICkgIT0gMCAmJiBleGMtPmdyYXlfY2xlYXJ0eXBlICkKLSAgICAgICAgICAgIEsgfD0gMSA8PCAxOTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwotCi0gICAgYXJnc1swXSA9IEs7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIEluc19VTktOT1dOKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIFRUX0RlZlJlY29yZCogIGRlZiAgID0gZXhjLT5JRGVmczsKLSAgICBUVF9EZWZSZWNvcmQqICBsaW1pdCA9IGRlZiArIGV4Yy0+bnVtSURlZnM7Ci0KLQotICAgIGZvciAoIDsgZGVmIDwgbGltaXQ7IGRlZisrICkKLSAgICB7Ci0gICAgICBpZiAoIChGVF9CeXRlKWRlZi0+b3BjID09IGV4Yy0+b3Bjb2RlICYmIGRlZi0+YWN0aXZlICkKLSAgICAgIHsKLSAgICAgICAgVFRfQ2FsbFJlYyogIGNhbGw7Ci0KLQotICAgICAgICBpZiAoIGV4Yy0+Y2FsbFRvcCA+PSBleGMtPmNhbGxTaXplICkKLSAgICAgICAgewotICAgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggU3RhY2tfT3ZlcmZsb3cgKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBjYWxsID0gZXhjLT5jYWxsU3RhY2sgKyBleGMtPmNhbGxUb3ArKzsKLQotICAgICAgICBjYWxsLT5DYWxsZXJfUmFuZ2UgPSBleGMtPmN1clJhbmdlOwotICAgICAgICBjYWxsLT5DYWxsZXJfSVAgICAgPSBleGMtPklQICsgMTsKLSAgICAgICAgY2FsbC0+Q3VyX0NvdW50ICAgID0gMTsKLSAgICAgICAgY2FsbC0+RGVmICAgICAgICAgID0gZGVmOwotCi0gICAgICAgIEluc19Hb3RvX0NvZGVSYW5nZSggZXhjLCBkZWYtPnJhbmdlLCBkZWYtPnN0YXJ0ICk7Ci0KLSAgICAgICAgZXhjLT5zdGVwX2lucyA9IEZBTFNFOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZXhjLT5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX09wY29kZSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFJVTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIFRoaXMgZnVuY3Rpb24gZXhlY3V0ZXMgYSBydW4gb2Ygb3Bjb2Rlcy4gIEl0IHdpbGwgZXhpdCBpbiB0aGUgICAgICAgICovCi0gIC8qICBmb2xsb3dpbmcgY2FzZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIC0gRXJyb3JzIChpbiB3aGljaCBjYXNlIGl0IHJldHVybnMgRkFMU0UpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSBSZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBtYWluIGNvZGUgcmFuZ2UgKHJldHVybnMgVFJVRSkuICAgICAgICAgICAgKi8KLSAgLyogICAgUmVhY2hpbmcgdGhlIGVuZCBvZiBhIGNvZGUgcmFuZ2Ugd2l0aGluIGEgZnVuY3Rpb24gY2FsbCBpcyBhbiAgICAgICovCi0gIC8qICAgIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIC0gQWZ0ZXIgZXhlY3V0aW5nIG9uZSBzaW5nbGUgb3Bjb2RlLCBpZiB0aGUgZmxhZyBgSW5zdHJ1Y3Rpb25fVHJhcCcgICovCi0gIC8qICAgIGlzIHNldCB0byBUUlVFIChyZXR1cm5zIFRSVUUpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIE9uIGV4aXQgd2l0aCBUUlVFLCB0ZXN0IElQIDwgQ29kZVNpemUgdG8ga25vdyB3aGV0aGVyIGl0IGNvbWVzIGZyb20gICovCi0gIC8qICBhbiBpbnN0cnVjdGlvbiB0cmFwIG9yIGEgbm9ybWFsIHRlcm1pbmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBOb3RlOiBUaGUgZG9jdW1lbnRlZCBERUJVRyBvcGNvZGUgcG9wcyBhIHZhbHVlIGZyb20gdGhlIHN0YWNrLiAgVGhpcyAqLwotICAvKiAgICAgICAgYmVoYXZpb3VyIGlzIHVuc3VwcG9ydGVkOyBoZXJlIGEgREVCVUcgb3Bjb2RlIGlzIGFsd2F5cyBhbiAgICAgKi8KLSAgLyogICAgICAgIGVycm9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVEhJUyBJUyBUSEUgSU5URVJQUkVURVInUyBNQUlOIExPT1AuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gdHRpbnRlcnAuaCAqLwotCi0gIEZUX0VYUE9SVF9ERUYoIEZUX0Vycm9yICkKLSAgVFRfUnVuSW5zKCBUVF9FeGVjQ29udGV4dCAgZXhjICkKLSAgewotICAgIEZUX0xvbmcgICAgaW5zX2NvdW50ZXIgPSAwOyAgLyogZXhlY3V0ZWQgaW5zdHJ1Y3Rpb25zIGNvdW50ZXIgKi8KLSAgICBGVF9VU2hvcnQgIGk7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICBGVF9CeXRlICAgIG9wY29kZV9wYXR0ZXJuWzFdWzJdID0gewotICAgICAgICAgICAgICAgICAgLyogIzggVHlwZU1hbiBUYWxrIEFsaWduICovCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIDB4MDYsIC8qIFNQVlRMICAgKi8KLSAgICAgICAgICAgICAgICAgICAgMHg3RCwgLyogUkRURyAgICAqLwotICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICB9OwotICAgIEZUX1VTaG9ydCAgb3Bjb2RlX3BhdHRlcm5zICAgPSAxOwotICAgIEZUX1VTaG9ydCAgb3Bjb2RlX3BvaW50ZXJbMV0gPSB7IDAgfTsKLSAgICBGVF9VU2hvcnQgIG9wY29kZV9zaXplWzFdICAgID0geyAxIH07Ci0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotICAgIGV4Yy0+aXVwX2NhbGxlZCA9IEZBTFNFOwotI2VuZGlmIC8qIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORyAqLwotCi0gICAgLyogc2V0IFBQRU0gYW5kIENWVCBmdW5jdGlvbnMgKi8KLSAgICBleGMtPnR0X21ldHJpY3MucmF0aW8gPSAwOwotICAgIGlmICggZXhjLT5tZXRyaWNzLnhfcHBlbSAhPSBleGMtPm1ldHJpY3MueV9wcGVtICkKLSAgICB7Ci0gICAgICAvKiBub24tc3F1YXJlIHBpeGVscywgdXNlIHRoZSBzdHJldGNoZWQgcm91dGluZXMgKi8KLSAgICAgIGV4Yy0+ZnVuY19jdXJfcHBlbSAgPSBDdXJyZW50X1BwZW1fU3RyZXRjaGVkOwotICAgICAgZXhjLT5mdW5jX3JlYWRfY3Z0ICA9IFJlYWRfQ1ZUX1N0cmV0Y2hlZDsKLSAgICAgIGV4Yy0+ZnVuY193cml0ZV9jdnQgPSBXcml0ZV9DVlRfU3RyZXRjaGVkOwotICAgICAgZXhjLT5mdW5jX21vdmVfY3Z0ICA9IE1vdmVfQ1ZUX1N0cmV0Y2hlZDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIHNxdWFyZSBwaXhlbHMsIHVzZSBub3JtYWwgcm91dGluZXMgKi8KLSAgICAgIGV4Yy0+ZnVuY19jdXJfcHBlbSAgPSBDdXJyZW50X1BwZW07Ci0gICAgICBleGMtPmZ1bmNfcmVhZF9jdnQgID0gUmVhZF9DVlQ7Ci0gICAgICBleGMtPmZ1bmNfd3JpdGVfY3Z0ID0gV3JpdGVfQ1ZUOwotICAgICAgZXhjLT5mdW5jX21vdmVfY3Z0ICA9IE1vdmVfQ1ZUOwotICAgIH0KLQotICAgIENvbXB1dGVfRnVuY3MoIGV4YyApOwotICAgIENvbXB1dGVfUm91bmQoIGV4YywgKEZUX0J5dGUpZXhjLT5HUy5yb3VuZF9zdGF0ZSApOwotCi0gICAgZG8KLSAgICB7Ci0gICAgICBleGMtPm9wY29kZSA9IGV4Yy0+Y29kZVtleGMtPklQXTsKLQotI2lmZGVmIEZUX0RFQlVHX0xFVkVMX1RSQUNFCi0gICAgICB7Ci0gICAgICAgIEZUX0xvbmcgIGNudCA9IEZUX01JTiggOCwgZXhjLT50b3AgKTsKLSAgICAgICAgRlRfTG9uZyAgbjsKLQotCi0gICAgICAgIC8qIGlmIHRyYWNpbmcgbGV2ZWwgaXMgNywgc2hvdyBjdXJyZW50IGNvZGUgcG9zaXRpb24gKi8KLSAgICAgICAgLyogYW5kIHRoZSBmaXJzdCBmZXcgc3RhY2sgZWxlbWVudHMgYWxzbyAgICAgICAgICAgICAqLwotICAgICAgICBGVF9UUkFDRTYoKCAiICAiICkpOwotICAgICAgICBGVF9UUkFDRTcoKCAiJTA2ZCAiLCBleGMtPklQICkpOwotICAgICAgICBGVF9UUkFDRTYoKCBvcGNvZGVfbmFtZVtleGMtPm9wY29kZV0gKyAyICkpOwotICAgICAgICBGVF9UUkFDRTcoKCAiJSpzIiwgKm9wY29kZV9uYW1lW2V4Yy0+b3Bjb2RlXSA9PSAnQScKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxMiAtICggKm9wY29kZV9uYW1lW2V4Yy0+b3Bjb2RlXSAtICcwJyApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMiICkpOwotICAgICAgICBmb3IgKCBuID0gMDsgbiA8IGNudDsgbisrICkKLSAgICAgICAgICBGVF9UUkFDRTcoKCAiICVkIiwgZXhjLT5zdGFja1tleGMtPnRvcCAtIG5dICkpOwotICAgICAgICBGVF9UUkFDRTYoKCAiXG4iICkpOwotICAgICAgfQotI2VuZGlmIC8qIEZUX0RFQlVHX0xFVkVMX1RSQUNFICovCi0KLSAgICAgIGlmICggKCBleGMtPmxlbmd0aCA9IG9wY29kZV9sZW5ndGhbZXhjLT5vcGNvZGVdICkgPCAwICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBleGMtPklQICsgMSA+PSBleGMtPmNvZGVTaXplICkKLSAgICAgICAgICBnb3RvIExFcnJvckNvZGVPdmVyZmxvd187Ci0KLSAgICAgICAgZXhjLT5sZW5ndGggPSAyIC0gZXhjLT5sZW5ndGggKiBleGMtPmNvZGVbZXhjLT5JUCArIDFdOwotICAgICAgfQotCi0gICAgICBpZiAoIGV4Yy0+SVAgKyBleGMtPmxlbmd0aCA+IGV4Yy0+Y29kZVNpemUgKQotICAgICAgICBnb3RvIExFcnJvckNvZGVPdmVyZmxvd187Ci0KLSAgICAgIC8qIEZpcnN0LCBsZXQncyBjaGVjayBmb3IgZW1wdHkgc3RhY2sgYW5kIG92ZXJmbG93ICovCi0gICAgICBleGMtPmFyZ3MgPSBleGMtPnRvcCAtICggUG9wX1B1c2hfQ291bnRbZXhjLT5vcGNvZGVdID4+IDQgKTsKLQotICAgICAgLyogYGFyZ3MnIGlzIHRoZSB0b3Agb2YgdGhlIHN0YWNrIG9uY2UgYXJndW1lbnRzIGhhdmUgYmVlbiBwb3BwZWQuICovCi0gICAgICAvKiBPbmUgY2FuIGFsc28gaW50ZXJwcmV0IGl0IGFzIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBhcmd1bWVudC4gICAgKi8KLSAgICAgIGlmICggZXhjLT5hcmdzIDwgMCApCi0gICAgICB7Ci0gICAgICAgIGlmICggZXhjLT5wZWRhbnRpY19oaW50aW5nICkKLSAgICAgICAgewotICAgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggVG9vX0Zld19Bcmd1bWVudHMgKTsKLSAgICAgICAgICBnb3RvIExFcnJvckxhYmVsXzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHB1c2ggemVyb2VzIG9udG8gdGhlIHN0YWNrICovCi0gICAgICAgIGZvciAoIGkgPSAwOyBpIDwgUG9wX1B1c2hfQ291bnRbZXhjLT5vcGNvZGVdID4+IDQ7IGkrKyApCi0gICAgICAgICAgZXhjLT5zdGFja1tpXSA9IDA7Ci0gICAgICAgIGV4Yy0+YXJncyA9IDA7Ci0gICAgICB9Ci0KLSAgICAgIGV4Yy0+bmV3X3RvcCA9IGV4Yy0+YXJncyArICggUG9wX1B1c2hfQ291bnRbZXhjLT5vcGNvZGVdICYgMTUgKTsKLQotICAgICAgLyogYG5ld190b3AnIGlzIHRoZSBuZXcgdG9wIG9mIHRoZSBzdGFjaywgYWZ0ZXIgdGhlIGluc3RydWN0aW9uJ3MgKi8KLSAgICAgIC8qIGV4ZWN1dGlvbi4gIGB0b3AnIHdpbGwgYmUgc2V0IHRvIGBuZXdfdG9wJyBhZnRlciB0aGUgYHN3aXRjaCcgICovCi0gICAgICAvKiBzdGF0ZW1lbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBleGMtPm5ld190b3AgPiBleGMtPnN0YWNrU2l6ZSApCi0gICAgICB7Ci0gICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggU3RhY2tfT3ZlcmZsb3cgKTsKLSAgICAgICAgZ290byBMRXJyb3JMYWJlbF87Ci0gICAgICB9Ci0KLSAgICAgIGV4Yy0+c3RlcF9pbnMgPSBUUlVFOwotICAgICAgZXhjLT5lcnJvciAgICA9IEZUX0Vycl9PazsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotCi0gICAgICBpZiAoIFNVQlBJWEVMX0hJTlRJTkcgKQotICAgICAgewotICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG9wY29kZV9wYXR0ZXJuczsgaSsrICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggb3Bjb2RlX3BvaW50ZXJbaV0gPCBvcGNvZGVfc2l6ZVtpXSAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgICBleGMtPm9wY29kZSA9PSBvcGNvZGVfcGF0dGVybltpXVtvcGNvZGVfcG9pbnRlcltpXV0gKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG9wY29kZV9wb2ludGVyW2ldICs9IDE7Ci0KLSAgICAgICAgICAgIGlmICggb3Bjb2RlX3BvaW50ZXJbaV0gPT0gb3Bjb2RlX3NpemVbaV0gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBGVF9UUkFDRTYoKCAic3BoOiBvcGNvZGUgcHRybjogJWQsICVzICVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBleGMtPmZhY2UtPnJvb3QuZmFtaWx5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGV4Yy0+ZmFjZS0+cm9vdC5zdHlsZV9uYW1lICkpOwotCi0gICAgICAgICAgICAgIHN3aXRjaCAoIGkgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBvcGNvZGVfcG9pbnRlcltpXSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIG9wY29kZV9wb2ludGVyW2ldID0gMDsKLSAgICAgICAgfQotICAgICAgfQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0KLSAgICAgIHsKLSAgICAgICAgRlRfTG9uZyogIGFyZ3MgICA9IGV4Yy0+c3RhY2sgKyBleGMtPmFyZ3M7Ci0gICAgICAgIEZUX0J5dGUgICBvcGNvZGUgPSBleGMtPm9wY29kZTsKLQotCi0gICAgICAgIHN3aXRjaCAoIG9wY29kZSApCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAweDAwOiAgLyogU1ZUQ0EgeSAgKi8KLSAgICAgICAgY2FzZSAweDAxOiAgLyogU1ZUQ0EgeCAgKi8KLSAgICAgICAgY2FzZSAweDAyOiAgLyogU1B2VENBIHkgKi8KLSAgICAgICAgY2FzZSAweDAzOiAgLyogU1B2VENBIHggKi8KLSAgICAgICAgY2FzZSAweDA0OiAgLyogU0Z2VENBIHkgKi8KLSAgICAgICAgY2FzZSAweDA1OiAgLyogU0Z2VENBIHggKi8KLSAgICAgICAgICBJbnNfU3h5VENBKCBleGMgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MDY6ICAvKiBTUHZUTCAvLyAqLwotICAgICAgICBjYXNlIDB4MDc6ICAvKiBTUHZUTCArICAqLwotICAgICAgICAgIEluc19TUFZUTCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDA4OiAgLyogU0Z2VEwgLy8gKi8KLSAgICAgICAgY2FzZSAweDA5OiAgLyogU0Z2VEwgKyAgKi8KLSAgICAgICAgICBJbnNfU0ZWVEwoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgwQTogIC8qIFNQdkZTICovCi0gICAgICAgICAgSW5zX1NQVkZTKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MEI6ICAvKiBTRnZGUyAqLwotICAgICAgICAgIEluc19TRlZGUyggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDBDOiAgLyogR1B2ICovCi0gICAgICAgICAgSW5zX0dQViggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDBEOiAgLyogR0Z2ICovCi0gICAgICAgICAgSW5zX0dGViggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDBFOiAgLyogU0Z2VFB2ICovCi0gICAgICAgICAgSW5zX1NGVlRQViggZXhjICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDBGOiAgLyogSVNFQ1QgICovCi0gICAgICAgICAgSW5zX0lTRUNUKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MTA6ICAvKiBTUlAwICovCi0gICAgICAgICAgSW5zX1NSUDAoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgxMTogIC8qIFNSUDEgKi8KLSAgICAgICAgICBJbnNfU1JQMSggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDEyOiAgLyogU1JQMiAqLwotICAgICAgICAgIEluc19TUlAyKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MTM6ICAvKiBTWlAwICovCi0gICAgICAgICAgSW5zX1NaUDAoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgxNDogIC8qIFNaUDEgKi8KLSAgICAgICAgICBJbnNfU1pQMSggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDE1OiAgLyogU1pQMiAqLwotICAgICAgICAgIEluc19TWlAyKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MTY6ICAvKiBTWlBTICovCi0gICAgICAgICAgSW5zX1NaUFMoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgxNzogIC8qIFNMT09QICovCi0gICAgICAgICAgSW5zX1NMT09QKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MTg6ICAvKiBSVEcgKi8KLSAgICAgICAgICBJbnNfUlRHKCBleGMgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MTk6ICAvKiBSVEhHICovCi0gICAgICAgICAgSW5zX1JUSEcoIGV4YyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgxQTogIC8qIFNNRCAqLwotICAgICAgICAgIEluc19TTUQoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgxQjogIC8qIEVMU0UgKi8KLSAgICAgICAgICBJbnNfRUxTRSggZXhjICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDFDOiAgLyogSk1QUiAqLwotICAgICAgICAgIEluc19KTVBSKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MUQ6ICAvKiBTQ1ZUQ0kgKi8KLSAgICAgICAgICBJbnNfU0NWVENJKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MUU6ICAvKiBTU1dDSSAqLwotICAgICAgICAgIEluc19TU1dDSSggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDFGOiAgLyogU1NXICovCi0gICAgICAgICAgSW5zX1NTVyggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDIwOiAgLyogRFVQICovCi0gICAgICAgICAgSW5zX0RVUCggYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgyMTogIC8qIFBPUCAqLwotICAgICAgICAgIEluc19QT1AoKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MjI6ICAvKiBDTEVBUiAqLwotICAgICAgICAgIEluc19DTEVBUiggZXhjICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDIzOiAgLyogU1dBUCAqLwotICAgICAgICAgIEluc19TV0FQKCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDI0OiAgLyogREVQVEggKi8KLSAgICAgICAgICBJbnNfREVQVEgoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgyNTogIC8qIENJTkRFWCAqLwotICAgICAgICAgIEluc19DSU5ERVgoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgyNjogIC8qIE1JTkRFWCAqLwotICAgICAgICAgIEluc19NSU5ERVgoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgyNzogIC8qIEFMSUdOUFRTICovCi0gICAgICAgICAgSW5zX0FMSUdOUFRTKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4Mjg6ICAvKiA/Pz8/ICovCi0gICAgICAgICAgSW5zX1VOS05PV04oIGV4YyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgyOTogIC8qIFVUUCAqLwotICAgICAgICAgIEluc19VVFAoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgyQTogIC8qIExPT1BDQUxMICovCi0gICAgICAgICAgSW5zX0xPT1BDQUxMKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MkI6ICAvKiBDQUxMICovCi0gICAgICAgICAgSW5zX0NBTEwoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgyQzogIC8qIEZERUYgKi8KLSAgICAgICAgICBJbnNfRkRFRiggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDJEOiAgLyogRU5ERiAqLwotICAgICAgICAgIEluc19FTkRGKCBleGMgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MkU6ICAvKiBNREFQICovCi0gICAgICAgIGNhc2UgMHgyRjogIC8qIE1EQVAgKi8KLSAgICAgICAgICBJbnNfTURBUCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDMwOiAgLyogSVVQICovCi0gICAgICAgIGNhc2UgMHgzMTogIC8qIElVUCAqLwotICAgICAgICAgIEluc19JVVAoIGV4YyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgzMjogIC8qIFNIUCAqLwotICAgICAgICBjYXNlIDB4MzM6ICAvKiBTSFAgKi8KLSAgICAgICAgICBJbnNfU0hQKCBleGMgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4MzQ6ICAvKiBTSEMgKi8KLSAgICAgICAgY2FzZSAweDM1OiAgLyogU0hDICovCi0gICAgICAgICAgSW5zX1NIQyggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDM2OiAgLyogU0haICovCi0gICAgICAgIGNhc2UgMHgzNzogIC8qIFNIWiAqLwotICAgICAgICAgIEluc19TSFooIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgzODogIC8qIFNIUElYICovCi0gICAgICAgICAgSW5zX1NIUElYKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4Mzk6ICAvKiBJUCAgICAqLwotICAgICAgICAgIEluc19JUCggZXhjICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDNBOiAgLyogTVNJUlAgKi8KLSAgICAgICAgY2FzZSAweDNCOiAgLyogTVNJUlAgKi8KLSAgICAgICAgICBJbnNfTVNJUlAoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHgzQzogIC8qIEFsaWduUlAgKi8KLSAgICAgICAgICBJbnNfQUxJR05SUCggZXhjICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDNEOiAgLyogUlRERyAqLwotICAgICAgICAgIEluc19SVERHKCBleGMgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4M0U6ICAvKiBNSUFQICovCi0gICAgICAgIGNhc2UgMHgzRjogIC8qIE1JQVAgKi8KLSAgICAgICAgICBJbnNfTUlBUCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDQwOiAgLyogTlBVU0hCICovCi0gICAgICAgICAgSW5zX05QVVNIQiggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDQxOiAgLyogTlBVU0hXICovCi0gICAgICAgICAgSW5zX05QVVNIVyggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDQyOiAgLyogV1MgKi8KLSAgICAgICAgICBJbnNfV1MoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg0MzogIC8qIFJTICovCi0gICAgICAgICAgSW5zX1JTKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NDQ6ICAvKiBXQ1ZUUCAqLwotICAgICAgICAgIEluc19XQ1ZUUCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDQ1OiAgLyogUkNWVCAqLwotICAgICAgICAgIEluc19SQ1ZUKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NDY6ICAvKiBHQyAqLwotICAgICAgICBjYXNlIDB4NDc6ICAvKiBHQyAqLwotICAgICAgICAgIEluc19HQyggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDQ4OiAgLyogU0NGUyAqLwotICAgICAgICAgIEluc19TQ0ZTKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NDk6ICAvKiBNRCAqLwotICAgICAgICBjYXNlIDB4NEE6ICAvKiBNRCAqLwotICAgICAgICAgIEluc19NRCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDRCOiAgLyogTVBQRU0gKi8KLSAgICAgICAgICBJbnNfTVBQRU0oIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg0QzogIC8qIE1QUyAqLwotICAgICAgICAgIEluc19NUFMoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg0RDogIC8qIEZMSVBPTiAqLwotICAgICAgICAgIEluc19GTElQT04oIGV4YyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg0RTogIC8qIEZMSVBPRkYgKi8KLSAgICAgICAgICBJbnNfRkxJUE9GRiggZXhjICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDRGOiAgLyogREVCVUcgKi8KLSAgICAgICAgICBJbnNfREVCVUcoIGV4YyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg1MDogIC8qIExUICovCi0gICAgICAgICAgSW5zX0xUKCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDUxOiAgLyogTFRFUSAqLwotICAgICAgICAgIEluc19MVEVRKCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDUyOiAgLyogR1QgKi8KLSAgICAgICAgICBJbnNfR1QoIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NTM6ICAvKiBHVEVRICovCi0gICAgICAgICAgSW5zX0dURVEoIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NTQ6ICAvKiBFUSAqLwotICAgICAgICAgIEluc19FUSggYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg1NTogIC8qIE5FUSAqLwotICAgICAgICAgIEluc19ORVEoIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NTY6ICAvKiBPREQgKi8KLSAgICAgICAgICBJbnNfT0REKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NTc6ICAvKiBFVkVOICovCi0gICAgICAgICAgSW5zX0VWRU4oIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg1ODogIC8qIElGICovCi0gICAgICAgICAgSW5zX0lGKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NTk6ICAvKiBFSUYgKi8KLSAgICAgICAgICBJbnNfRUlGKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDVBOiAgLyogQU5EICovCi0gICAgICAgICAgSW5zX0FORCggYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg1QjogIC8qIE9SICovCi0gICAgICAgICAgSW5zX09SKCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDVDOiAgLyogTk9UICovCi0gICAgICAgICAgSW5zX05PVCggYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg1RDogIC8qIERFTFRBUDEgKi8KLSAgICAgICAgICBJbnNfREVMVEFQKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NUU6ICAvKiBTREIgKi8KLSAgICAgICAgICBJbnNfU0RCKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NUY6ICAvKiBTRFMgKi8KLSAgICAgICAgICBJbnNfU0RTKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NjA6ICAvKiBBREQgKi8KLSAgICAgICAgICBJbnNfQUREKCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDYxOiAgLyogU1VCICovCi0gICAgICAgICAgSW5zX1NVQiggYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg2MjogIC8qIERJViAqLwotICAgICAgICAgIEluc19ESVYoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg2MzogIC8qIE1VTCAqLwotICAgICAgICAgIEluc19NVUwoIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NjQ6ICAvKiBBQlMgKi8KLSAgICAgICAgICBJbnNfQUJTKCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDY1OiAgLyogTkVHICovCi0gICAgICAgICAgSW5zX05FRyggYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg2NjogIC8qIEZMT09SICovCi0gICAgICAgICAgSW5zX0ZMT09SKCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDY3OiAgLyogQ0VJTElORyAqLwotICAgICAgICAgIEluc19DRUlMSU5HKCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDY4OiAgLyogUk9VTkQgKi8KLSAgICAgICAgY2FzZSAweDY5OiAgLyogUk9VTkQgKi8KLSAgICAgICAgY2FzZSAweDZBOiAgLyogUk9VTkQgKi8KLSAgICAgICAgY2FzZSAweDZCOiAgLyogUk9VTkQgKi8KLSAgICAgICAgICBJbnNfUk9VTkQoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg2QzogIC8qIE5ST1VORCAqLwotICAgICAgICBjYXNlIDB4NkQ6ICAvKiBOUk9VTkQgKi8KLSAgICAgICAgY2FzZSAweDZFOiAgLyogTlJSVU5EICovCi0gICAgICAgIGNhc2UgMHg2RjogIC8qIE5ST1VORCAqLwotICAgICAgICAgIEluc19OUk9VTkQoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg3MDogIC8qIFdDVlRGICovCi0gICAgICAgICAgSW5zX1dDVlRGKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NzE6ICAvKiBERUxUQVAyICovCi0gICAgICAgIGNhc2UgMHg3MjogIC8qIERFTFRBUDMgKi8KLSAgICAgICAgICBJbnNfREVMVEFQKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4NzM6ICAvKiBERUxUQUMwICovCi0gICAgICAgIGNhc2UgMHg3NDogIC8qIERFTFRBQzEgKi8KLSAgICAgICAgY2FzZSAweDc1OiAgLyogREVMVEFDMiAqLwotICAgICAgICAgIEluc19ERUxUQUMoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg3NjogIC8qIFNST1VORCAqLwotICAgICAgICAgIEluc19TUk9VTkQoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg3NzogIC8qIFM0NVJvdW5kICovCi0gICAgICAgICAgSW5zX1M0NVJPVU5EKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4Nzg6ICAvKiBKUk9UICovCi0gICAgICAgICAgSW5zX0pST1QoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg3OTogIC8qIEpST0YgKi8KLSAgICAgICAgICBJbnNfSlJPRiggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDdBOiAgLyogUk9GRiAqLwotICAgICAgICAgIEluc19ST0ZGKCBleGMgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4N0I6ICAvKiA/Pz8/ICovCi0gICAgICAgICAgSW5zX1VOS05PV04oIGV4YyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg3QzogIC8qIFJVVEcgKi8KLSAgICAgICAgICBJbnNfUlVURyggZXhjICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDdEOiAgLyogUkRURyAqLwotICAgICAgICAgIEluc19SRFRHKCBleGMgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4N0U6ICAvKiBTQU5HVyAqLwotICAgICAgICAgIEluc19TQU5HVygpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg3RjogIC8qIEFBICovCi0gICAgICAgICAgSW5zX0FBKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDgwOiAgLyogRkxJUFBUICovCi0gICAgICAgICAgSW5zX0ZMSVBQVCggZXhjICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDgxOiAgLyogRkxJUFJHT04gKi8KLSAgICAgICAgICBJbnNfRkxJUFJHT04oIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg4MjogIC8qIEZMSVBSR09GRiAqLwotICAgICAgICAgIEluc19GTElQUkdPRkYoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg4MzogIC8qIFVOS05PV04gKi8KLSAgICAgICAgY2FzZSAweDg0OiAgLyogVU5LTk9XTiAqLwotICAgICAgICAgIEluc19VTktOT1dOKCBleGMgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4ODU6ICAvKiBTQ0FOQ1RSTCAqLwotICAgICAgICAgIEluc19TQ0FOQ1RSTCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDg2OiAgLyogU0RQdlRMICovCi0gICAgICAgIGNhc2UgMHg4NzogIC8qIFNEUHZUTCAqLwotICAgICAgICAgIEluc19TRFBWVEwoIGV4YywgYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg4ODogIC8qIEdFVElORk8gKi8KLSAgICAgICAgICBJbnNfR0VUSU5GTyggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDg5OiAgLyogSURFRiAqLwotICAgICAgICAgIEluc19JREVGKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4OEE6ICAvKiBST0xMICovCi0gICAgICAgICAgSW5zX1JPTEwoIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4OEI6ICAvKiBNQVggKi8KLSAgICAgICAgICBJbnNfTUFYKCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDhDOiAgLyogTUlOICovCi0gICAgICAgICAgSW5zX01JTiggYXJncyApOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHg4RDogIC8qIFNDQU5UWVBFICovCi0gICAgICAgICAgSW5zX1NDQU5UWVBFKCBleGMsIGFyZ3MgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4OEU6ICAvKiBJTlNUQ1RSTCAqLwotICAgICAgICAgIEluc19JTlNUQ1RSTCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweDhGOgotICAgICAgICAgIEluc19VTktOT1dOKCBleGMgKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGlmICggb3Bjb2RlID49IDB4RTAgKQotICAgICAgICAgICAgSW5zX01JUlAoIGV4YywgYXJncyApOwotICAgICAgICAgIGVsc2UgaWYgKCBvcGNvZGUgPj0gMHhDMCApCi0gICAgICAgICAgICBJbnNfTURSUCggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgZWxzZSBpZiAoIG9wY29kZSA+PSAweEI4ICkKLSAgICAgICAgICAgIEluc19QVVNIVyggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgZWxzZSBpZiAoIG9wY29kZSA+PSAweEIwICkKLSAgICAgICAgICAgIEluc19QVVNIQiggZXhjLCBhcmdzICk7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgSW5zX1VOS05PV04oIGV4YyApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICggZXhjLT5lcnJvciApCi0gICAgICB7Ci0gICAgICAgIHN3aXRjaCAoIGV4Yy0+ZXJyb3IgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogbG9va2luZyBmb3IgcmVkZWZpbmVkIGluc3RydWN0aW9ucyAqLwotICAgICAgICBjYXNlIEZUX0VSUiggSW52YWxpZF9PcGNvZGUgKToKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBUVF9EZWZSZWNvcmQqICBkZWYgICA9IGV4Yy0+SURlZnM7Ci0gICAgICAgICAgICBUVF9EZWZSZWNvcmQqICBsaW1pdCA9IGRlZiArIGV4Yy0+bnVtSURlZnM7Ci0KLQotICAgICAgICAgICAgZm9yICggOyBkZWYgPCBsaW1pdDsgZGVmKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoIGRlZi0+YWN0aXZlICYmIGV4Yy0+b3Bjb2RlID09IChGVF9CeXRlKWRlZi0+b3BjICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFRUX0NhbGxSZWMqICBjYWxscmVjOwotCi0KLSAgICAgICAgICAgICAgICBpZiAoIGV4Yy0+Y2FsbFRvcCA+PSBleGMtPmNhbGxTaXplICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBleGMtPmVycm9yID0gRlRfVEhST1coIEludmFsaWRfUmVmZXJlbmNlICk7Ci0gICAgICAgICAgICAgICAgICBnb3RvIExFcnJvckxhYmVsXzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjYWxscmVjID0gJmV4Yy0+Y2FsbFN0YWNrW2V4Yy0+Y2FsbFRvcF07Ci0KLSAgICAgICAgICAgICAgICBjYWxscmVjLT5DYWxsZXJfUmFuZ2UgPSBleGMtPmN1clJhbmdlOwotICAgICAgICAgICAgICAgIGNhbGxyZWMtPkNhbGxlcl9JUCAgICA9IGV4Yy0+SVAgKyAxOwotICAgICAgICAgICAgICAgIGNhbGxyZWMtPkN1cl9Db3VudCAgICA9IDE7Ci0gICAgICAgICAgICAgICAgY2FsbHJlYy0+RGVmICAgICAgICAgID0gZGVmOwotCi0gICAgICAgICAgICAgICAgaWYgKCBJbnNfR290b19Db2RlUmFuZ2UoIGV4YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmLT5yYW5nZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmLT5zdGFydCApID09IEZBSUxVUkUgKQotICAgICAgICAgICAgICAgICAgZ290byBMRXJyb3JMYWJlbF87Ci0KLSAgICAgICAgICAgICAgICBnb3RvIExTdWl0ZUxhYmVsXzsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9PcGNvZGUgKTsKLSAgICAgICAgICBnb3RvIExFcnJvckxhYmVsXzsKLQotI2lmIDAKLSAgICAgICAgICBicmVhazsgICAvKiBVbnJlYWNoYWJsZSBjb2RlIHdhcm5pbmcgc3VwcHJlc3Npb24uICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgLyogTGVhdmUgdG8gcmVtaW5kIGluIGNhc2UgYSBsYXRlciBjaGFuZ2UgdGhlIGVkaXRvciAqLwotICAgICAgICAgICAgICAgICAgIC8qIHRvIGNvbnNpZGVyIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNlbmRpZgotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgZ290byBMRXJyb3JMYWJlbF87Ci0KLSNpZiAwCi0gICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZXhjLT50b3AgPSBleGMtPm5ld190b3A7Ci0KLSAgICAgIGlmICggZXhjLT5zdGVwX2lucyApCi0gICAgICAgIGV4Yy0+SVAgKz0gZXhjLT5sZW5ndGg7Ci0KLSAgICAgIC8qIGluY3JlbWVudCBpbnN0cnVjdGlvbiBjb3VudGVyIGFuZCBjaGVjayBpZiB3ZSBkaWRuJ3QgKi8KLSAgICAgIC8qIHJ1biB0aGlzIHByb2dyYW0gZm9yIHRvbyBsb25nIChlLmcuIGluZmluaXRlIGxvb3BzKS4gKi8KLSAgICAgIGlmICggKytpbnNfY291bnRlciA+IE1BWF9SVU5OQUJMRV9PUENPREVTICkKLSAgICAgICAgcmV0dXJuIEZUX1RIUk9XKCBFeGVjdXRpb25fVG9vX0xvbmcgKTsKLQotICAgIExTdWl0ZUxhYmVsXzoKLSAgICAgIGlmICggZXhjLT5JUCA+PSBleGMtPmNvZGVTaXplICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCBleGMtPmNhbGxUb3AgPiAwICkKLSAgICAgICAgewotICAgICAgICAgIGV4Yy0+ZXJyb3IgPSBGVF9USFJPVyggQ29kZV9PdmVyZmxvdyApOwotICAgICAgICAgIGdvdG8gTEVycm9yTGFiZWxfOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBnb3RvIExOb19FcnJvcl87Ci0gICAgICB9Ci0gICAgfSB3aGlsZSAoICFleGMtPmluc3RydWN0aW9uX3RyYXAgKTsKLQotICBMTm9fRXJyb3JfOgotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0KLSAgTEVycm9yQ29kZU92ZXJmbG93XzoKLSAgICBleGMtPmVycm9yID0gRlRfVEhST1coIENvZGVfT3ZlcmZsb3cgKTsKLQotICBMRXJyb3JMYWJlbF86Ci0gICAgLyogSWYgYW55IGVycm9ycyBoYXZlIG9jY3VycmVkLCBmdW5jdGlvbiB0YWJsZXMgbWF5IGJlIGJyb2tlbi4gKi8KLSAgICAvKiBGb3JjZSBhIHJlLWV4ZWN1dGlvbiBvZiBgcHJlcCcgYW5kIGBmcGdtJyB0YWJsZXMgaWYgbm8gICAgICAqLwotICAgIC8qIGJ5dGVjb2RlIGRlYnVnZ2VyIGlzIHJ1bi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBleGMtPmVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgIWV4Yy0+aW5zdHJ1Y3Rpb25fdHJhcCAgICAgICAgICAgICAgJiYKLSAgICAgICAgIGV4Yy0+Y3VyUmFuZ2UgPT0gdHRfY29kZXJhbmdlX2dseXBoICkKLSAgICB7Ci0gICAgICBGVF9UUkFDRTEoKCAiICBUaGUgaW50ZXJwcmV0ZXIgcmV0dXJuZWQgZXJyb3IgMHgleFxuIiwgZXhjLT5lcnJvciApKTsKLSAgICAgIGV4Yy0+c2l6ZS0+Ynl0ZWNvZGVfcmVhZHkgPSAtMTsKLSAgICAgIGV4Yy0+c2l6ZS0+Y3Z0X3JlYWR5ICAgICAgPSAtMTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXhjLT5lcnJvcjsKLSAgfQotCi0KLSNlbmRpZiAvKiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dGludGVycC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0aW50ZXJwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNzA2ZDAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0aW50ZXJwLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRpbnRlcnAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlIGJ5dGVjb2RlIGludGVycHJldGVyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fVFRJTlRFUlBfSF9fCi0jZGVmaW5lIF9fVFRJTlRFUlBfSF9fCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgInR0b2Jqcy5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBSb3VuZGluZyBtb2RlIGNvbnN0YW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFRUX1JvdW5kX09mZiAgICAgICAgICAgICA1Ci0jZGVmaW5lIFRUX1JvdW5kX1RvX0hhbGZfR3JpZCAgICAwCi0jZGVmaW5lIFRUX1JvdW5kX1RvX0dyaWQgICAgICAgICAxCi0jZGVmaW5lIFRUX1JvdW5kX1RvX0RvdWJsZV9HcmlkICAyCi0jZGVmaW5lIFRUX1JvdW5kX1VwX1RvX0dyaWQgICAgICA0Ci0jZGVmaW5lIFRUX1JvdW5kX0Rvd25fVG9fR3JpZCAgICAzCi0jZGVmaW5lIFRUX1JvdW5kX1N1cGVyICAgICAgICAgICA2Ci0jZGVmaW5lIFRUX1JvdW5kX1N1cGVyXzQ1ICAgICAgICA3Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZ1bmN0aW9uIHR5cGVzIHVzZWQgYnkgdGhlIGludGVycHJldGVyLCBkZXBlbmRpbmcgb24gdmFyaW91cyBtb2RlcyAgICAqLwotICAvKiAoZS5nLiB0aGUgcm91bmRpbmcgbW9kZSwgd2hldGhlciB0byByZW5kZXIgYSB2ZXJ0aWNhbCBvciBob3Jpem9udGFsICAgKi8KLSAgLyogbGluZSBldGMpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBSb3VuZGluZyBmdW5jdGlvbiAqLwotICB0eXBlZGVmIEZUX0YyNkRvdDYKLSAgKCpUVF9Sb3VuZF9GdW5jKSggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIGRpc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICBGVF9GMjZEb3Q2ICAgICAgY29tcGVuc2F0aW9uICk7Ci0KLSAgLyogUG9pbnQgZGlzcGxhY2VtZW50IGFsb25nIHRoZSBmcmVlZG9tIHZlY3RvciByb3V0aW5lICovCi0gIHR5cGVkZWYgdm9pZAotICAoKlRUX01vdmVfRnVuYykoIFRUX0V4ZWNDb250ZXh0ICBleGMsCi0gICAgICAgICAgICAgICAgICAgVFRfR2x5cGhab25lICAgIHpvbmUsCi0gICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICAgIHBvaW50LAotICAgICAgICAgICAgICAgICAgIEZUX0YyNkRvdDYgICAgICBkaXN0YW5jZSApOwotCi0gIC8qIERpc3RhbmNlIHByb2plY3Rpb24gYWxvbmcgb25lIG9mIHRoZSBwcm9qZWN0aW9uIHZlY3RvcnMgKi8KLSAgdHlwZWRlZiBGVF9GMjZEb3Q2Ci0gICgqVFRfUHJvamVjdF9GdW5jKSggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MgICAgICAgICAgZHgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfUG9zICAgICAgICAgIGR5ICk7Ci0KLSAgLyogZ2V0dGluZyBjdXJyZW50IHBwZW0uICBUYWtlIGNhcmUgb2Ygbm9uLXNxdWFyZSBwaXhlbHMgaWYgbmVjZXNzYXJ5ICovCi0gIHR5cGVkZWYgRlRfTG9uZwotICAoKlRUX0N1cl9QcGVtX0Z1bmMpKCBUVF9FeGVjQ29udGV4dCAgZXhjICk7Ci0KLSAgLyogcmVhZGluZyBhIGN2dCB2YWx1ZS4gIFRha2UgY2FyZSBvZiBub24tc3F1YXJlIHBpeGVscyBpZiBuZWNlc3NhcnkgKi8KLSAgdHlwZWRlZiBGVF9GMjZEb3Q2Ci0gICgqVFRfR2V0X0NWVF9GdW5jKSggVFRfRXhlY0NvbnRleHQgIGV4YywKLSAgICAgICAgICAgICAgICAgICAgICBGVF9VTG9uZyAgICAgICAgaWR4ICk7Ci0KLSAgLyogc2V0dGluZyBvciBtb3ZpbmcgYSBjdnQgdmFsdWUuICBUYWtlIGNhcmUgb2Ygbm9uLXNxdWFyZSBwaXhlbHMgICovCi0gIC8qIGlmIG5lY2Vzc2FyeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHZvaWQKLSAgKCpUVF9TZXRfQ1ZUX0Z1bmMpKCBUVF9FeGVjQ29udGV4dCAgZXhjLAotICAgICAgICAgICAgICAgICAgICAgIEZUX1VMb25nICAgICAgICBpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgRlRfRjI2RG90NiAgICAgIHZhbHVlICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgYSBjYWxsIHJlY29yZCwgdXNlZCB0byBtYW5hZ2UgZnVuY3Rpb24gY2FsbHMuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX0NhbGxSZWNfCi0gIHsKLSAgICBGVF9JbnQgICBDYWxsZXJfUmFuZ2U7Ci0gICAgRlRfTG9uZyAgQ2FsbGVyX0lQOwotICAgIEZUX0xvbmcgIEN1cl9Db3VudDsKLQotICAgIFRUX0RlZlJlY29yZCAgKkRlZjsgLyogZWl0aGVyIEZERUYgb3IgSURFRiAqLwotCi0gIH0gVFRfQ2FsbFJlYywgKlRUX0NhbGxTdGFjazsKLQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVzZSBzdHJ1Y3R1cmVzIGRlZmluZSBydWxlcyB1c2VkIHRvIHR3ZWFrIHN1YnBpeGVsIGhpbnRpbmcgZm9yICAgICAgKi8KLSAgLyogdmFyaW91cyBmb250cy4gICIiLCAwLCAiIiwgTlVMTCB2YWx1ZSBpbmRpY2F0ZXMgdG8gbWF0Y2ggYW55IHZhbHVlLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0jZGVmaW5lIFNQSF9NQVhfTkFNRV9TSVpFICAgICAgMzIKLSNkZWZpbmUgU1BIX01BWF9DTEFTU19NRU1CRVJTICAxMDAKLQotICB0eXBlZGVmIHN0cnVjdCAgU1BIX1R3ZWFrUnVsZV8KLSAgewotICAgIGNvbnN0IGNoYXIgICAgICBmYW1pbHlbU1BIX01BWF9OQU1FX1NJWkVdOwotICAgIGNvbnN0IEZUX1VJbnQgICBwcGVtOwotICAgIGNvbnN0IGNoYXIgICAgICBzdHlsZVtTUEhfTUFYX05BTUVfU0laRV07Ci0gICAgY29uc3QgRlRfVUxvbmcgIGdseXBoOwotCi0gIH0gU1BIX1R3ZWFrUnVsZTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBTUEhfU2NhbGVSdWxlXwotICB7Ci0gICAgY29uc3QgY2hhciAgICAgIGZhbWlseVtTUEhfTUFYX05BTUVfU0laRV07Ci0gICAgY29uc3QgRlRfVUludCAgIHBwZW07Ci0gICAgY29uc3QgY2hhciAgICAgIHN0eWxlW1NQSF9NQVhfTkFNRV9TSVpFXTsKLSAgICBjb25zdCBGVF9VTG9uZyAgZ2x5cGg7Ci0gICAgY29uc3QgRlRfVUxvbmcgIHNjYWxlOwotCi0gIH0gU1BIX1NjYWxlUnVsZTsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBTUEhfRm9udF9DbGFzc18KLSAgewotICAgIGNvbnN0IGNoYXIgIG5hbWVbU1BIX01BWF9OQU1FX1NJWkVdOwotICAgIGNvbnN0IGNoYXIgIG1lbWJlcltTUEhfTUFYX0NMQVNTX01FTUJFUlNdW1NQSF9NQVhfTkFNRV9TSVpFXTsKLQotICB9IFNQSF9Gb250X0NsYXNzOwotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWluIHN0cnVjdHVyZSBmb3IgdGhlIGludGVycHJldGVyIHdoaWNoIGNvbGxlY3RzIGFsbCBuZWNlc3NhcnkgICAqLwotICAvKiB2YXJpYWJsZXMgYW5kIHN0YXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9FeGVjQ29udGV4dFJlY18KLSAgewotICAgIFRUX0ZhY2UgICAgICAgICAgICBmYWNlOwotICAgIFRUX1NpemUgICAgICAgICAgICBzaXplOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnk7Ci0KLSAgICAvKiBpbnN0cnVjdGlvbnMgc3RhdGUgKi8KLQotICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvcjsgICAgICAvKiBsYXN0IGV4ZWN1dGlvbiBlcnJvciAqLwotCi0gICAgRlRfTG9uZyAgICAgICAgICAgIHRvcDsgICAgICAgIC8qIHRvcCBvZiBleGVjLiBzdGFjayAgICovCi0KLSAgICBGVF9Mb25nICAgICAgICAgICAgc3RhY2tTaXplOyAgLyogc2l6ZSBvZiBleGVjLiBzdGFjayAgKi8KLSAgICBGVF9Mb25nKiAgICAgICAgICAgc3RhY2s7ICAgICAgLyogY3VycmVudCBleGVjLiBzdGFjayAgKi8KLQotICAgIEZUX0xvbmcgICAgICAgICAgICBhcmdzOwotICAgIEZUX0xvbmcgICAgICAgICAgICBuZXdfdG9wOyAgICAvKiBuZXcgdG9wIGFmdGVyIGV4ZWMuICAqLwotCi0gICAgVFRfR2x5cGhab25lUmVjICAgIHpwMCwgICAgICAgIC8qIHpvbmUgcmVjb3JkcyAqLwotICAgICAgICAgICAgICAgICAgICAgICB6cDEsCi0gICAgICAgICAgICAgICAgICAgICAgIHpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgcHRzLAotICAgICAgICAgICAgICAgICAgICAgICB0d2lsaWdodDsKLQotICAgIEZUX1NpemVfTWV0cmljcyAgICBtZXRyaWNzOwotICAgIFRUX1NpemVfTWV0cmljcyAgICB0dF9tZXRyaWNzOyAvKiBzaXplIG1ldHJpY3MgKi8KLQotICAgIFRUX0dyYXBoaWNzU3RhdGUgICBHUzsgICAgICAgICAvKiBjdXJyZW50IGdyYXBoaWNzIHN0YXRlICovCi0KLSAgICBGVF9JbnQgICAgICAgICAgICAgY3VyUmFuZ2U7ICAvKiBjdXJyZW50IGNvZGUgcmFuZ2UgbnVtYmVyICAgKi8KLSAgICBGVF9CeXRlKiAgICAgICAgICAgY29kZTsgICAgICAvKiBjdXJyZW50IGNvZGUgcmFuZ2UgICAgICAgICAgKi8KLSAgICBGVF9Mb25nICAgICAgICAgICAgSVA7ICAgICAgICAvKiBjdXJyZW50IGluc3RydWN0aW9uIHBvaW50ZXIgKi8KLSAgICBGVF9Mb25nICAgICAgICAgICAgY29kZVNpemU7ICAvKiBzaXplIG9mIGN1cnJlbnQgcmFuZ2UgICAgICAgKi8KLQotICAgIEZUX0J5dGUgICAgICAgICAgICBvcGNvZGU7ICAgIC8qIGN1cnJlbnQgb3Bjb2RlICAgICAgICAgICAgICAqLwotICAgIEZUX0ludCAgICAgICAgICAgICBsZW5ndGg7ICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IG9wY29kZSAgICAqLwotCi0gICAgRlRfQm9vbCAgICAgICAgICAgIHN0ZXBfaW5zOyAgLyogdHJ1ZSBpZiB0aGUgaW50ZXJwcmV0ZXIgbXVzdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluY3JlbWVudCBJUCBhZnRlciBpbnMuIGV4ZWMgKi8KLSAgICBGVF9VTG9uZyAgICAgICAgICAgY3Z0U2l6ZTsKLSAgICBGVF9Mb25nKiAgICAgICAgICAgY3Z0OwotCi0gICAgRlRfVUludCAgICAgICAgICAgIGdseXBoU2l6ZTsgLyogZ2x5cGggaW5zdHJ1Y3Rpb25zIGJ1ZmZlciBzaXplICovCi0gICAgRlRfQnl0ZSogICAgICAgICAgIGdseXBoSW5zOyAgLyogZ2x5cGggaW5zdHJ1Y3Rpb25zIGJ1ZmZlciAqLwotCi0gICAgRlRfVUludCAgICAgICAgICAgIG51bUZEZWZzOyAgLyogbnVtYmVyIG9mIGZ1bmN0aW9uIGRlZnMgICAgICAgICAqLwotICAgIEZUX1VJbnQgICAgICAgICAgICBtYXhGRGVmczsgIC8qIG1heGltdW0gbnVtYmVyIG9mIGZ1bmN0aW9uIGRlZnMgKi8KLSAgICBUVF9EZWZBcnJheSAgICAgICAgRkRlZnM7ICAgICAvKiB0YWJsZSBvZiBGRGVmcyBlbnRyaWVzICAgICAgICAgICovCi0KLSAgICBGVF9VSW50ICAgICAgICAgICAgbnVtSURlZnM7ICAvKiBudW1iZXIgb2YgaW5zdHJ1Y3Rpb24gZGVmcyAqLwotICAgIEZUX1VJbnQgICAgICAgICAgICBtYXhJRGVmczsgIC8qIG1heGltdW0gbnVtYmVyIG9mIGlucyBkZWZzICovCi0gICAgVFRfRGVmQXJyYXkgICAgICAgIElEZWZzOyAgICAgLyogdGFibGUgb2YgSURlZnMgZW50cmllcyAgICAgKi8KLQotICAgIEZUX1VJbnQgICAgICAgICAgICBtYXhGdW5jOyAgIC8qIG1heGltdW0gZnVuY3Rpb24gaW5kZXggICAgICovCi0gICAgRlRfVUludCAgICAgICAgICAgIG1heEluczsgICAgLyogbWF4aW11bSBpbnN0cnVjdGlvbiBpbmRleCAgKi8KLQotICAgIEZUX0ludCAgICAgICAgICAgICBjYWxsVG9wLCAgICAvKiB0b3Agb2YgY2FsbCBzdGFjayBkdXJpbmcgZXhlY3V0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIGNhbGxTaXplOyAgIC8qIHNpemUgb2YgY2FsbCBzdGFjayAqLwotICAgIFRUX0NhbGxTdGFjayAgICAgICBjYWxsU3RhY2s7ICAvKiBjYWxsIHN0YWNrICovCi0KLSAgICBGVF9VU2hvcnQgICAgICAgICAgbWF4UG9pbnRzOyAgICAvKiBjYXBhY2l0eSBvZiB0aGlzIGNvbnRleHQncyBgcHRzJyAqLwotICAgIEZUX1Nob3J0ICAgICAgICAgICBtYXhDb250b3VyczsgIC8qIHJlY29yZCwgZXhwcmVzc2VkIGluIHBvaW50cyBhbmQgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29udG91cnMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIFRUX0NvZGVSYW5nZVRhYmxlICBjb2RlUmFuZ2VUYWJsZTsgIC8qIHRhYmxlIG9mIHZhbGlkIGNvZGUgcmFuZ2VzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlZnVsIGZvciB0aGUgZGVidWdnZXIgICAqLwotCi0gICAgRlRfVVNob3J0ICAgICAgICAgIHN0b3JlU2l6ZTsgIC8qIHNpemUgb2YgY3VycmVudCBzdG9yYWdlICovCi0gICAgRlRfTG9uZyogICAgICAgICAgIHN0b3JhZ2U7ICAgIC8qIHN0b3JhZ2UgYXJlYSAgICAgICAgICAgICovCi0KLSAgICBGVF9GMjZEb3Q2ICAgICAgICAgcGVyaW9kOyAgICAgLyogdmFsdWVzIHVzZWQgZm9yIHRoZSAqLwotICAgIEZUX0YyNkRvdDYgICAgICAgICBwaGFzZTsgICAgICAvKiBgU3VwZXJSb3VuZGluZycgICAgICovCi0gICAgRlRfRjI2RG90NiAgICAgICAgIHRocmVzaG9sZDsKLQotICAgIEZUX0Jvb2wgICAgICAgICAgICBpbnN0cnVjdGlvbl90cmFwOyAvKiBJZiBgVHJ1ZScsIHRoZSBpbnRlcnByZXRlciB3aWxsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4aXQgYWZ0ZXIgZWFjaCBpbnN0cnVjdGlvbiAgICAgKi8KLQotICAgIFRUX0dyYXBoaWNzU3RhdGUgICBkZWZhdWx0X0dTOyAgICAgICAvKiBncmFwaGljcyBzdGF0ZSByZXN1bHRpbmcgZnJvbSAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBwcmVwIHByb2dyYW0gICAgICAgICAgICAgICAgKi8KLSAgICBGVF9Cb29sICAgICAgICAgICAgaXNfY29tcG9zaXRlOyAgICAgLyogdHJ1ZSBpZiB0aGUgZ2x5cGggaXMgY29tcG9zaXRlICAqLwotICAgIEZUX0Jvb2wgICAgICAgICAgICBwZWRhbnRpY19oaW50aW5nOyAvKiB0cnVlIGlmIHBlZGFudGljIGludGVycHJldGF0aW9uICovCi0KLSAgICAvKiBsYXRlc3QgaW50ZXJwcmV0ZXIgYWRkaXRpb25zICovCi0KLSAgICBGVF9Mb25nICAgICAgICAgICAgRl9kb3RfUDsgICAgLyogZG90IHByb2R1Y3Qgb2YgZnJlZWRvbSBhbmQgcHJvamVjdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2ZWN0b3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgVFRfUm91bmRfRnVuYyAgICAgIGZ1bmNfcm91bmQ7IC8qIGN1cnJlbnQgcm91bmRpbmcgZnVuY3Rpb24gICAgICAgICAgICAgKi8KLQotICAgIFRUX1Byb2plY3RfRnVuYyAgICBmdW5jX3Byb2plY3QsICAgLyogY3VycmVudCBwcm9qZWN0aW9uIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfZHVhbHByb2osICAvKiBjdXJyZW50IGR1YWwgcHJvai4gZnVuY3Rpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgZnVuY19mcmVlUHJvajsgIC8qIGN1cnJlbnQgZnJlZWRvbSBwcm9qLiBmdW5jICAqLwotCi0gICAgVFRfTW92ZV9GdW5jICAgICAgIGZ1bmNfbW92ZTsgICAgICAvKiBjdXJyZW50IHBvaW50IG1vdmUgZnVuY3Rpb24gKi8KLSAgICBUVF9Nb3ZlX0Z1bmMgICAgICAgZnVuY19tb3ZlX29yaWc7IC8qIG1vdmUgb3JpZ2luYWwgcG9zaXRpb24gZnVuY3Rpb24gKi8KLQotICAgIFRUX0N1cl9QcGVtX0Z1bmMgICBmdW5jX2N1cl9wcGVtOyAgLyogZ2V0IGN1cnJlbnQgcHJvai4gcHBlbSB2YWx1ZSAgKi8KLQotICAgIFRUX0dldF9DVlRfRnVuYyAgICBmdW5jX3JlYWRfY3Z0OyAgLyogcmVhZCBhIGN2dCBlbnRyeSAgICAgICAgICAgICAgKi8KLSAgICBUVF9TZXRfQ1ZUX0Z1bmMgICAgZnVuY193cml0ZV9jdnQ7IC8qIHdyaXRlIGEgY3Z0IGVudHJ5IChpbiBwaXhlbHMpICovCi0gICAgVFRfU2V0X0NWVF9GdW5jICAgIGZ1bmNfbW92ZV9jdnQ7ICAvKiBpbmNyIGEgY3Z0IGVudHJ5IChpbiBwaXhlbHMpICAqLwotCi0gICAgRlRfQm9vbCAgICAgICAgICAgIGdyYXlzY2FsZTsgICAgICAvKiBhcmUgd2UgaGludGluZyBmb3IgZ3JheXNjYWxlPyAqLwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0gICAgVFRfUm91bmRfRnVuYyAgICAgIGZ1bmNfcm91bmRfc3BobjsgICAvKiBzdWJwaXhlbCByb3VuZGluZyBmdW5jdGlvbiAqLwotCi0gICAgRlRfQm9vbCAgICAgICAgICAgIHN1YnBpeGVsX2hpbnRpbmc7ICAvKiBVc2luZyBzdWJwaXhlbCBoaW50aW5nPyAgICAgICAqLwotICAgIEZUX0Jvb2wgICAgICAgICAgICBpZ25vcmVfeF9tb2RlOyAgICAgLyogU3RhbmRhcmQgcmVuZGVyaW5nIG1vZGUgZm9yICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1YnBpeGVsIGhpbnRpbmcuICBPbiBpZiBncmF5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvciBzdWJwaXhlbCBoaW50aW5nIGlzIG9uLiAgICAqLwotCi0gICAgLyogVGhlIGZvbGxvd2luZyA2IGFyZW4ndCBmdWxseSBpbXBsZW1lbnRlZCBidXQgaGVyZSBmb3IgTVMgcmFzdGVyaXplciAqLwotICAgIC8qIGNvbXBhdGliaWxpdHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9Cb29sICAgICAgICAgICAgY29tcGF0aWJsZV93aWR0aHM7ICAgICAvKiBjb21wYXRpYmxlIHdpZHRocz8gICAgICAgICovCi0gICAgRlRfQm9vbCAgICAgICAgICAgIHN5bW1ldHJpY2FsX3Ntb290aGluZzsgLyogc3ltbWV0cmljYWxfc21vb3RoaW5nPyAgICAqLwotICAgIEZUX0Jvb2wgICAgICAgICAgICBiZ3I7ICAgICAgICAgICAgICAgICAgIC8qIGJnciBpbnN0ZWFkIG9mIHJnYj8gICAgICAgKi8KLSAgICBGVF9Cb29sICAgICAgICAgICAgdmVydGljYWxfbGNkOyAgICAgICAgICAvKiBsb25nIHNpZGUgb2YgTENEIHN1YnBpeGVsICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcmVjdGFuZ2xlcyBpcyBob3Jpem9udGFsICAqLwotICAgIEZUX0Jvb2wgICAgICAgICAgICBzdWJwaXhlbF9wb3NpdGlvbmVkOyAgIC8qIHN1YnBpeGVsIHBvc2l0aW9uZWQgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoRGlyZWN0V3JpdGUgQ2xlYXJUeXBlKT8gICovCi0gICAgRlRfQm9vbCAgICAgICAgICAgIGdyYXlfY2xlYXJ0eXBlOyAgICAgICAgLyogQ2xlYXJUeXBlIGhpbnRpbmcgYnV0ICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdyYXlzY2FsZSByZW5kZXJpbmcgICAgICAgKi8KLQotICAgIEZUX0ludCAgICAgICAgICAgICByYXN0ZXJpemVyX3ZlcnNpb247ICAgIC8qIE1TIHJhc3Rlcml6ZXIgdmVyc2lvbiAgICAgKi8KLQotICAgIEZUX0Jvb2wgICAgICAgICAgICBpdXBfY2FsbGVkOyAgICAgICAgICAgIC8qIElVUCBjYWxsZWQgZm9yIGdseXBoPyAgICAgKi8KLQotICAgIEZUX1VMb25nICAgICAgICAgICBzcGhfdHdlYWtfZmxhZ3M7ICAgICAgIC8qIGZsYWdzIHRvIGNvbnRyb2wgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoaW50IHR3ZWFrcyAgICAgICAgICAgICAgICovCi0KLSAgICBGVF9VTG9uZyAgICAgICAgICAgc3BoX2luX2Z1bmNfZmxhZ3M7ICAgICAvKiBmbGFncyB0byBpbmRpY2F0ZSBpZiBpbiAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbCBmdW5jdGlvbnMgICAgICAgICAqLwotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0KLSAgfSBUVF9FeGVjQ29udGV4dFJlYzsKLQotCi0gIGV4dGVybiBjb25zdCBUVF9HcmFwaGljc1N0YXRlICB0dF9kZWZhdWx0X2dyYXBoaWNzX3N0YXRlOwotCi0KLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLSAgRlRfTE9DQUwoIHZvaWQgKQotICBUVF9Hb3RvX0NvZGVSYW5nZSggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCi0gICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICAgSVAgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIFRUX1NldF9Db2RlUmFuZ2UoIFRUX0V4ZWNDb250ZXh0ICBleGVjLAotICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICAgcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICBiYXNlLAotICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgICAgbGVuZ3RoICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBUVF9DbGVhcl9Db2RlUmFuZ2UoIFRUX0V4ZWNDb250ZXh0ICBleGVjLAotICAgICAgICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgICByYW5nZSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVXBkYXRlX01heCggRlRfTWVtb3J5ICBtZW1vcnksCi0gICAgICAgICAgICAgIEZUX1VMb25nKiAgc2l6ZSwKLSAgICAgICAgICAgICAgRlRfVUxvbmcgICBtdWx0aXBsaWVyLAotICAgICAgICAgICAgICB2b2lkKiAgICAgIF9wYnVmZiwKLSAgICAgICAgICAgICAgRlRfVUxvbmcgICBuZXdfbWF4ICk7Ci0jZW5kaWYgLyogVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9OZXdfQ29udGV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBRdWVyaWVzIHRoZSBmYWNlIGNvbnRleHQgZm9yIGEgZ2l2ZW4gZm9udC4gIE5vdGUgdGhhdCB0aGVyZSBpcyAgICAgKi8KLSAgLyogICAgbm93IGEgX3NpbmdsZV8gZXhlY3V0aW9uIGNvbnRleHQgaW4gdGhlIFRydWVUeXBlIGRyaXZlciB3aGljaCBpcyAgICovCi0gIC8qICAgIHNoYXJlZCBhbW9uZyBmYWNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIHRoZSBleGVjdXRpb24gY29udGV4dC4gIEluaXRpYWxpemVkIGZvciBgZmFjZScuICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9ubHkgdGhlIGdseXBoIGxvYWRlciBhbmQgZGVidWdnZXIgc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbi4gICAgICAqLwotICAvKiAgICAoQW5kIHJpZ2h0IG5vdyBvbmx5IHRoZSBnbHlwaCBsb2FkZXIgdXNlcyBpdC4pICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0VYUE9SVCggVFRfRXhlY0NvbnRleHQgKQotICBUVF9OZXdfQ29udGV4dCggVFRfRHJpdmVyICBkcml2ZXIgKTsKLQotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgVFRfRG9uZV9Db250ZXh0KCBUVF9FeGVjQ29udGV4dCAgZXhlYyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFRUX0xvYWRfQ29udGV4dCggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCi0gICAgICAgICAgICAgICAgICAgVFRfRmFjZSAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgVFRfU2l6ZSAgICAgICAgIHNpemUgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIFRUX1NhdmVfQ29udGV4dCggVFRfRXhlY0NvbnRleHQgIGV4ZWMsCi0gICAgICAgICAgICAgICAgICAgVFRfU2l6ZSAgICAgICAgIGlucyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFRUX1J1bl9Db250ZXh0KCBUVF9FeGVjQ29udGV4dCAgZXhlYyApOwotI2VuZGlmIC8qIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVFRfUnVuSW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRXhlY3V0ZXMgb25lIG9yIG1vcmUgaW5zdHJ1Y3Rpb24gaW4gdGhlIGV4ZWN1dGlvbiBjb250ZXh0LiAgVGhpcyAgICovCi0gIC8qICAgIGlzIHRoZSBtYWluIGZ1bmN0aW9uIG9mIHRoZSBUcnVlVHlwZSBvcGNvZGUgaW50ZXJwcmV0ZXIuICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGV4ZWMgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBleGVjdXRpb24gY29udGV4dC4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIE9ubHkgdGhlIG9iamVjdCBtYW5hZ2VyIGFuZCBkZWJ1Z2dlciBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVGhpcyBmdW5jdGlvbiBpcyBwdWJsaWNseSBleHBvcnRlZCBiZWNhdXNlIGl0IGlzIGRpcmVjdGx5ICAgICAgICAgICovCi0gIC8qICAgIGludm9rZWQgYnkgdGhlIFRydWVUeXBlIGRlYnVnZ2VyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfRVhQT1JUKCBGVF9FcnJvciApCi0gIFRUX1J1bklucyggVFRfRXhlY0NvbnRleHQgIGV4ZWMgKTsKLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1RUSU5URVJQX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0b2Jqcy5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0b2Jqcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDYwZDZmLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dG9ianMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRvYmpzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE9iamVjdHMgbWFuYWdlciAoYm9keSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0RFQlVHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NGTlRfSAotI2luY2x1ZGUgRlRfVFJVRVRZUEVfRFJJVkVSX0gKLQotI2luY2x1ZGUgInR0Z2xvYWQuaCIKLSNpbmNsdWRlICJ0dHBsb2FkLmgiCi0KLSNpbmNsdWRlICJ0dGVycm9ycy5oIgotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0jaW5jbHVkZSAidHRpbnRlcnAuaCIKLSNlbmRpZgotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1VOUEFURU5URURfSAotI2VuZGlmCi0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0jaW5jbHVkZSAidHRneHZhci5oIgotI2VuZGlmCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdHRvYmpzCi0KLQotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgIEdMWVBIIFpPTkUgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2dseXBoem9uZV9kb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIERlYWxsb2NhdGUgYSBnbHlwaCB6b25lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHpvbmUgOjogQSBwb2ludGVyIHRvIHRoZSB0YXJnZXQgZ2x5cGggem9uZS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdHRfZ2x5cGh6b25lX2RvbmUoIFRUX0dseXBoWm9uZSAgem9uZSApCi0gIHsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHpvbmUtPm1lbW9yeTsKLQotCi0gICAgaWYgKCBtZW1vcnkgKQotICAgIHsKLSAgICAgIEZUX0ZSRUUoIHpvbmUtPmNvbnRvdXJzICk7Ci0gICAgICBGVF9GUkVFKCB6b25lLT50YWdzICk7Ci0gICAgICBGVF9GUkVFKCB6b25lLT5jdXIgKTsKLSAgICAgIEZUX0ZSRUUoIHpvbmUtPm9yZyApOwotICAgICAgRlRfRlJFRSggem9uZS0+b3J1cyApOwotCi0gICAgICB6b25lLT5tYXhfcG9pbnRzICAgPSB6b25lLT5uX3BvaW50cyAgID0gMDsKLSAgICAgIHpvbmUtPm1heF9jb250b3VycyA9IHpvbmUtPm5fY29udG91cnMgPSAwOwotICAgICAgem9uZS0+bWVtb3J5ICAgICAgID0gTlVMTDsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2dseXBoem9uZV9uZXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEFsbG9jYXRlIGEgbmV3IGdseXBoIHpvbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG1lbW9yeSAgICAgIDo6IEEgaGFuZGxlIHRvIHRoZSBjdXJyZW50IG1lbW9yeSBvYmplY3QuICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgbWF4UG9pbnRzICAgOjogVGhlIGNhcGFjaXR5IG9mIGdseXBoIHpvbmUgaW4gcG9pbnRzLiAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBtYXhDb250b3VycyA6OiBUaGUgY2FwYWNpdHkgb2YgZ2x5cGggem9uZSBpbiBjb250b3Vycy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxPdXRwdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB6b25lICAgICAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBnbHlwaCB6b25lIHJlY29yZC4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9nbHlwaHpvbmVfbmV3KCBGVF9NZW1vcnkgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgRlRfVVNob3J0ICAgICBtYXhQb2ludHMsCi0gICAgICAgICAgICAgICAgICAgIEZUX1Nob3J0ICAgICAgbWF4Q29udG91cnMsCi0gICAgICAgICAgICAgICAgICAgIFRUX0dseXBoWm9uZSAgem9uZSApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0KLQotICAgIEZUX01FTV9aRVJPKCB6b25lLCBzaXplb2YgKCAqem9uZSApICk7Ci0gICAgem9uZS0+bWVtb3J5ID0gbWVtb3J5OwotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIHpvbmUtPm9yZywgICAgICBtYXhQb2ludHMgICApIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIHpvbmUtPmN1ciwgICAgICBtYXhQb2ludHMgICApIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIHpvbmUtPm9ydXMsICAgICBtYXhQb2ludHMgICApIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIHpvbmUtPnRhZ3MsICAgICBtYXhQb2ludHMgICApIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIHpvbmUtPmNvbnRvdXJzLCBtYXhDb250b3VycyApICkKLSAgICB7Ci0gICAgICB0dF9nbHlwaHpvbmVfZG9uZSggem9uZSApOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgem9uZS0+bWF4X3BvaW50cyAgID0gbWF4UG9pbnRzOwotICAgICAgem9uZS0+bWF4X2NvbnRvdXJzID0gbWF4Q29udG91cnM7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0jZW5kaWYgLyogVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSICovCi0KLQotICAvKiBDb21wYXJlIHRoZSBmYWNlIHdpdGggYSBsaXN0IG9mIHdlbGwta25vd24gYHRyaWNreScgZm9udHMuICovCi0gIC8qIFRoaXMgbGlzdCBzaGFsbCBiZSBleHBhbmRlZCBhcyB3ZSBmaW5kIG1vcmUgb2YgdGhlbS4gICAgICAgKi8KLQotICBzdGF0aWMgRlRfQm9vbAotICB0dF9jaGVja190cmlja3luZXNzX2ZhbWlseSggRlRfU3RyaW5nKiAgbmFtZSApCi0gIHsKLQotI2RlZmluZSBUUklDS19OQU1FU19NQVhfQ0hBUkFDVEVSUyAgMTkKLSNkZWZpbmUgVFJJQ0tfTkFNRVNfQ09VTlQgICAgICAgICAgICA5Ci0KLSAgICBzdGF0aWMgY29uc3QgY2hhciB0cmlja19uYW1lc1tUUklDS19OQU1FU19DT1VOVF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtUUklDS19OQU1FU19NQVhfQ0hBUkFDVEVSUyArIDFdID0KLSAgICB7Ci0gICAgICAiREZLYWlTaG8tU0IiLCAgICAgICAgLyogZGZrYWlzYi50dGYgKi8KLSAgICAgICJERkthaVNodSIsCi0gICAgICAiREZLYWktU0IiLCAgICAgICAgICAgLyoga2FpdS50dGYgKi8KLSAgICAgICJIdWFUaWFuS2FpVGk/IiwgICAgICAvKiBodGt0Mi50dGYgKi8KLSAgICAgICJIdWFUaWFuU29uZ1RpPyIsICAgICAvKiBodHN0My50dGYgKi8KLSAgICAgICJNaW5nKGZvciBJU08xMDY0NikiLCAvKiBoa3Njc2lpYy50dGYgJiBpaWNvcmUudHRmICovCi0gICAgICAiTWluZ0xpVSIsICAgICAgICAgICAgLyogbWluZ2xpdS50dGYgJiBtaW5nbGl1LnR0YyAqLwotICAgICAgIlBNaW5nTGlVIiwgICAgICAgICAgIC8qIG1pbmdsaXUudHRjICovCi0gICAgICAiTWluZ0xpNDMiLCAgICAgICAgICAgLyogbWluZ2xpLnR0ZiAqLwotICAgIH07Ci0KLSAgICBpbnQgIG5uOwotCi0KLSAgICBmb3IgKCBubiA9IDA7IG5uIDwgVFJJQ0tfTkFNRVNfQ09VTlQ7IG5uKysgKQotICAgICAgaWYgKCBmdF9zdHJzdHIoIG5hbWUsIHRyaWNrX25hbWVzW25uXSApICkKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotCi0gIC8qIFhYWDogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgaW4gdGhlIGBzZm50JyBtb2R1bGUuICovCi0KLSAgLyogU29tZSBQREYgZ2VuZXJhdG9ycyBjbGVhciB0aGUgY2hlY2tzdW1zIGluIHRoZSBUcnVlVHlwZSBoZWFkZXIgdGFibGUuICovCi0gIC8qIEZvciBleGFtcGxlLCBRdWFydHogQ29udGV4dFBERiBjbGVhcnMgYWxsIGVudHJpZXMsIG9yIEJ1bGx6aXAgUERGICAgICAqLwotICAvKiBQcmludGVyIGNsZWFycyB0aGUgZW50cmllcyBmb3Igc3Vic2V0dGVkIHN1YnRhYmxlcy4gIFdlIHRodXMgaGF2ZSB0byAgKi8KLSAgLyogcmVjYWxjdWxhdGUgdGhlIGNoZWNrc3VtcyAgd2hlcmUgbmVjZXNzYXJ5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgc3RhdGljIEZUX1VJbnQzMgotICB0dF9zeW50aF9zZm50X2NoZWNrc3VtKCBGVF9TdHJlYW0gIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcgICBsZW5ndGggKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9VSW50MzIgIGNoZWNrc3VtID0gMDsKLSAgICBGVF9VSW50ICAgIGk7Ci0KLQotICAgIGlmICggRlRfRlJBTUVfRU5URVIoIGxlbmd0aCApICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgZm9yICggOyBsZW5ndGggPiAzOyBsZW5ndGggLT0gNCApCi0gICAgICBjaGVja3N1bSArPSAoRlRfVUludDMyKUZUX0dFVF9VTE9ORygpOwotCi0gICAgZm9yICggaSA9IDM7IGxlbmd0aCA+IDA7IGxlbmd0aC0tLCBpLS0gKQotICAgICAgY2hlY2tzdW0gKz0gKEZUX1VJbnQzMilGVF9HRVRfQllURSgpIDw8ICggaSAqIDggKTsKLQotICAgIEZUX0ZSQU1FX0VYSVQoKTsKLQotICAgIHJldHVybiBjaGVja3N1bTsKLSAgfQotCi0KLSAgLyogWFhYOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBpbiB0aGUgYHNmbnQnIG1vZHVsZS4gKi8KLQotICBzdGF0aWMgRlRfVUxvbmcKLSAgdHRfZ2V0X3NmbnRfY2hlY2tzdW0oIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgaSApCi0gIHsKLSNpZiAwIC8qIGlmIHdlIGJlbGlldmUgdGhlIHdyaXR0ZW4gdmFsdWUsIHVzZSBmb2xsb3dpbmcgcGFydC4gKi8KLSAgICBpZiAoIGZhY2UtPmRpcl90YWJsZXNbaV0uQ2hlY2tTdW0gKQotICAgICAgcmV0dXJuIGZhY2UtPmRpcl90YWJsZXNbaV0uQ2hlY2tTdW07Ci0jZW5kaWYKLQotICAgIGlmICggIWZhY2UtPmdvdG9fdGFibGUgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAoIGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5kaXJfdGFibGVzW2ldLlRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnJvb3Quc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCApICkKLSAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIChGVF9VTG9uZyl0dF9zeW50aF9zZm50X2NoZWNrc3VtKCBmYWNlLT5yb290LnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmRpcl90YWJsZXNbaV0uTGVuZ3RoICk7Ci0gIH0KLQotCi0gIHR5cGVkZWYgc3RydWN0IHR0X3NmbnRfaWRfcmVjXwotICB7Ci0gICAgRlRfVUxvbmcgIENoZWNrU3VtOwotICAgIEZUX1VMb25nICBMZW5ndGg7Ci0KLSAgfSB0dF9zZm50X2lkX3JlYzsKLQotCi0gIHN0YXRpYyBGVF9Cb29sCi0gIHR0X2NoZWNrX3RyaWNreW5lc3Nfc2ZudF9pZHMoIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0jZGVmaW5lIFRSSUNLX1NGTlRfSURTX1BFUl9GQUNFICAgMwotI2RlZmluZSBUUklDS19TRk5UX0lEU19OVU1fRkFDRVMgIDE3Ci0KLSAgICBzdGF0aWMgY29uc3QgdHRfc2ZudF9pZF9yZWMgc2ZudF9pZFtUUklDS19TRk5UX0lEU19OVU1fRkFDRVNdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbVFJJQ0tfU0ZOVF9JRFNfUEVSX0ZBQ0VdID0gewotCi0jZGVmaW5lIFRSSUNLX1NGTlRfSURfY3Z0ICAgMAotI2RlZmluZSBUUklDS19TRk5UX0lEX2ZwZ20gIDEKLSNkZWZpbmUgVFJJQ0tfU0ZOVF9JRF9wcmVwICAyCi0KLSAgICAgIHsgLyogTWluZ0xpVSAxOTk1ICovCi0gICAgICAgIHsgMHgwNUJDRjA1OFVMLCAweDAwMDAwMkU0VUwgfSwgLyogY3Z0ICAqLwotICAgICAgICB7IDB4MjgyMzNCRjFVTCwgMHgwMDAwODdDNFVMIH0sIC8qIGZwZ20gKi8KLSAgICAgICAgeyAweEEzNDRBMUVBVUwsIDB4MDAwMDAxRTFVTCB9ICAvKiBwcmVwICovCi0gICAgICB9LAotICAgICAgeyAvKiBNaW5nTGlVIDE5OTYtICovCi0gICAgICAgIHsgMHgwNUJDRjA1OFVMLCAweDAwMDAwMkU0VUwgfSwgLyogY3Z0ICAqLwotICAgICAgICB7IDB4MjgyMzNCRjFVTCwgMHgwMDAwODdDNFVMIH0sIC8qIGZwZ20gKi8KLSAgICAgICAgeyAweEEzNDRBMUVCVUwsIDB4MDAwMDAxRTFVTCB9ICAvKiBwcmVwICovCi0gICAgICB9LAotICAgICAgeyAvKiBERkthaVNodSAqLwotICAgICAgICB7IDB4MTFFNUVBRDRVTCwgMHgwMDAwMDM1MFVMIH0sIC8qIGN2dCAgKi8KLSAgICAgICAgeyAweDVBMzBDQTNCVUwsIDB4MDAwMDkwNjNVTCB9LCAvKiBmcGdtICovCi0gICAgICAgIHsgMHgxM0E0MjYwMlVMLCAweDAwMDAwMDdFVUwgfSAgLyogcHJlcCAqLwotICAgICAgfSwKLSAgICAgIHsgLyogSHVhVGlhbkthaVRpICovCi0gICAgICAgIHsgMHhGRkZCRkZGQ1VMLCAweDAwMDAwMDA4VUwgfSwgLyogY3Z0ICAqLwotICAgICAgICB7IDB4OUM5RTQ4QjhVTCwgMHgwMDAwQkVBMlVMIH0sIC8qIGZwZ20gKi8KLSAgICAgICAgeyAweDcwMDIwMTEyVUwsIDB4MDAwMDAwMDhVTCB9ICAvKiBwcmVwICovCi0gICAgICB9LAotICAgICAgeyAvKiBIdWFUaWFuU29uZ1RpICovCi0gICAgICAgIHsgMHhGRkZCRkZGQ1VMLCAweDAwMDAwMDA4VUwgfSwgLyogY3Z0ICAqLwotICAgICAgICB7IDB4MEE1QTA0ODNVTCwgMHgwMDAxN0MzOVVMIH0sIC8qIGZwZ20gKi8KLSAgICAgICAgeyAweDcwMDIwMTEyVUwsIDB4MDAwMDAwMDhVTCB9ICAvKiBwcmVwICovCi0gICAgICB9LAotICAgICAgeyAvKiBORUMgZmFkcG9wNy50dGYgKi8KLSAgICAgICAgeyAweDAwMDAwMDAwVUwsIDB4MDAwMDAwMDBVTCB9LCAvKiBjdnQgICovCi0gICAgICAgIHsgMHg0MEM5MjU1NVVMLCAweDAwMDAwMEU1VUwgfSwgLyogZnBnbSAqLwotICAgICAgICB7IDB4QTM5QjU4RTNVTCwgMHgwMDAwMTE3Q1VMIH0gIC8qIHByZXAgKi8KLSAgICAgIH0sCi0gICAgICB7IC8qIE5FQyBmYWRyZWk1LnR0ZiAqLwotICAgICAgICB7IDB4MDAwMDAwMDBVTCwgMHgwMDAwMDAwMFVMIH0sIC8qIGN2dCAgKi8KLSAgICAgICAgeyAweDMzQzQxNjUyVUwsIDB4MDAwMDAwRTVVTCB9LCAvKiBmcGdtICovCi0gICAgICAgIHsgMHgyNkQ2QzUyQVVMLCAweDAwMDAwRjZBVUwgfSAgLyogcHJlcCAqLwotICAgICAgfSwKLSAgICAgIHsgLyogTkVDIGZhbmdvdDcudHRmICovCi0gICAgICAgIHsgMHgwMDAwMDAwMFVMLCAweDAwMDAwMDAwVUwgfSwgLyogY3Z0ICAqLwotICAgICAgICB7IDB4NkRCMTY1MURVTCwgMHgwMDAwMDE5RFVMIH0sIC8qIGZwZ20gKi8KLSAgICAgICAgeyAweDZDNkU0QjAzVUwsIDB4MDAwMDI0OTJVTCB9ICAvKiBwcmVwICovCi0gICAgICB9LAotICAgICAgeyAvKiBORUMgZmFuZ3lvNS50dGYgKi8KLSAgICAgICAgeyAweDAwMDAwMDAwVUwsIDB4MDAwMDAwMDBVTCB9LCAvKiBjdnQgICovCi0gICAgICAgIHsgMHg0MEM5MjU1NVVMLCAweDAwMDAwMEU1VUwgfSwgLyogZnBnbSAqLwotICAgICAgICB7IDB4REU1MUZBRDBVTCwgMHgwMDAwMTE3Q1VMIH0gIC8qIHByZXAgKi8KLSAgICAgIH0sCi0gICAgICB7IC8qIE5FQyBmYW5reW81LnR0ZiAqLwotICAgICAgICB7IDB4MDAwMDAwMDBVTCwgMHgwMDAwMDAwMFVMIH0sIC8qIGN2dCAgKi8KLSAgICAgICAgeyAweDg1RTQ3NjY0VUwsIDB4MDAwMDAwRTVVTCB9LCAvKiBmcGdtICovCi0gICAgICAgIHsgMHhBNkM2MjgzMVVMLCAweDAwMDAxQ0FBVUwgfSAgLyogcHJlcCAqLwotICAgICAgfSwKLSAgICAgIHsgLyogTkVDIGZhbnJnbzUudHRmICovCi0gICAgICAgIHsgMHgwMDAwMDAwMFVMLCAweDAwMDAwMDAwVUwgfSwgLyogY3Z0ICAqLwotICAgICAgICB7IDB4MkQ4OTFDRkRVTCwgMHgwMDAwMDE5RFVMIH0sIC8qIGZwZ20gKi8KLSAgICAgICAgeyAweEEwNjA0NjMzVUwsIDB4MDAwMDFERThVTCB9ICAvKiBwcmVwICovCi0gICAgICB9LAotICAgICAgeyAvKiBORUMgZmFuZ290NS50dGMgKi8KLSAgICAgICAgeyAweDAwMDAwMDAwVUwsIDB4MDAwMDAwMDBVTCB9LCAvKiBjdnQgICovCi0gICAgICAgIHsgMHg0MEFBNzc0Q1VMLCAweDAwMDAwMUNCVUwgfSwgLyogZnBnbSAqLwotICAgICAgICB7IDB4OUI1Q0FBOTZVTCwgMHgwMDAwMUY5QVVMIH0gIC8qIHByZXAgKi8KLSAgICAgIH0sCi0gICAgICB7IC8qIE5FQyBmYW5taW4zLnR0YyAqLwotICAgICAgICB7IDB4MDAwMDAwMDBVTCwgMHgwMDAwMDAwMFVMIH0sIC8qIGN2dCAgKi8KLSAgICAgICAgeyAweDBEM0RFOUNCVUwsIDB4MDAwMDAxNDFVTCB9LCAvKiBmcGdtICovCi0gICAgICAgIHsgMHhENDEyNzc2NlVMLCAweDAwMDAyMjgwVUwgfSAgLyogcHJlcCAqLwotICAgICAgfSwKLSAgICAgIHsgLyogTkVDIEZBLUdvdGhpYywgMTk5NiAqLwotICAgICAgICB7IDB4MDAwMDAwMDBVTCwgMHgwMDAwMDAwMFVMIH0sIC8qIGN2dCAgKi8KLSAgICAgICAgeyAweDRBNjkyNjk4VUwsIDB4MDAwMDAxRjBVTCB9LCAvKiBmcGdtICovCi0gICAgICAgIHsgMHgzNDBENDM0NlVMLCAweDAwMDAxRkNBVUwgfSAgLyogcHJlcCAqLwotICAgICAgfSwKLSAgICAgIHsgLyogTkVDIEZBLU1pbmNob3UsIDE5OTYgKi8KLSAgICAgICAgeyAweDAwMDAwMDAwVUwsIDB4MDAwMDAwMDBVTCB9LCAvKiBjdnQgICovCi0gICAgICAgIHsgMHhDRDM0QzYwNFVMLCAweDAwMDAwMTY2VUwgfSwgLyogZnBnbSAqLwotICAgICAgICB7IDB4NkNGMzEwNDZVTCwgMHgwMDAwMjJCMFVMIH0gIC8qIHByZXAgKi8KLSAgICAgIH0sCi0gICAgICB7IC8qIE5FQyBGQS1Sb3VuZEdvdGhpY0IsIDE5OTYgKi8KLSAgICAgICAgeyAweDAwMDAwMDAwVUwsIDB4MDAwMDAwMDBVTCB9LCAvKiBjdnQgICovCi0gICAgICAgIHsgMHg1REE3NTMxNVVMLCAweDAwMDAwMTlEVUwgfSwgLyogZnBnbSAqLwotICAgICAgICB7IDB4NDA3NDVBNUZVTCwgMHgwMDAwMjJFMFVMIH0gIC8qIHByZXAgKi8KLSAgICAgIH0sCi0gICAgICB7IC8qIE5FQyBGQS1Sb3VuZEdvdGhpY00sIDE5OTYgKi8KLSAgICAgICAgeyAweDAwMDAwMDAwVUwsIDB4MDAwMDAwMDBVTCB9LCAvKiBjdnQgICovCi0gICAgICAgIHsgMHhGMDU1RkM0OFVMLCAweDAwMDAwMUMyVUwgfSwgLyogZnBnbSAqLwotICAgICAgICB7IDB4MzkwMERFRDNVTCwgMHgwMDAwMUUxOFVMIH0gIC8qIHByZXAgKi8KLSAgICAgIH0KLSAgICB9OwotCi0gICAgRlRfVUxvbmcgICBjaGVja3N1bTsKLSAgICBpbnQgICAgICAgIG51bV9tYXRjaGVkX2lkc1tUUklDS19TRk5UX0lEU19OVU1fRkFDRVNdOwotICAgIEZUX0Jvb2wgICAgaGFzX2N2dCwgaGFzX2ZwZ20sIGhhc19wcmVwOwotICAgIEZUX1VTaG9ydCAgaTsKLSAgICBpbnQgICAgICAgIGosIGs7Ci0KLQotICAgIEZUX01FTV9TRVQoIG51bV9tYXRjaGVkX2lkcywgMCwKLSAgICAgICAgICAgICAgICBzaXplb2YgKCBpbnQgKSAqIFRSSUNLX1NGTlRfSURTX05VTV9GQUNFUyApOwotICAgIGhhc19jdnQgID0gRkFMU0U7Ci0gICAgaGFzX2ZwZ20gPSBGQUxTRTsKLSAgICBoYXNfcHJlcCA9IEZBTFNFOwotCi0gICAgZm9yICggaSA9IDA7IGkgPCBmYWNlLT5udW1fdGFibGVzOyBpKysgKQotICAgIHsKLSAgICAgIGNoZWNrc3VtID0gMDsKLQotICAgICAgc3dpdGNoKCBmYWNlLT5kaXJfdGFibGVzW2ldLlRhZyApCi0gICAgICB7Ci0gICAgICBjYXNlIFRUQUdfY3Z0OgotICAgICAgICBrID0gVFJJQ0tfU0ZOVF9JRF9jdnQ7Ci0gICAgICAgIGhhc19jdnQgID0gVFJVRTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgVFRBR19mcGdtOgotICAgICAgICBrID0gVFJJQ0tfU0ZOVF9JRF9mcGdtOwotICAgICAgICBoYXNfZnBnbSA9IFRSVUU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIFRUQUdfcHJlcDoKLSAgICAgICAgayA9IFRSSUNLX1NGTlRfSURfcHJlcDsKLSAgICAgICAgaGFzX3ByZXAgPSBUUlVFOwotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoIGogPSAwOyBqIDwgVFJJQ0tfU0ZOVF9JRFNfTlVNX0ZBQ0VTOyBqKysgKQotICAgICAgICBpZiAoIGZhY2UtPmRpcl90YWJsZXNbaV0uTGVuZ3RoID09IHNmbnRfaWRbal1ba10uTGVuZ3RoICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggIWNoZWNrc3VtICkKLSAgICAgICAgICAgIGNoZWNrc3VtID0gdHRfZ2V0X3NmbnRfY2hlY2tzdW0oIGZhY2UsIGkgKTsKLQotICAgICAgICAgIGlmICggc2ZudF9pZFtqXVtrXS5DaGVja1N1bSA9PSBjaGVja3N1bSApCi0gICAgICAgICAgICBudW1fbWF0Y2hlZF9pZHNbal0rKzsKLQotICAgICAgICAgIGlmICggbnVtX21hdGNoZWRfaWRzW2pdID09IFRSSUNLX1NGTlRfSURTX1BFUl9GQUNFICkKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yICggaiA9IDA7IGogPCBUUklDS19TRk5UX0lEU19OVU1fRkFDRVM7IGorKyApCi0gICAgewotICAgICAgaWYgKCAhaGFzX2N2dCAgJiYgIXNmbnRfaWRbal1bVFJJQ0tfU0ZOVF9JRF9jdnRdLkxlbmd0aCApCi0gICAgICAgIG51bV9tYXRjaGVkX2lkc1tqXSArKzsKLSAgICAgIGlmICggIWhhc19mcGdtICYmICFzZm50X2lkW2pdW1RSSUNLX1NGTlRfSURfZnBnbV0uTGVuZ3RoICkKLSAgICAgICAgbnVtX21hdGNoZWRfaWRzW2pdICsrOwotICAgICAgaWYgKCAhaGFzX3ByZXAgJiYgIXNmbnRfaWRbal1bVFJJQ0tfU0ZOVF9JRF9wcmVwXS5MZW5ndGggKQotICAgICAgICBudW1fbWF0Y2hlZF9pZHNbal0gKys7Ci0gICAgICBpZiAoIG51bV9tYXRjaGVkX2lkc1tqXSA9PSBUUklDS19TRk5UX0lEU19QRVJfRkFDRSApCi0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Jvb2wKLSAgdHRfY2hlY2tfdHJpY2t5bmVzcyggRlRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIC8qIEZvciBmaXJzdCwgY2hlY2sgdGhlIGZhY2UgbmFtZSBmb3IgcXVpY2sgY2hlY2suICovCi0gICAgaWYgKCBmYWNlLT5mYW1pbHlfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgdHRfY2hlY2tfdHJpY2t5bmVzc19mYW1pbHkoIGZhY2UtPmZhbWlseV9uYW1lICkgKQotICAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICAvKiBUeXBlNDIgZm9udHMgbWF5IGxhY2sgYG5hbWUnIHRhYmxlcywgd2UgdGh1cyB0cnkgdG8gaWRlbnRpZnkgKi8KLSAgICAvKiB0cmlja3kgZm9udHMgYnkgY2hlY2tpbmcgdGhlIGNoZWNrc3VtcyBvZiBUeXBlNDItcGVyc2lzdGVudCAgKi8KLSAgICAvKiBzZm50IHRhYmxlcyAoYGN2dCcsIGBmcGdtJywgYW5kIGBwcmVwJykuICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIHR0X2NoZWNrX3RyaWNreW5lc3Nfc2ZudF9pZHMoIChUVF9GYWNlKWZhY2UgKSApCi0gICAgICByZXR1cm4gVFJVRTsKLQotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0KLSAgLyogQ2hlY2sgd2hldGhlciBgLm5vdGRlZicgaXMgdGhlIG9ubHkgZ2x5cGggaW4gdGhlIGBsb2NhJyB0YWJsZS4gKi8KLSAgc3RhdGljIEZUX0Jvb2wKLSAgdHRfY2hlY2tfc2luZ2xlX25vdGRlZiggRlRfRmFjZSAgdHRmYWNlICkKLSAgewotICAgIEZUX0Jvb2wgICByZXN1bHQgPSBGQUxTRTsKLQotICAgIFRUX0ZhY2UgICBmYWNlID0gKFRUX0ZhY2UpdHRmYWNlOwotICAgIEZUX1VJbnQgICBhc2l6ZTsKLSAgICBGVF9VTG9uZyAgaTsKLSAgICBGVF9VTG9uZyAgZ2x5cGhfaW5kZXggPSAwOwotICAgIEZUX1VJbnQgICBjb3VudCAgICAgICA9IDA7Ci0KLQotICAgIGZvciggaSA9IDA7IGkgPCBmYWNlLT5udW1fbG9jYXRpb25zOyBpKysgKQotICAgIHsKLSAgICAgIHR0X2ZhY2VfZ2V0X2xvY2F0aW9uKCBmYWNlLCBpLCAmYXNpemUgKTsKLSAgICAgIGlmICggYXNpemUgPiAwICkKLSAgICAgIHsKLSAgICAgICAgY291bnQgKz0gMTsKLSAgICAgICAgaWYgKCBjb3VudCA+IDEgKQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBnbHlwaF9pbmRleCA9IGk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogT25seSBoYXZlIGEgc2luZ2xlIG91dGxpbmUuICovCi0gICAgaWYgKCBjb3VudCA9PSAxICkKLSAgICB7Ci0gICAgICBpZiAoIGdseXBoX2luZGV4ID09IDAgKQotICAgICAgICByZXN1bHQgPSBUUlVFOwotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvKiBGSVhNRTogTmVlZCB0byB0ZXN0IGdseXBobmFtZSA9PSAubm90ZGVmID8gKi8KLSAgICAgICAgRlRfRXJyb3IgZXJyb3I7Ci0gICAgICAgIGNoYXIgYnVmWzhdOwotCi0KLSAgICAgICAgZXJyb3IgPSBGVF9HZXRfR2x5cGhfTmFtZSggdHRmYWNlLCBnbHlwaF9pbmRleCwgYnVmLCA4ICk7Ci0gICAgICAgIGlmICggIWVycm9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgIGJ1ZlswXSA9PSAnLicgJiYgIWZ0X3N0cm5jbXAoIGJ1ZiwgIi5ub3RkZWYiLCA4ICkgKQotICAgICAgICAgIHJlc3VsdCA9IFRSVUU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9pbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5pdGlhbGl6ZSBhIGdpdmVuIFRydWVUeXBlIGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtICAgICA6OiBUaGUgc291cmNlIGZvbnQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlX2luZGV4IDo6IFRoZSBpbmRleCBvZiB0aGUgVHJ1ZVR5cGUgZm9udCwgaWYgd2UgYXJlIG9wZW5pbmcgYSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLCBpbiBiaXRzIDAtMTUuICBUaGUgbnVtYmVyZWQgaW5zdGFuY2UgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgaW5kZXh+K34xIG9mIGEgR1ggKHN1Yilmb250LCBpZiBhcHBsaWNhYmxlLCBpbiBiaXRzICAqLwotICAvKiAgICAgICAgICAgICAgICAgIDE2LTMwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIG51bV9wYXJhbXMgOjogTnVtYmVyIG9mIGFkZGl0aW9uYWwgZ2VuZXJpYyBwYXJhbWV0ZXJzLiAgSWdub3JlZC4gICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcGFyYW1zICAgICA6OiBBZGRpdGlvbmFsIGdlbmVyaWMgcGFyYW1ldGVycy4gIElnbm9yZWQuICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICA6OiBUaGUgbmV3bHkgYnVpbHQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9pbml0KCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgdHRmYWNlLCAgICAgIC8qIFRUX0ZhY2UgKi8KLSAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICkKLSAgewotICAgIEZUX0Vycm9yICAgICAgZXJyb3I7Ci0gICAgRlRfTGlicmFyeSAgICBsaWJyYXJ5OwotICAgIFNGTlRfU2VydmljZSAgc2ZudDsKLSAgICBUVF9GYWNlICAgICAgIGZhY2UgPSAoVFRfRmFjZSl0dGZhY2U7Ci0KLQotICAgIEZUX1RSQUNFMigoICJUVEYgZHJpdmVyXG4iICkpOwotCi0gICAgbGlicmFyeSA9IHR0ZmFjZS0+ZHJpdmVyLT5yb290LmxpYnJhcnk7Ci0KLSAgICBzZm50ID0gKFNGTlRfU2VydmljZSlGVF9HZXRfTW9kdWxlX0ludGVyZmFjZSggbGlicmFyeSwgInNmbnQiICk7Ci0gICAgaWYgKCAhc2ZudCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAidHRfZmFjZV9pbml0OiBjYW5ub3QgYWNjZXNzIGBzZm50JyBtb2R1bGVcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBNaXNzaW5nX01vZHVsZSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIGNyZWF0ZSBpbnB1dCBzdHJlYW0gZnJvbSByZXNvdXJjZSAqLwotICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIDAgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBjaGVjayB0aGF0IHdlIGhhdmUgYSB2YWxpZCBUcnVlVHlwZSBmaWxlICovCi0gICAgZXJyb3IgPSBzZm50LT5pbml0X2ZhY2UoIHN0cmVhbSwgZmFjZSwgZmFjZV9pbmRleCwgbnVtX3BhcmFtcywgcGFyYW1zICk7Ci0KLSAgICAvKiBTdHJlYW0gbWF5IGhhdmUgY2hhbmdlZC4gKi8KLSAgICBzdHJlYW0gPSBmYWNlLT5yb290LnN0cmVhbTsKLQotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogV2UgbXVzdCBhbHNvIGJlIGFibGUgdG8gYWNjZXB0IE1hYy9HWCBmb250cywgYXMgd2VsbCBhcyBPVCBvbmVzLiAqLwotICAgIC8qIFRoZSAweDAwMDIwMDAwIHRhZyBpcyBjb21wbGV0ZWx5IHVuZG9jdW1lbnRlZDsgc29tZSBmb250cyBmcm9tICAgKi8KLSAgICAvKiBBcnBoaWMgbWFkZSBmb3IgQ2hpbmVzZSBXaW5kb3dzIDMuMSBoYXZlIHRoaXMuICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBmYWNlLT5mb3JtYXRfdGFnICE9IDB4MDAwMTAwMDBMICYmICAgIC8qIE1TIGZvbnRzICAqLwotICAgICAgICAgZmFjZS0+Zm9ybWF0X3RhZyAhPSAweDAwMDIwMDAwTCAmJiAgICAvKiBDSksgZm9udHMgZm9yIFdpbiAzLjEgKi8KLSAgICAgICAgIGZhY2UtPmZvcm1hdF90YWcgIT0gVFRBR190cnVlICAgKSAgICAgLyogTWFjIGZvbnRzICovCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggIiAgbm90IGEgVFRGIGZvbnRcbiIgKSk7Ci0gICAgICBnb3RvIEJhZF9Gb3JtYXQ7Ci0gICAgfQotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0gICAgdHRmYWNlLT5mYWNlX2ZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19ISU5URVI7Ci0jZW5kaWYKLQotICAgIC8qIElmIHdlIGFyZSBwZXJmb3JtaW5nIGEgc2ltcGxlIGZvbnQgZm9ybWF0IGNoZWNrLCBleGl0IGltbWVkaWF0ZWx5LiAqLwotICAgIGlmICggZmFjZV9pbmRleCA8IDAgKQotICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLQotICAgIC8qIExvYWQgZm9udCBkaXJlY3RvcnkgKi8KLSAgICBlcnJvciA9IHNmbnQtPmxvYWRfZmFjZSggc3RyZWFtLCBmYWNlLCBmYWNlX2luZGV4LCBudW1fcGFyYW1zLCBwYXJhbXMgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggdHRfY2hlY2tfdHJpY2t5bmVzcyggdHRmYWNlICkgKQotICAgICAgdHRmYWNlLT5mYWNlX2ZsYWdzIHw9IEZUX0ZBQ0VfRkxBR19UUklDS1k7Ci0KLSAgICBlcnJvciA9IHR0X2ZhY2VfbG9hZF9oZG14KCBmYWNlLCBzdHJlYW0gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggRlRfSVNfU0NBTEFCTEUoIHR0ZmFjZSApICkKLSAgICB7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0KLSAgICAgIGlmICggIXR0ZmFjZS0+aW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSApCi0gICAgICAgIGVycm9yID0gdHRfZmFjZV9sb2FkX2xvY2EoIGZhY2UsIHN0cmVhbSApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICBlcnJvciA9IHR0X2ZhY2VfbG9hZF9jdnQoIGZhY2UsIHN0cmVhbSApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICBlcnJvciA9IHR0X2ZhY2VfbG9hZF9mcGdtKCBmYWNlLCBzdHJlYW0gKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgZXJyb3IgPSB0dF9mYWNlX2xvYWRfcHJlcCggZmFjZSwgc3RyZWFtICk7Ci0KLSAgICAgIC8qIENoZWNrIHRoZSBzY2FsYWJsZSBmbGFnIGJhc2VkIG9uIGBsb2NhJy4gKi8KLSAgICAgIGlmICggIXR0ZmFjZS0+aW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZSAmJgotICAgICAgICAgICB0dGZhY2UtPm51bV9maXhlZF9zaXplcyAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgIGZhY2UtPmdseXBoX2xvY2F0aW9ucyAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgdHRfY2hlY2tfc2luZ2xlX25vdGRlZiggdHRmYWNlICkgICAgICAgICApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFNSgoICJ0dF9mYWNlX2luaXQ6IgotICAgICAgICAgICAgICAgICAgICAiIE9ubHkgdGhlIGAubm90ZGVmJyBnbHlwaCBoYXMgYW4gb3V0bGluZS5cbiIKLSAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAiCi0gICAgICAgICAgICAgICAgICAgICIgUmVzZXR0aW5nIHNjYWxhYmxlIGZsYWcgdG8gRkFMU0UuXG4iICkpOwotCi0gICAgICAgIHR0ZmFjZS0+ZmFjZV9mbGFncyAmPSB+RlRfRkFDRV9GTEFHX1NDQUxBQkxFOwotICAgICAgfQotCi0jZWxzZSAvKiAhRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCAqLwotCi0gICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIGVycm9yID0gdHRfZmFjZV9sb2FkX2xvY2EoIGZhY2UsIHN0cmVhbSApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICBlcnJvciA9IHR0X2ZhY2VfbG9hZF9jdnQoIGZhY2UsIHN0cmVhbSApOwotICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICBlcnJvciA9IHR0X2ZhY2VfbG9hZF9mcGdtKCBmYWNlLCBzdHJlYW0gKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgZXJyb3IgPSB0dF9mYWNlX2xvYWRfcHJlcCggZmFjZSwgc3RyZWFtICk7Ci0KLSAgICAgIC8qIENoZWNrIHRoZSBzY2FsYWJsZSBmbGFnIGJhc2VkIG9uIGBsb2NhJy4gKi8KLSAgICAgIGlmICggdHRmYWNlLT5udW1fZml4ZWRfc2l6ZXMgICAgICAgICAgJiYKLSAgICAgICAgICAgZmFjZS0+Z2x5cGhfbG9jYXRpb25zICAgICAgICAgICAgJiYKLSAgICAgICAgICAgdHRfY2hlY2tfc2luZ2xlX25vdGRlZiggdHRmYWNlICkgKQotICAgICAgewotICAgICAgICBGVF9UUkFDRTUoKCAidHRfZmFjZV9pbml0OiIKLSAgICAgICAgICAgICAgICAgICAgIiBPbmx5IHRoZSBgLm5vdGRlZicgZ2x5cGggaGFzIGFuIG91dGxpbmUuXG4iCi0gICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIgotICAgICAgICAgICAgICAgICAgICAiIFJlc2V0dGluZyBzY2FsYWJsZSBmbGFnIHRvIEZBTFNFLlxuIiApKTsKLQotICAgICAgICB0dGZhY2UtPmZhY2VfZmxhZ3MgJj0gfkZUX0ZBQ0VfRkxBR19TQ0FMQUJMRTsKLSAgICAgIH0KLQotI2VuZGlmIC8qICFGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMICovCi0KLSAgICB9Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0KLSAgICB7Ci0gICAgICBGVF9JbnQgIGluc3RhbmNlX2luZGV4ID0gZmFjZV9pbmRleCA+PiAxNjsKLQotCi0gICAgICBpZiAoIEZUX0hBU19NVUxUSVBMRV9NQVNURVJTKCB0dGZhY2UgKSAmJgotICAgICAgICAgICBpbnN0YW5jZV9pbmRleCA+IDAgICAgICAgICAgICAgICAgKQotICAgICAgewotICAgICAgICBlcnJvciA9IFRUX0dldF9NTV9WYXIoIGZhY2UsIE5VTEwgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGlmICggZmFjZS0+YmxlbmQtPm1tdmFyLT5uYW1lZHN0eWxlICkKLSAgICAgICAgewotICAgICAgICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gdHRmYWNlLT5tZW1vcnk7Ci0KLSAgICAgICAgICBGVF9WYXJfTmFtZWRfU3R5bGUqICBuYW1lZF9zdHlsZTsKLSAgICAgICAgICBGVF9TdHJpbmcqICAgICAgICAgICBzdHlsZV9uYW1lOwotCi0KLSAgICAgICAgICAvKiBpbiBgZmFjZV9pbmRleCcsIHRoZSBpbnN0YW5jZSBpbmRleCBzdGFydHMgd2l0aCB2YWx1ZSAxICovCi0gICAgICAgICAgbmFtZWRfc3R5bGUgPSBmYWNlLT5ibGVuZC0+bW12YXItPm5hbWVkc3R5bGUgKyBpbnN0YW5jZV9pbmRleCAtIDE7Ci0gICAgICAgICAgZXJyb3IgPSBzZm50LT5nZXRfbmFtZSggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfVVNob3J0KW5hbWVkX3N0eWxlLT5zdHJpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3R5bGVfbmFtZSApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgICAgLyogc2V0IHN0eWxlIG5hbWU7IGlmIGFscmVhZHkgc2V0LCByZXBsYWNlIGl0ICovCi0gICAgICAgICAgaWYgKCBmYWNlLT5yb290LnN0eWxlX25hbWUgKQotICAgICAgICAgICAgRlRfRlJFRSggZmFjZS0+cm9vdC5zdHlsZV9uYW1lICk7Ci0gICAgICAgICAgZmFjZS0+cm9vdC5zdHlsZV9uYW1lID0gc3R5bGVfbmFtZTsKLQotICAgICAgICAgIC8qIGZpbmFsbHksIHNlbGVjdCB0aGUgbmFtZWQgaW5zdGFuY2UgKi8KLSAgICAgICAgICBlcnJvciA9IFRUX1NldF9WYXJfRGVzaWduKCBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPmJsZW5kLT5tbXZhci0+bnVtX2F4aXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWRfc3R5bGUtPmNvb3JkcyApOwotICAgICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVCAqLwotCi0jaWYgZGVmaW5lZCggVFRfQ09ORklHX09QVElPTl9VTlBBVEVOVEVEX0hJTlRJTkcgICAgKSAmJiBcCi0gICAgIWRlZmluZWQoIFRUX0NPTkZJR19PUFRJT05fQllURUNPREVfSU5URVJQUkVURVIgKQotCi0gICAgewotICAgICAgRlRfQm9vbCAgdW5wYXRlbnRlZF9oaW50aW5nOwotICAgICAgaW50ICAgICAgaTsKLQotCi0gICAgICAvKiBEZXRlcm1pbmUgd2hldGhlciB1bnBhdGVudGVkIGhpbnRpbmcgaXMgdG8gYmUgdXNlZCBmb3IgdGhpcyBmYWNlLiAqLwotICAgICAgdW5wYXRlbnRlZF9oaW50aW5nID0gRlRfQk9PTAotICAgICAgICAoIGxpYnJhcnktPmRlYnVnX2hvb2tzW0ZUX0RFQlVHX0hPT0tfVU5QQVRFTlRFRF9ISU5USU5HXSAhPSBOVUxMICk7Ci0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX3BhcmFtcyAmJiAhZmFjZS0+dW5wYXRlbnRlZF9oaW50aW5nOyBpKysgKQotICAgICAgICBpZiAoIHBhcmFtc1tpXS50YWcgPT0gRlRfUEFSQU1fVEFHX1VOUEFURU5URURfSElOVElORyApCi0gICAgICAgICAgdW5wYXRlbnRlZF9oaW50aW5nID0gVFJVRTsKLQotICAgICAgaWYgKCAhdW5wYXRlbnRlZF9oaW50aW5nICkKLSAgICAgICAgdHRmYWNlLT5pbnRlcm5hbC0+aWdub3JlX3VucGF0ZW50ZWRfaGludGVyID0gVFJVRTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBUVF9DT05GSUdfT1BUSU9OX1VOUEFURU5URURfSElOVElORyAmJgotICAgICAgICAgICFUVF9DT05GSUdfT1BUSU9OX0JZVEVDT0RFX0lOVEVSUFJFVEVSICovCi0KLSAgICAvKiBpbml0aWFsaXplIHN0YW5kYXJkIGdseXBoIGxvYWRpbmcgcm91dGluZXMgKi8KLSAgICBUVF9Jbml0X0dseXBoX0xvYWRpbmcoIGZhY2UgKTsKLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLQotICBCYWRfRm9ybWF0OgotICAgIGVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICBnb3RvIEV4aXQ7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfZG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmFsaXplIGEgZ2l2ZW4gZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSBwb2ludGVyIHRvIHRoZSBmYWNlIG9iamVjdCB0byBkZXN0cm95LiAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdHRfZmFjZV9kb25lKCBGVF9GYWNlICB0dGZhY2UgKSAgICAgICAgICAgLyogVFRfRmFjZSAqLwotICB7Ci0gICAgVFRfRmFjZSAgICAgICBmYWNlID0gKFRUX0ZhY2UpdHRmYWNlOwotICAgIEZUX01lbW9yeSAgICAgbWVtb3J5OwotICAgIEZUX1N0cmVhbSAgICAgc3RyZWFtOwotICAgIFNGTlRfU2VydmljZSAgc2ZudDsKLQotCi0gICAgaWYgKCAhZmFjZSApCi0gICAgICByZXR1cm47Ci0KLSAgICBtZW1vcnkgPSB0dGZhY2UtPm1lbW9yeTsKLSAgICBzdHJlYW0gPSB0dGZhY2UtPnN0cmVhbTsKLSAgICBzZm50ICAgPSAoU0ZOVF9TZXJ2aWNlKWZhY2UtPnNmbnQ7Ci0KLSAgICAvKiBmb3IgYGV4dGVuZGVkIFRydWVUeXBlIGZvcm1hdHMnIChpLmUuIGNvbXByZXNzZWQgdmVyc2lvbnMpICovCi0gICAgaWYgKCBmYWNlLT5leHRyYS5maW5hbGl6ZXIgKQotICAgICAgZmFjZS0+ZXh0cmEuZmluYWxpemVyKCBmYWNlLT5leHRyYS5kYXRhICk7Ci0KLSAgICBpZiAoIHNmbnQgKQotICAgICAgc2ZudC0+ZG9uZV9mYWNlKCBmYWNlICk7Ci0KLSAgICAvKiBmcmVlaW5nIHRoZSBsb2NhdGlvbnMgdGFibGUgKi8KLSAgICB0dF9mYWNlX2RvbmVfbG9jYSggZmFjZSApOwotCi0gICAgdHRfZmFjZV9mcmVlX2hkbXgoIGZhY2UgKTsKLQotICAgIC8qIGZyZWVpbmcgdGhlIENWVCAqLwotICAgIEZUX0ZSRUUoIGZhY2UtPmN2dCApOwotICAgIGZhY2UtPmN2dF9zaXplID0gMDsKLQotICAgIC8qIGZyZWVpbmcgdGhlIHByb2dyYW1zICovCi0gICAgRlRfRlJBTUVfUkVMRUFTRSggZmFjZS0+Zm9udF9wcm9ncmFtICk7Ci0gICAgRlRfRlJBTUVfUkVMRUFTRSggZmFjZS0+Y3Z0X3Byb2dyYW0gKTsKLSAgICBmYWNlLT5mb250X3Byb2dyYW1fc2l6ZSA9IDA7Ci0gICAgZmFjZS0+Y3Z0X3Byb2dyYW1fc2l6ZSAgPSAwOwotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotICAgIHR0X2RvbmVfYmxlbmQoIG1lbW9yeSwgZmFjZS0+YmxlbmQgKTsKLSAgICBmYWNlLT5ibGVuZCA9IE5VTEw7Ci0jZW5kaWYKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWkUgIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfc2l6ZV9ydW5fZnBnbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgUnVuIHRoZSBmb250IHByb2dyYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNpemUgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwZWRhbnRpYyA6OiBTZXQgaWYgYnl0ZWNvZGUgZXhlY3V0aW9uIHNob3VsZCBiZSBwZWRhbnRpYy4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9zaXplX3J1bl9mcGdtKCBUVF9TaXplICBzaXplLAotICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICBwZWRhbnRpYyApCi0gIHsKLSAgICBUVF9GYWNlICAgICAgICAgZmFjZSA9IChUVF9GYWNlKXNpemUtPnJvb3QuZmFjZTsKLSAgICBUVF9FeGVjQ29udGV4dCAgZXhlYzsKLSAgICBGVF9FcnJvciAgICAgICAgZXJyb3I7Ci0KLQotICAgIGV4ZWMgPSBzaXplLT5jb250ZXh0OwotCi0gICAgZXJyb3IgPSBUVF9Mb2FkX0NvbnRleHQoIGV4ZWMsIGZhY2UsIHNpemUgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHJldHVybiBlcnJvcjsKLQotICAgIGV4ZWMtPmNhbGxUb3AgPSAwOwotICAgIGV4ZWMtPnRvcCAgICAgPSAwOwotCi0gICAgZXhlYy0+cGVyaW9kICAgID0gNjQ7Ci0gICAgZXhlYy0+cGhhc2UgICAgID0gMDsKLSAgICBleGVjLT50aHJlc2hvbGQgPSAwOwotCi0gICAgZXhlYy0+aW5zdHJ1Y3Rpb25fdHJhcCA9IEZBTFNFOwotICAgIGV4ZWMtPkZfZG90X1AgICAgICAgICAgPSAweDQwMDBMOwotCi0gICAgZXhlYy0+cGVkYW50aWNfaGludGluZyA9IHBlZGFudGljOwotCi0gICAgewotICAgICAgRlRfU2l6ZV9NZXRyaWNzKiAgbWV0cmljcyAgICA9ICZleGVjLT5tZXRyaWNzOwotICAgICAgVFRfU2l6ZV9NZXRyaWNzKiAgdHRfbWV0cmljcyA9ICZleGVjLT50dF9tZXRyaWNzOwotCi0KLSAgICAgIG1ldHJpY3MtPnhfcHBlbSAgID0gMDsKLSAgICAgIG1ldHJpY3MtPnlfcHBlbSAgID0gMDsKLSAgICAgIG1ldHJpY3MtPnhfc2NhbGUgID0gMDsKLSAgICAgIG1ldHJpY3MtPnlfc2NhbGUgID0gMDsKLQotICAgICAgdHRfbWV0cmljcy0+cHBlbSAgPSAwOwotICAgICAgdHRfbWV0cmljcy0+c2NhbGUgPSAwOwotICAgICAgdHRfbWV0cmljcy0+cmF0aW8gPSAweDEwMDAwTDsKLSAgICB9Ci0KLSAgICAvKiBhbGxvdyBmb250IHByb2dyYW0gZXhlY3V0aW9uICovCi0gICAgVFRfU2V0X0NvZGVSYW5nZSggZXhlYywKLSAgICAgICAgICAgICAgICAgICAgICB0dF9jb2RlcmFuZ2VfZm9udCwKLSAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5mb250X3Byb2dyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpZmFjZS0+Zm9udF9wcm9ncmFtX3NpemUgKTsKLQotICAgIC8qIGRpc2FibGUgQ1ZUIGFuZCBnbHlwaCBwcm9ncmFtcyBjb2RlcmFuZ2UgKi8KLSAgICBUVF9DbGVhcl9Db2RlUmFuZ2UoIGV4ZWMsIHR0X2NvZGVyYW5nZV9jdnQgKTsKLSAgICBUVF9DbGVhcl9Db2RlUmFuZ2UoIGV4ZWMsIHR0X2NvZGVyYW5nZV9nbHlwaCApOwotCi0gICAgaWYgKCBmYWNlLT5mb250X3Byb2dyYW1fc2l6ZSA+IDAgKQotICAgIHsKLSAgICAgIFRUX0dvdG9fQ29kZVJhbmdlKCBleGVjLCB0dF9jb2RlcmFuZ2VfZm9udCwgMCApOwotCi0gICAgICBGVF9UUkFDRTQoKCAiRXhlY3V0aW5nIGBmcGdtJyB0YWJsZS5cbiIgKSk7Ci0gICAgICBlcnJvciA9IGZhY2UtPmludGVycHJldGVyKCBleGVjICk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0gICAgc2l6ZS0+Ynl0ZWNvZGVfcmVhZHkgPSBlcnJvcjsKLQotICAgIGlmICggIWVycm9yICkKLSAgICAgIFRUX1NhdmVfQ29udGV4dCggZXhlYywgc2l6ZSApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9zaXplX3J1bl9wcmVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBSdW4gdGhlIGNvbnRyb2wgdmFsdWUgcHJvZ3JhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplICAgICA6OiBBIGhhbmRsZSB0byB0aGUgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBlZGFudGljIDo6IFNldCBpZiBieXRlY29kZSBleGVjdXRpb24gc2hvdWxkIGJlIHBlZGFudGljLiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X3NpemVfcnVuX3ByZXAoIFRUX1NpemUgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgIHBlZGFudGljICkKLSAgewotICAgIFRUX0ZhY2UgICAgICAgICBmYWNlID0gKFRUX0ZhY2Upc2l6ZS0+cm9vdC5mYWNlOwotICAgIFRUX0V4ZWNDb250ZXh0ICBleGVjOwotICAgIEZUX0Vycm9yICAgICAgICBlcnJvcjsKLQotCi0gICAgZXhlYyA9IHNpemUtPmNvbnRleHQ7Ci0KLSAgICBlcnJvciA9IFRUX0xvYWRfQ29udGV4dCggZXhlYywgZmFjZSwgc2l6ZSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgZXhlYy0+Y2FsbFRvcCA9IDA7Ci0gICAgZXhlYy0+dG9wICAgICA9IDA7Ci0KLSAgICBleGVjLT5pbnN0cnVjdGlvbl90cmFwID0gRkFMU0U7Ci0KLSAgICBleGVjLT5wZWRhbnRpY19oaW50aW5nID0gcGVkYW50aWM7Ci0KLSAgICBUVF9TZXRfQ29kZVJhbmdlKCBleGVjLAotICAgICAgICAgICAgICAgICAgICAgIHR0X2NvZGVyYW5nZV9jdnQsCi0gICAgICAgICAgICAgICAgICAgICAgZmFjZS0+Y3Z0X3Byb2dyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgKEZUX0xvbmcpZmFjZS0+Y3Z0X3Byb2dyYW1fc2l6ZSApOwotCi0gICAgVFRfQ2xlYXJfQ29kZVJhbmdlKCBleGVjLCB0dF9jb2RlcmFuZ2VfZ2x5cGggKTsKLQotICAgIGlmICggZmFjZS0+Y3Z0X3Byb2dyYW1fc2l6ZSA+IDAgKQotICAgIHsKLSAgICAgIFRUX0dvdG9fQ29kZVJhbmdlKCBleGVjLCB0dF9jb2RlcmFuZ2VfY3Z0LCAwICk7Ci0KLSAgICAgIEZUX1RSQUNFNCgoICJFeGVjdXRpbmcgYHByZXAnIHRhYmxlLlxuIiApKTsKLQotICAgICAgZXJyb3IgPSBmYWNlLT5pbnRlcnByZXRlciggZXhlYyApOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBlcnJvciA9IEZUX0Vycl9PazsKLQotICAgIHNpemUtPmN2dF9yZWFkeSA9IGVycm9yOwotCi0gICAgLyogVU5ET0NVTUVOVEVEISAgVGhlIE1TIHJhc3Rlcml6ZXIgZG9lc24ndCBhbGxvdyB0aGUgZm9sbG93aW5nICovCi0gICAgLyogZ3JhcGhpY3Mgc3RhdGUgdmFyaWFibGVzIHRvIGJlIG1vZGlmaWVkIGJ5IHRoZSBDVlQgcHJvZ3JhbS4gICovCi0KLSAgICBleGVjLT5HUy5kdWFsVmVjdG9yLnggPSAweDQwMDA7Ci0gICAgZXhlYy0+R1MuZHVhbFZlY3Rvci55ID0gMDsKLSAgICBleGVjLT5HUy5wcm9qVmVjdG9yLnggPSAweDQwMDA7Ci0gICAgZXhlYy0+R1MucHJvalZlY3Rvci55ID0gMHgwOwotICAgIGV4ZWMtPkdTLmZyZWVWZWN0b3IueCA9IDB4NDAwMDsKLSAgICBleGVjLT5HUy5mcmVlVmVjdG9yLnkgPSAweDA7Ci0KLSAgICBleGVjLT5HUy5ycDAgPSAwOwotICAgIGV4ZWMtPkdTLnJwMSA9IDA7Ci0gICAgZXhlYy0+R1MucnAyID0gMDsKLQotICAgIGV4ZWMtPkdTLmdlcDAgPSAxOwotICAgIGV4ZWMtPkdTLmdlcDEgPSAxOwotICAgIGV4ZWMtPkdTLmdlcDIgPSAxOwotCi0gICAgZXhlYy0+R1MubG9vcCA9IDE7Ci0KLSAgICAvKiBzYXZlIGFzIGRlZmF1bHQgZ3JhcGhpY3Mgc3RhdGUgKi8KLSAgICBzaXplLT5HUyA9IGV4ZWMtPkdTOwotCi0gICAgVFRfU2F2ZV9Db250ZXh0KCBleGVjLCBzaXplICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHR0X3NpemVfZG9uZV9ieXRlY29kZSggRlRfU2l6ZSAgZnRzaXplICkKLSAgewotICAgIFRUX1NpemUgICAgc2l6ZSAgID0gKFRUX1NpemUpZnRzaXplOwotICAgIFRUX0ZhY2UgICAgZmFjZSAgID0gKFRUX0ZhY2UpZnRzaXplLT5mYWNlOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0KLSAgICBpZiAoIHNpemUtPmNvbnRleHQgKQotICAgIHsKLSAgICAgIFRUX0RvbmVfQ29udGV4dCggc2l6ZS0+Y29udGV4dCApOwotICAgICAgc2l6ZS0+Y29udGV4dCA9IE5VTEw7Ci0gICAgfQotCi0gICAgRlRfRlJFRSggc2l6ZS0+Y3Z0ICk7Ci0gICAgc2l6ZS0+Y3Z0X3NpemUgPSAwOwotCi0gICAgLyogZnJlZSBzdG9yYWdlIGFyZWEgKi8KLSAgICBGVF9GUkVFKCBzaXplLT5zdG9yYWdlICk7Ci0gICAgc2l6ZS0+c3RvcmFnZV9zaXplID0gMDsKLQotICAgIC8qIHR3aWxpZ2h0IHpvbmUgKi8KLSAgICB0dF9nbHlwaHpvbmVfZG9uZSggJnNpemUtPnR3aWxpZ2h0ICk7Ci0KLSAgICBGVF9GUkVFKCBzaXplLT5mdW5jdGlvbl9kZWZzICk7Ci0gICAgRlRfRlJFRSggc2l6ZS0+aW5zdHJ1Y3Rpb25fZGVmcyApOwotCi0gICAgc2l6ZS0+bnVtX2Z1bmN0aW9uX2RlZnMgICAgPSAwOwotICAgIHNpemUtPm1heF9mdW5jdGlvbl9kZWZzICAgID0gMDsKLSAgICBzaXplLT5udW1faW5zdHJ1Y3Rpb25fZGVmcyA9IDA7Ci0gICAgc2l6ZS0+bWF4X2luc3RydWN0aW9uX2RlZnMgPSAwOwotCi0gICAgc2l6ZS0+bWF4X2Z1bmMgPSAwOwotICAgIHNpemUtPm1heF9pbnMgID0gMDsKLQotICAgIHNpemUtPmJ5dGVjb2RlX3JlYWR5ID0gLTE7Ci0gICAgc2l6ZS0+Y3Z0X3JlYWR5ICAgICAgPSAtMTsKLSAgfQotCi0KLSAgLyogSW5pdGlhbGl6ZSBieXRlY29kZS1yZWxhdGVkIGZpZWxkcyBpbiB0aGUgc2l6ZSBvYmplY3QuICAgICAgICovCi0gIC8qIFdlIGRvIHRoaXMgb25seSBpZiBieXRlY29kZSBpbnRlcnByZXRhdGlvbiBpcyByZWFsbHkgbmVlZGVkLiAqLwotICBzdGF0aWMgRlRfRXJyb3IKLSAgdHRfc2l6ZV9pbml0X2J5dGVjb2RlKCBGVF9TaXplICBmdHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgcGVkYW50aWMgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBUVF9TaXplICAgIHNpemUgPSAoVFRfU2l6ZSlmdHNpemU7Ci0gICAgVFRfRmFjZSAgICBmYWNlID0gKFRUX0ZhY2UpZnRzaXplLT5mYWNlOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0KLSAgICBGVF9VU2hvcnQgICAgICAgbl90d2lsaWdodDsKLSAgICBUVF9NYXhQcm9maWxlKiAgbWF4cCA9ICZmYWNlLT5tYXhfcHJvZmlsZTsKLQotCi0gICAgLyogY2xlYW4gdXAgYnl0ZWNvZGUgcmVsYXRlZCBkYXRhICovCi0gICAgRlRfRlJFRSggc2l6ZS0+ZnVuY3Rpb25fZGVmcyApOwotICAgIEZUX0ZSRUUoIHNpemUtPmluc3RydWN0aW9uX2RlZnMgKTsKLSAgICBGVF9GUkVFKCBzaXplLT5jdnQgKTsKLSAgICBGVF9GUkVFKCBzaXplLT5zdG9yYWdlICk7Ci0KLSAgICBpZiAoIHNpemUtPmNvbnRleHQgKQotICAgICAgVFRfRG9uZV9Db250ZXh0KCBzaXplLT5jb250ZXh0ICk7Ci0gICAgdHRfZ2x5cGh6b25lX2RvbmUoICZzaXplLT50d2lsaWdodCApOwotCi0gICAgc2l6ZS0+Ynl0ZWNvZGVfcmVhZHkgPSAtMTsKLSAgICBzaXplLT5jdnRfcmVhZHkgICAgICA9IC0xOwotCi0gICAgc2l6ZS0+Y29udGV4dCA9IFRUX05ld19Db250ZXh0KCAoVFRfRHJpdmVyKWZhY2UtPnJvb3QuZHJpdmVyICk7Ci0KLSAgICBzaXplLT5tYXhfZnVuY3Rpb25fZGVmcyAgICA9IG1heHAtPm1heEZ1bmN0aW9uRGVmczsKLSAgICBzaXplLT5tYXhfaW5zdHJ1Y3Rpb25fZGVmcyA9IG1heHAtPm1heEluc3RydWN0aW9uRGVmczsKLQotICAgIHNpemUtPm51bV9mdW5jdGlvbl9kZWZzICAgID0gMDsKLSAgICBzaXplLT5udW1faW5zdHJ1Y3Rpb25fZGVmcyA9IDA7Ci0KLSAgICBzaXplLT5tYXhfZnVuYyA9IDA7Ci0gICAgc2l6ZS0+bWF4X2lucyAgPSAwOwotCi0gICAgc2l6ZS0+Y3Z0X3NpemUgICAgID0gZmFjZS0+Y3Z0X3NpemU7Ci0gICAgc2l6ZS0+c3RvcmFnZV9zaXplID0gbWF4cC0+bWF4U3RvcmFnZTsKLQotICAgIC8qIFNldCBkZWZhdWx0IG1ldHJpY3MgKi8KLSAgICB7Ci0gICAgICBUVF9TaXplX01ldHJpY3MqICBtZXRyaWNzID0gJnNpemUtPnR0bWV0cmljczsKLQotCi0gICAgICBtZXRyaWNzLT5yb3RhdGVkICAgPSBGQUxTRTsKLSAgICAgIG1ldHJpY3MtPnN0cmV0Y2hlZCA9IEZBTFNFOwotCi0gICAgICAvKiBzZXQgZGVmYXVsdCBlbmdpbmUgY29tcGVuc2F0aW9uICovCi0gICAgICBtZXRyaWNzLT5jb21wZW5zYXRpb25zWzBdID0gMDsgICAvKiBncmF5ICAgICAqLwotICAgICAgbWV0cmljcy0+Y29tcGVuc2F0aW9uc1sxXSA9IDA7ICAgLyogYmxhY2sgICAgKi8KLSAgICAgIG1ldHJpY3MtPmNvbXBlbnNhdGlvbnNbMl0gPSAwOyAgIC8qIHdoaXRlICAgICovCi0gICAgICBtZXRyaWNzLT5jb21wZW5zYXRpb25zWzNdID0gMDsgICAvKiByZXNlcnZlZCAqLwotICAgIH0KLQotICAgIC8qIGFsbG9jYXRlIGZ1bmN0aW9uIGRlZnMsIGluc3RydWN0aW9uIGRlZnMsIGN2dCwgYW5kIHN0b3JhZ2UgYXJlYSAqLwotICAgIGlmICggRlRfTkVXX0FSUkFZKCBzaXplLT5mdW5jdGlvbl9kZWZzLCAgICBzaXplLT5tYXhfZnVuY3Rpb25fZGVmcyAgICApIHx8Ci0gICAgICAgICBGVF9ORVdfQVJSQVkoIHNpemUtPmluc3RydWN0aW9uX2RlZnMsIHNpemUtPm1heF9pbnN0cnVjdGlvbl9kZWZzICkgfHwKLSAgICAgICAgIEZUX05FV19BUlJBWSggc2l6ZS0+Y3Z0LCAgICAgICAgICAgICAgc2l6ZS0+Y3Z0X3NpemUgICAgICAgICAgICAgKSB8fAotICAgICAgICAgRlRfTkVXX0FSUkFZKCBzaXplLT5zdG9yYWdlLCAgICAgICAgICBzaXplLT5zdG9yYWdlX3NpemUgICAgICAgICApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIHJlc2VydmUgdHdpbGlnaHQgem9uZSAqLwotICAgIG5fdHdpbGlnaHQgPSBtYXhwLT5tYXhUd2lsaWdodFBvaW50czsKLQotICAgIC8qIHRoZXJlIGFyZSA0IHBoYW50b20gcG9pbnRzIChkbyB3ZSBuZWVkIHRoaXM/KSAqLwotICAgIG5fdHdpbGlnaHQgKz0gNDsKLQotICAgIGVycm9yID0gdHRfZ2x5cGh6b25lX25ldyggbWVtb3J5LCBuX3R3aWxpZ2h0LCAwLCAmc2l6ZS0+dHdpbGlnaHQgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHNpemUtPnR3aWxpZ2h0Lm5fcG9pbnRzID0gbl90d2lsaWdodDsKLQotICAgIHNpemUtPkdTID0gdHRfZGVmYXVsdF9ncmFwaGljc19zdGF0ZTsKLQotICAgIC8qIHNldCBgZmFjZS0+aW50ZXJwcmV0ZXInIGFjY29yZGluZyB0byB0aGUgZGVidWcgaG9vayBwcmVzZW50ICovCi0gICAgewotICAgICAgRlRfTGlicmFyeSAgbGlicmFyeSA9IGZhY2UtPnJvb3QuZHJpdmVyLT5yb290LmxpYnJhcnk7Ci0KLQotICAgICAgZmFjZS0+aW50ZXJwcmV0ZXIgPSAoVFRfSW50ZXJwcmV0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeS0+ZGVidWdfaG9va3NbRlRfREVCVUdfSE9PS19UUlVFVFlQRV07Ci0gICAgICBpZiAoICFmYWNlLT5pbnRlcnByZXRlciApCi0gICAgICAgIGZhY2UtPmludGVycHJldGVyID0gKFRUX0ludGVycHJldGVyKVRUX1J1bkluczsKLSAgICB9Ci0KLSAgICAvKiBGaW5lLCBub3cgcnVuIHRoZSBmb250IHByb2dyYW0hICovCi0gICAgZXJyb3IgPSB0dF9zaXplX3J1bl9mcGdtKCBzaXplLCBwZWRhbnRpYyApOwotCi0gIEV4aXQ6Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICB0dF9zaXplX2RvbmVfYnl0ZWNvZGUoIGZ0c2l6ZSApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfc2l6ZV9yZWFkeV9ieXRlY29kZSggVFRfU2l6ZSAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgcGVkYW50aWMgKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yID0gRlRfRXJyX09rOwotCi0KLSAgICBpZiAoIHNpemUtPmJ5dGVjb2RlX3JlYWR5IDwgMCApCi0gICAgICBlcnJvciA9IHR0X3NpemVfaW5pdF9ieXRlY29kZSggKEZUX1NpemUpc2l6ZSwgcGVkYW50aWMgKTsKLQotICAgIGlmICggZXJyb3IgfHwgc2l6ZS0+Ynl0ZWNvZGVfcmVhZHkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogcmVzY2FsZSBDVlQgd2hlbiBuZWVkZWQgKi8KLSAgICBpZiAoIHNpemUtPmN2dF9yZWFkeSA8IDAgKQotICAgIHsKLSAgICAgIEZUX1VJbnQgIGk7Ci0gICAgICBUVF9GYWNlICBmYWNlID0gKFRUX0ZhY2Upc2l6ZS0+cm9vdC5mYWNlOwotCi0KLSAgICAgIC8qIFNjYWxlIHRoZSBjdnQgdmFsdWVzIHRvIHRoZSBuZXcgcHBlbS4gICAgICAgICAgKi8KLSAgICAgIC8qIFdlIHVzZSBieSBkZWZhdWx0IHRoZSB5IHBwZW0gdG8gc2NhbGUgdGhlIENWVC4gKi8KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgc2l6ZS0+Y3Z0X3NpemU7IGkrKyApCi0gICAgICAgIHNpemUtPmN2dFtpXSA9IEZUX011bEZpeCggZmFjZS0+Y3Z0W2ldLCBzaXplLT50dG1ldHJpY3Muc2NhbGUgKTsKLQotICAgICAgLyogYWxsIHR3aWxpZ2h0IHBvaW50cyBhcmUgb3JpZ2luYWxseSB6ZXJvICovCi0gICAgICBmb3IgKCBpID0gMDsgaSA8IChGVF9VSW50KXNpemUtPnR3aWxpZ2h0Lm5fcG9pbnRzOyBpKysgKQotICAgICAgewotICAgICAgICBzaXplLT50d2lsaWdodC5vcmdbaV0ueCA9IDA7Ci0gICAgICAgIHNpemUtPnR3aWxpZ2h0Lm9yZ1tpXS55ID0gMDsKLSAgICAgICAgc2l6ZS0+dHdpbGlnaHQuY3VyW2ldLnggPSAwOwotICAgICAgICBzaXplLT50d2lsaWdodC5jdXJbaV0ueSA9IDA7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNsZWFyIHN0b3JhZ2UgYXJlYSAqLwotICAgICAgZm9yICggaSA9IDA7IGkgPCAoRlRfVUludClzaXplLT5zdG9yYWdlX3NpemU7IGkrKyApCi0gICAgICAgIHNpemUtPnN0b3JhZ2VbaV0gPSAwOwotCi0gICAgICBzaXplLT5HUyA9IHR0X2RlZmF1bHRfZ3JhcGhpY3Nfc3RhdGU7Ci0KLSAgICAgIGVycm9yID0gdHRfc2l6ZV9ydW5fcHJlcCggc2l6ZSwgcGVkYW50aWMgKTsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotI2VuZGlmIC8qIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfc2l6ZV9pbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgSW5pdGlhbGl6ZSBhIG5ldyBUcnVlVHlwZSBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc2l6ZSA6OiBBIGhhbmRsZSB0byB0aGUgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfc2l6ZV9pbml0KCBGVF9TaXplICB0dHNpemUgKSAgICAgICAgICAgLyogVFRfU2l6ZSAqLwotICB7Ci0gICAgVFRfU2l6ZSAgIHNpemUgID0gKFRUX1NpemUpdHRzaXplOwotICAgIEZUX0Vycm9yICBlcnJvciA9IEZUX0Vycl9PazsKLQotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0gICAgc2l6ZS0+Ynl0ZWNvZGVfcmVhZHkgPSAtMTsKLSAgICBzaXplLT5jdnRfcmVhZHkgICAgICA9IC0xOwotI2VuZGlmCi0KLSAgICBzaXplLT50dG1ldHJpY3MudmFsaWQgPSBGQUxTRTsKLSAgICBzaXplLT5zdHJpa2VfaW5kZXggICAgPSAweEZGRkZGRkZGVUw7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X3NpemVfZG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBUcnVlVHlwZSBzaXplIG9iamVjdCBmaW5hbGl6ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNpemUgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdHRfc2l6ZV9kb25lKCBGVF9TaXplICB0dHNpemUgKSAgICAgICAgICAgLyogVFRfU2l6ZSAqLwotICB7Ci0gICAgVFRfU2l6ZSAgc2l6ZSA9IChUVF9TaXplKXR0c2l6ZTsKLQotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0gICAgdHRfc2l6ZV9kb25lX2J5dGVjb2RlKCB0dHNpemUgKTsKLSNlbmRpZgotCi0gICAgc2l6ZS0+dHRtZXRyaWNzLnZhbGlkID0gRkFMU0U7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X3NpemVfcmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFJlc2V0IGEgVHJ1ZVR5cGUgc2l6ZSB3aGVuIHJlc29sdXRpb25zIGFuZCBjaGFyYWN0ZXIgZGltZW5zaW9ucyAgICAqLwotICAvKiAgICBoYXZlIGJlZW4gY2hhbmdlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaXplIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgc2l6ZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9zaXplX3Jlc2V0KCBUVF9TaXplICBzaXplICkKLSAgewotICAgIFRUX0ZhY2UgICAgICAgICAgIGZhY2U7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgRlRfU2l6ZV9NZXRyaWNzKiAgbWV0cmljczsKLQotCi0gICAgc2l6ZS0+dHRtZXRyaWNzLnZhbGlkID0gRkFMU0U7Ci0KLSAgICBmYWNlID0gKFRUX0ZhY2Upc2l6ZS0+cm9vdC5mYWNlOwotCi0gICAgbWV0cmljcyA9ICZzaXplLT5tZXRyaWNzOwotCi0gICAgLyogY29weSB0aGUgcmVzdWx0IGZyb20gYmFzZSBsYXllciAqLwotICAgICptZXRyaWNzID0gc2l6ZS0+cm9vdC5tZXRyaWNzOwotCi0gICAgaWYgKCBtZXRyaWNzLT54X3BwZW0gPCAxIHx8IG1ldHJpY3MtPnlfcHBlbSA8IDEgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX1BQZW0gKTsKLQotICAgIC8qIFRoaXMgYml0IGZsYWcsIGlmIHNldCwgaW5kaWNhdGVzIHRoYXQgdGhlIHBwZW1zIG11c3QgYmUgICAgICAgKi8KLSAgICAvKiByb3VuZGVkIHRvIGludGVnZXJzLiAgTmVhcmx5IGFsbCBUcnVlVHlwZSBmb250cyBoYXZlIHRoaXMgYml0ICovCi0gICAgLyogc2V0LCBhcyBoaW50aW5nIHdvbid0IHdvcmsgcmVhbGx5IHdlbGwgb3RoZXJ3aXNlLiAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGZhY2UtPmhlYWRlci5GbGFncyAmIDggKQotICAgIHsKLSAgICAgIG1ldHJpY3MtPnhfc2NhbGUgPSBGVF9EaXZGaXgoIG1ldHJpY3MtPnhfcHBlbSA8PCA2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+cm9vdC51bml0c19wZXJfRU0gKTsKLSAgICAgIG1ldHJpY3MtPnlfc2NhbGUgPSBGVF9EaXZGaXgoIG1ldHJpY3MtPnlfcHBlbSA8PCA2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZS0+cm9vdC51bml0c19wZXJfRU0gKTsKLQotICAgICAgbWV0cmljcy0+YXNjZW5kZXIgPQotICAgICAgICBGVF9QSVhfUk9VTkQoIEZUX011bEZpeCggZmFjZS0+cm9vdC5hc2NlbmRlciwgbWV0cmljcy0+eV9zY2FsZSApICk7Ci0gICAgICBtZXRyaWNzLT5kZXNjZW5kZXIgPQotICAgICAgICBGVF9QSVhfUk9VTkQoIEZUX011bEZpeCggZmFjZS0+cm9vdC5kZXNjZW5kZXIsIG1ldHJpY3MtPnlfc2NhbGUgKSApOwotICAgICAgbWV0cmljcy0+aGVpZ2h0ID0KLSAgICAgICAgRlRfUElYX1JPVU5EKCBGVF9NdWxGaXgoIGZhY2UtPnJvb3QuaGVpZ2h0LCBtZXRyaWNzLT55X3NjYWxlICkgKTsKLSAgICAgIG1ldHJpY3MtPm1heF9hZHZhbmNlID0KLSAgICAgICAgRlRfUElYX1JPVU5EKCBGVF9NdWxGaXgoIGZhY2UtPnJvb3QubWF4X2FkdmFuY2Vfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT54X3NjYWxlICkgKTsKLSAgICB9Ci0KLSAgICAvKiBjb21wdXRlIG5ldyB0cmFuc2Zvcm1hdGlvbiAqLwotICAgIGlmICggbWV0cmljcy0+eF9wcGVtID49IG1ldHJpY3MtPnlfcHBlbSApCi0gICAgewotICAgICAgc2l6ZS0+dHRtZXRyaWNzLnNjYWxlICAgPSBtZXRyaWNzLT54X3NjYWxlOwotICAgICAgc2l6ZS0+dHRtZXRyaWNzLnBwZW0gICAgPSBtZXRyaWNzLT54X3BwZW07Ci0gICAgICBzaXplLT50dG1ldHJpY3MueF9yYXRpbyA9IDB4MTAwMDBMOwotICAgICAgc2l6ZS0+dHRtZXRyaWNzLnlfcmF0aW8gPSBGVF9EaXZGaXgoIG1ldHJpY3MtPnlfcHBlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT54X3BwZW0gKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNpemUtPnR0bWV0cmljcy5zY2FsZSAgID0gbWV0cmljcy0+eV9zY2FsZTsKLSAgICAgIHNpemUtPnR0bWV0cmljcy5wcGVtICAgID0gbWV0cmljcy0+eV9wcGVtOwotICAgICAgc2l6ZS0+dHRtZXRyaWNzLnhfcmF0aW8gPSBGVF9EaXZGaXgoIG1ldHJpY3MtPnhfcHBlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT55X3BwZW0gKTsKLSAgICAgIHNpemUtPnR0bWV0cmljcy55X3JhdGlvID0gMHgxMDAwMEw7Ci0gICAgfQotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0gICAgc2l6ZS0+Y3Z0X3JlYWR5ID0gLTE7Ci0jZW5kaWYgLyogVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSICovCi0KLSAgICBpZiAoICFlcnJvciApCi0gICAgICBzaXplLT50dG1ldHJpY3MudmFsaWQgPSBUUlVFOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9kcml2ZXJfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBJbml0aWFsaXplIGEgZ2l2ZW4gVHJ1ZVR5cGUgZHJpdmVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBkcml2ZXIgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBkcml2ZXIgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9kcml2ZXJfaW5pdCggRlRfTW9kdWxlICB0dGRyaXZlciApICAgICAvKiBUVF9Ecml2ZXIgKi8KLSAgewotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0KLSAgICBUVF9Ecml2ZXIgIGRyaXZlciA9IChUVF9Ecml2ZXIpdHRkcml2ZXI7Ci0KLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcKLSAgICBkcml2ZXItPmludGVycHJldGVyX3ZlcnNpb24gPSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM4OwotI2Vsc2UKLSAgICBkcml2ZXItPmludGVycHJldGVyX3ZlcnNpb24gPSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM1OwotI2VuZGlmCi0KLSNlbHNlIC8qICFUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgKi8KLQotICAgIEZUX1VOVVNFRCggdHRkcml2ZXIgKTsKLQotI2VuZGlmIC8qICFUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgKi8KLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2RyaXZlcl9kb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZpbmFsaXplIGEgZ2l2ZW4gVHJ1ZVR5cGUgZHJpdmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRyaXZlciA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IFRydWVUeXBlIGRyaXZlci4gICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdHRfZHJpdmVyX2RvbmUoIEZUX01vZHVsZSAgdHRkcml2ZXIgKSAgICAgLyogVFRfRHJpdmVyICovCi0gIHsKLSAgICBGVF9VTlVTRUQoIHR0ZHJpdmVyICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X3Nsb3RfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRpYWxpemUgYSBuZXcgc2xvdCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHNsb3QgOjogQSBoYW5kbGUgdG8gdGhlIHNsb3Qgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X3Nsb3RfaW5pdCggRlRfR2x5cGhTbG90ICBzbG90ICkKLSAgewotICAgIHJldHVybiBGVF9HbHlwaExvYWRlcl9DcmVhdGVFeHRyYSggc2xvdC0+aW50ZXJuYWwtPmxvYWRlciApOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRvYmpzLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRvYmpzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzOTYwODkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0b2Jqcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0b2Jqcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBPYmplY3RzIG1hbmFnZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1RUT0JKU19IX18KLSNkZWZpbmUgX19UVE9CSlNfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RSVUVUWVBFX1RZUEVTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0RyaXZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgVHJ1ZVR5cGUgZHJpdmVyIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgVFRfRHJpdmVyUmVjXyogIFRUX0RyaXZlcjsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRUX0dseXBoU2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgVHJ1ZVR5cGUgZ2x5cGggc2xvdCBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoaXMgaXMgYSBkaXJlY3QgdHlwZWRlZiBvZiBGVF9HbHlwaFNsb3QsIGFzIHRoZXJlIGlzIG5vdGhpbmcgICAgICAqLwotICAvKiAgICBzcGVjaWZpYyBhYm91dCB0aGUgVHJ1ZVR5cGUgZ2x5cGggc2xvdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgRlRfR2x5cGhTbG90ICBUVF9HbHlwaFNsb3Q7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUVF9HcmFwaGljc1N0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGUgVHJ1ZVR5cGUgZ3JhcGhpY3Mgc3RhdGUgdXNlZCBkdXJpbmcgYnl0ZWNvZGUgaW50ZXJwcmV0YXRpb24uICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9HcmFwaGljc1N0YXRlXwotICB7Ci0gICAgRlRfVVNob3J0ICAgICAgcnAwOwotICAgIEZUX1VTaG9ydCAgICAgIHJwMTsKLSAgICBGVF9VU2hvcnQgICAgICBycDI7Ci0KLSAgICBGVF9Vbml0VmVjdG9yICBkdWFsVmVjdG9yOwotICAgIEZUX1VuaXRWZWN0b3IgIHByb2pWZWN0b3I7Ci0gICAgRlRfVW5pdFZlY3RvciAgZnJlZVZlY3RvcjsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fVU5QQVRFTlRFRF9ISU5USU5HCi0gICAgRlRfQm9vbCAgICAgICAgYm90aF94X2F4aXM7Ci0jZW5kaWYKLQotICAgIEZUX0xvbmcgICAgICAgIGxvb3A7Ci0gICAgRlRfRjI2RG90NiAgICAgbWluaW11bV9kaXN0YW5jZTsKLSAgICBGVF9JbnQgICAgICAgICByb3VuZF9zdGF0ZTsKLQotICAgIEZUX0Jvb2wgICAgICAgIGF1dG9fZmxpcDsKLSAgICBGVF9GMjZEb3Q2ICAgICBjb250cm9sX3ZhbHVlX2N1dGluOwotICAgIEZUX0YyNkRvdDYgICAgIHNpbmdsZV93aWR0aF9jdXRpbjsKLSAgICBGVF9GMjZEb3Q2ICAgICBzaW5nbGVfd2lkdGhfdmFsdWU7Ci0gICAgRlRfVVNob3J0ICAgICAgZGVsdGFfYmFzZTsKLSAgICBGVF9VU2hvcnQgICAgICBkZWx0YV9zaGlmdDsKLQotICAgIEZUX0J5dGUgICAgICAgIGluc3RydWN0X2NvbnRyb2w7Ci0gICAgLyogQWNjb3JkaW5nIHRvIEdyZWcgSGl0Y2hjb2NrIGZyb20gTWljcm9zb2Z0LCB0aGUgYHNjYW5fY29udHJvbCcgICAgICovCi0gICAgLyogdmFyaWFibGUgYXMgZG9jdW1lbnRlZCBpbiB0aGUgVHJ1ZVR5cGUgc3BlY2lmaWNhdGlvbiBpcyBhIDMyLWJpdCAgICovCi0gICAgLyogaW50ZWdlcjsgdGhlIGhpZ2gtd29yZCBwYXJ0IGhvbGRzIHRoZSBTQ0FOVFlQRSB2YWx1ZSwgdGhlIGxvdy13b3JkICovCi0gICAgLyogcGFydCB0aGUgU0NBTkNUUkwgdmFsdWUuICBXZSBzZXBhcmF0ZSBpdCBpbnRvIHR3byBmaWVsZHMuICAgICAgICAgICovCi0gICAgRlRfQm9vbCAgICAgICAgc2Nhbl9jb250cm9sOwotICAgIEZUX0ludCAgICAgICAgIHNjYW5fdHlwZTsKLQotICAgIEZUX1VTaG9ydCAgICAgIGdlcDA7Ci0gICAgRlRfVVNob3J0ICAgICAgZ2VwMTsKLSAgICBGVF9VU2hvcnQgICAgICBnZXAyOwotCi0gIH0gVFRfR3JhcGhpY3NTdGF0ZTsKLQotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0dF9nbHlwaHpvbmVfZG9uZSggVFRfR2x5cGhab25lICB6b25lICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZ2x5cGh6b25lX25ldyggRlRfTWVtb3J5ICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgICAgbWF4UG9pbnRzLAotICAgICAgICAgICAgICAgICAgICBGVF9TaG9ydCAgICAgIG1heENvbnRvdXJzLAotICAgICAgICAgICAgICAgICAgICBUVF9HbHlwaFpvbmUgIHpvbmUgKTsKLQotI2VuZGlmIC8qIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICBFWEVDVVRJT04gU1VCVEFCTEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIFRoZXNlIHN1Yi10YWJsZXMgcmVsYXRlIHRvIGluc3RydWN0aW9uIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jZGVmaW5lIFRUX01BWF9DT0RFX1JBTkdFUyAgMwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVyZSBjYW4gb25seSBiZSAzIGFjdGl2ZSBjb2RlIHJhbmdlcyBhdCBvbmNlOiAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAtIHRoZSBGb250IFByb2dyYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgLSB0aGUgQ1ZUIFByb2dyYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIC0gYSBnbHlwaCdzIGluc3RydWN0aW9ucyBzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgZW51bSAgVFRfQ29kZVJhbmdlX1RhZ18KLSAgewotICAgIHR0X2NvZGVyYW5nZV9ub25lID0gMCwKLSAgICB0dF9jb2RlcmFuZ2VfZm9udCwKLSAgICB0dF9jb2RlcmFuZ2VfY3Z0LAotICAgIHR0X2NvZGVyYW5nZV9nbHlwaAotCi0gIH0gVFRfQ29kZVJhbmdlX1RhZzsKLQotCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9Db2RlUmFuZ2VfCi0gIHsKLSAgICBGVF9CeXRlKiAgYmFzZTsKLSAgICBGVF9Mb25nICAgc2l6ZTsKLQotICB9IFRUX0NvZGVSYW5nZTsKLQotICB0eXBlZGVmIFRUX0NvZGVSYW5nZSAgVFRfQ29kZVJhbmdlVGFibGVbVFRfTUFYX0NPREVfUkFOR0VTXTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogRGVmaW5lcyBhIGZ1bmN0aW9uL2luc3RydWN0aW9uIGRlZmluaXRpb24gcmVjb3JkLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfRGVmUmVjb3JkXwotICB7Ci0gICAgRlRfSW50ICAgIHJhbmdlOyAgICAgICAgICAvKiBpbiB3aGljaCBjb2RlIHJhbmdlIGlzIGl0IGxvY2F0ZWQ/ICAgICAqLwotICAgIEZUX0xvbmcgICBzdGFydDsgICAgICAgICAgLyogd2hlcmUgZG9lcyBpdCBzdGFydD8gICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9Mb25nICAgZW5kOyAgICAgICAgICAgIC8qIHdoZXJlIGRvZXMgaXQgZW5kPyAgICAgICAgICAgICAgICAgICAgICovCi0gICAgRlRfVUludCAgIG9wYzsgICAgICAgICAgICAvKiBmdW5jdGlvbiAjLCBvciBpbnN0cnVjdGlvbiBjb2RlICAgICAgICAqLwotICAgIEZUX0Jvb2wgICBhY3RpdmU7ICAgICAgICAgLyogaXMgaXQgYWN0aXZlPyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9Cb29sICAgaW5saW5lX2RlbHRhOyAgIC8qIGlzIGZ1bmN0aW9uIHRoYXQgZGVmaW5lcyBpbmxpbmUgZGVsdGE/ICovCi0gICAgRlRfVUxvbmcgIHNwaF9mZGVmX2ZsYWdzOyAvKiBmbGFncyB0byBpZGVudGlmeSBzcGVjaWFsIGZ1bmN0aW9ucyAgICAqLwotCi0gIH0gVFRfRGVmUmVjb3JkLCAqVFRfRGVmQXJyYXk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFN1YmdseXBoIHRyYW5zZm9ybWF0aW9uIHJlY29yZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgIFRUX1RyYW5zZm9ybV8KLSAgewotICAgIEZUX0ZpeGVkICAgIHh4LCB4eTsgICAgIC8qIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBjb2VmZmljaWVudHMgKi8KLSAgICBGVF9GaXhlZCAgICB5eCwgeXk7Ci0gICAgRlRfRjI2RG90NiAgb3gsIG95OyAgICAgLyogb2Zmc2V0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIH0gVFRfVHJhbnNmb3JtOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIG5vdGUgcmVnYXJkaW5nIG5vbi1zcXVhcmVkIHBpeGVsczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIChUaGlzIHRleHQgd2lsbCBwcm9iYWJseSBnbyBpbnRvIHNvbWUgZG9jcyBhdCBzb21lIHRpbWU7IGZvciBub3csIGl0ICAqLwotICAvKiBpcyBrZXB0IGhlcmUgdG8gZXhwbGFpbiBzb21lIGRlZmluaXRpb25zIGluIHRoZSBUVF9TaXplX01ldHJpY3MgICAgICAgKi8KLSAgLyogcmVjb3JkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgQ1ZUIGlzIGEgb25lLWRpbWVuc2lvbmFsIGFycmF5IGNvbnRhaW5pbmcgdmFsdWVzIHRoYXQgY29udHJvbCAgICAgKi8KLSAgLyogY2VydGFpbiBpbXBvcnRhbnQgY2hhcmFjdGVyaXN0aWNzIGluIGEgZm9udCwgbGlrZSB0aGUgaGVpZ2h0IG9mIGFsbCAgICovCi0gIC8qIGNhcGl0YWxzLCBhbGwgbG93ZXJjYXNlIGxldHRlciwgZGVmYXVsdCBzcGFjaW5nIG9yIHN0ZW0gd2lkdGgvaGVpZ2h0LiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlc2UgdmFsdWVzIGFyZSBmb3VuZCBpbiBGVW5pdHMgaW4gdGhlIGZvbnQgZmlsZSwgYW5kIG11c3QgYmUgc2NhbGVkICovCi0gIC8qIHRvIHBpeGVsIGNvb3JkaW5hdGVzIGJlZm9yZSBiZWluZyB1c2VkIGJ5IHRoZSBDVlQgYW5kIGdseXBoIHByb2dyYW1zLiAqLwotICAvKiBVbmZvcnR1bmF0ZWx5LCB3aGVuIHVzaW5nIGRpc3RpbmN0IHggYW5kIHkgcmVzb2x1dGlvbnMgKG9yIGRpc3RpbmN0IHggKi8KLSAgLyogYW5kIHkgcG9pbnRzaXplcyksIHRoZXJlIGFyZSB0d28gcG9zc2libGUgc2NhbGluZ3MuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBBIGZpcnN0IHRyeSB3YXMgdG8gaW1wbGVtZW50IGEgYGxhenknIHNjaGVtZSB3aGVyZSBhbGwgdmFsdWVzIHdlcmUgICAgKi8KLSAgLyogc2NhbGVkIHdoZW4gZmlyc3QgdXNlZC4gIEhvd2V2ZXIsIHdoaWxlIHNvbWUgdmFsdWVzIGFyZSBhbHdheXMgdXNlZCAgICovCi0gIC8qIGluIHRoZSBzYW1lIGRpcmVjdGlvbiwgc29tZSBvdGhlcnMgYXJlIHVzZWQgdW5kZXIgbWFueSBkaWZmZXJlbnQgICAgICAqLwotICAvKiBjaXJjdW1zdGFuY2VzIGFuZCBvcmllbnRhdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEkgaGF2ZSBmb3VuZCBhIHNpbXBsZXIgd2F5IHRvIGRvIHRoZSBzYW1lLCBhbmQgaXQgZXZlbiBzZWVtcyB0byB3b3JrICAqLwotICAvKiBpbiBtb3N0IG9mIHRoZSBjYXNlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIC0gQWxsIENWVCB2YWx1ZXMgYXJlIHNjYWxlZCB0byB0aGUgbWF4aW11bSBwcGVtIHNpemUuICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogLSBXaGVuIHBlcmZvcm1pbmcgYSByZWFkIG9yIHdyaXRlIGluIHRoZSBDVlQsIGEgcmF0aW8gZmFjdG9yIGlzIHVzZWQgICovCi0gIC8qICAgdG8gcGVyZm9ybSBhZGVxdWF0ZSBzY2FsaW5nLiAgRXhhbXBsZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIHhfcHBlbSA9IDE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICB5X3BwZW0gPSAxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBXZSBjaG9vc2UgcHBlbSA9IHhfcHBlbSA9IDE0IGFzIHRoZSBDVlQgc2NhbGluZyBzaXplLiAgQWxsIGN2dCAgICAgICovCi0gIC8qICAgZW50cmllcyBhcmUgc2NhbGVkIHRvIGl0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIHhfcmF0aW8gPSAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICB5X3JhdGlvID0geV9wcGVtL3BwZW0gKDwgMS4wKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICBXZSBjb21wdXRlIHRoZSBjdXJyZW50IHJhdGlvIGxpa2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIC0gSWYgcHJvalZlY3RvciBpcyBob3Jpem9udGFsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgcmF0aW8gPSB4X3JhdGlvID0gMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIC0gaWYgcHJvalZlY3RvciBpcyB2ZXJ0aWNhbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgcmF0aW8gPSB5X3JhdGlvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIC0gZWxzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgcmF0aW8gPSBzcXJ0KCAocHJvai54ICogeF9yYXRpbykgXiAyICsgKHByb2oueSAqIHlfcmF0aW8pIF4gMiApICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFJlYWRpbmcgYSBjdnQgdmFsdWUgcmV0dXJucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIHJhdGlvICogY3Z0W2luZGV4XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFdyaXRpbmcgYSBjdnQgdmFsdWUgaW4gcGl4ZWxzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIGN2dFtpbmRleF0gLyByYXRpbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgIFRoZSBjdXJyZW50IHBwZW0gaXMgc2ltcGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgIHJhdGlvICogcHBlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogTWV0cmljcyB1c2VkIGJ5IHRoZSBUcnVlVHlwZSBzaXplIGFuZCBjb250ZXh0IG9iamVjdHMuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfU2l6ZV9NZXRyaWNzXwotICB7Ci0gICAgLyogZm9yIG5vbi1zcXVhcmUgcGl4ZWxzICovCi0gICAgRlRfTG9uZyAgICAgeF9yYXRpbzsKLSAgICBGVF9Mb25nICAgICB5X3JhdGlvOwotCi0gICAgRlRfVVNob3J0ICAgcHBlbTsgICAgICAgICAgICAgICAvKiBtYXhpbXVtIHBwZW0gc2l6ZSAgICAgICAgICAgICAgKi8KLSAgICBGVF9Mb25nICAgICByYXRpbzsgICAgICAgICAgICAgIC8qIGN1cnJlbnQgcmF0aW8gICAgICAgICAgICAgICAgICAqLwotICAgIEZUX0ZpeGVkICAgIHNjYWxlOwotCi0gICAgRlRfRjI2RG90NiAgY29tcGVuc2F0aW9uc1s0XTsgICAvKiBkZXZpY2Utc3BlY2lmaWMgY29tcGVuc2F0aW9ucyAgKi8KLQotICAgIEZUX0Jvb2wgICAgIHZhbGlkOwotCi0gICAgRlRfQm9vbCAgICAgcm90YXRlZDsgICAgICAgICAgICAvKiBgaXMgdGhlIGdseXBoIHJvdGF0ZWQ/Jy1mbGFnICAgKi8KLSAgICBGVF9Cb29sICAgICBzdHJldGNoZWQ7ICAgICAgICAgIC8qIGBpcyB0aGUgZ2x5cGggc3RyZXRjaGVkPyctZmxhZyAqLwotCi0gIH0gVFRfU2l6ZV9NZXRyaWNzOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUcnVlVHlwZSBzaXplIGNsYXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0ICBUVF9TaXplUmVjXwotICB7Ci0gICAgRlRfU2l6ZVJlYyAgICAgICAgIHJvb3Q7Ci0KLSAgICAvKiB3ZSBoYXZlIG91ciBvd24gY29weSBvZiBtZXRyaWNzIHNvIHRoYXQgd2UgY2FuIG1vZGlmeSAqLwotICAgIC8qIGl0IHdpdGhvdXQgYWZmZWN0aW5nIGF1dG8taGludGluZyAod2hlbiB1c2VkKSAgICAgICAgICovCi0gICAgRlRfU2l6ZV9NZXRyaWNzICAgIG1ldHJpY3M7Ci0KLSAgICBUVF9TaXplX01ldHJpY3MgICAgdHRtZXRyaWNzOwotCi0gICAgRlRfVUxvbmcgICAgICAgICAgIHN0cmlrZV9pbmRleDsgICAgICAvKiAweEZGRkZGRkZGIHRvIGluZGljYXRlIGludmFsaWQgKi8KLQotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotCi0gICAgRlRfVUludCAgICAgICAgICAgIG51bV9mdW5jdGlvbl9kZWZzOyAvKiBudW1iZXIgb2YgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKi8KLSAgICBGVF9VSW50ICAgICAgICAgICAgbWF4X2Z1bmN0aW9uX2RlZnM7Ci0gICAgVFRfRGVmQXJyYXkgICAgICAgIGZ1bmN0aW9uX2RlZnM7ICAgICAvKiB0YWJsZSBvZiBmdW5jdGlvbiBkZWZpbml0aW9ucyAgKi8KLQotICAgIEZUX1VJbnQgICAgICAgICAgICBudW1faW5zdHJ1Y3Rpb25fZGVmczsgIC8qIG51bWJlciBvZiBpbnMuIGRlZmluaXRpb25zICovCi0gICAgRlRfVUludCAgICAgICAgICAgIG1heF9pbnN0cnVjdGlvbl9kZWZzOwotICAgIFRUX0RlZkFycmF5ICAgICAgICBpbnN0cnVjdGlvbl9kZWZzOyAgICAgIC8qIHRhYmxlIG9mIGlucy4gZGVmaW5pdGlvbnMgICovCi0KLSAgICBGVF9VSW50ICAgICAgICAgICAgbWF4X2Z1bmM7Ci0gICAgRlRfVUludCAgICAgICAgICAgIG1heF9pbnM7Ci0KLSAgICBUVF9Db2RlUmFuZ2VUYWJsZSAgY29kZVJhbmdlVGFibGU7Ci0KLSAgICBUVF9HcmFwaGljc1N0YXRlICAgR1M7Ci0KLSAgICBGVF9VTG9uZyAgICAgICAgICAgY3Z0X3NpemU7ICAgICAgLyogdGhlIHNjYWxlZCBjb250cm9sIHZhbHVlIHRhYmxlICovCi0gICAgRlRfTG9uZyogICAgICAgICAgIGN2dDsKLQotICAgIEZUX1VTaG9ydCAgICAgICAgICBzdG9yYWdlX3NpemU7IC8qIFRoZSBzdG9yYWdlIGFyZWEgaXMgbm93IHBhcnQgb2YgKi8KLSAgICBGVF9Mb25nKiAgICAgICAgICAgc3RvcmFnZTsgICAgICAvKiB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBUVF9HbHlwaFpvbmVSZWMgICAgdHdpbGlnaHQ7ICAgICAvKiBUaGUgaW5zdGFuY2UncyB0d2lsaWdodCB6b25lICAgICovCi0KLSAgICBUVF9FeGVjQ29udGV4dCAgICAgY29udGV4dDsKLQotICAgIC8qIGlmIG5lZ2F0aXZlLCBgZnBnbScgKHJlc3AuIGBwcmVwJyksIHdhc24ndCBleGVjdXRlZCB5ZXQ7ICovCi0gICAgLyogb3RoZXJ3aXNlIGl0IGlzIHRoZSByZXR1cm5lZCBlcnJvciBjb2RlICAgICAgICAgICAgICAgICAgKi8KLSAgICBGVF9FcnJvciAgICAgICAgICAgYnl0ZWNvZGVfcmVhZHk7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGN2dF9yZWFkeTsKLQotI2VuZGlmIC8qIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0gIH0gVFRfU2l6ZVJlYzsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVHJ1ZVR5cGUgZHJpdmVyIGNsYXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVFRfRHJpdmVyUmVjXwotICB7Ci0gICAgRlRfRHJpdmVyUmVjICByb290OwotCi0gICAgVFRfR2x5cGhab25lUmVjICB6b25lOyAgICAgLyogZ2x5cGggbG9hZGVyIHBvaW50cyB6b25lICovCi0KLSAgICBGVF9VSW50ICBpbnRlcnByZXRlcl92ZXJzaW9uOwotCi0gIH0gVFRfRHJpdmVyUmVjOwotCi0KLSAgLyogTm90ZTogQWxsIG9mIHRoZSBmdW5jdGlvbnMgYmVsb3cgKGV4Y2VwdCB0dF9zaXplX3Jlc2V0KCkpIGFyZSB1c2VkICAgICovCi0gIC8qIGFzIGZ1bmN0aW9uIHBvaW50ZXJzIGluIGEgRlRfRHJpdmVyX0NsYXNzUmVjLiAgVGhlcmVmb3JlIHRoZWlyICAgICAgICAqLwotICAvKiBwYXJhbWV0ZXJzIGFyZSBvZiB0eXBlcyBGVF9GYWNlLCBGVF9TaXplLCBldGMuLCByYXRoZXIgdGhhbiBUVF9GYWNlLCAgKi8KLSAgLyogVFRfU2l6ZSwgZXRjLiwgc28gdGhhdCB0aGUgY29tcGlsZXIgY2FuIGNvbmZpcm0gdGhhdCB0aGUgdHlwZXMgYW5kICAgICovCi0gIC8qIG51bWJlciBvZiBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0LiAgSW4gYWxsIGNhc2VzIHRoZSBGVF94eHggdHlwZXMgYXJlICAqLwotICAvKiBjYXN0IHRvIHRoZWlyIFRUX3h4eCBjb3VudGVycGFydHMgaW5zaWRlIHRoZSBmdW5jdGlvbnMgc2luY2UgRnJlZVR5cGUgKi8KLSAgLyogd2lsbCBhbHdheXMgdXNlIHRoZSBUVCBkcml2ZXIgdG8gY3JlYXRlIHRoZW0uICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEZhY2UgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9pbml0KCBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgRlRfRmFjZSAgICAgICAgdHRmYWNlLCAgICAgIC8qIFRUX0ZhY2UgKi8KLSAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBmYWNlX2luZGV4LAotICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIG51bV9wYXJhbXMsCi0gICAgICAgICAgICAgICAgRlRfUGFyYW1ldGVyKiAgcGFyYW1zICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0dF9mYWNlX2RvbmUoIEZUX0ZhY2UgIHR0ZmFjZSApOyAgICAgICAgICAvKiBUVF9GYWNlICovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFNpemUgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfc2l6ZV9pbml0KCBGVF9TaXplICB0dHNpemUgKTsgICAgICAgICAgLyogVFRfU2l6ZSAqLwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgdHRfc2l6ZV9kb25lKCBGVF9TaXplICB0dHNpemUgKTsgICAgICAgICAgLyogVFRfU2l6ZSAqLwotCi0jaWZkZWYgVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfc2l6ZV9ydW5fZnBnbSggVFRfU2l6ZSAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfQm9vbCAgcGVkYW50aWMgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9zaXplX3J1bl9wcmVwKCBUVF9TaXplICBzaXplLAotICAgICAgICAgICAgICAgICAgICBGVF9Cb29sICBwZWRhbnRpYyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X3NpemVfcmVhZHlfYnl0ZWNvZGUoIFRUX1NpemUgIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgIHBlZGFudGljICk7Ci0KLSNlbmRpZiAvKiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIgKi8KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9zaXplX3Jlc2V0KCBUVF9TaXplICBzaXplICk7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIERyaXZlciBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZHJpdmVyX2luaXQoIEZUX01vZHVsZSAgdHRkcml2ZXIgKTsgICAgLyogVFRfRHJpdmVyICovCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0dF9kcml2ZXJfZG9uZSggRlRfTW9kdWxlICB0dGRyaXZlciApOyAgICAvKiBUVF9Ecml2ZXIgKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU2xvdCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9zbG90X2luaXQoIEZUX0dseXBoU2xvdCAgc2xvdCApOwotCi0KLSAgLyogYXV4aWxpYXJ5ICovCi0jZGVmaW5lIElTX0hJTlRFRCggZmxhZ3MgKSAgKCAoIGZsYWdzICYgRlRfTE9BRF9OT19ISU5USU5HICkgPT0gMCApCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19UVE9CSlNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRwaWMuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dHBpYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDJhNmI3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dHBpYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0cGljLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgRnJlZVR5cGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSBzZXJ2aWNlcyBmb3IgdHJ1ZXR5cGUgbW9kdWxlLiAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMjAwOS0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgT3JhbiBBZ3JhIGFuZCBNaWNrZXkgR2FiZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9GUkVFVFlQRV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlICJ0dHBpYy5oIgotI2luY2x1ZGUgInR0ZXJyb3JzLmgiCi0KLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fUElDCi0KLSAgLyogZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBQSUMgaW5pdCBmdW5jdGlvbnMgZnJvbSB0dGRyaXZlci5jICovCi0gIEZUX0Vycm9yCi0gIEZUX0NyZWF0ZV9DbGFzc190dF9zZXJ2aWNlcyggRlRfTGlicmFyeSAgICAgICAgICAgbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9TZXJ2aWNlRGVzY1JlYyoqICBvdXRwdXRfY2xhc3MgKTsKLSAgdm9pZAotICBGVF9EZXN0cm95X0NsYXNzX3R0X3NlcnZpY2VzKCBGVF9MaWJyYXJ5ICAgICAgICAgIGxpYnJhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1NlcnZpY2VEZXNjUmVjKiAgY2xhenogKTsKLSAgdm9pZAotICBGVF9Jbml0X0NsYXNzX3R0X3NlcnZpY2VfZ3hfbXVsdGlfbWFzdGVycygKLSAgICBGVF9TZXJ2aWNlX011bHRpTWFzdGVyc1JlYyogIHN2X21tICk7Ci0gIHZvaWQKLSAgRlRfSW5pdF9DbGFzc190dF9zZXJ2aWNlX3RydWV0eXBlX2dseWYoCi0gICAgRlRfU2VydmljZV9UVEdseWZSZWMqICBzdl90dGdseWYgKTsKLQotCi0gIHZvaWQKLSAgdHRfZHJpdmVyX2NsYXNzX3BpY19mcmVlKCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfTWVtb3J5ICAgICAgICAgIG1lbW9yeSAgICAgICAgPSBsaWJyYXJ5LT5tZW1vcnk7Ci0KLQotICAgIGlmICggcGljX2NvbnRhaW5lci0+dHJ1ZXR5cGUgKQotICAgIHsKLSAgICAgIFRUTW9kdWxlUElDKiAgY29udGFpbmVyID0gKFRUTW9kdWxlUElDKilwaWNfY29udGFpbmVyLT50cnVldHlwZTsKLQotCi0gICAgICBpZiAoIGNvbnRhaW5lci0+dHRfc2VydmljZXMgKQotICAgICAgICBGVF9EZXN0cm95X0NsYXNzX3R0X3NlcnZpY2VzKCBsaWJyYXJ5LCBjb250YWluZXItPnR0X3NlcnZpY2VzICk7Ci0gICAgICBjb250YWluZXItPnR0X3NlcnZpY2VzID0gTlVMTDsKLSAgICAgIEZUX0ZSRUUoIGNvbnRhaW5lciApOwotICAgICAgcGljX2NvbnRhaW5lci0+dHJ1ZXR5cGUgPSBOVUxMOwotICAgIH0KLSAgfQotCi0KLSAgRlRfRXJyb3IKLSAgdHRfZHJpdmVyX2NsYXNzX3BpY19pbml0KCBGVF9MaWJyYXJ5ICBsaWJyYXJ5ICkKLSAgewotICAgIEZUX1BJQ19Db250YWluZXIqICBwaWNfY29udGFpbmVyID0gJmxpYnJhcnktPnBpY19jb250YWluZXI7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgIGVycm9yICAgICAgICAgPSBGVF9FcnJfT2s7Ci0gICAgVFRNb2R1bGVQSUMqICAgICAgIGNvbnRhaW5lciAgICAgPSBOVUxMOwotICAgIEZUX01lbW9yeSAgICAgICAgICBtZW1vcnkgICAgICAgID0gbGlicmFyeS0+bWVtb3J5OwotCi0KLSAgICAvKiBhbGxvY2F0ZSBwb2ludGVyLCBjbGVhciBhbmQgc2V0IGdsb2JhbCBjb250YWluZXIgcG9pbnRlciAqLwotICAgIGlmICggRlRfQUxMT0MoIGNvbnRhaW5lciwgc2l6ZW9mICggKmNvbnRhaW5lciApICkgKQotICAgICAgcmV0dXJuIGVycm9yOwotICAgIEZUX01FTV9TRVQoIGNvbnRhaW5lciwgMCwgc2l6ZW9mICggKmNvbnRhaW5lciApICk7Ci0gICAgcGljX2NvbnRhaW5lci0+dHJ1ZXR5cGUgPSBjb250YWluZXI7Ci0KLSAgICAvKiBpbml0aWFsaXplIHBvaW50ZXIgdGFibGUgLSB0aGlzIGlzIGhvdyB0aGUgbW9kdWxlIHVzdWFsbHkgKi8KLSAgICAvKiBleHBlY3RzIHRoaXMgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBlcnJvciA9IEZUX0NyZWF0ZV9DbGFzc190dF9zZXJ2aWNlcyggbGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRhaW5lci0+dHRfc2VydmljZXMgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLSNpZmRlZiBUVF9DT05GSUdfT1BUSU9OX0dYX1ZBUl9TVVBQT1JUCi0gICAgRlRfSW5pdF9DbGFzc190dF9zZXJ2aWNlX2d4X211bHRpX21hc3RlcnMoCi0gICAgICAmY29udGFpbmVyLT50dF9zZXJ2aWNlX2d4X211bHRpX21hc3RlcnMgKTsKLSNlbmRpZgotICAgIEZUX0luaXRfQ2xhc3NfdHRfc2VydmljZV90cnVldHlwZV9nbHlmKAotICAgICAgJmNvbnRhaW5lci0+dHRfc2VydmljZV90cnVldHlwZV9nbHlmICk7Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIHR0X2RyaXZlcl9jbGFzc19waWNfZnJlZSggbGlicmFyeSApOwotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9QSUMgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dHBpYy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0cGljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NmFlNTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0cGljLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dHBpYy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIEZyZWVUeXBlIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUgc2VydmljZXMgZm9yIHRydWV0eXBlIG1vZHVsZS4gKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDIwMDktMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE9yYW4gQWdyYSBhbmQgTWlja2V5IEdhYmVsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19UVFBJQ19IX18KLSNkZWZpbmUgX19UVFBJQ19IX18KLQotCi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QSUNfSAotCi0KLSNpZm5kZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLQotI2RlZmluZSBUVF9TRVJWSUNFU19HRVQgICAgICAgICAgICAgICAgICB0dF9zZXJ2aWNlcwotI2RlZmluZSBUVF9TRVJWSUNFX0dYX01VTFRJX01BU1RFUlNfR0VUICB0dF9zZXJ2aWNlX2d4X211bHRpX21hc3RlcnMKLSNkZWZpbmUgVFRfU0VSVklDRV9UUlVFVFlQRV9HTFlGX0dFVCAgICAgdHRfc2VydmljZV90cnVldHlwZV9nbHlmCi0jZGVmaW5lIFRUX1NFUlZJQ0VfUFJPUEVSVElFU19HRVQgICAgICAgIHR0X3NlcnZpY2VfcHJvcGVydGllcwotCi0jZWxzZSAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0jaW5jbHVkZSBGVF9NVUxUSVBMRV9NQVNURVJTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfTVVMVElQTEVfTUFTVEVSU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1RSVUVUWVBFX0dMWUZfSAotI2luY2x1ZGUgRlRfU0VSVklDRV9QUk9QRVJUSUVTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotICB0eXBlZGVmIHN0cnVjdCAgVFRNb2R1bGVQSUNfCi0gIHsKLSAgICBGVF9TZXJ2aWNlRGVzY1JlYyogICAgICAgICAgdHRfc2VydmljZXM7Ci0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9HWF9WQVJfU1VQUE9SVAotICAgIEZUX1NlcnZpY2VfTXVsdGlNYXN0ZXJzUmVjICB0dF9zZXJ2aWNlX2d4X211bHRpX21hc3RlcnM7Ci0jZW5kaWYKLSAgICBGVF9TZXJ2aWNlX1RUR2x5ZlJlYyAgICAgICAgdHRfc2VydmljZV90cnVldHlwZV9nbHlmOwotICAgIEZUX1NlcnZpY2VfUHJvcGVydGllc1JlYyAgICB0dF9zZXJ2aWNlX3Byb3BlcnRpZXM7Ci0KLSAgfSBUVE1vZHVsZVBJQzsKLQotCi0jZGVmaW5lIEdFVF9QSUMoIGxpYiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCAoVFRNb2R1bGVQSUMqKSgobGliKS0+cGljX2NvbnRhaW5lci50cnVldHlwZSkgKQotI2RlZmluZSBUVF9TRVJWSUNFU19HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+dHRfc2VydmljZXMgKQotI2RlZmluZSBUVF9TRVJWSUNFX0dYX01VTFRJX01BU1RFUlNfR0VUICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKCBHRVRfUElDKCBsaWJyYXJ5ICktPnR0X3NlcnZpY2VfZ3hfbXVsdGlfbWFzdGVycyApCi0jZGVmaW5lIFRUX1NFUlZJQ0VfVFJVRVRZUEVfR0xZRl9HRVQgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAoIEdFVF9QSUMoIGxpYnJhcnkgKS0+dHRfc2VydmljZV90cnVldHlwZV9nbHlmICkKLSNkZWZpbmUgVFRfU0VSVklDRV9QUk9QRVJUSUVTX0dFVCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICggR0VUX1BJQyggbGlicmFyeSApLT50dF9zZXJ2aWNlX3Byb3BlcnRpZXMgKQotCi0KLSAgLyogc2VlIHR0cGljLmMgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiAqLwotICB2b2lkCi0gIHR0X2RyaXZlcl9jbGFzc19waWNfZnJlZSggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi0gIEZUX0Vycm9yCi0gIHR0X2RyaXZlcl9jbGFzc19waWNfaW5pdCggRlRfTGlicmFyeSAgbGlicmFyeSApOwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX1BJQyAqLwotCi0gLyogKi8KLQotI2VuZGlmIC8qIF9fVFRQSUNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRwbG9hZC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0cGxvYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY0N2M5My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRwbG9hZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHR0cGxvYWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcnVlVHlwZS1zcGVjaWZpYyB0YWJsZXMgbG9hZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9PQkpFQ1RTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9UQUdTX0gKLQotI2luY2x1ZGUgInR0cGxvYWQuaCIKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSNpbmNsdWRlICJ0dGd4dmFyLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgInR0ZXJyb3JzLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90dHBsb2FkCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICB0dF9mYWNlX2xvYWRfbG9jYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBMb2FkIHRoZSBsb2NhdGlvbnMgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbk91dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBmYWNlICAgOjogQSBoYW5kbGUgdG8gdGhlIHRhcmdldCBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxJbnB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gOjogVGhlIGlucHV0IHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxSZXR1cm4+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBGcmVlVHlwZSBlcnJvciBjb2RlLiAgMCBtZWFucyBzdWNjZXNzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfbG9jYSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfRXJyb3IgIGVycm9yOwotICAgIEZUX1VMb25nICB0YWJsZV9sZW47Ci0gICAgRlRfSW50ICAgIHNoaWZ0OwotCi0KLSAgICAvKiB3ZSBuZWVkIHRoZSBzaXplIG9mIHRoZSBgZ2x5ZicgdGFibGUgZm9yIG1hbGZvcm1lZCBgbG9jYScgdGFibGVzICovCi0gICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2dseWYsIHN0cmVhbSwgJmZhY2UtPmdseWZfbGVuICk7Ci0KLSAgICAvKiBpdCBpcyBwb3NzaWJsZSB0aGF0IGEgZm9udCBkb2Vzbid0IGhhdmUgYSBnbHlmIHRhYmxlIGF0IGFsbCAqLwotICAgIC8qIG9yIGl0cyBzaXplIGlzIHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBGVF9FUlJfRVEoIGVycm9yLCBUYWJsZV9NaXNzaW5nICkgKQotICAgICAgZmFjZS0+Z2x5Zl9sZW4gPSAwOwotICAgIGVsc2UgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBGVF9UUkFDRTIoKCAiTG9jYXRpb25zICIgKSk7Ci0gICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2xvY2EsIHN0cmVhbSwgJnRhYmxlX2xlbiApOwotICAgIGlmICggZXJyb3IgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIExvY2F0aW9uc19NaXNzaW5nICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgaWYgKCBmYWNlLT5oZWFkZXIuSW5kZXhfVG9fTG9jX0Zvcm1hdCAhPSAwICkKLSAgICB7Ci0gICAgICBzaGlmdCA9IDI7Ci0KLSAgICAgIGlmICggdGFibGVfbGVuID49IDB4NDAwMDBMICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UyKCggInRhYmxlIHRvbyBsYXJnZVxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9UYWJsZSApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgICBmYWNlLT5udW1fbG9jYXRpb25zID0gdGFibGVfbGVuID4+IHNoaWZ0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgc2hpZnQgPSAxOwotCi0gICAgICBpZiAoIHRhYmxlX2xlbiA+PSAweDIwMDAwTCApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMigoICJ0YWJsZSB0b28gbGFyZ2VcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfVGFibGUgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotICAgICAgZmFjZS0+bnVtX2xvY2F0aW9ucyA9IHRhYmxlX2xlbiA+PiBzaGlmdDsKLSAgICB9Ci0KLSAgICBpZiAoIGZhY2UtPm51bV9sb2NhdGlvbnMgIT0gKEZUX1VMb25nKWZhY2UtPnJvb3QubnVtX2dseXBocyArIDEgKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMigoICJnbHlwaCBjb3VudCBtaXNtYXRjaCEgIGxvY2E6ICVkLCBtYXhwOiAlZFxuIiwKLSAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV9sb2NhdGlvbnMgLSAxLCBmYWNlLT5yb290Lm51bV9nbHlwaHMgKSk7Ci0KLSAgICAgIC8qIHdlIG9ubHkgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGBtYXhwJyBnaXZlcyBhIGxhcmdlciB2YWx1ZSAqLwotICAgICAgaWYgKCBmYWNlLT5udW1fbG9jYXRpb25zIDw9IChGVF9VTG9uZylmYWNlLT5yb290Lm51bV9nbHlwaHMgKQotICAgICAgewotICAgICAgICBGVF9VTG9uZyAgbmV3X2xvY2FfbGVuID0KLSAgICAgICAgICAgICAgICAgICAgKCAoRlRfVUxvbmcpZmFjZS0+cm9vdC5udW1fZ2x5cGhzICsgMSApIDw8IHNoaWZ0OwotCi0gICAgICAgIFRUX1RhYmxlICBlbnRyeSA9IGZhY2UtPmRpcl90YWJsZXM7Ci0gICAgICAgIFRUX1RhYmxlICBsaW1pdCA9IGVudHJ5ICsgZmFjZS0+bnVtX3RhYmxlczsKLQotICAgICAgICBGVF9Mb25nICAgcG9zICA9IChGVF9Mb25nKUZUX1NUUkVBTV9QT1MoKTsKLSAgICAgICAgRlRfTG9uZyAgIGRpc3QgPSAweDdGRkZGRkZGTDsKLQotCi0gICAgICAgIC8qIGNvbXB1dGUgdGhlIGRpc3RhbmNlIHRvIG5leHQgdGFibGUgaW4gZm9udCBmaWxlICovCi0gICAgICAgIGZvciAoIDsgZW50cnkgPCBsaW1pdDsgZW50cnkrKyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Mb25nICBkaWZmID0gKEZUX0xvbmcpZW50cnktPk9mZnNldCAtIHBvczsKLQotCi0gICAgICAgICAgaWYgKCBkaWZmID4gMCAmJiBkaWZmIDwgZGlzdCApCi0gICAgICAgICAgICBkaXN0ID0gZGlmZjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZW50cnkgPT0gbGltaXQgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogYGxvY2EnIGlzIHRoZSBsYXN0IHRhYmxlICovCi0gICAgICAgICAgZGlzdCA9IChGVF9Mb25nKXN0cmVhbS0+c2l6ZSAtIHBvczsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggbmV3X2xvY2FfbGVuIDw9IChGVF9VTG9uZylkaXN0ICkKLSAgICAgICAgewotICAgICAgICAgIGZhY2UtPm51bV9sb2NhdGlvbnMgPSAoRlRfVUxvbmcpZmFjZS0+cm9vdC5udW1fZ2x5cGhzICsgMTsKLSAgICAgICAgICB0YWJsZV9sZW4gICAgICAgICAgID0gbmV3X2xvY2FfbGVuOwotCi0gICAgICAgICAgRlRfVFJBQ0UyKCggImFkanVzdGluZyBudW1fbG9jYXRpb25zIHRvICVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPm51bV9sb2NhdGlvbnMgKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZmFjZS0+cm9vdC5udW1fZ2x5cGhzID0gZmFjZS0+bnVtX2xvY2F0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoRlRfTG9uZylmYWNlLT5udW1fbG9jYXRpb25zIC0gMSA6IDA7Ci0KLSAgICAgICAgICBGVF9UUkFDRTIoKCAiYWRqdXN0aW5nIG51bV9nbHlwaHMgdG8gJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgZmFjZS0+cm9vdC5udW1fZ2x5cGhzICkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBFeHRyYWN0IHRoZSBmcmFtZS4gIFdlIGRvbid0IG5lZWQgdG8gZGVjb21wcmVzcyBpdCBzaW5jZQotICAgICAqIHdlIGFyZSBhYmxlIHRvIHBhcnNlIGl0IGRpcmVjdGx5LgotICAgICAqLwotICAgIGlmICggRlRfRlJBTUVfRVhUUkFDVCggdGFibGVfbGVuLCBmYWNlLT5nbHlwaF9sb2NhdGlvbnMgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBGVF9UUkFDRTIoKCAibG9hZGVkXG4iICkpOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX1VMb25nICkKLSAgdHRfZmFjZV9nZXRfbG9jYXRpb24oIFRUX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgIGdpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICphc2l6ZSApCi0gIHsKLSAgICBGVF9VTG9uZyAgcG9zMSwgcG9zMjsKLSAgICBGVF9CeXRlKiAgcDsKLSAgICBGVF9CeXRlKiAgcF9saW1pdDsKLQotCi0gICAgcG9zMSA9IHBvczIgPSAwOwotCi0gICAgaWYgKCBnaW5kZXggPCBmYWNlLT5udW1fbG9jYXRpb25zICkKLSAgICB7Ci0gICAgICBpZiAoIGZhY2UtPmhlYWRlci5JbmRleF9Ub19Mb2NfRm9ybWF0ICE9IDAgKQotICAgICAgewotICAgICAgICBwICAgICAgID0gZmFjZS0+Z2x5cGhfbG9jYXRpb25zICsgZ2luZGV4ICogNDsKLSAgICAgICAgcF9saW1pdCA9IGZhY2UtPmdseXBoX2xvY2F0aW9ucyArIGZhY2UtPm51bV9sb2NhdGlvbnMgKiA0OwotCi0gICAgICAgIHBvczEgPSBGVF9ORVhUX1VMT05HKCBwICk7Ci0gICAgICAgIHBvczIgPSBwb3MxOwotCi0gICAgICAgIGlmICggcCArIDQgPD0gcF9saW1pdCApCi0gICAgICAgICAgcG9zMiA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcCAgICAgICA9IGZhY2UtPmdseXBoX2xvY2F0aW9ucyArIGdpbmRleCAqIDI7Ci0gICAgICAgIHBfbGltaXQgPSBmYWNlLT5nbHlwaF9sb2NhdGlvbnMgKyBmYWNlLT5udW1fbG9jYXRpb25zICogMjsKLQotICAgICAgICBwb3MxID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICAgICAgcG9zMiA9IHBvczE7Ci0KLSAgICAgICAgaWYgKCBwICsgMiA8PSBwX2xpbWl0ICkKLSAgICAgICAgICBwb3MyID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLQotICAgICAgICBwb3MxIDw8PSAxOwotICAgICAgICBwb3MyIDw8PSAxOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIENoZWNrIGJyb2tlbiBsb2NhdGlvbiBkYXRhICovCi0gICAgaWYgKCBwb3MxID4gZmFjZS0+Z2x5Zl9sZW4gKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMSgoICJ0dF9mYWNlX2dldF9sb2NhdGlvbjoiCi0gICAgICAgICAgICAgICAgICAiIHRvbyBsYXJnZSBvZmZzZXQ9MHglMDhseCBmb3VuZCBmb3IgZ2lkPTB4JTA0bHgsIgotICAgICAgICAgICAgICAgICAgIiBleGNlZWRpbmcgdGhlIGVuZCBvZiBnbHlmIHRhYmxlICgweCUwOGx4KVxuIiwKLSAgICAgICAgICAgICAgICAgIHBvczEsIGdpbmRleCwgZmFjZS0+Z2x5Zl9sZW4gKSk7Ci0gICAgICAqYXNpemUgPSAwOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgaWYgKCBwb3MyID4gZmFjZS0+Z2x5Zl9sZW4gKQotICAgIHsKLSAgICAgIEZUX1RSQUNFMSgoICJ0dF9mYWNlX2dldF9sb2NhdGlvbjoiCi0gICAgICAgICAgICAgICAgICAiIHRvbyBsYXJnZSBvZmZzZXQ9MHglMDhseCBmb3VuZCBmb3IgZ2lkPTB4JTA0bHgsIgotICAgICAgICAgICAgICAgICAgIiB0cnVuY2F0ZSBhdCB0aGUgZW5kIG9mIGdseWYgdGFibGUgKDB4JTA4bHgpXG4iLAotICAgICAgICAgICAgICAgICAgcG9zMiwgZ2luZGV4ICsgMSwgZmFjZS0+Z2x5Zl9sZW4gKSk7Ci0gICAgICBwb3MyID0gZmFjZS0+Z2x5Zl9sZW47Ci0gICAgfQotCi0gICAgLyogVGhlIGBsb2NhJyB0YWJsZSBtdXN0IGJlIG9yZGVyZWQ7IGl0IHJlZmVycyB0byB0aGUgbGVuZ3RoIG9mICovCi0gICAgLyogYW4gZW50cnkgYXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBhbmQgdGhlIG5leHQgICovCi0gICAgLyogcG9zaXRpb24uICBIb3dldmVyLCB0aGVyZSBkbyBleGlzdCAobWFsZm9ybWVkKSBmb250cyB3aGljaCAgICovCi0gICAgLyogZG9uJ3Qgb2JleSB0aGlzIHJ1bGUsIHNvIHdlIGFyZSBvbmx5IGFibGUgdG8gcHJvdmlkZSBhbiAgICAgICovCi0gICAgLyogdXBwZXIgYm91bmQgZm9yIHRoZSBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogV2UgZ2V0IChpbnRlbnRpb25hbGx5KSBhIHdyb25nLCBub24temVybyByZXN1bHQgaW4gY2FzZSB0aGUgICovCi0gICAgLyogYGdseWYnIHRhYmxlIGlzIG1pc3NpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBwb3MyID49IHBvczEgKQotICAgICAgKmFzaXplID0gKEZUX1VJbnQpKCBwb3MyIC0gcG9zMSApOwotICAgIGVsc2UKLSAgICAgICphc2l6ZSA9IChGVF9VSW50KSggZmFjZS0+Z2x5Zl9sZW4gLSBwb3MxICk7Ci0KLSAgICByZXR1cm4gcG9zMTsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgdHRfZmFjZV9kb25lX2xvY2EoIFRUX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfU3RyZWFtICBzdHJlYW0gPSBmYWNlLT5yb290LnN0cmVhbTsKLQotCi0gICAgRlRfRlJBTUVfUkVMRUFTRSggZmFjZS0+Z2x5cGhfbG9jYXRpb25zICk7Ci0gICAgZmFjZS0+bnVtX2xvY2F0aW9ucyA9IDA7Ci0gIH0KLQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX2N2dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCB0aGUgY29udHJvbCB2YWx1ZSB0YWJsZSBpbnRvIGEgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2N2dCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBGVF9VTG9uZyAgIHRhYmxlX2xlbjsKLQotCi0gICAgRlRfVFJBQ0UyKCggIkNWVCAiICkpOwotCi0gICAgZXJyb3IgPSBmYWNlLT5nb3RvX3RhYmxlKCBmYWNlLCBUVEFHX2N2dCwgc3RyZWFtLCAmdGFibGVfbGVuICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgewotICAgICAgRlRfVFJBQ0UyKCggImlzIG1pc3NpbmdcbiIgKSk7Ci0KLSAgICAgIGZhY2UtPmN2dF9zaXplID0gMDsKLSAgICAgIGZhY2UtPmN2dCAgICAgID0gTlVMTDsKLSAgICAgIGVycm9yICAgICAgICAgID0gRlRfRXJyX09rOwotCi0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgZmFjZS0+Y3Z0X3NpemUgPSB0YWJsZV9sZW4gLyAyOwotCi0gICAgaWYgKCBGVF9ORVdfQVJSQVkoIGZhY2UtPmN2dCwgZmFjZS0+Y3Z0X3NpemUgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIEZUX0ZSQU1FX0VOVEVSKCBmYWNlLT5jdnRfc2l6ZSAqIDJMICkgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgewotICAgICAgRlRfU2hvcnQqICBjdXIgICA9IGZhY2UtPmN2dDsKLSAgICAgIEZUX1Nob3J0KiAgbGltaXQgPSBjdXIgKyBmYWNlLT5jdnRfc2l6ZTsKLQotCi0gICAgICBmb3IgKCA7IGN1ciA8IGxpbWl0OyBjdXIrKyApCi0gICAgICAgICpjdXIgPSBGVF9HRVRfU0hPUlQoKTsKLSAgICB9Ci0KLSAgICBGVF9GUkFNRV9FWElUKCk7Ci0gICAgRlRfVFJBQ0UyKCggImxvYWRlZFxuIiApKTsKLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fR1hfVkFSX1NVUFBPUlQKLSAgICBpZiAoIGZhY2UtPmRvYmxlbmQgKQotICAgICAgZXJyb3IgPSB0dF9mYWNlX3ZhcnlfY3Z0KCBmYWNlLCBzdHJlYW0gKTsKLSNlbmRpZgotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotCi0jZWxzZSAvKiAhVFRfVVNFX0JZVEVDT0RFX0lOVEVSUFJFVEVSICovCi0KLSAgICBGVF9VTlVTRUQoIGZhY2UgICApOwotICAgIEZUX1VOVVNFRCggc3RyZWFtICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotCi0jZW5kaWYKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgdHRfZmFjZV9sb2FkX2ZwZ20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgTG9hZCB0aGUgZm9udCBwcm9ncmFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5PdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgZmFjZSBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2ZwZ20oIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotI2lmZGVmIFRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUgotCi0gICAgRlRfRXJyb3IgIGVycm9yOwotICAgIEZUX1VMb25nICB0YWJsZV9sZW47Ci0KLQotICAgIEZUX1RSQUNFMigoICJGb250IHByb2dyYW0gIiApKTsKLQotICAgIC8qIFRoZSBmb250IHByb2dyYW0gaXMgb3B0aW9uYWwgKi8KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfZnBnbSwgc3RyZWFtLCAmdGFibGVfbGVuICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgewotICAgICAgZmFjZS0+Zm9udF9wcm9ncmFtICAgICAgPSBOVUxMOwotICAgICAgZmFjZS0+Zm9udF9wcm9ncmFtX3NpemUgPSAwOwotICAgICAgZXJyb3IgICAgICAgICAgICAgICAgICAgPSBGVF9FcnJfT2s7Ci0KLSAgICAgIEZUX1RSQUNFMigoICJpcyBtaXNzaW5nXG4iICkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZmFjZS0+Zm9udF9wcm9ncmFtX3NpemUgPSB0YWJsZV9sZW47Ci0gICAgICBpZiAoIEZUX0ZSQU1FX0VYVFJBQ1QoIHRhYmxlX2xlbiwgZmFjZS0+Zm9udF9wcm9ncmFtICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgIEZUX1RSQUNFMigoICJsb2FkZWQsICUxMmQgYnl0ZXNcbiIsIGZhY2UtPmZvbnRfcHJvZ3JhbV9zaXplICkpOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLQotI2Vsc2UgLyogIVRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0gICAgRlRfVU5VU0VEKCBmYWNlICAgKTsKLSAgICBGVF9VTlVTRUQoIHN0cmVhbSApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLQotI2VuZGlmCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9wcmVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWQgdGhlIGN2dCBwcm9ncmFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSA6OiBBIGhhbmRsZSB0byB0aGUgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9wcmVwKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApCi0gIHsKLSNpZmRlZiBUVF9VU0VfQllURUNPREVfSU5URVJQUkVURVIKLQotICAgIEZUX0Vycm9yICBlcnJvcjsKLSAgICBGVF9VTG9uZyAgdGFibGVfbGVuOwotCi0KLSAgICBGVF9UUkFDRTIoKCAiUHJlcCBwcm9ncmFtICIgKSk7Ci0KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfcHJlcCwgc3RyZWFtLCAmdGFibGVfbGVuICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgewotICAgICAgZmFjZS0+Y3Z0X3Byb2dyYW0gICAgICA9IE5VTEw7Ci0gICAgICBmYWNlLT5jdnRfcHJvZ3JhbV9zaXplID0gMDsKLSAgICAgIGVycm9yICAgICAgICAgICAgICAgICAgPSBGVF9FcnJfT2s7Ci0KLSAgICAgIEZUX1RSQUNFMigoICJpcyBtaXNzaW5nXG4iICkpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZmFjZS0+Y3Z0X3Byb2dyYW1fc2l6ZSA9IHRhYmxlX2xlbjsKLSAgICAgIGlmICggRlRfRlJBTUVfRVhUUkFDVCggdGFibGVfbGVuLCBmYWNlLT5jdnRfcHJvZ3JhbSApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBGVF9UUkFDRTIoKCAibG9hZGVkLCAlMTJkIGJ5dGVzXG4iLCBmYWNlLT5jdnRfcHJvZ3JhbV9zaXplICkpOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLQotI2Vsc2UgLyogIVRUX1VTRV9CWVRFQ09ERV9JTlRFUlBSRVRFUiAqLwotCi0gICAgRlRfVU5VU0VEKCBmYWNlICAgKTsKLSAgICBGVF9VTlVTRUQoIHN0cmVhbSApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLQotI2VuZGlmCi0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHR0X2ZhY2VfbG9hZF9oZG14ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIExvYWQgdGhlIGBoZG14JyB0YWJsZSBpbnRvIHRoZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGZhY2Ugb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgc3RyZWFtIDo6IEEgaGFuZGxlIHRvIHRoZSBpbnB1dCBzdHJlYW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfaGRteCggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IHN0cmVhbS0+bWVtb3J5OwotICAgIEZUX1VJbnQgICAgdmVyc2lvbiwgbm4sIG51bV9yZWNvcmRzOwotICAgIEZUX1VMb25nICAgdGFibGVfc2l6ZSwgcmVjb3JkX3NpemU7Ci0gICAgRlRfQnl0ZSogICBwOwotICAgIEZUX0J5dGUqICAgbGltaXQ7Ci0KLQotICAgIC8qIHRoaXMgdGFibGUgaXMgb3B0aW9uYWwgKi8KLSAgICBlcnJvciA9IGZhY2UtPmdvdG9fdGFibGUoIGZhY2UsIFRUQUdfaGRteCwgc3RyZWFtLCAmdGFibGVfc2l6ZSApOwotICAgIGlmICggZXJyb3IgfHwgdGFibGVfc2l6ZSA8IDggKQotICAgICAgcmV0dXJuIEZUX0Vycl9PazsKLQotICAgIGlmICggRlRfRlJBTUVfRVhUUkFDVCggdGFibGVfc2l6ZSwgZmFjZS0+aGRteF90YWJsZSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIHAgICAgID0gZmFjZS0+aGRteF90YWJsZTsKLSAgICBsaW1pdCA9IHAgKyB0YWJsZV9zaXplOwotCi0gICAgdmVyc2lvbiAgICAgPSBGVF9ORVhUX1VTSE9SVCggcCApOwotICAgIG51bV9yZWNvcmRzID0gRlRfTkVYVF9VU0hPUlQoIHAgKTsKLSAgICByZWNvcmRfc2l6ZSA9IEZUX05FWFRfVUxPTkcoIHAgKTsKLQotICAgIC8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBpbiBhbiBoZG14IGRldmljZSByZWNvcmQgaXMgdGhlICovCi0gICAgLyogbWF4aW11bSBudW1iZXIgb2YgZ2x5cGhzICsgMjsgdGhpcyBpcyAweEZGRkYgKyAyLCB0aHVzICAgICAgKi8KLSAgICAvKiBleHBsYWluaW5nIHdoeSBgcmVjb3JkX3NpemUnIGlzIGEgbG9uZyAod2hpY2ggd2UgcmVhZCBhcyAgICAqLwotICAgIC8qIHVuc2lnbmVkIGxvbmcgZm9yIGNvbnZlbmllbmNlKS4gIEluIHByYWN0aWNlLCB0d28gYnl0ZXMgYXJlICovCi0gICAgLyogc3VmZmljaWVudCB0byBob2xkIHRoZSBzaXplIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIFRoZXJlIGFyZSBhdCBsZWFzdCB0d28gZm9udHMsIEhBTk5PTS1BIGFuZCBIQU5OT00tQiB2ZXJzaW9uICovCi0gICAgLyogMi4wICgyMDA1KSwgd2hpY2ggZ2V0IHRoaXMgd3Jvbmc6IFRoZSB1cHBlciB0d28gYnl0ZXMgb2YgICAgKi8KLSAgICAvKiB0aGUgc2l6ZSB2YWx1ZSBhcmUgc2V0IHRvIDB4RkYgaW5zdGVhZCBvZiAweDAwLiAgV2UgY2F0Y2ggICAqLwotICAgIC8qIGFuZCBmaXggdGhpcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICBpZiAoIHJlY29yZF9zaXplID49IDB4RkZGRjAwMDBVTCApCi0gICAgICByZWNvcmRfc2l6ZSAmPSAweEZGRkZVOwotCi0gICAgLyogVGhlIGxpbWl0IGZvciBgbnVtX3JlY29yZHMnIGlzIGEgaGV1cmlzdGljIHZhbHVlLiAqLwotICAgIGlmICggdmVyc2lvbiAhPSAwICAgICAgICAgICB8fAotICAgICAgICAgbnVtX3JlY29yZHMgPiAyNTUgICAgICB8fAotICAgICAgICAgcmVjb3JkX3NpemUgPiAweDEwMDAxTCB8fAotICAgICAgICAgcmVjb3JkX3NpemUgPCA0ICAgICAgICApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgIGlmICggRlRfTkVXX0FSUkFZKCBmYWNlLT5oZG14X3JlY29yZF9zaXplcywgbnVtX3JlY29yZHMgKSApCi0gICAgICBnb3RvIEZhaWw7Ci0KLSAgICBmb3IgKCBubiA9IDA7IG5uIDwgbnVtX3JlY29yZHM7IG5uKysgKQotICAgIHsKLSAgICAgIGlmICggcCArIHJlY29yZF9zaXplID4gbGltaXQgKQotICAgICAgICBicmVhazsKLQotICAgICAgZmFjZS0+aGRteF9yZWNvcmRfc2l6ZXNbbm5dID0gcFswXTsKLSAgICAgIHAgICAgICAgICAgICAgICAgICAgICAgICAgICs9IHJlY29yZF9zaXplOwotICAgIH0KLQotICAgIGZhY2UtPmhkbXhfcmVjb3JkX2NvdW50ID0gbm47Ci0gICAgZmFjZS0+aGRteF90YWJsZV9zaXplICAgPSB0YWJsZV9zaXplOwotICAgIGZhY2UtPmhkbXhfcmVjb3JkX3NpemUgID0gcmVjb3JkX3NpemU7Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgRmFpbDoKLSAgICBGVF9GUkFNRV9SRUxFQVNFKCBmYWNlLT5oZG14X3RhYmxlICk7Ci0gICAgZmFjZS0+aGRteF90YWJsZV9zaXplID0gMDsKLSAgICBnb3RvIEV4aXQ7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHR0X2ZhY2VfZnJlZV9oZG14KCBUVF9GYWNlICBmYWNlICkKLSAgewotICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gZmFjZS0+cm9vdC5zdHJlYW07Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLQotCi0gICAgRlRfRlJFRSggZmFjZS0+aGRteF9yZWNvcmRfc2l6ZXMgKTsKLSAgICBGVF9GUkFNRV9SRUxFQVNFKCBmYWNlLT5oZG14X3RhYmxlICk7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogUmV0dXJuIHRoZSBhZHZhbmNlIHdpZHRoIHRhYmxlIGZvciBhIGdpdmVuIHBpeGVsIHNpemUgaWYgaXQgaXMgZm91bmQgICovCi0gIC8qIGluIHRoZSBmb250J3MgYGhkbXgnIHRhYmxlIChpZiBhbnkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9CeXRlKiApCi0gIHR0X2ZhY2VfZ2V0X2RldmljZV9tZXRyaWNzKCBUVF9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgcHBlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgIGdpbmRleCApCi0gIHsKLSAgICBGVF9VSW50ICAgbm47Ci0gICAgRlRfQnl0ZSogIHJlc3VsdCAgICAgID0gTlVMTDsKLSAgICBGVF9VTG9uZyAgcmVjb3JkX3NpemUgPSBmYWNlLT5oZG14X3JlY29yZF9zaXplOwotICAgIEZUX0J5dGUqICByZWNvcmQgICAgICA9IGZhY2UtPmhkbXhfdGFibGUgKyA4OwotCi0KLSAgICBmb3IgKCBubiA9IDA7IG5uIDwgZmFjZS0+aGRteF9yZWNvcmRfY291bnQ7IG5uKysgKQotICAgICAgaWYgKCBmYWNlLT5oZG14X3JlY29yZF9zaXplc1tubl0gPT0gcHBlbSApCi0gICAgICB7Ci0gICAgICAgIGdpbmRleCArPSAyOwotICAgICAgICBpZiAoIGdpbmRleCA8IHJlY29yZF9zaXplICkKLSAgICAgICAgICByZXN1bHQgPSByZWNvcmQgKyBubiAqIHJlY29yZF9zaXplICsgZ2luZGV4OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dHBsb2FkLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRwbG9hZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzkyMzY5Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dHBsb2FkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0dHBsb2FkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHJ1ZVR5cGUtc3BlY2lmaWMgdGFibGVzIGxvYWRlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19UVFBMT0FEX0hfXwotI2RlZmluZSBfX1RUUExPQURfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9UUlVFVFlQRV9UWVBFU19ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfbG9jYSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotICBGVF9MT0NBTCggRlRfVUxvbmcgKQotICB0dF9mYWNlX2dldF9sb2NhdGlvbiggVFRfRmFjZSAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgZ2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgKmFzaXplICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICB0dF9mYWNlX2RvbmVfbG9jYSggVFRfRmFjZSAgZmFjZSApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9jdnQoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICB0dF9mYWNlX2xvYWRfZnBnbSggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICBzdHJlYW0gKTsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIHR0X2ZhY2VfbG9hZF9wcmVwKCBUVF9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgdHRfZmFjZV9sb2FkX2hkbXgoIFRUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICk7Ci0KLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHR0X2ZhY2VfZnJlZV9oZG14KCBUVF9GYWNlICBmYWNlICk7Ci0KLQotICBGVF9MT0NBTCggRlRfQnl0ZSogKQotICB0dF9mYWNlX2dldF9kZXZpY2VfbWV0cmljcyggVFRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBwcGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBnaW5kZXggKTsKLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19UVFBMT0FEX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0c3VicGl4LmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRzdWJwaXguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzOTFlOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHJ1ZXR5cGUvdHRzdWJwaXguYworKysgL2Rldi9udWxsCkBAIC0xLDEwMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRzdWJwaXguYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlIFN1YnBpeGVsIEhpbnRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDEwLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9DQUxDX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TRk5UX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX1RBR1NfSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9UUlVFVFlQRV9EUklWRVJfSAotCi0jaW5jbHVkZSAidHRzdWJwaXguaCIKLQotCi0jaWZkZWYgVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGVzZSBydWxlcyBhZmZlY3QgaG93IHRoZSBUVCBJbnRlcnByZXRlciBkb2VzIGhpbnRpbmcsIHdpdGggdGhlICAgICAgKi8KLSAgLyogZ29hbCBvZiBkb2luZyBzdWJwaXhlbCBoaW50aW5nIGJ5IChpbiBnZW5lcmFsKSBpZ25vcmluZyB4IG1vdmVzLiAgICAgICovCi0gIC8qIFNvbWUgb2YgdGhlc2UgcnVsZXMgYXJlIGZpeGVzIHRoYXQgZ28gYWJvdmUgYW5kIGJleW9uZCB0aGUgICAgICAgICAgICAqLwotICAvKiBzdGF0ZWQgdGVjaG5pcXVlcyBpbiB0aGUgTVMgd2hpdGVwYXBlciBvbiBDbGVhcnR5cGUsIGR1ZSB0byAgICAgICAgICAgKi8KLSAgLyogYXJ0aWZhY3RzIGluIG1hbnkgZ2x5cGhzLiAgU28sIHRoZXNlIHJ1bGVzIG1ha2Ugc29tZSBnbHlwaHMgcmVuZGVyICAgICovCi0gIC8qIGJldHRlciB0aGFuIHRoZXkgZG8gaW4gdGhlIE1TIHJhc3Rlcml6ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIiIgc3RyaW5nIG9yIDAgaW50L2NoYXIgaW5kaWNhdGVzIHRvIGFwcGx5IHRvIGFsbCBnbHlwaHMuICAgICAgICAgICAgICovCi0gIC8qICItIiB1c2VkIGFzIGR1bW15IHBsYWNlaG9sZGVycywgYnV0IGFueSBub24tbWF0Y2hpbmcgc3RyaW5nIHdvcmtzLiAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogU29tZSBvZiB0aGlzIGNvdWxkIGFyZ3VhYmx5IGJlIGltcGxlbWVudGVkIGluIGZvbnRjb25maWcsIGhvd2V2ZXI6ICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgLSBGb250Y29uZmlnIGNhbid0IHNldCB0aGluZ3Mgb24gYSBnbHlwaC1ieS1nbHlwaCBiYXNpcy4gICAgICAgICAgICAgKi8KLSAgLyogIC0gVGhlIHR3ZWFrcyB0aGF0IGhhcHBlbiBoZXJlIGFyZSB2ZXJ5IGxvdy1sZXZlbCwgZnJvbSBhbiBhdmVyYWdlICAgICovCi0gIC8qICAgIHVzZXIncyBwb2ludCBvZiB2aWV3IGFuZCBhcmUgYmVzdCBpbXBsZW1lbnRlZCBpbiB0aGUgaGludGVyLiAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhlIGdvYWwgaXMgdG8gbWFrZSB0aGUgc3VicGl4ZWwgaGludGluZyB0ZWNobmlxdWVzIGFzIGdlbmVyYWxpemVkICAgICovCi0gIC8qIGFzIHBvc3NpYmxlIGFjcm9zcyBhbGwgZm9udHMgdG8gcHJldmVudCB0aGUgbmVlZCBmb3IgZXh0cmEgcnVsZXMgc3VjaCAqLwotICAvKiBhcyB0aGVzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBydWxlIHN0cnVjdHVyZSBpcyBkZXNpZ25lZCBzbyB0aGF0IGVudGlyZWx5IG5ldyBydWxlcyBjYW4gZWFzaWx5ICAqLwotICAvKiBiZSBhZGRlZCB3aGVuIGEgbmV3IGNvbXBhdGliaWxpdHkgZmVhdHVyZSBpcyBkaXNjb3ZlcmVkLiAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBydWxlIHN0cnVjdHVyZXMgY291bGQgYWxzbyB1c2Ugc29tZSBlbmhhbmNlbWVudCB0byBoYW5kbGUgcmFuZ2VzLiAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICoqKioqKioqKioqKioqKioqKiBXT1JLIElOIFBST0dSRVNTICoqKioqKioqKioqKioqKioqKiogICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gIC8qIFRoZXNlIGFyZSBgY2xhc3Nlcycgb2YgZm9udHMgdGhhdCBjYW4gYmUgZ3JvdXBlZCB0b2dldGhlciBhbmQgdXNlZCBpbiAqLwotICAvKiBydWxlcyBiZWxvdy4gIEEgYmxhbmsgZW50cnkgIiIgaXMgcmVxdWlyZWQgYXQgdGhlIGVuZCBvZiB0aGVzZSEgICAgICAgKi8KLSNkZWZpbmUgRkFNSUxZX0NMQVNTX1JVTEVTX1NJWkUgIDcKLQotICBzdGF0aWMgY29uc3QgU1BIX0ZvbnRfQ2xhc3MgIEZBTUlMWV9DTEFTU19SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtGQU1JTFlfQ0xBU1NfUlVMRVNfU0laRV0gPQotICB7Ci0gICAgeyAiTVMgTGVnYWN5IEZvbnRzIiwKLSAgICAgIHsgIkFoYXJvbmkiLAotICAgICAgICAiQW5kYWxlIE1vbm8iLAotICAgICAgICAiQW5kYWx1cyIsCi0gICAgICAgICJBbmdzYW5hIE5ldyIsCi0gICAgICAgICJBbmdzYW5hVVBDIiwKLSAgICAgICAgIkFyYWJpYyBUcmFuc3BhcmVudCIsCi0gICAgICAgICJBcmlhbCBCbGFjayIsCi0gICAgICAgICJBcmlhbCBOYXJyb3ciLAotICAgICAgICAiQXJpYWwgVW5pY29kZSBNUyIsCi0gICAgICAgICJBcmlhbCIsCi0gICAgICAgICJCYXRhbmciLAotICAgICAgICAiQnJvd2FsbGlhIE5ldyIsCi0gICAgICAgICJCcm93YWxsaWFVUEMiLAotICAgICAgICAiQ29taWMgU2FucyBNUyIsCi0gICAgICAgICJDb3JkaWEgTmV3IiwKLSAgICAgICAgIkNvcmRpYVVQQyIsCi0gICAgICAgICJDb3VyaWVyIE5ldyIsCi0gICAgICAgICJERkthaS1TQiIsCi0gICAgICAgICJEYXZpZCBUcmFuc3BhcmVudCIsCi0gICAgICAgICJEYXZpZCIsCi0gICAgICAgICJEaWxsZW5pYVVQQyIsCi0gICAgICAgICJFc3RyYW5nZWxvIEVkZXNzYSIsCi0gICAgICAgICJFdWNyb3NpYVVQQyIsCi0gICAgICAgICJGYW5nU29uZ19HQjIzMTIiLAotICAgICAgICAiRml4ZWQgTWlyaWFtIFRyYW5zcGFyZW50IiwKLSAgICAgICAgIkZyYW5rUnVlaGwiLAotICAgICAgICAiRnJhbmtsaW4gR290aGljIE1lZGl1bSIsCi0gICAgICAgICJGcmVlc2lhVVBDIiwKLSAgICAgICAgIkdhcmFtb25kIiwKLSAgICAgICAgIkdhdXRhbWkiLAotICAgICAgICAiR2VvcmdpYSIsCi0gICAgICAgICJHdWxpbSIsCi0gICAgICAgICJJbXBhY3QiLAotICAgICAgICAiSXJpc1VQQyIsCi0gICAgICAgICJKYXNtaW5lVVBDIiwKLSAgICAgICAgIkthaVRpX0dCMjMxMiIsCi0gICAgICAgICJLb2RjaGlhbmdVUEMiLAotICAgICAgICAiTGF0aGEiLAotICAgICAgICAiTGV2ZW5pbSBNVCIsCi0gICAgICAgICJMaWx5VVBDIiwKLSAgICAgICAgIkx1Y2lkYSBDb25zb2xlIiwKLSAgICAgICAgIkx1Y2lkYSBTYW5zIFVuaWNvZGUiLAotICAgICAgICAiTVMgR290aGljIiwKLSAgICAgICAgIk1TIE1pbmNobyIsCi0gICAgICAgICJNViBCb2xpIiwKLSAgICAgICAgIk1hbmdhbCIsCi0gICAgICAgICJNYXJsZXR0IiwKLSAgICAgICAgIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwKLSAgICAgICAgIk1pbmdsaXUiLAotICAgICAgICAiTWlyaWFtIEZpeGVkIiwKLSAgICAgICAgIk1pcmlhbSBUcmFuc3BhcmVudCIsCi0gICAgICAgICJNaXJpYW0iLAotICAgICAgICAiTmFya2lzaW0iLAotICAgICAgICAiUGFsYXRpbm8gTGlub3R5cGUiLAotICAgICAgICAiUmFhdmkiLAotICAgICAgICAiUm9kIFRyYW5zcGFyZW50IiwKLSAgICAgICAgIlJvZCIsCi0gICAgICAgICJTaHJ1dGkiLAotICAgICAgICAiU2ltSGVpIiwKLSAgICAgICAgIlNpbXBsaWZpZWQgQXJhYmljIEZpeGVkIiwKLSAgICAgICAgIlNpbXBsaWZpZWQgQXJhYmljIiwKLSAgICAgICAgIlNpbXN1biIsCi0gICAgICAgICJTeWxmYWVuIiwKLSAgICAgICAgIlN5bWJvbCIsCi0gICAgICAgICJUYWhvbWEiLAotICAgICAgICAiVGltZXMgTmV3IFJvbWFuIiwKLSAgICAgICAgIlRyYWRpdGlvbmFsIEFyYWJpYyIsCi0gICAgICAgICJUcmVidWNoZXQgTVMiLAotICAgICAgICAiVHVuZ2EiLAotICAgICAgICAiVmVyZGFuYSIsCi0gICAgICAgICJXZWJkaW5ncyIsCi0gICAgICAgICJXaW5nZGluZ3MiLAotICAgICAgICAiIiwKLSAgICAgIH0sCi0gICAgfSwKLSAgICB7ICJDb3JlIE1TIExlZ2FjeSBGb250cyIsCi0gICAgICB7ICJBcmlhbCBCbGFjayIsCi0gICAgICAgICJBcmlhbCBOYXJyb3ciLAotICAgICAgICAiQXJpYWwgVW5pY29kZSBNUyIsCi0gICAgICAgICJBcmlhbCIsCi0gICAgICAgICJDb21pYyBTYW5zIE1TIiwKLSAgICAgICAgIkNvdXJpZXIgTmV3IiwKLSAgICAgICAgIkdhcmFtb25kIiwKLSAgICAgICAgIkdlb3JnaWEiLAotICAgICAgICAiSW1wYWN0IiwKLSAgICAgICAgIkx1Y2lkYSBDb25zb2xlIiwKLSAgICAgICAgIkx1Y2lkYSBTYW5zIFVuaWNvZGUiLAotICAgICAgICAiTWljcm9zb2Z0IFNhbnMgU2VyaWYiLAotICAgICAgICAiUGFsYXRpbm8gTGlub3R5cGUiLAotICAgICAgICAiVGFob21hIiwKLSAgICAgICAgIlRpbWVzIE5ldyBSb21hbiIsCi0gICAgICAgICJUcmVidWNoZXQgTVMiLAotICAgICAgICAiVmVyZGFuYSIsCi0gICAgICAgICIiLAotICAgICAgfSwKLSAgICB9LAotICAgIHsgIkFwcGxlIExlZ2FjeSBGb250cyIsCi0gICAgICB7ICJHZW5ldmEiLAotICAgICAgICAiVGltZXMiLAotICAgICAgICAiTW9uYWNvIiwKLSAgICAgICAgIkNlbnR1cnkiLAotICAgICAgICAiQ2hhbGtib2FyZCIsCi0gICAgICAgICJMb2JzdGVyIiwKLSAgICAgICAgIkNlbnR1cnkgR290aGljIiwKLSAgICAgICAgIk9wdGltYSIsCi0gICAgICAgICJMdWNpZGEgR3JhbmRlIiwKLSAgICAgICAgIkdpbGwgU2FucyIsCi0gICAgICAgICJCYXNrZXJ2aWxsZSIsCi0gICAgICAgICJIZWx2ZXRpY2EiLAotICAgICAgICAiSGVsdmV0aWNhIE5ldWUiLAotICAgICAgICAiIiwKLSAgICAgIH0sCi0gICAgfSwKLSAgICB7ICJMZWdhY3kgU2FucyBGb250cyIsCi0gICAgICB7ICJBbmRhbGUgTW9ubyIsCi0gICAgICAgICJBcmlhbCBVbmljb2RlIE1TIiwKLSAgICAgICAgIkFyaWFsIiwKLSAgICAgICAgIkNlbnR1cnkgR290aGljIiwKLSAgICAgICAgIkNvbWljIFNhbnMgTVMiLAotICAgICAgICAiRnJhbmtsaW4gR290aGljIE1lZGl1bSIsCi0gICAgICAgICJHZW5ldmEiLAotICAgICAgICAiTHVjaWRhIENvbnNvbGUiLAotICAgICAgICAiTHVjaWRhIEdyYW5kZSIsCi0gICAgICAgICJMdWNpZGEgU2FucyBVbmljb2RlIiwKLSAgICAgICAgIkx1Y2lkYSBTYW5zIFR5cGV3cml0ZXIiLAotICAgICAgICAiTWljcm9zb2Z0IFNhbnMgU2VyaWYiLAotICAgICAgICAiTW9uYWNvIiwKLSAgICAgICAgIlRhaG9tYSIsCi0gICAgICAgICJUcmVidWNoZXQgTVMiLAotICAgICAgICAiVmVyZGFuYSIsCi0gICAgICAgICIiLAotICAgICAgfSwKLSAgICB9LAotCi0gICAgeyAiTWlzYyBMZWdhY3kgRm9udHMiLAotICAgICAgeyAiRGFyayBDb3VyaWVyIiwgIiIsIH0sIH0sCi0gICAgeyAiVmVyZGFuYSBDbG9uZXMiLAotICAgICAgeyAiRGVqYVZ1IFNhbnMiLAotICAgICAgICAiQml0c3RyZWFtIFZlcmEgU2FucyIsICIiLCB9LCB9LAotICAgIHsgIlZlcmRhbmEgYW5kIENsb25lcyIsCi0gICAgICB7ICJEZWphVnUgU2FucyIsCi0gICAgICAgICJCaXRzdHJlYW0gVmVyYSBTYW5zIiwKLSAgICAgICAgIlZlcmRhbmEiLCAiIiwgfSwgfSwKLSAgfTsKLQotCi0gIC8qIERlZmluZSB0aGlzIHRvIGZvcmNlIG5hdHVyYWwgKGkuZS4gbm90IGJpdG1hcC1jb21wYXRpYmxlKSB3aWR0aHMuICAgICAqLwotICAvKiBUaGUgZGVmYXVsdCBsZWFucyBzdHJvbmdseSB0b3dhcmRzIG5hdHVyYWwgd2lkdGhzIGV4Y2VwdCBmb3IgYSBmZXcgICAgKi8KLSAgLyogbGVnYWN5IGZvbnRzIHdoZXJlIGEgc2VsZWN0aXZlIGNvbWJpbmF0aW9uIHByb2R1Y2VzIG5pY2VyIHJlc3VsdHMuICAgICovCi0vKiAjZGVmaW5lIEZPUkNFX05BVFVSQUxfV0lEVEhTICAgKi8KLQotCi0gIC8qIERlZmluZSBgY2xhc3Nlcycgb2Ygc3R5bGVzIHRoYXQgY2FuIGJlIGdyb3VwZWQgdG9nZXRoZXIgYW5kIHVzZWQgaW4gICAqLwotICAvKiBydWxlcyBiZWxvdy4gIEEgYmxhbmsgZW50cnkgIiIgaXMgcmVxdWlyZWQgYXQgdGhlIGVuZCBvZiB0aGVzZSEgICAgICAgKi8KLSNkZWZpbmUgU1RZTEVfQ0xBU1NfUlVMRVNfU0laRSAgNQotCi0gIHN0YXRpYyBjb25zdCBTUEhfRm9udF9DbGFzcyAgU1RZTEVfQ0xBU1NfUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU1RZTEVfQ0xBU1NfUlVMRVNfU0laRV0gPQotICB7Ci0gICAgeyAiUmVndWxhciBDbGFzcyIsCi0gICAgICB7ICJSZWd1bGFyIiwKLSAgICAgICAgIkJvb2siLAotICAgICAgICAiTWVkaXVtIiwKLSAgICAgICAgIlJvbWFuIiwKLSAgICAgICAgIk5vcm1hbCIsCi0gICAgICAgICIiLAotICAgICAgfSwKLSAgICB9LAotICAgIHsgIlJlZ3VsYXIvSXRhbGljIENsYXNzIiwKLSAgICAgIHsgIlJlZ3VsYXIiLAotICAgICAgICAiQm9vayIsCi0gICAgICAgICJNZWRpdW0iLAotICAgICAgICAiSXRhbGljIiwKLSAgICAgICAgIk9ibGlxdWUiLAotICAgICAgICAiUm9tYW4iLAotICAgICAgICAiTm9ybWFsIiwKLSAgICAgICAgIiIsCi0gICAgICB9LAotICAgIH0sCi0gICAgeyAiQm9sZC9Cb2xkSXRhbGljIENsYXNzIiwKLSAgICAgIHsgIkJvbGQiLAotICAgICAgICAiQm9sZCBJdGFsaWMiLAotICAgICAgICAiQmxhY2siLAotICAgICAgICAiIiwKLSAgICAgIH0sCi0gICAgfSwKLSAgICB7ICJCb2xkL0l0YWxpYy9Cb2xkSXRhbGljIENsYXNzIiwKLSAgICAgIHsgIkJvbGQiLAotICAgICAgICAiQm9sZCBJdGFsaWMiLAotICAgICAgICAiQmxhY2siLAotICAgICAgICAiSXRhbGljIiwKLSAgICAgICAgIk9ibGlxdWUiLAotICAgICAgICAiIiwKLSAgICAgIH0sCi0gICAgfSwKLSAgICB7ICJSZWd1bGFyL0JvbGQgQ2xhc3MiLAotICAgICAgeyAiUmVndWxhciIsCi0gICAgICAgICJCb29rIiwKLSAgICAgICAgIk1lZGl1bSIsCi0gICAgICAgICJOb3JtYWwiLAotICAgICAgICAiUm9tYW4iLAotICAgICAgICAiQm9sZCIsCi0gICAgICAgICJCbGFjayIsCi0gICAgICAgICIiLAotICAgICAgfSwKLSAgICB9LAotICB9OwotCi0KLSAgLyogRm9yY2Ugc3BlY2lhbCBsZWdhY3kgZml4ZXMgZm9yIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIENPTVBBVElCSUxJVFlfTU9ERV9SVUxFU19TSVpFICAxCi0KLSAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIENPTVBBVElCSUxJVFlfTU9ERV9SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0NPTVBBVElCSUxJVFlfTU9ERV9SVUxFU19TSVpFXSA9Ci0gIHsKLSAgICB7ICJWZXJkYW5hIENsb25lcyIsIDAsICIiLCAwIH0sCi0gIH07Ci0KLQotICAvKiBEb24ndCBkbyBzdWJwaXhlbCAoaWdub3JlX3hfbW9kZSkgaGludGluZzsgZG8gbm9ybWFsIGhpbnRpbmcuICAgICAgICAgKi8KLSNkZWZpbmUgUElYRUxfSElOVElOR19SVUxFU19TSVpFICAyCi0KLSAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIFBJWEVMX0hJTlRJTkdfUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQSVhFTF9ISU5USU5HX1JVTEVTX1NJWkVdID0KLSAgewotICAgIC8qIHRoZXNlIGNoYXJhY3RlcnMgYXJlIGFsbW9zdCBhbHdheXMgc2FmZSAqLwotICAgIHsgIkNvdXJpZXIgTmV3IiwgMTIsICJJdGFsaWMiLCAneicgfSwKLSAgICB7ICJDb3VyaWVyIE5ldyIsIDExLCAiSXRhbGljIiwgJ3onIH0sCi0gIH07Ci0KLQotICAvKiBTdWJwaXhlbCBoaW50aW5nIGlnbm9yZXMgU0hQSVggcnVsZXMgb24gWC4gIEZvcmNlIFNIUElYIGZvciB0aGVzZS4gICAgKi8KLSNkZWZpbmUgRE9fU0hQSVhfUlVMRVNfU0laRSAgMQotCi0gIHN0YXRpYyBjb25zdCBTUEhfVHdlYWtSdWxlICBET19TSFBJWF9SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0RPX1NIUElYX1JVTEVTX1NJWkVdID0KLSAgewotICAgIHsgIi0iLCAwLCAiIiwgMCB9LAotICB9OwotCi0KLSAgLyogU2tpcCBZIG1vdmVzIHRoYXQgc3RhcnQgd2l0aCBhIHBvaW50IHRoYXQgaXMgbm90IG9uIGEgWSBwaXhlbCAgICAgICAgICovCi0gIC8qIGJvdW5kYXJ5IGFuZCBkb24ndCBtb3ZlIHRoYXQgcG9pbnQgdG8gYSBZIHBpeGVsIGJvdW5kYXJ5LiAgICAgICAgICAgICAqLwotI2RlZmluZSBTS0lQX05PTlBJWEVMX1lfTU9WRVNfUlVMRVNfU0laRSAgNAotCi0gIHN0YXRpYyBjb25zdCBTUEhfVHdlYWtSdWxlICBTS0lQX05PTlBJWEVMX1lfTU9WRVNfUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTS0lQX05PTlBJWEVMX1lfTU9WRVNfUlVMRVNfU0laRV0gPQotICB7Ci0gICAgLyogZml4IHZ3eHl6IHRoaW5uZXNzKi8KLSAgICB7ICJDb25zb2xhcyIsIDAsICIiLCAwIH0sCi0gICAgLyogRml4IHRoaW4gbWlkZGxlIHN0ZW1zICovCi0gICAgeyAiQ29yZSBNUyBMZWdhY3kgRm9udHMiLCAwLCAiUmVndWxhciIsIDAgfSwKLSAgICAvKiBDeXJpbGxpYyBzbWFsbCBsZXR0ZXIgSSAqLwotICAgIHsgIkxlZ2FjeSBTYW5zIEZvbnRzIiwgMCwgIiIsIDAgfSwKLSAgICAvKiBGaXggYXJ0aWZhY3RzIHdpdGggc29tZSBSZWd1bGFyICYgQm9sZCAqLwotICAgIHsgIlZlcmRhbmEgQ2xvbmVzIiwgMCwgIiIsIDAgfSwKLSAgfTsKLQotCi0jZGVmaW5lIFNLSVBfTk9OUElYRUxfWV9NT1ZFU19SVUxFU19FWENFUFRJT05TX1NJWkUgIDEKLQotICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgU0tJUF9OT05QSVhFTF9ZX01PVkVTX1J1bGVzX0V4Y2VwdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTS0lQX05PTlBJWEVMX1lfTU9WRVNfUlVMRVNfRVhDRVBUSU9OU19TSVpFXSA9Ci0gIHsKLSAgICAvKiBGaXhlcyA8IGFuZCA+ICovCi0gICAgeyAiQ291cmllciBOZXciLCAwLCAiUmVndWxhciIsIDAgfSwKLSAgfTsKLQotCi0gIC8qIFNraXAgWSBtb3ZlcyB0aGF0IHN0YXJ0IHdpdGggYSBwb2ludCB0aGF0IGlzIG5vdCBvbiBhIFkgcGl4ZWwgICAgICAgICAqLwotICAvKiBib3VuZGFyeSBhbmQgZG9uJ3QgbW92ZSB0aGF0IHBvaW50IHRvIGEgWSBwaXhlbCBib3VuZGFyeS4gICAgICAgICAgICAgKi8KLSNkZWZpbmUgU0tJUF9OT05QSVhFTF9ZX01PVkVTX0RFTFRBUF9SVUxFU19TSVpFICAyCi0KLSAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIFNLSVBfTk9OUElYRUxfWV9NT1ZFU19ERUxUQVBfUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTS0lQX05PTlBJWEVMX1lfTU9WRVNfREVMVEFQX1JVTEVTX1NJWkVdID0KLSAgewotICAgIC8qIE1haW50YWluIHRoaWNrbmVzcyBvZiBkaWFnb25hbCBpbiAnTicgKi8KLSAgICB7ICJUaW1lcyBOZXcgUm9tYW4iLCAwLCAiUmVndWxhci9Cb2xkIENsYXNzIiwgJ04nIH0sCi0gICAgeyAiR2VvcmdpYSIsIDAsICJSZWd1bGFyL0JvbGQgQ2xhc3MiLCAnTicgfSwKLSAgfTsKLQotCi0gIC8qIFNraXAgWSBtb3ZlcyB0aGF0IG1vdmUgYSBwb2ludCBvZmYgYSBZIHBpeGVsIGJvdW5kYXJ5LiAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBTS0lQX09GRlBJWEVMX1lfTU9WRVNfUlVMRVNfU0laRSAgMQotCi0gIHN0YXRpYyBjb25zdCBTUEhfVHdlYWtSdWxlICBTS0lQX09GRlBJWEVMX1lfTU9WRVNfUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTS0lQX09GRlBJWEVMX1lfTU9WRVNfUlVMRVNfU0laRV0gPQotICB7Ci0gICAgeyAiLSIsIDAsICIiLCAwIH0sCi0gIH07Ci0KLQotI2RlZmluZSBTS0lQX09GRlBJWEVMX1lfTU9WRVNfUlVMRVNfRVhDRVBUSU9OU19TSVpFICAxCi0KLSAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIFNLSVBfT0ZGUElYRUxfWV9NT1ZFU19SdWxlc19FeGNlcHRpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0tJUF9PRkZQSVhFTF9ZX01PVkVTX1JVTEVTX0VYQ0VQVElPTlNfU0laRV0gPQotICB7Ci0gICAgeyAiLSIsIDAsICIiLCAwIH0sCi0gIH07Ci0KLQotICAvKiBSb3VuZCBtb3ZlcyB0aGF0IGRvbid0IG1vdmUgYSBwb2ludCB0byBhIFkgcGl4ZWwgYm91bmRhcnkuICAgICAgICAgICAgKi8KLSNkZWZpbmUgUk9VTkRfTk9OUElYRUxfWV9NT1ZFU19SVUxFU19TSVpFICAyCi0KLSAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIFJPVU5EX05PTlBJWEVMX1lfTU9WRVNfUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtST1VORF9OT05QSVhFTF9ZX01PVkVTX1JVTEVTX1NJWkVdID0KLSAgewotICAgIC8qIERyb2lkIGZvbnQgaW5zdHJ1Y3Rpb25zIGRvbid0IHNuYXAgWSB0byBwaXhlbHMgKi8KLSAgICB7ICJEcm9pZCBTYW5zIiwgMCwgIlJlZ3VsYXIvSXRhbGljIENsYXNzIiwgMCB9LAotICAgIHsgIkRyb2lkIFNhbnMgTW9ubyIsIDAsICIiLCAwIH0sCi0gIH07Ci0KLQotI2RlZmluZSBST1VORF9OT05QSVhFTF9ZX01PVkVTX1JVTEVTX0VYQ0VQVElPTlNfU0laRSAgMQotCi0gIHN0YXRpYyBjb25zdCBTUEhfVHdlYWtSdWxlICBST1VORF9OT05QSVhFTF9ZX01PVkVTX1J1bGVzX0V4Y2VwdGlvbnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtST1VORF9OT05QSVhFTF9ZX01PVkVTX1JVTEVTX0VYQ0VQVElPTlNfU0laRV0gPQotICB7Ci0gICAgeyAiLSIsIDAsICIiLCAwIH0sCi0gIH07Ci0KLQotICAvKiBBbGxvdyBhIERpcmVjdF9Nb3ZlIGFsb25nIFggZnJlZWRvbSB2ZWN0b3IgaWYgbWF0Y2hlZC4gICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQUxMT1dfWF9ETU9WRV9SVUxFU19TSVpFICAxCi0KLSAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIEFMTE9XX1hfRE1PVkVfUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBTExPV19YX0RNT1ZFX1JVTEVTX1NJWkVdID0KLSAgewotICAgIC8qIEZpeGVzIHZhbmlzaGluZyBkaWFnb25hbCBpbiA0ICovCi0gICAgeyAiVmVyZGFuYSIsIDAsICJSZWd1bGFyIiwgJzQnIH0sCi0gIH07Ci0KLQotICAvKiBSZXR1cm4gTVMgcmFzdGVyaXplciB2ZXJzaW9uIDM1IGlmIG1hdGNoZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgUkFTVEVSSVpFUl8zNV9SVUxFU19TSVpFICA4Ci0KLSAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIFJBU1RFUklaRVJfMzVfUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtSQVNURVJJWkVSXzM1X1JVTEVTX1NJWkVdID0KLSAgewotICAgIC8qIFRoaXMgc2VlbXMgdG8gYmUgdGhlIG9ubHkgd2F5IHRvIG1ha2UgdGhlc2UgbG9vayBnb29kICovCi0gICAgeyAiVGltZXMgTmV3IFJvbWFuIiwgMCwgIlJlZ3VsYXIiLCAnaScgfSwKLSAgICB7ICJUaW1lcyBOZXcgUm9tYW4iLCAwLCAiUmVndWxhciIsICdqJyB9LAotICAgIHsgIlRpbWVzIE5ldyBSb21hbiIsIDAsICJSZWd1bGFyIiwgJ20nIH0sCi0gICAgeyAiVGltZXMgTmV3IFJvbWFuIiwgMCwgIlJlZ3VsYXIiLCAncicgfSwKLSAgICB7ICJUaW1lcyBOZXcgUm9tYW4iLCAwLCAiUmVndWxhciIsICdhJyB9LAotICAgIHsgIlRpbWVzIE5ldyBSb21hbiIsIDAsICJSZWd1bGFyIiwgJ24nIH0sCi0gICAgeyAiVGltZXMgTmV3IFJvbWFuIiwgMCwgIlJlZ3VsYXIiLCAncCcgfSwKLSAgICB7ICJUaW1lcyIsIDAsICIiLCAwIH0sCi0gIH07Ci0KLQotICAvKiBEb24ndCByb3VuZCB0byB0aGUgc3VicGl4ZWwgZ3JpZC4gIFJvdW5kIHRvIHBpeGVsIGdyaWQuICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTk9STUFMX1JPVU5EX1JVTEVTX1NJWkUgIDEKLQotICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgTk9STUFMX1JPVU5EX1J1bGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTk9STUFMX1JPVU5EX1JVTEVTX1NJWkVdID0KLSAgewotICAgIC8qIEZpeCBzZXJpZiB0aGlja25lc3MgZm9yIGNlcnRhaW4gcHBlbXMgKi8KLSAgICAvKiBDYW4gcHJvYmFibHkgYmUgZ2VuZXJhbGl6ZWQgc29tZWhvdyAgICovCi0gICAgeyAiQ291cmllciBOZXciLCAwLCAiIiwgMCB9LAotICB9OwotCi0KLSAgLyogU2tpcCBJVVAgaW5zdHJ1Y3Rpb25zIGlmIG1hdGNoZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIFNLSVBfSVVQX1JVTEVTX1NJWkUgIDEKLQotICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgU0tJUF9JVVBfUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTS0lQX0lVUF9SVUxFU19TSVpFXSA9Ci0gIHsKLSAgICB7ICJBcmlhbCIsIDEzLCAiUmVndWxhciIsICdhJyB9LAotICB9OwotCi0KLSAgLyogU2tpcCBNSUFQIFR3aWxpZ2h0IGhhY2sgaWYgbWF0Y2hlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE1JQVBfSEFDS19SVUxFU19TSVpFICAxCi0KLSAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIE1JQVBfSEFDS19SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW01JQVBfSEFDS19SVUxFU19TSVpFXSA9Ci0gIHsKLSAgICB7ICJHZW5ldmEiLCAxMiwgIiIsIDAgfSwKLSAgfTsKLQotCi0gIC8qIFNraXAgREVMVEFQIGluc3RydWN0aW9ucyBpZiBtYXRjaGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBBTFdBWVNfU0tJUF9ERUxUQVBfUlVMRVNfU0laRSAgMjMKLQotICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgQUxXQVlTX1NLSVBfREVMVEFQX1J1bGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQUxXQVlTX1NLSVBfREVMVEFQX1JVTEVTX1NJWkVdID0KLSAgewotICAgIHsgIkdlb3JnaWEiLCAwLCAiUmVndWxhciIsICdrJyB9LAotICAgIC8qIGZpeCB2YXJpb3VzIHByb2JsZW1zIHdpdGggZSBpbiBkaWZmZXJlbnQgdmVyc2lvbnMgKi8KLSAgICB7ICJUcmVidWNoZXQgTVMiLCAxNCwgIlJlZ3VsYXIiLCAnZScgfSwKLSAgICB7ICJUcmVidWNoZXQgTVMiLCAxMywgIlJlZ3VsYXIiLCAnZScgfSwKLSAgICB7ICJUcmVidWNoZXQgTVMiLCAxNSwgIlJlZ3VsYXIiLCAnZScgfSwKLSAgICB7ICJUcmVidWNoZXQgTVMiLCAwLCAiSXRhbGljIiwgJ3YnIH0sCi0gICAgeyAiVHJlYnVjaGV0IE1TIiwgMCwgIkl0YWxpYyIsICd3JyB9LAotICAgIHsgIlRyZWJ1Y2hldCBNUyIsIDAsICJSZWd1bGFyIiwgJ1knIH0sCi0gICAgeyAiQXJpYWwiLCAxMSwgIlJlZ3VsYXIiLCAncycgfSwKLSAgICAvKiBwcmV2ZW50IHByb2JsZW1zIHdpdGggJzMnIGFuZCBvdGhlcnMgKi8KLSAgICB7ICJWZXJkYW5hIiwgMTAsICJSZWd1bGFyIiwgMCB9LAotICAgIHsgIlZlcmRhbmEiLCA5LCAiUmVndWxhciIsIDAgfSwKLSAgICAvKiBDeXJpbGxpYyBzbWFsbCBsZXR0ZXIgc2hvcnQgSSAqLwotICAgIHsgIkxlZ2FjeSBTYW5zIEZvbnRzIiwgMCwgIiIsIDB4NDM4IH0sCi0gICAgeyAiTGVnYWN5IFNhbnMgRm9udHMiLCAwLCAiIiwgMHg0MzkgfSwKLSAgICB7ICJBcmlhbCIsIDEwLCAiUmVndWxhciIsICc2JyB9LAotICAgIHsgIkFyaWFsIiwgMCwgIkJvbGQvQm9sZEl0YWxpYyBDbGFzcyIsICdhJyB9LAotICAgIC8qIE1ha2UgaG9yaXpvbnRhbCBzdGVtcyBjb25zaXN0ZW50IHdpdGggdGhlIHJlc3QgKi8KLSAgICB7ICJBcmlhbCIsIDI0LCAiQm9sZCIsICdhJyB9LAotICAgIHsgIkFyaWFsIiwgMjUsICJCb2xkIiwgJ2EnIH0sCi0gICAgeyAiQXJpYWwiLCAyNCwgIkJvbGQiLCAncycgfSwKLSAgICB7ICJBcmlhbCIsIDI1LCAiQm9sZCIsICdzJyB9LAotICAgIHsgIkFyaWFsIiwgMzQsICJCb2xkIiwgJ3MnIH0sCi0gICAgeyAiQXJpYWwiLCAzNSwgIkJvbGQiLCAncycgfSwKLSAgICB7ICJBcmlhbCIsIDM2LCAiQm9sZCIsICdzJyB9LAotICAgIHsgIkFyaWFsIiwgMjUsICJSZWd1bGFyIiwgJ3MnIH0sCi0gICAgeyAiQXJpYWwiLCAyNiwgIlJlZ3VsYXIiLCAncycgfSwKLSAgfTsKLQotCi0gIC8qIEFsd2F5cyBkbyBERUxUQVAgaW5zdHJ1Y3Rpb25zIGlmIG1hdGNoZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBBTFdBWVNfRE9fREVMVEFQX1JVTEVTX1NJWkUgIDEKLQotICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgQUxXQVlTX0RPX0RFTFRBUF9SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FMV0FZU19ET19ERUxUQVBfUlVMRVNfU0laRV0gPQotICB7Ci0gICAgeyAiLSIsIDAsICIiLCAwIH0sCi0gIH07Ci0KLQotICAvKiBEb24ndCBhbGxvdyBBTElHTlJQIGFmdGVyIElVUC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTk9fQUxJR05SUF9BRlRFUl9JVVBfUlVMRVNfU0laRSAgMQotCi0gIHN0YXRpYyBjb25zdCBTUEhfVHdlYWtSdWxlICBOT19BTElHTlJQX0FGVEVSX0lVUF9SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05PX0FMSUdOUlBfQUZURVJfSVVQX1JVTEVTX1NJWkVdID0KLSAgewotICAgIC8qIFByZXZlbnQgY3JlYXRpb24gb2YgZGVudHMgaW4gb3V0bGluZSAqLwotICAgIHsgIi0iLCAwLCAiIiwgMCB9LAotICB9OwotCi0KLSAgLyogRG9uJ3QgYWxsb3cgREVMVEFQIGFmdGVyIElVUC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIE5PX0RFTFRBUF9BRlRFUl9JVVBfUlVMRVNfU0laRSAgMQotCi0gIHN0YXRpYyBjb25zdCBTUEhfVHdlYWtSdWxlICBOT19ERUxUQVBfQUZURVJfSVVQX1J1bGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTk9fREVMVEFQX0FGVEVSX0lVUF9SVUxFU19TSVpFXSA9Ci0gIHsKLSAgICB7ICItIiwgMCwgIiIsIDAgfSwKLSAgfTsKLQotCi0gIC8qIERvbid0IGFsbG93IENBTEwgYWZ0ZXIgSVVQLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBOT19DQUxMX0FGVEVSX0lVUF9SVUxFU19TSVpFICAxCi0KLSAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIE5PX0NBTExfQUZURVJfSVVQX1J1bGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTk9fQ0FMTF9BRlRFUl9JVVBfUlVMRVNfU0laRV0gPQotICB7Ci0gICAgLyogUHJldmVudCBjcmVhdGlvbiBvZiBkZW50cyBpbiBvdXRsaW5lICovCi0gICAgeyAiLSIsIDAsICIiLCAwIH0sCi0gIH07Ci0KLQotICAvKiBEZS1lbWJvbGRlbiB0aGVzZSBnbHlwaHMgc2xpZ2h0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgREVFTUJPTERFTl9SVUxFU19TSVpFICA5Ci0KLSAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIERFRU1CT0xERU5fUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtERUVNQk9MREVOX1JVTEVTX1NJWkVdID0KLSAgewotICAgIHsgIkNvdXJpZXIgTmV3IiwgMCwgIkJvbGQiLCAnQScgfSwKLSAgICB7ICJDb3VyaWVyIE5ldyIsIDAsICJCb2xkIiwgJ1cnIH0sCi0gICAgeyAiQ291cmllciBOZXciLCAwLCAiQm9sZCIsICd3JyB9LAotICAgIHsgIkNvdXJpZXIgTmV3IiwgMCwgIkJvbGQiLCAnTScgfSwKLSAgICB7ICJDb3VyaWVyIE5ldyIsIDAsICJCb2xkIiwgJ1gnIH0sCi0gICAgeyAiQ291cmllciBOZXciLCAwLCAiQm9sZCIsICdLJyB9LAotICAgIHsgIkNvdXJpZXIgTmV3IiwgMCwgIkJvbGQiLCAneCcgfSwKLSAgICB7ICJDb3VyaWVyIE5ldyIsIDAsICJCb2xkIiwgJ3onIH0sCi0gICAgeyAiQ291cmllciBOZXciLCAwLCAiQm9sZCIsICd2JyB9LAotICB9OwotCi0KLSAgLyogRW1ib2xkZW4gdGhlc2UgZ2x5cGhzIHNsaWdodGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0jZGVmaW5lIEVNQk9MREVOX1JVTEVTX1NJWkUgIDIKLQotICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgRU1CT0xERU5fUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtFTUJPTERFTl9SVUxFU19TSVpFXSA9Ci0gIHsKLSAgICB7ICJDb3VyaWVyIE5ldyIsIDAsICJSZWd1bGFyIiwgMCB9LAotICAgIHsgIkNvdXJpZXIgTmV3IiwgMCwgIkl0YWxpYyIsIDAgfSwKLSAgfTsKLQotCi0gIC8qIFRoaXMgaXMgYSBDVlQgaGFjayB0aGF0IG1ha2VzIHRoaWNrIGhvcml6b250YWwgc3RlbXMgb24gMiwgNSwgNyAgICAgICAqLwotICAvKiBzaW1pbGFyIHRvIFdpbmRvd3MgWFAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgVElNRVNfTkVXX1JPTUFOX0hBQ0tfUlVMRVNfU0laRSAgMTIKLQotICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgVElNRVNfTkVXX1JPTUFOX0hBQ0tfUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtUSU1FU19ORVdfUk9NQU5fSEFDS19SVUxFU19TSVpFXSA9Ci0gIHsKLSAgICB7ICJUaW1lcyBOZXcgUm9tYW4iLCAxNiwgIkl0YWxpYyIsICcyJyB9LAotICAgIHsgIlRpbWVzIE5ldyBSb21hbiIsIDE2LCAiSXRhbGljIiwgJzUnIH0sCi0gICAgeyAiVGltZXMgTmV3IFJvbWFuIiwgMTYsICJJdGFsaWMiLCAnNycgfSwKLSAgICB7ICJUaW1lcyBOZXcgUm9tYW4iLCAxNiwgIlJlZ3VsYXIiLCAnMicgfSwKLSAgICB7ICJUaW1lcyBOZXcgUm9tYW4iLCAxNiwgIlJlZ3VsYXIiLCAnNScgfSwKLSAgICB7ICJUaW1lcyBOZXcgUm9tYW4iLCAxNiwgIlJlZ3VsYXIiLCAnNycgfSwKLSAgICB7ICJUaW1lcyBOZXcgUm9tYW4iLCAxNywgIkl0YWxpYyIsICcyJyB9LAotICAgIHsgIlRpbWVzIE5ldyBSb21hbiIsIDE3LCAiSXRhbGljIiwgJzUnIH0sCi0gICAgeyAiVGltZXMgTmV3IFJvbWFuIiwgMTcsICJJdGFsaWMiLCAnNycgfSwKLSAgICB7ICJUaW1lcyBOZXcgUm9tYW4iLCAxNywgIlJlZ3VsYXIiLCAnMicgfSwKLSAgICB7ICJUaW1lcyBOZXcgUm9tYW4iLCAxNywgIlJlZ3VsYXIiLCAnNScgfSwKLSAgICB7ICJUaW1lcyBOZXcgUm9tYW4iLCAxNywgIlJlZ3VsYXIiLCAnNycgfSwKLSAgfTsKLQotCi0gIC8qIFRoaXMgZnVkZ2VzIGRpc3RhbmNlIG9uIDIgdG8gZ2V0IHJpZCBvZiB0aGUgdmFuaXNoaW5nIHN0ZW0gaXNzdWUuICAgICAqLwotICAvKiBBIHJlYWwgc29sdXRpb24gdG8gdGhpcyBpcyBjZXJ0YWlubHkgd2VsY29tZS4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ09VUklFUl9ORVdfMl9IQUNLX1JVTEVTX1NJWkUgIDE1Ci0KLSAgc3RhdGljIGNvbnN0IFNQSF9Ud2Vha1J1bGUgIENPVVJJRVJfTkVXXzJfSEFDS19SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0NPVVJJRVJfTkVXXzJfSEFDS19SVUxFU19TSVpFXSA9Ci0gIHsKLSAgICB7ICJDb3VyaWVyIE5ldyIsIDEwLCAiUmVndWxhciIsICcyJyB9LAotICAgIHsgIkNvdXJpZXIgTmV3IiwgMTEsICJSZWd1bGFyIiwgJzInIH0sCi0gICAgeyAiQ291cmllciBOZXciLCAxMiwgIlJlZ3VsYXIiLCAnMicgfSwKLSAgICB7ICJDb3VyaWVyIE5ldyIsIDEzLCAiUmVndWxhciIsICcyJyB9LAotICAgIHsgIkNvdXJpZXIgTmV3IiwgMTQsICJSZWd1bGFyIiwgJzInIH0sCi0gICAgeyAiQ291cmllciBOZXciLCAxNSwgIlJlZ3VsYXIiLCAnMicgfSwKLSAgICB7ICJDb3VyaWVyIE5ldyIsIDE2LCAiUmVndWxhciIsICcyJyB9LAotICAgIHsgIkNvdXJpZXIgTmV3IiwgMTcsICJSZWd1bGFyIiwgJzInIH0sCi0gICAgeyAiQ291cmllciBOZXciLCAxOCwgIlJlZ3VsYXIiLCAnMicgfSwKLSAgICB7ICJDb3VyaWVyIE5ldyIsIDE5LCAiUmVndWxhciIsICcyJyB9LAotICAgIHsgIkNvdXJpZXIgTmV3IiwgMjAsICJSZWd1bGFyIiwgJzInIH0sCi0gICAgeyAiQ291cmllciBOZXciLCAyMSwgIlJlZ3VsYXIiLCAnMicgfSwKLSAgICB7ICJDb3VyaWVyIE5ldyIsIDIyLCAiUmVndWxhciIsICcyJyB9LAotICAgIHsgIkNvdXJpZXIgTmV3IiwgMjMsICJSZWd1bGFyIiwgJzInIH0sCi0gICAgeyAiQ291cmllciBOZXciLCAyNCwgIlJlZ3VsYXIiLCAnMicgfSwKLSAgfTsKLQotCi0jaWZuZGVmIEZPUkNFX05BVFVSQUxfV0lEVEhTCi0KLSAgLyogVXNlIGNvbXBhdGlibGUgd2lkdGhzIHdpdGggdGhlc2UgZ2x5cGhzLiAgQ29tcGF0aWJsZSB3aWR0aHMgaXMgYWx3YXlzICovCi0gIC8qIG9uIHdoZW4gZG9pbmcgQi9XIFRydWVUeXBlIGluc3RydWN0aW5nLCBidXQgaXMgdXNlZCBzZWxlY3RpdmVseSBoZXJlLCAqLwotICAvKiB0eXBpY2FsbHkgb24gZ2x5cGhzIHdpdGggMyBvciBtb3JlIHZlcnRpY2FsIHN0ZW1zLiAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgQ09NUEFUSUJMRV9XSURUSFNfUlVMRVNfU0laRSAgMzgKLQotICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgQ09NUEFUSUJMRV9XSURUSFNfUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtDT01QQVRJQkxFX1dJRFRIU19SVUxFU19TSVpFXSA9Ci0gIHsKLSAgICB7ICJBcmlhbCBVbmljb2RlIE1TIiwgMTIsICJSZWd1bGFyIENsYXNzIiwgJ20nIH0sCi0gICAgeyAiQXJpYWwgVW5pY29kZSBNUyIsIDE0LCAiUmVndWxhciBDbGFzcyIsICdtJyB9LAotICAgIC8qIEN5cmlsbGljIHNtYWxsIGxldHRlciBzaGEgKi8KLSAgICB7ICJBcmlhbCIsIDEwLCAiUmVndWxhciBDbGFzcyIsIDB4NDQ4IH0sCi0gICAgeyAiQXJpYWwiLCAxMSwgIlJlZ3VsYXIgQ2xhc3MiLCAnbScgfSwKLSAgICB7ICJBcmlhbCIsIDEyLCAiUmVndWxhciBDbGFzcyIsICdtJyB9LAotICAgIC8qIEN5cmlsbGljIHNtYWxsIGxldHRlciBzaGEgKi8KLSAgICB7ICJBcmlhbCIsIDEyLCAiUmVndWxhciBDbGFzcyIsIDB4NDQ4IH0sCi0gICAgeyAiQXJpYWwiLCAxMywgIlJlZ3VsYXIgQ2xhc3MiLCAweDQ0OCB9LAotICAgIHsgIkFyaWFsIiwgMTQsICJSZWd1bGFyIENsYXNzIiwgJ20nIH0sCi0gICAgLyogQ3lyaWxsaWMgc21hbGwgbGV0dGVyIHNoYSAqLwotICAgIHsgIkFyaWFsIiwgMTQsICJSZWd1bGFyIENsYXNzIiwgMHg0NDggfSwKLSAgICB7ICJBcmlhbCIsIDE1LCAiUmVndWxhciBDbGFzcyIsIDB4NDQ4IH0sCi0gICAgeyAiQXJpYWwiLCAxNywgIlJlZ3VsYXIgQ2xhc3MiLCAnbScgfSwKLSAgICB7ICJEZWphVnUgU2FucyIsIDE1LCAiUmVndWxhciBDbGFzcyIsIDAgfSwKLSAgICB7ICJNaWNyb3NvZnQgU2FucyBTZXJpZiIsIDExLCAiUmVndWxhciBDbGFzcyIsIDAgfSwKLSAgICB7ICJNaWNyb3NvZnQgU2FucyBTZXJpZiIsIDEyLCAiUmVndWxhciBDbGFzcyIsIDAgfSwKLSAgICB7ICJTZWdvZSBVSSIsIDExLCAiUmVndWxhciBDbGFzcyIsIDAgfSwKLSAgICB7ICJNb25hY28iLCAwLCAiUmVndWxhciBDbGFzcyIsIDAgfSwKLSAgICB7ICJTZWdvZSBVSSIsIDEyLCAiUmVndWxhciBDbGFzcyIsICdtJyB9LAotICAgIHsgIlNlZ29lIFVJIiwgMTQsICJSZWd1bGFyIENsYXNzIiwgJ20nIH0sCi0gICAgeyAiVGFob21hIiwgMTEsICJSZWd1bGFyIENsYXNzIiwgMCB9LAotICAgIHsgIlRpbWVzIE5ldyBSb21hbiIsIDE2LCAiUmVndWxhciBDbGFzcyIsICdjJyB9LAotICAgIHsgIlRpbWVzIE5ldyBSb21hbiIsIDE2LCAiUmVndWxhciBDbGFzcyIsICdtJyB9LAotICAgIHsgIlRpbWVzIE5ldyBSb21hbiIsIDE2LCAiUmVndWxhciBDbGFzcyIsICdvJyB9LAotICAgIHsgIlRpbWVzIE5ldyBSb21hbiIsIDE2LCAiUmVndWxhciBDbGFzcyIsICd3JyB9LAotICAgIHsgIlRyZWJ1Y2hldCBNUyIsIDExLCAiUmVndWxhciBDbGFzcyIsIDAgfSwKLSAgICB7ICJUcmVidWNoZXQgTVMiLCAxMiwgIlJlZ3VsYXIgQ2xhc3MiLCAwIH0sCi0gICAgeyAiVHJlYnVjaGV0IE1TIiwgMTQsICJSZWd1bGFyIENsYXNzIiwgMCB9LAotICAgIHsgIlRyZWJ1Y2hldCBNUyIsIDE1LCAiUmVndWxhciBDbGFzcyIsIDAgfSwKLSAgICB7ICJVYnVudHUiLCAxMiwgIlJlZ3VsYXIgQ2xhc3MiLCAnbScgfSwKLSAgICAvKiBDeXJpbGxpYyBzbWFsbCBsZXR0ZXIgc2hhICovCi0gICAgeyAiVmVyZGFuYSIsIDEwLCAiUmVndWxhciBDbGFzcyIsIDB4NDQ4IH0sCi0gICAgeyAiVmVyZGFuYSIsIDExLCAiUmVndWxhciBDbGFzcyIsIDB4NDQ4IH0sCi0gICAgeyAiVmVyZGFuYSBhbmQgQ2xvbmVzIiwgMTIsICJSZWd1bGFyIENsYXNzIiwgJ2knIH0sCi0gICAgeyAiVmVyZGFuYSBhbmQgQ2xvbmVzIiwgMTIsICJSZWd1bGFyIENsYXNzIiwgJ2onIH0sCi0gICAgeyAiVmVyZGFuYSBhbmQgQ2xvbmVzIiwgMTIsICJSZWd1bGFyIENsYXNzIiwgJ2wnIH0sCi0gICAgeyAiVmVyZGFuYSBhbmQgQ2xvbmVzIiwgMTIsICJSZWd1bGFyIENsYXNzIiwgJ20nIH0sCi0gICAgeyAiVmVyZGFuYSBhbmQgQ2xvbmVzIiwgMTMsICJSZWd1bGFyIENsYXNzIiwgJ2knIH0sCi0gICAgeyAiVmVyZGFuYSBhbmQgQ2xvbmVzIiwgMTMsICJSZWd1bGFyIENsYXNzIiwgJ2onIH0sCi0gICAgeyAiVmVyZGFuYSBhbmQgQ2xvbmVzIiwgMTMsICJSZWd1bGFyIENsYXNzIiwgJ2wnIH0sCi0gICAgeyAiVmVyZGFuYSBhbmQgQ2xvbmVzIiwgMTQsICJSZWd1bGFyIENsYXNzIiwgJ20nIH0sCi0gIH07Ci0KLQotICAvKiBTY2FsaW5nIHNsaWdodGx5IGluIHRoZSB4LWRpcmVjdGlvbiBwcmlvciB0byBoaW50aW5nIHJlc3VsdHMgaW4gICAgICAgKi8KLSAgLyogbW9yZSB2aXN1YWxseSBwbGVhc2luZyBnbHlwaHMgaW4gY2VydGFpbiBjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgc29tZXRpbWVzIG5lZWRzIHRvIGJlIGNvb3JkaW5hdGVkIHdpdGggY29tcGF0aWJsZSB3aWR0aCBydWxlcy4gICAqLwotICAvKiBBIHZhbHVlIG9mIDEwMDAgY29ycmVzcG9uZHMgdG8gYSBzY2FsZWQgdmFsdWUgb2YgMS4wLiAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBYX1NDQUxJTkdfUlVMRVNfU0laRSAgNTAKLQotICBzdGF0aWMgY29uc3QgU1BIX1NjYWxlUnVsZSAgWF9TQ0FMSU5HX1J1bGVzW1hfU0NBTElOR19SVUxFU19TSVpFXSA9Ci0gIHsKLSAgICB7ICJEZWphVnUgU2FucyIsIDEyLCAiUmVndWxhciBDbGFzcyIsICdtJywgOTUwIH0sCi0gICAgeyAiVmVyZGFuYSBhbmQgQ2xvbmVzIiwgMTIsICJSZWd1bGFyIENsYXNzIiwgJ2EnLCAxMTAwIH0sCi0gICAgeyAiVmVyZGFuYSBhbmQgQ2xvbmVzIiwgMTMsICJSZWd1bGFyIENsYXNzIiwgJ2EnLCAxMDUwIH0sCi0gICAgeyAiQXJpYWwiLCAxMSwgIlJlZ3VsYXIgQ2xhc3MiLCAnbScsIDk3NSB9LAotICAgIHsgIkFyaWFsIiwgMTIsICJSZWd1bGFyIENsYXNzIiwgJ20nLCAxMDUwIH0sCi0gICAgLyogQ3lyaWxsaWMgc21hbGwgbGV0dGVyIGVsICovCi0gICAgeyAiQXJpYWwiLCAxMywgIlJlZ3VsYXIgQ2xhc3MiLCAweDQzQiwgOTUwIH0sCi0gICAgeyAiQXJpYWwiLCAxMywgIlJlZ3VsYXIgQ2xhc3MiLCAnbycsIDk1MCB9LAotICAgIHsgIkFyaWFsIiwgMTMsICJSZWd1bGFyIENsYXNzIiwgJ2UnLCA5NTAgfSwKLSAgICB7ICJBcmlhbCIsIDE0LCAiUmVndWxhciBDbGFzcyIsICdtJywgOTUwIH0sCi0gICAgLyogQ3lyaWxsaWMgc21hbGwgbGV0dGVyIGVsICovCi0gICAgeyAiQXJpYWwiLCAxNSwgIlJlZ3VsYXIgQ2xhc3MiLCAweDQzQiwgOTI1IH0sCi0gICAgeyAiQml0c3RyZWFtIFZlcmEgU2FucyIsIDEwLCAiUmVndWxhci9JdGFsaWMgQ2xhc3MiLCAwLCAxMTAwIH0sCi0gICAgeyAiQml0c3RyZWFtIFZlcmEgU2FucyIsIDEyLCAiUmVndWxhci9JdGFsaWMgQ2xhc3MiLCAwLCAxMDUwIH0sCi0gICAgeyAiQml0c3RyZWFtIFZlcmEgU2FucyIsIDE2LCAiUmVndWxhciBDbGFzcyIsIDAsIDEwNTAgfSwKLSAgICB7ICJCaXRzdHJlYW0gVmVyYSBTYW5zIiwgOSwgIlJlZ3VsYXIvSXRhbGljIENsYXNzIiwgMCwgMTA1MCB9LAotICAgIHsgIkRlamFWdSBTYW5zIiwgMTIsICJSZWd1bGFyIENsYXNzIiwgJ2wnLCA5NzUgfSwKLSAgICB7ICJEZWphVnUgU2FucyIsIDEyLCAiUmVndWxhciBDbGFzcyIsICdpJywgOTc1IH0sCi0gICAgeyAiRGVqYVZ1IFNhbnMiLCAxMiwgIlJlZ3VsYXIgQ2xhc3MiLCAnaicsIDk3NSB9LAotICAgIHsgIkRlamFWdSBTYW5zIiwgMTMsICJSZWd1bGFyIENsYXNzIiwgJ2wnLCA5NTAgfSwKLSAgICB7ICJEZWphVnUgU2FucyIsIDEzLCAiUmVndWxhciBDbGFzcyIsICdpJywgOTUwIH0sCi0gICAgeyAiRGVqYVZ1IFNhbnMiLCAxMywgIlJlZ3VsYXIgQ2xhc3MiLCAnaicsIDk1MCB9LAotICAgIHsgIkRlamFWdSBTYW5zIiwgMTAsICJSZWd1bGFyL0l0YWxpYyBDbGFzcyIsIDAsIDExMDAgfSwKLSAgICB7ICJEZWphVnUgU2FucyIsIDEyLCAiUmVndWxhci9JdGFsaWMgQ2xhc3MiLCAwLCAxMDUwIH0sCi0gICAgeyAiR2VvcmdpYSIsIDEwLCAiIiwgMCwgMTA1MCB9LAotICAgIHsgIkdlb3JnaWEiLCAxMSwgIiIsIDAsIDExMDAgfSwKLSAgICB7ICJHZW9yZ2lhIiwgMTIsICIiLCAwLCAxMDI1IH0sCi0gICAgeyAiR2VvcmdpYSIsIDEzLCAiIiwgMCwgMTA1MCB9LAotICAgIHsgIkdlb3JnaWEiLCAxNiwgIiIsIDAsIDEwNTAgfSwKLSAgICB7ICJHZW9yZ2lhIiwgMTcsICIiLCAwLCAxMDMwIH0sCi0gICAgeyAiTGliZXJhdGlvbiBTYW5zIiwgMTIsICJSZWd1bGFyIENsYXNzIiwgJ20nLCAxMTAwIH0sCi0gICAgeyAiTHVjaWRhIEdyYW5kZSIsIDExLCAiUmVndWxhciBDbGFzcyIsICdtJywgMTEwMCB9LAotICAgIHsgIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwgMTEsICJSZWd1bGFyIENsYXNzIiwgJ20nLCA5NTAgfSwKLSAgICB7ICJNaWNyb3NvZnQgU2FucyBTZXJpZiIsIDEyLCAiUmVndWxhciBDbGFzcyIsICdtJywgMTA1MCB9LAotICAgIHsgIlNlZ29lIFVJIiwgMTIsICJSZWd1bGFyIENsYXNzIiwgJ0gnLCAxMDUwIH0sCi0gICAgeyAiU2Vnb2UgVUkiLCAxMiwgIlJlZ3VsYXIgQ2xhc3MiLCAnbScsIDEwNTAgfSwKLSAgICB7ICJTZWdvZSBVSSIsIDE0LCAiUmVndWxhciBDbGFzcyIsICdtJywgMTA1MCB9LAotICAgIHsgIlRhaG9tYSIsIDExLCAiUmVndWxhciBDbGFzcyIsICdpJywgOTc1IH0sCi0gICAgeyAiVGFob21hIiwgMTEsICJSZWd1bGFyIENsYXNzIiwgJ2wnLCA5NzUgfSwKLSAgICB7ICJUYWhvbWEiLCAxMSwgIlJlZ3VsYXIgQ2xhc3MiLCAnaicsIDkwMCB9LAotICAgIHsgIlRhaG9tYSIsIDExLCAiUmVndWxhciBDbGFzcyIsICdtJywgOTE4IH0sCi0gICAgeyAiVmVyZGFuYSIsIDEwLCAiUmVndWxhci9JdGFsaWMgQ2xhc3MiLCAwLCAxMTAwIH0sCi0gICAgeyAiVmVyZGFuYSIsIDEyLCAiUmVndWxhciBDbGFzcyIsICdtJywgOTc1IH0sCi0gICAgeyAiVmVyZGFuYSIsIDEyLCAiUmVndWxhci9JdGFsaWMgQ2xhc3MiLCAwLCAxMDUwIH0sCi0gICAgeyAiVmVyZGFuYSIsIDEzLCAiUmVndWxhci9JdGFsaWMgQ2xhc3MiLCAnaScsIDk1MCB9LAotICAgIHsgIlZlcmRhbmEiLCAxMywgIlJlZ3VsYXIvSXRhbGljIENsYXNzIiwgJ2onLCA5NTAgfSwKLSAgICB7ICJWZXJkYW5hIiwgMTMsICJSZWd1bGFyL0l0YWxpYyBDbGFzcyIsICdsJywgOTUwIH0sCi0gICAgeyAiVmVyZGFuYSIsIDE2LCAiUmVndWxhciBDbGFzcyIsIDAsIDEwNTAgfSwKLSAgICB7ICJWZXJkYW5hIiwgOSwgIlJlZ3VsYXIvSXRhbGljIENsYXNzIiwgMCwgMTA1MCB9LAotICAgIHsgIlRpbWVzIE5ldyBSb21hbiIsIDE2LCAiUmVndWxhciBDbGFzcyIsICdtJywgOTE4IH0sCi0gICAgeyAiVHJlYnVjaGV0IE1TIiwgMTEsICJSZWd1bGFyIENsYXNzIiwgJ20nLCA4MDAgfSwKLSAgICB7ICJUcmVidWNoZXQgTVMiLCAxMiwgIlJlZ3VsYXIgQ2xhc3MiLCAnbScsIDgwMCB9LAotICB9OwotCi0jZWxzZQotCi0jZGVmaW5lIENPTVBBVElCTEVfV0lEVEhTX1JVTEVTX1NJWkUgIDEKLQotICBzdGF0aWMgY29uc3QgU1BIX1R3ZWFrUnVsZSAgQ09NUEFUSUJMRV9XSURUSFNfUnVsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtDT01QQVRJQkxFX1dJRFRIU19SVUxFU19TSVpFXSA9Ci0gIHsKLSAgICB7ICItIiwgMCwgIiIsIDAgfSwKLSAgfTsKLQotCi0jZGVmaW5lIFhfU0NBTElOR19SVUxFU19TSVpFICAxCi0KLSAgc3RhdGljIGNvbnN0IFNQSF9TY2FsZVJ1bGUgIFhfU0NBTElOR19SdWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1hfU0NBTElOR19SVUxFU19TSVpFXSA9Ci0gIHsKLSAgICB7ICItIiwgMCwgIiIsIDAsIDEwMDAgfSwKLSAgfTsKLQotI2VuZGlmIC8qIEZPUkNFX05BVFVSQUxfV0lEVEhTICovCi0KLQotICBzdGF0aWMgRlRfQm9vbAotICBpc19tZW1iZXJfb2ZfZmFtaWx5X2NsYXNzKCBjb25zdCBGVF9TdHJpbmcqICBkZXRlY3RlZF9mb250X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIHJ1bGVfZm9udF9uYW1lICkKLSAgewotICAgIEZUX1VJbnQgIGksIGo7Ci0KLQotICAgIC8qIERvZXMgZm9udCBuYW1lIG1hdGNoIHJ1bGUgZmFtaWx5PyAqLwotICAgIGlmICggc3RyY21wKCBkZXRlY3RlZF9mb250X25hbWUsIHJ1bGVfZm9udF9uYW1lICkgPT0gMCApCi0gICAgICByZXR1cm4gVFJVRTsKLQotICAgIC8qIElzIGZvbnQgbmFtZSBhIHdpbGRjYXJkICIiPyAqLwotICAgIGlmICggc3RyY21wKCBydWxlX2ZvbnRfbmFtZSwgIiIgKSA9PSAwICkKLSAgICAgIHJldHVybiBUUlVFOwotCi0gICAgLyogSXMgZm9udCBuYW1lIGNvbnRhaW5lZCBpbiBhIGNsYXNzIGxpc3Q/ICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBGQU1JTFlfQ0xBU1NfUlVMRVNfU0laRTsgaSsrICkKLSAgICB7Ci0gICAgICBpZiAoIHN0cmNtcCggRkFNSUxZX0NMQVNTX1J1bGVzW2ldLm5hbWUsIHJ1bGVfZm9udF9uYW1lICkgPT0gMCApCi0gICAgICB7Ci0gICAgICAgIGZvciAoIGogPSAwOyBqIDwgU1BIX01BWF9DTEFTU19NRU1CRVJTOyBqKysgKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCBzdHJjbXAoIEZBTUlMWV9DTEFTU19SdWxlc1tpXS5tZW1iZXJbal0sICIiICkgPT0gMCApCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICBpZiAoIHN0cmNtcCggRkFNSUxZX0NMQVNTX1J1bGVzW2ldLm1lbWJlcltqXSwKLSAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0ZWRfZm9udF9uYW1lICkgPT0gMCApCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBGQUxTRTsKLSAgfQotCi0KLSAgc3RhdGljIEZUX0Jvb2wKLSAgaXNfbWVtYmVyX29mX3N0eWxlX2NsYXNzKCBjb25zdCBGVF9TdHJpbmcqICBkZXRlY3RlZF9mb250X3N0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIHJ1bGVfZm9udF9zdHlsZSApCi0gIHsKLSAgICBGVF9VSW50ICBpLCBqOwotCi0KLSAgICAvKiBEb2VzIGZvbnQgc3R5bGUgbWF0Y2ggcnVsZSBzdHlsZT8gKi8KLSAgICBpZiAoIHN0cmNtcCggZGV0ZWN0ZWRfZm9udF9zdHlsZSwgcnVsZV9mb250X3N0eWxlICkgPT0gMCApCi0gICAgICByZXR1cm4gVFJVRTsKLQotICAgIC8qIElzIGZvbnQgc3R5bGUgYSB3aWxkY2FyZCAiIj8gKi8KLSAgICBpZiAoIHN0cmNtcCggcnVsZV9mb250X3N0eWxlLCAiIiApID09IDAgKQotICAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICAvKiBJcyBmb250IHN0eWxlIGNvbnRhaW5lZCBpbiBhIGNsYXNzIGxpc3Q/ICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBTVFlMRV9DTEFTU19SVUxFU19TSVpFOyBpKysgKQotICAgIHsKLSAgICAgIGlmICggc3RyY21wKCBTVFlMRV9DTEFTU19SdWxlc1tpXS5uYW1lLCBydWxlX2ZvbnRfc3R5bGUgKSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgZm9yICggaiA9IDA7IGogPCBTUEhfTUFYX0NMQVNTX01FTUJFUlM7IGorKyApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIHN0cmNtcCggU1RZTEVfQ0xBU1NfUnVsZXNbaV0ubWVtYmVyW2pdLCAiIiApID09IDAgKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgaWYgKCBzdHJjbXAoIFNUWUxFX0NMQVNTX1J1bGVzW2ldLm1lbWJlcltqXSwKLSAgICAgICAgICAgICAgICAgICAgICAgZGV0ZWN0ZWRfZm9udF9zdHlsZSApID09IDAgKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfQm9vbCApCi0gIHNwaF90ZXN0X3R3ZWFrKCBUVF9GYWNlICAgICAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogICAgICBmYW1pbHksCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICAgcHBlbSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogICAgICBzdHlsZSwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IFNQSF9Ud2Vha1J1bGUqICBydWxlLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgICAgIG51bV9ydWxlcyApCi0gIHsKLSAgICBGVF9VSW50ICBpOwotCi0KLSAgICAvKiBydWxlIGNoZWNrcyBtYXkgYmUgYWJsZSB0byBiZSBvcHRpbWl6ZWQgZnVydGhlciAqLwotICAgIGZvciAoIGkgPSAwOyBpIDwgbnVtX3J1bGVzOyBpKysgKQotICAgIHsKLSAgICAgIGlmICggZmFtaWx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgKCBpc19tZW1iZXJfb2ZfZmFtaWx5X2NsYXNzICggZmFtaWx5LCBydWxlW2ldLmZhbWlseSApICkgKQotICAgICAgICBpZiAoIHJ1bGVbaV0ucHBlbSA9PSAwICAgIHx8Ci0gICAgICAgICAgICAgcnVsZVtpXS5wcGVtID09IHBwZW0gKQotICAgICAgICAgIGlmICggc3R5bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgaXNfbWVtYmVyX29mX3N0eWxlX2NsYXNzICggc3R5bGUsIHJ1bGVbaV0uc3R5bGUgKSApCi0gICAgICAgICAgICBpZiAoIHJ1bGVbaV0uZ2x5cGggPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgRlRfR2V0X0NoYXJfSW5kZXgoIChGVF9GYWNlKWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlW2ldLmdseXBoICkgPT0gZ2x5cGhfaW5kZXggKQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotCi0gIHN0YXRpYyBGVF9VSW50Ci0gIHNjYWxlX3Rlc3RfdHdlYWsoIFRUX0ZhY2UgICAgICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBGVF9TdHJpbmcqICAgICAgZmFtaWx5LAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICAgcHBlbSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgICAgIHN0eWxlLAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFNQSF9TY2FsZVJ1bGUqICBydWxlLAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICAgbnVtX3J1bGVzICkKLSAgewotICAgIEZUX1VJbnQgIGk7Ci0KLQotICAgIC8qIHJ1bGUgY2hlY2tzIG1heSBiZSBhYmxlIHRvIGJlIG9wdGltaXplZCBmdXJ0aGVyICovCi0gICAgZm9yICggaSA9IDA7IGkgPCBudW1fcnVsZXM7IGkrKyApCi0gICAgewotICAgICAgaWYgKCBmYW1pbHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAoIGlzX21lbWJlcl9vZl9mYW1pbHlfY2xhc3MgKCBmYW1pbHksIHJ1bGVbaV0uZmFtaWx5ICkgKSApCi0gICAgICAgIGlmICggcnVsZVtpXS5wcGVtID09IDAgICAgfHwKLSAgICAgICAgICAgICBydWxlW2ldLnBwZW0gPT0gcHBlbSApCi0gICAgICAgICAgaWYgKCBzdHlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgIGlzX21lbWJlcl9vZl9zdHlsZV9jbGFzcyggc3R5bGUsIHJ1bGVbaV0uc3R5bGUgKSApCi0gICAgICAgICAgICBpZiAoIHJ1bGVbaV0uZ2x5cGggPT0gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgRlRfR2V0X0NoYXJfSW5kZXgoIChGVF9GYWNlKWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydWxlW2ldLmdseXBoICkgPT0gZ2x5cGhfaW5kZXggKQotICAgICAgICByZXR1cm4gcnVsZVtpXS5zY2FsZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMTAwMDsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9VSW50ICkKLSAgc3BoX3Rlc3RfdHdlYWtfeF9zY2FsaW5nKCBUVF9GYWNlICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIGZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICBwcGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIHN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgIGdseXBoX2luZGV4ICkKLSAgewotICAgIHJldHVybiBzY2FsZV90ZXN0X3R3ZWFrKCBmYWNlLCBmYW1pbHksIHBwZW0sIHN0eWxlLCBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWF9TQ0FMSU5HX1J1bGVzLCBYX1NDQUxJTkdfUlVMRVNfU0laRSApOwotICB9Ci0KLQotI2RlZmluZSBUV0VBS19SVUxFUyggeCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoIHNwaF90ZXN0X3R3ZWFrKCBmYWNlLCBmYW1pbHksIHBwZW0sIHN0eWxlLCBnbHlwaF9pbmRleCwgXAotICAgICAgICAgICAgICAgICAgICAgICB4IyNfUnVsZXMsIHgjI19SVUxFU19TSVpFICkgKSAgICAgICAgICAgXAotICAgIGxvYWRlci0+ZXhlYy0+c3BoX3R3ZWFrX2ZsYWdzIHw9IFNQSF9UV0VBS18jI3g7Ci0KLSNkZWZpbmUgVFdFQUtfUlVMRVNfRVhDRVBUSU9OUyggeCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKCBzcGhfdGVzdF90d2VhayggZmFjZSwgZmFtaWx5LCBwcGVtLCBzdHlsZSwgZ2x5cGhfaW5kZXgsICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgeCMjX1J1bGVzX0V4Y2VwdGlvbnMsIHgjI19SVUxFU19FWENFUFRJT05TX1NJWkUgKSApIFwKLSAgICBsb2FkZXItPmV4ZWMtPnNwaF90d2Vha19mbGFncyAmPSB+U1BIX1RXRUFLXyMjeDsKLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIHNwaF9zZXRfdHdlYWtzKCBUVF9Mb2FkZXIgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZ2x5cGhfaW5kZXggKQotICB7Ci0gICAgVFRfRmFjZSAgICAgZmFjZSAgID0gbG9hZGVyLT5mYWNlOwotICAgIEZUX1N0cmluZyogIGZhbWlseSA9IGZhY2UtPnJvb3QuZmFtaWx5X25hbWU7Ci0gICAgRlRfVUludCAgICAgcHBlbSAgID0gbG9hZGVyLT5zaXplLT5tZXRyaWNzLnhfcHBlbTsKLSAgICBGVF9TdHJpbmcqICBzdHlsZSAgPSBmYWNlLT5yb290LnN0eWxlX25hbWU7Ci0KLQotICAgIC8qIGRvbid0IGFwcGx5IHJ1bGVzIGlmIHN0eWxlIGlzbid0IHNldCAqLwotICAgIGlmICggIWZhY2UtPnJvb3Quc3R5bGVfbmFtZSApCi0gICAgICByZXR1cm47Ci0KLSNpZmRlZiBTUEhfREVCVUdfTU9SRV9WRVJCT1NFCi0gICAgcHJpbnRmKCAiJXMsJWQsJXMsJWM9JWQgIiwKLSAgICAgICAgICAgIGZhbWlseSwgcHBlbSwgc3R5bGUsIGdseXBoX2luZGV4LCBnbHlwaF9pbmRleCApOwotI2VuZGlmCi0KLSAgICBUV0VBS19SVUxFUyggUElYRUxfSElOVElORyApOwotCi0gICAgaWYgKCBsb2FkZXItPmV4ZWMtPnNwaF90d2Vha19mbGFncyAmIFNQSF9UV0VBS19QSVhFTF9ISU5USU5HICkKLSAgICB7Ci0gICAgICBsb2FkZXItPmV4ZWMtPmlnbm9yZV94X21vZGUgPSBGQUxTRTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBUV0VBS19SVUxFUyggQUxMT1dfWF9ETU9WRSApOwotICAgIFRXRUFLX1JVTEVTKCBBTFdBWVNfRE9fREVMVEFQICk7Ci0gICAgVFdFQUtfUlVMRVMoIEFMV0FZU19TS0lQX0RFTFRBUCApOwotICAgIFRXRUFLX1JVTEVTKCBERUVNQk9MREVOICk7Ci0gICAgVFdFQUtfUlVMRVMoIERPX1NIUElYICk7Ci0gICAgVFdFQUtfUlVMRVMoIEVNQk9MREVOICk7Ci0gICAgVFdFQUtfUlVMRVMoIE1JQVBfSEFDSyApOwotICAgIFRXRUFLX1JVTEVTKCBOT1JNQUxfUk9VTkQgKTsKLSAgICBUV0VBS19SVUxFUyggTk9fQUxJR05SUF9BRlRFUl9JVVAgKTsKLSAgICBUV0VBS19SVUxFUyggTk9fQ0FMTF9BRlRFUl9JVVAgKTsKLSAgICBUV0VBS19SVUxFUyggTk9fREVMVEFQX0FGVEVSX0lVUCApOwotICAgIFRXRUFLX1JVTEVTKCBSQVNURVJJWkVSXzM1ICk7Ci0gICAgVFdFQUtfUlVMRVMoIFNLSVBfSVVQICk7Ci0KLSAgICBUV0VBS19SVUxFUyggU0tJUF9PRkZQSVhFTF9ZX01PVkVTICk7Ci0gICAgVFdFQUtfUlVMRVNfRVhDRVBUSU9OUyggU0tJUF9PRkZQSVhFTF9ZX01PVkVTICk7Ci0KLSAgICBUV0VBS19SVUxFUyggU0tJUF9OT05QSVhFTF9ZX01PVkVTX0RFTFRBUCApOwotCi0gICAgVFdFQUtfUlVMRVMoIFNLSVBfTk9OUElYRUxfWV9NT1ZFUyApOwotICAgIFRXRUFLX1JVTEVTX0VYQ0VQVElPTlMoIFNLSVBfTk9OUElYRUxfWV9NT1ZFUyApOwotCi0gICAgVFdFQUtfUlVMRVMoIFJPVU5EX05PTlBJWEVMX1lfTU9WRVMgKTsKLSAgICBUV0VBS19SVUxFU19FWENFUFRJT05TKCBST1VORF9OT05QSVhFTF9ZX01PVkVTICk7Ci0KLSAgICBpZiAoIGxvYWRlci0+ZXhlYy0+c3BoX3R3ZWFrX2ZsYWdzICYgU1BIX1RXRUFLX1JBU1RFUklaRVJfMzUgKQotICAgIHsKLSAgICAgIGlmICggbG9hZGVyLT5leGVjLT5yYXN0ZXJpemVyX3ZlcnNpb24gIT0gVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zNSApCi0gICAgICB7Ci0gICAgICAgIGxvYWRlci0+ZXhlYy0+cmFzdGVyaXplcl92ZXJzaW9uID0gVFRfSU5URVJQUkVURVJfVkVSU0lPTl8zNTsKLSAgICAgICAgbG9hZGVyLT5leGVjLT5zaXplLT5jdnRfcmVhZHkgICAgPSAtMTsKLQotICAgICAgICB0dF9zaXplX3JlYWR5X2J5dGVjb2RlKAotICAgICAgICAgIGxvYWRlci0+ZXhlYy0+c2l6ZSwKLSAgICAgICAgICBGVF9CT09MKCBsb2FkZXItPmxvYWRfZmxhZ3MgJiBGVF9MT0FEX1BFREFOVElDICkgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgbG9hZGVyLT5leGVjLT5yYXN0ZXJpemVyX3ZlcnNpb24gPSBUVF9JTlRFUlBSRVRFUl9WRVJTSU9OXzM1OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKCBsb2FkZXItPmV4ZWMtPnJhc3Rlcml6ZXJfdmVyc2lvbiAgIT0KLSAgICAgICAgICAgU1BIX09QVElPTl9TRVRfUkFTVEVSSVpFUl9WRVJTSU9OICkKLSAgICAgIHsKLSAgICAgICAgbG9hZGVyLT5leGVjLT5yYXN0ZXJpemVyX3ZlcnNpb24gPSBTUEhfT1BUSU9OX1NFVF9SQVNURVJJWkVSX1ZFUlNJT047Ci0gICAgICAgIGxvYWRlci0+ZXhlYy0+c2l6ZS0+Y3Z0X3JlYWR5ICAgID0gLTE7Ci0KLSAgICAgICAgdHRfc2l6ZV9yZWFkeV9ieXRlY29kZSgKLSAgICAgICAgICBsb2FkZXItPmV4ZWMtPnNpemUsCi0gICAgICAgICAgRlRfQk9PTCggbG9hZGVyLT5sb2FkX2ZsYWdzICYgRlRfTE9BRF9QRURBTlRJQyApICk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIGxvYWRlci0+ZXhlYy0+cmFzdGVyaXplcl92ZXJzaW9uID0gU1BIX09QVElPTl9TRVRfUkFTVEVSSVpFUl9WRVJTSU9OOwotICAgIH0KLQotICAgIGlmICggSVNfSElOVEVEKCBsb2FkZXItPmxvYWRfZmxhZ3MgKSApCi0gICAgewotICAgICAgVFdFQUtfUlVMRVMoIFRJTUVTX05FV19ST01BTl9IQUNLICk7Ci0gICAgICBUV0VBS19SVUxFUyggQ09VUklFUl9ORVdfMl9IQUNLICk7Ci0gICAgfQotCi0gICAgaWYgKCBzcGhfdGVzdF90d2VhayggZmFjZSwgZmFtaWx5LCBwcGVtLCBzdHlsZSwgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgIENPTVBBVElCSUxJVFlfTU9ERV9SdWxlcywgQ09NUEFUSUJJTElUWV9NT0RFX1JVTEVTX1NJWkUgKSApCi0gICAgICBsb2FkZXItPmV4ZWMtPmZhY2UtPnNwaF9jb21wYXRpYmlsaXR5X21vZGUgPSBUUlVFOwotCi0KLSAgICBpZiAoIElTX0hJTlRFRCggbG9hZGVyLT5sb2FkX2ZsYWdzICkgKQotICAgIHsKLSAgICAgIGlmICggc3BoX3Rlc3RfdHdlYWsoIGZhY2UsIGZhbWlseSwgcHBlbSwgc3R5bGUsIGdseXBoX2luZGV4LAotICAgICAgICAgICAgIENPTVBBVElCTEVfV0lEVEhTX1J1bGVzLCBDT01QQVRJQkxFX1dJRFRIU19SVUxFU19TSVpFICkgKQotICAgICAgICBsb2FkZXItPmV4ZWMtPmNvbXBhdGlibGVfd2lkdGhzIHw9IFRSVUU7Ci0gICAgfQotICB9Ci0KLSNlbHNlIC8qICFUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KLQotICAvKiBBTlNJIEMgZG9lc24ndCBsaWtlIGVtcHR5IHNvdXJjZSBmaWxlcyAqLwotICB0eXBlZGVmIGludCAgX3R0X3N1YnBpeF9kdW1teTsKLQotI2VuZGlmIC8qICFUVF9DT05GSUdfT1BUSU9OX1NVQlBJWEVMX0hJTlRJTkcgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90cnVldHlwZS90dHN1YnBpeC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0c3VicGl4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNTFhYTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3RydWV0eXBlL3R0c3VicGl4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdHRzdWJwaXguaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRydWVUeXBlIFN1YnBpeGVsIEhpbnRpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDEwLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fVFRTVUJQSVhfSF9fCi0jZGVmaW5lIF9fVFRTVUJQSVhfSF9fCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgInR0b2Jqcy5oIgotI2luY2x1ZGUgInR0aW50ZXJwLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotI2lmZGVmIFRUX0NPTkZJR19PUFRJT05fU1VCUElYRUxfSElOVElORwotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSUQgZmxhZ3MgdG8gaWRlbnRpZnkgc3BlY2lhbCBmdW5jdGlvbnMgYXQgRkRFRiBhbmQgcnVudGltZS4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU1BIX0ZERUZfSU5MSU5FX0RFTFRBXzEgICAgICAgMHgwMDAwMDAxCi0jZGVmaW5lIFNQSF9GREVGX0lOTElORV9ERUxUQV8yICAgICAgIDB4MDAwMDAwMgotI2RlZmluZSBTUEhfRkRFRl9ESUFHT05BTF9TVFJPS0UgICAgICAweDAwMDAwMDQKLSNkZWZpbmUgU1BIX0ZERUZfVkFDVUZPUk1fUk9VTkRfMSAgICAgMHgwMDAwMDA4Ci0jZGVmaW5lIFNQSF9GREVGX1RURkFVVE9ISU5UXzEgICAgICAgIDB4MDAwMDAxMAotI2RlZmluZSBTUEhfRkRFRl9TUEFDSU5HXzEgICAgICAgICAgICAweDAwMDAwMjAKLSNkZWZpbmUgU1BIX0ZERUZfU1BBQ0lOR18yICAgICAgICAgICAgMHgwMDAwMDQwCi0jZGVmaW5lIFNQSF9GREVGX1RZUEVNQU5fU1RST0tFUyAgICAgIDB4MDAwMDA4MAotI2RlZmluZSBTUEhfRkRFRl9UWVBFTUFOX0RJQUdFTkRDVFJMICAweDAwMDAxMDAKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVHdlYWsgZmxhZ3MgdGhhdCBhcmUgc2V0IGZvciBlYWNoIGdseXBoIGJ5IHRoZSBiZWxvdyBydWxlcy4gICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgU1BIX1RXRUFLX0FMTE9XX1hfRE1PVkUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxVUwKLSNkZWZpbmUgU1BIX1RXRUFLX0FMV0FZU19ET19ERUxUQVAgICAgICAgICAgICAgICAgMHgwMDAwMDAyVUwKLSNkZWZpbmUgU1BIX1RXRUFLX0FMV0FZU19TS0lQX0RFTFRBUCAgICAgICAgICAgICAgMHgwMDAwMDA0VUwKLSNkZWZpbmUgU1BIX1RXRUFLX0NPVVJJRVJfTkVXXzJfSEFDSyAgICAgICAgICAgICAgMHgwMDAwMDA4VUwKLSNkZWZpbmUgU1BIX1RXRUFLX0RFRU1CT0xERU4gICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwVUwKLSNkZWZpbmUgU1BIX1RXRUFLX0RPX1NIUElYICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwVUwKLSNkZWZpbmUgU1BIX1RXRUFLX0VNQk9MREVOICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwVUwKLSNkZWZpbmUgU1BIX1RXRUFLX01JQVBfSEFDSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwVUwKLSNkZWZpbmUgU1BIX1RXRUFLX05PUk1BTF9ST1VORCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwVUwKLSNkZWZpbmUgU1BIX1RXRUFLX05PX0FMSUdOUlBfQUZURVJfSVVQICAgICAgICAgICAgMHgwMDAwMjAwVUwKLSNkZWZpbmUgU1BIX1RXRUFLX05PX0NBTExfQUZURVJfSVVQICAgICAgICAgICAgICAgMHgwMDAwNDAwVUwKLSNkZWZpbmUgU1BIX1RXRUFLX05PX0RFTFRBUF9BRlRFUl9JVVAgICAgICAgICAgICAgMHgwMDAwODAwVUwKLSNkZWZpbmUgU1BIX1RXRUFLX1BJWEVMX0hJTlRJTkcgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwVUwKLSNkZWZpbmUgU1BIX1RXRUFLX1JBU1RFUklaRVJfMzUgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwVUwKLSNkZWZpbmUgU1BIX1RXRUFLX1JPVU5EX05PTlBJWEVMX1lfTU9WRVMgICAgICAgICAgMHgwMDA0MDAwVUwKLSNkZWZpbmUgU1BIX1RXRUFLX1NLSVBfSVVQICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA4MDAwVUwKLSNkZWZpbmUgU1BIX1RXRUFLX1NLSVBfTk9OUElYRUxfWV9NT1ZFUyAgICAgICAgICAgMHgwMDEwMDAwVUwKLSNkZWZpbmUgU1BIX1RXRUFLX1NLSVBfT0ZGUElYRUxfWV9NT1ZFUyAgICAgICAgICAgMHgwMDIwMDAwVUwKLSNkZWZpbmUgU1BIX1RXRUFLX1RJTUVTX05FV19ST01BTl9IQUNLICAgICAgICAgICAgMHgwMDQwMDAwVUwKLSNkZWZpbmUgU1BIX1RXRUFLX1NLSVBfTk9OUElYRUxfWV9NT1ZFU19ERUxUQVAgICAgMHgwMDgwMDAwVUwKLQotCi0gIEZUX0xPQ0FMKCBGVF9Cb29sICkKLSAgc3BoX3Rlc3RfdHdlYWsoIFRUX0ZhY2UgICAgICAgICAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgICAgIGZhbWlseSwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgICAgICBwcGVtLAotICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgICAgIHN0eWxlLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICAgY29uc3QgU1BIX1R3ZWFrUnVsZSogIHJ1bGUsCi0gICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgICAgICAgICAgbnVtX3J1bGVzICk7Ci0KLSAgRlRfTE9DQUwoIEZUX1VJbnQgKQotICBzcGhfdGVzdF90d2Vha194X3NjYWxpbmcoIFRUX0ZhY2UgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgZmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgICAgIHBwZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlRfU3RyaW5nKiAgc3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICAgICAgZ2x5cGhfaW5kZXggKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIHNwaF9zZXRfdHdlYWtzKCBUVF9Mb2FkZXIgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZ2x5cGhfaW5kZXggKTsKLQotCi0gIC8qIFRoZXNlIG1hY3JvcyBhcmUgZGVmaW5lZCBhYnNlbnQgYSBtZXRob2QgZm9yIHNldHRpbmcgdGhlbSAqLwotI2RlZmluZSBTUEhfT1BUSU9OX0JJVE1BUF9XSURUSFMgICAgICAgICAgIEZBTFNFCi0jZGVmaW5lIFNQSF9PUFRJT05fU0VUX1NVQlBJWEVMICAgICAgICAgICAgVFJVRQotI2RlZmluZSBTUEhfT1BUSU9OX1NFVF9HUkFZU0NBTEUgICAgICAgICAgIEZBTFNFCi0jZGVmaW5lIFNQSF9PUFRJT05fU0VUX0NPTVBBVElCTEVfV0lEVEhTICAgRkFMU0UKLSNkZWZpbmUgU1BIX09QVElPTl9TRVRfUkFTVEVSSVpFUl9WRVJTSU9OICAzOAotCi0jZW5kaWYgLyogVFRfQ09ORklHX09QVElPTl9TVUJQSVhFTF9ISU5USU5HICovCi0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19UVFNVQlBJWF9IX18gKi8KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvSmFtZmlsZSBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS9KYW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWEzYWY1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS9KYW1maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyBGcmVlVHlwZSAyIHNyYy90eXBlMSBKYW1maWxlCi0jCi0jIENvcHlyaWdodCAyMDAxLTIwMTUgYnkKLSMgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLgotIwotIyBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsIG1vZGlmaWVkLAotIyBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0IGxpY2Vuc2UsCi0jIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91Ci0jIGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0Ci0jIGZ1bGx5LgotCi1TdWJEaXIgIEZUMl9UT1AgJChGVDJfU1JDX0RJUikgdHlwZTEgOwotCi17Ci0gIGxvY2FsICBfc291cmNlcyA7Ci0KLSAgaWYgJChGVDJfTVVMVEkpCi0gIHsKLSAgICBfc291cmNlcyA9IHQxYWZtCi0gICAgICAgICAgICAgICB0MWRyaXZlcgotICAgICAgICAgICAgICAgdDFnbG9hZAotICAgICAgICAgICAgICAgdDFsb2FkCi0gICAgICAgICAgICAgICB0MW9ianMKLSAgICAgICAgICAgICAgIHQxcGFyc2UKLSAgICAgICAgICAgICAgIDsKLSAgfQotICBlbHNlCi0gIHsKLSAgICBfc291cmNlcyA9IHR5cGUxIDsKLSAgfQotCi0gIExpYnJhcnkgICQoRlQyX0xJQikgOiAkKF9zb3VyY2VzKS5jIDsKLX0KLQotIyBlbmQgb2Ygc3JjL3R5cGUxIEphbWZpbGUKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MWFmbS5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxYWZtLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMzIwNTkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxYWZtLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDFhZm0uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFGTSBzdXBwb3J0IGZvciBUeXBlIDEgZm9udHMgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlICJ0MWFmbS5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0gKLSNpbmNsdWRlICJ0MWVycm9ycy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdDFhZm0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIFQxX0RvbmVfTWV0cmljcyggRlRfTWVtb3J5ICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgQUZNX0ZvbnRJbmZvICBmaSApCi0gIHsKLSAgICBGVF9GUkVFKCBmaS0+S2VyblBhaXJzICk7Ci0gICAgZmktPk51bUtlcm5QYWlyID0gMDsKLQotICAgIEZUX0ZSRUUoIGZpLT5UcmFja0tlcm5zICk7Ci0gICAgZmktPk51bVRyYWNrS2VybiA9IDA7Ci0KLSAgICBGVF9GUkVFKCBmaSApOwotICB9Ci0KLQotICAvKiByZWFkIGEgZ2x5cGggbmFtZSBhbmQgcmV0dXJuIHRoZSBlcXVpdmFsZW50IGdseXBoIGluZGV4ICovCi0gIHN0YXRpYyBGVF9JbnQKLSAgdDFfZ2V0X2luZGV4KCBjb25zdCBjaGFyKiAgbmFtZSwKLSAgICAgICAgICAgICAgICBGVF9PZmZzZXQgICAgbGVuLAotICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICB1c2VyX2RhdGEgKQotICB7Ci0gICAgVDFfRm9udCAgdHlwZTEgPSAoVDFfRm9udCl1c2VyX2RhdGE7Ci0gICAgRlRfSW50ICAgbjsKLQotCi0gICAgLyogUFMgc3RyaW5nL25hbWUgbGVuZ3RoIG11c3QgYmUgPCAxNi1iaXQgKi8KLSAgICBpZiAoIGxlbiA+IDB4RkZGRlUgKQotICAgICAgcmV0dXJuIDA7Ci0KLSAgICBmb3IgKCBuID0gMDsgbiA8IHR5cGUxLT5udW1fZ2x5cGhzOyBuKysgKQotICAgIHsKLSAgICAgIGNoYXIqICBnbmFtZSA9IChjaGFyKil0eXBlMS0+Z2x5cGhfbmFtZXNbbl07Ci0KLQotICAgICAgaWYgKCBnbmFtZSAmJiBnbmFtZVswXSA9PSBuYW1lWzBdICAgICAgICAmJgotICAgICAgICAgICBmdF9zdHJsZW4oIGduYW1lICkgPT0gbGVuICAgICAgICAgICAmJgotICAgICAgICAgICBmdF9zdHJuY21wKCBnbmFtZSwgbmFtZSwgbGVuICkgPT0gMCApCi0gICAgICAgIHJldHVybiBuOwotICAgIH0KLQotICAgIHJldHVybiAwOwotICB9Ci0KLQotI3VuZGVmICBLRVJOX0lOREVYCi0jZGVmaW5lIEtFUk5fSU5ERVgoIGcxLCBnMiApICAoICggKEZUX1VMb25nKShnMSkgPDwgMTYgKSB8IChnMikgKQotCi0KLSAgLyogY29tcGFyZSB0d28ga2VybmluZyBwYWlycyAqLwotICBGVF9DQUxMQkFDS19ERUYoIGludCApCi0gIGNvbXBhcmVfa2Vybl9wYWlycyggY29uc3Qgdm9pZCogIGEsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogIGIgKQotICB7Ci0gICAgQUZNX0tlcm5QYWlyICBwYWlyMSA9IChBRk1fS2VyblBhaXIpYTsKLSAgICBBRk1fS2VyblBhaXIgIHBhaXIyID0gKEFGTV9LZXJuUGFpciliOwotCi0gICAgRlRfVUxvbmcgIGluZGV4MSA9IEtFUk5fSU5ERVgoIHBhaXIxLT5pbmRleDEsIHBhaXIxLT5pbmRleDIgKTsKLSAgICBGVF9VTG9uZyAgaW5kZXgyID0gS0VSTl9JTkRFWCggcGFpcjItPmluZGV4MSwgcGFpcjItPmluZGV4MiApOwotCi0KLSAgICBpZiAoIGluZGV4MSA+IGluZGV4MiApCi0gICAgICByZXR1cm4gMTsKLSAgICBlbHNlIGlmICggaW5kZXgxIDwgaW5kZXgyICkKLSAgICAgIHJldHVybiAtMTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgLyogcGFyc2UgYSBQRk0gZmlsZSAtLSBmb3Igbm93LCBvbmx5IHJlYWQgdGhlIGtlcm5pbmcgcGFpcnMgKi8KLSAgc3RhdGljIEZUX0Vycm9yCi0gIFQxX1JlYWRfUEZNKCBGVF9GYWNlICAgICAgIHQxX2ZhY2UsCi0gICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgIEFGTV9Gb250SW5mbyAgZmkgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgRlRfTWVtb3J5ICAgICBtZW1vcnkgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBGVF9CeXRlKiAgICAgIHN0YXJ0OwotICAgIEZUX0J5dGUqICAgICAgbGltaXQ7Ci0gICAgRlRfQnl0ZSogICAgICBwOwotICAgIEFGTV9LZXJuUGFpciAga3A7Ci0gICAgRlRfSW50ICAgICAgICB3aWR0aF90YWJsZV9sZW5ndGg7Ci0gICAgRlRfQ2hhck1hcCAgICBvbGRjaGFybWFwOwotICAgIEZUX0NoYXJNYXAgICAgY2hhcm1hcDsKLSAgICBGVF9JbnQgICAgICAgIG47Ci0KLQotICAgIHN0YXJ0ID0gKEZUX0J5dGUqKXN0cmVhbS0+Y3Vyc29yOwotICAgIGxpbWl0ID0gKEZUX0J5dGUqKXN0cmVhbS0+bGltaXQ7Ci0KLSAgICAvKiBGaWd1cmUgb3V0IGhvdyBsb25nIHRoZSB3aWR0aCB0YWJsZSBpcy4gICAgICAgICAgKi8KLSAgICAvKiBUaGlzIGluZm8gaXMgYSBsaXR0bGUtZW5kaWFuIHNob3J0IGF0IG9mZnNldCA5OS4gKi8KLSAgICBwID0gc3RhcnQgKyA5OTsKLSAgICBpZiAoIHAgKyAyID4gbGltaXQgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0gICAgd2lkdGhfdGFibGVfbGVuZ3RoID0gRlRfUEVFS19VU0hPUlRfTEUoIHAgKTsKLQotICAgIHAgKz0gMTggKyB3aWR0aF90YWJsZV9sZW5ndGg7Ci0gICAgaWYgKCBwICsgMHgxMiA+IGxpbWl0IHx8IEZUX1BFRUtfVVNIT1JUX0xFKCBwICkgPCAweDEyICkKLSAgICAgIC8qIGV4dGVuc2lvbiB0YWJsZSBpcyBwcm9iYWJseSBvcHRpb25hbCAqLwotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogS2VybmluZyBvZmZzZXQgaXMgMTQgYnl0ZXMgZnJvbSBzdGFydCBvZiBleHRlbnNpb25zIHRhYmxlLiAqLwotICAgIHAgKz0gMTQ7Ci0gICAgcCA9IHN0YXJ0ICsgRlRfUEVFS19VTE9OR19MRSggcCApOwotCi0gICAgaWYgKCBwID09IHN0YXJ0ICkKLSAgICAgIC8qIHplcm8gb2Zmc2V0IG1lYW5zIG5vIHRhYmxlICovCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIHAgKyAyID4gbGltaXQgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBmaS0+TnVtS2VyblBhaXIgPSBGVF9QRUVLX1VTSE9SVF9MRSggcCApOwotICAgIHAgKz0gMjsKLSAgICBpZiAoIHAgKyA0ICogZmktPk51bUtlcm5QYWlyID4gbGltaXQgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBBY3R1YWxseSwga2VybmluZyBwYWlycyBhcmUgc2ltcGx5IG9wdGlvbmFsISAqLwotICAgIGlmICggZmktPk51bUtlcm5QYWlyID09IDAgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogYWxsb2NhdGUgdGhlIHBhaXJzICovCi0gICAgaWYgKCBGVF9RTkVXX0FSUkFZKCBmaS0+S2VyblBhaXJzLCBmaS0+TnVtS2VyblBhaXIgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBub3csIHJlYWQgZWFjaCBrZXJuIHBhaXIgKi8KLSAgICBrcCAgICA9IGZpLT5LZXJuUGFpcnM7Ci0gICAgbGltaXQgPSBwICsgNCAqIGZpLT5OdW1LZXJuUGFpcjsKLQotICAgIC8qIFBGTSBrZXJuaW5nIGRhdGEgYXJlIHN0b3JlZCBieSBlbmNvZGluZyByYXRoZXIgdGhhbiBnbHlwaCBpbmRleCwgKi8KLSAgICAvKiBzbyBmaW5kIHRoZSBQb3N0U2NyaXB0IGNoYXJtYXAgb2YgdGhpcyBmb250IGFuZCBpbnN0YWxsIGl0ICAgICAgICovCi0gICAgLyogdGVtcG9yYXJpbHkuICBJZiB3ZSBmaW5kIG5vIFBvc3RTY3JpcHQgY2hhcm1hcCwgdGhlbiBqdXN0IHVzZSAgICAqLwotICAgIC8qIHRoZSBkZWZhdWx0IGFuZCBob3BlIGl0IGlzIHRoZSByaWdodCBvbmUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBvbGRjaGFybWFwID0gdDFfZmFjZS0+Y2hhcm1hcDsKLSAgICBjaGFybWFwICAgID0gTlVMTDsKLQotICAgIGZvciAoIG4gPSAwOyBuIDwgdDFfZmFjZS0+bnVtX2NoYXJtYXBzOyBuKysgKQotICAgIHsKLSAgICAgIGNoYXJtYXAgPSB0MV9mYWNlLT5jaGFybWFwc1tuXTsKLSAgICAgIC8qIGNoZWNrIGFnYWluc3QgUG9zdFNjcmlwdCBwc2V1ZG8gcGxhdGZvcm0gKi8KLSAgICAgIGlmICggY2hhcm1hcC0+cGxhdGZvcm1faWQgPT0gNyApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gRlRfU2V0X0NoYXJtYXAoIHQxX2ZhY2UsIGNoYXJtYXAgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBLZXJuaW5nIGluZm8gaXMgc3RvcmVkIGFzOiAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICBlbmNvZGluZyBvZiBmaXJzdCBnbHlwaCAoMSBieXRlKSAgICAgKi8KLSAgICAvKiAgIGVuY29kaW5nIG9mIHNlY29uZCBnbHlwaCAoMSBieXRlKSAgICAqLwotICAgIC8qICAgb2Zmc2V0IChsaXR0bGUtZW5kaWFuIHNob3J0KSAgICAgICAgICovCi0gICAgZm9yICggOyBwIDwgbGltaXQgOyBwICs9IDQgKQotICAgIHsKLSAgICAgIGtwLT5pbmRleDEgPSBGVF9HZXRfQ2hhcl9JbmRleCggdDFfZmFjZSwgcFswXSApOwotICAgICAga3AtPmluZGV4MiA9IEZUX0dldF9DaGFyX0luZGV4KCB0MV9mYWNlLCBwWzFdICk7Ci0KLSAgICAgIGtwLT54ID0gKEZUX0ludClGVF9QRUVLX1NIT1JUX0xFKHAgKyAyKTsKLSAgICAgIGtwLT55ID0gMDsKLQotICAgICAga3ArKzsKLSAgICB9Ci0KLSAgICBpZiAoIG9sZGNoYXJtYXAgIT0gTlVMTCApCi0gICAgICBlcnJvciA9IEZUX1NldF9DaGFybWFwKCB0MV9mYWNlLCBvbGRjaGFybWFwICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAvKiBub3csIHNvcnQgdGhlIGtlcm4gcGFpcnMgYWNjb3JkaW5nIHRvIHRoZWlyIGdseXBoIGluZGljZXMgKi8KLSAgICBmdF9xc29ydCggZmktPktlcm5QYWlycywgZmktPk51bUtlcm5QYWlyLCBzaXplb2YgKCBBRk1fS2VyblBhaXJSZWMgKSwKLSAgICAgICAgICAgICAgY29tcGFyZV9rZXJuX3BhaXJzICk7Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGVycm9yICkKLSAgICB7Ci0gICAgICBGVF9GUkVFKCBmaS0+S2VyblBhaXJzICk7Ci0gICAgICBmaS0+TnVtS2VyblBhaXIgPSAwOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgLyogcGFyc2UgYSBtZXRyaWNzIGZpbGUgLS0gZWl0aGVyIEFGTSBvciBQRk0gZGVwZW5kaW5nIG9uIHdoYXQgKi8KLSAgLyogaXQgdHVybnMgb3V0IHRvIGJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIFQxX1JlYWRfTWV0cmljcyggRlRfRmFjZSAgICB0MV9mYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1N0cmVhbSAgc3RyZWFtICkKLSAgewotICAgIFBTQXV4X1NlcnZpY2UgIHBzYXV4OwotICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSAgPSBzdHJlYW0tPm1lbW9yeTsKLSAgICBBRk1fUGFyc2VyUmVjICBwYXJzZXI7Ci0gICAgQUZNX0ZvbnRJbmZvICAgZmkgICAgICA9IE5VTEw7Ci0gICAgRlRfRXJyb3IgICAgICAgZXJyb3IgICA9IEZUX0VSUiggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotICAgIFQxX0ZvbnQgICAgICAgIHQxX2ZvbnQgPSAmKCAoVDFfRmFjZSl0MV9mYWNlICktPnR5cGUxOwotCi0KLSAgICBpZiAoIEZUX05FVyggZmkgKSAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgRlRfRlJBTUVfRU5URVIoIHN0cmVhbS0+c2l6ZSApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGZpLT5Gb250QkJveCAgPSB0MV9mb250LT5mb250X2Jib3g7Ci0gICAgZmktPkFzY2VuZGVyICA9IHQxX2ZvbnQtPmZvbnRfYmJveC55TWF4OwotICAgIGZpLT5EZXNjZW5kZXIgPSB0MV9mb250LT5mb250X2Jib3gueU1pbjsKLQotICAgIHBzYXV4ID0gKFBTQXV4X1NlcnZpY2UpKCAoVDFfRmFjZSl0MV9mYWNlICktPnBzYXV4OwotICAgIGlmICggcHNhdXgtPmFmbV9wYXJzZXJfZnVuY3MgKQotICAgIHsKLSAgICAgIGVycm9yID0gcHNhdXgtPmFmbV9wYXJzZXJfZnVuY3MtPmluaXQoICZwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPm1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Y3Vyc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLT5saW1pdCApOwotCi0gICAgICBpZiAoICFlcnJvciApCi0gICAgICB7Ci0gICAgICAgIHBhcnNlci5Gb250SW5mbyAgPSBmaTsKLSAgICAgICAgcGFyc2VyLmdldF9pbmRleCA9IHQxX2dldF9pbmRleDsKLSAgICAgICAgcGFyc2VyLnVzZXJfZGF0YSA9IHQxX2ZvbnQ7Ci0KLSAgICAgICAgZXJyb3IgPSBwc2F1eC0+YWZtX3BhcnNlcl9mdW5jcy0+cGFyc2UoICZwYXJzZXIgKTsKLSAgICAgICAgcHNhdXgtPmFmbV9wYXJzZXJfZnVuY3MtPmRvbmUoICZwYXJzZXIgKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIEZUX0VSUl9FUSggZXJyb3IsIFVua25vd25fRmlsZV9Gb3JtYXQgKSApCi0gICAgewotICAgICAgRlRfQnl0ZSogIHN0YXJ0ID0gc3RyZWFtLT5jdXJzb3I7Ci0KLQotICAgICAgLyogTVMgV2luZG93cyBhbGxvd3MgdmVyc2lvbnMgdXAgdG8gMHgzRkYgd2l0aG91dCBjb21wbGFpbmluZyAqLwotICAgICAgaWYgKCBzdHJlYW0tPnNpemUgPiA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgc3RhcnRbMV0gPCA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgIEZUX1BFRUtfVUxPTkdfTEUoIHN0YXJ0ICsgMiApID09IHN0cmVhbS0+c2l6ZSApCi0gICAgICAgIGVycm9yID0gVDFfUmVhZF9QRk0oIHQxX2ZhY2UsIHN0cmVhbSwgZmkgKTsKLSAgICB9Ci0KLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgdDFfZm9udC0+Zm9udF9iYm94ID0gZmktPkZvbnRCQm94OwotCi0gICAgICB0MV9mYWNlLT5iYm94LnhNaW4gPSAgIGZpLT5Gb250QkJveC54TWluICAgICAgICAgICAgPj4gMTY7Ci0gICAgICB0MV9mYWNlLT5iYm94LnlNaW4gPSAgIGZpLT5Gb250QkJveC55TWluICAgICAgICAgICAgPj4gMTY7Ci0gICAgICAvKiBubyBgVScgc3VmZml4IGhlcmUgdG8gMHhGRkZGISAqLwotICAgICAgdDFfZmFjZS0+YmJveC54TWF4ID0gKCBmaS0+Rm9udEJCb3gueE1heCArIDB4RkZGRiApID4+IDE2OwotICAgICAgdDFfZmFjZS0+YmJveC55TWF4ID0gKCBmaS0+Rm9udEJCb3gueU1heCArIDB4RkZGRiApID4+IDE2OwotCi0gICAgICAvKiBubyBgVScgc3VmZml4IGhlcmUgdG8gMHg4MDAwISAqLwotICAgICAgdDFfZmFjZS0+YXNjZW5kZXIgID0gKEZUX1Nob3J0KSggKCBmaS0+QXNjZW5kZXIgICsgMHg4MDAwICkgPj4gMTYgKTsKLSAgICAgIHQxX2ZhY2UtPmRlc2NlbmRlciA9IChGVF9TaG9ydCkoICggZmktPkRlc2NlbmRlciArIDB4ODAwMCApID4+IDE2ICk7Ci0KLSAgICAgIGlmICggZmktPk51bUtlcm5QYWlyICkKLSAgICAgIHsKLSAgICAgICAgdDFfZmFjZS0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfS0VSTklORzsKLSAgICAgICAgKCAoVDFfRmFjZSl0MV9mYWNlICktPmFmbV9kYXRhID0gZmk7Ci0gICAgICAgIGZpID0gTlVMTDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBGVF9GUkFNRV9FWElUKCk7Ci0KLSAgRXhpdDoKLSAgICBpZiAoIGZpICE9IE5VTEwgKQotICAgICAgVDFfRG9uZV9NZXRyaWNzKCBtZW1vcnksIGZpICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGZpbmQgdGhlIGtlcm5pbmcgZm9yIGEgZ2l2ZW4gZ2x5cGggcGFpciAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBUMV9HZXRfS2VybmluZyggQUZNX0ZvbnRJbmZvICBmaSwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGgxLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBnbHlwaDIsCi0gICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAgIGtlcm5pbmcgKQotICB7Ci0gICAgQUZNX0tlcm5QYWlyICBtaW4sIG1pZCwgbWF4OwotICAgIEZUX1VMb25nICAgICAgaWR4ID0gS0VSTl9JTkRFWCggZ2x5cGgxLCBnbHlwaDIgKTsKLQotCi0gICAgLyogc2ltcGxlIGJpbmFyeSBzZWFyY2ggKi8KLSAgICBtaW4gPSBmaS0+S2VyblBhaXJzOwotICAgIG1heCA9IG1pbiArIGZpLT5OdW1LZXJuUGFpciAtIDE7Ci0KLSAgICB3aGlsZSAoIG1pbiA8PSBtYXggKQotICAgIHsKLSAgICAgIEZUX1VMb25nICBtaWRpOwotCi0KLSAgICAgIG1pZCAgPSBtaW4gKyAoIG1heCAtIG1pbiApIC8gMjsKLSAgICAgIG1pZGkgPSBLRVJOX0lOREVYKCBtaWQtPmluZGV4MSwgbWlkLT5pbmRleDIgKTsKLQotICAgICAgaWYgKCBtaWRpID09IGlkeCApCi0gICAgICB7Ci0gICAgICAgIGtlcm5pbmctPnggPSBtaWQtPng7Ci0gICAgICAgIGtlcm5pbmctPnkgPSBtaWQtPnk7Ci0KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBpZiAoIG1pZGkgPCBpZHggKQotICAgICAgICBtaW4gPSBtaWQgKyAxOwotICAgICAgZWxzZQotICAgICAgICBtYXggPSBtaWQgLSAxOwotICAgIH0KLQotICAgIGtlcm5pbmctPnggPSAwOwotICAgIGtlcm5pbmctPnkgPSAwOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVDFfR2V0X1RyYWNrX0tlcm5pbmcoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgcHRzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfSW50ICAgICBkZWdyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGtlcm5pbmcgKQotICB7Ci0gICAgQUZNX0ZvbnRJbmZvICBmaSA9IChBRk1fRm9udEluZm8pKCAoVDFfRmFjZSlmYWNlICktPmFmbV9kYXRhOwotICAgIEZUX1VJbnQgICAgICAgaTsKLQotCi0gICAgaWYgKCAhZmkgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBmb3IgKCBpID0gMDsgaSA8IGZpLT5OdW1UcmFja0tlcm47IGkrKyApCi0gICAgewotICAgICAgQUZNX1RyYWNrS2VybiAgdGsgPSBmaS0+VHJhY2tLZXJucyArIGk7Ci0KLQotICAgICAgaWYgKCB0ay0+ZGVncmVlICE9IGRlZ3JlZSApCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBpZiAoIHB0c2l6ZSA8IHRrLT5taW5fcHRzaXplICkKLSAgICAgICAgKmtlcm5pbmcgPSB0ay0+bWluX2tlcm47Ci0gICAgICBlbHNlIGlmICggcHRzaXplID4gdGstPm1heF9wdHNpemUgKQotICAgICAgICAqa2VybmluZyA9IHRrLT5tYXhfa2VybjsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgKmtlcm5pbmcgPSBGVF9NdWxEaXYoIHB0c2l6ZSAtIHRrLT5taW5fcHRzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGstPm1heF9rZXJuIC0gdGstPm1pbl9rZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGstPm1heF9wdHNpemUgLSB0ay0+bWluX3B0c2l6ZSApICsKLSAgICAgICAgICAgICAgICAgICB0ay0+bWluX2tlcm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxYWZtLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFhZm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY0MmYzZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFhZm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxYWZtLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBBRk0gc3VwcG9ydCBmb3IgVHlwZSAxIGZvbnRzIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1QxQUZNX0hfXwotI2RlZmluZSBfX1QxQUZNX0hfXwotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlICJ0MW9ianMuaCIKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RZUEUxX1RZUEVTX0gKLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBUMV9SZWFkX01ldHJpY3MoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gIHN0cmVhbSApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgVDFfRG9uZV9NZXRyaWNzKCBGVF9NZW1vcnkgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICBBRk1fRm9udEluZm8gIGZpICk7Ci0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBUMV9HZXRfS2VybmluZyggQUZNX0ZvbnRJbmZvICBmaSwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGgxLAotICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgICBnbHlwaDIsCi0gICAgICAgICAgICAgICAgICBGVF9WZWN0b3IqICAgIGtlcm5pbmcgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBUMV9HZXRfVHJhY2tfS2VybmluZyggRlRfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQgICBwdHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9JbnQgICAgIGRlZ3JlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAga2VybmluZyApOwotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1QxQUZNX0hfXyAqLwotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxZHJpdmVyLmMgYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFkcml2ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcxZjJkMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFkcml2ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDcyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0MWRyaXZlci5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHlwZSAxIGRyaXZlciBpbnRlcmZhY2UgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgInQxZHJpdmVyLmgiCi0jaW5jbHVkZSAidDFnbG9hZC5oIgotI2luY2x1ZGUgInQxbG9hZC5oIgotCi0jaW5jbHVkZSAidDFlcnJvcnMuaCIKLQotI2lmbmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX0FGTQotI2luY2x1ZGUgInQxYWZtLmgiCi0jZW5kaWYKLQotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLQotI2luY2x1ZGUgRlRfU0VSVklDRV9NVUxUSVBMRV9NQVNURVJTX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfR0xZUEhfRElDVF9ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0ZPTlRfRk9STUFUX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9OQU1FX0gKLSNpbmNsdWRlIEZUX1NFUlZJQ0VfUE9TVFNDUklQVF9DTUFQU19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfSU5GT19ICi0jaW5jbHVkZSBGVF9TRVJWSUNFX0tFUk5JTkdfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdDFkcml2ZXIKLQotIC8qCi0gICogIEdMWVBIIERJQ1QgU0VSVklDRQotICAqCi0gICovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHQxX2dldF9nbHlwaF9uYW1lKCBUMV9GYWNlICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICBGVF9Qb2ludGVyICBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBidWZmZXJfbWF4ICkKLSAgewotICAgIEZUX1NUUkNQWU4oIGJ1ZmZlciwgZmFjZS0+dHlwZTEuZ2x5cGhfbmFtZXNbZ2x5cGhfaW5kZXhdLCBidWZmZXJfbWF4ICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMgRlRfVUludAotICB0MV9nZXRfbmFtZV9pbmRleCggVDFfRmFjZSAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1N0cmluZyogIGdseXBoX25hbWUgKQotICB7Ci0gICAgRlRfSW50ICBpOwotCi0KLSAgICBmb3IgKCBpID0gMDsgaSA8IGZhY2UtPnR5cGUxLm51bV9nbHlwaHM7IGkrKyApCi0gICAgewotICAgICAgRlRfU3RyaW5nKiAgZ25hbWUgPSBmYWNlLT50eXBlMS5nbHlwaF9uYW1lc1tpXTsKLQotCi0gICAgICBpZiAoICFmdF9zdHJjbXAoIGdseXBoX25hbWUsIGduYW1lICkgKQotICAgICAgICByZXR1cm4gKEZUX1VJbnQpaTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLSAgfQotCi0KLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfR2x5cGhEaWN0UmVjICB0MV9zZXJ2aWNlX2dseXBoX2RpY3QgPQotICB7Ci0gICAgKEZUX0dseXBoRGljdF9HZXROYW1lRnVuYykgIHQxX2dldF9nbHlwaF9uYW1lLAotICAgIChGVF9HbHlwaERpY3RfTmFtZUluZGV4RnVuYyl0MV9nZXRfbmFtZV9pbmRleAotICB9OwotCi0KLSAgLyoKLSAgICogIFBPU1RTQ1JJUFQgTkFNRSBTRVJWSUNFCi0gICAqCi0gICAqLwotCi0gIHN0YXRpYyBjb25zdCBjaGFyKgotICB0MV9nZXRfcHNfbmFtZSggVDFfRmFjZSAgZmFjZSApCi0gIHsKLSAgICByZXR1cm4gKGNvbnN0IGNoYXIqKSBmYWNlLT50eXBlMS5mb250X25hbWU7Ci0gIH0KLQotCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX1BzRm9udE5hbWVSZWMgIHQxX3NlcnZpY2VfcHNfbmFtZSA9Ci0gIHsKLSAgICAoRlRfUHNOYW1lX0dldEZ1bmMpdDFfZ2V0X3BzX25hbWUKLSAgfTsKLQotCi0gIC8qCi0gICAqICBNVUxUSVBMRSBNQVNURVJTIFNFUlZJQ0UKLSAgICoKLSAgICovCi0KLSNpZm5kZWYgVDFfQ09ORklHX09QVElPTl9OT19NTV9TVVBQT1JUCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX011bHRpTWFzdGVyc1JlYyAgdDFfc2VydmljZV9tdWx0aV9tYXN0ZXJzID0KLSAgewotICAgIChGVF9HZXRfTU1fRnVuYykgICAgICAgIFQxX0dldF9NdWx0aV9NYXN0ZXIsCi0gICAgKEZUX1NldF9NTV9EZXNpZ25fRnVuYykgVDFfU2V0X01NX0Rlc2lnbiwKLSAgICAoRlRfU2V0X01NX0JsZW5kX0Z1bmMpICBUMV9TZXRfTU1fQmxlbmQsCi0gICAgKEZUX0dldF9NTV9WYXJfRnVuYykgICAgVDFfR2V0X01NX1ZhciwKLSAgICAoRlRfU2V0X1Zhcl9EZXNpZ25fRnVuYylUMV9TZXRfVmFyX0Rlc2lnbgotICB9OwotI2VuZGlmCi0KLQotICAvKgotICAgKiAgUE9TVFNDUklQVCBJTkZPIFNFUlZJQ0UKLSAgICoKLSAgICovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHQxX3BzX2dldF9mb250X2luZm8oIEZUX0ZhY2UgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgUFNfRm9udEluZm9SZWMqICBhZm9udF9pbmZvICkKLSAgewotICAgICphZm9udF9pbmZvID0gKChUMV9GYWNlKWZhY2UpLT50eXBlMS5mb250X2luZm87Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdDFfcHNfZ2V0X2ZvbnRfZXh0cmEoIEZUX0ZhY2UgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBQU19Gb250RXh0cmFSZWMqICBhZm9udF9leHRyYSApCi0gIHsKLSAgICAqYWZvbnRfZXh0cmEgPSAoKFQxX0ZhY2UpZmFjZSktPnR5cGUxLmZvbnRfZXh0cmE7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMgRlRfSW50Ci0gIHQxX3BzX2hhc19nbHlwaF9uYW1lcyggRlRfRmFjZSAgZmFjZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGZhY2UgKTsKLQotICAgIHJldHVybiAxOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdDFfcHNfZ2V0X2ZvbnRfcHJpdmF0ZSggRlRfRmFjZSAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFBTX1ByaXZhdGVSZWMqICBhZm9udF9wcml2YXRlICkKLSAgewotICAgICphZm9udF9wcml2YXRlID0gKChUMV9GYWNlKWZhY2UpLT50eXBlMS5wcml2YXRlX2RpY3Q7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICBzdGF0aWMgRlRfTG9uZwotICB0MV9wc19nZXRfZm9udF92YWx1ZSggRlRfRmFjZSAgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgUFNfRGljdF9LZXlzICBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVF9Mb25nICAgICAgIHZhbHVlX2xlbl8gKQotICB7Ci0gICAgRlRfVUxvbmcgIHJldHZhbCAgICA9IDA7IC8qIGFsd2F5cyA+PSAxIGlmIHZhbGlkICovCi0gICAgRlRfVUxvbmcgIHZhbHVlX2xlbiA9IHZhbHVlX2xlbl8gPCAwID8gMCA6IChGVF9VTG9uZyl2YWx1ZV9sZW5fOwotCi0gICAgVDFfRmFjZSAgdDFmYWNlID0gKFQxX0ZhY2UpZmFjZTsKLSAgICBUMV9Gb250ICB0eXBlMSAgPSAmdDFmYWNlLT50eXBlMTsKLQotCi0gICAgc3dpdGNoICgga2V5ICkKLSAgICB7Ci0gICAgY2FzZSBQU19ESUNUX0ZPTlRfVFlQRToKLSAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5mb250X3R5cGUgKTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICooKEZUX0J5dGUgKil2YWx1ZSkgPSB0eXBlMS0+Zm9udF90eXBlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfRk9OVF9NQVRSSVg6Ci0gICAgICBpZiAoIGlkeCA8IHNpemVvZiAoIHR5cGUxLT5mb250X21hdHJpeCApIC8KLSAgICAgICAgICAgICAgICAgICBzaXplb2YgKCB0eXBlMS0+Zm9udF9tYXRyaXgueHggKSApCi0gICAgICB7Ci0gICAgICAgIEZUX0ZpeGVkICB2YWwgPSAwOwotCi0KLSAgICAgICAgcmV0dmFsID0gc2l6ZW9mICggdmFsICk7Ci0gICAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgIHsKLSAgICAgICAgICBzd2l0Y2ggKCBpZHggKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB2YWwgPSB0eXBlMS0+Zm9udF9tYXRyaXgueHg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB2YWwgPSB0eXBlMS0+Zm9udF9tYXRyaXgueHk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB2YWwgPSB0eXBlMS0+Zm9udF9tYXRyaXgueXg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICB2YWwgPSB0eXBlMS0+Zm9udF9tYXRyaXgueXk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgKigoRlRfRml4ZWQgKil2YWx1ZSkgPSB2YWw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX0ZPTlRfQkJPWDoKLSAgICAgIGlmICggaWR4IDwgc2l6ZW9mICggdHlwZTEtPmZvbnRfYmJveCApIC8KLSAgICAgICAgICAgICAgICAgICBzaXplb2YgKCB0eXBlMS0+Zm9udF9iYm94LnhNaW4gKSApCi0gICAgICB7Ci0gICAgICAgIEZUX0ZpeGVkICB2YWwgPSAwOwotCi0KLSAgICAgICAgcmV0dmFsID0gc2l6ZW9mICggdmFsICk7Ci0gICAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgIHsKLSAgICAgICAgICBzd2l0Y2ggKCBpZHggKQotICAgICAgICAgIHsKLSAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICB2YWwgPSB0eXBlMS0+Zm9udF9iYm94LnhNaW47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICB2YWwgPSB0eXBlMS0+Zm9udF9iYm94LnlNaW47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICB2YWwgPSB0eXBlMS0+Zm9udF9iYm94LnhNYXg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICB2YWwgPSB0eXBlMS0+Zm9udF9iYm94LnlNYXg7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgKigoRlRfRml4ZWQgKil2YWx1ZSkgPSB2YWw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX1BBSU5UX1RZUEU6Ci0gICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+cGFpbnRfdHlwZSApOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgKigoRlRfQnl0ZSAqKXZhbHVlKSA9IHR5cGUxLT5wYWludF90eXBlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfRk9OVF9OQU1FOgotICAgICAgcmV0dmFsID0gZnRfc3RybGVuKCB0eXBlMS0+Zm9udF9uYW1lICkgKyAxOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgZnRfbWVtY3B5KCB2YWx1ZSwgKHZvaWQgKikoIHR5cGUxLT5mb250X25hbWUgKSwgcmV0dmFsICk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9VTklRVUVfSUQ6Ci0gICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+cHJpdmF0ZV9kaWN0LnVuaXF1ZV9pZCApOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgKigoRlRfSW50ICopdmFsdWUpID0gdHlwZTEtPnByaXZhdGVfZGljdC51bmlxdWVfaWQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9OVU1fQ0hBUl9TVFJJTkdTOgotICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPm51bV9nbHlwaHMgKTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICooKEZUX0ludCAqKXZhbHVlKSA9IHR5cGUxLT5udW1fZ2x5cGhzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfQ0hBUl9TVFJJTkdfS0VZOgotICAgICAgaWYgKCBpZHggPCAoRlRfVUludCl0eXBlMS0+bnVtX2dseXBocyApCi0gICAgICB7Ci0gICAgICAgIHJldHZhbCA9IGZ0X3N0cmxlbiggdHlwZTEtPmdseXBoX25hbWVzW2lkeF0gKSArIDE7Ci0gICAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgIHsKLSAgICAgICAgICBmdF9tZW1jcHkoIHZhbHVlLCAodm9pZCAqKSggdHlwZTEtPmdseXBoX25hbWVzW2lkeF0gKSwgcmV0dmFsICk7Ci0gICAgICAgICAgKChGVF9DaGFyICopdmFsdWUpW3JldHZhbCAtIDFdID0gKEZUX0NoYXIpJ1wwJzsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfQ0hBUl9TVFJJTkc6Ci0gICAgICBpZiAoIGlkeCA8IChGVF9VSW50KXR5cGUxLT5udW1fZ2x5cGhzICkKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsID0gdHlwZTEtPmNoYXJzdHJpbmdzX2xlbltpZHhdICsgMTsKLSAgICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgewotICAgICAgICAgIGZ0X21lbWNweSggdmFsdWUsICh2b2lkICopKCB0eXBlMS0+Y2hhcnN0cmluZ3NbaWR4XSApLAotICAgICAgICAgICAgICAgICAgICAgcmV0dmFsIC0gMSApOwotICAgICAgICAgICgoRlRfQ2hhciAqKXZhbHVlKVtyZXR2YWwgLSAxXSA9IChGVF9DaGFyKSdcMCc7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX0VOQ09ESU5HX1RZUEU6Ci0gICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+ZW5jb2RpbmdfdHlwZSApOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgKigoVDFfRW5jb2RpbmdUeXBlICopdmFsdWUpID0gdHlwZTEtPmVuY29kaW5nX3R5cGU7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9FTkNPRElOR19FTlRSWToKLSAgICAgIGlmICggdHlwZTEtPmVuY29kaW5nX3R5cGUgPT0gVDFfRU5DT0RJTkdfVFlQRV9BUlJBWSAmJgotICAgICAgICAgICBpZHggPCAoRlRfVUludCl0eXBlMS0+ZW5jb2RpbmcubnVtX2NoYXJzICAgICAgICkKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsID0gZnRfc3RybGVuKCB0eXBlMS0+ZW5jb2RpbmcuY2hhcl9uYW1lW2lkeF0gKSArIDE7Ci0gICAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgIHsKLSAgICAgICAgICBmdF9tZW1jcHkoIHZhbHVlLCAodm9pZCAqKSggdHlwZTEtPmVuY29kaW5nLmNoYXJfbmFtZVtpZHhdICksCi0gICAgICAgICAgICAgICAgICAgICByZXR2YWwgLSAxICk7Ci0gICAgICAgICAgKChGVF9DaGFyICopdmFsdWUpW3JldHZhbCAtIDFdID0gKEZUX0NoYXIpJ1wwJzsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfTlVNX1NVQlJTOgotICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPm51bV9zdWJycyApOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgKigoRlRfSW50ICopdmFsdWUpID0gdHlwZTEtPm51bV9zdWJyczsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX1NVQlI6Ci0gICAgICBpZiAoIGlkeCA8IChGVF9VSW50KXR5cGUxLT5udW1fc3VicnMgKQotICAgICAgewotICAgICAgICByZXR2YWwgPSB0eXBlMS0+c3VicnNfbGVuW2lkeF0gKyAxOwotICAgICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICB7Ci0gICAgICAgICAgZnRfbWVtY3B5KCB2YWx1ZSwgKHZvaWQgKikoIHR5cGUxLT5zdWJyc1tpZHhdICksIHJldHZhbCAtIDEgKTsKLSAgICAgICAgICAoKEZUX0NoYXIgKil2YWx1ZSlbcmV0dmFsIC0gMV0gPSAoRlRfQ2hhciknXDAnOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9TVERfSFc6Ci0gICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+cHJpdmF0ZV9kaWN0LnN0YW5kYXJkX3dpZHRoWzBdICk7Ci0gICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICAqKChGVF9VU2hvcnQgKil2YWx1ZSkgPSB0eXBlMS0+cHJpdmF0ZV9kaWN0LnN0YW5kYXJkX3dpZHRoWzBdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfU1REX1ZXOgotICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPnByaXZhdGVfZGljdC5zdGFuZGFyZF9oZWlnaHRbMF0gKTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICooKEZUX1VTaG9ydCAqKXZhbHVlKSA9IHR5cGUxLT5wcml2YXRlX2RpY3Quc3RhbmRhcmRfaGVpZ2h0WzBdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfTlVNX0JMVUVfVkFMVUVTOgotICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPnByaXZhdGVfZGljdC5udW1fYmx1ZV92YWx1ZXMgKTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICooKEZUX0J5dGUgKil2YWx1ZSkgPSB0eXBlMS0+cHJpdmF0ZV9kaWN0Lm51bV9ibHVlX3ZhbHVlczsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX0JMVUVfVkFMVUU6Ci0gICAgICBpZiAoIGlkeCA8IHR5cGUxLT5wcml2YXRlX2RpY3QubnVtX2JsdWVfdmFsdWVzICkKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPnByaXZhdGVfZGljdC5ibHVlX3ZhbHVlc1tpZHhdICk7Ci0gICAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICAgKigoRlRfU2hvcnQgKil2YWx1ZSkgPSB0eXBlMS0+cHJpdmF0ZV9kaWN0LmJsdWVfdmFsdWVzW2lkeF07Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9CTFVFX1NDQUxFOgotICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPnByaXZhdGVfZGljdC5ibHVlX3NjYWxlICk7Ci0gICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICAqKChGVF9GaXhlZCAqKXZhbHVlKSA9IHR5cGUxLT5wcml2YXRlX2RpY3QuYmx1ZV9zY2FsZTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX0JMVUVfRlVaWjoKLSAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5wcml2YXRlX2RpY3QuYmx1ZV9mdXp6ICk7Ci0gICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICAqKChGVF9JbnQgKil2YWx1ZSkgPSB0eXBlMS0+cHJpdmF0ZV9kaWN0LmJsdWVfZnV6ejsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX0JMVUVfU0hJRlQ6Ci0gICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+cHJpdmF0ZV9kaWN0LmJsdWVfc2hpZnQgKTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICooKEZUX0ludCAqKXZhbHVlKSA9IHR5cGUxLT5wcml2YXRlX2RpY3QuYmx1ZV9zaGlmdDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX05VTV9PVEhFUl9CTFVFUzoKLSAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5wcml2YXRlX2RpY3QubnVtX290aGVyX2JsdWVzICk7Ci0gICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICAqKChGVF9CeXRlICopdmFsdWUpID0gdHlwZTEtPnByaXZhdGVfZGljdC5udW1fb3RoZXJfYmx1ZXM7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9PVEhFUl9CTFVFOgotICAgICAgaWYgKCBpZHggPCB0eXBlMS0+cHJpdmF0ZV9kaWN0Lm51bV9vdGhlcl9ibHVlcyApCi0gICAgICB7Ci0gICAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5wcml2YXRlX2RpY3Qub3RoZXJfYmx1ZXNbaWR4XSApOwotICAgICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICAgICooKEZUX1Nob3J0ICopdmFsdWUpID0gdHlwZTEtPnByaXZhdGVfZGljdC5vdGhlcl9ibHVlc1tpZHhdOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfTlVNX0ZBTUlMWV9CTFVFUzoKLSAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5wcml2YXRlX2RpY3QubnVtX2ZhbWlseV9ibHVlcyApOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgKigoRlRfQnl0ZSAqKXZhbHVlKSA9IHR5cGUxLT5wcml2YXRlX2RpY3QubnVtX2ZhbWlseV9ibHVlczsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX0ZBTUlMWV9CTFVFOgotICAgICAgaWYgKCBpZHggPCB0eXBlMS0+cHJpdmF0ZV9kaWN0Lm51bV9mYW1pbHlfYmx1ZXMgKQotICAgICAgewotICAgICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+cHJpdmF0ZV9kaWN0LmZhbWlseV9ibHVlc1tpZHhdICk7Ci0gICAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICAgKigoRlRfU2hvcnQgKil2YWx1ZSkgPSB0eXBlMS0+cHJpdmF0ZV9kaWN0LmZhbWlseV9ibHVlc1tpZHhdOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfTlVNX0ZBTUlMWV9PVEhFUl9CTFVFUzoKLSAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5wcml2YXRlX2RpY3QubnVtX2ZhbWlseV9vdGhlcl9ibHVlcyApOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgKigoRlRfQnl0ZSAqKXZhbHVlKSA9IHR5cGUxLT5wcml2YXRlX2RpY3QubnVtX2ZhbWlseV9vdGhlcl9ibHVlczsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX0ZBTUlMWV9PVEhFUl9CTFVFOgotICAgICAgaWYgKCBpZHggPCB0eXBlMS0+cHJpdmF0ZV9kaWN0Lm51bV9mYW1pbHlfb3RoZXJfYmx1ZXMgKQotICAgICAgewotICAgICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+cHJpdmF0ZV9kaWN0LmZhbWlseV9vdGhlcl9ibHVlc1tpZHhdICk7Ci0gICAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICAgKigoRlRfU2hvcnQgKil2YWx1ZSkgPSB0eXBlMS0+cHJpdmF0ZV9kaWN0LmZhbWlseV9vdGhlcl9ibHVlc1tpZHhdOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfTlVNX1NURU1fU05BUF9IOgotICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPnByaXZhdGVfZGljdC5udW1fc25hcF93aWR0aHMgKTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICooKEZUX0J5dGUgKil2YWx1ZSkgPSB0eXBlMS0+cHJpdmF0ZV9kaWN0Lm51bV9zbmFwX3dpZHRoczsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX1NURU1fU05BUF9IOgotICAgICAgaWYgKCBpZHggPCB0eXBlMS0+cHJpdmF0ZV9kaWN0Lm51bV9zbmFwX3dpZHRocyApCi0gICAgICB7Ci0gICAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5wcml2YXRlX2RpY3Quc25hcF93aWR0aHNbaWR4XSApOwotICAgICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICAgICooKEZUX1Nob3J0ICopdmFsdWUpID0gdHlwZTEtPnByaXZhdGVfZGljdC5zbmFwX3dpZHRoc1tpZHhdOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfTlVNX1NURU1fU05BUF9WOgotICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPnByaXZhdGVfZGljdC5udW1fc25hcF9oZWlnaHRzICk7Ci0gICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICAqKChGVF9CeXRlICopdmFsdWUpID0gdHlwZTEtPnByaXZhdGVfZGljdC5udW1fc25hcF9oZWlnaHRzOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfU1RFTV9TTkFQX1Y6Ci0gICAgICBpZiAoIGlkeCA8IHR5cGUxLT5wcml2YXRlX2RpY3QubnVtX3NuYXBfaGVpZ2h0cyApCi0gICAgICB7Ci0gICAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5wcml2YXRlX2RpY3Quc25hcF9oZWlnaHRzW2lkeF0gKTsKLSAgICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgICAqKChGVF9TaG9ydCAqKXZhbHVlKSA9IHR5cGUxLT5wcml2YXRlX2RpY3Quc25hcF9oZWlnaHRzW2lkeF07Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9STkRfU1RFTV9VUDoKLSAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5wcml2YXRlX2RpY3Qucm91bmRfc3RlbV91cCApOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgKigoRlRfQm9vbCAqKXZhbHVlKSA9IHR5cGUxLT5wcml2YXRlX2RpY3Qucm91bmRfc3RlbV91cDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX0ZPUkNFX0JPTEQ6Ci0gICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+cHJpdmF0ZV9kaWN0LmZvcmNlX2JvbGQgKTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICooKEZUX0Jvb2wgKil2YWx1ZSkgPSB0eXBlMS0+cHJpdmF0ZV9kaWN0LmZvcmNlX2JvbGQ7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9NSU5fRkVBVFVSRToKLSAgICAgIGlmICggaWR4IDwgc2l6ZW9mICggdHlwZTEtPnByaXZhdGVfZGljdC5taW5fZmVhdHVyZSApIC8KLSAgICAgICAgICAgICAgICAgICBzaXplb2YgKCB0eXBlMS0+cHJpdmF0ZV9kaWN0Lm1pbl9mZWF0dXJlWzBdICkgKQotICAgICAgewotICAgICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+cHJpdmF0ZV9kaWN0Lm1pbl9mZWF0dXJlW2lkeF0gKTsKLSAgICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgICAqKChGVF9TaG9ydCAqKXZhbHVlKSA9IHR5cGUxLT5wcml2YXRlX2RpY3QubWluX2ZlYXR1cmVbaWR4XTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX0xFTl9JVjoKLSAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5wcml2YXRlX2RpY3QubGVuSVYgKTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICooKEZUX0ludCAqKXZhbHVlKSA9IHR5cGUxLT5wcml2YXRlX2RpY3QubGVuSVY7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9QQVNTV09SRDoKLSAgICAgIHJldHZhbCA9IHNpemVvZiAoIHR5cGUxLT5wcml2YXRlX2RpY3QucGFzc3dvcmQgKTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICooKEZUX0xvbmcgKil2YWx1ZSkgPSB0eXBlMS0+cHJpdmF0ZV9kaWN0LnBhc3N3b3JkOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfTEFOR1VBR0VfR1JPVVA6Ci0gICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+cHJpdmF0ZV9kaWN0Lmxhbmd1YWdlX2dyb3VwICk7Ci0gICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICAqKChGVF9Mb25nICopdmFsdWUpID0gdHlwZTEtPnByaXZhdGVfZGljdC5sYW5ndWFnZV9ncm91cDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX0lTX0ZJWEVEX1BJVENIOgotICAgICAgcmV0dmFsID0gc2l6ZW9mICggdHlwZTEtPmZvbnRfaW5mby5pc19maXhlZF9waXRjaCApOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgKigoRlRfQm9vbCAqKXZhbHVlKSA9IHR5cGUxLT5mb250X2luZm8uaXNfZml4ZWRfcGl0Y2g7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9VTkRFUkxJTkVfUE9TSVRJT046Ci0gICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+Zm9udF9pbmZvLnVuZGVybGluZV9wb3NpdGlvbiApOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgKigoRlRfU2hvcnQgKil2YWx1ZSkgPSB0eXBlMS0+Zm9udF9pbmZvLnVuZGVybGluZV9wb3NpdGlvbjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX1VOREVSTElORV9USElDS05FU1M6Ci0gICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+Zm9udF9pbmZvLnVuZGVybGluZV90aGlja25lc3MgKTsKLSAgICAgIGlmICggdmFsdWUgJiYgdmFsdWVfbGVuID49IHJldHZhbCApCi0gICAgICAgICooKEZUX1VTaG9ydCAqKXZhbHVlKSA9IHR5cGUxLT5mb250X2luZm8udW5kZXJsaW5lX3RoaWNrbmVzczsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX0ZTX1RZUEU6Ci0gICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+Zm9udF9leHRyYS5mc190eXBlICk7Ci0gICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICAqKChGVF9VU2hvcnQgKil2YWx1ZSkgPSB0eXBlMS0+Zm9udF9leHRyYS5mc190eXBlOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfVkVSU0lPTjoKLSAgICAgIHJldHZhbCA9IGZ0X3N0cmxlbiggdHlwZTEtPmZvbnRfaW5mby52ZXJzaW9uICkgKyAxOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgZnRfbWVtY3B5KCB2YWx1ZSwgKHZvaWQgKikoIHR5cGUxLT5mb250X2luZm8udmVyc2lvbiApLCByZXR2YWwgKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX05PVElDRToKLSAgICAgIHJldHZhbCA9IGZ0X3N0cmxlbiggdHlwZTEtPmZvbnRfaW5mby5ub3RpY2UgKSArIDE7Ci0gICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICBmdF9tZW1jcHkoIHZhbHVlLCAodm9pZCAqKSggdHlwZTEtPmZvbnRfaW5mby5ub3RpY2UgKSwgcmV0dmFsICk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9GVUxMX05BTUU6Ci0gICAgICByZXR2YWwgPSBmdF9zdHJsZW4oIHR5cGUxLT5mb250X2luZm8uZnVsbF9uYW1lICkgKyAxOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgZnRfbWVtY3B5KCB2YWx1ZSwgKHZvaWQgKikoIHR5cGUxLT5mb250X2luZm8uZnVsbF9uYW1lICksIHJldHZhbCApOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFBTX0RJQ1RfRkFNSUxZX05BTUU6Ci0gICAgICByZXR2YWwgPSBmdF9zdHJsZW4oIHR5cGUxLT5mb250X2luZm8uZmFtaWx5X25hbWUgKSArIDE7Ci0gICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICBmdF9tZW1jcHkoIHZhbHVlLCAodm9pZCAqKSggdHlwZTEtPmZvbnRfaW5mby5mYW1pbHlfbmFtZSApLCByZXR2YWwgKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBQU19ESUNUX1dFSUdIVDoKLSAgICAgIHJldHZhbCA9IGZ0X3N0cmxlbiggdHlwZTEtPmZvbnRfaW5mby53ZWlnaHQgKSArIDE7Ci0gICAgICBpZiAoIHZhbHVlICYmIHZhbHVlX2xlbiA+PSByZXR2YWwgKQotICAgICAgICBmdF9tZW1jcHkoIHZhbHVlLCAodm9pZCAqKSggdHlwZTEtPmZvbnRfaW5mby53ZWlnaHQgKSwgcmV0dmFsICk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgUFNfRElDVF9JVEFMSUNfQU5HTEU6Ci0gICAgICByZXR2YWwgPSBzaXplb2YgKCB0eXBlMS0+Zm9udF9pbmZvLml0YWxpY19hbmdsZSApOwotICAgICAgaWYgKCB2YWx1ZSAmJiB2YWx1ZV9sZW4gPj0gcmV0dmFsICkKLSAgICAgICAgKigoRlRfTG9uZyAqKXZhbHVlKSA9IHR5cGUxLT5mb250X2luZm8uaXRhbGljX2FuZ2xlOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJldHZhbCA9PSAwID8gLTEgOiAoRlRfTG9uZylyZXR2YWw7Ci0gIH0KLQotCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlX1BzSW5mb1JlYyAgdDFfc2VydmljZV9wc19pbmZvID0KLSAgewotICAgIChQU19HZXRGb250SW5mb0Z1bmMpICAgdDFfcHNfZ2V0X2ZvbnRfaW5mbywKLSAgICAoUFNfR2V0Rm9udEV4dHJhRnVuYykgIHQxX3BzX2dldF9mb250X2V4dHJhLAotICAgIChQU19IYXNHbHlwaE5hbWVzRnVuYykgdDFfcHNfaGFzX2dseXBoX25hbWVzLAotICAgIChQU19HZXRGb250UHJpdmF0ZUZ1bmMpdDFfcHNfZ2V0X2ZvbnRfcHJpdmF0ZSwKLSAgICAoUFNfR2V0Rm9udFZhbHVlRnVuYykgIHQxX3BzX2dldF9mb250X3ZhbHVlLAotICB9OwotCi0KLSNpZm5kZWYgVDFfQ09ORklHX09QVElPTl9OT19BRk0KLSAgc3RhdGljIGNvbnN0IEZUX1NlcnZpY2VfS2VybmluZ1JlYyAgdDFfc2VydmljZV9rZXJuaW5nID0KLSAgewotICAgIFQxX0dldF9UcmFja19LZXJuaW5nLAotICB9OwotI2VuZGlmCi0KLQotICAvKgotICAgKiAgU0VSVklDRSBMSVNUCi0gICAqCi0gICAqLwotCi0gIHN0YXRpYyBjb25zdCBGVF9TZXJ2aWNlRGVzY1JlYyAgdDFfc2VydmljZXNbXSA9Ci0gIHsKLSAgICB7IEZUX1NFUlZJQ0VfSURfUE9TVFNDUklQVF9GT05UX05BTUUsICZ0MV9zZXJ2aWNlX3BzX25hbWUgfSwKLSAgICB7IEZUX1NFUlZJQ0VfSURfR0xZUEhfRElDVCwgICAgICAgICAgICZ0MV9zZXJ2aWNlX2dseXBoX2RpY3QgfSwKLSAgICB7IEZUX1NFUlZJQ0VfSURfRk9OVF9GT1JNQVQsICAgICAgICAgIEZUX0ZPTlRfRk9STUFUX1RZUEVfMSB9LAotICAgIHsgRlRfU0VSVklDRV9JRF9QT1NUU0NSSVBUX0lORk8sICAgICAgJnQxX3NlcnZpY2VfcHNfaW5mbyB9LAotCi0jaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fQUZNCi0gICAgeyBGVF9TRVJWSUNFX0lEX0tFUk5JTkcsICAgICAgICAgICAgICAmdDFfc2VydmljZV9rZXJuaW5nIH0sCi0jZW5kaWYKLQotI2lmbmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX01NX1NVUFBPUlQKLSAgICB7IEZUX1NFUlZJQ0VfSURfTVVMVElfTUFTVEVSUywgICAgICAgICZ0MV9zZXJ2aWNlX211bHRpX21hc3RlcnMgfSwKLSNlbmRpZgotICAgIHsgTlVMTCwgTlVMTCB9Ci0gIH07Ci0KLQotICBGVF9DQUxMQkFDS19ERUYoIEZUX01vZHVsZV9JbnRlcmZhY2UgKQotICBHZXRfSW50ZXJmYWNlKCBGVF9Nb2R1bGUgICAgICAgICBtb2R1bGUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IEZUX1N0cmluZyogIHQxX2ludGVyZmFjZSApCi0gIHsKLSAgICBGVF9VTlVTRUQoIG1vZHVsZSApOwotCi0gICAgcmV0dXJuIGZ0X3NlcnZpY2VfbGlzdF9sb29rdXAoIHQxX3NlcnZpY2VzLCB0MV9pbnRlcmZhY2UgKTsKLSAgfQotCi0KLSNpZm5kZWYgVDFfQ09ORklHX09QVElPTl9OT19BRk0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxGdW5jdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBHZXRfS2VybmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGRyaXZlciBtZXRob2QgdXNlZCB0byByZXR1cm4gdGhlIGtlcm5pbmcgdmVjdG9yIGJldHdlZW4gdHdvICAgICAgKi8KLSAgLyogICAgZ2x5cGhzIG9mIHRoZSBzYW1lIGZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZSAgICAgICAgOjogQSBoYW5kbGUgdG8gdGhlIHNvdXJjZSBmYWNlIG9iamVjdC4gICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBsZWZ0X2dseXBoICA6OiBUaGUgaW5kZXggb2YgdGhlIGxlZnQgZ2x5cGggaW4gdGhlIGtlcm4gcGFpci4gICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHJpZ2h0X2dseXBoIDo6IFRoZSBpbmRleCBvZiB0aGUgcmlnaHQgZ2x5cGggaW4gdGhlIGtlcm4gcGFpci4gICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE91dHB1dD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGtlcm5pbmcgICAgIDo6IFRoZSBrZXJuaW5nIHZlY3Rvci4gIFRoaXMgaXMgaW4gZm9udCB1bml0cyBmb3IgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICBzY2FsYWJsZSBmb3JtYXRzLCBhbmQgaW4gcGl4ZWxzIGZvciBmaXhlZC1zaXplcyAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgZm9ybWF0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8UmV0dXJuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRnJlZVR5cGUgZXJyb3IgY29kZS4gIDAgbWVhbnMgc3VjY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8Tm90ZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgT25seSBob3Jpem9udGFsIGxheW91dHMgKGxlZnQtdG8tcmlnaHQgJiByaWdodC10by1sZWZ0KSBhcmUgICAgICAgICovCi0gIC8qICAgIHN1cHBvcnRlZCBieSB0aGlzIGZ1bmN0aW9uLiAgT3RoZXIgbGF5b3V0cywgb3IgbW9yZSBzb3BoaXN0aWNhdGVkICAqLwotICAvKiAgICBrZXJuaW5ncyBhcmUgb3V0IG9mIHNjb3BlIG9mIHRoaXMgbWV0aG9kICh0aGUgYmFzaWMgZHJpdmVyICAgICAgICAgKi8KLSAgLyogICAgaW50ZXJmYWNlIGlzIG1lYW50IHRvIGJlIHNpbXBsZSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUaGV5IGNhbiBiZSBpbXBsZW1lbnRlZCBieSBmb3JtYXQtc3BlY2lmaWMgaW50ZXJmYWNlcy4gICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9FcnJvcgotICBHZXRfS2VybmluZyggRlRfRmFjZSAgICAgdDFmYWNlLCAgICAgICAgLyogVDFfRmFjZSAqLwotICAgICAgICAgICAgICAgRlRfVUludCAgICAgbGVmdF9nbHlwaCwKLSAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIHJpZ2h0X2dseXBoLAotICAgICAgICAgICAgICAgRlRfVmVjdG9yKiAga2VybmluZyApCi0gIHsKLSAgICBUMV9GYWNlICBmYWNlID0gKFQxX0ZhY2UpdDFmYWNlOwotCi0KLSAgICBrZXJuaW5nLT54ID0gMDsKLSAgICBrZXJuaW5nLT55ID0gMDsKLQotICAgIGlmICggZmFjZS0+YWZtX2RhdGEgKQotICAgICAgVDFfR2V0X0tlcm5pbmcoIChBRk1fRm9udEluZm8pZmFjZS0+YWZtX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgbGVmdF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICByaWdodF9nbHlwaCwKLSAgICAgICAgICAgICAgICAgICAgICBrZXJuaW5nICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotI2VuZGlmIC8qIFQxX0NPTkZJR19PUFRJT05fTk9fQUZNICovCi0KLQotICBGVF9DQUxMQkFDS19UQUJMRV9ERUYKLSAgY29uc3QgRlRfRHJpdmVyX0NsYXNzUmVjICB0MV9kcml2ZXJfY2xhc3MgPQotICB7Ci0gICAgewotICAgICAgRlRfTU9EVUxFX0ZPTlRfRFJJVkVSICAgICAgIHwKLSAgICAgIEZUX01PRFVMRV9EUklWRVJfU0NBTEFCTEUgICB8Ci0gICAgICBGVF9NT0RVTEVfRFJJVkVSX0hBU19ISU5URVIsCi0KLSAgICAgIHNpemVvZiAoIEZUX0RyaXZlclJlYyApLAotCi0gICAgICAidHlwZTEiLAotICAgICAgMHgxMDAwMEwsCi0gICAgICAweDIwMDAwTCwKLQotICAgICAgMCwgICAvKiBmb3JtYXQgaW50ZXJmYWNlICovCi0KLSAgICAgIFQxX0RyaXZlcl9Jbml0LAotICAgICAgVDFfRHJpdmVyX0RvbmUsCi0gICAgICBHZXRfSW50ZXJmYWNlLAotICAgIH0sCi0KLSAgICBzaXplb2YgKCBUMV9GYWNlUmVjICksCi0gICAgc2l6ZW9mICggVDFfU2l6ZVJlYyApLAotICAgIHNpemVvZiAoIFQxX0dseXBoU2xvdFJlYyApLAotCi0gICAgVDFfRmFjZV9Jbml0LAotICAgIFQxX0ZhY2VfRG9uZSwKLSAgICBUMV9TaXplX0luaXQsCi0gICAgVDFfU2l6ZV9Eb25lLAotICAgIFQxX0dseXBoU2xvdF9Jbml0LAotICAgIFQxX0dseXBoU2xvdF9Eb25lLAotCi0gICAgVDFfTG9hZF9HbHlwaCwKLQotI2lmZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fQUZNCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBGVF9GYWNlX0dldEtlcm5pbmdGdW5jICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAvKiBGVF9GYWNlX0F0dGFjaEZ1bmMgICAgICovCi0jZWxzZQotICAgIEdldF9LZXJuaW5nLAotICAgIFQxX1JlYWRfTWV0cmljcywKLSNlbmRpZgotICAgIFQxX0dldF9BZHZhbmNlcywKLSAgICBUMV9TaXplX1JlcXVlc3QsCi0gICAgMCAgICAgICAgICAgICAgICAgICAgICAvKiBGVF9TaXplX1NlbGVjdEZ1bmMgICAgICovCi0gIH07Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFkcml2ZXIuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MWRyaXZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGJjZjgxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MWRyaXZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDFkcml2ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEhpZ2gtbGV2ZWwgVHlwZSAxIGRyaXZlciBpbnRlcmZhY2UgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fVDFEUklWRVJfSF9fCi0jZGVmaW5lIF9fVDFEUklWRVJfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9EUklWRVJfSAotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9QSUMKLSNlcnJvciAidGhpcyBtb2R1bGUgZG9lcyBub3Qgc3VwcG9ydCBQSUMgeWV0IgotI2VuZGlmCi0KLQotICBGVF9FWFBPUlRfVkFSKCBjb25zdCBGVF9Ecml2ZXJfQ2xhc3NSZWMgKSAgdDFfZHJpdmVyX2NsYXNzOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fVDFEUklWRVJfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFlcnJvcnMuaCBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MWVycm9ycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzdhOWJkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MWVycm9ycy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDFlcnJvcnMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFR5cGUgMSBlcnJvciBjb2RlcyAoc3BlY2lmaWNhdGlvbiBvbmx5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAyMDAxLTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBmaWxlIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBUeXBlIDEgZXJyb3IgZW51bWVyYXRpb24gY29uc3RhbnRzLiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX1QxRVJST1JTX0hfXwotI2RlZmluZSBfX1QxRVJST1JTX0hfXwotCi0jaW5jbHVkZSBGVF9NT0RVTEVfRVJST1JTX0gKLQotI3VuZGVmIF9fRlRFUlJPUlNfSF9fCi0KLSN1bmRlZiAgRlRfRVJSX1BSRUZJWAotI2RlZmluZSBGVF9FUlJfUFJFRklYICBUMV9FcnJfCi0jZGVmaW5lIEZUX0VSUl9CQVNFICAgIEZUX01vZF9FcnJfVHlwZTEKLQotI2luY2x1ZGUgRlRfRVJST1JTX0gKLQotI2VuZGlmIC8qIF9fVDFFUlJPUlNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFnbG9hZC5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxZ2xvYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVhZGEyZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFnbG9hZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxZ2xvYWQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDEgR2x5cGggTG9hZGVyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSAidDFnbG9hZC5oIgotI2luY2x1ZGUgRlRfSU5URVJOQUxfQ0FMQ19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9ERUJVR19ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfT1VUTElORV9ICi0jaW5jbHVkZSBGVF9JTlRFUk5BTF9QT1NUU0NSSVBUX0FVWF9ICi0KLSNpbmNsdWRlICJ0MWVycm9ycy5oIgotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdDFnbG9hZAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgICAgICAgICAgQ09NUFVURSBUSEUgTUFYSU1VTSBBRFZBTkNFIFdJRFRIICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgVGhlIGZvbGxvd2luZyBjb2RlIGlzIGluIGNoYXJnZSBvZiBjb21wdXRpbmcgICAgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgIHRoZSBtYXhpbXVtIGFkdmFuY2Ugd2lkdGggb2YgdGhlIGZvbnQuICBJdCAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICBxdWlja2x5IHByb2Nlc3NlcyBlYWNoIGdseXBoIGNoYXJzdHJpbmcgdG8gICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKiogICAgZXh0cmFjdCB0aGUgdmFsdWUgZnJvbSBlaXRoZXIgYSBgc2J3JyBvciBgc2VhYycgICAqKioqKioqKiovCi0gIC8qKioqKioqKioqICAgIG9wZXJhdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKioqKioqLwotICAvKioqKioqKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBUMV9QYXJzZV9HbHlwaF9BbmRfR2V0X0NoYXJfU3RyaW5nKCBUMV9EZWNvZGVyICBkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRGF0YSogICAgY2hhcl9zdHJpbmcgKQotICB7Ci0gICAgVDFfRmFjZSAgIGZhY2UgID0gKFQxX0ZhY2UpZGVjb2Rlci0+YnVpbGRlci5mYWNlOwotICAgIFQxX0ZvbnQgICB0eXBlMSA9ICZmYWNlLT50eXBlMTsKLSAgICBGVF9FcnJvciAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0KLSNpZmRlZiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMCi0gICAgRlRfSW5jcmVtZW50YWxfSW50ZXJmYWNlUmVjICppbmMgPQotICAgICAgICAgICAgICAgICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZTsKLSNlbmRpZgotCi0KLSAgICBkZWNvZGVyLT5mb250X21hdHJpeCA9IHR5cGUxLT5mb250X21hdHJpeDsKLSAgICBkZWNvZGVyLT5mb250X29mZnNldCA9IHR5cGUxLT5mb250X29mZnNldDsKLQotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLQotICAgIC8qIEZvciBpbmNyZW1lbnRhbCBmb250cyBnZXQgdGhlIGNoYXJhY3RlciBkYXRhIHVzaW5nIHRoZSAqLwotICAgIC8qIGNhbGxiYWNrIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggaW5jICkKLSAgICAgIGVycm9yID0gaW5jLT5mdW5jcy0+Z2V0X2dseXBoX2RhdGEoIGluYy0+b2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2x5cGhfaW5kZXgsIGNoYXJfc3RyaW5nICk7Ci0gICAgZWxzZQotCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCAqLwotCi0gICAgLyogRm9yIG9yZGluYXJ5IGZvbnRzIGdldCB0aGUgY2hhcmFjdGVyIGRhdGEgc3RvcmVkIGluIHRoZSBmYWNlIHJlY29yZC4gKi8KLSAgICB7Ci0gICAgICBjaGFyX3N0cmluZy0+cG9pbnRlciA9IHR5cGUxLT5jaGFyc3RyaW5nc1tnbHlwaF9pbmRleF07Ci0gICAgICBjaGFyX3N0cmluZy0+bGVuZ3RoICA9IChGVF9JbnQpdHlwZTEtPmNoYXJzdHJpbmdzX2xlbltnbHlwaF9pbmRleF07Ci0gICAgfQotCi0gICAgaWYgKCAhZXJyb3IgKQotICAgICAgZXJyb3IgPSBkZWNvZGVyLT5mdW5jcy5wYXJzZV9jaGFyc3RyaW5ncygKLSAgICAgICAgICAgICAgICBkZWNvZGVyLCAoRlRfQnl0ZSopY2hhcl9zdHJpbmctPnBvaW50ZXIsCi0gICAgICAgICAgICAgICAgKEZUX1VJbnQpY2hhcl9zdHJpbmctPmxlbmd0aCApOwotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotCi0gICAgLyogSW5jcmVtZW50YWwgZm9udHMgY2FuIG9wdGlvbmFsbHkgb3ZlcnJpZGUgdGhlIG1ldHJpY3MuICovCi0gICAgaWYgKCAhZXJyb3IgJiYgaW5jICYmIGluYy0+ZnVuY3MtPmdldF9nbHlwaF9tZXRyaWNzICkKLSAgICB7Ci0gICAgICBGVF9JbmNyZW1lbnRhbF9NZXRyaWNzUmVjICBtZXRyaWNzOwotCi0KLSAgICAgIG1ldHJpY3MuYmVhcmluZ194ID0gRklYRURfVE9fSU5UKCBkZWNvZGVyLT5idWlsZGVyLmxlZnRfYmVhcmluZy54ICk7Ci0gICAgICBtZXRyaWNzLmJlYXJpbmdfeSA9IDA7Ci0gICAgICBtZXRyaWNzLmFkdmFuY2UgICA9IEZJWEVEX1RPX0lOVCggZGVjb2Rlci0+YnVpbGRlci5hZHZhbmNlLnggKTsKLSAgICAgIG1ldHJpY3MuYWR2YW5jZV92ID0gRklYRURfVE9fSU5UKCBkZWNvZGVyLT5idWlsZGVyLmFkdmFuY2UueSApOwotCi0gICAgICBlcnJvciA9IGluYy0+ZnVuY3MtPmdldF9nbHlwaF9tZXRyaWNzKCBpbmMtPm9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdseXBoX2luZGV4LCBGQUxTRSwgJm1ldHJpY3MgKTsKLQotICAgICAgZGVjb2Rlci0+YnVpbGRlci5sZWZ0X2JlYXJpbmcueCA9IElOVF9UT19GSVhFRCggbWV0cmljcy5iZWFyaW5nX3ggKTsKLSAgICAgIGRlY29kZXItPmJ1aWxkZXIuYWR2YW5jZS54ICAgICAgPSBJTlRfVE9fRklYRUQoIG1ldHJpY3MuYWR2YW5jZSApOwotICAgICAgZGVjb2Rlci0+YnVpbGRlci5hZHZhbmNlLnkgICAgICA9IElOVF9UT19GSVhFRCggbWV0cmljcy5hZHZhbmNlX3YgKTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMICovCi0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0NBTExCQUNLX0RFRiggRlRfRXJyb3IgKQotICBUMV9QYXJzZV9HbHlwaCggVDFfRGVjb2RlciAgZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgIGdseXBoX2luZGV4ICkKLSAgewotICAgIEZUX0RhdGEgICBnbHlwaF9kYXRhOwotICAgIEZUX0Vycm9yICBlcnJvciA9IFQxX1BhcnNlX0dseXBoX0FuZF9HZXRfQ2hhcl9TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyLCBnbHlwaF9pbmRleCwgJmdseXBoX2RhdGEgKTsKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotCi0gICAgaWYgKCAhZXJyb3IgKQotICAgIHsKLSAgICAgIFQxX0ZhY2UgIGZhY2UgPSAoVDFfRmFjZSlkZWNvZGVyLT5idWlsZGVyLmZhY2U7Ci0KLQotICAgICAgaWYgKCBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgKQotICAgICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPmZ1bmNzLT5mcmVlX2dseXBoX2RhdGEoCi0gICAgICAgICAgZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlLT5vYmplY3QsCi0gICAgICAgICAgJmdseXBoX2RhdGEgKTsKLSAgICB9Ci0KLSNlbmRpZiAvKiBGVF9DT05GSUdfT1BUSU9OX0lOQ1JFTUVOVEFMICovCi0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUMV9Db21wdXRlX01heF9BZHZhbmNlKCBUMV9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGVF9Qb3MqICBtYXhfYWR2YW5jZSApCi0gIHsKLSAgICBGVF9FcnJvciAgICAgICBlcnJvcjsKLSAgICBUMV9EZWNvZGVyUmVjICBkZWNvZGVyOwotICAgIEZUX0ludCAgICAgICAgIGdseXBoX2luZGV4OwotICAgIFQxX0ZvbnQgICAgICAgIHR5cGUxID0gJmZhY2UtPnR5cGUxOwotICAgIFBTQXV4X1NlcnZpY2UgIHBzYXV4ID0gKFBTQXV4X1NlcnZpY2UpZmFjZS0+cHNhdXg7Ci0KLQotICAgIEZUX0FTU0VSVCggKCBmYWNlLT5sZW5fYnVpbGRjaGFyID09IDAgKSA9PSAoIGZhY2UtPmJ1aWxkY2hhciA9PSBOVUxMICkgKTsKLQotICAgICptYXhfYWR2YW5jZSA9IDA7Ci0KLSAgICAvKiBpbml0aWFsaXplIGxvYWQgZGVjb2RlciAqLwotICAgIGVycm9yID0gcHNhdXgtPnQxX2RlY29kZXJfZnVuY3MtPmluaXQoICZkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9GYWNlKWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogc2l6ZSAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGdseXBoIHNsb3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSoqKXR5cGUxLT5nbHlwaF9uYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5ibGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JFTkRFUl9NT0RFX05PUk1BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9QYXJzZV9HbHlwaCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgZGVjb2Rlci5idWlsZGVyLm1ldHJpY3Nfb25seSA9IDE7Ci0gICAgZGVjb2Rlci5idWlsZGVyLmxvYWRfcG9pbnRzICA9IDA7Ci0KLSAgICBkZWNvZGVyLm51bV9zdWJycyAgICAgPSB0eXBlMS0+bnVtX3N1YnJzOwotICAgIGRlY29kZXIuc3VicnMgICAgICAgICA9IHR5cGUxLT5zdWJyczsKLSAgICBkZWNvZGVyLnN1YnJzX2xlbiAgICAgPSB0eXBlMS0+c3VicnNfbGVuOwotCi0gICAgZGVjb2Rlci5idWlsZGNoYXIgICAgID0gZmFjZS0+YnVpbGRjaGFyOwotICAgIGRlY29kZXIubGVuX2J1aWxkY2hhciA9IGZhY2UtPmxlbl9idWlsZGNoYXI7Ci0KLSAgICAqbWF4X2FkdmFuY2UgPSAwOwotCi0gICAgLyogZm9yIGVhY2ggZ2x5cGgsIHBhcnNlIHRoZSBnbHlwaCBjaGFyc3RyaW5nIGFuZCBleHRyYWN0ICovCi0gICAgLyogdGhlIGFkdmFuY2Ugd2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZm9yICggZ2x5cGhfaW5kZXggPSAwOyBnbHlwaF9pbmRleCA8IHR5cGUxLT5udW1fZ2x5cGhzOyBnbHlwaF9pbmRleCsrICkKLSAgICB7Ci0gICAgICAvKiBub3cgZ2V0IGxvYWQgdGhlIHVuc2NhbGVkIG91dGxpbmUgKi8KLSAgICAgICh2b2lkKVQxX1BhcnNlX0dseXBoKCAmZGVjb2RlciwgKEZUX1VJbnQpZ2x5cGhfaW5kZXggKTsKLSAgICAgIGlmICggZ2x5cGhfaW5kZXggPT0gMCB8fCBkZWNvZGVyLmJ1aWxkZXIuYWR2YW5jZS54ID4gKm1heF9hZHZhbmNlICkKLSAgICAgICAgKm1heF9hZHZhbmNlID0gZGVjb2Rlci5idWlsZGVyLmFkdmFuY2UueDsKLQotICAgICAgLyogaWdub3JlIHRoZSBlcnJvciBpZiBvbmUgb2NjdXJyZWQgLSBza2lwIHRvIG5leHQgZ2x5cGggKi8KLSAgICB9Ci0KLSAgICBwc2F1eC0+dDFfZGVjb2Rlcl9mdW5jcy0+ZG9uZSggJmRlY29kZXIgKTsKLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUMV9HZXRfQWR2YW5jZXMoIEZUX0ZhY2UgICAgdDFmYWNlLCAgICAgICAgLyogVDFfRmFjZSAqLwotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBjb3VudCwKLSAgICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgIGxvYWRfZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBhZHZhbmNlcyApCi0gIHsKLSAgICBUMV9GYWNlICAgICAgICBmYWNlICA9IChUMV9GYWNlKXQxZmFjZTsKLSAgICBUMV9EZWNvZGVyUmVjICBkZWNvZGVyOwotICAgIFQxX0ZvbnQgICAgICAgIHR5cGUxID0gJmZhY2UtPnR5cGUxOwotICAgIFBTQXV4X1NlcnZpY2UgIHBzYXV4ID0gKFBTQXV4X1NlcnZpY2UpZmFjZS0+cHNhdXg7Ci0gICAgRlRfVUludCAgICAgICAgbm47Ci0gICAgRlRfRXJyb3IgICAgICAgZXJyb3I7Ci0KLQotICAgIGlmICggbG9hZF9mbGFncyAmIEZUX0xPQURfVkVSVElDQUxfTEFZT1VUICkKLSAgICB7Ci0gICAgICBmb3IgKCBubiA9IDA7IG5uIDwgY291bnQ7IG5uKysgKQotICAgICAgICBhZHZhbmNlc1tubl0gPSAwOwotCi0gICAgICByZXR1cm4gRlRfRXJyX09rOwotICAgIH0KLQotICAgIGVycm9yID0gcHNhdXgtPnQxX2RlY29kZXJfZnVuY3MtPmluaXQoICZkZWNvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGVF9GYWNlKWZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyogc2l6ZSAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIGdseXBoIHNsb3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlRfQnl0ZSoqKXR5cGUxLT5nbHlwaF9uYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5ibGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX1JFTkRFUl9NT0RFX05PUk1BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9QYXJzZV9HbHlwaCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgcmV0dXJuIGVycm9yOwotCi0gICAgZGVjb2Rlci5idWlsZGVyLm1ldHJpY3Nfb25seSA9IDE7Ci0gICAgZGVjb2Rlci5idWlsZGVyLmxvYWRfcG9pbnRzICA9IDA7Ci0KLSAgICBkZWNvZGVyLm51bV9zdWJycyA9IHR5cGUxLT5udW1fc3VicnM7Ci0gICAgZGVjb2Rlci5zdWJycyAgICAgPSB0eXBlMS0+c3VicnM7Ci0gICAgZGVjb2Rlci5zdWJyc19sZW4gPSB0eXBlMS0+c3VicnNfbGVuOwotCi0gICAgZGVjb2Rlci5idWlsZGNoYXIgICAgID0gZmFjZS0+YnVpbGRjaGFyOwotICAgIGRlY29kZXIubGVuX2J1aWxkY2hhciA9IGZhY2UtPmxlbl9idWlsZGNoYXI7Ci0KLSAgICBmb3IgKCBubiA9IDA7IG5uIDwgY291bnQ7IG5uKysgKQotICAgIHsKLSAgICAgIGVycm9yID0gVDFfUGFyc2VfR2x5cGgoICZkZWNvZGVyLCBmaXJzdCArIG5uICk7Ci0gICAgICBpZiAoICFlcnJvciApCi0gICAgICAgIGFkdmFuY2VzW25uXSA9IEZJWEVEX1RPX0lOVCggZGVjb2Rlci5idWlsZGVyLmFkdmFuY2UueCApOwotICAgICAgZWxzZQotICAgICAgICBhZHZhbmNlc1tubl0gPSAwOwotICAgIH0KLQotICAgIHJldHVybiBGVF9FcnJfT2s7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUMV9Mb2FkX0dseXBoKCBGVF9HbHlwaFNsb3QgIHQxZ2x5cGgsICAgICAgICAgIC8qIFQxX0dseXBoU2xvdCAqLwotICAgICAgICAgICAgICAgICBGVF9TaXplICAgICAgIHQxc2l6ZSwgICAgICAgICAgIC8qIFQxX1NpemUgICAgICAqLwotICAgICAgICAgICAgICAgICBGVF9VSW50ICAgICAgIGdseXBoX2luZGV4LAotICAgICAgICAgICAgICAgICBGVF9JbnQzMiAgICAgIGxvYWRfZmxhZ3MgKQotICB7Ci0gICAgVDFfR2x5cGhTbG90ICAgICAgICAgICAgZ2x5cGggPSAoVDFfR2x5cGhTbG90KXQxZ2x5cGg7Ci0gICAgRlRfRXJyb3IgICAgICAgICAgICAgICAgZXJyb3I7Ci0gICAgVDFfRGVjb2RlclJlYyAgICAgICAgICAgZGVjb2RlcjsKLSAgICBUMV9GYWNlICAgICAgICAgICAgICAgICBmYWNlID0gKFQxX0ZhY2UpdDFnbHlwaC0+ZmFjZTsKLSAgICBGVF9Cb29sICAgICAgICAgICAgICAgICBoaW50aW5nOwotICAgIFQxX0ZvbnQgICAgICAgICAgICAgICAgIHR5cGUxICAgICAgICAgPSAmZmFjZS0+dHlwZTE7Ci0gICAgUFNBdXhfU2VydmljZSAgICAgICAgICAgcHNhdXggICAgICAgICA9IChQU0F1eF9TZXJ2aWNlKWZhY2UtPnBzYXV4OwotICAgIGNvbnN0IFQxX0RlY29kZXJfRnVuY3MgIGRlY29kZXJfZnVuY3MgPSBwc2F1eC0+dDFfZGVjb2Rlcl9mdW5jczsKLQotICAgIEZUX01hdHJpeCAgICAgICAgICAgICAgIGZvbnRfbWF0cml4OwotICAgIEZUX1ZlY3RvciAgICAgICAgICAgICAgIGZvbnRfb2Zmc2V0OwotICAgIEZUX0RhdGEgICAgICAgICAgICAgICAgIGdseXBoX2RhdGE7Ci0gICAgRlRfQm9vbCAgICAgICAgICAgICAgICAgbXVzdF9maW5pc2hfZGVjb2RlciA9IEZBTFNFOwotI2lmZGVmIEZUX0NPTkZJR19PUFRJT05fSU5DUkVNRU5UQUwKLSAgICBGVF9Cb29sICAgICAgICAgICAgICAgICBnbHlwaF9kYXRhX2xvYWRlZCA9IDA7Ci0jZW5kaWYKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgIGlmICggZ2x5cGhfaW5kZXggPj0gKEZUX1VJbnQpZmFjZS0+cm9vdC5udW1fZ2x5cGhzICYmCi0gICAgICAgICAhZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlICAgKQotI2Vsc2UKLSAgICBpZiAoIGdseXBoX2luZGV4ID49IChGVF9VSW50KWZhY2UtPnJvb3QubnVtX2dseXBocyApCi0jZW5kaWYgLyogRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTCAqLwotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBGVF9UUkFDRTEoKCAiVDFfTG9hZF9HbHlwaDogZ2x5cGggaW5kZXggJWRcbiIsIGdseXBoX2luZGV4ICkpOwotCi0gICAgRlRfQVNTRVJUKCAoIGZhY2UtPmxlbl9idWlsZGNoYXIgPT0gMCApID09ICggZmFjZS0+YnVpbGRjaGFyID09IE5VTEwgKSApOwotCi0gICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19SRUNVUlNFICkKLSAgICAgIGxvYWRfZmxhZ3MgfD0gRlRfTE9BRF9OT19TQ0FMRSB8IEZUX0xPQURfTk9fSElOVElORzsKLQotICAgIGlmICggdDFzaXplICkKLSAgICB7Ci0gICAgICBnbHlwaC0+eF9zY2FsZSA9IHQxc2l6ZS0+bWV0cmljcy54X3NjYWxlOwotICAgICAgZ2x5cGgtPnlfc2NhbGUgPSB0MXNpemUtPm1ldHJpY3MueV9zY2FsZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGdseXBoLT54X3NjYWxlID0gMHgxMDAwMEw7Ci0gICAgICBnbHlwaC0+eV9zY2FsZSA9IDB4MTAwMDBMOwotICAgIH0KLQotICAgIHQxZ2x5cGgtPm91dGxpbmUubl9wb2ludHMgICA9IDA7Ci0gICAgdDFnbHlwaC0+b3V0bGluZS5uX2NvbnRvdXJzID0gMDsKLQotICAgIGhpbnRpbmcgPSBGVF9CT09MKCAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX05PX1NDQUxFICAgKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICggbG9hZF9mbGFncyAmIEZUX0xPQURfTk9fSElOVElORyApID09IDAgKTsKLQotICAgIHQxZ2x5cGgtPmZvcm1hdCA9IEZUX0dMWVBIX0ZPUk1BVF9PVVRMSU5FOwotCi0gICAgZXJyb3IgPSBkZWNvZGVyX2Z1bmNzLT5pbml0KCAmZGVjb2RlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxZ2x5cGgtPmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MWdseXBoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX0J5dGUqKil0eXBlMS0+Z2x5cGhfbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5ibGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0JPT0woIGhpbnRpbmcgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZUX0xPQURfVEFSR0VUX01PREUoIGxvYWRfZmxhZ3MgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX1BhcnNlX0dseXBoICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBtdXN0X2ZpbmlzaF9kZWNvZGVyID0gVFJVRTsKLQotICAgIGRlY29kZXIuYnVpbGRlci5ub19yZWN1cnNlID0gRlRfQk9PTCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19SRUNVUlNFICkgIT0gMCApOwotCi0gICAgZGVjb2Rlci5udW1fc3VicnMgICAgID0gdHlwZTEtPm51bV9zdWJyczsKLSAgICBkZWNvZGVyLnN1YnJzICAgICAgICAgPSB0eXBlMS0+c3VicnM7Ci0gICAgZGVjb2Rlci5zdWJyc19sZW4gICAgID0gdHlwZTEtPnN1YnJzX2xlbjsKLQotICAgIGRlY29kZXIuYnVpbGRjaGFyICAgICA9IGZhY2UtPmJ1aWxkY2hhcjsKLSAgICBkZWNvZGVyLmxlbl9idWlsZGNoYXIgPSBmYWNlLT5sZW5fYnVpbGRjaGFyOwotCi0gICAgLyogbm93IGxvYWQgdGhlIHVuc2NhbGVkIG91dGxpbmUgKi8KLSAgICBlcnJvciA9IFQxX1BhcnNlX0dseXBoX0FuZF9HZXRfQ2hhcl9TdHJpbmcoICZkZWNvZGVyLCBnbHlwaF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnbHlwaF9kYXRhICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgIGdseXBoX2RhdGFfbG9hZGVkID0gMTsKLSNlbmRpZgotCi0gICAgZm9udF9tYXRyaXggPSBkZWNvZGVyLmZvbnRfbWF0cml4OwotICAgIGZvbnRfb2Zmc2V0ID0gZGVjb2Rlci5mb250X29mZnNldDsKLQotICAgIC8qIHNhdmUgbmV3IGdseXBoIHRhYmxlcyAqLwotICAgIGRlY29kZXJfZnVuY3MtPmRvbmUoICZkZWNvZGVyICk7Ci0KLSAgICBtdXN0X2ZpbmlzaF9kZWNvZGVyID0gRkFMU0U7Ci0KLSAgICAvKiBub3csIHNldCB0aGUgbWV0cmljcyAtLSB0aGlzIGlzIHJhdGhlciBzaW1wbGUsIGFzICAgKi8KLSAgICAvKiB0aGUgbGVmdCBzaWRlIGJlYXJpbmcgaXMgdGhlIHhNaW4sIGFuZCB0aGUgdG9wIHNpZGUgKi8KLSAgICAvKiBiZWFyaW5nIHRoZSB5TWF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoICFlcnJvciApCi0gICAgewotICAgICAgdDFnbHlwaC0+b3V0bGluZS5mbGFncyAmPSBGVF9PVVRMSU5FX09XTkVSOwotICAgICAgdDFnbHlwaC0+b3V0bGluZS5mbGFncyB8PSBGVF9PVVRMSU5FX1JFVkVSU0VfRklMTDsKLQotICAgICAgLyogZm9yIGNvbXBvc2l0ZSBnbHlwaHMsIHJldHVybiBvbmx5IGxlZnQgc2lkZSBiZWFyaW5nIGFuZCAqLwotICAgICAgLyogYWR2YW5jZSB3aWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19SRUNVUlNFICkKLSAgICAgIHsKLSAgICAgICAgRlRfU2xvdF9JbnRlcm5hbCAgaW50ZXJuYWwgPSB0MWdseXBoLT5pbnRlcm5hbDsKLQotCi0gICAgICAgIHQxZ2x5cGgtPm1ldHJpY3MuaG9yaUJlYXJpbmdYID0KLSAgICAgICAgICBGSVhFRF9UT19JTlQoIGRlY29kZXIuYnVpbGRlci5sZWZ0X2JlYXJpbmcueCApOwotICAgICAgICB0MWdseXBoLT5tZXRyaWNzLmhvcmlBZHZhbmNlICA9Ci0gICAgICAgICAgRklYRURfVE9fSU5UKCBkZWNvZGVyLmJ1aWxkZXIuYWR2YW5jZS54ICk7Ci0KLSAgICAgICAgaW50ZXJuYWwtPmdseXBoX21hdHJpeCAgICAgID0gZm9udF9tYXRyaXg7Ci0gICAgICAgIGludGVybmFsLT5nbHlwaF9kZWx0YSAgICAgICA9IGZvbnRfb2Zmc2V0OwotICAgICAgICBpbnRlcm5hbC0+Z2x5cGhfdHJhbnNmb3JtZWQgPSAxOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBGVF9CQm94ICAgICAgICAgICAgY2JveDsKLSAgICAgICAgRlRfR2x5cGhfTWV0cmljcyogIG1ldHJpY3MgPSAmdDFnbHlwaC0+bWV0cmljczsKLQotCi0gICAgICAgIC8qIGNvcHkgdGhlIF91bnNjYWxlZF8gYWR2YW5jZSB3aWR0aCAqLwotICAgICAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSA9Ci0gICAgICAgICAgRklYRURfVE9fSU5UKCBkZWNvZGVyLmJ1aWxkZXIuYWR2YW5jZS54ICk7Ci0gICAgICAgIHQxZ2x5cGgtPmxpbmVhckhvcmlBZHZhbmNlID0KLSAgICAgICAgICBGSVhFRF9UT19JTlQoIGRlY29kZXIuYnVpbGRlci5hZHZhbmNlLnggKTsKLSAgICAgICAgdDFnbHlwaC0+aW50ZXJuYWwtPmdseXBoX3RyYW5zZm9ybWVkID0gMDsKLQotICAgICAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBtYWtlIHVwIHZlcnRpY2FsIG9uZXMgKi8KLSAgICAgICAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSA9ICggZmFjZS0+dHlwZTEuZm9udF9iYm94LnlNYXggLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT50eXBlMS5mb250X2Jib3gueU1pbiApID4+IDE2OwotICAgICAgICAgIHQxZ2x5cGgtPmxpbmVhclZlcnRBZHZhbmNlID0gbWV0cmljcy0+dmVydEFkdmFuY2U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgPQotICAgICAgICAgICAgRklYRURfVE9fSU5UKCBkZWNvZGVyLmJ1aWxkZXIuYWR2YW5jZS55ICk7Ci0gICAgICAgICAgdDFnbHlwaC0+bGluZWFyVmVydEFkdmFuY2UgPQotICAgICAgICAgICAgRklYRURfVE9fSU5UKCBkZWNvZGVyLmJ1aWxkZXIuYWR2YW5jZS55ICk7Ci0gICAgICAgIH0KLQotICAgICAgICB0MWdseXBoLT5mb3JtYXQgPSBGVF9HTFlQSF9GT1JNQVRfT1VUTElORTsKLQotICAgICAgICBpZiAoIHQxc2l6ZSAmJiB0MXNpemUtPm1ldHJpY3MueV9wcGVtIDwgMjQgKQotICAgICAgICAgIHQxZ2x5cGgtPm91dGxpbmUuZmxhZ3MgfD0gRlRfT1VUTElORV9ISUdIX1BSRUNJU0lPTjsKLQotI2lmIDEKLSAgICAgICAgLyogYXBwbHkgdGhlIGZvbnQgbWF0cml4LCBpZiBhbnkgKi8KLSAgICAgICAgaWYgKCBmb250X21hdHJpeC54eCAhPSAweDEwMDAwTCB8fCBmb250X21hdHJpeC55eSAhPSAweDEwMDAwTCB8fAotICAgICAgICAgICAgIGZvbnRfbWF0cml4Lnh5ICE9IDAgICAgICAgIHx8IGZvbnRfbWF0cml4Lnl4ICE9IDAgICAgICAgICkKLSAgICAgICAgewotICAgICAgICAgIEZUX091dGxpbmVfVHJhbnNmb3JtKCAmdDFnbHlwaC0+b3V0bGluZSwgJmZvbnRfbWF0cml4ICk7Ci0KLSAgICAgICAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSA9IEZUX011bEZpeCggbWV0cmljcy0+aG9yaUFkdmFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRfbWF0cml4Lnh4ICk7Ci0gICAgICAgICAgbWV0cmljcy0+dmVydEFkdmFuY2UgPSBGVF9NdWxGaXgoIG1ldHJpY3MtPnZlcnRBZHZhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X21hdHJpeC55eSApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBmb250X29mZnNldC54IHx8IGZvbnRfb2Zmc2V0LnkgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfT3V0bGluZV9UcmFuc2xhdGUoICZ0MWdseXBoLT5vdXRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X29mZnNldC54LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250X29mZnNldC55ICk7Ci0KLSAgICAgICAgICBtZXRyaWNzLT5ob3JpQWR2YW5jZSArPSBmb250X29mZnNldC54OwotICAgICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlICs9IGZvbnRfb2Zmc2V0Lnk7Ci0gICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgIGlmICggKCBsb2FkX2ZsYWdzICYgRlRfTE9BRF9OT19TQ0FMRSApID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogc2NhbGUgdGhlIG91dGxpbmUgYW5kIHRoZSBtZXRyaWNzICovCi0gICAgICAgICAgRlRfSW50ICAgICAgIG47Ci0gICAgICAgICAgRlRfT3V0bGluZSogIGN1ciA9IGRlY29kZXIuYnVpbGRlci5iYXNlOwotICAgICAgICAgIEZUX1ZlY3RvciogICB2ZWMgPSBjdXItPnBvaW50czsKLSAgICAgICAgICBGVF9GaXhlZCAgICAgeF9zY2FsZSA9IGdseXBoLT54X3NjYWxlOwotICAgICAgICAgIEZUX0ZpeGVkICAgICB5X3NjYWxlID0gZ2x5cGgtPnlfc2NhbGU7Ci0KLQotICAgICAgICAgIC8qIEZpcnN0IG9mIGFsbCwgc2NhbGUgdGhlIHBvaW50cywgaWYgd2UgYXJlIG5vdCBoaW50aW5nICovCi0gICAgICAgICAgaWYgKCAhaGludGluZyB8fCAhIGRlY29kZXIuYnVpbGRlci5oaW50c19mdW5jcyApCi0gICAgICAgICAgICBmb3IgKCBuID0gY3VyLT5uX3BvaW50czsgbiA+IDA7IG4tLSwgdmVjKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB2ZWMtPnggPSBGVF9NdWxGaXgoIHZlYy0+eCwgeF9zY2FsZSApOwotICAgICAgICAgICAgICB2ZWMtPnkgPSBGVF9NdWxGaXgoIHZlYy0+eSwgeV9zY2FsZSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgLyogVGhlbiBzY2FsZSB0aGUgbWV0cmljcyAqLwotICAgICAgICAgIG1ldHJpY3MtPmhvcmlBZHZhbmNlID0gRlRfTXVsRml4KCBtZXRyaWNzLT5ob3JpQWR2YW5jZSwgeF9zY2FsZSApOwotICAgICAgICAgIG1ldHJpY3MtPnZlcnRBZHZhbmNlID0gRlRfTXVsRml4KCBtZXRyaWNzLT52ZXJ0QWR2YW5jZSwgeV9zY2FsZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogY29tcHV0ZSB0aGUgb3RoZXIgbWV0cmljcyAqLwotICAgICAgICBGVF9PdXRsaW5lX0dldF9DQm94KCAmdDFnbHlwaC0+b3V0bGluZSwgJmNib3ggKTsKLQotICAgICAgICBtZXRyaWNzLT53aWR0aCAgPSBjYm94LnhNYXggLSBjYm94LnhNaW47Ci0gICAgICAgIG1ldHJpY3MtPmhlaWdodCA9IGNib3gueU1heCAtIGNib3gueU1pbjsKLQotICAgICAgICBtZXRyaWNzLT5ob3JpQmVhcmluZ1ggPSBjYm94LnhNaW47Ci0gICAgICAgIG1ldHJpY3MtPmhvcmlCZWFyaW5nWSA9IGNib3gueU1heDsKLQotICAgICAgICBpZiAoIGxvYWRfZmxhZ3MgJiBGVF9MT0FEX1ZFUlRJQ0FMX0xBWU9VVCApCi0gICAgICAgIHsKLSAgICAgICAgICAvKiBtYWtlIHVwIHZlcnRpY2FsIG9uZXMgKi8KLSAgICAgICAgICBmdF9zeW50aGVzaXplX3ZlcnRpY2FsX21ldHJpY3MoIG1ldHJpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLT52ZXJ0QWR2YW5jZSApOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8qIFNldCBjb250cm9sIGRhdGEgdG8gdGhlIGdseXBoIGNoYXJzdHJpbmdzLiAgTm90ZSB0aGF0IHRoaXMgaXMgKi8KLSAgICAgIC8qIF9ub3RfIHplcm8tdGVybWluYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIHQxZ2x5cGgtPmNvbnRyb2xfZGF0YSA9IChGVF9CeXRlKilnbHlwaF9kYXRhLnBvaW50ZXI7Ci0gICAgICB0MWdseXBoLT5jb250cm9sX2xlbiAgPSBnbHlwaF9kYXRhLmxlbmd0aDsKLSAgICB9Ci0KLQotICBFeGl0OgotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotICAgIGlmICggZ2x5cGhfZGF0YV9sb2FkZWQgJiYgZmFjZS0+cm9vdC5pbnRlcm5hbC0+aW5jcmVtZW50YWxfaW50ZXJmYWNlICkKLSAgICB7Ci0gICAgICBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UtPmZ1bmNzLT5mcmVlX2dseXBoX2RhdGEoCi0gICAgICAgIGZhY2UtPnJvb3QuaW50ZXJuYWwtPmluY3JlbWVudGFsX2ludGVyZmFjZS0+b2JqZWN0LAotICAgICAgICAmZ2x5cGhfZGF0YSApOwotCi0gICAgICAvKiBTZXQgdGhlIGNvbnRyb2wgZGF0YSB0byBudWxsIC0gaXQgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSBpZiAgICovCi0gICAgICAvKiBsb2FkZWQgaW5jcmVtZW50YWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICB0MWdseXBoLT5jb250cm9sX2RhdGEgPSBOVUxMOwotICAgICAgdDFnbHlwaC0+Y29udHJvbF9sZW4gID0gMDsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmICggbXVzdF9maW5pc2hfZGVjb2RlciApCi0gICAgICBkZWNvZGVyX2Z1bmNzLT5kb25lKCAmZGVjb2RlciApOwotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFnbG9hZC5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxZ2xvYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmNjBkNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFnbG9hZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDFnbG9hZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFR5cGUgMSBHbHlwaCBMb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaWZuZGVmIF9fVDFHTE9BRF9IX18KLSNkZWZpbmUgX19UMUdMT0FEX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgInQxb2Jqcy5oIgotCi0KLUZUX0JFR0lOX0hFQURFUgotCi0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVDFfQ29tcHV0ZV9NYXhfQWR2YW5jZSggVDFfRmFjZSAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfUG9zKiAgbWF4X2FkdmFuY2UgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBUMV9HZXRfQWR2YW5jZXMoIEZUX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGZpcnN0LAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgY291bnQsCi0gICAgICAgICAgICAgICAgICAgRlRfSW50MzIgICBsb2FkX2ZsYWdzLAotICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgYWR2YW5jZXMgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBUMV9Mb2FkX0dseXBoKCBGVF9HbHlwaFNsb3QgIGdseXBoLAotICAgICAgICAgICAgICAgICBGVF9TaXplICAgICAgIHNpemUsCi0gICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgICAgZ2x5cGhfaW5kZXgsCi0gICAgICAgICAgICAgICAgIEZUX0ludDMyICAgICAgbG9hZF9mbGFncyApOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fVDFHTE9BRF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MWxvYWQuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MWxvYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJmNGVhZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFsb2FkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxbG9hZC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDEgZm9udCBsb2FkZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgaXMgdGhlIG5ldyBhbmQgaW1wcm92ZWQgVHlwZSAxIGRhdGEgbG9hZGVyIGZvciBGcmVlVHlwZSAyLiAgVGhlICAqLwotICAvKiBvbGQgbG9hZGVyIGhhcyBzZXZlcmFsIHByb2JsZW1zOiBpdCBpcyBzbG93LCBjb21wbGV4LCBkaWZmaWN1bHQgdG8gICAgKi8KLSAgLyogbWFpbnRhaW4sIGFuZCBjb250YWlucyBpbmNyZWRpYmxlIGhhY2tzIHRvIG1ha2UgaXQgYWNjZXB0IHNvbWUgICAgICAgICovCi0gIC8qIGlsbC1mb3JtZWQgVHlwZSAxIGZvbnRzIHdpdGhvdXQgaGljY3VwLWluZy4gIE1vcmVvdmVyLCBhYm91dCA1JSBvZiAgICAqLwotICAvKiB0aGUgVHlwZSAxIGZvbnRzIG9uIG15IG1hY2hpbmUgc3RpbGwgYXJlbid0IGxvYWRlZCBjb3JyZWN0bHkgYnkgaXQuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoaXMgdmVyc2lvbiBpcyBtdWNoIHNpbXBsZXIsIG11Y2ggZmFzdGVyIGFuZCBhbHNvIGVhc2llciB0byByZWFkIGFuZCAqLwotICAvKiBtYWludGFpbiBieSBhIGdyZWF0IG9yZGVyIG9mIG1hZ25pdHVkZS4gIFRoZSBpZGVhIGJlaGluZCBpdCBpcyB0byAgICAgKi8KLSAgLyogX25vdF8gdHJ5IHRvIHJlYWQgdGhlIFR5cGUgMSB0b2tlbiBzdHJlYW0gd2l0aCBhIHN0YXRlIG1hY2hpbmUgKGkuZS4gICovCi0gIC8qIGEgUG9zdHNjcmlwdC1saWtlIGludGVycHJldGVyKSBidXQgcmF0aGVyIHRvIHBlcmZvcm0gc2ltcGxlIHBhdHRlcm4gICAqLwotICAvKiBtYXRjaGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEluZGVlZCwgbmVhcmx5IGFsbCBkYXRhIGRlZmluaXRpb25zIGZvbGxvdyBhIHNpbXBsZSBwYXR0ZXJuIGxpa2UgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIC4uLiAvRmllbGQgPGRhdGE+IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiB3aGVyZSA8ZGF0YT4gY2FuIGJlIGEgbnVtYmVyLCBhIGJvb2xlYW4sIGEgc3RyaW5nLCBvciBhbiBhcnJheSBvZiAgICAgKi8KLSAgLyogbnVtYmVycy4gIFRoZXJlIGFyZSBhIGZldyBleGNlcHRpb25zLCBuYW1lbHkgdGhlIGVuY29kaW5nLCBmb250IG5hbWUsICovCi0gIC8qIGNoYXJzdHJpbmdzLCBhbmQgc3VicnM7IHRoZXkgYXJlIGhhbmRsZWQgd2l0aCBhIHNwZWNpYWwgcGF0dGVybiAgICAgICAqLwotICAvKiBtYXRjaGluZyByb3V0aW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEFsbCBvdGhlciBjb21tb24gY2FzZXMgYXJlIGhhbmRsZWQgdmVyeSBzaW1wbHkuICBUaGUgbWF0Y2hpbmcgcnVsZXMgICAqLwotICAvKiBhcmUgZGVmaW5lZCBpbiB0aGUgZmlsZSBgdDF0b2tlbnMuaCcgdGhyb3VnaCB0aGUgdXNlIG9mIHNldmVyYWwgICAgICAgKi8KLSAgLyogbWFjcm9zIGNhbGxzIFBBUlNFX1hYWC4gIFRoaXMgZmlsZSBpcyBpbmNsdWRlZCB0d2ljZSBoZXJlOyB0aGUgZmlyc3QgICovCi0gIC8qIHRpbWUgdG8gZ2VuZXJhdGUgcGFyc2luZyBjYWxsYmFjayBmdW5jdGlvbnMsIHRoZSBzZWNvbmQgdGltZSB0byAgICAgICAqLwotICAvKiBnZW5lcmF0ZSBhIHRhYmxlIG9mIGtleXdvcmRzICh3aXRoIHBvaW50ZXJzIHRvIHRoZSBhc3NvY2lhdGVkICAgICAgICAgKi8KLSAgLyogY2FsbGJhY2sgZnVuY3Rpb25zKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgZnVuY3Rpb24gYHBhcnNlX2RpY3QnIHNpbXBseSBzY2FucyAqbGluZWFybHkqIGEgZ2l2ZW4gZGljdGlvbmFyeSAgKi8KLSAgLyogKGVpdGhlciB0aGUgdG9wLWxldmVsIG9yIHByaXZhdGUgb25lKSBhbmQgY2FsbHMgdGhlIGFwcHJvcHJpYXRlICAgICAgICovCi0gIC8qIGNhbGxiYWNrIHdoZW4gaXQgZW5jb3VudGVycyBhbiBpbW1lZGlhdGUga2V5d29yZC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBpcyBieSBmYXIgdGhlIGZhc3Rlc3Qgd2F5IG9uZSBjYW4gZmluZCB0byBwYXJzZSBhbmQgcmVhZCBhbGwgICAgICovCi0gIC8qIGRhdGEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogVGhpcyBsZWQgdG8gdHJlbWVuZG91cyBjb2RlIHNpemUgcmVkdWN0aW9uLiAgTm90ZSB0aGF0IGxhdGVyLCB0aGUgICAgICovCi0gIC8qIGdseXBoIGxvYWRlciB3aWxsIGFsc28gYmUgX2dyZWF0bHlfIHNpbXBsaWZpZWQsIGFuZCB0aGUgYXV0b21hdGljICAgICAqLwotICAvKiBoaW50ZXIgd2lsbCByZXBsYWNlIHRoZSBjbHVtc3kgYHQxaGludGVyJy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfQ09ORklHX0NPTkZJR19ICi0jaW5jbHVkZSBGVF9NVUxUSVBMRV9NQVNURVJTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RZUEUxX1RZUEVTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotCi0jaW5jbHVkZSAidDFsb2FkLmgiCi0jaW5jbHVkZSAidDFlcnJvcnMuaCIKLQotCi0jaWZkZWYgRlRfQ09ORklHX09QVElPTl9JTkNSRU1FTlRBTAotI2RlZmluZSBJU19JTkNSRU1FTlRBTCAgKEZUX0Jvb2wpKCBmYWNlLT5yb290LmludGVybmFsLT5pbmNyZW1lbnRhbF9pbnRlcmZhY2UgIT0gMCApCi0jZWxzZQotI2RlZmluZSBJU19JTkNSRU1FTlRBTCAgMAotI2VuZGlmCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90MWxvYWQKLQotCi0jaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fTU1fU1VQUE9SVAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICBNVUxUSVBMRSBNQVNURVJTIFNVUFBPUlQgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHQxX2FsbG9jYXRlX2JsZW5kKCBUMV9GYWNlICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgbnVtX2Rlc2lnbnMsCi0gICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICBudW1fYXhpcyApCi0gIHsKLSAgICBQU19CbGVuZCAgIGJsZW5kOwotICAgIEZUX01lbW9yeSAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0gICAgRlRfRXJyb3IgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0KLQotICAgIGJsZW5kID0gZmFjZS0+YmxlbmQ7Ci0gICAgaWYgKCAhYmxlbmQgKQotICAgIHsKLSAgICAgIGlmICggRlRfTkVXKCBibGVuZCApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBibGVuZC0+bnVtX2RlZmF1bHRfZGVzaWduX3ZlY3RvciA9IDA7Ci0KLSAgICAgIGZhY2UtPmJsZW5kID0gYmxlbmQ7Ci0gICAgfQotCi0gICAgLyogYWxsb2NhdGUgZGVzaWduIGRhdGEgaWYgbmVlZGVkICovCi0gICAgaWYgKCBudW1fZGVzaWducyA+IDAgKQotICAgIHsKLSAgICAgIGlmICggYmxlbmQtPm51bV9kZXNpZ25zID09IDAgKQotICAgICAgewotICAgICAgICBGVF9VSW50ICBubjsKLQotCi0gICAgICAgIC8qIGFsbG9jYXRlIHRoZSBibGVuZCBgcHJpdmF0ZScgYW5kIGBmb250X2luZm8nIGRpY3Rpb25hcmllcyAqLwotICAgICAgICBpZiAoIEZUX05FV19BUlJBWSggYmxlbmQtPmZvbnRfaW5mb3NbMV0sIG51bV9kZXNpZ25zICAgICApIHx8Ci0gICAgICAgICAgICAgRlRfTkVXX0FSUkFZKCBibGVuZC0+cHJpdmF0ZXMgIFsxXSwgbnVtX2Rlc2lnbnMgICAgICkgfHwKLSAgICAgICAgICAgICBGVF9ORVdfQVJSQVkoIGJsZW5kLT5iYm94ZXMgICAgWzFdLCBudW1fZGVzaWducyAgICAgKSB8fAotICAgICAgICAgICAgIEZUX05FV19BUlJBWSggYmxlbmQtPndlaWdodF92ZWN0b3IsIG51bV9kZXNpZ25zICogMiApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0KLSAgICAgICAgYmxlbmQtPmRlZmF1bHRfd2VpZ2h0X3ZlY3RvciA9IGJsZW5kLT53ZWlnaHRfdmVjdG9yICsgbnVtX2Rlc2lnbnM7Ci0KLSAgICAgICAgYmxlbmQtPmZvbnRfaW5mb3NbMF0gPSAmZmFjZS0+dHlwZTEuZm9udF9pbmZvOwotICAgICAgICBibGVuZC0+cHJpdmF0ZXMgIFswXSA9ICZmYWNlLT50eXBlMS5wcml2YXRlX2RpY3Q7Ci0gICAgICAgIGJsZW5kLT5iYm94ZXMgICAgWzBdID0gJmZhY2UtPnR5cGUxLmZvbnRfYmJveDsKLQotICAgICAgICBmb3IgKCBubiA9IDI7IG5uIDw9IG51bV9kZXNpZ25zOyBubisrICkKLSAgICAgICAgewotICAgICAgICAgIGJsZW5kLT5mb250X2luZm9zW25uXSA9IGJsZW5kLT5mb250X2luZm9zW25uIC0gMV0gKyAxOwotICAgICAgICAgIGJsZW5kLT5wcml2YXRlcyAgW25uXSA9IGJsZW5kLT5wcml2YXRlcyAgW25uIC0gMV0gKyAxOwotICAgICAgICAgIGJsZW5kLT5iYm94ZXMgICAgW25uXSA9IGJsZW5kLT5iYm94ZXMgICAgW25uIC0gMV0gKyAxOwotICAgICAgICB9Ci0KLSAgICAgICAgYmxlbmQtPm51bV9kZXNpZ25zID0gbnVtX2Rlc2lnbnM7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICggYmxlbmQtPm51bV9kZXNpZ25zICE9IG51bV9kZXNpZ25zICkKLSAgICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgIC8qIGFsbG9jYXRlIGF4aXMgZGF0YSBpZiBuZWVkZWQgKi8KLSAgICBpZiAoIG51bV9heGlzID4gMCApCi0gICAgewotICAgICAgaWYgKCBibGVuZC0+bnVtX2F4aXMgIT0gMCAmJiBibGVuZC0+bnVtX2F4aXMgIT0gbnVtX2F4aXMgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGJsZW5kLT5udW1fYXhpcyA9IG51bV9heGlzOwotICAgIH0KLQotICAgIC8qIGFsbG9jYXRlIHRoZSBibGVuZCBkZXNpZ24gcG9zIHRhYmxlIGlmIG5lZWRlZCAqLwotICAgIG51bV9kZXNpZ25zID0gYmxlbmQtPm51bV9kZXNpZ25zOwotICAgIG51bV9heGlzICAgID0gYmxlbmQtPm51bV9heGlzOwotICAgIGlmICggbnVtX2Rlc2lnbnMgJiYgbnVtX2F4aXMgJiYgYmxlbmQtPmRlc2lnbl9wb3NbMF0gPT0gMCApCi0gICAgewotICAgICAgRlRfVUludCAgbjsKLQotCi0gICAgICBpZiAoIEZUX05FV19BUlJBWSggYmxlbmQtPmRlc2lnbl9wb3NbMF0sIG51bV9kZXNpZ25zICogbnVtX2F4aXMgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZm9yICggbiA9IDE7IG4gPCBudW1fZGVzaWduczsgbisrICkKLSAgICAgICAgYmxlbmQtPmRlc2lnbl9wb3Nbbl0gPSBibGVuZC0+ZGVzaWduX3Bvc1swXSArIG51bV9heGlzICogbjsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0KLSAgRmFpbDoKLSAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgZ290byBFeGl0OwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVDFfR2V0X011bHRpX01hc3RlciggVDFfRmFjZSAgICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlRfTXVsdGlfTWFzdGVyKiAgbWFzdGVyICkKLSAgewotICAgIFBTX0JsZW5kICBibGVuZCA9IGZhY2UtPmJsZW5kOwotICAgIEZUX1VJbnQgICBuOwotICAgIEZUX0Vycm9yICBlcnJvcjsKLQotCi0gICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotCi0gICAgaWYgKCBibGVuZCApCi0gICAgewotICAgICAgbWFzdGVyLT5udW1fYXhpcyAgICA9IGJsZW5kLT5udW1fYXhpczsKLSAgICAgIG1hc3Rlci0+bnVtX2Rlc2lnbnMgPSBibGVuZC0+bnVtX2Rlc2lnbnM7Ci0KLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgYmxlbmQtPm51bV9heGlzOyBuKysgKQotICAgICAgewotICAgICAgICBGVF9NTV9BeGlzKiAgIGF4aXMgPSBtYXN0ZXItPmF4aXMgKyBuOwotICAgICAgICBQU19EZXNpZ25NYXAgIG1hcCA9IGJsZW5kLT5kZXNpZ25fbWFwICsgbjsKLQotCi0gICAgICAgIGF4aXMtPm5hbWUgICAgPSBibGVuZC0+YXhpc19uYW1lc1tuXTsKLSAgICAgICAgYXhpcy0+bWluaW11bSA9IG1hcC0+ZGVzaWduX3BvaW50c1swXTsKLSAgICAgICAgYXhpcy0+bWF4aW11bSA9IG1hcC0+ZGVzaWduX3BvaW50c1ttYXAtPm51bV9wb2ludHMgLSAxXTsKLSAgICAgIH0KLQotICAgICAgZXJyb3IgPSBGVF9FcnJfT2s7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEdpdmVuIGEgbm9ybWFsaXplZCAoYmxlbmQpIGNvb3JkaW5hdGUsIGZpZ3VyZSBvdXQgdGhlIGRlc2lnbiAgICAgICAgICAqLwotICAvKiBjb29yZGluYXRlIGFwcHJvcHJpYXRlIGZvciB0aGF0IHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyBGVF9GaXhlZAotICBtbV9heGlzX3VubWFwKCBQU19EZXNpZ25NYXAgIGF4aXNtYXAsCi0gICAgICAgICAgICAgICAgIEZUX0ZpeGVkICAgICAgbmN2ICkKLSAgewotICAgIGludCAgajsKLQotCi0gICAgaWYgKCBuY3YgPD0gYXhpc21hcC0+YmxlbmRfcG9pbnRzWzBdICkKLSAgICAgIHJldHVybiBJTlRfVE9fRklYRUQoIGF4aXNtYXAtPmRlc2lnbl9wb2ludHNbMF0gKTsKLQotICAgIGZvciAoIGogPSAxOyBqIDwgYXhpc21hcC0+bnVtX3BvaW50czsgKytqICkKLSAgICB7Ci0gICAgICBpZiAoIG5jdiA8PSBheGlzbWFwLT5ibGVuZF9wb2ludHNbal0gKQotICAgICAgICByZXR1cm4gSU5UX1RPX0ZJWEVEKCBheGlzbWFwLT5kZXNpZ25fcG9pbnRzW2ogLSAxXSApICsKLSAgICAgICAgICAgICAgICggYXhpc21hcC0+ZGVzaWduX3BvaW50c1tqXSAtIGF4aXNtYXAtPmRlc2lnbl9wb2ludHNbaiAtIDFdICkgKgotICAgICAgICAgICAgICAgRlRfRGl2Rml4KCBuY3YgLSBheGlzbWFwLT5ibGVuZF9wb2ludHNbaiAtIDFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzbWFwLT5ibGVuZF9wb2ludHNbal0gLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNtYXAtPmJsZW5kX3BvaW50c1tqIC0gMV0gKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gSU5UX1RPX0ZJWEVEKCBheGlzbWFwLT5kZXNpZ25fcG9pbnRzW2F4aXNtYXAtPm51bV9wb2ludHMgLSAxXSApOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIEdpdmVuIGEgdmVjdG9yIG9mIHdlaWdodHMsIG9uZSBmb3IgZWFjaCBkZXNpZ24sIGZpZ3VyZSBvdXQgdGhlICAgICAgICAqLwotICAvKiBub3JtYWxpemVkIGF4aXMgY29vcmRpbmF0ZXMgd2hpY2ggZ2F2ZSByaXNlIHRvIHRob3NlIHdlaWdodHMuICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHN0YXRpYyB2b2lkCi0gIG1tX3dlaWdodHNfdW5tYXAoIEZUX0ZpeGVkKiAgd2VpZ2h0cywKLSAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBheGlzY29vcmRzLAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgIGF4aXNfY291bnQgKQotICB7Ci0gICAgRlRfQVNTRVJUKCBheGlzX2NvdW50IDw9IFQxX01BWF9NTV9BWElTICk7Ci0KLSAgICBpZiAoIGF4aXNfY291bnQgPT0gMSApCi0gICAgICBheGlzY29vcmRzWzBdID0gd2VpZ2h0c1sxXTsKLQotICAgIGVsc2UgaWYgKCBheGlzX2NvdW50ID09IDIgKQotICAgIHsKLSAgICAgIGF4aXNjb29yZHNbMF0gPSB3ZWlnaHRzWzNdICsgd2VpZ2h0c1sxXTsKLSAgICAgIGF4aXNjb29yZHNbMV0gPSB3ZWlnaHRzWzNdICsgd2VpZ2h0c1syXTsKLSAgICB9Ci0KLSAgICBlbHNlIGlmICggYXhpc19jb3VudCA9PSAzICkKLSAgICB7Ci0gICAgICBheGlzY29vcmRzWzBdID0gd2VpZ2h0c1s3XSArIHdlaWdodHNbNV0gKyB3ZWlnaHRzWzNdICsgd2VpZ2h0c1sxXTsKLSAgICAgIGF4aXNjb29yZHNbMV0gPSB3ZWlnaHRzWzddICsgd2VpZ2h0c1s2XSArIHdlaWdodHNbM10gKyB3ZWlnaHRzWzJdOwotICAgICAgYXhpc2Nvb3Jkc1syXSA9IHdlaWdodHNbN10gKyB3ZWlnaHRzWzZdICsgd2VpZ2h0c1s1XSArIHdlaWdodHNbNF07Ci0gICAgfQotCi0gICAgZWxzZQotICAgIHsKLSAgICAgIGF4aXNjb29yZHNbMF0gPSB3ZWlnaHRzWzE1XSArIHdlaWdodHNbMTNdICsgd2VpZ2h0c1sxMV0gKyB3ZWlnaHRzWzldICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHNbN10gKyB3ZWlnaHRzWzVdICsgd2VpZ2h0c1szXSArIHdlaWdodHNbMV07Ci0gICAgICBheGlzY29vcmRzWzFdID0gd2VpZ2h0c1sxNV0gKyB3ZWlnaHRzWzE0XSArIHdlaWdodHNbMTFdICsgd2VpZ2h0c1sxMF0gKwotICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0c1s3XSArIHdlaWdodHNbNl0gKyB3ZWlnaHRzWzNdICsgd2VpZ2h0c1syXTsKLSAgICAgIGF4aXNjb29yZHNbMl0gPSB3ZWlnaHRzWzE1XSArIHdlaWdodHNbMTRdICsgd2VpZ2h0c1sxM10gKyB3ZWlnaHRzWzEyXSArCi0gICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzWzddICsgd2VpZ2h0c1s2XSArIHdlaWdodHNbNV0gKyB3ZWlnaHRzWzRdOwotICAgICAgYXhpc2Nvb3Jkc1szXSA9IHdlaWdodHNbMTVdICsgd2VpZ2h0c1sxNF0gKyB3ZWlnaHRzWzEzXSArIHdlaWdodHNbMTJdICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHNbMTFdICsgd2VpZ2h0c1sxMF0gKyB3ZWlnaHRzWzldICsgd2VpZ2h0c1s4XTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogSnVzdCBhIHdyYXBwZXIgYXJvdW5kIFQxX0dldF9NdWx0aV9NYXN0ZXIgdG8gc3VwcG9ydCB0aGUgZGlmZmVyZW50ICAgICovCi0gIC8qICBhcmd1bWVudHMgbmVlZGVkIGJ5IHRoZSBHWCB2YXIgZGlzdG9ydGFibGUgZm9udHMuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIFQxX0dldF9NTV9WYXIoIFQxX0ZhY2UgICAgICBmYWNlLAotICAgICAgICAgICAgICAgICBGVF9NTV9WYXIqICAqbWFzdGVyICkKLSAgewotICAgIEZUX01lbW9yeSAgICAgICAgbWVtb3J5ID0gZmFjZS0+cm9vdC5tZW1vcnk7Ci0gICAgRlRfTU1fVmFyICAgICAgICptbXZhciA9IE5VTEw7Ci0gICAgRlRfTXVsdGlfTWFzdGVyICBtbWFzdGVyOwotICAgIEZUX0Vycm9yICAgICAgICAgZXJyb3I7Ci0gICAgRlRfVUludCAgICAgICAgICBpOwotICAgIEZUX0ZpeGVkICAgICAgICAgYXhpc2Nvb3Jkc1tUMV9NQVhfTU1fQVhJU107Ci0gICAgUFNfQmxlbmQgICAgICAgICBibGVuZCA9IGZhY2UtPmJsZW5kOwotCi0KLSAgICBlcnJvciA9IFQxX0dldF9NdWx0aV9NYXN0ZXIoIGZhY2UsICZtbWFzdGVyICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0gICAgaWYgKCBGVF9BTExPQyggbW12YXIsCi0gICAgICAgICAgICAgICAgICAgc2l6ZW9mICggRlRfTU1fVmFyICkgKwotICAgICAgICAgICAgICAgICAgICAgbW1hc3Rlci5udW1fYXhpcyAqIHNpemVvZiAoIEZUX1Zhcl9BeGlzICkgKSApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBtbXZhci0+bnVtX2F4aXMgICAgICAgID0gbW1hc3Rlci5udW1fYXhpczsKLSAgICBtbXZhci0+bnVtX2Rlc2lnbnMgICAgID0gbW1hc3Rlci5udW1fZGVzaWduczsKLSAgICBtbXZhci0+bnVtX25hbWVkc3R5bGVzID0gfjBVOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvZXMgbm90IGFwcGx5ICovCi0gICAgbW12YXItPmF4aXMgICAgICAgICAgICA9IChGVF9WYXJfQXhpcyopJm1tdmFyWzFdOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludCB0byBheGVzIGFmdGVyIE1NX1ZhciBzdHJ1Y3QgKi8KLSAgICBtbXZhci0+bmFtZWRzdHlsZSAgICAgID0gTlVMTDsKLQotICAgIGZvciAoIGkgPSAwIDsgaSA8IG1tYXN0ZXIubnVtX2F4aXM7ICsraSApCi0gICAgewotICAgICAgbW12YXItPmF4aXNbaV0ubmFtZSAgICA9IG1tYXN0ZXIuYXhpc1tpXS5uYW1lOwotICAgICAgbW12YXItPmF4aXNbaV0ubWluaW11bSA9IElOVF9UT19GSVhFRCggbW1hc3Rlci5heGlzW2ldLm1pbmltdW0pOwotICAgICAgbW12YXItPmF4aXNbaV0ubWF4aW11bSA9IElOVF9UT19GSVhFRCggbW1hc3Rlci5heGlzW2ldLm1heGltdW0pOwotICAgICAgbW12YXItPmF4aXNbaV0uZGVmICAgICA9ICggbW12YXItPmF4aXNbaV0ubWluaW11bSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1tdmFyLT5heGlzW2ldLm1heGltdW0gKSAvIDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9lcyBub3QgYXBwbHkuICBCdXQgdGhpcyB2YWx1ZSBpcyBpbiByYW5nZSAqLwotICAgICAgbW12YXItPmF4aXNbaV0uc3RyaWQgICA9IH4wVTsgICAgICAgICAgICAgICAgICAgICAgLyogRG9lcyBub3QgYXBwbHkgKi8KLSAgICAgIG1tdmFyLT5heGlzW2ldLnRhZyAgICAgPSB+MFU7ICAgICAgICAgICAgICAgICAgICAgIC8qIERvZXMgbm90IGFwcGx5ICovCi0KLSAgICAgIGlmICggZnRfc3RyY21wKCBtbXZhci0+YXhpc1tpXS5uYW1lLCAiV2VpZ2h0IiApID09IDAgKQotICAgICAgICBtbXZhci0+YXhpc1tpXS50YWcgPSBGVF9NQUtFX1RBRyggJ3cnLCAnZycsICdoJywgJ3QnICk7Ci0gICAgICBlbHNlIGlmICggZnRfc3RyY21wKCBtbXZhci0+YXhpc1tpXS5uYW1lLCAiV2lkdGgiICkgPT0gMCApCi0gICAgICAgIG1tdmFyLT5heGlzW2ldLnRhZyA9IEZUX01BS0VfVEFHKCAndycsICdkJywgJ3QnLCAnaCcgKTsKLSAgICAgIGVsc2UgaWYgKCBmdF9zdHJjbXAoIG1tdmFyLT5heGlzW2ldLm5hbWUsICJPcHRpY2FsU2l6ZSIgKSA9PSAwICkKLSAgICAgICAgbW12YXItPmF4aXNbaV0udGFnID0gRlRfTUFLRV9UQUcoICdvJywgJ3AnLCAncycsICd6JyApOwotICAgIH0KLQotICAgIGlmICggYmxlbmQtPm51bV9kZXNpZ25zID09ICggMVUgPDwgYmxlbmQtPm51bV9heGlzICkgKQotICAgIHsKLSAgICAgIG1tX3dlaWdodHNfdW5tYXAoIGJsZW5kLT5kZWZhdWx0X3dlaWdodF92ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBheGlzY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmQtPm51bV9heGlzICk7Ci0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgbW1hc3Rlci5udW1fYXhpczsgKytpICkKLSAgICAgICAgbW12YXItPmF4aXNbaV0uZGVmID0gbW1fYXhpc191bm1hcCggJmJsZW5kLT5kZXNpZ25fbWFwW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlzY29vcmRzW2ldICk7Ci0gICAgfQotCi0gICAgKm1hc3RlciA9IG1tdmFyOwotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVDFfU2V0X01NX0JsZW5kKCBUMV9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICkKLSAgewotICAgIFBTX0JsZW5kICBibGVuZCA9IGZhY2UtPmJsZW5kOwotICAgIEZUX1VJbnQgICBuLCBtOwotCi0KLSAgICBpZiAoICFibGVuZCApCi0gICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfQXJndW1lbnQgKTsKLQotICAgIGlmICggbnVtX2Nvb3JkcyA+IGJsZW5kLT5udW1fYXhpcyApCi0gICAgICBudW1fY29vcmRzID0gYmxlbmQtPm51bV9heGlzOwotCi0gICAgLyogcmVjb21wdXRlIHRoZSB3ZWlnaHQgdmVjdG9yIGZyb20gdGhlIGJsZW5kIGNvb3JkaW5hdGVzICovCi0gICAgZm9yICggbiA9IDA7IG4gPCBibGVuZC0+bnVtX2Rlc2lnbnM7IG4rKyApCi0gICAgewotICAgICAgRlRfRml4ZWQgIHJlc3VsdCA9IDB4MTAwMDBMOyAgLyogMS4wIGZpeGVkICovCi0KLQotICAgICAgZm9yICggbSA9IDA7IG0gPCBibGVuZC0+bnVtX2F4aXM7IG0rKyApCi0gICAgICB7Ci0gICAgICAgIEZUX0ZpeGVkICBmYWN0b3I7Ci0KLQotICAgICAgICAvKiBnZXQgY3VycmVudCBibGVuZCBheGlzIHBvc2l0aW9uOyAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qIHVzZSBhIGRlZmF1bHQgdmFsdWUgaWYgd2UgZG9uJ3QgaGF2ZSBhIGNvb3JkaW5hdGUgKi8KLSAgICAgICAgZmFjdG9yID0gbSA8IG51bV9jb29yZHMgPyBjb29yZHNbbV0gOiAweDgwMDA7Ci0gICAgICAgIGlmICggZmFjdG9yIDwgMCApCi0gICAgICAgICAgZmFjdG9yID0gMDsKLSAgICAgICAgaWYgKCBmYWN0b3IgPiAweDEwMDAwTCApCi0gICAgICAgICAgZmFjdG9yID0gMHgxMDAwMEw7Ci0KLSAgICAgICAgaWYgKCAoIG4gJiAoIDEgPDwgbSApICkgPT0gMCApCi0gICAgICAgICAgZmFjdG9yID0gMHgxMDAwMEwgLSBmYWN0b3I7Ci0KLSAgICAgICAgcmVzdWx0ID0gRlRfTXVsRml4KCByZXN1bHQsIGZhY3RvciApOwotICAgICAgfQotICAgICAgYmxlbmQtPndlaWdodF92ZWN0b3Jbbl0gPSByZXN1bHQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIFQxX1NldF9NTV9EZXNpZ24oIFQxX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogIGNvb3JkcyApCi0gIHsKLSAgICBQU19CbGVuZCAgYmxlbmQgPSBmYWNlLT5ibGVuZDsKLSAgICBGVF9VSW50ICAgbiwgcDsKLSAgICBGVF9GaXhlZCAgZmluYWxfYmxlbmRzW1QxX01BWF9NTV9ERVNJR05TXTsKLQotCi0gICAgaWYgKCAhYmxlbmQgKQotICAgICAgcmV0dXJuIEZUX1RIUk9XKCBJbnZhbGlkX0FyZ3VtZW50ICk7Ci0KLSAgICBpZiAoIG51bV9jb29yZHMgPiBibGVuZC0+bnVtX2F4aXMgKQotICAgICAgbnVtX2Nvb3JkcyA9IGJsZW5kLT5udW1fYXhpczsKLQotICAgIC8qIGNvbXB1dGUgdGhlIGJsZW5kIGNvb3JkaW5hdGVzIHRocm91Z2ggdGhlIGJsZW5kIGRlc2lnbiBtYXAgKi8KLQotICAgIGZvciAoIG4gPSAwOyBuIDwgYmxlbmQtPm51bV9heGlzOyBuKysgKQotICAgIHsKLSAgICAgIEZUX0xvbmcgICAgICAgZGVzaWduOwotICAgICAgRlRfRml4ZWQgICAgICB0aGVfYmxlbmQ7Ci0gICAgICBQU19EZXNpZ25NYXAgIG1hcCAgICAgPSBibGVuZC0+ZGVzaWduX21hcCArIG47Ci0gICAgICBGVF9Mb25nKiAgICAgIGRlc2lnbnMgPSBtYXAtPmRlc2lnbl9wb2ludHM7Ci0gICAgICBGVF9GaXhlZCogICAgIGJsZW5kcyAgPSBtYXAtPmJsZW5kX3BvaW50czsKLSAgICAgIEZUX0ludCAgICAgICAgYmVmb3JlICA9IC0xLCBhZnRlciA9IC0xOwotCi0KLSAgICAgIC8qIHVzZSBhIGRlZmF1bHQgdmFsdWUgaWYgd2UgZG9uJ3QgaGF2ZSBhIGNvb3JkaW5hdGUgKi8KLSAgICAgIGlmICggbiA8IG51bV9jb29yZHMgKQotICAgICAgICBkZXNpZ24gPSBjb29yZHNbbl07Ci0gICAgICBlbHNlCi0gICAgICAgIGRlc2lnbiA9ICggZGVzaWduc1ttYXAtPm51bV9wb2ludHMgLSAxXSAtIGRlc2lnbnNbMF0gKSAvIDI7Ci0KLSAgICAgIGZvciAoIHAgPSAwOyBwIDwgKEZUX1VJbnQpbWFwLT5udW1fcG9pbnRzOyBwKysgKQotICAgICAgewotICAgICAgICBGVF9Mb25nICBwX2Rlc2lnbiA9IGRlc2lnbnNbcF07Ci0KLQotICAgICAgICAvKiBleGFjdCBtYXRjaD8gKi8KLSAgICAgICAgaWYgKCBkZXNpZ24gPT0gcF9kZXNpZ24gKQotICAgICAgICB7Ci0gICAgICAgICAgdGhlX2JsZW5kID0gYmxlbmRzW3BdOwotICAgICAgICAgIGdvdG8gRm91bmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGRlc2lnbiA8IHBfZGVzaWduICkKLSAgICAgICAgewotICAgICAgICAgIGFmdGVyID0gKEZUX0ludClwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgYmVmb3JlID0gKEZUX0ludClwOwotICAgICAgfQotCi0gICAgICAvKiBub3cgaW50ZXJwb2xhdGUgaWYgbmVjZXNzYXJ5ICovCi0gICAgICBpZiAoIGJlZm9yZSA8IDAgKQotICAgICAgICB0aGVfYmxlbmQgPSBibGVuZHNbMF07Ci0KLSAgICAgIGVsc2UgaWYgKCBhZnRlciA8IDAgKQotICAgICAgICB0aGVfYmxlbmQgPSBibGVuZHNbbWFwLT5udW1fcG9pbnRzIC0gMV07Ci0KLSAgICAgIGVsc2UKLSAgICAgICAgdGhlX2JsZW5kID0gRlRfTXVsRGl2KCBkZXNpZ24gICAgICAgICAtIGRlc2lnbnNbYmVmb3JlXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZHMgW2FmdGVyXSAtIGJsZW5kcyBbYmVmb3JlXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpZ25zW2FmdGVyXSAtIGRlc2lnbnNbYmVmb3JlXSApOwotCi0gICAgRm91bmQ6Ci0gICAgICBmaW5hbF9ibGVuZHNbbl0gPSB0aGVfYmxlbmQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIFQxX1NldF9NTV9CbGVuZCggZmFjZSwgYmxlbmQtPm51bV9heGlzLCBmaW5hbF9ibGVuZHMgKTsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBKdXN0IGEgd3JhcHBlciBhcm91bmQgVDFfU2V0X01NX0Rlc2lnbiB0byBzdXBwb3J0IHRoZSBkaWZmZXJlbnQgICAgICAgKi8KLSAgLyogYXJndW1lbnRzIG5lZWRlZCBieSB0aGUgR1ggdmFyIGRpc3RvcnRhYmxlIGZvbnRzLiAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVDFfU2V0X1Zhcl9EZXNpZ24oIFQxX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgIEZUX0ZpeGVkKiAgY29vcmRzICkKLSAgewotICAgICBGVF9Mb25nICBsY29vcmRzW1QxX01BWF9NTV9BWElTXTsKLSAgICAgRlRfVUludCAgaTsKLQotCi0gICAgIGlmICggbnVtX2Nvb3JkcyA+IFQxX01BWF9NTV9BWElTICkKLSAgICAgICBudW1fY29vcmRzID0gVDFfTUFYX01NX0FYSVM7Ci0KLSAgICAgZm9yICggaSA9IDA7IGkgPCBudW1fY29vcmRzOyArK2kgKQotICAgICAgIGxjb29yZHNbaV0gPSBGSVhFRF9UT19JTlQoIGNvb3Jkc1tpXSApOwotCi0gICAgIHJldHVybiBUMV9TZXRfTU1fRGVzaWduKCBmYWNlLCBudW1fY29vcmRzLCBsY29vcmRzICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIFQxX0RvbmVfQmxlbmQoIFQxX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLSAgICBQU19CbGVuZCAgIGJsZW5kICA9IGZhY2UtPmJsZW5kOwotCi0KLSAgICBpZiAoIGJsZW5kICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBudW1fZGVzaWducyA9IGJsZW5kLT5udW1fZGVzaWduczsKLSAgICAgIEZUX1VJbnQgIG51bV9heGlzICAgID0gYmxlbmQtPm51bV9heGlzOwotICAgICAgRlRfVUludCAgbjsKLQotCi0gICAgICAvKiByZWxlYXNlIGRlc2lnbiBwb3MgdGFibGUgKi8KLSAgICAgIEZUX0ZSRUUoIGJsZW5kLT5kZXNpZ25fcG9zWzBdICk7Ci0gICAgICBmb3IgKCBuID0gMTsgbiA8IG51bV9kZXNpZ25zOyBuKysgKQotICAgICAgICBibGVuZC0+ZGVzaWduX3Bvc1tuXSA9IE5VTEw7Ci0KLSAgICAgIC8qIHJlbGVhc2UgYmxlbmQgYHByaXZhdGUnIGFuZCBgZm9udCBpbmZvJyBkaWN0aW9uYXJpZXMgKi8KLSAgICAgIEZUX0ZSRUUoIGJsZW5kLT5wcml2YXRlc1sxXSApOwotICAgICAgRlRfRlJFRSggYmxlbmQtPmZvbnRfaW5mb3NbMV0gKTsKLSAgICAgIEZUX0ZSRUUoIGJsZW5kLT5iYm94ZXNbMV0gKTsKLQotICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fZGVzaWduczsgbisrICkKLSAgICAgIHsKLSAgICAgICAgYmxlbmQtPnByaXZhdGVzICBbbl0gPSBOVUxMOwotICAgICAgICBibGVuZC0+Zm9udF9pbmZvc1tuXSA9IE5VTEw7Ci0gICAgICAgIGJsZW5kLT5iYm94ZXMgICAgW25dID0gTlVMTDsKLSAgICAgIH0KLQotICAgICAgLyogcmVsZWFzZSB3ZWlnaHQgdmVjdG9ycyAqLwotICAgICAgRlRfRlJFRSggYmxlbmQtPndlaWdodF92ZWN0b3IgKTsKLSAgICAgIGJsZW5kLT5kZWZhdWx0X3dlaWdodF92ZWN0b3IgPSBOVUxMOwotCi0gICAgICAvKiByZWxlYXNlIGF4aXMgbmFtZXMgKi8KLSAgICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX2F4aXM7IG4rKyApCi0gICAgICAgIEZUX0ZSRUUoIGJsZW5kLT5heGlzX25hbWVzW25dICk7Ci0KLSAgICAgIC8qIHJlbGVhc2UgZGVzaWduIG1hcCAqLwotICAgICAgZm9yICggbiA9IDA7IG4gPCBudW1fYXhpczsgbisrICkKLSAgICAgIHsKLSAgICAgICAgUFNfRGVzaWduTWFwICBkbWFwID0gYmxlbmQtPmRlc2lnbl9tYXAgKyBuOwotCi0KLSAgICAgICAgRlRfRlJFRSggZG1hcC0+ZGVzaWduX3BvaW50cyApOwotICAgICAgICBkbWFwLT5udW1fcG9pbnRzID0gMDsKLSAgICAgIH0KLQotICAgICAgRlRfRlJFRSggZmFjZS0+YmxlbmQgKTsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHBhcnNlX2JsZW5kX2F4aXNfdHlwZXMoIFQxX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgVDFfVG9rZW5SZWMgIGF4aXNfdG9rZW5zW1QxX01BWF9NTV9BWElTXTsKLSAgICBGVF9JbnQgICAgICAgbiwgbnVtX2F4aXM7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIFBTX0JsZW5kICAgICBibGVuZDsKLSAgICBGVF9NZW1vcnkgICAgbWVtb3J5OwotCi0KLSAgICAvKiB0YWtlIGFuIGFycmF5IG9mIG9iamVjdHMgKi8KLSAgICBUMV9Ub1Rva2VuQXJyYXkoICZsb2FkZXItPnBhcnNlciwgYXhpc190b2tlbnMsCi0gICAgICAgICAgICAgICAgICAgICBUMV9NQVhfTU1fQVhJUywgJm51bV9heGlzICk7Ci0gICAgaWYgKCBudW1fYXhpcyA8IDAgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfRVJSKCBJZ25vcmUgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0gICAgaWYgKCBudW1fYXhpcyA9PSAwIHx8IG51bV9heGlzID4gVDFfTUFYX01NX0FYSVMgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInBhcnNlX2JsZW5kX2F4aXNfdHlwZXM6IGluY29ycmVjdCBudW1iZXIgb2YgYXhlczogJWRcbiIsCi0gICAgICAgICAgICAgICAgIG51bV9heGlzICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIGFsbG9jYXRlIGJsZW5kIGlmIG5lY2Vzc2FyeSAqLwotICAgIGVycm9yID0gdDFfYWxsb2NhdGVfYmxlbmQoIGZhY2UsIDAsIChGVF9VSW50KW51bV9heGlzICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBibGVuZCAgPSBmYWNlLT5ibGVuZDsKLSAgICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLQotICAgIC8qIGVhY2ggdG9rZW4gaXMgYW4gaW1tZWRpYXRlIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGF4aXMgKi8KLSAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9heGlzOyBuKysgKQotICAgIHsKLSAgICAgIFQxX1Rva2VuICB0b2tlbiA9IGF4aXNfdG9rZW5zICsgbjsKLSAgICAgIEZUX0J5dGUqICBuYW1lOwotICAgICAgRlRfVUludCAgIGxlbjsKLQotCi0gICAgICAvKiBza2lwIGZpcnN0IHNsYXNoLCBpZiBhbnkgKi8KLSAgICAgIGlmICggdG9rZW4tPnN0YXJ0WzBdID09ICcvJyApCi0gICAgICAgIHRva2VuLT5zdGFydCsrOwotCi0gICAgICBsZW4gPSAoRlRfVUludCkoIHRva2VuLT5saW1pdCAtIHRva2VuLT5zdGFydCApOwotICAgICAgaWYgKCBsZW4gPT0gMCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBuYW1lID0gKEZUX0J5dGUqKWJsZW5kLT5heGlzX25hbWVzW25dOwotICAgICAgaWYgKCBuYW1lICkKLSAgICAgIHsKLSAgICAgICAgRlRfVFJBQ0UwKCggInBhcnNlX2JsZW5kX2F4aXNfdHlwZXM6IgotICAgICAgICAgICAgICAgICAgICAiIG92ZXJ3cml0aW5nIGF4aXMgbmFtZSBgJXMnIHdpdGggYCUqLnMnXG4iLAotICAgICAgICAgICAgICAgICAgICBuYW1lLCBsZW4sIHRva2VuLT5zdGFydCApKTsKLSAgICAgICAgRlRfRlJFRSggbmFtZSApOwotICAgICAgfQotCi0gICAgICBpZiAoIEZUX0FMTE9DKCBibGVuZC0+YXhpc19uYW1lc1tuXSwgbGVuICsgMSApICkKLSAgICAgICAgZ290byBFeGl0OwotCi0gICAgICBuYW1lID0gKEZUX0J5dGUqKWJsZW5kLT5heGlzX25hbWVzW25dOwotICAgICAgRlRfTUVNX0NPUFkoIG5hbWUsIHRva2VuLT5zdGFydCwgbGVuICk7Ci0gICAgICBuYW1lW2xlbl0gPSAnXDAnOwotICAgIH0KLQotICBFeGl0OgotICAgIGxvYWRlci0+cGFyc2VyLnJvb3QuZXJyb3IgPSBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgcGFyc2VfYmxlbmRfZGVzaWduX3Bvc2l0aW9ucyggVDFfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9Mb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBUMV9Ub2tlblJlYyAgZGVzaWduX3Rva2Vuc1tUMV9NQVhfTU1fREVTSUdOU107Ci0gICAgRlRfSW50ICAgICAgIG51bV9kZXNpZ25zOwotICAgIEZUX0ludCAgICAgICBudW1fYXhpczsKLSAgICBUMV9QYXJzZXIgICAgcGFyc2VyID0gJmxvYWRlci0+cGFyc2VyOwotCi0gICAgRlRfRXJyb3IgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIFBTX0JsZW5kICAgICBibGVuZDsKLQotCi0gICAgLyogZ2V0IHRoZSBhcnJheSBvZiBkZXNpZ24gdG9rZW5zIC0tIGNvbXB1dGUgbnVtYmVyIG9mIGRlc2lnbnMgKi8KLSAgICBUMV9Ub1Rva2VuQXJyYXkoIHBhcnNlciwgZGVzaWduX3Rva2VucywKLSAgICAgICAgICAgICAgICAgICAgIFQxX01BWF9NTV9ERVNJR05TLCAmbnVtX2Rlc2lnbnMgKTsKLSAgICBpZiAoIG51bV9kZXNpZ25zIDwgMCApCi0gICAgewotICAgICAgZXJyb3IgPSBGVF9FUlIoIElnbm9yZSApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLSAgICBpZiAoIG51bV9kZXNpZ25zID09IDAgfHwgbnVtX2Rlc2lnbnMgPiBUMV9NQVhfTU1fREVTSUdOUyApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAicGFyc2VfYmxlbmRfZGVzaWduX3Bvc2l0aW9uczoiCi0gICAgICAgICAgICAgICAgICIgaW5jb3JyZWN0IG51bWJlciBvZiBkZXNpZ25zOiAlZFxuIiwKLSAgICAgICAgICAgICAgICAgbnVtX2Rlc2lnbnMgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgewotICAgICAgRlRfQnl0ZSogIG9sZF9jdXJzb3IgPSBwYXJzZXItPnJvb3QuY3Vyc29yOwotICAgICAgRlRfQnl0ZSogIG9sZF9saW1pdCAgPSBwYXJzZXItPnJvb3QubGltaXQ7Ci0gICAgICBGVF9JbnQgICAgbjsKLQotCi0gICAgICBibGVuZCAgICA9IGZhY2UtPmJsZW5kOwotICAgICAgbnVtX2F4aXMgPSAwOyAgLyogbWFrZSBjb21waWxlciBoYXBweSAqLwotCi0gICAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9kZXNpZ25zOyBuKysgKQotICAgICAgewotICAgICAgICBUMV9Ub2tlblJlYyAgYXhpc190b2tlbnNbVDFfTUFYX01NX0FYSVNdOwotICAgICAgICBUMV9Ub2tlbiAgICAgdG9rZW47Ci0gICAgICAgIEZUX0ludCAgICAgICBheGlzLCBuX2F4aXM7Ci0KLQotICAgICAgICAvKiByZWFkIGF4aXMvY29vcmRpbmF0ZXMgdG9rZW5zICovCi0gICAgICAgIHRva2VuID0gZGVzaWduX3Rva2VucyArIG47Ci0gICAgICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgPSB0b2tlbi0+c3RhcnQ7Ci0gICAgICAgIHBhcnNlci0+cm9vdC5saW1pdCAgPSB0b2tlbi0+bGltaXQ7Ci0gICAgICAgIFQxX1RvVG9rZW5BcnJheSggcGFyc2VyLCBheGlzX3Rva2VucywgVDFfTUFYX01NX0FYSVMsICZuX2F4aXMgKTsKLQotICAgICAgICBpZiAoIG4gPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIG5fYXhpcyA8PSAwIHx8IG5fYXhpcyA+IFQxX01BWF9NTV9BWElTICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGVF9FUlJPUigoICJwYXJzZV9ibGVuZF9kZXNpZ25fcG9zaXRpb25zOiIKLSAgICAgICAgICAgICAgICAgICAgICAgIiBpbnZhbGlkIG51bWJlciBvZiBheGVzOiAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgbl9heGlzICkpOwotICAgICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgIH0KLQotICAgICAgICAgIG51bV9heGlzID0gbl9heGlzOwotICAgICAgICAgIGVycm9yID0gdDFfYWxsb2NhdGVfYmxlbmQoIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpbnVtX2Rlc2lnbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZUX1VJbnQpbnVtX2F4aXMgKTsKLSAgICAgICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICBibGVuZCA9IGZhY2UtPmJsZW5kOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBuX2F4aXMgIT0gbnVtX2F4aXMgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfRVJST1IoKCAicGFyc2VfYmxlbmRfZGVzaWduX3Bvc2l0aW9uczogaW5jb3JyZWN0IHRhYmxlXG4iICkpOwotICAgICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBub3cgcmVhZCBlYWNoIGF4aXMgdG9rZW4gaW50byB0aGUgZGVzaWduIHBvc2l0aW9uICovCi0gICAgICAgIGZvciAoIGF4aXMgPSAwOyBheGlzIDwgbl9heGlzOyBheGlzKysgKQotICAgICAgICB7Ci0gICAgICAgICAgVDFfVG9rZW4gIHRva2VuMiA9IGF4aXNfdG9rZW5zICsgYXhpczsKLQotCi0gICAgICAgICAgcGFyc2VyLT5yb290LmN1cnNvciA9IHRva2VuMi0+c3RhcnQ7Ci0gICAgICAgICAgcGFyc2VyLT5yb290LmxpbWl0ICA9IHRva2VuMi0+bGltaXQ7Ci0gICAgICAgICAgYmxlbmQtPmRlc2lnbl9wb3Nbbl1bYXhpc10gPSBUMV9Ub0ZpeGVkKCBwYXJzZXIsIDAgKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBsb2FkZXItPnBhcnNlci5yb290LmN1cnNvciA9IG9sZF9jdXJzb3I7Ci0gICAgICBsb2FkZXItPnBhcnNlci5yb290LmxpbWl0ICA9IG9sZF9saW1pdDsKLSAgICB9Ci0KLSAgRXhpdDoKLSAgICBsb2FkZXItPnBhcnNlci5yb290LmVycm9yID0gZXJyb3I7Ci0gIH0KLQotCi0gIHN0YXRpYyB2b2lkCi0gIHBhcnNlX2JsZW5kX2Rlc2lnbl9tYXAoIFQxX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgRlRfRXJyb3IgICAgIGVycm9yICA9IEZUX0Vycl9PazsKLSAgICBUMV9QYXJzZXIgICAgcGFyc2VyID0gJmxvYWRlci0+cGFyc2VyOwotICAgIFBTX0JsZW5kICAgICBibGVuZDsKLSAgICBUMV9Ub2tlblJlYyAgYXhpc190b2tlbnNbVDFfTUFYX01NX0FYSVNdOwotICAgIEZUX0ludCAgICAgICBuLCBudW1fYXhpczsKLSAgICBGVF9CeXRlKiAgICAgb2xkX2N1cnNvcjsKLSAgICBGVF9CeXRlKiAgICAgb2xkX2xpbWl0OwotICAgIEZUX01lbW9yeSAgICBtZW1vcnkgPSBmYWNlLT5yb290Lm1lbW9yeTsKLQotCi0gICAgVDFfVG9Ub2tlbkFycmF5KCBwYXJzZXIsIGF4aXNfdG9rZW5zLAotICAgICAgICAgICAgICAgICAgICAgVDFfTUFYX01NX0FYSVMsICZudW1fYXhpcyApOwotICAgIGlmICggbnVtX2F4aXMgPCAwICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX0VSUiggSWdub3JlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotICAgIGlmICggbnVtX2F4aXMgPT0gMCB8fCBudW1fYXhpcyA+IFQxX01BWF9NTV9BWElTICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJwYXJzZV9ibGVuZF9kZXNpZ25fbWFwOiBpbmNvcnJlY3QgbnVtYmVyIG9mIGF4ZXM6ICVkXG4iLAotICAgICAgICAgICAgICAgICBudW1fYXhpcyApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBvbGRfY3Vyc29yID0gcGFyc2VyLT5yb290LmN1cnNvcjsKLSAgICBvbGRfbGltaXQgID0gcGFyc2VyLT5yb290LmxpbWl0OwotCi0gICAgZXJyb3IgPSB0MV9hbGxvY2F0ZV9ibGVuZCggZmFjZSwgMCwgKEZUX1VJbnQpbnVtX2F4aXMgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLSAgICBibGVuZCA9IGZhY2UtPmJsZW5kOwotCi0gICAgLyogbm93IHJlYWQgZWFjaCBheGlzIGRlc2lnbiBtYXAgKi8KLSAgICBmb3IgKCBuID0gMDsgbiA8IG51bV9heGlzOyBuKysgKQotICAgIHsKLSAgICAgIFBTX0Rlc2lnbk1hcCAgbWFwID0gYmxlbmQtPmRlc2lnbl9tYXAgKyBuOwotICAgICAgVDFfVG9rZW4gICAgICBheGlzX3Rva2VuOwotICAgICAgVDFfVG9rZW5SZWMgICBwb2ludF90b2tlbnNbVDFfTUFYX01NX01BUF9QT0lOVFNdOwotICAgICAgRlRfSW50ICAgICAgICBwLCBudW1fcG9pbnRzOwotCi0KLSAgICAgIGF4aXNfdG9rZW4gPSBheGlzX3Rva2VucyArIG47Ci0KLSAgICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgPSBheGlzX3Rva2VuLT5zdGFydDsKLSAgICAgIHBhcnNlci0+cm9vdC5saW1pdCAgPSBheGlzX3Rva2VuLT5saW1pdDsKLSAgICAgIFQxX1RvVG9rZW5BcnJheSggcGFyc2VyLCBwb2ludF90b2tlbnMsCi0gICAgICAgICAgICAgICAgICAgICAgIFQxX01BWF9NTV9NQVBfUE9JTlRTLCAmbnVtX3BvaW50cyApOwotCi0gICAgICBpZiAoIG51bV9wb2ludHMgPD0gMCB8fCBudW1fcG9pbnRzID4gVDFfTUFYX01NX01BUF9QT0lOVFMgKQotICAgICAgewotICAgICAgICBGVF9FUlJPUigoICJwYXJzZV9ibGVuZF9kZXNpZ25fbWFwOiBpbmNvcnJlY3QgdGFibGVcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBpZiAoIG1hcC0+ZGVzaWduX3BvaW50cyApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggInBhcnNlX2JsZW5kX2Rlc2lnbl9tYXA6IGR1cGxpY2F0ZSB0YWJsZVxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGFsbG9jYXRlIGRlc2lnbiBtYXAgZGF0YSAqLwotICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIG1hcC0+ZGVzaWduX3BvaW50cywgbnVtX3BvaW50cyAqIDIgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIG1hcC0+YmxlbmRfcG9pbnRzID0gbWFwLT5kZXNpZ25fcG9pbnRzICsgbnVtX3BvaW50czsKLSAgICAgIG1hcC0+bnVtX3BvaW50cyAgID0gKEZUX0J5dGUpbnVtX3BvaW50czsKLQotICAgICAgZm9yICggcCA9IDA7IHAgPCBudW1fcG9pbnRzOyBwKysgKQotICAgICAgewotICAgICAgICBUMV9Ub2tlbiAgcG9pbnRfdG9rZW47Ci0KLQotICAgICAgICBwb2ludF90b2tlbiA9IHBvaW50X3Rva2VucyArIHA7Ci0KLSAgICAgICAgLyogZG9uJ3QgaW5jbHVkZSBkZWxpbWl0aW5nIGJyYWNrZXRzICovCi0gICAgICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgPSBwb2ludF90b2tlbi0+c3RhcnQgKyAxOwotICAgICAgICBwYXJzZXItPnJvb3QubGltaXQgID0gcG9pbnRfdG9rZW4tPmxpbWl0IC0gMTsKLQotICAgICAgICBtYXAtPmRlc2lnbl9wb2ludHNbcF0gPSBUMV9Ub0ludCggcGFyc2VyICk7Ci0gICAgICAgIG1hcC0+YmxlbmRfcG9pbnRzIFtwXSA9IFQxX1RvRml4ZWQoIHBhcnNlciwgMCApOwotICAgICAgfQotICAgIH0KLQotICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgPSBvbGRfY3Vyc29yOwotICAgIHBhcnNlci0+cm9vdC5saW1pdCAgPSBvbGRfbGltaXQ7Ci0KLSAgRXhpdDoKLSAgICBwYXJzZXItPnJvb3QuZXJyb3IgPSBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgcGFyc2Vfd2VpZ2h0X3ZlY3RvciggVDFfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICBUMV9Mb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBUMV9Ub2tlblJlYyAgZGVzaWduX3Rva2Vuc1tUMV9NQVhfTU1fREVTSUdOU107Ci0gICAgRlRfSW50ICAgICAgIG51bV9kZXNpZ25zOwotICAgIEZUX0Vycm9yICAgICBlcnJvciAgPSBGVF9FcnJfT2s7Ci0gICAgVDFfUGFyc2VyICAgIHBhcnNlciA9ICZsb2FkZXItPnBhcnNlcjsKLSAgICBQU19CbGVuZCAgICAgYmxlbmQgID0gZmFjZS0+YmxlbmQ7Ci0gICAgVDFfVG9rZW4gICAgIHRva2VuOwotICAgIEZUX0ludCAgICAgICBuOwotICAgIEZUX0J5dGUqICAgICBvbGRfY3Vyc29yOwotICAgIEZUX0J5dGUqICAgICBvbGRfbGltaXQ7Ci0KLQotICAgIFQxX1RvVG9rZW5BcnJheSggcGFyc2VyLCBkZXNpZ25fdG9rZW5zLAotICAgICAgICAgICAgICAgICAgICAgVDFfTUFYX01NX0RFU0lHTlMsICZudW1fZGVzaWducyApOwotICAgIGlmICggbnVtX2Rlc2lnbnMgPCAwICkKLSAgICB7Ci0gICAgICBlcnJvciA9IEZUX0VSUiggSWdub3JlICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotICAgIGlmICggbnVtX2Rlc2lnbnMgPT0gMCB8fCBudW1fZGVzaWducyA+IFQxX01BWF9NTV9ERVNJR05TICkKLSAgICB7Ci0gICAgICBGVF9FUlJPUigoICJwYXJzZV93ZWlnaHRfdmVjdG9yOiIKLSAgICAgICAgICAgICAgICAgIiBpbmNvcnJlY3QgbnVtYmVyIG9mIGRlc2lnbnM6ICVkXG4iLAotICAgICAgICAgICAgICAgICBudW1fZGVzaWducyApKTsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBpZiAoICFibGVuZCB8fCAhYmxlbmQtPm51bV9kZXNpZ25zICkKLSAgICB7Ci0gICAgICBlcnJvciA9IHQxX2FsbG9jYXRlX2JsZW5kKCBmYWNlLCAoRlRfVUludCludW1fZGVzaWducywgMCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICAgIGJsZW5kID0gZmFjZS0+YmxlbmQ7Ci0gICAgfQotICAgIGVsc2UgaWYgKCBibGVuZC0+bnVtX2Rlc2lnbnMgIT0gKEZUX1VJbnQpbnVtX2Rlc2lnbnMgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInBhcnNlX3dlaWdodF92ZWN0b3I6IgotICAgICAgICAgICAgICAgICAiIC9CbGVuZERlc2lnblBvc2l0aW9uIGFuZCAvV2VpZ2h0VmVjdG9yIGhhdmVcbiIKLSAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgIgotICAgICAgICAgICAgICAgICAiIGRpZmZlcmVudCBudW1iZXIgb2YgZWxlbWVudHNcbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgb2xkX2N1cnNvciA9IHBhcnNlci0+cm9vdC5jdXJzb3I7Ci0gICAgb2xkX2xpbWl0ICA9IHBhcnNlci0+cm9vdC5saW1pdDsKLQotICAgIGZvciAoIG4gPSAwOyBuIDwgbnVtX2Rlc2lnbnM7IG4rKyApCi0gICAgewotICAgICAgdG9rZW4gPSBkZXNpZ25fdG9rZW5zICsgbjsKLSAgICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgPSB0b2tlbi0+c3RhcnQ7Ci0gICAgICBwYXJzZXItPnJvb3QubGltaXQgID0gdG9rZW4tPmxpbWl0OwotCi0gICAgICBibGVuZC0+ZGVmYXVsdF93ZWlnaHRfdmVjdG9yW25dID0KLSAgICAgIGJsZW5kLT53ZWlnaHRfdmVjdG9yW25dICAgICAgICAgPSBUMV9Ub0ZpeGVkKCBwYXJzZXIsIDAgKTsKLSAgICB9Ci0KLSAgICBwYXJzZXItPnJvb3QuY3Vyc29yID0gb2xkX2N1cnNvcjsKLSAgICBwYXJzZXItPnJvb3QubGltaXQgID0gb2xkX2xpbWl0OwotCi0gIEV4aXQ6Ci0gICAgcGFyc2VyLT5yb290LmVycm9yID0gZXJyb3I7Ci0gIH0KLQotCi0gIC8qIGUuZy4sIC9CdWlsZENoYXJBcnJheSBbMCAwIDAgMCAwIDAgMCAwXSBkZWYgICAgICAgICAgICovCi0gIC8qIHdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgbnVtYmVyIG9mIGFycmF5IGVsZW1lbnRzICovCi0gIHN0YXRpYyB2b2lkCi0gIHBhcnNlX2J1aWxkY2hhciggVDFfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIFQxX0xvYWRlciAgbG9hZGVyICkKLSAgewotICAgIGZhY2UtPmxlbl9idWlsZGNoYXIgPSAoRlRfVUludClUMV9Ub0ZpeGVkQXJyYXkoICZsb2FkZXItPnBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOVUxMLCAwICk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLQotI2VuZGlmIC8qICFUMV9DT05GSUdfT1BUSU9OX05PX01NX1NVUFBPUlQgKi8KLQotCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgVFlQRSAxIFNZTUJPTCBQQVJTSU5HICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgdDFfbG9hZF9rZXl3b3JkKCBUMV9GYWNlICAgICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgICBUMV9Mb2FkZXIgICAgICAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IFQxX0ZpZWxkICBmaWVsZCApCi0gIHsKLSAgICBGVF9FcnJvciAgZXJyb3I7Ci0gICAgdm9pZCogICAgIGR1bW15X29iamVjdDsKLSAgICB2b2lkKiogICAgb2JqZWN0czsKLSAgICBGVF9VSW50ICAgbWF4X29iamVjdHM7Ci0gICAgUFNfQmxlbmQgIGJsZW5kID0gZmFjZS0+YmxlbmQ7Ci0KLQotICAgIGlmICggYmxlbmQgJiYgYmxlbmQtPm51bV9kZXNpZ25zID09IDAgKQotICAgICAgYmxlbmQgPSBOVUxMOwotCi0gICAgLyogaWYgdGhlIGtleXdvcmQgaGFzIGEgZGVkaWNhdGVkIGNhbGxiYWNrLCBjYWxsIGl0ICovCi0gICAgaWYgKCBmaWVsZC0+dHlwZSA9PSBUMV9GSUVMRF9UWVBFX0NBTExCQUNLICkKLSAgICB7Ci0gICAgICBmaWVsZC0+cmVhZGVyKCAoRlRfRmFjZSlmYWNlLCBsb2FkZXIgKTsKLSAgICAgIGVycm9yID0gbG9hZGVyLT5wYXJzZXIucm9vdC5lcnJvcjsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvKiBub3csIHRoZSBrZXl3b3JkIGlzIGVpdGhlciBhIHNpbXBsZSBmaWVsZCwgb3IgYSB0YWJsZSBvZiBmaWVsZHM7ICovCi0gICAgLyogd2UgYXJlIG5vdyBnb2luZyB0byB0YWtlIGNhcmUgb2YgaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHN3aXRjaCAoIGZpZWxkLT5sb2NhdGlvbiApCi0gICAgewotICAgIGNhc2UgVDFfRklFTERfTE9DQVRJT05fRk9OVF9JTkZPOgotICAgICAgZHVtbXlfb2JqZWN0ID0gJmZhY2UtPnR5cGUxLmZvbnRfaW5mbzsKLSAgICAgIG9iamVjdHMgICAgICA9ICZkdW1teV9vYmplY3Q7Ci0gICAgICBtYXhfb2JqZWN0cyAgPSAwOwotCi0gICAgICBpZiAoIGJsZW5kICkKLSAgICAgIHsKLSAgICAgICAgb2JqZWN0cyAgICAgPSAodm9pZCoqKWJsZW5kLT5mb250X2luZm9zOwotICAgICAgICBtYXhfb2JqZWN0cyA9IGJsZW5kLT5udW1fZGVzaWduczsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUMV9GSUVMRF9MT0NBVElPTl9GT05UX0VYVFJBOgotICAgICAgZHVtbXlfb2JqZWN0ID0gJmZhY2UtPnR5cGUxLmZvbnRfZXh0cmE7Ci0gICAgICBvYmplY3RzICAgICAgPSAmZHVtbXlfb2JqZWN0OwotICAgICAgbWF4X29iamVjdHMgID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUMV9GSUVMRF9MT0NBVElPTl9QUklWQVRFOgotICAgICAgZHVtbXlfb2JqZWN0ID0gJmZhY2UtPnR5cGUxLnByaXZhdGVfZGljdDsKLSAgICAgIG9iamVjdHMgICAgICA9ICZkdW1teV9vYmplY3Q7Ci0gICAgICBtYXhfb2JqZWN0cyAgPSAwOwotCi0gICAgICBpZiAoIGJsZW5kICkKLSAgICAgIHsKLSAgICAgICAgb2JqZWN0cyAgICAgPSAodm9pZCoqKWJsZW5kLT5wcml2YXRlczsKLSAgICAgICAgbWF4X29iamVjdHMgPSBibGVuZC0+bnVtX2Rlc2lnbnM7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgVDFfRklFTERfTE9DQVRJT05fQkJPWDoKLSAgICAgIGR1bW15X29iamVjdCA9ICZmYWNlLT50eXBlMS5mb250X2Jib3g7Ci0gICAgICBvYmplY3RzICAgICAgPSAmZHVtbXlfb2JqZWN0OwotICAgICAgbWF4X29iamVjdHMgID0gMDsKLQotICAgICAgaWYgKCBibGVuZCApCi0gICAgICB7Ci0gICAgICAgIG9iamVjdHMgICAgID0gKHZvaWQqKilibGVuZC0+YmJveGVzOwotICAgICAgICBtYXhfb2JqZWN0cyA9IGJsZW5kLT5udW1fZGVzaWduczsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUMV9GSUVMRF9MT0NBVElPTl9MT0FERVI6Ci0gICAgICBkdW1teV9vYmplY3QgPSBsb2FkZXI7Ci0gICAgICBvYmplY3RzICAgICAgPSAmZHVtbXlfb2JqZWN0OwotICAgICAgbWF4X29iamVjdHMgID0gMDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBUMV9GSUVMRF9MT0NBVElPTl9GQUNFOgotICAgICAgZHVtbXlfb2JqZWN0ID0gZmFjZTsKLSAgICAgIG9iamVjdHMgICAgICA9ICZkdW1teV9vYmplY3Q7Ci0gICAgICBtYXhfb2JqZWN0cyAgPSAwOwotICAgICAgYnJlYWs7Ci0KLSNpZm5kZWYgVDFfQ09ORklHX09QVElPTl9OT19NTV9TVVBQT1JUCi0gICAgY2FzZSBUMV9GSUVMRF9MT0NBVElPTl9CTEVORDoKLSAgICAgIGR1bW15X29iamVjdCA9IGZhY2UtPmJsZW5kOwotICAgICAgb2JqZWN0cyAgICAgID0gJmR1bW15X29iamVjdDsKLSAgICAgIG1heF9vYmplY3RzICA9IDA7Ci0gICAgICBicmVhazsKLSNlbmRpZgotCi0gICAgZGVmYXVsdDoKLSAgICAgIGR1bW15X29iamVjdCA9ICZmYWNlLT50eXBlMTsKLSAgICAgIG9iamVjdHMgICAgICA9ICZkdW1teV9vYmplY3Q7Ci0gICAgICBtYXhfb2JqZWN0cyAgPSAwOwotICAgIH0KLQotICAgIGlmICggKm9iamVjdHMgKQotICAgIHsKLSAgICAgIGlmICggZmllbGQtPnR5cGUgPT0gVDFfRklFTERfVFlQRV9JTlRFR0VSX0FSUkFZIHx8Ci0gICAgICAgICAgIGZpZWxkLT50eXBlID09IFQxX0ZJRUxEX1RZUEVfRklYRURfQVJSQVkgICApCi0gICAgICAgIGVycm9yID0gVDFfTG9hZF9GaWVsZF9UYWJsZSggJmxvYWRlci0+cGFyc2VyLCBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLCBtYXhfb2JqZWN0cywgMCApOwotICAgICAgZWxzZQotICAgICAgICBlcnJvciA9IFQxX0xvYWRfRmllbGQoICZsb2FkZXItPnBhcnNlciwgZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cywgbWF4X29iamVjdHMsIDAgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIEZUX1RSQUNFMSgoICJ0MV9sb2FkX2tleXdvcmQ6IGlnbm9yaW5nIGtleXdvcmQgYCVzJyIKLSAgICAgICAgICAgICAgICAgICIgd2hpY2ggaXMgbm90IHZhbGlkIGF0IHRoaXMgcG9pbnRcbiIKLSAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICAgIChwcm9iYWJseSBkdWUgdG8gbWlzc2luZyBrZXl3b3JkcylcbiIsCi0gICAgICAgICAgICAgICAgIGZpZWxkLT5pZGVudCApKTsKLSAgICAgIGVycm9yID0gRlRfRXJyX09rOwotICAgIH0KLQotICBFeGl0OgotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgcGFyc2VfcHJpdmF0ZSggVDFfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICBUMV9Mb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGZhY2UgKTsKLQotICAgIGxvYWRlci0+a2V5d29yZHNfZW5jb3VudGVyZWQgfD0gVDFfUFJJVkFURTsKLSAgfQotCi0KLSAgLyogcmV0dXJuIDEgaW4gY2FzZSBvZiBzdWNjZXNzICovCi0KLSAgc3RhdGljIGludAotICByZWFkX2JpbmFyeV9kYXRhKCBUMV9QYXJzZXIgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgRlRfVUxvbmcqICBzaXplLAotICAgICAgICAgICAgICAgICAgICBGVF9CeXRlKiogIGJhc2UsCi0gICAgICAgICAgICAgICAgICAgIEZUX0Jvb2wgICAgaW5jcmVtZW50YWwgKQotICB7Ci0gICAgRlRfQnl0ZSogIGN1cjsKLSAgICBGVF9CeXRlKiAgbGltaXQgPSBwYXJzZXItPnJvb3QubGltaXQ7Ci0KLQotICAgIC8qIHRoZSBiaW5hcnkgZGF0YSBoYXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0cyAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgYHNpemUnIFt3aGl0ZSpdIFJEIHdoaXRlIC4uLi4uLi4gTkQgICAgICAgICAgICAqLwotICAgIC8qICAgYHNpemUnIFt3aGl0ZSpdIC18IHdoaXRlIC4uLi4uLi4gfC0gICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgVDFfU2tpcF9TcGFjZXMoIHBhcnNlciApOwotCi0gICAgY3VyID0gcGFyc2VyLT5yb290LmN1cnNvcjsKLQotICAgIGlmICggY3VyIDwgbGltaXQgJiYgZnRfaXNkaWdpdCggKmN1ciApICkKLSAgICB7Ci0gICAgICBGVF9Mb25nICBzID0gVDFfVG9JbnQoIHBhcnNlciApOwotCi0KLSAgICAgIFQxX1NraXBfUFNfVG9rZW4oIHBhcnNlciApOyAgIC8qIGBSRCcgb3IgYC18JyBvciBzb21ldGhpbmcgZWxzZSAqLwotCi0gICAgICAvKiB0aGVyZSBpcyBvbmx5IG9uZSB3aGl0ZXNwYWNlIGNoYXIgYWZ0ZXIgdGhlICovCi0gICAgICAvKiBgUkQnIG9yIGAtfCcgdG9rZW4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAqYmFzZSA9IHBhcnNlci0+cm9vdC5jdXJzb3IgKyAxOwotCi0gICAgICBpZiAoIHMgPj0gMCAmJiBzIDwgbGltaXQgLSAqYmFzZSApCi0gICAgICB7Ci0gICAgICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgKz0gcyArIDE7Ci0gICAgICAgICpzaXplID0gKEZUX1VMb25nKXM7Ci0gICAgICAgIHJldHVybiAhcGFyc2VyLT5yb290LmVycm9yOwotICAgICAgfQotICAgIH0KLQotICAgIGlmKCAhaW5jcmVtZW50YWwgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInJlYWRfYmluYXJ5X2RhdGE6IGludmFsaWQgc2l6ZSBmaWVsZFxuIiApKTsKLSAgICAgIHBhcnNlci0+cm9vdC5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIC8qIFdlIG5vdyBkZWZpbmUgdGhlIHJvdXRpbmVzIHRvIGhhbmRsZSB0aGUgYC9FbmNvZGluZycsIGAvU3VicnMnLCAqLwotICAvKiBhbmQgYC9DaGFyU3RyaW5ncycgZGljdGlvbmFyaWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICBzdGF0aWMgdm9pZAotICB0MV9wYXJzZV9mb250X21hdHJpeCggVDFfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgVDFfTG9hZGVyICBsb2FkZXIgKQotICB7Ci0gICAgVDFfUGFyc2VyICAgcGFyc2VyID0gJmxvYWRlci0+cGFyc2VyOwotICAgIEZUX01hdHJpeCogIG1hdHJpeCA9ICZmYWNlLT50eXBlMS5mb250X21hdHJpeDsKLSAgICBGVF9WZWN0b3IqICBvZmZzZXQgPSAmZmFjZS0+dHlwZTEuZm9udF9vZmZzZXQ7Ci0gICAgRlRfRmFjZSAgICAgcm9vdCAgID0gKEZUX0ZhY2UpJmZhY2UtPnJvb3Q7Ci0gICAgRlRfRml4ZWQgICAgdGVtcFs2XTsKLSAgICBGVF9GaXhlZCAgICB0ZW1wX3NjYWxlOwotICAgIEZUX0ludCAgICAgIHJlc3VsdDsKLQotCi0gICAgLyogaW5wdXQgaXMgc2NhbGVkIGJ5IDEwMDAgdG8gYWNjb21tb2RhdGUgZGVmYXVsdCBGb250TWF0cml4ICovCi0gICAgcmVzdWx0ID0gVDFfVG9GaXhlZEFycmF5KCBwYXJzZXIsIDYsIHRlbXAsIDMgKTsKLQotICAgIGlmICggcmVzdWx0IDwgNiApCi0gICAgewotICAgICAgcGFyc2VyLT5yb290LmVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB0ZW1wX3NjYWxlID0gRlRfQUJTKCB0ZW1wWzNdICk7Ci0KLSAgICBpZiAoIHRlbXBfc2NhbGUgPT0gMCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAidDFfcGFyc2VfZm9udF9tYXRyaXg6IGludmFsaWQgZm9udCBtYXRyaXhcbiIgKSk7Ci0gICAgICBwYXJzZXItPnJvb3QuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8qIGF0eXBpY2FsIGNhc2UgKi8KLSAgICBpZiAoIHRlbXBfc2NhbGUgIT0gMHgxMDAwMEwgKQotICAgIHsKLSAgICAgIC8qIHNldCB1bml0cyBwZXIgRU0gYmFzZWQgb24gRm9udE1hdHJpeCB2YWx1ZXMgKi8KLSAgICAgIHJvb3QtPnVuaXRzX3Blcl9FTSA9IChGVF9VU2hvcnQpRlRfRGl2Rml4KCAxMDAwLCB0ZW1wX3NjYWxlICk7Ci0KLSAgICAgIHRlbXBbMF0gPSBGVF9EaXZGaXgoIHRlbXBbMF0sIHRlbXBfc2NhbGUgKTsKLSAgICAgIHRlbXBbMV0gPSBGVF9EaXZGaXgoIHRlbXBbMV0sIHRlbXBfc2NhbGUgKTsKLSAgICAgIHRlbXBbMl0gPSBGVF9EaXZGaXgoIHRlbXBbMl0sIHRlbXBfc2NhbGUgKTsKLSAgICAgIHRlbXBbNF0gPSBGVF9EaXZGaXgoIHRlbXBbNF0sIHRlbXBfc2NhbGUgKTsKLSAgICAgIHRlbXBbNV0gPSBGVF9EaXZGaXgoIHRlbXBbNV0sIHRlbXBfc2NhbGUgKTsKLSAgICAgIHRlbXBbM10gPSB0ZW1wWzNdIDwgMCA/IC0weDEwMDAwTCA6IDB4MTAwMDBMOwotICAgIH0KLQotICAgIG1hdHJpeC0+eHggPSB0ZW1wWzBdOwotICAgIG1hdHJpeC0+eXggPSB0ZW1wWzFdOwotICAgIG1hdHJpeC0+eHkgPSB0ZW1wWzJdOwotICAgIG1hdHJpeC0+eXkgPSB0ZW1wWzNdOwotCi0gICAgLyogbm90ZSB0aGF0IHRoZSBvZmZzZXRzIG11c3QgYmUgZXhwcmVzc2VkIGluIGludGVnZXIgZm9udCB1bml0cyAqLwotICAgIG9mZnNldC0+eCA9IHRlbXBbNF0gPj4gMTY7Ci0gICAgb2Zmc2V0LT55ID0gdGVtcFs1XSA+PiAxNjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgcGFyc2VfZW5jb2RpbmcoIFQxX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgIFQxX0xvYWRlciAgbG9hZGVyICkKLSAgewotICAgIFQxX1BhcnNlciAgcGFyc2VyID0gJmxvYWRlci0+cGFyc2VyOwotICAgIEZUX0J5dGUqICAgY3VyOwotICAgIEZUX0J5dGUqICAgbGltaXQgID0gcGFyc2VyLT5yb290LmxpbWl0OwotCi0gICAgUFNBdXhfU2VydmljZSAgcHNhdXggPSAoUFNBdXhfU2VydmljZSlmYWNlLT5wc2F1eDsKLQotCi0gICAgVDFfU2tpcF9TcGFjZXMoIHBhcnNlciApOwotICAgIGN1ciA9IHBhcnNlci0+cm9vdC5jdXJzb3I7Ci0gICAgaWYgKCBjdXIgPj0gbGltaXQgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggInBhcnNlX2VuY29kaW5nOiBvdXQgb2YgYm91bmRzXG4iICkpOwotICAgICAgcGFyc2VyLT5yb290LmVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvKiBpZiB3ZSBoYXZlIGEgbnVtYmVyIG9yIGBbJywgdGhlIGVuY29kaW5nIGlzIGFuIGFycmF5LCAqLwotICAgIC8qIGFuZCB3ZSBtdXN0IGxvYWQgaXQgbm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBmdF9pc2RpZ2l0KCAqY3VyICkgfHwgKmN1ciA9PSAnWycgKQotICAgIHsKLSAgICAgIFQxX0VuY29kaW5nICBlbmNvZGUgICAgICAgICAgPSAmZmFjZS0+dHlwZTEuZW5jb2Rpbmc7Ci0gICAgICBGVF9JbnQgICAgICAgY291bnQsIG47Ci0gICAgICBQU19UYWJsZSAgICAgY2hhcl90YWJsZSAgICAgID0gJmxvYWRlci0+ZW5jb2RpbmdfdGFibGU7Ci0gICAgICBGVF9NZW1vcnkgICAgbWVtb3J5ICAgICAgICAgID0gcGFyc2VyLT5yb290Lm1lbW9yeTsKLSAgICAgIEZUX0Vycm9yICAgICBlcnJvcjsKLSAgICAgIEZUX0Jvb2wgICAgICBvbmx5X2ltbWVkaWF0ZXMgPSAwOwotCi0KLSAgICAgIC8qIHJlYWQgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBlbmNvZGluZzsgc2hvdWxkIGJlIDI1NiAqLwotICAgICAgaWYgKCAqY3VyID09ICdbJyApCi0gICAgICB7Ci0gICAgICAgIGNvdW50ICAgICAgICAgICA9IDI1NjsKLSAgICAgICAgb25seV9pbW1lZGlhdGVzID0gMTsKLSAgICAgICAgcGFyc2VyLT5yb290LmN1cnNvcisrOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgICBjb3VudCA9IChGVF9JbnQpVDFfVG9JbnQoIHBhcnNlciApOwotCi0gICAgICAvKiBvbmx5IGNvbXBvc2l0ZSBmb250cyAod2hpY2ggd2UgZG9uJ3Qgc3VwcG9ydCkgKi8KLSAgICAgIC8qIGNhbiBoYXZlIGxhcmdlciB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgaWYgKCBjb3VudCA+IDI1NiApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggInBhcnNlX2VuY29kaW5nOiBpbnZhbGlkIGVuY29kaW5nIGFycmF5IHNpemVcbiIgKSk7Ci0gICAgICAgIHBhcnNlci0+cm9vdC5lcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgVDFfU2tpcF9TcGFjZXMoIHBhcnNlciApOwotICAgICAgaWYgKCBwYXJzZXItPnJvb3QuY3Vyc29yID49IGxpbWl0ICkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICAvKiBQb3N0U2NyaXB0IGhhcHBpbHkgYWxsb3dzIG92ZXJ3cml0aW5nIG9mIGVuY29kaW5nIGFycmF5cyAqLwotICAgICAgaWYgKCBlbmNvZGUtPmNoYXJfaW5kZXggKQotICAgICAgewotICAgICAgICBGVF9GUkVFKCBlbmNvZGUtPmNoYXJfaW5kZXggKTsKLSAgICAgICAgRlRfRlJFRSggZW5jb2RlLT5jaGFyX25hbWUgKTsKLSAgICAgICAgVDFfUmVsZWFzZV9UYWJsZSggY2hhcl90YWJsZSApOwotICAgICAgfQotCi0gICAgICAvKiB3ZSB1c2UgYSBUMV9UYWJsZSB0byBzdG9yZSBvdXIgY2hhcm5hbWVzICovCi0gICAgICBsb2FkZXItPm51bV9jaGFycyA9IGVuY29kZS0+bnVtX2NoYXJzID0gY291bnQ7Ci0gICAgICBpZiAoIEZUX05FV19BUlJBWSggZW5jb2RlLT5jaGFyX2luZGV4LCBjb3VudCApICAgICB8fAotICAgICAgICAgICBGVF9ORVdfQVJSQVkoIGVuY29kZS0+Y2hhcl9uYW1lLCAgY291bnQgKSAgICAgfHwKLSAgICAgICAgICAgRlRfU0VUX0VSUk9SKCBwc2F1eC0+cHNfdGFibGVfZnVuY3MtPmluaXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyX3RhYmxlLCBjb3VudCwgbWVtb3J5ICkgKSApCi0gICAgICB7Ci0gICAgICAgIHBhcnNlci0+cm9vdC5lcnJvciA9IGVycm9yOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIC8qIFdlIG5lZWQgdG8gYHplcm8nIG91dCBlbmNvZGluZ190YWJsZS5lbGVtZW50cyAqLwotICAgICAgZm9yICggbiA9IDA7IG4gPCBjb3VudDsgbisrICkKLSAgICAgIHsKLSAgICAgICAgY2hhciogIG5vdGRlZiA9IChjaGFyICopIi5ub3RkZWYiOwotCi0KLSAgICAgICAgKHZvaWQpVDFfQWRkX1RhYmxlKCBjaGFyX3RhYmxlLCBuLCBub3RkZWYsIDggKTsKLSAgICAgIH0KLQotICAgICAgLyogTm93IHdlIG5lZWQgdG8gcmVhZCByZWNvcmRzIG9mIHRoZSBmb3JtICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgLi4uIGNoYXJjb2RlIC9jaGFybmFtZSAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiBmb3IgZWFjaCBlbnRyeSBpbiBvdXIgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogV2Ugc2ltcGx5IGxvb2sgZm9yIGEgbnVtYmVyIGZvbGxvd2VkIGJ5IGFuIGltbWVkaWF0ZSAgICovCi0gICAgICAvKiBuYW1lLiAgTm90ZSB0aGF0IHRoaXMgaWdub3JlcyBjb3JyZWN0bHkgdGhlIHNlcXVlbmNlICAgKi8KLSAgICAgIC8qIHRoYXQgaXMgb2Z0ZW4gc2VlbiBpbiB0eXBlMSBmb250czogICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgIDAgMSAyNTUgeyAxIGluZGV4IGV4Y2ggLy5ub3RkZWYgcHV0IH0gZm9yIGR1cCAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogdXNlZCB0byBjbGVhbiB0aGUgZW5jb2RpbmcgYXJyYXkgYmVmb3JlIGFueXRoaW5nIGVsc2UuICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIEFsdGVybmF0aXZlbHksIGlmIHRoZSBhcnJheSBpcyBkaXJlY3RseSBnaXZlbiBhcyAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAvKiAgIC9FbmNvZGluZyBbIC4uLiBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogd2Ugb25seSByZWFkIGltbWVkaWF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIG4gPSAwOwotICAgICAgVDFfU2tpcF9TcGFjZXMoIHBhcnNlciApOwotCi0gICAgICB3aGlsZSAoIHBhcnNlci0+cm9vdC5jdXJzb3IgPCBsaW1pdCApCi0gICAgICB7Ci0gICAgICAgIGN1ciA9IHBhcnNlci0+cm9vdC5jdXJzb3I7Ci0KLSAgICAgICAgLyogd2Ugc3RvcCB3aGVuIHdlIGVuY291bnRlciBhIGBkZWYnIG9yIGBdJyAqLwotICAgICAgICBpZiAoICpjdXIgPT0gJ2QnICYmIGN1ciArIDMgPCBsaW1pdCApCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGN1clsxXSA9PSAnZScgICAgICAgICAmJgotICAgICAgICAgICAgICAgY3VyWzJdID09ICdmJyAgICAgICAgICYmCi0gICAgICAgICAgICAgICBJU19QU19ERUxJTSggY3VyWzNdICkgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1RSQUNFNigoICJlbmNvZGluZyBlbmRcbiIgKSk7Ci0gICAgICAgICAgICBjdXIgKz0gMzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoICpjdXIgPT0gJ10nICkKLSAgICAgICAgewotICAgICAgICAgIEZUX1RSQUNFNigoICJlbmNvZGluZyBlbmRcbiIgKSk7Ci0gICAgICAgICAgY3VyKys7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBjaGVjayB3aGV0aGVyIHdlJ3ZlIGZvdW5kIGFuIGVudHJ5ICovCi0gICAgICAgIGlmICggZnRfaXNkaWdpdCggKmN1ciApIHx8IG9ubHlfaW1tZWRpYXRlcyApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9JbnQgIGNoYXJjb2RlOwotCi0KLSAgICAgICAgICBpZiAoIG9ubHlfaW1tZWRpYXRlcyApCi0gICAgICAgICAgICBjaGFyY29kZSA9IG47Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNoYXJjb2RlID0gKEZUX0ludClUMV9Ub0ludCggcGFyc2VyICk7Ci0gICAgICAgICAgICBUMV9Ta2lwX1NwYWNlcyggcGFyc2VyICk7Ci0KLSAgICAgICAgICAgIC8qIHByb3RlY3QgYWdhaW5zdCBpbnZhbGlkIGNoYXJjb2RlICovCi0gICAgICAgICAgICBpZiAoIGN1ciA9PSBwYXJzZXItPnJvb3QuY3Vyc29yICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcGFyc2VyLT5yb290LmVycm9yID0gRlRfVEhST1coIFVua25vd25fRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGN1ciA9IHBhcnNlci0+cm9vdC5jdXJzb3I7Ci0KLSAgICAgICAgICBpZiAoIGN1ciArIDIgPCBsaW1pdCAmJiAqY3VyID09ICcvJyAmJiBuIDwgY291bnQgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIEZUX1VJbnQgIGxlbjsKLQotCi0gICAgICAgICAgICBjdXIrKzsKLQotICAgICAgICAgICAgcGFyc2VyLT5yb290LmN1cnNvciA9IGN1cjsKLSAgICAgICAgICAgIFQxX1NraXBfUFNfVG9rZW4oIHBhcnNlciApOwotICAgICAgICAgICAgaWYgKCBwYXJzZXItPnJvb3QuY3Vyc29yID49IGxpbWl0ICkKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgaWYgKCBwYXJzZXItPnJvb3QuZXJyb3IgKQotICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGxlbiA9IChGVF9VSW50KSggcGFyc2VyLT5yb290LmN1cnNvciAtIGN1ciApOwotCi0gICAgICAgICAgICBwYXJzZXItPnJvb3QuZXJyb3IgPSBUMV9BZGRfVGFibGUoIGNoYXJfdGFibGUsIGNoYXJjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXIsIGxlbiArIDEgKTsKLSAgICAgICAgICAgIGlmICggcGFyc2VyLT5yb290LmVycm9yICkKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgY2hhcl90YWJsZS0+ZWxlbWVudHNbY2hhcmNvZGVdW2xlbl0gPSAnXDAnOwotCi0gICAgICAgICAgICBuKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgaWYgKCBvbmx5X2ltbWVkaWF0ZXMgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIFNpbmNlIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIG5vdCB1cGRhdGVkIGZvciAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qIGltbWVkaWF0ZXMtb25seSBtb2RlIHdlIHdvdWxkIGdldCBhbiBpbmZpbml0ZSBsb29wIGlmICAgKi8KLSAgICAgICAgICAgIC8qIHdlIGRvbid0IGRvIGFueXRoaW5nIGhlcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qIFRoaXMgZW5jb2RpbmcgYXJyYXkgaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byB0aGUgdHlwZTEgKi8KLSAgICAgICAgICAgIC8qIHNwZWNpZmljYXRpb24gKGl0IG1pZ2h0IGJlIGFuIGVuY29kaW5nIGZvciBhIENJRCB0eXBlMSAgKi8KLSAgICAgICAgICAgIC8qIGZvbnQsIGhvd2V2ZXIpLCBzbyB3ZSBjb25jbHVkZSB0aGF0IHRoaXMgZm9udCBpcyBOT1QgYSAgKi8KLSAgICAgICAgICAgIC8qIHR5cGUxIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBhcnNlci0+cm9vdC5lcnJvciA9IEZUX1RIUk9XKCBVbmtub3duX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIFQxX1NraXBfUFNfVG9rZW4oIHBhcnNlciApOwotICAgICAgICAgIGlmICggcGFyc2VyLT5yb290LmVycm9yICkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIFQxX1NraXBfU3BhY2VzKCBwYXJzZXIgKTsKLSAgICAgIH0KLQotICAgICAgZmFjZS0+dHlwZTEuZW5jb2RpbmdfdHlwZSA9IFQxX0VOQ09ESU5HX1RZUEVfQVJSQVk7Ci0gICAgICBwYXJzZXItPnJvb3QuY3Vyc29yICAgICAgID0gY3VyOwotICAgIH0KLQotICAgIC8qIE90aGVyd2lzZSwgd2Ugc2hvdWxkIGhhdmUgZWl0aGVyIGBTdGFuZGFyZEVuY29kaW5nJywgKi8KLSAgICAvKiBgRXhwZXJ0RW5jb2RpbmcnLCBvciBgSVNPTGF0aW4xRW5jb2RpbmcnICAgICAgICAgICAgICovCi0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmICggY3VyICsgMTcgPCBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgZnRfc3RybmNtcCggKGNvbnN0IGNoYXIqKWN1ciwgIlN0YW5kYXJkRW5jb2RpbmciLCAxNiApID09IDAgKQotICAgICAgICBmYWNlLT50eXBlMS5lbmNvZGluZ190eXBlID0gVDFfRU5DT0RJTkdfVFlQRV9TVEFOREFSRDsKLQotICAgICAgZWxzZSBpZiAoIGN1ciArIDE1IDwgbGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgIGZ0X3N0cm5jbXAoIChjb25zdCBjaGFyKiljdXIsICJFeHBlcnRFbmNvZGluZyIsIDE0ICkgPT0gMCApCi0gICAgICAgIGZhY2UtPnR5cGUxLmVuY29kaW5nX3R5cGUgPSBUMV9FTkNPRElOR19UWVBFX0VYUEVSVDsKLQotICAgICAgZWxzZSBpZiAoIGN1ciArIDE4IDwgbGltaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgIGZ0X3N0cm5jbXAoIChjb25zdCBjaGFyKiljdXIsICJJU09MYXRpbjFFbmNvZGluZyIsIDE3ICkgPT0gMCApCi0gICAgICAgIGZhY2UtPnR5cGUxLmVuY29kaW5nX3R5cGUgPSBUMV9FTkNPRElOR19UWVBFX0lTT0xBVElOMTsKLQotICAgICAgZWxzZQotICAgICAgICBwYXJzZXItPnJvb3QuZXJyb3IgPSBGVF9FUlIoIElnbm9yZSApOwotICAgIH0KLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgcGFyc2Vfc3VicnMoIFQxX0ZhY2UgICAgZmFjZSwKLSAgICAgICAgICAgICAgIFQxX0xvYWRlciAgbG9hZGVyICkKLSAgewotICAgIFQxX1BhcnNlciAgcGFyc2VyID0gJmxvYWRlci0+cGFyc2VyOwotICAgIFBTX1RhYmxlICAgdGFibGUgID0gJmxvYWRlci0+c3VicnM7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBwYXJzZXItPnJvb3QubWVtb3J5OwotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfSW50ICAgICBudW1fc3VicnM7Ci0KLSAgICBQU0F1eF9TZXJ2aWNlICBwc2F1eCA9IChQU0F1eF9TZXJ2aWNlKWZhY2UtPnBzYXV4OwotCi0KLSAgICBUMV9Ta2lwX1NwYWNlcyggcGFyc2VyICk7Ci0KLSAgICAvKiB0ZXN0IGZvciBlbXB0eSBhcnJheSAqLwotICAgIGlmICggcGFyc2VyLT5yb290LmN1cnNvciA8IHBhcnNlci0+cm9vdC5saW1pdCAmJgotICAgICAgICAgKnBhcnNlci0+cm9vdC5jdXJzb3IgPT0gJ1snICAgICAgICAgICAgICApCi0gICAgewotICAgICAgVDFfU2tpcF9QU19Ub2tlbiggcGFyc2VyICk7Ci0gICAgICBUMV9Ta2lwX1NwYWNlcyAgKCBwYXJzZXIgKTsKLSAgICAgIGlmICggcGFyc2VyLT5yb290LmN1cnNvciA+PSBwYXJzZXItPnJvb3QubGltaXQgfHwKLSAgICAgICAgICAgKnBhcnNlci0+cm9vdC5jdXJzb3IgIT0gJ10nICAgICAgICAgICAgICAgKQotICAgICAgICBwYXJzZXItPnJvb3QuZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG51bV9zdWJycyA9IChGVF9JbnQpVDFfVG9JbnQoIHBhcnNlciApOwotCi0gICAgLyogcG9zaXRpb24gdGhlIHBhcnNlciByaWdodCBiZWZvcmUgdGhlIGBkdXAnIG9mIHRoZSBmaXJzdCBzdWJyICovCi0gICAgVDFfU2tpcF9QU19Ub2tlbiggcGFyc2VyICk7ICAgICAgICAgLyogYGFycmF5JyAqLwotICAgIGlmICggcGFyc2VyLT5yb290LmVycm9yICkKLSAgICAgIHJldHVybjsKLSAgICBUMV9Ta2lwX1NwYWNlcyggcGFyc2VyICk7Ci0KLSAgICAvKiBpbml0aWFsaXplIHN1YnJzIGFycmF5IC0tIHdpdGggc3ludGhldGljIGZvbnRzIGl0IGlzIHBvc3NpYmxlICovCi0gICAgLyogd2UgZ2V0IGhlcmUgdHdpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIGlmICggIWxvYWRlci0+bnVtX3N1YnJzICkKLSAgICB7Ci0gICAgICBlcnJvciA9IHBzYXV4LT5wc190YWJsZV9mdW5jcy0+aW5pdCggdGFibGUsIG51bV9zdWJycywgbWVtb3J5ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotICAgIH0KLQotICAgIC8qIHRoZSBmb3JtYXQgaXMgc2ltcGxlOiAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgIGBpbmRleCcgKyBiaW5hcnkgZGF0YSAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgZm9yICg7OykKLSAgICB7Ci0gICAgICBGVF9Mb25nICAgaWR4OwotICAgICAgRlRfVUxvbmcgIHNpemU7Ci0gICAgICBGVF9CeXRlKiAgYmFzZTsKLQotCi0gICAgICAvKiBJZiB3ZSBhcmUgb3V0IG9mIGRhdGEsIG9yIGlmIHRoZSBuZXh0IHRva2VuIGlzbid0IGBkdXAnLCAqLwotICAgICAgLyogd2UgYXJlIGRvbmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggcGFyc2VyLT5yb290LmN1cnNvciArIDQgPj0gcGFyc2VyLT5yb290LmxpbWl0ICAgICAgICAgIHx8Ci0gICAgICAgICAgZnRfc3RybmNtcCggKGNoYXIqKXBhcnNlci0+cm9vdC5jdXJzb3IsICJkdXAiLCAzICkgIT0gMCApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBUMV9Ta2lwX1BTX1Rva2VuKCBwYXJzZXIgKTsgICAgICAgLyogYGR1cCcgKi8KLQotICAgICAgaWR4ID0gVDFfVG9JbnQoIHBhcnNlciApOwotCi0gICAgICBpZiAoICFyZWFkX2JpbmFyeV9kYXRhKCBwYXJzZXIsICZzaXplLCAmYmFzZSwgSVNfSU5DUkVNRU5UQUwgKSApCi0gICAgICAgIHJldHVybjsKLQotICAgICAgLyogVGhlIGJpbmFyeSBzdHJpbmcgaXMgZm9sbG93ZWQgYnkgb25lIHRva2VuLCBlLmcuIGBOUCcgKi8KLSAgICAgIC8qIChib3VuZCB0byBgbm9hY2Nlc3MgcHV0Jykgb3IgYnkgdHdvIHNlcGFyYXRlIHRva2VuczogICovCi0gICAgICAvKiBgbm9hY2Nlc3MnICYgYHB1dCcuICBXZSBwb3NpdGlvbiB0aGUgcGFyc2VyIHJpZ2h0ICAgICAqLwotICAgICAgLyogYmVmb3JlIHRoZSBuZXh0IGBkdXAnLCBpZiBhbnkuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIFQxX1NraXBfUFNfVG9rZW4oIHBhcnNlciApOyAgIC8qIGBOUCcgb3IgYHwnIG9yIGBub2FjY2VzcycgKi8KLSAgICAgIGlmICggcGFyc2VyLT5yb290LmVycm9yICkKLSAgICAgICAgcmV0dXJuOwotICAgICAgVDFfU2tpcF9TcGFjZXMgICggcGFyc2VyICk7Ci0KLSAgICAgIGlmICggcGFyc2VyLT5yb290LmN1cnNvciArIDQgPCBwYXJzZXItPnJvb3QubGltaXQgICAgICAgICAgICAmJgotICAgICAgICAgICBmdF9zdHJuY21wKCAoY2hhciopcGFyc2VyLT5yb290LmN1cnNvciwgInB1dCIsIDMgKSA9PSAwICkKLSAgICAgIHsKLSAgICAgICAgVDFfU2tpcF9QU19Ub2tlbiggcGFyc2VyICk7IC8qIHNraXAgYHB1dCcgKi8KLSAgICAgICAgVDFfU2tpcF9TcGFjZXMgICggcGFyc2VyICk7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHdpdGggc3ludGhldGljIGZvbnRzIGl0IGlzIHBvc3NpYmxlIHdlIGdldCBoZXJlIHR3aWNlICovCi0gICAgICBpZiAoIGxvYWRlci0+bnVtX3N1YnJzICkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIC8qIHNvbWUgZm9udHMgdXNlIGEgdmFsdWUgb2YgLTEgZm9yIGxlbklWIHRvIGluZGljYXRlIHRoYXQgKi8KLSAgICAgIC8qIHRoZSBjaGFyc3RyaW5ncyBhcmUgdW5lbmNvZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIHRoYW5rcyB0byBUb20gS2Fjdmluc2t5IGZvciBwb2ludGluZyB0aGlzIG91dCAgICAgICAgICAgKi8KLSAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIGlmICggZmFjZS0+dHlwZTEucHJpdmF0ZV9kaWN0LmxlbklWID49IDAgKQotICAgICAgewotICAgICAgICBGVF9CeXRlKiAgdGVtcDsKLQotCi0gICAgICAgIC8qIHNvbWUgZm9udHMgZGVmaW5lIGVtcHR5IHN1YnIgcmVjb3JkcyAtLSB0aGlzIGlzIG5vdCB0b3RhbGx5ICovCi0gICAgICAgIC8qIGNvbXBsaWFudCB0byB0aGUgc3BlY2lmaWNhdGlvbiAod2hpY2ggc2F5cyB0aGV5IHNob3VsZCBhdCAgICovCi0gICAgICAgIC8qIGxlYXN0IGNvbnRhaW4gYSBgcmV0dXJuJyksIGJ1dCB3ZSBzdXBwb3J0IHRoZW0gYW55d2F5ICAgICAgICovCi0gICAgICAgIGlmICggc2l6ZSA8IChGVF9VTG9uZylmYWNlLT50eXBlMS5wcml2YXRlX2RpY3QubGVuSVYgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHQxX2RlY3J5cHQoKSBzaG91bGRuJ3Qgd3JpdGUgdG8gYmFzZSAtLSBtYWtlIHRlbXBvcmFyeSBjb3B5ICovCi0gICAgICAgIGlmICggRlRfQUxMT0MoIHRlbXAsIHNpemUgKSApCi0gICAgICAgICAgZ290byBGYWlsOwotICAgICAgICBGVF9NRU1fQ09QWSggdGVtcCwgYmFzZSwgc2l6ZSApOwotICAgICAgICBwc2F1eC0+dDFfZGVjcnlwdCggdGVtcCwgc2l6ZSwgNDMzMCApOwotICAgICAgICBzaXplIC09IChGVF9VTG9uZylmYWNlLT50eXBlMS5wcml2YXRlX2RpY3QubGVuSVY7Ci0gICAgICAgIGVycm9yID0gVDFfQWRkX1RhYmxlKCB0YWJsZSwgKEZUX0ludClpZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wICsgZmFjZS0+dHlwZTEucHJpdmF0ZV9kaWN0LmxlbklWLCBzaXplICk7Ci0gICAgICAgIEZUX0ZSRUUoIHRlbXAgKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgICAgZXJyb3IgPSBUMV9BZGRfVGFibGUoIHRhYmxlLCAoRlRfSW50KWlkeCwgYmFzZSwgc2l6ZSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICBpZiAoICFsb2FkZXItPm51bV9zdWJycyApCi0gICAgICBsb2FkZXItPm51bV9zdWJycyA9IG51bV9zdWJyczsKLQotICAgIHJldHVybjsKLQotICBGYWlsOgotICAgIHBhcnNlci0+cm9vdC5lcnJvciA9IGVycm9yOwotICB9Ci0KLQotI2RlZmluZSBUQUJMRV9FWFRFTkQgIDUKLQotCi0gIHN0YXRpYyB2b2lkCi0gIHBhcnNlX2NoYXJzdHJpbmdzKCBUMV9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICBUMV9Mb2FkZXIgIGxvYWRlciApCi0gIHsKLSAgICBUMV9QYXJzZXIgICAgICBwYXJzZXIgICAgICAgPSAmbG9hZGVyLT5wYXJzZXI7Ci0gICAgUFNfVGFibGUgICAgICAgY29kZV90YWJsZSAgID0gJmxvYWRlci0+Y2hhcnN0cmluZ3M7Ci0gICAgUFNfVGFibGUgICAgICAgbmFtZV90YWJsZSAgID0gJmxvYWRlci0+Z2x5cGhfbmFtZXM7Ci0gICAgUFNfVGFibGUgICAgICAgc3dhcF90YWJsZSAgID0gJmxvYWRlci0+c3dhcF90YWJsZTsKLSAgICBGVF9NZW1vcnkgICAgICBtZW1vcnkgICAgICAgPSBwYXJzZXItPnJvb3QubWVtb3J5OwotICAgIEZUX0Vycm9yICAgICAgIGVycm9yOwotCi0gICAgUFNBdXhfU2VydmljZSAgcHNhdXggICAgICAgID0gKFBTQXV4X1NlcnZpY2UpZmFjZS0+cHNhdXg7Ci0KLSAgICBGVF9CeXRlKiAgICAgICBjdXIgICAgICAgICAgPSBwYXJzZXItPnJvb3QuY3Vyc29yOwotICAgIEZUX0J5dGUqICAgICAgIGxpbWl0ICAgICAgICA9IHBhcnNlci0+cm9vdC5saW1pdDsKLSAgICBGVF9JbnQgICAgICAgICBuLCBudW1fZ2x5cGhzOwotICAgIEZUX0ludCAgICAgICAgIG5vdGRlZl9pbmRleCA9IDA7Ci0gICAgRlRfQnl0ZSAgICAgICAgbm90ZGVmX2ZvdW5kID0gMDsKLQotCi0gICAgbnVtX2dseXBocyA9IChGVF9JbnQpVDFfVG9JbnQoIHBhcnNlciApOwotICAgIGlmICggbnVtX2dseXBocyA8IDAgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgIGdvdG8gRmFpbDsKLSAgICB9Ci0KLSAgICAvKiB3ZSBjZXJ0YWlubHkgbmVlZCBtb3JlIHRoYW4gOCBieXRlcyBwZXIgZ2x5cGggKi8KLSAgICBpZiAoIG51bV9nbHlwaHMgPiAoIGxpbWl0IC0gY3VyICkgPj4gMyApCi0gICAgewotICAgICAgRlRfVFJBQ0UwKCggInBhcnNlX2NoYXJzdHJpbmdzOiBhZGp1c3RpbmcgbnVtYmVyIG9mIGdseXBocyIKLSAgICAgICAgICAgICAgICAgICIgKGZyb20gJWQgdG8gJWQpXG4iLAotICAgICAgICAgICAgICAgICAgbnVtX2dseXBocywgKCBsaW1pdCAtIGN1ciApID4+IDMgKSk7Ci0gICAgICBudW1fZ2x5cGhzID0gKCBsaW1pdCAtIGN1ciApID4+IDM7Ci0gICAgfQotCi0gICAgLyogc29tZSBmb250cyBsaWtlIE9wdGltYS1PYmxpcXVlIG5vdCBvbmx5IGRlZmluZSB0aGUgL0NoYXJTdHJpbmdzICovCi0gICAgLyogYXJyYXkgYnV0IGFjY2VzcyBpdCBhbHNvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCBudW1fZ2x5cGhzID09IDAgfHwgcGFyc2VyLT5yb290LmVycm9yICkKLSAgICAgIHJldHVybjsKLQotICAgIC8qIGluaXRpYWxpemUgdGFibGVzLCBsZWF2aW5nIHNwYWNlIGZvciBhZGRpdGlvbiBvZiAubm90ZGVmLCAqLwotICAgIC8qIGlmIG5lY2Vzc2FyeSwgYW5kIGEgZmV3IG90aGVyIGdseXBocyB0byBoYW5kbGUgYnVnZ3kgICAgICAqLwotICAgIC8qIGZvbnRzIHdoaWNoIGhhdmUgbW9yZSBnbHlwaHMgdGhhbiBzcGVjaWZpZWQuICAgICAgICAgICAgICAqLwotCi0gICAgLyogZm9yIHNvbWUgbm9uLXN0YW5kYXJkIGZvbnRzIGxpa2UgYE9wdGltYScgd2hpY2ggcHJvdmlkZXMgICovCi0gICAgLyogZGlmZmVyZW50IG91dGxpbmVzIGRlcGVuZGluZyBvbiB0aGUgcmVzb2x1dGlvbiBpdCBpcyAgICAgICovCi0gICAgLyogcG9zc2libGUgdG8gZ2V0IGhlcmUgdHdpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgaWYgKCAhbG9hZGVyLT5udW1fZ2x5cGhzICkKLSAgICB7Ci0gICAgICBlcnJvciA9IHBzYXV4LT5wc190YWJsZV9mdW5jcy0+aW5pdCgKLSAgICAgICAgICAgICAgICBjb2RlX3RhYmxlLCBudW1fZ2x5cGhzICsgMSArIFRBQkxFX0VYVEVORCwgbWVtb3J5ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBlcnJvciA9IHBzYXV4LT5wc190YWJsZV9mdW5jcy0+aW5pdCgKLSAgICAgICAgICAgICAgICBuYW1lX3RhYmxlLCBudW1fZ2x5cGhzICsgMSArIFRBQkxFX0VYVEVORCwgbWVtb3J5ICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAvKiBJbml0aWFsaXplIHRhYmxlIGZvciBzd2FwcGluZyBpbmRleCBub3RkZWZfaW5kZXggYW5kICovCi0gICAgICAvKiBpbmRleCAwIG5hbWVzIGFuZCBjb2RlcyAoaWYgbmVjZXNzYXJ5KS4gICAgICAgICAgICAgICovCi0KLSAgICAgIGVycm9yID0gcHNhdXgtPnBzX3RhYmxlX2Z1bmNzLT5pbml0KCBzd2FwX3RhYmxlLCA0LCBtZW1vcnkgKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0gICAgbiA9IDA7Ci0KLSAgICBmb3IgKDs7KQotICAgIHsKLSAgICAgIEZUX1VMb25nICBzaXplOwotICAgICAgRlRfQnl0ZSogIGJhc2U7Ci0KLQotICAgICAgLyogdGhlIGZvcm1hdCBpcyBzaW1wbGU6ICAgICAgICAqLwotICAgICAgLyogICBgL2dseXBobmFtZScgKyBiaW5hcnkgZGF0YSAqLwotCi0gICAgICBUMV9Ta2lwX1NwYWNlcyggcGFyc2VyICk7Ci0KLSAgICAgIGN1ciA9IHBhcnNlci0+cm9vdC5jdXJzb3I7Ci0gICAgICBpZiAoIGN1ciA+PSBsaW1pdCApCi0gICAgICAgIGJyZWFrOwotCi0gICAgICAvKiB3ZSBzdG9wIHdoZW4gd2UgZmluZCBhIGBkZWYnIG9yIGBlbmQnIGtleXdvcmQgKi8KLSAgICAgIGlmICggY3VyICsgMyA8IGxpbWl0ICYmIElTX1BTX0RFTElNKCBjdXJbM10gKSApCi0gICAgICB7Ci0gICAgICAgIGlmICggY3VyWzBdID09ICdkJyAmJgotICAgICAgICAgICAgIGN1clsxXSA9PSAnZScgJiYKLSAgICAgICAgICAgICBjdXJbMl0gPT0gJ2YnICkKLSAgICAgICAgewotICAgICAgICAgIC8qIFRoZXJlIGFyZSBmb250cyB3aGljaCBoYXZlIHRoaXM6ICovCi0gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgIC9DaGFyU3RyaW5ncyAxMTggZGljdCBkZWYgICAgICAqLwotICAgICAgICAgIC8qICAgUHJpdmF0ZSBiZWdpbiAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogICBDaGFyU3RyaW5ncyBiZWdpbiAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAvKiAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgLyogVG8gY2F0Y2ggdGhpcyB3ZSBpZ25vcmUgYGRlZicgaWYgKi8KLSAgICAgICAgICAvKiBubyBjaGFyc3RyaW5nIGhhcyBhY3R1YWxseSBiZWVuICAqLwotICAgICAgICAgIC8qIHNlZW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgaWYgKCBuICkKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBjdXJbMF0gPT0gJ2UnICYmCi0gICAgICAgICAgICAgY3VyWzFdID09ICduJyAmJgotICAgICAgICAgICAgIGN1clsyXSA9PSAnZCcgKQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBUMV9Ta2lwX1BTX1Rva2VuKCBwYXJzZXIgKTsKLSAgICAgIGlmICggcGFyc2VyLT5yb290LmN1cnNvciA+PSBsaW1pdCApCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBGYWlsOwotICAgICAgfQotICAgICAgaWYgKCBwYXJzZXItPnJvb3QuZXJyb3IgKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIGlmICggKmN1ciA9PSAnLycgKQotICAgICAgewotICAgICAgICBGVF9VSW50ICBsZW47Ci0KLQotICAgICAgICBpZiAoIGN1ciArIDIgPj0gbGltaXQgKQotICAgICAgICB7Ci0gICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICAgIGdvdG8gRmFpbDsKLSAgICAgICAgfQotCi0gICAgICAgIGN1cisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNraXAgYC8nICovCi0gICAgICAgIGxlbiA9IChGVF9VSW50KSggcGFyc2VyLT5yb290LmN1cnNvciAtIGN1ciApOwotCi0gICAgICAgIGlmICggIXJlYWRfYmluYXJ5X2RhdGEoIHBhcnNlciwgJnNpemUsICZiYXNlLCBJU19JTkNSRU1FTlRBTCApICkKLSAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgLyogZm9yIHNvbWUgbm9uLXN0YW5kYXJkIGZvbnRzIGxpa2UgYE9wdGltYScgd2hpY2ggcHJvdmlkZXMgKi8KLSAgICAgICAgLyogZGlmZmVyZW50IG91dGxpbmVzIGRlcGVuZGluZyBvbiB0aGUgcmVzb2x1dGlvbiBpdCBpcyAgICAgKi8KLSAgICAgICAgLyogcG9zc2libGUgdG8gZ2V0IGhlcmUgdHdpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgaWYgKCBsb2FkZXItPm51bV9nbHlwaHMgKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGVycm9yID0gVDFfQWRkX1RhYmxlKCBuYW1lX3RhYmxlLCBuLCBjdXIsIGxlbiArIDEgKTsKLSAgICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgICAgZ290byBGYWlsOwotCi0gICAgICAgIC8qIGFkZCBhIHRyYWlsaW5nIHplcm8gdG8gdGhlIG5hbWUgdGFibGUgKi8KLSAgICAgICAgbmFtZV90YWJsZS0+ZWxlbWVudHNbbl1bbGVuXSA9ICdcMCc7Ci0KLSAgICAgICAgLyogcmVjb3JkIGluZGV4IG9mIC8ubm90ZGVmICovCi0gICAgICAgIGlmICggKmN1ciA9PSAnLicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICBmdF9zdHJjbXAoICIubm90ZGVmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKikobmFtZV90YWJsZS0+ZWxlbWVudHNbbl0pICkgPT0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICBub3RkZWZfaW5kZXggPSBuOwotICAgICAgICAgIG5vdGRlZl9mb3VuZCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGZhY2UtPnR5cGUxLnByaXZhdGVfZGljdC5sZW5JViA+PSAwICYmCi0gICAgICAgICAgICAgbiA8IG51bV9nbHlwaHMgKyBUQUJMRV9FWFRFTkQgICAgICAgKQotICAgICAgICB7Ci0gICAgICAgICAgRlRfQnl0ZSogIHRlbXA7Ci0KLQotICAgICAgICAgIGlmICggc2l6ZSA8PSAoRlRfVUxvbmcpZmFjZS0+dHlwZTEucHJpdmF0ZV9kaWN0LmxlbklWICkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLyogdDFfZGVjcnlwdCgpIHNob3VsZG4ndCB3cml0ZSB0byBiYXNlIC0tIG1ha2UgdGVtcG9yYXJ5IGNvcHkgKi8KLSAgICAgICAgICBpZiAoIEZUX0FMTE9DKCB0ZW1wLCBzaXplICkgKQotICAgICAgICAgICAgZ290byBGYWlsOwotICAgICAgICAgIEZUX01FTV9DT1BZKCB0ZW1wLCBiYXNlLCBzaXplICk7Ci0gICAgICAgICAgcHNhdXgtPnQxX2RlY3J5cHQoIHRlbXAsIHNpemUsIDQzMzAgKTsKLSAgICAgICAgICBzaXplIC09IChGVF9VTG9uZylmYWNlLT50eXBlMS5wcml2YXRlX2RpY3QubGVuSVY7Ci0gICAgICAgICAgZXJyb3IgPSBUMV9BZGRfVGFibGUoIGNvZGVfdGFibGUsIG4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgKyBmYWNlLT50eXBlMS5wcml2YXRlX2RpY3QubGVuSVYsIHNpemUgKTsKLSAgICAgICAgICBGVF9GUkVFKCB0ZW1wICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgIGVycm9yID0gVDFfQWRkX1RhYmxlKCBjb2RlX3RhYmxlLCBuLCBiYXNlLCBzaXplICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICBuKys7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgbG9hZGVyLT5udW1fZ2x5cGhzID0gbjsKLQotICAgIC8qIGlmIC8ubm90ZGVmIGlzIGZvdW5kIGJ1dCBkb2VzIG5vdCBvY2N1cHkgaW5kZXggMCwgZG8gb3VyIG1hZ2ljLiAqLwotICAgIGlmICggbm90ZGVmX2ZvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBmdF9zdHJjbXAoICIubm90ZGVmIiwgKGNvbnN0IGNoYXIqKW5hbWVfdGFibGUtPmVsZW1lbnRzWzBdICkgKQotICAgIHsKLSAgICAgIC8qIFN3YXAgZ2x5cGggaW4gaW5kZXggMCB3aXRoIC8ubm90ZGVmIGdseXBoLiAgRmlyc3QsIGFkZCBpbmRleCAwICAqLwotICAgICAgLyogbmFtZSBhbmQgY29kZSBlbnRyaWVzIHRvIHN3YXBfdGFibGUuICBUaGVuIHBsYWNlIG5vdGRlZl9pbmRleCAgICovCi0gICAgICAvKiBuYW1lIGFuZCBjb2RlIGVudHJpZXMgaW50byBzd2FwX3RhYmxlLiAgVGhlbiBzd2FwIG5hbWUgYW5kIGNvZGUgKi8KLSAgICAgIC8qIGVudHJpZXMgYXQgaW5kaWNlcyBub3RkZWZfaW5kZXggYW5kIDAgdXNpbmcgdmFsdWVzIHN0b3JlZCBpbiAgICAqLwotICAgICAgLyogc3dhcF90YWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIC8qIEluZGV4IDAgbmFtZSAqLwotICAgICAgZXJyb3IgPSBUMV9BZGRfVGFibGUoIHN3YXBfdGFibGUsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV90YWJsZS0+ZWxlbWVudHNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV90YWJsZS0+bGVuZ3RocyBbMF0gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIC8qIEluZGV4IDAgY29kZSAqLwotICAgICAgZXJyb3IgPSBUMV9BZGRfVGFibGUoIHN3YXBfdGFibGUsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV90YWJsZS0+ZWxlbWVudHNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV90YWJsZS0+bGVuZ3RocyBbMF0gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIC8qIEluZGV4IG5vdGRlZl9pbmRleCBuYW1lICovCi0gICAgICBlcnJvciA9IFQxX0FkZF9UYWJsZSggc3dhcF90YWJsZSwgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3RhYmxlLT5lbGVtZW50c1tub3RkZWZfaW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfdGFibGUtPmxlbmd0aHMgW25vdGRlZl9pbmRleF0gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIC8qIEluZGV4IG5vdGRlZl9pbmRleCBjb2RlICovCi0gICAgICBlcnJvciA9IFQxX0FkZF9UYWJsZSggc3dhcF90YWJsZSwgMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX3RhYmxlLT5lbGVtZW50c1tub3RkZWZfaW5kZXhdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfdGFibGUtPmxlbmd0aHMgW25vdGRlZl9pbmRleF0gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGVycm9yID0gVDFfQWRkX1RhYmxlKCBuYW1lX3RhYmxlLCBub3RkZWZfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcF90YWJsZS0+ZWxlbWVudHNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcF90YWJsZS0+bGVuZ3RocyBbMF0gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGVycm9yID0gVDFfQWRkX1RhYmxlKCBjb2RlX3RhYmxlLCBub3RkZWZfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcF90YWJsZS0+ZWxlbWVudHNbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcF90YWJsZS0+bGVuZ3RocyBbMV0gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGVycm9yID0gVDFfQWRkX1RhYmxlKCBuYW1lX3RhYmxlLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBfdGFibGUtPmVsZW1lbnRzWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBfdGFibGUtPmxlbmd0aHMgWzJdICk7Ci0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBlcnJvciA9IFQxX0FkZF9UYWJsZSggY29kZV90YWJsZSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwX3RhYmxlLT5lbGVtZW50c1szXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwX3RhYmxlLT5sZW5ndGhzIFszXSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgIH0KLSAgICBlbHNlIGlmICggIW5vdGRlZl9mb3VuZCApCi0gICAgewotICAgICAgLyogbm90ZGVmX2luZGV4IGlzIGFscmVhZHkgMCwgb3IgLy5ub3RkZWYgaXMgdW5kZWZpbmVkIGluICAgKi8KLSAgICAgIC8qIGNoYXJzdHJpbmdzIGRpY3Rpb25hcnkuICBXb3JyeSBhYm91dCAvLm5vdGRlZiB1bmRlZmluZWQuICovCi0gICAgICAvKiBXZSB0YWtlIGluZGV4IDAgYW5kIGFkZCBpdCB0byB0aGUgZW5kIG9mIHRoZSB0YWJsZShzKSAgICAqLwotICAgICAgLyogYW5kIGFkZCBvdXIgb3duIC8ubm90ZGVmIGdseXBoIHRvIGluZGV4IDAuICAgICAgICAgICAgICAgKi8KLQotICAgICAgLyogMCAzMzMgaHNidyBlbmRjaGFyICovCi0gICAgICBGVF9CeXRlICBub3RkZWZfZ2x5cGhbXSA9IHsgMHg4QiwgMHhGNywgMHhFMSwgMHgwRCwgMHgwRSB9OwotICAgICAgY2hhciogICAgbm90ZGVmX25hbWUgICAgPSAoY2hhciAqKSIubm90ZGVmIjsKLQotCi0gICAgICBlcnJvciA9IFQxX0FkZF9UYWJsZSggc3dhcF90YWJsZSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3RhYmxlLT5lbGVtZW50c1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3RhYmxlLT5sZW5ndGhzIFswXSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgZXJyb3IgPSBUMV9BZGRfVGFibGUoIHN3YXBfdGFibGUsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV90YWJsZS0+ZWxlbWVudHNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV90YWJsZS0+bGVuZ3RocyBbMF0gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIGVycm9yID0gVDFfQWRkX1RhYmxlKCBuYW1lX3RhYmxlLCAwLCBub3RkZWZfbmFtZSwgOCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgZXJyb3IgPSBUMV9BZGRfVGFibGUoIGNvZGVfdGFibGUsIDAsIG5vdGRlZl9nbHlwaCwgNSApOwotCi0gICAgICBpZiAoIGVycm9yICkKLSAgICAgICAgZ290byBGYWlsOwotCi0gICAgICBlcnJvciA9IFQxX0FkZF9UYWJsZSggbmFtZV90YWJsZSwgbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwX3RhYmxlLT5lbGVtZW50c1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwX3RhYmxlLT5sZW5ndGhzIFswXSApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgZXJyb3IgPSBUMV9BZGRfVGFibGUoIGNvZGVfdGFibGUsIG4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcF90YWJsZS0+ZWxlbWVudHNbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcF90YWJsZS0+bGVuZ3RocyBbMV0gKTsKLSAgICAgIGlmICggZXJyb3IgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIC8qIHdlIGFkZGVkIGEgZ2x5cGguICovCi0gICAgICBsb2FkZXItPm51bV9nbHlwaHMgKz0gMTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci0KLSAgRmFpbDoKLSAgICBwYXJzZXItPnJvb3QuZXJyb3IgPSBlcnJvcjsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBEZWZpbmUgdGhlIHRva2VuIGZpZWxkIHN0YXRpYyB2YXJpYWJsZXMuICBUaGlzIGlzIGEgc2V0IG9mICAgICAgICAgICAgKi8KLSAgLyogVDFfRmllbGRSZWMgdmFyaWFibGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIHN0YXRpYwotICBjb25zdCBUMV9GaWVsZFJlYyAgdDFfa2V5d29yZHNbXSA9Ci0gIHsKLQotI2luY2x1ZGUgInQxdG9rZW5zLmgiCi0KLSAgICAvKiBub3cgYWRkIHRoZSBzcGVjaWFsIGZ1bmN0aW9ucy4uLiAqLwotICAgIFQxX0ZJRUxEX0NBTExCQUNLKCAiRm9udE1hdHJpeCIsICAgICAgICAgICB0MV9wYXJzZV9mb250X21hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9GT05URElDVCApCi0gICAgVDFfRklFTERfQ0FMTEJBQ0soICJFbmNvZGluZyIsICAgICAgICAgICAgIHBhcnNlX2VuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX0ZPTlRESUNUICkKLSAgICBUMV9GSUVMRF9DQUxMQkFDSyggIlN1YnJzIiwgICAgICAgICAgICAgICAgcGFyc2Vfc3VicnMsCi0gICAgICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfUFJJVkFURSApCi0gICAgVDFfRklFTERfQ0FMTEJBQ0soICJDaGFyU3RyaW5ncyIsICAgICAgICAgIHBhcnNlX2NoYXJzdHJpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX1BSSVZBVEUgKQotICAgIFQxX0ZJRUxEX0NBTExCQUNLKCAiUHJpdmF0ZSIsICAgICAgICAgICAgICBwYXJzZV9wcml2YXRlLAotICAgICAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX0ZPTlRESUNUICkKLQotI2lmbmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX01NX1NVUFBPUlQKLSAgICBUMV9GSUVMRF9DQUxMQkFDSyggIkJsZW5kRGVzaWduUG9zaXRpb25zIiwgcGFyc2VfYmxlbmRfZGVzaWduX3Bvc2l0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9GT05URElDVCApCi0gICAgVDFfRklFTERfQ0FMTEJBQ0soICJCbGVuZERlc2lnbk1hcCIsICAgICAgIHBhcnNlX2JsZW5kX2Rlc2lnbl9tYXAsCi0gICAgICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfRk9OVERJQ1QgKQotICAgIFQxX0ZJRUxEX0NBTExCQUNLKCAiQmxlbmRBeGlzVHlwZXMiLCAgICAgICBwYXJzZV9ibGVuZF9heGlzX3R5cGVzLAotICAgICAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX0ZPTlRESUNUICkKLSAgICBUMV9GSUVMRF9DQUxMQkFDSyggIldlaWdodFZlY3RvciIsICAgICAgICAgcGFyc2Vfd2VpZ2h0X3ZlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9GT05URElDVCApCi0gICAgVDFfRklFTERfQ0FMTEJBQ0soICJCdWlsZENoYXJBcnJheSIsICAgICAgIHBhcnNlX2J1aWxkY2hhciwKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9QUklWQVRFICkKLSNlbmRpZgotCi0gICAgeyAwLCBUMV9GSUVMRF9MT0NBVElPTl9DSURfSU5GTywgVDFfRklFTERfVFlQRV9OT05FLCAwLCAwLCAwLCAwLCAwLCAwIH0KLSAgfTsKLQotCi0gIHN0YXRpYyBGVF9FcnJvcgotICBwYXJzZV9kaWN0KCBUMV9GYWNlICAgIGZhY2UsCi0gICAgICAgICAgICAgIFQxX0xvYWRlciAgbG9hZGVyLAotICAgICAgICAgICAgICBGVF9CeXRlKiAgIGJhc2UsCi0gICAgICAgICAgICAgIEZUX1VMb25nICAgc2l6ZSApCi0gIHsKLSAgICBUMV9QYXJzZXIgIHBhcnNlciA9ICZsb2FkZXItPnBhcnNlcjsKLSAgICBGVF9CeXRlICAgKmxpbWl0LCAqc3RhcnRfYmluYXJ5ID0gTlVMTDsKLSAgICBGVF9Cb29sICAgIGhhdmVfaW50ZWdlciA9IDA7Ci0KLQotICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgPSBiYXNlOwotICAgIHBhcnNlci0+cm9vdC5saW1pdCAgPSBiYXNlICsgc2l6ZTsKLSAgICBwYXJzZXItPnJvb3QuZXJyb3IgID0gRlRfRXJyX09rOwotCi0gICAgbGltaXQgPSBwYXJzZXItPnJvb3QubGltaXQ7Ci0KLSAgICBUMV9Ta2lwX1NwYWNlcyggcGFyc2VyICk7Ci0KLSAgICB3aGlsZSAoIHBhcnNlci0+cm9vdC5jdXJzb3IgPCBsaW1pdCApCi0gICAgewotICAgICAgRlRfQnl0ZSogIGN1cjsKLQotCi0gICAgICBjdXIgPSBwYXJzZXItPnJvb3QuY3Vyc29yOwotCi0gICAgICAvKiBsb29rIGZvciBgZWV4ZWMnICovCi0gICAgICBpZiAoIElTX1BTX1RPS0VOKCBjdXIsIGxpbWl0LCAiZWV4ZWMiICkgKQotICAgICAgICBicmVhazsKLQotICAgICAgLyogbG9vayBmb3IgYGNsb3NlZmlsZScgd2hpY2ggZW5kcyB0aGUgZWV4ZWMgc2VjdGlvbiAqLwotICAgICAgZWxzZSBpZiAoIElTX1BTX1RPS0VOKCBjdXIsIGxpbWl0LCAiY2xvc2VmaWxlIiApICkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIGluIGEgc3ludGhldGljIGZvbnQgdGhlIGJhc2UgZm9udCBzdGFydHMgYWZ0ZXIgYSAgICAgICAgICAgKi8KLSAgICAgIC8qIGBGb250RGljdGlvbmFyeScgdG9rZW4gdGhhdCBpcyBwbGFjZWQgYWZ0ZXIgYSBQcml2YXRlIGRpY3QgKi8KLSAgICAgIGVsc2UgaWYgKCBJU19QU19UT0tFTiggY3VyLCBsaW1pdCwgIkZvbnREaXJlY3RvcnkiICkgKQotICAgICAgewotICAgICAgICBpZiAoIGxvYWRlci0+a2V5d29yZHNfZW5jb3VudGVyZWQgJiBUMV9QUklWQVRFICkKLSAgICAgICAgICBsb2FkZXItPmtleXdvcmRzX2VuY291bnRlcmVkIHw9Ci0gICAgICAgICAgICBUMV9GT05URElSX0FGVEVSX1BSSVZBVEU7Ci0gICAgICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgKz0gMTM7Ci0gICAgICB9Ci0KLSAgICAgIC8qIGNoZWNrIHdoZXRoZXIgd2UgaGF2ZSBhbiBpbnRlZ2VyICovCi0gICAgICBlbHNlIGlmICggZnRfaXNkaWdpdCggKmN1ciApICkKLSAgICAgIHsKLSAgICAgICAgc3RhcnRfYmluYXJ5ID0gY3VyOwotICAgICAgICBUMV9Ta2lwX1BTX1Rva2VuKCBwYXJzZXIgKTsKLSAgICAgICAgaWYgKCBwYXJzZXItPnJvb3QuZXJyb3IgKQotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgaGF2ZV9pbnRlZ2VyID0gMTsKLSAgICAgIH0KLQotICAgICAgLyogaW4gdmFsaWQgVHlwZSAxIGZvbnRzIHdlIGRvbid0IHNlZSBgUkQnIG9yIGAtfCcgZGlyZWN0bHkgKi8KLSAgICAgIC8qIHNpbmNlIHRob3NlIHRva2VucyBhcmUgaGFuZGxlZCBieSBwYXJzZV9zdWJycyBhbmQgICAgICAgICovCi0gICAgICAvKiBwYXJzZV9jaGFyc3RyaW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgZWxzZSBpZiAoICpjdXIgPT0gJ1InICYmIGN1ciArIDYgPCBsaW1pdCAmJiAqKGN1ciArIDEpID09ICdEJyAmJgotICAgICAgICAgICAgICAgIGhhdmVfaW50ZWdlciApCi0gICAgICB7Ci0gICAgICAgIEZUX1VMb25nICBzOwotICAgICAgICBGVF9CeXRlKiAgYjsKLQotCi0gICAgICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgPSBzdGFydF9iaW5hcnk7Ci0gICAgICAgIGlmICggIXJlYWRfYmluYXJ5X2RhdGEoIHBhcnNlciwgJnMsICZiLCBJU19JTkNSRU1FTlRBTCApICkKLSAgICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgaGF2ZV9pbnRlZ2VyID0gMDsKLSAgICAgIH0KLQotICAgICAgZWxzZSBpZiAoICpjdXIgPT0gJy0nICYmIGN1ciArIDYgPCBsaW1pdCAmJiAqKGN1ciArIDEpID09ICd8JyAmJgotICAgICAgICAgICAgICAgIGhhdmVfaW50ZWdlciApCi0gICAgICB7Ci0gICAgICAgIEZUX1VMb25nICBzOwotICAgICAgICBGVF9CeXRlKiAgYjsKLQotCi0gICAgICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgPSBzdGFydF9iaW5hcnk7Ci0gICAgICAgIGlmICggIXJlYWRfYmluYXJ5X2RhdGEoIHBhcnNlciwgJnMsICZiLCBJU19JTkNSRU1FTlRBTCApICkKLSAgICAgICAgICByZXR1cm4gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgaGF2ZV9pbnRlZ2VyID0gMDsKLSAgICAgIH0KLQotICAgICAgLyogbG9vayBmb3IgaW1tZWRpYXRlcyAqLwotICAgICAgZWxzZSBpZiAoICpjdXIgPT0gJy8nICYmIGN1ciArIDIgPCBsaW1pdCApCi0gICAgICB7Ci0gICAgICAgIEZUX1VJbnQgIGxlbjsKLQotCi0gICAgICAgIGN1cisrOwotCi0gICAgICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgPSBjdXI7Ci0gICAgICAgIFQxX1NraXBfUFNfVG9rZW4oIHBhcnNlciApOwotICAgICAgICBpZiAoIHBhcnNlci0+cm9vdC5lcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotCi0gICAgICAgIGxlbiA9IChGVF9VSW50KSggcGFyc2VyLT5yb290LmN1cnNvciAtIGN1ciApOwotCi0gICAgICAgIGlmICggbGVuID4gMCAmJiBsZW4gPCAyMiAmJiBwYXJzZXItPnJvb3QuY3Vyc29yIDwgbGltaXQgKQotICAgICAgICB7Ci0gICAgICAgICAgLyogbm93IGNvbXBhcmUgdGhlIGltbWVkaWF0ZSBuYW1lIHRvIHRoZSBrZXl3b3JkIHRhYmxlICovCi0gICAgICAgICAgVDFfRmllbGQgIGtleXdvcmQgPSAoVDFfRmllbGQpdDFfa2V5d29yZHM7Ci0KLQotICAgICAgICAgIGZvciAoOzspCi0gICAgICAgICAgewotICAgICAgICAgICAgRlRfQnl0ZSogIG5hbWU7Ci0KLQotICAgICAgICAgICAgbmFtZSA9IChGVF9CeXRlKilrZXl3b3JkLT5pZGVudDsKLSAgICAgICAgICAgIGlmICggIW5hbWUgKQotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgaWYgKCBjdXJbMF0gPT0gbmFtZVswXSAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgICAgICAgICBsZW4gPT0gZnRfc3RybGVuKCAoY29uc3QgY2hhciAqKW5hbWUgKSAmJgotICAgICAgICAgICAgICAgICBmdF9tZW1jbXAoIGN1ciwgbmFtZSwgbGVuICkgPT0gMCAgICAgICApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIFdlIGZvdW5kIGl0IC0tIHJ1biB0aGUgcGFyc2luZyBjYWxsYmFjayEgICAgICovCi0gICAgICAgICAgICAgIC8qIFdlIHJlY29yZCBldmVyeSBpbnN0YW5jZSBvZiBldmVyeSBmaWVsZCAgICAgICovCi0gICAgICAgICAgICAgIC8qICh1bnRpbCB3ZSByZWFjaCB0aGUgYmFzZSBmb250IG9mIGEgICAgICAgICAgICovCi0gICAgICAgICAgICAgIC8qIHN5bnRoZXRpYyBmb250KSB0byBkZWFsIGFkZXF1YXRlbHkgd2l0aCAgICAgICovCi0gICAgICAgICAgICAgIC8qIG11bHRpcGxlIG1hc3RlciBmb250czsgdGhpcyBpcyBhbHNvICAgICAgICAgICovCi0gICAgICAgICAgICAgIC8qIG5lY2Vzc2FyeSBiZWNhdXNlIGxhdGVyIFBvc3RTY3JpcHQgICAgICAgICAgICovCi0gICAgICAgICAgICAgIC8qIGRlZmluaXRpb25zIG92ZXJyaWRlIGVhcmxpZXIgb25lcy4gICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgLyogT25jZSB3ZSBlbmNvdW50ZXIgYEZvbnREaXJlY3RvcnknIGFmdGVyICAgICAgKi8KLSAgICAgICAgICAgICAgLyogYC9Qcml2YXRlJywgd2Uga25vdyB0aGF0IHRoaXMgaXMgYSBzeW50aGV0aWMgKi8KLSAgICAgICAgICAgICAgLyogZm9udDsgZXhjZXB0IGZvciBgL0NoYXJTdHJpbmdzJyB3ZSBhcmUgbm90ICAgKi8KLSAgICAgICAgICAgICAgLyogaW50ZXJlc3RlZCBpbiBhbnl0aGluZyB0aGF0IGZvbGxvd3MgdGhpcyAgICAgKi8KLSAgICAgICAgICAgICAgLyogYEZvbnREaXJlY3RvcnknLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAvKiBNTSBmb250cyBoYXZlIG1vcmUgdGhhbiBvbmUgL1ByaXZhdGUgdG9rZW4gYXQgKi8KLSAgICAgICAgICAgICAgLyogdGhlIHRvcCBsZXZlbDsgbGV0J3MgaG9wZSB0aGF0IGFsbCB0aGUganVuayAgICovCi0gICAgICAgICAgICAgIC8qIHRoYXQgZm9sbG93cyB0aGUgZmlyc3QgL1ByaXZhdGUgdG9rZW4gaXMgbm90ICAqLwotICAgICAgICAgICAgICAvKiBpbnRlcmVzdGluZyB0byB1cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAvKiBBY2NvcmRpbmcgdG8gQWRvYmUgVGVjaCBOb3RlICM1MTc1IChDSUQtS2V5ZWQgKi8KLSAgICAgICAgICAgICAgLyogRm9udCBJbnN0YWxsYXRpb24gZm9yIEFUTSBTb2Z0d2FyZSkgYSBgYmVnaW4nICovCi0gICAgICAgICAgICAgIC8qIG11c3QgYmUgZm9sbG93ZWQgYnkgZXhhY3RseSBvbmUgYGVuZCcsIGFuZCAgICAqLwotICAgICAgICAgICAgICAvKiBgYmVnaW4nIC0tIGBlbmQnIHBhaXJzIG11c3QgYmUgYWNjdXJhdGVseSAgICAgKi8KLSAgICAgICAgICAgICAgLyogcGFpcmVkLiAgV2UgY291bGQgdXNlIHRoaXMgdG8gZGlzdGluZ3Vpc2ggICAgICovCi0gICAgICAgICAgICAgIC8qIGJldHdlZW4gdGhlIGdsb2JhbCBQcml2YXRlIGFuZCB0aGUgUHJpdmF0ZSAgICAqLwotICAgICAgICAgICAgICAvKiBkaWN0IHRoYXQgaXMgYSBtZW1iZXIgb2YgdGhlIEJsZW5kIGRpY3QuICAgICAgKi8KLQotICAgICAgICAgICAgICBjb25zdCBGVF9VSW50IGRpY3QgPQotICAgICAgICAgICAgICAgICggbG9hZGVyLT5rZXl3b3Jkc19lbmNvdW50ZXJlZCAmIFQxX1BSSVZBVEUgKQotICAgICAgICAgICAgICAgICAgICA/IFQxX0ZJRUxEX0RJQ1RfUFJJVkFURQotICAgICAgICAgICAgICAgICAgICA6IFQxX0ZJRUxEX0RJQ1RfRk9OVERJQ1Q7Ci0KLSAgICAgICAgICAgICAgaWYgKCAhKCBkaWN0ICYga2V5d29yZC0+ZGljdCApICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEZUX1RSQUNFMSgoICJwYXJzZV9kaWN0OiBmb3VuZCBgJXMnIGJ1dCBpZ25vcmluZyBpdCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHNpbmNlIGl0IGlzIGluIHRoZSB3cm9uZyBkaWN0aW9uYXJ5XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQtPmlkZW50ICkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgaWYgKCAhKCBsb2FkZXItPmtleXdvcmRzX2VuY291bnRlcmVkICYKLSAgICAgICAgICAgICAgICAgICAgICBUMV9GT05URElSX0FGVEVSX1BSSVZBVEUgICAgICkgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICAgIGZ0X3N0cmNtcCggKGNvbnN0IGNoYXIqKW5hbWUsICJDaGFyU3RyaW5ncyIgKSA9PSAwICkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBhcnNlci0+cm9vdC5lcnJvciA9IHQxX2xvYWRfa2V5d29yZCggZmFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXdvcmQgKTsKLSAgICAgICAgICAgICAgICBpZiAoIHBhcnNlci0+cm9vdC5lcnJvciAhPSBGVF9FcnJfT2sgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlmICggRlRfRVJSX0VRKCBwYXJzZXItPnJvb3QuZXJyb3IsIElnbm9yZSApICkKLSAgICAgICAgICAgICAgICAgICAgcGFyc2VyLT5yb290LmVycm9yID0gRlRfRXJyX09rOwotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VyLT5yb290LmVycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAga2V5d29yZCsrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGhhdmVfaW50ZWdlciA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFQxX1NraXBfUFNfVG9rZW4oIHBhcnNlciApOwotICAgICAgICBpZiAoIHBhcnNlci0+cm9vdC5lcnJvciApCi0gICAgICAgICAgZ290byBFeGl0OwotICAgICAgICBoYXZlX2ludGVnZXIgPSAwOwotICAgICAgfQotCi0gICAgICBUMV9Ta2lwX1NwYWNlcyggcGFyc2VyICk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIHBhcnNlci0+cm9vdC5lcnJvcjsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgdDFfaW5pdF9sb2FkZXIoIFQxX0xvYWRlciAgbG9hZGVyLAotICAgICAgICAgICAgICAgICAgVDFfRmFjZSAgICBmYWNlICkKLSAgewotICAgIEZUX1VOVVNFRCggZmFjZSApOwotCi0gICAgRlRfTUVNX1pFUk8oIGxvYWRlciwgc2l6ZW9mICggKmxvYWRlciApICk7Ci0gICAgbG9hZGVyLT5udW1fZ2x5cGhzID0gMDsKLSAgICBsb2FkZXItPm51bV9jaGFycyAgPSAwOwotCi0gICAgLyogaW5pdGlhbGl6ZSB0aGUgdGFibGVzIC0tIHNpbXBseSBzZXQgdGhlaXIgYGluaXQnIGZpZWxkIHRvIDAgKi8KLSAgICBsb2FkZXItPmVuY29kaW5nX3RhYmxlLmluaXQgID0gMDsKLSAgICBsb2FkZXItPmNoYXJzdHJpbmdzLmluaXQgICAgID0gMDsKLSAgICBsb2FkZXItPmdseXBoX25hbWVzLmluaXQgICAgID0gMDsKLSAgICBsb2FkZXItPnN1YnJzLmluaXQgICAgICAgICAgID0gMDsKLSAgICBsb2FkZXItPnN3YXBfdGFibGUuaW5pdCAgICAgID0gMDsKLSAgICBsb2FkZXItPmZvbnRkYXRhICAgICAgICAgICAgID0gMDsKLSAgICBsb2FkZXItPmtleXdvcmRzX2VuY291bnRlcmVkID0gMDsKLSAgfQotCi0KLSAgc3RhdGljIHZvaWQKLSAgdDFfZG9uZV9sb2FkZXIoIFQxX0xvYWRlciAgbG9hZGVyICkKLSAgewotICAgIFQxX1BhcnNlciAgcGFyc2VyID0gJmxvYWRlci0+cGFyc2VyOwotCi0KLSAgICAvKiBmaW5hbGl6ZSB0YWJsZXMgKi8KLSAgICBUMV9SZWxlYXNlX1RhYmxlKCAmbG9hZGVyLT5lbmNvZGluZ190YWJsZSApOwotICAgIFQxX1JlbGVhc2VfVGFibGUoICZsb2FkZXItPmNoYXJzdHJpbmdzICk7Ci0gICAgVDFfUmVsZWFzZV9UYWJsZSggJmxvYWRlci0+Z2x5cGhfbmFtZXMgKTsKLSAgICBUMV9SZWxlYXNlX1RhYmxlKCAmbG9hZGVyLT5zd2FwX3RhYmxlICk7Ci0gICAgVDFfUmVsZWFzZV9UYWJsZSggJmxvYWRlci0+c3VicnMgKTsKLQotICAgIC8qIGZpbmFsaXplIHBhcnNlciAqLwotICAgIFQxX0ZpbmFsaXplX1BhcnNlciggcGFyc2VyICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUMV9PcGVuX0ZhY2UoIFQxX0ZhY2UgIGZhY2UgKQotICB7Ci0gICAgVDFfTG9hZGVyUmVjICAgbG9hZGVyOwotICAgIFQxX1BhcnNlciAgICAgIHBhcnNlcjsKLSAgICBUMV9Gb250ICAgICAgICB0eXBlMSA9ICZmYWNlLT50eXBlMTsKLSAgICBQU19Qcml2YXRlICAgICBwcml2ICA9ICZ0eXBlMS0+cHJpdmF0ZV9kaWN0OwotICAgIEZUX0Vycm9yICAgICAgIGVycm9yOwotCi0gICAgUFNBdXhfU2VydmljZSAgcHNhdXggPSAoUFNBdXhfU2VydmljZSlmYWNlLT5wc2F1eDsKLQotCi0gICAgdDFfaW5pdF9sb2FkZXIoICZsb2FkZXIsIGZhY2UgKTsKLQotICAgIC8qIGRlZmF1bHQgdmFsdWVzICovCi0gICAgZmFjZS0+bmR2X2lkeCAgICAgICAgICA9IC0xOwotICAgIGZhY2UtPmNkdl9pZHggICAgICAgICAgPSAtMTsKLSAgICBmYWNlLT5sZW5fYnVpbGRjaGFyICAgID0gMDsKLQotICAgIHByaXYtPmJsdWVfc2hpZnQgICAgICAgPSA3OwotICAgIHByaXYtPmJsdWVfZnV6eiAgICAgICAgPSAxOwotICAgIHByaXYtPmxlbklWICAgICAgICAgICAgPSA0OwotICAgIHByaXYtPmV4cGFuc2lvbl9mYWN0b3IgPSAoRlRfRml4ZWQpKCAwLjA2ICogMHgxMDAwMEwgKTsKLSAgICBwcml2LT5ibHVlX3NjYWxlICAgICAgID0gKEZUX0ZpeGVkKSggMC4wMzk2MjUgKiAweDEwMDAwTCAqIDEwMDAgKTsKLQotICAgIHBhcnNlciA9ICZsb2FkZXIucGFyc2VyOwotICAgIGVycm9yICA9IFQxX05ld19QYXJzZXIoIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5yb290LnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNlLT5yb290Lm1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc2F1eCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZXJyb3IgPSBwYXJzZV9kaWN0KCBmYWNlLCAmbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLT5iYXNlX2RpY3QsIHBhcnNlci0+YmFzZV9sZW4gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGVycm9yID0gVDFfR2V0X1ByaXZhdGVfRGljdCggcGFyc2VyLCBwc2F1eCApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgZXJyb3IgPSBwYXJzZV9kaWN0KCBmYWNlLCAmbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLT5wcml2YXRlX2RpY3QsIHBhcnNlci0+cHJpdmF0ZV9sZW4gKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGVuc3VyZSBldmVuLW5lc3Mgb2YgYG51bV9ibHVlX3ZhbHVlcycgKi8KLSAgICBwcml2LT5udW1fYmx1ZV92YWx1ZXMgJj0gfjE7Ci0KLSNpZm5kZWYgVDFfQ09ORklHX09QVElPTl9OT19NTV9TVVBQT1JUCi0KLSAgICBpZiAoIGZhY2UtPmJsZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJgotICAgICAgICAgZmFjZS0+YmxlbmQtPm51bV9kZWZhdWx0X2Rlc2lnbl92ZWN0b3IgIT0gMCAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICBmYWNlLT5ibGVuZC0+bnVtX2RlZmF1bHRfZGVzaWduX3ZlY3RvciAhPSBmYWNlLT5ibGVuZC0+bnVtX2F4aXMgKQotICAgIHsKLSAgICAgIC8qIHdlIGRvbid0IHVzZSBpdCBjdXJyZW50bHkgc28ganVzdCB3YXJuLCByZXNldCwgYW5kIGlnbm9yZSAqLwotICAgICAgRlRfRVJST1IoKCAiVDFfT3Blbl9GYWNlKCk6IC9EZXNpZ25WZWN0b3IgY29udGFpbnMgJXUgZW50cmllcyAiCi0gICAgICAgICAgICAgICAgICJ3aGlsZSB0aGVyZSBhcmUgJXUgYXhlcy5cbiIsCi0gICAgICAgICAgICAgICAgIGZhY2UtPmJsZW5kLT5udW1fZGVmYXVsdF9kZXNpZ25fdmVjdG9yLAotICAgICAgICAgICAgICAgICBmYWNlLT5ibGVuZC0+bnVtX2F4aXMgKSk7Ci0KLSAgICAgIGZhY2UtPmJsZW5kLT5udW1fZGVmYXVsdF9kZXNpZ25fdmVjdG9yID0gMDsKLSAgICB9Ci0KLSAgICAvKiB0aGUgZm9sbG93aW5nIGNhbiBoYXBwZW4gZm9yIE1NIGluc3RhbmNlczsgd2UgdGhlbiB0cmVhdCB0aGUgKi8KLSAgICAvKiBmb250IGFzIGEgbm9ybWFsIFBTIGZvbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAoIGZhY2UtPmJsZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICggIWZhY2UtPmJsZW5kLT5udW1fZGVzaWducyB8fCAhZmFjZS0+YmxlbmQtPm51bV9heGlzICkgKQotICAgICAgVDFfRG9uZV9CbGVuZCggZmFjZSApOwotCi0gICAgLyogYW5vdGhlciBzYWZldHkgY2hlY2sgKi8KLSAgICBpZiAoIGZhY2UtPmJsZW5kICkKLSAgICB7Ci0gICAgICBGVF9VSW50ICBpOwotCi0KLSAgICAgIGZvciAoIGkgPSAwOyBpIDwgZmFjZS0+YmxlbmQtPm51bV9heGlzOyBpKysgKQotICAgICAgICBpZiAoICFmYWNlLT5ibGVuZC0+ZGVzaWduX21hcFtpXS5udW1fcG9pbnRzICkKLSAgICAgICAgewotICAgICAgICAgIFQxX0RvbmVfQmxlbmQoIGZhY2UgKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICggZmFjZS0+YmxlbmQgKQotICAgIHsKLSAgICAgIGlmICggZmFjZS0+bGVuX2J1aWxkY2hhciA+IDAgKQotICAgICAgewotICAgICAgICBGVF9NZW1vcnkgIG1lbW9yeSA9IGZhY2UtPnJvb3QubWVtb3J5OwotCi0KLSAgICAgICAgaWYgKCBGVF9ORVdfQVJSQVkoIGZhY2UtPmJ1aWxkY2hhciwgZmFjZS0+bGVuX2J1aWxkY2hhciApICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0VSUk9SKCggIlQxX09wZW5fRmFjZTogY2Fubm90IGFsbG9jYXRlIEJ1aWxkQ2hhckFycmF5XG4iICkpOwotICAgICAgICAgIGZhY2UtPmxlbl9idWlsZGNoYXIgPSAwOwotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgICBmYWNlLT5sZW5fYnVpbGRjaGFyID0gMDsKLQotI2VuZGlmIC8qICFUMV9DT05GSUdfT1BUSU9OX05PX01NX1NVUFBPUlQgKi8KLQotICAgIC8qIG5vdywgcHJvcGFnYXRlIHRoZSBzdWJycywgY2hhcnN0cmluZ3MsIGFuZCBnbHlwaG5hbWVzIHRhYmxlcyAqLwotICAgIC8qIHRvIHRoZSBUeXBlMSBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIHR5cGUxLT5udW1fZ2x5cGhzID0gbG9hZGVyLm51bV9nbHlwaHM7Ci0KLSAgICBpZiAoIGxvYWRlci5zdWJycy5pbml0ICkKLSAgICB7Ci0gICAgICBsb2FkZXIuc3VicnMuaW5pdCAgPSAwOwotICAgICAgdHlwZTEtPm51bV9zdWJycyAgID0gbG9hZGVyLm51bV9zdWJyczsKLSAgICAgIHR5cGUxLT5zdWJyc19ibG9jayA9IGxvYWRlci5zdWJycy5ibG9jazsKLSAgICAgIHR5cGUxLT5zdWJycyAgICAgICA9IGxvYWRlci5zdWJycy5lbGVtZW50czsKLSAgICAgIHR5cGUxLT5zdWJyc19sZW4gICA9IGxvYWRlci5zdWJycy5sZW5ndGhzOwotICAgIH0KLQotICAgIGlmICggIUlTX0lOQ1JFTUVOVEFMICkKLSAgICAgIGlmICggIWxvYWRlci5jaGFyc3RyaW5ncy5pbml0ICkKLSAgICAgIHsKLSAgICAgICAgRlRfRVJST1IoKCAiVDFfT3Blbl9GYWNlOiBubyBgL0NoYXJTdHJpbmdzJyBhcnJheSBpbiBmYWNlXG4iICkpOwotICAgICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICB9Ci0KLSAgICBsb2FkZXIuY2hhcnN0cmluZ3MuaW5pdCAgPSAwOwotICAgIHR5cGUxLT5jaGFyc3RyaW5nc19ibG9jayA9IGxvYWRlci5jaGFyc3RyaW5ncy5ibG9jazsKLSAgICB0eXBlMS0+Y2hhcnN0cmluZ3MgICAgICAgPSBsb2FkZXIuY2hhcnN0cmluZ3MuZWxlbWVudHM7Ci0gICAgdHlwZTEtPmNoYXJzdHJpbmdzX2xlbiAgID0gbG9hZGVyLmNoYXJzdHJpbmdzLmxlbmd0aHM7Ci0KLSAgICAvKiB3ZSBjb3B5IHRoZSBnbHlwaCBuYW1lcyBgYmxvY2snIGFuZCBgZWxlbWVudHMnIGZpZWxkczsgKi8KLSAgICAvKiB0aGUgYGxlbmd0aHMnIGZpZWxkIG11c3QgYmUgcmVsZWFzZWQgbGF0ZXIgICAgICAgICAgICAgKi8KLSAgICB0eXBlMS0+Z2x5cGhfbmFtZXNfYmxvY2sgICAgPSBsb2FkZXIuZ2x5cGhfbmFtZXMuYmxvY2s7Ci0gICAgdHlwZTEtPmdseXBoX25hbWVzICAgICAgICAgID0gKEZUX1N0cmluZyoqKWxvYWRlci5nbHlwaF9uYW1lcy5lbGVtZW50czsKLSAgICBsb2FkZXIuZ2x5cGhfbmFtZXMuYmxvY2sgICAgPSBOVUxMOwotICAgIGxvYWRlci5nbHlwaF9uYW1lcy5lbGVtZW50cyA9IE5VTEw7Ci0KLSAgICAvKiB3ZSBtdXN0IG5vdyBidWlsZCB0eXBlMS5lbmNvZGluZyB3aGVuIHdlIGhhdmUgYSBjdXN0b20gYXJyYXkgKi8KLSAgICBpZiAoIHR5cGUxLT5lbmNvZGluZ190eXBlID09IFQxX0VOQ09ESU5HX1RZUEVfQVJSQVkgKQotICAgIHsKLSAgICAgIEZUX0ludCAgICBjaGFyY29kZSwgaWR4LCBtaW5fY2hhciwgbWF4X2NoYXI7Ci0gICAgICBGVF9CeXRlKiAgZ2x5cGhfbmFtZTsKLQotCi0gICAgICAvKiBPSywgd2UgZG8gdGhlIGZvbGxvd2luZzogZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgZW5jb2RpbmcgICovCi0gICAgICAvKiB0YWJsZSwgbG9vayB1cCB0aGUgaW5kZXggb2YgdGhlIGdseXBoIGhhdmluZyB0aGUgc2FtZSBuYW1lICovCi0gICAgICAvKiB0aGUgaW5kZXggaXMgdGhlbiBzdG9yZWQgaW4gdHlwZTEuZW5jb2RpbmcuY2hhcl9pbmRleCwgYW5kICovCi0gICAgICAvKiB0aGUgbmFtZSB0byB0eXBlMS5lbmNvZGluZy5jaGFyX25hbWUgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAgIG1pbl9jaGFyID0gMDsKLSAgICAgIG1heF9jaGFyID0gMDsKLQotICAgICAgY2hhcmNvZGUgPSAwOwotICAgICAgZm9yICggOyBjaGFyY29kZSA8IGxvYWRlci5lbmNvZGluZ190YWJsZS5tYXhfZWxlbXM7IGNoYXJjb2RlKysgKQotICAgICAgewotICAgICAgICBGVF9CeXRlKiAgY2hhcl9uYW1lOwotCi0KLSAgICAgICAgdHlwZTEtPmVuY29kaW5nLmNoYXJfaW5kZXhbY2hhcmNvZGVdID0gMDsKLSAgICAgICAgdHlwZTEtPmVuY29kaW5nLmNoYXJfbmFtZSBbY2hhcmNvZGVdID0gKGNoYXIgKikiLm5vdGRlZiI7Ci0KLSAgICAgICAgY2hhcl9uYW1lID0gbG9hZGVyLmVuY29kaW5nX3RhYmxlLmVsZW1lbnRzW2NoYXJjb2RlXTsKLSAgICAgICAgaWYgKCBjaGFyX25hbWUgKQotICAgICAgICAgIGZvciAoIGlkeCA9IDA7IGlkeCA8IHR5cGUxLT5udW1fZ2x5cGhzOyBpZHgrKyApCi0gICAgICAgICAgewotICAgICAgICAgICAgZ2x5cGhfbmFtZSA9IChGVF9CeXRlKil0eXBlMS0+Z2x5cGhfbmFtZXNbaWR4XTsKLSAgICAgICAgICAgIGlmICggZnRfc3RyY21wKCAoY29uc3QgY2hhciopY2hhcl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKilnbHlwaF9uYW1lICkgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHR5cGUxLT5lbmNvZGluZy5jaGFyX2luZGV4W2NoYXJjb2RlXSA9IChGVF9VU2hvcnQpaWR4OwotICAgICAgICAgICAgICB0eXBlMS0+ZW5jb2RpbmcuY2hhcl9uYW1lIFtjaGFyY29kZV0gPSAoY2hhciopZ2x5cGhfbmFtZTsKLQotICAgICAgICAgICAgICAvKiBDaGFuZ2UgbWluL21heCBlbmNvZGVkIGNoYXIgb25seSBpZiBnbHlwaCBuYW1lIGlzICovCi0gICAgICAgICAgICAgIC8qIG5vdCAvLm5vdGRlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgaWYgKCBmdF9zdHJjbXAoIChjb25zdCBjaGFyKikiLm5vdGRlZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopZ2x5cGhfbmFtZSApICE9IDAgKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCBjaGFyY29kZSA8IG1pbl9jaGFyICkKLSAgICAgICAgICAgICAgICAgIG1pbl9jaGFyID0gY2hhcmNvZGU7Ci0gICAgICAgICAgICAgICAgaWYgKCBjaGFyY29kZSA+PSBtYXhfY2hhciApCi0gICAgICAgICAgICAgICAgICBtYXhfY2hhciA9IGNoYXJjb2RlICsgMTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHR5cGUxLT5lbmNvZGluZy5jb2RlX2ZpcnN0ID0gbWluX2NoYXI7Ci0gICAgICB0eXBlMS0+ZW5jb2RpbmcuY29kZV9sYXN0ICA9IG1heF9jaGFyOwotICAgICAgdHlwZTEtPmVuY29kaW5nLm51bV9jaGFycyAgPSBsb2FkZXIubnVtX2NoYXJzOwotICAgIH0KLQotICBFeGl0OgotICAgIHQxX2RvbmVfbG9hZGVyKCAmbG9hZGVyICk7Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFsb2FkLmggYi90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFsb2FkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNDIyZTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxbG9hZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxbG9hZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDEgZm9udCBsb2FkZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1QxTE9BRF9IX18KLSNkZWZpbmUgX19UMUxPQURfSF9fCi0KLQotI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+Ci0jaW5jbHVkZSBGVF9JTlRFUk5BTF9TVFJFQU1fSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAotI2luY2x1ZGUgRlRfTVVMVElQTEVfTUFTVEVSU19ICi0KLSNpbmNsdWRlICJ0MXBhcnNlLmgiCi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICB0eXBlZGVmIHN0cnVjdCAgVDFfTG9hZGVyXwotICB7Ci0gICAgVDFfUGFyc2VyUmVjICBwYXJzZXI7ICAgICAgICAgIC8qIHBhcnNlciB1c2VkIHRvIHJlYWQgdGhlIHN0cmVhbSAqLwotCi0gICAgRlRfSW50ICAgICAgICBudW1fY2hhcnM7ICAgICAgIC8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIGVuY29kaW5nICovCi0gICAgUFNfVGFibGVSZWMgICBlbmNvZGluZ190YWJsZTsgIC8qIFBTX1RhYmxlIHVzZWQgdG8gc3RvcmUgdGhlICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuY29kaW5nIGNoYXJhY3RlciBuYW1lcyAgICAgICAgICovCi0KLSAgICBGVF9JbnQgICAgICAgIG51bV9nbHlwaHM7Ci0gICAgUFNfVGFibGVSZWMgICBnbHlwaF9uYW1lczsKLSAgICBQU19UYWJsZVJlYyAgIGNoYXJzdHJpbmdzOwotICAgIFBTX1RhYmxlUmVjICAgc3dhcF90YWJsZTsgICAgICAvKiBGb3IgbW92aW5nIC5ub3RkZWYgZ2x5cGggdG8gaW5kZXggMC4gKi8KLQotICAgIEZUX0ludCAgICAgICAgbnVtX3N1YnJzOwotICAgIFBTX1RhYmxlUmVjICAgc3VicnM7Ci0gICAgRlRfQm9vbCAgICAgICBmb250ZGF0YTsKLQotICAgIEZUX1VJbnQgICAgICAga2V5d29yZHNfZW5jb3VudGVyZWQ7IC8qIFQxX0xPQURFUl9FTkNPVU5URVJFRF9YWFggKi8KLQotICB9IFQxX0xvYWRlclJlYywgKlQxX0xvYWRlcjsKLQotCi0gIC8qIHRyZWF0bWVudCBvZiBzb21lIGtleXdvcmRzIGRpZmZlcnMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgKi8KLSAgLyogdGhleSBwcmVjZWRlIG9yIGZvbGxvdyBjZXJ0YWluIG90aGVyIGtleXdvcmRzICAgICAgICAgICAqLwotCi0jZGVmaW5lIFQxX1BSSVZBVEUgICAgICAgICAgICAgICAgKCAxIDw8IDAgKQotI2RlZmluZSBUMV9GT05URElSX0FGVEVSX1BSSVZBVEUgICggMSA8PCAxICkKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFQxX09wZW5fRmFjZSggVDFfRmFjZSAgZmFjZSApOwotCi0jaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fTU1fU1VQUE9SVAotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFQxX0dldF9NdWx0aV9NYXN0ZXIoIFQxX0ZhY2UgICAgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIEZUX011bHRpX01hc3RlciogIG1hc3RlciApOwotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUMV9HZXRfTU1fVmFyKCBUMV9GYWNlICAgICAgZmFjZSwKLSAgICAgICAgICAgICAgICAgRlRfTU1fVmFyKiAgKm1hc3RlciApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFQxX1NldF9NTV9CbGVuZCggVDFfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgIEZUX1VJbnQgICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICBGVF9GaXhlZCogIGNvb3JkcyApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFQxX1NldF9NTV9EZXNpZ24oIFQxX0ZhY2UgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICBGVF9VSW50ICAgbnVtX2Nvb3JkcywKLSAgICAgICAgICAgICAgICAgICAgRlRfTG9uZyogIGNvb3JkcyApOwotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUMV9TZXRfVmFyX0Rlc2lnbiggVDFfRmFjZSAgICBmYWNlLAotICAgICAgICAgICAgICAgICAgICAgRlRfVUludCAgICBudW1fY29vcmRzLAotICAgICAgICAgICAgICAgICAgICAgRlRfRml4ZWQqICBjb29yZHMgKTsKLQotICBGVF9MT0NBTCggdm9pZCApCi0gIFQxX0RvbmVfQmxlbmQoIFQxX0ZhY2UgIGZhY2UgKTsKLQotI2VuZGlmIC8qICFUMV9DT05GSUdfT1BUSU9OX05PX01NX1NVUFBPUlQgKi8KLQotCi1GVF9FTkRfSEVBREVSCi0KLSNlbmRpZiAvKiBfX1QxTE9BRF9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MW9ianMuYyBiL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MW9ianMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkyMTA2My4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFvYmpzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDFvYmpzLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFR5cGUgMSBvYmplY3RzIG1hbmFnZXIgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX0NBTENfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX1RSVUVUWVBFX0lEU19ICi0KLSNpbmNsdWRlICJ0MWdsb2FkLmgiCi0jaW5jbHVkZSAidDFsb2FkLmgiCi0KLSNpbmNsdWRlICJ0MWVycm9ycy5oIgotCi0jaWZuZGVmIFQxX0NPTkZJR19PUFRJT05fTk9fQUZNCi0jaW5jbHVkZSAidDFhZm0uaCIKLSNlbmRpZgotCi0jaW5jbHVkZSBGVF9TRVJWSUNFX1BPU1RTQ1JJUFRfQ01BUFNfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfUE9TVFNDUklQVF9BVVhfSAotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBUaGUgbWFjcm8gRlRfQ09NUE9ORU5UIGlzIHVzZWQgaW4gdHJhY2UgbW9kZS4gIEl0IGlzIGFuIGltcGxpY2l0ICAgICAgKi8KLSAgLyogcGFyYW1ldGVyIG9mIHRoZSBGVF9UUkFDRSgpIGFuZCBGVF9FUlJPUigpIG1hY3JvcywgdXNlZCB0byBwcmludC9sb2cgICovCi0gIC8qIG1lc3NhZ2VzIGR1cmluZyBleGVjdXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSN1bmRlZiAgRlRfQ09NUE9ORU5UCi0jZGVmaW5lIEZUX0NPTVBPTkVOVCAgdHJhY2VfdDFvYmpzCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJWkUgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIG5vdGUgdGhhdCB3ZSBzdG9yZSB0aGUgZ2xvYmFsIGhpbnRzIGluIHRoZSBzaXplJ3MgImludGVybmFsIiByb290ICAgICovCi0gIC8qICBmaWVsZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICBzdGF0aWMgUFNIX0dsb2JhbHNfRnVuY3MKLSAgVDFfU2l6ZV9HZXRfR2xvYmFsc19GdW5jcyggVDFfU2l6ZSAgc2l6ZSApCi0gIHsKLSAgICBUMV9GYWNlICAgICAgICAgICBmYWNlICAgICA9IChUMV9GYWNlKXNpemUtPnJvb3QuZmFjZTsKLSAgICBQU0hpbnRlcl9TZXJ2aWNlICBwc2hpbnRlciA9IChQU0hpbnRlcl9TZXJ2aWNlKWZhY2UtPnBzaGludGVyOwotICAgIEZUX01vZHVsZSAgICAgICAgIG1vZHVsZTsKLQotCi0gICAgbW9kdWxlID0gRlRfR2V0X01vZHVsZSggc2l6ZS0+cm9vdC5mYWNlLT5kcml2ZXItPnJvb3QubGlicmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHNoaW50ZXIiICk7Ci0gICAgcmV0dXJuICggbW9kdWxlICYmIHBzaGludGVyICYmIHBzaGludGVyLT5nZXRfZ2xvYmFsc19mdW5jcyApCi0gICAgICAgICAgID8gcHNoaW50ZXItPmdldF9nbG9iYWxzX2Z1bmNzKCBtb2R1bGUgKQotICAgICAgICAgICA6IDAgOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBUMV9TaXplX0RvbmUoIEZUX1NpemUgIHQxc2l6ZSApICAgICAgICAgIC8qIFQxX1NpemUgKi8KLSAgewotICAgIFQxX1NpemUgIHNpemUgPSAoVDFfU2l6ZSl0MXNpemU7Ci0KLQotICAgIGlmICggc2l6ZS0+cm9vdC5pbnRlcm5hbCApCi0gICAgewotICAgICAgUFNIX0dsb2JhbHNfRnVuY3MgIGZ1bmNzOwotCi0KLSAgICAgIGZ1bmNzID0gVDFfU2l6ZV9HZXRfR2xvYmFsc19GdW5jcyggc2l6ZSApOwotICAgICAgaWYgKCBmdW5jcyApCi0gICAgICAgIGZ1bmNzLT5kZXN0cm95KCAoUFNIX0dsb2JhbHMpc2l6ZS0+cm9vdC5pbnRlcm5hbCApOwotCi0gICAgICBzaXplLT5yb290LmludGVybmFsID0gTlVMTDsKLSAgICB9Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUMV9TaXplX0luaXQoIEZUX1NpemUgIHQxc2l6ZSApICAgICAgLyogVDFfU2l6ZSAqLwotICB7Ci0gICAgVDFfU2l6ZSAgICAgICAgICAgIHNpemUgID0gKFQxX1NpemUpdDFzaXplOwotICAgIEZUX0Vycm9yICAgICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICBQU0hfR2xvYmFsc19GdW5jcyAgZnVuY3MgPSBUMV9TaXplX0dldF9HbG9iYWxzX0Z1bmNzKCBzaXplICk7Ci0KLQotICAgIGlmICggZnVuY3MgKQotICAgIHsKLSAgICAgIFBTSF9HbG9iYWxzICBnbG9iYWxzOwotICAgICAgVDFfRmFjZSAgICAgIGZhY2UgPSAoVDFfRmFjZSlzaXplLT5yb290LmZhY2U7Ci0KLQotICAgICAgZXJyb3IgPSBmdW5jcy0+Y3JlYXRlKCBzaXplLT5yb290LmZhY2UtPm1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZhY2UtPnR5cGUxLnByaXZhdGVfZGljdCwgJmdsb2JhbHMgKTsKLSAgICAgIGlmICggIWVycm9yICkKLSAgICAgICAgc2l6ZS0+cm9vdC5pbnRlcm5hbCA9IChGVF9TaXplX0ludGVybmFsKSh2b2lkKilnbG9iYWxzOwotICAgIH0KLQotICAgIHJldHVybiBlcnJvcjsKLSAgfQotCi0KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIFQxX1NpemVfUmVxdWVzdCggRlRfU2l6ZSAgICAgICAgICB0MXNpemUsICAgICAvKiBUMV9TaXplICovCi0gICAgICAgICAgICAgICAgICAgRlRfU2l6ZV9SZXF1ZXN0ICByZXEgKQotICB7Ci0gICAgVDFfU2l6ZSAgICAgICAgICAgIHNpemUgID0gKFQxX1NpemUpdDFzaXplOwotICAgIFBTSF9HbG9iYWxzX0Z1bmNzICBmdW5jcyA9IFQxX1NpemVfR2V0X0dsb2JhbHNfRnVuY3MoIHNpemUgKTsKLQotCi0gICAgRlRfUmVxdWVzdF9NZXRyaWNzKCBzaXplLT5yb290LmZhY2UsIHJlcSApOwotCi0gICAgaWYgKCBmdW5jcyApCi0gICAgICBmdW5jcy0+c2V0X3NjYWxlKCAoUFNIX0dsb2JhbHMpc2l6ZS0+cm9vdC5pbnRlcm5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemUtPnJvb3QubWV0cmljcy54X3NjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS0+cm9vdC5tZXRyaWNzLnlfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAwLCAwICk7Ci0KLSAgICByZXR1cm4gRlRfRXJyX09rOwotICB9Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNMT1QgIEZVTkNUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgVDFfR2x5cGhTbG90X0RvbmUoIEZUX0dseXBoU2xvdCAgc2xvdCApCi0gIHsKLSAgICBzbG90LT5pbnRlcm5hbC0+Z2x5cGhfaGludHMgPSBOVUxMOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVDFfR2x5cGhTbG90X0luaXQoIEZUX0dseXBoU2xvdCAgc2xvdCApCi0gIHsKLSAgICBUMV9GYWNlICAgICAgICAgICBmYWNlOwotICAgIFBTSGludGVyX1NlcnZpY2UgIHBzaGludGVyOwotCi0KLSAgICBmYWNlICAgICA9IChUMV9GYWNlKXNsb3QtPmZhY2U7Ci0gICAgcHNoaW50ZXIgPSAoUFNIaW50ZXJfU2VydmljZSlmYWNlLT5wc2hpbnRlcjsKLQotICAgIGlmICggcHNoaW50ZXIgKQotICAgIHsKLSAgICAgIEZUX01vZHVsZSAgbW9kdWxlOwotCi0KLSAgICAgIG1vZHVsZSA9IEZUX0dldF9Nb2R1bGUoIHNsb3QtPmZhY2UtPmRyaXZlci0+cm9vdC5saWJyYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBzaGludGVyIiApOwotICAgICAgaWYgKCBtb2R1bGUgKQotICAgICAgewotICAgICAgICBUMV9IaW50c19GdW5jcyAgZnVuY3M7Ci0KLQotICAgICAgICBmdW5jcyA9IHBzaGludGVyLT5nZXRfdDFfZnVuY3MoIG1vZHVsZSApOwotICAgICAgICBzbG90LT5pbnRlcm5hbC0+Z2x5cGhfaGludHMgPSAodm9pZCopZnVuY3M7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFDRSAgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0ZhY2VfRG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmYWNlIG9iamVjdCBkZXN0cnVjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgOjogQSB0eXBlbGVzcyBwb2ludGVyIHRvIHRoZSBmYWNlIG9iamVjdCB0byBkZXN0cm95LiAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCB2b2lkICkKLSAgVDFfRmFjZV9Eb25lKCBGVF9GYWNlICB0MWZhY2UgKSAgICAgICAgIC8qIFQxX0ZhY2UgKi8KLSAgewotICAgIFQxX0ZhY2UgICAgZmFjZSA9IChUMV9GYWNlKXQxZmFjZTsKLSAgICBGVF9NZW1vcnkgIG1lbW9yeTsKLSAgICBUMV9Gb250ICAgIHR5cGUxOwotCi0KLSAgICBpZiAoICFmYWNlICkKLSAgICAgIHJldHVybjsKLQotICAgIG1lbW9yeSA9IGZhY2UtPnJvb3QubWVtb3J5OwotICAgIHR5cGUxICA9ICZmYWNlLT50eXBlMTsKLQotI2lmbmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX01NX1NVUFBPUlQKLSAgICAvKiByZWxlYXNlIG11bHRpcGxlIG1hc3RlcnMgaW5mb3JtYXRpb24gKi8KLSAgICBGVF9BU1NFUlQoICggZmFjZS0+bGVuX2J1aWxkY2hhciA9PSAwICkgPT0gKCBmYWNlLT5idWlsZGNoYXIgPT0gTlVMTCApICk7Ci0KLSAgICBpZiAoIGZhY2UtPmJ1aWxkY2hhciApCi0gICAgewotICAgICAgRlRfRlJFRSggZmFjZS0+YnVpbGRjaGFyICk7Ci0KLSAgICAgIGZhY2UtPmJ1aWxkY2hhciAgICAgPSBOVUxMOwotICAgICAgZmFjZS0+bGVuX2J1aWxkY2hhciA9IDA7Ci0gICAgfQotCi0gICAgVDFfRG9uZV9CbGVuZCggZmFjZSApOwotICAgIGZhY2UtPmJsZW5kID0gTlVMTDsKLSNlbmRpZgotCi0gICAgLyogcmVsZWFzZSBmb250IGluZm8gc3RyaW5ncyAqLwotICAgIHsKLSAgICAgIFBTX0ZvbnRJbmZvICBpbmZvID0gJnR5cGUxLT5mb250X2luZm87Ci0KLQotICAgICAgRlRfRlJFRSggaW5mby0+dmVyc2lvbiApOwotICAgICAgRlRfRlJFRSggaW5mby0+bm90aWNlICk7Ci0gICAgICBGVF9GUkVFKCBpbmZvLT5mdWxsX25hbWUgKTsKLSAgICAgIEZUX0ZSRUUoIGluZm8tPmZhbWlseV9uYW1lICk7Ci0gICAgICBGVF9GUkVFKCBpbmZvLT53ZWlnaHQgKTsKLSAgICB9Ci0KLSAgICAvKiByZWxlYXNlIHRvcCBkaWN0aW9uYXJ5ICovCi0gICAgRlRfRlJFRSggdHlwZTEtPmNoYXJzdHJpbmdzX2xlbiApOwotICAgIEZUX0ZSRUUoIHR5cGUxLT5jaGFyc3RyaW5ncyApOwotICAgIEZUX0ZSRUUoIHR5cGUxLT5nbHlwaF9uYW1lcyApOwotCi0gICAgRlRfRlJFRSggdHlwZTEtPnN1YnJzICk7Ci0gICAgRlRfRlJFRSggdHlwZTEtPnN1YnJzX2xlbiApOwotCi0gICAgRlRfRlJFRSggdHlwZTEtPnN1YnJzX2Jsb2NrICk7Ci0gICAgRlRfRlJFRSggdHlwZTEtPmNoYXJzdHJpbmdzX2Jsb2NrICk7Ci0gICAgRlRfRlJFRSggdHlwZTEtPmdseXBoX25hbWVzX2Jsb2NrICk7Ci0KLSAgICBGVF9GUkVFKCB0eXBlMS0+ZW5jb2RpbmcuY2hhcl9pbmRleCApOwotICAgIEZUX0ZSRUUoIHR5cGUxLT5lbmNvZGluZy5jaGFyX25hbWUgKTsKLSAgICBGVF9GUkVFKCB0eXBlMS0+Zm9udF9uYW1lICk7Ci0KLSNpZm5kZWYgVDFfQ09ORklHX09QVElPTl9OT19BRk0KLSAgICAvKiByZWxlYXNlIGFmbSBkYXRhIGlmIHByZXNlbnQgKi8KLSAgICBpZiAoIGZhY2UtPmFmbV9kYXRhICkKLSAgICAgIFQxX0RvbmVfTWV0cmljcyggbWVtb3J5LCAoQUZNX0ZvbnRJbmZvKWZhY2UtPmFmbV9kYXRhICk7Ci0jZW5kaWYKLQotICAgIC8qIHJlbGVhc2UgdW5pY29kZSBtYXAsIGlmIGFueSAqLwotI2lmIDAKLSAgICBGVF9GUkVFKCBmYWNlLT51bmljb2RlX21hcF9yZWMubWFwcyApOwotICAgIGZhY2UtPnVuaWNvZGVfbWFwX3JlYy5udW1fbWFwcyA9IDA7Ci0gICAgZmFjZS0+dW5pY29kZV9tYXAgICAgICAgICAgICAgID0gTlVMTDsKLSNlbmRpZgotCi0gICAgZmFjZS0+cm9vdC5mYW1pbHlfbmFtZSA9IE5VTEw7Ci0gICAgZmFjZS0+cm9vdC5zdHlsZV9uYW1lICA9IE5VTEw7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0ZhY2VfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBmYWNlIG9iamVjdCBjb25zdHJ1Y3Rvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHN0cmVhbSAgICAgOjogIGlucHV0IHN0cmVhbSB3aGVyZSB0byBsb2FkIGZvbnQgZGF0YS4gICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZmFjZV9pbmRleCA6OiBUaGUgaW5kZXggb2YgdGhlIGZvbnQgZmFjZSBpbiB0aGUgcmVzb3VyY2UuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBudW1fcGFyYW1zIDo6IE51bWJlciBvZiBhZGRpdGlvbmFsIGdlbmVyaWMgcGFyYW1ldGVycy4gIElnbm9yZWQuICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHBhcmFtcyAgICAgOjogQWRkaXRpb25hbCBnZW5lcmljIHBhcmFtZXRlcnMuICBJZ25vcmVkLiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEluT3V0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGZhY2UgICAgICAgOjogVGhlIGZhY2UgcmVjb3JkIHRvIGJ1aWxkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIFQxX0ZhY2VfSW5pdCggRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgIHQxZmFjZSwgICAgICAgICAgLyogVDFfRmFjZSAqLwotICAgICAgICAgICAgICAgIEZUX0ludCAgICAgICAgIGZhY2VfaW5kZXgsCi0gICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgbnVtX3BhcmFtcywKLSAgICAgICAgICAgICAgICBGVF9QYXJhbWV0ZXIqICBwYXJhbXMgKQotICB7Ci0gICAgVDFfRmFjZSAgICAgICAgICAgICBmYWNlID0gKFQxX0ZhY2UpdDFmYWNlOwotICAgIEZUX0Vycm9yICAgICAgICAgICAgZXJyb3I7Ci0gICAgRlRfU2VydmljZV9Qc0NNYXBzICBwc25hbWVzOwotICAgIFBTQXV4X1NlcnZpY2UgICAgICAgcHNhdXg7Ci0gICAgVDFfRm9udCAgICAgICAgICAgICB0eXBlMSA9ICZmYWNlLT50eXBlMTsKLSAgICBQU19Gb250SW5mbyAgICAgICAgIGluZm8gPSAmdHlwZTEtPmZvbnRfaW5mbzsKLQotICAgIEZUX1VOVVNFRCggbnVtX3BhcmFtcyApOwotICAgIEZUX1VOVVNFRCggcGFyYW1zICk7Ci0gICAgRlRfVU5VU0VEKCBzdHJlYW0gKTsKLQotCi0gICAgZmFjZS0+cm9vdC5udW1fZmFjZXMgPSAxOwotCi0gICAgRlRfRkFDRV9GSU5EX0dMT0JBTF9TRVJWSUNFKCBmYWNlLCBwc25hbWVzLCBQT1NUU0NSSVBUX0NNQVBTICk7Ci0gICAgZmFjZS0+cHNuYW1lcyA9IHBzbmFtZXM7Ci0KLSAgICBmYWNlLT5wc2F1eCA9IEZUX0dldF9Nb2R1bGVfSW50ZXJmYWNlKCBGVF9GQUNFX0xJQlJBUlkoIGZhY2UgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHNhdXgiICk7Ci0gICAgcHNhdXggPSAoUFNBdXhfU2VydmljZSlmYWNlLT5wc2F1eDsKLSAgICBpZiAoICFwc2F1eCApCi0gICAgewotICAgICAgRlRfRVJST1IoKCAiVDFfRmFjZV9Jbml0OiBjYW5ub3QgYWNjZXNzIGBwc2F1eCcgbW9kdWxlXG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggTWlzc2luZ19Nb2R1bGUgKTsKLSAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICBmYWNlLT5wc2hpbnRlciA9IEZUX0dldF9Nb2R1bGVfSW50ZXJmYWNlKCBGVF9GQUNFX0xJQlJBUlkoIGZhY2UgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHNoaW50ZXIiICk7Ci0KLSAgICBGVF9UUkFDRTIoKCAiVHlwZSAxIGRyaXZlclxuIiApKTsKLQotICAgIC8qIG9wZW4gdGhlIHRva2VuaXplcjsgdGhpcyB3aWxsIGFsc28gY2hlY2sgdGhlIGZvbnQgZm9ybWF0ICovCi0gICAgZXJyb3IgPSBUMV9PcGVuX0ZhY2UoIGZhY2UgKTsKLSAgICBpZiAoIGVycm9yICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGlmIHdlIGp1c3Qgd2FudGVkIHRvIGNoZWNrIHRoZSBmb3JtYXQsIGxlYXZlIHN1Y2Nlc3NmdWxseSBub3cgKi8KLSAgICBpZiAoIGZhY2VfaW5kZXggPCAwICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIC8qIGNoZWNrIHRoZSBmYWNlIGluZGV4ICovCi0gICAgaWYgKCAoIGZhY2VfaW5kZXggJiAweEZGRkYgKSA+IDAgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggIlQxX0ZhY2VfSW5pdDogaW52YWxpZCBmYWNlIGluZGV4XG4iICkpOwotICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9Bcmd1bWVudCApOwotICAgICAgZ290byBFeGl0OwotICAgIH0KLQotICAgIC8qIG5vdyBsb2FkIHRoZSBmb250IHByb2dyYW0gaW50byB0aGUgZmFjZSBvYmplY3QgKi8KLQotICAgIC8qIGluaXRpYWxpemUgdGhlIGZhY2Ugb2JqZWN0IGZpZWxkcyAqLwotCi0gICAgLyogc2V0IHVwIHJvb3QgZmFjZSBmaWVsZHMgKi8KLSAgICB7Ci0gICAgICBGVF9GYWNlICByb290ID0gKEZUX0ZhY2UpJmZhY2UtPnJvb3Q7Ci0KLQotICAgICAgcm9vdC0+bnVtX2dseXBocyA9IHR5cGUxLT5udW1fZ2x5cGhzOwotICAgICAgcm9vdC0+ZmFjZV9pbmRleCA9IDA7Ci0KLSAgICAgIHJvb3QtPmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX1NDQUxBQkxFICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRkFDRV9GTEFHX0hPUklaT05UQUwgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRkFDRV9GTEFHX0dMWVBIX05BTUVTIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlRfRkFDRV9GTEFHX0hJTlRFUjsKLQotICAgICAgaWYgKCBpbmZvLT5pc19maXhlZF9waXRjaCApCi0gICAgICAgIHJvb3QtPmZhY2VfZmxhZ3MgfD0gRlRfRkFDRV9GTEFHX0ZJWEVEX1dJRFRIOwotCi0gICAgICBpZiAoIGZhY2UtPmJsZW5kICkKLSAgICAgICAgcm9vdC0+ZmFjZV9mbGFncyB8PSBGVF9GQUNFX0ZMQUdfTVVMVElQTEVfTUFTVEVSUzsKLQotICAgICAgLyogVGhlIGZvbGxvd2luZyBjb2RlIHRvIGV4dHJhY3QgdGhlIGZhbWlseSBhbmQgdGhlIHN0eWxlIGlzIHZlcnkgICAqLwotICAgICAgLyogc2ltcGxpc3RpYyBhbmQgbWlnaHQgZ2V0IHNvbWUgdGhpbmdzIHdyb25nLiAgRm9yIGEgZnVsbC1mZWF0dXJlZCAqLwotICAgICAgLyogYWxnb3JpdGhtIHlvdSBtaWdodCBoYXZlIGEgbG9vayBhdCB0aGUgd2hpdGVwYXBlciBnaXZlbiBhdCAgICAgICAqLwotICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgLyogICBodHRwOi8vYmxvZ3MubXNkbi5jb20vdGV4dC9hcmNoaXZlLzIwMDcvMDQvMjMvd3BmLWZvbnQtc2VsZWN0aW9uLW1vZGVsLmFzcHggKi8KLQotICAgICAgLyogZ2V0IHN0eWxlIG5hbWUgLS0gYmUgY2FyZWZ1bCwgc29tZSBicm9rZW4gZm9udHMgb25seSAqLwotICAgICAgLyogaGF2ZSBhIGAvRm9udE5hbWUnIGRpY3Rpb25hcnkgZW50cnkhICAgICAgICAgICAgICAgICAqLwotICAgICAgcm9vdC0+ZmFtaWx5X25hbWUgPSBpbmZvLT5mYW1pbHlfbmFtZTsKLSAgICAgIHJvb3QtPnN0eWxlX25hbWUgID0gTlVMTDsKLQotICAgICAgaWYgKCByb290LT5mYW1pbHlfbmFtZSApCi0gICAgICB7Ci0gICAgICAgIGNoYXIqICBmdWxsICAgPSBpbmZvLT5mdWxsX25hbWU7Ci0gICAgICAgIGNoYXIqICBmYW1pbHkgPSByb290LT5mYW1pbHlfbmFtZTsKLQotCi0gICAgICAgIGlmICggZnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICBGVF9Cb29sICB0aGVfc2FtZSA9IFRSVUU7Ci0KLQotICAgICAgICAgIHdoaWxlICggKmZ1bGwgKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICggKmZ1bGwgPT0gKmZhbWlseSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGZhbWlseSsrOwotICAgICAgICAgICAgICBmdWxsKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlmICggKmZ1bGwgPT0gJyAnIHx8ICpmdWxsID09ICctJyApCi0gICAgICAgICAgICAgICAgZnVsbCsrOwotICAgICAgICAgICAgICBlbHNlIGlmICggKmZhbWlseSA9PSAnICcgfHwgKmZhbWlseSA9PSAnLScgKQotICAgICAgICAgICAgICAgIGZhbWlseSsrOwotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGVfc2FtZSA9IEZBTFNFOwotCi0gICAgICAgICAgICAgICAgaWYgKCAhKmZhbWlseSApCi0gICAgICAgICAgICAgICAgICByb290LT5zdHlsZV9uYW1lID0gZnVsbDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmICggdGhlX3NhbWUgKQotICAgICAgICAgICAgcm9vdC0+c3R5bGVfbmFtZSA9IChjaGFyICopIlJlZ3VsYXIiOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8qIGRvIHdlIGhhdmUgYSBgL0ZvbnROYW1lJz8gKi8KLSAgICAgICAgaWYgKCB0eXBlMS0+Zm9udF9uYW1lICkKLSAgICAgICAgICByb290LT5mYW1pbHlfbmFtZSA9IHR5cGUxLT5mb250X25hbWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggIXJvb3QtPnN0eWxlX25hbWUgKQotICAgICAgewotICAgICAgICBpZiAoIGluZm8tPndlaWdodCApCi0gICAgICAgICAgcm9vdC0+c3R5bGVfbmFtZSA9IGluZm8tPndlaWdodDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIC8qIGFzc3VtZSBgUmVndWxhcicgc3R5bGUgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGJldHRlciAqLwotICAgICAgICAgIHJvb3QtPnN0eWxlX25hbWUgPSAoY2hhciAqKSJSZWd1bGFyIjsKLSAgICAgIH0KLQotICAgICAgLyogY29tcHV0ZSBzdHlsZSBmbGFncyAqLwotICAgICAgcm9vdC0+c3R5bGVfZmxhZ3MgPSAwOwotICAgICAgaWYgKCBpbmZvLT5pdGFsaWNfYW5nbGUgKQotICAgICAgICByb290LT5zdHlsZV9mbGFncyB8PSBGVF9TVFlMRV9GTEFHX0lUQUxJQzsKLSAgICAgIGlmICggaW5mby0+d2VpZ2h0ICkKLSAgICAgIHsKLSAgICAgICAgaWYgKCAhZnRfc3RyY21wKCBpbmZvLT53ZWlnaHQsICJCb2xkIiAgKSB8fAotICAgICAgICAgICAgICFmdF9zdHJjbXAoIGluZm8tPndlaWdodCwgIkJsYWNrIiApICkKLSAgICAgICAgICByb290LT5zdHlsZV9mbGFncyB8PSBGVF9TVFlMRV9GTEFHX0JPTEQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qIG5vIGVtYmVkZGVkIGJpdG1hcCBzdXBwb3J0ICovCi0gICAgICByb290LT5udW1fZml4ZWRfc2l6ZXMgPSAwOwotICAgICAgcm9vdC0+YXZhaWxhYmxlX3NpemVzID0gTlVMTDsKLQotICAgICAgcm9vdC0+YmJveC54TWluID0gICB0eXBlMS0+Zm9udF9iYm94LnhNaW4gICAgICAgICAgICA+PiAxNjsKLSAgICAgIHJvb3QtPmJib3gueU1pbiA9ICAgdHlwZTEtPmZvbnRfYmJveC55TWluICAgICAgICAgICAgPj4gMTY7Ci0gICAgICAvKiBubyBgVScgc3VmZml4IGhlcmUgdG8gMHhGRkZGISAqLwotICAgICAgcm9vdC0+YmJveC54TWF4ID0gKCB0eXBlMS0+Zm9udF9iYm94LnhNYXggKyAweEZGRkYgKSA+PiAxNjsKLSAgICAgIHJvb3QtPmJib3gueU1heCA9ICggdHlwZTEtPmZvbnRfYmJveC55TWF4ICsgMHhGRkZGICkgPj4gMTY7Ci0KLSAgICAgIC8qIFNldCB1bml0c19wZXJfRU0gaWYgd2UgZGlkbid0IHNldCBpdCBpbiB0MV9wYXJzZV9mb250X21hdHJpeC4gKi8KLSAgICAgIGlmICggIXJvb3QtPnVuaXRzX3Blcl9FTSApCi0gICAgICAgIHJvb3QtPnVuaXRzX3Blcl9FTSA9IDEwMDA7Ci0KLSAgICAgIHJvb3QtPmFzY2VuZGVyICA9IChGVF9TaG9ydCkoIHJvb3QtPmJib3gueU1heCApOwotICAgICAgcm9vdC0+ZGVzY2VuZGVyID0gKEZUX1Nob3J0KSggcm9vdC0+YmJveC55TWluICk7Ci0KLSAgICAgIHJvb3QtPmhlaWdodCA9IChGVF9TaG9ydCkoICggcm9vdC0+dW5pdHNfcGVyX0VNICogMTIgKSAvIDEwICk7Ci0gICAgICBpZiAoIHJvb3QtPmhlaWdodCA8IHJvb3QtPmFzY2VuZGVyIC0gcm9vdC0+ZGVzY2VuZGVyICkKLSAgICAgICAgcm9vdC0+aGVpZ2h0ID0gKEZUX1Nob3J0KSggcm9vdC0+YXNjZW5kZXIgLSByb290LT5kZXNjZW5kZXIgKTsKLQotICAgICAgLyogbm93IGNvbXB1dGUgdGhlIG1heGltdW0gYWR2YW5jZSB3aWR0aCAqLwotICAgICAgcm9vdC0+bWF4X2FkdmFuY2Vfd2lkdGggPQotICAgICAgICAoRlRfU2hvcnQpKCByb290LT5iYm94LnhNYXggKTsKLSAgICAgIHsKLSAgICAgICAgRlRfUG9zICBtYXhfYWR2YW5jZTsKLQotCi0gICAgICAgIGVycm9yID0gVDFfQ29tcHV0ZV9NYXhfQWR2YW5jZSggZmFjZSwgJm1heF9hZHZhbmNlICk7Ci0KLSAgICAgICAgLyogaW4gY2FzZSBvZiBlcnJvciwga2VlcCB0aGUgc3RhbmRhcmQgd2lkdGggKi8KLSAgICAgICAgaWYgKCAhZXJyb3IgKQotICAgICAgICAgIHJvb3QtPm1heF9hZHZhbmNlX3dpZHRoID0gKEZUX1Nob3J0KUZJWEVEX1RPX0lOVCggbWF4X2FkdmFuY2UgKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGVycm9yID0gRlRfRXJyX09rOyAgIC8qIGNsZWFyIGVycm9yICovCi0gICAgICB9Ci0KLSAgICAgIHJvb3QtPm1heF9hZHZhbmNlX2hlaWdodCA9IHJvb3QtPmhlaWdodDsKLQotICAgICAgcm9vdC0+dW5kZXJsaW5lX3Bvc2l0aW9uICA9IChGVF9TaG9ydClpbmZvLT51bmRlcmxpbmVfcG9zaXRpb247Ci0gICAgICByb290LT51bmRlcmxpbmVfdGhpY2tuZXNzID0gKEZUX1Nob3J0KWluZm8tPnVuZGVybGluZV90aGlja25lc3M7Ci0gICAgfQotCi0gICAgewotICAgICAgRlRfRmFjZSAgcm9vdCA9ICZmYWNlLT5yb290OwotCi0KLSAgICAgIGlmICggcHNuYW1lcyApCi0gICAgICB7Ci0gICAgICAgIEZUX0NoYXJNYXBSZWMgICAgY2hhcm1hcDsKLSAgICAgICAgVDFfQ01hcF9DbGFzc2VzICBjbWFwX2NsYXNzZXMgPSBwc2F1eC0+dDFfY21hcF9jbGFzc2VzOwotICAgICAgICBGVF9DTWFwX0NsYXNzICAgIGNsYXp6OwotCi0KLSAgICAgICAgY2hhcm1hcC5mYWNlID0gcm9vdDsKLQotICAgICAgICAvKiBmaXJzdCBvZiBhbGwsIHRyeSB0byBzeW50aGVzaXplIGEgVW5pY29kZSBjaGFybWFwICovCi0gICAgICAgIGNoYXJtYXAucGxhdGZvcm1faWQgPSBUVF9QTEFURk9STV9NSUNST1NPRlQ7Ci0gICAgICAgIGNoYXJtYXAuZW5jb2RpbmdfaWQgPSBUVF9NU19JRF9VTklDT0RFX0NTOwotICAgICAgICBjaGFybWFwLmVuY29kaW5nICAgID0gRlRfRU5DT0RJTkdfVU5JQ09ERTsKLQotICAgICAgICBlcnJvciA9IEZUX0NNYXBfTmV3KCBjbWFwX2NsYXNzZXMtPnVuaWNvZGUsIE5VTEwsICZjaGFybWFwLCBOVUxMICk7Ci0gICAgICAgIGlmICggZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCi0gICAgICAgICAgICAgRlRfRVJSX05FUSggZXJyb3IsIE5vX1VuaWNvZGVfR2x5cGhfTmFtZSApICkKLSAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0gICAgICAgIC8qIG5vdywgZ2VuZXJhdGUgYW4gQWRvYmUgU3RhbmRhcmQgZW5jb2Rpbmcgd2hlbiBhcHByb3ByaWF0ZSAqLwotICAgICAgICBjaGFybWFwLnBsYXRmb3JtX2lkID0gVFRfUExBVEZPUk1fQURPQkU7Ci0gICAgICAgIGNsYXp6ICAgICAgICAgICAgICAgPSBOVUxMOwotCi0gICAgICAgIHN3aXRjaCAoIHR5cGUxLT5lbmNvZGluZ190eXBlICkKLSAgICAgICAgewotICAgICAgICBjYXNlIFQxX0VOQ09ESU5HX1RZUEVfU1RBTkRBUkQ6Ci0gICAgICAgICAgY2hhcm1hcC5lbmNvZGluZyAgICA9IEZUX0VOQ09ESU5HX0FET0JFX1NUQU5EQVJEOwotICAgICAgICAgIGNoYXJtYXAuZW5jb2RpbmdfaWQgPSBUVF9BRE9CRV9JRF9TVEFOREFSRDsKLSAgICAgICAgICBjbGF6eiAgICAgICAgICAgICAgID0gY21hcF9jbGFzc2VzLT5zdGFuZGFyZDsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFQxX0VOQ09ESU5HX1RZUEVfRVhQRVJUOgotICAgICAgICAgIGNoYXJtYXAuZW5jb2RpbmcgICAgPSBGVF9FTkNPRElOR19BRE9CRV9FWFBFUlQ7Ci0gICAgICAgICAgY2hhcm1hcC5lbmNvZGluZ19pZCA9IFRUX0FET0JFX0lEX0VYUEVSVDsKLSAgICAgICAgICBjbGF6eiAgICAgICAgICAgICAgID0gY21hcF9jbGFzc2VzLT5leHBlcnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUMV9FTkNPRElOR19UWVBFX0FSUkFZOgotICAgICAgICAgIGNoYXJtYXAuZW5jb2RpbmcgICAgPSBGVF9FTkNPRElOR19BRE9CRV9DVVNUT007Ci0gICAgICAgICAgY2hhcm1hcC5lbmNvZGluZ19pZCA9IFRUX0FET0JFX0lEX0NVU1RPTTsKLSAgICAgICAgICBjbGF6eiAgICAgICAgICAgICAgID0gY21hcF9jbGFzc2VzLT5jdXN0b207Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBUMV9FTkNPRElOR19UWVBFX0lTT0xBVElOMToKLSAgICAgICAgICBjaGFybWFwLmVuY29kaW5nICAgID0gRlRfRU5DT0RJTkdfQURPQkVfTEFUSU5fMTsKLSAgICAgICAgICBjaGFybWFwLmVuY29kaW5nX2lkID0gVFRfQURPQkVfSURfTEFUSU5fMTsKLSAgICAgICAgICBjbGF6eiAgICAgICAgICAgICAgID0gY21hcF9jbGFzc2VzLT51bmljb2RlOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBjbGF6eiApCi0gICAgICAgICAgZXJyb3IgPSBGVF9DTWFwX05ldyggY2xhenosIE5VTEwsICZjaGFybWFwLCBOVUxMICk7Ci0KLSNpZiAwCi0gICAgICAgIC8qIFNlbGVjdCBkZWZhdWx0IGNoYXJtYXAgKi8KLSAgICAgICAgaWYgKHJvb3QtPm51bV9jaGFybWFwcykKLSAgICAgICAgICByb290LT5jaGFybWFwID0gcm9vdC0+Y2hhcm1hcHNbMF07Ci0jZW5kaWYKLSAgICAgIH0KLSAgICB9Ci0KLSAgRXhpdDoKLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPEZ1bmN0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0RyaXZlcl9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEluaXRpYWxpemVzIGEgZ2l2ZW4gVHlwZSAxIGRyaXZlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPElucHV0PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGRyaXZlciA6OiBBIGhhbmRsZSB0byB0aGUgdGFyZ2V0IGRyaXZlciBvYmplY3QuICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFJldHVybj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEZyZWVUeXBlIGVycm9yIGNvZGUuICAwIG1lYW5zIHN1Y2Nlc3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgRlRfTE9DQUxfREVGKCBGVF9FcnJvciApCi0gIFQxX0RyaXZlcl9Jbml0KCBGVF9Nb2R1bGUgIGRyaXZlciApCi0gIHsKLSAgICBGVF9VTlVTRUQoIGRyaXZlciApOwotCi0gICAgcmV0dXJuIEZUX0Vycl9PazsKLSAgfQotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RnVuY3Rpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfRHJpdmVyX0RvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgRmluYWxpemVzIGEgZ2l2ZW4gVHlwZSAxIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8SW5wdXQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgZHJpdmVyIDo6IEEgaGFuZGxlIHRvIHRoZSB0YXJnZXQgVHlwZSAxIGRyaXZlci4gICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICBGVF9MT0NBTF9ERUYoIHZvaWQgKQotICBUMV9Ecml2ZXJfRG9uZSggRlRfTW9kdWxlICBkcml2ZXIgKQotICB7Ci0gICAgRlRfVU5VU0VEKCBkcml2ZXIgKTsKLSAgfQotCi0KLS8qIEVORCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3Qxb2Jqcy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3Qxb2Jqcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjRmM2NiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MW9ianMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0MW9ianMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVHlwZSAxIG9iamVjdHMgbWFuYWdlciAoc3BlY2lmaWNhdGlvbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgX19UMU9CSlNfSF9fCi0jZGVmaW5lIF9fVDFPQkpTX0hfXwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfT0JKRUNUU19ICi0jaW5jbHVkZSBGVF9DT05GSUdfQ09ORklHX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RZUEUxX1RZUEVTX0gKLQotCi1GVF9CRUdJTl9IRUFERVIKLQotCi0gIC8qIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlcyBtdXN0IGJlIGRlZmluZWQgYnkgdGhlIGhpbnRlciAqLwotICB0eXBlZGVmIHN0cnVjdCBUMV9TaXplX0hpbnRzXyAgIFQxX1NpemVfSGludHM7Ci0gIHR5cGVkZWYgc3RydWN0IFQxX0dseXBoX0hpbnRzXyAgVDFfR2x5cGhfSGludHM7Ci0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9TaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIGhhbmRsZSB0byBhIFR5cGUgMSBzaXplIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIHR5cGVkZWYgc3RydWN0IFQxX1NpemVSZWNfKiAgVDFfU2l6ZTsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0dseXBoU2xvdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgVHlwZSAxIGdseXBoIHNsb3Qgb2JqZWN0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgdHlwZWRlZiBzdHJ1Y3QgVDFfR2x5cGhTbG90UmVjXyogIFQxX0dseXBoU2xvdDsKLQotCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPFR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFQxX0NoYXJNYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPERlc2NyaXB0aW9uPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIEEgaGFuZGxlIHRvIGEgVHlwZSAxIGNoYXJhY3RlciBtYXBwaW5nIG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogPE5vdGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIFRoZSBUeXBlIDEgZm9ybWF0IGRvZXNuJ3QgdXNlIGEgY2hhcm1hcCBidXQgYW4gZW5jb2RpbmcgdGFibGUuICAgICAqLwotICAvKiAgICBUaGUgZHJpdmVyIGlzIHJlc3BvbnNpYmxlIGZvciBtYWtpbmcgdXAgY2hhcm1hcCBvYmplY3RzICAgICAgICAgICAgKi8KLSAgLyogICAgY29ycmVzcG9uZGluZyB0byB0aGVzZSB0YWJsZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCBUMV9DaGFyTWFwUmVjXyogICBUMV9DaGFyTWFwOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgIEhFUkUgQkVHSU5TIFRIRSBUWVBFMSBTUEVDSUZJQyBTVFVGRiAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfU2l6ZVJlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVHlwZSAxIHNpemUgcmVjb3JkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVDFfU2l6ZVJlY18KLSAgewotICAgIEZUX1NpemVSZWMgIHJvb3Q7Ci0KLSAgfSBUMV9TaXplUmVjOwotCi0KLSAgRlRfTE9DQUwoIHZvaWQgKQotICBUMV9TaXplX0RvbmUoIEZUX1NpemUgIHNpemUgKTsKLQotICBGVF9MT0NBTCggRlRfRXJyb3IgKQotICBUMV9TaXplX1JlcXVlc3QoIEZUX1NpemUgICAgICAgICAgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICBGVF9TaXplX1JlcXVlc3QgIHJlcSApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFQxX1NpemVfSW5pdCggRlRfU2l6ZSAgc2l6ZSApOwotCi0KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8VHlwZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVDFfR2x5cGhTbG90UmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RGVzY3JpcHRpb24+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgVHlwZSAxIGdseXBoIHNsb3QgcmVjb3JkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVDFfR2x5cGhTbG90UmVjXwotICB7Ci0gICAgRlRfR2x5cGhTbG90UmVjICByb290OwotCi0gICAgRlRfQm9vbCAgICAgICAgICBoaW50OwotICAgIEZUX0Jvb2wgICAgICAgICAgc2NhbGVkOwotCi0gICAgRlRfSW50ICAgICAgICAgICBtYXhfcG9pbnRzOwotICAgIEZUX0ludCAgICAgICAgICAgbWF4X2NvbnRvdXJzOwotCi0gICAgRlRfRml4ZWQgICAgICAgICB4X3NjYWxlOwotICAgIEZUX0ZpeGVkICAgICAgICAgeV9zY2FsZTsKLQotICB9IFQxX0dseXBoU2xvdFJlYzsKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFQxX0ZhY2VfSW5pdCggRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgIEZUX0ZhY2UgICAgICAgIGZhY2UsCi0gICAgICAgICAgICAgICAgRlRfSW50ICAgICAgICAgZmFjZV9pbmRleCwKLSAgICAgICAgICAgICAgICBGVF9JbnQgICAgICAgICBudW1fcGFyYW1zLAotICAgICAgICAgICAgICAgIEZUX1BhcmFtZXRlciogIHBhcmFtcyApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgVDFfRmFjZV9Eb25lKCBGVF9GYWNlICBmYWNlICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVDFfR2x5cGhTbG90X0luaXQoIEZUX0dseXBoU2xvdCAgc2xvdCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgVDFfR2x5cGhTbG90X0RvbmUoIEZUX0dseXBoU2xvdCAgc2xvdCApOwotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFQxX0RyaXZlcl9Jbml0KCBGVF9Nb2R1bGUgIGRyaXZlciApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgVDFfRHJpdmVyX0RvbmUoIEZUX01vZHVsZSAgZHJpdmVyICk7Ci0KLQotRlRfRU5EX0hFQURFUgotCi0jZW5kaWYgLyogX19UMU9CSlNfSF9fICovCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFwYXJzZS5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxcGFyc2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI2ODUwMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFwYXJzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxcGFyc2UuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDEgcGFyc2VyIChib2R5KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBUeXBlIDEgcGFyc2VyIGlzIGluIGNoYXJnZSBvZiB0aGUgZm9sbG93aW5nOiAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIC0gcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhIGdyb3dpbmcgc2VxdWVuY2Ugb2Ygb2JqZWN0cyBjYWxsZWQgICovCi0gIC8qICAgIGEgYFQxX1RhYmxlJyAodXNlZCB0byBidWlsZCB2YXJpb3VzIHRhYmxlcyBuZWVkZWQgYnkgdGhlIGxvYWRlcikuICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIC0gb3BlbmluZyAucGZiIGFuZCAucGZhIGZpbGVzIHRvIGV4dHJhY3QgdGhlaXIgdG9wLWxldmVsIGFuZCBwcml2YXRlICovCi0gIC8qICAgIGRpY3Rpb25hcmllcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogIC0gcmVhZCBudW1iZXJzLCBhcnJheXMgJiBzdHJpbmdzIGZyb20gYW55IGRpY3Rpb25hcnkuICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiBTZWUgYHQxbG9hZC5jJyB0byBzZWUgaG93IGRhdGEgaXMgbG9hZGVkIGZyb20gdGhlIGZvbnQgZmlsZS4gICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxmdDJidWlsZC5oPgotI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAotI2luY2x1ZGUgRlRfSU5URVJOQUxfU1RSRUFNX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1BPU1RTQ1JJUFRfQVVYX0gKLQotI2luY2x1ZGUgInQxcGFyc2UuaCIKLQotI2luY2x1ZGUgInQxZXJyb3JzLmgiCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIFRoZSBtYWNybyBGVF9DT01QT05FTlQgaXMgdXNlZCBpbiB0cmFjZSBtb2RlLiAgSXQgaXMgYW4gaW1wbGljaXQgICAgICAqLwotICAvKiBwYXJhbWV0ZXIgb2YgdGhlIEZUX1RSQUNFKCkgYW5kIEZUX0VSUk9SKCkgbWFjcm9zLCB1c2VkIHRvIHByaW50L2xvZyAgKi8KLSAgLyogbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI3VuZGVmICBGVF9DT01QT05FTlQKLSNkZWZpbmUgRlRfQ09NUE9ORU5UICB0cmFjZV90MXBhcnNlCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAvKioqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKioqKi8KLSAgLyoqKioqICAgICAgICAgICAgICAgICAgIElOUFVUIFNUUkVBTSBQQVJTRVIgICAgICAgICAgICAgICAgICAgICAgICAgKioqKiovCi0gIC8qKioqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqKioqLwotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSAgLyogc2VlIEFkb2JlIFRlY2huaWNhbCBOb3RlIDUwNDAuRG93bmxvYWRfRm9udHMucGRmICovCi0KLSAgc3RhdGljIEZUX0Vycm9yCi0gIHJlYWRfcGZiX3RhZyggRlRfU3RyZWFtICAgc3RyZWFtLAotICAgICAgICAgICAgICAgIEZUX1VTaG9ydCAgKmF0YWcsCi0gICAgICAgICAgICAgICAgRlRfVUxvbmcgICAqYXNpemUgKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9VU2hvcnQgIHRhZzsKLSAgICBGVF9VTG9uZyAgIHNpemU7Ci0KLQotICAgICphdGFnICA9IDA7Ci0gICAgKmFzaXplID0gMDsKLQotICAgIGlmICggIUZUX1JFQURfVVNIT1JUKCB0YWcgKSApCi0gICAgewotICAgICAgaWYgKCB0YWcgPT0gMHg4MDAxVSB8fCB0YWcgPT0gMHg4MDAyVSApCi0gICAgICB7Ci0gICAgICAgIGlmICggIUZUX1JFQURfVUxPTkdfTEUoIHNpemUgKSApCi0gICAgICAgICAgKmFzaXplID0gc2l6ZTsKLSAgICAgIH0KLQotICAgICAgKmF0YWcgPSB0YWc7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBzdGF0aWMgRlRfRXJyb3IKLSAgY2hlY2tfdHlwZTFfZm9ybWF0KCBGVF9TdHJlYW0gICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqICBoZWFkZXJfc3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICBoZWFkZXJfbGVuZ3RoICkKLSAgewotICAgIEZUX0Vycm9yICAgZXJyb3I7Ci0gICAgRlRfVVNob3J0ICB0YWc7Ci0gICAgRlRfVUxvbmcgICBkdW1teTsKLQotCi0gICAgaWYgKCBGVF9TVFJFQU1fU0VFSyggMCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGVycm9yID0gcmVhZF9wZmJfdGFnKCBzdHJlYW0sICZ0YWcsICZkdW1teSApOwotICAgIGlmICggZXJyb3IgKQotICAgICAgZ290byBFeGl0OwotCi0gICAgLyogV2UgYXNzdW1lIHRoYXQgdGhlIGZpcnN0IHNlZ21lbnQgaW4gYSBQRkIgaXMgYWx3YXlzIGVuY29kZWQgYXMgICAqLwotICAgIC8qIHRleHQuICBUaGlzIG1pZ2h0IGJlIHdyb25nIChhbmQgdGhlIHNwZWNpZmljYXRpb24gZG9lc24ndCBpbnNpc3QgKi8KLSAgICAvKiBvbiB0aGF0KSwgYnV0IHdlIGhhdmUgbmV2ZXIgc2VlbiBhIGNvdW50ZXJleGFtcGxlLiAgICAgICAgICAgICAgICovCi0gICAgaWYgKCB0YWcgIT0gMHg4MDAxVSAmJiBGVF9TVFJFQU1fU0VFSyggMCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGlmICggIUZUX0ZSQU1FX0VOVEVSKCBoZWFkZXJfbGVuZ3RoICkgKQotICAgIHsKLSAgICAgIGVycm9yID0gRlRfRXJyX09rOwotCi0gICAgICBpZiAoIGZ0X21lbWNtcCggc3RyZWFtLT5jdXJzb3IsIGhlYWRlcl9zdHJpbmcsIGhlYWRlcl9sZW5ndGggKSAhPSAwICkKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggVW5rbm93bl9GaWxlX0Zvcm1hdCApOwotCi0gICAgICBGVF9GUkFNRV9FWElUKCk7Ci0gICAgfQotCi0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotICBGVF9MT0NBTF9ERUYoIEZUX0Vycm9yICkKLSAgVDFfTmV3X1BhcnNlciggVDFfUGFyc2VyICAgICAgcGFyc2VyLAotICAgICAgICAgICAgICAgICBGVF9TdHJlYW0gICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgIEZUX01lbW9yeSAgICAgIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgUFNBdXhfU2VydmljZSAgcHNhdXggKQotICB7Ci0gICAgRlRfRXJyb3IgICBlcnJvcjsKLSAgICBGVF9VU2hvcnQgIHRhZzsKLSAgICBGVF9VTG9uZyAgIHNpemU7Ci0KLQotICAgIHBzYXV4LT5wc19wYXJzZXJfZnVuY3MtPmluaXQoICZwYXJzZXItPnJvb3QsIE5VTEwsIE5VTEwsIG1lbW9yeSApOwotCi0gICAgcGFyc2VyLT5zdHJlYW0gICAgICAgPSBzdHJlYW07Ci0gICAgcGFyc2VyLT5iYXNlX2xlbiAgICAgPSAwOwotICAgIHBhcnNlci0+YmFzZV9kaWN0ICAgID0gTlVMTDsKLSAgICBwYXJzZXItPnByaXZhdGVfbGVuICA9IDA7Ci0gICAgcGFyc2VyLT5wcml2YXRlX2RpY3QgPSBOVUxMOwotICAgIHBhcnNlci0+aW5fcGZiICAgICAgID0gMDsKLSAgICBwYXJzZXItPmluX21lbW9yeSAgICA9IDA7Ci0gICAgcGFyc2VyLT5zaW5nbGVfYmxvY2sgPSAwOwotCi0gICAgLyogY2hlY2sgdGhlIGhlYWRlciBmb3JtYXQgKi8KLSAgICBlcnJvciA9IGNoZWNrX3R5cGUxX2Zvcm1hdCggc3RyZWFtLCAiJSFQUy1BZG9iZUZvbnQiLCAxNCApOwotICAgIGlmICggZXJyb3IgKQotICAgIHsKLSAgICAgIGlmICggRlRfRVJSX05FUSggZXJyb3IsIFVua25vd25fRmlsZV9Gb3JtYXQgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLQotICAgICAgZXJyb3IgPSBjaGVja190eXBlMV9mb3JtYXQoIHN0cmVhbSwgIiUhRm9udFR5cGUiLCAxMCApOwotICAgICAgaWYgKCBlcnJvciApCi0gICAgICB7Ci0gICAgICAgIEZUX1RSQUNFMigoICIgIG5vdCBhIFR5cGUgMSBmb250XG4iICkpOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qIEhlcmUgYSBzaG9ydCBzdW1tYXJ5IG9mIHdoYXQgaXMgZ29pbmcgb246ICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAvKiAgIFdoZW4gY3JlYXRpbmcgYSBuZXcgVHlwZSAxIHBhcnNlciwgd2UgdHJ5IHRvIGxvY2F0ZSBhbmQgbG9hZCAqLwotICAgIC8qICAgdGhlIGJhc2UgZGljdGlvbmFyeSBpZiB0aGlzIGlzIHBvc3NpYmxlIChpLmUuLCBmb3IgUEZCICAgICAgICovCi0gICAgLyogICBmaWxlcykuICBPdGhlcndpc2UsIHdlIGxvYWQgdGhlIHdob2xlIGZvbnQgaW50byBtZW1vcnkuICAgICAgKi8KLSAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgV2hlbiBgbG9hZGluZycgdGhlIGJhc2UgZGljdGlvbmFyeSwgd2Ugb25seSBzZXR1cCBwb2ludGVycyAgICovCi0gICAgLyogICBpbiB0aGUgY2FzZSBvZiBhIG1lbW9yeS1iYXNlZCBzdHJlYW0uICBPdGhlcndpc2UsIHdlICAgICAgICAgKi8KLSAgICAvKiAgIGFsbG9jYXRlIGFuZCBsb2FkIHRoZSBiYXNlIGRpY3Rpb25hcnkgaW4gaXQuICAgICAgICAgICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgLyogICBwYXJzZXItPmluX3BmYiBpcyBzZXQgaWYgd2UgYXJlIGluIGEgYmluYXJ5IChgLnBmYicpIGZvbnQuICAgKi8KLSAgICAvKiAgIHBhcnNlci0+aW5fbWVtb3J5IGlzIHNldCBpZiB3ZSBoYXZlIGEgbWVtb3J5IHN0cmVhbS4gICAgICAgICAqLwotICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLSAgICAvKiB0cnkgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgYmFzZSBkaWN0aW9uYXJ5OyAgICAgKi8KLSAgICAvKiBsb29rIGZvciBhIFBvc3RzY3JpcHQgYmluYXJ5IGZpbGUgdGFnLCBpLmUuLCAweDgwMDEgKi8KLSAgICBpZiAoIEZUX1NUUkVBTV9TRUVLKCAwTCApICkKLSAgICAgIGdvdG8gRXhpdDsKLQotICAgIGVycm9yID0gcmVhZF9wZmJfdGFnKCBzdHJlYW0sICZ0YWcsICZzaXplICk7Ci0gICAgaWYgKCBlcnJvciApCi0gICAgICBnb3RvIEV4aXQ7Ci0KLSAgICBpZiAoIHRhZyAhPSAweDgwMDFVICkKLSAgICB7Ci0gICAgICAvKiBhc3N1bWUgdGhhdCB0aGlzIGlzIGEgUEZBIGZpbGUgZm9yIG5vdzsgYW4gZXJyb3Igd2lsbCAqLwotICAgICAgLyogYmUgcHJvZHVjZWQgbGF0ZXIgd2hlbiBtb3JlIHRoaW5ncyBhcmUgY2hlY2tlZCAgICAgICAgKi8KLSAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIDBMICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICBzaXplID0gc3RyZWFtLT5zaXplOwotICAgIH0KLSAgICBlbHNlCi0gICAgICBwYXJzZXItPmluX3BmYiA9IDE7Ci0KLSAgICAvKiBub3csIHRyeSB0byBsb2FkIGBzaXplJyBieXRlcyBvZiB0aGUgYGJhc2UnIGRpY3Rpb25hcnkgd2UgKi8KLSAgICAvKiBmb3VuZCBwcmV2aW91c2x5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgIC8qIGlmIGl0IGlzIGEgbWVtb3J5LWJhc2VkIHJlc291cmNlLCBzZXQgdXAgcG9pbnRlcnMgKi8KLSAgICBpZiAoICFzdHJlYW0tPnJlYWQgKQotICAgIHsKLSAgICAgIHBhcnNlci0+YmFzZV9kaWN0ID0gKEZUX0J5dGUqKXN0cmVhbS0+YmFzZSArIHN0cmVhbS0+cG9zOwotICAgICAgcGFyc2VyLT5iYXNlX2xlbiAgPSBzaXplOwotICAgICAgcGFyc2VyLT5pbl9tZW1vcnkgPSAxOwotCi0gICAgICAvKiBjaGVjayB0aGF0IHRoZSBgc2l6ZScgZmllbGQgaXMgdmFsaWQgKi8KLSAgICAgIGlmICggRlRfU1RSRUFNX1NLSVAoIHNpemUgKSApCi0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8qIHJlYWQgc2VnbWVudCBpbiBtZW1vcnkgLS0gdGhpcyBpcyBjbHVtc3ksIGJ1dCBzbyBkb2VzIHRoZSBmb3JtYXQgKi8KLSAgICAgIGlmICggRlRfQUxMT0MoIHBhcnNlci0+YmFzZV9kaWN0LCBzaXplICkgICAgICAgfHwKLSAgICAgICAgICAgRlRfU1RSRUFNX1JFQUQoIHBhcnNlci0+YmFzZV9kaWN0LCBzaXplICkgKQotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICBwYXJzZXItPmJhc2VfbGVuID0gc2l6ZTsKLSAgICB9Ci0KLSAgICBwYXJzZXItPnJvb3QuYmFzZSAgID0gcGFyc2VyLT5iYXNlX2RpY3Q7Ci0gICAgcGFyc2VyLT5yb290LmN1cnNvciA9IHBhcnNlci0+YmFzZV9kaWN0OwotICAgIHBhcnNlci0+cm9vdC5saW1pdCAgPSBwYXJzZXItPnJvb3QuY3Vyc29yICsgcGFyc2VyLT5iYXNlX2xlbjsKLQotICBFeGl0OgotICAgIGlmICggZXJyb3IgJiYgIXBhcnNlci0+aW5fbWVtb3J5ICkKLSAgICAgIEZUX0ZSRUUoIHBhcnNlci0+YmFzZV9kaWN0ICk7Ci0KLSAgICByZXR1cm4gZXJyb3I7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggdm9pZCApCi0gIFQxX0ZpbmFsaXplX1BhcnNlciggVDFfUGFyc2VyICBwYXJzZXIgKQotICB7Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBwYXJzZXItPnJvb3QubWVtb3J5OwotCi0KLSAgICAvKiBhbHdheXMgZnJlZSB0aGUgcHJpdmF0ZSBkaWN0aW9uYXJ5ICovCi0gICAgRlRfRlJFRSggcGFyc2VyLT5wcml2YXRlX2RpY3QgKTsKLQotICAgIC8qIGZyZWUgdGhlIGJhc2UgZGljdGlvbmFyeSBvbmx5IHdoZW4gd2UgaGF2ZSBhIGRpc2sgc3RyZWFtICovCi0gICAgaWYgKCAhcGFyc2VyLT5pbl9tZW1vcnkgKQotICAgICAgRlRfRlJFRSggcGFyc2VyLT5iYXNlX2RpY3QgKTsKLQotICAgIHBhcnNlci0+cm9vdC5mdW5jcy5kb25lKCAmcGFyc2VyLT5yb290ICk7Ci0gIH0KLQotCi0gIEZUX0xPQ0FMX0RFRiggRlRfRXJyb3IgKQotICBUMV9HZXRfUHJpdmF0ZV9EaWN0KCBUMV9QYXJzZXIgICAgICBwYXJzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIFBTQXV4X1NlcnZpY2UgIHBzYXV4ICkKLSAgewotICAgIEZUX1N0cmVhbSAgc3RyZWFtID0gcGFyc2VyLT5zdHJlYW07Ci0gICAgRlRfTWVtb3J5ICBtZW1vcnkgPSBwYXJzZXItPnJvb3QubWVtb3J5OwotICAgIEZUX0Vycm9yICAgZXJyb3IgID0gRlRfRXJyX09rOwotICAgIEZUX1VMb25nICAgc2l6ZTsKLQotCi0gICAgaWYgKCBwYXJzZXItPmluX3BmYiApCi0gICAgewotICAgICAgLyogaW4gdGhlIGNhc2Ugb2YgdGhlIFBGQiBmb3JtYXQsIHRoZSBwcml2YXRlIGRpY3Rpb25hcnkgY2FuIGJlICAqLwotICAgICAgLyogbWFkZSBvZiBzZXZlcmFsIHNlZ21lbnRzLiAgV2UgdGh1cyBmaXJzdCByZWFkIHRoZSBudW1iZXIgb2YgICAqLwotICAgICAgLyogc2VnbWVudHMgdG8gY29tcHV0ZSB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgcHJpdmF0ZSBkaWN0aW9uYXJ5ICAqLwotICAgICAgLyogdGhlbiByZS1yZWFkIHRoZW0gaW50byBtZW1vcnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgRlRfVUxvbmcgICBzdGFydF9wb3MgPSBGVF9TVFJFQU1fUE9TKCk7Ci0gICAgICBGVF9VU2hvcnQgIHRhZzsKLQotCi0gICAgICBwYXJzZXItPnByaXZhdGVfbGVuID0gMDsKLSAgICAgIGZvciAoOzspCi0gICAgICB7Ci0gICAgICAgIGVycm9yID0gcmVhZF9wZmJfdGFnKCBzdHJlYW0sICZ0YWcsICZzaXplICk7Ci0gICAgICAgIGlmICggZXJyb3IgKQotICAgICAgICAgIGdvdG8gRmFpbDsKLQotICAgICAgICBpZiAoIHRhZyAhPSAweDgwMDJVICkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBwYXJzZXItPnByaXZhdGVfbGVuICs9IHNpemU7Ci0KLSAgICAgICAgaWYgKCBGVF9TVFJFQU1fU0tJUCggc2l6ZSApICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0KLSAgICAgIC8qIENoZWNrIHRoYXQgd2UgaGF2ZSBhIHByaXZhdGUgZGljdGlvbmFyeSB0aGVyZSAqLwotICAgICAgLyogYW5kIGFsbG9jYXRlIHByaXZhdGUgZGljdGlvbmFyeSBidWZmZXIgICAgICAgICovCi0gICAgICBpZiAoIHBhcnNlci0+cHJpdmF0ZV9sZW4gPT0gMCApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggIlQxX0dldF9Qcml2YXRlX0RpY3Q6IgotICAgICAgICAgICAgICAgICAgICIgaW52YWxpZCBwcml2YXRlIGRpY3Rpb25hcnkgc2VjdGlvblxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEZhaWw7Ci0gICAgICB9Ci0KLSAgICAgIGlmICggRlRfU1RSRUFNX1NFRUsoIHN0YXJ0X3BvcyApICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgRlRfQUxMT0MoIHBhcnNlci0+cHJpdmF0ZV9kaWN0LCBwYXJzZXItPnByaXZhdGVfbGVuICkgKQotICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgIHBhcnNlci0+cHJpdmF0ZV9sZW4gPSAwOwotICAgICAgZm9yICg7OykKLSAgICAgIHsKLSAgICAgICAgZXJyb3IgPSByZWFkX3BmYl90YWcoIHN0cmVhbSwgJnRhZywgJnNpemUgKTsKLSAgICAgICAgaWYgKCBlcnJvciB8fCB0YWcgIT0gMHg4MDAyVSApCi0gICAgICAgIHsKLSAgICAgICAgICBlcnJvciA9IEZUX0Vycl9PazsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggRlRfU1RSRUFNX1JFQUQoIHBhcnNlci0+cHJpdmF0ZV9kaWN0ICsgcGFyc2VyLT5wcml2YXRlX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSApICkKLSAgICAgICAgICBnb3RvIEZhaWw7Ci0KLSAgICAgICAgcGFyc2VyLT5wcml2YXRlX2xlbiArPSBzaXplOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLyogV2UgaGF2ZSBhbHJlYWR5IGBsb2FkZWQnIHRoZSB3aG9sZSBQRkEgZm9udCBmaWxlIGludG8gbWVtb3J5OyAqLwotICAgICAgLyogaWYgdGhpcyBpcyBhIG1lbW9yeSByZXNvdXJjZSwgYWxsb2NhdGUgYSBuZXcgYmxvY2sgdG8gaG9sZCAgICAqLwotICAgICAgLyogdGhlIHByaXZhdGUgZGljdC4gIE90aGVyd2lzZSwgc2ltcGx5IG92ZXJ3cml0ZSBpbnRvIHRoZSBiYXNlICAqLwotICAgICAgLyogZGljdGlvbmFyeSBibG9jayBpbiB0aGUgaGVhcC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAvKiBmaXJzdCBvZiBhbGwsIGxvb2sgYXQgdGhlIGBlZXhlYycga2V5d29yZCAqLwotICAgICAgRlRfQnl0ZSogICAgY3VyICAgPSBwYXJzZXItPmJhc2VfZGljdDsKLSAgICAgIEZUX0J5dGUqICAgIGxpbWl0ID0gY3VyICsgcGFyc2VyLT5iYXNlX2xlbjsKLSAgICAgIEZUX1BvaW50ZXIgIHBvc19sZjsKLSAgICAgIEZUX0Jvb2wgICAgIHRlc3RfY3I7Ci0KLQotICAgIEFnYWluOgotICAgICAgZm9yICg7OykKLSAgICAgIHsKLSAgICAgICAgaWYgKCBjdXJbMF0gPT0gJ2UnICAgJiYKLSAgICAgICAgICAgICBjdXIgKyA5IDwgbGltaXQgKSAgICAgIC8qIDkgPSA1IGxldHRlcnMgZm9yIGBlZXhlYycgKyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2hpdGVzcGFjZSArIDQgY2hhcnMgICAgICAgICovCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoIGN1clsxXSA9PSAnZScgJiYKLSAgICAgICAgICAgICAgIGN1clsyXSA9PSAneCcgJiYKLSAgICAgICAgICAgICAgIGN1clszXSA9PSAnZScgJiYKLSAgICAgICAgICAgICAgIGN1cls0XSA9PSAnYycgKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY3VyKys7Ci0gICAgICAgIGlmICggY3VyID49IGxpbWl0ICkKLSAgICAgICAgewotICAgICAgICAgIEZUX0VSUk9SKCggIlQxX0dldF9Qcml2YXRlX0RpY3Q6IgotICAgICAgICAgICAgICAgICAgICAgIiBjb3VsZCBub3QgZmluZCBgZWV4ZWMnIGtleXdvcmRcbiIgKSk7Ci0gICAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKiBjaGVjayB3aGV0aGVyIGBlZXhlYycgd2FzIHJlYWwgLS0gaXQgY291bGQgYmUgaW4gYSBjb21tZW50ICovCi0gICAgICAvKiBvciBzdHJpbmcgKGFzIGUuZy4gaW4gdTAwMzA0M3QuZ3NmIGZyb20gZ2hvc3RzY3JpcHQpICAgICAgICovCi0KLSAgICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgPSBwYXJzZXItPmJhc2VfZGljdDsKLSAgICAgIC8qIHNldCBsaW1pdCB0byBgZWV4ZWMnICsgd2hpdGVzcGFjZSArIDQgY2hhcmFjdGVycyAqLwotICAgICAgcGFyc2VyLT5yb290LmxpbWl0ICA9IGN1ciArIDEwOwotCi0gICAgICBjdXIgICA9IHBhcnNlci0+cm9vdC5jdXJzb3I7Ci0gICAgICBsaW1pdCA9IHBhcnNlci0+cm9vdC5saW1pdDsKLQotICAgICAgd2hpbGUgKCBjdXIgPCBsaW1pdCApCi0gICAgICB7Ci0gICAgICAgIGlmICggY3VyWzBdID09ICdlJyAgICYmCi0gICAgICAgICAgICAgY3VyICsgNSA8IGxpbWl0ICkKLSAgICAgICAgewotICAgICAgICAgIGlmICggY3VyWzFdID09ICdlJyAmJgotICAgICAgICAgICAgICAgY3VyWzJdID09ICd4JyAmJgotICAgICAgICAgICAgICAgY3VyWzNdID09ICdlJyAmJgotICAgICAgICAgICAgICAgY3VyWzRdID09ICdjJyApCi0gICAgICAgICAgICBnb3RvIEZvdW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgVDFfU2tpcF9QU19Ub2tlbiggcGFyc2VyICk7Ci0gICAgICAgIGlmICggcGFyc2VyLT5yb290LmVycm9yICkKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgVDFfU2tpcF9TcGFjZXMgICggcGFyc2VyICk7Ci0gICAgICAgIGN1ciA9IHBhcnNlci0+cm9vdC5jdXJzb3I7Ci0gICAgICB9Ci0KLSAgICAgIC8qIHdlIGhhdmVuJ3QgZm91bmQgdGhlIGNvcnJlY3QgYGVleGVjJzsgZ28gYmFjayBhbmQgY29udGludWUgKi8KLSAgICAgIC8qIHNlYXJjaGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgY3VyICAgPSBsaW1pdDsKLSAgICAgIGxpbWl0ID0gcGFyc2VyLT5iYXNlX2RpY3QgKyBwYXJzZXItPmJhc2VfbGVuOwotCi0gICAgICBpZiAoIGN1ciA+PSBsaW1pdCApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggIlQxX0dldF9Qcml2YXRlX0RpY3Q6IgotICAgICAgICAgICAgICAgICAgICIgcHJlbWF0dXJlIGVuZCBpbiBwcml2YXRlIGRpY3Rpb25hcnlcbiIgKSk7Ci0gICAgICAgIGVycm9yID0gRlRfVEhST1coIEludmFsaWRfRmlsZV9Gb3JtYXQgKTsKLSAgICAgICAgZ290byBFeGl0OwotICAgICAgfQotCi0gICAgICBnb3RvIEFnYWluOwotCi0gICAgICAvKiBub3cgZGV0ZXJtaW5lIHdoZXJlIHRvIHdyaXRlIHRoZSBfZW5jcnlwdGVkXyBiaW5hcnkgcHJpdmF0ZSAgKi8KLSAgICAgIC8qIGRpY3Rpb25hcnkuICBXZSBvdmVyd3JpdGUgdGhlIGJhc2UgZGljdGlvbmFyeSBmb3IgZGlzay1iYXNlZCAqLwotICAgICAgLyogcmVzb3VyY2VzIGFuZCBhbGxvY2F0ZSBhIG5ldyBibG9jayBvdGhlcndpc2UgICAgICAgICAgICAgICAgICovCi0KLSAgICBGb3VuZDoKLSAgICAgIHBhcnNlci0+cm9vdC5saW1pdCA9IHBhcnNlci0+YmFzZV9kaWN0ICsgcGFyc2VyLT5iYXNlX2xlbjsKLQotICAgICAgVDFfU2tpcF9QU19Ub2tlbiggcGFyc2VyICk7Ci0gICAgICBjdXIgICA9IHBhcnNlci0+cm9vdC5jdXJzb3I7Ci0gICAgICBsaW1pdCA9IHBhcnNlci0+cm9vdC5saW1pdDsKLQotICAgICAgLyogQWNjb3JkaW5nIHRvIHRoZSBUeXBlIDEgc3BlYywgdGhlIGZpcnN0IGNpcGhlciBieXRlIG11c3Qgbm90IGJlICovCi0gICAgICAvKiBhbiBBU0NJSSB3aGl0ZXNwYWNlIGNoYXJhY3RlciBjb2RlIChibGFuaywgdGFiLCBjYXJyaWFnZSByZXR1cm4gKi8KLSAgICAgIC8qIG9yIGxpbmUgZmVlZCkuICBXZSBoYXZlIHNlZW4gVHlwZSAxIGZvbnRzIHdpdGggdHdvIGxpbmUgZmVlZCAgICAqLwotICAgICAgLyogY2hhcmFjdGVycy4uLiAgU28gc2tpcCBub3cgYWxsIHdoaXRlc3BhY2UgY2hhcmFjdGVyIGNvZGVzLiAgICAgICovCi0gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgIC8qIE9uIHRoZSBvdGhlciBoYW5kLCBBZG9iZSdzIFR5cGUgMSBwYXJzZXIgaGFuZGxlcyBmb250cyBqdXN0ICAgICAqLwotICAgICAgLyogZmluZSB0aGF0IGFyZSB2aW9sYXRpbmcgdGhpcyBsaW1pdGF0aW9uLCBzbyB3ZSBhZGQgYSBoZXVyaXN0aWMgICovCi0gICAgICAvKiB0ZXN0IHRvIHN0b3AgYXQgXHIgb25seSBpZiBpdCBpcyBub3QgdXNlZCBmb3IgRU9MLiAgICAgICAgICAgICAgKi8KLQotICAgICAgcG9zX2xmICA9IGZ0X21lbWNociggY3VyLCAnXG4nLCAoc2l6ZV90KSggbGltaXQgLSBjdXIgKSApOwotICAgICAgdGVzdF9jciA9IEZUX0JPT0woICFwb3NfbGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICAgICAgICAgIHBvc19sZiA+IGZ0X21lbWNociggY3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xyJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpKCBsaW1pdCAtIGN1ciApICkgKTsKLQotICAgICAgd2hpbGUgKCBjdXIgPCBsaW1pdCAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgICAgKCAqY3VyID09ICcgJyAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgICpjdXIgPT0gJ1x0JyAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAgICAgKHRlc3RfY3IgJiYgKmN1ciA9PSAnXHInICkgfHwKLSAgICAgICAgICAgICAgICAqY3VyID09ICdcbicgICAgICAgICAgICAgICApICkKLSAgICAgICAgKytjdXI7Ci0gICAgICBpZiAoIGN1ciA+PSBsaW1pdCApCi0gICAgICB7Ci0gICAgICAgIEZUX0VSUk9SKCggIlQxX0dldF9Qcml2YXRlX0RpY3Q6IgotICAgICAgICAgICAgICAgICAgICIgYGVleGVjJyBub3QgcHJvcGVybHkgdGVybWluYXRlZFxuIiApKTsKLSAgICAgICAgZXJyb3IgPSBGVF9USFJPVyggSW52YWxpZF9GaWxlX0Zvcm1hdCApOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICB9Ci0KLSAgICAgIHNpemUgPSBwYXJzZXItPmJhc2VfbGVuIC0gKEZUX1VMb25nKSggY3VyIC0gcGFyc2VyLT5iYXNlX2RpY3QgKTsKLQotICAgICAgaWYgKCBwYXJzZXItPmluX21lbW9yeSApCi0gICAgICB7Ci0gICAgICAgIC8qIG5vdGUgdGhhdCB3ZSBhbGxvY2F0ZSBvbmUgbW9yZSBieXRlIHRvIHB1dCBhIHRlcm1pbmF0aW5nIGAwJyAqLwotICAgICAgICBpZiAoIEZUX0FMTE9DKCBwYXJzZXItPnByaXZhdGVfZGljdCwgc2l6ZSArIDEgKSApCi0gICAgICAgICAgZ290byBGYWlsOwotICAgICAgICBwYXJzZXItPnByaXZhdGVfbGVuID0gc2l6ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcGFyc2VyLT5zaW5nbGVfYmxvY2sgPSAxOwotICAgICAgICBwYXJzZXItPnByaXZhdGVfZGljdCA9IHBhcnNlci0+YmFzZV9kaWN0OwotICAgICAgICBwYXJzZXItPnByaXZhdGVfbGVuICA9IHNpemU7Ci0gICAgICAgIHBhcnNlci0+YmFzZV9kaWN0ICAgID0gTlVMTDsKLSAgICAgICAgcGFyc2VyLT5iYXNlX2xlbiAgICAgPSAwOwotICAgICAgfQotCi0gICAgICAvKiBub3cgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHByaXZhdGUgZGljdGlvbmFyeSBpcyBlbmNvZGVkIGluIGJpbmFyeSAqLwotICAgICAgLyogb3IgaGV4YWRlY2ltYWwgQVNDSUkgZm9ybWF0IC0tIGRlY29kZSBpdCBhY2NvcmRpbmdseSAgICAgICAgICAgICAgKi8KLQotICAgICAgLyogd2UgbmVlZCB0byBhY2Nlc3MgdGhlIG5leHQgNCBieXRlcyAoYWZ0ZXIgdGhlIGZpbmFsIHdoaXRlc3BhY2UgKi8KLSAgICAgIC8qIGZvbGxvd2luZyB0aGUgYGVleGVjJyBrZXl3b3JkKTsgaWYgdGhleSBhbGwgYXJlIGhleGFkZWNpbWFsICAgICovCi0gICAgICAvKiBkaWdpdHMsIHRoZW4gd2UgaGF2ZSBhIGNhc2Ugb2YgQVNDSUkgc3RvcmFnZSAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICBpZiAoIGN1ciArIDMgPCBsaW1pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYKLSAgICAgICAgICAgZnRfaXN4ZGlnaXQoIGN1clswXSApICYmIGZ0X2lzeGRpZ2l0KCBjdXJbMV0gKSAmJgotICAgICAgICAgICBmdF9pc3hkaWdpdCggY3VyWzJdICkgJiYgZnRfaXN4ZGlnaXQoIGN1clszXSApICkKLSAgICAgIHsKLSAgICAgICAgLyogQVNDSUkgaGV4YWRlY2ltYWwgZW5jb2RpbmcgKi8KLSAgICAgICAgRlRfVUxvbmcgIGxlbjsKLQotCi0gICAgICAgIHBhcnNlci0+cm9vdC5jdXJzb3IgPSBjdXI7Ci0gICAgICAgICh2b2lkKXBzYXV4LT5wc19wYXJzZXJfZnVuY3MtPnRvX2J5dGVzKCAmcGFyc2VyLT5yb290LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLT5wcml2YXRlX2RpY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXItPnByaXZhdGVfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgKTsKLSAgICAgICAgcGFyc2VyLT5wcml2YXRlX2xlbiA9IGxlbjsKLQotICAgICAgICAvKiBwdXQgYSBzYWZlZ3VhcmQgKi8KLSAgICAgICAgcGFyc2VyLT5wcml2YXRlX2RpY3RbbGVuXSA9ICdcMCc7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgIC8qIGJpbmFyeSBlbmNvZGluZyAtLSBjb3B5IHRoZSBwcml2YXRlIGRpY3QgKi8KLSAgICAgICAgRlRfTUVNX01PVkUoIHBhcnNlci0+cHJpdmF0ZV9kaWN0LCBjdXIsIHNpemUgKTsKLSAgICB9Ci0KLSAgICAvKiB3ZSBub3cgZGVjcnlwdCB0aGUgZW5jb2RlZCBiaW5hcnkgcHJpdmF0ZSBkaWN0aW9uYXJ5ICovCi0gICAgcHNhdXgtPnQxX2RlY3J5cHQoIHBhcnNlci0+cHJpdmF0ZV9kaWN0LCBwYXJzZXItPnByaXZhdGVfbGVuLCA1NTY2NVUgKTsKLQotICAgIGlmICggcGFyc2VyLT5wcml2YXRlX2xlbiA8IDQgKQotICAgIHsKLSAgICAgIEZUX0VSUk9SKCggIlQxX0dldF9Qcml2YXRlX0RpY3Q6IgotICAgICAgICAgICAgICAgICAiIGludmFsaWQgcHJpdmF0ZSBkaWN0aW9uYXJ5IHNlY3Rpb25cbiIgKSk7Ci0gICAgICBlcnJvciA9IEZUX1RIUk9XKCBJbnZhbGlkX0ZpbGVfRm9ybWF0ICk7Ci0gICAgICBnb3RvIEZhaWw7Ci0gICAgfQotCi0gICAgLyogcmVwbGFjZSB0aGUgZm91ciByYW5kb20gYnl0ZXMgYXQgdGhlIGJlZ2lubmluZyB3aXRoIHdoaXRlc3BhY2UgKi8KLSAgICBwYXJzZXItPnByaXZhdGVfZGljdFswXSA9ICcgJzsKLSAgICBwYXJzZXItPnByaXZhdGVfZGljdFsxXSA9ICcgJzsKLSAgICBwYXJzZXItPnByaXZhdGVfZGljdFsyXSA9ICcgJzsKLSAgICBwYXJzZXItPnByaXZhdGVfZGljdFszXSA9ICcgJzsKLQotICAgIHBhcnNlci0+cm9vdC5iYXNlICAgPSBwYXJzZXItPnByaXZhdGVfZGljdDsKLSAgICBwYXJzZXItPnJvb3QuY3Vyc29yID0gcGFyc2VyLT5wcml2YXRlX2RpY3Q7Ci0gICAgcGFyc2VyLT5yb290LmxpbWl0ICA9IHBhcnNlci0+cm9vdC5jdXJzb3IgKyBwYXJzZXItPnByaXZhdGVfbGVuOwotCi0gIEZhaWw6Ci0gIEV4aXQ6Ci0gICAgcmV0dXJuIGVycm9yOwotICB9Ci0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFwYXJzZS5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxcGFyc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiMDJlMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9mcmVldHlwZS9zcmMvdHlwZTEvdDFwYXJzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHQxcGFyc2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUeXBlIDEgcGFyc2VyIChzcGVjaWZpY2F0aW9uKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb3B5cmlnaHQgMTk5Ni0yMDE1IGJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGF2aWQgVHVybmVyLCBSb2JlcnQgV2lsaGVsbSwgYW5kIFdlcm5lciBMZW1iZXJnLiAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCwgYW5kIG1heSBvbmx5IGJlIHVzZWQsICAgICAgICovCi0vKiAgbW9kaWZpZWQsIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgICAgICAqLwotLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLS8qICB0aGlzIGZpbGUgeW91IGluZGljYXRlIHRoYXQgeW91IGhhdmUgcmVhZCB0aGUgbGljZW5zZSBhbmQgICAgICAgICAgICAgICovCi0vKiAgdW5kZXJzdGFuZCBhbmQgYWNjZXB0IGl0IGZ1bGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2lmbmRlZiBfX1QxUEFSU0VfSF9fCi0jZGVmaW5lIF9fVDFQQVJTRV9IX18KLQotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1RZUEUxX1RZUEVTX0gKLSNpbmNsdWRlIEZUX0lOVEVSTkFMX1NUUkVBTV9ICi0KLQotRlRfQkVHSU5fSEVBREVSCi0KLQotICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxTdHJ1Y3Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBUMV9QYXJzZXJSZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qIDxEZXNjcmlwdGlvbj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBBIFBTX1BhcnNlclJlYyBpcyBhbiBvYmplY3QgdXNlZCB0byBwYXJzZSBhIFR5cGUgMSBmb250cyB2ZXJ5ICAgICAgKi8KLSAgLyogICAgcXVpY2tseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiA8RmllbGRzPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgcm9vdCAgICAgICAgIDo6IFRoZSByb290IHBhcnNlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzdHJlYW0gICAgICAgOjogVGhlIGN1cnJlbnQgaW5wdXQgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIGJhc2VfZGljdCAgICA6OiBBIHBvaW50ZXIgdG8gdGhlIHRvcC1sZXZlbCBkaWN0aW9uYXJ5LiAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgYmFzZV9sZW4gICAgIDo6IFRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIHRvcCBkaWN0aW9uYXJ5LiAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBwcml2YXRlX2RpY3QgOjogQSBwb2ludGVyIHRvIHRoZSBwcml2YXRlIGRpY3Rpb25hcnkuICAgICAgICAgICAgICAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gIC8qICAgIHByaXZhdGVfbGVuICA6OiBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBwcml2YXRlIGRpY3Rpb25hcnkuICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW5fcGZiICAgICAgIDo6IEEgYm9vbGVhbi4gIEluZGljYXRlcyB0aGF0IHdlIGFyZSBoYW5kbGluZyBhIFBGQiAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgLyogICAgaW5fbWVtb3J5ICAgIDo6IEEgYm9vbGVhbi4gIEluZGljYXRlcyBhIG1lbW9yeS1iYXNlZCBzdHJlYW0uICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAvKiAgICBzaW5nbGVfYmxvY2sgOjogQSBib29sZWFuLiAgSW5kaWNhdGVzIHRoYXQgdGhlIHByaXZhdGUgZGljdGlvbmFyeSAgKi8KLSAgLyogICAgICAgICAgICAgICAgICAgIGlzIHN0b3JlZCBpbiBsaWV1IG9mIHRoZSBiYXNlIGRpY3Rpb25hcnkuICAgICAgICAgICovCi0gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICB0eXBlZGVmIHN0cnVjdCAgVDFfUGFyc2VyUmVjXwotICB7Ci0gICAgUFNfUGFyc2VyUmVjICByb290OwotICAgIEZUX1N0cmVhbSAgICAgc3RyZWFtOwotCi0gICAgRlRfQnl0ZSogICAgICBiYXNlX2RpY3Q7Ci0gICAgRlRfVUxvbmcgICAgICBiYXNlX2xlbjsKLQotICAgIEZUX0J5dGUqICAgICAgcHJpdmF0ZV9kaWN0OwotICAgIEZUX1VMb25nICAgICAgcHJpdmF0ZV9sZW47Ci0KLSAgICBGVF9Cb29sICAgICAgIGluX3BmYjsKLSAgICBGVF9Cb29sICAgICAgIGluX21lbW9yeTsKLSAgICBGVF9Cb29sICAgICAgIHNpbmdsZV9ibG9jazsKLQotICB9IFQxX1BhcnNlclJlYywgKlQxX1BhcnNlcjsKLQotCi0jZGVmaW5lIFQxX0FkZF9UYWJsZSggcCwgaSwgbywgbCApICAocCktPmZ1bmNzLmFkZCggKHApLCBpLCBvLCBsICkKLSNkZWZpbmUgVDFfUmVsZWFzZV9UYWJsZSggcCApICAgICAgICAgIFwKLSAgICAgICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGlmICggKHApLT5mdW5jcy5yZWxlYXNlICkgIFwKLSAgICAgICAgICAgICAgKHApLT5mdW5jcy5yZWxlYXNlKCBwICk7IFwKLSAgICAgICAgICB9IHdoaWxlICggMCApCi0KLQotI2RlZmluZSBUMV9Ta2lwX1NwYWNlcyggcCApICAgIChwKS0+cm9vdC5mdW5jcy5za2lwX3NwYWNlcyggJihwKS0+cm9vdCApCi0jZGVmaW5lIFQxX1NraXBfUFNfVG9rZW4oIHAgKSAgKHApLT5yb290LmZ1bmNzLnNraXBfUFNfdG9rZW4oICYocCktPnJvb3QgKQotCi0jZGVmaW5lIFQxX1RvSW50KCBwICkgICAgICAgKHApLT5yb290LmZ1bmNzLnRvX2ludCggJihwKS0+cm9vdCApCi0jZGVmaW5lIFQxX1RvRml4ZWQoIHAsIHQgKSAgKHApLT5yb290LmZ1bmNzLnRvX2ZpeGVkKCAmKHApLT5yb290LCB0ICkKLQotI2RlZmluZSBUMV9Ub0Nvb3JkQXJyYXkoIHAsIG0sIGMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAocCktPnJvb3QuZnVuY3MudG9fY29vcmRfYXJyYXkoICYocCktPnJvb3QsIG0sIGMgKQotI2RlZmluZSBUMV9Ub0ZpeGVkQXJyYXkoIHAsIG0sIGYsIHQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAocCktPnJvb3QuZnVuY3MudG9fZml4ZWRfYXJyYXkoICYocCktPnJvb3QsIG0sIGYsIHQgKQotI2RlZmluZSBUMV9Ub1Rva2VuKCBwLCB0ICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAocCktPnJvb3QuZnVuY3MudG9fdG9rZW4oICYocCktPnJvb3QsIHQgKQotI2RlZmluZSBUMV9Ub1Rva2VuQXJyYXkoIHAsIHQsIG0sIGMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAocCktPnJvb3QuZnVuY3MudG9fdG9rZW5fYXJyYXkoICYocCktPnJvb3QsIHQsIG0sIGMgKQotCi0jZGVmaW5lIFQxX0xvYWRfRmllbGQoIHAsIGYsIG8sIG0sIHBmICkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIChwKS0+cm9vdC5mdW5jcy5sb2FkX2ZpZWxkKCAmKHApLT5yb290LCBmLCBvLCBtLCBwZiApCi0KLSNkZWZpbmUgVDFfTG9hZF9GaWVsZF9UYWJsZSggcCwgZiwgbywgbSwgcGYgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgKHApLT5yb290LmZ1bmNzLmxvYWRfZmllbGRfdGFibGUoICYocCktPnJvb3QsIGYsIG8sIG0sIHBmICkKLQotCi0gIEZUX0xPQ0FMKCBGVF9FcnJvciApCi0gIFQxX05ld19QYXJzZXIoIFQxX1BhcnNlciAgICAgIHBhcnNlciwKLSAgICAgICAgICAgICAgICAgRlRfU3RyZWFtICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICBGVF9NZW1vcnkgICAgICBtZW1vcnksCi0gICAgICAgICAgICAgICAgIFBTQXV4X1NlcnZpY2UgIHBzYXV4ICk7Ci0KLSAgRlRfTE9DQUwoIEZUX0Vycm9yICkKLSAgVDFfR2V0X1ByaXZhdGVfRGljdCggVDFfUGFyc2VyICAgICAgcGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICBQU0F1eF9TZXJ2aWNlICBwc2F1eCApOwotCi0gIEZUX0xPQ0FMKCB2b2lkICkKLSAgVDFfRmluYWxpemVfUGFyc2VyKCBUMV9QYXJzZXIgIHBhcnNlciApOwotCi0KLUZUX0VORF9IRUFERVIKLQotI2VuZGlmIC8qIF9fVDFQQVJTRV9IX18gKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90MXRva2Vucy5oIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxdG9rZW5zLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OTI2NTIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3QxdG9rZW5zLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdDF0b2tlbnMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFR5cGUgMSB0b2tlbml6ZXIgKHNwZWNpZmljYXRpb24pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvcHlyaWdodCAxOTk2LTIwMTUgYnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEYXZpZCBUdXJuZXIsIFJvYmVydCBXaWxoZWxtLCBhbmQgV2VybmVyIExlbWJlcmcuICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLS8qICBtb2RpZmllZCwgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCAgICAgICovCi0vKiAgbGljZW5zZSwgTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlICAgICAqLwotLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLS8qICB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQgZnVsbHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFBTX0ZvbnRJbmZvUmVjCi0jdW5kZWYgIFQxQ09ERQotI2RlZmluZSBUMUNPREUgICAgICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0ZPTlRfSU5GTwotCi0gIFQxX0ZJRUxEX1NUUklORyggInZlcnNpb24iLCAgICAgICAgICAgIHZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9GT05URElDVCApCi0gIFQxX0ZJRUxEX1NUUklORyggIk5vdGljZSIsICAgICAgICAgICAgIG5vdGljZSwKLSAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX0ZPTlRESUNUICkKLSAgVDFfRklFTERfU1RSSU5HKCAiRnVsbE5hbWUiLCAgICAgICAgICAgZnVsbF9uYW1lLAotICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfRk9OVERJQ1QgKQotICBUMV9GSUVMRF9TVFJJTkcoICJGYW1pbHlOYW1lIiwgICAgICAgICBmYW1pbHlfbmFtZSwKLSAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX0ZPTlRESUNUICkKLSAgVDFfRklFTERfU1RSSU5HKCAiV2VpZ2h0IiwgICAgICAgICAgICAgd2VpZ2h0LAotICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfRk9OVERJQ1QgKQotCi0gIC8qIHdlIHVzZSBwb2ludGVycyB0byBkZXRlY3QgbW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHN5bnRoZXRpYyBmb250cyAqLwotICBUMV9GSUVMRF9OVU0gICAoICJJdGFsaWNBbmdsZSIsICAgICAgICBpdGFsaWNfYW5nbGUsCi0gICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9GT05URElDVCApCi0gIFQxX0ZJRUxEX0JPT0wgICggImlzRml4ZWRQaXRjaCIsICAgICAgIGlzX2ZpeGVkX3BpdGNoLAotICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfRk9OVERJQ1QgKQotICBUMV9GSUVMRF9OVU0gICAoICJVbmRlcmxpbmVQb3NpdGlvbiIsICB1bmRlcmxpbmVfcG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9GT05URElDVCApCi0gIFQxX0ZJRUxEX05VTSAgICggIlVuZGVybGluZVRoaWNrbmVzcyIsIHVuZGVybGluZV90aGlja25lc3MsCi0gICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9GT05URElDVCApCi0KLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgUFNfRm9udEV4dHJhUmVjCi0jdW5kZWYgIFQxQ09ERQotI2RlZmluZSBUMUNPREUgICAgICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0ZPTlRfRVhUUkEKLQotICBUMV9GSUVMRF9OVU0gICAoICJGU1R5cGUiLCBmc190eXBlLAotICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfRk9OVERJQ1QgKQotCi0jdW5kZWYgIEZUX1NUUlVDVFVSRQotI2RlZmluZSBGVF9TVFJVQ1RVUkUgIFBTX1ByaXZhdGVSZWMKLSN1bmRlZiAgVDFDT0RFCi0jZGVmaW5lIFQxQ09ERSAgICAgICAgVDFfRklFTERfTE9DQVRJT05fUFJJVkFURQotCi0gIFQxX0ZJRUxEX05VTSAgICAgICAoICJVbmlxdWVJRCIsICAgICAgICAgdW5pcXVlX2lkLAotICAgICAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX0ZPTlRESUNUIHwgVDFfRklFTERfRElDVF9QUklWQVRFICkKLSAgVDFfRklFTERfTlVNICAgICAgICggImxlbklWIiwgICAgICAgICAgICBsZW5JViwKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9QUklWQVRFICkKLSAgVDFfRklFTERfTlVNICAgICAgICggIkxhbmd1YWdlR3JvdXAiLCAgICBsYW5ndWFnZV9ncm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9QUklWQVRFICkKLSAgVDFfRklFTERfTlVNICAgICAgICggInBhc3N3b3JkIiwgICAgICAgICBwYXNzd29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9QUklWQVRFICkKLQotICBUMV9GSUVMRF9GSVhFRF8xMDAwKCAiQmx1ZVNjYWxlIiwgICAgICAgIGJsdWVfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfUFJJVkFURSApCi0gIFQxX0ZJRUxEX05VTSAgICAgICAoICJCbHVlU2hpZnQiLCAgICAgICAgYmx1ZV9zaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9QUklWQVRFICkKLSAgVDFfRklFTERfTlVNICAgICAgICggIkJsdWVGdXp6IiwgICAgICAgICBibHVlX2Z1enosCi0gICAgICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfUFJJVkFURSApCi0KLSAgVDFfRklFTERfTlVNX1RBQkxFICggIkJsdWVWYWx1ZXMiLCAgICAgICBibHVlX3ZhbHVlcywgICAgICAgIDE0LAotICAgICAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX1BSSVZBVEUgKQotICBUMV9GSUVMRF9OVU1fVEFCTEUgKCAiT3RoZXJCbHVlcyIsICAgICAgIG90aGVyX2JsdWVzLCAgICAgICAgMTAsCi0gICAgICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfUFJJVkFURSApCi0gIFQxX0ZJRUxEX05VTV9UQUJMRSAoICJGYW1pbHlCbHVlcyIsICAgICAgZmFtaWx5X2JsdWVzLCAgICAgICAxNCwKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9QUklWQVRFICkKLSAgVDFfRklFTERfTlVNX1RBQkxFICggIkZhbWlseU90aGVyQmx1ZXMiLCBmYW1pbHlfb3RoZXJfYmx1ZXMsIDEwLAotICAgICAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX1BSSVZBVEUgKQotCi0gIFQxX0ZJRUxEX05VTV9UQUJMRTIoICJTdGRIVyIsICAgICAgICAgICAgc3RhbmRhcmRfd2lkdGgsICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgVDFfRklFTERfRElDVF9QUklWQVRFICkKLSAgVDFfRklFTERfTlVNX1RBQkxFMiggIlN0ZFZXIiwgICAgICAgICAgICBzdGFuZGFyZF9oZWlnaHQsICAgICAxLAotICAgICAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX1BSSVZBVEUgKQotICBUMV9GSUVMRF9OVU1fVEFCTEUyKCAiTWluRmVhdHVyZSIsICAgICAgIG1pbl9mZWF0dXJlLCAgICAgICAgIDIsCi0gICAgICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfUFJJVkFURSApCi0KLSAgVDFfRklFTERfTlVNX1RBQkxFICggIlN0ZW1TbmFwSCIsICAgICAgICBzbmFwX3dpZHRocywgICAgICAgIDEyLAotICAgICAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX1BSSVZBVEUgKQotICBUMV9GSUVMRF9OVU1fVEFCTEUgKCAiU3RlbVNuYXBWIiwgICAgICAgIHNuYXBfaGVpZ2h0cywgICAgICAgMTIsCi0gICAgICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfUFJJVkFURSApCi0KLSAgVDFfRklFTERfRklYRUQgICAgICggIkV4cGFuc2lvbkZhY3RvciIsICBleHBhbnNpb25fZmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICBUMV9GSUVMRF9ESUNUX1BSSVZBVEUgKQotICBUMV9GSUVMRF9CT09MICAgICAgKCAiRm9yY2VCb2xkIiwgICAgICAgIGZvcmNlX2JvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgIFQxX0ZJRUxEX0RJQ1RfUFJJVkFURSApCi0KLQotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBUMV9Gb250UmVjCi0jdW5kZWYgIFQxQ09ERQotI2RlZmluZSBUMUNPREUgICAgICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0ZPTlRfRElDVAotCi0gIFQxX0ZJRUxEX0tFWSAgKCAiRm9udE5hbWUiLCAgICBmb250X25hbWUsICAgIFQxX0ZJRUxEX0RJQ1RfRk9OVERJQ1QgKQotICBUMV9GSUVMRF9OVU0gICggIlBhaW50VHlwZSIsICAgcGFpbnRfdHlwZSwgICBUMV9GSUVMRF9ESUNUX0ZPTlRESUNUICkKLSAgVDFfRklFTERfTlVNICAoICJGb250VHlwZSIsICAgIGZvbnRfdHlwZSwgICAgVDFfRklFTERfRElDVF9GT05URElDVCApCi0gIFQxX0ZJRUxEX0ZJWEVEKCAiU3Ryb2tlV2lkdGgiLCBzdHJva2Vfd2lkdGgsIFQxX0ZJRUxEX0RJQ1RfRk9OVERJQ1QgKQotCi0KLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgRlRfQkJveAotI3VuZGVmICBUMUNPREUKLSNkZWZpbmUgVDFDT0RFICAgICAgICBUMV9GSUVMRF9MT0NBVElPTl9CQk9YCi0KLSAgVDFfRklFTERfQkJPWCggIkZvbnRCQm94IiwgeE1pbiwgVDFfRklFTERfRElDVF9GT05URElDVCApCi0KLQotI2lmbmRlZiBUMV9DT05GSUdfT1BUSU9OX05PX01NX1NVUFBPUlQKLQotI3VuZGVmICBGVF9TVFJVQ1RVUkUKLSNkZWZpbmUgRlRfU1RSVUNUVVJFICBUMV9GYWNlUmVjCi0jdW5kZWYgIFQxQ09ERQotI2RlZmluZSBUMUNPREUgICAgICAgIFQxX0ZJRUxEX0xPQ0FUSU9OX0ZBQ0UKLQotICBUMV9GSUVMRF9OVU0oICJORFYiLCBuZHZfaWR4LCBUMV9GSUVMRF9ESUNUX1BSSVZBVEUgKQotICBUMV9GSUVMRF9OVU0oICJDRFYiLCBjZHZfaWR4LCBUMV9GSUVMRF9ESUNUX1BSSVZBVEUgKQotCi0KLSN1bmRlZiAgRlRfU1RSVUNUVVJFCi0jZGVmaW5lIEZUX1NUUlVDVFVSRSAgUFNfQmxlbmRSZWMKLSN1bmRlZiAgVDFDT0RFCi0jZGVmaW5lIFQxQ09ERSAgICAgICAgVDFfRklFTERfTE9DQVRJT05fQkxFTkQKLQotICBUMV9GSUVMRF9OVU1fVEFCTEUoICJEZXNpZ25WZWN0b3IiLCBkZWZhdWx0X2Rlc2lnbl92ZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgVDFfTUFYX01NX0RFU0lHTlMsIFQxX0ZJRUxEX0RJQ1RfRk9OVERJQ1QgKQotCi0KLSNlbmRpZiAvKiBUMV9DT05GSUdfT1BUSU9OX05PX01NX1NVUFBPUlQgKi8KLQotCi0vKiBFTkQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZyZWV0eXBlL3NyYy90eXBlMS90eXBlMS5jIGIvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3R5cGUxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNzBlYTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvZnJlZXR5cGUvc3JjL3R5cGUxL3R5cGUxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0eXBlMS5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgRnJlZVR5cGUgVHlwZSAxIGRyaXZlciBjb21wb25lbnQgKGJvZHkgb25seSkuICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ29weXJpZ2h0IDE5OTYtMjAxNSBieSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QsIGFuZCBtYXkgb25seSBiZSB1c2VkLCAgICAgICAqLwotLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLS8qICBsaWNlbnNlLCBMSUNFTlNFLlRYVC4gIEJ5IGNvbnRpbnVpbmcgdG8gdXNlLCBtb2RpZnksIG9yIGRpc3RyaWJ1dGUgICAgICovCi0vKiAgdGhpcyBmaWxlIHlvdSBpbmRpY2F0ZSB0aGF0IHlvdSBoYXZlIHJlYWQgdGhlIGxpY2Vuc2UgYW5kICAgICAgICAgICAgICAqLwotLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNkZWZpbmUgRlRfTUFLRV9PUFRJT05fU0lOR0xFX09CSkVDVAotCi0jaW5jbHVkZSA8ZnQyYnVpbGQuaD4KLSNpbmNsdWRlICJ0MXBhcnNlLmMiCi0jaW5jbHVkZSAidDFsb2FkLmMiCi0jaW5jbHVkZSAidDFvYmpzLmMiCi0jaW5jbHVkZSAidDFkcml2ZXIuYyIKLSNpbmNsdWRlICJ0MWdsb2FkLmMiCi0KLSNpZm5kZWYgVDFfQ09ORklHX09QVElPTl9OT19BRk0KLSNpbmNsdWRlICJ0MWFmbS5jIgotI2VuZGlmCi0KLQotLyogRU5EICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zLzAwMDAtY21zZXJyLWNoYW5nZXMucGF0Y2ggYi90aGlyZF9wYXJ0eS9sY21zLzAwMDAtY21zZXJyLWNoYW5nZXMucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmMzU3NwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvMDAwMC1jbXNlcnItY2hhbmdlcy5wYXRjaApAQCAtMCwwICsxLDI4NSBAQAorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2Vyci5jIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zZXJyLmMKK2luZGV4IDcwMDE1MmVlMy4uM2MzODQ4YjJhIDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zZXJyLmMKKysrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2Vyci5jCitAQCAtMjUsNiArMjUsOCBAQAorIAorICNpbmNsdWRlICJsY21zMl9pbnRlcm5hbC5oIgorIAorKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgorKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorIAorIC8vIFRoaXMgZnVuY3Rpb24gaXMgaGVyZSB0byBoZWxwIGFwcGxpY2F0aW9ucyB0byBwcmV2ZW50IG1peGluZyBsY21zIHZlcnNpb25zIG9uIGhlYWRlciBhbmQgc2hhcmVkIG9iamVjdHMuCisgaW50IENNU0VYUE9SVCBjbXNHZXRFbmNvZGVkQ01NdmVyc2lvbih2b2lkKQorQEAgLTY1LDE0MCArNjcsNzUgQEAgbG9uZyBpbnQgQ01TRVhQT1JUIGNtc2ZpbGVsZW5ndGgoRklMRSogZikKKyAgICAgcmV0dXJuIG47CisgfQorIAorLQorLS8vIE1lbW9yeSBoYW5kbGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0vLworLS8vIFRoaXMgaXMgdGhlIGludGVyZmFjZSB0byBsb3ctbGV2ZWwgbWVtb3J5IG1hbmFnZW1lbnQgcm91dGluZXMuIEJ5IGRlZmF1bHQgYSBzaW1wbGUKKy0vLyB3cmFwcGluZyB0byBtYWxsb2MvZnJlZS9yZWFsbG9jIGlzIHByb3ZpZGVkLCBhbHRob3VnaCB0aGVyZSBpcyBhIGxpbWl0IG9uIHRoZSBtYXgKKy0vLyBhbW91bnQgb2YgbWVtb3kgdGhhdCBjYW4gYmUgcmVjbGFpbWVkLiBUaGlzIGlzIG1vc3RseSBhcyBhIHNhZmV0eSBmZWF0dXJlIHRvIHByZXZlbnQgCistLy8gYm9ndXMgb3IgZXZpbCBjb2RlIHRvIGFsbG9jYXRlIGh1Z2UgYmxvY2tzIHRoYXQgb3RoZXJ3aXNlIGxjbXMgd291bGQgbmV2ZXIgbmVlZC4KKy0KKy0jZGVmaW5lIE1BWF9NRU1PUllfRk9SX0FMTE9DICAoKGNtc1VJbnQzMk51bWJlcikoMTAyNFUqMTAyNFUqNTEyVSkpCistCistLy8gVXNlciBtYXkgb3ZlcnJpZGUgdGhpcyBiZWhhdmlvdXIgYnkgdXNpbmcgYSBtZW1vcnkgcGx1Zy1pbiwgd2hpY2ggYmFzaWNhbGx5IHJlcGxhY2VzCistLy8gdGhlIGRlZmF1bHQgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zLiBJbiB0aGlzIGNhc2UsIG5vIGNoZWNrIGlzIHBlcmZvcm1lZCBhbmQgaXQKKy0vLyBpcyB1cCB0byB0aGUgcGx1Zy1pbiB3cml0dGVyIHRvIGtlZXAgaW4gdGhlIHNhZmUgc2lkZS4gVGhlcmUgYXJlIG9ubHkgdGhyZWUgZnVuY3Rpb25zCistLy8gcmVxdWlyZWQgdG8gYmUgaW1wbGVtZW50ZWQ6IG1hbGxvYywgcmVhbGxvYyBhbmQgZnJlZSwgYWx0aG91Z2ggdGhlIHVzZXIgbWF5IHdhbnQgdG8KKy0vLyByZXBsYWNlIHRoZSBvcHRpb25hbCBtYWxsb2NaZXJvLCBjYWxsb2MgYW5kIGR1cCBhcyB3ZWxsLgorLQorLWNtc0Jvb2wgICBfY21zUmVnaXN0ZXJNZW1IYW5kbGVyUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOworLQorLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLQorLS8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb24uIEl0IGRvZXMgYSB2ZXJ5IGNvYXJzZQorLS8vIGNoZWNrIG9mIGFtb3V0IG9mIG1lbW9yeSwganVzdCB0byBwcmV2ZW50IGV4cGxvaXRzCistc3RhdGljCistdm9pZCogX2Ntc01hbGxvY0RlZmF1bHRGbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIHNpemUpCisrY21zQm9vbCAgX2Ntc1JlZ2lzdGVyTWVtSGFuZGxlclBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKQorIHsKKy0gICAgaWYgKHNpemUgPiBNQVhfTUVNT1JZX0ZPUl9BTExPQykgcmV0dXJuIE5VTEw7ICAvLyBOZXZlciBhbGxvdyBvdmVyIG1heGltdW0KKy0KKy0gICAgcmV0dXJuICh2b2lkKikgbWFsbG9jKHNpemUpOworKyAgICByZXR1cm4gVFJVRTsKKyt9CisgCistICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoQ29udGV4dElEKTsKKysvLyBHZW5lcmljIGFsbG9jYXRlCisrdm9pZCogQ01TRVhQT1JUIF9jbXNNYWxsb2MoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBzaXplKQorK3sKKysgICAgcmV0dXJuIEZYTUVNX0RlZmF1bHRBbGxvYyhzaXplKTsKKyB9CisgCisgLy8gR2VuZXJpYyBhbGxvY2F0ZSAmIHplcm8KKy1zdGF0aWMKKy12b2lkKiBfY21zTWFsbG9jWmVyb0RlZmF1bHRGbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIHNpemUpCisrdm9pZCogQ01TRVhQT1JUIF9jbXNNYWxsb2NaZXJvKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgc2l6ZSkKKyB7CistICAgIHZvaWQgKnB0ID0gX2Ntc01hbGxvYyhDb250ZXh0SUQsIHNpemUpOworLSAgICBpZiAocHQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CistCistICAgIG1lbXNldChwdCwgMCwgc2l6ZSk7CistICAgIHJldHVybiBwdDsKKysgICAgdm9pZCogcCA9IEZYTUVNX0RlZmF1bHRBbGxvYyhzaXplKTsKKysgICAgaWYgKHApIG1lbXNldChwLCAwLCBzaXplKTsKKysgICAgcmV0dXJuIHA7CisgfQorIAorLQorLS8vIFRoZSBkZWZhdWx0IGZyZWUgZnVuY3Rpb24uIFRoZSBvbmx5IGNoZWNrIHByb2Zvcm1lZCBpcyBhZ2FpbnN0IE5VTEwgcG9pbnRlcnMKKy1zdGF0aWMKKy12b2lkIF9jbXNGcmVlRGVmYXVsdEZuKGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkICpQdHIpCisrLy8gR2VuZXJpYyBjYWxsb2MKKyt2b2lkKiBDTVNFWFBPUlQgX2Ntc0NhbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIG51bSwgY21zVUludDMyTnVtYmVyIHNpemUpCisgeworLSAgICAvLyBmcmVlKE5VTEwpIGlzIGRlZmluZWQgYSBuby1vcCBieSBDOTksIHRoZXJlZm9yZSBpdCBpcyBzYWZlIHRvCistICAgIC8vIGF2b2lkIHRoZSBjaGVjaywgYnV0IGl0IGlzIGhlcmUganVzdCBpbiBjYXNlLi4uCistCistICAgIGlmIChQdHIpIGZyZWUoUHRyKTsKKysgICAgY21zVUludDMyTnVtYmVyIHRvdGFsID0gbnVtICogc2l6ZTsKKysgICAgaWYgKHRvdGFsID09IDAgfHwgdG90YWwgLyBzaXplICE9IG51bSB8fCB0b3RhbCA+PSA1MTIgKiAxMDI0ICogMTAyNCkKKysgICAgICAgIHJldHVybiBOVUxMOworIAorLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKENvbnRleHRJRCk7CisrICAgIHJldHVybiBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIG51bSAqIHNpemUpOworIH0KKyAKKy0vLyBUaGUgZGVmYXVsdCByZWFsbG9jIGZ1bmN0aW9uLiBBZ2FpbiBpdCBjaGVja3MgZm9yIGV4cGxvaXRzLiBJZiBQdHIgaXMgTlVMTCwKKy0vLyByZWFsbG9jIGJlaGF2ZXMgdGhlIHNhbWUgd2F5IGFzIG1hbGxvYyBhbmQgYWxsb2NhdGVzIGEgbmV3IGJsb2NrIG9mIHNpemUgYnl0ZXMuCistc3RhdGljCistdm9pZCogX2Ntc1JlYWxsb2NEZWZhdWx0Rm4oY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIHNpemUpCisrLy8gR2VuZXJpYyByZWFsbG9jYXRlCisrdm9pZCogQ01TRVhQT1JUIF9jbXNSZWFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBzaXplKQorIHsKKy0KKy0gICAgaWYgKHNpemUgPiBNQVhfTUVNT1JZX0ZPUl9BTExPQykgcmV0dXJuIE5VTEw7ICAvLyBOZXZlciByZWFsbG9jIG92ZXIgNTEyTWIKKy0KKy0gICAgcmV0dXJuIHJlYWxsb2MoUHRyLCBzaXplKTsKKy0KKy0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihDb250ZXh0SUQpOworKyAgICByZXR1cm4gRlhNRU1fRGVmYXVsdFJlYWxsb2MoUHRyLCBzaXplKTsKKyB9CisgCistCistLy8gVGhlIGRlZmF1bHQgY2FsbG9jIGZ1bmN0aW9uLiBBbGxvY2F0ZXMgYW4gYXJyYXkgb2YgbnVtIGVsZW1lbnRzLCBlYWNoIG9uZSBvZiBzaXplIGJ5dGVzCistLy8gYWxsIG1lbW9yeSBpcyBpbml0aWFsaXplZCB0byB6ZXJvLgorLXN0YXRpYworLXZvaWQqIF9jbXNDYWxsb2NEZWZhdWx0Rm4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBudW0sIGNtc1VJbnQzMk51bWJlciBzaXplKQorKy8vIEdlbmVyaWMgZnJlZSBtZW1vcnkKKyt2b2lkIENNU0VYUE9SVCBfY21zRnJlZShjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogUHRyKQorIHsKKy0gICAgY21zVUludDMyTnVtYmVyIFRvdGFsID0gbnVtICogc2l6ZTsKKy0KKy0gICAgLy8gUHJlc2VydmUgY2FsbG9jIGJlaGF2aW91cgorLSAgICBpZiAoVG90YWwgPT0gMCkgcmV0dXJuIE5VTEw7CistCistICAgIC8vIFNhZmUgY2hlY2sgZm9yIG92ZXJmbG93LgorLSAgICBpZiAobnVtID49IFVJTlRfTUFYIC8gc2l6ZSkgcmV0dXJuIE5VTEw7CistCistICAgIC8vIENoZWNrIGZvciBvdmVyZmxvdworLSAgICBpZiAoVG90YWwgPCBudW0gfHwgVG90YWwgPCBzaXplKSB7CistICAgICAgICByZXR1cm4gTlVMTDsKKy0gICAgfQorLQorLSAgICBpZiAoVG90YWwgPiBNQVhfTUVNT1JZX0ZPUl9BTExPQykgcmV0dXJuIE5VTEw7ICAvLyBOZXZlciBhbGxvYyBvdmVyIDUxMk1iCistCistICAgIHJldHVybiBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIFRvdGFsKTsKKysgICAgaWYgKFB0ciAhPSBOVUxMKSBGWE1FTV9EZWZhdWx0RnJlZShQdHIpOworIH0KKyAKKyAvLyBHZW5lcmljIGJsb2NrIGR1cGxpY2F0aW9uCistc3RhdGljCistdm9pZCogX2Ntc0R1cERlZmF1bHRGbihjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3Qgdm9pZCogT3JnLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSkKKyt2b2lkKiBDTVNFWFBPUlQgX2Ntc0R1cE1lbShjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3Qgdm9pZCogT3JnLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSkKKyB7CistICAgIHZvaWQqIG1lbTsKKy0KKy0gICAgaWYgKHNpemUgPiBNQVhfTUVNT1JZX0ZPUl9BTExPQykgcmV0dXJuIE5VTEw7ICAvLyBOZXZlciBkdXAgb3ZlciA1MTJNYgorLQorLSAgICBtZW0gPSBfY21zTWFsbG9jKENvbnRleHRJRCwgc2l6ZSk7CistCistICAgIGlmIChtZW0gIT0gTlVMTCAmJiBPcmcgIT0gTlVMTCkKKy0gICAgICAgIG1lbW1vdmUobWVtLCBPcmcsIHNpemUpOworLQorLSAgICByZXR1cm4gbWVtOworKyAgICB2b2lkKiBwID0gRlhNRU1fRGVmYXVsdEFsbG9jKHNpemUpOworKyAgICBtZW1tb3ZlKHAsIE9yZywgc2l6ZSk7CisrICAgIHJldHVybiBwOworIH0KKyAKKy0KKy0vLyBQb2ludGVycyB0byBtZW1vcnkgbWFuYWdlciBmdW5jdGlvbnMgaW4gQ29udGV4dDAKKy1fY21zTWVtUGx1Z2luQ2h1bmtUeXBlIF9jbXNNZW1QbHVnaW5DaHVuayA9IHsgX2Ntc01hbGxvY0RlZmF1bHRGbiwgX2Ntc01hbGxvY1plcm9EZWZhdWx0Rm4sIF9jbXNGcmVlRGVmYXVsdEZuLCAKKy0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Ntc1JlYWxsb2NEZWZhdWx0Rm4sIF9jbXNDYWxsb2NEZWZhdWx0Rm4sICAgIF9jbXNEdXBEZWZhdWx0Rm4KKytfY21zTWVtUGx1Z2luQ2h1bmtUeXBlIF9jbXNNZW1QbHVnaW5DaHVuayA9IHtfY21zTWFsbG9jLCBfY21zTWFsbG9jWmVybywgX2Ntc0ZyZWUsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Ntc1JlYWxsb2MsIF9jbXNDYWxsb2MsICAgIF9jbXNEdXBNZW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgCistCistLy8gUmVzZXQgYW5kIGR1cGxpY2F0ZSBtZW1vcnkgbWFuYWdlcgorIHZvaWQgX2Ntc0FsbG9jTWVtUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCisgeworICAgICBfY21zQXNzZXJ0KGN0eCAhPSBOVUxMKTsKKyAKKy0gICAgaWYgKHNyYyAhPSBOVUxMKSB7ICAgIAorKyAgICBpZiAoc3JjICE9IE5VTEwpIHsKKyAKKyAgICAgICAgIC8vIER1cGxpY2F0ZQorLSAgICAgICAgY3R4IC0+Y2h1bmtzW01lbVBsdWdpbl0gPSBfY21zU3ViQWxsb2NEdXAoY3R4IC0+TWVtUG9vbCwgc3JjIC0+Y2h1bmtzW01lbVBsdWdpbl0sIHNpemVvZihfY21zTWVtUGx1Z2luQ2h1bmtUeXBlKSk7ICAKKysgICAgICAgIGN0eCAtPmNodW5rc1tNZW1QbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsIHNyYyAtPmNodW5rc1tNZW1QbHVnaW5dLCBzaXplb2YoX2Ntc01lbVBsdWdpbkNodW5rVHlwZSkpOworICAgICB9CisgICAgIGVsc2UgeworIAorICAgICAgICAgLy8gVG8gcmVzZXQgaXQsIHdlIHVzZSB0aGUgZGVmYXVsdCBhbGxvY2F0b3JzLCB3aGljaCBjYW5ub3QgYmUgb3ZlcnJpZGVuCisgICAgICAgICBjdHggLT5jaHVua3NbTWVtUGx1Z2luXSA9ICZjdHggLT5EZWZhdWx0TWVtb3J5TWFuYWdlcjsKKy0gICAgfSAKKysgICAgfQorIH0KKyAKKy0vLyBBdXhpbGlhcnkgdG8gZmlsbCBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMgZnJvbSBwbHVnaW4gKG9yIGNvbnRleHQgMCBkZWZhdWx0cykKKyB2b2lkIF9jbXNJbnN0YWxsQWxsb2NGdW5jdGlvbnMoY21zUGx1Z2luTWVtSGFuZGxlciogUGx1Z2luLCBfY21zTWVtUGx1Z2luQ2h1bmtUeXBlKiBwdHIpCisgeworICAgICBpZiAoUGx1Z2luID09IE5VTEwpIHsKK0BAIC0yMTIsOTQgKzE0OSwxNSBAQCB2b2lkIF9jbXNJbnN0YWxsQWxsb2NGdW5jdGlvbnMoY21zUGx1Z2luTWVtSGFuZGxlciogUGx1Z2luLCBfY21zTWVtUGx1Z2luQ2h1bmtUeQorICAgICAgICAgcHRyIC0+UmVhbGxvY1B0ciA9IFBsdWdpbiAtPiBSZWFsbG9jUHRyOworIAorICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIHJldmVydCB0byBkZWZhdWx0cworLSAgICAgICAgcHRyIC0+TWFsbG9jWmVyb1B0cj0gX2Ntc01hbGxvY1plcm9EZWZhdWx0Rm47CistICAgICAgICBwdHIgLT5DYWxsb2NQdHIgICAgPSBfY21zQ2FsbG9jRGVmYXVsdEZuOworLSAgICAgICAgcHRyIC0+RHVwUHRyICAgICAgID0gX2Ntc0R1cERlZmF1bHRGbjsKKy0gICAgICAKKysgICAgICAgIHB0ciAtPk1hbGxvY1plcm9QdHI9IF9jbXNNYWxsb2NaZXJvOworKyAgICAgICAgcHRyIC0+Q2FsbG9jUHRyICAgID0gX2Ntc0NhbGxvYzsKKysgICAgICAgIHB0ciAtPkR1cFB0ciAgICAgICA9IF9jbXNEdXBNZW07CisrCisgICAgICAgICBpZiAoUGx1Z2luIC0+TWFsbG9jWmVyb1B0ciAhPSBOVUxMKSBwdHIgLT5NYWxsb2NaZXJvUHRyID0gUGx1Z2luIC0+IE1hbGxvY1plcm9QdHI7CisgICAgICAgICBpZiAoUGx1Z2luIC0+Q2FsbG9jUHRyICE9IE5VTEwpICAgICBwdHIgLT5DYWxsb2NQdHIgICAgID0gUGx1Z2luIC0+IENhbGxvY1B0cjsKKyAgICAgICAgIGlmIChQbHVnaW4gLT5EdXBQdHIgIT0gTlVMTCkgICAgICAgIHB0ciAtPkR1cFB0ciAgICAgICAgPSBQbHVnaW4gLT4gRHVwUHRyOworLSAgICAgICAgCistICAgIH0KKy19CistCisgCistLy8gUGx1Zy1pbiByZXBsYWNlbWVudCBlbnRyeQorLWNtc0Jvb2wgIF9jbXNSZWdpc3Rlck1lbUhhbmRsZXJQbHVnaW4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BsdWdpbkJhc2UgKkRhdGEpCisteworLSAgICBjbXNQbHVnaW5NZW1IYW5kbGVyKiBQbHVnaW4gPSAoY21zUGx1Z2luTWVtSGFuZGxlciopIERhdGE7ICAgICAKKy0gICAgX2Ntc01lbVBsdWdpbkNodW5rVHlwZSogcHRyOworLQorLSAgICAvLyBOVUxMIGZvcmNlcyB0byByZXNldCB0byBkZWZhdWx0cy4gSW4gdGhpcyBzcGVjaWFsIGNhc2UsIHRoZSBkZWZhdWx0cyBhcmUgc3RvcmVkIGluIHRoZSBjb250ZXh0IHN0cnVjdHVyZS4gCistICAgIC8vIFJlbWFpbmluZyBwbHVnLWlucyBkb2VzIE5PVCBoYXZlIGFueSBjb3B5IGluIHRoZSBjb250ZXh0IHN0cnVjdHVyZSwgYnV0IHRoaXMgaXMgc29tZWhvdyBzcGVjaWFsIGFzIHRoZQorLSAgICAvLyBjb250ZXh0IGludGVybmFsIGRhdGEgc2hvdWxkIGJlIG1hbGxvY2UnZCBieSB1c2luZyB0aG9zZSBmdW5jdGlvbnMuIAorLSAgICBpZiAoRGF0YSA9PSBOVUxMKSB7CistCistICAgICAgIHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCA9ICggc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCopIENvbnRleHRJRDsKKy0KKy0gICAgICAgLy8gUmV0dXJuIHRvIHRoZSBkZWZhdWx0IGFsbG9jYXRvcnMKKy0gICAgICAgIGlmIChDb250ZXh0SUQgIT0gTlVMTCkgeworLSAgICAgICAgICAgIGN0eC0+Y2h1bmtzW01lbVBsdWdpbl0gPSAodm9pZCopICZjdHgtPkRlZmF1bHRNZW1vcnlNYW5hZ2VyOworLSAgICAgICAgfQorLSAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgIH0KKy0KKy0gICAgLy8gQ2hlY2sgZm9yIHJlcXVpcmVkIGNhbGxiYWNrcworLSAgICBpZiAoUGx1Z2luIC0+IE1hbGxvY1B0ciA9PSBOVUxMIHx8CistICAgICAgICBQbHVnaW4gLT4gRnJlZVB0ciA9PSBOVUxMIHx8CistICAgICAgICBQbHVnaW4gLT4gUmVhbGxvY1B0ciA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CistCistICAgIC8vIFNldCByZXBsYWNlbWVudCBmdW5jdGlvbnMKKy0gICAgcHRyID0gKF9jbXNNZW1QbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgTWVtUGx1Z2luKTsKKy0gICAgaWYgKHB0ciA9PSBOVUxMKSAKKy0gICAgICAgIHJldHVybiBGQUxTRTsKKy0KKy0gICAgX2Ntc0luc3RhbGxBbGxvY0Z1bmN0aW9ucyhQbHVnaW4sIHB0cik7CistICAgIHJldHVybiBUUlVFOworLX0KKy0KKy0vLyBHZW5lcmljIGFsbG9jYXRlCistdm9pZCogQ01TRVhQT1JUIF9jbXNNYWxsb2MoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBzaXplKQorLXsKKy0gICAgX2Ntc01lbVBsdWdpbkNodW5rVHlwZSogcHRyID0gKF9jbXNNZW1QbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgTWVtUGx1Z2luKTsKKy0gICAgcmV0dXJuIHB0ciAtPk1hbGxvY1B0cihDb250ZXh0SUQsIHNpemUpOworLX0KKy0KKy0vLyBHZW5lcmljIGFsbG9jYXRlICYgemVybworLXZvaWQqIENNU0VYUE9SVCBfY21zTWFsbG9jWmVybyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIHNpemUpCisteworLSAgICBfY21zTWVtUGx1Z2luQ2h1bmtUeXBlKiBwdHIgPSAoX2Ntc01lbVBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBNZW1QbHVnaW4pOworLSAgICByZXR1cm4gcHRyLT5NYWxsb2NaZXJvUHRyKENvbnRleHRJRCwgc2l6ZSk7CistfQorLQorLS8vIEdlbmVyaWMgY2FsbG9jCistdm9pZCogQ01TRVhQT1JUIF9jbXNDYWxsb2MoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBudW0sIGNtc1VJbnQzMk51bWJlciBzaXplKQorLXsKKy0gICAgX2Ntc01lbVBsdWdpbkNodW5rVHlwZSogcHRyID0gKF9jbXNNZW1QbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgTWVtUGx1Z2luKTsKKy0gICAgcmV0dXJuIHB0ci0+Q2FsbG9jUHRyKENvbnRleHRJRCwgbnVtLCBzaXplKTsKKy19CistCistLy8gR2VuZXJpYyByZWFsbG9jYXRlCistdm9pZCogQ01TRVhQT1JUIF9jbXNSZWFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBzaXplKQorLXsKKy0gICAgX2Ntc01lbVBsdWdpbkNodW5rVHlwZSogcHRyID0gKF9jbXNNZW1QbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgTWVtUGx1Z2luKTsKKy0gICAgcmV0dXJuIHB0ci0+UmVhbGxvY1B0cihDb250ZXh0SUQsIFB0ciwgc2l6ZSk7CistfQorLQorLS8vIEdlbmVyaWMgZnJlZSBtZW1vcnkKKy12b2lkIENNU0VYUE9SVCBfY21zRnJlZShjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogUHRyKQorLXsKKy0gICAgaWYgKFB0ciAhPSBOVUxMKSB7CistICAgICAgICBfY21zTWVtUGx1Z2luQ2h1bmtUeXBlKiBwdHIgPSAoX2Ntc01lbVBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBNZW1QbHVnaW4pOworLSAgICAgICAgcHRyIC0+RnJlZVB0cihDb250ZXh0SUQsIFB0cik7CistICAgIH0KKy19CistCistLy8gR2VuZXJpYyBibG9jayBkdXBsaWNhdGlvbgorLXZvaWQqIENNU0VYUE9SVCBfY21zRHVwTWVtKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCB2b2lkKiBPcmcsIGNtc1VJbnQzMk51bWJlciBzaXplKQorLXsKKy0gICAgX2Ntc01lbVBsdWdpbkNodW5rVHlwZSogcHRyID0gKF9jbXNNZW1QbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgTWVtUGx1Z2luKTsKKy0gICAgcmV0dXJuIHB0ciAtPkR1cFB0cihDb250ZXh0SUQsIE9yZywgc2l6ZSk7CisgfQorIAorIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zLzAwMDEtZml4LWluY2x1ZGUucGF0Y2ggYi90aGlyZF9wYXJ0eS9sY21zLzAwMDEtZml4LWluY2x1ZGUucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk1ZGJhNgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvMDAwMS1maXgtaW5jbHVkZS5wYXRjaApAQCAtMCwwICsxLDEzIEBACitkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvbGNtczJfaW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2xjbXMyX2ludGVybmFsLmgKK2luZGV4IDcyN2NiMDZlMy4uMTE1YWM1OTcwIDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvbGNtczJfaW50ZXJuYWwuaAorKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvbGNtczJfaW50ZXJuYWwuaAorQEAgLTI4LDcgKzI4LDcgQEAKKyAKKyAvLyBJbmNsdWRlIHBsdWctaW4gZm91bmRhdGlvbgorICNpZm5kZWYgX2xjbXNfcGx1Z2luX0gKKy0jICAgaW5jbHVkZSAibGNtczJfcGx1Z2luLmgiCisrIyAgIGluY2x1ZGUgInRoaXJkX3BhcnR5L2xjbXMvaW5jbHVkZS9sY21zMl9wbHVnaW4uaCIKKyAjZW5kaWYKKyAKKyAvLyBjdHlwZSBpcyBwYXJ0IG9mIEM5OSBhcyBwZXIgNy4xLjIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvMDAwMi1vbGQtcGVyZm9ybWFuY2UtZml4LnBhdGNoIGIvdGhpcmRfcGFydHkvbGNtcy8wMDAyLW9sZC1wZXJmb3JtYW5jZS1maXgucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2VhMmJlZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvMDAwMi1vbGQtcGVyZm9ybWFuY2UtZml4LnBhdGNoCkBAIC0wLDAgKzEsMTMgQEAKK2RpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNnYW1tYS5jIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zZ2FtbWEuYworaW5kZXggZWRiOGY2YmJhLi5lYjNkZDg4MWMgMTAwNjQ0CistLS0gYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNnYW1tYS5jCisrKysgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNnYW1tYS5jCitAQCAtNzk5LDcgKzc5OSw3IEBAIHZvaWQgQ01TRVhQT1JUIGNtc0ZyZWVUb25lQ3VydmVUcmlwbGUoY21zVG9uZUN1cnZlKiBDdXJ2ZVszXSkKKyAvLyBEdXBsaWNhdGUgYSBnYW1tYSB0YWJsZQorIGNtc1RvbmVDdXJ2ZSogQ01TRVhQT1JUIGNtc0R1cFRvbmVDdXJ2ZShjb25zdCBjbXNUb25lQ3VydmUqIEluKQorIHsKKy0gICAgaWYgKEluID09IE5VTEwpIHJldHVybiBOVUxMOworKyAgICBpZiAoSW4gPT0gTlVMTCB8fCBJbiAtPlNlZ21lbnRzID09IE5VTEwgfHwgSW4gLT5UYWJsZTE2ID09IE5VTEwpIHJldHVybiBOVUxMOworIAorICAgICByZXR1cm4gIEFsbG9jYXRlVG9uZUN1cnZlU3RydWN0KEluIC0+SW50ZXJwUGFyYW1zIC0+Q29udGV4dElELCBJbiAtPm5FbnRyaWVzLCBJbiAtPm5TZWdtZW50cywgSW4gLT5TZWdtZW50cywgSW4gLT5UYWJsZTE2KTsKKyB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zLzAwMDMtb2xkLXVuaW5pdGlhbGl6ZWQtaW4tTFVUZXZhbEZsb2F0LnBhdGNoIGIvdGhpcmRfcGFydHkvbGNtcy8wMDAzLW9sZC11bmluaXRpYWxpemVkLWluLUxVVGV2YWxGbG9hdC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDkxZWVmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGNtcy8wMDAzLW9sZC11bmluaXRpYWxpemVkLWluLUxVVGV2YWxGbG9hdC5wYXRjaApAQCAtMCwwICsxLDEzIEBACitkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zbHV0LmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNsdXQuYworaW5kZXggZGYzZGZjMWFkLi40NWYwNWM2MWQgMTAwNjQ0CistLS0gYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNsdXQuYworKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zbHV0LmMKK0BAIC0xMzIxLDcgKzEzMjEsNyBAQCB2b2lkIF9MVVRldmFsRmxvYXQocmVnaXN0ZXIgY29uc3QgY21zRmxvYXQzMk51bWJlciBJbltdLCByZWdpc3RlciBjbXNGbG9hdDMyTnVtYgorIHsKKyAgICAgY21zUGlwZWxpbmUqIGx1dCA9IChjbXNQaXBlbGluZSopIEQ7CisgICAgIGNtc1N0YWdlICptcGU7CistICAgIGNtc0Zsb2F0MzJOdW1iZXIgU3RvcmFnZVsyXVtNQVhfU1RBR0VfQ0hBTk5FTFNdOworKyAgICBjbXNGbG9hdDMyTnVtYmVyIFN0b3JhZ2VbMl1bTUFYX1NUQUdFX0NIQU5ORUxTXSA9IHswLjBmfTsKKyAgICAgaW50IFBoYXNlID0gMCwgTmV4dFBoYXNlOworIAorICAgICBtZW1tb3ZlKCZTdG9yYWdlW1BoYXNlXVswXSwgSW4sIGx1dCAtPklucHV0Q2hhbm5lbHMgICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvMDAwNC1vbGQtdW5pbml0aWFsaXplZC1pbi1MVVRldmFsMTYucGF0Y2ggYi90aGlyZF9wYXJ0eS9sY21zLzAwMDQtb2xkLXVuaW5pdGlhbGl6ZWQtaW4tTFVUZXZhbDE2LnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZTMxNTIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9sY21zLzAwMDQtb2xkLXVuaW5pdGlhbGl6ZWQtaW4tTFVUZXZhbDE2LnBhdGNoCkBAIC0wLDAgKzEsMTMgQEAKK2RpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNsdXQuYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2x1dC5jCitpbmRleCA0NWYwNWM2MWQuLjE4Yjg4YTU0NSAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2x1dC5jCisrKysgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNsdXQuYworQEAgLTEyOTUsNyArMTI5NSw3IEBAIHZvaWQgX0xVVGV2YWwxNihyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5bXSwgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIE91CisgeworICAgICBjbXNQaXBlbGluZSogbHV0ID0gKGNtc1BpcGVsaW5lKikgRDsKKyAgICAgY21zU3RhZ2UgKm1wZTsKKy0gICAgY21zRmxvYXQzMk51bWJlciBTdG9yYWdlWzJdW01BWF9TVEFHRV9DSEFOTkVMU107CisrICAgIGNtc0Zsb2F0MzJOdW1iZXIgU3RvcmFnZVsyXVtNQVhfU1RBR0VfQ0hBTk5FTFNdID0gezAuMGZ9OworICAgICBpbnQgUGhhc2UgPSAwLCBOZXh0UGhhc2U7CisgCisgICAgIEZyb20xNlRvRmxvYXQoSW4sICZTdG9yYWdlW1BoYXNlXVswXSwgbHV0IC0+SW5wdXRDaGFubmVscyk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zLzAwMDUtb2xkLWZpeC1lLXdpdGgtdGlsZGUucGF0Y2ggYi90aGlyZF9wYXJ0eS9sY21zLzAwMDUtb2xkLWZpeC1lLXdpdGgtdGlsZGUucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjMDU0ZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvMDAwNS1vbGQtZml4LWUtd2l0aC10aWxkZS5wYXRjaApAQCAtMCwwICsxLDYxIEBACitkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zeGZvcm0uYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3hmb3JtLmMKK2luZGV4IDRhNWE0ZjA5My4uOWMyMGM0OWIwIDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zeGZvcm0uYworKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zeGZvcm0uYworQEAgLTMzOCw3ICszMzgsNyBAQCB2b2lkIE51bGxGbG9hdFhGT1JNKF9jbXNUUkFOU0ZPUk0qIHAsCisgCisgLy8gMTYgYml0IHByZWNpc2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIAorLS8vIE51bGwgdHJhbnNmb3JtYXRpb24sIG9ubHkgYXBwbGllcyBmb3JtYXR0ZXJzLiBObyBjYWNoPEU5PgorKy8vIE51bGwgdHJhbnNmb3JtYXRpb24sIG9ubHkgYXBwbGllcyBmb3JtYXR0ZXJzLiBObyBjYWNoZQorIHN0YXRpYworIHZvaWQgTnVsbFhGT1JNKF9jbXNUUkFOU0ZPUk0qIHAsCisgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogaW4sCitAQCAtNDM2LDcgKzQzNiw3IEBAIHZvaWQgVHJhbnNmb3JtT25lUGl4ZWxXaXRoR2FtdXRDaGVjayhfY21zVFJBTlNGT1JNKiBwLAorICAgICAgICAgcCAtPkx1dCAtPkV2YWwxNkZuKHdJbiwgd091dCwgcCAtPiBMdXQtPkRhdGEpOworIH0KKyAKKy0vLyBHYW11dCBjaGVjaywgTm8gY2FjaDxFOT4sIDE2IGJpdHMuCisrLy8gR2FtdXQgY2hlY2ssIE5vIGNhY2hlLCAxNiBiaXRzLgorIHN0YXRpYworIHZvaWQgUHJlY2FsY3VsYXRlZFhGT1JNR2FtdXRDaGVjayhfY21zVFJBTlNGT1JNKiBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBpbiwKK0BAIC00NzMsNyArNDczLDcgQEAgdm9pZCBQcmVjYWxjdWxhdGVkWEZPUk1HYW11dENoZWNrKF9jbXNUUkFOU0ZPUk0qIHAsCisgfQorIAorIAorLS8vIE5vIGdhbXV0IGNoZWNrLCBDYWNoPEU5PiwgMTYgYml0cywKKysvLyBObyBnYW11dCBjaGVjaywgQ2FjaGUsIDE2IGJpdHMsCisgc3RhdGljCisgdm9pZCBDYWNoZWRYRk9STShfY21zVFJBTlNGT1JNKiBwLAorICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogaW4sCitAQCAtODI4LDcgKzgyOCw3IEBAIF9jbXNUUkFOU0ZPUk0qIEFsbG9jRW1wdHlUcmFuc2Zvcm0oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BpcGVsaW5lKiBsdXQsCisgICAgICAgICAgICAgcCAtPnhmb3JtID0gTnVsbEZsb2F0WEZPUk07CisgICAgICAgICB9CisgICAgICAgICBlbHNlIHsKKy0gICAgICAgICAgICAvLyBGbG9hdCB0cmFuc2Zvcm1zIGRvbid0IHVzZSBjYWNoPEU5PiwgYWx3YXlzIGFyZSBub24tTlVMTAorKyAgICAgICAgICAgIC8vIEZsb2F0IHRyYW5zZm9ybXMgZG9uJ3QgdXNlIGNhY2hlLCBhbHdheXMgYXJlIG5vbi1OVUxMCisgICAgICAgICAgICAgcCAtPnhmb3JtID0gRmxvYXRYRk9STTsKKyAgICAgICAgIH0KKyAKK0BAIC04NjcsMTYgKzg2NywxNiBAQCBfY21zVFJBTlNGT1JNKiBBbGxvY0VtcHR5VHJhbnNmb3JtKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQaXBlbGluZSogbHV0LAorICAgICAgICAgICAgIGlmICgqZHdGbGFncyAmIGNtc0ZMQUdTX05PQ0FDSEUpIHsKKyAKKyAgICAgICAgICAgICAgICAgaWYgKCpkd0ZsYWdzICYgY21zRkxBR1NfR0FNVVRDSEVDSykKKy0gICAgICAgICAgICAgICAgICAgIHAgLT54Zm9ybSA9IFByZWNhbGN1bGF0ZWRYRk9STUdhbXV0Q2hlY2s7ICAvLyBHYW11dCBjaGVjaywgbm8gY2FjaDxFOT4KKysgICAgICAgICAgICAgICAgICAgIHAgLT54Zm9ybSA9IFByZWNhbGN1bGF0ZWRYRk9STUdhbXV0Q2hlY2s7ICAvLyBHYW11dCBjaGVjaywgbm8gY2FjaGUKKyAgICAgICAgICAgICAgICAgZWxzZQorLSAgICAgICAgICAgICAgICAgICAgcCAtPnhmb3JtID0gUHJlY2FsY3VsYXRlZFhGT1JNOyAgLy8gTm8gY2FjaDxFOT4sIG5vIGdhbXV0IGNoZWNrCisrICAgICAgICAgICAgICAgICAgICBwIC0+eGZvcm0gPSBQcmVjYWxjdWxhdGVkWEZPUk07ICAvLyBObyBjYWNoZSwgbm8gZ2FtdXQgY2hlY2sKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgZWxzZSB7CisgCisgICAgICAgICAgICAgICAgIGlmICgqZHdGbGFncyAmIGNtc0ZMQUdTX0dBTVVUQ0hFQ0spCistICAgICAgICAgICAgICAgICAgICBwIC0+eGZvcm0gPSBDYWNoZWRYRk9STUdhbXV0Q2hlY2s7ICAgIC8vIEdhbXV0IGNoZWNrLCBjYWNoPEU5PgorKyAgICAgICAgICAgICAgICAgICAgcCAtPnhmb3JtID0gQ2FjaGVkWEZPUk1HYW11dENoZWNrOyAgICAvLyBHYW11dCBjaGVjaywgY2FjaGUKKyAgICAgICAgICAgICAgICAgZWxzZQorLSAgICAgICAgICAgICAgICAgICAgcCAtPnhmb3JtID0gQ2FjaGVkWEZPUk07ICAvLyBObyBnYW11dCBjaGVjaywgY2FjaDxFOT4KKysgICAgICAgICAgICAgICAgICAgIHAgLT54Zm9ybSA9IENhY2hlZFhGT1JNOyAgLy8gTm8gZ2FtdXQgY2hlY2ssIGNhY2hlCisgCisgICAgICAgICAgICAgfQorICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy8wMDA2LXRhZy10eXBlLWNvbmZ1c2lvbi5wYXRjaCBiL3RoaXJkX3BhcnR5L2xjbXMvMDAwNi10YWctdHlwZS1jb25mdXNpb24ucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdkM2M3ZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvMDAwNi10YWctdHlwZS1jb25mdXNpb24ucGF0Y2gKQEAgLTAsMCArMSwxNCBAQAorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2lvMC5jIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zaW8wLmMKK2luZGV4IDY1NDlkMTUuLjVmOWYwOGEgMTAwNjQ0CistLS0gYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNpbzAuYworKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zaW8wLmMKK0BAIC03MTksNyArNzE5LDggQEAgY21zQm9vbCBfY21zUmVhZEhlYWRlcihfY21zSUNDUFJPRklMRSogSWNjKQorICAgICAgICAgZm9yIChqPTA7IGogPCBJY2MgLT5UYWdDb3VudDsgaisrKSB7CisgCisgICAgICAgICAgICAgaWYgKChJY2MgLT5UYWdPZmZzZXRzW2pdID09IFRhZy5vZmZzZXQpICYmCistICAgICAgICAgICAgICAgIChJY2MgLT5UYWdTaXplc1tqXSAgID09IFRhZy5zaXplKSkgeworKyAgICAgICAgICAgICAgICAoSWNjIC0+VGFnU2l6ZXNbal0gICA9PSBUYWcuc2l6ZSkgJiYKKysgICAgICAgICAgICAgICAgKEljYyAtPlRhZ05hbWVzW2pdICAgPT0gVGFnLnNpZykpIHsKKyAKKyAgICAgICAgICAgICAgICAgSWNjIC0+VGFnTGlua2VkW0ljYyAtPlRhZ0NvdW50XSA9IEljYyAtPlRhZ05hbWVzW2pdOworICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvMDAwOC1pbmZpbml0ZS1sb29wLUdyb3dOYW1lZENvbG9yTGlzdC5wYXRjaCBiL3RoaXJkX3BhcnR5L2xjbXMvMDAwOC1pbmZpbml0ZS1sb29wLUdyb3dOYW1lZENvbG9yTGlzdC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWJmNmE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGNtcy8wMDA4LWluZmluaXRlLWxvb3AtR3Jvd05hbWVkQ29sb3JMaXN0LnBhdGNoCkBAIC0wLDAgKzEsMjggQEAKK2RpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNuYW1lZC5jIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zbmFtZWQuYworaW5kZXggOWIyN2NhMGNjLi45ZWQ0Y2FkMzkgMTAwNjQ0CistLS0gYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNuYW1lZC5jCisrKysgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNuYW1lZC5jCitAQCAtNTQwLDcgKzU0MCwxMCBAQCBjbXNOQU1FRENPTE9STElTVCogQ01TRVhQT1JUIGNtc0FsbG9jTmFtZWRDb2xvckxpc3QoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbgorICAgICB2IC0+Q29udGV4dElEICA9IENvbnRleHRJRDsKKyAKKyAgICAgd2hpbGUgKHYgLT4gQWxsb2NhdGVkIDwgbil7CistICAgICAgICBpZiAoIUdyb3dOYW1lZENvbG9yTGlzdCh2KSkgcmV0dXJuIE5VTEw7CisrICAgICAgICBpZiAoIUdyb3dOYW1lZENvbG9yTGlzdCh2KSkgeworKyAgICAgICAgICAgIGNtc0ZyZWVOYW1lZENvbG9yTGlzdCh2KTsKKysgICAgICAgICAgICByZXR1cm4gTlVMTDsKKysgICAgICAgIH0KKyAgICAgfQorIAorICAgICBzdHJuY3B5KHYgLT5QcmVmaXgsIFByZWZpeCwgc2l6ZW9mKHYgLT5QcmVmaXgpLTEpOworQEAgLTU3MSw3ICs1NzQsMTAgQEAgY21zTkFNRURDT0xPUkxJU1QqIENNU0VYUE9SVCBjbXNEdXBOYW1lZENvbG9yTGlzdChjb25zdCBjbXNOQU1FRENPTE9STElTVCogdikKKyAKKyAgICAgLy8gRm9yIHJlYWxseSBsYXJnZSB0YWJsZXMgd2UgbmVlZCB0aGlzCisgICAgIHdoaWxlIChOZXdOQyAtPkFsbG9jYXRlZCA8IHYgLT5BbGxvY2F0ZWQpeworLSAgICAgICAgaWYgKCFHcm93TmFtZWRDb2xvckxpc3QoTmV3TkMpKSByZXR1cm4gTlVMTDsKKysgICAgICAgIGlmICghR3Jvd05hbWVkQ29sb3JMaXN0KE5ld05DKSkgeworKyAgICAgICAgICAgIGNtc0ZyZWVOYW1lZENvbG9yTGlzdChOZXdOQyk7CisrICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisrICAgICAgICB9CisgICAgIH0KKyAKKyAgICAgbWVtbW92ZShOZXdOQyAtPlByZWZpeCwgdiAtPlByZWZpeCwgc2l6ZW9mKHYgLT5QcmVmaXgpKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvMDAwOS11bmluaXQucGF0Y2ggYi90aGlyZF9wYXJ0eS9sY21zLzAwMDktdW5pbml0LnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NTM4YzEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9sY21zLzAwMDktdW5pbml0LnBhdGNoCkBAIC0wLDAgKzEsMjMgQEAKK25wbUBucG0wOn4vcGRmaXVtL3BkZml1bS90aGlyZF9wYXJ0eS9sY21zJCBnaXQgZGlmZiBzcmMvY21zdHlwZXMuYworZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3R5cGVzLmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXN0eXBlcy5jCitpbmRleCBjYjYxODYwMGEuLjJhMGVhOTQ0OCAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3R5cGVzLmMKKysrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3R5cGVzLmMKK0BAIC0yOTY2LDcgKzI5NjYsNyBAQCB2b2lkICpUeXBlX0NvbG9yYW50VGFibGVfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUgorIHsKKyAgICAgY21zVUludDMyTnVtYmVyIGksIENvdW50OworICAgICBjbXNOQU1FRENPTE9STElTVCogTGlzdDsKKy0gICAgY2hhciBOYW1lWzM0XTsKKysgICAgY2hhciBOYW1lWzMzXTsKKyAgICAgY21zVUludDE2TnVtYmVyIFBDU1szXTsKKyAKKyAKK0BAIC0yOTgxLDcgKzI5ODEsNyBAQCB2b2lkICpUeXBlX0NvbG9yYW50VGFibGVfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUgorICAgICBmb3IgKGk9MDsgaSA8IENvdW50OyBpKyspIHsKKyAKKyAgICAgICAgIGlmIChpbyAtPlJlYWQoaW8sIE5hbWUsIDMyLCAxKSAhPSAxKSBnb3RvIEVycm9yOworLSAgICAgICAgTmFtZVszM10gPSAwOworKyAgICAgICAgTmFtZVszMl0gPSAwOworIAorICAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQxNkFycmF5KGlvLCAzLCBQQ1MpKSBnb3RvIEVycm9yOworIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy8wMDEwLW1lbW9yeS1sZWFrLVR5cGVfQ3VydmVfUmVhZC5wYXRjaCBiL3RoaXJkX3BhcnR5L2xjbXMvMDAxMC1tZW1vcnktbGVhay1UeXBlX0N1cnZlX1JlYWQucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VkYzdmOQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvMDAxMC1tZW1vcnktbGVhay1UeXBlX0N1cnZlX1JlYWQucGF0Y2gKQEAgLTAsMCArMSwyOCBAQAorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3R5cGVzLmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXN0eXBlcy5jCitpbmRleCAwNjc0MmI1Li45ZmU1ZTJhIDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYworKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYworQEAgLTExMTIsNyArMTExMiwxMCBAQCB2b2lkICpUeXBlX0N1cnZlX1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbQorICAgICAgICAgICAgICAgIE5ld0dhbW1hID0gY21zQnVpbGRUYWJ1bGF0ZWRUb25lQ3VydmUxNihzZWxmIC0+Q29udGV4dElELCBDb3VudCwgTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKCFOZXdHYW1tYSkgcmV0dXJuIE5VTEw7CisgCistICAgICAgICAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQxNkFycmF5KGlvLCBDb3VudCwgTmV3R2FtbWEgLT4gVGFibGUxNikpIHJldHVybiBOVUxMOworKyAgICAgICAgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZBcnJheShpbywgQ291bnQsIE5ld0dhbW1hIC0+IFRhYmxlMTYpKSB7CisrICAgICAgICAgICAgICAgICBjbXNGcmVlVG9uZUN1cnZlKE5ld0dhbW1hKTsKKysgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworKyAgICAgICAgICAgICAgIH0KKyAKKyAgICAgICAgICAgICAgICAqbkl0ZW1zID0gMTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTmV3R2FtbWE7CitAQCAtMjM1MCw3ICsyMzUzLDEwIEBAIGNtc1N0YWdlKiBSZWFkQ0xVVChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJCisgCisgICAgICAgICBmb3IgKGk9MDsgaSA8IERhdGEgLT5uRW50cmllczsgaSsrKSB7CisgCistICAgICAgICAgICAgaWYgKGlvIC0+UmVhZChpbywgJnYsIHNpemVvZihjbXNVSW50OE51bWJlciksIDEpICE9IDEpIHJldHVybiBOVUxMOworKyAgICAgICAgICAgIGlmIChpbyAtPlJlYWQoaW8sICZ2LCBzaXplb2YoY21zVUludDhOdW1iZXIpLCAxKSAhPSAxKSB7CisrICAgICAgICAgICAgICBjbXNTdGFnZUZyZWUoQ0xVVCk7CisrICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKysgICAgICAgICAgICB9CisgICAgICAgICAgICAgRGF0YSAtPlRhYi5UW2ldID0gRlJPTV84X1RPXzE2KHYpOworICAgICAgICAgfQorIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy8wMDExLW1lbW9yeS1sZWFrLUFsbG9jRW1wdHlUcmFuc2Zvcm0ucGF0Y2ggYi90aGlyZF9wYXJ0eS9sY21zLzAwMTEtbWVtb3J5LWxlYWstQWxsb2NFbXB0eVRyYW5zZm9ybS5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzI1MTk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGNtcy8wMDExLW1lbW9yeS1sZWFrLUFsbG9jRW1wdHlUcmFuc2Zvcm0ucGF0Y2gKQEAgLTAsMCArMSwzNCBAQAorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3hmb3JtLmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXN4Zm9ybS5jCitpbmRleCA5YzIwYzQ5YjAuLmIzODAyZjBkNSAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3hmb3JtLmMKKysrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3hmb3JtLmMKK0BAIC03NjEsNyArNzYxLDEwIEBAIF9jbXNUUkFOU0ZPUk0qIEFsbG9jRW1wdHlUcmFuc2Zvcm0oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BpcGVsaW5lKiBsdXQsCisgCisgICAgICAgIC8vIEFsbG9jYXRlIG5lZWRlZCBtZW1vcnkKKyAgICAgICAgX2Ntc1RSQU5TRk9STSogcCA9IChfY21zVFJBTlNGT1JNKilfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihfY21zVFJBTlNGT1JNKSk7CistICAgICAgIGlmICghcCkgcmV0dXJuIE5VTEw7CisrICAgICAgIGlmICghcCkgeworKyAgICAgICAgICBjbXNQaXBlbGluZUZyZWUobHV0KTsKKysgICAgICAgICAgcmV0dXJuIE5VTEw7CisrICAgICAgfQorIAorICAgICAgICAvLyBTdG9yZSB0aGUgcHJvcG9zZWQgcGlwZWxpbmUKKyAgICAgICAgcC0+THV0ID0gbHV0OworQEAgLTgxOSw3ICs4MjIsNyBAQCBfY21zVFJBTlNGT1JNKiBBbGxvY0VtcHR5VHJhbnNmb3JtKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQaXBlbGluZSogbHV0LAorICAgICAgICAgaWYgKHAgLT5Gcm9tSW5wdXRGbG9hdCA9PSBOVUxMIHx8IHAgLT5Ub091dHB1dEZsb2F0ID09IE5VTEwpIHsKKyAKKyAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5zdXBwb3J0ZWQgcmFzdGVyIGZvcm1hdCIpOworLSAgICAgICAgICAgIF9jbXNGcmVlKENvbnRleHRJRCwgcCk7CisrICAgICAgICAgICAgY21zRGVsZXRlVHJhbnNmb3JtKHApOworICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgfQorIAorQEAgLTg0OSw3ICs4NTIsNyBAQCBfY21zVFJBTlNGT1JNKiBBbGxvY0VtcHR5VHJhbnNmb3JtKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQaXBlbGluZSogbHV0LAorICAgICAgICAgICAgIGlmIChwIC0+RnJvbUlucHV0ID09IE5VTEwgfHwgcCAtPlRvT3V0cHV0ID09IE5VTEwpIHsKKyAKKyAgICAgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVuc3VwcG9ydGVkIHJhc3RlciBmb3JtYXQiKTsKKy0gICAgICAgICAgICAgICAgX2Ntc0ZyZWUoQ29udGV4dElELCBwKTsKKysgICAgICAgICAgICAgICAgY21zRGVsZXRlVHJhbnNmb3JtKHApOworICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICB9CisgCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zLzAwMTItbWVtb3J5LWxlYWstVHlwZV9OYW1lZENvbG9yX1JlYWQucGF0Y2ggYi90aGlyZF9wYXJ0eS9sY21zLzAwMTItbWVtb3J5LWxlYWstVHlwZV9OYW1lZENvbG9yX1JlYWQucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U5ZTFiZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvMDAxMi1tZW1vcnktbGVhay1UeXBlX05hbWVkQ29sb3JfUmVhZC5wYXRjaApAQCAtMCwwICsxLDIyIEBACitkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3R5cGVzLmMKK2luZGV4IDk0MTEwN2UxYS4uZjIxMTlhZTBhIDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYworKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYworQEAgLTMxMDUsNyArMzEwNSw3IEBAIHZvaWQgKlR5cGVfTmFtZWRDb2xvcl9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpCisgCisgICAgIGlmIChuRGV2aWNlQ29vcmRzID4gY21zTUFYQ0hBTk5FTFMpIHsKKyAgICAgICAgIGNtc1NpZ25hbEVycm9yKHNlbGYtPkNvbnRleHRJRCwgY21zRVJST1JfUkFOR0UsICJUb28gbWFueSBkZXZpY2UgY29vcmRpbmF0ZXMgJyVkJyIsIG5EZXZpY2VDb29yZHMpOworLSAgICAgICAgcmV0dXJuIDA7CisrICAgICAgICBnb3RvIEVycm9yOworICAgICB9CisgICAgIGZvciAoaT0wOyBpIDwgY291bnQ7IGkrKykgeworIAorQEAgLTMxMTQsNyArMzExNCw3IEBAIHZvaWQgKlR5cGVfTmFtZWRDb2xvcl9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpCisgICAgICAgICBjaGFyIFJvb3RbMzNdOworIAorICAgICAgICAgbWVtc2V0KENvbG9yYW50LCAwLCBzaXplb2YoQ29sb3JhbnQpKTsKKy0gICAgICAgIGlmIChpbyAtPiBSZWFkKGlvLCBSb290LCAzMiwgMSkgIT0gMSkgcmV0dXJuIE5VTEw7CisrICAgICAgICBpZiAoaW8gLT4gUmVhZChpbywgUm9vdCwgMzIsIDEpICE9IDEpIGdvdG8gRXJyb3I7CisgICAgICAgICBSb290WzMyXSA9IDA7ICAvLyBUbyBwcmV2ZW50IGV4cGxvaXRzCisgCisgICAgICAgICBpZiAoIV9jbXNSZWFkVUludDE2QXJyYXkoaW8sIDMsIFBDUykpIGdvdG8gRXJyb3I7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zLzAwMTMtbWVtb3J5LWxlYWstT3B0aW1pemVCeVJlc2FtcGxpbmcucGF0Y2ggYi90aGlyZF9wYXJ0eS9sY21zLzAwMTMtbWVtb3J5LWxlYWstT3B0aW1pemVCeVJlc2FtcGxpbmcucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg2NDVkMQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvMDAxMy1tZW1vcnktbGVhay1PcHRpbWl6ZUJ5UmVzYW1wbGluZy5wYXRjaApAQCAtMCwwICsxLDEzIEBACitkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zb3B0LmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNvcHQuYworaW5kZXggZjg4NWVmMy4uNjg0OTEwZCAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc29wdC5jCisrKysgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNvcHQuYworQEAgLTYxMiw3ICs2MTIsNyBAQCBjbXNCb29sIE9wdGltaXplQnlSZXNhbXBsaW5nKGNtc1BpcGVsaW5lKiogTHV0LCBjbXNVSW50MzJOdW1iZXIgSW50ZW50LCBjbXNVSW50MworIAorICAgICAvLyBBbGxvY2F0ZSB0aGUgQ0xVVAorICAgICBDTFVUID0gY21zU3RhZ2VBbGxvY0NMdXQxNmJpdChTcmMgLT5Db250ZXh0SUQsIG5HcmlkUG9pbnRzLCBTcmMgLT5JbnB1dENoYW5uZWxzLCBTcmMtPk91dHB1dENoYW5uZWxzLCBOVUxMKTsKKy0gICAgaWYgKENMVVQgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworKyAgICBpZiAoQ0xVVCA9PSBOVUxMKSBnb3RvIEVycm9yOworIAorICAgICAvLyBBZGQgdGhlIENMVVQgdG8gdGhlIGRlc3RpbmF0aW9uIExVVAorICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoRGVzdCwgY21zQVRfRU5ELCBDTFVUKSkgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy8wMDE0LW1lbW9yeS1sZWFrLVR5cGVfTVBFbWF0cml4X1JlYWQucGF0Y2ggYi90aGlyZF9wYXJ0eS9sY21zLzAwMTQtbWVtb3J5LWxlYWstVHlwZV9NUEVtYXRyaXhfUmVhZC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2M0NzdmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGNtcy8wMDE0LW1lbW9yeS1sZWFrLVR5cGVfTVBFbWF0cml4X1JlYWQucGF0Y2gKQEAgLTAsMCArMSwzMCBAQAorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3R5cGVzLmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXN0eXBlcy5jCitpbmRleCA0NDFkNmJiLi4xNTE5OWM3IDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYworKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYworQEAgLTQyMDMsNyArNDIwMywxMSBAQCB2b2lkICpUeXBlX01QRW1hdHJpeF9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbworIAorICAgICAgICAgY21zRmxvYXQzMk51bWJlciB2OworIAorLSAgICAgICAgaWYgKCFfY21zUmVhZEZsb2F0MzJOdW1iZXIoaW8sICZ2KSkgcmV0dXJuIE5VTEw7CisrICAgICAgICBpZiAoIV9jbXNSZWFkRmxvYXQzMk51bWJlcihpbywgJnYpKSB7CisrICAgICAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgTWF0cml4KTsKKysgICAgICAgICAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBPZmZzZXRzKTsKKysgICAgICAgICAgICByZXR1cm4gTlVMTDsKKysgICAgICAgIH0KKyAgICAgICAgIE1hdHJpeFtpXSA9IHY7CisgICAgIH0KKyAKK0BAIC00MjEyLDcgKzQyMTYsMTEgQEAgdm9pZCAqVHlwZV9NUEVtYXRyaXhfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8KKyAKKyAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgdjsKKyAKKy0gICAgICAgIGlmICghX2Ntc1JlYWRGbG9hdDMyTnVtYmVyKGlvLCAmdikpIHJldHVybiBOVUxMOworKyAgICAgICAgaWYgKCFfY21zUmVhZEZsb2F0MzJOdW1iZXIoaW8sICZ2KSkgeworKyAgICAgICAgICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIE1hdHJpeCk7CisrICAgICAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgT2Zmc2V0cyk7CisrICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisrICAgICAgICB9CisgICAgICAgICBPZmZzZXRzW2ldID0gdjsKKyAgICAgfQorIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy8wMDE1LWNtc1N0YWdlQWxsb2NNYXRyaXgtcGFyYW0tc3dhcC5wYXRjaCBiL3RoaXJkX3BhcnR5L2xjbXMvMDAxNS1jbXNTdGFnZUFsbG9jTWF0cml4LXBhcmFtLXN3YXAucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmODU0MwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvMDAxNS1jbXNTdGFnZUFsbG9jTWF0cml4LXBhcmFtLXN3YXAucGF0Y2gKQEAgLTAsMCArMSwyMCBAQAorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2x1dC5jIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zbHV0LmMKK2luZGV4IDczZTY3MjYuLjliMGViNGIgMTAwNjQ0CistLS0gYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNsdXQuYworKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zbHV0LmMKK0BAIC00MTQsMTMgKzQxNCwxMyBAQCBjbXNTdGFnZSogIENNU0VYUE9SVCBjbXNTdGFnZUFsbG9jTWF0cml4KGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgUgorIAorICAgICBpZiAoT2Zmc2V0ICE9IE5VTEwpIHsKKyAKKy0gICAgICAgIE5ld0VsZW0gLT5PZmZzZXQgPSAoY21zRmxvYXQ2NE51bWJlciopIF9jbXNDYWxsb2MoQ29udGV4dElELCBDb2xzLCBzaXplb2YoY21zRmxvYXQ2NE51bWJlcikpOworKyAgICAgICAgTmV3RWxlbSAtPk9mZnNldCA9IChjbXNGbG9hdDY0TnVtYmVyKikgX2Ntc0NhbGxvYyhDb250ZXh0SUQsIFJvd3MsIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKSk7CisgICAgICAgICBpZiAoTmV3RWxlbS0+T2Zmc2V0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIE1hdHJpeEVsZW1UeXBlRnJlZShOZXdNUEUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICB9CisgCistICAgICAgICBmb3IgKGk9MDsgaSA8IENvbHM7IGkrKykgeworKyAgICAgICAgZm9yIChpPTA7IGkgPCBSb3dzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgTmV3RWxlbSAtPk9mZnNldFtpXSA9IE9mZnNldFtpXTsKKyAgICAgICAgIH0KKyAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvMDAxNi1yZWplY3QtbmFuLnBhdGNoIGIvdGhpcmRfcGFydHkvbGNtcy8wMDE2LXJlamVjdC1uYW4ucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiNTA2OAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvMDAxNi1yZWplY3QtbmFuLnBhdGNoCkBAIC0wLDAgKzEsMTMgQEAKK2RpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNwbHVnaW4uYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3BsdWdpbi5jCitpbmRleCA3OWIxNDVkMmQuLjI5ZGRkOWE0OSAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3BsdWdpbi5jCisrKysgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNwbHVnaW4uYworQEAgLTE3OSw2ICsxNzksOCBAQCBjbXNCb29sIENNU0VYUE9SVCAgX2Ntc1JlYWRGbG9hdDMyTnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNtc0Zsb2F0MzJOdW1iZXIqIG4pCisgCisgICAgICAgICB0bXAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIodG1wKTsKKyAgICAgICAgICpuID0gKihjbXNGbG9hdDMyTnVtYmVyKikgKHZvaWQqKSAmdG1wOworKyAgICAgICAgaWYgKGlzbmFuKCpuKSkKKysgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgIH0KKyAgICAgcmV0dXJuIFRSVUU7CisgfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy8wMDE3LW1lbW9yeS1sZWFrLVJlYWRTZWdtZW50ZWRDdXJ2ZS5wYXRjaCBiL3RoaXJkX3BhcnR5L2xjbXMvMDAxNy1tZW1vcnktbGVhay1SZWFkU2VnbWVudGVkQ3VydmUucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcyYmNhZAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvMDAxNy1tZW1vcnktbGVhay1SZWFkU2VnbWVudGVkQ3VydmUucGF0Y2gKQEAgLTAsMCArMSwzNiBAQAorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3R5cGVzLmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXN0eXBlcy5jCitpbmRleCAxNTE5OWM3Li4wNGRkMGM0IDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYworKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYworQEAgLTM5NjgsNyArMzk2OCw3IEBAIGNtc1RvbmVDdXJ2ZSogUmVhZFNlZ21lbnRlZEN1cnZlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ECisgICAgICAgICAgICAgY2FzZSBjbXNTaWdTYW1wbGVkQ3VydmVTZWc6IHsKKyAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIENvdW50OworIAorLSAgICAgICAgICAgICAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmQ291bnQpKSByZXR1cm4gTlVMTDsKKysgICAgICAgICAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJkNvdW50KSkgZ290byBFcnJvcjsKKyAKKyAgICAgICAgICAgICAgICAgU2VnbWVudHNbaV0ubkdyaWRQb2ludHMgPSBDb3VudDsKKyAgICAgICAgICAgICAgICAgU2VnbWVudHNbaV0uU2FtcGxlZFBvaW50cyA9IChjbXNGbG9hdDMyTnVtYmVyKikgX2Ntc0NhbGxvYyhzZWxmIC0+Q29udGV4dElELCBDb3VudCwgc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpKTsKK0BAIC0zOTg3LDcgKzM5ODcsNyBAQCBjbXNUb25lQ3VydmUqIFJlYWRTZWdtZW50ZWRDdXJ2ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORAorICAgICAgICAgICAgICAgICBfY21zVGFnU2lnbmF0dXJlMlN0cmluZyhTdHJpbmcsIChjbXNUYWdTaWduYXR1cmUpIEVsZW1lbnRTaWcpOworICAgICAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihzZWxmLT5Db250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5rbm93biBjdXJ2ZSBlbGVtZW50IHR5cGUgJyVzJyBmb3VuZC4iLCBTdHJpbmcpOworICAgICAgICAgICAgICAgICB9CistICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworKyAgICAgICAgICAgICAgICBnb3RvIEVycm9yOworIAorICAgICAgICAgIH0KKyAgICAgIH0KK0BAIC00MDAxLDcgKzQwMDEsMTIgQEAgY21zVG9uZUN1cnZlKiBSZWFkU2VnbWVudGVkQ3VydmUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkQKKyAgICAgIHJldHVybiBDdXJ2ZTsKKyAKKyBFcnJvcjoKKy0gICAgIGlmIChTZWdtZW50cykgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgU2VnbWVudHMpOworKyAgICAgaWYgKFNlZ21lbnRzKSB7CisrICAgICAgICAgZm9yIChpPTA7IGkgPCBuU2VnbWVudHM7IGkrKykgeworKyAgICAgICAgICAgICBpZiAoU2VnbWVudHNbaV0uU2FtcGxlZFBvaW50cykgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgU2VnbWVudHNbaV0uU2FtcGxlZFBvaW50cyk7CisrICAgICAgICAgfQorKyAgICAgICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFNlZ21lbnRzKTsKKysgICAgIH0KKyAgICAgIHJldHVybiBOVUxMOworIH0KKyAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvMDAxOC1iYWNrcG9ydC1jMGE5OGQ4Ni5wYXRjaCBiL3RoaXJkX3BhcnR5L2xjbXMvMDAxOC1iYWNrcG9ydC1jMGE5OGQ4Ni5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGI1NDc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGNtcy8wMDE4LWJhY2twb3J0LWMwYTk4ZDg2LnBhdGNoCkBAIC0wLDAgKzEsNTMgQEAKK2RpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNpbnRycC5jIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zaW50cnAuYworaW5kZXggNWQ1ZjM1ZC4uMTRjNjg1NiAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2ludHJwLmMKKysrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2ludHJwLmMKK0BAIC0yMTUsNyArMjE1LDcgQEAgdm9pZCBMaW5MZXJwMUQocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIFZhbHVlW10sCisgLy8gVG8gcHJldmVudCBvdXQgb2YgYm91bmRzIGluZGV4aW5nCisgY21zSU5MSU5FIGNtc0Zsb2F0MzJOdW1iZXIgZmNsYW1wKGNtc0Zsb2F0MzJOdW1iZXIgdikgCisgeworLSAgICByZXR1cm4gdiA8IDAuMGYgPyAwLjBmIDogKHYgPiAxLjBmID8gMS4wZiA6IHYpOworKyAgICByZXR1cm4gKCh2IDwgMC4wZikgfHwgaXNuYW4odikpID8gMC4wZiA6ICh2ID4gMS4wZiA/IDEuMGYgOiB2KTsKKyB9CisgCisgLy8gRmxvYXRpbmctcG9pbnQgdmVyc2lvbiBvZiAxRCBpbnRlcnBvbGF0aW9uCitkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zaW8wLmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNpbzAuYworaW5kZXggNWY5ZjA4YS4uM2VkNzMwYSAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2lvMC5jCisrKysgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNpbzAuYworQEAgLTE0NzUsNiArMTQ3NSwxNyBAQCB2b2lkKiBDTVNFWFBPUlQgY21zUmVhZFRhZyhjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVGFnU2lnbmF0dXJlIHNpZykKKyAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBpbiBtZW1vcnksIHJldHVybiB0aGUgcG9pbnRlcgorICAgICBpZiAoSWNjIC0+IFRhZ1B0cnNbbl0pIHsKKyAKKysgICAgICAgIGlmIChJY2MtPlRhZ1R5cGVIYW5kbGVyc1tuXSA9PSBOVUxMKSBnb3RvIEVycm9yOworKworKyAgICAgICAgLy8gU2FuaXR5IGNoZWNrCisrICAgICAgICBCYXNlVHlwZSA9IEljYy0+VGFnVHlwZUhhbmRsZXJzW25dLT5TaWduYXR1cmU7CisrICAgICAgICBpZiAoQmFzZVR5cGUgPT0gMCkgZ290byBFcnJvcjsKKysKKysgICAgICAgIFRhZ0Rlc2NyaXB0b3IgPSBfY21zR2V0VGFnRGVzY3JpcHRvcihJY2MtPkNvbnRleHRJRCwgc2lnKTsKKysgICAgICAgIGlmIChUYWdEZXNjcmlwdG9yID09IE5VTEwpIGdvdG8gRXJyb3I7CisrCisrICAgICAgICBpZiAoIUlzVHlwZVN1cHBvcnRlZChUYWdEZXNjcmlwdG9yLCBCYXNlVHlwZSkpIGdvdG8gRXJyb3I7CisrCisgICAgICAgICBpZiAoSWNjIC0+VGFnU2F2ZUFzUmF3W25dKSBnb3RvIEVycm9yOyAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCByZWFkIHJhdyB0YWdzIGFzIGNvb2tlZAorIAorICAgICAgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7CitkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3R5cGVzLmMKK2luZGV4IDA0ZGQwYzQuLjM4NjQzOWIgMTAwNjQ0CistLS0gYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXN0eXBlcy5jCisrKysgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXN0eXBlcy5jCitAQCAtNDI5Nyw4ICs0Mjk3LDEyIEBAIHZvaWQgKlR5cGVfTVBFY2x1dF9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywKKyAKKyAgICAgLy8gQ29weSBNQVhfSU5QVVRfRElNRU5TSU9OUyBhdCBtb3N0LiBFeHBhbmQgdG8gY21zVUludDMyTnVtYmVyCisgICAgIG5NYXhHcmlkcyA9IElucHV0Q2hhbnMgPiBNQVhfSU5QVVRfRElNRU5TSU9OUyA/IE1BWF9JTlBVVF9ESU1FTlNJT05TIDogSW5wdXRDaGFuczsKKy0gICAgZm9yIChpPTA7IGkgPCBuTWF4R3JpZHM7IGkrKykgR3JpZFBvaW50c1tpXSA9IChjbXNVSW50MzJOdW1iZXIpIERpbWVuc2lvbnM4W2ldOworIAorKyAgICBmb3IgKGkgPSAwOyBpIDwgbk1heEdyaWRzOyBpKyspIHsKKysgICAgICAgIGlmIChEaW1lbnNpb25zOFtpXSA9PSAxKSBnb3RvIEVycm9yOyAvLyBJbXBvc3NpYmxlIHZhbHVlLCAwIGZvciBubyBDTFVUIGFuZCB0aGVuIDIgYXQgbGVhc3QKKysgICAgICAgIEdyaWRQb2ludHNbaV0gPSAoY21zVUludDMyTnVtYmVyKURpbWVuc2lvbnM4W2ldOworKyAgICB9CisrCisgICAgIC8vIEFsbG9jYXRlIHRoZSB0cnVlIENMVVQKKyAgICAgbXBlID0gY21zU3RhZ2VBbGxvY0NMdXRGbG9hdEdyYW51bGFyKHNlbGYgLT5Db250ZXh0SUQsIEdyaWRQb2ludHMsIElucHV0Q2hhbnMsIE91dHB1dENoYW5zLCBOVUxMKTsKKyAgICAgaWYgKG1wZSA9PSBOVUxMKSBnb3RvIEVycm9yOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy8wMDE5LXV0ZjgucGF0Y2ggYi90aGlyZF9wYXJ0eS9sY21zLzAwMTktdXRmOC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTE2NTlkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGNtcy8wMDE5LXV0ZjgucGF0Y2gKQEAgLTAsMCArMSw5OCBAQAorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2NnYXRzLmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNjZ2F0cy5jCitpbmRleCA2MDExZmIyMDEuLmQ1MzM2MGIxZiAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2NnYXRzLmMKKysrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2NnYXRzLmMKK0BAIC0yNTUsNyArMjU1LDcgQEAgc3RhdGljIFBST1BFUlRZIFByZWRlZmluZWRQcm9wZXJ0aWVzW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWRlZC4KKyAKKyAgICAgICAgIHsiU0FNUExFX0JBQ0tJTkciLCAgIFdSSVRFX1NUUklOR0lGWX0sICAgLy8gSWRlbnRpZmllcyB0aGUgYmFja2luZyBtYXRlcmlhbCB1c2VkIGJlaGluZCB0aGUgc2FtcGxlIGR1cmluZworLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZWFzdXJlbWVudC4gQWxsb3dlZCB2YWx1ZXMgYXJlIDw5Mz5ibGFjazw5ND4sIDw5Mz53aGl0ZTw5ND4sIG9yIHsibmEiLgorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZWFzdXJlbWVudC4gQWxsb3dlZCB2YWx1ZXMgYXJlICJibGFjayIgIndoaXRlIiBvciAibmEiLgorIAorICAgICAgICAgeyJDSElTUV9ET0YiLCAgICAgICAgV1JJVEVfU1RSSU5HSUZZfSwgICAvLyBEZWdyZWVzIG9mIGZyZWVkb20gYXNzb2NpYXRlZCB3aXRoIHRoZSBDaGkgc3F1YXJlZCBzdGF0aXN0aWMKKyAKK0BAIC0yNzEsNyArMjcxLDcgQEAgc3RhdGljIFBST1BFUlRZIFByZWRlZmluZWRQcm9wZXJ0aWVzW10gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbm90ZSB0aGUgdXNlIG9mIGZpbHRlcnMgc3VjaCBhcyBub25lLCBENjUsIFJlZCwgR3JlZW4gb3IgQmx1ZS4KKyAKKyAgICAgICAgeyJQT0xBUklaQVRJT04iLCAgICAgIFdSSVRFX1NUUklOR0lGWX0sICAgLy8gSWRlbnRpZmllcyB0aGUgdXNlIG9mIGEgcGh5c2ljYWwgcG9sYXJpemF0aW9uIGZpbHRlciBkdXJpbmcgbWVhc3VyZW1lbnQuIEFsbG93ZWQKKy0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzIGFyZSB7Inllczw5ND4sIDw5Mz53aGl0ZTw5ND4sIDw5Mz5ub25lPDk0PiBvciA8OTM+bmE8OTQ+LgorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgYXJlICJ5ZXMiICJ3aGl0ZSIgIm5vbmUiIG9yICJuYSIuCisgCisgICAgICAgIHsiV0VJR0hUSU5HX0ZVTkNUSU9OIiwgV1JJVEVfUEFJUn0sICAgLy8gSW5kaWNhdGVzIHN1Y2ggZnVuY3Rpb25zIGFzOiB0aGUgQ0lFIHN0YW5kYXJkIG9ic2VydmVyIGZ1bmN0aW9ucyB1c2VkIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGlvbiBvZiB2YXJpb3VzIGRhdGEgcGFyYW1ldGVycyAoMiBkZWdyZWUgYW5kIDEwIGRlZ3JlZSksIENJRSBzdGFuZGFyZAorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3R5cGVzLmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXN0eXBlcy5jCitpbmRleCA1NjQ3MjY0YTYuLjY0ODQ1ZTI2MyAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3R5cGVzLmMKKysrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3R5cGVzLmMKK0BAIC05NjIsNyArOTYyLDcgQEAgY21zQm9vbCAgVHlwZV9UZXh0X0Rlc2NyaXB0aW9uX1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU8KKyAgICAgbGVuID0gY21zTUxVZ2V0QVNDSUkobWx1LCBjbXNOb0xhbmd1YWdlLCBjbXNOb0NvdW50cnksIE5VTEwsIDApOworIAorICAgICAvLyBTcGVjaWZpY2F0aW9uIElDQy4xOjIwMDEtMDQgKHYyLjQuMCk6IEl0IGhhcyBiZWVuIGZvdW5kIHRoYXQgdGV4dERlc2NyaXB0aW9uVHlwZSBjYW4gY29udGFpbiBtaXNhbGlnbmVkIGRhdGEKKy0gICAgLy8oc2VlIGNsYXVzZSA0LjEgZm9yIHRoZSBkZWZpbml0aW9uIG9mIDw5Mz5hbGlnbmVkPDk0PikuIEJlY2F1c2UgdGhlIFVuaWNvZGUgbGFuZ3VhZ2UKKysgICAgLy8oc2VlIGNsYXVzZSA0LjEgZm9yIHRoZSBkZWZpbml0aW9uIG9mICdhbGlnbmVkJy4gQmVjYXVzZSB0aGUgVW5pY29kZSBsYW5ndWFnZQorICAgICAvLyBjb2RlIGFuZCBVbmljb2RlIGNvdW50IGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgQVNDSUkgZGVzY3JpcHRpb24sIHRoZWlyCisgICAgIC8vIGFsaWdubWVudCBpcyBub3QgY29ycmVjdCBpZiB0aGUgQVNDSUkgY291bnQgaXMgbm90IGEgbXVsdGlwbGUgb2YgZm91ci4gVGhlCisgICAgIC8vIFNjcmlwdENvZGUgY29kZSBpcyBtaXNhbGlnbmVkIHdoZW4gdGhlIEFTQ0lJIGNvdW50IGlzIG9kZC4gUHJvZmlsZSByZWFkaW5nIGFuZAorQEAgLTMwNjYsMTAgKzMwNjYsMTAgQEAgdm9pZCBUeXBlX0NvbG9yYW50VGFibGVfRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQqIFB0cikKKyAvL1RoZSBuYW1lZENvbG9yMlR5cGUgaXMgYSBjb3VudCB2YWx1ZSBhbmQgYXJyYXkgb2Ygc3RydWN0dXJlcyB0aGF0IHByb3ZpZGUgY29sb3IKKyAvL2Nvb3JkaW5hdGVzIGZvciA3LWJpdCBBU0NJSSBjb2xvciBuYW1lcy4gRm9yIGVhY2ggbmFtZWQgY29sb3IsIGEgUENTIGFuZCBvcHRpb25hbAorIC8vZGV2aWNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb2xvciBhcmUgZ2l2ZW4uIEJvdGggcmVwcmVzZW50YXRpb25zIGFyZSAxNi1iaXQgdmFsdWVzLgorLS8vVGhlIGRldmljZSByZXByZXNlbnRhdGlvbiBjb3JyZXNwb25kcyB0byB0aGUgaGVhZGVyPDkyPnMgPDkzPmNvbG9yIHNwYWNlIG9mIGRhdGE8OTQ+IGZpZWxkLgorLS8vVGhpcyByZXByZXNlbnRhdGlvbiBzaG91bGQgYmUgY29uc2lzdGVudCB3aXRoIHRoZSA8OTM+bnVtYmVyIG9mIGRldmljZSBjb21wb25lbnRzPDk0PgorKy8vVGhlIGRldmljZSByZXByZXNlbnRhdGlvbiBjb3JyZXNwb25kcyB0byB0aGUgaGVhZGVyJ3MgJ2NvbG9yIHNwYWNlIG9mIGRhdGEnIGZpZWxkLgorKy8vVGhpcyByZXByZXNlbnRhdGlvbiBzaG91bGQgYmUgY29uc2lzdGVudCB3aXRoIHRoZSAnbnVtYmVyIG9mIGRldmljZSBjb21wb25lbnRzJworIC8vZmllbGQgaW4gdGhlIG5hbWVkQ29sb3IyVHlwZS4gSWYgdGhpcyBmaWVsZCBpcyAwLCBkZXZpY2UgY29vcmRpbmF0ZXMgYXJlIG5vdCBwcm92aWRlZC4KKy0vL1RoZSBQQ1MgcmVwcmVzZW50YXRpb24gY29ycmVzcG9uZHMgdG8gdGhlIGhlYWRlcjw5Mj5zIFBDUyBmaWVsZC4gVGhlIFBDUyByZXByZXNlbnRhdGlvbgorKy8vVGhlIFBDUyByZXByZXNlbnRhdGlvbiBjb3JyZXNwb25kcyB0byB0aGUgaGVhZGVyJ3MgUENTIGZpZWxkLiBUaGUgUENTIHJlcHJlc2VudGF0aW9uCisgLy9pcyBhbHdheXMgcHJvdmlkZWQuIENvbG9yIG5hbWVzIGFyZSBmaXhlZC1sZW5ndGgsIDMyLWJ5dGUgZmllbGRzIGluY2x1ZGluZyBudWxsCisgLy90ZXJtaW5hdGlvbi4gSW4gb3JkZXIgdG8gbWFpbnRhaW4gbWF4aW11bSBwb3J0YWJpbGl0eSwgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQKKyAvL3RoYXQgc3BlY2lhbCBjaGFyYWN0ZXJzIG9mIHRoZSA3LWJpdCBBU0NJSSBzZXQgbm90IGJlIHVzZWQuCitAQCAtMzgxNCw3ICszODE0LDcgQEAgdm9pZCBUeXBlX1NjcmVlbmluZ19GcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCogUHRyKQorIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgLy8KKyAvL1RoaXMgdHlwZSByZXByZXNlbnRzIGEgc2V0IG9mIHZpZXdpbmcgY29uZGl0aW9uIHBhcmFtZXRlcnMgaW5jbHVkaW5nOgorLS8vQ0lFIDw5Mj5hYnNvbHV0ZTw5Mj4gaWxsdW1pbmFudCB3aGl0ZSBwb2ludCB0cmlzdGltdWx1cyB2YWx1ZXMgYW5kIENJRSA8OTI+YWJzb2x1dGU8OTI+CisrLy9DSUUgJ2Fic29sdXRlJ2lsbHVtaW5hbnQgd2hpdGUgcG9pbnQgdHJpc3RpbXVsdXMgdmFsdWVzIGFuZCBDSUUgJ2Fic29sdXRlJworIC8vc3Vycm91bmQgdHJpc3RpbXVsdXMgdmFsdWVzLgorIAorIHN0YXRpYworQEAgLTM5MDEsNyArMzkwMSw3IEBAIHZvaWQgR2VuZXJpY01QRWZyZWUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCB2b2lkICpQdHIpCisgfQorIAorIC8vIEVhY2ggY3VydmUgaXMgc3RvcmVkIGluIG9uZSBvciBtb3JlIGN1cnZlIHNlZ21lbnRzLCB3aXRoIGJyZWFrLXBvaW50cyBzcGVjaWZpZWQgYmV0d2VlbiBjdXJ2ZSBzZWdtZW50cy4KKy0vLyBUaGUgZmlyc3QgY3VydmUgc2VnbWVudCBhbHdheXMgc3RhcnRzIGF0IDw5Nj5JbmZpbml0eSwgYW5kIHRoZSBsYXN0IGN1cnZlIHNlZ21lbnQgYWx3YXlzIGVuZHMgYXQgK0luZmluaXR5LiBUaGUKKysvLyBUaGUgZmlyc3QgY3VydmUgc2VnbWVudCBhbHdheXMgc3RhcnRzIGF0IC1JbmZpbml0eSwgYW5kIHRoZSBsYXN0IGN1cnZlIHNlZ21lbnQgYWx3YXlzIGVuZHMgYXQgK0luZmluaXR5LiBUaGUKKyAvLyBmaXJzdCBhbmQgbGFzdCBjdXJ2ZSBzZWdtZW50cyBzaGFsbCBiZSBzcGVjaWZpZWQgaW4gdGVybXMgb2YgYSBmb3JtdWxhLCB3aGVyZWFzIHRoZSBvdGhlciBzZWdtZW50cyBzaGFsbCBiZQorIC8vIHNwZWNpZmllZCBlaXRoZXIgaW4gdGVybXMgb2YgYSBmb3JtdWxhLCBvciBieSBhIHNhbXBsZWQgY3VydmUuCisgCitkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdmlydC5jIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdmlydC5jCitpbmRleCBiODc5NWJlMmMuLjllZmYxZjdiZSAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3ZpcnQuYworKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdmlydC5jCitAQCAtNjEyLDE4ICs2MTIsMTggQEAgY21zSFBST0ZJTEUgQ01TRVhQT1JUIGNtc0NyZWF0ZVhZWlByb2ZpbGUodm9pZCkKKyAKKyAvL3NSR0IgQ3VydmVzIGFyZSBkZWZpbmVkIGJ5OgorIC8vCistLy9JZiAgUjw5Mj5zUkdCLEc8OTI+c1JHQiwgQjw5Mj5zUkdCIDwgMC4wNDA0NQorKy8vSWYgIFInc1JHQixHJ3NSR0IsIEInc1JHQiA8IDAuMDQwNDUKKyAvLworLS8vICAgIFIgPSAgUjw5Mj5zUkdCIC8gMTIuOTIKKy0vLyAgICBHID0gIEc8OTI+c1JHQiAvIDEyLjkyCistLy8gICAgQiA9ICBCPDkyPnNSR0IgLyAxMi45MgorKy8vICAgIFIgPSAgUidzUkdCIC8gMTIuOTIKKysvLyAgICBHID0gIEcnc1JHQiAvIDEyLjkyCisrLy8gICAgQiA9ICBCJ3NSR0IgLyAxMi45MgorIC8vCisgLy8KKy0vL2Vsc2UgaWYgIFI8OTI+c1JHQixHPDkyPnNSR0IsIEI8OTI+c1JHQiA+PSAwLjA0MDQ1CisrLy9lbHNlIGlmICBSJ3NSR0IsRydzUkdCLCBCJ3NSR0IgPj0gMC4wNDA0NQorIC8vCistLy8gICAgUiA9ICgoUjw5Mj5zUkdCICsgMC4wNTUpIC8gMS4wNTUpXjIuNAorLS8vICAgIEcgPSAoKEc8OTI+c1JHQiArIDAuMDU1KSAvIDEuMDU1KV4yLjQKKy0vLyAgICBCID0gKChCPDkyPnNSR0IgKyAwLjA1NSkgLyAxLjA1NSleMi40CisrLy8gICAgUiA9ICgoUidzUkdCICsgMC4wNTUpIC8gMS4wNTUpXjIuNAorKy8vICAgIEcgPSAoKEcnc1JHQiArIDAuMDU1KSAvIDEuMDU1KV4yLjQKKysvLyAgICBCID0gKChCJ3NSR0IgKyAwLjA1NSkgLyAxLjA1NSleMi40CisgCisgc3RhdGljCisgY21zVG9uZUN1cnZlKiBCdWlsZF9zUkdCR2FtbWEoY21zQ29udGV4dCBDb250ZXh0SUQpCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zLzAwMjAtYXZvaWQtZml4ZWQtaW5mLnBhdGNoIGIvdGhpcmRfcGFydHkvbGNtcy8wMDIwLWF2b2lkLWZpeGVkLWluZi5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjM5N2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGNtcy8wMDIwLWF2b2lkLWZpeGVkLWluZi5wYXRjaApAQCAtMCwwICsxLDk1IEBACitkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zb3B0LmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNvcHQuYworaW5kZXggZTRhN2U0NTIxLi4yM2FhNTQ0MDIgMTAwNjQ0CistLS0gYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNvcHQuYworKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zb3B0LmMKK0BAIC0xNTQ2LDcgKzE1NDYsNyBAQCB2b2lkIE1hdFNoYXBlckV2YWwxNihyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5bXSwKKyAKKyAvLyBUaGlzIHRhYmxlIGNvbnZlcnRzIGZyb20gOCBiaXRzIHRvIDEuMTQgYWZ0ZXIgYXBwbHlpbmcgdGhlIGN1cnZlCisgc3RhdGljCistdm9pZCBGaWxsRmlyc3RTaGFwZXIoY21zUzFGaXhlZDE0TnVtYmVyKiBUYWJsZSwgY21zVG9uZUN1cnZlKiBDdXJ2ZSkKKytjbXNCb29sIEZpbGxGaXJzdFNoYXBlcihjbXNTMUZpeGVkMTROdW1iZXIqIFRhYmxlLCBjbXNUb25lQ3VydmUqIEN1cnZlKQorIHsKKyAgICAgaW50IGk7CisgICAgIGNtc0Zsb2F0MzJOdW1iZXIgUiwgeTsKK0BAIC0xNTU1LDE0ICsxNTU1LDE3IEBAIHZvaWQgRmlsbEZpcnN0U2hhcGVyKGNtc1MxRml4ZWQxNE51bWJlciogVGFibGUsIGNtc1RvbmVDdXJ2ZSogQ3VydmUpCisgCisgICAgICAgICBSICAgPSAoY21zRmxvYXQzMk51bWJlcikgKGkgLyAyNTUuMCk7CisgICAgICAgICB5ICAgPSBjbXNFdmFsVG9uZUN1cnZlRmxvYXQoQ3VydmUsIFIpOworKyAgICAgICAgaWYgKGlzaW5mKHkpKQorKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAKKyAgICAgICAgIFRhYmxlW2ldID0gRE9VQkxFX1RPXzFGSVhFRDE0KHkpOworICAgICB9CisrICAgIHJldHVybiBUUlVFOworIH0KKyAKKyAvLyBUaGlzIHRhYmxlIGNvbnZlcnRzIGZvcm0gMS4xNCAoYmVpbmcgMHg0MDAwIHRoZSBsYXN0IGVudHJ5KSB0byA4IGJpdHMgYWZ0ZXIgYXBwbHlpbmcgdGhlIGN1cnZlCisgc3RhdGljCistdm9pZCBGaWxsU2Vjb25kU2hhcGVyKGNtc1VJbnQxNk51bWJlciogVGFibGUsIGNtc1RvbmVDdXJ2ZSogQ3VydmUsIGNtc0Jvb2wgSXM4Qml0c091dHB1dCkKKytjbXNCb29sIEZpbGxTZWNvbmRTaGFwZXIoY21zVUludDE2TnVtYmVyKiBUYWJsZSwgY21zVG9uZUN1cnZlKiBDdXJ2ZSwgY21zQm9vbCBJczhCaXRzT3V0cHV0KQorIHsKKyAgICAgaW50IGk7CisgICAgIGNtc0Zsb2F0MzJOdW1iZXIgUiwgVmFsOworQEAgLTE1NzEsNiArMTU3NCw4IEBAIHZvaWQgRmlsbFNlY29uZFNoYXBlcihjbXNVSW50MTZOdW1iZXIqIFRhYmxlLCBjbXNUb25lQ3VydmUqIEN1cnZlLCBjbXNCb29sIElzOEJpCisgCisgICAgICAgICBSICAgPSAoY21zRmxvYXQzMk51bWJlcikgKGkgLyAxNjM4NC4wKTsKKyAgICAgICAgIFZhbCA9IGNtc0V2YWxUb25lQ3VydmVGbG9hdChDdXJ2ZSwgUik7ICAgIC8vIFZhbCBjb21lcyAwLi4xLjAKKysgICAgICAgIGlmIChpc2luZihWYWwpKQorKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAKKyAgICAgICAgIGlmIChJczhCaXRzT3V0cHV0KSB7CisgCitAQCAtMTU4NSw2ICsxNTkwLDcgQEAgdm9pZCBGaWxsU2Vjb25kU2hhcGVyKGNtc1VJbnQxNk51bWJlciogVGFibGUsIGNtc1RvbmVDdXJ2ZSogQ3VydmUsIGNtc0Jvb2wgSXM4QmkKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgVGFibGVbaV0gID0gX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKFZhbCAqIDY1NTM1LjApOworICAgICB9CisrICAgIHJldHVybiBUUlVFOworIH0KKyAKKyAvLyBDb21wdXRlIHRoZSBtYXRyaXgtc2hhcGVyIHN0cnVjdHVyZQorQEAgLTE2MDIsMTMgKzE2MDgsMTkgQEAgY21zQm9vbCBTZXRNYXRTaGFwZXIoY21zUGlwZWxpbmUqIERlc3QsIGNtc1RvbmVDdXJ2ZSogQ3VydmUxWzNdLCBjbXNNQVQzKiBNYXQsIGMKKyAgICAgcCAtPiBDb250ZXh0SUQgPSBEZXN0IC0+IENvbnRleHRJRDsKKyAKKyAgICAgLy8gUHJlY29tcHV0ZSB0YWJsZXMKKy0gICAgRmlsbEZpcnN0U2hhcGVyKHAgLT5TaGFwZXIxUiwgQ3VydmUxWzBdKTsKKy0gICAgRmlsbEZpcnN0U2hhcGVyKHAgLT5TaGFwZXIxRywgQ3VydmUxWzFdKTsKKy0gICAgRmlsbEZpcnN0U2hhcGVyKHAgLT5TaGFwZXIxQiwgQ3VydmUxWzJdKTsKKysgICAgaWYgKCFGaWxsRmlyc3RTaGFwZXIocCAtPlNoYXBlcjFSLCBDdXJ2ZTFbMF0pKQorKyAgICAgICAgZ290byBFcnJvcjsKKysgICAgaWYgKCFGaWxsRmlyc3RTaGFwZXIocCAtPlNoYXBlcjFHLCBDdXJ2ZTFbMV0pKQorKyAgICAgICAgZ290byBFcnJvcjsKKysgICAgaWYgKCFGaWxsRmlyc3RTaGFwZXIocCAtPlNoYXBlcjFCLCBDdXJ2ZTFbMl0pKQorKyAgICAgICAgZ290byBFcnJvcjsKKyAKKy0gICAgRmlsbFNlY29uZFNoYXBlcihwIC0+U2hhcGVyMlIsIEN1cnZlMlswXSwgSXM4Qml0cyk7CistICAgIEZpbGxTZWNvbmRTaGFwZXIocCAtPlNoYXBlcjJHLCBDdXJ2ZTJbMV0sIElzOEJpdHMpOworLSAgICBGaWxsU2Vjb25kU2hhcGVyKHAgLT5TaGFwZXIyQiwgQ3VydmUyWzJdLCBJczhCaXRzKTsKKysgICAgaWYgKCFGaWxsU2Vjb25kU2hhcGVyKHAgLT5TaGFwZXIyUiwgQ3VydmUyWzBdLCBJczhCaXRzKSkKKysgICAgICAgIGdvdG8gRXJyb3I7CisrICAgIGlmICghRmlsbFNlY29uZFNoYXBlcihwIC0+U2hhcGVyMkcsIEN1cnZlMlsxXSwgSXM4Qml0cykpCisrICAgICAgICBnb3RvIEVycm9yOworKyAgICBpZiAoIUZpbGxTZWNvbmRTaGFwZXIocCAtPlNoYXBlcjJCLCBDdXJ2ZTJbMl0sIElzOEJpdHMpKQorKyAgICAgICAgZ290byBFcnJvcjsKKyAKKyAgICAgLy8gQ29udmVydCBtYXRyaXggdG8gbkZpeGVkMTQuIE5vdGUgdGhhdCB0aG9zZSB2YWx1ZXMgbWF5IHRha2UgbW9yZSB0aGFuIDE2IGJpdHMgYXMKKyAgICAgZm9yIChpPTA7IGkgPCAzOyBpKyspIHsKK0BAIC0xNjM0LDYgKzE2NDYsOSBAQCBjbXNCb29sIFNldE1hdFNoYXBlcihjbXNQaXBlbGluZSogRGVzdCwgY21zVG9uZUN1cnZlKiBDdXJ2ZTFbM10sIGNtc01BVDMqIE1hdCwgYworICAgICAvLyBGaWxsIGZ1bmN0aW9uIHBvaW50ZXJzCisgICAgIF9jbXNQaXBlbGluZVNldE9wdGltaXphdGlvblBhcmFtZXRlcnMoRGVzdCwgTWF0U2hhcGVyRXZhbDE2LCAodm9pZCopIHAsIEZyZWVNYXRTaGFwZXIsIER1cE1hdFNoYXBlcik7CisgICAgIHJldHVybiBUUlVFOworKyAgICBFcnJvcjoKKysgICAgICAgIF9jbXNGcmVlKERlc3QtPkNvbnRleHRJRCwgcCk7CisrICAgICAgICByZXR1cm4gRkFMU0U7CisgfQorIAorIC8vICA4IGJpdHMgb24gaW5wdXQgYWxsb3dzIG1hdHJpeC1zaGFwZXIgYm9vdCB1cCB0byAyNSBNcGl4ZWxzIHBlciBzZWNvbmQgb24gUkdCLiBUaGF0J3MgZmFzdCEKK0BAIC0xNzQ2LDcgKzE3NjEsOCBAQCBjbXNCb29sIE9wdGltaXplTWF0cml4U2hhcGVyKGNtc1BpcGVsaW5lKiogTHV0LCBjbXNVSW50MzJOdW1iZXIgSW50ZW50LCBjbXNVSW50MworICAgICAgICAgKmR3RmxhZ3MgfD0gY21zRkxBR1NfTk9DQUNIRTsKKyAKKyAgICAgICAgIC8vIFNldHVwIHRoZSBvcHRpbWl6YXJpb24gcm91dGluZXMKKy0gICAgICAgIFNldE1hdFNoYXBlcihEZXN0LCBtcGVDMSAtPlRoZUN1cnZlcywgJnJlcywgKGNtc1ZFQzMqKSBPZmZzZXQsIG1wZUMyLT5UaGVDdXJ2ZXMsIE91dHB1dEZvcm1hdCk7CisrICAgICAgICBpZiAoIVNldE1hdFNoYXBlcihEZXN0LCBtcGVDMSAtPlRoZUN1cnZlcywgJnJlcywgKGNtc1ZFQzMqKSBPZmZzZXQsIG1wZUMyLT5UaGVDdXJ2ZXMsIE91dHB1dEZvcm1hdCkpCisrICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgfQorIAorICAgICBjbXNQaXBlbGluZUZyZWUoU3JjKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvMDAyMS1zYW5pdGl6ZS1mbG9hdC1yZWFkLnBhdGNoIGIvdGhpcmRfcGFydHkvbGNtcy8wMDIxLXNhbml0aXplLWZsb2F0LXJlYWQucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4ZmQwZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvMDAyMS1zYW5pdGl6ZS1mbG9hdC1yZWFkLnBhdGNoCkBAIC0wLDAgKzEsMTUgQEAKK2RpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNwbHVnaW4uYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3BsdWdpbi5jCitpbmRleCBiOTViZWZiLi40YmE5OThiIDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zcGx1Z2luLmMKKysrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3BsdWdpbi5jCitAQCAtMTgyLDcgKzE4Miw5IEBAIGNtc0Jvb2wgQ01TRVhQT1JUICBfY21zUmVhZEZsb2F0MzJOdW1iZXIoY21zSU9IQU5ETEVSKiBpbywgY21zRmxvYXQzMk51bWJlciogbikKKyAgICAgICAgIGlmIChpc25hbigqbikpCisgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICB9CistICAgIHJldHVybiBUUlVFOworKworKyAgICAvLyBmcGNsYXNzaWZ5KCkgcmVxdWlyZWQgYnkgQzk5CisrICAgIHJldHVybiAoZnBjbGFzc2lmeSgqbikgPT0gRlBfWkVSTykgfHwgKGZwY2xhc3NpZnkoKm4pID09IEZQX05PUk1BTCk7CisgfQorIAorIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy8wMDIyLWNoZWNrLUxVVC1hbmQtTVBFLnBhdGNoIGIvdGhpcmRfcGFydHkvbGNtcy8wMDIyLWNoZWNrLUxVVC1hbmQtTVBFLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZGRhYzgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9sY21zLzAwMjItY2hlY2stTFVULWFuZC1NUEUucGF0Y2gKQEAgLTAsMCArMSwxNzAgQEAKK2RpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNsdXQuYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2x1dC5jCitpbmRleCA5YjBlYjRiNTQuLjE5ZDQzMzYxZiAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2x1dC5jCisrKysgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNsdXQuYworQEAgLTEyNTUsMjEgKzEyNTUsMzkgQEAgY21zU3RhZ2UqIENNU0VYUE9SVCBjbXNTdGFnZUR1cChjbXNTdGFnZSogbXBlKQorIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgCisgLy8gVGhpcyBmdW5jdGlvbiBzZXRzIHVwIHRoZSBjaGFubmVsIGNvdW50CistCisgc3RhdGljCistdm9pZCBCbGVzc0xVVChjbXNQaXBlbGluZSogbHV0KQorK2Ntc0Jvb2wgQmxlc3NMVVQoY21zUGlwZWxpbmUqIGx1dCkKKyB7CisgICAgIC8vIFdlIGNhbiBzZXQgdGhlIGlucHV0L291cHV0IGNoYW5uZWxzIG9ubHkgaWYgd2UgaGF2ZSBlbGVtZW50cy4KKyAgICAgaWYgKGx1dCAtPkVsZW1lbnRzICE9IE5VTEwpIHsKKyAKKy0gICAgICAgIGNtc1N0YWdlICpGaXJzdCwgKkxhc3Q7CisrICAgICAgICBjbXNTdGFnZSogcHJldjsKKysgICAgICAgIGNtc1N0YWdlKiBuZXh0OworKyAgICAgICAgY21zU3RhZ2UqIEZpcnN0OworKyAgICAgICAgY21zU3RhZ2UqIExhc3Q7CisgCisgICAgICAgICBGaXJzdCAgPSBjbXNQaXBlbGluZUdldFB0clRvRmlyc3RTdGFnZShsdXQpOworICAgICAgICAgTGFzdCAgID0gY21zUGlwZWxpbmVHZXRQdHJUb0xhc3RTdGFnZShsdXQpOworIAorLSAgICAgICAgaWYgKEZpcnN0ICE9IE5VTEwpbHV0IC0+SW5wdXRDaGFubmVscyA9IEZpcnN0IC0+SW5wdXRDaGFubmVsczsKKy0gICAgICAgIGlmIChMYXN0ICE9IE5VTEwpIGx1dCAtPk91dHB1dENoYW5uZWxzID0gTGFzdCAtPk91dHB1dENoYW5uZWxzOworKyAgICAgICAgaWYgKEZpcnN0ID09IE5VTEwgfHwgTGFzdCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisrCisrICAgICAgICBsdXQtPklucHV0Q2hhbm5lbHMgPSBGaXJzdC0+SW5wdXRDaGFubmVsczsKKysgICAgICAgIGx1dC0+T3V0cHV0Q2hhbm5lbHMgPSBMYXN0LT5PdXRwdXRDaGFubmVsczsKKysKKysgICAgICAgIC8vIENoZWNrIGNoYWluIGNvbnNpc3RlbmN5CisrICAgICAgICBwcmV2ID0gRmlyc3Q7CisrICAgICAgICBuZXh0ID0gcHJldi0+TmV4dDsKKysKKysgICAgICAgIHdoaWxlIChuZXh0ICE9IE5VTEwpCisrICAgICAgICB7CisrICAgICAgICAgICAgaWYgKG5leHQtPklucHV0Q2hhbm5lbHMgIT0gcHJldi0+T3V0cHV0Q2hhbm5lbHMpCisrICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKysKKysgICAgICAgICAgICBuZXh0ID0gbmV4dC0+TmV4dDsKKysgICAgICAgICAgICBwcmV2ID0gcHJldi0+TmV4dDsKKysgICAgICAgIH0KKyAgICAgfQorKyAgICByZXR1cm4gVFJVRTsKKyB9CisgCisgCitAQCAtMTMzMSw2ICsxMzQ5LDcgQEAgY21zUGlwZWxpbmUqIENNU0VYUE9SVCBjbXNQaXBlbGluZUFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgSW4KKyB7CisgICAgICAgIGNtc1BpcGVsaW5lKiBOZXdMVVQ7CisgCisrICAgICAgIC8vIEEgdmFsdWUgb2YgemVybyBpbiBjaGFubmVscyBpcyBhbGxvd2VkIGFzIHBsYWNlaG9sZGVyCisgICAgICAgIGlmIChJbnB1dENoYW5uZWxzID49IGNtc01BWENIQU5ORUxTIHx8CisgICAgICAgICAgICBPdXRwdXRDaGFubmVscyA+PSBjbXNNQVhDSEFOTkVMUykgcmV0dXJuIE5VTEw7CisgCitAQCAtMTM0OCw3ICsxMzY3LDExIEBAIGNtc1BpcGVsaW5lKiBDTVNFWFBPUlQgY21zUGlwZWxpbmVBbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIEluCisgICAgICAgIE5ld0xVVCAtPkRhdGEgICAgICAgID0gTmV3TFVUOworICAgICAgICBOZXdMVVQgLT5Db250ZXh0SUQgICA9IENvbnRleHRJRDsKKyAKKy0gICAgICAgQmxlc3NMVVQoTmV3TFVUKTsKKysgICAgICAgaWYgKCFCbGVzc0xVVChOZXdMVVQpKQorKyAgICAgICB7CisrICAgICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIE5ld0xVVCk7CisrICAgICAgICAgICByZXR1cm4gTlVMTDsKKysgICAgICAgfQorIAorICAgICAgICByZXR1cm4gTmV3TFVUOworIH0KK0BAIC0xNDU0LDcgKzE0NzcsMTIgQEAgY21zUGlwZWxpbmUqIENNU0VYUE9SVCBjbXNQaXBlbGluZUR1cChjb25zdCBjbXNQaXBlbGluZSogbHV0KQorIAorICAgICBOZXdMVVQgLT5TYXZlQXM4Qml0cyAgICA9IGx1dCAtPlNhdmVBczhCaXRzOworIAorLSAgICBCbGVzc0xVVChOZXdMVVQpOworKyAgICBpZiAoIUJsZXNzTFVUKE5ld0xVVCkpCisrICAgIHsKKysgICAgICAgIF9jbXNGcmVlKGx1dC0+Q29udGV4dElELCBOZXdMVVQpOworKyAgICAgICAgcmV0dXJuIE5VTEw7CisrICAgIH0KKysKKyAgICAgcmV0dXJuIE5ld0xVVDsKKyB9CisgCitAQCAtMTQ5MSw4ICsxNTE5LDcgQEAgaW50IENNU0VYUE9SVCBjbXNQaXBlbGluZUluc2VydFN0YWdlKGNtc1BpcGVsaW5lKiBsdXQsIGNtc1N0YWdlTG9jIGxvYywgY21zU3RhZ2UKKyAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgIH0KKyAKKy0gICAgQmxlc3NMVVQobHV0KTsKKy0gICAgcmV0dXJuIFRSVUU7CisrICAgIHJldHVybiBCbGVzc0xVVChsdXQpOworIH0KKyAKKyAvLyBVbmxpbmsgYW4gZWxlbWVudCBhbmQgcmV0dXJuIHRoZSBwb2ludGVyIHRvIGl0CitAQCAtMTU0Nyw2ICsxNTc0LDcgQEAgdm9pZCBDTVNFWFBPUlQgY21zUGlwZWxpbmVVbmxpbmtTdGFnZShjbXNQaXBlbGluZSogbHV0LCBjbXNTdGFnZUxvYyBsb2MsIGNtc1N0YWcKKyAgICAgZWxzZQorICAgICAgICAgY21zU3RhZ2VGcmVlKFVubGlua2VkKTsKKyAKKysgICAgLy8gTWF5IGZhaWwsIGJ1dCB3ZSBpZ25vcmUgaXQKKyAgICAgQmxlc3NMVVQobHV0KTsKKyB9CisgCitAQCAtMTU3Myw4ICsxNjAxLDcgQEAgY21zQm9vbCAgQ01TRVhQT1JUIGNtc1BpcGVsaW5lQ2F0KGNtc1BpcGVsaW5lKiBsMSwgY29uc3QgY21zUGlwZWxpbmUqIGwyKQorICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgIH0KKyAKKy0gICAgQmxlc3NMVVQobDEpOworLSAgICByZXR1cm4gVFJVRTsKKysgICAgcmV0dXJuIEJsZXNzTFVUKGwxKTsKKyB9CisgCisgCitkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3R5cGVzLmMKK2luZGV4IGU1ZWQwNmMzMy4uMDI1NmUyNDdiIDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYworKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYworQEAgLTE3NTUsOCArMTc1NSw4IEBAIHZvaWQgKlR5cGVfTFVUOF9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zCisgICAgIGlmICghX2Ntc1JlYWRVSW50OE51bWJlcihpbywgTlVMTCkpIGdvdG8gRXJyb3I7CisgCisgICAgIC8vIERvIHNvbWUgY2hlY2tpbmcKKy0gICAgaWYgKElucHV0Q2hhbm5lbHMgPiBjbXNNQVhDSEFOTkVMUykgIGdvdG8gRXJyb3I7CistICAgIGlmIChPdXRwdXRDaGFubmVscyA+IGNtc01BWENIQU5ORUxTKSBnb3RvIEVycm9yOworKyAgICBpZiAoSW5wdXRDaGFubmVscyA9PSAwIHx8IElucHV0Q2hhbm5lbHMgPiBjbXNNQVhDSEFOTkVMUykgIGdvdG8gRXJyb3I7CisrICAgIGlmIChPdXRwdXRDaGFubmVscyA9PSAwIHx8IE91dHB1dENoYW5uZWxzID4gY21zTUFYQ0hBTk5FTFMpIGdvdG8gRXJyb3I7CisgCisgICAgLy8gQWxsb2NhdGVzIGFuIGVtcHR5IFBpcGVsaW5lCisgICAgIE5ld0xVVCA9IGNtc1BpcGVsaW5lQWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgSW5wdXRDaGFubmVscywgT3V0cHV0Q2hhbm5lbHMpOworQEAgLTIwNDgsOCArMjA0OCw4IEBAIHZvaWQgKlR5cGVfTFVUMTZfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtCisgICAgIGlmICghX2Ntc1JlYWRVSW50OE51bWJlcihpbywgTlVMTCkpIHJldHVybiBOVUxMOworIAorICAgICAvLyBEbyBzb21lIGNoZWNraW5nCistICAgIGlmIChJbnB1dENoYW5uZWxzID4gY21zTUFYQ0hBTk5FTFMpICBnb3RvIEVycm9yOworLSAgICBpZiAoT3V0cHV0Q2hhbm5lbHMgPiBjbXNNQVhDSEFOTkVMUykgZ290byBFcnJvcjsKKysgICAgaWYgKElucHV0Q2hhbm5lbHMgPT0gMCB8fCBJbnB1dENoYW5uZWxzID4gY21zTUFYQ0hBTk5FTFMpICBnb3RvIEVycm9yOworKyAgICBpZiAoT3V0cHV0Q2hhbm5lbHMgPT0gMCB8fCBPdXRwdXRDaGFubmVscyA+IGNtc01BWENIQU5ORUxTKSBnb3RvIEVycm9yOworIAorICAgICAvLyBBbGxvY2F0ZXMgYW4gZW1wdHkgTFVUCisgICAgIE5ld0xVVCA9IGNtc1BpcGVsaW5lQWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgSW5wdXRDaGFubmVscywgT3V0cHV0Q2hhbm5lbHMpOworQEAgLTI0ODYsNyArMjQ4NiwxMCBAQCB2b2lkKiBUeXBlX0xVVEEyQl9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgYworICAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmb2Zmc2V0QykpIHJldHVybiBOVUxMOworICAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmb2Zmc2V0QSkpIHJldHVybiBOVUxMOworIAorLSAgIC8vIEFsbG9jYXRlcyBhbiBlbXB0eSBMVVQKKysgICAgaWYgKGlucHV0Q2hhbiA9PSAwIHx8IGlucHV0Q2hhbiA+PSBjbXNNQVhDSEFOTkVMUykgcmV0dXJuIE5VTEw7CisrICAgIGlmIChvdXRwdXRDaGFuID09IDAgfHwgb3V0cHV0Q2hhbiA+PSBjbXNNQVhDSEFOTkVMUykgcmV0dXJuIE5VTEw7CisrCisrICAgIC8vIEFsbG9jYXRlcyBhbiBlbXB0eSBMVVQKKyAgICAgTmV3TFVUID0gY21zUGlwZWxpbmVBbGxvYyhzZWxmIC0+Q29udGV4dElELCBpbnB1dENoYW4sIG91dHB1dENoYW4pOworICAgICBpZiAoTmV3TFVUID09IE5VTEwpIHJldHVybiBOVUxMOworIAorQEAgLTI3OTQsNiArMjc5Nyw5IEBAIHZvaWQqIFR5cGVfTFVUQjJBX1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjCisgICAgIGlmICghX2Ntc1JlYWRVSW50OE51bWJlcihpbywgJmlucHV0Q2hhbikpIHJldHVybiBOVUxMOworICAgICBpZiAoIV9jbXNSZWFkVUludDhOdW1iZXIoaW8sICZvdXRwdXRDaGFuKSkgcmV0dXJuIE5VTEw7CisgCisrICAgIGlmIChpbnB1dENoYW4gPT0gMCB8fCBpbnB1dENoYW4gPj0gY21zTUFYQ0hBTk5FTFMpIHJldHVybiBOVUxMOworKyAgICBpZiAob3V0cHV0Q2hhbiA9PSAwIHx8IG91dHB1dENoYW4gPj0gY21zTUFYQ0hBTk5FTFMpIHJldHVybiBOVUxMOworKworICAgICAvLyBQYWRkaW5nCisgICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sIE5VTEwpKSByZXR1cm4gTlVMTDsKKyAKK0BAIC00NDQzLDYgKzQ0NDksOSBAQCB2b2lkICpUeXBlX01QRV9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zVQorICAgICBpZiAoIV9jbXNSZWFkVUludDE2TnVtYmVyKGlvLCAmSW5wdXRDaGFucykpIHJldHVybiBOVUxMOworICAgICBpZiAoIV9jbXNSZWFkVUludDE2TnVtYmVyKGlvLCAmT3V0cHV0Q2hhbnMpKSByZXR1cm4gTlVMTDsKKyAKKysgICAgaWYgKElucHV0Q2hhbnMgPT0gMCB8fCBJbnB1dENoYW5zID49IGNtc01BWENIQU5ORUxTKSByZXR1cm4gTlVMTDsKKysgICAgaWYgKE91dHB1dENoYW5zID09IDAgfHwgT3V0cHV0Q2hhbnMgPj0gY21zTUFYQ0hBTk5FTFMpIHJldHVybiBOVUxMOworKworICAgICAvLyBBbGxvY2F0ZXMgYW4gZW1wdHkgTFVUCisgICAgIE5ld0xVVCA9IGNtc1BpcGVsaW5lQWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgSW5wdXRDaGFucywgT3V0cHV0Q2hhbnMpOworICAgICBpZiAoTmV3TFVUID09IE5VTEwpIHJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy8wMDIzLXVwc3RyZWFtLWludGVnZXItb3ZlcmZsb3ctTVBFbWF0cml4X1JlYWQucGF0Y2ggYi90aGlyZF9wYXJ0eS9sY21zLzAwMjMtdXBzdHJlYW0taW50ZWdlci1vdmVyZmxvdy1NUEVtYXRyaXhfUmVhZC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGE2YmI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGNtcy8wMDIzLXVwc3RyZWFtLWludGVnZXItb3ZlcmZsb3ctTVBFbWF0cml4X1JlYWQucGF0Y2gKQEAgLTAsMCArMSw4NSBAQAorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2NnYXRzLmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNjZ2F0cy5jCitpbmRleCA1NzIwYzY2YTcuLmNjZTRjZWRiYSAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2NnYXRzLmMKKysrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2NnYXRzLmMKK0BAIC0xNTAsMjMgKzE1MCwyNCBAQCB0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgICBTVUJBTExPQ0FUT1IgICBBbGxvY2F0b3I7ICAgICAgICAgICAgIC8vIFN0cmluZyBzdWJhbGxvY2F0b3IgLS0ganVzdCB0byBrZWVwIGl0IGZhc3QKKyAKKyAgICAgICAgIC8vIFBhcnNlciBzdGF0ZSBtYWNoaW5lCistICAgICAgICBTWU1CT0wgICAgICAgICBzeTsgICAgICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgc3ltYm9sCistICAgICAgICBpbnQgICAgICAgICAgICBjaDsgICAgICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgY2hhcmFjdGVyCisrICAgICAgICBTWU1CT0wgICAgICAgICAgICAgc3k7ICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgc3ltYm9sCisrICAgICAgICBpbnQgICAgICAgICAgICAgICAgY2g7ICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgY2hhcmFjdGVyCisrCisrICAgICAgICBjbXNJbnQzMk51bWJlciAgICAgaW51bTsgICAgICAgICAgICAgIC8vIGludGVnZXIgdmFsdWUKKysgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgICBkbnVtOyAgICAgICAgICAgICAgLy8gcmVhbCB2YWx1ZQorIAorLSAgICAgICAgaW50ICAgICAgICAgICAgaW51bTsgICAgICAgICAgICAgICAgICAvLyBpbnRlZ2VyIHZhbHVlCistICAgICAgICBjbXNGbG9hdDY0TnVtYmVyICAgICAgICAgZG51bTsgICAgICAgICAgICAgICAgICAvLyByZWFsIHZhbHVlCisgICAgICAgICBjaGFyICAgICAgICAgICBpZFtNQVhJRF07ICAgICAgICAgICAgIC8vIGlkZW50aWZpZXIKKyAgICAgICAgIGNoYXIgICAgICAgICAgIHN0cltNQVhTVFJdOyAgICAgICAgICAgLy8gc3RyaW5nCisgCisgICAgICAgICAvLyBBbGxvd2VkIGtleXdvcmRzICYgZGF0YXNldHMuIFRoZXkgaGF2ZSB2aXNpYmlsaXR5IG9uIHdob2xlIHN0cmVhbQorLSAgICAgICAgS0VZVkFMVUUqICAgICBWYWxpZEtleXdvcmRzOworLSAgICAgICAgS0VZVkFMVUUqICAgICBWYWxpZFNhbXBsZUlEOworKyAgICAgICAgS0VZVkFMVUUqICAgICAgVmFsaWRLZXl3b3JkczsKKysgICAgICAgIEtFWVZBTFVFKiAgICAgIFZhbGlkU2FtcGxlSUQ7CisgCisgICAgICAgICBjaGFyKiAgICAgICAgICBTb3VyY2U7ICAgICAgICAgICAgICAgIC8vIFBvaW50cyB0byBsb2MuIGJlaW5nIHBhcnNlZAorLSAgICAgICAgaW50ICAgICAgICAgICAgbGluZW5vOyAgICAgICAgICAgICAgICAvLyBsaW5lIGNvdW50ZXIgZm9yIGVycm9yIHJlcG9ydGluZworKyAgICAgICAgY21zSW50MzJOdW1iZXIgbGluZW5vOyAgICAgICAgICAgICAgICAvLyBsaW5lIGNvdW50ZXIgZm9yIGVycm9yIHJlcG9ydGluZworIAorICAgICAgICAgRklMRUNUWCogICAgICAgRmlsZVN0YWNrW01BWElOQ0xVREVdOyAvLyBTdGFjayBvZiBmaWxlcyBiZWluZyBwYXJzZWQKKy0gICAgICAgIGludCAgICAgICAgICAgIEluY2x1ZGVTUDsgICAgICAgICAgICAgLy8gSW5jbHVkZSBTdGFjayBQb2ludGVyCisrICAgICAgICBjbXNJbnQzMk51bWJlciBJbmNsdWRlU1A7ICAgICAgICAgICAgIC8vIEluY2x1ZGUgU3RhY2sgUG9pbnRlcgorIAorICAgICAgICAgY2hhciogICAgICAgICAgTWVtb3J5QmxvY2s7ICAgICAgICAgICAvLyBUaGUgc3RyZWFtIGlmIGhvbGRlZCBpbiBtZW1vcnkKKyAKK0BAIC01NjgsOCArNTY5LDggQEAgdm9pZCBSZWFkUmVhbChjbXNJVDgqIGl0OCwgaW50IGludW0pCisgICAgIC8vIEV4cG9uZW50LCBleGFtcGxlIDM0LjAwRSsyMAorICAgICBpZiAodG91cHBlcihpdDgtPmNoKSA9PSAnRScpIHsKKyAKKy0gICAgICAgIGludCBlOworLSAgICAgICAgaW50IHNnbjsKKysgICAgICAgIGNtc0ludDMyTnVtYmVyIGU7CisrICAgICAgICBjbXNJbnQzMk51bWJlciBzZ247CisgCisgICAgICAgICBOZXh0Q2goaXQ4KTsgc2duID0gMTsKKyAKK0BAIC01ODcsNyArNTg4LDcgQEAgdm9pZCBSZWFkUmVhbChjbXNJVDgqIGl0OCwgaW50IGludW0pCisgICAgICAgICAgICAgZSA9IDA7CisgICAgICAgICAgICAgd2hpbGUgKGlzZGlnaXQoaXQ4LT5jaCkpIHsKKyAKKy0gICAgICAgICAgICAgICAgaWYgKChjbXNGbG9hdDY0TnVtYmVyKSBlICogMTBMIDwgSU5UX01BWCkKKysgICAgICAgICAgICAgICAgaWYgKChjbXNGbG9hdDY0TnVtYmVyKSBlICogMTBMIDwgKGNtc0Zsb2F0NjROdW1iZXIpICsyMTQ3NDgzNjQ3LjApCisgICAgICAgICAgICAgICAgICAgICBlID0gZSAqIDEwICsgKGl0OC0+Y2ggLSAnMCcpOworIAorICAgICAgICAgICAgICAgICBOZXh0Q2goaXQ4KTsKK0BAIC03NzcsNyArNzc4LDcgQEAgdm9pZCBJblN5bWJvbChjbXNJVDgqIGl0OCkKKyAKKyAgICAgICAgICAgICAgICAgd2hpbGUgKGlzZGlnaXQoaXQ4LT5jaCkpIHsKKyAKKy0gICAgICAgICAgICAgICAgICAgIGlmICgobG9uZykgaXQ4LT5pbnVtICogMTBMID4gKGxvbmcpIElOVF9NQVgpIHsKKysgICAgICAgICAgICAgICAgICAgIGlmICgoY21zRmxvYXQ2NE51bWJlcikgaXQ4LT5pbnVtICogMTBMID4gKGNtc0Zsb2F0NjROdW1iZXIpICsyMTQ3NDgzNjQ3LjApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkUmVhbChpdDgsIGl0OC0+aW51bSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgaXQ4LT5zeSA9IFNETlVNOworICAgICAgICAgICAgICAgICAgICAgICAgIGl0OC0+ZG51bSAqPSBzaWduOworZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3R5cGVzLmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXN0eXBlcy5jCitpbmRleCAwMjU2ZTI0N2IuLjc1ZjFmYWUzMiAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3R5cGVzLmMKKysrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3R5cGVzLmMKK0BAIC00MTk5LDkgKzQxOTksMTMgQEAgdm9pZCAqVHlwZV9NUEVtYXRyaXhfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8KKyAgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgJk91dHB1dENoYW5zKSkgcmV0dXJuIE5VTEw7CisgCisgCisrICAgIC8vIElucHV0IGFuZCBvdXRwdXQgY2hhbnMgbWF5IGJlIEFOWSAodXAgdG8gMHhmZmZmKSwgCisrICAgIC8vIGJ1dCB3ZSBjaG9vc2UgdG8gbGltaXQgdG8gMTYgY2hhbm5lbHMgZm9yIG5vdworKyAgICBpZiAoSW5wdXRDaGFucyA+PSBjbXNNQVhDSEFOTkVMUykgcmV0dXJuIE5VTEw7CisrICAgIGlmIChPdXRwdXRDaGFucyA+PSBjbXNNQVhDSEFOTkVMUykgcmV0dXJuIE5VTEw7CisrCisgICAgIG5FbGVtcyA9IElucHV0Q2hhbnMgKiBPdXRwdXRDaGFuczsKKyAKKy0gICAgLy8gSW5wdXQgYW5kIG91dHB1dCBjaGFucyBtYXkgYmUgQU5ZICh1cCB0byAweGZmZmYpCisgICAgIE1hdHJpeCA9IChjbXNGbG9hdDY0TnVtYmVyKikgX2Ntc0NhbGxvYyhzZWxmIC0+Q29udGV4dElELCBuRWxlbXMsIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKSk7CisgICAgIGlmIChNYXRyaXggPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zLzAwMjQtdmVyaWZ5LXNpemUtYmVmb3JlLXJlYWRpbmcucGF0Y2ggYi90aGlyZF9wYXJ0eS9sY21zLzAwMjQtdmVyaWZ5LXNpemUtYmVmb3JlLXJlYWRpbmcucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcyZTMxMAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvMDAyNC12ZXJpZnktc2l6ZS1iZWZvcmUtcmVhZGluZy5wYXRjaApAQCAtMCwwICsxLDE3IEBACitkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3R5cGVzLmMKK2luZGV4IDc1ZjFmYWUzMi4uNGQ5NmExZWQ2IDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYworKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYworQEAgLTE3Myw2ICsxNzMsMTIgQEAgY21zQm9vbCBSZWFkUG9zaXRpb25UYWJsZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsCisgeworICAgICBjbXNVSW50MzJOdW1iZXIgaTsKKyAgICAgY21zVUludDMyTnVtYmVyICpFbGVtZW50T2Zmc2V0cyA9IE5VTEwsICpFbGVtZW50U2l6ZXMgPSBOVUxMOworKyAgICBjbXNVSW50MzJOdW1iZXIgY3VycmVudFBvc2l0aW9uOworKworKyAgICBjdXJyZW50UG9zaXRpb24gPSBpby0+VGVsbChpbyk7CisrICAgIC8vIFZlcmlmeSB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgbGVmdCB0byByZWFkIHR3byBjbXNVSW50MzJOdW1iZXIgaXRlbXMgZm9yIENvdW50IGl0ZW1zLgorKyAgICBpZiAoKChpby0+UmVwb3J0ZWRTaXplIC0gY3VycmVudFBvc2l0aW9uKSAvICgyICogc2l6ZW9mKGNtc1VJbnQzMk51bWJlcikpKSA8IENvdW50KQorKyAgICAgICAgcmV0dXJuIEZBTFNFOworIAorICAgICAvLyBMZXQncyB0YWtlIHRoZSBvZmZzZXRzIHRvIGVhY2ggZWxlbWVudAorICAgICBFbGVtZW50T2Zmc2V0cyA9IChjbXNVSW50MzJOdW1iZXIgKikgX2Ntc0NhbGxvYyhpbyAtPkNvbnRleHRJRCwgQ291bnQsIHNpemVvZihjbXNVSW50MzJOdW1iZXIpKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvMDAyNS11cHN0cmVhbS1kaXJlY3QtbGVhay1UeXBlX01QRV9SZWFkLnBhdGNoIGIvdGhpcmRfcGFydHkvbGNtcy8wMDI1LXVwc3RyZWFtLWRpcmVjdC1sZWFrLVR5cGVfTVBFX1JlYWQucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM5MzMzMQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvMDAyNS11cHN0cmVhbS1kaXJlY3QtbGVhay1UeXBlX01QRV9SZWFkLnBhdGNoCkBAIC0wLDAgKzEsMzEgQEAKK2RpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXN0eXBlcy5jIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYworaW5kZXggNzVmMWZhZTMyLi5mOTJhOTI4MjIgMTAwNjQ0CistLS0gYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXN0eXBlcy5jCisrKysgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXN0eXBlcy5jCitAQCAtNDQ2MCwxOCArNDQ2MCwxOSBAQCB2b2lkICpUeXBlX01QRV9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zVQorICAgICBOZXdMVVQgPSBjbXNQaXBlbGluZUFsbG9jKHNlbGYgLT5Db250ZXh0SUQsIElucHV0Q2hhbnMsIE91dHB1dENoYW5zKTsKKyAgICAgaWYgKE5ld0xVVCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAKKy0gICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJkVsZW1lbnRDb3VudCkpIHJldHVybiBOVUxMOworLQorLSAgICBpZiAoIVJlYWRQb3NpdGlvblRhYmxlKHNlbGYsIGlvLCBFbGVtZW50Q291bnQsIEJhc2VPZmZzZXQsIE5ld0xVVCwgUmVhZE1QRUVsZW0pKSB7CistICAgICAgICBpZiAoTmV3TFVUICE9IE5VTEwpIGNtc1BpcGVsaW5lRnJlZShOZXdMVVQpOworLSAgICAgICAgKm5JdGVtcyA9IDA7CistICAgICAgICByZXR1cm4gTlVMTDsKKy0gICAgfQorKyAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmRWxlbWVudENvdW50KSkgZ290byBFcnJvcjsKKysgICAgaWYgKCFSZWFkUG9zaXRpb25UYWJsZShzZWxmLCBpbywgRWxlbWVudENvdW50LCBCYXNlT2Zmc2V0LCBOZXdMVVQsIFJlYWRNUEVFbGVtKSkgZ290byBFcnJvcjsKKyAKKyAgICAgLy8gU3VjY2VzcworICAgICAqbkl0ZW1zID0gMTsKKyAgICAgcmV0dXJuIE5ld0xVVDsKKyAKKysgICAgLy8gRXJyb3IKKytFcnJvcjoKKysgICAgaWYgKE5ld0xVVCAhPSBOVUxMKSBjbXNQaXBlbGluZUZyZWUoTmV3TFVUKTsKKysgICAgKm5JdGVtcyA9IDA7CisrICAgIHJldHVybiBOVUxMOworKworICAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFNpemVPZlRhZyk7CisgfQorIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy8wMDI2LW1vcmUtdW5zdXBwb3J0ZWQtY2hhcmFjdGVycy5wYXRjaCBiL3RoaXJkX3BhcnR5L2xjbXMvMDAyNi1tb3JlLXVuc3VwcG9ydGVkLWNoYXJhY3RlcnMucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY2ZDUwYwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvMDAyNi1tb3JlLXVuc3VwcG9ydGVkLWNoYXJhY3RlcnMucGF0Y2gKQEAgLTAsMCArMSw3MyBAQAorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc29wdC5jIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zb3B0LmMKK2luZGV4IDIzYWE1NDQwMi4uYWJlMjZiOTNhIDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zb3B0LmMKKysrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc29wdC5jCitAQCAtMTc1Niw4ICsxNzU2LDggQEAgY21zQm9vbCBPcHRpbWl6ZU1hdHJpeFNoYXBlcihjbXNQaXBlbGluZSoqIEx1dCwgY21zVUludDMyTnVtYmVyIEludGVudCwgY21zVUludDMKKyAgICAgICAgIF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKiBtcGVDMSA9IChfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSopIGNtc1N0YWdlRGF0YShDdXJ2ZTEpOworICAgICAgICAgX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqIG1wZUMyID0gKF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKikgY21zU3RhZ2VEYXRhKEN1cnZlMik7CisgCistICAgICAgICAvLyBJbiB0aGlzIHBhcnRpY3VsYXIgb3B0aW1pemF0aW9uLCBjYWNoPEU5PiBkb2VzIG5vdCBoZWxwIGFzIGl0IHRha2VzIG1vcmUgdGltZSB0byBkZWFsIHdpdGgKKy0gICAgICAgIC8vIHRoZSBjYWNoPEU5PiB0aGF0IHdpdGggdGhlIHBpeGVsIGhhbmRsaW5nCisrICAgICAgICAvLyBJbiB0aGlzIHBhcnRpY3VsYXIgb3B0aW1pemF0aW9uLCBjYWNoZSBkb2VzIG5vdCBoZWxwIGFzIGl0IHRha2VzIG1vcmUgdGltZSB0byBkZWFsIHdpdGgKKysgICAgICAgIC8vIHRoZSBjYWNoZSB0aGF0IHdpdGggdGhlIHBpeGVsIGhhbmRsaW5nCisgICAgICAgICAqZHdGbGFncyB8PSBjbXNGTEFHU19OT0NBQ0hFOworIAorICAgICAgICAgLy8gU2V0dXAgdGhlIG9wdGltaXphcmlvbiByb3V0aW5lcworZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3R5cGVzLmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXN0eXBlcy5jCitpbmRleCAzODA5MWYxNTkuLjVlYTFkMmQ4NyAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3R5cGVzLmMKKysrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3R5cGVzLmMKK0BAIC00MTk0LDcgKzQxOTQsNyBAQCBjbXNCb29sICBUeXBlX01QRWN1cnZlX1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKgorIC8vIFRoZSBtYXRyaXggaXMgb3JnYW5pemVkIGFzIGFuIGFycmF5IG9mIFB4UStRIGVsZW1lbnRzLCB3aGVyZSBQIGlzIHRoZSBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMgdG8gdGhlCisgLy8gbWF0cml4LCBhbmQgUSBpcyB0aGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscy4gVGhlIG1hdHJpeCBlbGVtZW50cyBhcmUgZWFjaCBmbG9hdDMyTnVtYmVycy4gVGhlIGFycmF5CisgLy8gaXMgb3JnYW5pemVkIGFzIGZvbGxvd3M6CistLy8gYXJyYXkgPSBbZTExLCBlMTIsIDw4NT4sIGUxUCwgZTIxLCBlMjIsIDw4NT4sIGUyUCwgPDg1PiwgZVExLCBlUTIsIDw4NT4sIGVRUCwgZTEsIGUyLCA8ODU+LCBlUV0KKysvLyBhcnJheSA9IFtlMTEsIGUxMiwgLi4uLCBlMVAsIGUyMSwgZTIyLCAuLi4sIGUyUCwgLi4uLCBlUTEsIGVRMiwgLi4uLCBlUVAsIGUxLCBlMiwgLi4uLCBlUV0KKyAKKyBzdGF0aWMKKyB2b2lkICpUeXBlX01QRW1hdHJpeF9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyKiBuSXRlbXMsIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcpCitucG1AbnBtMDp+L3BkZml1bS9wZGZpdW0kIAorbnBtQG5wbTA6fi9wZGZpdW0vcGRmaXVtJCAKK25wbUBucG0wOn4vcGRmaXVtL3BkZml1bSQgCitucG1AbnBtMDp+L3BkZml1bS9wZGZpdW0kIGdpdCBkaWZmCitkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zb3B0LmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNvcHQuYworaW5kZXggMjNhYTU0NDAyLi5hYmUyNmI5M2EgMTAwNjQ0CistLS0gYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNvcHQuYworKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zb3B0LmMKK0BAIC0xNzU2LDggKzE3NTYsOCBAQCBjbXNCb29sIE9wdGltaXplTWF0cml4U2hhcGVyKGNtc1BpcGVsaW5lKiogTHV0LCBjbXNVSW50MzJOdW1iZXIgSW50ZW50LCBjbXNVSW50MworICAgICAgICAgX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqIG1wZUMxID0gKF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKikgY21zU3RhZ2VEYXRhKEN1cnZlMSk7CisgICAgICAgICBfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSogbXBlQzIgPSAoX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqKSBjbXNTdGFnZURhdGEoQ3VydmUyKTsKKyAKKy0gICAgICAgIC8vIEluIHRoaXMgcGFydGljdWxhciBvcHRpbWl6YXRpb24sIGNhY2g8RTk+IGRvZXMgbm90IGhlbHAgYXMgaXQgdGFrZXMgbW9yZSB0aW1lIHRvIGRlYWwgd2l0aAorLSAgICAgICAgLy8gdGhlIGNhY2g8RTk+IHRoYXQgd2l0aCB0aGUgcGl4ZWwgaGFuZGxpbmcKKysgICAgICAgIC8vIEluIHRoaXMgcGFydGljdWxhciBvcHRpbWl6YXRpb24sIGNhY2hlIGRvZXMgbm90IGhlbHAgYXMgaXQgdGFrZXMgbW9yZSB0aW1lIHRvIGRlYWwgd2l0aAorKyAgICAgICAgLy8gdGhlIGNhY2hlIHRoYXQgd2l0aCB0aGUgcGl4ZWwgaGFuZGxpbmcKKyAgICAgICAgICpkd0ZsYWdzIHw9IGNtc0ZMQUdTX05PQ0FDSEU7CisgCisgICAgICAgICAvLyBTZXR1cCB0aGUgb3B0aW1pemFyaW9uIHJvdXRpbmVzCitkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3R5cGVzLmMKK2luZGV4IDM4MDkxZjE1OS4uOGIwMmY4NmNhIDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYworKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYworQEAgLTQxOTQsNyArNDE5NCw3IEBAIGNtc0Jvb2wgIFR5cGVfTVBFY3VydmVfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqCisgLy8gVGhlIG1hdHJpeCBpcyBvcmdhbml6ZWQgYXMgYW4gYXJyYXkgb2YgUHhRK1EgZWxlbWVudHMsIHdoZXJlIFAgaXMgdGhlIG51bWJlciBvZiBpbnB1dCBjaGFubmVscyB0byB0aGUKKyAvLyBtYXRyaXgsIGFuZCBRIGlzIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiBUaGUgbWF0cml4IGVsZW1lbnRzIGFyZSBlYWNoIGZsb2F0MzJOdW1iZXJzLiBUaGUgYXJyYXkKKyAvLyBpcyBvcmdhbml6ZWQgYXMgZm9sbG93czoKKy0vLyBhcnJheSA9IFtlMTEsIGUxMiwgPDg1PiwgZTFQLCBlMjEsIGUyMiwgPDg1PiwgZTJQLCA8ODU+LCBlUTEsIGVRMiwgPDg1PiwgZVFQLCBlMSwgZTIsIDw4NT4sIGVRXQorKy8vIGFycmF5ID0gW2UxMSwgZTEyLCAuLi4sIGUxUCwgZTIxLCBlMjIsIC4uLiwgZTJQLCAuLi4sIGVRMSwgZVEyLCAuLi4sIGVRUCwgZTEsIGUyLCAuLi4sIGVRXQorIAorIHN0YXRpYworIHZvaWQgKlR5cGVfTVBFbWF0cml4X1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG5JdGVtcywgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKK0BAIC00NzEzLDEwICs0NzEzLDEwIEBAIHZvaWQgKlR5cGVfdmNndF9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwKKyAgICAgICAgICAgICAvLyBZID0gY1ggKyBmICAgICAgICAgICAgIHwgWCA8IGQKKyAKKyAgICAgICAgICAgICAvLyB2Y2d0IGZvcm11bGEgaXM6CistICAgICAgICAgICAgLy8gWSA9IChNYXggPDk2PiBNaW4pICogKFggXiBHYW1tYSkgKyBNaW4KKysgICAgICAgICAgICAvLyBZID0gKE1heCAtIE1pbikgKiAoWCBeIEdhbW1hKSArIE1pbgorIAorICAgICAgICAgICAgIC8vIFNvLCB0aGUgdHJhbnNsYXRpb24gaXMKKy0gICAgICAgICAgICAvLyBhID0gKE1heCA8OTY+IE1pbikgXiAoIDEgLyBHYW1tYSkKKysgICAgICAgICAgICAvLyBhID0gKE1heCAtIE1pbikgXiAoIDEgLyBHYW1tYSkKKyAgICAgICAgICAgICAvLyBlID0gTWluCisgICAgICAgICAgICAgLy8gYj1jPWQ9Zj0wCisgCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zLzAwMjctY2hhbmdlcy1mcm9tLWJlZ2lubmluZy1vZi10aW1lLnBhdGNoIGIvdGhpcmRfcGFydHkvbGNtcy8wMDI3LWNoYW5nZXMtZnJvbS1iZWdpbm5pbmctb2YtdGltZS5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWVlZGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGNtcy8wMDI3LWNoYW5nZXMtZnJvbS1iZWdpbm5pbmctb2YtdGltZS5wYXRjaApAQCAtMCwwICsxLDE1MiBAQAorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2NnYXRzLmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNjZ2F0cy5jCitpbmRleCBhMGMyNWMwMjQuLjU1Zjc0ZWRlOCAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2NnYXRzLmMKKysrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2NnYXRzLmMKK0BAIC0zOCw3ICszOCwxMCBAQAorICNkZWZpbmUgREVGQVVMVF9EQkxfRk9STUFUICAiJS4xMGciIC8vIERvdWJsZSBmb3JtYXR0aW5nCisgCisgI2lmZGVmIENNU19JU19XSU5ET1dTXworLSMgICAgaW5jbHVkZSA8aW8uaD4KKysvL3N1bmxpYW5nLmxpdSBtb2RpZmllZCAyMDEwNDI2IGZvciB3aW5jZSBlcnJvcgorKyMgaWZuZGVmIF9XSU4zMl9XQ0UKKysjICAgaW5jbHVkZSA8aW8uaD4KKysjIGVuZGlmCisgIyAgICBkZWZpbmUgRElSX0NIQVIgICAgJ1xcJworICNlbHNlCisgIyAgICBkZWZpbmUgRElSX0NIQVIgICAgJy8nCitkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zZ2FtbWEuYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2dhbW1hLmMKK2luZGV4IGViM2RkODgxYy4uNmUzNmNmNDYyIDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zZ2FtbWEuYworKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zZ2FtbWEuYworQEAgLTc0OSwxNCArNzQ5LDE5IEBAIHZvaWQgQ01TRVhQT1JUIGNtc0ZyZWVUb25lQ3VydmUoY21zVG9uZUN1cnZlKiBDdXJ2ZSkKKyB7CisgICAgIGNtc0NvbnRleHQgQ29udGV4dElEOworIAorLSAgICBpZiAoQ3VydmUgPT0gTlVMTCkgcmV0dXJuOworKyAgICAvLyBhZGRlZCBieSBYaWFvY2h1YW4gTGl1CisrICAgIC8vIEN1cnZlLT5JbnRlcnBQYXJhbXMgbWF5IGJlIG51bGwKKysgICAgaWYgKEN1cnZlID09IE5VTEwgfHwgQ3VydmUtPkludGVycFBhcmFtcyA9PSBOVUxMKSByZXR1cm47CisgCisgICAgIENvbnRleHRJRCA9IEN1cnZlIC0+SW50ZXJwUGFyYW1zLT5Db250ZXh0SUQ7CisgCisgICAgIF9jbXNGcmVlSW50ZXJwUGFyYW1zKEN1cnZlIC0+SW50ZXJwUGFyYW1zKTsKKysgICAgQ3VydmUgLT5JbnRlcnBQYXJhbXMgPSBOVUxMOworIAorLSAgICBpZiAoQ3VydmUgLT4gVGFibGUxNikKKysgICAgaWYgKEN1cnZlIC0+IFRhYmxlMTYpIHsKKyAgICAgICAgIF9jbXNGcmVlKENvbnRleHRJRCwgQ3VydmUgLT5UYWJsZTE2KTsKKysgICAgICAgIEN1cnZlIC0+VGFibGUxNiA9IE5VTEw7CisrICAgIH0KKyAKKyAgICAgaWYgKEN1cnZlIC0+U2VnbWVudHMpIHsKKyAKK0BAIC03NjYsMjAgKzc3MSwzMCBAQCB2b2lkIENNU0VYUE9SVCBjbXNGcmVlVG9uZUN1cnZlKGNtc1RvbmVDdXJ2ZSogQ3VydmUpCisgCisgICAgICAgICAgICAgaWYgKEN1cnZlIC0+U2VnbWVudHNbaV0uU2FtcGxlZFBvaW50cykgeworICAgICAgICAgICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIEN1cnZlIC0+U2VnbWVudHNbaV0uU2FtcGxlZFBvaW50cyk7CisrICAgICAgICAgICAgICAgIEN1cnZlIC0+U2VnbWVudHNbaV0uU2FtcGxlZFBvaW50cyA9IE5VTEw7CisgICAgICAgICAgICAgfQorIAorLSAgICAgICAgICAgIGlmIChDdXJ2ZSAtPlNlZ0ludGVycFtpXSAhPSAwKQorKyAgICAgICAgICAgIGlmIChDdXJ2ZSAtPlNlZ0ludGVycFtpXSAhPSAwKSB7CisgICAgICAgICAgICAgICAgIF9jbXNGcmVlSW50ZXJwUGFyYW1zKEN1cnZlLT5TZWdJbnRlcnBbaV0pOworKyAgICAgICAgICAgICAgICBDdXJ2ZS0+U2VnSW50ZXJwW2ldID0gTlVMTDsKKysgICAgICAgICAgICB9CisgICAgICAgICB9CisgCisgICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIEN1cnZlIC0+U2VnbWVudHMpOworKyAgICAgICAgQ3VydmUgLT5TZWdtZW50cyA9IE5VTEw7CisgICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIEN1cnZlIC0+U2VnSW50ZXJwKTsKKysgICAgICAgIEN1cnZlIC0+U2VnSW50ZXJwID0gTlVMTDsKKyAgICAgfQorIAorLSAgICBpZiAoQ3VydmUgLT4gRXZhbHMpCisrICAgIGlmIChDdXJ2ZSAtPiBFdmFscykgeworICAgICAgICAgX2Ntc0ZyZWUoQ29udGV4dElELCBDdXJ2ZSAtPiBFdmFscyk7CisrICAgICAgICBDdXJ2ZSAtPiBFdmFscyA9IE5VTEw7CisrICAgIH0KKyAKKy0gICAgaWYgKEN1cnZlKSBfY21zRnJlZShDb250ZXh0SUQsIEN1cnZlKTsKKysgICAgaWYgKEN1cnZlKSB7CisrICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIEN1cnZlKTsKKysgICAgICAgIEN1cnZlID0gTlVMTDsKKysgICAgfQorIH0KKyAKKyAvLyBVdGlsaXR5IGZ1bmN0aW9uLCBmcmVlIDMgZ2FtbWEgdGFibGVzCitAQCAtNzk5LDcgKzgxNCwxMCBAQCB2b2lkIENNU0VYUE9SVCBjbXNGcmVlVG9uZUN1cnZlVHJpcGxlKGNtc1RvbmVDdXJ2ZSogQ3VydmVbM10pCisgLy8gRHVwbGljYXRlIGEgZ2FtbWEgdGFibGUKKyBjbXNUb25lQ3VydmUqIENNU0VYUE9SVCBjbXNEdXBUb25lQ3VydmUoY29uc3QgY21zVG9uZUN1cnZlKiBJbikKKyB7CistICAgIGlmIChJbiA9PSBOVUxMIHx8IEluIC0+U2VnbWVudHMgPT0gTlVMTCB8fCBJbiAtPlRhYmxlMTYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisrICAgIC8vIFhpYW9jaHVhbiBMaXUKKysgICAgLy8gZml4IG9wZW5wZGYgYnVnKG1hbnRpcyBpZDowMDU1NjgzLCBnb29nbGUgaWQ6MzYwMTk4KQorKyAgICAvLyB0aGUgZnVuY3Rpb24gQ3VydmVTZXRFbGVtVHlwZUZyZWUgaW4gY21zbHV0LmMgYWxzbyBuZWVkcyB0byBjaGVjayBwb2ludGVyCisrICAgIGlmIChJbiA9PSBOVUxMIHx8IEluIC0+SW50ZXJwUGFyYW1zID09IE5VTEwgfHwgSW4gLT5TZWdtZW50cyA9PSBOVUxMIHx8IEluIC0+VGFibGUxNiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAKKyAgICAgcmV0dXJuICBBbGxvY2F0ZVRvbmVDdXJ2ZVN0cnVjdChJbiAtPkludGVycFBhcmFtcyAtPkNvbnRleHRJRCwgSW4gLT5uRW50cmllcywgSW4gLT5uU2VnbWVudHMsIEluIC0+U2VnbWVudHMsIEluIC0+VGFibGUxNik7CisgfQorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2lvMC5jIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zaW8wLmMKK2luZGV4IDFiMDI2NDg4ZC4uY2M1Zjg5MDY0IDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zaW8wLmMKKysrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2lvMC5jCitAQCAtNDc5LDYgKzQ3OSwxNCBAQCBjbXNJT0hBTkRMRVIqIENNU0VYUE9SVCBjbXNHZXRQcm9maWxlSU9oYW5kbGVyKGNtc0hQUk9GSUxFIGhQcm9maWxlKQorICAgICAgICByZXR1cm4gSWNjLT5JT2hhbmRsZXI7CisgfQorIAorKyNpZmRlZiBfV0lOMzJfV0NFCisrdGltZV90IHdjZWV4X3RpbWUodGltZV90ICp0aW1lcik7Cisrc3RydWN0IHRtICogd2NlZXhfZ210aW1lKGNvbnN0IHRpbWVfdCAqdGltZXIpOworKworKyNkZWZpbmUgdGltZSB3Y2VleF90aW1lCisrI2RlZmluZSBnbXRpbWUgd2NlZXhfZ210aW1lCisrI2VuZGlmCisrCisgLy8gQ3JlYXRlcyBhbiBlbXB0eSBzdHJ1Y3R1cmUgaG9sZGluZyBhbGwgcmVxdWlyZWQgcGFyYW1ldGVycworIGNtc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNDcmVhdGVQcm9maWxlUGxhY2Vob2xkZXIoY21zQ29udGV4dCBDb250ZXh0SUQpCisgeworQEAgLTU3MCw2ICs1NzgsMTQgQEAgaW50IF9jbXNTZWFyY2hUYWcoX2Ntc0lDQ1BST0ZJTEUqIEljYywgY21zVGFnU2lnbmF0dXJlIHNpZywgY21zQm9vbCBsRm9sbG93TGlua3MKKyAKKyAgICAgICAgIC8vIFllcywgZm9sbG93IGxpbmsKKyAgICAgICAgIGlmIChMaW5rZWRTaWcgIT0gKGNtc1RhZ1NpZ25hdHVyZSkgMCkgeworKyAgICAgICAgICAgIC8vIGZpeCBidWcgbWFudGlzIGlkIzAwNTU5NDIKKysgICAgICAgICAgICAvLyBhc3N1bWUgdGhhdCBUUkNUYWcgYW5kIENvbG9yYW50VGFnIGNhbid0IGJlIGxpbmtlZC4KKysgICAgICAgICAgICAvLyBYaWFvY2h1YW4gTGl1IDIwMTQtMDQtMjMKKysgICAgICAgICAgICBpZiAoKHNpZyA9PSBjbXNTaWdSZWRUUkNUYWcgfHwgc2lnID09IGNtc1NpZ0dyZWVuVFJDVGFnIHx8IHNpZyA9PSBjbXNTaWdCbHVlVFJDVGFnKSAmJiAKKysgICAgICAgICAgICAgICAgKExpbmtlZFNpZyA9PSBjbXNTaWdSZWRDb2xvcmFudFRhZyB8fCBMaW5rZWRTaWcgPT0gY21zU2lnR3JlZW5Db2xvcmFudFRhZyB8fCBMaW5rZWRTaWcgPT0gY21zU2lnQmx1ZUNvbG9yYW50VGFnKSkKKysgICAgICAgICAgICB7CisrICAgICAgICAgICAgICAgIHJldHVybiBuOworKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBzaWcgPSBMaW5rZWRTaWc7CisgICAgICAgICB9CisgCitAQCAtMTM2Myw2ICsxMzc5LDEyIEBAIEVycm9yOgorICAgICByZXR1cm4gMDsKKyB9CisgCisrI2lmZGVmIF9XSU4zMl9XQ0UKKytpbnQgd2NlZXhfdW5saW5rKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKysjaWZuZGVmIHJlbW92ZQorKyMgICBkZWZpbmUgcmVtb3ZlIHdjZWV4X3VubGluaworKyNlbmRpZgorKyNlbmRpZgorIAorIC8vIExvdy1sZXZlbCBzYXZlIHRvIGRpc2suCisgY21zQm9vbCAgQ01TRVhQT1JUIGNtc1NhdmVQcm9maWxlVG9GaWxlKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjb25zdCBjaGFyKiBGaWxlTmFtZSkKK2RpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNpbzEuYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2lvMS5jCitpbmRleCAzNjQ3NDFjOWUuLjRiMTJhZTE4ZSAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2lvMS5jCisrKysgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNpbzEuYworQEAgLTIwMSw3ICsyMDEsMTEgQEAgY21zUGlwZWxpbmUqIEJ1aWxkR3JheUlucHV0TWF0cml4UGlwZWxpbmUoY21zSFBST0ZJTEUgaFByb2ZpbGUpCisgICAgIHJldHVybiBMdXQ7CisgCisgRXJyb3I6CistICAgIGNtc0ZyZWVUb25lQ3VydmUoR3JheVRSQyk7CisrICAgIC8vIG1lbW9yeSBwb2ludGVkIGJ5IEdyYXlUUkMgaXMgbm90IGEgbmV3IG1hbGxvYyBtZW1vcnksIHNvIGRvbid0IGZyZWUgaXQgaGVyZSwgCisrICAgIC8vIG1lbW9yeSBwb2ludGVkIGJ5IEdyYXlUUkMgd2lsbCBiZSBmcmVlZCB3aGVuIGhQcm9maWxlIGlzIGNsb3NlZC4KKysgICAgLy8gdGVzdCBmaWxlIDowMDQ3Nzc2X1BvY2tldCBNZWRpY2luZV8gVGhlIE1hc3NhY2h1c2V0dHMgR2VuZXJhbCBIb3NwaXRhbCBIYW5kYm9vayBvZiBJbnRlcm5hbCBNZWRpY2luZS0yLnBkZgorKyAgICAvLyBYaWFvY2h1YW4gTGl1LCAyMDE0MDQyMQorKyAgICAvL2Ntc0ZyZWVUb25lQ3VydmUoR3JheVRSQyk7CisgICAgIGNtc1BpcGVsaW5lRnJlZShMdXQpOworICAgICByZXR1cm4gTlVMTDsKKyB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zLzAwMjgtZG8tbm90LXF1aWNrZmxvb3IucGF0Y2ggYi90aGlyZF9wYXJ0eS9sY21zLzAwMjgtZG8tbm90LXF1aWNrZmxvb3IucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk4OTE3YQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvMDAyOC1kby1ub3QtcXVpY2tmbG9vci5wYXRjaApAQCAtMCwwICsxLDEzIEBACitkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9pbmNsdWRlL2xjbXMyLmggYi90aGlyZF9wYXJ0eS9sY21zL2luY2x1ZGUvbGNtczIuaAoraW5kZXggNzM5ZTZlMWY4Li5jODRhNGZkOTMgMTAwNjQ0CistLS0gYS90aGlyZF9wYXJ0eS9sY21zL2luY2x1ZGUvbGNtczIuaAorKysrIGIvdGhpcmRfcGFydHkvbGNtcy9pbmNsdWRlL2xjbXMyLmgKK0BAIC0zOCw3ICszOCw3IEBACisgLy8gI2RlZmluZSBDTVNfRE9OVF9VU0VfSU5UNjQgICAgICAgIDEKKyAKKyAvLyBVbmNvbW1lbnQgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGRvZXNuJ3Qgd29yayB3aXRoIGZhc3QgZmxvb3IgZnVuY3Rpb24KKy0vLyAjZGVmaW5lIENNU19ET05UX1VTRV9GQVNUX0ZMT09SIDEKKysjZGVmaW5lIENNU19ET05UX1VTRV9GQVNUX0ZMT09SIDEKKyAKKyAvLyBVbmNvbW1lbnQgdGhpcyBsaW5lIGlmIHlvdSB3YW50IGxjbXMgdG8gdXNlIHRoZSBibGFjayBwb2ludCB0YWcgaW4gcHJvZmlsZSwKKyAvLyBpZiBjb21tZW50ZWQsIGxjbXMgd2lsbCBjb21wdXRlIHRoZSBibGFjayBwb2ludCBieSBpdHMgb3duLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy8wMDI5LWRyb3AtcmVnaXN0ZXIta2V5d29yZC5wYXRjaCBiL3RoaXJkX3BhcnR5L2xjbXMvMDAyOS1kcm9wLXJlZ2lzdGVyLWtleXdvcmQucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY4MGYyYwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvMDAyOS1kcm9wLXJlZ2lzdGVyLWtleXdvcmQucGF0Y2gKQEAgLTAsMCArMSwyNCBAQAorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvaW5jbHVkZS9sY21zMi5oIGIvdGhpcmRfcGFydHkvbGNtcy9pbmNsdWRlL2xjbXMyLmgKK2luZGV4IGM4NGE0ZmQ5My4uMmJmNmYyNDcyIDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGNtcy9pbmNsdWRlL2xjbXMyLmgKKysrKyBiL3RoaXJkX3BhcnR5L2xjbXMvaW5jbHVkZS9sY21zMi5oCitAQCAtMTIzOSwxMyArMTIzOSwxMyBAQCBDTVNBUEkgY21zU3RhZ2VTaWduYXR1cmUgQ01TRVhQT1JUIGNtc1N0YWdlVHlwZShjb25zdCBjbXNTdGFnZSogbXBlKTsKKyBDTVNBUEkgdm9pZCogICAgICAgICAgICAgQ01TRVhQT1JUIGNtc1N0YWdlRGF0YShjb25zdCBjbXNTdGFnZSogbXBlKTsKKyAKKyAvLyBTYW1wbGluZworLXR5cGVkZWYgY21zSW50MzJOdW1iZXIgKCogY21zU0FNUExFUjE2KSAgIChyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5bXSwKKy0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciBPdXRbXSwKKy0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHZvaWQgKiBDYXJnbyk7CisrdHlwZWRlZiBjbXNJbnQzMk51bWJlciAoKmNtc1NBTVBMRVIxNikoY29uc3QgY21zVUludDE2TnVtYmVyIEluW10sCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDE2TnVtYmVyIE91dFtdLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIENhcmdvKTsKKyAKKy10eXBlZGVmIGNtc0ludDMyTnVtYmVyICgqIGNtc1NBTVBMRVJGTE9BVCkocmVnaXN0ZXIgY29uc3QgY21zRmxvYXQzMk51bWJlciBJbltdLAorLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zRmxvYXQzMk51bWJlciBPdXRbXSwKKy0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIHZvaWQgKiBDYXJnbyk7CisrdHlwZWRlZiBjbXNJbnQzMk51bWJlciAoKmNtc1NBTVBMRVJGTE9BVCkoY29uc3QgY21zRmxvYXQzMk51bWJlciBJbltdLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgT3V0W10sCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogQ2FyZ28pOworIAorIC8vIFVzZSB0aGlzIGZsYWcgdG8gcHJldmVudCBjaGFuZ2VzIGJlaW5nIHdyaXR0ZW4gdG8gZGVzdGluYXRpb24KKyAjZGVmaW5lIFNBTVBMRVJfSU5TUEVDVCAgICAgMHgwMTAwMDAwMApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9SRUFETUUucGRmaXVtIGIvdGhpcmRfcGFydHkvbGNtcy9SRUFETUUucGRmaXVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNGRhN2QKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9sY21zL1JFQURNRS5wZGZpdW0KQEAgLTAsMCArMSw0MyBAQAorTmFtZTogTGl0dGxlIENNUworVVJMOiBodHRwOi8vd3d3LmxpdHRsZWNtcy5jb20vCitWZXJzaW9uOiAyLjgKK1NlY3VyaXR5IENyaXRpY2FsOiB5ZXMKK0xpY2Vuc2U6IE1JVCBMaWNlbnNlCisKK0Rlc2NyaXB0aW9uOgorQ29sb3IgTWFuYWdlbWVudCBFbmdpbmUuCisKK0xvY2FsIE1vZGlmaWNhdGlvbnM6CisKKzAwMDAtY21zZXJyLWNoYW5nZXMucGF0Y2g6IGNoYW5nZSBMQ01TIG1lbW9yeSBtYW5hZ2VtZW50IG1ldGhvZHMgdG8gdXNlIFBERml1bSdzLgorMDAwMS1maXgtaW5jbHVkZS5wYXRjaDogZml4IGluY2x1ZGUgaW4gbGNtczJfaW50ZXJuYWwuaC4KKzAwMDItb2xkLXBlcmZvcm1hbmNlLWZpeC5wYXRjaDogaHR0cHM6Ly9jb2RlcmV2aWV3LmNocm9taXVtLm9yZy81MzQzNjMwMDIvCiswMDAzLW9sZC11bmluaXRpYWxpemVkLWluLUxVVGV2YWxGbG9hdC5wYXRjaDogaHR0cHM6Ly9jb2RlcmV2aWV3LmNocm9taXVtLm9yZy8zODAyOTMwMDIvCiswMDA0LW9sZC11bmluaXRpYWxpemVkLWluLUxVVGV2YWwxNi5wYXRjaDogaHR0cHM6Ly9jb2RlcmV2aWV3LmNocm9taXVtLm9yZy8zODcyNzMwMDIvCiswMDA1LW9sZC1maXgtZS13aXRoLXRpbGRlLnBhdGNoOiBsaWtlIGh0dHBzOi8vY29kZXJldmlldy5jaHJvbWl1bS5vcmcvMjQxMTEyMzAwMy8gYnV0IGJldHRlci4KKzAwMDYtdGFnLXR5cGUtY29uZnVzaW9uLnBhdGNoOiBGaXggYSB0eXBlIGNvbmZ1c2lvbi4KKzAwMDgtaW5maW5pdGUtbG9vcC1Hcm93TmFtZWRDb2xvckxpc3QucGF0Y2g6IEZpeCBpbmZpbml0ZSBsb29wIHdoZW4gY2FsbGluZyBHcm93TmFtZWRDb2xvckxpc3QuCiswMDA5LXVuaW5pdC5wYXRjaDogRml4IHVzZSB1bmluaXRpYWxpemVkIHZhbHVlIGFuZCBzdGFjayBidWZmZXIgb3ZlcmZsb3cgcmVhZC4KKzAwMTAtbWVtb3J5LWxlYWstVHlwZV9DdXJ2ZV9SZWFkLnBhdGNoOiBGaXggbWVtb3J5IGxlYWsgaW4gVHlwZV9DdXJ2ZV9SZWFkLgorMDAxMS1tZW1vcnktbGVhay1BbGxvY0VtcHR5VHJhbnNmb3JtLnBhdGNoOiBGaXggbWVtb3J5IGxlYWsgaW4gQWxsb2NFbXB0eVRyYW5zZm9ybS4KKzAwMTItbWVtb3J5LWxlYWstVHlwZV9OYW1lZENvbG9yX1JlYWQucGF0Y2g6IEZpeCBtZW1vcnkgbGVhayBpbiBUeXBlX05hbWVkQ29sb3JfUmVhZC4KKzAwMTMtbWVtb3J5LWxlYWstT3B0aW1pemVCeVJlc2FtcGxpbmcucGF0Y2g6IEZpeCBtZW1vcnkgbGVhayBpbiBPcHRpbWl6ZUJ5UmVzYW1wbGluZy4KKzAwMTQtbWVtb3J5LWxlYWstVHlwZV9NUEVtYXRyaXhfUmVhZC5wYXRjaDogRml4IG1lbW9yeSBsZWFrIGluIE1QRW1hdHJpeF9SZWFkLgorMDAxNS1jbXNTdGFnZUFsbG9jTWF0cml4LXBhcmFtLXN3YXAucGF0Y2g6IEZpeCByb3dzL2NvbHMgc3dhcCBpbiBjbXNTdGFnZUFsbG9jTWF0cml4LgorMDAxNi1yZWplY3QtbmFuLnBhdGNoOiBSZWplY3QgTmFOIHdoZW4gcmVhZGluZyBmbG9hdCBudW1iZXJzLgorMDAxNy1tZW1vcnktbGVhay1SZWFkU2VnbWVudGVkQ3VydmUucGF0Y2g6IEZpeCBtZW1vcnkgbGVhayBpbiBSZWFkU2VnbWVudGVkQ3VydmUuCiswMDE4LWJhY2twb3J0LWMwYTk4ZDg2LnBhdGNoOiBGaXggc2V2ZXJhbCBpc3N1ZXMuIEJhY2twb3J0IGZyb20gdXBzdHJlYW0KKyAgICBodHRwczovL2dpdGh1Yi5jb20vbW0yL0xpdHRsZS1DTVMvY29tbWl0L2MwYTk4ZDg2CiswMDE5LXV0ZjgucGF0Y2g6IEVuY29kZSBzb3VyY2UgZmlsZXMgYXMgdXRmLTguCiswMDIwLWF2b2lkLWZpeGVkLWluZi5wYXRjaDogQXZvaWQgZml4ZWQgbnVtYmVyIExVVCBvcHRpbWl6YXRpb24gb24gaW5mIHZhbHVlcy4KKzAwMjEtc2FuaXRpemUtZmxvYXQtcmVhZC5wYXRjaDogU2FuaXRpemUgZmxvYXRpbmcgcG9pbnQgcmVhZC4gUGFydGlhbGx5IGJhY2twb3J0CisgICAgZnJvbSB1cHN0cmVhbSBodHRwczovL2dpdGh1Yi5jb20vbW0yL0xpdHRsZS1DTVMvY29tbWl0LzQwMTFhNmUzCiswMDIyLWNoZWNrLUxVVC1hbmQtTVBFLnBhdGNoOiBjaGVjayBMVVQgY29uc2lzdGVuY3kgYW5kIHNhbml0aXplIE1QRSBwcm9maWxlcy4KKzAwMjMtdXBzdHJlYW0taW50ZWdlci1vdmVyZmxvdy1NUEVtYXRyaXhfUmVhZC5wYXRjaDogZml4IHNvbWUgaW50ZWdlciBvdmVyZmxvd3MuCiswMDI0LXZlcmlmeS1zaXplLWJlZm9yZS1yZWFkaW5nLnBhdGNoOiBmaXggT09NIGlzc3VlIHdoZW4gdGhlcmUgd29uJ3QgYmUgZW5vdWdoCisgICAgZGF0YSB0byByZWFkIGFueXdheS4KKzAwMjUtdXBzdHJlYW0tZGlyZWN0LWxlYWstVHlwZV9NUEVfUmVhZC5wYXRjaDogZml4IGxlYWsgaW4gY21zdHlwZXMuYy4KKzAwMjYtbW9yZS11bnN1cHBvcnRlZC1jaGFyYWN0ZXJzLnBhdGNoOiByZW1vdmUgb3RoZXIgdW5zdXBwb3J0ZWQgY2hhcmFjdGVycy4KKzAwMjctY2hhbmdlcy1mcm9tLWJlZ2lubmluZy1vZi10aW1lLnBhdGNoOiBjb21tZW50ZWQgY2hhbmdlcyBmcm9tIGluaXRpYWwgY29tbWl0LgorMDAyOC1kby1ub3QtcXVpY2tmbG9vci5wYXRjaDogZmxvb3JpbmcgZXJyb3JzIG1heSBjYXVzZSBoZWFwLWJ1ZmZlci1vdmVyZmxvdy4KKzAwMjktZHJvcC1yZWdpc3Rlci1rZXl3b3JkLnBhdGNoOiBSZW1vdmUgZGVwcmVjYXRlZCAncmVnaXN0ZXInIGtleXdvcmQuCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL2luY2x1ZGUvbGNtczIuaCBiL3RoaXJkX3BhcnR5L2xjbXMvaW5jbHVkZS9sY21zMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZjZmMjQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9sY21zL2luY2x1ZGUvbGNtczIuaApAQCAtMCwwICsxLDE5MDMgQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8KKy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisvLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKKy8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisvLworLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKy8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorLy8KKy8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCisvLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQorLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisvLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFZlcnNpb24gMi44CisvLworCisjaWZuZGVmIF9sY21zMl9ICisKKy8vICoqKioqKioqKiogQ29uZmlndXJhdGlvbiB0b2dnbGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLy8gVW5jb21tZW50IHRoaXMgb25lIGlmIHlvdSBhcmUgdXNpbmcgYmlnIGVuZGlhbiBtYWNoaW5lcworLy8gI2RlZmluZSBDTVNfVVNFX0JJR19FTkRJQU4gICAxCisKKy8vIFVuY29tbWVudCB0aGlzIG9uZSBpZiB5b3VyIGNvbXBpbGVyL21hY2hpbmUgZG9lcyBOT1Qgc3VwcG9ydCB0aGUKKy8vICJsb25nIGxvbmciIHR5cGUuCisvLyAjZGVmaW5lIENNU19ET05UX1VTRV9JTlQ2NCAgICAgICAgMQorCisvLyBVbmNvbW1lbnQgdGhpcyBpZiB5b3VyIGNvbXBpbGVyIGRvZXNuJ3Qgd29yayB3aXRoIGZhc3QgZmxvb3IgZnVuY3Rpb24KKyNkZWZpbmUgQ01TX0RPTlRfVVNFX0ZBU1RfRkxPT1IgMQorCisvLyBVbmNvbW1lbnQgdGhpcyBsaW5lIGlmIHlvdSB3YW50IGxjbXMgdG8gdXNlIHRoZSBibGFjayBwb2ludCB0YWcgaW4gcHJvZmlsZSwKKy8vIGlmIGNvbW1lbnRlZCwgbGNtcyB3aWxsIGNvbXB1dGUgdGhlIGJsYWNrIHBvaW50IGJ5IGl0cyBvd24uCisvLyBJdCBpcyBzYWZlciB0byBsZWF2ZSBpdCBjb21tZW50ZWQgb3V0CisvLyAjZGVmaW5lIENNU19VU0VfUFJPRklMRV9CTEFDS19QT0lOVF9UQUcgICAgMQorCisvLyBVbmNvbW1lbnQgdGhpcyBsaW5lIGlmIHlvdSBhcmUgY29tcGlsaW5nIGFzIEMrKyBhbmQgd2FudCBhIEMrKyBBUEkKKy8vICNkZWZpbmUgQ01TX1VTRV9DUFBfQVBJCisKKy8vIFVuY29tbWVudCB0aGlzIGxpbmUgaWYgeW91IG5lZWQgc3RyaWN0IENHQVRTIHN5bnRheC4gTWFrZXMgQ0dBVFMgZmlsZXMgdG8KKy8vIHJlcXVpcmUgIktFWVdPUkQiIG9uIHVuZGVmaW5lZCBpZGVudGlmaWVycywga2VlcCBpdCBjb21lbnRlZCBvdXQgdW5sZXNzIG5lZWRlZAorLy8gI2RlZmluZSBDTVNfU1RSSUNUX0NHQVRTICAxCisKKy8vIFVuY29tbWVudCB0byBnZXQgcmlkIG9mIHRoZSB0YWJsZXMgZm9yICJoYWxmIiBmbG9hdCBzdXBwb3J0CisvLyAjZGVmaW5lIENNU19OT19IQUxGX1NVUFBPUlQgMQorCisvLyBVbmNvbW1lbnQgdG8gZ2V0IHJpZCBvZiBwdGhyZWFkcy93aW5kb3dzIGRlcGVuZGVuY3kKKy8vICNkZWZpbmUgQ01TX05PX1BUSFJFQURTICAxCisKKy8vICoqKioqKioqKiogRW5kIG9mIGNvbmZpZ3VyYXRpb24gdG9nZ2xlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLy8gTmVlZGVkIGZvciBzdHJlYW1zCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLy8gTmVlZGVkIGZvciBwb3J0YWJpbGl0eSAoQzk5IHBlciA3LjEuMikKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpZm5kZWYgQ01TX1VTRV9DUFBfQVBJCisjICAgaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworIyAgIGVuZGlmCisjZW5kaWYKKworLy8gVmVyc2lvbi9yZWxlYXNlCisjZGVmaW5lIExDTVNfVkVSU0lPTiAgICAgICAgMjA4MAorCisvLyBJIHdpbGwgZ2l2ZSB0aGUgY2hhbmNlIG9mIHJlZGVmaW5pbmcgYmFzaWMgdHlwZXMgZm9yIGNvbXBpbGVycyB0aGF0IGFyZSBub3QgZnVsbHkgQzk5IGNvbXBsaWFudAorI2lmbmRlZiBDTVNfQkFTSUNfVFlQRVNfQUxSRUFEWV9ERUZJTkVECisKKy8vIEJhc2UgdHlwZXMKK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgICAgICAgY21zVUludDhOdW1iZXI7ICAgLy8gVGhhdCBpcyBndWFyYW50ZWVkIGJ5IHRoZSBDOTkgc3BlYwordHlwZWRlZiBzaWduZWQgY2hhciAgICAgICAgICBjbXNJbnQ4TnVtYmVyOyAgICAvLyBUaGF0IGlzIGd1YXJhbnRlZWQgYnkgdGhlIEM5OSBzcGVjCisKKyNpZiBDSEFSX0JJVCAhPSA4CisjICBlcnJvciAiVW5hYmxlIHRvIGZpbmQgOCBiaXQgdHlwZSwgdW5zdXBwb3J0ZWQgY29tcGlsZXIiCisjZW5kaWYKKworLy8gSUVFRSBmbG9hdCBzdG9yYWdlIG51bWJlcnMKK3R5cGVkZWYgZmxvYXQgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlcjsKK3R5cGVkZWYgZG91YmxlICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlcjsKKworLy8gMTYtYml0IGJhc2UgdHlwZXMKKyNpZiAoVVNIUlRfTUFYID09IDY1NTM1VSkKKyB0eXBlZGVmIHVuc2lnbmVkIHNob3J0ICAgICAgY21zVUludDE2TnVtYmVyOworI2VsaWYgKFVJTlRfTUFYID09IDY1NTM1VSkKKyB0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICAgY21zVUludDE2TnVtYmVyOworI2Vsc2UKKyMgIGVycm9yICJVbmFibGUgdG8gZmluZCAxNiBiaXRzIHVuc2lnbmVkIHR5cGUsIHVuc3VwcG9ydGVkIGNvbXBpbGVyIgorI2VuZGlmCisKKyNpZiAoU0hSVF9NQVggPT0gMzI3NjcpCisgIHR5cGVkZWYgIHNob3J0ICAgICAgICAgICAgIGNtc0ludDE2TnVtYmVyOworI2VsaWYgKElOVF9NQVggPT0gMzI3NjcpCisgIHR5cGVkZWYgIGludCAgICAgICAgICAgICAgIGNtc0ludDE2TnVtYmVyOworI2Vsc2UKKyMgIGVycm9yICJVbmFibGUgdG8gZmluZCAxNiBiaXRzIHNpZ25lZCB0eXBlLCB1bnN1cHBvcnRlZCBjb21waWxlciIKKyNlbmRpZgorCisvLyAzMi1iaXQgYmFzZSB0eXBlCisjaWYgKFVJTlRfTUFYID09IDQyOTQ5NjcyOTVVKQorIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICBjbXNVSW50MzJOdW1iZXI7CisjZWxpZiAoVUxPTkdfTUFYID09IDQyOTQ5NjcyOTVVKQorIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgICAgICBjbXNVSW50MzJOdW1iZXI7CisjZWxzZQorIyAgZXJyb3IgIlVuYWJsZSB0byBmaW5kIDMyIGJpdCB1bnNpZ25lZCB0eXBlLCB1bnN1cHBvcnRlZCBjb21waWxlciIKKyNlbmRpZgorCisjaWYgKElOVF9NQVggPT0gKzIxNDc0ODM2NDcpCisgdHlwZWRlZiAgaW50ICAgICAgICAgICAgICAgIGNtc0ludDMyTnVtYmVyOworI2VsaWYgKExPTkdfTUFYID09ICsyMTQ3NDgzNjQ3KQorIHR5cGVkZWYgIGxvbmcgICAgICAgICAgICAgICBjbXNJbnQzMk51bWJlcjsKKyNlbHNlCisjICBlcnJvciAiVW5hYmxlIHRvIGZpbmQgMzIgYml0IHNpZ25lZCB0eXBlLCB1bnN1cHBvcnRlZCBjb21waWxlciIKKyNlbmRpZgorCisvLyA2NC1iaXQgYmFzZSB0eXBlcworI2lmbmRlZiBDTVNfRE9OVF9VU0VfSU5UNjQKKyMgIGlmIChVTE9OR19NQVggID09IDE4NDQ2NzQ0MDczNzA5NTUxNjE1VSkKKyAgICB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgICBjbXNVSW50NjROdW1iZXI7CisjICBlbGlmIChVTExPTkdfTUFYID09IDE4NDQ2NzQ0MDczNzA5NTUxNjE1VSkKKyAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICAgY21zVUludDY0TnVtYmVyOworIyAgZWxzZQorIyAgICAgZGVmaW5lIENNU19ET05UX1VTRV9JTlQ2NCAxCisjICBlbmRpZgorIyAgaWYgKExPTkdfTUFYID09ICs5MjIzMzcyMDM2ODU0Nzc1ODA3KQorICAgICAgdHlwZWRlZiAgbG9uZyAgICAgICAgICBjbXNJbnQ2NE51bWJlcjsKKyMgIGVsaWYgKExMT05HX01BWCA9PSArOTIyMzM3MjAzNjg1NDc3NTgwNykKKyAgICAgIHR5cGVkZWYgIGxvbmcgbG9uZyAgICAgY21zSW50NjROdW1iZXI7CisjICBlbHNlCisjICAgICBkZWZpbmUgQ01TX0RPTlRfVVNFX0lOVDY0IDEKKyMgIGVuZGlmCisjZW5kaWYKKyNlbmRpZgorCisvLyBJbiB0aGUgY2FzZSA2NCBiaXQgbnVtYmVycyBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgY29tcGlsZXIKKyNpZmRlZiBDTVNfRE9OVF9VU0VfSU5UNjQKKyAgICB0eXBlZGVmIGNtc1VJbnQzMk51bWJlciAgICAgIGNtc1VJbnQ2NE51bWJlclsyXTsKKyAgICB0eXBlZGVmIGNtc0ludDMyTnVtYmVyICAgICAgIGNtc0ludDY0TnVtYmVyWzJdOworI2VuZGlmCisKKy8vIERlcml2YXRpdmUgdHlwZXMKK3R5cGVkZWYgY21zVUludDMyTnVtYmVyICAgICAgY21zU2lnbmF0dXJlOwordHlwZWRlZiBjbXNVSW50MTZOdW1iZXIgICAgICBjbXNVOEZpeGVkOE51bWJlcjsKK3R5cGVkZWYgY21zSW50MzJOdW1iZXIgICAgICAgY21zUzE1Rml4ZWQxNk51bWJlcjsKK3R5cGVkZWYgY21zVUludDMyTnVtYmVyICAgICAgY21zVTE2Rml4ZWQxNk51bWJlcjsKKworLy8gQm9vbGVhbiB0eXBlLCB3aGljaCB3aWxsIGJlIHVzaW5nIHRoZSBuYXRpdmUgaW50ZWdlcgordHlwZWRlZiBpbnQgICAgICAgICAgICAgICAgICBjbXNCb29sOworCisvLyBUcnkgdG8gZGV0ZWN0IHdpbmRvd3MKKyNpZiBkZWZpbmVkIChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KSB8fCBkZWZpbmVkKFdJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMl8pCisjICBkZWZpbmUgQ01TX0lTX1dJTkRPV1NfIDEKKyNlbmRpZgorCisjaWZkZWYgX01TQ19WRVIKKyMgIGRlZmluZSBDTVNfSVNfV0lORE9XU18gMQorI2VuZGlmCisKKyNpZmRlZiBfX0JPUkxBTkRDX18KKyMgIGRlZmluZSBDTVNfSVNfV0lORE9XU18gMQorI2VuZGlmCisKKy8vIFRyeSB0byBkZXRlY3QgYmlnIGVuZGlhbiBwbGF0Zm9ybXMuIFRoaXMgbGlzdCBjYW4gYmUgZW5kbGVzcywgc28gcHJpbWFyaWx5IHJlbHkgb24gdGhlIGNvbmZpZ3VyZSBzY3JpcHQKKy8vIG9uIFVuaXgtbGlrZSBzeXN0ZW1zLCBhbmQgYWxsb3cgaXQgdG8gYmUgc2V0IG9uIHRoZSBjb21waWxlciBjb21tYW5kIGxpbmUgdXNpbmcKKy8vIC1EQ01TX1VTRV9CSUdfRU5ESUFOIG9yIHNvbWV0aGluZyBzaW1pbGFyCisjaWZkZWYgQ01TX1VTRV9CSUdfRU5ESUFOIC8vIHNldCBhdCBjb21waWxlciBjb21tYW5kIGxpbmUgdGFrZXMgb3ZlcmFsbCBwcmVjZWRlbmNlCisKKyMgIGlmIENNU19VU0VfQklHX0VORElBTiA9PSAwCisjICAgIHVuZGVmIENNU19VU0VfQklHX0VORElBTgorIyAgZW5kaWYKKworI2Vsc2UgLy8gQ01TX1VTRV9CSUdfRU5ESUFOCisKKyMgIGlmZGVmIFdPUkRTX0JJR0VORElBTiAvLyBzZXQgYnkgY29uZmlndXJlIChvciBleHBsaWNpdGx5IG9uIGNvbXBpbGVyIGNvbW1hbmQgbGluZSkKKyMgICAgZGVmaW5lIENNU19VU0VfQklHX0VORElBTiAxCisjICBlbHNlIC8vIFdPUkRTX0JJR0VORElBTgorLy8gRmFsbCBiYWNrIHRvIHBsYXRmb3JtL2NvbXBpbGVyIHNwZWNpZmljIHRlc3RzCisjICAgIGlmIGRlZmluZWQoX19zZ2lfXykgfHwgZGVmaW5lZChfX3NnaSkgfHwgZGVmaW5lZChzcGFyYykKKyMgICAgICBkZWZpbmUgQ01TX1VTRV9CSUdfRU5ESUFOICAgICAgMQorIyAgICBlbmRpZgorCisjICAgIGlmIGRlZmluZWQoX19zMzkwX18pIHx8IGRlZmluZWQoX19zMzkweF9fKQorIyAgICAgIGRlZmluZSBDTVNfVVNFX0JJR19FTkRJQU4gICAxCisjICAgIGVuZGlmCisKKyMgICAgaWZkZWYgbWFjaW50b3NoCisjICAgICAgaWZkZWYgX19CSUdfRU5ESUFOX18KKyMgICAgICAgIGRlZmluZSBDTVNfVVNFX0JJR19FTkRJQU4gICAgICAxCisjICAgICAgZW5kaWYKKyMgICAgICBpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXworIyAgICAgICAgdW5kZWYgQ01TX1VTRV9CSUdfRU5ESUFOCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyMgIGVuZGlmICAvLyBXT1JEU19CSUdFTkRJQU4KKworIyAgaWYgZGVmaW5lZChfSE9TVF9CSUdfRU5ESUFOKSB8fCBkZWZpbmVkKF9fQklHX0VORElBTl9fKQorIyAgICBkZWZpbmUgQ01TX1VTRV9CSUdfRU5ESUFOICAgICAgMQorIyAgZW5kaWYKKworI2VuZGlmICAvLyBDTVNfVVNFX0JJR19FTkRJQU4KKworCisvLyBDYWxsaW5nIGNvbnZlbnRpb24gLS0gdGhpcyBpcyBoYXJkbHkgcGxhdGZvcm0gYW5kIGNvbXBpbGVyIGRlcGVuZGVudAorI2lmZGVmIENNU19JU19XSU5ET1dTXworIyAgaWYgZGVmaW5lZChDTVNfRExMKSB8fCBkZWZpbmVkKENNU19ETExfQlVJTEQpCisjICAgICBpZmRlZiBfX0JPUkxBTkRDX18KKyMgICAgICAgIGRlZmluZSBDTVNFWFBPUlQgICAgICAgX19zdGRjYWxsIF9leHBvcnQKKyMgICAgICAgIGRlZmluZSBDTVNBUEkKKyMgICAgIGVsc2UKKyMgICAgICAgIGRlZmluZSBDTVNFWFBPUlQgICAgICBfX3N0ZGNhbGwKKyMgICAgICAgIGlmZGVmIENNU19ETExfQlVJTEQKKyMgICAgICAgICAgICBkZWZpbmUgQ01TQVBJICAgIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICAgICAgZWxzZQorIyAgICAgICAgICAgZGVmaW5lIENNU0FQSSAgICAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisjICAgICAgIGVuZGlmCisjICAgICBlbmRpZgorIyAgZWxzZQorIyAgICAgICBkZWZpbmUgQ01TRVhQT1JUCisjICAgICAgIGRlZmluZSBDTVNBUEkKKyMgIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgQ01TRVhQT1JUCisjIGRlZmluZSBDTVNBUEkKKyNlbmRpZgorCisjaWZkZWYgSGFzVEhSRUFEUworIyBpZiBIYXNUSFJFQURTID09IDEKKyMgICAgdW5kZWYgQ01TX05PX1BUSFJFQURTCisjIGVsc2UKKyMgICAgZGVmaW5lIENNU19OT19QVEhSRUFEUyAxCisjIGVuZGlmCisjZW5kaWYKKworLy8gU29tZSBjb21tb24gZGVmaW5pdGlvbnMKKyNkZWZpbmUgY21zTUFYX1BBVEggICAgIDI1NgorCisjaWZuZGVmIEZBTFNFCisjICAgICAgIGRlZmluZSBGQUxTRSAwCisjZW5kaWYKKyNpZm5kZWYgVFJVRQorIyAgICAgICBkZWZpbmUgVFJVRSAgMQorI2VuZGlmCisKKy8vIEQ1MCBYWVogbm9ybWFsaXplZCB0byBZPTEuMAorI2RlZmluZSBjbXNENTBYICAgICAgICAgICAgIDAuOTY0MgorI2RlZmluZSBjbXNENTBZICAgICAgICAgICAgIDEuMAorI2RlZmluZSBjbXNENTBaICAgICAgICAgICAgIDAuODI0OQorCisvLyBWNCBwZXJjZXB0dWFsIGJsYWNrCisjZGVmaW5lIGNtc1BFUkNFUFRVQUxfQkxBQ0tfWCAgMC4wMDMzNgorI2RlZmluZSBjbXNQRVJDRVBUVUFMX0JMQUNLX1kgIDAuMDAzNDczMQorI2RlZmluZSBjbXNQRVJDRVBUVUFMX0JMQUNLX1ogIDAuMDAyODcKKworLy8gRGVmaW5pdGlvbnMgaW4gSUNDIHNwZWMKKyNkZWZpbmUgY21zTWFnaWNOdW1iZXIgICAgICAweDYxNjM3MzcwICAgICAvLyAnYWNzcCcKKyNkZWZpbmUgbGNtc1NpZ25hdHVyZSAgICAgICAweDZjNjM2ZDczICAgICAvLyAnbGNtcycKKworCisvLyBCYXNlIElDQyB0eXBlIGRlZmluaXRpb25zCit0eXBlZGVmIGVudW0geworICAgIGNtc1NpZ0Nocm9tYXRpY2l0eVR5cGUgICAgICAgICAgICAgICAgICA9IDB4NjM2ODcyNkQsICAvLyAnY2hybScKKyAgICBjbXNTaWdDb2xvcmFudE9yZGVyVHlwZSAgICAgICAgICAgICAgICAgPSAweDYzNkM3MjZGLCAgLy8gJ2Nscm8nCisgICAgY21zU2lnQ29sb3JhbnRUYWJsZVR5cGUgICAgICAgICAgICAgICAgID0gMHg2MzZDNzI3NCwgIC8vICdjbHJ0JworICAgIGNtc1NpZ0NyZEluZm9UeXBlICAgICAgICAgICAgICAgICAgICAgICA9IDB4NjM3MjY0NjksICAvLyAnY3JkaScKKyAgICBjbXNTaWdDdXJ2ZVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDYzNzU3Mjc2LCAgLy8gJ2N1cnYnCisgICAgY21zU2lnRGF0YVR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg2NDYxNzQ2MSwgIC8vICdkYXRhJworICAgIGNtc1NpZ0RpY3RUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NjQ2OTYzNzQsICAvLyAnZGljdCcKKyAgICBjbXNTaWdEYXRlVGltZVR5cGUgICAgICAgICAgICAgICAgICAgICAgPSAweDY0NzQ2OTZELCAgLy8gJ2R0aW0nCisgICAgY21zU2lnRGV2aWNlU2V0dGluZ3NUeXBlICAgICAgICAgICAgICAgID0gMHg2NDY1NzY3MywgIC8vICdkZXZzJworICAgIGNtc1NpZ0x1dDE2VHlwZSAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NmQ2Njc0MzIsICAvLyAnbWZ0MicKKyAgICBjbXNTaWdMdXQ4VHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDZkNjY3NDMxLCAgLy8gJ21mdDEnCisgICAgY21zU2lnTHV0QXRvQlR5cGUgICAgICAgICAgICAgICAgICAgICAgID0gMHg2ZDQxNDIyMCwgIC8vICdtQUIgJworICAgIGNtc1NpZ0x1dEJ0b0FUeXBlICAgICAgICAgICAgICAgICAgICAgICA9IDB4NmQ0MjQxMjAsICAvLyAnbUJBICcKKyAgICBjbXNTaWdNZWFzdXJlbWVudFR5cGUgICAgICAgICAgICAgICAgICAgPSAweDZENjU2MTczLCAgLy8gJ21lYXMnCisgICAgY21zU2lnTXVsdGlMb2NhbGl6ZWRVbmljb2RlVHlwZSAgICAgICAgID0gMHg2RDZDNzU2MywgIC8vICdtbHVjJworICAgIGNtc1NpZ011bHRpUHJvY2Vzc0VsZW1lbnRUeXBlICAgICAgICAgICA9IDB4NkQ3MDY1NzQsICAvLyAnbXBldCcKKyAgICBjbXNTaWdOYW1lZENvbG9yVHlwZSAgICAgICAgICAgICAgICAgICAgPSAweDZFNjM2ZjZDLCAgLy8gJ25jb2wnIC0tIERFUFJFQ0FURUQhCisgICAgY21zU2lnTmFtZWRDb2xvcjJUeXBlICAgICAgICAgICAgICAgICAgID0gMHg2RTYzNkMzMiwgIC8vICduY2wyJworICAgIGNtc1NpZ1BhcmFtZXRyaWNDdXJ2ZVR5cGUgICAgICAgICAgICAgICA9IDB4NzA2MTcyNjEsICAvLyAncGFyYScKKyAgICBjbXNTaWdQcm9maWxlU2VxdWVuY2VEZXNjVHlwZSAgICAgICAgICAgPSAweDcwNzM2NTcxLCAgLy8gJ3BzZXEnCisgICAgY21zU2lnUHJvZmlsZVNlcXVlbmNlSWRUeXBlICAgICAgICAgICAgID0gMHg3MDczNjk2NCwgIC8vICdwc2lkJworICAgIGNtc1NpZ1Jlc3BvbnNlQ3VydmVTZXQxNlR5cGUgICAgICAgICAgICA9IDB4NzI2MzczMzIsICAvLyAncmNzMicKKyAgICBjbXNTaWdTMTVGaXhlZDE2QXJyYXlUeXBlICAgICAgICAgICAgICAgPSAweDczNjYzMzMyLCAgLy8gJ3NmMzInCisgICAgY21zU2lnU2NyZWVuaW5nVHlwZSAgICAgICAgICAgICAgICAgICAgID0gMHg3MzYzNzI2RSwgIC8vICdzY3JuJworICAgIGNtc1NpZ1NpZ25hdHVyZVR5cGUgICAgICAgICAgICAgICAgICAgICA9IDB4NzM2OTY3MjAsICAvLyAnc2lnICcKKyAgICBjbXNTaWdUZXh0VHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDc0NjU3ODc0LCAgLy8gJ3RleHQnCisgICAgY21zU2lnVGV4dERlc2NyaXB0aW9uVHlwZSAgICAgICAgICAgICAgID0gMHg2NDY1NzM2MywgIC8vICdkZXNjJworICAgIGNtc1NpZ1UxNkZpeGVkMTZBcnJheVR5cGUgICAgICAgICAgICAgICA9IDB4NzU2NjMzMzIsICAvLyAndWYzMicKKyAgICBjbXNTaWdVY3JCZ1R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDYyNjY2NDIwLCAgLy8gJ2JmZCAnCisgICAgY21zU2lnVUludDE2QXJyYXlUeXBlICAgICAgICAgICAgICAgICAgID0gMHg3NTY5MzEzNiwgIC8vICd1aTE2JworICAgIGNtc1NpZ1VJbnQzMkFycmF5VHlwZSAgICAgICAgICAgICAgICAgICA9IDB4NzU2OTMzMzIsICAvLyAndWkzMicKKyAgICBjbXNTaWdVSW50NjRBcnJheVR5cGUgICAgICAgICAgICAgICAgICAgPSAweDc1NjkzNjM0LCAgLy8gJ3VpNjQnCisgICAgY21zU2lnVUludDhBcnJheVR5cGUgICAgICAgICAgICAgICAgICAgID0gMHg3NTY5MzAzOCwgIC8vICd1aTA4JworICAgIGNtc1NpZ1ZjZ3RUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NzY2MzY3NzQsICAvLyAndmNndCcKKyAgICBjbXNTaWdWaWV3aW5nQ29uZGl0aW9uc1R5cGUgICAgICAgICAgICAgPSAweDc2Njk2NTc3LCAgLy8gJ3ZpZXcnCisgICAgY21zU2lnWFlaVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg1ODU5NUEyMCAgIC8vICdYWVogJworCisKK30gY21zVGFnVHlwZVNpZ25hdHVyZTsKKworLy8gQmFzZSBJQ0MgdGFnIGRlZmluaXRpb25zCit0eXBlZGVmIGVudW0geworICAgIGNtc1NpZ0FUb0IwVGFnICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDEzMjQyMzAsICAvLyAnQTJCMCcKKyAgICBjbXNTaWdBVG9CMVRhZyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQxMzI0MjMxLCAgLy8gJ0EyQjEnCisgICAgY21zU2lnQVRvQjJUYWcgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MTMyNDIzMiwgIC8vICdBMkIyJworICAgIGNtc1NpZ0JsdWVDb2xvcmFudFRhZyAgICAgICAgICAgICAgICAgICA9IDB4NjI1ODU5NUEsICAvLyAnYlhZWicKKyAgICBjbXNTaWdCbHVlTWF0cml4Q29sdW1uVGFnICAgICAgICAgICAgICAgPSAweDYyNTg1OTVBLCAgLy8gJ2JYWVonCisgICAgY21zU2lnQmx1ZVRSQ1RhZyAgICAgICAgICAgICAgICAgICAgICAgID0gMHg2MjU0NTI0MywgIC8vICdiVFJDJworICAgIGNtc1NpZ0JUb0EwVGFnICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDIzMjQxMzAsICAvLyAnQjJBMCcKKyAgICBjbXNTaWdCVG9BMVRhZyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQyMzI0MTMxLCAgLy8gJ0IyQTEnCisgICAgY21zU2lnQlRvQTJUYWcgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MjMyNDEzMiwgIC8vICdCMkEyJworICAgIGNtc1NpZ0NhbGlicmF0aW9uRGF0ZVRpbWVUYWcgICAgICAgICAgICA9IDB4NjM2MTZDNzQsICAvLyAnY2FsdCcKKyAgICBjbXNTaWdDaGFyVGFyZ2V0VGFnICAgICAgICAgICAgICAgICAgICAgPSAweDc0NjE3MjY3LCAgLy8gJ3RhcmcnCisgICAgY21zU2lnQ2hyb21hdGljQWRhcHRhdGlvblRhZyAgICAgICAgICAgID0gMHg2MzY4NjE2NCwgIC8vICdjaGFkJworICAgIGNtc1NpZ0Nocm9tYXRpY2l0eVRhZyAgICAgICAgICAgICAgICAgICA9IDB4NjM2ODcyNkQsICAvLyAnY2hybScKKyAgICBjbXNTaWdDb2xvcmFudE9yZGVyVGFnICAgICAgICAgICAgICAgICAgPSAweDYzNkM3MjZGLCAgLy8gJ2Nscm8nCisgICAgY21zU2lnQ29sb3JhbnRUYWJsZVRhZyAgICAgICAgICAgICAgICAgID0gMHg2MzZDNzI3NCwgIC8vICdjbHJ0JworICAgIGNtc1NpZ0NvbG9yYW50VGFibGVPdXRUYWcgICAgICAgICAgICAgICA9IDB4NjM2QzZGNzQsICAvLyAnY2xvdCcKKyAgICBjbXNTaWdDb2xvcmltZXRyaWNJbnRlbnRJbWFnZVN0YXRlVGFnICAgPSAweDYzNjk2OTczLCAgLy8gJ2NpaXMnCisgICAgY21zU2lnQ29weXJpZ2h0VGFnICAgICAgICAgICAgICAgICAgICAgID0gMHg2MzcwNzI3NCwgIC8vICdjcHJ0JworICAgIGNtc1NpZ0NyZEluZm9UYWcgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NjM3MjY0NjksICAvLyAnY3JkaScKKyAgICBjbXNTaWdEYXRhVGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDY0NjE3NDYxLCAgLy8gJ2RhdGEnCisgICAgY21zU2lnRGF0ZVRpbWVUYWcgICAgICAgICAgICAgICAgICAgICAgID0gMHg2NDc0Njk2RCwgIC8vICdkdGltJworICAgIGNtc1NpZ0RldmljZU1mZ0Rlc2NUYWcgICAgICAgICAgICAgICAgICA9IDB4NjQ2RDZFNjQsICAvLyAnZG1uZCcKKyAgICBjbXNTaWdEZXZpY2VNb2RlbERlc2NUYWcgICAgICAgICAgICAgICAgPSAweDY0NkQ2NDY0LCAgLy8gJ2RtZGQnCisgICAgY21zU2lnRGV2aWNlU2V0dGluZ3NUYWcgICAgICAgICAgICAgICAgID0gMHg2NDY1NzY3MywgIC8vICdkZXZzJworICAgIGNtc1NpZ0RUb0IwVGFnICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDQzMjQyMzAsICAvLyAnRDJCMCcKKyAgICBjbXNTaWdEVG9CMVRhZyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQ0MzI0MjMxLCAgLy8gJ0QyQjEnCisgICAgY21zU2lnRFRvQjJUYWcgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0NDMyNDIzMiwgIC8vICdEMkIyJworICAgIGNtc1NpZ0RUb0IzVGFnICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDQzMjQyMzMsICAvLyAnRDJCMycKKyAgICBjbXNTaWdCVG9EMFRhZyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQyMzI0NDMwLCAgLy8gJ0IyRDAnCisgICAgY21zU2lnQlRvRDFUYWcgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MjMyNDQzMSwgIC8vICdCMkQxJworICAgIGNtc1NpZ0JUb0QyVGFnICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDIzMjQ0MzIsICAvLyAnQjJEMicKKyAgICBjbXNTaWdCVG9EM1RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQyMzI0NDMzLCAgLy8gJ0IyRDMnCisgICAgY21zU2lnR2FtdXRUYWcgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg2NzYxNkQ3NCwgIC8vICdnYW10JworICAgIGNtc1NpZ0dyYXlUUkNUYWcgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NmI1NDUyNDMsICAvLyAna1RSQycKKyAgICBjbXNTaWdHcmVlbkNvbG9yYW50VGFnICAgICAgICAgICAgICAgICAgPSAweDY3NTg1OTVBLCAgLy8gJ2dYWVonCisgICAgY21zU2lnR3JlZW5NYXRyaXhDb2x1bW5UYWcgICAgICAgICAgICAgID0gMHg2NzU4NTk1QSwgIC8vICdnWFlaJworICAgIGNtc1NpZ0dyZWVuVFJDVGFnICAgICAgICAgICAgICAgICAgICAgICA9IDB4Njc1NDUyNDMsICAvLyAnZ1RSQycKKyAgICBjbXNTaWdMdW1pbmFuY2VUYWcgICAgICAgICAgICAgICAgICAgICAgPSAweDZDNzU2ZDY5LCAgLy8gJ2x1bWknCisgICAgY21zU2lnTWVhc3VyZW1lbnRUYWcgICAgICAgICAgICAgICAgICAgID0gMHg2RDY1NjE3MywgIC8vICdtZWFzJworICAgIGNtc1NpZ01lZGlhQmxhY2tQb2ludFRhZyAgICAgICAgICAgICAgICA9IDB4NjI2QjcwNzQsICAvLyAnYmtwdCcKKyAgICBjbXNTaWdNZWRpYVdoaXRlUG9pbnRUYWcgICAgICAgICAgICAgICAgPSAweDc3NzQ3MDc0LCAgLy8gJ3d0cHQnCisgICAgY21zU2lnTmFtZWRDb2xvclRhZyAgICAgICAgICAgICAgICAgICAgID0gMHg2RTYzNmY2QywgIC8vICduY29sJyAvLyBEZXByZWNhdGVkIGJ5IHRoZSBJQ0MKKyAgICBjbXNTaWdOYW1lZENvbG9yMlRhZyAgICAgICAgICAgICAgICAgICAgPSAweDZFNjM2QzMyLCAgLy8gJ25jbDInCisgICAgY21zU2lnT3V0cHV0UmVzcG9uc2VUYWcgICAgICAgICAgICAgICAgID0gMHg3MjY1NzM3MCwgIC8vICdyZXNwJworICAgIGNtc1NpZ1BlcmNlcHR1YWxSZW5kZXJpbmdJbnRlbnRHYW11dFRhZyA9IDB4NzI2OTY3MzAsICAvLyAncmlnMCcKKyAgICBjbXNTaWdQcmV2aWV3MFRhZyAgICAgICAgICAgICAgICAgICAgICAgPSAweDcwNzI2NTMwLCAgLy8gJ3ByZTAnCisgICAgY21zU2lnUHJldmlldzFUYWcgICAgICAgICAgICAgICAgICAgICAgID0gMHg3MDcyNjUzMSwgIC8vICdwcmUxJworICAgIGNtc1NpZ1ByZXZpZXcyVGFnICAgICAgICAgICAgICAgICAgICAgICA9IDB4NzA3MjY1MzIsICAvLyAncHJlMicKKyAgICBjbXNTaWdQcm9maWxlRGVzY3JpcHRpb25UYWcgICAgICAgICAgICAgPSAweDY0NjU3MzYzLCAgLy8gJ2Rlc2MnCisgICAgY21zU2lnUHJvZmlsZURlc2NyaXB0aW9uTUxUYWcgICAgICAgICAgID0gMHg2NDczNjM2ZCwgIC8vICdkc2NtJworICAgIGNtc1NpZ1Byb2ZpbGVTZXF1ZW5jZURlc2NUYWcgICAgICAgICAgICA9IDB4NzA3MzY1NzEsICAvLyAncHNlcScKKyAgICBjbXNTaWdQcm9maWxlU2VxdWVuY2VJZFRhZyAgICAgICAgICAgICAgPSAweDcwNzM2OTY0LCAgLy8gJ3BzaWQnCisgICAgY21zU2lnUHMyQ1JEMFRhZyAgICAgICAgICAgICAgICAgICAgICAgID0gMHg3MDczNjQzMCwgIC8vICdwc2QwJworICAgIGNtc1NpZ1BzMkNSRDFUYWcgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NzA3MzY0MzEsICAvLyAncHNkMScKKyAgICBjbXNTaWdQczJDUkQyVGFnICAgICAgICAgICAgICAgICAgICAgICAgPSAweDcwNzM2NDMyLCAgLy8gJ3BzZDInCisgICAgY21zU2lnUHMyQ1JEM1RhZyAgICAgICAgICAgICAgICAgICAgICAgID0gMHg3MDczNjQzMywgIC8vICdwc2QzJworICAgIGNtc1NpZ1BzMkNTQVRhZyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NzA3MzMyNzMsICAvLyAncHMycycKKyAgICBjbXNTaWdQczJSZW5kZXJpbmdJbnRlbnRUYWcgICAgICAgICAgICAgPSAweDcwNzMzMjY5LCAgLy8gJ3BzMmknCisgICAgY21zU2lnUmVkQ29sb3JhbnRUYWcgICAgICAgICAgICAgICAgICAgID0gMHg3MjU4NTk1QSwgIC8vICdyWFlaJworICAgIGNtc1NpZ1JlZE1hdHJpeENvbHVtblRhZyAgICAgICAgICAgICAgICA9IDB4NzI1ODU5NUEsICAvLyAnclhZWicKKyAgICBjbXNTaWdSZWRUUkNUYWcgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDcyNTQ1MjQzLCAgLy8gJ3JUUkMnCisgICAgY21zU2lnU2F0dXJhdGlvblJlbmRlcmluZ0ludGVudEdhbXV0VGFnID0gMHg3MjY5NjczMiwgIC8vICdyaWcyJworICAgIGNtc1NpZ1NjcmVlbmluZ0Rlc2NUYWcgICAgICAgICAgICAgICAgICA9IDB4NzM2MzcyNjQsICAvLyAnc2NyZCcKKyAgICBjbXNTaWdTY3JlZW5pbmdUYWcgICAgICAgICAgICAgICAgICAgICAgPSAweDczNjM3MjZFLCAgLy8gJ3Njcm4nCisgICAgY21zU2lnVGVjaG5vbG9neVRhZyAgICAgICAgICAgICAgICAgICAgID0gMHg3NDY1NjM2OCwgIC8vICd0ZWNoJworICAgIGNtc1NpZ1VjckJnVGFnICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NjI2NjY0MjAsICAvLyAnYmZkICcKKyAgICBjbXNTaWdWaWV3aW5nQ29uZERlc2NUYWcgICAgICAgICAgICAgICAgPSAweDc2NzU2NTY0LCAgLy8gJ3Z1ZWQnCisgICAgY21zU2lnVmlld2luZ0NvbmRpdGlvbnNUYWcgICAgICAgICAgICAgID0gMHg3NjY5NjU3NywgIC8vICd2aWV3JworICAgIGNtc1NpZ1ZjZ3RUYWcgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NzY2MzY3NzQsICAvLyAndmNndCcKKyAgICBjbXNTaWdNZXRhVGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDZENjU3NDYxLCAgLy8gJ21ldGEnCisgICAgY21zU2lnQXJneWxsQXJ0c1RhZyAgICAgICAgICAgICAgICAgICAgID0gMHg2MTcyNzQ3MyAgIC8vICdhcnRzJworCit9IGNtc1RhZ1NpZ25hdHVyZTsKKworCisvLyBJQ0MgVGVjaG5vbG9neSB0YWcKK3R5cGVkZWYgZW51bSB7CisgICAgY21zU2lnRGlnaXRhbENhbWVyYSAgICAgICAgICAgICAgICAgICAgID0gMHg2NDYzNjE2RCwgIC8vICdkY2FtJworICAgIGNtc1NpZ0ZpbG1TY2FubmVyICAgICAgICAgICAgICAgICAgICAgICA9IDB4NjY3MzYzNkUsICAvLyAnZnNjbicKKyAgICBjbXNTaWdSZWZsZWN0aXZlU2Nhbm5lciAgICAgICAgICAgICAgICAgPSAweDcyNzM2MzZFLCAgLy8gJ3JzY24nCisgICAgY21zU2lnSW5rSmV0UHJpbnRlciAgICAgICAgICAgICAgICAgICAgID0gMHg2OTZBNjU3NCwgIC8vICdpamV0JworICAgIGNtc1NpZ1RoZXJtYWxXYXhQcmludGVyICAgICAgICAgICAgICAgICA9IDB4NzQ3NzYxNzgsICAvLyAndHdheCcKKyAgICBjbXNTaWdFbGVjdHJvcGhvdG9ncmFwaGljUHJpbnRlciAgICAgICAgPSAweDY1NzA2ODZGLCAgLy8gJ2VwaG8nCisgICAgY21zU2lnRWxlY3Ryb3N0YXRpY1ByaW50ZXIgICAgICAgICAgICAgID0gMHg2NTczNzQ2MSwgIC8vICdlc3RhJworICAgIGNtc1NpZ0R5ZVN1YmxpbWF0aW9uUHJpbnRlciAgICAgICAgICAgICA9IDB4NjQ3Mzc1NjIsICAvLyAnZHN1YicKKyAgICBjbXNTaWdQaG90b2dyYXBoaWNQYXBlclByaW50ZXIgICAgICAgICAgPSAweDcyNzA2ODZGLCAgLy8gJ3JwaG8nCisgICAgY21zU2lnRmlsbVdyaXRlciAgICAgICAgICAgICAgICAgICAgICAgID0gMHg2NjcwNzI2RSwgIC8vICdmcHJuJworICAgIGNtc1NpZ1ZpZGVvTW9uaXRvciAgICAgICAgICAgICAgICAgICAgICA9IDB4NzY2OTY0NkQsICAvLyAndmlkbScKKyAgICBjbXNTaWdWaWRlb0NhbWVyYSAgICAgICAgICAgICAgICAgICAgICAgPSAweDc2Njk2NDYzLCAgLy8gJ3ZpZGMnCisgICAgY21zU2lnUHJvamVjdGlvblRlbGV2aXNpb24gICAgICAgICAgICAgID0gMHg3MDZBNzQ3NiwgIC8vICdwanR2JworICAgIGNtc1NpZ0NSVERpc3BsYXkgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDM1MjU0MjAsICAvLyAnQ1JUICcKKyAgICBjbXNTaWdQTURpc3BsYXkgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDUwNEQ0NDIwLCAgLy8gJ1BNRCAnCisgICAgY21zU2lnQU1EaXNwbGF5ICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MTRENDQyMCwgIC8vICdBTUQgJworICAgIGNtc1NpZ1Bob3RvQ0QgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NEI1MDQzNDQsICAvLyAnS1BDRCcKKyAgICBjbXNTaWdQaG90b0ltYWdlU2V0dGVyICAgICAgICAgICAgICAgICAgPSAweDY5NkQ2NzczLCAgLy8gJ2ltZ3MnCisgICAgY21zU2lnR3JhdnVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg2NzcyNjE3NiwgIC8vICdncmF2JworICAgIGNtc1NpZ09mZnNldExpdGhvZ3JhcGh5ICAgICAgICAgICAgICAgICA9IDB4NkY2NjY2NzMsICAvLyAnb2ZmcycKKyAgICBjbXNTaWdTaWxrc2NyZWVuICAgICAgICAgICAgICAgICAgICAgICAgPSAweDczNjk2QzZCLCAgLy8gJ3NpbGsnCisgICAgY21zU2lnRmxleG9ncmFwaHkgICAgICAgICAgICAgICAgICAgICAgID0gMHg2NjZDNjU3OCwgIC8vICdmbGV4JworICAgIGNtc1NpZ01vdGlvblBpY3R1cmVGaWxtU2Nhbm5lciAgICAgICAgICA9IDB4NkQ3MDY2NzMsICAvLyAnbXBmcycKKyAgICBjbXNTaWdNb3Rpb25QaWN0dXJlRmlsbVJlY29yZGVyICAgICAgICAgPSAweDZENzA2NjcyLCAgLy8gJ21wZnInCisgICAgY21zU2lnRGlnaXRhbE1vdGlvblBpY3R1cmVDYW1lcmEgICAgICAgID0gMHg2NDZENzA2MywgIC8vICdkbXBjJworICAgIGNtc1NpZ0RpZ2l0YWxDaW5lbWFQcm9qZWN0b3IgICAgICAgICAgICA9IDB4NjQ2MzZBNzAgICAvLyAnZGNwaicKKworfSBjbXNUZWNobm9sb2d5U2lnbmF0dXJlOworCisKKy8vIElDQyBDb2xvciBzcGFjZXMKK3R5cGVkZWYgZW51bSB7CisgICAgY21zU2lnWFlaRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg1ODU5NUEyMCwgIC8vICdYWVogJworICAgIGNtc1NpZ0xhYkRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NEM2MTYyMjAsICAvLyAnTGFiICcKKyAgICBjbXNTaWdMdXZEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDRDNzU3NjIwLCAgLy8gJ0x1diAnCisgICAgY21zU2lnWUNiQ3JEYXRhICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg1OTQzNjI3MiwgIC8vICdZQ2JyJworICAgIGNtc1NpZ1l4eURhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NTk3ODc5MjAsICAvLyAnWXh5ICcKKyAgICBjbXNTaWdSZ2JEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDUyNDc0MjIwLCAgLy8gJ1JHQiAnCisgICAgY21zU2lnR3JheURhdGEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0NzUyNDE1OSwgIC8vICdHUkFZJworICAgIGNtc1NpZ0hzdkRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDg1MzU2MjAsICAvLyAnSFNWICcKKyAgICBjbXNTaWdIbHNEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQ4NEM1MzIwLCAgLy8gJ0hMUyAnCisgICAgY21zU2lnQ215a0RhdGEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MzRENTk0QiwgIC8vICdDTVlLJworICAgIGNtc1NpZ0NteURhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDM0RDU5MjAsICAvLyAnQ01ZICcKKyAgICBjbXNTaWdNQ0gxRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDRENDM0ODMxLCAgLy8gJ01DSDEnCisgICAgY21zU2lnTUNIMkRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0RDQzNDgzMiwgIC8vICdNQ0gyJworICAgIGNtc1NpZ01DSDNEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NEQ0MzQ4MzMsICAvLyAnTUNIMycKKyAgICBjbXNTaWdNQ0g0RGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDRENDM0ODM0LCAgLy8gJ01DSDQnCisgICAgY21zU2lnTUNINURhdGEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0RDQzNDgzNSwgIC8vICdNQ0g1JworICAgIGNtc1NpZ01DSDZEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NEQ0MzQ4MzYsICAvLyAnTUNINicKKyAgICBjbXNTaWdNQ0g3RGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDRENDM0ODM3LCAgLy8gJ01DSDcnCisgICAgY21zU2lnTUNIOERhdGEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0RDQzNDgzOCwgIC8vICdNQ0g4JworICAgIGNtc1NpZ01DSDlEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NEQ0MzQ4MzksICAvLyAnTUNIOScKKyAgICBjbXNTaWdNQ0hBRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDRENDM0ODQxLCAgLy8gJ01DSEEnCisgICAgY21zU2lnTUNIQkRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0RDQzNDg0MiwgIC8vICdNQ0hCJworICAgIGNtc1NpZ01DSENEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NEQ0MzQ4NDMsICAvLyAnTUNIQycKKyAgICBjbXNTaWdNQ0hERGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDRENDM0ODQ0LCAgLy8gJ01DSEQnCisgICAgY21zU2lnTUNIRURhdGEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0RDQzNDg0NSwgIC8vICdNQ0hFJworICAgIGNtc1NpZ01DSEZEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NEQ0MzQ4NDYsICAvLyAnTUNIRicKKyAgICBjbXNTaWdOYW1lZERhdGEgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDZlNmQ2MzZjLCAgLy8gJ25tY2wnCisgICAgY21zU2lnMWNvbG9yRGF0YSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMTQzNEM1MiwgIC8vICcxQ0xSJworICAgIGNtc1NpZzJjb2xvckRhdGEgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzI0MzRDNTIsICAvLyAnMkNMUicKKyAgICBjbXNTaWczY29sb3JEYXRhICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMzNDM0QzUyLCAgLy8gJzNDTFInCisgICAgY21zU2lnNGNvbG9yRGF0YSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzNDQzNEM1MiwgIC8vICc0Q0xSJworICAgIGNtc1NpZzVjb2xvckRhdGEgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzU0MzRDNTIsICAvLyAnNUNMUicKKyAgICBjbXNTaWc2Y29sb3JEYXRhICAgICAgICAgICAgICAgICAgICAgICAgPSAweDM2NDM0QzUyLCAgLy8gJzZDTFInCisgICAgY21zU2lnN2NvbG9yRGF0YSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzNzQzNEM1MiwgIC8vICc3Q0xSJworICAgIGNtc1NpZzhjb2xvckRhdGEgICAgICAgICAgICAgICAgICAgICAgICA9IDB4Mzg0MzRDNTIsICAvLyAnOENMUicKKyAgICBjbXNTaWc5Y29sb3JEYXRhICAgICAgICAgICAgICAgICAgICAgICAgPSAweDM5NDM0QzUyLCAgLy8gJzlDTFInCisgICAgY21zU2lnMTBjb2xvckRhdGEgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MTQzNEM1MiwgIC8vICdBQ0xSJworICAgIGNtc1NpZzExY29sb3JEYXRhICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDI0MzRDNTIsICAvLyAnQkNMUicKKyAgICBjbXNTaWcxMmNvbG9yRGF0YSAgICAgICAgICAgICAgICAgICAgICAgPSAweDQzNDM0QzUyLCAgLy8gJ0NDTFInCisgICAgY21zU2lnMTNjb2xvckRhdGEgICAgICAgICAgICAgICAgICAgICAgID0gMHg0NDQzNEM1MiwgIC8vICdEQ0xSJworICAgIGNtc1NpZzE0Y29sb3JEYXRhICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDU0MzRDNTIsICAvLyAnRUNMUicKKyAgICBjbXNTaWcxNWNvbG9yRGF0YSAgICAgICAgICAgICAgICAgICAgICAgPSAweDQ2NDM0QzUyLCAgLy8gJ0ZDTFInCisgICAgY21zU2lnTHV2S0RhdGEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0Qzc1NzY0QiAgIC8vICdMdXZLJworCit9IGNtc0NvbG9yU3BhY2VTaWduYXR1cmU7CisKKy8vIElDQyBQcm9maWxlIENsYXNzCit0eXBlZGVmIGVudW0geworICAgIGNtc1NpZ0lucHV0Q2xhc3MgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NzM2MzZFNzIsICAvLyAnc2NucicKKyAgICBjbXNTaWdEaXNwbGF5Q2xhc3MgICAgICAgICAgICAgICAgICAgICAgPSAweDZENkU3NDcyLCAgLy8gJ21udHInCisgICAgY21zU2lnT3V0cHV0Q2xhc3MgICAgICAgICAgICAgICAgICAgICAgID0gMHg3MDcyNzQ3MiwgIC8vICdwcnRyJworICAgIGNtc1NpZ0xpbmtDbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NkM2OTZFNkIsICAvLyAnbGluaycKKyAgICBjbXNTaWdBYnN0cmFjdENsYXNzICAgICAgICAgICAgICAgICAgICAgPSAweDYxNjI3Mzc0LCAgLy8gJ2Fic3QnCisgICAgY21zU2lnQ29sb3JTcGFjZUNsYXNzICAgICAgICAgICAgICAgICAgID0gMHg3MzcwNjE2MywgIC8vICdzcGFjJworICAgIGNtc1NpZ05hbWVkQ29sb3JDbGFzcyAgICAgICAgICAgICAgICAgICA9IDB4NmU2ZDYzNmMgICAvLyAnbm1jbCcKKworfSBjbXNQcm9maWxlQ2xhc3NTaWduYXR1cmU7CisKKy8vIElDQyBQbGF0Zm9ybXMKK3R5cGVkZWYgZW51bSB7CisgICAgY21zU2lnTWFjaW50b3NoICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MTUwNTA0QywgIC8vICdBUFBMJworICAgIGNtc1NpZ01pY3Jvc29mdCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NEQ1MzQ2NTQsICAvLyAnTVNGVCcKKyAgICBjbXNTaWdTb2xhcmlzICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDUzNTU0RTU3LCAgLy8gJ1NVTlcnCisgICAgY21zU2lnU0dJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg1MzQ3NDkyMCwgIC8vICdTR0kgJworICAgIGNtc1NpZ1RhbGlnZW50ICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NTQ0NzRFNTQsICAvLyAnVEdOVCcKKyAgICBjbXNTaWdVbmljZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDJBNkU2OTc4ICAgLy8gJypuaXgnICAgLy8gRnJvbSBhcmd5bGwgLS0gTm90IG9mZmljaWFsCisKK30gY21zUGxhdGZvcm1TaWduYXR1cmU7CisKKy8vIFJlZmVyZW5jZSBnYW11dAorI2RlZmluZSAgY21zU2lnUGVyY2VwdHVhbFJlZmVyZW5jZU1lZGl1bUdhbXV0ICAgICAgICAgMHg3MDcyNmQ2NyAgLy8ncHJtZycKKworLy8gRm9yIGNtc1NpZ0NvbG9yaW1ldHJpY0ludGVudEltYWdlU3RhdGVUYWcKKyNkZWZpbmUgIGNtc1NpZ1NjZW5lQ29sb3JpbWV0cnlFc3RpbWF0ZXMgICAgICAgICAgICAgIDB4NzM2MzZGNjUgIC8vJ3Njb2UnCisjZGVmaW5lICBjbXNTaWdTY2VuZUFwcGVhcmFuY2VFc3RpbWF0ZXMgICAgICAgICAgICAgICAweDczNjE3MDY1ICAvLydzYXBlJworI2RlZmluZSAgY21zU2lnRm9jYWxQbGFuZUNvbG9yaW1ldHJ5RXN0aW1hdGVzICAgICAgICAgMHg2NjcwNjM2NSAgLy8nZnBjZScKKyNkZWZpbmUgIGNtc1NpZ1JlZmxlY3Rpb25IYXJkY29weU9yaWdpbmFsQ29sb3JpbWV0cnkgIDB4NzI2ODZGNjMgIC8vJ3Job2MnCisjZGVmaW5lICBjbXNTaWdSZWZsZWN0aW9uUHJpbnRPdXRwdXRDb2xvcmltZXRyeSAgICAgICAweDcyNzA2RjYzICAvLydycG9jJworCisvLyBNdWx0aSBwcm9jZXNzIGVsZW1lbnRzIHR5cGVzCit0eXBlZGVmIGVudW0geworICAgIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUgICAgICAgICAgICAgID0gMHg2Mzc2NzM3NCwgIC8vJ2N2c3QnCisgICAgY21zU2lnTWF0cml4RWxlbVR5cGUgICAgICAgICAgICAgICAgPSAweDZENjE3NDY2LCAgLy8nbWF0ZicKKyAgICBjbXNTaWdDTHV0RWxlbVR5cGUgICAgICAgICAgICAgICAgICA9IDB4NjM2Qzc1NzQsICAvLydjbHV0JworCisgICAgY21zU2lnQkFjc0VsZW1UeXBlICAgICAgICAgICAgICAgICAgPSAweDYyNDE0MzUzLCAgLy8gJ2JBQ1MnCisgICAgY21zU2lnRUFjc0VsZW1UeXBlICAgICAgICAgICAgICAgICAgPSAweDY1NDE0MzUzLCAgLy8gJ2VBQ1MnCisKKyAgICAvLyBDdXN0b20gZnJvbSBoZXJlLCBub3QgaW4gdGhlIElDQyBTcGVjCisgICAgY21zU2lnWFlaMkxhYkVsZW1UeXBlICAgICAgICAgICAgICAgPSAweDZDMzI3ODIwLCAgLy8gJ2wyeCAnCisgICAgY21zU2lnTGFiMlhZWkVsZW1UeXBlICAgICAgICAgICAgICAgPSAweDc4MzI2QzIwLCAgLy8gJ3gybCAnCisgICAgY21zU2lnTmFtZWRDb2xvckVsZW1UeXBlICAgICAgICAgICAgPSAweDZFNjM2QzIwLCAgLy8gJ25jbCAnCisgICAgY21zU2lnTGFiVjJ0b1Y0ICAgICAgICAgICAgICAgICAgICAgPSAweDMyMjAzNDIwLCAgLy8gJzIgNCAnCisgICAgY21zU2lnTGFiVjR0b1YyICAgICAgICAgICAgICAgICAgICAgPSAweDM0MjAzMjIwLCAgLy8gJzQgMiAnCisgIAorICAgIC8vIElkZW50aXRpZXMKKyAgICBjbXNTaWdJZGVudGl0eUVsZW1UeXBlICAgICAgICAgICAgICA9IDB4Njk2NDZFMjAsICAvLyAnaWRuICcKKworICAgIC8vIEZsb2F0IHRvIGZsb2F0UENTCisgICAgY21zU2lnTGFiMkZsb2F0UENTICAgICAgICAgICAgICAgICAgPSAweDY0MzI2QzIwLCAgLy8gJ2QybCAnCisgICAgY21zU2lnRmxvYXRQQ1MyTGFiICAgICAgICAgICAgICAgICAgPSAweDZDMzI2NDIwLCAgLy8gJ2wyZCAnCisgICAgY21zU2lnWFlaMkZsb2F0UENTICAgICAgICAgICAgICAgICAgPSAweDY0MzI3ODIwLCAgLy8gJ2QyeCAnCisgICAgY21zU2lnRmxvYXRQQ1MyWFlaICAgICAgICAgICAgICAgICAgPSAweDc4MzI2NDIwLCAgLy8gJ3gyZCAnICAKKyAgICBjbXNTaWdDbGlwTmVnYXRpdmVzRWxlbVR5cGUgICAgICAgICA9IDB4NjM2YzcwMjAgICAvLyAnY2xwICcKKworfSBjbXNTdGFnZVNpZ25hdHVyZTsKKworLy8gVHlwZXMgb2YgQ3VydmVFbGVtZW50cwordHlwZWRlZiBlbnVtIHsKKworICAgIGNtc1NpZ0Zvcm11bGFDdXJ2ZVNlZyAgICAgICAgICAgICAgID0gMHg3MDYxNzI2NiwgLy8gJ3BhcmYnCisgICAgY21zU2lnU2FtcGxlZEN1cnZlU2VnICAgICAgICAgICAgICAgPSAweDczNjE2RDY2LCAvLyAnc2FtZicKKyAgICBjbXNTaWdTZWdtZW50ZWRDdXJ2ZSAgICAgICAgICAgICAgICA9IDB4NjM3NTcyNjYgIC8vICdjdXJmJworCit9IGNtc0N1cnZlU2VnU2lnbmF0dXJlOworCisvLyBVc2VkIGluIFJlc3BvbnNlQ3VydmVUeXBlCisjZGVmaW5lICBjbXNTaWdTdGF0dXNBICAgICAgICAgICAgICAgICAgICAweDUzNzQ2MTQxIC8vJ1N0YUEnCisjZGVmaW5lICBjbXNTaWdTdGF0dXNFICAgICAgICAgICAgICAgICAgICAweDUzNzQ2MTQ1IC8vJ1N0YUUnCisjZGVmaW5lICBjbXNTaWdTdGF0dXNJICAgICAgICAgICAgICAgICAgICAweDUzNzQ2MTQ5IC8vJ1N0YUknCisjZGVmaW5lICBjbXNTaWdTdGF0dXNUICAgICAgICAgICAgICAgICAgICAweDUzNzQ2MTU0IC8vJ1N0YVQnCisjZGVmaW5lICBjbXNTaWdTdGF0dXNNICAgICAgICAgICAgICAgICAgICAweDUzNzQ2MTREIC8vJ1N0YU0nCisjZGVmaW5lICBjbXNTaWdETiAgICAgICAgICAgICAgICAgICAgICAgICAweDQ0NEUyMDIwIC8vJ0ROICAnCisjZGVmaW5lICBjbXNTaWdETlAgICAgICAgICAgICAgICAgICAgICAgICAweDQ0NEUyMDUwIC8vJ0ROIFAnCisjZGVmaW5lICBjbXNTaWdETk4gICAgICAgICAgICAgICAgICAgICAgICAweDQ0NEU0RTIwIC8vJ0ROTiAnCisjZGVmaW5lICBjbXNTaWdETk5QICAgICAgICAgICAgICAgICAgICAgICAweDQ0NEU0RTUwIC8vJ0ROTlAnCisKKy8vIERldmljZSBhdHRyaWJ1dGVzLCBjdXJyZW50bHkgZGVmaW5lZCB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgbG93IDQgYnl0ZXMKKy8vIG9mIHRoZSA4IGJ5dGUgYXR0cmlidXRlIHF1YW50aXR5CisjZGVmaW5lIGNtc1JlZmxlY3RpdmUgICAgIDAKKyNkZWZpbmUgY21zVHJhbnNwYXJlbmN5ICAgMQorI2RlZmluZSBjbXNHbG9zc3kgICAgICAgICAwCisjZGVmaW5lIGNtc01hdHRlICAgICAgICAgIDIKKworLy8gQ29tbW9uIHN0cnVjdHVyZXMgaW4gSUNDIHRhZ3MKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjbXNVSW50MzJOdW1iZXIgbGVuOworICAgIGNtc1VJbnQzMk51bWJlciBmbGFnOworICAgIGNtc1VJbnQ4TnVtYmVyICBkYXRhWzFdOworCit9IGNtc0lDQ0RhdGE7CisKKy8vIElDQyBkYXRlIHRpbWUKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjbXNVSW50MTZOdW1iZXIgICAgICB5ZWFyOworICAgIGNtc1VJbnQxNk51bWJlciAgICAgIG1vbnRoOworICAgIGNtc1VJbnQxNk51bWJlciAgICAgIGRheTsKKyAgICBjbXNVSW50MTZOdW1iZXIgICAgICBob3VyczsKKyAgICBjbXNVSW50MTZOdW1iZXIgICAgICBtaW51dGVzOworICAgIGNtc1VJbnQxNk51bWJlciAgICAgIHNlY29uZHM7CisKK30gY21zRGF0ZVRpbWVOdW1iZXI7CisKKy8vIElDQyBYWVoKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjbXNTMTVGaXhlZDE2TnVtYmVyICBYOworICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgIFk7CisgICAgY21zUzE1Rml4ZWQxNk51bWJlciAgWjsKKworfSBjbXNFbmNvZGVkWFlaTnVtYmVyOworCisKKy8vIFByb2ZpbGUgSUQgYXMgY29tcHV0ZWQgYnkgTUQ1IGFsZ29yaXRobQordHlwZWRlZiB1bmlvbiB7CisgICAgY21zVUludDhOdW1iZXIgICAgICAgSUQ4WzE2XTsKKyAgICBjbXNVSW50MTZOdW1iZXIgICAgICBJRDE2WzhdOworICAgIGNtc1VJbnQzMk51bWJlciAgICAgIElEMzJbNF07CisKK30gY21zUHJvZmlsZUlEOworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIElDQyBwcm9maWxlIGludGVybmFsIGJhc2UgdHlwZXMuIFN0cmljdGx5LCBzaG91bGRuJ3QgYmUgZGVjbGFyZWQgaW4gdGhpcyBoZWFkZXIsIGJ1dCBtYXliZQorLy8gc29tZWJvZHkgd2FudCB0byB1c2UgdGhpcyBpbmZvIGZvciBhY2Nlc3NpbmcgcHJvZmlsZSBoZWFkZXIgZGlyZWN0bHksIHNvIGhlcmUgaXQgaXMuCisKKy8vIFByb2ZpbGUgaGVhZGVyIC0tIGl0IGlzIDMyLWJpdCBhbGlnbmVkLCBzbyBubyBpc3N1ZXMgYXJlIGV4cGVjdGVkIG9uIGFsaWdubWVudAordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgICAgICAgc2l6ZTsgICAgICAgICAgIC8vIFByb2ZpbGUgc2l6ZSBpbiBieXRlcworICAgIGNtc1NpZ25hdHVyZSAgICAgICAgICAgICAgICAgY21tSWQ7ICAgICAgICAgIC8vIENNTSBmb3IgdGhpcyBwcm9maWxlCisgICAgY21zVUludDMyTnVtYmVyICAgICAgICAgICAgICB2ZXJzaW9uOyAgICAgICAgLy8gRm9ybWF0IHZlcnNpb24gbnVtYmVyCisgICAgY21zUHJvZmlsZUNsYXNzU2lnbmF0dXJlICAgICBkZXZpY2VDbGFzczsgICAgLy8gVHlwZSBvZiBwcm9maWxlCisgICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSAgICAgICBjb2xvclNwYWNlOyAgICAgLy8gQ29sb3Igc3BhY2Ugb2YgZGF0YQorICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgICAgICAgcGNzOyAgICAgICAgICAgIC8vIFBDUywgWFlaIG9yIExhYiBvbmx5CisgICAgY21zRGF0ZVRpbWVOdW1iZXIgICAgICAgICAgICBkYXRlOyAgICAgICAgICAgLy8gRGF0ZSBwcm9maWxlIHdhcyBjcmVhdGVkCisgICAgY21zU2lnbmF0dXJlICAgICAgICAgICAgICAgICBtYWdpYzsgICAgICAgICAgLy8gTWFnaWMgTnVtYmVyIHRvIGlkZW50aWZ5IGFuIElDQyBwcm9maWxlCisgICAgY21zUGxhdGZvcm1TaWduYXR1cmUgICAgICAgICBwbGF0Zm9ybTsgICAgICAgLy8gUHJpbWFyeSBQbGF0Zm9ybQorICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgICAgICAgZmxhZ3M7ICAgICAgICAgIC8vIFZhcmlvdXMgYml0IHNldHRpbmdzCisgICAgY21zU2lnbmF0dXJlICAgICAgICAgICAgICAgICBtYW51ZmFjdHVyZXI7ICAgLy8gRGV2aWNlIG1hbnVmYWN0dXJlcgorICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgICAgICAgbW9kZWw7ICAgICAgICAgIC8vIERldmljZSBtb2RlbCBudW1iZXIKKyAgICBjbXNVSW50NjROdW1iZXIgICAgICAgICAgICAgIGF0dHJpYnV0ZXM7ICAgICAvLyBEZXZpY2UgYXR0cmlidXRlcworICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgICAgICAgcmVuZGVyaW5nSW50ZW50Oy8vIFJlbmRlcmluZyBpbnRlbnQKKyAgICBjbXNFbmNvZGVkWFlaTnVtYmVyICAgICAgICAgIGlsbHVtaW5hbnQ7ICAgICAvLyBQcm9maWxlIGlsbHVtaW5hbnQKKyAgICBjbXNTaWduYXR1cmUgICAgICAgICAgICAgICAgIGNyZWF0b3I7ICAgICAgICAvLyBQcm9maWxlIGNyZWF0b3IKKyAgICBjbXNQcm9maWxlSUQgICAgICAgICAgICAgICAgIHByb2ZpbGVJRDsgICAgICAvLyBQcm9maWxlIElEIHVzaW5nIE1ENQorICAgIGNtc0ludDhOdW1iZXIgICAgICAgICAgICAgICAgcmVzZXJ2ZWRbMjhdOyAgIC8vIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCisKK30gY21zSUNDSGVhZGVyOworCisvLyBJQ0MgYmFzZSB0YWcKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjbXNUYWdUeXBlU2lnbmF0dXJlICBzaWc7CisgICAgY21zSW50OE51bWJlciAgICAgICAgcmVzZXJ2ZWRbNF07CisKK30gY21zVGFnQmFzZTsKKworLy8gQSB0YWcgZW50cnkgaW4gZGlyZWN0b3J5Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgY21zVGFnU2lnbmF0dXJlICAgICAgc2lnOyAgICAgICAgICAgIC8vIFRoZSB0YWcgc2lnbmF0dXJlCisgICAgY21zVUludDMyTnVtYmVyICAgICAgb2Zmc2V0OyAgICAgICAgIC8vIFN0YXJ0IG9mIHRhZworICAgIGNtc1VJbnQzMk51bWJlciAgICAgIHNpemU7ICAgICAgICAgICAvLyBTaXplIGluIGJ5dGVzCisKK30gY21zVGFnRW50cnk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gTGl0dGxlIENNUyBzcGVjaWZpYyB0eXBlZGVmcworCit0eXBlZGVmIHZvaWQqIGNtc0hBTkRMRSA7ICAgICAgICAgICAgICAvLyBHZW5lcmljIGhhbmRsZQordHlwZWRlZiB2b2lkKiBjbXNIUFJPRklMRTsgICAgICAgICAgICAgLy8gT3BhcXVlIHR5cGVkZWZzIHRvIGhpZGUgaW50ZXJuYWxzCit0eXBlZGVmIHZvaWQqIGNtc0hUUkFOU0ZPUk07CisKKyNkZWZpbmUgY21zTUFYQ0hBTk5FTFMgIDE2ICAgICAgICAgICAgICAgIC8vIE1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIGluIElDQyBwcm9maWxlcworCisvLyBGb3JtYXQgb2YgcGl4ZWwgaXMgZGVmaW5lZCBieSBvbmUgY21zVUludDMyTnVtYmVyLCB1c2luZyBiaXQgZmllbGRzIGFzIGZvbGxvd3MKKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgIDEgICAgICAgICAgMAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIDMgMiAxMDk4NyA2IDUgNCAzIDIgMSAwOTggNzY1NCAzMjEKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBBIE8gVFRUVFQgVSBZIEYgUCBYIFMgRUVFIENDQ0MgQkJCCisvLworLy8gICAgICAgICAgICBBOiBGbG9hdGluZyBwb2ludCAtLSBXaXRoIHRoaXMgZmxhZyB3ZSBjYW4gZGlmZmVyZW50aWF0ZSAxNiBiaXRzIGFzIGZsb2F0IGFuZCBhcyBpbnQKKy8vICAgICAgICAgICAgTzogT3B0aW1pemVkIC0tIHByZXZpb3VzIG9wdGltaXphdGlvbiBhbHJlYWR5IHJldHVybnMgdGhlIGZpbmFsIDgtYml0IHZhbHVlCisvLyAgICAgICAgICAgIFQ6IFBpeGVsdHlwZQorLy8gICAgICAgICAgICBGOiBGbGF2b3IgIDA9TWluSXNCbGFjayhDaG9jb2xhdGUpIDE9TWluSXNXaGl0ZShWYW5pbGxhKQorLy8gICAgICAgICAgICBQOiBQbGFuYXI/IDA9Q2h1bmt5LCAxPVBsYW5hcgorLy8gICAgICAgICAgICBYOiBzd2FwIDE2IGJwcyBlbmRpYW5uZXNzPworLy8gICAgICAgICAgICBTOiBEbyBzd2FwPyBpZSwgQkdSLCBLWU1DCisvLyAgICAgICAgICAgIEU6IEV4dHJhIHNhbXBsZXMKKy8vICAgICAgICAgICAgQzogQ2hhbm5lbHMgKFNhbXBsZXMgcGVyIHBpeGVsKQorLy8gICAgICAgICAgICBCOiBieXRlcyBwZXIgc2FtcGxlCisvLyAgICAgICAgICAgIFk6IFN3YXAgZmlyc3QgLSBjaGFuZ2VzIEFCR1IgdG8gQkdSQSBhbmQgS0NNWSB0byBDTVlLCisKKyNkZWZpbmUgRkxPQVRfU0goYSkgICAgICAgICAgICAoKGEpIDw8IDIyKQorI2RlZmluZSBPUFRJTUlaRURfU0gocykgICAgICAgICgocykgPDwgMjEpCisjZGVmaW5lIENPTE9SU1BBQ0VfU0gocykgICAgICAgKChzKSA8PCAxNikKKyNkZWZpbmUgU1dBUEZJUlNUX1NIKHMpICAgICAgICAoKHMpIDw8IDE0KQorI2RlZmluZSBGTEFWT1JfU0gocykgICAgICAgICAgICgocykgPDwgMTMpCisjZGVmaW5lIFBMQU5BUl9TSChwKSAgICAgICAgICAgKChwKSA8PCAxMikKKyNkZWZpbmUgRU5ESUFOMTZfU0goZSkgICAgICAgICAoKGUpIDw8IDExKQorI2RlZmluZSBET1NXQVBfU0goZSkgICAgICAgICAgICgoZSkgPDwgMTApCisjZGVmaW5lIEVYVFJBX1NIKGUpICAgICAgICAgICAgKChlKSA8PCA3KQorI2RlZmluZSBDSEFOTkVMU19TSChjKSAgICAgICAgICgoYykgPDwgMykKKyNkZWZpbmUgQllURVNfU0goYikgICAgICAgICAgICAoYikKKworLy8gVGhlc2UgbWFjcm9zIHVucGFjayBmb3JtYXQgc3BlY2lmaWVycyBpbnRvIGludGVnZXJzCisjZGVmaW5lIFRfRkxPQVQoYSkgICAgICAgICAgICAoKChhKT4+MjIpJjEpCisjZGVmaW5lIFRfT1BUSU1JWkVEKG8pICAgICAgICAoKChvKT4+MjEpJjEpCisjZGVmaW5lIFRfQ09MT1JTUEFDRShzKSAgICAgICAoKChzKT4+MTYpJjMxKQorI2RlZmluZSBUX1NXQVBGSVJTVChzKSAgICAgICAgKCgocyk+PjE0KSYxKQorI2RlZmluZSBUX0ZMQVZPUihzKSAgICAgICAgICAgKCgocyk+PjEzKSYxKQorI2RlZmluZSBUX1BMQU5BUihwKSAgICAgICAgICAgKCgocCk+PjEyKSYxKQorI2RlZmluZSBUX0VORElBTjE2KGUpICAgICAgICAgKCgoZSk+PjExKSYxKQorI2RlZmluZSBUX0RPU1dBUChlKSAgICAgICAgICAgKCgoZSk+PjEwKSYxKQorI2RlZmluZSBUX0VYVFJBKGUpICAgICAgICAgICAgKCgoZSk+PjcpJjcpCisjZGVmaW5lIFRfQ0hBTk5FTFMoYykgICAgICAgICAoKChjKT4+MykmMTUpCisjZGVmaW5lIFRfQllURVMoYikgICAgICAgICAgICAoKGIpJjcpCisKKworLy8gUGl4ZWwgdHlwZXMKKyNkZWZpbmUgUFRfQU5ZICAgICAgIDAgICAgLy8gRG9uJ3QgY2hlY2sgY29sb3JzcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxICYgMiBhcmUgcmVzZXJ2ZWQKKyNkZWZpbmUgUFRfR1JBWSAgICAgIDMKKyNkZWZpbmUgUFRfUkdCICAgICAgIDQKKyNkZWZpbmUgUFRfQ01ZICAgICAgIDUKKyNkZWZpbmUgUFRfQ01ZSyAgICAgIDYKKyNkZWZpbmUgUFRfWUNiQ3IgICAgIDcKKyNkZWZpbmUgUFRfWVVWICAgICAgIDggICAgICAvLyBMdSd2JworI2RlZmluZSBQVF9YWVogICAgICAgOQorI2RlZmluZSBQVF9MYWIgICAgICAgMTAKKyNkZWZpbmUgUFRfWVVWSyAgICAgIDExICAgICAvLyBMdSd2J0sKKyNkZWZpbmUgUFRfSFNWICAgICAgIDEyCisjZGVmaW5lIFBUX0hMUyAgICAgICAxMworI2RlZmluZSBQVF9ZeHkgICAgICAgMTQKKworI2RlZmluZSBQVF9NQ0gxICAgICAgMTUKKyNkZWZpbmUgUFRfTUNIMiAgICAgIDE2CisjZGVmaW5lIFBUX01DSDMgICAgICAxNworI2RlZmluZSBQVF9NQ0g0ICAgICAgMTgKKyNkZWZpbmUgUFRfTUNINSAgICAgIDE5CisjZGVmaW5lIFBUX01DSDYgICAgICAyMAorI2RlZmluZSBQVF9NQ0g3ICAgICAgMjEKKyNkZWZpbmUgUFRfTUNIOCAgICAgIDIyCisjZGVmaW5lIFBUX01DSDkgICAgICAyMworI2RlZmluZSBQVF9NQ0gxMCAgICAgMjQKKyNkZWZpbmUgUFRfTUNIMTEgICAgIDI1CisjZGVmaW5lIFBUX01DSDEyICAgICAyNgorI2RlZmluZSBQVF9NQ0gxMyAgICAgMjcKKyNkZWZpbmUgUFRfTUNIMTQgICAgIDI4CisjZGVmaW5lIFBUX01DSDE1ICAgICAyOQorCisjZGVmaW5lIFBUX0xhYlYyICAgICAzMCAgICAgLy8gSWRlbnRpY2FsIHRvIFBUX0xhYiwgYnV0IHVzaW5nIHRoZSBWMiBvbGQgZW5jb2RpbmcKKworLy8gU29tZSAobm90IGFsbCEpIHJlcHJlc2VudGF0aW9ucworCisjaWZuZGVmIFRZUEVfUkdCXzggICAgICAvLyBUWVBFX1JHQl84IGlzIGEgdmVyeSBjb21tb24gaWRlbnRpZmllciwgc28gZG9uJ3QgaW5jbHVkZSBvdXJzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB1c2VyIGhhcyBpdCBhbHJlYWR5IGRlZmluZWQuCisKKyNkZWZpbmUgVFlQRV9HUkFZXzggICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9HUkFZKXxDSEFOTkVMU19TSCgxKXxCWVRFU19TSCgxKSkKKyNkZWZpbmUgVFlQRV9HUkFZXzhfUkVWICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9HUkFZKXxDSEFOTkVMU19TSCgxKXxCWVRFU19TSCgxKXxGTEFWT1JfU0goMSkpCisjZGVmaW5lIFRZUEVfR1JBWV8xNiAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfR1JBWSl8Q0hBTk5FTFNfU0goMSl8QllURVNfU0goMikpCisjZGVmaW5lIFRZUEVfR1JBWV8xNl9SRVYgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfR1JBWSl8Q0hBTk5FTFNfU0goMSl8QllURVNfU0goMil8RkxBVk9SX1NIKDEpKQorI2RlZmluZSBUWVBFX0dSQVlfMTZfU0UgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0dSQVkpfENIQU5ORUxTX1NIKDEpfEJZVEVTX1NIKDIpfEVORElBTjE2X1NIKDEpKQorI2RlZmluZSBUWVBFX0dSQVlBXzggICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0dSQVkpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDEpfEJZVEVTX1NIKDEpKQorI2RlZmluZSBUWVBFX0dSQVlBXzE2ICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0dSQVkpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDEpfEJZVEVTX1NIKDIpKQorI2RlZmluZSBUWVBFX0dSQVlBXzE2X1NFICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0dSQVkpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDEpfEJZVEVTX1NIKDIpfEVORElBTjE2X1NIKDEpKQorI2RlZmluZSBUWVBFX0dSQVlBXzhfUExBTkFSICAgIChDT0xPUlNQQUNFX1NIKFBUX0dSQVkpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDEpfEJZVEVTX1NIKDEpfFBMQU5BUl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9HUkFZQV8xNl9QTEFOQVIgICAoQ09MT1JTUEFDRV9TSChQVF9HUkFZKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgxKXxCWVRFU19TSCgyKXxQTEFOQVJfU0goMSkpCisKKyNkZWZpbmUgVFlQRV9SR0JfOCAgICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9SR0IpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpKQorI2RlZmluZSBUWVBFX1JHQl84X1BMQU5BUiAgICAgIChDT0xPUlNQQUNFX1NIKFBUX1JHQil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMSl8UExBTkFSX1NIKDEpKQorI2RlZmluZSBUWVBFX0JHUl84ICAgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX1JHQil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMSl8RE9TV0FQX1NIKDEpKQorI2RlZmluZSBUWVBFX0JHUl84X1BMQU5BUiAgICAgIChDT0xPUlNQQUNFX1NIKFBUX1JHQil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMSl8RE9TV0FQX1NIKDEpfFBMQU5BUl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9SR0JfMTYgICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9SR0IpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpKQorI2RlZmluZSBUWVBFX1JHQl8xNl9QTEFOQVIgICAgIChDT0xPUlNQQUNFX1NIKFBUX1JHQil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8UExBTkFSX1NIKDEpKQorI2RlZmluZSBUWVBFX1JHQl8xNl9TRSAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX1JHQil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RU5ESUFOMTZfU0goMSkpCisjZGVmaW5lIFRZUEVfQkdSXzE2ICAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfUkdCKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxET1NXQVBfU0goMSkpCisjZGVmaW5lIFRZUEVfQkdSXzE2X1BMQU5BUiAgICAgKENPTE9SU1BBQ0VfU0goUFRfUkdCKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxET1NXQVBfU0goMSl8UExBTkFSX1NIKDEpKQorI2RlZmluZSBUWVBFX0JHUl8xNl9TRSAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX1JHQil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RE9TV0FQX1NIKDEpfEVORElBTjE2X1NIKDEpKQorCisjZGVmaW5lIFRZUEVfUkdCQV84ICAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfUkdCKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKSkKKyNkZWZpbmUgVFlQRV9SR0JBXzhfUExBTkFSICAgICAoQ09MT1JTUEFDRV9TSChQVF9SR0IpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpfFBMQU5BUl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9SR0JBXzE2ICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9SR0IpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpKQorI2RlZmluZSBUWVBFX1JHQkFfMTZfUExBTkFSICAgIChDT0xPUlNQQUNFX1NIKFBUX1JHQil8RVhUUkFfU0goMSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8UExBTkFSX1NIKDEpKQorI2RlZmluZSBUWVBFX1JHQkFfMTZfU0UgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX1JHQil8RVhUUkFfU0goMSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RU5ESUFOMTZfU0goMSkpCisKKyNkZWZpbmUgVFlQRV9BUkdCXzggICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9SR0IpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpfFNXQVBGSVJTVF9TSCgxKSkKKyNkZWZpbmUgVFlQRV9BUkdCXzhfUExBTkFSICAgICAoQ09MT1JTUEFDRV9TSChQVF9SR0IpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpfFNXQVBGSVJTVF9TSCgxKXxQTEFOQVJfU0goMSkpCisjZGVmaW5lIFRZUEVfQVJHQl8xNiAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfUkdCKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxTV0FQRklSU1RfU0goMSkpCisKKyNkZWZpbmUgVFlQRV9BQkdSXzggICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9SR0IpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpfERPU1dBUF9TSCgxKSkKKyNkZWZpbmUgVFlQRV9BQkdSXzhfUExBTkFSICAgICAoQ09MT1JTUEFDRV9TSChQVF9SR0IpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpfERPU1dBUF9TSCgxKXxQTEFOQVJfU0goMSkpCisjZGVmaW5lIFRZUEVfQUJHUl8xNiAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfUkdCKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxET1NXQVBfU0goMSkpCisjZGVmaW5lIFRZUEVfQUJHUl8xNl9QTEFOQVIgICAgKENPTE9SU1BBQ0VfU0goUFRfUkdCKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxET1NXQVBfU0goMSl8UExBTkFSX1NIKDEpKQorI2RlZmluZSBUWVBFX0FCR1JfMTZfU0UgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX1JHQil8RVhUUkFfU0goMSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RE9TV0FQX1NIKDEpfEVORElBTjE2X1NIKDEpKQorCisjZGVmaW5lIFRZUEVfQkdSQV84ICAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfUkdCKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKXxET1NXQVBfU0goMSl8U1dBUEZJUlNUX1NIKDEpKQorI2RlZmluZSBUWVBFX0JHUkFfOF9QTEFOQVIgICAgIChDT0xPUlNQQUNFX1NIKFBUX1JHQil8RVhUUkFfU0goMSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMSl8RE9TV0FQX1NIKDEpfFNXQVBGSVJTVF9TSCgxKXxQTEFOQVJfU0goMSkpCisjZGVmaW5lIFRZUEVfQkdSQV8xNiAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfUkdCKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxET1NXQVBfU0goMSl8U1dBUEZJUlNUX1NIKDEpKQorI2RlZmluZSBUWVBFX0JHUkFfMTZfU0UgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX1JHQil8RVhUUkFfU0goMSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RU5ESUFOMTZfU0goMSl8RE9TV0FQX1NIKDEpfFNXQVBGSVJTVF9TSCgxKSkKKworI2RlZmluZSBUWVBFX0NNWV84ICAgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0NNWSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMSkpCisjZGVmaW5lIFRZUEVfQ01ZXzhfUExBTkFSICAgICAgKENPTE9SU1BBQ0VfU0goUFRfQ01ZKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKXxQTEFOQVJfU0goMSkpCisjZGVmaW5lIFRZUEVfQ01ZXzE2ICAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfQ01ZKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKSkKKyNkZWZpbmUgVFlQRV9DTVlfMTZfUExBTkFSICAgICAoQ09MT1JTUEFDRV9TSChQVF9DTVkpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfFBMQU5BUl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9DTVlfMTZfU0UgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9DTVkpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfEVORElBTjE2X1NIKDEpKQorCisjZGVmaW5lIFRZUEVfQ01ZS184ICAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfQ01ZSyl8Q0hBTk5FTFNfU0goNCl8QllURVNfU0goMSkpCisjZGVmaW5lIFRZUEVfQ01ZS0FfOCAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfQ01ZSyl8RVhUUkFfU0goMSl8Q0hBTk5FTFNfU0goNCl8QllURVNfU0goMSkpCisjZGVmaW5lIFRZUEVfQ01ZS184X1JFViAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfQ01ZSyl8Q0hBTk5FTFNfU0goNCl8QllURVNfU0goMSl8RkxBVk9SX1NIKDEpKQorI2RlZmluZSBUWVBFX1lVVktfOCAgICAgICAgICAgIFRZUEVfQ01ZS184X1JFVgorI2RlZmluZSBUWVBFX0NNWUtfOF9QTEFOQVIgICAgIChDT0xPUlNQQUNFX1NIKFBUX0NNWUspfENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDEpfFBMQU5BUl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9DTVlLXzE2ICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9DTVlLKXxDSEFOTkVMU19TSCg0KXxCWVRFU19TSCgyKSkKKyNkZWZpbmUgVFlQRV9DTVlLXzE2X1JFViAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9DTVlLKXxDSEFOTkVMU19TSCg0KXxCWVRFU19TSCgyKXxGTEFWT1JfU0goMSkpCisjZGVmaW5lIFRZUEVfWVVWS18xNiAgICAgICAgICAgVFlQRV9DTVlLXzE2X1JFVgorI2RlZmluZSBUWVBFX0NNWUtfMTZfUExBTkFSICAgIChDT0xPUlNQQUNFX1NIKFBUX0NNWUspfENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDIpfFBMQU5BUl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9DTVlLXzE2X1NFICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9DTVlLKXxDSEFOTkVMU19TSCg0KXxCWVRFU19TSCgyKXxFTkRJQU4xNl9TSCgxKSkKKworI2RlZmluZSBUWVBFX0tZTUNfOCAgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0NNWUspfENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDEpfERPU1dBUF9TSCgxKSkKKyNkZWZpbmUgVFlQRV9LWU1DXzE2ICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9DTVlLKXxDSEFOTkVMU19TSCg0KXxCWVRFU19TSCgyKXxET1NXQVBfU0goMSkpCisjZGVmaW5lIFRZUEVfS1lNQ18xNl9TRSAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfQ01ZSyl8Q0hBTk5FTFNfU0goNCl8QllURVNfU0goMil8RE9TV0FQX1NIKDEpfEVORElBTjE2X1NIKDEpKQorCisjZGVmaW5lIFRZUEVfS0NNWV84ICAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfQ01ZSyl8Q0hBTk5FTFNfU0goNCl8QllURVNfU0goMSl8U1dBUEZJUlNUX1NIKDEpKQorI2RlZmluZSBUWVBFX0tDTVlfOF9SRVYgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0NNWUspfENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDEpfEZMQVZPUl9TSCgxKXxTV0FQRklSU1RfU0goMSkpCisjZGVmaW5lIFRZUEVfS0NNWV8xNiAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfQ01ZSyl8Q0hBTk5FTFNfU0goNCl8QllURVNfU0goMil8U1dBUEZJUlNUX1NIKDEpKQorI2RlZmluZSBUWVBFX0tDTVlfMTZfUkVWICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0NNWUspfENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDIpfEZMQVZPUl9TSCgxKXxTV0FQRklSU1RfU0goMSkpCisjZGVmaW5lIFRZUEVfS0NNWV8xNl9TRSAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfQ01ZSyl8Q0hBTk5FTFNfU0goNCl8QllURVNfU0goMil8RU5ESUFOMTZfU0goMSl8U1dBUEZJUlNUX1NIKDEpKQorCisjZGVmaW5lIFRZUEVfQ01ZSzVfOCAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNINSl8Q0hBTk5FTFNfU0goNSl8QllURVNfU0goMSkpCisjZGVmaW5lIFRZUEVfQ01ZSzVfMTYgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNINSl8Q0hBTk5FTFNfU0goNSl8QllURVNfU0goMikpCisjZGVmaW5lIFRZUEVfQ01ZSzVfMTZfU0UgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNINSl8Q0hBTk5FTFNfU0goNSl8QllURVNfU0goMil8RU5ESUFOMTZfU0goMSkpCisjZGVmaW5lIFRZUEVfS1lNQzVfOCAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNINSl8Q0hBTk5FTFNfU0goNSl8QllURVNfU0goMSl8RE9TV0FQX1NIKDEpKQorI2RlZmluZSBUWVBFX0tZTUM1XzE2ICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX01DSDUpfENIQU5ORUxTX1NIKDUpfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKSkKKyNkZWZpbmUgVFlQRV9LWU1DNV8xNl9TRSAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0g1KXxDSEFOTkVMU19TSCg1KXxCWVRFU19TSCgyKXxET1NXQVBfU0goMSl8RU5ESUFOMTZfU0goMSkpCisjZGVmaW5lIFRZUEVfQ01ZSzZfOCAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNINil8Q0hBTk5FTFNfU0goNil8QllURVNfU0goMSkpCisjZGVmaW5lIFRZUEVfQ01ZSzZfOF9QTEFOQVIgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNINil8Q0hBTk5FTFNfU0goNil8QllURVNfU0goMSl8UExBTkFSX1NIKDEpKQorI2RlZmluZSBUWVBFX0NNWUs2XzE2ICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX01DSDYpfENIQU5ORUxTX1NIKDYpfEJZVEVTX1NIKDIpKQorI2RlZmluZSBUWVBFX0NNWUs2XzE2X1BMQU5BUiAgIChDT0xPUlNQQUNFX1NIKFBUX01DSDYpfENIQU5ORUxTX1NIKDYpfEJZVEVTX1NIKDIpfFBMQU5BUl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9DTVlLNl8xNl9TRSAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0g2KXxDSEFOTkVMU19TSCg2KXxCWVRFU19TSCgyKXxFTkRJQU4xNl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9DTVlLN184ICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0g3KXxDSEFOTkVMU19TSCg3KXxCWVRFU19TSCgxKSkKKyNkZWZpbmUgVFlQRV9DTVlLN18xNiAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0g3KXxDSEFOTkVMU19TSCg3KXxCWVRFU19TSCgyKSkKKyNkZWZpbmUgVFlQRV9DTVlLN18xNl9TRSAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0g3KXxDSEFOTkVMU19TSCg3KXxCWVRFU19TSCgyKXxFTkRJQU4xNl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9LWU1DN184ICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0g3KXxDSEFOTkVMU19TSCg3KXxCWVRFU19TSCgxKXxET1NXQVBfU0goMSkpCisjZGVmaW5lIFRZUEVfS1lNQzdfMTYgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNINyl8Q0hBTk5FTFNfU0goNyl8QllURVNfU0goMil8RE9TV0FQX1NIKDEpKQorI2RlZmluZSBUWVBFX0tZTUM3XzE2X1NFICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX01DSDcpfENIQU5ORUxTX1NIKDcpfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKXxFTkRJQU4xNl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9DTVlLOF84ICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0g4KXxDSEFOTkVMU19TSCg4KXxCWVRFU19TSCgxKSkKKyNkZWZpbmUgVFlQRV9DTVlLOF8xNiAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0g4KXxDSEFOTkVMU19TSCg4KXxCWVRFU19TSCgyKSkKKyNkZWZpbmUgVFlQRV9DTVlLOF8xNl9TRSAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0g4KXxDSEFOTkVMU19TSCg4KXxCWVRFU19TSCgyKXxFTkRJQU4xNl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9LWU1DOF84ICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0g4KXxDSEFOTkVMU19TSCg4KXxCWVRFU19TSCgxKXxET1NXQVBfU0goMSkpCisjZGVmaW5lIFRZUEVfS1lNQzhfMTYgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIOCl8Q0hBTk5FTFNfU0goOCl8QllURVNfU0goMil8RE9TV0FQX1NIKDEpKQorI2RlZmluZSBUWVBFX0tZTUM4XzE2X1NFICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX01DSDgpfENIQU5ORUxTX1NIKDgpfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKXxFTkRJQU4xNl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9DTVlLOV84ICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0g5KXxDSEFOTkVMU19TSCg5KXxCWVRFU19TSCgxKSkKKyNkZWZpbmUgVFlQRV9DTVlLOV8xNiAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0g5KXxDSEFOTkVMU19TSCg5KXxCWVRFU19TSCgyKSkKKyNkZWZpbmUgVFlQRV9DTVlLOV8xNl9TRSAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0g5KXxDSEFOTkVMU19TSCg5KXxCWVRFU19TSCgyKXxFTkRJQU4xNl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9LWU1DOV84ICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0g5KXxDSEFOTkVMU19TSCg5KXxCWVRFU19TSCgxKXxET1NXQVBfU0goMSkpCisjZGVmaW5lIFRZUEVfS1lNQzlfMTYgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIOSl8Q0hBTk5FTFNfU0goOSl8QllURVNfU0goMil8RE9TV0FQX1NIKDEpKQorI2RlZmluZSBUWVBFX0tZTUM5XzE2X1NFICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX01DSDkpfENIQU5ORUxTX1NIKDkpfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKXxFTkRJQU4xNl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9DTVlLMTBfOCAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0gxMCl8Q0hBTk5FTFNfU0goMTApfEJZVEVTX1NIKDEpKQorI2RlZmluZSBUWVBFX0NNWUsxMF8xNiAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX01DSDEwKXxDSEFOTkVMU19TSCgxMCl8QllURVNfU0goMikpCisjZGVmaW5lIFRZUEVfQ01ZSzEwXzE2X1NFICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIMTApfENIQU5ORUxTX1NIKDEwKXxCWVRFU19TSCgyKXxFTkRJQU4xNl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9LWU1DMTBfOCAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0gxMCl8Q0hBTk5FTFNfU0goMTApfEJZVEVTX1NIKDEpfERPU1dBUF9TSCgxKSkKKyNkZWZpbmUgVFlQRV9LWU1DMTBfMTYgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0gxMCl8Q0hBTk5FTFNfU0goMTApfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKSkKKyNkZWZpbmUgVFlQRV9LWU1DMTBfMTZfU0UgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0gxMCl8Q0hBTk5FTFNfU0goMTApfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKXxFTkRJQU4xNl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9DTVlLMTFfOCAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0gxMSl8Q0hBTk5FTFNfU0goMTEpfEJZVEVTX1NIKDEpKQorI2RlZmluZSBUWVBFX0NNWUsxMV8xNiAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX01DSDExKXxDSEFOTkVMU19TSCgxMSl8QllURVNfU0goMikpCisjZGVmaW5lIFRZUEVfQ01ZSzExXzE2X1NFICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIMTEpfENIQU5ORUxTX1NIKDExKXxCWVRFU19TSCgyKXxFTkRJQU4xNl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9LWU1DMTFfOCAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0gxMSl8Q0hBTk5FTFNfU0goMTEpfEJZVEVTX1NIKDEpfERPU1dBUF9TSCgxKSkKKyNkZWZpbmUgVFlQRV9LWU1DMTFfMTYgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0gxMSl8Q0hBTk5FTFNfU0goMTEpfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKSkKKyNkZWZpbmUgVFlQRV9LWU1DMTFfMTZfU0UgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0gxMSl8Q0hBTk5FTFNfU0goMTEpfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKXxFTkRJQU4xNl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9DTVlLMTJfOCAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0gxMil8Q0hBTk5FTFNfU0goMTIpfEJZVEVTX1NIKDEpKQorI2RlZmluZSBUWVBFX0NNWUsxMl8xNiAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX01DSDEyKXxDSEFOTkVMU19TSCgxMil8QllURVNfU0goMikpCisjZGVmaW5lIFRZUEVfQ01ZSzEyXzE2X1NFICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIMTIpfENIQU5ORUxTX1NIKDEyKXxCWVRFU19TSCgyKXxFTkRJQU4xNl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9LWU1DMTJfOCAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0gxMil8Q0hBTk5FTFNfU0goMTIpfEJZVEVTX1NIKDEpfERPU1dBUF9TSCgxKSkKKyNkZWZpbmUgVFlQRV9LWU1DMTJfMTYgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0gxMil8Q0hBTk5FTFNfU0goMTIpfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKSkKKyNkZWZpbmUgVFlQRV9LWU1DMTJfMTZfU0UgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0gxMil8Q0hBTk5FTFNfU0goMTIpfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKXxFTkRJQU4xNl9TSCgxKSkKKworLy8gQ29sb3JpbWV0cmljCisjZGVmaW5lIFRZUEVfWFlaXzE2ICAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfWFlaKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKSkKKyNkZWZpbmUgVFlQRV9MYWJfOCAgICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9MYWIpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpKQorI2RlZmluZSBUWVBFX0xhYlYyXzggICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0xhYlYyKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKSkKKworI2RlZmluZSBUWVBFX0FMYWJfOCAgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0xhYil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMSl8RVhUUkFfU0goMSl8U1dBUEZJUlNUX1NIKDEpKQorI2RlZmluZSBUWVBFX0FMYWJWMl84ICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0xhYlYyKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKXxFWFRSQV9TSCgxKXxTV0FQRklSU1RfU0goMSkpCisjZGVmaW5lIFRZUEVfTGFiXzE2ICAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTGFiKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKSkKKyNkZWZpbmUgVFlQRV9MYWJWMl8xNiAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9MYWJWMil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMikpCisjZGVmaW5lIFRZUEVfWXh5XzE2ICAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfWXh5KXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKSkKKworLy8gWUNiQ3IKKyNkZWZpbmUgVFlQRV9ZQ2JDcl84ICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9ZQ2JDcil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMSkpCisjZGVmaW5lIFRZUEVfWUNiQ3JfOF9QTEFOQVIgICAgKENPTE9SU1BBQ0VfU0goUFRfWUNiQ3IpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpfFBMQU5BUl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9ZQ2JDcl8xNiAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9ZQ2JDcil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMikpCisjZGVmaW5lIFRZUEVfWUNiQ3JfMTZfUExBTkFSICAgKENPTE9SU1BBQ0VfU0goUFRfWUNiQ3IpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfFBMQU5BUl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9ZQ2JDcl8xNl9TRSAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9ZQ2JDcil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RU5ESUFOMTZfU0goMSkpCisKKy8vIFlVVgorI2RlZmluZSBUWVBFX1lVVl84ICAgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX1lVVil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMSkpCisjZGVmaW5lIFRZUEVfWVVWXzhfUExBTkFSICAgICAgKENPTE9SU1BBQ0VfU0goUFRfWVVWKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKXxQTEFOQVJfU0goMSkpCisjZGVmaW5lIFRZUEVfWVVWXzE2ICAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfWVVWKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKSkKKyNkZWZpbmUgVFlQRV9ZVVZfMTZfUExBTkFSICAgICAoQ09MT1JTUEFDRV9TSChQVF9ZVVYpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfFBMQU5BUl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9ZVVZfMTZfU0UgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9ZVVYpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfEVORElBTjE2X1NIKDEpKQorCisvLyBITFMKKyNkZWZpbmUgVFlQRV9ITFNfOCAgICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9ITFMpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpKQorI2RlZmluZSBUWVBFX0hMU184X1BMQU5BUiAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0hMUyl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMSl8UExBTkFSX1NIKDEpKQorI2RlZmluZSBUWVBFX0hMU18xNiAgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0hMUyl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMikpCisjZGVmaW5lIFRZUEVfSExTXzE2X1BMQU5BUiAgICAgKENPTE9SU1BBQ0VfU0goUFRfSExTKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxQTEFOQVJfU0goMSkpCisjZGVmaW5lIFRZUEVfSExTXzE2X1NFICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfSExTKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxFTkRJQU4xNl9TSCgxKSkKKworLy8gSFNWCisjZGVmaW5lIFRZUEVfSFNWXzggICAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfSFNWKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKSkKKyNkZWZpbmUgVFlQRV9IU1ZfOF9QTEFOQVIgICAgICAoQ09MT1JTUEFDRV9TSChQVF9IU1YpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpfFBMQU5BUl9TSCgxKSkKKyNkZWZpbmUgVFlQRV9IU1ZfMTYgICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9IU1YpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpKQorI2RlZmluZSBUWVBFX0hTVl8xNl9QTEFOQVIgICAgIChDT0xPUlNQQUNFX1NIKFBUX0hTVil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8UExBTkFSX1NIKDEpKQorI2RlZmluZSBUWVBFX0hTVl8xNl9TRSAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0hTVil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RU5ESUFOMTZfU0goMSkpCisKKy8vIE5hbWVkIGNvbG9yIGluZGV4LiBPbmx5IDE2IGJpdHMgYWxsb3dlZCAoZG9uJ3QgY2hlY2sgY29sb3JzcGFjZSkKKyNkZWZpbmUgVFlQRV9OQU1FRF9DT0xPUl9JTkRFWCAoQ0hBTk5FTFNfU0goMSl8QllURVNfU0goMikpCisKKy8vIEZsb2F0IGZvcm1hdHRlcnMuCisjZGVmaW5lIFRZUEVfWFlaX0ZMVCAgICAgICAgICAoRkxPQVRfU0goMSl8Q09MT1JTUEFDRV9TSChQVF9YWVopfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDQpKQorI2RlZmluZSBUWVBFX0xhYl9GTFQgICAgICAgICAgKEZMT0FUX1NIKDEpfENPTE9SU1BBQ0VfU0goUFRfTGFiKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCg0KSkKKyNkZWZpbmUgVFlQRV9MYWJBX0ZMVCAgICAgICAgIChGTE9BVF9TSCgxKXxDT0xPUlNQQUNFX1NIKFBUX0xhYil8RVhUUkFfU0goMSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goNCkpCisjZGVmaW5lIFRZUEVfR1JBWV9GTFQgICAgICAgICAoRkxPQVRfU0goMSl8Q09MT1JTUEFDRV9TSChQVF9HUkFZKXxDSEFOTkVMU19TSCgxKXxCWVRFU19TSCg0KSkKKyNkZWZpbmUgVFlQRV9SR0JfRkxUICAgICAgICAgIChGTE9BVF9TSCgxKXxDT0xPUlNQQUNFX1NIKFBUX1JHQil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goNCkpCisKKyNkZWZpbmUgVFlQRV9SR0JBX0ZMVCAgICAgICAgIChGTE9BVF9TSCgxKXxDT0xPUlNQQUNFX1NIKFBUX1JHQil8RVhUUkFfU0goMSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goNCkpCisjZGVmaW5lIFRZUEVfQVJHQl9GTFQgICAgICAgICAoRkxPQVRfU0goMSl8Q09MT1JTUEFDRV9TSChQVF9SR0IpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDQpfFNXQVBGSVJTVF9TSCgxKSkKKyNkZWZpbmUgVFlQRV9CR1JfRkxUICAgICAgICAgIChGTE9BVF9TSCgxKXxDT0xPUlNQQUNFX1NIKFBUX1JHQil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goNCl8RE9TV0FQX1NIKDEpKQorI2RlZmluZSBUWVBFX0JHUkFfRkxUICAgICAgICAgKEZMT0FUX1NIKDEpfENPTE9SU1BBQ0VfU0goUFRfUkdCKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCg0KXxET1NXQVBfU0goMSl8U1dBUEZJUlNUX1NIKDEpKQorI2RlZmluZSBUWVBFX0FCR1JfRkxUICAgICAgICAgKEZMT0FUX1NIKDEpfENPTE9SU1BBQ0VfU0goUFRfUkdCKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCg0KXxET1NXQVBfU0goMSkpCisKKyNkZWZpbmUgVFlQRV9DTVlLX0ZMVCAgICAgICAgIChGTE9BVF9TSCgxKXxDT0xPUlNQQUNFX1NIKFBUX0NNWUspfENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDQpKQorCisvLyBGbG9hdGluZyBwb2ludCBmb3JtYXR0ZXJzLgorLy8gTk9URSBUSEFUICdCWVRFUycgRklFTEQgSVMgU0VUIFRPIFpFUk8gT04gRExCIGJlY2F1c2UgOCBieXRlcyBvdmVyZmxvd3MgdGhlIGJpdGZpZWxkCisjZGVmaW5lIFRZUEVfWFlaX0RCTCAgICAgICAgICAoRkxPQVRfU0goMSl8Q09MT1JTUEFDRV9TSChQVF9YWVopfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDApKQorI2RlZmluZSBUWVBFX0xhYl9EQkwgICAgICAgICAgKEZMT0FUX1NIKDEpfENPTE9SU1BBQ0VfU0goUFRfTGFiKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgwKSkKKyNkZWZpbmUgVFlQRV9HUkFZX0RCTCAgICAgICAgIChGTE9BVF9TSCgxKXxDT0xPUlNQQUNFX1NIKFBUX0dSQVkpfENIQU5ORUxTX1NIKDEpfEJZVEVTX1NIKDApKQorI2RlZmluZSBUWVBFX1JHQl9EQkwgICAgICAgICAgKEZMT0FUX1NIKDEpfENPTE9SU1BBQ0VfU0goUFRfUkdCKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgwKSkKKyNkZWZpbmUgVFlQRV9CR1JfREJMICAgICAgICAgIChGTE9BVF9TSCgxKXxDT0xPUlNQQUNFX1NIKFBUX1JHQil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMCl8RE9TV0FQX1NIKDEpKQorI2RlZmluZSBUWVBFX0NNWUtfREJMICAgICAgICAgKEZMT0FUX1NIKDEpfENPTE9SU1BBQ0VfU0goUFRfQ01ZSyl8Q0hBTk5FTFNfU0goNCl8QllURVNfU0goMCkpCisKKy8vIElFRUUgNzU0LTIwMDggImhhbGYiCisjZGVmaW5lIFRZUEVfR1JBWV9IQUxGX0ZMVCAgICAoRkxPQVRfU0goMSl8Q09MT1JTUEFDRV9TSChQVF9HUkFZKXxDSEFOTkVMU19TSCgxKXxCWVRFU19TSCgyKSkKKyNkZWZpbmUgVFlQRV9SR0JfSEFMRl9GTFQgICAgIChGTE9BVF9TSCgxKXxDT0xPUlNQQUNFX1NIKFBUX1JHQil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMikpCisjZGVmaW5lIFRZUEVfUkdCQV9IQUxGX0ZMVCAgICAoRkxPQVRfU0goMSl8Q09MT1JTUEFDRV9TSChQVF9SR0IpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpKQorI2RlZmluZSBUWVBFX0NNWUtfSEFMRl9GTFQgICAgKEZMT0FUX1NIKDEpfENPTE9SU1BBQ0VfU0goUFRfQ01ZSyl8Q0hBTk5FTFNfU0goNCl8QllURVNfU0goMikpCisKKyNkZWZpbmUgVFlQRV9SR0JBX0hBTEZfRkxUICAgIChGTE9BVF9TSCgxKXxDT0xPUlNQQUNFX1NIKFBUX1JHQil8RVhUUkFfU0goMSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMikpCisjZGVmaW5lIFRZUEVfQVJHQl9IQUxGX0ZMVCAgICAoRkxPQVRfU0goMSl8Q09MT1JTUEFDRV9TSChQVF9SR0IpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfFNXQVBGSVJTVF9TSCgxKSkKKyNkZWZpbmUgVFlQRV9CR1JfSEFMRl9GTFQgICAgIChGTE9BVF9TSCgxKXxDT0xPUlNQQUNFX1NIKFBUX1JHQil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RE9TV0FQX1NIKDEpKQorI2RlZmluZSBUWVBFX0JHUkFfSEFMRl9GTFQgICAgKEZMT0FUX1NIKDEpfENPTE9SU1BBQ0VfU0goUFRfUkdCKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxET1NXQVBfU0goMSl8U1dBUEZJUlNUX1NIKDEpKQorI2RlZmluZSBUWVBFX0FCR1JfSEFMRl9GTFQgICAgKEZMT0FUX1NIKDEpfENPTE9SU1BBQ0VfU0goUFRfUkdCKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxET1NXQVBfU0goMSkpCisKKyNlbmRpZgorCisvLyBDb2xvcnNwYWNlcwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIFg7CisgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgWTsKKyAgICAgICAgY21zRmxvYXQ2NE51bWJlciBaOworCisgICAgfSBjbXNDSUVYWVo7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgY21zRmxvYXQ2NE51bWJlciB4OworICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIHk7CisgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgWTsKKworICAgIH0gY21zQ0lFeHlZOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgTDsKKyAgICAgICAgY21zRmxvYXQ2NE51bWJlciBhOworICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIGI7CisKKyAgICB9IGNtc0NJRUxhYjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEw7CisgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgQzsKKyAgICAgICAgY21zRmxvYXQ2NE51bWJlciBoOworCisgICAgfSBjbXNDSUVMQ2g7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgY21zRmxvYXQ2NE51bWJlciBKOworICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEM7CisgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgaDsKKworICAgIH0gY21zSkNoOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGNtc0NJRVhZWiAgUmVkOworICAgICAgICBjbXNDSUVYWVogIEdyZWVuOworICAgICAgICBjbXNDSUVYWVogIEJsdWU7CisKKyAgICB9IGNtc0NJRVhZWlRSSVBMRTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBjbXNDSUV4eVkgIFJlZDsKKyAgICAgICAgY21zQ0lFeHlZICBHcmVlbjsKKyAgICAgICAgY21zQ0lFeHlZICBCbHVlOworCisgICAgfSBjbXNDSUV4eVlUUklQTEU7CisKKy8vIElsbHVtaW5hbnQgdHlwZXMgZm9yIHN0cnVjdHMgYmVsb3cKKyNkZWZpbmUgY21zSUxMVU1JTkFOVF9UWVBFX1VOS05PV04gMHgwMDAwMDAwCisjZGVmaW5lIGNtc0lMTFVNSU5BTlRfVFlQRV9ENTAgICAgIDB4MDAwMDAwMQorI2RlZmluZSBjbXNJTExVTUlOQU5UX1RZUEVfRDY1ICAgICAweDAwMDAwMDIKKyNkZWZpbmUgY21zSUxMVU1JTkFOVF9UWVBFX0Q5MyAgICAgMHgwMDAwMDAzCisjZGVmaW5lIGNtc0lMTFVNSU5BTlRfVFlQRV9GMiAgICAgIDB4MDAwMDAwNAorI2RlZmluZSBjbXNJTExVTUlOQU5UX1RZUEVfRDU1ICAgICAweDAwMDAwMDUKKyNkZWZpbmUgY21zSUxMVU1JTkFOVF9UWVBFX0EgICAgICAgMHgwMDAwMDA2CisjZGVmaW5lIGNtc0lMTFVNSU5BTlRfVFlQRV9FICAgICAgIDB4MDAwMDAwNworI2RlZmluZSBjbXNJTExVTUlOQU5UX1RZUEVfRjggICAgICAweDAwMDAwMDgKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBjbXNVSW50MzJOdW1iZXIgIE9ic2VydmVyOyAgICAvLyAwID0gdW5rbm93biwgMT1DSUUgMTkzMSwgMj1DSUUgMTk2NAorICAgICAgICBjbXNDSUVYWVogICAgICAgIEJhY2tpbmc7ICAgICAvLyBWYWx1ZSBvZiBiYWNraW5nCisgICAgICAgIGNtc1VJbnQzMk51bWJlciAgR2VvbWV0cnk7ICAgIC8vIDA9dW5rbm93biwgMT00NS8wLCAwLzQ1IDI9MGQsIGQvMAorICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEZsYXJlOyAgICAgICAvLyAwLi4xLjAKKyAgICAgICAgY21zVUludDMyTnVtYmVyICBJbGx1bWluYW50VHlwZTsKKworICAgIH0gY21zSUNDTWVhc3VyZW1lbnRDb25kaXRpb25zOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGNtc0NJRVhZWiAgICAgICBJbGx1bWluYW50WFlaOyAgIC8vIE5vdCB0aGUgc2FtZSBzdHJ1Y3QgYXMgQ0FNMDIsCisgICAgICAgIGNtc0NJRVhZWiAgICAgICBTdXJyb3VuZFhZWjsgICAgIC8vIFRoaXMgaXMgZm9yIHN0b3JpbmcgdGhlIHRhZworICAgICAgICBjbXNVSW50MzJOdW1iZXIgSWxsdW1pbmFudFR5cGU7ICAvLyB2aWV3aW5nIGNvbmRpdGlvbgorCisgICAgfSBjbXNJQ0NWaWV3aW5nQ29uZGl0aW9uczsKKworLy8gR2V0IExpdHRsZUNNUyB2ZXJzaW9uIChmb3Igc2hhcmVkIG9iamVjdHMpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NNU0FQSSBpbnQgICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zR2V0RW5jb2RlZENNTXZlcnNpb24odm9pZCk7CisKKy8vIFN1cHBvcnQgb2Ygbm9uLXN0YW5kYXJkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDTVNBUEkgaW50ICAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc3N0cmNhc2VjbXAoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKTsKK0NNU0FQSSBsb25nIGludCAgICAgICAgICBDTVNFWFBPUlQgY21zZmlsZWxlbmd0aChGSUxFKiBmKTsKKworCisvLyBDb250ZXh0IGhhbmRsaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEVhY2ggY29udGV4dCBob2xkcyBpdHMgb3ducyBnbG9iYWxzIGFuZCBpdHMgb3duIHBsdWctaW5zLiBUaGVyZSBpcyBhIGdsb2JhbCBjb250ZXh0IHdpdGggdGhlIGlkID0gMCBmb3IgbGVjYWN5IGNvbXBhdGliaWxpdHkKKy8vIHRob3VnaCB1c2luZyB0aGUgZ2xvYmFsIGNvbnRleHQgaXMgbm90IHJlY29tbWVuZGVkLiBQcm9wZXIgY29udGV4dCBoYW5kbGluZyBtYWtlcyBsY21zIG1vcmUgdGhyZWFkLXNhZmUuCisKK3R5cGVkZWYgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY21zQ29udGV4dDsKKworQ01TQVBJIGNtc0NvbnRleHQgICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZUNvbnRleHQodm9pZCogUGx1Z2luLCB2b2lkKiBVc2VyRGF0YSk7CitDTVNBUEkgdm9pZCAgICAgICAgICAgICBDTVNFWFBPUlQgY21zRGVsZXRlQ29udGV4dChjbXNDb250ZXh0IENvbnRleElEKTsKK0NNU0FQSSBjbXNDb250ZXh0ICAgICAgIENNU0VYUE9SVCBjbXNEdXBDb250ZXh0KGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBOZXdVc2VyRGF0YSk7CitDTVNBUEkgdm9pZCogICAgICAgICAgICBDTVNFWFBPUlQgY21zR2V0Q29udGV4dFVzZXJEYXRhKGNtc0NvbnRleHQgQ29udGV4dElEKTsKKworLy8gUGx1Zy1JbiByZWdpc3RlcmluZyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNQbHVnaW4odm9pZCogUGx1Z2luKTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zUGx1Z2luVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBQbHVnaW4pOworQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNVbnJlZ2lzdGVyUGx1Z2lucyh2b2lkKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zVW5yZWdpc3RlclBsdWdpbnNUSFIoY21zQ29udGV4dCBDb250ZXh0SUQpOworCisvLyBFcnJvciBsb2dnaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhlcmUgaXMgbm8gZXJyb3IgaGFuZGxpbmcgYXQgYWxsLiBXaGVuIGEgZnVuY3Rpb24gZmFpbHMsIGl0IHJldHVybnMgcHJvcGVyIHZhbHVlLgorLy8gRm9yIGV4YW1wbGUsIGFsbCBjcmVhdGUgZnVuY3Rpb25zIGRvZXMgcmV0dXJuIE5VTEwgb24gZmFpbHVyZS4gT3RoZXIgbWF5IHJldHVybiBGQUxTRS4KKy8vIEl0IG1heSBiZSBpbnRlcmVzdGluZywgZm9yIHRoZSBkZXZlbG9wZXIsIHRvIGtub3cgd2h5IHRoZSBmdW5jdGlvbiBpcyBmYWlsaW5nLgorLy8gZm9yIHRoYXQgcmVhc29uLCBsY21zMiBkb2VzIG9mZmVyIGEgbG9nZ2luZyBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiB3aWxsIGdldAorLy8gYW4gRU5HTElTSCBzdHJpbmcgd2l0aCBzb21lIGNsdWVzIG9uIHdoYXQgaXMgZ29pbmcgd3JvbmcuIFlvdSBjYW4gc2hvdyB0aGlzCisvLyBpbmZvIHRvIHRoZSBlbmQgdXNlciBpZiB5b3Ugd2lzaCwgb3IganVzdCBjcmVhdGUgc29tZSBzb3J0IG9mIGxvZyBvbiBkaXNrLgorLy8gVGhlIGxvZ2dpbmcgZnVuY3Rpb24gc2hvdWxkIE5PVCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0sIGFzIHRoaXMgb2J2aW91c2x5IGNhbiBsZWF2ZQorLy8gdW5mcmVlZCByZXNvdXJjZXMuIEl0IGlzIHRoZSBwcm9ncmFtbWVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gY2hlY2sgZWFjaCBmdW5jdGlvbgorLy8gcmV0dXJuIGNvZGUgdG8gbWFrZSBzdXJlIGl0IGRpZG4ndCBmYWlsLgorCisjZGVmaW5lIGNtc0VSUk9SX1VOREVGSU5FRCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBjbXNFUlJPUl9GSUxFICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgY21zRVJST1JfUkFOR0UgICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIGNtc0VSUk9SX0lOVEVSTkFMICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSBjbXNFUlJPUl9OVUxMICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgY21zRVJST1JfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIGNtc0VSUk9SX1NFRUsgICAgICAgICAgICAgICAgICAgICAgICAgNgorI2RlZmluZSBjbXNFUlJPUl9XUklURSAgICAgICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04gICAgICAgICAgICA4CisjZGVmaW5lIGNtc0VSUk9SX0NPTE9SU1BBQ0VfQ0hFQ0sgICAgICAgICAgICAgOQorI2RlZmluZSBjbXNFUlJPUl9BTFJFQURZX0RFRklORUQgICAgICAgICAgICAgIDEwCisjZGVmaW5lIGNtc0VSUk9SX0JBRF9TSUdOQVRVUkUgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgY21zRVJST1JfQ09SUlVQVElPTl9ERVRFQ1RFRCAgICAgICAgICAxMgorI2RlZmluZSBjbXNFUlJPUl9OT1RfU1VJVEFCTEUgICAgICAgICAgICAgICAgIDEzCisKKy8vIEVycm9yIGxvZ2dlciBpcyBjYWxsZWQgd2l0aCB0aGUgQ29udGV4dElEIHdoZW4gYSBtZXNzYWdlIGlzIHJhaXNlZC4gVGhpcyBnaXZlcyB0aGUKKy8vIGNoYW5jZSB0byBrbm93IHdoaWNoIHRocmVhZCBpcyByZXNwb25zaWJsZSBvZiB0aGUgd2FybmluZyBhbmQgYW55IGVudmlyb25tZW50IGFzc29jaWF0ZWQKKy8vIHdpdGggaXQuIE5vbi1tdWx0aXRocmVhZGluZyBhcHBsaWNhdGlvbnMgbWF5IHNhZmVseSBpZ25vcmUgdGhpcyBwYXJhbWV0ZXIuCisvLyBOb3RlIHRoYXQgdW5kZXIgY2VydGFpbiBzcGVjaWFsIGNpcmN1bXN0YW5jZXMsIENvbnRleHRJRCBtYXkgYmUgTlVMTC4KK3R5cGVkZWYgdm9pZCAgKCogY21zTG9nRXJyb3JIYW5kbGVyRnVuY3Rpb24pKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgRXJyb3JDb2RlLCBjb25zdCBjaGFyICpUZXh0KTsKKworLy8gQWxsb3dzIHVzZXIgdG8gc2V0IGFueSBzcGVjaWZpYyBsb2dnZXIKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zU2V0TG9nRXJyb3JIYW5kbGVyKGNtc0xvZ0Vycm9ySGFuZGxlckZ1bmN0aW9uIEZuKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zU2V0TG9nRXJyb3JIYW5kbGVyVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNMb2dFcnJvckhhbmRsZXJGdW5jdGlvbiBGbik7CisKKy8vIENvbnZlcnNpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFJldHVybnMgcG9pbnRlcnMgdG8gY29uc3RhbnQgc3RydWN0cworQ01TQVBJIGNvbnN0IGNtc0NJRVhZWiogIENNU0VYUE9SVCBjbXNENTBfWFlaKHZvaWQpOworQ01TQVBJIGNvbnN0IGNtc0NJRXh5WSogIENNU0VYUE9SVCBjbXNENTBfeHlZKHZvaWQpOworCisvLyBDb2xvcmltZXRyaWMgc3BhY2UgY29udmVyc2lvbnMKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zWFlaMnh5WShjbXNDSUV4eVkqIERlc3QsIGNvbnN0IGNtc0NJRVhZWiogU291cmNlKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zeHlZMlhZWihjbXNDSUVYWVoqIERlc3QsIGNvbnN0IGNtc0NJRXh5WSogU291cmNlKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zWFlaMkxhYihjb25zdCBjbXNDSUVYWVoqIFdoaXRlUG9pbnQsIGNtc0NJRUxhYiogTGFiLCBjb25zdCBjbXNDSUVYWVoqIHh5eik7CitDTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0xhYjJYWVooY29uc3QgY21zQ0lFWFlaKiBXaGl0ZVBvaW50LCBjbXNDSUVYWVoqIHh5eiwgY29uc3QgY21zQ0lFTGFiKiBMYWIpOworQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNMYWIyTENoKGNtc0NJRUxDaCpMQ2gsIGNvbnN0IGNtc0NJRUxhYiogTGFiKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zTENoMkxhYihjbXNDSUVMYWIqIExhYiwgY29uc3QgY21zQ0lFTENoKiBMQ2gpOworCisvLyBFbmNvZGluZyAvRGVjb2Rpbmcgb24gUENTCitDTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0xhYkVuY29kZWQyRmxvYXQoY21zQ0lFTGFiKiBMYWIsIGNvbnN0IGNtc1VJbnQxNk51bWJlciB3TGFiWzNdKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zTGFiRW5jb2RlZDJGbG9hdFYyKGNtc0NJRUxhYiogTGFiLCBjb25zdCBjbXNVSW50MTZOdW1iZXIgd0xhYlszXSk7CitDTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0Zsb2F0MkxhYkVuY29kZWQoY21zVUludDE2TnVtYmVyIHdMYWJbM10sIGNvbnN0IGNtc0NJRUxhYiogTGFiKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zRmxvYXQyTGFiRW5jb2RlZFYyKGNtc1VJbnQxNk51bWJlciB3TGFiWzNdLCBjb25zdCBjbXNDSUVMYWIqIExhYik7CitDTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc1hZWkVuY29kZWQyRmxvYXQoY21zQ0lFWFlaKiBmeHl6LCBjb25zdCBjbXNVSW50MTZOdW1iZXIgWFlaWzNdKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zRmxvYXQyWFlaRW5jb2RlZChjbXNVSW50MTZOdW1iZXIgWFlaWzNdLCBjb25zdCBjbXNDSUVYWVoqIGZYWVopOworCisvLyBEZWx0YUUgbWV0cmljcworQ01TQVBJIGNtc0Zsb2F0NjROdW1iZXIgIENNU0VYUE9SVCBjbXNEZWx0YUUoY29uc3QgY21zQ0lFTGFiKiBMYWIxLCBjb25zdCBjbXNDSUVMYWIqIExhYjIpOworQ01TQVBJIGNtc0Zsb2F0NjROdW1iZXIgIENNU0VYUE9SVCBjbXNDSUU5NERlbHRhRShjb25zdCBjbXNDSUVMYWIqIExhYjEsIGNvbnN0IGNtc0NJRUxhYiogTGFiMik7CitDTVNBUEkgY21zRmxvYXQ2NE51bWJlciAgQ01TRVhQT1JUIGNtc0JGRGRlbHRhRShjb25zdCBjbXNDSUVMYWIqIExhYjEsIGNvbnN0IGNtc0NJRUxhYiogTGFiMik7CitDTVNBUEkgY21zRmxvYXQ2NE51bWJlciAgQ01TRVhQT1JUIGNtc0NNQ2RlbHRhRShjb25zdCBjbXNDSUVMYWIqIExhYjEsIGNvbnN0IGNtc0NJRUxhYiogTGFiMiwgY21zRmxvYXQ2NE51bWJlciBsLCBjbXNGbG9hdDY0TnVtYmVyIGMpOworQ01TQVBJIGNtc0Zsb2F0NjROdW1iZXIgIENNU0VYUE9SVCBjbXNDSUUyMDAwRGVsdGFFKGNvbnN0IGNtc0NJRUxhYiogTGFiMSwgY29uc3QgY21zQ0lFTGFiKiBMYWIyLCBjbXNGbG9hdDY0TnVtYmVyIEtsLCBjbXNGbG9hdDY0TnVtYmVyIEtjLCBjbXNGbG9hdDY0TnVtYmVyIEtoKTsKKworLy8gVGVtcGVyYXR1cmUgPC0+IENocm9tYXRpY2l0eSAoQmxhY2sgYm9keSkKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zV2hpdGVQb2ludEZyb21UZW1wKGNtc0NJRXh5WSogV2hpdGVQb2ludCwgY21zRmxvYXQ2NE51bWJlciAgVGVtcEspOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNUZW1wRnJvbVdoaXRlUG9pbnQoY21zRmxvYXQ2NE51bWJlciogVGVtcEssIGNvbnN0IGNtc0NJRXh5WSogV2hpdGVQb2ludCk7CisKKy8vIENocm9tYXRpYyBhZGFwdGF0aW9uCitDTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUIGNtc0FkYXB0VG9JbGx1bWluYW50KGNtc0NJRVhZWiogUmVzdWx0LCBjb25zdCBjbXNDSUVYWVoqIFNvdXJjZVdoaXRlUHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNDSUVYWVoqIElsbHVtaW5hbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNDSUVYWVoqIFZhbHVlKTsKKworLy8gQ0lFQ0FNMDIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFZpZXdpbmcgY29uZGl0aW9ucy4gUGxlYXNlIG5vdGUgdGhvc2UgYXJlIENBTSBtb2RlbCB2aWV3aW5nIGNvbmRpdGlvbnMsIGFuZCBub3QgdGhlIElDQyB0YWcgdmlld2luZworLy8gY29uZGl0aW9ucywgd2hpY2ggSSdtIG5hbWluZyBjbXNJQ0NWaWV3aW5nQ29uZGl0aW9ucyB0byBtYWtlIGRpZmZlcmVuY2VzIGV2aWRlbnQuIFVuZm9ydHVuYXRlbHksIHRoZSB0YWcKKy8vIGNhbm5vdCBkZWFsIHdpdGggc3Vycm91bmQgTGEsIFliIGFuZCBEIHZhbHVlIHNvIGlzIGJhc2ljYWxseSB1c2VsZXNzIHRvIHN0b3JlIENBTTAyIHZpZXdpbmcgY29uZGl0aW9ucy4KKworCisjZGVmaW5lIEFWR19TVVJST1VORCAgICAgICAxCisjZGVmaW5lIERJTV9TVVJST1VORCAgICAgICAyCisjZGVmaW5lIERBUktfU1VSUk9VTkQgICAgICAzCisjZGVmaW5lIENVVFNIRUVUX1NVUlJPVU5EICA0CisKKyNkZWZpbmUgRF9DQUxDVUxBVEUgICAgICAgICgtMSkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNtc0NJRVhZWiAgICAgICAgd2hpdGVQb2ludDsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIFliOworICAgIGNtc0Zsb2F0NjROdW1iZXIgTGE7CisgICAgaW50ICAgICAgICAgICAgICBzdXJyb3VuZDsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIERfdmFsdWU7CisKKyAgICB9IGNtc1ZpZXdpbmdDb25kaXRpb25zOworCitDTVNBUEkgY21zSEFORExFICAgICAgICAgQ01TRVhQT1JUIGNtc0NJRUNBTTAySW5pdChjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3QgY21zVmlld2luZ0NvbmRpdGlvbnMqIHBWQyk7CitDTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0NJRUNBTTAyRG9uZShjbXNIQU5ETEUgaE1vZGVsKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zQ0lFQ0FNMDJGb3J3YXJkKGNtc0hBTkRMRSBoTW9kZWwsIGNvbnN0IGNtc0NJRVhZWiogcEluLCBjbXNKQ2gqIHBPdXQpOworQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNDSUVDQU0wMlJldmVyc2UoY21zSEFORExFIGhNb2RlbCwgY29uc3QgY21zSkNoKiBwSW4sICAgIGNtc0NJRVhZWiogcE91dCk7CisKKworLy8gVG9uZSBjdXJ2ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhpcyBkZXNjcmliZXMgYSBjdXJ2ZSBzZWdtZW50LiBGb3IgYSB0YWJsZSBvZiBzdXBwb3J0ZWQgdHlwZXMsIHNlZSB0aGUgbWFudWFsLiBVc2VyIGNhbiBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mCisvLyBhdmFpbGFibGUgdHlwZXMgYnkgdXNpbmcgYSBwcm9wZXIgcGx1Zy1pbi4gUGFyYW1ldHJpYyBzZWdtZW50cyBhbGxvdyAxMCBwYXJhbWV0ZXJzIGF0IG1vc3QKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNtc0Zsb2F0MzJOdW1iZXIgICB4MCwgeDE7ICAgICAgICAgICAvLyBEb21haW47IGZvciB4MCA8IHggPD0geDEKKyAgICBjbXNJbnQzMk51bWJlciAgICAgVHlwZTsgICAgICAgICAgICAgLy8gUGFyYW1ldHJpYyB0eXBlLCBUeXBlID09IDAgbWVhbnMgc2FtcGxlZCBzZWdtZW50LiBOZWdhdGl2ZSB2YWx1ZXMgYXJlIHJlc2VydmVkCisgICAgY21zRmxvYXQ2NE51bWJlciAgIFBhcmFtc1sxMF07ICAgICAgIC8vIFBhcmFtZXRlcnMgaWYgVHlwZSAhPSAwCisgICAgY21zVUludDMyTnVtYmVyICAgIG5HcmlkUG9pbnRzOyAgICAgIC8vIE51bWJlciBvZiBncmlkIHBvaW50cyBpZiBUeXBlID09IDAKKyAgICBjbXNGbG9hdDMyTnVtYmVyKiAgU2FtcGxlZFBvaW50czsgICAgLy8gUG9pbnRzIHRvIGFuIGFycmF5IG9mIGZsb2F0cyBpZiBUeXBlID09IDAKKworfSBjbXNDdXJ2ZVNlZ21lbnQ7CisKKy8vIFRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBpcyBub25lIG9mIHlvdXIgYnVzaW5lc3MuCit0eXBlZGVmIHN0cnVjdCBfY21zX2N1cnZlX3N0cnVjdCBjbXNUb25lQ3VydmU7CisKK0NNU0FQSSBjbXNUb25lQ3VydmUqICAgICBDTVNFWFBPUlQgY21zQnVpbGRTZWdtZW50ZWRUb25lQ3VydmUoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc0ludDMyTnVtYmVyIG5TZWdtZW50cywgY29uc3QgY21zQ3VydmVTZWdtZW50IFNlZ21lbnRzW10pOworQ01TQVBJIGNtc1RvbmVDdXJ2ZSogICAgIENNU0VYUE9SVCBjbXNCdWlsZFBhcmFtZXRyaWNUb25lQ3VydmUoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc0ludDMyTnVtYmVyIFR5cGUsIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIgUGFyYW1zW10pOworQ01TQVBJIGNtc1RvbmVDdXJ2ZSogICAgIENNU0VYUE9SVCBjbXNCdWlsZEdhbW1hKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNGbG9hdDY0TnVtYmVyIEdhbW1hKTsKK0NNU0FQSSBjbXNUb25lQ3VydmUqICAgICBDTVNFWFBPUlQgY21zQnVpbGRUYWJ1bGF0ZWRUb25lQ3VydmUxNihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zSW50MzJOdW1iZXIgbkVudHJpZXMsIGNvbnN0IGNtc1VJbnQxNk51bWJlciB2YWx1ZXNbXSk7CitDTVNBUEkgY21zVG9uZUN1cnZlKiAgICAgQ01TRVhQT1JUIGNtc0J1aWxkVGFidWxhdGVkVG9uZUN1cnZlRmxvYXQoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBuRW50cmllcywgY29uc3QgY21zRmxvYXQzMk51bWJlciB2YWx1ZXNbXSk7CitDTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0ZyZWVUb25lQ3VydmUoY21zVG9uZUN1cnZlKiBDdXJ2ZSk7CitDTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0ZyZWVUb25lQ3VydmVUcmlwbGUoY21zVG9uZUN1cnZlKiBDdXJ2ZVszXSk7CitDTVNBUEkgY21zVG9uZUN1cnZlKiAgICAgQ01TRVhQT1JUIGNtc0R1cFRvbmVDdXJ2ZShjb25zdCBjbXNUb25lQ3VydmUqIFNyYyk7CitDTVNBUEkgY21zVG9uZUN1cnZlKiAgICAgQ01TRVhQT1JUIGNtc1JldmVyc2VUb25lQ3VydmUoY29uc3QgY21zVG9uZUN1cnZlKiBJbkdhbW1hKTsKK0NNU0FQSSBjbXNUb25lQ3VydmUqICAgICBDTVNFWFBPUlQgY21zUmV2ZXJzZVRvbmVDdXJ2ZUV4KGNtc0ludDMyTnVtYmVyIG5SZXN1bHRTYW1wbGVzLCBjb25zdCBjbXNUb25lQ3VydmUqIEluR2FtbWEpOworQ01TQVBJIGNtc1RvbmVDdXJ2ZSogICAgIENNU0VYUE9SVCBjbXNKb2luVG9uZUN1cnZlKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCBjbXNUb25lQ3VydmUqIFgsICBjb25zdCBjbXNUb25lQ3VydmUqIFksIGNtc1VJbnQzMk51bWJlciBuUG9pbnRzKTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zU21vb3RoVG9uZUN1cnZlKGNtc1RvbmVDdXJ2ZSogVGFiLCBjbXNGbG9hdDY0TnVtYmVyIGxhbWJkYSk7CitDTVNBUEkgY21zRmxvYXQzMk51bWJlciAgQ01TRVhQT1JUIGNtc0V2YWxUb25lQ3VydmVGbG9hdChjb25zdCBjbXNUb25lQ3VydmUqIEN1cnZlLCBjbXNGbG9hdDMyTnVtYmVyIHYpOworQ01TQVBJIGNtc1VJbnQxNk51bWJlciAgIENNU0VYUE9SVCBjbXNFdmFsVG9uZUN1cnZlMTYoY29uc3QgY21zVG9uZUN1cnZlKiBDdXJ2ZSwgY21zVUludDE2TnVtYmVyIHYpOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNJc1RvbmVDdXJ2ZU11bHRpc2VnbWVudChjb25zdCBjbXNUb25lQ3VydmUqIEluR2FtbWEpOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNJc1RvbmVDdXJ2ZUxpbmVhcihjb25zdCBjbXNUb25lQ3VydmUqIEN1cnZlKTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zSXNUb25lQ3VydmVNb25vdG9uaWMoY29uc3QgY21zVG9uZUN1cnZlKiB0KTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zSXNUb25lQ3VydmVEZXNjZW5kaW5nKGNvbnN0IGNtc1RvbmVDdXJ2ZSogdCk7CitDTVNBUEkgY21zSW50MzJOdW1iZXIgICAgQ01TRVhQT1JUIGNtc0dldFRvbmVDdXJ2ZVBhcmFtZXRyaWNUeXBlKGNvbnN0IGNtc1RvbmVDdXJ2ZSogdCk7CitDTVNBUEkgY21zRmxvYXQ2NE51bWJlciAgQ01TRVhQT1JUIGNtc0VzdGltYXRlR2FtbWEoY29uc3QgY21zVG9uZUN1cnZlKiB0LCBjbXNGbG9hdDY0TnVtYmVyIFByZWNpc2lvbik7CisKKy8vIFRvbmUgY3VydmUgdGFidWxhciBlc3RpbWF0aW9uCitDTVNBUEkgY21zVUludDMyTnVtYmVyICAgICAgICAgQ01TRVhQT1JUIGNtc0dldFRvbmVDdXJ2ZUVzdGltYXRlZFRhYmxlRW50cmllcyhjb25zdCBjbXNUb25lQ3VydmUqIHQpOworQ01TQVBJIGNvbnN0IGNtc1VJbnQxNk51bWJlciogIENNU0VYUE9SVCBjbXNHZXRUb25lQ3VydmVFc3RpbWF0ZWRUYWJsZShjb25zdCBjbXNUb25lQ3VydmUqIHQpOworCisKKy8vIEltcGxlbWVudHMgcGlwZWxpbmVzIG9mIG11bHRpLXByb2Nlc3NpbmcgZWxlbWVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBOb3RoaW5nIHRvIHNlZSBoZXJlLCBtb3ZlIGFsb25nCit0eXBlZGVmIHN0cnVjdCBfY21zUGlwZWxpbmVfc3RydWN0IGNtc1BpcGVsaW5lOwordHlwZWRlZiBzdHJ1Y3QgX2Ntc1N0YWdlX3N0cnVjdCBjbXNTdGFnZTsKKworLy8gVGhvc2UgYXJlIGhpLWxldmVsIHBpcGVsaW5lcworQ01TQVBJIGNtc1BpcGVsaW5lKiAgICAgIENNU0VYUE9SVCBjbXNQaXBlbGluZUFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgSW5wdXRDaGFubmVscywgY21zVUludDMyTnVtYmVyIE91dHB1dENoYW5uZWxzKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zUGlwZWxpbmVGcmVlKGNtc1BpcGVsaW5lKiBsdXQpOworQ01TQVBJIGNtc1BpcGVsaW5lKiAgICAgIENNU0VYUE9SVCBjbXNQaXBlbGluZUR1cChjb25zdCBjbXNQaXBlbGluZSogT3JpZyk7CisKK0NNU0FQSSBjbXNDb250ZXh0ICAgICAgICBDTVNFWFBPUlQgY21zR2V0UGlwZWxpbmVDb250ZXh0SUQoY29uc3QgY21zUGlwZWxpbmUqIGx1dCk7CitDTVNBUEkgY21zVUludDMyTnVtYmVyICAgQ01TRVhQT1JUIGNtc1BpcGVsaW5lSW5wdXRDaGFubmVscyhjb25zdCBjbXNQaXBlbGluZSogbHV0KTsKK0NNU0FQSSBjbXNVSW50MzJOdW1iZXIgICBDTVNFWFBPUlQgY21zUGlwZWxpbmVPdXRwdXRDaGFubmVscyhjb25zdCBjbXNQaXBlbGluZSogbHV0KTsKKworQ01TQVBJIGNtc1VJbnQzMk51bWJlciAgIENNU0VYUE9SVCBjbXNQaXBlbGluZVN0YWdlQ291bnQoY29uc3QgY21zUGlwZWxpbmUqIGx1dCk7CitDTVNBUEkgY21zU3RhZ2UqICAgICAgICAgQ01TRVhQT1JUIGNtc1BpcGVsaW5lR2V0UHRyVG9GaXJzdFN0YWdlKGNvbnN0IGNtc1BpcGVsaW5lKiBsdXQpOworQ01TQVBJIGNtc1N0YWdlKiAgICAgICAgIENNU0VYUE9SVCBjbXNQaXBlbGluZUdldFB0clRvTGFzdFN0YWdlKGNvbnN0IGNtc1BpcGVsaW5lKiBsdXQpOworCitDTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc1BpcGVsaW5lRXZhbDE2KGNvbnN0IGNtc1VJbnQxNk51bWJlciBJbltdLCBjbXNVSW50MTZOdW1iZXIgT3V0W10sIGNvbnN0IGNtc1BpcGVsaW5lKiBsdXQpOworQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNQaXBlbGluZUV2YWxGbG9hdChjb25zdCBjbXNGbG9hdDMyTnVtYmVyIEluW10sIGNtc0Zsb2F0MzJOdW1iZXIgT3V0W10sIGNvbnN0IGNtc1BpcGVsaW5lKiBsdXQpOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNQaXBlbGluZUV2YWxSZXZlcnNlRmxvYXQoY21zRmxvYXQzMk51bWJlciBUYXJnZXRbXSwgY21zRmxvYXQzMk51bWJlciBSZXN1bHRbXSwgY21zRmxvYXQzMk51bWJlciBIaW50W10sIGNvbnN0IGNtc1BpcGVsaW5lKiBsdXQpOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNQaXBlbGluZUNhdChjbXNQaXBlbGluZSogbDEsIGNvbnN0IGNtc1BpcGVsaW5lKiBsMik7CitDTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUIGNtc1BpcGVsaW5lU2V0U2F2ZUFzOGJpdHNGbGFnKGNtc1BpcGVsaW5lKiBsdXQsIGNtc0Jvb2wgT24pOworCisvLyBXaGVyZSB0byBwbGFjZS9sb2NhdGUgdGhlIHN0YWdlcyBpbiB0aGUgcGlwZWxpbmUgY2hhaW4KK3R5cGVkZWYgZW51bSB7IGNtc0FUX0JFR0lOLCBjbXNBVF9FTkQgfSBjbXNTdGFnZUxvYzsKKworQ01TQVBJIGludCAgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNQaXBlbGluZUluc2VydFN0YWdlKGNtc1BpcGVsaW5lKiBsdXQsIGNtc1N0YWdlTG9jIGxvYywgY21zU3RhZ2UqIG1wZSk7CitDTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc1BpcGVsaW5lVW5saW5rU3RhZ2UoY21zUGlwZWxpbmUqIGx1dCwgY21zU3RhZ2VMb2MgbG9jLCBjbXNTdGFnZSoqIG1wZSk7CisKKy8vIFRoaXMgZnVuY3Rpb24gaXMgcXVpdGUgdXNlZnVsIHRvIGFuYWx5emUgdGhlIHN0cnVjdHVyZSBvZiBhIFBpcGVsaW5lIGFuZCByZXRyaWV2ZSB0aGUgU3RhZ2UgZWxlbWVudHMKKy8vIHRoYXQgY29uZm9ybSB0aGUgUGlwZWxpbmUuIEl0IHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgUGlwZWxpbmUsIHRoZSBudW1iZXIgb2YgZXhwZWN0ZWQgZWxlbWVudHMgYW5kCisvLyB0aGVuIGEgbGlzdCBvZiBleHBlY3RlZCB0eXBlcyBmb2xsb3dlZCB3aXRoIGEgbGlzdCBvZiBkb3VibGUgcG9pbnRlcnMgdG8gU3RhZ2UgZWxlbWVudHMuIElmCisvLyB0aGUgZnVuY3Rpb24gZm91bmRzIGEgbWF0Y2ggd2l0aCBjdXJyZW50IHBpcGVsaW5lLCBpdCBmaWxscyB0aGUgcG9pbnRlcnMgYW5kIHJldHVybnMgVFJVRQorLy8gaWYgbm90LCByZXR1cm5zIEZBTFNFIHdpdGhvdXQgdG91Y2hpbmcgYW55dGhpbmcuCitDTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUIGNtc1BpcGVsaW5lQ2hlY2tBbmRSZXRyZWl2ZVN0YWdlcyhjb25zdCBjbXNQaXBlbGluZSogTHV0LCBjbXNVSW50MzJOdW1iZXIgbiwgLi4uKTsKKworLy8gTWF0cml4IGhhcyBkb3VibGUgcHJlY2lzaW9uIGFuZCBDTFVUIGhhcyBvbmx5IGZsb2F0IHByZWNpc2lvbi4gVGhhdCBpcyBiZWNhdXNlIGFuIElDQyBwcm9maWxlIGNhbiBlbmNvZGUKKy8vIG1hdHJpY2VzIHdpdGggZmFyIG1vcmUgcHJlY2lzaW9uIHRoYXQgQ0xVVFMKK0NNU0FQSSBjbXNTdGFnZSogICAgICAgICBDTVNFWFBPUlQgY21zU3RhZ2VBbGxvY0lkZW50aXR5KGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgbkNoYW5uZWxzKTsKK0NNU0FQSSBjbXNTdGFnZSogICAgICAgICBDTVNFWFBPUlQgY21zU3RhZ2VBbGxvY1RvbmVDdXJ2ZXMoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBuQ2hhbm5lbHMsIGNtc1RvbmVDdXJ2ZSogY29uc3QgQ3VydmVzW10pOworQ01TQVBJIGNtc1N0YWdlKiAgICAgICAgIENNU0VYUE9SVCBjbXNTdGFnZUFsbG9jTWF0cml4KGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgUm93cywgY21zVUludDMyTnVtYmVyIENvbHMsIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIqIE1hdHJpeCwgY29uc3QgY21zRmxvYXQ2NE51bWJlciogT2Zmc2V0KTsKKworQ01TQVBJIGNtc1N0YWdlKiAgICAgICAgIENNU0VYUE9SVCBjbXNTdGFnZUFsbG9jQ0x1dDE2Yml0KGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgbkdyaWRQb2ludHMsIGNtc1VJbnQzMk51bWJlciBpbnB1dENoYW4sIGNtc1VJbnQzMk51bWJlciBvdXRwdXRDaGFuLCBjb25zdCBjbXNVSW50MTZOdW1iZXIqIFRhYmxlKTsKK0NNU0FQSSBjbXNTdGFnZSogICAgICAgICBDTVNFWFBPUlQgY21zU3RhZ2VBbGxvY0NMdXRGbG9hdChjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIG5HcmlkUG9pbnRzLCBjbXNVSW50MzJOdW1iZXIgaW5wdXRDaGFuLCBjbXNVSW50MzJOdW1iZXIgb3V0cHV0Q2hhbiwgY29uc3QgY21zRmxvYXQzMk51bWJlciogVGFibGUpOworCitDTVNBUEkgY21zU3RhZ2UqICAgICAgICAgQ01TRVhQT1JUIGNtc1N0YWdlQWxsb2NDTHV0MTZiaXRHcmFudWxhcihjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3QgY21zVUludDMyTnVtYmVyIGNsdXRQb2ludHNbXSwgY21zVUludDMyTnVtYmVyIGlucHV0Q2hhbiwgY21zVUludDMyTnVtYmVyIG91dHB1dENoYW4sIGNvbnN0IGNtc1VJbnQxNk51bWJlciogVGFibGUpOworQ01TQVBJIGNtc1N0YWdlKiAgICAgICAgIENNU0VYUE9SVCBjbXNTdGFnZUFsbG9jQ0x1dEZsb2F0R3JhbnVsYXIoY21zQ29udGV4dCBDb250ZXh0SUQsIGNvbnN0IGNtc1VJbnQzMk51bWJlciBjbHV0UG9pbnRzW10sIGNtc1VJbnQzMk51bWJlciBpbnB1dENoYW4sIGNtc1VJbnQzMk51bWJlciBvdXRwdXRDaGFuLCBjb25zdCBjbXNGbG9hdDMyTnVtYmVyKiBUYWJsZSk7CisKK0NNU0FQSSBjbXNTdGFnZSogICAgICAgICBDTVNFWFBPUlQgY21zU3RhZ2VEdXAoY21zU3RhZ2UqIG1wZSk7CitDTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc1N0YWdlRnJlZShjbXNTdGFnZSogbXBlKTsKK0NNU0FQSSBjbXNTdGFnZSogICAgICAgICBDTVNFWFBPUlQgY21zU3RhZ2VOZXh0KGNvbnN0IGNtc1N0YWdlKiBtcGUpOworCitDTVNBUEkgY21zVUludDMyTnVtYmVyICAgQ01TRVhQT1JUIGNtc1N0YWdlSW5wdXRDaGFubmVscyhjb25zdCBjbXNTdGFnZSogbXBlKTsKK0NNU0FQSSBjbXNVSW50MzJOdW1iZXIgICBDTVNFWFBPUlQgY21zU3RhZ2VPdXRwdXRDaGFubmVscyhjb25zdCBjbXNTdGFnZSogbXBlKTsKK0NNU0FQSSBjbXNTdGFnZVNpZ25hdHVyZSBDTVNFWFBPUlQgY21zU3RhZ2VUeXBlKGNvbnN0IGNtc1N0YWdlKiBtcGUpOworQ01TQVBJIHZvaWQqICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNTdGFnZURhdGEoY29uc3QgY21zU3RhZ2UqIG1wZSk7CisKKy8vIFNhbXBsaW5nCit0eXBlZGVmIGNtc0ludDMyTnVtYmVyICgqY21zU0FNUExFUjE2KShjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQxNk51bWJlciBPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIENhcmdvKTsKKwordHlwZWRlZiBjbXNJbnQzMk51bWJlciAoKmNtc1NBTVBMRVJGTE9BVCkoY29uc3QgY21zRmxvYXQzMk51bWJlciBJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciBPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIENhcmdvKTsKKworLy8gVXNlIHRoaXMgZmxhZyB0byBwcmV2ZW50IGNoYW5nZXMgYmVpbmcgd3JpdHRlbiB0byBkZXN0aW5hdGlvbgorI2RlZmluZSBTQU1QTEVSX0lOU1BFQ1QgICAgIDB4MDEwMDAwMDAKKworLy8gRm9yIENMVVQgb25seQorQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNTdGFnZVNhbXBsZUNMdXQxNmJpdChjbXNTdGFnZSogbXBlLCAgICBjbXNTQU1QTEVSMTYgU2FtcGxlciwgdm9pZCogQ2FyZ28sIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zU3RhZ2VTYW1wbGVDTHV0RmxvYXQoY21zU3RhZ2UqIG1wZSwgY21zU0FNUExFUkZMT0FUIFNhbXBsZXIsIHZvaWQqIENhcmdvLCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncyk7CisKKy8vIFNsaWNlcnMKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zU2xpY2VTcGFjZTE2KGNtc1VJbnQzMk51bWJlciBuSW5wdXRzLCBjb25zdCBjbXNVSW50MzJOdW1iZXIgY2x1dFBvaW50c1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zU0FNUExFUjE2IFNhbXBsZXIsIHZvaWQgKiBDYXJnbyk7CisKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zU2xpY2VTcGFjZUZsb2F0KGNtc1VJbnQzMk51bWJlciBuSW5wdXRzLCBjb25zdCBjbXNVSW50MzJOdW1iZXIgY2x1dFBvaW50c1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zU0FNUExFUkZMT0FUIFNhbXBsZXIsIHZvaWQgKiBDYXJnbyk7CisKKy8vIE11bHRpbG9jYWxpemVkIFVuaWNvZGUgbWFuYWdlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgX2Ntc19NTFVfc3RydWN0IGNtc01MVTsKKworI2RlZmluZSAgY21zTm9MYW5ndWFnZSAiXDBcMCIKKyNkZWZpbmUgIGNtc05vQ291bnRyeSAgIlwwXDAiCisKK0NNU0FQSSBjbXNNTFUqICAgICAgICAgICBDTVNFWFBPUlQgY21zTUxVYWxsb2MoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpOworQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNNTFVmcmVlKGNtc01MVSogbWx1KTsKK0NNU0FQSSBjbXNNTFUqICAgICAgICAgICBDTVNFWFBPUlQgY21zTUxVZHVwKGNvbnN0IGNtc01MVSogbWx1KTsKKworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNNTFVzZXRBU0NJSShjbXNNTFUqIG1sdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBMYW5ndWFnZUNvZGVbM10sIGNvbnN0IGNoYXIgQ291bnRyeUNvZGVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIEFTQ0lJU3RyaW5nKTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zTUxVc2V0V2lkZShjbXNNTFUqIG1sdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBMYW5ndWFnZUNvZGVbM10sIGNvbnN0IGNoYXIgQ291bnRyeUNvZGVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIFdpZGVTdHJpbmcpOworCitDTVNBUEkgY21zVUludDMyTnVtYmVyICAgQ01TRVhQT1JUIGNtc01MVWdldEFTQ0lJKGNvbnN0IGNtc01MVSogbWx1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIExhbmd1YWdlQ29kZVszXSwgY29uc3QgY2hhciBDb3VudHJ5Q29kZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogQnVmZmVyLCAgICBjbXNVSW50MzJOdW1iZXIgQnVmZmVyU2l6ZSk7CisKK0NNU0FQSSBjbXNVSW50MzJOdW1iZXIgICBDTVNFWFBPUlQgY21zTUxVZ2V0V2lkZShjb25zdCBjbXNNTFUqIG1sdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIExhbmd1YWdlQ29kZVszXSwgY29uc3QgY2hhciBDb3VudHJ5Q29kZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90KiBCdWZmZXIsIGNtc1VJbnQzMk51bWJlciBCdWZmZXJTaXplKTsKKworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNNTFVnZXRUcmFuc2xhdGlvbihjb25zdCBjbXNNTFUqIG1sdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgTGFuZ3VhZ2VDb2RlWzNdLCBjb25zdCBjaGFyIENvdW50cnlDb2RlWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBPYnRhaW5lZExhbmd1YWdlWzNdLCBjaGFyIE9idGFpbmVkQ291bnRyeVszXSk7CisKK0NNU0FQSSBjbXNVSW50MzJOdW1iZXIgICBDTVNFWFBPUlQgY21zTUxVdHJhbnNsYXRpb25zQ291bnQoY29uc3QgY21zTUxVKiBtbHUpOworCitDTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUIGNtc01MVXRyYW5zbGF0aW9uc0NvZGVzKGNvbnN0IGNtc01MVSogbWx1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBMYW5ndWFnZUNvZGVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBDb3VudHJ5Q29kZVszXSk7CisgCisvLyBVbmRlcmNvbG9ycmVtb3ZhbCAmIGJsYWNrIGdlbmVyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgIGNtc1RvbmVDdXJ2ZSogVWNyOworICAgICAgICBjbXNUb25lQ3VydmUqIEJnOworICAgICAgICBjbXNNTFUqICAgICAgIERlc2M7CisKK30gY21zVWNyQmc7CisKKy8vIFNjcmVlbmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgY21zUFJJTlRFUl9ERUZBVUxUX1NDUkVFTlMgICAgIDB4MDAwMQorI2RlZmluZSBjbXNGUkVRVUVOQ0VfVU5JVFNfTElORVNfQ00gICAgMHgwMDAwCisjZGVmaW5lIGNtc0ZSRVFVRU5DRV9VTklUU19MSU5FU19JTkNIICAweDAwMDIKKworI2RlZmluZSBjbXNTUE9UX1VOS05PV04gICAgICAgICAwCisjZGVmaW5lIGNtc1NQT1RfUFJJTlRFUl9ERUZBVUxUIDEKKyNkZWZpbmUgY21zU1BPVF9ST1VORCAgICAgICAgICAgMgorI2RlZmluZSBjbXNTUE9UX0RJQU1PTkQgICAgICAgICAzCisjZGVmaW5lIGNtc1NQT1RfRUxMSVBTRSAgICAgICAgIDQKKyNkZWZpbmUgY21zU1BPVF9MSU5FICAgICAgICAgICAgNQorI2RlZmluZSBjbXNTUE9UX1NRVUFSRSAgICAgICAgICA2CisjZGVmaW5lIGNtc1NQT1RfQ1JPU1MgICAgICAgICAgIDcKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNtc0Zsb2F0NjROdW1iZXIgIEZyZXF1ZW5jeTsKKyAgICBjbXNGbG9hdDY0TnVtYmVyICBTY3JlZW5BbmdsZTsKKyAgICBjbXNVSW50MzJOdW1iZXIgICBTcG90U2hhcGU7CisKK30gY21zU2NyZWVuaW5nQ2hhbm5lbDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNtc1VJbnQzMk51bWJlciBGbGFnOworICAgIGNtc1VJbnQzMk51bWJlciBuQ2hhbm5lbHM7CisgICAgY21zU2NyZWVuaW5nQ2hhbm5lbCBDaGFubmVsc1tjbXNNQVhDSEFOTkVMU107CisKK30gY21zU2NyZWVuaW5nOworCisKKy8vIE5hbWVkIGNvbG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3R5cGVkZWYgc3RydWN0IF9jbXNfTkFNRURDT0xPUkxJU1Rfc3RydWN0IGNtc05BTUVEQ09MT1JMSVNUOworCitDTVNBUEkgY21zTkFNRURDT0xPUkxJU1QqIENNU0VYUE9SVCBjbXNBbGxvY05hbWVkQ29sb3JMaXN0KGNtc0NvbnRleHQgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIENvbG9yYW50Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIFByZWZpeCwgY29uc3QgY2hhciogU3VmZml4KTsKKworQ01TQVBJIHZvaWQgICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zRnJlZU5hbWVkQ29sb3JMaXN0KGNtc05BTUVEQ09MT1JMSVNUKiB2KTsKK0NNU0FQSSBjbXNOQU1FRENPTE9STElTVCogQ01TRVhQT1JUIGNtc0R1cE5hbWVkQ29sb3JMaXN0KGNvbnN0IGNtc05BTUVEQ09MT1JMSVNUKiB2KTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0FwcGVuZE5hbWVkQ29sb3IoY21zTkFNRURDT0xPUkxJU1QqIHYsIGNvbnN0IGNoYXIqIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIgUENTWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDE2TnVtYmVyIENvbG9yYW50W2Ntc01BWENIQU5ORUxTXSk7CisKK0NNU0FQSSBjbXNVSW50MzJOdW1iZXIgICAgQ01TRVhQT1JUIGNtc05hbWVkQ29sb3JDb3VudChjb25zdCBjbXNOQU1FRENPTE9STElTVCogdik7CitDTVNBUEkgY21zSW50MzJOdW1iZXIgICAgIENNU0VYUE9SVCBjbXNOYW1lZENvbG9ySW5kZXgoY29uc3QgY21zTkFNRURDT0xPUkxJU1QqIHYsIGNvbnN0IGNoYXIqIE5hbWUpOworCitDTVNBUEkgY21zQm9vbCAgICAgICAgICAgIENNU0VYUE9SVCBjbXNOYW1lZENvbG9ySW5mbyhjb25zdCBjbXNOQU1FRENPTE9STElTVCogTmFtZWRDb2xvckxpc3QsIGNtc1VJbnQzMk51bWJlciBuQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogU3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDE2TnVtYmVyKiBQQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIqIENvbG9yYW50KTsKKworLy8gUmV0cmlldmUgbmFtZWQgY29sb3IgbGlzdCBmcm9tIHRyYW5zZm9ybQorQ01TQVBJIGNtc05BTUVEQ09MT1JMSVNUKiBDTVNFWFBPUlQgY21zR2V0TmFtZWRDb2xvckxpc3QoY21zSFRSQU5TRk9STSB4Zm9ybSk7CisKKy8vIFByb2ZpbGUgc2VxdWVuY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUHJvZmlsZSBzZXF1ZW5jZSBkZXNjcmlwdG9yLiBTb21lIGZpZWxkcyBjb21lIGZyb20gcHJvZmlsZSBzZXF1ZW5jZSBkZXNjcmlwdG9yIHRhZywgb3RoZXJzCisvLyBjb21lIGZyb20gUHJvZmlsZSBTZXF1ZW5jZSBJZGVudGlmaWVyIFRhZwordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgY21zU2lnbmF0dXJlICAgICAgICAgICBkZXZpY2VNZmc7CisgICAgY21zU2lnbmF0dXJlICAgICAgICAgICBkZXZpY2VNb2RlbDsKKyAgICBjbXNVSW50NjROdW1iZXIgICAgICAgIGF0dHJpYnV0ZXM7CisgICAgY21zVGVjaG5vbG9neVNpZ25hdHVyZSB0ZWNobm9sb2d5OworICAgIGNtc1Byb2ZpbGVJRCAgICAgICAgICAgUHJvZmlsZUlEOworICAgIGNtc01MVSogICAgICAgICAgICAgICAgTWFudWZhY3R1cmVyOworICAgIGNtc01MVSogICAgICAgICAgICAgICAgTW9kZWw7CisgICAgY21zTUxVKiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbjsKKworfSBjbXNQU0VRREVTQzsKKwordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgY21zVUludDMyTnVtYmVyIG47CisgICAgY21zQ29udGV4dCAgICAgIENvbnRleHRJRDsKKyAgICBjbXNQU0VRREVTQyogICAgc2VxOworCit9IGNtc1NFUTsKKworQ01TQVBJIGNtc1NFUSogICAgICAgICAgIENNU0VYUE9SVCBjbXNBbGxvY1Byb2ZpbGVTZXF1ZW5jZURlc2NyaXB0aW9uKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgbik7CitDTVNBUEkgY21zU0VRKiAgICAgICAgICAgQ01TRVhQT1JUIGNtc0R1cFByb2ZpbGVTZXF1ZW5jZURlc2NyaXB0aW9uKGNvbnN0IGNtc1NFUSogcHNlcSk7CitDTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0ZyZWVQcm9maWxlU2VxdWVuY2VEZXNjcmlwdGlvbihjbXNTRVEqIHBzZXEpOworCisvLyBEaWN0aW9uYXJpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgX2Ntc0RJQ1RlbnRyeV9zdHJ1Y3QgeworCisgICAgc3RydWN0IF9jbXNESUNUZW50cnlfc3RydWN0KiBOZXh0OworCisgICAgY21zTUxVICpEaXNwbGF5TmFtZTsKKyAgICBjbXNNTFUgKkRpc3BsYXlWYWx1ZTsKKyAgICB3Y2hhcl90KiBOYW1lOworICAgIHdjaGFyX3QqIFZhbHVlOworCit9IGNtc0RJQ1RlbnRyeTsKKworQ01TQVBJIGNtc0hBTkRMRSAgICAgICAgICAgQ01TRVhQT1JUIGNtc0RpY3RBbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCk7CitDTVNBUEkgdm9pZCAgICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zRGljdEZyZWUoY21zSEFORExFIGhEaWN0KTsKK0NNU0FQSSBjbXNIQU5ETEUgICAgICAgICAgIENNU0VYUE9SVCBjbXNEaWN0RHVwKGNtc0hBTkRMRSBoRGljdCk7CisKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNEaWN0QWRkRW50cnkoY21zSEFORExFIGhEaWN0LCBjb25zdCB3Y2hhcl90KiBOYW1lLCBjb25zdCB3Y2hhcl90KiBWYWx1ZSwgY29uc3QgY21zTUxVICpEaXNwbGF5TmFtZSwgY29uc3QgY21zTUxVICpEaXNwbGF5VmFsdWUpOworQ01TQVBJIGNvbnN0IGNtc0RJQ1RlbnRyeSogQ01TRVhQT1JUIGNtc0RpY3RHZXRFbnRyeUxpc3QoY21zSEFORExFIGhEaWN0KTsKK0NNU0FQSSBjb25zdCBjbXNESUNUZW50cnkqIENNU0VYUE9SVCBjbXNEaWN0TmV4dEVudHJ5KGNvbnN0IGNtc0RJQ1RlbnRyeSogZSk7CisKKy8vIEFjY2VzcyB0byBQcm9maWxlIGRhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgIENNU0VYUE9SVCBjbXNDcmVhdGVQcm9maWxlUGxhY2Vob2xkZXIoY21zQ29udGV4dCBDb250ZXh0SUQpOworCitDTVNBUEkgY21zQ29udGV4dCAgICAgICAgQ01TRVhQT1JUIGNtc0dldFByb2ZpbGVDb250ZXh0SUQoY21zSFBST0ZJTEUgaFByb2ZpbGUpOworQ01TQVBJIGNtc0ludDMyTnVtYmVyICAgIENNU0VYUE9SVCBjbXNHZXRUYWdDb3VudChjbXNIUFJPRklMRSBoUHJvZmlsZSk7CitDTVNBUEkgY21zVGFnU2lnbmF0dXJlICAgQ01TRVhQT1JUIGNtc0dldFRhZ1NpZ25hdHVyZShjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVUludDMyTnVtYmVyIG4pOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNJc1RhZyhjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVGFnU2lnbmF0dXJlIHNpZyk7CisKKy8vIFJlYWQgYW5kIHdyaXRlIHByZS1mb3JtYXR0ZWQgZGF0YQorQ01TQVBJIHZvaWQqICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNSZWFkVGFnKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNUYWdTaWduYXR1cmUgc2lnKTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zV3JpdGVUYWcoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1RhZ1NpZ25hdHVyZSBzaWcsIGNvbnN0IHZvaWQqIGRhdGEpOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNMaW5rVGFnKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNUYWdTaWduYXR1cmUgc2lnLCBjbXNUYWdTaWduYXR1cmUgZGVzdCk7CitDTVNBUEkgY21zVGFnU2lnbmF0dXJlICAgQ01TRVhQT1JUIGNtc1RhZ0xpbmtlZFRvKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNUYWdTaWduYXR1cmUgc2lnKTsKKworLy8gUmVhZCBhbmQgd3JpdGUgcmF3IGRhdGEKK0NNU0FQSSBjbXNJbnQzMk51bWJlciAgICBDTVNFWFBPUlQgY21zUmVhZFJhd1RhZyhjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVGFnU2lnbmF0dXJlIHNpZywgdm9pZCogQnVmZmVyLCBjbXNVSW50MzJOdW1iZXIgQnVmZmVyU2l6ZSk7CitDTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUIGNtc1dyaXRlUmF3VGFnKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNUYWdTaWduYXR1cmUgc2lnLCBjb25zdCB2b2lkKiBkYXRhLCBjbXNVSW50MzJOdW1iZXIgU2l6ZSk7CisKKy8vIEFjY2VzcyBoZWFkZXIgZGF0YQorI2RlZmluZSBjbXNFbWJlZGRlZFByb2ZpbGVGYWxzZSAgICAweDAwMDAwMDAwCisjZGVmaW5lIGNtc0VtYmVkZGVkUHJvZmlsZVRydWUgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgY21zVXNlQW55d2hlcmUgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBjbXNVc2VXaXRoRW1iZWRkZWREYXRhT25seSAweDAwMDAwMDAyCisKK0NNU0FQSSBjbXNVSW50MzJOdW1iZXIgICBDTVNFWFBPUlQgY21zR2V0SGVhZGVyRmxhZ3MoY21zSFBST0ZJTEUgaFByb2ZpbGUpOworQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNHZXRIZWFkZXJBdHRyaWJ1dGVzKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50NjROdW1iZXIqIEZsYWdzKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zR2V0SGVhZGVyUHJvZmlsZUlEKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50OE51bWJlciogUHJvZmlsZUlEKTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zR2V0SGVhZGVyQ3JlYXRpb25EYXRlVGltZShjbXNIUFJPRklMRSBoUHJvZmlsZSwgc3RydWN0IHRtICpEZXN0KTsKK0NNU0FQSSBjbXNVSW50MzJOdW1iZXIgICBDTVNFWFBPUlQgY21zR2V0SGVhZGVyUmVuZGVyaW5nSW50ZW50KGNtc0hQUk9GSUxFIGhQcm9maWxlKTsKKworQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNTZXRIZWFkZXJGbGFncyhjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVUludDMyTnVtYmVyIEZsYWdzKTsKK0NNU0FQSSBjbXNVSW50MzJOdW1iZXIgICBDTVNFWFBPUlQgY21zR2V0SGVhZGVyTWFudWZhY3R1cmVyKGNtc0hQUk9GSUxFIGhQcm9maWxlKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zU2V0SGVhZGVyTWFudWZhY3R1cmVyKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50MzJOdW1iZXIgbWFudWZhY3R1cmVyKTsKK0NNU0FQSSBjbXNVSW50MzJOdW1iZXIgICBDTVNFWFBPUlQgY21zR2V0SGVhZGVyQ3JlYXRvcihjbXNIUFJPRklMRSBoUHJvZmlsZSk7CitDTVNBUEkgY21zVUludDMyTnVtYmVyICAgQ01TRVhQT1JUIGNtc0dldEhlYWRlck1vZGVsKGNtc0hQUk9GSUxFIGhQcm9maWxlKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zU2V0SGVhZGVyTW9kZWwoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBtb2RlbCk7CitDTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc1NldEhlYWRlckF0dHJpYnV0ZXMoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQ2NE51bWJlciBGbGFncyk7CitDTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc1NldEhlYWRlclByb2ZpbGVJRChjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVUludDhOdW1iZXIqIFByb2ZpbGVJRCk7CitDTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc1NldEhlYWRlclJlbmRlcmluZ0ludGVudChjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVUludDMyTnVtYmVyIFJlbmRlcmluZ0ludGVudCk7CisKK0NNU0FQSSBjbXNDb2xvclNwYWNlU2lnbmF0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0dldFBDUyhjbXNIUFJPRklMRSBoUHJvZmlsZSk7CitDTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc1NldFBDUyhjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBwY3MpOworQ01TQVBJIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zR2V0Q29sb3JTcGFjZShjbXNIUFJPRklMRSBoUHJvZmlsZSk7CitDTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc1NldENvbG9yU3BhY2UoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgc2lnKTsKK0NNU0FQSSBjbXNQcm9maWxlQ2xhc3NTaWduYXR1cmUKKyAgICAgICAgICAgICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zR2V0RGV2aWNlQ2xhc3MoY21zSFBST0ZJTEUgaFByb2ZpbGUpOworQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNTZXREZXZpY2VDbGFzcyhjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zUHJvZmlsZUNsYXNzU2lnbmF0dXJlIHNpZyk7CitDTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc1NldFByb2ZpbGVWZXJzaW9uKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNGbG9hdDY0TnVtYmVyIFZlcnNpb24pOworQ01TQVBJIGNtc0Zsb2F0NjROdW1iZXIgIENNU0VYUE9SVCBjbXNHZXRQcm9maWxlVmVyc2lvbihjbXNIUFJPRklMRSBoUHJvZmlsZSk7CisKK0NNU0FQSSBjbXNVSW50MzJOdW1iZXIgICBDTVNFWFBPUlQgY21zR2V0RW5jb2RlZElDQ3ZlcnNpb24oY21zSFBST0ZJTEUgaFByb2ZpbGUpOworQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNTZXRFbmNvZGVkSUNDdmVyc2lvbihjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVUludDMyTnVtYmVyIFZlcnNpb24pOworCisvLyBIb3cgcHJvZmlsZXMgbWF5IGJlIHVzZWQKKyNkZWZpbmUgTENNU19VU0VEX0FTX0lOUFVUICAgICAgMAorI2RlZmluZSBMQ01TX1VTRURfQVNfT1VUUFVUICAgICAxCisjZGVmaW5lIExDTVNfVVNFRF9BU19QUk9PRiAgICAgIDIKKworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNJc0ludGVudFN1cHBvcnRlZChjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVUludDMyTnVtYmVyIEludGVudCwgY21zVUludDMyTnVtYmVyIFVzZWREaXJlY3Rpb24pOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNJc01hdHJpeFNoYXBlcihjbXNIUFJPRklMRSBoUHJvZmlsZSk7CitDTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUIGNtc0lzQ0xVVChjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVUludDMyTnVtYmVyIEludGVudCwgY21zVUludDMyTnVtYmVyIFVzZWREaXJlY3Rpb24pOworCisvLyBUcmFuc2xhdGUgZm9ybS90byBvdXIgbm90YXRpb24gdG8gSUNDCitDTVNBUEkgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSAgIENNU0VYUE9SVCBfY21zSUNDY29sb3JTcGFjZShpbnQgT3VyTm90YXRpb24pOworQ01TQVBJIGludCAgICAgICAgICAgICAgICAgICAgICBDTVNFWFBPUlQgX2Ntc0xDTVNjb2xvclNwYWNlKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgUHJvZmlsZVNwYWNlKTsKKworQ01TQVBJIGNtc1VJbnQzMk51bWJlciAgIENNU0VYUE9SVCBjbXNDaGFubmVsc09mKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgQ29sb3JTcGFjZSk7CisKKy8vIEJ1aWxkIGEgc3VpdGFibGUgZm9ybWF0dGVyIGZvciB0aGUgY29sb3JzcGFjZSBvZiB0aGlzIHByb2ZpbGUuIG5CeXRlcz0xIG1lYW5zIDggYml0cywgbkJ5dGVzPTIgbWVhbnMgMTYgYml0cy4gCitDTVNBUEkgY21zVUludDMyTnVtYmVyICAgQ01TRVhQT1JUIGNtc0Zvcm1hdHRlckZvckNvbG9yc3BhY2VPZlByb2ZpbGUoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBuQnl0ZXMsIGNtc0Jvb2wgbElzRmxvYXQpOworQ01TQVBJIGNtc1VJbnQzMk51bWJlciAgIENNU0VYUE9SVCBjbXNGb3JtYXR0ZXJGb3JQQ1NPZlByb2ZpbGUoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBuQnl0ZXMsIGNtc0Jvb2wgbElzRmxvYXQpOworCisKKy8vIExvY2FsaXplZCBpbmZvCit0eXBlZGVmIGVudW0geworICAgICAgICAgICAgIGNtc0luZm9EZXNjcmlwdGlvbiAgPSAwLAorICAgICAgICAgICAgIGNtc0luZm9NYW51ZmFjdHVyZXIgPSAxLAorICAgICAgICAgICAgIGNtc0luZm9Nb2RlbCAgICAgICAgPSAyLAorICAgICAgICAgICAgIGNtc0luZm9Db3B5cmlnaHQgICAgPSAzCit9IGNtc0luZm9UeXBlOworCitDTVNBUEkgY21zVUludDMyTnVtYmVyICAgQ01TRVhQT1JUIGNtc0dldFByb2ZpbGVJbmZvKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNJbmZvVHlwZSBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBMYW5ndWFnZUNvZGVbM10sIGNvbnN0IGNoYXIgQ291bnRyeUNvZGVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90KiBCdWZmZXIsIGNtc1VJbnQzMk51bWJlciBCdWZmZXJTaXplKTsKKworQ01TQVBJIGNtc1VJbnQzMk51bWJlciAgIENNU0VYUE9SVCBjbXNHZXRQcm9maWxlSW5mb0FTQ0lJKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNJbmZvVHlwZSBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBMYW5ndWFnZUNvZGVbM10sIGNvbnN0IGNoYXIgQ291bnRyeUNvZGVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBCdWZmZXIsIGNtc1VJbnQzMk51bWJlciBCdWZmZXJTaXplKTsKKworLy8gSU8gaGFuZGxlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCBfY21zX2lvX2hhbmRsZXIgY21zSU9IQU5ETEVSOworCitDTVNBUEkgY21zSU9IQU5ETEVSKiAgICAgQ01TRVhQT1JUIGNtc09wZW5JT2hhbmRsZXJGcm9tRmlsZShjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3QgY2hhciogRmlsZU5hbWUsIGNvbnN0IGNoYXIqIEFjY2Vzc01vZGUpOworQ01TQVBJIGNtc0lPSEFORExFUiogICAgIENNU0VYUE9SVCBjbXNPcGVuSU9oYW5kbGVyRnJvbVN0cmVhbShjbXNDb250ZXh0IENvbnRleHRJRCwgRklMRSogU3RyZWFtKTsKK0NNU0FQSSBjbXNJT0hBTkRMRVIqICAgICBDTVNFWFBPUlQgY21zT3BlbklPaGFuZGxlckZyb21NZW0oY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQgKkJ1ZmZlciwgY21zVUludDMyTnVtYmVyIHNpemUsIGNvbnN0IGNoYXIqIEFjY2Vzc01vZGUpOworQ01TQVBJIGNtc0lPSEFORExFUiogICAgIENNU0VYUE9SVCBjbXNPcGVuSU9oYW5kbGVyRnJvbU5VTEwoY21zQ29udGV4dCBDb250ZXh0SUQpOworQ01TQVBJIGNtc0lPSEFORExFUiogICAgIENNU0VYUE9SVCBjbXNHZXRQcm9maWxlSU9oYW5kbGVyKGNtc0hQUk9GSUxFIGhQcm9maWxlKTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zQ2xvc2VJT2hhbmRsZXIoY21zSU9IQU5ETEVSKiBpbyk7CisKKy8vIE1ENSBtZXNzYWdlIGRpZ2VzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitDTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUIGNtc01ENWNvbXB1dGVJRChjbXNIUFJPRklMRSBoUHJvZmlsZSk7CisKKy8vIFByb2ZpbGUgaGlnaCBsZXZlbCBmdW50aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc09wZW5Qcm9maWxlRnJvbUZpbGUoY29uc3QgY2hhciAqSUNDUHJvZmlsZSwgY29uc3QgY2hhciAqc0FjY2Vzcyk7CitDTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zT3BlblByb2ZpbGVGcm9tRmlsZVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3QgY2hhciAqSUNDUHJvZmlsZSwgY29uc3QgY2hhciAqc0FjY2Vzcyk7CitDTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zT3BlblByb2ZpbGVGcm9tU3RyZWFtKEZJTEUqIElDQ1Byb2ZpbGUsIGNvbnN0IGNoYXIqIHNBY2Nlc3MpOworQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc09wZW5Qcm9maWxlRnJvbVN0cmVhbVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwgRklMRSogSUNDUHJvZmlsZSwgY29uc3QgY2hhciogc0FjY2Vzcyk7CitDTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zT3BlblByb2ZpbGVGcm9tTWVtKGNvbnN0IHZvaWQgKiBNZW1QdHIsIGNtc1VJbnQzMk51bWJlciBkd1NpemUpOworQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc09wZW5Qcm9maWxlRnJvbU1lbVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3Qgdm9pZCAqIE1lbVB0ciwgY21zVUludDMyTnVtYmVyIGR3U2l6ZSk7CitDTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zT3BlblByb2ZpbGVGcm9tSU9oYW5kbGVyVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNJT0hBTkRMRVIqIGlvKTsKK0NNU0FQSSBjbXNIUFJPRklMRSAgICAgIENNU0VYUE9SVCBjbXNPcGVuUHJvZmlsZUZyb21JT2hhbmRsZXIyVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNCb29sIHdyaXRlKTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgIENNU0VYUE9SVCBjbXNDbG9zZVByb2ZpbGUoY21zSFBST0ZJTEUgaFByb2ZpbGUpOworCitDTVNBUEkgY21zQm9vbCAgICAgICAgICBDTVNFWFBPUlQgY21zU2F2ZVByb2ZpbGVUb0ZpbGUoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNvbnN0IGNoYXIqIEZpbGVOYW1lKTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgIENNU0VYUE9SVCBjbXNTYXZlUHJvZmlsZVRvU3RyZWFtKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBGSUxFKiBTdHJlYW0pOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgQ01TRVhQT1JUIGNtc1NhdmVQcm9maWxlVG9NZW0oY21zSFBST0ZJTEUgaFByb2ZpbGUsIHZvaWQgKk1lbVB0ciwgY21zVUludDMyTnVtYmVyKiBCeXRlc05lZWRlZCk7CitDTVNBUEkgY21zVUludDMyTnVtYmVyICBDTVNFWFBPUlQgY21zU2F2ZVByb2ZpbGVUb0lPaGFuZGxlcihjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zSU9IQU5ETEVSKiBpbyk7CisKKy8vIFByZWRlZmluZWQgdmlydHVhbCBwcm9maWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZVJHQlByb2ZpbGVUSFIoY21zQ29udGV4dCBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNDSUV4eVkqIFdoaXRlUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNDSUV4eVlUUklQTEUqIFByaW1hcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1RvbmVDdXJ2ZSogY29uc3QgVHJhbnNmZXJGdW5jdGlvblszXSk7CisKK0NNU0FQSSBjbXNIUFJPRklMRSAgICAgIENNU0VYUE9SVCBjbXNDcmVhdGVSR0JQcm9maWxlKGNvbnN0IGNtc0NJRXh5WSogV2hpdGVQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0NJRXh5WVRSSVBMRSogUHJpbWFyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVG9uZUN1cnZlKiBjb25zdCBUcmFuc2ZlckZ1bmN0aW9uWzNdKTsKKworQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZUdyYXlQcm9maWxlVEhSKGNtc0NvbnRleHQgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0NJRXh5WSogV2hpdGVQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNUb25lQ3VydmUqIFRyYW5zZmVyRnVuY3Rpb24pOworCitDTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zQ3JlYXRlR3JheVByb2ZpbGUoY29uc3QgY21zQ0lFeHlZKiBXaGl0ZVBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1RvbmVDdXJ2ZSogVHJhbnNmZXJGdW5jdGlvbik7CisKK0NNU0FQSSBjbXNIUFJPRklMRSAgICAgIENNU0VYUE9SVCBjbXNDcmVhdGVMaW5lYXJpemF0aW9uRGV2aWNlTGlua1RIUihjbXNDb250ZXh0IENvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVG9uZUN1cnZlKiBjb25zdCBUcmFuc2ZlckZ1bmN0aW9uc1tdKTsKKworQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZUxpbmVhcml6YXRpb25EZXZpY2VMaW5rKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgQ29sb3JTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNUb25lQ3VydmUqIGNvbnN0IFRyYW5zZmVyRnVuY3Rpb25zW10pOworCitDTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zQ3JlYXRlSW5rTGltaXRpbmdEZXZpY2VMaW5rVEhSKGNtc0NvbnRleHQgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2UsIGNtc0Zsb2F0NjROdW1iZXIgTGltaXQpOworCitDTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zQ3JlYXRlSW5rTGltaXRpbmdEZXZpY2VMaW5rKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgQ29sb3JTcGFjZSwgY21zRmxvYXQ2NE51bWJlciBMaW1pdCk7CisKKworQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZUxhYjJQcm9maWxlVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCBjbXNDSUV4eVkqIFdoaXRlUG9pbnQpOworQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZUxhYjJQcm9maWxlKGNvbnN0IGNtc0NJRXh5WSogV2hpdGVQb2ludCk7CitDTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zQ3JlYXRlTGFiNFByb2ZpbGVUSFIoY21zQ29udGV4dCBDb250ZXh0SUQsIGNvbnN0IGNtc0NJRXh5WSogV2hpdGVQb2ludCk7CitDTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zQ3JlYXRlTGFiNFByb2ZpbGUoY29uc3QgY21zQ0lFeHlZKiBXaGl0ZVBvaW50KTsKKworQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZVhZWlByb2ZpbGVUSFIoY21zQ29udGV4dCBDb250ZXh0SUQpOworQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZVhZWlByb2ZpbGUodm9pZCk7CisKK0NNU0FQSSBjbXNIUFJPRklMRSAgICAgIENNU0VYUE9SVCBjbXNDcmVhdGVfc1JHQlByb2ZpbGVUSFIoY21zQ29udGV4dCBDb250ZXh0SUQpOworQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZV9zUkdCUHJvZmlsZSh2b2lkKTsKKworQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZUJDSFNXYWJzdHJhY3RQcm9maWxlVEhSKGNtc0NvbnRleHQgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuTFVUUG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgQnJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgQ29udHJhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBIdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBTYXR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBUZW1wU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBUZW1wRGVzdCk7CisKK0NNU0FQSSBjbXNIUFJPRklMRSAgICAgIENNU0VYUE9SVCBjbXNDcmVhdGVCQ0hTV2Fic3RyYWN0UHJvZmlsZShpbnQgbkxVVFBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEJyaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIENvbnRyYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgSHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgU2F0dXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgVGVtcFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgVGVtcERlc3QpOworCitDTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zQ3JlYXRlTlVMTFByb2ZpbGVUSFIoY21zQ29udGV4dCBDb250ZXh0SUQpOworQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZU5VTExQcm9maWxlKHZvaWQpOworCisvLyBDb252ZXJ0cyBhIHRyYW5zZm9ybSB0byBhIGRldmljZWxpbmsgcHJvZmlsZQorQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc1RyYW5zZm9ybTJEZXZpY2VMaW5rKGNtc0hUUkFOU0ZPUk0gaFRyYW5zZm9ybSwgY21zRmxvYXQ2NE51bWJlciBWZXJzaW9uLCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncyk7CisKKy8vIEludGVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBJQ0MgSW50ZW50cworI2RlZmluZSBJTlRFTlRfUEVSQ0VQVFVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQyAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIElOVEVOVF9TQVRVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBJTlRFTlRfQUJTT0xVVEVfQ09MT1JJTUVUUklDICAgICAgICAgICAgICAgICAgIDMKKworLy8gTm9uLUlDQyBpbnRlbnRzCisjZGVmaW5lIElOVEVOVF9QUkVTRVJWRV9LX09OTFlfUEVSQ0VQVFVBTCAgICAgICAgICAgICAxMAorI2RlZmluZSBJTlRFTlRfUFJFU0VSVkVfS19PTkxZX1JFTEFUSVZFX0NPTE9SSU1FVFJJQyAgMTEKKyNkZWZpbmUgSU5URU5UX1BSRVNFUlZFX0tfT05MWV9TQVRVUkFUSU9OICAgICAgICAgICAgIDEyCisjZGVmaW5lIElOVEVOVF9QUkVTRVJWRV9LX1BMQU5FX1BFUkNFUFRVQUwgICAgICAgICAgICAxMworI2RlZmluZSBJTlRFTlRfUFJFU0VSVkVfS19QTEFORV9SRUxBVElWRV9DT0xPUklNRVRSSUMgMTQKKyNkZWZpbmUgSU5URU5UX1BSRVNFUlZFX0tfUExBTkVfU0FUVVJBVElPTiAgICAgICAgICAgIDE1CisKKy8vIENhbGwgd2l0aCBOVUxMIGFzIHBhcmFtZXRlcnMgdG8gZ2V0IHRoZSBpbnRlbnQgY291bnQKK0NNU0FQSSBjbXNVSW50MzJOdW1iZXIgIENNU0VYUE9SVCBjbXNHZXRTdXBwb3J0ZWRJbnRlbnRzKGNtc1VJbnQzMk51bWJlciBuTWF4LCBjbXNVSW50MzJOdW1iZXIqIENvZGVzLCBjaGFyKiogRGVzY3JpcHRpb25zKTsKK0NNU0FQSSBjbXNVSW50MzJOdW1iZXIgIENNU0VYUE9SVCBjbXNHZXRTdXBwb3J0ZWRJbnRlbnRzVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgbk1heCwgY21zVUludDMyTnVtYmVyKiBDb2RlcywgY2hhcioqIERlc2NyaXB0aW9ucyk7CisKKy8vIEZsYWdzCisKKyNkZWZpbmUgY21zRkxBR1NfTk9DQUNIRSAgICAgICAgICAgICAgICAgIDB4MDA0MCAgICAvLyBJbmhpYml0IDEtcGl4ZWwgY2FjaGUKKyNkZWZpbmUgY21zRkxBR1NfTk9PUFRJTUlaRSAgICAgICAgICAgICAgIDB4MDEwMCAgICAvLyBJbmhpYml0IG9wdGltaXphdGlvbnMKKyNkZWZpbmUgY21zRkxBR1NfTlVMTFRSQU5TRk9STSAgICAgICAgICAgIDB4MDIwMCAgICAvLyBEb24ndCB0cmFuc2Zvcm0gYW55d2F5CisKKy8vIFByb29maW5nIGZsYWdzCisjZGVmaW5lIGNtc0ZMQUdTX0dBTVVUQ0hFQ0sgICAgICAgICAgICAgICAweDEwMDAgICAgLy8gT3V0IG9mIEdhbXV0IGFsYXJtCisjZGVmaW5lIGNtc0ZMQUdTX1NPRlRQUk9PRklORyAgICAgICAgICAgICAweDQwMDAgICAgLy8gRG8gc29mdHByb29maW5nCisKKy8vIE1pc2MKKyNkZWZpbmUgY21zRkxBR1NfQkxBQ0tQT0lOVENPTVBFTlNBVElPTiAgIDB4MjAwMAorI2RlZmluZSBjbXNGTEFHU19OT1dISVRFT05XSElURUZJWFVQICAgICAgMHgwMDA0ICAgIC8vIERvbid0IGZpeCBzY3VtIGRvdAorI2RlZmluZSBjbXNGTEFHU19ISUdIUkVTUFJFQ0FMQyAgICAgICAgICAgMHgwNDAwICAgIC8vIFVzZSBtb3JlIG1lbW9yeSB0byBnaXZlIGJldHRlciBhY2N1cmFuY3kKKyNkZWZpbmUgY21zRkxBR1NfTE9XUkVTUFJFQ0FMQyAgICAgICAgICAgIDB4MDgwMCAgICAvLyBVc2UgbGVzcyBtZW1vcnkgdG8gbWluaW1pemUgcmVzb3VjZXMKKworLy8gRm9yIGRldmljZWxpbmsgY3JlYXRpb24KKyNkZWZpbmUgY21zRkxBR1NfOEJJVFNfREVWSUNFTElOSyAgICAgICAgIDB4MDAwOCAgIC8vIENyZWF0ZSA4IGJpdHMgZGV2aWNlbGlua3MKKyNkZWZpbmUgY21zRkxBR1NfR1VFU1NERVZJQ0VDTEFTUyAgICAgICAgIDB4MDAyMCAgIC8vIEd1ZXNzIGRldmljZSBjbGFzcyAoZm9yIHRyYW5zZm9ybTJkZXZpY2VsaW5rKQorI2RlZmluZSBjbXNGTEFHU19LRUVQX1NFUVVFTkNFICAgICAgICAgICAgMHgwMDgwICAgLy8gS2VlcCBwcm9maWxlIHNlcXVlbmNlIGZvciBkZXZpY2VsaW5rIGNyZWF0aW9uCisKKy8vIFNwZWNpZmljIHRvIGEgcGFydGljdWxhciBvcHRpbWl6YXRpb25zCisjZGVmaW5lIGNtc0ZMQUdTX0ZPUkNFX0NMVVQgICAgICAgICAgICAgICAweDAwMDIgICAgLy8gRm9yY2UgQ0xVVCBvcHRpbWl6YXRpb24KKyNkZWZpbmUgY21zRkxBR1NfQ0xVVF9QT1NUX0xJTkVBUklaQVRJT04gIDB4MDAwMSAgICAvLyBjcmVhdGUgcG9zdGxpbmVhcml6YXRpb24gdGFibGVzIGlmIHBvc3NpYmxlCisjZGVmaW5lIGNtc0ZMQUdTX0NMVVRfUFJFX0xJTkVBUklaQVRJT04gICAweDAwMTAgICAgLy8gY3JlYXRlIHByZWxpbmVhcml6YXRpb24gdGFibGVzIGlmIHBvc3NpYmxlCisKKy8vIFNwZWNpZmljIHRvIHVuYm91bmRlZCBtb2RlCisjZGVmaW5lIGNtc0ZMQUdTX05PTkVHQVRJVkVTICAgICAgICAgICAgICAweDgwMDAgICAgLy8gUHJldmVudCBuZWdhdGl2ZSBudW1iZXJzIGluIGZsb2F0aW5nIHBvaW50IHRyYW5zZm9ybXMKKworLy8gQ29weSBhbHBoYSBjaGFubmVscyB3aGVuIHRyYW5zZm9ybWluZyAgICAgICAgICAgCisjZGVmaW5lIGNtc0ZMQUdTX0NPUFlfQUxQSEEgICAgICAgICAgICAgICAweDA0MDAwMDAwIC8vIEFscGhhIGNoYW5uZWxzIGFyZSBjb3BpZWQgb24gY21zRG9UcmFuc2Zvcm0oKQorCisvLyBGaW5lLXR1bmUgY29udHJvbCBvdmVyIG51bWJlciBvZiBncmlkcG9pbnRzCisjZGVmaW5lIGNtc0ZMQUdTX0dSSURQT0lOVFMobikgICAgICAgICAgICgoKG4pICYgMHhGRikgPDwgMTYpCisKKy8vIENSRCBzcGVjaWFsCisjZGVmaW5lIGNtc0ZMQUdTX05PREVGQVVMVFJFU09VUkNFREVGICAgICAweDAxMDAwMDAwCisKKy8vIFRyYW5zZm9ybXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NNU0FQSSBjbXNIVFJBTlNGT1JNICAgIENNU0VYUE9SVCBjbXNDcmVhdGVUcmFuc2Zvcm1USFIoY21zQ29udGV4dCBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFIElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW5wdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFIE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIE91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOworCitDTVNBUEkgY21zSFRSQU5TRk9STSAgICBDTVNFWFBPUlQgY21zQ3JlYXRlVHJhbnNmb3JtKGNtc0hQUk9GSUxFIElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW5wdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFIE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIE91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOworCitDTVNBUEkgY21zSFRSQU5TRk9STSAgICBDTVNFWFBPUlQgY21zQ3JlYXRlUHJvb2ZpbmdUcmFuc2Zvcm1USFIoY21zQ29udGV4dCBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFIElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW5wdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFIE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIE91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgUHJvb2ZpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBQcm9vZmluZ0ludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOworCitDTVNBUEkgY21zSFRSQU5TRk9STSAgICBDTVNFWFBPUlQgY21zQ3JlYXRlUHJvb2ZpbmdUcmFuc2Zvcm0oY21zSFBST0ZJTEUgSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnB1dEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgT3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSBQcm9vZmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFByb29maW5nSW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncyk7CisKK0NNU0FQSSBjbXNIVFJBTlNGT1JNICAgIENNU0VYUE9SVCBjbXNDcmVhdGVNdWx0aXByb2ZpbGVUcmFuc2Zvcm1USFIoY21zQ29udGV4dCBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFIGhQcm9maWxlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgblByb2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW5wdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBPdXRwdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKTsKKworCitDTVNBUEkgY21zSFRSQU5TRk9STSAgICBDTVNFWFBPUlQgY21zQ3JlYXRlTXVsdGlwcm9maWxlVHJhbnNmb3JtKGNtc0hQUk9GSUxFIGhQcm9maWxlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgblByb2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW5wdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBPdXRwdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKTsKKworCitDTVNBUEkgY21zSFRSQU5TRk9STSAgICBDTVNFWFBPUlQgY21zQ3JlYXRlRXh0ZW5kZWRUcmFuc2Zvcm0oY21zQ29udGV4dCBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgblByb2ZpbGVzLCBjbXNIUFJPRklMRSBoUHJvZmlsZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Jvb2wgIEJQQ1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEludGVudHNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgQWRhcHRhdGlvblN0YXRlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgaEdhbXV0UHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuR2FtdXRQQ1Nwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnB1dEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBPdXRwdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncyk7CisKK0NNU0FQSSB2b2lkICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNEZWxldGVUcmFuc2Zvcm0oY21zSFRSQU5TRk9STSBoVHJhbnNmb3JtKTsKKworQ01TQVBJIHZvaWQgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0RvVHJhbnNmb3JtKGNtc0hUUkFOU0ZPUk0gVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKiBJbnB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogT3V0cHV0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTaXplKTsKKworQ01TQVBJIHZvaWQgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0RvVHJhbnNmb3JtU3RyaWRlKGNtc0hUUkFOU0ZPUk0gVHJhbnNmb3JtLCAgIC8vIERlcHJlY2F0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICogSW5wdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIE91dHB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKTsKKworQ01TQVBJIHZvaWQgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0RvVHJhbnNmb3JtTGluZVN0cmlkZShjbXNIVFJBTlNGT1JNICBUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogSW5wdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogT3V0cHV0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBQaXhlbHNQZXJMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBMaW5lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEJ5dGVzUGVyTGluZUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBCeXRlc1BlckxpbmVPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEJ5dGVzUGVyUGxhbmVJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgQnl0ZXNQZXJQbGFuZU91dCk7CisKKworQ01TQVBJIHZvaWQgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc1NldEFsYXJtQ29kZXMoY29uc3QgY21zVUludDE2TnVtYmVyIE5ld0FsYXJtW2Ntc01BWENIQU5ORUxTXSk7CitDTVNBUEkgdm9pZCAgICAgICAgICAgICBDTVNFWFBPUlQgY21zR2V0QWxhcm1Db2RlcyhjbXNVSW50MTZOdW1iZXIgTmV3QWxhcm1bY21zTUFYQ0hBTk5FTFNdKTsKKworCitDTVNBUEkgdm9pZCAgICAgICAgICAgICBDTVNFWFBPUlQgY21zU2V0QWxhcm1Db2Rlc1RIUihjbXNDb250ZXh0IENvbnRleHRJRCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zVUludDE2TnVtYmVyIEFsYXJtQ29kZXNbY21zTUFYQ0hBTk5FTFNdKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNHZXRBbGFybUNvZGVzVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIgQWxhcm1Db2Rlc1tjbXNNQVhDSEFOTkVMU10pOworCisKKworLy8gQWRhcHRhdGlvbiBzdGF0ZSBmb3IgYWJzb2x1dGUgY29sb3JpbWV0cmljIGludGVudAorQ01TQVBJIGNtc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIGNtc1NldEFkYXB0YXRpb25TdGF0ZShjbXNGbG9hdDY0TnVtYmVyIGQpOworQ01TQVBJIGNtc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIGNtc1NldEFkYXB0YXRpb25TdGF0ZVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zRmxvYXQ2NE51bWJlciBkKTsKKworCisKKy8vIEdyYWIgdGhlIENvbnRleHRJRCBmcm9tIGFuIG9wZW4gdHJhbnNmb3JtLiBSZXR1cm5zIE5VTEwgaWYgYSBOVUxMIHRyYW5zZm9ybSBpcyBwYXNzZWQKK0NNU0FQSSBjbXNDb250ZXh0ICAgICAgIENNU0VYUE9SVCBjbXNHZXRUcmFuc2Zvcm1Db250ZXh0SUQoY21zSFRSQU5TRk9STSBoVHJhbnNmb3JtKTsKKworLy8gR3JhYiB0aGUgaW5wdXQvb3V0cHV0IGZvcm1hdHMKK0NNU0FQSSBjbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0dldFRyYW5zZm9ybUlucHV0Rm9ybWF0KGNtc0hUUkFOU0ZPUk0gaFRyYW5zZm9ybSk7CitDTVNBUEkgY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNHZXRUcmFuc2Zvcm1PdXRwdXRGb3JtYXQoY21zSFRSQU5TRk9STSBoVHJhbnNmb3JtKTsKKworLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CitDTVNBUEkgY21zQm9vbCAgICAgICAgICBDTVNFWFBPUlQgY21zQ2hhbmdlQnVmZmVyc0Zvcm1hdChjbXNIVFJBTlNGT1JNIGhUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW5wdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgT3V0cHV0Rm9ybWF0KTsKKworCisKKy8vIFBvc3RTY3JpcHQgQ29sb3JSZW5kZXJpbmdEaWN0aW9uYXJ5IGFuZCBDb2xvclNwYWNlQXJyYXkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIGVudW0geyBjbXNQU19SRVNPVVJDRV9DU0EsIGNtc1BTX1JFU09VUkNFX0NSRCB9IGNtc1BTUmVzb3VyY2VUeXBlOworCisvLyBsY21zMiB1bmlmaWVkIG1ldGhvZCB0byBhY2Nlc3MgcG9zdHNjcmlwdCBjb2xvciByZXNvdXJjZXMKK0NNU0FQSSBjbXNVSW50MzJOdW1iZXIgIENNU0VYUE9SVCBjbXNHZXRQb3N0U2NyaXB0Q29sb3JSZXNvdXJjZShjbXNDb250ZXh0IENvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNQU1Jlc291cmNlVHlwZSBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFIGhQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSU9IQU5ETEVSKiBpbyk7CisKK0NNU0FQSSBjbXNVSW50MzJOdW1iZXIgIENNU0VYUE9SVCBjbXNHZXRQb3N0U2NyaXB0Q1NBKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVUludDMyTnVtYmVyIEludGVudCwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MsIHZvaWQqIEJ1ZmZlciwgY21zVUludDMyTnVtYmVyIGR3QnVmZmVyTGVuKTsKK0NNU0FQSSBjbXNVSW50MzJOdW1iZXIgIENNU0VYUE9SVCBjbXNHZXRQb3N0U2NyaXB0Q1JEKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVUludDMyTnVtYmVyIEludGVudCwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MsIHZvaWQqIEJ1ZmZlciwgY21zVUludDMyTnVtYmVyIGR3QnVmZmVyTGVuKTsKKworCisvLyBJVDguNyAvIENHQVRTLjE3LTIwMHggaGFuZGxpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ01TQVBJIGNtc0hBTkRMRSAgICAgICAgQ01TRVhQT1JUIGNtc0lUOEFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElEKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNJVDhGcmVlKGNtc0hBTkRMRSBoSVQ4KTsKKworLy8gVGFibGVzCitDTVNBUEkgY21zVUludDMyTnVtYmVyICBDTVNFWFBPUlQgY21zSVQ4VGFibGVDb3VudChjbXNIQU5ETEUgaElUOCk7CitDTVNBUEkgY21zSW50MzJOdW1iZXIgICBDTVNFWFBPUlQgY21zSVQ4U2V0VGFibGUoY21zSEFORExFIGhJVDgsIGNtc1VJbnQzMk51bWJlciBuVGFibGUpOworCisvLyBQZXJzaXN0ZW5jZQorQ01TQVBJIGNtc0hBTkRMRSAgICAgICAgQ01TRVhQT1JUIGNtc0lUOExvYWRGcm9tRmlsZShjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3QgY2hhciogY0ZpbGVOYW1lKTsKK0NNU0FQSSBjbXNIQU5ETEUgICAgICAgIENNU0VYUE9SVCBjbXNJVDhMb2FkRnJvbU1lbShjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbGVuKTsKKy8vIENNU0FQSSBjbXNIQU5ETEUgICAgICAgIENNU0VYUE9SVCBjbXNJVDhMb2FkRnJvbUlPaGFuZGxlcihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zSU9IQU5ETEVSKiBpbyk7CisKK0NNU0FQSSBjbXNCb29sICAgICAgICAgIENNU0VYUE9SVCBjbXNJVDhTYXZlVG9GaWxlKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBjRmlsZU5hbWUpOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgQ01TRVhQT1JUIGNtc0lUOFNhdmVUb01lbShjbXNIQU5ETEUgaElUOCwgdm9pZCAqTWVtUHRyLCBjbXNVSW50MzJOdW1iZXIqIEJ5dGVzTmVlZGVkKTsKKworLy8gUHJvcGVydGllcworQ01TQVBJIGNvbnN0IGNoYXIqICAgICAgQ01TRVhQT1JUIGNtc0lUOEdldFNoZWV0VHlwZShjbXNIQU5ETEUgaElUOCk7CitDTVNBUEkgY21zQm9vbCAgICAgICAgICBDTVNFWFBPUlQgY21zSVQ4U2V0U2hlZXRUeXBlKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBUeXBlKTsKKworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgQ01TRVhQT1JUIGNtc0lUOFNldENvbW1lbnQoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIGNDb21tZW50KTsKKworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgQ01TRVhQT1JUIGNtc0lUOFNldFByb3BlcnR5U3RyKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBjUHJvcCwgY29uc3QgY2hhciAqU3RyKTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgIENNU0VYUE9SVCBjbXNJVDhTZXRQcm9wZXJ0eURibChjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciogY1Byb3AsIGNtc0Zsb2F0NjROdW1iZXIgVmFsKTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgIENNU0VYUE9SVCBjbXNJVDhTZXRQcm9wZXJ0eUhleChjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciogY1Byb3AsIGNtc1VJbnQzMk51bWJlciBWYWwpOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgQ01TRVhQT1JUIGNtc0lUOFNldFByb3BlcnR5TXVsdGkoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIEtleSwgY29uc3QgY2hhciogU3ViS2V5LCBjb25zdCBjaGFyICpCdWZmZXIpOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgQ01TRVhQT1JUIGNtc0lUOFNldFByb3BlcnR5VW5jb29rZWQoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIEtleSwgY29uc3QgY2hhciogQnVmZmVyKTsKKworCitDTVNBUEkgY29uc3QgY2hhciogICAgICBDTVNFWFBPUlQgY21zSVQ4R2V0UHJvcGVydHkoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIGNQcm9wKTsKK0NNU0FQSSBjbXNGbG9hdDY0TnVtYmVyIENNU0VYUE9SVCBjbXNJVDhHZXRQcm9wZXJ0eURibChjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciogY1Byb3ApOworQ01TQVBJIGNvbnN0IGNoYXIqICAgICAgQ01TRVhQT1JUIGNtc0lUOEdldFByb3BlcnR5TXVsdGkoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIEtleSwgY29uc3QgY2hhciAqU3ViS2V5KTsKK0NNU0FQSSBjbXNVSW50MzJOdW1iZXIgIENNU0VYUE9SVCBjbXNJVDhFbnVtUHJvcGVydGllcyhjbXNIQU5ETEUgaElUOCwgY2hhciAqKipQcm9wZXJ0eU5hbWVzKTsKK0NNU0FQSSBjbXNVSW50MzJOdW1iZXIgIENNU0VYUE9SVCBjbXNJVDhFbnVtUHJvcGVydHlNdWx0aShjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciogY1Byb3AsIGNvbnN0IGNoYXIgKioqU3VicHJvcGVydHlOYW1lcyk7CisKKy8vIERhdGFzZXRzCitDTVNBUEkgY29uc3QgY2hhciogICAgICBDTVNFWFBPUlQgY21zSVQ4R2V0RGF0YVJvd0NvbChjbXNIQU5ETEUgaElUOCwgaW50IHJvdywgaW50IGNvbCk7CitDTVNBUEkgY21zRmxvYXQ2NE51bWJlciBDTVNFWFBPUlQgY21zSVQ4R2V0RGF0YVJvd0NvbERibChjbXNIQU5ETEUgaElUOCwgaW50IHJvdywgaW50IGNvbCk7CisKK0NNU0FQSSBjbXNCb29sICAgICAgICAgIENNU0VYUE9SVCBjbXNJVDhTZXREYXRhUm93Q29sKGNtc0hBTkRMRSBoSVQ4LCBpbnQgcm93LCBpbnQgY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogVmFsKTsKKworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgQ01TRVhQT1JUIGNtc0lUOFNldERhdGFSb3dDb2xEYmwoY21zSEFORExFIGhJVDgsIGludCByb3csIGludCBjb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIFZhbCk7CisKK0NNU0FQSSBjb25zdCBjaGFyKiAgICAgIENNU0VYUE9SVCBjbXNJVDhHZXREYXRhKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBjUGF0Y2gsIGNvbnN0IGNoYXIqIGNTYW1wbGUpOworCisKK0NNU0FQSSBjbXNGbG9hdDY0TnVtYmVyIENNU0VYUE9SVCBjbXNJVDhHZXREYXRhRGJsKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBjUGF0Y2gsIGNvbnN0IGNoYXIqIGNTYW1wbGUpOworCitDTVNBUEkgY21zQm9vbCAgICAgICAgICBDTVNFWFBPUlQgY21zSVQ4U2V0RGF0YShjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciogY1BhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY1NhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKlZhbCk7CisKK0NNU0FQSSBjbXNCb29sICAgICAgICAgIENNU0VYUE9SVCBjbXNJVDhTZXREYXRhRGJsKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBjUGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjU2FtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBWYWwpOworCitDTVNBUEkgaW50ICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zSVQ4RmluZERhdGFGb3JtYXQoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIGNTYW1wbGUpOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgQ01TRVhQT1JUIGNtc0lUOFNldERhdGFGb3JtYXQoY21zSEFORExFIGhJVDgsIGludCBuLCBjb25zdCBjaGFyICpTYW1wbGUpOworQ01TQVBJIGludCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0lUOEVudW1EYXRhRm9ybWF0KGNtc0hBTkRMRSBoSVQ4LCBjaGFyICoqKlNhbXBsZU5hbWVzKTsKKworQ01TQVBJIGNvbnN0IGNoYXIqICAgICAgQ01TRVhQT1JUIGNtc0lUOEdldFBhdGNoTmFtZShjbXNIQU5ETEUgaElUOCwgaW50IG5QYXRjaCwgY2hhciogYnVmZmVyKTsKK0NNU0FQSSBpbnQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNJVDhHZXRQYXRjaEJ5TmFtZShjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciAqY1BhdGNoKTsKKworLy8gVGhlIExBQkVMIGV4dGVuc2lvbgorQ01TQVBJIGludCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0lUOFNldFRhYmxlQnlMYWJlbChjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciogY1NldCwgY29uc3QgY2hhciogY0ZpZWxkLCBjb25zdCBjaGFyKiBFeHBlY3RlZFR5cGUpOworCitDTVNBUEkgY21zQm9vbCAgICAgICAgICBDTVNFWFBPUlQgY21zSVQ4U2V0SW5kZXhDb2x1bW4oY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIGNTYW1wbGUpOworCisvLyBGb3JtYXR0ZXIgZm9yIGRvdWJsZQorQ01TQVBJIHZvaWQgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0lUOERlZmluZURibEZvcm1hdChjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciogRm9ybWF0dGVyKTsKKworLy8gR2FtdXQgYm91bmRhcnkgZGVzY3JpcHRpb24gcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NNU0FQSSBjbXNIQU5ETEUgICAgICAgIENNU0VYUE9SVCBjbXNHQkRBbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCk7CitDTVNBUEkgdm9pZCAgICAgICAgICAgICBDTVNFWFBPUlQgY21zR0JERnJlZShjbXNIQU5ETEUgaEdCRCk7CitDTVNBUEkgY21zQm9vbCAgICAgICAgICBDTVNFWFBPUlQgY21zR0RCQWRkUG9pbnQoY21zSEFORExFIGhHQkQsIGNvbnN0IGNtc0NJRUxhYiogTGFiKTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgIENNU0VYUE9SVCBjbXNHREJDb21wdXRlKGNtc0hBTkRMRSAgaEdEQiwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgQ01TRVhQT1JUIGNtc0dEQkNoZWNrUG9pbnQoY21zSEFORExFIGhHQkQsIGNvbnN0IGNtc0NJRUxhYiogTGFiKTsKKworLy8gRmVhdHVyZSBkZXRlY3Rpb24gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRXN0aW1hdGUgdGhlIGJsYWNrIHBvaW50CitDTVNBUEkgY21zQm9vbCAgICAgICAgICBDTVNFWFBPUlQgY21zRGV0ZWN0QmxhY2tQb2ludChjbXNDSUVYWVoqIEJsYWNrUG9pbnQsIGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50MzJOdW1iZXIgSW50ZW50LCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncyk7CitDTVNBUEkgY21zQm9vbCAgICAgICAgICBDTVNFWFBPUlQgY21zRGV0ZWN0RGVzdGluYXRpb25CbGFja1BvaW50KGNtc0NJRVhZWiogQmxhY2tQb2ludCwgY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKTsKKworLy8gRXN0aW1hdGUgdG90YWwgYXJlYSBjb3ZlcmFnZQorQ01TQVBJIGNtc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIGNtc0RldGVjdFRBQyhjbXNIUFJPRklMRSBoUHJvZmlsZSk7CisKKworLy8gUG9vciBtYW4ncyBnYW11dCBtYXBwaW5nCitDTVNBUEkgY21zQm9vbCAgICAgICAgICBDTVNFWFBPUlQgY21zRGVzYXR1cmF0ZUxhYihjbXNDSUVMYWIqIExhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhbWF4LCBkb3VibGUgYW1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBibWF4LCBkb3VibGUgYm1pbik7CisKKyNpZm5kZWYgQ01TX1VTRV9DUFBfQVBJCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9CisjICAgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIF9sY21zMl9ICisjZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvaW5jbHVkZS9sY21zMl9wbHVnaW4uaCBiL3RoaXJkX3BhcnR5L2xjbXMvaW5jbHVkZS9sY21zMl9wbHVnaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWRhMDA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGNtcy9pbmNsdWRlL2xjbXMyX3BsdWdpbi5oCkBAIC0wLDAgKzEsNjY1IEBACisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KKy8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNiBNYXJ0aSBNYXJpYSBTYWd1ZXIKKy8vCisvLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKy8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKy8vIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKy8vIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorLy8gYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlCisvLyBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorLy8KKy8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisvLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKy8vCisvLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKy8vIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTworLy8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKy8vIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKKy8vIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKy8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGlzIHRoZSBwbHVnLWluIGhlYWRlciBmaWxlLiBOb3JtYWwgTGl0dGxlQ01TIGNsaWVudHMgc2hvdWxkIG5vdCB1c2UgaXQuCisvLyBJdCBpcyBwcm92aWRlZCBmb3IgcGx1Zy1pbiB3cml0dGVycyB0aGF0IG1heSB3YW50IHRvIGFjY2VzcyB0aGUgc3VwcG9ydAorLy8gZnVuY3Rpb25zIHRvIGRvIGxvdyBsZXZlbCBvcGVyYXRpb25zLiBBbGwgcGx1Zy1pbiByZWxhdGVkIHN0cnVjdHVyZXMKKy8vIGFyZSBkZWZpbmVkIGhlcmUuIEluY2x1ZGluZyB0aGlzIGZpbGUgZm9yY2VzIHRvIGluY2x1ZGUgdGhlIHN0YW5kYXJkIEFQSSB0b28uCisKKyNpZm5kZWYgX2xjbXNfcGx1Z2luX0gKKworLy8gRGVhbCB3aXRoIE1pY3Jvc29mdCdzIGF0dGVtcHQgYXQgZGVwcmVjYXRpbmcgQyBzdGFuZGFyZCBydW50aW1lIGZ1bmN0aW9ucworI2lmZGVmIF9NU0NfVkVSCisjICAgIGlmIChfTVNDX1ZFUiA+PSAxNDAwKQorIyAgICAgIGlmbmRlZiBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyMgICAgICAgIGRlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyMgICAgICBlbmRpZgorIyAgICAgIGlmbmRlZiBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUworIyAgICAgICAgZGVmaW5lIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCisjICAgICAgZW5kaWYKKyMgICAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIF9sY21zMl9ICisjaW5jbHVkZSAibGNtczIuaCIKKyNlbmRpZgorCisvLyBXZSBuZWVkIHNvbWUgc3RhbmRhcmQgQyBmdW5jdGlvbnMuCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPG1lbW9yeS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisKKyNpZm5kZWYgQ01TX1VTRV9DUFBfQVBJCisjICAgaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworIyAgIGVuZGlmCisjZW5kaWYKKworLy8gVmVjdG9yICYgTWF0cml4IG9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQXhpcyBvZiB0aGUgbWF0cml4L2FycmF5LiBObyBzcGVjaWZpYyBtZWFuaW5nIGF0IGFsbC4KKyNkZWZpbmUgVlggICAgICAwCisjZGVmaW5lIFZZICAgICAgMQorI2RlZmluZSBWWiAgICAgIDIKKworLy8gVmVjdG9ycwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNtc0Zsb2F0NjROdW1iZXIgblszXTsKKworICAgIH0gY21zVkVDMzsKKworLy8gM3gzIE1hdHJpeAordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNtc1ZFQzMgdlszXTsKKworICAgIH0gY21zTUFUMzsKKworQ01TQVBJIHZvaWQgICAgICAgICAgICAgICBDTVNFWFBPUlQgX2Ntc1ZFQzNpbml0KGNtc1ZFQzMqIHIsIGNtc0Zsb2F0NjROdW1iZXIgeCwgY21zRmxvYXQ2NE51bWJlciB5LCBjbXNGbG9hdDY0TnVtYmVyIHopOworQ01TQVBJIHZvaWQgICAgICAgICAgICAgICBDTVNFWFBPUlQgX2Ntc1ZFQzNtaW51cyhjbXNWRUMzKiByLCBjb25zdCBjbXNWRUMzKiBhLCBjb25zdCBjbXNWRUMzKiBiKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICAgQ01TRVhQT1JUIF9jbXNWRUMzY3Jvc3MoY21zVkVDMyogciwgY29uc3QgY21zVkVDMyogdSwgY29uc3QgY21zVkVDMyogdik7CitDTVNBUEkgY21zRmxvYXQ2NE51bWJlciAgIENNU0VYUE9SVCBfY21zVkVDM2RvdChjb25zdCBjbXNWRUMzKiB1LCBjb25zdCBjbXNWRUMzKiB2KTsKK0NNU0FQSSBjbXNGbG9hdDY0TnVtYmVyICAgQ01TRVhQT1JUIF9jbXNWRUMzbGVuZ3RoKGNvbnN0IGNtc1ZFQzMqIGEpOworQ01TQVBJIGNtc0Zsb2F0NjROdW1iZXIgICBDTVNFWFBPUlQgX2Ntc1ZFQzNkaXN0YW5jZShjb25zdCBjbXNWRUMzKiBhLCBjb25zdCBjbXNWRUMzKiBiKTsKKworQ01TQVBJIHZvaWQgICAgICAgICAgICAgICBDTVNFWFBPUlQgX2Ntc01BVDNpZGVudGl0eShjbXNNQVQzKiBhKTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICAgQ01TRVhQT1JUIF9jbXNNQVQzaXNJZGVudGl0eShjb25zdCBjbXNNQVQzKiBhKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICAgQ01TRVhQT1JUIF9jbXNNQVQzcGVyKGNtc01BVDMqIHIsIGNvbnN0IGNtc01BVDMqIGEsIGNvbnN0IGNtc01BVDMqIGIpOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgICBDTVNFWFBPUlQgX2Ntc01BVDNpbnZlcnNlKGNvbnN0IGNtc01BVDMqIGEsIGNtc01BVDMqIGIpOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgICBDTVNFWFBPUlQgX2Ntc01BVDNzb2x2ZShjbXNWRUMzKiB4LCBjbXNNQVQzKiBhLCBjbXNWRUMzKiBiKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICAgQ01TRVhQT1JUIF9jbXNNQVQzZXZhbChjbXNWRUMzKiByLCBjb25zdCBjbXNNQVQzKiBhLCBjb25zdCBjbXNWRUMzKiB2KTsKKworCisvLyBFcnJvciBsb2dnaW5nICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICAgQ01TRVhQT1JUICBjbXNTaWduYWxFcnJvcihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIEVycm9yQ29kZSwgY29uc3QgY2hhciAqRXJyb3JUZXh0LCAuLi4pOworCisvLyBNZW1vcnkgbWFuYWdlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NNU0FQSSB2b2lkKiAgICAgICAgICAgICAgQ01TRVhQT1JUIF9jbXNNYWxsb2MoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBzaXplKTsKK0NNU0FQSSB2b2lkKiAgICAgICAgICAgICAgQ01TRVhQT1JUIF9jbXNNYWxsb2NaZXJvKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgc2l6ZSk7CitDTVNBUEkgdm9pZCogICAgICAgICAgICAgIENNU0VYUE9SVCBfY21zQ2FsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgbnVtLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSk7CitDTVNBUEkgdm9pZCogICAgICAgICAgICAgIENNU0VYUE9SVCBfY21zUmVhbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgTmV3U2l6ZSk7CitDTVNBUEkgdm9pZCAgICAgICAgICAgICAgIENNU0VYUE9SVCBfY21zRnJlZShjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogUHRyKTsKK0NNU0FQSSB2b2lkKiAgICAgICAgICAgICAgQ01TRVhQT1JUIF9jbXNEdXBNZW0oY21zQ29udGV4dCBDb250ZXh0SUQsIGNvbnN0IHZvaWQqIE9yZywgY21zVUludDMyTnVtYmVyIHNpemUpOworCisvLyBJL08gaGFuZGxlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBfY21zX2lvX2hhbmRsZXIgeworCisgICAgdm9pZCogc3RyZWFtOyAgIC8vIEFzc29jaWF0ZWQgc3RyZWFtLCB3aGljaCBpcyBpbXBsZW1lbnRlZCBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gbWVkaWEuCisKKyAgICBjbXNDb250ZXh0ICAgICAgICBDb250ZXh0SUQ7CisgICAgY21zVUludDMyTnVtYmVyICAgVXNlZFNwYWNlOworICAgIGNtc1VJbnQzMk51bWJlciAgIFJlcG9ydGVkU2l6ZTsKKyAgICBjaGFyICAgICAgICAgICAgICBQaHlzaWNhbEZpbGVbY21zTUFYX1BBVEhdOworCisgICAgY21zVUludDMyTnVtYmVyICAgKCogUmVhZCkoc3RydWN0IF9jbXNfaW9faGFuZGxlciogaW9oYW5kbGVyLCB2b2lkICpCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBjb3VudCk7CisgICAgY21zQm9vbCAgICAgICAgICAgKCogU2Vlaykoc3RydWN0IF9jbXNfaW9faGFuZGxlciogaW9oYW5kbGVyLCBjbXNVSW50MzJOdW1iZXIgb2Zmc2V0KTsKKyAgICBjbXNCb29sICAgICAgICAgICAoKiBDbG9zZSkoc3RydWN0IF9jbXNfaW9faGFuZGxlciogaW9oYW5kbGVyKTsKKyAgICBjbXNVSW50MzJOdW1iZXIgICAoKiBUZWxsKShzdHJ1Y3QgX2Ntc19pb19oYW5kbGVyKiBpb2hhbmRsZXIpOworICAgIGNtc0Jvb2wgICAgICAgICAgICgqIFdyaXRlKShzdHJ1Y3QgX2Ntc19pb19oYW5kbGVyKiBpb2hhbmRsZXIsIGNtc1VJbnQzMk51bWJlciBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIEJ1ZmZlcik7Cit9OworCisvLyBFbmRpYW5uZXNzIGFkanVzdCBmdW5jdGlvbnMKK0NNU0FQSSBjbXNVSW50MTZOdW1iZXIgICBDTVNFWFBPUlQgIF9jbXNBZGp1c3RFbmRpYW5lc3MxNihjbXNVSW50MTZOdW1iZXIgV29yZCk7CitDTVNBUEkgY21zVUludDMyTnVtYmVyICAgQ01TRVhQT1JUICBfY21zQWRqdXN0RW5kaWFuZXNzMzIoY21zVUludDMyTnVtYmVyIFZhbHVlKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgIF9jbXNBZGp1c3RFbmRpYW5lc3M2NChjbXNVSW50NjROdW1iZXIqIFJlc3VsdCwgY21zVUludDY0TnVtYmVyKiBRV29yZCk7CisKKy8vIEhlbHBlciBJTyBmdW5jdGlvbnMKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgIF9jbXNSZWFkVUludDhOdW1iZXIoY21zSU9IQU5ETEVSKiBpbywgIGNtc1VJbnQ4TnVtYmVyKiBuKTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgIF9jbXNSZWFkVUludDE2TnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQxNk51bWJlciogbik7CitDTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUICBfY21zUmVhZFVJbnQzMk51bWJlcihjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG4pOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCAgX2Ntc1JlYWRGbG9hdDMyTnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNtc0Zsb2F0MzJOdW1iZXIqIG4pOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCAgX2Ntc1JlYWRVSW50NjROdW1iZXIoY21zSU9IQU5ETEVSKiBpbywgY21zVUludDY0TnVtYmVyKiBuKTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgIF9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNtc0Zsb2F0NjROdW1iZXIqIG4pOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCAgX2Ntc1JlYWRYWVpOdW1iZXIoY21zSU9IQU5ETEVSKiBpbywgY21zQ0lFWFlaKiBYWVopOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCAgX2Ntc1JlYWRVSW50MTZBcnJheShjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIgbiwgY21zVUludDE2TnVtYmVyKiBBcnJheSk7CisKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgIF9jbXNXcml0ZVVJbnQ4TnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQ4TnVtYmVyIG4pOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCAgX2Ntc1dyaXRlVUludDE2TnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQxNk51bWJlciBuKTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgIF9jbXNXcml0ZVVJbnQzMk51bWJlcihjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIgbik7CitDTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUICBfY21zV3JpdGVGbG9hdDMyTnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNtc0Zsb2F0MzJOdW1iZXIgbik7CitDTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUICBfY21zV3JpdGVVSW50NjROdW1iZXIoY21zSU9IQU5ETEVSKiBpbywgY21zVUludDY0TnVtYmVyKiBuKTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgIF9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihjbXNJT0hBTkRMRVIqIGlvLCBjbXNGbG9hdDY0TnVtYmVyIG4pOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCAgX2Ntc1dyaXRlWFlaTnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNvbnN0IGNtc0NJRVhZWiogWFlaKTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgIF9jbXNXcml0ZVVJbnQxNkFycmF5KGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciBuLCBjb25zdCBjbXNVSW50MTZOdW1iZXIqIEFycmF5KTsKKworLy8gSUNDIGJhc2UgdGFnCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY21zVGFnVHlwZVNpZ25hdHVyZSAgc2lnOworICAgIGNtc0ludDhOdW1iZXIgICAgICAgIHJlc2VydmVkWzRdOworCit9IF9jbXNUYWdCYXNlOworCisvLyBUeXBlIGJhc2UgaGVscGVyIGZ1bmN0aW9ucworQ01TQVBJIGNtc1RhZ1R5cGVTaWduYXR1cmUgIENNU0VYUE9SVCBfY21zUmVhZFR5cGVCYXNlKGNtc0lPSEFORExFUiogaW8pOworQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgICAgIENNU0VYUE9SVCBfY21zV3JpdGVUeXBlQmFzZShjbXNJT0hBTkRMRVIqIGlvLCBjbXNUYWdUeXBlU2lnbmF0dXJlIHNpZyk7CisKKy8vIEFsaWdubWVudCBmdW5jdGlvbnMKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICAgIENNU0VYUE9SVCBfY21zUmVhZEFsaWdubWVudChjbXNJT0hBTkRMRVIqIGlvKTsKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICAgIENNU0VYUE9SVCBfY21zV3JpdGVBbGlnbm1lbnQoY21zSU9IQU5ETEVSKiBpbyk7CisKKy8vIFRvIGRlYWwgd2l0aCB0ZXh0IHN0cmVhbXMuIDJLIGF0IG1vc3QKK0NNU0FQSSBjbXNCb29sICAgICAgICAgICAgIENNU0VYUE9SVCBfY21zSU9QcmludGYoY21zSU9IQU5ETEVSKiBpbywgY29uc3QgY2hhciogZnJtLCAuLi4pOworCisvLyBGaXhlZCBwb2ludCBoZWxwZXIgZnVuY3Rpb25zCitDTVNBUEkgY21zRmxvYXQ2NE51bWJlciAgICBDTVNFWFBPUlQgX2NtczhGaXhlZDh0b0RvdWJsZShjbXNVSW50MTZOdW1iZXIgZml4ZWQ4KTsKK0NNU0FQSSBjbXNVSW50MTZOdW1iZXIgICAgIENNU0VYUE9SVCBfY21zRG91YmxlVG84Rml4ZWQ4KGNtc0Zsb2F0NjROdW1iZXIgdmFsKTsKKworQ01TQVBJIGNtc0Zsb2F0NjROdW1iZXIgICAgQ01TRVhQT1JUIF9jbXMxNUZpeGVkMTZ0b0RvdWJsZShjbXNTMTVGaXhlZDE2TnVtYmVyIGZpeDMyKTsKK0NNU0FQSSBjbXNTMTVGaXhlZDE2TnVtYmVyIENNU0VYUE9SVCBfY21zRG91YmxlVG8xNUZpeGVkMTYoY21zRmxvYXQ2NE51bWJlciB2KTsKKworLy8gRGF0ZS90aW1lIGhlbHBlciBmdW5jdGlvbnMKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICAgIENNU0VYUE9SVCBfY21zRW5jb2RlRGF0ZVRpbWVOdW1iZXIoY21zRGF0ZVRpbWVOdW1iZXIgKkRlc3QsIGNvbnN0IHN0cnVjdCB0bSAqU291cmNlKTsKK0NNU0FQSSB2b2lkICAgICAgICAgICAgICAgIENNU0VYUE9SVCBfY21zRGVjb2RlRGF0ZVRpbWVOdW1iZXIoY29uc3QgY21zRGF0ZVRpbWVOdW1iZXIgKlNvdXJjZSwgc3RydWN0IHRtICpEZXN0KTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFNoYXJlZCBjYWxsYmFja3MgZm9yIHVzZXIgZGF0YQordHlwZWRlZiB2b2lkICAgICAoKiBfY21zRnJlZVVzZXJEYXRhRm4pKGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBEYXRhKTsKK3R5cGVkZWYgdm9pZCogICAgKCogX2Ntc0R1cFVzZXJEYXRhRm4pKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCB2b2lkKiBEYXRhKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFBsdWctaW4gZm91bmRhdGlvbgorI2RlZmluZSBjbXNQbHVnaW5NYWdpY051bWJlciAgICAgICAgICAgICAgICAgMHg2MTYzNzA3MCAgICAgLy8gJ2FjcHAnCisKKyNkZWZpbmUgY21zUGx1Z2luTWVtSGFuZGxlclNpZyAgICAgICAgICAgICAgIDB4NkQ2NTZENDggICAgIC8vICdtZW1IJworI2RlZmluZSBjbXNQbHVnaW5JbnRlcnBvbGF0aW9uU2lnICAgICAgICAgICAgMHg2OTZFNzA0OCAgICAgLy8gJ2lucEgnCisjZGVmaW5lIGNtc1BsdWdpblBhcmFtZXRyaWNDdXJ2ZVNpZyAgICAgICAgICAweDcwNjE3MjQ4ICAgICAvLyAncGFySCcKKyNkZWZpbmUgY21zUGx1Z2luRm9ybWF0dGVyc1NpZyAgICAgICAgICAgICAgIDB4NjY3MjZENDggICAgIC8vICdmcm1ICisjZGVmaW5lIGNtc1BsdWdpblRhZ1R5cGVTaWcgICAgICAgICAgICAgICAgICAweDc0Nzk3MDQ4ICAgICAvLyAndHlwSCcKKyNkZWZpbmUgY21zUGx1Z2luVGFnU2lnICAgICAgICAgICAgICAgICAgICAgIDB4NzQ2MTY3NDggICAgIC8vICd0YWdIJworI2RlZmluZSBjbXNQbHVnaW5SZW5kZXJpbmdJbnRlbnRTaWcgICAgICAgICAgMHg2OTZFNzQ0OCAgICAgLy8gJ2ludEgnCisjZGVmaW5lIGNtc1BsdWdpbk11bHRpUHJvY2Vzc0VsZW1lbnRTaWcgICAgICAweDZENzA2NTQ4ICAgICAvLyAnbXBlSCcKKyNkZWZpbmUgY21zUGx1Z2luT3B0aW1pemF0aW9uU2lnICAgICAgICAgICAgIDB4NkY3MDc0NDggICAgIC8vICdvcHRIJworI2RlZmluZSBjbXNQbHVnaW5UcmFuc2Zvcm1TaWcgICAgICAgICAgICAgICAgMHg3QTY2NkQ0OCAgICAgLy8gJ3hmbUgnCisjZGVmaW5lIGNtc1BsdWdpbk11dGV4U2lnICAgICAgICAgICAgICAgICAgICAweDZENzQ3QTQ4ICAgICAvLyAnbXR4SCcKKwordHlwZWRlZiBzdHJ1Y3QgX2Ntc1BsdWdpbkJhc2VTdHJ1Y3QgeworCisgICAgICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgICAgICAgICBNYWdpYzsgICAgICAgICAgICAgICAvLyAnYWNwcCcgc2lnbmF0dXJlCisgICAgICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgICAgICAgICBFeHBlY3RlZFZlcnNpb247ICAgICAvLyBFeHBlY3RlZCB2ZXJzaW9uIG9mIExpdHRsZUNNUworICAgICAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgICAgICAgICAgVHlwZTsgICAgICAgICAgICAgICAgLy8gVHlwZSBvZiBwbHVnLWluCisgICAgICAgIHN0cnVjdCBfY21zUGx1Z2luQmFzZVN0cnVjdCogICBOZXh0OyAgICAgICAgICAgICAgICAvLyBGb3IgbXVsdGlwbGUgcGx1Z2luIGRlZmluaXRpb24uIE5VTEwgZm9yIGVuZCBvZiBsaXN0LgorCit9IGNtc1BsdWdpbkJhc2U7CisKKy8vIE1heGltdW0gbnVtYmVyIG9mIHR5cGVzIGluIGEgcGx1Z2luIGFycmF5CisjZGVmaW5lIE1BWF9UWVBFU19JTl9MQ01TX1BMVUdJTiAgICAyMAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gTWVtb3J5IGhhbmRsZXIuIEVhY2ggbmV3IHBsdWctaW4gdHlwZSByZXBsYWNlcyBjdXJyZW50IGJlaGF2aW91cgorCit0eXBlZGVmIHZvaWQqICgqIF9jbXNNYWxsb2NGblB0clR5cGUpKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgc2l6ZSk7IAordHlwZWRlZiB2b2lkICAoKiBfY21zRnJlZUZuUHRyVHlwZSkoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQgKlB0cik7Cit0eXBlZGVmIHZvaWQqICgqIF9jbXNSZWFsbG9jRm5QdHJUeXBlKShjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgTmV3U2l6ZSk7CisKK3R5cGVkZWYgdm9pZCogKCogX2Ntc01hbGxvWmVyb2NGblB0clR5cGUpKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgc2l6ZSk7IAordHlwZWRlZiB2b2lkKiAoKiBfY21zQ2FsbG9jRm5QdHJUeXBlKShjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIG51bSwgY21zVUludDMyTnVtYmVyIHNpemUpOwordHlwZWRlZiB2b2lkKiAoKiBfY21zRHVwRm5QdHJUeXBlKShjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3Qgdm9pZCogT3JnLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSk7CisKK3R5cGVkZWYgc3RydWN0IHsKKworICAgICAgICBjbXNQbHVnaW5CYXNlIGJhc2U7CisKKyAgICAgICAgLy8gUmVxdWlyZWQKKyAgICAgICAgX2Ntc01hbGxvY0ZuUHRyVHlwZSAgTWFsbG9jUHRyOworICAgICAgICBfY21zRnJlZUZuUHRyVHlwZSAgICBGcmVlUHRyOworICAgICAgICBfY21zUmVhbGxvY0ZuUHRyVHlwZSBSZWFsbG9jUHRyOworCisgICAgICAgIC8vIE9wdGlvbmFsCisgICAgICAgX2Ntc01hbGxvWmVyb2NGblB0clR5cGUgTWFsbG9jWmVyb1B0cjsKKyAgICAgICBfY21zQ2FsbG9jRm5QdHJUeXBlICAgICBDYWxsb2NQdHI7CisgICAgICAgX2Ntc0R1cEZuUHRyVHlwZSAgICAgICAgRHVwUHRyOworCit9IGNtc1BsdWdpbk1lbUhhbmRsZXI7CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEludGVycG9sYXRpb24uIDE2IGJpdHMgYW5kIGZsb2F0aW5nIHBvaW50IHZlcnNpb25zLgorc3RydWN0IF9jbXNfaW50ZXJwX3N0cnVjOworCisvLyBJbnRlcnBvbGF0aW9uIGNhbGxiYWNrcworCisvLyAxNiBiaXRzIGZvcndhcmQgaW50ZXJwb2xhdGlvbi4gVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBwcmVjaXNpb24tbGltaXRlZCBsaW5lYXIgaW50ZXJwb2xhdGlvbgorLy8gYW5kIGlzIHN1cHBvc2VkIHRvIGJlIHF1aXRlIGZhc3QuIEltcGxlbWVudGF0aW9uIG1heSBiZSB0ZXRyYWhlZHJhbCBvciB0cmlsaW5lYXIsIGFuZCBwbHVnLWlucyBtYXkKKy8vIGNob29zZSB0byBpbXBsZW1lbnQgYW55IG90aGVyIGludGVycG9sYXRpb24gYWxnb3JpdGhtLgordHlwZWRlZiB2b2lkICgqIF9jbXNJbnRlcnBGbjE2KShyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5wdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIE91dHB1dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgX2Ntc19pbnRlcnBfc3RydWMqIHApOworCisvLyBGbG9hdGluZyBwb2ludCBmb3J3YXJkIGludGVycG9sYXRpb24uIEZ1bGwgcHJlY2lzaW9uIGludGVycG9sYXRpb24gdXNpbmcgZmxvYXRzLiBUaGlzIGlzIG5vdCBhCisvLyB0aW1lIGNyaXRpY2FsIGZ1bmN0aW9uLiBJbXBsZW1lbnRhdGlvbiBtYXkgYmUgdGV0cmFoZWRyYWwgb3IgdHJpbGluZWFyLCBhbmQgcGx1Zy1pbnMgbWF5CisvLyBjaG9vc2UgdG8gaW1wbGVtZW50IGFueSBvdGhlciBpbnRlcnBvbGF0aW9uIGFsZ29yaXRobS4KK3R5cGVkZWYgdm9pZCAoKiBfY21zSW50ZXJwRm5GbG9hdCkoY21zRmxvYXQzMk51bWJlciBjb25zdCBJbnB1dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIE91dHB1dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc19pbnRlcnBfc3RydWMqIHApOworCisKKworLy8gVGhpcyB0eXBlIGhvbGRzIGEgcG9pbnRlciB0byBhbiBpbnRlcnBvbGF0b3IgdGhhdCBjYW4gYmUgZWl0aGVyIDE2IGJpdHMgb3IgZmxvYXQKK3R5cGVkZWYgdW5pb24geworICAgIF9jbXNJbnRlcnBGbjE2ICAgICAgIExlcnAxNjsgICAgICAgICAgICAvLyBGb3J3YXJkIGludGVycG9sYXRpb24gaW4gMTYgYml0cworICAgIF9jbXNJbnRlcnBGbkZsb2F0ICAgIExlcnBGbG9hdDsgICAgICAgICAvLyBGb3J3YXJkIGludGVycG9sYXRpb24gaW4gZmxvYXRpbmcgcG9pbnQKK30gY21zSW50ZXJwRnVuY3Rpb247CisKKy8vIEZsYWdzIGZvciBpbnRlcnBvbGF0b3Igc2VsZWN0aW9uCisjZGVmaW5lIENNU19MRVJQX0ZMQUdTXzE2QklUUyAgICAgICAgICAgICAweDAwMDAgICAgICAgIC8vIFRoZSBkZWZhdWx0CisjZGVmaW5lIENNU19MRVJQX0ZMQUdTX0ZMT0FUICAgICAgICAgICAgICAweDAwMDEgICAgICAgIC8vIFJlcXVpcmVzIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbgorI2RlZmluZSBDTVNfTEVSUF9GTEFHU19UUklMSU5FQVIgICAgICAgICAgMHgwMTAwICAgICAgICAvLyBIaW50IG9ubHkKKworCisjZGVmaW5lIE1BWF9JTlBVVF9ESU1FTlNJT05TIDgKKwordHlwZWRlZiBzdHJ1Y3QgX2Ntc19pbnRlcnBfc3RydWMgeyAgLy8gVXNlZCBvbiBhbGwgaW50ZXJwb2xhdGlvbnMuIFN1cHBsaWVkIGJ5IGxjbXMyIHdoZW4gY2FsbGluZyB0aGUgaW50ZXJwb2xhdGlvbiBmdW5jdGlvbgorCisgICAgY21zQ29udGV4dCBDb250ZXh0SUQ7ICAgICAvLyBUaGUgY2FsbGluZyB0aHJlYWQKKworICAgIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzOyAgLy8gS2VlcCBvcmlnaW5hbCBmbGFncworICAgIGNtc1VJbnQzMk51bWJlciBuSW5wdXRzOyAgLy8gIT0gMSBvbmx5IGluIDNEIGludGVycG9sYXRpb24KKyAgICBjbXNVSW50MzJOdW1iZXIgbk91dHB1dHM7IC8vICE9IDEgb25seSBpbiAzRCBpbnRlcnBvbGF0aW9uCisKKyAgICBjbXNVSW50MzJOdW1iZXIgblNhbXBsZXNbTUFYX0lOUFVUX0RJTUVOU0lPTlNdOyAgLy8gVmFsaWQgb24gYWxsIGtpbmRzIG9mIHRhYmxlcworICAgIGNtc1VJbnQzMk51bWJlciBEb21haW5bTUFYX0lOUFVUX0RJTUVOU0lPTlNdOyAgICAvLyBEb21haW4gPSBuU2FtcGxlcyAtIDEKKworICAgIGNtc1VJbnQzMk51bWJlciBvcHRhW01BWF9JTlBVVF9ESU1FTlNJT05TXTsgICAgIC8vIE9wdGltaXphdGlvbiBmb3IgM0QgQ0xVVC4gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIG5vZGVzIHByZW11bHRpcGxpZWQgZm9yIGVhY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaW1lbnNpb24uIEZvciBleGFtcGxlLCBpbiA3IG5vZGVzLCA3LCA3XjIgLCA3XjMsIDdeNCwgZXRjLiBPbiBub24tcmVndWxhcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbXBsaW5ncyBtYXkgdmFyeSBhY2NvcmRpbmcgb2YgdGhlIG51bWJlciBvZiBub2RlcyBmb3IgZWFjaCBkaW1lbnNpb24uCisKKyAgICBjb25zdCB2b2lkICpUYWJsZTsgICAgICAgICAgICAgICAgLy8gUG9pbnRzIHRvIHRoZSBhY3R1YWwgaW50ZXJwb2xhdGlvbiB0YWJsZQorICAgIGNtc0ludGVycEZ1bmN0aW9uIEludGVycG9sYXRpb247ICAvLyBQb2ludHMgdG8gdGhlIGZ1bmN0aW9uIHRvIGRvIHRoZSBpbnRlcnBvbGF0aW9uCisKKyB9IGNtc0ludGVycFBhcmFtczsKKworLy8gSW50ZXJwb2xhdG9ycyBmYWN0b3J5Cit0eXBlZGVmIGNtc0ludGVycEZ1bmN0aW9uICgqIGNtc0ludGVycEZuRmFjdG9yeSkoY21zVUludDMyTnVtYmVyIG5JbnB1dENoYW5uZWxzLCBjbXNVSW50MzJOdW1iZXIgbk91dHB1dENoYW5uZWxzLCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncyk7CisKKy8vIFRoZSBwbHVnLWluCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY21zUGx1Z2luQmFzZSBiYXNlOworCisgICAgLy8gUG9pbnRzIHRvIGEgdXNlci1zdXBwbGllZCBmdW5jdGlvbiB3aGljaCBpbXBsZW1lbnRzIHRoZSBmYWN0b3J5CisgICAgY21zSW50ZXJwRm5GYWN0b3J5IEludGVycG9sYXRvcnNGYWN0b3J5OworCit9IGNtc1BsdWdpbkludGVycG9sYXRpb247CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBQYXJhbWV0cmljIGN1cnZlcy4gQSBuZWdhdGl2ZSB0eXBlIG1lYW5zIHNhbWUgZnVuY3Rpb24gYnV0IGFuYWx5dGljYWxseSBpbnZlcnRlZC4gTWF4LiBudW1iZXIgb2YgcGFyYW1zIGlzIDEwCisKKy8vIEV2YWx1YXRvciBjYWxsYmFjayBmb3IgdXNlci1zdXBsaWVkIHBhcmFtZXRyaWMgY3VydmVzLiBNYXkgaW1wbGVtZW50IG1vcmUgdGhhbiBvbmUgdHlwZQordHlwZWRlZiAgY21zRmxvYXQ2NE51bWJlciAoKiBjbXNQYXJhbWV0cmljQ3VydmVFdmFsdWF0b3IpKGNtc0ludDMyTnVtYmVyIFR5cGUsIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIgUGFyYW1zWzEwXSwgY21zRmxvYXQ2NE51bWJlciBSKTsKKworLy8gUGx1Zy1pbiBtYXkgaW1wbGVtZW50IGFuIGFyYml0cmFyeSBudW1iZXIgb2YgcGFyYW1ldHJpYyBjdXJ2ZXMKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjbXNQbHVnaW5CYXNlIGJhc2U7CisKKyAgICBjbXNVSW50MzJOdW1iZXIgbkZ1bmN0aW9uczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIHN1cHBvcnRlZCBmdW5jdGlvbnMKKyAgICBjbXNVSW50MzJOdW1iZXIgRnVuY3Rpb25UeXBlc1tNQVhfVFlQRVNfSU5fTENNU19QTFVHSU5dOyAgICAgICAgLy8gVGhlIGlkZW50aWZpY2F0aW9uIHR5cGVzCisgICAgY21zVUludDMyTnVtYmVyIFBhcmFtZXRlckNvdW50W01BWF9UWVBFU19JTl9MQ01TX1BMVUdJTl07ICAgICAgIC8vIE51bWJlciBvZiBwYXJhbWV0ZXJzIGZvciBlYWNoIGZ1bmN0aW9uCisKKyAgICBjbXNQYXJhbWV0cmljQ3VydmVFdmFsdWF0b3IgICAgRXZhbHVhdG9yOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGV2YWx1YXRvcgorCit9IGNtc1BsdWdpblBhcmFtZXRyaWNDdXJ2ZXM7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRm9ybWF0dGVycy4gVGhpcyBwbHVnLWluIGFkZHMgbmV3IGhhbmRsZXJzLCByZXBsYWNpbmcgdGhlbSBpZiB0aGV5IGFscmVhZHkgZXhpc3QuIEZvcm1hdHRlcnMgZGVhbGluZyB3aXRoCisvLyBjbXNGbG9hdDMyTnVtYmVyIChicHMgPSA0KSBvciBkb3VibGUgKGJwcyA9IDApIHR5cGVzIGFyZSByZXF1ZXN0ZWQgdmlhIEZvcm1hdHRlckZsb2F0IGNhbGxiYWNrLiBPdGhlcnMgY29tZSBhY3Jvc3MKKy8vIEZvcm1hdHRlcjE2IGNhbGxiYWNrCisKK3N0cnVjdCBfY21zdHJhbnNmb3JtX3N0cnVjdDsKKwordHlwZWRlZiBjbXNVSW50OE51bWJlciogKCogY21zRm9ybWF0dGVyMTYpKHJlZ2lzdGVyIHN0cnVjdCBfY21zdHJhbnNmb3JtX3N0cnVjdCogQ01NY2FyZ28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIFZhbHVlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSk7CisKK3R5cGVkZWYgY21zVUludDhOdW1iZXIqICgqIGNtc0Zvcm1hdHRlckZsb2F0KShzdHJ1Y3QgX2Ntc3RyYW5zZm9ybV9zdHJ1Y3QqIENNTWNhcmdvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgVmFsdWVzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDhOdW1iZXIqICBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICBTdHJpZGUpOworCisvLyBUaGlzIHR5cGUgaG9sZHMgYSBwb2ludGVyIHRvIGEgZm9ybWF0dGVyIHRoYXQgY2FuIGJlIGVpdGhlciAxNiBiaXRzIG9yIGNtc0Zsb2F0MzJOdW1iZXIKK3R5cGVkZWYgdW5pb24geworICAgIGNtc0Zvcm1hdHRlcjE2ICAgIEZtdDE2OworICAgIGNtc0Zvcm1hdHRlckZsb2F0IEZtdEZsb2F0OworCit9IGNtc0Zvcm1hdHRlcjsKKworI2RlZmluZSBDTVNfUEFDS19GTEFHU18xNkJJVFMgICAgICAgMHgwMDAwCisjZGVmaW5lIENNU19QQUNLX0ZMQUdTX0ZMT0FUICAgICAgICAweDAwMDEKKwordHlwZWRlZiBlbnVtIHsgY21zRm9ybWF0dGVySW5wdXQ9MCwgY21zRm9ybWF0dGVyT3V0cHV0PTEgfSBjbXNGb3JtYXR0ZXJEaXJlY3Rpb247CisKK3R5cGVkZWYgY21zRm9ybWF0dGVyICgqIGNtc0Zvcm1hdHRlckZhY3RvcnkpKGNtc1VJbnQzMk51bWJlciBUeXBlLCAgICAgICAgICAgLy8gU3BlY2lmaWMgdHlwZSwgaS5lLiBUWVBFX1JHQl84CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGb3JtYXR0ZXJEaXJlY3Rpb24gRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOyAgICAgIC8vIHByZWNpc2lvbgorCisvLyBQbHVnLWluIG1heSBpbXBsZW1lbnQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBmb3JtYXR0ZXJzCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY21zUGx1Z2luQmFzZSAgICAgICAgICBiYXNlOworICAgIGNtc0Zvcm1hdHRlckZhY3RvcnkgICAgRm9ybWF0dGVyc0ZhY3Rvcnk7CisKK30gY21zUGx1Z2luRm9ybWF0dGVyczsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRhZyB0eXBlIGhhbmRsZXIuIEVhY2ggdHlwZSBpcyBmcmVlIHRvIHJldHVybiBhbnl0aGluZyBpdCB3YW50cywgYW5kIGl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8KKy8vIGtub3cgaW4gYWR2YW5jZSB3aGF0IGlzIHRoZSB0eXBlIGNvbnRhaW5lZCBpbiB0aGUgdGFnLgordHlwZWRlZiBzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QgeworCisgICAgICAgIGNtc1RhZ1R5cGVTaWduYXR1cmUgU2lnbmF0dXJlOyAgICAgLy8gVGhlIHNpZ25hdHVyZSBvZiB0aGUgdHlwZQorCisgICAgICAgIC8vIEFsbG9jYXRlcyBhbmQgcmVhZHMgaXRlbXMKKyAgICAgICAgdm9pZCAqICAgKCogUmVhZFB0cikoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNJT0hBTkRMRVIqICAgICAgaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciogICBuSXRlbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgICBTaXplT2ZUYWcpOworCisgICAgICAgIC8vIFdyaXRlcyBuIEl0ZW1zCisgICAgICAgIGNtc0Jvb2wgICgqIFdyaXRlUHRyKShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNJT0hBTkRMRVIqICAgICBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICAgICAgICAgIFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgIG5JdGVtcyk7CisKKyAgICAgICAgLy8gRHVwbGljYXRlIGFuIGl0ZW0gb3IgYXJyYXkgb2YgaXRlbXMKKyAgICAgICAgdm9pZCogICAoKiBEdXBQdHIpKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuKTsKKworICAgICAgICAvLyBGcmVlIGFsbCByZXNvdXJjZXMKKyAgICAgICAgdm9pZCAgICAoKiBGcmVlUHRyKShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqUHRyKTsKKworICAgICAgICAvLyBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgdXNlZCBieSB0aGUgY2FsbGluZyB0aHJlYWQKKyAgICAgICAgY21zQ29udGV4dCAgICAgICBDb250ZXh0SUQ7CisgICAgICAgIGNtc1VJbnQzMk51bWJlciAgSUNDVmVyc2lvbjsKKworfSBjbXNUYWdUeXBlSGFuZGxlcjsKKworLy8gRWFjaCBwbHVnLWluIGltcGxlbWVudHMgYSBzaW5nbGUgdHlwZQordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICBjbXNQbHVnaW5CYXNlICAgICAgYmFzZTsKKyAgICAgICAgY21zVGFnVHlwZUhhbmRsZXIgIEhhbmRsZXI7CisKK30gY21zUGx1Z2luVGFnVHlwZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoaXMgaXMgdGhlIHRhZyBwbHVnaW4sIHdoaWNoIGlkZW50aWZpZXMgdGFncy4gRm9yIHdyaXRpbmcsIGEgcG9pbnRlciB0byBmdW5jdGlvbiBpcyBwcm92aWRlZC4KKy8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgZGVzaXJlZCB0eXBlIGZvciB0aGlzIHRhZywgZ2l2ZW4gdGhlIHZlcnNpb24gb2YgcHJvZmlsZQorLy8gYW5kIHRoZSBkYXRhIGJlaW5nIHNlcmlhbGl6ZWQuCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBjbXNVSW50MzJOdW1iZXIgICAgIEVsZW1Db3VudDsgICAgICAgICAgLy8gSWYgdGhpcyB0YWcgbmVlZHMgYW4gYXJyYXksIGhvdyBtYW55IGVsZW1lbnRzIHNob3VsZCBrZWVwCisKKyAgICAvLyBGb3IgcmVhZGluZy4KKyAgICBjbXNVSW50MzJOdW1iZXIgICAgIG5TdXBwb3J0ZWRUeXBlczsgICAgLy8gSW4gaG93IG1hbnkgdHlwZXMgdGhpcyB0YWcgY2FuIGNvbWUgKE1BWF9UWVBFU19JTl9MQ01TX1BMVUdJTiBtYXhpbXVtKQorICAgIGNtc1RhZ1R5cGVTaWduYXR1cmUgU3VwcG9ydGVkVHlwZXNbTUFYX1RZUEVTX0lOX0xDTVNfUExVR0lOXTsKKworICAgIC8vIEZvciB3cml0dGluZworICAgIGNtc1RhZ1R5cGVTaWduYXR1cmUgKCogRGVjaWRlVHlwZSkoY21zRmxvYXQ2NE51bWJlciBJQ0NWZXJzaW9uLCBjb25zdCB2b2lkICpEYXRhKTsKKworfSBjbXNUYWdEZXNjcmlwdG9yOworCisvLyBQbHVnLWluIGltcGxlbWVudHMgYSBzaW5nbGUgdGFnCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY21zUGx1Z2luQmFzZSAgICBiYXNlOworCisgICAgY21zVGFnU2lnbmF0dXJlICBTaWduYXR1cmU7CisgICAgY21zVGFnRGVzY3JpcHRvciBEZXNjcmlwdG9yOworCit9IGNtc1BsdWdpblRhZzsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEN1c3RvbSBpbnRlbnRzLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBqb2luIGFsbCBwcm9maWxlcyBzcGVjaWZpZWQgaW4gdGhlIGFycmF5IGluCisvLyBhIHNpbmdsZSBMVVQuIEFueSBjdXN0b20gaW50ZW50IGluIHRoZSBjaGFpbiByZWRpcmVjdHMgdG8gY3VzdG9tIGZ1bmN0aW9uLiBJZiBtb3JlIHRoYW4KKy8vIG9uZSBjdXN0b20gaW50ZW50IGlzIGZvdW5kLCB0aGUgb25lIGxvY2F0ZWQgZmlyc3QgaXMgaW52b2tlZC4gVXN1YWxseSB1c2VycyBzaG91bGQgdXNlIG9ubHkgb25lCisvLyBjdXN0b20gaW50ZW50LCBzbyBtaXhpbmcgY3VzdG9tIGludGVudHMgaW4gc2FtZSBtdWx0aXByb2ZpbGUgdHJhbnNmb3JtIGlzIG5vdCBzdXBwb3J0ZWQuCisKK3R5cGVkZWYgY21zUGlwZWxpbmUqICgqIGNtc0ludGVudEZuKSggY21zQ29udGV4dCAgICAgICBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgblByb2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgIEludGVudHNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgICAgICBoUHJvZmlsZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zQm9vbCAgICAgICAgICBCUENbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uU3RhdGVzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgZHdGbGFncyk7CisKKworLy8gRWFjaCBwbHVnLWluIGRlZmluZXMgYSBzaW5nbGUgaW50ZW50IG51bWJlci4KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjbXNQbHVnaW5CYXNlICAgICBiYXNlOworICAgIGNtc1VJbnQzMk51bWJlciAgIEludGVudDsKKyAgICBjbXNJbnRlbnRGbiAgICAgICBMaW5rOworICAgIGNoYXIgICAgICAgICAgICAgIERlc2NyaXB0aW9uWzI1Nl07CisKK30gY21zUGx1Z2luUmVuZGVyaW5nSW50ZW50OworCisKKy8vIFRoZSBkZWZhdWx0IElDQyBpbnRlbnRzIChwZXJjZXB0dWFsLCBzYXR1cmF0aW9uLCByZWwuY29sIGFuZCBhYnMuY29sKQorQ01TQVBJIGNtc1BpcGVsaW5lKiAgQ01TRVhQT1JUIF9jbXNEZWZhdWx0SUNDaW50ZW50cyhjbXNDb250ZXh0ICAgICAgIENvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICBuUHJvZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgSW50ZW50c1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSAgICAgIGhQcm9maWxlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNCb29sICAgICAgICAgIEJQQ1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEFkYXB0YXRpb25TdGF0ZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICBkd0ZsYWdzKTsKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUGlwZWxpbmVzLCBNdWx0aSBQcm9jZXNzIEVsZW1lbnRzLgorCit0eXBlZGVmIHZvaWQgKCogX2Ntc1N0YWdlRXZhbEZuKSAgICAgKGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIgSW5bXSwgY21zRmxvYXQzMk51bWJlciBPdXRbXSwgY29uc3QgY21zU3RhZ2UqIG1wZSk7Cit0eXBlZGVmIHZvaWQqKCogX2Ntc1N0YWdlRHVwRWxlbUZuKSAgKGNtc1N0YWdlKiBtcGUpOwordHlwZWRlZiB2b2lkICgqIF9jbXNTdGFnZUZyZWVFbGVtRm4pIChjbXNTdGFnZSogbXBlKTsKKworCisvLyBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhIGdlbmVyaWMgTVBFCitDTVNBUEkgY21zU3RhZ2UqIENNU0VYUE9SVCBfY21zU3RhZ2VBbGxvY1BsYWNlaG9sZGVyKGNtc0NvbnRleHQgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNTdGFnZVNpZ25hdHVyZSAgICAgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgIElucHV0Q2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgICAgICBPdXRwdXRDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Ntc1N0YWdlRXZhbEZuICAgICAgIEV2YWxQdHIsICAgICAgICAgICAgLy8gUG9pbnRzIHRvIGZuIHRoYXQgZXZhbHVhdGVzIHRoZSBlbGVtZW50IChhbHdheXMgaW4gZmxvYXRpbmcgcG9pbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jbXNTdGFnZUR1cEVsZW1GbiAgICBEdXBFbGVtUHRyLCAgICAgICAgIC8vIFBvaW50cyB0byBhIGZuIHRoYXQgZHVwbGljYXRlcyB0aGUgc3RhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Ntc1N0YWdlRnJlZUVsZW1GbiAgIEZyZWVQdHIsICAgICAgICAgICAgLy8gUG9pbnRzIHRvIGEgZm4gdGhhdCBzZXRzIHRoZSBlbGVtZW50IGZyZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgIERhdGEpOyAgICAgICAgICAgICAgLy8gQSBnZW5lcmljIHBvaW50ZXIgdG8gd2hhdGV2ZXIgbWVtb3J5IG5lZWRlZCBieSB0aGUgZWxlbWVudAordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgY21zUGx1Z2luQmFzZSAgICAgYmFzZTsKKyAgICAgIGNtc1RhZ1R5cGVIYW5kbGVyIEhhbmRsZXI7CisKK30gIGNtc1BsdWdpbk11bHRpUHJvY2Vzc0VsZW1lbnQ7CisKKworLy8gRGF0YSBrZXB0IGluICJFbGVtZW50IiBtZW1iZXIgb2YgY21zU3RhZ2UKKworLy8gQ3VydmVzCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY21zVUludDMyTnVtYmVyIG5DdXJ2ZXM7CisgICAgY21zVG9uZUN1cnZlKiogIFRoZUN1cnZlczsKKworfSBfY21zU3RhZ2VUb25lQ3VydmVzRGF0YTsKKworLy8gTWF0cml4Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgY21zRmxvYXQ2NE51bWJlciogIERvdWJsZTsgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgZm9yIHRoZSBtYXRyaXgKKyAgICBjbXNGbG9hdDY0TnVtYmVyKiAgT2Zmc2V0OyAgICAgICAgICAvLyBUaGUgb2Zmc2V0CisKK30gX2Ntc1N0YWdlTWF0cml4RGF0YTsKKworLy8gQ0xVVAordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgdW5pb24geyAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FuIGhhdmUgb25seSBvbmUgb2YgYm90aCByZXByZXNlbnRhdGlvbnMgYXQgc2FtZSB0aW1lCisgICAgICAgIGNtc1VJbnQxNk51bWJlciogIFQ7ICAgICAgLy8gUG9pbnRzIHRvIHRoZSB0YWJsZSAxNiBiaXRzIHRhYmxlCisgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIqIFRGbG9hdDsgLy8gUG9pbnRzIHRvIHRoZSBjbXNGbG9hdDMyTnVtYmVyIHRhYmxlCisKKyAgICB9IFRhYjsKKworICAgIGNtc0ludGVycFBhcmFtcyogUGFyYW1zOworICAgIGNtc1VJbnQzMk51bWJlciAgbkVudHJpZXM7CisgICAgY21zQm9vbCAgICAgICAgICBIYXNGbG9hdFZhbHVlczsKKworfSBfY21zU3RhZ2VDTHV0RGF0YTsKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wdGltaXphdGlvbi4gVXNpbmcgdGhpcyBwbHVnLWluLCBhZGRpdGlvbmFsIG9wdGltaXphdGlvbiBzdHJhdGVnaWVzIG1heSBiZSBpbXBsZW1lbnRlZC4KKy8vIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIFRSVUUgaWYgYW55IG9wdGltaXphdGlvbiBpcyBkb25lIG9uIHRoZSBMVVQsIHRoaXMgdGVybWluYXRlcworLy8gdGhlIG9wdGltaXphdGlvbiAgc2VhcmNoLiBPciBGQUxTRSBpZiBpdCBpcyB1bmFibGUgdG8gb3B0aW1pemUgYW5kIHdhbnQgdG8gZ2l2ZSBhIGNoYW5jZQorLy8gdG8gdGhlIHJlc3Qgb2Ygb3B0aW1pemVycy4KKwordHlwZWRlZiB2b2lkICAgICAoKiBfY21zT1BUZXZhbDE2Rm4pKHJlZ2lzdGVyIGNvbnN0IGNtc1VJbnQxNk51bWJlciBJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciBPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjb25zdCB2b2lkKiBEYXRhKTsKKworCit0eXBlZGVmIGNtc0Jvb2wgICgqIF9jbXNPUFRvcHRpbWl6ZUZuKShjbXNQaXBlbGluZSoqIEx1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgSW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyKiBJbnB1dEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciogT3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyKiBkd0ZsYWdzKTsKKworLy8gVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byBzZXQgdGhlIG9wdGlvbmFsIGV2YWx1YXRvciBhbmQgYSBibG9jayBvZiBwcml2YXRlIGRhdGEuIElmIHByaXZhdGUgZGF0YSBpcyBiZWluZyB1c2VkLCBhbiBvcHRpb25hbAorLy8gZHVwbGljYXRvciBhbmQgZnJlZSBmdW5jdGlvbnMgc2hvdWxkIGFsc28gYmUgc3BlY2lmaWVkIGluIG9yZGVyIHRvIGR1cGxpY2F0ZSB0aGUgTFVUIGNvbnN0cnVjdC4gVXNlIE5VTEwgdG8gaW5oaWJpdCBzdWNoIGZ1bmN0aW9uYWxpdHkuCisKK0NNU0FQSSB2b2lkIENNU0VYUE9SVCBfY21zUGlwZWxpbmVTZXRPcHRpbWl6YXRpb25QYXJhbWV0ZXJzKGNtc1BpcGVsaW5lKiBMdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jbXNPUFRldmFsMTZGbiBFdmFsMTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIFByaXZhdGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY21zRnJlZVVzZXJEYXRhRm4gRnJlZVByaXZhdGVEYXRhRm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jbXNEdXBVc2VyRGF0YUZuIER1cFByaXZhdGVEYXRhRm4pOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICBjbXNQbHVnaW5CYXNlICAgICBiYXNlOworCisgICAgICAvLyBPcHRpbWl6ZSBlbnRyeSBwb2ludAorICAgICAgX2Ntc09QVG9wdGltaXplRm4gIE9wdGltaXplUHRyOworCit9ICBjbXNQbHVnaW5PcHRpbWl6YXRpb247CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnVsbCB4Zm9ybQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICAgY21zVUludDMyTnVtYmVyIEJ5dGVzUGVyTGluZUluOworICAgICAgIGNtc1VJbnQzMk51bWJlciBCeXRlc1BlckxpbmVPdXQ7CisgICAgICAgY21zVUludDMyTnVtYmVyIEJ5dGVzUGVyUGxhbmVJbjsKKyAgICAgICBjbXNVSW50MzJOdW1iZXIgQnl0ZXNQZXJQbGFuZU91dDsKKworfSBjbXNTdHJpZGU7CisKK3R5cGVkZWYgdm9pZCAgICAgKCogX2Ntc1RyYW5zZm9ybUZuKShzdHJ1Y3QgX2Ntc3RyYW5zZm9ybV9zdHJ1Y3QgKkNNTWNhcmdvLCAgIC8vIExlZ2FjeSBmdW5jdGlvbiwgaGFuZGxlcyBqdXN0IE9ORSBzY2FubGluZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBJbnB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBPdXRwdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFN0cmlkZSk7ICAgICAgICAgICAgICAgICAvLyBTdHJpZGUgaW4gYnl0ZXMgdG8gdGhlIG5leHQgcGxhbmEgaW4gcGxhbmFyIGZvcm1hdHMKKworCit0eXBlZGVmIHZvaWQgICAgICgqX2Ntc1RyYW5zZm9ybTJGbikoc3RydWN0IF9jbXN0cmFuc2Zvcm1fc3RydWN0ICpDTU1jYXJnbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBJbnB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBPdXRwdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFBpeGVsc1BlckxpbmUsICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgTGluZUNvdW50LCAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNTdHJpZGUqIFN0cmlkZSk7ICAKKwordHlwZWRlZiBjbXNCb29sICAoKiBfY21zVHJhbnNmb3JtRmFjdG9yeSkoX2Ntc1RyYW5zZm9ybUZuKiB4Zm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIFVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY21zRnJlZVVzZXJEYXRhRm4qIEZyZWVQcml2YXRlRGF0YUZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNQaXBlbGluZSoqIEx1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyKiBJbnB1dEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyKiBPdXRwdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciogZHdGbGFncyk7CisKK3R5cGVkZWYgY21zQm9vbCAgKCogX2Ntc1RyYW5zZm9ybTJGYWN0b3J5KShfY21zVHJhbnNmb3JtMkZuKiB4Zm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIFVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY21zRnJlZVVzZXJEYXRhRm4qIEZyZWVQcml2YXRlRGF0YUZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNQaXBlbGluZSoqIEx1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyKiBJbnB1dEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyKiBPdXRwdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciogZHdGbGFncyk7CisKKworLy8gUmV0cmlldmUgdXNlciBkYXRhIGFzIHNwZWNpZmllZCBieSB0aGUgZmFjdG9yeQorQ01TQVBJIHZvaWQgICBDTVNFWFBPUlQgX2Ntc1NldFRyYW5zZm9ybVVzZXJEYXRhKHN0cnVjdCBfY21zdHJhbnNmb3JtX3N0cnVjdCAqQ01NY2FyZ28sIHZvaWQqIHB0ciwgX2Ntc0ZyZWVVc2VyRGF0YUZuIEZyZWVQcml2YXRlRGF0YUZuKTsKK0NNU0FQSSB2b2lkICogQ01TRVhQT1JUIF9jbXNHZXRUcmFuc2Zvcm1Vc2VyRGF0YShzdHJ1Y3QgX2Ntc3RyYW5zZm9ybV9zdHJ1Y3QgKkNNTWNhcmdvKTsKKworCisvLyBSZXRyaWV2ZSBmb3JtYXR0ZXJzCitDTVNBUEkgdm9pZCAgIENNU0VYUE9SVCBfY21zR2V0VHJhbnNmb3JtRm9ybWF0dGVyczE2ICAgKHN0cnVjdCBfY21zdHJhbnNmb3JtX3N0cnVjdCAqQ01NY2FyZ28sIGNtc0Zvcm1hdHRlcjE2KiBGcm9tSW5wdXQsIGNtc0Zvcm1hdHRlcjE2KiBUb091dHB1dCk7CitDTVNBUEkgdm9pZCAgIENNU0VYUE9SVCBfY21zR2V0VHJhbnNmb3JtRm9ybWF0dGVyc0Zsb2F0KHN0cnVjdCBfY21zdHJhbnNmb3JtX3N0cnVjdCAqQ01NY2FyZ28sIGNtc0Zvcm1hdHRlckZsb2F0KiBGcm9tSW5wdXQsIGNtc0Zvcm1hdHRlckZsb2F0KiBUb091dHB1dCk7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgIGNtc1BsdWdpbkJhc2UgICAgIGJhc2U7CisKKyAgICAgIC8vIFRyYW5zZm9ybSBlbnRyeSBwb2ludAorICAgICAgdW5pb24geworICAgICAgICAgICAgIF9jbXNUcmFuc2Zvcm1GYWN0b3J5ICAgICAgICBsZWdhY3lfeGZvcm07CisgICAgICAgICAgICAgX2Ntc1RyYW5zZm9ybTJGYWN0b3J5ICAgICAgIHhmb3JtOworICAgICAgfSBmYWN0b3JpZXM7CisKK30gIGNtc1BsdWdpblRyYW5zZm9ybTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNdXRleCAKKwordHlwZWRlZiB2b2lkKiAgICAoKiBfY21zQ3JlYXRlTXV0ZXhGblB0clR5cGUpKGNtc0NvbnRleHQgQ29udGV4dElEKTsKK3R5cGVkZWYgdm9pZCAgICAgKCogX2Ntc0Rlc3Ryb3lNdXRleEZuUHRyVHlwZSkoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIG10eCk7Cit0eXBlZGVmIGNtc0Jvb2wgICgqIF9jbXNMb2NrTXV0ZXhGblB0clR5cGUpKGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBtdHgpOwordHlwZWRlZiB2b2lkICAgICAoKiBfY21zVW5sb2NrTXV0ZXhGblB0clR5cGUpKGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBtdHgpOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgICBjbXNQbHVnaW5CYXNlICAgICBiYXNlOworCisgICAgIF9jbXNDcmVhdGVNdXRleEZuUHRyVHlwZSAgQ3JlYXRlTXV0ZXhQdHI7CisgICAgIF9jbXNEZXN0cm95TXV0ZXhGblB0clR5cGUgRGVzdHJveU11dGV4UHRyOworICAgICBfY21zTG9ja011dGV4Rm5QdHJUeXBlICAgIExvY2tNdXRleFB0cjsKKyAgICAgX2Ntc1VubG9ja011dGV4Rm5QdHJUeXBlICBVbmxvY2tNdXRleFB0cjsKKworfSAgY21zUGx1Z2luTXV0ZXg7CisKK0NNU0FQSSB2b2lkKiAgIENNU0VYUE9SVCBfY21zQ3JlYXRlTXV0ZXgoY21zQ29udGV4dCBDb250ZXh0SUQpOworQ01TQVBJIHZvaWQgICAgQ01TRVhQT1JUIF9jbXNEZXN0cm95TXV0ZXgoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIG10eCk7CitDTVNBUEkgY21zQm9vbCBDTVNFWFBPUlQgX2Ntc0xvY2tNdXRleChjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogbXR4KTsKK0NNU0FQSSB2b2lkICAgIENNU0VYUE9SVCBfY21zVW5sb2NrTXV0ZXgoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIG10eCk7CisKKworI2lmbmRlZiBDTVNfVVNFX0NQUF9BUEkKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgIH0KKyMgICBlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgX2xjbXNfcGx1Z2luX0gKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zYWxwaGEuYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2FscGhhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q2YWEzNAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2FscGhhLmMKQEAgLTAsMCArMSw1MTggQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8KKy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisvLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKKy8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisvLworLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKy8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorLy8KKy8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCisvLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQorLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisvLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKworI2luY2x1ZGUgImxjbXMyX2ludGVybmFsLmgiCisKKworLy8gQWxwaGEgY29weSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRmxvb3IgdG8gYnl0ZSwgdGFraW5nIGNhcmUgb2Ygc2F0dXJhdGlvbgorY21zSU5MSU5FIGNtc1VJbnQ4TnVtYmVyIF9jbXNRdWlja1NhdHVyYXRlQnl0ZShjbXNGbG9hdDY0TnVtYmVyIGQpCit7CisgICAgICAgZCArPSAwLjU7CisgICAgICAgaWYgKGQgPD0gMCkgcmV0dXJuIDA7CisgICAgICAgaWYgKGQgPj0gMjU1LjApIHJldHVybiAyNTU7CisKKyAgICAgICByZXR1cm4gKGNtc1VJbnQ4TnVtYmVyKSBfY21zUXVpY2tGbG9vcldvcmQoZCk7Cit9CisKKworLy8gUmV0dXJuIHRoZSBzaXplIGluIGJ5dGVzIG9mIGEgZ2l2ZW4gZm9ybWF0dGVyCitzdGF0aWMKK2ludCB0cnVlQnl0ZXNTaXplKGNtc1VJbnQzMk51bWJlciBGb3JtYXQpCit7CisgICAgICAgaW50IGZtdF9ieXRlcyA9IFRfQllURVMoRm9ybWF0KTsKKworICAgICAgIC8vIEZvciBkb3VibGUsIHRoZSBUX0JZVEVTIGZpZWxkIHJldHVybnMgemVybworICAgICAgIGlmIChmbXRfYnl0ZXMgPT0gMCkKKyAgICAgICAgICAgICAgcmV0dXJuIHNpemVvZihkb3VibGUpOworICAgICAgCisgICAgICAgLy8gT3RoZXJ3aXNlLCBpdCBpcyBhbHJlYWR5IGNvcnJlY3QgZm9yIGFsbCBmb3JtYXRzCisgICAgICAgcmV0dXJuIGZtdF9ieXRlczsKK30KKworCisvLyBTZXZlcmFsIGZvcm1hdCBjb252ZXJ0ZXJzCisKK3R5cGVkZWYgdm9pZCgqY21zRm9ybWF0dGVyQWxwaGFGbikodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMpOworCisKKy8vIEZyb20gOAorCitzdGF0aWMKK3ZvaWQgY29weTgodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMpCit7CisgICAgICAgbWVtbW92ZShkc3QsIHNyYywgMSk7Cit9CisKK3N0YXRpYwordm9pZCBmcm9tOHRvMTYodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMpCit7CisgICAgICAgY21zVUludDhOdW1iZXIgbiA9ICooY21zVUludDhOdW1iZXIqKXNyYzsKKyAgICAgICAqKGNtc1VJbnQxNk51bWJlciopIGRzdCA9IEZST01fOF9UT18xNihuKTsKK30KKworc3RhdGljCit2b2lkIGZyb204dG9GTFQodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMpCit7CisgICAgICAgKihjbXNGbG9hdDMyTnVtYmVyKilkc3QgPSAoKihjbXNVSW50OE51bWJlciopc3JjKSAvIDI1NS4wZjsKK30KKworc3RhdGljCit2b2lkIGZyb204dG9EQkwodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMpCit7CisgICAgICAgKihjbXNGbG9hdDY0TnVtYmVyKilkc3QgPSAoKihjbXNVSW50OE51bWJlciopc3JjKSAvIDI1NS4wOworfQorCitzdGF0aWMKK3ZvaWQgZnJvbTh0b0hMRih2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYykKK3sKKyAgICAgICBjbXNGbG9hdDMyTnVtYmVyIG4gPSAoKihjbXNVSW50OE51bWJlciopc3JjKSAvIDI1NS4wZjsKKyAgICAgICAqKGNtc1VJbnQxNk51bWJlciopZHN0ID0gX2Ntc0Zsb2F0MkhhbGYobik7Cit9CisKKy8vIEZyb20gMTYKKworc3RhdGljCit2b2lkIGZyb20xNnRvOCh2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYykKK3sKKyAgICAgICBjbXNVSW50MTZOdW1iZXIgbiA9ICooY21zVUludDE2TnVtYmVyKilzcmM7CisgICAgICAgKihjbXNVSW50OE51bWJlciopIGRzdCA9IEZST01fMTZfVE9fOChuKTsKK30KKworc3RhdGljCit2b2lkIGNvcHkxNih2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYykKK3sKKyAgICAgICBtZW1tb3ZlKGRzdCwgc3JjLCAyKTsKK30KKwordm9pZCBmcm9tMTZ0b0ZMVCh2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYykKK3sKKyAgICAgICAqKGNtc0Zsb2F0MzJOdW1iZXIqKWRzdCA9ICgqKGNtc1VJbnQxNk51bWJlciopc3JjKSAvIDY1NTM1LjBmOworfQorCit2b2lkIGZyb20xNnRvREJMKHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjKQoreworICAgICAgICooY21zRmxvYXQ2NE51bWJlciopZHN0ID0gKCooY21zVUludDE2TnVtYmVyKilzcmMpIC8gNjU1MzUuMGY7Cit9CisKK3N0YXRpYwordm9pZCBmcm9tMTZ0b0hMRih2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYykKK3sKKyAgICAgICBjbXNGbG9hdDMyTnVtYmVyIG4gPSAoKihjbXNVSW50MTZOdW1iZXIqKXNyYykgLyA2NTUzNS4wZjsKKyAgICAgICAqKGNtc1VJbnQxNk51bWJlciopZHN0ID0gX2Ntc0Zsb2F0MkhhbGYobik7Cit9CisKKy8vIEZyb20gRmxvYXQKKworc3RhdGljIAordm9pZCBmcm9tRkxUdG84KHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjKQoreworICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgbiA9ICooY21zRmxvYXQzMk51bWJlciopc3JjOyAgIAorICAgICAgICooY21zVUludDhOdW1iZXIqKWRzdCA9IF9jbXNRdWlja1NhdHVyYXRlQnl0ZShuICogMjU1LjBmKTsKK30KKworc3RhdGljCit2b2lkIGZyb21GTFR0bzE2KHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjKQoreworICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgbiA9ICooY21zRmxvYXQzMk51bWJlciopc3JjOyAgICAgIAorICAgICAgICooY21zVUludDE2TnVtYmVyKilkc3QgPSBfY21zUXVpY2tTYXR1cmF0ZVdvcmQobiAqIDY1NTM1LjBmKTsKK30KKworc3RhdGljCit2b2lkIGNvcHkzMih2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYykKK3sKKyAgICAgICBtZW1tb3ZlKGRzdCwgc3JjLCBzaXplb2YoY21zRmxvYXQzMk51bWJlcikpOworfQorCitzdGF0aWMKK3ZvaWQgZnJvbUZMVHRvREJMKHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjKQoreworICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgbiA9ICooY21zRmxvYXQzMk51bWJlciopc3JjOworICAgICAgICooY21zRmxvYXQ2NE51bWJlciopZHN0ID0gKGNtc0Zsb2F0NjROdW1iZXIpbjsKK30KKworc3RhdGljCit2b2lkIGZyb21GTFR0b0hMRih2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYykKK3sKKyAgICAgICBjbXNGbG9hdDMyTnVtYmVyIG4gPSAqKGNtc0Zsb2F0MzJOdW1iZXIqKXNyYzsKKyAgICAgICAqKGNtc1VJbnQxNk51bWJlciopZHN0ID0gX2Ntc0Zsb2F0MkhhbGYobik7Cit9CisKKworLy8gRnJvbSBIQUxGCisKK3N0YXRpYwordm9pZCBmcm9tSExGdG84KHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjKQoreworICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgbiA9IF9jbXNIYWxmMkZsb2F0KCooY21zVUludDE2TnVtYmVyKilzcmMpOworICAgICAgICooY21zVUludDhOdW1iZXIqKWRzdCA9IF9jbXNRdWlja1NhdHVyYXRlQnl0ZShuICogMjU1LjBmKTsKK30KKworc3RhdGljCit2b2lkIGZyb21ITEZ0bzE2KHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjKQoreworICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgbiA9IF9jbXNIYWxmMkZsb2F0KCooY21zVUludDE2TnVtYmVyKilzcmMpOworICAgICAgICooY21zVUludDE2TnVtYmVyKilkc3QgPSBfY21zUXVpY2tTYXR1cmF0ZVdvcmQobiAqIDY1NTM1LjBmKTsKK30KKworc3RhdGljCit2b2lkIGZyb21ITEZ0b0ZMVCh2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYykKK3sKKyAgICAgICAqKGNtc0Zsb2F0MzJOdW1iZXIqKWRzdCA9IF9jbXNIYWxmMkZsb2F0KCooY21zVUludDE2TnVtYmVyKilzcmMpOworfQorCitzdGF0aWMKK3ZvaWQgZnJvbUhMRnRvREJMKHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjKQoreworICAgICAgICooY21zRmxvYXQ2NE51bWJlciopZHN0ID0gKGNtc0Zsb2F0NjROdW1iZXIpX2Ntc0hhbGYyRmxvYXQoKihjbXNVSW50MTZOdW1iZXIqKXNyYyk7Cit9CisKKy8vIEZyb20gZG91YmxlCitzdGF0aWMKK3ZvaWQgZnJvbURCTHRvOCh2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYykKK3sKKyAgICAgICBjbXNGbG9hdDY0TnVtYmVyIG4gPSAqKGNtc0Zsb2F0NjROdW1iZXIqKXNyYzsKKyAgICAgICAqKGNtc1VJbnQ4TnVtYmVyKilkc3QgPSBfY21zUXVpY2tTYXR1cmF0ZUJ5dGUobiAqIDI1NS4wKTsKK30KKworc3RhdGljCit2b2lkIGZyb21EQkx0bzE2KHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjKQoreworICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgbiA9ICooY21zRmxvYXQ2NE51bWJlciopc3JjOworICAgICAgICooY21zVUludDE2TnVtYmVyKilkc3QgPSBfY21zUXVpY2tTYXR1cmF0ZVdvcmQobiAqIDY1NTM1LjBmKTsKK30KKworc3RhdGljCit2b2lkIGZyb21EQkx0b0ZMVCh2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIHNyYykKK3sKKyAgICAgICBjbXNGbG9hdDY0TnVtYmVyIG4gPSAqKGNtc0Zsb2F0NjROdW1iZXIqKXNyYzsKKyAgICAgICAqKGNtc0Zsb2F0MzJOdW1iZXIqKWRzdCA9IChjbXNGbG9hdDMyTnVtYmVyKSBuOworfQorCitzdGF0aWMKK3ZvaWQgZnJvbURCTHRvSExGKHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogc3JjKQoreworICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgbiA9IChjbXNGbG9hdDMyTnVtYmVyKSAqKGNtc0Zsb2F0NjROdW1iZXIqKXNyYzsKKyAgICAgICAqKGNtc1VJbnQxNk51bWJlciopZHN0ID0gX2Ntc0Zsb2F0MkhhbGYobik7Cit9CisKK3N0YXRpYwordm9pZCBjb3B5NjQodm9pZCogZHN0LCBjb25zdCB2b2lkKiBzcmMpCit7CisgICAgICAgbWVtbW92ZShkc3QsIHNyYywgc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpKTsKK30KKworCisvLyBSZXR1cm5zIHRoZSBwb3NpdGlvbiAoeCBvciB5KSBvZiB0aGUgZm9ybWF0dGVyIGluIHRoZSB0YWJsZSBvZiBmdW5jdGlvbnMKK3N0YXRpYworaW50IEZvcm1hdHRlclBvcyhjbXNVSW50MzJOdW1iZXIgZnJtKQoreworICAgICAgIGludCAgYiA9IFRfQllURVMoZnJtKTsKKworICAgICAgIGlmIChiID09IDAgJiYgVF9GTE9BVChmcm0pKQorICAgICAgICAgICAgICByZXR1cm4gNDsgLy8gREJMCisgICAgICAgaWYgKGIgPT0gMiAmJiBUX0ZMT0FUKGZybSkpCisgICAgICAgICAgICAgIHJldHVybiAyOyAvLyBITEYKKyAgICAgICBpZiAoYiA9PSA0ICYmIFRfRkxPQVQoZnJtKSkKKyAgICAgICAgICAgICAgcmV0dXJuIDM7IC8vIEZMVAorICAgICAgIGlmIChiID09IDIgJiYgIVRfRkxPQVQoZnJtKSkKKyAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vIDE2CisgICAgICAgaWYgKGIgPT0gMSAmJiAhVF9GTE9BVChmcm0pKQorICAgICAgICAgICAgICByZXR1cm4gMDsgLy8gOAorCisgICAgICAgcmV0dXJuIC0xOyAvLyBub3QgcmVjb2duaXplZAorCit9CisKKy8vIE9idGFpbnMgYSBhbHBoYS10by1hbHBoYSBmdW5tY3Rpb24gZm9ybWF0dGVyCitzdGF0aWMKK2Ntc0Zvcm1hdHRlckFscGhhRm4gX2Ntc0dldEZvcm1hdHRlckFscGhhKGNtc0NvbnRleHQgaWQsIGNtc1VJbnQzMk51bWJlciBpbiwgY21zVUludDMyTnVtYmVyIG91dCkKK3sKK3N0YXRpYyBjbXNGb3JtYXR0ZXJBbHBoYUZuIEZvcm1hdHRlcnNBbHBoYVs1XVs1XSA9IHsKKworICAgICAgIC8qIGZyb20gOCAqLyAgeyBjb3B5OCwgICAgICBmcm9tOHRvMTYsICAgZnJvbTh0b0hMRiwgICBmcm9tOHRvRkxULCAgIGZyb204dG9EQkwgICB9LAorICAgICAgIC8qIGZyb20gMTYqLyAgeyBmcm9tMTZ0bzgsICBjb3B5MTYsICAgICAgZnJvbTE2dG9ITEYsICBmcm9tMTZ0b0ZMVCwgIGZyb20xNnRvREJMICB9LAorICAgICAgIC8qIGZyb20gSExGKi8geyBmcm9tSExGdG84LCBmcm9tSExGdG8xNiwgY29weTE2LCAgICAgICBmcm9tSExGdG9GTFQsIGZyb21ITEZ0b0RCTCB9LAorICAgICAgIC8qIGZyb20gRkxUKi8geyBmcm9tRkxUdG84LCBmcm9tRkxUdG8xNiwgZnJvbUZMVHRvSExGLCBjb3B5MzIsICAgICAgIGZyb21GTFR0b0RCTCB9LAorICAgICAgIC8qIGZyb20gREJMKi8geyBmcm9tREJMdG84LCBmcm9tREJMdG8xNiwgZnJvbURCTHRvSExGLCBmcm9tREJMdG9GTFQsIGNvcHk2NCB9fTsKKworICAgICAgICBpbnQgaW5fbiAgPSBGb3JtYXR0ZXJQb3MoaW4pOworICAgICAgICBpbnQgb3V0X24gPSBGb3JtYXR0ZXJQb3Mob3V0KTsKKworICAgICAgICBpZiAoaW5fbiA8IDAgfHwgb3V0X24gPCAwIHx8IGluX24gPiA0IHx8IG91dF9uID4gNCkgeworCisgICAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihpZCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJVbnJlY29nbml6ZWQgYWxwaGEgY2hhbm5lbCB3aWR0aCIpOworICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gRm9ybWF0dGVyc0FscGhhW2luX25dW291dF9uXTsKK30KKworCisKKy8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGRpc3RhbmNlIGZyb20gZWFjaCBjb21wb25lbnQgdG8gdGhlIG5leHQgb25lIGluIGJ5dGVzLiAKK3N0YXRpYwordm9pZCBDb21wdXRlSW5jcmVtZW50c0ZvckNodW5reShjbXNVSW50MzJOdW1iZXIgRm9ybWF0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgQ29tcG9uZW50U3RhcnRpbmdPcmRlcltdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIENvbXBvbmVudFBvaW50ZXJJbmNyZW1lbnRzW10pCit7CisgICAgICAgY21zVUludDMyTnVtYmVyIGNoYW5uZWxzW2Ntc01BWENIQU5ORUxTXTsKKyAgICAgICBpbnQgZXh0cmEgPSBUX0VYVFJBKEZvcm1hdCk7CisgICAgICAgaW50IG5jaGFubmVscyA9IFRfQ0hBTk5FTFMoRm9ybWF0KTsKKyAgICAgICBpbnQgdG90YWxfY2hhbnMgPSBuY2hhbm5lbHMgKyBleHRyYTsKKyAgICAgICBpbnQgaTsgICAgICAgCisgICAgICAgaW50IGNoYW5uZWxTaXplID0gdHJ1ZUJ5dGVzU2l6ZShGb3JtYXQpOworICAgICAgIGludCBwaXhlbFNpemUgPSBjaGFubmVsU2l6ZSAqIHRvdGFsX2NoYW5zOworICAgICAgIAorCSAgIC8vIFNhbml0eSBjaGVjaworCSAgIGlmICh0b3RhbF9jaGFucyA8PSAwIHx8IHRvdGFsX2NoYW5zID49IGNtc01BWENIQU5ORUxTKQorCQkgICByZXR1cm47CisKKyAgICAgICAgbWVtc2V0KGNoYW5uZWxzLCAwLCBzaXplb2YoY2hhbm5lbHMpKTsKKworICAgICAgIC8vIFNlcGFyYXRpb24gaXMgaW5kZXBlbmRlbnQgb2Ygc3RhcnRpbmcgcG9pbnQgYW5kIG9ubHkgZGVwZW5kcyBvbiBjaGFubmVsIHNpemUKKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgZXh0cmE7IGkrKykKKyAgICAgICAgICAgICAgQ29tcG9uZW50UG9pbnRlckluY3JlbWVudHNbaV0gPSBwaXhlbFNpemU7CisKKyAgICAgICAvLyBIYW5kbGUgZG8gc3dhcAorICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbF9jaGFuczsgaSsrKQorICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKFRfRE9TV0FQKEZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzW2ldID0gdG90YWxfY2hhbnMgLSBpIC0gMTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzW2ldID0gaTsKKyAgICAgICAgICAgICAgfQorICAgICAgIH0KKworICAgICAgIC8vIEhhbmRsZSBzd2FwIGZpcnN0IChST0wgb2YgcG9zaXRpb25zKSwgZXhhbXBsZSBDTVlLIC0+IEtDTVkgfCAwMTIzIC0+IDMwMTIKKyAgICAgICBpZiAoVF9TV0FQRklSU1QoRm9ybWF0KSAmJiB0b3RhbF9jaGFucyA+IDEpIHsKKyAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciB0bXAgPSBjaGFubmVsc1swXTsKKyAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsX2NoYW5zLTE7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzW2ldID0gY2hhbm5lbHNbaSArIDFdOworCisgICAgICAgICAgICAgIGNoYW5uZWxzW3RvdGFsX2NoYW5zIC0gMV0gPSB0bXA7CisgICAgICAgfQorCisgICAgICAgLy8gSGFuZGxlIHNpemUKKyAgICAgICBpZiAoY2hhbm5lbFNpemUgPiAxKQorICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWxfY2hhbnM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNbaV0gKj0gY2hhbm5lbFNpemU7CisgICAgICAgICAgICAgIH0KKworICAgICAgIGZvciAoaSA9IDA7IGkgPCBleHRyYTsgaSsrKQorICAgICAgICAgICAgICBDb21wb25lbnRTdGFydGluZ09yZGVyW2ldID0gY2hhbm5lbHNbaSArIG5jaGFubmVsc107Cit9CisKKworCisvLyAgT24gcGxhbmFyIGNvbmZpZ3VyYXRpb25zLCB0aGUgZGlzdGFuY2UgaXMgdGhlIHN0cmlkZSBhZGRlZCB0byBhbnkgbm9uLW5lZ2F0aXZlCitzdGF0aWMKK3ZvaWQgQ29tcHV0ZUluY3JlbWVudHNGb3JQbGFuYXIoY21zVUludDMyTnVtYmVyIEZvcm1hdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBCeXRlc1BlclBsYW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgQ29tcG9uZW50U3RhcnRpbmdPcmRlcltdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIENvbXBvbmVudFBvaW50ZXJJbmNyZW1lbnRzW10pCit7CisgICAgICAgY21zVUludDMyTnVtYmVyIGNoYW5uZWxzW2Ntc01BWENIQU5ORUxTXTsgICAgICAgCisgICAgICAgaW50IGV4dHJhID0gVF9FWFRSQShGb3JtYXQpOworICAgICAgIGludCBuY2hhbm5lbHMgPSBUX0NIQU5ORUxTKEZvcm1hdCk7CisgICAgICAgaW50IHRvdGFsX2NoYW5zID0gbmNoYW5uZWxzICsgZXh0cmE7CisgICAgICAgaW50IGk7CisgICAgICAgaW50IGNoYW5uZWxTaXplID0gdHJ1ZUJ5dGVzU2l6ZShGb3JtYXQpOworICAgICAgCisgICAgICAgLy8gU2FuaXR5IGNoZWNrCisgICAgICAgaWYgKHRvdGFsX2NoYW5zIDw9IDAgfHwgdG90YWxfY2hhbnMgPj0gY21zTUFYQ0hBTk5FTFMpCisgICAgICAgICAgIHJldHVybjsKKworICAgICAgIG1lbXNldChjaGFubmVscywgMCwgc2l6ZW9mKGNoYW5uZWxzKSk7CisKKyAgICAgICAvLyBTZXBhcmF0aW9uIGlzIGluZGVwZW5kZW50IG9mIHN0YXJ0aW5nIHBvaW50IGFuZCBvbmx5IGRlcGVuZHMgb24gY2hhbm5lbCBzaXplCisgICAgICAgZm9yIChpID0gMDsgaSA8IGV4dHJhOyBpKyspCisgICAgICAgICAgICAgIENvbXBvbmVudFBvaW50ZXJJbmNyZW1lbnRzW2ldID0gY2hhbm5lbFNpemU7CisKKyAgICAgICAvLyBIYW5kbGUgZG8gc3dhcAorICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbF9jaGFuczsgaSsrKQorICAgICAgIHsKKyAgICAgICAgICAgICAgaWYgKFRfRE9TV0FQKEZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzW2ldID0gdG90YWxfY2hhbnMgLSBpIC0gMTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzW2ldID0gaTsKKyAgICAgICAgICAgICAgfQorICAgICAgIH0KKworICAgICAgIC8vIEhhbmRsZSBzd2FwIGZpcnN0IChST0wgb2YgcG9zaXRpb25zKSwgZXhhbXBsZSBDTVlLIC0+IEtDTVkgfCAwMTIzIC0+IDMwMTIKKyAgICAgICBpZiAoVF9TV0FQRklSU1QoRm9ybWF0KSAmJiB0b3RhbF9jaGFucyA+IDApIHsKKworICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgdG1wID0gY2hhbm5lbHNbMF07CisgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbF9jaGFucyAtIDE7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzW2ldID0gY2hhbm5lbHNbaSArIDFdOworCisgICAgICAgICAgICAgIGNoYW5uZWxzW3RvdGFsX2NoYW5zIC0gMV0gPSB0bXA7CisgICAgICAgfQorCisgICAgICAgLy8gSGFuZGxlIHNpemUKKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWxfY2hhbnM7IGkrKykgeworICAgICAgICAgICAgICBjaGFubmVsc1tpXSAqPSBCeXRlc1BlclBsYW5lOworICAgICAgIH0KKworICAgICAgIGZvciAoaSA9IDA7IGkgPCBleHRyYTsgaSsrKQorICAgICAgICAgICAgICBDb21wb25lbnRTdGFydGluZ09yZGVyW2ldID0gY2hhbm5lbHNbaSArIG5jaGFubmVsc107Cit9CisKKworCisvLyBEaXNwYXRjaGVyIHBvciBjaHVua3kgYW5kIHBsYW5hciBSR0IKK3N0YXRpYwordm9pZCAgQ29tcHV0ZUNvbXBvbmVudEluY3JlbWVudHMoY21zVUludDMyTnVtYmVyIEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBCeXRlc1BlclBsYW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIENvbXBvbmVudFN0YXJ0aW5nT3JkZXJbXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgQ29tcG9uZW50UG9pbnRlckluY3JlbWVudHNbXSkKK3sKKyAgICAgICBpZiAoVF9QTEFOQVIoRm9ybWF0KSkgeworCisgICAgICAgICAgICAgIENvbXB1dGVJbmNyZW1lbnRzRm9yUGxhbmFyKEZvcm1hdCwgIEJ5dGVzUGVyUGxhbmUsIENvbXBvbmVudFN0YXJ0aW5nT3JkZXIsIENvbXBvbmVudFBvaW50ZXJJbmNyZW1lbnRzKTsKKyAgICAgICB9CisgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgIENvbXB1dGVJbmNyZW1lbnRzRm9yQ2h1bmt5KEZvcm1hdCwgIENvbXBvbmVudFN0YXJ0aW5nT3JkZXIsIENvbXBvbmVudFBvaW50ZXJJbmNyZW1lbnRzKTsKKyAgICAgICB9CisKK30KKworCisKKy8vIEhhbmRsZXMgZXh0cmEgY2hhbm5lbHMgY29weWluZyBhbHBoYSBpZiByZXF1ZXN0ZWQgYnkgdGhlIGZsYWdzCit2b2lkIF9jbXNIYW5kbGVFeHRyYUNoYW5uZWxzKF9jbXNUUkFOU0ZPUk0qIHAsIGNvbnN0IHZvaWQqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBQaXhlbHNQZXJMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgTGluZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNTdHJpZGUqIFN0cmlkZSkKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgaSwgaiwgazsKKyAgICBjbXNVSW50MzJOdW1iZXIgbkV4dHJhOworICAgIGNtc1VJbnQzMk51bWJlciBTb3VyY2VTdGFydGluZ09yZGVyW2Ntc01BWENIQU5ORUxTXTsKKyAgICBjbXNVSW50MzJOdW1iZXIgU291cmNlSW5jcmVtZW50c1tjbXNNQVhDSEFOTkVMU107CisgICAgY21zVUludDMyTnVtYmVyIERlc3RTdGFydGluZ09yZGVyW2Ntc01BWENIQU5ORUxTXTsKKyAgICBjbXNVSW50MzJOdW1iZXIgRGVzdEluY3JlbWVudHNbY21zTUFYQ0hBTk5FTFNdOworCisgICAgY21zRm9ybWF0dGVyQWxwaGFGbiBjb3B5VmFsdWVGbjsKKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBuZWVkIHNvbWUgY29weQorICAgIGlmICghKHAtPmR3T3JpZ2luYWxGbGFncyAmIGNtc0ZMQUdTX0NPUFlfQUxQSEEpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBFeGl0IGVhcmx5IGlmIGluLXBsYWNlIGNvbG9yLW1hbmFnZW1lbnQgaXMgb2NjdXJyaW5nIC0gbm8gbmVlZCB0byBjb3B5IGV4dHJhIGNoYW5uZWxzIHRvIHRoZW1zZWx2ZXMuCisgICAgaWYgKHAtPklucHV0Rm9ybWF0ID09IHAtPk91dHB1dEZvcm1hdCAmJiBpbiA9PSBvdXQpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIHNhbWUgbnVtYmVyIG9mIGFscGhhIGNoYW5uZWxzLiBJZiBub3QsIGp1c3QgcmV0dXJuIGFzIHRoaXMgc2hvdWxkIGJlIGNoZWNrZWQgYXQgdHJhbnNmb3JtIGNyZWF0aW9uIHRpbWUuCisgICAgbkV4dHJhID0gVF9FWFRSQShwLT5JbnB1dEZvcm1hdCk7CisgICAgaWYgKG5FeHRyYSAhPSBUX0VYVFJBKHAtPk91dHB1dEZvcm1hdCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEFueXRoaW5nIHRvIGRvPworICAgIGlmIChuRXh0cmEgPT0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gQ29tcHV0ZSB0aGUgaW5jcmVtZW50cyAKKyAgICBDb21wdXRlQ29tcG9uZW50SW5jcmVtZW50cyhwLT5JbnB1dEZvcm1hdCwgU3RyaWRlLT5CeXRlc1BlclBsYW5lSW4sIFNvdXJjZVN0YXJ0aW5nT3JkZXIsIFNvdXJjZUluY3JlbWVudHMpOworICAgIENvbXB1dGVDb21wb25lbnRJbmNyZW1lbnRzKHAtPk91dHB1dEZvcm1hdCwgU3RyaWRlLT5CeXRlc1BlclBsYW5lT3V0LCBEZXN0U3RhcnRpbmdPcmRlciwgRGVzdEluY3JlbWVudHMpOworCisgICAgLy8gQ2hlY2sgZm9yIGNvbnZlcnNpb25zIDgsIDE2LCBoYWxmLCBmbG9hdCwgZGJsCisgICAgY29weVZhbHVlRm4gPSBfY21zR2V0Rm9ybWF0dGVyQWxwaGEocC0+Q29udGV4dElELCBwLT5JbnB1dEZvcm1hdCwgcC0+T3V0cHV0Rm9ybWF0KTsKKworICAgIGlmIChuRXh0cmEgPT0gMSkgeyAvLyBPcHRpbWl6ZWQgcm91dGluZSBmb3IgY29weWluZyBhIHNpbmdsZSBleHRyYSBjaGFubmVsIHF1aWNrbHkKKworICAgICAgICBjbXNVSW50OE51bWJlciogU291cmNlUHRyOworICAgICAgICBjbXNVSW50OE51bWJlciogRGVzdFB0cjsKKworICAgICAgICBjbXNVSW50MzJOdW1iZXIgU291cmNlU3RyaWRlSW5jcmVtZW50ID0gMDsKKyAgICAgICAgY21zVUludDMyTnVtYmVyIERlc3RTdHJpZGVJbmNyZW1lbnQgPSAwOworCisgICAgICAgIC8vIFRoZSBsb29wIGl0c2VsZgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTGluZUNvdW50OyBpKyspIHsKKworICAgICAgICAgICAgLy8gUHJlcGFyZSBwb2ludGVycyBmb3IgdGhlIGxvb3AKKyAgICAgICAgICAgIFNvdXJjZVB0ciA9IChjbXNVSW50OE51bWJlciopaW4gKyBTb3VyY2VTdGFydGluZ09yZGVyWzBdICsgU291cmNlU3RyaWRlSW5jcmVtZW50OworICAgICAgICAgICAgRGVzdFB0ciA9IChjbXNVSW50OE51bWJlciopb3V0ICsgRGVzdFN0YXJ0aW5nT3JkZXJbMF0gKyBEZXN0U3RyaWRlSW5jcmVtZW50OworCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgUGl4ZWxzUGVyTGluZTsgaisrKSB7CisKKyAgICAgICAgICAgICAgICBjb3B5VmFsdWVGbihEZXN0UHRyLCBTb3VyY2VQdHIpOworCisgICAgICAgICAgICAgICAgU291cmNlUHRyICs9IFNvdXJjZUluY3JlbWVudHNbMF07CisgICAgICAgICAgICAgICAgRGVzdFB0ciArPSBEZXN0SW5jcmVtZW50c1swXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU291cmNlU3RyaWRlSW5jcmVtZW50ICs9IFN0cmlkZS0+Qnl0ZXNQZXJMaW5lSW47CisgICAgICAgICAgICBEZXN0U3RyaWRlSW5jcmVtZW50ICs9IFN0cmlkZS0+Qnl0ZXNQZXJMaW5lT3V0OworICAgICAgICB9CisKKyAgICB9CisgICAgZWxzZSB7IC8vIEdlbmVyYWwgY2FzZSB3aXRoIG1vcmUgdGhhbiBvbmUgZXh0cmEgY2hhbm5lbAorCisgICAgICAgIGNtc1VJbnQ4TnVtYmVyKiBTb3VyY2VQdHJbY21zTUFYQ0hBTk5FTFNdOworICAgICAgICBjbXNVSW50OE51bWJlciogRGVzdFB0cltjbXNNQVhDSEFOTkVMU107CisKKyAgICAgICAgY21zVUludDMyTnVtYmVyIFNvdXJjZVN0cmlkZUluY3JlbWVudHNbY21zTUFYQ0hBTk5FTFNdOworICAgICAgICBjbXNVSW50MzJOdW1iZXIgRGVzdFN0cmlkZUluY3JlbWVudHNbY21zTUFYQ0hBTk5FTFNdOworCisgICAgICAgIG1lbXNldChTb3VyY2VTdHJpZGVJbmNyZW1lbnRzLCAwLCBzaXplb2YoU291cmNlU3RyaWRlSW5jcmVtZW50cykpOworICAgICAgICBtZW1zZXQoRGVzdFN0cmlkZUluY3JlbWVudHMsIDAsIHNpemVvZihEZXN0U3RyaWRlSW5jcmVtZW50cykpOworCisgICAgICAgIC8vIFRoZSBsb29wIGl0c2VsZiAgICAgICAKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IExpbmVDb3VudDsgaSsrKSB7CisKKyAgICAgICAgICAgIC8vIFByZXBhcmUgcG9pbnRlcnMgZm9yIHRoZSBsb29wCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbkV4dHJhOyBqKyspIHsKKworICAgICAgICAgICAgICAgIFNvdXJjZVB0cltqXSA9IChjbXNVSW50OE51bWJlciopaW4gKyBTb3VyY2VTdGFydGluZ09yZGVyW2pdICsgU291cmNlU3RyaWRlSW5jcmVtZW50c1tqXTsKKyAgICAgICAgICAgICAgICBEZXN0UHRyW2pdID0gKGNtc1VJbnQ4TnVtYmVyKilvdXQgKyBEZXN0U3RhcnRpbmdPcmRlcltqXSArIERlc3RTdHJpZGVJbmNyZW1lbnRzW2pdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgUGl4ZWxzUGVyTGluZTsgaisrKSB7CisKKyAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbkV4dHJhOyBrKyspIHsKKworICAgICAgICAgICAgICAgICAgICBjb3B5VmFsdWVGbihEZXN0UHRyW2tdLCBTb3VyY2VQdHJba10pOworCisgICAgICAgICAgICAgICAgICAgIFNvdXJjZVB0cltrXSArPSBTb3VyY2VJbmNyZW1lbnRzW2tdOworICAgICAgICAgICAgICAgICAgICBEZXN0UHRyW2tdICs9IERlc3RJbmNyZW1lbnRzW2tdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG5FeHRyYTsgaisrKSB7CisKKyAgICAgICAgICAgICAgICBTb3VyY2VTdHJpZGVJbmNyZW1lbnRzW2pdICs9IFN0cmlkZS0+Qnl0ZXNQZXJMaW5lSW47CisgICAgICAgICAgICAgICAgRGVzdFN0cmlkZUluY3JlbWVudHNbal0gKz0gU3RyaWRlLT5CeXRlc1BlckxpbmVPdXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zY2FtMDIuYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2NhbTAyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYwYWMxZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2NhbTAyLmMKQEAgLTAsMCArMSw0ODYgQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8KKy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisvLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKKy8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisvLworLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKy8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorLy8KKy8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCisvLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQorLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisvLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKworI2luY2x1ZGUgImxjbXMyX2ludGVybmFsLmgiCisKKy8vIENJRUNBTSAwMiBhcHBlYXJhbmNlIG1vZGVsLiBNYW55IHRoYW5rcyB0byBKb3JkaSBWaWxhciBmb3IgdGhlIGRlYnVnZ2luZy4KKworLy8gLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit0eXBlZGVmIHN0cnVjdCAgeworCisgICAgY21zRmxvYXQ2NE51bWJlciBYWVpbM107CisgICAgY21zRmxvYXQ2NE51bWJlciBSR0JbM107CisgICAgY21zRmxvYXQ2NE51bWJlciBSR0JjWzNdOworICAgIGNtc0Zsb2F0NjROdW1iZXIgUkdCcFszXTsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIFJHQnBhWzNdOworICAgIGNtc0Zsb2F0NjROdW1iZXIgYSwgYiwgaCwgZSwgSCwgQSwgSiwgUSwgcywgdCwgQywgTTsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIGFiQ1syXTsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIGFic1syXTsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIGFiTVsyXTsKKworfSBDQU0wMkNPTE9SOworCit0eXBlZGVmIHN0cnVjdCAgeworCisgICAgQ0FNMDJDT0xPUiBhZG9wdGVkV2hpdGU7CisgICAgY21zRmxvYXQ2NE51bWJlciBMQSwgWWI7CisgICAgY21zRmxvYXQ2NE51bWJlciBGLCBjLCBOYzsKKyAgICBjbXNVSW50MzJOdW1iZXIgc3Vycm91bmQ7CisgICAgY21zRmxvYXQ2NE51bWJlciBuLCBOYmIsIE5jYiwgeiwgRkwsIEQ7CisKKyAgICBjbXNDb250ZXh0IENvbnRleHRJRDsKKworfSBjbXNDSUVDQU0wMjsKKworCitzdGF0aWMKK2Ntc0Zsb2F0NjROdW1iZXIgY29tcHV0ZV9uKGNtc0NJRUNBTTAyKiBwTW9kKQoreworICAgIHJldHVybiAocE1vZCAtPiBZYiAvIHBNb2QgLT4gYWRvcHRlZFdoaXRlLlhZWlsxXSk7Cit9CisKK3N0YXRpYworY21zRmxvYXQ2NE51bWJlciBjb21wdXRlX3ooY21zQ0lFQ0FNMDIqIHBNb2QpCit7CisgICAgcmV0dXJuICgxLjQ4ICsgcG93KHBNb2QgLT4gbiwgMC41KSk7Cit9CisKK3N0YXRpYworY21zRmxvYXQ2NE51bWJlciBjb21wdXRlTmJiKGNtc0NJRUNBTTAyKiBwTW9kKQoreworICAgIHJldHVybiAoMC43MjUgKiBwb3coKDEuMCAvIHBNb2QgLT4gbiksIDAuMikpOworfQorCitzdGF0aWMKK2Ntc0Zsb2F0NjROdW1iZXIgY29tcHV0ZUZMKGNtc0NJRUNBTTAyKiBwTW9kKQoreworICAgIGNtc0Zsb2F0NjROdW1iZXIgaywgRkw7CisKKyAgICBrID0gMS4wIC8gKCg1LjAgKiBwTW9kLT5MQSkgKyAxLjApOworICAgIEZMID0gMC4yICogcG93KGssIDQuMCkgKiAoNS4wICogcE1vZC0+TEEpICsgMC4xICoKKyAgICAgICAgKHBvdygoMS4wIC0gcG93KGssIDQuMCkpLCAyLjApKSAqCisgICAgICAgIChwb3coKDUuMCAqIHBNb2QtPkxBKSwgKDEuMCAvIDMuMCkpKTsKKworICAgIHJldHVybiBGTDsKK30KKworc3RhdGljCitjbXNGbG9hdDY0TnVtYmVyIGNvbXB1dGVEKGNtc0NJRUNBTTAyKiBwTW9kKQoreworICAgIGNtc0Zsb2F0NjROdW1iZXIgRDsKKworICAgIEQgPSBwTW9kLT5GIC0gKDEuMC8zLjYpKihleHAoKCgtcE1vZCAtPkxBLTQyKSAvIDkyLjApKSk7CisKKyAgICByZXR1cm4gRDsKK30KKworCitzdGF0aWMKK0NBTTAyQ09MT1IgWFladG9DQVQwMihDQU0wMkNPTE9SIGNscikKK3sKKyAgICBjbHIuUkdCWzBdID0gKGNsci5YWVpbMF0gKiAgMC43MzI4KSArIChjbHIuWFlaWzFdICogIDAuNDI5NikgKyAoY2xyLlhZWlsyXSAqIC0wLjE2MjQpOworICAgIGNsci5SR0JbMV0gPSAoY2xyLlhZWlswXSAqIC0wLjcwMzYpICsgKGNsci5YWVpbMV0gKiAgMS42OTc1KSArIChjbHIuWFlaWzJdICogIDAuMDA2MSk7CisgICAgY2xyLlJHQlsyXSA9IChjbHIuWFlaWzBdICogIDAuMDAzMCkgKyAoY2xyLlhZWlsxXSAqICAwLjAxMzYpICsgKGNsci5YWVpbMl0gKiAgMC45ODM0KTsKKworICAgIHJldHVybiBjbHI7Cit9CisKK3N0YXRpYworQ0FNMDJDT0xPUiBDaHJvbWF0aWNBZGFwdGF0aW9uKENBTTAyQ09MT1IgY2xyLCBjbXNDSUVDQU0wMiogcE1vZCkKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgY2xyLlJHQmNbaV0gPSAoKHBNb2QgLT4gYWRvcHRlZFdoaXRlLlhZWlsxXSAqCisgICAgICAgICAgICAocE1vZC0+RCAvIHBNb2QgLT4gYWRvcHRlZFdoaXRlLlJHQltpXSkpICsKKyAgICAgICAgICAgICgxLjAgLSBwTW9kLT5EKSkgKiBjbHIuUkdCW2ldOworICAgIH0KKworICAgIHJldHVybiBjbHI7Cit9CisKKworc3RhdGljCitDQU0wMkNPTE9SIENBVDAydG9IUEUoQ0FNMDJDT0xPUiBjbHIpCit7CisgICAgY21zRmxvYXQ2NE51bWJlciBNWzldOworCisgICAgTVswXSA9KCggMC4zODk3MSAqICAxLjA5NjEyNCkgKyAoMC42ODg5OCAqIDAuNDU0MzY5KSArICgtMC4wNzg2OCAqIC0wLjAwOTYyOCkpOworICAgIE1bMV0gPSgoIDAuMzg5NzEgKiAtMC4yNzg4NjkpICsgKDAuNjg4OTggKiAwLjQ3MzUzMykgKyAoLTAuMDc4NjggKiAtMC4wMDU2OTgpKTsKKyAgICBNWzJdID0oKCAwLjM4OTcxICogIDAuMTgyNzQ1KSArICgwLjY4ODk4ICogMC4wNzIwOTgpICsgKC0wLjA3ODY4ICogIDEuMDE1MzI2KSk7CisgICAgTVszXSA9KCgtMC4yMjk4MSAqICAxLjA5NjEyNCkgKyAoMS4xODM0MCAqIDAuNDU0MzY5KSArICggMC4wNDY0MSAqIC0wLjAwOTYyOCkpOworICAgIE1bNF0gPSgoLTAuMjI5ODEgKiAtMC4yNzg4NjkpICsgKDEuMTgzNDAgKiAwLjQ3MzUzMykgKyAoIDAuMDQ2NDEgKiAtMC4wMDU2OTgpKTsKKyAgICBNWzVdID0oKC0wLjIyOTgxICogIDAuMTgyNzQ1KSArICgxLjE4MzQwICogMC4wNzIwOTgpICsgKCAwLjA0NjQxICogIDEuMDE1MzI2KSk7CisgICAgTVs2XSA9KC0wLjAwOTYyOCk7CisgICAgTVs3XSA9KC0wLjAwNTY5OCk7CisgICAgTVs4XSA9KCAxLjAxNTMyNik7CisKKyAgICBjbHIuUkdCcFswXSA9IChjbHIuUkdCY1swXSAqIE1bMF0pICsgIChjbHIuUkdCY1sxXSAqIE1bMV0pICsgKGNsci5SR0JjWzJdICogTVsyXSk7CisgICAgY2xyLlJHQnBbMV0gPSAoY2xyLlJHQmNbMF0gKiBNWzNdKSArICAoY2xyLlJHQmNbMV0gKiBNWzRdKSArIChjbHIuUkdCY1syXSAqIE1bNV0pOworICAgIGNsci5SR0JwWzJdID0gKGNsci5SR0JjWzBdICogTVs2XSkgKyAgKGNsci5SR0JjWzFdICogTVs3XSkgKyAoY2xyLlJHQmNbMl0gKiBNWzhdKTsKKworICAgIHJldHVybiAgY2xyOworfQorCitzdGF0aWMKK0NBTTAyQ09MT1IgTm9ubGluZWFyQ29tcHJlc3Npb24oQ0FNMDJDT0xPUiBjbHIsIGNtc0NJRUNBTTAyKiBwTW9kKQoreworICAgIGNtc1VJbnQzMk51bWJlciBpOworICAgIGNtc0Zsb2F0NjROdW1iZXIgdGVtcDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgaWYgKGNsci5SR0JwW2ldIDwgMCkgeworCisgICAgICAgICAgICB0ZW1wID0gcG93KCgtMS4wICogcE1vZC0+RkwgKiBjbHIuUkdCcFtpXSAvIDEwMC4wKSwgMC40Mik7CisgICAgICAgICAgICBjbHIuUkdCcGFbaV0gPSAoLTEuMCAqIDQwMC4wICogdGVtcCkgLyAodGVtcCArIDI3LjEzKSArIDAuMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRlbXAgPSBwb3coKHBNb2QtPkZMICogY2xyLlJHQnBbaV0gLyAxMDAuMCksIDAuNDIpOworICAgICAgICAgICAgY2xyLlJHQnBhW2ldID0gKDQwMC4wICogdGVtcCkgLyAodGVtcCArIDI3LjEzKSArIDAuMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsci5BID0gKCgoMi4wICogY2xyLlJHQnBhWzBdKSArIGNsci5SR0JwYVsxXSArCisgICAgICAgIChjbHIuUkdCcGFbMl0gLyAyMC4wKSkgLSAwLjMwNSkgKiBwTW9kLT5OYmI7CisKKyAgICByZXR1cm4gY2xyOworfQorCitzdGF0aWMKK0NBTTAyQ09MT1IgQ29tcHV0ZUNvcnJlbGF0ZXMoQ0FNMDJDT0xPUiBjbHIsIGNtc0NJRUNBTTAyKiBwTW9kKQoreworICAgIGNtc0Zsb2F0NjROdW1iZXIgYSwgYiwgdGVtcCwgZSwgdCwgcjJkLCBkMnI7CisKKyAgICBhID0gY2xyLlJHQnBhWzBdIC0gKDEyLjAgKiBjbHIuUkdCcGFbMV0gLyAxMS4wKSArIChjbHIuUkdCcGFbMl0gLyAxMS4wKTsKKyAgICBiID0gKGNsci5SR0JwYVswXSArIGNsci5SR0JwYVsxXSAtICgyLjAgKiBjbHIuUkdCcGFbMl0pKSAvIDkuMDsKKworICAgIHIyZCA9ICgxODAuMCAvIDMuMTQxNTkyNjU0KTsKKyAgICBpZiAoYSA9PSAwKSB7CisgICAgICAgIGlmIChiID09IDApICAgICBjbHIuaCA9IDA7CisgICAgICAgIGVsc2UgaWYgKGIgPiAwKSBjbHIuaCA9IDkwOworICAgICAgICBlbHNlICAgICAgICAgICAgY2xyLmggPSAyNzA7CisgICAgfQorICAgIGVsc2UgaWYgKGEgPiAwKSB7CisgICAgICAgIHRlbXAgPSBiIC8gYTsKKyAgICAgICAgaWYgKGIgPiAwKSAgICAgICBjbHIuaCA9IChyMmQgKiBhdGFuKHRlbXApKTsKKyAgICAgICAgZWxzZSBpZiAoYiA9PSAwKSBjbHIuaCA9IDA7CisgICAgICAgIGVsc2UgICAgICAgICAgICAgY2xyLmggPSAocjJkICogYXRhbih0ZW1wKSkgKyAzNjA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0ZW1wID0gYiAvIGE7CisgICAgICAgIGNsci5oID0gKHIyZCAqIGF0YW4odGVtcCkpICsgMTgwOworICAgIH0KKworICAgIGQyciA9ICgzLjE0MTU5MjY1NCAvIDE4MC4wKTsKKyAgICBlID0gKCgxMjUwMC4wIC8gMTMuMCkgKiBwTW9kLT5OYyAqIHBNb2QtPk5jYikgKgorICAgICAgICAoY29zKChjbHIuaCAqIGQyciArIDIuMCkpICsgMy44KTsKKworICAgIGlmIChjbHIuaCA8IDIwLjE0KSB7CisgICAgICAgIHRlbXAgPSAoKGNsci5oICsgMTIyLjQ3KS8xLjIpICsgKCgyMC4xNCAtIGNsci5oKS8wLjgpOworICAgICAgICBjbHIuSCA9IDMwMCArICgxMDAqKChjbHIuaCArIDEyMi40NykvMS4yKSkgLyB0ZW1wOworICAgIH0KKyAgICBlbHNlIGlmIChjbHIuaCA8IDkwLjApIHsKKyAgICAgICAgdGVtcCA9ICgoY2xyLmggLSAyMC4xNCkvMC44KSArICgoOTAuMDAgLSBjbHIuaCkvMC43KTsKKyAgICAgICAgY2xyLkggPSAoMTAwKigoY2xyLmggLSAyMC4xNCkvMC44KSkgLyB0ZW1wOworICAgIH0KKyAgICBlbHNlIGlmIChjbHIuaCA8IDE2NC4yNSkgeworICAgICAgICB0ZW1wID0gKChjbHIuaCAtIDkwLjAwKS8wLjcpICsgKCgxNjQuMjUgLSBjbHIuaCkvMS4wKTsKKyAgICAgICAgY2xyLkggPSAxMDAgKyAoKDEwMCooKGNsci5oIC0gOTAuMDApLzAuNykpIC8gdGVtcCk7CisgICAgfQorICAgIGVsc2UgaWYgKGNsci5oIDwgMjM3LjUzKSB7CisgICAgICAgIHRlbXAgPSAoKGNsci5oIC0gMTY0LjI1KS8xLjApICsgKCgyMzcuNTMgLSBjbHIuaCkvMS4yKTsKKyAgICAgICAgY2xyLkggPSAyMDAgKyAoKDEwMCooKGNsci5oIC0gMTY0LjI1KS8xLjApKSAvIHRlbXApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgdGVtcCA9ICgoY2xyLmggLSAyMzcuNTMpLzEuMikgKyAoKDM2MCAtIGNsci5oICsgMjAuMTQpLzAuOCk7CisgICAgICAgIGNsci5IID0gMzAwICsgKCgxMDAqKChjbHIuaCAtIDIzNy41MykvMS4yKSkgLyB0ZW1wKTsKKyAgICB9CisKKyAgICBjbHIuSiA9IDEwMC4wICogcG93KChjbHIuQSAvIHBNb2QtPmFkb3B0ZWRXaGl0ZS5BKSwKKyAgICAgICAgKHBNb2QtPmMgKiBwTW9kLT56KSk7CisKKyAgICBjbHIuUSA9ICg0LjAgLyBwTW9kLT5jKSAqIHBvdygoY2xyLkogLyAxMDAuMCksIDAuNSkgKgorICAgICAgICAocE1vZC0+YWRvcHRlZFdoaXRlLkEgKyA0LjApICogcG93KHBNb2QtPkZMLCAwLjI1KTsKKworICAgIHQgPSAoZSAqIHBvdygoKGEgKiBhKSArIChiICogYikpLCAwLjUpKSAvCisgICAgICAgIChjbHIuUkdCcGFbMF0gKyBjbHIuUkdCcGFbMV0gKworICAgICAgICAoKDIxLjAgLyAyMC4wKSAqIGNsci5SR0JwYVsyXSkpOworCisgICAgY2xyLkMgPSBwb3codCwgMC45KSAqIHBvdygoY2xyLkogLyAxMDAuMCksIDAuNSkgKgorICAgICAgICBwb3coKDEuNjQgLSBwb3coMC4yOSwgcE1vZC0+bikpLCAwLjczKTsKKworICAgIGNsci5NID0gY2xyLkMgKiBwb3cocE1vZC0+RkwsIDAuMjUpOworICAgIGNsci5zID0gMTAwLjAgKiBwb3coKGNsci5NIC8gY2xyLlEpLCAwLjUpOworCisgICAgcmV0dXJuIGNscjsKK30KKworCitzdGF0aWMKK0NBTTAyQ09MT1IgSW52ZXJzZUNvcnJlbGF0ZXMoQ0FNMDJDT0xPUiBjbHIsIGNtc0NJRUNBTTAyKiBwTW9kKQoreworCisgICAgY21zRmxvYXQ2NE51bWJlciB0LCBlLCBwMSwgcDIsIHAzLCBwNCwgcDUsIGhyLCBkMnI7CisgICAgZDJyID0gMy4xNDE1OTI2NTQgLyAxODAuMDsKKworICAgIHQgPSBwb3coIChjbHIuQyAvIChwb3coKGNsci5KIC8gMTAwLjApLCAwLjUpICoKKyAgICAgICAgKHBvdygoMS42NCAtIHBvdygwLjI5LCBwTW9kLT5uKSksIDAuNzMpKSkpLAorICAgICAgICAoMS4wIC8gMC45KSApOworICAgIGUgPSAoKDEyNTAwLjAgLyAxMy4wKSAqIHBNb2QtPk5jICogcE1vZC0+TmNiKSAqCisgICAgICAgIChjb3MoKGNsci5oICogZDJyICsgMi4wKSkgKyAzLjgpOworCisgICAgY2xyLkEgPSBwTW9kLT5hZG9wdGVkV2hpdGUuQSAqIHBvdygKKyAgICAgICAgICAgKGNsci5KIC8gMTAwLjApLAorICAgICAgICAgICAoMS4wIC8gKHBNb2QtPmMgKiBwTW9kLT56KSkpOworCisgICAgcDEgPSBlIC8gdDsKKyAgICBwMiA9IChjbHIuQSAvIHBNb2QtPk5iYikgKyAwLjMwNTsKKyAgICBwMyA9IDIxLjAgLyAyMC4wOworCisgICAgaHIgPSBjbHIuaCAqIGQycjsKKworICAgIGlmIChmYWJzKHNpbihocikpID49IGZhYnMoY29zKGhyKSkpIHsKKyAgICAgICAgcDQgPSBwMSAvIHNpbihocik7CisgICAgICAgIGNsci5iID0gKHAyICogKDIuMCArIHAzKSAqICg0NjAuMCAvIDE0MDMuMCkpIC8KKyAgICAgICAgICAgIChwNCArICgyLjAgKyBwMykgKiAoMjIwLjAgLyAxNDAzLjApICoKKyAgICAgICAgICAgIChjb3MoaHIpIC8gc2luKGhyKSkgLSAoMjcuMCAvIDE0MDMuMCkgKworICAgICAgICAgICAgcDMgKiAoNjMwMC4wIC8gMTQwMy4wKSk7CisgICAgICAgIGNsci5hID0gY2xyLmIgKiAoY29zKGhyKSAvIHNpbihocikpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcDUgPSBwMSAvIGNvcyhocik7CisgICAgICAgIGNsci5hID0gKHAyICogKDIuMCArIHAzKSAqICg0NjAuMCAvIDE0MDMuMCkpIC8KKyAgICAgICAgICAgIChwNSArICgyLjAgKyBwMykgKiAoMjIwLjAgLyAxNDAzLjApIC0KKyAgICAgICAgICAgICgoMjcuMCAvIDE0MDMuMCkgLSBwMyAqICg2MzAwLjAgLyAxNDAzLjApKSAqCisgICAgICAgICAgICAoc2luKGhyKSAvIGNvcyhocikpKTsKKyAgICAgICAgY2xyLmIgPSBjbHIuYSAqIChzaW4oaHIpIC8gY29zKGhyKSk7CisgICAgfQorCisgICAgY2xyLlJHQnBhWzBdID0gKCg0NjAuMCAvIDE0MDMuMCkgKiBwMikgKworICAgICAgICAgICAgICAoKDQ1MS4wIC8gMTQwMy4wKSAqIGNsci5hKSArCisgICAgICAgICAgICAgICgoMjg4LjAgLyAxNDAzLjApICogY2xyLmIpOworICAgIGNsci5SR0JwYVsxXSA9ICgoNDYwLjAgLyAxNDAzLjApICogcDIpIC0KKyAgICAgICAgICAgICAgKCg4OTEuMCAvIDE0MDMuMCkgKiBjbHIuYSkgLQorICAgICAgICAgICAgICAoKDI2MS4wIC8gMTQwMy4wKSAqIGNsci5iKTsKKyAgICBjbHIuUkdCcGFbMl0gPSAoKDQ2MC4wIC8gMTQwMy4wKSAqIHAyKSAtCisgICAgICAgICAgICAgICgoMjIwLjAgLyAxNDAzLjApICogY2xyLmEpIC0KKyAgICAgICAgICAgICAgKCg2MzAwLjAgLyAxNDAzLjApICogY2xyLmIpOworCisgICAgcmV0dXJuIGNscjsKK30KKworc3RhdGljCitDQU0wMkNPTE9SIEludmVyc2VOb25saW5lYXJpdHkoQ0FNMDJDT0xPUiBjbHIsIGNtc0NJRUNBTTAyKiBwTW9kKQoreworICAgIGNtc1VJbnQzMk51bWJlciBpOworICAgIGNtc0Zsb2F0NjROdW1iZXIgYzE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIGlmICgoY2xyLlJHQnBhW2ldIC0gMC4xKSA8IDApIGMxID0gLTE7CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzEgPSAxOworICAgICAgICBjbHIuUkdCcFtpXSA9IGMxICogKDEwMC4wIC8gcE1vZC0+RkwpICoKKyAgICAgICAgICAgIHBvdygoKDI3LjEzICogZmFicyhjbHIuUkdCcGFbaV0gLSAwLjEpKSAvCisgICAgICAgICAgICAoNDAwLjAgLSBmYWJzKGNsci5SR0JwYVtpXSAtIDAuMSkpKSwKKyAgICAgICAgICAgICgxLjAgLyAwLjQyKSk7CisgICAgfQorCisgICAgcmV0dXJuIGNscjsKK30KKworc3RhdGljCitDQU0wMkNPTE9SIEhQRXRvQ0FUMDIoQ0FNMDJDT0xPUiBjbHIpCit7CisgICAgY21zRmxvYXQ2NE51bWJlciBNWzldOworCisgICAgTVswXSA9ICgoIDAuNzMyOCAqICAxLjkxMDE5NykgKyAoMC40Mjk2ICogMC4zNzA5NTApKTsKKyAgICBNWzFdID0gKCggMC43MzI4ICogLTEuMTEyMTI0KSArICgwLjQyOTYgKiAwLjYyOTA1NCkpOworICAgIE1bMl0gPSAoKCAwLjczMjggKiAgMC4yMDE5MDgpICsgKDAuNDI5NiAqIDAuMDAwMDA4KSAtIDAuMTYyNCk7CisgICAgTVszXSA9ICgoLTAuNzAzNiAqICAxLjkxMDE5NykgKyAoMS42OTc1ICogMC4zNzA5NTApKTsKKyAgICBNWzRdID0gKCgtMC43MDM2ICogLTEuMTEyMTI0KSArICgxLjY5NzUgKiAwLjYyOTA1NCkpOworICAgIE1bNV0gPSAoKC0wLjcwMzYgKiAgMC4yMDE5MDgpICsgKDEuNjk3NSAqIDAuMDAwMDA4KSArIDAuMDA2MSk7CisgICAgTVs2XSA9ICgoIDAuMDAzMCAqICAxLjkxMDE5NykgKyAoMC4wMTM2ICogMC4zNzA5NTApKTsKKyAgICBNWzddID0gKCggMC4wMDMwICogLTEuMTEyMTI0KSArICgwLjAxMzYgKiAwLjYyOTA1NCkpOworICAgIE1bOF0gPSAoKCAwLjAwMzAgKiAgMC4yMDE5MDgpICsgKDAuMDEzNiAqIDAuMDAwMDA4KSArIDAuOTgzNCk7OworCisgICAgY2xyLlJHQmNbMF0gPSAoY2xyLlJHQnBbMF0gKiBNWzBdKSArIChjbHIuUkdCcFsxXSAqIE1bMV0pICsgKGNsci5SR0JwWzJdICogTVsyXSk7CisgICAgY2xyLlJHQmNbMV0gPSAoY2xyLlJHQnBbMF0gKiBNWzNdKSArIChjbHIuUkdCcFsxXSAqIE1bNF0pICsgKGNsci5SR0JwWzJdICogTVs1XSk7CisgICAgY2xyLlJHQmNbMl0gPSAoY2xyLlJHQnBbMF0gKiBNWzZdKSArIChjbHIuUkdCcFsxXSAqIE1bN10pICsgKGNsci5SR0JwWzJdICogTVs4XSk7CisgICAgcmV0dXJuIGNscjsKK30KKworCitzdGF0aWMKK0NBTTAyQ09MT1IgSW52ZXJzZUNocm9tYXRpY0FkYXB0YXRpb24oQ0FNMDJDT0xPUiBjbHIsICBjbXNDSUVDQU0wMiogcE1vZCkKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIGNsci5SR0JbaV0gPSBjbHIuUkdCY1tpXSAvCisgICAgICAgICAgICAoKHBNb2QtPmFkb3B0ZWRXaGl0ZS5YWVpbMV0gKiBwTW9kLT5EIC8gcE1vZC0+YWRvcHRlZFdoaXRlLlJHQltpXSkgKyAxLjAgLSBwTW9kLT5EKTsKKyAgICB9CisgICAgcmV0dXJuIGNscjsKK30KKworCitzdGF0aWMKK0NBTTAyQ09MT1IgQ0FUMDJ0b1hZWihDQU0wMkNPTE9SIGNscikKK3sKKyAgICBjbHIuWFlaWzBdID0gKGNsci5SR0JbMF0gKiAgMS4wOTYxMjQpICsgKGNsci5SR0JbMV0gKiAtMC4yNzg4NjkpICsgKGNsci5SR0JbMl0gKiAgMC4xODI3NDUpOworICAgIGNsci5YWVpbMV0gPSAoY2xyLlJHQlswXSAqICAwLjQ1NDM2OSkgKyAoY2xyLlJHQlsxXSAqICAwLjQ3MzUzMykgKyAoY2xyLlJHQlsyXSAqICAwLjA3MjA5OCk7CisgICAgY2xyLlhZWlsyXSA9IChjbHIuUkdCWzBdICogLTAuMDA5NjI4KSArIChjbHIuUkdCWzFdICogLTAuMDA1Njk4KSArIChjbHIuUkdCWzJdICogIDEuMDE1MzI2KTsKKworICAgIHJldHVybiBjbHI7Cit9CisKKworY21zSEFORExFICBDTVNFWFBPUlQgY21zQ0lFQ0FNMDJJbml0KGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCBjbXNWaWV3aW5nQ29uZGl0aW9ucyogcFZDKQoreworICAgIGNtc0NJRUNBTTAyKiBscE1vZDsKKworICAgIF9jbXNBc3NlcnQocFZDICE9IE5VTEwpOworCisgICAgaWYoKGxwTW9kID0gKGNtc0NJRUNBTTAyKikgX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBzaXplb2YoY21zQ0lFQ0FNMDIpKSkgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBscE1vZCAtPkNvbnRleHRJRCA9IENvbnRleHRJRDsKKworICAgIGxwTW9kIC0+YWRvcHRlZFdoaXRlLlhZWlswXSA9IHBWQyAtPndoaXRlUG9pbnQuWDsKKyAgICBscE1vZCAtPmFkb3B0ZWRXaGl0ZS5YWVpbMV0gPSBwVkMgLT53aGl0ZVBvaW50Llk7CisgICAgbHBNb2QgLT5hZG9wdGVkV2hpdGUuWFlaWzJdID0gcFZDIC0+d2hpdGVQb2ludC5aOworCisgICAgbHBNb2QgLT4gTEEgICAgICAgPSBwVkMgLT5MYTsKKyAgICBscE1vZCAtPiBZYiAgICAgICA9IHBWQyAtPlliOworICAgIGxwTW9kIC0+IEQgICAgICAgID0gcFZDIC0+RF92YWx1ZTsKKyAgICBscE1vZCAtPiBzdXJyb3VuZCA9IHBWQyAtPnN1cnJvdW5kOworCisgICAgc3dpdGNoIChscE1vZCAtPiBzdXJyb3VuZCkgeworCisKKyAgICBjYXNlIENVVFNIRUVUX1NVUlJPVU5EOgorICAgICAgICBscE1vZC0+RiA9IDAuODsKKyAgICAgICAgbHBNb2QtPmMgPSAwLjQxOworICAgICAgICBscE1vZC0+TmMgPSAwLjg7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBEQVJLX1NVUlJPVU5EOgorICAgICAgICBscE1vZCAtPiBGICA9IDAuODsKKyAgICAgICAgbHBNb2QgLT4gYyAgPSAwLjUyNTsKKyAgICAgICAgbHBNb2QgLT4gTmMgPSAwLjg7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBESU1fU1VSUk9VTkQ6CisgICAgICAgIGxwTW9kIC0+IEYgID0gMC45OworICAgICAgICBscE1vZCAtPiBjICA9IDAuNTk7CisgICAgICAgIGxwTW9kIC0+IE5jID0gMC45NTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICAvLyBBdmVyYWdlIHN1cnJvdW5kCisgICAgICAgIGxwTW9kIC0+IEYgID0gMS4wOworICAgICAgICBscE1vZCAtPiBjICA9IDAuNjk7CisgICAgICAgIGxwTW9kIC0+IE5jID0gMS4wOworICAgIH0KKworICAgIGxwTW9kIC0+IG4gICA9IGNvbXB1dGVfbihscE1vZCk7CisgICAgbHBNb2QgLT4geiAgID0gY29tcHV0ZV96KGxwTW9kKTsKKyAgICBscE1vZCAtPiBOYmIgPSBjb21wdXRlTmJiKGxwTW9kKTsKKyAgICBscE1vZCAtPiBGTCAgPSBjb21wdXRlRkwobHBNb2QpOworCisgICAgaWYgKGxwTW9kIC0+IEQgPT0gRF9DQUxDVUxBVEUpIHsKKyAgICAgICAgbHBNb2QgLT4gRCAgID0gY29tcHV0ZUQobHBNb2QpOworICAgIH0KKworICAgIGxwTW9kIC0+IE5jYiA9IGxwTW9kIC0+IE5iYjsKKworICAgIGxwTW9kIC0+IGFkb3B0ZWRXaGl0ZSA9IFhZWnRvQ0FUMDIobHBNb2QgLT4gYWRvcHRlZFdoaXRlKTsKKyAgICBscE1vZCAtPiBhZG9wdGVkV2hpdGUgPSBDaHJvbWF0aWNBZGFwdGF0aW9uKGxwTW9kIC0+IGFkb3B0ZWRXaGl0ZSwgbHBNb2QpOworICAgIGxwTW9kIC0+IGFkb3B0ZWRXaGl0ZSA9IENBVDAydG9IUEUobHBNb2QgLT4gYWRvcHRlZFdoaXRlKTsKKyAgICBscE1vZCAtPiBhZG9wdGVkV2hpdGUgPSBOb25saW5lYXJDb21wcmVzc2lvbihscE1vZCAtPiBhZG9wdGVkV2hpdGUsIGxwTW9kKTsKKworICAgIHJldHVybiAoY21zSEFORExFKSBscE1vZDsKKworfQorCit2b2lkIENNU0VYUE9SVCBjbXNDSUVDQU0wMkRvbmUoY21zSEFORExFIGhNb2RlbCkKK3sKKyAgICBjbXNDSUVDQU0wMiogbHBNb2QgPSAoY21zQ0lFQ0FNMDIqKSBoTW9kZWw7CisKKyAgICBpZiAobHBNb2QpIF9jbXNGcmVlKGxwTW9kIC0+Q29udGV4dElELCBscE1vZCk7Cit9CisKKwordm9pZCBDTVNFWFBPUlQgY21zQ0lFQ0FNMDJGb3J3YXJkKGNtc0hBTkRMRSBoTW9kZWwsIGNvbnN0IGNtc0NJRVhZWiogcEluLCBjbXNKQ2gqIHBPdXQpCit7CisgICAgQ0FNMDJDT0xPUiBjbHI7CisgICAgY21zQ0lFQ0FNMDIqIGxwTW9kID0gKGNtc0NJRUNBTTAyKikgaE1vZGVsOworICAKKyAgICBfY21zQXNzZXJ0KGxwTW9kICE9IE5VTEwpOworICAgIF9jbXNBc3NlcnQocEluICE9IE5VTEwpOworICAgIF9jbXNBc3NlcnQocE91dCAhPSBOVUxMKTsKKworICAgIG1lbXNldCgmY2xyLCAwLCBzaXplb2YoY2xyKSk7CisKKyAgICBjbHIuWFlaWzBdID0gcEluIC0+WDsKKyAgICBjbHIuWFlaWzFdID0gcEluIC0+WTsKKyAgICBjbHIuWFlaWzJdID0gcEluIC0+WjsKKworICAgIGNsciA9IFhZWnRvQ0FUMDIoY2xyKTsKKyAgICBjbHIgPSBDaHJvbWF0aWNBZGFwdGF0aW9uKGNsciwgbHBNb2QpOworICAgIGNsciA9IENBVDAydG9IUEUoY2xyKTsKKyAgICBjbHIgPSBOb25saW5lYXJDb21wcmVzc2lvbihjbHIsIGxwTW9kKTsKKyAgICBjbHIgPSBDb21wdXRlQ29ycmVsYXRlcyhjbHIsIGxwTW9kKTsKKworICAgIHBPdXQgLT5KID0gY2xyLko7CisgICAgcE91dCAtPkMgPSBjbHIuQzsKKyAgICBwT3V0IC0+aCA9IGNsci5oOworfQorCit2b2lkIENNU0VYUE9SVCBjbXNDSUVDQU0wMlJldmVyc2UoY21zSEFORExFIGhNb2RlbCwgY29uc3QgY21zSkNoKiBwSW4sIGNtc0NJRVhZWiogcE91dCkKK3sKKyAgICBDQU0wMkNPTE9SIGNscjsKKyAgICBjbXNDSUVDQU0wMiogbHBNb2QgPSAoY21zQ0lFQ0FNMDIqKSBoTW9kZWw7CisgICAgCisgICAgX2Ntc0Fzc2VydChscE1vZCAhPSBOVUxMKTsKKyAgICBfY21zQXNzZXJ0KHBJbiAhPSBOVUxMKTsKKyAgICBfY21zQXNzZXJ0KHBPdXQgIT0gTlVMTCk7CisKKyAgICBtZW1zZXQoJmNsciwgMCwgc2l6ZW9mKGNscikpOworCisgICAgY2xyLkogPSBwSW4gLT4gSjsKKyAgICBjbHIuQyA9IHBJbiAtPiBDOworICAgIGNsci5oID0gcEluIC0+IGg7CisKKyAgICBjbHIgPSBJbnZlcnNlQ29ycmVsYXRlcyhjbHIsIGxwTW9kKTsKKyAgICBjbHIgPSBJbnZlcnNlTm9ubGluZWFyaXR5KGNsciwgbHBNb2QpOworICAgIGNsciA9IEhQRXRvQ0FUMDIoY2xyKTsKKyAgICBjbHIgPSBJbnZlcnNlQ2hyb21hdGljQWRhcHRhdGlvbihjbHIsIGxwTW9kKTsKKyAgICBjbHIgPSBDQVQwMnRvWFlaKGNscik7CisKKyAgICBwT3V0IC0+WCA9IGNsci5YWVpbMF07CisgICAgcE91dCAtPlkgPSBjbHIuWFlaWzFdOworICAgIHBPdXQgLT5aID0gY2xyLlhZWlsyXTsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2NnYXRzLmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNjZ2F0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1Zjc0ZWQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNjZ2F0cy5jCkBAIC0wLDAgKzEsMjc3OSBAQAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCisvLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTYgTWFydGkgTWFyaWEgU2FndWVyCisvLworLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisvLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisvLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisvLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKy8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQorLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKy8vCisvLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisvLworLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisvLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KKy8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisvLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCisvLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisvLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKy8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworCisjaW5jbHVkZSAibGNtczJfaW50ZXJuYWwuaCIKKworCisvLyBJVDguNyAvIENHQVRTLjE3LTIwMHggaGFuZGxpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisjZGVmaW5lIE1BWElEICAgICAgICAxMjggICAgIC8vIE1heCBsZW5ndGggb2YgaWRlbnRpZmllcgorI2RlZmluZSBNQVhTVFIgICAgICAxMDI0ICAgICAvLyBNYXggbGVuZ3RoIG9mIHN0cmluZworI2RlZmluZSBNQVhUQUJMRVMgICAgMjU1ICAgICAvLyBNYXggTnVtYmVyIG9mIHRhYmxlcyBpbiBhIHNpbmdsZSBzdHJlYW0KKyNkZWZpbmUgTUFYSU5DTFVERSAgICAyMCAgICAgLy8gTWF4IG51bWJlciBvZiBuZXN0ZWQgaW5jbHVkZXMKKworI2RlZmluZSBERUZBVUxUX0RCTF9GT1JNQVQgICIlLjEwZyIgLy8gRG91YmxlIGZvcm1hdHRpbmcKKworI2lmZGVmIENNU19JU19XSU5ET1dTXworLy9zdW5saWFuZy5saXUgbW9kaWZpZWQgMjAxMDQyNiBmb3Igd2luY2UgZXJyb3IKKyMgaWZuZGVmIF9XSU4zMl9XQ0UKKyMgICBpbmNsdWRlIDxpby5oPgorIyBlbmRpZgorIyAgICBkZWZpbmUgRElSX0NIQVIgICAgJ1xcJworI2Vsc2UKKyMgICAgZGVmaW5lIERJUl9DSEFSICAgICcvJworI2VuZGlmCisKKworLy8gU3ltYm9scwordHlwZWRlZiBlbnVtIHsKKworICAgICAgICBTVU5ERUZJTkVELAorICAgICAgICBTSU5VTSwgICAgICAvLyBJbnRlZ2VyCisgICAgICAgIFNETlVNLCAgICAgIC8vIFJlYWwKKyAgICAgICAgU0lERU5ULCAgICAgLy8gSWRlbnRpZmllcgorICAgICAgICBTU1RSSU5HLCAgICAvLyBzdHJpbmcKKyAgICAgICAgU0NPTU1FTlQsICAgLy8gY29tbWVudAorICAgICAgICBTRU9MTiwgICAgICAvLyBFbmQgb2YgbGluZQorICAgICAgICBTRU9GLCAgICAgICAvLyBFbmQgb2Ygc3RyZWFtCisgICAgICAgIFNTWU5FUlJPUiwgIC8vIFN5bnRheCBlcnJvciBmb3VuZCBvbiBzdHJlYW0KKworICAgICAgICAvLyBLZXl3b3JkcworCisgICAgICAgIFNCRUdJTl9EQVRBLAorICAgICAgICBTQkVHSU5fREFUQV9GT1JNQVQsCisgICAgICAgIFNFTkRfREFUQSwKKyAgICAgICAgU0VORF9EQVRBX0ZPUk1BVCwKKyAgICAgICAgU0tFWVdPUkQsCisgICAgICAgIFNEQVRBX0ZPUk1BVF9JRCwKKyAgICAgICAgU0lOQ0xVREUKKworICAgIH0gU1lNQk9MOworCisKKy8vIEhvdyB0byB3cml0ZSB0aGUgdmFsdWUKK3R5cGVkZWYgZW51bSB7CisKKyAgICAgICAgV1JJVEVfVU5DT09LRUQsCisgICAgICAgIFdSSVRFX1NUUklOR0lGWSwKKyAgICAgICAgV1JJVEVfSEVYQURFQ0lNQUwsCisgICAgICAgIFdSSVRFX0JJTkFSWSwKKyAgICAgICAgV1JJVEVfUEFJUgorCisgICAgfSBXUklURU1PREU7CisKKy8vIExpbmtlZCBsaXN0IG9mIHZhcmlhYmxlIG5hbWVzCit0eXBlZGVmIHN0cnVjdCBfS2V5VmFsIHsKKworICAgICAgICBzdHJ1Y3QgX0tleVZhbCogIE5leHQ7CisgICAgICAgIGNoYXIqICAgICAgICAgICAgS2V5d29yZDsgICAgICAgLy8gTmFtZSBvZiB2YXJpYWJsZQorICAgICAgICBzdHJ1Y3QgX0tleVZhbCogIE5leHRTdWJrZXk7ICAgIC8vIElmIGtleSBpcyBhIGRpY3Rpb25hcnksIHBvaW50cyB0byB0aGUgbmV4dCBpdGVtCisgICAgICAgIGNoYXIqICAgICAgICAgICAgU3Via2V5OyAgICAgICAgLy8gSWYga2V5IGlzIGEgZGljdGlvbmFyeSwgcG9pbnRzIHRvIHRoZSBzdWJrZXkgbmFtZQorICAgICAgICBjaGFyKiAgICAgICAgICAgIFZhbHVlOyAgICAgICAgIC8vIFBvaW50cyB0byB2YWx1ZQorICAgICAgICBXUklURU1PREUgICAgICAgIFdyaXRlQXM7ICAgICAgIC8vIEhvdyB0byB3cml0ZSB0aGUgdmFsdWUKKworICAgfSBLRVlWQUxVRTsKKworCisvLyBMaW5rZWQgbGlzdCBvZiBtZW1vcnkgY2h1bmtzIChNZW1vcnkgc2luaykKK3R5cGVkZWYgc3RydWN0IF9Pd25lZE1lbSB7CisKKyAgICAgICAgc3RydWN0IF9Pd25lZE1lbSogTmV4dDsKKyAgICAgICAgdm9pZCAqICAgICAgICAgICAgUHRyOyAgICAgICAgICAvLyBQb2ludCB0byB2YWx1ZQorCisgICB9IE9XTkVETUVNOworCisvLyBTdWJhbGxvY2F0b3IKK3R5cGVkZWYgc3RydWN0IF9TdWJBbGxvY2F0b3IgeworCisgICAgICAgICBjbXNVSW50OE51bWJlciogQmxvY2s7CisgICAgICAgICBjbXNVSW50MzJOdW1iZXIgQmxvY2tTaXplOworICAgICAgICAgY21zVUludDMyTnVtYmVyIFVzZWQ7CisKKyAgICB9IFNVQkFMTE9DQVRPUjsKKworLy8gVGFibGUuIEVhY2ggaW5kaXZpZHVhbCB0YWJsZSBjYW4gaG9sZCBwcm9wZXJ0aWVzIGFuZCByb3dzICYgY29scwordHlwZWRlZiBzdHJ1Y3QgX1RhYmxlIHsKKworICAgICAgICBjaGFyIFNoZWV0VHlwZVtNQVhTVFJdOyAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCByb3cgb2YgdGhlIElUOCAodGhlIHR5cGUpCisKKyAgICAgICAgaW50ICAgICAgICAgICAgblNhbXBsZXMsIG5QYXRjaGVzOyAgICAvLyBDb2xzLCBSb3dzCisgICAgICAgIGludCAgICAgICAgICAgIFNhbXBsZUlEOyAgICAgICAgICAgICAgLy8gUG9zIG9mIElECisKKyAgICAgICAgS0VZVkFMVUUqICAgICAgSGVhZGVyTGlzdDsgICAgICAgICAgICAvLyBUaGUgcHJvcGVydGllcworCisgICAgICAgIGNoYXIqKiAgICAgICAgIERhdGFGb3JtYXQ7ICAgICAgICAgICAgLy8gVGhlIGJpbmFyeSBzdHJlYW0gZGVzY3JpcHRvcgorICAgICAgICBjaGFyKiogICAgICAgICBEYXRhOyAgICAgICAgICAgICAgICAgIC8vIFRoZSBiaW5hcnkgc3RyZWFtCisKKyAgICB9IFRBQkxFOworCisvLyBGaWxlIHN0cmVhbSBiZWluZyBwYXJzZWQKK3R5cGVkZWYgc3RydWN0IF9GaWxlQ29udGV4dCB7CisgICAgICAgIGNoYXIgICAgICAgICAgIEZpbGVOYW1lW2Ntc01BWF9QQVRIXTsgICAgLy8gRmlsZSBuYW1lIGlmIGJlaW5nIHJlYWRlZCBmcm9tIGZpbGUKKyAgICAgICAgRklMRSogICAgICAgICAgU3RyZWFtOyAgICAgICAgICAgICAgICAgICAvLyBGaWxlIHN0cmVhbSBvciBOVUxMIGlmIGhvbGRlZCBpbiBtZW1vcnkKKyAgICB9IEZJTEVDVFg7CisKKy8vIFRoaXMgc3RydWN0IGhvbGQgYWxsIGluZm9ybWF0aW9uIGFib3V0IGFuIG9wZW4gSVQ4IGhhbmRsZXIuCit0eXBlZGVmIHN0cnVjdCB7CisKKworICAgICAgICBjbXNVSW50MzJOdW1iZXIgIFRhYmxlc0NvdW50OyAgICAgICAgICAgICAgICAgICAgIC8vIEhvdyBtYW55IHRhYmxlcyBpbiB0aGlzIHN0cmVhbQorICAgICAgICBjbXNVSW50MzJOdW1iZXIgIG5UYWJsZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBhY3R1YWwgdGFibGUKKworICAgICAgICBUQUJMRSBUYWJbTUFYVEFCTEVTXTsKKworICAgICAgICAvLyBNZW1vcnkgbWFuYWdlbWVudAorICAgICAgICBPV05FRE1FTSogICAgICBNZW1vcnlTaW5rOyAgICAgICAgICAgIC8vIFRoZSBzdG9yYWdlIGJhY2tlbmQKKyAgICAgICAgU1VCQUxMT0NBVE9SICAgQWxsb2NhdG9yOyAgICAgICAgICAgICAvLyBTdHJpbmcgc3ViYWxsb2NhdG9yIC0tIGp1c3QgdG8ga2VlcCBpdCBmYXN0CisKKyAgICAgICAgLy8gUGFyc2VyIHN0YXRlIG1hY2hpbmUKKyAgICAgICAgU1lNQk9MICAgICAgICAgICAgIHN5OyAgICAgICAgICAgICAgICAvLyBDdXJyZW50IHN5bWJvbAorICAgICAgICBpbnQgICAgICAgICAgICAgICAgY2g7ICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgY2hhcmFjdGVyCisKKyAgICAgICAgY21zSW50MzJOdW1iZXIgICAgIGludW07ICAgICAgICAgICAgICAvLyBpbnRlZ2VyIHZhbHVlCisgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgICBkbnVtOyAgICAgICAgICAgICAgLy8gcmVhbCB2YWx1ZQorCisgICAgICAgIGNoYXIgICAgICAgICAgIGlkW01BWElEXTsgICAgICAgICAgICAgLy8gaWRlbnRpZmllcgorICAgICAgICBjaGFyICAgICAgICAgICBzdHJbTUFYU1RSXTsgICAgICAgICAgIC8vIHN0cmluZworCisgICAgICAgIC8vIEFsbG93ZWQga2V5d29yZHMgJiBkYXRhc2V0cy4gVGhleSBoYXZlIHZpc2liaWxpdHkgb24gd2hvbGUgc3RyZWFtCisgICAgICAgIEtFWVZBTFVFKiAgICAgIFZhbGlkS2V5d29yZHM7CisgICAgICAgIEtFWVZBTFVFKiAgICAgIFZhbGlkU2FtcGxlSUQ7CisKKyAgICAgICAgY2hhciogICAgICAgICAgU291cmNlOyAgICAgICAgICAgICAgICAvLyBQb2ludHMgdG8gbG9jLiBiZWluZyBwYXJzZWQKKyAgICAgICAgY21zSW50MzJOdW1iZXIgbGluZW5vOyAgICAgICAgICAgICAgICAvLyBsaW5lIGNvdW50ZXIgZm9yIGVycm9yIHJlcG9ydGluZworCisgICAgICAgIEZJTEVDVFgqICAgICAgIEZpbGVTdGFja1tNQVhJTkNMVURFXTsgLy8gU3RhY2sgb2YgZmlsZXMgYmVpbmcgcGFyc2VkCisgICAgICAgIGNtc0ludDMyTnVtYmVyIEluY2x1ZGVTUDsgICAgICAgICAgICAgLy8gSW5jbHVkZSBTdGFjayBQb2ludGVyCisKKyAgICAgICAgY2hhciogICAgICAgICAgTWVtb3J5QmxvY2s7ICAgICAgICAgICAvLyBUaGUgc3RyZWFtIGlmIGhvbGRlZCBpbiBtZW1vcnkKKworICAgICAgICBjaGFyICAgICAgICAgICBEb3VibGVGb3JtYXR0ZXJbTUFYSURdOy8vIFByaW50Zi1saWtlICdjbXNGbG9hdDY0TnVtYmVyJyBmb3JtYXR0ZXIKKworICAgICAgICBjbXNDb250ZXh0ICAgIENvbnRleHRJRDsgICAgICAgICAgICAgIC8vIFRoZSB0aHJlYWRpbmcgY29udGV4dAorCisgICB9IGNtc0lUODsKKworCisvLyBUaGUgc3RyZWFtIGZvciBzYXZlIG9wZXJhdGlvbnMKK3R5cGVkZWYgc3RydWN0IHsKKworICAgICAgICBGSUxFKiBzdHJlYW07ICAgLy8gRm9yIHNhdmUtdG8tZmlsZSBiZWhhdmlvdXIKKworICAgICAgICBjbXNVSW50OE51bWJlciogQmFzZTsKKyAgICAgICAgY21zVUludDhOdW1iZXIqIFB0cjsgICAgICAgIC8vIEZvciBzYXZlLXRvLW1lbSBiZWhhdmlvdXIKKyAgICAgICAgY21zVUludDMyTnVtYmVyIFVzZWQ7CisgICAgICAgIGNtc1VJbnQzMk51bWJlciBNYXg7CisKKyAgICB9IFNBVkVTVFJFQU07CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNtc0lUOCBwYXJzaW5nIHJvdXRpbmVzCisKKworLy8gQSBrZXl3b3JkCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICAgICAgY29uc3QgY2hhciAqaWQ7CisgICAgICAgIFNZTUJPTCBzeTsKKworICAgfSBLRVlXT1JEOworCisvLyBUaGUga2V5d29yZC0+c3ltYm9sIHRyYW5zbGF0aW9uIHRhYmxlLiBTb3J0aW5nIGlzIHJlcXVpcmVkLgorc3RhdGljIGNvbnN0IEtFWVdPUkQgVGFiS2V5c1tdID0geworCisgICAgICAgIHsiJElOQ0xVREUiLCAgICAgICAgICAgICAgIFNJTkNMVURFfSwgICAvLyBUaGlzIGlzIGFuIGV4dGVuc2lvbiEKKyAgICAgICAgeyIuSU5DTFVERSIsICAgICAgICAgICAgICAgU0lOQ0xVREV9LCAgIC8vIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIQorCisgICAgICAgIHsiQkVHSU5fREFUQSIsICAgICAgICAgICAgIFNCRUdJTl9EQVRBIH0sCisgICAgICAgIHsiQkVHSU5fREFUQV9GT1JNQVQiLCAgICAgIFNCRUdJTl9EQVRBX0ZPUk1BVCB9LAorICAgICAgICB7IkRBVEFfRk9STUFUX0lERU5USUZJRVIiLCBTREFUQV9GT1JNQVRfSUR9LAorICAgICAgICB7IkVORF9EQVRBIiwgICAgICAgICAgICAgICBTRU5EX0RBVEF9LAorICAgICAgICB7IkVORF9EQVRBX0ZPUk1BVCIsICAgICAgICBTRU5EX0RBVEFfRk9STUFUfSwKKyAgICAgICAgeyJLRVlXT1JEIiwgICAgICAgICAgICAgICAgU0tFWVdPUkR9CisgICAgICAgIH07CisKKyNkZWZpbmUgTlVNS0VZUyAoc2l6ZW9mKFRhYktleXMpL3NpemVvZihLRVlXT1JEKSkKKworLy8gUHJlZGVmaW5lZCBwcm9wZXJ0aWVzCisKKy8vIEEgcHJvcGVydHkKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciAqaWQ7ICAgIC8vIFRoZSBpZGVudGlmaWVyCisgICAgICAgIFdSSVRFTU9ERSBhczsgICAgICAvLyBIb3cgaXMgc3VwcG9zZWQgdG8gYmUgd3JpdHRlbgorICAgIH0gUFJPUEVSVFk7CisKK3N0YXRpYyBQUk9QRVJUWSBQcmVkZWZpbmVkUHJvcGVydGllc1tdID0geworCisgICAgICAgIHsiTlVNQkVSX09GX0ZJRUxEUyIsIFdSSVRFX1VOQ09PS0VEfSwgICAgLy8gUmVxdWlyZWQgLSBOVU1CRVIgT0YgRklFTERTCisgICAgICAgIHsiTlVNQkVSX09GX1NFVFMiLCAgIFdSSVRFX1VOQ09PS0VEfSwgICAgLy8gUmVxdWlyZWQgLSBOVU1CRVIgT0YgU0VUUworICAgICAgICB7Ik9SSUdJTkFUT1IiLCAgICAgICBXUklURV9TVFJJTkdJRll9LCAgIC8vIFJlcXVpcmVkIC0gSWRlbnRpZmllcyB0aGUgc3BlY2lmaWMgc3lzdGVtLCBvcmdhbml6YXRpb24gb3IgaW5kaXZpZHVhbCB0aGF0IGNyZWF0ZWQgdGhlIGRhdGEgZmlsZS4KKyAgICAgICAgeyJGSUxFX0RFU0NSSVBUT1IiLCAgV1JJVEVfU1RSSU5HSUZZfSwgICAvLyBSZXF1aXJlZCAtIERlc2NyaWJlcyB0aGUgcHVycG9zZSBvciBjb250ZW50cyBvZiB0aGUgZGF0YSBmaWxlLgorICAgICAgICB7IkNSRUFURUQiLCAgICAgICAgICBXUklURV9TVFJJTkdJRll9LCAgIC8vIFJlcXVpcmVkIC0gSW5kaWNhdGVzIGRhdGUgb2YgY3JlYXRpb24gb2YgdGhlIGRhdGEgZmlsZS4KKyAgICAgICAgeyJERVNDUklQVE9SIiwgICAgICAgV1JJVEVfU1RSSU5HSUZZfSwgICAvLyBSZXF1aXJlZCAgLSBEZXNjcmliZXMgdGhlIHB1cnBvc2Ugb3IgY29udGVudHMgb2YgdGhlIGRhdGEgZmlsZS4KKyAgICAgICAgeyJESUZGVVNFX0dFT01FVFJZIiwgV1JJVEVfU1RSSU5HSUZZfSwgICAvLyBUaGUgZGlmZnVzZSBnZW9tZXRyeSB1c2VkLiBBbGxvd2VkIHZhbHVlcyBhcmUgInNwaGVyZSIgb3IgIm9wYWwiLgorICAgICAgICB7Ik1BTlVGQUNUVVJFUiIsICAgICBXUklURV9TVFJJTkdJRll9LAorICAgICAgICB7Ik1BTlVGQUNUVVJFIiwgICAgICBXUklURV9TVFJJTkdJRll9LCAgIC8vIFNvbWUgYnJva2VuIEZ1amkgdGFyZ2V0cyBkb2VzIHN0b3JlIHRoaXMgdmFsdWUKKyAgICAgICAgeyJQUk9EX0RBVEUiLCAgICAgICAgV1JJVEVfU1RSSU5HSUZZfSwgICAvLyBJZGVudGlmaWVzIHllYXIgYW5kIG1vbnRoIG9mIHByb2R1Y3Rpb24gb2YgdGhlIHRhcmdldCBpbiB0aGUgZm9ybSB5eXl5Om1tLgorICAgICAgICB7IlNFUklBTCIsICAgICAgICAgICBXUklURV9TVFJJTkdJRll9LCAgIC8vIFVuaXF1ZWx5IGlkZW50aWZpZXMgaW5kaXZpZHVhbCBwaHlzaWNhbCB0YXJnZXQuCisKKyAgICAgICAgeyJNQVRFUklBTCIsICAgICAgICAgV1JJVEVfU1RSSU5HSUZZfSwgICAvLyBJZGVudGlmaWVzIHRoZSBtYXRlcmlhbCBvbiB3aGljaCB0aGUgdGFyZ2V0IHdhcyBwcm9kdWNlZCB1c2luZyBhIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmlxdWVseSBpZGVudGlmeWluZyB0aCBlIG1hdGVyaWFsLiBUaGlzIGlzIGludGVuZCBlZCB0byBiZSB1c2VkIGZvciBJVDguNworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBoeXNpY2FsIHRhcmdldHMgb25seSAoaS5lIC4gSVQ4LjcvMSBhIG5kIElUOC43LzIpLgorCisgICAgICAgIHsiSU5TVFJVTUVOVEFUSU9OIiwgIFdSSVRFX1NUUklOR0lGWX0sICAgLy8gVXNlZCB0byByZXBvcnQgdGhlIHNwZWNpZmljIGluc3RydW1lbnRhdGlvbiB1c2VkIChtYW51ZmFjdHVyZXIgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9kZWwgbnVtYmVyKSB0byBnZW5lcmF0ZSB0aGUgZGF0YSByZXBvcnRlZC4gVGhpcyBkYXRhIHdpbGwgb2Z0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm92aWRlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhcnRpY3VsYXIgZGF0YSBjb2xsZWN0ZWQgdGhhbiBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4dGVuc2l2ZSBsaXN0IG9mIHNwZWNpZmljIGRldGFpbHMuIFRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjdHJhbCBkYXRhIG9yIGRhdGEgZGVyaXZlZCBmcm9tIHNwZWN0cm9waG90b21ldHJ5LgorCisgICAgICAgIHsiTUVBU1VSRU1FTlRfU09VUkNFIiwgV1JJVEVfU1RSSU5HSUZZfSwgLy8gSWxsdW1pbmF0aW9uIHVzZWQgZm9yIHNwZWN0cmFsIG1lYXN1cmVtZW50cy4gVGhpcyBkYXRhIGhlbHBzIHByb3ZpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGd1aWRlIHRvIHRoZSBwb3RlbnRpYWwgZm9yIGlzc3VlcyBvZiBwYXBlciBmbHVvcmVzY2VuY2UsIGV0Yy4KKworICAgICAgICB7IlBSSU5UX0NPTkRJVElPTlMiLCBXUklURV9TVFJJTkdJRll9LCAgIC8vIFVzZWQgdG8gZGVmaW5lIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHByaW50ZWQgc2hlZXQgYmVpbmcgcmVwb3J0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlcmUgc3RhbmRhcmQgY29uZGl0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCAoZS5nLiwgU1dPUCBhdCBub21pbmFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hbWVkIGNvbmRpdGlvbnMgbWF5IHN1ZmZpY2UuIE90aGVyd2lzZSwgZGV0YWlsZWQgaW5mb3JtYXRpb24gaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkZWQuCisKKyAgICAgICAgeyJTQU1QTEVfQkFDS0lORyIsICAgV1JJVEVfU1RSSU5HSUZZfSwgICAvLyBJZGVudGlmaWVzIHRoZSBiYWNraW5nIG1hdGVyaWFsIHVzZWQgYmVoaW5kIHRoZSBzYW1wbGUgZHVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVhc3VyZW1lbnQuIEFsbG93ZWQgdmFsdWVzIGFyZSAiYmxhY2siICJ3aGl0ZSIgb3IgIm5hIi4KKworICAgICAgICB7IkNISVNRX0RPRiIsICAgICAgICBXUklURV9TVFJJTkdJRll9LCAgIC8vIERlZ3JlZXMgb2YgZnJlZWRvbSBhc3NvY2lhdGVkIHdpdGggdGhlIENoaSBzcXVhcmVkIHN0YXRpc3RpYworCisgICAgICAgLy8gYmVsb3cgcHJvcGVydGllcyBhcmUgbmV3IGluIHJlY2VudCBzcGVjczoKKworICAgICAgICB7Ik1FQVNVUkVNRU5UX0dFT01FVFJZIiwgV1JJVEVfU1RSSU5HSUZZfSwgLy8gVGhlIHR5cGUgb2YgbWVhc3VyZW1lbnQsIGVpdGhlciByZWZsZWN0aW9uIG9yIHRyYW5zbWlzc2lvbiwgc2hvdWxkIGJlIGluZGljYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsb25nIHdpdGggZGV0YWlscyBvZiB0aGUgZ2VvbWV0cnkgYW5kIHRoZSBhcGVydHVyZSBzaXplIGFuZCBzaGFwZS4gRm9yIGV4YW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRyYW5zbWlzc2lvbiBtZWFzdXJlbWVudHMgaXQgaXMgaW1wb3J0YW50IHRvIGlkZW50aWZ5IDAvZGlmZnVzZSwgZGlmZnVzZS8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wYWwgb3IgaW50ZWdyYXRpbmcgc3BoZXJlLCBldGMuIEZvciByZWZsZWN0aW9uIGl0IGlzIGltcG9ydGFudCB0byBpZGVudGlmeSAwLzQ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQ1LzAsIHNwaGVyZSAoc3BlY3VsYXIgaW5jbHVkZWQgb3IgZXhjbHVkZWQpLCBldGMuCisKKyAgICAgICB7IkZJTFRFUiIsICAgICAgICAgICAgV1JJVEVfU1RSSU5HSUZZfSwgICAvLyBJZGVudGlmaWVzIHRoZSB1c2Ugb2YgcGh5c2ljYWwgZmlsdGVyKHMpIGR1cmluZyBtZWFzdXJlbWVudC4gVHlwaWNhbGx5IHVzZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZW5vdGUgdGhlIHVzZSBvZiBmaWx0ZXJzIHN1Y2ggYXMgbm9uZSwgRDY1LCBSZWQsIEdyZWVuIG9yIEJsdWUuCisKKyAgICAgICB7IlBPTEFSSVpBVElPTiIsICAgICAgV1JJVEVfU1RSSU5HSUZZfSwgICAvLyBJZGVudGlmaWVzIHRoZSB1c2Ugb2YgYSBwaHlzaWNhbCBwb2xhcml6YXRpb24gZmlsdGVyIGR1cmluZyBtZWFzdXJlbWVudC4gQWxsb3dlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlcyBhcmUgInllcyIgIndoaXRlIiAibm9uZSIgb3IgIm5hIi4KKworICAgICAgIHsiV0VJR0hUSU5HX0ZVTkNUSU9OIiwgV1JJVEVfUEFJUn0sICAgLy8gSW5kaWNhdGVzIHN1Y2ggZnVuY3Rpb25zIGFzOiB0aGUgQ0lFIHN0YW5kYXJkIG9ic2VydmVyIGZ1bmN0aW9ucyB1c2VkIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0aW9uIG9mIHZhcmlvdXMgZGF0YSBwYXJhbWV0ZXJzICgyIGRlZ3JlZSBhbmQgMTAgZGVncmVlKSwgQ0lFIHN0YW5kYXJkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWxsdW1pbmFudCBmdW5jdGlvbnMgdXNlZCBpbiB0aGUgY2FsY3VsYXRpb24gb2YgdmFyaW91cyBkYXRhIHBhcmFtZXRlcnMgKGUuZy4sIEQ1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBENjUsIGV0Yy4pLCBkZW5zaXR5IHN0YXR1cyByZXNwb25zZSwgZXRjLiBJZiB1c2VkIHRoZXJlIHNoYWxsIGJlIGF0IGxlYXN0IG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hbWUtdmFsdWUgcGFpciBmb2xsb3dpbmcgdGhlIFdFSUdIVElOR19GVU5DVElPTiB0YWcva2V5d29yZC4gVGhlIGZpcnN0IGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBzZXQgc2hhbGwgYmUgeyJuYW1lIiBhbmQgc2hhbGwgaWRlbnRpZnkgdGhlIHBhcnRpY3VsYXIgcGFyYW1ldGVyIHVzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHNlY29uZCBzaGFsbCBiZSB7InZhbHVlIiBhbmQgc2hhbGwgcHJvdmlkZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgbmFtZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgQVNDSUkgZGF0YSwgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgTmFtZSBhbmQgVmFsdWUgYXR0cmlidXRlIHBhaXJzIHNoYWxsIGZvbGxvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB3ZWlnaHRpbmcgZnVuY3Rpb24ga2V5d29yZC4gQSBzZW1pLWNvbG9uIHNlcGFyYXRlcyBhdHRyaWJ1dGUgcGFpcnMgZnJvbSBlYWNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXIgYW5kIHdpdGhpbiB0aGUgYXR0cmlidXRlIHRoZSBuYW1lIGFuZCB2YWx1ZSBhcmUgc2VwYXJhdGVkIGJ5IGEgY29tbWEuCisKKyAgICAgICB7IkNPTVBVVEFUSU9OQUxfUEFSQU1FVEVSIiwgV1JJVEVfUEFJUn0sIC8vIFBhcmFtZXRlciB0aGF0IGlzIHVzZWQgaW4gY29tcHV0aW5nIGEgdmFsdWUgZnJvbSBtZWFzdXJlZCBkYXRhLiBOYW1lIGlzIHRoZSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgdGhlIGNhbGN1bGF0aW9uLCBwYXJhbWV0ZXIgaXMgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB1c2VkIGluIHRoZSBjYWxjdWxhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB2YWx1ZSBpcyB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KKworICAgICAgIHsiVEFSR0VUX1RZUEUiLCAgICAgICAgV1JJVEVfU1RSSU5HSUZZfSwgIC8vIFRoZSB0eXBlIG9mIHRhcmdldCBiZWluZyBtZWFzdXJlZCwgZS5nLiBJVDguNy8xLCBJVDguNy8zLCB1c2VyIGRlZmluZWQsIGV0Yy4KKworICAgICAgIHsiQ09MT1JBTlQiLCAgICAgICAgICAgV1JJVEVfU1RSSU5HSUZZfSwgIC8vIElkZW50aWZpZXMgdGhlIGNvbG9yYW50KHMpIHVzZWQgaW4gY3JlYXRpbmcgdGhlIHRhcmdldC4KKworICAgICAgIHsiVEFCTEVfREVTQ1JJUFRPUiIsICAgV1JJVEVfU1RSSU5HSUZZfSwgIC8vIERlc2NyaWJlcyB0aGUgcHVycG9zZSBvciBjb250ZW50cyBvZiBhIGRhdGEgdGFibGUuCisKKyAgICAgICB7IlRBQkxFX05BTUUiLCAgICAgICAgIFdSSVRFX1NUUklOR0lGWX0gICAvLyBQcm92aWRlcyBhIHNob3J0IG5hbWUgZm9yIGEgZGF0YSB0YWJsZS4KK307CisKKyNkZWZpbmUgTlVNUFJFREVGSU5FRFBST1BTIChzaXplb2YoUHJlZGVmaW5lZFByb3BlcnRpZXMpL3NpemVvZihQUk9QRVJUWSkpCisKKworLy8gUHJlZGVmaW5lZCBzYW1wbGUgdHlwZXMgb24gZGF0YXNldAorc3RhdGljIGNvbnN0IGNoYXIqIFByZWRlZmluZWRTYW1wbGVJRFtdID0geworICAgICAgICAiU0FNUExFX0lEIiwgICAgICAvLyBJZGVudGlmaWVzIHNhbXBsZSB0aGF0IGRhdGEgcmVwcmVzZW50cworICAgICAgICAiU1RSSU5HIiwgICAgICAgICAvLyBJZGVudGlmaWVzIGxhYmVsLCBvciBvdGhlciBub24tbWFjaGluZSByZWFkYWJsZSB2YWx1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFsdWUgbXVzdCBiZWdpbiBhbmQgZW5kIHdpdGggYSAiIHN5bWJvbAorCisgICAgICAgICJDTVlLX0MiLCAgICAgICAgIC8vIEN5YW4gY29tcG9uZW50IG9mIENNWUsgZGF0YSBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlCisgICAgICAgICJDTVlLX00iLCAgICAgICAgIC8vIE1hZ2VudGEgY29tcG9uZW50IG9mIENNWUsgZGF0YSBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlCisgICAgICAgICJDTVlLX1kiLCAgICAgICAgIC8vIFllbGxvdyBjb21wb25lbnQgb2YgQ01ZSyBkYXRhIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UKKyAgICAgICAgIkNNWUtfSyIsICAgICAgICAgLy8gQmxhY2sgY29tcG9uZW50IG9mIENNWUsgZGF0YSBleHByZXNzZWQgYXMgYSBwZXJjZW50YWdlCisgICAgICAgICJEX1JFRCIsICAgICAgICAgIC8vIFJlZCBmaWx0ZXIgZGVuc2l0eQorICAgICAgICAiRF9HUkVFTiIsICAgICAgICAvLyBHcmVlbiBmaWx0ZXIgZGVuc2l0eQorICAgICAgICAiRF9CTFVFIiwgICAgICAgICAvLyBCbHVlIGZpbHRlciBkZW5zaXR5CisgICAgICAgICJEX1ZJUyIsICAgICAgICAgIC8vIFZpc3VhbCBmaWx0ZXIgZGVuc2l0eQorICAgICAgICAiRF9NQUpPUl9GSUxURVIiLCAvLyBNYWpvciBmaWx0ZXIgZCBlbnNpdHkKKyAgICAgICAgIlJHQl9SIiwgICAgICAgICAgLy8gUmVkIGNvbXBvbmVudCBvZiBSR0IgZGF0YQorICAgICAgICAiUkdCX0ciLCAgICAgICAgICAvLyBHcmVlbiBjb21wb25lbnQgb2YgUkdCIGRhdGEKKyAgICAgICAgIlJHQl9CIiwgICAgICAgICAgLy8gQmx1ZSBjb20gcG9uZW50IG9mIFJHQiBkYXRhCisgICAgICAgICJTUEVDVFJBTF9OTSIsICAgIC8vIFdhdmVsZW5ndGggb2YgbWVhc3VyZW1lbnQgZXhwcmVzc2VkIGluIG5hbm9tZXRlcnMKKyAgICAgICAgIlNQRUNUUkFMX1BDVCIsICAgLy8gUGVyY2VudGFnZSByZWZsZWN0YW5jZS90cmFuc21pdHRhbmNlCisgICAgICAgICJTUEVDVFJBTF9ERUMiLCAgIC8vIFJlZmxlY3RhbmNlL3RyYW5zbWl0dGFuY2UKKyAgICAgICAgIlhZWl9YIiwgICAgICAgICAgLy8gWCBjb21wb25lbnQgb2YgdHJpc3RpbXVsdXMgZGF0YQorICAgICAgICAiWFlaX1kiLCAgICAgICAgICAvLyBZIGNvbXBvbmVudCBvZiB0cmlzdGltdWx1cyBkYXRhCisgICAgICAgICJYWVpfWiIsICAgICAgICAgIC8vIFogY29tcG9uZW50IG9mIHRyaXN0aW11bHVzIGRhdGEKKyAgICAgICAgIlhZWV9YIiwgICAgICAgICAgLy8geCBjb21wb25lbnQgb2YgY2hyb21hdGljaXR5IGRhdGEKKyAgICAgICAgIlhZWV9ZIiwgICAgICAgICAgLy8geSBjb21wb25lbnQgb2YgY2hyb21hdGljaXR5IGRhdGEKKyAgICAgICAgIlhZWV9DQVBZIiwgICAgICAgLy8gWSBjb21wb25lbnQgb2YgdHJpc3RpbXVsdXMgZGF0YQorICAgICAgICAiTEFCX0wiLCAgICAgICAgICAvLyBMKiBjb21wb25lbnQgb2YgTGFiIGRhdGEKKyAgICAgICAgIkxBQl9BIiwgICAgICAgICAgLy8gYSogY29tcG9uZW50IG9mIExhYiBkYXRhCisgICAgICAgICJMQUJfQiIsICAgICAgICAgIC8vIGIqIGNvbXBvbmVudCBvZiBMYWIgZGF0YQorICAgICAgICAiTEFCX0MiLCAgICAgICAgICAvLyBDKmFiIGNvbXBvbmVudCBvZiBMYWIgZGF0YQorICAgICAgICAiTEFCX0giLCAgICAgICAgICAvLyBoYWIgY29tcG9uZW50IG9mIExhYiBkYXRhCisgICAgICAgICJMQUJfREUiLCAgICAgICAgIC8vIENJRSBkRQorICAgICAgICAiTEFCX0RFXzk0IiwgICAgICAvLyBDSUUgZEUgdXNpbmcgQ0lFIDk0CisgICAgICAgICJMQUJfREVfQ01DIiwgICAgIC8vIGRFIHVzaW5nIENNQworICAgICAgICAiTEFCX0RFXzIwMDAiLCAgICAvLyBDSUUgZEUgdXNpbmcgQ0lFIERFIDIwMDAKKyAgICAgICAgIk1FQU5fREUiLCAgICAgICAgLy8gTWVhbiBEZWx0YSBFIChMQUJfREUpIG9mIHNhbXBsZXMgY29tcGFyZWQgdG8gYmF0Y2ggYXZlcmFnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoVXNlZCBmb3IgZGF0YSBmaWxlcyBmb3IgQU5TSSBJVDguNy8xIGFuZCBJVDguNy8yIHRhcmdldHMpCisgICAgICAgICJTVERFVl9YIiwgICAgICAgIC8vIFN0YW5kYXJkIGRldmlhdGlvbiBvZiBYICh0cmlzdGltdWx1cyBkYXRhKQorICAgICAgICAiU1RERVZfWSIsICAgICAgICAvLyBTdGFuZGFyZCBkZXZpYXRpb24gb2YgWSAodHJpc3RpbXVsdXMgZGF0YSkKKyAgICAgICAgIlNUREVWX1oiLCAgICAgICAgLy8gU3RhbmRhcmQgZGV2aWF0aW9uIG9mIFogKHRyaXN0aW11bHVzIGRhdGEpCisgICAgICAgICJTVERFVl9MIiwgICAgICAgIC8vIFN0YW5kYXJkIGRldmlhdGlvbiBvZiBMKgorICAgICAgICAiU1RERVZfQSIsICAgICAgICAvLyBTdGFuZGFyZCBkZXZpYXRpb24gb2YgYSoKKyAgICAgICAgIlNUREVWX0IiLCAgICAgICAgLy8gU3RhbmRhcmQgZGV2aWF0aW9uIG9mIGIqCisgICAgICAgICJTVERFVl9ERSIsICAgICAgIC8vIFN0YW5kYXJkIGRldmlhdGlvbiBvZiBDSUUgZEUKKyAgICAgICAgIkNISV9TUURfUEFSIn07ICAgLy8gVGhlIGF2ZXJhZ2Ugb2YgdGhlIHN0YW5kYXJkIGRldmlhdGlvbnMgb2YgTCosIGEqIGFuZCBiKi4gSXQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCB0byBkZXJpdmUgYW4gZXN0aW1hdGUgb2YgdGhlIGNoaS1zcXVhcmVkIHBhcmFtZXRlciB3aGljaCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvbW1lbmRlZCBhcyB0aGUgcHJlZGljdG9yIG9mIHRoZSB2YXJpYWJpbGl0eSBvZiBkRQorCisjZGVmaW5lIE5VTVBSRURFRklORURTQU1QTEVJRCAoc2l6ZW9mKFByZWRlZmluZWRTYW1wbGVJRCkvc2l6ZW9mKGNoYXIgKikpCisKKy8vRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBzb21lIGludGVybmFsIGZ1bmN0aW9ucworc3RhdGljIHZvaWQqIEFsbG9jQ2h1bmsoY21zSVQ4KiBpdDgsIGNtc1VJbnQzMk51bWJlciBzaXplKTsKKworLy8gQ2hlY2tzIHdoYXRldmVyIGMgaXMgYSBzZXBhcmF0b3IKK3N0YXRpYworY21zQm9vbCBpc3NlcGFyYXRvcihpbnQgYykKK3sKKyAgICByZXR1cm4gKGMgPT0gJyAnKSB8fCAoYyA9PSAnXHQnKSA7IAorfQorCisvLyBDaGVja3Mgd2hhdGV2ZXIgYyBpcyBhIHZhbGlkIGlkZW50aWZpZXIgY2hhcgorc3RhdGljCitjbXNCb29sIGlzbWlkZGxlKGludCBjKQoreworICAgcmV0dXJuICghaXNzZXBhcmF0b3IoYykgJiYgKGMgIT0gJyMnKSAmJiAoYyAhPSdcIicpICYmIChjICE9ICdcJycpICYmIChjID4gMzIpICYmIChjIDwgMTI3KSk7Cit9CisKKy8vIENoZWNrcyB3aGF0c2V2ZXIgYyBpcyBhIHZhbGlkIGlkZW50aWZpZXIgbWlkZGxlIGNoYXIuCitzdGF0aWMKK2Ntc0Jvb2wgaXNpZGNoYXIoaW50IGMpCit7CisgICByZXR1cm4gaXNhbG51bShjKSB8fCBpc21pZGRsZShjKTsKK30KKworLy8gQ2hlY2tzIHdoYXRzZXZlciBjIGlzIGEgdmFsaWQgaWRlbnRpZmllciBmaXJzdCBjaGFyLgorc3RhdGljCitjbXNCb29sIGlzZmlyc3RpZGNoYXIoaW50IGMpCit7CisgICAgIHJldHVybiAhaXNkaWdpdChjKSAmJiBpc21pZGRsZShjKTsKK30KKworLy8gR3Vlc3Mgd2hldGhlciB0aGUgc3VwcGxpZWQgcGF0aCBsb29rcyBsaWtlIGFuIGFic29sdXRlIHBhdGgKK3N0YXRpYworY21zQm9vbCBpc2Fic29sdXRlcGF0aChjb25zdCBjaGFyICpwYXRoKQoreworICAgIGNoYXIgVGhyZWVDaGFyc1s0XTsKKworICAgIGlmKHBhdGggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmIChwYXRoWzBdID09IDApCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHN0cm5jcHkoVGhyZWVDaGFycywgcGF0aCwgMyk7CisgICAgVGhyZWVDaGFyc1szXSA9IDA7CisKKyAgICBpZihUaHJlZUNoYXJzWzBdID09IERJUl9DSEFSKQorICAgICAgICByZXR1cm4gVFJVRTsKKworI2lmZGVmICBDTVNfSVNfV0lORE9XU18KKyAgICBpZiAoaXNhbHBoYSgoaW50KSBUaHJlZUNoYXJzWzBdKSAmJiBUaHJlZUNoYXJzWzFdID09ICc6JykKKyAgICAgICAgcmV0dXJuIFRSVUU7CisjZW5kaWYKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKworLy8gTWFrZXMgYSBmaWxlIHBhdGggYmFzZWQgb24gYSBnaXZlbiByZWZlcmVuY2UgcGF0aAorLy8gTk9URTogdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGNoZWNrIGlmIHRoZSBwYXRoIGV4aXN0cyBvciBldmVuIGlmIGl0J3MgbGVnYWwKK3N0YXRpYworY21zQm9vbCBCdWlsZEFic29sdXRlUGF0aChjb25zdCBjaGFyICpyZWxQYXRoLCBjb25zdCBjaGFyICpiYXNlUGF0aCwgY2hhciAqYnVmZmVyLCBjbXNVSW50MzJOdW1iZXIgTWF4TGVuKQoreworICAgIGNoYXIgKnRhaWw7CisgICAgY21zVUludDMyTnVtYmVyIGxlbjsKKworICAgIC8vIEFscmVhZHkgYWJzb2x1dGU/CisgICAgaWYgKGlzYWJzb2x1dGVwYXRoKHJlbFBhdGgpKSB7CisKKyAgICAgICAgc3RybmNweShidWZmZXIsIHJlbFBhdGgsIE1heExlbik7CisgICAgICAgIGJ1ZmZlcltNYXhMZW4tMV0gPSAwOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICAvLyBObywgc2VhcmNoIGZvciBsYXN0CisgICAgc3RybmNweShidWZmZXIsIGJhc2VQYXRoLCBNYXhMZW4pOworICAgIGJ1ZmZlcltNYXhMZW4tMV0gPSAwOworCisgICAgdGFpbCA9IHN0cnJjaHIoYnVmZmVyLCBESVJfQ0hBUik7CisgICAgaWYgKHRhaWwgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOyAgICAvLyBJcyBub3QgYWJzb2x1dGUgYW5kIGhhcyBubyBzZXBhcmF0b3JzPz8KKworICAgIGxlbiA9IChjbXNVSW50MzJOdW1iZXIpICh0YWlsIC0gYnVmZmVyKTsKKyAgICBpZiAobGVuID49IE1heExlbikgcmV0dXJuIEZBTFNFOworCisgICAgLy8gTm8gbmVlZCB0byBhc3N1cmUgemVybyB0ZXJtaW5hdG9yIG92ZXIgaGVyZQorICAgIHN0cm5jcHkodGFpbCArIDEsIHJlbFBhdGgsIE1heExlbiAtIGxlbik7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLyBNYWtlIHN1cmUgbm8gZXhwbG9pdCBpcyBiZWluZyBldmVuIHRyaWVkCitzdGF0aWMKK2NvbnN0IGNoYXIqIE5vTWV0YShjb25zdCBjaGFyKiBzdHIpCit7CisgICAgaWYgKHN0cmNocihzdHIsICclJykgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuICIqKioqIENPUlJVUFRFRCBGT1JNQVQgU1RSSU5HICoqKiI7CisKKyAgICByZXR1cm4gc3RyOworfQorCisvLyBTeW50YXggZXJyb3IKK3N0YXRpYworY21zQm9vbCBTeW5FcnJvcihjbXNJVDgqIGl0OCwgY29uc3QgY2hhciAqVHh0LCAuLi4pCit7CisgICAgY2hhciBCdWZmZXJbMjU2XSwgRXJyTXNnWzEwMjRdOworICAgIHZhX2xpc3QgYXJnczsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIFR4dCk7CisgICAgdnNucHJpbnRmKEJ1ZmZlciwgMjU1LCBUeHQsIGFyZ3MpOworICAgIEJ1ZmZlclsyNTVdID0gMDsKKyAgICB2YV9lbmQoYXJncyk7CisKKyAgICBzbnByaW50ZihFcnJNc2csIDEwMjMsICIlczogTGluZSAlZCwgJXMiLCBpdDgtPkZpbGVTdGFja1tpdDggLT5JbmNsdWRlU1BdLT5GaWxlTmFtZSwgaXQ4LT5saW5lbm8sIEJ1ZmZlcik7CisgICAgRXJyTXNnWzEwMjNdID0gMDsKKyAgICBpdDgtPnN5ID0gU1NZTkVSUk9SOworICAgIGNtc1NpZ25hbEVycm9yKGl0OCAtPkNvbnRleHRJRCwgY21zRVJST1JfQ09SUlVQVElPTl9ERVRFQ1RFRCwgIiVzIiwgRXJyTXNnKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8vIENoZWNrIGlmIGN1cnJlbnQgc3ltYm9sIGlzIHNhbWUgYXMgc3BlY2lmaWVkLiBpc3N1ZSBhbiBlcnJvciBlbHNlLgorc3RhdGljCitjbXNCb29sIENoZWNrKGNtc0lUOCogaXQ4LCBTWU1CT0wgc3ksIGNvbnN0IGNoYXIqIEVycikKK3sKKyAgICAgICAgaWYgKGl0OCAtPiBzeSAhPSBzeSkKKyAgICAgICAgICAgICAgICByZXR1cm4gU3luRXJyb3IoaXQ4LCBOb01ldGEoRXJyKSk7CisgICAgICAgIHJldHVybiBUUlVFOworfQorCisvLyBSZWFkIE5leHQgY2hhcmFjdGVyIGZyb20gc3RyZWFtCitzdGF0aWMKK3ZvaWQgTmV4dENoKGNtc0lUOCogaXQ4KQoreworICAgIGlmIChpdDggLT4gRmlsZVN0YWNrW2l0OCAtPkluY2x1ZGVTUF0tPlN0cmVhbSkgeworCisgICAgICAgIGl0OCAtPmNoID0gZmdldGMoaXQ4IC0+RmlsZVN0YWNrW2l0OCAtPkluY2x1ZGVTUF0tPlN0cmVhbSk7CisKKyAgICAgICAgaWYgKGZlb2YoaXQ4IC0+IEZpbGVTdGFja1tpdDggLT5JbmNsdWRlU1BdLT5TdHJlYW0pKSAgeworCisgICAgICAgICAgICBpZiAoaXQ4IC0+SW5jbHVkZVNQID4gMCkgeworCisgICAgICAgICAgICAgICAgZmNsb3NlKGl0OCAtPkZpbGVTdGFja1tpdDgtPkluY2x1ZGVTUC0tXS0+U3RyZWFtKTsKKyAgICAgICAgICAgICAgICBpdDggLT4gY2ggPSAnICc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoaXRlc3BhY2UgdG8gYmUgaWdub3JlZAorCisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBpdDggLT5jaCA9IDA7ICAgLy8gRU9GCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGl0OC0+Y2ggPSAqaXQ4LT5Tb3VyY2U7CisgICAgICAgIGlmIChpdDgtPmNoKSBpdDgtPlNvdXJjZSsrOworICAgIH0KK30KKworCisvLyBUcnkgdG8gc2VlIGlmIGN1cnJlbnQgaWRlbnRpZmllciBpcyBhIGtleXdvcmQsIGlmIHNvIHJldHVybiB0aGUgcmVmZXJyZWQgc3ltYm9sCitzdGF0aWMKK1NZTUJPTCBCaW5TcmNoS2V5KGNvbnN0IGNoYXIgKmlkKQoreworICAgIGludCBsID0gMTsKKyAgICBpbnQgciA9IE5VTUtFWVM7CisgICAgaW50IHgsIHJlczsKKworICAgIHdoaWxlIChyID49IGwpCisgICAgeworICAgICAgICB4ID0gKGwrcikvMjsKKyAgICAgICAgcmVzID0gY21zc3RyY2FzZWNtcChpZCwgVGFiS2V5c1t4LTFdLmlkKTsKKyAgICAgICAgaWYgKHJlcyA9PSAwKSByZXR1cm4gVGFiS2V5c1t4LTFdLnN5OworICAgICAgICBpZiAocmVzIDwgMCkgciA9IHggLSAxOworICAgICAgICBlbHNlIGwgPSB4ICsgMTsKKyAgICB9CisKKyAgICByZXR1cm4gU1VOREVGSU5FRDsKK30KKworCisvLyAxMCBebgorc3RhdGljCitjbXNGbG9hdDY0TnVtYmVyIHhwb3cxMChpbnQgbikKK3sKKyAgICByZXR1cm4gcG93KDEwLCAoY21zRmxvYXQ2NE51bWJlcikgbik7Cit9CisKKworLy8gIFJlYWRzIGEgUmVhbCBudW1iZXIsIHRyaWVzIHRvIGZvbGxvdyBmcm9tIGludGVnZXIgbnVtYmVyCitzdGF0aWMKK3ZvaWQgUmVhZFJlYWwoY21zSVQ4KiBpdDgsIGludCBpbnVtKQoreworICAgIGl0OC0+ZG51bSA9IChjbXNGbG9hdDY0TnVtYmVyKSBpbnVtOworCisgICAgd2hpbGUgKGlzZGlnaXQoaXQ4LT5jaCkpIHsKKworICAgICAgICBpdDgtPmRudW0gPSBpdDgtPmRudW0gKiAxMC4wICsgKGl0OC0+Y2ggLSAnMCcpOworICAgICAgICBOZXh0Q2goaXQ4KTsKKyAgICB9CisKKyAgICBpZiAoaXQ4LT5jaCA9PSAnLicpIHsgICAgICAgIC8vIERlY2ltYWwgcG9pbnQKKworICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIGZyYWMgPSAwLjA7ICAgICAgLy8gZnJhY3Rpb24KKyAgICAgICAgaW50IHByZWMgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8vIHByZWNpc2lvbgorCisgICAgICAgIE5leHRDaChpdDgpOyAgICAgICAgICAgICAgIC8vIEVhdHMgZGVjLiBwb2ludAorCisgICAgICAgIHdoaWxlIChpc2RpZ2l0KGl0OC0+Y2gpKSB7CisKKyAgICAgICAgICAgIGZyYWMgPSBmcmFjICogMTAuMCArIChpdDgtPmNoIC0gJzAnKTsKKyAgICAgICAgICAgIHByZWMrKzsKKyAgICAgICAgICAgIE5leHRDaChpdDgpOworICAgICAgICB9CisKKyAgICAgICAgaXQ4LT5kbnVtID0gaXQ4LT5kbnVtICsgKGZyYWMgLyB4cG93MTAocHJlYykpOworICAgIH0KKworICAgIC8vIEV4cG9uZW50LCBleGFtcGxlIDM0LjAwRSsyMAorICAgIGlmICh0b3VwcGVyKGl0OC0+Y2gpID09ICdFJykgeworCisgICAgICAgIGNtc0ludDMyTnVtYmVyIGU7CisgICAgICAgIGNtc0ludDMyTnVtYmVyIHNnbjsKKworICAgICAgICBOZXh0Q2goaXQ4KTsgc2duID0gMTsKKworICAgICAgICBpZiAoaXQ4LT5jaCA9PSAnLScpIHsKKworICAgICAgICAgICAgc2duID0gLTE7IE5leHRDaChpdDgpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIChpdDgtPmNoID09ICcrJykgeworCisgICAgICAgICAgICAgICAgc2duID0gKzE7CisgICAgICAgICAgICAgICAgTmV4dENoKGl0OCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGUgPSAwOworICAgICAgICAgICAgd2hpbGUgKGlzZGlnaXQoaXQ4LT5jaCkpIHsKKworICAgICAgICAgICAgICAgIGlmICgoY21zRmxvYXQ2NE51bWJlcikgZSAqIDEwTCA8IChjbXNGbG9hdDY0TnVtYmVyKSArMjE0NzQ4MzY0Ny4wKQorICAgICAgICAgICAgICAgICAgICBlID0gZSAqIDEwICsgKGl0OC0+Y2ggLSAnMCcpOworCisgICAgICAgICAgICAgICAgTmV4dENoKGl0OCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGUgPSBzZ24qZTsKKyAgICAgICAgICAgIGl0OCAtPiBkbnVtID0gaXQ4IC0+IGRudW0gKiB4cG93MTAoZSk7CisgICAgfQorfQorCisvLyBQYXJzZXMgYSBmbG9hdCBudW1iZXIKKy8vIFRoaXMgY2FuIG5vdCBjYWxsIGRpcmVjdGx5IGF0b2YgYmVjYXVzZSBpdCB1c2VzIGxvY2FsZSBkZXBlbmRlbnQKKy8vIHBhcnNpbmcsIHdoaWxlIENDTVggZmlsZXMgYWx3YXlzIHVzZSAuIGFzIGRlY2ltYWwgc2VwYXJhdG9yCitzdGF0aWMKK2Ntc0Zsb2F0NjROdW1iZXIgUGFyc2VGbG9hdE51bWJlcihjb25zdCBjaGFyICpCdWZmZXIpCit7CisgICAgY21zRmxvYXQ2NE51bWJlciBkbnVtID0gMC4wOworICAgIGludCBzaWduID0gMTsKKworICAgIC8vIGtlZXAgc2FmZQorICAgIGlmIChCdWZmZXIgPT0gTlVMTCkgcmV0dXJuIDAuMDsKKworICAgIGlmICgqQnVmZmVyID09ICctJyB8fCAqQnVmZmVyID09ICcrJykgeworCisgICAgICAgICBzaWduID0gKCpCdWZmZXIgPT0gJy0nKSA/IC0xIDogMTsKKyAgICAgICAgIEJ1ZmZlcisrOworICAgIH0KKworCisgICAgd2hpbGUgKCpCdWZmZXIgJiYgaXNkaWdpdCgoaW50KSAqQnVmZmVyKSkgeworCisgICAgICAgIGRudW0gPSBkbnVtICogMTAuMCArICgqQnVmZmVyIC0gJzAnKTsKKyAgICAgICAgaWYgKCpCdWZmZXIpIEJ1ZmZlcisrOworICAgIH0KKworICAgIGlmICgqQnVmZmVyID09ICcuJykgeworCisgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgZnJhYyA9IDAuMDsgICAgICAvLyBmcmFjdGlvbgorICAgICAgICBpbnQgcHJlYyA9IDA7ICAgICAgICAgICAgICAgICAgICAgLy8gcHJlY2lzc2lvbgorCisgICAgICAgIGlmICgqQnVmZmVyKSBCdWZmZXIrKzsKKworICAgICAgICB3aGlsZSAoKkJ1ZmZlciAmJiBpc2RpZ2l0KChpbnQpICpCdWZmZXIpKSB7CisKKyAgICAgICAgICAgIGZyYWMgPSBmcmFjICogMTAuMCArICgqQnVmZmVyIC0gJzAnKTsKKyAgICAgICAgICAgIHByZWMrKzsKKyAgICAgICAgICAgIGlmICgqQnVmZmVyKSBCdWZmZXIrKzsKKyAgICAgICAgfQorCisgICAgICAgIGRudW0gPSBkbnVtICsgKGZyYWMgLyB4cG93MTAocHJlYykpOworICAgIH0KKworICAgIC8vIEV4cG9uZW50LCBleGFtcGxlIDM0LjAwRSsyMAorICAgIGlmICgqQnVmZmVyICYmIHRvdXBwZXIoKkJ1ZmZlcikgPT0gJ0UnKSB7CisKKyAgICAgICAgaW50IGU7CisgICAgICAgIGludCBzZ247CisKKyAgICAgICAgaWYgKCpCdWZmZXIpIEJ1ZmZlcisrOworICAgICAgICBzZ24gPSAxOworCisgICAgICAgIGlmICgqQnVmZmVyID09ICctJykgeworCisgICAgICAgICAgICBzZ24gPSAtMTsKKyAgICAgICAgICAgIGlmICgqQnVmZmVyKSBCdWZmZXIrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiAoKkJ1ZmZlciA9PSAnKycpIHsKKworICAgICAgICAgICAgICAgIHNnbiA9ICsxOworICAgICAgICAgICAgICAgIGlmICgqQnVmZmVyKSBCdWZmZXIrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZSA9IDA7CisgICAgICAgICAgICB3aGlsZSAoKkJ1ZmZlciAmJiBpc2RpZ2l0KChpbnQpICpCdWZmZXIpKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoKGNtc0Zsb2F0NjROdW1iZXIpIGUgKiAxMEwgPCBJTlRfTUFYKQorICAgICAgICAgICAgICAgICAgICBlID0gZSAqIDEwICsgKCpCdWZmZXIgLSAnMCcpOworCisgICAgICAgICAgICAgICAgaWYgKCpCdWZmZXIpIEJ1ZmZlcisrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlID0gc2duKmU7CisgICAgICAgICAgICBkbnVtID0gZG51bSAqIHhwb3cxMChlKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2lnbiAqIGRudW07Cit9CisKKworLy8gUmVhZHMgbmV4dCBzeW1ib2wKK3N0YXRpYwordm9pZCBJblN5bWJvbChjbXNJVDgqIGl0OCkKK3sKKyAgICByZWdpc3RlciBjaGFyICppZHB0cjsKKyAgICByZWdpc3RlciBpbnQgazsKKyAgICBTWU1CT0wga2V5OworICAgIGludCBzbmc7CisgICAgCisgICAgZG8geworCisgICAgICAgIHdoaWxlIChpc3NlcGFyYXRvcihpdDgtPmNoKSkKKyAgICAgICAgICAgIE5leHRDaChpdDgpOworCisgICAgICAgIGlmIChpc2ZpcnN0aWRjaGFyKGl0OC0+Y2gpKSB7ICAgICAgICAgIC8vIElkZW50aWZpZXIKKworICAgICAgICAgICAgayA9IDA7CisgICAgICAgICAgICBpZHB0ciA9IGl0OC0+aWQ7CisKKyAgICAgICAgICAgIGRvIHsKKworICAgICAgICAgICAgICAgIGlmICgrK2sgPCBNQVhJRCkgKmlkcHRyKysgPSAoY2hhcikgaXQ4LT5jaDsKKworICAgICAgICAgICAgICAgIE5leHRDaChpdDgpOworCisgICAgICAgICAgICB9IHdoaWxlIChpc2lkY2hhcihpdDgtPmNoKSk7CisKKyAgICAgICAgICAgICppZHB0ciA9ICdcMCc7CisKKworICAgICAgICAgICAga2V5ID0gQmluU3JjaEtleShpdDgtPmlkKTsKKyAgICAgICAgICAgIGlmIChrZXkgPT0gU1VOREVGSU5FRCkgaXQ4LT5zeSA9IFNJREVOVDsKKyAgICAgICAgICAgIGVsc2UgaXQ4LT5zeSA9IGtleTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXMgYSBudW1iZXI/CisgICAgICAgICAgICBpZiAoaXNkaWdpdChpdDgtPmNoKSB8fCBpdDgtPmNoID09ICcuJyB8fCBpdDgtPmNoID09ICctJyB8fCBpdDgtPmNoID09ICcrJykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgc2lnbiA9IDE7CisKKyAgICAgICAgICAgICAgICBpZiAoaXQ4LT5jaCA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnbiA9IC0xOworICAgICAgICAgICAgICAgICAgICBOZXh0Q2goaXQ4KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpdDgtPmludW0gPSAwOworICAgICAgICAgICAgICAgIGl0OC0+c3kgICA9IFNJTlVNOworCisgICAgICAgICAgICAgICAgaWYgKGl0OC0+Y2ggPT0gJzAnKSB7ICAgICAgICAgIC8vIDB4bm5ubiAoSGV4YSkgb3IgMGJubm5uIChCaW5hcnkpCisKKyAgICAgICAgICAgICAgICAgICAgTmV4dENoKGl0OCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0b3VwcGVyKGl0OC0+Y2gpID09ICdYJykgeworCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgajsKKworICAgICAgICAgICAgICAgICAgICAgICAgTmV4dENoKGl0OCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXN4ZGlnaXQoaXQ4LT5jaCkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQ4LT5jaCA9IHRvdXBwZXIoaXQ4LT5jaCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0OC0+Y2ggPj0gJ0EnICYmIGl0OC0+Y2ggPD0gJ0YnKSAgaiA9IGl0OC0+Y2ggLSdBJysxMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGogPSBpdDgtPmNoIC0gJzAnOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsb25nKSBpdDgtPmludW0gKiAxNkwgPiAobG9uZykgSU5UX01BWCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bkVycm9yKGl0OCwgIkludmFsaWQgaGV4YWRlY2ltYWwgbnVtYmVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdDgtPmludW0gPSBpdDgtPmludW0gKiAxNiArIGo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV4dENoKGl0OCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAodG91cHBlcihpdDgtPmNoKSA9PSAnQicpIHsgIC8vIEJpbmFyeQorCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgajsKKworICAgICAgICAgICAgICAgICAgICAgICAgTmV4dENoKGl0OCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXQ4LT5jaCA9PSAnMCcgfHwgaXQ4LT5jaCA9PSAnMScpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9IGl0OC0+Y2ggLSAnMCc7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGxvbmcpIGl0OC0+aW51bSAqIDJMID4gKGxvbmcpIElOVF9NQVgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW5FcnJvcihpdDgsICJJbnZhbGlkIGJpbmFyeSBudW1iZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0OC0+aW51bSA9IGl0OC0+aW51bSAqIDIgKyBqOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5leHRDaChpdDgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXNkaWdpdChpdDgtPmNoKSkgeworCisgICAgICAgICAgICAgICAgICAgIGlmICgoY21zRmxvYXQ2NE51bWJlcikgaXQ4LT5pbnVtICogMTBMID4gKGNtc0Zsb2F0NjROdW1iZXIpICsyMTQ3NDgzNjQ3LjApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRSZWFsKGl0OCwgaXQ4LT5pbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0OC0+c3kgPSBTRE5VTTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0OC0+ZG51bSAqPSBzaWduOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaXQ4LT5pbnVtID0gaXQ4LT5pbnVtICogMTAgKyAoaXQ4LT5jaCAtICcwJyk7CisgICAgICAgICAgICAgICAgICAgIE5leHRDaChpdDgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpdDgtPmNoID09ICcuJykgeworCisgICAgICAgICAgICAgICAgICAgIFJlYWRSZWFsKGl0OCwgaXQ4LT5pbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgaXQ4LT5zeSA9IFNETlVNOworICAgICAgICAgICAgICAgICAgICBpdDgtPmRudW0gKj0gc2lnbjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGl0OCAtPiBpbnVtICo9IHNpZ247CisKKyAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UuIE51bWJlcnMgZm9sbG93ZWQgYnkgbGV0dGVycyBhcmUgdGFrZW4gYXMgaWRlbnRpZmllcnMKKworICAgICAgICAgICAgICAgIGlmIChpc2lkY2hhcihpdDggLT5jaCkpIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaXQ4IC0+c3kgPT0gU0lOVU0pIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYoaXQ4LT5pZCwgMTI3LCAiJWQiLCBpdDgtPmludW0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihpdDgtPmlkLCAxMjcsIGl0OCAtPkRvdWJsZUZvcm1hdHRlciwgaXQ4LT5kbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGsgPSAoaW50KSBzdHJsZW4oaXQ4IC0+aWQpOworICAgICAgICAgICAgICAgICAgICBpZHB0ciA9IGl0OCAtPmlkICsgazsKKyAgICAgICAgICAgICAgICAgICAgZG8geworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKytrIDwgTUFYSUQpICppZHB0cisrID0gKGNoYXIpIGl0OC0+Y2g7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIE5leHRDaChpdDgpOworCisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGlzaWRjaGFyKGl0OC0+Y2gpKTsKKworICAgICAgICAgICAgICAgICAgICAqaWRwdHIgPSAnXDAnOworICAgICAgICAgICAgICAgICAgICBpdDgtPnN5ID0gU0lERU5UOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKChpbnQpIGl0OC0+Y2gpIHsKKworICAgICAgICAvLyBFT0YgbWFya2VyIC0tIGlnbm9yZSBpdAorICAgICAgICBjYXNlICdceDFhJzoKKyAgICAgICAgICAgIE5leHRDaChpdDgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gRW9mIHN0cmVhbSBtYXJrZXJzCisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgIGl0OC0+c3kgPSBTRU9GOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICAvLyBOZXh0IGxpbmUKKyAgICAgICAgY2FzZSAnXHInOgorICAgICAgICAgICAgTmV4dENoKGl0OCk7CisgICAgICAgICAgICBpZiAoaXQ4IC0+Y2ggPT0gJ1xuJykgCisgICAgICAgICAgICAgICAgTmV4dENoKGl0OCk7CisgICAgICAgICAgICBpdDgtPnN5ID0gU0VPTE47CisgICAgICAgICAgICBpdDgtPmxpbmVubysrOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnXG4nOgorICAgICAgICAgICAgTmV4dENoKGl0OCk7CisgICAgICAgICAgICBpdDgtPnN5ID0gU0VPTE47CisgICAgICAgICAgICBpdDgtPmxpbmVubysrOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gQ29tbWVudAorICAgICAgICBjYXNlICcjJzoKKyAgICAgICAgICAgIE5leHRDaChpdDgpOworICAgICAgICAgICAgd2hpbGUgKGl0OC0+Y2ggJiYgaXQ4LT5jaCAhPSAnXG4nICYmIGl0OC0+Y2ggIT0gJ1xyJykKKyAgICAgICAgICAgICAgICBOZXh0Q2goaXQ4KTsKKworICAgICAgICAgICAgaXQ4LT5zeSA9IFNDT01NRU5UOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gU3RyaW5nLgorICAgICAgICBjYXNlICdcJyc6CisgICAgICAgIGNhc2UgJ1wiJzoKKyAgICAgICAgICAgIGlkcHRyID0gaXQ4LT5zdHI7CisgICAgICAgICAgICBzbmcgPSBpdDgtPmNoOworICAgICAgICAgICAgayA9IDA7CisgICAgICAgICAgICBOZXh0Q2goaXQ4KTsKKworICAgICAgICAgICAgd2hpbGUgKGsgPCBNQVhTVFIgJiYgaXQ4LT5jaCAhPSBzbmcpIHsKKworICAgICAgICAgICAgICAgIGlmIChpdDgtPmNoID09ICdcbid8fCBpdDgtPmNoID09ICdccicpIGsgPSBNQVhTVFIrMTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKmlkcHRyKysgPSAoY2hhcikgaXQ4LT5jaDsKKyAgICAgICAgICAgICAgICAgICAgTmV4dENoKGl0OCk7CisgICAgICAgICAgICAgICAgICAgIGsrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGl0OC0+c3kgPSBTU1RSSU5HOworICAgICAgICAgICAgKmlkcHRyID0gJ1wwJzsKKyAgICAgICAgICAgIE5leHRDaChpdDgpOworICAgICAgICAgICAgYnJlYWs7CisKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgU3luRXJyb3IoaXQ4LCAiVW5yZWNvZ25pemVkIGNoYXJhY3RlcjogMHgleCIsIGl0OCAtPmNoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgIH0gd2hpbGUgKGl0OC0+c3kgPT0gU0NPTU1FTlQpOworCisgICAgLy8gSGFuZGxlIHRoZSBpbmNsdWRlIHNwZWNpYWwgdG9rZW4KKworICAgIGlmIChpdDggLT4gc3kgPT0gU0lOQ0xVREUpIHsKKworICAgICAgICAgICAgICAgIEZJTEVDVFgqIEZpbGVOZXN0OworCisgICAgICAgICAgICAgICAgaWYoaXQ4IC0+IEluY2x1ZGVTUCA+PSAoTUFYSU5DTFVERS0xKSkgeworCisgICAgICAgICAgICAgICAgICAgIFN5bkVycm9yKGl0OCwgIlRvbyBtYW55IHJlY3Vyc2lvbiBsZXZlbHMiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEluU3ltYm9sKGl0OCk7CisgICAgICAgICAgICAgICAgaWYgKCFDaGVjayhpdDgsIFNTVFJJTkcsICJGaWxlbmFtZSBleHBlY3RlZCIpKSByZXR1cm47CisKKyAgICAgICAgICAgICAgICBGaWxlTmVzdCA9IGl0OCAtPiBGaWxlU3RhY2tbaXQ4IC0+IEluY2x1ZGVTUCArIDFdOworICAgICAgICAgICAgICAgIGlmKEZpbGVOZXN0ID09IE5VTEwpIHsKKworICAgICAgICAgICAgICAgICAgICBGaWxlTmVzdCA9IGl0OCAtPkZpbGVTdGFja1tpdDggLT4gSW5jbHVkZVNQICsgMV0gPSAoRklMRUNUWCopQWxsb2NDaHVuayhpdDgsIHNpemVvZihGSUxFQ1RYKSk7CisgICAgICAgICAgICAgICAgICAgIC8vaWYoRmlsZU5lc3QgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgLy8gIFRPRE86IGhvdyB0byBtYW5hZ2Ugb3V0LW9mLW1lbW9yeSBjb25kaXRpb25zPworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChCdWlsZEFic29sdXRlUGF0aChpdDgtPnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQ4LT5GaWxlU3RhY2tbaXQ4LT5JbmNsdWRlU1BdLT5GaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZU5lc3QtPkZpbGVOYW1lLCBjbXNNQVhfUEFUSC0xKSA9PSBGQUxTRSkgeworICAgICAgICAgICAgICAgICAgICBTeW5FcnJvcihpdDgsICJGaWxlIHBhdGggdG9vIGxvbmciKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEZpbGVOZXN0LT5TdHJlYW0gPSBmb3BlbihGaWxlTmVzdC0+RmlsZU5hbWUsICJydCIpOworICAgICAgICAgICAgICAgIGlmIChGaWxlTmVzdC0+U3RyZWFtID09IE5VTEwpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgU3luRXJyb3IoaXQ4LCAiRmlsZSAlcyBub3QgZm91bmQiLCBGaWxlTmVzdC0+RmlsZU5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpdDgtPkluY2x1ZGVTUCsrOworCisgICAgICAgICAgICAgICAgaXQ4IC0+Y2ggPSAnICc7CisgICAgICAgICAgICAgICAgSW5TeW1ib2woaXQ4KTsKKyAgICB9CisKK30KKworLy8gQ2hlY2tzIGVuZCBvZiBsaW5lIHNlcGFyYXRvcgorc3RhdGljCitjbXNCb29sIENoZWNrRU9MTihjbXNJVDgqIGl0OCkKK3sKKyAgICAgICAgaWYgKCFDaGVjayhpdDgsIFNFT0xOLCAiRXhwZWN0ZWQgc2VwYXJhdG9yIikpIHJldHVybiBGQUxTRTsKKyAgICAgICAgd2hpbGUgKGl0OCAtPiBzeSA9PSBTRU9MTikKKyAgICAgICAgICAgICAgICAgICAgICAgIEluU3ltYm9sKGl0OCk7CisgICAgICAgIHJldHVybiBUUlVFOworCit9CisKKy8vIFNraXAgYSBzeW1ib2wKKworc3RhdGljCit2b2lkIFNraXAoY21zSVQ4KiBpdDgsIFNZTUJPTCBzeSkKK3sKKyAgICAgICAgaWYgKGl0OC0+c3kgPT0gc3kgJiYgaXQ4LT5zeSAhPSBTRU9GKQorICAgICAgICAgICAgICAgICAgICAgICAgSW5TeW1ib2woaXQ4KTsKK30KKworCisvLyBTa2lwIG11bHRpcGxlIEVPTE4KK3N0YXRpYwordm9pZCBTa2lwRU9MTihjbXNJVDgqIGl0OCkKK3sKKyAgICB3aGlsZSAoaXQ4LT5zeSA9PSBTRU9MTikgeworICAgICAgICAgICAgIEluU3ltYm9sKGl0OCk7CisgICAgfQorfQorCisKKy8vIFJldHVybnMgYSBzdHJpbmcgaG9sZGluZyBjdXJyZW50IHZhbHVlCitzdGF0aWMKK2Ntc0Jvb2wgR2V0VmFsKGNtc0lUOCogaXQ4LCBjaGFyKiBCdWZmZXIsIGNtc1VJbnQzMk51bWJlciBtYXgsIGNvbnN0IGNoYXIqIEVycm9yVGl0bGUpCit7CisgICAgc3dpdGNoIChpdDgtPnN5KSB7CisKKyAgICBjYXNlIFNFT0xOOiAgIC8vIEVtcHR5IHZhbHVlCisgICAgICAgICAgICAgICAgICBCdWZmZXJbMF09MDsKKyAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgU0lERU5UOiAgc3RybmNweShCdWZmZXIsIGl0OC0+aWQsIG1heCk7CisgICAgICAgICAgICAgICAgICBCdWZmZXJbbWF4LTFdPTA7CisgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIFNJTlVNOiAgIHNucHJpbnRmKEJ1ZmZlciwgbWF4LCAiJWQiLCBpdDggLT4gaW51bSk7IGJyZWFrOworICAgIGNhc2UgU0ROVU06ICAgc25wcmludGYoQnVmZmVyLCBtYXgsIGl0OC0+RG91YmxlRm9ybWF0dGVyLCBpdDggLT4gZG51bSk7IGJyZWFrOworICAgIGNhc2UgU1NUUklORzogc3RybmNweShCdWZmZXIsIGl0OC0+c3RyLCBtYXgpOworICAgICAgICAgICAgICAgICAgQnVmZmVyW21heC0xXSA9IDA7CisgICAgICAgICAgICAgICAgICBicmVhazsKKworCisgICAgZGVmYXVsdDoKKyAgICAgICAgIHJldHVybiBTeW5FcnJvcihpdDgsICIlcyIsIEVycm9yVGl0bGUpOworICAgIH0KKworICAgIEJ1ZmZlclttYXhdID0gMDsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUYWJsZQorCitzdGF0aWMKK1RBQkxFKiBHZXRUYWJsZShjbXNJVDgqIGl0OCkKK3sKKyAgIGlmICgoaXQ4IC0+IG5UYWJsZSA+PSBpdDggLT5UYWJsZXNDb3VudCkpIHsKKworICAgICAgICAgICBTeW5FcnJvcihpdDgsICJUYWJsZSAlZCBvdXQgb2Ygc2VxdWVuY2UiLCBpdDggLT4gblRhYmxlKTsKKyAgICAgICAgICAgcmV0dXJuIGl0OCAtPiBUYWI7CisgICB9CisKKyAgIHJldHVybiBpdDggLT5UYWIgKyBpdDggLT5uVGFibGU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWVtb3J5IG1hbmFnZW1lbnQKKworCisvLyBGcmVlcyBhbiBhbGxvY2F0b3IgYW5kIG93bmVkIG1lbW9yeQordm9pZCBDTVNFWFBPUlQgY21zSVQ4RnJlZShjbXNIQU5ETEUgaElUOCkKK3sKKyAgIGNtc0lUOCogaXQ4ID0gKGNtc0lUOCopIGhJVDg7CisKKyAgICBpZiAoaXQ4ID09IE5VTEwpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChpdDgtPk1lbW9yeVNpbmspIHsKKworICAgICAgICBPV05FRE1FTSogcDsKKyAgICAgICAgT1dORURNRU0qIG47CisKKyAgICAgICAgZm9yIChwID0gaXQ4LT5NZW1vcnlTaW5rOyBwICE9IE5VTEw7IHAgPSBuKSB7CisKKyAgICAgICAgICAgIG4gPSBwLT5OZXh0OworICAgICAgICAgICAgaWYgKHAtPlB0cikgX2Ntc0ZyZWUoaXQ4IC0+Q29udGV4dElELCBwLT5QdHIpOworICAgICAgICAgICAgX2Ntc0ZyZWUoaXQ4IC0+Q29udGV4dElELCBwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpdDgtPk1lbW9yeUJsb2NrKQorICAgICAgICBfY21zRnJlZShpdDggLT5Db250ZXh0SUQsIGl0OC0+TWVtb3J5QmxvY2spOworCisgICAgX2Ntc0ZyZWUoaXQ4IC0+Q29udGV4dElELCBpdDgpOworfQorCisKKy8vIEFsbG9jYXRlcyBhIGNodW5rIG9mIGRhdGEsIGtlZXAgbGlua2VkIGxpc3QKK3N0YXRpYwordm9pZCogQWxsb2NCaWdCbG9jayhjbXNJVDgqIGl0OCwgY21zVUludDMyTnVtYmVyIHNpemUpCit7CisgICAgT1dORURNRU0qIHB0cjE7CisgICAgdm9pZCogcHRyID0gX2Ntc01hbGxvY1plcm8oaXQ4LT5Db250ZXh0SUQsIHNpemUpOworCisgICAgaWYgKHB0ciAhPSBOVUxMKSB7CisKKyAgICAgICAgcHRyMSA9IChPV05FRE1FTSopIF9jbXNNYWxsb2NaZXJvKGl0OCAtPkNvbnRleHRJRCwgc2l6ZW9mKE9XTkVETUVNKSk7CisKKyAgICAgICAgaWYgKHB0cjEgPT0gTlVMTCkgeworCisgICAgICAgICAgICBfY21zRnJlZShpdDggLT5Db250ZXh0SUQsIHB0cik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHB0cjEtPiBQdHIgICAgICAgID0gcHRyOworICAgICAgICBwdHIxLT4gTmV4dCAgICAgICA9IGl0OCAtPiBNZW1vcnlTaW5rOworICAgICAgICBpdDggLT4gTWVtb3J5U2luayA9IHB0cjE7CisgICAgfQorCisgICAgcmV0dXJuIHB0cjsKK30KKworCisvLyBTdWJhbGxvY2F0b3IuCitzdGF0aWMKK3ZvaWQqIEFsbG9jQ2h1bmsoY21zSVQ4KiBpdDgsIGNtc1VJbnQzMk51bWJlciBzaXplKQoreworICAgIGNtc1VJbnQzMk51bWJlciBGcmVlID0gaXQ4IC0+QWxsb2NhdG9yLkJsb2NrU2l6ZSAtIGl0OCAtPkFsbG9jYXRvci5Vc2VkOworICAgIGNtc1VJbnQ4TnVtYmVyKiBwdHI7CisKKyAgICBzaXplID0gX2Ntc0FMSUdOTUVNKHNpemUpOworCisgICAgaWYgKHNpemUgPiBGcmVlKSB7CisKKyAgICAgICAgaWYgKGl0OCAtPiBBbGxvY2F0b3IuQmxvY2tTaXplID09IDApCisKKyAgICAgICAgICAgICAgICBpdDggLT4gQWxsb2NhdG9yLkJsb2NrU2l6ZSA9IDIwKjEwMjQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpdDggLT5BbGxvY2F0b3IuQmxvY2tTaXplICo9IDI7CisKKyAgICAgICAgaWYgKGl0OCAtPkFsbG9jYXRvci5CbG9ja1NpemUgPCBzaXplKQorICAgICAgICAgICAgICAgIGl0OCAtPkFsbG9jYXRvci5CbG9ja1NpemUgPSBzaXplOworCisgICAgICAgIGl0OCAtPkFsbG9jYXRvci5Vc2VkID0gMDsKKyAgICAgICAgaXQ4IC0+QWxsb2NhdG9yLkJsb2NrID0gKGNtc1VJbnQ4TnVtYmVyKikgIEFsbG9jQmlnQmxvY2soaXQ4LCBpdDggLT5BbGxvY2F0b3IuQmxvY2tTaXplKTsKKyAgICB9CisKKyAgICBwdHIgPSBpdDggLT5BbGxvY2F0b3IuQmxvY2sgKyBpdDggLT5BbGxvY2F0b3IuVXNlZDsKKyAgICBpdDggLT5BbGxvY2F0b3IuVXNlZCArPSBzaXplOworCisgICAgcmV0dXJuICh2b2lkKikgcHRyOworCit9CisKKworLy8gQWxsb2NhdGVzIGEgc3RyaW5nCitzdGF0aWMKK2NoYXIgKkFsbG9jU3RyaW5nKGNtc0lUOCogaXQ4LCBjb25zdCBjaGFyKiBzdHIpCit7CisgICAgY21zVUludDMyTnVtYmVyIFNpemUgPSAoY21zVUludDMyTnVtYmVyKSBzdHJsZW4oc3RyKSsxOworICAgIGNoYXIgKnB0cjsKKworCisgICAgcHRyID0gKGNoYXIgKikgQWxsb2NDaHVuayhpdDgsIFNpemUpOworICAgIGlmIChwdHIpIHN0cm5jcHkgKHB0ciwgc3RyLCBTaXplLTEpOworCisgICAgcmV0dXJuIHB0cjsKK30KKworLy8gU2VhcmNoZXMgdGhyb3VnaCBsaW5rZWQgbGlzdAorCitzdGF0aWMKK2Ntc0Jvb2wgSXNBdmFpbGFibGVPbkxpc3QoS0VZVkFMVUUqIHAsIGNvbnN0IGNoYXIqIEtleSwgY29uc3QgY2hhciogU3Via2V5LCBLRVlWQUxVRSoqIExhc3RQdHIpCit7CisgICAgaWYgKExhc3RQdHIpICpMYXN0UHRyID0gcDsKKworICAgIGZvciAoOyAgcCAhPSBOVUxMOyBwID0gcC0+TmV4dCkgeworCisgICAgICAgIGlmIChMYXN0UHRyKSAqTGFzdFB0ciA9IHA7CisKKyAgICAgICAgaWYgKCpLZXkgIT0gJyMnKSB7IC8vIENvbW1lbnRzIGFyZSBpZ25vcmVkCisKKyAgICAgICAgICAgIGlmIChjbXNzdHJjYXNlY21wKEtleSwgcC0+S2V5d29yZCkgPT0gMCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmIChTdWJrZXkgPT0gMCkKKyAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICBmb3IgKDsgcCAhPSBOVUxMOyBwID0gcC0+TmV4dFN1YmtleSkgeworCisgICAgICAgIGlmIChwIC0+U3Via2V5ID09IE5VTEwpIGNvbnRpbnVlOworCisgICAgICAgIGlmIChMYXN0UHRyKSAqTGFzdFB0ciA9IHA7CisKKyAgICAgICAgaWYgKGNtc3N0cmNhc2VjbXAoU3Via2V5LCBwLT5TdWJrZXkpID09IDApCisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKworCisvLyBBZGQgYSBwcm9wZXJ0eSBpbnRvIGEgbGlua2VkIGxpc3QKK3N0YXRpYworS0VZVkFMVUUqIEFkZFRvTGlzdChjbXNJVDgqIGl0OCwgS0VZVkFMVUUqKiBIZWFkLCBjb25zdCBjaGFyICpLZXksIGNvbnN0IGNoYXIgKlN1YmtleSwgY29uc3QgY2hhciogeFZhbHVlLCBXUklURU1PREUgV3JpdGVBcykKK3sKKyAgICBLRVlWQUxVRSogcDsKKyAgICBLRVlWQUxVRSogbGFzdDsKKworCisgICAgLy8gQ2hlY2sgaWYgcHJvcGVydHkgaXMgYWxyZWFkeSBpbiBsaXN0CisKKyAgICBpZiAoSXNBdmFpbGFibGVPbkxpc3QoKkhlYWQsIEtleSwgU3Via2V5LCAmcCkpIHsKKworICAgICAgICAvLyBUaGlzIG1heSB3b3JrIGZvciBlZGl0aW5nIHByb3BlcnRpZXMKKworICAgICAgICAvLyAgICAgcmV0dXJuIFN5bkVycm9yKGl0OCwgImR1cGxpY2F0ZSBrZXkgPCVzPiIsIEtleSk7CisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgIGxhc3QgPSBwOworCisgICAgICAgIC8vIEFsbG9jYXRlIHRoZSBjb250YWluZXIKKyAgICAgICAgcCA9IChLRVlWQUxVRSopIEFsbG9jQ2h1bmsoaXQ4LCBzaXplb2YoS0VZVkFMVUUpKTsKKyAgICAgICAgaWYgKHAgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgU3luRXJyb3IoaXQ4LCAiQWRkVG9MaXN0OiBvdXQgb2YgbWVtb3J5Iik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN0b3JlIG5hbWUgYW5kIHZhbHVlCisgICAgICAgIHAtPktleXdvcmQgPSBBbGxvY1N0cmluZyhpdDgsIEtleSk7CisgICAgICAgIHAtPlN1YmtleSA9IChTdWJrZXkgPT0gTlVMTCkgPyBOVUxMIDogQWxsb2NTdHJpbmcoaXQ4LCBTdWJrZXkpOworCisgICAgICAgIC8vIEtlZXAgdGhlIGNvbnRhaW5lciBpbiBvdXIgbGlzdAorICAgICAgICBpZiAoKkhlYWQgPT0gTlVMTCkgeworICAgICAgICAgICAgKkhlYWQgPSBwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKFN1YmtleSAhPSBOVUxMICYmIGxhc3QgIT0gTlVMTCkgeworCisgICAgICAgICAgICAgICAgbGFzdC0+TmV4dFN1YmtleSA9IHA7CisKKyAgICAgICAgICAgICAgICAvLyBJZiBTdWJrZXkgaXMgbm90IG51bGwsIHRoZW4gbGFzdCBpcyB0aGUgbGFzdCBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lIGtleSwKKyAgICAgICAgICAgICAgICAvLyBidXQgbm90IG5lY2Vzc2FyaWx5IGlzIHRoZSBsYXN0IHByb3BlcnR5IGluIHRoZSBsaXN0LCBzbyB3ZSBuZWVkIHRvIG1vdmUKKyAgICAgICAgICAgICAgICAvLyB0byB0aGUgYWN0dWFsIGxpc3QgZW5kCisgICAgICAgICAgICAgICAgd2hpbGUgKGxhc3QtPk5leHQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gbGFzdC0+TmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxhc3QgIT0gTlVMTCkgbGFzdC0+TmV4dCA9IHA7CisgICAgICAgIH0KKworICAgICAgICBwLT5OZXh0ICAgID0gTlVMTDsKKyAgICAgICAgcC0+TmV4dFN1YmtleSA9IE5VTEw7CisgICAgfQorCisgICAgcC0+V3JpdGVBcyA9IFdyaXRlQXM7CisKKyAgICBpZiAoeFZhbHVlICE9IE5VTEwpIHsKKworICAgICAgICBwLT5WYWx1ZSAgID0gQWxsb2NTdHJpbmcoaXQ4LCB4VmFsdWUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcC0+VmFsdWUgICA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHA7Cit9CisKK3N0YXRpYworS0VZVkFMVUUqIEFkZEF2YWlsYWJsZVByb3BlcnR5KGNtc0lUOCogaXQ4LCBjb25zdCBjaGFyKiBLZXksIFdSSVRFTU9ERSBhcykKK3sKKyAgICByZXR1cm4gQWRkVG9MaXN0KGl0OCwgJml0OC0+VmFsaWRLZXl3b3JkcywgS2V5LCBOVUxMLCBOVUxMLCBhcyk7Cit9CisKKworc3RhdGljCitLRVlWQUxVRSogQWRkQXZhaWxhYmxlU2FtcGxlSUQoY21zSVQ4KiBpdDgsIGNvbnN0IGNoYXIqIEtleSkKK3sKKyAgICByZXR1cm4gQWRkVG9MaXN0KGl0OCwgJml0OC0+VmFsaWRTYW1wbGVJRCwgS2V5LCBOVUxMLCBOVUxMLCBXUklURV9VTkNPT0tFRCk7Cit9CisKKworc3RhdGljCit2b2lkIEFsbG9jVGFibGUoY21zSVQ4KiBpdDgpCit7CisgICAgVEFCTEUqIHQ7CisKKyAgICB0ID0gaXQ4IC0+VGFiICsgaXQ4IC0+VGFibGVzQ291bnQ7CisKKyAgICB0LT5IZWFkZXJMaXN0ID0gTlVMTDsKKyAgICB0LT5EYXRhRm9ybWF0ID0gTlVMTDsKKyAgICB0LT5EYXRhICAgICAgID0gTlVMTDsKKworICAgIGl0OCAtPlRhYmxlc0NvdW50Kys7Cit9CisKKworY21zSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0lUOFNldFRhYmxlKGNtc0hBTkRMRSAgSVQ4LCBjbXNVSW50MzJOdW1iZXIgblRhYmxlKQoreworICAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBJVDg7CisKKyAgICAgaWYgKG5UYWJsZSA+PSBpdDggLT5UYWJsZXNDb3VudCkgeworCisgICAgICAgICBpZiAoblRhYmxlID09IGl0OCAtPlRhYmxlc0NvdW50KSB7CisKKyAgICAgICAgICAgICBBbGxvY1RhYmxlKGl0OCk7CisgICAgICAgICB9CisgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICBTeW5FcnJvcihpdDgsICJUYWJsZSAlZCBpcyBvdXQgb2Ygc2VxdWVuY2UiLCBuVGFibGUpOworICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgIH0KKyAgICAgfQorCisgICAgIGl0OCAtPm5UYWJsZSA9IG5UYWJsZTsKKworICAgICByZXR1cm4gKGNtc0ludDMyTnVtYmVyKSBuVGFibGU7Cit9CisKKworCisvLyBJbml0IGFuIGVtcHR5IGNvbnRhaW5lcgorY21zSEFORExFICBDTVNFWFBPUlQgY21zSVQ4QWxsb2MoY21zQ29udGV4dCBDb250ZXh0SUQpCit7CisgICAgY21zSVQ4KiBpdDg7CisgICAgY21zVUludDMyTnVtYmVyIGk7CisKKyAgICBpdDggPSAoY21zSVQ4KikgX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBzaXplb2YoY21zSVQ4KSk7CisgICAgaWYgKGl0OCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIEFsbG9jVGFibGUoaXQ4KTsKKworICAgIGl0OC0+TWVtb3J5QmxvY2sgPSBOVUxMOworICAgIGl0OC0+TWVtb3J5U2luayAgPSBOVUxMOworCisgICAgaXQ4IC0+blRhYmxlID0gMDsKKworICAgIGl0OC0+Q29udGV4dElEID0gQ29udGV4dElEOworICAgIGl0OC0+QWxsb2NhdG9yLlVzZWQgPSAwOworICAgIGl0OC0+QWxsb2NhdG9yLkJsb2NrID0gTlVMTDsKKyAgICBpdDgtPkFsbG9jYXRvci5CbG9ja1NpemUgPSAwOworCisgICAgaXQ4LT5WYWxpZEtleXdvcmRzID0gTlVMTDsKKyAgICBpdDgtPlZhbGlkU2FtcGxlSUQgPSBOVUxMOworCisgICAgaXQ4IC0+IHN5ID0gU1VOREVGSU5FRDsKKyAgICBpdDggLT4gY2ggPSAnICc7CisgICAgaXQ4IC0+IFNvdXJjZSA9IE5VTEw7CisgICAgaXQ4IC0+IGludW0gPSAwOworICAgIGl0OCAtPiBkbnVtID0gMC4wOworCisgICAgaXQ4LT5GaWxlU3RhY2tbMF0gPSAoRklMRUNUWCopQWxsb2NDaHVuayhpdDgsIHNpemVvZihGSUxFQ1RYKSk7CisgICAgaXQ4LT5JbmNsdWRlU1AgICA9IDA7CisgICAgaXQ4IC0+IGxpbmVubyA9IDE7CisKKyAgICBzdHJjcHkoaXQ4LT5Eb3VibGVGb3JtYXR0ZXIsIERFRkFVTFRfREJMX0ZPUk1BVCk7CisgICAgY21zSVQ4U2V0U2hlZXRUeXBlKChjbXNIQU5ETEUpIGl0OCwgIkNHQVRTLjE3Iik7CisKKyAgICAvLyBJbml0aWFsaXplIHByZWRlZmluZWQgcHJvcGVydGllcyAmIGRhdGEKKworICAgIGZvciAoaT0wOyBpIDwgTlVNUFJFREVGSU5FRFBST1BTOyBpKyspCisgICAgICAgICAgICBBZGRBdmFpbGFibGVQcm9wZXJ0eShpdDgsIFByZWRlZmluZWRQcm9wZXJ0aWVzW2ldLmlkLCBQcmVkZWZpbmVkUHJvcGVydGllc1tpXS5hcyk7CisKKyAgICBmb3IgKGk9MDsgaSA8IE5VTVBSRURFRklORURTQU1QTEVJRDsgaSsrKQorICAgICAgICAgICAgQWRkQXZhaWxhYmxlU2FtcGxlSUQoaXQ4LCBQcmVkZWZpbmVkU2FtcGxlSURbaV0pOworCisKKyAgIHJldHVybiAoY21zSEFORExFKSBpdDg7Cit9CisKKworY29uc3QgY2hhciogQ01TRVhQT1JUIGNtc0lUOEdldFNoZWV0VHlwZShjbXNIQU5ETEUgaElUOCkKK3sKKyAgICAgICAgcmV0dXJuIEdldFRhYmxlKChjbXNJVDgqKSBoSVQ4KS0+U2hlZXRUeXBlOworfQorCitjbXNCb29sIENNU0VYUE9SVCBjbXNJVDhTZXRTaGVldFR5cGUoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIFR5cGUpCit7CisgICAgICAgIFRBQkxFKiB0ID0gR2V0VGFibGUoKGNtc0lUOCopIGhJVDgpOworCisgICAgICAgIHN0cm5jcHkodCAtPlNoZWV0VHlwZSwgVHlwZSwgTUFYU1RSLTEpOworICAgICAgICB0IC0+U2hlZXRUeXBlW01BWFNUUi0xXSA9IDA7CisgICAgICAgIHJldHVybiBUUlVFOworfQorCitjbXNCb29sIENNU0VYUE9SVCBjbXNJVDhTZXRDb21tZW50KGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBWYWwpCit7CisgICAgY21zSVQ4KiBpdDggPSAoY21zSVQ4KikgaElUODsKKworICAgIGlmICghVmFsKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCEqVmFsKSByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gQWRkVG9MaXN0KGl0OCwgJkdldFRhYmxlKGl0OCktPkhlYWRlckxpc3QsICIjICIsIE5VTEwsIFZhbCwgV1JJVEVfVU5DT09LRUQpICE9IE5VTEw7Cit9CisKKy8vIFNldHMgYSBwcm9wZXJ0eQorY21zQm9vbCBDTVNFWFBPUlQgY21zSVQ4U2V0UHJvcGVydHlTdHIoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIEtleSwgY29uc3QgY2hhciAqVmFsKQoreworICAgIGNtc0lUOCogaXQ4ID0gKGNtc0lUOCopIGhJVDg7CisKKyAgICBpZiAoIVZhbCkgcmV0dXJuIEZBTFNFOworICAgIGlmICghKlZhbCkgcmV0dXJuIEZBTFNFOworCisgICAgcmV0dXJuIEFkZFRvTGlzdChpdDgsICZHZXRUYWJsZShpdDgpLT5IZWFkZXJMaXN0LCBLZXksIE5VTEwsIFZhbCwgV1JJVEVfU1RSSU5HSUZZKSAhPSBOVUxMOworfQorCitjbXNCb29sIENNU0VYUE9SVCBjbXNJVDhTZXRQcm9wZXJ0eURibChjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciogY1Byb3AsIGNtc0Zsb2F0NjROdW1iZXIgVmFsKQoreworICAgIGNtc0lUOCogaXQ4ID0gKGNtc0lUOCopIGhJVDg7CisgICAgY2hhciBCdWZmZXJbMTAyNF07CisKKyAgICBzbnByaW50ZihCdWZmZXIsIDEwMjMsIGl0OC0+RG91YmxlRm9ybWF0dGVyLCBWYWwpOworCisgICAgcmV0dXJuIEFkZFRvTGlzdChpdDgsICZHZXRUYWJsZShpdDgpLT5IZWFkZXJMaXN0LCBjUHJvcCwgTlVMTCwgQnVmZmVyLCBXUklURV9VTkNPT0tFRCkgIT0gTlVMTDsKK30KKworY21zQm9vbCBDTVNFWFBPUlQgY21zSVQ4U2V0UHJvcGVydHlIZXgoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIGNQcm9wLCBjbXNVSW50MzJOdW1iZXIgVmFsKQoreworICAgIGNtc0lUOCogaXQ4ID0gKGNtc0lUOCopIGhJVDg7CisgICAgY2hhciBCdWZmZXJbMTAyNF07CisKKyAgICBzbnByaW50ZihCdWZmZXIsIDEwMjMsICIldSIsIFZhbCk7CisKKyAgICByZXR1cm4gQWRkVG9MaXN0KGl0OCwgJkdldFRhYmxlKGl0OCktPkhlYWRlckxpc3QsIGNQcm9wLCBOVUxMLCBCdWZmZXIsIFdSSVRFX0hFWEFERUNJTUFMKSAhPSBOVUxMOworfQorCitjbXNCb29sIENNU0VYUE9SVCBjbXNJVDhTZXRQcm9wZXJ0eVVuY29va2VkKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBLZXksIGNvbnN0IGNoYXIqIEJ1ZmZlcikKK3sKKyAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OworCisgICAgcmV0dXJuIEFkZFRvTGlzdChpdDgsICZHZXRUYWJsZShpdDgpLT5IZWFkZXJMaXN0LCBLZXksIE5VTEwsIEJ1ZmZlciwgV1JJVEVfVU5DT09LRUQpICE9IE5VTEw7Cit9CisKK2Ntc0Jvb2wgQ01TRVhQT1JUIGNtc0lUOFNldFByb3BlcnR5TXVsdGkoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIEtleSwgY29uc3QgY2hhciogU3ViS2V5LCBjb25zdCBjaGFyICpCdWZmZXIpCit7CisgICAgY21zSVQ4KiBpdDggPSAoY21zSVQ4KikgaElUODsKKworICAgIHJldHVybiBBZGRUb0xpc3QoaXQ4LCAmR2V0VGFibGUoaXQ4KS0+SGVhZGVyTGlzdCwgS2V5LCBTdWJLZXksIEJ1ZmZlciwgV1JJVEVfUEFJUikgIT0gTlVMTDsKK30KKworLy8gR2V0cyBhIHByb3BlcnR5Citjb25zdCBjaGFyKiBDTVNFWFBPUlQgY21zSVQ4R2V0UHJvcGVydHkoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIEtleSkKK3sKKyAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OworICAgIEtFWVZBTFVFKiBwOworCisgICAgaWYgKElzQXZhaWxhYmxlT25MaXN0KEdldFRhYmxlKGl0OCkgLT4gSGVhZGVyTGlzdCwgS2V5LCBOVUxMLCAmcCkpCisgICAgeworICAgICAgICByZXR1cm4gcCAtPiBWYWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworY21zRmxvYXQ2NE51bWJlciBDTVNFWFBPUlQgY21zSVQ4R2V0UHJvcGVydHlEYmwoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIGNQcm9wKQoreworICAgIGNvbnN0IGNoYXIgKnYgPSBjbXNJVDhHZXRQcm9wZXJ0eShoSVQ4LCBjUHJvcCk7CisKKyAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gMC4wOworCisgICAgcmV0dXJuIFBhcnNlRmxvYXROdW1iZXIodik7Cit9CisKK2NvbnN0IGNoYXIqIENNU0VYUE9SVCBjbXNJVDhHZXRQcm9wZXJ0eU11bHRpKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBLZXksIGNvbnN0IGNoYXIgKlN1YktleSkKK3sKKyAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OworICAgIEtFWVZBTFVFKiBwOworCisgICAgaWYgKElzQXZhaWxhYmxlT25MaXN0KEdldFRhYmxlKGl0OCkgLT4gSGVhZGVyTGlzdCwgS2V5LCBTdWJLZXksICZwKSkgeworICAgICAgICByZXR1cm4gcCAtPiBWYWx1ZTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERhdGFzZXRzCisKKworc3RhdGljCit2b2lkIEFsbG9jYXRlRGF0YUZvcm1hdChjbXNJVDgqIGl0OCkKK3sKKyAgICBUQUJMRSogdCA9IEdldFRhYmxlKGl0OCk7CisKKyAgICBpZiAodCAtPiBEYXRhRm9ybWF0KSByZXR1cm47ICAgIC8vIEFscmVhZHkgYWxsb2NhdGVkCisKKyAgICB0IC0+IG5TYW1wbGVzICA9IChpbnQpIGNtc0lUOEdldFByb3BlcnR5RGJsKGl0OCwgIk5VTUJFUl9PRl9GSUVMRFMiKTsKKworICAgIGlmICh0IC0+IG5TYW1wbGVzIDw9IDApIHsKKworICAgICAgICBTeW5FcnJvcihpdDgsICJBbGxvY2F0ZURhdGFGb3JtYXQ6IFVua25vd24gTlVNQkVSX09GX0ZJRUxEUyIpOworICAgICAgICB0IC0+IG5TYW1wbGVzID0gMTA7CisgICAgICAgIH0KKworICAgIHQgLT4gRGF0YUZvcm1hdCA9IChjaGFyKiopIEFsbG9jQ2h1bmsgKGl0OCwgKChjbXNVSW50MzJOdW1iZXIpIHQtPm5TYW1wbGVzICsgMSkgKiBzaXplb2YoY2hhciAqKSk7CisgICAgaWYgKHQtPkRhdGFGb3JtYXQgPT0gTlVMTCkgeworCisgICAgICAgIFN5bkVycm9yKGl0OCwgIkFsbG9jYXRlRGF0YUZvcm1hdDogVW5hYmxlIHRvIGFsbG9jYXRlIGRhdGFGb3JtYXQgYXJyYXkiKTsKKyAgICB9CisKK30KKworc3RhdGljCitjb25zdCBjaGFyICpHZXREYXRhRm9ybWF0KGNtc0lUOCogaXQ4LCBpbnQgbikKK3sKKyAgICBUQUJMRSogdCA9IEdldFRhYmxlKGl0OCk7CisKKyAgICBpZiAodC0+RGF0YUZvcm1hdCkKKyAgICAgICAgcmV0dXJuIHQtPkRhdGFGb3JtYXRbbl07CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljCitjbXNCb29sIFNldERhdGFGb3JtYXQoY21zSVQ4KiBpdDgsIGludCBuLCBjb25zdCBjaGFyICpsYWJlbCkKK3sKKyAgICBUQUJMRSogdCA9IEdldFRhYmxlKGl0OCk7CisKKyAgICBpZiAoIXQtPkRhdGFGb3JtYXQpCisgICAgICAgIEFsbG9jYXRlRGF0YUZvcm1hdChpdDgpOworCisgICAgaWYgKG4gPiB0IC0+IG5TYW1wbGVzKSB7CisgICAgICAgIFN5bkVycm9yKGl0OCwgIk1vcmUgdGhhbiBOVU1CRVJfT0ZfRklFTERTIGZpZWxkcy4iKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmICh0LT5EYXRhRm9ybWF0KSB7CisgICAgICAgIHQtPkRhdGFGb3JtYXRbbl0gPSBBbGxvY1N0cmluZyhpdDgsIGxhYmVsKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCitjbXNCb29sIENNU0VYUE9SVCBjbXNJVDhTZXREYXRhRm9ybWF0KGNtc0hBTkRMRSAgaCwgaW50IG4sIGNvbnN0IGNoYXIgKlNhbXBsZSkKK3sKKyAgICAgICAgY21zSVQ4KiBpdDggPSAoY21zSVQ4KikgaDsKKyAgICAgICAgcmV0dXJuIFNldERhdGFGb3JtYXQoaXQ4LCBuLCBTYW1wbGUpOworfQorCitzdGF0aWMKK3ZvaWQgQWxsb2NhdGVEYXRhU2V0KGNtc0lUOCogaXQ4KQoreworICAgIFRBQkxFKiB0ID0gR2V0VGFibGUoaXQ4KTsKKworICAgIGlmICh0IC0+IERhdGEpIHJldHVybjsgICAgLy8gQWxyZWFkeSBhbGxvY2F0ZWQKKworICAgIHQtPiBuU2FtcGxlcyAgID0gYXRvaShjbXNJVDhHZXRQcm9wZXJ0eShpdDgsICJOVU1CRVJfT0ZfRklFTERTIikpOworICAgIHQtPiBuUGF0Y2hlcyAgID0gYXRvaShjbXNJVDhHZXRQcm9wZXJ0eShpdDgsICJOVU1CRVJfT0ZfU0VUUyIpKTsKKworICAgIHQtPiBEYXRhID0gKGNoYXIqKilBbGxvY0NodW5rIChpdDgsICgoY21zVUludDMyTnVtYmVyKSB0LT5uU2FtcGxlcyArIDEpICogKChjbXNVSW50MzJOdW1iZXIpIHQtPm5QYXRjaGVzICsgMSkgKnNpemVvZiAoY2hhciopKTsKKyAgICBpZiAodC0+RGF0YSA9PSBOVUxMKSB7CisKKyAgICAgICAgU3luRXJyb3IoaXQ4LCAiQWxsb2NhdGVEYXRhU2V0OiBVbmFibGUgdG8gYWxsb2NhdGUgZGF0YSBhcnJheSIpOworICAgIH0KKworfQorCitzdGF0aWMKK2NoYXIqIEdldERhdGEoY21zSVQ4KiBpdDgsIGludCBuU2V0LCBpbnQgbkZpZWxkKQoreworICAgIFRBQkxFKiB0ID0gR2V0VGFibGUoaXQ4KTsKKyAgICBpbnQgIG5TYW1wbGVzICAgPSB0IC0+IG5TYW1wbGVzOworICAgIGludCAgblBhdGNoZXMgICA9IHQgLT4gblBhdGNoZXM7CisKKyAgICBpZiAoblNldCA+PSBuUGF0Y2hlcyB8fCBuRmllbGQgPj0gblNhbXBsZXMpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKCF0LT5EYXRhKSByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gdC0+RGF0YSBbblNldCAqIG5TYW1wbGVzICsgbkZpZWxkXTsKK30KKworc3RhdGljCitjbXNCb29sIFNldERhdGEoY21zSVQ4KiBpdDgsIGludCBuU2V0LCBpbnQgbkZpZWxkLCBjb25zdCBjaGFyICpWYWwpCit7CisgICAgVEFCTEUqIHQgPSBHZXRUYWJsZShpdDgpOworCisgICAgaWYgKCF0LT5EYXRhKQorICAgICAgICBBbGxvY2F0ZURhdGFTZXQoaXQ4KTsKKworICAgIGlmICghdC0+RGF0YSkgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKG5TZXQgPiB0IC0+IG5QYXRjaGVzIHx8IG5TZXQgPCAwKSB7CisKKyAgICAgICAgICAgIHJldHVybiBTeW5FcnJvcihpdDgsICJQYXRjaCAlZCBvdXQgb2YgcmFuZ2UsIHRoZXJlIGFyZSAlZCBwYXRjaGVzIiwgblNldCwgdCAtPiBuUGF0Y2hlcyk7CisgICAgfQorCisgICAgaWYgKG5GaWVsZCA+IHQgLT5uU2FtcGxlcyB8fCBuRmllbGQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gU3luRXJyb3IoaXQ4LCAiU2FtcGxlICVkIG91dCBvZiByYW5nZSwgdGhlcmUgYXJlICVkIHNhbXBsZXMiLCBuRmllbGQsIHQgLT5uU2FtcGxlcyk7CisKKyAgICB9CisKKyAgICB0LT5EYXRhIFtuU2V0ICogdCAtPiBuU2FtcGxlcyArIG5GaWVsZF0gPSBBbGxvY1N0cmluZyhpdDgsIFZhbCk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpbGUgSS9PCisKKworLy8gV3JpdGVzIGEgc3RyaW5nIHRvIGZpbGUKK3N0YXRpYwordm9pZCBXcml0ZVN0cihTQVZFU1RSRUFNKiBmLCBjb25zdCBjaGFyICpzdHIpCit7CisgICAgY21zVUludDMyTnVtYmVyIGxlbjsKKworICAgIGlmIChzdHIgPT0gTlVMTCkKKyAgICAgICAgc3RyID0gIiAiOworCisgICAgLy8gTGVuZ3RoIHRvIHdyaXRlCisgICAgbGVuID0gKGNtc1VJbnQzMk51bWJlcikgc3RybGVuKHN0cik7CisgICAgZiAtPlVzZWQgKz0gbGVuOworCisKKyAgICBpZiAoZiAtPnN0cmVhbSkgeyAgIC8vIFNob3VsZCBJIHdyaXRlIGl0IHRvIGEgZmlsZT8KKworICAgICAgICBpZiAoZndyaXRlKHN0ciwgMSwgbGVuLCBmLT5zdHJlYW0pICE9IGxlbikgeworICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoMCwgY21zRVJST1JfV1JJVEUsICJXcml0ZSB0byBmaWxlIGVycm9yIGluIENHQVRTIHBhcnNlciIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICB9CisgICAgZWxzZSB7ICAvLyBPciB0byBhIG1lbW9yeSBibG9jaz8KKworICAgICAgICBpZiAoZiAtPkJhc2UpIHsgICAvLyBBbSBJIGp1c3QgY291bnRpbmcgdGhlIGJ5dGVzPworCisgICAgICAgICAgICBpZiAoZiAtPlVzZWQgPiBmIC0+TWF4KSB7CisKKyAgICAgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoMCwgY21zRVJST1JfV1JJVEUsICJXcml0ZSB0byBtZW1vcnkgb3ZlcmZsb3dzIGluIENHQVRTIHBhcnNlciIpOworICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1lbW1vdmUoZiAtPlB0ciwgc3RyLCBsZW4pOworICAgICAgICAgICAgZi0+UHRyICs9IGxlbjsKKyAgICAgICAgfQorCisgICAgfQorfQorCisKKy8vIFdyaXRlIGZvcm1hdHRlZAorCitzdGF0aWMKK3ZvaWQgV3JpdGVmKFNBVkVTVFJFQU0qIGYsIGNvbnN0IGNoYXIqIGZybSwgLi4uKQoreworICAgIGNoYXIgQnVmZmVyWzQwOTZdOworICAgIHZhX2xpc3QgYXJnczsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIGZybSk7CisgICAgdnNucHJpbnRmKEJ1ZmZlciwgNDA5NSwgZnJtLCBhcmdzKTsKKyAgICBCdWZmZXJbNDA5NV0gPSAwOworICAgIFdyaXRlU3RyKGYsIEJ1ZmZlcik7CisgICAgdmFfZW5kKGFyZ3MpOworCit9CisKKy8vIFdyaXRlcyBmdWxsIGhlYWRlcgorc3RhdGljCit2b2lkIFdyaXRlSGVhZGVyKGNtc0lUOCogaXQ4LCBTQVZFU1RSRUFNKiBmcCkKK3sKKyAgICBLRVlWQUxVRSogcDsKKyAgICBUQUJMRSogdCA9IEdldFRhYmxlKGl0OCk7CisKKyAgICAvLyBXcml0ZXMgdGhlIHR5cGUKKyAgICBXcml0ZVN0cihmcCwgdC0+U2hlZXRUeXBlKTsKKyAgICBXcml0ZVN0cihmcCwgIlxuIik7CisKKyAgICBmb3IgKHAgPSB0LT5IZWFkZXJMaXN0OyAocCAhPSBOVUxMKTsgcCA9IHAtPk5leHQpCisgICAgeworICAgICAgICBpZiAoKnAgLT5LZXl3b3JkID09ICcjJykgeworCisgICAgICAgICAgICBjaGFyKiBQdDsKKworICAgICAgICAgICAgV3JpdGVTdHIoZnAsICIjXG4jICIpOworICAgICAgICAgICAgZm9yIChQdCA9IHAgLT5WYWx1ZTsgKlB0OyBQdCsrKSB7CisKKworICAgICAgICAgICAgICAgIFdyaXRlZihmcCwgIiVjIiwgKlB0KTsKKworICAgICAgICAgICAgICAgIGlmICgqUHQgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgICAgICBXcml0ZVN0cihmcCwgIiMgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBXcml0ZVN0cihmcCwgIlxuI1xuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKCFJc0F2YWlsYWJsZU9uTGlzdChpdDgtPiBWYWxpZEtleXdvcmRzLCBwLT5LZXl3b3JkLCBOVUxMLCBOVUxMKSkgeworCisjaWZkZWYgQ01TX1NUUklDVF9DR0FUUworICAgICAgICAgICAgV3JpdGVTdHIoZnAsICJLRVlXT1JEXHRcIiIpOworICAgICAgICAgICAgV3JpdGVTdHIoZnAsIHAtPktleXdvcmQpOworICAgICAgICAgICAgV3JpdGVTdHIoZnAsICJcIlxuIik7CisjZW5kaWYKKworICAgICAgICAgICAgQWRkQXZhaWxhYmxlUHJvcGVydHkoaXQ4LCBwLT5LZXl3b3JkLCBXUklURV9VTkNPT0tFRCk7CisgICAgICAgIH0KKworICAgICAgICBXcml0ZVN0cihmcCwgcC0+S2V5d29yZCk7CisgICAgICAgIGlmIChwLT5WYWx1ZSkgeworCisgICAgICAgICAgICBzd2l0Y2ggKHAgLT5Xcml0ZUFzKSB7CisKKyAgICAgICAgICAgIGNhc2UgV1JJVEVfVU5DT09LRUQ6CisgICAgICAgICAgICAgICAgICAgIFdyaXRlZihmcCwgIlx0JXMiLCBwIC0+VmFsdWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBXUklURV9TVFJJTkdJRlk6CisgICAgICAgICAgICAgICAgICAgIFdyaXRlZihmcCwgIlx0XCIlc1wiIiwgcC0+VmFsdWUgKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgV1JJVEVfSEVYQURFQ0lNQUw6CisgICAgICAgICAgICAgICAgICAgIFdyaXRlZihmcCwgIlx0MHglWCIsIGF0b2kocCAtPlZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFdSSVRFX0JJTkFSWToKKyAgICAgICAgICAgICAgICAgICAgV3JpdGVmKGZwLCAiXHQweCVCIiwgYXRvaShwIC0+VmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgV1JJVEVfUEFJUjoKKyAgICAgICAgICAgICAgICAgICAgV3JpdGVmKGZwLCAiXHRcIiVzLCVzXCIiLCBwLT5TdWJrZXksIHAtPlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6IFN5bkVycm9yKGl0OCwgIlVua25vd24gd3JpdGUgbW9kZSAlZCIsIHAgLT5Xcml0ZUFzKTsKKyAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFdyaXRlU3RyIChmcCwgIlxuIik7CisgICAgfQorCit9CisKKworLy8gV3JpdGVzIHRoZSBkYXRhIGZvcm1hdAorc3RhdGljCit2b2lkIFdyaXRlRGF0YUZvcm1hdChTQVZFU1RSRUFNKiBmcCwgY21zSVQ4KiBpdDgpCit7CisgICAgaW50IGksIG5TYW1wbGVzOworICAgIFRBQkxFKiB0ID0gR2V0VGFibGUoaXQ4KTsKKworICAgIGlmICghdCAtPiBEYXRhRm9ybWF0KSByZXR1cm47CisKKyAgICAgICBXcml0ZVN0cihmcCwgIkJFR0lOX0RBVEFfRk9STUFUXG4iKTsKKyAgICAgICBXcml0ZVN0cihmcCwgIiAiKTsKKyAgICAgICBuU2FtcGxlcyA9IGF0b2koY21zSVQ4R2V0UHJvcGVydHkoaXQ4LCAiTlVNQkVSX09GX0ZJRUxEUyIpKTsKKworICAgICAgIGZvciAoaSA9IDA7IGkgPCBuU2FtcGxlczsgaSsrKSB7CisKKyAgICAgICAgICAgICAgV3JpdGVTdHIoZnAsIHQtPkRhdGFGb3JtYXRbaV0pOworICAgICAgICAgICAgICBXcml0ZVN0cihmcCwgKChpID09IChuU2FtcGxlcy0xKSkgPyAiXG4iIDogIlx0IikpOworICAgICAgICAgIH0KKworICAgICAgIFdyaXRlU3RyIChmcCwgIkVORF9EQVRBX0ZPUk1BVFxuIik7Cit9CisKKworLy8gV3JpdGVzIGRhdGEgYXJyYXkKK3N0YXRpYwordm9pZCBXcml0ZURhdGEoU0FWRVNUUkVBTSogZnAsIGNtc0lUOCogaXQ4KQoreworICAgICAgIGludCAgaSwgajsKKyAgICAgICBUQUJMRSogdCA9IEdldFRhYmxlKGl0OCk7CisKKyAgICAgICBpZiAoIXQtPkRhdGEpIHJldHVybjsKKworICAgICAgIFdyaXRlU3RyIChmcCwgIkJFR0lOX0RBVEFcbiIpOworCisgICAgICAgdC0+blBhdGNoZXMgPSBhdG9pKGNtc0lUOEdldFByb3BlcnR5KGl0OCwgIk5VTUJFUl9PRl9TRVRTIikpOworCisgICAgICAgZm9yIChpID0gMDsgaSA8IHQtPiBuUGF0Y2hlczsgaSsrKSB7CisKKyAgICAgICAgICAgICAgV3JpdGVTdHIoZnAsICIgIik7CisKKyAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHQtPm5TYW1wbGVzOyBqKyspIHsKKworICAgICAgICAgICAgICAgICAgICAgY2hhciAqcHRyID0gdC0+RGF0YVtpKnQtPm5TYW1wbGVzK2pdOworCisgICAgICAgICAgICAgICAgICAgICBpZiAocHRyID09IE5VTEwpIFdyaXRlU3RyKGZwLCAiXCJcIiIpOworICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdmFsdWUgY29udGFpbnMgd2hpdGVzcGFjZSwgZW5jbG9zZSB3aXRoaW4gcXVvdGUKKworICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjaHIocHRyLCAnICcpICE9IE5VTEwpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZVN0cihmcCwgIlwiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlU3RyKGZwLCBwdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZVN0cihmcCwgIlwiIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZVN0cihmcCwgcHRyKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgV3JpdGVTdHIoZnAsICgoaiA9PSAodC0+blNhbXBsZXMtMSkpID8gIlxuIiA6ICJcdCIpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgIH0KKyAgICAgICBXcml0ZVN0ciAoZnAsICJFTkRfREFUQVxuIik7Cit9CisKKworCisvLyBTYXZlcyB3aG9sZSBmaWxlCitjbXNCb29sIENNU0VYUE9SVCBjbXNJVDhTYXZlVG9GaWxlKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBjRmlsZU5hbWUpCit7CisgICAgU0FWRVNUUkVBTSBzZDsKKyAgICBjbXNVSW50MzJOdW1iZXIgaTsKKyAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OworCisgICAgbWVtc2V0KCZzZCwgMCwgc2l6ZW9mKHNkKSk7CisKKyAgICBzZC5zdHJlYW0gPSBmb3BlbihjRmlsZU5hbWUsICJ3dCIpOworICAgIGlmICghc2Quc3RyZWFtKSByZXR1cm4gRkFMU0U7CisKKyAgICBmb3IgKGk9MDsgaSA8IGl0OCAtPlRhYmxlc0NvdW50OyBpKyspIHsKKworICAgICAgICAgICAgY21zSVQ4U2V0VGFibGUoaElUOCwgaSk7CisgICAgICAgICAgICBXcml0ZUhlYWRlcihpdDgsICZzZCk7CisgICAgICAgICAgICBXcml0ZURhdGFGb3JtYXQoJnNkLCBpdDgpOworICAgICAgICAgICAgV3JpdGVEYXRhKCZzZCwgaXQ4KTsKKyAgICB9CisKKyAgICBpZiAoZmNsb3NlKHNkLnN0cmVhbSkgIT0gMCkgcmV0dXJuIEZBTFNFOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLy8gU2F2ZXMgdG8gbWVtb3J5CitjbXNCb29sIENNU0VYUE9SVCBjbXNJVDhTYXZlVG9NZW0oY21zSEFORExFIGhJVDgsIHZvaWQgKk1lbVB0ciwgY21zVUludDMyTnVtYmVyKiBCeXRlc05lZWRlZCkKK3sKKyAgICBTQVZFU1RSRUFNIHNkOworICAgIGNtc1VJbnQzMk51bWJlciBpOworICAgIGNtc0lUOCogaXQ4ID0gKGNtc0lUOCopIGhJVDg7CisKKyAgICBtZW1zZXQoJnNkLCAwLCBzaXplb2Yoc2QpKTsKKworICAgIHNkLnN0cmVhbSA9IE5VTEw7CisgICAgc2QuQmFzZSAgID0gKGNtc1VJbnQ4TnVtYmVyKikgIE1lbVB0cjsKKyAgICBzZC5QdHIgICAgPSBzZC5CYXNlOworCisgICAgc2QuVXNlZCA9IDA7CisKKyAgICBpZiAoc2QuQmFzZSkKKyAgICAgICAgc2QuTWF4ICA9ICpCeXRlc05lZWRlZDsgICAgIC8vIFdyaXRlIHRvIG1lbW9yeT8KKyAgICBlbHNlCisgICAgICAgIHNkLk1heCAgPSAwOyAgICAgICAgICAgICAgICAvLyBKdXN0IGNvdW50aW5nIHRoZSBuZWVkZWQgYnl0ZXMKKworICAgIGZvciAoaT0wOyBpIDwgaXQ4IC0+VGFibGVzQ291bnQ7IGkrKykgeworCisgICAgICAgIGNtc0lUOFNldFRhYmxlKGhJVDgsIGkpOworICAgICAgICBXcml0ZUhlYWRlcihpdDgsICZzZCk7CisgICAgICAgIFdyaXRlRGF0YUZvcm1hdCgmc2QsIGl0OCk7CisgICAgICAgIFdyaXRlRGF0YSgmc2QsIGl0OCk7CisgICAgfQorCisgICAgc2QuVXNlZCsrOyAgLy8gVGhlIFwwIGF0IHRoZSB2ZXJ5IGVuZAorCisgICAgaWYgKHNkLkJhc2UpCisgICAgICAgICpzZC5QdHIgPSAwOworCisgICAgKkJ5dGVzTmVlZGVkID0gc2QuVXNlZDsKKworICAgIHJldHVybiBUUlVFOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhpZ2hlciBsZXZlbCBwYXJzaW5nCisKK3N0YXRpYworY21zQm9vbCBEYXRhRm9ybWF0U2VjdGlvbihjbXNJVDgqIGl0OCkKK3sKKyAgICBpbnQgaUZpZWxkID0gMDsKKyAgICBUQUJMRSogdCA9IEdldFRhYmxlKGl0OCk7CisKKyAgICBJblN5bWJvbChpdDgpOyAgIC8vIEVhdHMgIkJFR0lOX0RBVEFfRk9STUFUIgorICAgIENoZWNrRU9MTihpdDgpOworCisgICAgd2hpbGUgKGl0OC0+c3kgIT0gU0VORF9EQVRBX0ZPUk1BVCAmJgorICAgICAgICBpdDgtPnN5ICE9IFNFT0xOICYmCisgICAgICAgIGl0OC0+c3kgIT0gU0VPRiAmJgorICAgICAgICBpdDgtPnN5ICE9IFNTWU5FUlJPUikgIHsKKworICAgICAgICAgICAgaWYgKGl0OC0+c3kgIT0gU0lERU5UKSB7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gU3luRXJyb3IoaXQ4LCAiU2FtcGxlIHR5cGUgZXhwZWN0ZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFTZXREYXRhRm9ybWF0KGl0OCwgaUZpZWxkLCBpdDgtPmlkKSkgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgaUZpZWxkKys7CisKKyAgICAgICAgICAgIEluU3ltYm9sKGl0OCk7CisgICAgICAgICAgICBTa2lwRU9MTihpdDgpOworICAgICAgIH0KKworICAgICAgIFNraXBFT0xOKGl0OCk7CisgICAgICAgU2tpcChpdDgsIFNFTkRfREFUQV9GT1JNQVQpOworICAgICAgIFNraXBFT0xOKGl0OCk7CisKKyAgICAgICBpZiAoaUZpZWxkICE9IHQgLT5uU2FtcGxlcykgeworICAgICAgICAgICBTeW5FcnJvcihpdDgsICJDb3VudCBtaXNtYXRjaC4gTlVNQkVSX09GX0ZJRUxEUyB3YXMgJWQsIGZvdW5kICVkXG4iLCB0IC0+blNhbXBsZXMsIGlGaWVsZCk7CisKKworICAgICAgIH0KKworICAgICAgIHJldHVybiBUUlVFOworfQorCisKKworc3RhdGljCitjbXNCb29sIERhdGFTZWN0aW9uIChjbXNJVDgqIGl0OCkKK3sKKyAgICBpbnQgIGlGaWVsZCA9IDA7CisgICAgaW50ICBpU2V0ICAgPSAwOworICAgIGNoYXIgQnVmZmVyWzI1Nl07CisgICAgVEFCTEUqIHQgPSBHZXRUYWJsZShpdDgpOworCisgICAgSW5TeW1ib2woaXQ4KTsgICAvLyBFYXRzICJCRUdJTl9EQVRBIgorICAgIENoZWNrRU9MTihpdDgpOworCisgICAgaWYgKCF0LT5EYXRhKQorICAgICAgICBBbGxvY2F0ZURhdGFTZXQoaXQ4KTsKKworICAgIHdoaWxlIChpdDgtPnN5ICE9IFNFTkRfREFUQSAmJiBpdDgtPnN5ICE9IFNFT0YpCisgICAgeworICAgICAgICBpZiAoaUZpZWxkID49IHQgLT4gblNhbXBsZXMpIHsKKyAgICAgICAgICAgIGlGaWVsZCA9IDA7CisgICAgICAgICAgICBpU2V0Kys7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpdDgtPnN5ICE9IFNFTkRfREFUQSAmJiBpdDgtPnN5ICE9IFNFT0YpIHsKKworICAgICAgICAgICAgaWYgKCFHZXRWYWwoaXQ4LCBCdWZmZXIsIDI1NSwgIlNhbXBsZSBkYXRhIGV4cGVjdGVkIikpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICBpZiAoIVNldERhdGEoaXQ4LCBpU2V0LCBpRmllbGQsIEJ1ZmZlcikpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICBpRmllbGQrKzsKKworICAgICAgICAgICAgSW5TeW1ib2woaXQ4KTsKKyAgICAgICAgICAgIFNraXBFT0xOKGl0OCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTa2lwRU9MTihpdDgpOworICAgIFNraXAoaXQ4LCBTRU5EX0RBVEEpOworICAgIFNraXBFT0xOKGl0OCk7CisKKyAgICAvLyBDaGVjayBmb3IgZGF0YSBjb21wbGV0aW9uLgorCisgICAgaWYgKChpU2V0KzEpICE9IHQgLT4gblBhdGNoZXMpCisgICAgICAgIHJldHVybiBTeW5FcnJvcihpdDgsICJDb3VudCBtaXNtYXRjaC4gTlVNQkVSX09GX1NFVFMgd2FzICVkLCBmb3VuZCAlZFxuIiwgdCAtPm5QYXRjaGVzLCBpU2V0KzEpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworCisKK3N0YXRpYworY21zQm9vbCBIZWFkZXJTZWN0aW9uKGNtc0lUOCogaXQ4KQoreworICAgIGNoYXIgVmFyTmFtZVtNQVhJRF07CisgICAgY2hhciBCdWZmZXJbTUFYU1RSXTsKKyAgICBLRVlWQUxVRSogS2V5OworCisgICAgICAgIHdoaWxlIChpdDgtPnN5ICE9IFNFT0YgJiYKKyAgICAgICAgICAgICAgIGl0OC0+c3kgIT0gU1NZTkVSUk9SICYmCisgICAgICAgICAgICAgICBpdDgtPnN5ICE9IFNCRUdJTl9EQVRBX0ZPUk1BVCAmJgorICAgICAgICAgICAgICAgaXQ4LT5zeSAhPSBTQkVHSU5fREFUQSkgeworCisKKyAgICAgICAgc3dpdGNoIChpdDggLT4gc3kpIHsKKworICAgICAgICBjYXNlIFNLRVlXT1JEOgorICAgICAgICAgICAgICAgIEluU3ltYm9sKGl0OCk7CisgICAgICAgICAgICAgICAgaWYgKCFHZXRWYWwoaXQ4LCBCdWZmZXIsIE1BWFNUUi0xLCAiS2V5d29yZCBleHBlY3RlZCIpKSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgaWYgKCFBZGRBdmFpbGFibGVQcm9wZXJ0eShpdDgsIEJ1ZmZlciwgV1JJVEVfVU5DT09LRUQpKSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgSW5TeW1ib2woaXQ4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgU0RBVEFfRk9STUFUX0lEOgorICAgICAgICAgICAgICAgIEluU3ltYm9sKGl0OCk7CisgICAgICAgICAgICAgICAgaWYgKCFHZXRWYWwoaXQ4LCBCdWZmZXIsIE1BWFNUUi0xLCAiS2V5d29yZCBleHBlY3RlZCIpKSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgaWYgKCFBZGRBdmFpbGFibGVTYW1wbGVJRChpdDgsIEJ1ZmZlcikpIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICBJblN5bWJvbChpdDgpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgY2FzZSBTSURFTlQ6CisgICAgICAgICAgICAgICAgc3RybmNweShWYXJOYW1lLCBpdDgtPmlkLCBNQVhJRC0xKTsKKyAgICAgICAgICAgICAgICBWYXJOYW1lW01BWElELTFdID0gMDsKKworICAgICAgICAgICAgICAgIGlmICghSXNBdmFpbGFibGVPbkxpc3QoaXQ4LT4gVmFsaWRLZXl3b3JkcywgVmFyTmFtZSwgTlVMTCwgJktleSkpIHsKKworI2lmZGVmIENNU19TVFJJQ1RfQ0dBVFMKKyAgICAgICAgICAgICAgICAgcmV0dXJuIFN5bkVycm9yKGl0OCwgIlVuZGVmaW5lZCBrZXl3b3JkICclcyciLCBWYXJOYW1lKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIEtleSA9IEFkZEF2YWlsYWJsZVByb3BlcnR5KGl0OCwgVmFyTmFtZSwgV1JJVEVfVU5DT09LRUQpOworICAgICAgICAgICAgICAgICAgICBpZiAoS2V5ID09IE5VTEwpIHJldHVybiBGQUxTRTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEluU3ltYm9sKGl0OCk7CisgICAgICAgICAgICAgICAgaWYgKCFHZXRWYWwoaXQ4LCBCdWZmZXIsIE1BWFNUUi0xLCAiUHJvcGVydHkgZGF0YSBleHBlY3RlZCIpKSByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICAgICAgICBpZihLZXktPldyaXRlQXMgIT0gV1JJVEVfUEFJUikgeworICAgICAgICAgICAgICAgICAgICBBZGRUb0xpc3QoaXQ4LCAmR2V0VGFibGUoaXQ4KS0+SGVhZGVyTGlzdCwgVmFyTmFtZSwgTlVMTCwgQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXQ4LT5zeSA9PSBTU1RSSU5HKSA/IFdSSVRFX1NUUklOR0lGWSA6IFdSSVRFX1VOQ09PS0VEKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKlN1YmtleTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqTmV4dGtleTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0OC0+c3kgIT0gU1NUUklORykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTeW5FcnJvcihpdDgsICJJbnZhbGlkIHZhbHVlICclcycgZm9yIHByb3BlcnR5ICclcycuIiwgQnVmZmVyLCBWYXJOYW1lKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBjaG9wIHRoZSBzdHJpbmcgYXMgYSBsaXN0IG9mICJzdWJrZXksIHZhbHVlIiBwYWlycywgdXNpbmcgJzsnIGFzIGEgc2VwYXJhdG9yCisgICAgICAgICAgICAgICAgICAgIGZvciAoU3Via2V5ID0gQnVmZmVyOyBTdWJrZXkgIT0gTlVMTDsgU3Via2V5ID0gTmV4dGtleSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqVmFsdWUsICp0ZW1wOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgaWRlbnRpZnkgdG9rZW4gcGFpciBib3VuZGFyeQorICAgICAgICAgICAgICAgICAgICAgICAgTmV4dGtleSA9IChjaGFyKikgc3RyY2hyKFN1YmtleSwgJzsnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKE5leHRrZXkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKk5leHRrZXkrKyA9ICdcMCc7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBlYWNoIHBhaXIsIHNwbGl0IHRoZSBzdWJrZXkgYW5kIHRoZSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSAoY2hhciopIHN0cnJjaHIoU3Via2V5LCAnLCcpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoVmFsdWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3luRXJyb3IoaXQ4LCAiSW52YWxpZCB2YWx1ZSBmb3IgcHJvcGVydHkgJyVzJy4iLCBWYXJOYW1lKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ29iYmxlIHRoZSBzcGFjZXMgYmVmb3JlIHRoZSBjb21hLCBhbmQgdGhlIGNvbWEgaXRzZWxmCisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gVmFsdWUrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvICp0ZW1wLS0gPSAnXDAnOyB3aGlsZSh0ZW1wID49IFN1YmtleSAmJiAqdGVtcCA9PSAnICcpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBnb2JibGUgYW55IHNwYWNlIGF0IHRoZSByaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IFZhbHVlICsgc3RybGVuKFZhbHVlKSAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSgqdGVtcCA9PSAnICcpICp0ZW1wLS0gPSAnXDAnOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmltIHRoZSBzdHJpbmdzIGZyb20gdGhlIGxlZnQKKyAgICAgICAgICAgICAgICAgICAgICAgIFN1YmtleSArPSBzdHJzcG4oU3Via2V5LCAiICIpOworICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKz0gc3Ryc3BuKFZhbHVlLCAiICIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZihTdWJrZXlbMF0gPT0gMCB8fCBWYWx1ZVswXSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTeW5FcnJvcihpdDgsICJJbnZhbGlkIHZhbHVlIGZvciBwcm9wZXJ0eSAnJXMnLiIsIFZhck5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgQWRkVG9MaXN0KGl0OCwgJkdldFRhYmxlKGl0OCktPkhlYWRlckxpc3QsIFZhck5hbWUsIFN1YmtleSwgVmFsdWUsIFdSSVRFX1BBSVIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgSW5TeW1ib2woaXQ4KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgIGNhc2UgU0VPTE46IGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFN5bkVycm9yKGl0OCwgImV4cGVjdGVkIGtleXdvcmQgb3IgaWRlbnRpZmllciIpOworICAgICAgICB9CisKKyAgICBTa2lwRU9MTihpdDgpOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworCit9CisKKworc3RhdGljCit2b2lkIFJlYWRUeXBlKGNtc0lUOCogaXQ4LCBjaGFyKiBTaGVldFR5cGVQdHIpCit7CisgICAgLy8gRmlyc3QgbGluZSBpcyBhIHZlcnkgc3BlY2lhbCBjYXNlLgorCisgICAgd2hpbGUgKGlzc2VwYXJhdG9yKGl0OC0+Y2gpKQorICAgICAgICAgICAgTmV4dENoKGl0OCk7CisKKyAgICB3aGlsZSAoaXQ4LT5jaCAhPSAnXHInICYmIGl0OCAtPmNoICE9ICdcbicgJiYgaXQ4LT5jaCAhPSAnXHQnICYmIGl0OCAtPiBjaCAhPSAtMSkgeworCisgICAgICAgICpTaGVldFR5cGVQdHIrKz0gKGNoYXIpIGl0OCAtPmNoOworICAgICAgICBOZXh0Q2goaXQ4KTsKKyAgICB9CisKKyAgICAqU2hlZXRUeXBlUHRyID0gMDsKK30KKworCitzdGF0aWMKK2Ntc0Jvb2wgUGFyc2VJVDgoY21zSVQ4KiBpdDgsIGNtc0Jvb2wgbm9zaGVldCkKK3sKKyAgICBjaGFyKiBTaGVldFR5cGVQdHIgPSBpdDggLT5UYWJbMF0uU2hlZXRUeXBlOworCisgICAgaWYgKG5vc2hlZXQgPT0gMCkgeworICAgICAgICBSZWFkVHlwZShpdDgsIFNoZWV0VHlwZVB0cik7CisgICAgfQorCisgICAgSW5TeW1ib2woaXQ4KTsKKworICAgIFNraXBFT0xOKGl0OCk7CisKKyAgICB3aGlsZSAoaXQ4LT4gc3kgIT0gU0VPRiAmJgorICAgICAgICAgICBpdDgtPiBzeSAhPSBTU1lORVJST1IpIHsKKworICAgICAgICAgICAgc3dpdGNoIChpdDggLT4gc3kpIHsKKworICAgICAgICAgICAgY2FzZSBTQkVHSU5fREFUQV9GT1JNQVQ6CisgICAgICAgICAgICAgICAgICAgIGlmICghRGF0YUZvcm1hdFNlY3Rpb24oaXQ4KSkgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTQkVHSU5fREFUQToKKworICAgICAgICAgICAgICAgICAgICBpZiAoIURhdGFTZWN0aW9uKGl0OCkpIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaXQ4IC0+IHN5ICE9IFNFT0YpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jVGFibGUoaXQ4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdDggLT5uVGFibGUgPSBpdDggLT5UYWJsZXNDb3VudCAtIDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWFkIHNoZWV0IHR5cGUgaWYgcHJlc2VudC4gV2Ugb25seSBzdXBwb3J0IGlkZW50aWZpZXIgYW5kIHN0cmluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA8aWRlbnQ+IDxlb2xuPiBpcyBhIHR5cGUgc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW55dGhpbmcgZWxzZSwgaXMgbm90IGEgdHlwZSBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9zaGVldCA9PSAwKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0OCAtPnN5ID09IFNJREVOVCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXkgYmUgYSB0eXBlIHNoZWV0IG9yIG1heSBiZSBhIHByb3AgdmFsdWUgc3RhdGVtZW50LiBXZSBjYW5ub3QgdXNlIGluc3ltYm9sIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHNwZWNpYWwgY2FzZS4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpc3NlcGFyYXRvcihpdDgtPmNoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV4dENoKGl0OCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIG5ld2xpbmUgaXMgZm91bmQsIHRoZW4gdGhpcyBpcyBhIHR5cGUgc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQ4IC0+Y2ggPT0gJ1xuJyB8fCBpdDgtPmNoID09ICdccicpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNJVDhTZXRTaGVldFR5cGUoaXQ4LCBpdDggLT5pZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluU3ltYm9sKGl0OCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQgaXMgbm90LiBKdXN0IGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSVQ4U2V0U2hlZXRUeXBlKGl0OCwgIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIHF1b3RlZCBzdHJpbmdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQ4IC0+c3kgPT0gU1NUUklORykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0lUOFNldFNoZWV0VHlwZShpdDgsIGl0OCAtPnN0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5TeW1ib2woaXQ4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNFT0xOOgorICAgICAgICAgICAgICAgICAgICBTa2lwRU9MTihpdDgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFIZWFkZXJTZWN0aW9uKGl0OCkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuIChpdDggLT4gc3kgIT0gU1NZTkVSUk9SKTsKK30KKworCisKKy8vIEluaXQgdXNlZnVsIHBvaW50ZXJzCisKK3N0YXRpYwordm9pZCBDb29rUG9pbnRlcnMoY21zSVQ4KiBpdDgpCit7CisgICAgaW50IGlkRmllbGQsIGk7CisgICAgY2hhciogRmxkOworICAgIGNtc1VJbnQzMk51bWJlciBqOworICAgIGNtc1VJbnQzMk51bWJlciBuT2xkVGFibGUgPSBpdDggLT5uVGFibGU7CisKKyAgICBmb3IgKGo9MDsgaiA8IGl0OCAtPlRhYmxlc0NvdW50OyBqKyspIHsKKworICAgIFRBQkxFKiB0ID0gaXQ4IC0+VGFiICsgajsKKworICAgIHQgLT4gU2FtcGxlSUQgPSAwOworICAgIGl0OCAtPm5UYWJsZSA9IGo7CisKKyAgICBmb3IgKGlkRmllbGQgPSAwOyBpZEZpZWxkIDwgdCAtPiBuU2FtcGxlczsgaWRGaWVsZCsrKQorICAgIHsKKyAgICAgICAgaWYgKHQgLT5EYXRhRm9ybWF0ID09IE5VTEwpeworICAgICAgICAgICAgU3luRXJyb3IoaXQ4LCAiVW5kZWZpbmVkIERBVEFfRk9STUFUIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBGbGQgPSB0LT5EYXRhRm9ybWF0W2lkRmllbGRdOworICAgICAgICBpZiAoIUZsZCkgY29udGludWU7CisKKworICAgICAgICBpZiAoY21zc3RyY2FzZWNtcChGbGQsICJTQU1QTEVfSUQiKSA9PSAwKSB7CisKKyAgICAgICAgICAgIHQgLT4gU2FtcGxlSUQgPSBpZEZpZWxkOworCisgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHQgLT4gblBhdGNoZXM7IGkrKykgeworCisgICAgICAgICAgICAgICAgY2hhciAqRGF0YSA9IEdldERhdGEoaXQ4LCBpLCBpZEZpZWxkKTsKKyAgICAgICAgICAgICAgICBpZiAoRGF0YSkgeworICAgICAgICAgICAgICAgICAgICBjaGFyIEJ1ZmZlclsyNTZdOworCisgICAgICAgICAgICAgICAgICAgIHN0cm5jcHkoQnVmZmVyLCBEYXRhLCAyNTUpOworICAgICAgICAgICAgICAgICAgICBCdWZmZXJbMjU1XSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmxlbihCdWZmZXIpIDw9IHN0cmxlbihEYXRhKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweShEYXRhLCBCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBTZXREYXRhKGl0OCwgaSwgaWRGaWVsZCwgQnVmZmVyKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgLy8gIkxBQkVMIiBpcyBhbiBleHRlbnNpb24uIEl0IGtlZXBzIHJlZmVyZW5jZXMgdG8gZm9yd2FyZCB0YWJsZXMKKworICAgICAgICBpZiAoKGNtc3N0cmNhc2VjbXAoRmxkLCAiTEFCRUwiKSA9PSAwKSB8fCBGbGRbMF0gPT0gJyQnICkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIFNlYXJjaCBmb3IgdGFibGUgcmVmZXJlbmNlcy4uLgorICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHQgLT4gblBhdGNoZXM7IGkrKykgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqTGFiZWwgPSBHZXREYXRhKGl0OCwgaSwgaWRGaWVsZCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTGFiZWwpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBsYWJlbCwgc2VhcmNoIGZvciBhIHRhYmxlIGNvbnRhaW5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBwcm9wZXJ0eQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaz0wOyBrIDwgaXQ4IC0+VGFibGVzQ291bnQ7IGsrKykgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUJMRSogVGFibGUgPSBpdDggLT5UYWIgKyBrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZVkFMVUUqIHA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJc0F2YWlsYWJsZU9uTGlzdChUYWJsZS0+SGVhZGVyTGlzdCwgTGFiZWwsIE5VTEwsICZwKSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXZhaWxhYmxlLCBrZWVwIHR5cGUgYW5kIHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBCdWZmZXJbMjU2XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKlR5cGUgID0gcCAtPlZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgblRhYmxlID0gKGludCkgazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKEJ1ZmZlciwgMjU1LCAiJXMgJWQgJXMiLCBMYWJlbCwgblRhYmxlLCBUeXBlICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXREYXRhKGl0OCwgaSwgaWRGaWVsZCwgQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorCisgICAgfQorICAgIH0KKworICAgIGl0OCAtPm5UYWJsZSA9IG5PbGRUYWJsZTsKK30KKworLy8gVHJ5IHRvIGluZmVyZSBpZiB0aGUgZmlsZSBpcyBhIENHQVRTL0lUOCBmaWxlIGF0IGFsbC4gUmVhZCBmaXJzdCBsaW5lCisvLyB0aGF0IHNob3VsZCBiZSBzb21ldGhpbmcgbGlrZSBzb21lIHByaW50YWJsZSBjaGFyYWN0ZXJzIHBsdXMgYSBcbgorLy8gcmV0dXJucyAwIGlmIHRoaXMgaXMgbm90IGxpa2UgYSBDR0FUUywgb3IgYW4gaW50ZWdlciBvdGhlcndpc2UuIFRoaXMgaW50ZWdlciBpcyB0aGUgbnVtYmVyIG9mIHdvcmRzIGluIGZpcnN0IGxpbmU/CitzdGF0aWMKK2ludCBJc015QmxvY2soY21zVUludDhOdW1iZXIqIEJ1ZmZlciwgaW50IG4pCit7CisgICAgaW50IHdvcmRzID0gMSwgc3BhY2UgPSAwLCBxdW90ID0gMDsKKyAgICBpbnQgaTsKKworICAgIGlmIChuIDwgMTApIHJldHVybiAwOyAgIC8vIFRvbyBzbWFsbAorCisgICAgaWYgKG4gPiAxMzIpCisgICAgICAgIG4gPSAxMzI7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7CisKKyAgICAgICAgc3dpdGNoKEJ1ZmZlcltpXSkKKyAgICAgICAgeworICAgICAgICBjYXNlICdcbic6CisgICAgICAgIGNhc2UgJ1xyJzoKKyAgICAgICAgICAgIHJldHVybiAoKHF1b3QgPT0gMSkgfHwgKHdvcmRzID4gMikpID8gMCA6IHdvcmRzOworICAgICAgICBjYXNlICdcdCc6CisgICAgICAgIGNhc2UgJyAnOgorICAgICAgICAgICAgaWYoIXF1b3QgJiYgIXNwYWNlKQorICAgICAgICAgICAgICAgIHNwYWNlID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdcIic6CisgICAgICAgICAgICBxdW90ID0gIXF1b3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmIChCdWZmZXJbaV0gPCAzMikgcmV0dXJuIDA7CisgICAgICAgICAgICBpZiAoQnVmZmVyW2ldID4gMTI3KSByZXR1cm4gMDsKKyAgICAgICAgICAgIHdvcmRzICs9IHNwYWNlOworICAgICAgICAgICAgc3BhY2UgPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMKK2Ntc0Jvb2wgSXNNeUZpbGUoY29uc3QgY2hhciogRmlsZU5hbWUpCit7CisgICBGSUxFICpmcDsKKyAgIGNtc1VJbnQzMk51bWJlciBTaXplOworICAgY21zVUludDhOdW1iZXIgUHRyWzEzM107CisKKyAgIGZwID0gZm9wZW4oRmlsZU5hbWUsICJydCIpOworICAgaWYgKCFmcCkgeworICAgICAgIGNtc1NpZ25hbEVycm9yKDAsIGNtc0VSUk9SX0ZJTEUsICJGaWxlICclcycgbm90IGZvdW5kIiwgRmlsZU5hbWUpOworICAgICAgIHJldHVybiBGQUxTRTsKKyAgIH0KKworICAgU2l6ZSA9IChjbXNVSW50MzJOdW1iZXIpIGZyZWFkKFB0ciwgMSwgMTMyLCBmcCk7CisKKyAgIGlmIChmY2xvc2UoZnApICE9IDApCisgICAgICAgcmV0dXJuIEZBTFNFOworCisgICBQdHJbU2l6ZV0gPSAnXDAnOworCisgICByZXR1cm4gSXNNeUJsb2NrKFB0ciwgU2l6ZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRXhwb3J0ZWQgcm91dGluZXMKKworCitjbXNIQU5ETEUgIENNU0VYUE9SVCBjbXNJVDhMb2FkRnJvbU1lbShjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbGVuKQoreworICAgIGNtc0hBTkRMRSBoSVQ4OworICAgIGNtc0lUOCogIGl0ODsKKyAgICBpbnQgdHlwZTsKKworICAgIF9jbXNBc3NlcnQoUHRyICE9IE5VTEwpOworICAgIF9jbXNBc3NlcnQobGVuICE9IDApOworCisgICAgdHlwZSA9IElzTXlCbG9jaygoY21zVUludDhOdW1iZXIqKVB0ciwgbGVuKTsKKyAgICBpZiAodHlwZSA9PSAwKSByZXR1cm4gTlVMTDsKKworICAgIGhJVDggPSBjbXNJVDhBbGxvYyhDb250ZXh0SUQpOworICAgIGlmICghaElUOCkgcmV0dXJuIE5VTEw7CisKKyAgICBpdDggPSAoY21zSVQ4KikgaElUODsKKyAgICBpdDggLT5NZW1vcnlCbG9jayA9IChjaGFyKikgX2Ntc01hbGxvYyhDb250ZXh0SUQsIGxlbiArIDEpOworCisgICAgc3RybmNweShpdDggLT5NZW1vcnlCbG9jaywgKGNvbnN0IGNoYXIqKSBQdHIsIGxlbik7CisgICAgaXQ4IC0+TWVtb3J5QmxvY2tbbGVuXSA9IDA7CisKKyAgICBzdHJuY3B5KGl0OC0+RmlsZVN0YWNrWzBdLT5GaWxlTmFtZSwgIiIsIGNtc01BWF9QQVRILTEpOworICAgIGl0OC0+IFNvdXJjZSA9IGl0OCAtPiBNZW1vcnlCbG9jazsKKworICAgIGlmICghUGFyc2VJVDgoaXQ4LCB0eXBlLTEpKSB7CisKKyAgICAgICAgY21zSVQ4RnJlZShoSVQ4KTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIENvb2tQb2ludGVycyhpdDgpOworICAgIGl0OCAtPm5UYWJsZSA9IDA7CisKKyAgICBfY21zRnJlZShDb250ZXh0SUQsIGl0OC0+TWVtb3J5QmxvY2spOworICAgIGl0OCAtPiBNZW1vcnlCbG9jayA9IE5VTEw7CisKKyAgICByZXR1cm4gaElUODsKKworCit9CisKKworY21zSEFORExFICBDTVNFWFBPUlQgY21zSVQ4TG9hZEZyb21GaWxlKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCBjaGFyKiBjRmlsZU5hbWUpCit7CisKKyAgICAgY21zSEFORExFIGhJVDg7CisgICAgIGNtc0lUOCogIGl0ODsKKyAgICAgaW50IHR5cGU7CisKKyAgICAgX2Ntc0Fzc2VydChjRmlsZU5hbWUgIT0gTlVMTCk7CisKKyAgICAgdHlwZSA9IElzTXlGaWxlKGNGaWxlTmFtZSk7CisgICAgIGlmICh0eXBlID09IDApIHJldHVybiBOVUxMOworCisgICAgIGhJVDggPSBjbXNJVDhBbGxvYyhDb250ZXh0SUQpOworICAgICBpdDggPSAoY21zSVQ4KikgaElUODsKKyAgICAgaWYgKCFoSVQ4KSByZXR1cm4gTlVMTDsKKworCisgICAgIGl0OCAtPkZpbGVTdGFja1swXS0+U3RyZWFtID0gZm9wZW4oY0ZpbGVOYW1lLCAicnQiKTsKKworICAgICBpZiAoIWl0OCAtPkZpbGVTdGFja1swXS0+U3RyZWFtKSB7CisgICAgICAgICBjbXNJVDhGcmVlKGhJVDgpOworICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgIH0KKworCisgICAgc3RybmNweShpdDgtPkZpbGVTdGFja1swXS0+RmlsZU5hbWUsIGNGaWxlTmFtZSwgY21zTUFYX1BBVEgtMSk7CisgICAgaXQ4LT5GaWxlU3RhY2tbMF0tPkZpbGVOYW1lW2Ntc01BWF9QQVRILTFdID0gMDsKKworICAgIGlmICghUGFyc2VJVDgoaXQ4LCB0eXBlLTEpKSB7CisKKyAgICAgICAgICAgIGZjbG9zZShpdDggLT5GaWxlU3RhY2tbMF0tPlN0cmVhbSk7CisgICAgICAgICAgICBjbXNJVDhGcmVlKGhJVDgpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgQ29va1BvaW50ZXJzKGl0OCk7CisgICAgaXQ4IC0+blRhYmxlID0gMDsKKworICAgIGlmIChmY2xvc2UoaXQ4IC0+RmlsZVN0YWNrWzBdLT5TdHJlYW0pIT0gMCkgeworICAgICAgICAgICAgY21zSVQ4RnJlZShoSVQ4KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBoSVQ4OworCit9CisKK2ludCBDTVNFWFBPUlQgY21zSVQ4RW51bURhdGFGb3JtYXQoY21zSEFORExFIGhJVDgsIGNoYXIgKioqU2FtcGxlTmFtZXMpCit7CisgICAgY21zSVQ4KiBpdDggPSAoY21zSVQ4KikgaElUODsKKyAgICBUQUJMRSogdDsKKworICAgIF9jbXNBc3NlcnQoaElUOCAhPSBOVUxMKTsKKworICAgIHQgPSBHZXRUYWJsZShpdDgpOworCisgICAgaWYgKFNhbXBsZU5hbWVzKQorICAgICAgICAqU2FtcGxlTmFtZXMgPSB0IC0+IERhdGFGb3JtYXQ7CisgICAgcmV0dXJuIHQgLT4gblNhbXBsZXM7Cit9CisKKworY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNJVDhFbnVtUHJvcGVydGllcyhjbXNIQU5ETEUgaElUOCwgY2hhciAqKipQcm9wZXJ0eU5hbWVzKQoreworICAgIGNtc0lUOCogaXQ4ID0gKGNtc0lUOCopIGhJVDg7CisgICAgS0VZVkFMVUUqIHA7CisgICAgY21zVUludDMyTnVtYmVyIG47CisgICAgY2hhciAqKlByb3BzOworICAgIFRBQkxFKiB0OworCisgICAgX2Ntc0Fzc2VydChoSVQ4ICE9IE5VTEwpOworCisgICAgdCA9IEdldFRhYmxlKGl0OCk7CisKKyAgICAvLyBQYXNzIzEgLSBjb3VudCBwcm9wZXJ0aWVzCisKKyAgICBuID0gMDsKKyAgICBmb3IgKHAgPSB0IC0+IEhlYWRlckxpc3Q7ICBwICE9IE5VTEw7IHAgPSBwLT5OZXh0KSB7CisgICAgICAgIG4rKzsKKyAgICB9CisKKworICAgIFByb3BzID0gKGNoYXIgKiopIEFsbG9jQ2h1bmsoaXQ4LCBzaXplb2YoY2hhciAqKSAqIG4pOworCisgICAgLy8gUGFzcyMyIC0gRmlsbCBwb2ludGVycworICAgIG4gPSAwOworICAgIGZvciAocCA9IHQgLT4gSGVhZGVyTGlzdDsgIHAgIT0gTlVMTDsgcCA9IHAtPk5leHQpIHsKKyAgICAgICAgUHJvcHNbbisrXSA9IHAgLT4gS2V5d29yZDsKKyAgICB9CisKKyAgICAqUHJvcGVydHlOYW1lcyA9IFByb3BzOworICAgIHJldHVybiBuOworfQorCitjbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0lUOEVudW1Qcm9wZXJ0eU11bHRpKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBjUHJvcCwgY29uc3QgY2hhciAqKipTdWJwcm9wZXJ0eU5hbWVzKQoreworICAgIGNtc0lUOCogaXQ4ID0gKGNtc0lUOCopIGhJVDg7CisgICAgS0VZVkFMVUUgKnAsICp0bXA7CisgICAgY21zVUludDMyTnVtYmVyIG47CisgICAgY29uc3QgY2hhciAqKlByb3BzOworICAgIFRBQkxFKiB0OworCisgICAgX2Ntc0Fzc2VydChoSVQ4ICE9IE5VTEwpOworCisKKyAgICB0ID0gR2V0VGFibGUoaXQ4KTsKKworICAgIGlmKCFJc0F2YWlsYWJsZU9uTGlzdCh0LT5IZWFkZXJMaXN0LCBjUHJvcCwgTlVMTCwgJnApKSB7CisgICAgICAgICpTdWJwcm9wZXJ0eU5hbWVzID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gUGFzcyMxIC0gY291bnQgcHJvcGVydGllcworCisgICAgbiA9IDA7CisgICAgZm9yICh0bXAgPSBwOyAgdG1wICE9IE5VTEw7IHRtcCA9IHRtcC0+TmV4dFN1YmtleSkgeworICAgICAgICBpZih0bXAtPlN1YmtleSAhPSBOVUxMKQorICAgICAgICAgICAgbisrOworICAgIH0KKworCisgICAgUHJvcHMgPSAoY29uc3QgY2hhciAqKikgQWxsb2NDaHVuayhpdDgsIHNpemVvZihjaGFyICopICogbik7CisKKyAgICAvLyBQYXNzIzIgLSBGaWxsIHBvaW50ZXJzCisgICAgbiA9IDA7CisgICAgZm9yICh0bXAgPSBwOyAgdG1wICE9IE5VTEw7IHRtcCA9IHRtcC0+TmV4dFN1YmtleSkgeworICAgICAgICBpZih0bXAtPlN1YmtleSAhPSBOVUxMKQorICAgICAgICAgICAgUHJvcHNbbisrXSA9IHAgLT5TdWJrZXk7CisgICAgfQorCisgICAgKlN1YnByb3BlcnR5TmFtZXMgPSBQcm9wczsKKyAgICByZXR1cm4gbjsKK30KKworc3RhdGljCitpbnQgTG9jYXRlUGF0Y2goY21zSVQ4KiBpdDgsIGNvbnN0IGNoYXIqIGNQYXRjaCkKK3sKKyAgICBpbnQgaTsKKyAgICBjb25zdCBjaGFyICpkYXRhOworICAgIFRBQkxFKiB0ID0gR2V0VGFibGUoaXQ4KTsKKworICAgIGZvciAoaT0wOyBpIDwgdC0+IG5QYXRjaGVzOyBpKyspIHsKKworICAgICAgICBkYXRhID0gR2V0RGF0YShpdDgsIGksIHQtPlNhbXBsZUlEKTsKKworICAgICAgICBpZiAoZGF0YSAhPSBOVUxMKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoY21zc3RyY2FzZWNtcChkYXRhLCBjUGF0Y2gpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTeW5FcnJvcihpdDgsICJDb3VsZG4ndCBmaW5kIHBhdGNoICclcydcbiIsIGNQYXRjaCk7CisgICAgICAgIHJldHVybiAtMTsKK30KKworCitzdGF0aWMKK2ludCBMb2NhdGVFbXB0eVBhdGNoKGNtc0lUOCogaXQ4KQoreworICAgIGludCBpOworICAgIGNvbnN0IGNoYXIgKmRhdGE7CisgICAgVEFCTEUqIHQgPSBHZXRUYWJsZShpdDgpOworCisgICAgZm9yIChpPTA7IGkgPCB0LT4gblBhdGNoZXM7IGkrKykgeworCisgICAgICAgIGRhdGEgPSBHZXREYXRhKGl0OCwgaSwgdC0+U2FtcGxlSUQpOworCisgICAgICAgIGlmIChkYXRhID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gaTsKKworICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKworc3RhdGljCitpbnQgTG9jYXRlU2FtcGxlKGNtc0lUOCogaXQ4LCBjb25zdCBjaGFyKiBjU2FtcGxlKQoreworICAgIGludCBpOworICAgIGNvbnN0IGNoYXIgKmZsZDsKKyAgICBUQUJMRSogdCA9IEdldFRhYmxlKGl0OCk7CisKKyAgICBmb3IgKGk9MDsgaSA8IHQtPm5TYW1wbGVzOyBpKyspIHsKKworICAgICAgICBmbGQgPSBHZXREYXRhRm9ybWF0KGl0OCwgaSk7CisgICAgICAgIGlmIChmbGQgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGNtc3N0cmNhc2VjbXAoZmxkLCBjU2FtcGxlKSA9PSAwKQorICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIC0xOworCit9CisKKworaW50IENNU0VYUE9SVCBjbXNJVDhGaW5kRGF0YUZvcm1hdChjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciogY1NhbXBsZSkKK3sKKyAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OworCisgICAgX2Ntc0Fzc2VydChoSVQ4ICE9IE5VTEwpOworCisgICAgcmV0dXJuIExvY2F0ZVNhbXBsZShpdDgsIGNTYW1wbGUpOworfQorCisKKworY29uc3QgY2hhciogQ01TRVhQT1JUIGNtc0lUOEdldERhdGFSb3dDb2woY21zSEFORExFIGhJVDgsIGludCByb3csIGludCBjb2wpCit7CisgICAgY21zSVQ4KiBpdDggPSAoY21zSVQ4KikgaElUODsKKworICAgIF9jbXNBc3NlcnQoaElUOCAhPSBOVUxMKTsKKworICAgIHJldHVybiBHZXREYXRhKGl0OCwgcm93LCBjb2wpOworfQorCisKK2Ntc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIGNtc0lUOEdldERhdGFSb3dDb2xEYmwoY21zSEFORExFIGhJVDgsIGludCByb3csIGludCBjb2wpCit7CisgICAgY29uc3QgY2hhciogQnVmZmVyOworCisgICAgQnVmZmVyID0gY21zSVQ4R2V0RGF0YVJvd0NvbChoSVQ4LCByb3csIGNvbCk7CisKKyAgICBpZiAoQnVmZmVyID09IE5VTEwpIHJldHVybiAwLjA7CisKKyAgICByZXR1cm4gUGFyc2VGbG9hdE51bWJlcihCdWZmZXIpOworfQorCisKK2Ntc0Jvb2wgQ01TRVhQT1JUIGNtc0lUOFNldERhdGFSb3dDb2woY21zSEFORExFIGhJVDgsIGludCByb3csIGludCBjb2wsIGNvbnN0IGNoYXIqIFZhbCkKK3sKKyAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OworCisgICAgX2Ntc0Fzc2VydChoSVQ4ICE9IE5VTEwpOworCisgICAgcmV0dXJuIFNldERhdGEoaXQ4LCByb3csIGNvbCwgVmFsKTsKK30KKworCitjbXNCb29sIENNU0VYUE9SVCBjbXNJVDhTZXREYXRhUm93Q29sRGJsKGNtc0hBTkRMRSBoSVQ4LCBpbnQgcm93LCBpbnQgY29sLCBjbXNGbG9hdDY0TnVtYmVyIFZhbCkKK3sKKyAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OworICAgIGNoYXIgQnVmZlsyNTZdOworCisgICAgX2Ntc0Fzc2VydChoSVQ4ICE9IE5VTEwpOworCisgICAgc25wcmludGYoQnVmZiwgMjU1LCBpdDgtPkRvdWJsZUZvcm1hdHRlciwgVmFsKTsKKworICAgIHJldHVybiBTZXREYXRhKGl0OCwgcm93LCBjb2wsIEJ1ZmYpOworfQorCisKKworY29uc3QgY2hhciogQ01TRVhQT1JUIGNtc0lUOEdldERhdGEoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIGNQYXRjaCwgY29uc3QgY2hhciogY1NhbXBsZSkKK3sKKyAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OworICAgIGludCBpRmllbGQsIGlTZXQ7CisKKyAgICBfY21zQXNzZXJ0KGhJVDggIT0gTlVMTCk7CisKKyAgICBpRmllbGQgPSBMb2NhdGVTYW1wbGUoaXQ4LCBjU2FtcGxlKTsKKyAgICBpZiAoaUZpZWxkIDwgMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpU2V0ID0gTG9jYXRlUGF0Y2goaXQ4LCBjUGF0Y2gpOworICAgIGlmIChpU2V0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIEdldERhdGEoaXQ4LCBpU2V0LCBpRmllbGQpOworfQorCisKK2Ntc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIGNtc0lUOEdldERhdGFEYmwoY21zSEFORExFICBpdDgsIGNvbnN0IGNoYXIqIGNQYXRjaCwgY29uc3QgY2hhciogY1NhbXBsZSkKK3sKKyAgICBjb25zdCBjaGFyKiBCdWZmZXI7CisKKyAgICBCdWZmZXIgPSBjbXNJVDhHZXREYXRhKGl0OCwgY1BhdGNoLCBjU2FtcGxlKTsKKworICAgIHJldHVybiBQYXJzZUZsb2F0TnVtYmVyKEJ1ZmZlcik7Cit9CisKKworCitjbXNCb29sIENNU0VYUE9SVCBjbXNJVDhTZXREYXRhKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBjUGF0Y2gsIGNvbnN0IGNoYXIqIGNTYW1wbGUsIGNvbnN0IGNoYXIgKlZhbCkKK3sKKyAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OworICAgIGludCBpRmllbGQsIGlTZXQ7CisgICAgVEFCTEUqIHQ7CisKKyAgICBfY21zQXNzZXJ0KGhJVDggIT0gTlVMTCk7CisKKyAgICB0ID0gR2V0VGFibGUoaXQ4KTsKKworICAgIGlGaWVsZCA9IExvY2F0ZVNhbXBsZShpdDgsIGNTYW1wbGUpOworCisgICAgaWYgKGlGaWVsZCA8IDApCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmICh0LT4gblBhdGNoZXMgPT0gMCkgeworCisgICAgICAgIEFsbG9jYXRlRGF0YUZvcm1hdChpdDgpOworICAgICAgICBBbGxvY2F0ZURhdGFTZXQoaXQ4KTsKKyAgICAgICAgQ29va1BvaW50ZXJzKGl0OCk7CisgICAgfQorCisgICAgaWYgKGNtc3N0cmNhc2VjbXAoY1NhbXBsZSwgIlNBTVBMRV9JRCIpID09IDApIHsKKworICAgICAgICBpU2V0ICAgPSBMb2NhdGVFbXB0eVBhdGNoKGl0OCk7CisgICAgICAgIGlmIChpU2V0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIFN5bkVycm9yKGl0OCwgIkNvdWxkbid0IGFkZCBtb3JlIHBhdGNoZXMgJyVzJ1xuIiwgY1BhdGNoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlGaWVsZCA9IHQgLT4gU2FtcGxlSUQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpU2V0ID0gTG9jYXRlUGF0Y2goaXQ4LCBjUGF0Y2gpOworICAgICAgICBpZiAoaVNldCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBTZXREYXRhKGl0OCwgaVNldCwgaUZpZWxkLCBWYWwpOworfQorCisKK2Ntc0Jvb2wgQ01TRVhQT1JUIGNtc0lUOFNldERhdGFEYmwoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIGNQYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY1NhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBWYWwpCit7CisgICAgY21zSVQ4KiBpdDggPSAoY21zSVQ4KikgaElUODsKKyAgICBjaGFyIEJ1ZmZbMjU2XTsKKworICAgIF9jbXNBc3NlcnQoaElUOCAhPSBOVUxMKTsKKworICAgIHNucHJpbnRmKEJ1ZmYsIDI1NSwgaXQ4LT5Eb3VibGVGb3JtYXR0ZXIsIFZhbCk7CisgICAgcmV0dXJuIGNtc0lUOFNldERhdGEoaElUOCwgY1BhdGNoLCBjU2FtcGxlLCBCdWZmKTsKK30KKworLy8gQnVmZmVyIHNob3VsZCBnZXQgTUFYU1RSIGF0IGxlYXN0CisKK2NvbnN0IGNoYXIqIENNU0VYUE9SVCBjbXNJVDhHZXRQYXRjaE5hbWUoY21zSEFORExFIGhJVDgsIGludCBuUGF0Y2gsIGNoYXIqIGJ1ZmZlcikKK3sKKyAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OworICAgIFRBQkxFKiB0OworICAgIGNoYXIqIERhdGE7CisKKyAgICBfY21zQXNzZXJ0KGhJVDggIT0gTlVMTCk7CisKKyAgICB0ID0gR2V0VGFibGUoaXQ4KTsKKyAgICBEYXRhID0gR2V0RGF0YShpdDgsIG5QYXRjaCwgdC0+U2FtcGxlSUQpOworCisgICAgaWYgKCFEYXRhKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIWJ1ZmZlcikgcmV0dXJuIERhdGE7CisKKyAgICBzdHJuY3B5KGJ1ZmZlciwgRGF0YSwgTUFYU1RSLTEpOworICAgIGJ1ZmZlcltNQVhTVFItMV0gPSAwOworICAgIHJldHVybiBidWZmZXI7Cit9CisKK2ludCBDTVNFWFBPUlQgY21zSVQ4R2V0UGF0Y2hCeU5hbWUoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIgKmNQYXRjaCkKK3sKKyAgICBfY21zQXNzZXJ0KGhJVDggIT0gTlVMTCk7CisKKyAgICByZXR1cm4gTG9jYXRlUGF0Y2goKGNtc0lUOCopaElUOCwgY1BhdGNoKTsKK30KKworY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNJVDhUYWJsZUNvdW50KGNtc0hBTkRMRSBoSVQ4KQoreworICAgIGNtc0lUOCogaXQ4ID0gKGNtc0lUOCopIGhJVDg7CisKKyAgICBfY21zQXNzZXJ0KGhJVDggIT0gTlVMTCk7CisKKyAgICByZXR1cm4gaXQ4IC0+VGFibGVzQ291bnQ7Cit9CisKKy8vIFRoaXMgaGFuZGxlcyB0aGUgIkxBQkVMIiBleHRlbnNpb24uCisvLyBMYWJlbCwgblRhYmxlLCBUeXBlCisKK2ludCBDTVNFWFBPUlQgY21zSVQ4U2V0VGFibGVCeUxhYmVsKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBjU2V0LCBjb25zdCBjaGFyKiBjRmllbGQsIGNvbnN0IGNoYXIqIEV4cGVjdGVkVHlwZSkKK3sKKyAgICBjb25zdCBjaGFyKiBjTGFiZWxGbGQ7CisgICAgY2hhciBUeXBlWzI1Nl0sIExhYmVsWzI1Nl07CisgICAgaW50IG5UYWJsZTsKKworICAgIF9jbXNBc3NlcnQoaElUOCAhPSBOVUxMKTsKKworICAgIGlmIChjRmllbGQgIT0gTlVMTCAmJiAqY0ZpZWxkID09IDApCisgICAgICAgICAgICBjRmllbGQgPSAiTEFCRUwiOworCisgICAgaWYgKGNGaWVsZCA9PSBOVUxMKQorICAgICAgICAgICAgY0ZpZWxkID0gIkxBQkVMIjsKKworICAgIGNMYWJlbEZsZCA9IGNtc0lUOEdldERhdGEoaElUOCwgY1NldCwgY0ZpZWxkKTsKKyAgICBpZiAoIWNMYWJlbEZsZCkgcmV0dXJuIC0xOworCisgICAgaWYgKHNzY2FuZihjTGFiZWxGbGQsICIlMjU1cyAlZCAlMjU1cyIsIExhYmVsLCAmblRhYmxlLCBUeXBlKSAhPSAzKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgaWYgKEV4cGVjdGVkVHlwZSAhPSBOVUxMICYmICpFeHBlY3RlZFR5cGUgPT0gMCkKKyAgICAgICAgRXhwZWN0ZWRUeXBlID0gTlVMTDsKKworICAgIGlmIChFeHBlY3RlZFR5cGUpIHsKKworICAgICAgICBpZiAoY21zc3RyY2FzZWNtcChUeXBlLCBFeHBlY3RlZFR5cGUpICE9IDApIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gY21zSVQ4U2V0VGFibGUoaElUOCwgblRhYmxlKTsKK30KKworCitjbXNCb29sIENNU0VYUE9SVCBjbXNJVDhTZXRJbmRleENvbHVtbihjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciogY1NhbXBsZSkKK3sKKyAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OworICAgIGludCBwb3M7CisKKyAgICBfY21zQXNzZXJ0KGhJVDggIT0gTlVMTCk7CisKKyAgICBwb3MgPSBMb2NhdGVTYW1wbGUoaXQ4LCBjU2FtcGxlKTsKKyAgICBpZihwb3MgPT0gLTEpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGl0OC0+VGFiW2l0OC0+blRhYmxlXS5TYW1wbGVJRCA9IHBvczsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCit2b2lkIENNU0VYUE9SVCBjbXNJVDhEZWZpbmVEYmxGb3JtYXQoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIEZvcm1hdHRlcikKK3sKKyAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OworCisgICAgX2Ntc0Fzc2VydChoSVQ4ICE9IE5VTEwpOworCisgICAgaWYgKEZvcm1hdHRlciA9PSBOVUxMKQorICAgICAgICBzdHJjcHkoaXQ4LT5Eb3VibGVGb3JtYXR0ZXIsIERFRkFVTFRfREJMX0ZPUk1BVCk7CisgICAgZWxzZQorICAgICAgICBzdHJuY3B5KGl0OC0+RG91YmxlRm9ybWF0dGVyLCBGb3JtYXR0ZXIsIHNpemVvZihpdDgtPkRvdWJsZUZvcm1hdHRlcikpOworCisgICAgaXQ4IC0+RG91YmxlRm9ybWF0dGVyW3NpemVvZihpdDggLT5Eb3VibGVGb3JtYXR0ZXIpLTFdID0gMDsKK30KKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zY252cnQuYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2NudnJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5MjE0OAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2NudnJ0LmMKQEAgLTAsMCArMSwxMTYxIEBACisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KKy8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNiBNYXJ0aSBNYXJpYSBTYWd1ZXIKKy8vCisvLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKy8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKy8vIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKy8vIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorLy8gYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlCisvLyBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorLy8KKy8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisvLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKy8vCisvLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKy8vIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTworLy8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKy8vIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKKy8vIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKy8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisKKyNpbmNsdWRlICJsY21zMl9pbnRlcm5hbC5oIgorCisKKy8vIExpbmsgc2V2ZXJhbCBwcm9maWxlcyB0byBvYnRhaW4gYSBzaW5nbGUgTFVUIG1vZGVsbGluZyB0aGUgd2hvbGUgY29sb3IgdHJhbnNmb3JtLiBJbnRlbnRzLCBCbGFjayBwb2ludAorLy8gY29tcGVuc2F0aW9uIGFuZCBBZGFwdGF0aW9uIHBhcmFtZXRlcnMgbWF5IHZhcnkgYWNyb3NzIHByb2ZpbGVzLiBCUEMgYW5kIEFkYXB0YXRpb24gcmVmZXJzIHRvIHRoZSBQQ1MKKy8vIGFmdGVyIHRoZSBwcm9maWxlLiBJLmUsIEJQQ1swXSByZWZlcnMgdG8gY29ubmV4aW9uIGJldHdlZW4gcHJvZmlsZSgwKSBhbmQgcHJvZmlsZSgxKQorY21zUGlwZWxpbmUqIF9jbXNMaW5rUHJvZmlsZXMoY21zQ29udGV4dCAgICAgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG5Qcm9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnRzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSAgICAgaFByb2ZpbGVzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNCb29sICAgICAgICAgQlBDW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEFkYXB0YXRpb25TdGF0ZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCByb3V0aW5lIGZvciBJQ0Mtc3R5bGUgaW50ZW50cy4gQSB1c2VyIG1heSBkZWNpZGUgdG8gb3ZlcnJpZGUgaXQgYnkgdXNpbmcgYSBwbHVnaW4uCisvLyBTdXBwb3J0ZWQgaW50ZW50cyBhcmUgcGVyY2VwdHVhbCwgcmVsYXRpdmUgY29sb3JpbWV0cmljLCBzYXR1cmF0aW9uIGFuZCBJQ0MtYWJzb2x1dGUgY29sb3JpbWV0cmljCitzdGF0aWMKK2Ntc1BpcGVsaW5lKiBEZWZhdWx0SUNDaW50ZW50cyhjbXNDb250ZXh0ICAgICBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG5Qcm9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW50ZW50c1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFICAgICBoUHJvZmlsZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNCb29sICAgICAgICAgQlBDW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uU3RhdGVzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGlzIGlzIHRoZSBlbnRyeSBmb3IgYmxhY2stcHJlc2VydmluZyBLLW9ubHkgaW50ZW50cywgd2hpY2ggYXJlIG5vbi1JQ0MuIExhc3QgcHJvZmlsZSBoYXZlIHRvIGJlIGEgb3V0cHV0IHByb2ZpbGUKKy8vIHRvIGRvIHRoZSB0cmljayAobm8gZGV2aWNlbGlua3MgYWxsb3dlZCBhdCB0aGF0IHBvc2l0aW9uKQorc3RhdGljCitjbXNQaXBlbGluZSogIEJsYWNrUHJlc2VydmluZ0tPbmx5SW50ZW50cyhjbXNDb250ZXh0ICAgICBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgblByb2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEludGVudHNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFICAgICBoUHJvZmlsZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Jvb2wgICAgICAgICBCUENbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgQWRhcHRhdGlvblN0YXRlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGlzIGlzIHRoZSBlbnRyeSBmb3IgYmxhY2stcGxhbmUgcHJlc2VydmluZywgd2hpY2ggYXJlIG5vbi1JQ0MuIEFnYWluLCBMYXN0IHByb2ZpbGUgaGF2ZSB0byBiZSBhIG91dHB1dCBwcm9maWxlCisvLyB0byBkbyB0aGUgdHJpY2sgKG5vIGRldmljZWxpbmtzIGFsbG93ZWQgYXQgdGhhdCBwb3NpdGlvbikKK3N0YXRpYworY21zUGlwZWxpbmUqICBCbGFja1ByZXNlcnZpbmdLUGxhbmVJbnRlbnRzKGNtc0NvbnRleHQgICAgIENvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgblByb2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnRzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgICAgIGhQcm9maWxlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Jvb2wgICAgICAgICBCUENbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEFkYXB0YXRpb25TdGF0ZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncyk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworLy8gVGhpcyBpcyBhIHN0cnVjdHVyZSBob2xkaW5nIGltcGxlbWVudGF0aW9ucyBmb3IgYWxsIHN1cHBvcnRlZCBpbnRlbnRzLgordHlwZWRlZiBzdHJ1Y3QgX2Ntc19pbnRlbnRzX2xpc3QgeworCisgICAgY21zVUludDMyTnVtYmVyIEludGVudDsKKyAgICBjaGFyICAgICAgICAgICAgRGVzY3JpcHRpb25bMjU2XTsKKyAgICBjbXNJbnRlbnRGbiAgICAgTGluazsKKyAgICBzdHJ1Y3QgX2Ntc19pbnRlbnRzX2xpc3QqICBOZXh0OworCit9IGNtc0ludGVudHNMaXN0OworCisKKy8vIEJ1aWx0LWluIGludGVudHMKK3N0YXRpYyBjbXNJbnRlbnRzTGlzdCBEZWZhdWx0SW50ZW50c1tdID0geworCisgICAgeyBJTlRFTlRfUEVSQ0VQVFVBTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBlcmNlcHR1YWwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdElDQ2ludGVudHMsICAgICAgICAgICAgJkRlZmF1bHRJbnRlbnRzWzFdIH0sCisgICAgeyBJTlRFTlRfUkVMQVRJVkVfQ09MT1JJTUVUUklDLCAgICAgICAgICAgICAgICAgIlJlbGF0aXZlIGNvbG9yaW1ldHJpYyIsICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdElDQ2ludGVudHMsICAgICAgICAgICAgJkRlZmF1bHRJbnRlbnRzWzJdIH0sCisgICAgeyBJTlRFTlRfU0FUVVJBVElPTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNhdHVyYXRpb24iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdElDQ2ludGVudHMsICAgICAgICAgICAgJkRlZmF1bHRJbnRlbnRzWzNdIH0sCisgICAgeyBJTlRFTlRfQUJTT0xVVEVfQ09MT1JJTUVUUklDLCAgICAgICAgICAgICAgICAgIkFic29sdXRlIGNvbG9yaW1ldHJpYyIsICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdElDQ2ludGVudHMsICAgICAgICAgICAgJkRlZmF1bHRJbnRlbnRzWzRdIH0sCisgICAgeyBJTlRFTlRfUFJFU0VSVkVfS19PTkxZX1BFUkNFUFRVQUwsICAgICAgICAgICAgIlBlcmNlcHR1YWwgcHJlc2VydmluZyBibGFjayBpbmsiLCAgICAgICAgICAgICAgQmxhY2tQcmVzZXJ2aW5nS09ubHlJbnRlbnRzLCAgJkRlZmF1bHRJbnRlbnRzWzVdIH0sCisgICAgeyBJTlRFTlRfUFJFU0VSVkVfS19PTkxZX1JFTEFUSVZFX0NPTE9SSU1FVFJJQywgIlJlbGF0aXZlIGNvbG9yaW1ldHJpYyBwcmVzZXJ2aW5nIGJsYWNrIGluayIsICAgQmxhY2tQcmVzZXJ2aW5nS09ubHlJbnRlbnRzLCAgJkRlZmF1bHRJbnRlbnRzWzZdIH0sCisgICAgeyBJTlRFTlRfUFJFU0VSVkVfS19PTkxZX1NBVFVSQVRJT04sICAgICAgICAgICAgIlNhdHVyYXRpb24gcHJlc2VydmluZyBibGFjayBpbmsiLCAgICAgICAgICAgICAgQmxhY2tQcmVzZXJ2aW5nS09ubHlJbnRlbnRzLCAgJkRlZmF1bHRJbnRlbnRzWzddIH0sCisgICAgeyBJTlRFTlRfUFJFU0VSVkVfS19QTEFORV9QRVJDRVBUVUFMLCAgICAgICAgICAgIlBlcmNlcHR1YWwgcHJlc2VydmluZyBibGFjayBwbGFuZSIsICAgICAgICAgICAgQmxhY2tQcmVzZXJ2aW5nS1BsYW5lSW50ZW50cywgJkRlZmF1bHRJbnRlbnRzWzhdIH0sCisgICAgeyBJTlRFTlRfUFJFU0VSVkVfS19QTEFORV9SRUxBVElWRV9DT0xPUklNRVRSSUMsIlJlbGF0aXZlIGNvbG9yaW1ldHJpYyBwcmVzZXJ2aW5nIGJsYWNrIHBsYW5lIiwgQmxhY2tQcmVzZXJ2aW5nS1BsYW5lSW50ZW50cywgJkRlZmF1bHRJbnRlbnRzWzldIH0sCisgICAgeyBJTlRFTlRfUFJFU0VSVkVfS19QTEFORV9TQVRVUkFUSU9OLCAgICAgICAgICAgIlNhdHVyYXRpb24gcHJlc2VydmluZyBibGFjayBwbGFuZSIsICAgICAgICAgICAgQmxhY2tQcmVzZXJ2aW5nS1BsYW5lSW50ZW50cywgTlVMTCB9Cit9OworCisKKy8vIEEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CitfY21zSW50ZW50c1BsdWdpbkNodW5rVHlwZSBfY21zSW50ZW50c1BsdWdpbkNodW5rID0geyBOVUxMIH07CisKKy8vIER1cGxpY2F0ZXMgdGhlIHpvbmUgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIHBsdWctaW4gaW4gdGhlIG5ldyBjb250ZXh0CitzdGF0aWMKK3ZvaWQgRHVwUGx1Z2luSW50ZW50c0xpc3Qoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQoreworICAgX2Ntc0ludGVudHNQbHVnaW5DaHVua1R5cGUgbmV3SGVhZCA9IHsgTlVMTCB9OworICAgY21zSW50ZW50c0xpc3QqICBlbnRyeTsKKyAgIGNtc0ludGVudHNMaXN0KiAgQW50ZXJpb3IgPSBOVUxMOworICAgX2Ntc0ludGVudHNQbHVnaW5DaHVua1R5cGUqIGhlYWQgPSAoX2Ntc0ludGVudHNQbHVnaW5DaHVua1R5cGUqKSBzcmMtPmNodW5rc1tJbnRlbnRQbHVnaW5dOworCisgICAgLy8gV2FsayB0aGUgbGlzdCBjb3B5aW5nIGFsbCBub2RlcworICAgZm9yIChlbnRyeSA9IGhlYWQtPkludGVudHM7CisgICAgICAgIGVudHJ5ICE9IE5VTEw7CisgICAgICAgIGVudHJ5ID0gZW50cnkgLT5OZXh0KSB7CisKKyAgICAgICAgICAgIGNtc0ludGVudHNMaXN0ICpuZXdFbnRyeSA9ICggY21zSW50ZW50c0xpc3QgKikgX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsIGVudHJ5LCBzaXplb2YoY21zSW50ZW50c0xpc3QpKTsKKyAgIAorICAgICAgICAgICAgaWYgKG5ld0VudHJ5ID09IE5VTEwpIAorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBrZWVwIHRoZSBsaW5rZWQgbGlzdCBvcmRlciwgc28gdGhpcyBpcyBhIGxpdHRsZSBiaXQgdHJpY2t5CisgICAgICAgICAgICBuZXdFbnRyeSAtPiBOZXh0ID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChBbnRlcmlvcikKKyAgICAgICAgICAgICAgICBBbnRlcmlvciAtPiBOZXh0ID0gbmV3RW50cnk7CisgICAgIAorICAgICAgICAgICAgQW50ZXJpb3IgPSBuZXdFbnRyeTsKKworICAgICAgICAgICAgaWYgKG5ld0hlYWQuSW50ZW50cyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIG5ld0hlYWQuSW50ZW50cyA9IG5ld0VudHJ5OworICAgIH0KKworICBjdHggLT5jaHVua3NbSW50ZW50UGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHgtPk1lbVBvb2wsICZuZXdIZWFkLCBzaXplb2YoX2Ntc0ludGVudHNQbHVnaW5DaHVua1R5cGUpKTsKK30KKwordm9pZCAgX2Ntc0FsbG9jSW50ZW50c1BsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKK3sKKyAgICBpZiAoc3JjICE9IE5VTEwpIHsKKworICAgICAgICAvLyBDb3B5IGFsbCBsaW5rZWQgbGlzdAorICAgICAgICBEdXBQbHVnaW5JbnRlbnRzTGlzdChjdHgsIHNyYyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzdGF0aWMgX2Ntc0ludGVudHNQbHVnaW5DaHVua1R5cGUgSW50ZW50c1BsdWdpbkNodW5rVHlwZSA9IHsgTlVMTCB9OworICAgICAgICBjdHggLT5jaHVua3NbSW50ZW50UGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCAmSW50ZW50c1BsdWdpbkNodW5rVHlwZSwgc2l6ZW9mKF9jbXNJbnRlbnRzUGx1Z2luQ2h1bmtUeXBlKSk7CisgICAgfQorfQorCisKKy8vIFNlYXJjaCB0aGUgbGlzdCBmb3IgYSBzdWl0YWJsZSBpbnRlbnQuIFJldHVybnMgTlVMTCBpZiBub3QgZm91bmQKK3N0YXRpYworY21zSW50ZW50c0xpc3QqIFNlYXJjaEludGVudChjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIEludGVudCkKK3sKKyAgICBfY21zSW50ZW50c1BsdWdpbkNodW5rVHlwZSogY3R4ID0gKCBfY21zSW50ZW50c1BsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBJbnRlbnRQbHVnaW4pOworICAgIGNtc0ludGVudHNMaXN0KiBwdDsKKworICAgIGZvciAocHQgPSBjdHggLT4gSW50ZW50czsgcHQgIT0gTlVMTDsgcHQgPSBwdCAtPiBOZXh0KQorICAgICAgICBpZiAocHQgLT5JbnRlbnQgPT0gSW50ZW50KSByZXR1cm4gcHQ7CisKKyAgICBmb3IgKHB0ID0gRGVmYXVsdEludGVudHM7IHB0ICE9IE5VTEw7IHB0ID0gcHQgLT4gTmV4dCkKKyAgICAgICAgaWYgKHB0IC0+SW50ZW50ID09IEludGVudCkgcmV0dXJuIHB0OworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIEJsYWNrIHBvaW50IGNvbXBlbnNhdGlvbi4gSW1wbGVtZW50ZWQgYXMgYSBsaW5lYXIgc2NhbGluZyBpbiBYWVouIEJsYWNrIHBvaW50cworLy8gc2hvdWxkIGNvbWUgcmVsYXRpdmUgdG8gdGhlIHdoaXRlIHBvaW50LiBGaWxscyBhbiBtYXRyaXgvb2Zmc2V0IGVsZW1lbnQgbQorLy8gd2hpY2ggaXMgb3JnYW5pemVkIGFzIGEgNHg0IG1hdHJpeC4KK3N0YXRpYwordm9pZCBDb21wdXRlQmxhY2tQb2ludENvbXBlbnNhdGlvbihjb25zdCBjbXNDSUVYWVoqIEJsYWNrUG9pbnRJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zQ0lFWFlaKiBCbGFja1BvaW50T3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNNQVQzKiBtLCBjbXNWRUMzKiBvZmYpCit7CisgIGNtc0Zsb2F0NjROdW1iZXIgYXgsIGF5LCBheiwgYngsIGJ5LCBieiwgdHgsIHR5LCB0ejsKKworICAgLy8gTm93IHdlIG5lZWQgdG8gY29tcHV0ZSBhIG1hdHJpeCBwbHVzIGFuIG9mZnNldCBtIGFuZCBvZiBzdWNoIG9mCisgICAvLyBbbV0qYnBpbiArIG9mZiA9IGJwb3V0CisgICAvLyBbbV0qRDUwICArIG9mZiA9IEQ1MAorICAgLy8KKyAgIC8vIFRoaXMgaXMgYSBsaW5lYXIgc2NhbGluZyBpbiB0aGUgZm9ybSBheCtiLCB3aGVyZQorICAgLy8gYSA9IChicG91dCAtIEQ1MCkgLyAoYnBpbiAtIEQ1MCkKKyAgIC8vIGIgPSAtIEQ1MCogKGJwb3V0IC0gYnBpbikgLyAoYnBpbiAtIEQ1MCkKKworICAgdHggPSBCbGFja1BvaW50SW4tPlggLSBjbXNENTBfWFlaKCktPlg7CisgICB0eSA9IEJsYWNrUG9pbnRJbi0+WSAtIGNtc0Q1MF9YWVooKS0+WTsKKyAgIHR6ID0gQmxhY2tQb2ludEluLT5aIC0gY21zRDUwX1hZWigpLT5aOworCisgICBheCA9IChCbGFja1BvaW50T3V0LT5YIC0gY21zRDUwX1hZWigpLT5YKSAvIHR4OworICAgYXkgPSAoQmxhY2tQb2ludE91dC0+WSAtIGNtc0Q1MF9YWVooKS0+WSkgLyB0eTsKKyAgIGF6ID0gKEJsYWNrUG9pbnRPdXQtPlogLSBjbXNENTBfWFlaKCktPlopIC8gdHo7CisKKyAgIGJ4ID0gLSBjbXNENTBfWFlaKCktPiBYICogKEJsYWNrUG9pbnRPdXQtPlggLSBCbGFja1BvaW50SW4tPlgpIC8gdHg7CisgICBieSA9IC0gY21zRDUwX1hZWigpLT4gWSAqIChCbGFja1BvaW50T3V0LT5ZIC0gQmxhY2tQb2ludEluLT5ZKSAvIHR5OworICAgYnogPSAtIGNtc0Q1MF9YWVooKS0+IFogKiAoQmxhY2tQb2ludE91dC0+WiAtIEJsYWNrUG9pbnRJbi0+WikgLyB0ejsKKworICAgX2Ntc1ZFQzNpbml0KCZtIC0+dlswXSwgYXgsIDAsICAwKTsKKyAgIF9jbXNWRUMzaW5pdCgmbSAtPnZbMV0sIDAsIGF5LCAgMCk7CisgICBfY21zVkVDM2luaXQoJm0gLT52WzJdLCAwLCAgMCwgIGF6KTsKKyAgIF9jbXNWRUMzaW5pdChvZmYsIGJ4LCBieSwgYnopOworCit9CisKKworLy8gQXBwcm94aW1hdGUgYSBibGFja2JvZHkgaWxsdW1pbmFudCBiYXNlZCBvbiBDSEFEIGluZm9ybWF0aW9uCitzdGF0aWMKK2Ntc0Zsb2F0NjROdW1iZXIgQ0hBRDJUZW1wKGNvbnN0IGNtc01BVDMqIENoYWQpCit7CisgICAgLy8gQ29udmVydCBENTAgYWNyb3NzIGludmVyc2UgQ0hBRCB0byBnZXQgdGhlIGFic29sdXRlIHdoaXRlIHBvaW50CisgICAgY21zVkVDMyBkLCBzOworICAgIGNtc0NJRVhZWiBEZXN0OworICAgIGNtc0NJRXh5WSBEZXN0Q2hyb21hdGljaXR5OworICAgIGNtc0Zsb2F0NjROdW1iZXIgVGVtcEs7CisgICAgY21zTUFUMyBtMSwgbTI7CisKKyAgICBtMSA9ICpDaGFkOworICAgIGlmICghX2Ntc01BVDNpbnZlcnNlKCZtMSwgJm0yKSkgcmV0dXJuIEZBTFNFOworCisgICAgcy5uW1ZYXSA9IGNtc0Q1MF9YWVooKSAtPiBYOworICAgIHMubltWWV0gPSBjbXNENTBfWFlaKCkgLT4gWTsKKyAgICBzLm5bVlpdID0gY21zRDUwX1hZWigpIC0+IFo7CisKKyAgICBfY21zTUFUM2V2YWwoJmQsICZtMiwgJnMpOworCisgICAgRGVzdC5YID0gZC5uW1ZYXTsKKyAgICBEZXN0LlkgPSBkLm5bVlldOworICAgIERlc3QuWiA9IGQubltWWl07CisKKyAgICBjbXNYWVoyeHlZKCZEZXN0Q2hyb21hdGljaXR5LCAmRGVzdCk7CisKKyAgICBpZiAoIWNtc1RlbXBGcm9tV2hpdGVQb2ludCgmVGVtcEssICZEZXN0Q2hyb21hdGljaXR5KSkKKyAgICAgICAgcmV0dXJuIC0xLjA7CisKKyAgICByZXR1cm4gVGVtcEs7Cit9CisKKy8vIENvbXB1dGUgYSBDSEFEIGJhc2VkIG9uIGEgZ2l2ZW4gdGVtcGVyYXR1cmUKK3N0YXRpYworICAgIHZvaWQgVGVtcDJDSEFEKGNtc01BVDMqIENoYWQsIGNtc0Zsb2F0NjROdW1iZXIgVGVtcCkKK3sKKyAgICBjbXNDSUVYWVogV2hpdGU7CisgICAgY21zQ0lFeHlZIENocm9tYXRpY2l0eU9mV2hpdGU7CisKKyAgICBjbXNXaGl0ZVBvaW50RnJvbVRlbXAoJkNocm9tYXRpY2l0eU9mV2hpdGUsIFRlbXApOworICAgIGNtc3h5WTJYWVooJldoaXRlLCAmQ2hyb21hdGljaXR5T2ZXaGl0ZSk7CisgICAgX2Ntc0FkYXB0YXRpb25NYXRyaXgoQ2hhZCwgTlVMTCwgJldoaXRlLCBjbXNENTBfWFlaKCkpOworfQorCisvLyBKb2luIHNjYWxpbmdzIHRvIG9idGFpbiByZWxhdGl2ZSBpbnB1dCB0byBhYnNvbHV0ZSBhbmQgdGhlbiB0byByZWxhdGl2ZSBvdXRwdXQuCisvLyBSZXN1bHQgaXMgc3RvcmVkIGluIGEgM3gzIG1hdHJpeAorc3RhdGljCitjbXNCb29sICBDb21wdXRlQWJzb2x1dGVJbnRlbnQoY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zQ0lFWFlaKiBXaGl0ZVBvaW50SW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zTUFUMyogQ2hyb21hdGljQWRhcHRhdGlvbk1hdHJpeEluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0NJRVhZWiogV2hpdGVQb2ludE91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNNQVQzKiBDaHJvbWF0aWNBZGFwdGF0aW9uTWF0cml4T3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc01BVDMqIG0pCit7CisgICAgY21zTUFUMyBTY2FsZSwgbTEsIG0yLCBtMywgbTQ7CisKKyAgICAvLyBUT0RPOiBGb2xsb3cgTWFyYyBNYWh5J3MgcmVjb21tZW5kYXRpb24gdG8gY2hlY2sgaWYgQ0hBRCBpcyBzYW1lIGJ5IHVzaW5nIE0xKk0yID09IE0yKk0xLiBJZiBzbywgZG8gbm90aGluZy4KKyAgICAvLyBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgQXJneWxsQXJ0cyB0YWcKKworICAgIC8vIEFkYXB0YXRpb24gc3RhdGUKKyAgICBpZiAoQWRhcHRhdGlvblN0YXRlID09IDEuMCkgeworCisgICAgICAgIC8vIE9ic2VydmVyIGlzIGZ1bGx5IGFkYXB0ZWQuIEtlZXAgY2hyb21hdGljIGFkYXB0YXRpb24uCisgICAgICAgIC8vIFRoYXQgaXMgdGhlIHN0YW5kYXJkIFY0IGJlaGF2aW91cgorICAgICAgICBfY21zVkVDM2luaXQoJm0tPnZbMF0sIFdoaXRlUG9pbnRJbi0+WCAvIFdoaXRlUG9pbnRPdXQtPlgsIDAsIDApOworICAgICAgICBfY21zVkVDM2luaXQoJm0tPnZbMV0sIDAsIFdoaXRlUG9pbnRJbi0+WSAvIFdoaXRlUG9pbnRPdXQtPlksIDApOworICAgICAgICBfY21zVkVDM2luaXQoJm0tPnZbMl0sIDAsIDAsIFdoaXRlUG9pbnRJbi0+WiAvIFdoaXRlUG9pbnRPdXQtPlopOworCisgICAgfQorICAgIGVsc2UgIHsKKworICAgICAgICAvLyBJbmNvbXBsZXRlIGFkYXB0YXRpb24uIFRoaXMgaXMgYW4gYWR2YW5jZWQgZmVhdHVyZS4KKyAgICAgICAgX2Ntc1ZFQzNpbml0KCZTY2FsZS52WzBdLCBXaGl0ZVBvaW50SW4tPlggLyBXaGl0ZVBvaW50T3V0LT5YLCAwLCAwKTsKKyAgICAgICAgX2Ntc1ZFQzNpbml0KCZTY2FsZS52WzFdLCAwLCAgV2hpdGVQb2ludEluLT5ZIC8gV2hpdGVQb2ludE91dC0+WSwgMCk7CisgICAgICAgIF9jbXNWRUMzaW5pdCgmU2NhbGUudlsyXSwgMCwgMCwgIFdoaXRlUG9pbnRJbi0+WiAvIFdoaXRlUG9pbnRPdXQtPlopOworCisKKyAgICAgICAgaWYgKEFkYXB0YXRpb25TdGF0ZSA9PSAwLjApIHsKKyAgICAgICAgCisgICAgICAgICAgICBtMSA9ICpDaHJvbWF0aWNBZGFwdGF0aW9uTWF0cml4T3V0OworICAgICAgICAgICAgX2Ntc01BVDNwZXIoJm0yLCAmbTEsICZTY2FsZSk7CisgICAgICAgICAgICAvLyBtMiBob2xkcyBDSEFEIGZyb20gb3V0cHV0IHdoaXRlIHRvIEQ1MCB0aW1lcyBhYnMuIGNvbC4gc2NhbGluZworCisgICAgICAgICAgICAvLyBPYnNlcnZlciBpcyBub3QgYWRhcHRlZCwgdW5kbyB0aGUgY2hyb21hdGljIGFkYXB0YXRpb24KKyAgICAgICAgICAgIF9jbXNNQVQzcGVyKG0sICZtMiwgQ2hyb21hdGljQWRhcHRhdGlvbk1hdHJpeE91dCk7CisKKyAgICAgICAgICAgIG0zID0gKkNocm9tYXRpY0FkYXB0YXRpb25NYXRyaXhJbjsKKyAgICAgICAgICAgIGlmICghX2Ntc01BVDNpbnZlcnNlKCZtMywgJm00KSkgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgX2Ntc01BVDNwZXIobSwgJm0yLCAmbTQpOworCisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIGNtc01BVDMgTWl4ZWRDSEFEOworICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBUZW1wU3JjLCBUZW1wRGVzdCwgVGVtcDsKKworICAgICAgICAgICAgbTEgPSAqQ2hyb21hdGljQWRhcHRhdGlvbk1hdHJpeEluOworICAgICAgICAgICAgaWYgKCFfY21zTUFUM2ludmVyc2UoJm0xLCAmbTIpKSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBfY21zTUFUM3BlcigmbTMsICZtMiwgJlNjYWxlKTsKKyAgICAgICAgICAgIC8vIG0zIGhvbGRzIENIQUQgZnJvbSBpbnB1dCB3aGl0ZSB0byBENTAgdGltZXMgYWJzLiBjb2wuIHNjYWxpbmcKKworICAgICAgICAgICAgVGVtcFNyYyAgPSBDSEFEMlRlbXAoQ2hyb21hdGljQWRhcHRhdGlvbk1hdHJpeEluKTsKKyAgICAgICAgICAgIFRlbXBEZXN0ID0gQ0hBRDJUZW1wKENocm9tYXRpY0FkYXB0YXRpb25NYXRyaXhPdXQpOworCisgICAgICAgICAgICBpZiAoVGVtcFNyYyA8IDAuMCB8fCBUZW1wRGVzdCA8IDAuMCkgcmV0dXJuIEZBTFNFOyAvLyBTb21ldGhpbmcgd2VudCB3cm9uZworCisgICAgICAgICAgICBpZiAoX2Ntc01BVDNpc0lkZW50aXR5KCZTY2FsZSkgJiYgZmFicyhUZW1wU3JjIC0gVGVtcERlc3QpIDwgMC4wMSkgeworCisgICAgICAgICAgICAgICAgX2Ntc01BVDNpZGVudGl0eShtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVGVtcCA9ICgxLjAgLSBBZGFwdGF0aW9uU3RhdGUpICogVGVtcERlc3QgKyBBZGFwdGF0aW9uU3RhdGUgKiBUZW1wU3JjOworCisgICAgICAgICAgICAvLyBHZXQgYSBDSEFEIGZyb20gd2hhdGV2ZXIgb3V0cHV0IHRlbXBlcmF0dXJlIHRvIEQ1MC4gVGhpcyByZXBsYWNlcyBvdXRwdXQgQ0hBRAorICAgICAgICAgICAgVGVtcDJDSEFEKCZNaXhlZENIQUQsIFRlbXApOworCisgICAgICAgICAgICBfY21zTUFUM3BlcihtLCAmbTMsICZNaXhlZENIQUQpOworICAgICAgICB9CisKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisKK30KKworLy8gSnVzdCB0byBzZWUgaWYgbSBtYXRyaXggc2hvdWxkIGJlIGFwcGxpZWQKK3N0YXRpYworY21zQm9vbCBJc0VtcHR5TGF5ZXIoY21zTUFUMyogbSwgY21zVkVDMyogb2ZmKQoreworICAgIGNtc0Zsb2F0NjROdW1iZXIgZGlmZiA9IDA7CisgICAgY21zTUFUMyBJZGVudDsKKyAgICBpbnQgaTsKKworICAgIGlmIChtID09IE5VTEwgJiYgb2ZmID09IE5VTEwpIHJldHVybiBUUlVFOyAgLy8gTlVMTCBpcyBhbGxvd2VkIGFzIGFuIGVtcHR5IGxheWVyCisgICAgaWYgKG0gPT0gTlVMTCAmJiBvZmYgIT0gTlVMTCkgcmV0dXJuIEZBTFNFOyAvLyBUaGlzIGlzIGFuIGludGVybmFsIGVycm9yCisKKyAgICBfY21zTUFUM2lkZW50aXR5KCZJZGVudCk7CisKKyAgICBmb3IgKGk9MDsgaSA8IDMqMzsgaSsrKQorICAgICAgICBkaWZmICs9IGZhYnMoKChjbXNGbG9hdDY0TnVtYmVyKiltKVtpXSAtICgoY21zRmxvYXQ2NE51bWJlciopJklkZW50KVtpXSk7CisKKyAgICBmb3IgKGk9MDsgaSA8IDM7IGkrKykKKyAgICAgICAgZGlmZiArPSBmYWJzKCgoY21zRmxvYXQ2NE51bWJlciopb2ZmKVtpXSk7CisKKworICAgIHJldHVybiAoZGlmZiA8IDAuMDAyKTsKK30KKworCisvLyBDb21wdXRlIHRoZSBjb252ZXJzaW9uIGxheWVyCitzdGF0aWMKK2Ntc0Jvb2wgQ29tcHV0ZUNvbnZlcnNpb24oaW50IGksIGNtc0hQUk9GSUxFIGhQcm9maWxlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Jvb2wgQlBDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNNQVQzKiBtLCBjbXNWRUMzKiBvZmYpCit7CisKKyAgICBpbnQgazsKKworICAgIC8vIG0gIGFuZCBvZmYgYXJlIHNldCB0byBpZGVudGl0eSBhbmQgdGhpcyBpcyBkZXRlY3RlZCBsYXR0ZXIgb24KKyAgICBfY21zTUFUM2lkZW50aXR5KG0pOworICAgIF9jbXNWRUMzaW5pdChvZmYsIDAsIDAsIDApOworCisgICAgLy8gSWYgaW50ZW50IGlzIGFicy4gY29sb3JpbWV0cmljLAorICAgIGlmIChJbnRlbnQgPT0gSU5URU5UX0FCU09MVVRFX0NPTE9SSU1FVFJJQykgeworCisgICAgICAgIGNtc0NJRVhZWiBXaGl0ZVBvaW50SW4sIFdoaXRlUG9pbnRPdXQ7CisgICAgICAgIGNtc01BVDMgQ2hyb21hdGljQWRhcHRhdGlvbk1hdHJpeEluLCBDaHJvbWF0aWNBZGFwdGF0aW9uTWF0cml4T3V0OworCisgICAgICAgIF9jbXNSZWFkTWVkaWFXaGl0ZVBvaW50KCZXaGl0ZVBvaW50SW4sICBoUHJvZmlsZXNbaS0xXSk7CisgICAgICAgIF9jbXNSZWFkQ0hBRCgmQ2hyb21hdGljQWRhcHRhdGlvbk1hdHJpeEluLCBoUHJvZmlsZXNbaS0xXSk7CisKKyAgICAgICAgX2Ntc1JlYWRNZWRpYVdoaXRlUG9pbnQoJldoaXRlUG9pbnRPdXQsICBoUHJvZmlsZXNbaV0pOworICAgICAgICBfY21zUmVhZENIQUQoJkNocm9tYXRpY0FkYXB0YXRpb25NYXRyaXhPdXQsIGhQcm9maWxlc1tpXSk7CisKKyAgICAgICAgaWYgKCFDb21wdXRlQWJzb2x1dGVJbnRlbnQoQWRhcHRhdGlvblN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXaGl0ZVBvaW50SW4sICAmQ2hyb21hdGljQWRhcHRhdGlvbk1hdHJpeEluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZXaGl0ZVBvaW50T3V0LCAmQ2hyb21hdGljQWRhcHRhdGlvbk1hdHJpeE91dCwgbSkpIHJldHVybiBGQUxTRTsKKworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gUmVzdCBvZiBpbnRlbnRzIG1heSBhcHBseSBCUEMuCisKKyAgICAgICAgaWYgKEJQQykgeworCisgICAgICAgICAgICBjbXNDSUVYWVogQmxhY2tQb2ludEluLCBCbGFja1BvaW50T3V0OworCisgICAgICAgICAgICBjbXNEZXRlY3RCbGFja1BvaW50KCZCbGFja1BvaW50SW4sICBoUHJvZmlsZXNbaS0xXSwgSW50ZW50LCAwKTsKKyAgICAgICAgICAgIGNtc0RldGVjdERlc3RpbmF0aW9uQmxhY2tQb2ludCgmQmxhY2tQb2ludE91dCwgaFByb2ZpbGVzW2ldLCBJbnRlbnQsIDApOworCisgICAgICAgICAgICAvLyBJZiBibGFjayBwb2ludHMgYXJlIGVxdWFsLCB0aGVuIGRvIG5vdGhpbmcKKyAgICAgICAgICAgIGlmIChCbGFja1BvaW50SW4uWCAhPSBCbGFja1BvaW50T3V0LlggfHwKKyAgICAgICAgICAgICAgICBCbGFja1BvaW50SW4uWSAhPSBCbGFja1BvaW50T3V0LlkgfHwKKyAgICAgICAgICAgICAgICBCbGFja1BvaW50SW4uWiAhPSBCbGFja1BvaW50T3V0LlopCisgICAgICAgICAgICAgICAgICAgIENvbXB1dGVCbGFja1BvaW50Q29tcGVuc2F0aW9uKCZCbGFja1BvaW50SW4sICZCbGFja1BvaW50T3V0LCBtLCBvZmYpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gT2Zmc2V0IHNob3VsZCBiZSBhZGp1c3RlZCBiZWNhdXNlIHRoZSBlbmNvZGluZy4gV2UgZW5jb2RlIFhZWiBub3JtYWxpemVkIHRvIDAuLjEuMCwKKyAgICAvLyB0byBkbyB0aGF0LCB3ZSBkaXZpZGUgYnkgTUFYX0VOQ09ERUFCTEVfWFpZLiBUaGUgY29udmVyc2lvbiBzdGFnZSBnb2VzIFhZWiAtPiBYWVogc28KKyAgICAvLyB3ZSBoYXZlIGZpcnN0IHRvIGNvbnZlcnQgZnJvbSBlbmNvZGVkIHRvIFhZWiBhbmQgdGhlbiBjb252ZXJ0IGJhY2sgdG8gZW5jb2RlZC4KKyAgICAvLyB5ID0gTXggKyBPZmYKKyAgICAvLyB4ID0geCdjCisgICAgLy8geSA9IE0geCdjICsgT2ZmCisgICAgLy8geSA9IHknYzsgeScgPSB5IC8gYworICAgIC8vIHknID0gKE14J2MgKyBPZmYpIC9jID0gTXgnICsgKE9mZiAvIGMpCisKKyAgICBmb3IgKGs9MDsgayA8IDM7IGsrKykgeworICAgICAgICBvZmYgLT5uW2tdIC89IE1BWF9FTkNPREVBQkxFX1hZWjsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLyBBZGQgYSBjb252ZXJzaW9uIHN0YWdlIGlmIG5lZWRlZC4gSWYgYSBtYXRyaXgvb2Zmc2V0IG0gaXMgZ2l2ZW4sIGl0IGFwcGxpZXMgdG8gWFlaIHNwYWNlCitzdGF0aWMKK2Ntc0Jvb2wgQWRkQ29udmVyc2lvbihjbXNQaXBlbGluZSogUmVzdWx0LCBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIEluUENTLCBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIE91dFBDUywgY21zTUFUMyogbSwgY21zVkVDMyogb2ZmKQoreworICAgIGNtc0Zsb2F0NjROdW1iZXIqIG1fYXNfZGJsID0gKGNtc0Zsb2F0NjROdW1iZXIqKSBtOworICAgIGNtc0Zsb2F0NjROdW1iZXIqIG9mZl9hc19kYmwgPSAoY21zRmxvYXQ2NE51bWJlciopIG9mZjsKKworICAgIC8vIEhhbmRsZSBQQ1MgbWlzbWF0Y2hlcy4gQSBzcGVjaWFsaXplZCBzdGFnZSBpcyBhZGRlZCB0byB0aGUgTFVUIGluIHN1Y2ggY2FzZQorICAgIHN3aXRjaCAoSW5QQ1MpIHsKKworICAgIGNhc2UgY21zU2lnWFlaRGF0YTogLy8gSW5wdXQgcHJvZmlsZSBvcGVyYXRlcyBpbiBYWVoKKworICAgICAgICBzd2l0Y2ggKE91dFBDUykgeworCisgICAgICAgIGNhc2UgY21zU2lnWFlaRGF0YTogIC8vIFhZWiAtPiBYWVoKKyAgICAgICAgICAgIGlmICghSXNFbXB0eUxheWVyKG0sIG9mZikgJiYKKyAgICAgICAgICAgICAgICAhY21zUGlwZWxpbmVJbnNlcnRTdGFnZShSZXN1bHQsIGNtc0FUX0VORCwgY21zU3RhZ2VBbGxvY01hdHJpeChSZXN1bHQgLT5Db250ZXh0SUQsIDMsIDMsIG1fYXNfZGJsLCBvZmZfYXNfZGJsKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBjbXNTaWdMYWJEYXRhOiAgLy8gWFlaIC0+IExhYgorICAgICAgICAgICAgaWYgKCFJc0VtcHR5TGF5ZXIobSwgb2ZmKSAmJgorICAgICAgICAgICAgICAgICFjbXNQaXBlbGluZUluc2VydFN0YWdlKFJlc3VsdCwgY21zQVRfRU5ELCBjbXNTdGFnZUFsbG9jTWF0cml4KFJlc3VsdCAtPkNvbnRleHRJRCwgMywgMywgbV9hc19kYmwsIG9mZl9hc19kYmwpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoUmVzdWx0LCBjbXNBVF9FTkQsIF9jbXNTdGFnZUFsbG9jWFlaMkxhYihSZXN1bHQgLT5Db250ZXh0SUQpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgIC8vIENvbG9yc3BhY2UgbWlzbWF0Y2gKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgY21zU2lnTGFiRGF0YTogLy8gSW5wdXQgcHJvZmlsZSBvcGVyYXRlcyBpbiBMYWIKKworICAgICAgICBzd2l0Y2ggKE91dFBDUykgeworCisgICAgICAgIGNhc2UgY21zU2lnWFlaRGF0YTogIC8vIExhYiAtPiBYWVoKKworICAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKFJlc3VsdCwgY21zQVRfRU5ELCBfY21zU3RhZ2VBbGxvY0xhYjJYWVooUmVzdWx0IC0+Q29udGV4dElEKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgaWYgKCFJc0VtcHR5TGF5ZXIobSwgb2ZmKSAmJgorICAgICAgICAgICAgICAgICFjbXNQaXBlbGluZUluc2VydFN0YWdlKFJlc3VsdCwgY21zQVRfRU5ELCBjbXNTdGFnZUFsbG9jTWF0cml4KFJlc3VsdCAtPkNvbnRleHRJRCwgMywgMywgbV9hc19kYmwsIG9mZl9hc19kYmwpKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGNtc1NpZ0xhYkRhdGE6ICAvLyBMYWIgLT4gTGFiCisKKyAgICAgICAgICAgIGlmICghSXNFbXB0eUxheWVyKG0sIG9mZikpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoUmVzdWx0LCBjbXNBVF9FTkQsIF9jbXNTdGFnZUFsbG9jTGFiMlhZWihSZXN1bHQgLT5Db250ZXh0SUQpKSB8fAorICAgICAgICAgICAgICAgICAgICAhY21zUGlwZWxpbmVJbnNlcnRTdGFnZShSZXN1bHQsIGNtc0FUX0VORCwgY21zU3RhZ2VBbGxvY01hdHJpeChSZXN1bHQgLT5Db250ZXh0SUQsIDMsIDMsIG1fYXNfZGJsLCBvZmZfYXNfZGJsKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoUmVzdWx0LCBjbXNBVF9FTkQsIF9jbXNTdGFnZUFsbG9jWFlaMkxhYihSZXN1bHQgLT5Db250ZXh0SUQpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8vIE1pc21hdGNoCisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gT24gY29sb3JzcGFjZXMgb3RoZXIgdGhhbiBQQ1MsIGNoZWNrIGZvciBzYW1lIHNwYWNlCisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKEluUENTICE9IE91dFBDUykgcmV0dXJuIEZBTFNFOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLyBJcyBhIGdpdmVuIHNwYWNlIGNvbXBhdGlibGUgd2l0aCBhbm90aGVyPworc3RhdGljCitjbXNCb29sIENvbG9yU3BhY2VJc0NvbXBhdGlibGUoY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBhLCBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIGIpCit7CisgICAgLy8gSWYgdGhleSBhcmUgc2FtZSwgdGhleSBhcmUgY29tcGF0aWJsZS4KKyAgICBpZiAoYSA9PSBiKSByZXR1cm4gVFJVRTsKKworICAgIC8vIENoZWNrIGZvciBNQ0g0IHN1YnN0aXR1dGlvbiBvZiBDTVlLCisgICAgaWYgKChhID09IGNtc1NpZzRjb2xvckRhdGEpICYmIChiID09IGNtc1NpZ0NteWtEYXRhKSkgcmV0dXJuIFRSVUU7CisgICAgaWYgKChhID09IGNtc1NpZ0NteWtEYXRhKSAmJiAoYiA9PSBjbXNTaWc0Y29sb3JEYXRhKSkgcmV0dXJuIFRSVUU7CisKKyAgICAvLyBDaGVjayBmb3IgWFlaL0xhYi4gVGhvc2Ugc3BhY2VzIGFyZSBpbnRlcmNoYW5nZWFibGUgYXMgdGhleSBjYW4gYmUgY29tcHV0ZWQgb25lIGZyb20gb3RoZXIuCisgICAgaWYgKChhID09IGNtc1NpZ1hZWkRhdGEpICYmIChiID09IGNtc1NpZ0xhYkRhdGEpKSByZXR1cm4gVFJVRTsKKyAgICBpZiAoKGEgPT0gY21zU2lnTGFiRGF0YSkgJiYgKGIgPT0gY21zU2lnWFlaRGF0YSkpIHJldHVybiBUUlVFOworCisgICAgcmV0dXJuIEZBTFNFOworfQorCisKKy8vIERlZmF1bHQgaGFuZGxlciBmb3IgSUNDLXN0eWxlIGludGVudHMKK3N0YXRpYworY21zUGlwZWxpbmUqIERlZmF1bHRJQ0NpbnRlbnRzKGNtc0NvbnRleHQgICAgICAgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgblByb2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgVGhlSW50ZW50c1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFICAgICAgaFByb2ZpbGVzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zQm9vbCAgICAgICAgICBCUENbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEFkYXB0YXRpb25TdGF0ZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgIGR3RmxhZ3MpCit7CisgICAgY21zUGlwZWxpbmUqIEx1dCA9IE5VTEw7CisgICAgY21zUGlwZWxpbmUqIFJlc3VsdDsKKyAgICBjbXNIUFJPRklMRSBoUHJvZmlsZTsKKyAgICBjbXNNQVQzIG07CisgICAgY21zVkVDMyBvZmY7CisgICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBDb2xvclNwYWNlSW4sIENvbG9yU3BhY2VPdXQgPSBjbXNTaWdMYWJEYXRhLCBDdXJyZW50Q29sb3JTcGFjZTsKKyAgICBjbXNQcm9maWxlQ2xhc3NTaWduYXR1cmUgQ2xhc3NTaWc7CisgICAgY21zVUludDMyTnVtYmVyICBpLCBJbnRlbnQ7CisKKyAgICAvLyBGb3Igc2FmZXR5CisgICAgaWYgKG5Qcm9maWxlcyA9PSAwKSByZXR1cm4gTlVMTDsKKworICAgIC8vIEFsbG9jYXRlIGFuIGVtcHR5IExVVCBmb3IgaG9sZGluZyB0aGUgcmVzdWx0LiAwIGFzIGNoYW5uZWwgY291bnQgbWVhbnMgJ3VuZGVmaW5lZCcKKyAgICBSZXN1bHQgPSBjbXNQaXBlbGluZUFsbG9jKENvbnRleHRJRCwgMCwgMCk7CisgICAgaWYgKFJlc3VsdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIEN1cnJlbnRDb2xvclNwYWNlID0gY21zR2V0Q29sb3JTcGFjZShoUHJvZmlsZXNbMF0pOworCisgICAgZm9yIChpPTA7IGkgPCBuUHJvZmlsZXM7IGkrKykgeworCisgICAgICAgIGNtc0Jvb2wgIGxJc0RldmljZUxpbmssIGxJc0lucHV0OworCisgICAgICAgIGhQcm9maWxlICAgICAgPSBoUHJvZmlsZXNbaV07CisgICAgICAgIENsYXNzU2lnICAgICAgPSBjbXNHZXREZXZpY2VDbGFzcyhoUHJvZmlsZSk7CisgICAgICAgIGxJc0RldmljZUxpbmsgPSAoQ2xhc3NTaWcgPT0gY21zU2lnTGlua0NsYXNzIHx8IENsYXNzU2lnID09IGNtc1NpZ0Fic3RyYWN0Q2xhc3MgKTsKKworICAgICAgICAvLyBGaXJzdCBwcm9maWxlIGlzIHVzZWQgYXMgaW5wdXQgdW5sZXNzIGRldmljZWxpbmsgb3IgYWJzdHJhY3QKKyAgICAgICAgaWYgKChpID09IDApICYmICFsSXNEZXZpY2VMaW5rKSB7CisgICAgICAgICAgICBsSXNJbnB1dCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgLy8gRWxzZSB1c2UgcHJvZmlsZSBpbiB0aGUgaW5wdXQgZGlyZWN0aW9uIGlmIGN1cnJlbnQgc3BhY2UgaXMgbm90IFBDUworICAgICAgICBsSXNJbnB1dCAgICAgID0gKEN1cnJlbnRDb2xvclNwYWNlICE9IGNtc1NpZ1hZWkRhdGEpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoQ3VycmVudENvbG9yU3BhY2UgIT0gY21zU2lnTGFiRGF0YSk7CisgICAgICAgIH0KKworICAgICAgICBJbnRlbnQgICAgICAgID0gVGhlSW50ZW50c1tpXTsKKworICAgICAgICBpZiAobElzSW5wdXQgfHwgbElzRGV2aWNlTGluaykgeworCisgICAgICAgICAgICBDb2xvclNwYWNlSW4gICAgPSBjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKTsKKyAgICAgICAgICAgIENvbG9yU3BhY2VPdXQgICA9IGNtc0dldFBDUyhoUHJvZmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisKKyAgICAgICAgICAgIENvbG9yU3BhY2VJbiAgICA9IGNtc0dldFBDUyhoUHJvZmlsZSk7CisgICAgICAgICAgICBDb2xvclNwYWNlT3V0ICAgPSBjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghQ29sb3JTcGFjZUlzQ29tcGF0aWJsZShDb2xvclNwYWNlSW4sIEN1cnJlbnRDb2xvclNwYWNlKSkgeworCisgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX0NPTE9SU1BBQ0VfQ0hFQ0ssICJDb2xvclNwYWNlIG1pc21hdGNoIik7CisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgZGV2aWNlbGluayBpcyBmb3VuZCwgdGhlbiBubyBjdXN0b20gaW50ZW50IGlzIGFsbG93ZWQgYW5kIHdlIGNhbgorICAgICAgICAvLyByZWFkIHRoZSBMVVQgdG8gYmUgYXBwbGllZC4gU2V0dGluZ3MgZG9uJ3QgYXBwbHkgaGVyZS4KKyAgICAgICAgaWYgKGxJc0RldmljZUxpbmsgfHwgKChDbGFzc1NpZyA9PSBjbXNTaWdOYW1lZENvbG9yQ2xhc3MpICYmIChuUHJvZmlsZXMgPT0gMSkpKSB7CisKKyAgICAgICAgICAgIC8vIEdldCB0aGUgaW52b2x2ZWQgTFVUIGZyb20gdGhlIHByb2ZpbGUKKyAgICAgICAgICAgIEx1dCA9IF9jbXNSZWFkRGV2aWNlbGlua0xVVChoUHJvZmlsZSwgSW50ZW50KTsKKyAgICAgICAgICAgIGlmIChMdXQgPT0gTlVMTCkgZ290byBFcnJvcjsKKworICAgICAgICAgICAgLy8gV2hhdCBhYm91dCBhYnN0cmFjdCBwcm9maWxlcz8KKyAgICAgICAgICAgICBpZiAoQ2xhc3NTaWcgPT0gY21zU2lnQWJzdHJhY3RDbGFzcyAmJiBpID4gMCkgeworICAgICAgICAgICAgICAgIGlmICghQ29tcHV0ZUNvbnZlcnNpb24oaSwgaFByb2ZpbGVzLCBJbnRlbnQsIEJQQ1tpXSwgQWRhcHRhdGlvblN0YXRlc1tpXSwgJm0sICZvZmYpKSBnb3RvIEVycm9yOworICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBfY21zTUFUM2lkZW50aXR5KCZtKTsKKyAgICAgICAgICAgICAgICBfY21zVkVDM2luaXQoJm9mZiwgMCwgMCwgMCk7CisgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIGlmICghQWRkQ29udmVyc2lvbihSZXN1bHQsIEN1cnJlbnRDb2xvclNwYWNlLCBDb2xvclNwYWNlSW4sICZtLCAmb2ZmKSkgZ290byBFcnJvcjsKKworICAgICAgICB9CisgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICBpZiAobElzSW5wdXQpIHsKKyAgICAgICAgICAgICAgICAvLyBJbnB1dCBkaXJlY3Rpb24gbWVhbnMgbm9uLXBjcyBjb25uZWN0aW9uLCBzbyBwcm9jZWVkIGxpa2UgZGV2aWNlbGlua3MKKyAgICAgICAgICAgICAgICBMdXQgPSBfY21zUmVhZElucHV0TFVUKGhQcm9maWxlLCBJbnRlbnQpOworICAgICAgICAgICAgICAgIGlmIChMdXQgPT0gTlVMTCkgZ290byBFcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAgICAgLy8gT3V0cHV0IGRpcmVjdGlvbiBtZWFucyBQQ1MgY29ubmVjdGlvbi4gSW50ZW50IG1heSBhcHBseSBoZXJlCisgICAgICAgICAgICAgICAgTHV0ID0gX2Ntc1JlYWRPdXRwdXRMVVQoaFByb2ZpbGUsIEludGVudCk7CisgICAgICAgICAgICAgICAgaWYgKEx1dCA9PSBOVUxMKSBnb3RvIEVycm9yOworCisKKyAgICAgICAgICAgICAgICBpZiAoIUNvbXB1dGVDb252ZXJzaW9uKGksIGhQcm9maWxlcywgSW50ZW50LCBCUENbaV0sIEFkYXB0YXRpb25TdGF0ZXNbaV0sICZtLCAmb2ZmKSkgZ290byBFcnJvcjsKKyAgICAgICAgICAgICAgICBpZiAoIUFkZENvbnZlcnNpb24oUmVzdWx0LCBDdXJyZW50Q29sb3JTcGFjZSwgQ29sb3JTcGFjZUluLCAmbSwgJm9mZikpIGdvdG8gRXJyb3I7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbmNhdGVuYXRlIHRvIHRoZSBvdXRwdXQgTFVUCisgICAgICAgIGlmICghY21zUGlwZWxpbmVDYXQoUmVzdWx0LCBMdXQpKQorICAgICAgICAgICAgZ290byBFcnJvcjsKKworICAgICAgICBjbXNQaXBlbGluZUZyZWUoTHV0KTsKKyAgICAgICAgTHV0ID0gTlVMTDsKKworICAgICAgICAvLyBVcGRhdGUgY3VycmVudCBzcGFjZQorICAgICAgICBDdXJyZW50Q29sb3JTcGFjZSA9IENvbG9yU3BhY2VPdXQ7CisgICAgfQorCisgICAgLy8gQ2hlY2sgZm9yIG5vbi1uZWdhdGl2ZXMgY2xpcAorICAgIGlmIChkd0ZsYWdzICYgY21zRkxBR1NfTk9ORUdBVElWRVMpIHsKKworICAgICAgICAgICBpZiAoQ29sb3JTcGFjZU91dCA9PSBjbXNTaWdHcmF5RGF0YSB8fAorICAgICAgICAgICAgICAgICAgQ29sb3JTcGFjZU91dCA9PSBjbXNTaWdSZ2JEYXRhIHx8CisgICAgICAgICAgICAgICAgICBDb2xvclNwYWNlT3V0ID09IGNtc1NpZ0NteWtEYXRhKSB7CisKKyAgICAgICAgICAgICAgICAgIGNtc1N0YWdlKiBjbGlwID0gX2Ntc1N0YWdlQ2xpcE5lZ2F0aXZlcyhSZXN1bHQtPkNvbnRleHRJRCwgY21zQ2hhbm5lbHNPZihDb2xvclNwYWNlT3V0KSk7CisgICAgICAgICAgICAgICAgICBpZiAoY2xpcCA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgICAgICAgICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoUmVzdWx0LCBjbXNBVF9FTkQsIGNsaXApKQorICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybiBSZXN1bHQ7CisKK0Vycm9yOgorCisgICAgaWYgKEx1dCAhPSBOVUxMKSBjbXNQaXBlbGluZUZyZWUoTHV0KTsKKyAgICBpZiAoUmVzdWx0ICE9IE5VTEwpIGNtc1BpcGVsaW5lRnJlZShSZXN1bHQpOworICAgIHJldHVybiBOVUxMOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihkd0ZsYWdzKTsKK30KKworCisvLyBXcmFwcGVyIGZvciBETEwgY2FsbGluZyBjb252ZW50aW9uCitjbXNQaXBlbGluZSogIENNU0VYUE9SVCBfY21zRGVmYXVsdElDQ2ludGVudHMoY21zQ29udGV4dCAgICAgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuUHJvZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFRoZUludGVudHNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSAgICAgaFByb2ZpbGVzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zQm9vbCAgICAgICAgIEJQQ1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgQWRhcHRhdGlvblN0YXRlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKQoreworICAgIHJldHVybiBEZWZhdWx0SUNDaW50ZW50cyhDb250ZXh0SUQsIG5Qcm9maWxlcywgVGhlSW50ZW50cywgaFByb2ZpbGVzLCBCUEMsIEFkYXB0YXRpb25TdGF0ZXMsIGR3RmxhZ3MpOworfQorCisvLyBCbGFjayBwcmVzZXJ2aW5nIGludGVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRyYW5zbGF0ZSBibGFjay1wcmVzZXJ2aW5nIGludGVudHMgdG8gSUNDIG9uZXMKK3N0YXRpYworaW50IFRyYW5zbGF0ZU5vbklDQ0ludGVudHMoaW50IEludGVudCkKK3sKKyAgICBzd2l0Y2ggKEludGVudCkgeworICAgICAgICBjYXNlIElOVEVOVF9QUkVTRVJWRV9LX09OTFlfUEVSQ0VQVFVBTDoKKyAgICAgICAgY2FzZSBJTlRFTlRfUFJFU0VSVkVfS19QTEFORV9QRVJDRVBUVUFMOgorICAgICAgICAgICAgcmV0dXJuIElOVEVOVF9QRVJDRVBUVUFMOworCisgICAgICAgIGNhc2UgSU5URU5UX1BSRVNFUlZFX0tfT05MWV9SRUxBVElWRV9DT0xPUklNRVRSSUM6CisgICAgICAgIGNhc2UgSU5URU5UX1BSRVNFUlZFX0tfUExBTkVfUkVMQVRJVkVfQ09MT1JJTUVUUklDOgorICAgICAgICAgICAgcmV0dXJuIElOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUM7CisKKyAgICAgICAgY2FzZSBJTlRFTlRfUFJFU0VSVkVfS19PTkxZX1NBVFVSQVRJT046CisgICAgICAgIGNhc2UgSU5URU5UX1BSRVNFUlZFX0tfUExBTkVfU0FUVVJBVElPTjoKKyAgICAgICAgICAgIHJldHVybiBJTlRFTlRfU0FUVVJBVElPTjsKKworICAgICAgICBkZWZhdWx0OiByZXR1cm4gSW50ZW50OworICAgIH0KK30KKworLy8gU2FtcGxlciBmb3IgQmxhY2stb25seSBwcmVzZXJ2aW5nIENNWUstPkNNWUsgdHJhbnNmb3JtcworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY21zUGlwZWxpbmUqICAgIGNteWsyY215azsgICAgICAvLyBUaGUgb3JpZ2luYWwgdHJhbnNmb3JtCisgICAgY21zVG9uZUN1cnZlKiAgIEtUb25lOyAgICAgICAgICAvLyBCbGFjay10by1ibGFjayB0b25lIGN1cnZlCisKK30gR3JheU9ubHlQYXJhbXM7CisKKworLy8gUHJlc2VydmUgYmxhY2sgb25seSBpZiB0aGF0IGlzIHRoZSBvbmx5IGluayB1c2VkCitzdGF0aWMKK2ludCBCbGFja1ByZXNlcnZpbmdHcmF5T25seVNhbXBsZXIocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIEluW10sIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciBPdXRbXSwgcmVnaXN0ZXIgdm9pZCogQ2FyZ28pCit7CisgICAgR3JheU9ubHlQYXJhbXMqIGJwID0gKEdyYXlPbmx5UGFyYW1zKikgQ2FyZ287CisKKyAgICAvLyBJZiBnb2luZyBhY3Jvc3MgYmxhY2sgb25seSwga2VlcCBibGFjayBvbmx5CisgICAgaWYgKEluWzBdID09IDAgJiYgSW5bMV0gPT0gMCAmJiBJblsyXSA9PSAwKSB7CisKKyAgICAgICAgLy8gVEFDIGRvZXMgbm90IGFwcGx5IGJlY2F1c2UgaXQgaXMgYmxhY2sgaW5rIQorICAgICAgICBPdXRbMF0gPSBPdXRbMV0gPSBPdXRbMl0gPSAwOworICAgICAgICBPdXRbM10gPSBjbXNFdmFsVG9uZUN1cnZlMTYoYnAtPktUb25lLCBJblszXSk7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIC8vIEtlZXAgbm9ybWFsIHRyYW5zZm9ybSBmb3Igb3RoZXIgY29sb3JzCisgICAgYnAgLT5jbXlrMmNteWsgLT5FdmFsMTZGbihJbiwgT3V0LCBicCAtPmNteWsyY215ay0+RGF0YSk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8vIFRoaXMgaXMgdGhlIGVudHJ5IGZvciBibGFjay1wcmVzZXJ2aW5nIEstb25seSBpbnRlbnRzLCB3aGljaCBhcmUgbm9uLUlDQworc3RhdGljCitjbXNQaXBlbGluZSogIEJsYWNrUHJlc2VydmluZ0tPbmx5SW50ZW50cyhjbXNDb250ZXh0ICAgICBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgblByb2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFRoZUludGVudHNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFICAgICBoUHJvZmlsZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Jvb2wgICAgICAgICBCUENbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgQWRhcHRhdGlvblN0YXRlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpCit7CisgICAgR3JheU9ubHlQYXJhbXMgIGJwOworICAgIGNtc1BpcGVsaW5lKiAgICBSZXN1bHQ7CisgICAgY21zVUludDMyTnVtYmVyIElDQ0ludGVudHNbMjU2XTsKKyAgICBjbXNTdGFnZSogICAgICAgICBDTFVUOworICAgIGNtc1VJbnQzMk51bWJlciBpLCBuR3JpZFBvaW50czsKKworCisgICAgLy8gU2FuaXR5IGNoZWNrCisgICAgaWYgKG5Qcm9maWxlcyA8IDEgfHwgblByb2ZpbGVzID4gMjU1KSByZXR1cm4gTlVMTDsKKworICAgIC8vIFRyYW5zbGF0ZSBibGFjay1wcmVzZXJ2aW5nIGludGVudHMgdG8gSUNDIG9uZXMKKyAgICBmb3IgKGk9MDsgaSA8IG5Qcm9maWxlczsgaSsrKQorICAgICAgICBJQ0NJbnRlbnRzW2ldID0gVHJhbnNsYXRlTm9uSUNDSW50ZW50cyhUaGVJbnRlbnRzW2ldKTsKKworICAgIC8vIENoZWNrIGZvciBub24tY215ayBwcm9maWxlcworICAgIGlmIChjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlc1swXSkgIT0gY21zU2lnQ215a0RhdGEgfHwKKyAgICAgICAgY21zR2V0Q29sb3JTcGFjZShoUHJvZmlsZXNbblByb2ZpbGVzLTFdKSAhPSBjbXNTaWdDbXlrRGF0YSkKKyAgICAgICAgICAgcmV0dXJuIERlZmF1bHRJQ0NpbnRlbnRzKENvbnRleHRJRCwgblByb2ZpbGVzLCBJQ0NJbnRlbnRzLCBoUHJvZmlsZXMsIEJQQywgQWRhcHRhdGlvblN0YXRlcywgZHdGbGFncyk7CisKKyAgICBtZW1zZXQoJmJwLCAwLCBzaXplb2YoYnApKTsKKworICAgIC8vIEFsbG9jYXRlIGFuIGVtcHR5IExVVCBmb3IgaG9sZGluZyB0aGUgcmVzdWx0CisgICAgUmVzdWx0ID0gY21zUGlwZWxpbmVBbGxvYyhDb250ZXh0SUQsIDQsIDQpOworICAgIGlmIChSZXN1bHQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICAvLyBDcmVhdGUgYSBMVVQgaG9sZGluZyBub3JtYWwgSUNDIHRyYW5zZm9ybQorICAgIGJwLmNteWsyY215ayA9IERlZmF1bHRJQ0NpbnRlbnRzKENvbnRleHRJRCwKKyAgICAgICAgblByb2ZpbGVzLAorICAgICAgICBJQ0NJbnRlbnRzLAorICAgICAgICBoUHJvZmlsZXMsCisgICAgICAgIEJQQywKKyAgICAgICAgQWRhcHRhdGlvblN0YXRlcywKKyAgICAgICAgZHdGbGFncyk7CisKKyAgICBpZiAoYnAuY215azJjbXlrID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgICAvLyBOb3csIGNvbXB1dGUgdGhlIHRvbmUgY3VydmUKKyAgICBicC5LVG9uZSA9IF9jbXNCdWlsZEtUb25lQ3VydmUoQ29udGV4dElELAorICAgICAgICA0MDk2LAorICAgICAgICBuUHJvZmlsZXMsCisgICAgICAgIElDQ0ludGVudHMsCisgICAgICAgIGhQcm9maWxlcywKKyAgICAgICAgQlBDLAorICAgICAgICBBZGFwdGF0aW9uU3RhdGVzLAorICAgICAgICBkd0ZsYWdzKTsKKworICAgIGlmIChicC5LVG9uZSA9PSBOVUxMKSBnb3RvIEVycm9yOworCisKKyAgICAvLyBIb3cgbWFueSBncmlkcG9pbnRzIGFyZSB3ZSBnb2luZyB0byB1c2U/CisgICAgbkdyaWRQb2ludHMgPSBfY21zUmVhc29uYWJsZUdyaWRwb2ludHNCeUNvbG9yc3BhY2UoY21zU2lnQ215a0RhdGEsIGR3RmxhZ3MpOworCisgICAgLy8gQ3JlYXRlIHRoZSBDTFVULiAxNiBiaXRzCisgICAgQ0xVVCA9IGNtc1N0YWdlQWxsb2NDTHV0MTZiaXQoQ29udGV4dElELCBuR3JpZFBvaW50cywgNCwgNCwgTlVMTCk7CisgICAgaWYgKENMVVQgPT0gTlVMTCkgZ290byBFcnJvcjsKKworICAgIC8vIFRoaXMgaXMgdGhlIG9uZSBhbmQgb25seSBNUEUgaW4gdGhpcyBMVVQKKyAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoUmVzdWx0LCBjbXNBVF9CRUdJTiwgQ0xVVCkpCisgICAgICAgIGdvdG8gRXJyb3I7CisKKyAgICAvLyBTYW1wbGUgaXQuIFdlIGNhbm5vdCBhZmZvcmQgcHJlL3Bvc3QgbGluZWFyaXphdGlvbiB0aGlzIHRpbWUuCisgICAgaWYgKCFjbXNTdGFnZVNhbXBsZUNMdXQxNmJpdChDTFVULCBCbGFja1ByZXNlcnZpbmdHcmF5T25seVNhbXBsZXIsICh2b2lkKikgJmJwLCAwKSkKKyAgICAgICAgZ290byBFcnJvcjsKKworICAgIC8vIEdldCByaWQgb2YgeGZvcm0gYW5kIHRvbmUgY3VydmUKKyAgICBjbXNQaXBlbGluZUZyZWUoYnAuY215azJjbXlrKTsKKyAgICBjbXNGcmVlVG9uZUN1cnZlKGJwLktUb25lKTsKKworICAgIHJldHVybiBSZXN1bHQ7CisKK0Vycm9yOgorCisgICAgaWYgKGJwLmNteWsyY215ayAhPSBOVUxMKSBjbXNQaXBlbGluZUZyZWUoYnAuY215azJjbXlrKTsKKyAgICBpZiAoYnAuS1RvbmUgIT0gTlVMTCkgIGNtc0ZyZWVUb25lQ3VydmUoYnAuS1RvbmUpOworICAgIGlmIChSZXN1bHQgIT0gTlVMTCkgY21zUGlwZWxpbmVGcmVlKFJlc3VsdCk7CisgICAgcmV0dXJuIE5VTEw7CisKK30KKworLy8gSyBQbGFuZS1wcmVzZXJ2aW5nIENNWUsgdG8gQ01ZSyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgY21zUGlwZWxpbmUqICAgICBjbXlrMmNteWs7ICAgICAvLyBUaGUgb3JpZ2luYWwgdHJhbnNmb3JtCisgICAgY21zSFRSQU5TRk9STSAgICBoUHJvb2ZPdXRwdXQ7ICAvLyBPdXRwdXQgQ01ZSyB0byBMYWIgKGxhc3QgcHJvZmlsZSkKKyAgICBjbXNIVFJBTlNGT1JNICAgIGNteWsyTGFiOyAgICAgIC8vIFRoZSBpbnB1dCBjaGFpbgorICAgIGNtc1RvbmVDdXJ2ZSogICAgS1RvbmU7ICAgICAgICAgLy8gQmxhY2stdG8tYmxhY2sgdG9uZSBjdXJ2ZQorICAgIGNtc1BpcGVsaW5lKiAgICAgTGFiSzJjbXlrOyAgICAgLy8gVGhlIG91dHB1dCBwcm9maWxlCisgICAgY21zRmxvYXQ2NE51bWJlciBNYXhFcnJvcjsKKworICAgIGNtc0hUUkFOU0ZPUk0gICAgaFJvdW5kVHJpcDsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIE1heFRBQzsKKworCit9IFByZXNlcnZlS1BsYW5lUGFyYW1zOworCisKKy8vIFRoZSBDTFVUIHdpbGwgYmUgc3RvcmVkIGF0IDE2IGJpdHMsIGJ1dCBjYWxjdWxhdGlvbnMgYXJlIHBlcmZvcm1lZCBhdCBjbXNGbG9hdDMyTnVtYmVyIHByZWNpc2lvbgorc3RhdGljCitpbnQgQmxhY2tQcmVzZXJ2aW5nU2FtcGxlcihyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5bXSwgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIE91dFtdLCByZWdpc3RlciB2b2lkKiBDYXJnbykKK3sKKyAgICBpbnQgaTsKKyAgICBjbXNGbG9hdDMyTnVtYmVyIEluZls0XSwgT3V0Zls0XTsKKyAgICBjbXNGbG9hdDMyTnVtYmVyIExhYktbNF07CisgICAgY21zRmxvYXQ2NE51bWJlciBTdW1DTVksIFN1bUNNWUssIEVycm9yLCBSYXRpbzsKKyAgICBjbXNDSUVMYWIgQ29sb3JpbWV0cmljTGFiLCBCbGFja1ByZXNlcnZpbmdMYWI7CisgICAgUHJlc2VydmVLUGxhbmVQYXJhbXMqIGJwID0gKFByZXNlcnZlS1BsYW5lUGFyYW1zKikgQ2FyZ287CisKKyAgICAvLyBDb252ZXJ0IGZyb20gMTYgYml0cyB0byBmbG9hdGluZyBwb2ludAorICAgIGZvciAoaT0wOyBpIDwgNDsgaSsrKQorICAgICAgICBJbmZbaV0gPSAoY21zRmxvYXQzMk51bWJlcikgKEluW2ldIC8gNjU1MzUuMCk7CisKKyAgICAvLyBHZXQgdGhlIEsgYWNyb3NzIFRvbmUgY3VydmUKKyAgICBMYWJLWzNdID0gY21zRXZhbFRvbmVDdXJ2ZUZsb2F0KGJwIC0+S1RvbmUsIEluZlszXSk7CisKKyAgICAvLyBJZiBnb2luZyBhY3Jvc3MgYmxhY2sgb25seSwga2VlcCBibGFjayBvbmx5CisgICAgaWYgKEluWzBdID09IDAgJiYgSW5bMV0gPT0gMCAmJiBJblsyXSA9PSAwKSB7CisKKyAgICAgICAgT3V0WzBdID0gT3V0WzFdID0gT3V0WzJdID0gMDsKKyAgICAgICAgT3V0WzNdID0gX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKExhYktbM10gKiA2NTUzNS4wKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgLy8gVHJ5IHRoZSBvcmlnaW5hbCB0cmFuc2Zvcm0sCisgICAgY21zUGlwZWxpbmVFdmFsRmxvYXQoIEluZiwgT3V0ZiwgYnAgLT5jbXlrMmNteWspOworCisgICAgLy8gU3RvcmUgYSBjb3B5IG9mIHRoZSBmbG9hdGluZyBwb2ludCByZXN1bHQgaW50byAxNi1iaXQKKyAgICBmb3IgKGk9MDsgaSA8IDQ7IGkrKykKKyAgICAgICAgICAgIE91dFtpXSA9IF9jbXNRdWlja1NhdHVyYXRlV29yZChPdXRmW2ldICogNjU1MzUuMCk7CisKKyAgICAvLyBNYXliZSBLIGlzIGFscmVhZHkgb2sgKG1vc3RseSBvbiBLPTApCisgICAgaWYgKCBmYWJzKE91dGZbM10gLSBMYWJLWzNdKSA8ICgzLjAgLyA2NTUzNS4wKSApIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgLy8gSyBkaWZmZXIsIG1lc3VyZSBhbmQga2VlcCBMYWIgbWVhc3VyZW1lbnQgZm9yIGZ1cnRoZXIgdXNhZ2UKKyAgICAvLyB0aGlzIGlzIGRvbmUgaW4gcmVsYXRpdmUgY29sb3JpbWV0cmljIGludGVudAorICAgIGNtc0RvVHJhbnNmb3JtKGJwLT5oUHJvb2ZPdXRwdXQsIE91dCwgJkNvbG9yaW1ldHJpY0xhYiwgMSk7CisKKyAgICAvLyBJcyBub3QgYmxhY2sgb25seSBhbmQgdGhlIHRyYW5zZm9ybSBkb2Vzbid0IGtlZXAgYmxhY2suCisgICAgLy8gT2J0YWluIHRoZSBMYWIgb2Ygb3V0cHV0IENNWUsuIEFmdGVyIHRoYXQgd2UgaGF2ZSBMYWIgKyBLCisgICAgY21zRG9UcmFuc2Zvcm0oYnAgLT5jbXlrMkxhYiwgT3V0ZiwgTGFiSywgMSk7CisKKyAgICAvLyBPYnRhaW4gdGhlIGNvcnJlc3BvbmRpbmcgQ01ZIHVzaW5nIHJldmVyc2UgaW50ZXJwb2xhdGlvbgorICAgIC8vIChLIGlzIGZpeGVkIGluIExhYktbM10pCisgICAgaWYgKCFjbXNQaXBlbGluZUV2YWxSZXZlcnNlRmxvYXQoTGFiSywgT3V0ZiwgT3V0ZiwgYnAgLT5MYWJLMmNteWspKSB7CisKKyAgICAgICAgLy8gQ2Fubm90IGZpbmQgYSBzdWl0YWJsZSB2YWx1ZSwgc28gdXNlIGNvbG9yaW1ldHJpYyB4Zm9ybQorICAgICAgICAvLyB3aGljaCBpcyBhbHJlYWR5IHN0b3JlZCBpbiBPdXRbXQorICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgdG8gcGFzcyB0aHJvdWdoIEsgKHdoaWNoIG5vdyBpcyBmaXhlZCkKKyAgICBPdXRmWzNdID0gTGFiS1szXTsKKworICAgIC8vIEFwcGx5IFRBQyBpZiBuZWVkZWQKKyAgICBTdW1DTVkgICA9IE91dGZbMF0gICsgT3V0ZlsxXSArIE91dGZbMl07CisgICAgU3VtQ01ZSyAgPSBTdW1DTVkgKyBPdXRmWzNdOworCisgICAgaWYgKFN1bUNNWUsgPiBicCAtPk1heFRBQykgeworCisgICAgICAgIFJhdGlvID0gMSAtICgoU3VtQ01ZSyAtIGJwLT5NYXhUQUMpIC8gU3VtQ01ZKTsKKyAgICAgICAgaWYgKFJhdGlvIDwgMCkKKyAgICAgICAgICAgIFJhdGlvID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgIFJhdGlvID0gMS4wOworCisgICAgT3V0WzBdID0gX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKE91dGZbMF0gKiBSYXRpbyAqIDY1NTM1LjApOyAgICAgLy8gQworICAgIE91dFsxXSA9IF9jbXNRdWlja1NhdHVyYXRlV29yZChPdXRmWzFdICogUmF0aW8gKiA2NTUzNS4wKTsgICAgIC8vIE0KKyAgICBPdXRbMl0gPSBfY21zUXVpY2tTYXR1cmF0ZVdvcmQoT3V0ZlsyXSAqIFJhdGlvICogNjU1MzUuMCk7ICAgICAvLyBZCisgICAgT3V0WzNdID0gX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKE91dGZbM10gKiA2NTUzNS4wKTsKKworICAgIC8vIEVzdGltYXRlIHRoZSBlcnJvciAodGhpcyBnb2VzIDE2IGJpdHMgdG8gTGFiIERCTCkKKyAgICBjbXNEb1RyYW5zZm9ybShicC0+aFByb29mT3V0cHV0LCBPdXQsICZCbGFja1ByZXNlcnZpbmdMYWIsIDEpOworICAgIEVycm9yID0gY21zRGVsdGFFKCZDb2xvcmltZXRyaWNMYWIsICZCbGFja1ByZXNlcnZpbmdMYWIpOworICAgIGlmIChFcnJvciA+IGJwIC0+IE1heEVycm9yKQorICAgICAgICBicC0+TWF4RXJyb3IgPSBFcnJvcjsKKworICAgIHJldHVybiBUUlVFOworfQorCisvLyBUaGlzIGlzIHRoZSBlbnRyeSBmb3IgYmxhY2stcGxhbmUgcHJlc2VydmluZywgd2hpY2ggYXJlIG5vbi1JQ0MKK3N0YXRpYworY21zUGlwZWxpbmUqIEJsYWNrUHJlc2VydmluZ0tQbGFuZUludGVudHMoY21zQ29udGV4dCAgICAgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG5Qcm9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBUaGVJbnRlbnRzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSAgICAgaFByb2ZpbGVzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNCb29sICAgICAgICAgQlBDW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEFkYXB0YXRpb25TdGF0ZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKQoreworICAgIFByZXNlcnZlS1BsYW5lUGFyYW1zIGJwOworICAgIGNtc1BpcGVsaW5lKiAgICBSZXN1bHQgPSBOVUxMOworICAgIGNtc1VJbnQzMk51bWJlciBJQ0NJbnRlbnRzWzI1Nl07CisgICAgY21zU3RhZ2UqICAgICAgICAgQ0xVVDsKKyAgICBjbXNVSW50MzJOdW1iZXIgaSwgbkdyaWRQb2ludHM7CisgICAgY21zSFBST0ZJTEUgaExhYjsKKworICAgIC8vIFNhbml0eSBjaGVjaworICAgIGlmIChuUHJvZmlsZXMgPCAxIHx8IG5Qcm9maWxlcyA+IDI1NSkgcmV0dXJuIE5VTEw7CisKKyAgICAvLyBUcmFuc2xhdGUgYmxhY2stcHJlc2VydmluZyBpbnRlbnRzIHRvIElDQyBvbmVzCisgICAgZm9yIChpPTA7IGkgPCBuUHJvZmlsZXM7IGkrKykKKyAgICAgICAgSUNDSW50ZW50c1tpXSA9IFRyYW5zbGF0ZU5vbklDQ0ludGVudHMoVGhlSW50ZW50c1tpXSk7CisKKyAgICAvLyBDaGVjayBmb3Igbm9uLWNteWsgcHJvZmlsZXMKKyAgICBpZiAoY21zR2V0Q29sb3JTcGFjZShoUHJvZmlsZXNbMF0pICE9IGNtc1NpZ0NteWtEYXRhIHx8CisgICAgICAgICEoY21zR2V0Q29sb3JTcGFjZShoUHJvZmlsZXNbblByb2ZpbGVzLTFdKSA9PSBjbXNTaWdDbXlrRGF0YSB8fAorICAgICAgICBjbXNHZXREZXZpY2VDbGFzcyhoUHJvZmlsZXNbblByb2ZpbGVzLTFdKSA9PSBjbXNTaWdPdXRwdXRDbGFzcykpCisgICAgICAgICAgIHJldHVybiAgRGVmYXVsdElDQ2ludGVudHMoQ29udGV4dElELCBuUHJvZmlsZXMsIElDQ0ludGVudHMsIGhQcm9maWxlcywgQlBDLCBBZGFwdGF0aW9uU3RhdGVzLCBkd0ZsYWdzKTsKKworICAgIC8vIEFsbG9jYXRlIGFuIGVtcHR5IExVVCBmb3IgaG9sZGluZyB0aGUgcmVzdWx0CisgICAgUmVzdWx0ID0gY21zUGlwZWxpbmVBbGxvYyhDb250ZXh0SUQsIDQsIDQpOworICAgIGlmIChSZXN1bHQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKworICAgIG1lbXNldCgmYnAsIDAsIHNpemVvZihicCkpOworCisgICAgLy8gV2UgbmVlZCB0aGUgaW5wdXQgTFVUIG9mIHRoZSBsYXN0IHByb2ZpbGUsIGFzc3VtaW5nIHRoaXMgb25lIGlzIHJlc3BvbnNpYmxlIG9mCisgICAgLy8gYmxhY2sgZ2VuZXJhdGlvbi4gVGhpcyBMVVQgd2lsbCBiZSBzZWFyY2hlZCBpbiBpbnZlcnNlIG9yZGVyLgorICAgIGJwLkxhYksyY215ayA9IF9jbXNSZWFkSW5wdXRMVVQoaFByb2ZpbGVzW25Qcm9maWxlcy0xXSwgSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQyk7CisgICAgaWYgKGJwLkxhYksyY215ayA9PSBOVUxMKSBnb3RvIENsZWFudXA7CisKKyAgICAvLyBHZXQgdG90YWwgYXJlYSBjb3ZlcmFnZSAoaW4gMC4uMSBkb21haW4pCisgICAgYnAuTWF4VEFDID0gY21zRGV0ZWN0VEFDKGhQcm9maWxlc1tuUHJvZmlsZXMtMV0pIC8gMTAwLjA7CisgICAgaWYgKGJwLk1heFRBQyA8PSAwKSBnb3RvIENsZWFudXA7CisKKworICAgIC8vIENyZWF0ZSBhIExVVCBob2xkaW5nIG5vcm1hbCBJQ0MgdHJhbnNmb3JtCisgICAgYnAuY215azJjbXlrID0gRGVmYXVsdElDQ2ludGVudHMoQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUHJvZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDQ0ludGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQcm9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGF0aW9uU3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzKTsKKyAgICBpZiAoYnAuY215azJjbXlrID09IE5VTEwpIGdvdG8gQ2xlYW51cDsKKworICAgIC8vIE5vdyB0aGUgdG9uZSBjdXJ2ZQorICAgIGJwLktUb25lID0gX2Ntc0J1aWxkS1RvbmVDdXJ2ZShDb250ZXh0SUQsIDQwOTYsIG5Qcm9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNDSW50ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFByb2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0YXRpb25TdGF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZ3MpOworICAgIGlmIChicC5LVG9uZSA9PSBOVUxMKSBnb3RvIENsZWFudXA7CisKKyAgICAvLyBUbyBtZWFzdXJlIHRoZSBvdXRwdXQsIExhc3QgcHJvZmlsZSB0byBMYWIKKyAgICBoTGFiID0gY21zQ3JlYXRlTGFiNFByb2ZpbGVUSFIoQ29udGV4dElELCBOVUxMKTsKKyAgICBicC5oUHJvb2ZPdXRwdXQgPSBjbXNDcmVhdGVUcmFuc2Zvcm1USFIoQ29udGV4dElELCBoUHJvZmlsZXNbblByb2ZpbGVzLTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOTkVMU19TSCg0KXxCWVRFU19TSCgyKSwgaExhYiwgVFlQRV9MYWJfREJMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlRFTlRfUkVMQVRJVkVfQ09MT1JJTUVUUklDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGTEFHU19OT0NBQ0hFfGNtc0ZMQUdTX05PT1BUSU1JWkUpOworICAgIGlmICggYnAuaFByb29mT3V0cHV0ID09IE5VTEwpIGdvdG8gQ2xlYW51cDsKKworICAgIC8vIFNhbWUgYXMgYW50ZXJpb3IsIGJ1dCBsYWIgaW4gdGhlIDAuLjEgcmFuZ2UKKyAgICBicC5jbXlrMkxhYiA9IGNtc0NyZWF0ZVRyYW5zZm9ybVRIUihDb250ZXh0SUQsIGhQcm9maWxlc1tuUHJvZmlsZXMtMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMT0FUX1NIKDEpfENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDQpLCBoTGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTE9BVF9TSCgxKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCg0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRkxBR1NfTk9DQUNIRXxjbXNGTEFHU19OT09QVElNSVpFKTsKKyAgICBpZiAoYnAuY215azJMYWIgPT0gTlVMTCkgZ290byBDbGVhbnVwOworICAgIGNtc0Nsb3NlUHJvZmlsZShoTGFiKTsKKworICAgIC8vIEVycm9yIGVzdGltYXRpb24gKGZvciBkZWJ1ZyBvbmx5KQorICAgIGJwLk1heEVycm9yID0gMDsKKworICAgIC8vIEhvdyBtYW55IGdyaWRwb2ludHMgYXJlIHdlIGdvaW5nIHRvIHVzZT8KKyAgICBuR3JpZFBvaW50cyA9IF9jbXNSZWFzb25hYmxlR3JpZHBvaW50c0J5Q29sb3JzcGFjZShjbXNTaWdDbXlrRGF0YSwgZHdGbGFncyk7CisKKworICAgIENMVVQgPSBjbXNTdGFnZUFsbG9jQ0x1dDE2Yml0KENvbnRleHRJRCwgbkdyaWRQb2ludHMsIDQsIDQsIE5VTEwpOworICAgIGlmIChDTFVUID09IE5VTEwpIGdvdG8gQ2xlYW51cDsKKworICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShSZXN1bHQsIGNtc0FUX0JFR0lOLCBDTFVUKSkKKyAgICAgICAgZ290byBDbGVhbnVwOworCisgICAgY21zU3RhZ2VTYW1wbGVDTHV0MTZiaXQoQ0xVVCwgQmxhY2tQcmVzZXJ2aW5nU2FtcGxlciwgKHZvaWQqKSAmYnAsIDApOworCitDbGVhbnVwOgorCisgICAgaWYgKGJwLmNteWsyY215aykgY21zUGlwZWxpbmVGcmVlKGJwLmNteWsyY215ayk7CisgICAgaWYgKGJwLmNteWsyTGFiKSBjbXNEZWxldGVUcmFuc2Zvcm0oYnAuY215azJMYWIpOworICAgIGlmIChicC5oUHJvb2ZPdXRwdXQpIGNtc0RlbGV0ZVRyYW5zZm9ybShicC5oUHJvb2ZPdXRwdXQpOworCisgICAgaWYgKGJwLktUb25lKSBjbXNGcmVlVG9uZUN1cnZlKGJwLktUb25lKTsKKyAgICBpZiAoYnAuTGFiSzJjbXlrKSBjbXNQaXBlbGluZUZyZWUoYnAuTGFiSzJjbXlrKTsKKworICAgIHJldHVybiBSZXN1bHQ7Cit9CisKKy8vIExpbmsgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIENoYWluIHNldmVyYWwgcHJvZmlsZXMgaW50byBhIHNpbmdsZSBMVVQuIEl0IGp1c3QgY2hlY2tzIHRoZSBwYXJhbWV0ZXJzIGFuZCB0aGVuIGNhbGxzIHRoZSBoYW5kbGVyCisvLyBmb3IgdGhlIGZpcnN0IGludGVudCBpbiBjaGFpbi4gVGhlIGhhbmRsZXIgbWF5IGJlIHVzZXItZGVmaW5lZC4gSXMgdXAgdG8gdGhlIGhhbmRsZXIgdG8gZGVhbCB3aXRoIHRoZQorLy8gcmVzdCBvZiBpbnRlbnRzIGluIGNoYWluLiBBIG1heGltdW0gb2YgMjU1IHByb2ZpbGVzIGF0IHRpbWUgYXJlIHN1cHBvcnRlZCwgd2hpY2ggaXMgcHJldHR5IHJlYXNvbmFibGUuCitjbXNQaXBlbGluZSogX2Ntc0xpbmtQcm9maWxlcyhjbXNDb250ZXh0ICAgICBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgblByb2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFRoZUludGVudHNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFICAgICBoUHJvZmlsZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Jvb2wgICAgICAgICBCUENbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgQWRhcHRhdGlvblN0YXRlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpCit7CisgICAgY21zVUludDMyTnVtYmVyIGk7CisgICAgY21zSW50ZW50c0xpc3QqIEludGVudDsKKworICAgIC8vIE1ha2Ugc3VyZSBhIHJlYXNvbmFibGUgbnVtYmVyIG9mIHByb2ZpbGVzIGlzIHByb3ZpZGVkCisgICAgaWYgKG5Qcm9maWxlcyA8PSAwIHx8IG5Qcm9maWxlcyA+IDI1NSkgeworICAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgIkNvdWxkbid0IGxpbmsgJyVkJyBwcm9maWxlcyIsIG5Qcm9maWxlcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAoaT0wOyBpIDwgblByb2ZpbGVzOyBpKyspIHsKKworICAgICAgICAvLyBDaGVjayBpZiBibGFjayBwb2ludCBpcyByZWFsbHkgbmVlZGVkIG9yIGFsbG93ZWQuIE5vdGUgdGhhdAorICAgICAgICAvLyBmb2xsb3dpbmcgQWRvYmUncyBkb2N1bWVudDoKKyAgICAgICAgLy8gQlBDIGRvZXMgbm90IGFwcGx5IHRvIGRldmljZWxpbmsgcHJvZmlsZXMsIG5vciB0byBhYnMgY29sb3JpbWV0cmljLAorICAgICAgICAvLyBhbmQgYXBwbGllcyBhbHdheXMgb24gVjQgcGVyY2VwdHVhbCBhbmQgc2F0dXJhdGlvbi4KKworICAgICAgICBpZiAoVGhlSW50ZW50c1tpXSA9PSBJTlRFTlRfQUJTT0xVVEVfQ09MT1JJTUVUUklDKQorICAgICAgICAgICAgQlBDW2ldID0gRkFMU0U7CisKKyAgICAgICAgaWYgKFRoZUludGVudHNbaV0gPT0gSU5URU5UX1BFUkNFUFRVQUwgfHwgVGhlSW50ZW50c1tpXSA9PSBJTlRFTlRfU0FUVVJBVElPTikgeworCisgICAgICAgICAgICAvLyBGb3JjZSBCUEMgZm9yIFY0IHByb2ZpbGVzIGluIHBlcmNlcHR1YWwgYW5kIHNhdHVyYXRpb24KKyAgICAgICAgICAgIGlmIChjbXNHZXRFbmNvZGVkSUNDdmVyc2lvbihoUHJvZmlsZXNbaV0pID49IDB4NDAwMDAwMCkKKyAgICAgICAgICAgICAgICBCUENbaV0gPSBUUlVFOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2VhcmNoIGZvciBhIGhhbmRsZXIuIFRoZSBmaXJzdCBpbnRlbnQgaW4gdGhlIGNoYWluIGRlZmluZXMgdGhlIGhhbmRsZXIuIFRoYXQgd291bGQKKyAgICAvLyBwcmV2ZW50IHVzaW5nIG11bHRpcGxlIGN1c3RvbSBpbnRlbnRzIGluIGEgbXVsdGlpbnRlbnQgY2hhaW4sIGJ1dCB0aGUgYmVoYXZpb3VyIG9mCisgICAgLy8gdGhpcyBjYXNlIHdvdWxkIHByZXNlbnQgc29tZSBpc3N1ZXMgaWYgdGhlIGN1c3RvbSBpbnRlbnQgdHJpZXMgdG8gZG8gdGhpbmdzIGxpa2UKKyAgICAvLyBwcmVzZXJ2ZSBwcmltYXJpZXMuIFRoaXMgc29sdXRpb24gaXMgbm90IHBlcmZlY3QsIGJ1dCB3b3JrcyB3ZWxsIG9uIG1vc3QgY2FzZXMuCisKKyAgICBJbnRlbnQgPSBTZWFyY2hJbnRlbnQoQ29udGV4dElELCBUaGVJbnRlbnRzWzBdKTsKKyAgICBpZiAoSW50ZW50ID09IE5VTEwpIHsKKyAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVuc3VwcG9ydGVkIGludGVudCAnJWQnIiwgVGhlSW50ZW50c1swXSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIENhbGwgdGhlIGhhbmRsZXIKKyAgICByZXR1cm4gSW50ZW50IC0+TGluayhDb250ZXh0SUQsIG5Qcm9maWxlcywgVGhlSW50ZW50cywgaFByb2ZpbGVzLCBCUEMsIEFkYXB0YXRpb25TdGF0ZXMsIGR3RmxhZ3MpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEdldCBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGUgaW50ZW50cy4gbk1heCBpcyB0aGUgbWF4aW11bSBzcGFjZSBmb3IgdGhlIHN1cHBsaWVkICJDb2RlcyIKKy8vIGFuZCAiRGVzY3JpcHRpb25zIiB0aGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGludGVudHMsIHdoaWNoIG1heSBiZSBncmVhdGVyCisvLyB0aGFuIG5NYXgsIGFsdGhvdWdoIHRoZSBtYXRyaWNlcyBhcmUgbm90IHBvcHVsYXRlZCBiZXlvbmQgdGhpcyBsZXZlbC4KK2Ntc1VJbnQzMk51bWJlciBDTVNFWFBPUlQgY21zR2V0U3VwcG9ydGVkSW50ZW50c1RIUihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIG5NYXgsIGNtc1VJbnQzMk51bWJlciogQ29kZXMsIGNoYXIqKiBEZXNjcmlwdGlvbnMpCit7CisgICAgX2Ntc0ludGVudHNQbHVnaW5DaHVua1R5cGUqIGN0eCA9ICggX2Ntc0ludGVudHNQbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgSW50ZW50UGx1Z2luKTsKKyAgICBjbXNJbnRlbnRzTGlzdCogcHQ7CisgICAgY21zVUludDMyTnVtYmVyIG5JbnRlbnRzOworCisKKyAgICBmb3IgKG5JbnRlbnRzPTAsIHB0ID0gY3R4LT5JbnRlbnRzOyBwdCAhPSBOVUxMOyBwdCA9IHB0IC0+IE5leHQpCisgICAgeworICAgICAgICBpZiAobkludGVudHMgPCBuTWF4KSB7CisgICAgICAgICAgICBpZiAoQ29kZXMgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBDb2Rlc1tuSW50ZW50c10gPSBwdCAtPkludGVudDsKKworICAgICAgICAgICAgaWYgKERlc2NyaXB0aW9ucyAhPSBOVUxMKQorICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uc1tuSW50ZW50c10gPSBwdCAtPkRlc2NyaXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgbkludGVudHMrKzsKKyAgICB9CisKKyAgICBmb3IgKG5JbnRlbnRzPTAsIHB0ID0gRGVmYXVsdEludGVudHM7IHB0ICE9IE5VTEw7IHB0ID0gcHQgLT4gTmV4dCkKKyAgICB7CisgICAgICAgIGlmIChuSW50ZW50cyA8IG5NYXgpIHsKKyAgICAgICAgICAgIGlmIChDb2RlcyAhPSBOVUxMKQorICAgICAgICAgICAgICAgIENvZGVzW25JbnRlbnRzXSA9IHB0IC0+SW50ZW50OworCisgICAgICAgICAgICBpZiAoRGVzY3JpcHRpb25zICE9IE5VTEwpCisgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25zW25JbnRlbnRzXSA9IHB0IC0+RGVzY3JpcHRpb247CisgICAgICAgIH0KKworICAgICAgICBuSW50ZW50cysrOworICAgIH0KKyAgICByZXR1cm4gbkludGVudHM7Cit9CisKK2Ntc1VJbnQzMk51bWJlciBDTVNFWFBPUlQgY21zR2V0U3VwcG9ydGVkSW50ZW50cyhjbXNVSW50MzJOdW1iZXIgbk1heCwgY21zVUludDMyTnVtYmVyKiBDb2RlcywgY2hhcioqIERlc2NyaXB0aW9ucykKK3sKKyAgICByZXR1cm4gY21zR2V0U3VwcG9ydGVkSW50ZW50c1RIUihOVUxMLCBuTWF4LCBDb2RlcywgRGVzY3JpcHRpb25zKTsKK30KKworLy8gVGhlIHBsdWctaW4gcmVnaXN0cmF0aW9uLiBVc2VyIGNhbiBhZGQgbmV3IGludGVudHMgb3Igb3ZlcnJpZGUgZGVmYXVsdCByb3V0aW5lcworY21zQm9vbCAgX2Ntc1JlZ2lzdGVyUmVuZGVyaW5nSW50ZW50UGx1Z2luKGNtc0NvbnRleHQgaWQsIGNtc1BsdWdpbkJhc2UqIERhdGEpCit7CisgICAgX2Ntc0ludGVudHNQbHVnaW5DaHVua1R5cGUqIGN0eCA9ICggX2Ntc0ludGVudHNQbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKGlkLCBJbnRlbnRQbHVnaW4pOworICAgIGNtc1BsdWdpblJlbmRlcmluZ0ludGVudCogUGx1Z2luID0gKGNtc1BsdWdpblJlbmRlcmluZ0ludGVudCopIERhdGE7CisgICAgY21zSW50ZW50c0xpc3QqIGZsOworCisgICAgLy8gRG8gd2UgaGF2ZSB0byByZXNldCB0aGUgY3VzdG9tIGludGVudHM/CisgICAgaWYgKERhdGEgPT0gTlVMTCkgeworCisgICAgICAgIGN0eC0+SW50ZW50cyA9IE5VTEw7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIGZsID0gKGNtc0ludGVudHNMaXN0KikgX2Ntc1BsdWdpbk1hbGxvYyhpZCwgc2l6ZW9mKGNtc0ludGVudHNMaXN0KSk7CisgICAgaWYgKGZsID09IE5VTEwpIHJldHVybiBGQUxTRTsKKworCisgICAgZmwgLT5JbnRlbnQgID0gUGx1Z2luIC0+SW50ZW50OworICAgIHN0cm5jcHkoZmwgLT5EZXNjcmlwdGlvbiwgUGx1Z2luIC0+RGVzY3JpcHRpb24sIHNpemVvZihmbCAtPkRlc2NyaXB0aW9uKS0xKTsKKyAgICBmbCAtPkRlc2NyaXB0aW9uW3NpemVvZihmbCAtPkRlc2NyaXB0aW9uKS0xXSA9IDA7CisKKyAgICBmbCAtPkxpbmsgICAgPSBQbHVnaW4gLT5MaW5rOworCisgICAgZmwgLT5OZXh0ID0gY3R4IC0+SW50ZW50czsKKyAgICBjdHggLT5JbnRlbnRzID0gZmw7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zZXJyLmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNlcnIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWIwNTUwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zZXJyLmMKQEAgLTAsMCArMSw1MTkgQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8KKy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisvLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKKy8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisvLworLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKy8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorLy8KKy8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCisvLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQorLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisvLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaW5jbHVkZSAibGNtczJfaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKworLy8gVGhpcyBmdW5jdGlvbiBpcyBoZXJlIHRvIGhlbHAgYXBwbGljYXRpb25zIHRvIHByZXZlbnQgbWl4aW5nIGxjbXMgdmVyc2lvbnMgb24gaGVhZGVyIGFuZCBzaGFyZWQgb2JqZWN0cy4KK2ludCBDTVNFWFBPUlQgY21zR2V0RW5jb2RlZENNTXZlcnNpb24odm9pZCkKK3sKKyAgICAgICByZXR1cm4gTENNU19WRVJTSU9OOworfQorCisvLyBJIGFtIHNvIHRpcmVkIGFib3V0IGluY29tcGF0aWJpbGl0aWVzIG9uIHRob3NlIGZ1bmN0aW9ucyB0aGF0IGhlcmUgYXJlIHNvbWUgcmVwbGFjZW1lbnRzCisvLyB0aGF0IGhvcGVmdWxseSB3b3VsZCBiZSBmdWxseSBwb3J0YWJsZS4KKworLy8gY29tcGFyZSB0d28gc3RyaW5ncyBpZ25vcmluZyBjYXNlCitpbnQgQ01TRVhQT1JUIGNtc3N0cmNhc2VjbXAoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKQoreworICAgIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVzMSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdXMyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzMjsKKworICAgIHdoaWxlICh0b3VwcGVyKCp1czEpID09IHRvdXBwZXIoKnVzMisrKSkKKyAgICAgICAgaWYgKCp1czErKyA9PSAnXDAnKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gKHRvdXBwZXIoKnVzMSkgLSB0b3VwcGVyKCotLXVzMikpOworfQorCisvLyBsb25nIGludCBiZWNhdXNlIEM5OSBzcGVjaWZpZXMgZnRlbGwgaW4gc3VjaCB3YXkgKDcuMTkuOS4yKQorbG9uZyBpbnQgQ01TRVhQT1JUIGNtc2ZpbGVsZW5ndGgoRklMRSogZikKK3sKKyAgICBsb25nIGludCBwICwgbjsKKworICAgIHAgPSBmdGVsbChmKTsgLy8gcmVnaXN0ZXIgY3VycmVudCBmaWxlIHBvc2l0aW9uCisKKyAgICBpZiAoZnNlZWsoZiwgMCwgU0VFS19FTkQpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG4gPSBmdGVsbChmKTsKKyAgICBmc2VlayhmLCBwLCBTRUVLX1NFVCk7IC8vIGZpbGUgcG9zaXRpb24gcmVzdG9yZWQKKworICAgIHJldHVybiBuOworfQorCitjbXNCb29sICBfY21zUmVnaXN0ZXJNZW1IYW5kbGVyUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pCit7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8vIEdlbmVyaWMgYWxsb2NhdGUKK3ZvaWQqIENNU0VYUE9SVCBfY21zTWFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgc2l6ZSkKK3sKKyAgICByZXR1cm4gRlhNRU1fRGVmYXVsdEFsbG9jKHNpemUpOworfQorCisvLyBHZW5lcmljIGFsbG9jYXRlICYgemVybwordm9pZCogQ01TRVhQT1JUIF9jbXNNYWxsb2NaZXJvKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgc2l6ZSkKK3sKKyAgICB2b2lkKiBwID0gRlhNRU1fRGVmYXVsdEFsbG9jKHNpemUpOworICAgIGlmIChwKSBtZW1zZXQocCwgMCwgc2l6ZSk7CisgICAgcmV0dXJuIHA7Cit9CisKKy8vIEdlbmVyaWMgY2FsbG9jCit2b2lkKiBDTVNFWFBPUlQgX2Ntc0NhbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIG51bSwgY21zVUludDMyTnVtYmVyIHNpemUpCit7CisgICAgY21zVUludDMyTnVtYmVyIHRvdGFsID0gbnVtICogc2l6ZTsKKyAgICBpZiAodG90YWwgPT0gMCB8fCB0b3RhbCAvIHNpemUgIT0gbnVtIHx8IHRvdGFsID49IDUxMiAqIDEwMjQgKiAxMDI0KQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIG51bSAqIHNpemUpOworfQorCisvLyBHZW5lcmljIHJlYWxsb2NhdGUKK3ZvaWQqIENNU0VYUE9SVCBfY21zUmVhbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSkKK3sKKyAgICByZXR1cm4gRlhNRU1fRGVmYXVsdFJlYWxsb2MoUHRyLCBzaXplKTsKK30KKworLy8gR2VuZXJpYyBmcmVlIG1lbW9yeQordm9pZCBDTVNFWFBPUlQgX2Ntc0ZyZWUoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIFB0cikKK3sKKyAgICBpZiAoUHRyICE9IE5VTEwpIEZYTUVNX0RlZmF1bHRGcmVlKFB0cik7Cit9CisKKy8vIEdlbmVyaWMgYmxvY2sgZHVwbGljYXRpb24KK3ZvaWQqIENNU0VYUE9SVCBfY21zRHVwTWVtKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCB2b2lkKiBPcmcsIGNtc1VJbnQzMk51bWJlciBzaXplKQoreworICAgIHZvaWQqIHAgPSBGWE1FTV9EZWZhdWx0QWxsb2Moc2l6ZSk7CisgICAgbWVtbW92ZShwLCBPcmcsIHNpemUpOworICAgIHJldHVybiBwOworfQorCitfY21zTWVtUGx1Z2luQ2h1bmtUeXBlIF9jbXNNZW1QbHVnaW5DaHVuayA9IHtfY21zTWFsbG9jLCBfY21zTWFsbG9jWmVybywgX2Ntc0ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY21zUmVhbGxvYywgX2Ntc0NhbGxvYywgICAgX2Ntc0R1cE1lbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCit2b2lkIF9jbXNBbGxvY01lbVBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQoreworICAgIF9jbXNBc3NlcnQoY3R4ICE9IE5VTEwpOworCisgICAgaWYgKHNyYyAhPSBOVUxMKSB7CisKKyAgICAgICAgLy8gRHVwbGljYXRlCisgICAgICAgIGN0eCAtPmNodW5rc1tNZW1QbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsIHNyYyAtPmNodW5rc1tNZW1QbHVnaW5dLCBzaXplb2YoX2Ntc01lbVBsdWdpbkNodW5rVHlwZSkpOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICAvLyBUbyByZXNldCBpdCwgd2UgdXNlIHRoZSBkZWZhdWx0IGFsbG9jYXRvcnMsIHdoaWNoIGNhbm5vdCBiZSBvdmVycmlkZW4KKyAgICAgICAgY3R4IC0+Y2h1bmtzW01lbVBsdWdpbl0gPSAmY3R4IC0+RGVmYXVsdE1lbW9yeU1hbmFnZXI7CisgICAgfQorfQorCit2b2lkIF9jbXNJbnN0YWxsQWxsb2NGdW5jdGlvbnMoY21zUGx1Z2luTWVtSGFuZGxlciogUGx1Z2luLCBfY21zTWVtUGx1Z2luQ2h1bmtUeXBlKiBwdHIpCit7CisgICAgaWYgKFBsdWdpbiA9PSBOVUxMKSB7CisKKyAgICAgICAgbWVtY3B5KHB0ciwgJl9jbXNNZW1QbHVnaW5DaHVuaywgc2l6ZW9mKF9jbXNNZW1QbHVnaW5DaHVuaykpOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICBwdHIgLT5NYWxsb2NQdHIgID0gUGx1Z2luIC0+IE1hbGxvY1B0cjsKKyAgICAgICAgcHRyIC0+RnJlZVB0ciAgICA9IFBsdWdpbiAtPiBGcmVlUHRyOworICAgICAgICBwdHIgLT5SZWFsbG9jUHRyID0gUGx1Z2luIC0+IFJlYWxsb2NQdHI7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHdlIHJldmVydCB0byBkZWZhdWx0cworICAgICAgICBwdHIgLT5NYWxsb2NaZXJvUHRyPSBfY21zTWFsbG9jWmVybzsKKyAgICAgICAgcHRyIC0+Q2FsbG9jUHRyICAgID0gX2Ntc0NhbGxvYzsKKyAgICAgICAgcHRyIC0+RHVwUHRyICAgICAgID0gX2Ntc0R1cE1lbTsKKworICAgICAgICBpZiAoUGx1Z2luIC0+TWFsbG9jWmVyb1B0ciAhPSBOVUxMKSBwdHIgLT5NYWxsb2NaZXJvUHRyID0gUGx1Z2luIC0+IE1hbGxvY1plcm9QdHI7CisgICAgICAgIGlmIChQbHVnaW4gLT5DYWxsb2NQdHIgIT0gTlVMTCkgICAgIHB0ciAtPkNhbGxvY1B0ciAgICAgPSBQbHVnaW4gLT4gQ2FsbG9jUHRyOworICAgICAgICBpZiAoUGx1Z2luIC0+RHVwUHRyICE9IE5VTEwpICAgICAgICBwdHIgLT5EdXBQdHIgICAgICAgID0gUGx1Z2luIC0+IER1cFB0cjsKKworICAgIH0KK30KKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLy8gU3ViIGFsbG9jYXRpb24gdGFrZXMgY2FyZSBvZiBtYW55IHBvaW50ZXJzIG9mIHNtYWxsIHNpemUuIFRoZSBtZW1vcnkgYWxsb2NhdGVkIGluCisvLyB0aGlzIHdheSBoYXZlIGJlIGZyZWVkIGF0IG9uY2UuIE5leHQgZnVuY3Rpb24gYWxsb2NhdGVzIGEgc2luZ2xlIGNodW5rIGZvciBsaW5rZWQgbGlzdAorLy8gSSBwcmVmZXIgdGhpcyBtZXRob2Qgb3ZlciByZWFsbG9jIGR1ZSB0byB0aGUgYmlnIGlucGFjdCBvbiB4cHV0IHJlYWxsb2MgbWF5IGhhdmUgaWYKKy8vIG1lbW9yeSBpcyBiZWluZyBzd2FwcGVkIHRvIGRpc2suIFRoaXMgYXBwcm9hY2ggaXMgc2FmZXIgKGFsdGhvdWdoIHRoYXQgbWF5IG5vdCBiZSB0cnVlIG9uIGFsbCBwbGF0Zm9ybXMpCitzdGF0aWMKK19jbXNTdWJBbGxvY2F0b3JfY2h1bmsqIF9jbXNDcmVhdGVTdWJBbGxvY0NodW5rKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgSW5pdGlhbCkKK3sKKyAgICBfY21zU3ViQWxsb2NhdG9yX2NodW5rKiBjaHVuazsKKworICAgIC8vIDIwSyBieSBkZWZhdWx0CisgICAgaWYgKEluaXRpYWwgPT0gMCkKKyAgICAgICAgSW5pdGlhbCA9IDIwKjEwMjQ7CisKKyAgICAvLyBDcmVhdGUgdGhlIGNvbnRhaW5lcgorICAgIGNodW5rID0gKF9jbXNTdWJBbGxvY2F0b3JfY2h1bmsqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihfY21zU3ViQWxsb2NhdG9yX2NodW5rKSk7CisgICAgaWYgKGNodW5rID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgLy8gSW5pdGlhbGl6ZSB2YWx1ZXMKKyAgICBjaHVuayAtPkJsb2NrICAgICA9IChjbXNVSW50OE51bWJlciopIF9jbXNNYWxsb2MoQ29udGV4dElELCBJbml0aWFsKTsKKyAgICBpZiAoY2h1bmsgLT5CbG9jayA9PSBOVUxMKSB7CisKKyAgICAgICAgLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcKKyAgICAgICAgX2Ntc0ZyZWUoQ29udGV4dElELCBjaHVuayk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGNodW5rIC0+QmxvY2tTaXplID0gSW5pdGlhbDsKKyAgICBjaHVuayAtPlVzZWQgICAgICA9IDA7CisgICAgY2h1bmsgLT5uZXh0ICAgICAgPSBOVUxMOworCisgICAgcmV0dXJuIGNodW5rOworfQorCisvLyBUaGUgc3ViYWxsb2NhdGVkIGlzIG5vdGhpbmcgYnV0IGEgcG9pbnRlciB0byB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgbGlzdC4gV2UgYWxzbyBrZWVwCisvLyB0aGUgdGhyZWFkIElEIGluIHRoaXMgc3RydWN0dXJlLgorX2Ntc1N1YkFsbG9jYXRvciogX2Ntc0NyZWF0ZVN1YkFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgSW5pdGlhbCkKK3sKKyAgICBfY21zU3ViQWxsb2NhdG9yKiBzdWI7CisKKyAgICAvLyBDcmVhdGUgdGhlIGNvbnRhaW5lcgorICAgIHN1YiA9IChfY21zU3ViQWxsb2NhdG9yKikgX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBzaXplb2YoX2Ntc1N1YkFsbG9jYXRvcikpOworICAgIGlmIChzdWIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBzdWIgLT5Db250ZXh0SUQgPSBDb250ZXh0SUQ7CisKKyAgICBzdWIgLT5oID0gX2Ntc0NyZWF0ZVN1YkFsbG9jQ2h1bmsoQ29udGV4dElELCBJbml0aWFsKTsKKyAgICBpZiAoc3ViIC0+aCA9PSBOVUxMKSB7CisgICAgICAgIF9jbXNGcmVlKENvbnRleHRJRCwgc3ViKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHN1YjsKK30KKworCisvLyBHZXQgcmlkIG9mIHdob2xlIGxpbmtlZCBsaXN0Cit2b2lkIF9jbXNTdWJBbGxvY0Rlc3Ryb3koX2Ntc1N1YkFsbG9jYXRvciogc3ViKQoreworICAgIF9jbXNTdWJBbGxvY2F0b3JfY2h1bmsgKmNodW5rLCAqbjsKKworICAgIGZvciAoY2h1bmsgPSBzdWIgLT5oOyBjaHVuayAhPSBOVUxMOyBjaHVuayA9IG4pIHsKKworICAgICAgICBuID0gY2h1bmstPm5leHQ7CisgICAgICAgIGlmIChjaHVuay0+QmxvY2sgIT0gTlVMTCkgX2Ntc0ZyZWUoc3ViIC0+Q29udGV4dElELCBjaHVuay0+QmxvY2spOworICAgICAgICBfY21zRnJlZShzdWIgLT5Db250ZXh0SUQsIGNodW5rKTsKKyAgICB9CisKKyAgICAvLyBGcmVlIHRoZSBoZWFkZXIKKyAgICBfY21zRnJlZShzdWIgLT5Db250ZXh0SUQsIHN1Yik7Cit9CisKKworLy8gR2V0IGEgcG9pbnRlciB0byBzbWFsbCBtZW1vcnkgYmxvY2suCit2b2lkKiAgX2Ntc1N1YkFsbG9jKF9jbXNTdWJBbGxvY2F0b3IqIHN1YiwgY21zVUludDMyTnVtYmVyIHNpemUpCit7CisgICAgY21zVUludDMyTnVtYmVyIEZyZWUgPSBzdWIgLT4gaCAtPkJsb2NrU2l6ZSAtIHN1YiAtPiBoIC0+IFVzZWQ7CisgICAgY21zVUludDhOdW1iZXIqIHB0cjsKKworICAgIHNpemUgPSBfY21zQUxJR05NRU0oc2l6ZSk7CisKKyAgICAvLyBDaGVjayBmb3IgbWVtb3J5LiBJZiB0aGVyZSBpcyBubyByb29tLCBhbGxvY2F0ZSBhIG5ldyBjaHVuayBvZiBkb3VibGUgbWVtb3J5IHNpemUuCisgICAgaWYgKHNpemUgPiBGcmVlKSB7CisKKyAgICAgICAgX2Ntc1N1YkFsbG9jYXRvcl9jaHVuayogY2h1bms7CisgICAgICAgIGNtc1VJbnQzMk51bWJlciBuZXdTaXplOworCisgICAgICAgIG5ld1NpemUgPSBzdWIgLT4gaCAtPkJsb2NrU2l6ZSAqIDI7CisgICAgICAgIGlmIChuZXdTaXplIDwgc2l6ZSkgbmV3U2l6ZSA9IHNpemU7CisKKyAgICAgICAgY2h1bmsgPSBfY21zQ3JlYXRlU3ViQWxsb2NDaHVuayhzdWIgLT4gQ29udGV4dElELCBuZXdTaXplKTsKKyAgICAgICAgaWYgKGNodW5rID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgICAgIC8vIExpbmsgbGlzdAorICAgICAgICBjaHVuayAtPm5leHQgPSBzdWIgLT5oOworICAgICAgICBzdWIgLT5oICAgID0gY2h1bms7CisKKyAgICB9CisKKyAgICBwdHIgPSAgc3ViIC0+IGggLT5CbG9jayArIHN1YiAtPiBoIC0+VXNlZDsKKyAgICBzdWIgLT4gaCAtPiBVc2VkICs9IHNpemU7CisKKyAgICByZXR1cm4gKHZvaWQqKSBwdHI7Cit9CisKKy8vIER1cGxpY2F0ZSBpbiBwb29sCit2b2lkKiBfY21zU3ViQWxsb2NEdXAoX2Ntc1N1YkFsbG9jYXRvciogcywgY29uc3Qgdm9pZCAqcHRyLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSkKK3sKKyAgICB2b2lkICpOZXdQdHI7CisgICAgCisgICAgLy8gRHVwIG9mIG51bGwgcG9pbnRlciBpcyBhbHNvIE5VTEwKKyAgICBpZiAocHRyID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgTmV3UHRyID0gX2Ntc1N1YkFsbG9jKHMsIHNpemUpOworCisgICAgaWYgKHB0ciAhPSBOVUxMICYmIE5ld1B0ciAhPSBOVUxMKSB7CisgICAgICAgIG1lbWNweShOZXdQdHIsIHB0ciwgc2l6ZSk7CisgICAgfQorCisgICAgcmV0dXJuIE5ld1B0cjsKK30KKworCisKKy8vIEVycm9yIGxvZ2dpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8vIFRoZXJlIGlzIG5vIGVycm9yIGhhbmRsaW5nIGF0IGFsbC4gV2hlbiBhIGZ1bmN0aW9uIGZhaWxzLCBpdCByZXR1cm5zIHByb3BlciB2YWx1ZS4KKy8vIEZvciBleGFtcGxlLCBhbGwgY3JlYXRlIGZ1bmN0aW9ucyBkb2VzIHJldHVybiBOVUxMIG9uIGZhaWx1cmUuIE90aGVyIHJldHVybiBGQUxTRQorLy8gSXQgbWF5IGJlIGludGVyZXN0aW5nLCBmb3IgdGhlIGRldmVsb3BlciwgdG8ga25vdyB3aHkgdGhlIGZ1bmN0aW9uIGlzIGZhaWxpbmcuCisvLyBmb3IgdGhhdCByZWFzb24sIGxjbXMyIGRvZXMgb2ZmZXIgYSBsb2dnaW5nIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIGRvZXMgcmVjaXZlCisvLyBhIEVOR0xJU0ggc3RyaW5nIHdpdGggc29tZSBjbHVlcyBvbiB3aGF0IGlzIGdvaW5nIHdyb25nLiBZb3UgY2FuIHNob3cgdGhpcworLy8gaW5mbyB0byB0aGUgZW5kIHVzZXIsIG9yIGp1c3QgY3JlYXRlIHNvbWUgc29ydCBvZiBsb2cuCisvLyBUaGUgbG9nZ2luZyBmdW5jdGlvbiBzaG91bGQgTk9UIHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbSwgYXMgdGhpcyBvYnZpb3VzbHkgY2FuIGxlYXZlCisvLyByZXNvdXJjZXMuIEl0IGlzIHRoZSBwcm9ncmFtbWVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gY2hlY2sgZWFjaCBmdW5jdGlvbiByZXR1cm4gY29kZQorLy8gdG8gbWFrZSBzdXJlIGl0IGRpZG4ndCBmYWlsLgorCisvLyBFcnJvciBtZXNzYWdlcyBhcmUgbGltaXRlZCB0byBNQVhfRVJST1JfTUVTU0FHRV9MRU4KKworI2RlZmluZSBNQVhfRVJST1JfTUVTU0FHRV9MRU4gICAxMDI0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaGlzIGlzIG91ciBkZWZhdWx0IGxvZyBlcnJvcgorc3RhdGljIHZvaWQgRGVmYXVsdExvZ0Vycm9ySGFuZGxlckZ1bmN0aW9uKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgRXJyb3JDb2RlLCBjb25zdCBjaGFyICpUZXh0KTsKKworLy8gQ29udGV4dDAgc3RvcmFnZSwgd2hpY2ggaXMgZ2xvYmFsCitfY21zTG9nRXJyb3JDaHVua1R5cGUgX2Ntc0xvZ0Vycm9yQ2h1bmsgPSB7IERlZmF1bHRMb2dFcnJvckhhbmRsZXJGdW5jdGlvbiB9OworCisvLyBBbGxvY2F0ZXMgYW5kIGluaXRzIGVycm9yIGxvZ2dlciBjb250YWluZXIgZm9yIGEgZ2l2ZW4gY29udGV4dC4gSWYgc3JjIGlzIE5VTEwsIG9ubHkgaW5pdGlhbGl6ZXMgdGhlIHZhbHVlCisvLyB0byB0aGUgZGVmYXVsdC4gT3RoZXJ3aXNlLCBpdCBkdXBsaWNhdGVzIHRoZSB2YWx1ZS4gVGhlIGludGVyZmFjZSBpcyBzdGFuZGFyZCBhY3Jvc3MgYWxsIGNvbnRleHQgY2xpZW50cwordm9pZCBfY21zQWxsb2NMb2dFcnJvckNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQoreyAgICAKKyAgICBzdGF0aWMgX2Ntc0xvZ0Vycm9yQ2h1bmtUeXBlIExvZ0Vycm9yQ2h1bmsgPSB7IERlZmF1bHRMb2dFcnJvckhhbmRsZXJGdW5jdGlvbiB9OworICAgIHZvaWQqIGZyb207CisgICAgIAorICAgICBpZiAoc3JjICE9IE5VTEwpIHsKKyAgICAgICAgZnJvbSA9IHNyYyAtPmNodW5rc1tMb2dnZXJdOyAgICAgICAKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgZnJvbSA9ICZMb2dFcnJvckNodW5rOworICAgIH0KKyAgICAKKyAgICBjdHggLT5jaHVua3NbTG9nZ2VyXSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCBmcm9tLCBzaXplb2YoX2Ntc0xvZ0Vycm9yQ2h1bmtUeXBlKSk7ICAgCit9CisKKy8vIFRoZSBkZWZhdWx0IGVycm9yIGxvZ2dlciBkb2VzIG5vdGhpbmcuCitzdGF0aWMKK3ZvaWQgRGVmYXVsdExvZ0Vycm9ySGFuZGxlckZ1bmN0aW9uKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgRXJyb3JDb2RlLCBjb25zdCBjaGFyICpUZXh0KQoreworICAgIC8vIGZwcmludGYoc3RkZXJyLCAiW2xjbXNdOiAlc1xuIiwgVGV4dCk7CisgICAgLy8gZmZsdXNoKHN0ZGVycik7CisKKyAgICAgY21zVU5VU0VEX1BBUkFNRVRFUihDb250ZXh0SUQpOworICAgICBjbXNVTlVTRURfUEFSQU1FVEVSKEVycm9yQ29kZSk7CisgICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoVGV4dCk7Cit9CisKKy8vIENoYW5nZSBsb2cgZXJyb3IsIGNvbnRleHQgYmFzZWQKK3ZvaWQgQ01TRVhQT1JUIGNtc1NldExvZ0Vycm9ySGFuZGxlclRIUihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zTG9nRXJyb3JIYW5kbGVyRnVuY3Rpb24gRm4pCit7CisgICAgX2Ntc0xvZ0Vycm9yQ2h1bmtUeXBlKiBsaGcgPSAoX2Ntc0xvZ0Vycm9yQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIExvZ2dlcik7CisKKyAgICBpZiAobGhnICE9IE5VTEwpIHsKKworICAgICAgICBpZiAoRm4gPT0gTlVMTCkKKyAgICAgICAgICAgIGxoZyAtPiBMb2dFcnJvckhhbmRsZXIgPSBEZWZhdWx0TG9nRXJyb3JIYW5kbGVyRnVuY3Rpb247CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxoZyAtPiBMb2dFcnJvckhhbmRsZXIgPSBGbjsKKyAgICB9Cit9CisKKy8vIENoYW5nZSBsb2cgZXJyb3IsIGxlZ2FjeQordm9pZCBDTVNFWFBPUlQgY21zU2V0TG9nRXJyb3JIYW5kbGVyKGNtc0xvZ0Vycm9ySGFuZGxlckZ1bmN0aW9uIEZuKQoreworICAgIGNtc1NldExvZ0Vycm9ySGFuZGxlclRIUihOVUxMLCBGbik7ICAgIAorfQorCisvLyBMb2cgYW4gZXJyb3IKKy8vIEVycm9yVGV4dCBpcyBhIHRleHQgaG9sZGluZyBhbiBlbmdsaXNoIGRlc2NyaXB0aW9uIG9mIGVycm9yLgordm9pZCBDTVNFWFBPUlQgY21zU2lnbmFsRXJyb3IoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBFcnJvckNvZGUsIGNvbnN0IGNoYXIgKkVycm9yVGV4dCwgLi4uKQoreworICAgIHZhX2xpc3QgYXJnczsKKyAgICBjaGFyIEJ1ZmZlcltNQVhfRVJST1JfTUVTU0FHRV9MRU5dOworICAgIF9jbXNMb2dFcnJvckNodW5rVHlwZSogbGhnOworCisKKyAgICB2YV9zdGFydChhcmdzLCBFcnJvclRleHQpOworICAgIHZzbnByaW50ZihCdWZmZXIsIE1BWF9FUlJPUl9NRVNTQUdFX0xFTi0xLCBFcnJvclRleHQsIGFyZ3MpOworICAgIHZhX2VuZChhcmdzKTsKKworICAgIC8vIENoZWNrIGZvciB0aGUgY29udGV4dCwgaWYgc3BlY2lmaWVkIGdvIHRoZXJlLiBJZiBub3QsIGdvIGZvciB0aGUgZ2xvYmFsCisgICAgbGhnID0gKF9jbXNMb2dFcnJvckNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBMb2dnZXIpOworICAgIGlmIChsaGcgLT5Mb2dFcnJvckhhbmRsZXIpIHsKKyAgICAgICAgbGhnIC0+TG9nRXJyb3JIYW5kbGVyKENvbnRleHRJRCwgRXJyb3JDb2RlLCBCdWZmZXIpOworICAgIH0gICAKK30KKworLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBwcmludCBzaWduYXR1cmVzCit2b2lkIF9jbXNUYWdTaWduYXR1cmUyU3RyaW5nKGNoYXIgU3RyaW5nWzVdLCBjbXNUYWdTaWduYXR1cmUgc2lnKQoreworICAgIGNtc1VJbnQzMk51bWJlciBiZTsKKworICAgIC8vIENvbnZlcnQgdG8gYmlnIGVuZGlhbgorICAgIGJlID0gX2Ntc0FkanVzdEVuZGlhbmVzczMyKChjbXNVSW50MzJOdW1iZXIpIHNpZyk7CisKKyAgICAvLyBNb3ZlIGNoYXJzCisgICAgbWVtbW92ZShTdHJpbmcsICZiZSwgNCk7CisKKyAgICAvLyBNYWtlIHN1cmUgb2YgdGVybWluYXRvcgorICAgIFN0cmluZ1s0XSA9IDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitzdGF0aWMKK3ZvaWQqIGRlZk10eENyZWF0ZShjbXNDb250ZXh0IGlkKQoreworICAgIF9jbXNNdXRleCogcHRyX211dGV4ID0gKF9jbXNNdXRleCopIF9jbXNNYWxsb2MoaWQsIHNpemVvZihfY21zTXV0ZXgpKTsKKyAgICBfY21zSW5pdE11dGV4UHJpbWl0aXZlKHB0cl9tdXRleCk7CisgICAgcmV0dXJuICh2b2lkKikgcHRyX211dGV4OyAgIAorfQorCitzdGF0aWMKK3ZvaWQgZGVmTXR4RGVzdHJveShjbXNDb250ZXh0IGlkLCB2b2lkKiBtdHgpCit7CisgICAgX2Ntc0Rlc3Ryb3lNdXRleFByaW1pdGl2ZSgoX2Ntc011dGV4ICopIG10eCk7IAorICAgIF9jbXNGcmVlKGlkLCBtdHgpOworfQorCitzdGF0aWMKK2Ntc0Jvb2wgZGVmTXR4TG9jayhjbXNDb250ZXh0IGlkLCB2b2lkKiBtdHgpCit7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpZCk7CisgICAgcmV0dXJuIF9jbXNMb2NrUHJpbWl0aXZlKChfY21zTXV0ZXggKikgbXR4KSA9PSAwOyAgICAgCit9CisKK3N0YXRpYwordm9pZCBkZWZNdHhVbmxvY2soY21zQ29udGV4dCBpZCwgdm9pZCogbXR4KQoreworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaWQpOworICAgIF9jbXNVbmxvY2tQcmltaXRpdmUoKF9jbXNNdXRleCAqKSBtdHgpOyAKK30KKworCisKKy8vIFBvaW50ZXJzIHRvIG1lbW9yeSBtYW5hZ2VyIGZ1bmN0aW9ucyBpbiBDb250ZXh0MAorX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlIF9jbXNNdXRleFBsdWdpbkNodW5rID0geyBkZWZNdHhDcmVhdGUsIGRlZk10eERlc3Ryb3ksIGRlZk10eExvY2ssIGRlZk10eFVubG9jayB9OworCisvLyBBbGxvY2F0ZSBhbmQgaW5pdCBtdXRleCBjb250YWluZXIuCit2b2lkIF9jbXNBbGxvY011dGV4UGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCit7CisgICAgc3RhdGljIF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSBNdXRleENodW5rID0ge2RlZk10eENyZWF0ZSwgZGVmTXR4RGVzdHJveSwgZGVmTXR4TG9jaywgZGVmTXR4VW5sb2NrIH07CisgICAgdm9pZCogZnJvbTsKKyAgICAgCisgICAgIGlmIChzcmMgIT0gTlVMTCkgeworICAgICAgICBmcm9tID0gc3JjIC0+Y2h1bmtzW011dGV4UGx1Z2luXTsgICAgICAgCisgICAgfQorICAgIGVsc2UgeworICAgICAgIGZyb20gPSAmTXV0ZXhDaHVuazsKKyAgICB9CisgICAgCisgICAgY3R4IC0+Y2h1bmtzW011dGV4UGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCBmcm9tLCBzaXplb2YoX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlKSk7ICAgCit9CisKKy8vIFJlZ2lzdGVyIG5ldyB3YXlzIHRvIHRyYW5zZm9ybQorY21zQm9vbCAgX2Ntc1JlZ2lzdGVyTXV0ZXhQbHVnaW4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BsdWdpbkJhc2UqIERhdGEpCit7CisgICAgY21zUGx1Z2luTXV0ZXgqIFBsdWdpbiA9IChjbXNQbHVnaW5NdXRleCopIERhdGE7CisgICAgX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlKiBjdHggPSAoIF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBNdXRleFBsdWdpbik7CisKKyAgICBpZiAoRGF0YSA9PSBOVUxMKSB7CisKKyAgICAgICAgLy8gTm8gbG9jayByb3V0aW5lcworICAgICAgICBjdHgtPkNyZWF0ZU11dGV4UHRyID0gTlVMTDsgCisgICAgICAgIGN0eC0+RGVzdHJveU11dGV4UHRyID0gTlVMTDsgCisgICAgICAgIGN0eC0+TG9ja011dGV4UHRyID0gTlVMTDsKKyAgICAgICAgY3R4IC0+VW5sb2NrTXV0ZXhQdHIgPSBOVUxMOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICAvLyBGYWN0b3J5IGNhbGxiYWNrIGlzIHJlcXVpcmVkCisgICAgaWYgKFBsdWdpbiAtPkNyZWF0ZU11dGV4UHRyID09IE5VTEwgfHwgUGx1Z2luIC0+RGVzdHJveU11dGV4UHRyID09IE5VTEwgfHwgCisgICAgICAgIFBsdWdpbiAtPkxvY2tNdXRleFB0ciA9PSBOVUxMIHx8IFBsdWdpbiAtPlVubG9ja011dGV4UHRyID09IE5VTEwpIHJldHVybiBGQUxTRTsKKworCisgICAgY3R4LT5DcmVhdGVNdXRleFB0ciAgPSBQbHVnaW4tPkNyZWF0ZU11dGV4UHRyOworICAgIGN0eC0+RGVzdHJveU11dGV4UHRyID0gUGx1Z2luIC0+RGVzdHJveU11dGV4UHRyOworICAgIGN0eCAtPkxvY2tNdXRleFB0ciAgID0gUGx1Z2luIC0+TG9ja011dGV4UHRyOworICAgIGN0eCAtPlVubG9ja011dGV4UHRyID0gUGx1Z2luIC0+VW5sb2NrTXV0ZXhQdHI7CisKKyAgICAvLyBBbGwgaXMgb2sKKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gR2VuZXJpYyBNdXRleCBmbnMKK3ZvaWQqIENNU0VYUE9SVCBfY21zQ3JlYXRlTXV0ZXgoY21zQ29udGV4dCBDb250ZXh0SUQpCit7CisgICAgX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlKiBwdHIgPSAoX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIE11dGV4UGx1Z2luKTsKKworICAgIGlmIChwdHIgLT5DcmVhdGVNdXRleFB0ciA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIHJldHVybiBwdHIgLT5DcmVhdGVNdXRleFB0cihDb250ZXh0SUQpOworfQorCit2b2lkIENNU0VYUE9SVCBfY21zRGVzdHJveU11dGV4KGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBtdHgpCit7CisgICAgX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlKiBwdHIgPSAoX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIE11dGV4UGx1Z2luKTsKKworICAgIGlmIChwdHIgLT5EZXN0cm95TXV0ZXhQdHIgIT0gTlVMTCkgeworCisgICAgICAgIHB0ciAtPkRlc3Ryb3lNdXRleFB0cihDb250ZXh0SUQsIG10eCk7CisgICAgfQorfQorCitjbXNCb29sIENNU0VYUE9SVCBfY21zTG9ja011dGV4KGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBtdHgpCit7CisgICAgX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlKiBwdHIgPSAoX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIE11dGV4UGx1Z2luKTsKKworICAgIGlmIChwdHIgLT5Mb2NrTXV0ZXhQdHIgPT0gTlVMTCkgcmV0dXJuIFRSVUU7CisKKyAgICByZXR1cm4gcHRyIC0+TG9ja011dGV4UHRyKENvbnRleHRJRCwgbXR4KTsKK30KKwordm9pZCBDTVNFWFBPUlQgX2Ntc1VubG9ja011dGV4KGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBtdHgpCit7CisgICAgX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlKiBwdHIgPSAoX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIE11dGV4UGx1Z2luKTsKKworICAgIGlmIChwdHIgLT5VbmxvY2tNdXRleFB0ciAhPSBOVUxMKSB7CisKKyAgICAgICAgcHRyIC0+VW5sb2NrTXV0ZXhQdHIoQ29udGV4dElELCBtdHgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2dhbW1hLmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNnYW1tYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMzZjZjQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNnYW1tYS5jCkBAIC0wLDAgKzEsMTI5MyBAQAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCisvLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTMgTWFydGkgTWFyaWEgU2FndWVyCisvLworLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisvLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisvLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisvLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKy8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQorLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKy8vCisvLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisvLworLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisvLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KKy8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisvLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCisvLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisvLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKy8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworI2luY2x1ZGUgImxjbXMyX2ludGVybmFsLmgiCisKKy8vIFRvbmUgY3VydmVzIGFyZSBwb3dlcmZ1bCBjb25zdHJ1Y3RzIHRoYXQgY2FuIGNvbnRhaW4gY3VydmVzIHNwZWNpZmllZCBpbiBkaXZlcnNlIHdheXMuCisvLyBUaGUgY3VydmUgaXMgc3RvcmVkIGluIHNlZ21lbnRzLCB3aGVyZSBlYWNoIHNlZ21lbnQgY2FuIGJlIHNhbXBsZWQgb3Igc3BlY2lmaWVkIGJ5IHBhcmFtZXRlcnMuCisvLyBhIDE2LmJpdCBzaW1wbGlmaWNhdGlvbiBvZiB0aGUgKndob2xlKiBjdXJ2ZSBpcyBrZXB0IGZvciBvcHRpbWl6YXRpb24gcHVycG9zZXMuIEZvciBmbG9hdCBvcGVyYXRpb24sCisvLyBlYWNoIHNlZ21lbnQgaXMgZXZhbHVhdGVkIHNlcGFyYXRlbHkuIFBsdWctaW5zIG1heSBiZSB1c2VkIHRvIGRlZmluZSBuZXcgcGFyYW1ldHJpYyBzY2hlbWVzLAorLy8gZWFjaCBwbHVnLWluIG1heSBkZWZpbmUgdXAgdG8gTUFYX1RZUEVTX0lOX0xDTVNfUExVR0lOIGZ1bmN0aW9ucyB0eXBlcy4gRm9yIGRlZmluaW5nIGEgZnVuY3Rpb24sCisvLyB0aGUgcGx1Zy1pbiBzaG91bGQgcHJvdmlkZSB0aGUgdHlwZSBpZCwgaG93IG1hbnkgcGFyYW1ldGVycyBlYWNoIHR5cGUgaGFzLCBhbmQgYSBwb2ludGVyIHRvCisvLyBhIHByb2NlZHVyZSB0aGF0IGV2YWx1YXRlcyB0aGUgZnVuY3Rpb24uIEluIHRoZSBjYXNlIG9mIHJldmVyc2UgZXZhbHVhdGlvbiwgdGhlIGV2YWx1YXRvciB3aWxsCisvLyBiZSBjYWxsZWQgd2l0aCB0aGUgdHlwZSBpZCBhcyBhIG5lZ2F0aXZlIHZhbHVlLCBhbmQgYSBzYW1wbGVkIHZlcnNpb24gb2YgdGhlIHJldmVyc2VkIGN1cnZlCisvLyB3aWxsIGJlIGJ1aWx0LgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbgorLy8gTWF4aW0gbnVtYmVyIG9mIG5vZGVzCisjZGVmaW5lIE1BWF9OT0RFU19JTl9DVVJWRSAgIDQwOTcKKyNkZWZpbmUgTUlOVVNfSU5GICAgICAgICAgICAgKC0xRTIyRikKKyNkZWZpbmUgUExVU19JTkYgICAgICAgICAgICAgKCsxRTIyRikKKworLy8gVGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHBhcmFtZXRyaWMgY3VydmVzCit0eXBlZGVmIHN0cnVjdCBfY21zUGFyYW1ldHJpY0N1cnZlc0NvbGxlY3Rpb25fc3QgeworCisgICAgaW50IG5GdW5jdGlvbnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBzdXBwb3J0ZWQgZnVuY3Rpb25zIGluIHRoaXMgY2h1bmsKKyAgICBpbnQgRnVuY3Rpb25UeXBlc1tNQVhfVFlQRVNfSU5fTENNU19QTFVHSU5dOyAgICAgICAgLy8gVGhlIGlkZW50aWZpY2F0aW9uIHR5cGVzCisgICAgaW50IFBhcmFtZXRlckNvdW50W01BWF9UWVBFU19JTl9MQ01TX1BMVUdJTl07ICAgICAgIC8vIE51bWJlciBvZiBwYXJhbWV0ZXJzIGZvciBlYWNoIGZ1bmN0aW9uCisgICAgY21zUGFyYW1ldHJpY0N1cnZlRXZhbHVhdG9yICAgIEV2YWx1YXRvcjsgICAgICAgICAgIC8vIFRoZSBldmFsdWF0b3IKKworICAgIHN0cnVjdCBfY21zUGFyYW1ldHJpY0N1cnZlc0NvbGxlY3Rpb25fc3QqIE5leHQ7IC8vIE5leHQgaW4gbGlzdAorCit9IF9jbXNQYXJhbWV0cmljQ3VydmVzQ29sbGVjdGlvbjsKKworLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCAoYnVpbHQtaW4pIGV2YWx1YXRvcgorc3RhdGljIGNtc0Zsb2F0NjROdW1iZXIgRGVmYXVsdEV2YWxQYXJhbWV0cmljRm4oY21zSW50MzJOdW1iZXIgVHlwZSwgY29uc3QgY21zRmxvYXQ2NE51bWJlciBQYXJhbXNbXSwgY21zRmxvYXQ2NE51bWJlciBSKTsKKworLy8gVGhlIGJ1aWx0LWluIGxpc3QKK3N0YXRpYyBfY21zUGFyYW1ldHJpY0N1cnZlc0NvbGxlY3Rpb24gRGVmYXVsdEN1cnZlcyA9IHsKKyAgICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAjIG9mIGN1cnZlIHR5cGVzCisgICAgeyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCAxMDggfSwgICAgLy8gUGFyYW1ldHJpYyBjdXJ2ZSBJRAorICAgIHsgMSwgMywgNCwgNSwgNywgNCwgNSwgNSwgMSB9LCAgICAgIC8vIFBhcmFtZXRlcnMgYnkgdHlwZQorICAgIERlZmF1bHRFdmFsUGFyYW1ldHJpY0ZuLCAgICAgICAgICAgIC8vIEV2YWx1YXRvcgorICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5leHQgaW4gY2hhaW4KK307CisKKy8vIER1cGxpY2F0ZXMgdGhlIHpvbmUgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIHBsdWctaW4gaW4gdGhlIG5ldyBjb250ZXh0CitzdGF0aWMKK3ZvaWQgRHVwUGx1Z2luQ3VydmVzTGlzdChzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCit7CisgICBfY21zQ3VydmVzUGx1Z2luQ2h1bmtUeXBlIG5ld0hlYWQgPSB7IE5VTEwgfTsKKyAgIF9jbXNQYXJhbWV0cmljQ3VydmVzQ29sbGVjdGlvbiogIGVudHJ5OworICAgX2Ntc1BhcmFtZXRyaWNDdXJ2ZXNDb2xsZWN0aW9uKiAgQW50ZXJpb3IgPSBOVUxMOworICAgX2Ntc0N1cnZlc1BsdWdpbkNodW5rVHlwZSogaGVhZCA9IChfY21zQ3VydmVzUGx1Z2luQ2h1bmtUeXBlKikgc3JjLT5jaHVua3NbQ3VydmVzUGx1Z2luXTsKKworICAgIF9jbXNBc3NlcnQoaGVhZCAhPSBOVUxMKTsKKworICAgIC8vIFdhbGsgdGhlIGxpc3QgY29weWluZyBhbGwgbm9kZXMKKyAgIGZvciAoZW50cnkgPSBoZWFkLT5QYXJhbWV0cmljQ3VydmVzOworICAgICAgICBlbnRyeSAhPSBOVUxMOworICAgICAgICBlbnRyeSA9IGVudHJ5IC0+TmV4dCkgeworCisgICAgICAgICAgICBfY21zUGFyYW1ldHJpY0N1cnZlc0NvbGxlY3Rpb24gKm5ld0VudHJ5ID0gKCBfY21zUGFyYW1ldHJpY0N1cnZlc0NvbGxlY3Rpb24gKikgX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsIGVudHJ5LCBzaXplb2YoX2Ntc1BhcmFtZXRyaWNDdXJ2ZXNDb2xsZWN0aW9uKSk7CisgICAKKyAgICAgICAgICAgIGlmIChuZXdFbnRyeSA9PSBOVUxMKSAKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8ga2VlcCB0aGUgbGlua2VkIGxpc3Qgb3JkZXIsIHNvIHRoaXMgaXMgYSBsaXR0bGUgYml0IHRyaWNreQorICAgICAgICAgICAgbmV3RW50cnkgLT4gTmV4dCA9IE5VTEw7CisgICAgICAgICAgICBpZiAoQW50ZXJpb3IpCisgICAgICAgICAgICAgICAgQW50ZXJpb3IgLT4gTmV4dCA9IG5ld0VudHJ5OworICAgICAKKyAgICAgICAgICAgIEFudGVyaW9yID0gbmV3RW50cnk7CisKKyAgICAgICAgICAgIGlmIChuZXdIZWFkLlBhcmFtZXRyaWNDdXJ2ZXMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBuZXdIZWFkLlBhcmFtZXRyaWNDdXJ2ZXMgPSBuZXdFbnRyeTsKKyAgICB9CisKKyAgY3R4IC0+Y2h1bmtzW0N1cnZlc1BsdWdpbl0gPSBfY21zU3ViQWxsb2NEdXAoY3R4LT5NZW1Qb29sLCAmbmV3SGVhZCwgc2l6ZW9mKF9jbXNDdXJ2ZXNQbHVnaW5DaHVua1R5cGUpKTsKK30KKworLy8gVGhlIGFsbG9jYXRvciBoYXZlIHRvIGZvbGxvdyB0aGUgY2hhaW4KK3ZvaWQgX2Ntc0FsbG9jQ3VydmVzUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQoreworICAgIF9jbXNBc3NlcnQoY3R4ICE9IE5VTEwpOworCisgICAgaWYgKHNyYyAhPSBOVUxMKSB7CisKKyAgICAgICAgLy8gQ29weSBhbGwgbGlua2VkIGxpc3QKKyAgICAgICBEdXBQbHVnaW5DdXJ2ZXNMaXN0KGN0eCwgc3JjKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN0YXRpYyBfY21zQ3VydmVzUGx1Z2luQ2h1bmtUeXBlIEN1cnZlc1BsdWdpbkNodW5rID0geyBOVUxMIH07CisgICAgICAgIGN0eCAtPmNodW5rc1tDdXJ2ZXNQbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsICZDdXJ2ZXNQbHVnaW5DaHVuaywgc2l6ZW9mKF9jbXNDdXJ2ZXNQbHVnaW5DaHVua1R5cGUpKTsKKyAgICB9Cit9CisKKworLy8gVGhlIGxpbmtlZCBsaXN0IGhlYWQKK19jbXNDdXJ2ZXNQbHVnaW5DaHVua1R5cGUgX2Ntc0N1cnZlc1BsdWdpbkNodW5rID0geyBOVUxMIH07CisKKy8vIEFzIGEgd2F5IHRvIGluc3RhbGwgbmV3IHBhcmFtZXRyaWMgY3VydmVzCitjbXNCb29sIF9jbXNSZWdpc3RlclBhcmFtZXRyaWNDdXJ2ZXNQbHVnaW4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BsdWdpbkJhc2UqIERhdGEpCit7CisgICAgX2Ntc0N1cnZlc1BsdWdpbkNodW5rVHlwZSogY3R4ID0gKCBfY21zQ3VydmVzUGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIEN1cnZlc1BsdWdpbik7CisgICAgY21zUGx1Z2luUGFyYW1ldHJpY0N1cnZlcyogUGx1Z2luID0gKGNtc1BsdWdpblBhcmFtZXRyaWNDdXJ2ZXMqKSBEYXRhOworICAgIF9jbXNQYXJhbWV0cmljQ3VydmVzQ29sbGVjdGlvbiogZmw7CisKKyAgICBpZiAoRGF0YSA9PSBOVUxMKSB7CisKKyAgICAgICAgICBjdHggLT4gUGFyYW1ldHJpY0N1cnZlcyA9ICBOVUxMOworICAgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIGZsID0gKF9jbXNQYXJhbWV0cmljQ3VydmVzQ29sbGVjdGlvbiopIF9jbXNQbHVnaW5NYWxsb2MoQ29udGV4dElELCBzaXplb2YoX2Ntc1BhcmFtZXRyaWNDdXJ2ZXNDb2xsZWN0aW9uKSk7CisgICAgaWYgKGZsID09IE5VTEwpIHJldHVybiBGQUxTRTsKKworICAgIC8vIENvcHkgdGhlIHBhcmFtZXRlcnMKKyAgICBmbCAtPkV2YWx1YXRvciAgPSBQbHVnaW4gLT5FdmFsdWF0b3I7CisgICAgZmwgLT5uRnVuY3Rpb25zID0gUGx1Z2luIC0+bkZ1bmN0aW9uczsKKworICAgIC8vIE1ha2Ugc3VyZSBubyBtZW0gb3ZlcndyaXRlcworICAgIGlmIChmbCAtPm5GdW5jdGlvbnMgPiBNQVhfVFlQRVNfSU5fTENNU19QTFVHSU4pCisgICAgICAgIGZsIC0+bkZ1bmN0aW9ucyA9IE1BWF9UWVBFU19JTl9MQ01TX1BMVUdJTjsKKworICAgIC8vIENvcHkgdGhlIGRhdGEKKyAgICBtZW1tb3ZlKGZsLT5GdW5jdGlvblR5cGVzLCAgUGx1Z2luIC0+RnVuY3Rpb25UeXBlcywgICBmbC0+bkZ1bmN0aW9ucyAqIHNpemVvZihjbXNVSW50MzJOdW1iZXIpKTsKKyAgICBtZW1tb3ZlKGZsLT5QYXJhbWV0ZXJDb3VudCwgUGx1Z2luIC0+UGFyYW1ldGVyQ291bnQsICBmbC0+bkZ1bmN0aW9ucyAqIHNpemVvZihjbXNVSW50MzJOdW1iZXIpKTsKKworICAgIC8vIEtlZXAgbGlua2VkIGxpc3QKKyAgICBmbCAtPk5leHQgPSBjdHgtPlBhcmFtZXRyaWNDdXJ2ZXM7CisgICAgY3R4LT5QYXJhbWV0cmljQ3VydmVzID0gZmw7CisKKyAgICAvLyBBbGwgaXMgb2sKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLyBTZWFyY2ggaW4gdHlwZSBsaXN0LCByZXR1cm4gcG9zaXRpb24gb3IgLTEgaWYgbm90IGZvdW5kCitzdGF0aWMKK2ludCBJc0luU2V0KGludCBUeXBlLCBfY21zUGFyYW1ldHJpY0N1cnZlc0NvbGxlY3Rpb24qIGMpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGk9MDsgaSA8IGMgLT5uRnVuY3Rpb25zOyBpKyspCisgICAgICAgIGlmIChhYnMoVHlwZSkgPT0gYyAtPkZ1bmN0aW9uVHlwZXNbaV0pIHJldHVybiBpOworCisgICAgcmV0dXJuIC0xOworfQorCisKKy8vIFNlYXJjaCBmb3IgdGhlIGNvbGxlY3Rpb24gd2hpY2ggY29udGFpbnMgYSBzcGVjaWZpYyB0eXBlCitzdGF0aWMKK19jbXNQYXJhbWV0cmljQ3VydmVzQ29sbGVjdGlvbiAqR2V0UGFyYW1ldHJpY0N1cnZlQnlUeXBlKGNtc0NvbnRleHQgQ29udGV4dElELCBpbnQgVHlwZSwgaW50KiBpbmRleCkKK3sKKyAgICBfY21zUGFyYW1ldHJpY0N1cnZlc0NvbGxlY3Rpb24qIGM7CisgICAgaW50IFBvc2l0aW9uOworICAgIF9jbXNDdXJ2ZXNQbHVnaW5DaHVua1R5cGUqIGN0eCA9ICggX2Ntc0N1cnZlc1BsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBDdXJ2ZXNQbHVnaW4pOworCisgICAgZm9yIChjID0gY3R4LT5QYXJhbWV0cmljQ3VydmVzOyBjICE9IE5VTEw7IGMgPSBjIC0+TmV4dCkgeworCisgICAgICAgIFBvc2l0aW9uID0gSXNJblNldChUeXBlLCBjKTsKKworICAgICAgICBpZiAoUG9zaXRpb24gIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChpbmRleCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICppbmRleCA9IFBvc2l0aW9uOworICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gSWYgbm9uZSBmb3VuZCwgcmV2ZXJ0IGZvciBkZWZhdWx0cworICAgIGZvciAoYyA9ICZEZWZhdWx0Q3VydmVzOyBjICE9IE5VTEw7IGMgPSBjIC0+TmV4dCkgeworCisgICAgICAgIFBvc2l0aW9uID0gSXNJblNldChUeXBlLCBjKTsKKworICAgICAgICBpZiAoUG9zaXRpb24gIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChpbmRleCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICppbmRleCA9IFBvc2l0aW9uOworICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gTG93IGxldmVsIGFsbG9jYXRlLCB3aGljaCB0YWtlcyBjYXJlIG9mIG1lbW9yeSBkZXRhaWxzLiBuRW50cmllcyBtYXkgYmUgemVybywgYW5kIGluIHRoaXMgY2FzZQorLy8gbm8gb3B0aW1hdGlvbiBjdXJ2ZSBpcyBjb21wdXRlZC4gblNlZ21lbnRzIG1heSBhbHNvIGJlIHplcm8gaW4gdGhlIGludmVyc2UgY2FzZSwgd2hlcmUgb25seSB0aGUKKy8vIG9wdGltaXphdGlvbiBjdXJ2ZSBpcyBnaXZlbi4gQm90aCBmZWF0dXJlcyBzaW11bHRhbmVvdXNseSBpcyBhbiBlcnJvcgorc3RhdGljCitjbXNUb25lQ3VydmUqIEFsbG9jYXRlVG9uZUN1cnZlU3RydWN0KGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNJbnQzMk51bWJlciBuRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSW50MzJOdW1iZXIgblNlZ21lbnRzLCBjb25zdCBjbXNDdXJ2ZVNlZ21lbnQqIFNlZ21lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNVSW50MTZOdW1iZXIqIFZhbHVlcykKK3sKKyAgICBjbXNUb25lQ3VydmUqIHA7CisgICAgaW50IGk7CisKKyAgICAvLyBXZSBhbGxvdyBodWdlIHRhYmxlcywgd2hpY2ggYXJlIHRoZW4gcmVzdHJpY3RlZCBmb3Igc21vb3RoaW5nIG9wZXJhdGlvbnMKKyAgICBpZiAobkVudHJpZXMgPiA2NTUzMCB8fCBuRW50cmllcyA8IDApIHsKKyAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgIkNvdWxkbid0IGNyZWF0ZSB0b25lIGN1cnZlIG9mIG1vcmUgdGhhbiA2NTUzMCBlbnRyaWVzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChuRW50cmllcyA8PSAwICYmIG5TZWdtZW50cyA8PSAwKSB7CisgICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfUkFOR0UsICJDb3VsZG4ndCBjcmVhdGUgdG9uZSBjdXJ2ZSB3aXRoIHplcm8gc2VnbWVudHMgYW5kIG5vIHRhYmxlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIEFsbG9jYXRlIGFsbCByZXF1aXJlZCBwb2ludGVycywgZXRjLgorICAgIHAgPSAoY21zVG9uZUN1cnZlKikgX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBzaXplb2YoY21zVG9uZUN1cnZlKSk7CisgICAgaWYgKCFwKSByZXR1cm4gTlVMTDsKKworICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlcmUgYXJlIG5vIHNlZ21lbnRzCisgICAgaWYgKG5TZWdtZW50cyA8PSAwKSB7CisgICAgICAgIHAgLT5TZWdtZW50cyA9IE5VTEw7CisgICAgICAgIHAgLT5FdmFscyA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwIC0+U2VnbWVudHMgPSAoY21zQ3VydmVTZWdtZW50KikgX2Ntc0NhbGxvYyhDb250ZXh0SUQsIG5TZWdtZW50cywgc2l6ZW9mKGNtc0N1cnZlU2VnbWVudCkpOworICAgICAgICBpZiAocCAtPlNlZ21lbnRzID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgICAgICAgcCAtPkV2YWxzICAgID0gKGNtc1BhcmFtZXRyaWNDdXJ2ZUV2YWx1YXRvciopIF9jbXNDYWxsb2MoQ29udGV4dElELCBuU2VnbWVudHMsIHNpemVvZihjbXNQYXJhbWV0cmljQ3VydmVFdmFsdWF0b3IpKTsKKyAgICAgICAgaWYgKHAgLT5FdmFscyA9PSBOVUxMKSBnb3RvIEVycm9yOworICAgIH0KKworICAgIHAgLT4gblNlZ21lbnRzID0gblNlZ21lbnRzOworCisgICAgLy8gVGhpcyAxNi1iaXQgdGFibGUgY29udGFpbnMgYSBsaW1pdGVkIHByZWNpc2lvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2hvbGUgY3VydmUgYW5kIGlzIGtlcHQgZm9yCisgICAgLy8gaW5jcmVhc2luZyB4cHV0IG9uIGNlcnRhaW4gb3BlcmF0aW9ucy4KKyAgICBpZiAobkVudHJpZXMgPD0gMCkgeworICAgICAgICBwIC0+VGFibGUxNiA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgeworICAgICAgIHAgLT5UYWJsZTE2ID0gKGNtc1VJbnQxNk51bWJlciopICBfY21zQ2FsbG9jKENvbnRleHRJRCwgbkVudHJpZXMsIHNpemVvZihjbXNVSW50MTZOdW1iZXIpKTsKKyAgICAgICBpZiAocCAtPlRhYmxlMTYgPT0gTlVMTCkgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICBwIC0+IG5FbnRyaWVzICA9IG5FbnRyaWVzOworCisgICAgLy8gSW5pdGlhbGl6ZSBtZW1iZXJzIGlmIHJlcXVlc3RlZAorICAgIGlmIChWYWx1ZXMgIT0gTlVMTCAmJiAobkVudHJpZXMgPiAwKSkgeworCisgICAgICAgIGZvciAoaT0wOyBpIDwgbkVudHJpZXM7IGkrKykKKyAgICAgICAgICAgIHAgLT5UYWJsZTE2W2ldID0gVmFsdWVzW2ldOworICAgIH0KKworICAgIC8vIEluaXRpYWxpemUgdGhlIHNlZ21lbnRzIHN0dWZmLiBUaGUgZXZhbHVhdG9yIGZvciBlYWNoIHNlZ21lbnQgaXMgbG9jYXRlZCBhbmQgYSBwb2ludGVyIHRvIGl0CisgICAgLy8gaXMgcGxhY2VkIGluIGFkdmFuY2UgdG8gbWF4aW1pemUgcGVyZm9ybWFuY2UuCisgICAgaWYgKFNlZ21lbnRzICE9IE5VTEwgJiYgKG5TZWdtZW50cyA+IDApKSB7CisKKyAgICAgICAgX2Ntc1BhcmFtZXRyaWNDdXJ2ZXNDb2xsZWN0aW9uICpjOworCisgICAgICAgIHAgLT5TZWdJbnRlcnAgPSAoY21zSW50ZXJwUGFyYW1zKiopIF9jbXNDYWxsb2MoQ29udGV4dElELCBuU2VnbWVudHMsIHNpemVvZihjbXNJbnRlcnBQYXJhbXMqKSk7CisgICAgICAgIGlmIChwIC0+U2VnSW50ZXJwID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgICAgICAgZm9yIChpPTA7IGk8IG5TZWdtZW50czsgaSsrKSB7CisKKyAgICAgICAgICAgIC8vIFR5cGUgMCBpcyBhIHNwZWNpYWwgbWFya2VyIGZvciB0YWJsZS1iYXNlZCBjdXJ2ZXMKKyAgICAgICAgICAgIGlmIChTZWdtZW50c1tpXS5UeXBlID09IDApCisgICAgICAgICAgICAgICAgcCAtPlNlZ0ludGVycFtpXSA9IF9jbXNDb21wdXRlSW50ZXJwUGFyYW1zKENvbnRleHRJRCwgU2VnbWVudHNbaV0ubkdyaWRQb2ludHMsIDEsIDEsIE5VTEwsIENNU19MRVJQX0ZMQUdTX0ZMT0FUKTsKKworICAgICAgICAgICAgbWVtbW92ZSgmcCAtPlNlZ21lbnRzW2ldLCAmU2VnbWVudHNbaV0sIHNpemVvZihjbXNDdXJ2ZVNlZ21lbnQpKTsKKworICAgICAgICAgICAgaWYgKFNlZ21lbnRzW2ldLlR5cGUgPT0gMCAmJiBTZWdtZW50c1tpXS5TYW1wbGVkUG9pbnRzICE9IE5VTEwpCisgICAgICAgICAgICAgICAgcCAtPlNlZ21lbnRzW2ldLlNhbXBsZWRQb2ludHMgPSAoY21zRmxvYXQzMk51bWJlciopIF9jbXNEdXBNZW0oQ29udGV4dElELCBTZWdtZW50c1tpXS5TYW1wbGVkUG9pbnRzLCBzaXplb2YoY21zRmxvYXQzMk51bWJlcikgKiBTZWdtZW50c1tpXS5uR3JpZFBvaW50cyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcCAtPlNlZ21lbnRzW2ldLlNhbXBsZWRQb2ludHMgPSBOVUxMOworCisKKyAgICAgICAgICAgIGMgPSBHZXRQYXJhbWV0cmljQ3VydmVCeVR5cGUoQ29udGV4dElELCBTZWdtZW50c1tpXS5UeXBlLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChjICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIHAgLT5FdmFsc1tpXSA9IGMgLT5FdmFsdWF0b3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwIC0+SW50ZXJwUGFyYW1zID0gX2Ntc0NvbXB1dGVJbnRlcnBQYXJhbXMoQ29udGV4dElELCBwIC0+bkVudHJpZXMsIDEsIDEsIHAtPlRhYmxlMTYsIENNU19MRVJQX0ZMQUdTXzE2QklUUyk7CisgICAgaWYgKHAtPkludGVycFBhcmFtcyAhPSBOVUxMKQorICAgICAgICByZXR1cm4gcDsKKworRXJyb3I6CisgICAgaWYgKHAgLT4gU2VnbWVudHMpIF9jbXNGcmVlKENvbnRleHRJRCwgcCAtPlNlZ21lbnRzKTsKKyAgICBpZiAocCAtPiBFdmFscykgX2Ntc0ZyZWUoQ29udGV4dElELCBwIC0+IEV2YWxzKTsKKyAgICBpZiAocCAtPlRhYmxlMTYpIF9jbXNGcmVlKENvbnRleHRJRCwgcCAtPlRhYmxlMTYpOworICAgIF9jbXNGcmVlKENvbnRleHRJRCwgcCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLy8gUGFyYW1ldHJpYyBGbiB1c2luZyBmbG9hdGluZyBwb2ludAorc3RhdGljCitjbXNGbG9hdDY0TnVtYmVyIERlZmF1bHRFdmFsUGFyYW1ldHJpY0ZuKGNtc0ludDMyTnVtYmVyIFR5cGUsIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIgUGFyYW1zW10sIGNtc0Zsb2F0NjROdW1iZXIgUikKK3sKKyAgICBjbXNGbG9hdDY0TnVtYmVyIGUsIFZhbCwgZGlzYzsKKworICAgIHN3aXRjaCAoVHlwZSkgeworCisgICAvLyBYID0gWSBeIEdhbW1hCisgICAgY2FzZSAxOgorICAgICAgICBpZiAoUiA8IDApIHsKKworICAgICAgICAgICAgaWYgKGZhYnMoUGFyYW1zWzBdIC0gMS4wKSA8IE1BVFJJWF9ERVRfVE9MRVJBTkNFKQorICAgICAgICAgICAgICAgIFZhbCA9IFI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgVmFsID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBWYWwgPSBwb3coUiwgUGFyYW1zWzBdKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAvLyBUeXBlIDEgUmV2ZXJzZWQ6IFggPSBZIF4xL2dhbW1hCisgICAgY2FzZSAtMToKKyAgICAgICAgIGlmIChSIDwgMCkgeworCisgICAgICAgICAgICBpZiAoZmFicyhQYXJhbXNbMF0gLSAxLjApIDwgTUFUUklYX0RFVF9UT0xFUkFOQ0UpCisgICAgICAgICAgICAgICAgVmFsID0gUjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBWYWwgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFZhbCA9IHBvdyhSLCAxL1BhcmFtc1swXSk7CisgICAgICAgIGJyZWFrOworCisgICAgLy8gQ0lFIDEyMi0xOTY2CisgICAgLy8gWSA9IChhWCArIGIpXkdhbW1hICB8IFggPj0gLWIvYQorICAgIC8vIFkgPSAwICAgICAgICAgICAgICAgfCBlbHNlCisgICAgY2FzZSAyOgorICAgICAgICBkaXNjID0gLVBhcmFtc1syXSAvIFBhcmFtc1sxXTsKKworICAgICAgICBpZiAoUiA+PSBkaXNjICkgeworCisgICAgICAgICAgICBlID0gUGFyYW1zWzFdKlIgKyBQYXJhbXNbMl07CisKKyAgICAgICAgICAgIGlmIChlID4gMCkKKyAgICAgICAgICAgICAgICBWYWwgPSBwb3coZSwgUGFyYW1zWzBdKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBWYWwgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFZhbCA9IDA7CisgICAgICAgIGJyZWFrOworCisgICAgIC8vIFR5cGUgMiBSZXZlcnNlZAorICAgICAvLyBYID0gKFkgXjEvZyAgLSBiKSAvIGEKKyAgICAgY2FzZSAtMjoKKyAgICAgICAgIGlmIChSIDwgMCkKKyAgICAgICAgICAgICBWYWwgPSAwOworICAgICAgICAgZWxzZQorICAgICAgICAgICAgIFZhbCA9IChwb3coUiwgMS4wL1BhcmFtc1swXSkgLSBQYXJhbXNbMl0pIC8gUGFyYW1zWzFdOworCisgICAgICAgICBpZiAoVmFsIDwgMCkKKyAgICAgICAgICAgICAgVmFsID0gMDsKKyAgICAgICAgIGJyZWFrOworCisKKyAgICAvLyBJRUMgNjE5NjYtMworICAgIC8vIFkgPSAoYVggKyBiKV5HYW1tYSB8IFggPD0gLWIvYQorICAgIC8vIFkgPSBjICAgICAgICAgICAgICB8IGVsc2UKKyAgICBjYXNlIDM6CisgICAgICAgIGRpc2MgPSAtUGFyYW1zWzJdIC8gUGFyYW1zWzFdOworICAgICAgICBpZiAoZGlzYyA8IDApCisgICAgICAgICAgICBkaXNjID0gMDsKKworICAgICAgICBpZiAoUiA+PSBkaXNjKSB7CisKKyAgICAgICAgICAgIGUgPSBQYXJhbXNbMV0qUiArIFBhcmFtc1syXTsKKworICAgICAgICAgICAgaWYgKGUgPiAwKQorICAgICAgICAgICAgICAgIFZhbCA9IHBvdyhlLCBQYXJhbXNbMF0pICsgUGFyYW1zWzNdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFZhbCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgVmFsID0gUGFyYW1zWzNdOworICAgICAgICBicmVhazsKKworCisgICAgLy8gVHlwZSAzIHJldmVyc2VkCisgICAgLy8gWD0oKFktYyleMS9nIC0gYikvYSAgICAgIHwgKFk+PWMpCisgICAgLy8gWD0tYi9hICAgICAgICAgICAgICAgICAgIHwgKFk8YykKKyAgICBjYXNlIC0zOgorICAgICAgICBpZiAoUiA+PSBQYXJhbXNbM10pICB7CisKKyAgICAgICAgICAgIGUgPSBSIC0gUGFyYW1zWzNdOworCisgICAgICAgICAgICBpZiAoZSA+IDApCisgICAgICAgICAgICAgICAgVmFsID0gKHBvdyhlLCAxL1BhcmFtc1swXSkgLSBQYXJhbXNbMl0pIC8gUGFyYW1zWzFdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFZhbCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBWYWwgPSAtUGFyYW1zWzJdIC8gUGFyYW1zWzFdOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisKKyAgICAvLyBJRUMgNjE5NjYtMi4xIChzUkdCKQorICAgIC8vIFkgPSAoYVggKyBiKV5HYW1tYSB8IFggPj0gZAorICAgIC8vIFkgPSBjWCAgICAgICAgICAgICB8IFggPCBkCisgICAgY2FzZSA0OgorICAgICAgICBpZiAoUiA+PSBQYXJhbXNbNF0pIHsKKworICAgICAgICAgICAgZSA9IFBhcmFtc1sxXSpSICsgUGFyYW1zWzJdOworCisgICAgICAgICAgICBpZiAoZSA+IDApCisgICAgICAgICAgICAgICAgVmFsID0gcG93KGUsIFBhcmFtc1swXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgVmFsID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBWYWwgPSBSICogUGFyYW1zWzNdOworICAgICAgICBicmVhazsKKworICAgIC8vIFR5cGUgNCByZXZlcnNlZAorICAgIC8vIFg9KChZXjEvZy1iKS9hKSAgICB8IFkgPj0gKGFkK2IpXmcKKyAgICAvLyBYPVkvYyAgICAgICAgICAgICAgfCBZPCAoYWQrYileZworICAgIGNhc2UgLTQ6CisgICAgICAgIGUgPSBQYXJhbXNbMV0gKiBQYXJhbXNbNF0gKyBQYXJhbXNbMl07CisgICAgICAgIGlmIChlIDwgMCkKKyAgICAgICAgICAgIGRpc2MgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBkaXNjID0gcG93KGUsIFBhcmFtc1swXSk7CisKKyAgICAgICAgaWYgKFIgPj0gZGlzYykgeworCisgICAgICAgICAgICBWYWwgPSAocG93KFIsIDEuMC9QYXJhbXNbMF0pIC0gUGFyYW1zWzJdKSAvIFBhcmFtc1sxXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIFZhbCA9IFIgLyBQYXJhbXNbM107CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKworICAgIC8vIFkgPSAoYVggKyBiKV5HYW1tYSArIGUgfCBYID49IGQKKyAgICAvLyBZID0gY1ggKyBmICAgICAgICAgICAgIHwgWCA8IGQKKyAgICBjYXNlIDU6CisgICAgICAgIGlmIChSID49IFBhcmFtc1s0XSkgeworCisgICAgICAgICAgICBlID0gUGFyYW1zWzFdKlIgKyBQYXJhbXNbMl07CisKKyAgICAgICAgICAgIGlmIChlID4gMCkKKyAgICAgICAgICAgICAgICBWYWwgPSBwb3coZSwgUGFyYW1zWzBdKSArIFBhcmFtc1s1XTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBWYWwgPSBQYXJhbXNbNV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgVmFsID0gUipQYXJhbXNbM10gKyBQYXJhbXNbNl07CisgICAgICAgIGJyZWFrOworCisKKyAgICAvLyBSZXZlcnNlZCB0eXBlIDUKKyAgICAvLyBYPSgoWS1lKTEvZy1iKS9hICAgfCBZID49KGFkK2IpXmcrZSksIGNkK2YKKyAgICAvLyBYPShZLWYpL2MgICAgICAgICAgfCBlbHNlCisgICAgY2FzZSAtNToKKworICAgICAgICBkaXNjID0gUGFyYW1zWzNdICogUGFyYW1zWzRdICsgUGFyYW1zWzZdOworICAgICAgICBpZiAoUiA+PSBkaXNjKSB7CisKKyAgICAgICAgICAgIGUgPSBSIC0gUGFyYW1zWzVdOworICAgICAgICAgICAgaWYgKGUgPCAwKQorICAgICAgICAgICAgICAgIFZhbCA9IDA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgVmFsID0gKHBvdyhlLCAxLjAvUGFyYW1zWzBdKSAtIFBhcmFtc1syXSkgLyBQYXJhbXNbMV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBWYWwgPSAoUiAtIFBhcmFtc1s2XSkgLyBQYXJhbXNbM107CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKworICAgIC8vIFR5cGVzIDYsNyw4IGNvbWVzIGZyb20gc2VnbWVudGVkIGN1cnZlcyBhcyBkZXNjcmliZWQgaW4gSUNDU3BlY1JldmlzaW9uXzAyXzExXzA2X0Zsb2F0LnBkZgorICAgIC8vIFR5cGUgNiBpcyBiYXNpY2FsbHkgaWRlbnRpY2FsIHRvIHR5cGUgNSB3aXRob3V0IGQKKworICAgIC8vIFkgPSAoYSAqIFggKyBiKSBeIEdhbW1hICsgYworICAgIGNhc2UgNjoKKyAgICAgICAgZSA9IFBhcmFtc1sxXSpSICsgUGFyYW1zWzJdOworCisgICAgICAgIGlmIChlIDwgMCkKKyAgICAgICAgICAgIFZhbCA9IFBhcmFtc1szXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgVmFsID0gcG93KGUsIFBhcmFtc1swXSkgKyBQYXJhbXNbM107CisgICAgICAgIGJyZWFrOworCisgICAgLy8gKChZIC0gYykgXjEvR2FtbWEgLSBiKSAvIGEKKyAgICBjYXNlIC02OgorICAgICAgICBlID0gUiAtIFBhcmFtc1szXTsKKyAgICAgICAgaWYgKGUgPCAwKQorICAgICAgICAgICAgVmFsID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICBWYWwgPSAocG93KGUsIDEuMC9QYXJhbXNbMF0pIC0gUGFyYW1zWzJdKSAvIFBhcmFtc1sxXTsKKyAgICAgICAgYnJlYWs7CisKKworICAgIC8vIFkgPSBhICogbG9nIChiICogWF5HYW1tYSArIGMpICsgZAorICAgIGNhc2UgNzoKKworICAgICAgIGUgPSBQYXJhbXNbMl0gKiBwb3coUiwgUGFyYW1zWzBdKSArIFBhcmFtc1szXTsKKyAgICAgICBpZiAoZSA8PSAwKQorICAgICAgICAgICBWYWwgPSBQYXJhbXNbNF07CisgICAgICAgZWxzZQorICAgICAgICAgICBWYWwgPSBQYXJhbXNbMV0qbG9nMTAoZSkgKyBQYXJhbXNbNF07CisgICAgICAgYnJlYWs7CisKKyAgICAvLyAoWSAtIGQpIC8gYSA9IGxvZyhiICogWCBeR2FtbWEgKyBjKQorICAgIC8vIHBvdygxMCwgKFktZCkgLyBhKSA9IGIgKiBYIF5HYW1tYSArIGMKKyAgICAvLyBwb3coKHBvdygxMCwgKFktZCkgLyBhKSAtIGMpIC8gYiwgMS9nKSA9IFgKKyAgICBjYXNlIC03OgorICAgICAgIFZhbCA9IHBvdygocG93KDEwLjAsIChSLVBhcmFtc1s0XSkgLyBQYXJhbXNbMV0pIC0gUGFyYW1zWzNdKSAvIFBhcmFtc1syXSwgMS4wIC8gUGFyYW1zWzBdKTsKKyAgICAgICBicmVhazsKKworCisgICAvL1kgPSBhICogYl4oYypYK2QpICsgZQorICAgY2FzZSA4OgorICAgICAgIFZhbCA9IChQYXJhbXNbMF0gKiBwb3coUGFyYW1zWzFdLCBQYXJhbXNbMl0gKiBSICsgUGFyYW1zWzNdKSArIFBhcmFtc1s0XSk7CisgICAgICAgYnJlYWs7CisKKworICAgLy8gWSA9IChsb2coKHktZSkgLyBhKSAvIGxvZyhiKSAtIGQgKSAvIGMKKyAgIC8vIGE9MCwgYj0xLCBjPTIsIGQ9MywgZT00LAorICAgY2FzZSAtODoKKworICAgICAgIGRpc2MgPSBSIC0gUGFyYW1zWzRdOworICAgICAgIGlmIChkaXNjIDwgMCkgVmFsID0gMDsKKyAgICAgICBlbHNlCisgICAgICAgICAgIFZhbCA9IChsb2coZGlzYyAvIFBhcmFtc1swXSkgLyBsb2coUGFyYW1zWzFdKSAtIFBhcmFtc1szXSkgLyBQYXJhbXNbMl07CisgICAgICAgYnJlYWs7CisKKyAgIC8vIFMtU2hhcGVkOiAoMSAtICgxLXgpXjEvZyleMS9nCisgICBjYXNlIDEwODoKKyAgICAgIFZhbCA9IHBvdygxLjAgLSBwb3coMSAtIFIsIDEvUGFyYW1zWzBdKSwgMS9QYXJhbXNbMF0pOworICAgICAgYnJlYWs7CisKKyAgICAvLyB5ID0gKDEgLSAoMS14KV4xL2cpXjEvZworICAgIC8vIHleZyA9ICgxIC0gKDEteCleMS9nKQorICAgIC8vIDEgLSB5XmcgPSAoMS14KV4xL2cKKyAgICAvLyAoMSAtIHleZyleZyA9IDEgLSB4CisgICAgLy8gMSAtICgxIC0geV5nKV5nCisgICAgY2FzZSAtMTA4OgorICAgICAgICBWYWwgPSAxIC0gcG93KDEgLSBwb3coUiwgUGFyYW1zWzBdKSwgUGFyYW1zWzBdKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICAvLyBVbnN1cHBvcnRlZCBwYXJhbWV0cmljIGN1cnZlLiBTaG91bGQgbmV2ZXIgcmVhY2ggaGVyZQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gVmFsOworfQorCisvLyBFdmFsdWF0ZSBhIHNlZ21lbnRlZCBmdW5jdGlvbiBmb3IgYSBzaW5nbGUgdmFsdWUuIFJldHVybiAtMSBpZiBubyB2YWxpZCBzZWdtZW50IGZvdW5kIC4KKy8vIElmIGZuIHR5cGUgaXMgMCwgcGVyZm9ybSBhbiBpbnRlcnBvbGF0aW9uIG9uIHRoZSB0YWJsZQorc3RhdGljCitjbXNGbG9hdDY0TnVtYmVyIEV2YWxTZWdtZW50ZWRGbihjb25zdCBjbXNUb25lQ3VydmUgKmcsIGNtc0Zsb2F0NjROdW1iZXIgUikKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IGcgLT5uU2VnbWVudHMtMTsgaSA+PSAwIDsgLS1pKSB7CisKKyAgICAgICAgLy8gQ2hlY2sgZm9yIGRvbWFpbgorICAgICAgICBpZiAoKFIgPiBnIC0+U2VnbWVudHNbaV0ueDApICYmIChSIDw9IGcgLT5TZWdtZW50c1tpXS54MSkpIHsKKworICAgICAgICAgICAgLy8gVHlwZSA9PSAwIG1lYW5zIHNlZ21lbnQgaXMgc2FtcGxlZAorICAgICAgICAgICAgaWYgKGcgLT5TZWdtZW50c1tpXS5UeXBlID09IDApIHsKKworICAgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgUjEgPSAoY21zRmxvYXQzMk51bWJlcikgKFIgLSBnIC0+U2VnbWVudHNbaV0ueDApIC8gKGcgLT5TZWdtZW50c1tpXS54MSAtIGcgLT5TZWdtZW50c1tpXS54MCk7CisgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciBPdXQ7CisKKyAgICAgICAgICAgICAgICAvLyBTZXR1cCB0aGUgdGFibGUgKFRPRE86IGNsZWFuIHRoYXQpCisgICAgICAgICAgICAgICAgZyAtPlNlZ0ludGVycFtpXS0+IFRhYmxlID0gZyAtPlNlZ21lbnRzW2ldLlNhbXBsZWRQb2ludHM7CisKKyAgICAgICAgICAgICAgICBnIC0+U2VnSW50ZXJwW2ldIC0+IEludGVycG9sYXRpb24uTGVycEZsb2F0KCZSMSwgJk91dCwgZyAtPlNlZ0ludGVycFtpXSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gT3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBnIC0+RXZhbHNbaV0oZy0+U2VnbWVudHNbaV0uVHlwZSwgZyAtPlNlZ21lbnRzW2ldLlBhcmFtcywgUik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTUlOVVNfSU5GOworfQorCisvLyBBY2Nlc3MgdG8gZXN0aW1hdGVkIGxvdy1yZXMgdGFibGUKK2Ntc1VJbnQzMk51bWJlciBDTVNFWFBPUlQgY21zR2V0VG9uZUN1cnZlRXN0aW1hdGVkVGFibGVFbnRyaWVzKGNvbnN0IGNtc1RvbmVDdXJ2ZSogdCkKK3sKKyAgICBfY21zQXNzZXJ0KHQgIT0gTlVMTCk7CisgICAgcmV0dXJuIHQgLT5uRW50cmllczsKK30KKworY29uc3QgY21zVUludDE2TnVtYmVyKiBDTVNFWFBPUlQgY21zR2V0VG9uZUN1cnZlRXN0aW1hdGVkVGFibGUoY29uc3QgY21zVG9uZUN1cnZlKiB0KQoreworICAgIF9jbXNBc3NlcnQodCAhPSBOVUxMKTsKKyAgICByZXR1cm4gdCAtPlRhYmxlMTY7Cit9CisKKworLy8gQ3JlYXRlIGFuIGVtcHR5IGdhbW1hIGN1cnZlLCBieSB1c2luZyB0YWJsZXMuIFRoaXMgc3BlY2lmaWVzIG9ubHkgdGhlIGxpbWl0ZWQtcHJlY2lzaW9uIHBhcnQsIGFuZCBsZWF2ZXMgdGhlCisvLyBmbG9hdGluZyBwb2ludCBkZXNjcmlwdGlvbiBlbXB0eS4KK2Ntc1RvbmVDdXJ2ZSogQ01TRVhQT1JUIGNtc0J1aWxkVGFidWxhdGVkVG9uZUN1cnZlMTYoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc0ludDMyTnVtYmVyIG5FbnRyaWVzLCBjb25zdCBjbXNVSW50MTZOdW1iZXIgVmFsdWVzW10pCit7CisgICAgcmV0dXJuIEFsbG9jYXRlVG9uZUN1cnZlU3RydWN0KENvbnRleHRJRCwgbkVudHJpZXMsIDAsIE5VTEwsIFZhbHVlcyk7Cit9CisKK3N0YXRpYworaW50IEVudHJpZXNCeUdhbW1hKGNtc0Zsb2F0NjROdW1iZXIgR2FtbWEpCit7CisgICAgaWYgKGZhYnMoR2FtbWEgLSAxLjApIDwgMC4wMDEpIHJldHVybiAyOworICAgIHJldHVybiA0MDk2OworfQorCisKKy8vIENyZWF0ZSBhIHNlZ21lbnRlZCBnYW1tYSwgZmlsbCB0aGUgdGFibGUKK2Ntc1RvbmVDdXJ2ZSogQ01TRVhQT1JUIGNtc0J1aWxkU2VnbWVudGVkVG9uZUN1cnZlKGNtc0NvbnRleHQgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSW50MzJOdW1iZXIgblNlZ21lbnRzLCBjb25zdCBjbXNDdXJ2ZVNlZ21lbnQgU2VnbWVudHNbXSkKK3sKKyAgICBpbnQgaTsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIFIsIFZhbDsKKyAgICBjbXNUb25lQ3VydmUqIGc7CisgICAgaW50IG5HcmlkUG9pbnRzID0gNDA5NjsKKworICAgIF9jbXNBc3NlcnQoU2VnbWVudHMgIT0gTlVMTCk7CisKKyAgICAvLyBPcHRpbWl6YXRpbiBmb3IgaWRlbnRpdHkgY3VydmVzLgorICAgIGlmIChuU2VnbWVudHMgPT0gMSAmJiBTZWdtZW50c1swXS5UeXBlID09IDEpIHsKKworICAgICAgICBuR3JpZFBvaW50cyA9IEVudHJpZXNCeUdhbW1hKFNlZ21lbnRzWzBdLlBhcmFtc1swXSk7CisgICAgfQorCisgICAgZyA9IEFsbG9jYXRlVG9uZUN1cnZlU3RydWN0KENvbnRleHRJRCwgbkdyaWRQb2ludHMsIG5TZWdtZW50cywgU2VnbWVudHMsIE5VTEwpOworICAgIGlmIChnID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgLy8gT25jZSB3ZSBoYXZlIHRoZSBmbG9hdGluZyBwb2ludCB2ZXJzaW9uLCB3ZSBjYW4gYXBwcm94aW1hdGUgYSAxNiBiaXQgdGFibGUgb2YgNDA5NiBlbnRyaWVzCisgICAgLy8gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuIFRoaXMgdGFibGUgd291bGQgbm9ybWFsbHkgbm90IGJlIHVzZWQgZXhjZXB0IG9uIDgvMTYgYml0cyB0cmFuc2Zvcm1zLgorICAgIGZvciAoaT0wOyBpIDwgbkdyaWRQb2ludHM7IGkrKykgeworCisgICAgICAgIFIgICA9IChjbXNGbG9hdDY0TnVtYmVyKSBpIC8gKG5HcmlkUG9pbnRzLTEpOworCisgICAgICAgIFZhbCA9IEV2YWxTZWdtZW50ZWRGbihnLCBSKTsKKworICAgICAgICAvLyBSb3VuZCBhbmQgc2F0dXJhdGUKKyAgICAgICAgZyAtPlRhYmxlMTZbaV0gPSBfY21zUXVpY2tTYXR1cmF0ZVdvcmQoVmFsICogNjU1MzUuMCk7CisgICAgfQorCisgICAgcmV0dXJuIGc7Cit9CisKKy8vIFVzZSBhIHNlZ21lbnRlZCBjdXJ2ZSB0byBzdG9yZSB0aGUgZmxvYXRpbmcgcG9pbnQgdGFibGUKK2Ntc1RvbmVDdXJ2ZSogQ01TRVhQT1JUIGNtc0J1aWxkVGFidWxhdGVkVG9uZUN1cnZlRmxvYXQoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBuRW50cmllcywgY29uc3QgY21zRmxvYXQzMk51bWJlciB2YWx1ZXNbXSkKK3sKKyAgICBjbXNDdXJ2ZVNlZ21lbnQgU2VnWzNdOworCisgICAgLy8gQSBzZWdtZW50ZWQgdG9uZSBjdXJ2ZSBzaG91bGQgaGF2ZSBmdW5jdGlvbiBzZWdtZW50cyBpbiB0aGUgZmlyc3QgYW5kIGxhc3QgcG9zaXRpb25zCisgICAgLy8gSW5pdGlhbGl6ZSBzZWdtZW50ZWQgY3VydmUgcGFydCB1cCB0byAwIHRvIGNvbnN0YW50IHZhbHVlID0gc2FtcGxlc1swXQorICAgIFNlZ1swXS54MCA9IE1JTlVTX0lORjsKKyAgICBTZWdbMF0ueDEgPSAwOworICAgIFNlZ1swXS5UeXBlID0gNjsKKworICAgIFNlZ1swXS5QYXJhbXNbMF0gPSAxOworICAgIFNlZ1swXS5QYXJhbXNbMV0gPSAwOworICAgIFNlZ1swXS5QYXJhbXNbMl0gPSAwOworICAgIFNlZ1swXS5QYXJhbXNbM10gPSB2YWx1ZXNbMF07CisgICAgU2VnWzBdLlBhcmFtc1s0XSA9IDA7CisKKyAgICAvLyBGcm9tIHplcm8gdG8gMQorICAgIFNlZ1sxXS54MCA9IDA7CisgICAgU2VnWzFdLngxID0gMS4wOworICAgIFNlZ1sxXS5UeXBlID0gMDsKKworICAgIFNlZ1sxXS5uR3JpZFBvaW50cyA9IG5FbnRyaWVzOworICAgIFNlZ1sxXS5TYW1wbGVkUG9pbnRzID0gKGNtc0Zsb2F0MzJOdW1iZXIqKSB2YWx1ZXM7CisKKyAgICAvLyBGaW5hbCBzZWdtZW50IGlzIGNvbnN0YW50ID0gbGFzdHNhbXBsZQorICAgIFNlZ1syXS54MCA9IDEuMDsKKyAgICBTZWdbMl0ueDEgPSBQTFVTX0lORjsKKyAgICBTZWdbMl0uVHlwZSA9IDY7CisgICAgCisgICAgU2VnWzJdLlBhcmFtc1swXSA9IDE7CisgICAgU2VnWzJdLlBhcmFtc1sxXSA9IDA7CisgICAgU2VnWzJdLlBhcmFtc1syXSA9IDA7CisgICAgU2VnWzJdLlBhcmFtc1szXSA9IHZhbHVlc1tuRW50cmllcy0xXTsKKyAgICBTZWdbMl0uUGFyYW1zWzRdID0gMDsKKyAgICAKKworICAgIHJldHVybiBjbXNCdWlsZFNlZ21lbnRlZFRvbmVDdXJ2ZShDb250ZXh0SUQsIDMsIFNlZyk7Cit9CisKKy8vIFBhcmFtZXRyaWMgY3VydmVzCisvLworLy8gUGFyYW1ldGVycyBnb2VzIGFzOiBDdXJ2ZSwgYSwgYiwgYywgZCwgZSwgZgorLy8gVHlwZSBpcyB0aGUgSUNDIHR5cGUgKzEKKy8vIGlmIHR5cGUgaXMgbmVnYXRpdmUsIHRoZW4gdGhlIGN1cnZlIGlzIGFuYWx5dGljYWx5IGludmVydGVkCitjbXNUb25lQ3VydmUqIENNU0VYUE9SVCBjbXNCdWlsZFBhcmFtZXRyaWNUb25lQ3VydmUoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc0ludDMyTnVtYmVyIFR5cGUsIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIgUGFyYW1zW10pCit7CisgICAgY21zQ3VydmVTZWdtZW50IFNlZzA7CisgICAgaW50IFBvcyA9IDA7CisgICAgY21zVUludDMyTnVtYmVyIHNpemU7CisgICAgX2Ntc1BhcmFtZXRyaWNDdXJ2ZXNDb2xsZWN0aW9uKiBjID0gR2V0UGFyYW1ldHJpY0N1cnZlQnlUeXBlKENvbnRleHRJRCwgVHlwZSwgJlBvcyk7CisKKyAgICBfY21zQXNzZXJ0KFBhcmFtcyAhPSBOVUxMKTsKKworICAgIGlmIChjID09IE5VTEwpIHsKKyAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIkludmFsaWQgcGFyYW1ldHJpYyBjdXJ2ZSB0eXBlICVkIiwgVHlwZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIG1lbXNldCgmU2VnMCwgMCwgc2l6ZW9mKFNlZzApKTsKKworICAgIFNlZzAueDAgICA9IE1JTlVTX0lORjsKKyAgICBTZWcwLngxICAgPSBQTFVTX0lORjsKKyAgICBTZWcwLlR5cGUgPSBUeXBlOworCisgICAgc2l6ZSA9IGMtPlBhcmFtZXRlckNvdW50W1Bvc10gKiBzaXplb2YoY21zRmxvYXQ2NE51bWJlcik7CisgICAgbWVtbW92ZShTZWcwLlBhcmFtcywgUGFyYW1zLCBzaXplKTsKKworICAgIHJldHVybiBjbXNCdWlsZFNlZ21lbnRlZFRvbmVDdXJ2ZShDb250ZXh0SUQsIDEsICZTZWcwKTsKK30KKworCisKKy8vIEJ1aWxkIGEgZ2FtbWEgdGFibGUgYmFzZWQgb24gZ2FtbWEgY29uc3RhbnQKK2Ntc1RvbmVDdXJ2ZSogQ01TRVhQT1JUIGNtc0J1aWxkR2FtbWEoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc0Zsb2F0NjROdW1iZXIgR2FtbWEpCit7CisgICAgcmV0dXJuIGNtc0J1aWxkUGFyYW1ldHJpY1RvbmVDdXJ2ZShDb250ZXh0SUQsIDEsICZHYW1tYSk7Cit9CisKKworLy8gRnJlZSBhbGwgbWVtb3J5IHRha2VuIGJ5IHRoZSBnYW1tYSBjdXJ2ZQordm9pZCBDTVNFWFBPUlQgY21zRnJlZVRvbmVDdXJ2ZShjbXNUb25lQ3VydmUqIEN1cnZlKQoreworICAgIGNtc0NvbnRleHQgQ29udGV4dElEOworCisgICAgLy8gYWRkZWQgYnkgWGlhb2NodWFuIExpdQorICAgIC8vIEN1cnZlLT5JbnRlcnBQYXJhbXMgbWF5IGJlIG51bGwKKyAgICBpZiAoQ3VydmUgPT0gTlVMTCB8fCBDdXJ2ZS0+SW50ZXJwUGFyYW1zID09IE5VTEwpIHJldHVybjsKKworICAgIENvbnRleHRJRCA9IEN1cnZlIC0+SW50ZXJwUGFyYW1zLT5Db250ZXh0SUQ7CisKKyAgICBfY21zRnJlZUludGVycFBhcmFtcyhDdXJ2ZSAtPkludGVycFBhcmFtcyk7CisgICAgQ3VydmUgLT5JbnRlcnBQYXJhbXMgPSBOVUxMOworCisgICAgaWYgKEN1cnZlIC0+IFRhYmxlMTYpIHsKKyAgICAgICAgX2Ntc0ZyZWUoQ29udGV4dElELCBDdXJ2ZSAtPlRhYmxlMTYpOworICAgICAgICBDdXJ2ZSAtPlRhYmxlMTYgPSBOVUxMOworICAgIH0KKworICAgIGlmIChDdXJ2ZSAtPlNlZ21lbnRzKSB7CisKKyAgICAgICAgY21zVUludDMyTnVtYmVyIGk7CisKKyAgICAgICAgZm9yIChpPTA7IGkgPCBDdXJ2ZSAtPm5TZWdtZW50czsgaSsrKSB7CisKKyAgICAgICAgICAgIGlmIChDdXJ2ZSAtPlNlZ21lbnRzW2ldLlNhbXBsZWRQb2ludHMpIHsKKyAgICAgICAgICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIEN1cnZlIC0+U2VnbWVudHNbaV0uU2FtcGxlZFBvaW50cyk7CisgICAgICAgICAgICAgICAgQ3VydmUgLT5TZWdtZW50c1tpXS5TYW1wbGVkUG9pbnRzID0gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEN1cnZlIC0+U2VnSW50ZXJwW2ldICE9IDApIHsKKyAgICAgICAgICAgICAgICBfY21zRnJlZUludGVycFBhcmFtcyhDdXJ2ZS0+U2VnSW50ZXJwW2ldKTsKKyAgICAgICAgICAgICAgICBDdXJ2ZS0+U2VnSW50ZXJwW2ldID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIF9jbXNGcmVlKENvbnRleHRJRCwgQ3VydmUgLT5TZWdtZW50cyk7CisgICAgICAgIEN1cnZlIC0+U2VnbWVudHMgPSBOVUxMOworICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIEN1cnZlIC0+U2VnSW50ZXJwKTsKKyAgICAgICAgQ3VydmUgLT5TZWdJbnRlcnAgPSBOVUxMOworICAgIH0KKworICAgIGlmIChDdXJ2ZSAtPiBFdmFscykgeworICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIEN1cnZlIC0+IEV2YWxzKTsKKyAgICAgICAgQ3VydmUgLT4gRXZhbHMgPSBOVUxMOworICAgIH0KKworICAgIGlmIChDdXJ2ZSkgeworICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIEN1cnZlKTsKKyAgICAgICAgQ3VydmUgPSBOVUxMOworICAgIH0KK30KKworLy8gVXRpbGl0eSBmdW5jdGlvbiwgZnJlZSAzIGdhbW1hIHRhYmxlcwordm9pZCBDTVNFWFBPUlQgY21zRnJlZVRvbmVDdXJ2ZVRyaXBsZShjbXNUb25lQ3VydmUqIEN1cnZlWzNdKQoreworCisgICAgX2Ntc0Fzc2VydChDdXJ2ZSAhPSBOVUxMKTsKKworICAgIGlmIChDdXJ2ZVswXSAhPSBOVUxMKSBjbXNGcmVlVG9uZUN1cnZlKEN1cnZlWzBdKTsKKyAgICBpZiAoQ3VydmVbMV0gIT0gTlVMTCkgY21zRnJlZVRvbmVDdXJ2ZShDdXJ2ZVsxXSk7CisgICAgaWYgKEN1cnZlWzJdICE9IE5VTEwpIGNtc0ZyZWVUb25lQ3VydmUoQ3VydmVbMl0pOworCisgICAgQ3VydmVbMF0gPSBDdXJ2ZVsxXSA9IEN1cnZlWzJdID0gTlVMTDsKK30KKworCisvLyBEdXBsaWNhdGUgYSBnYW1tYSB0YWJsZQorY21zVG9uZUN1cnZlKiBDTVNFWFBPUlQgY21zRHVwVG9uZUN1cnZlKGNvbnN0IGNtc1RvbmVDdXJ2ZSogSW4pCit7CisgICAgLy8gWGlhb2NodWFuIExpdQorICAgIC8vIGZpeCBvcGVucGRmIGJ1ZyhtYW50aXMgaWQ6MDA1NTY4MywgZ29vZ2xlIGlkOjM2MDE5OCkKKyAgICAvLyB0aGUgZnVuY3Rpb24gQ3VydmVTZXRFbGVtVHlwZUZyZWUgaW4gY21zbHV0LmMgYWxzbyBuZWVkcyB0byBjaGVjayBwb2ludGVyCisgICAgaWYgKEluID09IE5VTEwgfHwgSW4gLT5JbnRlcnBQYXJhbXMgPT0gTlVMTCB8fCBJbiAtPlNlZ21lbnRzID09IE5VTEwgfHwgSW4gLT5UYWJsZTE2ID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgcmV0dXJuICBBbGxvY2F0ZVRvbmVDdXJ2ZVN0cnVjdChJbiAtPkludGVycFBhcmFtcyAtPkNvbnRleHRJRCwgSW4gLT5uRW50cmllcywgSW4gLT5uU2VnbWVudHMsIEluIC0+U2VnbWVudHMsIEluIC0+VGFibGUxNik7Cit9CisKKy8vIEpvaW5zIHR3byBjdXJ2ZXMgZm9yIFggYW5kIFkuIEN1cnZlcyBzaG91bGQgYmUgbW9ub3RvbmljLgorLy8gV2Ugd2FudCB0byBnZXQKKy8vCisvLyAgICAgIHkgPSBZXi0xKFgodCkpCisvLworY21zVG9uZUN1cnZlKiBDTVNFWFBPUlQgY21zSm9pblRvbmVDdXJ2ZShjbXNDb250ZXh0IENvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zVG9uZUN1cnZlKiBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNUb25lQ3VydmUqIFksIGNtc1VJbnQzMk51bWJlciBuUmVzdWx0aW5nUG9pbnRzKQoreworICAgIGNtc1RvbmVDdXJ2ZSogb3V0ID0gTlVMTDsKKyAgICBjbXNUb25lQ3VydmUqIFlyZXZlcnNlZCA9IE5VTEw7CisgICAgY21zRmxvYXQzMk51bWJlciB0LCB4OworICAgIGNtc0Zsb2F0MzJOdW1iZXIqIFJlcyA9IE5VTEw7CisgICAgY21zVUludDMyTnVtYmVyIGk7CisKKworICAgIF9jbXNBc3NlcnQoWCAhPSBOVUxMKTsKKyAgICBfY21zQXNzZXJ0KFkgIT0gTlVMTCk7CisKKyAgICBZcmV2ZXJzZWQgPSBjbXNSZXZlcnNlVG9uZUN1cnZlRXgoblJlc3VsdGluZ1BvaW50cywgWSk7CisgICAgaWYgKFlyZXZlcnNlZCA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgUmVzID0gKGNtc0Zsb2F0MzJOdW1iZXIqKSBfY21zQ2FsbG9jKENvbnRleHRJRCwgblJlc3VsdGluZ1BvaW50cywgc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpKTsKKyAgICBpZiAoUmVzID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgICAvL0l0ZXJhdGUKKyAgICBmb3IgKGk9MDsgaSA8ICBuUmVzdWx0aW5nUG9pbnRzOyBpKyspIHsKKworICAgICAgICB0ID0gKGNtc0Zsb2F0MzJOdW1iZXIpIGkgLyAoblJlc3VsdGluZ1BvaW50cy0xKTsKKyAgICAgICAgeCA9IGNtc0V2YWxUb25lQ3VydmVGbG9hdChYLCAgdCk7CisgICAgICAgIFJlc1tpXSA9IGNtc0V2YWxUb25lQ3VydmVGbG9hdChZcmV2ZXJzZWQsIHgpOworICAgIH0KKworICAgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciBvdXRwdXQKKyAgICBvdXQgPSBjbXNCdWlsZFRhYnVsYXRlZFRvbmVDdXJ2ZUZsb2F0KENvbnRleHRJRCwgblJlc3VsdGluZ1BvaW50cywgUmVzKTsKKworRXJyb3I6CisKKyAgICBpZiAoUmVzICE9IE5VTEwpIF9jbXNGcmVlKENvbnRleHRJRCwgUmVzKTsKKyAgICBpZiAoWXJldmVyc2VkICE9IE5VTEwpIGNtc0ZyZWVUb25lQ3VydmUoWXJldmVyc2VkKTsKKworICAgIHJldHVybiBvdXQ7Cit9CisKKworCisvLyBHZXQgdGhlIHN1cnJvdW5kaW5nIG5vZGVzLiBUaGlzIGlzIHRyaWNreSBvbiBub24tbW9ub3RvbmljIHRhYmxlcworc3RhdGljCitpbnQgR2V0SW50ZXJ2YWwoY21zRmxvYXQ2NE51bWJlciBJbiwgY29uc3QgY21zVUludDE2TnVtYmVyIEx1dFRhYmxlW10sIGNvbnN0IHN0cnVjdCBfY21zX2ludGVycF9zdHJ1YyogcCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgeTAsIHkxOworCisgICAgLy8gQSAxIHBvaW50IHRhYmxlIGlzIG5vdCBhbGxvd2VkCisgICAgaWYgKHAgLT4gRG9tYWluWzBdIDwgMSkgcmV0dXJuIC0xOworCisgICAgLy8gTGV0J3Mgc2VlIGlmIGFzY2VuZGluZyBvciBkZXNjZW5kaW5nLgorICAgIGlmIChMdXRUYWJsZVswXSA8IEx1dFRhYmxlW3AgLT5Eb21haW5bMF1dKSB7CisKKyAgICAgICAgLy8gVGFibGUgaXMgb3ZlcmFsbCBhc2NlbmRpbmcKKyAgICAgICAgZm9yIChpPXAtPkRvbWFpblswXS0xOyBpID49MDsgLS1pKSB7CisKKyAgICAgICAgICAgIHkwID0gTHV0VGFibGVbaV07CisgICAgICAgICAgICB5MSA9IEx1dFRhYmxlW2krMV07CisKKyAgICAgICAgICAgIGlmICh5MCA8PSB5MSkgeyAvLyBJbmNyZWFzaW5nCisgICAgICAgICAgICAgICAgaWYgKEluID49IHkwICYmIEluIDw9IHkxKSByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpZiAoeTEgPCB5MCkgeyAvLyBEZWNyZWFzaW5nCisgICAgICAgICAgICAgICAgICAgIGlmIChJbiA+PSB5MSAmJiBJbiA8PSB5MCkgcmV0dXJuIGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLyBUYWJsZSBpcyBvdmVyYWxsIGRlc2NlbmRpbmcKKyAgICAgICAgZm9yIChpPTA7IGkgPCAoaW50KSBwIC0+IERvbWFpblswXTsgaSsrKSB7CisKKyAgICAgICAgICAgIHkwID0gTHV0VGFibGVbaV07CisgICAgICAgICAgICB5MSA9IEx1dFRhYmxlW2krMV07CisKKyAgICAgICAgICAgIGlmICh5MCA8PSB5MSkgeyAvLyBJbmNyZWFzaW5nCisgICAgICAgICAgICAgICAgaWYgKEluID49IHkwICYmIEluIDw9IHkxKSByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpZiAoeTEgPCB5MCkgeyAvLyBEZWNyZWFzaW5nCisgICAgICAgICAgICAgICAgICAgIGlmIChJbiA+PSB5MSAmJiBJbiA8PSB5MCkgcmV0dXJuIGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCisvLyBSZXZlcnNlIGEgZ2FtbWEgdGFibGUKK2Ntc1RvbmVDdXJ2ZSogQ01TRVhQT1JUIGNtc1JldmVyc2VUb25lQ3VydmVFeChjbXNJbnQzMk51bWJlciBuUmVzdWx0U2FtcGxlcywgY29uc3QgY21zVG9uZUN1cnZlKiBJbkN1cnZlKQoreworICAgIGNtc1RvbmVDdXJ2ZSAqb3V0OworICAgIGNtc0Zsb2F0NjROdW1iZXIgYSA9IDAsIGIgPSAwLCB5LCB4MSwgeTEsIHgyLCB5MjsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgQXNjZW5kaW5nOworCisgICAgX2Ntc0Fzc2VydChJbkN1cnZlICE9IE5VTEwpOworCisgICAgLy8gVHJ5IHRvIHJldmVyc2UgaXQgYW5hbHl0aWNhbGx5IHdoYXRldmVyIHBvc3NpYmxlCisgCisgICAgaWYgKEluQ3VydmUgLT5uU2VnbWVudHMgPT0gMSAmJiBJbkN1cnZlIC0+U2VnbWVudHNbMF0uVHlwZSA+IDAgJiYgCisgICAgICAgIC8qIEluQ3VydmUgLT4gU2VnbWVudHNbMF0uVHlwZSA8PSA1ICovIAorICAgICAgICBHZXRQYXJhbWV0cmljQ3VydmVCeVR5cGUoSW5DdXJ2ZSAtPkludGVycFBhcmFtcy0+Q29udGV4dElELCBJbkN1cnZlIC0+U2VnbWVudHNbMF0uVHlwZSwgTlVMTCkgIT0gTlVMTCkgeworCisgICAgICAgIHJldHVybiBjbXNCdWlsZFBhcmFtZXRyaWNUb25lQ3VydmUoSW5DdXJ2ZSAtPkludGVycFBhcmFtcy0+Q29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShJbkN1cnZlIC0+IFNlZ21lbnRzWzBdLlR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5DdXJ2ZSAtPiBTZWdtZW50c1swXS5QYXJhbXMpOworICAgIH0KKworICAgIC8vIE5vcGUsIHJldmVyc2UgdGhlIHRhYmxlLgorICAgIG91dCA9IGNtc0J1aWxkVGFidWxhdGVkVG9uZUN1cnZlMTYoSW5DdXJ2ZSAtPkludGVycFBhcmFtcy0+Q29udGV4dElELCBuUmVzdWx0U2FtcGxlcywgTlVMTCk7CisgICAgaWYgKG91dCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8vIFdlIHdhbnQgdG8ga25vdyBpZiB0aGlzIGlzIGFuIGFzY2VuZGluZyBvciBkZXNjZW5kaW5nIHRhYmxlCisgICAgQXNjZW5kaW5nID0gIWNtc0lzVG9uZUN1cnZlRGVzY2VuZGluZyhJbkN1cnZlKTsKKworICAgIC8vIEl0ZXJhdGUgYWNyb3NzIFkgYXhpcworICAgIGZvciAoaT0wOyBpIDwgIG5SZXN1bHRTYW1wbGVzOyBpKyspIHsKKworICAgICAgICB5ID0gKGNtc0Zsb2F0NjROdW1iZXIpIGkgKiA2NTUzNS4wIC8gKG5SZXN1bHRTYW1wbGVzIC0gMSk7CisKKyAgICAgICAgLy8gRmluZCBpbnRlcnZhbCBpbiB3aGljaCB5IGlzIHdpdGhpbi4KKyAgICAgICAgaiA9IEdldEludGVydmFsKHksIEluQ3VydmUtPlRhYmxlMTYsIEluQ3VydmUtPkludGVycFBhcmFtcyk7CisgICAgICAgIGlmIChqID49IDApIHsKKworCisgICAgICAgICAgICAvLyBHZXQgbGltaXRzIG9mIGludGVydmFsCisgICAgICAgICAgICB4MSA9IEluQ3VydmUgLT5UYWJsZTE2W2pdOworICAgICAgICAgICAgeDIgPSBJbkN1cnZlIC0+VGFibGUxNltqKzFdOworCisgICAgICAgICAgICB5MSA9IChjbXNGbG9hdDY0TnVtYmVyKSAoaiAqIDY1NTM1LjApIC8gKEluQ3VydmUgLT5uRW50cmllcyAtIDEpOworICAgICAgICAgICAgeTIgPSAoY21zRmxvYXQ2NE51bWJlcikgKChqKzEpICogNjU1MzUuMCApIC8gKEluQ3VydmUgLT5uRW50cmllcyAtIDEpOworCisgICAgICAgICAgICAvLyBJZiBjb2xsYXBzZWQsIHRoZW4gdXNlIGFueQorICAgICAgICAgICAgaWYgKHgxID09IHgyKSB7CisKKyAgICAgICAgICAgICAgICBvdXQgLT5UYWJsZTE2W2ldID0gX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKEFzY2VuZGluZyA/IHkyIDogeTEpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgLy8gSW50ZXJwb2xhdGUKKyAgICAgICAgICAgICAgICBhID0gKHkyIC0geTEpIC8gKHgyIC0geDEpOworICAgICAgICAgICAgICAgIGIgPSB5MiAtIGEgKiB4MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91dCAtPlRhYmxlMTZbaV0gPSBfY21zUXVpY2tTYXR1cmF0ZVdvcmQoYSogeSArIGIpOworICAgIH0KKworCisgICAgcmV0dXJuIG91dDsKK30KKworLy8gUmV2ZXJzZSBhIGdhbW1hIHRhYmxlCitjbXNUb25lQ3VydmUqIENNU0VYUE9SVCBjbXNSZXZlcnNlVG9uZUN1cnZlKGNvbnN0IGNtc1RvbmVDdXJ2ZSogSW5HYW1tYSkKK3sKKyAgICBfY21zQXNzZXJ0KEluR2FtbWEgIT0gTlVMTCk7CisKKyAgICByZXR1cm4gY21zUmV2ZXJzZVRvbmVDdXJ2ZUV4KDQwOTYsIEluR2FtbWEpOworfQorCisvLyBGcm9tOiBFaWxlcnMsIFAuSC5DLiAoMTk5NCkgU21vb3RoaW5nIGFuZCBpbnRlcnBvbGF0aW9uIHdpdGggZmluaXRlCisvLyBkaWZmZXJlbmNlcy4gaW46IEdyYXBoaWMgR2VtcyBJViwgSGVja2JlcnQsIFAuUy4gKGVkLiksIEFjYWRlbWljIHByZXNzLgorLy8KKy8vIFNtb290aGluZyBhbmQgaW50ZXJwb2xhdGlvbiB3aXRoIHNlY29uZCBkaWZmZXJlbmNlcy4KKy8vCisvLyAgIElucHV0OiAgd2VpZ2h0cyAodyksIGRhdGEgKHkpOiB2ZWN0b3IgZnJvbSAxIHRvIG0uCisvLyAgIElucHV0OiAgc21vb3RoaW5nIHBhcmFtZXRlciAobGFtYmRhKSwgbGVuZ3RoIChtKS4KKy8vICAgT3V0cHV0OiBzbW9vdGhlZCB2ZWN0b3IgKHopOiB2ZWN0b3IgZnJvbSAxIHRvIG0uCisKK3N0YXRpYworY21zQm9vbCBzbW9vdGgyKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNGbG9hdDMyTnVtYmVyIHdbXSwgY21zRmxvYXQzMk51bWJlciB5W10sIGNtc0Zsb2F0MzJOdW1iZXIgeltdLCBjbXNGbG9hdDMyTnVtYmVyIGxhbWJkYSwgaW50IG0pCit7CisgICAgaW50IGksIGkxLCBpMjsKKyAgICBjbXNGbG9hdDMyTnVtYmVyICpjLCAqZCwgKmU7CisgICAgY21zQm9vbCBzdDsKKworCisgICAgYyA9IChjbXNGbG9hdDMyTnVtYmVyKikgX2Ntc0NhbGxvYyhDb250ZXh0SUQsIE1BWF9OT0RFU19JTl9DVVJWRSwgc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpKTsKKyAgICBkID0gKGNtc0Zsb2F0MzJOdW1iZXIqKSBfY21zQ2FsbG9jKENvbnRleHRJRCwgTUFYX05PREVTX0lOX0NVUlZFLCBzaXplb2YoY21zRmxvYXQzMk51bWJlcikpOworICAgIGUgPSAoY21zRmxvYXQzMk51bWJlciopIF9jbXNDYWxsb2MoQ29udGV4dElELCBNQVhfTk9ERVNfSU5fQ1VSVkUsIHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKSk7CisKKyAgICBpZiAoYyAhPSBOVUxMICYmIGQgIT0gTlVMTCAmJiBlICE9IE5VTEwpIHsKKworCisgICAgZFsxXSA9IHdbMV0gKyBsYW1iZGE7CisgICAgY1sxXSA9IC0yICogbGFtYmRhIC8gZFsxXTsKKyAgICBlWzFdID0gbGFtYmRhIC9kWzFdOworICAgIHpbMV0gPSB3WzFdICogeVsxXTsKKyAgICBkWzJdID0gd1syXSArIDUgKiBsYW1iZGEgLSBkWzFdICogY1sxXSAqICBjWzFdOworICAgIGNbMl0gPSAoLTQgKiBsYW1iZGEgLSBkWzFdICogY1sxXSAqIGVbMV0pIC8gZFsyXTsKKyAgICBlWzJdID0gbGFtYmRhIC8gZFsyXTsKKyAgICB6WzJdID0gd1syXSAqIHlbMl0gLSBjWzFdICogelsxXTsKKworICAgIGZvciAoaSA9IDM7IGkgPCBtIC0gMTsgaSsrKSB7CisgICAgICAgIGkxID0gaSAtIDE7IGkyID0gaSAtIDI7CisgICAgICAgIGRbaV09IHdbaV0gKyA2ICogbGFtYmRhIC0gY1tpMV0gKiBjW2kxXSAqIGRbaTFdIC0gZVtpMl0gKiBlW2kyXSAqIGRbaTJdOworICAgICAgICBjW2ldID0gKC00ICogbGFtYmRhIC1kW2kxXSAqIGNbaTFdICogZVtpMV0pLyBkW2ldOworICAgICAgICBlW2ldID0gbGFtYmRhIC8gZFtpXTsKKyAgICAgICAgeltpXSA9IHdbaV0gKiB5W2ldIC0gY1tpMV0gKiB6W2kxXSAtIGVbaTJdICogeltpMl07CisgICAgfQorCisgICAgaTEgPSBtIC0gMjsgaTIgPSBtIC0gMzsKKworICAgIGRbbSAtIDFdID0gd1ttIC0gMV0gKyA1ICogbGFtYmRhIC1jW2kxXSAqIGNbaTFdICogZFtpMV0gLSBlW2kyXSAqIGVbaTJdICogZFtpMl07CisgICAgY1ttIC0gMV0gPSAoLTIgKiBsYW1iZGEgLSBkW2kxXSAqIGNbaTFdICogZVtpMV0pIC8gZFttIC0gMV07CisgICAgelttIC0gMV0gPSB3W20gLSAxXSAqIHlbbSAtIDFdIC0gY1tpMV0gKiB6W2kxXSAtIGVbaTJdICogeltpMl07CisgICAgaTEgPSBtIC0gMTsgaTIgPSBtIC0gMjsKKworICAgIGRbbV0gPSB3W21dICsgbGFtYmRhIC0gY1tpMV0gKiBjW2kxXSAqIGRbaTFdIC0gZVtpMl0gKiBlW2kyXSAqIGRbaTJdOworICAgIHpbbV0gPSAod1ttXSAqIHlbbV0gLSBjW2kxXSAqIHpbaTFdIC0gZVtpMl0gKiB6W2kyXSkgLyBkW21dOworICAgIHpbbSAtIDFdID0gelttIC0gMV0gLyBkW20gLSAxXSAtIGNbbSAtIDFdICogelttXTsKKworICAgIGZvciAoaSA9IG0gLSAyOyAxPD0gaTsgaS0tKQorICAgICAgICB6W2ldID0geltpXSAvIGRbaV0gLSBjW2ldICogeltpICsgMV0gLSBlW2ldICogeltpICsgMl07CisKKyAgICAgIHN0ID0gVFJVRTsKKyAgICB9CisgICAgZWxzZSBzdCA9IEZBTFNFOworCisgICAgaWYgKGMgIT0gTlVMTCkgX2Ntc0ZyZWUoQ29udGV4dElELCBjKTsKKyAgICBpZiAoZCAhPSBOVUxMKSBfY21zRnJlZShDb250ZXh0SUQsIGQpOworICAgIGlmIChlICE9IE5VTEwpIF9jbXNGcmVlKENvbnRleHRJRCwgZSk7CisKKyAgICByZXR1cm4gc3Q7Cit9CisKKy8vIFNtb290aHMgYSBjdXJ2ZSBzYW1wbGVkIGF0IHJlZ3VsYXIgaW50ZXJ2YWxzLgorY21zQm9vbCAgQ01TRVhQT1JUIGNtc1Ntb290aFRvbmVDdXJ2ZShjbXNUb25lQ3VydmUqIFRhYiwgY21zRmxvYXQ2NE51bWJlciBsYW1iZGEpCit7CisgICAgY21zRmxvYXQzMk51bWJlciB3W01BWF9OT0RFU19JTl9DVVJWRV0sIHlbTUFYX05PREVTX0lOX0NVUlZFXSwgeltNQVhfTk9ERVNfSU5fQ1VSVkVdOworICAgIGludCBpLCBuSXRlbXMsIFplcm9zLCBQb2xlczsKKworICAgIGlmIChUYWIgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKGNtc0lzVG9uZUN1cnZlTGluZWFyKFRhYikpIHJldHVybiBUUlVFOyAvLyBOb3RoaW5nIHRvIGRvCisKKyAgICBuSXRlbXMgPSBUYWIgLT4gbkVudHJpZXM7CisKKyAgICBpZiAobkl0ZW1zID49IE1BWF9OT0RFU19JTl9DVVJWRSkgeworICAgICAgICBjbXNTaWduYWxFcnJvcihUYWIgLT5JbnRlcnBQYXJhbXMtPkNvbnRleHRJRCwgY21zRVJST1JfUkFOR0UsICJjbXNTbW9vdGhUb25lQ3VydmU6IHRvbyBtYW55IHBvaW50cy4iKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIG1lbXNldCh3LCAwLCBuSXRlbXMgKiBzaXplb2YoY21zRmxvYXQzMk51bWJlcikpOworICAgIG1lbXNldCh5LCAwLCBuSXRlbXMgKiBzaXplb2YoY21zRmxvYXQzMk51bWJlcikpOworICAgIG1lbXNldCh6LCAwLCBuSXRlbXMgKiBzaXplb2YoY21zRmxvYXQzMk51bWJlcikpOworCisgICAgZm9yIChpPTA7IGkgPCBuSXRlbXM7IGkrKykKKyAgICB7CisgICAgICAgIHlbaSsxXSA9IChjbXNGbG9hdDMyTnVtYmVyKSBUYWIgLT4gVGFibGUxNltpXTsKKyAgICAgICAgd1tpKzFdID0gMS4wOworICAgIH0KKworICAgIGlmICghc21vb3RoMihUYWIgLT5JbnRlcnBQYXJhbXMtPkNvbnRleHRJRCwgdywgeSwgeiwgKGNtc0Zsb2F0MzJOdW1iZXIpIGxhbWJkYSwgbkl0ZW1zKSkgcmV0dXJuIEZBTFNFOworCisgICAgLy8gRG8gc29tZSByZWFsaXR5IC0gY2hlY2tpbmcuLi4KKyAgICBaZXJvcyA9IFBvbGVzID0gMDsKKyAgICBmb3IgKGk9bkl0ZW1zOyBpID4gMTsgLS1pKSB7CisKKyAgICAgICAgaWYgKHpbaV0gPT0gMC4pIFplcm9zKys7CisgICAgICAgIGlmICh6W2ldID49IDY1NTM1LikgUG9sZXMrKzsKKyAgICAgICAgaWYgKHpbaV0gPCB6W2ktMV0pIHsKKyAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKFRhYiAtPkludGVycFBhcmFtcy0+Q29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgImNtc1Ntb290aFRvbmVDdXJ2ZTogTm9uLU1vbm90b25pYy4iKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChaZXJvcyA+IChuSXRlbXMgLyAzKSkgeworICAgICAgICBjbXNTaWduYWxFcnJvcihUYWIgLT5JbnRlcnBQYXJhbXMtPkNvbnRleHRJRCwgY21zRVJST1JfUkFOR0UsICJjbXNTbW9vdGhUb25lQ3VydmU6IERlZ2VuZXJhdGVkLCBtb3N0bHkgemVyb3MuIik7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKFBvbGVzID4gKG5JdGVtcyAvIDMpKSB7CisgICAgICAgIGNtc1NpZ25hbEVycm9yKFRhYiAtPkludGVycFBhcmFtcy0+Q29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgImNtc1Ntb290aFRvbmVDdXJ2ZTogRGVnZW5lcmF0ZWQsIG1vc3RseSBwb2xlcy4iKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8vIFNlZW1zIG9rCisgICAgZm9yIChpPTA7IGkgPCBuSXRlbXM7IGkrKykgeworCisgICAgICAgIC8vIENsYW1wIHRvIGNtc1VJbnQxNk51bWJlcgorICAgICAgICBUYWIgLT4gVGFibGUxNltpXSA9IF9jbXNRdWlja1NhdHVyYXRlV29yZCh6W2krMV0pOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvLyBJcyBhIHRhYmxlIGxpbmVhcj8gRG8gbm90IHVzZSBwYXJhbWV0cmljIHNpbmNlIHdlIGNhbm5vdCBndWFyYW50ZWUgc29tZSB3ZWlyZCBwYXJhbWV0ZXJzIHJlc3VsdGluZworLy8gaW4gYSBsaW5lYXIgdGFibGUuIFRoaXMgd2F5IGFzc3VyZXMgaXQgaXMgbGluZWFyIGluIDEyIGJpdHMsIHdoaWNoIHNob3VsZCBiZSBlbm91Z2h0IGluIG1vc3QgY2FzZXMuCitjbXNCb29sIENNU0VYUE9SVCBjbXNJc1RvbmVDdXJ2ZUxpbmVhcihjb25zdCBjbXNUb25lQ3VydmUqIEN1cnZlKQoreworICAgIGNtc1VJbnQzMk51bWJlciBpOworICAgIGludCBkaWZmOworCisgICAgX2Ntc0Fzc2VydChDdXJ2ZSAhPSBOVUxMKTsKKworICAgIGZvciAoaT0wOyBpIDwgQ3VydmUgLT5uRW50cmllczsgaSsrKSB7CisKKyAgICAgICAgZGlmZiA9IGFicygoaW50KSBDdXJ2ZS0+VGFibGUxNltpXSAtIChpbnQpIF9jbXNRdWFudGl6ZVZhbChpLCBDdXJ2ZSAtPm5FbnRyaWVzKSk7CisgICAgICAgIGlmIChkaWZmID4gMHgwZikKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gU2FtZSwgYnV0IGZvciBtb25vdG9uaWNpdHkKK2Ntc0Jvb2wgIENNU0VYUE9SVCBjbXNJc1RvbmVDdXJ2ZU1vbm90b25pYyhjb25zdCBjbXNUb25lQ3VydmUqIHQpCit7CisgICAgaW50IG47CisgICAgaW50IGksIGxhc3Q7CisgICAgY21zQm9vbCBsRGVzY2VuZGluZzsKKworICAgIF9jbXNBc3NlcnQodCAhPSBOVUxMKTsKKworICAgIC8vIERlZ2VuZXJhdGVkIGN1cnZlcyBhcmUgbW9ub3RvbmljPyBPaywgbGV0J3MgcGFzcyB0aGVtCisgICAgbiA9IHQgLT5uRW50cmllczsKKyAgICBpZiAobiA8IDIpIHJldHVybiBUUlVFOworCisgICAgLy8gQ3VydmUgZGlyZWN0aW9uCisgICAgbERlc2NlbmRpbmcgPSBjbXNJc1RvbmVDdXJ2ZURlc2NlbmRpbmcodCk7CisKKyAgICBpZiAobERlc2NlbmRpbmcpIHsKKworICAgICAgICBsYXN0ID0gdCAtPlRhYmxlMTZbMF07CisKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IG47IGkrKykgeworCisgICAgICAgICAgICBpZiAodCAtPlRhYmxlMTZbaV0gLSBsYXN0ID4gMikgLy8gV2UgYWxsb3cgc29tZSByaXBwbGUKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGFzdCA9IHQgLT5UYWJsZTE2W2ldOworCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgbGFzdCA9IHQgLT5UYWJsZTE2W24tMV07CisKKyAgICAgICAgZm9yIChpID0gbi0yOyBpID49IDA7IC0taSkgeworCisgICAgICAgICAgICBpZiAodCAtPlRhYmxlMTZbaV0gLSBsYXN0ID4gMikKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGFzdCA9IHQgLT5UYWJsZTE2W2ldOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gU2FtZSwgYnV0IGZvciBkZXNjZW5kaW5nIHRhYmxlcworY21zQm9vbCAgQ01TRVhQT1JUIGNtc0lzVG9uZUN1cnZlRGVzY2VuZGluZyhjb25zdCBjbXNUb25lQ3VydmUqIHQpCit7CisgICAgX2Ntc0Fzc2VydCh0ICE9IE5VTEwpOworCisgICAgcmV0dXJuIHQgLT5UYWJsZTE2WzBdID4gdCAtPlRhYmxlMTZbdCAtPm5FbnRyaWVzLTFdOworfQorCisKKy8vIEFub3RoZXIgaW5mbyBmbjogaXMgb3V0IGdhbW1hIHRhYmxlIG11bHRpc2VnbWVudD8KK2Ntc0Jvb2wgIENNU0VYUE9SVCBjbXNJc1RvbmVDdXJ2ZU11bHRpc2VnbWVudChjb25zdCBjbXNUb25lQ3VydmUqIHQpCit7CisgICAgX2Ntc0Fzc2VydCh0ICE9IE5VTEwpOworCisgICAgcmV0dXJuIHQgLT4gblNlZ21lbnRzID4gMTsKK30KKworY21zSW50MzJOdW1iZXIgIENNU0VYUE9SVCBjbXNHZXRUb25lQ3VydmVQYXJhbWV0cmljVHlwZShjb25zdCBjbXNUb25lQ3VydmUqIHQpCit7CisgICAgX2Ntc0Fzc2VydCh0ICE9IE5VTEwpOworCisgICAgaWYgKHQgLT4gblNlZ21lbnRzICE9IDEpIHJldHVybiAwOworICAgIHJldHVybiB0IC0+U2VnbWVudHNbMF0uVHlwZTsKK30KKworLy8gV2UgbmVlZCBhY2N1cmFjeSB0aGlzIHRpbWUKK2Ntc0Zsb2F0MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0V2YWxUb25lQ3VydmVGbG9hdChjb25zdCBjbXNUb25lQ3VydmUqIEN1cnZlLCBjbXNGbG9hdDMyTnVtYmVyIHYpCit7CisgICAgX2Ntc0Fzc2VydChDdXJ2ZSAhPSBOVUxMKTsKKworICAgIC8vIENoZWNrIGZvciAxNiBiaXRzIHRhYmxlLiBJZiBzbywgdGhpcyBpcyBhIGxpbWl0ZWQtcHJlY2lzaW9uIHRvbmUgY3VydmUKKyAgICBpZiAoQ3VydmUgLT5uU2VnbWVudHMgPT0gMCkgeworCisgICAgICAgIGNtc1VJbnQxNk51bWJlciBJbiwgT3V0OworCisgICAgICAgIEluID0gKGNtc1VJbnQxNk51bWJlcikgX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKHYgKiA2NTUzNS4wKTsKKyAgICAgICAgT3V0ID0gY21zRXZhbFRvbmVDdXJ2ZTE2KEN1cnZlLCBJbik7CisKKyAgICAgICAgcmV0dXJuIChjbXNGbG9hdDMyTnVtYmVyKSAoT3V0IC8gNjU1MzUuMCk7CisgICAgfQorCisgICAgcmV0dXJuIChjbXNGbG9hdDMyTnVtYmVyKSBFdmFsU2VnbWVudGVkRm4oQ3VydmUsIHYpOworfQorCisvLyBXZSBuZWVkIHhwdXQgb3ZlciBoZXJlCitjbXNVSW50MTZOdW1iZXIgQ01TRVhQT1JUIGNtc0V2YWxUb25lQ3VydmUxNihjb25zdCBjbXNUb25lQ3VydmUqIEN1cnZlLCBjbXNVSW50MTZOdW1iZXIgdikKK3sKKyAgICBjbXNVSW50MTZOdW1iZXIgb3V0OworCisgICAgX2Ntc0Fzc2VydChDdXJ2ZSAhPSBOVUxMKTsKKworICAgIEN1cnZlIC0+SW50ZXJwUGFyYW1zIC0+SW50ZXJwb2xhdGlvbi5MZXJwMTYoJnYsICZvdXQsIEN1cnZlIC0+SW50ZXJwUGFyYW1zKTsKKyAgICByZXR1cm4gb3V0OworfQorCisKKy8vIExlYXN0IHNxdWFyZXMgZml0dGluZy4KKy8vIEEgbWF0aGVtYXRpY2FsIHByb2NlZHVyZSBmb3IgZmluZGluZyB0aGUgYmVzdC1maXR0aW5nIGN1cnZlIHRvIGEgZ2l2ZW4gc2V0IG9mIHBvaW50cyBieQorLy8gbWluaW1pemluZyB0aGUgc3VtIG9mIHRoZSBzcXVhcmVzIG9mIHRoZSBvZmZzZXRzICgidGhlIHJlc2lkdWFscyIpIG9mIHRoZSBwb2ludHMgZnJvbSB0aGUgY3VydmUuCisvLyBUaGUgc3VtIG9mIHRoZSBzcXVhcmVzIG9mIHRoZSBvZmZzZXRzIGlzIHVzZWQgaW5zdGVhZCBvZiB0aGUgb2Zmc2V0IGFic29sdXRlIHZhbHVlcyBiZWNhdXNlCisvLyB0aGlzIGFsbG93cyB0aGUgcmVzaWR1YWxzIHRvIGJlIHRyZWF0ZWQgYXMgYSBjb250aW51b3VzIGRpZmZlcmVudGlhYmxlIHF1YW50aXR5LgorLy8KKy8vIHkgPSBmKHgpID0geCBeIGcKKy8vCisvLyBSICA9ICh5aSAtICh4aV5nKSkKKy8vIFIyID0gKHlpIC0gKHhpXmcpKTIKKy8vIFNVTSBSMiA9IFNVTSAoeWkgLSAoeGleZykpMgorLy8KKy8vIGRSMi9kZyA9IC0yIFNVTSB4XmcgbG9nKHgpKHkgLSB4XmcpCisvLyBzb2x2aW5nIGZvciBkUjIvZGcgPSAwCisvLworLy8gZyA9IDEvbiAqIFNVTShsb2coeSkgLyBsb2coeCkpCisKK2Ntc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIGNtc0VzdGltYXRlR2FtbWEoY29uc3QgY21zVG9uZUN1cnZlKiB0LCBjbXNGbG9hdDY0TnVtYmVyIFByZWNpc2lvbikKK3sKKyAgICBjbXNGbG9hdDY0TnVtYmVyIGdhbW1hLCBzdW0sIHN1bTI7CisgICAgY21zRmxvYXQ2NE51bWJlciBuLCB4LCB5LCBTdGQ7CisgICAgY21zVUludDMyTnVtYmVyIGk7CisKKyAgICBfY21zQXNzZXJ0KHQgIT0gTlVMTCk7CisKKyAgICBzdW0gPSBzdW0yID0gbiA9IDA7CisKKyAgICAvLyBFeGNsdWRpbmcgZW5kcG9pbnRzCisgICAgZm9yIChpPTE7IGkgPCAoTUFYX05PREVTX0lOX0NVUlZFLTEpOyBpKyspIHsKKworICAgICAgICB4ID0gKGNtc0Zsb2F0NjROdW1iZXIpIGkgLyAoTUFYX05PREVTX0lOX0NVUlZFLTEpOworICAgICAgICB5ID0gKGNtc0Zsb2F0NjROdW1iZXIpIGNtc0V2YWxUb25lQ3VydmVGbG9hdCh0LCAoY21zRmxvYXQzMk51bWJlcikgeCk7CisKKyAgICAgICAgLy8gQXZvaWQgNyUgb24gbG93ZXIgcGFydCB0byBwcmV2ZW50CisgICAgICAgIC8vIGFydGlmYWN0cyBkdWUgdG8gbGluZWFyIHJhbXBzCisKKyAgICAgICAgaWYgKHkgPiAwLiAmJiB5IDwgMS4gJiYgeCA+IDAuMDcpIHsKKworICAgICAgICAgICAgZ2FtbWEgPSBsb2coeSkgLyBsb2coeCk7CisgICAgICAgICAgICBzdW0gICs9IGdhbW1hOworICAgICAgICAgICAgc3VtMiArPSBnYW1tYSAqIGdhbW1hOworICAgICAgICAgICAgbisrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGFrZSBhIGxvb2sgb24gU0QgdG8gc2VlIGlmIGdhbW1hIGlzbid0IGV4cG9uZW50aWFsIGF0IGFsbAorICAgIFN0ZCA9IHNxcnQoKG4gKiBzdW0yIC0gc3VtICogc3VtKSAvIChuKihuLTEpKSk7CisKKyAgICBpZiAoU3RkID4gUHJlY2lzaW9uKQorICAgICAgICByZXR1cm4gLTEuMDsKKworICAgIHJldHVybiAoc3VtIC8gbik7ICAgLy8gVGhlIG1lYW4KK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2dtdC5jIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zZ210LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyZjNiZQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2dtdC5jCkBAIC0wLDAgKzEsNTkwIEBACisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8vDQorLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQ0KKy8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNiBNYXJ0aSBNYXJpYSBTYWd1ZXINCisvLw0KKy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZw0KKy8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwNCisvLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uDQorLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsDQorLy8gYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlDQorLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCisvLw0KKy8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluDQorLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQorLy8NCisvLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwNCisvLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8NCisvLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORA0KKy8vIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUNCisvLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9ODQorLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9ODQorLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuDQorLy8NCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKy8vDQorDQorI2luY2x1ZGUgImxjbXMyX2ludGVybmFsLmgiDQorDQorDQorLy8gQXV4aWxpYXJ5OiBhcHBlbmQgYSBMYWIgaWRlbnRpdHkgYWZ0ZXIgdGhlIGdpdmVuIHNlcXVlbmNlIG9mIHByb2ZpbGVzDQorLy8gYW5kIHJldHVybiB0aGUgdHJhbnNmb3JtLiBMYWIgcHJvZmlsZSBpcyBjbG9zZWQsIHJlc3Qgb2YgcHJvZmlsZXMgYXJlIGtlcHQgb3Blbi4NCitjbXNIVFJBTlNGT1JNIF9jbXNDaGFpbjJMYWIoY21zQ29udGV4dCAgICAgICAgICAgIENvbnRleHRJRCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgICBuUHJvZmlsZXMsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgSW5wdXRGb3JtYXQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgT3V0cHV0Rm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNVSW50MzJOdW1iZXIgIEludGVudHNbXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zSFBST0ZJTEUgICAgICBoUHJvZmlsZXNbXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zQm9vbCAgICAgICAgICBCUENbXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uU3RhdGVzW10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgZHdGbGFncykNCit7DQorICAgIGNtc0hUUkFOU0ZPUk0geGZvcm07DQorICAgIGNtc0hQUk9GSUxFICAgaExhYjsNCisgICAgY21zSFBST0ZJTEUgICBQcm9maWxlTGlzdFsyNTZdOw0KKyAgICBjbXNCb29sICAgICAgIEJQQ0xpc3RbMjU2XTsNCisgICAgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uTGlzdFsyNTZdOw0KKyAgICBjbXNVSW50MzJOdW1iZXIgSW50ZW50TGlzdFsyNTZdOw0KKyAgICBjbXNVSW50MzJOdW1iZXIgaTsNCisNCisgICAgLy8gVGhpcyBpcyBhIHJhdGhlciBiaWcgbnVtYmVyIGFuZCB0aGVyZSBpcyBubyBuZWVkIG9mIGR5bmFtaWMgbWVtb3J5DQorICAgIC8vIHNpbmNlIHdlIGFyZSBhZGRpbmcgYSBwcm9maWxlLCAyNTQgKyAxID0gMjU1IGFuZCB0aGlzIGlzIHRoZSBsaW1pdA0KKyAgICBpZiAoblByb2ZpbGVzID4gMjU0KSByZXR1cm4gTlVMTDsNCisNCisgICAgLy8gVGhlIG91dHB1dCBzcGFjZQ0KKyAgICBoTGFiID0gY21zQ3JlYXRlTGFiNFByb2ZpbGVUSFIoQ29udGV4dElELCBOVUxMKTsNCisgICAgaWYgKGhMYWIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7DQorDQorICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgcGFyYW1ldGVycw0KKyAgICBmb3IgKGk9MDsgaSA8IG5Qcm9maWxlczsgaSsrKSB7DQorDQorICAgICAgICBQcm9maWxlTGlzdFtpXSAgICA9IGhQcm9maWxlc1tpXTsNCisgICAgICAgIEJQQ0xpc3RbaV0gICAgICAgID0gQlBDW2ldOw0KKyAgICAgICAgQWRhcHRhdGlvbkxpc3RbaV0gPSBBZGFwdGF0aW9uU3RhdGVzW2ldOw0KKyAgICAgICAgSW50ZW50TGlzdFtpXSAgICAgPSBJbnRlbnRzW2ldOw0KKyAgICB9DQorDQorICAgIC8vIFBsYWNlIExhYiBpZGVudGl0eSBhdCBjaGFpbidzIGVuZC4NCisgICAgUHJvZmlsZUxpc3RbblByb2ZpbGVzXSAgICA9IGhMYWI7DQorICAgIEJQQ0xpc3RbblByb2ZpbGVzXSAgICAgICAgPSAwOw0KKyAgICBBZGFwdGF0aW9uTGlzdFtuUHJvZmlsZXNdID0gMS4wOw0KKyAgICBJbnRlbnRMaXN0W25Qcm9maWxlc10gICAgID0gSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQzsNCisNCisgICAgLy8gQ3JlYXRlIHRoZSB0cmFuc2Zvcm0NCisgICAgeGZvcm0gPSBjbXNDcmVhdGVFeHRlbmRlZFRyYW5zZm9ybShDb250ZXh0SUQsIG5Qcm9maWxlcyArIDEsIFByb2ZpbGVMaXN0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQQ0xpc3QsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50TGlzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGF0aW9uTGlzdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0Rm9ybWF0LA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dEZvcm1hdCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzKTsNCisNCisgICAgY21zQ2xvc2VQcm9maWxlKGhMYWIpOw0KKw0KKyAgICByZXR1cm4geGZvcm07DQorfQ0KKw0KKw0KKy8vIENvbXB1dGUgSyAtPiBMKiByZWxhdGlvbnNoaXAuIEZsYWdzIG1heSBpbmNsdWRlIGJsYWNrIHBvaW50IGNvbXBlbnNhdGlvbi4gSW4gdGhpcyBjYXNlLA0KKy8vIHRoZSByZWxhdGlvbnNoaXAgaXMgYXNzdW1lZCBmcm9tIHRoZSBwcm9maWxlIHdpdGggQlBDIHRvIGEgYmxhY2sgcG9pbnQgemVyby4NCitzdGF0aWMNCitjbXNUb25lQ3VydmUqIENvbXB1dGVLVG9Mc3RhcihjbXNDb250ZXh0ICAgICAgICAgICAgQ29udGV4dElELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgblBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgIG5Qcm9maWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zVUludDMyTnVtYmVyIEludGVudHNbXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zSFBST0ZJTEUgICAgIGhQcm9maWxlc1tdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNCb29sICAgICAgICAgQlBDW10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIgQWRhcHRhdGlvblN0YXRlc1tdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykNCit7DQorICAgIGNtc1RvbmVDdXJ2ZSogb3V0ID0gTlVMTDsNCisgICAgY21zVUludDMyTnVtYmVyIGk7DQorICAgIGNtc0hUUkFOU0ZPUk0geGZvcm07DQorICAgIGNtc0NJRUxhYiBMYWI7DQorICAgIGNtc0Zsb2F0MzJOdW1iZXIgY215a1s0XTsNCisgICAgY21zRmxvYXQzMk51bWJlciogU2FtcGxlZFBvaW50czsNCisNCisgICAgeGZvcm0gPSBfY21zQ2hhaW4yTGFiKENvbnRleHRJRCwgblByb2ZpbGVzLCBUWVBFX0NNWUtfRkxULCBUWVBFX0xhYl9EQkwsIEludGVudHMsIGhQcm9maWxlcywgQlBDLCBBZGFwdGF0aW9uU3RhdGVzLCBkd0ZsYWdzKTsNCisgICAgaWYgKHhmb3JtID09IE5VTEwpIHJldHVybiBOVUxMOw0KKw0KKyAgICBTYW1wbGVkUG9pbnRzID0gKGNtc0Zsb2F0MzJOdW1iZXIqKSBfY21zQ2FsbG9jKENvbnRleHRJRCwgblBvaW50cywgc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpKTsNCisgICAgaWYgKFNhbXBsZWRQb2ludHMgID09IE5VTEwpIGdvdG8gRXJyb3I7DQorDQorICAgIGZvciAoaT0wOyBpIDwgblBvaW50czsgaSsrKSB7DQorDQorICAgICAgICBjbXlrWzBdID0gMDsNCisgICAgICAgIGNteWtbMV0gPSAwOw0KKyAgICAgICAgY215a1syXSA9IDA7DQorICAgICAgICBjbXlrWzNdID0gKGNtc0Zsb2F0MzJOdW1iZXIpICgoaSAqIDEwMC4wKSAvIChuUG9pbnRzLTEpKTsNCisNCisgICAgICAgIGNtc0RvVHJhbnNmb3JtKHhmb3JtLCBjbXlrLCAmTGFiLCAxKTsNCisgICAgICAgIFNhbXBsZWRQb2ludHNbaV09IChjbXNGbG9hdDMyTnVtYmVyKSAoMS4wIC0gTGFiLkwgLyAxMDAuMCk7IC8vIE5lZ2F0ZSBLIGZvciBlYXNpZXIgb3BlcmF0aW9uDQorICAgIH0NCisNCisgICAgb3V0ID0gY21zQnVpbGRUYWJ1bGF0ZWRUb25lQ3VydmVGbG9hdChDb250ZXh0SUQsIG5Qb2ludHMsIFNhbXBsZWRQb2ludHMpOw0KKw0KK0Vycm9yOg0KKw0KKyAgICBjbXNEZWxldGVUcmFuc2Zvcm0oeGZvcm0pOw0KKyAgICBpZiAoU2FtcGxlZFBvaW50cykgX2Ntc0ZyZWUoQ29udGV4dElELCBTYW1wbGVkUG9pbnRzKTsNCisNCisgICAgcmV0dXJuIG91dDsNCit9DQorDQorDQorLy8gQ29tcHV0ZSBCbGFjayB0b25lIGN1cnZlIG9uIGEgQ01ZSyAtPiBDTVlLIHRyYW5zZm9ybS4gVGhpcyBpcyBkb25lIGJ5DQorLy8gdXNpbmcgdGhlIHByb29mIGRpcmVjdGlvbiBvbiBib3RoIHByb2ZpbGVzIHRvIGZpbmQgSy0+TCogcmVsYXRpb25zaGlwDQorLy8gdGhlbiBqb2luaW5nIGJvdGggY3VydmVzLiBkd0ZsYWdzIG1heSBpbmNsdWRlIGJsYWNrIHBvaW50IGNvbXBlbnNhdGlvbi4NCitjbXNUb25lQ3VydmUqIF9jbXNCdWlsZEtUb25lQ3VydmUoY21zQ29udGV4dCAgICAgICAgQ29udGV4dElELA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgblBvaW50cywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgIG5Qcm9maWxlcywNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1VJbnQzMk51bWJlciBJbnRlbnRzW10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNIUFJPRklMRSBoUHJvZmlsZXNbXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0Jvb2wgICAgIEJQQ1tdLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uU3RhdGVzW10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgICBkd0ZsYWdzKQ0KK3sNCisgICAgY21zVG9uZUN1cnZlICppbiwgKm91dCwgKktUb25lOw0KKw0KKyAgICAvLyBNYWtlIHN1cmUgQ01ZSyAtPiBDTVlLDQorICAgIGlmIChjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlc1swXSkgIT0gY21zU2lnQ215a0RhdGEgfHwNCisgICAgICAgIGNtc0dldENvbG9yU3BhY2UoaFByb2ZpbGVzW25Qcm9maWxlcy0xXSkhPSBjbXNTaWdDbXlrRGF0YSkgcmV0dXJuIE5VTEw7DQorDQorDQorICAgIC8vIE1ha2Ugc3VyZSBsYXN0IGlzIGFuIG91dHB1dCBwcm9maWxlDQorICAgIGlmIChjbXNHZXREZXZpY2VDbGFzcyhoUHJvZmlsZXNbblByb2ZpbGVzIC0gMV0pICE9IGNtc1NpZ091dHB1dENsYXNzKSByZXR1cm4gTlVMTDsNCisNCisgICAgLy8gQ3JlYXRlIGluZGl2aWR1YWwgY3VydmVzLiBCUEMgd29ya3MgYWxzbyBhcyBlYWNoIEsgdG8gTCogaXMNCisgICAgLy8gY29tcHV0ZWQgYXMgYSBCUEMgdG8gemVybyBibGFjayBwb2ludCBpbiBjYXNlIG9mIEwqDQorICAgIGluICA9IENvbXB1dGVLVG9Mc3RhcihDb250ZXh0SUQsIG5Qb2ludHMsIG5Qcm9maWxlcyAtIDEsIEludGVudHMsIGhQcm9maWxlcywgQlBDLCBBZGFwdGF0aW9uU3RhdGVzLCBkd0ZsYWdzKTsNCisgICAgaWYgKGluID09IE5VTEwpIHJldHVybiBOVUxMOw0KKw0KKyAgICBvdXQgPSBDb21wdXRlS1RvTHN0YXIoQ29udGV4dElELCBuUG9pbnRzLCAxLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnRzICsgKG5Qcm9maWxlcyAtIDEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaFByb2ZpbGVzIFtuUHJvZmlsZXMgLSAxXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBDICsgKG5Qcm9maWxlcyAtIDEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGF0aW9uU3RhdGVzICsgKG5Qcm9maWxlcyAtIDEpLA0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzKTsNCisgICAgaWYgKG91dCA9PSBOVUxMKSB7DQorICAgICAgICBjbXNGcmVlVG9uZUN1cnZlKGluKTsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorDQorICAgIC8vIEJ1aWxkIHRoZSByZWxhdGlvbnNoaXAuIFRoaXMgZWZmZWN0aXZlbHkgbGltaXRzIHRoZSBtYXhpbXVtIGFjY3VyYWN5IHRvIDE2IGJpdHMsIGJ1dA0KKyAgICAvLyBzaW5jZSB0aGlzIGlzIHVzZWQgb24gYmxhY2stcHJlc2VydmluZyBMVVRzLCB3ZSBhcmUgbm90IGxvc2luZyAgYWNjdXJhY3kgaW4gYW55IGNhc2UNCisgICAgS1RvbmUgPSBjbXNKb2luVG9uZUN1cnZlKENvbnRleHRJRCwgaW4sIG91dCwgblBvaW50cyk7DQorDQorICAgIC8vIEdldCByaWQgb2YgY29tcG9uZW50cw0KKyAgICBjbXNGcmVlVG9uZUN1cnZlKGluKTsgY21zRnJlZVRvbmVDdXJ2ZShvdXQpOw0KKw0KKyAgICAvLyBTb21ldGhpbmcgd2VudCB3cm9uZy4uLg0KKyAgICBpZiAoS1RvbmUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7DQorDQorICAgIC8vIE1ha2Ugc3VyZSBpdCBpcyBtb25vdG9uaWMNCisgICAgaWYgKCFjbXNJc1RvbmVDdXJ2ZU1vbm90b25pYyhLVG9uZSkpIHsNCisgICAgICAgIGNtc0ZyZWVUb25lQ3VydmUoS1RvbmUpOw0KKyAgICAgICAgcmV0dXJuIE5VTEw7DQorICAgIH0NCisNCisgICAgcmV0dXJuIEtUb25lOw0KK30NCisNCisNCisvLyBHYW11dCBMVVQgQ3JlYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisvLyBVc2VkIGJ5IGdhbXV0ICYgc29mdHByb29maW5nDQorDQordHlwZWRlZiBzdHJ1Y3Qgew0KKw0KKyAgICBjbXNIVFJBTlNGT1JNIGhJbnB1dDsgICAgICAgICAgICAgICAvLyBGcm9tIHdoYXRldmVyIGlucHV0IGNvbG9yIHNwYWNlLiAxNiBiaXRzIHRvIERCTA0KKyAgICBjbXNIVFJBTlNGT1JNIGhGb3J3YXJkLCBoUmV2ZXJzZTsgICAvLyBUcmFuc2Zvcm1zIGdvaW5nIGZyb20gTGFiIHRvIGNvbG9yYW50IGFuZCBiYWNrDQorICAgIGNtc0Zsb2F0NjROdW1iZXIgVGhlcmVzaG9sZDsgICAgICAgIC8vIFRoZSB0aGVyZXNob2xkIGFmdGVyIHdoaWNoIGlzIGNvbnNpZGVyZWQgb3V0IG9mIGdhbXV0DQorDQorICAgIH0gR0FNVVRDSEFJTjsNCisNCisvLyBUaGlzIHNhbXBsZXIgZG9lcyBjb21wdXRlIGdhbXV0IGJvdW5kYXJpZXMgYnkgY29tcGFyaW5nIG9yaWdpbmFsDQorLy8gdmFsdWVzIHdpdGggYSB0cmFuc2Zvcm0gZ29pbmcgYmFjayBhbmQgZm9ydGguIFZhbHVlcyBhYm92ZSBFUlJfVEhFUkVTSE9MRA0KKy8vIG9mIG1heGltdW0gYXJlIGNvbnNpZGVyZWQgb3V0IG9mIGdhbXV0Lg0KKw0KKyNkZWZpbmUgRVJSX1RIRVJFU0hPTEQgICAgICA1DQorDQorDQorc3RhdGljDQoraW50IEdhbXV0U2FtcGxlcihyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5bXSwgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIE91dFtdLCByZWdpc3RlciB2b2lkKiBDYXJnbykNCit7DQorICAgIEdBTVVUQ0hBSU4qICB0ID0gKEdBTVVUQ0hBSU4qICkgQ2FyZ287DQorICAgIGNtc0NJRUxhYiBMYWJJbjEsIExhYk91dDE7DQorICAgIGNtc0NJRUxhYiBMYWJJbjIsIExhYk91dDI7DQorICAgIGNtc1VJbnQxNk51bWJlciBQcm9vZltjbXNNQVhDSEFOTkVMU10sIFByb29mMltjbXNNQVhDSEFOTkVMU107DQorICAgIGNtc0Zsb2F0NjROdW1iZXIgZEUxLCBkRTIsIEVycm9yUmF0aW87DQorDQorICAgIC8vIEFzc3VtZSBpbi1nYW11dCBieSBkZWZhdWx0Lg0KKyAgICBFcnJvclJhdGlvID0gMS4wOw0KKw0KKyAgICAvLyBDb252ZXJ0IGlucHV0IHRvIExhYg0KKyAgICBjbXNEb1RyYW5zZm9ybSh0IC0+IGhJbnB1dCwgSW4sICZMYWJJbjEsIDEpOw0KKw0KKyAgICAvLyBjb252ZXJ0cyBmcm9tIFBDUyB0byBjb2xvcmFudC4gVGhpcyBhbHdheXMNCisgICAgLy8gZG9lcyByZXR1cm4gaW4tZ2FtdXQgdmFsdWVzLA0KKyAgICBjbXNEb1RyYW5zZm9ybSh0IC0+IGhGb3J3YXJkLCAmTGFiSW4xLCBQcm9vZiwgMSk7DQorDQorICAgIC8vIE5vdywgZG8gdGhlIGludmVyc2UsIGZyb20gY29sb3JhbnQgdG8gUENTLg0KKyAgICBjbXNEb1RyYW5zZm9ybSh0IC0+IGhSZXZlcnNlLCBQcm9vZiwgJkxhYk91dDEsIDEpOw0KKw0KKyAgICBtZW1tb3ZlKCZMYWJJbjIsICZMYWJPdXQxLCBzaXplb2YoY21zQ0lFTGFiKSk7DQorDQorICAgIC8vIFRyeSBhZ2FpbiwgYnV0IHRoaXMgdGltZSB0YWtpbmcgQ2hlY2sgYXMgaW5wdXQNCisgICAgY21zRG9UcmFuc2Zvcm0odCAtPiBoRm9yd2FyZCwgJkxhYk91dDEsIFByb29mMiwgMSk7DQorICAgIGNtc0RvVHJhbnNmb3JtKHQgLT4gaFJldmVyc2UsIFByb29mMiwgJkxhYk91dDIsIDEpOw0KKw0KKyAgICAvLyBUYWtlIGRpZmZlcmVuY2Ugb2YgZGlyZWN0IHZhbHVlDQorICAgIGRFMSA9IGNtc0RlbHRhRSgmTGFiSW4xLCAmTGFiT3V0MSk7DQorDQorICAgIC8vIFRha2UgZGlmZmVyZW5jZSBvZiBjb252ZXJ0ZWQgdmFsdWUNCisgICAgZEUyID0gY21zRGVsdGFFKCZMYWJJbjIsICZMYWJPdXQyKTsNCisNCisNCisgICAgLy8gaWYgZEUxIGlzIHNtYWxsIGFuZCBkRTIgaXMgc21hbGwsIHZhbHVlIGlzIGxpa2VseSB0byBiZSBpbiBnYW11dA0KKyAgICBpZiAoZEUxIDwgdC0+VGhlcmVzaG9sZCAmJiBkRTIgPCB0LT5UaGVyZXNob2xkKQ0KKyAgICAgICAgT3V0WzBdID0gMDsNCisgICAgZWxzZSB7DQorDQorICAgICAgICAvLyBpZiBkRTEgaXMgc21hbGwgYW5kIGRFMiBpcyBiaWcsIHVuZGVmaW5lZC4gQXNzdW1lIGluIGdhbXV0DQorICAgICAgICBpZiAoZEUxIDwgdC0+VGhlcmVzaG9sZCAmJiBkRTIgPiB0LT5UaGVyZXNob2xkKQ0KKyAgICAgICAgICAgIE91dFswXSA9IDA7DQorICAgICAgICBlbHNlDQorICAgICAgICAgICAgLy8gZEUxIGlzIGJpZyBhbmQgZEUyIGlzIHNtYWxsLCBjbGVhcmx5IG91dCBvZiBnYW11dA0KKyAgICAgICAgICAgIGlmIChkRTEgPiB0LT5UaGVyZXNob2xkICYmIGRFMiA8IHQtPlRoZXJlc2hvbGQpDQorICAgICAgICAgICAgICAgIE91dFswXSA9IChjbXNVSW50MTZOdW1iZXIpIF9jbXNRdWlja0Zsb29yKChkRTEgLSB0LT5UaGVyZXNob2xkKSArIC41KTsNCisgICAgICAgICAgICBlbHNlICB7DQorDQorICAgICAgICAgICAgICAgIC8vIGRFMSBpcyBiaWcgYW5kIGRFMiBpcyBhbHNvIGJpZywgY291bGQgYmUgZHVlIHRvIHBlcmNlcHR1YWwgbWFwcGluZw0KKyAgICAgICAgICAgICAgICAvLyBzbyB0YWtlIGVycm9yIHJhdGlvDQorICAgICAgICAgICAgICAgIGlmIChkRTIgPT0gMC4wKQ0KKyAgICAgICAgICAgICAgICAgICAgRXJyb3JSYXRpbyA9IGRFMTsNCisgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgRXJyb3JSYXRpbyA9IGRFMSAvIGRFMjsNCisNCisgICAgICAgICAgICAgICAgaWYgKEVycm9yUmF0aW8gPiB0LT5UaGVyZXNob2xkKQ0KKyAgICAgICAgICAgICAgICAgICAgT3V0WzBdID0gKGNtc1VJbnQxNk51bWJlcikgIF9jbXNRdWlja0Zsb29yKChFcnJvclJhdGlvIC0gdC0+VGhlcmVzaG9sZCkgKyAuNSk7DQorICAgICAgICAgICAgICAgIGVsc2UNCisgICAgICAgICAgICAgICAgICAgIE91dFswXSA9IDA7DQorICAgICAgICAgICAgfQ0KKyAgICB9DQorDQorDQorICAgIHJldHVybiBUUlVFOw0KK30NCisNCisvLyBEb2VzIGNvbXB1dGUgYSBnYW11dCBMVVQgZ29pbmcgYmFjayBhbmQgZm9ydGggYWNyb3NzIHBjcyAtPiByZWxhdGl2LiBjb2xvcmltZXRyaWMgaW50ZW50IC0+IHBjcw0KKy8vIHRoZSBkRSBvYnRhaW5lZCBpcyB0aGVuIGFubm90YXRlZCBvbiB0aGUgTFVULiBWYWx1ZXMgdHJ1bHkgb3V0IG9mIGdhbXV0IGFyZSBjbGlwcGVkIHRvIGRFID0gMHhGRkZFDQorLy8gYW5kIHZhbHVlcyBjaGFuZ2VkIGFyZSBzdXBwb3NlZCB0byBiZSBoYW5kbGVkIGJ5IGFueSBnYW11dCByZW1hcHBpbmcsIHNvLCBhcmUgb3V0IG9mIGdhbXV0IGFzIHdlbGwuDQorLy8NCisvLyAqKldBUk5JTkc6IFRoaXMgYWxnb3JpdGhtIGRvZXMgYXNzdW1lIHRoYXQgZ2FtdXQgcmVtYXBwaW5nIGFsZ29yaXRobXMgZG9lcyBOT1QgbW92ZSBpbi1nYW11dCBjb2xvcnMsDQorLy8gb2YgY291cnNlLCBtYW55IHBlcmNlcHR1YWwgYW5kIHNhdHVyYXRpb24gaW50ZW50cyBkb2VzIG5vdCB3b3JrIGluIHN1Y2ggd2F5LCBidXQgcmVsYXRpdi4gb25lcyBzaG91bGQuDQorDQorY21zUGlwZWxpbmUqIF9jbXNDcmVhdGVHYW11dENoZWNrUGlwZWxpbmUoY21zQ29udGV4dCBDb250ZXh0SUQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgaFByb2ZpbGVzW10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zQm9vbCAgQlBDW10sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEludGVudHNbXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEFkYXB0YXRpb25TdGF0ZXNbXSwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgbkdhbXV0UENTcG9zaXRpb24sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgaEdhbXV0KQ0KK3sNCisgICAgY21zSFBST0ZJTEUgaExhYjsNCisgICAgY21zUGlwZWxpbmUqIEdhbXV0Ow0KKyAgICBjbXNTdGFnZSogQ0xVVDsNCisgICAgY21zVUludDMyTnVtYmVyIGR3Rm9ybWF0Ow0KKyAgICBHQU1VVENIQUlOIENoYWluOw0KKyAgICBpbnQgbkNoYW5uZWxzLCBuR3JpZHBvaW50czsNCisgICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBDb2xvclNwYWNlOw0KKyAgICBjbXNVSW50MzJOdW1iZXIgaTsNCisgICAgY21zSFBST0ZJTEUgUHJvZmlsZUxpc3RbMjU2XTsNCisgICAgY21zQm9vbCAgICAgQlBDTGlzdFsyNTZdOw0KKyAgICBjbXNGbG9hdDY0TnVtYmVyIEFkYXB0YXRpb25MaXN0WzI1Nl07DQorICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnRMaXN0WzI1Nl07DQorDQorICAgIG1lbXNldCgmQ2hhaW4sIDAsIHNpemVvZihHQU1VVENIQUlOKSk7DQorDQorDQorICAgIGlmIChuR2FtdXRQQ1Nwb3NpdGlvbiA8PSAwIHx8IG5HYW11dFBDU3Bvc2l0aW9uID4gMjU1KSB7DQorICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX1JBTkdFLCAiV3JvbmcgcG9zaXRpb24gb2YgUENTLiAxLi4yNTUgZXhwZWN0ZWQsICVkIGZvdW5kLiIsIG5HYW11dFBDU3Bvc2l0aW9uKTsNCisgICAgICAgIHJldHVybiBOVUxMOw0KKyAgICB9DQorDQorICAgIGhMYWIgPSBjbXNDcmVhdGVMYWI0UHJvZmlsZVRIUihDb250ZXh0SUQsIE5VTEwpOw0KKyAgICBpZiAoaExhYiA9PSBOVUxMKSByZXR1cm4gTlVMTDsNCisNCisNCisgICAgLy8gVGhlIGZpZ3VyZSBvZiBtZXJpdC4gT24gbWF0cml4LXNoYXBlciBwcm9maWxlcywgc2hvdWxkIGJlIGFsbW9zdCB6ZXJvIGFzDQorICAgIC8vIHRoZSBjb252ZXJzaW9uIGlzIHByZXR0eSBleGFjdC4gT24gTFVUIGJhc2VkIHByb2ZpbGVzLCBkaWZmZXJlbnQgcmVzb2x1dGlvbnMNCisgICAgLy8gb2YgaW5wdXQgYW5kIG91dHB1dCBDTFVUIG1heSByZXN1bHQgaW4gZGlmZmVyZW5jZXMuDQorDQorICAgIGlmIChjbXNJc01hdHJpeFNoYXBlcihoR2FtdXQpKSB7DQorDQorICAgICAgICBDaGFpbi5UaGVyZXNob2xkID0gMS4wOw0KKyAgICB9DQorICAgIGVsc2Ugew0KKyAgICAgICAgQ2hhaW4uVGhlcmVzaG9sZCA9IEVSUl9USEVSRVNIT0xEOw0KKyAgICB9DQorDQorDQorICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgcGFyYW1ldGVycw0KKyAgICBmb3IgKGk9MDsgaSA8IG5HYW11dFBDU3Bvc2l0aW9uOyBpKyspIHsNCisgICAgICAgIFByb2ZpbGVMaXN0W2ldICAgID0gaFByb2ZpbGVzW2ldOw0KKyAgICAgICAgQlBDTGlzdFtpXSAgICAgICAgPSBCUENbaV07DQorICAgICAgICBBZGFwdGF0aW9uTGlzdFtpXSA9IEFkYXB0YXRpb25TdGF0ZXNbaV07DQorICAgICAgICBJbnRlbnRMaXN0W2ldICAgICA9IEludGVudHNbaV07DQorICAgIH0NCisNCisgICAgLy8gRmlsbCBMYWIgaWRlbnRpdHkNCisgICAgUHJvZmlsZUxpc3RbbkdhbXV0UENTcG9zaXRpb25dID0gaExhYjsNCisgICAgQlBDTGlzdFtuR2FtdXRQQ1Nwb3NpdGlvbl0gPSAwOw0KKyAgICBBZGFwdGF0aW9uTGlzdFtuR2FtdXRQQ1Nwb3NpdGlvbl0gPSAxLjA7DQorICAgIEludGVudExpc3RbbkdhbXV0UENTcG9zaXRpb25dID0gSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQzsNCisNCisNCisgICAgQ29sb3JTcGFjZSAgPSBjbXNHZXRDb2xvclNwYWNlKGhHYW11dCk7DQorDQorICAgIG5DaGFubmVscyAgID0gY21zQ2hhbm5lbHNPZihDb2xvclNwYWNlKTsNCisgICAgbkdyaWRwb2ludHMgPSBfY21zUmVhc29uYWJsZUdyaWRwb2ludHNCeUNvbG9yc3BhY2UoQ29sb3JTcGFjZSwgY21zRkxBR1NfSElHSFJFU1BSRUNBTEMpOw0KKyAgICBkd0Zvcm1hdCAgICA9IChDSEFOTkVMU19TSChuQ2hhbm5lbHMpfEJZVEVTX1NIKDIpKTsNCisNCisgICAgLy8gMTYgYml0cyB0byBMYWIgZG91YmxlDQorICAgIENoYWluLmhJbnB1dCA9IGNtc0NyZWF0ZUV4dGVuZGVkVHJhbnNmb3JtKENvbnRleHRJRCwNCisgICAgICAgIG5HYW11dFBDU3Bvc2l0aW9uICsgMSwNCisgICAgICAgIFByb2ZpbGVMaXN0LA0KKyAgICAgICAgQlBDTGlzdCwNCisgICAgICAgIEludGVudExpc3QsDQorICAgICAgICBBZGFwdGF0aW9uTGlzdCwNCisgICAgICAgIE5VTEwsIDAsDQorICAgICAgICBkd0Zvcm1hdCwgVFlQRV9MYWJfREJMLA0KKyAgICAgICAgY21zRkxBR1NfTk9DQUNIRSk7DQorDQorDQorICAgIC8vIERvZXMgY3JlYXRlIHRoZSBmb3J3YXJkIHN0ZXAuIExhYiBkb3VibGUgdG8gZGV2aWNlDQorICAgIGR3Rm9ybWF0ICAgID0gKENIQU5ORUxTX1NIKG5DaGFubmVscyl8QllURVNfU0goMikpOw0KKyAgICBDaGFpbi5oRm9yd2FyZCA9IGNtc0NyZWF0ZVRyYW5zZm9ybVRIUihDb250ZXh0SUQsDQorICAgICAgICBoTGFiLCBUWVBFX0xhYl9EQkwsDQorICAgICAgICBoR2FtdXQsIGR3Rm9ybWF0LA0KKyAgICAgICAgSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQywNCisgICAgICAgIGNtc0ZMQUdTX05PQ0FDSEUpOw0KKw0KKyAgICAvLyBEb2VzIGNyZWF0ZSB0aGUgYmFja3dhcmRzIHN0ZXANCisgICAgQ2hhaW4uaFJldmVyc2UgPSBjbXNDcmVhdGVUcmFuc2Zvcm1USFIoQ29udGV4dElELCBoR2FtdXQsIGR3Rm9ybWF0LA0KKyAgICAgICAgaExhYiwgVFlQRV9MYWJfREJMLA0KKyAgICAgICAgSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQywNCisgICAgICAgIGNtc0ZMQUdTX05PQ0FDSEUpOw0KKw0KKw0KKyAgICAvLyBBbGwgb2s/DQorICAgIGlmIChDaGFpbi5oSW5wdXQgJiYgQ2hhaW4uaEZvcndhcmQgJiYgQ2hhaW4uaFJldmVyc2UpIHsNCisNCisgICAgICAgIC8vIEdvIG9uLCB0cnkgdG8gY29tcHV0ZSBnYW11dCBMVVQgZnJvbSBQQ1MuIFRoaXMgY29uc2lzdCBvbiBhIHNpbmdsZSBjaGFubmVsIGNvbnRhaW5pbmcNCisgICAgICAgIC8vIGRFIHdoZW4gZG9pbmcgYSB0cmFuc2Zvcm0gYmFjayBhbmQgZm9ydGggb24gdGhlIGNvbG9yaW1ldHJpYyBpbnRlbnQuDQorDQorICAgICAgICBHYW11dCA9IGNtc1BpcGVsaW5lQWxsb2MoQ29udGV4dElELCAzLCAxKTsNCisgICAgICAgIGlmIChHYW11dCAhPSBOVUxMKSB7DQorDQorICAgICAgICAgICAgQ0xVVCA9IGNtc1N0YWdlQWxsb2NDTHV0MTZiaXQoQ29udGV4dElELCBuR3JpZHBvaW50cywgbkNoYW5uZWxzLCAxLCBOVUxMKTsNCisgICAgICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoR2FtdXQsIGNtc0FUX0JFR0lOLCBDTFVUKSkgew0KKyAgICAgICAgICAgICAgICBjbXNQaXBlbGluZUZyZWUoR2FtdXQpOw0KKyAgICAgICAgICAgICAgICBHYW11dCA9IE5VTEw7DQorICAgICAgICAgICAgfSANCisgICAgICAgICAgICBlbHNlIHsNCisgICAgICAgICAgICAgICAgY21zU3RhZ2VTYW1wbGVDTHV0MTZiaXQoQ0xVVCwgR2FtdXRTYW1wbGVyLCAodm9pZCopICZDaGFpbiwgMCk7DQorICAgICAgICAgICAgfQ0KKyAgICAgICAgfQ0KKyAgICB9DQorICAgIGVsc2UNCisgICAgICAgIEdhbXV0ID0gTlVMTDsgICAvLyBEaWRuJ3Qgd29yay4uLg0KKw0KKyAgICAvLyBGcmVlIGFsbCBuZWVkZWQgc3R1ZmYuDQorICAgIGlmIChDaGFpbi5oSW5wdXQpICAgY21zRGVsZXRlVHJhbnNmb3JtKENoYWluLmhJbnB1dCk7DQorICAgIGlmIChDaGFpbi5oRm9yd2FyZCkgY21zRGVsZXRlVHJhbnNmb3JtKENoYWluLmhGb3J3YXJkKTsNCisgICAgaWYgKENoYWluLmhSZXZlcnNlKSBjbXNEZWxldGVUcmFuc2Zvcm0oQ2hhaW4uaFJldmVyc2UpOw0KKyAgICBpZiAoaExhYikgY21zQ2xvc2VQcm9maWxlKGhMYWIpOw0KKw0KKyAgICAvLyBBbmQgcmV0dXJuIGNvbXB1dGVkIGh1bGwNCisgICAgcmV0dXJuIEdhbXV0Ow0KK30NCisNCisvLyBUb3RhbCBBcmVhIENvdmVyYWdlIGVzdGltYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KK3R5cGVkZWYgc3RydWN0IHsNCisgICAgY21zVUludDMyTnVtYmVyICBuT3V0cHV0Q2hhbnM7DQorICAgIGNtc0hUUkFOU0ZPUk0gICAgaFJvdW5kVHJpcDsNCisgICAgY21zRmxvYXQzMk51bWJlciBNYXhUQUM7DQorICAgIGNtc0Zsb2F0MzJOdW1iZXIgTWF4SW5wdXRbY21zTUFYQ0hBTk5FTFNdOw0KKw0KK30gY21zVEFDZXN0aW1hdG9yOw0KKw0KKw0KKy8vIFRoaXMgY2FsbGJhY2sganVzdCBhY2NvdW50cyB0aGUgbWF4aW11bSBpbmsgZHJvcHBlZCBpbiB0aGUgZ2l2ZW4gbm9kZS4gSXQgZG9lcyBub3QgcG9wdWxhdGUgYW55DQorLy8gbWVtb3J5LCBhcyB0aGUgZGVzdGluYXRpb24gdGFibGUgaXMgTlVMTC4gSXRzIG9ubHkgcHVycG9zZSBpdCB0byBrbm93IHRoZSBnbG9iYWwgbWF4aW11bS4NCitzdGF0aWMNCitpbnQgRXN0aW1hdGVUQUMocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIEluW10sIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciBPdXRbXSwgcmVnaXN0ZXIgdm9pZCAqIENhcmdvKQ0KK3sNCisgICAgY21zVEFDZXN0aW1hdG9yKiBicCA9IChjbXNUQUNlc3RpbWF0b3IqKSBDYXJnbzsNCisgICAgY21zRmxvYXQzMk51bWJlciBSb3VuZFRyaXBbY21zTUFYQ0hBTk5FTFNdOw0KKyAgICBjbXNVSW50MzJOdW1iZXIgaTsNCisgICAgY21zRmxvYXQzMk51bWJlciBTdW07DQorDQorDQorICAgIC8vIEV2YWx1YXRlIHRoZSB4Zm9ybQ0KKyAgICBjbXNEb1RyYW5zZm9ybShicC0+aFJvdW5kVHJpcCwgSW4sIFJvdW5kVHJpcCwgMSk7DQorDQorICAgIC8vIEFsbCBhbGwgYW1vdW50cyBvZiBpbmsNCisgICAgZm9yIChTdW09MCwgaT0wOyBpIDwgYnAgLT5uT3V0cHV0Q2hhbnM7IGkrKykNCisgICAgICAgICAgICBTdW0gKz0gUm91bmRUcmlwW2ldOw0KKw0KKyAgICAvLyBJZiBhYm92ZSBtYXhpbXVtLCBrZWVwIHRyYWNrIG9mIGlucHV0IHZhbHVlcw0KKyAgICBpZiAoU3VtID4gYnAgLT5NYXhUQUMpIHsNCisNCisgICAgICAgICAgICBicCAtPk1heFRBQyA9IFN1bTsNCisNCisgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IGJwIC0+bk91dHB1dENoYW5zOyBpKyspIHsNCisgICAgICAgICAgICAgICAgYnAgLT5NYXhJbnB1dFtpXSA9IEluW2ldOw0KKyAgICAgICAgICAgIH0NCisgICAgfQ0KKw0KKyAgICByZXR1cm4gVFJVRTsNCisNCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihPdXQpOw0KK30NCisNCisNCisvLyBEZXRlY3QgVG90YWwgYXJlYSBjb3ZlcmFnZSBvZiB0aGUgcHJvZmlsZQ0KK2Ntc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIGNtc0RldGVjdFRBQyhjbXNIUFJPRklMRSBoUHJvZmlsZSkNCit7DQorICAgIGNtc1RBQ2VzdGltYXRvciBicDsNCisgICAgY21zVUludDMyTnVtYmVyIGR3Rm9ybWF0dGVyOw0KKyAgICBjbXNVSW50MzJOdW1iZXIgR3JpZFBvaW50c1tNQVhfSU5QVVRfRElNRU5TSU9OU107DQorICAgIGNtc0hQUk9GSUxFIGhMYWI7DQorICAgIGNtc0NvbnRleHQgQ29udGV4dElEID0gY21zR2V0UHJvZmlsZUNvbnRleHRJRChoUHJvZmlsZSk7DQorDQorICAgIC8vIFRBQyBvbmx5IHdvcmtzIG9uIG91dHB1dCBwcm9maWxlcw0KKyAgICBpZiAoY21zR2V0RGV2aWNlQ2xhc3MoaFByb2ZpbGUpICE9IGNtc1NpZ091dHB1dENsYXNzKSB7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKw0KKyAgICAvLyBDcmVhdGUgYSBmYWtlIGZvcm1hdHRlciBmb3IgcmVzdWx0DQorICAgIGR3Rm9ybWF0dGVyID0gY21zRm9ybWF0dGVyRm9yQ29sb3JzcGFjZU9mUHJvZmlsZShoUHJvZmlsZSwgNCwgVFJVRSk7DQorDQorICAgIGJwLm5PdXRwdXRDaGFucyA9IFRfQ0hBTk5FTFMoZHdGb3JtYXR0ZXIpOw0KKyAgICBicC5NYXhUQUMgPSAwOyAgICAvLyBJbml0aWFsIFRBQyBpcyAwDQorDQorICAgIC8vICBmb3Igc2FmZXR5DQorICAgIGlmIChicC5uT3V0cHV0Q2hhbnMgPj0gY21zTUFYQ0hBTk5FTFMpIHJldHVybiAwOw0KKw0KKyAgICBoTGFiID0gY21zQ3JlYXRlTGFiNFByb2ZpbGVUSFIoQ29udGV4dElELCBOVUxMKTsNCisgICAgaWYgKGhMYWIgPT0gTlVMTCkgcmV0dXJuIDA7DQorICAgIC8vIFNldHVwIGEgcm91bmR0cmlwIG9uIHBlcmNlcHR1YWwgaW50ZW50IGluIG91dHB1dCBwcm9maWxlIGZvciBUQUMgZXN0aW1hdGlvbg0KKyAgICBicC5oUm91bmRUcmlwID0gY21zQ3JlYXRlVHJhbnNmb3JtVEhSKENvbnRleHRJRCwgaExhYiwgVFlQRV9MYWJfMTYsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFByb2ZpbGUsIGR3Rm9ybWF0dGVyLCBJTlRFTlRfUEVSQ0VQVFVBTCwgY21zRkxBR1NfTk9PUFRJTUlaRXxjbXNGTEFHU19OT0NBQ0hFKTsNCisNCisgICAgY21zQ2xvc2VQcm9maWxlKGhMYWIpOw0KKyAgICBpZiAoYnAuaFJvdW5kVHJpcCA9PSBOVUxMKSByZXR1cm4gMDsNCisNCisgICAgLy8gRm9yIEwqIHdlIG9ubHkgbmVlZCBibGFjayBhbmQgd2hpdGUuIEZvciBDKiB3ZSBuZWVkIG1hbnkgcG9pbnRzDQorICAgIEdyaWRQb2ludHNbMF0gPSA2Ow0KKyAgICBHcmlkUG9pbnRzWzFdID0gNzQ7DQorICAgIEdyaWRQb2ludHNbMl0gPSA3NDsNCisNCisNCisgICAgaWYgKCFjbXNTbGljZVNwYWNlMTYoMywgR3JpZFBvaW50cywgRXN0aW1hdGVUQUMsICZicCkpIHsNCisgICAgICAgIGJwLk1heFRBQyA9IDA7DQorICAgIH0NCisNCisgICAgY21zRGVsZXRlVHJhbnNmb3JtKGJwLmhSb3VuZFRyaXApOw0KKw0KKyAgICAvLyBSZXN1bHRzIGluICUNCisgICAgcmV0dXJuIGJwLk1heFRBQzsNCit9DQorDQorDQorLy8gQ2FyZWZ1bGx5LCAgY2xhbXAgb24gQ0lFTGFiIHNwYWNlLg0KKw0KK2Ntc0Jvb2wgQ01TRVhQT1JUIGNtc0Rlc2F0dXJhdGVMYWIoY21zQ0lFTGFiKiBMYWIsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYW1heCwgZG91YmxlIGFtaW4sDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYm1heCwgZG91YmxlIGJtaW4pDQorew0KKw0KKyAgICAvLyBXaG9sZSBMdW1hIHN1cmZhY2UgdG8gemVybw0KKw0KKyAgICBpZiAoTGFiIC0+IEwgPCAwKSB7DQorDQorICAgICAgICBMYWItPiBMID0gTGFiLT5hID0gTGFiLT4gYiA9IDAuMDsNCisgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgfQ0KKw0KKyAgICAvLyBDbGFtcCB3aGl0ZSwgRElTQ0FSRCBISUdITElHSFRTLiBUaGlzIGlzIGRvbmUNCisgICAgLy8gaW4gc3VjaCB3YXkgYmVjYXVzZSBpY2Mgc3BlYyBkb2Vzbid0IGFsbG93IHRoZQ0KKyAgICAvLyB1c2Ugb2YgTD4xMDAgYXMgYSBoaWdobGlnaHQgbWVhbnMuDQorDQorICAgIGlmIChMYWItPkwgPiAxMDApDQorICAgICAgICBMYWIgLT4gTCA9IDEwMDsNCisNCisgICAgLy8gQ2hlY2sgb3V0IGdhbXV0IHByaXNtLCBvbiBhLCBiIGZhY2VzDQorDQorICAgIGlmIChMYWIgLT4gYSA8IGFtaW4gfHwgTGFiLT5hID4gYW1heHx8DQorICAgICAgICBMYWIgLT4gYiA8IGJtaW4gfHwgTGFiLT5iID4gYm1heCkgew0KKw0KKyAgICAgICAgICAgIGNtc0NJRUxDaCBMQ2g7DQorICAgICAgICAgICAgZG91YmxlIGgsIHNsb3BlOw0KKw0KKyAgICAgICAgICAgIC8vIEZhbGxzIG91dHNpZGUgYSwgYiBsaW1pdHMuIFRyYW5zcG9ydHMgdG8gTENoIHNwYWNlLA0KKyAgICAgICAgICAgIC8vIGFuZCB0aGVuIGRvIHRoZSBjbGlwcGluZw0KKw0KKw0KKyAgICAgICAgICAgIGlmIChMYWIgLT4gYSA9PSAwLjApIHsgLy8gSXMgaHVlIGV4YWN0bHkgOTA/DQorDQorICAgICAgICAgICAgICAgIC8vIGF0YW4gd2lsbCBub3Qgd29yaywgc28gY2xhbXAgaGVyZQ0KKyAgICAgICAgICAgICAgICBMYWIgLT4gYiA9IExhYi0+YiA8IDAgPyBibWluIDogYm1heDsNCisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7DQorICAgICAgICAgICAgfQ0KKw0KKyAgICAgICAgICAgIGNtc0xhYjJMQ2goJkxDaCwgTGFiKTsNCisNCisgICAgICAgICAgICBzbG9wZSA9IExhYiAtPiBiIC8gTGFiIC0+IGE7DQorICAgICAgICAgICAgaCA9IExDaC5oOw0KKw0KKyAgICAgICAgICAgIC8vIFRoZXJlIGFyZSA0IHpvbmVzDQorDQorICAgICAgICAgICAgaWYgKChoID49IDAuICYmIGggPCA0NS4pIHx8DQorICAgICAgICAgICAgICAgIChoID49IDMxNSAmJiBoIDw9IDM2MC4pKSB7DQorDQorICAgICAgICAgICAgICAgICAgICAvLyBjbGlwIGJ5IGFtYXgNCisgICAgICAgICAgICAgICAgICAgIExhYiAtPiBhID0gYW1heDsNCisgICAgICAgICAgICAgICAgICAgIExhYiAtPiBiID0gYW1heCAqIHNsb3BlOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgIGlmIChoID49IDQ1LiAmJiBoIDwgMTM1LikNCisgICAgICAgICAgICAgICAgew0KKyAgICAgICAgICAgICAgICAgICAgLy8gY2xpcCBieSBibWF4DQorICAgICAgICAgICAgICAgICAgICBMYWIgLT4gYiA9IGJtYXg7DQorICAgICAgICAgICAgICAgICAgICBMYWIgLT4gYSA9IGJtYXggLyBzbG9wZTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBlbHNlDQorICAgICAgICAgICAgICAgICAgICBpZiAoaCA+PSAxMzUuICYmIGggPCAyMjUuKSB7DQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xpcCBieSBhbWluDQorICAgICAgICAgICAgICAgICAgICAgICAgTGFiIC0+IGEgPSBhbWluOw0KKyAgICAgICAgICAgICAgICAgICAgICAgIExhYiAtPiBiID0gYW1pbiAqIHNsb3BlOw0KKw0KKyAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoID49IDIyNS4gJiYgaCA8IDMxNS4pIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xpcCBieSBibWluDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhYiAtPiBiID0gYm1pbjsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFiIC0+IGEgPSBibWluIC8gc2xvcGU7DQorICAgICAgICAgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgIHsNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoMCwgY21zRVJST1JfUkFOR0UsICJJbnZhbGlkIGFuZ2xlIik7DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsNCisgICAgICAgICAgICAgICAgICAgICAgICB9DQorDQorICAgIH0NCisNCisgICAgcmV0dXJuIFRSVUU7DQorfQ0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2hhbGYuYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2hhbGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGQ0ZTM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zaGFsZi5jCkBAIC0wLDAgKzEsNTM1IEBACisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KKy8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNiBNYXJ0aSBNYXJpYSBTYWd1ZXIKKy8vCisvLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKy8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKy8vIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKy8vIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorLy8gYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlCisvLyBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorLy8KKy8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisvLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKy8vCisvLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKy8vIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTworLy8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKy8vIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKKy8vIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKy8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLworI2luY2x1ZGUgImxjbXMyX2ludGVybmFsLmgiCisKKyNpZm5kZWYgQ01TX05PX0hBTEZfU1VQUE9SVCAKKworLy8gVGhpcyBjb2RlIGlzIGluc3BpcmVkIGluIHRoZSBwYXBlciAiRmFzdCBIYWxmIEZsb2F0IENvbnZlcnNpb25zIgorLy8gYnkgSmVyb2VuIHZhbiBkZXIgWmlqcAorCitzdGF0aWMgY21zVUludDMyTnVtYmVyIE1hbnRpc3NhWzIwNDhdID0geworCisweDAwMDAwMDAwLCAweDMzODAwMDAwLCAweDM0MDAwMDAwLCAweDM0NDAwMDAwLCAweDM0ODAwMDAwLCAweDM0YTAwMDAwLAorMHgzNGMwMDAwMCwgMHgzNGUwMDAwMCwgMHgzNTAwMDAwMCwgMHgzNTEwMDAwMCwgMHgzNTIwMDAwMCwgMHgzNTMwMDAwMCwKKzB4MzU0MDAwMDAsIDB4MzU1MDAwMDAsIDB4MzU2MDAwMDAsIDB4MzU3MDAwMDAsIDB4MzU4MDAwMDAsIDB4MzU4ODAwMDAsCisweDM1OTAwMDAwLCAweDM1OTgwMDAwLCAweDM1YTAwMDAwLCAweDM1YTgwMDAwLCAweDM1YjAwMDAwLCAweDM1YjgwMDAwLAorMHgzNWMwMDAwMCwgMHgzNWM4MDAwMCwgMHgzNWQwMDAwMCwgMHgzNWQ4MDAwMCwgMHgzNWUwMDAwMCwgMHgzNWU4MDAwMCwKKzB4MzVmMDAwMDAsIDB4MzVmODAwMDAsIDB4MzYwMDAwMDAsIDB4MzYwNDAwMDAsIDB4MzYwODAwMDAsIDB4MzYwYzAwMDAsCisweDM2MTAwMDAwLCAweDM2MTQwMDAwLCAweDM2MTgwMDAwLCAweDM2MWMwMDAwLCAweDM2MjAwMDAwLCAweDM2MjQwMDAwLAorMHgzNjI4MDAwMCwgMHgzNjJjMDAwMCwgMHgzNjMwMDAwMCwgMHgzNjM0MDAwMCwgMHgzNjM4MDAwMCwgMHgzNjNjMDAwMCwKKzB4MzY0MDAwMDAsIDB4MzY0NDAwMDAsIDB4MzY0ODAwMDAsIDB4MzY0YzAwMDAsIDB4MzY1MDAwMDAsIDB4MzY1NDAwMDAsCisweDM2NTgwMDAwLCAweDM2NWMwMDAwLCAweDM2NjAwMDAwLCAweDM2NjQwMDAwLCAweDM2NjgwMDAwLCAweDM2NmMwMDAwLAorMHgzNjcwMDAwMCwgMHgzNjc0MDAwMCwgMHgzNjc4MDAwMCwgMHgzNjdjMDAwMCwgMHgzNjgwMDAwMCwgMHgzNjgyMDAwMCwKKzB4MzY4NDAwMDAsIDB4MzY4NjAwMDAsIDB4MzY4ODAwMDAsIDB4MzY4YTAwMDAsIDB4MzY4YzAwMDAsIDB4MzY4ZTAwMDAsCisweDM2OTAwMDAwLCAweDM2OTIwMDAwLCAweDM2OTQwMDAwLCAweDM2OTYwMDAwLCAweDM2OTgwMDAwLCAweDM2OWEwMDAwLAorMHgzNjljMDAwMCwgMHgzNjllMDAwMCwgMHgzNmEwMDAwMCwgMHgzNmEyMDAwMCwgMHgzNmE0MDAwMCwgMHgzNmE2MDAwMCwKKzB4MzZhODAwMDAsIDB4MzZhYTAwMDAsIDB4MzZhYzAwMDAsIDB4MzZhZTAwMDAsIDB4MzZiMDAwMDAsIDB4MzZiMjAwMDAsCisweDM2YjQwMDAwLCAweDM2YjYwMDAwLCAweDM2YjgwMDAwLCAweDM2YmEwMDAwLCAweDM2YmMwMDAwLCAweDM2YmUwMDAwLAorMHgzNmMwMDAwMCwgMHgzNmMyMDAwMCwgMHgzNmM0MDAwMCwgMHgzNmM2MDAwMCwgMHgzNmM4MDAwMCwgMHgzNmNhMDAwMCwKKzB4MzZjYzAwMDAsIDB4MzZjZTAwMDAsIDB4MzZkMDAwMDAsIDB4MzZkMjAwMDAsIDB4MzZkNDAwMDAsIDB4MzZkNjAwMDAsCisweDM2ZDgwMDAwLCAweDM2ZGEwMDAwLCAweDM2ZGMwMDAwLCAweDM2ZGUwMDAwLCAweDM2ZTAwMDAwLCAweDM2ZTIwMDAwLAorMHgzNmU0MDAwMCwgMHgzNmU2MDAwMCwgMHgzNmU4MDAwMCwgMHgzNmVhMDAwMCwgMHgzNmVjMDAwMCwgMHgzNmVlMDAwMCwKKzB4MzZmMDAwMDAsIDB4MzZmMjAwMDAsIDB4MzZmNDAwMDAsIDB4MzZmNjAwMDAsIDB4MzZmODAwMDAsIDB4MzZmYTAwMDAsCisweDM2ZmMwMDAwLCAweDM2ZmUwMDAwLCAweDM3MDAwMDAwLCAweDM3MDEwMDAwLCAweDM3MDIwMDAwLCAweDM3MDMwMDAwLAorMHgzNzA0MDAwMCwgMHgzNzA1MDAwMCwgMHgzNzA2MDAwMCwgMHgzNzA3MDAwMCwgMHgzNzA4MDAwMCwgMHgzNzA5MDAwMCwKKzB4MzcwYTAwMDAsIDB4MzcwYjAwMDAsIDB4MzcwYzAwMDAsIDB4MzcwZDAwMDAsIDB4MzcwZTAwMDAsIDB4MzcwZjAwMDAsCisweDM3MTAwMDAwLCAweDM3MTEwMDAwLCAweDM3MTIwMDAwLCAweDM3MTMwMDAwLCAweDM3MTQwMDAwLCAweDM3MTUwMDAwLAorMHgzNzE2MDAwMCwgMHgzNzE3MDAwMCwgMHgzNzE4MDAwMCwgMHgzNzE5MDAwMCwgMHgzNzFhMDAwMCwgMHgzNzFiMDAwMCwKKzB4MzcxYzAwMDAsIDB4MzcxZDAwMDAsIDB4MzcxZTAwMDAsIDB4MzcxZjAwMDAsIDB4MzcyMDAwMDAsIDB4MzcyMTAwMDAsCisweDM3MjIwMDAwLCAweDM3MjMwMDAwLCAweDM3MjQwMDAwLCAweDM3MjUwMDAwLCAweDM3MjYwMDAwLCAweDM3MjcwMDAwLAorMHgzNzI4MDAwMCwgMHgzNzI5MDAwMCwgMHgzNzJhMDAwMCwgMHgzNzJiMDAwMCwgMHgzNzJjMDAwMCwgMHgzNzJkMDAwMCwKKzB4MzcyZTAwMDAsIDB4MzcyZjAwMDAsIDB4MzczMDAwMDAsIDB4MzczMTAwMDAsIDB4MzczMjAwMDAsIDB4MzczMzAwMDAsCisweDM3MzQwMDAwLCAweDM3MzUwMDAwLCAweDM3MzYwMDAwLCAweDM3MzcwMDAwLCAweDM3MzgwMDAwLCAweDM3MzkwMDAwLAorMHgzNzNhMDAwMCwgMHgzNzNiMDAwMCwgMHgzNzNjMDAwMCwgMHgzNzNkMDAwMCwgMHgzNzNlMDAwMCwgMHgzNzNmMDAwMCwKKzB4Mzc0MDAwMDAsIDB4Mzc0MTAwMDAsIDB4Mzc0MjAwMDAsIDB4Mzc0MzAwMDAsIDB4Mzc0NDAwMDAsIDB4Mzc0NTAwMDAsCisweDM3NDYwMDAwLCAweDM3NDcwMDAwLCAweDM3NDgwMDAwLCAweDM3NDkwMDAwLCAweDM3NGEwMDAwLCAweDM3NGIwMDAwLAorMHgzNzRjMDAwMCwgMHgzNzRkMDAwMCwgMHgzNzRlMDAwMCwgMHgzNzRmMDAwMCwgMHgzNzUwMDAwMCwgMHgzNzUxMDAwMCwKKzB4Mzc1MjAwMDAsIDB4Mzc1MzAwMDAsIDB4Mzc1NDAwMDAsIDB4Mzc1NTAwMDAsIDB4Mzc1NjAwMDAsIDB4Mzc1NzAwMDAsCisweDM3NTgwMDAwLCAweDM3NTkwMDAwLCAweDM3NWEwMDAwLCAweDM3NWIwMDAwLCAweDM3NWMwMDAwLCAweDM3NWQwMDAwLAorMHgzNzVlMDAwMCwgMHgzNzVmMDAwMCwgMHgzNzYwMDAwMCwgMHgzNzYxMDAwMCwgMHgzNzYyMDAwMCwgMHgzNzYzMDAwMCwKKzB4Mzc2NDAwMDAsIDB4Mzc2NTAwMDAsIDB4Mzc2NjAwMDAsIDB4Mzc2NzAwMDAsIDB4Mzc2ODAwMDAsIDB4Mzc2OTAwMDAsCisweDM3NmEwMDAwLCAweDM3NmIwMDAwLCAweDM3NmMwMDAwLCAweDM3NmQwMDAwLCAweDM3NmUwMDAwLCAweDM3NmYwMDAwLAorMHgzNzcwMDAwMCwgMHgzNzcxMDAwMCwgMHgzNzcyMDAwMCwgMHgzNzczMDAwMCwgMHgzNzc0MDAwMCwgMHgzNzc1MDAwMCwKKzB4Mzc3NjAwMDAsIDB4Mzc3NzAwMDAsIDB4Mzc3ODAwMDAsIDB4Mzc3OTAwMDAsIDB4Mzc3YTAwMDAsIDB4Mzc3YjAwMDAsCisweDM3N2MwMDAwLCAweDM3N2QwMDAwLCAweDM3N2UwMDAwLCAweDM3N2YwMDAwLCAweDM3ODAwMDAwLCAweDM3ODA4MDAwLAorMHgzNzgxMDAwMCwgMHgzNzgxODAwMCwgMHgzNzgyMDAwMCwgMHgzNzgyODAwMCwgMHgzNzgzMDAwMCwgMHgzNzgzODAwMCwKKzB4Mzc4NDAwMDAsIDB4Mzc4NDgwMDAsIDB4Mzc4NTAwMDAsIDB4Mzc4NTgwMDAsIDB4Mzc4NjAwMDAsIDB4Mzc4NjgwMDAsCisweDM3ODcwMDAwLCAweDM3ODc4MDAwLCAweDM3ODgwMDAwLCAweDM3ODg4MDAwLCAweDM3ODkwMDAwLCAweDM3ODk4MDAwLAorMHgzNzhhMDAwMCwgMHgzNzhhODAwMCwgMHgzNzhiMDAwMCwgMHgzNzhiODAwMCwgMHgzNzhjMDAwMCwgMHgzNzhjODAwMCwKKzB4Mzc4ZDAwMDAsIDB4Mzc4ZDgwMDAsIDB4Mzc4ZTAwMDAsIDB4Mzc4ZTgwMDAsIDB4Mzc4ZjAwMDAsIDB4Mzc4ZjgwMDAsCisweDM3OTAwMDAwLCAweDM3OTA4MDAwLCAweDM3OTEwMDAwLCAweDM3OTE4MDAwLCAweDM3OTIwMDAwLCAweDM3OTI4MDAwLAorMHgzNzkzMDAwMCwgMHgzNzkzODAwMCwgMHgzNzk0MDAwMCwgMHgzNzk0ODAwMCwgMHgzNzk1MDAwMCwgMHgzNzk1ODAwMCwKKzB4Mzc5NjAwMDAsIDB4Mzc5NjgwMDAsIDB4Mzc5NzAwMDAsIDB4Mzc5NzgwMDAsIDB4Mzc5ODAwMDAsIDB4Mzc5ODgwMDAsCisweDM3OTkwMDAwLCAweDM3OTk4MDAwLCAweDM3OWEwMDAwLCAweDM3OWE4MDAwLCAweDM3OWIwMDAwLCAweDM3OWI4MDAwLAorMHgzNzljMDAwMCwgMHgzNzljODAwMCwgMHgzNzlkMDAwMCwgMHgzNzlkODAwMCwgMHgzNzllMDAwMCwgMHgzNzllODAwMCwKKzB4Mzc5ZjAwMDAsIDB4Mzc5ZjgwMDAsIDB4MzdhMDAwMDAsIDB4MzdhMDgwMDAsIDB4MzdhMTAwMDAsIDB4MzdhMTgwMDAsCisweDM3YTIwMDAwLCAweDM3YTI4MDAwLCAweDM3YTMwMDAwLCAweDM3YTM4MDAwLCAweDM3YTQwMDAwLCAweDM3YTQ4MDAwLAorMHgzN2E1MDAwMCwgMHgzN2E1ODAwMCwgMHgzN2E2MDAwMCwgMHgzN2E2ODAwMCwgMHgzN2E3MDAwMCwgMHgzN2E3ODAwMCwKKzB4MzdhODAwMDAsIDB4MzdhODgwMDAsIDB4MzdhOTAwMDAsIDB4MzdhOTgwMDAsIDB4MzdhYTAwMDAsIDB4MzdhYTgwMDAsCisweDM3YWIwMDAwLCAweDM3YWI4MDAwLCAweDM3YWMwMDAwLCAweDM3YWM4MDAwLCAweDM3YWQwMDAwLCAweDM3YWQ4MDAwLAorMHgzN2FlMDAwMCwgMHgzN2FlODAwMCwgMHgzN2FmMDAwMCwgMHgzN2FmODAwMCwgMHgzN2IwMDAwMCwgMHgzN2IwODAwMCwKKzB4MzdiMTAwMDAsIDB4MzdiMTgwMDAsIDB4MzdiMjAwMDAsIDB4MzdiMjgwMDAsIDB4MzdiMzAwMDAsIDB4MzdiMzgwMDAsCisweDM3YjQwMDAwLCAweDM3YjQ4MDAwLCAweDM3YjUwMDAwLCAweDM3YjU4MDAwLCAweDM3YjYwMDAwLCAweDM3YjY4MDAwLAorMHgzN2I3MDAwMCwgMHgzN2I3ODAwMCwgMHgzN2I4MDAwMCwgMHgzN2I4ODAwMCwgMHgzN2I5MDAwMCwgMHgzN2I5ODAwMCwKKzB4MzdiYTAwMDAsIDB4MzdiYTgwMDAsIDB4MzdiYjAwMDAsIDB4MzdiYjgwMDAsIDB4MzdiYzAwMDAsIDB4MzdiYzgwMDAsCisweDM3YmQwMDAwLCAweDM3YmQ4MDAwLCAweDM3YmUwMDAwLCAweDM3YmU4MDAwLCAweDM3YmYwMDAwLCAweDM3YmY4MDAwLAorMHgzN2MwMDAwMCwgMHgzN2MwODAwMCwgMHgzN2MxMDAwMCwgMHgzN2MxODAwMCwgMHgzN2MyMDAwMCwgMHgzN2MyODAwMCwKKzB4MzdjMzAwMDAsIDB4MzdjMzgwMDAsIDB4MzdjNDAwMDAsIDB4MzdjNDgwMDAsIDB4MzdjNTAwMDAsIDB4MzdjNTgwMDAsCisweDM3YzYwMDAwLCAweDM3YzY4MDAwLCAweDM3YzcwMDAwLCAweDM3Yzc4MDAwLCAweDM3YzgwMDAwLCAweDM3Yzg4MDAwLAorMHgzN2M5MDAwMCwgMHgzN2M5ODAwMCwgMHgzN2NhMDAwMCwgMHgzN2NhODAwMCwgMHgzN2NiMDAwMCwgMHgzN2NiODAwMCwKKzB4MzdjYzAwMDAsIDB4MzdjYzgwMDAsIDB4MzdjZDAwMDAsIDB4MzdjZDgwMDAsIDB4MzdjZTAwMDAsIDB4MzdjZTgwMDAsCisweDM3Y2YwMDAwLCAweDM3Y2Y4MDAwLCAweDM3ZDAwMDAwLCAweDM3ZDA4MDAwLCAweDM3ZDEwMDAwLCAweDM3ZDE4MDAwLAorMHgzN2QyMDAwMCwgMHgzN2QyODAwMCwgMHgzN2QzMDAwMCwgMHgzN2QzODAwMCwgMHgzN2Q0MDAwMCwgMHgzN2Q0ODAwMCwKKzB4MzdkNTAwMDAsIDB4MzdkNTgwMDAsIDB4MzdkNjAwMDAsIDB4MzdkNjgwMDAsIDB4MzdkNzAwMDAsIDB4MzdkNzgwMDAsCisweDM3ZDgwMDAwLCAweDM3ZDg4MDAwLCAweDM3ZDkwMDAwLCAweDM3ZDk4MDAwLCAweDM3ZGEwMDAwLCAweDM3ZGE4MDAwLAorMHgzN2RiMDAwMCwgMHgzN2RiODAwMCwgMHgzN2RjMDAwMCwgMHgzN2RjODAwMCwgMHgzN2RkMDAwMCwgMHgzN2RkODAwMCwKKzB4MzdkZTAwMDAsIDB4MzdkZTgwMDAsIDB4MzdkZjAwMDAsIDB4MzdkZjgwMDAsIDB4MzdlMDAwMDAsIDB4MzdlMDgwMDAsCisweDM3ZTEwMDAwLCAweDM3ZTE4MDAwLCAweDM3ZTIwMDAwLCAweDM3ZTI4MDAwLCAweDM3ZTMwMDAwLCAweDM3ZTM4MDAwLAorMHgzN2U0MDAwMCwgMHgzN2U0ODAwMCwgMHgzN2U1MDAwMCwgMHgzN2U1ODAwMCwgMHgzN2U2MDAwMCwgMHgzN2U2ODAwMCwKKzB4MzdlNzAwMDAsIDB4MzdlNzgwMDAsIDB4MzdlODAwMDAsIDB4MzdlODgwMDAsIDB4MzdlOTAwMDAsIDB4MzdlOTgwMDAsCisweDM3ZWEwMDAwLCAweDM3ZWE4MDAwLCAweDM3ZWIwMDAwLCAweDM3ZWI4MDAwLCAweDM3ZWMwMDAwLCAweDM3ZWM4MDAwLAorMHgzN2VkMDAwMCwgMHgzN2VkODAwMCwgMHgzN2VlMDAwMCwgMHgzN2VlODAwMCwgMHgzN2VmMDAwMCwgMHgzN2VmODAwMCwKKzB4MzdmMDAwMDAsIDB4MzdmMDgwMDAsIDB4MzdmMTAwMDAsIDB4MzdmMTgwMDAsIDB4MzdmMjAwMDAsIDB4MzdmMjgwMDAsCisweDM3ZjMwMDAwLCAweDM3ZjM4MDAwLCAweDM3ZjQwMDAwLCAweDM3ZjQ4MDAwLCAweDM3ZjUwMDAwLCAweDM3ZjU4MDAwLAorMHgzN2Y2MDAwMCwgMHgzN2Y2ODAwMCwgMHgzN2Y3MDAwMCwgMHgzN2Y3ODAwMCwgMHgzN2Y4MDAwMCwgMHgzN2Y4ODAwMCwKKzB4MzdmOTAwMDAsIDB4MzdmOTgwMDAsIDB4MzdmYTAwMDAsIDB4MzdmYTgwMDAsIDB4MzdmYjAwMDAsIDB4MzdmYjgwMDAsCisweDM3ZmMwMDAwLCAweDM3ZmM4MDAwLCAweDM3ZmQwMDAwLCAweDM3ZmQ4MDAwLCAweDM3ZmUwMDAwLCAweDM3ZmU4MDAwLAorMHgzN2ZmMDAwMCwgMHgzN2ZmODAwMCwgMHgzODAwMDAwMCwgMHgzODAwNDAwMCwgMHgzODAwODAwMCwgMHgzODAwYzAwMCwKKzB4MzgwMTAwMDAsIDB4MzgwMTQwMDAsIDB4MzgwMTgwMDAsIDB4MzgwMWMwMDAsIDB4MzgwMjAwMDAsIDB4MzgwMjQwMDAsCisweDM4MDI4MDAwLCAweDM4MDJjMDAwLCAweDM4MDMwMDAwLCAweDM4MDM0MDAwLCAweDM4MDM4MDAwLCAweDM4MDNjMDAwLAorMHgzODA0MDAwMCwgMHgzODA0NDAwMCwgMHgzODA0ODAwMCwgMHgzODA0YzAwMCwgMHgzODA1MDAwMCwgMHgzODA1NDAwMCwKKzB4MzgwNTgwMDAsIDB4MzgwNWMwMDAsIDB4MzgwNjAwMDAsIDB4MzgwNjQwMDAsIDB4MzgwNjgwMDAsIDB4MzgwNmMwMDAsCisweDM4MDcwMDAwLCAweDM4MDc0MDAwLCAweDM4MDc4MDAwLCAweDM4MDdjMDAwLCAweDM4MDgwMDAwLCAweDM4MDg0MDAwLAorMHgzODA4ODAwMCwgMHgzODA4YzAwMCwgMHgzODA5MDAwMCwgMHgzODA5NDAwMCwgMHgzODA5ODAwMCwgMHgzODA5YzAwMCwKKzB4MzgwYTAwMDAsIDB4MzgwYTQwMDAsIDB4MzgwYTgwMDAsIDB4MzgwYWMwMDAsIDB4MzgwYjAwMDAsIDB4MzgwYjQwMDAsCisweDM4MGI4MDAwLCAweDM4MGJjMDAwLCAweDM4MGMwMDAwLCAweDM4MGM0MDAwLCAweDM4MGM4MDAwLCAweDM4MGNjMDAwLAorMHgzODBkMDAwMCwgMHgzODBkNDAwMCwgMHgzODBkODAwMCwgMHgzODBkYzAwMCwgMHgzODBlMDAwMCwgMHgzODBlNDAwMCwKKzB4MzgwZTgwMDAsIDB4MzgwZWMwMDAsIDB4MzgwZjAwMDAsIDB4MzgwZjQwMDAsIDB4MzgwZjgwMDAsIDB4MzgwZmMwMDAsCisweDM4MTAwMDAwLCAweDM4MTA0MDAwLCAweDM4MTA4MDAwLCAweDM4MTBjMDAwLCAweDM4MTEwMDAwLCAweDM4MTE0MDAwLAorMHgzODExODAwMCwgMHgzODExYzAwMCwgMHgzODEyMDAwMCwgMHgzODEyNDAwMCwgMHgzODEyODAwMCwgMHgzODEyYzAwMCwKKzB4MzgxMzAwMDAsIDB4MzgxMzQwMDAsIDB4MzgxMzgwMDAsIDB4MzgxM2MwMDAsIDB4MzgxNDAwMDAsIDB4MzgxNDQwMDAsCisweDM4MTQ4MDAwLCAweDM4MTRjMDAwLCAweDM4MTUwMDAwLCAweDM4MTU0MDAwLCAweDM4MTU4MDAwLCAweDM4MTVjMDAwLAorMHgzODE2MDAwMCwgMHgzODE2NDAwMCwgMHgzODE2ODAwMCwgMHgzODE2YzAwMCwgMHgzODE3MDAwMCwgMHgzODE3NDAwMCwKKzB4MzgxNzgwMDAsIDB4MzgxN2MwMDAsIDB4MzgxODAwMDAsIDB4MzgxODQwMDAsIDB4MzgxODgwMDAsIDB4MzgxOGMwMDAsCisweDM4MTkwMDAwLCAweDM4MTk0MDAwLCAweDM4MTk4MDAwLCAweDM4MTljMDAwLCAweDM4MWEwMDAwLCAweDM4MWE0MDAwLAorMHgzODFhODAwMCwgMHgzODFhYzAwMCwgMHgzODFiMDAwMCwgMHgzODFiNDAwMCwgMHgzODFiODAwMCwgMHgzODFiYzAwMCwKKzB4MzgxYzAwMDAsIDB4MzgxYzQwMDAsIDB4MzgxYzgwMDAsIDB4MzgxY2MwMDAsIDB4MzgxZDAwMDAsIDB4MzgxZDQwMDAsCisweDM4MWQ4MDAwLCAweDM4MWRjMDAwLCAweDM4MWUwMDAwLCAweDM4MWU0MDAwLCAweDM4MWU4MDAwLCAweDM4MWVjMDAwLAorMHgzODFmMDAwMCwgMHgzODFmNDAwMCwgMHgzODFmODAwMCwgMHgzODFmYzAwMCwgMHgzODIwMDAwMCwgMHgzODIwNDAwMCwKKzB4MzgyMDgwMDAsIDB4MzgyMGMwMDAsIDB4MzgyMTAwMDAsIDB4MzgyMTQwMDAsIDB4MzgyMTgwMDAsIDB4MzgyMWMwMDAsCisweDM4MjIwMDAwLCAweDM4MjI0MDAwLCAweDM4MjI4MDAwLCAweDM4MjJjMDAwLCAweDM4MjMwMDAwLCAweDM4MjM0MDAwLAorMHgzODIzODAwMCwgMHgzODIzYzAwMCwgMHgzODI0MDAwMCwgMHgzODI0NDAwMCwgMHgzODI0ODAwMCwgMHgzODI0YzAwMCwKKzB4MzgyNTAwMDAsIDB4MzgyNTQwMDAsIDB4MzgyNTgwMDAsIDB4MzgyNWMwMDAsIDB4MzgyNjAwMDAsIDB4MzgyNjQwMDAsCisweDM4MjY4MDAwLCAweDM4MjZjMDAwLCAweDM4MjcwMDAwLCAweDM4Mjc0MDAwLCAweDM4Mjc4MDAwLCAweDM4MjdjMDAwLAorMHgzODI4MDAwMCwgMHgzODI4NDAwMCwgMHgzODI4ODAwMCwgMHgzODI4YzAwMCwgMHgzODI5MDAwMCwgMHgzODI5NDAwMCwKKzB4MzgyOTgwMDAsIDB4MzgyOWMwMDAsIDB4MzgyYTAwMDAsIDB4MzgyYTQwMDAsIDB4MzgyYTgwMDAsIDB4MzgyYWMwMDAsCisweDM4MmIwMDAwLCAweDM4MmI0MDAwLCAweDM4MmI4MDAwLCAweDM4MmJjMDAwLCAweDM4MmMwMDAwLCAweDM4MmM0MDAwLAorMHgzODJjODAwMCwgMHgzODJjYzAwMCwgMHgzODJkMDAwMCwgMHgzODJkNDAwMCwgMHgzODJkODAwMCwgMHgzODJkYzAwMCwKKzB4MzgyZTAwMDAsIDB4MzgyZTQwMDAsIDB4MzgyZTgwMDAsIDB4MzgyZWMwMDAsIDB4MzgyZjAwMDAsIDB4MzgyZjQwMDAsCisweDM4MmY4MDAwLCAweDM4MmZjMDAwLCAweDM4MzAwMDAwLCAweDM4MzA0MDAwLCAweDM4MzA4MDAwLCAweDM4MzBjMDAwLAorMHgzODMxMDAwMCwgMHgzODMxNDAwMCwgMHgzODMxODAwMCwgMHgzODMxYzAwMCwgMHgzODMyMDAwMCwgMHgzODMyNDAwMCwKKzB4MzgzMjgwMDAsIDB4MzgzMmMwMDAsIDB4MzgzMzAwMDAsIDB4MzgzMzQwMDAsIDB4MzgzMzgwMDAsIDB4MzgzM2MwMDAsCisweDM4MzQwMDAwLCAweDM4MzQ0MDAwLCAweDM4MzQ4MDAwLCAweDM4MzRjMDAwLCAweDM4MzUwMDAwLCAweDM4MzU0MDAwLAorMHgzODM1ODAwMCwgMHgzODM1YzAwMCwgMHgzODM2MDAwMCwgMHgzODM2NDAwMCwgMHgzODM2ODAwMCwgMHgzODM2YzAwMCwKKzB4MzgzNzAwMDAsIDB4MzgzNzQwMDAsIDB4MzgzNzgwMDAsIDB4MzgzN2MwMDAsIDB4MzgzODAwMDAsIDB4MzgzODQwMDAsCisweDM4Mzg4MDAwLCAweDM4MzhjMDAwLCAweDM4MzkwMDAwLCAweDM4Mzk0MDAwLCAweDM4Mzk4MDAwLCAweDM4MzljMDAwLAorMHgzODNhMDAwMCwgMHgzODNhNDAwMCwgMHgzODNhODAwMCwgMHgzODNhYzAwMCwgMHgzODNiMDAwMCwgMHgzODNiNDAwMCwKKzB4MzgzYjgwMDAsIDB4MzgzYmMwMDAsIDB4MzgzYzAwMDAsIDB4MzgzYzQwMDAsIDB4MzgzYzgwMDAsIDB4MzgzY2MwMDAsCisweDM4M2QwMDAwLCAweDM4M2Q0MDAwLCAweDM4M2Q4MDAwLCAweDM4M2RjMDAwLCAweDM4M2UwMDAwLCAweDM4M2U0MDAwLAorMHgzODNlODAwMCwgMHgzODNlYzAwMCwgMHgzODNmMDAwMCwgMHgzODNmNDAwMCwgMHgzODNmODAwMCwgMHgzODNmYzAwMCwKKzB4Mzg0MDAwMDAsIDB4Mzg0MDQwMDAsIDB4Mzg0MDgwMDAsIDB4Mzg0MGMwMDAsIDB4Mzg0MTAwMDAsIDB4Mzg0MTQwMDAsCisweDM4NDE4MDAwLCAweDM4NDFjMDAwLCAweDM4NDIwMDAwLCAweDM4NDI0MDAwLCAweDM4NDI4MDAwLCAweDM4NDJjMDAwLAorMHgzODQzMDAwMCwgMHgzODQzNDAwMCwgMHgzODQzODAwMCwgMHgzODQzYzAwMCwgMHgzODQ0MDAwMCwgMHgzODQ0NDAwMCwKKzB4Mzg0NDgwMDAsIDB4Mzg0NGMwMDAsIDB4Mzg0NTAwMDAsIDB4Mzg0NTQwMDAsIDB4Mzg0NTgwMDAsIDB4Mzg0NWMwMDAsCisweDM4NDYwMDAwLCAweDM4NDY0MDAwLCAweDM4NDY4MDAwLCAweDM4NDZjMDAwLCAweDM4NDcwMDAwLCAweDM4NDc0MDAwLAorMHgzODQ3ODAwMCwgMHgzODQ3YzAwMCwgMHgzODQ4MDAwMCwgMHgzODQ4NDAwMCwgMHgzODQ4ODAwMCwgMHgzODQ4YzAwMCwKKzB4Mzg0OTAwMDAsIDB4Mzg0OTQwMDAsIDB4Mzg0OTgwMDAsIDB4Mzg0OWMwMDAsIDB4Mzg0YTAwMDAsIDB4Mzg0YTQwMDAsCisweDM4NGE4MDAwLCAweDM4NGFjMDAwLCAweDM4NGIwMDAwLCAweDM4NGI0MDAwLCAweDM4NGI4MDAwLCAweDM4NGJjMDAwLAorMHgzODRjMDAwMCwgMHgzODRjNDAwMCwgMHgzODRjODAwMCwgMHgzODRjYzAwMCwgMHgzODRkMDAwMCwgMHgzODRkNDAwMCwKKzB4Mzg0ZDgwMDAsIDB4Mzg0ZGMwMDAsIDB4Mzg0ZTAwMDAsIDB4Mzg0ZTQwMDAsIDB4Mzg0ZTgwMDAsIDB4Mzg0ZWMwMDAsCisweDM4NGYwMDAwLCAweDM4NGY0MDAwLCAweDM4NGY4MDAwLCAweDM4NGZjMDAwLCAweDM4NTAwMDAwLCAweDM4NTA0MDAwLAorMHgzODUwODAwMCwgMHgzODUwYzAwMCwgMHgzODUxMDAwMCwgMHgzODUxNDAwMCwgMHgzODUxODAwMCwgMHgzODUxYzAwMCwKKzB4Mzg1MjAwMDAsIDB4Mzg1MjQwMDAsIDB4Mzg1MjgwMDAsIDB4Mzg1MmMwMDAsIDB4Mzg1MzAwMDAsIDB4Mzg1MzQwMDAsCisweDM4NTM4MDAwLCAweDM4NTNjMDAwLCAweDM4NTQwMDAwLCAweDM4NTQ0MDAwLCAweDM4NTQ4MDAwLCAweDM4NTRjMDAwLAorMHgzODU1MDAwMCwgMHgzODU1NDAwMCwgMHgzODU1ODAwMCwgMHgzODU1YzAwMCwgMHgzODU2MDAwMCwgMHgzODU2NDAwMCwKKzB4Mzg1NjgwMDAsIDB4Mzg1NmMwMDAsIDB4Mzg1NzAwMDAsIDB4Mzg1NzQwMDAsIDB4Mzg1NzgwMDAsIDB4Mzg1N2MwMDAsCisweDM4NTgwMDAwLCAweDM4NTg0MDAwLCAweDM4NTg4MDAwLCAweDM4NThjMDAwLCAweDM4NTkwMDAwLCAweDM4NTk0MDAwLAorMHgzODU5ODAwMCwgMHgzODU5YzAwMCwgMHgzODVhMDAwMCwgMHgzODVhNDAwMCwgMHgzODVhODAwMCwgMHgzODVhYzAwMCwKKzB4Mzg1YjAwMDAsIDB4Mzg1YjQwMDAsIDB4Mzg1YjgwMDAsIDB4Mzg1YmMwMDAsIDB4Mzg1YzAwMDAsIDB4Mzg1YzQwMDAsCisweDM4NWM4MDAwLCAweDM4NWNjMDAwLCAweDM4NWQwMDAwLCAweDM4NWQ0MDAwLCAweDM4NWQ4MDAwLCAweDM4NWRjMDAwLAorMHgzODVlMDAwMCwgMHgzODVlNDAwMCwgMHgzODVlODAwMCwgMHgzODVlYzAwMCwgMHgzODVmMDAwMCwgMHgzODVmNDAwMCwKKzB4Mzg1ZjgwMDAsIDB4Mzg1ZmMwMDAsIDB4Mzg2MDAwMDAsIDB4Mzg2MDQwMDAsIDB4Mzg2MDgwMDAsIDB4Mzg2MGMwMDAsCisweDM4NjEwMDAwLCAweDM4NjE0MDAwLCAweDM4NjE4MDAwLCAweDM4NjFjMDAwLCAweDM4NjIwMDAwLCAweDM4NjI0MDAwLAorMHgzODYyODAwMCwgMHgzODYyYzAwMCwgMHgzODYzMDAwMCwgMHgzODYzNDAwMCwgMHgzODYzODAwMCwgMHgzODYzYzAwMCwKKzB4Mzg2NDAwMDAsIDB4Mzg2NDQwMDAsIDB4Mzg2NDgwMDAsIDB4Mzg2NGMwMDAsIDB4Mzg2NTAwMDAsIDB4Mzg2NTQwMDAsCisweDM4NjU4MDAwLCAweDM4NjVjMDAwLCAweDM4NjYwMDAwLCAweDM4NjY0MDAwLCAweDM4NjY4MDAwLCAweDM4NjZjMDAwLAorMHgzODY3MDAwMCwgMHgzODY3NDAwMCwgMHgzODY3ODAwMCwgMHgzODY3YzAwMCwgMHgzODY4MDAwMCwgMHgzODY4NDAwMCwKKzB4Mzg2ODgwMDAsIDB4Mzg2OGMwMDAsIDB4Mzg2OTAwMDAsIDB4Mzg2OTQwMDAsIDB4Mzg2OTgwMDAsIDB4Mzg2OWMwMDAsCisweDM4NmEwMDAwLCAweDM4NmE0MDAwLCAweDM4NmE4MDAwLCAweDM4NmFjMDAwLCAweDM4NmIwMDAwLCAweDM4NmI0MDAwLAorMHgzODZiODAwMCwgMHgzODZiYzAwMCwgMHgzODZjMDAwMCwgMHgzODZjNDAwMCwgMHgzODZjODAwMCwgMHgzODZjYzAwMCwKKzB4Mzg2ZDAwMDAsIDB4Mzg2ZDQwMDAsIDB4Mzg2ZDgwMDAsIDB4Mzg2ZGMwMDAsIDB4Mzg2ZTAwMDAsIDB4Mzg2ZTQwMDAsCisweDM4NmU4MDAwLCAweDM4NmVjMDAwLCAweDM4NmYwMDAwLCAweDM4NmY0MDAwLCAweDM4NmY4MDAwLCAweDM4NmZjMDAwLAorMHgzODcwMDAwMCwgMHgzODcwNDAwMCwgMHgzODcwODAwMCwgMHgzODcwYzAwMCwgMHgzODcxMDAwMCwgMHgzODcxNDAwMCwKKzB4Mzg3MTgwMDAsIDB4Mzg3MWMwMDAsIDB4Mzg3MjAwMDAsIDB4Mzg3MjQwMDAsIDB4Mzg3MjgwMDAsIDB4Mzg3MmMwMDAsCisweDM4NzMwMDAwLCAweDM4NzM0MDAwLCAweDM4NzM4MDAwLCAweDM4NzNjMDAwLCAweDM4NzQwMDAwLCAweDM4NzQ0MDAwLAorMHgzODc0ODAwMCwgMHgzODc0YzAwMCwgMHgzODc1MDAwMCwgMHgzODc1NDAwMCwgMHgzODc1ODAwMCwgMHgzODc1YzAwMCwKKzB4Mzg3NjAwMDAsIDB4Mzg3NjQwMDAsIDB4Mzg3NjgwMDAsIDB4Mzg3NmMwMDAsIDB4Mzg3NzAwMDAsIDB4Mzg3NzQwMDAsCisweDM4Nzc4MDAwLCAweDM4NzdjMDAwLCAweDM4NzgwMDAwLCAweDM4Nzg0MDAwLCAweDM4Nzg4MDAwLCAweDM4NzhjMDAwLAorMHgzODc5MDAwMCwgMHgzODc5NDAwMCwgMHgzODc5ODAwMCwgMHgzODc5YzAwMCwgMHgzODdhMDAwMCwgMHgzODdhNDAwMCwKKzB4Mzg3YTgwMDAsIDB4Mzg3YWMwMDAsIDB4Mzg3YjAwMDAsIDB4Mzg3YjQwMDAsIDB4Mzg3YjgwMDAsIDB4Mzg3YmMwMDAsCisweDM4N2MwMDAwLCAweDM4N2M0MDAwLCAweDM4N2M4MDAwLCAweDM4N2NjMDAwLCAweDM4N2QwMDAwLCAweDM4N2Q0MDAwLAorMHgzODdkODAwMCwgMHgzODdkYzAwMCwgMHgzODdlMDAwMCwgMHgzODdlNDAwMCwgMHgzODdlODAwMCwgMHgzODdlYzAwMCwKKzB4Mzg3ZjAwMDAsIDB4Mzg3ZjQwMDAsIDB4Mzg3ZjgwMDAsIDB4Mzg3ZmMwMDAsIDB4MzgwMDAwMDAsIDB4MzgwMDIwMDAsCisweDM4MDA0MDAwLCAweDM4MDA2MDAwLCAweDM4MDA4MDAwLCAweDM4MDBhMDAwLCAweDM4MDBjMDAwLCAweDM4MDBlMDAwLAorMHgzODAxMDAwMCwgMHgzODAxMjAwMCwgMHgzODAxNDAwMCwgMHgzODAxNjAwMCwgMHgzODAxODAwMCwgMHgzODAxYTAwMCwKKzB4MzgwMWMwMDAsIDB4MzgwMWUwMDAsIDB4MzgwMjAwMDAsIDB4MzgwMjIwMDAsIDB4MzgwMjQwMDAsIDB4MzgwMjYwMDAsCisweDM4MDI4MDAwLCAweDM4MDJhMDAwLCAweDM4MDJjMDAwLCAweDM4MDJlMDAwLCAweDM4MDMwMDAwLCAweDM4MDMyMDAwLAorMHgzODAzNDAwMCwgMHgzODAzNjAwMCwgMHgzODAzODAwMCwgMHgzODAzYTAwMCwgMHgzODAzYzAwMCwgMHgzODAzZTAwMCwKKzB4MzgwNDAwMDAsIDB4MzgwNDIwMDAsIDB4MzgwNDQwMDAsIDB4MzgwNDYwMDAsIDB4MzgwNDgwMDAsIDB4MzgwNGEwMDAsCisweDM4MDRjMDAwLCAweDM4MDRlMDAwLCAweDM4MDUwMDAwLCAweDM4MDUyMDAwLCAweDM4MDU0MDAwLCAweDM4MDU2MDAwLAorMHgzODA1ODAwMCwgMHgzODA1YTAwMCwgMHgzODA1YzAwMCwgMHgzODA1ZTAwMCwgMHgzODA2MDAwMCwgMHgzODA2MjAwMCwKKzB4MzgwNjQwMDAsIDB4MzgwNjYwMDAsIDB4MzgwNjgwMDAsIDB4MzgwNmEwMDAsIDB4MzgwNmMwMDAsIDB4MzgwNmUwMDAsCisweDM4MDcwMDAwLCAweDM4MDcyMDAwLCAweDM4MDc0MDAwLCAweDM4MDc2MDAwLCAweDM4MDc4MDAwLCAweDM4MDdhMDAwLAorMHgzODA3YzAwMCwgMHgzODA3ZTAwMCwgMHgzODA4MDAwMCwgMHgzODA4MjAwMCwgMHgzODA4NDAwMCwgMHgzODA4NjAwMCwKKzB4MzgwODgwMDAsIDB4MzgwOGEwMDAsIDB4MzgwOGMwMDAsIDB4MzgwOGUwMDAsIDB4MzgwOTAwMDAsIDB4MzgwOTIwMDAsCisweDM4MDk0MDAwLCAweDM4MDk2MDAwLCAweDM4MDk4MDAwLCAweDM4MDlhMDAwLCAweDM4MDljMDAwLCAweDM4MDllMDAwLAorMHgzODBhMDAwMCwgMHgzODBhMjAwMCwgMHgzODBhNDAwMCwgMHgzODBhNjAwMCwgMHgzODBhODAwMCwgMHgzODBhYTAwMCwKKzB4MzgwYWMwMDAsIDB4MzgwYWUwMDAsIDB4MzgwYjAwMDAsIDB4MzgwYjIwMDAsIDB4MzgwYjQwMDAsIDB4MzgwYjYwMDAsCisweDM4MGI4MDAwLCAweDM4MGJhMDAwLCAweDM4MGJjMDAwLCAweDM4MGJlMDAwLCAweDM4MGMwMDAwLCAweDM4MGMyMDAwLAorMHgzODBjNDAwMCwgMHgzODBjNjAwMCwgMHgzODBjODAwMCwgMHgzODBjYTAwMCwgMHgzODBjYzAwMCwgMHgzODBjZTAwMCwKKzB4MzgwZDAwMDAsIDB4MzgwZDIwMDAsIDB4MzgwZDQwMDAsIDB4MzgwZDYwMDAsIDB4MzgwZDgwMDAsIDB4MzgwZGEwMDAsCisweDM4MGRjMDAwLCAweDM4MGRlMDAwLCAweDM4MGUwMDAwLCAweDM4MGUyMDAwLCAweDM4MGU0MDAwLCAweDM4MGU2MDAwLAorMHgzODBlODAwMCwgMHgzODBlYTAwMCwgMHgzODBlYzAwMCwgMHgzODBlZTAwMCwgMHgzODBmMDAwMCwgMHgzODBmMjAwMCwKKzB4MzgwZjQwMDAsIDB4MzgwZjYwMDAsIDB4MzgwZjgwMDAsIDB4MzgwZmEwMDAsIDB4MzgwZmMwMDAsIDB4MzgwZmUwMDAsCisweDM4MTAwMDAwLCAweDM4MTAyMDAwLCAweDM4MTA0MDAwLCAweDM4MTA2MDAwLCAweDM4MTA4MDAwLCAweDM4MTBhMDAwLAorMHgzODEwYzAwMCwgMHgzODEwZTAwMCwgMHgzODExMDAwMCwgMHgzODExMjAwMCwgMHgzODExNDAwMCwgMHgzODExNjAwMCwKKzB4MzgxMTgwMDAsIDB4MzgxMWEwMDAsIDB4MzgxMWMwMDAsIDB4MzgxMWUwMDAsIDB4MzgxMjAwMDAsIDB4MzgxMjIwMDAsCisweDM4MTI0MDAwLCAweDM4MTI2MDAwLCAweDM4MTI4MDAwLCAweDM4MTJhMDAwLCAweDM4MTJjMDAwLCAweDM4MTJlMDAwLAorMHgzODEzMDAwMCwgMHgzODEzMjAwMCwgMHgzODEzNDAwMCwgMHgzODEzNjAwMCwgMHgzODEzODAwMCwgMHgzODEzYTAwMCwKKzB4MzgxM2MwMDAsIDB4MzgxM2UwMDAsIDB4MzgxNDAwMDAsIDB4MzgxNDIwMDAsIDB4MzgxNDQwMDAsIDB4MzgxNDYwMDAsCisweDM4MTQ4MDAwLCAweDM4MTRhMDAwLCAweDM4MTRjMDAwLCAweDM4MTRlMDAwLCAweDM4MTUwMDAwLCAweDM4MTUyMDAwLAorMHgzODE1NDAwMCwgMHgzODE1NjAwMCwgMHgzODE1ODAwMCwgMHgzODE1YTAwMCwgMHgzODE1YzAwMCwgMHgzODE1ZTAwMCwKKzB4MzgxNjAwMDAsIDB4MzgxNjIwMDAsIDB4MzgxNjQwMDAsIDB4MzgxNjYwMDAsIDB4MzgxNjgwMDAsIDB4MzgxNmEwMDAsCisweDM4MTZjMDAwLCAweDM4MTZlMDAwLCAweDM4MTcwMDAwLCAweDM4MTcyMDAwLCAweDM4MTc0MDAwLCAweDM4MTc2MDAwLAorMHgzODE3ODAwMCwgMHgzODE3YTAwMCwgMHgzODE3YzAwMCwgMHgzODE3ZTAwMCwgMHgzODE4MDAwMCwgMHgzODE4MjAwMCwKKzB4MzgxODQwMDAsIDB4MzgxODYwMDAsIDB4MzgxODgwMDAsIDB4MzgxOGEwMDAsIDB4MzgxOGMwMDAsIDB4MzgxOGUwMDAsCisweDM4MTkwMDAwLCAweDM4MTkyMDAwLCAweDM4MTk0MDAwLCAweDM4MTk2MDAwLCAweDM4MTk4MDAwLCAweDM4MTlhMDAwLAorMHgzODE5YzAwMCwgMHgzODE5ZTAwMCwgMHgzODFhMDAwMCwgMHgzODFhMjAwMCwgMHgzODFhNDAwMCwgMHgzODFhNjAwMCwKKzB4MzgxYTgwMDAsIDB4MzgxYWEwMDAsIDB4MzgxYWMwMDAsIDB4MzgxYWUwMDAsIDB4MzgxYjAwMDAsIDB4MzgxYjIwMDAsCisweDM4MWI0MDAwLCAweDM4MWI2MDAwLCAweDM4MWI4MDAwLCAweDM4MWJhMDAwLCAweDM4MWJjMDAwLCAweDM4MWJlMDAwLAorMHgzODFjMDAwMCwgMHgzODFjMjAwMCwgMHgzODFjNDAwMCwgMHgzODFjNjAwMCwgMHgzODFjODAwMCwgMHgzODFjYTAwMCwKKzB4MzgxY2MwMDAsIDB4MzgxY2UwMDAsIDB4MzgxZDAwMDAsIDB4MzgxZDIwMDAsIDB4MzgxZDQwMDAsIDB4MzgxZDYwMDAsCisweDM4MWQ4MDAwLCAweDM4MWRhMDAwLCAweDM4MWRjMDAwLCAweDM4MWRlMDAwLCAweDM4MWUwMDAwLCAweDM4MWUyMDAwLAorMHgzODFlNDAwMCwgMHgzODFlNjAwMCwgMHgzODFlODAwMCwgMHgzODFlYTAwMCwgMHgzODFlYzAwMCwgMHgzODFlZTAwMCwKKzB4MzgxZjAwMDAsIDB4MzgxZjIwMDAsIDB4MzgxZjQwMDAsIDB4MzgxZjYwMDAsIDB4MzgxZjgwMDAsIDB4MzgxZmEwMDAsCisweDM4MWZjMDAwLCAweDM4MWZlMDAwLCAweDM4MjAwMDAwLCAweDM4MjAyMDAwLCAweDM4MjA0MDAwLCAweDM4MjA2MDAwLAorMHgzODIwODAwMCwgMHgzODIwYTAwMCwgMHgzODIwYzAwMCwgMHgzODIwZTAwMCwgMHgzODIxMDAwMCwgMHgzODIxMjAwMCwKKzB4MzgyMTQwMDAsIDB4MzgyMTYwMDAsIDB4MzgyMTgwMDAsIDB4MzgyMWEwMDAsIDB4MzgyMWMwMDAsIDB4MzgyMWUwMDAsCisweDM4MjIwMDAwLCAweDM4MjIyMDAwLCAweDM4MjI0MDAwLCAweDM4MjI2MDAwLCAweDM4MjI4MDAwLCAweDM4MjJhMDAwLAorMHgzODIyYzAwMCwgMHgzODIyZTAwMCwgMHgzODIzMDAwMCwgMHgzODIzMjAwMCwgMHgzODIzNDAwMCwgMHgzODIzNjAwMCwKKzB4MzgyMzgwMDAsIDB4MzgyM2EwMDAsIDB4MzgyM2MwMDAsIDB4MzgyM2UwMDAsIDB4MzgyNDAwMDAsIDB4MzgyNDIwMDAsCisweDM4MjQ0MDAwLCAweDM4MjQ2MDAwLCAweDM4MjQ4MDAwLCAweDM4MjRhMDAwLCAweDM4MjRjMDAwLCAweDM4MjRlMDAwLAorMHgzODI1MDAwMCwgMHgzODI1MjAwMCwgMHgzODI1NDAwMCwgMHgzODI1NjAwMCwgMHgzODI1ODAwMCwgMHgzODI1YTAwMCwKKzB4MzgyNWMwMDAsIDB4MzgyNWUwMDAsIDB4MzgyNjAwMDAsIDB4MzgyNjIwMDAsIDB4MzgyNjQwMDAsIDB4MzgyNjYwMDAsCisweDM4MjY4MDAwLCAweDM4MjZhMDAwLCAweDM4MjZjMDAwLCAweDM4MjZlMDAwLCAweDM4MjcwMDAwLCAweDM4MjcyMDAwLAorMHgzODI3NDAwMCwgMHgzODI3NjAwMCwgMHgzODI3ODAwMCwgMHgzODI3YTAwMCwgMHgzODI3YzAwMCwgMHgzODI3ZTAwMCwKKzB4MzgyODAwMDAsIDB4MzgyODIwMDAsIDB4MzgyODQwMDAsIDB4MzgyODYwMDAsIDB4MzgyODgwMDAsIDB4MzgyOGEwMDAsCisweDM4MjhjMDAwLCAweDM4MjhlMDAwLCAweDM4MjkwMDAwLCAweDM4MjkyMDAwLCAweDM4Mjk0MDAwLCAweDM4Mjk2MDAwLAorMHgzODI5ODAwMCwgMHgzODI5YTAwMCwgMHgzODI5YzAwMCwgMHgzODI5ZTAwMCwgMHgzODJhMDAwMCwgMHgzODJhMjAwMCwKKzB4MzgyYTQwMDAsIDB4MzgyYTYwMDAsIDB4MzgyYTgwMDAsIDB4MzgyYWEwMDAsIDB4MzgyYWMwMDAsIDB4MzgyYWUwMDAsCisweDM4MmIwMDAwLCAweDM4MmIyMDAwLCAweDM4MmI0MDAwLCAweDM4MmI2MDAwLCAweDM4MmI4MDAwLCAweDM4MmJhMDAwLAorMHgzODJiYzAwMCwgMHgzODJiZTAwMCwgMHgzODJjMDAwMCwgMHgzODJjMjAwMCwgMHgzODJjNDAwMCwgMHgzODJjNjAwMCwKKzB4MzgyYzgwMDAsIDB4MzgyY2EwMDAsIDB4MzgyY2MwMDAsIDB4MzgyY2UwMDAsIDB4MzgyZDAwMDAsIDB4MzgyZDIwMDAsCisweDM4MmQ0MDAwLCAweDM4MmQ2MDAwLCAweDM4MmQ4MDAwLCAweDM4MmRhMDAwLCAweDM4MmRjMDAwLCAweDM4MmRlMDAwLAorMHgzODJlMDAwMCwgMHgzODJlMjAwMCwgMHgzODJlNDAwMCwgMHgzODJlNjAwMCwgMHgzODJlODAwMCwgMHgzODJlYTAwMCwKKzB4MzgyZWMwMDAsIDB4MzgyZWUwMDAsIDB4MzgyZjAwMDAsIDB4MzgyZjIwMDAsIDB4MzgyZjQwMDAsIDB4MzgyZjYwMDAsCisweDM4MmY4MDAwLCAweDM4MmZhMDAwLCAweDM4MmZjMDAwLCAweDM4MmZlMDAwLCAweDM4MzAwMDAwLCAweDM4MzAyMDAwLAorMHgzODMwNDAwMCwgMHgzODMwNjAwMCwgMHgzODMwODAwMCwgMHgzODMwYTAwMCwgMHgzODMwYzAwMCwgMHgzODMwZTAwMCwKKzB4MzgzMTAwMDAsIDB4MzgzMTIwMDAsIDB4MzgzMTQwMDAsIDB4MzgzMTYwMDAsIDB4MzgzMTgwMDAsIDB4MzgzMWEwMDAsCisweDM4MzFjMDAwLCAweDM4MzFlMDAwLCAweDM4MzIwMDAwLCAweDM4MzIyMDAwLCAweDM4MzI0MDAwLCAweDM4MzI2MDAwLAorMHgzODMyODAwMCwgMHgzODMyYTAwMCwgMHgzODMyYzAwMCwgMHgzODMyZTAwMCwgMHgzODMzMDAwMCwgMHgzODMzMjAwMCwKKzB4MzgzMzQwMDAsIDB4MzgzMzYwMDAsIDB4MzgzMzgwMDAsIDB4MzgzM2EwMDAsIDB4MzgzM2MwMDAsIDB4MzgzM2UwMDAsCisweDM4MzQwMDAwLCAweDM4MzQyMDAwLCAweDM4MzQ0MDAwLCAweDM4MzQ2MDAwLCAweDM4MzQ4MDAwLCAweDM4MzRhMDAwLAorMHgzODM0YzAwMCwgMHgzODM0ZTAwMCwgMHgzODM1MDAwMCwgMHgzODM1MjAwMCwgMHgzODM1NDAwMCwgMHgzODM1NjAwMCwKKzB4MzgzNTgwMDAsIDB4MzgzNWEwMDAsIDB4MzgzNWMwMDAsIDB4MzgzNWUwMDAsIDB4MzgzNjAwMDAsIDB4MzgzNjIwMDAsCisweDM4MzY0MDAwLCAweDM4MzY2MDAwLCAweDM4MzY4MDAwLCAweDM4MzZhMDAwLCAweDM4MzZjMDAwLCAweDM4MzZlMDAwLAorMHgzODM3MDAwMCwgMHgzODM3MjAwMCwgMHgzODM3NDAwMCwgMHgzODM3NjAwMCwgMHgzODM3ODAwMCwgMHgzODM3YTAwMCwKKzB4MzgzN2MwMDAsIDB4MzgzN2UwMDAsIDB4MzgzODAwMDAsIDB4MzgzODIwMDAsIDB4MzgzODQwMDAsIDB4MzgzODYwMDAsCisweDM4Mzg4MDAwLCAweDM4MzhhMDAwLCAweDM4MzhjMDAwLCAweDM4MzhlMDAwLCAweDM4MzkwMDAwLCAweDM4MzkyMDAwLAorMHgzODM5NDAwMCwgMHgzODM5NjAwMCwgMHgzODM5ODAwMCwgMHgzODM5YTAwMCwgMHgzODM5YzAwMCwgMHgzODM5ZTAwMCwKKzB4MzgzYTAwMDAsIDB4MzgzYTIwMDAsIDB4MzgzYTQwMDAsIDB4MzgzYTYwMDAsIDB4MzgzYTgwMDAsIDB4MzgzYWEwMDAsCisweDM4M2FjMDAwLCAweDM4M2FlMDAwLCAweDM4M2IwMDAwLCAweDM4M2IyMDAwLCAweDM4M2I0MDAwLCAweDM4M2I2MDAwLAorMHgzODNiODAwMCwgMHgzODNiYTAwMCwgMHgzODNiYzAwMCwgMHgzODNiZTAwMCwgMHgzODNjMDAwMCwgMHgzODNjMjAwMCwKKzB4MzgzYzQwMDAsIDB4MzgzYzYwMDAsIDB4MzgzYzgwMDAsIDB4MzgzY2EwMDAsIDB4MzgzY2MwMDAsIDB4MzgzY2UwMDAsCisweDM4M2QwMDAwLCAweDM4M2QyMDAwLCAweDM4M2Q0MDAwLCAweDM4M2Q2MDAwLCAweDM4M2Q4MDAwLCAweDM4M2RhMDAwLAorMHgzODNkYzAwMCwgMHgzODNkZTAwMCwgMHgzODNlMDAwMCwgMHgzODNlMjAwMCwgMHgzODNlNDAwMCwgMHgzODNlNjAwMCwKKzB4MzgzZTgwMDAsIDB4MzgzZWEwMDAsIDB4MzgzZWMwMDAsIDB4MzgzZWUwMDAsIDB4MzgzZjAwMDAsIDB4MzgzZjIwMDAsCisweDM4M2Y0MDAwLCAweDM4M2Y2MDAwLCAweDM4M2Y4MDAwLCAweDM4M2ZhMDAwLCAweDM4M2ZjMDAwLCAweDM4M2ZlMDAwLAorMHgzODQwMDAwMCwgMHgzODQwMjAwMCwgMHgzODQwNDAwMCwgMHgzODQwNjAwMCwgMHgzODQwODAwMCwgMHgzODQwYTAwMCwKKzB4Mzg0MGMwMDAsIDB4Mzg0MGUwMDAsIDB4Mzg0MTAwMDAsIDB4Mzg0MTIwMDAsIDB4Mzg0MTQwMDAsIDB4Mzg0MTYwMDAsCisweDM4NDE4MDAwLCAweDM4NDFhMDAwLCAweDM4NDFjMDAwLCAweDM4NDFlMDAwLCAweDM4NDIwMDAwLCAweDM4NDIyMDAwLAorMHgzODQyNDAwMCwgMHgzODQyNjAwMCwgMHgzODQyODAwMCwgMHgzODQyYTAwMCwgMHgzODQyYzAwMCwgMHgzODQyZTAwMCwKKzB4Mzg0MzAwMDAsIDB4Mzg0MzIwMDAsIDB4Mzg0MzQwMDAsIDB4Mzg0MzYwMDAsIDB4Mzg0MzgwMDAsIDB4Mzg0M2EwMDAsCisweDM4NDNjMDAwLCAweDM4NDNlMDAwLCAweDM4NDQwMDAwLCAweDM4NDQyMDAwLCAweDM4NDQ0MDAwLCAweDM4NDQ2MDAwLAorMHgzODQ0ODAwMCwgMHgzODQ0YTAwMCwgMHgzODQ0YzAwMCwgMHgzODQ0ZTAwMCwgMHgzODQ1MDAwMCwgMHgzODQ1MjAwMCwKKzB4Mzg0NTQwMDAsIDB4Mzg0NTYwMDAsIDB4Mzg0NTgwMDAsIDB4Mzg0NWEwMDAsIDB4Mzg0NWMwMDAsIDB4Mzg0NWUwMDAsCisweDM4NDYwMDAwLCAweDM4NDYyMDAwLCAweDM4NDY0MDAwLCAweDM4NDY2MDAwLCAweDM4NDY4MDAwLCAweDM4NDZhMDAwLAorMHgzODQ2YzAwMCwgMHgzODQ2ZTAwMCwgMHgzODQ3MDAwMCwgMHgzODQ3MjAwMCwgMHgzODQ3NDAwMCwgMHgzODQ3NjAwMCwKKzB4Mzg0NzgwMDAsIDB4Mzg0N2EwMDAsIDB4Mzg0N2MwMDAsIDB4Mzg0N2UwMDAsIDB4Mzg0ODAwMDAsIDB4Mzg0ODIwMDAsCisweDM4NDg0MDAwLCAweDM4NDg2MDAwLCAweDM4NDg4MDAwLCAweDM4NDhhMDAwLCAweDM4NDhjMDAwLCAweDM4NDhlMDAwLAorMHgzODQ5MDAwMCwgMHgzODQ5MjAwMCwgMHgzODQ5NDAwMCwgMHgzODQ5NjAwMCwgMHgzODQ5ODAwMCwgMHgzODQ5YTAwMCwKKzB4Mzg0OWMwMDAsIDB4Mzg0OWUwMDAsIDB4Mzg0YTAwMDAsIDB4Mzg0YTIwMDAsIDB4Mzg0YTQwMDAsIDB4Mzg0YTYwMDAsCisweDM4NGE4MDAwLCAweDM4NGFhMDAwLCAweDM4NGFjMDAwLCAweDM4NGFlMDAwLCAweDM4NGIwMDAwLCAweDM4NGIyMDAwLAorMHgzODRiNDAwMCwgMHgzODRiNjAwMCwgMHgzODRiODAwMCwgMHgzODRiYTAwMCwgMHgzODRiYzAwMCwgMHgzODRiZTAwMCwKKzB4Mzg0YzAwMDAsIDB4Mzg0YzIwMDAsIDB4Mzg0YzQwMDAsIDB4Mzg0YzYwMDAsIDB4Mzg0YzgwMDAsIDB4Mzg0Y2EwMDAsCisweDM4NGNjMDAwLCAweDM4NGNlMDAwLCAweDM4NGQwMDAwLCAweDM4NGQyMDAwLCAweDM4NGQ0MDAwLCAweDM4NGQ2MDAwLAorMHgzODRkODAwMCwgMHgzODRkYTAwMCwgMHgzODRkYzAwMCwgMHgzODRkZTAwMCwgMHgzODRlMDAwMCwgMHgzODRlMjAwMCwKKzB4Mzg0ZTQwMDAsIDB4Mzg0ZTYwMDAsIDB4Mzg0ZTgwMDAsIDB4Mzg0ZWEwMDAsIDB4Mzg0ZWMwMDAsIDB4Mzg0ZWUwMDAsCisweDM4NGYwMDAwLCAweDM4NGYyMDAwLCAweDM4NGY0MDAwLCAweDM4NGY2MDAwLCAweDM4NGY4MDAwLCAweDM4NGZhMDAwLAorMHgzODRmYzAwMCwgMHgzODRmZTAwMCwgMHgzODUwMDAwMCwgMHgzODUwMjAwMCwgMHgzODUwNDAwMCwgMHgzODUwNjAwMCwKKzB4Mzg1MDgwMDAsIDB4Mzg1MGEwMDAsIDB4Mzg1MGMwMDAsIDB4Mzg1MGUwMDAsIDB4Mzg1MTAwMDAsIDB4Mzg1MTIwMDAsCisweDM4NTE0MDAwLCAweDM4NTE2MDAwLCAweDM4NTE4MDAwLCAweDM4NTFhMDAwLCAweDM4NTFjMDAwLCAweDM4NTFlMDAwLAorMHgzODUyMDAwMCwgMHgzODUyMjAwMCwgMHgzODUyNDAwMCwgMHgzODUyNjAwMCwgMHgzODUyODAwMCwgMHgzODUyYTAwMCwKKzB4Mzg1MmMwMDAsIDB4Mzg1MmUwMDAsIDB4Mzg1MzAwMDAsIDB4Mzg1MzIwMDAsIDB4Mzg1MzQwMDAsIDB4Mzg1MzYwMDAsCisweDM4NTM4MDAwLCAweDM4NTNhMDAwLCAweDM4NTNjMDAwLCAweDM4NTNlMDAwLCAweDM4NTQwMDAwLCAweDM4NTQyMDAwLAorMHgzODU0NDAwMCwgMHgzODU0NjAwMCwgMHgzODU0ODAwMCwgMHgzODU0YTAwMCwgMHgzODU0YzAwMCwgMHgzODU0ZTAwMCwKKzB4Mzg1NTAwMDAsIDB4Mzg1NTIwMDAsIDB4Mzg1NTQwMDAsIDB4Mzg1NTYwMDAsIDB4Mzg1NTgwMDAsIDB4Mzg1NWEwMDAsCisweDM4NTVjMDAwLCAweDM4NTVlMDAwLCAweDM4NTYwMDAwLCAweDM4NTYyMDAwLCAweDM4NTY0MDAwLCAweDM4NTY2MDAwLAorMHgzODU2ODAwMCwgMHgzODU2YTAwMCwgMHgzODU2YzAwMCwgMHgzODU2ZTAwMCwgMHgzODU3MDAwMCwgMHgzODU3MjAwMCwKKzB4Mzg1NzQwMDAsIDB4Mzg1NzYwMDAsIDB4Mzg1NzgwMDAsIDB4Mzg1N2EwMDAsIDB4Mzg1N2MwMDAsIDB4Mzg1N2UwMDAsCisweDM4NTgwMDAwLCAweDM4NTgyMDAwLCAweDM4NTg0MDAwLCAweDM4NTg2MDAwLCAweDM4NTg4MDAwLCAweDM4NThhMDAwLAorMHgzODU4YzAwMCwgMHgzODU4ZTAwMCwgMHgzODU5MDAwMCwgMHgzODU5MjAwMCwgMHgzODU5NDAwMCwgMHgzODU5NjAwMCwKKzB4Mzg1OTgwMDAsIDB4Mzg1OWEwMDAsIDB4Mzg1OWMwMDAsIDB4Mzg1OWUwMDAsIDB4Mzg1YTAwMDAsIDB4Mzg1YTIwMDAsCisweDM4NWE0MDAwLCAweDM4NWE2MDAwLCAweDM4NWE4MDAwLCAweDM4NWFhMDAwLCAweDM4NWFjMDAwLCAweDM4NWFlMDAwLAorMHgzODViMDAwMCwgMHgzODViMjAwMCwgMHgzODViNDAwMCwgMHgzODViNjAwMCwgMHgzODViODAwMCwgMHgzODViYTAwMCwKKzB4Mzg1YmMwMDAsIDB4Mzg1YmUwMDAsIDB4Mzg1YzAwMDAsIDB4Mzg1YzIwMDAsIDB4Mzg1YzQwMDAsIDB4Mzg1YzYwMDAsCisweDM4NWM4MDAwLCAweDM4NWNhMDAwLCAweDM4NWNjMDAwLCAweDM4NWNlMDAwLCAweDM4NWQwMDAwLCAweDM4NWQyMDAwLAorMHgzODVkNDAwMCwgMHgzODVkNjAwMCwgMHgzODVkODAwMCwgMHgzODVkYTAwMCwgMHgzODVkYzAwMCwgMHgzODVkZTAwMCwKKzB4Mzg1ZTAwMDAsIDB4Mzg1ZTIwMDAsIDB4Mzg1ZTQwMDAsIDB4Mzg1ZTYwMDAsIDB4Mzg1ZTgwMDAsIDB4Mzg1ZWEwMDAsCisweDM4NWVjMDAwLCAweDM4NWVlMDAwLCAweDM4NWYwMDAwLCAweDM4NWYyMDAwLCAweDM4NWY0MDAwLCAweDM4NWY2MDAwLAorMHgzODVmODAwMCwgMHgzODVmYTAwMCwgMHgzODVmYzAwMCwgMHgzODVmZTAwMCwgMHgzODYwMDAwMCwgMHgzODYwMjAwMCwKKzB4Mzg2MDQwMDAsIDB4Mzg2MDYwMDAsIDB4Mzg2MDgwMDAsIDB4Mzg2MGEwMDAsIDB4Mzg2MGMwMDAsIDB4Mzg2MGUwMDAsCisweDM4NjEwMDAwLCAweDM4NjEyMDAwLCAweDM4NjE0MDAwLCAweDM4NjE2MDAwLCAweDM4NjE4MDAwLCAweDM4NjFhMDAwLAorMHgzODYxYzAwMCwgMHgzODYxZTAwMCwgMHgzODYyMDAwMCwgMHgzODYyMjAwMCwgMHgzODYyNDAwMCwgMHgzODYyNjAwMCwKKzB4Mzg2MjgwMDAsIDB4Mzg2MmEwMDAsIDB4Mzg2MmMwMDAsIDB4Mzg2MmUwMDAsIDB4Mzg2MzAwMDAsIDB4Mzg2MzIwMDAsCisweDM4NjM0MDAwLCAweDM4NjM2MDAwLCAweDM4NjM4MDAwLCAweDM4NjNhMDAwLCAweDM4NjNjMDAwLCAweDM4NjNlMDAwLAorMHgzODY0MDAwMCwgMHgzODY0MjAwMCwgMHgzODY0NDAwMCwgMHgzODY0NjAwMCwgMHgzODY0ODAwMCwgMHgzODY0YTAwMCwKKzB4Mzg2NGMwMDAsIDB4Mzg2NGUwMDAsIDB4Mzg2NTAwMDAsIDB4Mzg2NTIwMDAsIDB4Mzg2NTQwMDAsIDB4Mzg2NTYwMDAsCisweDM4NjU4MDAwLCAweDM4NjVhMDAwLCAweDM4NjVjMDAwLCAweDM4NjVlMDAwLCAweDM4NjYwMDAwLCAweDM4NjYyMDAwLAorMHgzODY2NDAwMCwgMHgzODY2NjAwMCwgMHgzODY2ODAwMCwgMHgzODY2YTAwMCwgMHgzODY2YzAwMCwgMHgzODY2ZTAwMCwKKzB4Mzg2NzAwMDAsIDB4Mzg2NzIwMDAsIDB4Mzg2NzQwMDAsIDB4Mzg2NzYwMDAsIDB4Mzg2NzgwMDAsIDB4Mzg2N2EwMDAsCisweDM4NjdjMDAwLCAweDM4NjdlMDAwLCAweDM4NjgwMDAwLCAweDM4NjgyMDAwLCAweDM4Njg0MDAwLCAweDM4Njg2MDAwLAorMHgzODY4ODAwMCwgMHgzODY4YTAwMCwgMHgzODY4YzAwMCwgMHgzODY4ZTAwMCwgMHgzODY5MDAwMCwgMHgzODY5MjAwMCwKKzB4Mzg2OTQwMDAsIDB4Mzg2OTYwMDAsIDB4Mzg2OTgwMDAsIDB4Mzg2OWEwMDAsIDB4Mzg2OWMwMDAsIDB4Mzg2OWUwMDAsCisweDM4NmEwMDAwLCAweDM4NmEyMDAwLCAweDM4NmE0MDAwLCAweDM4NmE2MDAwLCAweDM4NmE4MDAwLCAweDM4NmFhMDAwLAorMHgzODZhYzAwMCwgMHgzODZhZTAwMCwgMHgzODZiMDAwMCwgMHgzODZiMjAwMCwgMHgzODZiNDAwMCwgMHgzODZiNjAwMCwKKzB4Mzg2YjgwMDAsIDB4Mzg2YmEwMDAsIDB4Mzg2YmMwMDAsIDB4Mzg2YmUwMDAsIDB4Mzg2YzAwMDAsIDB4Mzg2YzIwMDAsCisweDM4NmM0MDAwLCAweDM4NmM2MDAwLCAweDM4NmM4MDAwLCAweDM4NmNhMDAwLCAweDM4NmNjMDAwLCAweDM4NmNlMDAwLAorMHgzODZkMDAwMCwgMHgzODZkMjAwMCwgMHgzODZkNDAwMCwgMHgzODZkNjAwMCwgMHgzODZkODAwMCwgMHgzODZkYTAwMCwKKzB4Mzg2ZGMwMDAsIDB4Mzg2ZGUwMDAsIDB4Mzg2ZTAwMDAsIDB4Mzg2ZTIwMDAsIDB4Mzg2ZTQwMDAsIDB4Mzg2ZTYwMDAsCisweDM4NmU4MDAwLCAweDM4NmVhMDAwLCAweDM4NmVjMDAwLCAweDM4NmVlMDAwLCAweDM4NmYwMDAwLCAweDM4NmYyMDAwLAorMHgzODZmNDAwMCwgMHgzODZmNjAwMCwgMHgzODZmODAwMCwgMHgzODZmYTAwMCwgMHgzODZmYzAwMCwgMHgzODZmZTAwMCwKKzB4Mzg3MDAwMDAsIDB4Mzg3MDIwMDAsIDB4Mzg3MDQwMDAsIDB4Mzg3MDYwMDAsIDB4Mzg3MDgwMDAsIDB4Mzg3MGEwMDAsCisweDM4NzBjMDAwLCAweDM4NzBlMDAwLCAweDM4NzEwMDAwLCAweDM4NzEyMDAwLCAweDM4NzE0MDAwLCAweDM4NzE2MDAwLAorMHgzODcxODAwMCwgMHgzODcxYTAwMCwgMHgzODcxYzAwMCwgMHgzODcxZTAwMCwgMHgzODcyMDAwMCwgMHgzODcyMjAwMCwKKzB4Mzg3MjQwMDAsIDB4Mzg3MjYwMDAsIDB4Mzg3MjgwMDAsIDB4Mzg3MmEwMDAsIDB4Mzg3MmMwMDAsIDB4Mzg3MmUwMDAsCisweDM4NzMwMDAwLCAweDM4NzMyMDAwLCAweDM4NzM0MDAwLCAweDM4NzM2MDAwLCAweDM4NzM4MDAwLCAweDM4NzNhMDAwLAorMHgzODczYzAwMCwgMHgzODczZTAwMCwgMHgzODc0MDAwMCwgMHgzODc0MjAwMCwgMHgzODc0NDAwMCwgMHgzODc0NjAwMCwKKzB4Mzg3NDgwMDAsIDB4Mzg3NGEwMDAsIDB4Mzg3NGMwMDAsIDB4Mzg3NGUwMDAsIDB4Mzg3NTAwMDAsIDB4Mzg3NTIwMDAsCisweDM4NzU0MDAwLCAweDM4NzU2MDAwLCAweDM4NzU4MDAwLCAweDM4NzVhMDAwLCAweDM4NzVjMDAwLCAweDM4NzVlMDAwLAorMHgzODc2MDAwMCwgMHgzODc2MjAwMCwgMHgzODc2NDAwMCwgMHgzODc2NjAwMCwgMHgzODc2ODAwMCwgMHgzODc2YTAwMCwKKzB4Mzg3NmMwMDAsIDB4Mzg3NmUwMDAsIDB4Mzg3NzAwMDAsIDB4Mzg3NzIwMDAsIDB4Mzg3NzQwMDAsIDB4Mzg3NzYwMDAsCisweDM4Nzc4MDAwLCAweDM4NzdhMDAwLCAweDM4NzdjMDAwLCAweDM4NzdlMDAwLCAweDM4NzgwMDAwLCAweDM4NzgyMDAwLAorMHgzODc4NDAwMCwgMHgzODc4NjAwMCwgMHgzODc4ODAwMCwgMHgzODc4YTAwMCwgMHgzODc4YzAwMCwgMHgzODc4ZTAwMCwKKzB4Mzg3OTAwMDAsIDB4Mzg3OTIwMDAsIDB4Mzg3OTQwMDAsIDB4Mzg3OTYwMDAsIDB4Mzg3OTgwMDAsIDB4Mzg3OWEwMDAsCisweDM4NzljMDAwLCAweDM4NzllMDAwLCAweDM4N2EwMDAwLCAweDM4N2EyMDAwLCAweDM4N2E0MDAwLCAweDM4N2E2MDAwLAorMHgzODdhODAwMCwgMHgzODdhYTAwMCwgMHgzODdhYzAwMCwgMHgzODdhZTAwMCwgMHgzODdiMDAwMCwgMHgzODdiMjAwMCwKKzB4Mzg3YjQwMDAsIDB4Mzg3YjYwMDAsIDB4Mzg3YjgwMDAsIDB4Mzg3YmEwMDAsIDB4Mzg3YmMwMDAsIDB4Mzg3YmUwMDAsCisweDM4N2MwMDAwLCAweDM4N2MyMDAwLCAweDM4N2M0MDAwLCAweDM4N2M2MDAwLCAweDM4N2M4MDAwLCAweDM4N2NhMDAwLAorMHgzODdjYzAwMCwgMHgzODdjZTAwMCwgMHgzODdkMDAwMCwgMHgzODdkMjAwMCwgMHgzODdkNDAwMCwgMHgzODdkNjAwMCwKKzB4Mzg3ZDgwMDAsIDB4Mzg3ZGEwMDAsIDB4Mzg3ZGMwMDAsIDB4Mzg3ZGUwMDAsIDB4Mzg3ZTAwMDAsIDB4Mzg3ZTIwMDAsCisweDM4N2U0MDAwLCAweDM4N2U2MDAwLCAweDM4N2U4MDAwLCAweDM4N2VhMDAwLCAweDM4N2VjMDAwLCAweDM4N2VlMDAwLAorMHgzODdmMDAwMCwgMHgzODdmMjAwMCwgMHgzODdmNDAwMCwgMHgzODdmNjAwMCwgMHgzODdmODAwMCwgMHgzODdmYTAwMCwKKzB4Mzg3ZmMwMDAsIDB4Mzg3ZmUwMDAKK307CisKK3N0YXRpYyBjbXNVSW50MTZOdW1iZXIgT2Zmc2V0WzY0XSA9IHsKKzB4MDAwMCwgMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwgMHgwNDAwLCAweDA0MDAsCisweDA0MDAsIDB4MDQwMCwgMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwgMHgwNDAwLAorMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwgMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwKKzB4MDQwMCwgMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwgMHgwNDAwLCAweDA0MDAsCisweDA0MDAsIDB4MDQwMCwgMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwgMHgwNDAwLAorMHgwNDAwLCAweDA0MDAsIDB4MDAwMCwgMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwKKzB4MDQwMCwgMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwgMHgwNDAwLCAweDA0MDAsCisweDA0MDAsIDB4MDQwMCwgMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwgMHgwNDAwLAorMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwgMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwKKzB4MDQwMCwgMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwgMHgwNDAwLCAweDA0MDAsCisweDA0MDAsIDB4MDQwMCwgMHgwNDAwLCAweDA0MDAKK307CisKK3N0YXRpYyBjbXNVSW50MzJOdW1iZXIgRXhwb25lbnRbNjRdID0geworMHgwMDAwMDAwMCwgMHgwMDgwMDAwMCwgMHgwMTAwMDAwMCwgMHgwMTgwMDAwMCwgMHgwMjAwMDAwMCwgMHgwMjgwMDAwMCwKKzB4MDMwMDAwMDAsIDB4MDM4MDAwMDAsIDB4MDQwMDAwMDAsIDB4MDQ4MDAwMDAsIDB4MDUwMDAwMDAsIDB4MDU4MDAwMDAsCisweDA2MDAwMDAwLCAweDA2ODAwMDAwLCAweDA3MDAwMDAwLCAweDA3ODAwMDAwLCAweDA4MDAwMDAwLCAweDA4ODAwMDAwLAorMHgwOTAwMDAwMCwgMHgwOTgwMDAwMCwgMHgwYTAwMDAwMCwgMHgwYTgwMDAwMCwgMHgwYjAwMDAwMCwgMHgwYjgwMDAwMCwKKzB4MGMwMDAwMDAsIDB4MGM4MDAwMDAsIDB4MGQwMDAwMDAsIDB4MGQ4MDAwMDAsIDB4MGUwMDAwMDAsIDB4MGU4MDAwMDAsCisweDBmMDAwMDAwLCAweDQ3ODAwMDAwLCAweDgwMDAwMDAwLCAweDgwODAwMDAwLCAweDgxMDAwMDAwLCAweDgxODAwMDAwLAorMHg4MjAwMDAwMCwgMHg4MjgwMDAwMCwgMHg4MzAwMDAwMCwgMHg4MzgwMDAwMCwgMHg4NDAwMDAwMCwgMHg4NDgwMDAwMCwKKzB4ODUwMDAwMDAsIDB4ODU4MDAwMDAsIDB4ODYwMDAwMDAsIDB4ODY4MDAwMDAsIDB4ODcwMDAwMDAsIDB4ODc4MDAwMDAsCisweDg4MDAwMDAwLCAweDg4ODAwMDAwLCAweDg5MDAwMDAwLCAweDg5ODAwMDAwLCAweDhhMDAwMDAwLCAweDhhODAwMDAwLAorMHg4YjAwMDAwMCwgMHg4YjgwMDAwMCwgMHg4YzAwMDAwMCwgMHg4YzgwMDAwMCwgMHg4ZDAwMDAwMCwgMHg4ZDgwMDAwMCwKKzB4OGUwMDAwMDAsIDB4OGU4MDAwMDAsIDB4OGYwMDAwMDAsIDB4Yzc4MDAwMDAKK307CisKK3N0YXRpYyBjbXNVSW50MTZOdW1iZXIgQmFzZVs1MTJdID0geworMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLAorMHgwMDgwLCAweDAxMDAsIDB4MDIwMCwgMHgwNDAwLCAweDA4MDAsIDB4MGMwMCwgMHgxMDAwLCAweDE0MDAsIDB4MTgwMCwgMHgxYzAwLAorMHgyMDAwLCAweDI0MDAsIDB4MjgwMCwgMHgyYzAwLCAweDMwMDAsIDB4MzQwMCwgMHgzODAwLCAweDNjMDAsIDB4NDAwMCwgMHg0NDAwLAorMHg0ODAwLCAweDRjMDAsIDB4NTAwMCwgMHg1NDAwLCAweDU4MDAsIDB4NWMwMCwgMHg2MDAwLCAweDY0MDAsIDB4NjgwMCwgMHg2YzAwLAorMHg3MDAwLCAweDc0MDAsIDB4NzgwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLAorMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLAorMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLAorMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLAorMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLAorMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLAorMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLAorMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLAorMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLAorMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLAorMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLAorMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLAorMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAxLAorMHg4MDAyLCAweDgwMDQsIDB4ODAwOCwgMHg4MDEwLCAweDgwMjAsIDB4ODA0MCwgMHg4MDgwLCAweDgxMDAsIDB4ODIwMCwgMHg4NDAwLAorMHg4ODAwLCAweDhjMDAsIDB4OTAwMCwgMHg5NDAwLCAweDk4MDAsIDB4OWMwMCwgMHhhMDAwLCAweGE0MDAsIDB4YTgwMCwgMHhhYzAwLAorMHhiMDAwLCAweGI0MDAsIDB4YjgwMCwgMHhiYzAwLCAweGMwMDAsIDB4YzQwMCwgMHhjODAwLCAweGNjMDAsIDB4ZDAwMCwgMHhkNDAwLAorMHhkODAwLCAweGRjMDAsIDB4ZTAwMCwgMHhlNDAwLCAweGU4MDAsIDB4ZWMwMCwgMHhmMDAwLCAweGY0MDAsIDB4ZjgwMCwgMHhmYzAwLAorMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLAorMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLAorMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLAorMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLAorMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLAorMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLAorMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLAorMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLAorMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLAorMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLAorMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLAorMHhmYzAwLCAweGZjMDAKK307CisKK3N0YXRpYyBjbXNVSW50OE51bWJlciAgU2hpZnRbNTEyXSA9IHsKKzB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKKzB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKKzB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE3LAorMHgxNiwgMHgxNSwgMHgxNCwgMHgxMywgMHgxMiwgMHgxMSwgMHgxMCwgMHgwZiwgMHgwZSwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwKKzB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsCisweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLAorMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKKzB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKKzB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKKzB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDBkLCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKKzB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKKzB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKKzB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTcsIDB4MTYsIDB4MTUsIDB4MTQsIDB4MTMsCisweDEyLCAweDExLCAweDEwLCAweDBmLCAweDBlLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLAorMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwKKzB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKKzB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKKzB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCisweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAorMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKKzB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MGQKK307CisKK2Ntc0Zsb2F0MzJOdW1iZXIgX2Ntc0hhbGYyRmxvYXQoY21zVUludDE2TnVtYmVyIGgpCit7CisgICAgdW5pb24geworICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIGZsdDsKKyAgICAgICAgY21zVUludDMyTnVtYmVyICBudW07CisgICAgfSBvdXQ7CisKKyAgICBpbnQgbiA9IGggPj4gMTA7CisKKyAgICBvdXQubnVtID0gTWFudGlzc2FbICAoaCAmIDB4M2ZmKSArIE9mZnNldFsgbiBdIF0gKyBFeHBvbmVudFsgbiBdOworICAgIHJldHVybiBvdXQuZmx0OworfQorCitjbXNVSW50MTZOdW1iZXIgX2Ntc0Zsb2F0MkhhbGYoY21zRmxvYXQzMk51bWJlciBmbHQpCit7CisgICAgdW5pb24geworICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIGZsdDsKKyAgICAgICAgY21zVUludDMyTnVtYmVyICBudW07CisgICAgfSBpbjsKKworICAgIGNtc1VJbnQzMk51bWJlciBuLCBqOworCisgICAgaW4uZmx0ID0gZmx0OworICAgIG4gPSBpbi5udW07CisgICAgaiA9IChuID4+IDIzKSAmIDB4MWZmOworCisgICAgcmV0dXJuIChjbXNVSW50MTZOdW1iZXIpICgoY21zVUludDMyTnVtYmVyKSBCYXNlWyBqIF0gKyAoKCBuICYgMHgwMDdmZmZmZikgPj4gU2hpZnRbIGogXSkpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2ludHJwLmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNpbnRycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZDZhMGUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNpbnRycC5jCkBAIC0wLDAgKzEsMTUwNiBAQAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCisvLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTYgTWFydGkgTWFyaWEgU2FndWVyCisvLworLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisvLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisvLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisvLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKy8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQorLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKy8vCisvLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisvLworLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisvLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KKy8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisvLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCisvLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisvLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKy8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworCisjaW5jbHVkZSAibGNtczJfaW50ZXJuYWwuaCIKKworLy8gVGhpcyBtb2R1bGUgaW5jb3Jwb3JhdGVzIHNldmVyYWwgaW50ZXJwb2xhdGlvbiByb3V0aW5lcywgZm9yIDEgdG8gOCBjaGFubmVscyBvbiBpbnB1dCBhbmQKKy8vIHVwIHRvIDY1NTM1IGNoYW5uZWxzIG9uIG91dHB1dC4gVGhlIHVzZXIgbWF5IGNoYW5nZSB0aG9zZSBieSB1c2luZyB0aGUgaW50ZXJwb2xhdGlvbiBwbHVnLWluCisKKy8vIEludGVycG9sYXRpb24gcm91dGluZXMgYnkgZGVmYXVsdAorc3RhdGljIGNtc0ludGVycEZ1bmN0aW9uIERlZmF1bHRJbnRlcnBvbGF0b3JzRmFjdG9yeShjbXNVSW50MzJOdW1iZXIgbklucHV0Q2hhbm5lbHMsIGNtc1VJbnQzMk51bWJlciBuT3V0cHV0Q2hhbm5lbHMsIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKTsKKworLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCBmYWN0b3J5CitfY21zSW50ZXJwUGx1Z2luQ2h1bmtUeXBlIF9jbXNJbnRlcnBQbHVnaW5DaHVuayA9IHsgTlVMTCB9OworCisvLyBUaGUgaW50ZXJwb2xhdGlvbiBwbHVnLWluIG1lbW9yeSBjaHVuayBhbGxvY2F0b3IvZHVwCit2b2lkIF9jbXNBbGxvY0ludGVycFBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQoreworICAgIHZvaWQqIGZyb207CisKKyAgICBfY21zQXNzZXJ0KGN0eCAhPSBOVUxMKTsKKworICAgIGlmIChzcmMgIT0gTlVMTCkgeworICAgICAgICBmcm9tID0gc3JjIC0+Y2h1bmtzW0ludGVycFBsdWdpbl07ICAgICAgIAorICAgIH0KKyAgICBlbHNlIHsgCisgICAgICAgIHN0YXRpYyBfY21zSW50ZXJwUGx1Z2luQ2h1bmtUeXBlIEludGVycFBsdWdpbkNodW5rID0geyBOVUxMIH07CisKKyAgICAgICAgZnJvbSA9ICZJbnRlcnBQbHVnaW5DaHVuazsKKyAgICB9CisKKyAgICBfY21zQXNzZXJ0KGZyb20gIT0gTlVMTCk7CisgICAgY3R4IC0+Y2h1bmtzW0ludGVycFBsdWdpbl0gPSBfY21zU3ViQWxsb2NEdXAoY3R4IC0+TWVtUG9vbCwgZnJvbSwgc2l6ZW9mKF9jbXNJbnRlcnBQbHVnaW5DaHVua1R5cGUpKTsKK30KKworCisvLyBNYWluIHBsdWctaW4gZW50cnkKK2Ntc0Jvb2wgIF9jbXNSZWdpc3RlckludGVycFBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogRGF0YSkKK3sKKyAgICBjbXNQbHVnaW5JbnRlcnBvbGF0aW9uKiBQbHVnaW4gPSAoY21zUGx1Z2luSW50ZXJwb2xhdGlvbiopIERhdGE7CisgICAgX2Ntc0ludGVycFBsdWdpbkNodW5rVHlwZSogcHRyID0gKF9jbXNJbnRlcnBQbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgSW50ZXJwUGx1Z2luKTsKKworICAgIGlmIChEYXRhID09IE5VTEwpIHsKKworICAgICAgICBwdHIgLT5JbnRlcnBvbGF0b3JzID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgLy8gU2V0IHJlcGxhY2VtZW50IGZ1bmN0aW9ucworICAgIHB0ciAtPkludGVycG9sYXRvcnMgPSBQbHVnaW4gLT5JbnRlcnBvbGF0b3JzRmFjdG9yeTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLyBTZXQgdGhlIGludGVycG9sYXRpb24gbWV0aG9kCitjbXNCb29sIF9jbXNTZXRJbnRlcnBvbGF0aW9uUm91dGluZShjbXNDb250ZXh0IENvbnRleHRJRCwgY21zSW50ZXJwUGFyYW1zKiBwKQoreyAgICAgIAorICAgIF9jbXNJbnRlcnBQbHVnaW5DaHVua1R5cGUqIHB0ciA9IChfY21zSW50ZXJwUGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIEludGVycFBsdWdpbik7CisKKyAgICBwIC0+SW50ZXJwb2xhdGlvbi5MZXJwMTYgPSBOVUxMOworCisgICAvLyBJbnZva2UgZmFjdG9yeSwgcG9zc2libHkgaW4gdGhlIFBsdWctaW4KKyAgICBpZiAocHRyIC0+SW50ZXJwb2xhdG9ycyAhPSBOVUxMKQorICAgICAgICBwIC0+SW50ZXJwb2xhdGlvbiA9IHB0ci0+SW50ZXJwb2xhdG9ycyhwIC0+IG5JbnB1dHMsIHAgLT5uT3V0cHV0cywgcCAtPmR3RmxhZ3MpOworICAgIAorICAgIC8vIElmIHVuc3VwcG9ydGVkIGJ5IHRoZSBwbHVnLWluLCBnbyBmb3IgdGhlIExpdHRsZUNNUyBkZWZhdWx0LgorICAgIC8vIElmIGhhcHBlbnMgb25seSBpZiBhbiBleHRlcm4gcGx1Zy1pbiBpcyBiZWluZyB1c2VkCisgICAgaWYgKHAgLT5JbnRlcnBvbGF0aW9uLkxlcnAxNiA9PSBOVUxMKQorICAgICAgICBwIC0+SW50ZXJwb2xhdGlvbiA9IERlZmF1bHRJbnRlcnBvbGF0b3JzRmFjdG9yeShwIC0+bklucHV0cywgcCAtPm5PdXRwdXRzLCBwIC0+ZHdGbGFncyk7CisKKyAgICAvLyBDaGVjayBmb3IgdmFsaWQgaW50ZXJwb2xhdG9yICh3ZSBqdXN0IGNoZWNrIG9uZSBtZW1iZXIgb2YgdGhlIHVuaW9uKQorICAgIGlmIChwIC0+SW50ZXJwb2xhdGlvbi5MZXJwMTYgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisKKy8vIFRoaXMgZnVuY3Rpb24gcHJlY2FsY3VsYXRlcyBhcyBtYW55IHBhcmFtZXRlcnMgYXMgcG9zc2libGUgdG8gc3BlZWQgdXAgdGhlIGludGVycG9sYXRpb24uCitjbXNJbnRlcnBQYXJhbXMqIF9jbXNDb21wdXRlSW50ZXJwUGFyYW1zRXgoY21zQ29udGV4dCBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zVUludDMyTnVtYmVyIG5TYW1wbGVzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IElucHV0Q2hhbiwgaW50IE91dHB1dENoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpCit7CisgICAgY21zSW50ZXJwUGFyYW1zKiBwOworICAgIGludCBpOworCisgICAgLy8gQ2hlY2sgZm9yIG1heGltdW0gaW5wdXRzCisgICAgaWYgKElucHV0Q2hhbiA+IE1BWF9JTlBVVF9ESU1FTlNJT05TKSB7CisgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgIlRvbyBtYW55IGlucHV0IGNoYW5uZWxzICglZCBjaGFubmVscywgbWF4PSVkKSIsIElucHV0Q2hhbiwgTUFYX0lOUFVUX0RJTUVOU0lPTlMpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLy8gQ3JlYXRlcyBhbiBlbXB0eSBvYmplY3QKKyAgICBwID0gKGNtc0ludGVycFBhcmFtcyopIF9jbXNNYWxsb2NaZXJvKENvbnRleHRJRCwgc2l6ZW9mKGNtc0ludGVycFBhcmFtcykpOworICAgIGlmIChwID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgLy8gS2VlcCBvcmlnaW5hbCBwYXJhbWV0ZXJzCisgICAgcCAtPiBkd0ZsYWdzICA9IGR3RmxhZ3M7CisgICAgcCAtPiBuSW5wdXRzICA9IElucHV0Q2hhbjsKKyAgICBwIC0+IG5PdXRwdXRzID0gT3V0cHV0Q2hhbjsKKyAgICBwIC0+VGFibGUgICAgID0gVGFibGU7CisgICAgcCAtPkNvbnRleHRJRCAgPSBDb250ZXh0SUQ7CisKKyAgICAvLyBGaWxsIHNhbXBsZXMgcGVyIGlucHV0IGRpcmVjdGlvbiBhbmQgZG9tYWluICh3aGljaCBpcyBudW1iZXIgb2Ygbm9kZXMgbWludXMgb25lKQorICAgIGZvciAoaT0wOyBpIDwgSW5wdXRDaGFuOyBpKyspIHsKKworICAgICAgICBwIC0+IG5TYW1wbGVzW2ldID0gblNhbXBsZXNbaV07CisgICAgICAgIHAgLT4gRG9tYWluW2ldICAgPSBuU2FtcGxlc1tpXSAtIDE7CisgICAgfQorCisgICAgLy8gQ29tcHV0ZSBmYWN0b3JzIHRvIGFwcGx5IHRvIGVhY2ggY29tcG9uZW50IHRvIGluZGV4IHRoZSBncmlkIGFycmF5CisgICAgcCAtPiBvcHRhWzBdID0gcCAtPiBuT3V0cHV0czsKKyAgICBmb3IgKGk9MTsgaSA8IElucHV0Q2hhbjsgaSsrKQorICAgICAgICBwIC0+b3B0YVtpXSA9IHAgLT5vcHRhW2ktMV0gKiBuU2FtcGxlc1tJbnB1dENoYW4taV07CisKKworICAgIGlmICghX2Ntc1NldEludGVycG9sYXRpb25Sb3V0aW5lKENvbnRleHRJRCwgcCkpIHsKKyAgICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJVbnN1cHBvcnRlZCBpbnRlcnBvbGF0aW9uICglZC0+JWQgY2hhbm5lbHMpIiwgSW5wdXRDaGFuLCBPdXRwdXRDaGFuKTsKKyAgICAgICAgX2Ntc0ZyZWUoQ29udGV4dElELCBwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLy8gQWxsIHNlZW1zIG9rCisgICAgcmV0dXJuIHA7Cit9CisKKworLy8gVGhpcyBvbmUgaXMgYSB3cmFwcGVyIG9uIHRoZSBhbnRlcmlvciwgYnV0IGFzc3VtaW5nIGFsbCBkaXJlY3Rpb25zIGhhdmUgc2FtZSBudW1iZXIgb2Ygbm9kZXMKK2Ntc0ludGVycFBhcmFtcyogX2Ntc0NvbXB1dGVJbnRlcnBQYXJhbXMoY21zQ29udGV4dCBDb250ZXh0SUQsIGludCBuU2FtcGxlcywgaW50IElucHV0Q2hhbiwgaW50IE91dHB1dENoYW4sIGNvbnN0IHZvaWQqIFRhYmxlLCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKK3sKKyAgICBpbnQgaTsKKyAgICBjbXNVSW50MzJOdW1iZXIgU2FtcGxlc1tNQVhfSU5QVVRfRElNRU5TSU9OU107CisKKyAgICAvLyBGaWxsIHRoZSBhdXhpbGlhcnkgYXJyYXkKKyAgICBmb3IgKGk9MDsgaSA8IE1BWF9JTlBVVF9ESU1FTlNJT05TOyBpKyspCisgICAgICAgIFNhbXBsZXNbaV0gPSBuU2FtcGxlczsKKworICAgIC8vIENhbGwgdGhlIGV4dGVuZGVkIGZ1bmN0aW9uCisgICAgcmV0dXJuIF9jbXNDb21wdXRlSW50ZXJwUGFyYW1zRXgoQ29udGV4dElELCBTYW1wbGVzLCBJbnB1dENoYW4sIE91dHB1dENoYW4sIFRhYmxlLCBkd0ZsYWdzKTsKK30KKworCisvLyBGcmVlIGFsbCBhc3NvY2lhdGVkIG1lbW9yeQordm9pZCBfY21zRnJlZUludGVycFBhcmFtcyhjbXNJbnRlcnBQYXJhbXMqIHApCit7CisgICAgaWYgKHAgIT0gTlVMTCkgX2Ntc0ZyZWUocCAtPkNvbnRleHRJRCwgcCk7Cit9CisKKworLy8gSW5saW5lIGZpeGVkIHBvaW50IGludGVycG9sYXRpb24KK2Ntc0lOTElORSBjbXNVSW50MTZOdW1iZXIgTGluZWFySW50ZXJwKGNtc1MxNUZpeGVkMTZOdW1iZXIgYSwgY21zUzE1Rml4ZWQxNk51bWJlciBsLCBjbXNTMTVGaXhlZDE2TnVtYmVyIGgpCit7CisgICAgY21zVUludDMyTnVtYmVyIGRpZiA9IChjbXNVSW50MzJOdW1iZXIpIChoIC0gbCkgKiBhICsgMHg4MDAwOworICAgIGRpZiA9IChkaWYgPj4gMTYpICsgbDsKKyAgICByZXR1cm4gKGNtc1VJbnQxNk51bWJlcikgKGRpZik7Cit9CisKKworLy8gIExpbmVhciBpbnRlcnBvbGF0aW9uIChGaXhlZC1wb2ludCBvcHRpbWl6ZWQpCitzdGF0aWMKK3ZvaWQgTGluTGVycDFEKHJlZ2lzdGVyIGNvbnN0IGNtc1VJbnQxNk51bWJlciBWYWx1ZVtdLAorICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIE91dHB1dFtdLAorICAgICAgICAgICAgICAgcmVnaXN0ZXIgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBwKQoreworICAgIGNtc1VJbnQxNk51bWJlciB5MSwgeTA7CisgICAgaW50IGNlbGwwLCByZXN0OworICAgIGludCB2YWwzOworICAgIGNvbnN0IGNtc1VJbnQxNk51bWJlciogTHV0VGFibGUgPSAoY21zVUludDE2TnVtYmVyKikgcCAtPlRhYmxlOworCisgICAgLy8gaWYgbGFzdCB2YWx1ZS4uLgorICAgIGlmIChWYWx1ZVswXSA9PSAweGZmZmYpIHsKKworICAgICAgICBPdXRwdXRbMF0gPSBMdXRUYWJsZVtwIC0+IERvbWFpblswXV07CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2YWwzID0gcCAtPiBEb21haW5bMF0gKiBWYWx1ZVswXTsKKyAgICB2YWwzID0gX2Ntc1RvRml4ZWREb21haW4odmFsMyk7ICAgIC8vIFRvIGZpeGVkIDE1LjE2CisKKyAgICBjZWxsMCA9IEZJWEVEX1RPX0lOVCh2YWwzKTsgICAgICAgICAgICAgLy8gQ2VsbCBpcyAxNiBNU0IgYml0cworICAgIHJlc3QgID0gRklYRURfUkVTVF9UT19JTlQodmFsMyk7ICAgICAgICAvLyBSZXN0IGlzIDE2IExTQiBiaXRzCisKKyAgICB5MCA9IEx1dFRhYmxlW2NlbGwwXTsKKyAgICB5MSA9IEx1dFRhYmxlW2NlbGwwKzFdOworCisKKyAgICBPdXRwdXRbMF0gPSBMaW5lYXJJbnRlcnAocmVzdCwgeTAsIHkxKTsKK30KKworLy8gVG8gcHJldmVudCBvdXQgb2YgYm91bmRzIGluZGV4aW5nCitjbXNJTkxJTkUgY21zRmxvYXQzMk51bWJlciBmY2xhbXAoY21zRmxvYXQzMk51bWJlciB2KSAKK3sKKyAgICByZXR1cm4gKCh2IDwgMC4wZikgfHwgaXNuYW4odikpID8gMC4wZiA6ICh2ID4gMS4wZiA/IDEuMGYgOiB2KTsKK30KKworLy8gRmxvYXRpbmctcG9pbnQgdmVyc2lvbiBvZiAxRCBpbnRlcnBvbGF0aW9uCitzdGF0aWMKK3ZvaWQgTGluTGVycDFEZmxvYXQoY29uc3QgY21zRmxvYXQzMk51bWJlciBWYWx1ZVtdLAorICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIE91dHB1dFtdLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNJbnRlcnBQYXJhbXMqIHApCit7CisgICAgICAgY21zRmxvYXQzMk51bWJlciB5MSwgeTA7CisgICAgICAgY21zRmxvYXQzMk51bWJlciB2YWwyLCByZXN0OworICAgICAgIGludCBjZWxsMCwgY2VsbDE7CisgICAgICAgY29uc3QgY21zRmxvYXQzMk51bWJlciogTHV0VGFibGUgPSAoY21zRmxvYXQzMk51bWJlciopIHAgLT5UYWJsZTsKKworICAgICAgIHZhbDIgPSBmY2xhbXAoVmFsdWVbMF0pOworCisgICAgICAgLy8gaWYgbGFzdCB2YWx1ZS4uLgorICAgICAgIGlmICh2YWwyID09IDEuMCkgeworICAgICAgICAgICBPdXRwdXRbMF0gPSBMdXRUYWJsZVtwIC0+IERvbWFpblswXV07CisgICAgICAgICAgIHJldHVybjsKKyAgICAgICB9CisKKyAgICAgICB2YWwyICo9IHAgLT4gRG9tYWluWzBdOworCisgICAgICAgY2VsbDAgPSAoaW50KSBmbG9vcih2YWwyKTsKKyAgICAgICBjZWxsMSA9IChpbnQpIGNlaWwodmFsMik7CisKKyAgICAgICAvLyBSZXN0IGlzIDE2IExTQiBiaXRzCisgICAgICAgcmVzdCA9IHZhbDIgLSBjZWxsMDsKKworICAgICAgIHkwID0gTHV0VGFibGVbY2VsbDBdIDsKKyAgICAgICB5MSA9IEx1dFRhYmxlW2NlbGwxXSA7CisKKyAgICAgICBPdXRwdXRbMF0gPSB5MCArICh5MSAtIHkwKSAqIHJlc3Q7Cit9CisKKworCisvLyBFdmFsIGdyYXkgTFVUIGhhdmluZyBvbmx5IG9uZSBpbnB1dCBjaGFubmVsCitzdGF0aWMKK3ZvaWQgRXZhbDFJbnB1dChyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5wdXRbXSwKKyAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgT3V0cHV0W10sCisgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBwMTYpCit7CisgICAgICAgY21zUzE1Rml4ZWQxNk51bWJlciBmazsKKyAgICAgICBjbXNTMTVGaXhlZDE2TnVtYmVyIGswLCBrMSwgcmssIEswLCBLMTsKKyAgICAgICBpbnQgdjsKKyAgICAgICBjbXNVSW50MzJOdW1iZXIgT3V0Q2hhbjsKKyAgICAgICBjb25zdCBjbXNVSW50MTZOdW1iZXIqIEx1dFRhYmxlID0gKGNtc1VJbnQxNk51bWJlciopIHAxNiAtPiBUYWJsZTsKKworICAgICAgIHYgPSBJbnB1dFswXSAqIHAxNiAtPiBEb21haW5bMF07CisgICAgICAgZmsgPSBfY21zVG9GaXhlZERvbWFpbih2KTsKKworICAgICAgIGswID0gRklYRURfVE9fSU5UKGZrKTsKKyAgICAgICByayA9IChjbXNVSW50MTZOdW1iZXIpIEZJWEVEX1JFU1RfVE9fSU5UKGZrKTsKKworICAgICAgIGsxID0gazAgKyAoSW5wdXRbMF0gIT0gMHhGRkZGVSA/IDEgOiAwKTsKKworICAgICAgIEswID0gcDE2IC0+IG9wdGFbMF0gKiBrMDsKKyAgICAgICBLMSA9IHAxNiAtPiBvcHRhWzBdICogazE7CisKKyAgICAgICBmb3IgKE91dENoYW49MDsgT3V0Q2hhbiA8IHAxNi0+bk91dHB1dHM7IE91dENoYW4rKykgeworCisgICAgICAgICAgIE91dHB1dFtPdXRDaGFuXSA9IExpbmVhckludGVycChyaywgTHV0VGFibGVbSzArT3V0Q2hhbl0sIEx1dFRhYmxlW0sxK091dENoYW5dKTsKKyAgICAgICB9Cit9CisKKworCisvLyBFdmFsIGdyYXkgTFVUIGhhdmluZyBvbmx5IG9uZSBpbnB1dCBjaGFubmVsCitzdGF0aWMKK3ZvaWQgRXZhbDFJbnB1dEZsb2F0KGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIgVmFsdWVbXSwKKyAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgT3V0cHV0W10sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNJbnRlcnBQYXJhbXMqIHApCit7CisgICAgY21zRmxvYXQzMk51bWJlciB5MSwgeTA7CisgICAgY21zRmxvYXQzMk51bWJlciB2YWwyLCByZXN0OworICAgIGludCBjZWxsMCwgY2VsbDE7CisgICAgY21zVUludDMyTnVtYmVyIE91dENoYW47CisgICAgY29uc3QgY21zRmxvYXQzMk51bWJlciogTHV0VGFibGUgPSAoY21zRmxvYXQzMk51bWJlciopIHAgLT5UYWJsZTsKKworICAgIHZhbDIgPSBmY2xhbXAoVmFsdWVbMF0pOworCisgICAgICAgIC8vIGlmIGxhc3QgdmFsdWUuLi4KKyAgICAgICBpZiAodmFsMiA9PSAxLjApIHsKKyAgICAgICAgICAgT3V0cHV0WzBdID0gTHV0VGFibGVbcCAtPiBEb21haW5bMF1dOworICAgICAgICAgICByZXR1cm47CisgICAgICAgfQorCisgICAgICAgdmFsMiAqPSBwIC0+IERvbWFpblswXTsKKworICAgICAgIGNlbGwwID0gKGludCkgZmxvb3IodmFsMik7CisgICAgICAgY2VsbDEgPSAoaW50KSBjZWlsKHZhbDIpOworCisgICAgICAgLy8gUmVzdCBpcyAxNiBMU0IgYml0cworICAgICAgIHJlc3QgPSB2YWwyIC0gY2VsbDA7CisKKyAgICAgICBjZWxsMCAqPSBwIC0+IG9wdGFbMF07CisgICAgICAgY2VsbDEgKj0gcCAtPiBvcHRhWzBdOworCisgICAgICAgZm9yIChPdXRDaGFuPTA7IE91dENoYW4gPCBwLT5uT3V0cHV0czsgT3V0Q2hhbisrKSB7CisKKyAgICAgICAgICAgIHkwID0gTHV0VGFibGVbY2VsbDAgKyBPdXRDaGFuXSA7CisgICAgICAgICAgICB5MSA9IEx1dFRhYmxlW2NlbGwxICsgT3V0Q2hhbl0gOworCisgICAgICAgICAgICBPdXRwdXRbT3V0Q2hhbl0gPSB5MCArICh5MSAtIHkwKSAqIHJlc3Q7CisgICAgICAgfQorfQorCisvLyBCaWxpbmVhciBpbnRlcnBvbGF0aW9uICgxNiBiaXRzKSAtIGNtc0Zsb2F0MzJOdW1iZXIgdmVyc2lvbgorc3RhdGljCit2b2lkIEJpbGluZWFySW50ZXJwRmxvYXQoY29uc3QgY21zRmxvYXQzMk51bWJlciBJbnB1dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgT3V0cHV0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBwKQorCit7CisjICAgZGVmaW5lIExFUlAoYSxsLGgpICAgIChjbXNGbG9hdDMyTnVtYmVyKSAoKGwpKygoKGgpLShsKSkqKGEpKSkKKyMgICBkZWZpbmUgREVOUyhpLGopICAgICAgKEx1dFRhYmxlWyhpKSsoaikrT3V0Q2hhbl0pCisKKyAgICBjb25zdCBjbXNGbG9hdDMyTnVtYmVyKiBMdXRUYWJsZSA9IChjbXNGbG9hdDMyTnVtYmVyKikgcCAtPlRhYmxlOworICAgIGNtc0Zsb2F0MzJOdW1iZXIgICAgICBweCwgcHk7CisgICAgaW50ICAgICAgICB4MCwgeTAsCisgICAgICAgICAgICAgICBYMCwgWTAsIFgxLCBZMTsKKyAgICBpbnQgICAgICAgIFRvdGFsT3V0LCBPdXRDaGFuOworICAgIGNtc0Zsb2F0MzJOdW1iZXIgICAgICBmeCwgZnksCisgICAgICAgIGQwMCwgZDAxLCBkMTAsIGQxMSwKKyAgICAgICAgZHgwLCBkeDEsCisgICAgICAgIGR4eTsKKworICAgIFRvdGFsT3V0ICAgPSBwIC0+IG5PdXRwdXRzOworICAgIHB4ID0gZmNsYW1wKElucHV0WzBdKSAqIHAtPkRvbWFpblswXTsKKyAgICBweSA9IGZjbGFtcChJbnB1dFsxXSkgKiBwLT5Eb21haW5bMV07CisKKyAgICB4MCA9IChpbnQpIF9jbXNRdWlja0Zsb29yKHB4KTsgZnggPSBweCAtIChjbXNGbG9hdDMyTnVtYmVyKSB4MDsKKyAgICB5MCA9IChpbnQpIF9jbXNRdWlja0Zsb29yKHB5KTsgZnkgPSBweSAtIChjbXNGbG9hdDMyTnVtYmVyKSB5MDsKKworICAgIFgwID0gcCAtPiBvcHRhWzFdICogeDA7CisgICAgWDEgPSBYMCArIChJbnB1dFswXSA+PSAxLjAgPyAwIDogcC0+b3B0YVsxXSk7CisKKyAgICBZMCA9IHAgLT4gb3B0YVswXSAqIHkwOworICAgIFkxID0gWTAgKyAoSW5wdXRbMV0gPj0gMS4wID8gMCA6IHAtPm9wdGFbMF0pOworCisgICAgZm9yIChPdXRDaGFuID0gMDsgT3V0Q2hhbiA8IFRvdGFsT3V0OyBPdXRDaGFuKyspIHsKKworICAgICAgICBkMDAgPSBERU5TKFgwLCBZMCk7CisgICAgICAgIGQwMSA9IERFTlMoWDAsIFkxKTsKKyAgICAgICAgZDEwID0gREVOUyhYMSwgWTApOworICAgICAgICBkMTEgPSBERU5TKFgxLCBZMSk7CisKKyAgICAgICAgZHgwID0gTEVSUChmeCwgZDAwLCBkMTApOworICAgICAgICBkeDEgPSBMRVJQKGZ4LCBkMDEsIGQxMSk7CisKKyAgICAgICAgZHh5ID0gTEVSUChmeSwgZHgwLCBkeDEpOworCisgICAgICAgIE91dHB1dFtPdXRDaGFuXSA9IGR4eTsKKyAgICB9CisKKworIyAgIHVuZGVmIExFUlAKKyMgICB1bmRlZiBERU5TCit9CisKKy8vIEJpbGluZWFyIGludGVycG9sYXRpb24gKDE2IGJpdHMpIC0gb3B0aW1pemVkIHZlcnNpb24KK3N0YXRpYwordm9pZCBCaWxpbmVhckludGVycDE2KHJlZ2lzdGVyIGNvbnN0IGNtc1VJbnQxNk51bWJlciBJbnB1dFtdLAorICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciBPdXRwdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjb25zdCBjbXNJbnRlcnBQYXJhbXMqIHApCisKK3sKKyNkZWZpbmUgREVOUyhpLGopIChMdXRUYWJsZVsoaSkrKGopK091dENoYW5dKQorI2RlZmluZSBMRVJQKGEsbCxoKSAgICAgKGNtc1VJbnQxNk51bWJlcikgKGwgKyBST1VORF9GSVhFRF9UT19JTlQoKChoLWwpKmEpKSkKKworICAgICAgICAgICBjb25zdCBjbXNVSW50MTZOdW1iZXIqIEx1dFRhYmxlID0gKGNtc1VJbnQxNk51bWJlciopIHAgLT5UYWJsZTsKKyAgICAgICAgICAgaW50ICAgICAgICBPdXRDaGFuLCBUb3RhbE91dDsKKyAgICAgICAgICAgY21zUzE1Rml4ZWQxNk51bWJlciAgICBmeCwgZnk7CisgIHJlZ2lzdGVyIGludCAgICAgICAgcngsIHJ5OworICAgICAgICAgICBpbnQgICAgICAgIHgwLCB5MDsKKyAgcmVnaXN0ZXIgaW50ICAgICAgICBYMCwgWDEsIFkwLCBZMTsKKyAgICAgICAgICAgaW50ICAgICAgICBkMDAsIGQwMSwgZDEwLCBkMTEsCisgICAgICAgICAgICAgICAgICAgICAgZHgwLCBkeDEsCisgICAgICAgICAgICAgICAgICAgICAgZHh5OworCisgICAgVG90YWxPdXQgICA9IHAgLT4gbk91dHB1dHM7CisKKyAgICBmeCA9IF9jbXNUb0ZpeGVkRG9tYWluKChpbnQpIElucHV0WzBdICogcCAtPiBEb21haW5bMF0pOworICAgIHgwICA9IEZJWEVEX1RPX0lOVChmeCk7CisgICAgcnggID0gRklYRURfUkVTVF9UT19JTlQoZngpOyAgICAvLyBSZXN0IGluIDAuLjEuMCBkb21haW4KKworCisgICAgZnkgPSBfY21zVG9GaXhlZERvbWFpbigoaW50KSBJbnB1dFsxXSAqIHAgLT4gRG9tYWluWzFdKTsKKyAgICB5MCAgPSBGSVhFRF9UT19JTlQoZnkpOworICAgIHJ5ICA9IEZJWEVEX1JFU1RfVE9fSU5UKGZ5KTsKKworCisgICAgWDAgPSBwIC0+IG9wdGFbMV0gKiB4MDsKKyAgICBYMSA9IFgwICsgKElucHV0WzBdID09IDB4RkZGRlUgPyAwIDogcC0+b3B0YVsxXSk7CisKKyAgICBZMCA9IHAgLT4gb3B0YVswXSAqIHkwOworICAgIFkxID0gWTAgKyAoSW5wdXRbMV0gPT0gMHhGRkZGVSA/IDAgOiBwLT5vcHRhWzBdKTsKKworICAgIGZvciAoT3V0Q2hhbiA9IDA7IE91dENoYW4gPCBUb3RhbE91dDsgT3V0Q2hhbisrKSB7CisKKyAgICAgICAgZDAwID0gREVOUyhYMCwgWTApOworICAgICAgICBkMDEgPSBERU5TKFgwLCBZMSk7CisgICAgICAgIGQxMCA9IERFTlMoWDEsIFkwKTsKKyAgICAgICAgZDExID0gREVOUyhYMSwgWTEpOworCisgICAgICAgIGR4MCA9IExFUlAocngsIGQwMCwgZDEwKTsKKyAgICAgICAgZHgxID0gTEVSUChyeCwgZDAxLCBkMTEpOworCisgICAgICAgIGR4eSA9IExFUlAocnksIGR4MCwgZHgxKTsKKworICAgICAgICBPdXRwdXRbT3V0Q2hhbl0gPSAoY21zVUludDE2TnVtYmVyKSBkeHk7CisgICAgfQorCisKKyMgICB1bmRlZiBMRVJQCisjICAgdW5kZWYgREVOUworfQorCisKKy8vIFRyaWxpbmVhciBpbnRlcnBvbGF0aW9uICgxNiBiaXRzKSAtIGNtc0Zsb2F0MzJOdW1iZXIgdmVyc2lvbgorc3RhdGljCit2b2lkIFRyaWxpbmVhckludGVycEZsb2F0KGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIgSW5wdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciBPdXRwdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBwKQorCit7CisjICAgZGVmaW5lIExFUlAoYSxsLGgpICAgICAgKGNtc0Zsb2F0MzJOdW1iZXIpICgobCkrKCgoaCktKGwpKSooYSkpKQorIyAgIGRlZmluZSBERU5TKGksaixrKSAgICAgIChMdXRUYWJsZVsoaSkrKGopKyhrKStPdXRDaGFuXSkKKworICAgIGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIqIEx1dFRhYmxlID0gKGNtc0Zsb2F0MzJOdW1iZXIqKSBwIC0+VGFibGU7CisgICAgY21zRmxvYXQzMk51bWJlciAgICAgIHB4LCBweSwgcHo7CisgICAgaW50ICAgICAgICB4MCwgeTAsIHowLAorICAgICAgICAgICAgICAgWDAsIFkwLCBaMCwgWDEsIFkxLCBaMTsKKyAgICBpbnQgICAgICAgIFRvdGFsT3V0LCBPdXRDaGFuOworICAgIGNtc0Zsb2F0MzJOdW1iZXIgICAgICBmeCwgZnksIGZ6LAorICAgICAgICBkMDAwLCBkMDAxLCBkMDEwLCBkMDExLAorICAgICAgICBkMTAwLCBkMTAxLCBkMTEwLCBkMTExLAorICAgICAgICBkeDAwLCBkeDAxLCBkeDEwLCBkeDExLAorICAgICAgICBkeHkwLCBkeHkxLCBkeHl6OworCisgICAgVG90YWxPdXQgICA9IHAgLT4gbk91dHB1dHM7CisKKyAgICAvLyBXZSBuZWVkIHNvbWUgY2xpcHBpbmcgaGVyZQorICAgIHB4ID0gZmNsYW1wKElucHV0WzBdKSAqIHAtPkRvbWFpblswXTsKKyAgICBweSA9IGZjbGFtcChJbnB1dFsxXSkgKiBwLT5Eb21haW5bMV07CisgICAgcHogPSBmY2xhbXAoSW5wdXRbMl0pICogcC0+RG9tYWluWzJdOworCisgICAgeDAgPSAoaW50KSBfY21zUXVpY2tGbG9vcihweCk7IGZ4ID0gcHggLSAoY21zRmxvYXQzMk51bWJlcikgeDA7CisgICAgeTAgPSAoaW50KSBfY21zUXVpY2tGbG9vcihweSk7IGZ5ID0gcHkgLSAoY21zRmxvYXQzMk51bWJlcikgeTA7CisgICAgejAgPSAoaW50KSBfY21zUXVpY2tGbG9vcihweik7IGZ6ID0gcHogLSAoY21zRmxvYXQzMk51bWJlcikgejA7CisKKyAgICBYMCA9IHAgLT4gb3B0YVsyXSAqIHgwOworICAgIFgxID0gWDAgKyAoSW5wdXRbMF0gPj0gMS4wID8gMCA6IHAtPm9wdGFbMl0pOworCisgICAgWTAgPSBwIC0+IG9wdGFbMV0gKiB5MDsKKyAgICBZMSA9IFkwICsgKElucHV0WzFdID49IDEuMCA/IDAgOiBwLT5vcHRhWzFdKTsKKworICAgIFowID0gcCAtPiBvcHRhWzBdICogejA7CisgICAgWjEgPSBaMCArIChJbnB1dFsyXSA+PSAxLjAgPyAwIDogcC0+b3B0YVswXSk7CisKKyAgICBmb3IgKE91dENoYW4gPSAwOyBPdXRDaGFuIDwgVG90YWxPdXQ7IE91dENoYW4rKykgeworCisgICAgICAgIGQwMDAgPSBERU5TKFgwLCBZMCwgWjApOworICAgICAgICBkMDAxID0gREVOUyhYMCwgWTAsIFoxKTsKKyAgICAgICAgZDAxMCA9IERFTlMoWDAsIFkxLCBaMCk7CisgICAgICAgIGQwMTEgPSBERU5TKFgwLCBZMSwgWjEpOworCisgICAgICAgIGQxMDAgPSBERU5TKFgxLCBZMCwgWjApOworICAgICAgICBkMTAxID0gREVOUyhYMSwgWTAsIFoxKTsKKyAgICAgICAgZDExMCA9IERFTlMoWDEsIFkxLCBaMCk7CisgICAgICAgIGQxMTEgPSBERU5TKFgxLCBZMSwgWjEpOworCisKKyAgICAgICAgZHgwMCA9IExFUlAoZngsIGQwMDAsIGQxMDApOworICAgICAgICBkeDAxID0gTEVSUChmeCwgZDAwMSwgZDEwMSk7CisgICAgICAgIGR4MTAgPSBMRVJQKGZ4LCBkMDEwLCBkMTEwKTsKKyAgICAgICAgZHgxMSA9IExFUlAoZngsIGQwMTEsIGQxMTEpOworCisgICAgICAgIGR4eTAgPSBMRVJQKGZ5LCBkeDAwLCBkeDEwKTsKKyAgICAgICAgZHh5MSA9IExFUlAoZnksIGR4MDEsIGR4MTEpOworCisgICAgICAgIGR4eXogPSBMRVJQKGZ6LCBkeHkwLCBkeHkxKTsKKworICAgICAgICBPdXRwdXRbT3V0Q2hhbl0gPSBkeHl6OworICAgIH0KKworCisjICAgdW5kZWYgTEVSUAorIyAgIHVuZGVmIERFTlMKK30KKworLy8gVHJpbGluZWFyIGludGVycG9sYXRpb24gKDE2IGJpdHMpIC0gb3B0aW1pemVkIHZlcnNpb24KK3N0YXRpYwordm9pZCBUcmlsaW5lYXJJbnRlcnAxNihyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5wdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIE91dHB1dFtdLAorICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjb25zdCBjbXNJbnRlcnBQYXJhbXMqIHApCisKK3sKKyNkZWZpbmUgREVOUyhpLGosaykgKEx1dFRhYmxlWyhpKSsoaikrKGspK091dENoYW5dKQorI2RlZmluZSBMRVJQKGEsbCxoKSAgICAgKGNtc1VJbnQxNk51bWJlcikgKGwgKyBST1VORF9GSVhFRF9UT19JTlQoKChoLWwpKmEpKSkKKworICAgICAgICAgICBjb25zdCBjbXNVSW50MTZOdW1iZXIqIEx1dFRhYmxlID0gKGNtc1VJbnQxNk51bWJlciopIHAgLT5UYWJsZTsKKyAgICAgICAgICAgaW50ICAgICAgICBPdXRDaGFuLCBUb3RhbE91dDsKKyAgICAgICAgICAgY21zUzE1Rml4ZWQxNk51bWJlciAgICBmeCwgZnksIGZ6OworICByZWdpc3RlciBpbnQgICAgICAgIHJ4LCByeSwgcno7CisgICAgICAgICAgIGludCAgICAgICAgeDAsIHkwLCB6MDsKKyAgcmVnaXN0ZXIgaW50ICAgICAgICBYMCwgWDEsIFkwLCBZMSwgWjAsIFoxOworICAgICAgICAgICBpbnQgICAgICAgIGQwMDAsIGQwMDEsIGQwMTAsIGQwMTEsCisgICAgICAgICAgICAgICAgICAgICAgZDEwMCwgZDEwMSwgZDExMCwgZDExMSwKKyAgICAgICAgICAgICAgICAgICAgICBkeDAwLCBkeDAxLCBkeDEwLCBkeDExLAorICAgICAgICAgICAgICAgICAgICAgIGR4eTAsIGR4eTEsIGR4eXo7CisKKyAgICBUb3RhbE91dCAgID0gcCAtPiBuT3V0cHV0czsKKworICAgIGZ4ID0gX2Ntc1RvRml4ZWREb21haW4oKGludCkgSW5wdXRbMF0gKiBwIC0+IERvbWFpblswXSk7CisgICAgeDAgID0gRklYRURfVE9fSU5UKGZ4KTsKKyAgICByeCAgPSBGSVhFRF9SRVNUX1RPX0lOVChmeCk7ICAgIC8vIFJlc3QgaW4gMC4uMS4wIGRvbWFpbgorCisKKyAgICBmeSA9IF9jbXNUb0ZpeGVkRG9tYWluKChpbnQpIElucHV0WzFdICogcCAtPiBEb21haW5bMV0pOworICAgIHkwICA9IEZJWEVEX1RPX0lOVChmeSk7CisgICAgcnkgID0gRklYRURfUkVTVF9UT19JTlQoZnkpOworCisgICAgZnogPSBfY21zVG9GaXhlZERvbWFpbigoaW50KSBJbnB1dFsyXSAqIHAgLT4gRG9tYWluWzJdKTsKKyAgICB6MCA9IEZJWEVEX1RPX0lOVChmeik7CisgICAgcnogPSBGSVhFRF9SRVNUX1RPX0lOVChmeik7CisKKworICAgIFgwID0gcCAtPiBvcHRhWzJdICogeDA7CisgICAgWDEgPSBYMCArIChJbnB1dFswXSA9PSAweEZGRkZVID8gMCA6IHAtPm9wdGFbMl0pOworCisgICAgWTAgPSBwIC0+IG9wdGFbMV0gKiB5MDsKKyAgICBZMSA9IFkwICsgKElucHV0WzFdID09IDB4RkZGRlUgPyAwIDogcC0+b3B0YVsxXSk7CisKKyAgICBaMCA9IHAgLT4gb3B0YVswXSAqIHowOworICAgIFoxID0gWjAgKyAoSW5wdXRbMl0gPT0gMHhGRkZGVSA/IDAgOiBwLT5vcHRhWzBdKTsKKworICAgIGZvciAoT3V0Q2hhbiA9IDA7IE91dENoYW4gPCBUb3RhbE91dDsgT3V0Q2hhbisrKSB7CisKKyAgICAgICAgZDAwMCA9IERFTlMoWDAsIFkwLCBaMCk7CisgICAgICAgIGQwMDEgPSBERU5TKFgwLCBZMCwgWjEpOworICAgICAgICBkMDEwID0gREVOUyhYMCwgWTEsIFowKTsKKyAgICAgICAgZDAxMSA9IERFTlMoWDAsIFkxLCBaMSk7CisKKyAgICAgICAgZDEwMCA9IERFTlMoWDEsIFkwLCBaMCk7CisgICAgICAgIGQxMDEgPSBERU5TKFgxLCBZMCwgWjEpOworICAgICAgICBkMTEwID0gREVOUyhYMSwgWTEsIFowKTsKKyAgICAgICAgZDExMSA9IERFTlMoWDEsIFkxLCBaMSk7CisKKworICAgICAgICBkeDAwID0gTEVSUChyeCwgZDAwMCwgZDEwMCk7CisgICAgICAgIGR4MDEgPSBMRVJQKHJ4LCBkMDAxLCBkMTAxKTsKKyAgICAgICAgZHgxMCA9IExFUlAocngsIGQwMTAsIGQxMTApOworICAgICAgICBkeDExID0gTEVSUChyeCwgZDAxMSwgZDExMSk7CisKKyAgICAgICAgZHh5MCA9IExFUlAocnksIGR4MDAsIGR4MTApOworICAgICAgICBkeHkxID0gTEVSUChyeSwgZHgwMSwgZHgxMSk7CisKKyAgICAgICAgZHh5eiA9IExFUlAocnosIGR4eTAsIGR4eTEpOworCisgICAgICAgIE91dHB1dFtPdXRDaGFuXSA9IChjbXNVSW50MTZOdW1iZXIpIGR4eXo7CisgICAgfQorCisKKyMgICB1bmRlZiBMRVJQCisjICAgdW5kZWYgREVOUworfQorCisKKy8vIFRldHJhaGVkcmFsIGludGVycG9sYXRpb24sIHVzaW5nIFNha2Ftb3RvIGFsZ29yaXRobS4KKyNkZWZpbmUgREVOUyhpLGosaykgKEx1dFRhYmxlWyhpKSsoaikrKGspK091dENoYW5dKQorc3RhdGljCit2b2lkIFRldHJhaGVkcmFsSW50ZXJwRmxvYXQoY29uc3QgY21zRmxvYXQzMk51bWJlciBJbnB1dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgT3V0cHV0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBwKQoreworICAgIGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIqIEx1dFRhYmxlID0gKGNtc0Zsb2F0MzJOdW1iZXIqKSBwIC0+IFRhYmxlOworICAgIGNtc0Zsb2F0MzJOdW1iZXIgICAgIHB4LCBweSwgcHo7CisgICAgaW50ICAgICAgICB4MCwgeTAsIHowLAorICAgICAgICAgICAgICAgWDAsIFkwLCBaMCwgWDEsIFkxLCBaMTsKKyAgICBjbXNGbG9hdDMyTnVtYmVyICAgICByeCwgcnksIHJ6OworICAgIGNtc0Zsb2F0MzJOdW1iZXIgICAgIGMwLCBjMT0wLCBjMj0wLCBjMz0wOworICAgIGludCAgICAgICAgICAgICAgICAgIE91dENoYW4sIFRvdGFsT3V0OworCisgICAgVG90YWxPdXQgICA9IHAgLT4gbk91dHB1dHM7CisKKyAgICAvLyBXZSBuZWVkIHNvbWUgY2xpcHBpbmcgaGVyZQorICAgIHB4ID0gZmNsYW1wKElucHV0WzBdKSAqIHAtPkRvbWFpblswXTsKKyAgICBweSA9IGZjbGFtcChJbnB1dFsxXSkgKiBwLT5Eb21haW5bMV07CisgICAgcHogPSBmY2xhbXAoSW5wdXRbMl0pICogcC0+RG9tYWluWzJdOworCisgICAgeDAgPSAoaW50KSBfY21zUXVpY2tGbG9vcihweCk7IHJ4ID0gKHB4IC0gKGNtc0Zsb2F0MzJOdW1iZXIpIHgwKTsKKyAgICB5MCA9IChpbnQpIF9jbXNRdWlja0Zsb29yKHB5KTsgcnkgPSAocHkgLSAoY21zRmxvYXQzMk51bWJlcikgeTApOworICAgIHowID0gKGludCkgX2Ntc1F1aWNrRmxvb3IocHopOyByeiA9IChweiAtIChjbXNGbG9hdDMyTnVtYmVyKSB6MCk7CisKKworICAgIFgwID0gcCAtPiBvcHRhWzJdICogeDA7CisgICAgWDEgPSBYMCArIChJbnB1dFswXSA+PSAxLjAgPyAwIDogcC0+b3B0YVsyXSk7CisKKyAgICBZMCA9IHAgLT4gb3B0YVsxXSAqIHkwOworICAgIFkxID0gWTAgKyAoSW5wdXRbMV0gPj0gMS4wID8gMCA6IHAtPm9wdGFbMV0pOworCisgICAgWjAgPSBwIC0+IG9wdGFbMF0gKiB6MDsKKyAgICBaMSA9IFowICsgKElucHV0WzJdID49IDEuMCA/IDAgOiBwLT5vcHRhWzBdKTsKKworICAgIGZvciAoT3V0Q2hhbj0wOyBPdXRDaGFuIDwgVG90YWxPdXQ7IE91dENoYW4rKykgeworCisgICAgICAgLy8gVGhlc2UgYXJlIHRoZSA2IFRldHJhaGVkcmFsCisKKyAgICAgICAgYzAgPSBERU5TKFgwLCBZMCwgWjApOworCisgICAgICAgIGlmIChyeCA+PSByeSAmJiByeSA+PSByeikgeworCisgICAgICAgICAgICBjMSA9IERFTlMoWDEsIFkwLCBaMCkgLSBjMDsKKyAgICAgICAgICAgIGMyID0gREVOUyhYMSwgWTEsIFowKSAtIERFTlMoWDEsIFkwLCBaMCk7CisgICAgICAgICAgICBjMyA9IERFTlMoWDEsIFkxLCBaMSkgLSBERU5TKFgxLCBZMSwgWjApOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgKHJ4ID49IHJ6ICYmIHJ6ID49IHJ5KSB7CisKKyAgICAgICAgICAgICAgICBjMSA9IERFTlMoWDEsIFkwLCBaMCkgLSBjMDsKKyAgICAgICAgICAgICAgICBjMiA9IERFTlMoWDEsIFkxLCBaMSkgLSBERU5TKFgxLCBZMCwgWjEpOworICAgICAgICAgICAgICAgIGMzID0gREVOUyhYMSwgWTAsIFoxKSAtIERFTlMoWDEsIFkwLCBaMCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpZiAocnogPj0gcnggJiYgcnggPj0gcnkpIHsKKworICAgICAgICAgICAgICAgICAgICBjMSA9IERFTlMoWDEsIFkwLCBaMSkgLSBERU5TKFgwLCBZMCwgWjEpOworICAgICAgICAgICAgICAgICAgICBjMiA9IERFTlMoWDEsIFkxLCBaMSkgLSBERU5TKFgxLCBZMCwgWjEpOworICAgICAgICAgICAgICAgICAgICBjMyA9IERFTlMoWDAsIFkwLCBaMSkgLSBjMDsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGlmIChyeSA+PSByeCAmJiByeCA+PSByeikgeworCisgICAgICAgICAgICAgICAgICAgICAgICBjMSA9IERFTlMoWDEsIFkxLCBaMCkgLSBERU5TKFgwLCBZMSwgWjApOworICAgICAgICAgICAgICAgICAgICAgICAgYzIgPSBERU5TKFgwLCBZMSwgWjApIC0gYzA7CisgICAgICAgICAgICAgICAgICAgICAgICBjMyA9IERFTlMoWDEsIFkxLCBaMSkgLSBERU5TKFgxLCBZMSwgWjApOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ5ID49IHJ6ICYmIHJ6ID49IHJ4KSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMSA9IERFTlMoWDEsIFkxLCBaMSkgLSBERU5TKFgwLCBZMSwgWjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMyID0gREVOUyhYMCwgWTEsIFowKSAtIGMwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMzID0gREVOUyhYMCwgWTEsIFoxKSAtIERFTlMoWDAsIFkxLCBaMCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnogPj0gcnkgJiYgcnkgPj0gcngpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMSA9IERFTlMoWDEsIFkxLCBaMSkgLSBERU5TKFgwLCBZMSwgWjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMiA9IERFTlMoWDAsIFkxLCBaMSkgLSBERU5TKFgwLCBZMCwgWjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMyA9IERFTlMoWDAsIFkwLCBaMSkgLSBjMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMxID0gYzIgPSBjMyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgT3V0cHV0W091dENoYW5dID0gYzAgKyBjMSAqIHJ4ICsgYzIgKiByeSArIGMzICogcno7CisgICAgICAgfQorCit9CisKKyN1bmRlZiBERU5TCisKKworCisKK3N0YXRpYwordm9pZCBUZXRyYWhlZHJhbEludGVycDE2KHJlZ2lzdGVyIGNvbnN0IGNtc1VJbnQxNk51bWJlciBJbnB1dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciBPdXRwdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjb25zdCBjbXNJbnRlcnBQYXJhbXMqIHApCit7CisgICAgY29uc3QgY21zVUludDE2TnVtYmVyKiBMdXRUYWJsZSA9IChjbXNVSW50MTZOdW1iZXIqKSBwIC0+IFRhYmxlOworICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgZngsIGZ5LCBmejsKKyAgICBjbXNTMTVGaXhlZDE2TnVtYmVyIHJ4LCByeSwgcno7CisgICAgaW50IHgwLCB5MCwgejA7CisgICAgY21zUzE1Rml4ZWQxNk51bWJlciBjMCwgYzEsIGMyLCBjMywgUmVzdDsKKyAgICBjbXNTMTVGaXhlZDE2TnVtYmVyIFgwLCBYMSwgWTAsIFkxLCBaMCwgWjE7CisgICAgY21zVUludDMyTnVtYmVyIFRvdGFsT3V0ID0gcCAtPiBuT3V0cHV0czsKKworICAgIGZ4ID0gX2Ntc1RvRml4ZWREb21haW4oKGludCkgSW5wdXRbMF0gKiBwIC0+IERvbWFpblswXSk7CisgICAgZnkgPSBfY21zVG9GaXhlZERvbWFpbigoaW50KSBJbnB1dFsxXSAqIHAgLT4gRG9tYWluWzFdKTsKKyAgICBmeiA9IF9jbXNUb0ZpeGVkRG9tYWluKChpbnQpIElucHV0WzJdICogcCAtPiBEb21haW5bMl0pOworCisgICAgeDAgPSBGSVhFRF9UT19JTlQoZngpOworICAgIHkwID0gRklYRURfVE9fSU5UKGZ5KTsKKyAgICB6MCA9IEZJWEVEX1RPX0lOVChmeik7CisKKyAgICByeCA9IEZJWEVEX1JFU1RfVE9fSU5UKGZ4KTsKKyAgICByeSA9IEZJWEVEX1JFU1RfVE9fSU5UKGZ5KTsKKyAgICByeiA9IEZJWEVEX1JFU1RfVE9fSU5UKGZ6KTsKKworICAgIFgwID0gcCAtPiBvcHRhWzJdICogeDA7CisgICAgWDEgPSAoSW5wdXRbMF0gPT0gMHhGRkZGVSA/IDAgOiBwLT5vcHRhWzJdKTsKKworICAgIFkwID0gcCAtPiBvcHRhWzFdICogeTA7CisgICAgWTEgPSAoSW5wdXRbMV0gPT0gMHhGRkZGVSA/IDAgOiBwLT5vcHRhWzFdKTsKKworICAgIFowID0gcCAtPiBvcHRhWzBdICogejA7CisgICAgWjEgPSAoSW5wdXRbMl0gPT0gMHhGRkZGVSA/IDAgOiBwLT5vcHRhWzBdKTsKKworICAgIEx1dFRhYmxlID0gJkx1dFRhYmxlW1gwK1kwK1owXTsKKworICAgIC8vIE91dHB1dCBzaG91bGQgYmUgY29tcHV0ZWQgYXMgeCA9IFJPVU5EX0ZJWEVEX1RPX0lOVChfY21zVG9GaXhlZERvbWFpbihSZXN0KSkKKyAgICAvLyB3aGljaCBleHBhbmRzIGFzOiB4ID0gKFJlc3QgKyAoKFJlc3QrMHg3ZmZmKS8weEZGRkYpICsgMHg4MDAwKT4+MTYKKyAgICAvLyBUaGlzIGNhbiBiZSByZXBsYWNlZCBieTogdCA9IFJlc3QrMHg4MDAxLCB4ID0gKHQgKyAodD4+MTYpKT4+MTYKKyAgICAvLyBhdCB0aGUgY29zdCBvZiBiZWluZyBvZmYgYnkgb25lIGF0IDdmZmYgYW5kIDE3ZmZlLgorCisgICAgaWYgKHJ4ID49IHJ5KSB7CisgICAgICAgIGlmIChyeSA+PSByeikgeworICAgICAgICAgICAgWTEgKz0gWDE7CisgICAgICAgICAgICBaMSArPSBZMTsKKyAgICAgICAgICAgIGZvciAoOyBUb3RhbE91dDsgVG90YWxPdXQtLSkgeworICAgICAgICAgICAgICAgIGMxID0gTHV0VGFibGVbWDFdOworICAgICAgICAgICAgICAgIGMyID0gTHV0VGFibGVbWTFdOworICAgICAgICAgICAgICAgIGMzID0gTHV0VGFibGVbWjFdOworICAgICAgICAgICAgICAgIGMwID0gKkx1dFRhYmxlKys7CisgICAgICAgICAgICAgICAgYzMgLT0gYzI7CisgICAgICAgICAgICAgICAgYzIgLT0gYzE7CisgICAgICAgICAgICAgICAgYzEgLT0gYzA7CisgICAgICAgICAgICAgICAgUmVzdCA9IGMxICogcnggKyBjMiAqIHJ5ICsgYzMgKiByeiArIDB4ODAwMTsKKyAgICAgICAgICAgICAgICAqT3V0cHV0KysgPSAoY21zVUludDE2TnVtYmVyKSBjMCArICgoUmVzdCArIChSZXN0Pj4xNikpPj4xNik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocnogPj0gcngpIHsKKyAgICAgICAgICAgIFgxICs9IFoxOworICAgICAgICAgICAgWTEgKz0gWDE7CisgICAgICAgICAgICBmb3IgKDsgVG90YWxPdXQ7IFRvdGFsT3V0LS0pIHsKKyAgICAgICAgICAgICAgICBjMSA9IEx1dFRhYmxlW1gxXTsKKyAgICAgICAgICAgICAgICBjMiA9IEx1dFRhYmxlW1kxXTsKKyAgICAgICAgICAgICAgICBjMyA9IEx1dFRhYmxlW1oxXTsKKyAgICAgICAgICAgICAgICBjMCA9ICpMdXRUYWJsZSsrOworICAgICAgICAgICAgICAgIGMyIC09IGMxOworICAgICAgICAgICAgICAgIGMxIC09IGMzOworICAgICAgICAgICAgICAgIGMzIC09IGMwOworICAgICAgICAgICAgICAgIFJlc3QgPSBjMSAqIHJ4ICsgYzIgKiByeSArIGMzICogcnogKyAweDgwMDE7CisgICAgICAgICAgICAgICAgKk91dHB1dCsrID0gKGNtc1VJbnQxNk51bWJlcikgYzAgKyAoKFJlc3QgKyAoUmVzdD4+MTYpKT4+MTYpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgWjEgKz0gWDE7CisgICAgICAgICAgICBZMSArPSBaMTsKKyAgICAgICAgICAgIGZvciAoOyBUb3RhbE91dDsgVG90YWxPdXQtLSkgeworICAgICAgICAgICAgICAgIGMxID0gTHV0VGFibGVbWDFdOworICAgICAgICAgICAgICAgIGMyID0gTHV0VGFibGVbWTFdOworICAgICAgICAgICAgICAgIGMzID0gTHV0VGFibGVbWjFdOworICAgICAgICAgICAgICAgIGMwID0gKkx1dFRhYmxlKys7CisgICAgICAgICAgICAgICAgYzIgLT0gYzM7CisgICAgICAgICAgICAgICAgYzMgLT0gYzE7CisgICAgICAgICAgICAgICAgYzEgLT0gYzA7CisgICAgICAgICAgICAgICAgUmVzdCA9IGMxICogcnggKyBjMiAqIHJ5ICsgYzMgKiByeiArIDB4ODAwMTsKKyAgICAgICAgICAgICAgICAqT3V0cHV0KysgPSAoY21zVUludDE2TnVtYmVyKSBjMCArICgoUmVzdCArIChSZXN0Pj4xNikpPj4xNik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocnggPj0gcnopIHsKKyAgICAgICAgICAgIFgxICs9IFkxOworICAgICAgICAgICAgWjEgKz0gWDE7CisgICAgICAgICAgICBmb3IgKDsgVG90YWxPdXQ7IFRvdGFsT3V0LS0pIHsKKyAgICAgICAgICAgICAgICBjMSA9IEx1dFRhYmxlW1gxXTsKKyAgICAgICAgICAgICAgICBjMiA9IEx1dFRhYmxlW1kxXTsKKyAgICAgICAgICAgICAgICBjMyA9IEx1dFRhYmxlW1oxXTsKKyAgICAgICAgICAgICAgICBjMCA9ICpMdXRUYWJsZSsrOworICAgICAgICAgICAgICAgIGMzIC09IGMxOworICAgICAgICAgICAgICAgIGMxIC09IGMyOworICAgICAgICAgICAgICAgIGMyIC09IGMwOworICAgICAgICAgICAgICAgIFJlc3QgPSBjMSAqIHJ4ICsgYzIgKiByeSArIGMzICogcnogKyAweDgwMDE7CisgICAgICAgICAgICAgICAgKk91dHB1dCsrID0gKGNtc1VJbnQxNk51bWJlcikgYzAgKyAoKFJlc3QgKyAoUmVzdD4+MTYpKT4+MTYpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHJ5ID49IHJ6KSB7CisgICAgICAgICAgICBaMSArPSBZMTsKKyAgICAgICAgICAgIFgxICs9IFoxOworICAgICAgICAgICAgZm9yICg7IFRvdGFsT3V0OyBUb3RhbE91dC0tKSB7CisgICAgICAgICAgICAgICAgYzEgPSBMdXRUYWJsZVtYMV07CisgICAgICAgICAgICAgICAgYzIgPSBMdXRUYWJsZVtZMV07CisgICAgICAgICAgICAgICAgYzMgPSBMdXRUYWJsZVtaMV07CisgICAgICAgICAgICAgICAgYzAgPSAqTHV0VGFibGUrKzsKKyAgICAgICAgICAgICAgICBjMSAtPSBjMzsKKyAgICAgICAgICAgICAgICBjMyAtPSBjMjsKKyAgICAgICAgICAgICAgICBjMiAtPSBjMDsKKyAgICAgICAgICAgICAgICBSZXN0ID0gYzEgKiByeCArIGMyICogcnkgKyBjMyAqIHJ6ICsgMHg4MDAxOworICAgICAgICAgICAgICAgICpPdXRwdXQrKyA9IChjbXNVSW50MTZOdW1iZXIpIGMwICsgKChSZXN0ICsgKFJlc3Q+PjE2KSk+PjE2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFkxICs9IFoxOworICAgICAgICAgICAgWDEgKz0gWTE7CisgICAgICAgICAgICBmb3IgKDsgVG90YWxPdXQ7IFRvdGFsT3V0LS0pIHsKKyAgICAgICAgICAgICAgICBjMSA9IEx1dFRhYmxlW1gxXTsKKyAgICAgICAgICAgICAgICBjMiA9IEx1dFRhYmxlW1kxXTsKKyAgICAgICAgICAgICAgICBjMyA9IEx1dFRhYmxlW1oxXTsKKyAgICAgICAgICAgICAgICBjMCA9ICpMdXRUYWJsZSsrOworICAgICAgICAgICAgICAgIGMxIC09IGMyOworICAgICAgICAgICAgICAgIGMyIC09IGMzOworICAgICAgICAgICAgICAgIGMzIC09IGMwOworICAgICAgICAgICAgICAgIFJlc3QgPSBjMSAqIHJ4ICsgYzIgKiByeSArIGMzICogcnogKyAweDgwMDE7CisgICAgICAgICAgICAgICAgKk91dHB1dCsrID0gKGNtc1VJbnQxNk51bWJlcikgYzAgKyAoKFJlc3QgKyAoUmVzdD4+MTYpKT4+MTYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKyNkZWZpbmUgREVOUyhpLGosaykgKEx1dFRhYmxlWyhpKSsoaikrKGspK091dENoYW5dKQorc3RhdGljCit2b2lkIEV2YWw0SW5wdXRzKHJlZ2lzdGVyIGNvbnN0IGNtc1VJbnQxNk51bWJlciBJbnB1dFtdLAorICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIE91dHB1dFtdLAorICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBwMTYpCit7CisgICAgY29uc3QgY21zVUludDE2TnVtYmVyKiBMdXRUYWJsZTsKKyAgICBjbXNTMTVGaXhlZDE2TnVtYmVyIGZrOworICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgazAsIHJrOworICAgIGludCBLMCwgSzE7CisgICAgY21zUzE1Rml4ZWQxNk51bWJlciAgICBmeCwgZnksIGZ6OworICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgICAgcngsIHJ5LCByejsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIHgwLCB5MCwgejA7CisgICAgY21zUzE1Rml4ZWQxNk51bWJlciAgICBYMCwgWDEsIFkwLCBZMSwgWjAsIFoxOworICAgIGNtc1VJbnQzMk51bWJlciBpOworICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgICAgYzAsIGMxLCBjMiwgYzMsIFJlc3Q7CisgICAgY21zVUludDMyTnVtYmVyICAgICAgICBPdXRDaGFuOworICAgIGNtc1VJbnQxNk51bWJlciAgICAgICAgVG1wMVtNQVhfU1RBR0VfQ0hBTk5FTFNdLCBUbXAyW01BWF9TVEFHRV9DSEFOTkVMU107CisKKworICAgIGZrICA9IF9jbXNUb0ZpeGVkRG9tYWluKChpbnQpIElucHV0WzBdICogcDE2IC0+IERvbWFpblswXSk7CisgICAgZnggID0gX2Ntc1RvRml4ZWREb21haW4oKGludCkgSW5wdXRbMV0gKiBwMTYgLT4gRG9tYWluWzFdKTsKKyAgICBmeSAgPSBfY21zVG9GaXhlZERvbWFpbigoaW50KSBJbnB1dFsyXSAqIHAxNiAtPiBEb21haW5bMl0pOworICAgIGZ6ICA9IF9jbXNUb0ZpeGVkRG9tYWluKChpbnQpIElucHV0WzNdICogcDE2IC0+IERvbWFpblszXSk7CisKKyAgICBrMCAgPSBGSVhFRF9UT19JTlQoZmspOworICAgIHgwICA9IEZJWEVEX1RPX0lOVChmeCk7CisgICAgeTAgID0gRklYRURfVE9fSU5UKGZ5KTsKKyAgICB6MCAgPSBGSVhFRF9UT19JTlQoZnopOworCisgICAgcmsgID0gRklYRURfUkVTVF9UT19JTlQoZmspOworICAgIHJ4ICA9IEZJWEVEX1JFU1RfVE9fSU5UKGZ4KTsKKyAgICByeSAgPSBGSVhFRF9SRVNUX1RPX0lOVChmeSk7CisgICAgcnogID0gRklYRURfUkVTVF9UT19JTlQoZnopOworCisgICAgSzAgPSBwMTYgLT4gb3B0YVszXSAqIGswOworICAgIEsxID0gSzAgKyAoSW5wdXRbMF0gPT0gMHhGRkZGVSA/IDAgOiBwMTYtPm9wdGFbM10pOworCisgICAgWDAgPSBwMTYgLT4gb3B0YVsyXSAqIHgwOworICAgIFgxID0gWDAgKyAoSW5wdXRbMV0gPT0gMHhGRkZGVSA/IDAgOiBwMTYtPm9wdGFbMl0pOworCisgICAgWTAgPSBwMTYgLT4gb3B0YVsxXSAqIHkwOworICAgIFkxID0gWTAgKyAoSW5wdXRbMl0gPT0gMHhGRkZGVSA/IDAgOiBwMTYtPm9wdGFbMV0pOworCisgICAgWjAgPSBwMTYgLT4gb3B0YVswXSAqIHowOworICAgIFoxID0gWjAgKyAoSW5wdXRbM10gPT0gMHhGRkZGVSA/IDAgOiBwMTYtPm9wdGFbMF0pOworCisgICAgTHV0VGFibGUgPSAoY21zVUludDE2TnVtYmVyKikgcDE2IC0+IFRhYmxlOworICAgIEx1dFRhYmxlICs9IEswOworCisgICAgZm9yIChPdXRDaGFuPTA7IE91dENoYW4gPCBwMTYgLT4gbk91dHB1dHM7IE91dENoYW4rKykgeworCisgICAgICAgIGMwID0gREVOUyhYMCwgWTAsIFowKTsKKworICAgICAgICBpZiAocnggPj0gcnkgJiYgcnkgPj0gcnopIHsKKworICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMCwgWjApIC0gYzA7CisgICAgICAgICAgICBjMiA9IERFTlMoWDEsIFkxLCBaMCkgLSBERU5TKFgxLCBZMCwgWjApOworICAgICAgICAgICAgYzMgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMSwgWTEsIFowKTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIChyeCA+PSByeiAmJiByeiA+PSByeSkgeworCisgICAgICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMCwgWjApIC0gYzA7CisgICAgICAgICAgICAgICAgYzIgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMSwgWTAsIFoxKTsKKyAgICAgICAgICAgICAgICBjMyA9IERFTlMoWDEsIFkwLCBaMSkgLSBERU5TKFgxLCBZMCwgWjApOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaWYgKHJ6ID49IHJ4ICYmIHJ4ID49IHJ5KSB7CisKKyAgICAgICAgICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMCwgWjEpIC0gREVOUyhYMCwgWTAsIFoxKTsKKyAgICAgICAgICAgICAgICAgICAgYzIgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMSwgWTAsIFoxKTsKKyAgICAgICAgICAgICAgICAgICAgYzMgPSBERU5TKFgwLCBZMCwgWjEpIC0gYzA7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpZiAocnkgPj0gcnggJiYgcnggPj0gcnopIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMSwgWjApIC0gREVOUyhYMCwgWTEsIFowKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMyID0gREVOUyhYMCwgWTEsIFowKSAtIGMwOworICAgICAgICAgICAgICAgICAgICAgICAgYzMgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMSwgWTEsIFowKTsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyeSA+PSByeiAmJiByeiA+PSByeCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMCwgWTEsIFoxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMiA9IERFTlMoWDAsIFkxLCBaMCkgLSBjMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMyA9IERFTlMoWDAsIFkxLCBaMSkgLSBERU5TKFgwLCBZMSwgWjApOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ6ID49IHJ5ICYmIHJ5ID49IHJ4KSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMCwgWTEsIFoxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzIgPSBERU5TKFgwLCBZMSwgWjEpIC0gREVOUyhYMCwgWTAsIFoxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzMgPSBERU5TKFgwLCBZMCwgWjEpIC0gYzA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMSA9IGMyID0gYzMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3QgPSBjMSAqIHJ4ICsgYzIgKiByeSArIGMzICogcno7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUbXAxW091dENoYW5dID0gKGNtc1VJbnQxNk51bWJlcikgKCBjMCArIFJPVU5EX0ZJWEVEX1RPX0lOVChfY21zVG9GaXhlZERvbWFpbihSZXN0KSkpOworICAgIH0KKworCisgICAgTHV0VGFibGUgPSAoY21zVUludDE2TnVtYmVyKikgcDE2IC0+IFRhYmxlOworICAgIEx1dFRhYmxlICs9IEsxOworCisgICAgZm9yIChPdXRDaGFuPTA7IE91dENoYW4gPCBwMTYgLT4gbk91dHB1dHM7IE91dENoYW4rKykgeworCisgICAgICAgIGMwID0gREVOUyhYMCwgWTAsIFowKTsKKworICAgICAgICBpZiAocnggPj0gcnkgJiYgcnkgPj0gcnopIHsKKworICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMCwgWjApIC0gYzA7CisgICAgICAgICAgICBjMiA9IERFTlMoWDEsIFkxLCBaMCkgLSBERU5TKFgxLCBZMCwgWjApOworICAgICAgICAgICAgYzMgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMSwgWTEsIFowKTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIChyeCA+PSByeiAmJiByeiA+PSByeSkgeworCisgICAgICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMCwgWjApIC0gYzA7CisgICAgICAgICAgICAgICAgYzIgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMSwgWTAsIFoxKTsKKyAgICAgICAgICAgICAgICBjMyA9IERFTlMoWDEsIFkwLCBaMSkgLSBERU5TKFgxLCBZMCwgWjApOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaWYgKHJ6ID49IHJ4ICYmIHJ4ID49IHJ5KSB7CisKKyAgICAgICAgICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMCwgWjEpIC0gREVOUyhYMCwgWTAsIFoxKTsKKyAgICAgICAgICAgICAgICAgICAgYzIgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMSwgWTAsIFoxKTsKKyAgICAgICAgICAgICAgICAgICAgYzMgPSBERU5TKFgwLCBZMCwgWjEpIC0gYzA7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpZiAocnkgPj0gcnggJiYgcnggPj0gcnopIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMSwgWjApIC0gREVOUyhYMCwgWTEsIFowKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMyID0gREVOUyhYMCwgWTEsIFowKSAtIGMwOworICAgICAgICAgICAgICAgICAgICAgICAgYzMgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMSwgWTEsIFowKTsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyeSA+PSByeiAmJiByeiA+PSByeCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMCwgWTEsIFoxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMiA9IERFTlMoWDAsIFkxLCBaMCkgLSBjMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMyA9IERFTlMoWDAsIFkxLCBaMSkgLSBERU5TKFgwLCBZMSwgWjApOworCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ6ID49IHJ5ICYmIHJ5ID49IHJ4KSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMCwgWTEsIFoxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzIgPSBERU5TKFgwLCBZMSwgWjEpIC0gREVOUyhYMCwgWTAsIFoxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzMgPSBERU5TKFgwLCBZMCwgWjEpIC0gYzA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMSA9IGMyID0gYzMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3QgPSBjMSAqIHJ4ICsgYzIgKiByeSArIGMzICogcno7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUbXAyW091dENoYW5dID0gKGNtc1VJbnQxNk51bWJlcikgKGMwICsgUk9VTkRfRklYRURfVE9fSU5UKF9jbXNUb0ZpeGVkRG9tYWluKFJlc3QpKSk7CisgICAgfQorCisKKworICAgIGZvciAoaT0wOyBpIDwgcDE2IC0+IG5PdXRwdXRzOyBpKyspIHsKKyAgICAgICAgT3V0cHV0W2ldID0gTGluZWFySW50ZXJwKHJrLCBUbXAxW2ldLCBUbXAyW2ldKTsKKyAgICB9Cit9CisjdW5kZWYgREVOUworCisKKy8vIEZvciBtb3JlIHRoYXQgMyBpbnB1dHMgKGkuZS4sIENNWUspCisvLyBldmFsdWF0ZSB0d28gMy1kaW1lbnNpb25hbCBpbnRlcnBvbGF0aW9ucyBhbmQgdGhlbiBsaW5lYXJseSBpbnRlcnBvbGF0ZSBiZXR3ZWVuIHRoZW0uCisKKworc3RhdGljCit2b2lkIEV2YWw0SW5wdXRzRmxvYXQoY29uc3QgY21zRmxvYXQzMk51bWJlciBJbnB1dFtdLAorICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgT3V0cHV0W10sCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBwKQoreworICAgICAgIGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIqIEx1dFRhYmxlID0gKGNtc0Zsb2F0MzJOdW1iZXIqKSBwIC0+IFRhYmxlOworICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgcmVzdDsKKyAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHBrOworICAgICAgIGludCBrMCwgSzAsIEsxOworICAgICAgIGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIqIFQ7CisgICAgICAgY21zVUludDMyTnVtYmVyIGk7CisgICAgICAgY21zRmxvYXQzMk51bWJlciBUbXAxW01BWF9TVEFHRV9DSEFOTkVMU10sIFRtcDJbTUFYX1NUQUdFX0NIQU5ORUxTXTsKKyAgICAgICBjbXNJbnRlcnBQYXJhbXMgcDE7CisKKyAgICAgICBwayA9IGZjbGFtcChJbnB1dFswXSkgKiBwLT5Eb21haW5bMF07CisgICAgICAgazAgPSBfY21zUXVpY2tGbG9vcihwayk7CisgICAgICAgcmVzdCA9IHBrIC0gKGNtc0Zsb2F0MzJOdW1iZXIpIGswOworCisgICAgICAgSzAgPSBwIC0+IG9wdGFbM10gKiBrMDsKKyAgICAgICBLMSA9IEswICsgKElucHV0WzBdID49IDEuMCA/IDAgOiBwLT5vcHRhWzNdKTsKKworICAgICAgIHAxID0gKnA7CisgICAgICAgbWVtbW92ZSgmcDEuRG9tYWluWzBdLCAmcCAtPkRvbWFpblsxXSwgMypzaXplb2YoY21zVUludDMyTnVtYmVyKSk7CisKKyAgICAgICBUID0gTHV0VGFibGUgKyBLMDsKKyAgICAgICBwMS5UYWJsZSA9IFQ7CisKKyAgICAgICBUZXRyYWhlZHJhbEludGVycEZsb2F0KElucHV0ICsgMSwgIFRtcDEsICZwMSk7CisKKyAgICAgICBUID0gTHV0VGFibGUgKyBLMTsKKyAgICAgICBwMS5UYWJsZSA9IFQ7CisgICAgICAgVGV0cmFoZWRyYWxJbnRlcnBGbG9hdChJbnB1dCArIDEsICBUbXAyLCAmcDEpOworCisgICAgICAgZm9yIChpPTA7IGkgPCBwIC0+IG5PdXRwdXRzOyBpKyspCisgICAgICAgeworICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHkwID0gVG1wMVtpXTsKKyAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciB5MSA9IFRtcDJbaV07CisKKyAgICAgICAgICAgICAgT3V0cHV0W2ldID0geTAgKyAoeTEgLSB5MCkgKiByZXN0OworICAgICAgIH0KK30KKworCitzdGF0aWMKK3ZvaWQgRXZhbDVJbnB1dHMocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIElucHV0W10sCisgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciBPdXRwdXRbXSwKKworICAgICAgICAgICAgICAgICByZWdpc3RlciBjb25zdCBjbXNJbnRlcnBQYXJhbXMqIHAxNikKK3sKKyAgICAgICBjb25zdCBjbXNVSW50MTZOdW1iZXIqIEx1dFRhYmxlID0gKGNtc1VJbnQxNk51bWJlciopIHAxNiAtPiBUYWJsZTsKKyAgICAgICBjbXNTMTVGaXhlZDE2TnVtYmVyIGZrOworICAgICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgazAsIHJrOworICAgICAgIGludCBLMCwgSzE7CisgICAgICAgY29uc3QgY21zVUludDE2TnVtYmVyKiBUOworICAgICAgIGNtc1VJbnQzMk51bWJlciBpOworICAgICAgIGNtc1VJbnQxNk51bWJlciBUbXAxW01BWF9TVEFHRV9DSEFOTkVMU10sIFRtcDJbTUFYX1NUQUdFX0NIQU5ORUxTXTsKKyAgICAgICBjbXNJbnRlcnBQYXJhbXMgcDE7CisKKworICAgICAgIGZrID0gX2Ntc1RvRml4ZWREb21haW4oKGNtc1MxNUZpeGVkMTZOdW1iZXIpIElucHV0WzBdICogcDE2IC0+IERvbWFpblswXSk7CisgICAgICAgazAgPSBGSVhFRF9UT19JTlQoZmspOworICAgICAgIHJrID0gRklYRURfUkVTVF9UT19JTlQoZmspOworCisgICAgICAgSzAgPSBwMTYgLT4gb3B0YVs0XSAqIGswOworICAgICAgIEsxID0gcDE2IC0+IG9wdGFbNF0gKiAoazAgKyAoSW5wdXRbMF0gIT0gMHhGRkZGVSA/IDEgOiAwKSk7CisKKyAgICAgICBwMSA9ICpwMTY7CisgICAgICAgbWVtbW92ZSgmcDEuRG9tYWluWzBdLCAmcDE2IC0+RG9tYWluWzFdLCA0KnNpemVvZihjbXNVSW50MzJOdW1iZXIpKTsKKworICAgICAgIFQgPSBMdXRUYWJsZSArIEswOworICAgICAgIHAxLlRhYmxlID0gVDsKKworICAgICAgIEV2YWw0SW5wdXRzKElucHV0ICsgMSwgVG1wMSwgJnAxKTsKKworICAgICAgIFQgPSBMdXRUYWJsZSArIEsxOworICAgICAgIHAxLlRhYmxlID0gVDsKKworICAgICAgIEV2YWw0SW5wdXRzKElucHV0ICsgMSwgVG1wMiwgJnAxKTsKKworICAgICAgIGZvciAoaT0wOyBpIDwgcDE2IC0+IG5PdXRwdXRzOyBpKyspIHsKKworICAgICAgICAgICAgICBPdXRwdXRbaV0gPSBMaW5lYXJJbnRlcnAocmssIFRtcDFbaV0sIFRtcDJbaV0pOworICAgICAgIH0KKworfQorCisKK3N0YXRpYwordm9pZCBFdmFsNUlucHV0c0Zsb2F0KGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIgSW5wdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIE91dHB1dFtdLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0ludGVycFBhcmFtcyogcCkKK3sKKyAgICAgICBjb25zdCBjbXNGbG9hdDMyTnVtYmVyKiBMdXRUYWJsZSA9IChjbXNGbG9hdDMyTnVtYmVyKikgcCAtPiBUYWJsZTsKKyAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHJlc3Q7CisgICAgICAgY21zRmxvYXQzMk51bWJlciBwazsKKyAgICAgICBpbnQgazAsIEswLCBLMTsKKyAgICAgICBjb25zdCBjbXNGbG9hdDMyTnVtYmVyKiBUOworICAgICAgIGNtc1VJbnQzMk51bWJlciBpOworICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgVG1wMVtNQVhfU1RBR0VfQ0hBTk5FTFNdLCBUbXAyW01BWF9TVEFHRV9DSEFOTkVMU107CisgICAgICAgY21zSW50ZXJwUGFyYW1zIHAxOworCisgICAgICAgcGsgPSBmY2xhbXAoSW5wdXRbMF0pICogcC0+RG9tYWluWzBdOworICAgICAgIGswID0gX2Ntc1F1aWNrRmxvb3IocGspOworICAgICAgIHJlc3QgPSBwayAtIChjbXNGbG9hdDMyTnVtYmVyKSBrMDsKKworICAgICAgIEswID0gcCAtPiBvcHRhWzRdICogazA7CisgICAgICAgSzEgPSBLMCArIChJbnB1dFswXSA+PSAxLjAgPyAwIDogcC0+b3B0YVs0XSk7CisKKyAgICAgICBwMSA9ICpwOworICAgICAgIG1lbW1vdmUoJnAxLkRvbWFpblswXSwgJnAgLT5Eb21haW5bMV0sIDQqc2l6ZW9mKGNtc1VJbnQzMk51bWJlcikpOworCisgICAgICAgVCA9IEx1dFRhYmxlICsgSzA7CisgICAgICAgcDEuVGFibGUgPSBUOworCisgICAgICAgRXZhbDRJbnB1dHNGbG9hdChJbnB1dCArIDEsICBUbXAxLCAmcDEpOworCisgICAgICAgVCA9IEx1dFRhYmxlICsgSzE7CisgICAgICAgcDEuVGFibGUgPSBUOworCisgICAgICAgRXZhbDRJbnB1dHNGbG9hdChJbnB1dCArIDEsICBUbXAyLCAmcDEpOworCisgICAgICAgZm9yIChpPTA7IGkgPCBwIC0+IG5PdXRwdXRzOyBpKyspIHsKKworICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHkwID0gVG1wMVtpXTsKKyAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciB5MSA9IFRtcDJbaV07CisKKyAgICAgICAgICAgICAgT3V0cHV0W2ldID0geTAgKyAoeTEgLSB5MCkgKiByZXN0OworICAgICAgIH0KK30KKworCisKK3N0YXRpYwordm9pZCBFdmFsNklucHV0cyhyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5wdXRbXSwKKyAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIE91dHB1dFtdLAorICAgICAgICAgICAgICAgICByZWdpc3RlciBjb25zdCBjbXNJbnRlcnBQYXJhbXMqIHAxNikKK3sKKyAgICAgICBjb25zdCBjbXNVSW50MTZOdW1iZXIqIEx1dFRhYmxlID0gKGNtc1VJbnQxNk51bWJlciopIHAxNiAtPiBUYWJsZTsKKyAgICAgICBjbXNTMTVGaXhlZDE2TnVtYmVyIGZrOworICAgICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgazAsIHJrOworICAgICAgIGludCBLMCwgSzE7CisgICAgICAgY29uc3QgY21zVUludDE2TnVtYmVyKiBUOworICAgICAgIGNtc1VJbnQzMk51bWJlciBpOworICAgICAgIGNtc1VJbnQxNk51bWJlciBUbXAxW01BWF9TVEFHRV9DSEFOTkVMU10sIFRtcDJbTUFYX1NUQUdFX0NIQU5ORUxTXTsKKyAgICAgICBjbXNJbnRlcnBQYXJhbXMgcDE7CisKKyAgICAgICBmayA9IF9jbXNUb0ZpeGVkRG9tYWluKChjbXNTMTVGaXhlZDE2TnVtYmVyKSBJbnB1dFswXSAqIHAxNiAtPiBEb21haW5bMF0pOworICAgICAgIGswID0gRklYRURfVE9fSU5UKGZrKTsKKyAgICAgICByayA9IEZJWEVEX1JFU1RfVE9fSU5UKGZrKTsKKworICAgICAgIEswID0gcDE2IC0+IG9wdGFbNV0gKiBrMDsKKyAgICAgICBLMSA9IHAxNiAtPiBvcHRhWzVdICogKGswICsgKElucHV0WzBdICE9IDB4RkZGRlUgPyAxIDogMCkpOworCisgICAgICAgcDEgPSAqcDE2OworICAgICAgIG1lbW1vdmUoJnAxLkRvbWFpblswXSwgJnAxNiAtPkRvbWFpblsxXSwgNSpzaXplb2YoY21zVUludDMyTnVtYmVyKSk7CisKKyAgICAgICBUID0gTHV0VGFibGUgKyBLMDsKKyAgICAgICBwMS5UYWJsZSA9IFQ7CisKKyAgICAgICBFdmFsNUlucHV0cyhJbnB1dCArIDEsIFRtcDEsICZwMSk7CisKKyAgICAgICBUID0gTHV0VGFibGUgKyBLMTsKKyAgICAgICBwMS5UYWJsZSA9IFQ7CisKKyAgICAgICBFdmFsNUlucHV0cyhJbnB1dCArIDEsIFRtcDIsICZwMSk7CisKKyAgICAgICBmb3IgKGk9MDsgaSA8IHAxNiAtPiBuT3V0cHV0czsgaSsrKSB7CisKKyAgICAgICAgICAgICAgT3V0cHV0W2ldID0gTGluZWFySW50ZXJwKHJrLCBUbXAxW2ldLCBUbXAyW2ldKTsKKyAgICAgICB9CisKK30KKworCitzdGF0aWMKK3ZvaWQgRXZhbDZJbnB1dHNGbG9hdChjb25zdCBjbXNGbG9hdDMyTnVtYmVyIElucHV0W10sCisgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciBPdXRwdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNJbnRlcnBQYXJhbXMqIHApCit7CisgICAgICAgY29uc3QgY21zRmxvYXQzMk51bWJlciogTHV0VGFibGUgPSAoY21zRmxvYXQzMk51bWJlciopIHAgLT4gVGFibGU7CisgICAgICAgY21zRmxvYXQzMk51bWJlciByZXN0OworICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgcGs7CisgICAgICAgaW50IGswLCBLMCwgSzE7CisgICAgICAgY29uc3QgY21zRmxvYXQzMk51bWJlciogVDsKKyAgICAgICBjbXNVSW50MzJOdW1iZXIgaTsKKyAgICAgICBjbXNGbG9hdDMyTnVtYmVyIFRtcDFbTUFYX1NUQUdFX0NIQU5ORUxTXSwgVG1wMltNQVhfU1RBR0VfQ0hBTk5FTFNdOworICAgICAgIGNtc0ludGVycFBhcmFtcyBwMTsKKworICAgICAgIHBrID0gZmNsYW1wKElucHV0WzBdKSAqIHAtPkRvbWFpblswXTsKKyAgICAgICBrMCA9IF9jbXNRdWlja0Zsb29yKHBrKTsKKyAgICAgICByZXN0ID0gcGsgLSAoY21zRmxvYXQzMk51bWJlcikgazA7CisKKyAgICAgICBLMCA9IHAgLT4gb3B0YVs1XSAqIGswOworICAgICAgIEsxID0gSzAgKyAoSW5wdXRbMF0gPj0gMS4wID8gMCA6IHAtPm9wdGFbNV0pOworCisgICAgICAgcDEgPSAqcDsKKyAgICAgICBtZW1tb3ZlKCZwMS5Eb21haW5bMF0sICZwIC0+RG9tYWluWzFdLCA1KnNpemVvZihjbXNVSW50MzJOdW1iZXIpKTsKKworICAgICAgIFQgPSBMdXRUYWJsZSArIEswOworICAgICAgIHAxLlRhYmxlID0gVDsKKworICAgICAgIEV2YWw1SW5wdXRzRmxvYXQoSW5wdXQgKyAxLCAgVG1wMSwgJnAxKTsKKworICAgICAgIFQgPSBMdXRUYWJsZSArIEsxOworICAgICAgIHAxLlRhYmxlID0gVDsKKworICAgICAgIEV2YWw1SW5wdXRzRmxvYXQoSW5wdXQgKyAxLCAgVG1wMiwgJnAxKTsKKworICAgICAgIGZvciAoaT0wOyBpIDwgcCAtPiBuT3V0cHV0czsgaSsrKSB7CisKKyAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciB5MCA9IFRtcDFbaV07CisgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgeTEgPSBUbXAyW2ldOworCisgICAgICAgICAgICAgIE91dHB1dFtpXSA9IHkwICsgKHkxIC0geTApICogcmVzdDsKKyAgICAgICB9Cit9CisKKworc3RhdGljCit2b2lkIEV2YWw3SW5wdXRzKHJlZ2lzdGVyIGNvbnN0IGNtc1VJbnQxNk51bWJlciBJbnB1dFtdLAorICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgT3V0cHV0W10sCisgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNvbnN0IGNtc0ludGVycFBhcmFtcyogcDE2KQoreworICAgICAgIGNvbnN0IGNtc1VJbnQxNk51bWJlciogTHV0VGFibGUgPSAoY21zVUludDE2TnVtYmVyKikgcDE2IC0+IFRhYmxlOworICAgICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgZms7CisgICAgICAgY21zUzE1Rml4ZWQxNk51bWJlciBrMCwgcms7CisgICAgICAgaW50IEswLCBLMTsKKyAgICAgICBjb25zdCBjbXNVSW50MTZOdW1iZXIqIFQ7CisgICAgICAgY21zVUludDMyTnVtYmVyIGk7CisgICAgICAgY21zVUludDE2TnVtYmVyIFRtcDFbTUFYX1NUQUdFX0NIQU5ORUxTXSwgVG1wMltNQVhfU1RBR0VfQ0hBTk5FTFNdOworICAgICAgIGNtc0ludGVycFBhcmFtcyBwMTsKKworCisgICAgICAgZmsgPSBfY21zVG9GaXhlZERvbWFpbigoY21zUzE1Rml4ZWQxNk51bWJlcikgSW5wdXRbMF0gKiBwMTYgLT4gRG9tYWluWzBdKTsKKyAgICAgICBrMCA9IEZJWEVEX1RPX0lOVChmayk7CisgICAgICAgcmsgPSBGSVhFRF9SRVNUX1RPX0lOVChmayk7CisKKyAgICAgICBLMCA9IHAxNiAtPiBvcHRhWzZdICogazA7CisgICAgICAgSzEgPSBwMTYgLT4gb3B0YVs2XSAqIChrMCArIChJbnB1dFswXSAhPSAweEZGRkZVID8gMSA6IDApKTsKKworICAgICAgIHAxID0gKnAxNjsKKyAgICAgICBtZW1tb3ZlKCZwMS5Eb21haW5bMF0sICZwMTYgLT5Eb21haW5bMV0sIDYqc2l6ZW9mKGNtc1VJbnQzMk51bWJlcikpOworCisgICAgICAgVCA9IEx1dFRhYmxlICsgSzA7CisgICAgICAgcDEuVGFibGUgPSBUOworCisgICAgICAgRXZhbDZJbnB1dHMoSW5wdXQgKyAxLCBUbXAxLCAmcDEpOworCisgICAgICAgVCA9IEx1dFRhYmxlICsgSzE7CisgICAgICAgcDEuVGFibGUgPSBUOworCisgICAgICAgRXZhbDZJbnB1dHMoSW5wdXQgKyAxLCBUbXAyLCAmcDEpOworCisgICAgICAgZm9yIChpPTA7IGkgPCBwMTYgLT4gbk91dHB1dHM7IGkrKykgeworICAgICAgICAgICAgICBPdXRwdXRbaV0gPSBMaW5lYXJJbnRlcnAocmssIFRtcDFbaV0sIFRtcDJbaV0pOworICAgICAgIH0KK30KKworCitzdGF0aWMKK3ZvaWQgRXZhbDdJbnB1dHNGbG9hdChjb25zdCBjbXNGbG9hdDMyTnVtYmVyIElucHV0W10sCisgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciBPdXRwdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNJbnRlcnBQYXJhbXMqIHApCit7CisgICAgICAgY29uc3QgY21zRmxvYXQzMk51bWJlciogTHV0VGFibGUgPSAoY21zRmxvYXQzMk51bWJlciopIHAgLT4gVGFibGU7CisgICAgICAgY21zRmxvYXQzMk51bWJlciByZXN0OworICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgcGs7CisgICAgICAgaW50IGswLCBLMCwgSzE7CisgICAgICAgY29uc3QgY21zRmxvYXQzMk51bWJlciogVDsKKyAgICAgICBjbXNVSW50MzJOdW1iZXIgaTsKKyAgICAgICBjbXNGbG9hdDMyTnVtYmVyIFRtcDFbTUFYX1NUQUdFX0NIQU5ORUxTXSwgVG1wMltNQVhfU1RBR0VfQ0hBTk5FTFNdOworICAgICAgIGNtc0ludGVycFBhcmFtcyBwMTsKKworICAgICAgIHBrID0gZmNsYW1wKElucHV0WzBdKSAqIHAtPkRvbWFpblswXTsKKyAgICAgICBrMCA9IF9jbXNRdWlja0Zsb29yKHBrKTsKKyAgICAgICByZXN0ID0gcGsgLSAoY21zRmxvYXQzMk51bWJlcikgazA7CisKKyAgICAgICBLMCA9IHAgLT4gb3B0YVs2XSAqIGswOworICAgICAgIEsxID0gSzAgKyAoSW5wdXRbMF0gPj0gMS4wID8gMCA6IHAtPm9wdGFbNl0pOworCisgICAgICAgcDEgPSAqcDsKKyAgICAgICBtZW1tb3ZlKCZwMS5Eb21haW5bMF0sICZwIC0+RG9tYWluWzFdLCA2KnNpemVvZihjbXNVSW50MzJOdW1iZXIpKTsKKworICAgICAgIFQgPSBMdXRUYWJsZSArIEswOworICAgICAgIHAxLlRhYmxlID0gVDsKKworICAgICAgIEV2YWw2SW5wdXRzRmxvYXQoSW5wdXQgKyAxLCAgVG1wMSwgJnAxKTsKKworICAgICAgIFQgPSBMdXRUYWJsZSArIEsxOworICAgICAgIHAxLlRhYmxlID0gVDsKKworICAgICAgIEV2YWw2SW5wdXRzRmxvYXQoSW5wdXQgKyAxLCAgVG1wMiwgJnAxKTsKKworCisgICAgICAgZm9yIChpPTA7IGkgPCBwIC0+IG5PdXRwdXRzOyBpKyspIHsKKworICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHkwID0gVG1wMVtpXTsKKyAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciB5MSA9IFRtcDJbaV07CisKKyAgICAgICAgICAgICAgT3V0cHV0W2ldID0geTAgKyAoeTEgLSB5MCkgKiByZXN0OworCisgICAgICAgfQorfQorCitzdGF0aWMKK3ZvaWQgRXZhbDhJbnB1dHMocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIElucHV0W10sCisgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciBPdXRwdXRbXSwKKyAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBwMTYpCit7CisgICAgICAgY29uc3QgY21zVUludDE2TnVtYmVyKiBMdXRUYWJsZSA9IChjbXNVSW50MTZOdW1iZXIqKSBwMTYgLT4gVGFibGU7CisgICAgICAgY21zUzE1Rml4ZWQxNk51bWJlciBmazsKKyAgICAgICBjbXNTMTVGaXhlZDE2TnVtYmVyIGswLCByazsKKyAgICAgICBpbnQgSzAsIEsxOworICAgICAgIGNvbnN0IGNtc1VJbnQxNk51bWJlciogVDsKKyAgICAgICBjbXNVSW50MzJOdW1iZXIgaTsKKyAgICAgICBjbXNVSW50MTZOdW1iZXIgVG1wMVtNQVhfU1RBR0VfQ0hBTk5FTFNdLCBUbXAyW01BWF9TVEFHRV9DSEFOTkVMU107CisgICAgICAgY21zSW50ZXJwUGFyYW1zIHAxOworCisgICAgICAgZmsgPSBfY21zVG9GaXhlZERvbWFpbigoY21zUzE1Rml4ZWQxNk51bWJlcikgSW5wdXRbMF0gKiBwMTYgLT4gRG9tYWluWzBdKTsKKyAgICAgICBrMCA9IEZJWEVEX1RPX0lOVChmayk7CisgICAgICAgcmsgPSBGSVhFRF9SRVNUX1RPX0lOVChmayk7CisKKyAgICAgICBLMCA9IHAxNiAtPiBvcHRhWzddICogazA7CisgICAgICAgSzEgPSBwMTYgLT4gb3B0YVs3XSAqIChrMCArIChJbnB1dFswXSAhPSAweEZGRkZVID8gMSA6IDApKTsKKworICAgICAgIHAxID0gKnAxNjsKKyAgICAgICBtZW1tb3ZlKCZwMS5Eb21haW5bMF0sICZwMTYgLT5Eb21haW5bMV0sIDcqc2l6ZW9mKGNtc1VJbnQzMk51bWJlcikpOworCisgICAgICAgVCA9IEx1dFRhYmxlICsgSzA7CisgICAgICAgcDEuVGFibGUgPSBUOworCisgICAgICAgRXZhbDdJbnB1dHMoSW5wdXQgKyAxLCBUbXAxLCAmcDEpOworCisgICAgICAgVCA9IEx1dFRhYmxlICsgSzE7CisgICAgICAgcDEuVGFibGUgPSBUOworICAgICAgIEV2YWw3SW5wdXRzKElucHV0ICsgMSwgVG1wMiwgJnAxKTsKKworICAgICAgIGZvciAoaT0wOyBpIDwgcDE2IC0+IG5PdXRwdXRzOyBpKyspIHsKKyAgICAgICAgICAgICAgT3V0cHV0W2ldID0gTGluZWFySW50ZXJwKHJrLCBUbXAxW2ldLCBUbXAyW2ldKTsKKyAgICAgICB9Cit9CisKKworCitzdGF0aWMKK3ZvaWQgRXZhbDhJbnB1dHNGbG9hdChjb25zdCBjbXNGbG9hdDMyTnVtYmVyIElucHV0W10sCisgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciBPdXRwdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNJbnRlcnBQYXJhbXMqIHApCit7CisgICAgICAgY29uc3QgY21zRmxvYXQzMk51bWJlciogTHV0VGFibGUgPSAoY21zRmxvYXQzMk51bWJlciopIHAgLT4gVGFibGU7CisgICAgICAgY21zRmxvYXQzMk51bWJlciByZXN0OworICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgcGs7CisgICAgICAgaW50IGswLCBLMCwgSzE7CisgICAgICAgY29uc3QgY21zRmxvYXQzMk51bWJlciogVDsKKyAgICAgICBjbXNVSW50MzJOdW1iZXIgaTsKKyAgICAgICBjbXNGbG9hdDMyTnVtYmVyIFRtcDFbTUFYX1NUQUdFX0NIQU5ORUxTXSwgVG1wMltNQVhfU1RBR0VfQ0hBTk5FTFNdOworICAgICAgIGNtc0ludGVycFBhcmFtcyBwMTsKKworICAgICAgIHBrID0gZmNsYW1wKElucHV0WzBdKSAqIHAtPkRvbWFpblswXTsKKyAgICAgICBrMCA9IF9jbXNRdWlja0Zsb29yKHBrKTsKKyAgICAgICByZXN0ID0gcGsgLSAoY21zRmxvYXQzMk51bWJlcikgazA7CisKKyAgICAgICBLMCA9IHAgLT4gb3B0YVs3XSAqIGswOworICAgICAgIEsxID0gSzAgKyAoSW5wdXRbMF0gPj0gMS4wID8gMCA6IHAtPm9wdGFbN10pOworCisgICAgICAgcDEgPSAqcDsKKyAgICAgICBtZW1tb3ZlKCZwMS5Eb21haW5bMF0sICZwIC0+RG9tYWluWzFdLCA3KnNpemVvZihjbXNVSW50MzJOdW1iZXIpKTsKKworICAgICAgIFQgPSBMdXRUYWJsZSArIEswOworICAgICAgIHAxLlRhYmxlID0gVDsKKworICAgICAgIEV2YWw3SW5wdXRzRmxvYXQoSW5wdXQgKyAxLCAgVG1wMSwgJnAxKTsKKworICAgICAgIFQgPSBMdXRUYWJsZSArIEsxOworICAgICAgIHAxLlRhYmxlID0gVDsKKworICAgICAgIEV2YWw3SW5wdXRzRmxvYXQoSW5wdXQgKyAxLCAgVG1wMiwgJnAxKTsKKworCisgICAgICAgZm9yIChpPTA7IGkgPCBwIC0+IG5PdXRwdXRzOyBpKyspIHsKKworICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHkwID0gVG1wMVtpXTsKKyAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciB5MSA9IFRtcDJbaV07CisKKyAgICAgICAgICAgICAgT3V0cHV0W2ldID0geTAgKyAoeTEgLSB5MCkgKiByZXN0OworICAgICAgIH0KK30KKworLy8gVGhlIGRlZmF1bHQgZmFjdG9yeQorc3RhdGljCitjbXNJbnRlcnBGdW5jdGlvbiBEZWZhdWx0SW50ZXJwb2xhdG9yc0ZhY3RvcnkoY21zVUludDMyTnVtYmVyIG5JbnB1dENoYW5uZWxzLCBjbXNVSW50MzJOdW1iZXIgbk91dHB1dENoYW5uZWxzLCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKK3sKKworICAgIGNtc0ludGVycEZ1bmN0aW9uIEludGVycG9sYXRpb247CisgICAgY21zQm9vbCAgSXNGbG9hdCAgICAgPSAoZHdGbGFncyAmIENNU19MRVJQX0ZMQUdTX0ZMT0FUKTsKKyAgICBjbXNCb29sICBJc1RyaWxpbmVhciA9IChkd0ZsYWdzICYgQ01TX0xFUlBfRkxBR1NfVFJJTElORUFSKTsKKworICAgIG1lbXNldCgmSW50ZXJwb2xhdGlvbiwgMCwgc2l6ZW9mKEludGVycG9sYXRpb24pKTsKKworICAgIC8vIFNhZmV0eSBjaGVjaworICAgIGlmIChuSW5wdXRDaGFubmVscyA+PSA0ICYmIG5PdXRwdXRDaGFubmVscyA+PSBNQVhfU1RBR0VfQ0hBTk5FTFMpCisgICAgICAgIHJldHVybiBJbnRlcnBvbGF0aW9uOworCisgICAgc3dpdGNoIChuSW5wdXRDaGFubmVscykgeworCisgICAgICAgICAgIGNhc2UgMTogLy8gR3JheSBMVVQgLyBsaW5lYXIKKworICAgICAgICAgICAgICAgaWYgKG5PdXRwdXRDaGFubmVscyA9PSAxKSB7CisKKyAgICAgICAgICAgICAgICAgICBpZiAoSXNGbG9hdCkKKyAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJwb2xhdGlvbi5MZXJwRmxvYXQgPSBMaW5MZXJwMURmbG9hdDsKKyAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgIEludGVycG9sYXRpb24uTGVycDE2ID0gTGluTGVycDFEOworCisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgIGlmIChJc0Zsb2F0KQorICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnBvbGF0aW9uLkxlcnBGbG9hdCA9IEV2YWwxSW5wdXRGbG9hdDsKKyAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgIEludGVycG9sYXRpb24uTGVycDE2ID0gRXZhbDFJbnB1dDsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgIGNhc2UgMjogLy8gRHVvdG9uZQorICAgICAgICAgICAgICAgaWYgKElzRmxvYXQpCisgICAgICAgICAgICAgICAgICAgICAgSW50ZXJwb2xhdGlvbi5MZXJwRmxvYXQgPSAgQmlsaW5lYXJJbnRlcnBGbG9hdDsKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICBJbnRlcnBvbGF0aW9uLkxlcnAxNiAgICA9ICBCaWxpbmVhckludGVycDE2OworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgY2FzZSAzOiAgLy8gUkdCIGV0IGFsCisKKyAgICAgICAgICAgICAgIGlmIChJc1RyaWxpbmVhcikgeworCisgICAgICAgICAgICAgICAgICAgaWYgKElzRmxvYXQpCisgICAgICAgICAgICAgICAgICAgICAgIEludGVycG9sYXRpb24uTGVycEZsb2F0ID0gVHJpbGluZWFySW50ZXJwRmxvYXQ7CisgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnBvbGF0aW9uLkxlcnAxNiA9IFRyaWxpbmVhckludGVycDE2OworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgZWxzZSB7CisKKyAgICAgICAgICAgICAgICAgICBpZiAoSXNGbG9hdCkKKyAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJwb2xhdGlvbi5MZXJwRmxvYXQgPSBUZXRyYWhlZHJhbEludGVycEZsb2F0OworICAgICAgICAgICAgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgICAgIEludGVycG9sYXRpb24uTGVycDE2ID0gVGV0cmFoZWRyYWxJbnRlcnAxNjsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBjYXNlIDQ6ICAvLyBDTVlLIGx1dAorCisgICAgICAgICAgICAgICBpZiAoSXNGbG9hdCkKKyAgICAgICAgICAgICAgICAgICBJbnRlcnBvbGF0aW9uLkxlcnBGbG9hdCA9ICBFdmFsNElucHV0c0Zsb2F0OworICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgIEludGVycG9sYXRpb24uTGVycDE2ICAgID0gIEV2YWw0SW5wdXRzOworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgY2FzZSA1OiAvLyA1IElua3MKKyAgICAgICAgICAgICAgIGlmIChJc0Zsb2F0KQorICAgICAgICAgICAgICAgICAgIEludGVycG9sYXRpb24uTGVycEZsb2F0ID0gIEV2YWw1SW5wdXRzRmxvYXQ7CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgSW50ZXJwb2xhdGlvbi5MZXJwMTYgICAgPSAgRXZhbDVJbnB1dHM7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICBjYXNlIDY6IC8vIDYgSW5rcworICAgICAgICAgICAgICAgaWYgKElzRmxvYXQpCisgICAgICAgICAgICAgICAgICAgSW50ZXJwb2xhdGlvbi5MZXJwRmxvYXQgPSAgRXZhbDZJbnB1dHNGbG9hdDsKKyAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICBJbnRlcnBvbGF0aW9uLkxlcnAxNiAgICA9ICBFdmFsNklucHV0czsKKyAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgIGNhc2UgNzogLy8gNyBpbmtzCisgICAgICAgICAgICAgICBpZiAoSXNGbG9hdCkKKyAgICAgICAgICAgICAgICAgICBJbnRlcnBvbGF0aW9uLkxlcnBGbG9hdCA9ICBFdmFsN0lucHV0c0Zsb2F0OworICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgIEludGVycG9sYXRpb24uTGVycDE2ICAgID0gIEV2YWw3SW5wdXRzOworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgY2FzZSA4OiAvLyA4IGlua3MKKyAgICAgICAgICAgICAgIGlmIChJc0Zsb2F0KQorICAgICAgICAgICAgICAgICAgIEludGVycG9sYXRpb24uTGVycEZsb2F0ID0gIEV2YWw4SW5wdXRzRmxvYXQ7CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgSW50ZXJwb2xhdGlvbi5MZXJwMTYgICAgPSAgRXZhbDhJbnB1dHM7CisgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgIEludGVycG9sYXRpb24uTGVycDE2ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gSW50ZXJwb2xhdGlvbjsKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2lvMC5jIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zaW8wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M1Zjg5MAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2lvMC5jCkBAIC0wLDAgKzEsMTk2MiBAQAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCisvLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTYgTWFydGkgTWFyaWEgU2FndWVyCisvLworLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisvLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisvLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisvLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKy8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQorLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKy8vCisvLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisvLworLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisvLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KKy8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisvLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCisvLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisvLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKy8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworCisjaW5jbHVkZSAibGNtczJfaW50ZXJuYWwuaCIKKworLy8gR2VuZXJpYyBJL08sIHRhZyBkaWN0aW9uYXJ5IG1hbmFnZW1lbnQsIHByb2ZpbGUgc3RydWN0CisKKy8vIElPaGFuZGxlcnMgYXJlIGFic3RyYWN0aW9ucyB1c2VkIGJ5IGxpdHRsZUNNUyB0byByZWFkIGZyb20gd2hhdGV2ZXIgZmlsZSwgc3RyZWFtLAorLy8gbWVtb3J5IGJsb2NrIG9yIGFueSBzdG9yYWdlLiBFYWNoIElPaGFuZGxlciBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbnMgZm9yIHJlYWQsCisvLyB3cml0ZSwgc2VlayBhbmQgdGVsbCBmdW5jdGlvbnMuIExpdHRsZUNNUyBjb2RlIGRlYWxzIHdpdGggSU8gYWNyb3NzIHRob3NlIG9iamVjdHMuCisvLyBJbiB0aGlzIHdheSwgaXMgZWFzaWVyIHRvIGFkZCBzdXBwb3J0IGZvciBuZXcgc3RvcmFnZSBtZWRpYS4KKworLy8gTlVMTCBzdHJlYW0sIGZvciB0YWtpbmcgY2FyZSBvZiB1c2VkIHNwYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gTlVMTCBJT2hhbmRsZXIgYmFzaWNhbGx5IGRvZXMgbm90aGluZyBidXQga2VlcCB0cmFjayBvbiBob3cgbWFueSBieXRlcyBoYXZlIGJlZW4KKy8vIHdyaXR0ZW4uIFRoaXMgaXMgaGFuZHkgd2hlbiBjcmVhdGluZyBwcm9maWxlcywgd2hlcmUgdGhlIGZpbGUgc2l6ZSBpcyBuZWVkZWQgaW4gdGhlCisvLyBoZWFkZXIuIFRoZW4sIHdob2xlIHByb2ZpbGUgaXMgc2VyaWFsaXplZCBhY3Jvc3MgTlVMTCBJT2hhbmRsZXIgYW5kIGEgc2Vjb25kIHBhc3MKKy8vIHdyaXRlcyB0aGUgYnl0ZXMgdG8gdGhlIHBlcnRpbmVudCBJT2hhbmRsZXIuCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjbXNVSW50MzJOdW1iZXIgUG9pbnRlcjsgICAgICAgICAvLyBQb2ludHMgdG8gY3VycmVudCBsb2NhdGlvbgorfSBGSUxFTlVMTDsKKworc3RhdGljCitjbXNVSW50MzJOdW1iZXIgTlVMTFJlYWQoY21zSU9IQU5ETEVSKiBpb2hhbmRsZXIsIHZvaWQgKkJ1ZmZlciwgY21zVUludDMyTnVtYmVyIHNpemUsIGNtc1VJbnQzMk51bWJlciBjb3VudCkKK3sKKyAgICBGSUxFTlVMTCogUmVzRGF0YSA9IChGSUxFTlVMTCopIGlvaGFuZGxlciAtPnN0cmVhbTsKKworICAgIGNtc1VJbnQzMk51bWJlciBsZW4gPSBzaXplICogY291bnQ7CisgICAgUmVzRGF0YSAtPiBQb2ludGVyICs9IGxlbjsKKyAgICByZXR1cm4gY291bnQ7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKEJ1ZmZlcik7Cit9CisKK3N0YXRpYworY21zQm9vbCAgTlVMTFNlZWsoY21zSU9IQU5ETEVSKiBpb2hhbmRsZXIsIGNtc1VJbnQzMk51bWJlciBvZmZzZXQpCit7CisgICAgRklMRU5VTEwqIFJlc0RhdGEgPSAoRklMRU5VTEwqKSBpb2hhbmRsZXIgLT5zdHJlYW07CisKKyAgICBSZXNEYXRhIC0+UG9pbnRlciA9IG9mZnNldDsKKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljCitjbXNVSW50MzJOdW1iZXIgTlVMTFRlbGwoY21zSU9IQU5ETEVSKiBpb2hhbmRsZXIpCit7CisgICAgRklMRU5VTEwqIFJlc0RhdGEgPSAoRklMRU5VTEwqKSBpb2hhbmRsZXIgLT5zdHJlYW07CisgICAgcmV0dXJuIFJlc0RhdGEgLT4gUG9pbnRlcjsKK30KKworc3RhdGljCitjbXNCb29sICBOVUxMV3JpdGUoY21zSU9IQU5ETEVSKiBpb2hhbmRsZXIsIGNtc1VJbnQzMk51bWJlciBzaXplLCBjb25zdCB2b2lkICpQdHIpCit7CisgICAgRklMRU5VTEwqIFJlc0RhdGEgPSAoRklMRU5VTEwqKSBpb2hhbmRsZXIgLT5zdHJlYW07CisKKyAgICBSZXNEYXRhIC0+UG9pbnRlciArPSBzaXplOworICAgIGlmIChSZXNEYXRhIC0+UG9pbnRlciA+IGlvaGFuZGxlci0+VXNlZFNwYWNlKQorICAgICAgICBpb2hhbmRsZXItPlVzZWRTcGFjZSA9IFJlc0RhdGEgLT5Qb2ludGVyOworCisgICAgcmV0dXJuIFRSVUU7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFB0cik7Cit9CisKK3N0YXRpYworY21zQm9vbCAgTlVMTENsb3NlKGNtc0lPSEFORExFUiogaW9oYW5kbGVyKQoreworICAgIEZJTEVOVUxMKiBSZXNEYXRhID0gKEZJTEVOVUxMKikgaW9oYW5kbGVyIC0+c3RyZWFtOworCisgICAgX2Ntc0ZyZWUoaW9oYW5kbGVyIC0+Q29udGV4dElELCBSZXNEYXRhKTsKKyAgICBfY21zRnJlZShpb2hhbmRsZXIgLT5Db250ZXh0SUQsIGlvaGFuZGxlcik7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8vIFRoZSBOVUxMIElPaGFuZGxlciBjcmVhdG9yCitjbXNJT0hBTkRMRVIqICBDTVNFWFBPUlQgY21zT3BlbklPaGFuZGxlckZyb21OVUxMKGNtc0NvbnRleHQgQ29udGV4dElEKQoreworICAgIHN0cnVjdCBfY21zX2lvX2hhbmRsZXIqIGlvaGFuZGxlciA9IE5VTEw7CisgICAgRklMRU5VTEwqIGZtID0gTlVMTDsKKworICAgIGlvaGFuZGxlciA9IChzdHJ1Y3QgX2Ntc19pb19oYW5kbGVyKikgX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBzaXplb2Yoc3RydWN0IF9jbXNfaW9faGFuZGxlcikpOworICAgIGlmIChpb2hhbmRsZXIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBmbSA9IChGSUxFTlVMTCopIF9jbXNNYWxsb2NaZXJvKENvbnRleHRJRCwgc2l6ZW9mKEZJTEVOVUxMKSk7CisgICAgaWYgKGZtID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgICBmbSAtPlBvaW50ZXIgPSAwOworCisgICAgaW9oYW5kbGVyIC0+Q29udGV4dElEID0gQ29udGV4dElEOworICAgIGlvaGFuZGxlciAtPnN0cmVhbSAgPSAodm9pZCopIGZtOworICAgIGlvaGFuZGxlciAtPlVzZWRTcGFjZSA9IDA7CisgICAgaW9oYW5kbGVyIC0+UmVwb3J0ZWRTaXplID0gMDsKKyAgICBpb2hhbmRsZXIgLT5QaHlzaWNhbEZpbGVbMF0gPSAwOworCisgICAgaW9oYW5kbGVyIC0+UmVhZCAgICA9IE5VTExSZWFkOworICAgIGlvaGFuZGxlciAtPlNlZWsgICAgPSBOVUxMU2VlazsKKyAgICBpb2hhbmRsZXIgLT5DbG9zZSAgID0gTlVMTENsb3NlOworICAgIGlvaGFuZGxlciAtPlRlbGwgICAgPSBOVUxMVGVsbDsKKyAgICBpb2hhbmRsZXIgLT5Xcml0ZSAgID0gTlVMTFdyaXRlOworCisgICAgcmV0dXJuIGlvaGFuZGxlcjsKKworRXJyb3I6ICAgIAorICAgIGlmIChpb2hhbmRsZXIpIF9jbXNGcmVlKENvbnRleHRJRCwgaW9oYW5kbGVyKTsKKyAgICByZXR1cm4gTlVMTDsKKworfQorCisKKy8vIE1lbW9yeS1iYXNlZCBzdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhvc2UgZnVuY3Rpb25zIGltcGxlbWVudHMgYW4gaW9oYW5kbGVyIHdoaWNoIHRha2VzIGEgYmxvY2sgb2YgbWVtb3J5IGFzIHN0b3JhZ2UgbWVkaXVtLgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY21zVUludDhOdW1iZXIqIEJsb2NrOyAgICAvLyBQb2ludHMgdG8gYWxsb2NhdGVkIG1lbW9yeQorICAgIGNtc1VJbnQzMk51bWJlciBTaXplOyAgICAgLy8gU2l6ZSBvZiBhbGxvY2F0ZWQgbWVtb3J5CisgICAgY21zVUludDMyTnVtYmVyIFBvaW50ZXI7ICAvLyBQb2ludHMgdG8gY3VycmVudCBsb2NhdGlvbgorICAgIGludCBGcmVlQmxvY2tPbkNsb3NlOyAgICAgLy8gQXMgdGl0bGUKKworfSBGSUxFTUVNOworCitzdGF0aWMKK2Ntc1VJbnQzMk51bWJlciBNZW1vcnlSZWFkKHN0cnVjdCBfY21zX2lvX2hhbmRsZXIqIGlvaGFuZGxlciwgdm9pZCAqQnVmZmVyLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSwgY21zVUludDMyTnVtYmVyIGNvdW50KQoreworICAgIEZJTEVNRU0qIFJlc0RhdGEgPSAoRklMRU1FTSopIGlvaGFuZGxlciAtPnN0cmVhbTsKKyAgICBjbXNVSW50OE51bWJlciogUHRyOworICAgIGNtc1VJbnQzMk51bWJlciBsZW4gPSBzaXplICogY291bnQ7CisKKyAgICBpZiAoUmVzRGF0YSAtPiBQb2ludGVyICsgbGVuID4gUmVzRGF0YSAtPiBTaXplKXsKKworICAgICAgICBsZW4gPSAoUmVzRGF0YSAtPiBTaXplIC0gUmVzRGF0YSAtPiBQb2ludGVyKTsKKyAgICAgICAgY21zU2lnbmFsRXJyb3IoaW9oYW5kbGVyIC0+Q29udGV4dElELCBjbXNFUlJPUl9SRUFELCAiUmVhZCBmcm9tIG1lbW9yeSBlcnJvci4gR290ICVkIGJ5dGVzLCBibG9jayBzaG91bGQgYmUgb2YgJWQgYnl0ZXMiLCBsZW4sIGNvdW50ICogc2l6ZSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIFB0ciAgPSBSZXNEYXRhIC0+IEJsb2NrOworICAgIFB0ciArPSBSZXNEYXRhIC0+IFBvaW50ZXI7CisgICAgbWVtbW92ZShCdWZmZXIsIFB0ciwgbGVuKTsKKyAgICBSZXNEYXRhIC0+IFBvaW50ZXIgKz0gbGVuOworCisgICAgcmV0dXJuIGNvdW50OworfQorCisvLyBTRUVLX0NVUiBpcyBhc3N1bWVkCitzdGF0aWMKK2Ntc0Jvb2wgIE1lbW9yeVNlZWsoc3RydWN0IF9jbXNfaW9faGFuZGxlciogaW9oYW5kbGVyLCBjbXNVSW50MzJOdW1iZXIgb2Zmc2V0KQoreworICAgIEZJTEVNRU0qIFJlc0RhdGEgPSAoRklMRU1FTSopIGlvaGFuZGxlciAtPnN0cmVhbTsKKworICAgIGlmIChvZmZzZXQgPiBSZXNEYXRhIC0+U2l6ZSkgeworICAgICAgICBjbXNTaWduYWxFcnJvcihpb2hhbmRsZXIgLT5Db250ZXh0SUQsIGNtc0VSUk9SX1NFRUssICAiVG9vIGZldyBkYXRhOyBwcm9iYWJseSBjb3JydXB0ZWQgcHJvZmlsZSIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgUmVzRGF0YSAtPlBvaW50ZXIgPSBvZmZzZXQ7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8vIFRlbGwgZm9yIG1lbW9yeQorc3RhdGljCitjbXNVSW50MzJOdW1iZXIgTWVtb3J5VGVsbChzdHJ1Y3QgX2Ntc19pb19oYW5kbGVyKiBpb2hhbmRsZXIpCit7CisgICAgRklMRU1FTSogUmVzRGF0YSA9IChGSUxFTUVNKikgaW9oYW5kbGVyIC0+c3RyZWFtOworCisgICAgaWYgKFJlc0RhdGEgPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgcmV0dXJuIFJlc0RhdGEgLT4gUG9pbnRlcjsKK30KKworCisvLyBXcml0ZXMgZGF0YSB0byBtZW1vcnksIGFsc28ga2VlcHMgdXNlZCBzcGFjZSBmb3IgZnVydGhlciByZWZlcmVuY2UuCitzdGF0aWMKK2Ntc0Jvb2wgTWVtb3J5V3JpdGUoc3RydWN0IF9jbXNfaW9faGFuZGxlciogaW9oYW5kbGVyLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSwgY29uc3Qgdm9pZCAqUHRyKQoreworICAgIEZJTEVNRU0qIFJlc0RhdGEgPSAoRklMRU1FTSopIGlvaGFuZGxlciAtPnN0cmVhbTsKKworICAgIGlmIChSZXNEYXRhID09IE5VTEwpIHJldHVybiBGQUxTRTsgLy8gSG91c2VrZWVwaW5nCisKKyAgICAvLyBDaGVjayBmb3IgYXZhaWxhYmxlIHNwYWNlLiBDbGlwLgorICAgIGlmIChSZXNEYXRhLT5Qb2ludGVyICsgc2l6ZSA+IFJlc0RhdGEtPlNpemUpIHsKKyAgICAgICAgc2l6ZSA9IFJlc0RhdGEgLT5TaXplIC0gUmVzRGF0YS0+UG9pbnRlcjsKKyAgICB9CisgICAgICAKKyAgICBpZiAoc2l6ZSA9PSAwKSByZXR1cm4gVFJVRTsgICAgIC8vIFdyaXRlIHplcm8gYnl0ZXMgaXMgb2ssIGJ1dCBkb2VzIG5vdGhpbmcKKworICAgIG1lbW1vdmUoUmVzRGF0YSAtPkJsb2NrICsgUmVzRGF0YSAtPlBvaW50ZXIsIFB0ciwgc2l6ZSk7CisgICAgUmVzRGF0YSAtPlBvaW50ZXIgKz0gc2l6ZTsKKworICAgIGlmIChSZXNEYXRhIC0+UG9pbnRlciA+IGlvaGFuZGxlci0+VXNlZFNwYWNlKQorICAgICAgICBpb2hhbmRsZXItPlVzZWRTcGFjZSA9IFJlc0RhdGEgLT5Qb2ludGVyOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljCitjbXNCb29sICBNZW1vcnlDbG9zZShzdHJ1Y3QgX2Ntc19pb19oYW5kbGVyKiBpb2hhbmRsZXIpCit7CisgICAgRklMRU1FTSogUmVzRGF0YSA9IChGSUxFTUVNKikgaW9oYW5kbGVyIC0+c3RyZWFtOworCisgICAgaWYgKFJlc0RhdGEgLT5GcmVlQmxvY2tPbkNsb3NlKSB7CisKKyAgICAgICAgaWYgKFJlc0RhdGEgLT5CbG9jaykgX2Ntc0ZyZWUoaW9oYW5kbGVyIC0+Q29udGV4dElELCBSZXNEYXRhIC0+QmxvY2spOworICAgIH0KKworICAgIF9jbXNGcmVlKGlvaGFuZGxlciAtPkNvbnRleHRJRCwgUmVzRGF0YSk7CisgICAgX2Ntc0ZyZWUoaW9oYW5kbGVyIC0+Q29udGV4dElELCBpb2hhbmRsZXIpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8vIENyZWF0ZSBhIGlvaGFuZGxlciBmb3IgbWVtb3J5IGJsb2NrLiBBY2Nlc3NNb2RlPT0ncicgYXNzdW1lcyB0aGUgaW9oYW5kbGVyIGlzIGdvaW5nIHRvIHJlYWQsIGFuZCBtYWtlcworLy8gYSBjb3B5IG9mIHRoZSBtZW1vcnkgYmxvY2sgZm9yIGxldHRpbmcgdXNlciB0byBmcmVlIHRoZSBtZW1vcnkgYWZ0ZXIgaW52b2tpbmcgb3BlbiBwcm9maWxlLiBJbiB3cml0ZQorLy8gbW9kZSAoInciKSwgQnVmZmVyZSBwb2ludHMgdG8gdGhlIGJlZ2luIG9mIG1lbW9yeSBibG9jayB0byBiZSB3cml0dGVuLgorY21zSU9IQU5ETEVSKiBDTVNFWFBPUlQgY21zT3BlbklPaGFuZGxlckZyb21NZW0oY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQgKkJ1ZmZlciwgY21zVUludDMyTnVtYmVyIHNpemUsIGNvbnN0IGNoYXIqIEFjY2Vzc01vZGUpCit7CisgICAgY21zSU9IQU5ETEVSKiBpb2hhbmRsZXIgPSBOVUxMOworICAgIEZJTEVNRU0qIGZtID0gTlVMTDsKKworICAgIF9jbXNBc3NlcnQoQWNjZXNzTW9kZSAhPSBOVUxMKTsKKworICAgIGlvaGFuZGxlciA9IChjbXNJT0hBTkRMRVIqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihjbXNJT0hBTkRMRVIpKTsKKyAgICBpZiAoaW9oYW5kbGVyID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgc3dpdGNoICgqQWNjZXNzTW9kZSkgeworCisgICAgY2FzZSAncic6CisgICAgICAgIGZtID0gKEZJTEVNRU0qKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihGSUxFTUVNKSk7CisgICAgICAgIGlmIChmbSA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgICAgIGlmIChCdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9SRUFELCAiQ291bGRuJ3QgcmVhZCBwcm9maWxlIGZyb20gTlVMTCBwb2ludGVyIik7CisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICB9CisKKyAgICAgICAgZm0gLT5CbG9jayA9IChjbXNVSW50OE51bWJlciopIF9jbXNNYWxsb2MoQ29udGV4dElELCBzaXplKTsKKyAgICAgICAgaWYgKGZtIC0+QmxvY2sgPT0gTlVMTCkgeworCisgICAgICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIGZtKTsKKyAgICAgICAgICAgIF9jbXNGcmVlKENvbnRleHRJRCwgaW9oYW5kbGVyKTsKKyAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfUkVBRCwgIkNvdWxkbid0IGFsbG9jYXRlICVsZCBieXRlcyBmb3IgcHJvZmlsZSIsIHNpemUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworCisgICAgICAgIG1lbW1vdmUoZm0tPkJsb2NrLCBCdWZmZXIsIHNpemUpOworICAgICAgICBmbSAtPkZyZWVCbG9ja09uQ2xvc2UgPSBUUlVFOworICAgICAgICBmbSAtPlNpemUgICAgPSBzaXplOworICAgICAgICBmbSAtPlBvaW50ZXIgPSAwOworICAgICAgICBpb2hhbmRsZXIgLT4gUmVwb3J0ZWRTaXplID0gc2l6ZTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlICd3JzoKKyAgICAgICAgZm0gPSAoRklMRU1FTSopIF9jbXNNYWxsb2NaZXJvKENvbnRleHRJRCwgc2l6ZW9mKEZJTEVNRU0pKTsKKyAgICAgICAgaWYgKGZtID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgICAgICAgZm0gLT5CbG9jayA9IChjbXNVSW50OE51bWJlciopIEJ1ZmZlcjsKKyAgICAgICAgZm0gLT5GcmVlQmxvY2tPbkNsb3NlID0gRkFMU0U7CisgICAgICAgIGZtIC0+U2l6ZSAgICA9IHNpemU7CisgICAgICAgIGZtIC0+UG9pbnRlciA9IDA7CisgICAgICAgIGlvaGFuZGxlciAtPiBSZXBvcnRlZFNpemUgPSAwOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJVbmtub3duIGFjY2VzcyBtb2RlICclYyciLCAqQWNjZXNzTW9kZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlvaGFuZGxlciAtPkNvbnRleHRJRCA9IENvbnRleHRJRDsKKyAgICBpb2hhbmRsZXIgLT5zdHJlYW0gID0gKHZvaWQqKSBmbTsKKyAgICBpb2hhbmRsZXIgLT5Vc2VkU3BhY2UgPSAwOworICAgIGlvaGFuZGxlciAtPlBoeXNpY2FsRmlsZVswXSA9IDA7CisKKyAgICBpb2hhbmRsZXIgLT5SZWFkICAgID0gTWVtb3J5UmVhZDsKKyAgICBpb2hhbmRsZXIgLT5TZWVrICAgID0gTWVtb3J5U2VlazsKKyAgICBpb2hhbmRsZXIgLT5DbG9zZSAgID0gTWVtb3J5Q2xvc2U7CisgICAgaW9oYW5kbGVyIC0+VGVsbCAgICA9IE1lbW9yeVRlbGw7CisgICAgaW9oYW5kbGVyIC0+V3JpdGUgICA9IE1lbW9yeVdyaXRlOworCisgICAgcmV0dXJuIGlvaGFuZGxlcjsKKworRXJyb3I6CisgICAgaWYgKGZtKSBfY21zRnJlZShDb250ZXh0SUQsIGZtKTsKKyAgICBpZiAoaW9oYW5kbGVyKSBfY21zRnJlZShDb250ZXh0SUQsIGlvaGFuZGxlcik7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIEZpbGUtYmFzZWQgc3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUmVhZCBjb3VudCBlbGVtZW50cyBvZiBzaXplIGJ5dGVzIGVhY2guIFJldHVybiBudW1iZXIgb2YgZWxlbWVudHMgcmVhZAorc3RhdGljCitjbXNVSW50MzJOdW1iZXIgRmlsZVJlYWQoY21zSU9IQU5ETEVSKiBpb2hhbmRsZXIsIHZvaWQgKkJ1ZmZlciwgY21zVUludDMyTnVtYmVyIHNpemUsIGNtc1VJbnQzMk51bWJlciBjb3VudCkKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgblJlYWRlZCA9IChjbXNVSW50MzJOdW1iZXIpIGZyZWFkKEJ1ZmZlciwgc2l6ZSwgY291bnQsIChGSUxFKikgaW9oYW5kbGVyLT5zdHJlYW0pOworCisgICAgaWYgKG5SZWFkZWQgIT0gY291bnQpIHsKKyAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKGlvaGFuZGxlciAtPkNvbnRleHRJRCwgY21zRVJST1JfRklMRSwgIlJlYWQgZXJyb3IuIEdvdCAlZCBieXRlcywgYmxvY2sgc2hvdWxkIGJlIG9mICVkIGJ5dGVzIiwgblJlYWRlZCAqIHNpemUsIGNvdW50ICogc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gblJlYWRlZDsKK30KKworLy8gUG9zaXRpb24gZmlsZSBwb2ludGVyIGluIHRoZSBmaWxlCitzdGF0aWMKK2Ntc0Jvb2wgIEZpbGVTZWVrKGNtc0lPSEFORExFUiogaW9oYW5kbGVyLCBjbXNVSW50MzJOdW1iZXIgb2Zmc2V0KQoreworICAgIGlmIChmc2VlaygoRklMRSopIGlvaGFuZGxlciAtPnN0cmVhbSwgKGxvbmcpIG9mZnNldCwgU0VFS19TRVQpICE9IDApIHsKKworICAgICAgIGNtc1NpZ25hbEVycm9yKGlvaGFuZGxlciAtPkNvbnRleHRJRCwgY21zRVJST1JfRklMRSwgIlNlZWsgZXJyb3I7IHByb2JhYmx5IGNvcnJ1cHRlZCBmaWxlIik7CisgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvLyBSZXR1cm5zIGZpbGUgcG9pbnRlciBwb3NpdGlvbgorc3RhdGljCitjbXNVSW50MzJOdW1iZXIgRmlsZVRlbGwoY21zSU9IQU5ETEVSKiBpb2hhbmRsZXIpCit7CisgICAgcmV0dXJuIChjbXNVSW50MzJOdW1iZXIpIGZ0ZWxsKChGSUxFKilpb2hhbmRsZXIgLT5zdHJlYW0pOworfQorCisvLyBXcml0ZXMgZGF0YSB0byBzdHJlYW0sIGFsc28ga2VlcHMgdXNlZCBzcGFjZSBmb3IgZnVydGhlciByZWZlcmVuY2UuIFJldHVybnMgVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBlcnJvcgorc3RhdGljCitjbXNCb29sICBGaWxlV3JpdGUoY21zSU9IQU5ETEVSKiBpb2hhbmRsZXIsIGNtc1VJbnQzMk51bWJlciBzaXplLCBjb25zdCB2b2lkKiBCdWZmZXIpCit7CisgICAgICAgaWYgKHNpemUgPT0gMCkgcmV0dXJuIFRSVUU7ICAvLyBXZSBhbGxvdyB0byB3cml0ZSAwIGJ5dGVzLCBidXQgbm90aGluZyBpcyB3cml0dGVuCisKKyAgICAgICBpb2hhbmRsZXItPlVzZWRTcGFjZSArPSBzaXplOworICAgICAgIHJldHVybiAoZndyaXRlKEJ1ZmZlciwgc2l6ZSwgMSwgKEZJTEUqKSBpb2hhbmRsZXItPnN0cmVhbSkgPT0gMSk7Cit9CisKKy8vIENsb3NlcyB0aGUgZmlsZQorc3RhdGljCitjbXNCb29sICBGaWxlQ2xvc2UoY21zSU9IQU5ETEVSKiBpb2hhbmRsZXIpCit7CisgICAgaWYgKGZjbG9zZSgoRklMRSopIGlvaGFuZGxlciAtPnN0cmVhbSkgIT0gMCkgcmV0dXJuIEZBTFNFOworICAgIF9jbXNGcmVlKGlvaGFuZGxlciAtPkNvbnRleHRJRCwgaW9oYW5kbGVyKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gQ3JlYXRlIGEgaW9oYW5kbGVyIGZvciBkaXNrIGJhc2VkIGZpbGVzLgorY21zSU9IQU5ETEVSKiBDTVNFWFBPUlQgY21zT3BlbklPaGFuZGxlckZyb21GaWxlKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCBjaGFyKiBGaWxlTmFtZSwgY29uc3QgY2hhciogQWNjZXNzTW9kZSkKK3sKKyAgICBjbXNJT0hBTkRMRVIqIGlvaGFuZGxlciA9IE5VTEw7CisgICAgRklMRSogZm0gPSBOVUxMOworICAgIGNtc0ludDMyTnVtYmVyIGZpbGVMZW47CisKKyAgICBfY21zQXNzZXJ0KEZpbGVOYW1lICE9IE5VTEwpOworICAgIF9jbXNBc3NlcnQoQWNjZXNzTW9kZSAhPSBOVUxMKTsKKworICAgIGlvaGFuZGxlciA9IChjbXNJT0hBTkRMRVIqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihjbXNJT0hBTkRMRVIpKTsKKyAgICBpZiAoaW9oYW5kbGVyID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgc3dpdGNoICgqQWNjZXNzTW9kZSkgeworCisgICAgY2FzZSAncic6CisgICAgICAgIGZtID0gZm9wZW4oRmlsZU5hbWUsICJyYiIpOworICAgICAgICBpZiAoZm0gPT0gTlVMTCkgeworICAgICAgICAgICAgX2Ntc0ZyZWUoQ29udGV4dElELCBpb2hhbmRsZXIpOworICAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfRklMRSwgIkZpbGUgJyVzJyBub3QgZm91bmQiLCBGaWxlTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgZmlsZUxlbiA9IGNtc2ZpbGVsZW5ndGgoZm0pOworICAgICAgICBpZiAoZmlsZUxlbiA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZjbG9zZShmbSk7CisgICAgICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIGlvaGFuZGxlcik7CisgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX0ZJTEUsICJDYW5ub3QgZ2V0IHNpemUgb2YgZmlsZSAnJXMnIiwgRmlsZU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpb2hhbmRsZXIgLT4gUmVwb3J0ZWRTaXplID0gKGNtc1VJbnQzMk51bWJlcikgZmlsZUxlbjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlICd3JzoKKyAgICAgICAgZm0gPSBmb3BlbihGaWxlTmFtZSwgIndiIik7CisgICAgICAgIGlmIChmbSA9PSBOVUxMKSB7CisgICAgICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIGlvaGFuZGxlcik7CisgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9GSUxFLCAiQ291bGRuJ3QgY3JlYXRlICclcyciLCBGaWxlTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpb2hhbmRsZXIgLT4gUmVwb3J0ZWRTaXplID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIGlvaGFuZGxlcik7CisgICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX0ZJTEUsICJVbmtub3duIGFjY2VzcyBtb2RlICclYyciLCAqQWNjZXNzTW9kZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlvaGFuZGxlciAtPkNvbnRleHRJRCA9IENvbnRleHRJRDsKKyAgICBpb2hhbmRsZXIgLT5zdHJlYW0gPSAodm9pZCopIGZtOworICAgIGlvaGFuZGxlciAtPlVzZWRTcGFjZSA9IDA7CisKKyAgICAvLyBLZWVwIHRyYWNrIG9mIHRoZSBvcmlnaW5hbCBmaWxlICAgIAorICAgIHN0cm5jcHkoaW9oYW5kbGVyIC0+IFBoeXNpY2FsRmlsZSwgRmlsZU5hbWUsIHNpemVvZihpb2hhbmRsZXIgLT4gUGh5c2ljYWxGaWxlKS0xKTsKKyAgICBpb2hhbmRsZXIgLT4gUGh5c2ljYWxGaWxlW3NpemVvZihpb2hhbmRsZXIgLT4gUGh5c2ljYWxGaWxlKS0xXSA9IDA7CisKKyAgICBpb2hhbmRsZXIgLT5SZWFkICAgID0gRmlsZVJlYWQ7CisgICAgaW9oYW5kbGVyIC0+U2VlayAgICA9IEZpbGVTZWVrOworICAgIGlvaGFuZGxlciAtPkNsb3NlICAgPSBGaWxlQ2xvc2U7CisgICAgaW9oYW5kbGVyIC0+VGVsbCAgICA9IEZpbGVUZWxsOworICAgIGlvaGFuZGxlciAtPldyaXRlICAgPSBGaWxlV3JpdGU7CisKKyAgICByZXR1cm4gaW9oYW5kbGVyOworfQorCisvLyBDcmVhdGUgYSBpb2hhbmRsZXIgZm9yIHN0cmVhbSBiYXNlZCBmaWxlcworY21zSU9IQU5ETEVSKiBDTVNFWFBPUlQgY21zT3BlbklPaGFuZGxlckZyb21TdHJlYW0oY21zQ29udGV4dCBDb250ZXh0SUQsIEZJTEUqIFN0cmVhbSkKK3sKKyAgICBjbXNJT0hBTkRMRVIqIGlvaGFuZGxlciA9IE5VTEw7CisgICAgY21zSW50MzJOdW1iZXIgZmlsZVNpemU7CisKKyAgICBmaWxlU2l6ZSA9IGNtc2ZpbGVsZW5ndGgoU3RyZWFtKTsKKyAgICBpZiAoZmlsZVNpemUgPCAwKQorICAgIHsKKyAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9GSUxFLCAiQ2Fubm90IGdldCBzaXplIG9mIHN0cmVhbSIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpb2hhbmRsZXIgPSAoY21zSU9IQU5ETEVSKikgX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBzaXplb2YoY21zSU9IQU5ETEVSKSk7CisgICAgaWYgKGlvaGFuZGxlciA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIGlvaGFuZGxlciAtPiBDb250ZXh0SUQgPSBDb250ZXh0SUQ7CisgICAgaW9oYW5kbGVyIC0+IHN0cmVhbSA9ICh2b2lkKikgU3RyZWFtOworICAgIGlvaGFuZGxlciAtPiBVc2VkU3BhY2UgPSAwOworICAgIGlvaGFuZGxlciAtPiBSZXBvcnRlZFNpemUgPSAoY21zVUludDMyTnVtYmVyKSBmaWxlU2l6ZTsKKyAgICBpb2hhbmRsZXIgLT4gUGh5c2ljYWxGaWxlWzBdID0gMDsKKworICAgIGlvaGFuZGxlciAtPlJlYWQgICAgPSBGaWxlUmVhZDsKKyAgICBpb2hhbmRsZXIgLT5TZWVrICAgID0gRmlsZVNlZWs7CisgICAgaW9oYW5kbGVyIC0+Q2xvc2UgICA9IEZpbGVDbG9zZTsKKyAgICBpb2hhbmRsZXIgLT5UZWxsICAgID0gRmlsZVRlbGw7CisgICAgaW9oYW5kbGVyIC0+V3JpdGUgICA9IEZpbGVXcml0ZTsKKworICAgIHJldHVybiBpb2hhbmRsZXI7Cit9CisKKworCisvLyBDbG9zZSBhbiBvcGVuIElPIGhhbmRsZXIKK2Ntc0Jvb2wgQ01TRVhQT1JUIGNtc0Nsb3NlSU9oYW5kbGVyKGNtc0lPSEFORExFUiogaW8pCit7CisgICAgcmV0dXJuIGlvIC0+IENsb3NlKGlvKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbXNJT0hBTkRMRVIqIENNU0VYUE9SVCBjbXNHZXRQcm9maWxlSU9oYW5kbGVyKGNtc0hQUk9GSUxFIGhQcm9maWxlKQoreworCV9jbXNJQ0NQUk9GSUxFKiBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKWhQcm9maWxlOworCisJaWYgKEljYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKwlyZXR1cm4gSWNjLT5JT2hhbmRsZXI7Cit9CisKKyNpZmRlZiBfV0lOMzJfV0NFCit0aW1lX3Qgd2NlZXhfdGltZSh0aW1lX3QgKnRpbWVyKTsKK3N0cnVjdCB0bSAqIHdjZWV4X2dtdGltZShjb25zdCB0aW1lX3QgKnRpbWVyKTsKKworI2RlZmluZSB0aW1lIHdjZWV4X3RpbWUKKyNkZWZpbmUgZ210aW1lIHdjZWV4X2dtdGltZQorI2VuZGlmCisKKy8vIENyZWF0ZXMgYW4gZW1wdHkgc3RydWN0dXJlIGhvbGRpbmcgYWxsIHJlcXVpcmVkIHBhcmFtZXRlcnMKK2Ntc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNDcmVhdGVQcm9maWxlUGxhY2Vob2xkZXIoY21zQ29udGV4dCBDb250ZXh0SUQpCit7CisgICAgdGltZV90IG5vdyA9IHRpbWUoTlVMTCk7CisgICAgX2Ntc0lDQ1BST0ZJTEUqIEljYyA9IChfY21zSUNDUFJPRklMRSopIF9jbXNNYWxsb2NaZXJvKENvbnRleHRJRCwgc2l6ZW9mKF9jbXNJQ0NQUk9GSUxFKSk7CisgICAgaWYgKEljYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIEljYyAtPkNvbnRleHRJRCA9IENvbnRleHRJRDsKKworICAgIC8vIFNldCBpdCB0byBlbXB0eQorICAgIEljYyAtPiBUYWdDb3VudCAgID0gMDsKKworICAgIC8vIFNldCBkZWZhdWx0IHZlcnNpb24KKyAgICBJY2MgLT5WZXJzaW9uID0gIDB4MDIxMDAwMDA7CisKKyAgICAvLyBTZXQgY3JlYXRpb24gZGF0ZS90aW1lCisgICAgbWVtbW92ZSgmSWNjIC0+Q3JlYXRlZCwgZ210aW1lKCZub3cpLCBzaXplb2YoSWNjIC0+Q3JlYXRlZCkpOworCisgICAgLy8gQ3JlYXRlIGEgbXV0ZXggaWYgdGhlIHVzZXIgcHJvdmlkZWQgcHJvcGVyIHBsdWdpbi4gTlVMTCBvdGhlcndpc2UKKyAgICBJY2MgLT5Vc3JNdXRleCA9IF9jbXNDcmVhdGVNdXRleChDb250ZXh0SUQpOworCisgICAgLy8gUmV0dXJuIHRoZSBoYW5kbGUKKyAgICByZXR1cm4gKGNtc0hQUk9GSUxFKSBJY2M7Cit9CisKK2Ntc0NvbnRleHQgQ01TRVhQT1JUIGNtc0dldFByb2ZpbGVDb250ZXh0SUQoY21zSFBST0ZJTEUgaFByb2ZpbGUpCit7CisgICAgIF9jbXNJQ0NQUk9GSUxFKiBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKKworICAgIGlmIChJY2MgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIEljYyAtPiBDb250ZXh0SUQ7Cit9CisKKworLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgdGFncworY21zSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0dldFRhZ0NvdW50KGNtc0hQUk9GSUxFIGhQcm9maWxlKQoreworICAgIF9jbXNJQ0NQUk9GSUxFKiBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKKyAgICBpZiAoSWNjID09IE5VTEwpIHJldHVybiAtMTsKKworICAgIHJldHVybiAgSWNjLT5UYWdDb3VudDsKK30KKworLy8gUmV0dXJuIHRoZSB0YWcgc2lnbmF0dXJlIG9mIGEgZ2l2ZW4gdGFnIG51bWJlcgorY21zVGFnU2lnbmF0dXJlIENNU0VYUE9SVCBjbXNHZXRUYWdTaWduYXR1cmUoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBuKQoreworICAgIF9jbXNJQ0NQUk9GSUxFKiBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKKworICAgIGlmIChuID4gSWNjLT5UYWdDb3VudCkgcmV0dXJuIChjbXNUYWdTaWduYXR1cmUpIDA7ICAvLyBNYXJrIGFzIG5vdCBhdmFpbGFibGUKKyAgICBpZiAobiA+PSBNQVhfVEFCTEVfVEFHKSByZXR1cm4gKGNtc1RhZ1NpZ25hdHVyZSkgMDsgLy8gQXMgZG91YmxlIGNoZWNrCisKKyAgICByZXR1cm4gSWNjIC0+VGFnTmFtZXNbbl07Cit9CisKKworc3RhdGljCitpbnQgU2VhcmNoT25lVGFnKF9jbXNJQ0NQUk9GSUxFKiBQcm9maWxlLCBjbXNUYWdTaWduYXR1cmUgc2lnKQoreworICAgIGNtc1VJbnQzMk51bWJlciBpOworCisgICAgZm9yIChpPTA7IGkgPCBQcm9maWxlIC0+IFRhZ0NvdW50OyBpKyspIHsKKworICAgICAgICBpZiAoc2lnID09IFByb2ZpbGUgLT4gVGFnTmFtZXNbaV0pCisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7Cit9CisKKy8vIFNlYXJjaCBmb3IgYSBzcGVjaWZpYyB0YWcgaW4gdGFnIGRpY3Rpb25hcnkuIFJldHVybnMgcG9zaXRpb24gb3IgLTEgaWYgdGFnIG5vdCBmb3VuZC4KKy8vIElmIGZvbGxvd2xpbmtzIGlzIHR1cm5lZCBvbiwgdGhlbiB0aGUgcG9zaXRpb24gb2YgdGhlIGxpbmtlZCB0YWcgaXMgcmV0dXJuZWQKK2ludCBfY21zU2VhcmNoVGFnKF9jbXNJQ0NQUk9GSUxFKiBJY2MsIGNtc1RhZ1NpZ25hdHVyZSBzaWcsIGNtc0Jvb2wgbEZvbGxvd0xpbmtzKQoreworICAgIGludCBuOworICAgIGNtc1RhZ1NpZ25hdHVyZSBMaW5rZWRTaWc7CisKKyAgICBkbyB7CisKKyAgICAgICAgLy8gU2VhcmNoIGZvciBnaXZlbiB0YWcgaW4gSUNDIHByb2ZpbGUgZGlyZWN0b3J5CisgICAgICAgIG4gPSBTZWFyY2hPbmVUYWcoSWNjLCBzaWcpOworICAgICAgICBpZiAobiA8IDApCisgICAgICAgICAgICByZXR1cm4gLTE7ICAgICAgICAvLyBOb3QgZm91bmQKKworICAgICAgICBpZiAoIWxGb2xsb3dMaW5rcykKKyAgICAgICAgICAgIHJldHVybiBuOyAgICAgICAgIC8vIEZvdW5kLCBkb24ndCBmb2xsb3cgbGlua3MKKworICAgICAgICAvLyBJcyB0aGlzIGEgbGlua2VkIHRhZz8KKyAgICAgICAgTGlua2VkU2lnID0gSWNjIC0+VGFnTGlua2VkW25dOworCisgICAgICAgIC8vIFllcywgZm9sbG93IGxpbmsKKyAgICAgICAgaWYgKExpbmtlZFNpZyAhPSAoY21zVGFnU2lnbmF0dXJlKSAwKSB7CisgICAgICAgICAgICAvLyBmaXggYnVnIG1hbnRpcyBpZCMwMDU1OTQyCisgICAgICAgICAgICAvLyBhc3N1bWUgdGhhdCBUUkNUYWcgYW5kIENvbG9yYW50VGFnIGNhbid0IGJlIGxpbmtlZC4KKyAgICAgICAgICAgIC8vIFhpYW9jaHVhbiBMaXUgMjAxNC0wNC0yMworICAgICAgICAgICAgaWYgKChzaWcgPT0gY21zU2lnUmVkVFJDVGFnIHx8IHNpZyA9PSBjbXNTaWdHcmVlblRSQ1RhZyB8fCBzaWcgPT0gY21zU2lnQmx1ZVRSQ1RhZykgJiYgCisgICAgICAgICAgICAgICAgKExpbmtlZFNpZyA9PSBjbXNTaWdSZWRDb2xvcmFudFRhZyB8fCBMaW5rZWRTaWcgPT0gY21zU2lnR3JlZW5Db2xvcmFudFRhZyB8fCBMaW5rZWRTaWcgPT0gY21zU2lnQmx1ZUNvbG9yYW50VGFnKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpZyA9IExpbmtlZFNpZzsKKyAgICAgICAgfQorCisgICAgfSB3aGlsZSAoTGlua2VkU2lnICE9IChjbXNUYWdTaWduYXR1cmUpIDApOworCisgICAgcmV0dXJuIG47Cit9CisKKy8vIERlbGV0ZXMgYSB0YWcgZW50cnkKKworc3RhdGljCit2b2lkIF9jbXNEZWxldGVUYWdCeVBvcyhfY21zSUNDUFJPRklMRSogSWNjLCBpbnQgaSkKK3sKKyAgICBfY21zQXNzZXJ0KEljYyAhPSBOVUxMKTsKKyAgICBfY21zQXNzZXJ0KGkgPj0gMCk7CisKKyAgIAorICAgIGlmIChJY2MgLT4gVGFnUHRyc1tpXSAhPSBOVUxMKSB7CisKKyAgICAgICAgLy8gRnJlZSBwcmV2aW91cyB2ZXJzaW9uCisgICAgICAgIGlmIChJY2MgLT5UYWdTYXZlQXNSYXdbaV0pIHsKKyAgICAgICAgICAgIF9jbXNGcmVlKEljYyAtPkNvbnRleHRJRCwgSWNjIC0+VGFnUHRyc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjbXNUYWdUeXBlSGFuZGxlciogVHlwZUhhbmRsZXIgPSBJY2MgLT5UYWdUeXBlSGFuZGxlcnNbaV07CisKKyAgICAgICAgICAgIGlmIChUeXBlSGFuZGxlciAhPSBOVUxMKSB7CisKKyAgICAgICAgICAgICAgICBjbXNUYWdUeXBlSGFuZGxlciBMb2NhbFR5cGVIYW5kbGVyID0gKlR5cGVIYW5kbGVyOworICAgICAgICAgICAgICAgIExvY2FsVHlwZUhhbmRsZXIuQ29udGV4dElEID0gSWNjIC0+Q29udGV4dElEOyAgICAgICAgICAgICAgLy8gQXMgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICBMb2NhbFR5cGVIYW5kbGVyLklDQ1ZlcnNpb24gPSBJY2MgLT5WZXJzaW9uOworICAgICAgICAgICAgICAgIExvY2FsVHlwZUhhbmRsZXIuRnJlZVB0cigmTG9jYWxUeXBlSGFuZGxlciwgSWNjIC0+IFRhZ1B0cnNbaV0pOworICAgICAgICAgICAgICAgIEljYyAtPlRhZ1B0cnNbaV0gPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9IAorfQorCisKKy8vIENyZWF0ZXMgYSBuZXcgdGFnIGVudHJ5CitzdGF0aWMKK2Ntc0Jvb2wgX2Ntc05ld1RhZyhfY21zSUNDUFJPRklMRSogSWNjLCBjbXNUYWdTaWduYXR1cmUgc2lnLCBpbnQqIE5ld1BvcykKK3sKKyAgICBpbnQgaTsKKworICAgIC8vIFNlYXJjaCBmb3IgdGhlIHRhZworICAgIGkgPSBfY21zU2VhcmNoVGFnKEljYywgc2lnLCBGQUxTRSk7CisgICAgaWYgKGkgPj0gMCkgeworCisgICAgICAgIC8vIEFscmVhZHkgZXhpc3RzPyBkZWxldGUgaXQKKyAgICAgICAgX2Ntc0RlbGV0ZVRhZ0J5UG9zKEljYywgaSk7CisgICAgICAgICpOZXdQb3MgPSBpOworICAgIH0KKyAgICBlbHNlICB7CisKKyAgICAgICAgLy8gTm8sIG1ha2UgYSBuZXcgb25lCisKKyAgICAgICAgaWYgKEljYyAtPiBUYWdDb3VudCA+PSBNQVhfVEFCTEVfVEFHKSB7CisgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihJY2MgLT5Db250ZXh0SUQsIGNtc0VSUk9SX1JBTkdFLCAiVG9vIG1hbnkgdGFncyAoJWQpIiwgTUFYX1RBQkxFX1RBRyk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICAqTmV3UG9zID0gSWNjIC0+VGFnQ291bnQ7CisgICAgICAgIEljYyAtPiBUYWdDb3VudCsrOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisKKy8vIENoZWNrIGV4aXN0ZW5jZQorY21zQm9vbCBDTVNFWFBPUlQgY21zSXNUYWcoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1RhZ1NpZ25hdHVyZSBzaWcpCit7CisgICAgICAgX2Ntc0lDQ1BST0ZJTEUqICBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSAodm9pZCopIGhQcm9maWxlOworICAgICAgIHJldHVybiBfY21zU2VhcmNoVGFnKEljYywgc2lnLCBGQUxTRSkgPj0gMDsKK30KKworCisKKy8vIEVuZm9yY2VzIHRoYXQgdGhlIHByb2ZpbGUgdmVyc2lvbiBpcyBwZXIuIHNwZWMuCisvLyBPcGVyYXRlcyBvbiB0aGUgYmlnIGVuZGlhbiBieXRlcyBmcm9tIHRoZSBwcm9maWxlLgorLy8gQ2FsbGVkIGJlZm9yZSBjb252ZXJ0aW5nIHRvIHBsYXRmb3JtIGVuZGlhbm5lc3MuCisvLyBCeXRlIDAgaXMgQkNEIG1ham9yIHZlcnNpb24sIHNvIG1heCA5LgorLy8gQnl0ZSAxIGlzIDIgQkNEIGRpZ2l0cywgb25lIHBlciBuaWJibGUuCisvLyBSZXNlcnZlZCBieXRlcyAyICYgMyBtdXN0IGJlIDAuCitzdGF0aWMgCitjbXNVSW50MzJOdW1iZXIgX3ZhbGlkYXRlZFZlcnNpb24oY21zVUludDMyTnVtYmVyIERXb3JkKQoreworICAgIGNtc1VJbnQ4TnVtYmVyKiBwQnl0ZSA9IChjbXNVSW50OE51bWJlciopICZEV29yZDsKKyAgICBjbXNVSW50OE51bWJlciB0ZW1wMTsKKyAgICBjbXNVSW50OE51bWJlciB0ZW1wMjsKKworICAgIGlmICgqcEJ5dGUgPiAweDA5KSAqcEJ5dGUgPSAoY21zVUludDhOdW1iZXIpIDB4MDk7CisgICAgdGVtcDEgPSAqKHBCeXRlKzEpICYgMHhmMDsKKyAgICB0ZW1wMiA9ICoocEJ5dGUrMSkgJiAweDBmOworICAgIGlmICh0ZW1wMSA+IDB4OTApIHRlbXAxID0gMHg5MDsKKyAgICBpZiAodGVtcDIgPiAweDA5KSB0ZW1wMiA9IDB4MDk7CisgICAgKihwQnl0ZSsxKSA9IChjbXNVSW50OE51bWJlcikodGVtcDEgfCB0ZW1wMik7CisgICAgKihwQnl0ZSsyKSA9IChjbXNVSW50OE51bWJlcikwOworICAgICoocEJ5dGUrMykgPSAoY21zVUludDhOdW1iZXIpMDsKKworICAgIHJldHVybiBEV29yZDsKK30KKworLy8gUmVhZCBwcm9maWxlIGhlYWRlciBhbmQgdmFsaWRhdGUgaXQKK2Ntc0Jvb2wgX2Ntc1JlYWRIZWFkZXIoX2Ntc0lDQ1BST0ZJTEUqIEljYykKK3sKKyAgICBjbXNUYWdFbnRyeSBUYWc7CisgICAgY21zSUNDSGVhZGVyIEhlYWRlcjsKKyAgICBjbXNVSW50MzJOdW1iZXIgaSwgajsKKyAgICBjbXNVSW50MzJOdW1iZXIgSGVhZGVyU2l6ZTsKKyAgICBjbXNJT0hBTkRMRVIqIGlvID0gSWNjIC0+SU9oYW5kbGVyOworICAgIGNtc1VJbnQzMk51bWJlciBUYWdDb3VudDsKKworCisgICAgLy8gUmVhZCB0aGUgaGVhZGVyCisgICAgaWYgKGlvIC0+IFJlYWQoaW8sICZIZWFkZXIsIHNpemVvZihjbXNJQ0NIZWFkZXIpLCAxKSAhPSAxKSB7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBmaWxlIGFzIGFuIElDQyBwcm9maWxlCisgICAgaWYgKF9jbXNBZGp1c3RFbmRpYW5lc3MzMihIZWFkZXIubWFnaWMpICE9IGNtc01hZ2ljTnVtYmVyKSB7CisgICAgICAgIGNtc1NpZ25hbEVycm9yKEljYyAtPkNvbnRleHRJRCwgY21zRVJST1JfQkFEX1NJR05BVFVSRSwgIm5vdCBhbiBJQ0MgcHJvZmlsZSwgaW52YWxpZCBzaWduYXR1cmUiKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8vIEFkanVzdCBlbmRpYW5uZXNzIG9mIHRoZSB1c2VkIHBhcmFtZXRlcnMKKyAgICBJY2MgLT4gRGV2aWNlQ2xhc3MgICAgID0gKGNtc1Byb2ZpbGVDbGFzc1NpZ25hdHVyZSkgX2Ntc0FkanVzdEVuZGlhbmVzczMyKEhlYWRlci5kZXZpY2VDbGFzcyk7CisgICAgSWNjIC0+IENvbG9yU3BhY2UgICAgICA9IChjbXNDb2xvclNwYWNlU2lnbmF0dXJlKSAgIF9jbXNBZGp1c3RFbmRpYW5lc3MzMihIZWFkZXIuY29sb3JTcGFjZSk7CisgICAgSWNjIC0+IFBDUyAgICAgICAgICAgICA9IChjbXNDb2xvclNwYWNlU2lnbmF0dXJlKSAgIF9jbXNBZGp1c3RFbmRpYW5lc3MzMihIZWFkZXIucGNzKTsKKyAgIAorICAgIEljYyAtPiBSZW5kZXJpbmdJbnRlbnQgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoSGVhZGVyLnJlbmRlcmluZ0ludGVudCk7CisgICAgSWNjIC0+IGZsYWdzICAgICAgICAgICA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMihIZWFkZXIuZmxhZ3MpOworICAgIEljYyAtPiBtYW51ZmFjdHVyZXIgICAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoSGVhZGVyLm1hbnVmYWN0dXJlcik7CisgICAgSWNjIC0+IG1vZGVsICAgICAgICAgICA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMihIZWFkZXIubW9kZWwpOworICAgIEljYyAtPiBjcmVhdG9yICAgICAgICAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoSGVhZGVyLmNyZWF0b3IpOworICAgIAorICAgIF9jbXNBZGp1c3RFbmRpYW5lc3M2NCgmSWNjIC0+IGF0dHJpYnV0ZXMsICZIZWFkZXIuYXR0cmlidXRlcyk7CisgICAgSWNjIC0+IFZlcnNpb24gICAgICAgICA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMihfdmFsaWRhdGVkVmVyc2lvbihIZWFkZXIudmVyc2lvbikpOworCisgICAgLy8gR2V0IHNpemUgYXMgcmVwb3J0ZWQgaW4gaGVhZGVyCisgICAgSGVhZGVyU2l6ZSA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMihIZWFkZXIuc2l6ZSk7CisKKyAgICAvLyBNYWtlIHN1cmUgSGVhZGVyU2l6ZSBpcyBsb3dlciB0aGFuIHByb2ZpbGUgc2l6ZQorICAgIGlmIChIZWFkZXJTaXplID49IEljYyAtPklPaGFuZGxlciAtPlJlcG9ydGVkU2l6ZSkKKyAgICAgICAgICAgIEhlYWRlclNpemUgPSBJY2MgLT5JT2hhbmRsZXIgLT5SZXBvcnRlZFNpemU7CisKKworICAgIC8vIEdldCBjcmVhdGlvbiBkYXRlL3RpbWUKKyAgICBfY21zRGVjb2RlRGF0ZVRpbWVOdW1iZXIoJkhlYWRlci5kYXRlLCAmSWNjIC0+Q3JlYXRlZCk7CisKKyAgICAvLyBUaGUgcHJvZmlsZSBJRCBhcmUgMzIgcmF3IGJ5dGVzCisgICAgbWVtbW92ZShJY2MgLT5Qcm9maWxlSUQuSUQzMiwgSGVhZGVyLnByb2ZpbGVJRC5JRDMyLCAxNik7CisKKworICAgIC8vIFJlYWQgdGFnIGRpcmVjdG9yeQorICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZUYWdDb3VudCkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoVGFnQ291bnQgPiBNQVhfVEFCTEVfVEFHKSB7CisKKyAgICAgICAgY21zU2lnbmFsRXJyb3IoSWNjIC0+Q29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgIlRvbyBtYW55IHRhZ3MgKCVkKSIsIFRhZ0NvdW50KTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworCisgICAgLy8gUmVhZCB0YWcgZGlyZWN0b3J5CisgICAgSWNjIC0+IFRhZ0NvdW50ID0gMDsKKyAgICBmb3IgKGk9MDsgaSA8IFRhZ0NvdW50OyBpKyspIHsKKworICAgICAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAoY21zVUludDMyTnVtYmVyICopICZUYWcuc2lnKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmVGFnLm9mZnNldCkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJlRhZy5zaXplKSkgcmV0dXJuIEZBTFNFOworCisgICAgICAgIC8vIFBlcmZvcm0gc29tZSBzYW5pdHkgY2hlY2suIE9mZnNldCArIHNpemUgc2hvdWxkIGZhbGwgaW5zaWRlIGZpbGUuCisgICAgICAgIGlmIChUYWcub2Zmc2V0ICsgVGFnLnNpemUgPiBIZWFkZXJTaXplIHx8CisgICAgICAgICAgICBUYWcub2Zmc2V0ICsgVGFnLnNpemUgPCBUYWcub2Zmc2V0KQorICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgSWNjIC0+IFRhZ05hbWVzW0ljYyAtPlRhZ0NvdW50XSAgID0gVGFnLnNpZzsKKyAgICAgICAgSWNjIC0+IFRhZ09mZnNldHNbSWNjIC0+VGFnQ291bnRdID0gVGFnLm9mZnNldDsKKyAgICAgICAgSWNjIC0+IFRhZ1NpemVzW0ljYyAtPlRhZ0NvdW50XSAgID0gVGFnLnNpemU7CisKKyAgICAgICAvLyBTZWFyY2ggZm9yIGxpbmtzCisgICAgICAgIGZvciAoaj0wOyBqIDwgSWNjIC0+VGFnQ291bnQ7IGorKykgeworCisgICAgICAgICAgICBpZiAoKEljYyAtPlRhZ09mZnNldHNbal0gPT0gVGFnLm9mZnNldCkgJiYKKyAgICAgICAgICAgICAgICAoSWNjIC0+VGFnU2l6ZXNbal0gICA9PSBUYWcuc2l6ZSkgJiYKKyAgICAgICAgICAgICAgICAoSWNjIC0+VGFnTmFtZXNbal0gICA9PSBUYWcuc2lnKSkgeworCisgICAgICAgICAgICAgICAgSWNjIC0+VGFnTGlua2VkW0ljYyAtPlRhZ0NvdW50XSA9IEljYyAtPlRhZ05hbWVzW2pdOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBJY2MgLT5UYWdDb3VudCsrOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvLyBTYXZlcyBwcm9maWxlIGhlYWRlcgorY21zQm9vbCBfY21zV3JpdGVIZWFkZXIoX2Ntc0lDQ1BST0ZJTEUqIEljYywgY21zVUludDMyTnVtYmVyIFVzZWRTcGFjZSkKK3sKKyAgICBjbXNJQ0NIZWFkZXIgSGVhZGVyOworICAgIGNtc1VJbnQzMk51bWJlciBpOworICAgIGNtc1RhZ0VudHJ5IFRhZzsKKyAgICBjbXNJbnQzMk51bWJlciBDb3VudCA9IDA7CisKKyAgICBIZWFkZXIuc2l6ZSAgICAgICAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoVXNlZFNwYWNlKTsKKyAgICBIZWFkZXIuY21tSWQgICAgICAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIobGNtc1NpZ25hdHVyZSk7CisgICAgSGVhZGVyLnZlcnNpb24gICAgID0gX2Ntc0FkanVzdEVuZGlhbmVzczMyKEljYyAtPlZlcnNpb24pOworCisgICAgSGVhZGVyLmRldmljZUNsYXNzID0gKGNtc1Byb2ZpbGVDbGFzc1NpZ25hdHVyZSkgX2Ntc0FkanVzdEVuZGlhbmVzczMyKEljYyAtPiBEZXZpY2VDbGFzcyk7CisgICAgSGVhZGVyLmNvbG9yU3BhY2UgID0gKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUpIF9jbXNBZGp1c3RFbmRpYW5lc3MzMihJY2MgLT4gQ29sb3JTcGFjZSk7CisgICAgSGVhZGVyLnBjcyAgICAgICAgID0gKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUpIF9jbXNBZGp1c3RFbmRpYW5lc3MzMihJY2MgLT4gUENTKTsKKworICAgIC8vICAgTk9URTogaW4gdjQgVGltZXN0YW1wIG11c3QgYmUgaW4gVVRDIHJhdGhlciB0aGFuIGluIGxvY2FsIHRpbWUKKyAgICBfY21zRW5jb2RlRGF0ZVRpbWVOdW1iZXIoJkhlYWRlci5kYXRlLCAmSWNjIC0+Q3JlYXRlZCk7CisKKyAgICBIZWFkZXIubWFnaWMgICAgICAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoY21zTWFnaWNOdW1iZXIpOworCisjaWZkZWYgQ01TX0lTX1dJTkRPV1NfCisgICAgSGVhZGVyLnBsYXRmb3JtICAgID0gKGNtc1BsYXRmb3JtU2lnbmF0dXJlKSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoY21zU2lnTWljcm9zb2Z0KTsKKyNlbHNlCisgICAgSGVhZGVyLnBsYXRmb3JtICAgID0gKGNtc1BsYXRmb3JtU2lnbmF0dXJlKSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoY21zU2lnTWFjaW50b3NoKTsKKyNlbmRpZgorCisgICAgSGVhZGVyLmZsYWdzICAgICAgICA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMihJY2MgLT4gZmxhZ3MpOworICAgIEhlYWRlci5tYW51ZmFjdHVyZXIgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoSWNjIC0+IG1hbnVmYWN0dXJlcik7CisgICAgSGVhZGVyLm1vZGVsICAgICAgICA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMihJY2MgLT4gbW9kZWwpOworCisgICAgX2Ntc0FkanVzdEVuZGlhbmVzczY0KCZIZWFkZXIuYXR0cmlidXRlcywgJkljYyAtPiBhdHRyaWJ1dGVzKTsKKworICAgIC8vIFJlbmRlcmluZyBpbnRlbnQgaW4gdGhlIGhlYWRlciAoZm9yIGVtYmVkZGVkIHByb2ZpbGVzKQorICAgIEhlYWRlci5yZW5kZXJpbmdJbnRlbnQgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoSWNjIC0+IFJlbmRlcmluZ0ludGVudCk7CisKKyAgICAvLyBJbGx1bWluYW50IGlzIGFsd2F5cyBENTAKKyAgICBIZWFkZXIuaWxsdW1pbmFudC5YID0gX2Ntc0FkanVzdEVuZGlhbmVzczMyKF9jbXNEb3VibGVUbzE1Rml4ZWQxNihjbXNENTBfWFlaKCktPlgpKTsKKyAgICBIZWFkZXIuaWxsdW1pbmFudC5ZID0gX2Ntc0FkanVzdEVuZGlhbmVzczMyKF9jbXNEb3VibGVUbzE1Rml4ZWQxNihjbXNENTBfWFlaKCktPlkpKTsKKyAgICBIZWFkZXIuaWxsdW1pbmFudC5aID0gX2Ntc0FkanVzdEVuZGlhbmVzczMyKF9jbXNEb3VibGVUbzE1Rml4ZWQxNihjbXNENTBfWFlaKCktPlopKTsKKworICAgIC8vIENyZWF0ZWQgYnkgTGl0dGxlQ01TICh0aGF0J3MgbWUhKQorICAgIEhlYWRlci5jcmVhdG9yICAgICAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIobGNtc1NpZ25hdHVyZSk7CisKKyAgICBtZW1zZXQoJkhlYWRlci5yZXNlcnZlZCwgMCwgc2l6ZW9mKEhlYWRlci5yZXNlcnZlZCkpOworCisgICAgLy8gU2V0IHByb2ZpbGUgSUQuIEVuZGlhbm5lc3MgaXMgYWx3YXlzIGJpZyBlbmRpYW4KKyAgICBtZW1tb3ZlKCZIZWFkZXIucHJvZmlsZUlELCAmSWNjIC0+UHJvZmlsZUlELCAxNik7CisKKyAgICAvLyBEdW1wIHRoZSBoZWFkZXIKKyAgICBpZiAoIUljYyAtPiBJT2hhbmRsZXItPldyaXRlKEljYy0+SU9oYW5kbGVyLCBzaXplb2YoY21zSUNDSGVhZGVyKSwgJkhlYWRlcikpIHJldHVybiBGQUxTRTsKKworICAgIC8vIFNhdmVzIFRhZyBkaXJlY3RvcnkKKworICAgIC8vIEdldCB0cnVlIGNvdW50CisgICAgZm9yIChpPTA7ICBpIDwgSWNjIC0+IFRhZ0NvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKEljYyAtPlRhZ05hbWVzW2ldICE9IChjbXNUYWdTaWduYXR1cmUpIDApCisgICAgICAgICAgICBDb3VudCsrOworICAgIH0KKworICAgIC8vIFN0b3JlIG51bWJlciBvZiB0YWdzCisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoSWNjIC0+SU9oYW5kbGVyLCBDb3VudCkpIHJldHVybiBGQUxTRTsKKworICAgIGZvciAoaT0wOyBpIDwgSWNjIC0+IFRhZ0NvdW50OyBpKyspIHsKKworICAgICAgICBpZiAoSWNjIC0+VGFnTmFtZXNbaV0gPT0gKGNtc1RhZ1NpZ25hdHVyZSkgMCkgY29udGludWU7ICAgLy8gSXQgaXMganVzdCBhIHBsYWNlaG9sZGVyCisKKyAgICAgICAgVGFnLnNpZyAgICA9IChjbXNUYWdTaWduYXR1cmUpIF9jbXNBZGp1c3RFbmRpYW5lc3MzMigoY21zSW50MzJOdW1iZXIpIEljYyAtPiBUYWdOYW1lc1tpXSk7CisgICAgICAgIFRhZy5vZmZzZXQgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoKGNtc0ludDMyTnVtYmVyKSBJY2MgLT4gVGFnT2Zmc2V0c1tpXSk7CisgICAgICAgIFRhZy5zaXplICAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoKGNtc0ludDMyTnVtYmVyKSBJY2MgLT4gVGFnU2l6ZXNbaV0pOworCisgICAgICAgIGlmICghSWNjIC0+SU9oYW5kbGVyIC0+IFdyaXRlKEljYy0+IElPaGFuZGxlciwgc2l6ZW9mKGNtc1RhZ0VudHJ5KSwgJlRhZykpIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2V0L0dldCBzZXZlcmFsIHN0cnVjdCBtZW1iZXJzCisKKworY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNHZXRIZWFkZXJSZW5kZXJpbmdJbnRlbnQoY21zSFBST0ZJTEUgaFByb2ZpbGUpCit7CisgICAgX2Ntc0lDQ1BST0ZJTEUqICBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKKyAgICByZXR1cm4gSWNjIC0+IFJlbmRlcmluZ0ludGVudDsKK30KKwordm9pZCBDTVNFWFBPUlQgY21zU2V0SGVhZGVyUmVuZGVyaW5nSW50ZW50KGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50MzJOdW1iZXIgUmVuZGVyaW5nSW50ZW50KQoreworICAgIF9jbXNJQ0NQUk9GSUxFKiAgSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7CisgICAgSWNjIC0+IFJlbmRlcmluZ0ludGVudCA9IFJlbmRlcmluZ0ludGVudDsKK30KKworY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNHZXRIZWFkZXJGbGFncyhjbXNIUFJPRklMRSBoUHJvZmlsZSkKK3sKKyAgICBfY21zSUNDUFJPRklMRSogIEljYyA9IChfY21zSUNDUFJPRklMRSopIGhQcm9maWxlOworICAgIHJldHVybiAoY21zVUludDMyTnVtYmVyKSBJY2MgLT4gZmxhZ3M7Cit9CisKK3ZvaWQgQ01TRVhQT1JUIGNtc1NldEhlYWRlckZsYWdzKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50MzJOdW1iZXIgRmxhZ3MpCit7CisgICAgX2Ntc0lDQ1BST0ZJTEUqICBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKKyAgICBJY2MgLT4gZmxhZ3MgPSAoY21zVUludDMyTnVtYmVyKSBGbGFnczsKK30KKworY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNHZXRIZWFkZXJNYW51ZmFjdHVyZXIoY21zSFBST0ZJTEUgaFByb2ZpbGUpCit7CisgICAgX2Ntc0lDQ1BST0ZJTEUqICBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKKyAgICByZXR1cm4gSWNjIC0+bWFudWZhY3R1cmVyOworfQorCit2b2lkIENNU0VYUE9SVCBjbXNTZXRIZWFkZXJNYW51ZmFjdHVyZXIoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBtYW51ZmFjdHVyZXIpCit7CisgICAgX2Ntc0lDQ1BST0ZJTEUqICBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKKyAgICBJY2MgLT4gbWFudWZhY3R1cmVyID0gbWFudWZhY3R1cmVyOworfQorCitjbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0dldEhlYWRlckNyZWF0b3IoY21zSFBST0ZJTEUgaFByb2ZpbGUpCit7CisgICAgX2Ntc0lDQ1BST0ZJTEUqICBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKKyAgICByZXR1cm4gSWNjIC0+Y3JlYXRvcjsKK30KKworY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNHZXRIZWFkZXJNb2RlbChjbXNIUFJPRklMRSBoUHJvZmlsZSkKK3sKKyAgICBfY21zSUNDUFJPRklMRSogIEljYyA9IChfY21zSUNDUFJPRklMRSopIGhQcm9maWxlOworICAgIHJldHVybiBJY2MgLT5tb2RlbDsKK30KKwordm9pZCBDTVNFWFBPUlQgY21zU2V0SGVhZGVyTW9kZWwoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBtb2RlbCkKK3sKKyAgICBfY21zSUNDUFJPRklMRSogIEljYyA9IChfY21zSUNDUFJPRklMRSopIGhQcm9maWxlOworICAgIEljYyAtPiBtb2RlbCA9IG1vZGVsOworfQorCit2b2lkIENNU0VYUE9SVCBjbXNHZXRIZWFkZXJBdHRyaWJ1dGVzKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50NjROdW1iZXIqIEZsYWdzKQoreworICAgIF9jbXNJQ0NQUk9GSUxFKiAgSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7CisgICAgbWVtbW92ZShGbGFncywgJkljYyAtPiBhdHRyaWJ1dGVzLCBzaXplb2YoY21zVUludDY0TnVtYmVyKSk7Cit9CisKK3ZvaWQgQ01TRVhQT1JUIGNtc1NldEhlYWRlckF0dHJpYnV0ZXMoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQ2NE51bWJlciBGbGFncykKK3sKKyAgICBfY21zSUNDUFJPRklMRSogIEljYyA9IChfY21zSUNDUFJPRklMRSopIGhQcm9maWxlOworICAgIG1lbW1vdmUoJkljYyAtPiBhdHRyaWJ1dGVzLCAmRmxhZ3MsIHNpemVvZihjbXNVSW50NjROdW1iZXIpKTsKK30KKwordm9pZCBDTVNFWFBPUlQgY21zR2V0SGVhZGVyUHJvZmlsZUlEKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50OE51bWJlciogUHJvZmlsZUlEKQoreworICAgIF9jbXNJQ0NQUk9GSUxFKiAgSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7CisgICAgbWVtbW92ZShQcm9maWxlSUQsIEljYyAtPlByb2ZpbGVJRC5JRDgsIDE2KTsKK30KKwordm9pZCBDTVNFWFBPUlQgY21zU2V0SGVhZGVyUHJvZmlsZUlEKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50OE51bWJlciogUHJvZmlsZUlEKQoreworICAgIF9jbXNJQ0NQUk9GSUxFKiAgSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7CisgICAgbWVtbW92ZSgmSWNjIC0+IFByb2ZpbGVJRCwgUHJvZmlsZUlELCAxNik7Cit9CisKK2Ntc0Jvb2wgIENNU0VYUE9SVCBjbXNHZXRIZWFkZXJDcmVhdGlvbkRhdGVUaW1lKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBzdHJ1Y3QgdG0gKkRlc3QpCit7CisgICAgX2Ntc0lDQ1BST0ZJTEUqICBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKKyAgICBtZW1tb3ZlKERlc3QsICZJY2MgLT5DcmVhdGVkLCBzaXplb2Yoc3RydWN0IHRtKSk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKK2Ntc0NvbG9yU3BhY2VTaWduYXR1cmUgQ01TRVhQT1JUIGNtc0dldFBDUyhjbXNIUFJPRklMRSBoUHJvZmlsZSkKK3sKKyAgICBfY21zSUNDUFJPRklMRSogIEljYyA9IChfY21zSUNDUFJPRklMRSopIGhQcm9maWxlOworICAgIHJldHVybiBJY2MgLT4gUENTOworfQorCit2b2lkIENNU0VYUE9SVCBjbXNTZXRQQ1MoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgcGNzKQoreworICAgIF9jbXNJQ0NQUk9GSUxFKiAgSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7CisgICAgSWNjIC0+IFBDUyA9IHBjczsKK30KKworY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBDTVNFWFBPUlQgY21zR2V0Q29sb3JTcGFjZShjbXNIUFJPRklMRSBoUHJvZmlsZSkKK3sKKyAgICBfY21zSUNDUFJPRklMRSogIEljYyA9IChfY21zSUNDUFJPRklMRSopIGhQcm9maWxlOworICAgIHJldHVybiBJY2MgLT4gQ29sb3JTcGFjZTsKK30KKwordm9pZCBDTVNFWFBPUlQgY21zU2V0Q29sb3JTcGFjZShjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBzaWcpCit7CisgICAgX2Ntc0lDQ1BST0ZJTEUqICBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKKyAgICBJY2MgLT4gQ29sb3JTcGFjZSA9IHNpZzsKK30KKworY21zUHJvZmlsZUNsYXNzU2lnbmF0dXJlIENNU0VYUE9SVCBjbXNHZXREZXZpY2VDbGFzcyhjbXNIUFJPRklMRSBoUHJvZmlsZSkKK3sKKyAgICBfY21zSUNDUFJPRklMRSogIEljYyA9IChfY21zSUNDUFJPRklMRSopIGhQcm9maWxlOworICAgIHJldHVybiBJY2MgLT4gRGV2aWNlQ2xhc3M7Cit9CisKK3ZvaWQgQ01TRVhQT1JUIGNtc1NldERldmljZUNsYXNzKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNQcm9maWxlQ2xhc3NTaWduYXR1cmUgc2lnKQoreworICAgIF9jbXNJQ0NQUk9GSUxFKiAgSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7CisgICAgSWNjIC0+IERldmljZUNsYXNzID0gc2lnOworfQorCitjbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0dldEVuY29kZWRJQ0N2ZXJzaW9uKGNtc0hQUk9GSUxFIGhQcm9maWxlKQoreworICAgIF9jbXNJQ0NQUk9GSUxFKiAgSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7CisgICAgcmV0dXJuIEljYyAtPiBWZXJzaW9uOworfQorCit2b2lkIENNU0VYUE9SVCBjbXNTZXRFbmNvZGVkSUNDdmVyc2lvbihjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVUludDMyTnVtYmVyIFZlcnNpb24pCit7CisgICAgX2Ntc0lDQ1BST0ZJTEUqICBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKKyAgICBJY2MgLT4gVmVyc2lvbiA9IFZlcnNpb247Cit9CisKKy8vIEdldCBhbiBoZXhhZGVjaW1hbCBudW1iZXIgd2l0aCBzYW1lIGRpZ2l0cyBhcyB2CitzdGF0aWMKK2Ntc1VJbnQzMk51bWJlciBCYXNlVG9CYXNlKGNtc1VJbnQzMk51bWJlciBpbiwgaW50IEJhc2VJbiwgaW50IEJhc2VPdXQpCit7CisgICAgY2hhciBCdWZmWzEwMF07CisgICAgaW50IGksIGxlbjsKKyAgICBjbXNVSW50MzJOdW1iZXIgb3V0OworCisgICAgZm9yIChsZW49MDsgaW4gPiAwICYmIGxlbiA8IDEwMDsgbGVuKyspIHsKKworICAgICAgICBCdWZmW2xlbl0gPSAoY2hhcikgKGluICUgQmFzZUluKTsKKyAgICAgICAgaW4gLz0gQmFzZUluOworICAgIH0KKworICAgIGZvciAoaT1sZW4tMSwgb3V0PTA7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIG91dCA9IG91dCAqIEJhc2VPdXQgKyBCdWZmW2ldOworICAgIH0KKworICAgIHJldHVybiBvdXQ7Cit9CisKK3ZvaWQgIENNU0VYUE9SVCBjbXNTZXRQcm9maWxlVmVyc2lvbihjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zRmxvYXQ2NE51bWJlciBWZXJzaW9uKQoreworICAgIF9jbXNJQ0NQUk9GSUxFKiAgSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7CisKKyAgICAvLyA0LjIgLT4gMHg0MjAwMDAwCisKKyAgICBJY2MgLT4gVmVyc2lvbiA9IEJhc2VUb0Jhc2UoKGNtc1VJbnQzMk51bWJlcikgZmxvb3IoVmVyc2lvbiAqIDEwMC4wICsgMC41KSwgMTAsIDE2KSA8PCAxNjsKK30KKworY21zRmxvYXQ2NE51bWJlciBDTVNFWFBPUlQgY21zR2V0UHJvZmlsZVZlcnNpb24oY21zSFBST0ZJTEUgaFByb2ZpbGUpCit7CisgICAgX2Ntc0lDQ1BST0ZJTEUqICBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKKyAgICBjbXNVSW50MzJOdW1iZXIgbiA9IEljYyAtPiBWZXJzaW9uID4+IDE2OworCisgICAgcmV0dXJuIEJhc2VUb0Jhc2UobiwgMTYsIDEwKSAvIDEwMC4wOworfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisvLyBDcmVhdGUgcHJvZmlsZSBmcm9tIElPaGFuZGxlcgorY21zSFBST0ZJTEUgQ01TRVhQT1JUIGNtc09wZW5Qcm9maWxlRnJvbUlPaGFuZGxlclRIUihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zSU9IQU5ETEVSKiBpbykKK3sKKyAgICBfY21zSUNDUFJPRklMRSogTmV3SWNjOworICAgIGNtc0hQUk9GSUxFIGhFbXB0eSA9IGNtc0NyZWF0ZVByb2ZpbGVQbGFjZWhvbGRlcihDb250ZXh0SUQpOworCisgICAgaWYgKGhFbXB0eSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIE5ld0ljYyA9IChfY21zSUNDUFJPRklMRSopIGhFbXB0eTsKKworICAgIE5ld0ljYyAtPklPaGFuZGxlciA9IGlvOworICAgIGlmICghX2Ntc1JlYWRIZWFkZXIoTmV3SWNjKSkgZ290byBFcnJvcjsKKyAgICByZXR1cm4gaEVtcHR5OworCitFcnJvcjoKKyAgICBjbXNDbG9zZVByb2ZpbGUoaEVtcHR5KTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gQ3JlYXRlIHByb2ZpbGUgZnJvbSBJT2hhbmRsZXIKK2Ntc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNPcGVuUHJvZmlsZUZyb21JT2hhbmRsZXIyVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNCb29sIHdyaXRlKQoreworICAgIF9jbXNJQ0NQUk9GSUxFKiBOZXdJY2M7CisgICAgY21zSFBST0ZJTEUgaEVtcHR5ID0gY21zQ3JlYXRlUHJvZmlsZVBsYWNlaG9sZGVyKENvbnRleHRJRCk7CisKKyAgICBpZiAoaEVtcHR5ID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgTmV3SWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaEVtcHR5OworCisgICAgTmV3SWNjIC0+SU9oYW5kbGVyID0gaW87CisgICAgaWYgKHdyaXRlKSB7CisKKyAgICAgICAgTmV3SWNjIC0+IElzV3JpdGUgPSBUUlVFOworICAgICAgICByZXR1cm4gaEVtcHR5OworICAgIH0KKworICAgIGlmICghX2Ntc1JlYWRIZWFkZXIoTmV3SWNjKSkgZ290byBFcnJvcjsKKyAgICByZXR1cm4gaEVtcHR5OworCitFcnJvcjoKKyAgICBjbXNDbG9zZVByb2ZpbGUoaEVtcHR5KTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworCisvLyBDcmVhdGUgcHJvZmlsZSBmcm9tIGRpc2sgZmlsZQorY21zSFBST0ZJTEUgQ01TRVhQT1JUIGNtc09wZW5Qcm9maWxlRnJvbUZpbGVUSFIoY21zQ29udGV4dCBDb250ZXh0SUQsIGNvbnN0IGNoYXIgKmxwRmlsZU5hbWUsIGNvbnN0IGNoYXIgKnNBY2Nlc3MpCit7CisgICAgX2Ntc0lDQ1BST0ZJTEUqIE5ld0ljYzsKKyAgICBjbXNIUFJPRklMRSBoRW1wdHkgPSBjbXNDcmVhdGVQcm9maWxlUGxhY2Vob2xkZXIoQ29udGV4dElEKTsKKworICAgIGlmIChoRW1wdHkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBOZXdJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoRW1wdHk7CisKKyAgICBOZXdJY2MgLT5JT2hhbmRsZXIgPSBjbXNPcGVuSU9oYW5kbGVyRnJvbUZpbGUoQ29udGV4dElELCBscEZpbGVOYW1lLCBzQWNjZXNzKTsKKyAgICBpZiAoTmV3SWNjIC0+SU9oYW5kbGVyID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgICBpZiAoKnNBY2Nlc3MgPT0gJ1cnIHx8ICpzQWNjZXNzID09ICd3JykgeworCisgICAgICAgIE5ld0ljYyAtPiBJc1dyaXRlID0gVFJVRTsKKworICAgICAgICByZXR1cm4gaEVtcHR5OworICAgIH0KKworICAgIGlmICghX2Ntc1JlYWRIZWFkZXIoTmV3SWNjKSkgZ290byBFcnJvcjsKKyAgICByZXR1cm4gaEVtcHR5OworCitFcnJvcjoKKyAgICBjbXNDbG9zZVByb2ZpbGUoaEVtcHR5KTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworCitjbXNIUFJPRklMRSBDTVNFWFBPUlQgY21zT3BlblByb2ZpbGVGcm9tRmlsZShjb25zdCBjaGFyICpJQ0NQcm9maWxlLCBjb25zdCBjaGFyICpzQWNjZXNzKQoreworICAgIHJldHVybiBjbXNPcGVuUHJvZmlsZUZyb21GaWxlVEhSKE5VTEwsIElDQ1Byb2ZpbGUsIHNBY2Nlc3MpOworfQorCisKK2Ntc0hQUk9GSUxFICBDTVNFWFBPUlQgY21zT3BlblByb2ZpbGVGcm9tU3RyZWFtVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBGSUxFKiBJQ0NQcm9maWxlLCBjb25zdCBjaGFyICpzQWNjZXNzKQoreworICAgIF9jbXNJQ0NQUk9GSUxFKiBOZXdJY2M7CisgICAgY21zSFBST0ZJTEUgaEVtcHR5ID0gY21zQ3JlYXRlUHJvZmlsZVBsYWNlaG9sZGVyKENvbnRleHRJRCk7CisKKyAgICBpZiAoaEVtcHR5ID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgTmV3SWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaEVtcHR5OworCisgICAgTmV3SWNjIC0+SU9oYW5kbGVyID0gY21zT3BlbklPaGFuZGxlckZyb21TdHJlYW0oQ29udGV4dElELCBJQ0NQcm9maWxlKTsKKyAgICBpZiAoTmV3SWNjIC0+SU9oYW5kbGVyID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgICBpZiAoKnNBY2Nlc3MgPT0gJ3cnKSB7CisKKyAgICAgICAgTmV3SWNjIC0+IElzV3JpdGUgPSBUUlVFOworICAgICAgICByZXR1cm4gaEVtcHR5OworICAgIH0KKworICAgIGlmICghX2Ntc1JlYWRIZWFkZXIoTmV3SWNjKSkgZ290byBFcnJvcjsKKyAgICByZXR1cm4gaEVtcHR5OworCitFcnJvcjoKKyAgICBjbXNDbG9zZVByb2ZpbGUoaEVtcHR5KTsKKyAgICByZXR1cm4gTlVMTDsKKworfQorCitjbXNIUFJPRklMRSAgQ01TRVhQT1JUIGNtc09wZW5Qcm9maWxlRnJvbVN0cmVhbShGSUxFKiBJQ0NQcm9maWxlLCBjb25zdCBjaGFyICpzQWNjZXNzKQoreworICAgIHJldHVybiBjbXNPcGVuUHJvZmlsZUZyb21TdHJlYW1USFIoTlVMTCwgSUNDUHJvZmlsZSwgc0FjY2Vzcyk7Cit9CisKKworLy8gT3BlbiBmcm9tIG1lbW9yeSBibG9jaworY21zSFBST0ZJTEUgQ01TRVhQT1JUIGNtc09wZW5Qcm9maWxlRnJvbU1lbVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3Qgdm9pZCogTWVtUHRyLCBjbXNVSW50MzJOdW1iZXIgZHdTaXplKQoreworICAgIF9jbXNJQ0NQUk9GSUxFKiBOZXdJY2M7CisgICAgY21zSFBST0ZJTEUgaEVtcHR5OworCisgICAgaEVtcHR5ID0gY21zQ3JlYXRlUHJvZmlsZVBsYWNlaG9sZGVyKENvbnRleHRJRCk7CisgICAgaWYgKGhFbXB0eSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIE5ld0ljYyA9IChfY21zSUNDUFJPRklMRSopIGhFbXB0eTsKKworICAgIC8vIE9rLCBpbiB0aGlzIGNhc2UgY29uc3Qgdm9pZCogaXMgY2FzdGVkIHRvIHZvaWQqIGp1c3QgYmVjYXVzZSBvcGVuIElPIGhhbmRsZXIKKyAgICAvLyBzaGFyZXMgcmVhZCBhbmQgd3JpdHRpbmcgbW9kZXMuIERvbid0IGFidXNlIHRoaXMgZmVhdHVyZSEKKyAgICBOZXdJY2MgLT5JT2hhbmRsZXIgPSBjbXNPcGVuSU9oYW5kbGVyRnJvbU1lbShDb250ZXh0SUQsICh2b2lkKikgTWVtUHRyLCBkd1NpemUsICJyIik7CisgICAgaWYgKE5ld0ljYyAtPklPaGFuZGxlciA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgaWYgKCFfY21zUmVhZEhlYWRlcihOZXdJY2MpKSBnb3RvIEVycm9yOworCisgICAgcmV0dXJuIGhFbXB0eTsKKworRXJyb3I6CisgICAgY21zQ2xvc2VQcm9maWxlKGhFbXB0eSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2Ntc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNPcGVuUHJvZmlsZUZyb21NZW0oY29uc3Qgdm9pZCogTWVtUHRyLCBjbXNVSW50MzJOdW1iZXIgZHdTaXplKQoreworICAgIHJldHVybiBjbXNPcGVuUHJvZmlsZUZyb21NZW1USFIoTlVMTCwgTWVtUHRyLCBkd1NpemUpOworfQorCisKKworLy8gRHVtcCB0YWcgY29udGVudHMuIElmIHRoZSBwcm9maWxlIGlzIGJlaW5nIG1vZGlmaWVkLCB1bnRvdWNoZWQgdGFncyBhcmUgY29waWVkIGZyb20gRmlsZU9yaWcKK3N0YXRpYworY21zQm9vbCBTYXZlVGFncyhfY21zSUNDUFJPRklMRSogSWNjLCBfY21zSUNDUFJPRklMRSogRmlsZU9yaWcpCit7CisgICAgY21zVUludDhOdW1iZXIqIERhdGE7CisgICAgY21zVUludDMyTnVtYmVyIGk7CisgICAgY21zVUludDMyTnVtYmVyIEJlZ2luOworICAgIGNtc0lPSEFORExFUiogaW8gPSBJY2MgLT5JT2hhbmRsZXI7CisgICAgY21zVGFnRGVzY3JpcHRvciogVGFnRGVzY3JpcHRvcjsKKyAgICBjbXNUYWdUeXBlU2lnbmF0dXJlIFR5cGVCYXNlOworICAgIGNtc1RhZ1R5cGVTaWduYXR1cmUgVHlwZTsKKyAgICBjbXNUYWdUeXBlSGFuZGxlciogVHlwZUhhbmRsZXI7CisgICAgY21zRmxvYXQ2NE51bWJlciAgIFZlcnNpb24gPSBjbXNHZXRQcm9maWxlVmVyc2lvbigoY21zSFBST0ZJTEUpIEljYyk7CisgICAgY21zVGFnVHlwZUhhbmRsZXIgTG9jYWxUeXBlSGFuZGxlcjsKKworICAgIGZvciAoaT0wOyBpIDwgSWNjIC0+IFRhZ0NvdW50OyBpKyspIHsKKworICAgICAgICBpZiAoSWNjIC0+VGFnTmFtZXNbaV0gPT0gKGNtc1RhZ1NpZ25hdHVyZSkgMCkgY29udGludWU7CisKKyAgICAgICAgLy8gTGlua2VkIHRhZ3MgYXJlIG5vdCB3cml0dGVuCisgICAgICAgIGlmIChJY2MgLT5UYWdMaW5rZWRbaV0gIT0gKGNtc1RhZ1NpZ25hdHVyZSkgMCkgY29udGludWU7CisKKyAgICAgICAgSWNjIC0+IFRhZ09mZnNldHNbaV0gPSBCZWdpbiA9IGlvIC0+VXNlZFNwYWNlOworCisgICAgICAgIERhdGEgPSAoY21zVUludDhOdW1iZXIqKSAgSWNjIC0+IFRhZ1B0cnNbaV07CisKKyAgICAgICAgaWYgKCFEYXRhKSB7CisKKyAgICAgICAgICAgIC8vIFJlYWNoIGhlcmUgaWYgd2UgYXJlIGNvcHlpbmcgYSB0YWcgZnJvbSBhIGRpc2stYmFzZWQgSUNDIHByb2ZpbGUgd2hpY2ggaGFzIG5vdCBiZWVuIG1vZGlmaWVkIGJ5IHVzZXIuCisgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UgYSBibGluZCBjb3B5IG9mIHRoZSBibG9jayBkYXRhIGlzIHBlcmZvcm1lZAorICAgICAgICAgICAgaWYgKEZpbGVPcmlnICE9IE5VTEwgJiYgSWNjIC0+IFRhZ09mZnNldHNbaV0pIHsKKworICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBUYWdTaXplICAgPSBGaWxlT3JpZyAtPiBUYWdTaXplc1tpXTsKKyAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgVGFnT2Zmc2V0ID0gRmlsZU9yaWcgLT4gVGFnT2Zmc2V0c1tpXTsKKyAgICAgICAgICAgICAgICB2b2lkKiBNZW07CisKKyAgICAgICAgICAgICAgICBpZiAoIUZpbGVPcmlnIC0+SU9oYW5kbGVyLT5TZWVrKEZpbGVPcmlnIC0+SU9oYW5kbGVyLCBUYWdPZmZzZXQpKSByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICAgICAgICBNZW0gPSBfY21zTWFsbG9jKEljYyAtPkNvbnRleHRJRCwgVGFnU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKE1lbSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgICAgICAgICBpZiAoRmlsZU9yaWcgLT5JT2hhbmRsZXItPlJlYWQoRmlsZU9yaWctPklPaGFuZGxlciwgTWVtLCBUYWdTaXplLCAxKSAhPSAxKSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgaWYgKCFpbyAtPldyaXRlKGlvLCBUYWdTaXplLCBNZW0pKSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgX2Ntc0ZyZWUoSWNjIC0+Q29udGV4dElELCBNZW0pOworCisgICAgICAgICAgICAgICAgSWNjIC0+IFRhZ1NpemVzW2ldID0gKGlvIC0+VXNlZFNwYWNlIC0gQmVnaW4pOworCisKKyAgICAgICAgICAgICAgICAvLyBBbGlnbiB0byAzMiBiaXQgYm91bmRhcnkuCisgICAgICAgICAgICAgICAgaWYgKCEgX2Ntc1dyaXRlQWxpZ25tZW50KGlvKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gU2hvdWxkIHRoaXMgdGFnIGJlIHNhdmVkIGFzIFJBVz8gSWYgc28sIHRhZ3NpemVzIHNob3VsZCBiZSBzcGVjaWZpZWQgaW4gYWR2YW5jZSAobm8gZnVydGhlciBjb29raW5nIGlzIGRvbmUpCisgICAgICAgIGlmIChJY2MgLT5UYWdTYXZlQXNSYXdbaV0pIHsKKworICAgICAgICAgICAgaWYgKGlvIC0+IFdyaXRlKGlvLCBJY2MgLT5UYWdTaXplc1tpXSwgRGF0YSkgIT0gMSkgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAvLyBTZWFyY2ggZm9yIHN1cHBvcnQgb24gdGhpcyB0YWcKKyAgICAgICAgICAgIFRhZ0Rlc2NyaXB0b3IgPSBfY21zR2V0VGFnRGVzY3JpcHRvcihJY2MtPiBDb250ZXh0SUQsIEljYyAtPiBUYWdOYW1lc1tpXSk7CisgICAgICAgICAgICBpZiAoVGFnRGVzY3JpcHRvciA9PSBOVUxMKSBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbnN1cHBvcnRlZCwgaWdub3JlIGl0CisgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKFRhZ0Rlc2NyaXB0b3IgLT5EZWNpZGVUeXBlICE9IE5VTEwpIHsKKworICAgICAgICAgICAgICAgIFR5cGUgPSBUYWdEZXNjcmlwdG9yIC0+RGVjaWRlVHlwZShWZXJzaW9uLCBEYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAgICAgVHlwZSA9IFRhZ0Rlc2NyaXB0b3IgLT5TdXBwb3J0ZWRUeXBlc1swXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVHlwZUhhbmRsZXIgPSAgX2Ntc0dldFRhZ1R5cGVIYW5kbGVyKEljYy0+Q29udGV4dElELCBUeXBlKTsKKworICAgICAgICAgICAgaWYgKFR5cGVIYW5kbGVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihJY2MgLT5Db250ZXh0SUQsIGNtc0VSUk9SX0lOVEVSTkFMLCAiKEludGVybmFsKSBubyBoYW5kbGVyIGZvciB0YWcgJXgiLCBJY2MgLT4gVGFnTmFtZXNbaV0pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBUeXBlQmFzZSA9IFR5cGVIYW5kbGVyIC0+U2lnbmF0dXJlOworICAgICAgICAgICAgaWYgKCFfY21zV3JpdGVUeXBlQmFzZShpbywgVHlwZUJhc2UpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgTG9jYWxUeXBlSGFuZGxlciA9ICpUeXBlSGFuZGxlcjsKKyAgICAgICAgICAgIExvY2FsVHlwZUhhbmRsZXIuQ29udGV4dElEICA9IEljYyAtPkNvbnRleHRJRDsKKyAgICAgICAgICAgIExvY2FsVHlwZUhhbmRsZXIuSUNDVmVyc2lvbiA9IEljYyAtPlZlcnNpb247CisgICAgICAgICAgICBpZiAoIUxvY2FsVHlwZUhhbmRsZXIuV3JpdGVQdHIoJkxvY2FsVHlwZUhhbmRsZXIsIGlvLCBEYXRhLCBUYWdEZXNjcmlwdG9yIC0+RWxlbUNvdW50KSkgeworCisgICAgICAgICAgICAgICAgY2hhciBTdHJpbmdbNV07CisKKyAgICAgICAgICAgICAgICBfY21zVGFnU2lnbmF0dXJlMlN0cmluZyhTdHJpbmcsIChjbXNUYWdTaWduYXR1cmUpIFR5cGVCYXNlKTsKKyAgICAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihJY2MgLT5Db250ZXh0SUQsIGNtc0VSUk9SX1dSSVRFLCAiQ291bGRuJ3Qgd3JpdGUgdHlwZSAnJXMnIiwgU3RyaW5nKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIEljYyAtPiBUYWdTaXplc1tpXSA9IChpbyAtPlVzZWRTcGFjZSAtIEJlZ2luKTsKKworICAgICAgICAvLyBBbGlnbiB0byAzMiBiaXQgYm91bmRhcnkuCisgICAgICAgIGlmICghIF9jbXNXcml0ZUFsaWdubWVudChpbykpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLyBGaWxsIHRoZSBvZmZzZXQgYW5kIHNpemUgZmllbGRzIGZvciBhbGwgbGlua2VkIHRhZ3MKK3N0YXRpYworY21zQm9vbCBTZXRMaW5rcyggX2Ntc0lDQ1BST0ZJTEUqIEljYykKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgaTsKKworICAgIGZvciAoaT0wOyBpIDwgSWNjIC0+IFRhZ0NvdW50OyBpKyspIHsKKworICAgICAgICBjbXNUYWdTaWduYXR1cmUgbG5rID0gSWNjIC0+VGFnTGlua2VkW2ldOworICAgICAgICBpZiAobG5rICE9IChjbXNUYWdTaWduYXR1cmUpIDApIHsKKworICAgICAgICAgICAgaW50IGogPSBfY21zU2VhcmNoVGFnKEljYywgbG5rLCBGQUxTRSk7CisgICAgICAgICAgICBpZiAoaiA+PSAwKSB7CisKKyAgICAgICAgICAgICAgICBJY2MgLT5UYWdPZmZzZXRzW2ldID0gSWNjIC0+VGFnT2Zmc2V0c1tqXTsKKyAgICAgICAgICAgICAgICBJY2MgLT5UYWdTaXplc1tpXSAgID0gSWNjIC0+VGFnU2l6ZXNbal07CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvLyBMb3ctbGV2ZWwgc2F2ZSB0byBJT0hBTkRMRVIuIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB1c2VkIHRvCisvLyBzdG9yZSB0aGUgcHJvZmlsZSwgb3IgemVybyBvbiBlcnJvci4gaW8gbWF5IGJlIE5VTEwgYW5kIGluIHRoaXMgY2FzZQorLy8gbm8gZGF0YSBpcyB3cml0dGVuLS1vbmx5IHNpemVzIGFyZSBjYWxjdWxhdGVkCitjbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc1NhdmVQcm9maWxlVG9JT2hhbmRsZXIoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc0lPSEFORExFUiogaW8pCit7CisgICAgX2Ntc0lDQ1BST0ZJTEUqIEljYyA9IChfY21zSUNDUFJPRklMRSopIGhQcm9maWxlOworICAgIF9jbXNJQ0NQUk9GSUxFIEtlZXA7CisgICAgY21zSU9IQU5ETEVSKiBQcmV2SU8gPSBOVUxMOworICAgIGNtc1VJbnQzMk51bWJlciBVc2VkU3BhY2U7CisgICAgY21zQ29udGV4dCBDb250ZXh0SUQ7CisKKyAgICBfY21zQXNzZXJ0KGhQcm9maWxlICE9IE5VTEwpOworICAgIAorICAgIGlmICghX2Ntc0xvY2tNdXRleChJY2MtPkNvbnRleHRJRCwgSWNjLT5Vc3JNdXRleCkpIHJldHVybiAwOworICAgIG1lbW1vdmUoJktlZXAsIEljYywgc2l6ZW9mKF9jbXNJQ0NQUk9GSUxFKSk7CisKKyAgICBDb250ZXh0SUQgPSBjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKTsKKyAgICBQcmV2SU8gPSBJY2MgLT5JT2hhbmRsZXIgPSBjbXNPcGVuSU9oYW5kbGVyRnJvbU5VTEwoQ29udGV4dElEKTsKKyAgICBpZiAoUHJldklPID09IE5VTEwpIHsKKyAgICAgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MtPlVzck11dGV4KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gUGFzcyAjMSBkb2VzIGNvbXB1dGUgb2Zmc2V0cworCisgICAgaWYgKCFfY21zV3JpdGVIZWFkZXIoSWNjLCAwKSkgZ290byBFcnJvcjsKKyAgICBpZiAoIVNhdmVUYWdzKEljYywgJktlZXApKSBnb3RvIEVycm9yOworCisgICAgVXNlZFNwYWNlID0gUHJldklPIC0+VXNlZFNwYWNlOworCisgICAgLy8gUGFzcyAjMiBkb2VzIHNhdmUgdG8gaW9oYW5kbGVyCisKKyAgICBpZiAoaW8gIT0gTlVMTCkgeworCisgICAgICAgIEljYyAtPklPaGFuZGxlciA9IGlvOworICAgICAgICBpZiAoIVNldExpbmtzKEljYykpIGdvdG8gRXJyb3I7CisgICAgICAgIGlmICghX2Ntc1dyaXRlSGVhZGVyKEljYywgVXNlZFNwYWNlKSkgZ290byBFcnJvcjsKKyAgICAgICAgaWYgKCFTYXZlVGFncyhJY2MsICZLZWVwKSkgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICBtZW1tb3ZlKEljYywgJktlZXAsIHNpemVvZihfY21zSUNDUFJPRklMRSkpOworICAgIGlmICghY21zQ2xvc2VJT2hhbmRsZXIoUHJldklPKSkgCisgICAgICAgIFVzZWRTcGFjZSA9IDA7IC8vIEFzIGEgZXJyb3IgbWFya2VyCisKKyAgICBfY21zVW5sb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYy0+VXNyTXV0ZXgpOworCisgICAgcmV0dXJuIFVzZWRTcGFjZTsKKworCitFcnJvcjoKKyAgICBjbXNDbG9zZUlPaGFuZGxlcihQcmV2SU8pOworICAgIG1lbW1vdmUoSWNjLCAmS2VlcCwgc2l6ZW9mKF9jbXNJQ0NQUk9GSUxFKSk7CisgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MtPlVzck11dGV4KTsKKworICAgIHJldHVybiAwOworfQorCisjaWZkZWYgX1dJTjMyX1dDRQoraW50IHdjZWV4X3VubGluayhjb25zdCBjaGFyICpmaWxlbmFtZSk7CisjaWZuZGVmIHJlbW92ZQorIyAgIGRlZmluZSByZW1vdmUgd2NlZXhfdW5saW5rCisjZW5kaWYKKyNlbmRpZgorCisvLyBMb3ctbGV2ZWwgc2F2ZSB0byBkaXNrLgorY21zQm9vbCAgQ01TRVhQT1JUIGNtc1NhdmVQcm9maWxlVG9GaWxlKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjb25zdCBjaGFyKiBGaWxlTmFtZSkKK3sKKyAgICBjbXNDb250ZXh0IENvbnRleHRJRCA9IGNtc0dldFByb2ZpbGVDb250ZXh0SUQoaFByb2ZpbGUpOworICAgIGNtc0lPSEFORExFUiogaW8gPSBjbXNPcGVuSU9oYW5kbGVyRnJvbUZpbGUoQ29udGV4dElELCBGaWxlTmFtZSwgInciKTsKKyAgICBjbXNCb29sIHJjOworCisgICAgaWYgKGlvID09IE5VTEwpIHJldHVybiBGQUxTRTsKKworICAgIHJjID0gKGNtc1NhdmVQcm9maWxlVG9JT2hhbmRsZXIoaFByb2ZpbGUsIGlvKSAhPSAwKTsKKyAgICByYyAmPSBjbXNDbG9zZUlPaGFuZGxlcihpbyk7CisKKyAgICBpZiAocmMgPT0gRkFMU0UpIHsgICAgICAgICAgLy8gcmVtb3ZlKCkgaXMgQzk5IHBlciA3LjE5LjQuMQorICAgICAgICAgICAgcmVtb3ZlKEZpbGVOYW1lKTsgICAvLyBXZSBoYXZlIHRvIElHTk9SRSByZXR1cm4gdmFsdWUgaW4gdGhpcyBjYXNlCisgICAgfQorICAgIHJldHVybiByYzsKK30KKworLy8gU2FtZSBhcyBhbnRlcmlvciwgYnV0IGZvciBzdHJlYW1zCitjbXNCb29sIENNU0VYUE9SVCBjbXNTYXZlUHJvZmlsZVRvU3RyZWFtKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBGSUxFKiBTdHJlYW0pCit7CisgICAgY21zQm9vbCByYzsKKyAgICBjbXNDb250ZXh0IENvbnRleHRJRCA9IGNtc0dldFByb2ZpbGVDb250ZXh0SUQoaFByb2ZpbGUpOworICAgIGNtc0lPSEFORExFUiogaW8gPSBjbXNPcGVuSU9oYW5kbGVyRnJvbVN0cmVhbShDb250ZXh0SUQsIFN0cmVhbSk7CisKKyAgICBpZiAoaW8gPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworCisgICAgcmMgPSAoY21zU2F2ZVByb2ZpbGVUb0lPaGFuZGxlcihoUHJvZmlsZSwgaW8pICE9IDApOworICAgIHJjICY9IGNtc0Nsb3NlSU9oYW5kbGVyKGlvKTsKKworICAgIHJldHVybiByYzsKK30KKworCisvLyBTYW1lIGFzIGFudGVyaW9yLCBidXQgZm9yIG1lbW9yeSBibG9ja3MuIEluIHRoaXMgY2FzZSwgYSBOVUxMIGFzIE1lbVB0ciBtZWFucyBjYWxjdWxhdGUgbmVlZGVkIHNwYWNlIG9ubHkKK2Ntc0Jvb2wgQ01TRVhQT1JUIGNtc1NhdmVQcm9maWxlVG9NZW0oY21zSFBST0ZJTEUgaFByb2ZpbGUsIHZvaWQgKk1lbVB0ciwgY21zVUludDMyTnVtYmVyKiBCeXRlc05lZWRlZCkKK3sKKyAgICBjbXNCb29sIHJjOworICAgIGNtc0lPSEFORExFUiogaW87CisgICAgY21zQ29udGV4dCBDb250ZXh0SUQgPSBjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKTsKKworICAgIF9jbXNBc3NlcnQoQnl0ZXNOZWVkZWQgIT0gTlVMTCk7CisKKyAgICAvLyBTaG91bGQgd2UganVzdCBjYWxjdWxhdGUgdGhlIG5lZWRlZCBzcGFjZT8KKyAgICBpZiAoTWVtUHRyID09IE5VTEwpIHsKKworICAgICAgICAgICAqQnl0ZXNOZWVkZWQgPSAgY21zU2F2ZVByb2ZpbGVUb0lPaGFuZGxlcihoUHJvZmlsZSwgTlVMTCk7CisgICAgICAgICAgICByZXR1cm4gKCpCeXRlc05lZWRlZCA9PSAwKSA/IEZBTFNFIDogVFJVRTsKKyAgICB9CisKKyAgICAvLyBUaGF0IGlzIGEgcmVhbCB3cml0ZSBvcGVyYXRpb24KKyAgICBpbyA9ICBjbXNPcGVuSU9oYW5kbGVyRnJvbU1lbShDb250ZXh0SUQsIE1lbVB0ciwgKkJ5dGVzTmVlZGVkLCAidyIpOworICAgIGlmIChpbyA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICByYyA9IChjbXNTYXZlUHJvZmlsZVRvSU9oYW5kbGVyKGhQcm9maWxlLCBpbykgIT0gMCk7CisgICAgcmMgJj0gY21zQ2xvc2VJT2hhbmRsZXIoaW8pOworCisgICAgcmV0dXJuIHJjOworfQorCisKKworLy8gQ2xvc2VzIGEgcHJvZmlsZSBmcmVlaW5nIGFueSBpbnZvbHZlZCByZXNvdXJjZXMKK2Ntc0Jvb2wgIENNU0VYUE9SVCBjbXNDbG9zZVByb2ZpbGUoY21zSFBST0ZJTEUgaFByb2ZpbGUpCit7CisgICAgX2Ntc0lDQ1BST0ZJTEUqIEljYyA9IChfY21zSUNDUFJPRklMRSopIGhQcm9maWxlOworICAgIGNtc0Jvb2wgIHJjID0gVFJVRTsKKyAgICBjbXNVSW50MzJOdW1iZXIgaTsKKworICAgIGlmICghSWNjKSByZXR1cm4gRkFMU0U7CisKKyAgICAvLyBXYXMgb3BlbiBpbiB3cml0ZSBtb2RlPworICAgIGlmIChJY2MgLT5Jc1dyaXRlKSB7CisKKyAgICAgICAgSWNjIC0+SXNXcml0ZSA9IEZBTFNFOyAgICAgIC8vIEFzc3VyZSBubyBmdXJ0aGVyIHdyaXR0aW5nCisgICAgICAgIHJjICY9IGNtc1NhdmVQcm9maWxlVG9GaWxlKGhQcm9maWxlLCBJY2MgLT5JT2hhbmRsZXItPlBoeXNpY2FsRmlsZSk7CisgICAgfQorCisgICAgZm9yIChpPTA7IGkgPCBJY2MgLT4gVGFnQ291bnQ7IGkrKykgeworCisgICAgICAgIGlmIChJY2MgLT4gVGFnUHRyc1tpXSkgeworCisgICAgICAgICAgICBjbXNUYWdUeXBlSGFuZGxlciogVHlwZUhhbmRsZXIgPSBJY2MgLT5UYWdUeXBlSGFuZGxlcnNbaV07CisKKyAgICAgICAgICAgIGlmIChUeXBlSGFuZGxlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY21zVGFnVHlwZUhhbmRsZXIgTG9jYWxUeXBlSGFuZGxlciA9ICpUeXBlSGFuZGxlcjsKKworICAgICAgICAgICAgICAgIExvY2FsVHlwZUhhbmRsZXIuQ29udGV4dElEID0gSWNjIC0+Q29udGV4dElEOyAgICAgICAgICAgICAgLy8gQXMgYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgTG9jYWxUeXBlSGFuZGxlci5JQ0NWZXJzaW9uID0gSWNjIC0+VmVyc2lvbjsKKyAgICAgICAgICAgICAgICBMb2NhbFR5cGVIYW5kbGVyLkZyZWVQdHIoJkxvY2FsVHlwZUhhbmRsZXIsIEljYyAtPiBUYWdQdHJzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBfY21zRnJlZShJY2MgLT5Db250ZXh0SUQsIEljYyAtPlRhZ1B0cnNbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKEljYyAtPklPaGFuZGxlciAhPSBOVUxMKSB7CisgICAgICAgIHJjICY9IGNtc0Nsb3NlSU9oYW5kbGVyKEljYy0+SU9oYW5kbGVyKTsKKyAgICB9CisKKyAgICBfY21zRGVzdHJveU11dGV4KEljYy0+Q29udGV4dElELCBJY2MtPlVzck11dGV4KTsKKworICAgIF9jbXNGcmVlKEljYyAtPkNvbnRleHRJRCwgSWNjKTsgICAvLyBGcmVlIHBsYWNlaG9sZGVyIG1lbW9yeQorCisgICAgcmV0dXJuIHJjOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisvLyBSZXR1cm5zIFRSVUUgaWYgYSBnaXZlbiB0YWcgaXMgc3VwcG9ydGVkIGJ5IGEgcGx1Zy1pbgorc3RhdGljCitjbXNCb29sIElzVHlwZVN1cHBvcnRlZChjbXNUYWdEZXNjcmlwdG9yKiBUYWdEZXNjcmlwdG9yLCBjbXNUYWdUeXBlU2lnbmF0dXJlIFR5cGUpCit7CisgICAgY21zVUludDMyTnVtYmVyIGksIG5NYXhUeXBlczsKKworICAgIG5NYXhUeXBlcyA9IFRhZ0Rlc2NyaXB0b3ItPm5TdXBwb3J0ZWRUeXBlczsKKyAgICBpZiAobk1heFR5cGVzID49IE1BWF9UWVBFU19JTl9MQ01TX1BMVUdJTikKKyAgICAgICAgbk1heFR5cGVzID0gTUFYX1RZUEVTX0lOX0xDTVNfUExVR0lOOworCisgICAgZm9yIChpPTA7IGkgPCBuTWF4VHlwZXM7IGkrKykgeworICAgICAgICBpZiAoVHlwZSA9PSBUYWdEZXNjcmlwdG9yIC0+U3VwcG9ydGVkVHlwZXNbaV0pIHJldHVybiBUUlVFOworICAgIH0KKworICAgIHJldHVybiBGQUxTRTsKK30KKworCisvLyBUaGF0J3MgdGhlIG1haW4gcmVhZCBmdW5jdGlvbgordm9pZCogQ01TRVhQT1JUIGNtc1JlYWRUYWcoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1RhZ1NpZ25hdHVyZSBzaWcpCit7CisgICAgX2Ntc0lDQ1BST0ZJTEUqIEljYyA9IChfY21zSUNDUFJPRklMRSopIGhQcm9maWxlOworICAgIGNtc0lPSEFORExFUiogaW8gPSBJY2MgLT5JT2hhbmRsZXI7CisgICAgY21zVGFnVHlwZUhhbmRsZXIqIFR5cGVIYW5kbGVyOworICAgIGNtc1RhZ1R5cGVIYW5kbGVyIExvY2FsVHlwZUhhbmRsZXI7CisgICAgY21zVGFnRGVzY3JpcHRvciogIFRhZ0Rlc2NyaXB0b3I7CisgICAgY21zVGFnVHlwZVNpZ25hdHVyZSBCYXNlVHlwZTsKKyAgICBjbXNVSW50MzJOdW1iZXIgT2Zmc2V0LCBUYWdTaXplOworICAgIGNtc1VJbnQzMk51bWJlciBFbGVtQ291bnQ7CisgICAgaW50IG47CisKKyAgICBpZiAoIV9jbXNMb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KSkgcmV0dXJuIE5VTEw7CisKKyAgICBuID0gX2Ntc1NlYXJjaFRhZyhJY2MsIHNpZywgVFJVRSk7CisgICAgaWYgKG4gPCAwKSBnb3RvIEVycm9yOyAgICAgICAgICAgICAgIC8vIE5vdCBmb3VuZCwgcmV0dXJuIE5VTEwKKworCisgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBpbiBtZW1vcnksIHJldHVybiB0aGUgcG9pbnRlcgorICAgIGlmIChJY2MgLT4gVGFnUHRyc1tuXSkgeworCisgICAgICAgIGlmIChJY2MtPlRhZ1R5cGVIYW5kbGVyc1tuXSA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgICAgIC8vIFNhbml0eSBjaGVjaworICAgICAgICBCYXNlVHlwZSA9IEljYy0+VGFnVHlwZUhhbmRsZXJzW25dLT5TaWduYXR1cmU7CisgICAgICAgIGlmIChCYXNlVHlwZSA9PSAwKSBnb3RvIEVycm9yOworCisgICAgICAgIFRhZ0Rlc2NyaXB0b3IgPSBfY21zR2V0VGFnRGVzY3JpcHRvcihJY2MtPkNvbnRleHRJRCwgc2lnKTsKKyAgICAgICAgaWYgKFRhZ0Rlc2NyaXB0b3IgPT0gTlVMTCkgZ290byBFcnJvcjsKKworICAgICAgICBpZiAoIUlzVHlwZVN1cHBvcnRlZChUYWdEZXNjcmlwdG9yLCBCYXNlVHlwZSkpIGdvdG8gRXJyb3I7CisKKyAgICAgICAgaWYgKEljYyAtPlRhZ1NhdmVBc1Jhd1tuXSkgZ290byBFcnJvcjsgIC8vIFdlIGRvbid0IHN1cHBvcnQgcmVhZCByYXcgdGFncyBhcyBjb29rZWQKKworICAgICAgICBfY21zVW5sb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KTsKKyAgICAgICAgcmV0dXJuIEljYyAtPiBUYWdQdHJzW25dOworICAgIH0KKworICAgIC8vIFdlIG5lZWQgdG8gcmVhZCBpdC4gR2V0IHRoZSBvZmZzZXQgYW5kIHNpemUgdG8gdGhlIGZpbGUKKyAgICBPZmZzZXQgICAgPSBJY2MgLT4gVGFnT2Zmc2V0c1tuXTsKKyAgICBUYWdTaXplICAgPSBJY2MgLT4gVGFnU2l6ZXNbbl07CisKKyAgICAvLyBTZWVrIHRvIGl0cyBsb2NhdGlvbgorICAgIGlmICghaW8gLT4gU2VlayhpbywgT2Zmc2V0KSkKKyAgICAgICAgZ290byBFcnJvcjsKKworICAgIC8vIFNlYXJjaCBmb3Igc3VwcG9ydCBvbiB0aGlzIHRhZworICAgIFRhZ0Rlc2NyaXB0b3IgPSBfY21zR2V0VGFnRGVzY3JpcHRvcihJY2MtPiBDb250ZXh0SUQsIHNpZyk7CisgICAgaWYgKFRhZ0Rlc2NyaXB0b3IgPT0gTlVMTCkgeworCisgICAgICAgIGNoYXIgU3RyaW5nWzVdOworCisgICAgICAgIF9jbXNUYWdTaWduYXR1cmUyU3RyaW5nKFN0cmluZywgc2lnKTsKKworICAgICAgICAvLyBBbiB1bmtub3duIGVsZW1lbnQgd2FzIGZvdW5kLgorICAgICAgICBjbXNTaWduYWxFcnJvcihJY2MgLT5Db250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5rbm93biB0YWcgdHlwZSAnJXMnIGZvdW5kLiIsIFN0cmluZyk7CisgICAgICAgIGdvdG8gRXJyb3I7ICAgICAvLyBVbnN1cHBvcnRlZC4KKyAgICB9CisKKyAgICAvLyBpZiBzdXBwb3J0ZWQsIGdldCB0eXBlIGFuZCBjaGVjayBpZiBpbiBsaXN0CisgICAgQmFzZVR5cGUgPSBfY21zUmVhZFR5cGVCYXNlKGlvKTsKKyAgICBpZiAoQmFzZVR5cGUgPT0gMCkgZ290byBFcnJvcjsKKworICAgIGlmICghSXNUeXBlU3VwcG9ydGVkKFRhZ0Rlc2NyaXB0b3IsIEJhc2VUeXBlKSkgZ290byBFcnJvcjsKKworICAgIFRhZ1NpemUgIC09IDg7ICAgICAgICAgICAgICAgICAgICAgIC8vIEFscmVkeSByZWFkIGJ5IHRoZSB0eXBlIGJhc2UgbG9naWMKKworICAgIC8vIEdldCB0eXBlIGhhbmRsZXIKKyAgICBUeXBlSGFuZGxlciA9IF9jbXNHZXRUYWdUeXBlSGFuZGxlcihJY2MgLT5Db250ZXh0SUQsIEJhc2VUeXBlKTsKKyAgICBpZiAoVHlwZUhhbmRsZXIgPT0gTlVMTCkgZ290byBFcnJvcjsKKyAgICBMb2NhbFR5cGVIYW5kbGVyID0gKlR5cGVIYW5kbGVyOworCisKKyAgICAvLyBSZWFkIHRoZSB0YWcKKyAgICBJY2MgLT4gVGFnVHlwZUhhbmRsZXJzW25dID0gVHlwZUhhbmRsZXI7CisKKyAgICBMb2NhbFR5cGVIYW5kbGVyLkNvbnRleHRJRCA9IEljYyAtPkNvbnRleHRJRDsKKyAgICBMb2NhbFR5cGVIYW5kbGVyLklDQ1ZlcnNpb24gPSBJY2MgLT5WZXJzaW9uOworICAgIEljYyAtPiBUYWdQdHJzW25dID0gTG9jYWxUeXBlSGFuZGxlci5SZWFkUHRyKCZMb2NhbFR5cGVIYW5kbGVyLCBpbywgJkVsZW1Db3VudCwgVGFnU2l6ZSk7CisKKyAgICAvLyBUaGUgdGFnIHR5cGUgaXMgc3VwcG9ydGVkLCBidXQgc29tZXRoaW5nIHdyb25nIGhhcHBlbmVkIGFuZCB3ZSBjYW5ub3QgcmVhZCB0aGUgdGFnLgorICAgIC8vIGxldCBrbm93IHRoZSB1c2VyIGFib3V0IHRoaXMgKGFsdGhvdWdoIGl0IGlzIGp1c3QgYSB3YXJuaW5nKQorICAgIGlmIChJY2MgLT4gVGFnUHRyc1tuXSA9PSBOVUxMKSB7CisKKyAgICAgICAgY2hhciBTdHJpbmdbNV07CisKKyAgICAgICAgX2Ntc1RhZ1NpZ25hdHVyZTJTdHJpbmcoU3RyaW5nLCBzaWcpOworICAgICAgICBjbXNTaWduYWxFcnJvcihJY2MgLT5Db250ZXh0SUQsIGNtc0VSUk9SX0NPUlJVUFRJT05fREVURUNURUQsICJDb3JydXB0ZWQgdGFnICclcyciLCBTdHJpbmcpOworICAgICAgICBnb3RvIEVycm9yOworICAgIH0KKworICAgIC8vIFRoaXMgaXMgYSB3ZWlyZCBlcnJvciB0aGF0IG1heSBiZSBhIHN5bXB0b20gb2Ygc29tZXRoaW5nIG1vcmUgc2VyaW91cywgdGhlIG51bWJlciBvZgorICAgIC8vIHN0b3JlZCBpdGVtIGlzIGFjdHVhbGx5IGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHJlcXVpcmVkIGVsZW1lbnRzLgorICAgIGlmIChFbGVtQ291bnQgPCBUYWdEZXNjcmlwdG9yIC0+RWxlbUNvdW50KSB7CisKKyAgICAgICAgY2hhciBTdHJpbmdbNV07CisKKyAgICAgICAgX2Ntc1RhZ1NpZ25hdHVyZTJTdHJpbmcoU3RyaW5nLCBzaWcpOworICAgICAgICBjbXNTaWduYWxFcnJvcihJY2MgLT5Db250ZXh0SUQsIGNtc0VSUk9SX0NPUlJVUFRJT05fREVURUNURUQsICInJXMnIEluY29uc2lzdGVudCBudW1iZXIgb2YgaXRlbXM6IGV4cGVjdGVkICVkLCBnb3QgJWQiLAorICAgICAgICAgICAgU3RyaW5nLCBUYWdEZXNjcmlwdG9yIC0+RWxlbUNvdW50LCBFbGVtQ291bnQpOworICAgIH0KKworCisgICAgLy8gUmV0dXJuIHRoZSBkYXRhCisgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7CisgICAgcmV0dXJuIEljYyAtPiBUYWdQdHJzW25dOworCisKKyAgICAvLyBSZXR1cm4gZXJyb3IgYW5kIHVubG9jayB0aGEgZGF0YQorRXJyb3I6CisgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLy8gR2V0IHRydWUgdHlwZSBvZiBkYXRhCitjbXNUYWdUeXBlU2lnbmF0dXJlIF9jbXNHZXRUYWdUcnVlVHlwZShjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVGFnU2lnbmF0dXJlIHNpZykKK3sKKyAgICBfY21zSUNDUFJPRklMRSogSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7CisgICAgY21zVGFnVHlwZUhhbmRsZXIqIFR5cGVIYW5kbGVyOworICAgIGludCBuOworCisgICAgLy8gU2VhcmNoIGZvciBnaXZlbiB0YWcgaW4gSUNDIHByb2ZpbGUgZGlyZWN0b3J5CisgICAgbiA9IF9jbXNTZWFyY2hUYWcoSWNjLCBzaWcsIFRSVUUpOworICAgIGlmIChuIDwgMCkgcmV0dXJuIChjbXNUYWdUeXBlU2lnbmF0dXJlKSAwOyAgICAgICAgICAgICAgICAvLyBOb3QgZm91bmQsIHJldHVybiBOVUxMCisKKyAgICAvLyBHZXQgdGhlIGhhbmRsZXIuIFRoZSB0cnVlIHR5cGUgaXMgdGhlcmUKKyAgICBUeXBlSGFuZGxlciA9ICBJY2MgLT4gVGFnVHlwZUhhbmRsZXJzW25dOworICAgIHJldHVybiBUeXBlSGFuZGxlciAtPlNpZ25hdHVyZTsKK30KKworCisvLyBXcml0ZSBhIHNpbmdsZSB0YWcuIFRoaXMganVzdCBrZWVwcyB0cmFjayBvZiB0aGUgdGFrIGludG8gYSBsaXN0IG9mICJ0byBiZSB3cml0dGVuIi4gSWYgdGhlIHRhZyBpcyBhbHJlYWR5CisvLyBpbiB0aGF0IGxpc3QsIHRoZSBwcmV2aW91cyB2ZXJzaW9uIGlzIGRlbGV0ZWQuCitjbXNCb29sIENNU0VYUE9SVCBjbXNXcml0ZVRhZyhjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVGFnU2lnbmF0dXJlIHNpZywgY29uc3Qgdm9pZCogZGF0YSkKK3sKKyAgICBfY21zSUNDUFJPRklMRSogSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7CisgICAgY21zVGFnVHlwZUhhbmRsZXIqIFR5cGVIYW5kbGVyID0gTlVMTDsKKyAgICBjbXNUYWdUeXBlSGFuZGxlciBMb2NhbFR5cGVIYW5kbGVyOworICAgIGNtc1RhZ0Rlc2NyaXB0b3IqIFRhZ0Rlc2NyaXB0b3IgPSBOVUxMOworICAgIGNtc1RhZ1R5cGVTaWduYXR1cmUgVHlwZTsKKyAgICBpbnQgaTsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIFZlcnNpb247CisgICAgY2hhciBUeXBlU3RyaW5nWzVdLCBTaWdTdHJpbmdbNV07CisKKyAgICBpZiAoIV9jbXNMb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KSkgcmV0dXJuIEZBTFNFOworCisgICAgLy8gVG8gZGVsZXRlIHRhZ3MuCisgICAgaWYgKGRhdGEgPT0gTlVMTCkgeworCisgICAgICAgICAvLyBEZWxldGUgdGhlIHRhZworICAgICAgICAgaSA9IF9jbXNTZWFyY2hUYWcoSWNjLCBzaWcsIEZBTFNFKTsKKyAgICAgICAgIGlmIChpID49IDApIHsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAvLyBVc2UgemVybyBhcyBhIG1hcmsgb2YgZGVsZXRlZCAKKyAgICAgICAgICAgICBfY21zRGVsZXRlVGFnQnlQb3MoSWNjLCBpKTsKKyAgICAgICAgICAgICBJY2MgLT5UYWdOYW1lc1tpXSA9IChjbXNUYWdTaWduYXR1cmUpIDA7CisgICAgICAgICAgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7CisgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICB9CisgICAgICAgICAvLyBEaWRuJ3QgZmluZCB0aGUgdGFnCisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgaWYgKCFfY21zTmV3VGFnKEljYywgc2lnLCAmaSkpIGdvdG8gRXJyb3I7CisKKyAgICAvLyBUaGlzIGlzIG5vdCByYXcKKyAgICBJY2MgLT5UYWdTYXZlQXNSYXdbaV0gPSBGQUxTRTsKKworICAgIC8vIFRoaXMgaXMgbm90IGEgbGluaworICAgIEljYyAtPlRhZ0xpbmtlZFtpXSA9IChjbXNUYWdTaWduYXR1cmUpIDA7CisKKyAgICAvLyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFRBRy4KKyAgICBUYWdEZXNjcmlwdG9yID0gX2Ntc0dldFRhZ0Rlc2NyaXB0b3IoSWNjLT4gQ29udGV4dElELCBzaWcpOworICAgIGlmIChUYWdEZXNjcmlwdG9yID09IE5VTEwpeworICAgICAgICAgY21zU2lnbmFsRXJyb3IoSWNjIC0+Q29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVuc3VwcG9ydGVkIHRhZyAnJXgnIiwgc2lnKTsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICB9CisKKworICAgIC8vIE5vdyB3ZSBuZWVkIHRvIGtub3cgd2hpY2ggdHlwZSB0byB1c2UuIEl0IGRlcGVuZHMgb24gdGhlIHZlcnNpb24uCisgICAgVmVyc2lvbiA9IGNtc0dldFByb2ZpbGVWZXJzaW9uKGhQcm9maWxlKTsKKworICAgIGlmIChUYWdEZXNjcmlwdG9yIC0+RGVjaWRlVHlwZSAhPSBOVUxMKSB7CisKKyAgICAgICAgLy8gTGV0IHRoZSB0YWcgZGVzY3JpcHRvciB0byBkZWNpZGUgdGhlIHR5cGUgYmFzZSBvbiBkZXBlbmRpbmcgb24KKyAgICAgICAgLy8gdGhlIGRhdGEuIFRoaXMgaXMgdXNlZnVsIGZvciBleGFtcGxlIG9uIHBhcmFtZXRyaWMgY3VydmVzLCB3aGVyZQorICAgICAgICAvLyBjdXJ2ZXMgc3BlY2lmaWVkIGJ5IGEgdGFibGUgY2Fubm90IGJlIHNhdmVkIGFzIHBhcmFtZXRyaWMgYW5kIG5lZWRzCisgICAgICAgIC8vIHRvIGJlIGNhc3RlZCB0byBzaW5nbGUgdjItY3VydmVzLCBldmVuIG9uIHY0IHByb2ZpbGVzLgorCisgICAgICAgIFR5cGUgPSBUYWdEZXNjcmlwdG9yIC0+RGVjaWRlVHlwZShWZXJzaW9uLCBkYXRhKTsKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgVHlwZSA9IFRhZ0Rlc2NyaXB0b3IgLT5TdXBwb3J0ZWRUeXBlc1swXTsKKyAgICB9CisKKyAgICAvLyBEb2VzIHRoZSB0YWcgc3VwcG9ydCB0aGlzIHR5cGU/CisgICAgaWYgKCFJc1R5cGVTdXBwb3J0ZWQoVGFnRGVzY3JpcHRvciwgVHlwZSkpIHsKKworICAgICAgICBfY21zVGFnU2lnbmF0dXJlMlN0cmluZyhUeXBlU3RyaW5nLCAoY21zVGFnU2lnbmF0dXJlKSBUeXBlKTsKKyAgICAgICAgX2Ntc1RhZ1NpZ25hdHVyZTJTdHJpbmcoU2lnU3RyaW5nLCAgc2lnKTsKKworICAgICAgICBjbXNTaWduYWxFcnJvcihJY2MgLT5Db250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5zdXBwb3J0ZWQgdHlwZSAnJXMnIGZvciB0YWcgJyVzJyIsIFR5cGVTdHJpbmcsIFNpZ1N0cmluZyk7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgLy8gRG9lcyB3ZSBoYXZlIGEgaGFuZGxlciBmb3IgdGhpcyB0eXBlPworICAgIFR5cGVIYW5kbGVyID0gIF9jbXNHZXRUYWdUeXBlSGFuZGxlcihJY2MtPkNvbnRleHRJRCwgVHlwZSk7CisgICAgaWYgKFR5cGVIYW5kbGVyID09IE5VTEwpIHsKKworICAgICAgICBfY21zVGFnU2lnbmF0dXJlMlN0cmluZyhUeXBlU3RyaW5nLCAoY21zVGFnU2lnbmF0dXJlKSBUeXBlKTsKKyAgICAgICAgX2Ntc1RhZ1NpZ25hdHVyZTJTdHJpbmcoU2lnU3RyaW5nLCAgc2lnKTsKKworICAgICAgICBjbXNTaWduYWxFcnJvcihJY2MgLT5Db250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5zdXBwb3J0ZWQgdHlwZSAnJXMnIGZvciB0YWcgJyVzJyIsIFR5cGVTdHJpbmcsIFNpZ1N0cmluZyk7CisgICAgICAgIGdvdG8gRXJyb3I7ICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgfQorCisKKyAgICAvLyBGaWxsIGZpZWxkcyBvbiBpY2Mgc3RydWN0dXJlCisgICAgSWNjIC0+VGFnVHlwZUhhbmRsZXJzW2ldICA9IFR5cGVIYW5kbGVyOworICAgIEljYyAtPlRhZ05hbWVzW2ldICAgICAgICAgPSBzaWc7CisgICAgSWNjIC0+VGFnU2l6ZXNbaV0gICAgICAgICA9IDA7CisgICAgSWNjIC0+VGFnT2Zmc2V0c1tpXSAgICAgICA9IDA7CisKKyAgICBMb2NhbFR5cGVIYW5kbGVyID0gKlR5cGVIYW5kbGVyOworICAgIExvY2FsVHlwZUhhbmRsZXIuQ29udGV4dElEICA9IEljYyAtPkNvbnRleHRJRDsKKyAgICBMb2NhbFR5cGVIYW5kbGVyLklDQ1ZlcnNpb24gPSBJY2MgLT5WZXJzaW9uOworICAgIEljYyAtPlRhZ1B0cnNbaV0gICAgICAgICAgICA9IExvY2FsVHlwZUhhbmRsZXIuRHVwUHRyKCZMb2NhbFR5cGVIYW5kbGVyLCBkYXRhLCBUYWdEZXNjcmlwdG9yIC0+RWxlbUNvdW50KTsKKworICAgIGlmIChJY2MgLT5UYWdQdHJzW2ldID09IE5VTEwpICB7CisKKyAgICAgICAgX2Ntc1RhZ1NpZ25hdHVyZTJTdHJpbmcoVHlwZVN0cmluZywgKGNtc1RhZ1NpZ25hdHVyZSkgVHlwZSk7CisgICAgICAgIF9jbXNUYWdTaWduYXR1cmUyU3RyaW5nKFNpZ1N0cmluZywgIHNpZyk7CisgICAgICAgIGNtc1NpZ25hbEVycm9yKEljYyAtPkNvbnRleHRJRCwgY21zRVJST1JfQ09SUlVQVElPTl9ERVRFQ1RFRCwgIk1hbGZvcm1lZCBzdHJ1Y3QgaW4gdHlwZSAnJXMnIGZvciB0YWcgJyVzJyIsIFR5cGVTdHJpbmcsIFNpZ1N0cmluZyk7CisKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICBfY21zVW5sb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KTsKKyAgICByZXR1cm4gVFJVRTsKKworRXJyb3I6CisgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7CisgICAgcmV0dXJuIEZBTFNFOworCit9CisKKy8vIFJlYWQgYW5kIHdyaXRlIHJhdyBkYXRhLiBUaGUgb25seSB3YXkgdGhvc2UgZnVuY3Rpb24gd291bGQgd29yayBhbmQga2VlcCBjb25zaXN0ZW5jZSB3aXRoIG5vcm1hbCByZWFkIGFuZCB3cml0ZQorLy8gaXMgdG8gZG8gYW4gYWRkaXRpb25hbCBzdGVwIG9mIHNlcmlhbGl6YXRpb24uIFRoYXQgbWVhbnMsIHJlYWRSYXcgd291bGQgaXNzdWUgYSBub3JtYWwgcmVhZCBhbmQgdGhlbiBjb252ZXJ0IHRoZSBvYnRhaW5lZAorLy8gZGF0YSB0byByYXcgYnl0ZXMgYnkgdXNpbmcgdGhlICJ3cml0ZSIgc2VyaWFsaXphdGlvbiBsb2dpYy4gQW5kIHZpY2UtdmVyc2EuIEkga25vdyB0aGlzIG1heSBlbmQgaW4gc2l0dWF0aW9ucyB3aGVyZQorLy8gcmF3IGRhdGEgd3JpdHRlbiBkb2VzIG5vdCBleGFjdGx5IGNvcnJlc3BvbmQgd2l0aCB0aGUgcmF3IGRhdGEgcHJvcG9zZWQgdG8gY21zV3JpdGVSYXcgZGF0YSwgYnV0IHRoaXMgYXBwcm9hY2ggYWxsb3dzCisvLyB0byB3cml0ZSBhIHRhZyBhcyByYXcgZGF0YSBhbmQgdGhlIHJlYWQgaXQgYXMgaGFuZGxlZC4KKworY21zSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc1JlYWRSYXdUYWcoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1RhZ1NpZ25hdHVyZSBzaWcsIHZvaWQqIGRhdGEsIGNtc1VJbnQzMk51bWJlciBCdWZmZXJTaXplKQoreworICAgIF9jbXNJQ0NQUk9GSUxFKiBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKKyAgICB2b2lkICpPYmplY3Q7CisgICAgaW50IGk7CisgICAgY21zSU9IQU5ETEVSKiBNZW1JTzsKKyAgICBjbXNUYWdUeXBlSGFuZGxlciogVHlwZUhhbmRsZXIgPSBOVUxMOworICAgIGNtc1RhZ1R5cGVIYW5kbGVyIExvY2FsVHlwZUhhbmRsZXI7CisgICAgY21zVGFnRGVzY3JpcHRvciogVGFnRGVzY3JpcHRvciA9IE5VTEw7CisgICAgY21zVUludDMyTnVtYmVyIHJjOworICAgIGNtc1VJbnQzMk51bWJlciBPZmZzZXQsIFRhZ1NpemU7CisKKyAgICBpZiAoIV9jbXNMb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KSkgcmV0dXJuIDA7CisKKyAgICAvLyBTZWFyY2ggZm9yIGdpdmVuIHRhZyBpbiBJQ0MgcHJvZmlsZSBkaXJlY3RvcnkKKyAgICBpID0gX2Ntc1NlYXJjaFRhZyhJY2MsIHNpZywgVFJVRSk7CisgICAgaWYgKGkgPCAwKSBnb3RvIEVycm9yOyAgICAgICAgICAgICAgICAgLy8gTm90IGZvdW5kLCAKKworICAgIC8vIEl0IGlzIGFscmVhZHkgcmVhZD8KKyAgICBpZiAoSWNjIC0+IFRhZ1B0cnNbaV0gPT0gTlVMTCkgeworCisgICAgICAgIC8vIE5vIHlldCwgZ2V0IG9yaWdpbmFsIHBvc2l0aW9uCisgICAgICAgIE9mZnNldCAgID0gSWNjIC0+VGFnT2Zmc2V0c1tpXTsKKyAgICAgICAgVGFnU2l6ZSAgPSBJY2MgLT5UYWdTaXplc1tpXTsKKworICAgICAgICAvLyByZWFkIHRoZSBkYXRhIGRpcmVjdGx5LCBkb24ndCBrZWVwIGNvcHkKKyAgICAgICAgaWYgKGRhdGEgIT0gTlVMTCkgeworCisgICAgICAgICAgICBpZiAoQnVmZmVyU2l6ZSA8IFRhZ1NpemUpCisgICAgICAgICAgICAgICAgVGFnU2l6ZSA9IEJ1ZmZlclNpemU7CisKKyAgICAgICAgICAgIGlmICghSWNjIC0+SU9oYW5kbGVyIC0+U2VlayhJY2MgLT5JT2hhbmRsZXIsIE9mZnNldCkpIGdvdG8gRXJyb3I7CisgICAgICAgICAgICBpZiAoIUljYyAtPklPaGFuZGxlciAtPlJlYWQoSWNjIC0+SU9oYW5kbGVyLCBkYXRhLCAxLCBUYWdTaXplKSkgZ290byBFcnJvcjsKKworICAgICAgICAgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7CisgICAgICAgICAgICByZXR1cm4gVGFnU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIF9jbXNVbmxvY2tNdXRleChJY2MtPkNvbnRleHRJRCwgSWNjIC0+VXNyTXV0ZXgpOworICAgICAgICByZXR1cm4gSWNjIC0+VGFnU2l6ZXNbaV07CisgICAgfQorCisgICAgLy8gVGhlIGRhdGEgaGFzIGJlZW4gYWxyZWFkeSByZWFkLCBvciB3cml0dGVuLiBCdXQgd2FpdCEsIG1heWJlIHRoZSB1c2VyIGNob29zZWQgdG8gc2F2ZSBhcworICAgIC8vIHJhdyBkYXRhLiBJbiB0aGlzIGNhc2UsIHJldHVybiB0aGUgcmF3IGRhdGEgZGlyZWN0bHkKKyAgICBpZiAoSWNjIC0+VGFnU2F2ZUFzUmF3W2ldKSB7CisKKyAgICAgICAgaWYgKGRhdGEgIT0gTlVMTCkgIHsKKworICAgICAgICAgICAgVGFnU2l6ZSAgPSBJY2MgLT5UYWdTaXplc1tpXTsKKyAgICAgICAgICAgIGlmIChCdWZmZXJTaXplIDwgVGFnU2l6ZSkKKyAgICAgICAgICAgICAgICBUYWdTaXplID0gQnVmZmVyU2l6ZTsKKworICAgICAgICAgICAgbWVtbW92ZShkYXRhLCBJY2MgLT5UYWdQdHJzW2ldLCBUYWdTaXplKTsKKworICAgICAgICAgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7CisgICAgICAgICAgICByZXR1cm4gVGFnU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIF9jbXNVbmxvY2tNdXRleChJY2MtPkNvbnRleHRJRCwgSWNjIC0+VXNyTXV0ZXgpOworICAgICAgICByZXR1cm4gSWNjIC0+VGFnU2l6ZXNbaV07CisgICAgfQorCisgICAgLy8gQWxyZWFkeSByZWFkZWQsIG9yIHByZXZpb3VzbHkgc2V0IGJ5IGNtc1dyaXRlVGFnKCkuIFdlIG5lZWQgdG8gc2VyaWFsaXplIHRoYXQKKyAgICAvLyBkYXRhIHRvIHJhdyBpbiBvcmRlciB0byBtYWludGFpbiBjb25zaXN0ZW5jeS4KKworICAgIF9jbXNVbmxvY2tNdXRleChJY2MtPkNvbnRleHRJRCwgSWNjIC0+VXNyTXV0ZXgpOworICAgIE9iamVjdCA9IGNtc1JlYWRUYWcoaFByb2ZpbGUsIHNpZyk7CisgICAgaWYgKCFfY21zTG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCkpIHJldHVybiAwOworCisgICAgaWYgKE9iamVjdCA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgLy8gTm93IHdlIG5lZWQgdG8gc2VyaWFsaXplIHRvIGEgbWVtb3J5IGJsb2NrOiBqdXN0IHVzZSBhIG1lbW9yeSBpb2hhbmRsZXIKKworICAgIGlmIChkYXRhID09IE5VTEwpIHsKKyAgICAgICAgTWVtSU8gPSBjbXNPcGVuSU9oYW5kbGVyRnJvbU5VTEwoY21zR2V0UHJvZmlsZUNvbnRleHRJRChoUHJvZmlsZSkpOworICAgIH0gZWxzZXsKKyAgICAgICAgTWVtSU8gPSBjbXNPcGVuSU9oYW5kbGVyRnJvbU1lbShjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKSwgZGF0YSwgQnVmZmVyU2l6ZSwgInciKTsKKyAgICB9CisgICAgaWYgKE1lbUlPID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgICAvLyBPYnRhaW4gdHlwZSBoYW5kbGluZyBmb3IgdGhlIHRhZworICAgIFR5cGVIYW5kbGVyID0gSWNjIC0+VGFnVHlwZUhhbmRsZXJzW2ldOworICAgIFRhZ0Rlc2NyaXB0b3IgPSBfY21zR2V0VGFnRGVzY3JpcHRvcihJY2MtPiBDb250ZXh0SUQsIHNpZyk7CisgICAgaWYgKFRhZ0Rlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgICAgICBjbXNDbG9zZUlPaGFuZGxlcihNZW1JTyk7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIAorICAgIGlmIChUeXBlSGFuZGxlciA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgLy8gU2VyaWFsaXplCisgICAgTG9jYWxUeXBlSGFuZGxlciA9ICpUeXBlSGFuZGxlcjsKKyAgICBMb2NhbFR5cGVIYW5kbGVyLkNvbnRleHRJRCAgPSBJY2MgLT5Db250ZXh0SUQ7CisgICAgTG9jYWxUeXBlSGFuZGxlci5JQ0NWZXJzaW9uID0gSWNjIC0+VmVyc2lvbjsKKworICAgIGlmICghX2Ntc1dyaXRlVHlwZUJhc2UoTWVtSU8sIFR5cGVIYW5kbGVyIC0+U2lnbmF0dXJlKSkgeworICAgICAgICBjbXNDbG9zZUlPaGFuZGxlcihNZW1JTyk7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgaWYgKCFMb2NhbFR5cGVIYW5kbGVyLldyaXRlUHRyKCZMb2NhbFR5cGVIYW5kbGVyLCBNZW1JTywgT2JqZWN0LCBUYWdEZXNjcmlwdG9yIC0+RWxlbUNvdW50KSkgeworICAgICAgICBjbXNDbG9zZUlPaGFuZGxlcihNZW1JTyk7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgLy8gR2V0IFNpemUgYW5kIGNsb3NlCisgICAgcmMgPSBNZW1JTyAtPlRlbGwoTWVtSU8pOworICAgIGNtc0Nsb3NlSU9oYW5kbGVyKE1lbUlPKTsgICAgICAvLyBJZ25vcmUgcmV0dXJuIGNvZGUgdGhpcyB0aW1lCisKKyAgICBfY21zVW5sb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KTsKKyAgICByZXR1cm4gcmM7CisKK0Vycm9yOgorICAgIF9jbXNVbmxvY2tNdXRleChJY2MtPkNvbnRleHRJRCwgSWNjIC0+VXNyTXV0ZXgpOworICAgIHJldHVybiAwOworfQorCisvLyBTaW1pbGFyIHRvIHRoZSBhbnRlcmlvci4gVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gd3JpdGUgZGlyZWN0bHkgdG8gdGhlIElDQyBwcm9maWxlIGFueSBkYXRhLCB3aXRob3V0CisvLyBjaGVja2luZyBhbnl0aGluZy4gQXMgYSBydWxlLCBtaXhpbmcgUmF3IHdpdGggY29va2VkIGRvZXNuJ3Qgd29yaywgc28gd3JpdHRpbmcgYSB0YWcgYXMgcmF3IGFuZCB0aGVuIHJlYWRpbmcKKy8vIGl0IGFzIGNvb2tlZCB3aXRob3V0IHNlcmlhbGl6aW5nIGRvZXMgcmVzdWx0IGludG8gYW4gZXJyb3IuIElmIHRoYXQgaXMgd2hhdCB5b3Ugd2FudCwgeW91IHdpbGwgbmVlZCB0byBkdW1wCisvLyB0aGUgcHJvZmlsZSB0byBtZW1yeSBvciBkaXNrIGFuZCB0aGVuIHJlb3BlbiBpdC4KK2Ntc0Jvb2wgQ01TRVhQT1JUIGNtc1dyaXRlUmF3VGFnKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNUYWdTaWduYXR1cmUgc2lnLCBjb25zdCB2b2lkKiBkYXRhLCBjbXNVSW50MzJOdW1iZXIgU2l6ZSkKK3sKKyAgICBfY21zSUNDUFJPRklMRSogSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7CisgICAgaW50IGk7CisKKyAgICBpZiAoIV9jbXNMb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KSkgcmV0dXJuIDA7CisKKyAgICBpZiAoIV9jbXNOZXdUYWcoSWNjLCBzaWcsICZpKSkgeworICAgICAgICBfY21zVW5sb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KTsKKyAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvLyBNYXJrIHRoZSB0YWcgYXMgYmVpbmcgd3JpdHRlbiBhcyBSQVcKKyAgICBJY2MgLT5UYWdTYXZlQXNSYXdbaV0gPSBUUlVFOworICAgIEljYyAtPlRhZ05hbWVzW2ldICAgICA9IHNpZzsKKyAgICBJY2MgLT5UYWdMaW5rZWRbaV0gICAgPSAoY21zVGFnU2lnbmF0dXJlKSAwOworCisgICAgLy8gS2VlcCBhIGNvcHkgb2YgdGhlIGJsb2NrCisgICAgSWNjIC0+VGFnUHRyc1tpXSAgPSBfY21zRHVwTWVtKEljYyAtPkNvbnRleHRJRCwgZGF0YSwgU2l6ZSk7CisgICAgSWNjIC0+VGFnU2l6ZXNbaV0gPSBTaXplOworCisgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7CisKKyAgICBpZiAoSWNjLT5UYWdQdHJzW2ldID09IE5VTEwpIHsgICAgICAgICAgIAorICAgICAgICAgICBJY2MtPlRhZ05hbWVzW2ldID0gKGNtc1RhZ1NpZ25hdHVyZSkgMDsKKyAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gVXNpbmcgdGhpcyBmdW5jdGlvbiB5b3UgY2FuIGNvbGxhcHNlIHNldmVyYWwgdGFnIGVudHJpZXMgdG8gdGhlIHNhbWUgYmxvY2sgaW4gdGhlIHByb2ZpbGUKK2Ntc0Jvb2wgQ01TRVhQT1JUIGNtc0xpbmtUYWcoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1RhZ1NpZ25hdHVyZSBzaWcsIGNtc1RhZ1NpZ25hdHVyZSBkZXN0KQoreworICAgIF9jbXNJQ0NQUk9GSUxFKiBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKKyAgICBpbnQgaTsKKworICAgICBpZiAoIV9jbXNMb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KSkgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKCFfY21zTmV3VGFnKEljYywgc2lnLCAmaSkpIHsKKyAgICAgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvLyBLZWVwIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbgorICAgIEljYyAtPlRhZ1NhdmVBc1Jhd1tpXSA9IEZBTFNFOworICAgIEljYyAtPlRhZ05hbWVzW2ldICAgICA9IHNpZzsKKyAgICBJY2MgLT5UYWdMaW5rZWRbaV0gICAgPSBkZXN0OworCisgICAgSWNjIC0+VGFnUHRyc1tpXSAgICA9IE5VTEw7CisgICAgSWNjIC0+VGFnU2l6ZXNbaV0gICA9IDA7CisgICAgSWNjIC0+VGFnT2Zmc2V0c1tpXSA9IDA7CisKKyAgICBfY21zVW5sb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLyBSZXR1cm5zIHRoZSB0YWcgbGlua2VkIHRvIHNpZywgaW4gdGhlIGNhc2UgdHdvIHRhZ3MgYXJlIHNoYXJpbmcgc2FtZSByZXNvdXJjZQorY21zVGFnU2lnbmF0dXJlICBDTVNFWFBPUlQgY21zVGFnTGlua2VkVG8oY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1RhZ1NpZ25hdHVyZSBzaWcpCit7CisgICAgX2Ntc0lDQ1BST0ZJTEUqIEljYyA9IChfY21zSUNDUFJPRklMRSopIGhQcm9maWxlOworICAgIGludCBpOworCisgICAgLy8gU2VhcmNoIGZvciBnaXZlbiB0YWcgaW4gSUNDIHByb2ZpbGUgZGlyZWN0b3J5CisgICAgaSA9IF9jbXNTZWFyY2hUYWcoSWNjLCBzaWcsIEZBTFNFKTsKKyAgICBpZiAoaSA8IDApIHJldHVybiAoY21zVGFnU2lnbmF0dXJlKSAwOyAgICAgICAgICAgICAgICAgLy8gTm90IGZvdW5kLCByZXR1cm4gMAorCisgICAgcmV0dXJuIEljYyAtPiBUYWdMaW5rZWRbaV07Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNpbzEuYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2lvMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMTJhZTEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNpbzEuYwpAQCAtMCwwICsxLDEwMzMgQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8KKy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisvLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKKy8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisvLworLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKy8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorLy8KKy8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCisvLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQorLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisvLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKworI2luY2x1ZGUgImxjbXMyX2ludGVybmFsLmgiCisKKy8vIFJlYWQgdGFncyB1c2luZyBsb3ctbGV2ZWwgZnVuY3Rpb25zLCBwcm92aWRlcyBuZWNlc3NhcnkgZ2x1ZSBjb2RlIHRvIGFkYXB0IHZlcnNpb25zLCBldGMuCisKKy8vIExVVCB0YWdzCitzdGF0aWMgY29uc3QgY21zVGFnU2lnbmF0dXJlIERldmljZTJQQ1MxNltdICAgPSAge2Ntc1NpZ0FUb0IwVGFnLCAgICAgLy8gUGVyY2VwdHVhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNTaWdBVG9CMVRhZywgICAgIC8vIFJlbGF0aXZlIGNvbG9yaW1ldHJpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNTaWdBVG9CMlRhZywgICAgIC8vIFNhdHVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zU2lnQVRvQjFUYWcgfTsgICAvLyBBYnNvbHV0ZSBjb2xvcmltZXRyaWMKKworc3RhdGljIGNvbnN0IGNtc1RhZ1NpZ25hdHVyZSBEZXZpY2UyUENTRmxvYXRbXSA9IHtjbXNTaWdEVG9CMFRhZywgICAgIC8vIFBlcmNlcHR1YWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zU2lnRFRvQjFUYWcsICAgICAvLyBSZWxhdGl2ZSBjb2xvcmltZXRyaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zU2lnRFRvQjJUYWcsICAgICAvLyBTYXR1cmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1NpZ0RUb0IzVGFnIH07ICAgLy8gQWJzb2x1dGUgY29sb3JpbWV0cmljCisKK3N0YXRpYyBjb25zdCBjbXNUYWdTaWduYXR1cmUgUENTMkRldmljZTE2W10gICAgPSB7Y21zU2lnQlRvQTBUYWcsICAgICAvLyBQZXJjZXB0dWFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1NpZ0JUb0ExVGFnLCAgICAgLy8gUmVsYXRpdmUgY29sb3JpbWV0cmljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1NpZ0JUb0EyVGFnLCAgICAgLy8gU2F0dXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNTaWdCVG9BMVRhZyB9OyAgIC8vIEFic29sdXRlIGNvbG9yaW1ldHJpYworCitzdGF0aWMgY29uc3QgY21zVGFnU2lnbmF0dXJlIFBDUzJEZXZpY2VGbG9hdFtdID0ge2Ntc1NpZ0JUb0QwVGFnLCAgICAgLy8gUGVyY2VwdHVhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNTaWdCVG9EMVRhZywgICAgIC8vIFJlbGF0aXZlIGNvbG9yaW1ldHJpYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNTaWdCVG9EMlRhZywgICAgIC8vIFNhdHVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zU2lnQlRvRDNUYWcgfTsgICAvLyBBYnNvbHV0ZSBjb2xvcmltZXRyaWMKKworCisvLyBGYWN0b3JzIHRvIGNvbnZlcnQgZnJvbSAxLjE1IGZpeGVkIHBvaW50IHRvIDAuLjEuMCByYW5nZSBhbmQgdmljZS12ZXJzYQorI2RlZmluZSBJbnBBZGogICAoMS4wL01BWF9FTkNPREVBQkxFX1hZWikgICAgIC8vICg2NTUzNi4wLyg2NTUzNS4wKjIuMCkpCisjZGVmaW5lIE91dHBBZGogIChNQVhfRU5DT0RFQUJMRV9YWVopICAgICAgICAgLy8gKCgyLjAqNjU1MzUuMCkvNjU1MzYuMCkKKworLy8gU2V2ZXJhbCByZXNvdXJjZXMgZm9yIGdyYXkgY29udmVyc2lvbnMuCitzdGF0aWMgY29uc3QgY21zRmxvYXQ2NE51bWJlciBHcmF5SW5wdXRNYXRyaXhbXSA9IHsgKElucEFkaipjbXNENTBYKSwgIChJbnBBZGoqY21zRDUwWSksICAoSW5wQWRqKmNtc0Q1MFopIH07CitzdGF0aWMgY29uc3QgY21zRmxvYXQ2NE51bWJlciBPbmVUb1RocmVlSW5wdXRNYXRyaXhbXSA9IHsgMSwgMSwgMSB9Oworc3RhdGljIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIgUGlja1lNYXRyaXhbXSA9IHsgMCwgKE91dHBBZGoqY21zRDUwWSksIDAgfTsKK3N0YXRpYyBjb25zdCBjbXNGbG9hdDY0TnVtYmVyIFBpY2tMc3Rhck1hdHJpeFtdID0geyAxLCAwLCAwIH07CisKKy8vIEdldCBhIG1lZGlhIHdoaXRlIHBvaW50IGZpeGluZyBzb21lIGlzc3VlcyBmb3VuZCBpbiBjZXJ0YWluIG9sZCBwcm9maWxlcworY21zQm9vbCAgX2Ntc1JlYWRNZWRpYVdoaXRlUG9pbnQoY21zQ0lFWFlaKiBEZXN0LCBjbXNIUFJPRklMRSBoUHJvZmlsZSkKK3sKKyAgICBjbXNDSUVYWVoqIFRhZzsKKworICAgIF9jbXNBc3NlcnQoRGVzdCAhPSBOVUxMKTsKKworICAgIFRhZyA9IChjbXNDSUVYWVoqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCBjbXNTaWdNZWRpYVdoaXRlUG9pbnRUYWcpOworCisgICAgLy8gSWYgbm8gd3AsIHRha2UgRDUwCisgICAgaWYgKFRhZyA9PSBOVUxMKSB7CisgICAgICAgICpEZXN0ID0gKmNtc0Q1MF9YWVooKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgLy8gVjIgZGlzcGxheSBwcm9maWxlcyBzaG91bGQgZ2l2ZSBENTAKKyAgICBpZiAoY21zR2V0RW5jb2RlZElDQ3ZlcnNpb24oaFByb2ZpbGUpIDwgMHg0MDAwMDAwKSB7CisKKyAgICAgICAgaWYgKGNtc0dldERldmljZUNsYXNzKGhQcm9maWxlKSA9PSBjbXNTaWdEaXNwbGF5Q2xhc3MpIHsKKyAgICAgICAgICAgICpEZXN0ID0gKmNtc0Q1MF9YWVooKTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQWxsIHNlZW1zIG9rCisgICAgKkRlc3QgPSAqVGFnOworICAgIHJldHVybiBUUlVFOworfQorCisKKy8vIENocm9tYXRpYyBhZGFwdGF0aW9uIG1hdHJpeC4gRml4IHNvbWUgaXNzdWVzIGFzIHdlbGwKK2Ntc0Jvb2wgIF9jbXNSZWFkQ0hBRChjbXNNQVQzKiBEZXN0LCBjbXNIUFJPRklMRSBoUHJvZmlsZSkKK3sKKyAgICBjbXNNQVQzKiBUYWc7CisKKyAgICBfY21zQXNzZXJ0KERlc3QgIT0gTlVMTCk7CisKKyAgICBUYWcgPSAoY21zTUFUMyopIGNtc1JlYWRUYWcoaFByb2ZpbGUsIGNtc1NpZ0Nocm9tYXRpY0FkYXB0YXRpb25UYWcpOworCisgICAgaWYgKFRhZyAhPSBOVUxMKSB7CisgICAgICAgICpEZXN0ID0gKlRhZzsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgLy8gTm8gQ0hBRCBhdmFpbGFibGUsIGRlZmF1bHQgaXQgdG8gaWRlbnRpdHkKKyAgICBfY21zTUFUM2lkZW50aXR5KERlc3QpOworCisgICAgLy8gVjIgZGlzcGxheSBwcm9maWxlcyBzaG91bGQgZ2l2ZSBENTAKKyAgICBpZiAoY21zR2V0RW5jb2RlZElDQ3ZlcnNpb24oaFByb2ZpbGUpIDwgMHg0MDAwMDAwKSB7CisKKyAgICAgICAgaWYgKGNtc0dldERldmljZUNsYXNzKGhQcm9maWxlKSA9PSBjbXNTaWdEaXNwbGF5Q2xhc3MpIHsKKworICAgICAgICAgICAgY21zQ0lFWFlaKiBXaGl0ZSA9IChjbXNDSUVYWVoqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCBjbXNTaWdNZWRpYVdoaXRlUG9pbnRUYWcpOworCisgICAgICAgICAgICBpZiAoV2hpdGUgPT0gTlVMTCkgeworCisgICAgICAgICAgICAgICAgX2Ntc01BVDNpZGVudGl0eShEZXN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIF9jbXNBZGFwdGF0aW9uTWF0cml4KERlc3QsIE5VTEwsIFdoaXRlLCBjbXNENTBfWFlaKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLy8gQXV4aWxpYXJ5LCByZWFkIGNvbG9yYW50cyBhcyBhIE1BVDMgc3RydWN0dXJlLiBVc2VkIGJ5IGFueSBmdW5jdGlvbiB0aGF0IG5lZWRzIGEgbWF0cml4LXNoYXBlcgorc3RhdGljCitjbXNCb29sIFJlYWRJQ0NNYXRyaXhSR0IyWFlaKGNtc01BVDMqIHIsIGNtc0hQUk9GSUxFIGhQcm9maWxlKQoreworICAgIGNtc0NJRVhZWiAqUHRyUmVkLCAqUHRyR3JlZW4sICpQdHJCbHVlOworCisgICAgX2Ntc0Fzc2VydChyICE9IE5VTEwpOworCisgICAgUHRyUmVkICAgPSAoY21zQ0lFWFlaICopIGNtc1JlYWRUYWcoaFByb2ZpbGUsIGNtc1NpZ1JlZENvbG9yYW50VGFnKTsKKyAgICBQdHJHcmVlbiA9IChjbXNDSUVYWVogKikgY21zUmVhZFRhZyhoUHJvZmlsZSwgY21zU2lnR3JlZW5Db2xvcmFudFRhZyk7CisgICAgUHRyQmx1ZSAgPSAoY21zQ0lFWFlaICopIGNtc1JlYWRUYWcoaFByb2ZpbGUsIGNtc1NpZ0JsdWVDb2xvcmFudFRhZyk7CisKKyAgICBpZiAoUHRyUmVkID09IE5VTEwgfHwgUHRyR3JlZW4gPT0gTlVMTCB8fCBQdHJCbHVlID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIF9jbXNWRUMzaW5pdCgmciAtPiB2WzBdLCBQdHJSZWQgLT4gWCwgUHRyR3JlZW4gLT4gWCwgIFB0ckJsdWUgLT4gWCk7CisgICAgX2Ntc1ZFQzNpbml0KCZyIC0+IHZbMV0sIFB0clJlZCAtPiBZLCBQdHJHcmVlbiAtPiBZLCAgUHRyQmx1ZSAtPiBZKTsKKyAgICBfY21zVkVDM2luaXQoJnIgLT4gdlsyXSwgUHRyUmVkIC0+IFosIFB0ckdyZWVuIC0+IFosICBQdHJCbHVlIC0+IFopOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLy8gR3JheSBpbnB1dCBwaXBlbGluZQorc3RhdGljCitjbXNQaXBlbGluZSogQnVpbGRHcmF5SW5wdXRNYXRyaXhQaXBlbGluZShjbXNIUFJPRklMRSBoUHJvZmlsZSkKK3sKKyAgICBjbXNUb25lQ3VydmUgKkdyYXlUUkM7CisgICAgY21zUGlwZWxpbmUqIEx1dDsKKyAgICBjbXNDb250ZXh0IENvbnRleHRJRCA9IGNtc0dldFByb2ZpbGVDb250ZXh0SUQoaFByb2ZpbGUpOworCisgICAgR3JheVRSQyA9IChjbXNUb25lQ3VydmUgKikgY21zUmVhZFRhZyhoUHJvZmlsZSwgY21zU2lnR3JheVRSQ1RhZyk7CisgICAgaWYgKEdyYXlUUkMgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBMdXQgPSBjbXNQaXBlbGluZUFsbG9jKENvbnRleHRJRCwgMSwgMyk7CisgICAgaWYgKEx1dCA9PSBOVUxMKQorICAgICAgICBnb3RvIEVycm9yOworCisgICAgaWYgKGNtc0dldFBDUyhoUHJvZmlsZSkgPT0gY21zU2lnTGFiRGF0YSkgeworCisgICAgICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBpbXBsZW1lbnQgdGhlIHByb2ZpbGUgYXMgYW4gIGlkZW50aXR5IG1hdHJpeCBwbHVzIDMgdG9uZSBjdXJ2ZXMKKyAgICAgICAgY21zVUludDE2TnVtYmVyIFplcm9bMl0gPSB7IDB4ODA4MCwgMHg4MDgwIH07CisgICAgICAgIGNtc1RvbmVDdXJ2ZSogRW1wdHlUYWI7CisgICAgICAgIGNtc1RvbmVDdXJ2ZSogTGFiQ3VydmVzWzNdOworCisgICAgICAgIEVtcHR5VGFiID0gY21zQnVpbGRUYWJ1bGF0ZWRUb25lQ3VydmUxNihDb250ZXh0SUQsIDIsIFplcm8pOworCisgICAgICAgIGlmIChFbXB0eVRhYiA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBFcnJvcjsKKworICAgICAgICBMYWJDdXJ2ZXNbMF0gPSBHcmF5VFJDOworICAgICAgICBMYWJDdXJ2ZXNbMV0gPSBFbXB0eVRhYjsKKyAgICAgICAgTGFiQ3VydmVzWzJdID0gRW1wdHlUYWI7CisKKyAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfRU5ELCBjbXNTdGFnZUFsbG9jTWF0cml4KENvbnRleHRJRCwgMywgIDEsIE9uZVRvVGhyZWVJbnB1dE1hdHJpeCwgTlVMTCkpIHx8CisgICAgICAgICAgICAhY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgY21zU3RhZ2VBbGxvY1RvbmVDdXJ2ZXMoQ29udGV4dElELCAzLCBMYWJDdXJ2ZXMpKSkgeworICAgICAgICAgICAgICAgIGNtc0ZyZWVUb25lQ3VydmUoRW1wdHlUYWIpOworICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBjbXNGcmVlVG9uZUN1cnZlKEVtcHR5VGFiKTsKKworICAgIH0KKyAgICBlbHNlICB7CisKKyAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfRU5ELCBjbXNTdGFnZUFsbG9jVG9uZUN1cnZlcyhDb250ZXh0SUQsIDEsICZHcmF5VFJDKSkgfHwKKyAgICAgICAgICAgICFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfRU5ELCBjbXNTdGFnZUFsbG9jTWF0cml4KENvbnRleHRJRCwgMywgIDEsIEdyYXlJbnB1dE1hdHJpeCwgTlVMTCkpKQorICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICByZXR1cm4gTHV0OworCitFcnJvcjoKKyAgICAvLyBtZW1vcnkgcG9pbnRlZCBieSBHcmF5VFJDIGlzIG5vdCBhIG5ldyBtYWxsb2MgbWVtb3J5LCBzbyBkb24ndCBmcmVlIGl0IGhlcmUsIAorICAgIC8vIG1lbW9yeSBwb2ludGVkIGJ5IEdyYXlUUkMgd2lsbCBiZSBmcmVlZCB3aGVuIGhQcm9maWxlIGlzIGNsb3NlZC4KKyAgICAvLyB0ZXN0IGZpbGUgOjAwNDc3NzZfUG9ja2V0IE1lZGljaW5lXyBUaGUgTWFzc2FjaHVzZXR0cyBHZW5lcmFsIEhvc3BpdGFsIEhhbmRib29rIG9mIEludGVybmFsIE1lZGljaW5lLTIucGRmCisgICAgLy8gWGlhb2NodWFuIExpdSwgMjAxNDA0MjEKKyAgICAvL2Ntc0ZyZWVUb25lQ3VydmUoR3JheVRSQyk7CisgICAgY21zUGlwZWxpbmVGcmVlKEx1dCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIFJHQiBNYXRyaXggc2hhcGVyCitzdGF0aWMKK2Ntc1BpcGVsaW5lKiBCdWlsZFJHQklucHV0TWF0cml4U2hhcGVyKGNtc0hQUk9GSUxFIGhQcm9maWxlKQoreworICAgIGNtc1BpcGVsaW5lKiBMdXQ7CisgICAgY21zTUFUMyBNYXQ7CisgICAgY21zVG9uZUN1cnZlICpTaGFwZXNbM107CisgICAgY21zQ29udGV4dCBDb250ZXh0SUQgPSBjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKTsKKyAgICBpbnQgaSwgajsKKworICAgIGlmICghUmVhZElDQ01hdHJpeFJHQjJYWVooJk1hdCwgaFByb2ZpbGUpKSByZXR1cm4gTlVMTDsKKworICAgIC8vIFhZWiBQQ1MgaW4gZW5jb2RlZCBpbiAxLjE1IGZvcm1hdCwgYW5kIHRoZSBtYXRyaXggb3V0cHV0IGNvbWVzIGluIDAuLjB4ZmZmZiByYW5nZSwgc28KKyAgICAvLyB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgb3V0cHV0IGJ5IGEgZmFjdG9yIG9mICgweDEwMDAwLzB4ZmZmZikgdG8gcHV0IGRhdGEgaW4KKyAgICAvLyBhIDEuMTYgcmFuZ2UsIGFuZCB0aGVuIGEgPj4gMSB0byBvYnRhaW4gMS4xNS4gVGhlIHRvdGFsIGZhY3RvciBpcyAoNjU1MzYuMCkvKDY1NTM1LjAqMikKKworICAgIGZvciAoaT0wOyBpIDwgMzsgaSsrKQorICAgICAgICBmb3IgKGo9MDsgaiA8IDM7IGorKykKKyAgICAgICAgICAgIE1hdC52W2ldLm5bal0gKj0gSW5wQWRqOworCisKKyAgICBTaGFwZXNbMF0gPSAoY21zVG9uZUN1cnZlICopIGNtc1JlYWRUYWcoaFByb2ZpbGUsIGNtc1NpZ1JlZFRSQ1RhZyk7CisgICAgU2hhcGVzWzFdID0gKGNtc1RvbmVDdXJ2ZSAqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCBjbXNTaWdHcmVlblRSQ1RhZyk7CisgICAgU2hhcGVzWzJdID0gKGNtc1RvbmVDdXJ2ZSAqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCBjbXNTaWdCbHVlVFJDVGFnKTsKKworICAgIGlmICghU2hhcGVzWzBdIHx8ICFTaGFwZXNbMV0gfHwgIVNoYXBlc1syXSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBMdXQgPSBjbXNQaXBlbGluZUFsbG9jKENvbnRleHRJRCwgMywgMyk7CisgICAgaWYgKEx1dCAhPSBOVUxMKSB7CisKKyAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfRU5ELCBjbXNTdGFnZUFsbG9jVG9uZUN1cnZlcyhDb250ZXh0SUQsIDMsIFNoYXBlcykpIHx8CisgICAgICAgICAgICAhY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgY21zU3RhZ2VBbGxvY01hdHJpeChDb250ZXh0SUQsIDMsIDMsIChjbXNGbG9hdDY0TnVtYmVyKikgJk1hdCwgTlVMTCkpKQorICAgICAgICAgICAgZ290byBFcnJvcjsKKworICAgICAgICAvLyBOb3RlIHRoYXQgaXQgaXMgY2VydGFpbmx5IHBvc3NpYmxlIGEgc2luZ2xlIHByb2ZpbGUgd291bGQgaGF2ZSBhIExVVCBiYXNlZAorICAgICAgICAvLyB0YWcgZm9yIG91dHB1dCB3b3JraW5nIGluIGxhYiBhbmQgYSBtYXRyaXgtc2hhcGVyIGZvciB0aGUgZmFsbGJhY2sgY2FzZXMuIAorICAgICAgICAvLyBUaGlzIGlzIG5vdCBhbGxvd2VkIGJ5IHRoZSBzcGVjLCBidXQgdGhpcyBjb2RlIGlzIHRvbGVyYW50IHRvIHRob3NlIGNhc2VzICAgIAorICAgICAgICBpZiAoY21zR2V0UENTKGhQcm9maWxlKSA9PSBjbXNTaWdMYWJEYXRhKSB7CisKKyAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgX2Ntc1N0YWdlQWxsb2NYWVoyTGFiKENvbnRleHRJRCkpKQorICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHJldHVybiBMdXQ7CisKK0Vycm9yOgorICAgIGNtc1BpcGVsaW5lRnJlZShMdXQpOworICAgIHJldHVybiBOVUxMOworfQorCisKKworLy8gUmVhZCB0aGUgRFRvQVggdGFnLCBhZGp1c3RpbmcgdGhlIGVuY29kaW5nIG9mIExhYiBvciBYWVogaWYgbmVkZWQKK3N0YXRpYworY21zUGlwZWxpbmUqIF9jbXNSZWFkRmxvYXRJbnB1dFRhZyhjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVGFnU2lnbmF0dXJlIHRhZ0Zsb2F0KQoreworICAgIGNtc0NvbnRleHQgQ29udGV4dElEICAgICAgID0gY21zR2V0UHJvZmlsZUNvbnRleHRJRChoUHJvZmlsZSk7CisgICAgY21zUGlwZWxpbmUqIEx1dCAgICAgICAgICAgPSBjbXNQaXBlbGluZUR1cCgoY21zUGlwZWxpbmUqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCB0YWdGbG9hdCkpOworICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgc3BjID0gY21zR2V0Q29sb3JTcGFjZShoUHJvZmlsZSk7CisgICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBQQ1MgPSBjbXNHZXRQQ1MoaFByb2ZpbGUpOworICAgIAorICAgIGlmIChMdXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgCisgICAgLy8gaW5wdXQgYW5kIG91dHB1dCBvZiB0cmFuc2Zvcm0gYXJlIGluIGxjbXMgMC4uMSBlbmNvZGluZy4gIElmIFhZWiBvciBMYWIgc3BhY2VzIGFyZSB1c2VkLCAKKyAgICAvLyAgdGhlc2UgbmVlZCB0byBiZSBub3JtYWxpemVkIGludG8gdGhlIGFwcHJvcHJpYXRlIHJhbmdlcyAoTGFiID0gMTAwLDAsMCwgWFlaPTEuMCwxLjAsMS4wKQorICAgIGlmICggc3BjID09IGNtc1NpZ0xhYkRhdGEpCisgICAgeworICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9CRUdJTiwgX2Ntc1N0YWdlTm9ybWFsaXplVG9MYWJGbG9hdChDb250ZXh0SUQpKSkKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIGVsc2UgaWYgKHNwYyA9PSBjbXNTaWdYWVpEYXRhKQorICAgIHsKKyAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfQkVHSU4sIF9jbXNTdGFnZU5vcm1hbGl6ZVRvWHl6RmxvYXQoQ29udGV4dElEKSkpCisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgICAKKyAgICBpZiAoIFBDUyA9PSBjbXNTaWdMYWJEYXRhKQorICAgIHsKKyAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfRU5ELCBfY21zU3RhZ2VOb3JtYWxpemVGcm9tTGFiRmxvYXQoQ29udGV4dElEKSkpCisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgICBlbHNlIGlmKCBQQ1MgPT0gY21zU2lnWFlaRGF0YSkKKyAgICB7CisgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgX2Ntc1N0YWdlTm9ybWFsaXplRnJvbVh5ekZsb2F0KENvbnRleHRJRCkpKQorICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIEx1dDsKKworRXJyb3I6CisgICAgY21zUGlwZWxpbmVGcmVlKEx1dCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLy8gUmVhZCBhbmQgY3JlYXRlIGEgQlJBTkQgTkVXIE1QRSBMVVQgZnJvbSBhIGdpdmVuIHByb2ZpbGUuIEFsbCBzdHVmZiBkZXBlbmRlbnQgb2YgdmVyc2lvbiwgZXRjCisvLyBpcyBhZGp1c3RlZCBoZXJlIGluIG9yZGVyIHRvIGNyZWF0ZSBhIExVVCB0aGF0IHRha2VzIGNhcmUgb2YgYWxsIHRob3NlIGRldGFpbHMuCisvLyBXZSBhZGQgaW50ZW50ID0gLTEgYXMgYSB3YXkgdG8gcmVhZCBtYXRyaXggc2hhcGVyIGFsd2F5cywgbm8gbWF0dGVyIG9mIG90aGVyIExVVAorY21zUGlwZWxpbmUqIF9jbXNSZWFkSW5wdXRMVVQoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGludCBJbnRlbnQpCit7CisgICAgY21zVGFnVHlwZVNpZ25hdHVyZSBPcmlnaW5hbFR5cGU7CisgICAgY21zVGFnU2lnbmF0dXJlIHRhZzE2OworICAgIGNtc1RhZ1NpZ25hdHVyZSB0YWdGbG9hdDsKKyAgICBjbXNDb250ZXh0IENvbnRleHRJRCA9IGNtc0dldFByb2ZpbGVDb250ZXh0SUQoaFByb2ZpbGUpOworCisgICAgLy8gT24gbmFtZWQgY29sb3IsIHRha2UgdGhlIGFwcHJvcHJpYXRlIHRhZworICAgIGlmIChjbXNHZXREZXZpY2VDbGFzcyhoUHJvZmlsZSkgPT0gY21zU2lnTmFtZWRDb2xvckNsYXNzKSB7CisKKyAgICAgICAgY21zUGlwZWxpbmUqIEx1dDsKKyAgICAgICAgY21zTkFNRURDT0xPUkxJU1QqIG5jID0gKGNtc05BTUVEQ09MT1JMSVNUKikgY21zUmVhZFRhZyhoUHJvZmlsZSwgY21zU2lnTmFtZWRDb2xvcjJUYWcpOworCisgICAgICAgIGlmIChuYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgICAgICBMdXQgPSBjbXNQaXBlbGluZUFsbG9jKENvbnRleHRJRCwgMCwgMCk7CisgICAgICAgIGlmIChMdXQgPT0gTlVMTCkgeworICAgICAgICAgICAgY21zRnJlZU5hbWVkQ29sb3JMaXN0KG5jKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfQkVHSU4sIF9jbXNTdGFnZUFsbG9jTmFtZWRDb2xvcihuYywgVFJVRSkpIHx8CisgICAgICAgICAgICAhY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgX2Ntc1N0YWdlQWxsb2NMYWJWMlRvVjQoQ29udGV4dElEKSkpIHsKKyAgICAgICAgICAgIGNtc1BpcGVsaW5lRnJlZShMdXQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEx1dDsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIGFuIGF0dGVtcHQgdG8gcmV1c2UgdGhpcyBmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgbWF0cml4LXNoYXBlciBhcyBwaXBlbGluZSBubworICAgIC8vIG1hdHRlciBvdGhlciBMVVQgYXJlIHByZXNlbnQgYW5kIGhhdmUgcHJlY2VkZW5jZS4gSW50ZW50ID0gLTEgbWVhbnMganVzdCB0aGlzLgorICAgIGlmIChJbnRlbnQgPj0gSU5URU5UX1BFUkNFUFRVQUwgJiYgSW50ZW50IDw9IElOVEVOVF9BQlNPTFVURV9DT0xPUklNRVRSSUMpIHsKKworICAgICAgICB0YWcxNiA9IERldmljZTJQQ1MxNltJbnRlbnRdOworICAgICAgICB0YWdGbG9hdCA9IERldmljZTJQQ1NGbG9hdFtJbnRlbnRdOworCisgICAgICAgIGlmIChjbXNJc1RhZyhoUHJvZmlsZSwgdGFnRmxvYXQpKSB7ICAvLyBGbG9hdCB0YWcgdGFrZXMgcHJlY2VkZW5jZQorCisgICAgICAgICAgICAvLyBGbG9hdGluZyBwb2ludCBMVVQgYXJlIGFsd2F5cyBWNCwgYnV0IHRoZSBlbmNvZGluZyByYW5nZSBpcyBubworICAgICAgICAgICAgLy8gbG9uZ2VyIDAuLjEuMCwgc28gd2UgbmVlZCB0byBhZGQgYW4gc3RhZ2UgZGVwZW5kaW5nIG9uIHRoZSBjb2xvciBzcGFjZQorICAgICAgICAgICAgcmV0dXJuIF9jbXNSZWFkRmxvYXRJbnB1dFRhZyhoUHJvZmlsZSwgdGFnRmxvYXQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmV2ZXJ0IHRvIHBlcmNlcHR1YWwgaWYgbm8gdGFnIGlzIGZvdW5kCisgICAgICAgIGlmICghY21zSXNUYWcoaFByb2ZpbGUsIHRhZzE2KSkgeworICAgICAgICAgICAgdGFnMTYgPSBEZXZpY2UyUENTMTZbMF07CisgICAgICAgIH0KKworICAgICAgICBpZiAoY21zSXNUYWcoaFByb2ZpbGUsIHRhZzE2KSkgeyAvLyBJcyB0aGVyZSBhbnkgTFVULUJhc2VkIHRhYmxlPworCisgICAgICAgICAgICAvLyBDaGVjayBwcm9maWxlIHZlcnNpb24gYW5kIExVVCB0eXBlLiBEbyB0aGUgbmVjZXNzYXJ5IGFkanVzdG1lbnRzIGlmIG5lZWRlZAorCisgICAgICAgICAgICAvLyBGaXJzdCByZWFkIHRoZSB0YWcKKyAgICAgICAgICAgIGNtc1BpcGVsaW5lKiBMdXQgPSAoY21zUGlwZWxpbmUqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCB0YWcxNik7CisgICAgICAgICAgICBpZiAoTHV0ID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgICAgICAgICAvLyBBZnRlciByZWFkaW5nIGl0LCB3ZSBoYXZlIG5vdyBpbmZvIGFib3V0IHRoZSBvcmlnaW5hbCB0eXBlCisgICAgICAgICAgICBPcmlnaW5hbFR5cGUgPSAgX2Ntc0dldFRhZ1RydWVUeXBlKGhQcm9maWxlLCB0YWcxNik7CisKKyAgICAgICAgICAgIC8vIFRoZSBwcm9maWxlIG93bnMgdGhlIEx1dCwgc28gd2UgbmVlZCB0byBjb3B5IGl0CisgICAgICAgICAgICBMdXQgPSBjbXNQaXBlbGluZUR1cChMdXQpOworCisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGFkanVzdCBkYXRhIG9ubHkgZm9yIExhYjE2IG9uIG91dHB1dAorICAgICAgICAgICAgaWYgKE9yaWdpbmFsVHlwZSAhPSBjbXNTaWdMdXQxNlR5cGUgfHwgY21zR2V0UENTKGhQcm9maWxlKSAhPSBjbXNTaWdMYWJEYXRhKQorICAgICAgICAgICAgICAgIHJldHVybiBMdXQ7CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBpbnB1dCBpcyBMYWIsIGFkZCBhbHNvIGEgY29udmVyc2lvbiBhdCB0aGUgYmVnaW4KKyAgICAgICAgICAgIGlmIChjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKSA9PSBjbXNTaWdMYWJEYXRhICYmCisgICAgICAgICAgICAgICAgIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9CRUdJTiwgX2Ntc1N0YWdlQWxsb2NMYWJWNFRvVjIoQ29udGV4dElEKSkpCisgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKKworICAgICAgICAgICAgLy8gQWRkIGEgbWF0cml4IGZvciBjb252ZXJzaW9uIFYyIHRvIFY0IExhYiBQQ1MKKyAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgX2Ntc1N0YWdlQWxsb2NMYWJWMlRvVjQoQ29udGV4dElEKSkpCisgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKKworICAgICAgICAgICAgcmV0dXJuIEx1dDsKK0Vycm9yOgorICAgICAgICAgICAgY21zUGlwZWxpbmVGcmVlKEx1dCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEx1dCB3YXMgbm90IGZvdW5kLCB0cnkgdG8gY3JlYXRlIGEgbWF0cml4LXNoYXBlcgorCisgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGdyYXlzY2FsZSBwcm9maWxlLgorICAgIGlmIChjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKSA9PSBjbXNTaWdHcmF5RGF0YSkgeworCisgICAgICAgIC8vIGlmIHNvLCBidWlsZCBhcHByb3ByaWF0ZSBjb252ZXJzaW9uIHRhYmxlcy4KKyAgICAgICAgLy8gVGhlIHRhYmxlcyBhcmUgdGhlIFBDUyBpbHVtaW5hbnQsIHNjYWxlZCBhY3Jvc3MgR3JheVRSQworICAgICAgICByZXR1cm4gQnVpbGRHcmF5SW5wdXRNYXRyaXhQaXBlbGluZShoUHJvZmlsZSk7CisgICAgfQorCisgICAgLy8gTm90IGdyYXksIGNyZWF0ZSBhIG5vcm1hbCBtYXRyaXgtc2hhcGVyCisgICAgcmV0dXJuIEJ1aWxkUkdCSW5wdXRNYXRyaXhTaGFwZXIoaFByb2ZpbGUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gR3JheSBvdXRwdXQgcGlwZWxpbmUuCisvLyBYWVogLT4gR3JheSBvciBMYWIgLT4gR3JheS4gU2luY2Ugd2Ugb25seSBrbm93IHRoZSBHcmF5VFJDLCB3ZSBuZWVkIHRvIGRvIHNvbWUgYXNzdW1wdGlvbnMuIEdyYXkgY29tcG9uZW50IHdpbGwgYmUKKy8vIGdpdmVuIGJ5IFkgb24gWFlaIFBDUyBhbmQgYnkgTCogb24gTGFiIFBDUywgQm90aCBhY3Jvc3MgaW52ZXJzZSBUUkMgY3VydmUuCisvLyBUaGUgY29tcGxldGUgcGlwZWxpbmUgb24gWFlaIGlzIE1hdHJpeFszOjFdIC0+IFRvbmUgY3VydmUgYW5kIGluIExhYiBNYXRyaXhbMzoxXSAtPiBUb25lIEN1cnZlIGFzIHdlbGwuCisKK3N0YXRpYworY21zUGlwZWxpbmUqIEJ1aWxkR3JheU91dHB1dFBpcGVsaW5lKGNtc0hQUk9GSUxFIGhQcm9maWxlKQoreworICAgIGNtc1RvbmVDdXJ2ZSAqR3JheVRSQywgKlJldkdyYXlUUkM7CisgICAgY21zUGlwZWxpbmUqIEx1dDsKKyAgICBjbXNDb250ZXh0IENvbnRleHRJRCA9IGNtc0dldFByb2ZpbGVDb250ZXh0SUQoaFByb2ZpbGUpOworCisgICAgR3JheVRSQyA9IChjbXNUb25lQ3VydmUgKikgY21zUmVhZFRhZyhoUHJvZmlsZSwgY21zU2lnR3JheVRSQ1RhZyk7CisgICAgaWYgKEdyYXlUUkMgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBSZXZHcmF5VFJDID0gY21zUmV2ZXJzZVRvbmVDdXJ2ZShHcmF5VFJDKTsKKyAgICBpZiAoUmV2R3JheVRSQyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIEx1dCA9IGNtc1BpcGVsaW5lQWxsb2MoQ29udGV4dElELCAzLCAxKTsKKyAgICBpZiAoTHV0ID09IE5VTEwpIHsKKyAgICAgICAgY21zRnJlZVRvbmVDdXJ2ZShSZXZHcmF5VFJDKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKGNtc0dldFBDUyhoUHJvZmlsZSkgPT0gY21zU2lnTGFiRGF0YSkgeworCisgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgY21zU3RhZ2VBbGxvY01hdHJpeChDb250ZXh0SUQsIDEsICAzLCBQaWNrTHN0YXJNYXRyaXgsIE5VTEwpKSkKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIGVsc2UgIHsKKyAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfRU5ELCBjbXNTdGFnZUFsbG9jTWF0cml4KENvbnRleHRJRCwgMSwgIDMsIFBpY2tZTWF0cml4LCBOVUxMKSkpCisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgIH0KKworICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgY21zU3RhZ2VBbGxvY1RvbmVDdXJ2ZXMoQ29udGV4dElELCAxLCAmUmV2R3JheVRSQykpKQorICAgICAgICBnb3RvIEVycm9yOworCisgICAgY21zRnJlZVRvbmVDdXJ2ZShSZXZHcmF5VFJDKTsKKyAgICByZXR1cm4gTHV0OworCitFcnJvcjoKKyAgICBjbXNGcmVlVG9uZUN1cnZlKFJldkdyYXlUUkMpOworICAgIGNtc1BpcGVsaW5lRnJlZShMdXQpOworICAgIHJldHVybiBOVUxMOworfQorCisKK3N0YXRpYworY21zUGlwZWxpbmUqIEJ1aWxkUkdCT3V0cHV0TWF0cml4U2hhcGVyKGNtc0hQUk9GSUxFIGhQcm9maWxlKQoreworICAgIGNtc1BpcGVsaW5lKiBMdXQ7CisgICAgY21zVG9uZUN1cnZlICpTaGFwZXNbM10sICpJbnZTaGFwZXNbM107CisgICAgY21zTUFUMyBNYXQsIEludjsKKyAgICBpbnQgaSwgajsKKyAgICBjbXNDb250ZXh0IENvbnRleHRJRCA9IGNtc0dldFByb2ZpbGVDb250ZXh0SUQoaFByb2ZpbGUpOworCisgICAgaWYgKCFSZWFkSUNDTWF0cml4UkdCMlhZWigmTWF0LCBoUHJvZmlsZSkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKCFfY21zTUFUM2ludmVyc2UoJk1hdCwgJkludikpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLy8gWFlaIFBDUyBpbiBlbmNvZGVkIGluIDEuMTUgZm9ybWF0LCBhbmQgdGhlIG1hdHJpeCBpbnB1dCBzaG91bGQgY29tZSBpbiAwLi4weGZmZmYgcmFuZ2UsIHNvCisgICAgLy8gd2UgbmVlZCB0byBhZGp1c3QgdGhlIGlucHV0IGJ5IGEgPDwgMSB0byBvYnRhaW4gYSAxLjE2IGZpeGVkIGFuZCB0aGVuIGJ5IGEgZmFjdG9yIG9mCisgICAgLy8gKDB4ZmZmZi8weDEwMDAwKSB0byBwdXQgZGF0YSBpbiAwLi4weGZmZmYgcmFuZ2UuIFRvdGFsIGZhY3RvciBpcyAoMi4wKjY1NTM1LjApLzY1NTM2LjA7CisKKyAgICBmb3IgKGk9MDsgaSA8IDM7IGkrKykKKyAgICAgICAgZm9yIChqPTA7IGogPCAzOyBqKyspCisgICAgICAgICAgICBJbnYudltpXS5uW2pdICo9IE91dHBBZGo7CisKKyAgICBTaGFwZXNbMF0gPSAoY21zVG9uZUN1cnZlICopIGNtc1JlYWRUYWcoaFByb2ZpbGUsIGNtc1NpZ1JlZFRSQ1RhZyk7CisgICAgU2hhcGVzWzFdID0gKGNtc1RvbmVDdXJ2ZSAqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCBjbXNTaWdHcmVlblRSQ1RhZyk7CisgICAgU2hhcGVzWzJdID0gKGNtc1RvbmVDdXJ2ZSAqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCBjbXNTaWdCbHVlVFJDVGFnKTsKKworICAgIGlmICghU2hhcGVzWzBdIHx8ICFTaGFwZXNbMV0gfHwgIVNoYXBlc1syXSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBJbnZTaGFwZXNbMF0gPSBjbXNSZXZlcnNlVG9uZUN1cnZlKFNoYXBlc1swXSk7CisgICAgSW52U2hhcGVzWzFdID0gY21zUmV2ZXJzZVRvbmVDdXJ2ZShTaGFwZXNbMV0pOworICAgIEludlNoYXBlc1syXSA9IGNtc1JldmVyc2VUb25lQ3VydmUoU2hhcGVzWzJdKTsKKworICAgIGlmICghSW52U2hhcGVzWzBdIHx8ICFJbnZTaGFwZXNbMV0gfHwgIUludlNoYXBlc1syXSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBMdXQgPSBjbXNQaXBlbGluZUFsbG9jKENvbnRleHRJRCwgMywgMyk7CisgICAgaWYgKEx1dCAhPSBOVUxMKSB7CisKKyAgICAgICAgLy8gTm90ZSB0aGF0IGl0IGlzIGNlcnRhaW5seSBwb3NzaWJsZSBhIHNpbmdsZSBwcm9maWxlIHdvdWxkIGhhdmUgYSBMVVQgYmFzZWQKKyAgICAgICAgLy8gdGFnIGZvciBvdXRwdXQgd29ya2luZyBpbiBsYWIgYW5kIGEgbWF0cml4LXNoYXBlciBmb3IgdGhlIGZhbGxiYWNrIGNhc2VzLiAKKyAgICAgICAgLy8gVGhpcyBpcyBub3QgYWxsb3dlZCBieSB0aGUgc3BlYywgYnV0IHRoaXMgY29kZSBpcyB0b2xlcmFudCB0byB0aG9zZSBjYXNlcyAgICAKKyAgICAgICAgaWYgKGNtc0dldFBDUyhoUHJvZmlsZSkgPT0gY21zU2lnTGFiRGF0YSkgeworCisgICAgICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9FTkQsIF9jbXNTdGFnZUFsbG9jTGFiMlhZWihDb250ZXh0SUQpKSkKKyAgICAgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfRU5ELCBjbXNTdGFnZUFsbG9jTWF0cml4KENvbnRleHRJRCwgMywgMywgKGNtc0Zsb2F0NjROdW1iZXIqKSAmSW52LCBOVUxMKSkgfHwKKyAgICAgICAgICAgICFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfRU5ELCBjbXNTdGFnZUFsbG9jVG9uZUN1cnZlcyhDb250ZXh0SUQsIDMsIEludlNoYXBlcykpKQorICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICBjbXNGcmVlVG9uZUN1cnZlVHJpcGxlKEludlNoYXBlcyk7CisgICAgcmV0dXJuIEx1dDsKK0Vycm9yOgorICAgIGNtc0ZyZWVUb25lQ3VydmVUcmlwbGUoSW52U2hhcGVzKTsKKyAgICBjbXNQaXBlbGluZUZyZWUoTHV0KTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworCisvLyBDaGFuZ2UgQ0xVVCBpbnRlcnBvbGF0aW9uIHRvIHRyaWxpbmVhcgorc3RhdGljCit2b2lkIENoYW5nZUludGVycG9sYXRpb25Ub1RyaWxpbmVhcihjbXNQaXBlbGluZSogTHV0KQoreworICAgIGNtc1N0YWdlKiBTdGFnZTsKKworICAgIGZvciAoU3RhZ2UgPSBjbXNQaXBlbGluZUdldFB0clRvRmlyc3RTdGFnZShMdXQpOworICAgICAgICBTdGFnZSAhPSBOVUxMOworICAgICAgICBTdGFnZSA9IGNtc1N0YWdlTmV4dChTdGFnZSkpIHsKKworICAgICAgICAgICAgaWYgKGNtc1N0YWdlVHlwZShTdGFnZSkgPT0gY21zU2lnQ0x1dEVsZW1UeXBlKSB7CisKKyAgICAgICAgICAgICAgICBfY21zU3RhZ2VDTHV0RGF0YSogQ0xVVCA9IChfY21zU3RhZ2VDTHV0RGF0YSopIFN0YWdlIC0+RGF0YTsKKworICAgICAgICAgICAgICAgIENMVVQgLT5QYXJhbXMtPmR3RmxhZ3MgfD0gQ01TX0xFUlBfRkxBR1NfVFJJTElORUFSOworICAgICAgICAgICAgICAgIF9jbXNTZXRJbnRlcnBvbGF0aW9uUm91dGluZShMdXQtPkNvbnRleHRJRCwgQ0xVVCAtPlBhcmFtcyk7CisgICAgICAgICAgICB9CisgICAgfQorfQorCisKKy8vIFJlYWQgdGhlIERUb0FYIHRhZywgYWRqdXN0aW5nIHRoZSBlbmNvZGluZyBvZiBMYWIgb3IgWFlaIGlmIG5lZGVkCitzdGF0aWMKK2Ntc1BpcGVsaW5lKiBfY21zUmVhZEZsb2F0T3V0cHV0VGFnKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNUYWdTaWduYXR1cmUgdGFnRmxvYXQpCit7CisgICAgY21zQ29udGV4dCBDb250ZXh0SUQgICAgICAgPSBjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKTsKKyAgICBjbXNQaXBlbGluZSogTHV0ICAgICAgICAgICA9IGNtc1BpcGVsaW5lRHVwKChjbXNQaXBlbGluZSopIGNtc1JlYWRUYWcoaFByb2ZpbGUsIHRhZ0Zsb2F0KSk7CisgICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBQQ1MgPSBjbXNHZXRQQ1MoaFByb2ZpbGUpOworICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgZGF0YVNwYWNlID0gY21zR2V0Q29sb3JTcGFjZShoUHJvZmlsZSk7CisgICAgCisgICAgaWYgKEx1dCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAKKyAgICAvLyBJZiBQQ1MgaXMgTGFiIG9yIFhZWiwgdGhlIGZsb2F0aW5nIHBvaW50IHRhZyBpcyBhY2NlcHRpbmcgZGF0YSBpbiB0aGUgc3BhY2UgZW5jb2RpbmcsCisgICAgLy8gYW5kIHNpbmNlIHRoZSBmb3JtYXR0ZXIgaGFzIGFscmVhZHkgYWNjb21tb2RhdGVkIHRvIDAuLjEuMCwgd2Ugc2hvdWxkIHVuZG8gdGhpcyBjaGFuZ2UKKyAgICBpZiAoIFBDUyA9PSBjbXNTaWdMYWJEYXRhKQorICAgIHsKKyAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfQkVHSU4sIF9jbXNTdGFnZU5vcm1hbGl6ZVRvTGFiRmxvYXQoQ29udGV4dElEKSkpCisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGlmIChQQ1MgPT0gY21zU2lnWFlaRGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfQkVHSU4sIF9jbXNTdGFnZU5vcm1hbGl6ZVRvWHl6RmxvYXQoQ29udGV4dElEKSkpCisgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgfQorICAgIAorICAgIC8vIHRoZSBvdXRwdXQgY2FuIGJlIExhYiBvciBYWVosIGluIHdoaWNoIGNhc2Ugbm9ybWFsaXNhdGlvbiBpcyBuZWVkZWQgb24gdGhlIGVuZCBvZiB0aGUgcGlwZWxpbmUKKyAgICBpZiAoIGRhdGFTcGFjZSA9PSBjbXNTaWdMYWJEYXRhKQorICAgIHsKKyAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfRU5ELCBfY21zU3RhZ2VOb3JtYWxpemVGcm9tTGFiRmxvYXQoQ29udGV4dElEKSkpCisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgICBlbHNlIGlmIChkYXRhU3BhY2UgPT0gY21zU2lnWFlaRGF0YSkKKyAgICB7CisgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgX2Ntc1N0YWdlTm9ybWFsaXplRnJvbVh5ekZsb2F0KENvbnRleHRJRCkpKQorICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIEx1dDsKKworRXJyb3I6CisgICAgY21zUGlwZWxpbmVGcmVlKEx1dCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIENyZWF0ZSBhbiBvdXRwdXQgTVBFIExVVCBmcm9tIGFnaXZlbiBwcm9maWxlLiBWZXJzaW9uIG1pc21hdGNoZXMgYXJlIGhhbmRsZWQgaGVyZQorY21zUGlwZWxpbmUqIF9jbXNSZWFkT3V0cHV0TFVUKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBpbnQgSW50ZW50KQoreworICAgIGNtc1RhZ1R5cGVTaWduYXR1cmUgT3JpZ2luYWxUeXBlOworICAgIGNtc1RhZ1NpZ25hdHVyZSB0YWcxNjsKKyAgICBjbXNUYWdTaWduYXR1cmUgdGFnRmxvYXQ7CisgICAgY21zQ29udGV4dCBDb250ZXh0SUQgID0gY21zR2V0UHJvZmlsZUNvbnRleHRJRChoUHJvZmlsZSk7CisKKworICAgIGlmIChJbnRlbnQgPj0gSU5URU5UX1BFUkNFUFRVQUwgJiYgSW50ZW50IDw9IElOVEVOVF9BQlNPTFVURV9DT0xPUklNRVRSSUMpIHsKKworICAgICAgICB0YWcxNiA9IFBDUzJEZXZpY2UxNltJbnRlbnRdOworICAgICAgICB0YWdGbG9hdCA9IFBDUzJEZXZpY2VGbG9hdFtJbnRlbnRdOworCisgICAgICAgIGlmIChjbXNJc1RhZyhoUHJvZmlsZSwgdGFnRmxvYXQpKSB7ICAvLyBGbG9hdCB0YWcgdGFrZXMgcHJlY2VkZW5jZQorCisgICAgICAgICAgICAvLyBGbG9hdGluZyBwb2ludCBMVVQgYXJlIGFsd2F5cyBWNAorICAgICAgICAgICAgcmV0dXJuIF9jbXNSZWFkRmxvYXRPdXRwdXRUYWcoaFByb2ZpbGUsIHRhZ0Zsb2F0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldmVydCB0byBwZXJjZXB0dWFsIGlmIG5vIHRhZyBpcyBmb3VuZAorICAgICAgICBpZiAoIWNtc0lzVGFnKGhQcm9maWxlLCB0YWcxNikpIHsKKyAgICAgICAgICAgIHRhZzE2ID0gUENTMkRldmljZTE2WzBdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNtc0lzVGFnKGhQcm9maWxlLCB0YWcxNikpIHsgLy8gSXMgdGhlcmUgYW55IExVVC1CYXNlZCB0YWJsZT8KKworICAgICAgICAgICAgLy8gQ2hlY2sgcHJvZmlsZSB2ZXJzaW9uIGFuZCBMVVQgdHlwZS4gRG8gdGhlIG5lY2Vzc2FyeSBhZGp1c3RtZW50cyBpZiBuZWVkZWQKKworICAgICAgICAgICAgLy8gRmlyc3QgcmVhZCB0aGUgdGFnCisgICAgICAgICAgICBjbXNQaXBlbGluZSogTHV0ID0gKGNtc1BpcGVsaW5lKikgY21zUmVhZFRhZyhoUHJvZmlsZSwgdGFnMTYpOworICAgICAgICAgICAgaWYgKEx1dCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgICAgICAgICAgLy8gQWZ0ZXIgcmVhZGluZyBpdCwgd2UgaGF2ZSBpbmZvIGFib3V0IHRoZSBvcmlnaW5hbCB0eXBlCisgICAgICAgICAgICBPcmlnaW5hbFR5cGUgPSAgX2Ntc0dldFRhZ1RydWVUeXBlKGhQcm9maWxlLCB0YWcxNik7CisKKyAgICAgICAgICAgIC8vIFRoZSBwcm9maWxlIG93bnMgdGhlIEx1dCwgc28gd2UgbmVlZCB0byBjb3B5IGl0CisgICAgICAgICAgICBMdXQgPSBjbXNQaXBlbGluZUR1cChMdXQpOworICAgICAgICAgICAgaWYgKEx1dCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgICAgICAgICAgLy8gTm93IGl0IGlzIHRpbWUgZm9yIGEgY29udHJvdmVyc2lhbCBzdHVmZi4gSSBmb3VuZCB0aGF0IGZvciAzRCBMVVRTIHVzaW5nCisgICAgICAgICAgICAvLyBMYWIgdXNlZCBhcyBpbmRleGVyIHNwYWNlLCAgdHJpbGluZWFyIGludGVycG9sYXRpb24gc2hvdWxkIGJlIHVzZWQKKyAgICAgICAgICAgIGlmIChjbXNHZXRQQ1MoaFByb2ZpbGUpID09IGNtc1NpZ0xhYkRhdGEpCisgICAgICAgICAgICAgICAgQ2hhbmdlSW50ZXJwb2xhdGlvblRvVHJpbGluZWFyKEx1dCk7CisKKyAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0IGRhdGEgb25seSBmb3IgTGFiIGFuZCBMdXQxNiB0eXBlCisgICAgICAgICAgICBpZiAoT3JpZ2luYWxUeXBlICE9IGNtc1NpZ0x1dDE2VHlwZSB8fCBjbXNHZXRQQ1MoaFByb2ZpbGUpICE9IGNtc1NpZ0xhYkRhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIEx1dDsKKworICAgICAgICAgICAgLy8gQWRkIGEgbWF0cml4IGZvciBjb252ZXJzaW9uIFY0IHRvIFYyIExhYiBQQ1MKKyAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0JFR0lOLCBfY21zU3RhZ2VBbGxvY0xhYlY0VG9WMihDb250ZXh0SUQpKSkKKyAgICAgICAgICAgICAgICBnb3RvIEVycm9yOworCisgICAgICAgICAgICAvLyBJZiB0aGUgb3V0cHV0IGlzIExhYiwgYWRkIGFsc28gYSBjb252ZXJzaW9uIGF0IHRoZSBlbmQKKyAgICAgICAgICAgIGlmIChjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKSA9PSBjbXNTaWdMYWJEYXRhKQorICAgICAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgX2Ntc1N0YWdlQWxsb2NMYWJWMlRvVjQoQ29udGV4dElEKSkpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CisKKyAgICAgICAgICAgIHJldHVybiBMdXQ7CitFcnJvcjoKKyAgICAgICAgICAgIGNtc1BpcGVsaW5lRnJlZShMdXQpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBMdXQgbm90IGZvdW5kLCB0cnkgdG8gY3JlYXRlIGEgbWF0cml4LXNoYXBlcgorCisgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGdyYXlzY2FsZSBwcm9maWxlLgorICAgIGlmIChjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKSA9PSBjbXNTaWdHcmF5RGF0YSkgeworCisgICAgICAgIC8vIGlmIHNvLCBidWlsZCBhcHByb3ByaWF0ZSBjb252ZXJzaW9uIHRhYmxlcy4KKyAgICAgICAgLy8gVGhlIHRhYmxlcyBhcmUgdGhlIFBDUyBpbHVtaW5hbnQsIHNjYWxlZCBhY3Jvc3MgR3JheVRSQworICAgICAgICByZXR1cm4gQnVpbGRHcmF5T3V0cHV0UGlwZWxpbmUoaFByb2ZpbGUpOworICAgIH0KKworICAgIC8vIE5vdCBncmF5LCBjcmVhdGUgYSBub3JtYWwgbWF0cml4LXNoYXBlciwgd2hpY2ggb25seSBvcGVyYXRlcyBpbiBYWVogc3BhY2UgIAorICAgIHJldHVybiBCdWlsZFJHQk91dHB1dE1hdHJpeFNoYXBlcihoUHJvZmlsZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBSZWFkIHRoZSBBVG9EMCB0YWcsIGFkanVzdGluZyB0aGUgZW5jb2Rpbmcgb2YgTGFiIG9yIFhZWiBpZiBuZWRlZAorc3RhdGljCitjbXNQaXBlbGluZSogX2Ntc1JlYWRGbG9hdERldmljZWxpbmtUYWcoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1RhZ1NpZ25hdHVyZSB0YWdGbG9hdCkKK3sKKyAgICBjbXNDb250ZXh0IENvbnRleHRJRCAgICAgICA9IGNtc0dldFByb2ZpbGVDb250ZXh0SUQoaFByb2ZpbGUpOworICAgIGNtc1BpcGVsaW5lKiBMdXQgICAgICAgICAgID0gY21zUGlwZWxpbmVEdXAoKGNtc1BpcGVsaW5lKikgY21zUmVhZFRhZyhoUHJvZmlsZSwgdGFnRmxvYXQpKTsKKyAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIFBDUyA9IGNtc0dldFBDUyhoUHJvZmlsZSk7CisgICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBzcGMgPSBjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKTsKKworICAgIGlmIChMdXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoc3BjID09IGNtc1NpZ0xhYkRhdGEpCisgICAgeworICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9CRUdJTiwgX2Ntc1N0YWdlTm9ybWFsaXplVG9MYWJGbG9hdChDb250ZXh0SUQpKSkKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgaWYgKHNwYyA9PSBjbXNTaWdYWVpEYXRhKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9CRUdJTiwgX2Ntc1N0YWdlTm9ybWFsaXplVG9YeXpGbG9hdChDb250ZXh0SUQpKSkKKyAgICAgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFBDUyA9PSBjbXNTaWdMYWJEYXRhKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9FTkQsIF9jbXNTdGFnZU5vcm1hbGl6ZUZyb21MYWJGbG9hdChDb250ZXh0SUQpKSkKKyAgICAgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIChQQ1MgPT0gY21zU2lnWFlaRGF0YSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9FTkQsIF9jbXNTdGFnZU5vcm1hbGl6ZUZyb21YeXpGbG9hdChDb250ZXh0SUQpKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgICAgIH0KKworICAgIHJldHVybiBMdXQ7CitFcnJvcjoKKyAgICBjbXNQaXBlbGluZUZyZWUoTHV0KTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gVGhpcyBvbmUgaW5jbHVkZXMgYWJzdHJhY3QgcHJvZmlsZXMgYXMgd2VsbC4gTWF0cml4LXNoYXBlciBjYW5ub3QgYmUgb2J0YWluZWQgb24gdGhhdCBkZXZpY2UgY2xhc3MuIFRoZQorLy8gdGFnIG5hbWUgaGVyZSBtYXkgZGVmYXVsdCB0byBBVG9CMAorY21zUGlwZWxpbmUqIF9jbXNSZWFkRGV2aWNlbGlua0xVVChjbXNIUFJPRklMRSBoUHJvZmlsZSwgaW50IEludGVudCkKK3sKKyAgICBjbXNQaXBlbGluZSogTHV0OworICAgIGNtc1RhZ1R5cGVTaWduYXR1cmUgT3JpZ2luYWxUeXBlOworICAgIGNtc1RhZ1NpZ25hdHVyZSB0YWcxNjsKKyAgICBjbXNUYWdTaWduYXR1cmUgdGFnRmxvYXQ7CisgICAgY21zQ29udGV4dCBDb250ZXh0SUQgPSBjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKTsKKworCisgICAgaWYgKEludGVudCA8IElOVEVOVF9QRVJDRVBUVUFMIHx8IEludGVudCA+IElOVEVOVF9BQlNPTFVURV9DT0xPUklNRVRSSUMpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgdGFnMTYgPSBEZXZpY2UyUENTMTZbSW50ZW50XTsKKyAgICB0YWdGbG9hdCA9IERldmljZTJQQ1NGbG9hdFtJbnRlbnRdOworCisgICAgLy8gT24gbmFtZWQgY29sb3IsIHRha2UgdGhlIGFwcHJvcHJpYXRlIHRhZworICAgIGlmIChjbXNHZXREZXZpY2VDbGFzcyhoUHJvZmlsZSkgPT0gY21zU2lnTmFtZWRDb2xvckNsYXNzKSB7CisKKyAgICAgICAgY21zTkFNRURDT0xPUkxJU1QqIG5jID0gKGNtc05BTUVEQ09MT1JMSVNUKiljbXNSZWFkVGFnKGhQcm9maWxlLCBjbXNTaWdOYW1lZENvbG9yMlRhZyk7CisKKyAgICAgICAgaWYgKG5jID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgICAgIEx1dCA9IGNtc1BpcGVsaW5lQWxsb2MoQ29udGV4dElELCAwLCAwKTsKKyAgICAgICAgaWYgKEx1dCA9PSBOVUxMKQorICAgICAgICAgICAgZ290byBFcnJvcjsKKworICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9CRUdJTiwgX2Ntc1N0YWdlQWxsb2NOYW1lZENvbG9yKG5jLCBGQUxTRSkpKQorICAgICAgICAgICAgZ290byBFcnJvcjsKKworICAgICAgICBpZiAoY21zR2V0Q29sb3JTcGFjZShoUHJvZmlsZSkgPT0gY21zU2lnTGFiRGF0YSkKKyAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgX2Ntc1N0YWdlQWxsb2NMYWJWMlRvVjQoQ29udGV4dElEKSkpCisgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKKworICAgICAgICByZXR1cm4gTHV0OworICAgIEVycm9yOgorICAgICAgICBjbXNQaXBlbGluZUZyZWUoTHV0KTsKKyAgICAgICAgY21zRnJlZU5hbWVkQ29sb3JMaXN0KG5jKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisKKyAgICBpZiAoY21zSXNUYWcoaFByb2ZpbGUsIHRhZ0Zsb2F0KSkgeyAgLy8gRmxvYXQgdGFnIHRha2VzIHByZWNlZGVuY2UKKworICAgICAgICAvLyBGbG9hdGluZyBwb2ludCBMVVQgYXJlIGFsd2F5cyBWCisgICAgICAgIHJldHVybiBfY21zUmVhZEZsb2F0RGV2aWNlbGlua1RhZyhoUHJvZmlsZSwgdGFnRmxvYXQpOworICAgIH0KKworICAgIHRhZ0Zsb2F0ID0gRGV2aWNlMlBDU0Zsb2F0WzBdOworICAgIGlmIChjbXNJc1RhZyhoUHJvZmlsZSwgdGFnRmxvYXQpKSB7CisKKyAgICAgICAgcmV0dXJuIGNtc1BpcGVsaW5lRHVwKChjbXNQaXBlbGluZSopY21zUmVhZFRhZyhoUHJvZmlsZSwgdGFnRmxvYXQpKTsKKyAgICB9CisKKyAgICBpZiAoIWNtc0lzVGFnKGhQcm9maWxlLCB0YWcxNikpIHsgIC8vIElzIHRoZXJlIGFueSBMVVQtQmFzZWQgdGFibGU/CisKKyAgICAgICAgdGFnMTYgPSBEZXZpY2UyUENTMTZbMF07CisgICAgICAgIGlmICghY21zSXNUYWcoaFByb2ZpbGUsIHRhZzE2KSkgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLy8gQ2hlY2sgcHJvZmlsZSB2ZXJzaW9uIGFuZCBMVVQgdHlwZS4gRG8gdGhlIG5lY2Vzc2FyeSBhZGp1c3RtZW50cyBpZiBuZWVkZWQKKworICAgIC8vIFJlYWQgdGhlIHRhZworICAgIEx1dCA9IChjbXNQaXBlbGluZSopY21zUmVhZFRhZyhoUHJvZmlsZSwgdGFnMTYpOworICAgIGlmIChMdXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICAvLyBUaGUgcHJvZmlsZSBvd25zIHRoZSBMdXQsIHNvIHdlIG5lZWQgdG8gY29weSBpdAorICAgIEx1dCA9IGNtc1BpcGVsaW5lRHVwKEx1dCk7CisgICAgaWYgKEx1dCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIC8vIE5vdyBpdCBpcyB0aW1lIGZvciBhIGNvbnRyb3ZlcnNpYWwgc3R1ZmYuIEkgZm91bmQgdGhhdCBmb3IgM0QgTFVUUyB1c2luZworICAgIC8vIExhYiB1c2VkIGFzIGluZGV4ZXIgc3BhY2UsICB0cmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBzaG91bGQgYmUgdXNlZAorICAgIGlmIChjbXNHZXRQQ1MoaFByb2ZpbGUpID09IGNtc1NpZ0xhYkRhdGEpCisgICAgICAgIENoYW5nZUludGVycG9sYXRpb25Ub1RyaWxpbmVhcihMdXQpOworCisgICAgLy8gQWZ0ZXIgcmVhZGluZyBpdCwgd2UgaGF2ZSBpbmZvIGFib3V0IHRoZSBvcmlnaW5hbCB0eXBlCisgICAgT3JpZ2luYWxUeXBlID0gX2Ntc0dldFRhZ1RydWVUeXBlKGhQcm9maWxlLCB0YWcxNik7CisKKyAgICAvLyBXZSBuZWVkIHRvIGFkanVzdCBkYXRhIGZvciBMYWIxNiBvbiBvdXRwdXQKKyAgICBpZiAoT3JpZ2luYWxUeXBlICE9IGNtc1NpZ0x1dDE2VHlwZSkgcmV0dXJuIEx1dDsKKworICAgIC8vIEhlcmUgaXQgaXMgcG9zc2libGUgdG8gZ2V0IExhYiBvbiBib3RoIHNpZGVzCisKKyAgICBpZiAoY21zR2V0Q29sb3JTcGFjZShoUHJvZmlsZSkgPT0gY21zU2lnTGFiRGF0YSkgeworICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9CRUdJTiwgX2Ntc1N0YWdlQWxsb2NMYWJWNFRvVjIoQ29udGV4dElEKSkpCisgICAgICAgICAgICBnb3RvIEVycm9yMjsKKyAgICB9CisKKyAgICBpZiAoY21zR2V0UENTKGhQcm9maWxlKSA9PSBjbXNTaWdMYWJEYXRhKSB7CisgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgX2Ntc1N0YWdlQWxsb2NMYWJWMlRvVjQoQ29udGV4dElEKSkpCisgICAgICAgICAgICBnb3RvIEVycm9yMjsKKyAgICB9CisKKyAgICByZXR1cm4gTHV0OworCitFcnJvcjI6CisgICAgY21zUGlwZWxpbmVGcmVlKEx1dCk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBSZXR1cm5zIFRSVUUgaWYgdGhlIHByb2ZpbGUgaXMgaW1wbGVtZW50ZWQgYXMgbWF0cml4LXNoYXBlcgorY21zQm9vbCAgQ01TRVhQT1JUIGNtc0lzTWF0cml4U2hhcGVyKGNtc0hQUk9GSUxFIGhQcm9maWxlKQoreworICAgIHN3aXRjaCAoY21zR2V0Q29sb3JTcGFjZShoUHJvZmlsZSkpIHsKKworICAgIGNhc2UgY21zU2lnR3JheURhdGE6CisKKyAgICAgICAgcmV0dXJuIGNtc0lzVGFnKGhQcm9maWxlLCBjbXNTaWdHcmF5VFJDVGFnKTsKKworICAgIGNhc2UgY21zU2lnUmdiRGF0YToKKworICAgICAgICByZXR1cm4gKGNtc0lzVGFnKGhQcm9maWxlLCBjbXNTaWdSZWRDb2xvcmFudFRhZykgJiYKKyAgICAgICAgICAgICAgICBjbXNJc1RhZyhoUHJvZmlsZSwgY21zU2lnR3JlZW5Db2xvcmFudFRhZykgJiYKKyAgICAgICAgICAgICAgICBjbXNJc1RhZyhoUHJvZmlsZSwgY21zU2lnQmx1ZUNvbG9yYW50VGFnKSAmJgorICAgICAgICAgICAgICAgIGNtc0lzVGFnKGhQcm9maWxlLCBjbXNTaWdSZWRUUkNUYWcpICYmCisgICAgICAgICAgICAgICAgY21zSXNUYWcoaFByb2ZpbGUsIGNtc1NpZ0dyZWVuVFJDVGFnKSAmJgorICAgICAgICAgICAgICAgIGNtc0lzVGFnKGhQcm9maWxlLCBjbXNTaWdCbHVlVFJDVGFnKSk7CisKKyAgICBkZWZhdWx0OgorCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9Cit9CisKKy8vIFJldHVybnMgVFJVRSBpZiB0aGUgaW50ZW50IGlzIGltcGxlbWVudGVkIGFzIENMVVQKK2Ntc0Jvb2wgIENNU0VYUE9SVCBjbXNJc0NMVVQoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsIGNtc1VJbnQzMk51bWJlciBVc2VkRGlyZWN0aW9uKQoreworICAgIGNvbnN0IGNtc1RhZ1NpZ25hdHVyZSogVGFnVGFibGU7CisKKyAgICAvLyBGb3IgZGV2aWNlbGlua3MsIHRoZSBzdXBwb3J0ZWQgaW50ZW50IGlzIHRoYXQgb25lIHN0YXRlZCBpbiB0aGUgaGVhZGVyCisgICAgaWYgKGNtc0dldERldmljZUNsYXNzKGhQcm9maWxlKSA9PSBjbXNTaWdMaW5rQ2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiAoY21zR2V0SGVhZGVyUmVuZGVyaW5nSW50ZW50KGhQcm9maWxlKSA9PSBJbnRlbnQpOworICAgIH0KKworICAgIHN3aXRjaCAoVXNlZERpcmVjdGlvbikgeworCisgICAgICAgY2FzZSBMQ01TX1VTRURfQVNfSU5QVVQ6IFRhZ1RhYmxlID0gRGV2aWNlMlBDUzE2OyBicmVhazsKKyAgICAgICBjYXNlIExDTVNfVVNFRF9BU19PVVRQVVQ6VGFnVGFibGUgPSBQQ1MyRGV2aWNlMTY7IGJyZWFrOworCisgICAgICAgLy8gRm9yIHByb29maW5nLCB3ZSBuZWVkIHJlbC4gY29sb3JpbWV0cmljIGluIG91dHB1dC4gTGV0J3MgZG8gc29tZSByZWN1cnNpb24KKyAgICAgICBjYXNlIExDTVNfVVNFRF9BU19QUk9PRjoKKyAgICAgICAgICAgcmV0dXJuIGNtc0lzSW50ZW50U3VwcG9ydGVkKGhQcm9maWxlLCBJbnRlbnQsIExDTVNfVVNFRF9BU19JTlBVVCkgJiYKKyAgICAgICAgICAgICAgICAgIGNtc0lzSW50ZW50U3VwcG9ydGVkKGhQcm9maWxlLCBJTlRFTlRfUkVMQVRJVkVfQ09MT1JJTUVUUklDLCBMQ01TX1VTRURfQVNfT1VUUFVUKTsKKworICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKGNtc0dldFByb2ZpbGVDb250ZXh0SUQoaFByb2ZpbGUpLCBjbXNFUlJPUl9SQU5HRSwgIlVuZXhwZWN0ZWQgZGlyZWN0aW9uICglZCkiLCBVc2VkRGlyZWN0aW9uKTsKKyAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBjbXNJc1RhZyhoUHJvZmlsZSwgVGFnVGFibGVbSW50ZW50XSk7CisKK30KKworCisvLyBSZXR1cm4gaW5mbyBhYm91dCBzdXBwb3J0ZWQgaW50ZW50cworY21zQm9vbCAgQ01TRVhQT1JUIGNtc0lzSW50ZW50U3VwcG9ydGVkKGNtc0hQUk9GSUxFIGhQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsIGNtc1VJbnQzMk51bWJlciBVc2VkRGlyZWN0aW9uKQoreworCisgICAgaWYgKGNtc0lzQ0xVVChoUHJvZmlsZSwgSW50ZW50LCBVc2VkRGlyZWN0aW9uKSkgcmV0dXJuIFRSVUU7CisKKyAgICAvLyBJcyB0aGVyZSBhbnkgbWF0cml4LXNoYXBlcj8gSWYgc28sIHRoZSBpbnRlbnQgaXMgc3VwcG9ydGVkLiBUaGlzIGlzIGEgYml0IG9kZCwgc2luY2UgVjIgbWF0cml4IHNoYXBlcgorICAgIC8vIGRvZXMgbm90IGZ1bGx5IHN1cHBvcnQgcmVsYXRpdmUgY29sb3JpbWV0cmljIGJlY2F1c2UgdGhleSBjYW5ub3QgZGVhbCB3aXRoIG5vbi16ZXJvIGJsYWNrIHBvaW50cywgYnV0CisgICAgLy8gbWFueSBwcm9maWxlcyBjbGFpbXMgdGhhdCwgYW5kIHRoaXMgaXMgY2VydGFpbmx5IG5vdCB0cnVlIGZvciBWNCBwcm9maWxlcy4gTGV0cyBhbnN3ZXIgInllcyIgbm8gbWF0dGVyCisgICAgLy8gdGhlIGFjY3VyYWN5IHdvdWxkIGJlIGxlc3MgdGhhbiBvcHRpbWFsIGluIHJlbC5jb2wgYW5kIHYyIGNhc2UuCisKKyAgICByZXR1cm4gY21zSXNNYXRyaXhTaGFwZXIoaFByb2ZpbGUpOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBSZWFkIGJvdGgsIHByb2ZpbGUgc2VxdWVuY2UgZGVzY3JpcHRpb24gYW5kIHByb2ZpbGUgc2VxdWVuY2UgaWQgaWYgcHJlc2VudC4gVGhlbiBjb21iaW5lIGJvdGggdG8KKy8vIGNyZWF0ZSBxYSB1bmlxdWUgc3RydWN0dXJlIGhvbGRpbmcgYm90aC4gU2hhbWUgb24gSUNDIHRvIHN0b3JlIHRoaW5ncyBpbiBzdWNoIGNvbXBsaWNhdGVkIHdheS4KK2Ntc1NFUSogX2Ntc1JlYWRQcm9maWxlU2VxdWVuY2UoY21zSFBST0ZJTEUgaFByb2ZpbGUpCit7CisgICAgY21zU0VRKiBQcm9maWxlU2VxOworICAgIGNtc1NFUSogUHJvZmlsZUlkOworICAgIGNtc1NFUSogTmV3U2VxOworICAgIGNtc1VJbnQzMk51bWJlciBpOworCisgICAgLy8gVGFrZSBwcm9maWxlIHNlcXVlbmNlIGRlc2NyaXB0aW9uIGZpcnN0CisgICAgUHJvZmlsZVNlcSA9IChjbXNTRVEqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCBjbXNTaWdQcm9maWxlU2VxdWVuY2VEZXNjVGFnKTsKKworICAgIC8vIFRha2UgcHJvZmlsZSBzZXF1ZW5jZSBJRAorICAgIFByb2ZpbGVJZCAgPSAoY21zU0VRKikgY21zUmVhZFRhZyhoUHJvZmlsZSwgY21zU2lnUHJvZmlsZVNlcXVlbmNlSWRUYWcpOworCisgICAgaWYgKFByb2ZpbGVTZXEgPT0gTlVMTCAmJiBQcm9maWxlSWQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoUHJvZmlsZVNlcSA9PSBOVUxMKSByZXR1cm4gY21zRHVwUHJvZmlsZVNlcXVlbmNlRGVzY3JpcHRpb24oUHJvZmlsZUlkKTsKKyAgICBpZiAoUHJvZmlsZUlkICA9PSBOVUxMKSByZXR1cm4gY21zRHVwUHJvZmlsZVNlcXVlbmNlRGVzY3JpcHRpb24oUHJvZmlsZVNlcSk7CisKKyAgICAvLyBXZSBoYXZlIHRvIG1peCBib3RoIHRvZ2V0aGVyLiBGb3IgdGhhdCB0aGV5IG11c3QgYWdyZWUKKyAgICBpZiAoUHJvZmlsZVNlcSAtPm4gIT0gUHJvZmlsZUlkIC0+bikgcmV0dXJuIGNtc0R1cFByb2ZpbGVTZXF1ZW5jZURlc2NyaXB0aW9uKFByb2ZpbGVTZXEpOworCisgICAgTmV3U2VxID0gY21zRHVwUHJvZmlsZVNlcXVlbmNlRGVzY3JpcHRpb24oUHJvZmlsZVNlcSk7CisKKyAgICAvLyBPaywgcHJvY2VlZCB0byB0aGUgbWl4aW5nCisgICAgaWYgKE5ld1NlcSAhPSBOVUxMKSB7CisgICAgICAgIGZvciAoaT0wOyBpIDwgUHJvZmlsZVNlcSAtPm47IGkrKykgeworCisgICAgICAgICAgICBtZW1tb3ZlKCZOZXdTZXEgLT5zZXFbaV0uUHJvZmlsZUlELCAmUHJvZmlsZUlkIC0+c2VxW2ldLlByb2ZpbGVJRCwgc2l6ZW9mKGNtc1Byb2ZpbGVJRCkpOworICAgICAgICAgICAgTmV3U2VxIC0+c2VxW2ldLkRlc2NyaXB0aW9uID0gY21zTUxVZHVwKFByb2ZpbGVJZCAtPnNlcVtpXS5EZXNjcmlwdGlvbik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5ld1NlcTsKK30KKworLy8gRHVtcCB0aGUgY29udGVudHMgb2YgcHJvZmlsZSBzZXF1ZW5jZSBpbiBib3RoIHRhZ3MgKGlmIHY0IGF2YWlsYWJsZSkKK2Ntc0Jvb2wgX2Ntc1dyaXRlUHJvZmlsZVNlcXVlbmNlKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjb25zdCBjbXNTRVEqIHNlcSkKK3sKKyAgICBpZiAoIWNtc1dyaXRlVGFnKGhQcm9maWxlLCBjbXNTaWdQcm9maWxlU2VxdWVuY2VEZXNjVGFnLCBzZXEpKSByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoY21zR2V0RW5jb2RlZElDQ3ZlcnNpb24oaFByb2ZpbGUpID49IDB4NDAwMDAwMCkgeworCisgICAgICAgICAgICBpZiAoIWNtc1dyaXRlVGFnKGhQcm9maWxlLCBjbXNTaWdQcm9maWxlU2VxdWVuY2VJZFRhZywgc2VxKSkgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisKKy8vIEF1eGlsaWFyeSwgcmVhZCBhbmQgZHVwbGljYXRlIGEgTUxVIGlmIGZvdW5kLgorc3RhdGljCitjbXNNTFUqIEdldE1MVUZyb21Qcm9maWxlKGNtc0hQUk9GSUxFIGgsIGNtc1RhZ1NpZ25hdHVyZSBzaWcpCit7CisgICAgY21zTUxVKiBtbHUgPSAoY21zTUxVKikgY21zUmVhZFRhZyhoLCBzaWcpOworICAgIGlmIChtbHUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICByZXR1cm4gY21zTUxVZHVwKG1sdSk7Cit9CisKKy8vIENyZWF0ZSBhIHNlcXVlbmNlIGRlc2NyaXB0aW9uIG91dCBvZiBhbiBhcnJheSBvZiBwcm9maWxlcworY21zU0VRKiBfY21zQ29tcGlsZVByb2ZpbGVTZXF1ZW5jZShjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIG5Qcm9maWxlcywgY21zSFBST0ZJTEUgaFByb2ZpbGVzW10pCit7CisgICAgY21zVUludDMyTnVtYmVyIGk7CisgICAgY21zU0VRKiBzZXEgPSBjbXNBbGxvY1Byb2ZpbGVTZXF1ZW5jZURlc2NyaXB0aW9uKENvbnRleHRJRCwgblByb2ZpbGVzKTsKKworICAgIGlmIChzZXEgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKGk9MDsgaSA8IG5Qcm9maWxlczsgaSsrKSB7CisKKyAgICAgICAgY21zUFNFUURFU0MqIHBzID0gJnNlcSAtPnNlcVtpXTsKKyAgICAgICAgY21zSFBST0ZJTEUgaCA9IGhQcm9maWxlc1tpXTsKKyAgICAgICAgY21zVGVjaG5vbG9neVNpZ25hdHVyZSogdGVjaHB0OworCisgICAgICAgIGNtc0dldEhlYWRlckF0dHJpYnV0ZXMoaCwgJnBzIC0+YXR0cmlidXRlcyk7CisgICAgICAgIGNtc0dldEhlYWRlclByb2ZpbGVJRChoLCBwcyAtPlByb2ZpbGVJRC5JRDgpOworICAgICAgICBwcyAtPmRldmljZU1mZyAgID0gY21zR2V0SGVhZGVyTWFudWZhY3R1cmVyKGgpOworICAgICAgICBwcyAtPmRldmljZU1vZGVsID0gY21zR2V0SGVhZGVyTW9kZWwoaCk7CisKKyAgICAgICAgdGVjaHB0ID0gKGNtc1RlY2hub2xvZ3lTaWduYXR1cmUqKSBjbXNSZWFkVGFnKGgsIGNtc1NpZ1RlY2hub2xvZ3lUYWcpOworICAgICAgICBpZiAodGVjaHB0ID09IE5VTEwpCisgICAgICAgICAgICBwcyAtPnRlY2hub2xvZ3kgICA9ICAoY21zVGVjaG5vbG9neVNpZ25hdHVyZSkgMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHMgLT50ZWNobm9sb2d5ICAgPSAqdGVjaHB0OworCisgICAgICAgIHBzIC0+TWFudWZhY3R1cmVyID0gR2V0TUxVRnJvbVByb2ZpbGUoaCwgIGNtc1NpZ0RldmljZU1mZ0Rlc2NUYWcpOworICAgICAgICBwcyAtPk1vZGVsICAgICAgICA9IEdldE1MVUZyb21Qcm9maWxlKGgsICBjbXNTaWdEZXZpY2VNb2RlbERlc2NUYWcpOworICAgICAgICBwcyAtPkRlc2NyaXB0aW9uICA9IEdldE1MVUZyb21Qcm9maWxlKGgsIGNtc1NpZ1Byb2ZpbGVEZXNjcmlwdGlvblRhZyk7CisKKyAgICB9CisKKyAgICByZXR1cm4gc2VxOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworc3RhdGljCitjb25zdCBjbXNNTFUqIEdldEluZm8oY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc0luZm9UeXBlIEluZm8pCit7CisgICAgY21zVGFnU2lnbmF0dXJlIHNpZzsKKworICAgIHN3aXRjaCAoSW5mbykgeworCisgICAgY2FzZSBjbXNJbmZvRGVzY3JpcHRpb246CisgICAgICAgIHNpZyA9IGNtc1NpZ1Byb2ZpbGVEZXNjcmlwdGlvblRhZzsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGNtc0luZm9NYW51ZmFjdHVyZXI6CisgICAgICAgIHNpZyA9IGNtc1NpZ0RldmljZU1mZ0Rlc2NUYWc7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBjbXNJbmZvTW9kZWw6CisgICAgICAgIHNpZyA9IGNtc1NpZ0RldmljZU1vZGVsRGVzY1RhZzsKKyAgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBjbXNJbmZvQ29weXJpZ2h0OgorICAgICAgICBzaWcgPSBjbXNTaWdDb3B5cmlnaHRUYWc7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDogcmV0dXJuIE5VTEw7CisgICAgfQorCisKKyAgICByZXR1cm4gKGNtc01MVSopIGNtc1JlYWRUYWcoaFByb2ZpbGUsIHNpZyk7Cit9CisKKworCitjbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0dldFByb2ZpbGVJbmZvKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNJbmZvVHlwZSBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIExhbmd1YWdlQ29kZVszXSwgY29uc3QgY2hhciBDb3VudHJ5Q29kZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCogQnVmZmVyLCBjbXNVSW50MzJOdW1iZXIgQnVmZmVyU2l6ZSkKK3sKKyAgICBjb25zdCBjbXNNTFUqIG1sdSA9IEdldEluZm8oaFByb2ZpbGUsIEluZm8pOworICAgIGlmIChtbHUgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gY21zTUxVZ2V0V2lkZShtbHUsIExhbmd1YWdlQ29kZSwgQ291bnRyeUNvZGUsIEJ1ZmZlciwgQnVmZmVyU2l6ZSk7Cit9CisKKworY21zVUludDMyTnVtYmVyICBDTVNFWFBPUlQgY21zR2V0UHJvZmlsZUluZm9BU0NJSShjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zSW5mb1R5cGUgSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIExhbmd1YWdlQ29kZVszXSwgY29uc3QgY2hhciBDb3VudHJ5Q29kZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBCdWZmZXIsIGNtc1VJbnQzMk51bWJlciBCdWZmZXJTaXplKQoreworICAgIGNvbnN0IGNtc01MVSogbWx1ID0gR2V0SW5mbyhoUHJvZmlsZSwgSW5mbyk7CisgICAgaWYgKG1sdSA9PSBOVUxMKSByZXR1cm4gMDsKKworICAgIHJldHVybiBjbXNNTFVnZXRBU0NJSShtbHUsIExhbmd1YWdlQ29kZSwgQ291bnRyeUNvZGUsIEJ1ZmZlciwgQnVmZmVyU2l6ZSk7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNsdXQuYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc2x1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNTgxNTkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNsdXQuYwpAQCAtMCwwICsxLDE4MzkgQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8KKy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisvLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKKy8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisvLworLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKy8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorLy8KKy8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCisvLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQorLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisvLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKworI2luY2x1ZGUgImxjbXMyX2ludGVybmFsLmgiCisKKworLy8gQWxsb2NhdGVzIGFuIGVtcHR5IG11bHRpIHByb2ZpbGUgZWxlbWVudAorY21zU3RhZ2UqIENNU0VYUE9SVCBfY21zU3RhZ2VBbGxvY1BsYWNlaG9sZGVyKGNtc0NvbnRleHQgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNTdGFnZVNpZ25hdHVyZSBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW5wdXRDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIE91dHB1dENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY21zU3RhZ2VFdmFsRm4gICAgIEV2YWxQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jbXNTdGFnZUR1cEVsZW1GbiAgRHVwRWxlbVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Ntc1N0YWdlRnJlZUVsZW1GbiBGcmVlUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICBEYXRhKQoreworICAgIGNtc1N0YWdlKiBwaCA9IChjbXNTdGFnZSopIF9jbXNNYWxsb2NaZXJvKENvbnRleHRJRCwgc2l6ZW9mKGNtc1N0YWdlKSk7CisKKyAgICBpZiAocGggPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKworICAgIHBoIC0+Q29udGV4dElEID0gQ29udGV4dElEOworCisgICAgcGggLT5UeXBlICAgICAgID0gVHlwZTsKKyAgICBwaCAtPkltcGxlbWVudHMgPSBUeXBlOyAgIC8vIEJ5IGRlZmF1bHQsIG5vIGNsdWUgb24gd2hhdCBpcyBpbXBsZW1lbnRpbmcKKworICAgIHBoIC0+SW5wdXRDaGFubmVscyAgPSBJbnB1dENoYW5uZWxzOworICAgIHBoIC0+T3V0cHV0Q2hhbm5lbHMgPSBPdXRwdXRDaGFubmVsczsKKyAgICBwaCAtPkV2YWxQdHIgICAgICAgID0gRXZhbFB0cjsKKyAgICBwaCAtPkR1cEVsZW1QdHIgICAgID0gRHVwRWxlbVB0cjsKKyAgICBwaCAtPkZyZWVQdHIgICAgICAgID0gRnJlZVB0cjsKKyAgICBwaCAtPkRhdGEgICAgICAgICAgID0gRGF0YTsKKworICAgIHJldHVybiBwaDsKK30KKworCitzdGF0aWMKK3ZvaWQgRXZhbHVhdGVJZGVudGl0eShjb25zdCBjbXNGbG9hdDMyTnVtYmVyIEluW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciBPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNTdGFnZSAqbXBlKQoreworICAgIG1lbW1vdmUoT3V0LCBJbiwgbXBlIC0+SW5wdXRDaGFubmVscyAqIHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKSk7Cit9CisKKworY21zU3RhZ2UqIENNU0VYUE9SVCBjbXNTdGFnZUFsbG9jSWRlbnRpdHkoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBuQ2hhbm5lbHMpCit7CisgICAgcmV0dXJuIF9jbXNTdGFnZUFsbG9jUGxhY2Vob2xkZXIoQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNTaWdJZGVudGl0eUVsZW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsIG5DaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZhbHVhdGVJZGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgfQorCisvLyBDb252ZXJzaW9uIGZ1bmN0aW9ucy4gRnJvbSBmbG9hdGluZyBwb2ludCB0byAxNiBiaXRzCitzdGF0aWMKK3ZvaWQgRnJvbUZsb2F0VG8xNihjb25zdCBjbXNGbG9hdDMyTnVtYmVyIEluW10sIGNtc1VJbnQxNk51bWJlciBPdXRbXSwgY21zVUludDMyTnVtYmVyIG4pCit7CisgICAgY21zVUludDMyTnVtYmVyIGk7CisKKyAgICBmb3IgKGk9MDsgaSA8IG47IGkrKykgeworICAgICAgICBPdXRbaV0gPSBfY21zUXVpY2tTYXR1cmF0ZVdvcmQoSW5baV0gKiA2NTUzNS4wKTsKKyAgICB9Cit9CisKKy8vIEZyb20gMTYgYml0cyB0byBmbG9hdGluZyBwb2ludAorc3RhdGljCit2b2lkIEZyb20xNlRvRmxvYXQoY29uc3QgY21zVUludDE2TnVtYmVyIEluW10sIGNtc0Zsb2F0MzJOdW1iZXIgT3V0W10sIGNtc1VJbnQzMk51bWJlciBuKQoreworICAgIGNtc1VJbnQzMk51bWJlciBpOworCisgICAgZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgT3V0W2ldID0gKGNtc0Zsb2F0MzJOdW1iZXIpIEluW2ldIC8gNjU1MzUuMEY7CisgICAgfQorfQorCisKKy8vIFRoaXMgZnVuY3Rpb24gaXMgcXVpdGUgdXNlZnVsIHRvIGFuYWx5emUgdGhlIHN0cnVjdHVyZSBvZiBhIExVVCBhbmQgcmV0cmlldmUgdGhlIE1QRSBlbGVtZW50cworLy8gdGhhdCBjb25mb3JtIHRoZSBMVVQuIEl0IHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgTFVULCB0aGUgbnVtYmVyIG9mIGV4cGVjdGVkIGVsZW1lbnRzIGFuZAorLy8gdGhlbiBhIGxpc3Qgb2YgZXhwZWN0ZWQgdHlwZXMgZm9sbG93ZWQgd2l0aCBhIGxpc3Qgb2YgY21zRmxvYXQ2NE51bWJlciBwb2ludGVycyB0byBNUEUgZWxlbWVudHMuIElmCisvLyB0aGUgZnVuY3Rpb24gZm91bmRzIGEgbWF0Y2ggd2l0aCBjdXJyZW50IHBpcGVsaW5lLCBpdCBmaWxscyB0aGUgcG9pbnRlcnMgYW5kIHJldHVybnMgVFJVRQorLy8gaWYgbm90LCByZXR1cm5zIEZBTFNFIHdpdGhvdXQgdG91Y2hpbmcgYW55dGhpbmcuIFNldHRpbmcgcG9pbnRlcnMgdG8gTlVMTCBkb2VzIGJ5cGFzcworLy8gdGhlIHN0b3JhZ2UgcHJvY2Vzcy4KK2Ntc0Jvb2wgIENNU0VYUE9SVCBjbXNQaXBlbGluZUNoZWNrQW5kUmV0cmVpdmVTdGFnZXMoY29uc3QgY21zUGlwZWxpbmUqIEx1dCwgY21zVUludDMyTnVtYmVyIG4sIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgY21zVUludDMyTnVtYmVyIGk7CisgICAgY21zU3RhZ2UqIG1wZTsKKyAgICBjbXNTdGFnZVNpZ25hdHVyZSBUeXBlOworICAgIHZvaWQqKiBFbGVtUHRyOworCisgICAgLy8gTWFrZSBzdXJlIHNhbWUgbnVtYmVyIG9mIGVsZW1lbnRzCisgICAgaWYgKGNtc1BpcGVsaW5lU3RhZ2VDb3VudChMdXQpICE9IG4pIHJldHVybiBGQUxTRTsKKworICAgIHZhX3N0YXJ0KGFyZ3MsIG4pOworCisgICAgLy8gSXRlcmF0ZSBhY3Jvc3MgYXNrZWQgdHlwZXMKKyAgICBtcGUgPSBMdXQgLT5FbGVtZW50czsKKyAgICBmb3IgKGk9MDsgaSA8IG47IGkrKykgeworCisgICAgICAgIC8vIEdldCBhc2tlZCB0eXBlCisgICAgICAgIFR5cGUgID0gKGNtc1N0YWdlU2lnbmF0dXJlKXZhX2FyZyhhcmdzLCBjbXNTdGFnZVNpZ25hdHVyZSk7CisgICAgICAgIGlmIChtcGUgLT5UeXBlICE9IFR5cGUpIHsKKworICAgICAgICAgICAgdmFfZW5kKGFyZ3MpOyAgICAgICAvLyBNaXNtYXRjaC4gV2UgYXJlIGRvbmUuCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbXBlID0gbXBlIC0+TmV4dDsKKyAgICB9CisKKyAgICAvLyBGb3VuZCBhIGNvbWJpbmF0aW9uLCBmaWxsIHBvaW50ZXJzIGlmIG5vdCBOVUxMCisgICAgbXBlID0gTHV0IC0+RWxlbWVudHM7CisgICAgZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKKworICAgICAgICBFbGVtUHRyID0gdmFfYXJnKGFyZ3MsIHZvaWQqKik7CisgICAgICAgIGlmIChFbGVtUHRyICE9IE5VTEwpCisgICAgICAgICAgICAqRWxlbVB0ciA9IG1wZTsKKworICAgICAgICBtcGUgPSBtcGUgLT5OZXh0OworICAgIH0KKworICAgIHZhX2VuZChhcmdzKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gQmVsb3cgdGhlcmUgYXJlIGltcGxlbWVudGF0aW9ucyBmb3Igc2V2ZXJhbCB0eXBlcyBvZiBlbGVtZW50cy4gRWFjaCB0eXBlIG1heSBiZSBpbXBsZW1lbnRlZCBieSBhCisvLyBldmFsdWF0aW9uIGZ1bmN0aW9uLCBhIGR1cGxpY2F0aW9uIGZ1bmN0aW9uLCBhIGZ1bmN0aW9uIHRvIGZyZWUgcmVzb3VyY2VzIGFuZCBhIGNvbnN0cnVjdG9yLgorCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBUeXBlIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUgKGN1cnZlcykKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworY21zVG9uZUN1cnZlKiogX2Ntc1N0YWdlR2V0UHRyVG9DdXJ2ZVNldChjb25zdCBjbXNTdGFnZSogbXBlKQoreworICAgIF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKiBEYXRhID0gKF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKikgbXBlIC0+RGF0YTsKKworICAgIHJldHVybiBEYXRhIC0+VGhlQ3VydmVzOworfQorCitzdGF0aWMKK3ZvaWQgRXZhbHVhdGVDdXJ2ZXMoY29uc3QgY21zRmxvYXQzMk51bWJlciBJbltdLAorICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIE91dFtdLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNTdGFnZSAqbXBlKQoreworICAgIF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKiBEYXRhOworICAgIGNtc1VJbnQzMk51bWJlciBpOworCisgICAgX2Ntc0Fzc2VydChtcGUgIT0gTlVMTCk7CisKKyAgICBEYXRhID0gKF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKikgbXBlIC0+RGF0YTsKKyAgICBpZiAoRGF0YSA9PSBOVUxMKSByZXR1cm47CisKKyAgICBpZiAoRGF0YSAtPlRoZUN1cnZlcyA9PSBOVUxMKSByZXR1cm47CisKKyAgICBmb3IgKGk9MDsgaSA8IERhdGEgLT5uQ3VydmVzOyBpKyspIHsKKyAgICAgICAgT3V0W2ldID0gY21zRXZhbFRvbmVDdXJ2ZUZsb2F0KERhdGEgLT5UaGVDdXJ2ZXNbaV0sIEluW2ldKTsKKyAgICB9Cit9CisKK3N0YXRpYwordm9pZCBDdXJ2ZVNldEVsZW1UeXBlRnJlZShjbXNTdGFnZSogbXBlKQoreworICAgIF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKiBEYXRhOworICAgIGNtc1VJbnQzMk51bWJlciBpOworCisgICAgX2Ntc0Fzc2VydChtcGUgIT0gTlVMTCk7CisKKyAgICBEYXRhID0gKF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKikgbXBlIC0+RGF0YTsKKyAgICBpZiAoRGF0YSA9PSBOVUxMKSByZXR1cm47CisKKyAgICBpZiAoRGF0YSAtPlRoZUN1cnZlcyAhPSBOVUxMKSB7CisgICAgICAgIGZvciAoaT0wOyBpIDwgRGF0YSAtPm5DdXJ2ZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKERhdGEgLT5UaGVDdXJ2ZXNbaV0gIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBjbXNGcmVlVG9uZUN1cnZlKERhdGEgLT5UaGVDdXJ2ZXNbaV0pOworICAgICAgICB9CisgICAgfQorICAgIF9jbXNGcmVlKG1wZSAtPkNvbnRleHRJRCwgRGF0YSAtPlRoZUN1cnZlcyk7CisgICAgX2Ntc0ZyZWUobXBlIC0+Q29udGV4dElELCBEYXRhKTsKK30KKworCitzdGF0aWMKK3ZvaWQqIEN1cnZlU2V0RHVwKGNtc1N0YWdlKiBtcGUpCit7CisgICAgX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqIERhdGEgPSAoX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqKSBtcGUgLT5EYXRhOworICAgIF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKiBOZXdFbGVtOworICAgIGNtc1VJbnQzMk51bWJlciBpOworCisgICAgTmV3RWxlbSA9IChfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSopIF9jbXNNYWxsb2NaZXJvKG1wZSAtPkNvbnRleHRJRCwgc2l6ZW9mKF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKSk7CisgICAgaWYgKE5ld0VsZW0gPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBOZXdFbGVtIC0+bkN1cnZlcyAgID0gRGF0YSAtPm5DdXJ2ZXM7CisgICAgTmV3RWxlbSAtPlRoZUN1cnZlcyA9IChjbXNUb25lQ3VydmUqKikgX2Ntc0NhbGxvYyhtcGUgLT5Db250ZXh0SUQsIE5ld0VsZW0gLT5uQ3VydmVzLCBzaXplb2YoY21zVG9uZUN1cnZlKikpOworCisgICAgaWYgKE5ld0VsZW0gLT5UaGVDdXJ2ZXMgPT0gTlVMTCkgZ290byBFcnJvcjsKKworICAgIGZvciAoaT0wOyBpIDwgTmV3RWxlbSAtPm5DdXJ2ZXM7IGkrKykgeworCisgICAgICAgIC8vIER1cGxpY2F0ZSBlYWNoIGN1cnZlLiBJdCBtYXkgZmFpbC4KKyAgICAgICAgTmV3RWxlbSAtPlRoZUN1cnZlc1tpXSA9IGNtc0R1cFRvbmVDdXJ2ZShEYXRhIC0+VGhlQ3VydmVzW2ldKTsKKyAgICAgICAgaWYgKE5ld0VsZW0gLT5UaGVDdXJ2ZXNbaV0gPT0gTlVMTCkgZ290byBFcnJvcjsKKworCisgICAgfQorICAgIHJldHVybiAodm9pZCopIE5ld0VsZW07CisKK0Vycm9yOgorCisgICAgaWYgKE5ld0VsZW0gLT5UaGVDdXJ2ZXMgIT0gTlVMTCkgeworICAgICAgICBmb3IgKGk9MDsgaSA8IE5ld0VsZW0gLT5uQ3VydmVzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChOZXdFbGVtIC0+VGhlQ3VydmVzW2ldKQorICAgICAgICAgICAgICAgIGNtc0ZyZWVUb25lQ3VydmUoTmV3RWxlbSAtPlRoZUN1cnZlc1tpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgX2Ntc0ZyZWUobXBlIC0+Q29udGV4dElELCBOZXdFbGVtIC0+VGhlQ3VydmVzKTsKKyAgICBfY21zRnJlZShtcGUgLT5Db250ZXh0SUQsIE5ld0VsZW0pOworICAgIHJldHVybiBOVUxMOworfQorCisKKy8vIEN1cnZlcyA9PSBOVUxMIGZvcmNlcyBpZGVudGl0eSBjdXJ2ZXMKK2Ntc1N0YWdlKiBDTVNFWFBPUlQgY21zU3RhZ2VBbGxvY1RvbmVDdXJ2ZXMoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBuQ2hhbm5lbHMsIGNtc1RvbmVDdXJ2ZSogY29uc3QgQ3VydmVzW10pCit7CisgICAgY21zVUludDMyTnVtYmVyIGk7CisgICAgX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqIE5ld0VsZW07CisgICAgY21zU3RhZ2UqIE5ld01QRTsKKworCisgICAgTmV3TVBFID0gX2Ntc1N0YWdlQWxsb2NQbGFjZWhvbGRlcihDb250ZXh0SUQsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsIG5DaGFubmVscywgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2YWx1YXRlQ3VydmVzLCBDdXJ2ZVNldER1cCwgQ3VydmVTZXRFbGVtVHlwZUZyZWUsIE5VTEwgKTsKKyAgICBpZiAoTmV3TVBFID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgTmV3RWxlbSA9IChfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSopIF9jbXNNYWxsb2NaZXJvKENvbnRleHRJRCwgc2l6ZW9mKF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKSk7CisgICAgaWYgKE5ld0VsZW0gPT0gTlVMTCkgeworICAgICAgICBjbXNTdGFnZUZyZWUoTmV3TVBFKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgTmV3TVBFIC0+RGF0YSAgPSAodm9pZCopIE5ld0VsZW07CisKKyAgICBOZXdFbGVtIC0+bkN1cnZlcyAgID0gbkNoYW5uZWxzOworICAgIE5ld0VsZW0gLT5UaGVDdXJ2ZXMgPSAoY21zVG9uZUN1cnZlKiopIF9jbXNDYWxsb2MoQ29udGV4dElELCBuQ2hhbm5lbHMsIHNpemVvZihjbXNUb25lQ3VydmUqKSk7CisgICAgaWYgKE5ld0VsZW0gLT5UaGVDdXJ2ZXMgPT0gTlVMTCkgeworICAgICAgICBjbXNTdGFnZUZyZWUoTmV3TVBFKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yIChpPTA7IGkgPCBuQ2hhbm5lbHM7IGkrKykgeworCisgICAgICAgIGlmIChDdXJ2ZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgTmV3RWxlbSAtPlRoZUN1cnZlc1tpXSA9IGNtc0J1aWxkR2FtbWEoQ29udGV4dElELCAxLjApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTmV3RWxlbSAtPlRoZUN1cnZlc1tpXSA9IGNtc0R1cFRvbmVDdXJ2ZShDdXJ2ZXNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKE5ld0VsZW0gLT5UaGVDdXJ2ZXNbaV0gPT0gTlVMTCkgeworICAgICAgICAgICAgY21zU3RhZ2VGcmVlKE5ld01QRSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgfQorCisgICByZXR1cm4gTmV3TVBFOworfQorCisKKy8vIENyZWF0ZSBhIGJ1bmNoIG9mIGlkZW50aXR5IGN1cnZlcworY21zU3RhZ2UqIF9jbXNTdGFnZUFsbG9jSWRlbnRpdHlDdXJ2ZXMoY21zQ29udGV4dCBDb250ZXh0SUQsIGludCBuQ2hhbm5lbHMpCit7CisgICAgY21zU3RhZ2UqIG1wZSA9IGNtc1N0YWdlQWxsb2NUb25lQ3VydmVzKENvbnRleHRJRCwgbkNoYW5uZWxzLCBOVUxMKTsKKworICAgIGlmIChtcGUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgbXBlIC0+SW1wbGVtZW50cyA9IGNtc1NpZ0lkZW50aXR5RWxlbVR5cGU7CisgICAgcmV0dXJuIG1wZTsKK30KKworCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBUeXBlIGNtc1NpZ01hdHJpeEVsZW1UeXBlIChNYXRyaWNlcykKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCisvLyBTcGVjaWFsIGNhcmUgc2hvdWxkIGJlIHRha2VuIGhlcmUgYmVjYXVzZSBwcmVjaXNpb24gbG9zcy4gQSB0ZW1wb3JhcnkgY21zRmxvYXQ2NE51bWJlciBidWZmZXIgaXMgYmVpbmcgdXNlZAorc3RhdGljCit2b2lkIEV2YWx1YXRlTWF0cml4KGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIgSW5bXSwKKyAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciBPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zU3RhZ2UgKm1wZSkKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgaSwgajsKKyAgICBfY21zU3RhZ2VNYXRyaXhEYXRhKiBEYXRhID0gKF9jbXNTdGFnZU1hdHJpeERhdGEqKSBtcGUgLT5EYXRhOworICAgIGNtc0Zsb2F0NjROdW1iZXIgVG1wOworCisgICAgLy8gSW5wdXQgaXMgYWxyZWFkeSBpbiAwLi4xLjAgbm90YXRpb24KKyAgICBmb3IgKGk9MDsgaSA8IG1wZSAtPk91dHB1dENoYW5uZWxzOyBpKyspIHsKKworICAgICAgICBUbXAgPSAwOworICAgICAgICBmb3IgKGo9MDsgaiA8IG1wZS0+SW5wdXRDaGFubmVsczsgaisrKSB7CisgICAgICAgICAgICBUbXAgKz0gSW5bal0gKiBEYXRhLT5Eb3VibGVbaSptcGUtPklucHV0Q2hhbm5lbHMgKyBqXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChEYXRhIC0+T2Zmc2V0ICE9IE5VTEwpCisgICAgICAgICAgICBUbXAgKz0gRGF0YS0+T2Zmc2V0W2ldOworCisgICAgICAgIE91dFtpXSA9IChjbXNGbG9hdDMyTnVtYmVyKSBUbXA7CisgICAgfQorCisKKyAgICAvLyBPdXRwdXQgaW4gMC4uMS4wIGRvbWFpbgorfQorCisKKy8vIER1cGxpY2F0ZSBhIHlldC1leGlzdGluZyBtYXRyaXggZWxlbWVudAorc3RhdGljCit2b2lkKiBNYXRyaXhFbGVtRHVwKGNtc1N0YWdlKiBtcGUpCit7CisgICAgX2Ntc1N0YWdlTWF0cml4RGF0YSogRGF0YSA9IChfY21zU3RhZ2VNYXRyaXhEYXRhKikgbXBlIC0+RGF0YTsKKyAgICBfY21zU3RhZ2VNYXRyaXhEYXRhKiBOZXdFbGVtOworICAgIGNtc1VJbnQzMk51bWJlciBzejsKKworICAgIE5ld0VsZW0gPSAoX2Ntc1N0YWdlTWF0cml4RGF0YSopIF9jbXNNYWxsb2NaZXJvKG1wZSAtPkNvbnRleHRJRCwgc2l6ZW9mKF9jbXNTdGFnZU1hdHJpeERhdGEpKTsKKyAgICBpZiAoTmV3RWxlbSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIHN6ID0gbXBlIC0+SW5wdXRDaGFubmVscyAqIG1wZSAtPk91dHB1dENoYW5uZWxzOworCisgICAgTmV3RWxlbSAtPkRvdWJsZSA9IChjbXNGbG9hdDY0TnVtYmVyKikgX2Ntc0R1cE1lbShtcGUgLT5Db250ZXh0SUQsIERhdGEgLT5Eb3VibGUsIHN6ICogc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpKSA7CisKKyAgICBpZiAoRGF0YSAtPk9mZnNldCkKKyAgICAgICAgTmV3RWxlbSAtPk9mZnNldCA9IChjbXNGbG9hdDY0TnVtYmVyKikgX2Ntc0R1cE1lbShtcGUgLT5Db250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhIC0+T2Zmc2V0LCBtcGUgLT4gT3V0cHV0Q2hhbm5lbHMgKiBzaXplb2YoY21zRmxvYXQ2NE51bWJlcikpIDsKKworICAgIHJldHVybiAodm9pZCopIE5ld0VsZW07Cit9CisKKworc3RhdGljCit2b2lkIE1hdHJpeEVsZW1UeXBlRnJlZShjbXNTdGFnZSogbXBlKQoreworICAgIF9jbXNTdGFnZU1hdHJpeERhdGEqIERhdGEgPSAoX2Ntc1N0YWdlTWF0cml4RGF0YSopIG1wZSAtPkRhdGE7CisgICAgaWYgKERhdGEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChEYXRhIC0+RG91YmxlKQorICAgICAgICBfY21zRnJlZShtcGUgLT5Db250ZXh0SUQsIERhdGEgLT5Eb3VibGUpOworCisgICAgaWYgKERhdGEgLT5PZmZzZXQpCisgICAgICAgIF9jbXNGcmVlKG1wZSAtPkNvbnRleHRJRCwgRGF0YSAtPk9mZnNldCk7CisKKyAgICBfY21zRnJlZShtcGUgLT5Db250ZXh0SUQsIG1wZSAtPkRhdGEpOworfQorCisKKworY21zU3RhZ2UqICBDTVNFWFBPUlQgY21zU3RhZ2VBbGxvY01hdHJpeChjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIFJvd3MsIGNtc1VJbnQzMk51bWJlciBDb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIqIE1hdHJpeCwgY29uc3QgY21zRmxvYXQ2NE51bWJlciogT2Zmc2V0KQoreworICAgIGNtc1VJbnQzMk51bWJlciBpLCBuOworICAgIF9jbXNTdGFnZU1hdHJpeERhdGEqIE5ld0VsZW07CisgICAgY21zU3RhZ2UqIE5ld01QRTsKKworICAgIG4gPSBSb3dzICogQ29sczsKKworICAgIC8vIENoZWNrIGZvciBvdmVyZmxvdworICAgIGlmIChuID09IDApIHJldHVybiBOVUxMOworICAgIGlmIChuID49IFVJTlRfTUFYIC8gQ29scykgcmV0dXJuIE5VTEw7CisgICAgaWYgKG4gPj0gVUlOVF9NQVggLyBSb3dzKSByZXR1cm4gTlVMTDsKKyAgICBpZiAobiA8IFJvd3MgfHwgbiA8IENvbHMpIHJldHVybiBOVUxMOworCisgICAgTmV3TVBFID0gX2Ntc1N0YWdlQWxsb2NQbGFjZWhvbGRlcihDb250ZXh0SUQsIGNtc1NpZ01hdHJpeEVsZW1UeXBlLCBDb2xzLCBSb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2YWx1YXRlTWF0cml4LCBNYXRyaXhFbGVtRHVwLCBNYXRyaXhFbGVtVHlwZUZyZWUsIE5VTEwgKTsKKyAgICBpZiAoTmV3TVBFID09IE5VTEwpIHJldHVybiBOVUxMOworCisKKyAgICBOZXdFbGVtID0gKF9jbXNTdGFnZU1hdHJpeERhdGEqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihfY21zU3RhZ2VNYXRyaXhEYXRhKSk7CisgICAgaWYgKE5ld0VsZW0gPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKworICAgIE5ld0VsZW0gLT5Eb3VibGUgPSAoY21zRmxvYXQ2NE51bWJlciopIF9jbXNDYWxsb2MoQ29udGV4dElELCBuLCBzaXplb2YoY21zRmxvYXQ2NE51bWJlcikpOworCisgICAgaWYgKE5ld0VsZW0tPkRvdWJsZSA9PSBOVUxMKSB7CisgICAgICAgIE1hdHJpeEVsZW1UeXBlRnJlZShOZXdNUEUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBmb3IgKGk9MDsgaSA8IG47IGkrKykgeworICAgICAgICBOZXdFbGVtIC0+RG91YmxlW2ldID0gTWF0cml4W2ldOworICAgIH0KKworCisgICAgaWYgKE9mZnNldCAhPSBOVUxMKSB7CisKKyAgICAgICAgTmV3RWxlbSAtPk9mZnNldCA9IChjbXNGbG9hdDY0TnVtYmVyKikgX2Ntc0NhbGxvYyhDb250ZXh0SUQsIFJvd3MsIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKSk7CisgICAgICAgIGlmIChOZXdFbGVtLT5PZmZzZXQgPT0gTlVMTCkgeworICAgICAgICAgICBNYXRyaXhFbGVtVHlwZUZyZWUoTmV3TVBFKTsKKyAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGk9MDsgaSA8IFJvd3M7IGkrKykgeworICAgICAgICAgICAgICAgIE5ld0VsZW0gLT5PZmZzZXRbaV0gPSBPZmZzZXRbaV07CisgICAgICAgIH0KKworICAgIH0KKworICAgIE5ld01QRSAtPkRhdGEgID0gKHZvaWQqKSBOZXdFbGVtOworICAgIHJldHVybiBOZXdNUEU7Cit9CisKKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gVHlwZSBjbXNTaWdDTHV0RWxlbVR5cGUKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCisvLyBFdmFsdWF0ZSBpbiB0cnVlIGZsb2F0aW5nIHBvaW50CitzdGF0aWMKK3ZvaWQgRXZhbHVhdGVDTFVUZmxvYXQoY29uc3QgY21zRmxvYXQzMk51bWJlciBJbltdLCBjbXNGbG9hdDMyTnVtYmVyIE91dFtdLCBjb25zdCBjbXNTdGFnZSAqbXBlKQoreworICAgIF9jbXNTdGFnZUNMdXREYXRhKiBEYXRhID0gKF9jbXNTdGFnZUNMdXREYXRhKikgbXBlIC0+RGF0YTsKKworICAgIERhdGEgLT4gUGFyYW1zIC0+SW50ZXJwb2xhdGlvbi5MZXJwRmxvYXQoSW4sIE91dCwgRGF0YS0+UGFyYW1zKTsKK30KKworCisvLyBDb252ZXJ0IHRvIDE2IGJpdHMsIGV2YWx1YXRlLCBhbmQgYmFjayB0byBmbG9hdGluZyBwb2ludAorc3RhdGljCit2b2lkIEV2YWx1YXRlQ0xVVGZsb2F0SW4xNihjb25zdCBjbXNGbG9hdDMyTnVtYmVyIEluW10sIGNtc0Zsb2F0MzJOdW1iZXIgT3V0W10sIGNvbnN0IGNtc1N0YWdlICptcGUpCit7CisgICAgX2Ntc1N0YWdlQ0x1dERhdGEqIERhdGEgPSAoX2Ntc1N0YWdlQ0x1dERhdGEqKSBtcGUgLT5EYXRhOworICAgIGNtc1VJbnQxNk51bWJlciBJbjE2W01BWF9TVEFHRV9DSEFOTkVMU10sIE91dDE2W01BWF9TVEFHRV9DSEFOTkVMU107CisKKyAgICBfY21zQXNzZXJ0KG1wZSAtPklucHV0Q2hhbm5lbHMgIDw9IE1BWF9TVEFHRV9DSEFOTkVMUyk7CisgICAgX2Ntc0Fzc2VydChtcGUgLT5PdXRwdXRDaGFubmVscyA8PSBNQVhfU1RBR0VfQ0hBTk5FTFMpOworCisgICAgRnJvbUZsb2F0VG8xNihJbiwgSW4xNiwgbXBlIC0+SW5wdXRDaGFubmVscyk7CisgICAgRGF0YSAtPiBQYXJhbXMgLT5JbnRlcnBvbGF0aW9uLkxlcnAxNihJbjE2LCBPdXQxNiwgRGF0YS0+UGFyYW1zKTsKKyAgICBGcm9tMTZUb0Zsb2F0KE91dDE2LCBPdXQsICBtcGUgLT5PdXRwdXRDaGFubmVscyk7Cit9CisKKworLy8gR2l2ZW4gYW4gaHlwZXJjdWJlIG9mIGIgZGltZW5zaW9ucywgd2l0aCBEaW1zW10gbnVtYmVyIG9mIG5vZGVzIGJ5IGRpbWVuc2lvbiwgY2FsY3VsYXRlIHRoZSB0b3RhbCBhbW91bnQgb2Ygbm9kZXMKK3N0YXRpYworY21zVUludDMyTnVtYmVyIEN1YmVTaXplKGNvbnN0IGNtc1VJbnQzMk51bWJlciBEaW1zW10sIGNtc1VJbnQzMk51bWJlciBiKQoreworICAgIGNtc1VJbnQzMk51bWJlciBydiwgZGltOworCisgICAgX2Ntc0Fzc2VydChEaW1zICE9IE5VTEwpOworCisgICAgZm9yIChydiA9IDE7IGIgPiAwOyBiLS0pIHsKKworICAgICAgICBkaW0gPSBEaW1zW2ItMV07CisgICAgICAgIGlmIChkaW0gPT0gMCkgcmV0dXJuIDA7ICAvLyBFcnJvcgorCisgICAgICAgIHJ2ICo9IGRpbTsKKworICAgICAgICAvLyBDaGVjayBmb3Igb3ZlcmZsb3cKKyAgICAgICAgaWYgKHJ2ID4gVUlOVF9NQVggLyBkaW0pIHJldHVybiAwOworICAgIH0KKworICAgIHJldHVybiBydjsKK30KKworc3RhdGljCit2b2lkKiBDTFVURWxlbUR1cChjbXNTdGFnZSogbXBlKQoreworICAgIF9jbXNTdGFnZUNMdXREYXRhKiBEYXRhID0gKF9jbXNTdGFnZUNMdXREYXRhKikgbXBlIC0+RGF0YTsKKyAgICBfY21zU3RhZ2VDTHV0RGF0YSogTmV3RWxlbTsKKworCisgICAgTmV3RWxlbSA9IChfY21zU3RhZ2VDTHV0RGF0YSopIF9jbXNNYWxsb2NaZXJvKG1wZSAtPkNvbnRleHRJRCwgc2l6ZW9mKF9jbXNTdGFnZUNMdXREYXRhKSk7CisgICAgaWYgKE5ld0VsZW0gPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBOZXdFbGVtIC0+bkVudHJpZXMgICAgICAgPSBEYXRhIC0+bkVudHJpZXM7CisgICAgTmV3RWxlbSAtPkhhc0Zsb2F0VmFsdWVzID0gRGF0YSAtPkhhc0Zsb2F0VmFsdWVzOworCisgICAgaWYgKERhdGEgLT5UYWIuVCkgeworCisgICAgICAgIGlmIChEYXRhIC0+SGFzRmxvYXRWYWx1ZXMpIHsKKyAgICAgICAgICAgIE5ld0VsZW0gLT5UYWIuVEZsb2F0ID0gKGNtc0Zsb2F0MzJOdW1iZXIqKSBfY21zRHVwTWVtKG1wZSAtPkNvbnRleHRJRCwgRGF0YSAtPlRhYi5URmxvYXQsIERhdGEgLT5uRW50cmllcyAqIHNpemVvZiAoY21zRmxvYXQzMk51bWJlcikpOworICAgICAgICAgICAgaWYgKE5ld0VsZW0gLT5UYWIuVEZsb2F0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE5ld0VsZW0gLT5UYWIuVCA9IChjbXNVSW50MTZOdW1iZXIqKSBfY21zRHVwTWVtKG1wZSAtPkNvbnRleHRJRCwgRGF0YSAtPlRhYi5ULCBEYXRhIC0+bkVudHJpZXMgKiBzaXplb2YgKGNtc1VJbnQxNk51bWJlcikpOworICAgICAgICAgICAgaWYgKE5ld0VsZW0gLT5UYWIuVCA9PSBOVUxMKQorICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBOZXdFbGVtIC0+UGFyYW1zICAgPSBfY21zQ29tcHV0ZUludGVycFBhcmFtc0V4KG1wZSAtPkNvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgLT5QYXJhbXMgLT5uU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgLT5QYXJhbXMgLT5uSW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAtPlBhcmFtcyAtPm5PdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3RWxlbSAtPlRhYi5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAtPlBhcmFtcyAtPmR3RmxhZ3MpOworICAgIGlmIChOZXdFbGVtLT5QYXJhbXMgIT0gTlVMTCkKKyAgICAgICAgcmV0dXJuICh2b2lkKikgTmV3RWxlbTsKKyBFcnJvcjoKKyAgICBpZiAoTmV3RWxlbS0+VGFiLlQpCisgICAgICAgIC8vIFRoaXMgd29ya3MgZm9yIGJvdGggdHlwZXMKKyAgICAgICAgX2Ntc0ZyZWUobXBlIC0+Q29udGV4dElELCBOZXdFbGVtIC0+IFRhYi5UKTsKKyAgICBfY21zRnJlZShtcGUgLT5Db250ZXh0SUQsIE5ld0VsZW0pOworICAgIHJldHVybiBOVUxMOworfQorCisKK3N0YXRpYwordm9pZCBDTHV0RWxlbVR5cGVGcmVlKGNtc1N0YWdlKiBtcGUpCit7CisKKyAgICBfY21zU3RhZ2VDTHV0RGF0YSogRGF0YSA9IChfY21zU3RhZ2VDTHV0RGF0YSopIG1wZSAtPkRhdGE7CisKKyAgICAvLyBBbHJlYWR5IGVtcHR5CisgICAgaWYgKERhdGEgPT0gTlVMTCkgcmV0dXJuOworCisgICAgLy8gVGhpcyB3b3JrcyBmb3IgYm90aCB0eXBlcworICAgIGlmIChEYXRhIC0+IFRhYi5UKQorICAgICAgICBfY21zRnJlZShtcGUgLT5Db250ZXh0SUQsIERhdGEgLT4gVGFiLlQpOworCisgICAgX2Ntc0ZyZWVJbnRlcnBQYXJhbXMoRGF0YSAtPlBhcmFtcyk7CisgICAgX2Ntc0ZyZWUobXBlIC0+Q29udGV4dElELCBtcGUgLT5EYXRhKTsKK30KKworCisvLyBBbGxvY2F0ZXMgYSAxNi1iaXQgbXVsdGlkaW1lbnNpb25hbCBDTFVULiBUaGlzIGlzIGV2YWx1YXRlZCBhdCAxNi1iaXQgcHJlY2lzaW9uLiBUYWJsZSBtYXkgaGF2ZSBkaWZmZXJlbnQKKy8vIGdyYW51bGFyaXR5IG9uIGVhY2ggZGltZW5zaW9uLgorY21zU3RhZ2UqIENNU0VYUE9SVCBjbXNTdGFnZUFsbG9jQ0x1dDE2Yml0R3JhbnVsYXIoY21zQ29udGV4dCBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1VJbnQzMk51bWJlciBjbHV0UG9pbnRzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBpbnB1dENoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBvdXRwdXRDaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNVSW50MTZOdW1iZXIqIFRhYmxlKQoreworICAgIGNtc1VJbnQzMk51bWJlciBpLCBuOworICAgIF9jbXNTdGFnZUNMdXREYXRhKiBOZXdFbGVtOworICAgIGNtc1N0YWdlKiBOZXdNUEU7CisKKyAgICBfY21zQXNzZXJ0KGNsdXRQb2ludHMgIT0gTlVMTCk7CisKKyAgICBpZiAoaW5wdXRDaGFuID4gTUFYX0lOUFVUX0RJTUVOU0lPTlMpIHsKKyAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgIlRvbyBtYW55IGlucHV0IGNoYW5uZWxzICglZCBjaGFubmVscywgbWF4PSVkKSIsIGlucHV0Q2hhbiwgTUFYX0lOUFVUX0RJTUVOU0lPTlMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBOZXdNUEUgPSBfY21zU3RhZ2VBbGxvY1BsYWNlaG9sZGVyKENvbnRleHRJRCwgY21zU2lnQ0x1dEVsZW1UeXBlLCBpbnB1dENoYW4sIG91dHB1dENoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZhbHVhdGVDTFVUZmxvYXRJbjE2LCBDTFVURWxlbUR1cCwgQ0x1dEVsZW1UeXBlRnJlZSwgTlVMTCApOworCisgICAgaWYgKE5ld01QRSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIE5ld0VsZW0gPSAoX2Ntc1N0YWdlQ0x1dERhdGEqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihfY21zU3RhZ2VDTHV0RGF0YSkpOworICAgIGlmIChOZXdFbGVtID09IE5VTEwpIHsKKyAgICAgICAgY21zU3RhZ2VGcmVlKE5ld01QRSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIE5ld01QRSAtPkRhdGEgID0gKHZvaWQqKSBOZXdFbGVtOworCisgICAgTmV3RWxlbSAtPiBuRW50cmllcyA9IG4gPSBvdXRwdXRDaGFuICogQ3ViZVNpemUoY2x1dFBvaW50cywgaW5wdXRDaGFuKTsKKyAgICBOZXdFbGVtIC0+IEhhc0Zsb2F0VmFsdWVzID0gRkFMU0U7CisKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIGNtc1N0YWdlRnJlZShOZXdNUEUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKworICAgIE5ld0VsZW0gLT5UYWIuVCAgPSAoY21zVUludDE2TnVtYmVyKikgX2Ntc0NhbGxvYyhDb250ZXh0SUQsIG4sIHNpemVvZihjbXNVSW50MTZOdW1iZXIpKTsKKyAgICBpZiAoTmV3RWxlbSAtPlRhYi5UID09IE5VTEwpIHsKKyAgICAgICAgY21zU3RhZ2VGcmVlKE5ld01QRSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChUYWJsZSAhPSBOVUxMKSB7CisgICAgICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBOZXdFbGVtIC0+VGFiLlRbaV0gPSBUYWJsZVtpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIE5ld0VsZW0gLT5QYXJhbXMgPSBfY21zQ29tcHV0ZUludGVycFBhcmFtc0V4KENvbnRleHRJRCwgY2x1dFBvaW50cywgaW5wdXRDaGFuLCBvdXRwdXRDaGFuLCBOZXdFbGVtIC0+VGFiLlQsIENNU19MRVJQX0ZMQUdTXzE2QklUUyk7CisgICAgaWYgKE5ld0VsZW0gLT5QYXJhbXMgPT0gTlVMTCkgeworICAgICAgICBjbXNTdGFnZUZyZWUoTmV3TVBFKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIE5ld01QRTsKK30KKworY21zU3RhZ2UqIENNU0VYUE9SVCBjbXNTdGFnZUFsbG9jQ0x1dDE2Yml0KGNtc0NvbnRleHQgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG5HcmlkUG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGlucHV0Q2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBvdXRwdXRDaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zVUludDE2TnVtYmVyKiBUYWJsZSkKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgRGltZW5zaW9uc1tNQVhfSU5QVVRfRElNRU5TSU9OU107CisgICAgaW50IGk7CisKKyAgIC8vIE91ciByZXN1bHRpbmcgTFVUIHdvdWxkIGJlIHNhbWUgZ3JpZHBvaW50cyBvbiBhbGwgZGltZW5zaW9ucworICAgIGZvciAoaT0wOyBpIDwgTUFYX0lOUFVUX0RJTUVOU0lPTlM7IGkrKykKKyAgICAgICAgRGltZW5zaW9uc1tpXSA9IG5HcmlkUG9pbnRzOworCisgICAgcmV0dXJuIGNtc1N0YWdlQWxsb2NDTHV0MTZiaXRHcmFudWxhcihDb250ZXh0SUQsIERpbWVuc2lvbnMsIGlucHV0Q2hhbiwgb3V0cHV0Q2hhbiwgVGFibGUpOworfQorCisKK2Ntc1N0YWdlKiBDTVNFWFBPUlQgY21zU3RhZ2VBbGxvY0NMdXRGbG9hdChjbXNDb250ZXh0IENvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuR3JpZFBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBpbnB1dENoYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgb3V0cHV0Q2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIqIFRhYmxlKQoreworICAgY21zVUludDMyTnVtYmVyIERpbWVuc2lvbnNbTUFYX0lOUFVUX0RJTUVOU0lPTlNdOworICAgaW50IGk7CisKKyAgICAvLyBPdXIgcmVzdWx0aW5nIExVVCB3b3VsZCBiZSBzYW1lIGdyaWRwb2ludHMgb24gYWxsIGRpbWVuc2lvbnMKKyAgICBmb3IgKGk9MDsgaSA8IE1BWF9JTlBVVF9ESU1FTlNJT05TOyBpKyspCisgICAgICAgIERpbWVuc2lvbnNbaV0gPSBuR3JpZFBvaW50czsKKworICAgIHJldHVybiBjbXNTdGFnZUFsbG9jQ0x1dEZsb2F0R3JhbnVsYXIoQ29udGV4dElELCBEaW1lbnNpb25zLCBpbnB1dENoYW4sIG91dHB1dENoYW4sIFRhYmxlKTsKK30KKworCisKK2Ntc1N0YWdlKiBDTVNFWFBPUlQgY21zU3RhZ2VBbGxvY0NMdXRGbG9hdEdyYW51bGFyKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCBjbXNVSW50MzJOdW1iZXIgY2x1dFBvaW50c1tdLCBjbXNVSW50MzJOdW1iZXIgaW5wdXRDaGFuLCBjbXNVSW50MzJOdW1iZXIgb3V0cHV0Q2hhbiwgY29uc3QgY21zRmxvYXQzMk51bWJlciogVGFibGUpCit7CisgICAgY21zVUludDMyTnVtYmVyIGksIG47CisgICAgX2Ntc1N0YWdlQ0x1dERhdGEqIE5ld0VsZW07CisgICAgY21zU3RhZ2UqIE5ld01QRTsKKworICAgIF9jbXNBc3NlcnQoY2x1dFBvaW50cyAhPSBOVUxMKTsKKworICAgIGlmIChpbnB1dENoYW4gPiBNQVhfSU5QVVRfRElNRU5TSU9OUykgeworICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX1JBTkdFLCAiVG9vIG1hbnkgaW5wdXQgY2hhbm5lbHMgKCVkIGNoYW5uZWxzLCBtYXg9JWQpIiwgaW5wdXRDaGFuLCBNQVhfSU5QVVRfRElNRU5TSU9OUyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIE5ld01QRSA9IF9jbXNTdGFnZUFsbG9jUGxhY2Vob2xkZXIoQ29udGV4dElELCBjbXNTaWdDTHV0RWxlbVR5cGUsIGlucHV0Q2hhbiwgb3V0cHV0Q2hhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2YWx1YXRlQ0xVVGZsb2F0LCBDTFVURWxlbUR1cCwgQ0x1dEVsZW1UeXBlRnJlZSwgTlVMTCk7CisgICAgaWYgKE5ld01QRSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworCisgICAgTmV3RWxlbSA9IChfY21zU3RhZ2VDTHV0RGF0YSopIF9jbXNNYWxsb2NaZXJvKENvbnRleHRJRCwgc2l6ZW9mKF9jbXNTdGFnZUNMdXREYXRhKSk7CisgICAgaWYgKE5ld0VsZW0gPT0gTlVMTCkgeworICAgICAgICBjbXNTdGFnZUZyZWUoTmV3TVBFKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgTmV3TVBFIC0+RGF0YSAgPSAodm9pZCopIE5ld0VsZW07CisKKyAgICAvLyBUaGVyZSBpcyBhIHBvdGVudGlhbCBpbnRlZ2VyIG92ZXJmbG93IG9uIGNvbnB1dGluZyBuIGFuZCBuRW50cmllcy4KKyAgICBOZXdFbGVtIC0+IG5FbnRyaWVzID0gbiA9IG91dHB1dENoYW4gKiBDdWJlU2l6ZShjbHV0UG9pbnRzLCBpbnB1dENoYW4pOworICAgIE5ld0VsZW0gLT4gSGFzRmxvYXRWYWx1ZXMgPSBUUlVFOworCisgICAgaWYgKG4gPT0gMCkgeworICAgICAgICBjbXNTdGFnZUZyZWUoTmV3TVBFKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgTmV3RWxlbSAtPlRhYi5URmxvYXQgID0gKGNtc0Zsb2F0MzJOdW1iZXIqKSBfY21zQ2FsbG9jKENvbnRleHRJRCwgbiwgc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpKTsKKyAgICBpZiAoTmV3RWxlbSAtPlRhYi5URmxvYXQgPT0gTlVMTCkgeworICAgICAgICBjbXNTdGFnZUZyZWUoTmV3TVBFKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKFRhYmxlICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgICAgIE5ld0VsZW0gLT5UYWIuVEZsb2F0W2ldID0gVGFibGVbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBOZXdFbGVtIC0+UGFyYW1zID0gX2Ntc0NvbXB1dGVJbnRlcnBQYXJhbXNFeChDb250ZXh0SUQsIGNsdXRQb2ludHMsICBpbnB1dENoYW4sIG91dHB1dENoYW4sIE5ld0VsZW0gLT5UYWIuVEZsb2F0LCBDTVNfTEVSUF9GTEFHU19GTE9BVCk7CisgICAgaWYgKE5ld0VsZW0gLT5QYXJhbXMgPT0gTlVMTCkgeworICAgICAgICBjbXNTdGFnZUZyZWUoTmV3TVBFKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIE5ld01QRTsKK30KKworCitzdGF0aWMKK2ludCBJZGVudGl0eVNhbXBsZXIocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIEluW10sIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciBPdXRbXSwgcmVnaXN0ZXIgdm9pZCAqIENhcmdvKQoreworICAgIGludCBuQ2hhbiA9ICooaW50KikgQ2FyZ287CisgICAgaW50IGk7CisKKyAgICBmb3IgKGk9MDsgaSA8IG5DaGFuOyBpKyspCisgICAgICAgIE91dFtpXSA9IEluW2ldOworCisgICAgcmV0dXJuIDE7Cit9CisKKy8vIENyZWF0ZXMgYW4gTVBFIHRoYXQganVzdCBjb3BpZXMgaW5wdXQgdG8gb3V0cHV0CitjbXNTdGFnZSogX2Ntc1N0YWdlQWxsb2NJZGVudGl0eUNMdXQoY21zQ29udGV4dCBDb250ZXh0SUQsIGludCBuQ2hhbikKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgRGltZW5zaW9uc1tNQVhfSU5QVVRfRElNRU5TSU9OU107CisgICAgY21zU3RhZ2UqIG1wZSA7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGk9MDsgaSA8IE1BWF9JTlBVVF9ESU1FTlNJT05TOyBpKyspCisgICAgICAgIERpbWVuc2lvbnNbaV0gPSAyOworCisgICAgbXBlID0gY21zU3RhZ2VBbGxvY0NMdXQxNmJpdEdyYW51bGFyKENvbnRleHRJRCwgRGltZW5zaW9ucywgbkNoYW4sIG5DaGFuLCBOVUxMKTsKKyAgICBpZiAobXBlID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgaWYgKCFjbXNTdGFnZVNhbXBsZUNMdXQxNmJpdChtcGUsIElkZW50aXR5U2FtcGxlciwgJm5DaGFuLCAwKSkgeworICAgICAgICBjbXNTdGFnZUZyZWUobXBlKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbXBlIC0+SW1wbGVtZW50cyA9IGNtc1NpZ0lkZW50aXR5RWxlbVR5cGU7CisgICAgcmV0dXJuIG1wZTsKK30KKworCisKKy8vIFF1YW50aXplIGEgdmFsdWUgMCA8PSBpIDwgTWF4U2FtcGxlcyB0byAwLi4weGZmZmYKK2Ntc1VJbnQxNk51bWJlciBfY21zUXVhbnRpemVWYWwoY21zRmxvYXQ2NE51bWJlciBpLCBpbnQgTWF4U2FtcGxlcykKK3sKKyAgICBjbXNGbG9hdDY0TnVtYmVyIHg7CisKKyAgICB4ID0gKChjbXNGbG9hdDY0TnVtYmVyKSBpICogNjU1MzUuKSAvIChjbXNGbG9hdDY0TnVtYmVyKSAoTWF4U2FtcGxlcyAtIDEpOworICAgIHJldHVybiBfY21zUXVpY2tTYXR1cmF0ZVdvcmQoeCk7Cit9CisKKworLy8gVGhpcyByb3V0aW5lIGRvZXMgYSBzd2VlcCBvbiB3aG9sZSBpbnB1dCBzcGFjZSwgYW5kIGNhbGxzIGl0cyBjYWxsYmFjaworLy8gZnVuY3Rpb24gb24ga25vdHMuIHJldHVybnMgVFJVRSBpZiBhbGwgb2ssIEZBTFNFIG90aGVyd2lzZS4KK2Ntc0Jvb2wgQ01TRVhQT1JUIGNtc1N0YWdlU2FtcGxlQ0x1dDE2Yml0KGNtc1N0YWdlKiBtcGUsIGNtc1NBTVBMRVIxNiBTYW1wbGVyLCB2b2lkICogQ2FyZ28sIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKQoreworICAgIGludCBpLCB0LCBuVG90YWxQb2ludHMsIGluZGV4LCByZXN0OworICAgIGludCBuSW5wdXRzLCBuT3V0cHV0czsKKyAgICBjbXNVSW50MzJOdW1iZXIqIG5TYW1wbGVzOworICAgIGNtc1VJbnQxNk51bWJlciBJbltNQVhfSU5QVVRfRElNRU5TSU9OUysxXSwgT3V0W01BWF9TVEFHRV9DSEFOTkVMU107CisgICAgX2Ntc1N0YWdlQ0x1dERhdGEqIGNsdXQ7CisKKyAgICBpZiAobXBlID09IE5VTEwpIHJldHVybiBGQUxTRTsKKworICAgIGNsdXQgPSAoX2Ntc1N0YWdlQ0x1dERhdGEqKSBtcGUtPkRhdGE7CisKKyAgICBpZiAoY2x1dCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICBuU2FtcGxlcyA9IGNsdXQtPlBhcmFtcyAtPm5TYW1wbGVzOworICAgIG5JbnB1dHMgID0gY2x1dC0+UGFyYW1zIC0+bklucHV0czsKKyAgICBuT3V0cHV0cyA9IGNsdXQtPlBhcmFtcyAtPm5PdXRwdXRzOworCisgICAgaWYgKG5JbnB1dHMgPD0gMCkgcmV0dXJuIEZBTFNFOworICAgIGlmIChuT3V0cHV0cyA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKG5JbnB1dHMgPiBNQVhfSU5QVVRfRElNRU5TSU9OUykgcmV0dXJuIEZBTFNFOworICAgIGlmIChuT3V0cHV0cyA+PSBNQVhfU1RBR0VfQ0hBTk5FTFMpIHJldHVybiBGQUxTRTsKKworICAgIG5Ub3RhbFBvaW50cyA9IEN1YmVTaXplKG5TYW1wbGVzLCBuSW5wdXRzKTsKKyAgICBpZiAoblRvdGFsUG9pbnRzID09IDApIHJldHVybiBGQUxTRTsKKworICAgIGluZGV4ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgblRvdGFsUG9pbnRzOyBpKyspIHsKKworICAgICAgICByZXN0ID0gaTsKKyAgICAgICAgZm9yICh0ID0gbklucHV0cy0xOyB0ID49MDsgLS10KSB7CisKKyAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgQ29sb3JhbnQgPSByZXN0ICUgblNhbXBsZXNbdF07CisKKyAgICAgICAgICAgIHJlc3QgLz0gblNhbXBsZXNbdF07CisKKyAgICAgICAgICAgIEluW3RdID0gX2Ntc1F1YW50aXplVmFsKENvbG9yYW50LCBuU2FtcGxlc1t0XSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2x1dCAtPlRhYi5UICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGZvciAodD0wOyB0IDwgbk91dHB1dHM7IHQrKykKKyAgICAgICAgICAgICAgICBPdXRbdF0gPSBjbHV0LT5UYWIuVFtpbmRleCArIHRdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFTYW1wbGVyKEluLCBPdXQsIENhcmdvKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICBpZiAoIShkd0ZsYWdzICYgU0FNUExFUl9JTlNQRUNUKSkgeworCisgICAgICAgICAgICBpZiAoY2x1dCAtPlRhYi5UICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHQ9MDsgdCA8IG5PdXRwdXRzOyB0KyspCisgICAgICAgICAgICAgICAgICAgIGNsdXQtPlRhYi5UW2luZGV4ICsgdF0gPSBPdXRbdF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbmRleCArPSBuT3V0cHV0czsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gU2FtZSBhcyBhbnRlcmlvciwgYnV0IGZvciBmbG90aW5nIHBvaW50CitjbXNCb29sIENNU0VYUE9SVCBjbXNTdGFnZVNhbXBsZUNMdXRGbG9hdChjbXNTdGFnZSogbXBlLCBjbXNTQU1QTEVSRkxPQVQgU2FtcGxlciwgdm9pZCAqIENhcmdvLCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKK3sKKyAgICBpbnQgaSwgdCwgblRvdGFsUG9pbnRzLCBpbmRleCwgcmVzdDsKKyAgICBpbnQgbklucHV0cywgbk91dHB1dHM7CisgICAgY21zVUludDMyTnVtYmVyKiBuU2FtcGxlczsKKyAgICBjbXNGbG9hdDMyTnVtYmVyIEluW01BWF9JTlBVVF9ESU1FTlNJT05TKzFdLCBPdXRbTUFYX1NUQUdFX0NIQU5ORUxTXTsKKyAgICBfY21zU3RhZ2VDTHV0RGF0YSogY2x1dCA9IChfY21zU3RhZ2VDTHV0RGF0YSopIG1wZS0+RGF0YTsKKworICAgIG5TYW1wbGVzID0gY2x1dC0+UGFyYW1zIC0+blNhbXBsZXM7CisgICAgbklucHV0cyAgPSBjbHV0LT5QYXJhbXMgLT5uSW5wdXRzOworICAgIG5PdXRwdXRzID0gY2x1dC0+UGFyYW1zIC0+bk91dHB1dHM7CisKKyAgICBpZiAobklucHV0cyA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKG5PdXRwdXRzIDw9IDApIHJldHVybiBGQUxTRTsKKyAgICBpZiAobklucHV0cyAgPiBNQVhfSU5QVVRfRElNRU5TSU9OUykgcmV0dXJuIEZBTFNFOworICAgIGlmIChuT3V0cHV0cyA+PSBNQVhfU1RBR0VfQ0hBTk5FTFMpIHJldHVybiBGQUxTRTsKKworICAgIG5Ub3RhbFBvaW50cyA9IEN1YmVTaXplKG5TYW1wbGVzLCBuSW5wdXRzKTsKKyAgICBpZiAoblRvdGFsUG9pbnRzID09IDApIHJldHVybiBGQUxTRTsKKworICAgIGluZGV4ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgblRvdGFsUG9pbnRzOyBpKyspIHsKKworICAgICAgICByZXN0ID0gaTsKKyAgICAgICAgZm9yICh0ID0gbklucHV0cy0xOyB0ID49MDsgLS10KSB7CisKKyAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgQ29sb3JhbnQgPSByZXN0ICUgblNhbXBsZXNbdF07CisKKyAgICAgICAgICAgIHJlc3QgLz0gblNhbXBsZXNbdF07CisKKyAgICAgICAgICAgIEluW3RdID0gIChjbXNGbG9hdDMyTnVtYmVyKSAoX2Ntc1F1YW50aXplVmFsKENvbG9yYW50LCBuU2FtcGxlc1t0XSkgLyA2NTUzNS4wKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjbHV0IC0+VGFiLlRGbG9hdCAhPSBOVUxMKSB7CisgICAgICAgICAgICBmb3IgKHQ9MDsgdCA8IG5PdXRwdXRzOyB0KyspCisgICAgICAgICAgICAgICAgT3V0W3RdID0gY2x1dC0+VGFiLlRGbG9hdFtpbmRleCArIHRdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFTYW1wbGVyKEluLCBPdXQsIENhcmdvKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICBpZiAoIShkd0ZsYWdzICYgU0FNUExFUl9JTlNQRUNUKSkgeworCisgICAgICAgICAgICBpZiAoY2x1dCAtPlRhYi5URmxvYXQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGZvciAodD0wOyB0IDwgbk91dHB1dHM7IHQrKykKKyAgICAgICAgICAgICAgICAgICAgY2x1dC0+VGFiLlRGbG9hdFtpbmRleCArIHRdID0gT3V0W3RdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW5kZXggKz0gbk91dHB1dHM7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworCisvLyBUaGlzIHJvdXRpbmUgZG9lcyBhIHN3ZWVwIG9uIHdob2xlIGlucHV0IHNwYWNlLCBhbmQgY2FsbHMgaXRzIGNhbGxiYWNrCisvLyBmdW5jdGlvbiBvbiBrbm90cy4gcmV0dXJucyBUUlVFIGlmIGFsbCBvaywgRkFMU0Ugb3RoZXJ3aXNlLgorY21zQm9vbCBDTVNFWFBPUlQgY21zU2xpY2VTcGFjZTE2KGNtc1VJbnQzMk51bWJlciBuSW5wdXRzLCBjb25zdCBjbXNVSW50MzJOdW1iZXIgY2x1dFBvaW50c1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNTQU1QTEVSMTYgU2FtcGxlciwgdm9pZCAqIENhcmdvKQoreworICAgIGludCBpLCB0LCBuVG90YWxQb2ludHMsIHJlc3Q7CisgICAgY21zVUludDE2TnVtYmVyIEluW2Ntc01BWENIQU5ORUxTXTsKKworICAgIGlmIChuSW5wdXRzID49IGNtc01BWENIQU5ORUxTKSByZXR1cm4gRkFMU0U7CisKKyAgICBuVG90YWxQb2ludHMgPSBDdWJlU2l6ZShjbHV0UG9pbnRzLCBuSW5wdXRzKTsKKyAgICBpZiAoblRvdGFsUG9pbnRzID09IDApIHJldHVybiBGQUxTRTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuVG90YWxQb2ludHM7IGkrKykgeworCisgICAgICAgIHJlc3QgPSBpOworICAgICAgICBmb3IgKHQgPSBuSW5wdXRzLTE7IHQgPj0wOyAtLXQpIHsKKworICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICBDb2xvcmFudCA9IHJlc3QgJSBjbHV0UG9pbnRzW3RdOworCisgICAgICAgICAgICByZXN0IC89IGNsdXRQb2ludHNbdF07CisgICAgICAgICAgICBJblt0XSA9IF9jbXNRdWFudGl6ZVZhbChDb2xvcmFudCwgY2x1dFBvaW50c1t0XSk7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmICghU2FtcGxlcihJbiwgTlVMTCwgQ2FyZ28pKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCitjbXNJbnQzMk51bWJlciBDTVNFWFBPUlQgY21zU2xpY2VTcGFjZUZsb2F0KGNtc1VJbnQzMk51bWJlciBuSW5wdXRzLCBjb25zdCBjbXNVSW50MzJOdW1iZXIgY2x1dFBvaW50c1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNTQU1QTEVSRkxPQVQgU2FtcGxlciwgdm9pZCAqIENhcmdvKQoreworICAgIGludCBpLCB0LCBuVG90YWxQb2ludHMsIHJlc3Q7CisgICAgY21zRmxvYXQzMk51bWJlciBJbltjbXNNQVhDSEFOTkVMU107CisKKyAgICBpZiAobklucHV0cyA+PSBjbXNNQVhDSEFOTkVMUykgcmV0dXJuIEZBTFNFOworCisgICAgblRvdGFsUG9pbnRzID0gQ3ViZVNpemUoY2x1dFBvaW50cywgbklucHV0cyk7CisgICAgaWYgKG5Ub3RhbFBvaW50cyA9PSAwKSByZXR1cm4gRkFMU0U7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgblRvdGFsUG9pbnRzOyBpKyspIHsKKworICAgICAgICByZXN0ID0gaTsKKyAgICAgICAgZm9yICh0ID0gbklucHV0cy0xOyB0ID49MDsgLS10KSB7CisKKyAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgQ29sb3JhbnQgPSByZXN0ICUgY2x1dFBvaW50c1t0XTsKKworICAgICAgICAgICAgcmVzdCAvPSBjbHV0UG9pbnRzW3RdOworICAgICAgICAgICAgSW5bdF0gPSAgKGNtc0Zsb2F0MzJOdW1iZXIpIChfY21zUXVhbnRpemVWYWwoQ29sb3JhbnQsIGNsdXRQb2ludHNbdF0pIC8gNjU1MzUuMCk7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmICghU2FtcGxlcihJbiwgTlVMTCwgQ2FyZ28pKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gVHlwZSBjbXNTaWdMYWIyWFlaRWxlbVR5cGUKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKworc3RhdGljCit2b2lkIEV2YWx1YXRlTGFiMlhZWihjb25zdCBjbXNGbG9hdDMyTnVtYmVyIEluW10sCisgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIE91dFtdLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zU3RhZ2UgKm1wZSkKK3sKKyAgICBjbXNDSUVMYWIgTGFiOworICAgIGNtc0NJRVhZWiBYWVo7CisgICAgY29uc3QgY21zRmxvYXQ2NE51bWJlciBYWVphZGogPSBNQVhfRU5DT0RFQUJMRV9YWVo7CisKKyAgICAvLyBWNCBydWxlcworICAgIExhYi5MID0gSW5bMF0gKiAxMDAuMDsKKyAgICBMYWIuYSA9IEluWzFdICogMjU1LjAgLSAxMjguMDsKKyAgICBMYWIuYiA9IEluWzJdICogMjU1LjAgLSAxMjguMDsKKworICAgIGNtc0xhYjJYWVooTlVMTCwgJlhZWiwgJkxhYik7CisKKyAgICAvLyBGcm9tIFhZWiwgcmFuZ2UgMC4uMTk5OTcgdG8gMC4uMS4wLCBub3RlIHRoYXQgMS45OTk5NyBjb21lcyBmcm9tIDB4ZmZmZgorICAgIC8vIGVuY29kZWQgYXMgMS4xNSBmaXhlZCBwb2ludCwgc28gMSArICgzMjc2Ny4wIC8gMzI3NjguMCkKKworICAgIE91dFswXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoKGNtc0Zsb2F0NjROdW1iZXIpIFhZWi5YIC8gWFlaYWRqKTsKKyAgICBPdXRbMV0gPSAoY21zRmxvYXQzMk51bWJlcikgKChjbXNGbG9hdDY0TnVtYmVyKSBYWVouWSAvIFhZWmFkaik7CisgICAgT3V0WzJdID0gKGNtc0Zsb2F0MzJOdW1iZXIpICgoY21zRmxvYXQ2NE51bWJlcikgWFlaLlogLyBYWVphZGopOworICAgIHJldHVybjsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobXBlKTsKK30KKworCisvLyBObyBkdXAgb3IgZnJlZSByb3V0aW5lcyBuZWVkZWQsIGFzIHRoZSBzdHJ1Y3R1cmUgaGFzIG5vIHBvaW50ZXJzIGluIGl0LgorY21zU3RhZ2UqIF9jbXNTdGFnZUFsbG9jTGFiMlhZWihjbXNDb250ZXh0IENvbnRleHRJRCkKK3sKKyAgICByZXR1cm4gX2Ntc1N0YWdlQWxsb2NQbGFjZWhvbGRlcihDb250ZXh0SUQsIGNtc1NpZ0xhYjJYWVpFbGVtVHlwZSwgMywgMywgRXZhbHVhdGVMYWIyWFlaLCBOVUxMLCBOVUxMLCBOVUxMKTsKK30KKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLy8gdjIgTD0xMDAgaXMgc3VwcG9zZWQgdG8gYmUgcGxhY2VkIG9uIDB4RkYwMC4gVGhlcmUgaXMgbm8gcmVhc29uYWJsZQorLy8gbnVtYmVyIG9mIGdyaWRwb2ludHMgdGhhdCB3b3VsZCBtYWtlIGV4YWN0IG1hdGNoLiBIb3dldmVyLCBhIHByZWxpbmVhcml6YXRpb24KKy8vIG9mIDI1OCBlbnRyaWVzLCB3b3VsZCBtYXAgMHhGRjAwIGV4YWN0bHkgb24gZW50cnkgMjU3LCBhbmQgdGhpcyBpcyBnb29kIHRvIGF2b2lkIHNjdW0gZG90LgorLy8gQWxtb3N0IGFsbCB3aGF0IHdlIG5lZWQgYnV0IHVuZm9ydHVuYXRlbHksIHRoZSByZXN0IG9mIGVudHJpZXMgc2hvdWxkIGJlIHNjYWxlZCBieQorLy8gKDI1NSoyNTcvMjU2KSBhbmQgdGhpcyBpcyBub3QgZXhhY3QuCisKK2Ntc1N0YWdlKiBfY21zU3RhZ2VBbGxvY0xhYlYyVG9WNGN1cnZlcyhjbXNDb250ZXh0IENvbnRleHRJRCkKK3sKKyAgICBjbXNTdGFnZSogbXBlOworICAgIGNtc1RvbmVDdXJ2ZSogTGFiVGFibGVbM107CisgICAgaW50IGksIGo7CisKKyAgICBMYWJUYWJsZVswXSA9IGNtc0J1aWxkVGFidWxhdGVkVG9uZUN1cnZlMTYoQ29udGV4dElELCAyNTgsIE5VTEwpOworICAgIExhYlRhYmxlWzFdID0gY21zQnVpbGRUYWJ1bGF0ZWRUb25lQ3VydmUxNihDb250ZXh0SUQsIDI1OCwgTlVMTCk7CisgICAgTGFiVGFibGVbMl0gPSBjbXNCdWlsZFRhYnVsYXRlZFRvbmVDdXJ2ZTE2KENvbnRleHRJRCwgMjU4LCBOVUxMKTsKKworICAgIGZvciAoaj0wOyBqIDwgMzsgaisrKSB7CisKKyAgICAgICAgaWYgKExhYlRhYmxlW2pdID09IE5VTEwpIHsKKyAgICAgICAgICAgIGNtc0ZyZWVUb25lQ3VydmVUcmlwbGUoTGFiVGFibGUpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICAvLyBXZSBuZWVkIHRvIG1hcCAqICgweGZmZmYgLyAweGZmMDApLCB0aGF0cyBzYW1lIGFzICgyNTcgLyAyNTYpCisgICAgICAgIC8vIFNvIHdlIGNhbiB1c2UgMjU4LWVudHJ5IHRhYmxlcyB0byBkbyB0aGUgdHJpY2sgKGkgLyAyNTcpICogKDI1NSAqIDI1NykgKiAoMjU3IC8gMjU2KTsKKyAgICAgICAgZm9yIChpPTA7IGkgPCAyNTc7IGkrKykgIHsKKworICAgICAgICAgICAgTGFiVGFibGVbal0tPlRhYmxlMTZbaV0gPSAoY21zVUludDE2TnVtYmVyKSAoKGkgKiAweGZmZmYgKyAweDgwKSA+PiA4KTsKKyAgICAgICAgfQorCisgICAgICAgIExhYlRhYmxlW2pdIC0+VGFibGUxNlsyNTddID0gMHhmZmZmOworICAgIH0KKworICAgIG1wZSA9IGNtc1N0YWdlQWxsb2NUb25lQ3VydmVzKENvbnRleHRJRCwgMywgTGFiVGFibGUpOworICAgIGNtc0ZyZWVUb25lQ3VydmVUcmlwbGUoTGFiVGFibGUpOworCisgICAgaWYgKG1wZSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICBtcGUgLT5JbXBsZW1lbnRzID0gY21zU2lnTGFiVjJ0b1Y0OworICAgIHJldHVybiBtcGU7Cit9CisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8vIE1hdHJpeC1iYXNlZCBjb252ZXJzaW9uLCB3aGljaCBpcyBtb3JlIGFjY3VyYXRlLCBidXQgc2xvd2VyIGFuZCBjYW5ub3QgcHJvcGVybHkgYmUgc2F2ZWQgaW4gZGV2aWNlbGluayBwcm9maWxlcworY21zU3RhZ2UqIF9jbXNTdGFnZUFsbG9jTGFiVjJUb1Y0KGNtc0NvbnRleHQgQ29udGV4dElEKQoreworICAgIHN0YXRpYyBjb25zdCBjbXNGbG9hdDY0TnVtYmVyIFYyVG9WNFtdID0geyA2NTUzNS4wLzY1MjgwLjAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgNjU1MzUuMC82NTI4MC4wLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDY1NTM1LjAvNjUyODAuMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICBjbXNTdGFnZSAqbXBlID0gY21zU3RhZ2VBbGxvY01hdHJpeChDb250ZXh0SUQsIDMsIDMsIFYyVG9WNCwgTlVMTCk7CisKKyAgICBpZiAobXBlID09IE5VTEwpIHJldHVybiBtcGU7CisgICAgbXBlIC0+SW1wbGVtZW50cyA9IGNtc1NpZ0xhYlYydG9WNDsKKyAgICByZXR1cm4gbXBlOworfQorCisKKy8vIFJldmVyc2UgZGlyZWN0aW9uCitjbXNTdGFnZSogX2Ntc1N0YWdlQWxsb2NMYWJWNFRvVjIoY21zQ29udGV4dCBDb250ZXh0SUQpCit7CisgICAgc3RhdGljIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIgVjRUb1YyW10gPSB7IDY1MjgwLjAvNjU1MzUuMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCA2NTI4MC4wLzY1NTM1LjAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgNjUyODAuMC82NTUzNS4wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICBjbXNTdGFnZSAqbXBlID0gY21zU3RhZ2VBbGxvY01hdHJpeChDb250ZXh0SUQsIDMsIDMsIFY0VG9WMiwgTlVMTCk7CisKKyAgICBpZiAobXBlID09IE5VTEwpIHJldHVybiBtcGU7CisgICAgbXBlIC0+SW1wbGVtZW50cyA9IGNtc1NpZ0xhYlY0dG9WMjsKKyAgICByZXR1cm4gbXBlOworfQorCisKKy8vIFRvIExhYiB0byBmbG9hdC4gTm90ZSB0aGF0IHRoZSBNUEUgZ2l2ZXMgbnVtYmVycyBpbiBub3JtYWwgTGFiIHJhbmdlCisvLyBhbmQgd2UgbmVlZCAwLi4xLjAgcmFuZ2UgZm9yIHRoZSBmb3JtYXR0ZXJzCisvLyBMKiA6IDAuLi4xMDAgPT4gMC4uLjEuMCAgKEwqIC8gMTAwKQorLy8gYWIqIDogLTEyOC4uKzEyNyB0byAwLi4xICAoKGFiKiArIDEyOCkgLyAyNTUpCisKK2Ntc1N0YWdlKiBfY21zU3RhZ2VOb3JtYWxpemVGcm9tTGFiRmxvYXQoY21zQ29udGV4dCBDb250ZXh0SUQpCit7CisgICAgc3RhdGljIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIgYTFbXSA9IHsKKyAgICAgICAgMS4wLzEwMC4wLCAwLCAwLAorICAgICAgICAwLCAxLjAvMjU1LjAsIDAsCisgICAgICAgIDAsIDAsIDEuMC8yNTUuMAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgY21zRmxvYXQ2NE51bWJlciBvMVtdID0geworICAgICAgICAwLAorICAgICAgICAxMjguMC8yNTUuMCwKKyAgICAgICAgMTI4LjAvMjU1LjAKKyAgICB9OworCisgICAgY21zU3RhZ2UgKm1wZSA9IGNtc1N0YWdlQWxsb2NNYXRyaXgoQ29udGV4dElELCAzLCAzLCBhMSwgbzEpOworCisgICAgaWYgKG1wZSA9PSBOVUxMKSByZXR1cm4gbXBlOworICAgIG1wZSAtPkltcGxlbWVudHMgPSBjbXNTaWdMYWIyRmxvYXRQQ1M7CisgICAgcmV0dXJuIG1wZTsKK30KKworLy8gRm9tIFhZWiB0byBmbG9hdGluZyBwb2ludCBQQ1MKK2Ntc1N0YWdlKiBfY21zU3RhZ2VOb3JtYWxpemVGcm9tWHl6RmxvYXQoY21zQ29udGV4dCBDb250ZXh0SUQpCit7CisjZGVmaW5lIG4gKDMyNzY4LjAvNjU1MzUuMCkKKyAgICBzdGF0aWMgY29uc3QgY21zRmxvYXQ2NE51bWJlciBhMVtdID0geworICAgICAgICBuLCAwLCAwLAorICAgICAgICAwLCBuLCAwLAorICAgICAgICAwLCAwLCBuCisgICAgfTsKKyN1bmRlZiBuCisKKyAgICBjbXNTdGFnZSAqbXBlID0gIGNtc1N0YWdlQWxsb2NNYXRyaXgoQ29udGV4dElELCAzLCAzLCBhMSwgTlVMTCk7CisKKyAgICBpZiAobXBlID09IE5VTEwpIHJldHVybiBtcGU7CisgICAgbXBlIC0+SW1wbGVtZW50cyA9IGNtc1NpZ1hZWjJGbG9hdFBDUzsKKyAgICByZXR1cm4gbXBlOworfQorCitjbXNTdGFnZSogX2Ntc1N0YWdlTm9ybWFsaXplVG9MYWJGbG9hdChjbXNDb250ZXh0IENvbnRleHRJRCkKK3sKKyAgICBzdGF0aWMgY29uc3QgY21zRmxvYXQ2NE51bWJlciBhMVtdID0geworICAgICAgICAxMDAuMCwgMCwgMCwKKyAgICAgICAgMCwgMjU1LjAsIDAsCisgICAgICAgIDAsIDAsIDI1NS4wCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBjbXNGbG9hdDY0TnVtYmVyIG8xW10gPSB7CisgICAgICAgIDAsCisgICAgICAgIC0xMjguMCwKKyAgICAgICAgLTEyOC4wCisgICAgfTsKKworICAgIGNtc1N0YWdlICptcGUgPSAgY21zU3RhZ2VBbGxvY01hdHJpeChDb250ZXh0SUQsIDMsIDMsIGExLCBvMSk7CisgICAgaWYgKG1wZSA9PSBOVUxMKSByZXR1cm4gbXBlOworICAgIG1wZSAtPkltcGxlbWVudHMgPSBjbXNTaWdGbG9hdFBDUzJMYWI7CisgICAgcmV0dXJuIG1wZTsKK30KKworY21zU3RhZ2UqIF9jbXNTdGFnZU5vcm1hbGl6ZVRvWHl6RmxvYXQoY21zQ29udGV4dCBDb250ZXh0SUQpCit7CisjZGVmaW5lIG4gKDY1NTM1LjAvMzI3NjguMCkKKworICAgIHN0YXRpYyBjb25zdCBjbXNGbG9hdDY0TnVtYmVyIGExW10gPSB7CisgICAgICAgIG4sIDAsIDAsCisgICAgICAgIDAsIG4sIDAsCisgICAgICAgIDAsIDAsIG4KKyAgICB9OworI3VuZGVmIG4KKworICAgIGNtc1N0YWdlICptcGUgPSBjbXNTdGFnZUFsbG9jTWF0cml4KENvbnRleHRJRCwgMywgMywgYTEsIE5VTEwpOworICAgIGlmIChtcGUgPT0gTlVMTCkgcmV0dXJuIG1wZTsKKyAgICBtcGUgLT5JbXBsZW1lbnRzID0gY21zU2lnRmxvYXRQQ1MyWFlaOworICAgIHJldHVybiBtcGU7Cit9CisKKy8vIENsaXBzIHZhbHVlcyBzbWFsbGVyIHRoYW4gemVybworc3RhdGljCit2b2lkIENsaXBwZXIoY29uc3QgY21zRmxvYXQzMk51bWJlciBJbltdLCBjbXNGbG9hdDMyTnVtYmVyIE91dFtdLCBjb25zdCBjbXNTdGFnZSAqbXBlKQoreworICAgICAgIGNtc1VJbnQzMk51bWJlciBpOworICAgICAgIGZvciAoaSA9IDA7IGkgPCBtcGUtPklucHV0Q2hhbm5lbHM7IGkrKykgeworCisgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgbiA9IEluW2ldOworICAgICAgICAgICAgICBPdXRbaV0gPSBuIDwgMCA/IDAgOiBuOworICAgICAgIH0KK30KKworY21zU3RhZ2UqICBfY21zU3RhZ2VDbGlwTmVnYXRpdmVzKGNtc0NvbnRleHQgQ29udGV4dElELCBpbnQgbkNoYW5uZWxzKQoreworICAgICAgIHJldHVybiBfY21zU3RhZ2VBbGxvY1BsYWNlaG9sZGVyKENvbnRleHRJRCwgY21zU2lnQ2xpcE5lZ2F0aXZlc0VsZW1UeXBlLAorICAgICAgICAgICAgICBuQ2hhbm5lbHMsIG5DaGFubmVscywgQ2xpcHBlciwgTlVMTCwgTlVMTCwgTlVMTCk7Cit9CisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBUeXBlIGNtc1NpZ1hZWjJMYWJFbGVtVHlwZQorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworc3RhdGljCit2b2lkIEV2YWx1YXRlWFlaMkxhYihjb25zdCBjbXNGbG9hdDMyTnVtYmVyIEluW10sIGNtc0Zsb2F0MzJOdW1iZXIgT3V0W10sIGNvbnN0IGNtc1N0YWdlICptcGUpCit7CisgICAgY21zQ0lFTGFiIExhYjsKKyAgICBjbXNDSUVYWVogWFlaOworICAgIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIgWFlaYWRqID0gTUFYX0VOQ09ERUFCTEVfWFlaOworCisgICAgLy8gRnJvbSAwLi4xLjAgdG8gWFlaCisKKyAgICBYWVouWCA9IEluWzBdICogWFlaYWRqOworICAgIFhZWi5ZID0gSW5bMV0gKiBYWVphZGo7CisgICAgWFlaLlogPSBJblsyXSAqIFhZWmFkajsKKworICAgIGNtc1hZWjJMYWIoTlVMTCwgJkxhYiwgJlhZWik7CisKKyAgICAvLyBGcm9tIFY0IExhYiB0byAwLi4xLjAKKworICAgIE91dFswXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoTGFiLkwgLyAxMDAuMCk7CisgICAgT3V0WzFdID0gKGNtc0Zsb2F0MzJOdW1iZXIpICgoTGFiLmEgKyAxMjguMCkgLyAyNTUuMCk7CisgICAgT3V0WzJdID0gKGNtc0Zsb2F0MzJOdW1iZXIpICgoTGFiLmIgKyAxMjguMCkgLyAyNTUuMCk7CisgICAgcmV0dXJuOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihtcGUpOworfQorCitjbXNTdGFnZSogX2Ntc1N0YWdlQWxsb2NYWVoyTGFiKGNtc0NvbnRleHQgQ29udGV4dElEKQoreworICAgIHJldHVybiBfY21zU3RhZ2VBbGxvY1BsYWNlaG9sZGVyKENvbnRleHRJRCwgY21zU2lnWFlaMkxhYkVsZW1UeXBlLCAzLCAzLCBFdmFsdWF0ZVhZWjJMYWIsIE5VTEwsIE5VTEwsIE5VTEwpOworCit9CisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8vIEZvciB2NCwgUy1TaGFwZWQgY3VydmVzIGFyZSBwbGFjZWQgaW4gYS9iIGF4aXMgdG8gaW5jcmVhc2UgcmVzb2x1dGlvbiBuZWFyIGdyYXkKKworY21zU3RhZ2UqIF9jbXNTdGFnZUFsbG9jTGFiUHJlbGluKGNtc0NvbnRleHQgQ29udGV4dElEKQoreworICAgIGNtc1RvbmVDdXJ2ZSogTGFiVGFibGVbM107CisgICAgY21zRmxvYXQ2NE51bWJlciBQYXJhbXNbMV0gPSAgezIuNH0gOworCisgICAgTGFiVGFibGVbMF0gPSBjbXNCdWlsZEdhbW1hKENvbnRleHRJRCwgMS4wKTsKKyAgICBMYWJUYWJsZVsxXSA9IGNtc0J1aWxkUGFyYW1ldHJpY1RvbmVDdXJ2ZShDb250ZXh0SUQsIDEwOCwgUGFyYW1zKTsKKyAgICBMYWJUYWJsZVsyXSA9IGNtc0J1aWxkUGFyYW1ldHJpY1RvbmVDdXJ2ZShDb250ZXh0SUQsIDEwOCwgUGFyYW1zKTsKKworICAgIHJldHVybiBjbXNTdGFnZUFsbG9jVG9uZUN1cnZlcyhDb250ZXh0SUQsIDMsIExhYlRhYmxlKTsKK30KKworCisvLyBGcmVlIGEgc2luZ2xlIE1QRQordm9pZCBDTVNFWFBPUlQgY21zU3RhZ2VGcmVlKGNtc1N0YWdlKiBtcGUpCit7CisgICAgaWYgKG1wZSAtPkZyZWVQdHIpCisgICAgICAgIG1wZSAtPkZyZWVQdHIobXBlKTsKKworICAgIF9jbXNGcmVlKG1wZSAtPkNvbnRleHRJRCwgbXBlKTsKK30KKworCitjbXNVSW50MzJOdW1iZXIgIENNU0VYUE9SVCBjbXNTdGFnZUlucHV0Q2hhbm5lbHMoY29uc3QgY21zU3RhZ2UqIG1wZSkKK3sKKyAgICByZXR1cm4gbXBlIC0+SW5wdXRDaGFubmVsczsKK30KKworY21zVUludDMyTnVtYmVyICBDTVNFWFBPUlQgY21zU3RhZ2VPdXRwdXRDaGFubmVscyhjb25zdCBjbXNTdGFnZSogbXBlKQoreworICAgIHJldHVybiBtcGUgLT5PdXRwdXRDaGFubmVsczsKK30KKworY21zU3RhZ2VTaWduYXR1cmUgQ01TRVhQT1JUIGNtc1N0YWdlVHlwZShjb25zdCBjbXNTdGFnZSogbXBlKQoreworICAgIHJldHVybiBtcGUgLT4gVHlwZTsKK30KKwordm9pZCogQ01TRVhQT1JUIGNtc1N0YWdlRGF0YShjb25zdCBjbXNTdGFnZSogbXBlKQoreworICAgIHJldHVybiBtcGUgLT4gRGF0YTsKK30KKworY21zU3RhZ2UqICBDTVNFWFBPUlQgY21zU3RhZ2VOZXh0KGNvbnN0IGNtc1N0YWdlKiBtcGUpCit7CisgICAgcmV0dXJuIG1wZSAtPiBOZXh0OworfQorCisKKy8vIER1cGxpY2F0ZXMgYW4gTVBFCitjbXNTdGFnZSogQ01TRVhQT1JUIGNtc1N0YWdlRHVwKGNtc1N0YWdlKiBtcGUpCit7CisgICAgY21zU3RhZ2UqIE5ld01QRTsKKworICAgIGlmIChtcGUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgTmV3TVBFID0gX2Ntc1N0YWdlQWxsb2NQbGFjZWhvbGRlcihtcGUgLT5Db250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlIC0+VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGUgLT5JbnB1dENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZSAtPk91dHB1dENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZSAtPkV2YWxQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlIC0+RHVwRWxlbVB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGUgLT5GcmVlUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgIGlmIChOZXdNUEUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBOZXdNUEUgLT5JbXBsZW1lbnRzID0gbXBlIC0+SW1wbGVtZW50czsKKworICAgIGlmIChtcGUgLT5EdXBFbGVtUHRyKSB7CisKKyAgICAgICAgTmV3TVBFIC0+RGF0YSA9IG1wZSAtPkR1cEVsZW1QdHIobXBlKTsKKworICAgICAgICBpZiAoTmV3TVBFLT5EYXRhID09IE5VTEwpIHsKKworICAgICAgICAgICAgY21zU3RhZ2VGcmVlKE5ld01QRSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKworICAgICAgICBOZXdNUEUgLT5EYXRhICAgICAgID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gTmV3TVBFOworfQorCisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8vIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCB0aGUgY2hhbm5lbCBjb3VudAorc3RhdGljCitjbXNCb29sIEJsZXNzTFVUKGNtc1BpcGVsaW5lKiBsdXQpCit7CisgICAgLy8gV2UgY2FuIHNldCB0aGUgaW5wdXQvb3VwdXQgY2hhbm5lbHMgb25seSBpZiB3ZSBoYXZlIGVsZW1lbnRzLgorICAgIGlmIChsdXQgLT5FbGVtZW50cyAhPSBOVUxMKSB7CisKKyAgICAgICAgY21zU3RhZ2UqIHByZXY7CisgICAgICAgIGNtc1N0YWdlKiBuZXh0OworICAgICAgICBjbXNTdGFnZSogRmlyc3Q7CisgICAgICAgIGNtc1N0YWdlKiBMYXN0OworCisgICAgICAgIEZpcnN0ICA9IGNtc1BpcGVsaW5lR2V0UHRyVG9GaXJzdFN0YWdlKGx1dCk7CisgICAgICAgIExhc3QgICA9IGNtc1BpcGVsaW5lR2V0UHRyVG9MYXN0U3RhZ2UobHV0KTsKKworICAgICAgICBpZiAoRmlyc3QgPT0gTlVMTCB8fCBMYXN0ID09IE5VTEwpIHJldHVybiBGQUxTRTsKKworICAgICAgICBsdXQtPklucHV0Q2hhbm5lbHMgPSBGaXJzdC0+SW5wdXRDaGFubmVsczsKKyAgICAgICAgbHV0LT5PdXRwdXRDaGFubmVscyA9IExhc3QtPk91dHB1dENoYW5uZWxzOworCisgICAgICAgIC8vIENoZWNrIGNoYWluIGNvbnNpc3RlbmN5CisgICAgICAgIHByZXYgPSBGaXJzdDsKKyAgICAgICAgbmV4dCA9IHByZXYtPk5leHQ7CisKKyAgICAgICAgd2hpbGUgKG5leHQgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG5leHQtPklucHV0Q2hhbm5lbHMgIT0gcHJldi0+T3V0cHV0Q2hhbm5lbHMpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICBuZXh0ID0gbmV4dC0+TmV4dDsKKyAgICAgICAgICAgIHByZXYgPSBwcmV2LT5OZXh0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisKKy8vIERlZmF1bHQgdG8gZXZhbHVhdGUgdGhlIExVVCBvbiAxNiBiaXQtYmFzaXMuIFByZWNpc2lvbiBpcyByZXRhaW5lZC4KK3N0YXRpYwordm9pZCBfTFVUZXZhbDE2KHJlZ2lzdGVyIGNvbnN0IGNtc1VJbnQxNk51bWJlciBJbltdLCByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgT3V0W10sICByZWdpc3RlciBjb25zdCB2b2lkKiBEKQoreworICAgIGNtc1BpcGVsaW5lKiBsdXQgPSAoY21zUGlwZWxpbmUqKSBEOworICAgIGNtc1N0YWdlICptcGU7CisgICAgY21zRmxvYXQzMk51bWJlciBTdG9yYWdlWzJdW01BWF9TVEFHRV9DSEFOTkVMU10gPSB7MC4wZn07CisgICAgaW50IFBoYXNlID0gMCwgTmV4dFBoYXNlOworCisgICAgRnJvbTE2VG9GbG9hdChJbiwgJlN0b3JhZ2VbUGhhc2VdWzBdLCBsdXQgLT5JbnB1dENoYW5uZWxzKTsKKworICAgIGZvciAobXBlID0gbHV0IC0+RWxlbWVudHM7CisgICAgICAgICBtcGUgIT0gTlVMTDsKKyAgICAgICAgIG1wZSA9IG1wZSAtPk5leHQpIHsKKworICAgICAgICAgICAgIE5leHRQaGFzZSA9IFBoYXNlIF4gMTsKKyAgICAgICAgICAgICBtcGUgLT5FdmFsUHRyKCZTdG9yYWdlW1BoYXNlXVswXSwgJlN0b3JhZ2VbTmV4dFBoYXNlXVswXSwgbXBlKTsKKyAgICAgICAgICAgICBQaGFzZSA9IE5leHRQaGFzZTsKKyAgICB9CisKKworICAgIEZyb21GbG9hdFRvMTYoJlN0b3JhZ2VbUGhhc2VdWzBdLCBPdXQsIGx1dCAtPk91dHB1dENoYW5uZWxzKTsKK30KKworCisKKy8vIERvZXMgZXZhbHVhdGUgdGhlIExVVCBvbiBjbXNGbG9hdDMyTnVtYmVyLWJhc2lzLgorc3RhdGljCit2b2lkIF9MVVRldmFsRmxvYXQocmVnaXN0ZXIgY29uc3QgY21zRmxvYXQzMk51bWJlciBJbltdLCByZWdpc3RlciBjbXNGbG9hdDMyTnVtYmVyIE91dFtdLCBjb25zdCB2b2lkKiBEKQoreworICAgIGNtc1BpcGVsaW5lKiBsdXQgPSAoY21zUGlwZWxpbmUqKSBEOworICAgIGNtc1N0YWdlICptcGU7CisgICAgY21zRmxvYXQzMk51bWJlciBTdG9yYWdlWzJdW01BWF9TVEFHRV9DSEFOTkVMU10gPSB7MC4wZn07CisgICAgaW50IFBoYXNlID0gMCwgTmV4dFBoYXNlOworCisgICAgbWVtbW92ZSgmU3RvcmFnZVtQaGFzZV1bMF0sIEluLCBsdXQgLT5JbnB1dENoYW5uZWxzICAqIHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKSk7CisKKyAgICBmb3IgKG1wZSA9IGx1dCAtPkVsZW1lbnRzOworICAgICAgICAgbXBlICE9IE5VTEw7CisgICAgICAgICBtcGUgPSBtcGUgLT5OZXh0KSB7CisKKyAgICAgICAgICAgICAgTmV4dFBoYXNlID0gUGhhc2UgXiAxOworICAgICAgICAgICAgICBtcGUgLT5FdmFsUHRyKCZTdG9yYWdlW1BoYXNlXVswXSwgJlN0b3JhZ2VbTmV4dFBoYXNlXVswXSwgbXBlKTsKKyAgICAgICAgICAgICAgUGhhc2UgPSBOZXh0UGhhc2U7CisgICAgfQorCisgICAgbWVtbW92ZShPdXQsICZTdG9yYWdlW1BoYXNlXVswXSwgbHV0IC0+T3V0cHV0Q2hhbm5lbHMgKiBzaXplb2YoY21zRmxvYXQzMk51bWJlcikpOworfQorCisKKworCisvLyBMVVQgQ3JlYXRpb24gJiBEZXN0cnVjdGlvbgorCitjbXNQaXBlbGluZSogQ01TRVhQT1JUIGNtc1BpcGVsaW5lQWxsb2MoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBJbnB1dENoYW5uZWxzLCBjbXNVSW50MzJOdW1iZXIgT3V0cHV0Q2hhbm5lbHMpCit7CisgICAgICAgY21zUGlwZWxpbmUqIE5ld0xVVDsKKworICAgICAgIC8vIEEgdmFsdWUgb2YgemVybyBpbiBjaGFubmVscyBpcyBhbGxvd2VkIGFzIHBsYWNlaG9sZGVyCisgICAgICAgaWYgKElucHV0Q2hhbm5lbHMgPj0gY21zTUFYQ0hBTk5FTFMgfHwKKyAgICAgICAgICAgT3V0cHV0Q2hhbm5lbHMgPj0gY21zTUFYQ0hBTk5FTFMpIHJldHVybiBOVUxMOworCisgICAgICAgTmV3TFVUID0gKGNtc1BpcGVsaW5lKikgX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBzaXplb2YoY21zUGlwZWxpbmUpKTsKKyAgICAgICBpZiAoTmV3TFVUID09IE5VTEwpIHJldHVybiBOVUxMOworCisKKyAgICAgICBOZXdMVVQgLT4gSW5wdXRDaGFubmVscyAgPSBJbnB1dENoYW5uZWxzOworICAgICAgIE5ld0xVVCAtPiBPdXRwdXRDaGFubmVscyA9IE91dHB1dENoYW5uZWxzOworCisgICAgICAgTmV3TFVUIC0+RXZhbDE2Rm4gICAgPSBfTFVUZXZhbDE2OworICAgICAgIE5ld0xVVCAtPkV2YWxGbG9hdEZuID0gX0xVVGV2YWxGbG9hdDsKKyAgICAgICBOZXdMVVQgLT5EdXBEYXRhRm4gICA9IE5VTEw7CisgICAgICAgTmV3TFVUIC0+RnJlZURhdGFGbiAgPSBOVUxMOworICAgICAgIE5ld0xVVCAtPkRhdGEgICAgICAgID0gTmV3TFVUOworICAgICAgIE5ld0xVVCAtPkNvbnRleHRJRCAgID0gQ29udGV4dElEOworCisgICAgICAgaWYgKCFCbGVzc0xVVChOZXdMVVQpKQorICAgICAgIHsKKyAgICAgICAgICAgX2Ntc0ZyZWUoQ29udGV4dElELCBOZXdMVVQpOworICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICB9CisKKyAgICAgICByZXR1cm4gTmV3TFVUOworfQorCitjbXNDb250ZXh0IENNU0VYUE9SVCBjbXNHZXRQaXBlbGluZUNvbnRleHRJRChjb25zdCBjbXNQaXBlbGluZSogbHV0KQoreworICAgIF9jbXNBc3NlcnQobHV0ICE9IE5VTEwpOworICAgIHJldHVybiBsdXQgLT5Db250ZXh0SUQ7Cit9CisKK2Ntc1VJbnQzMk51bWJlciBDTVNFWFBPUlQgY21zUGlwZWxpbmVJbnB1dENoYW5uZWxzKGNvbnN0IGNtc1BpcGVsaW5lKiBsdXQpCit7CisgICAgX2Ntc0Fzc2VydChsdXQgIT0gTlVMTCk7CisgICAgcmV0dXJuIGx1dCAtPklucHV0Q2hhbm5lbHM7Cit9CisKK2Ntc1VJbnQzMk51bWJlciBDTVNFWFBPUlQgY21zUGlwZWxpbmVPdXRwdXRDaGFubmVscyhjb25zdCBjbXNQaXBlbGluZSogbHV0KQoreworICAgIF9jbXNBc3NlcnQobHV0ICE9IE5VTEwpOworICAgIHJldHVybiBsdXQgLT5PdXRwdXRDaGFubmVsczsKK30KKworLy8gRnJlZSBhIHByb2ZpbGUgZWxlbWVudHMgTFVUCit2b2lkIENNU0VYUE9SVCBjbXNQaXBlbGluZUZyZWUoY21zUGlwZWxpbmUqIGx1dCkKK3sKKyAgICBjbXNTdGFnZSAqbXBlLCAqTmV4dDsKKworICAgIGlmIChsdXQgPT0gTlVMTCkgcmV0dXJuOworCisgICAgZm9yIChtcGUgPSBsdXQgLT5FbGVtZW50czsKKyAgICAgICAgbXBlICE9IE5VTEw7CisgICAgICAgIG1wZSA9IE5leHQpIHsKKworICAgICAgICAgICAgTmV4dCA9IG1wZSAtPk5leHQ7CisgICAgICAgICAgICBjbXNTdGFnZUZyZWUobXBlKTsKKyAgICB9CisKKyAgICBpZiAobHV0IC0+RnJlZURhdGFGbikgbHV0IC0+RnJlZURhdGFGbihsdXQgLT5Db250ZXh0SUQsIGx1dCAtPkRhdGEpOworCisgICAgX2Ntc0ZyZWUobHV0IC0+Q29udGV4dElELCBsdXQpOworfQorCisKKy8vIERlZmF1bHQgdG8gZXZhbHVhdGUgdGhlIExVVCBvbiAxNiBiaXQtYmFzaXMuCit2b2lkIENNU0VYUE9SVCBjbXNQaXBlbGluZUV2YWwxNihjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5bXSwgY21zVUludDE2TnVtYmVyIE91dFtdLCAgY29uc3QgY21zUGlwZWxpbmUqIGx1dCkKK3sKKyAgICBfY21zQXNzZXJ0KGx1dCAhPSBOVUxMKTsKKyAgICBsdXQgLT5FdmFsMTZGbihJbiwgT3V0LCBsdXQtPkRhdGEpOworfQorCisKKy8vIERvZXMgZXZhbHVhdGUgdGhlIExVVCBvbiBjbXNGbG9hdDMyTnVtYmVyLWJhc2lzLgordm9pZCBDTVNFWFBPUlQgY21zUGlwZWxpbmVFdmFsRmxvYXQoY29uc3QgY21zRmxvYXQzMk51bWJlciBJbltdLCBjbXNGbG9hdDMyTnVtYmVyIE91dFtdLCBjb25zdCBjbXNQaXBlbGluZSogbHV0KQoreworICAgIF9jbXNBc3NlcnQobHV0ICE9IE5VTEwpOworICAgIGx1dCAtPkV2YWxGbG9hdEZuKEluLCBPdXQsIGx1dCk7Cit9CisKKworCisvLyBEdXBsaWNhdGVzIGEgTFVUCitjbXNQaXBlbGluZSogQ01TRVhQT1JUIGNtc1BpcGVsaW5lRHVwKGNvbnN0IGNtc1BpcGVsaW5lKiBsdXQpCit7CisgICAgY21zUGlwZWxpbmUqIE5ld0xVVDsKKyAgICBjbXNTdGFnZSAqTmV3TVBFLCAqQW50ZXJpb3IgPSBOVUxMLCAqbXBlOworICAgIGNtc0Jvb2wgIEZpcnN0ID0gVFJVRTsKKworICAgIGlmIChsdXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBOZXdMVVQgPSBjbXNQaXBlbGluZUFsbG9jKGx1dCAtPkNvbnRleHRJRCwgbHV0IC0+SW5wdXRDaGFubmVscywgbHV0IC0+T3V0cHV0Q2hhbm5lbHMpOworICAgIGlmIChOZXdMVVQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKG1wZSA9IGx1dCAtPkVsZW1lbnRzOworICAgICAgICAgbXBlICE9IE5VTEw7CisgICAgICAgICBtcGUgPSBtcGUgLT5OZXh0KSB7CisKKyAgICAgICAgICAgICBOZXdNUEUgPSBjbXNTdGFnZUR1cChtcGUpOworCisgICAgICAgICAgICAgaWYgKE5ld01QRSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgIGNtc1BpcGVsaW5lRnJlZShOZXdMVVQpOworICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICBpZiAoRmlyc3QpIHsKKyAgICAgICAgICAgICAgICAgTmV3TFVUIC0+RWxlbWVudHMgPSBOZXdNUEU7CisgICAgICAgICAgICAgICAgIEZpcnN0ID0gRkFMU0U7CisgICAgICAgICAgICAgfQorICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChBbnRlcmlvciAhPSBOVUxMKSAKKyAgICAgICAgICAgICAgICAgICAgQW50ZXJpb3IgLT5OZXh0ID0gTmV3TVBFOworICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQW50ZXJpb3IgPSBOZXdNUEU7CisgICAgfQorCisgICAgTmV3TFVUIC0+RXZhbDE2Rm4gICAgPSBsdXQgLT5FdmFsMTZGbjsKKyAgICBOZXdMVVQgLT5FdmFsRmxvYXRGbiA9IGx1dCAtPkV2YWxGbG9hdEZuOworICAgIE5ld0xVVCAtPkR1cERhdGFGbiAgID0gbHV0IC0+RHVwRGF0YUZuOworICAgIE5ld0xVVCAtPkZyZWVEYXRhRm4gID0gbHV0IC0+RnJlZURhdGFGbjsKKworICAgIGlmIChOZXdMVVQgLT5EdXBEYXRhRm4gIT0gTlVMTCkKKyAgICAgICAgTmV3TFVUIC0+RGF0YSA9IE5ld0xVVCAtPkR1cERhdGFGbihsdXQgLT5Db250ZXh0SUQsIGx1dC0+RGF0YSk7CisKKworICAgIE5ld0xVVCAtPlNhdmVBczhCaXRzICAgID0gbHV0IC0+U2F2ZUFzOEJpdHM7CisKKyAgICBpZiAoIUJsZXNzTFVUKE5ld0xVVCkpCisgICAgeworICAgICAgICBfY21zRnJlZShsdXQtPkNvbnRleHRJRCwgTmV3TFVUKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIE5ld0xVVDsKK30KKworCitpbnQgQ01TRVhQT1JUIGNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoY21zUGlwZWxpbmUqIGx1dCwgY21zU3RhZ2VMb2MgbG9jLCBjbXNTdGFnZSogbXBlKQoreworICAgIGNtc1N0YWdlKiBBbnRlcmlvciA9IE5VTEwsICpwdDsKKworICAgIGlmIChsdXQgPT0gTlVMTCB8fCBtcGUgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgc3dpdGNoIChsb2MpIHsKKworICAgICAgICBjYXNlIGNtc0FUX0JFR0lOOgorICAgICAgICAgICAgbXBlIC0+TmV4dCA9IGx1dCAtPkVsZW1lbnRzOworICAgICAgICAgICAgbHV0IC0+RWxlbWVudHMgPSBtcGU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGNtc0FUX0VORDoKKworICAgICAgICAgICAgaWYgKGx1dCAtPkVsZW1lbnRzID09IE5VTEwpCisgICAgICAgICAgICAgICAgbHV0IC0+RWxlbWVudHMgPSBtcGU7CisgICAgICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgICAgIGZvciAocHQgPSBsdXQgLT5FbGVtZW50czsKKyAgICAgICAgICAgICAgICAgICAgIHB0ICE9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICBwdCA9IHB0IC0+IE5leHQpIEFudGVyaW9yID0gcHQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQW50ZXJpb3IgLT5OZXh0ID0gbXBlOworICAgICAgICAgICAgICAgIG1wZSAtPk5leHQgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6OworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBCbGVzc0xVVChsdXQpOworfQorCisvLyBVbmxpbmsgYW4gZWxlbWVudCBhbmQgcmV0dXJuIHRoZSBwb2ludGVyIHRvIGl0Cit2b2lkIENNU0VYUE9SVCBjbXNQaXBlbGluZVVubGlua1N0YWdlKGNtc1BpcGVsaW5lKiBsdXQsIGNtc1N0YWdlTG9jIGxvYywgY21zU3RhZ2UqKiBtcGUpCit7CisgICAgY21zU3RhZ2UgKkFudGVyaW9yLCAqcHQsICpMYXN0OworICAgIGNtc1N0YWdlICpVbmxpbmtlZCA9IE5VTEw7CisKKworICAgIC8vIElmIGVtcHR5IExVVCwgdGhlcmUgaXMgbm90aGluZyB0byByZW1vdmUKKyAgICBpZiAobHV0IC0+RWxlbWVudHMgPT0gTlVMTCkgeworICAgICAgICBpZiAobXBlKSAqbXBlID0gTlVMTDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE9uIGRlcGVuZGluZyBvbiB0aGUgc3RyYXRlZ3kuLi4KKyAgICBzd2l0Y2ggKGxvYykgeworCisgICAgICAgIGNhc2UgY21zQVRfQkVHSU46CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY21zU3RhZ2UqIGVsZW0gPSBsdXQgLT5FbGVtZW50czsKKworICAgICAgICAgICAgICAgIGx1dCAtPkVsZW1lbnRzID0gZWxlbSAtPiBOZXh0OworICAgICAgICAgICAgICAgIGVsZW0gLT5OZXh0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICBVbmxpbmtlZCA9IGVsZW07CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgY21zQVRfRU5EOgorICAgICAgICAgICAgQW50ZXJpb3IgPSBMYXN0ID0gTlVMTDsKKyAgICAgICAgICAgIGZvciAocHQgPSBsdXQgLT5FbGVtZW50czsKKyAgICAgICAgICAgICAgICBwdCAhPSBOVUxMOworICAgICAgICAgICAgICAgIHB0ID0gcHQgLT4gTmV4dCkgeworICAgICAgICAgICAgICAgICAgICBBbnRlcmlvciA9IExhc3Q7CisgICAgICAgICAgICAgICAgICAgIExhc3QgPSBwdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVW5saW5rZWQgPSBMYXN0OyAgLy8gTmV4dCBhbHJlYWR5IHBvaW50cyB0byBOVUxMCisKKyAgICAgICAgICAgIC8vIFRydW5jYXRlIHRoZSBjaGFpbgorICAgICAgICAgICAgaWYgKEFudGVyaW9yKQorICAgICAgICAgICAgICAgIEFudGVyaW9yIC0+TmV4dCA9IE5VTEw7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbHV0IC0+RWxlbWVudHMgPSBOVUxMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6OworICAgIH0KKworICAgIGlmIChtcGUpCisgICAgICAgICptcGUgPSBVbmxpbmtlZDsKKyAgICBlbHNlCisgICAgICAgIGNtc1N0YWdlRnJlZShVbmxpbmtlZCk7CisKKyAgICAvLyBNYXkgZmFpbCwgYnV0IHdlIGlnbm9yZSBpdAorICAgIEJsZXNzTFVUKGx1dCk7Cit9CisKKworLy8gQ29uY2F0ZW5hdGUgdHdvIExVVCBpbnRvIGEgbmV3IHNpbmdsZSBvbmUKK2Ntc0Jvb2wgIENNU0VYUE9SVCBjbXNQaXBlbGluZUNhdChjbXNQaXBlbGluZSogbDEsIGNvbnN0IGNtc1BpcGVsaW5lKiBsMikKK3sKKyAgICBjbXNTdGFnZSogbXBlOworCisgICAgLy8gSWYgYm90aCBMVVRTIGRvZXMgbm90IGhhdmUgZWxlbWVudHMsIHdlIG5lZWQgdG8gaW5oZXJpdAorICAgIC8vIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICBpZiAobDEgLT5FbGVtZW50cyA9PSBOVUxMICYmIGwyIC0+RWxlbWVudHMgPT0gTlVMTCkgeworICAgICAgICBsMSAtPklucHV0Q2hhbm5lbHMgID0gbDIgLT5JbnB1dENoYW5uZWxzOworICAgICAgICBsMSAtPk91dHB1dENoYW5uZWxzID0gbDIgLT5PdXRwdXRDaGFubmVsczsKKyAgICB9CisKKyAgICAvLyBDYXQgc2Vjb25kCisgICAgZm9yIChtcGUgPSBsMiAtPkVsZW1lbnRzOworICAgICAgICAgbXBlICE9IE5VTEw7CisgICAgICAgICBtcGUgPSBtcGUgLT5OZXh0KSB7CisKKyAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gZHVwIGVhY2ggZWxlbWVudAorICAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKGwxLCBjbXNBVF9FTkQsIGNtc1N0YWdlRHVwKG1wZSkpKQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gQmxlc3NMVVQobDEpOworfQorCisKK2Ntc0Jvb2wgQ01TRVhQT1JUIGNtc1BpcGVsaW5lU2V0U2F2ZUFzOGJpdHNGbGFnKGNtc1BpcGVsaW5lKiBsdXQsIGNtc0Jvb2wgT24pCit7CisgICAgY21zQm9vbCBBbnRlcmlvciA9IGx1dCAtPlNhdmVBczhCaXRzOworCisgICAgbHV0IC0+U2F2ZUFzOEJpdHMgPSBPbjsKKyAgICByZXR1cm4gQW50ZXJpb3I7Cit9CisKKworY21zU3RhZ2UqIENNU0VYUE9SVCBjbXNQaXBlbGluZUdldFB0clRvRmlyc3RTdGFnZShjb25zdCBjbXNQaXBlbGluZSogbHV0KQoreworICAgIHJldHVybiBsdXQgLT5FbGVtZW50czsKK30KKworY21zU3RhZ2UqIENNU0VYUE9SVCBjbXNQaXBlbGluZUdldFB0clRvTGFzdFN0YWdlKGNvbnN0IGNtc1BpcGVsaW5lKiBsdXQpCit7CisgICAgY21zU3RhZ2UgKm1wZSwgKkFudGVyaW9yID0gTlVMTDsKKworICAgIGZvciAobXBlID0gbHV0IC0+RWxlbWVudHM7IG1wZSAhPSBOVUxMOyBtcGUgPSBtcGUgLT5OZXh0KQorICAgICAgICBBbnRlcmlvciA9IG1wZTsKKworICAgIHJldHVybiBBbnRlcmlvcjsKK30KKworY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNQaXBlbGluZVN0YWdlQ291bnQoY29uc3QgY21zUGlwZWxpbmUqIGx1dCkKK3sKKyAgICBjbXNTdGFnZSAqbXBlOworICAgIGNtc1VJbnQzMk51bWJlciBuOworCisgICAgZm9yIChuPTAsIG1wZSA9IGx1dCAtPkVsZW1lbnRzOyBtcGUgIT0gTlVMTDsgbXBlID0gbXBlIC0+TmV4dCkKKyAgICAgICAgICAgIG4rKzsKKworICAgIHJldHVybiBuOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIHNldCB0aGUgb3B0aW9uYWwgZXZhbHVhdG9yIGFuZCBhIGJsb2NrIG9mIHByaXZhdGUgZGF0YS4gSWYgcHJpdmF0ZSBkYXRhIGlzIGJlaW5nIHVzZWQsIGFuIG9wdGlvbmFsCisvLyBkdXBsaWNhdG9yIGFuZCBmcmVlIGZ1bmN0aW9ucyBzaG91bGQgYWxzbyBiZSBzcGVjaWZpZWQgaW4gb3JkZXIgdG8gZHVwbGljYXRlIHRoZSBMVVQgY29uc3RydWN0LiBVc2UgTlVMTCB0byBpbmhpYml0IHN1Y2ggZnVuY3Rpb25hbGl0eS4KK3ZvaWQgQ01TRVhQT1JUIF9jbXNQaXBlbGluZVNldE9wdGltaXphdGlvblBhcmFtZXRlcnMoY21zUGlwZWxpbmUqIEx1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY21zT1BUZXZhbDE2Rm4gRXZhbDE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIFByaXZhdGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jbXNGcmVlVXNlckRhdGFGbiBGcmVlUHJpdmF0ZURhdGFGbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY21zRHVwVXNlckRhdGFGbiAgRHVwUHJpdmF0ZURhdGFGbikKK3sKKworICAgIEx1dCAtPkV2YWwxNkZuID0gRXZhbDE2OworICAgIEx1dCAtPkR1cERhdGFGbiA9IER1cFByaXZhdGVEYXRhRm47CisgICAgTHV0IC0+RnJlZURhdGFGbiA9IEZyZWVQcml2YXRlRGF0YUZuOworICAgIEx1dCAtPkRhdGEgPSBQcml2YXRlRGF0YTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZXZlcnNlIGludGVycG9sYXRpb24KKy8vIEhlcmUncyBob3cgaXQgZ29lcy4gVGhlIGRlcml2YXRpdmUgRGYoeCkgb2YgdGhlIGZ1bmN0aW9uIGYgaXMgdGhlIGxpbmVhcgorLy8gdHJhbnNmb3JtYXRpb24gdGhhdCBiZXN0IGFwcHJveGltYXRlcyBmIG5lYXIgdGhlIHBvaW50IHguIEl0IGNhbiBiZSByZXByZXNlbnRlZAorLy8gYnkgYSBtYXRyaXggQSB3aG9zZSBlbnRyaWVzIGFyZSB0aGUgcGFydGlhbCBkZXJpdmF0aXZlcyBvZiB0aGUgY29tcG9uZW50cyBvZiBmCisvLyB3aXRoIHJlc3BlY3QgdG8gYWxsIHRoZSBjb29yZGluYXRlcy4gVGhpcyBpcyBrbm93IGFzIHRoZSBKYWNvYmlhbgorLy8KKy8vIFRoZSBiZXN0IGxpbmVhciBhcHByb3hpbWF0aW9uIHRvIGYgaXMgZ2l2ZW4gYnkgdGhlIG1hdHJpeCBlcXVhdGlvbjoKKy8vCisvLyB5LXkwID0gQSAoeC14MCkKKy8vCisvLyBTbywgaWYgeDAgaXMgYSBnb29kICJndWVzcyIgZm9yIHRoZSB6ZXJvIG9mIGYsIHRoZW4gc29sdmluZyBmb3IgdGhlIHplcm8gb2YgdGhpcworLy8gbGluZWFyIGFwcHJveGltYXRpb24gd2lsbCBnaXZlIGEgImJldHRlciBndWVzcyIgZm9yIHRoZSB6ZXJvIG9mIGYuIFRodXMgbGV0IHk9MCwKKy8vIGFuZCBzaW5jZSB5MD1mKHgwKSBvbmUgY2FuIHNvbHZlIHRoZSBhYm92ZSBlcXVhdGlvbiBmb3IgeC4gVGhpcyBsZWFkcyB0byB0aGUKKy8vIE5ld3RvbidzIG1ldGhvZCBmb3JtdWxhOgorLy8KKy8vIHhuKzEgPSB4biAtIEEtMSBmKHhuKQorLy8KKy8vIHdoZXJlIHhuKzEgZGVub3RlcyB0aGUgKG4rMSktc3QgZ3Vlc3MsIG9idGFpbmVkIGZyb20gdGhlIG4tdGggZ3Vlc3MgeG4gaW4gdGhlCisvLyBmYXNoaW9uIGRlc2NyaWJlZCBhYm92ZS4gSXRlcmF0aW5nIHRoaXMgd2lsbCBnaXZlIGJldHRlciBhbmQgYmV0dGVyIGFwcHJveGltYXRpb25zCisvLyBpZiB5b3UgaGF2ZSBhICJnb29kIGVub3VnaCIgaW5pdGlhbCBndWVzcy4KKworCisjZGVmaW5lIEpBQ09CSUFOX0VQU0lMT04gICAgICAgICAgICAwLjAwMWYKKyNkZWZpbmUgSU5WRVJTSU9OX01BWF9JVEVSQVRJT05TICAgIDMwCisKKy8vIEluY3JlbWVudCB3aXRoIHJlZmxleGlvbiBvbiBib3VuZGFyeQorc3RhdGljCit2b2lkIEluY0RlbHRhKGNtc0Zsb2F0MzJOdW1iZXIgKlZhbCkKK3sKKyAgICBpZiAoKlZhbCA8ICgxLjAgLSBKQUNPQklBTl9FUFNJTE9OKSkKKworICAgICAgICAqVmFsICs9IEpBQ09CSUFOX0VQU0lMT047CisKKyAgICBlbHNlCisgICAgICAgICpWYWwgLT0gSkFDT0JJQU5fRVBTSUxPTjsKKworfQorCisKKworLy8gRXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlY3RvcnMgb2YgbiBlbGVtZW50cyBlYWNoIG9uZQorc3RhdGljCitjbXNGbG9hdDMyTnVtYmVyIEV1Y2xpZGVhbkRpc3RhbmNlKGNtc0Zsb2F0MzJOdW1iZXIgYVtdLCBjbXNGbG9hdDMyTnVtYmVyIGJbXSwgaW50IG4pCit7CisgICAgY21zRmxvYXQzMk51bWJlciBzdW0gPSAwOworICAgIGludCBpOworCisgICAgZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgY21zRmxvYXQzMk51bWJlciBkaWYgPSBiW2ldIC0gYVtpXTsKKyAgICAgICAgc3VtICs9ICBkaWYgKiBkaWY7CisgICAgfQorCisgICAgcmV0dXJuIHNxcnRmKHN1bSk7Cit9CisKKworLy8gRXZhbHVhdGUgYSBMVVQgaW4gcmV2ZXJzZSBkaXJlY3Rpb24uIEl0IG9ubHkgc2VhcmNoZXMgb24gMy0+MyBMVVQuIFVzZXMgTmV3dG9uIG1ldGhvZAorLy8KKy8vIHgxIDwtIHggLSBbSih4KV1eLTEgKiBmKHgpCisvLworLy8gbHV0OiBUaGUgTFVUIG9uIHdoZXJlIHRvIGRvIHRoZSBzZWFyY2gKKy8vIFRhcmdldDogTGFiSywgMyB2YWx1ZXMgb2YgTGFiIHBsdXMgZGVzdGluYXRpb24gSyB3aGljaCBpcyBmaXhlZAorLy8gUmVzdWx0OiBUaGUgb2J0YWluZWQgQ01ZSworLy8gSGludDogICBMb2NhdGlvbiB3aGVyZSBiZWdpbiB0aGUgc2VhcmNoCisKK2Ntc0Jvb2wgQ01TRVhQT1JUIGNtc1BpcGVsaW5lRXZhbFJldmVyc2VGbG9hdChjbXNGbG9hdDMyTnVtYmVyIFRhcmdldFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgUmVzdWx0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciBIaW50W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zUGlwZWxpbmUqIGx1dCkKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgIGksIGo7CisgICAgY21zRmxvYXQ2NE51bWJlciAgZXJyb3IsIExhc3RFcnJvciA9IDFFMjA7CisgICAgY21zRmxvYXQzMk51bWJlciAgZnhbNF0sIHhbNF0sIHhkWzRdLCBmeGRbNF07CisgICAgY21zVkVDMyB0bXAsIHRtcDI7CisgICAgY21zTUFUMyBKYWNvYmlhbjsKKyAgICAKKyAgICAvLyBPbmx5IDMtPjMgYW5kIDQtPjMgYXJlIHN1cHBvcnRlZAorICAgIGlmIChsdXQgLT5JbnB1dENoYW5uZWxzICE9IDMgJiYgbHV0IC0+SW5wdXRDaGFubmVscyAhPSA0KSByZXR1cm4gRkFMU0U7CisgICAgaWYgKGx1dCAtPk91dHB1dENoYW5uZWxzICE9IDMpIHJldHVybiBGQUxTRTsKKyAgIAorICAgIC8vIFRha2UgdGhlIGhpbnQgYXMgc3RhcnRpbmcgcG9pbnQgaWYgc3BlY2lmaWVkCisgICAgaWYgKEhpbnQgPT0gTlVMTCkgeworCisgICAgICAgIC8vIEJlZ2luIGF0IGFueSBwb2ludCwgd2UgY2hvb3NlIDEvMyBvZiBDTVkgYXhpcworICAgICAgICB4WzBdID0geFsxXSA9IHhbMl0gPSAwLjNmOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICAvLyBPbmx5IGNvcHkgMyBjaGFubmVscyBmcm9tIGhpbnQuLi4KKyAgICAgICAgZm9yIChqPTA7IGogPCAzOyBqKyspCisgICAgICAgICAgICB4W2pdID0gSGludFtqXTsKKyAgICB9CisKKyAgICAvLyBJZiBMdXQgaXMgNC1kaW1lbnNpb25zLCB0aGVuIGdyYWIgdGFyZ2V0WzNdLCB3aGljaCBpcyBmaXhlZAorICAgIGlmIChsdXQgLT5JbnB1dENoYW5uZWxzID09IDQpIHsKKyAgICAgICAgeFszXSA9IFRhcmdldFszXTsKKyAgICB9CisgICAgZWxzZSB4WzNdID0gMDsgLy8gVG8ga2VlcCBsaW50IGhhcHB5CisKKworICAgIC8vIEl0ZXJhdGUKKyAgICBmb3IgKGkgPSAwOyBpIDwgSU5WRVJTSU9OX01BWF9JVEVSQVRJT05TOyBpKyspIHsKKworICAgICAgICAvLyBHZXQgYmVnaW5uaW5nIGZ4CisgICAgICAgIGNtc1BpcGVsaW5lRXZhbEZsb2F0KHgsIGZ4LCBsdXQpOworCisgICAgICAgIC8vIENvbXB1dGUgZXJyb3IKKyAgICAgICAgZXJyb3IgPSBFdWNsaWRlYW5EaXN0YW5jZShmeCwgVGFyZ2V0LCAzKTsKKworICAgICAgICAvLyBJZiBub3QgY29udmVyZ2VudCwgcmV0dXJuIGxhc3Qgc2FmZSB2YWx1ZQorICAgICAgICBpZiAoZXJyb3IgPj0gTGFzdEVycm9yKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gS2VlcCBsYXRlc3QgdmFsdWVzCisgICAgICAgIExhc3RFcnJvciAgICAgPSBlcnJvcjsKKyAgICAgICAgZm9yIChqPTA7IGogPCBsdXQgLT5JbnB1dENoYW5uZWxzOyBqKyspCisgICAgICAgICAgICAgICAgUmVzdWx0W2pdID0geFtqXTsKKworICAgICAgICAvLyBGb3VuZCBhbiBleGFjdCBtYXRjaD8KKyAgICAgICAgaWYgKGVycm9yIDw9IDApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyBPYnRhaW4gc2xvcGUgKHRoZSBKYWNvYmlhbikKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykgeworCisgICAgICAgICAgICB4ZFswXSA9IHhbMF07CisgICAgICAgICAgICB4ZFsxXSA9IHhbMV07CisgICAgICAgICAgICB4ZFsyXSA9IHhbMl07CisgICAgICAgICAgICB4ZFszXSA9IHhbM107ICAvLyBLZWVwIGZpeGVkIGNoYW5uZWwKKworICAgICAgICAgICAgSW5jRGVsdGEoJnhkW2pdKTsKKworICAgICAgICAgICAgY21zUGlwZWxpbmVFdmFsRmxvYXQoeGQsIGZ4ZCwgbHV0KTsKKworICAgICAgICAgICAgSmFjb2JpYW4udlswXS5uW2pdID0gKChmeGRbMF0gLSBmeFswXSkgLyBKQUNPQklBTl9FUFNJTE9OKTsKKyAgICAgICAgICAgIEphY29iaWFuLnZbMV0ubltqXSA9ICgoZnhkWzFdIC0gZnhbMV0pIC8gSkFDT0JJQU5fRVBTSUxPTik7CisgICAgICAgICAgICBKYWNvYmlhbi52WzJdLm5bal0gPSAoKGZ4ZFsyXSAtIGZ4WzJdKSAvIEpBQ09CSUFOX0VQU0lMT04pOworICAgICAgICB9CisKKyAgICAgICAgLy8gU29sdmUgc3lzdGVtCisgICAgICAgIHRtcDIublswXSA9IGZ4WzBdIC0gVGFyZ2V0WzBdOworICAgICAgICB0bXAyLm5bMV0gPSBmeFsxXSAtIFRhcmdldFsxXTsKKyAgICAgICAgdG1wMi5uWzJdID0gZnhbMl0gLSBUYXJnZXRbMl07CisKKyAgICAgICAgaWYgKCFfY21zTUFUM3NvbHZlKCZ0bXAsICZKYWNvYmlhbiwgJnRtcDIpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgIC8vIE1vdmUgb3VyIGd1ZXNzCisgICAgICAgIHhbMF0gLT0gKGNtc0Zsb2F0MzJOdW1iZXIpIHRtcC5uWzBdOworICAgICAgICB4WzFdIC09IChjbXNGbG9hdDMyTnVtYmVyKSB0bXAublsxXTsKKyAgICAgICAgeFsyXSAtPSAoY21zRmxvYXQzMk51bWJlcikgdG1wLm5bMl07CisKKyAgICAgICAgLy8gU29tZSBjbGlwcGluZy4uLi4KKyAgICAgICAgZm9yIChqPTA7IGogPCAzOyBqKyspIHsKKyAgICAgICAgICAgIGlmICh4W2pdIDwgMCkgeFtqXSA9IDA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaWYgKHhbal0gPiAxLjApIHhbal0gPSAxLjA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNtZDUuYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc21kNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MzgwY2EKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNtZDUuYwpAQCAtMCwwICsxLDMxNyBAQAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCisvLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTYgTWFydGkgTWFyaWEgU2FndWVyCisvLworLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisvLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisvLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisvLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKy8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQorLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKy8vCisvLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisvLworLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisvLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KKy8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisvLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCisvLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisvLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKy8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworI2luY2x1ZGUgImxjbXMyX2ludGVybmFsLmgiCisKKyNpZmRlZiBDTVNfVVNFX0JJR19FTkRJQU4KKworc3RhdGljCit2b2lkIGJ5dGVSZXZlcnNlKGNtc1VJbnQ4TnVtYmVyICogYnVmLCBjbXNVSW50MzJOdW1iZXIgbG9uZ3MpCit7CisgICAgZG8geworCisgICAgICAgIGNtc1VJbnQzMk51bWJlciB0ID0gX2Ntc0FkanVzdEVuZGlhbmVzczMyKCooY21zVUludDMyTnVtYmVyICopIGJ1Zik7CisgICAgICAgICooY21zVUludDMyTnVtYmVyICopIGJ1ZiA9IHQ7CisgICAgICAgIGJ1ZiArPSBzaXplb2YoY21zVUludDMyTnVtYmVyKTsKKworICAgIH0gd2hpbGUgKC0tbG9uZ3MpOworCit9CisKKyNlbHNlCisjZGVmaW5lIGJ5dGVSZXZlcnNlKGJ1ZiwgbGVuKQorI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgY21zVUludDMyTnVtYmVyIGJ1Zls0XTsKKyAgICBjbXNVSW50MzJOdW1iZXIgYml0c1syXTsKKyAgICBjbXNVSW50OE51bWJlciBpbls2NF07CisgICAgY21zQ29udGV4dCBDb250ZXh0SUQ7CisKK30gX2Ntc01ENTsKKworI2RlZmluZSBGMSh4LCB5LCB6KSAoeiBeICh4ICYgKHkgXiB6KSkpCisjZGVmaW5lIEYyKHgsIHksIHopIEYxKHosIHgsIHkpCisjZGVmaW5lIEYzKHgsIHksIHopICh4IF4geSBeIHopCisjZGVmaW5lIEY0KHgsIHksIHopICh5IF4gKHggfCB+eikpCisKKyNkZWZpbmUgU1RFUChmLCB3LCB4LCB5LCB6LCBkYXRhLCBzKSBcCisgICAgKCB3ICs9IGYoeCwgeSwgeikgKyBkYXRhLCAgdyA9IHc8PHMgfCB3Pj4oMzItcyksICB3ICs9IHggKQorCisKK3N0YXRpYwordm9pZCBNRDVfVHJhbnNmb3JtKGNtc1VJbnQzMk51bWJlciBidWZbNF0sIGNtc1VJbnQzMk51bWJlciBpblsxNl0pCisKK3sKKyAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgYSwgYiwgYywgZDsKKworICAgIGEgPSBidWZbMF07CisgICAgYiA9IGJ1ZlsxXTsKKyAgICBjID0gYnVmWzJdOworICAgIGQgPSBidWZbM107CisKKyAgICBTVEVQKEYxLCBhLCBiLCBjLCBkLCBpblswXSArIDB4ZDc2YWE0NzgsIDcpOworICAgIFNURVAoRjEsIGQsIGEsIGIsIGMsIGluWzFdICsgMHhlOGM3Yjc1NiwgMTIpOworICAgIFNURVAoRjEsIGMsIGQsIGEsIGIsIGluWzJdICsgMHgyNDIwNzBkYiwgMTcpOworICAgIFNURVAoRjEsIGIsIGMsIGQsIGEsIGluWzNdICsgMHhjMWJkY2VlZSwgMjIpOworICAgIFNURVAoRjEsIGEsIGIsIGMsIGQsIGluWzRdICsgMHhmNTdjMGZhZiwgNyk7CisgICAgU1RFUChGMSwgZCwgYSwgYiwgYywgaW5bNV0gKyAweDQ3ODdjNjJhLCAxMik7CisgICAgU1RFUChGMSwgYywgZCwgYSwgYiwgaW5bNl0gKyAweGE4MzA0NjEzLCAxNyk7CisgICAgU1RFUChGMSwgYiwgYywgZCwgYSwgaW5bN10gKyAweGZkNDY5NTAxLCAyMik7CisgICAgU1RFUChGMSwgYSwgYiwgYywgZCwgaW5bOF0gKyAweDY5ODA5OGQ4LCA3KTsKKyAgICBTVEVQKEYxLCBkLCBhLCBiLCBjLCBpbls5XSArIDB4OGI0NGY3YWYsIDEyKTsKKyAgICBTVEVQKEYxLCBjLCBkLCBhLCBiLCBpblsxMF0gKyAweGZmZmY1YmIxLCAxNyk7CisgICAgU1RFUChGMSwgYiwgYywgZCwgYSwgaW5bMTFdICsgMHg4OTVjZDdiZSwgMjIpOworICAgIFNURVAoRjEsIGEsIGIsIGMsIGQsIGluWzEyXSArIDB4NmI5MDExMjIsIDcpOworICAgIFNURVAoRjEsIGQsIGEsIGIsIGMsIGluWzEzXSArIDB4ZmQ5ODcxOTMsIDEyKTsKKyAgICBTVEVQKEYxLCBjLCBkLCBhLCBiLCBpblsxNF0gKyAweGE2Nzk0MzhlLCAxNyk7CisgICAgU1RFUChGMSwgYiwgYywgZCwgYSwgaW5bMTVdICsgMHg0OWI0MDgyMSwgMjIpOworCisgICAgU1RFUChGMiwgYSwgYiwgYywgZCwgaW5bMV0gKyAweGY2MWUyNTYyLCA1KTsKKyAgICBTVEVQKEYyLCBkLCBhLCBiLCBjLCBpbls2XSArIDB4YzA0MGIzNDAsIDkpOworICAgIFNURVAoRjIsIGMsIGQsIGEsIGIsIGluWzExXSArIDB4MjY1ZTVhNTEsIDE0KTsKKyAgICBTVEVQKEYyLCBiLCBjLCBkLCBhLCBpblswXSArIDB4ZTliNmM3YWEsIDIwKTsKKyAgICBTVEVQKEYyLCBhLCBiLCBjLCBkLCBpbls1XSArIDB4ZDYyZjEwNWQsIDUpOworICAgIFNURVAoRjIsIGQsIGEsIGIsIGMsIGluWzEwXSArIDB4MDI0NDE0NTMsIDkpOworICAgIFNURVAoRjIsIGMsIGQsIGEsIGIsIGluWzE1XSArIDB4ZDhhMWU2ODEsIDE0KTsKKyAgICBTVEVQKEYyLCBiLCBjLCBkLCBhLCBpbls0XSArIDB4ZTdkM2ZiYzgsIDIwKTsKKyAgICBTVEVQKEYyLCBhLCBiLCBjLCBkLCBpbls5XSArIDB4MjFlMWNkZTYsIDUpOworICAgIFNURVAoRjIsIGQsIGEsIGIsIGMsIGluWzE0XSArIDB4YzMzNzA3ZDYsIDkpOworICAgIFNURVAoRjIsIGMsIGQsIGEsIGIsIGluWzNdICsgMHhmNGQ1MGQ4NywgMTQpOworICAgIFNURVAoRjIsIGIsIGMsIGQsIGEsIGluWzhdICsgMHg0NTVhMTRlZCwgMjApOworICAgIFNURVAoRjIsIGEsIGIsIGMsIGQsIGluWzEzXSArIDB4YTllM2U5MDUsIDUpOworICAgIFNURVAoRjIsIGQsIGEsIGIsIGMsIGluWzJdICsgMHhmY2VmYTNmOCwgOSk7CisgICAgU1RFUChGMiwgYywgZCwgYSwgYiwgaW5bN10gKyAweDY3NmYwMmQ5LCAxNCk7CisgICAgU1RFUChGMiwgYiwgYywgZCwgYSwgaW5bMTJdICsgMHg4ZDJhNGM4YSwgMjApOworCisgICAgU1RFUChGMywgYSwgYiwgYywgZCwgaW5bNV0gKyAweGZmZmEzOTQyLCA0KTsKKyAgICBTVEVQKEYzLCBkLCBhLCBiLCBjLCBpbls4XSArIDB4ODc3MWY2ODEsIDExKTsKKyAgICBTVEVQKEYzLCBjLCBkLCBhLCBiLCBpblsxMV0gKyAweDZkOWQ2MTIyLCAxNik7CisgICAgU1RFUChGMywgYiwgYywgZCwgYSwgaW5bMTRdICsgMHhmZGU1MzgwYywgMjMpOworICAgIFNURVAoRjMsIGEsIGIsIGMsIGQsIGluWzFdICsgMHhhNGJlZWE0NCwgNCk7CisgICAgU1RFUChGMywgZCwgYSwgYiwgYywgaW5bNF0gKyAweDRiZGVjZmE5LCAxMSk7CisgICAgU1RFUChGMywgYywgZCwgYSwgYiwgaW5bN10gKyAweGY2YmI0YjYwLCAxNik7CisgICAgU1RFUChGMywgYiwgYywgZCwgYSwgaW5bMTBdICsgMHhiZWJmYmM3MCwgMjMpOworICAgIFNURVAoRjMsIGEsIGIsIGMsIGQsIGluWzEzXSArIDB4Mjg5YjdlYzYsIDQpOworICAgIFNURVAoRjMsIGQsIGEsIGIsIGMsIGluWzBdICsgMHhlYWExMjdmYSwgMTEpOworICAgIFNURVAoRjMsIGMsIGQsIGEsIGIsIGluWzNdICsgMHhkNGVmMzA4NSwgMTYpOworICAgIFNURVAoRjMsIGIsIGMsIGQsIGEsIGluWzZdICsgMHgwNDg4MWQwNSwgMjMpOworICAgIFNURVAoRjMsIGEsIGIsIGMsIGQsIGluWzldICsgMHhkOWQ0ZDAzOSwgNCk7CisgICAgU1RFUChGMywgZCwgYSwgYiwgYywgaW5bMTJdICsgMHhlNmRiOTllNSwgMTEpOworICAgIFNURVAoRjMsIGMsIGQsIGEsIGIsIGluWzE1XSArIDB4MWZhMjdjZjgsIDE2KTsKKyAgICBTVEVQKEYzLCBiLCBjLCBkLCBhLCBpblsyXSArIDB4YzRhYzU2NjUsIDIzKTsKKworICAgIFNURVAoRjQsIGEsIGIsIGMsIGQsIGluWzBdICsgMHhmNDI5MjI0NCwgNik7CisgICAgU1RFUChGNCwgZCwgYSwgYiwgYywgaW5bN10gKyAweDQzMmFmZjk3LCAxMCk7CisgICAgU1RFUChGNCwgYywgZCwgYSwgYiwgaW5bMTRdICsgMHhhYjk0MjNhNywgMTUpOworICAgIFNURVAoRjQsIGIsIGMsIGQsIGEsIGluWzVdICsgMHhmYzkzYTAzOSwgMjEpOworICAgIFNURVAoRjQsIGEsIGIsIGMsIGQsIGluWzEyXSArIDB4NjU1YjU5YzMsIDYpOworICAgIFNURVAoRjQsIGQsIGEsIGIsIGMsIGluWzNdICsgMHg4ZjBjY2M5MiwgMTApOworICAgIFNURVAoRjQsIGMsIGQsIGEsIGIsIGluWzEwXSArIDB4ZmZlZmY0N2QsIDE1KTsKKyAgICBTVEVQKEY0LCBiLCBjLCBkLCBhLCBpblsxXSArIDB4ODU4NDVkZDEsIDIxKTsKKyAgICBTVEVQKEY0LCBhLCBiLCBjLCBkLCBpbls4XSArIDB4NmZhODdlNGYsIDYpOworICAgIFNURVAoRjQsIGQsIGEsIGIsIGMsIGluWzE1XSArIDB4ZmUyY2U2ZTAsIDEwKTsKKyAgICBTVEVQKEY0LCBjLCBkLCBhLCBiLCBpbls2XSArIDB4YTMwMTQzMTQsIDE1KTsKKyAgICBTVEVQKEY0LCBiLCBjLCBkLCBhLCBpblsxM10gKyAweDRlMDgxMWExLCAyMSk7CisgICAgU1RFUChGNCwgYSwgYiwgYywgZCwgaW5bNF0gKyAweGY3NTM3ZTgyLCA2KTsKKyAgICBTVEVQKEY0LCBkLCBhLCBiLCBjLCBpblsxMV0gKyAweGJkM2FmMjM1LCAxMCk7CisgICAgU1RFUChGNCwgYywgZCwgYSwgYiwgaW5bMl0gKyAweDJhZDdkMmJiLCAxNSk7CisgICAgU1RFUChGNCwgYiwgYywgZCwgYSwgaW5bOV0gKyAweGViODZkMzkxLCAyMSk7CisKKyAgICBidWZbMF0gKz0gYTsKKyAgICBidWZbMV0gKz0gYjsKKyAgICBidWZbMl0gKz0gYzsKKyAgICBidWZbM10gKz0gZDsKK30KKworCisvLyBDcmVhdGUgYSBNRDUgb2JqZWN0CitzdGF0aWMKK2Ntc0hBTkRMRSAgTUQ1YWxsb2MoY21zQ29udGV4dCBDb250ZXh0SUQpCit7CisgICAgX2Ntc01ENSogY3R4ID0gKF9jbXNNRDUqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihfY21zTUQ1KSk7CisgICAgaWYgKGN0eCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIGN0eCAtPkNvbnRleHRJRCA9IENvbnRleHRJRDsKKworICAgIGN0eC0+YnVmWzBdID0gMHg2NzQ1MjMwMTsKKyAgICBjdHgtPmJ1ZlsxXSA9IDB4ZWZjZGFiODk7CisgICAgY3R4LT5idWZbMl0gPSAweDk4YmFkY2ZlOworICAgIGN0eC0+YnVmWzNdID0gMHgxMDMyNTQ3NjsKKworICAgIGN0eC0+Yml0c1swXSA9IDA7CisgICAgY3R4LT5iaXRzWzFdID0gMDsKKworICAgIHJldHVybiAoY21zSEFORExFKSBjdHg7Cit9CisKKworc3RhdGljCit2b2lkIE1ENWFkZChjbXNIQU5ETEUgSGFuZGxlLCBjbXNVSW50OE51bWJlciogYnVmLCBjbXNVSW50MzJOdW1iZXIgbGVuKQoreworICAgIF9jbXNNRDUqIGN0eCA9IChfY21zTUQ1KikgSGFuZGxlOworICAgIGNtc1VJbnQzMk51bWJlciB0OworCisgICAgdCA9IGN0eC0+Yml0c1swXTsKKyAgICBpZiAoKGN0eC0+Yml0c1swXSA9IHQgKyAobGVuIDw8IDMpKSA8IHQpCisgICAgICAgIGN0eC0+Yml0c1sxXSsrOworCisgICAgY3R4LT5iaXRzWzFdICs9IGxlbiA+PiAyOTsKKworICAgIHQgPSAodCA+PiAzKSAmIDB4M2Y7CisKKyAgICBpZiAodCkgeworCisgICAgICAgIGNtc1VJbnQ4TnVtYmVyICpwID0gKGNtc1VJbnQ4TnVtYmVyICopIGN0eC0+aW4gKyB0OworCisgICAgICAgIHQgPSA2NCAtIHQ7CisgICAgICAgIGlmIChsZW4gPCB0KSB7CisgICAgICAgICAgICBtZW1tb3ZlKHAsIGJ1ZiwgbGVuKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1lbW1vdmUocCwgYnVmLCB0KTsKKyAgICAgICAgYnl0ZVJldmVyc2UoY3R4LT5pbiwgMTYpOworCisgICAgICAgIE1ENV9UcmFuc2Zvcm0oY3R4LT5idWYsIChjbXNVSW50MzJOdW1iZXIgKikgY3R4LT5pbik7CisgICAgICAgIGJ1ZiArPSB0OworICAgICAgICBsZW4gLT0gdDsKKyAgICB9CisKKyAgICB3aGlsZSAobGVuID49IDY0KSB7CisgICAgICAgIG1lbW1vdmUoY3R4LT5pbiwgYnVmLCA2NCk7CisgICAgICAgIGJ5dGVSZXZlcnNlKGN0eC0+aW4sIDE2KTsKKyAgICAgICAgTUQ1X1RyYW5zZm9ybShjdHgtPmJ1ZiwgKGNtc1VJbnQzMk51bWJlciAqKSBjdHgtPmluKTsKKyAgICAgICAgYnVmICs9IDY0OworICAgICAgICBsZW4gLT0gNjQ7CisgICAgfQorCisgICAgbWVtbW92ZShjdHgtPmluLCBidWYsIGxlbik7Cit9CisKKy8vIERlc3Ryb3kgdGhlIG9iamVjdCBhbmQgcmV0dXJuIHRoZSBjaGVja3N1bQorc3RhdGljCit2b2lkIE1ENWZpbmlzaChjbXNQcm9maWxlSUQqIFByb2ZpbGVJRCwgIGNtc0hBTkRMRSBIYW5kbGUpCit7CisgICAgX2Ntc01ENSogY3R4ID0gKF9jbXNNRDUqKSBIYW5kbGU7CisgICAgY21zVUludDMyTnVtYmVyIGNvdW50OworICAgIGNtc1VJbnQ4TnVtYmVyICpwOworCisgICAgY291bnQgPSAoY3R4LT5iaXRzWzBdID4+IDMpICYgMHgzRjsKKworICAgIHAgPSBjdHgtPmluICsgY291bnQ7CisgICAgKnArKyA9IDB4ODA7CisKKyAgICBjb3VudCA9IDY0IC0gMSAtIGNvdW50OworCisgICAgaWYgKGNvdW50IDwgOCkgeworCisgICAgICAgIG1lbXNldChwLCAwLCBjb3VudCk7CisgICAgICAgIGJ5dGVSZXZlcnNlKGN0eC0+aW4sIDE2KTsKKyAgICAgICAgTUQ1X1RyYW5zZm9ybShjdHgtPmJ1ZiwgKGNtc1VJbnQzMk51bWJlciAqKSBjdHgtPmluKTsKKworICAgICAgICBtZW1zZXQoY3R4LT5pbiwgMCwgNTYpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbXNldChwLCAwLCBjb3VudCAtIDgpOworICAgIH0KKyAgICBieXRlUmV2ZXJzZShjdHgtPmluLCAxNCk7CisKKyAgICAoKGNtc1VJbnQzMk51bWJlciAqKSBjdHgtPmluKVsxNF0gPSBjdHgtPmJpdHNbMF07CisgICAgKChjbXNVSW50MzJOdW1iZXIgKikgY3R4LT5pbilbMTVdID0gY3R4LT5iaXRzWzFdOworCisgICAgTUQ1X1RyYW5zZm9ybShjdHgtPmJ1ZiwgKGNtc1VJbnQzMk51bWJlciAqKSBjdHgtPmluKTsKKworICAgIGJ5dGVSZXZlcnNlKChjbXNVSW50OE51bWJlciAqKSBjdHgtPmJ1ZiwgNCk7CisgICAgbWVtbW92ZShQcm9maWxlSUQgLT5JRDgsIGN0eC0+YnVmLCAxNik7CisKKyAgICBfY21zRnJlZShjdHggLT5Db250ZXh0SUQsIGN0eCk7Cit9CisKKworCisvLyBBc3N1bWluZyBpbyBwb2ludHMgdG8gYW4gSUNDIHByb2ZpbGUsIGNvbXB1dGUgYW5kIHN0b3JlIE1ENSBjaGVja3N1bQorLy8gSW4gdGhlIGhlYWRlciwgcmVuZGVyaW5nIGludGVudGVudCwgYXR0cmlidXRlcyBhbmQgSUQgc2hvdWxkIGJlIHNldCB0byB6ZXJvCisvLyBiZWZvcmUgY29tcHV0aW5nIE1ENSBjaGVja3N1bSAocGVyIDYuMS4xMyBpbiBJQ0Mgc3BlYykKKworY21zQm9vbCBDTVNFWFBPUlQgY21zTUQ1Y29tcHV0ZUlEKGNtc0hQUk9GSUxFIGhQcm9maWxlKQoreworICAgIGNtc0NvbnRleHQgICBDb250ZXh0SUQ7CisgICAgY21zVUludDMyTnVtYmVyIEJ5dGVzTmVlZGVkOworICAgIGNtc1VJbnQ4TnVtYmVyKiBNZW0gPSBOVUxMOworICAgIGNtc0hBTkRMRSAgTUQ1ID0gTlVMTDsKKyAgICBfY21zSUNDUFJPRklMRSogSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7CisgICAgX2Ntc0lDQ1BST0ZJTEUgS2VlcDsKKworICAgIF9jbXNBc3NlcnQoaFByb2ZpbGUgIT0gTlVMTCk7CisKKyAgICBDb250ZXh0SUQgPSBjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKTsKKworICAgIC8vIFNhdmUgYSBjb3B5IG9mIHRoZSBwcm9maWxlIGhlYWRlcgorICAgIG1lbW1vdmUoJktlZXAsIEljYywgc2l6ZW9mKF9jbXNJQ0NQUk9GSUxFKSk7CisKKyAgICAvLyBTZXQgUkksIGF0dHJpYnV0ZXMgYW5kIElECisgICAgbWVtc2V0KCZJY2MgLT5hdHRyaWJ1dGVzLCAwLCBzaXplb2YoSWNjIC0+YXR0cmlidXRlcykpOworICAgIEljYyAtPlJlbmRlcmluZ0ludGVudCA9IDA7CisgICAgbWVtc2V0KCZJY2MgLT5Qcm9maWxlSUQsIDAsIHNpemVvZihJY2MgLT5Qcm9maWxlSUQpKTsKKworICAgIC8vIENvbXB1dGUgbmVlZGVkIHN0b3JhZ2UKKyAgICBpZiAoIWNtc1NhdmVQcm9maWxlVG9NZW0oaFByb2ZpbGUsIE5VTEwsICZCeXRlc05lZWRlZCkpIGdvdG8gRXJyb3I7CisKKyAgICAvLyBBbGxvY2F0ZSBtZW1vcnkKKyAgICBNZW0gPSAoY21zVUludDhOdW1iZXIqKSBfY21zTWFsbG9jKENvbnRleHRJRCwgQnl0ZXNOZWVkZWQpOworICAgIGlmIChNZW0gPT0gTlVMTCkgZ290byBFcnJvcjsKKworICAgIC8vIFNhdmUgdG8gdGVtcG9yYXJ5IHN0b3JhZ2UKKyAgICBpZiAoIWNtc1NhdmVQcm9maWxlVG9NZW0oaFByb2ZpbGUsIE1lbSwgJkJ5dGVzTmVlZGVkKSkgZ290byBFcnJvcjsKKworICAgIC8vIENyZWF0ZSBNRDUgb2JqZWN0CisgICAgTUQ1ID0gTUQ1YWxsb2MoQ29udGV4dElEKTsKKyAgICBpZiAoTUQ1ID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgICAvLyBBZGQgYWxsIGJ5dGVzCisgICAgTUQ1YWRkKE1ENSwgTWVtLCBCeXRlc05lZWRlZCk7CisKKyAgICAvLyBUZW1wIHN0b3JhZ2UgaXMgbm8gbG9uZ2VyIG5lZWRlZAorICAgIF9jbXNGcmVlKENvbnRleHRJRCwgTWVtKTsKKworICAgIC8vIFJlc3RvcmUgaGVhZGVyCisgICAgbWVtbW92ZShJY2MsICZLZWVwLCBzaXplb2YoX2Ntc0lDQ1BST0ZJTEUpKTsKKworICAgIC8vIEFuZCBzdG9yZSB0aGUgSUQKKyAgICBNRDVmaW5pc2goJkljYyAtPlByb2ZpbGVJRCwgIE1ENSk7CisgICAgcmV0dXJuIFRSVUU7CisKK0Vycm9yOgorCisgICAgLy8gRnJlZSByZXNvdXJjZXMgYXMgc29tZXRoaW5nIHdlbnQgd3JvbmcKKyAgICAvLyAiTUQ1IiBjYW5ub3QgYmUgb3RoZXIgdGhhbiBOVUxMIGhlcmUsIHNvIG5vIG5lZWQgdG8gZnJlZSBpdAorICAgIGlmIChNZW0gIT0gTlVMTCkgX2Ntc0ZyZWUoQ29udGV4dElELCBNZW0pOworICAgIG1lbW1vdmUoSWNjLCAmS2VlcCwgc2l6ZW9mKF9jbXNJQ0NQUk9GSUxFKSk7CisgICAgcmV0dXJuIEZBTFNFOworfQorCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNtdHJ4LmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNtdHJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBlNTQ2MQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc210cnguYwpAQCAtMCwwICsxLDE3NiBAQAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCisvLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTYgTWFydGkgTWFyaWEgU2FndWVyCisvLworLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisvLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisvLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisvLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKy8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQorLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKy8vCisvLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisvLworLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisvLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KKy8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisvLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCisvLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisvLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKy8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworCisjaW5jbHVkZSAibGNtczJfaW50ZXJuYWwuaCIKKworCisjZGVmaW5lIERTV0FQKHgsIHkpICAgICB7Y21zRmxvYXQ2NE51bWJlciB0bXAgPSAoeCk7ICh4KT0oeSk7ICh5KT10bXA7fQorCisKKy8vIEluaXRpYXRlIGEgdmVjdG9yCit2b2lkIENNU0VYUE9SVCBfY21zVkVDM2luaXQoY21zVkVDMyogciwgY21zRmxvYXQ2NE51bWJlciB4LCBjbXNGbG9hdDY0TnVtYmVyIHksIGNtc0Zsb2F0NjROdW1iZXIgeikKK3sKKyAgICByIC0+IG5bVlhdID0geDsKKyAgICByIC0+IG5bVlldID0geTsKKyAgICByIC0+IG5bVlpdID0gejsKK30KKworLy8gVmVjdG9yIHN1YnRyYWN0aW9uCit2b2lkIENNU0VYUE9SVCBfY21zVkVDM21pbnVzKGNtc1ZFQzMqIHIsIGNvbnN0IGNtc1ZFQzMqIGEsIGNvbnN0IGNtc1ZFQzMqIGIpCit7CisgIHIgLT4gbltWWF0gPSBhIC0+IG5bVlhdIC0gYiAtPiBuW1ZYXTsKKyAgciAtPiBuW1ZZXSA9IGEgLT4gbltWWV0gLSBiIC0+IG5bVlldOworICByIC0+IG5bVlpdID0gYSAtPiBuW1ZaXSAtIGIgLT4gbltWWl07Cit9CisKKy8vIFZlY3RvciBjcm9zcyBwcm9kdWN0Cit2b2lkIENNU0VYUE9SVCBfY21zVkVDM2Nyb3NzKGNtc1ZFQzMqIHIsIGNvbnN0IGNtc1ZFQzMqIHUsIGNvbnN0IGNtc1ZFQzMqIHYpCit7CisgICAgciAtPm5bVlhdID0gdS0+bltWWV0gKiB2LT5uW1ZaXSAtIHYtPm5bVlldICogdS0+bltWWl07CisgICAgciAtPm5bVlldID0gdS0+bltWWl0gKiB2LT5uW1ZYXSAtIHYtPm5bVlpdICogdS0+bltWWF07CisgICAgciAtPm5bVlpdID0gdS0+bltWWF0gKiB2LT5uW1ZZXSAtIHYtPm5bVlhdICogdS0+bltWWV07Cit9CisKKy8vIFZlY3RvciBkb3QgcHJvZHVjdAorY21zRmxvYXQ2NE51bWJlciBDTVNFWFBPUlQgX2Ntc1ZFQzNkb3QoY29uc3QgY21zVkVDMyogdSwgY29uc3QgY21zVkVDMyogdikKK3sKKyAgICByZXR1cm4gdS0+bltWWF0gKiB2LT5uW1ZYXSArIHUtPm5bVlldICogdi0+bltWWV0gKyB1LT5uW1ZaXSAqIHYtPm5bVlpdOworfQorCisvLyBFdWNsaWRlYW4gbGVuZ3RoCitjbXNGbG9hdDY0TnVtYmVyIENNU0VYUE9SVCBfY21zVkVDM2xlbmd0aChjb25zdCBjbXNWRUMzKiBhKQoreworICAgIHJldHVybiBzcXJ0KGEgLT5uW1ZYXSAqIGEgLT5uW1ZYXSArCisgICAgICAgICAgICAgICAgYSAtPm5bVlldICogYSAtPm5bVlldICsKKyAgICAgICAgICAgICAgICBhIC0+bltWWl0gKiBhIC0+bltWWl0pOworfQorCisvLyBFdWNsaWRlYW4gZGlzdGFuY2UKK2Ntc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIF9jbXNWRUMzZGlzdGFuY2UoY29uc3QgY21zVkVDMyogYSwgY29uc3QgY21zVkVDMyogYikKK3sKKyAgICBjbXNGbG9hdDY0TnVtYmVyIGQxID0gYSAtPm5bVlhdIC0gYiAtPm5bVlhdOworICAgIGNtc0Zsb2F0NjROdW1iZXIgZDIgPSBhIC0+bltWWV0gLSBiIC0+bltWWV07CisgICAgY21zRmxvYXQ2NE51bWJlciBkMyA9IGEgLT5uW1ZaXSAtIGIgLT5uW1ZaXTsKKworICAgIHJldHVybiBzcXJ0KGQxKmQxICsgZDIqZDIgKyBkMypkMyk7Cit9CisKKworCisvLyAzeDMgSWRlbnRpdHkKK3ZvaWQgQ01TRVhQT1JUIF9jbXNNQVQzaWRlbnRpdHkoY21zTUFUMyogYSkKK3sKKyAgICBfY21zVkVDM2luaXQoJmEtPiB2WzBdLCAxLjAsIDAuMCwgMC4wKTsKKyAgICBfY21zVkVDM2luaXQoJmEtPiB2WzFdLCAwLjAsIDEuMCwgMC4wKTsKKyAgICBfY21zVkVDM2luaXQoJmEtPiB2WzJdLCAwLjAsIDAuMCwgMS4wKTsKK30KKworc3RhdGljCitjbXNCb29sIENsb3NlRW5vdWdoKGNtc0Zsb2F0NjROdW1iZXIgYSwgY21zRmxvYXQ2NE51bWJlciBiKQoreworICAgIHJldHVybiBmYWJzKGIgLSBhKSA8ICgxLjAgLyA2NTUzNS4wKTsKK30KKworCitjbXNCb29sIENNU0VYUE9SVCBfY21zTUFUM2lzSWRlbnRpdHkoY29uc3QgY21zTUFUMyogYSkKK3sKKyAgICBjbXNNQVQzIElkZW50aXR5OworICAgIGludCBpLCBqOworCisgICAgX2Ntc01BVDNpZGVudGl0eSgmSWRlbnRpdHkpOworCisgICAgZm9yIChpPTA7IGkgPCAzOyBpKyspCisgICAgICAgIGZvciAoaj0wOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgaWYgKCFDbG9zZUVub3VnaChhIC0+dltpXS5uW2pdLCBJZGVudGl0eS52W2ldLm5bal0pKSByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLyBNdWx0aXBseSB0d28gbWF0cmljZXMKK3ZvaWQgQ01TRVhQT1JUIF9jbXNNQVQzcGVyKGNtc01BVDMqIHIsIGNvbnN0IGNtc01BVDMqIGEsIGNvbnN0IGNtc01BVDMqIGIpCit7CisjZGVmaW5lIFJPV0NPTChpLCBqKSBcCisgICAgYS0+dltpXS5uWzBdKmItPnZbMF0ubltqXSArIGEtPnZbaV0ublsxXSpiLT52WzFdLm5bal0gKyBhLT52W2ldLm5bMl0qYi0+dlsyXS5uW2pdCisKKyAgICBfY21zVkVDM2luaXQoJnItPiB2WzBdLCBST1dDT0woMCwwKSwgUk9XQ09MKDAsMSksIFJPV0NPTCgwLDIpKTsKKyAgICBfY21zVkVDM2luaXQoJnItPiB2WzFdLCBST1dDT0woMSwwKSwgUk9XQ09MKDEsMSksIFJPV0NPTCgxLDIpKTsKKyAgICBfY21zVkVDM2luaXQoJnItPiB2WzJdLCBST1dDT0woMiwwKSwgUk9XQ09MKDIsMSksIFJPV0NPTCgyLDIpKTsKKworI3VuZGVmIFJPV0NPTCAvLyhpLCBqKQorfQorCisKKworLy8gSW52ZXJzZSBvZiBhIG1hdHJpeCBiID0gYV4oLTEpCitjbXNCb29sICBDTVNFWFBPUlQgX2Ntc01BVDNpbnZlcnNlKGNvbnN0IGNtc01BVDMqIGEsIGNtc01BVDMqIGIpCit7CisgICBjbXNGbG9hdDY0TnVtYmVyIGRldCwgYzAsIGMxLCBjMjsKKworICAgYzAgPSAgYSAtPiB2WzFdLm5bMV0qYSAtPiB2WzJdLm5bMl0gLSBhIC0+IHZbMV0ublsyXSphIC0+IHZbMl0ublsxXTsKKyAgIGMxID0gLWEgLT4gdlsxXS5uWzBdKmEgLT4gdlsyXS5uWzJdICsgYSAtPiB2WzFdLm5bMl0qYSAtPiB2WzJdLm5bMF07CisgICBjMiA9ICBhIC0+IHZbMV0ublswXSphIC0+IHZbMl0ublsxXSAtIGEgLT4gdlsxXS5uWzFdKmEgLT4gdlsyXS5uWzBdOworCisgICBkZXQgPSBhIC0+IHZbMF0ublswXSpjMCArIGEgLT4gdlswXS5uWzFdKmMxICsgYSAtPiB2WzBdLm5bMl0qYzI7CisKKyAgIGlmIChmYWJzKGRldCkgPCBNQVRSSVhfREVUX1RPTEVSQU5DRSkgcmV0dXJuIEZBTFNFOyAgLy8gc2luZ3VsYXIgbWF0cml4OyBjYW4ndCBpbnZlcnQKKworICAgYiAtPiB2WzBdLm5bMF0gPSBjMC9kZXQ7CisgICBiIC0+IHZbMF0ublsxXSA9IChhIC0+IHZbMF0ublsyXSphIC0+IHZbMl0ublsxXSAtIGEgLT4gdlswXS5uWzFdKmEgLT4gdlsyXS5uWzJdKS9kZXQ7CisgICBiIC0+IHZbMF0ublsyXSA9IChhIC0+IHZbMF0ublsxXSphIC0+IHZbMV0ublsyXSAtIGEgLT4gdlswXS5uWzJdKmEgLT4gdlsxXS5uWzFdKS9kZXQ7CisgICBiIC0+IHZbMV0ublswXSA9IGMxL2RldDsKKyAgIGIgLT4gdlsxXS5uWzFdID0gKGEgLT4gdlswXS5uWzBdKmEgLT4gdlsyXS5uWzJdIC0gYSAtPiB2WzBdLm5bMl0qYSAtPiB2WzJdLm5bMF0pL2RldDsKKyAgIGIgLT4gdlsxXS5uWzJdID0gKGEgLT4gdlswXS5uWzJdKmEgLT4gdlsxXS5uWzBdIC0gYSAtPiB2WzBdLm5bMF0qYSAtPiB2WzFdLm5bMl0pL2RldDsKKyAgIGIgLT4gdlsyXS5uWzBdID0gYzIvZGV0OworICAgYiAtPiB2WzJdLm5bMV0gPSAoYSAtPiB2WzBdLm5bMV0qYSAtPiB2WzJdLm5bMF0gLSBhIC0+IHZbMF0ublswXSphIC0+IHZbMl0ublsxXSkvZGV0OworICAgYiAtPiB2WzJdLm5bMl0gPSAoYSAtPiB2WzBdLm5bMF0qYSAtPiB2WzFdLm5bMV0gLSBhIC0+IHZbMF0ublsxXSphIC0+IHZbMV0ublswXSkvZGV0OworCisgICByZXR1cm4gVFJVRTsKK30KKworCisvLyBTb2x2ZSBhIHN5c3RlbSBpbiB0aGUgZm9ybSBBeCA9IGIKK2Ntc0Jvb2wgIENNU0VYUE9SVCBfY21zTUFUM3NvbHZlKGNtc1ZFQzMqIHgsIGNtc01BVDMqIGEsIGNtc1ZFQzMqIGIpCit7CisgICAgY21zTUFUMyBtLCBhXzE7CisKKyAgICBtZW1tb3ZlKCZtLCBhLCBzaXplb2YoY21zTUFUMykpOworCisgICAgaWYgKCFfY21zTUFUM2ludmVyc2UoJm0sICZhXzEpKSByZXR1cm4gRkFMU0U7ICAvLyBTaW5ndWxhciBtYXRyaXgKKworICAgIF9jbXNNQVQzZXZhbCh4LCAmYV8xLCBiKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gRXZhbHVhdGUgYSB2ZWN0b3IgYWNyb3NzIGEgbWF0cml4Cit2b2lkIENNU0VYUE9SVCBfY21zTUFUM2V2YWwoY21zVkVDMyogciwgY29uc3QgY21zTUFUMyogYSwgY29uc3QgY21zVkVDMyogdikKK3sKKyAgICByLT5uW1ZYXSA9IGEtPnZbMF0ubltWWF0qdi0+bltWWF0gKyBhLT52WzBdLm5bVlldKnYtPm5bVlldICsgYS0+dlswXS5uW1ZaXSp2LT5uW1ZaXTsKKyAgICByLT5uW1ZZXSA9IGEtPnZbMV0ubltWWF0qdi0+bltWWF0gKyBhLT52WzFdLm5bVlldKnYtPm5bVlldICsgYS0+dlsxXS5uW1ZaXSp2LT5uW1ZaXTsKKyAgICByLT5uW1ZaXSA9IGEtPnZbMl0ubltWWF0qdi0+bltWWF0gKyBhLT52WzJdLm5bVlldKnYtPm5bVlldICsgYS0+dlsyXS5uW1ZaXSp2LT5uW1ZaXTsKK30KKworCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNuYW1lZC5jIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zbmFtZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWQ0Y2FkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zbmFtZWQuYwpAQCAtMCwwICsxLDk2MiBAQAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCisvLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTYgTWFydGkgTWFyaWEgU2FndWVyCisvLworLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisvLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisvLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisvLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKy8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQorLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKy8vCisvLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisvLworLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisvLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KKy8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisvLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCisvLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisvLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKy8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworCisjaW5jbHVkZSAibGNtczJfaW50ZXJuYWwuaCIKKworLy8gTXVsdGlsb2NhbGl6ZWQgdW5pY29kZSBvYmplY3RzLiBUaGF0IGlzIGFuIGF0dGVtcHQgdG8gZW5jYXBzdWxhdGUgaTE4bi4KKworCisvLyBBbGxvY2F0ZXMgYW4gZW1wdHkgbXVsdGkgbG9jYWxpemFkIHVuaWNvZGUgb2JqZWN0CitjbXNNTFUqIENNU0VYUE9SVCBjbXNNTFVhbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKK3sKKyAgICBjbXNNTFUqIG1sdTsKKworICAgIC8vIG5JdGVtcyBzaG91bGQgYmUgcG9zaXRpdmUgaWYgZ2l2ZW4KKyAgICBpZiAobkl0ZW1zIDw9IDApIG5JdGVtcyA9IDI7CisKKyAgICAvLyBDcmVhdGUgdGhlIGNvbnRhaW5lcgorICAgIG1sdSA9IChjbXNNTFUqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihjbXNNTFUpKTsKKyAgICBpZiAobWx1ID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgbWx1IC0+Q29udGV4dElEID0gQ29udGV4dElEOworCisgICAgLy8gQ3JlYXRlIGVudHJ5IGFycmF5CisgICAgbWx1IC0+RW50cmllcyA9IChfY21zTUxVZW50cnkqKSBfY21zQ2FsbG9jKENvbnRleHRJRCwgbkl0ZW1zLCBzaXplb2YoX2Ntc01MVWVudHJ5KSk7CisgICAgaWYgKG1sdSAtPkVudHJpZXMgPT0gTlVMTCkgeworICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIG1sdSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIE9rLCBrZWVwIGluZGV4ZXMgdXAgdG8gZGF0ZQorICAgIG1sdSAtPkFsbG9jYXRlZEVudHJpZXMgICAgPSBuSXRlbXM7CisgICAgbWx1IC0+VXNlZEVudHJpZXMgICAgICAgICA9IDA7CisKKyAgICByZXR1cm4gbWx1OworfQorCisKKy8vIEdyb3dzIGEgbWVtcG9vbCB0YWJsZSBmb3IgYSBNTFUuIEVhY2ggdGltZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgbWVtcG9vbCBzaXplIGlzIG11bHRpcGxpZWQgdGltZXMgdHdvLgorc3RhdGljCitjbXNCb29sIEdyb3dNTFVwb29sKGNtc01MVSogbWx1KQoreworICAgIGNtc1VJbnQzMk51bWJlciBzaXplOworICAgIHZvaWQgKk5ld1B0cjsKKworICAgIC8vIFNhbml0eSBjaGVjaworICAgIGlmIChtbHUgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKG1sdSAtPlBvb2xTaXplID09IDApCisgICAgICAgIHNpemUgPSAyNTY7CisgICAgZWxzZQorICAgICAgICBzaXplID0gbWx1IC0+UG9vbFNpemUgKiAyOworCisgICAgLy8gQ2hlY2sgZm9yIG92ZXJmbG93CisgICAgaWYgKHNpemUgPCBtbHUgLT5Qb29sU2l6ZSkgcmV0dXJuIEZBTFNFOworCisgICAgLy8gUmVhbGxvY2F0ZSB0aGUgcG9vbAorICAgIE5ld1B0ciA9IF9jbXNSZWFsbG9jKG1sdSAtPkNvbnRleHRJRCwgbWx1IC0+TWVtUG9vbCwgc2l6ZSk7CisgICAgaWYgKE5ld1B0ciA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKworICAgIG1sdSAtPk1lbVBvb2wgID0gTmV3UHRyOworICAgIG1sdSAtPlBvb2xTaXplID0gc2l6ZTsKKworICAgIHJldHVybiBUUlVFOworfQorCisKKy8vIEdyb3dzIGEgZW50cnkgdGFibGUgZm9yIGEgTUxVLiBFYWNoIHRpbWUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHRhYmxlIHNpemUgaXMgbXVsdGlwbGllZCB0aW1lcyB0d28uCitzdGF0aWMKK2Ntc0Jvb2wgR3Jvd01MVXRhYmxlKGNtc01MVSogbWx1KQoreworICAgIGNtc1VJbnQzMk51bWJlciBBbGxvY2F0ZWRFbnRyaWVzOworICAgIF9jbXNNTFVlbnRyeSAqTmV3UHRyOworCisgICAgLy8gU2FuaXR5IGNoZWNrCisgICAgaWYgKG1sdSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICBBbGxvY2F0ZWRFbnRyaWVzID0gbWx1IC0+QWxsb2NhdGVkRW50cmllcyAqIDI7CisKKyAgICAvLyBDaGVjayBmb3Igb3ZlcmZsb3cKKyAgICBpZiAoQWxsb2NhdGVkRW50cmllcyAvIDIgIT0gbWx1IC0+QWxsb2NhdGVkRW50cmllcykgcmV0dXJuIEZBTFNFOworCisgICAgLy8gUmVhbGxvY2F0ZSB0aGUgbWVtb3J5CisgICAgTmV3UHRyID0gKF9jbXNNTFVlbnRyeSopX2Ntc1JlYWxsb2MobWx1IC0+Q29udGV4dElELCBtbHUgLT5FbnRyaWVzLCBBbGxvY2F0ZWRFbnRyaWVzKnNpemVvZihfY21zTUxVZW50cnkpKTsKKyAgICBpZiAoTmV3UHRyID09IE5VTEwpIHJldHVybiBGQUxTRTsKKworICAgIG1sdSAtPkVudHJpZXMgICAgICAgICAgPSBOZXdQdHI7CisgICAgbWx1IC0+QWxsb2NhdGVkRW50cmllcyA9IEFsbG9jYXRlZEVudHJpZXM7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLyBTZWFyY2ggZm9yIGEgc3BlY2lmaWMgZW50cnkgaW4gdGhlIHN0cnVjdHVyZS4gTGFuZ3VhZ2UgYW5kIENvdW50cnkgYXJlIHVzZWQuCitzdGF0aWMKK2ludCBTZWFyY2hNTFVFbnRyeShjbXNNTFUqIG1sdSwgY21zVUludDE2TnVtYmVyIExhbmd1YWdlQ29kZSwgY21zVUludDE2TnVtYmVyIENvdW50cnlDb2RlKQoreworICAgIGNtc1VJbnQzMk51bWJlciBpOworCisgICAgLy8gU2FuaXR5IGNoZWNrCisgICAgaWYgKG1sdSA9PSBOVUxMKSByZXR1cm4gLTE7CisKKyAgICAvLyBJdGVyYXRlIHdob2xlIHRhYmxlCisgICAgZm9yIChpPTA7IGkgPCBtbHUgLT5Vc2VkRW50cmllczsgaSsrKSB7CisKKyAgICAgICAgaWYgKG1sdSAtPkVudHJpZXNbaV0uQ291bnRyeSAgPT0gQ291bnRyeUNvZGUgJiYKKyAgICAgICAgICAgIG1sdSAtPkVudHJpZXNbaV0uTGFuZ3VhZ2UgPT0gTGFuZ3VhZ2VDb2RlKSByZXR1cm4gaTsKKyAgICB9CisKKyAgICAvLyBOb3QgZm91bmQKKyAgICByZXR1cm4gLTE7Cit9CisKKy8vIEFkZCBhIGJsb2NrIG9mIGNoYXJhY3RlcnMgdG8gdGhlIGludGVuZGVkIE1MVS4gTGFuZ3VhZ2UgYW5kIGNvdW50cnkgYXJlIHNwZWNpZmllZC4KKy8vIE9ubHkgb25lIGVudHJ5IGZvciBMYW5ndWFnZS9jb3VudHJ5IHBhaXIgaXMgYWxsb3dlZC4KK3N0YXRpYworY21zQm9vbCBBZGRNTFVCbG9jayhjbXNNTFUqIG1sdSwgY21zVUludDMyTnVtYmVyIHNpemUsIGNvbnN0IHdjaGFyX3QgKkJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgY21zVUludDE2TnVtYmVyIExhbmd1YWdlQ29kZSwgY21zVUludDE2TnVtYmVyIENvdW50cnlDb2RlKQoreworICAgIGNtc1VJbnQzMk51bWJlciBPZmZzZXQ7CisgICAgY21zVUludDhOdW1iZXIqIFB0cjsKKworICAgIC8vIFNhbml0eSBjaGVjaworICAgIGlmIChtbHUgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworCisgICAgLy8gSXMgdGhlcmUgYW55IHJvb20gYXZhaWxhYmxlPworICAgIGlmIChtbHUgLT5Vc2VkRW50cmllcyA+PSBtbHUgLT5BbGxvY2F0ZWRFbnRyaWVzKSB7CisgICAgICAgIGlmICghR3Jvd01MVXRhYmxlKG1sdSkpIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvLyBPbmx5IG9uZSBBU0NJSSBzdHJpbmcKKyAgICBpZiAoU2VhcmNoTUxVRW50cnkobWx1LCBMYW5ndWFnZUNvZGUsIENvdW50cnlDb2RlKSA+PSAwKSByZXR1cm4gRkFMU0U7ICAvLyBPbmx5IG9uZSAgaXMgYWxsb3dlZCEKKworICAgIC8vIENoZWNrIGZvciBzaXplCisgICAgd2hpbGUgKChtbHUgLT5Qb29sU2l6ZSAtIG1sdSAtPlBvb2xVc2VkKSA8IHNpemUpIHsKKworICAgICAgICAgICAgaWYgKCFHcm93TUxVcG9vbChtbHUpKSByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgT2Zmc2V0ID0gbWx1IC0+UG9vbFVzZWQ7CisKKyAgICBQdHIgPSAoY21zVUludDhOdW1iZXIqKSBtbHUgLT5NZW1Qb29sOworICAgIGlmIChQdHIgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworCisgICAgLy8gU2V0IHRoZSBlbnRyeQorICAgIG1lbW1vdmUoUHRyICsgT2Zmc2V0LCBCbG9jaywgc2l6ZSk7CisgICAgbWx1IC0+UG9vbFVzZWQgKz0gc2l6ZTsKKworICAgIG1sdSAtPkVudHJpZXNbbWx1IC0+VXNlZEVudHJpZXNdLlN0clcgICAgID0gT2Zmc2V0OworICAgIG1sdSAtPkVudHJpZXNbbWx1IC0+VXNlZEVudHJpZXNdLkxlbiAgICAgID0gc2l6ZTsKKyAgICBtbHUgLT5FbnRyaWVzW21sdSAtPlVzZWRFbnRyaWVzXS5Db3VudHJ5ICA9IENvdW50cnlDb2RlOworICAgIG1sdSAtPkVudHJpZXNbbWx1IC0+VXNlZEVudHJpZXNdLkxhbmd1YWdlID0gTGFuZ3VhZ2VDb2RlOworICAgIG1sdSAtPlVzZWRFbnRyaWVzKys7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gQ29udmVydCBmcm9tIGEgMy1jaGFyIGNvZGUgdG8gYSBjbXNVSW50MTZOdW1iZXIuIEl0IGlzIGRvbmUgaW50aGlzIHdheSBiZWNhdXNlIHNvbWUKKy8vIGNvbXBpbGVycyBkb24ndCBwcm9wZXJseSBhbGlnbiBiZWdpbm5pbmcgb2Ygc3RyaW5ncworCitzdGF0aWMKK2Ntc1VJbnQxNk51bWJlciBzdHJUbzE2KGNvbnN0IGNoYXIgc3RyWzNdKQoreworICAgIGNtc1VJbnQxNk51bWJlciBuID0gKChjbXNVSW50MTZOdW1iZXIpIHN0clswXSA8PCA4KSB8IHN0clsxXTsKKworICAgIHJldHVybiBuOyAgLy8gQWx3YXlzIGJpZyBlbmRpYW4gaW4gdGhpcyBjYXNlCit9CisKK3N0YXRpYwordm9pZCBzdHJGcm9tMTYoY2hhciBzdHJbM10sIGNtc1VJbnQxNk51bWJlciBuKQoreworICAgIC8vIEFzc2ltaW5nIHRoaXMgd291bGQgYmUgYWxpZ25lZAorICAgIHVuaW9uIHsKKworICAgICAgIGNtc1VJbnQxNk51bWJlciBuOworICAgICAgIGNoYXIgc3RyWzJdOworICAgICAgIAorICAgIH0gYzsKKworICAgIGMubiA9IG47ICAvLyBBbHdheXMgYmlnIGVuZGlhbiBpbiB0aGlzIGNhc2UKKworICAgIHN0clswXSA9IGMuc3RyWzBdOyBzdHJbMV0gPSBjLnN0clsxXTsgc3RyWzJdID0gMDsKKworfQorCisvLyBBZGQgYW4gQVNDSUkgZW50cnkuIERvIG5vdCBhZGQgYW55IFwwIHRlcm1pbmF0aW9uIChJQ0MxdjQzXzIwMTAtMTIucGRmIHBhZ2UgNjEpCitjbXNCb29sIENNU0VYUE9SVCBjbXNNTFVzZXRBU0NJSShjbXNNTFUqIG1sdSwgY29uc3QgY2hhciBMYW5ndWFnZUNvZGVbM10sIGNvbnN0IGNoYXIgQ291bnRyeUNvZGVbM10sIGNvbnN0IGNoYXIqIEFTQ0lJU3RyaW5nKQoreworICAgIGNtc1VJbnQzMk51bWJlciBpLCBsZW4gPSAoY21zVUludDMyTnVtYmVyKSBzdHJsZW4oQVNDSUlTdHJpbmcpOworICAgIHdjaGFyX3QqIFdTdHI7CisgICAgY21zQm9vbCAgcmM7CisgICAgY21zVUludDE2TnVtYmVyIExhbmcgID0gc3RyVG8xNihMYW5ndWFnZUNvZGUpOworICAgIGNtc1VJbnQxNk51bWJlciBDbnRyeSA9IHN0clRvMTYoQ291bnRyeUNvZGUpOworCisgICAgaWYgKG1sdSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICBXU3RyID0gKHdjaGFyX3QqKSBfY21zQ2FsbG9jKG1sdSAtPkNvbnRleHRJRCwgbGVuLCAgc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICBpZiAoV1N0ciA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICBmb3IgKGk9MDsgaSA8IGxlbjsgaSsrKQorICAgICAgICBXU3RyW2ldID0gKHdjaGFyX3QpIEFTQ0lJU3RyaW5nW2ldOworCisgICAgcmMgPSBBZGRNTFVCbG9jayhtbHUsIGxlbiAgKiBzaXplb2Yod2NoYXJfdCksIFdTdHIsIExhbmcsIENudHJ5KTsKKworICAgIF9jbXNGcmVlKG1sdSAtPkNvbnRleHRJRCwgV1N0cik7CisgICAgcmV0dXJuIHJjOworCit9CisKKy8vIFdlIGRvbid0IG5lZWQgYW55IHdjcyBzdXBwb3J0IGxpYnJhcnkKK3N0YXRpYworY21zVUludDMyTnVtYmVyIG15d2NzbGVuKGNvbnN0IHdjaGFyX3QgKnMpCit7CisgICAgY29uc3Qgd2NoYXJfdCAqcDsKKworICAgIHAgPSBzOworICAgIHdoaWxlICgqcCkKKyAgICAgICAgcCsrOworCisgICAgcmV0dXJuIChjbXNVSW50MzJOdW1iZXIpKHAgLSBzKTsKK30KKworLy8gQWRkIGEgd2lkZSBlbnRyeS4gRG8gbm90IGFkZCBhbnkgXDAgdGVybWluYXRvciAoSUNDMXY0M18yMDEwLTEyLnBkZiBwYWdlIDYxKQorY21zQm9vbCAgQ01TRVhQT1JUIGNtc01MVXNldFdpZGUoY21zTUxVKiBtbHUsIGNvbnN0IGNoYXIgTGFuZ3VhZ2VbM10sIGNvbnN0IGNoYXIgQ291bnRyeVszXSwgY29uc3Qgd2NoYXJfdCogV2lkZVN0cmluZykKK3sKKyAgICBjbXNVSW50MTZOdW1iZXIgTGFuZyAgPSBzdHJUbzE2KExhbmd1YWdlKTsKKyAgICBjbXNVSW50MTZOdW1iZXIgQ250cnkgPSBzdHJUbzE2KENvdW50cnkpOworICAgIGNtc1VJbnQzMk51bWJlciBsZW47CisKKyAgICBpZiAobWx1ID09IE5VTEwpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoV2lkZVN0cmluZyA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICBsZW4gPSAoY21zVUludDMyTnVtYmVyKSAobXl3Y3NsZW4oV2lkZVN0cmluZykpICogc2l6ZW9mKHdjaGFyX3QpOworICAgIHJldHVybiBBZGRNTFVCbG9jayhtbHUsIGxlbiwgV2lkZVN0cmluZywgTGFuZywgQ250cnkpOworfQorCisvLyBEdXBsaWNhdGluZyBhIE1MVSBpcyBhcyBlYXN5IGFzIGNvcHlpbmcgYWxsIG1lbWJlcnMKK2Ntc01MVSogQ01TRVhQT1JUIGNtc01MVWR1cChjb25zdCBjbXNNTFUqIG1sdSkKK3sKKyAgICBjbXNNTFUqIE5ld01sdSA9IE5VTEw7CisKKyAgICAvLyBEdXBsaWNhdGluZyBhIE5VTEwgb2J0YWlucyBhIE5VTEwKKyAgICBpZiAobWx1ID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgTmV3TWx1ID0gY21zTUxVYWxsb2MobWx1IC0+Q29udGV4dElELCBtbHUgLT5Vc2VkRW50cmllcyk7CisgICAgaWYgKE5ld01sdSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4KKyAgICBpZiAoTmV3TWx1IC0+QWxsb2NhdGVkRW50cmllcyA8IG1sdSAtPlVzZWRFbnRyaWVzKQorICAgICAgICBnb3RvIEVycm9yOworCisgICAgLy8gU2FuaXRpemUuLi4KKyAgICBpZiAoTmV3TWx1IC0+RW50cmllcyA9PSBOVUxMIHx8IG1sdSAtPkVudHJpZXMgPT0gTlVMTCkgIGdvdG8gRXJyb3I7CisKKyAgICBtZW1tb3ZlKE5ld01sdSAtPkVudHJpZXMsIG1sdSAtPkVudHJpZXMsIG1sdSAtPlVzZWRFbnRyaWVzICogc2l6ZW9mKF9jbXNNTFVlbnRyeSkpOworICAgIE5ld01sdSAtPlVzZWRFbnRyaWVzID0gbWx1IC0+VXNlZEVudHJpZXM7CisKKyAgICAvLyBUaGUgTUxVIG1heSBiZSBlbXB0eQorICAgIGlmIChtbHUgLT5Qb29sVXNlZCA9PSAwKSB7CisgICAgICAgIE5ld01sdSAtPk1lbVBvb2wgPSBOVUxMOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8gSXQgaXMgbm90IGVtcHR5CisgICAgICAgIE5ld01sdSAtPk1lbVBvb2wgPSBfY21zTWFsbG9jKG1sdSAtPkNvbnRleHRJRCwgbWx1IC0+UG9vbFVzZWQpOworICAgICAgICBpZiAoTmV3TWx1IC0+TWVtUG9vbCA9PSBOVUxMKSBnb3RvIEVycm9yOworICAgIH0KKworICAgIE5ld01sdSAtPlBvb2xTaXplID0gbWx1IC0+UG9vbFVzZWQ7CisKKyAgICBpZiAoTmV3TWx1IC0+TWVtUG9vbCA9PSBOVUxMIHx8IG1sdSAtPk1lbVBvb2wgPT0gTlVMTCkgZ290byBFcnJvcjsKKworICAgIG1lbW1vdmUoTmV3TWx1IC0+TWVtUG9vbCwgbWx1LT5NZW1Qb29sLCBtbHUgLT5Qb29sVXNlZCk7CisgICAgTmV3TWx1IC0+UG9vbFVzZWQgPSBtbHUgLT5Qb29sVXNlZDsKKworICAgIHJldHVybiBOZXdNbHU7CisKK0Vycm9yOgorCisgICAgaWYgKE5ld01sdSAhPSBOVUxMKSBjbXNNTFVmcmVlKE5ld01sdSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIEZyZWUgYW55IHVzZWQgbWVtb3J5Cit2b2lkIENNU0VYUE9SVCBjbXNNTFVmcmVlKGNtc01MVSogbWx1KQoreworICAgIGlmIChtbHUpIHsKKworICAgICAgICBpZiAobWx1IC0+IEVudHJpZXMpIF9jbXNGcmVlKG1sdSAtPkNvbnRleHRJRCwgbWx1LT5FbnRyaWVzKTsKKyAgICAgICAgaWYgKG1sdSAtPiBNZW1Qb29sKSBfY21zRnJlZShtbHUgLT5Db250ZXh0SUQsIG1sdS0+TWVtUG9vbCk7CisKKyAgICAgICAgX2Ntc0ZyZWUobWx1IC0+Q29udGV4dElELCBtbHUpOworICAgIH0KK30KKworCisvLyBUaGUgYWxnb3JpdGhtIGZpcnN0IHNlYXJjaGVzIGZvciBhbiBleGFjdCBtYXRjaCBvZiBjb3VudHJ5IGFuZCBsYW5ndWFnZSwgaWYgbm90IGZvdW5kIGl0IHVzZXMKKy8vIHRoZSBMYW5ndWFnZS4gSWYgbm9uZSBpcyBmb3VuZCwgZmlyc3QgZW50cnkgaXMgdXNlZCBpbnN0ZWFkLgorc3RhdGljCitjb25zdCB3Y2hhcl90KiBfY21zTUxVZ2V0V2lkZShjb25zdCBjbXNNTFUqIG1sdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAqbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDE2TnVtYmVyIExhbmd1YWdlQ29kZSwgY21zVUludDE2TnVtYmVyIENvdW50cnlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDE2TnVtYmVyKiBVc2VkTGFuZ3VhZ2VDb2RlLCBjbXNVSW50MTZOdW1iZXIqIFVzZWRDb3VudHJ5Q29kZSkKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgaTsKKyAgICBjbXNJbnQzMk51bWJlciBCZXN0ID0gLTE7CisgICAgX2Ntc01MVWVudHJ5KiB2OworCisgICAgaWYgKG1sdSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIGlmIChtbHUgLT4gQWxsb2NhdGVkRW50cmllcyA8PSAwKSByZXR1cm4gTlVMTDsKKworICAgIGZvciAoaT0wOyBpIDwgbWx1IC0+VXNlZEVudHJpZXM7IGkrKykgeworCisgICAgICAgIHYgPSBtbHUgLT5FbnRyaWVzICsgaTsKKworICAgICAgICBpZiAodiAtPiBMYW5ndWFnZSA9PSBMYW5ndWFnZUNvZGUpIHsKKworICAgICAgICAgICAgaWYgKEJlc3QgPT0gLTEpIEJlc3QgPSBpOworCisgICAgICAgICAgICBpZiAodiAtPiBDb3VudHJ5ID09IENvdW50cnlDb2RlKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoVXNlZExhbmd1YWdlQ29kZSAhPSBOVUxMKSAqVXNlZExhbmd1YWdlQ29kZSA9IHYgLT5MYW5ndWFnZTsKKyAgICAgICAgICAgICAgICBpZiAoVXNlZENvdW50cnlDb2RlICAhPSBOVUxMKSAqVXNlZENvdW50cnlDb2RlID0gdiAtPkNvdW50cnk7CisKKyAgICAgICAgICAgICAgICBpZiAobGVuICE9IE5VTEwpICpsZW4gPSB2IC0+TGVuOworCisgICAgICAgICAgICAgICAgcmV0dXJuICh3Y2hhcl90KikgKChjbXNVSW50OE51bWJlciopIG1sdSAtPk1lbVBvb2wgKyB2IC0+IFN0clcpOyAgICAgICAgLy8gRm91bmQgZXhhY3QgbWF0Y2gKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5vIHN0cmluZyBmb3VuZC4gUmV0dXJuIEZpcnN0IG9uZQorICAgIGlmIChCZXN0ID09IC0xKQorICAgICAgICBCZXN0ID0gMDsKKworICAgIHYgPSBtbHUgLT5FbnRyaWVzICsgQmVzdDsKKworICAgIGlmIChVc2VkTGFuZ3VhZ2VDb2RlICE9IE5VTEwpICpVc2VkTGFuZ3VhZ2VDb2RlID0gdiAtPkxhbmd1YWdlOworICAgIGlmIChVc2VkQ291bnRyeUNvZGUgICE9IE5VTEwpICpVc2VkQ291bnRyeUNvZGUgPSB2IC0+Q291bnRyeTsKKworICAgIGlmIChsZW4gIT0gTlVMTCkgKmxlbiAgID0gdiAtPkxlbjsKKworICAgIHJldHVybih3Y2hhcl90KikgKChjbXNVSW50OE51bWJlciopIG1sdSAtPk1lbVBvb2wgKyB2IC0+U3RyVyk7Cit9CisKKworLy8gT2J0YWluIGFuIEFTQ0lJIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB3aWRlIHN0cmluZy4gU2V0dGluZyBidWZmZXIgdG8gTlVMTCByZXR1cm5zIHRoZSBsZW4KK2Ntc1VJbnQzMk51bWJlciBDTVNFWFBPUlQgY21zTUxVZ2V0QVNDSUkoY29uc3QgY21zTUxVKiBtbHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIExhbmd1YWdlQ29kZVszXSwgY29uc3QgY2hhciBDb3VudHJ5Q29kZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIEJ1ZmZlciwgY21zVUludDMyTnVtYmVyIEJ1ZmZlclNpemUpCit7CisgICAgY29uc3Qgd2NoYXJfdCAqV2lkZTsKKyAgICBjbXNVSW50MzJOdW1iZXIgIFN0ckxlbiA9IDA7CisgICAgY21zVUludDMyTnVtYmVyIEFTQ0lJbGVuLCBpOworCisgICAgY21zVUludDE2TnVtYmVyIExhbmcgID0gc3RyVG8xNihMYW5ndWFnZUNvZGUpOworICAgIGNtc1VJbnQxNk51bWJlciBDbnRyeSA9IHN0clRvMTYoQ291bnRyeUNvZGUpOworCisgICAgLy8gU2FuaXRpemUKKyAgICBpZiAobWx1ID09IE5VTEwpIHJldHVybiAwOworCisgICAgLy8gR2V0IFdpZGVDaGFyCisgICAgV2lkZSA9IF9jbXNNTFVnZXRXaWRlKG1sdSwgJlN0ckxlbiwgTGFuZywgQ250cnksIE5VTEwsIE5VTEwpOworICAgIGlmIChXaWRlID09IE5VTEwpIHJldHVybiAwOworCisgICAgQVNDSUlsZW4gPSBTdHJMZW4gLyBzaXplb2Yod2NoYXJfdCk7CisKKyAgICAvLyBNYXliZSB3ZSB3YW50IG9ubHkgdG8ga25vdyB0aGUgbGVuPworICAgIGlmIChCdWZmZXIgPT0gTlVMTCkgcmV0dXJuIEFTQ0lJbGVuICsgMTsgLy8gTm90ZSB0aGUgemVybyBhdCB0aGUgZW5kCisKKyAgICAvLyBObyBidWZmZXIgc2l6ZSBtZWFucyBubyBkYXRhCisgICAgaWYgKEJ1ZmZlclNpemUgPD0gMCkgcmV0dXJuIDA7CisKKyAgICAvLyBTb21lIGNsaXBwaW5nIG1heSBiZSByZXF1aXJlZAorICAgIGlmIChCdWZmZXJTaXplIDwgQVNDSUlsZW4gKyAxKQorICAgICAgICBBU0NJSWxlbiA9IEJ1ZmZlclNpemUgLSAxOworCisgICAgLy8gUHJlY2VzcyBlYWNoIGNoYXJhY3RlcgorICAgIGZvciAoaT0wOyBpIDwgQVNDSUlsZW47IGkrKykgeworCisgICAgICAgIGlmIChXaWRlW2ldID09IDApCisgICAgICAgICAgICBCdWZmZXJbaV0gPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICBCdWZmZXJbaV0gPSAoY2hhcikgV2lkZVtpXTsKKyAgICB9CisKKyAgICAvLyBXZSBwdXQgYSB0ZXJtaW5hdGlvbiAiXDAiCisgICAgQnVmZmVyW0FTQ0lJbGVuXSA9IDA7CisgICAgcmV0dXJuIEFTQ0lJbGVuICsgMTsKK30KKworLy8gT2J0YWluIGEgd2lkZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgTUxVLCBvbiBkZXBlbmRpbmcgb24gY3VycmVudCBsb2NhbGUgc2V0dGluZ3MKK2Ntc1VJbnQzMk51bWJlciBDTVNFWFBPUlQgY21zTUxVZ2V0V2lkZShjb25zdCBjbXNNTFUqIG1sdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBMYW5ndWFnZUNvZGVbM10sIGNvbnN0IGNoYXIgQ291bnRyeUNvZGVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqIEJ1ZmZlciwgY21zVUludDMyTnVtYmVyIEJ1ZmZlclNpemUpCit7CisgICAgY29uc3Qgd2NoYXJfdCAqV2lkZTsKKyAgICBjbXNVSW50MzJOdW1iZXIgIFN0ckxlbiA9IDA7CisKKyAgICBjbXNVSW50MTZOdW1iZXIgTGFuZyAgPSBzdHJUbzE2KExhbmd1YWdlQ29kZSk7CisgICAgY21zVUludDE2TnVtYmVyIENudHJ5ID0gc3RyVG8xNihDb3VudHJ5Q29kZSk7CisKKyAgICAvLyBTYW5pdGl6ZQorICAgIGlmIChtbHUgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgICBXaWRlID0gX2Ntc01MVWdldFdpZGUobWx1LCAmU3RyTGVuLCBMYW5nLCBDbnRyeSwgTlVMTCwgTlVMTCk7CisgICAgaWYgKFdpZGUgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgICAvLyBNYXliZSB3ZSB3YW50IG9ubHkgdG8ga25vdyB0aGUgbGVuPworICAgIGlmIChCdWZmZXIgPT0gTlVMTCkgcmV0dXJuIFN0ckxlbiArIHNpemVvZih3Y2hhcl90KTsKKworICAvLyBObyBidWZmZXIgc2l6ZSBtZWFucyBubyBkYXRhCisgICAgaWYgKEJ1ZmZlclNpemUgPD0gMCkgcmV0dXJuIDA7CisKKyAgICAvLyBTb21lIGNsaXBwaW5nIG1heSBiZSByZXF1aXJlZAorICAgIGlmIChCdWZmZXJTaXplIDwgU3RyTGVuICsgc2l6ZW9mKHdjaGFyX3QpKQorICAgICAgICBTdHJMZW4gPSBCdWZmZXJTaXplIC0gKyBzaXplb2Yod2NoYXJfdCk7CisKKyAgICBtZW1tb3ZlKEJ1ZmZlciwgV2lkZSwgU3RyTGVuKTsKKyAgICBCdWZmZXJbU3RyTGVuIC8gc2l6ZW9mKHdjaGFyX3QpXSA9IDA7CisKKyAgICByZXR1cm4gU3RyTGVuICsgc2l6ZW9mKHdjaGFyX3QpOworfQorCisKKy8vIEdldCBhbHNvIHRoZSBsYW5ndWFnZSBhbmQgY291bnRyeQorQ01TQVBJIGNtc0Jvb2wgQ01TRVhQT1JUIGNtc01MVWdldFRyYW5zbGF0aW9uKGNvbnN0IGNtc01MVSogbWx1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgTGFuZ3VhZ2VDb2RlWzNdLCBjb25zdCBjaGFyIENvdW50cnlDb2RlWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgT2J0YWluZWRMYW5ndWFnZVszXSwgY2hhciBPYnRhaW5lZENvdW50cnlbM10pCit7CisgICAgY29uc3Qgd2NoYXJfdCAqV2lkZTsKKworICAgIGNtc1VJbnQxNk51bWJlciBMYW5nICA9IHN0clRvMTYoTGFuZ3VhZ2VDb2RlKTsKKyAgICBjbXNVSW50MTZOdW1iZXIgQ250cnkgPSBzdHJUbzE2KENvdW50cnlDb2RlKTsKKyAgICBjbXNVSW50MTZOdW1iZXIgT2J0TGFuZywgT2J0Q29kZTsKKworICAgIC8vIFNhbml0aXplCisgICAgaWYgKG1sdSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICBXaWRlID0gX2Ntc01MVWdldFdpZGUobWx1LCBOVUxMLCBMYW5nLCBDbnRyeSwgJk9idExhbmcsICZPYnRDb2RlKTsKKyAgICBpZiAoV2lkZSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICAvLyBHZXQgdXNlZCBsYW5ndWFnZSBhbmQgY29kZQorICAgIHN0ckZyb20xNihPYnRhaW5lZExhbmd1YWdlLCBPYnRMYW5nKTsKKyAgICBzdHJGcm9tMTYoT2J0YWluZWRDb3VudHJ5LCBPYnRDb2RlKTsKKworICAgIHJldHVybiBUUlVFOworfQorCisKKworLy8gR2V0IHRoZSBudW1iZXIgb2YgdHJhbnNsYXRpb25zIGluIHRoZSBNTFUgb2JqZWN0CitjbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc01MVXRyYW5zbGF0aW9uc0NvdW50KGNvbnN0IGNtc01MVSogbWx1KQoreworICAgIGlmIChtbHUgPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgcmV0dXJuIG1sdS0+VXNlZEVudHJpZXM7Cit9CisKKy8vIEdldCB0aGUgbGFuZ3VhZ2UgYW5kIGNvdW50cnkgY29kZXMgZm9yIGEgc3BlY2lmaWMgTUxVIGluZGV4CitjbXNCb29sIENNU0VYUE9SVCBjbXNNTFV0cmFuc2xhdGlvbnNDb2Rlcyhjb25zdCBjbXNNTFUqIG1sdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIExhbmd1YWdlQ29kZVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgQ291bnRyeUNvZGVbM10pCit7CisgICAgX2Ntc01MVWVudHJ5ICplbnRyeTsKKworICAgIGlmIChtbHUgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKGlkeCA+PSBtbHUtPlVzZWRFbnRyaWVzKSByZXR1cm4gRkFMU0U7CisKKyAgICBlbnRyeSA9ICZtbHUtPkVudHJpZXNbaWR4XTsKKyAgICAKKyAgICBzdHJGcm9tMTYoTGFuZ3VhZ2VDb2RlLCBlbnRyeS0+TGFuZ3VhZ2UpOworICAgIHN0ckZyb20xNihDb3VudHJ5Q29kZSwgZW50cnktPkNvdW50cnkpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLy8gTmFtZWQgY29sb3IgbGlzdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gR3JvdyB0aGUgbGlzdCB0byBrZWVwIGF0IGxlYXN0IE51bUVsZW1lbnRzCitzdGF0aWMKK2Ntc0Jvb2wgIEdyb3dOYW1lZENvbG9yTGlzdChjbXNOQU1FRENPTE9STElTVCogdikKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgc2l6ZTsKKyAgICBfY21zTkFNRURDT0xPUiAqIE5ld1B0cjsKKworICAgIGlmICh2ID09IE5VTEwpIHJldHVybiBGQUxTRTsKKworICAgIGlmICh2IC0+QWxsb2NhdGVkID09IDApCisgICAgICAgIHNpemUgPSA2NDsgICAvLyBJbml0aWFsIGd1ZXNzCisgICAgZWxzZQorICAgICAgICBzaXplID0gdiAtPkFsbG9jYXRlZCAqIDI7CisKKyAgICAvLyBLZWVwIGEgbWF4aW11bSBjb2xvciBsaXN0cyBjYW4gZ3JvdywgMTAwSyBlbnRyaWVzIHNlZW1zIHJlYXNvbmFibGUKKyAgICBpZiAoc2l6ZSA+IDEwMjQqMTAwKSByZXR1cm4gRkFMU0U7CisKKyAgICBOZXdQdHIgPSAoX2Ntc05BTUVEQ09MT1IqKSBfY21zUmVhbGxvYyh2IC0+Q29udGV4dElELCB2IC0+TGlzdCwgc2l6ZSAqIHNpemVvZihfY21zTkFNRURDT0xPUikpOworICAgIGlmIChOZXdQdHIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgdiAtPkxpc3QgICAgICA9IE5ld1B0cjsKKyAgICB2IC0+QWxsb2NhdGVkID0gc2l6ZTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gQWxsb2NhdGUgYSBsaXN0IGZvciBuIGVsZW1lbnRzCitjbXNOQU1FRENPTE9STElTVCogQ01TRVhQT1JUIGNtc0FsbG9jTmFtZWRDb2xvckxpc3QoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBuLCBjbXNVSW50MzJOdW1iZXIgQ29sb3JhbnRDb3VudCwgY29uc3QgY2hhciogUHJlZml4LCBjb25zdCBjaGFyKiBTdWZmaXgpCit7CisgICAgY21zTkFNRURDT0xPUkxJU1QqIHYgPSAoY21zTkFNRURDT0xPUkxJU1QqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihjbXNOQU1FRENPTE9STElTVCkpOworCisgICAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICB2IC0+TGlzdCAgICAgID0gTlVMTDsKKyAgICB2IC0+bkNvbG9ycyAgID0gMDsKKyAgICB2IC0+Q29udGV4dElEICA9IENvbnRleHRJRDsKKworICAgIHdoaWxlICh2IC0+IEFsbG9jYXRlZCA8IG4peworICAgICAgICBpZiAoIUdyb3dOYW1lZENvbG9yTGlzdCh2KSkgeworICAgICAgICAgICAgY21zRnJlZU5hbWVkQ29sb3JMaXN0KHYpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdHJuY3B5KHYgLT5QcmVmaXgsIFByZWZpeCwgc2l6ZW9mKHYgLT5QcmVmaXgpLTEpOworICAgIHN0cm5jcHkodiAtPlN1ZmZpeCwgU3VmZml4LCBzaXplb2YodiAtPlN1ZmZpeCktMSk7CisgICAgdi0+UHJlZml4WzMyXSA9IHYtPlN1ZmZpeFszMl0gPSAwOworCisgICAgdiAtPiBDb2xvcmFudENvdW50ID0gQ29sb3JhbnRDb3VudDsKKworICAgIHJldHVybiB2OworfQorCisvLyBGcmVlIGEgbGlzdAordm9pZCBDTVNFWFBPUlQgY21zRnJlZU5hbWVkQ29sb3JMaXN0KGNtc05BTUVEQ09MT1JMSVNUKiB2KQoreworICAgIGlmICh2ID09IE5VTEwpIHJldHVybjsKKyAgICBpZiAodiAtPkxpc3QpIF9jbXNGcmVlKHYgLT5Db250ZXh0SUQsIHYgLT5MaXN0KTsKKyAgICBfY21zRnJlZSh2IC0+Q29udGV4dElELCB2KTsKK30KKworY21zTkFNRURDT0xPUkxJU1QqIENNU0VYUE9SVCBjbXNEdXBOYW1lZENvbG9yTGlzdChjb25zdCBjbXNOQU1FRENPTE9STElTVCogdikKK3sKKyAgICBjbXNOQU1FRENPTE9STElTVCogTmV3TkM7CisKKyAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIE5ld05DPSBjbXNBbGxvY05hbWVkQ29sb3JMaXN0KHYgLT5Db250ZXh0SUQsIHYgLT4gbkNvbG9ycywgdiAtPkNvbG9yYW50Q291bnQsIHYgLT5QcmVmaXgsIHYgLT5TdWZmaXgpOworICAgIGlmIChOZXdOQyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIC8vIEZvciByZWFsbHkgbGFyZ2UgdGFibGVzIHdlIG5lZWQgdGhpcworICAgIHdoaWxlIChOZXdOQyAtPkFsbG9jYXRlZCA8IHYgLT5BbGxvY2F0ZWQpeworICAgICAgICBpZiAoIUdyb3dOYW1lZENvbG9yTGlzdChOZXdOQykpIHsKKyAgICAgICAgICAgIGNtc0ZyZWVOYW1lZENvbG9yTGlzdChOZXdOQyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1lbW1vdmUoTmV3TkMgLT5QcmVmaXgsIHYgLT5QcmVmaXgsIHNpemVvZih2IC0+UHJlZml4KSk7CisgICAgbWVtbW92ZShOZXdOQyAtPlN1ZmZpeCwgdiAtPlN1ZmZpeCwgc2l6ZW9mKHYgLT5TdWZmaXgpKTsKKyAgICBOZXdOQyAtPkNvbG9yYW50Q291bnQgPSB2IC0+Q29sb3JhbnRDb3VudDsKKyAgICBtZW1tb3ZlKE5ld05DLT5MaXN0LCB2IC0+TGlzdCwgdi0+bkNvbG9ycyAqIHNpemVvZihfY21zTkFNRURDT0xPUikpOworICAgIE5ld05DIC0+bkNvbG9ycyA9IHYgLT5uQ29sb3JzOworICAgIHJldHVybiBOZXdOQzsKK30KKworCisvLyBBcHBlbmQgYSBjb2xvciB0byBhIGxpc3QuIExpc3QgcG9pbnRlciBtYXkgY2hhbmdlIGlmIHJlYWxsb2NhdGVkCitjbXNCb29sICBDTVNFWFBPUlQgY21zQXBwZW5kTmFtZWRDb2xvcihjbXNOQU1FRENPTE9STElTVCogTmFtZWRDb2xvckxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDE2TnVtYmVyIFBDU1szXSwgY21zVUludDE2TnVtYmVyIENvbG9yYW50W2Ntc01BWENIQU5ORUxTXSkKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgaTsKKworICAgIGlmIChOYW1lZENvbG9yTGlzdCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoTmFtZWRDb2xvckxpc3QgLT5uQ29sb3JzICsgMSA+IE5hbWVkQ29sb3JMaXN0IC0+QWxsb2NhdGVkKSB7CisgICAgICAgIGlmICghR3Jvd05hbWVkQ29sb3JMaXN0KE5hbWVkQ29sb3JMaXN0KSkgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGZvciAoaT0wOyBpIDwgTmFtZWRDb2xvckxpc3QgLT5Db2xvcmFudENvdW50OyBpKyspCisgICAgICAgIE5hbWVkQ29sb3JMaXN0IC0+TGlzdFtOYW1lZENvbG9yTGlzdCAtPm5Db2xvcnNdLkRldmljZUNvbG9yYW50W2ldID0gQ29sb3JhbnQgPT0gTlVMTD8gMCA6IENvbG9yYW50W2ldOworCisgICAgZm9yIChpPTA7IGkgPCAzOyBpKyspCisgICAgICAgIE5hbWVkQ29sb3JMaXN0IC0+TGlzdFtOYW1lZENvbG9yTGlzdCAtPm5Db2xvcnNdLlBDU1tpXSA9IFBDUyA9PSBOVUxMID8gMCA6IFBDU1tpXTsKKworICAgIGlmIChOYW1lICE9IE5VTEwpIHsKKworICAgICAgICBzdHJuY3B5KE5hbWVkQ29sb3JMaXN0IC0+TGlzdFtOYW1lZENvbG9yTGlzdCAtPm5Db2xvcnNdLk5hbWUsIE5hbWUsIGNtc01BWF9QQVRILTEpOworICAgICAgICBOYW1lZENvbG9yTGlzdCAtPkxpc3RbTmFtZWRDb2xvckxpc3QgLT5uQ29sb3JzXS5OYW1lW2Ntc01BWF9QQVRILTFdID0gMDsKKworICAgIH0KKyAgICBlbHNlCisgICAgICAgIE5hbWVkQ29sb3JMaXN0IC0+TGlzdFtOYW1lZENvbG9yTGlzdCAtPm5Db2xvcnNdLk5hbWVbMF0gPSAwOworCisKKyAgICBOYW1lZENvbG9yTGlzdCAtPm5Db2xvcnMrKzsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gUmV0dXJucyBudW1iZXIgb2YgZWxlbWVudHMKK2Ntc1VJbnQzMk51bWJlciBDTVNFWFBPUlQgY21zTmFtZWRDb2xvckNvdW50KGNvbnN0IGNtc05BTUVEQ09MT1JMSVNUKiBOYW1lZENvbG9yTGlzdCkKK3sKKyAgICAgaWYgKE5hbWVkQ29sb3JMaXN0ID09IE5VTEwpIHJldHVybiAwOworICAgICByZXR1cm4gTmFtZWRDb2xvckxpc3QgLT5uQ29sb3JzOworfQorCisvLyBJbmZvIGFib291dCBhIGdpdmVuIGNvbG9yCitjbXNCb29sICBDTVNFWFBPUlQgY21zTmFtZWRDb2xvckluZm8oY29uc3QgY21zTkFNRURDT0xPUkxJU1QqIE5hbWVkQ29sb3JMaXN0LCBjbXNVSW50MzJOdW1iZXIgbkNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIqIFBDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIqIENvbG9yYW50KQoreworICAgIGlmIChOYW1lZENvbG9yTGlzdCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAobkNvbG9yID49IGNtc05hbWVkQ29sb3JDb3VudChOYW1lZENvbG9yTGlzdCkpIHJldHVybiBGQUxTRTsKKworICAgIGlmIChOYW1lKSBzdHJjcHkoTmFtZSwgTmFtZWRDb2xvckxpc3QtPkxpc3RbbkNvbG9yXS5OYW1lKTsKKyAgICBpZiAoUHJlZml4KSBzdHJjcHkoUHJlZml4LCBOYW1lZENvbG9yTGlzdC0+UHJlZml4KTsKKyAgICBpZiAoU3VmZml4KSBzdHJjcHkoU3VmZml4LCBOYW1lZENvbG9yTGlzdC0+U3VmZml4KTsKKyAgICBpZiAoUENTKQorICAgICAgICBtZW1tb3ZlKFBDUywgTmFtZWRDb2xvckxpc3QgLT5MaXN0W25Db2xvcl0uUENTLCAzKnNpemVvZihjbXNVSW50MTZOdW1iZXIpKTsKKworICAgIGlmIChDb2xvcmFudCkKKyAgICAgICAgbWVtbW92ZShDb2xvcmFudCwgTmFtZWRDb2xvckxpc3QgLT5MaXN0W25Db2xvcl0uRGV2aWNlQ29sb3JhbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjbXNVSW50MTZOdW1iZXIpICogTmFtZWRDb2xvckxpc3QgLT5Db2xvcmFudENvdW50KTsKKworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8vIFNlYXJjaCBmb3IgYSBnaXZlbiBjb2xvciBuYW1lIChubyBwcmVmaXggb3Igc3VmZml4KQorY21zSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc05hbWVkQ29sb3JJbmRleChjb25zdCBjbXNOQU1FRENPTE9STElTVCogTmFtZWRDb2xvckxpc3QsIGNvbnN0IGNoYXIqIE5hbWUpCit7CisgICAgaW50IGksIG47CisKKyAgICBpZiAoTmFtZWRDb2xvckxpc3QgPT0gTlVMTCkgcmV0dXJuIC0xOworICAgIG4gPSBjbXNOYW1lZENvbG9yQ291bnQoTmFtZWRDb2xvckxpc3QpOworICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGlmIChjbXNzdHJjYXNlY21wKE5hbWUsICBOYW1lZENvbG9yTGlzdC0+TGlzdFtpXS5OYW1lKSA9PSAwKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCisvLyBNUEUgc3VwcG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMKK3ZvaWQgRnJlZU5hbWVkQ29sb3JMaXN0KGNtc1N0YWdlKiBtcGUpCit7CisgICAgY21zTkFNRURDT0xPUkxJU1QqIExpc3QgPSAoY21zTkFNRURDT0xPUkxJU1QqKSBtcGUgLT5EYXRhOworICAgIGNtc0ZyZWVOYW1lZENvbG9yTGlzdChMaXN0KTsKK30KKworc3RhdGljCit2b2lkKiBEdXBOYW1lZENvbG9yTGlzdChjbXNTdGFnZSogbXBlKQoreworICAgIGNtc05BTUVEQ09MT1JMSVNUKiBMaXN0ID0gKGNtc05BTUVEQ09MT1JMSVNUKikgbXBlIC0+RGF0YTsKKyAgICByZXR1cm4gY21zRHVwTmFtZWRDb2xvckxpc3QoTGlzdCk7Cit9CisKK3N0YXRpYwordm9pZCBFdmFsTmFtZWRDb2xvclBDUyhjb25zdCBjbXNGbG9hdDMyTnVtYmVyIEluW10sIGNtc0Zsb2F0MzJOdW1iZXIgT3V0W10sIGNvbnN0IGNtc1N0YWdlICptcGUpCit7CisgICAgY21zTkFNRURDT0xPUkxJU1QqIE5hbWVkQ29sb3JMaXN0ID0gKGNtc05BTUVEQ09MT1JMSVNUKikgbXBlIC0+RGF0YTsKKyAgICBjbXNVSW50MTZOdW1iZXIgaW5kZXggPSAoY21zVUludDE2TnVtYmVyKSBfY21zUXVpY2tTYXR1cmF0ZVdvcmQoSW5bMF0gKiA2NTUzNS4wKTsKKworICAgIGlmIChpbmRleCA+PSBOYW1lZENvbG9yTGlzdC0+IG5Db2xvcnMpIHsKKyAgICAgICAgY21zU2lnbmFsRXJyb3IoTmFtZWRDb2xvckxpc3QgLT5Db250ZXh0SUQsIGNtc0VSUk9SX1JBTkdFLCAiQ29sb3IgJWQgb3V0IG9mIHJhbmdlOyBpZ25vcmVkIiwgaW5kZXgpOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICAgICAgLy8gTmFtZWQgY29sb3IgYWx3YXlzIHVzZXMgTGFiCisgICAgICAgICAgICBPdXRbMF0gPSAoY21zRmxvYXQzMk51bWJlcikgKE5hbWVkQ29sb3JMaXN0LT5MaXN0W2luZGV4XS5QQ1NbMF0gLyA2NTUzNS4wKTsKKyAgICAgICAgICAgIE91dFsxXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoTmFtZWRDb2xvckxpc3QtPkxpc3RbaW5kZXhdLlBDU1sxXSAvIDY1NTM1LjApOworICAgICAgICAgICAgT3V0WzJdID0gKGNtc0Zsb2F0MzJOdW1iZXIpIChOYW1lZENvbG9yTGlzdC0+TGlzdFtpbmRleF0uUENTWzJdIC8gNjU1MzUuMCk7CisgICAgfQorfQorCitzdGF0aWMKK3ZvaWQgRXZhbE5hbWVkQ29sb3IoY29uc3QgY21zRmxvYXQzMk51bWJlciBJbltdLCBjbXNGbG9hdDMyTnVtYmVyIE91dFtdLCBjb25zdCBjbXNTdGFnZSAqbXBlKQoreworICAgIGNtc05BTUVEQ09MT1JMSVNUKiBOYW1lZENvbG9yTGlzdCA9IChjbXNOQU1FRENPTE9STElTVCopIG1wZSAtPkRhdGE7CisgICAgY21zVUludDE2TnVtYmVyIGluZGV4ID0gKGNtc1VJbnQxNk51bWJlcikgX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKEluWzBdICogNjU1MzUuMCk7CisgICAgY21zVUludDMyTnVtYmVyIGo7CisKKyAgICBpZiAoaW5kZXggPj0gTmFtZWRDb2xvckxpc3QtPiBuQ29sb3JzKSB7CisgICAgICAgIGNtc1NpZ25hbEVycm9yKE5hbWVkQ29sb3JMaXN0IC0+Q29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgIkNvbG9yICVkIG91dCBvZiByYW5nZTsgaWdub3JlZCIsIGluZGV4KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoaj0wOyBqIDwgTmFtZWRDb2xvckxpc3QgLT5Db2xvcmFudENvdW50OyBqKyspCisgICAgICAgICAgICBPdXRbal0gPSAoY21zRmxvYXQzMk51bWJlcikgKE5hbWVkQ29sb3JMaXN0LT5MaXN0W2luZGV4XS5EZXZpY2VDb2xvcmFudFtqXSAvIDY1NTM1LjApOworICAgIH0KK30KKworCisvLyBOYW1lZCBjb2xvciBsb29rdXAgZWxlbWVudAorY21zU3RhZ2UqIF9jbXNTdGFnZUFsbG9jTmFtZWRDb2xvcihjbXNOQU1FRENPTE9STElTVCogTmFtZWRDb2xvckxpc3QsIGNtc0Jvb2wgVXNlUENTKQoreworICAgIHJldHVybiBfY21zU3RhZ2VBbGxvY1BsYWNlaG9sZGVyKE5hbWVkQ29sb3JMaXN0IC0+Q29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNTaWdOYW1lZENvbG9yRWxlbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIFVzZVBDUyA/IDMgOiBOYW1lZENvbG9yTGlzdCAtPkNvbG9yYW50Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZVBDUyA/IEV2YWxOYW1lZENvbG9yUENTIDogRXZhbE5hbWVkQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER1cE5hbWVkQ29sb3JMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmVlTmFtZWRDb2xvckxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0R1cE5hbWVkQ29sb3JMaXN0KE5hbWVkQ29sb3JMaXN0KSk7CisKK30KKworCisvLyBSZXRyaWV2ZSB0aGUgbmFtZWQgY29sb3IgbGlzdCBmcm9tIGEgdHJhbnNmb3JtLiBTaG91bGQgYmUgZmlyc3QgZWxlbWVudCBpbiB0aGUgTFVUCitjbXNOQU1FRENPTE9STElTVCogQ01TRVhQT1JUIGNtc0dldE5hbWVkQ29sb3JMaXN0KGNtc0hUUkFOU0ZPUk0geGZvcm0pCit7CisgICAgX2Ntc1RSQU5TRk9STSogdiA9IChfY21zVFJBTlNGT1JNKikgeGZvcm07CisgICAgY21zU3RhZ2UqIG1wZSAgPSB2IC0+THV0LT5FbGVtZW50czsKKworICAgIGlmIChtcGUgLT5UeXBlICE9IGNtc1NpZ05hbWVkQ29sb3JFbGVtVHlwZSkgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIChjbXNOQU1FRENPTE9STElTVCopIG1wZSAtPkRhdGE7Cit9CisKKworLy8gUHJvZmlsZSBzZXF1ZW5jZSBkZXNjcmlwdGlvbiByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2Ntc1NFUSogQ01TRVhQT1JUIGNtc0FsbG9jUHJvZmlsZVNlcXVlbmNlRGVzY3JpcHRpb24oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBuKQoreworICAgIGNtc1NFUSogU2VxOworICAgIGNtc1VJbnQzMk51bWJlciBpOworCisgICAgaWYgKG4gPT0gMCkgcmV0dXJuIE5VTEw7CisKKyAgICAvLyBJbiBhIGFic29sdXRlbHkgYXJiaXRyYXJ5IHdheSwgSSBoZXJlYnkgZGVjaWRlIHRvIGFsbG93IGEgbWF4aW0gb2YgMjU1IHByb2ZpbGVzIGxpbmtlZAorICAgIC8vIGluIGEgZGV2aWNlbGluay4gSXQgbWFrZXMgbm90IHNlbnNlIGFueXdheSBhbmQgbWF5IGJlIHVzZWQgZm9yIGV4cGxvaXRzLCBzbyBsZXQncyBjbG9zZSB0aGUgZG9vciEKKyAgICBpZiAobiA+IDI1NSkgcmV0dXJuIE5VTEw7CisKKyAgICBTZXEgPSAoY21zU0VRKikgX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBzaXplb2YoY21zU0VRKSk7CisgICAgaWYgKFNlcSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIFNlcSAtPiBDb250ZXh0SUQgPSBDb250ZXh0SUQ7CisgICAgU2VxIC0+IHNlcSAgICAgID0gKGNtc1BTRVFERVNDKikgX2Ntc0NhbGxvYyhDb250ZXh0SUQsIG4sIHNpemVvZihjbXNQU0VRREVTQykpOworICAgIFNlcSAtPiBuICAgICAgICA9IG47CisKKyAgICBpZiAoU2VxIC0+IHNlcSA9PSBOVUxMKSB7CisgICAgICAgIF9jbXNGcmVlKENvbnRleHRJRCwgU2VxKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgU2VxIC0+IHNlcVtpXS5NYW51ZmFjdHVyZXIgPSBOVUxMOworICAgICAgICBTZXEgLT4gc2VxW2ldLk1vZGVsICAgICAgICA9IE5VTEw7CisgICAgICAgIFNlcSAtPiBzZXFbaV0uRGVzY3JpcHRpb24gID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gU2VxOworfQorCit2b2lkIENNU0VYUE9SVCBjbXNGcmVlUHJvZmlsZVNlcXVlbmNlRGVzY3JpcHRpb24oY21zU0VRKiBwc2VxKQoreworICAgIGNtc1VJbnQzMk51bWJlciBpOworCisgICAgZm9yIChpPTA7IGkgPCBwc2VxIC0+bjsgaSsrKSB7CisgICAgICAgIGlmIChwc2VxIC0+c2VxW2ldLk1hbnVmYWN0dXJlciAhPSBOVUxMKSBjbXNNTFVmcmVlKHBzZXEgLT5zZXFbaV0uTWFudWZhY3R1cmVyKTsKKyAgICAgICAgaWYgKHBzZXEgLT5zZXFbaV0uTW9kZWwgIT0gTlVMTCkgY21zTUxVZnJlZShwc2VxIC0+c2VxW2ldLk1vZGVsKTsKKyAgICAgICAgaWYgKHBzZXEgLT5zZXFbaV0uRGVzY3JpcHRpb24gIT0gTlVMTCkgY21zTUxVZnJlZShwc2VxIC0+c2VxW2ldLkRlc2NyaXB0aW9uKTsKKyAgICB9CisKKyAgICBpZiAocHNlcSAtPnNlcSAhPSBOVUxMKSBfY21zRnJlZShwc2VxIC0+Q29udGV4dElELCBwc2VxIC0+c2VxKTsKKyAgICBfY21zRnJlZShwc2VxIC0+IENvbnRleHRJRCwgcHNlcSk7Cit9CisKK2Ntc1NFUSogQ01TRVhQT1JUIGNtc0R1cFByb2ZpbGVTZXF1ZW5jZURlc2NyaXB0aW9uKGNvbnN0IGNtc1NFUSogcHNlcSkKK3sKKyAgICBjbXNTRVEgKk5ld1NlcTsKKyAgICBjbXNVSW50MzJOdW1iZXIgaTsKKworICAgIGlmIChwc2VxID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgTmV3U2VxID0gKGNtc1NFUSopIF9jbXNNYWxsb2MocHNlcSAtPiBDb250ZXh0SUQsIHNpemVvZihjbXNTRVEpKTsKKyAgICBpZiAoTmV3U2VxID09IE5VTEwpIHJldHVybiBOVUxMOworCisKKyAgICBOZXdTZXEgLT4gc2VxICAgICAgPSAoY21zUFNFUURFU0MqKSBfY21zQ2FsbG9jKHBzZXEgLT5Db250ZXh0SUQsIHBzZXEgLT5uLCBzaXplb2YoY21zUFNFUURFU0MpKTsKKyAgICBpZiAoTmV3U2VxIC0+c2VxID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgICBOZXdTZXEgLT4gQ29udGV4dElEID0gcHNlcSAtPkNvbnRleHRJRDsKKyAgICBOZXdTZXEgLT4gbiAgICAgICAgPSBwc2VxIC0+bjsKKworICAgIGZvciAoaT0wOyBpIDwgcHNlcS0+bjsgaSsrKSB7CisKKyAgICAgICAgbWVtbW92ZSgmTmV3U2VxIC0+c2VxW2ldLmF0dHJpYnV0ZXMsICZwc2VxIC0+c2VxW2ldLmF0dHJpYnV0ZXMsIHNpemVvZihjbXNVSW50NjROdW1iZXIpKTsKKworICAgICAgICBOZXdTZXEgLT5zZXFbaV0uZGV2aWNlTWZnICAgPSBwc2VxIC0+c2VxW2ldLmRldmljZU1mZzsKKyAgICAgICAgTmV3U2VxIC0+c2VxW2ldLmRldmljZU1vZGVsID0gcHNlcSAtPnNlcVtpXS5kZXZpY2VNb2RlbDsKKyAgICAgICAgbWVtbW92ZSgmTmV3U2VxIC0+c2VxW2ldLlByb2ZpbGVJRCwgJnBzZXEgLT5zZXFbaV0uUHJvZmlsZUlELCBzaXplb2YoY21zUHJvZmlsZUlEKSk7CisgICAgICAgIE5ld1NlcSAtPnNlcVtpXS50ZWNobm9sb2d5ICA9IHBzZXEgLT5zZXFbaV0udGVjaG5vbG9neTsKKworICAgICAgICBOZXdTZXEgLT5zZXFbaV0uTWFudWZhY3R1cmVyID0gY21zTUxVZHVwKHBzZXEgLT5zZXFbaV0uTWFudWZhY3R1cmVyKTsKKyAgICAgICAgTmV3U2VxIC0+c2VxW2ldLk1vZGVsICAgICAgICA9IGNtc01MVWR1cChwc2VxIC0+c2VxW2ldLk1vZGVsKTsKKyAgICAgICAgTmV3U2VxIC0+c2VxW2ldLkRlc2NyaXB0aW9uICA9IGNtc01MVWR1cChwc2VxIC0+c2VxW2ldLkRlc2NyaXB0aW9uKTsKKworICAgIH0KKworICAgIHJldHVybiBOZXdTZXE7CisKK0Vycm9yOgorCisgICAgY21zRnJlZVByb2ZpbGVTZXF1ZW5jZURlc2NyaXB0aW9uKE5ld1NlcSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIERpY3Rpb25hcmllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBEaWN0aW9uYXJpZXMgYXJlIGp1c3QgdmVyeSBzaW1wbGUgbGlua2VkIGxpc3RzCisKKwordHlwZWRlZiBzdHJ1Y3QgX2Ntc0RJQ1Rfc3RydWN0IHsKKyAgICBjbXNESUNUZW50cnkqIGhlYWQ7CisgICAgY21zQ29udGV4dCBDb250ZXh0SUQ7Cit9IF9jbXNESUNUOworCisKKy8vIEFsbG9jYXRlIGFuIGVtcHR5IGRpY3Rpb25hcnkKK2Ntc0hBTkRMRSBDTVNFWFBPUlQgY21zRGljdEFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElEKQoreworICAgIF9jbXNESUNUKiBkaWN0ID0gKF9jbXNESUNUKikgX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBzaXplb2YoX2Ntc0RJQ1QpKTsKKyAgICBpZiAoZGljdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIGRpY3QgLT5Db250ZXh0SUQgPSBDb250ZXh0SUQ7CisgICAgcmV0dXJuIChjbXNIQU5ETEUpIGRpY3Q7CisKK30KKworLy8gRGlzcG9zZSByZXNvdXJjZXMKK3ZvaWQgQ01TRVhQT1JUIGNtc0RpY3RGcmVlKGNtc0hBTkRMRSBoRGljdCkKK3sKKyAgICBfY21zRElDVCogZGljdCA9IChfY21zRElDVCopIGhEaWN0OworICAgIGNtc0RJQ1RlbnRyeSAqZW50cnksICpuZXh0OworCisgICAgX2Ntc0Fzc2VydChkaWN0ICE9IE5VTEwpOworCisgICAgLy8gV2FsayB0aGUgbGlzdCBmcmVlaW5nIGFsbCBub2RlcworICAgIGVudHJ5ID0gZGljdCAtPmhlYWQ7CisgICAgd2hpbGUgKGVudHJ5ICE9IE5VTEwpIHsKKworICAgICAgICAgICAgaWYgKGVudHJ5IC0+RGlzcGxheU5hbWUgICE9IE5VTEwpIGNtc01MVWZyZWUoZW50cnkgLT5EaXNwbGF5TmFtZSk7CisgICAgICAgICAgICBpZiAoZW50cnkgLT5EaXNwbGF5VmFsdWUgIT0gTlVMTCkgY21zTUxVZnJlZShlbnRyeSAtPkRpc3BsYXlWYWx1ZSk7CisgICAgICAgICAgICBpZiAoZW50cnkgLT5OYW1lICE9IE5VTEwpIF9jbXNGcmVlKGRpY3QgLT5Db250ZXh0SUQsIGVudHJ5IC0+IE5hbWUpOworICAgICAgICAgICAgaWYgKGVudHJ5IC0+VmFsdWUgIT0gTlVMTCkgX2Ntc0ZyZWUoZGljdCAtPkNvbnRleHRJRCwgZW50cnkgLT4gVmFsdWUpOworCisgICAgICAgICAgICAvLyBEb24ndCBmYWxsIGluIHRoZSBoYWJpdHVhbCB0cmFwLi4uCisgICAgICAgICAgICBuZXh0ID0gZW50cnkgLT5OZXh0OworICAgICAgICAgICAgX2Ntc0ZyZWUoZGljdCAtPkNvbnRleHRJRCwgZW50cnkpOworCisgICAgICAgICAgICBlbnRyeSA9IG5leHQ7CisgICAgfQorCisgICAgX2Ntc0ZyZWUoZGljdCAtPkNvbnRleHRJRCwgZGljdCk7Cit9CisKKworLy8gRHVwbGljYXRlIGEgd2lkZSBjaGFyIHN0cmluZworc3RhdGljCit3Y2hhcl90KiBEdXBXY3MoY21zQ29udGV4dCBDb250ZXh0SUQsIGNvbnN0IHdjaGFyX3QqIHB0cikKK3sKKyAgICBpZiAocHRyID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIHJldHVybiAod2NoYXJfdCopIF9jbXNEdXBNZW0oQ29udGV4dElELCBwdHIsIChteXdjc2xlbihwdHIpICsgMSkgKiBzaXplb2Yod2NoYXJfdCkpOworfQorCisvLyBBZGQgYSBuZXcgZW50cnkgdG8gdGhlIGxpbmtlZCBsaXN0CitjbXNCb29sIENNU0VYUE9SVCBjbXNEaWN0QWRkRW50cnkoY21zSEFORExFIGhEaWN0LCBjb25zdCB3Y2hhcl90KiBOYW1lLCBjb25zdCB3Y2hhcl90KiBWYWx1ZSwgY29uc3QgY21zTUxVICpEaXNwbGF5TmFtZSwgY29uc3QgY21zTUxVICpEaXNwbGF5VmFsdWUpCit7CisgICAgX2Ntc0RJQ1QqIGRpY3QgPSAoX2Ntc0RJQ1QqKSBoRGljdDsKKyAgICBjbXNESUNUZW50cnkgKmVudHJ5OworCisgICAgX2Ntc0Fzc2VydChkaWN0ICE9IE5VTEwpOworICAgIF9jbXNBc3NlcnQoTmFtZSAhPSBOVUxMKTsKKworICAgIGVudHJ5ID0gKGNtc0RJQ1RlbnRyeSopIF9jbXNNYWxsb2NaZXJvKGRpY3QgLT5Db250ZXh0SUQsIHNpemVvZihjbXNESUNUZW50cnkpKTsKKyAgICBpZiAoZW50cnkgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworCisgICAgZW50cnkgLT5EaXNwbGF5TmFtZSAgPSBjbXNNTFVkdXAoRGlzcGxheU5hbWUpOworICAgIGVudHJ5IC0+RGlzcGxheVZhbHVlID0gY21zTUxVZHVwKERpc3BsYXlWYWx1ZSk7CisgICAgZW50cnkgLT5OYW1lICAgICAgICAgPSBEdXBXY3MoZGljdCAtPkNvbnRleHRJRCwgTmFtZSk7CisgICAgZW50cnkgLT5WYWx1ZSAgICAgICAgPSBEdXBXY3MoZGljdCAtPkNvbnRleHRJRCwgVmFsdWUpOworCisgICAgZW50cnkgLT5OZXh0ID0gZGljdCAtPmhlYWQ7CisgICAgZGljdCAtPmhlYWQgPSBlbnRyeTsKKworICAgIHJldHVybiBUUlVFOworfQorCisKKy8vIER1cGxpY2F0ZXMgYW4gZXhpc3RpbmcgZGljdGlvbmFyeQorY21zSEFORExFIENNU0VYUE9SVCBjbXNEaWN0RHVwKGNtc0hBTkRMRSBoRGljdCkKK3sKKyAgICBfY21zRElDVCogb2xkX2RpY3QgPSAoX2Ntc0RJQ1QqKSBoRGljdDsKKyAgICBjbXNIQU5ETEUgaE5ldzsKKyAgICBjbXNESUNUZW50cnkgKmVudHJ5OworCisgICAgX2Ntc0Fzc2VydChvbGRfZGljdCAhPSBOVUxMKTsKKworICAgIGhOZXcgID0gY21zRGljdEFsbG9jKG9sZF9kaWN0IC0+Q29udGV4dElEKTsKKyAgICBpZiAoaE5ldyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIC8vIFdhbGsgdGhlIGxpc3QgZnJlZWluZyBhbGwgbm9kZXMKKyAgICBlbnRyeSA9IG9sZF9kaWN0IC0+aGVhZDsKKyAgICB3aGlsZSAoZW50cnkgIT0gTlVMTCkgeworCisgICAgICAgIGlmICghY21zRGljdEFkZEVudHJ5KGhOZXcsIGVudHJ5IC0+TmFtZSwgZW50cnkgLT5WYWx1ZSwgZW50cnkgLT5EaXNwbGF5TmFtZSwgZW50cnkgLT5EaXNwbGF5VmFsdWUpKSB7CisKKyAgICAgICAgICAgIGNtc0RpY3RGcmVlKGhOZXcpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBlbnRyeSA9IGVudHJ5IC0+IE5leHQ7CisgICAgfQorCisgICAgcmV0dXJuIGhOZXc7Cit9CisKKy8vIEdldCBhIHBvaW50ZXIgdG8gdGhlIGxpbmtlZCBsaXN0Citjb25zdCBjbXNESUNUZW50cnkqIENNU0VYUE9SVCBjbXNEaWN0R2V0RW50cnlMaXN0KGNtc0hBTkRMRSBoRGljdCkKK3sKKyAgICBfY21zRElDVCogZGljdCA9IChfY21zRElDVCopIGhEaWN0OworCisgICAgaWYgKGRpY3QgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGRpY3QgLT5oZWFkOworfQorCisvLyBIZWxwZXIgRm9yIGV4dGVybmFsIGxhbmd1YWdlcworY29uc3QgY21zRElDVGVudHJ5KiBDTVNFWFBPUlQgY21zRGljdE5leHRFbnRyeShjb25zdCBjbXNESUNUZW50cnkqIGUpCit7CisgICAgIGlmIChlID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICByZXR1cm4gZSAtPk5leHQ7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNvcHQuYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc29wdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZTI2YjkKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNvcHQuYwpAQCAtMCwwICsxLDE5NTQgQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8KKy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisvLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKKy8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisvLworLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKy8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorLy8KKy8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCisvLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQorLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisvLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKworI2luY2x1ZGUgImxjbXMyX2ludGVybmFsLmgiCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE9wdGltaXphdGlvbiBmb3IgOCBiaXRzLCBTaGFwZXItQ0xVVCAoMyBpbnB1dHMgb25seSkKK3R5cGVkZWYgc3RydWN0IHsKKworICAgIGNtc0NvbnRleHQgQ29udGV4dElEOworCisgICAgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBwOyAgIC8vIFRldHJhaGVkcmljYWwgaW50ZXJwb2xhdGlvbiBwYXJhbWV0ZXJzLiBUaGlzIGlzIGEgbm90LW93bmVkIHBvaW50ZXIuCisKKyAgICBjbXNVSW50MTZOdW1iZXIgcnhbMjU2XSwgcnlbMjU2XSwgcnpbMjU2XTsKKyAgICBjbXNVSW50MzJOdW1iZXIgWDBbMjU2XSwgWTBbMjU2XSwgWjBbMjU2XTsgIC8vIFByZWNvbXB1dGVkIG5vZGVzIGFuZCBvZmZzZXRzIGZvciA4LWJpdCBpbnB1dCBkYXRhCisKKworfSBQcmVsaW44RGF0YTsKKworCisvLyBHZW5lcmljIG9wdGltaXphdGlvbiBmb3IgMTYgYml0cyBTaGFwZXItQ0xVVC1TaGFwZXIgKGFueSBpbnB1dHMpCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBjbXNDb250ZXh0IENvbnRleHRJRDsKKworICAgIC8vIE51bWJlciBvZiBjaGFubmVscworICAgIGludCBuSW5wdXRzOworICAgIGludCBuT3V0cHV0czsKKworICAgIF9jbXNJbnRlcnBGbjE2IEV2YWxDdXJ2ZUluMTZbTUFYX0lOUFVUX0RJTUVOU0lPTlNdOyAgICAgICAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMgaXMga25vd24gaW4gYWR2YW5jZQorICAgIGNtc0ludGVycFBhcmFtcyogIFBhcmFtc0N1cnZlSW4xNltNQVhfSU5QVVRfRElNRU5TSU9OU107CisKKyAgICBfY21zSW50ZXJwRm4xNiBFdmFsQ0xVVDsgICAgICAgICAgICAvLyBUaGUgZXZhbHVhdG9yIGZvciAzRCBncmlkCisgICAgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBDTFVUcGFyYW1zOyAgLy8gKG5vdC1vd25lZCBwb2ludGVyKQorCisKKyAgICBfY21zSW50ZXJwRm4xNiogRXZhbEN1cnZlT3V0MTY7ICAgICAgIC8vIFBvaW50cyB0byBhbiBhcnJheSBvZiBjdXJ2ZSBldmFsdWF0b3JzIGluIDE2IGJpdHMgKG5vdC1vd25lZCBwb2ludGVyKQorICAgIGNtc0ludGVycFBhcmFtcyoqICBQYXJhbXNDdXJ2ZU91dDE2OyAgLy8gUG9pbnRzIHRvIGFuIGFycmF5IG9mIHJlZmVyZW5jZXMgdG8gaW50ZXJwb2xhdGlvbiBwYXJhbXMgKG5vdC1vd25lZCBwb2ludGVyKQorCisKK30gUHJlbGluMTZEYXRhOworCisKKy8vIE9wdGltaXphdGlvbiBmb3IgbWF0cml4LXNoYXBlciBpbiA4IGJpdHMuIE51bWJlcnMgYXJlIG9wZXJhdGVkIGluIG4uMTQgc2lnbmVkLCB0YWJsZXMgYXJlIHN0b3JlZCBpbiAxLjE0IGZpeGVkCisKK3R5cGVkZWYgY21zSW50MzJOdW1iZXIgY21zUzFGaXhlZDE0TnVtYmVyOyAgIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBob2xkIG1vcmUgdGhhbiAxNiBiaXRzIQorCisjZGVmaW5lIERPVUJMRV9UT18xRklYRUQxNCh4KSAoKGNtc1MxRml4ZWQxNE51bWJlcikgZmxvb3IoKHgpICogMTYzODQuMCArIDAuNSkpCisKK3R5cGVkZWYgc3RydWN0IHsKKworICAgIGNtc0NvbnRleHQgQ29udGV4dElEOworCisgICAgY21zUzFGaXhlZDE0TnVtYmVyIFNoYXBlcjFSWzI1Nl07ICAvLyBmcm9tIDAuLjI1NSB0byAxLjE0ICAoMC4wLi4uMS4wKQorICAgIGNtc1MxRml4ZWQxNE51bWJlciBTaGFwZXIxR1syNTZdOworICAgIGNtc1MxRml4ZWQxNE51bWJlciBTaGFwZXIxQlsyNTZdOworCisgICAgY21zUzFGaXhlZDE0TnVtYmVyIE1hdFszXVszXTsgICAgIC8vIG4uMTQgdG8gbi4xNCAobmVlZHMgYSBzYXR1cmF0aW9uIGFmdGVyIHRoYXQpCisgICAgY21zUzFGaXhlZDE0TnVtYmVyIE9mZlszXTsKKworICAgIGNtc1VJbnQxNk51bWJlciBTaGFwZXIyUlsxNjM4NV07ICAgIC8vIDEuMTQgdG8gMC4uMjU1CisgICAgY21zVUludDE2TnVtYmVyIFNoYXBlcjJHWzE2Mzg1XTsKKyAgICBjbXNVSW50MTZOdW1iZXIgU2hhcGVyMkJbMTYzODVdOworCit9IE1hdFNoYXBlcjhEYXRhOworCisvLyBDdXJ2ZXMsIG9wdGltaXphdGlvbiBpcyBzaGFyZWQgYmV0d2VlbiA4IGFuZCAxNiBiaXRzCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBjbXNDb250ZXh0IENvbnRleHRJRDsKKworICAgIGludCBuQ3VydmVzOyAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBjdXJ2ZXMKKyAgICBpbnQgbkVsZW1lbnRzOyAgICAgICAgICAgICAgICAvLyBFbGVtZW50cyBpbiBjdXJ2ZXMKKyAgICBjbXNVSW50MTZOdW1iZXIqKiBDdXJ2ZXM7ICAgICAvLyBQb2ludHMgdG8gYSBkeW5hbWljYWxseSAgYWxsb2NhdGVkIGFycmF5CisKK30gQ3VydmVzMTZEYXRhOworCisKKy8vIFNpbXBsZSBvcHRpbWl6YXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisvLyBSZW1vdmUgYW4gZWxlbWVudCBpbiBsaW5rZWQgY2hhaW4KK3N0YXRpYwordm9pZCBfUmVtb3ZlRWxlbWVudChjbXNTdGFnZSoqIGhlYWQpCit7CisgICAgY21zU3RhZ2UqIG1wZSA9ICpoZWFkOworICAgIGNtc1N0YWdlKiBuZXh0ID0gbXBlIC0+TmV4dDsKKyAgICAqaGVhZCA9IG5leHQ7CisgICAgY21zU3RhZ2VGcmVlKG1wZSk7Cit9CisKKy8vIFJlbW92ZSBhbGwgaWRlbnRpdGllcyBpbiBjaGFpbi4gTm90ZSB0aGF0IHB0IGFjdHVhbGx5IGlzIGEgZG91YmxlIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnQgdGhhdCBob2xkcyB0aGUgcG9pbnRlci4KK3N0YXRpYworY21zQm9vbCBfUmVtb3ZlMU9wKGNtc1BpcGVsaW5lKiBMdXQsIGNtc1N0YWdlU2lnbmF0dXJlIFVuYXJ5T3ApCit7CisgICAgY21zU3RhZ2UqKiBwdCA9ICZMdXQgLT5FbGVtZW50czsKKyAgICBjbXNCb29sIEFueU9wdCA9IEZBTFNFOworCisgICAgd2hpbGUgKCpwdCAhPSBOVUxMKSB7CisKKyAgICAgICAgaWYgKCgqcHQpIC0+SW1wbGVtZW50cyA9PSBVbmFyeU9wKSB7CisgICAgICAgICAgICBfUmVtb3ZlRWxlbWVudChwdCk7CisgICAgICAgICAgICBBbnlPcHQgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHB0ID0gJigoKnB0KSAtPiBOZXh0KTsKKyAgICB9CisKKyAgICByZXR1cm4gQW55T3B0OworfQorCisvLyBTYW1lLCBidXQgb25seSBpZiB0d28gYWRqYWNlbnQgZWxlbWVudHMgYXJlIGZvdW5kCitzdGF0aWMKK2Ntc0Jvb2wgX1JlbW92ZTJPcChjbXNQaXBlbGluZSogTHV0LCBjbXNTdGFnZVNpZ25hdHVyZSBPcDEsIGNtc1N0YWdlU2lnbmF0dXJlIE9wMikKK3sKKyAgICBjbXNTdGFnZSoqIHB0MTsKKyAgICBjbXNTdGFnZSoqIHB0MjsKKyAgICBjbXNCb29sIEFueU9wdCA9IEZBTFNFOworCisgICAgcHQxID0gJkx1dCAtPkVsZW1lbnRzOworICAgIGlmICgqcHQxID09IE5VTEwpIHJldHVybiBBbnlPcHQ7CisKKyAgICB3aGlsZSAoKnB0MSAhPSBOVUxMKSB7CisKKyAgICAgICAgcHQyID0gJigoKnB0MSkgLT4gTmV4dCk7CisgICAgICAgIGlmICgqcHQyID09IE5VTEwpIHJldHVybiBBbnlPcHQ7CisKKyAgICAgICAgaWYgKCgqcHQxKSAtPkltcGxlbWVudHMgPT0gT3AxICYmICgqcHQyKSAtPkltcGxlbWVudHMgPT0gT3AyKSB7CisgICAgICAgICAgICBfUmVtb3ZlRWxlbWVudChwdDIpOworICAgICAgICAgICAgX1JlbW92ZUVsZW1lbnQocHQxKTsKKyAgICAgICAgICAgIEFueU9wdCA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHQxID0gJigoKnB0MSkgLT4gTmV4dCk7CisgICAgfQorCisgICAgcmV0dXJuIEFueU9wdDsKK30KKworCitzdGF0aWMKK2Ntc0Jvb2wgQ2xvc2VFbm91Z2hGbG9hdChjbXNGbG9hdDY0TnVtYmVyIGEsIGNtc0Zsb2F0NjROdW1iZXIgYikKK3sKKyAgICAgICByZXR1cm4gZmFicyhiIC0gYSkgPCAwLjAwMDAxZjsKK30KKworc3RhdGljCitjbXNCb29sICBpc0Zsb2F0TWF0cml4SWRlbnRpdHkoY29uc3QgY21zTUFUMyogYSkKK3sKKyAgICAgICBjbXNNQVQzIElkZW50aXR5OworICAgICAgIGludCBpLCBqOworCisgICAgICAgX2Ntc01BVDNpZGVudGl0eSgmSWRlbnRpdHkpOworCisgICAgICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKyAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IDM7IGorKykKKyAgICAgICAgICAgICAgICAgICAgIGlmICghQ2xvc2VFbm91Z2hGbG9hdChhLT52W2ldLm5bal0sIElkZW50aXR5LnZbaV0ubltqXSkpIHJldHVybiBGQUxTRTsKKworICAgICAgIHJldHVybiBUUlVFOworfQorLy8gaWYgdHdvIGFkamFjZW50IG1hdHJpY2VzIGFyZSBmb3VuZCwgbXVsdGlwbHkgdGhlbS4gCitzdGF0aWMKK2Ntc0Jvb2wgX011bHRpcGx5TWF0cml4KGNtc1BpcGVsaW5lKiBMdXQpCit7CisgICAgICAgY21zU3RhZ2UqKiBwdDE7CisgICAgICAgY21zU3RhZ2UqKiBwdDI7CisgICAgICAgY21zU3RhZ2UqICBjaGFpbjsKKyAgICAgICBjbXNCb29sIEFueU9wdCA9IEZBTFNFOworCisgICAgICAgcHQxID0gJkx1dC0+RWxlbWVudHM7CisgICAgICAgaWYgKCpwdDEgPT0gTlVMTCkgcmV0dXJuIEFueU9wdDsKKworICAgICAgIHdoaWxlICgqcHQxICE9IE5VTEwpIHsKKworICAgICAgICAgICAgICBwdDIgPSAmKCgqcHQxKS0+TmV4dCk7CisgICAgICAgICAgICAgIGlmICgqcHQyID09IE5VTEwpIHJldHVybiBBbnlPcHQ7CisKKyAgICAgICAgICAgICAgaWYgKCgqcHQxKS0+SW1wbGVtZW50cyA9PSBjbXNTaWdNYXRyaXhFbGVtVHlwZSAmJiAoKnB0MiktPkltcGxlbWVudHMgPT0gY21zU2lnTWF0cml4RWxlbVR5cGUpIHsKKworICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGJvdGggbWF0cmljZXMKKyAgICAgICAgICAgICAgICAgICAgIF9jbXNTdGFnZU1hdHJpeERhdGEqIG0xID0gKF9jbXNTdGFnZU1hdHJpeERhdGEqKSBjbXNTdGFnZURhdGEoKnB0MSk7CisgICAgICAgICAgICAgICAgICAgICBfY21zU3RhZ2VNYXRyaXhEYXRhKiBtMiA9IChfY21zU3RhZ2VNYXRyaXhEYXRhKikgY21zU3RhZ2VEYXRhKCpwdDIpOworICAgICAgICAgICAgICAgICAgICAgY21zTUFUMyByZXM7CisgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgIC8vIElucHV0IG9mZnNldCBhbmQgb3V0cHV0IG9mZnNldCBzaG91bGQgYmUgemVybyB0byB1c2UgdGhpcyBvcHRpbWl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgIGlmIChtMS0+T2Zmc2V0ICE9IE5VTEwgfHwgbTIgLT5PZmZzZXQgIT0gTlVMTCB8fCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNTdGFnZUlucHV0Q2hhbm5lbHMoKnB0MSkgIT0gMyB8fCBjbXNTdGFnZU91dHB1dENoYW5uZWxzKCpwdDEpICE9IDMgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zU3RhZ2VJbnB1dENoYW5uZWxzKCpwdDIpICE9IDMgfHwgY21zU3RhZ2VPdXRwdXRDaGFubmVscygqcHQyKSAhPSAzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgICAgICAgICAgLy8gTXVsdGlwbHkgYm90aCBtYXRyaWNlcyB0byBnZXQgdGhlIHJlc3VsdAorICAgICAgICAgICAgICAgICAgICAgX2Ntc01BVDNwZXIoJnJlcywgKGNtc01BVDMqKW0yLT5Eb3VibGUsIChjbXNNQVQzKiltMS0+RG91YmxlKTsKKworICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IGluIGNoYWluIGFmZXIgdGhlIG1hdHJpY2VzCisgICAgICAgICAgICAgICAgICAgICBjaGFpbiA9ICgqcHQyKS0+TmV4dDsKKworICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGJvdGggbWF0cmljZXMKKyAgICAgICAgICAgICAgICAgICAgIF9SZW1vdmVFbGVtZW50KHB0Mik7CisgICAgICAgICAgICAgICAgICAgICBfUmVtb3ZlRWxlbWVudChwdDEpOworCisgICAgICAgICAgICAgICAgICAgICAvLyBOb3cgd2hhdCBpZiB0aGUgcmVzdWx0IGlzIGEgcGxhaW4gaWRlbnRpdHk/ICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzRmxvYXRNYXRyaXhJZGVudGl0eSgmcmVzKSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FuIG5vdCBnZXQgcmlkIG9mIGZ1bGwgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1N0YWdlKiBNdWx0bWF0ID0gY21zU3RhZ2VBbGxvY01hdHJpeChMdXQtPkNvbnRleHRJRCwgMywgMywgKGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIqKSAmcmVzLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTXVsdG1hdCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7ICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWNvdmVyIHRoZSBjaGFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRtYXQtPk5leHQgPSBjaGFpbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHQxID0gTXVsdG1hdDsKKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgQW55T3B0ID0gVFJVRTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICBwdDEgPSAmKCgqcHQxKS0+TmV4dCk7CisgICAgICAgfQorCisgICAgICAgcmV0dXJuIEFueU9wdDsKK30KKworCisvLyBQcmVvcHRpbWl6ZSBqdXN0IGdldHMgcmlmIG9mIG5vLW9wcyBjb21pbmcgcGFpcmVkLiBDb252ZXJzaW9uIGZyb20gdjIgdG8gdjQgZm9sbG93ZWQKKy8vIGJ5IGEgdjQgdG8gdjIgYW5kIHZpY2UtdmVyc2EuIFRoZSBlbGVtZW50cyBhcmUgdGhlbiBkaXNjYXJkZWQuCitzdGF0aWMKK2Ntc0Jvb2wgUHJlT3B0aW1pemUoY21zUGlwZWxpbmUqIEx1dCkKK3sKKyAgICBjbXNCb29sIEFueU9wdCA9IEZBTFNFLCBPcHQ7CisKKyAgICBkbyB7CisKKyAgICAgICAgT3B0ID0gRkFMU0U7CisKKyAgICAgICAgLy8gUmVtb3ZlIGFsbCBpZGVudGl0aWVzCisgICAgICAgIE9wdCB8PSBfUmVtb3ZlMU9wKEx1dCwgY21zU2lnSWRlbnRpdHlFbGVtVHlwZSk7CisKKyAgICAgICAgLy8gUmVtb3ZlIFhZWjJMYWIgZm9sbG93ZWQgYnkgTGFiMlhZWgorICAgICAgICBPcHQgfD0gX1JlbW92ZTJPcChMdXQsIGNtc1NpZ1hZWjJMYWJFbGVtVHlwZSwgY21zU2lnTGFiMlhZWkVsZW1UeXBlKTsKKworICAgICAgICAvLyBSZW1vdmUgTGFiMlhZWiBmb2xsb3dlZCBieSBYWVoyTGFiCisgICAgICAgIE9wdCB8PSBfUmVtb3ZlMk9wKEx1dCwgY21zU2lnTGFiMlhZWkVsZW1UeXBlLCBjbXNTaWdYWVoyTGFiRWxlbVR5cGUpOworCisgICAgICAgIC8vIFJlbW92ZSBWNCB0byBWMiBmb2xsb3dlZCBieSBWMiB0byBWNAorICAgICAgICBPcHQgfD0gX1JlbW92ZTJPcChMdXQsIGNtc1NpZ0xhYlY0dG9WMiwgY21zU2lnTGFiVjJ0b1Y0KTsKKworICAgICAgICAvLyBSZW1vdmUgVjIgdG8gVjQgZm9sbG93ZWQgYnkgVjQgdG8gVjIKKyAgICAgICAgT3B0IHw9IF9SZW1vdmUyT3AoTHV0LCBjbXNTaWdMYWJWMnRvVjQsIGNtc1NpZ0xhYlY0dG9WMik7CisKKyAgICAgICAgLy8gUmVtb3ZlIGZsb2F0IHBjcyBMYWIgY29udmVyc2lvbnMKKyAgICAgICAgT3B0IHw9IF9SZW1vdmUyT3AoTHV0LCBjbXNTaWdMYWIyRmxvYXRQQ1MsIGNtc1NpZ0Zsb2F0UENTMkxhYik7CisKKyAgICAgICAgLy8gUmVtb3ZlIGZsb2F0IHBjcyBMYWIgY29udmVyc2lvbnMKKyAgICAgICAgT3B0IHw9IF9SZW1vdmUyT3AoTHV0LCBjbXNTaWdYWVoyRmxvYXRQQ1MsIGNtc1NpZ0Zsb2F0UENTMlhZWik7CisKKyAgICAgICAgLy8gU2ltcGxpZnkgbWF0cml4LiAKKyAgICAgICAgT3B0IHw9IF9NdWx0aXBseU1hdHJpeChMdXQpOworCisgICAgICAgIGlmIChPcHQpIEFueU9wdCA9IFRSVUU7CisKKyAgICB9IHdoaWxlIChPcHQpOworCisgICAgcmV0dXJuIEFueU9wdDsKK30KKworc3RhdGljCit2b2lkIEV2YWwxNm5vcDFEKHJlZ2lzdGVyIGNvbnN0IGNtc1VJbnQxNk51bWJlciBJbnB1dFtdLAorICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgT3V0cHV0W10sCisgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBfY21zX2ludGVycF9zdHJ1YyogcCkKK3sKKyAgICBPdXRwdXRbMF0gPSBJbnB1dFswXTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIocCk7Cit9CisKK3N0YXRpYwordm9pZCBQcmVsaW5FdmFsMTYocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIElucHV0W10sCisgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgT3V0cHV0W10sCisgICAgICAgICAgICAgICAgICByZWdpc3RlciBjb25zdCB2b2lkKiBEKQoreworICAgIFByZWxpbjE2RGF0YSogcDE2ID0gKFByZWxpbjE2RGF0YSopIEQ7CisgICAgY21zVUludDE2TnVtYmVyICBTdGFnZUFCQ1tNQVhfSU5QVVRfRElNRU5TSU9OU107CisgICAgY21zVUludDE2TnVtYmVyICBTdGFnZURFRltjbXNNQVhDSEFOTkVMU107CisgICAgaW50IGk7CisKKyAgICBmb3IgKGk9MDsgaSA8IHAxNiAtPm5JbnB1dHM7IGkrKykgeworCisgICAgICAgIHAxNiAtPkV2YWxDdXJ2ZUluMTZbaV0oJklucHV0W2ldLCAmU3RhZ2VBQkNbaV0sIHAxNiAtPlBhcmFtc0N1cnZlSW4xNltpXSk7CisgICAgfQorCisgICAgcDE2IC0+RXZhbENMVVQoU3RhZ2VBQkMsIFN0YWdlREVGLCBwMTYgLT5DTFVUcGFyYW1zKTsKKworICAgIGZvciAoaT0wOyBpIDwgcDE2IC0+bk91dHB1dHM7IGkrKykgeworCisgICAgICAgIHAxNiAtPkV2YWxDdXJ2ZU91dDE2W2ldKCZTdGFnZURFRltpXSwgJk91dHB1dFtpXSwgcDE2IC0+UGFyYW1zQ3VydmVPdXQxNltpXSk7CisgICAgfQorfQorCisKK3N0YXRpYwordm9pZCBQcmVsaW5PcHQxNmZyZWUoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIHB0cikKK3sKKyAgICBQcmVsaW4xNkRhdGEqIHAxNiA9IChQcmVsaW4xNkRhdGEqKSBwdHI7CisKKyAgICBfY21zRnJlZShDb250ZXh0SUQsIHAxNiAtPkV2YWxDdXJ2ZU91dDE2KTsKKyAgICBfY21zRnJlZShDb250ZXh0SUQsIHAxNiAtPlBhcmFtc0N1cnZlT3V0MTYpOworCisgICAgX2Ntc0ZyZWUoQ29udGV4dElELCBwMTYpOworfQorCitzdGF0aWMKK3ZvaWQqIFByZWxpbjE2ZHVwKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCB2b2lkKiBwdHIpCit7CisgICAgUHJlbGluMTZEYXRhKiBwMTYgPSAoUHJlbGluMTZEYXRhKikgcHRyOworICAgIFByZWxpbjE2RGF0YSogRHVwZWQgPSAoUHJlbGluMTZEYXRhKikgX2Ntc0R1cE1lbShDb250ZXh0SUQsIHAxNiwgc2l6ZW9mKFByZWxpbjE2RGF0YSkpOworCisgICAgaWYgKER1cGVkID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgRHVwZWQtPkV2YWxDdXJ2ZU91dDE2ID0gKF9jbXNJbnRlcnBGbjE2KikgX2Ntc0R1cE1lbShDb250ZXh0SUQsIHAxNi0+RXZhbEN1cnZlT3V0MTYsIHAxNi0+bk91dHB1dHMgKiBzaXplb2YoX2Ntc0ludGVycEZuMTYpKTsKKyAgICBEdXBlZC0+UGFyYW1zQ3VydmVPdXQxNiA9IChjbXNJbnRlcnBQYXJhbXMqKilfY21zRHVwTWVtKENvbnRleHRJRCwgcDE2LT5QYXJhbXNDdXJ2ZU91dDE2LCBwMTYtPm5PdXRwdXRzICogc2l6ZW9mKGNtc0ludGVycFBhcmFtcyopKTsKKworICAgIHJldHVybiBEdXBlZDsKK30KKworCitzdGF0aWMKK1ByZWxpbjE2RGF0YSogUHJlbGluT3B0MTZhbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNJbnRlcnBQYXJhbXMqIENvbG9yTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuSW5wdXRzLCBjbXNUb25lQ3VydmUqKiBJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbk91dHB1dHMsIGNtc1RvbmVDdXJ2ZSoqIE91dCApCit7CisgICAgaW50IGk7CisgICAgUHJlbGluMTZEYXRhKiBwMTYgPSAoUHJlbGluMTZEYXRhKilfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihQcmVsaW4xNkRhdGEpKTsKKyAgICBpZiAocDE2ID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgcDE2IC0+bklucHV0cyA9IG5JbnB1dHM7CisgICAgcDE2IC0+IG5PdXRwdXRzID0gbk91dHB1dHM7CisKKworICAgIGZvciAoaT0wOyBpIDwgbklucHV0czsgaSsrKSB7CisKKyAgICAgICAgaWYgKEluID09IE5VTEwpIHsKKyAgICAgICAgICAgIHAxNiAtPiBQYXJhbXNDdXJ2ZUluMTZbaV0gPSBOVUxMOworICAgICAgICAgICAgcDE2IC0+IEV2YWxDdXJ2ZUluMTZbaV0gPSBFdmFsMTZub3AxRDsKKworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcDE2IC0+IFBhcmFtc0N1cnZlSW4xNltpXSA9IEluW2ldIC0+SW50ZXJwUGFyYW1zOworICAgICAgICAgICAgcDE2IC0+IEV2YWxDdXJ2ZUluMTZbaV0gPSBwMTYgLT5QYXJhbXNDdXJ2ZUluMTZbaV0tPkludGVycG9sYXRpb24uTGVycDE2OworICAgICAgICB9CisgICAgfQorCisgICAgcDE2IC0+Q0xVVHBhcmFtcyA9IENvbG9yTWFwOworICAgIHAxNiAtPkV2YWxDTFVUICAgPSBDb2xvck1hcCAtPkludGVycG9sYXRpb24uTGVycDE2OworCisKKyAgICBwMTYgLT4gRXZhbEN1cnZlT3V0MTYgPSAoX2Ntc0ludGVycEZuMTYqKSBfY21zQ2FsbG9jKENvbnRleHRJRCwgbk91dHB1dHMsIHNpemVvZihfY21zSW50ZXJwRm4xNikpOworICAgIHAxNiAtPiBQYXJhbXNDdXJ2ZU91dDE2ID0gKGNtc0ludGVycFBhcmFtcyoqKSBfY21zQ2FsbG9jKENvbnRleHRJRCwgbk91dHB1dHMsIHNpemVvZihjbXNJbnRlcnBQYXJhbXMqICkpOworCisgICAgZm9yIChpPTA7IGkgPCBuT3V0cHV0czsgaSsrKSB7CisKKyAgICAgICAgaWYgKE91dCA9PSBOVUxMKSB7CisgICAgICAgICAgICBwMTYgLT5QYXJhbXNDdXJ2ZU91dDE2W2ldID0gTlVMTDsKKyAgICAgICAgICAgIHAxNiAtPiBFdmFsQ3VydmVPdXQxNltpXSA9IEV2YWwxNm5vcDFEOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICBwMTYgLT5QYXJhbXNDdXJ2ZU91dDE2W2ldID0gT3V0W2ldIC0+SW50ZXJwUGFyYW1zOworICAgICAgICAgICAgcDE2IC0+IEV2YWxDdXJ2ZU91dDE2W2ldID0gcDE2IC0+UGFyYW1zQ3VydmVPdXQxNltpXS0+SW50ZXJwb2xhdGlvbi5MZXJwMTY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcDE2OworfQorCisKKworLy8gUmVzYW1wbGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBQUkVMSU5FQVJJWkFUSU9OX1BPSU5UUyA0MDk2CisKKy8vIFNhbXBsZXIgaW1wbGVtZW50ZWQgYnkgYW5vdGhlciBMVVQuIFRoaXMgaXMgYSBjbGVhbiB3YXkgdG8gcHJlY2FsY3VsYXRlIHRoZSBkZXZpY2VsaW5rIDNEIENMVVQgZm9yCisvLyBhbG1vc3QgYW55IHRyYW5zZm9ybS4gV2UgdXNlIGZsb2F0aW5nIHBvaW50IHByZWNpc2lvbiBhbmQgdGhlbiBjb252ZXJ0IGZyb20gZmxvYXRpbmcgcG9pbnQgdG8gMTYgYml0cy4KK3N0YXRpYworaW50IFhGb3JtU2FtcGxlcjE2KHJlZ2lzdGVyIGNvbnN0IGNtc1VJbnQxNk51bWJlciBJbltdLCByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgT3V0W10sIHJlZ2lzdGVyIHZvaWQqIENhcmdvKQoreworICAgIGNtc1BpcGVsaW5lKiBMdXQgPSAoY21zUGlwZWxpbmUqKSBDYXJnbzsKKyAgICBjbXNGbG9hdDMyTnVtYmVyIEluRmxvYXRbY21zTUFYQ0hBTk5FTFNdLCBPdXRGbG9hdFtjbXNNQVhDSEFOTkVMU107CisgICAgY21zVUludDMyTnVtYmVyIGk7CisKKyAgICBfY21zQXNzZXJ0KEx1dCAtPiBJbnB1dENoYW5uZWxzIDwgY21zTUFYQ0hBTk5FTFMpOworICAgIF9jbXNBc3NlcnQoTHV0IC0+IE91dHB1dENoYW5uZWxzIDwgY21zTUFYQ0hBTk5FTFMpOworCisgICAgLy8gRnJvbSAxNiBiaXQgdG8gZmxvYXRpbmcgcG9pbnQKKyAgICBmb3IgKGk9MDsgaSA8IEx1dCAtPklucHV0Q2hhbm5lbHM7IGkrKykKKyAgICAgICAgSW5GbG9hdFtpXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoSW5baV0gLyA2NTUzNS4wKTsKKworICAgIC8vIEV2YWx1YXRlIGluIGZsb2F0aW5nIHBvaW50CisgICAgY21zUGlwZWxpbmVFdmFsRmxvYXQoSW5GbG9hdCwgT3V0RmxvYXQsIEx1dCk7CisKKyAgICAvLyBCYWNrIHRvIDE2IGJpdHMgcmVwcmVzZW50YXRpb24KKyAgICBmb3IgKGk9MDsgaSA8IEx1dCAtPk91dHB1dENoYW5uZWxzOyBpKyspCisgICAgICAgIE91dFtpXSA9IF9jbXNRdWlja1NhdHVyYXRlV29yZChPdXRGbG9hdFtpXSAqIDY1NTM1LjApOworCisgICAgLy8gQWx3YXlzIHN1Y2NlZWQKKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gVHJ5IHRvIHNlZSBpZiB0aGUgY3VydmVzIG9mIGEgZ2l2ZW4gTVBFIGFyZSBsaW5lYXIKK3N0YXRpYworY21zQm9vbCBBbGxDdXJ2ZXNBcmVMaW5lYXIoY21zU3RhZ2UqIG1wZSkKK3sKKyAgICBjbXNUb25lQ3VydmUqKiBDdXJ2ZXM7CisgICAgY21zVUludDMyTnVtYmVyIGksIG47CisKKyAgICBDdXJ2ZXMgPSBfY21zU3RhZ2VHZXRQdHJUb0N1cnZlU2V0KG1wZSk7CisgICAgaWYgKEN1cnZlcyA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICBuID0gY21zU3RhZ2VPdXRwdXRDaGFubmVscyhtcGUpOworCisgICAgZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKKyAgICAgICAgaWYgKCFjbXNJc1RvbmVDdXJ2ZUxpbmVhcihDdXJ2ZXNbaV0pKSByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gcmVwbGFjZXMgYSBzcGVjaWZpYyBub2RlIHBsYWNlZCBpbiAiQXQiIGJ5IHRoZSAiVmFsdWUiIG51bWJlcnMuIEl0cyBwdXJwb3NlCisvLyBpcyB0byBmaXggc2N1bSBkb3Qgb24gYnJva2VuIHByb2ZpbGVzL3RyYW5zZm9ybXMuIFdvcmtzIG9uIDEsIDMgYW5kIDQgY2hhbm5lbHMKK3N0YXRpYworY21zQm9vbCAgUGF0Y2hMVVQoY21zU3RhZ2UqIENMVVQsIGNtc1VJbnQxNk51bWJlciBBdFtdLCBjbXNVSW50MTZOdW1iZXIgVmFsdWVbXSwKKyAgICAgICAgICAgICAgICAgIGludCBuQ2hhbm5lbHNPdXQsIGludCBuQ2hhbm5lbHNJbikKK3sKKyAgICBfY21zU3RhZ2VDTHV0RGF0YSogR3JpZCA9IChfY21zU3RhZ2VDTHV0RGF0YSopIENMVVQgLT5EYXRhOworICAgIGNtc0ludGVycFBhcmFtcyogcDE2ICA9IEdyaWQgLT5QYXJhbXM7CisgICAgY21zRmxvYXQ2NE51bWJlciBweCwgcHksIHB6LCBwdzsKKyAgICBpbnQgICAgICAgIHgwLCB5MCwgejAsIHcwOworICAgIGludCAgICAgICAgaSwgaW5kZXg7CisKKyAgICBpZiAoQ0xVVCAtPiBUeXBlICE9IGNtc1NpZ0NMdXRFbGVtVHlwZSkgeworICAgICAgICBjbXNTaWduYWxFcnJvcihDTFVULT5Db250ZXh0SUQsIGNtc0VSUk9SX0lOVEVSTkFMLCAiKGludGVybmFsKSBBdHRlbXB0IHRvIFBhdGNoTFVUIG9uIG5vbi1sdXQgc3RhZ2UiKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmIChuQ2hhbm5lbHNJbiA9PSA0KSB7CisKKyAgICAgICAgcHggPSAoKGNtc0Zsb2F0NjROdW1iZXIpIEF0WzBdICogKHAxNi0+RG9tYWluWzBdKSkgLyA2NTUzNS4wOworICAgICAgICBweSA9ICgoY21zRmxvYXQ2NE51bWJlcikgQXRbMV0gKiAocDE2LT5Eb21haW5bMV0pKSAvIDY1NTM1LjA7CisgICAgICAgIHB6ID0gKChjbXNGbG9hdDY0TnVtYmVyKSBBdFsyXSAqIChwMTYtPkRvbWFpblsyXSkpIC8gNjU1MzUuMDsKKyAgICAgICAgcHcgPSAoKGNtc0Zsb2F0NjROdW1iZXIpIEF0WzNdICogKHAxNi0+RG9tYWluWzNdKSkgLyA2NTUzNS4wOworCisgICAgICAgIHgwID0gKGludCkgZmxvb3IocHgpOworICAgICAgICB5MCA9IChpbnQpIGZsb29yKHB5KTsKKyAgICAgICAgejAgPSAoaW50KSBmbG9vcihweik7CisgICAgICAgIHcwID0gKGludCkgZmxvb3IocHcpOworCisgICAgICAgIGlmICgoKHB4IC0geDApICE9IDApIHx8CisgICAgICAgICAgICAoKHB5IC0geTApICE9IDApIHx8CisgICAgICAgICAgICAoKHB6IC0gejApICE9IDApIHx8CisgICAgICAgICAgICAoKHB3IC0gdzApICE9IDApKSByZXR1cm4gRkFMU0U7IC8vIE5vdCBvbiBleGFjdCBub2RlCisKKyAgICAgICAgaW5kZXggPSBwMTYgLT4gb3B0YVszXSAqIHgwICsKKyAgICAgICAgICAgICAgICBwMTYgLT4gb3B0YVsyXSAqIHkwICsKKyAgICAgICAgICAgICAgICBwMTYgLT4gb3B0YVsxXSAqIHowICsKKyAgICAgICAgICAgICAgICBwMTYgLT4gb3B0YVswXSAqIHcwOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGlmIChuQ2hhbm5lbHNJbiA9PSAzKSB7CisKKyAgICAgICAgICAgIHB4ID0gKChjbXNGbG9hdDY0TnVtYmVyKSBBdFswXSAqIChwMTYtPkRvbWFpblswXSkpIC8gNjU1MzUuMDsKKyAgICAgICAgICAgIHB5ID0gKChjbXNGbG9hdDY0TnVtYmVyKSBBdFsxXSAqIChwMTYtPkRvbWFpblsxXSkpIC8gNjU1MzUuMDsKKyAgICAgICAgICAgIHB6ID0gKChjbXNGbG9hdDY0TnVtYmVyKSBBdFsyXSAqIChwMTYtPkRvbWFpblsyXSkpIC8gNjU1MzUuMDsKKyAgICAgICAgICAgCisgICAgICAgICAgICB4MCA9IChpbnQpIGZsb29yKHB4KTsKKyAgICAgICAgICAgIHkwID0gKGludCkgZmxvb3IocHkpOworICAgICAgICAgICAgejAgPSAoaW50KSBmbG9vcihweik7CisgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCgocHggLSB4MCkgIT0gMCkgfHwKKyAgICAgICAgICAgICAgICAoKHB5IC0geTApICE9IDApIHx8CisgICAgICAgICAgICAgICAgKChweiAtIHowKSAhPSAwKSkgcmV0dXJuIEZBTFNFOyAgLy8gTm90IG9uIGV4YWN0IG5vZGUKKworICAgICAgICAgICAgaW5kZXggPSBwMTYgLT4gb3B0YVsyXSAqIHgwICsKKyAgICAgICAgICAgICAgICAgICAgcDE2IC0+IG9wdGFbMV0gKiB5MCArCisgICAgICAgICAgICAgICAgICAgIHAxNiAtPiBvcHRhWzBdICogejA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWYgKG5DaGFubmVsc0luID09IDEpIHsKKworICAgICAgICAgICAgICAgIHB4ID0gKChjbXNGbG9hdDY0TnVtYmVyKSBBdFswXSAqIChwMTYtPkRvbWFpblswXSkpIC8gNjU1MzUuMDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB4MCA9IChpbnQpIGZsb29yKHB4KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoKChweCAtIHgwKSAhPSAwKSkgcmV0dXJuIEZBTFNFOyAvLyBOb3Qgb24gZXhhY3Qgbm9kZQorCisgICAgICAgICAgICAgICAgaW5kZXggPSBwMTYgLT4gb3B0YVswXSAqIHgwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoQ0xVVC0+Q29udGV4dElELCBjbXNFUlJPUl9JTlRFUk5BTCwgIihpbnRlcm5hbCkgJWQgQ2hhbm5lbHMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gUGF0Y2hMVVQiLCBuQ2hhbm5lbHNJbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IG5DaGFubmVsc091dDsgaSsrKQorICAgICAgICAgICAgICAgIEdyaWQgLT4gVGFiLlRbaW5kZXggKyBpXSA9IFZhbHVlW2ldOworCisgICAgICAgICAgICByZXR1cm4gVFJVRTsKK30KKworLy8gQXV4aWxpYXJ5LCB0byBzZWUgaWYgdHdvIHZhbHVlcyBhcmUgZXF1YWwgb3IgdmVyeSBkaWZmZXJlbnQKK3N0YXRpYworY21zQm9vbCBXaGl0ZXNBcmVFcXVhbChpbnQgbiwgY21zVUludDE2TnVtYmVyIFdoaXRlMVtdLCBjbXNVSW50MTZOdW1iZXIgV2hpdGUyW10gKQoreworICAgIGludCBpOworCisgICAgZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKKworICAgICAgICBpZiAoYWJzKFdoaXRlMVtpXSAtIFdoaXRlMltpXSkgPiAweGYwMDApIHJldHVybiBUUlVFOyAgLy8gVmFsdWVzIGFyZSBzbyBleHRyZW1lbHkgZGlmZmVyZW50IHRoYXQgdGhlIGZpeHVwIHNob3VsZCBiZSBhdm9pZGVkCisgICAgICAgIGlmIChXaGl0ZTFbaV0gIT0gV2hpdGUyW2ldKSByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisKKy8vIExvY2F0ZSB0aGUgbm9kZSBmb3IgdGhlIHdoaXRlIHBvaW50IGFuZCBmaXggaXQgdG8gcHVyZSB3aGl0ZSBpbiBvcmRlciB0byBhdm9pZCBzY3VtIGRvdC4KK3N0YXRpYworY21zQm9vbCBGaXhXaGl0ZU1pc2FsaWdubWVudChjbXNQaXBlbGluZSogTHV0LCBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIEVudHJ5Q29sb3JTcGFjZSwgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBFeGl0Q29sb3JTcGFjZSkKK3sKKyAgICBjbXNVSW50MTZOdW1iZXIgKldoaXRlUG9pbnRJbiwgKldoaXRlUG9pbnRPdXQ7CisgICAgY21zVUludDE2TnVtYmVyICBXaGl0ZUluW2Ntc01BWENIQU5ORUxTXSwgV2hpdGVPdXRbY21zTUFYQ0hBTk5FTFNdLCBPYnRhaW5lZE91dFtjbXNNQVhDSEFOTkVMU107CisgICAgY21zVUludDMyTnVtYmVyIGksIG5PdXRzLCBuSW5zOworICAgIGNtc1N0YWdlICpQcmVMaW4gPSBOVUxMLCAqQ0xVVCA9IE5VTEwsICpQb3N0TGluID0gTlVMTDsKKworICAgIGlmICghX2Ntc0VuZFBvaW50c0J5U3BhY2UoRW50cnlDb2xvclNwYWNlLAorICAgICAgICAmV2hpdGVQb2ludEluLCBOVUxMLCAmbklucykpIHJldHVybiBGQUxTRTsKKworICAgIGlmICghX2Ntc0VuZFBvaW50c0J5U3BhY2UoRXhpdENvbG9yU3BhY2UsCisgICAgICAgICZXaGl0ZVBvaW50T3V0LCBOVUxMLCAmbk91dHMpKSByZXR1cm4gRkFMU0U7CisKKyAgICAvLyBJdCBuZWVkcyB0byBiZSBmaXhlZD8KKyAgICBpZiAoTHV0IC0+SW5wdXRDaGFubmVscyAhPSBuSW5zKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKEx1dCAtPk91dHB1dENoYW5uZWxzICE9IG5PdXRzKSByZXR1cm4gRkFMU0U7CisKKyAgICBjbXNQaXBlbGluZUV2YWwxNihXaGl0ZVBvaW50SW4sIE9idGFpbmVkT3V0LCBMdXQpOworCisgICAgaWYgKFdoaXRlc0FyZUVxdWFsKG5PdXRzLCBXaGl0ZVBvaW50T3V0LCBPYnRhaW5lZE91dCkpIHJldHVybiBUUlVFOyAvLyB3aGl0ZXMgYWxyZWFkeSBtYXRjaAorCisgICAgLy8gQ2hlY2sgaWYgdGhlIExVVCBjb21lcyBhcyBQcmVsaW4sIENMVVQgb3IgUG9zdGxpbi4gV2UgYWxsb3cgYWxsIGNvbWJpbmF0aW9ucworICAgIGlmICghY21zUGlwZWxpbmVDaGVja0FuZFJldHJlaXZlU3RhZ2VzKEx1dCwgMywgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgY21zU2lnQ0x1dEVsZW1UeXBlLCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLCAmUHJlTGluLCAmQ0xVVCwgJlBvc3RMaW4pKQorICAgICAgICBpZiAoIWNtc1BpcGVsaW5lQ2hlY2tBbmRSZXRyZWl2ZVN0YWdlcyhMdXQsIDIsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsIGNtc1NpZ0NMdXRFbGVtVHlwZSwgJlByZUxpbiwgJkNMVVQpKQorICAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUNoZWNrQW5kUmV0cmVpdmVTdGFnZXMoTHV0LCAyLCBjbXNTaWdDTHV0RWxlbVR5cGUsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsICZDTFVULCAmUG9zdExpbikpCisgICAgICAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUNoZWNrQW5kUmV0cmVpdmVTdGFnZXMoTHV0LCAxLCBjbXNTaWdDTHV0RWxlbVR5cGUsICZDTFVUKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgLy8gV2UgbmVlZCB0byBpbnRlcnBvbGF0ZSB3aGl0ZSBwb2ludHMgb2YgYm90aCwgcHJlIGFuZCBwb3N0IGN1cnZlcworICAgIGlmIChQcmVMaW4pIHsKKworICAgICAgICBjbXNUb25lQ3VydmUqKiBDdXJ2ZXMgPSBfY21zU3RhZ2VHZXRQdHJUb0N1cnZlU2V0KFByZUxpbik7CisKKyAgICAgICAgZm9yIChpPTA7IGkgPCBuSW5zOyBpKyspIHsKKyAgICAgICAgICAgIFdoaXRlSW5baV0gPSBjbXNFdmFsVG9uZUN1cnZlMTYoQ3VydmVzW2ldLCBXaGl0ZVBvaW50SW5baV0pOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmb3IgKGk9MDsgaSA8IG5JbnM7IGkrKykKKyAgICAgICAgICAgIFdoaXRlSW5baV0gPSBXaGl0ZVBvaW50SW5baV07CisgICAgfQorCisgICAgLy8gSWYgYW55IHBvc3QtbGluZWFyaXphdGlvbiwgd2UgbmVlZCB0byBmaW5kIGhvdyBpcyByZXByZXNlbnRlZCB3aGl0ZSBiZWZvcmUgdGhlIGN1cnZlLCBkbworICAgIC8vIGEgcmV2ZXJzZSBpbnRlcnBvbGF0aW9uIGluIHRoaXMgY2FzZS4KKyAgICBpZiAoUG9zdExpbikgeworCisgICAgICAgIGNtc1RvbmVDdXJ2ZSoqIEN1cnZlcyA9IF9jbXNTdGFnZUdldFB0clRvQ3VydmVTZXQoUG9zdExpbik7CisKKyAgICAgICAgZm9yIChpPTA7IGkgPCBuT3V0czsgaSsrKSB7CisKKyAgICAgICAgICAgIGNtc1RvbmVDdXJ2ZSogSW52ZXJzZVBvc3RMaW4gPSBjbXNSZXZlcnNlVG9uZUN1cnZlKEN1cnZlc1tpXSk7CisgICAgICAgICAgICBpZiAoSW52ZXJzZVBvc3RMaW4gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFdoaXRlT3V0W2ldID0gV2hpdGVQb2ludE91dFtpXTsgICAgCisKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICBXaGl0ZU91dFtpXSA9IGNtc0V2YWxUb25lQ3VydmUxNihJbnZlcnNlUG9zdExpbiwgV2hpdGVQb2ludE91dFtpXSk7CisgICAgICAgICAgICAgICAgY21zRnJlZVRvbmVDdXJ2ZShJbnZlcnNlUG9zdExpbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoaT0wOyBpIDwgbk91dHM7IGkrKykKKyAgICAgICAgICAgIFdoaXRlT3V0W2ldID0gV2hpdGVQb2ludE91dFtpXTsKKyAgICB9CisKKyAgICAvLyBPaywgcHJvY2VlZCB3aXRoIHBhdGNoaW5nLiBNYXkgZmFpbCBhbmQgd2UgZG9uJ3QgY2FyZSBpZiBpdCBmYWlscworICAgIFBhdGNoTFVUKENMVVQsIFdoaXRlSW4sIFdoaXRlT3V0LCBuT3V0cywgbklucyk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBzaW1wbGUgTFVUIGZyb20gY29tcGxleCBvbmVzLiBUaGUgZ2VuZXJhdGVkIExVVCBoYXMgYW4gb3B0aW9uYWwgc2V0IG9mCisvLyBwcmVsaW5lYXJpemF0aW9uIGN1cnZlcywgYSBDTFVUIG9mIG5HcmlkUG9pbnRzIGFuZCBvcHRpb25hbCBwb3N0bGluZWFyaXphdGlvbiB0YWJsZXMuCisvLyBUaGVzZSBjdXJ2ZXMgaGF2ZSB0byBleGlzdCBpbiB0aGUgb3JpZ2luYWwgTFVUIGluIG9yZGVyIHRvIGJlIHVzZWQgaW4gdGhlIHNpbXBsaWZpZWQgb3V0cHV0LgorLy8gQ2FsbGVyIG1heSBhbHNvIHVzZSB0aGUgZmxhZ3MgdG8gYWxsb3cgdGhpcyBmZWF0dXJlLgorLy8gTFVUUyB3aXRoIGFsbCBjdXJ2ZXMgd2lsbCBiZSBzaW1wbGlmaWVkIHRvIGEgc2luZ2xlIGN1cnZlLiBQYXJhbWV0cmljIGN1cnZlcyBhcmUgbG9zdC4KKy8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgb24gMTYtYml0cyBMVVRTIG9ubHksIGFzIGZsb2F0aW5nIHBvaW50IGxvc3NlcyBwcmVjaXNpb24gd2hlbiBzaW1wbGlmaWVkCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMKK2Ntc0Jvb2wgT3B0aW1pemVCeVJlc2FtcGxpbmcoY21zUGlwZWxpbmUqKiBMdXQsIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsIGNtc1VJbnQzMk51bWJlciogSW5wdXRGb3JtYXQsIGNtc1VJbnQzMk51bWJlciogT3V0cHV0Rm9ybWF0LCBjbXNVSW50MzJOdW1iZXIqIGR3RmxhZ3MpCit7CisgICAgY21zUGlwZWxpbmUqIFNyYyA9IE5VTEw7CisgICAgY21zUGlwZWxpbmUqIERlc3QgPSBOVUxMOworICAgIGNtc1N0YWdlKiBtcGU7CisgICAgY21zU3RhZ2UqIENMVVQ7CisgICAgY21zU3RhZ2UgKktlZXBQcmVMaW4gPSBOVUxMLCAqS2VlcFBvc3RMaW4gPSBOVUxMOworICAgIGludCBuR3JpZFBvaW50czsKKyAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2UsIE91dHB1dENvbG9yU3BhY2U7CisgICAgY21zU3RhZ2UgKk5ld1ByZUxpbiA9IE5VTEw7CisgICAgY21zU3RhZ2UgKk5ld1Bvc3RMaW4gPSBOVUxMOworICAgIF9jbXNTdGFnZUNMdXREYXRhKiBEYXRhQ0xVVDsKKyAgICBjbXNUb25lQ3VydmUqKiBEYXRhU2V0SW47CisgICAgY21zVG9uZUN1cnZlKiogRGF0YVNldE91dDsKKyAgICBQcmVsaW4xNkRhdGEqIHAxNjsKKworICAgIC8vIFRoaXMgaXMgYSBsb29zeSBvcHRpbWl6YXRpb24hIGRvZXMgbm90IGFwcGx5IGluIGZsb2F0aW5nLXBvaW50IGNhc2VzCisgICAgaWYgKF9jbXNGb3JtYXR0ZXJJc0Zsb2F0KCpJbnB1dEZvcm1hdCkgfHwgX2Ntc0Zvcm1hdHRlcklzRmxvYXQoKk91dHB1dEZvcm1hdCkpIHJldHVybiBGQUxTRTsKKworICAgIENvbG9yU3BhY2UgICAgICAgPSBfY21zSUNDY29sb3JTcGFjZShUX0NPTE9SU1BBQ0UoKklucHV0Rm9ybWF0KSk7CisgICAgT3V0cHV0Q29sb3JTcGFjZSA9IF9jbXNJQ0Njb2xvclNwYWNlKFRfQ09MT1JTUEFDRSgqT3V0cHV0Rm9ybWF0KSk7CisgICAgbkdyaWRQb2ludHMgICAgICA9IF9jbXNSZWFzb25hYmxlR3JpZHBvaW50c0J5Q29sb3JzcGFjZShDb2xvclNwYWNlLCAqZHdGbGFncyk7CisKKyAgICAvLyBGb3IgZW1wdHkgTFVUcywgMiBwb2ludHMgYXJlIGVub3VnaAorICAgIGlmIChjbXNQaXBlbGluZVN0YWdlQ291bnQoKkx1dCkgPT0gMCkKKyAgICAgICAgbkdyaWRQb2ludHMgPSAyOworCisgICAgU3JjID0gKkx1dDsKKworICAgIC8vIE5hbWVkIGNvbG9yIHBpcGVsaW5lcyBjYW5ub3QgYmUgb3B0aW1pemVkIGVpdGhlcgorICAgIGZvciAobXBlID0gY21zUGlwZWxpbmVHZXRQdHJUb0ZpcnN0U3RhZ2UoU3JjKTsKKyAgICAgICAgbXBlICE9IE5VTEw7CisgICAgICAgIG1wZSA9IGNtc1N0YWdlTmV4dChtcGUpKSB7CisgICAgICAgICAgICBpZiAoY21zU3RhZ2VUeXBlKG1wZSkgPT0gY21zU2lnTmFtZWRDb2xvckVsZW1UeXBlKSByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLy8gQWxsb2NhdGUgYW4gZW1wdHkgTFVUCisgICAgRGVzdCA9ICBjbXNQaXBlbGluZUFsbG9jKFNyYyAtPkNvbnRleHRJRCwgU3JjIC0+SW5wdXRDaGFubmVscywgU3JjIC0+T3V0cHV0Q2hhbm5lbHMpOworICAgIGlmICghRGVzdCkgcmV0dXJuIEZBTFNFOworCisgICAgLy8gUHJlbGluZWFyaXphdGlvbiB0YWJsZXMgYXJlIGtlcHQgdW5sZXNzIGluZGljYXRlZCBieSBmbGFncworICAgIGlmICgqZHdGbGFncyAmIGNtc0ZMQUdTX0NMVVRfUFJFX0xJTkVBUklaQVRJT04pIHsKKworICAgICAgICAvLyBHZXQgYSBwb2ludGVyIHRvIHRoZSBwcmVsaW5lYXJpemF0aW9uIGVsZW1lbnQKKyAgICAgICAgY21zU3RhZ2UqIFByZUxpbiA9IGNtc1BpcGVsaW5lR2V0UHRyVG9GaXJzdFN0YWdlKFNyYyk7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgc3VpdGFibGUKKyAgICAgICAgaWYgKFByZUxpbiAmJiBQcmVMaW4gLT5UeXBlID09IGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUpIHsKKworICAgICAgICAgICAgLy8gTWF5YmUgdGhpcyBpcyBhIGxpbmVhciB0cmFtLCBzbyB3ZSBjYW4gYXZvaWQgdGhlIHdob2xlIHN0dWZmCisgICAgICAgICAgICBpZiAoIUFsbEN1cnZlc0FyZUxpbmVhcihQcmVMaW4pKSB7CisKKyAgICAgICAgICAgICAgICAvLyBBbGwgc2VlbXMgb2ssIHByb2NlZWQuCisgICAgICAgICAgICAgICAgTmV3UHJlTGluID0gY21zU3RhZ2VEdXAoUHJlTGluKTsKKyAgICAgICAgICAgICAgICBpZighY21zUGlwZWxpbmVJbnNlcnRTdGFnZShEZXN0LCBjbXNBVF9CRUdJTiwgTmV3UHJlTGluKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKKworICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBwcmVsaW5lYXJpemF0aW9uLiBTaW5jZSB3ZSBoYXZlIGR1cGxpY2F0ZWQgdGhlIGN1cnZlCisgICAgICAgICAgICAgICAgLy8gaW4gZGVzdGluYXRpb24gTFVULCB0aGUgc2FtcGxpbmcgc2hvdWQgYmUgYXBwbGllZCBhZnRlciB0aGlzIHN0YWdlLgorICAgICAgICAgICAgICAgIGNtc1BpcGVsaW5lVW5saW5rU3RhZ2UoU3JjLCBjbXNBVF9CRUdJTiwgJktlZXBQcmVMaW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gQWxsb2NhdGUgdGhlIENMVVQKKyAgICBDTFVUID0gY21zU3RhZ2VBbGxvY0NMdXQxNmJpdChTcmMgLT5Db250ZXh0SUQsIG5HcmlkUG9pbnRzLCBTcmMgLT5JbnB1dENoYW5uZWxzLCBTcmMtPk91dHB1dENoYW5uZWxzLCBOVUxMKTsKKyAgICBpZiAoQ0xVVCA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgLy8gQWRkIHRoZSBDTFVUIHRvIHRoZSBkZXN0aW5hdGlvbiBMVVQKKyAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoRGVzdCwgY21zQVRfRU5ELCBDTFVUKSkgeworICAgICAgICBnb3RvIEVycm9yOworICAgIH0KKworICAgIC8vIFBvc3RsaW5lYXJpemF0aW9uIHRhYmxlcyBhcmUga2VwdCB1bmxlc3MgaW5kaWNhdGVkIGJ5IGZsYWdzCisgICAgaWYgKCpkd0ZsYWdzICYgY21zRkxBR1NfQ0xVVF9QT1NUX0xJTkVBUklaQVRJT04pIHsKKworICAgICAgICAvLyBHZXQgYSBwb2ludGVyIHRvIHRoZSBwb3N0bGluZWFyaXphdGlvbiBpZiBwcmVzZW50CisgICAgICAgIGNtc1N0YWdlKiBQb3N0TGluID0gY21zUGlwZWxpbmVHZXRQdHJUb0xhc3RTdGFnZShTcmMpOworCisgICAgICAgIC8vIENoZWNrIGlmIHN1aXRhYmxlCisgICAgICAgIGlmIChQb3N0TGluICYmIGNtc1N0YWdlVHlwZShQb3N0TGluKSA9PSBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlKSB7CisKKyAgICAgICAgICAgIC8vIE1heWJlIHRoaXMgaXMgYSBsaW5lYXIgdHJhbSwgc28gd2UgY2FuIGF2b2lkIHRoZSB3aG9sZSBzdHVmZgorICAgICAgICAgICAgaWYgKCFBbGxDdXJ2ZXNBcmVMaW5lYXIoUG9zdExpbikpIHsKKworICAgICAgICAgICAgICAgIC8vIEFsbCBzZWVtcyBvaywgcHJvY2VlZC4KKyAgICAgICAgICAgICAgICBOZXdQb3N0TGluID0gY21zU3RhZ2VEdXAoUG9zdExpbik7CisgICAgICAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKERlc3QsIGNtc0FUX0VORCwgTmV3UG9zdExpbikpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CisKKyAgICAgICAgICAgICAgICAvLyBJbiBkZXN0aW5hdGlvbiBMVVQsIHRoZSBzYW1wbGluZyBzaG91ZCBiZSBhcHBsaWVkIGFmdGVyIHRoaXMgc3RhZ2UuCisgICAgICAgICAgICAgICAgY21zUGlwZWxpbmVVbmxpbmtTdGFnZShTcmMsIGNtc0FUX0VORCwgJktlZXBQb3N0TGluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5vdyBpdHMgdGltZSB0byBkbyB0aGUgc2FtcGxpbmcuIFdlIGhhdmUgdG8gaWdub3JlIHByZS9wb3N0IGxpbmVhcml6YXRpb24KKyAgICAvLyBUaGUgc291cmNlIExVVCB3aGl0aG91dCBwcmUvcG9zdCBjdXJ2ZXMgaXMgcGFzc2VkIGFzIHBhcmFtZXRlci4KKyAgICBpZiAoIWNtc1N0YWdlU2FtcGxlQ0x1dDE2Yml0KENMVVQsIFhGb3JtU2FtcGxlcjE2LCAodm9pZCopIFNyYywgMCkpIHsKK0Vycm9yOgorICAgICAgICAvLyBPcHMsIHNvbWV0aGluZyB3ZW50IHdyb25nLCBSZXN0b3JlIHN0YWdlcworICAgICAgICBpZiAoS2VlcFByZUxpbiAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoU3JjLCBjbXNBVF9CRUdJTiwgS2VlcFByZUxpbikpIHsKKyAgICAgICAgICAgICAgICBfY21zQXNzZXJ0KDApOyAvLyBUaGlzIG5ldmVyIGhhcHBlbnMKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoS2VlcFBvc3RMaW4gIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKFNyYywgY21zQVRfRU5ELCAgIEtlZXBQb3N0TGluKSkgeworICAgICAgICAgICAgICAgIF9jbXNBc3NlcnQoMCk7IC8vIFRoaXMgbmV2ZXIgaGFwcGVucworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNtc1BpcGVsaW5lRnJlZShEZXN0KTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8vIERvbmUuCisKKyAgICBpZiAoS2VlcFByZUxpbiAhPSBOVUxMKSBjbXNTdGFnZUZyZWUoS2VlcFByZUxpbik7CisgICAgaWYgKEtlZXBQb3N0TGluICE9IE5VTEwpIGNtc1N0YWdlRnJlZShLZWVwUG9zdExpbik7CisgICAgY21zUGlwZWxpbmVGcmVlKFNyYyk7CisKKyAgICBEYXRhQ0xVVCA9IChfY21zU3RhZ2VDTHV0RGF0YSopIENMVVQgLT5EYXRhOworCisgICAgaWYgKE5ld1ByZUxpbiA9PSBOVUxMKSBEYXRhU2V0SW4gPSBOVUxMOworICAgIGVsc2UgRGF0YVNldEluID0gKChfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSopIE5ld1ByZUxpbiAtPkRhdGEpIC0+VGhlQ3VydmVzOworCisgICAgaWYgKE5ld1Bvc3RMaW4gPT0gTlVMTCkgRGF0YVNldE91dCA9IE5VTEw7CisgICAgZWxzZSAgRGF0YVNldE91dCA9ICgoX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqKSBOZXdQb3N0TGluIC0+RGF0YSkgLT5UaGVDdXJ2ZXM7CisKKworICAgIGlmIChEYXRhU2V0SW4gPT0gTlVMTCAmJiBEYXRhU2V0T3V0ID09IE5VTEwpIHsKKworICAgICAgICBfY21zUGlwZWxpbmVTZXRPcHRpbWl6YXRpb25QYXJhbWV0ZXJzKERlc3QsIChfY21zT1BUZXZhbDE2Rm4pIERhdGFDTFVULT5QYXJhbXMtPkludGVycG9sYXRpb24uTGVycDE2LCBEYXRhQ0xVVC0+UGFyYW1zLCBOVUxMLCBOVUxMKTsKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgcDE2ID0gUHJlbGluT3B0MTZhbGxvYyhEZXN0IC0+Q29udGV4dElELAorICAgICAgICAgICAgRGF0YUNMVVQgLT5QYXJhbXMsCisgICAgICAgICAgICBEZXN0IC0+SW5wdXRDaGFubmVscywKKyAgICAgICAgICAgIERhdGFTZXRJbiwKKyAgICAgICAgICAgIERlc3QgLT5PdXRwdXRDaGFubmVscywKKyAgICAgICAgICAgIERhdGFTZXRPdXQpOworCisgICAgICAgIF9jbXNQaXBlbGluZVNldE9wdGltaXphdGlvblBhcmFtZXRlcnMoRGVzdCwgUHJlbGluRXZhbDE2LCAodm9pZCopIHAxNiwgUHJlbGluT3B0MTZmcmVlLCBQcmVsaW4xNmR1cCk7CisgICAgfQorCisKKyAgICAvLyBEb24ndCBmaXggd2hpdGUgb24gYWJzb2x1dGUgY29sb3JpbWV0cmljCisgICAgaWYgKEludGVudCA9PSBJTlRFTlRfQUJTT0xVVEVfQ09MT1JJTUVUUklDKQorICAgICAgICAqZHdGbGFncyB8PSBjbXNGTEFHU19OT1dISVRFT05XSElURUZJWFVQOworCisgICAgaWYgKCEoKmR3RmxhZ3MgJiBjbXNGTEFHU19OT1dISVRFT05XSElURUZJWFVQKSkgeworCisgICAgICAgIEZpeFdoaXRlTWlzYWxpZ25tZW50KERlc3QsIENvbG9yU3BhY2UsIE91dHB1dENvbG9yU3BhY2UpOworICAgIH0KKworICAgICpMdXQgPSBEZXN0OworICAgIHJldHVybiBUUlVFOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihJbnRlbnQpOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGaXhlcyB0aGUgZ2FtbWEgYmFsYW5jaW5nIG9mIHRyYW5zZm9ybS4gVGhpcyBpcyBkZXNjcmliZWQgaW4gbXkgcGFwZXIgIlByZWxpbmVhcml6YXRpb24gU3RhZ2VzIG9uCisvLyBDb2xvci1NYW5hZ2VtZW50IEFwcGxpY2F0aW9uLVNwZWNpZmljIEludGVncmF0ZWQgQ2lyY3VpdHMgKEFTSUNzKSIgcHJlc2VudGVkIGF0IE5JUDI0LiBJdCBvbmx5IHdvcmtzCisvLyBmb3IgUkdCIHRyYW5zZm9ybXMuIFNlZSB0aGUgcGFwZXIgZm9yIG1vcmUgZGV0YWlscworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisvLyBOb3JtYWxpemUgZW5kcG9pbnRzIGJ5IHNsb3BlIGxpbWl0aW5nIG1heCBhbmQgbWluLiBUaGlzIGFzc3VyZXMgZW5kcG9pbnRzIGFzIHdlbGwuCisvLyBEZXNjZW5kaW5nIGN1cnZlcyBhcmUgaGFuZGxlZCBhcyB3ZWxsLgorc3RhdGljCit2b2lkIFNsb3BlTGltaXRpbmcoY21zVG9uZUN1cnZlKiBnKQoreworICAgIGludCBCZWdpblZhbCwgRW5kVmFsOworICAgIGludCBBdEJlZ2luID0gKGludCkgZmxvb3IoKGNtc0Zsb2F0NjROdW1iZXIpIGcgLT5uRW50cmllcyAqIDAuMDIgKyAwLjUpOyAgIC8vIEN1dG9mZiBhdCAyJQorICAgIGludCBBdEVuZCAgID0gZyAtPm5FbnRyaWVzIC0gQXRCZWdpbiAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuZCA5OCUKKyAgICBjbXNGbG9hdDY0TnVtYmVyIFZhbCwgU2xvcGUsIGJldGE7CisgICAgaW50IGk7CisKKyAgICBpZiAoY21zSXNUb25lQ3VydmVEZXNjZW5kaW5nKGcpKSB7CisgICAgICAgIEJlZ2luVmFsID0gMHhmZmZmOyBFbmRWYWwgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgQmVnaW5WYWwgPSAwOyBFbmRWYWwgPSAweGZmZmY7CisgICAgfQorCisgICAgLy8gQ29tcHV0ZSBzbG9wZSBhbmQgb2Zmc2V0IGZvciBiZWdpbiBvZiBjdXJ2ZQorICAgIFZhbCAgID0gZyAtPlRhYmxlMTZbQXRCZWdpbl07CisgICAgU2xvcGUgPSAoVmFsIC0gQmVnaW5WYWwpIC8gQXRCZWdpbjsKKyAgICBiZXRhICA9IFZhbCAtIFNsb3BlICogQXRCZWdpbjsKKworICAgIGZvciAoaT0wOyBpIDwgQXRCZWdpbjsgaSsrKQorICAgICAgICBnIC0+VGFibGUxNltpXSA9IF9jbXNRdWlja1NhdHVyYXRlV29yZChpICogU2xvcGUgKyBiZXRhKTsKKworICAgIC8vIENvbXB1dGUgc2xvcGUgYW5kIG9mZnNldCBmb3IgdGhlIGVuZAorICAgIFZhbCAgID0gZyAtPlRhYmxlMTZbQXRFbmRdOworICAgIFNsb3BlID0gKEVuZFZhbCAtIFZhbCkgLyBBdEJlZ2luOyAgIC8vIEF0QmVnaW4gaG9sZHMgdGhlIFggaW50ZXJ2YWwsIHdoaWNoIGlzIHNhbWUgaW4gYm90aCBjYXNlcworICAgIGJldGEgID0gVmFsIC0gU2xvcGUgKiBBdEVuZDsKKworICAgIGZvciAoaSA9IEF0RW5kOyBpIDwgKGludCkgZyAtPm5FbnRyaWVzOyBpKyspCisgICAgICAgIGcgLT5UYWJsZTE2W2ldID0gX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKGkgKiBTbG9wZSArIGJldGEpOworfQorCisKKy8vIFByZWNvbXB1dGVzIHRhYmxlcyBmb3IgOC1iaXQgb24gaW5wdXQgZGV2aWNlbGluay4KK3N0YXRpYworUHJlbGluOERhdGEqIFByZWxpbk9wdDhhbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBwLCBjbXNUb25lQ3VydmUqIEdbM10pCit7CisgICAgaW50IGk7CisgICAgY21zVUludDE2TnVtYmVyIElucHV0WzNdOworICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgdjEsIHYyLCB2MzsKKyAgICBQcmVsaW44RGF0YSogcDg7CisKKyAgICBwOCA9IChQcmVsaW44RGF0YSopX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBzaXplb2YoUHJlbGluOERhdGEpKTsKKyAgICBpZiAocDggPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICAvLyBTaW5jZSB0aGlzIG9ubHkgd29ya3MgZm9yIDggYml0IGlucHV0LCB2YWx1ZXMgY29tZXMgYWx3YXlzIGFzIHggKiAyNTcsCisgICAgLy8gd2UgY2FuIHNhZmVseSB0YWtlIG1zYiBieXRlICh4IDw8IDggKyB4KQorCisgICAgZm9yIChpPTA7IGkgPCAyNTY7IGkrKykgeworCisgICAgICAgIGlmIChHICE9IE5VTEwpIHsKKworICAgICAgICAgICAgLy8gR2V0IDE2LWJpdCByZXByZXNlbnRhdGlvbgorICAgICAgICAgICAgSW5wdXRbMF0gPSBjbXNFdmFsVG9uZUN1cnZlMTYoR1swXSwgRlJPTV84X1RPXzE2KGkpKTsKKyAgICAgICAgICAgIElucHV0WzFdID0gY21zRXZhbFRvbmVDdXJ2ZTE2KEdbMV0sIEZST01fOF9UT18xNihpKSk7CisgICAgICAgICAgICBJbnB1dFsyXSA9IGNtc0V2YWxUb25lQ3VydmUxNihHWzJdLCBGUk9NXzhfVE9fMTYoaSkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgSW5wdXRbMF0gPSBGUk9NXzhfVE9fMTYoaSk7CisgICAgICAgICAgICBJbnB1dFsxXSA9IEZST01fOF9UT18xNihpKTsKKyAgICAgICAgICAgIElucHV0WzJdID0gRlJPTV84X1RPXzE2KGkpOworICAgICAgICB9CisKKworICAgICAgICAvLyBNb3ZlIHRvIDAuLjEuMCBpbiBmaXhlZCBkb21haW4KKyAgICAgICAgdjEgPSBfY21zVG9GaXhlZERvbWFpbihJbnB1dFswXSAqIHAgLT4gRG9tYWluWzBdKTsKKyAgICAgICAgdjIgPSBfY21zVG9GaXhlZERvbWFpbihJbnB1dFsxXSAqIHAgLT4gRG9tYWluWzFdKTsKKyAgICAgICAgdjMgPSBfY21zVG9GaXhlZERvbWFpbihJbnB1dFsyXSAqIHAgLT4gRG9tYWluWzJdKTsKKworICAgICAgICAvLyBTdG9yZSB0aGUgcHJlY2FsY3VsYXRlZCB0YWJsZSBvZiBub2RlcworICAgICAgICBwOCAtPlgwW2ldID0gKHAtPm9wdGFbMl0gKiBGSVhFRF9UT19JTlQodjEpKTsKKyAgICAgICAgcDggLT5ZMFtpXSA9IChwLT5vcHRhWzFdICogRklYRURfVE9fSU5UKHYyKSk7CisgICAgICAgIHA4IC0+WjBbaV0gPSAocC0+b3B0YVswXSAqIEZJWEVEX1RPX0lOVCh2MykpOworCisgICAgICAgIC8vIFN0b3JlIHRoZSBwcmVjYWxjdWxhdGVkIHRhYmxlIG9mIG9mZnNldHMKKyAgICAgICAgcDggLT5yeFtpXSA9IChjbXNVSW50MTZOdW1iZXIpIEZJWEVEX1JFU1RfVE9fSU5UKHYxKTsKKyAgICAgICAgcDggLT5yeVtpXSA9IChjbXNVSW50MTZOdW1iZXIpIEZJWEVEX1JFU1RfVE9fSU5UKHYyKTsKKyAgICAgICAgcDggLT5yeltpXSA9IChjbXNVSW50MTZOdW1iZXIpIEZJWEVEX1JFU1RfVE9fSU5UKHYzKTsKKyAgICB9CisKKyAgICBwOCAtPkNvbnRleHRJRCA9IENvbnRleHRJRDsKKyAgICBwOCAtPnAgPSBwOworCisgICAgcmV0dXJuIHA4OworfQorCitzdGF0aWMKK3ZvaWQgUHJlbGluOGZyZWUoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIHB0cikKK3sKKyAgICBfY21zRnJlZShDb250ZXh0SUQsIHB0cik7Cit9CisKK3N0YXRpYwordm9pZCogUHJlbGluOGR1cChjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3Qgdm9pZCogcHRyKQoreworICAgIHJldHVybiBfY21zRHVwTWVtKENvbnRleHRJRCwgcHRyLCBzaXplb2YoUHJlbGluOERhdGEpKTsKK30KKworCisKKy8vIEEgb3B0aW1pemVkIGludGVycG9sYXRpb24gZm9yIDgtYml0IGlucHV0LgorI2RlZmluZSBERU5TKGksaixrKSAoTHV0VGFibGVbKGkpKyhqKSsoaykrT3V0Q2hhbl0pCitzdGF0aWMKK3ZvaWQgUHJlbGluRXZhbDgocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIElucHV0W10sCisgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgT3V0cHV0W10sCisgICAgICAgICAgICAgICAgICByZWdpc3RlciBjb25zdCB2b2lkKiBEKQoreworCisgICAgY21zVUludDhOdW1iZXIgICAgICAgICByLCBnLCBiOworICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgICAgcngsIHJ5LCByejsKKyAgICBjbXNTMTVGaXhlZDE2TnVtYmVyICAgIGMwLCBjMSwgYzIsIGMzLCBSZXN0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgT3V0Q2hhbjsKKyAgICByZWdpc3RlciBjbXNTMTVGaXhlZDE2TnVtYmVyICAgIFgwLCBYMSwgWTAsIFkxLCBaMCwgWjE7CisgICAgUHJlbGluOERhdGEqIHA4ID0gKFByZWxpbjhEYXRhKikgRDsKKyAgICByZWdpc3RlciBjb25zdCBjbXNJbnRlcnBQYXJhbXMqIHAgPSBwOCAtPnA7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICBUb3RhbE91dCA9IHAgLT4gbk91dHB1dHM7CisgICAgY29uc3QgY21zVUludDE2TnVtYmVyKiBMdXRUYWJsZSA9IChjb25zdCBjbXNVSW50MTZOdW1iZXIqKSBwLT5UYWJsZTsKKworICAgIHIgPSBJbnB1dFswXSA+PiA4OworICAgIGcgPSBJbnB1dFsxXSA+PiA4OworICAgIGIgPSBJbnB1dFsyXSA+PiA4OworCisgICAgWDAgPSBYMSA9IHA4LT5YMFtyXTsKKyAgICBZMCA9IFkxID0gcDgtPlkwW2ddOworICAgIFowID0gWjEgPSBwOC0+WjBbYl07CisKKyAgICByeCA9IHA4IC0+cnhbcl07CisgICAgcnkgPSBwOCAtPnJ5W2ddOworICAgIHJ6ID0gcDggLT5yeltiXTsKKworICAgIFgxID0gWDAgKyAoKHJ4ID09IDApID8gMCA6IHAgLT5vcHRhWzJdKTsKKyAgICBZMSA9IFkwICsgKChyeSA9PSAwKSA/IDAgOiBwIC0+b3B0YVsxXSk7CisgICAgWjEgPSBaMCArICgocnogPT0gMCkgPyAwIDogcCAtPm9wdGFbMF0pOworCisKKyAgICAvLyBUaGVzZSBhcmUgdGhlIDYgVGV0cmFoZWRyYWwKKyAgICBmb3IgKE91dENoYW49MDsgT3V0Q2hhbiA8IFRvdGFsT3V0OyBPdXRDaGFuKyspIHsKKworICAgICAgICBjMCA9IERFTlMoWDAsIFkwLCBaMCk7CisKKyAgICAgICAgaWYgKHJ4ID49IHJ5ICYmIHJ5ID49IHJ6KQorICAgICAgICB7CisgICAgICAgICAgICBjMSA9IERFTlMoWDEsIFkwLCBaMCkgLSBjMDsKKyAgICAgICAgICAgIGMyID0gREVOUyhYMSwgWTEsIFowKSAtIERFTlMoWDEsIFkwLCBaMCk7CisgICAgICAgICAgICBjMyA9IERFTlMoWDEsIFkxLCBaMSkgLSBERU5TKFgxLCBZMSwgWjApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlmIChyeCA+PSByeiAmJiByeiA+PSByeSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjMSA9IERFTlMoWDEsIFkwLCBaMCkgLSBjMDsKKyAgICAgICAgICAgICAgICBjMiA9IERFTlMoWDEsIFkxLCBaMSkgLSBERU5TKFgxLCBZMCwgWjEpOworICAgICAgICAgICAgICAgIGMzID0gREVOUyhYMSwgWTAsIFoxKSAtIERFTlMoWDEsIFkwLCBaMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaWYgKHJ6ID49IHJ4ICYmIHJ4ID49IHJ5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMCwgWjEpIC0gREVOUyhYMCwgWTAsIFoxKTsKKyAgICAgICAgICAgICAgICAgICAgYzIgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMSwgWTAsIFoxKTsKKyAgICAgICAgICAgICAgICAgICAgYzMgPSBERU5TKFgwLCBZMCwgWjEpIC0gYzA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJ5ID49IHJ4ICYmIHJ4ID49IHJ6KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjMSA9IERFTlMoWDEsIFkxLCBaMCkgLSBERU5TKFgwLCBZMSwgWjApOworICAgICAgICAgICAgICAgICAgICAgICAgYzIgPSBERU5TKFgwLCBZMSwgWjApIC0gYzA7CisgICAgICAgICAgICAgICAgICAgICAgICBjMyA9IERFTlMoWDEsIFkxLCBaMSkgLSBERU5TKFgxLCBZMSwgWjApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyeSA+PSByeiAmJiByeiA+PSByeCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMSA9IERFTlMoWDEsIFkxLCBaMSkgLSBERU5TKFgwLCBZMSwgWjEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMyID0gREVOUyhYMCwgWTEsIFowKSAtIGMwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMzID0gREVOUyhYMCwgWTEsIFoxKSAtIERFTlMoWDAsIFkxLCBaMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ6ID49IHJ5ICYmIHJ5ID49IHJ4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMCwgWTEsIFoxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzIgPSBERU5TKFgwLCBZMSwgWjEpIC0gREVOUyhYMCwgWTAsIFoxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzMgPSBERU5TKFgwLCBZMCwgWjEpIC0gYzA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzEgPSBjMiA9IGMzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3QgPSBjMSAqIHJ4ICsgYzIgKiByeSArIGMzICogcnogKyAweDgwMDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0W091dENoYW5dID0gKGNtc1VJbnQxNk51bWJlciljMCArICgoUmVzdCArIChSZXN0Pj4xNikpPj4xNik7CisKKyAgICB9Cit9CisKKyN1bmRlZiBERU5TCisKKworLy8gQ3VydmVzIHRoYXQgY29udGFpbiB3aWRlIGVtcHR5IGFyZWFzIGFyZSBub3Qgb3B0aW1pemVhYmxlCitzdGF0aWMKK2Ntc0Jvb2wgSXNEZWdlbmVyYXRlZChjb25zdCBjbXNUb25lQ3VydmUqIGcpCit7CisgICAgaW50IGksIFplcm9zID0gMCwgUG9sZXMgPSAwOworICAgIGludCBuRW50cmllcyA9IGcgLT5uRW50cmllczsKKworICAgIGZvciAoaT0wOyBpIDwgbkVudHJpZXM7IGkrKykgeworCisgICAgICAgIGlmIChnIC0+VGFibGUxNltpXSA9PSAweDAwMDApIFplcm9zKys7CisgICAgICAgIGlmIChnIC0+VGFibGUxNltpXSA9PSAweGZmZmYpIFBvbGVzKys7CisgICAgfQorCisgICAgaWYgKFplcm9zID09IDEgJiYgUG9sZXMgPT0gMSkgcmV0dXJuIEZBTFNFOyAgLy8gRm9yIGxpbmVhciB0YWJsZXMKKyAgICBpZiAoWmVyb3MgPiAobkVudHJpZXMgLyAyMCkpIHJldHVybiBUUlVFOyAgLy8gRGVnZW5lcmF0ZWQsIG1hbnkgemVyb3MKKyAgICBpZiAoUG9sZXMgPiAobkVudHJpZXMgLyAyMCkpIHJldHVybiBUUlVFOyAgLy8gRGVnZW5lcmF0ZWQsIG1hbnkgcG9sZXMKKworICAgIHJldHVybiBGQUxTRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdlIG5lZWQgeHB1dCBvdmVyIGhlcmUKKworc3RhdGljCitjbXNCb29sIE9wdGltaXplQnlDb21wdXRpbmdMaW5lYXJpemF0aW9uKGNtc1BpcGVsaW5lKiogTHV0LCBjbXNVSW50MzJOdW1iZXIgSW50ZW50LCBjbXNVSW50MzJOdW1iZXIqIElucHV0Rm9ybWF0LCBjbXNVSW50MzJOdW1iZXIqIE91dHB1dEZvcm1hdCwgY21zVUludDMyTnVtYmVyKiBkd0ZsYWdzKQoreworICAgIGNtc1BpcGVsaW5lKiBPcmlnaW5hbEx1dDsKKyAgICBpbnQgbkdyaWRQb2ludHM7CisgICAgY21zVG9uZUN1cnZlICpUcmFuc1tjbXNNQVhDSEFOTkVMU10sICpUcmFuc1JldmVyc2VbY21zTUFYQ0hBTk5FTFNdOworICAgIGNtc1VJbnQzMk51bWJlciB0LCBpOworICAgIGNtc0Zsb2F0MzJOdW1iZXIgdiwgSW5bY21zTUFYQ0hBTk5FTFNdLCBPdXRbY21zTUFYQ0hBTk5FTFNdOworICAgIGNtc0Jvb2wgbElzU3VpdGFibGUsIGxJc0xpbmVhcjsKKyAgICBjbXNQaXBlbGluZSogT3B0aW1pemVkTFVUID0gTlVMTCwgKkx1dFBsdXNDdXJ2ZXMgPSBOVUxMOworICAgIGNtc1N0YWdlKiBPcHRpbWl6ZWRDTFVUbXBlOworICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgQ29sb3JTcGFjZSwgT3V0cHV0Q29sb3JTcGFjZTsKKyAgICBjbXNTdGFnZSogT3B0aW1pemVkUHJlbGluTXBlOworICAgIGNtc1N0YWdlKiBtcGU7CisgICAgY21zVG9uZUN1cnZlKiogT3B0aW1pemVkUHJlbGluQ3VydmVzOworICAgIF9jbXNTdGFnZUNMdXREYXRhKiBPcHRpbWl6ZWRQcmVsaW5DTFVUOworCisKKyAgICAvLyBUaGlzIGlzIGEgbG9vc3kgb3B0aW1pemF0aW9uISBkb2VzIG5vdCBhcHBseSBpbiBmbG9hdGluZy1wb2ludCBjYXNlcworICAgIGlmIChfY21zRm9ybWF0dGVySXNGbG9hdCgqSW5wdXRGb3JtYXQpIHx8IF9jbXNGb3JtYXR0ZXJJc0Zsb2F0KCpPdXRwdXRGb3JtYXQpKSByZXR1cm4gRkFMU0U7CisKKyAgICAvLyBPbmx5IG9uIGNodW5reSBSR0IKKyAgICBpZiAoVF9DT0xPUlNQQUNFKCpJbnB1dEZvcm1hdCkgICE9IFBUX1JHQikgcmV0dXJuIEZBTFNFOworICAgIGlmIChUX1BMQU5BUigqSW5wdXRGb3JtYXQpKSByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoVF9DT0xPUlNQQUNFKCpPdXRwdXRGb3JtYXQpICE9IFBUX1JHQikgcmV0dXJuIEZBTFNFOworICAgIGlmIChUX1BMQU5BUigqT3V0cHV0Rm9ybWF0KSkgcmV0dXJuIEZBTFNFOworCisgICAgLy8gT24gMTYgYml0cywgdXNlciBoYXMgdG8gc3BlY2lmeSB0aGUgZmVhdHVyZQorICAgIGlmICghX2Ntc0Zvcm1hdHRlcklzOGJpdCgqSW5wdXRGb3JtYXQpKSB7CisgICAgICAgIGlmICghKCpkd0ZsYWdzICYgY21zRkxBR1NfQ0xVVF9QUkVfTElORUFSSVpBVElPTikpIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBPcmlnaW5hbEx1dCA9ICpMdXQ7CisKKyAgIC8vIE5hbWVkIGNvbG9yIHBpcGVsaW5lcyBjYW5ub3QgYmUgb3B0aW1pemVkIGVpdGhlcgorICAgZm9yIChtcGUgPSBjbXNQaXBlbGluZUdldFB0clRvRmlyc3RTdGFnZShPcmlnaW5hbEx1dCk7CisgICAgICAgICBtcGUgIT0gTlVMTDsKKyAgICAgICAgIG1wZSA9IGNtc1N0YWdlTmV4dChtcGUpKSB7CisgICAgICAgICAgICBpZiAoY21zU3RhZ2VUeXBlKG1wZSkgPT0gY21zU2lnTmFtZWRDb2xvckVsZW1UeXBlKSByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgQ29sb3JTcGFjZSAgICAgICA9IF9jbXNJQ0Njb2xvclNwYWNlKFRfQ09MT1JTUEFDRSgqSW5wdXRGb3JtYXQpKTsKKyAgICBPdXRwdXRDb2xvclNwYWNlID0gX2Ntc0lDQ2NvbG9yU3BhY2UoVF9DT0xPUlNQQUNFKCpPdXRwdXRGb3JtYXQpKTsKKyAgICBuR3JpZFBvaW50cyAgICAgID0gX2Ntc1JlYXNvbmFibGVHcmlkcG9pbnRzQnlDb2xvcnNwYWNlKENvbG9yU3BhY2UsICpkd0ZsYWdzKTsKKworICAgIC8vIEVtcHR5IGdhbW1hIGNvbnRhaW5lcnMKKyAgICBtZW1zZXQoVHJhbnMsIDAsIHNpemVvZihUcmFucykpOworICAgIG1lbXNldChUcmFuc1JldmVyc2UsIDAsIHNpemVvZihUcmFuc1JldmVyc2UpKTsKKworICAgIC8vIElmIHRoZSBsYXN0IHN0YWdlIG9mIHRoZSBvcmlnaW5hbCBsdXQgYXJlIGN1cnZlcywgYW5kIHRob3NlIGN1cnZlcyBhcmUKKyAgICAvLyBkZWdlbmVyYXRlZCwgaXQgaXMgbGlrZWx5IHRoZSB0cmFuc2Zvcm0gaXMgc3F1ZWV6aW5nIGFuZCBjbGlwcGluZworICAgIC8vIHRoZSBvdXRwdXQgZnJvbSBwcmV2aW91cyBDTFVULiBXZSBjYW5ub3Qgb3B0aW1pemUgdGhpcyBjYXNlICAgICAKKyAgICB7CisgICAgICAgIGNtc1N0YWdlKiBsYXN0ID0gY21zUGlwZWxpbmVHZXRQdHJUb0xhc3RTdGFnZShPcmlnaW5hbEx1dCk7CisKKyAgICAgICAgaWYgKGNtc1N0YWdlVHlwZShsYXN0KSA9PSBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlKSB7CisKKyAgICAgICAgICAgIF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKiBEYXRhID0gKF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKiljbXNTdGFnZURhdGEobGFzdCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRGF0YS0+bkN1cnZlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKElzRGVnZW5lcmF0ZWQoRGF0YS0+VGhlQ3VydmVzW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAodCA9IDA7IHQgPCBPcmlnaW5hbEx1dCAtPklucHV0Q2hhbm5lbHM7IHQrKykgeworICAgICAgICBUcmFuc1t0XSA9IGNtc0J1aWxkVGFidWxhdGVkVG9uZUN1cnZlMTYoT3JpZ2luYWxMdXQgLT5Db250ZXh0SUQsIFBSRUxJTkVBUklaQVRJT05fUE9JTlRTLCBOVUxMKTsKKyAgICAgICAgaWYgKFRyYW5zW3RdID09IE5VTEwpIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgLy8gUG9wdWxhdGUgdGhlIGN1cnZlcworICAgIGZvciAoaT0wOyBpIDwgUFJFTElORUFSSVpBVElPTl9QT0lOVFM7IGkrKykgeworCisgICAgICAgIHYgPSAoY21zRmxvYXQzMk51bWJlcikgKChjbXNGbG9hdDY0TnVtYmVyKSBpIC8gKFBSRUxJTkVBUklaQVRJT05fUE9JTlRTIC0gMSkpOworCisgICAgICAgIC8vIEZlZWQgaW5wdXQgd2l0aCBhIGdyYXkgcmFtcAorICAgICAgICBmb3IgKHQ9MDsgdCA8IE9yaWdpbmFsTHV0IC0+SW5wdXRDaGFubmVsczsgdCsrKQorICAgICAgICAgICAgSW5bdF0gPSB2OworCisgICAgICAgIC8vIEV2YWx1YXRlIHRoZSBncmF5IHZhbHVlCisgICAgICAgIGNtc1BpcGVsaW5lRXZhbEZsb2F0KEluLCBPdXQsIE9yaWdpbmFsTHV0KTsKKworICAgICAgICAvLyBTdG9yZSByZXN1bHQgaW4gY3VydmUKKyAgICAgICAgZm9yICh0PTA7IHQgPCBPcmlnaW5hbEx1dCAtPklucHV0Q2hhbm5lbHM7IHQrKykKKyAgICAgICAgICAgIFRyYW5zW3RdIC0+VGFibGUxNltpXSA9IF9jbXNRdWlja1NhdHVyYXRlV29yZChPdXRbdF0gKiA2NTUzNS4wKTsKKyAgICB9CisKKyAgICAvLyBTbG9wZS1saW1pdCB0aGUgb2J0YWluZWQgY3VydmVzCisgICAgZm9yICh0ID0gMDsgdCA8IE9yaWdpbmFsTHV0IC0+SW5wdXRDaGFubmVsczsgdCsrKQorICAgICAgICBTbG9wZUxpbWl0aW5nKFRyYW5zW3RdKTsKKworICAgIC8vIENoZWNrIGZvciB2YWxpZGl0eQorICAgIGxJc1N1aXRhYmxlID0gVFJVRTsKKyAgICBsSXNMaW5lYXIgICA9IFRSVUU7CisgICAgZm9yICh0PTA7IChsSXNTdWl0YWJsZSAmJiAodCA8IE9yaWdpbmFsTHV0IC0+SW5wdXRDaGFubmVscykpOyB0KyspIHsKKworICAgICAgICAvLyBFeGNsdWRlIGlmIGFscmVhZHkgbGluZWFyCisgICAgICAgIGlmICghY21zSXNUb25lQ3VydmVMaW5lYXIoVHJhbnNbdF0pKQorICAgICAgICAgICAgbElzTGluZWFyID0gRkFMU0U7CisKKyAgICAgICAgLy8gRXhjbHVkZSBpZiBub24tbW9ub3RvbmljCisgICAgICAgIGlmICghY21zSXNUb25lQ3VydmVNb25vdG9uaWMoVHJhbnNbdF0pKQorICAgICAgICAgICAgbElzU3VpdGFibGUgPSBGQUxTRTsKKworICAgICAgICBpZiAoSXNEZWdlbmVyYXRlZChUcmFuc1t0XSkpCisgICAgICAgICAgICBsSXNTdWl0YWJsZSA9IEZBTFNFOworICAgIH0KKworICAgIC8vIElmIGl0IGlzIG5vdCBzdWl0YWJsZSwganVzdCBxdWl0CisgICAgaWYgKCFsSXNTdWl0YWJsZSkgZ290byBFcnJvcjsKKworICAgIC8vIEludmVydCBjdXJ2ZXMgaWYgcG9zc2libGUKKyAgICBmb3IgKHQgPSAwOyB0IDwgT3JpZ2luYWxMdXQgLT5JbnB1dENoYW5uZWxzOyB0KyspIHsKKyAgICAgICAgVHJhbnNSZXZlcnNlW3RdID0gY21zUmV2ZXJzZVRvbmVDdXJ2ZUV4KFBSRUxJTkVBUklaQVRJT05fUE9JTlRTLCBUcmFuc1t0XSk7CisgICAgICAgIGlmIChUcmFuc1JldmVyc2VbdF0gPT0gTlVMTCkgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICAvLyBOb3cgaW5zZXQgdGhlIHJldmVyc2VkIGN1cnZlcyBhdCB0aGUgYmVnaW4gb2YgdHJhbnNmb3JtCisgICAgTHV0UGx1c0N1cnZlcyA9IGNtc1BpcGVsaW5lRHVwKE9yaWdpbmFsTHV0KTsKKyAgICBpZiAoTHV0UGx1c0N1cnZlcyA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dFBsdXNDdXJ2ZXMsIGNtc0FUX0JFR0lOLCBjbXNTdGFnZUFsbG9jVG9uZUN1cnZlcyhPcmlnaW5hbEx1dCAtPkNvbnRleHRJRCwgT3JpZ2luYWxMdXQgLT5JbnB1dENoYW5uZWxzLCBUcmFuc1JldmVyc2UpKSkKKyAgICAgICAgZ290byBFcnJvcjsKKworICAgIC8vIENyZWF0ZSB0aGUgcmVzdWx0IExVVAorICAgIE9wdGltaXplZExVVCA9IGNtc1BpcGVsaW5lQWxsb2MoT3JpZ2luYWxMdXQgLT5Db250ZXh0SUQsIE9yaWdpbmFsTHV0IC0+SW5wdXRDaGFubmVscywgT3JpZ2luYWxMdXQgLT5PdXRwdXRDaGFubmVscyk7CisgICAgaWYgKE9wdGltaXplZExVVCA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgT3B0aW1pemVkUHJlbGluTXBlID0gY21zU3RhZ2VBbGxvY1RvbmVDdXJ2ZXMoT3JpZ2luYWxMdXQgLT5Db250ZXh0SUQsIE9yaWdpbmFsTHV0IC0+SW5wdXRDaGFubmVscywgVHJhbnMpOworCisgICAgLy8gQ3JlYXRlIGFuZCBpbnNlcnQgdGhlIGN1cnZlcyBhdCB0aGUgYmVnaW5uaW5nCisgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKE9wdGltaXplZExVVCwgY21zQVRfQkVHSU4sIE9wdGltaXplZFByZWxpbk1wZSkpCisgICAgICAgIGdvdG8gRXJyb3I7CisKKyAgICAvLyBBbGxvY2F0ZSB0aGUgQ0xVVCBmb3IgcmVzdWx0CisgICAgT3B0aW1pemVkQ0xVVG1wZSA9IGNtc1N0YWdlQWxsb2NDTHV0MTZiaXQoT3JpZ2luYWxMdXQgLT5Db250ZXh0SUQsIG5HcmlkUG9pbnRzLCBPcmlnaW5hbEx1dCAtPklucHV0Q2hhbm5lbHMsIE9yaWdpbmFsTHV0IC0+T3V0cHV0Q2hhbm5lbHMsIE5VTEwpOworCisgICAgLy8gQWRkIHRoZSBDTFVUIHRvIHRoZSBkZXN0aW5hdGlvbiBMVVQKKyAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoT3B0aW1pemVkTFVULCBjbXNBVF9FTkQsIE9wdGltaXplZENMVVRtcGUpKQorICAgICAgICBnb3RvIEVycm9yOworCisgICAgLy8gUmVzYW1wbGUgdGhlIExVVAorICAgIGlmICghY21zU3RhZ2VTYW1wbGVDTHV0MTZiaXQoT3B0aW1pemVkQ0xVVG1wZSwgWEZvcm1TYW1wbGVyMTYsICh2b2lkKikgTHV0UGx1c0N1cnZlcywgMCkpIGdvdG8gRXJyb3I7CisKKyAgICAvLyBGcmVlIHJlc291cmNlcworICAgIGZvciAodCA9IDA7IHQgPCBPcmlnaW5hbEx1dCAtPklucHV0Q2hhbm5lbHM7IHQrKykgeworCisgICAgICAgIGlmIChUcmFuc1t0XSkgY21zRnJlZVRvbmVDdXJ2ZShUcmFuc1t0XSk7CisgICAgICAgIGlmIChUcmFuc1JldmVyc2VbdF0pIGNtc0ZyZWVUb25lQ3VydmUoVHJhbnNSZXZlcnNlW3RdKTsKKyAgICB9CisKKyAgICBjbXNQaXBlbGluZUZyZWUoTHV0UGx1c0N1cnZlcyk7CisKKworICAgIE9wdGltaXplZFByZWxpbkN1cnZlcyA9IF9jbXNTdGFnZUdldFB0clRvQ3VydmVTZXQoT3B0aW1pemVkUHJlbGluTXBlKTsKKyAgICBPcHRpbWl6ZWRQcmVsaW5DTFVUICAgPSAoX2Ntc1N0YWdlQ0x1dERhdGEqKSBPcHRpbWl6ZWRDTFVUbXBlIC0+RGF0YTsKKworICAgIC8vIFNldCB0aGUgZXZhbHVhdG9yIGlmIDgtYml0CisgICAgaWYgKF9jbXNGb3JtYXR0ZXJJczhiaXQoKklucHV0Rm9ybWF0KSkgeworCisgICAgICAgIFByZWxpbjhEYXRhKiBwOCA9IFByZWxpbk9wdDhhbGxvYyhPcHRpbWl6ZWRMVVQgLT5Db250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpbWl6ZWRQcmVsaW5DTFVUIC0+UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW1pemVkUHJlbGluQ3VydmVzKTsKKyAgICAgICAgaWYgKHA4ID09IE5VTEwpIHJldHVybiBGQUxTRTsKKworICAgICAgICBfY21zUGlwZWxpbmVTZXRPcHRpbWl6YXRpb25QYXJhbWV0ZXJzKE9wdGltaXplZExVVCwgUHJlbGluRXZhbDgsICh2b2lkKikgcDgsIFByZWxpbjhmcmVlLCBQcmVsaW44ZHVwKTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBQcmVsaW4xNkRhdGEqIHAxNiA9IFByZWxpbk9wdDE2YWxsb2MoT3B0aW1pemVkTFVUIC0+Q29udGV4dElELAorICAgICAgICAgICAgT3B0aW1pemVkUHJlbGluQ0xVVCAtPlBhcmFtcywKKyAgICAgICAgICAgIDMsIE9wdGltaXplZFByZWxpbkN1cnZlcywgMywgTlVMTCk7CisgICAgICAgIGlmIChwMTYgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworCisgICAgICAgIF9jbXNQaXBlbGluZVNldE9wdGltaXphdGlvblBhcmFtZXRlcnMoT3B0aW1pemVkTFVULCBQcmVsaW5FdmFsMTYsICh2b2lkKikgcDE2LCBQcmVsaW5PcHQxNmZyZWUsIFByZWxpbjE2ZHVwKTsKKworICAgIH0KKworICAgIC8vIERvbid0IGZpeCB3aGl0ZSBvbiBhYnNvbHV0ZSBjb2xvcmltZXRyaWMKKyAgICBpZiAoSW50ZW50ID09IElOVEVOVF9BQlNPTFVURV9DT0xPUklNRVRSSUMpCisgICAgICAgICpkd0ZsYWdzIHw9IGNtc0ZMQUdTX05PV0hJVEVPTldISVRFRklYVVA7CisKKyAgICBpZiAoISgqZHdGbGFncyAmIGNtc0ZMQUdTX05PV0hJVEVPTldISVRFRklYVVApKSB7CisKKyAgICAgICAgaWYgKCFGaXhXaGl0ZU1pc2FsaWdubWVudChPcHRpbWl6ZWRMVVQsIENvbG9yU3BhY2UsIE91dHB1dENvbG9yU3BhY2UpKSB7CisKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFuZCByZXR1cm4gdGhlIG9idGFpbmVkIExVVAorCisgICAgY21zUGlwZWxpbmVGcmVlKE9yaWdpbmFsTHV0KTsKKyAgICAqTHV0ID0gT3B0aW1pemVkTFVUOworICAgIHJldHVybiBUUlVFOworCitFcnJvcjoKKworICAgIGZvciAodCA9IDA7IHQgPCBPcmlnaW5hbEx1dCAtPklucHV0Q2hhbm5lbHM7IHQrKykgeworCisgICAgICAgIGlmIChUcmFuc1t0XSkgY21zRnJlZVRvbmVDdXJ2ZShUcmFuc1t0XSk7CisgICAgICAgIGlmIChUcmFuc1JldmVyc2VbdF0pIGNtc0ZyZWVUb25lQ3VydmUoVHJhbnNSZXZlcnNlW3RdKTsKKyAgICB9CisKKyAgICBpZiAoTHV0UGx1c0N1cnZlcyAhPSBOVUxMKSBjbXNQaXBlbGluZUZyZWUoTHV0UGx1c0N1cnZlcyk7CisgICAgaWYgKE9wdGltaXplZExVVCAhPSBOVUxMKSBjbXNQaXBlbGluZUZyZWUoT3B0aW1pemVkTFVUKTsKKworICAgIHJldHVybiBGQUxTRTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoSW50ZW50KTsKK30KKworCisvLyBDdXJ2ZXMgb3B0aW1pemVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMKK3ZvaWQgQ3VydmVzRnJlZShjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogcHRyKQoreworICAgICBDdXJ2ZXMxNkRhdGEqIERhdGEgPSAoQ3VydmVzMTZEYXRhKikgcHRyOworICAgICBpbnQgaTsKKworICAgICBmb3IgKGk9MDsgaSA8IERhdGEgLT4gbkN1cnZlczsgaSsrKSB7CisKKyAgICAgICAgIF9jbXNGcmVlKENvbnRleHRJRCwgRGF0YSAtPkN1cnZlc1tpXSk7CisgICAgIH0KKworICAgICBfY21zRnJlZShDb250ZXh0SUQsIERhdGEgLT5DdXJ2ZXMpOworICAgICBfY21zRnJlZShDb250ZXh0SUQsIHB0cik7Cit9CisKK3N0YXRpYwordm9pZCogQ3VydmVzRHVwKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCB2b2lkKiBwdHIpCit7CisgICAgQ3VydmVzMTZEYXRhKiBEYXRhID0gKEN1cnZlczE2RGF0YSopX2Ntc0R1cE1lbShDb250ZXh0SUQsIHB0ciwgc2l6ZW9mKEN1cnZlczE2RGF0YSkpOworICAgIGludCBpOworCisgICAgaWYgKERhdGEgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBEYXRhLT5DdXJ2ZXMgPSAoY21zVUludDE2TnVtYmVyKiopIF9jbXNEdXBNZW0oQ29udGV4dElELCBEYXRhLT5DdXJ2ZXMsIERhdGEtPm5DdXJ2ZXMgKiBzaXplb2YoY21zVUludDE2TnVtYmVyKikpOworCisgICAgZm9yIChpPTA7IGkgPCBEYXRhIC0+IG5DdXJ2ZXM7IGkrKykgeworICAgICAgICBEYXRhLT5DdXJ2ZXNbaV0gPSAoY21zVUludDE2TnVtYmVyKikgX2Ntc0R1cE1lbShDb250ZXh0SUQsIERhdGEtPkN1cnZlc1tpXSwgRGF0YS0+bkVsZW1lbnRzICogc2l6ZW9mKGNtc1VJbnQxNk51bWJlcikpOworICAgIH0KKworICAgIHJldHVybiAodm9pZCopIERhdGE7Cit9CisKKy8vIFByZWNvbXB1dGVzIHRhYmxlcyBmb3IgOC1iaXQgb24gaW5wdXQgZGV2aWNlbGluay4KK3N0YXRpYworQ3VydmVzMTZEYXRhKiBDdXJ2ZXNBbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwgaW50IG5DdXJ2ZXMsIGludCBuRWxlbWVudHMsIGNtc1RvbmVDdXJ2ZSoqIEcpCit7CisgICAgaW50IGksIGo7CisgICAgQ3VydmVzMTZEYXRhKiBjMTY7CisKKyAgICBjMTYgPSAoQ3VydmVzMTZEYXRhKilfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihDdXJ2ZXMxNkRhdGEpKTsKKyAgICBpZiAoYzE2ID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgYzE2IC0+bkN1cnZlcyA9IG5DdXJ2ZXM7CisgICAgYzE2IC0+bkVsZW1lbnRzID0gbkVsZW1lbnRzOworCisgICAgYzE2LT5DdXJ2ZXMgPSAoY21zVUludDE2TnVtYmVyKiopIF9jbXNDYWxsb2MoQ29udGV4dElELCBuQ3VydmVzLCBzaXplb2YoY21zVUludDE2TnVtYmVyKikpOworICAgIGlmIChjMTYgLT5DdXJ2ZXMgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKGk9MDsgaSA8IG5DdXJ2ZXM7IGkrKykgeworCisgICAgICAgIGMxNi0+Q3VydmVzW2ldID0gKGNtc1VJbnQxNk51bWJlciopIF9jbXNDYWxsb2MoQ29udGV4dElELCBuRWxlbWVudHMsIHNpemVvZihjbXNVSW50MTZOdW1iZXIpKTsKKworICAgICAgICBpZiAoYzE2LT5DdXJ2ZXNbaV0gPT0gTlVMTCkgeworCisgICAgICAgICAgICBmb3IgKGo9MDsgaiA8IGk7IGorKykgeworICAgICAgICAgICAgICAgIF9jbXNGcmVlKENvbnRleHRJRCwgYzE2LT5DdXJ2ZXNbal0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX2Ntc0ZyZWUoQ29udGV4dElELCBjMTYtPkN1cnZlcyk7CisgICAgICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIGMxNik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuRWxlbWVudHMgPT0gMjU2KSB7CisKKyAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgbkVsZW1lbnRzOyBqKyspIHsKKworICAgICAgICAgICAgICAgIGMxNiAtPkN1cnZlc1tpXVtqXSA9IGNtc0V2YWxUb25lQ3VydmUxNihHW2ldLCBGUk9NXzhfVE9fMTYoaikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICBmb3IgKGo9MDsgaiA8IG5FbGVtZW50czsgaisrKSB7CisgICAgICAgICAgICAgICAgYzE2IC0+Q3VydmVzW2ldW2pdID0gY21zRXZhbFRvbmVDdXJ2ZTE2KEdbaV0sIChjbXNVSW50MTZOdW1iZXIpIGopOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGMxNjsKK30KKworc3RhdGljCit2b2lkIEZhc3RFdmFsdWF0ZUN1cnZlczgocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIEluW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciBPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY29uc3Qgdm9pZCogRCkKK3sKKyAgICBDdXJ2ZXMxNkRhdGEqIERhdGEgPSAoQ3VydmVzMTZEYXRhKikgRDsKKyAgICBjbXNVSW50OE51bWJlciB4OworICAgIGludCBpOworCisgICAgZm9yIChpPTA7IGkgPCBEYXRhIC0+bkN1cnZlczsgaSsrKSB7CisKKyAgICAgICAgIHggPSAoSW5baV0gPj4gOCk7CisgICAgICAgICBPdXRbaV0gPSBEYXRhIC0+IEN1cnZlc1tpXVt4XTsKKyAgICB9Cit9CisKKworc3RhdGljCit2b2lkIEZhc3RFdmFsdWF0ZUN1cnZlczE2KHJlZ2lzdGVyIGNvbnN0IGNtc1VJbnQxNk51bWJlciBJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgT3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNvbnN0IHZvaWQqIEQpCit7CisgICAgQ3VydmVzMTZEYXRhKiBEYXRhID0gKEN1cnZlczE2RGF0YSopIEQ7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGk9MDsgaSA8IERhdGEgLT5uQ3VydmVzOyBpKyspIHsKKyAgICAgICAgIE91dFtpXSA9IERhdGEgLT4gQ3VydmVzW2ldW0luW2ldXTsKKyAgICB9Cit9CisKKworc3RhdGljCit2b2lkIEZhc3RJZGVudGl0eTE2KHJlZ2lzdGVyIGNvbnN0IGNtc1VJbnQxNk51bWJlciBJbltdLAorICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgT3V0W10sCisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNvbnN0IHZvaWQqIEQpCit7CisgICAgY21zUGlwZWxpbmUqIEx1dCA9IChjbXNQaXBlbGluZSopIEQ7CisgICAgY21zVUludDMyTnVtYmVyIGk7CisKKyAgICBmb3IgKGk9MDsgaSA8IEx1dCAtPklucHV0Q2hhbm5lbHM7IGkrKykgeworICAgICAgICAgT3V0W2ldID0gSW5baV07CisgICAgfQorfQorCisKKy8vIElmIHRoZSB0YXJnZXQgTFVUIGhvbGRzIG9ubHkgY3VydmVzLCB0aGUgb3B0aW1pemF0aW9uIHByb2NlZHVyZSBpcyB0byBqb2luIGFsbCB0aG9zZQorLy8gY3VydmVzIHRvZ2V0aGVyLiBUaGF0IG9ubHkgd29ya3Mgb24gY3VydmVzIGFuZCBkb2VzIG5vdCB3b3JrIG9uIG1hdHJpY2VzLgorc3RhdGljCitjbXNCb29sIE9wdGltaXplQnlKb2luaW5nQ3VydmVzKGNtc1BpcGVsaW5lKiogTHV0LCBjbXNVSW50MzJOdW1iZXIgSW50ZW50LCBjbXNVSW50MzJOdW1iZXIqIElucHV0Rm9ybWF0LCBjbXNVSW50MzJOdW1iZXIqIE91dHB1dEZvcm1hdCwgY21zVUludDMyTnVtYmVyKiBkd0ZsYWdzKQoreworICAgIGNtc1RvbmVDdXJ2ZSoqIEdhbW1hVGFibGVzID0gTlVMTDsKKyAgICBjbXNGbG9hdDMyTnVtYmVyIEluRmxvYXRbY21zTUFYQ0hBTk5FTFNdLCBPdXRGbG9hdFtjbXNNQVhDSEFOTkVMU107CisgICAgY21zVUludDMyTnVtYmVyIGksIGo7CisgICAgY21zUGlwZWxpbmUqIFNyYyA9ICpMdXQ7CisgICAgY21zUGlwZWxpbmUqIERlc3QgPSBOVUxMOworICAgIGNtc1N0YWdlKiBtcGU7CisgICAgY21zU3RhZ2UqIE9idGFpbmVkQ3VydmVzID0gTlVMTDsKKworCisgICAgLy8gVGhpcyBpcyBhIGxvb3N5IG9wdGltaXphdGlvbiEgZG9lcyBub3QgYXBwbHkgaW4gZmxvYXRpbmctcG9pbnQgY2FzZXMKKyAgICBpZiAoX2Ntc0Zvcm1hdHRlcklzRmxvYXQoKklucHV0Rm9ybWF0KSB8fCBfY21zRm9ybWF0dGVySXNGbG9hdCgqT3V0cHV0Rm9ybWF0KSkgcmV0dXJuIEZBTFNFOworCisgICAgLy8gIE9ubHkgY3VydmVzIGluIHRoaXMgTFVUPworICAgIGZvciAobXBlID0gY21zUGlwZWxpbmVHZXRQdHJUb0ZpcnN0U3RhZ2UoU3JjKTsKKyAgICAgICAgIG1wZSAhPSBOVUxMOworICAgICAgICAgbXBlID0gY21zU3RhZ2VOZXh0KG1wZSkpIHsKKyAgICAgICAgICAgIGlmIChjbXNTdGFnZVR5cGUobXBlKSAhPSBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlKSByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLy8gQWxsb2NhdGUgYW4gZW1wdHkgTFVUCisgICAgRGVzdCA9ICBjbXNQaXBlbGluZUFsbG9jKFNyYyAtPkNvbnRleHRJRCwgU3JjIC0+SW5wdXRDaGFubmVscywgU3JjIC0+T3V0cHV0Q2hhbm5lbHMpOworICAgIGlmIChEZXN0ID09IE5VTEwpIHJldHVybiBGQUxTRTsKKworICAgIC8vIENyZWF0ZSB0YXJnZXQgY3VydmVzCisgICAgR2FtbWFUYWJsZXMgPSAoY21zVG9uZUN1cnZlKiopIF9jbXNDYWxsb2MoU3JjIC0+Q29udGV4dElELCBTcmMgLT5JbnB1dENoYW5uZWxzLCBzaXplb2YoY21zVG9uZUN1cnZlKikpOworICAgIGlmIChHYW1tYVRhYmxlcyA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgZm9yIChpPTA7IGkgPCBTcmMgLT5JbnB1dENoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgR2FtbWFUYWJsZXNbaV0gPSBjbXNCdWlsZFRhYnVsYXRlZFRvbmVDdXJ2ZTE2KFNyYyAtPkNvbnRleHRJRCwgUFJFTElORUFSSVpBVElPTl9QT0lOVFMsIE5VTEwpOworICAgICAgICBpZiAoR2FtbWFUYWJsZXNbaV0gPT0gTlVMTCkgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICAvLyBDb21wdXRlIDE2IGJpdCByZXN1bHQgYnkgdXNpbmcgZmxvYXRpbmcgcG9pbnQKKyAgICBmb3IgKGk9MDsgaSA8IFBSRUxJTkVBUklaQVRJT05fUE9JTlRTOyBpKyspIHsKKworICAgICAgICBmb3IgKGo9MDsgaiA8IFNyYyAtPklucHV0Q2hhbm5lbHM7IGorKykKKyAgICAgICAgICAgIEluRmxvYXRbal0gPSAoY21zRmxvYXQzMk51bWJlcikgKChjbXNGbG9hdDY0TnVtYmVyKSBpIC8gKFBSRUxJTkVBUklaQVRJT05fUE9JTlRTIC0gMSkpOworCisgICAgICAgIGNtc1BpcGVsaW5lRXZhbEZsb2F0KEluRmxvYXQsIE91dEZsb2F0LCBTcmMpOworCisgICAgICAgIGZvciAoaj0wOyBqIDwgU3JjIC0+SW5wdXRDaGFubmVsczsgaisrKQorICAgICAgICAgICAgR2FtbWFUYWJsZXNbal0gLT4gVGFibGUxNltpXSA9IF9jbXNRdWlja1NhdHVyYXRlV29yZChPdXRGbG9hdFtqXSAqIDY1NTM1LjApOworICAgIH0KKworICAgIE9idGFpbmVkQ3VydmVzID0gY21zU3RhZ2VBbGxvY1RvbmVDdXJ2ZXMoU3JjIC0+Q29udGV4dElELCBTcmMgLT5JbnB1dENoYW5uZWxzLCBHYW1tYVRhYmxlcyk7CisgICAgaWYgKE9idGFpbmVkQ3VydmVzID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgICBmb3IgKGk9MDsgaSA8IFNyYyAtPklucHV0Q2hhbm5lbHM7IGkrKykgeworICAgICAgICBjbXNGcmVlVG9uZUN1cnZlKEdhbW1hVGFibGVzW2ldKTsKKyAgICAgICAgR2FtbWFUYWJsZXNbaV0gPSBOVUxMOworICAgIH0KKworICAgIGlmIChHYW1tYVRhYmxlcyAhPSBOVUxMKSB7CisgICAgICAgIF9jbXNGcmVlKFNyYy0+Q29udGV4dElELCBHYW1tYVRhYmxlcyk7CisgICAgICAgIEdhbW1hVGFibGVzID0gTlVMTDsKKyAgICB9CisKKyAgICAvLyBNYXliZSB0aGUgY3VydmVzIGFyZSBsaW5lYXIgYXQgdGhlIGVuZAorICAgIGlmICghQWxsQ3VydmVzQXJlTGluZWFyKE9idGFpbmVkQ3VydmVzKSkgeworCisgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShEZXN0LCBjbXNBVF9CRUdJTiwgT2J0YWluZWRDdXJ2ZXMpKQorICAgICAgICAgICAgZ290byBFcnJvcjsKKworICAgICAgICAvLyBJZiB0aGUgY3VydmVzIGFyZSB0byBiZSBhcHBsaWVkIGluIDggYml0cywgd2UgY2FuIHNhdmUgbWVtb3J5CisgICAgICAgIGlmIChfY21zRm9ybWF0dGVySXM4Yml0KCpJbnB1dEZvcm1hdCkpIHsKKworICAgICAgICAgICAgX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqIERhdGEgPSAoX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqKSBPYnRhaW5lZEN1cnZlcyAtPkRhdGE7CisgICAgICAgICAgICAgQ3VydmVzMTZEYXRhKiBjMTYgPSBDdXJ2ZXNBbGxvYyhEZXN0IC0+Q29udGV4dElELCBEYXRhIC0+bkN1cnZlcywgMjU2LCBEYXRhIC0+VGhlQ3VydmVzKTsKKworICAgICAgICAgICAgIGlmIChjMTYgPT0gTlVMTCkgZ290byBFcnJvcjsgCisgICAgICAgICAgICAgKmR3RmxhZ3MgfD0gY21zRkxBR1NfTk9DQUNIRTsKKyAgICAgICAgICAgIF9jbXNQaXBlbGluZVNldE9wdGltaXphdGlvblBhcmFtZXRlcnMoRGVzdCwgRmFzdEV2YWx1YXRlQ3VydmVzOCwgYzE2LCBDdXJ2ZXNGcmVlLCBDdXJ2ZXNEdXApOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisKKyAgICAgICAgICAgIF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKiBEYXRhID0gKF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKikgY21zU3RhZ2VEYXRhKE9idGFpbmVkQ3VydmVzKTsKKyAgICAgICAgICAgICBDdXJ2ZXMxNkRhdGEqIGMxNiA9IEN1cnZlc0FsbG9jKERlc3QgLT5Db250ZXh0SUQsIERhdGEgLT5uQ3VydmVzLCA2NTUzNiwgRGF0YSAtPlRoZUN1cnZlcyk7CisKKyAgICAgICAgICAgICBpZiAoYzE2ID09IE5VTEwpIGdvdG8gRXJyb3I7IAorICAgICAgICAgICAgICpkd0ZsYWdzIHw9IGNtc0ZMQUdTX05PQ0FDSEU7CisgICAgICAgICAgICBfY21zUGlwZWxpbmVTZXRPcHRpbWl6YXRpb25QYXJhbWV0ZXJzKERlc3QsIEZhc3RFdmFsdWF0ZUN1cnZlczE2LCBjMTYsIEN1cnZlc0ZyZWUsIEN1cnZlc0R1cCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgLy8gTFVUIG9wdGltaXplcyB0byBub3RoaW5nLiBTZXQgdGhlIGlkZW50aXR5IExVVAorICAgICAgICBjbXNTdGFnZUZyZWUoT2J0YWluZWRDdXJ2ZXMpOworCisgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShEZXN0LCBjbXNBVF9CRUdJTiwgY21zU3RhZ2VBbGxvY0lkZW50aXR5KERlc3QgLT5Db250ZXh0SUQsIFNyYyAtPklucHV0Q2hhbm5lbHMpKSkKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisKKyAgICAgICAgKmR3RmxhZ3MgfD0gY21zRkxBR1NfTk9DQUNIRTsKKyAgICAgICAgX2Ntc1BpcGVsaW5lU2V0T3B0aW1pemF0aW9uUGFyYW1ldGVycyhEZXN0LCBGYXN0SWRlbnRpdHkxNiwgKHZvaWQqKSBEZXN0LCBOVUxMLCBOVUxMKTsKKyAgICB9CisKKyAgICAvLyBXZSBhcmUgZG9uZS4KKyAgICBjbXNQaXBlbGluZUZyZWUoU3JjKTsKKyAgICAqTHV0ID0gRGVzdDsKKyAgICByZXR1cm4gVFJVRTsKKworRXJyb3I6CisKKyAgICBpZiAoT2J0YWluZWRDdXJ2ZXMgIT0gTlVMTCkgY21zU3RhZ2VGcmVlKE9idGFpbmVkQ3VydmVzKTsKKyAgICBpZiAoR2FtbWFUYWJsZXMgIT0gTlVMTCkgeworICAgICAgICBmb3IgKGk9MDsgaSA8IFNyYyAtPklucHV0Q2hhbm5lbHM7IGkrKykgeworICAgICAgICAgICAgaWYgKEdhbW1hVGFibGVzW2ldICE9IE5VTEwpIGNtc0ZyZWVUb25lQ3VydmUoR2FtbWFUYWJsZXNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgX2Ntc0ZyZWUoU3JjIC0+Q29udGV4dElELCBHYW1tYVRhYmxlcyk7CisgICAgfQorCisgICAgaWYgKERlc3QgIT0gTlVMTCkgY21zUGlwZWxpbmVGcmVlKERlc3QpOworICAgIHJldHVybiBGQUxTRTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoSW50ZW50KTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKElucHV0Rm9ybWF0KTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKE91dHB1dEZvcm1hdCk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihkd0ZsYWdzKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTFVUIGlzIFNoYXBlciAtIE1hdHJpeCAtIE1hdHJpeCAtIFNoYXBlciwgd2hpY2ggaXMgdmVyeSBmcmVxdWVudCB3aGVuIGNvbWJpbmluZyB0d28gbWF0cml4LXNoYXBlciBwcm9maWxlcworCisKK3N0YXRpYwordm9pZCAgRnJlZU1hdFNoYXBlcihjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogRGF0YSkKK3sKKyAgICBpZiAoRGF0YSAhPSBOVUxMKSBfY21zRnJlZShDb250ZXh0SUQsIERhdGEpOworfQorCitzdGF0aWMKK3ZvaWQqIER1cE1hdFNoYXBlcihjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3Qgdm9pZCogRGF0YSkKK3sKKyAgICByZXR1cm4gX2Ntc0R1cE1lbShDb250ZXh0SUQsIERhdGEsIHNpemVvZihNYXRTaGFwZXI4RGF0YSkpOworfQorCisKKy8vIEEgZmFzdCBtYXRyaXgtc2hhcGVyIGV2YWx1YXRvciBmb3IgOCBiaXRzLiBUaGlzIGlzIGEgYml0IHRpY2t5IHNpbmNlIEknbSB1c2luZyAxLjE0IHNpZ25lZCBmaXhlZCBwb2ludAorLy8gdG8gYWNjb21wbGlzaCBzb21lIHBlcmZvcm1hbmNlLiBBY3R1YWxseSBpdCB0YWtlcyAyNTZ4MyAxNiBiaXRzIHRhYmxlcyBhbmQgMTYzODUgeCAzIHRhYmxlcyBvZiA4IGJpdHMsCisvLyBpbiB0b3RhbCBhYm91dCA1MEssIGFuZCB0aGUgcGVyZm9ybWFuY2UgYm9vc3QgaXMgaHVnZSEKK3N0YXRpYwordm9pZCBNYXRTaGFwZXJFdmFsMTYocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIEluW10sCisgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgT3V0W10sCisgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjb25zdCB2b2lkKiBEKQoreworICAgIE1hdFNoYXBlcjhEYXRhKiBwID0gKE1hdFNoYXBlcjhEYXRhKikgRDsKKyAgICBjbXNTMUZpeGVkMTROdW1iZXIgbDEsIGwyLCBsMywgciwgZywgYjsKKyAgICBjbXNVSW50MzJOdW1iZXIgcmksIGdpLCBiaTsKKworICAgIC8vIEluIHRoaXMgY2FzZSAoYW5kIG9ubHkgaW4gdGhpcyBjYXNlISkgd2UgY2FuIHVzZSB0aGlzIHNpbXBsaWZpY2F0aW9uIHNpbmNlCisgICAgLy8gSW5bXSBpcyBhc3N1cmVkIHRvIGNvbWUgZnJvbSBhIDggYml0IG51bWJlci4gKGEgPDwgOCB8IGEpCisgICAgcmkgPSBJblswXSAmIDB4RkY7CisgICAgZ2kgPSBJblsxXSAmIDB4RkY7CisgICAgYmkgPSBJblsyXSAmIDB4RkY7CisKKyAgICAvLyBBY3Jvc3MgZmlyc3Qgc2hhcGVyLCB3aGljaCBhbHNvIGNvbnZlcnRzIHRvIDEuMTQgZml4ZWQgcG9pbnQKKyAgICByID0gcC0+U2hhcGVyMVJbcmldOworICAgIGcgPSBwLT5TaGFwZXIxR1tnaV07CisgICAgYiA9IHAtPlNoYXBlcjFCW2JpXTsKKworICAgIC8vIEV2YWx1YXRlIHRoZSBtYXRyaXggaW4gMS4xNCBmaXhlZCBwb2ludAorICAgIGwxID0gIChwLT5NYXRbMF1bMF0gKiByICsgcC0+TWF0WzBdWzFdICogZyArIHAtPk1hdFswXVsyXSAqIGIgKyBwLT5PZmZbMF0gKyAweDIwMDApID4+IDE0OworICAgIGwyID0gIChwLT5NYXRbMV1bMF0gKiByICsgcC0+TWF0WzFdWzFdICogZyArIHAtPk1hdFsxXVsyXSAqIGIgKyBwLT5PZmZbMV0gKyAweDIwMDApID4+IDE0OworICAgIGwzID0gIChwLT5NYXRbMl1bMF0gKiByICsgcC0+TWF0WzJdWzFdICogZyArIHAtPk1hdFsyXVsyXSAqIGIgKyBwLT5PZmZbMl0gKyAweDIwMDApID4+IDE0OworCisgICAgLy8gTm93IHdlIGhhdmUgdG8gY2xpcCB0byAwLi4xLjAgcmFuZ2UKKyAgICByaSA9IChsMSA8IDApID8gMCA6ICgobDEgPiAxNjM4NCkgPyAxNjM4NCA6IGwxKTsKKyAgICBnaSA9IChsMiA8IDApID8gMCA6ICgobDIgPiAxNjM4NCkgPyAxNjM4NCA6IGwyKTsKKyAgICBiaSA9IChsMyA8IDApID8gMCA6ICgobDMgPiAxNjM4NCkgPyAxNjM4NCA6IGwzKTsKKworICAgIC8vIEFuZCBhY3Jvc3Mgc2Vjb25kIHNoYXBlciwKKyAgICBPdXRbMF0gPSBwLT5TaGFwZXIyUltyaV07CisgICAgT3V0WzFdID0gcC0+U2hhcGVyMkdbZ2ldOworICAgIE91dFsyXSA9IHAtPlNoYXBlcjJCW2JpXTsKKworfQorCisvLyBUaGlzIHRhYmxlIGNvbnZlcnRzIGZyb20gOCBiaXRzIHRvIDEuMTQgYWZ0ZXIgYXBwbHlpbmcgdGhlIGN1cnZlCitzdGF0aWMKK2Ntc0Jvb2wgRmlsbEZpcnN0U2hhcGVyKGNtc1MxRml4ZWQxNE51bWJlciogVGFibGUsIGNtc1RvbmVDdXJ2ZSogQ3VydmUpCit7CisgICAgaW50IGk7CisgICAgY21zRmxvYXQzMk51bWJlciBSLCB5OworCisgICAgZm9yIChpPTA7IGkgPCAyNTY7IGkrKykgeworCisgICAgICAgIFIgICA9IChjbXNGbG9hdDMyTnVtYmVyKSAoaSAvIDI1NS4wKTsKKyAgICAgICAgeSAgID0gY21zRXZhbFRvbmVDdXJ2ZUZsb2F0KEN1cnZlLCBSKTsKKyAgICAgICAgaWYgKGlzaW5mKHkpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgICAgIFRhYmxlW2ldID0gRE9VQkxFX1RPXzFGSVhFRDE0KHkpOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gVGhpcyB0YWJsZSBjb252ZXJ0cyBmb3JtIDEuMTQgKGJlaW5nIDB4NDAwMCB0aGUgbGFzdCBlbnRyeSkgdG8gOCBiaXRzIGFmdGVyIGFwcGx5aW5nIHRoZSBjdXJ2ZQorc3RhdGljCitjbXNCb29sIEZpbGxTZWNvbmRTaGFwZXIoY21zVUludDE2TnVtYmVyKiBUYWJsZSwgY21zVG9uZUN1cnZlKiBDdXJ2ZSwgY21zQm9vbCBJczhCaXRzT3V0cHV0KQoreworICAgIGludCBpOworICAgIGNtc0Zsb2F0MzJOdW1iZXIgUiwgVmFsOworCisgICAgZm9yIChpPTA7IGkgPCAxNjM4NTsgaSsrKSB7CisKKyAgICAgICAgUiAgID0gKGNtc0Zsb2F0MzJOdW1iZXIpIChpIC8gMTYzODQuMCk7CisgICAgICAgIFZhbCA9IGNtc0V2YWxUb25lQ3VydmVGbG9hdChDdXJ2ZSwgUik7ICAgIC8vIFZhbCBjb21lcyAwLi4xLjAKKyAgICAgICAgaWYgKGlzaW5mKFZhbCkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgaWYgKElzOEJpdHNPdXRwdXQpIHsKKworICAgICAgICAgICAgLy8gSWYgOCBiaXRzIG91dHB1dCwgd2UgY2FuIG9wdGltaXplIGZ1cnRoZXIgYnkgY29tcHV0aW5nIHRoZSAvIDI1NyBwYXJ0LgorICAgICAgICAgICAgLy8gZmlyc3Qgd2UgY29tcHV0ZSB0aGUgcmVzdWx0aW5nIGJ5dGUgYW5kIHRoZW4gd2Ugc3RvcmUgdGhlIGJ5dGUgdGltZXMKKyAgICAgICAgICAgIC8vIDI1Ny4gVGhpcyBxdWFudGl6YXRpb24gYWxsb3dzIHRvIHJvdW5kIHZlcnkgcXVpY2sgYnkgZG9pbmcgYSA+PiA4LCBidXQKKyAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBsb3cgYnl0ZSBpcyBhbHdheXMgZXF1YWwgdG8gbXNiLCB3ZSBjYW4gZG8gYSAmIDB4ZmYgYW5kIHRoaXMgd29ya3MhCisgICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIgdyA9IF9jbXNRdWlja1NhdHVyYXRlV29yZChWYWwgKiA2NTUzNS4wKTsKKyAgICAgICAgICAgIGNtc1VJbnQ4TnVtYmVyICBiID0gRlJPTV8xNl9UT184KHcpOworCisgICAgICAgICAgICBUYWJsZVtpXSA9IEZST01fOF9UT18xNihiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIFRhYmxlW2ldICA9IF9jbXNRdWlja1NhdHVyYXRlV29yZChWYWwgKiA2NTUzNS4wKTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8vIENvbXB1dGUgdGhlIG1hdHJpeC1zaGFwZXIgc3RydWN0dXJlCitzdGF0aWMKK2Ntc0Jvb2wgU2V0TWF0U2hhcGVyKGNtc1BpcGVsaW5lKiBEZXN0LCBjbXNUb25lQ3VydmUqIEN1cnZlMVszXSwgY21zTUFUMyogTWF0LCBjbXNWRUMzKiBPZmYsIGNtc1RvbmVDdXJ2ZSogQ3VydmUyWzNdLCBjbXNVSW50MzJOdW1iZXIqIE91dHB1dEZvcm1hdCkKK3sKKyAgICBNYXRTaGFwZXI4RGF0YSogcDsKKyAgICBpbnQgaSwgajsKKyAgICBjbXNCb29sIElzOEJpdHMgPSBfY21zRm9ybWF0dGVySXM4Yml0KCpPdXRwdXRGb3JtYXQpOworCisgICAgLy8gQWxsb2NhdGUgYSBiaWcgY2h1Y2sgb2YgbWVtb3J5IHRvIHN0b3JlIHByZWNvbXB1dGVkIHRhYmxlcworICAgIHAgPSAoTWF0U2hhcGVyOERhdGEqKSBfY21zTWFsbG9jKERlc3QgLT5Db250ZXh0SUQsIHNpemVvZihNYXRTaGFwZXI4RGF0YSkpOworICAgIGlmIChwID09IE5VTEwpIHJldHVybiBGQUxTRTsKKworICAgIHAgLT4gQ29udGV4dElEID0gRGVzdCAtPiBDb250ZXh0SUQ7CisKKyAgICAvLyBQcmVjb21wdXRlIHRhYmxlcworICAgIGlmICghRmlsbEZpcnN0U2hhcGVyKHAgLT5TaGFwZXIxUiwgQ3VydmUxWzBdKSkKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICBpZiAoIUZpbGxGaXJzdFNoYXBlcihwIC0+U2hhcGVyMUcsIEN1cnZlMVsxXSkpCisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgaWYgKCFGaWxsRmlyc3RTaGFwZXIocCAtPlNoYXBlcjFCLCBDdXJ2ZTFbMl0pKQorICAgICAgICBnb3RvIEVycm9yOworCisgICAgaWYgKCFGaWxsU2Vjb25kU2hhcGVyKHAgLT5TaGFwZXIyUiwgQ3VydmUyWzBdLCBJczhCaXRzKSkKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICBpZiAoIUZpbGxTZWNvbmRTaGFwZXIocCAtPlNoYXBlcjJHLCBDdXJ2ZTJbMV0sIElzOEJpdHMpKQorICAgICAgICBnb3RvIEVycm9yOworICAgIGlmICghRmlsbFNlY29uZFNoYXBlcihwIC0+U2hhcGVyMkIsIEN1cnZlMlsyXSwgSXM4Qml0cykpCisgICAgICAgIGdvdG8gRXJyb3I7CisKKyAgICAvLyBDb252ZXJ0IG1hdHJpeCB0byBuRml4ZWQxNC4gTm90ZSB0aGF0IHRob3NlIHZhbHVlcyBtYXkgdGFrZSBtb3JlIHRoYW4gMTYgYml0cyBhcworICAgIGZvciAoaT0wOyBpIDwgMzsgaSsrKSB7CisgICAgICAgIGZvciAoaj0wOyBqIDwgMzsgaisrKSB7CisgICAgICAgICAgICBwIC0+TWF0W2ldW2pdID0gRE9VQkxFX1RPXzFGSVhFRDE0KE1hdC0+dltpXS5uW2pdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaT0wOyBpIDwgMzsgaSsrKSB7CisKKyAgICAgICAgaWYgKE9mZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBwIC0+T2ZmW2ldID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHAgLT5PZmZbaV0gPSBET1VCTEVfVE9fMUZJWEVEMTQoT2ZmLT5uW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE1hcmsgYXMgb3B0aW1pemVkIGZvciBmYXN0ZXIgZm9ybWF0dGVyCisgICAgaWYgKElzOEJpdHMpCisgICAgICAgICpPdXRwdXRGb3JtYXQgfD0gT1BUSU1JWkVEX1NIKDEpOworCisgICAgLy8gRmlsbCBmdW5jdGlvbiBwb2ludGVycworICAgIF9jbXNQaXBlbGluZVNldE9wdGltaXphdGlvblBhcmFtZXRlcnMoRGVzdCwgTWF0U2hhcGVyRXZhbDE2LCAodm9pZCopIHAsIEZyZWVNYXRTaGFwZXIsIER1cE1hdFNoYXBlcik7CisgICAgcmV0dXJuIFRSVUU7CisgICAgRXJyb3I6CisgICAgICAgIF9jbXNGcmVlKERlc3QtPkNvbnRleHRJRCwgcCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKK30KKworLy8gIDggYml0cyBvbiBpbnB1dCBhbGxvd3MgbWF0cml4LXNoYXBlciBib290IHVwIHRvIDI1IE1waXhlbHMgcGVyIHNlY29uZCBvbiBSR0IuIFRoYXQncyBmYXN0IQorc3RhdGljCitjbXNCb29sIE9wdGltaXplTWF0cml4U2hhcGVyKGNtc1BpcGVsaW5lKiogTHV0LCBjbXNVSW50MzJOdW1iZXIgSW50ZW50LCBjbXNVSW50MzJOdW1iZXIqIElucHV0Rm9ybWF0LCBjbXNVSW50MzJOdW1iZXIqIE91dHB1dEZvcm1hdCwgY21zVUludDMyTnVtYmVyKiBkd0ZsYWdzKQoreworICAgICAgIGNtc1N0YWdlKiBDdXJ2ZTEsICpDdXJ2ZTI7CisgICAgICAgY21zU3RhZ2UqIE1hdHJpeDEsICpNYXRyaXgyOworICAgICAgIGNtc01BVDMgcmVzOworICAgICAgIGNtc0Jvb2wgSWRlbnRpdHlNYXQ7CisgICAgICAgY21zUGlwZWxpbmUqIERlc3QsICpTcmM7CisgICAgICAgY21zRmxvYXQ2NE51bWJlciogT2Zmc2V0OworCisgICAgICAgLy8gT25seSB3b3JrcyBvbiBSR0IgdG8gUkdCCisgICAgICAgaWYgKFRfQ0hBTk5FTFMoKklucHV0Rm9ybWF0KSAhPSAzIHx8IFRfQ0hBTk5FTFMoKk91dHB1dEZvcm1hdCkgIT0gMykgcmV0dXJuIEZBTFNFOworCisgICAgICAgLy8gT25seSB3b3JrcyBvbiA4IGJpdCBpbnB1dAorICAgICAgIGlmICghX2Ntc0Zvcm1hdHRlcklzOGJpdCgqSW5wdXRGb3JtYXQpKSByZXR1cm4gRkFMU0U7CisKKyAgICAgICAvLyBTZWVtcyBzdWl0YWJsZSwgcHJvY2VlZAorICAgICAgIFNyYyA9ICpMdXQ7CisKKyAgICAgICAvLyBDaGVjayBmb3I6CisgICAgICAgLy8gCisgICAgICAgLy8gICAgc2hhcGVyLW1hdHJpeC1tYXRyaXgtc2hhcGVyIAorICAgICAgIC8vICAgIHNoYXBlci1tYXRyaXgtc2hhcGVyCisgICAgICAgLy8gCisgICAgICAgLy8gQm90aCBvZiB0aG9zZSBjb25zdHJ1Y3RzIGFyZSBwb3NzaWJsZSAoZmlyc3QgYmVjYXVzZSBhYnMuIGNvbG9yaW1ldHJpYykuIAorICAgICAgIC8vIGFkZGl0aW9uYWxseSwgSW4gdGhlIGZpcnN0IGNhc2UsIHRoZSBpbnB1dCBtYXRyaXggb2Zmc2V0IHNob3VsZCBiZSB6ZXJvLgorCisgICAgICAgSWRlbnRpdHlNYXQgPSBGQUxTRTsKKyAgICAgICBpZiAoY21zUGlwZWxpbmVDaGVja0FuZFJldHJlaXZlU3RhZ2VzKFNyYywgNCwKKyAgICAgICAgICAgICAgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgY21zU2lnTWF0cml4RWxlbVR5cGUsIGNtc1NpZ01hdHJpeEVsZW1UeXBlLCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLAorICAgICAgICAgICAgICAmQ3VydmUxLCAmTWF0cml4MSwgJk1hdHJpeDIsICZDdXJ2ZTIpKSB7CisKKyAgICAgICAgICAgICAgLy8gR2V0IGJvdGggbWF0cmljZXMKKyAgICAgICAgICAgICAgX2Ntc1N0YWdlTWF0cml4RGF0YSogRGF0YTEgPSAoX2Ntc1N0YWdlTWF0cml4RGF0YSopY21zU3RhZ2VEYXRhKE1hdHJpeDEpOworICAgICAgICAgICAgICBfY21zU3RhZ2VNYXRyaXhEYXRhKiBEYXRhMiA9IChfY21zU3RhZ2VNYXRyaXhEYXRhKiljbXNTdGFnZURhdGEoTWF0cml4Mik7CisKKyAgICAgICAgICAgICAgLy8gSW5wdXQgb2Zmc2V0IHNob3VsZCBiZSB6ZXJvCisgICAgICAgICAgICAgIGlmIChEYXRhMS0+T2Zmc2V0ICE9IE5VTEwpIHJldHVybiBGQUxTRTsKKworICAgICAgICAgICAgICAvLyBNdWx0aXBseSBib3RoIG1hdHJpY2VzIHRvIGdldCB0aGUgcmVzdWx0CisgICAgICAgICAgICAgIF9jbXNNQVQzcGVyKCZyZXMsIChjbXNNQVQzKilEYXRhMi0+RG91YmxlLCAoY21zTUFUMyopRGF0YTEtPkRvdWJsZSk7CisKKyAgICAgICAgICAgICAgLy8gT25seSAybmQgbWF0cml4IGhhcyBvZmZzZXQsIG9yIGl0IGlzIHplcm8gCisgICAgICAgICAgICAgIE9mZnNldCA9IERhdGEyLT5PZmZzZXQ7CisKKyAgICAgICAgICAgICAgLy8gTm93IHRoZSByZXN1bHQgaXMgaW4gcmVzICsgRGF0YTIgLT4gT2Zmc2V0LiBNYXliZSBpcyBhIHBsYWluIGlkZW50aXR5PworICAgICAgICAgICAgICBpZiAoX2Ntc01BVDNpc0lkZW50aXR5KCZyZXMpICYmIE9mZnNldCA9PSBOVUxMKSB7CisKKyAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbiBnZXQgcmlkIG9mIGZ1bGwgbWF0cml4CisgICAgICAgICAgICAgICAgICAgICBJZGVudGl0eU1hdCA9IFRSVUU7CisgICAgICAgICAgICAgIH0KKworICAgICAgIH0KKyAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgICBpZiAoY21zUGlwZWxpbmVDaGVja0FuZFJldHJlaXZlU3RhZ2VzKFNyYywgMywKKyAgICAgICAgICAgICAgICAgICAgIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsIGNtc1NpZ01hdHJpeEVsZW1UeXBlLCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgJkN1cnZlMSwgJk1hdHJpeDEsICZDdXJ2ZTIpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgIF9jbXNTdGFnZU1hdHJpeERhdGEqIERhdGEgPSAoX2Ntc1N0YWdlTWF0cml4RGF0YSopY21zU3RhZ2VEYXRhKE1hdHJpeDEpOworCisgICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IHRoZSBtYXRyaXggdG8gb3VyIHJlc3VsdAorICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZyZXMsIERhdGEtPkRvdWJsZSwgc2l6ZW9mKHJlcykpOworCisgICAgICAgICAgICAgICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgT2RmZnNldCAobWF5IGJlIE5VTEwgYXMgYSB6ZXJvIG9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgIE9mZnNldCA9IERhdGEtPk9mZnNldDsKKworICAgICAgICAgICAgICAgICAgICAgaWYgKF9jbXNNQVQzaXNJZGVudGl0eSgmcmVzKSAmJiBPZmZzZXQgPT0gTlVMTCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FuIGdldCByaWQgb2YgZnVsbCBtYXRyaXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGl0eU1hdCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAvLyBOb3Qgb3B0aW1pemVhYmxlIHRoaXMgdGltZQorCisgICAgICAgfQorCisgICAgICAvLyBBbGxvY2F0ZSBhbiBlbXB0eSBMVVQKKyAgICBEZXN0ID0gIGNtc1BpcGVsaW5lQWxsb2MoU3JjIC0+Q29udGV4dElELCBTcmMgLT5JbnB1dENoYW5uZWxzLCBTcmMgLT5PdXRwdXRDaGFubmVscyk7CisgICAgaWYgKCFEZXN0KSByZXR1cm4gRkFMU0U7CisKKyAgICAvLyBBc3NhbWJsZSB0aGUgbmV3IExVVAorICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShEZXN0LCBjbXNBVF9CRUdJTiwgY21zU3RhZ2VEdXAoQ3VydmUxKSkpCisgICAgICAgIGdvdG8gRXJyb3I7CisKKyAgICBpZiAoIUlkZW50aXR5TWF0KSB7CisKKyAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKERlc3QsIGNtc0FUX0VORCwgY21zU3RhZ2VBbGxvY01hdHJpeChEZXN0LT5Db250ZXh0SUQsIDMsIDMsIChjb25zdCBjbXNGbG9hdDY0TnVtYmVyKikmcmVzLCBPZmZzZXQpKSkKKyAgICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKERlc3QsIGNtc0FUX0VORCwgY21zU3RhZ2VEdXAoQ3VydmUyKSkpCisgICAgICAgIGdvdG8gRXJyb3I7CisKKyAgICAvLyBJZiBpZGVudGl0eSBvbiBtYXRyaXgsIHdlIGNhbiBmdXJ0aGVyIG9wdGltaXplIHRoZSBjdXJ2ZXMsIHNvIGNhbGwgdGhlIGpvaW4gY3VydmVzIHJvdXRpbmUKKyAgICBpZiAoSWRlbnRpdHlNYXQpIHsKKworICAgICAgICBPcHRpbWl6ZUJ5Sm9pbmluZ0N1cnZlcygmRGVzdCwgSW50ZW50LCBJbnB1dEZvcm1hdCwgT3V0cHV0Rm9ybWF0LCBkd0ZsYWdzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKiBtcGVDMSA9IChfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSopIGNtc1N0YWdlRGF0YShDdXJ2ZTEpOworICAgICAgICBfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSogbXBlQzIgPSAoX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqKSBjbXNTdGFnZURhdGEoQ3VydmUyKTsKKworICAgICAgICAvLyBJbiB0aGlzIHBhcnRpY3VsYXIgb3B0aW1pemF0aW9uLCBjYWNoZSBkb2VzIG5vdCBoZWxwIGFzIGl0IHRha2VzIG1vcmUgdGltZSB0byBkZWFsIHdpdGgKKyAgICAgICAgLy8gdGhlIGNhY2hlIHRoYXQgd2l0aCB0aGUgcGl4ZWwgaGFuZGxpbmcKKyAgICAgICAgKmR3RmxhZ3MgfD0gY21zRkxBR1NfTk9DQUNIRTsKKworICAgICAgICAvLyBTZXR1cCB0aGUgb3B0aW1pemFyaW9uIHJvdXRpbmVzCisgICAgICAgIGlmICghU2V0TWF0U2hhcGVyKERlc3QsIG1wZUMxIC0+VGhlQ3VydmVzLCAmcmVzLCAoY21zVkVDMyopIE9mZnNldCwgbXBlQzItPlRoZUN1cnZlcywgT3V0cHV0Rm9ybWF0KSkKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgY21zUGlwZWxpbmVGcmVlKFNyYyk7CisgICAgKkx1dCA9IERlc3Q7CisgICAgcmV0dXJuIFRSVUU7CitFcnJvcjoKKyAgICAvLyBMZWF2ZSBTcmMgdW5jaGFuZ2VkCisgICAgY21zUGlwZWxpbmVGcmVlKERlc3QpOworICAgIHJldHVybiBGQUxTRTsKK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcHRpbWl6YXRpb24gcGx1Zy1pbnMKKworLy8gTGlzdCBvZiBvcHRpbWl6YXRpb25zCit0eXBlZGVmIHN0cnVjdCBfY21zT3B0aW1pemF0aW9uQ29sbGVjdGlvbl9zdCB7CisKKyAgICBfY21zT1BUb3B0aW1pemVGbiAgT3B0aW1pemVQdHI7CisKKyAgICBzdHJ1Y3QgX2Ntc09wdGltaXphdGlvbkNvbGxlY3Rpb25fc3QgKk5leHQ7CisKK30gX2Ntc09wdGltaXphdGlvbkNvbGxlY3Rpb247CisKKworLy8gVGhlIGJ1aWx0LWluIGxpc3QuIFdlIGN1cnJlbnRseSBpbXBsZW1lbnQgNCB0eXBlcyBvZiBvcHRpbWl6YXRpb25zLiBKb2luaW5nIG9mIGN1cnZlcywgbWF0cml4LXNoYXBlciwgbGluZWFyaXphdGlvbiBhbmQgcmVzYW1wbGluZworc3RhdGljIF9jbXNPcHRpbWl6YXRpb25Db2xsZWN0aW9uIERlZmF1bHRPcHRpbWl6YXRpb25bXSA9IHsKKworICAgIHsgT3B0aW1pemVCeUpvaW5pbmdDdXJ2ZXMsICAgICAgICAgICAgJkRlZmF1bHRPcHRpbWl6YXRpb25bMV0gfSwKKyAgICB7IE9wdGltaXplTWF0cml4U2hhcGVyLCAgICAgICAgICAgICAgICZEZWZhdWx0T3B0aW1pemF0aW9uWzJdIH0sCisgICAgeyBPcHRpbWl6ZUJ5Q29tcHV0aW5nTGluZWFyaXphdGlvbiwgICAmRGVmYXVsdE9wdGltaXphdGlvblszXSB9LAorICAgIHsgT3B0aW1pemVCeVJlc2FtcGxpbmcsICAgICAgICAgICAgICAgTlVMTCB9Cit9OworCisvLyBUaGUgbGlua2VkIGxpc3QgaGVhZAorX2Ntc09wdGltaXphdGlvblBsdWdpbkNodW5rVHlwZSBfY21zT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmsgPSB7IE5VTEwgfTsKKworCisvLyBEdXBsaWNhdGVzIHRoZSB6b25lIG9mIG1lbW9yeSB1c2VkIGJ5IHRoZSBwbHVnLWluIGluIHRoZSBuZXcgY29udGV4dAorc3RhdGljCit2b2lkIER1cFBsdWdpbk9wdGltaXphdGlvbkxpc3Qoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCit7CisgICBfY21zT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmtUeXBlIG5ld0hlYWQgPSB7IE5VTEwgfTsKKyAgIF9jbXNPcHRpbWl6YXRpb25Db2xsZWN0aW9uKiAgZW50cnk7CisgICBfY21zT3B0aW1pemF0aW9uQ29sbGVjdGlvbiogIEFudGVyaW9yID0gTlVMTDsKKyAgIF9jbXNPcHRpbWl6YXRpb25QbHVnaW5DaHVua1R5cGUqIGhlYWQgPSAoX2Ntc09wdGltaXphdGlvblBsdWdpbkNodW5rVHlwZSopIHNyYy0+Y2h1bmtzW09wdGltaXphdGlvblBsdWdpbl07CisKKyAgICBfY21zQXNzZXJ0KGN0eCAhPSBOVUxMKTsKKyAgICBfY21zQXNzZXJ0KGhlYWQgIT0gTlVMTCk7CisKKyAgICAvLyBXYWxrIHRoZSBsaXN0IGNvcHlpbmcgYWxsIG5vZGVzCisgICBmb3IgKGVudHJ5ID0gaGVhZC0+T3B0aW1pemF0aW9uQ29sbGVjdGlvbjsKKyAgICAgICAgZW50cnkgIT0gTlVMTDsKKyAgICAgICAgZW50cnkgPSBlbnRyeSAtPk5leHQpIHsKKworICAgICAgICAgICAgX2Ntc09wdGltaXphdGlvbkNvbGxlY3Rpb24gKm5ld0VudHJ5ID0gKCBfY21zT3B0aW1pemF0aW9uQ29sbGVjdGlvbiAqKSBfY21zU3ViQWxsb2NEdXAoY3R4IC0+TWVtUG9vbCwgZW50cnksIHNpemVvZihfY21zT3B0aW1pemF0aW9uQ29sbGVjdGlvbikpOworICAgCisgICAgICAgICAgICBpZiAobmV3RW50cnkgPT0gTlVMTCkgCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGtlZXAgdGhlIGxpbmtlZCBsaXN0IG9yZGVyLCBzbyB0aGlzIGlzIGEgbGl0dGxlIGJpdCB0cmlja3kKKyAgICAgICAgICAgIG5ld0VudHJ5IC0+IE5leHQgPSBOVUxMOworICAgICAgICAgICAgaWYgKEFudGVyaW9yKQorICAgICAgICAgICAgICAgIEFudGVyaW9yIC0+IE5leHQgPSBuZXdFbnRyeTsKKyAgICAgCisgICAgICAgICAgICBBbnRlcmlvciA9IG5ld0VudHJ5OworCisgICAgICAgICAgICBpZiAobmV3SGVhZC5PcHRpbWl6YXRpb25Db2xsZWN0aW9uID09IE5VTEwpCisgICAgICAgICAgICAgICAgbmV3SGVhZC5PcHRpbWl6YXRpb25Db2xsZWN0aW9uID0gbmV3RW50cnk7CisgICAgfQorCisgIGN0eCAtPmNodW5rc1tPcHRpbWl6YXRpb25QbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eC0+TWVtUG9vbCwgJm5ld0hlYWQsIHNpemVvZihfY21zT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmtUeXBlKSk7Cit9CisKK3ZvaWQgIF9jbXNBbGxvY09wdGltaXphdGlvblBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKK3sKKyAgaWYgKHNyYyAhPSBOVUxMKSB7CisKKyAgICAgICAgLy8gQ29weSBhbGwgbGlua2VkIGxpc3QKKyAgICAgICBEdXBQbHVnaW5PcHRpbWl6YXRpb25MaXN0KGN0eCwgc3JjKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN0YXRpYyBfY21zT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmtUeXBlIE9wdGltaXphdGlvblBsdWdpbkNodW5rVHlwZSA9IHsgTlVMTCB9OworICAgICAgICBjdHggLT5jaHVua3NbT3B0aW1pemF0aW9uUGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCAmT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmtUeXBlLCBzaXplb2YoX2Ntc09wdGltaXphdGlvblBsdWdpbkNodW5rVHlwZSkpOworICAgIH0KK30KKworCisvLyBSZWdpc3RlciBuZXcgd2F5cyB0byBvcHRpbWl6ZQorY21zQm9vbCAgX2Ntc1JlZ2lzdGVyT3B0aW1pemF0aW9uUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBEYXRhKQoreworICAgIGNtc1BsdWdpbk9wdGltaXphdGlvbiogUGx1Z2luID0gKGNtc1BsdWdpbk9wdGltaXphdGlvbiopIERhdGE7CisgICAgX2Ntc09wdGltaXphdGlvblBsdWdpbkNodW5rVHlwZSogY3R4ID0gKCBfY21zT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIE9wdGltaXphdGlvblBsdWdpbik7CisgICAgX2Ntc09wdGltaXphdGlvbkNvbGxlY3Rpb24qIGZsOworCisgICAgaWYgKERhdGEgPT0gTlVMTCkgeworCisgICAgICAgIGN0eC0+T3B0aW1pemF0aW9uQ29sbGVjdGlvbiA9IE5VTEw7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIC8vIE9wdGltaXplciBjYWxsYmFjayBpcyByZXF1aXJlZAorICAgIGlmIChQbHVnaW4gLT5PcHRpbWl6ZVB0ciA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICBmbCA9IChfY21zT3B0aW1pemF0aW9uQ29sbGVjdGlvbiopIF9jbXNQbHVnaW5NYWxsb2MoQ29udGV4dElELCBzaXplb2YoX2Ntc09wdGltaXphdGlvbkNvbGxlY3Rpb24pKTsKKyAgICBpZiAoZmwgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworCisgICAgLy8gQ29weSB0aGUgcGFyYW1ldGVycworICAgIGZsIC0+T3B0aW1pemVQdHIgPSBQbHVnaW4gLT5PcHRpbWl6ZVB0cjsKKworICAgIC8vIEtlZXAgbGlua2VkIGxpc3QKKyAgICBmbCAtPk5leHQgPSBjdHgtPk9wdGltaXphdGlvbkNvbGxlY3Rpb247CisKKyAgICAvLyBTZXQgdGhlIGhlYWQKKyAgICBjdHggLT5PcHRpbWl6YXRpb25Db2xsZWN0aW9uID0gZmw7CisKKyAgICAvLyBBbGwgaXMgb2sKKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gVGhlIGVudHJ5IHBvaW50IGZvciBMVVQgb3B0aW1pemF0aW9uCitjbXNCb29sIF9jbXNPcHRpbWl6ZVBpcGVsaW5lKGNtc0NvbnRleHQgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNQaXBlbGluZSoqICAgIFB0ckx1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBJbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciogSW5wdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciogT3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIqIGR3RmxhZ3MpCit7CisgICAgX2Ntc09wdGltaXphdGlvblBsdWdpbkNodW5rVHlwZSogY3R4ID0gKCBfY21zT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIE9wdGltaXphdGlvblBsdWdpbik7CisgICAgX2Ntc09wdGltaXphdGlvbkNvbGxlY3Rpb24qIE9wdHM7CisgICAgY21zQm9vbCBBbnlTdWNjZXNzID0gRkFMU0U7CisKKyAgICAvLyBBIENMVVQgaXMgYmVpbmcgYXNrZWQsIHNvIGZvcmNlIHRoaXMgc3BlY2lmaWMgb3B0aW1pemF0aW9uCisgICAgaWYgKCpkd0ZsYWdzICYgY21zRkxBR1NfRk9SQ0VfQ0xVVCkgeworCisgICAgICAgIFByZU9wdGltaXplKCpQdHJMdXQpOworICAgICAgICByZXR1cm4gT3B0aW1pemVCeVJlc2FtcGxpbmcoUHRyTHV0LCBJbnRlbnQsIElucHV0Rm9ybWF0LCBPdXRwdXRGb3JtYXQsIGR3RmxhZ3MpOworICAgIH0KKworICAgIC8vIEFueXRoaW5nIHRvIG9wdGltaXplPworICAgIGlmICgoKlB0ckx1dCkgLT5FbGVtZW50cyA9PSBOVUxMKSB7CisgICAgICAgIF9jbXNQaXBlbGluZVNldE9wdGltaXphdGlvblBhcmFtZXRlcnMoKlB0ckx1dCwgRmFzdElkZW50aXR5MTYsICh2b2lkKikgKlB0ckx1dCwgTlVMTCwgTlVMTCk7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIC8vIFRyeSB0byBnZXQgcmlkIG9mIGlkZW50aXRpZXMgYW5kIHRyaXZpYWwgY29udmVyc2lvbnMuCisgICAgQW55U3VjY2VzcyA9IFByZU9wdGltaXplKCpQdHJMdXQpOworCisgICAgLy8gQWZ0ZXIgcmVtb3ZhbCBkbyB3ZSBlbmQgd2l0aCBhbiBpZGVudGl0eT8KKyAgICBpZiAoKCpQdHJMdXQpIC0+RWxlbWVudHMgPT0gTlVMTCkgeworICAgICAgICBfY21zUGlwZWxpbmVTZXRPcHRpbWl6YXRpb25QYXJhbWV0ZXJzKCpQdHJMdXQsIEZhc3RJZGVudGl0eTE2LCAodm9pZCopICpQdHJMdXQsIE5VTEwsIE5VTEwpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICAvLyBEbyBub3Qgb3B0aW1pemUsIGtlZXAgYWxsIHByZWNpc2lvbgorICAgIGlmICgqZHdGbGFncyAmIGNtc0ZMQUdTX05PT1BUSU1JWkUpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIC8vIFRyeSBwbHVnLWluIG9wdGltaXphdGlvbnMgCisgICAgZm9yIChPcHRzID0gY3R4LT5PcHRpbWl6YXRpb25Db2xsZWN0aW9uOworICAgICAgICAgT3B0cyAhPSBOVUxMOworICAgICAgICAgT3B0cyA9IE9wdHMgLT5OZXh0KSB7CisKKyAgICAgICAgICAgIC8vIElmIG9uZSBzY2hlbWEgc3VjY2VlZGVkLCB3ZSBhcmUgZG9uZQorICAgICAgICAgICAgaWYgKE9wdHMgLT5PcHRpbWl6ZVB0cihQdHJMdXQsIEludGVudCwgSW5wdXRGb3JtYXQsIE91dHB1dEZvcm1hdCwgZHdGbGFncykpIHsKKworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOyAgICAvLyBPcHRpbWl6ZWQhCisgICAgICAgICAgICB9CisgICAgfQorCisgICAvLyBUcnkgYnVpbHQtaW4gb3B0aW1pemF0aW9ucyAKKyAgICBmb3IgKE9wdHMgPSBEZWZhdWx0T3B0aW1pemF0aW9uOworICAgICAgICAgT3B0cyAhPSBOVUxMOworICAgICAgICAgT3B0cyA9IE9wdHMgLT5OZXh0KSB7CisKKyAgICAgICAgICAgIGlmIChPcHRzIC0+T3B0aW1pemVQdHIoUHRyTHV0LCBJbnRlbnQsIElucHV0Rm9ybWF0LCBPdXRwdXRGb3JtYXQsIGR3RmxhZ3MpKSB7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsgIAorICAgICAgICAgICAgfQorICAgIH0KKworICAgIC8vIE9ubHkgc2ltcGxlIG9wdGltaXphdGlvbnMgc3VjY2VlZGVkCisgICAgcmV0dXJuIEFueVN1Y2Nlc3M7Cit9CisKKworCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNwYWNrLmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNwYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkNDFkYQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3BhY2suYwpAQCAtMCwwICsxLDMzNTQgQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8KKy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisvLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKKy8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisvLworLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKy8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorLy8KKy8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCisvLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQorLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisvLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKworI2luY2x1ZGUgImxjbXMyX2ludGVybmFsLmgiCisKKy8vIFRoaXMgbW9kdWxlIGhhbmRsZXMgYWxsIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IGxjbXMuIFRoZXJlIGFyZSB0d28gZmxhdm9ycywgMTYgYml0cyBhbmQKKy8vIGZsb2F0aW5nIHBvaW50LiBGbG9hdGluZyBwb2ludCBpcyBzdXBwb3J0ZWQgb25seSBpbiBhIHN1YnNldCwgdGhvc2UgZm9ybWF0cyBob2xkaW5nCisvLyBjbXNGbG9hdDMyTnVtYmVyICg0IGJ5dGVzIHBlciBjb21wb25lbnQpIGFuZCBkb3VibGUgKG1hcmtlZCBhcyAwIGJ5dGVzIHBlciBjb21wb25lbnQKKy8vIGFzIHNwZWNpYWwgY2FzZSkKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworLy8gVGhpcyBtYWNybyByZXR1cm4gd29yZHMgc3RvcmVkIGFzIGJpZyBlbmRpYW4KKyNkZWZpbmUgQ0hBTkdFX0VORElBTih3KSAgICAoY21zVUludDE2TnVtYmVyKSAoKGNtc1VJbnQxNk51bWJlcikgKCh3KTw8OCl8KCh3KT4+OCkpCisKKy8vIFRoZXNlIG1hY3JvcyBoYW5kbGVzIHJldmVyc2luZyAobmVnYXRpdmUpCisjZGVmaW5lIFJFVkVSU0VfRkxBVk9SXzgoeCkgICAgICgoY21zVUludDhOdW1iZXIpICgweGZmLSh4KSkpCisjZGVmaW5lIFJFVkVSU0VfRkxBVk9SXzE2KHgpICAgICgoY21zVUludDE2TnVtYmVyKSgweGZmZmYtKHgpKSkKKworLy8gKiAweGZmZmYgLyAweGZmMDAgPSAoMjU1ICogMjU3KSAvICgyNTUgKiAyNTYpID0gMjU3IC8gMjU2CitjbXNJTkxJTkUgY21zVUludDE2TnVtYmVyIEZvbUxhYlYyVG9MYWJWNChjbXNVSW50MTZOdW1iZXIgeCkKK3sKKyAgICBpbnQgYSA9ICh4IDw8IDggfCB4KSA+PiA4OyAgLy8gKiAyNTcgLyAyNTYKKyAgICBpZiAoIGEgPiAweGZmZmYpIHJldHVybiAweGZmZmY7CisgICAgcmV0dXJuIChjbXNVSW50MTZOdW1iZXIpIGE7Cit9CisKKy8vICogMHhmMDAgLyAweGZmZmYgPSAqIDI1NiAvIDI1NworY21zSU5MSU5FIGNtc1VJbnQxNk51bWJlciBGb21MYWJWNFRvTGFiVjIoY21zVUludDE2TnVtYmVyIHgpCit7CisgICAgcmV0dXJuIChjbXNVSW50MTZOdW1iZXIpICgoKHggPDwgOCkgKyAweDgwKSAvIDI1Nyk7Cit9CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNtc1VJbnQzMk51bWJlciBUeXBlOworICAgIGNtc1VJbnQzMk51bWJlciBNYXNrOworICAgIGNtc0Zvcm1hdHRlcjE2ICBGcm07CisKK30gY21zRm9ybWF0dGVyczE2OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY21zVUludDMyTnVtYmVyICAgIFR5cGU7CisgICAgY21zVUludDMyTnVtYmVyICAgIE1hc2s7CisgICAgY21zRm9ybWF0dGVyRmxvYXQgIEZybTsKKworfSBjbXNGb3JtYXR0ZXJzRmxvYXQ7CisKKworI2RlZmluZSBBTllTUEFDRSAgICAgICAgQ09MT1JTUEFDRV9TSCgzMSkKKyNkZWZpbmUgQU5ZQ0hBTk5FTFMgICAgIENIQU5ORUxTX1NIKDE1KQorI2RlZmluZSBBTllFWFRSQSAgICAgICAgRVhUUkFfU0goNykKKyNkZWZpbmUgQU5ZUExBTkFSICAgICAgIFBMQU5BUl9TSCgxKQorI2RlZmluZSBBTllFTkRJQU4gICAgICAgRU5ESUFOMTZfU0goMSkKKyNkZWZpbmUgQU5ZU1dBUCAgICAgICAgIERPU1dBUF9TSCgxKQorI2RlZmluZSBBTllTV0FQRklSU1QgICAgU1dBUEZJUlNUX1NIKDEpCisjZGVmaW5lIEFOWUZMQVZPUiAgICAgICBGTEFWT1JfU0goMSkKKworCisvLyBTdXBwcmVzcyB3YW5pbmcgYWJvdXQgaW5mbyBuZXZlciBiZWluZyB1c2VkCisKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0MTAwKQorI2VuZGlmCisKKy8vIFVucGFja2luZyByb3V0aW5lcyAoMTYgYml0cykgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKy8vIERvZXMgYWxtb3N0IGV2ZXJ5dGhpbmcgYnV0IGlzIHNsb3cKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFVucm9sbENodW5reUJ5dGVzKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIGludCBuQ2hhbiAgICAgID0gVF9DSEFOTkVMUyhpbmZvIC0+IElucHV0Rm9ybWF0KTsKKyAgICBpbnQgRG9Td2FwICAgICA9IFRfRE9TV0FQKGluZm8gLT5JbnB1dEZvcm1hdCk7CisgICAgaW50IFJldmVyc2UgICAgPSBUX0ZMQVZPUihpbmZvIC0+SW5wdXRGb3JtYXQpOworICAgIGludCBTd2FwRmlyc3QgID0gVF9TV0FQRklSU1QoaW5mbyAtPiBJbnB1dEZvcm1hdCk7CisgICAgaW50IEV4dHJhICAgICAgPSBUX0VYVFJBKGluZm8gLT4gSW5wdXRGb3JtYXQpOworICAgIGludCBFeHRyYUZpcnN0ID0gRG9Td2FwIF4gU3dhcEZpcnN0OworICAgIGNtc1VJbnQxNk51bWJlciB2OworICAgIGludCBpOworCisgICAgaWYgKEV4dHJhRmlyc3QpIHsKKyAgICAgICAgYWNjdW0gKz0gRXh0cmE7CisgICAgfQorCisgICAgZm9yIChpPTA7IGkgPCBuQ2hhbjsgaSsrKSB7CisgICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7CisKKyAgICAgICAgdiA9IEZST01fOF9UT18xNigqYWNjdW0pOworICAgICAgICB2ID0gUmV2ZXJzZSA/IFJFVkVSU0VfRkxBVk9SXzE2KHYpIDogdjsKKyAgICAgICAgd0luW2luZGV4XSA9IHY7CisgICAgICAgIGFjY3VtKys7CisgICAgfQorCisgICAgaWYgKCFFeHRyYUZpcnN0KSB7CisgICAgICAgIGFjY3VtICs9IEV4dHJhOworICAgIH0KKworICAgIGlmIChFeHRyYSA9PSAwICYmIFN3YXBGaXJzdCkgeworICAgICAgICBjbXNVSW50MTZOdW1iZXIgdG1wID0gd0luWzBdOworCisgICAgICAgIG1lbW1vdmUoJndJblswXSwgJndJblsxXSwgKG5DaGFuLTEpICogc2l6ZW9mKGNtc1VJbnQxNk51bWJlcikpOworICAgICAgICB3SW5bbkNoYW4tMV0gPSB0bXA7CisgICAgfQorCisgICAgcmV0dXJuIGFjY3VtOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7CisKK30KKworLy8gRXh0cmEgY2hhbm5lbHMgYXJlIGp1c3QgaWdub3JlZCBiZWNhdXNlIGNvbWUgaW4gdGhlIG5leHQgcGxhbmVzCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBVbnJvbGxQbGFuYXJCeXRlcyhyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3SW5bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICBpbnQgbkNoYW4gICAgID0gVF9DSEFOTkVMUyhpbmZvIC0+IElucHV0Rm9ybWF0KTsKKyAgICBpbnQgRG9Td2FwICAgID0gVF9ET1NXQVAoaW5mbyAtPklucHV0Rm9ybWF0KTsKKyAgICBpbnQgU3dhcEZpcnN0ID0gVF9TV0FQRklSU1QoaW5mbyAtPklucHV0Rm9ybWF0KTsKKyAgICBpbnQgUmV2ZXJzZSAgID0gVF9GTEFWT1IoaW5mbyAtPklucHV0Rm9ybWF0KTsKKyAgICBpbnQgaTsKKyAgICBjbXNVSW50OE51bWJlciogSW5pdCA9IGFjY3VtOworCisgICAgaWYgKERvU3dhcCBeIFN3YXBGaXJzdCkgeworICAgICAgICBhY2N1bSArPSBUX0VYVFJBKGluZm8gLT4gSW5wdXRGb3JtYXQpICogU3RyaWRlOworICAgIH0KKworICAgIGZvciAoaT0wOyBpIDwgbkNoYW47IGkrKykgeworCisgICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7CisgICAgICAgIGNtc1VJbnQxNk51bWJlciB2ID0gRlJPTV84X1RPXzE2KCphY2N1bSk7CisKKyAgICAgICAgd0luW2luZGV4XSA9IFJldmVyc2UgPyBSRVZFUlNFX0ZMQVZPUl8xNih2KSA6IHY7CisgICAgICAgIGFjY3VtICs9IFN0cmlkZTsKKyAgICB9CisKKyAgICByZXR1cm4gKEluaXQgKyAxKTsKK30KKworLy8gU3BlY2lhbCBjYXNlcywgcHJvdmlkZWQgZm9yIHBlcmZvcm1hbmNlCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBVbnJvbGw0Qnl0ZXMocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgd0luWzBdID0gRlJPTV84X1RPXzE2KCphY2N1bSk7IGFjY3VtKys7IC8vIEMKKyAgICB3SW5bMV0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgLy8gTQorICAgIHdJblsyXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAvLyBZCisgICAgd0luWzNdID0gRlJPTV84X1RPXzE2KCphY2N1bSk7IGFjY3VtKys7IC8vIEsKKworICAgIHJldHVybiBhY2N1bTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBVbnJvbGw0Qnl0ZXNSZXZlcnNlKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIHdJblswXSA9IEZST01fOF9UT18xNihSRVZFUlNFX0ZMQVZPUl84KCphY2N1bSkpOyBhY2N1bSsrOyAvLyBDCisgICAgd0luWzFdID0gRlJPTV84X1RPXzE2KFJFVkVSU0VfRkxBVk9SXzgoKmFjY3VtKSk7IGFjY3VtKys7IC8vIE0KKyAgICB3SW5bMl0gPSBGUk9NXzhfVE9fMTYoUkVWRVJTRV9GTEFWT1JfOCgqYWNjdW0pKTsgYWNjdW0rKzsgLy8gWQorICAgIHdJblszXSA9IEZST01fOF9UT18xNihSRVZFUlNFX0ZMQVZPUl84KCphY2N1bSkpOyBhY2N1bSsrOyAvLyBLCisKKyAgICByZXR1cm4gYWNjdW07CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworc3RhdGljCitjbXNVSW50OE51bWJlciogVW5yb2xsNEJ5dGVzU3dhcEZpcnN0KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3SW5bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIGFjY3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIHdJblszXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAvLyBLCisgICAgd0luWzBdID0gRlJPTV84X1RPXzE2KCphY2N1bSk7IGFjY3VtKys7IC8vIEMKKyAgICB3SW5bMV0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgLy8gTQorICAgIHdJblsyXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAvLyBZCisKKyAgICByZXR1cm4gYWNjdW07CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworLy8gS1lNQworc3RhdGljCitjbXNVSW50OE51bWJlciogVW5yb2xsNEJ5dGVzU3dhcChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIGFjY3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICB3SW5bM10gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgIC8vIEsKKyAgICB3SW5bMl0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgIC8vIFkKKyAgICB3SW5bMV0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgIC8vIE0KKyAgICB3SW5bMF0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgIC8vIEMKKworICAgIHJldHVybiBhY2N1bTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBVbnJvbGw0Qnl0ZXNTd2FwU3dhcEZpcnN0KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIHdJblsyXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAgLy8gSworICAgIHdJblsxXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAgLy8gWQorICAgIHdJblswXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAgLy8gTQorICAgIHdJblszXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAgLy8gQworCisgICAgcmV0dXJuIGFjY3VtOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFVucm9sbDNCeXRlcyhyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICB3SW5bMF0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgICAgIC8vIFIKKyAgICB3SW5bMV0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgICAgIC8vIEcKKyAgICB3SW5bMl0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgICAgIC8vIEIKKworICAgIHJldHVybiBhY2N1bTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBVbnJvbGwzQnl0ZXNTa2lwMVN3YXAocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgYWNjdW0rKzsgLy8gQQorICAgIHdJblsyXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAvLyBCCisgICAgd0luWzFdID0gRlJPTV84X1RPXzE2KCphY2N1bSk7IGFjY3VtKys7IC8vIEcKKyAgICB3SW5bMF0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgLy8gUgorCisgICAgcmV0dXJuIGFjY3VtOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFVucm9sbDNCeXRlc1NraXAxU3dhcFN3YXBGaXJzdChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIHdJblsyXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAvLyBCCisgICAgd0luWzFdID0gRlJPTV84X1RPXzE2KCphY2N1bSk7IGFjY3VtKys7IC8vIEcKKyAgICB3SW5bMF0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgLy8gUgorICAgIGFjY3VtKys7IC8vIEEKKworICAgIHJldHVybiBhY2N1bTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBVbnJvbGwzQnl0ZXNTa2lwMVN3YXBGaXJzdChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIGFjY3VtKys7IC8vIEEKKyAgICB3SW5bMF0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgLy8gUgorICAgIHdJblsxXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAvLyBHCisgICAgd0luWzJdID0gRlJPTV84X1RPXzE2KCphY2N1bSk7IGFjY3VtKys7IC8vIEIKKworICAgIHJldHVybiBhY2N1bTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCisKKy8vIEJSRworc3RhdGljCitjbXNVSW50OE51bWJlciogVW5yb2xsM0J5dGVzU3dhcChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIGFjY3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICB3SW5bMl0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgICAgIC8vIEIKKyAgICB3SW5bMV0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgICAgIC8vIEcKKyAgICB3SW5bMF0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgICAgIC8vIFIKKworICAgIHJldHVybiBhY2N1bTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBVbnJvbGxMYWJWMl84KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIHdJblswXSA9IEZvbUxhYlYyVG9MYWJWNChGUk9NXzhfVE9fMTYoKmFjY3VtKSk7IGFjY3VtKys7ICAgICAvLyBMCisgICAgd0luWzFdID0gRm9tTGFiVjJUb0xhYlY0KEZST01fOF9UT18xNigqYWNjdW0pKTsgYWNjdW0rKzsgICAgIC8vIGEKKyAgICB3SW5bMl0gPSBGb21MYWJWMlRvTGFiVjQoRlJPTV84X1RPXzE2KCphY2N1bSkpOyBhY2N1bSsrOyAgICAgLy8gYgorCisgICAgcmV0dXJuIGFjY3VtOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFVucm9sbEFMYWJWMl84KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIGFjY3VtKys7ICAvLyBBCisgICAgd0luWzBdID0gRm9tTGFiVjJUb0xhYlY0KEZST01fOF9UT18xNigqYWNjdW0pKTsgYWNjdW0rKzsgICAgIC8vIEwKKyAgICB3SW5bMV0gPSBGb21MYWJWMlRvTGFiVjQoRlJPTV84X1RPXzE2KCphY2N1bSkpOyBhY2N1bSsrOyAgICAgLy8gYQorICAgIHdJblsyXSA9IEZvbUxhYlYyVG9MYWJWNChGUk9NXzhfVE9fMTYoKmFjY3VtKSk7IGFjY3VtKys7ICAgICAvLyBiCisKKyAgICByZXR1cm4gYWNjdW07CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworc3RhdGljCitjbXNVSW50OE51bWJlciogVW5yb2xsTGFiVjJfMTYocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIGFjY3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgd0luWzBdID0gRm9tTGFiVjJUb0xhYlY0KCooY21zVUludDE2TnVtYmVyKikgYWNjdW0pOyBhY2N1bSArPSAyOyAgICAgLy8gTAorICAgIHdJblsxXSA9IEZvbUxhYlYyVG9MYWJWNCgqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtKTsgYWNjdW0gKz0gMjsgICAgIC8vIGEKKyAgICB3SW5bMl0gPSBGb21MYWJWMlRvTGFiVjQoKihjbXNVSW50MTZOdW1iZXIqKSBhY2N1bSk7IGFjY3VtICs9IDI7ICAgICAvLyBiCisKKyAgICByZXR1cm4gYWNjdW07CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworLy8gZm9yIGR1cGxleAorc3RhdGljCitjbXNVSW50OE51bWJlciogVW5yb2xsMkJ5dGVzKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIHdJblswXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAgICAgLy8gY2gxCisgICAgd0luWzFdID0gRlJPTV84X1RPXzE2KCphY2N1bSk7IGFjY3VtKys7ICAgICAvLyBjaDIKKworICAgIHJldHVybiBhY2N1bTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCisKKworCisvLyBNb25vY2hyb21lIGR1cGxpY2F0ZXMgTCBpbnRvIFJHQiBmb3IgbnVsbC10cmFuc2Zvcm1zCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBVbnJvbGwxQnl0ZShyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3SW5bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICB3SW5bMF0gPSB3SW5bMV0gPSB3SW5bMl0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgICAgIC8vIEwKKworICAgIHJldHVybiBhY2N1bTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFVucm9sbDFCeXRlU2tpcDEocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3SW5bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgd0luWzBdID0gd0luWzFdID0gd0luWzJdID0gRlJPTV84X1RPXzE2KCphY2N1bSk7IGFjY3VtKys7ICAgICAvLyBMCisgICAgYWNjdW0gKz0gMTsKKworICAgIHJldHVybiBhY2N1bTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBVbnJvbGwxQnl0ZVNraXAyKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIHdJblswXSA9IHdJblsxXSA9IHdJblsyXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAgICAgLy8gTAorICAgIGFjY3VtICs9IDI7CisKKyAgICByZXR1cm4gYWNjdW07CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworc3RhdGljCitjbXNVSW50OE51bWJlciogVW5yb2xsMUJ5dGVSZXZlcnNlZChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIGFjY3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICB3SW5bMF0gPSB3SW5bMV0gPSB3SW5bMl0gPSBSRVZFUlNFX0ZMQVZPUl8xNihGUk9NXzhfVE9fMTYoKmFjY3VtKSk7IGFjY3VtKys7ICAgICAvLyBMCisKKyAgICByZXR1cm4gYWNjdW07CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBVbnJvbGxBbnlXb3JkcyhyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3SW5bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICBpbnQgbkNoYW4gICAgICAgPSBUX0NIQU5ORUxTKGluZm8gLT4gSW5wdXRGb3JtYXQpOworICAgIGludCBTd2FwRW5kaWFuICA9IFRfRU5ESUFOMTYoaW5mbyAtPiBJbnB1dEZvcm1hdCk7CisgICAgaW50IERvU3dhcCAgICAgID0gVF9ET1NXQVAoaW5mbyAtPklucHV0Rm9ybWF0KTsKKyAgICBpbnQgUmV2ZXJzZSAgICAgPSBUX0ZMQVZPUihpbmZvIC0+SW5wdXRGb3JtYXQpOworICAgIGludCBTd2FwRmlyc3QgICA9IFRfU1dBUEZJUlNUKGluZm8gLT4gSW5wdXRGb3JtYXQpOworICAgIGludCBFeHRyYSAgICAgICA9IFRfRVhUUkEoaW5mbyAtPiBJbnB1dEZvcm1hdCk7CisgICAgaW50IEV4dHJhRmlyc3QgID0gRG9Td2FwIF4gU3dhcEZpcnN0OworICAgIGludCBpOworCisgICAgaWYgKEV4dHJhRmlyc3QpIHsKKyAgICAgICAgYWNjdW0gKz0gRXh0cmEgKiBzaXplb2YoY21zVUludDE2TnVtYmVyKTsKKyAgICB9CisKKyAgICBmb3IgKGk9MDsgaSA8IG5DaGFuOyBpKyspIHsKKworICAgICAgICBpbnQgaW5kZXggPSBEb1N3YXAgPyAobkNoYW4gLSBpIC0gMSkgOiBpOworICAgICAgICBjbXNVSW50MTZOdW1iZXIgdiA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07CisKKyAgICAgICAgaWYgKFN3YXBFbmRpYW4pCisgICAgICAgICAgICB2ID0gQ0hBTkdFX0VORElBTih2KTsKKworICAgICAgICB3SW5baW5kZXhdID0gUmV2ZXJzZSA/IFJFVkVSU0VfRkxBVk9SXzE2KHYpIDogdjsKKworICAgICAgICBhY2N1bSArPSBzaXplb2YoY21zVUludDE2TnVtYmVyKTsKKyAgICB9CisKKyAgICBpZiAoIUV4dHJhRmlyc3QpIHsKKyAgICAgICAgYWNjdW0gKz0gRXh0cmEgKiBzaXplb2YoY21zVUludDE2TnVtYmVyKTsKKyAgICB9CisKKyAgICBpZiAoRXh0cmEgPT0gMCAmJiBTd2FwRmlyc3QpIHsKKworICAgICAgICBjbXNVSW50MTZOdW1iZXIgdG1wID0gd0luWzBdOworCisgICAgICAgIG1lbW1vdmUoJndJblswXSwgJndJblsxXSwgKG5DaGFuLTEpICogc2l6ZW9mKGNtc1VJbnQxNk51bWJlcikpOworICAgICAgICB3SW5bbkNoYW4tMV0gPSB0bXA7CisgICAgfQorCisgICAgcmV0dXJuIGFjY3VtOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBVbnJvbGxQbGFuYXJXb3JkcyhyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3SW5bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICBpbnQgbkNoYW4gPSBUX0NIQU5ORUxTKGluZm8gLT4gSW5wdXRGb3JtYXQpOworICAgIGludCBEb1N3YXA9IFRfRE9TV0FQKGluZm8gLT5JbnB1dEZvcm1hdCk7CisgICAgaW50IFJldmVyc2U9IFRfRkxBVk9SKGluZm8gLT5JbnB1dEZvcm1hdCk7CisgICAgaW50IFN3YXBFbmRpYW4gPSBUX0VORElBTjE2KGluZm8gLT4gSW5wdXRGb3JtYXQpOworICAgIGludCBpOworICAgIGNtc1VJbnQ4TnVtYmVyKiBJbml0ID0gYWNjdW07CisKKyAgICBpZiAoRG9Td2FwKSB7CisgICAgICAgIGFjY3VtICs9IFRfRVhUUkEoaW5mbyAtPiBJbnB1dEZvcm1hdCkgKiBTdHJpZGUgKiBzaXplb2YoY21zVUludDE2TnVtYmVyKTsKKyAgICB9CisKKyAgICBmb3IgKGk9MDsgaSA8IG5DaGFuOyBpKyspIHsKKworICAgICAgICBpbnQgaW5kZXggPSBEb1N3YXAgPyAobkNoYW4gLSBpIC0gMSkgOiBpOworICAgICAgICBjbXNVSW50MTZOdW1iZXIgdiA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07CisKKyAgICAgICAgaWYgKFN3YXBFbmRpYW4pCisgICAgICAgICAgICB2ID0gQ0hBTkdFX0VORElBTih2KTsKKworICAgICAgICB3SW5baW5kZXhdID0gUmV2ZXJzZSA/IFJFVkVSU0VfRkxBVk9SXzE2KHYpIDogdjsKKworICAgICAgICBhY2N1bSArPSAgU3RyaWRlICogc2l6ZW9mKGNtc1VJbnQxNk51bWJlcik7CisgICAgfQorCisgICAgcmV0dXJuIChJbml0ICsgc2l6ZW9mKGNtc1VJbnQxNk51bWJlcikpOworfQorCisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFVucm9sbDRXb3JkcyhyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICB3SW5bMF0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7IC8vIEMKKyAgICB3SW5bMV0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7IC8vIE0KKyAgICB3SW5bMl0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7IC8vIFkKKyAgICB3SW5bM10gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7IC8vIEsKKworICAgIHJldHVybiBhY2N1bTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBVbnJvbGw0V29yZHNSZXZlcnNlKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIHdJblswXSA9IFJFVkVSU0VfRkxBVk9SXzE2KCooY21zVUludDE2TnVtYmVyKikgYWNjdW0pOyBhY2N1bSs9IDI7IC8vIEMKKyAgICB3SW5bMV0gPSBSRVZFUlNFX0ZMQVZPUl8xNigqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtKTsgYWNjdW0rPSAyOyAvLyBNCisgICAgd0luWzJdID0gUkVWRVJTRV9GTEFWT1JfMTYoKihjbXNVSW50MTZOdW1iZXIqKSBhY2N1bSk7IGFjY3VtKz0gMjsgLy8gWQorICAgIHdJblszXSA9IFJFVkVSU0VfRkxBVk9SXzE2KCooY21zVUludDE2TnVtYmVyKikgYWNjdW0pOyBhY2N1bSs9IDI7IC8vIEsKKworICAgIHJldHVybiBhY2N1bTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBVbnJvbGw0V29yZHNTd2FwRmlyc3QocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgd0luWzNdID0gKihjbXNVSW50MTZOdW1iZXIqKSBhY2N1bTsgYWNjdW0rPSAyOyAvLyBLCisgICAgd0luWzBdID0gKihjbXNVSW50MTZOdW1iZXIqKSBhY2N1bTsgYWNjdW0rPSAyOyAvLyBDCisgICAgd0luWzFdID0gKihjbXNVSW50MTZOdW1iZXIqKSBhY2N1bTsgYWNjdW0rPSAyOyAvLyBNCisgICAgd0luWzJdID0gKihjbXNVSW50MTZOdW1iZXIqKSBhY2N1bTsgYWNjdW0rPSAyOyAvLyBZCisKKyAgICByZXR1cm4gYWNjdW07CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworLy8gS1lNQworc3RhdGljCitjbXNVSW50OE51bWJlciogVW5yb2xsNFdvcmRzU3dhcChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIGFjY3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICB3SW5bM10gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7IC8vIEsKKyAgICB3SW5bMl0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7IC8vIFkKKyAgICB3SW5bMV0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7IC8vIE0KKyAgICB3SW5bMF0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7IC8vIEMKKworICAgIHJldHVybiBhY2N1bTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBVbnJvbGw0V29yZHNTd2FwU3dhcEZpcnN0KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIHdJblsyXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtKz0gMjsgLy8gSworICAgIHdJblsxXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtKz0gMjsgLy8gWQorICAgIHdJblswXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtKz0gMjsgLy8gTQorICAgIHdJblszXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtKz0gMjsgLy8gQworCisgICAgcmV0dXJuIGFjY3VtOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFVucm9sbDNXb3JkcyhyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICB3SW5bMF0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7ICAvLyBDIFIKKyAgICB3SW5bMV0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7ICAvLyBNIEcKKyAgICB3SW5bMl0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7ICAvLyBZIEIKKworICAgIHJldHVybiBhY2N1bTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBVbnJvbGwzV29yZHNTd2FwKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIHdJblsyXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtKz0gMjsgIC8vIEMgUgorICAgIHdJblsxXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtKz0gMjsgIC8vIE0gRworICAgIHdJblswXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtKz0gMjsgIC8vIFkgQgorCisgICAgcmV0dXJuIGFjY3VtOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFVucm9sbDNXb3Jkc1NraXAxU3dhcChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICBhY2N1bSArPSAyOyAvLyBBCisgICAgd0luWzJdID0gKihjbXNVSW50MTZOdW1iZXIqKSBhY2N1bTsgYWNjdW0gKz0gMjsgLy8gUgorICAgIHdJblsxXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtICs9IDI7IC8vIEcKKyAgICB3SW5bMF0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSArPSAyOyAvLyBCCisKKyAgICByZXR1cm4gYWNjdW07CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworc3RhdGljCitjbXNVSW50OE51bWJlciogVW5yb2xsM1dvcmRzU2tpcDFTd2FwRmlyc3QocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIGFjY3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgYWNjdW0gKz0gMjsgLy8gQQorICAgIHdJblswXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtICs9IDI7IC8vIFIKKyAgICB3SW5bMV0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSArPSAyOyAvLyBHCisgICAgd0luWzJdID0gKihjbXNVSW50MTZOdW1iZXIqKSBhY2N1bTsgYWNjdW0gKz0gMjsgLy8gQgorCisgICAgcmV0dXJuIGFjY3VtOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFVucm9sbDFXb3JkKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIHdJblswXSA9IHdJblsxXSA9IHdJblsyXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtKz0gMjsgICAvLyBMCisKKyAgICByZXR1cm4gYWNjdW07CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworc3RhdGljCitjbXNVSW50OE51bWJlciogVW5yb2xsMVdvcmRSZXZlcnNlZChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIGFjY3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICB3SW5bMF0gPSB3SW5bMV0gPSB3SW5bMl0gPSBSRVZFUlNFX0ZMQVZPUl8xNigqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtKTsgYWNjdW0rPSAyOworCisgICAgcmV0dXJuIGFjY3VtOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFVucm9sbDFXb3JkU2tpcDMocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3SW5bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgd0luWzBdID0gd0luWzFdID0gd0luWzJdID0gKihjbXNVSW50MTZOdW1iZXIqKSBhY2N1bTsKKworICAgIGFjY3VtICs9IDg7CisKKyAgICByZXR1cm4gYWNjdW07CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworc3RhdGljCitjbXNVSW50OE51bWJlciogVW5yb2xsMldvcmRzKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIHdJblswXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtICs9IDI7ICAgIC8vIGNoMQorICAgIHdJblsxXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtICs9IDI7ICAgIC8vIGNoMgorCisgICAgcmV0dXJuIGFjY3VtOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKKworLy8gVGhpcyBpcyBhIGNvbnZlcnNpb24gb2YgTGFiIGRvdWJsZSB0byAxNiBiaXRzCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBVbnJvbGxMYWJEb3VibGVUbzE2KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgIFN0cmlkZSkKK3sKKyAgICBpZiAoVF9QTEFOQVIoaW5mbyAtPiBJbnB1dEZvcm1hdCkpIHsKKworICAgICAgICBjbXNGbG9hdDY0TnVtYmVyKiBQdCA9IChjbXNGbG9hdDY0TnVtYmVyKikgYWNjdW07CisKKyAgICAgICAgY21zQ0lFTGFiIExhYjsKKworICAgICAgICBMYWIuTCA9IFB0WzBdOworICAgICAgICBMYWIuYSA9IFB0W1N0cmlkZV07CisgICAgICAgIExhYi5iID0gUHRbU3RyaWRlKjJdOworCisgICAgICAgIGNtc0Zsb2F0MkxhYkVuY29kZWQod0luLCAmTGFiKTsKKyAgICAgICAgcmV0dXJuIGFjY3VtICsgc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICBjbXNGbG9hdDJMYWJFbmNvZGVkKHdJbiwgKGNtc0NJRUxhYiopIGFjY3VtKTsKKyAgICAgICAgYWNjdW0gKz0gc2l6ZW9mKGNtc0NJRUxhYikgKyBUX0VYVFJBKGluZm8gLT5JbnB1dEZvcm1hdCkgKiBzaXplb2YoY21zRmxvYXQ2NE51bWJlcik7CisgICAgICAgIHJldHVybiBhY2N1bTsKKyAgICB9Cit9CisKKworLy8gVGhpcyBpcyBhIGNvbnZlcnNpb24gb2YgTGFiIGZsb2F0IHRvIDE2IGJpdHMKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFVucm9sbExhYkZsb2F0VG8xNihyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIGFjY3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyICBTdHJpZGUpCit7CisgICAgY21zQ0lFTGFiIExhYjsKKyAgICAKKyAgICBpZiAoVF9QTEFOQVIoaW5mbyAtPiBJbnB1dEZvcm1hdCkpIHsKKworICAgICAgICBjbXNGbG9hdDMyTnVtYmVyKiBQdCA9IChjbXNGbG9hdDMyTnVtYmVyKikgYWNjdW07CisKKyAgICAgCisgICAgICAgIExhYi5MID0gUHRbMF07CisgICAgICAgIExhYi5hID0gUHRbU3RyaWRlXTsKKyAgICAgICAgTGFiLmIgPSBQdFtTdHJpZGUqMl07CisKKyAgICAgICAgY21zRmxvYXQyTGFiRW5jb2RlZCh3SW4sICZMYWIpOworICAgICAgICByZXR1cm4gYWNjdW0gKyBzaXplb2YoY21zRmxvYXQzMk51bWJlcik7CisgICAgfQorICAgIGVsc2UgeworIAorICAgICAgICBMYWIuTCA9ICgoY21zRmxvYXQzMk51bWJlciopIGFjY3VtKVswXTsKKyAgICAgICAgTGFiLmEgPSAoKGNtc0Zsb2F0MzJOdW1iZXIqKSBhY2N1bSlbMV07CisgICAgICAgIExhYi5iID0gKChjbXNGbG9hdDMyTnVtYmVyKikgYWNjdW0pWzJdOworCisgICAgICAgIGNtc0Zsb2F0MkxhYkVuY29kZWQod0luLCAmTGFiKTsKKyAgICAgICAgYWNjdW0gKz0gKDMgKyBUX0VYVFJBKGluZm8gLT5JbnB1dEZvcm1hdCkpICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpOworICAgICAgICByZXR1cm4gYWNjdW07CisgICAgfQorfQorCisvLyBUaGlzIGlzIGEgY29udmVyc2lvbiBvZiBYWVogZG91YmxlIHRvIDE2IGJpdHMKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFVucm9sbFhZWkRvdWJsZVRvMTYocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3SW5bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgaWYgKFRfUExBTkFSKGluZm8gLT4gSW5wdXRGb3JtYXQpKSB7CisKKyAgICAgICAgY21zRmxvYXQ2NE51bWJlciogUHQgPSAoY21zRmxvYXQ2NE51bWJlciopIGFjY3VtOworICAgICAgICBjbXNDSUVYWVogWFlaOworCisgICAgICAgIFhZWi5YID0gUHRbMF07CisgICAgICAgIFhZWi5ZID0gUHRbU3RyaWRlXTsKKyAgICAgICAgWFlaLlogPSBQdFtTdHJpZGUqMl07CisgICAgICAgIGNtc0Zsb2F0MlhZWkVuY29kZWQod0luLCAmWFlaKTsKKworICAgICAgICByZXR1cm4gYWNjdW0gKyBzaXplb2YoY21zRmxvYXQ2NE51bWJlcik7CisKKyAgICB9CisKKyAgICBlbHNlIHsKKyAgICAgICAgY21zRmxvYXQyWFlaRW5jb2RlZCh3SW4sIChjbXNDSUVYWVoqKSBhY2N1bSk7CisgICAgICAgIGFjY3VtICs9IHNpemVvZihjbXNDSUVYWVopICsgVF9FWFRSQShpbmZvIC0+SW5wdXRGb3JtYXQpICogc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpOworCisgICAgICAgIHJldHVybiBhY2N1bTsKKyAgICB9Cit9CisKKy8vIFRoaXMgaXMgYSBjb252ZXJzaW9uIG9mIFhZWiBmbG9hdCB0byAxNiBiaXRzCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBVbnJvbGxYWVpGbG9hdFRvMTYocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgaWYgKFRfUExBTkFSKGluZm8gLT4gSW5wdXRGb3JtYXQpKSB7CisKKyAgICAgICAgY21zRmxvYXQzMk51bWJlciogUHQgPSAoY21zRmxvYXQzMk51bWJlciopIGFjY3VtOworICAgICAgICBjbXNDSUVYWVogWFlaOworCisgICAgICAgIFhZWi5YID0gUHRbMF07CisgICAgICAgIFhZWi5ZID0gUHRbU3RyaWRlXTsKKyAgICAgICAgWFlaLlogPSBQdFtTdHJpZGUqMl07CisgICAgICAgIGNtc0Zsb2F0MlhZWkVuY29kZWQod0luLCAmWFlaKTsKKworICAgICAgICByZXR1cm4gYWNjdW0gKyBzaXplb2YoY21zRmxvYXQzMk51bWJlcik7CisKKyAgICB9CisKKyAgICBlbHNlIHsKKyAgICAgICAgY21zRmxvYXQzMk51bWJlciogUHQgPSAoY21zRmxvYXQzMk51bWJlciopIGFjY3VtOworICAgICAgICBjbXNDSUVYWVogWFlaOworCisgICAgICAgIFhZWi5YID0gUHRbMF07CisgICAgICAgIFhZWi5ZID0gUHRbMV07CisgICAgICAgIFhZWi5aID0gUHRbMl07CisgICAgICAgIGNtc0Zsb2F0MlhZWkVuY29kZWQod0luLCAmWFlaKTsKKworICAgICAgICBhY2N1bSArPSAzICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpICsgVF9FWFRSQShpbmZvIC0+SW5wdXRGb3JtYXQpICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpOworCisgICAgICAgIHJldHVybiBhY2N1bTsKKyAgICB9Cit9CisKKy8vIENoZWNrIGlmIHNwYWNlIGlzIG1hcmtlZCBhcyBpbmsKK2Ntc0lOTElORSBjbXNCb29sIElzSW5rU3BhY2UoY21zVUludDMyTnVtYmVyIFR5cGUpCit7CisgICAgc3dpdGNoIChUX0NPTE9SU1BBQ0UoVHlwZSkpIHsKKworICAgICBjYXNlIFBUX0NNWToKKyAgICAgY2FzZSBQVF9DTVlLOgorICAgICBjYXNlIFBUX01DSDU6CisgICAgIGNhc2UgUFRfTUNINjoKKyAgICAgY2FzZSBQVF9NQ0g3OgorICAgICBjYXNlIFBUX01DSDg6CisgICAgIGNhc2UgUFRfTUNIOToKKyAgICAgY2FzZSBQVF9NQ0gxMDoKKyAgICAgY2FzZSBQVF9NQ0gxMToKKyAgICAgY2FzZSBQVF9NQ0gxMjoKKyAgICAgY2FzZSBQVF9NQ0gxMzoKKyAgICAgY2FzZSBQVF9NQ0gxNDoKKyAgICAgY2FzZSBQVF9NQ0gxNTogcmV0dXJuIFRSVUU7CisKKyAgICAgZGVmYXVsdDogcmV0dXJuIEZBTFNFOworICAgIH0KK30KKworLy8gSW5rcyBkb2VzIGNvbWUgaW4gcGVyY2VudGFnZSwgcmVtYWluaW5nIGNhc2VzIGFyZSBiZXR3ZWVuIDAuLjEuMCwgYWdhaW4gdG8gMTYgYml0cworc3RhdGljCitjbXNVSW50OE51bWJlciogVW5yb2xsRG91YmxlVG8xNihyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKworICAgIGludCBuQ2hhbiAgICAgID0gVF9DSEFOTkVMUyhpbmZvIC0+IElucHV0Rm9ybWF0KTsKKyAgICBpbnQgRG9Td2FwICAgICA9IFRfRE9TV0FQKGluZm8gLT5JbnB1dEZvcm1hdCk7CisgICAgaW50IFJldmVyc2UgICAgPSBUX0ZMQVZPUihpbmZvIC0+SW5wdXRGb3JtYXQpOworICAgIGludCBTd2FwRmlyc3QgID0gVF9TV0FQRklSU1QoaW5mbyAtPiBJbnB1dEZvcm1hdCk7CisgICAgaW50IEV4dHJhICAgICAgPSBUX0VYVFJBKGluZm8gLT4gSW5wdXRGb3JtYXQpOworICAgIGludCBFeHRyYUZpcnN0ID0gRG9Td2FwIF4gU3dhcEZpcnN0OworICAgIGludCBQbGFuYXIgICAgID0gVF9QTEFOQVIoaW5mbyAtPiBJbnB1dEZvcm1hdCk7CisgICAgY21zRmxvYXQ2NE51bWJlciB2OworICAgIGNtc1VJbnQxNk51bWJlciAgdmk7CisgICAgaW50IGksIHN0YXJ0ID0gMDsKKyAgIGNtc0Zsb2F0NjROdW1iZXIgbWF4aW11bSA9IElzSW5rU3BhY2UoaW5mbyAtPklucHV0Rm9ybWF0KSA/IDY1NS4zNSA6IDY1NTM1LjA7CisKKworICAgIGlmIChFeHRyYUZpcnN0KQorICAgICAgICAgICAgc3RhcnQgPSBFeHRyYTsKKworICAgIGZvciAoaT0wOyBpIDwgbkNoYW47IGkrKykgeworCisgICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7CisKKyAgICAgICAgaWYgKFBsYW5hcikKKyAgICAgICAgICAgIHYgPSAoY21zRmxvYXQzMk51bWJlcikgKChjbXNGbG9hdDY0TnVtYmVyKikgYWNjdW0pWyhpICsgc3RhcnQpICogU3RyaWRlXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdiA9IChjbXNGbG9hdDMyTnVtYmVyKSAoKGNtc0Zsb2F0NjROdW1iZXIqKSBhY2N1bSlbaSArIHN0YXJ0XTsKKworICAgICAgICB2aSA9IF9jbXNRdWlja1NhdHVyYXRlV29yZCh2ICogbWF4aW11bSk7CisKKyAgICAgICAgaWYgKFJldmVyc2UpCisgICAgICAgICAgICB2aSA9IFJFVkVSU0VfRkxBVk9SXzE2KHZpKTsKKworICAgICAgICB3SW5baW5kZXhdID0gdmk7CisgICAgfQorCisKKyAgICBpZiAoRXh0cmEgPT0gMCAmJiBTd2FwRmlyc3QpIHsKKyAgICAgICAgY21zVUludDE2TnVtYmVyIHRtcCA9IHdJblswXTsKKworICAgICAgICBtZW1tb3ZlKCZ3SW5bMF0sICZ3SW5bMV0sIChuQ2hhbi0xKSAqIHNpemVvZihjbXNVSW50MTZOdW1iZXIpKTsKKyAgICAgICAgd0luW25DaGFuLTFdID0gdG1wOworICAgIH0KKworICAgIGlmIChUX1BMQU5BUihpbmZvIC0+IElucHV0Rm9ybWF0KSkKKyAgICAgICAgcmV0dXJuIGFjY3VtICsgc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGFjY3VtICsgKG5DaGFuICsgRXh0cmEpICogc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpOworfQorCisKKworc3RhdGljCitjbXNVSW50OE51bWJlciogVW5yb2xsRmxvYXRUbzE2KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3SW5bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIGFjY3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworCisgICAgaW50IG5DaGFuICAgICAgPSBUX0NIQU5ORUxTKGluZm8gLT4gSW5wdXRGb3JtYXQpOworICAgIGludCBEb1N3YXAgICAgID0gVF9ET1NXQVAoaW5mbyAtPklucHV0Rm9ybWF0KTsKKyAgICBpbnQgUmV2ZXJzZSAgICA9IFRfRkxBVk9SKGluZm8gLT5JbnB1dEZvcm1hdCk7CisgICAgaW50IFN3YXBGaXJzdCAgPSBUX1NXQVBGSVJTVChpbmZvIC0+IElucHV0Rm9ybWF0KTsKKyAgICBpbnQgRXh0cmEgICAgICA9IFRfRVhUUkEoaW5mbyAtPiBJbnB1dEZvcm1hdCk7CisgICAgaW50IEV4dHJhRmlyc3QgPSBEb1N3YXAgXiBTd2FwRmlyc3Q7CisgICAgaW50IFBsYW5hciAgICAgPSBUX1BMQU5BUihpbmZvIC0+IElucHV0Rm9ybWF0KTsKKyAgICBjbXNGbG9hdDMyTnVtYmVyIHY7CisgICAgY21zVUludDE2TnVtYmVyICB2aTsKKyAgICBpbnQgaSwgc3RhcnQgPSAwOworICAgY21zRmxvYXQ2NE51bWJlciBtYXhpbXVtID0gSXNJbmtTcGFjZShpbmZvIC0+SW5wdXRGb3JtYXQpID8gNjU1LjM1IDogNjU1MzUuMDsKKworCisgICAgaWYgKEV4dHJhRmlyc3QpCisgICAgICAgICAgICBzdGFydCA9IEV4dHJhOworCisgICAgZm9yIChpPTA7IGkgPCBuQ2hhbjsgaSsrKSB7CisKKyAgICAgICAgaW50IGluZGV4ID0gRG9Td2FwID8gKG5DaGFuIC0gaSAtIDEpIDogaTsKKworICAgICAgICBpZiAoUGxhbmFyKQorICAgICAgICAgICAgdiA9IChjbXNGbG9hdDMyTnVtYmVyKSAoKGNtc0Zsb2F0MzJOdW1iZXIqKSBhY2N1bSlbKGkgKyBzdGFydCkgKiBTdHJpZGVdOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2ID0gKGNtc0Zsb2F0MzJOdW1iZXIpICgoY21zRmxvYXQzMk51bWJlciopIGFjY3VtKVtpICsgc3RhcnRdOworCisgICAgICAgIHZpID0gX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKHYgKiBtYXhpbXVtKTsKKworICAgICAgICBpZiAoUmV2ZXJzZSkKKyAgICAgICAgICAgIHZpID0gUkVWRVJTRV9GTEFWT1JfMTYodmkpOworCisgICAgICAgIHdJbltpbmRleF0gPSB2aTsKKyAgICB9CisKKworICAgIGlmIChFeHRyYSA9PSAwICYmIFN3YXBGaXJzdCkgeworICAgICAgICBjbXNVSW50MTZOdW1iZXIgdG1wID0gd0luWzBdOworCisgICAgICAgIG1lbW1vdmUoJndJblswXSwgJndJblsxXSwgKG5DaGFuLTEpICogc2l6ZW9mKGNtc1VJbnQxNk51bWJlcikpOworICAgICAgICB3SW5bbkNoYW4tMV0gPSB0bXA7CisgICAgfQorCisgICAgaWYgKFRfUExBTkFSKGluZm8gLT4gSW5wdXRGb3JtYXQpKQorICAgICAgICByZXR1cm4gYWNjdW0gKyBzaXplb2YoY21zRmxvYXQzMk51bWJlcik7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gYWNjdW0gKyAobkNoYW4gKyBFeHRyYSkgKiBzaXplb2YoY21zRmxvYXQzMk51bWJlcik7Cit9CisKKworCisKKy8vIEZvciAxIGNoYW5uZWwsIHdlIG5lZWQgdG8gZHVwbGljYXRlIGRhdGEgKGl0IGNvbWVzIGluIDAuLjEuMCByYW5nZSkKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFVucm9sbERvdWJsZTFDaGFuKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIGNtc0Zsb2F0NjROdW1iZXIqIElua3MgPSAoY21zRmxvYXQ2NE51bWJlciopIGFjY3VtOworCisgICAgd0luWzBdID0gd0luWzFdID0gd0luWzJdID0gX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKElua3NbMF0gKiA2NTUzNS4wKTsKKworICAgIHJldHVybiBhY2N1bSArIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRm9yIGFueXRoaW5nIGdvaW5nIGZyb20gY21zRmxvYXQzMk51bWJlcgorc3RhdGljCitjbXNVSW50OE51bWJlciogVW5yb2xsRmxvYXRzVG9GbG9hdChfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciB3SW5bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisKKyAgICBpbnQgbkNoYW4gICAgICA9IFRfQ0hBTk5FTFMoaW5mbyAtPiBJbnB1dEZvcm1hdCk7CisgICAgaW50IERvU3dhcCAgICAgPSBUX0RPU1dBUChpbmZvIC0+SW5wdXRGb3JtYXQpOworICAgIGludCBSZXZlcnNlICAgID0gVF9GTEFWT1IoaW5mbyAtPklucHV0Rm9ybWF0KTsKKyAgICBpbnQgU3dhcEZpcnN0ICA9IFRfU1dBUEZJUlNUKGluZm8gLT4gSW5wdXRGb3JtYXQpOworICAgIGludCBFeHRyYSAgICAgID0gVF9FWFRSQShpbmZvIC0+IElucHV0Rm9ybWF0KTsKKyAgICBpbnQgRXh0cmFGaXJzdCA9IERvU3dhcCBeIFN3YXBGaXJzdDsKKyAgICBpbnQgUGxhbmFyICAgICA9IFRfUExBTkFSKGluZm8gLT4gSW5wdXRGb3JtYXQpOworICAgIGNtc0Zsb2F0MzJOdW1iZXIgdjsKKyAgICBpbnQgaSwgc3RhcnQgPSAwOworICAgIGNtc0Zsb2F0MzJOdW1iZXIgbWF4aW11bSA9IElzSW5rU3BhY2UoaW5mbyAtPklucHV0Rm9ybWF0KSA/IDEwMC4wRiA6IDEuMEY7CisKKworICAgIGlmIChFeHRyYUZpcnN0KQorICAgICAgICAgICAgc3RhcnQgPSBFeHRyYTsKKworICAgIGZvciAoaT0wOyBpIDwgbkNoYW47IGkrKykgeworCisgICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7CisKKyAgICAgICAgaWYgKFBsYW5hcikKKyAgICAgICAgICAgIHYgPSAoY21zRmxvYXQzMk51bWJlcikgKChjbXNGbG9hdDMyTnVtYmVyKikgYWNjdW0pWyhpICsgc3RhcnQpICogU3RyaWRlXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdiA9IChjbXNGbG9hdDMyTnVtYmVyKSAoKGNtc0Zsb2F0MzJOdW1iZXIqKSBhY2N1bSlbaSArIHN0YXJ0XTsKKworICAgICAgICB2IC89IG1heGltdW07CisKKyAgICAgICAgd0luW2luZGV4XSA9IFJldmVyc2UgPyAxIC0gdiA6IHY7CisgICAgfQorCisKKyAgICBpZiAoRXh0cmEgPT0gMCAmJiBTd2FwRmlyc3QpIHsKKyAgICAgICAgY21zRmxvYXQzMk51bWJlciB0bXAgPSB3SW5bMF07CisKKyAgICAgICAgbWVtbW92ZSgmd0luWzBdLCAmd0luWzFdLCAobkNoYW4tMSkgKiBzaXplb2YoY21zRmxvYXQzMk51bWJlcikpOworICAgICAgICB3SW5bbkNoYW4tMV0gPSB0bXA7CisgICAgfQorCisgICAgaWYgKFRfUExBTkFSKGluZm8gLT4gSW5wdXRGb3JtYXQpKQorICAgICAgICByZXR1cm4gYWNjdW0gKyBzaXplb2YoY21zRmxvYXQzMk51bWJlcik7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gYWNjdW0gKyAobkNoYW4gKyBFeHRyYSkgKiBzaXplb2YoY21zRmxvYXQzMk51bWJlcik7Cit9CisKKy8vIEZvciBhbnl0aGluZyBnb2luZyBmcm9tIGRvdWJsZQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBVbnJvbGxEb3VibGVzVG9GbG9hdChfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciB3SW5bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisKKyAgICBpbnQgbkNoYW4gICAgICA9IFRfQ0hBTk5FTFMoaW5mbyAtPiBJbnB1dEZvcm1hdCk7CisgICAgaW50IERvU3dhcCAgICAgPSBUX0RPU1dBUChpbmZvIC0+SW5wdXRGb3JtYXQpOworICAgIGludCBSZXZlcnNlICAgID0gVF9GTEFWT1IoaW5mbyAtPklucHV0Rm9ybWF0KTsKKyAgICBpbnQgU3dhcEZpcnN0ICA9IFRfU1dBUEZJUlNUKGluZm8gLT4gSW5wdXRGb3JtYXQpOworICAgIGludCBFeHRyYSAgICAgID0gVF9FWFRSQShpbmZvIC0+IElucHV0Rm9ybWF0KTsKKyAgICBpbnQgRXh0cmFGaXJzdCA9IERvU3dhcCBeIFN3YXBGaXJzdDsKKyAgICBpbnQgUGxhbmFyICAgICA9IFRfUExBTkFSKGluZm8gLT4gSW5wdXRGb3JtYXQpOworICAgIGNtc0Zsb2F0NjROdW1iZXIgdjsKKyAgICBpbnQgaSwgc3RhcnQgPSAwOworICAgIGNtc0Zsb2F0NjROdW1iZXIgbWF4aW11bSA9IElzSW5rU3BhY2UoaW5mbyAtPklucHV0Rm9ybWF0KSA/IDEwMC4wIDogMS4wOworCisKKyAgICBpZiAoRXh0cmFGaXJzdCkKKyAgICAgICAgICAgIHN0YXJ0ID0gRXh0cmE7CisKKyAgICBmb3IgKGk9MDsgaSA8IG5DaGFuOyBpKyspIHsKKworICAgICAgICBpbnQgaW5kZXggPSBEb1N3YXAgPyAobkNoYW4gLSBpIC0gMSkgOiBpOworCisgICAgICAgIGlmIChQbGFuYXIpCisgICAgICAgICAgICB2ID0gKGNtc0Zsb2F0NjROdW1iZXIpICgoY21zRmxvYXQ2NE51bWJlciopIGFjY3VtKVsoaSArIHN0YXJ0KSAgKiBTdHJpZGVdOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2ID0gKGNtc0Zsb2F0NjROdW1iZXIpICgoY21zRmxvYXQ2NE51bWJlciopIGFjY3VtKVtpICsgc3RhcnRdOworCisgICAgICAgIHYgLz0gbWF4aW11bTsKKworICAgICAgICB3SW5baW5kZXhdID0gKGNtc0Zsb2F0MzJOdW1iZXIpIChSZXZlcnNlID8gMS4wIC0gdiA6IHYpOworICAgIH0KKworCisgICAgaWYgKEV4dHJhID09IDAgJiYgU3dhcEZpcnN0KSB7CisgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgdG1wID0gd0luWzBdOworCisgICAgICAgIG1lbW1vdmUoJndJblswXSwgJndJblsxXSwgKG5DaGFuLTEpICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpKTsKKyAgICAgICAgd0luW25DaGFuLTFdID0gdG1wOworICAgIH0KKworICAgIGlmIChUX1BMQU5BUihpbmZvIC0+IElucHV0Rm9ybWF0KSkKKyAgICAgICAgcmV0dXJuIGFjY3VtICsgc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGFjY3VtICsgKG5DaGFuICsgRXh0cmEpICogc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpOworfQorCisKKworLy8gRnJvbSBMYWIgZG91YmxlIHRvIGNtc0Zsb2F0MzJOdW1iZXIKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFVucm9sbExhYkRvdWJsZVRvRmxvYXQoX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgd0luW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50OE51bWJlciogYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIGNtc0Zsb2F0NjROdW1iZXIqIFB0ID0gKGNtc0Zsb2F0NjROdW1iZXIqKSBhY2N1bTsKKworICAgIGlmIChUX1BMQU5BUihpbmZvIC0+IElucHV0Rm9ybWF0KSkgeworCisgICAgICAgIHdJblswXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoUHRbMF0gLyAxMDAuMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gMC4uMTAwIHRvIDAuLjEKKyAgICAgICAgd0luWzFdID0gKGNtc0Zsb2F0MzJOdW1iZXIpICgoUHRbU3RyaWRlXSArIDEyOCkgLyAyNTUuMCk7ICAgIC8vIGZvcm0gLTEyOC4uKzEyNyB0byAwLi4xCisgICAgICAgIHdJblsyXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoKFB0W1N0cmlkZSoyXSArIDEyOCkgLyAyNTUuMCk7CisKKyAgICAgICAgcmV0dXJuIGFjY3VtICsgc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICB3SW5bMF0gPSAoY21zRmxvYXQzMk51bWJlcikgKFB0WzBdIC8gMTAwLjApOyAgICAgICAgICAgIC8vIGZyb20gMC4uMTAwIHRvIDAuLjEKKyAgICAgICAgd0luWzFdID0gKGNtc0Zsb2F0MzJOdW1iZXIpICgoUHRbMV0gKyAxMjgpIC8gMjU1LjApOyAgICAvLyBmb3JtIC0xMjguLisxMjcgdG8gMC4uMQorICAgICAgICB3SW5bMl0gPSAoY21zRmxvYXQzMk51bWJlcikgKChQdFsyXSArIDEyOCkgLyAyNTUuMCk7CisKKyAgICAgICAgYWNjdW0gKz0gc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpKigzICsgVF9FWFRSQShpbmZvIC0+SW5wdXRGb3JtYXQpKTsKKyAgICAgICAgcmV0dXJuIGFjY3VtOworICAgIH0KK30KKworLy8gRnJvbSBMYWIgZG91YmxlIHRvIGNtc0Zsb2F0MzJOdW1iZXIKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFVucm9sbExhYkZsb2F0VG9GbG9hdChfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHdJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50OE51bWJlciogYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgY21zRmxvYXQzMk51bWJlciogUHQgPSAoY21zRmxvYXQzMk51bWJlciopIGFjY3VtOworCisgICAgaWYgKFRfUExBTkFSKGluZm8gLT4gSW5wdXRGb3JtYXQpKSB7CisKKyAgICAgICAgd0luWzBdID0gKGNtc0Zsb2F0MzJOdW1iZXIpIChQdFswXSAvIDEwMC4wKTsgICAgICAgICAgICAgICAgIC8vIGZyb20gMC4uMTAwIHRvIDAuLjEKKyAgICAgICAgd0luWzFdID0gKGNtc0Zsb2F0MzJOdW1iZXIpICgoUHRbU3RyaWRlXSArIDEyOCkgLyAyNTUuMCk7ICAgIC8vIGZvcm0gLTEyOC4uKzEyNyB0byAwLi4xCisgICAgICAgIHdJblsyXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoKFB0W1N0cmlkZSoyXSArIDEyOCkgLyAyNTUuMCk7CisKKyAgICAgICAgcmV0dXJuIGFjY3VtICsgc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICB3SW5bMF0gPSAoY21zRmxvYXQzMk51bWJlcikgKFB0WzBdIC8gMTAwLjApOyAgICAgICAgICAgIC8vIGZyb20gMC4uMTAwIHRvIDAuLjEKKyAgICAgICAgd0luWzFdID0gKGNtc0Zsb2F0MzJOdW1iZXIpICgoUHRbMV0gKyAxMjgpIC8gMjU1LjApOyAgICAvLyBmb3JtIC0xMjguLisxMjcgdG8gMC4uMQorICAgICAgICB3SW5bMl0gPSAoY21zRmxvYXQzMk51bWJlcikgKChQdFsyXSArIDEyOCkgLyAyNTUuMCk7CisKKyAgICAgICAgYWNjdW0gKz0gc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpKigzICsgVF9FWFRSQShpbmZvIC0+SW5wdXRGb3JtYXQpKTsKKyAgICAgICAgcmV0dXJuIGFjY3VtOworICAgIH0KK30KKworCisKKy8vIDEuMTUgZml4ZWQgcG9pbnQsIHRoYXQgbWVhbnMgbWF4aW11bSB2YWx1ZSBpcyBNQVhfRU5DT0RFQUJMRV9YWVogKDB4RkZGRikKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFVucm9sbFhZWkRvdWJsZVRvRmxvYXQoX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgd0luW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50OE51bWJlciogYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIGNtc0Zsb2F0NjROdW1iZXIqIFB0ID0gKGNtc0Zsb2F0NjROdW1iZXIqKSBhY2N1bTsKKworICAgIGlmIChUX1BMQU5BUihpbmZvIC0+IElucHV0Rm9ybWF0KSkgeworCisgICAgICAgIHdJblswXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoUHRbMF0gLyBNQVhfRU5DT0RFQUJMRV9YWVopOworICAgICAgICB3SW5bMV0gPSAoY21zRmxvYXQzMk51bWJlcikgKFB0W1N0cmlkZV0gLyBNQVhfRU5DT0RFQUJMRV9YWVopOworICAgICAgICB3SW5bMl0gPSAoY21zRmxvYXQzMk51bWJlcikgKFB0W1N0cmlkZSoyXSAvIE1BWF9FTkNPREVBQkxFX1hZWik7CisKKyAgICAgICAgcmV0dXJuIGFjY3VtICsgc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICB3SW5bMF0gPSAoY21zRmxvYXQzMk51bWJlcikgKFB0WzBdIC8gTUFYX0VOQ09ERUFCTEVfWFlaKTsKKyAgICAgICAgd0luWzFdID0gKGNtc0Zsb2F0MzJOdW1iZXIpIChQdFsxXSAvIE1BWF9FTkNPREVBQkxFX1hZWik7CisgICAgICAgIHdJblsyXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoUHRbMl0gLyBNQVhfRU5DT0RFQUJMRV9YWVopOworCisgICAgICAgIGFjY3VtICs9IHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKSooMyArIFRfRVhUUkEoaW5mbyAtPklucHV0Rm9ybWF0KSk7CisgICAgICAgIHJldHVybiBhY2N1bTsKKyAgICB9Cit9CisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFVucm9sbFhZWkZsb2F0VG9GbG9hdChfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHdJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50OE51bWJlciogYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgY21zRmxvYXQzMk51bWJlciogUHQgPSAoY21zRmxvYXQzMk51bWJlciopIGFjY3VtOworCisgICAgaWYgKFRfUExBTkFSKGluZm8gLT4gSW5wdXRGb3JtYXQpKSB7CisKKyAgICAgICAgd0luWzBdID0gKGNtc0Zsb2F0MzJOdW1iZXIpIChQdFswXSAvIE1BWF9FTkNPREVBQkxFX1hZWik7CisgICAgICAgIHdJblsxXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoUHRbU3RyaWRlXSAvIE1BWF9FTkNPREVBQkxFX1hZWik7CisgICAgICAgIHdJblsyXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoUHRbU3RyaWRlKjJdIC8gTUFYX0VOQ09ERUFCTEVfWFlaKTsKKworICAgICAgICByZXR1cm4gYWNjdW0gKyBzaXplb2YoY21zRmxvYXQzMk51bWJlcik7CisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgIHdJblswXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoUHRbMF0gLyBNQVhfRU5DT0RFQUJMRV9YWVopOworICAgICAgICB3SW5bMV0gPSAoY21zRmxvYXQzMk51bWJlcikgKFB0WzFdIC8gTUFYX0VOQ09ERUFCTEVfWFlaKTsKKyAgICAgICAgd0luWzJdID0gKGNtc0Zsb2F0MzJOdW1iZXIpIChQdFsyXSAvIE1BWF9FTkNPREVBQkxFX1hZWik7CisKKyAgICAgICAgYWNjdW0gKz0gc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpKigzICsgVF9FWFRSQShpbmZvIC0+SW5wdXRGb3JtYXQpKTsKKyAgICAgICAgcmV0dXJuIGFjY3VtOworICAgIH0KK30KKworCisKKy8vIFBhY2tpbmcgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisvLyBHZW5lcmljIGNodW5reSBmb3IgYnl0ZQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrQW55Qnl0ZXMocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICBpbnQgbkNoYW4gICAgICA9IFRfQ0hBTk5FTFMoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOworICAgIGludCBEb1N3YXAgICAgID0gVF9ET1NXQVAoaW5mbyAtPk91dHB1dEZvcm1hdCk7CisgICAgaW50IFJldmVyc2UgICAgPSBUX0ZMQVZPUihpbmZvIC0+T3V0cHV0Rm9ybWF0KTsKKyAgICBpbnQgRXh0cmEgICAgICA9IFRfRVhUUkEoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOworICAgIGludCBTd2FwRmlyc3QgID0gVF9TV0FQRklSU1QoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOworICAgIGludCBFeHRyYUZpcnN0ID0gRG9Td2FwIF4gU3dhcEZpcnN0OworICAgIGNtc1VJbnQ4TnVtYmVyKiBzd2FwMTsKKyAgICBjbXNVSW50OE51bWJlciB2ID0gMDsKKyAgICBpbnQgaTsKKworICAgIHN3YXAxID0gb3V0cHV0OworCisgICAgaWYgKEV4dHJhRmlyc3QpIHsKKyAgICAgICAgb3V0cHV0ICs9IEV4dHJhOworICAgIH0KKworICAgIGZvciAoaT0wOyBpIDwgbkNoYW47IGkrKykgeworCisgICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7CisKKyAgICAgICAgdiA9IEZST01fMTZfVE9fOCh3T3V0W2luZGV4XSk7CisKKyAgICAgICAgaWYgKFJldmVyc2UpCisgICAgICAgICAgICB2ID0gUkVWRVJTRV9GTEFWT1JfOCh2KTsKKworICAgICAgICAqb3V0cHV0KysgPSB2OworICAgIH0KKworICAgIGlmICghRXh0cmFGaXJzdCkgeworICAgICAgICBvdXRwdXQgKz0gRXh0cmE7CisgICAgfQorCisgICAgaWYgKEV4dHJhID09IDAgJiYgU3dhcEZpcnN0KSB7CisKKyAgICAgICAgbWVtbW92ZShzd2FwMSArIDEsIHN3YXAxLCBuQ2hhbi0xKTsKKyAgICAgICAgKnN3YXAxID0gdjsKKyAgICB9CisKKworICAgIHJldHVybiBvdXRwdXQ7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKKworCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrQW55V29yZHMocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICBpbnQgbkNoYW4gICAgICA9IFRfQ0hBTk5FTFMoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOworICAgIGludCBTd2FwRW5kaWFuID0gVF9FTkRJQU4xNihpbmZvIC0+IElucHV0Rm9ybWF0KTsKKyAgICBpbnQgRG9Td2FwICAgICA9IFRfRE9TV0FQKGluZm8gLT5PdXRwdXRGb3JtYXQpOworICAgIGludCBSZXZlcnNlICAgID0gVF9GTEFWT1IoaW5mbyAtPk91dHB1dEZvcm1hdCk7CisgICAgaW50IEV4dHJhICAgICAgPSBUX0VYVFJBKGluZm8gLT4gT3V0cHV0Rm9ybWF0KTsKKyAgICBpbnQgU3dhcEZpcnN0ICA9IFRfU1dBUEZJUlNUKGluZm8gLT4gT3V0cHV0Rm9ybWF0KTsKKyAgICBpbnQgRXh0cmFGaXJzdCA9IERvU3dhcCBeIFN3YXBGaXJzdDsKKyAgICBjbXNVSW50MTZOdW1iZXIqIHN3YXAxOworICAgIGNtc1VJbnQxNk51bWJlciB2ID0gMDsKKyAgICBpbnQgaTsKKworICAgIHN3YXAxID0gKGNtc1VJbnQxNk51bWJlciopIG91dHB1dDsKKworICAgIGlmIChFeHRyYUZpcnN0KSB7CisgICAgICAgIG91dHB1dCArPSBFeHRyYSAqIHNpemVvZihjbXNVSW50MTZOdW1iZXIpOworICAgIH0KKworICAgIGZvciAoaT0wOyBpIDwgbkNoYW47IGkrKykgeworCisgICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7CisKKyAgICAgICAgdiA9IHdPdXRbaW5kZXhdOworCisgICAgICAgIGlmIChTd2FwRW5kaWFuKQorICAgICAgICAgICAgdiA9IENIQU5HRV9FTkRJQU4odik7CisKKyAgICAgICAgaWYgKFJldmVyc2UpCisgICAgICAgICAgICB2ID0gUkVWRVJTRV9GTEFWT1JfMTYodik7CisKKyAgICAgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB2OworCisgICAgICAgIG91dHB1dCArPSBzaXplb2YoY21zVUludDE2TnVtYmVyKTsKKyAgICB9CisKKyAgICBpZiAoIUV4dHJhRmlyc3QpIHsKKyAgICAgICAgb3V0cHV0ICs9IEV4dHJhICogc2l6ZW9mKGNtc1VJbnQxNk51bWJlcik7CisgICAgfQorCisgICAgaWYgKEV4dHJhID09IDAgJiYgU3dhcEZpcnN0KSB7CisKKyAgICAgICAgbWVtbW92ZShzd2FwMSArIDEsIHN3YXAxLCAobkNoYW4tMSkqIHNpemVvZihjbXNVSW50MTZOdW1iZXIpKTsKKyAgICAgICAgKnN3YXAxID0gdjsKKyAgICB9CisKKworICAgIHJldHVybiBvdXRwdXQ7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKKworc3RhdGljCitjbXNVSW50OE51bWJlciogUGFja1BsYW5hckJ5dGVzKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgaW50IG5DaGFuICAgICA9IFRfQ0hBTk5FTFMoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOworICAgIGludCBEb1N3YXAgICAgPSBUX0RPU1dBUChpbmZvIC0+T3V0cHV0Rm9ybWF0KTsKKyAgICBpbnQgU3dhcEZpcnN0ID0gVF9TV0FQRklSU1QoaW5mbyAtPk91dHB1dEZvcm1hdCk7CisgICAgaW50IFJldmVyc2UgICA9IFRfRkxBVk9SKGluZm8gLT5PdXRwdXRGb3JtYXQpOworICAgIGludCBpOworICAgIGNtc1VJbnQ4TnVtYmVyKiBJbml0ID0gb3V0cHV0OworCisKKyAgICBpZiAoRG9Td2FwIF4gU3dhcEZpcnN0KSB7CisgICAgICAgIG91dHB1dCArPSBUX0VYVFJBKGluZm8gLT4gT3V0cHV0Rm9ybWF0KSAqIFN0cmlkZTsKKyAgICB9CisKKworICAgIGZvciAoaT0wOyBpIDwgbkNoYW47IGkrKykgeworCisgICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7CisgICAgICAgIGNtc1VJbnQ4TnVtYmVyIHYgPSBGUk9NXzE2X1RPXzgod091dFtpbmRleF0pOworCisgICAgICAgICooY21zVUludDhOdW1iZXIqKSAgb3V0cHV0ID0gKGNtc1VJbnQ4TnVtYmVyKSAoUmV2ZXJzZSA/IFJFVkVSU0VfRkxBVk9SXzgodikgOiB2KTsKKyAgICAgICAgb3V0cHV0ICs9IFN0cmlkZTsKKyAgICB9CisKKyAgICByZXR1cm4gKEluaXQgKyAxKTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrUGxhbmFyV29yZHMocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICBpbnQgbkNoYW4gPSBUX0NIQU5ORUxTKGluZm8gLT4gT3V0cHV0Rm9ybWF0KTsKKyAgICBpbnQgRG9Td2FwID0gVF9ET1NXQVAoaW5mbyAtPk91dHB1dEZvcm1hdCk7CisgICAgaW50IFJldmVyc2U9IFRfRkxBVk9SKGluZm8gLT5PdXRwdXRGb3JtYXQpOworICAgIGludCBTd2FwRW5kaWFuID0gVF9FTkRJQU4xNihpbmZvIC0+IE91dHB1dEZvcm1hdCk7CisgICAgaW50IGk7CisgICAgY21zVUludDhOdW1iZXIqIEluaXQgPSBvdXRwdXQ7CisgICAgY21zVUludDE2TnVtYmVyIHY7CisKKyAgICBpZiAoRG9Td2FwKSB7CisgICAgICAgIG91dHB1dCArPSBUX0VYVFJBKGluZm8gLT4gT3V0cHV0Rm9ybWF0KSAqIFN0cmlkZSAqIHNpemVvZihjbXNVSW50MTZOdW1iZXIpOworICAgIH0KKworICAgIGZvciAoaT0wOyBpIDwgbkNoYW47IGkrKykgeworCisgICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7CisKKyAgICAgICAgdiA9IHdPdXRbaW5kZXhdOworCisgICAgICAgIGlmIChTd2FwRW5kaWFuKQorICAgICAgICAgICAgdiA9IENIQU5HRV9FTkRJQU4odik7CisKKyAgICAgICAgaWYgKFJldmVyc2UpCisgICAgICAgICAgICB2ID0gIFJFVkVSU0VfRkxBVk9SXzE2KHYpOworCisgICAgICAgICooY21zVUludDE2TnVtYmVyKikgb3V0cHV0ID0gdjsKKyAgICAgICAgb3V0cHV0ICs9IChTdHJpZGUgKiBzaXplb2YoY21zVUludDE2TnVtYmVyKSk7CisgICAgfQorCisgICAgcmV0dXJuIChJbml0ICsgc2l6ZW9mKGNtc1VJbnQxNk51bWJlcikpOworfQorCisvLyBDTVlLY20gKHVucm9sbGVkIGZvciBzcGVlZCkKKworc3RhdGljCitjbXNVSW50OE51bWJlciogUGFjazZCeXRlcyhyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzBdKTsKKyAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFsxXSk7CisgICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMl0pOworICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzNdKTsKKyAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFs0XSk7CisgICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbNV0pOworCisgICAgcmV0dXJuIG91dHB1dDsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCisvLyBLQ01ZY20KKworc3RhdGljCitjbXNVSW50OE51bWJlciogUGFjazZCeXRlc1N3YXAocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFs1XSk7CisgICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbNF0pOworICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzNdKTsKKyAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFsyXSk7CisgICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMV0pOworICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzBdKTsKKworICAgIHJldHVybiBvdXRwdXQ7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworLy8gQ01ZS2NtCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrNldvcmRzKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzBdOworICAgIG91dHB1dCs9IDI7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzFdOworICAgIG91dHB1dCs9IDI7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzJdOworICAgIG91dHB1dCs9IDI7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzNdOworICAgIG91dHB1dCs9IDI7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzRdOworICAgIG91dHB1dCs9IDI7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzVdOworICAgIG91dHB1dCs9IDI7CisKKyAgICByZXR1cm4gb3V0cHV0OworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKKy8vIEtDTVljbQorc3RhdGljCitjbXNVSW50OE51bWJlciogUGFjazZXb3Jkc1N3YXAocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbNV07CisgICAgb3V0cHV0Kz0gMjsKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbNF07CisgICAgb3V0cHV0Kz0gMjsKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbM107CisgICAgb3V0cHV0Kz0gMjsKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMl07CisgICAgb3V0cHV0Kz0gMjsKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMV07CisgICAgb3V0cHV0Kz0gMjsKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMF07CisgICAgb3V0cHV0Kz0gMjsKKworICAgIHJldHVybiBvdXRwdXQ7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrNEJ5dGVzKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMF0pOworICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzFdKTsKKyAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFsyXSk7CisgICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbM10pOworCisgICAgcmV0dXJuIG91dHB1dDsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrNEJ5dGVzUmV2ZXJzZShyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgICpvdXRwdXQrKyA9IFJFVkVSU0VfRkxBVk9SXzgoRlJPTV8xNl9UT184KHdPdXRbMF0pKTsKKyAgICAqb3V0cHV0KysgPSBSRVZFUlNFX0ZMQVZPUl84KEZST01fMTZfVE9fOCh3T3V0WzFdKSk7CisgICAgKm91dHB1dCsrID0gUkVWRVJTRV9GTEFWT1JfOChGUk9NXzE2X1RPXzgod091dFsyXSkpOworICAgICpvdXRwdXQrKyA9IFJFVkVSU0VfRkxBVk9SXzgoRlJPTV8xNl9UT184KHdPdXRbM10pKTsKKworICAgIHJldHVybiBvdXRwdXQ7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrNEJ5dGVzU3dhcEZpcnN0KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbM10pOworICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzBdKTsKKyAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFsxXSk7CisgICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMl0pOworCisgICAgcmV0dXJuIG91dHB1dDsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCisvLyBBQkdSCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrNEJ5dGVzU3dhcChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzNdKTsKKyAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFsyXSk7CisgICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMV0pOworICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzBdKTsKKworICAgIHJldHVybiBvdXRwdXQ7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworc3RhdGljCitjbXNVSW50OE51bWJlciogUGFjazRCeXRlc1N3YXBTd2FwRmlyc3QocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFsyXSk7CisgICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMV0pOworICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzBdKTsKKyAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFszXSk7CisKKyAgICByZXR1cm4gb3V0cHV0OworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFBhY2s0V29yZHMocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMF07CisgICAgb3V0cHV0Kz0gMjsKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMV07CisgICAgb3V0cHV0Kz0gMjsKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMl07CisgICAgb3V0cHV0Kz0gMjsKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbM107CisgICAgb3V0cHV0Kz0gMjsKKworICAgIHJldHVybiBvdXRwdXQ7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworc3RhdGljCitjbXNVSW50OE51bWJlciogUGFjazRXb3Jkc1JldmVyc2UocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IFJFVkVSU0VfRkxBVk9SXzE2KHdPdXRbMF0pOworICAgIG91dHB1dCs9IDI7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSBSRVZFUlNFX0ZMQVZPUl8xNih3T3V0WzFdKTsKKyAgICBvdXRwdXQrPSAyOworICAgICooY21zVUludDE2TnVtYmVyKikgb3V0cHV0ID0gUkVWRVJTRV9GTEFWT1JfMTYod091dFsyXSk7CisgICAgb3V0cHV0Kz0gMjsKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IFJFVkVSU0VfRkxBVk9SXzE2KHdPdXRbM10pOworICAgIG91dHB1dCs9IDI7CisKKyAgICByZXR1cm4gb3V0cHV0OworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKKy8vIEFCR1IKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFBhY2s0V29yZHNTd2FwKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzNdOworICAgIG91dHB1dCs9IDI7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzJdOworICAgIG91dHB1dCs9IDI7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzFdOworICAgIG91dHB1dCs9IDI7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzBdOworICAgIG91dHB1dCs9IDI7CisKKyAgICByZXR1cm4gb3V0cHV0OworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKKy8vIENNWUsKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFBhY2s0V29yZHNCaWdFbmRpYW4ocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IENIQU5HRV9FTkRJQU4od091dFswXSk7CisgICAgb3V0cHV0Kz0gMjsKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IENIQU5HRV9FTkRJQU4od091dFsxXSk7CisgICAgb3V0cHV0Kz0gMjsKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IENIQU5HRV9FTkRJQU4od091dFsyXSk7CisgICAgb3V0cHV0Kz0gMjsKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IENIQU5HRV9FTkRJQU4od091dFszXSk7CisgICAgb3V0cHV0Kz0gMjsKKworICAgIHJldHVybiBvdXRwdXQ7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrTGFiVjJfOChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOChGb21MYWJWNFRvTGFiVjIod091dFswXSkpOworICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOChGb21MYWJWNFRvTGFiVjIod091dFsxXSkpOworICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOChGb21MYWJWNFRvTGFiVjIod091dFsyXSkpOworCisgICAgcmV0dXJuIG91dHB1dDsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrQUxhYlYyXzgocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICBvdXRwdXQrKzsKKyAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgoRm9tTGFiVjRUb0xhYlYyKHdPdXRbMF0pKTsKKyAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgoRm9tTGFiVjRUb0xhYlYyKHdPdXRbMV0pKTsKKyAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgoRm9tTGFiVjRUb0xhYlYyKHdPdXRbMl0pKTsKKworICAgIHJldHVybiBvdXRwdXQ7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworc3RhdGljCitjbXNVSW50OE51bWJlciogUGFja0xhYlYyXzE2KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSBGb21MYWJWNFRvTGFiVjIod091dFswXSk7CisgICAgb3V0cHV0ICs9IDI7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSBGb21MYWJWNFRvTGFiVjIod091dFsxXSk7CisgICAgb3V0cHV0ICs9IDI7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSBGb21MYWJWNFRvTGFiVjIod091dFsyXSk7CisgICAgb3V0cHV0ICs9IDI7CisKKyAgICByZXR1cm4gb3V0cHV0OworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFBhY2szQnl0ZXMocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFswXSk7CisgICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMV0pOworICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzJdKTsKKworICAgIHJldHVybiBvdXRwdXQ7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworc3RhdGljCitjbXNVSW50OE51bWJlciogUGFjazNCeXRlc09wdGltaXplZChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgICpvdXRwdXQrKyA9ICh3T3V0WzBdICYgMHhGRik7CisgICAgKm91dHB1dCsrID0gKHdPdXRbMV0gJiAweEZGKTsKKyAgICAqb3V0cHV0KysgPSAod091dFsyXSAmIDB4RkYpOworCisgICAgcmV0dXJuIG91dHB1dDsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrM0J5dGVzU3dhcChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzJdKTsKKyAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFsxXSk7CisgICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMF0pOworCisgICAgcmV0dXJuIG91dHB1dDsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrM0J5dGVzU3dhcE9wdGltaXplZChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgICpvdXRwdXQrKyA9ICh3T3V0WzJdICYgMHhGRik7CisgICAgKm91dHB1dCsrID0gKHdPdXRbMV0gJiAweEZGKTsKKyAgICAqb3V0cHV0KysgPSAod091dFswXSAmIDB4RkYpOworCisgICAgcmV0dXJuIG91dHB1dDsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFBhY2szV29yZHMocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMF07CisgICAgb3V0cHV0Kz0gMjsKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMV07CisgICAgb3V0cHV0Kz0gMjsKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMl07CisgICAgb3V0cHV0Kz0gMjsKKworICAgIHJldHVybiBvdXRwdXQ7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworc3RhdGljCitjbXNVSW50OE51bWJlciogUGFjazNXb3Jkc1N3YXAocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMl07CisgICAgb3V0cHV0Kz0gMjsKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMV07CisgICAgb3V0cHV0Kz0gMjsKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMF07CisgICAgb3V0cHV0Kz0gMjsKKworICAgIHJldHVybiBvdXRwdXQ7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworc3RhdGljCitjbXNVSW50OE51bWJlciogUGFjazNXb3Jkc0JpZ0VuZGlhbihyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgICooY21zVUludDE2TnVtYmVyKikgb3V0cHV0ID0gQ0hBTkdFX0VORElBTih3T3V0WzBdKTsKKyAgICBvdXRwdXQrPSAyOworICAgICooY21zVUludDE2TnVtYmVyKikgb3V0cHV0ID0gQ0hBTkdFX0VORElBTih3T3V0WzFdKTsKKyAgICBvdXRwdXQrPSAyOworICAgICooY21zVUludDE2TnVtYmVyKikgb3V0cHV0ID0gQ0hBTkdFX0VORElBTih3T3V0WzJdKTsKKyAgICBvdXRwdXQrPSAyOworCisgICAgcmV0dXJuIG91dHB1dDsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrM0J5dGVzQW5kU2tpcDEocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFswXSk7CisgICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMV0pOworICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzJdKTsKKyAgICBvdXRwdXQrKzsKKworICAgIHJldHVybiBvdXRwdXQ7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworc3RhdGljCitjbXNVSW50OE51bWJlciogUGFjazNCeXRlc0FuZFNraXAxT3B0aW1pemVkKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgKm91dHB1dCsrID0gKHdPdXRbMF0gJiAweEZGKTsKKyAgICAqb3V0cHV0KysgPSAod091dFsxXSAmIDB4RkYpOworICAgICpvdXRwdXQrKyA9ICh3T3V0WzJdICYgMHhGRik7CisgICAgb3V0cHV0Kys7CisKKyAgICByZXR1cm4gb3V0cHV0OworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKKworc3RhdGljCitjbXNVSW50OE51bWJlciogUGFjazNCeXRlc0FuZFNraXAxU3dhcEZpcnN0KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgb3V0cHV0Kys7CisgICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMF0pOworICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzFdKTsKKyAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFsyXSk7CisKKyAgICByZXR1cm4gb3V0cHV0OworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFBhY2szQnl0ZXNBbmRTa2lwMVN3YXBGaXJzdE9wdGltaXplZChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIG91dHB1dCsrOworICAgICpvdXRwdXQrKyA9ICh3T3V0WzBdICYgMHhGRik7CisgICAgKm91dHB1dCsrID0gKHdPdXRbMV0gJiAweEZGKTsKKyAgICAqb3V0cHV0KysgPSAod091dFsyXSAmIDB4RkYpOworCisgICAgcmV0dXJuIG91dHB1dDsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrM0J5dGVzQW5kU2tpcDFTd2FwKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgb3V0cHV0Kys7CisgICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMl0pOworICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzFdKTsKKyAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFswXSk7CisKKyAgICByZXR1cm4gb3V0cHV0OworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFBhY2szQnl0ZXNBbmRTa2lwMVN3YXBPcHRpbWl6ZWQocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICBvdXRwdXQrKzsKKyAgICAqb3V0cHV0KysgPSAod091dFsyXSAmIDB4RkYpOworICAgICpvdXRwdXQrKyA9ICh3T3V0WzFdICYgMHhGRik7CisgICAgKm91dHB1dCsrID0gKHdPdXRbMF0gJiAweEZGKTsKKworICAgIHJldHVybiBvdXRwdXQ7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrM0J5dGVzQW5kU2tpcDFTd2FwU3dhcEZpcnN0KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMl0pOworICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzFdKTsKKyAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFswXSk7CisgICAgb3V0cHV0Kys7CisKKyAgICByZXR1cm4gb3V0cHV0OworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFBhY2szQnl0ZXNBbmRTa2lwMVN3YXBTd2FwRmlyc3RPcHRpbWl6ZWQocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICAqb3V0cHV0KysgPSAod091dFsyXSAmIDB4RkYpOworICAgICpvdXRwdXQrKyA9ICh3T3V0WzFdICYgMHhGRik7CisgICAgKm91dHB1dCsrID0gKHdPdXRbMF0gJiAweEZGKTsKKyAgICBvdXRwdXQrKzsKKworICAgIHJldHVybiBvdXRwdXQ7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworc3RhdGljCitjbXNVSW50OE51bWJlciogUGFjazNXb3Jkc0FuZFNraXAxKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzBdOworICAgIG91dHB1dCs9IDI7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzFdOworICAgIG91dHB1dCs9IDI7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzJdOworICAgIG91dHB1dCs9IDI7CisgICAgb3V0cHV0Kz0gMjsKKworICAgIHJldHVybiBvdXRwdXQ7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworc3RhdGljCitjbXNVSW50OE51bWJlciogUGFjazNXb3Jkc0FuZFNraXAxU3dhcChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIG91dHB1dCs9IDI7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzJdOworICAgIG91dHB1dCs9IDI7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzFdOworICAgIG91dHB1dCs9IDI7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzBdOworICAgIG91dHB1dCs9IDI7CisKKyAgICByZXR1cm4gb3V0cHV0OworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKKworc3RhdGljCitjbXNVSW50OE51bWJlciogUGFjazNXb3Jkc0FuZFNraXAxU3dhcEZpcnN0KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgb3V0cHV0Kz0gMjsKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMF07CisgICAgb3V0cHV0Kz0gMjsKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMV07CisgICAgb3V0cHV0Kz0gMjsKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMl07CisgICAgb3V0cHV0Kz0gMjsKKworICAgIHJldHVybiBvdXRwdXQ7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrM1dvcmRzQW5kU2tpcDFTd2FwU3dhcEZpcnN0KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzJdOworICAgIG91dHB1dCs9IDI7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzFdOworICAgIG91dHB1dCs9IDI7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzBdOworICAgIG91dHB1dCs9IDI7CisgICAgb3V0cHV0Kz0gMjsKKworICAgIHJldHVybiBvdXRwdXQ7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworCisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFBhY2sxQnl0ZShyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzBdKTsKKworICAgIHJldHVybiBvdXRwdXQ7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrMUJ5dGVSZXZlcnNlZChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOChSRVZFUlNFX0ZMQVZPUl8xNih3T3V0WzBdKSk7CisKKyAgICByZXR1cm4gb3V0cHV0OworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKKworc3RhdGljCitjbXNVSW50OE51bWJlciogUGFjazFCeXRlU2tpcDEocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFswXSk7CisgICAgb3V0cHV0Kys7CisKKyAgICByZXR1cm4gb3V0cHV0OworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKKworc3RhdGljCitjbXNVSW50OE51bWJlciogUGFjazFCeXRlU2tpcDFTd2FwRmlyc3QocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICBvdXRwdXQrKzsKKyAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFswXSk7CisKKyAgICByZXR1cm4gb3V0cHV0OworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Cit9CisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFBhY2sxV29yZChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgICooY21zVUludDE2TnVtYmVyKikgb3V0cHV0ID0gd091dFswXTsKKyAgICBvdXRwdXQrPSAyOworCisgICAgcmV0dXJuIG91dHB1dDsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFBhY2sxV29yZFJldmVyc2VkKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSBSRVZFUlNFX0ZMQVZPUl8xNih3T3V0WzBdKTsKKyAgICBvdXRwdXQrPSAyOworCisgICAgcmV0dXJuIG91dHB1dDsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrMVdvcmRCaWdFbmRpYW4ocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IENIQU5HRV9FTkRJQU4od091dFswXSk7CisgICAgb3V0cHV0Kz0gMjsKKworICAgIHJldHVybiBvdXRwdXQ7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKK30KKworCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrMVdvcmRTa2lwMShyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgICooY21zVUludDE2TnVtYmVyKikgb3V0cHV0ID0gd091dFswXTsKKyAgICBvdXRwdXQrPSA0OworCisgICAgcmV0dXJuIG91dHB1dDsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrMVdvcmRTa2lwMVN3YXBGaXJzdChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIG91dHB1dCArPSAyOworICAgICooY21zVUludDE2TnVtYmVyKikgb3V0cHV0ID0gd091dFswXTsKKyAgICBvdXRwdXQrPSAyOworCisgICAgcmV0dXJuIG91dHB1dDsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOworfQorCisKKy8vIFVuZW5jb2RlZCBGbG9hdCB2YWx1ZXMgLS0gZG9uJ3QgdHJ5IG9wdGltaXplIHNwZWVkCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrTGFiRG91YmxlRnJvbTE2KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisKKyAgICBpZiAoVF9QTEFOQVIoaW5mbyAtPiBPdXRwdXRGb3JtYXQpKSB7CisKKyAgICAgICAgY21zQ0lFTGFiICBMYWI7CisgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIqIE91dCA9IChjbXNGbG9hdDY0TnVtYmVyKikgb3V0cHV0OworICAgICAgICBjbXNMYWJFbmNvZGVkMkZsb2F0KCZMYWIsIHdPdXQpOworCisgICAgICAgIE91dFswXSAgICAgICAgPSBMYWIuTDsKKyAgICAgICAgT3V0W1N0cmlkZV0gICA9IExhYi5hOworICAgICAgICBPdXRbU3RyaWRlKjJdID0gTGFiLmI7CisKKyAgICAgICAgcmV0dXJuIG91dHB1dCArIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKTsKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgY21zTGFiRW5jb2RlZDJGbG9hdCgoY21zQ0lFTGFiKikgb3V0cHV0LCB3T3V0KTsKKyAgICAgICAgcmV0dXJuIG91dHB1dCArIChzaXplb2YoY21zQ0lFTGFiKSArIFRfRVhUUkEoaW5mbyAtPk91dHB1dEZvcm1hdCkgKiBzaXplb2YoY21zRmxvYXQ2NE51bWJlcikpOworICAgIH0KK30KKworCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrTGFiRmxvYXRGcm9tMTYocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICBjbXNDSUVMYWIgIExhYjsKKyAgICBjbXNMYWJFbmNvZGVkMkZsb2F0KCZMYWIsIHdPdXQpOworCisgICAgaWYgKFRfUExBTkFSKGluZm8gLT4gT3V0cHV0Rm9ybWF0KSkgeworICAgICAgIAorICAgICAgICBjbXNGbG9hdDMyTnVtYmVyKiBPdXQgPSAoY21zRmxvYXQzMk51bWJlciopIG91dHB1dDsKKyAgICAKKyAgICAgICAgT3V0WzBdICAgICAgICA9IChjbXNGbG9hdDMyTnVtYmVyKUxhYi5MOworICAgICAgICBPdXRbU3RyaWRlXSAgID0gKGNtc0Zsb2F0MzJOdW1iZXIpTGFiLmE7CisgICAgICAgIE91dFtTdHJpZGUqMl0gPSAoY21zRmxvYXQzMk51bWJlcilMYWIuYjsKKworICAgICAgICByZXR1cm4gb3V0cHV0ICsgc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICgoY21zRmxvYXQzMk51bWJlciopIG91dHB1dClbMF0gPSAoY21zRmxvYXQzMk51bWJlcikgTGFiLkw7CisgICAgICAgKChjbXNGbG9hdDMyTnVtYmVyKikgb3V0cHV0KVsxXSA9IChjbXNGbG9hdDMyTnVtYmVyKSBMYWIuYTsKKyAgICAgICAoKGNtc0Zsb2F0MzJOdW1iZXIqKSBvdXRwdXQpWzJdID0gKGNtc0Zsb2F0MzJOdW1iZXIpIExhYi5iOworCisgICAgICAgIHJldHVybiBvdXRwdXQgKyAoMyArIFRfRVhUUkEoaW5mbyAtPk91dHB1dEZvcm1hdCkpICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpOworICAgIH0KK30KKworc3RhdGljCitjbXNVSW50OE51bWJlciogUGFja1hZWkRvdWJsZUZyb20xNihyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIGlmIChUX1BMQU5BUihJbmZvIC0+IE91dHB1dEZvcm1hdCkpIHsKKworICAgICAgICBjbXNDSUVYWVogWFlaOworICAgICAgICBjbXNGbG9hdDY0TnVtYmVyKiBPdXQgPSAoY21zRmxvYXQ2NE51bWJlciopIG91dHB1dDsKKyAgICAgICAgY21zWFlaRW5jb2RlZDJGbG9hdCgmWFlaLCB3T3V0KTsKKworICAgICAgICBPdXRbMF0gICAgICAgID0gWFlaLlg7CisgICAgICAgIE91dFtTdHJpZGVdICAgPSBYWVouWTsKKyAgICAgICAgT3V0W1N0cmlkZSoyXSA9IFhZWi5aOworCisgICAgICAgIHJldHVybiBvdXRwdXQgKyBzaXplb2YoY21zRmxvYXQ2NE51bWJlcik7CisKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgY21zWFlaRW5jb2RlZDJGbG9hdCgoY21zQ0lFWFlaKikgb3V0cHV0LCB3T3V0KTsKKworICAgICAgICByZXR1cm4gb3V0cHV0ICsgKHNpemVvZihjbXNDSUVYWVopICsgVF9FWFRSQShJbmZvIC0+T3V0cHV0Rm9ybWF0KSAqIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKSk7CisgICAgfQorfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrWFlaRmxvYXRGcm9tMTYocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICBpZiAoVF9QTEFOQVIoSW5mbyAtPiBPdXRwdXRGb3JtYXQpKSB7CisKKyAgICAgICAgY21zQ0lFWFlaIFhZWjsKKyAgICAgICAgY21zRmxvYXQzMk51bWJlciogT3V0ID0gKGNtc0Zsb2F0MzJOdW1iZXIqKSBvdXRwdXQ7CisgICAgICAgIGNtc1hZWkVuY29kZWQyRmxvYXQoJlhZWiwgd091dCk7CisKKyAgICAgICAgT3V0WzBdICAgICAgICA9IChjbXNGbG9hdDMyTnVtYmVyKSBYWVouWDsKKyAgICAgICAgT3V0W1N0cmlkZV0gICA9IChjbXNGbG9hdDMyTnVtYmVyKSBYWVouWTsKKyAgICAgICAgT3V0W1N0cmlkZSoyXSA9IChjbXNGbG9hdDMyTnVtYmVyKSBYWVouWjsKKworICAgICAgICByZXR1cm4gb3V0cHV0ICsgc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpOworCisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgIGNtc0NJRVhZWiBYWVo7CisgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIqIE91dCA9IChjbXNGbG9hdDMyTnVtYmVyKikgb3V0cHV0OworICAgICAgICBjbXNYWVpFbmNvZGVkMkZsb2F0KCZYWVosIHdPdXQpOworCisgICAgICAgIE91dFswXSA9IChjbXNGbG9hdDMyTnVtYmVyKSBYWVouWDsKKyAgICAgICAgT3V0WzFdID0gKGNtc0Zsb2F0MzJOdW1iZXIpIFhZWi5ZOworICAgICAgICBPdXRbMl0gPSAoY21zRmxvYXQzMk51bWJlcikgWFlaLlo7CisKKyAgICAgICAgcmV0dXJuIG91dHB1dCArICgzICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpICsgVF9FWFRSQShJbmZvIC0+T3V0cHV0Rm9ybWF0KSAqIHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKSk7CisgICAgfQorfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrRG91YmxlRnJvbTE2KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgaW50IG5DaGFuICAgICAgPSBUX0NIQU5ORUxTKGluZm8gLT4gT3V0cHV0Rm9ybWF0KTsKKyAgICBpbnQgRG9Td2FwICAgICA9IFRfRE9TV0FQKGluZm8gLT5PdXRwdXRGb3JtYXQpOworICAgIGludCBSZXZlcnNlICAgID0gVF9GTEFWT1IoaW5mbyAtPk91dHB1dEZvcm1hdCk7CisgICAgaW50IEV4dHJhICAgICAgPSBUX0VYVFJBKGluZm8gLT4gT3V0cHV0Rm9ybWF0KTsKKyAgICBpbnQgU3dhcEZpcnN0ICA9IFRfU1dBUEZJUlNUKGluZm8gLT4gT3V0cHV0Rm9ybWF0KTsKKyAgICBpbnQgUGxhbmFyICAgICA9IFRfUExBTkFSKGluZm8gLT4gT3V0cHV0Rm9ybWF0KTsKKyAgICBpbnQgRXh0cmFGaXJzdCA9IERvU3dhcCBeIFN3YXBGaXJzdDsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIG1heGltdW0gPSBJc0lua1NwYWNlKGluZm8gLT5PdXRwdXRGb3JtYXQpID8gNjU1LjM1IDogNjU1MzUuMDsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIHYgPSAwOworICAgIGNtc0Zsb2F0NjROdW1iZXIqIHN3YXAxID0gKGNtc0Zsb2F0NjROdW1iZXIqKSBvdXRwdXQ7CisgICAgaW50IGksIHN0YXJ0ID0gMDsKKworICAgIGlmIChFeHRyYUZpcnN0KQorICAgICAgICBzdGFydCA9IEV4dHJhOworCisgICAgZm9yIChpPTA7IGkgPCBuQ2hhbjsgaSsrKSB7CisKKyAgICAgICAgaW50IGluZGV4ID0gRG9Td2FwID8gKG5DaGFuIC0gaSAtIDEpIDogaTsKKworICAgICAgICB2ID0gKGNtc0Zsb2F0NjROdW1iZXIpIHdPdXRbaW5kZXhdIC8gbWF4aW11bTsKKworICAgICAgICBpZiAoUmV2ZXJzZSkKKyAgICAgICAgICAgIHYgPSBtYXhpbXVtIC0gdjsKKworICAgICAgICBpZiAoUGxhbmFyKQorICAgICAgICAgICAgKChjbXNGbG9hdDY0TnVtYmVyKikgb3V0cHV0KVsoaSArIHN0YXJ0KSAgKiBTdHJpZGVdPSB2OworICAgICAgICBlbHNlCisgICAgICAgICAgICAoKGNtc0Zsb2F0NjROdW1iZXIqKSBvdXRwdXQpW2kgKyBzdGFydF0gPSB2OworICAgIH0KKworCisgICAgaWYgKEV4dHJhID09IDAgJiYgU3dhcEZpcnN0KSB7CisKKyAgICAgICAgIG1lbW1vdmUoc3dhcDEgKyAxLCBzd2FwMSwgKG5DaGFuLTEpKiBzaXplb2YoY21zRmxvYXQ2NE51bWJlcikpOworICAgICAgICAqc3dhcDEgPSB2OworICAgIH0KKworICAgIGlmIChUX1BMQU5BUihpbmZvIC0+IE91dHB1dEZvcm1hdCkpCisgICAgICAgIHJldHVybiBvdXRwdXQgKyBzaXplb2YoY21zRmxvYXQ2NE51bWJlcik7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gb3V0cHV0ICsgKG5DaGFuICsgRXh0cmEpICogc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpOworCit9CisKKworc3RhdGljCitjbXNVSW50OE51bWJlciogUGFja0Zsb2F0RnJvbTE2KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgICAgaW50IG5DaGFuID0gVF9DSEFOTkVMUyhpbmZvLT5PdXRwdXRGb3JtYXQpOworICAgICAgIGludCBEb1N3YXAgPSBUX0RPU1dBUChpbmZvLT5PdXRwdXRGb3JtYXQpOworICAgICAgIGludCBSZXZlcnNlID0gVF9GTEFWT1IoaW5mby0+T3V0cHV0Rm9ybWF0KTsKKyAgICAgICBpbnQgRXh0cmEgPSBUX0VYVFJBKGluZm8tPk91dHB1dEZvcm1hdCk7CisgICAgICAgaW50IFN3YXBGaXJzdCA9IFRfU1dBUEZJUlNUKGluZm8tPk91dHB1dEZvcm1hdCk7CisgICAgICAgaW50IFBsYW5hciA9IFRfUExBTkFSKGluZm8tPk91dHB1dEZvcm1hdCk7CisgICAgICAgaW50IEV4dHJhRmlyc3QgPSBEb1N3YXAgXiBTd2FwRmlyc3Q7CisgICAgICAgY21zRmxvYXQ2NE51bWJlciBtYXhpbXVtID0gSXNJbmtTcGFjZShpbmZvLT5PdXRwdXRGb3JtYXQpID8gNjU1LjM1IDogNjU1MzUuMDsKKyAgICAgICBjbXNGbG9hdDY0TnVtYmVyIHYgPSAwOworICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIqIHN3YXAxID0gKGNtc0Zsb2F0MzJOdW1iZXIqKW91dHB1dDsKKyAgICAgICBpbnQgaSwgc3RhcnQgPSAwOworCisgICAgICAgaWYgKEV4dHJhRmlyc3QpCisgICAgICAgICAgICAgIHN0YXJ0ID0gRXh0cmE7CisKKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgbkNoYW47IGkrKykgeworCisgICAgICAgICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7CisKKyAgICAgICAgICAgICAgdiA9IChjbXNGbG9hdDY0TnVtYmVyKXdPdXRbaW5kZXhdIC8gbWF4aW11bTsKKworICAgICAgICAgICAgICBpZiAoUmV2ZXJzZSkKKyAgICAgICAgICAgICAgICAgICAgIHYgPSBtYXhpbXVtIC0gdjsKKworICAgICAgICAgICAgICBpZiAoUGxhbmFyKQorICAgICAgICAgICAgICAgICAgICAgKChjbXNGbG9hdDMyTnVtYmVyKilvdXRwdXQpWyhpICsgc3RhcnQpICogU3RyaWRlXSA9IChjbXNGbG9hdDMyTnVtYmVyKXY7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICgoY21zRmxvYXQzMk51bWJlciopb3V0cHV0KVtpICsgc3RhcnRdID0gKGNtc0Zsb2F0MzJOdW1iZXIpdjsKKyAgICAgICB9CisKKyAgICAgICAKKyAgICAgICBpZiAoRXh0cmEgPT0gMCAmJiBTd2FwRmlyc3QpIHsKKworICAgICAgICAgICAgICBtZW1tb3ZlKHN3YXAxICsgMSwgc3dhcDEsIChuQ2hhbiAtIDEpKiBzaXplb2YoY21zRmxvYXQzMk51bWJlcikpOworICAgICAgICAgICAgICAqc3dhcDEgPSAoY21zRmxvYXQzMk51bWJlcil2OworICAgICAgIH0KKworICAgICAgIGlmIChUX1BMQU5BUihpbmZvLT5PdXRwdXRGb3JtYXQpKQorICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0ICsgc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpOworICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dCArIChuQ2hhbiArIEV4dHJhKSAqIHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKTsKK30KKworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFBhY2tGbG9hdHNGcm9tRmxvYXQoX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgd091dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDhOdW1iZXIqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgICAgaW50IG5DaGFuID0gVF9DSEFOTkVMUyhpbmZvLT5PdXRwdXRGb3JtYXQpOworICAgICAgIGludCBEb1N3YXAgPSBUX0RPU1dBUChpbmZvLT5PdXRwdXRGb3JtYXQpOworICAgICAgIGludCBSZXZlcnNlID0gVF9GTEFWT1IoaW5mby0+T3V0cHV0Rm9ybWF0KTsKKyAgICAgICBpbnQgRXh0cmEgPSBUX0VYVFJBKGluZm8tPk91dHB1dEZvcm1hdCk7CisgICAgICAgaW50IFN3YXBGaXJzdCA9IFRfU1dBUEZJUlNUKGluZm8tPk91dHB1dEZvcm1hdCk7CisgICAgICAgaW50IFBsYW5hciA9IFRfUExBTkFSKGluZm8tPk91dHB1dEZvcm1hdCk7CisgICAgICAgaW50IEV4dHJhRmlyc3QgPSBEb1N3YXAgXiBTd2FwRmlyc3Q7CisgICAgICAgY21zRmxvYXQ2NE51bWJlciBtYXhpbXVtID0gSXNJbmtTcGFjZShpbmZvLT5PdXRwdXRGb3JtYXQpID8gMTAwLjAgOiAxLjA7CisgICAgICAgY21zRmxvYXQzMk51bWJlciogc3dhcDEgPSAoY21zRmxvYXQzMk51bWJlciopb3V0cHV0OworICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgdiA9IDA7CisgICAgICAgaW50IGksIHN0YXJ0ID0gMDsKKworICAgICAgIGlmIChFeHRyYUZpcnN0KQorICAgICAgICAgICAgICBzdGFydCA9IEV4dHJhOworCisgICAgICAgZm9yIChpID0gMDsgaSA8IG5DaGFuOyBpKyspIHsKKworICAgICAgICAgICAgICBpbnQgaW5kZXggPSBEb1N3YXAgPyAobkNoYW4gLSBpIC0gMSkgOiBpOworCisgICAgICAgICAgICAgIHYgPSB3T3V0W2luZGV4XSAqIG1heGltdW07CisKKyAgICAgICAgICAgICAgaWYgKFJldmVyc2UpCisgICAgICAgICAgICAgICAgICAgICB2ID0gbWF4aW11bSAtIHY7CisKKyAgICAgICAgICAgICAgaWYgKFBsYW5hcikKKyAgICAgICAgICAgICAgICAgICAgICgoY21zRmxvYXQzMk51bWJlciopb3V0cHV0KVsoaSArIHN0YXJ0KSogU3RyaWRlXSA9IChjbXNGbG9hdDMyTnVtYmVyKXY7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICgoY21zRmxvYXQzMk51bWJlciopb3V0cHV0KVtpICsgc3RhcnRdID0gKGNtc0Zsb2F0MzJOdW1iZXIpdjsKKyAgICAgICB9CisKKworICAgICAgIGlmIChFeHRyYSA9PSAwICYmIFN3YXBGaXJzdCkgeworCisgICAgICAgICAgICAgIG1lbW1vdmUoc3dhcDEgKyAxLCBzd2FwMSwgKG5DaGFuIC0gMSkqIHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKSk7CisgICAgICAgICAgICAgICpzd2FwMSA9IChjbXNGbG9hdDMyTnVtYmVyKXY7CisgICAgICAgfQorCisgICAgICAgaWYgKFRfUExBTkFSKGluZm8tPk91dHB1dEZvcm1hdCkpCisgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQgKyBzaXplb2YoY21zRmxvYXQzMk51bWJlcik7CisgICAgICAgZWxzZQorICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0ICsgKG5DaGFuICsgRXh0cmEpICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpOworfQorCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrRG91Ymxlc0Zyb21GbG9hdChfY21zVFJBTlNGT1JNKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50OE51bWJlciogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKyAgICAgICBpbnQgbkNoYW4gPSBUX0NIQU5ORUxTKGluZm8tPk91dHB1dEZvcm1hdCk7CisgICAgICAgaW50IERvU3dhcCA9IFRfRE9TV0FQKGluZm8tPk91dHB1dEZvcm1hdCk7CisgICAgICAgaW50IFJldmVyc2UgPSBUX0ZMQVZPUihpbmZvLT5PdXRwdXRGb3JtYXQpOworICAgICAgIGludCBFeHRyYSA9IFRfRVhUUkEoaW5mby0+T3V0cHV0Rm9ybWF0KTsKKyAgICAgICBpbnQgU3dhcEZpcnN0ID0gVF9TV0FQRklSU1QoaW5mby0+T3V0cHV0Rm9ybWF0KTsKKyAgICAgICBpbnQgUGxhbmFyID0gVF9QTEFOQVIoaW5mby0+T3V0cHV0Rm9ybWF0KTsKKyAgICAgICBpbnQgRXh0cmFGaXJzdCA9IERvU3dhcCBeIFN3YXBGaXJzdDsKKyAgICAgICBjbXNGbG9hdDY0TnVtYmVyIG1heGltdW0gPSBJc0lua1NwYWNlKGluZm8tPk91dHB1dEZvcm1hdCkgPyAxMDAuMCA6IDEuMDsKKyAgICAgICBjbXNGbG9hdDY0TnVtYmVyIHYgPSAwOworICAgICAgIGNtc0Zsb2F0NjROdW1iZXIqIHN3YXAxID0gKGNtc0Zsb2F0NjROdW1iZXIqKW91dHB1dDsKKyAgICAgICBpbnQgaSwgc3RhcnQgPSAwOworCisgICAgICAgaWYgKEV4dHJhRmlyc3QpCisgICAgICAgICAgICAgIHN0YXJ0ID0gRXh0cmE7CisKKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgbkNoYW47IGkrKykgeworCisgICAgICAgICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7CisKKyAgICAgICAgICAgICAgdiA9IHdPdXRbaW5kZXhdICogbWF4aW11bTsKKworICAgICAgICAgICAgICBpZiAoUmV2ZXJzZSkKKyAgICAgICAgICAgICAgICAgICAgIHYgPSBtYXhpbXVtIC0gdjsKKworICAgICAgICAgICAgICBpZiAoUGxhbmFyKQorICAgICAgICAgICAgICAgICAgICAgKChjbXNGbG9hdDY0TnVtYmVyKilvdXRwdXQpWyhpICsgc3RhcnQpICogU3RyaWRlXSA9IHY7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICgoY21zRmxvYXQ2NE51bWJlciopb3V0cHV0KVtpICsgc3RhcnRdID0gdjsKKyAgICAgICB9CisKKyAgICAgICBpZiAoRXh0cmEgPT0gMCAmJiBTd2FwRmlyc3QpIHsKKworICAgICAgICAgICAgICBtZW1tb3ZlKHN3YXAxICsgMSwgc3dhcDEsIChuQ2hhbiAtIDEpKiBzaXplb2YoY21zRmxvYXQ2NE51bWJlcikpOworICAgICAgICAgICAgICAqc3dhcDEgPSB2OworICAgICAgIH0KKworCisgICAgICAgaWYgKFRfUExBTkFSKGluZm8tPk91dHB1dEZvcm1hdCkpCisgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQgKyBzaXplb2YoY21zRmxvYXQ2NE51bWJlcik7CisgICAgICAgZWxzZQorICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0ICsgKG5DaGFuICsgRXh0cmEpICogc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpOworCit9CisKKworCisKKworc3RhdGljCitjbXNVSW50OE51bWJlciogUGFja0xhYkZsb2F0RnJvbUZsb2F0KF9jbXNUUkFOU0ZPUk0qIEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgd091dFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50OE51bWJlciogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIGNtc0Zsb2F0MzJOdW1iZXIqIE91dCA9IChjbXNGbG9hdDMyTnVtYmVyKikgb3V0cHV0OworCisgICAgaWYgKFRfUExBTkFSKEluZm8gLT4gT3V0cHV0Rm9ybWF0KSkgeworCisgICAgICAgIE91dFswXSAgICAgICAgPSAoY21zRmxvYXQzMk51bWJlcikgKHdPdXRbMF0gKiAxMDAuMCk7CisgICAgICAgIE91dFtTdHJpZGVdICAgPSAoY21zRmxvYXQzMk51bWJlcikgKHdPdXRbMV0gKiAyNTUuMCAtIDEyOC4wKTsKKyAgICAgICAgT3V0W1N0cmlkZSoyXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAod091dFsyXSAqIDI1NS4wIC0gMTI4LjApOworCisgICAgICAgIHJldHVybiBvdXRwdXQgKyBzaXplb2YoY21zRmxvYXQzMk51bWJlcik7CisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgIE91dFswXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAod091dFswXSAqIDEwMC4wKTsKKyAgICAgICAgT3V0WzFdID0gKGNtc0Zsb2F0MzJOdW1iZXIpICh3T3V0WzFdICogMjU1LjAgLSAxMjguMCk7CisgICAgICAgIE91dFsyXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAod091dFsyXSAqIDI1NS4wIC0gMTI4LjApOworCisgICAgICAgIHJldHVybiBvdXRwdXQgKyAoc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpKjMgKyBUX0VYVFJBKEluZm8gLT5PdXRwdXRGb3JtYXQpICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpKTsKKyAgICB9CisKK30KKworCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrTGFiRG91YmxlRnJvbUZsb2F0KF9jbXNUUkFOU0ZPUk0qIEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHdPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIGNtc0Zsb2F0NjROdW1iZXIqIE91dCA9IChjbXNGbG9hdDY0TnVtYmVyKikgb3V0cHV0OworCisgICAgaWYgKFRfUExBTkFSKEluZm8gLT4gT3V0cHV0Rm9ybWF0KSkgeworCisgICAgICAgIE91dFswXSAgICAgICAgPSAoY21zRmxvYXQ2NE51bWJlcikgKHdPdXRbMF0gKiAxMDAuMCk7CisgICAgICAgIE91dFtTdHJpZGVdICAgPSAoY21zRmxvYXQ2NE51bWJlcikgKHdPdXRbMV0gKiAyNTUuMCAtIDEyOC4wKTsKKyAgICAgICAgT3V0W1N0cmlkZSoyXSA9IChjbXNGbG9hdDY0TnVtYmVyKSAod091dFsyXSAqIDI1NS4wIC0gMTI4LjApOworCisgICAgICAgIHJldHVybiBvdXRwdXQgKyBzaXplb2YoY21zRmxvYXQ2NE51bWJlcik7CisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgIE91dFswXSA9IChjbXNGbG9hdDY0TnVtYmVyKSAod091dFswXSAqIDEwMC4wKTsKKyAgICAgICAgT3V0WzFdID0gKGNtc0Zsb2F0NjROdW1iZXIpICh3T3V0WzFdICogMjU1LjAgLSAxMjguMCk7CisgICAgICAgIE91dFsyXSA9IChjbXNGbG9hdDY0TnVtYmVyKSAod091dFsyXSAqIDI1NS4wIC0gMTI4LjApOworCisgICAgICAgIHJldHVybiBvdXRwdXQgKyAoc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpKjMgKyBUX0VYVFJBKEluZm8gLT5PdXRwdXRGb3JtYXQpICogc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpKTsKKyAgICB9CisKK30KKworCisvLyBGcm9tIDAuLjEgcmFuZ2UgdG8gMC4uTUFYX0VOQ09ERUFCTEVfWFlaCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrWFlaRmxvYXRGcm9tRmxvYXQoX2Ntc1RSQU5TRk9STSogSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgY21zRmxvYXQzMk51bWJlciogT3V0ID0gKGNtc0Zsb2F0MzJOdW1iZXIqKSBvdXRwdXQ7CisKKyAgICBpZiAoVF9QTEFOQVIoSW5mbyAtPiBPdXRwdXRGb3JtYXQpKSB7CisKKyAgICAgICAgT3V0WzBdICAgICAgICA9IChjbXNGbG9hdDMyTnVtYmVyKSAod091dFswXSAqIE1BWF9FTkNPREVBQkxFX1hZWik7CisgICAgICAgIE91dFtTdHJpZGVdICAgPSAoY21zRmxvYXQzMk51bWJlcikgKHdPdXRbMV0gKiBNQVhfRU5DT0RFQUJMRV9YWVopOworICAgICAgICBPdXRbU3RyaWRlKjJdID0gKGNtc0Zsb2F0MzJOdW1iZXIpICh3T3V0WzJdICogTUFYX0VOQ09ERUFCTEVfWFlaKTsKKworICAgICAgICByZXR1cm4gb3V0cHV0ICsgc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICBPdXRbMF0gPSAoY21zRmxvYXQzMk51bWJlcikgKHdPdXRbMF0gKiBNQVhfRU5DT0RFQUJMRV9YWVopOworICAgICAgICBPdXRbMV0gPSAoY21zRmxvYXQzMk51bWJlcikgKHdPdXRbMV0gKiBNQVhfRU5DT0RFQUJMRV9YWVopOworICAgICAgICBPdXRbMl0gPSAoY21zRmxvYXQzMk51bWJlcikgKHdPdXRbMl0gKiBNQVhfRU5DT0RFQUJMRV9YWVopOworCisgICAgICAgIHJldHVybiBvdXRwdXQgKyAoc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpKjMgKyBUX0VYVFJBKEluZm8gLT5PdXRwdXRGb3JtYXQpICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpKTsKKyAgICB9CisKK30KKworLy8gU2FtZSwgYnV0IGNvbnZlcnQgdG8gZG91YmxlCitzdGF0aWMKK2Ntc1VJbnQ4TnVtYmVyKiBQYWNrWFlaRG91YmxlRnJvbUZsb2F0KF9jbXNUUkFOU0ZPUk0qIEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHdPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgIGNtc0Zsb2F0NjROdW1iZXIqIE91dCA9IChjbXNGbG9hdDY0TnVtYmVyKikgb3V0cHV0OworCisgICAgaWYgKFRfUExBTkFSKEluZm8gLT4gT3V0cHV0Rm9ybWF0KSkgeworCisgICAgICAgIE91dFswXSAgICAgICAgPSAoY21zRmxvYXQ2NE51bWJlcikgKHdPdXRbMF0gKiBNQVhfRU5DT0RFQUJMRV9YWVopOworICAgICAgICBPdXRbU3RyaWRlXSAgID0gKGNtc0Zsb2F0NjROdW1iZXIpICh3T3V0WzFdICogTUFYX0VOQ09ERUFCTEVfWFlaKTsKKyAgICAgICAgT3V0W1N0cmlkZSoyXSA9IChjbXNGbG9hdDY0TnVtYmVyKSAod091dFsyXSAqIE1BWF9FTkNPREVBQkxFX1hZWik7CisKKyAgICAgICAgcmV0dXJuIG91dHB1dCArIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKTsKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgT3V0WzBdID0gKGNtc0Zsb2F0NjROdW1iZXIpICh3T3V0WzBdICogTUFYX0VOQ09ERUFCTEVfWFlaKTsKKyAgICAgICAgT3V0WzFdID0gKGNtc0Zsb2F0NjROdW1iZXIpICh3T3V0WzFdICogTUFYX0VOQ09ERUFCTEVfWFlaKTsKKyAgICAgICAgT3V0WzJdID0gKGNtc0Zsb2F0NjROdW1iZXIpICh3T3V0WzJdICogTUFYX0VOQ09ERUFCTEVfWFlaKTsKKworICAgICAgICByZXR1cm4gb3V0cHV0ICsgKHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKSozICsgVF9FWFRSQShJbmZvIC0+T3V0cHV0Rm9ybWF0KSAqIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKSk7CisgICAgfQorCit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZuZGVmIENNU19OT19IQUxGX1NVUFBPUlQgCisKKy8vIERlY29kZXMgYW4gc3RyZWFtIG9mIGhhbGYgZmxvYXRzIHRvIHdJbltdIGRlc2NyaWJlZCBieSBpbnB1dCBmb3JtYXQKKworc3RhdGljCitjbXNVSW50OE51bWJlciogVW5yb2xsSGFsZlRvMTYocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisKKyAgICBpbnQgbkNoYW4gICAgICA9IFRfQ0hBTk5FTFMoaW5mbyAtPiBJbnB1dEZvcm1hdCk7CisgICAgaW50IERvU3dhcCAgICAgPSBUX0RPU1dBUChpbmZvIC0+SW5wdXRGb3JtYXQpOworICAgIGludCBSZXZlcnNlICAgID0gVF9GTEFWT1IoaW5mbyAtPklucHV0Rm9ybWF0KTsKKyAgICBpbnQgU3dhcEZpcnN0ICA9IFRfU1dBUEZJUlNUKGluZm8gLT4gSW5wdXRGb3JtYXQpOworICAgIGludCBFeHRyYSAgICAgID0gVF9FWFRSQShpbmZvIC0+IElucHV0Rm9ybWF0KTsKKyAgICBpbnQgRXh0cmFGaXJzdCA9IERvU3dhcCBeIFN3YXBGaXJzdDsKKyAgICBpbnQgUGxhbmFyICAgICA9IFRfUExBTkFSKGluZm8gLT4gSW5wdXRGb3JtYXQpOworICAgIGNtc0Zsb2F0MzJOdW1iZXIgdjsKKyAgICBpbnQgaSwgc3RhcnQgPSAwOworICAgIGNtc0Zsb2F0MzJOdW1iZXIgbWF4aW11bSA9IElzSW5rU3BhY2UoaW5mbyAtPklucHV0Rm9ybWF0KSA/IDY1NS4zNUYgOiA2NTUzNS4wRjsKKworCisgICAgaWYgKEV4dHJhRmlyc3QpCisgICAgICAgICAgICBzdGFydCA9IEV4dHJhOworCisgICAgZm9yIChpPTA7IGkgPCBuQ2hhbjsgaSsrKSB7CisKKyAgICAgICAgaW50IGluZGV4ID0gRG9Td2FwID8gKG5DaGFuIC0gaSAtIDEpIDogaTsKKworICAgICAgICBpZiAoUGxhbmFyKQorICAgICAgICAgICAgdiA9IF9jbXNIYWxmMkZsb2F0ICggKChjbXNVSW50MTZOdW1iZXIqKSBhY2N1bSlbKGkgKyBzdGFydCkgKiBTdHJpZGVdICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHYgPSBfY21zSGFsZjJGbG9hdCAoICgoY21zVUludDE2TnVtYmVyKikgYWNjdW0pW2kgKyBzdGFydF0gKSA7CisKKyAgICAgICAgaWYgKFJldmVyc2UpIHYgPSBtYXhpbXVtIC0gdjsKKworICAgICAgICB3SW5baW5kZXhdID0gX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKHYgKiBtYXhpbXVtKTsKKyAgICB9CisKKworICAgIGlmIChFeHRyYSA9PSAwICYmIFN3YXBGaXJzdCkgeworICAgICAgICBjbXNVSW50MTZOdW1iZXIgdG1wID0gd0luWzBdOworCisgICAgICAgIG1lbW1vdmUoJndJblswXSwgJndJblsxXSwgKG5DaGFuLTEpICogc2l6ZW9mKGNtc1VJbnQxNk51bWJlcikpOworICAgICAgICB3SW5bbkNoYW4tMV0gPSB0bXA7CisgICAgfQorCisgICAgaWYgKFRfUExBTkFSKGluZm8gLT4gSW5wdXRGb3JtYXQpKQorICAgICAgICByZXR1cm4gYWNjdW0gKyBzaXplb2YoY21zVUludDE2TnVtYmVyKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBhY2N1bSArIChuQ2hhbiArIEV4dHJhKSAqIHNpemVvZihjbXNVSW50MTZOdW1iZXIpOworfQorCisvLyBEZWNvZGVzIGFuIHN0cmVhbSBvZiBoYWxmIGZsb2F0cyB0byB3SW5bXSBkZXNjcmliZWQgYnkgaW5wdXQgZm9ybWF0CisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFVucm9sbEhhbGZUb0Zsb2F0KF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHdJbltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDhOdW1iZXIqIGFjY3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKK3sKKworICAgIGludCBuQ2hhbiAgICAgID0gVF9DSEFOTkVMUyhpbmZvIC0+IElucHV0Rm9ybWF0KTsKKyAgICBpbnQgRG9Td2FwICAgICA9IFRfRE9TV0FQKGluZm8gLT5JbnB1dEZvcm1hdCk7CisgICAgaW50IFJldmVyc2UgICAgPSBUX0ZMQVZPUihpbmZvIC0+SW5wdXRGb3JtYXQpOworICAgIGludCBTd2FwRmlyc3QgID0gVF9TV0FQRklSU1QoaW5mbyAtPiBJbnB1dEZvcm1hdCk7CisgICAgaW50IEV4dHJhICAgICAgPSBUX0VYVFJBKGluZm8gLT4gSW5wdXRGb3JtYXQpOworICAgIGludCBFeHRyYUZpcnN0ID0gRG9Td2FwIF4gU3dhcEZpcnN0OworICAgIGludCBQbGFuYXIgICAgID0gVF9QTEFOQVIoaW5mbyAtPiBJbnB1dEZvcm1hdCk7CisgICAgY21zRmxvYXQzMk51bWJlciB2OworICAgIGludCBpLCBzdGFydCA9IDA7CisgICAgY21zRmxvYXQzMk51bWJlciBtYXhpbXVtID0gSXNJbmtTcGFjZShpbmZvIC0+SW5wdXRGb3JtYXQpID8gMTAwLjBGIDogMS4wRjsKKworCisgICAgaWYgKEV4dHJhRmlyc3QpCisgICAgICAgICAgICBzdGFydCA9IEV4dHJhOworCisgICAgZm9yIChpPTA7IGkgPCBuQ2hhbjsgaSsrKSB7CisKKyAgICAgICAgaW50IGluZGV4ID0gRG9Td2FwID8gKG5DaGFuIC0gaSAtIDEpIDogaTsKKworICAgICAgICBpZiAoUGxhbmFyKQorICAgICAgICAgICAgdiA9ICBfY21zSGFsZjJGbG9hdCAoICgoY21zVUludDE2TnVtYmVyKikgYWNjdW0pWyhpICsgc3RhcnQpICogU3RyaWRlXSApOworICAgICAgICBlbHNlCisgICAgICAgICAgICB2ID0gIF9jbXNIYWxmMkZsb2F0ICggKChjbXNVSW50MTZOdW1iZXIqKSBhY2N1bSlbaSArIHN0YXJ0XSApIDsKKworICAgICAgICB2IC89IG1heGltdW07CisKKyAgICAgICAgd0luW2luZGV4XSA9IFJldmVyc2UgPyAxIC0gdiA6IHY7CisgICAgfQorCisKKyAgICBpZiAoRXh0cmEgPT0gMCAmJiBTd2FwRmlyc3QpIHsKKyAgICAgICAgY21zRmxvYXQzMk51bWJlciB0bXAgPSB3SW5bMF07CisKKyAgICAgICAgbWVtbW92ZSgmd0luWzBdLCAmd0luWzFdLCAobkNoYW4tMSkgKiBzaXplb2YoY21zRmxvYXQzMk51bWJlcikpOworICAgICAgICB3SW5bbkNoYW4tMV0gPSB0bXA7CisgICAgfQorCisgICAgaWYgKFRfUExBTkFSKGluZm8gLT4gSW5wdXRGb3JtYXQpKQorICAgICAgICByZXR1cm4gYWNjdW0gKyBzaXplb2YoY21zVUludDE2TnVtYmVyKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBhY2N1bSArIChuQ2hhbiArIEV4dHJhKSAqIHNpemVvZihjbXNVSW50MTZOdW1iZXIpOworfQorCisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFBhY2tIYWxmRnJvbTE2KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCit7CisgICAgICAgaW50IG5DaGFuID0gVF9DSEFOTkVMUyhpbmZvLT5PdXRwdXRGb3JtYXQpOworICAgICAgIGludCBEb1N3YXAgPSBUX0RPU1dBUChpbmZvLT5PdXRwdXRGb3JtYXQpOworICAgICAgIGludCBSZXZlcnNlID0gVF9GTEFWT1IoaW5mby0+T3V0cHV0Rm9ybWF0KTsKKyAgICAgICBpbnQgRXh0cmEgPSBUX0VYVFJBKGluZm8tPk91dHB1dEZvcm1hdCk7CisgICAgICAgaW50IFN3YXBGaXJzdCA9IFRfU1dBUEZJUlNUKGluZm8tPk91dHB1dEZvcm1hdCk7CisgICAgICAgaW50IFBsYW5hciA9IFRfUExBTkFSKGluZm8tPk91dHB1dEZvcm1hdCk7CisgICAgICAgaW50IEV4dHJhRmlyc3QgPSBEb1N3YXAgXiBTd2FwRmlyc3Q7CisgICAgICAgY21zRmxvYXQzMk51bWJlciBtYXhpbXVtID0gSXNJbmtTcGFjZShpbmZvLT5PdXRwdXRGb3JtYXQpID8gNjU1LjM1RiA6IDY1NTM1LjBGOworICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgdiA9IDA7CisgICAgICAgY21zVUludDE2TnVtYmVyKiBzd2FwMSA9IChjbXNVSW50MTZOdW1iZXIqKW91dHB1dDsKKyAgICAgICBpbnQgaSwgc3RhcnQgPSAwOworCisgICAgICAgaWYgKEV4dHJhRmlyc3QpCisgICAgICAgICAgICAgIHN0YXJ0ID0gRXh0cmE7CisKKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgbkNoYW47IGkrKykgeworCisgICAgICAgICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7CisKKyAgICAgICAgICAgICAgdiA9IChjbXNGbG9hdDMyTnVtYmVyKXdPdXRbaW5kZXhdIC8gbWF4aW11bTsKKworICAgICAgICAgICAgICBpZiAoUmV2ZXJzZSkKKyAgICAgICAgICAgICAgICAgICAgIHYgPSBtYXhpbXVtIC0gdjsKKworICAgICAgICAgICAgICBpZiAoUGxhbmFyKQorICAgICAgICAgICAgICAgICAgICAgKChjbXNVSW50MTZOdW1iZXIqKW91dHB1dClbKGkgKyBzdGFydCkgKiBTdHJpZGVdID0gX2Ntc0Zsb2F0MkhhbGYodik7CisgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICgoY21zVUludDE2TnVtYmVyKilvdXRwdXQpW2kgKyBzdGFydF0gPSBfY21zRmxvYXQySGFsZih2KTsKKyAgICAgICB9CisKKworICAgICAgIGlmIChFeHRyYSA9PSAwICYmIFN3YXBGaXJzdCkgeworCisgICAgICAgICAgICAgIG1lbW1vdmUoc3dhcDEgKyAxLCBzd2FwMSwgKG5DaGFuIC0gMSkqIHNpemVvZihjbXNVSW50MTZOdW1iZXIpKTsKKyAgICAgICAgICAgICAgKnN3YXAxID0gX2Ntc0Zsb2F0MkhhbGYodik7CisgICAgICAgfQorCisgICAgICAgaWYgKFRfUExBTkFSKGluZm8tPk91dHB1dEZvcm1hdCkpCisgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQgKyBzaXplb2YoY21zVUludDE2TnVtYmVyKTsKKyAgICAgICBlbHNlCisgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQgKyAobkNoYW4gKyBFeHRyYSkgKiBzaXplb2YoY21zVUludDE2TnVtYmVyKTsKK30KKworCisKK3N0YXRpYworY21zVUludDhOdW1iZXIqIFBhY2tIYWxmRnJvbUZsb2F0KF9jbXNUUkFOU0ZPUk0qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHdPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQoreworICAgICAgIGludCBuQ2hhbiA9IFRfQ0hBTk5FTFMoaW5mby0+T3V0cHV0Rm9ybWF0KTsKKyAgICAgICBpbnQgRG9Td2FwID0gVF9ET1NXQVAoaW5mby0+T3V0cHV0Rm9ybWF0KTsKKyAgICAgICBpbnQgUmV2ZXJzZSA9IFRfRkxBVk9SKGluZm8tPk91dHB1dEZvcm1hdCk7CisgICAgICAgaW50IEV4dHJhID0gVF9FWFRSQShpbmZvLT5PdXRwdXRGb3JtYXQpOworICAgICAgIGludCBTd2FwRmlyc3QgPSBUX1NXQVBGSVJTVChpbmZvLT5PdXRwdXRGb3JtYXQpOworICAgICAgIGludCBQbGFuYXIgPSBUX1BMQU5BUihpbmZvLT5PdXRwdXRGb3JtYXQpOworICAgICAgIGludCBFeHRyYUZpcnN0ID0gRG9Td2FwIF4gU3dhcEZpcnN0OworICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgbWF4aW11bSA9IElzSW5rU3BhY2UoaW5mby0+T3V0cHV0Rm9ybWF0KSA/IDEwMC4wRiA6IDEuMEY7CisgICAgICAgY21zVUludDE2TnVtYmVyKiBzd2FwMSA9IChjbXNVSW50MTZOdW1iZXIqKW91dHB1dDsKKyAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHYgPSAwOworICAgICAgIGludCBpLCBzdGFydCA9IDA7CisKKyAgICAgICBpZiAoRXh0cmFGaXJzdCkKKyAgICAgICAgICAgICAgc3RhcnQgPSBFeHRyYTsKKworICAgICAgIGZvciAoaSA9IDA7IGkgPCBuQ2hhbjsgaSsrKSB7CisKKyAgICAgICAgICAgICAgaW50IGluZGV4ID0gRG9Td2FwID8gKG5DaGFuIC0gaSAtIDEpIDogaTsKKworICAgICAgICAgICAgICB2ID0gd091dFtpbmRleF0gKiBtYXhpbXVtOworCisgICAgICAgICAgICAgIGlmIChSZXZlcnNlKQorICAgICAgICAgICAgICAgICAgICAgdiA9IG1heGltdW0gLSB2OworCisgICAgICAgICAgICAgIGlmIChQbGFuYXIpCisgICAgICAgICAgICAgICAgICAgICAoKGNtc1VJbnQxNk51bWJlciopb3V0cHV0KVsoaSArIHN0YXJ0KSogU3RyaWRlXSA9IF9jbXNGbG9hdDJIYWxmKHYpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAoKGNtc1VJbnQxNk51bWJlciopb3V0cHV0KVtpICsgc3RhcnRdID0gX2Ntc0Zsb2F0MkhhbGYodik7CisgICAgICAgfQorCisKKyAgICAgICBpZiAoRXh0cmEgPT0gMCAmJiBTd2FwRmlyc3QpIHsKKworICAgICAgICAgICAgICBtZW1tb3ZlKHN3YXAxICsgMSwgc3dhcDEsIChuQ2hhbiAtIDEpKiBzaXplb2YoY21zVUludDE2TnVtYmVyKSk7CisgICAgICAgICAgICAgICpzd2FwMSA9IChjbXNVSW50MTZOdW1iZXIpX2Ntc0Zsb2F0MkhhbGYodik7CisgICAgICAgfQorCisgICAgICAgaWYgKFRfUExBTkFSKGluZm8tPk91dHB1dEZvcm1hdCkpCisgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQgKyBzaXplb2YoY21zVUludDE2TnVtYmVyKTsKKyAgICAgICBlbHNlCisgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQgKyAobkNoYW4gKyBFeHRyYSkqIHNpemVvZihjbXNVSW50MTZOdW1iZXIpOworfQorCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK3N0YXRpYyBjbXNGb3JtYXR0ZXJzMTYgSW5wdXRGb3JtYXR0ZXJzMTZbXSA9IHsKKworICAgIC8vICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXNrICAgICAgICAgICAgICAgICAgRnVuY3Rpb24KKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHsgVFlQRV9MYWJfREJMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVBMQU5BUnxBTllFWFRSQSwgICBVbnJvbGxMYWJEb3VibGVUbzE2fSwKKyAgICB7IFRZUEVfWFlaX0RCTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllQTEFOQVJ8QU5ZRVhUUkEsICAgVW5yb2xsWFlaRG91YmxlVG8xNn0sCisgICAgeyBUWVBFX0xhYl9GTFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZUExBTkFSfEFOWUVYVFJBLCAgIFVucm9sbExhYkZsb2F0VG8xNn0sCisgICAgeyBUWVBFX1hZWl9GTFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZUExBTkFSfEFOWUVYVFJBLCAgIFVucm9sbFhZWkZsb2F0VG8xNn0sCisgICAgeyBUWVBFX0dSQVlfREJMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgIFVucm9sbERvdWJsZTFDaGFufSwKKyAgICB7IEZMT0FUX1NIKDEpfEJZVEVTX1NIKDApLCBBTllDSEFOTkVMU3xBTllQTEFOQVJ8QU5ZU1dBUEZJUlNUfEFOWUZMQVZPUnwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVNXQVB8QU5ZRVhUUkF8QU5ZU1BBQ0UsICAgVW5yb2xsRG91YmxlVG8xNn0sCisgICAgeyBGTE9BVF9TSCgxKXxCWVRFU19TSCg0KSwgQU5ZQ0hBTk5FTFN8QU5ZUExBTkFSfEFOWVNXQVBGSVJTVHxBTllGTEFWT1J8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllTV0FQfEFOWUVYVFJBfEFOWVNQQUNFLCAgIFVucm9sbEZsb2F0VG8xNn0sCisjaWZuZGVmIENNU19OT19IQUxGX1NVUFBPUlQgCisgICAgeyBGTE9BVF9TSCgxKXxCWVRFU19TSCgyKSwgQU5ZQ0hBTk5FTFN8QU5ZUExBTkFSfEFOWVNXQVBGSVJTVHxBTllGTEFWT1J8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWUVYVFJBfEFOWVNXQVB8QU5ZU1BBQ0UsICAgVW5yb2xsSGFsZlRvMTZ9LAorI2VuZGlmCisKKyAgICB7IENIQU5ORUxTX1NIKDEpfEJZVEVTX1NIKDEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgVW5yb2xsMUJ5dGV9LAorICAgIHsgQ0hBTk5FTFNfU0goMSl8QllURVNfU0goMSl8RVhUUkFfU0goMSksICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBVbnJvbGwxQnl0ZVNraXAxfSwKKyAgICB7IENIQU5ORUxTX1NIKDEpfEJZVEVTX1NIKDEpfEVYVFJBX1NIKDIpLCAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgVW5yb2xsMUJ5dGVTa2lwMn0sCisgICAgeyBDSEFOTkVMU19TSCgxKXxCWVRFU19TSCgxKXxGTEFWT1JfU0goMSksICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFVucm9sbDFCeXRlUmV2ZXJzZWR9LAorICAgIHsgQ09MT1JTUEFDRV9TSChQVF9NQ0gyKXxDSEFOTkVMU19TSCgyKXxCWVRFU19TSCgxKSwgICAgICAgICAgICAgIDAsICBVbnJvbGwyQnl0ZXN9LAorCisgICAgeyBUWVBFX0xhYlYyXzgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIFVucm9sbExhYlYyXzggfSwKKyAgICB7IFRZUEVfQUxhYlYyXzgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgVW5yb2xsQUxhYlYyXzggfSwKKyAgICB7IFRZUEVfTGFiVjJfMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgVW5yb2xsTGFiVjJfMTYgfSwKKworICAgIHsgQ0hBTk5FTFNfU0goMyl8QllURVNfU0goMSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBVbnJvbGwzQnl0ZXN9LAorICAgIHsgQ0hBTk5FTFNfU0goMyl8QllURVNfU0goMSl8RE9TV0FQX1NIKDEpLCAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBVbnJvbGwzQnl0ZXNTd2FwfSwKKyAgICB7IENIQU5ORUxTX1NIKDMpfEVYVFJBX1NIKDEpfEJZVEVTX1NIKDEpfERPU1dBUF9TSCgxKSwgICAgIEFOWVNQQUNFLCAgVW5yb2xsM0J5dGVzU2tpcDFTd2FwfSwKKyAgICB7IENIQU5ORUxTX1NIKDMpfEVYVFJBX1NIKDEpfEJZVEVTX1NIKDEpfFNXQVBGSVJTVF9TSCgxKSwgIEFOWVNQQUNFLCAgVW5yb2xsM0J5dGVzU2tpcDFTd2FwRmlyc3R9LAorCisgICAgeyBDSEFOTkVMU19TSCgzKXxFWFRSQV9TSCgxKXxCWVRFU19TSCgxKXxET1NXQVBfU0goMSl8U1dBUEZJUlNUX1NIKDEpLCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFVucm9sbDNCeXRlc1NraXAxU3dhcFN3YXBGaXJzdH0sCisKKyAgICB7IENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgVW5yb2xsNEJ5dGVzfSwKKyAgICB7IENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDEpfEZMQVZPUl9TSCgxKSwgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgVW5yb2xsNEJ5dGVzUmV2ZXJzZX0sCisgICAgeyBDSEFOTkVMU19TSCg0KXxCWVRFU19TSCgxKXxTV0FQRklSU1RfU0goMSksICAgICAgICAgICAgICBBTllTUEFDRSwgIFVucm9sbDRCeXRlc1N3YXBGaXJzdH0sCisgICAgeyBDSEFOTkVMU19TSCg0KXxCWVRFU19TSCgxKXxET1NXQVBfU0goMSksICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFVucm9sbDRCeXRlc1N3YXB9LAorICAgIHsgQ0hBTk5FTFNfU0goNCl8QllURVNfU0goMSl8RE9TV0FQX1NIKDEpfFNXQVBGSVJTVF9TSCgxKSwgQU5ZU1BBQ0UsICBVbnJvbGw0Qnl0ZXNTd2FwU3dhcEZpcnN0fSwKKworICAgIHsgQllURVNfU0goMSl8UExBTkFSX1NIKDEpLCBBTllGTEFWT1J8QU5ZU1dBUEZJUlNUfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllTV0FQfEFOWUVYVFJBfEFOWUNIQU5ORUxTfEFOWVNQQUNFLCBVbnJvbGxQbGFuYXJCeXRlc30sCisKKyAgICB7IEJZVEVTX1NIKDEpLCAgICBBTllGTEFWT1J8QU5ZU1dBUEZJUlNUfEFOWVNXQVB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZRVhUUkF8QU5ZQ0hBTk5FTFN8QU5ZU1BBQ0UsIFVucm9sbENodW5reUJ5dGVzfSwKKworICAgIHsgQ0hBTk5FTFNfU0goMSl8QllURVNfU0goMiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBVbnJvbGwxV29yZH0sCisgICAgeyBDSEFOTkVMU19TSCgxKXxCWVRFU19TSCgyKXxGTEFWT1JfU0goMSksICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFVucm9sbDFXb3JkUmV2ZXJzZWR9LAorICAgIHsgQ0hBTk5FTFNfU0goMSl8QllURVNfU0goMil8RVhUUkFfU0goMyksICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBVbnJvbGwxV29yZFNraXAzfSwKKworICAgIHsgQ0hBTk5FTFNfU0goMil8QllURVNfU0goMiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBVbnJvbGwyV29yZHN9LAorICAgIHsgQ0hBTk5FTFNfU0goMyl8QllURVNfU0goMiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBVbnJvbGwzV29yZHN9LAorICAgIHsgQ0hBTk5FTFNfU0goNCl8QllURVNfU0goMiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBVbnJvbGw0V29yZHN9LAorCisgICAgeyBDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxET1NXQVBfU0goMSksICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFVucm9sbDNXb3Jkc1N3YXB9LAorICAgIHsgQ0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RVhUUkFfU0goMSl8U1dBUEZJUlNUX1NIKDEpLCAgQU5ZU1BBQ0UsICBVbnJvbGwzV29yZHNTa2lwMVN3YXBGaXJzdH0sCisgICAgeyBDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxFWFRSQV9TSCgxKXxET1NXQVBfU0goMSksICAgICBBTllTUEFDRSwgIFVucm9sbDNXb3Jkc1NraXAxU3dhcH0sCisgICAgeyBDSEFOTkVMU19TSCg0KXxCWVRFU19TSCgyKXxGTEFWT1JfU0goMSksICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFVucm9sbDRXb3Jkc1JldmVyc2V9LAorICAgIHsgQ0hBTk5FTFNfU0goNCl8QllURVNfU0goMil8U1dBUEZJUlNUX1NIKDEpLCAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBVbnJvbGw0V29yZHNTd2FwRmlyc3R9LAorICAgIHsgQ0hBTk5FTFNfU0goNCl8QllURVNfU0goMil8RE9TV0FQX1NIKDEpLCAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBVbnJvbGw0V29yZHNTd2FwfSwKKyAgICB7IENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKXxTV0FQRklSU1RfU0goMSksIEFOWVNQQUNFLCAgVW5yb2xsNFdvcmRzU3dhcFN3YXBGaXJzdH0sCisKKworICAgIHsgQllURVNfU0goMil8UExBTkFSX1NIKDEpLCAgQU5ZRkxBVk9SfEFOWVNXQVB8QU5ZRU5ESUFOfEFOWUVYVFJBfEFOWUNIQU5ORUxTfEFOWVNQQUNFLCAgVW5yb2xsUGxhbmFyV29yZHN9LAorICAgIHsgQllURVNfU0goMiksICBBTllGTEFWT1J8QU5ZU1dBUEZJUlNUfEFOWVNXQVB8QU5ZRU5ESUFOfEFOWUVYVFJBfEFOWUNIQU5ORUxTfEFOWVNQQUNFLCAgVW5yb2xsQW55V29yZHN9LAorfTsKKworCisKK3N0YXRpYyBjbXNGb3JtYXR0ZXJzRmxvYXQgSW5wdXRGb3JtYXR0ZXJzRmxvYXRbXSA9IHsKKworICAgIC8vICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXNrICAgICAgICAgICAgICAgICAgRnVuY3Rpb24KKyAgICAvLyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHsgICAgIFRZUEVfTGFiX0RCTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVBMQU5BUnxBTllFWFRSQSwgICBVbnJvbGxMYWJEb3VibGVUb0Zsb2F0fSwKKyAgICB7ICAgICBUWVBFX0xhYl9GTFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllQTEFOQVJ8QU5ZRVhUUkEsICAgVW5yb2xsTGFiRmxvYXRUb0Zsb2F0fSwKKworICAgIHsgICAgIFRZUEVfWFlaX0RCTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVBMQU5BUnxBTllFWFRSQSwgICBVbnJvbGxYWVpEb3VibGVUb0Zsb2F0fSwKKyAgICB7ICAgICBUWVBFX1hZWl9GTFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllQTEFOQVJ8QU5ZRVhUUkEsICAgVW5yb2xsWFlaRmxvYXRUb0Zsb2F0fSwKKworICAgIHsgICAgIEZMT0FUX1NIKDEpfEJZVEVTX1NIKDQpLCBBTllQTEFOQVJ8QU5ZU1dBUEZJUlNUfEFOWVNXQVB8QU5ZRVhUUkF8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllDSEFOTkVMU3xBTllTUEFDRSwgIFVucm9sbEZsb2F0c1RvRmxvYXR9LAorCisgICAgeyAgICAgRkxPQVRfU0goMSl8QllURVNfU0goMCksIEFOWVBMQU5BUnxBTllTV0FQRklSU1R8QU5ZU1dBUHxBTllFWFRSQXwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZQ0hBTk5FTFN8QU5ZU1BBQ0UsICBVbnJvbGxEb3VibGVzVG9GbG9hdH0sCisjaWZuZGVmIENNU19OT19IQUxGX1NVUFBPUlQgCisgICAgeyAgICAgRkxPQVRfU0goMSl8QllURVNfU0goMiksIEFOWVBMQU5BUnxBTllTV0FQRklSU1R8QU5ZU1dBUHxBTllFWFRSQXwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZQ0hBTk5FTFN8QU5ZU1BBQ0UsICBVbnJvbGxIYWxmVG9GbG9hdH0sCisjZW5kaWYKK307CisKKworLy8gQml0IGZpZWxkcyBzZXQgdG8gb25lIGluIHRoZSBtYXNrIGFyZSBub3QgY29tcGFyZWQKK3N0YXRpYworY21zRm9ybWF0dGVyIF9jbXNHZXRTdG9ja0lucHV0Rm9ybWF0dGVyKGNtc1VJbnQzMk51bWJlciBkd0lucHV0LCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgaTsKKyAgICBjbXNGb3JtYXR0ZXIgZnI7CisKKyAgICBzd2l0Y2ggKGR3RmxhZ3MpIHsKKworICAgIGNhc2UgQ01TX1BBQ0tfRkxBR1NfMTZCSVRTOiB7CisgICAgICAgIGZvciAoaT0wOyBpIDwgc2l6ZW9mKElucHV0Rm9ybWF0dGVyczE2KSAvIHNpemVvZihjbXNGb3JtYXR0ZXJzMTYpOyBpKyspIHsKKyAgICAgICAgICAgIGNtc0Zvcm1hdHRlcnMxNiogZiA9IElucHV0Rm9ybWF0dGVyczE2ICsgaTsKKworICAgICAgICAgICAgaWYgKChkd0lucHV0ICYgfmYgLT5NYXNrKSA9PSBmIC0+VHlwZSkgeworICAgICAgICAgICAgICAgIGZyLkZtdDE2ID0gZiAtPkZybTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisKKyAgICBjYXNlIENNU19QQUNLX0ZMQUdTX0ZMT0FUOiB7CisgICAgICAgIGZvciAoaT0wOyBpIDwgc2l6ZW9mKElucHV0Rm9ybWF0dGVyc0Zsb2F0KSAvIHNpemVvZihjbXNGb3JtYXR0ZXJzRmxvYXQpOyBpKyspIHsKKyAgICAgICAgICAgIGNtc0Zvcm1hdHRlcnNGbG9hdCogZiA9IElucHV0Rm9ybWF0dGVyc0Zsb2F0ICsgaTsKKworICAgICAgICAgICAgaWYgKChkd0lucHV0ICYgfmYgLT5NYXNrKSA9PSBmIC0+VHlwZSkgeworICAgICAgICAgICAgICAgIGZyLkZtdEZsb2F0ID0gZiAtPkZybTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OjsKKworICAgIH0KKworICAgIGZyLkZtdDE2ID0gTlVMTDsKKyAgICByZXR1cm4gZnI7Cit9CisKK3N0YXRpYyBjbXNGb3JtYXR0ZXJzMTYgT3V0cHV0Rm9ybWF0dGVyczE2W10gPSB7CisgICAgLy8gICAgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hc2sgICAgICAgICAgICAgICAgICBGdW5jdGlvbgorICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICB7IFRZUEVfTGFiX0RCTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVBMQU5BUnxBTllFWFRSQSwgIFBhY2tMYWJEb3VibGVGcm9tMTZ9LAorICAgIHsgVFlQRV9YWVpfREJMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZUExBTkFSfEFOWUVYVFJBLCAgUGFja1hZWkRvdWJsZUZyb20xNn0sCisKKyAgICB7IFRZUEVfTGFiX0ZMVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVBMQU5BUnxBTllFWFRSQSwgIFBhY2tMYWJGbG9hdEZyb20xNn0sCisgICAgeyBUWVBFX1hZWl9GTFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllQTEFOQVJ8QU5ZRVhUUkEsICBQYWNrWFlaRmxvYXRGcm9tMTZ9LAorICAgIAorICAgIHsgRkxPQVRfU0goMSl8QllURVNfU0goMCksICAgICAgQU5ZRkxBVk9SfEFOWVNXQVBGSVJTVHxBTllTV0FQfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZQ0hBTk5FTFN8QU5ZUExBTkFSfEFOWUVYVFJBfEFOWVNQQUNFLCAgUGFja0RvdWJsZUZyb20xNn0sCisgICAgeyBGTE9BVF9TSCgxKXxCWVRFU19TSCg0KSwgICAgICBBTllGTEFWT1J8QU5ZU1dBUEZJUlNUfEFOWVNXQVB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllDSEFOTkVMU3xBTllQTEFOQVJ8QU5ZRVhUUkF8QU5ZU1BBQ0UsICBQYWNrRmxvYXRGcm9tMTZ9LAorI2lmbmRlZiBDTVNfTk9fSEFMRl9TVVBQT1JUIAorICAgIHsgRkxPQVRfU0goMSl8QllURVNfU0goMiksICAgICAgQU5ZRkxBVk9SfEFOWVNXQVBGSVJTVHxBTllTV0FQfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZQ0hBTk5FTFN8QU5ZUExBTkFSfEFOWUVYVFJBfEFOWVNQQUNFLCAgUGFja0hhbGZGcm9tMTZ9LAorI2VuZGlmCisKKyAgICB7IENIQU5ORUxTX1NIKDEpfEJZVEVTX1NIKDEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2sxQnl0ZX0sCisgICAgeyBDSEFOTkVMU19TSCgxKXxCWVRFU19TSCgxKXxFWFRSQV9TSCgxKSwgICAgICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBQYWNrMUJ5dGVTa2lwMX0sCisgICAgeyBDSEFOTkVMU19TSCgxKXxCWVRFU19TSCgxKXxFWFRSQV9TSCgxKXxTV0FQRklSU1RfU0goMSksICAgICAgQU5ZU1BBQ0UsICBQYWNrMUJ5dGVTa2lwMVN3YXBGaXJzdH0sCisKKyAgICB7IENIQU5ORUxTX1NIKDEpfEJZVEVTX1NIKDEpfEZMQVZPUl9TSCgxKSwgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2sxQnl0ZVJldmVyc2VkfSwKKworICAgIHsgVFlQRV9MYWJWMl84LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgUGFja0xhYlYyXzggfSwKKyAgICB7IFRZUEVfQUxhYlYyXzgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIFBhY2tBTGFiVjJfOCB9LAorICAgIHsgVFlQRV9MYWJWMl8xNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgUGFja0xhYlYyXzE2IH0sCisKKyAgICB7IENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpfE9QVElNSVpFRF9TSCgxKSwgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2szQnl0ZXNPcHRpbWl6ZWR9LAorICAgIHsgQ0hBTk5FTFNfU0goMyl8QllURVNfU0goMSl8RVhUUkFfU0goMSl8T1BUSU1JWkVEX1NIKDEpLCAgICAgIEFOWVNQQUNFLCAgUGFjazNCeXRlc0FuZFNraXAxT3B0aW1pemVkfSwKKyAgICB7IENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpfEVYVFJBX1NIKDEpfFNXQVBGSVJTVF9TSCgxKXxPUFRJTUlaRURfU0goMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBQYWNrM0J5dGVzQW5kU2tpcDFTd2FwRmlyc3RPcHRpbWl6ZWR9LAorICAgIHsgQ0hBTk5FTFNfU0goMyl8QllURVNfU0goMSl8RVhUUkFfU0goMSl8RE9TV0FQX1NIKDEpfFNXQVBGSVJTVF9TSCgxKXxPUFRJTUlaRURfU0goMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBQYWNrM0J5dGVzQW5kU2tpcDFTd2FwU3dhcEZpcnN0T3B0aW1pemVkfSwKKyAgICB7IENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpfERPU1dBUF9TSCgxKXxFWFRSQV9TSCgxKXxPUFRJTUlaRURfU0goMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBQYWNrM0J5dGVzQW5kU2tpcDFTd2FwT3B0aW1pemVkfSwKKyAgICB7IENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpfERPU1dBUF9TSCgxKXxPUFRJTUlaRURfU0goMSksICAgICBBTllTUEFDRSwgIFBhY2szQnl0ZXNTd2FwT3B0aW1pemVkfSwKKworCisKKyAgICB7IENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2szQnl0ZXN9LAorICAgIHsgQ0hBTk5FTFNfU0goMyl8QllURVNfU0goMSl8RVhUUkFfU0goMSksICAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazNCeXRlc0FuZFNraXAxfSwKKyAgICB7IENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpfEVYVFJBX1NIKDEpfFNXQVBGSVJTVF9TSCgxKSwgICAgICBBTllTUEFDRSwgIFBhY2szQnl0ZXNBbmRTa2lwMVN3YXBGaXJzdH0sCisgICAgeyBDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKXxFWFRSQV9TSCgxKXxET1NXQVBfU0goMSl8U1dBUEZJUlNUX1NIKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazNCeXRlc0FuZFNraXAxU3dhcFN3YXBGaXJzdH0sCisgICAgeyBDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKXxET1NXQVBfU0goMSl8RVhUUkFfU0goMSksICAgICAgICAgQU5ZU1BBQ0UsICBQYWNrM0J5dGVzQW5kU2tpcDFTd2FwfSwKKyAgICB7IENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpfERPU1dBUF9TSCgxKSwgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2szQnl0ZXNTd2FwfSwKKyAgICB7IENIQU5ORUxTX1NIKDYpfEJZVEVTX1NIKDEpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2s2Qnl0ZXN9LAorICAgIHsgQ0hBTk5FTFNfU0goNil8QllURVNfU0goMSl8RE9TV0FQX1NIKDEpLCAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazZCeXRlc1N3YXB9LAorICAgIHsgQ0hBTk5FTFNfU0goNCl8QllURVNfU0goMSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazRCeXRlc30sCisgICAgeyBDSEFOTkVMU19TSCg0KXxCWVRFU19TSCgxKXxGTEFWT1JfU0goMSksICAgICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBQYWNrNEJ5dGVzUmV2ZXJzZX0sCisgICAgeyBDSEFOTkVMU19TSCg0KXxCWVRFU19TSCgxKXxTV0FQRklSU1RfU0goMSksICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBQYWNrNEJ5dGVzU3dhcEZpcnN0fSwKKyAgICB7IENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDEpfERPU1dBUF9TSCgxKSwgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2s0Qnl0ZXNTd2FwfSwKKyAgICB7IENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDEpfERPU1dBUF9TSCgxKXxTV0FQRklSU1RfU0goMSksICAgICBBTllTUEFDRSwgIFBhY2s0Qnl0ZXNTd2FwU3dhcEZpcnN0fSwKKworICAgIHsgQllURVNfU0goMSksICAgICAgICAgICAgICAgICBBTllGTEFWT1J8QU5ZU1dBUEZJUlNUfEFOWVNXQVB8QU5ZRVhUUkF8QU5ZQ0hBTk5FTFN8QU5ZU1BBQ0UsIFBhY2tBbnlCeXRlc30sCisgICAgeyBCWVRFU19TSCgxKXxQTEFOQVJfU0goMSksICAgIEFOWUZMQVZPUnxBTllTV0FQRklSU1R8QU5ZU1dBUHxBTllFWFRSQXxBTllDSEFOTkVMU3xBTllTUEFDRSwgUGFja1BsYW5hckJ5dGVzfSwKKworICAgIHsgQ0hBTk5FTFNfU0goMSl8QllURVNfU0goMiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazFXb3JkfSwKKyAgICB7IENIQU5ORUxTX1NIKDEpfEJZVEVTX1NIKDIpfEVYVFJBX1NIKDEpLCAgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2sxV29yZFNraXAxfSwKKyAgICB7IENIQU5ORUxTX1NIKDEpfEJZVEVTX1NIKDIpfEVYVFJBX1NIKDEpfFNXQVBGSVJTVF9TSCgxKSwgICAgICBBTllTUEFDRSwgIFBhY2sxV29yZFNraXAxU3dhcEZpcnN0fSwKKyAgICB7IENIQU5ORUxTX1NIKDEpfEJZVEVTX1NIKDIpfEZMQVZPUl9TSCgxKSwgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2sxV29yZFJldmVyc2VkfSwKKyAgICB7IENIQU5ORUxTX1NIKDEpfEJZVEVTX1NIKDIpfEVORElBTjE2X1NIKDEpLCAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2sxV29yZEJpZ0VuZGlhbn0sCisgICAgeyBDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBQYWNrM1dvcmRzfSwKKyAgICB7IENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKSwgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2szV29yZHNTd2FwfSwKKyAgICB7IENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfEVORElBTjE2X1NIKDEpLCAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2szV29yZHNCaWdFbmRpYW59LAorICAgIHsgQ0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RVhUUkFfU0goMSksICAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazNXb3Jkc0FuZFNraXAxfSwKKyAgICB7IENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfEVYVFJBX1NIKDEpfERPU1dBUF9TSCgxKSwgICAgICAgICBBTllTUEFDRSwgIFBhY2szV29yZHNBbmRTa2lwMVN3YXB9LAorICAgIHsgQ0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RVhUUkFfU0goMSl8U1dBUEZJUlNUX1NIKDEpLCAgICAgIEFOWVNQQUNFLCAgUGFjazNXb3Jkc0FuZFNraXAxU3dhcEZpcnN0fSwKKworICAgIHsgQ0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RVhUUkFfU0goMSl8RE9TV0FQX1NIKDEpfFNXQVBGSVJTVF9TSCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2szV29yZHNBbmRTa2lwMVN3YXBTd2FwRmlyc3R9LAorCisgICAgeyBDSEFOTkVMU19TSCg0KXxCWVRFU19TSCgyKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBQYWNrNFdvcmRzfSwKKyAgICB7IENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDIpfEZMQVZPUl9TSCgxKSwgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2s0V29yZHNSZXZlcnNlfSwKKyAgICB7IENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKSwgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2s0V29yZHNTd2FwfSwKKyAgICB7IENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDIpfEVORElBTjE2X1NIKDEpLCAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2s0V29yZHNCaWdFbmRpYW59LAorCisgICAgeyBDSEFOTkVMU19TSCg2KXxCWVRFU19TSCgyKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBQYWNrNldvcmRzfSwKKyAgICB7IENIQU5ORUxTX1NIKDYpfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKSwgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2s2V29yZHNTd2FwfSwKKworICAgIHsgQllURVNfU0goMil8UExBTkFSX1NIKDEpLCAgICAgQU5ZRkxBVk9SfEFOWUVORElBTnxBTllTV0FQfEFOWUVYVFJBfEFOWUNIQU5ORUxTfEFOWVNQQUNFLCBQYWNrUGxhbmFyV29yZHN9LAorICAgIHsgQllURVNfU0goMiksICAgICAgICAgICAgICAgICAgQU5ZRkxBVk9SfEFOWVNXQVBGSVJTVHxBTllTV0FQfEFOWUVORElBTnxBTllFWFRSQXxBTllDSEFOTkVMU3xBTllTUEFDRSwgUGFja0FueVdvcmRzfQorCit9OworCisKK3N0YXRpYyBjbXNGb3JtYXR0ZXJzRmxvYXQgT3V0cHV0Rm9ybWF0dGVyc0Zsb2F0W10gPSB7CisgICAgLy8gICAgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbgorICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgeyAgICAgVFlQRV9MYWJfRkxULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVBMQU5BUnxBTllFWFRSQSwgICBQYWNrTGFiRmxvYXRGcm9tRmxvYXR9LAorICAgIHsgICAgIFRZUEVfWFlaX0ZMVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllQTEFOQVJ8QU5ZRVhUUkEsICAgUGFja1hZWkZsb2F0RnJvbUZsb2F0fSwKKworICAgIHsgICAgIFRZUEVfTGFiX0RCTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllQTEFOQVJ8QU5ZRVhUUkEsICAgUGFja0xhYkRvdWJsZUZyb21GbG9hdH0sCisgICAgeyAgICAgVFlQRV9YWVpfREJMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVBMQU5BUnxBTllFWFRSQSwgICBQYWNrWFlaRG91YmxlRnJvbUZsb2F0fSwKKworICAgIHsgICAgIEZMT0FUX1NIKDEpfEJZVEVTX1NIKDQpLCBBTllQTEFOQVJ8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWUZMQVZPUnxBTllTV0FQRklSU1R8QU5ZU1dBUHxBTllFWFRSQXxBTllDSEFOTkVMU3xBTllTUEFDRSwgICBQYWNrRmxvYXRzRnJvbUZsb2F0IH0sCisgICAgeyAgICAgRkxPQVRfU0goMSl8QllURVNfU0goMCksIEFOWVBMQU5BUnwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZRkxBVk9SfEFOWVNXQVBGSVJTVHxBTllTV0FQfEFOWUVYVFJBfEFOWUNIQU5ORUxTfEFOWVNQQUNFLCAgIFBhY2tEb3VibGVzRnJvbUZsb2F0IH0sCisjaWZuZGVmIENNU19OT19IQUxGX1NVUFBPUlQgCisgICAgeyAgICAgRkxPQVRfU0goMSl8QllURVNfU0goMiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZRkxBVk9SfEFOWVNXQVBGSVJTVHxBTllTV0FQfEFOWUVYVFJBfEFOWUNIQU5ORUxTfEFOWVNQQUNFLCAgIFBhY2tIYWxmRnJvbUZsb2F0IH0sCisjZW5kaWYKKworCisKK307CisKKworLy8gQml0IGZpZWxkcyBzZXQgdG8gb25lIGluIHRoZSBtYXNrIGFyZSBub3QgY29tcGFyZWQKK3N0YXRpYworY21zRm9ybWF0dGVyIF9jbXNHZXRTdG9ja091dHB1dEZvcm1hdHRlcihjbXNVSW50MzJOdW1iZXIgZHdJbnB1dCwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpCit7CisgICAgY21zVUludDMyTnVtYmVyIGk7CisgICAgY21zRm9ybWF0dGVyIGZyOworCisgICAgLy8gT3B0aW1pemF0aW9uIGlzIG9ubHkgYSBoaW50CisgICAgZHdJbnB1dCAmPSB+T1BUSU1JWkVEX1NIKDEpOworCisgICAgc3dpdGNoIChkd0ZsYWdzKQorICAgIHsKKworICAgICBjYXNlIENNU19QQUNLX0ZMQUdTXzE2QklUUzogeworCisgICAgICAgIGZvciAoaT0wOyBpIDwgc2l6ZW9mKE91dHB1dEZvcm1hdHRlcnMxNikgLyBzaXplb2YoY21zRm9ybWF0dGVyczE2KTsgaSsrKSB7CisgICAgICAgICAgICBjbXNGb3JtYXR0ZXJzMTYqIGYgPSBPdXRwdXRGb3JtYXR0ZXJzMTYgKyBpOworCisgICAgICAgICAgICBpZiAoKGR3SW5wdXQgJiB+ZiAtPk1hc2spID09IGYgLT5UeXBlKSB7CisgICAgICAgICAgICAgICAgZnIuRm10MTYgPSBmIC0+RnJtOworICAgICAgICAgICAgICAgIHJldHVybiBmcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDTVNfUEFDS19GTEFHU19GTE9BVDogeworCisgICAgICAgIGZvciAoaT0wOyBpIDwgc2l6ZW9mKE91dHB1dEZvcm1hdHRlcnNGbG9hdCkgLyBzaXplb2YoY21zRm9ybWF0dGVyc0Zsb2F0KTsgaSsrKSB7CisgICAgICAgICAgICBjbXNGb3JtYXR0ZXJzRmxvYXQqIGYgPSBPdXRwdXRGb3JtYXR0ZXJzRmxvYXQgKyBpOworCisgICAgICAgICAgICBpZiAoKGR3SW5wdXQgJiB+ZiAtPk1hc2spID09IGYgLT5UeXBlKSB7CisgICAgICAgICAgICAgICAgZnIuRm10RmxvYXQgPSBmIC0+RnJtOworICAgICAgICAgICAgICAgIHJldHVybiBmcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDo7CisKKyAgICB9CisKKyAgICBmci5GbXQxNiA9IE5VTEw7CisgICAgcmV0dXJuIGZyOworfQorCisKK3R5cGVkZWYgc3RydWN0IF9jbXNfZm9ybWF0dGVyc19mYWN0b3J5X2xpc3QgeworCisgICAgY21zRm9ybWF0dGVyRmFjdG9yeSBGYWN0b3J5OworICAgIHN0cnVjdCBfY21zX2Zvcm1hdHRlcnNfZmFjdG9yeV9saXN0ICpOZXh0OworCit9IGNtc0Zvcm1hdHRlcnNGYWN0b3J5TGlzdDsKKworX2Ntc0Zvcm1hdHRlcnNQbHVnaW5DaHVua1R5cGUgX2Ntc0Zvcm1hdHRlcnNQbHVnaW5DaHVuayA9IHsgTlVMTCB9OworCisKKy8vIER1cGxpY2F0ZXMgdGhlIHpvbmUgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIHBsdWctaW4gaW4gdGhlIG5ldyBjb250ZXh0CitzdGF0aWMKK3ZvaWQgRHVwRm9ybWF0dGVyRmFjdG9yeUxpc3Qoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQoreworICAgX2Ntc0Zvcm1hdHRlcnNQbHVnaW5DaHVua1R5cGUgbmV3SGVhZCA9IHsgTlVMTCB9OworICAgY21zRm9ybWF0dGVyc0ZhY3RvcnlMaXN0KiAgZW50cnk7CisgICBjbXNGb3JtYXR0ZXJzRmFjdG9yeUxpc3QqICBBbnRlcmlvciA9IE5VTEw7CisgICBfY21zRm9ybWF0dGVyc1BsdWdpbkNodW5rVHlwZSogaGVhZCA9IChfY21zRm9ybWF0dGVyc1BsdWdpbkNodW5rVHlwZSopIHNyYy0+Y2h1bmtzW0Zvcm1hdHRlcnNQbHVnaW5dOworCisgICAgIF9jbXNBc3NlcnQoaGVhZCAhPSBOVUxMKTsKKworICAgLy8gV2FsayB0aGUgbGlzdCBjb3B5aW5nIGFsbCBub2RlcworICAgZm9yIChlbnRyeSA9IGhlYWQtPkZhY3RvcnlMaXN0OworICAgICAgIGVudHJ5ICE9IE5VTEw7CisgICAgICAgZW50cnkgPSBlbnRyeSAtPk5leHQpIHsKKworICAgICAgICAgICBjbXNGb3JtYXR0ZXJzRmFjdG9yeUxpc3QgKm5ld0VudHJ5ID0gKCBjbXNGb3JtYXR0ZXJzRmFjdG9yeUxpc3QgKikgX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsIGVudHJ5LCBzaXplb2YoY21zRm9ybWF0dGVyc0ZhY3RvcnlMaXN0KSk7CisKKyAgICAgICAgICAgaWYgKG5ld0VudHJ5ID09IE5VTEwpIAorICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgIC8vIFdlIHdhbnQgdG8ga2VlcCB0aGUgbGlua2VkIGxpc3Qgb3JkZXIsIHNvIHRoaXMgaXMgYSBsaXR0bGUgYml0IHRyaWNreQorICAgICAgICAgICBuZXdFbnRyeSAtPiBOZXh0ID0gTlVMTDsKKyAgICAgICAgICAgaWYgKEFudGVyaW9yKQorICAgICAgICAgICAgICAgQW50ZXJpb3IgLT4gTmV4dCA9IG5ld0VudHJ5OworCisgICAgICAgICAgIEFudGVyaW9yID0gbmV3RW50cnk7CisKKyAgICAgICAgICAgaWYgKG5ld0hlYWQuRmFjdG9yeUxpc3QgPT0gTlVMTCkKKyAgICAgICAgICAgICAgIG5ld0hlYWQuRmFjdG9yeUxpc3QgPSBuZXdFbnRyeTsKKyAgIH0KKworICAgY3R4IC0+Y2h1bmtzW0Zvcm1hdHRlcnNQbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eC0+TWVtUG9vbCwgJm5ld0hlYWQsIHNpemVvZihfY21zRm9ybWF0dGVyc1BsdWdpbkNodW5rVHlwZSkpOworfQorCisvLyBUaGUgaW50ZXJwb2xhdGlvbiBwbHVnLWluIG1lbW9yeSBjaHVuayBhbGxvY2F0b3IvZHVwCit2b2lkIF9jbXNBbGxvY0Zvcm1hdHRlcnNQbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQoreworICAgICAgX2Ntc0Fzc2VydChjdHggIT0gTlVMTCk7CisKKyAgICAgaWYgKHNyYyAhPSBOVUxMKSB7CisgICAgICAgIAorICAgICAgICAgLy8gRHVwbGljYXRlIHRoZSBMSVNUCisgICAgICAgICBEdXBGb3JtYXR0ZXJGYWN0b3J5TGlzdChjdHgsIHNyYyk7CisgICAgIH0KKyAgICAgZWxzZSB7CisgICAgICAgICAgc3RhdGljIF9jbXNGb3JtYXR0ZXJzUGx1Z2luQ2h1bmtUeXBlIEZvcm1hdHRlcnNQbHVnaW5DaHVuayA9IHsgTlVMTCB9OworICAgICAgICAgIGN0eCAtPmNodW5rc1tGb3JtYXR0ZXJzUGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCAmRm9ybWF0dGVyc1BsdWdpbkNodW5rLCBzaXplb2YoX2Ntc0Zvcm1hdHRlcnNQbHVnaW5DaHVua1R5cGUpKTsKKyAgICAgfQorfQorCisKKworLy8gRm9ybWF0dGVycyBtYW5hZ2VtZW50CitjbXNCb29sICBfY21zUmVnaXN0ZXJGb3JtYXR0ZXJzUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBEYXRhKQoreworICAgIF9jbXNGb3JtYXR0ZXJzUGx1Z2luQ2h1bmtUeXBlKiBjdHggPSAoIF9jbXNGb3JtYXR0ZXJzUGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIEZvcm1hdHRlcnNQbHVnaW4pOworICAgIGNtc1BsdWdpbkZvcm1hdHRlcnMqIFBsdWdpbiA9IChjbXNQbHVnaW5Gb3JtYXR0ZXJzKikgRGF0YTsKKyAgICBjbXNGb3JtYXR0ZXJzRmFjdG9yeUxpc3QqIGZsIDsKKworICAgIC8vIFJlc2V0IHRvIGJ1aWx0LWluIGRlZmF1bHRzCisgICAgaWYgKERhdGEgPT0gTlVMTCkgeworCisgICAgICAgICAgY3R4IC0+RmFjdG9yeUxpc3QgPSBOVUxMOworICAgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIGZsID0gKGNtc0Zvcm1hdHRlcnNGYWN0b3J5TGlzdCopIF9jbXNQbHVnaW5NYWxsb2MoQ29udGV4dElELCBzaXplb2YoY21zRm9ybWF0dGVyc0ZhY3RvcnlMaXN0KSk7CisgICAgaWYgKGZsID09IE5VTEwpIHJldHVybiBGQUxTRTsKKworICAgIGZsIC0+RmFjdG9yeSAgICA9IFBsdWdpbiAtPkZvcm1hdHRlcnNGYWN0b3J5OworCisgICAgZmwgLT5OZXh0ID0gY3R4IC0+IEZhY3RvcnlMaXN0OworICAgIGN0eCAtPkZhY3RvcnlMaXN0ID0gZmw7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworY21zRm9ybWF0dGVyIF9jbXNHZXRGb3JtYXR0ZXIoY21zQ29udGV4dCBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBUeXBlLCAgICAgICAgIC8vIFNwZWNpZmljIHR5cGUsIGkuZS4gVFlQRV9SR0JfOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGb3JtYXR0ZXJEaXJlY3Rpb24gRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKK3sKKyAgICBfY21zRm9ybWF0dGVyc1BsdWdpbkNodW5rVHlwZSogY3R4ID0gKCBfY21zRm9ybWF0dGVyc1BsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBGb3JtYXR0ZXJzUGx1Z2luKTsKKyAgICBjbXNGb3JtYXR0ZXJzRmFjdG9yeUxpc3QqIGY7CisKKyAgICBmb3IgKGYgPWN0eC0+RmFjdG9yeUxpc3Q7IGYgIT0gTlVMTDsgZiA9IGYgLT5OZXh0KSB7CisKKyAgICAgICAgY21zRm9ybWF0dGVyIGZuID0gZiAtPkZhY3RvcnkoVHlwZSwgRGlyLCBkd0ZsYWdzKTsKKyAgICAgICAgaWYgKGZuLkZtdDE2ICE9IE5VTEwpIHJldHVybiBmbjsKKyAgICB9CisKKyAgICAvLyBSZXZlcnQgdG8gZGVmYXVsdAorICAgIGlmIChEaXIgPT0gY21zRm9ybWF0dGVySW5wdXQpCisgICAgICAgIHJldHVybiBfY21zR2V0U3RvY2tJbnB1dEZvcm1hdHRlcihUeXBlLCBkd0ZsYWdzKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBfY21zR2V0U3RvY2tPdXRwdXRGb3JtYXR0ZXIoVHlwZSwgZHdGbGFncyk7Cit9CisKKworLy8gUmV0dXJuIHdoYXRldmVyIGdpdmVuIGZvcm1hdHRlciByZWZlcnMgdG8gZmxvYXQgdmFsdWVzCitjbXNCb29sICBfY21zRm9ybWF0dGVySXNGbG9hdChjbXNVSW50MzJOdW1iZXIgVHlwZSkKK3sKKyAgICByZXR1cm4gVF9GTE9BVChUeXBlKSA/IFRSVUUgOiBGQUxTRTsKK30KKworLy8gUmV0dXJuIHdoYXRldmVyIGdpdmVuIGZvcm1hdHRlciByZWZlcnMgdG8gOCBiaXRzCitjbXNCb29sICBfY21zRm9ybWF0dGVySXM4Yml0KGNtc1VJbnQzMk51bWJlciBUeXBlKQoreworICAgIGludCBCeXRlcyA9IFRfQllURVMoVHlwZSk7CisKKyAgICByZXR1cm4gKEJ5dGVzID09IDEpOworfQorCisvLyBCdWlsZCBhIHN1aXRhYmxlIGZvcm1hdHRlciBmb3IgdGhlIGNvbG9yc3BhY2Ugb2YgdGhpcyBwcm9maWxlCitjbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0Zvcm1hdHRlckZvckNvbG9yc3BhY2VPZlByb2ZpbGUoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBuQnl0ZXMsIGNtc0Jvb2wgbElzRmxvYXQpCit7CisKKyAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2UgICAgICA9IGNtc0dldENvbG9yU3BhY2UoaFByb2ZpbGUpOworICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgQ29sb3JTcGFjZUJpdHMgID0gX2Ntc0xDTVNjb2xvclNwYWNlKENvbG9yU3BhY2UpOworICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgbk91dHB1dENoYW5zICAgID0gY21zQ2hhbm5lbHNPZihDb2xvclNwYWNlKTsKKyAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgIEZsb2F0ICAgICAgICAgICA9IGxJc0Zsb2F0ID8gMSA6IDA7CisKKyAgICAvLyBDcmVhdGUgYSBmYWtlIGZvcm1hdHRlciBmb3IgcmVzdWx0CisgICAgcmV0dXJuIEZMT0FUX1NIKEZsb2F0KSB8IENPTE9SU1BBQ0VfU0goQ29sb3JTcGFjZUJpdHMpIHwgQllURVNfU0gobkJ5dGVzKSB8IENIQU5ORUxTX1NIKG5PdXRwdXRDaGFucyk7Cit9CisKKy8vIEJ1aWxkIGEgc3VpdGFibGUgZm9ybWF0dGVyIGZvciB0aGUgY29sb3JzcGFjZSBvZiB0aGlzIHByb2ZpbGUKK2Ntc1VJbnQzMk51bWJlciBDTVNFWFBPUlQgY21zRm9ybWF0dGVyRm9yUENTT2ZQcm9maWxlKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50MzJOdW1iZXIgbkJ5dGVzLCBjbXNCb29sIGxJc0Zsb2F0KQoreworCisgICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBDb2xvclNwYWNlICAgICAgPSBjbXNHZXRQQ1MoaFByb2ZpbGUpOworICAgIGludCAgICAgICAgICAgICAgICAgICAgQ29sb3JTcGFjZUJpdHMgID0gX2Ntc0xDTVNjb2xvclNwYWNlKENvbG9yU3BhY2UpOworICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgbk91dHB1dENoYW5zICAgID0gY21zQ2hhbm5lbHNPZihDb2xvclNwYWNlKTsKKyAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgIEZsb2F0ICAgICAgICAgICA9IGxJc0Zsb2F0ID8gMSA6IDA7CisKKyAgICAvLyBDcmVhdGUgYSBmYWtlIGZvcm1hdHRlciBmb3IgcmVzdWx0CisgICAgcmV0dXJuIEZMT0FUX1NIKEZsb2F0KSB8IENPTE9SU1BBQ0VfU0goQ29sb3JTcGFjZUJpdHMpIHwgQllURVNfU0gobkJ5dGVzKSB8IENIQU5ORUxTX1NIKG5PdXRwdXRDaGFucyk7Cit9CisKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3Bjcy5jIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zcGNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkOGVjYgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3Bjcy5jCkBAIC0wLDAgKzEsOTQwIEBACisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KKy8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNiBNYXJ0aSBNYXJpYSBTYWd1ZXIKKy8vCisvLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKy8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKy8vIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKy8vIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorLy8gYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlCisvLyBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorLy8KKy8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisvLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKy8vCisvLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKy8vIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTworLy8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKy8vIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKKy8vIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKy8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisKKyNpbmNsdWRlICJsY21zMl9pbnRlcm5hbC5oIgorCisvLyAgICAgIGludGVyIFBDUyBjb252ZXJzaW9ucyBYWVogPC0+IENJRSBMKiBhKiBiKgorLyoKKworCisgICAgICAgQ0lFIDE1OjIwMDQgQ0lFTGFiIGlzIGRlZmluZWQgYXM6CisKKyAgICAgICBMKiA9IDExNipmKFkvWW4pIC0gMTYgICAgICAgICAgICAgICAgICAgICAwIDw9IEwqIDw9IDEwMAorICAgICAgIGEqID0gNTAwKltmKFgvWG4pIC0gZihZL1luKV0KKyAgICAgICBiKiA9IDIwMCpbZihZL1luKSAtIGYoWi9abildCisKKyAgICAgICBhbmQKKworICAgICAgICAgICAgICBmKHQpID0gdF4oMS8zKSAgICAgICAgICAgICAgICAgICAgIDEgPj0gdCA+ICAoMjQvMTE2KV4zCisgICAgICAgICAgICAgICAgICAgICAoODQxLzEwOCkqdCArICgxNi8xMTYpICAgICAgMCA8PSB0IDw9ICgyNC8xMTYpXjMKKworCisgICAgICAgUmV2ZXJzZSB0cmFuc2Zvcm0gaXM6CisKKyAgICAgICBYID0gWG4qW2EqIC8gNTAwICsgKEwqICsgMTYpIC8gMTE2XSBeIDMgICBpZiAoWC9YbikgPiAoMjQvMTE2KQorICAgICAgICAgPSBYbiooYSogLyA1MDAgKyBMKiAvIDExNikgLyA3Ljc4NyAgICAgIGlmIChYL1huKSA8PSAoMjQvMTE2KQorCisKKworICAgICAgIFBDUyBpbiBMYWIyIGlzIGVuY29kZWQgYXM6CisKKyAgICAgICAgICAgICAgOCBiaXQgTGFiIFBDUzoKKworICAgICAgICAgICAgICAgICAgICAgTCogICAgICAwLi4xMDAgaW50byBhIDAuLmZmIGJ5dGUuCisgICAgICAgICAgICAgICAgICAgICBhKiAgICAgIHQgKyAxMjggcmFuZ2UgaXMgLTEyOC4wICArMTI3LjAKKyAgICAgICAgICAgICAgICAgICAgIGIqCisKKyAgICAgICAgICAgICAxNiBiaXQgTGFiIFBDUzoKKworICAgICAgICAgICAgICAgICAgICAgTCogICAgIDAuLjEwMCAgaW50byBhIDAuLmZmMDAgd29yZC4KKyAgICAgICAgICAgICAgICAgICAgIGEqICAgICB0ICsgMTI4ICByYW5nZSBpcyAgLTEyOC4wICArMTI3Ljk5NjEKKyAgICAgICAgICAgICAgICAgICAgIGIqCisKKworCitJbnRlcmNoYW5nZSBTcGFjZSAgIENvbXBvbmVudCAgICAgQWN0dWFsIFJhbmdlICAgICAgICBFbmNvZGVkIFJhbmdlCitDSUUgWFlaICAgICAgICAgICAgIFggICAgICAgICAgICAgMCAtPiAxLjk5OTk3ICAgICAgICAweDAwMDAgLT4gMHhmZmZmCitDSUUgWFlaICAgICAgICAgICAgIFkgICAgICAgICAgICAgMCAtPiAxLjk5OTk3ICAgICAgICAweDAwMDAgLT4gMHhmZmZmCitDSUUgWFlaICAgICAgICAgICAgIFogICAgICAgICAgICAgMCAtPiAxLjk5OTk3ICAgICAgICAweDAwMDAgLT4gMHhmZmZmCisKK1ZlcnNpb24gMiwzCistLS0tLS0tLS0tLQorCitDSUVMQUIgKDE2IGJpdCkgICAgIEwqICAgICAgICAgICAgMCAtPiAxMDAuMCAgICAgICAgICAweDAwMDAgLT4gMHhmZjAwCitDSUVMQUIgKDE2IGJpdCkgICAgIGEqICAgICAgICAgICAgLTEyOC4wIC0+ICsxMjcuOTk2ICAweDAwMDAgLT4gMHg4MDAwIC0+IDB4ZmZmZgorQ0lFTEFCICgxNiBiaXQpICAgICBiKiAgICAgICAgICAgIC0xMjguMCAtPiArMTI3Ljk5NiAgMHgwMDAwIC0+IDB4ODAwMCAtPiAweGZmZmYKKworCitWZXJzaW9uIDQKKy0tLS0tLS0tLQorCitDSUVMQUIgKDE2IGJpdCkgICAgIEwqICAgICAgICAgICAgMCAtPiAxMDAuMCAgICAgICAgICAweDAwMDAgLT4gMHhmZmZmCitDSUVMQUIgKDE2IGJpdCkgICAgIGEqICAgICAgICAgICAgLTEyOC4wIC0+ICsxMjcgICAgICAweDAwMDAgLT4gMHg4MDgwIC0+IDB4ZmZmZgorQ0lFTEFCICgxNiBiaXQpICAgICBiKiAgICAgICAgICAgIC0xMjguMCAtPiArMTI3ICAgICAgMHgwMDAwIC0+IDB4ODA4MCAtPiAweGZmZmYKKworKi8KKworLy8gQ29udmVyc2lvbnMKK3ZvaWQgQ01TRVhQT1JUIGNtc1hZWjJ4eVkoY21zQ0lFeHlZKiBEZXN0LCBjb25zdCBjbXNDSUVYWVoqIFNvdXJjZSkKK3sKKyAgICBjbXNGbG9hdDY0TnVtYmVyIElTdW07CisKKyAgICBJU3VtID0gMS4vKFNvdXJjZSAtPiBYICsgU291cmNlIC0+IFkgKyBTb3VyY2UgLT4gWik7CisKKyAgICBEZXN0IC0+IHggPSAoU291cmNlIC0+IFgpICogSVN1bTsKKyAgICBEZXN0IC0+IHkgPSAoU291cmNlIC0+IFkpICogSVN1bTsKKyAgICBEZXN0IC0+IFkgPSBTb3VyY2UgLT4gWTsKK30KKwordm9pZCBDTVNFWFBPUlQgY21zeHlZMlhZWihjbXNDSUVYWVoqIERlc3QsIGNvbnN0IGNtc0NJRXh5WSogU291cmNlKQoreworICAgIERlc3QgLT4gWCA9IChTb3VyY2UgLT4geCAvIFNvdXJjZSAtPiB5KSAqIFNvdXJjZSAtPiBZOworICAgIERlc3QgLT4gWSA9IFNvdXJjZSAtPiBZOworICAgIERlc3QgLT4gWiA9ICgoMSAtIFNvdXJjZSAtPiB4IC0gU291cmNlIC0+IHkpIC8gU291cmNlIC0+IHkpICogU291cmNlIC0+IFk7Cit9CisKKy8qCisgICAgICAgVGhlIGJyZWFrIHBvaW50ICgyNC8xMTYpXjMgPSAoNi8yOSleMyBpcyBhIHZlcnkgc21hbGwgYW1vdW50IG9mIHRyaXN0aW11bHVzIAorICAgICAgIHByaW1hcnkgKDAuMDA4ODU2KS4gIEdlbmVyYWxseSwgdGhpcyBvbmx5IGhhcHBlbnMgZm9yIAorICAgICAgIG5lYXJseSBpZGVhbCBibGFja3MgYW5kIGZvciBzb21lIG9yYW5nZSAvIGFtYmVyIGNvbG9ycyBpbiB0cmFuc21pc3Npb24gbW9kZS4gIAorICAgICAgIEZvciBleGFtcGxlLCB0aGUgWiB2YWx1ZSBvZiB0aGUgb3JhbmdlIHR1cm4gaW5kaWNhdG9yIGxhbXAgbGVucyBvbiBhbiAKKyAgICAgICBhdXRvbW9iaWxlIHdpbGwgb2Z0ZW4gYmUgYmVsb3cgdGhpcyB2YWx1ZS4gIEJ1dCB0aGUgWiBkb2VzIG5vdCAKKyAgICAgICBjb250cmlidXRlIHRvIHRoZSBwZXJjZWl2ZWQgY29sb3IgZGlyZWN0bHkuCisqLworCitzdGF0aWMKK2Ntc0Zsb2F0NjROdW1iZXIgZihjbXNGbG9hdDY0TnVtYmVyIHQpCit7CisgICAgY29uc3QgY21zRmxvYXQ2NE51bWJlciBMaW1pdCA9ICgyNC4wLzExNi4wKSAqICgyNC4wLzExNi4wKSAqICgyNC4wLzExNi4wKTsKKworICAgIGlmICh0IDw9IExpbWl0KQorICAgICAgICByZXR1cm4gKDg0MS4wLzEwOC4wKSAqIHQgKyAoMTYuMC8xMTYuMCk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gcG93KHQsIDEuMC8zLjApOworfQorCitzdGF0aWMKK2Ntc0Zsb2F0NjROdW1iZXIgZl8xKGNtc0Zsb2F0NjROdW1iZXIgdCkKK3sKKyAgICBjb25zdCBjbXNGbG9hdDY0TnVtYmVyIExpbWl0ID0gKDI0LjAvMTE2LjApOworCisgICAgaWYgKHQgPD0gTGltaXQpIHsKKyAgICAgICAgcmV0dXJuICgxMDguMC84NDEuMCkgKiAodCAtICgxNi4wLzExNi4wKSk7CisgICAgfQorCisgICAgcmV0dXJuIHQgKiB0ICogdDsKK30KKworCisvLyBTdGFuZGFyZCBYWVogdG8gTGFiLiBpdCBjYW4gaGFuZGxlIG5lZ2F0aXZlIFhaWSBudW1iZXJzIGluIHNvbWUgY2FzZXMKK3ZvaWQgQ01TRVhQT1JUIGNtc1hZWjJMYWIoY29uc3QgY21zQ0lFWFlaKiBXaGl0ZVBvaW50LCBjbXNDSUVMYWIqIExhYiwgY29uc3QgY21zQ0lFWFlaKiB4eXopCit7CisgICAgY21zRmxvYXQ2NE51bWJlciBmeCwgZnksIGZ6OworCisgICAgaWYgKFdoaXRlUG9pbnQgPT0gTlVMTCkKKyAgICAgICAgV2hpdGVQb2ludCA9IGNtc0Q1MF9YWVooKTsKKworICAgIGZ4ID0gZih4eXotPlggLyBXaGl0ZVBvaW50LT5YKTsKKyAgICBmeSA9IGYoeHl6LT5ZIC8gV2hpdGVQb2ludC0+WSk7CisgICAgZnogPSBmKHh5ei0+WiAvIFdoaXRlUG9pbnQtPlopOworCisgICAgTGFiLT5MID0gMTE2LjAqZnkgLSAxNi4wOworICAgIExhYi0+YSA9IDUwMC4wKihmeCAtIGZ5KTsKKyAgICBMYWItPmIgPSAyMDAuMCooZnkgLSBmeik7Cit9CisKKworLy8gU3RhbmRhcmQgWFlaIHRvIExhYi4gSXQgY2FuIHJldHVybiBuZWdhdGl2ZSBYWVogaW4gc29tZSBjYXNlcwordm9pZCBDTVNFWFBPUlQgY21zTGFiMlhZWihjb25zdCBjbXNDSUVYWVoqIFdoaXRlUG9pbnQsIGNtc0NJRVhZWiogeHl6LCAgY29uc3QgY21zQ0lFTGFiKiBMYWIpCit7CisgICAgY21zRmxvYXQ2NE51bWJlciB4LCB5LCB6OworCisgICAgaWYgKFdoaXRlUG9pbnQgPT0gTlVMTCkKKyAgICAgICAgV2hpdGVQb2ludCA9IGNtc0Q1MF9YWVooKTsKKworICAgIHkgPSAoTGFiLT4gTCArIDE2LjApIC8gMTE2LjA7CisgICAgeCA9IHkgKyAwLjAwMiAqIExhYiAtPiBhOworICAgIHogPSB5IC0gMC4wMDUgKiBMYWIgLT4gYjsKKworICAgIHh5eiAtPiBYID0gZl8xKHgpICogV2hpdGVQb2ludCAtPiBYOworICAgIHh5eiAtPiBZID0gZl8xKHkpICogV2hpdGVQb2ludCAtPiBZOworICAgIHh5eiAtPiBaID0gZl8xKHopICogV2hpdGVQb2ludCAtPiBaOworCit9CisKK3N0YXRpYworY21zRmxvYXQ2NE51bWJlciBMMmZsb2F0MihjbXNVSW50MTZOdW1iZXIgdikKK3sKKyAgICByZXR1cm4gKGNtc0Zsb2F0NjROdW1iZXIpIHYgLyA2NTIuODAwOworfQorCisvLyB0aGUgYS9iIHBhcnQKK3N0YXRpYworY21zRmxvYXQ2NE51bWJlciBhYjJmbG9hdDIoY21zVUludDE2TnVtYmVyIHYpCit7CisgICAgcmV0dXJuICgoY21zRmxvYXQ2NE51bWJlcikgdiAvIDI1Ni4wKSAtIDEyOC4wOworfQorCitzdGF0aWMKK2Ntc1VJbnQxNk51bWJlciBMMkZpeDIoY21zRmxvYXQ2NE51bWJlciBMKQoreworICAgIHJldHVybiBfY21zUXVpY2tTYXR1cmF0ZVdvcmQoTCAqICA2NTIuOCk7Cit9CisKK3N0YXRpYworY21zVUludDE2TnVtYmVyIGFiMkZpeDIoY21zRmxvYXQ2NE51bWJlciBhYikKK3sKKyAgICByZXR1cm4gX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKChhYiArIDEyOC4wKSAqIDI1Ni4wKTsKK30KKworCitzdGF0aWMKK2Ntc0Zsb2F0NjROdW1iZXIgTDJmbG9hdDQoY21zVUludDE2TnVtYmVyIHYpCit7CisgICAgcmV0dXJuIChjbXNGbG9hdDY0TnVtYmVyKSB2IC8gNjU1LjM1OworfQorCisvLyB0aGUgYS9iIHBhcnQKK3N0YXRpYworY21zRmxvYXQ2NE51bWJlciBhYjJmbG9hdDQoY21zVUludDE2TnVtYmVyIHYpCit7CisgICAgcmV0dXJuICgoY21zRmxvYXQ2NE51bWJlcikgdiAvIDI1Ny4wKSAtIDEyOC4wOworfQorCisKK3ZvaWQgQ01TRVhQT1JUIGNtc0xhYkVuY29kZWQyRmxvYXRWMihjbXNDSUVMYWIqIExhYiwgY29uc3QgY21zVUludDE2TnVtYmVyIHdMYWJbM10pCit7CisgICAgICAgIExhYi0+TCA9IEwyZmxvYXQyKHdMYWJbMF0pOworICAgICAgICBMYWItPmEgPSBhYjJmbG9hdDIod0xhYlsxXSk7CisgICAgICAgIExhYi0+YiA9IGFiMmZsb2F0Mih3TGFiWzJdKTsKK30KKworCit2b2lkIENNU0VYUE9SVCBjbXNMYWJFbmNvZGVkMkZsb2F0KGNtc0NJRUxhYiogTGFiLCBjb25zdCBjbXNVSW50MTZOdW1iZXIgd0xhYlszXSkKK3sKKyAgICAgICAgTGFiLT5MID0gTDJmbG9hdDQod0xhYlswXSk7CisgICAgICAgIExhYi0+YSA9IGFiMmZsb2F0NCh3TGFiWzFdKTsKKyAgICAgICAgTGFiLT5iID0gYWIyZmxvYXQ0KHdMYWJbMl0pOworfQorCitzdGF0aWMKK2Ntc0Zsb2F0NjROdW1iZXIgQ2xhbXBfTF9kb3VibGVWMihjbXNGbG9hdDY0TnVtYmVyIEwpCit7CisgICAgY29uc3QgY21zRmxvYXQ2NE51bWJlciBMX21heCA9IChjbXNGbG9hdDY0TnVtYmVyKSAoMHhGRkZGICogMTAwLjApIC8gMHhGRjAwOworCisgICAgaWYgKEwgPCAwKSBMID0gMDsKKyAgICBpZiAoTCA+IExfbWF4KSBMID0gTF9tYXg7CisKKyAgICByZXR1cm4gTDsKK30KKworCitzdGF0aWMKK2Ntc0Zsb2F0NjROdW1iZXIgQ2xhbXBfYWJfZG91YmxlVjIoY21zRmxvYXQ2NE51bWJlciBhYikKK3sKKyAgICBpZiAoYWIgPCBNSU5fRU5DT0RFQUJMRV9hYjIpIGFiID0gTUlOX0VOQ09ERUFCTEVfYWIyOworICAgIGlmIChhYiA+IE1BWF9FTkNPREVBQkxFX2FiMikgYWIgPSBNQVhfRU5DT0RFQUJMRV9hYjI7CisKKyAgICByZXR1cm4gYWI7Cit9CisKK3ZvaWQgQ01TRVhQT1JUIGNtc0Zsb2F0MkxhYkVuY29kZWRWMihjbXNVSW50MTZOdW1iZXIgd0xhYlszXSwgY29uc3QgY21zQ0lFTGFiKiBmTGFiKQoreworICAgIGNtc0NJRUxhYiBMYWI7CisKKyAgICBMYWIuTCA9IENsYW1wX0xfZG91YmxlVjIoZkxhYiAtPkwpOworICAgIExhYi5hID0gQ2xhbXBfYWJfZG91YmxlVjIoZkxhYiAtPmEpOworICAgIExhYi5iID0gQ2xhbXBfYWJfZG91YmxlVjIoZkxhYiAtPmIpOworCisgICAgd0xhYlswXSA9IEwyRml4MihMYWIuTCk7CisgICAgd0xhYlsxXSA9IGFiMkZpeDIoTGFiLmEpOworICAgIHdMYWJbMl0gPSBhYjJGaXgyKExhYi5iKTsKK30KKworCitzdGF0aWMKK2Ntc0Zsb2F0NjROdW1iZXIgQ2xhbXBfTF9kb3VibGVWNChjbXNGbG9hdDY0TnVtYmVyIEwpCit7CisgICAgaWYgKEwgPCAwKSBMID0gMDsKKyAgICBpZiAoTCA+IDEwMC4wKSBMID0gMTAwLjA7CisKKyAgICByZXR1cm4gTDsKK30KKworc3RhdGljCitjbXNGbG9hdDY0TnVtYmVyIENsYW1wX2FiX2RvdWJsZVY0KGNtc0Zsb2F0NjROdW1iZXIgYWIpCit7CisgICAgaWYgKGFiIDwgTUlOX0VOQ09ERUFCTEVfYWI0KSBhYiA9IE1JTl9FTkNPREVBQkxFX2FiNDsKKyAgICBpZiAoYWIgPiBNQVhfRU5DT0RFQUJMRV9hYjQpIGFiID0gTUFYX0VOQ09ERUFCTEVfYWI0OworCisgICAgcmV0dXJuIGFiOworfQorCitzdGF0aWMKK2Ntc1VJbnQxNk51bWJlciBMMkZpeDQoY21zRmxvYXQ2NE51bWJlciBMKQoreworICAgIHJldHVybiBfY21zUXVpY2tTYXR1cmF0ZVdvcmQoTCAqICA2NTUuMzUpOworfQorCitzdGF0aWMKK2Ntc1VJbnQxNk51bWJlciBhYjJGaXg0KGNtc0Zsb2F0NjROdW1iZXIgYWIpCit7CisgICAgcmV0dXJuIF9jbXNRdWlja1NhdHVyYXRlV29yZCgoYWIgKyAxMjguMCkgKiAyNTcuMCk7Cit9CisKK3ZvaWQgQ01TRVhQT1JUIGNtc0Zsb2F0MkxhYkVuY29kZWQoY21zVUludDE2TnVtYmVyIHdMYWJbM10sIGNvbnN0IGNtc0NJRUxhYiogZkxhYikKK3sKKyAgICBjbXNDSUVMYWIgTGFiOworCisgICAgTGFiLkwgPSBDbGFtcF9MX2RvdWJsZVY0KGZMYWIgLT5MKTsKKyAgICBMYWIuYSA9IENsYW1wX2FiX2RvdWJsZVY0KGZMYWIgLT5hKTsKKyAgICBMYWIuYiA9IENsYW1wX2FiX2RvdWJsZVY0KGZMYWIgLT5iKTsKKworICAgIHdMYWJbMF0gPSBMMkZpeDQoTGFiLkwpOworICAgIHdMYWJbMV0gPSBhYjJGaXg0KExhYi5hKTsKKyAgICB3TGFiWzJdID0gYWIyRml4NChMYWIuYik7Cit9CisKKy8vIEF1eGlsaWFyeTogY29udmVydCB0byBSYWRpYW5zCitzdGF0aWMKK2Ntc0Zsb2F0NjROdW1iZXIgUkFESUFOUyhjbXNGbG9hdDY0TnVtYmVyIGRlZykKK3sKKyAgICByZXR1cm4gKGRlZyAqIE1fUEkpIC8gMTgwLjsKK30KKworCisvLyBBdXhpbGlhcnk6IGF0YW4yIGJ1dCBvcGVyYXRpbmcgaW4gZGVncmVlcyBhbmQgcmV0dXJuaW5nIDAgaWYgYT09Yj09MAorc3RhdGljCitjbXNGbG9hdDY0TnVtYmVyIGF0YW4yZGVnKGNtc0Zsb2F0NjROdW1iZXIgYSwgY21zRmxvYXQ2NE51bWJlciBiKQoreworICAgY21zRmxvYXQ2NE51bWJlciBoOworCisgICBpZiAoYSA9PSAwICYmIGIgPT0gMCkKKyAgICAgICAgICAgIGggICA9IDA7CisgICAgZWxzZQorICAgICAgICAgICAgaCA9IGF0YW4yKGEsIGIpOworCisgICAgaCAqPSAoMTgwLiAvIE1fUEkpOworCisgICAgd2hpbGUgKGggPiAzNjAuKQorICAgICAgICBoIC09IDM2MC47CisKKyAgICB3aGlsZSAoIGggPCAwKQorICAgICAgICBoICs9IDM2MC47CisKKyAgICByZXR1cm4gaDsKK30KKworCisvLyBBdXhpbGlhcnk6IFNxdWFyZQorc3RhdGljCitjbXNGbG9hdDY0TnVtYmVyIFNxcihjbXNGbG9hdDY0TnVtYmVyIHYpCit7CisgICAgcmV0dXJuIHYgKiAgdjsKK30KKy8vIEZyb20gY3lsaW5kcmljYWwgY29vcmRpbmF0ZXMuIE5vIGNoZWNrIGlzIHBlcmZvcm1lZCwgdGhlbiBuZWdhdGl2ZSB2YWx1ZXMgYXJlIGFsbG93ZWQKK3ZvaWQgQ01TRVhQT1JUIGNtc0xhYjJMQ2goY21zQ0lFTENoKiBMQ2gsIGNvbnN0IGNtc0NJRUxhYiogTGFiKQoreworICAgIExDaCAtPiBMID0gTGFiIC0+IEw7CisgICAgTENoIC0+IEMgPSBwb3coU3FyKExhYiAtPmEpICsgU3FyKExhYiAtPmIpLCAwLjUpOworICAgIExDaCAtPiBoID0gYXRhbjJkZWcoTGFiIC0+YiwgTGFiIC0+YSk7Cit9CisKKworLy8gVG8gY3lsaW5kcmljYWwgY29vcmRpbmF0ZXMuIE5vIGNoZWNrIGlzIHBlcmZvcm1lZCwgdGhlbiBuZWdhdGl2ZSB2YWx1ZXMgYXJlIGFsbG93ZWQKK3ZvaWQgQ01TRVhQT1JUIGNtc0xDaDJMYWIoY21zQ0lFTGFiKiBMYWIsIGNvbnN0IGNtc0NJRUxDaCogTENoKQoreworICAgIGNtc0Zsb2F0NjROdW1iZXIgaCA9IChMQ2ggLT4gaCAqIE1fUEkpIC8gMTgwLjA7CisKKyAgICBMYWIgLT4gTCA9IExDaCAtPiBMOworICAgIExhYiAtPiBhID0gTENoIC0+IEMgKiBjb3MoaCk7CisgICAgTGFiIC0+IGIgPSBMQ2ggLT4gQyAqIHNpbihoKTsKK30KKworLy8gSW4gWFlaIEFsbCAzIGNvbXBvbmVudHMgYXJlIGVuY29kZWQgdXNpbmcgMS4xNSBmaXhlZCBwb2ludAorc3RhdGljCitjbXNVSW50MTZOdW1iZXIgWFlaMkZpeChjbXNGbG9hdDY0TnVtYmVyIGQpCit7CisgICAgcmV0dXJuIF9jbXNRdWlja1NhdHVyYXRlV29yZChkICogMzI3NjguMCk7Cit9CisKK3ZvaWQgQ01TRVhQT1JUIGNtc0Zsb2F0MlhZWkVuY29kZWQoY21zVUludDE2TnVtYmVyIFhZWlszXSwgY29uc3QgY21zQ0lFWFlaKiBmWFlaKQoreworICAgIGNtc0NJRVhZWiB4eXo7CisKKyAgICB4eXouWCA9IGZYWVogLT4gWDsKKyAgICB4eXouWSA9IGZYWVogLT4gWTsKKyAgICB4eXouWiA9IGZYWVogLT4gWjsKKworICAgIC8vIENsYW1wIHRvIGVuY29kZWFibGUgdmFsdWVzLgorICAgIGlmICh4eXouWSA8PSAwKSB7CisKKyAgICAgICAgeHl6LlggPSAwOworICAgICAgICB4eXouWSA9IDA7CisgICAgICAgIHh5ei5aID0gMDsKKyAgICB9CisKKyAgICBpZiAoeHl6LlggPiBNQVhfRU5DT0RFQUJMRV9YWVopCisgICAgICAgIHh5ei5YID0gTUFYX0VOQ09ERUFCTEVfWFlaOworCisgICAgaWYgKHh5ei5YIDwgMCkKKyAgICAgICAgeHl6LlggPSAwOworCisgICAgaWYgKHh5ei5ZID4gTUFYX0VOQ09ERUFCTEVfWFlaKQorICAgICAgICB4eXouWSA9IE1BWF9FTkNPREVBQkxFX1hZWjsKKworICAgIGlmICh4eXouWSA8IDApCisgICAgICAgIHh5ei5ZID0gMDsKKworICAgIGlmICh4eXouWiA+IE1BWF9FTkNPREVBQkxFX1hZWikKKyAgICAgICAgeHl6LlogPSBNQVhfRU5DT0RFQUJMRV9YWVo7CisKKyAgICBpZiAoeHl6LlogPCAwKQorICAgICAgICB4eXouWiA9IDA7CisKKworICAgIFhZWlswXSA9IFhZWjJGaXgoeHl6LlgpOworICAgIFhZWlsxXSA9IFhZWjJGaXgoeHl6LlkpOworICAgIFhZWlsyXSA9IFhZWjJGaXgoeHl6LlopOworfQorCisKKy8vICBUbyBjb252ZXJ0IGZyb20gRml4ZWQgMS4xNSBwb2ludCB0byBjbXNGbG9hdDY0TnVtYmVyCitzdGF0aWMKK2Ntc0Zsb2F0NjROdW1iZXIgWFlaMmZsb2F0KGNtc1VJbnQxNk51bWJlciB2KQoreworICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgZml4MzI7CisKKyAgICAvLyBGcm9tIDEuMTUgdG8gMTUuMTYKKyAgICBmaXgzMiA9IHYgPDwgMTsKKworICAgIC8vIEZyb20gZml4ZWQgMTUuMTYgdG8gY21zRmxvYXQ2NE51bWJlcgorICAgIHJldHVybiBfY21zMTVGaXhlZDE2dG9Eb3VibGUoZml4MzIpOworfQorCisKK3ZvaWQgQ01TRVhQT1JUIGNtc1hZWkVuY29kZWQyRmxvYXQoY21zQ0lFWFlaKiBmWFlaLCBjb25zdCBjbXNVSW50MTZOdW1iZXIgWFlaWzNdKQoreworICAgIGZYWVogLT4gWCA9IFhZWjJmbG9hdChYWVpbMF0pOworICAgIGZYWVogLT4gWSA9IFhZWjJmbG9hdChYWVpbMV0pOworICAgIGZYWVogLT4gWiA9IFhZWjJmbG9hdChYWVpbMl0pOworfQorCisKKy8vIFJldHVybnMgZEUgb24gdHdvIExhYiB2YWx1ZXMKK2Ntc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIGNtc0RlbHRhRShjb25zdCBjbXNDSUVMYWIqIExhYjEsIGNvbnN0IGNtc0NJRUxhYiogTGFiMikKK3sKKyAgICBjbXNGbG9hdDY0TnVtYmVyIGRMLCBkYSwgZGI7CisKKyAgICBkTCA9IGZhYnMoTGFiMSAtPiBMIC0gTGFiMiAtPiBMKTsKKyAgICBkYSA9IGZhYnMoTGFiMSAtPiBhIC0gTGFiMiAtPiBhKTsKKyAgICBkYiA9IGZhYnMoTGFiMSAtPiBiIC0gTGFiMiAtPiBiKTsKKworICAgIHJldHVybiBwb3coU3FyKGRMKSArIFNxcihkYSkgKyBTcXIoZGIpLCAwLjUpOworfQorCisKKy8vIFJldHVybiB0aGUgQ0lFOTQgRGVsdGEgRQorY21zRmxvYXQ2NE51bWJlciBDTVNFWFBPUlQgY21zQ0lFOTREZWx0YUUoY29uc3QgY21zQ0lFTGFiKiBMYWIxLCBjb25zdCBjbXNDSUVMYWIqIExhYjIpCit7CisgICAgY21zQ0lFTENoIExDaDEsIExDaDI7CisgICAgY21zRmxvYXQ2NE51bWJlciBkRSwgZEwsIGRDLCBkaCwgZGhzcTsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIGMxMiwgc2MsIHNoOworCisgICAgZEwgPSBmYWJzKExhYjEgLT5MIC0gTGFiMiAtPkwpOworCisgICAgY21zTGFiMkxDaCgmTENoMSwgTGFiMSk7CisgICAgY21zTGFiMkxDaCgmTENoMiwgTGFiMik7CisKKyAgICBkQyAgPSBmYWJzKExDaDEuQyAtIExDaDIuQyk7CisgICAgZEUgID0gY21zRGVsdGFFKExhYjEsIExhYjIpOworCisgICAgZGhzcSA9IFNxcihkRSkgLSBTcXIoZEwpIC0gU3FyKGRDKTsKKyAgICBpZiAoZGhzcSA8IDApCisgICAgICAgIGRoID0gMDsKKyAgICBlbHNlCisgICAgICAgIGRoID0gcG93KGRoc3EsIDAuNSk7CisKKyAgICBjMTIgPSBzcXJ0KExDaDEuQyAqIExDaDIuQyk7CisKKyAgICBzYyA9IDEuMCArICgwLjA0OCAqIGMxMik7CisgICAgc2ggPSAxLjAgKyAoMC4wMTQgKiBjMTIpOworCisgICAgcmV0dXJuIHNxcnQoU3FyKGRMKSAgKyBTcXIoZEMpIC8gU3FyKHNjKSArIFNxcihkaCkgLyBTcXIoc2gpKTsKK30KKworCisvLyBBdXhpbGlhcnkKK3N0YXRpYworY21zRmxvYXQ2NE51bWJlciBDb21wdXRlTEJGRChjb25zdCBjbXNDSUVMYWIqIExhYikKK3sKKyAgY21zRmxvYXQ2NE51bWJlciB5dDsKKworICBpZiAoTGFiLT5MID4gNy45OTY5NjkpCisgICAgICAgIHl0ID0gKFNxcigoTGFiLT5MKzE2KS8xMTYpKigoTGFiLT5MKzE2KS8xMTYpKSoxMDA7CisgIGVsc2UKKyAgICAgICAgeXQgPSAxMDAgKiAoTGFiLT5MIC8gOTAzLjMpOworCisgIHJldHVybiAoNTQuNiAqIChNX0xPRzEwRSAqIChsb2coeXQgKyAxLjUpKSkgLSA5LjYpOworfQorCisKKworLy8gYmZkIC0gZ2V0cyBCRkQoMToxKSBkaWZmZXJlbmNlIGJldHdlZW4gTGFiMSwgTGFiMgorY21zRmxvYXQ2NE51bWJlciBDTVNFWFBPUlQgY21zQkZEZGVsdGFFKGNvbnN0IGNtc0NJRUxhYiogTGFiMSwgY29uc3QgY21zQ0lFTGFiKiBMYWIyKQoreworICAgIGNtc0Zsb2F0NjROdW1iZXIgbGJmZDEsbGJmZDIsQXZlQyxBdmVoLGRFLGRlbHRhTCwKKyAgICAgICAgZGVsdGFDLGRlbHRhaCxkYyx0LGcsZGgscmgscmMscnQsYmZkOworICAgIGNtc0NJRUxDaCBMQ2gxLCBMQ2gyOworCisKKyAgICBsYmZkMSA9IENvbXB1dGVMQkZEKExhYjEpOworICAgIGxiZmQyID0gQ29tcHV0ZUxCRkQoTGFiMik7CisgICAgZGVsdGFMID0gbGJmZDIgLSBsYmZkMTsKKworICAgIGNtc0xhYjJMQ2goJkxDaDEsIExhYjEpOworICAgIGNtc0xhYjJMQ2goJkxDaDIsIExhYjIpOworCisgICAgZGVsdGFDID0gTENoMi5DIC0gTENoMS5DOworICAgIEF2ZUMgPSAoTENoMS5DK0xDaDIuQykvMjsKKyAgICBBdmVoID0gKExDaDEuaCtMQ2gyLmgpLzI7CisKKyAgICBkRSA9IGNtc0RlbHRhRShMYWIxLCBMYWIyKTsKKworICAgIGlmIChTcXIoZEUpPihTcXIoTGFiMi0+TC1MYWIxLT5MKStTcXIoZGVsdGFDKSkpCisgICAgICAgIGRlbHRhaCA9IHNxcnQoU3FyKGRFKS1TcXIoTGFiMi0+TC1MYWIxLT5MKS1TcXIoZGVsdGFDKSk7CisgICAgZWxzZQorICAgICAgICBkZWx0YWggPTA7CisKKworICAgIGRjICAgPSAwLjAzNSAqIEF2ZUMgLyAoMSArIDAuMDAzNjUgKiBBdmVDKSswLjUyMTsKKyAgICBnICAgID0gc3FydChTcXIoU3FyKEF2ZUMpKS8oU3FyKFNxcihBdmVDKSkrMTQwMDApKTsKKyAgICB0ICAgID0gMC42MjcrKDAuMDU1KmNvcygoQXZlaC0yNTQpLygxODAvTV9QSSkpLQorICAgICAgICAgICAwLjA0MCpjb3MoKDIqQXZlaC0xMzYpLygxODAvTV9QSSkpKworICAgICAgICAgICAwLjA3MCpjb3MoKDMqQXZlaC0zMSkvKDE4MC9NX1BJKSkrCisgICAgICAgICAgIDAuMDQ5KmNvcygoNCpBdmVoKzExNCkvKDE4MC9NX1BJKSktCisgICAgICAgICAgIDAuMDE1KmNvcygoNSpBdmVoLTEwMykvKDE4MC9NX1BJKSkpOworCisgICAgZGggICAgPSBkYyooZyp0KzEtZyk7CisgICAgcmggICAgPSAtMC4yNjAqY29zKChBdmVoLTMwOCkvKDE4MC9NX1BJKSktCisgICAgICAgICAgIDAuMzc5KmNvcygoMipBdmVoLTE2MCkvKDE4MC9NX1BJKSktCisgICAgICAgICAgIDAuNjM2KmNvcygoMypBdmVoKzI1NCkvKDE4MC9NX1BJKSkrCisgICAgICAgICAgIDAuMjI2KmNvcygoNCpBdmVoKzE0MCkvKDE4MC9NX1BJKSktCisgICAgICAgICAgIDAuMTk0KmNvcygoNSpBdmVoKzI4MCkvKDE4MC9NX1BJKSk7CisKKyAgICByYyA9IHNxcnQoKEF2ZUMqQXZlQypBdmVDKkF2ZUMqQXZlQypBdmVDKS8oKEF2ZUMqQXZlQypBdmVDKkF2ZUMqQXZlQypBdmVDKSs3MDAwMDAwMCkpOworICAgIHJ0ID0gcmgqcmM7CisKKyAgICBiZmQgPSBzcXJ0KFNxcihkZWx0YUwpK1NxcihkZWx0YUMvZGMpK1NxcihkZWx0YWgvZGgpKyhydCooZGVsdGFDL2RjKSooZGVsdGFoL2RoKSkpOworCisgICAgcmV0dXJuIGJmZDsKK30KKworCisvLyAgY21jIC0gQ01DKGw6YykgZGlmZmVyZW5jZSBiZXR3ZWVuIExhYjEsIExhYjIKK2Ntc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIGNtc0NNQ2RlbHRhRShjb25zdCBjbXNDSUVMYWIqIExhYjEsIGNvbnN0IGNtc0NJRUxhYiogTGFiMiwgY21zRmxvYXQ2NE51bWJlciBsLCBjbXNGbG9hdDY0TnVtYmVyIGMpCit7CisgIGNtc0Zsb2F0NjROdW1iZXIgZEUsZEwsZEMsZGgsc2wsc2Msc2gsdCxmLGNtYzsKKyAgY21zQ0lFTENoIExDaDEsIExDaDI7CisKKyAgaWYgKExhYjEgLT5MID09IDAgJiYgTGFiMiAtPkwgPT0gMCkgcmV0dXJuIDA7CisKKyAgY21zTGFiMkxDaCgmTENoMSwgTGFiMSk7CisgIGNtc0xhYjJMQ2goJkxDaDIsIExhYjIpOworCisKKyAgZEwgPSBMYWIyLT5MLUxhYjEtPkw7CisgIGRDID0gTENoMi5DLUxDaDEuQzsKKworICBkRSA9IGNtc0RlbHRhRShMYWIxLCBMYWIyKTsKKworICBpZiAoU3FyKGRFKT4oU3FyKGRMKStTcXIoZEMpKSkKKyAgICAgICAgICAgIGRoID0gc3FydChTcXIoZEUpLVNxcihkTCktU3FyKGRDKSk7CisgIGVsc2UKKyAgICAgICAgICAgIGRoID0wOworCisgIGlmICgoTENoMS5oID4gMTY0KSAmJiAoTENoMS5oIDwgMzQ1KSkKKyAgICAgIHQgPSAwLjU2ICsgZmFicygwLjIgKiBjb3MoKChMQ2gxLmggKyAxNjgpLygxODAvTV9QSSkpKSk7CisgIGVsc2UKKyAgICAgIHQgPSAwLjM2ICsgZmFicygwLjQgKiBjb3MoKChMQ2gxLmggKyAzNSApLygxODAvTV9QSSkpKSk7CisKKyAgIHNjICA9IDAuMDYzOCAgICogTENoMS5DIC8gKDEgKyAwLjAxMzEgICogTENoMS5DKSArIDAuNjM4OworICAgc2wgID0gMC4wNDA5NzUgKiBMYWIxLT5MIC8oMSArIDAuMDE3NjUgKiBMYWIxLT5MKTsKKworICAgaWYgKExhYjEtPkw8MTYpCisgICAgICAgICBzbCA9IDAuNTExOworCisgICBmICAgPSBzcXJ0KChMQ2gxLkMgKiBMQ2gxLkMgKiBMQ2gxLkMgKiBMQ2gxLkMpLygoTENoMS5DICogTENoMS5DICogTENoMS5DICogTENoMS5DKSsxOTAwKSk7CisgICBzaCAgPSBzYyoodCpmKzEtZik7CisgICBjbWMgPSBzcXJ0KFNxcihkTC8obCpzbCkpK1NxcihkQy8oYypzYykpK1NxcihkaC9zaCkpOworCisgICByZXR1cm4gY21jOworfQorCisvLyBkRTIwMDAgVGhlIHdlaWdodGluZ3MgS0wsIEtDIGFuZCBLSCBjYW4gYmUgbW9kaWZpZWQgdG8gcmVmbGVjdCB0aGUgcmVsYXRpdmUKKy8vIGltcG9ydGFuY2Ugb2YgbGlnaHRuZXNzLCBjaHJvbWEgYW5kIGh1ZSBpbiBkaWZmZXJlbnQgaW5kdXN0cmlhbCBhcHBsaWNhdGlvbnMKK2Ntc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIGNtc0NJRTIwMDBEZWx0YUUoY29uc3QgY21zQ0lFTGFiKiBMYWIxLCBjb25zdCBjbXNDSUVMYWIqIExhYjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBLbCwgY21zRmxvYXQ2NE51bWJlciBLYywgY21zRmxvYXQ2NE51bWJlciBLaCkKK3sKKyAgICBjbXNGbG9hdDY0TnVtYmVyIEwxICA9IExhYjEtPkw7CisgICAgY21zRmxvYXQ2NE51bWJlciBhMSAgPSBMYWIxLT5hOworICAgIGNtc0Zsb2F0NjROdW1iZXIgYjEgID0gTGFiMS0+YjsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIEMgICA9IHNxcnQoIFNxcihhMSkgKyBTcXIoYjEpICk7CisKKyAgICBjbXNGbG9hdDY0TnVtYmVyIExzID0gTGFiMiAtPkw7CisgICAgY21zRmxvYXQ2NE51bWJlciBhcyA9IExhYjIgLT5hOworICAgIGNtc0Zsb2F0NjROdW1iZXIgYnMgPSBMYWIyIC0+YjsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIENzID0gc3FydCggU3FyKGFzKSArIFNxcihicykgKTsKKworICAgIGNtc0Zsb2F0NjROdW1iZXIgRyA9IDAuNSAqICggMSAtIHNxcnQocG93KChDICsgQ3MpIC8gMiAsIDcuMCkgLyAocG93KChDICsgQ3MpIC8gMiwgNy4wKSArIHBvdygyNS4wLCA3LjApICkgKSk7CisKKyAgICBjbXNGbG9hdDY0TnVtYmVyIGFfcCA9ICgxICsgRyApICogYTE7CisgICAgY21zRmxvYXQ2NE51bWJlciBiX3AgPSBiMTsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIENfcCA9IHNxcnQoIFNxcihhX3ApICsgU3FyKGJfcCkpOworICAgIGNtc0Zsb2F0NjROdW1iZXIgaF9wID0gYXRhbjJkZWcoYl9wLCBhX3ApOworCisKKyAgICBjbXNGbG9hdDY0TnVtYmVyIGFfcHMgPSAoMSArIEcpICogYXM7CisgICAgY21zRmxvYXQ2NE51bWJlciBiX3BzID0gYnM7CisgICAgY21zRmxvYXQ2NE51bWJlciBDX3BzID0gc3FydChTcXIoYV9wcykgKyBTcXIoYl9wcykpOworICAgIGNtc0Zsb2F0NjROdW1iZXIgaF9wcyA9IGF0YW4yZGVnKGJfcHMsIGFfcHMpOworCisgICAgY21zRmxvYXQ2NE51bWJlciBtZWFuQ19wID0oQ19wICsgQ19wcykgLyAyOworCisgICAgY21zRmxvYXQ2NE51bWJlciBocHNfcGx1c19ocCAgPSBoX3BzICsgaF9wOworICAgIGNtc0Zsb2F0NjROdW1iZXIgaHBzX21pbnVzX2hwID0gaF9wcyAtIGhfcDsKKworICAgIGNtc0Zsb2F0NjROdW1iZXIgbWVhbmhfcCA9IGZhYnMoaHBzX21pbnVzX2hwKSA8PSAxODAuMDAwMDAxID8gKGhwc19wbHVzX2hwKS8yIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaHBzX3BsdXNfaHApIDwgMzYwID8gKGhwc19wbHVzX2hwICsgMzYwKS8yIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaHBzX3BsdXNfaHAgLSAzNjApLzI7CisKKyAgICBjbXNGbG9hdDY0TnVtYmVyIGRlbHRhX2ggPSAoaHBzX21pbnVzX2hwKSA8PSAtMTgwLjAwMDAwMSA/ICAoaHBzX21pbnVzX2hwICsgMzYwKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhwc19taW51c19ocCkgPiAxODAgPyAoaHBzX21pbnVzX2hwIC0gMzYwKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhwc19taW51c19ocCk7CisgICAgY21zRmxvYXQ2NE51bWJlciBkZWx0YV9MID0gKExzIC0gTDEpOworICAgIGNtc0Zsb2F0NjROdW1iZXIgZGVsdGFfQyA9IChDX3BzIC0gQ19wICk7CisKKworICAgIGNtc0Zsb2F0NjROdW1iZXIgZGVsdGFfSCA9MiAqIHNxcnQoQ19wcypDX3ApICogc2luKFJBRElBTlMoZGVsdGFfaCkgLyAyKTsKKworICAgIGNtc0Zsb2F0NjROdW1iZXIgVCA9IDEgLSAwLjE3ICogY29zKFJBRElBTlMobWVhbmhfcC0zMCkpCisgICAgICAgICAgICAgICAgICsgMC4yNCAqIGNvcyhSQURJQU5TKDIqbWVhbmhfcCkpCisgICAgICAgICAgICAgICAgICsgMC4zMiAqIGNvcyhSQURJQU5TKDMqbWVhbmhfcCArIDYpKQorICAgICAgICAgICAgICAgICAtIDAuMiAgKiBjb3MoUkFESUFOUyg0Km1lYW5oX3AgLSA2MykpOworCisgICAgY21zRmxvYXQ2NE51bWJlciBTbCA9IDEgKyAoMC4wMTUgKiBTcXIoKExzICsgTDEpIC8yLSA1MCkgKS8gc3FydCgyMCArIFNxciggKExzK0wxKS8yIC0gNTApICk7CisKKyAgICBjbXNGbG9hdDY0TnVtYmVyIFNjID0gMSArIDAuMDQ1ICogKENfcCArIENfcHMpLzI7CisgICAgY21zRmxvYXQ2NE51bWJlciBTaCA9IDEgKyAwLjAxNSAqICgoQ19wcyArIENfcCkvMikgKiBUOworCisgICAgY21zRmxvYXQ2NE51bWJlciBkZWx0YV9ybyA9IDMwICogZXhwKCAtU3FyKCgobWVhbmhfcCAtIDI3NSApIC8gMjUpKSk7CisKKyAgICBjbXNGbG9hdDY0TnVtYmVyIFJjID0gMiAqIHNxcnQoKCBwb3cobWVhbkNfcCwgNy4wKSApLyggcG93KG1lYW5DX3AsIDcuMCkgKyBwb3coMjUuMCwgNy4wKSkpOworCisgICAgY21zRmxvYXQ2NE51bWJlciBSdCA9IC1zaW4oMiAqIFJBRElBTlMoZGVsdGFfcm8pKSAqIFJjOworCisgICAgY21zRmxvYXQ2NE51bWJlciBkZWx0YUUwMCA9IHNxcnQoIFNxcihkZWx0YV9MIC8oU2wgKiBLbCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcXIoZGVsdGFfQy8oU2MgKiBLYykpICArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3FyKGRlbHRhX0gvKFNoICogS2gpKSAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ0KihkZWx0YV9DLyhTYyAqIEtjKSkgKiAoZGVsdGFfSCAvIChTaCAqIEtoKSkpOworCisgICAgcmV0dXJuIGRlbHRhRTAwOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBudW1iZXIgb2YgZ3JpZHBvaW50cyB0byBiZSB1c2VkIGFzIExVVCB0YWJsZS4gSXQgYXNzdW1lcyBzYW1lIG51bWJlcgorLy8gb2YgZ3JpcGRwb2ludHMgaW4gYWxsIGRpbWVuc2lvbnMuIEZsYWdzIG1heSBvdmVycmlkZSB0aGUgY2hvaWNlLgoraW50IF9jbXNSZWFzb25hYmxlR3JpZHBvaW50c0J5Q29sb3JzcGFjZShjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yc3BhY2UsIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKQoreworICAgIGludCBuQ2hhbm5lbHM7CisKKyAgICAvLyBBbHJlYWR5IHNwZWNpZmllZD8KKyAgICBpZiAoZHdGbGFncyAmIDB4MDBGRjAwMDApIHsKKyAgICAgICAgICAgIC8vIFllcywgZ3JhYidlbQorICAgICAgICAgICAgcmV0dXJuIChkd0ZsYWdzID4+IDE2KSAmIDB4RkY7CisgICAgfQorCisgICAgbkNoYW5uZWxzID0gY21zQ2hhbm5lbHNPZihDb2xvcnNwYWNlKTsKKworICAgIC8vIEhpZ2hSZXNQcmVjYWxjIGlzIG1heGltdW0gcmVzb2x1dGlvbgorICAgIGlmIChkd0ZsYWdzICYgY21zRkxBR1NfSElHSFJFU1BSRUNBTEMpIHsKKworICAgICAgICBpZiAobkNoYW5uZWxzID4gNCkKKyAgICAgICAgICAgICAgICByZXR1cm4gNzsgICAgICAgLy8gNyBmb3IgSGlmaQorCisgICAgICAgIGlmIChuQ2hhbm5lbHMgPT0gNCkgICAgIC8vIDIzIGZvciBDTVlLCisgICAgICAgICAgICAgICAgcmV0dXJuIDIzOworCisgICAgICAgIHJldHVybiA0OTsgICAgICAvLyA0OSBmb3IgUkdCIGFuZCBvdGhlcnMKKyAgICB9CisKKworICAgIC8vIExvd1Jlc1ByZWNhbCBpcyBsb3dlciByZXNvbHV0aW9uCisgICAgaWYgKGR3RmxhZ3MgJiBjbXNGTEFHU19MT1dSRVNQUkVDQUxDKSB7CisKKyAgICAgICAgaWYgKG5DaGFubmVscyA+IDQpCisgICAgICAgICAgICAgICAgcmV0dXJuIDY7ICAgICAgIC8vIDYgZm9yIG1vcmUgdGhhbiA0IGNoYW5uZWxzCisKKyAgICAgICAgaWYgKG5DaGFubmVscyA9PSAxKQorICAgICAgICAgICAgICAgIHJldHVybiAzMzsgICAgICAvLyBGb3IgbW9ub2Nocm9tZQorCisgICAgICAgIHJldHVybiAxNzsgICAgICAgICAgICAgIC8vIDE3IGZvciByZW1haW5pbmcKKyAgICB9CisKKyAgICAvLyBEZWZhdWx0IHZhbHVlcworICAgIGlmIChuQ2hhbm5lbHMgPiA0KQorICAgICAgICAgICAgICAgIHJldHVybiA3OyAgICAgICAvLyA3IGZvciBIaWZpCisKKyAgICBpZiAobkNoYW5uZWxzID09IDQpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE3OyAgICAgIC8vIDE3IGZvciBDTVlLCisKKyAgICByZXR1cm4gMzM7ICAgICAgICAgICAgICAgICAgLy8gMzMgZm9yIFJHQgorfQorCisKK2Ntc0Jvb2wgIF9jbXNFbmRQb2ludHNCeVNwYWNlKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQxNk51bWJlciAqKldoaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIgKipCbGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICpuT3V0cHV0cykKK3sKKyAgICAgICAvLyBPbmx5IG1vc3QgY29tbW9uIHNwYWNlcworCisgICAgICAgc3RhdGljIGNtc1VJbnQxNk51bWJlciBSR0JibGFja1s0XSAgPSB7IDAsIDAsIDAgfTsKKyAgICAgICBzdGF0aWMgY21zVUludDE2TnVtYmVyIFJHQndoaXRlWzRdICA9IHsgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiB9OworICAgICAgIHN0YXRpYyBjbXNVSW50MTZOdW1iZXIgQ01ZS2JsYWNrWzRdID0geyAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYgfTsgICAvLyA0MDAlIG9mIGluaworICAgICAgIHN0YXRpYyBjbXNVSW50MTZOdW1iZXIgQ01ZS3doaXRlWzRdID0geyAwLCAwLCAwLCAwIH07CisgICAgICAgc3RhdGljIGNtc1VJbnQxNk51bWJlciBMQUJibGFja1s0XSAgPSB7IDAsIDB4ODA4MCwgMHg4MDgwIH07ICAgICAgICAgICAgICAgLy8gVjQgTGFiIGVuY29kaW5nCisgICAgICAgc3RhdGljIGNtc1VJbnQxNk51bWJlciBMQUJ3aGl0ZVs0XSAgPSB7IDB4RkZGRiwgMHg4MDgwLCAweDgwODAgfTsKKyAgICAgICBzdGF0aWMgY21zVUludDE2TnVtYmVyIENNWWJsYWNrWzRdICA9IHsgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiB9OworICAgICAgIHN0YXRpYyBjbXNVSW50MTZOdW1iZXIgQ01Zd2hpdGVbNF0gID0geyAwLCAwLCAwIH07CisgICAgICAgc3RhdGljIGNtc1VJbnQxNk51bWJlciBHcmF5YmxhY2tbNF0gPSB7IDAgfTsKKyAgICAgICBzdGF0aWMgY21zVUludDE2TnVtYmVyIEdyYXlXaGl0ZVs0XSA9IHsgMHhmZmZmIH07CisKKyAgICAgICBzd2l0Y2ggKFNwYWNlKSB7CisKKyAgICAgICBjYXNlIGNtc1NpZ0dyYXlEYXRhOiBpZiAoV2hpdGUpICAgICpXaGl0ZSA9IEdyYXlXaGl0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCbGFjaykgICAgKkJsYWNrID0gR3JheWJsYWNrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5PdXRwdXRzKSAqbk91dHB1dHMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICAgICBjYXNlIGNtc1NpZ1JnYkRhdGE6ICBpZiAoV2hpdGUpICAgICpXaGl0ZSA9IFJHQndoaXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJsYWNrKSAgICAqQmxhY2sgPSBSR0JibGFjazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuT3V0cHV0cykgKm5PdXRwdXRzID0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICAgY2FzZSBjbXNTaWdMYWJEYXRhOiAgaWYgKFdoaXRlKSAgICAqV2hpdGUgPSBMQUJ3aGl0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCbGFjaykgICAgKkJsYWNrID0gTEFCYmxhY2s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobk91dHB1dHMpICpuT3V0cHV0cyA9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgIGNhc2UgY21zU2lnQ215a0RhdGE6IGlmIChXaGl0ZSkgICAgKldoaXRlID0gQ01ZS3doaXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJsYWNrKSAgICAqQmxhY2sgPSBDTVlLYmxhY2s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobk91dHB1dHMpICpuT3V0cHV0cyA9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgIGNhc2UgY21zU2lnQ215RGF0YTogIGlmIChXaGl0ZSkgICAgKldoaXRlID0gQ01Zd2hpdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQmxhY2spICAgICpCbGFjayA9IENNWWJsYWNrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5PdXRwdXRzKSAqbk91dHB1dHMgPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICAgICBkZWZhdWx0OjsKKyAgICAgICB9CisKKyAgcmV0dXJuIEZBTFNFOworfQorCisKKworLy8gU2V2ZXJhbCB1dGlsaXRpZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUcmFuc2xhdGUgZnJvbSBvdXIgY29sb3JzcGFjZSB0byBJQ0MgcmVwcmVzZW50YXRpb24KKworY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBDTVNFWFBPUlQgX2Ntc0lDQ2NvbG9yU3BhY2UoaW50IE91ck5vdGF0aW9uKQoreworICAgICAgIHN3aXRjaCAoT3VyTm90YXRpb24pIHsKKworICAgICAgIGNhc2UgMToKKyAgICAgICBjYXNlIFBUX0dSQVk6IHJldHVybiBjbXNTaWdHcmF5RGF0YTsKKworICAgICAgIGNhc2UgMjoKKyAgICAgICBjYXNlIFBUX1JHQjogIHJldHVybiBjbXNTaWdSZ2JEYXRhOworCisgICAgICAgY2FzZSBQVF9DTVk6ICByZXR1cm4gY21zU2lnQ215RGF0YTsKKyAgICAgICBjYXNlIFBUX0NNWUs6IHJldHVybiBjbXNTaWdDbXlrRGF0YTsKKyAgICAgICBjYXNlIFBUX1lDYkNyOnJldHVybiBjbXNTaWdZQ2JDckRhdGE7CisgICAgICAgY2FzZSBQVF9ZVVY6ICByZXR1cm4gY21zU2lnTHV2RGF0YTsKKyAgICAgICBjYXNlIFBUX1hZWjogIHJldHVybiBjbXNTaWdYWVpEYXRhOworCisgICAgICAgY2FzZSBQVF9MYWJWMjoKKyAgICAgICBjYXNlIFBUX0xhYjogIHJldHVybiBjbXNTaWdMYWJEYXRhOworCisgICAgICAgY2FzZSBQVF9ZVVZLOiByZXR1cm4gY21zU2lnTHV2S0RhdGE7CisgICAgICAgY2FzZSBQVF9IU1Y6ICByZXR1cm4gY21zU2lnSHN2RGF0YTsKKyAgICAgICBjYXNlIFBUX0hMUzogIHJldHVybiBjbXNTaWdIbHNEYXRhOworICAgICAgIGNhc2UgUFRfWXh5OiAgcmV0dXJuIGNtc1NpZ1l4eURhdGE7CisKKyAgICAgICBjYXNlIFBUX01DSDE6IHJldHVybiBjbXNTaWdNQ0gxRGF0YTsKKyAgICAgICBjYXNlIFBUX01DSDI6IHJldHVybiBjbXNTaWdNQ0gyRGF0YTsKKyAgICAgICBjYXNlIFBUX01DSDM6IHJldHVybiBjbXNTaWdNQ0gzRGF0YTsKKyAgICAgICBjYXNlIFBUX01DSDQ6IHJldHVybiBjbXNTaWdNQ0g0RGF0YTsKKyAgICAgICBjYXNlIFBUX01DSDU6IHJldHVybiBjbXNTaWdNQ0g1RGF0YTsKKyAgICAgICBjYXNlIFBUX01DSDY6IHJldHVybiBjbXNTaWdNQ0g2RGF0YTsKKyAgICAgICBjYXNlIFBUX01DSDc6IHJldHVybiBjbXNTaWdNQ0g3RGF0YTsKKyAgICAgICBjYXNlIFBUX01DSDg6IHJldHVybiBjbXNTaWdNQ0g4RGF0YTsKKworICAgICAgIGNhc2UgUFRfTUNIOTogIHJldHVybiBjbXNTaWdNQ0g5RGF0YTsKKyAgICAgICBjYXNlIFBUX01DSDEwOiByZXR1cm4gY21zU2lnTUNIQURhdGE7CisgICAgICAgY2FzZSBQVF9NQ0gxMTogcmV0dXJuIGNtc1NpZ01DSEJEYXRhOworICAgICAgIGNhc2UgUFRfTUNIMTI6IHJldHVybiBjbXNTaWdNQ0hDRGF0YTsKKyAgICAgICBjYXNlIFBUX01DSDEzOiByZXR1cm4gY21zU2lnTUNIRERhdGE7CisgICAgICAgY2FzZSBQVF9NQ0gxNDogcmV0dXJuIGNtc1NpZ01DSEVEYXRhOworICAgICAgIGNhc2UgUFRfTUNIMTU6IHJldHVybiBjbXNTaWdNQ0hGRGF0YTsKKworICAgICAgIGRlZmF1bHQ6ICByZXR1cm4gKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUpICgtMSk7CisgICAgICAgfQorfQorCisKK2ludCBDTVNFWFBPUlQgX2Ntc0xDTVNjb2xvclNwYWNlKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgUHJvZmlsZVNwYWNlKQoreworICAgIHN3aXRjaCAoUHJvZmlsZVNwYWNlKSB7CisKKyAgICBjYXNlIGNtc1NpZ0dyYXlEYXRhOiByZXR1cm4gIFBUX0dSQVk7CisgICAgY2FzZSBjbXNTaWdSZ2JEYXRhOiAgcmV0dXJuICBQVF9SR0I7CisgICAgY2FzZSBjbXNTaWdDbXlEYXRhOiAgcmV0dXJuICBQVF9DTVk7CisgICAgY2FzZSBjbXNTaWdDbXlrRGF0YTogcmV0dXJuICBQVF9DTVlLOworICAgIGNhc2UgY21zU2lnWUNiQ3JEYXRhOnJldHVybiAgUFRfWUNiQ3I7CisgICAgY2FzZSBjbXNTaWdMdXZEYXRhOiAgcmV0dXJuICBQVF9ZVVY7CisgICAgY2FzZSBjbXNTaWdYWVpEYXRhOiAgcmV0dXJuICBQVF9YWVo7CisgICAgY2FzZSBjbXNTaWdMYWJEYXRhOiAgcmV0dXJuICBQVF9MYWI7CisgICAgY2FzZSBjbXNTaWdMdXZLRGF0YTogcmV0dXJuICBQVF9ZVVZLOworICAgIGNhc2UgY21zU2lnSHN2RGF0YTogIHJldHVybiAgUFRfSFNWOworICAgIGNhc2UgY21zU2lnSGxzRGF0YTogIHJldHVybiAgUFRfSExTOworICAgIGNhc2UgY21zU2lnWXh5RGF0YTogIHJldHVybiAgUFRfWXh5OworCisgICAgY2FzZSBjbXNTaWcxY29sb3JEYXRhOgorICAgIGNhc2UgY21zU2lnTUNIMURhdGE6IHJldHVybiBQVF9NQ0gxOworCisgICAgY2FzZSBjbXNTaWcyY29sb3JEYXRhOgorICAgIGNhc2UgY21zU2lnTUNIMkRhdGE6IHJldHVybiBQVF9NQ0gyOworCisgICAgY2FzZSBjbXNTaWczY29sb3JEYXRhOgorICAgIGNhc2UgY21zU2lnTUNIM0RhdGE6IHJldHVybiBQVF9NQ0gzOworCisgICAgY2FzZSBjbXNTaWc0Y29sb3JEYXRhOgorICAgIGNhc2UgY21zU2lnTUNINERhdGE6IHJldHVybiBQVF9NQ0g0OworCisgICAgY2FzZSBjbXNTaWc1Y29sb3JEYXRhOgorICAgIGNhc2UgY21zU2lnTUNINURhdGE6IHJldHVybiBQVF9NQ0g1OworCisgICAgY2FzZSBjbXNTaWc2Y29sb3JEYXRhOgorICAgIGNhc2UgY21zU2lnTUNINkRhdGE6IHJldHVybiBQVF9NQ0g2OworCisgICAgY2FzZSBjbXNTaWdNQ0g3RGF0YToKKyAgICBjYXNlIGNtc1NpZzdjb2xvckRhdGE6cmV0dXJuIFBUX01DSDc7CisKKyAgICBjYXNlIGNtc1NpZ01DSDhEYXRhOgorICAgIGNhc2UgY21zU2lnOGNvbG9yRGF0YTpyZXR1cm4gUFRfTUNIODsKKworICAgIGNhc2UgY21zU2lnTUNIOURhdGE6CisgICAgY2FzZSBjbXNTaWc5Y29sb3JEYXRhOnJldHVybiBQVF9NQ0g5OworCisgICAgY2FzZSBjbXNTaWdNQ0hBRGF0YToKKyAgICBjYXNlIGNtc1NpZzEwY29sb3JEYXRhOnJldHVybiBQVF9NQ0gxMDsKKworICAgIGNhc2UgY21zU2lnTUNIQkRhdGE6CisgICAgY2FzZSBjbXNTaWcxMWNvbG9yRGF0YTpyZXR1cm4gUFRfTUNIMTE7CisKKyAgICBjYXNlIGNtc1NpZ01DSENEYXRhOgorICAgIGNhc2UgY21zU2lnMTJjb2xvckRhdGE6cmV0dXJuIFBUX01DSDEyOworCisgICAgY2FzZSBjbXNTaWdNQ0hERGF0YToKKyAgICBjYXNlIGNtc1NpZzEzY29sb3JEYXRhOnJldHVybiBQVF9NQ0gxMzsKKworICAgIGNhc2UgY21zU2lnTUNIRURhdGE6CisgICAgY2FzZSBjbXNTaWcxNGNvbG9yRGF0YTpyZXR1cm4gUFRfTUNIMTQ7CisKKyAgICBjYXNlIGNtc1NpZ01DSEZEYXRhOgorICAgIGNhc2UgY21zU2lnMTVjb2xvckRhdGE6cmV0dXJuIFBUX01DSDE1OworCisgICAgZGVmYXVsdDogIHJldHVybiAoY21zQ29sb3JTcGFjZVNpZ25hdHVyZSkgKC0xKTsKKyAgICB9Cit9CisKKworY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNDaGFubmVsc09mKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgQ29sb3JTcGFjZSkKK3sKKyAgICBzd2l0Y2ggKENvbG9yU3BhY2UpIHsKKworICAgIGNhc2UgY21zU2lnTUNIMURhdGE6CisgICAgY2FzZSBjbXNTaWcxY29sb3JEYXRhOgorICAgIGNhc2UgY21zU2lnR3JheURhdGE6IHJldHVybiAxOworCisgICAgY2FzZSBjbXNTaWdNQ0gyRGF0YToKKyAgICBjYXNlIGNtc1NpZzJjb2xvckRhdGE6ICByZXR1cm4gMjsKKworICAgIGNhc2UgY21zU2lnWFlaRGF0YToKKyAgICBjYXNlIGNtc1NpZ0xhYkRhdGE6CisgICAgY2FzZSBjbXNTaWdMdXZEYXRhOgorICAgIGNhc2UgY21zU2lnWUNiQ3JEYXRhOgorICAgIGNhc2UgY21zU2lnWXh5RGF0YToKKyAgICBjYXNlIGNtc1NpZ1JnYkRhdGE6CisgICAgY2FzZSBjbXNTaWdIc3ZEYXRhOgorICAgIGNhc2UgY21zU2lnSGxzRGF0YToKKyAgICBjYXNlIGNtc1NpZ0NteURhdGE6CisgICAgY2FzZSBjbXNTaWdNQ0gzRGF0YToKKyAgICBjYXNlIGNtc1NpZzNjb2xvckRhdGE6ICByZXR1cm4gMzsKKworICAgIGNhc2UgY21zU2lnTHV2S0RhdGE6CisgICAgY2FzZSBjbXNTaWdDbXlrRGF0YToKKyAgICBjYXNlIGNtc1NpZ01DSDREYXRhOgorICAgIGNhc2UgY21zU2lnNGNvbG9yRGF0YTogIHJldHVybiA0OworCisgICAgY2FzZSBjbXNTaWdNQ0g1RGF0YToKKyAgICBjYXNlIGNtc1NpZzVjb2xvckRhdGE6ICByZXR1cm4gNTsKKworICAgIGNhc2UgY21zU2lnTUNINkRhdGE6CisgICAgY2FzZSBjbXNTaWc2Y29sb3JEYXRhOiAgcmV0dXJuIDY7CisKKyAgICBjYXNlIGNtc1NpZ01DSDdEYXRhOgorICAgIGNhc2UgY21zU2lnN2NvbG9yRGF0YTogIHJldHVybiAgNzsKKworICAgIGNhc2UgY21zU2lnTUNIOERhdGE6CisgICAgY2FzZSBjbXNTaWc4Y29sb3JEYXRhOiAgcmV0dXJuICA4OworCisgICAgY2FzZSBjbXNTaWdNQ0g5RGF0YToKKyAgICBjYXNlIGNtc1NpZzljb2xvckRhdGE6ICByZXR1cm4gIDk7CisKKyAgICBjYXNlIGNtc1NpZ01DSEFEYXRhOgorICAgIGNhc2UgY21zU2lnMTBjb2xvckRhdGE6IHJldHVybiAxMDsKKworICAgIGNhc2UgY21zU2lnTUNIQkRhdGE6CisgICAgY2FzZSBjbXNTaWcxMWNvbG9yRGF0YTogcmV0dXJuIDExOworCisgICAgY2FzZSBjbXNTaWdNQ0hDRGF0YToKKyAgICBjYXNlIGNtc1NpZzEyY29sb3JEYXRhOiByZXR1cm4gMTI7CisKKyAgICBjYXNlIGNtc1NpZ01DSEREYXRhOgorICAgIGNhc2UgY21zU2lnMTNjb2xvckRhdGE6IHJldHVybiAxMzsKKworICAgIGNhc2UgY21zU2lnTUNIRURhdGE6CisgICAgY2FzZSBjbXNTaWcxNGNvbG9yRGF0YTogcmV0dXJuIDE0OworCisgICAgY2FzZSBjbXNTaWdNQ0hGRGF0YToKKyAgICBjYXNlIGNtc1NpZzE1Y29sb3JEYXRhOiByZXR1cm4gMTU7CisKKyAgICBkZWZhdWx0OiByZXR1cm4gMzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNwbHVnaW4uYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3BsdWdpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZGQ4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNwbHVnaW4uYwpAQCAtMCwwICsxLDk1NCBAQAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCisvLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTYgTWFydGkgTWFyaWEgU2FndWVyCisvLworLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisvLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisvLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisvLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKy8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQorLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKy8vCisvLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisvLworLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisvLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KKy8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisvLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCisvLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisvLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKy8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworCisjaW5jbHVkZSAibGNtczJfaW50ZXJuYWwuaCIKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbmNvZGluZyAmIERlY29kaW5nIHN1cHBvcnQgZnVuY3Rpb25zCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vICAgICAgTGl0dGxlLUVuZGlhbiB0byBCaWctRW5kaWFuCisKKy8vIEFkanVzdCBhIHdvcmQgdmFsdWUgYWZ0ZXIgYmVpbmcgcmVhZGVkLyBiZWZvcmUgYmVpbmcgd3JpdHRlbiBmcm9tL3RvIGFuIElDQyBwcm9maWxlCitjbXNVSW50MTZOdW1iZXIgQ01TRVhQT1JUICBfY21zQWRqdXN0RW5kaWFuZXNzMTYoY21zVUludDE2TnVtYmVyIFdvcmQpCit7CisjaWZuZGVmIENNU19VU0VfQklHX0VORElBTgorCisgICAgY21zVUludDhOdW1iZXIqIHBCeXRlID0gKGNtc1VJbnQ4TnVtYmVyKikgJldvcmQ7CisgICAgY21zVUludDhOdW1iZXIgdG1wOworCisgICAgdG1wID0gcEJ5dGVbMF07CisgICAgcEJ5dGVbMF0gPSBwQnl0ZVsxXTsKKyAgICBwQnl0ZVsxXSA9IHRtcDsKKyNlbmRpZgorCisgICAgcmV0dXJuIFdvcmQ7Cit9CisKKworLy8gVHJhbnNwb3J0cyB0byBwcm9wZXJseSBlbmNvZGVkIHZhbHVlcyAtIG5vdGUgdGhhdCBpY2MgcHJvZmlsZXMgZG9lcyB1c2UgYmlnIGVuZGlhbiBub3RhdGlvbi4KKworLy8gMSAyIDMgNAorLy8gNCAzIDIgMQorCitjbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUICBfY21zQWRqdXN0RW5kaWFuZXNzMzIoY21zVUludDMyTnVtYmVyIERXb3JkKQoreworI2lmbmRlZiBDTVNfVVNFX0JJR19FTkRJQU4KKworICAgIGNtc1VJbnQ4TnVtYmVyKiBwQnl0ZSA9IChjbXNVSW50OE51bWJlciopICZEV29yZDsKKyAgICBjbXNVSW50OE51bWJlciB0ZW1wMTsKKyAgICBjbXNVSW50OE51bWJlciB0ZW1wMjsKKworICAgIHRlbXAxID0gKnBCeXRlKys7CisgICAgdGVtcDIgPSAqcEJ5dGUrKzsKKyAgICAqKHBCeXRlLTEpID0gKnBCeXRlOworICAgICpwQnl0ZSsrID0gdGVtcDI7CisgICAgKihwQnl0ZS0zKSA9ICpwQnl0ZTsKKyAgICAqcEJ5dGUgPSB0ZW1wMTsKKyNlbmRpZgorICAgIHJldHVybiBEV29yZDsKK30KKworLy8gMSAyIDMgNCA1IDYgNyA4CisvLyA4IDcgNiA1IDQgMyAyIDEKKwordm9pZCBDTVNFWFBPUlQgIF9jbXNBZGp1c3RFbmRpYW5lc3M2NChjbXNVSW50NjROdW1iZXIqIFJlc3VsdCwgY21zVUludDY0TnVtYmVyKiBRV29yZCkKK3sKKworI2lmbmRlZiBDTVNfVVNFX0JJR19FTkRJQU4KKworICAgIGNtc1VJbnQ4TnVtYmVyKiBwSW4gID0gKGNtc1VJbnQ4TnVtYmVyKikgUVdvcmQ7CisgICAgY21zVUludDhOdW1iZXIqIHBPdXQgPSAoY21zVUludDhOdW1iZXIqKSBSZXN1bHQ7CisKKyAgICBfY21zQXNzZXJ0KFJlc3VsdCAhPSBOVUxMKTsKKworICAgIHBPdXRbN10gPSBwSW5bMF07CisgICAgcE91dFs2XSA9IHBJblsxXTsKKyAgICBwT3V0WzVdID0gcEluWzJdOworICAgIHBPdXRbNF0gPSBwSW5bM107CisgICAgcE91dFszXSA9IHBJbls0XTsKKyAgICBwT3V0WzJdID0gcEluWzVdOworICAgIHBPdXRbMV0gPSBwSW5bNl07CisgICAgcE91dFswXSA9IHBJbls3XTsKKworI2Vsc2UKKyAgICBfY21zQXNzZXJ0KFJlc3VsdCAhPSBOVUxMKTsKKworIyAgaWZkZWYgQ01TX0RPTlRfVVNFX0lOVDY0CisgICAgKCpSZXN1bHQpWzBdID0gUVdvcmRbMF07CisgICAgKCpSZXN1bHQpWzFdID0gUVdvcmRbMV07CisjICBlbHNlCisgICAgKlJlc3VsdCA9ICpRV29yZDsKKyMgIGVuZGlmCisjZW5kaWYKK30KKworLy8gQXV4aWxpYXJ5IC0tIHJlYWQgOCwgMTYgYW5kIDMyLWJpdCBudW1iZXJzCitjbXNCb29sIENNU0VYUE9SVCAgX2Ntc1JlYWRVSW50OE51bWJlcihjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50OE51bWJlciogbikKK3sKKyAgICBjbXNVSW50OE51bWJlciB0bXA7CisKKyAgICBfY21zQXNzZXJ0KGlvICE9IE5VTEwpOworCisgICAgaWYgKGlvIC0+IFJlYWQoaW8sICZ0bXAsIHNpemVvZihjbXNVSW50OE51bWJlciksIDEpICE9IDEpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAobiAhPSBOVUxMKSAqbiA9IHRtcDsKKyAgICByZXR1cm4gVFJVRTsKK30KKworY21zQm9vbCBDTVNFWFBPUlQgIF9jbXNSZWFkVUludDE2TnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQxNk51bWJlciogbikKK3sKKyAgICBjbXNVSW50MTZOdW1iZXIgdG1wOworCisgICAgX2Ntc0Fzc2VydChpbyAhPSBOVUxMKTsKKworICAgIGlmIChpbyAtPiBSZWFkKGlvLCAmdG1wLCBzaXplb2YoY21zVUludDE2TnVtYmVyKSwgMSkgIT0gMSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmIChuICE9IE5VTEwpICpuID0gX2Ntc0FkanVzdEVuZGlhbmVzczE2KHRtcCk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKK2Ntc0Jvb2wgQ01TRVhQT1JUICBfY21zUmVhZFVJbnQxNkFycmF5KGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciBuLCBjbXNVSW50MTZOdW1iZXIqIEFycmF5KQoreworICAgIGNtc1VJbnQzMk51bWJlciBpOworCisgICAgX2Ntc0Fzc2VydChpbyAhPSBOVUxMKTsKKworICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7CisKKyAgICAgICAgaWYgKEFycmF5ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sIEFycmF5ICsgaSkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sIE5VTEwpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworY21zQm9vbCBDTVNFWFBPUlQgIF9jbXNSZWFkVUludDMyTnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbikKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgdG1wOworCisgICAgX2Ntc0Fzc2VydChpbyAhPSBOVUxMKTsKKworICAgIGlmIChpbyAtPiBSZWFkKGlvLCAmdG1wLCBzaXplb2YoY21zVUludDMyTnVtYmVyKSwgMSkgIT0gMSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmIChuICE9IE5VTEwpICpuID0gX2Ntc0FkanVzdEVuZGlhbmVzczMyKHRtcCk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKK2Ntc0Jvb2wgQ01TRVhQT1JUICBfY21zUmVhZEZsb2F0MzJOdW1iZXIoY21zSU9IQU5ETEVSKiBpbywgY21zRmxvYXQzMk51bWJlciogbikKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgdG1wOworCisgICAgX2Ntc0Fzc2VydChpbyAhPSBOVUxMKTsKKworICAgIGlmIChpbyAtPiBSZWFkKGlvLCAmdG1wLCBzaXplb2YoY21zVUludDMyTnVtYmVyKSwgMSkgIT0gMSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGlmIChuICE9IE5VTEwpIHsKKworICAgICAgICB0bXAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIodG1wKTsKKyAgICAgICAgKm4gPSAqKGNtc0Zsb2F0MzJOdW1iZXIqKSAodm9pZCopICZ0bXA7CisgICAgICAgIGlmIChpc25hbigqbikpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLy8gZnBjbGFzc2lmeSgpIHJlcXVpcmVkIGJ5IEM5OQorICAgIHJldHVybiAoZnBjbGFzc2lmeSgqbikgPT0gRlBfWkVSTykgfHwgKGZwY2xhc3NpZnkoKm4pID09IEZQX05PUk1BTCk7Cit9CisKKworY21zQm9vbCBDTVNFWFBPUlQgICBfY21zUmVhZFVJbnQ2NE51bWJlcihjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50NjROdW1iZXIqIG4pCit7CisgICAgY21zVUludDY0TnVtYmVyIHRtcDsKKworICAgIF9jbXNBc3NlcnQoaW8gIT0gTlVMTCk7CisKKyAgICBpZiAoaW8gLT4gUmVhZChpbywgJnRtcCwgc2l6ZW9mKGNtc1VJbnQ2NE51bWJlciksIDEpICE9IDEpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAobiAhPSBOVUxMKSBfY21zQWRqdXN0RW5kaWFuZXNzNjQobiwgJnRtcCk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworY21zQm9vbCBDTVNFWFBPUlQgIF9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNtc0Zsb2F0NjROdW1iZXIqIG4pCit7CisgICAgY21zVUludDMyTnVtYmVyIHRtcDsKKworICAgIF9jbXNBc3NlcnQoaW8gIT0gTlVMTCk7CisKKyAgICBpZiAoaW8gLT4gUmVhZChpbywgJnRtcCwgc2l6ZW9mKGNtc1VJbnQzMk51bWJlciksIDEpICE9IDEpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAobiAhPSBOVUxMKSB7CisgICAgICAgICpuID0gX2NtczE1Rml4ZWQxNnRvRG91YmxlKF9jbXNBZGp1c3RFbmRpYW5lc3MzMih0bXApKTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCitjbXNCb29sIENNU0VYUE9SVCAgX2Ntc1JlYWRYWVpOdW1iZXIoY21zSU9IQU5ETEVSKiBpbywgY21zQ0lFWFlaKiBYWVopCit7CisgICAgY21zRW5jb2RlZFhZWk51bWJlciB4eXo7CisKKyAgICBfY21zQXNzZXJ0KGlvICE9IE5VTEwpOworCisgICAgaWYgKGlvIC0+UmVhZChpbywgJnh5eiwgc2l6ZW9mKGNtc0VuY29kZWRYWVpOdW1iZXIpLCAxKSAhPSAxKSByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoWFlaICE9IE5VTEwpIHsKKworICAgICAgICBYWVotPlggPSBfY21zMTVGaXhlZDE2dG9Eb3VibGUoX2Ntc0FkanVzdEVuZGlhbmVzczMyKHh5ei5YKSk7CisgICAgICAgIFhZWi0+WSA9IF9jbXMxNUZpeGVkMTZ0b0RvdWJsZShfY21zQWRqdXN0RW5kaWFuZXNzMzIoeHl6LlkpKTsKKyAgICAgICAgWFlaLT5aID0gX2NtczE1Rml4ZWQxNnRvRG91YmxlKF9jbXNBZGp1c3RFbmRpYW5lc3MzMih4eXouWikpOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworY21zQm9vbCBDTVNFWFBPUlQgIF9jbXNXcml0ZVVJbnQ4TnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQ4TnVtYmVyIG4pCit7CisgICAgX2Ntc0Fzc2VydChpbyAhPSBOVUxMKTsKKworICAgIGlmIChpbyAtPiBXcml0ZShpbywgc2l6ZW9mKGNtc1VJbnQ4TnVtYmVyKSwgJm4pICE9IDEpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworY21zQm9vbCBDTVNFWFBPUlQgIF9jbXNXcml0ZVVJbnQxNk51bWJlcihjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MTZOdW1iZXIgbikKK3sKKyAgICBjbXNVSW50MTZOdW1iZXIgdG1wOworCisgICAgX2Ntc0Fzc2VydChpbyAhPSBOVUxMKTsKKworICAgIHRtcCA9IF9jbXNBZGp1c3RFbmRpYW5lc3MxNihuKTsKKyAgICBpZiAoaW8gLT4gV3JpdGUoaW8sIHNpemVvZihjbXNVSW50MTZOdW1iZXIpLCAmdG1wKSAhPSAxKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK2Ntc0Jvb2wgQ01TRVhQT1JUICBfY21zV3JpdGVVSW50MTZBcnJheShjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIgbiwgY29uc3QgY21zVUludDE2TnVtYmVyKiBBcnJheSkKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgaTsKKworICAgIF9jbXNBc3NlcnQoaW8gIT0gTlVMTCk7CisgICAgX2Ntc0Fzc2VydChBcnJheSAhPSBOVUxMKTsKKworICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCBBcnJheVtpXSkpIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworY21zQm9vbCBDTVNFWFBPUlQgIF9jbXNXcml0ZVVJbnQzMk51bWJlcihjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIgbikKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgdG1wOworCisgICAgX2Ntc0Fzc2VydChpbyAhPSBOVUxMKTsKKworICAgIHRtcCA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMihuKTsKKyAgICBpZiAoaW8gLT4gV3JpdGUoaW8sIHNpemVvZihjbXNVSW50MzJOdW1iZXIpLCAmdG1wKSAhPSAxKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworY21zQm9vbCBDTVNFWFBPUlQgIF9jbXNXcml0ZUZsb2F0MzJOdW1iZXIoY21zSU9IQU5ETEVSKiBpbywgY21zRmxvYXQzMk51bWJlciBuKQoreworICAgIGNtc1VJbnQzMk51bWJlciB0bXA7CisKKyAgICBfY21zQXNzZXJ0KGlvICE9IE5VTEwpOworCisgICAgdG1wID0gKihjbXNVSW50MzJOdW1iZXIqKSAodm9pZCopICZuOworICAgIHRtcCA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMih0bXApOworICAgIGlmIChpbyAtPiBXcml0ZShpbywgc2l6ZW9mKGNtc1VJbnQzMk51bWJlciksICZ0bXApICE9IDEpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworY21zQm9vbCBDTVNFWFBPUlQgIF9jbXNXcml0ZVVJbnQ2NE51bWJlcihjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50NjROdW1iZXIqIG4pCit7CisgICAgY21zVUludDY0TnVtYmVyIHRtcDsKKworICAgIF9jbXNBc3NlcnQoaW8gIT0gTlVMTCk7CisKKyAgICBfY21zQWRqdXN0RW5kaWFuZXNzNjQoJnRtcCwgbik7CisgICAgaWYgKGlvIC0+IFdyaXRlKGlvLCBzaXplb2YoY21zVUludDY0TnVtYmVyKSwgJnRtcCkgIT0gMSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIHJldHVybiBUUlVFOworfQorCitjbXNCb29sIENNU0VYUE9SVCAgX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNtc0Zsb2F0NjROdW1iZXIgbikKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgdG1wOworCisgICAgX2Ntc0Fzc2VydChpbyAhPSBOVUxMKTsKKworICAgIHRtcCA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMihfY21zRG91YmxlVG8xNUZpeGVkMTYobikpOworICAgIGlmIChpbyAtPiBXcml0ZShpbywgc2l6ZW9mKGNtc1VJbnQzMk51bWJlciksICZ0bXApICE9IDEpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworY21zQm9vbCBDTVNFWFBPUlQgIF9jbXNXcml0ZVhZWk51bWJlcihjbXNJT0hBTkRMRVIqIGlvLCBjb25zdCBjbXNDSUVYWVoqIFhZWikKK3sKKyAgICBjbXNFbmNvZGVkWFlaTnVtYmVyIHh5ejsKKworICAgIF9jbXNBc3NlcnQoaW8gIT0gTlVMTCk7CisgICAgX2Ntc0Fzc2VydChYWVogIT0gTlVMTCk7CisKKyAgICB4eXouWCA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMihfY21zRG91YmxlVG8xNUZpeGVkMTYoWFlaLT5YKSk7CisgICAgeHl6LlkgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoX2Ntc0RvdWJsZVRvMTVGaXhlZDE2KFhZWi0+WSkpOworICAgIHh5ei5aID0gX2Ntc0FkanVzdEVuZGlhbmVzczMyKF9jbXNEb3VibGVUbzE1Rml4ZWQxNihYWVotPlopKTsKKworICAgIHJldHVybiBpbyAtPiBXcml0ZShpbywgIHNpemVvZihjbXNFbmNvZGVkWFlaTnVtYmVyKSwgJnh5eik7Cit9CisKKy8vIGZyb20gRml4ZWQgcG9pbnQgOC44IHRvIGRvdWJsZQorY21zRmxvYXQ2NE51bWJlciBDTVNFWFBPUlQgX2NtczhGaXhlZDh0b0RvdWJsZShjbXNVSW50MTZOdW1iZXIgZml4ZWQ4KQoreworICAgICAgIGNtc1VJbnQ4TnVtYmVyICBtc2IsIGxzYjsKKworICAgICAgIGxzYiA9IChjbXNVSW50OE51bWJlcikgKGZpeGVkOCAmIDB4ZmYpOworICAgICAgIG1zYiA9IChjbXNVSW50OE51bWJlcikgKCgoY21zVUludDE2TnVtYmVyKSBmaXhlZDggPj4gOCkgJiAweGZmKTsKKworICAgICAgIHJldHVybiAoY21zRmxvYXQ2NE51bWJlcikgKChjbXNGbG9hdDY0TnVtYmVyKSBtc2IgKyAoKGNtc0Zsb2F0NjROdW1iZXIpIGxzYiAvIDI1Ni4wKSk7Cit9CisKK2Ntc1VJbnQxNk51bWJlciBDTVNFWFBPUlQgX2Ntc0RvdWJsZVRvOEZpeGVkOChjbXNGbG9hdDY0TnVtYmVyIHZhbCkKK3sKKyAgICBjbXNTMTVGaXhlZDE2TnVtYmVyIEdhbW1hRml4ZWQzMiA9IF9jbXNEb3VibGVUbzE1Rml4ZWQxNih2YWwpOworICAgIHJldHVybiAgKGNtc1VJbnQxNk51bWJlcikgKChHYW1tYUZpeGVkMzIgPj4gOCkgJiAweEZGRkYpOworfQorCisvLyBmcm9tIEZpeGVkIHBvaW50IDE1LjE2IHRvIGRvdWJsZQorY21zRmxvYXQ2NE51bWJlciBDTVNFWFBPUlQgX2NtczE1Rml4ZWQxNnRvRG91YmxlKGNtc1MxNUZpeGVkMTZOdW1iZXIgZml4MzIpCit7CisgICAgY21zRmxvYXQ2NE51bWJlciBmbG9hdGVyLCBzaWduLCBtaWQ7CisgICAgaW50IFdob2xlLCBGcmFjUGFydDsKKworICAgIHNpZ24gID0gKGZpeDMyIDwgMCA/IC0xIDogMSk7CisgICAgZml4MzIgPSBhYnMoZml4MzIpOworCisgICAgV2hvbGUgICAgID0gKGNtc1VJbnQxNk51bWJlcikoZml4MzIgPj4gMTYpICYgMHhmZmZmOworICAgIEZyYWNQYXJ0ICA9IChjbXNVSW50MTZOdW1iZXIpKGZpeDMyICYgMHhmZmZmKTsKKworICAgIG1pZCAgICAgPSAoY21zRmxvYXQ2NE51bWJlcikgRnJhY1BhcnQgLyA2NTUzNi4wOworICAgIGZsb2F0ZXIgPSAoY21zRmxvYXQ2NE51bWJlcikgV2hvbGUgKyBtaWQ7CisKKyAgICByZXR1cm4gc2lnbiAqIGZsb2F0ZXI7Cit9CisKKy8vIGZyb20gZG91YmxlIHRvIEZpeGVkIHBvaW50IDE1LjE2CitjbXNTMTVGaXhlZDE2TnVtYmVyIENNU0VYUE9SVCBfY21zRG91YmxlVG8xNUZpeGVkMTYoY21zRmxvYXQ2NE51bWJlciB2KQoreworICAgIHJldHVybiAoKGNtc1MxNUZpeGVkMTZOdW1iZXIpIGZsb29yKCh2KSo2NTUzNi4wICsgMC41KSk7Cit9CisKKy8vIERhdGUvVGltZSBmdW5jdGlvbnMKKwordm9pZCBDTVNFWFBPUlQgX2Ntc0RlY29kZURhdGVUaW1lTnVtYmVyKGNvbnN0IGNtc0RhdGVUaW1lTnVtYmVyICpTb3VyY2UsIHN0cnVjdCB0bSAqRGVzdCkKK3sKKworICAgIF9jbXNBc3NlcnQoRGVzdCAhPSBOVUxMKTsKKyAgICBfY21zQXNzZXJ0KFNvdXJjZSAhPSBOVUxMKTsKKworICAgIERlc3QtPnRtX3NlYyAgID0gX2Ntc0FkanVzdEVuZGlhbmVzczE2KFNvdXJjZS0+c2Vjb25kcyk7CisgICAgRGVzdC0+dG1fbWluICAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMTYoU291cmNlLT5taW51dGVzKTsKKyAgICBEZXN0LT50bV9ob3VyICA9IF9jbXNBZGp1c3RFbmRpYW5lc3MxNihTb3VyY2UtPmhvdXJzKTsKKyAgICBEZXN0LT50bV9tZGF5ICA9IF9jbXNBZGp1c3RFbmRpYW5lc3MxNihTb3VyY2UtPmRheSk7CisgICAgRGVzdC0+dG1fbW9uICAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMTYoU291cmNlLT5tb250aCkgLSAxOworICAgIERlc3QtPnRtX3llYXIgID0gX2Ntc0FkanVzdEVuZGlhbmVzczE2KFNvdXJjZS0+eWVhcikgLSAxOTAwOworICAgIERlc3QtPnRtX3dkYXkgID0gLTE7CisgICAgRGVzdC0+dG1feWRheSAgPSAtMTsKKyAgICBEZXN0LT50bV9pc2RzdCA9IDA7Cit9CisKK3ZvaWQgQ01TRVhQT1JUIF9jbXNFbmNvZGVEYXRlVGltZU51bWJlcihjbXNEYXRlVGltZU51bWJlciAqRGVzdCwgY29uc3Qgc3RydWN0IHRtICpTb3VyY2UpCit7CisgICAgX2Ntc0Fzc2VydChEZXN0ICE9IE5VTEwpOworICAgIF9jbXNBc3NlcnQoU291cmNlICE9IE5VTEwpOworCisgICAgRGVzdC0+c2Vjb25kcyA9IF9jbXNBZGp1c3RFbmRpYW5lc3MxNigoY21zVUludDE2TnVtYmVyKSBTb3VyY2UtPnRtX3NlYyk7CisgICAgRGVzdC0+bWludXRlcyA9IF9jbXNBZGp1c3RFbmRpYW5lc3MxNigoY21zVUludDE2TnVtYmVyKSBTb3VyY2UtPnRtX21pbik7CisgICAgRGVzdC0+aG91cnMgICA9IF9jbXNBZGp1c3RFbmRpYW5lc3MxNigoY21zVUludDE2TnVtYmVyKSBTb3VyY2UtPnRtX2hvdXIpOworICAgIERlc3QtPmRheSAgICAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMTYoKGNtc1VJbnQxNk51bWJlcikgU291cmNlLT50bV9tZGF5KTsKKyAgICBEZXN0LT5tb250aCAgID0gX2Ntc0FkanVzdEVuZGlhbmVzczE2KChjbXNVSW50MTZOdW1iZXIpIChTb3VyY2UtPnRtX21vbiArIDEpKTsKKyAgICBEZXN0LT55ZWFyICAgID0gX2Ntc0FkanVzdEVuZGlhbmVzczE2KChjbXNVSW50MTZOdW1iZXIpIChTb3VyY2UtPnRtX3llYXIgKyAxOTAwKSk7Cit9CisKKy8vIFJlYWQgYmFzZSBhbmQgcmV0dXJuIHR5cGUgYmFzZQorY21zVGFnVHlwZVNpZ25hdHVyZSBDTVNFWFBPUlQgX2Ntc1JlYWRUeXBlQmFzZShjbXNJT0hBTkRMRVIqIGlvKQoreworICAgIF9jbXNUYWdCYXNlIEJhc2U7CisKKyAgICBfY21zQXNzZXJ0KGlvICE9IE5VTEwpOworCisgICAgaWYgKGlvIC0+IFJlYWQoaW8sICZCYXNlLCBzaXplb2YoX2Ntc1RhZ0Jhc2UpLCAxKSAhPSAxKQorICAgICAgICByZXR1cm4gKGNtc1RhZ1R5cGVTaWduYXR1cmUpIDA7CisKKyAgICByZXR1cm4gKGNtc1RhZ1R5cGVTaWduYXR1cmUpIF9jbXNBZGp1c3RFbmRpYW5lc3MzMihCYXNlLnNpZyk7Cit9CisKKy8vIFNldHVwIGJhc2UgbWFya2VyCitjbXNCb29sICBDTVNFWFBPUlQgX2Ntc1dyaXRlVHlwZUJhc2UoY21zSU9IQU5ETEVSKiBpbywgY21zVGFnVHlwZVNpZ25hdHVyZSBzaWcpCit7CisgICAgX2Ntc1RhZ0Jhc2UgIEJhc2U7CisKKyAgICBfY21zQXNzZXJ0KGlvICE9IE5VTEwpOworCisgICAgQmFzZS5zaWcgPSAoY21zVGFnVHlwZVNpZ25hdHVyZSkgX2Ntc0FkanVzdEVuZGlhbmVzczMyKHNpZyk7CisgICAgbWVtc2V0KCZCYXNlLnJlc2VydmVkLCAwLCBzaXplb2YoQmFzZS5yZXNlcnZlZCkpOworICAgIHJldHVybiBpbyAtPiBXcml0ZShpbywgc2l6ZW9mKF9jbXNUYWdCYXNlKSwgJkJhc2UpOworfQorCitjbXNCb29sIENNU0VYUE9SVCBfY21zUmVhZEFsaWdubWVudChjbXNJT0hBTkRMRVIqIGlvKQoreworICAgIGNtc1VJbnQ4TnVtYmVyICBCdWZmZXJbNF07CisgICAgY21zVUludDMyTnVtYmVyIE5leHRBbGlnbmVkLCBBdDsKKyAgICBjbXNVSW50MzJOdW1iZXIgQnl0ZXNUb05leHRBbGlnbmVkUG9zOworCisgICAgX2Ntc0Fzc2VydChpbyAhPSBOVUxMKTsKKworICAgIEF0ID0gaW8gLT4gVGVsbChpbyk7CisgICAgTmV4dEFsaWduZWQgPSBfY21zQUxJR05MT05HKEF0KTsKKyAgICBCeXRlc1RvTmV4dEFsaWduZWRQb3MgPSBOZXh0QWxpZ25lZCAtIEF0OworICAgIGlmIChCeXRlc1RvTmV4dEFsaWduZWRQb3MgPT0gMCkgcmV0dXJuIFRSVUU7CisgICAgaWYgKEJ5dGVzVG9OZXh0QWxpZ25lZFBvcyA+IDQpICByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gKGlvIC0+UmVhZChpbywgQnVmZmVyLCBCeXRlc1RvTmV4dEFsaWduZWRQb3MsIDEpID09IDEpOworfQorCitjbXNCb29sIENNU0VYUE9SVCBfY21zV3JpdGVBbGlnbm1lbnQoY21zSU9IQU5ETEVSKiBpbykKK3sKKyAgICBjbXNVSW50OE51bWJlciAgQnVmZmVyWzRdOworICAgIGNtc1VJbnQzMk51bWJlciBOZXh0QWxpZ25lZCwgQXQ7CisgICAgY21zVUludDMyTnVtYmVyIEJ5dGVzVG9OZXh0QWxpZ25lZFBvczsKKworICAgIF9jbXNBc3NlcnQoaW8gIT0gTlVMTCk7CisKKyAgICBBdCA9IGlvIC0+IFRlbGwoaW8pOworICAgIE5leHRBbGlnbmVkID0gX2Ntc0FMSUdOTE9ORyhBdCk7CisgICAgQnl0ZXNUb05leHRBbGlnbmVkUG9zID0gTmV4dEFsaWduZWQgLSBBdDsKKyAgICBpZiAoQnl0ZXNUb05leHRBbGlnbmVkUG9zID09IDApIHJldHVybiBUUlVFOworICAgIGlmIChCeXRlc1RvTmV4dEFsaWduZWRQb3MgPiA0KSAgcmV0dXJuIEZBTFNFOworCisgICAgbWVtc2V0KEJ1ZmZlciwgMCwgQnl0ZXNUb05leHRBbGlnbmVkUG9zKTsKKyAgICByZXR1cm4gaW8gLT4gV3JpdGUoaW8sIEJ5dGVzVG9OZXh0QWxpZ25lZFBvcywgQnVmZmVyKTsKK30KKworCisvLyBUbyBkZWFsIHdpdGggdGV4dCBzdHJlYW1zLiAySyBhdCBtb3N0CitjbXNCb29sIENNU0VYUE9SVCBfY21zSU9QcmludGYoY21zSU9IQU5ETEVSKiBpbywgY29uc3QgY2hhciogZnJtLCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworICAgIGludCBsZW47CisgICAgY21zVUludDhOdW1iZXIgQnVmZmVyWzIwNDhdOworICAgIGNtc0Jvb2wgcmM7CisKKyAgICBfY21zQXNzZXJ0KGlvICE9IE5VTEwpOworICAgIF9jbXNBc3NlcnQoZnJtICE9IE5VTEwpOworCisgICAgdmFfc3RhcnQoYXJncywgZnJtKTsKKworICAgIGxlbiA9IHZzbnByaW50ZigoY2hhciopIEJ1ZmZlciwgMjA0NywgZnJtLCBhcmdzKTsKKyAgICBpZiAobGVuIDwgMCkgeworICAgICAgICB2YV9lbmQoYXJncyk7CisgICAgICAgIHJldHVybiBGQUxTRTsgICAvLyBUcnVuY2F0ZWQsIHdoaWNoIGlzIGEgZmF0YWwgZXJyb3IgZm9yIHVzCisgICAgfQorCisgICAgcmMgPSBpbyAtPldyaXRlKGlvLCBsZW4sIEJ1ZmZlcik7CisKKyAgICB2YV9lbmQoYXJncyk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKworLy8gUGx1Z2luIG1lbW9yeSBtYW5hZ2VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gU3BlY2lhbGl6ZWQgbWFsbG9jIGZvciBwbHVnLWlucywgdGhhdCBpcyBmcmVlZCB1cG9uIGV4aXQuCit2b2lkKiBfY21zUGx1Z2luTWFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgc2l6ZSkKK3sKKyAgICBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHggPSBfY21zR2V0Q29udGV4dChDb250ZXh0SUQpOworCisgICAgaWYgKGN0eCAtPk1lbVBvb2wgPT0gTlVMTCkgeworCisgICAgICAgIGlmIChDb250ZXh0SUQgPT0gTlVMTCkgeworCisgICAgICAgICAgICBjdHgtPk1lbVBvb2wgPSBfY21zQ3JlYXRlU3ViQWxsb2MoMCwgMioxMDI0KTsKKyAgICAgICAgICAgIGlmIChjdHgtPk1lbVBvb2wgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX0NPUlJVUFRJT05fREVURUNURUQsICJOVUxMIG1lbW9yeSBwb29sIG9uIGNvbnRleHQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIF9jbXNTdWJBbGxvYyhjdHgtPk1lbVBvb2wsIHNpemUpOworfQorCisKKy8vIE1haW4gcGx1Zy1pbiBkaXNwYXRjaGVyCitjbXNCb29sIENNU0VYUE9SVCBjbXNQbHVnaW4odm9pZCogUGx1Z19pbikKK3sKKyAgICByZXR1cm4gY21zUGx1Z2luVEhSKE5VTEwsIFBsdWdfaW4pOworfQorCitjbXNCb29sIENNU0VYUE9SVCBjbXNQbHVnaW5USFIoY21zQ29udGV4dCBpZCwgdm9pZCogUGx1Z19pbikKK3sKKyAgICBjbXNQbHVnaW5CYXNlKiBQbHVnaW47CisKKyAgICBmb3IgKFBsdWdpbiA9IChjbXNQbHVnaW5CYXNlKikgUGx1Z19pbjsKKyAgICAgICAgIFBsdWdpbiAhPSBOVUxMOworICAgICAgICAgUGx1Z2luID0gUGx1Z2luIC0+IE5leHQpIHsKKworICAgICAgICAgICAgaWYgKFBsdWdpbiAtPiBNYWdpYyAhPSBjbXNQbHVnaW5NYWdpY051bWJlcikgeworICAgICAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKGlkLCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVucmVjb2duaXplZCBwbHVnaW4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChQbHVnaW4gLT5FeHBlY3RlZFZlcnNpb24gPiBMQ01TX1ZFUlNJT04pIHsKKyAgICAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihpZCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJwbHVnaW4gbmVlZHMgTGl0dGxlIENNUyAlZCwgY3VycmVudCB2ZXJzaW9uIGlzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgUGx1Z2luIC0+RXhwZWN0ZWRWZXJzaW9uLCBMQ01TX1ZFUlNJT04pOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChQbHVnaW4gLT4gVHlwZSkgeworCisgICAgICAgICAgICAgICAgY2FzZSBjbXNQbHVnaW5NZW1IYW5kbGVyU2lnOgorICAgICAgICAgICAgICAgICAgICBpZiAoIV9jbXNSZWdpc3Rlck1lbUhhbmRsZXJQbHVnaW4oaWQsIFBsdWdpbikpIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIGNtc1BsdWdpbkludGVycG9sYXRpb25TaWc6CisgICAgICAgICAgICAgICAgICAgIGlmICghX2Ntc1JlZ2lzdGVySW50ZXJwUGx1Z2luKGlkLCBQbHVnaW4pKSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBjbXNQbHVnaW5UYWdUeXBlU2lnOgorICAgICAgICAgICAgICAgICAgICBpZiAoIV9jbXNSZWdpc3RlclRhZ1R5cGVQbHVnaW4oaWQsIFBsdWdpbikpIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIGNtc1BsdWdpblRhZ1NpZzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFfY21zUmVnaXN0ZXJUYWdQbHVnaW4oaWQsIFBsdWdpbikpIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIGNtc1BsdWdpbkZvcm1hdHRlcnNTaWc6CisgICAgICAgICAgICAgICAgICAgIGlmICghX2Ntc1JlZ2lzdGVyRm9ybWF0dGVyc1BsdWdpbihpZCwgUGx1Z2luKSkgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgY21zUGx1Z2luUmVuZGVyaW5nSW50ZW50U2lnOgorICAgICAgICAgICAgICAgICAgICBpZiAoIV9jbXNSZWdpc3RlclJlbmRlcmluZ0ludGVudFBsdWdpbihpZCwgUGx1Z2luKSkgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgY21zUGx1Z2luUGFyYW1ldHJpY0N1cnZlU2lnOgorICAgICAgICAgICAgICAgICAgICBpZiAoIV9jbXNSZWdpc3RlclBhcmFtZXRyaWNDdXJ2ZXNQbHVnaW4oaWQsIFBsdWdpbikpIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIGNtc1BsdWdpbk11bHRpUHJvY2Vzc0VsZW1lbnRTaWc6CisgICAgICAgICAgICAgICAgICAgIGlmICghX2Ntc1JlZ2lzdGVyTXVsdGlQcm9jZXNzRWxlbWVudFBsdWdpbihpZCwgUGx1Z2luKSkgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgY21zUGx1Z2luT3B0aW1pemF0aW9uU2lnOgorICAgICAgICAgICAgICAgICAgICBpZiAoIV9jbXNSZWdpc3Rlck9wdGltaXphdGlvblBsdWdpbihpZCwgUGx1Z2luKSkgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgY21zUGx1Z2luVHJhbnNmb3JtU2lnOgorICAgICAgICAgICAgICAgICAgICBpZiAoIV9jbXNSZWdpc3RlclRyYW5zZm9ybVBsdWdpbihpZCwgUGx1Z2luKSkgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgY21zUGx1Z2luTXV0ZXhTaWc6CisgICAgICAgICAgICAgICAgICAgIGlmICghX2Ntc1JlZ2lzdGVyTXV0ZXhQbHVnaW4oaWQsIFBsdWdpbikpIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihpZCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJVbnJlY29nbml6ZWQgcGx1Z2luIHR5cGUgJyVYJyIsIFBsdWdpbiAtPiBUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIC8vIEtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIHBsdWctaW4KKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLyBSZXZlcnQgYWxsIHBsdWctaW5zIHRvIGRlZmF1bHQKK3ZvaWQgQ01TRVhQT1JUIGNtc1VucmVnaXN0ZXJQbHVnaW5zKHZvaWQpCit7CisgICAgY21zVW5yZWdpc3RlclBsdWdpbnNUSFIoTlVMTCk7Cit9CisKKworLy8gVGhlIEdsb2JhbCBzdG9yYWdlIGZvciBzeXN0ZW0gY29udGV4dC4gVGhpcyBpcyB0aGUgb25lIGFuZCBvbmx5IGdsb2JhbCB2YXJpYWJsZQorLy8gcG9pbnRlcnMgc3RydWN0dXJlLiBBbGwgZ2xvYmFsIHZhcnMgYXJlIHJlZmVyZW5jZWQgaGVyZS4KK3N0YXRpYyBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0IGdsb2JhbENvbnRleHQgPSB7CisKKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCBpbiB0aGUgbGlua2VkIGxpc3QKKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIHN1YmFsbG9jYXRvcgorICAgIHsKKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICBVc2VyUHRyLCAgICAgICAgICAgIAorICAgICAgICAmX2Ntc0xvZ0Vycm9yQ2h1bmssICAgICAgICAgICAgLy8gIExvZ2dlciwKKyAgICAgICAgJl9jbXNBbGFybUNvZGVzQ2h1bmssICAgICAgICAgIC8vICBBbGFybUNvZGVzLAorICAgICAgICAmX2Ntc0FkYXB0YXRpb25TdGF0ZUNodW5rLCAgICAgLy8gIEFkYXB0YXRpb25TdGF0ZSwgCisgICAgICAgICZfY21zTWVtUGx1Z2luQ2h1bmssICAgICAgICAgICAvLyAgTWVtUGx1Z2luLAorICAgICAgICAmX2Ntc0ludGVycFBsdWdpbkNodW5rLCAgICAgICAgLy8gIEludGVycFBsdWdpbiwKKyAgICAgICAgJl9jbXNDdXJ2ZXNQbHVnaW5DaHVuaywgICAgICAgIC8vICBDdXJ2ZXNQbHVnaW4sCisgICAgICAgICZfY21zRm9ybWF0dGVyc1BsdWdpbkNodW5rLCAgICAvLyAgRm9ybWF0dGVyc1BsdWdpbiwKKyAgICAgICAgJl9jbXNUYWdUeXBlUGx1Z2luQ2h1bmssICAgICAgIC8vICBUYWdUeXBlUGx1Z2luLAorICAgICAgICAmX2Ntc1RhZ1BsdWdpbkNodW5rLCAgICAgICAgICAgLy8gIFRhZ1BsdWdpbiwKKyAgICAgICAgJl9jbXNJbnRlbnRzUGx1Z2luQ2h1bmssICAgICAgIC8vICBJbnRlbnRQbHVnaW4sCisgICAgICAgICZfY21zTVBFVHlwZVBsdWdpbkNodW5rLCAgICAgICAvLyAgTVBFUGx1Z2luLAorICAgICAgICAmX2Ntc09wdGltaXphdGlvblBsdWdpbkNodW5rLCAgLy8gIE9wdGltaXphdGlvblBsdWdpbiwKKyAgICAgICAgJl9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVuaywgICAgIC8vICBUcmFuc2Zvcm1QbHVnaW4sCisgICAgICAgICZfY21zTXV0ZXhQbHVnaW5DaHVuayAgICAgICAgICAvLyAgTXV0ZXhQbHVnaW4KKyAgICB9LAorICAgIAorICAgIHsgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCB9IC8vIFRoZSBkZWZhdWx0IG1lbW9yeSBhbGxvY2F0b3IgaXMgbm90IHVzZWQgZm9yIGNvbnRleHQgMAorfTsKKworCisvLyBUaGUgY29udGV4dCBwb29sIChsaW5rZWQgbGlzdCBoZWFkKQorc3RhdGljIF9jbXNNdXRleCBfY21zQ29udGV4dFBvb2xIZWFkTXV0ZXggPSBDTVNfTVVURVhfSU5JVElBTElaRVI7CitzdGF0aWMgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogX2Ntc0NvbnRleHRQb29sSGVhZCA9IE5VTEw7CisKKy8vIEludGVybmFsLCBnZXQgYXNzb2NpYXRlZCBwb2ludGVyLCB3aXRoIGd1ZXNzaW5nLiBOZXZlciByZXR1cm5zIE5VTEwuCitzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBfY21zR2V0Q29udGV4dChjbXNDb250ZXh0IENvbnRleHRJRCkKK3sKKyAgICBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBpZCA9IChzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KikgQ29udGV4dElEOworICAgIHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eDsKKworCisgICAgLy8gT24gMCwgdXNlIGdsb2JhbCBzZXR0aW5ncworICAgIGlmIChpZCA9PSBOVUxMKSAKKyAgICAgICAgcmV0dXJuICZnbG9iYWxDb250ZXh0OworCisgICAgLy8gU2VhcmNoCisgICAgZm9yIChjdHggPSBfY21zQ29udGV4dFBvb2xIZWFkOworICAgICAgICAgY3R4ICE9IE5VTEw7CisgICAgICAgICBjdHggPSBjdHggLT5OZXh0KSB7CisKKyAgICAgICAgICAgIC8vIEZvdW5kIGl0PworICAgICAgICAgICAgaWYgKGlkID09IGN0eCkKKyAgICAgICAgICAgICAgICByZXR1cm4gY3R4OyAvLyBOZXctc3R5bGUgY29udGV4dCwgCisgICAgfQorCisgICAgcmV0dXJuICZnbG9iYWxDb250ZXh0OworfQorCisKKy8vIEludGVybmFsOiBnZXQgdGhlIG1lbW9yeSBhcmVhIGFzc29jaWFudGVkIHdpdGggZWFjaCBjb250ZXh0IGNsaWVudAorLy8gUmV0dXJucyB0aGUgYmxvY2sgYXNzaWduZWQgdG8gdGhlIHNwZWNpZmljIHpvbmUuIE5ldmVyIHJldHVybiBOVUxMLgordm9pZCogX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhjbXNDb250ZXh0IENvbnRleHRJRCwgX2Ntc01lbW9yeUNsaWVudCBtYykKK3sKKyAgICBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHg7CisgICAgdm9pZCAqcHRyOworCisgICAgaWYgKChpbnQpIG1jIDwgMCB8fCBtYyA+PSBNZW1vcnlDbGllbnRNYXgpIHsKKyAgICAgICAgCisgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfSU5URVJOQUwsICJCYWQgY29udGV4dCBjbGllbnQgLS0gcG9zc2libGUgY29ycnVwdGlvbiIpOworCisgICAgICAgICAgIC8vIFRoaXMgaXMgY2F0YXN0cm9waGljLiBTaG91bGQgbmV2ZXIgcmVhY2ggaGVyZQorICAgICAgICAgICBfY21zQXNzZXJ0KDApOworCisgICAgICAgICAgIC8vIFJldmVydHMgdG8gZ2xvYmFsIGNvbnRleHQKKyAgICAgICAgICAgcmV0dXJuIGdsb2JhbENvbnRleHQuY2h1bmtzW1VzZXJQdHJdOworICAgIH0KKyAgICAKKyAgICBjdHggPSBfY21zR2V0Q29udGV4dChDb250ZXh0SUQpOworICAgIHB0ciA9IGN0eCAtPmNodW5rc1ttY107CisKKyAgICBpZiAocHRyICE9IE5VTEwpCisgICAgICAgIHJldHVybiBwdHI7CisKKyAgICAvLyBBIG51bGwgcHRyIG1lYW5zIG5vIHNwZWNpYWwgc2V0dGluZ3MgZm9yIHRoYXQgY29udGV4dCwgYW5kIHRoaXMgCisgICAgLy8gcmV2ZXJ0cyB0byBDb250ZXh0MCBnbG9iYWxzCisgICAgcmV0dXJuIGdsb2JhbENvbnRleHQuY2h1bmtzW21jXTsgICAgCit9CisKKworLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBnaXZlbiBjb250ZXh0IGl0cyBkZWZhdWx0IHByaXN0aW5lIHN0YXRlLAorLy8gYXMgbm8gcGx1Zy1pbnMgd2VyZSBkZWNsYXJlZC4gVGhlcmUgaXMgbm8gd2F5IHRvIHVucmVnaXN0ZXIgYSBzaW5nbGUgCisvLyBwbHVnLWluLCBhcyBhIHNpbmdsZSBjYWxsIHRvIGNtc1BsdWdpblRIUigpIGZ1bmN0aW9uIG1heSByZWdpc3RlciAKKy8vIG1hbnkgZGlmZmVyZW50IHBsdWctaW5zIHNpbXVsdGFuZW91c2x5LCB0aGVuIHRoZXJlIGlzIG5vIHdheSB0byAKKy8vIGlkZW50aWZ5IHdoaWNoIHBsdWctaW4gdG8gdW5yZWdpc3Rlci4KK3ZvaWQgQ01TRVhQT1JUIGNtc1VucmVnaXN0ZXJQbHVnaW5zVEhSKGNtc0NvbnRleHQgQ29udGV4dElEKQoreworICAgIF9jbXNSZWdpc3Rlck1lbUhhbmRsZXJQbHVnaW4oQ29udGV4dElELCBOVUxMKTsKKyAgICBfY21zUmVnaXN0ZXJJbnRlcnBQbHVnaW4oQ29udGV4dElELCBOVUxMKTsKKyAgICBfY21zUmVnaXN0ZXJUYWdUeXBlUGx1Z2luKENvbnRleHRJRCwgTlVMTCk7CisgICAgX2Ntc1JlZ2lzdGVyVGFnUGx1Z2luKENvbnRleHRJRCwgTlVMTCk7CisgICAgX2Ntc1JlZ2lzdGVyRm9ybWF0dGVyc1BsdWdpbihDb250ZXh0SUQsIE5VTEwpOworICAgIF9jbXNSZWdpc3RlclJlbmRlcmluZ0ludGVudFBsdWdpbihDb250ZXh0SUQsIE5VTEwpOworICAgIF9jbXNSZWdpc3RlclBhcmFtZXRyaWNDdXJ2ZXNQbHVnaW4oQ29udGV4dElELCBOVUxMKTsKKyAgICBfY21zUmVnaXN0ZXJNdWx0aVByb2Nlc3NFbGVtZW50UGx1Z2luKENvbnRleHRJRCwgTlVMTCk7CisgICAgX2Ntc1JlZ2lzdGVyT3B0aW1pemF0aW9uUGx1Z2luKENvbnRleHRJRCwgTlVMTCk7CisgICAgX2Ntc1JlZ2lzdGVyVHJhbnNmb3JtUGx1Z2luKENvbnRleHRJRCwgTlVMTCk7ICAgIAorICAgIF9jbXNSZWdpc3Rlck11dGV4UGx1Z2luKENvbnRleHRJRCwgTlVMTCk7Cit9CisKKworLy8gUmV0dXJucyB0aGUgbWVtb3J5IG1hbmFnZXIgcGx1Zy1pbiwgaWYgYW55LCBmcm9tIHRoZSBQbHVnLWluIGJ1bmRsZQorc3RhdGljCitjbXNQbHVnaW5NZW1IYW5kbGVyKiBfY21zRmluZE1lbW9yeVBsdWdpbih2b2lkKiBQbHVnaW5CdW5kbGUpCit7CisgICAgY21zUGx1Z2luQmFzZSogUGx1Z2luOworCisgICAgZm9yIChQbHVnaW4gPSAoY21zUGx1Z2luQmFzZSopIFBsdWdpbkJ1bmRsZTsKKyAgICAgICAgUGx1Z2luICE9IE5VTEw7CisgICAgICAgIFBsdWdpbiA9IFBsdWdpbiAtPiBOZXh0KSB7CisKKyAgICAgICAgICAgIGlmIChQbHVnaW4gLT4gTWFnaWMgPT0gY21zUGx1Z2luTWFnaWNOdW1iZXIgJiYgCisgICAgICAgICAgICAgICAgUGx1Z2luIC0+IEV4cGVjdGVkVmVyc2lvbiA8PSBMQ01TX1ZFUlNJT04gJiYgCisgICAgICAgICAgICAgICAgUGx1Z2luIC0+IFR5cGUgPT0gY21zUGx1Z2luTWVtSGFuZGxlclNpZykgeworCisgICAgICAgICAgICAgICAgICAgIC8vIEZvdW5kIQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNtc1BsdWdpbk1lbUhhbmRsZXIqKSBQbHVnaW47ICAKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBOb3BlLCByZXZlcnQgdG8gZGVmYXVsdHMgCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworLy8gQ3JlYXRlcyBhIG5ldyBjb250ZXh0IHdpdGggb3B0aW9uYWwgYXNzb2NpYXRlZCBwbHVnLWlucy4gQ2FsbGVyIG1heSBhbHNvIHNwZWNpZnkgYW4gb3B0aW9uYWwgcG9pbnRlciB0byB1c2VyLWRlZmluZWQgCisvLyBkYXRhIHRoYXQgd2lsbCBiZSBmb3J3YXJkZWQgdG8gcGx1Zy1pbnMgYW5kIGxvZ2dlci4KK2Ntc0NvbnRleHQgQ01TRVhQT1JUIGNtc0NyZWF0ZUNvbnRleHQodm9pZCogUGx1Z2luLCB2b2lkKiBVc2VyRGF0YSkKK3sKKyAgICBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHg7CisgICAgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCAgZmFrZUNvbnRleHQ7CisgICAgICAgIAorICAgIF9jbXNJbnN0YWxsQWxsb2NGdW5jdGlvbnMoX2Ntc0ZpbmRNZW1vcnlQbHVnaW4oUGx1Z2luKSwgJmZha2VDb250ZXh0LkRlZmF1bHRNZW1vcnlNYW5hZ2VyKTsKKyAgICAKKyAgICBmYWtlQ29udGV4dC5jaHVua3NbVXNlclB0cl0gICAgID0gVXNlckRhdGE7CisgICAgZmFrZUNvbnRleHQuY2h1bmtzW01lbVBsdWdpbl0gICA9ICZmYWtlQ29udGV4dC5EZWZhdWx0TWVtb3J5TWFuYWdlcjsKKworICAgIC8vIENyZWF0ZSB0aGUgY29udGV4dCBzdHJ1Y3R1cmUuCisgICAgY3R4ID0gKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqKSBfY21zTWFsbG9jKCZmYWtlQ29udGV4dCwgc2l6ZW9mKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QpKTsKKyAgICBpZiAoY3R4ID09IE5VTEwpICAgCisgICAgICAgIHJldHVybiBOVUxMOyAgICAgLy8gU29tZXRoaW5nIHZlcnkgd3JvbmcgaGFwcGVuZWQhCisKKyAgICAvLyBJbml0IHRoZSBzdHJ1Y3R1cmUgYW5kIHRoZSBtZW1vcnkgbWFuYWdlcgorICAgIG1lbXNldChjdHgsIDAsIHNpemVvZihzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KSk7CisKKyAgICAvLyBLZWVwIG1lbW9yeSBtYW5hZ2VyCisgICAgbWVtY3B5KCZjdHgtPkRlZmF1bHRNZW1vcnlNYW5hZ2VyLCAmZmFrZUNvbnRleHQuRGVmYXVsdE1lbW9yeU1hbmFnZXIsIHNpemVvZihfY21zTWVtUGx1Z2luQ2h1bmspKTsgCisgICAKKyAgICAvLyBNYWludGFpbiB0aGUgbGlua2VkIGxpc3QgKHdpdGggcHJvcGVyIGxvY2tpbmcpCisgICAgX2Ntc0VudGVyQ3JpdGljYWxTZWN0aW9uUHJpbWl0aXZlKCZfY21zQ29udGV4dFBvb2xIZWFkTXV0ZXgpOworICAgICAgIGN0eCAtPk5leHQgPSBfY21zQ29udGV4dFBvb2xIZWFkOworICAgICAgIF9jbXNDb250ZXh0UG9vbEhlYWQgPSBjdHg7CisgICAgX2Ntc0xlYXZlQ3JpdGljYWxTZWN0aW9uUHJpbWl0aXZlKCZfY21zQ29udGV4dFBvb2xIZWFkTXV0ZXgpOworCisgICAgY3R4IC0+Y2h1bmtzW1VzZXJQdHJdICAgICA9IFVzZXJEYXRhOworICAgIGN0eCAtPmNodW5rc1tNZW1QbHVnaW5dICAgPSAmY3R4LT5EZWZhdWx0TWVtb3J5TWFuYWdlcjsKKyAgIAorICAgIC8vIE5vdyB3ZSBjYW4gYWxsb2NhdGUgdGhlIHBvb2wgYnkgdXNpbmcgZGVmYXVsdCBtZW1vcnkgbWFuYWdlcgorICAgIGN0eCAtPk1lbVBvb2wgPSBfY21zQ3JlYXRlU3ViQWxsb2MoY3R4LCAyMiAqIHNpemVvZih2b2lkKikpOyAgLy8gZGVmYXVsdCBzaXplIGFib3V0IDMyIHBvaW50ZXJzCisgICAgaWYgKGN0eCAtPk1lbVBvb2wgPT0gTlVMTCkgeworCisgICAgICAgICBjbXNEZWxldGVDb250ZXh0KGN0eCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIF9jbXNBbGxvY0xvZ0Vycm9yQ2h1bmsoY3R4LCBOVUxMKTsKKyAgICBfY21zQWxsb2NBbGFybUNvZGVzQ2h1bmsoY3R4LCBOVUxMKTsKKyAgICBfY21zQWxsb2NBZGFwdGF0aW9uU3RhdGVDaHVuayhjdHgsIE5VTEwpOworICAgIF9jbXNBbGxvY01lbVBsdWdpbkNodW5rKGN0eCwgTlVMTCk7CisgICAgX2Ntc0FsbG9jSW50ZXJwUGx1Z2luQ2h1bmsoY3R4LCBOVUxMKTsKKyAgICBfY21zQWxsb2NDdXJ2ZXNQbHVnaW5DaHVuayhjdHgsIE5VTEwpOworICAgIF9jbXNBbGxvY0Zvcm1hdHRlcnNQbHVnaW5DaHVuayhjdHgsIE5VTEwpOworICAgIF9jbXNBbGxvY1RhZ1R5cGVQbHVnaW5DaHVuayhjdHgsIE5VTEwpOworICAgIF9jbXNBbGxvY01QRVR5cGVQbHVnaW5DaHVuayhjdHgsIE5VTEwpOworICAgIF9jbXNBbGxvY1RhZ1BsdWdpbkNodW5rKGN0eCwgTlVMTCk7CisgICAgX2Ntc0FsbG9jSW50ZW50c1BsdWdpbkNodW5rKGN0eCwgTlVMTCk7CisgICAgX2Ntc0FsbG9jT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmsoY3R4LCBOVUxMKTsKKyAgICBfY21zQWxsb2NUcmFuc2Zvcm1QbHVnaW5DaHVuayhjdHgsIE5VTEwpOworICAgIF9jbXNBbGxvY011dGV4UGx1Z2luQ2h1bmsoY3R4LCBOVUxMKTsKKworICAgIC8vIFNldHVwIHRoZSBwbHVnLWlucworICAgIGlmICghY21zUGx1Z2luVEhSKGN0eCwgUGx1Z2luKSkgeworICAgIAorICAgICAgICBjbXNEZWxldGVDb250ZXh0KGN0eCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiAoY21zQ29udGV4dCkgY3R4OyAgCit9CisKKy8vIER1cGxpY2F0ZXMgYSBjb250ZXh0IHdpdGggYWxsIGFzc29jaWF0ZWQgcGx1Zy1pbnMuIAorLy8gQ2FsbGVyIG1heSBzcGVjaWZ5IGFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gdXNlci1kZWZpbmVkIAorLy8gZGF0YSB0aGF0IHdpbGwgYmUgZm9yd2FyZGVkIHRvIHBsdWctaW5zIGFuZCBsb2dnZXIuIAorY21zQ29udGV4dCBDTVNFWFBPUlQgY21zRHVwQ29udGV4dChjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogTmV3VXNlckRhdGEpCit7CisgICAgaW50IGk7CisgICAgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4OworICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyA9IF9jbXNHZXRDb250ZXh0KENvbnRleHRJRCk7CisKKyAgICB2b2lkKiB1c2VyRGF0YSA9IChOZXdVc2VyRGF0YSAhPSBOVUxMKSA/IE5ld1VzZXJEYXRhIDogc3JjIC0+IGNodW5rc1tVc2VyUHRyXTsKKyAgICAKKyAgICAKKyAgICBjdHggPSAoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCopIF9jbXNNYWxsb2MoQ29udGV4dElELCBzaXplb2Yoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCkpOworICAgIGlmIChjdHggPT0gTlVMTCkgICAKKyAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAvLyBTb21ldGhpbmcgdmVyeSB3cm9uZyBoYXBwZW5lZAorCisgICAgLy8gU2V0dXAgZGVmYXVsdCBtZW1vcnkgYWxsb2NhdG9ycworICAgIG1lbWNweSgmY3R4LT5EZWZhdWx0TWVtb3J5TWFuYWdlciwgJnNyYy0+RGVmYXVsdE1lbW9yeU1hbmFnZXIsIHNpemVvZihjdHgtPkRlZmF1bHRNZW1vcnlNYW5hZ2VyKSk7CisKKyAgICAvLyBNYWludGFpbiB0aGUgbGlua2VkIGxpc3QKKyAgICBfY21zRW50ZXJDcml0aWNhbFNlY3Rpb25QcmltaXRpdmUoJl9jbXNDb250ZXh0UG9vbEhlYWRNdXRleCk7CisgICAgICAgY3R4IC0+TmV4dCA9IF9jbXNDb250ZXh0UG9vbEhlYWQ7CisgICAgICAgX2Ntc0NvbnRleHRQb29sSGVhZCA9IGN0eDsKKyAgICBfY21zTGVhdmVDcml0aWNhbFNlY3Rpb25QcmltaXRpdmUoJl9jbXNDb250ZXh0UG9vbEhlYWRNdXRleCk7CisKKyAgICBjdHggLT5jaHVua3NbVXNlclB0cl0gICAgPSB1c2VyRGF0YTsKKyAgICBjdHggLT5jaHVua3NbTWVtUGx1Z2luXSAgPSAmY3R4LT5EZWZhdWx0TWVtb3J5TWFuYWdlcjsKKworICAgIGN0eCAtPk1lbVBvb2wgPSBfY21zQ3JlYXRlU3ViQWxsb2MoY3R4LCAyMiAqIHNpemVvZih2b2lkKikpOworICAgIGlmIChjdHggLT5NZW1Qb29sID09IE5VTEwpIHsKKworICAgICAgICAgY21zRGVsZXRlQ29udGV4dChjdHgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZSBhbGwgcmVxdWlyZWQgY2h1bmtzLgorICAgIF9jbXNBbGxvY0xvZ0Vycm9yQ2h1bmsoY3R4LCBzcmMpOworICAgIF9jbXNBbGxvY0FsYXJtQ29kZXNDaHVuayhjdHgsIHNyYyk7CisgICAgX2Ntc0FsbG9jQWRhcHRhdGlvblN0YXRlQ2h1bmsoY3R4LCBzcmMpOworICAgIF9jbXNBbGxvY01lbVBsdWdpbkNodW5rKGN0eCwgc3JjKTsKKyAgICBfY21zQWxsb2NJbnRlcnBQbHVnaW5DaHVuayhjdHgsIHNyYyk7CisgICAgX2Ntc0FsbG9jQ3VydmVzUGx1Z2luQ2h1bmsoY3R4LCBzcmMpOworICAgIF9jbXNBbGxvY0Zvcm1hdHRlcnNQbHVnaW5DaHVuayhjdHgsIHNyYyk7CisgICAgX2Ntc0FsbG9jVGFnVHlwZVBsdWdpbkNodW5rKGN0eCwgc3JjKTsKKyAgICBfY21zQWxsb2NNUEVUeXBlUGx1Z2luQ2h1bmsoY3R4LCBzcmMpOworICAgIF9jbXNBbGxvY1RhZ1BsdWdpbkNodW5rKGN0eCwgc3JjKTsKKyAgICBfY21zQWxsb2NJbnRlbnRzUGx1Z2luQ2h1bmsoY3R4LCBzcmMpOworICAgIF9jbXNBbGxvY09wdGltaXphdGlvblBsdWdpbkNodW5rKGN0eCwgc3JjKTsKKyAgICBfY21zQWxsb2NUcmFuc2Zvcm1QbHVnaW5DaHVuayhjdHgsIHNyYyk7CisgICAgX2Ntc0FsbG9jTXV0ZXhQbHVnaW5DaHVuayhjdHgsIHNyYyk7CisKKyAgICAvLyBNYWtlIHN1cmUgbm8gb25lIGZhaWxlZAorICAgIGZvciAoaT1Mb2dnZXI7IGkgPCBNZW1vcnlDbGllbnRNYXg7IGkrKykgeworCisgICAgICAgIGlmIChzcmMgLT5jaHVua3NbaV0gPT0gTlVMTCkgeworICAgICAgICAgICAgY21zRGVsZXRlQ29udGV4dCgoY21zQ29udGV4dCkgY3R4KTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIChjbXNDb250ZXh0KSBjdHg7Cit9CisKKworLyoKK3N0YXRpYworc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogRmluZFByZXYoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogaWQpCit7CisgICAgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogcHJldjsKKworICAgIC8vIFNlYXJjaCBmb3IgcHJldmlvdXMKKyAgICBmb3IgKHByZXYgPSBfY21zQ29udGV4dFBvb2xIZWFkOyAKKyAgICAgICAgICAgICBwcmV2ICE9IE5VTEw7CisgICAgICAgICAgICAgcHJldiA9IHByZXYgLT5OZXh0KQorICAgIHsKKyAgICAgICAgaWYgKHByZXYgLT5OZXh0ID09IGlkKQorICAgICAgICAgICAgcmV0dXJuIHByZXY7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7ICAvLyBMaXN0IGlzIGVtcHR5IG9yIG9ubHkgb25lIGVsZW1lbnQhCit9CisqLworCisvLyBGcmVlcyBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dCwgCisvLyBhbmQgZGVzdHJveXMgdGhlIGNvbnRleHQgcGxhY2Vob2xkZXIuIAorLy8gVGhlIENvbnRleHRJRCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgaW4gYW55IFRIUiBvcGVyYXRpb24uICAKK3ZvaWQgQ01TRVhQT1JUIGNtc0RlbGV0ZUNvbnRleHQoY21zQ29udGV4dCBDb250ZXh0SUQpCit7CisgICAgaWYgKENvbnRleHRJRCAhPSBOVUxMKSB7CisKKyAgICAgICAgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4ID0gKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqKSBDb250ZXh0SUQ7ICAgICAgICAgICAgICAKKyAgICAgICAgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCAgZmFrZUNvbnRleHQ7ICAKKyAgICAgICAgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogcHJldjsKKworICAgICAgICBtZW1jcHkoJmZha2VDb250ZXh0LkRlZmF1bHRNZW1vcnlNYW5hZ2VyLCAmY3R4LT5EZWZhdWx0TWVtb3J5TWFuYWdlciwgc2l6ZW9mKGN0eC0+RGVmYXVsdE1lbW9yeU1hbmFnZXIpKTsKKworICAgICAgICBmYWtlQ29udGV4dC5jaHVua3NbVXNlclB0cl0gICAgID0gY3R4IC0+Y2h1bmtzW1VzZXJQdHJdOworICAgICAgICBmYWtlQ29udGV4dC5jaHVua3NbTWVtUGx1Z2luXSAgID0gJmZha2VDb250ZXh0LkRlZmF1bHRNZW1vcnlNYW5hZ2VyOworCisgICAgICAgIC8vIEdldCByaWQgb2YgcGx1Z2lucworICAgICAgICBjbXNVbnJlZ2lzdGVyUGx1Z2luc1RIUihDb250ZXh0SUQpOyAKKworICAgICAgICAvLyBTaW5jZSBhbGwgbWVtb3J5IGlzIGFsbG9jYXRlZCBpbiB0aGUgcHJpdmF0ZSBwb29sLCBhbGwgd2hhdCB3ZSBuZWVkIHRvIGRvIGlzIGRlc3Ryb3kgdGhlIHBvb2wKKyAgICAgICAgaWYgKGN0eCAtPiBNZW1Qb29sICE9IE5VTEwpCisgICAgICAgICAgICAgIF9jbXNTdWJBbGxvY0Rlc3Ryb3koY3R4IC0+TWVtUG9vbCk7CisgICAgICAgIGN0eCAtPiBNZW1Qb29sID0gTlVMTDsKKworICAgICAgICAvLyBNYWludGFpbiBsaXN0CisgICAgICAgIF9jbXNFbnRlckNyaXRpY2FsU2VjdGlvblByaW1pdGl2ZSgmX2Ntc0NvbnRleHRQb29sSGVhZE11dGV4KTsKKyAgICAgICAgaWYgKF9jbXNDb250ZXh0UG9vbEhlYWQgPT0gY3R4KSB7IAorCisgICAgICAgICAgICBfY21zQ29udGV4dFBvb2xIZWFkID0gY3R4LT5OZXh0OworICAgICAgICB9CisgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAvLyBTZWFyY2ggZm9yIHByZXZpb3VzCisgICAgICAgICAgICBmb3IgKHByZXYgPSBfY21zQ29udGV4dFBvb2xIZWFkOyAKKyAgICAgICAgICAgICAgICAgcHJldiAhPSBOVUxMOworICAgICAgICAgICAgICAgICBwcmV2ID0gcHJldiAtPk5leHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHByZXYgLT4gTmV4dCA9PSBjdHgpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJldiAtPiBOZXh0ID0gY3R4IC0+TmV4dDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9jbXNMZWF2ZUNyaXRpY2FsU2VjdGlvblByaW1pdGl2ZSgmX2Ntc0NvbnRleHRQb29sSGVhZE11dGV4KTsKKworICAgICAgICAvLyBmcmVlIHRoZSBtZW1vcnkgYmxvY2sgaXRzZWxmCisgICAgICAgIF9jbXNGcmVlKCZmYWtlQ29udGV4dCwgY3R4KTsKKyAgICB9Cit9CisKKy8vIFJldHVybnMgdGhlIHVzZXIgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBDb250ZXh0SUQsIG9yIE5VTEwgaWYgbm8gdXNlciBkYXRhIHdhcyBhdHRhY2hlZCBvbiBjb250ZXh0IGNyZWF0aW9uCit2b2lkKiBDTVNFWFBPUlQgY21zR2V0Q29udGV4dFVzZXJEYXRhKGNtc0NvbnRleHQgQ29udGV4dElEKQoreworICAgIHJldHVybiBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgVXNlclB0cik7Cit9CisKKwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zcHMyLmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNwczIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjM1ZWFmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zcHMyLmMKQEAgLTAsMCArMSwxNTk4IEBACisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KKy8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNiBNYXJ0aSBNYXJpYSBTYWd1ZXIKKy8vCisvLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKy8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKy8vIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKy8vIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorLy8gYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlCisvLyBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorLy8KKy8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisvLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKy8vCisvLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKy8vIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTworLy8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKy8vIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKKy8vIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKy8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisKKyNpbmNsdWRlICJsY21zMl9pbnRlcm5hbC5oIgorCisvLyBQb3N0U2NyaXB0IENvbG9yUmVuZGVyaW5nRGljdGlvbmFyeSBhbmQgQ29sb3JTcGFjZUFycmF5CisKKworI2RlZmluZSBNQVhQU0NPTFMgICA2MCAgICAgIC8vIENvbHVtbnMgb24gdGFibGVzCisKKy8qCisgICAgSW1wbGVtZW50YXRpb24KKyAgICAtLS0tLS0tLS0tLS0tLQorCisgIFBvc3RTY3JpcHQgZG9lcyB1c2UgWFlaIGFzIGl0cyBpbnRlcm5hbCBQQ1MuIEJ1dCBzaW5jZSBQb3N0U2NyaXB0CisgIGludGVycG9sYXRpb24gdGFibGVzIGFyZSBsaW1pdGVkIHRvIDggYml0cywgSSB1c2UgTGFiIGFzIGEgd2F5IHRvCisgIGltcHJvdmUgdGhlIGFjY3VyYWN5LCBmYXZvcmluZyBwZXJjZXB0dWFsIHJlc3VsdHMuIFNvLCBmb3IgdGhlIGNyZWF0aW9uCisgIG9mIGVhY2ggQ1JELCBDU0EgdGhlIHByb2ZpbGVzIGFyZSBjb252ZXJ0ZWQgdG8gTGFiIHZpYSBhIGRldmljZQorICBsaW5rIGJldHdlZW4gIHByb2ZpbGUgLT4gTGFiIG9yIExhYiAtPiBwcm9maWxlLiBUaGUgUFMgY29kZSBuZWNlc3NhcnkgdG8KKyAgY29udmVydCBMYWIgPC0+IFhZWiBpcyBhbHNvIGluY2x1ZGVkLgorCisKKworICBDb2xvciBTcGFjZSBBcnJheXMgKENTQSkKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIEluIG9yZGVyIHRvIG9idGFpbiBwcmVjaXNpb24sIGNvZGUgY2hvb3NlcyBiZXR3ZWVuIHRocmVlIHdheXMgdG8gaW1wbGVtZW50CisgIHRoZSBkZXZpY2UgLT4gWFlaIHRyYW5zZm9ybS4gVGhlc2UgY2FzZXMgaWRlbnRpZmllcyBtb25vY2hyb21lIHByb2ZpbGVzIChvZnRlbgorICBpbXBsZW1lbnRlZCBhcyBhIHNldCBvZiBjdXJ2ZXMpLCBtYXRyaXgtc2hhcGVyIGFuZCBQaXBlbGluZS1iYXNlZC4KKworICBNb25vY2hyb21lCisgIC0tLS0tLS0tLS0tCisKKyAgVGhpcyBpcyBpbXBsZW1lbnRlZCBhcyAvQ0lFQmFzZWRBIENTQS4gVGhlIHByZWxpbmVhcml6YXRpb24gY3VydmUgaXMKKyAgcGxhY2VkIGludG8gL0RlY29kZUEgc2VjdGlvbiwgYW5kIG1hdHJpeCBlcXVhbHMgdG8gRDUwLiBTaW5jZSBoZXJlIGlzCisgIG5vIGludGVycG9sYXRpb24gdGFibGVzLCBJIGRvIHRoZSBjb252ZXJzaW9uIGRpcmVjdGx5IHRvIFhZWgorCisgIE5PVEU6IENMVVQtYmFzZWQgbW9ub2Nocm9tZSBwcm9maWxlcyBhcmUgTk9UIHN1cHBvcnRlZC4gU28sIGNtc0ZMQUdTX01BVFJJWElOUFVUCisgIGZsYWcgaXMgZm9yY2VkIG9uIHN1Y2ggcHJvZmlsZXMuCisKKyAgICBbIC9DSUVCYXNlZEEKKyAgICAgIDw8CisgICAgICAgICAgICAvRGVjb2RlQSB7IHRyYW5zZmVyIGZ1bmN0aW9uIH0gYmluZAorICAgICAgICAgICAgL01hdHJpeEEgW0Q1MF0KKyAgICAgICAgICAgIC9SYW5nZUxNTiBbIDAuMCBjbXNENTBYIDAuMCBjbXNENTBZIDAuMCBjbXNENTBaIF0KKyAgICAgICAgICAgIC9XaGl0ZVBvaW50IFtENTBdCisgICAgICAgICAgICAvQmxhY2tQb2ludCBbQlBdCisgICAgICAgICAgICAvUmVuZGVyaW5nSW50ZW50IChpbnRlbnQpCisgICAgICA+PgorICAgIF0KKworICAgT24gc2ltcGxlciBwcm9maWxlcywgdGhlIFBDUyBpcyBhbHJlYWR5IFhZWiwgc28gbm8gY29udmVyc2lvbiBpcyByZXF1aXJlZC4KKworCisgICBNYXRyaXgtc2hhcGVyIGJhc2VkCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFRoaXMgaXMgaW1wbGVtZW50ZWQgYm90aCB3aXRoIC9DSUVCYXNlZEFCQyBvciAvQ0lFQmFzZWRERUYgb24gZGVwZW5kaWcKKyAgIG9mIHByb2ZpbGUgaW1wbGVtZW50YXRpb24uIFNpbmNlIGhlcmUgdGhlcmUgYXJlIG5vIGludGVycG9sYXRpb24gdGFibGVzLCBJIGRvCisgICB0aGUgY29udmVyc2lvbiBkaXJlY3RseSB0byBYWVoKKworCisKKyAgICBbIC9DSUVCYXNlZEFCQworICAgICAgICAgICAgPDwKKyAgICAgICAgICAgICAgICAvRGVjb2RlQUJDIFsge3RyYW5zZmVyMX0ge3RyYW5zZmVyMn0ge3RyYW5zZmVyM30gXQorICAgICAgICAgICAgICAgIC9NYXRyaXhBQkMgW01hdHJpeF0KKyAgICAgICAgICAgICAgICAvUmFuZ2VMTU4gWyAwLjAgY21zRDUwWCAwLjAgY21zRDUwWSAwLjAgY21zRDUwWiBdCisgICAgICAgICAgICAgICAgL0RlY29kZUxNTiBbIHsgLyAyfSBkdXAgZHVwIF0KKyAgICAgICAgICAgICAgICAvV2hpdGVQb2ludCBbRDUwXQorICAgICAgICAgICAgICAgIC9CbGFja1BvaW50IFtCUF0KKyAgICAgICAgICAgICAgICAvUmVuZGVyaW5nSW50ZW50IChpbnRlbnQpCisgICAgICAgICAgICA+PgorICAgIF0KKworCisgICAgQ0xVVCBiYXNlZAorICAgIC0tLS0tLS0tLS0KKworICAgICBMYWIgaXMgdXNlZCBpbiBzdWNoIGNhc2VzLgorCisgICAgWyAvQ0lFQmFzZWRERUYKKyAgICAgICAgICAgIDw8CisgICAgICAgICAgICAvRGVjb2RlREVGIFsgPHByZWxpbmVhcml6YXRpb24+IF0KKyAgICAgICAgICAgIC9UYWJsZSBbIHAgcCBwIFs8Li4uPl1dCisgICAgICAgICAgICAvUmFuZ2VBQkMgWyAwIDEgMCAxIDAgMV0KKyAgICAgICAgICAgIC9EZWNvZGVBQkNbIDxwb3N0bGluZWFyaXphdGlvbj4gXQorICAgICAgICAgICAgL1JhbmdlTE1OIFsgLTAuMjM2IDEuMjU0IDAgMSAtMC42MzUgMS42NDAgXQorICAgICAgICAgICAgICAgJSAtMTI4LzUwMCAxKzEyNy81MDAgMCAxICAtMTI3LzIwMCAxKzEyOC8yMDAKKyAgICAgICAgICAgIC9NYXRyaXhBQkMgWyAxIDEgMSAxIDAgMCAwIDAgLTFdCisgICAgICAgICAgICAvV2hpdGVQb2ludCBbRDUwXQorICAgICAgICAgICAgL0JsYWNrUG9pbnQgW0JQXQorICAgICAgICAgICAgL1JlbmRlcmluZ0ludGVudCAoaW50ZW50KQorICAgIF0KKworCisgIENvbG9yIFJlbmRlcmluZyBEaWN0aW9uYXJpZXMgKENSRCkKKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICBUaGVzZSBhcmUgYWx3YXlzIGltcGxlbWVudGVkIGFzIENMVVQsIGFuZCBhbHdheXMgYXJlIHVzaW5nIExhYi4gU2luY2UgQ1JEIGFyZSBleHBlY3RlZCB0bworICBiZSB1c2VkIGFzIHJlc291cmNlcywgdGhlIGNvZGUgYWRkcyB0aGUgZGVmaW5pdGlvbiBhcyB3ZWxsLgorCisgIDw8CisgICAgL0NvbG9yUmVuZGVyaW5nVHlwZSAxCisgICAgL1doaXRlUG9pbnQgWyBENTAgXQorICAgIC9CbGFja1BvaW50IFtCUF0KKyAgICAvTWF0cml4UFFSIFsgQnJhZGZvcmQgXQorICAgIC9SYW5nZVBRUiBbLTAuMTI1IDEuMzc1IC0wLjEyNSAxLjM3NSAtMC4xMjUgMS4zNzUgXQorICAgIC9UcmFuc2Zvcm1QUVIgWworICAgIHs0IGluZGV4IDMgZ2V0IGRpdiAyIGluZGV4IDMgZ2V0IG11bCBleGNoIHBvcCBleGNoIHBvcCBleGNoIHBvcCBleGNoIHBvcCB9IGJpbmQKKyAgICB7NCBpbmRleCA0IGdldCBkaXYgMiBpbmRleCA0IGdldCBtdWwgZXhjaCBwb3AgZXhjaCBwb3AgZXhjaCBwb3AgZXhjaCBwb3AgfSBiaW5kCisgICAgezQgaW5kZXggNSBnZXQgZGl2IDIgaW5kZXggNSBnZXQgbXVsIGV4Y2ggcG9wIGV4Y2ggcG9wIGV4Y2ggcG9wIGV4Y2ggcG9wIH0gYmluZAorICAgIF0KKyAgICAvTWF0cml4QUJDIDwuLi4+CisgICAgL0VuY29kZUFCQyA8Li4uPgorICAgIC9SYW5nZUFCQyAgPC4uIHVzZWQgZm9yICBYWVogLT4gTGFiPgorICAgIC9FbmNvZGVMTU4KKyAgICAvUmVuZGVyVGFibGUgWyBwIHAgcCBbPC4uLj5dXQorCisgICAgL1JlbmRlcmluZ0ludGVudCAoUGVyY2VwdHVhbCkKKyAgPj4KKyAgL0N1cnJlbnQgZXhjaCAvQ29sb3JSZW5kZXJpbmcgZGVmaW5lcmVzb3VyY2UgcG9wCisKKworICBUaGUgZm9sbG93aW5nIHN0YWdlcyBhcmUgdXNlZCB0byBjb252ZXJ0IGZyb20gWFlaIHRvIExhYgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIElucHV0IGlzIGdpdmVuIGF0IExNTiBzdGFnZSBvbiBYLCBZLCBaCisKKyAgRW5jb2RlIExNTiBnaXZlcyB1cyBmKFgvWG4pLCBmKFkvWW4pLCBmKFovWm4pCisKKyAgL0VuY29kZUxNTiBbCisKKyAgICB7IDAuOTY0MjAwICBkaXYgZHVwIDAuMDA4ODU2IGxlIHs3Ljc4NyBtdWwgMTYgMTE2IGRpdiBhZGR9ezEgMyBkaXYgZXhwfSBpZmVsc2UgfSBiaW5kCisgICAgeyAxLjAwMDAwMCAgZGl2IGR1cCAwLjAwODg1NiBsZSB7Ny43ODcgbXVsIDE2IDExNiBkaXYgYWRkfXsxIDMgZGl2IGV4cH0gaWZlbHNlIH0gYmluZAorICAgIHsgMC44MjQ5MDAgIGRpdiBkdXAgMC4wMDg4NTYgbGUgezcuNzg3IG11bCAxNiAxMTYgZGl2IGFkZH17MSAzIGRpdiBleHB9IGlmZWxzZSB9IGJpbmQKKworICAgIF0KKworCisgIE1hdHJpeEFCQyBpcyB1c2VkIHRvIGNvbXB1dGUgZihZL1luKSwgZihYL1huKSAtIGYoWS9ZbiksIGYoWS9ZbikgLSBmKFovWm4pCisKKyAgfCAwICAxICAwfAorICB8IDEgLTEgIDB8CisgIHwgMCAgMSAtMXwKKworICAvTWF0cml4QUJDIFsgMCAxIDAgMSAtMSAxIDAgMCAtMSBdCisKKyBFbmNvZGVBQkMgZmluYWxseSBnaXZlcyBMYWIgdmFsdWVzLgorCisgIC9FbmNvZGVBQkMgWworICAgIHsgMTE2IG11bCAgMTYgc3ViIDEwMCBkaXYgIH0gYmluZAorICAgIHsgNTAwIG11bCAxMjggYWRkIDI1NSBkaXYgIH0gYmluZAorICAgIHsgMjAwIG11bCAxMjggYWRkIDI1NSBkaXYgIH0gYmluZAorICAgIF0KKworICBUaGUgZm9sbG93aW5nIHN0YWdlcyBhcmUgdXNlZCB0byBjb252ZXJ0IExhYiB0byBYWVoKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgL1JhbmdlQUJDIFsgMCAxIDAgMSAwIDFdCisgICAgL0RlY29kZUFCQyBbIHsgMTAwIG11bCAxNiBhZGQgMTE2IGRpdiB9IGJpbmQKKyAgICAgICAgICAgICAgICAgeyAyNTUgbXVsIDEyOCBzdWIgNTAwIGRpdiB9IGJpbmQKKyAgICAgICAgICAgICAgICAgeyAyNTUgbXVsIDEyOCBzdWIgMjAwIGRpdiB9IGJpbmQKKyAgICAgICAgICAgICAgIF0KKworICAgIC9NYXRyaXhBQkMgWyAxIDEgMSAxIDAgMCAwIDAgLTFdCisgICAgL0RlY29kZUxNTiBbCisgICAgICAgICAgICAgICAge2R1cCA2IDI5IGRpdiBnZSB7ZHVwIGR1cCBtdWwgbXVsfSB7NCAyOSBkaXYgc3ViIDEwOCA4NDEgZGl2IG11bH0gaWZlbHNlIDAuOTY0MjAwIG11bH0gYmluZAorICAgICAgICAgICAgICAgIHtkdXAgNiAyOSBkaXYgZ2Uge2R1cCBkdXAgbXVsIG11bH0gezQgMjkgZGl2IHN1YiAxMDggODQxIGRpdiBtdWx9IGlmZWxzZSB9IGJpbmQKKyAgICAgICAgICAgICAgICB7ZHVwIDYgMjkgZGl2IGdlIHtkdXAgZHVwIG11bCBtdWx9IHs0IDI5IGRpdiBzdWIgMTA4IDg0MSBkaXYgbXVsfSBpZmVsc2UgMC44MjQ5MDAgbXVsfSBiaW5kCisgICAgICAgICAgICAgICAgXQorCisKKyovCisKKy8qCisKKyBQb3N0U2NyaXB0IGFsZ29yaXRobXMgZGlzY3Vzc2lvbi4KKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAxRCBpbnRlcnBvbGF0aW9uIGFsZ29yaXRobQorCisKKyAgMUQgaW50ZXJwb2xhdGlvbiAoZmxvYXQpCisgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgdmFsMiA9IERvbWFpbiAqIFZhbHVlOworCisgICAgY2VsbDAgPSAoaW50KSBmbG9vcih2YWwyKTsKKyAgICBjZWxsMSA9IChpbnQpIGNlaWwodmFsMik7CisKKyAgICByZXN0ID0gdmFsMiAtIGNlbGwwOworCisgICAgeTAgPSBMdXRUYWJsZVtjZWxsMF0gOworICAgIHkxID0gTHV0VGFibGVbY2VsbDFdIDsKKworICAgIHkgPSB5MCArICh5MSAtIHkwKSAqIHJlc3Q7CisKKworCisgIFBvc3RTY3JpcHQgY29kZSAgICAgICAgICAgICAgICAgICBTdGFjaworICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSB2CisgICAgPGNoZWNrIDAuLjEuMD4KKyAgICBbYXJyYXldICAgICAgICAgICAgICAgICAgICAgICAgICUgdiB0YWIKKyAgICBkdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgdiB0YWIgdGFiCisgICAgbGVuZ3RoIDEgc3ViICAgICAgICAgICAgICAgICAgICAlIHYgdGFiIGRvbQorCisgICAgMyAtMSByb2xsICAgICAgICAgICAgICAgICAgICAgICAlIHRhYiBkb20gdgorCisgICAgbXVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHRhYiB2YWwyCisgICAgZHVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHRhYiB2YWwyIHZhbDIKKyAgICBkdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgdGFiIHZhbDIgdmFsMiB2YWwyCisgICAgZmxvb3IgY3ZpICAgICAgICAgICAgICAgICAgICAgICAlIHRhYiB2YWwyIHZhbDIgY2VsbDAKKyAgICBleGNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgdGFiIHZhbDIgY2VsbDAgdmFsMgorICAgIGNlaWxpbmcgY3ZpICAgICAgICAgICAgICAgICAgICAgJSB0YWIgdmFsMiBjZWxsMCBjZWxsMQorCisgICAgMyBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAlIHRhYiB2YWwyIGNlbGwwIGNlbGwxIHRhYgorICAgIGV4Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgJSB0YWIgdmFsMiBjZWxsMCB0YWIgY2VsbDEKKyAgICBnZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgdGFiIHZhbDIgY2VsbDAgeTEKKworICAgIDQgLTEgcm9sbCAgICAgICAgICAgICAgICAgICAgICAgJSB2YWwyIGNlbGwwIHkxIHRhYgorICAgIDMgLTEgcm9sbCAgICAgICAgICAgICAgICAgICAgICAgJSB2YWwyIHkxIHRhYiBjZWxsMAorICAgIGdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSB2YWwyIHkxIHkwCisKKyAgICBkdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgdmFsMiB5MSB5MCB5MAorICAgIDMgMSByb2xsICAgICAgICAgICAgICAgICAgICAgICAgJSB2YWwyIHkwIHkxIHkwCisKKyAgICBzdWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgdmFsMiB5MCAoeTEteTApCisgICAgMyAtMSByb2xsICAgICAgICAgICAgICAgICAgICAgICAlIHkwICh5MS15MCkgdmFsMgorICAgIGR1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSB5MCAoeTEteTApIHZhbDIgdmFsMgorICAgIGZsb29yIGN2aSAgICAgICAgICAgICAgICAgICAgICAgJSB5MCAoeTEteTApIHZhbDIgZmxvb3IodmFsMikKKyAgICBzdWIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgeTAgKHkxLXkwKSByZXN0CisgICAgbXVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHkwIHQxCisgICAgYWRkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHkKKyAgICA2NTUzNSBkaXYgICAgICAgICAgICAgICAgICAgICAgICUgcmVzdWx0CisKKyAgfSBiaW5kCisKKworKi8KKworCisvLyBUaGlzIHN0cnVjdCBob2xkcyB0aGUgbWVtb3J5IGJsb2NrIGN1cnJlbnRseSBiZWluZyB3cml0ZQordHlwZWRlZiBzdHJ1Y3QgeworICAgIF9jbXNTdGFnZUNMdXREYXRhKiBQaXBlbGluZTsKKyAgICBjbXNJT0hBTkRMRVIqIG07CisKKyAgICBpbnQgRmlyc3RDb21wb25lbnQ7CisgICAgaW50IFNlY29uZENvbXBvbmVudDsKKworICAgIGNvbnN0IGNoYXIqIFByZU1hajsKKyAgICBjb25zdCBjaGFyKiBQb3N0TWFqOworICAgIGNvbnN0IGNoYXIqIFByZU1pbjsKKyAgICBjb25zdCBjaGFyKiBQb3N0TWluOworCisgICAgaW50ICBGaXhXaGl0ZTsgICAgLy8gRm9yY2UgbWFwcGluZyBvZiBwdXJlIHdoaXRlCisKKyAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlICBDb2xvclNwYWNlOyAgLy8gQ29sb3JTcGFjZSBvZiBwcm9maWxlCisKKworfSBjbXNQc1NhbXBsZXJDYXJnbzsKKworc3RhdGljIGludCBfY21zUFNBY3R1YWxDb2x1bW4gPSAwOworCisKKy8vIENvbnZlcnQgdG8gYnl0ZQorc3RhdGljCitjbXNVSW50OE51bWJlciBXb3JkMkJ5dGUoY21zVUludDE2TnVtYmVyIHcpCit7CisgICAgcmV0dXJuIChjbXNVSW50OE51bWJlcikgZmxvb3IoKGNtc0Zsb2F0NjROdW1iZXIpIHcgLyAyNTcuMCArIDAuNSk7Cit9CisKKworLy8gQ29udmVydCB0byBieXRlICh1c2luZyBJQ0MyIG5vdGF0aW9uKQorLyoKK3N0YXRpYworY21zVUludDhOdW1iZXIgTDJCeXRlKGNtc1VJbnQxNk51bWJlciB3KQoreworICAgIGludCB3dyA9IHcgKyAweDAwODA7CisKKyAgICBpZiAod3cgPiAweEZGRkYpIHJldHVybiAweEZGOworCisgICAgcmV0dXJuIChjbXNVSW50OE51bWJlcikgKChjbXNVSW50MTZOdW1iZXIpICh3dyA+PiA4KSAmIDB4RkYpOworfQorKi8KKworLy8gV3JpdGUgYSBjb29rZWQgYnl0ZQorCitzdGF0aWMKK3ZvaWQgV3JpdGVCeXRlKGNtc0lPSEFORExFUiogbSwgY21zVUludDhOdW1iZXIgYikKK3sKKyAgICBfY21zSU9QcmludGYobSwgIiUwMngiLCBiKTsKKyAgICBfY21zUFNBY3R1YWxDb2x1bW4gKz0gMjsKKworICAgIGlmIChfY21zUFNBY3R1YWxDb2x1bW4gPiBNQVhQU0NPTFMpIHsKKworICAgICAgICBfY21zSU9QcmludGYobSwgIlxuIik7CisgICAgICAgIF9jbXNQU0FjdHVhbENvbHVtbiA9IDA7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQb3N0U2NyaXB0IGdlbmVyYXRpb24KKworCisvLyBSZW1vdmVzIG9mZmVuZGluZyBDYXJyaWFnZSByZXR1cm5zCitzdGF0aWMKK2NoYXIqIFJlbW92ZUNSKGNvbnN0IGNoYXIqIHR4dCkKK3sKKyAgICBzdGF0aWMgY2hhciBCdWZmZXJbMjA0OF07CisgICAgY2hhciogcHQ7CisKKyAgICBzdHJuY3B5KEJ1ZmZlciwgdHh0LCAyMDQ3KTsKKyAgICBCdWZmZXJbMjA0N10gPSAwOworICAgIGZvciAocHQgPSBCdWZmZXI7ICpwdDsgcHQrKykKKyAgICAgICAgICAgIGlmICgqcHQgPT0gJ1xuJyB8fCAqcHQgPT0gJ1xyJykgKnB0ID0gJyAnOworCisgICAgcmV0dXJuIEJ1ZmZlcjsKKworfQorCitzdGF0aWMKK3ZvaWQgRW1pdEhlYWRlcihjbXNJT0hBTkRMRVIqIG0sIGNvbnN0IGNoYXIqIFRpdGxlLCBjbXNIUFJPRklMRSBoUHJvZmlsZSkKK3sKKyAgICB0aW1lX3QgdGltZXI7CisgICAgY21zTUxVICpEZXNjcmlwdGlvbiwgKkNvcHlyaWdodDsKKyAgICBjaGFyIERlc2NBU0NJSVsyNTZdLCBDb3B5cmlnaHRBU0NJSVsyNTZdOworCisgICAgdGltZSgmdGltZXIpOworCisgICAgRGVzY3JpcHRpb24gPSAoY21zTUxVKikgY21zUmVhZFRhZyhoUHJvZmlsZSwgY21zU2lnUHJvZmlsZURlc2NyaXB0aW9uVGFnKTsKKyAgICBDb3B5cmlnaHQgICA9IChjbXNNTFUqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCBjbXNTaWdDb3B5cmlnaHRUYWcpOworCisgICAgRGVzY0FTQ0lJWzBdID0gRGVzY0FTQ0lJWzI1NV0gPSAwOworICAgIENvcHlyaWdodEFTQ0lJWzBdID0gQ29weXJpZ2h0QVNDSUlbMjU1XSA9IDA7CisKKyAgICBpZiAoRGVzY3JpcHRpb24gIT0gTlVMTCkgY21zTUxVZ2V0QVNDSUkoRGVzY3JpcHRpb24sICBjbXNOb0xhbmd1YWdlLCBjbXNOb0NvdW50cnksIERlc2NBU0NJSSwgICAgICAgMjU1KTsKKyAgICBpZiAoQ29weXJpZ2h0ICE9IE5VTEwpICAgY21zTUxVZ2V0QVNDSUkoQ29weXJpZ2h0LCAgICBjbXNOb0xhbmd1YWdlLCBjbXNOb0NvdW50cnksIENvcHlyaWdodEFTQ0lJLCAgMjU1KTsKKworICAgIF9jbXNJT1ByaW50ZihtLCAiJSUhUFMtQWRvYmUtMy4wXG4iKTsKKyAgICBfY21zSU9QcmludGYobSwgIiUlXG4iKTsKKyAgICBfY21zSU9QcmludGYobSwgIiUlICVzXG4iLCBUaXRsZSk7CisgICAgX2Ntc0lPUHJpbnRmKG0sICIlJSBTb3VyY2U6ICVzXG4iLCBSZW1vdmVDUihEZXNjQVNDSUkpKTsKKyAgICBfY21zSU9QcmludGYobSwgIiUlICAgICAgICAgJXNcbiIsIFJlbW92ZUNSKENvcHlyaWdodEFTQ0lJKSk7CisgICAgX2Ntc0lPUHJpbnRmKG0sICIlJSBDcmVhdGVkOiAlcyIsIGN0aW1lKCZ0aW1lcikpOyAvLyBjdGltZSBhcHBlbmRzIGEgXG4hISEKKyAgICBfY21zSU9QcmludGYobSwgIiUlXG4iKTsKKyAgICBfY21zSU9QcmludGYobSwgIiUlJSVCZWdpblJlc291cmNlXG4iKTsKKworfQorCisKKy8vIEVtaXRzIFdoaXRlICYgQmxhY2sgcG9pbnQuIFdoaXRlIHBvaW50IGlzIGFsd2F5cyBENTAsIEJsYWNrIHBvaW50IGlzIHRoZSBkZXZpY2UKKy8vIEJsYWNrIHBvaW50IGFkYXB0ZWQgdG8gRDUwLgorCitzdGF0aWMKK3ZvaWQgRW1pdFdoaXRlQmxhY2tENTAoY21zSU9IQU5ETEVSKiBtLCBjbXNDSUVYWVoqIEJsYWNrUG9pbnQpCit7CisKKyAgICBfY21zSU9QcmludGYobSwgIi9CbGFja1BvaW50IFslZiAlZiAlZl1cbiIsIEJsYWNrUG9pbnQgLT4gWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsYWNrUG9pbnQgLT4gWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsYWNrUG9pbnQgLT4gWik7CisKKyAgICBfY21zSU9QcmludGYobSwgIi9XaGl0ZVBvaW50IFslZiAlZiAlZl1cbiIsIGNtc0Q1MF9YWVooKS0+WCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Q1MF9YWVooKS0+WSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Q1MF9YWVooKS0+Wik7Cit9CisKKworc3RhdGljCit2b2lkIEVtaXRSYW5nZUNoZWNrKGNtc0lPSEFORExFUiogbSkKK3sKKyAgICBfY21zSU9QcmludGYobSwgImR1cCAwLjAgbHQgeyBwb3AgMC4wIH0gaWYgIgorICAgICAgICAgICAgICAgICAgICAiZHVwIDEuMCBndCB7IHBvcCAxLjAgfSBpZiAiKTsKKworfQorCisvLyBEb2VzIHdyaXRlIHRoZSBpbnRlbnQKKworc3RhdGljCit2b2lkIEVtaXRJbnRlbnQoY21zSU9IQU5ETEVSKiBtLCBpbnQgUmVuZGVyaW5nSW50ZW50KQoreworICAgIGNvbnN0IGNoYXIgKmludGVudDsKKworICAgIHN3aXRjaCAoUmVuZGVyaW5nSW50ZW50KSB7CisKKyAgICAgICAgY2FzZSBJTlRFTlRfUEVSQ0VQVFVBTDogICAgICAgICAgICBpbnRlbnQgPSAiUGVyY2VwdHVhbCI7IGJyZWFrOworICAgICAgICBjYXNlIElOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUM6IGludGVudCA9ICJSZWxhdGl2ZUNvbG9yaW1ldHJpYyI7IGJyZWFrOworICAgICAgICBjYXNlIElOVEVOVF9BQlNPTFVURV9DT0xPUklNRVRSSUM6IGludGVudCA9ICJBYnNvbHV0ZUNvbG9yaW1ldHJpYyI7IGJyZWFrOworICAgICAgICBjYXNlIElOVEVOVF9TQVRVUkFUSU9OOiAgICAgICAgICAgIGludGVudCA9ICJTYXR1cmF0aW9uIjsgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDogaW50ZW50ID0gIlVuZGVmaW5lZCI7IGJyZWFrOworICAgIH0KKworICAgIF9jbXNJT1ByaW50ZihtLCAiL1JlbmRlcmluZ0ludGVudCAoJXMpXG4iLCBpbnRlbnQgKTsKK30KKworLy8KKy8vICBDb252ZXJ0IEwqIHRvIFkKKy8vCisvLyAgICAgIFkgPSBZbipbIChMKiArIDE2KSAvIDExNl0gXiAzICAgaWYgKEwqKSA+PSA2IC8gMjkKKy8vICAgICAgICA9IFluKiggTCogLyAxMTYpIC8gNy43ODcgICAgICBpZiAoTCopIDwgNiAvIDI5CisvLworCisvKgorc3RhdGljCit2b2lkIEVtaXRMMlkoY21zSU9IQU5ETEVSKiBtKQoreworICAgIF9jbXNJT1ByaW50ZihtLAorICAgICAgICAgICAgInsgIgorICAgICAgICAgICAgICAgICIxMDAgbXVsIDE2IGFkZCAxMTYgZGl2ICIgICAgICAgICAgICAgICAvLyAoTCAqIDEwMCArIDE2KSAvIDExNgorICAgICAgICAgICAgICAgICAiZHVwIDYgMjkgZGl2IGdlICIgICAgICAgICAgICAgICAgICAgICAvLyA+PSA2IC8gMjkgPworICAgICAgICAgICAgICAgICAieyBkdXAgZHVwIG11bCBtdWwgfSAiICAgICAgICAgICAgICAgICAvLyB5ZXMsIF4zIGFuZCBkb25lCisgICAgICAgICAgICAgICAgICJ7IDQgMjkgZGl2IHN1YiAxMDggODQxIGRpdiBtdWwgfSAiICAgIC8vIG5vLCBzbG9wZSBsaW1pdGluZworICAgICAgICAgICAgImlmZWxzZSB9IGJpbmQgIik7Cit9CisqLworCisKKy8vIExhYiAtPiBYWVosIHNlZSB0aGUgZGlzY3Vzc2lvbiBhYm92ZQorCitzdGF0aWMKK3ZvaWQgRW1pdExhYjJYWVooY21zSU9IQU5ETEVSKiBtKQoreworICAgIF9jbXNJT1ByaW50ZihtLCAiL1JhbmdlQUJDIFsgMCAxIDAgMSAwIDFdXG4iKTsKKyAgICBfY21zSU9QcmludGYobSwgIi9EZWNvZGVBQkMgW1xuIik7CisgICAgX2Ntc0lPUHJpbnRmKG0sICJ7MTAwIG11bCAgMTYgYWRkIDExNiBkaXYgfSBiaW5kXG4iKTsKKyAgICBfY21zSU9QcmludGYobSwgInsyNTUgbXVsIDEyOCBzdWIgNTAwIGRpdiB9IGJpbmRcbiIpOworICAgIF9jbXNJT1ByaW50ZihtLCAiezI1NSBtdWwgMTI4IHN1YiAyMDAgZGl2IH0gYmluZFxuIik7CisgICAgX2Ntc0lPUHJpbnRmKG0sICJdXG4iKTsKKyAgICBfY21zSU9QcmludGYobSwgIi9NYXRyaXhBQkMgWyAxIDEgMSAxIDAgMCAwIDAgLTFdXG4iKTsKKyAgICBfY21zSU9QcmludGYobSwgIi9SYW5nZUxNTiBbIC0wLjIzNiAxLjI1NCAwIDEgLTAuNjM1IDEuNjQwIF1cbiIpOworICAgIF9jbXNJT1ByaW50ZihtLCAiL0RlY29kZUxNTiBbXG4iKTsKKyAgICBfY21zSU9QcmludGYobSwgIntkdXAgNiAyOSBkaXYgZ2Uge2R1cCBkdXAgbXVsIG11bH0gezQgMjkgZGl2IHN1YiAxMDggODQxIGRpdiBtdWx9IGlmZWxzZSAwLjk2NDIwMCBtdWx9IGJpbmRcbiIpOworICAgIF9jbXNJT1ByaW50ZihtLCAie2R1cCA2IDI5IGRpdiBnZSB7ZHVwIGR1cCBtdWwgbXVsfSB7NCAyOSBkaXYgc3ViIDEwOCA4NDEgZGl2IG11bH0gaWZlbHNlIH0gYmluZFxuIik7CisgICAgX2Ntc0lPUHJpbnRmKG0sICJ7ZHVwIDYgMjkgZGl2IGdlIHtkdXAgZHVwIG11bCBtdWx9IHs0IDI5IGRpdiBzdWIgMTA4IDg0MSBkaXYgbXVsfSBpZmVsc2UgMC44MjQ5MDAgbXVsfSBiaW5kXG4iKTsKKyAgICBfY21zSU9QcmludGYobSwgIl1cbiIpOworfQorCisKKworLy8gT3V0cHV0cyBhIHRhYmxlIG9mIHdvcmRzLiBJdCBkb2VzIHVzZSAxNiBiaXRzCisKK3N0YXRpYwordm9pZCBFbWl0MUdhbW1hKGNtc0lPSEFORExFUiogbSwgY21zVG9uZUN1cnZlKiBUYWJsZSkKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgaTsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIGdhbW1hOworCisgICAgaWYgKFRhYmxlID09IE5VTEwpIHJldHVybjsgLy8gRXJyb3IKKworICAgIGlmIChUYWJsZSAtPm5FbnRyaWVzIDw9IDApIHJldHVybjsgIC8vIEVtcHR5IHRhYmxlCisKKyAgICAvLyBTdXBwcmVzcyB3aG9sZSBpZiBpZGVudGl0eQorICAgIGlmIChjbXNJc1RvbmVDdXJ2ZUxpbmVhcihUYWJsZSkpIHJldHVybjsKKworICAgIC8vIENoZWNrIGlmIGlzIHJlYWxseSBhbiBleHBvbmVudGlhbC4gSWYgc28sIGVtaXQgImV4cCIKKyAgICBnYW1tYSA9IGNtc0VzdGltYXRlR2FtbWEoVGFibGUsIDAuMDAxKTsKKyAgICAgaWYgKGdhbW1hID4gMCkgeworICAgICAgICAgICAgX2Ntc0lPUHJpbnRmKG0sICJ7ICVnIGV4cCB9IGJpbmQgIiwgZ2FtbWEpOworICAgICAgICAgICAgcmV0dXJuOworICAgICB9CisKKyAgICBfY21zSU9QcmludGYobSwgInsgIik7CisKKyAgICAvLyBCb3VuZHMgY2hlY2sKKyAgICBFbWl0UmFuZ2VDaGVjayhtKTsKKworICAgIC8vIEVtaXQgaW50ZXBvbGF0aW9uIGNvZGUKKworICAgIC8vIFBvc3RTY3JpcHQgY29kZSAgICAgICAgICAgICAgICAgICAgICBTdGFjaworICAgIC8vID09PT09PT09PT09PT09PSAgICAgICAgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdgorICAgIF9jbXNJT1ByaW50ZihtLCAiIFsiKTsKKworICAgIGZvciAoaT0wOyBpIDwgVGFibGUtPm5FbnRyaWVzOyBpKyspIHsKKyAgICAgICAgX2Ntc0lPUHJpbnRmKG0sICIlZCAiLCBUYWJsZS0+VGFibGUxNltpXSk7CisgICAgfQorCisgICAgX2Ntc0lPUHJpbnRmKG0sICJdICIpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHYgdGFiCisKKyAgICBfY21zSU9QcmludGYobSwgImR1cCAiKTsgICAgICAgICAgICAgICAgICAgICAgLy8gdiB0YWIgdGFiCisgICAgX2Ntc0lPUHJpbnRmKG0sICJsZW5ndGggMSBzdWIgIik7ICAgICAgICAgICAgIC8vIHYgdGFiIGRvbQorICAgIF9jbXNJT1ByaW50ZihtLCAiMyAtMSByb2xsICIpOyAgICAgICAgICAgICAgICAvLyB0YWIgZG9tIHYKKyAgICBfY21zSU9QcmludGYobSwgIm11bCAiKTsgICAgICAgICAgICAgICAgICAgICAgLy8gdGFiIHZhbDIKKyAgICBfY21zSU9QcmludGYobSwgImR1cCAiKTsgICAgICAgICAgICAgICAgICAgICAgLy8gdGFiIHZhbDIgdmFsMgorICAgIF9jbXNJT1ByaW50ZihtLCAiZHVwICIpOyAgICAgICAgICAgICAgICAgICAgICAvLyB0YWIgdmFsMiB2YWwyIHZhbDIKKyAgICBfY21zSU9QcmludGYobSwgImZsb29yIGN2aSAiKTsgICAgICAgICAgICAgICAgLy8gdGFiIHZhbDIgdmFsMiBjZWxsMAorICAgIF9jbXNJT1ByaW50ZihtLCAiZXhjaCAiKTsgICAgICAgICAgICAgICAgICAgICAvLyB0YWIgdmFsMiBjZWxsMCB2YWwyCisgICAgX2Ntc0lPUHJpbnRmKG0sICJjZWlsaW5nIGN2aSAiKTsgICAgICAgICAgICAgIC8vIHRhYiB2YWwyIGNlbGwwIGNlbGwxCisgICAgX2Ntc0lPUHJpbnRmKG0sICIzIGluZGV4ICIpOyAgICAgICAgICAgICAgICAgIC8vIHRhYiB2YWwyIGNlbGwwIGNlbGwxIHRhYgorICAgIF9jbXNJT1ByaW50ZihtLCAiZXhjaCAiKTsgICAgICAgICAgICAgICAgICAgICAvLyB0YWIgdmFsMiBjZWxsMCB0YWIgY2VsbDEKKyAgICBfY21zSU9QcmludGYobSwgImdldCAiKTsgICAgICAgICAgICAgICAgICAgICAgLy8gdGFiIHZhbDIgY2VsbDAgeTEKKyAgICBfY21zSU9QcmludGYobSwgIjQgLTEgcm9sbCAiKTsgICAgICAgICAgICAgICAgLy8gdmFsMiBjZWxsMCB5MSB0YWIKKyAgICBfY21zSU9QcmludGYobSwgIjMgLTEgcm9sbCAiKTsgICAgICAgICAgICAgICAgLy8gdmFsMiB5MSB0YWIgY2VsbDAKKyAgICBfY21zSU9QcmludGYobSwgImdldCAiKTsgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsMiB5MSB5MAorICAgIF9jbXNJT1ByaW50ZihtLCAiZHVwICIpOyAgICAgICAgICAgICAgICAgICAgICAvLyB2YWwyIHkxIHkwIHkwCisgICAgX2Ntc0lPUHJpbnRmKG0sICIzIDEgcm9sbCAiKTsgICAgICAgICAgICAgICAgIC8vIHZhbDIgeTAgeTEgeTAKKyAgICBfY21zSU9QcmludGYobSwgInN1YiAiKTsgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsMiB5MCAoeTEteTApCisgICAgX2Ntc0lPUHJpbnRmKG0sICIzIC0xIHJvbGwgIik7ICAgICAgICAgICAgICAgIC8vIHkwICh5MS15MCkgdmFsMgorICAgIF9jbXNJT1ByaW50ZihtLCAiZHVwICIpOyAgICAgICAgICAgICAgICAgICAgICAvLyB5MCAoeTEteTApIHZhbDIgdmFsMgorICAgIF9jbXNJT1ByaW50ZihtLCAiZmxvb3IgY3ZpICIpOyAgICAgICAgICAgICAgICAvLyB5MCAoeTEteTApIHZhbDIgZmxvb3IodmFsMikKKyAgICBfY21zSU9QcmludGYobSwgInN1YiAiKTsgICAgICAgICAgICAgICAgICAgICAgLy8geTAgKHkxLXkwKSByZXN0CisgICAgX2Ntc0lPUHJpbnRmKG0sICJtdWwgIik7ICAgICAgICAgICAgICAgICAgICAgIC8vIHkwIHQxCisgICAgX2Ntc0lPUHJpbnRmKG0sICJhZGQgIik7ICAgICAgICAgICAgICAgICAgICAgIC8vIHkKKyAgICBfY21zSU9QcmludGYobSwgIjY1NTM1IGRpdiAiKTsgICAgICAgICAgICAgICAgLy8gcmVzdWx0CisKKyAgICBfY21zSU9QcmludGYobSwgIiB9IGJpbmQgIik7Cit9CisKKworLy8gQ29tcGFyZSBnYW1tYSB0YWJsZQorCitzdGF0aWMKK2Ntc0Jvb2wgR2FtbWFUYWJsZUVxdWFscyhjbXNVSW50MTZOdW1iZXIqIGcxLCBjbXNVSW50MTZOdW1iZXIqIGcyLCBpbnQgbkVudHJpZXMpCit7CisgICAgcmV0dXJuIG1lbWNtcChnMSwgZzIsIG5FbnRyaWVzKiBzaXplb2YoY21zVUludDE2TnVtYmVyKSkgPT0gMDsKK30KKworCisvLyBEb2VzIHdyaXRlIGEgc2V0IG9mIGdhbW1hIGN1cnZlcworCitzdGF0aWMKK3ZvaWQgRW1pdE5HYW1tYShjbXNJT0hBTkRMRVIqIG0sIGludCBuLCBjbXNUb25lQ3VydmUqIGdbXSkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciggaT0wOyBpIDwgbjsgaSsrICkKKyAgICB7CisgICAgICAgIGlmIChnW2ldID09IE5VTEwpIHJldHVybjsgLy8gRXJyb3IKKworICAgICAgICBpZiAoaSA+IDAgJiYgR2FtbWFUYWJsZUVxdWFscyhnW2ktMV0tPlRhYmxlMTYsIGdbaV0tPlRhYmxlMTYsIGdbaV0tPm5FbnRyaWVzKSkgeworCisgICAgICAgICAgICBfY21zSU9QcmludGYobSwgImR1cCAiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEVtaXQxR2FtbWEobSwgZ1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKK30KKworCisKKworCisvLyBGb2xsb3dpbmcgY29kZSBkdW1wcyBhIExVVCBvbnRvIG1lbW9yeSBzdHJlYW0KKworCisvLyBUaGlzIGlzIHRoZSBzYW1wbGVyLiBJbnRlbmRlZCB0byB3b3JrIGluIFNBTVBMRVJfSU5TUEVDVCBtb2RlLAorLy8gdGhhdCBpcywgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIGtub3Qgd2l0aAorLy8KKy8vICAgICAgICAgIEluW10gIFRoZSBncmlkIGxvY2F0aW9uIGNvb3JkaW5hdGVzLCBub3JtYWxpemVkIHRvIDAuLmZmZmYKKy8vICAgICAgICAgIE91dFtdIFRoZSBQaXBlbGluZSB2YWx1ZXMsIG5vcm1hbGl6ZWQgdG8gMC4uZmZmZgorLy8KKy8vICBSZXR1cm5pbmcgYSB2YWx1ZSBvdGhlciB0aGFuIDAgZG9lcyB0ZXJtaW5hdGUgdGhlIHNhbXBsaW5nIHByb2Nlc3MKKy8vCisvLyAgRWFjaCByb3cgY29udGFpbnMgUGlwZWxpbmUgdmFsdWVzIGZvciBhbGwgYnV0IGZpcnN0IGNvbXBvbmVudC4gU28sIEkKKy8vICBkZXRlY3Qgcm93IGNoYW5naW5nIGJ5IGtlZXBpbmcgYSBjb3B5IG9mIGxhc3QgdmFsdWUgb2YgZmlyc3QKKy8vICBjb21wb25lbnQuIC0xIGlzIHVzZWQgdG8gbWFyayBiZWdpbm5pbmcgb2Ygd2hvbGUgYmxvY2suCisKK3N0YXRpYworaW50IE91dHB1dFZhbHVlU2FtcGxlcihyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5bXSwgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIE91dFtdLCByZWdpc3RlciB2b2lkKiBDYXJnbykKK3sKKyAgICBjbXNQc1NhbXBsZXJDYXJnbyogc2MgPSAoY21zUHNTYW1wbGVyQ2FyZ28qKSBDYXJnbzsKKyAgICBjbXNVSW50MzJOdW1iZXIgaTsKKworCisgICAgaWYgKHNjIC0+IEZpeFdoaXRlKSB7CisKKyAgICAgICAgaWYgKEluWzBdID09IDB4RkZGRikgeyAgLy8gT25seSBpbiBMKiA9IDEwMCwgYWIgPSBbLTguLjhdCisKKyAgICAgICAgICAgIGlmICgoSW5bMV0gPj0gMHg3ODAwICYmIEluWzFdIDw9IDB4ODgwMCkgJiYKKyAgICAgICAgICAgICAgICAoSW5bMl0gPj0gMHg3ODAwICYmIEluWzJdIDw9IDB4ODgwMCkpIHsKKworICAgICAgICAgICAgICAgIGNtc1VJbnQxNk51bWJlciogQmxhY2s7CisgICAgICAgICAgICAgICAgY21zVUludDE2TnVtYmVyKiBXaGl0ZTsKKyAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgbk91dHB1dHM7CisKKyAgICAgICAgICAgICAgICBpZiAoIV9jbXNFbmRQb2ludHNCeVNwYWNlKHNjIC0+Q29sb3JTcGFjZSwgJldoaXRlLCAmQmxhY2ssICZuT3V0cHV0cykpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgbk91dHB1dHM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIE91dFtpXSA9IFdoaXRlW2ldOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gSGFkbGUgdGhlIHBhcmVudGhlc2lzIG9uIHJvd3MKKworICAgIGlmIChJblswXSAhPSBzYyAtPkZpcnN0Q29tcG9uZW50KSB7CisKKyAgICAgICAgICAgIGlmIChzYyAtPkZpcnN0Q29tcG9uZW50ICE9IC0xKSB7CisKKyAgICAgICAgICAgICAgICAgICAgX2Ntc0lPUHJpbnRmKHNjIC0+bSwgc2MgLT5Qb3N0TWluKTsKKyAgICAgICAgICAgICAgICAgICAgc2MgLT5TZWNvbmRDb21wb25lbnQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgX2Ntc0lPUHJpbnRmKHNjIC0+bSwgc2MgLT5Qb3N0TWFqKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQmVnaW4gYmxvY2sKKyAgICAgICAgICAgIF9jbXNQU0FjdHVhbENvbHVtbiA9IDA7CisKKyAgICAgICAgICAgIF9jbXNJT1ByaW50ZihzYyAtPm0sIHNjIC0+UHJlTWFqKTsKKyAgICAgICAgICAgIHNjIC0+Rmlyc3RDb21wb25lbnQgPSBJblswXTsKKyAgICB9CisKKworICAgICAgaWYgKEluWzFdICE9IHNjIC0+U2Vjb25kQ29tcG9uZW50KSB7CisKKyAgICAgICAgICAgIGlmIChzYyAtPlNlY29uZENvbXBvbmVudCAhPSAtMSkgeworCisgICAgICAgICAgICAgICAgICAgIF9jbXNJT1ByaW50ZihzYyAtPm0sIHNjIC0+UG9zdE1pbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9jbXNJT1ByaW50ZihzYyAtPm0sIHNjIC0+UHJlTWluKTsKKyAgICAgICAgICAgIHNjIC0+U2Vjb25kQ29tcG9uZW50ID0gSW5bMV07CisgICAgfQorCisgICAgICAvLyBEdW1wIHRhYmxlLgorCisgICAgICBmb3IgKGk9MDsgaSA8IHNjIC0+IFBpcGVsaW5lIC0+UGFyYW1zLT5uT3V0cHV0czsgaSsrKSB7CisKKyAgICAgICAgICBjbXNVSW50MTZOdW1iZXIgd1dvcmRPdXQgPSBPdXRbaV07CisgICAgICAgICAgY21zVUludDhOdW1iZXIgd0J5dGVPdXQ7ICAgICAgICAgICAvLyBWYWx1ZSBhcyBieXRlCisKKworICAgICAgICAgIC8vIFdlIGFsd2F5cyBkZWFsIHdpdGggTGFiNAorCisgICAgICAgICAgd0J5dGVPdXQgPSBXb3JkMkJ5dGUod1dvcmRPdXQpOworICAgICAgICAgIFdyaXRlQnl0ZShzYyAtPiBtLCB3Qnl0ZU91dCk7CisgICAgICB9CisKKyAgICAgIHJldHVybiAxOworfQorCisvLyBXcml0ZXMgYSBQaXBlbGluZSBvbiBtZW1zdHJlYW0uIENvdWxkIGJlIDggb3IgMTYgYml0cyBiYXNlZAorCitzdGF0aWMKK3ZvaWQgV3JpdGVDTFVUKGNtc0lPSEFORExFUiogbSwgY21zU3RhZ2UqIG1wZSwgY29uc3QgY2hhciogUHJlTWFqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogUG9zdE1haiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIFByZU1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIFBvc3RNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRml4V2hpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2UpCit7CisgICAgY21zVUludDMyTnVtYmVyIGk7CisgICAgY21zUHNTYW1wbGVyQ2FyZ28gc2M7CisKKyAgICBzYy5GaXJzdENvbXBvbmVudCA9IC0xOworICAgIHNjLlNlY29uZENvbXBvbmVudCA9IC0xOworICAgIHNjLlBpcGVsaW5lID0gKF9jbXNTdGFnZUNMdXREYXRhICopIG1wZSAtPkRhdGE7CisgICAgc2MubSAgID0gbTsKKyAgICBzYy5QcmVNYWogPSBQcmVNYWo7CisgICAgc2MuUG9zdE1haj0gUG9zdE1hajsKKworICAgIHNjLlByZU1pbiAgID0gUHJlTWluOworICAgIHNjLlBvc3RNaW4gID0gUG9zdE1pbjsKKyAgICBzYy5GaXhXaGl0ZSA9IEZpeFdoaXRlOworICAgIHNjLkNvbG9yU3BhY2UgPSBDb2xvclNwYWNlOworCisgICAgX2Ntc0lPUHJpbnRmKG0sICJbIik7CisKKyAgICBmb3IgKGk9MDsgaSA8IHNjLlBpcGVsaW5lLT5QYXJhbXMtPm5JbnB1dHM7IGkrKykKKyAgICAgICAgX2Ntc0lPUHJpbnRmKG0sICIgJWQgIiwgc2MuUGlwZWxpbmUtPlBhcmFtcy0+blNhbXBsZXNbaV0pOworCisgICAgX2Ntc0lPUHJpbnRmKG0sICIgW1xuIik7CisKKyAgICBjbXNTdGFnZVNhbXBsZUNMdXQxNmJpdChtcGUsIE91dHB1dFZhbHVlU2FtcGxlciwgKHZvaWQqKSAmc2MsIFNBTVBMRVJfSU5TUEVDVCk7CisKKyAgICBfY21zSU9QcmludGYobSwgUG9zdE1pbik7CisgICAgX2Ntc0lPUHJpbnRmKG0sIFBvc3RNYWopOworICAgIF9jbXNJT1ByaW50ZihtLCAiXSAiKTsKKworfQorCisKKy8vIER1bXBzIENJRUJhc2VkQSBDb2xvciBTcGFjZSBBcnJheQorCitzdGF0aWMKK2ludCBFbWl0Q0lFQmFzZWRBKGNtc0lPSEFORExFUiogbSwgY21zVG9uZUN1cnZlKiBDdXJ2ZSwgY21zQ0lFWFlaKiBCbGFja1BvaW50KQoreworCisgICAgX2Ntc0lPUHJpbnRmKG0sICJbIC9DSUVCYXNlZEFcbiIpOworICAgIF9jbXNJT1ByaW50ZihtLCAiICA8PFxuIik7CisKKyAgICBfY21zSU9QcmludGYobSwgIi9EZWNvZGVBICIpOworCisgICAgRW1pdDFHYW1tYShtLCBDdXJ2ZSk7CisKKyAgICBfY21zSU9QcmludGYobSwgIiBcbiIpOworCisgICAgX2Ntc0lPUHJpbnRmKG0sICIvTWF0cml4QSBbIDAuOTY0MiAxLjAwMDAgMC44MjQ5IF1cbiIpOworICAgIF9jbXNJT1ByaW50ZihtLCAiL1JhbmdlTE1OIFsgMC4wIDAuOTY0MiAwLjAgMS4wMDAwIDAuMCAwLjgyNDkgXVxuIik7CisKKyAgICBFbWl0V2hpdGVCbGFja0Q1MChtLCBCbGFja1BvaW50KTsKKyAgICBFbWl0SW50ZW50KG0sIElOVEVOVF9QRVJDRVBUVUFMKTsKKworICAgIF9jbXNJT1ByaW50ZihtLCAiPj5cbiIpOworICAgIF9jbXNJT1ByaW50ZihtLCAiXVxuIik7CisKKyAgICByZXR1cm4gMTsKK30KKworCisvLyBEdW1wcyBDSUVCYXNlZEFCQyBDb2xvciBTcGFjZSBBcnJheQorCitzdGF0aWMKK2ludCBFbWl0Q0lFQmFzZWRBQkMoY21zSU9IQU5ETEVSKiBtLCBjbXNGbG9hdDY0TnVtYmVyKiBNYXRyaXgsIGNtc1RvbmVDdXJ2ZSoqIEN1cnZlU2V0LCBjbXNDSUVYWVoqIEJsYWNrUG9pbnQpCit7CisgICAgaW50IGk7CisKKyAgICBfY21zSU9QcmludGYobSwgIlsgL0NJRUJhc2VkQUJDXG4iKTsKKyAgICBfY21zSU9QcmludGYobSwgIjw8XG4iKTsKKyAgICBfY21zSU9QcmludGYobSwgIi9EZWNvZGVBQkMgWyAiKTsKKworICAgIEVtaXROR2FtbWEobSwgMywgQ3VydmVTZXQpOworCisgICAgX2Ntc0lPUHJpbnRmKG0sICJdXG4iKTsKKworICAgIF9jbXNJT1ByaW50ZihtLCAiL01hdHJpeEFCQyBbICIgKTsKKworICAgIGZvciggaT0wOyBpIDwgMzsgaSsrICkgeworCisgICAgICAgIF9jbXNJT1ByaW50ZihtLCAiJS42ZiAlLjZmICUuNmYgIiwgTWF0cml4W2kgKyAzKjBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdHJpeFtpICsgMyoxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRyaXhbaSArIDMqMl0pOworICAgIH0KKworCisgICAgX2Ntc0lPUHJpbnRmKG0sICJdXG4iKTsKKworICAgIF9jbXNJT1ByaW50ZihtLCAiL1JhbmdlTE1OIFsgMC4wIDAuOTY0MiAwLjAgMS4wMDAwIDAuMCAwLjgyNDkgXVxuIik7CisKKyAgICBFbWl0V2hpdGVCbGFja0Q1MChtLCBCbGFja1BvaW50KTsKKyAgICBFbWl0SW50ZW50KG0sIElOVEVOVF9QRVJDRVBUVUFMKTsKKworICAgIF9jbXNJT1ByaW50ZihtLCAiPj5cbiIpOworICAgIF9jbXNJT1ByaW50ZihtLCAiXVxuIik7CisKKworICAgIHJldHVybiAxOworfQorCisKK3N0YXRpYworaW50IEVtaXRDSUVCYXNlZERFRihjbXNJT0hBTkRMRVIqIG0sIGNtc1BpcGVsaW5lKiBQaXBlbGluZSwgaW50IEludGVudCwgY21zQ0lFWFlaKiBCbGFja1BvaW50KQoreworICAgIGNvbnN0IGNoYXIqIFByZU1hajsKKyAgICBjb25zdCBjaGFyKiBQb3N0TWFqOworICAgIGNvbnN0IGNoYXIqIFByZU1pbiwgKlBvc3RNaW47CisgICAgY21zU3RhZ2UqIG1wZTsKKworICAgIG1wZSA9IFBpcGVsaW5lIC0+RWxlbWVudHM7CisKKyAgICBzd2l0Y2ggKGNtc1N0YWdlSW5wdXRDaGFubmVscyhtcGUpKSB7CisgICAgY2FzZSAzOgorCisgICAgICAgICAgICBfY21zSU9QcmludGYobSwgIlsgL0NJRUJhc2VkREVGXG4iKTsKKyAgICAgICAgICAgIFByZU1haiA9IjwiOworICAgICAgICAgICAgUG9zdE1haj0gIj5cbiI7CisgICAgICAgICAgICBQcmVNaW4gPSBQb3N0TWluID0gIiI7CisgICAgICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgICAgICBfY21zSU9QcmludGYobSwgIlsgL0NJRUJhc2VkREVGR1xuIik7CisgICAgICAgICAgICBQcmVNYWogPSAiWyI7CisgICAgICAgICAgICBQb3N0TWFqID0gIl1cbiI7CisgICAgICAgICAgICBQcmVNaW4gPSAiPCI7CisgICAgICAgICAgICBQb3N0TWluID0gIj5cbiI7CisgICAgICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICB9CisKKyAgICBfY21zSU9QcmludGYobSwgIjw8XG4iKTsKKworICAgIGlmIChjbXNTdGFnZVR5cGUobXBlKSA9PSBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlKSB7CisKKyAgICAgICAgX2Ntc0lPUHJpbnRmKG0sICIvRGVjb2RlREVGIFsgIik7CisgICAgICAgIEVtaXROR2FtbWEobSwgY21zU3RhZ2VPdXRwdXRDaGFubmVscyhtcGUpLCBfY21zU3RhZ2VHZXRQdHJUb0N1cnZlU2V0KG1wZSkpOworICAgICAgICBfY21zSU9QcmludGYobSwgIl1cbiIpOworCisgICAgICAgIG1wZSA9IG1wZSAtPk5leHQ7CisgICAgfQorCisgICAgaWYgKGNtc1N0YWdlVHlwZShtcGUpID09IGNtc1NpZ0NMdXRFbGVtVHlwZSkgeworCisgICAgICAgICAgICBfY21zSU9QcmludGYobSwgIi9UYWJsZSAiKTsKKyAgICAgICAgICAgIFdyaXRlQ0xVVChtLCBtcGUsIFByZU1haiwgUG9zdE1haiwgUHJlTWluLCBQb3N0TWluLCBGQUxTRSwgKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUpIDApOworICAgICAgICAgICAgX2Ntc0lPUHJpbnRmKG0sICJdXG4iKTsKKyAgICB9CisKKyAgICBFbWl0TGFiMlhZWihtKTsKKyAgICBFbWl0V2hpdGVCbGFja0Q1MChtLCBCbGFja1BvaW50KTsKKyAgICBFbWl0SW50ZW50KG0sIEludGVudCk7CisKKyAgICBfY21zSU9QcmludGYobSwgIiAgID4+XG4iKTsKKyAgICBfY21zSU9QcmludGYobSwgIl1cbiIpOworCisgICAgcmV0dXJuIDE7Cit9CisKKy8vIEdlbmVyYXRlcyBhIGN1cnZlIGZyb20gYSBncmF5IHByb2ZpbGUKKworc3RhdGljCisgICAgY21zVG9uZUN1cnZlKiBFeHRyYWN0R3JheTJZKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNIUFJPRklMRSBoUHJvZmlsZSwgaW50IEludGVudCkKK3sKKyAgICBjbXNUb25lQ3VydmUqIE91dCA9IGNtc0J1aWxkVGFidWxhdGVkVG9uZUN1cnZlMTYoQ29udGV4dElELCAyNTYsIE5VTEwpOworICAgIGNtc0hQUk9GSUxFIGhYWVogID0gY21zQ3JlYXRlWFlaUHJvZmlsZSgpOworICAgIGNtc0hUUkFOU0ZPUk0geGZvcm0gPSBjbXNDcmVhdGVUcmFuc2Zvcm1USFIoQ29udGV4dElELCBoUHJvZmlsZSwgVFlQRV9HUkFZXzgsIGhYWVosIFRZUEVfWFlaX0RCTCwgSW50ZW50LCBjbXNGTEFHU19OT09QVElNSVpFKTsKKyAgICBpbnQgaTsKKworICAgIGlmIChPdXQgIT0gTlVMTCkgeworICAgICAgICBmb3IgKGk9MDsgaSA8IDI1NjsgaSsrKSB7CisKKyAgICAgICAgICAgIGNtc1VJbnQ4TnVtYmVyIEdyYXkgPSAoY21zVUludDhOdW1iZXIpIGk7CisgICAgICAgICAgICBjbXNDSUVYWVogWFlaOworCisgICAgICAgICAgICBjbXNEb1RyYW5zZm9ybSh4Zm9ybSwgJkdyYXksICZYWVosIDEpOworCisgICAgICAgICAgICBPdXQgLT5UYWJsZTE2W2ldID1fY21zUXVpY2tTYXR1cmF0ZVdvcmQoWFlaLlkgKiA2NTUzNS4wKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNtc0RlbGV0ZVRyYW5zZm9ybSh4Zm9ybSk7CisgICAgY21zQ2xvc2VQcm9maWxlKGhYWVopOworICAgIHJldHVybiBPdXQ7Cit9CisKKworCisvLyBCZWNhdXNlIFBvc3RTY3JpcHQgaGFzIG9ubHkgOCBiaXRzIGluIC9UYWJsZSwgd2Ugc2hvdWxkIHVzZQorLy8gYSBtb3JlIHBlcmNlcHR1YWxseSB1bmlmb3JtIHNwYWNlLi4uIEkgZG8gY2hvb3NlIExhYi4KKworc3RhdGljCitpbnQgV3JpdGVJbnB1dExVVChjbXNJT0hBTkRMRVIqIG0sIGNtc0hQUk9GSUxFIGhQcm9maWxlLCBpbnQgSW50ZW50LCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKK3sKKyAgICBjbXNIUFJPRklMRSBoTGFiOworICAgIGNtc0hUUkFOU0ZPUk0geGZvcm07CisgICAgY21zVUludDMyTnVtYmVyIG5DaGFubmVsczsKKyAgICBjbXNVSW50MzJOdW1iZXIgSW5wdXRGb3JtYXQ7CisgICAgaW50IHJjOworICAgIGNtc0hQUk9GSUxFIFByb2ZpbGVzWzJdOworICAgIGNtc0NJRVhZWiBCbGFja1BvaW50QWRhcHRlZFRvRDUwOworCisgICAgLy8gRG9lcyBjcmVhdGUgYSBkZXZpY2UtbGluayBiYXNlZCB0cmFuc2Zvcm0uCisgICAgLy8gVGhlIERldmljZUxpbmsgaXMgbmV4dCBkdW1wZWQgYXMgd29ya2luZyBDU0EuCisKKyAgICBJbnB1dEZvcm1hdCA9IGNtc0Zvcm1hdHRlckZvckNvbG9yc3BhY2VPZlByb2ZpbGUoaFByb2ZpbGUsIDIsIEZBTFNFKTsKKyAgICBuQ2hhbm5lbHMgICA9IFRfQ0hBTk5FTFMoSW5wdXRGb3JtYXQpOworCisKKyAgICBjbXNEZXRlY3RCbGFja1BvaW50KCZCbGFja1BvaW50QWRhcHRlZFRvRDUwLCBoUHJvZmlsZSwgSW50ZW50LCAwKTsKKworICAgIC8vIEFkanVzdCBvdXRwdXQgdG8gTGFiNAorICAgIGhMYWIgPSBjbXNDcmVhdGVMYWI0UHJvZmlsZVRIUihtIC0+Q29udGV4dElELCBOVUxMKTsKKworICAgIFByb2ZpbGVzWzBdID0gaFByb2ZpbGU7CisgICAgUHJvZmlsZXNbMV0gPSBoTGFiOworCisgICAgeGZvcm0gPSBjbXNDcmVhdGVNdWx0aXByb2ZpbGVUcmFuc2Zvcm0oUHJvZmlsZXMsIDIsICBJbnB1dEZvcm1hdCwgVFlQRV9MYWJfREJMLCBJbnRlbnQsIDApOworICAgIGNtc0Nsb3NlUHJvZmlsZShoTGFiKTsKKworICAgIGlmICh4Zm9ybSA9PSBOVUxMKSB7CisKKyAgICAgICAgY21zU2lnbmFsRXJyb3IobSAtPkNvbnRleHRJRCwgY21zRVJST1JfQ09MT1JTUEFDRV9DSEVDSywgIkNhbm5vdCBjcmVhdGUgdHJhbnNmb3JtIFByb2ZpbGUgLT4gTGFiIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIE9ubHkgMSwgMyBhbmQgNCBjaGFubmVscyBhcmUgYWxsb3dlZAorCisgICAgc3dpdGNoIChuQ2hhbm5lbHMpIHsKKworICAgIGNhc2UgMTogeworICAgICAgICAgICAgY21zVG9uZUN1cnZlKiBHcmF5MlkgPSBFeHRyYWN0R3JheTJZKG0gLT5Db250ZXh0SUQsIGhQcm9maWxlLCBJbnRlbnQpOworICAgICAgICAgICAgRW1pdENJRUJhc2VkQShtLCBHcmF5MlksICZCbGFja1BvaW50QWRhcHRlZFRvRDUwKTsKKyAgICAgICAgICAgIGNtc0ZyZWVUb25lQ3VydmUoR3JheTJZKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgY2FzZSAzOgorICAgIGNhc2UgNDogeworICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIE91dEZybSA9IFRZUEVfTGFiXzE2OworICAgICAgICAgICAgY21zUGlwZWxpbmUqIERldmljZUxpbms7CisgICAgICAgICAgICBfY21zVFJBTlNGT1JNKiB2ID0gKF9jbXNUUkFOU0ZPUk0qKSB4Zm9ybTsKKworICAgICAgICAgICAgRGV2aWNlTGluayA9IGNtc1BpcGVsaW5lRHVwKHYgLT5MdXQpOworICAgICAgICAgICAgaWYgKERldmljZUxpbmsgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIGR3RmxhZ3MgfD0gY21zRkxBR1NfRk9SQ0VfQ0xVVDsKKyAgICAgICAgICAgIF9jbXNPcHRpbWl6ZVBpcGVsaW5lKG0tPkNvbnRleHRJRCwgJkRldmljZUxpbmssIEludGVudCwgJklucHV0Rm9ybWF0LCAmT3V0RnJtLCAmZHdGbGFncyk7CisKKyAgICAgICAgICAgIHJjID0gRW1pdENJRUJhc2VkREVGKG0sIERldmljZUxpbmssIEludGVudCwgJkJsYWNrUG9pbnRBZGFwdGVkVG9ENTApOworICAgICAgICAgICAgY21zUGlwZWxpbmVGcmVlKERldmljZUxpbmspOworICAgICAgICAgICAgaWYgKHJjID09IDApIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorCisgICAgICAgIGNtc1NpZ25hbEVycm9yKG0gLT5Db250ZXh0SUQsIGNtc0VSUk9SX0NPTE9SU1BBQ0VfQ0hFQ0ssICJPbmx5IDMsIDQgY2hhbm5lbHMgc3VwcG9ydGVkIGZvciBDU0EuIFRoaXMgcHJvZmlsZSBoYXMgJWQgY2hhbm5lbHMuIiwgbkNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisKKyAgICBjbXNEZWxldGVUcmFuc2Zvcm0oeGZvcm0pOworCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYworY21zRmxvYXQ2NE51bWJlciogR2V0UHRyVG9NYXRyaXgoY29uc3QgY21zU3RhZ2UqIG1wZSkKK3sKKyAgICBfY21zU3RhZ2VNYXRyaXhEYXRhKiBEYXRhID0gKF9jbXNTdGFnZU1hdHJpeERhdGEqKSBtcGUgLT5EYXRhOworCisgICAgcmV0dXJuIERhdGEgLT4gRG91YmxlOworfQorCisKKy8vIERvZXMgY3JlYXRlIENTQSBiYXNlZCBvbiBtYXRyaXgtc2hhcGVyLiBBbGxvd2VkIHR5cGVzIGFyZSBncmF5IGFuZCBSR0IgYmFzZWQKKworc3RhdGljCitpbnQgV3JpdGVJbnB1dE1hdHJpeFNoYXBlcihjbXNJT0hBTkRMRVIqIG0sIGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNTdGFnZSogTWF0cml4LCBjbXNTdGFnZSogU2hhcGVyKQoreworICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgQ29sb3JTcGFjZTsKKyAgICBpbnQgcmM7CisgICAgY21zQ0lFWFlaIEJsYWNrUG9pbnRBZGFwdGVkVG9ENTA7CisKKyAgICBDb2xvclNwYWNlID0gY21zR2V0Q29sb3JTcGFjZShoUHJvZmlsZSk7CisKKyAgICBjbXNEZXRlY3RCbGFja1BvaW50KCZCbGFja1BvaW50QWRhcHRlZFRvRDUwLCBoUHJvZmlsZSwgSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQywgMCk7CisKKyAgICBpZiAoQ29sb3JTcGFjZSA9PSBjbXNTaWdHcmF5RGF0YSkgeworCisgICAgICAgIGNtc1RvbmVDdXJ2ZSoqIFNoYXBlckN1cnZlID0gX2Ntc1N0YWdlR2V0UHRyVG9DdXJ2ZVNldChTaGFwZXIpOworICAgICAgICByYyA9IEVtaXRDSUVCYXNlZEEobSwgU2hhcGVyQ3VydmVbMF0sICZCbGFja1BvaW50QWRhcHRlZFRvRDUwKTsKKworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGlmIChDb2xvclNwYWNlID09IGNtc1NpZ1JnYkRhdGEpIHsKKworICAgICAgICAgICAgY21zTUFUMyBNYXQ7CisgICAgICAgICAgICBpbnQgaSwgajsKKworICAgICAgICAgICAgbWVtbW92ZSgmTWF0LCBHZXRQdHJUb01hdHJpeChNYXRyaXgpLCBzaXplb2YoTWF0KSk7CisKKyAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgMzsgaSsrKQorICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgMzsgaisrKQorICAgICAgICAgICAgICAgICAgICBNYXQudltpXS5uW2pdICo9IE1BWF9FTkNPREVBQkxFX1hZWjsKKworICAgICAgICAgICAgcmMgPSBFbWl0Q0lFQmFzZWRBQkMobSwgIChjbXNGbG9hdDY0TnVtYmVyICopICZNYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jbXNTdGFnZUdldFB0clRvQ3VydmVTZXQoU2hhcGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZCbGFja1BvaW50QWRhcHRlZFRvRDUwKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlICB7CisKKyAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKG0gLT5Db250ZXh0SUQsIGNtc0VSUk9SX0NPTE9SU1BBQ0VfQ0hFQ0ssICJQcm9maWxlIGlzIG5vdCBzdWl0YWJsZSBmb3IgQ1NBLiBVbnN1cHBvcnRlZCBjb2xvcnNwYWNlLiIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmM7Cit9CisKKworCisvLyBDcmVhdGVzIGEgUG9zdFNjcmlwdCBjb2xvciBsaXN0IGZyb20gYSBuYW1lZCBwcm9maWxlIGRhdGEuCisvLyBUaGlzIGlzIGEgSFAgZXh0ZW5zaW9uLCBhbmQgaXQgd29ya3MgaW4gTGFiIGluc3RlYWQgb2YgWFlaCisKK3N0YXRpYworaW50IFdyaXRlTmFtZWRDb2xvckNTQShjbXNJT0hBTkRMRVIqIG0sIGNtc0hQUk9GSUxFIGhOYW1lZENvbG9yLCBpbnQgSW50ZW50KQoreworICAgIGNtc0hUUkFOU0ZPUk0geGZvcm07CisgICAgY21zSFBST0ZJTEUgICBoTGFiOworICAgIGludCBpLCBuQ29sb3JzOworICAgIGNoYXIgQ29sb3JOYW1lWzMyXTsKKyAgICBjbXNOQU1FRENPTE9STElTVCogTmFtZWRDb2xvckxpc3Q7CisKKyAgICBoTGFiICA9IGNtc0NyZWF0ZUxhYjRQcm9maWxlVEhSKG0gLT5Db250ZXh0SUQsIE5VTEwpOworICAgIHhmb3JtID0gY21zQ3JlYXRlVHJhbnNmb3JtKGhOYW1lZENvbG9yLCBUWVBFX05BTUVEX0NPTE9SX0lOREVYLCBoTGFiLCBUWVBFX0xhYl9EQkwsIEludGVudCwgMCk7CisgICAgaWYgKHhmb3JtID09IE5VTEwpIHJldHVybiAwOworCisgICAgTmFtZWRDb2xvckxpc3QgPSBjbXNHZXROYW1lZENvbG9yTGlzdCh4Zm9ybSk7CisgICAgaWYgKE5hbWVkQ29sb3JMaXN0ID09IE5VTEwpIHJldHVybiAwOworCisgICAgX2Ntc0lPUHJpbnRmKG0sICI8PFxuIik7CisgICAgX2Ntc0lPUHJpbnRmKG0sICIoY29sb3JsaXN0Y29tbWVudCkgKCVzKVxuIiwgIk5hbWVkIGNvbG9yIENTQSIpOworICAgIF9jbXNJT1ByaW50ZihtLCAiKFByZWZpeCkgWyAoUGFudG9uZSApIChQQU5UT05FICkgXVxuIik7CisgICAgX2Ntc0lPUHJpbnRmKG0sICIoU3VmZml4KSBbICggQ1YpICggQ1ZDKSAoIEMpIF1cbiIpOworCisgICAgbkNvbG9ycyAgID0gY21zTmFtZWRDb2xvckNvdW50KE5hbWVkQ29sb3JMaXN0KTsKKworCisgICAgZm9yIChpPTA7IGkgPCBuQ29sb3JzOyBpKyspIHsKKworICAgICAgICBjbXNVSW50MTZOdW1iZXIgSW5bMV07CisgICAgICAgIGNtc0NJRUxhYiBMYWI7CisKKyAgICAgICAgSW5bMF0gPSAoY21zVUludDE2TnVtYmVyKSBpOworCisgICAgICAgIGlmICghY21zTmFtZWRDb2xvckluZm8oTmFtZWRDb2xvckxpc3QsIGksIENvbG9yTmFtZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgY21zRG9UcmFuc2Zvcm0oeGZvcm0sIEluLCAmTGFiLCAxKTsKKyAgICAgICAgX2Ntc0lPUHJpbnRmKG0sICIgICglcykgWyAlLjNmICUuM2YgJS4zZiBdXG4iLCBDb2xvck5hbWUsIExhYi5MLCBMYWIuYSwgTGFiLmIpOworICAgIH0KKworCisKKyAgICBfY21zSU9QcmludGYobSwgIj4+XG4iKTsKKworICAgIGNtc0RlbGV0ZVRyYW5zZm9ybSh4Zm9ybSk7CisgICAgY21zQ2xvc2VQcm9maWxlKGhMYWIpOworICAgIHJldHVybiAxOworfQorCisKKy8vIERvZXMgY3JlYXRlIGEgQ29sb3IgU3BhY2UgQXJyYXkgb24gWFlaIGNvbG9yc3BhY2UgZm9yIFBvc3RTY3JpcHQgdXNhZ2UKK3N0YXRpYworY21zVUludDMyTnVtYmVyIEdlbmVyYXRlQ1NBKGNtc0NvbnRleHQgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFIGhQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSU9IQU5ETEVSKiBtZW0pCit7CisgICAgY21zVUludDMyTnVtYmVyIGR3Qnl0ZXNVc2VkOworICAgIGNtc1BpcGVsaW5lKiBsdXQgPSBOVUxMOworICAgIGNtc1N0YWdlKiBNYXRyaXgsICpTaGFwZXI7CisKKworICAgIC8vIElzIGEgbmFtZWQgY29sb3IgcHJvZmlsZT8KKyAgICBpZiAoY21zR2V0RGV2aWNlQ2xhc3MoaFByb2ZpbGUpID09IGNtc1NpZ05hbWVkQ29sb3JDbGFzcykgeworCisgICAgICAgIGlmICghV3JpdGVOYW1lZENvbG9yQ1NBKG1lbSwgaFByb2ZpbGUsIEludGVudCkpIGdvdG8gRXJyb3I7CisgICAgfQorICAgIGVsc2UgeworCisKKyAgICAgICAgLy8gQW55IHByb2ZpbGUgY2xhc3MgYXJlIGFsbG93ZWQgKGluY2x1ZGluZyBkZXZpY2VsaW5rKSwgYnV0CisgICAgICAgIC8vIG91dHB1dCAoUENTKSBjb2xvcnNwYWNlIG11c3QgYmUgWFlaIG9yIExhYgorICAgICAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2UgPSBjbXNHZXRQQ1MoaFByb2ZpbGUpOworCisgICAgICAgIGlmIChDb2xvclNwYWNlICE9IGNtc1NpZ1hZWkRhdGEgJiYKKyAgICAgICAgICAgIENvbG9yU3BhY2UgIT0gY21zU2lnTGFiRGF0YSkgeworCisgICAgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9DT0xPUlNQQUNFX0NIRUNLLCAiSW52YWxpZCBvdXRwdXQgY29sb3Igc3BhY2UiKTsKKyAgICAgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICB9CisKKworICAgICAgICAvLyBSZWFkIHRoZSBsdXQgd2l0aCBhbGwgbmVjZXNzYXJ5IGNvbnZlcnNpb24gc3RhZ2VzCisgICAgICAgIGx1dCA9IF9jbXNSZWFkSW5wdXRMVVQoaFByb2ZpbGUsIEludGVudCk7CisgICAgICAgIGlmIChsdXQgPT0gTlVMTCkgZ290byBFcnJvcjsKKworCisgICAgICAgIC8vIFRvbmUgY3VydmVzICsgbWF0cml4IGNhbiBiZSBpbXBsZW1lbnRlZCB3aXRob3V0IGFueSBMVVQKKyAgICAgICAgaWYgKGNtc1BpcGVsaW5lQ2hlY2tBbmRSZXRyZWl2ZVN0YWdlcyhsdXQsIDIsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsIGNtc1NpZ01hdHJpeEVsZW1UeXBlLCAmU2hhcGVyLCAmTWF0cml4KSkgeworCisgICAgICAgICAgICBpZiAoIVdyaXRlSW5wdXRNYXRyaXhTaGFwZXIobWVtLCBoUHJvZmlsZSwgTWF0cml4LCBTaGFwZXIpKSBnb3RvIEVycm9yOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgIC8vIFdlIG5lZWQgYSBMVVQgZm9yIHRoZSByZXN0CisgICAgICAgICAgIGlmICghV3JpdGVJbnB1dExVVChtZW0sIGhQcm9maWxlLCBJbnRlbnQsIGR3RmxhZ3MpKSBnb3RvIEVycm9yOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyBEb25lLCBrZWVwIG1lbW9yeSB1c2FnZQorICAgIGR3Qnl0ZXNVc2VkID0gbWVtIC0+VXNlZFNwYWNlOworCisgICAgLy8gR2V0IHJpZCBvZiBMVVQKKyAgICBpZiAobHV0ICE9IE5VTEwpIGNtc1BpcGVsaW5lRnJlZShsdXQpOworCisgICAgLy8gRmluYWxseSwgcmV0dXJuIHVzZWQgYnl0ZSBjb3VudAorICAgIHJldHVybiBkd0J5dGVzVXNlZDsKKworRXJyb3I6CisgICAgaWYgKGx1dCAhPSBOVUxMKSBjbXNQaXBlbGluZUZyZWUobHV0KTsKKyAgICByZXR1cm4gMDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvbG9yIFJlbmRlcmluZyBEaWN0aW9uYXJ5IChDUkQpCisKKworCisvKgorCisgIEJsYWNrIHBvaW50IGNvbXBlbnNhdGlvbiBwbHVzIGNocm9tYXRpYyBhZGFwdGF0aW9uOgorCisgIFN0ZXAgMSAtIENocm9tYXRpYyBhZGFwdGF0aW9uCisgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICBXUG91dAorICAgIFggPSAtLS0tLS0tIFBRUgorICAgICAgICAgIFdwaW4KKworICBTdGVwIDIgLSBCbGFjayBwb2ludCBjb21wZW5zYXRpb24KKyAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAgICAgICAoV1BvdXQgLSBCUG91dCkqWCAtIFdQb3V0KihCUGluIC0gQlBvdXQpCisgICAgb3V0ID0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICBXUG91dCAtIEJQaW4KKworCisgIEFsZ29yaXRobSBkaXNjdXNzaW9uCisgID09PT09PT09PT09PT09PT09PT09CisKKyAgVHJhbnNmb3JtUFFSKFdQaW4sIEJQaW4sIFdQb3V0LCBCUG91dCwgUFFSKQorCisgIFdwaW4sZXRjPSB7IFh3cyBZd3MgWndzIFB3cyBRd3MgUndzIH0KKworCisgIEFsZ29yaXRobSAgICAgICAgICAgICBTdGFjayAwLi4ubgorICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAgICAgICAgICAgICAgICAgICAgUFFSIEJQb3V0IFdQb3V0IEJQaW4gV1BpbgorICA0IGluZGV4IDMgZ2V0ICAgICAgICAgV1BpbiBQUVIgQlBvdXQgV1BvdXQgQlBpbiBXUGluCisgIGRpdiAgICAgICAgICAgICAgICAgICAoUFFSL1dQaW4pIEJQb3V0IFdQb3V0IEJQaW4gV1BpbgorICAyIGluZGV4IDMgZ2V0ICAgICAgICAgV1BvdXQgKFBRUi9XUGluKSBCUG91dCBXUG91dCBCUGluIFdQaW4KKyAgbXVsdCAgICAgICAgICAgICAgICAgIFdQb3V0KihQUVIvV1BpbikgQlBvdXQgV1BvdXQgQlBpbiBXUGluCisKKyAgMiBpbmRleCAzIGdldCAgICAgICAgIFdQb3V0IFdQb3V0KihQUVIvV1BpbikgQlBvdXQgV1BvdXQgQlBpbiBXUGluCisgIDIgaW5kZXggMyBnZXQgICAgICAgICBCUG91dCBXUG91dCBXUG91dCooUFFSL1dQaW4pIEJQb3V0IFdQb3V0IEJQaW4gV1BpbgorICBzdWIgICAgICAgICAgICAgICAgICAgKFdQb3V0LUJQb3V0KSBXUG91dCooUFFSL1dQaW4pIEJQb3V0IFdQb3V0IEJQaW4gV1BpbgorICBtdWx0ICAgICAgICAgICAgICAgICAgKFdQb3V0LUJQb3V0KSogV1BvdXQqKFBRUi9XUGluKSBCUG91dCBXUG91dCBCUGluIFdQaW4KKworICAyIGluZGV4IDMgZ2V0ICAgICAgICAgV1BvdXQgKEJQb3V0LVdQb3V0KSogV1BvdXQqKFBRUi9XUGluKSBCUG91dCBXUG91dCBCUGluIFdQaW4KKyAgNCBpbmRleCAzIGdldCAgICAgICAgIEJQaW4gV1BvdXQgKEJQb3V0LVdQb3V0KSogV1BvdXQqKFBRUi9XUGluKSBCUG91dCBXUG91dCBCUGluIFdQaW4KKyAgMyBpbmRleCAzIGdldCAgICAgICAgIEJQb3V0IEJQaW4gV1BvdXQgKEJQb3V0LVdQb3V0KSogV1BvdXQqKFBRUi9XUGluKSBCUG91dCBXUG91dCBCUGluIFdQaW4KKworICBzdWIgICAgICAgICAgICAgICAgICAgKEJQaW4tQlBvdXQpIFdQb3V0IChCUG91dC1XUG91dCkqIFdQb3V0KihQUVIvV1BpbikgQlBvdXQgV1BvdXQgQlBpbiBXUGluCisgIG11bHQgICAgICAgICAgICAgICAgICAoQlBpbi1CUG91dCkqV1BvdXQgKEJQb3V0LVdQb3V0KSogV1BvdXQqKFBRUi9XUGluKSBCUG91dCBXUG91dCBCUGluIFdQaW4KKyAgc3ViICAgICAgICAgICAgICAgICAgIChCUG91dC1XUG91dCkqIFdQb3V0KihQUVIvV1BpbiktKEJQaW4tQlBvdXQpKldQb3V0IEJQb3V0IFdQb3V0IEJQaW4gV1BpbgorCisgIDMgaW5kZXggMyBnZXQgICAgICAgICBCUGluIChCUG91dC1XUG91dCkqIFdQb3V0KihQUVIvV1BpbiktKEJQaW4tQlBvdXQpKldQb3V0IEJQb3V0IFdQb3V0IEJQaW4gV1BpbgorICAzIGluZGV4IDMgZ2V0ICAgICAgICAgV1BvdXQgQlBpbiAoQlBvdXQtV1BvdXQpKiBXUG91dCooUFFSL1dQaW4pLShCUGluLUJQb3V0KSpXUG91dCBCUG91dCBXUG91dCBCUGluIFdQaW4KKyAgZXhjaAorICBzdWIgICAgICAgICAgICAgICAgICAgKFdQb3V0LUJQaW4pIChCUG91dC1XUG91dCkqIFdQb3V0KihQUVIvV1BpbiktKEJQaW4tQlBvdXQpKldQb3V0IEJQb3V0IFdQb3V0IEJQaW4gV1BpbgorICBkaXYKKworICBleGNoIHBvcAorICBleGNoIHBvcAorICBleGNoIHBvcAorICBleGNoIHBvcAorCisqLworCisKK3N0YXRpYwordm9pZCBFbWl0UFFSU3RhZ2UoY21zSU9IQU5ETEVSKiBtLCBjbXNIUFJPRklMRSBoUHJvZmlsZSwgaW50IERvQlBDLCBpbnQgbElzQWJzb2x1dGUpCit7CisKKworICAgICAgICBpZiAobElzQWJzb2x1dGUpIHsKKworICAgICAgICAgICAgLy8gRm9yIGFic29sdXRlIGNvbG9yaW1ldHJpYyBpbnRlbnQsIGVuY29kZSBiYWNrIHRvIHJlbGF0aXZlCisgICAgICAgICAgICAvLyBhbmQgZ2VuZXJhdGUgYSByZWxhdGl2ZSBQaXBlbGluZQorCisgICAgICAgICAgICAvLyBSZWxhdGl2ZSBlbmNvZGluZyBpcyBvYnRhaW5lZCBhY3Jvc3MgWFlacGNzKihENTAvV2hpdGVQb2ludCkKKworICAgICAgICAgICAgY21zQ0lFWFlaIFdoaXRlOworCisgICAgICAgICAgICBfY21zUmVhZE1lZGlhV2hpdGVQb2ludCgmV2hpdGUsIGhQcm9maWxlKTsKKworICAgICAgICAgICAgX2Ntc0lPUHJpbnRmKG0sIi9NYXRyaXhQUVIgWzEgMCAwIDAgMSAwIDAgMCAxIF1cbiIpOworICAgICAgICAgICAgX2Ntc0lPUHJpbnRmKG0sIi9SYW5nZVBRUiBbIC0wLjUgMiAtMC41IDIgLTAuNSAyIF1cbiIpOworCisgICAgICAgICAgICBfY21zSU9QcmludGYobSwgIiUlIEFic29sdXRlIGNvbG9yaW1ldHJpYyAtLSBlbmNvZGUgdG8gcmVsYXRpdmUgdG8gbWF4aW1pemUgTFVUIHVzYWdlXG4iCisgICAgICAgICAgICAgICAgICAgICAgIi9UcmFuc2Zvcm1QUVIgW1xuIgorICAgICAgICAgICAgICAgICAgICAgICJ7MC45NjQyIG11bCAlZyBkaXYgZXhjaCBwb3AgZXhjaCBwb3AgZXhjaCBwb3AgZXhjaCBwb3B9IGJpbmRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiezEuMDAwMCBtdWwgJWcgZGl2IGV4Y2ggcG9wIGV4Y2ggcG9wIGV4Y2ggcG9wIGV4Y2ggcG9wfSBiaW5kXG4iCisgICAgICAgICAgICAgICAgICAgICAgInswLjgyNDkgbXVsICVnIGRpdiBleGNoIHBvcCBleGNoIHBvcCBleGNoIHBvcCBleGNoIHBvcH0gYmluZFxuXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBXaGl0ZS5YLCBXaGl0ZS5ZLCBXaGl0ZS5aKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisKKyAgICAgICAgX2Ntc0lPUHJpbnRmKG0sIiUlIEJyYWRmb3JkIENvbmUgU3BhY2VcbiIKKyAgICAgICAgICAgICAgICAgIi9NYXRyaXhQUVIgWzAuODk1MSAtMC43NTAyIDAuMDM4OSAwLjI2NjQgMS43MTM1IC0wLjA2ODUgLTAuMTYxNCAwLjAzNjcgMS4wMjk2IF0gXG4iKTsKKworICAgICAgICBfY21zSU9QcmludGYobSwgIi9SYW5nZVBRUiBbIC0wLjUgMiAtMC41IDIgLTAuNSAyIF1cbiIpOworCisKKyAgICAgICAgLy8gTm8gQlBDCisKKyAgICAgICAgaWYgKCFEb0JQQykgeworCisgICAgICAgICAgICBfY21zSU9QcmludGYobSwgIiUlIFZvbktyaWVzLWxpa2UgdHJhbnNmb3JtIGluIEJyYWRmb3JkIENvbmUgU3BhY2VcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiL1RyYW5zZm9ybVBRUiBbXG4iCisgICAgICAgICAgICAgICAgICAgICAgIntleGNoIHBvcCBleGNoIDMgZ2V0IG11bCBleGNoIHBvcCBleGNoIDMgZ2V0IGRpdn0gYmluZFxuIgorICAgICAgICAgICAgICAgICAgICAgICJ7ZXhjaCBwb3AgZXhjaCA0IGdldCBtdWwgZXhjaCBwb3AgZXhjaCA0IGdldCBkaXZ9IGJpbmRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAie2V4Y2ggcG9wIGV4Y2ggNSBnZXQgbXVsIGV4Y2ggcG9wIGV4Y2ggNSBnZXQgZGl2fSBiaW5kXG5dXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgLy8gQlBDCisKKyAgICAgICAgICAgIF9jbXNJT1ByaW50ZihtLCAiJSUgVm9uS3JpZXMtbGlrZSB0cmFuc2Zvcm0gaW4gQnJhZGZvcmQgQ29uZSBTcGFjZSBwbHVzIEJQQ1xuIgorICAgICAgICAgICAgICAgICAgICAgICIvVHJhbnNmb3JtUFFSIFtcbiIpOworCisgICAgICAgICAgICBfY21zSU9QcmludGYobSwgIns0IGluZGV4IDMgZ2V0IGRpdiAyIGluZGV4IDMgZ2V0IG11bCAiCisgICAgICAgICAgICAgICAgICAgICIyIGluZGV4IDMgZ2V0IDIgaW5kZXggMyBnZXQgc3ViIG11bCAiCisgICAgICAgICAgICAgICAgICAgICIyIGluZGV4IDMgZ2V0IDQgaW5kZXggMyBnZXQgMyBpbmRleCAzIGdldCBzdWIgbXVsIHN1YiAiCisgICAgICAgICAgICAgICAgICAgICIzIGluZGV4IDMgZ2V0IDMgaW5kZXggMyBnZXQgZXhjaCBzdWIgZGl2ICIKKyAgICAgICAgICAgICAgICAgICAgImV4Y2ggcG9wIGV4Y2ggcG9wIGV4Y2ggcG9wIGV4Y2ggcG9wIH0gYmluZFxuIik7CisKKyAgICAgICAgICAgIF9jbXNJT1ByaW50ZihtLCAiezQgaW5kZXggNCBnZXQgZGl2IDIgaW5kZXggNCBnZXQgbXVsICIKKyAgICAgICAgICAgICAgICAgICAgIjIgaW5kZXggNCBnZXQgMiBpbmRleCA0IGdldCBzdWIgbXVsICIKKyAgICAgICAgICAgICAgICAgICAgIjIgaW5kZXggNCBnZXQgNCBpbmRleCA0IGdldCAzIGluZGV4IDQgZ2V0IHN1YiBtdWwgc3ViICIKKyAgICAgICAgICAgICAgICAgICAgIjMgaW5kZXggNCBnZXQgMyBpbmRleCA0IGdldCBleGNoIHN1YiBkaXYgIgorICAgICAgICAgICAgICAgICAgICAiZXhjaCBwb3AgZXhjaCBwb3AgZXhjaCBwb3AgZXhjaCBwb3AgfSBiaW5kXG4iKTsKKworICAgICAgICAgICAgX2Ntc0lPUHJpbnRmKG0sICJ7NCBpbmRleCA1IGdldCBkaXYgMiBpbmRleCA1IGdldCBtdWwgIgorICAgICAgICAgICAgICAgICAgICAiMiBpbmRleCA1IGdldCAyIGluZGV4IDUgZ2V0IHN1YiBtdWwgIgorICAgICAgICAgICAgICAgICAgICAiMiBpbmRleCA1IGdldCA0IGluZGV4IDUgZ2V0IDMgaW5kZXggNSBnZXQgc3ViIG11bCBzdWIgIgorICAgICAgICAgICAgICAgICAgICAiMyBpbmRleCA1IGdldCAzIGluZGV4IDUgZ2V0IGV4Y2ggc3ViIGRpdiAiCisgICAgICAgICAgICAgICAgICAgICJleGNoIHBvcCBleGNoIHBvcCBleGNoIHBvcCBleGNoIHBvcCB9IGJpbmRcbl1cbiIpOworCisgICAgICAgIH0KKworCit9CisKKworc3RhdGljCit2b2lkIEVtaXRYWVoyTGFiKGNtc0lPSEFORExFUiogbSkKK3sKKyAgICBfY21zSU9QcmludGYobSwgIi9SYW5nZUxNTiBbIC0wLjYzNSAyLjAgMCAyIC0wLjYzNSAyLjAgXVxuIik7CisgICAgX2Ntc0lPUHJpbnRmKG0sICIvRW5jb2RlTE1OIFtcbiIpOworICAgIF9jbXNJT1ByaW50ZihtLCAieyAwLjk2NDIwMCAgZGl2IGR1cCAwLjAwODg1NiBsZSB7Ny43ODcgbXVsIDE2IDExNiBkaXYgYWRkfXsxIDMgZGl2IGV4cH0gaWZlbHNlIH0gYmluZFxuIik7CisgICAgX2Ntc0lPUHJpbnRmKG0sICJ7IDEuMDAwMDAwICBkaXYgZHVwIDAuMDA4ODU2IGxlIHs3Ljc4NyBtdWwgMTYgMTE2IGRpdiBhZGR9ezEgMyBkaXYgZXhwfSBpZmVsc2UgfSBiaW5kXG4iKTsKKyAgICBfY21zSU9QcmludGYobSwgInsgMC44MjQ5MDAgIGRpdiBkdXAgMC4wMDg4NTYgbGUgezcuNzg3IG11bCAxNiAxMTYgZGl2IGFkZH17MSAzIGRpdiBleHB9IGlmZWxzZSB9IGJpbmRcbiIpOworICAgIF9jbXNJT1ByaW50ZihtLCAiXVxuIik7CisgICAgX2Ntc0lPUHJpbnRmKG0sICIvTWF0cml4QUJDIFsgMCAxIDAgMSAtMSAxIDAgMCAtMSBdXG4iKTsKKyAgICBfY21zSU9QcmludGYobSwgIi9FbmNvZGVBQkMgW1xuIik7CisKKworICAgIF9jbXNJT1ByaW50ZihtLCAieyAxMTYgbXVsICAxNiBzdWIgMTAwIGRpdiAgfSBiaW5kXG4iKTsKKyAgICBfY21zSU9QcmludGYobSwgInsgNTAwIG11bCAxMjggYWRkIDI1NiBkaXYgIH0gYmluZFxuIik7CisgICAgX2Ntc0lPUHJpbnRmKG0sICJ7IDIwMCBtdWwgMTI4IGFkZCAyNTYgZGl2ICB9IGJpbmRcbiIpOworCisKKyAgICBfY21zSU9QcmludGYobSwgIl1cbiIpOworCisKK30KKworLy8gRHVlIHRvIGltcGVkYW5jZSBtaXNtYXRjaCBiZXR3ZWVuIFhZWiBhbmQgYWxtb3N0IGFsbCBSR0IgYW5kIENNWUsgc3BhY2VzCisvLyBJIGNob29zZSB0byBkdW1wIExVVFMgaW4gTGFiIGluc3RlYWQgb2YgWFlaLiBUaGVyZSBpcyBzdGlsbCBhIGxvdCBvZiB3YXN0ZWQKKy8vIHNwYWNlIG9uIDNEIENMVVQsIGJ1dCBzaW5jZSBzcGFjZSBzZWVtcyBub3QgdG8gYmUgYSBwcm9ibGVtIGhlcmUsIDMzIHBvaW50cworLy8gd291bGQgZ2l2ZSBhIHJlYXNvbmFibGUgYWNjdXJhbmN5LiBOb3RlIGFsc28gdGhhdCBDUkQgdGFibGVzIG11c3Qgb3BlcmF0ZSBpbgorLy8gOCBiaXRzLgorCitzdGF0aWMKK2ludCBXcml0ZU91dHB1dExVVChjbXNJT0hBTkRMRVIqIG0sIGNtc0hQUk9GSUxFIGhQcm9maWxlLCBpbnQgSW50ZW50LCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKK3sKKyAgICBjbXNIUFJPRklMRSBoTGFiOworICAgIGNtc0hUUkFOU0ZPUk0geGZvcm07CisgICAgaW50IGksIG5DaGFubmVsczsKKyAgICBjbXNVSW50MzJOdW1iZXIgT3V0cHV0Rm9ybWF0OworICAgIF9jbXNUUkFOU0ZPUk0qIHY7CisgICAgY21zUGlwZWxpbmUqIERldmljZUxpbms7CisgICAgY21zSFBST0ZJTEUgUHJvZmlsZXNbM107CisgICAgY21zQ0lFWFlaIEJsYWNrUG9pbnRBZGFwdGVkVG9ENTA7CisgICAgY21zQm9vbCBsRG9CUEMgPSAoZHdGbGFncyAmIGNtc0ZMQUdTX0JMQUNLUE9JTlRDT01QRU5TQVRJT04pOworICAgIGNtc0Jvb2wgbEZpeFdoaXRlID0gIShkd0ZsYWdzICYgY21zRkxBR1NfTk9XSElURU9OV0hJVEVGSVhVUCk7CisgICAgY21zVUludDMyTnVtYmVyIEluRnJtID0gVFlQRV9MYWJfMTY7CisgICAgaW50IFJlbGF0aXZlRW5jb2RpbmdJbnRlbnQ7CisgICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBDb2xvclNwYWNlOworCisKKyAgICBoTGFiID0gY21zQ3JlYXRlTGFiNFByb2ZpbGVUSFIobSAtPkNvbnRleHRJRCwgTlVMTCk7CisgICAgaWYgKGhMYWIgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgICBPdXRwdXRGb3JtYXQgPSBjbXNGb3JtYXR0ZXJGb3JDb2xvcnNwYWNlT2ZQcm9maWxlKGhQcm9maWxlLCAyLCBGQUxTRSk7CisgICAgbkNoYW5uZWxzICAgID0gVF9DSEFOTkVMUyhPdXRwdXRGb3JtYXQpOworCisgICAgQ29sb3JTcGFjZSA9IGNtc0dldENvbG9yU3BhY2UoaFByb2ZpbGUpOworCisgICAgLy8gRm9yIGFic29sdXRlIGNvbG9yaW1ldHJpYywgdGhlIExVVCBpcyBlbmNvZGVkIGFzIHJlbGF0aXZlIGluIG9yZGVyIHRvIHByZXNlcnZlIHByZWNpc2lvbi4KKworICAgIFJlbGF0aXZlRW5jb2RpbmdJbnRlbnQgPSBJbnRlbnQ7CisgICAgaWYgKFJlbGF0aXZlRW5jb2RpbmdJbnRlbnQgPT0gSU5URU5UX0FCU09MVVRFX0NPTE9SSU1FVFJJQykKKyAgICAgICAgUmVsYXRpdmVFbmNvZGluZ0ludGVudCA9IElOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUM7CisKKworICAgIC8vIFVzZSBWNCBMYWIgYWx3YXlzCisgICAgUHJvZmlsZXNbMF0gPSBoTGFiOworICAgIFByb2ZpbGVzWzFdID0gaFByb2ZpbGU7CisKKyAgICB4Zm9ybSA9IGNtc0NyZWF0ZU11bHRpcHJvZmlsZVRyYW5zZm9ybVRIUihtIC0+Q29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGVzLCAyLCBUWVBFX0xhYl9EQkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0Rm9ybWF0LCBSZWxhdGl2ZUVuY29kaW5nSW50ZW50LCAwKTsKKyAgICBjbXNDbG9zZVByb2ZpbGUoaExhYik7CisKKyAgICBpZiAoeGZvcm0gPT0gTlVMTCkgeworCisgICAgICAgIGNtc1NpZ25hbEVycm9yKG0gLT5Db250ZXh0SUQsIGNtc0VSUk9SX0NPTE9SU1BBQ0VfQ0hFQ0ssICJDYW5ub3QgY3JlYXRlIHRyYW5zZm9ybSBMYWIgLT4gUHJvZmlsZSBpbiBDUkQgY3JlYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gR2V0IGEgY29weSBvZiB0aGUgaW50ZXJuYWwgZGV2aWNlbGluaworICAgIHYgPSAoX2Ntc1RSQU5TRk9STSopIHhmb3JtOworICAgIERldmljZUxpbmsgPSBjbXNQaXBlbGluZUR1cCh2IC0+THV0KTsKKyAgICBpZiAoRGV2aWNlTGluayA9PSBOVUxMKSByZXR1cm4gMDsKKworCisgICAgLy8gV2UgbmVlZCBhIENMVVQKKyAgICBkd0ZsYWdzIHw9IGNtc0ZMQUdTX0ZPUkNFX0NMVVQ7CisgICAgX2Ntc09wdGltaXplUGlwZWxpbmUobS0+Q29udGV4dElELCAmRGV2aWNlTGluaywgUmVsYXRpdmVFbmNvZGluZ0ludGVudCwgJkluRnJtLCAmT3V0cHV0Rm9ybWF0LCAmZHdGbGFncyk7CisKKyAgICBfY21zSU9QcmludGYobSwgIjw8XG4iKTsKKyAgICBfY21zSU9QcmludGYobSwgIi9Db2xvclJlbmRlcmluZ1R5cGUgMVxuIik7CisKKworICAgIGNtc0RldGVjdEJsYWNrUG9pbnQoJkJsYWNrUG9pbnRBZGFwdGVkVG9ENTAsIGhQcm9maWxlLCBJbnRlbnQsIDApOworCisgICAgLy8gRW1pdCBoZWFkZXJzLCBldGMuCisgICAgRW1pdFdoaXRlQmxhY2tENTAobSwgJkJsYWNrUG9pbnRBZGFwdGVkVG9ENTApOworICAgIEVtaXRQUVJTdGFnZShtLCBoUHJvZmlsZSwgbERvQlBDLCBJbnRlbnQgPT0gSU5URU5UX0FCU09MVVRFX0NPTE9SSU1FVFJJQyk7CisgICAgRW1pdFhZWjJMYWIobSk7CisKKworICAgIC8vIEZJWFVQOiBtYXAgTGFiICgxMDAsIDAsIDApIHRvIHBlcmZlY3Qgd2hpdGUsIGJlY2F1c2UgdGhlIHBhcnRpY3VsYXIgZW5jb2RpbmcgZm9yIExhYgorICAgIC8vIGRvZXMgbWFwIGE9Yj0wIG5vdCBmYWxsaW5nIGludG8gYW55IHNwZWNpZmljIG5vZGUuIFNpbmNlIHJhbmdlIGEsYiBnb2VzIC0xMjguLjEyNywKKyAgICAvLyB6ZXJvIGlzIHNsaWdodGx5IG1vdmVkIHRvd2FyZHMgcmlnaHQsIHNvIGFzc3VyZSBuZXh0IG5vZGUgKGluIEw9MTAwIHNsaWNlKSBpcyBtYXBwZWQgdG8KKyAgICAvLyB6ZXJvLiBUaGlzIHdvdWxkIHNhY3JpZmljZSBhIGJpdCBvZiBoaWdobGlnaHRzLCBidXQgZmFpbHVyZSB0byBkbyBzbyB3b3VsZCBjYXVzZQorICAgIC8vIHNjdW0gZG90LiBPdWNoLgorCisgICAgaWYgKEludGVudCA9PSBJTlRFTlRfQUJTT0xVVEVfQ09MT1JJTUVUUklDKQorICAgICAgICAgICAgbEZpeFdoaXRlID0gRkFMU0U7CisKKyAgICBfY21zSU9QcmludGYobSwgIi9SZW5kZXJUYWJsZSAiKTsKKworCisgICAgV3JpdGVDTFVUKG0sIGNtc1BpcGVsaW5lR2V0UHRyVG9GaXJzdFN0YWdlKERldmljZUxpbmspLCAiPCIsICI+XG4iLCAiIiwgIiIsIGxGaXhXaGl0ZSwgQ29sb3JTcGFjZSk7CisKKyAgICBfY21zSU9QcmludGYobSwgIiAlZCB7fSBiaW5kICIsIG5DaGFubmVscyk7CisKKyAgICBmb3IgKGk9MTsgaSA8IG5DaGFubmVsczsgaSsrKQorICAgICAgICAgICAgX2Ntc0lPUHJpbnRmKG0sICJkdXAgIik7CisKKyAgICBfY21zSU9QcmludGYobSwgIl1cbiIpOworCisKKyAgICBFbWl0SW50ZW50KG0sIEludGVudCk7CisKKyAgICBfY21zSU9QcmludGYobSwgIj4+XG4iKTsKKworICAgIGlmICghKGR3RmxhZ3MgJiBjbXNGTEFHU19OT0RFRkFVTFRSRVNPVVJDRURFRikpIHsKKworICAgICAgICBfY21zSU9QcmludGYobSwgIi9DdXJyZW50IGV4Y2ggL0NvbG9yUmVuZGVyaW5nIGRlZmluZXJlc291cmNlIHBvcFxuIik7CisgICAgfQorCisgICAgY21zUGlwZWxpbmVGcmVlKERldmljZUxpbmspOworICAgIGNtc0RlbGV0ZVRyYW5zZm9ybSh4Zm9ybSk7CisKKyAgICByZXR1cm4gMTsKK30KKworCisvLyBCdWlsZHMgYSBBU0NJSSBzdHJpbmcgY29udGFpbmluZyBjb2xvcmFudCBsaXN0IGluIDAuLjEuMCByYW5nZQorc3RhdGljCit2b2lkIEJ1aWxkQ29sb3JhbnRMaXN0KGNoYXIgKkNvbG9yYW50LCBpbnQgbkNvbG9yYW50LCBjbXNVSW50MTZOdW1iZXIgT3V0W10pCit7CisgICAgY2hhciBCdWZmWzMyXTsKKyAgICBpbnQgajsKKworICAgIENvbG9yYW50WzBdID0gMDsKKyAgICBpZiAobkNvbG9yYW50ID4gY21zTUFYQ0hBTk5FTFMpCisgICAgICAgIG5Db2xvcmFudCA9IGNtc01BWENIQU5ORUxTOworCisgICAgZm9yIChqID0gMDsgaiA8IG5Db2xvcmFudDsgaisrKSB7CisKKyAgICAgICAgc25wcmludGYoQnVmZiwgMzEsICIlLjNmIiwgT3V0W2pdIC8gNjU1MzUuMCk7CisgICAgICAgIEJ1ZmZbMzFdID0gMDsKKyAgICAgICAgc3RyY2F0KENvbG9yYW50LCBCdWZmKTsKKyAgICAgICAgaWYgKGogPCBuQ29sb3JhbnQgLSAxKQorICAgICAgICAgICAgc3RyY2F0KENvbG9yYW50LCAiICIpOworCisgICAgfQorfQorCisKKy8vIENyZWF0ZXMgYSBQb3N0U2NyaXB0IGNvbG9yIGxpc3QgZnJvbSBhIG5hbWVkIHByb2ZpbGUgZGF0YS4KKy8vIFRoaXMgaXMgYSBIUCBleHRlbnNpb24uCisKK3N0YXRpYworaW50IFdyaXRlTmFtZWRDb2xvckNSRChjbXNJT0hBTkRMRVIqIG0sIGNtc0hQUk9GSUxFIGhOYW1lZENvbG9yLCBpbnQgSW50ZW50LCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKK3sKKyAgICBjbXNIVFJBTlNGT1JNIHhmb3JtOworICAgIGludCBpLCBuQ29sb3JzLCBuQ29sb3JhbnQ7CisgICAgY21zVUludDMyTnVtYmVyIE91dHB1dEZvcm1hdDsKKyAgICBjaGFyIENvbG9yTmFtZVszMl07CisgICAgY2hhciBDb2xvcmFudFsxMjhdOworICAgIGNtc05BTUVEQ09MT1JMSVNUKiBOYW1lZENvbG9yTGlzdDsKKworCisgICAgT3V0cHV0Rm9ybWF0ID0gY21zRm9ybWF0dGVyRm9yQ29sb3JzcGFjZU9mUHJvZmlsZShoTmFtZWRDb2xvciwgMiwgRkFMU0UpOworICAgIG5Db2xvcmFudCAgICA9IFRfQ0hBTk5FTFMoT3V0cHV0Rm9ybWF0KTsKKworCisgICAgeGZvcm0gPSBjbXNDcmVhdGVUcmFuc2Zvcm0oaE5hbWVkQ29sb3IsIFRZUEVfTkFNRURfQ09MT1JfSU5ERVgsIE5VTEwsIE91dHB1dEZvcm1hdCwgSW50ZW50LCBkd0ZsYWdzKTsKKyAgICBpZiAoeGZvcm0gPT0gTlVMTCkgcmV0dXJuIDA7CisKKworICAgIE5hbWVkQ29sb3JMaXN0ID0gY21zR2V0TmFtZWRDb2xvckxpc3QoeGZvcm0pOworICAgIGlmIChOYW1lZENvbG9yTGlzdCA9PSBOVUxMKSByZXR1cm4gMDsKKworICAgIF9jbXNJT1ByaW50ZihtLCAiPDxcbiIpOworICAgIF9jbXNJT1ByaW50ZihtLCAiKGNvbG9ybGlzdGNvbW1lbnQpICglcykgXG4iLCAiTmFtZWQgcHJvZmlsZSIpOworICAgIF9jbXNJT1ByaW50ZihtLCAiKFByZWZpeCkgWyAoUGFudG9uZSApIChQQU5UT05FICkgXVxuIik7CisgICAgX2Ntc0lPUHJpbnRmKG0sICIoU3VmZml4KSBbICggQ1YpICggQ1ZDKSAoIEMpIF1cbiIpOworCisgICAgbkNvbG9ycyAgID0gY21zTmFtZWRDb2xvckNvdW50KE5hbWVkQ29sb3JMaXN0KTsKKworICAgIGZvciAoaT0wOyBpIDwgbkNvbG9yczsgaSsrKSB7CisKKyAgICAgICAgY21zVUludDE2TnVtYmVyIEluWzFdOworICAgICAgICBjbXNVSW50MTZOdW1iZXIgT3V0W2Ntc01BWENIQU5ORUxTXTsKKworICAgICAgICBJblswXSA9IChjbXNVSW50MTZOdW1iZXIpIGk7CisKKyAgICAgICAgaWYgKCFjbXNOYW1lZENvbG9ySW5mbyhOYW1lZENvbG9yTGlzdCwgaSwgQ29sb3JOYW1lLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBjbXNEb1RyYW5zZm9ybSh4Zm9ybSwgSW4sIE91dCwgMSk7CisgICAgICAgIEJ1aWxkQ29sb3JhbnRMaXN0KENvbG9yYW50LCBuQ29sb3JhbnQsIE91dCk7CisgICAgICAgIF9jbXNJT1ByaW50ZihtLCAiICAoJXMpIFsgJXMgXVxuIiwgQ29sb3JOYW1lLCBDb2xvcmFudCk7CisgICAgfQorCisgICAgX2Ntc0lPUHJpbnRmKG0sICIgICA+PiIpOworCisgICAgaWYgKCEoZHdGbGFncyAmIGNtc0ZMQUdTX05PREVGQVVMVFJFU09VUkNFREVGKSkgeworCisgICAgX2Ntc0lPUHJpbnRmKG0sICIgL0N1cnJlbnQgZXhjaCAvSFBTcG90VGFibGUgZGVmaW5lcmVzb3VyY2UgcG9wXG4iKTsKKyAgICB9CisKKyAgICBjbXNEZWxldGVUcmFuc2Zvcm0oeGZvcm0pOworICAgIHJldHVybiAxOworfQorCisKKworLy8gVGhpcyBvbmUgZG9lcyBjcmVhdGUgYSBDb2xvciBSZW5kZXJpbmcgRGljdGlvbmFyeS4KKy8vIENSRCBhcmUgYWx3YXlzIExVVC1CYXNlZCwgbm8gbWF0dGVyIGlmIHByb2ZpbGUgaXMKKy8vIGltcGxlbWVudGVkIGFzIG1hdHJpeC1zaGFwZXIuCisKK3N0YXRpYworY21zVUludDMyTnVtYmVyICBHZW5lcmF0ZUNSRChjbXNDb250ZXh0IENvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgaFByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNJT0hBTkRMRVIqIG1lbSkKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgZHdCeXRlc1VzZWQ7CisKKyAgICBpZiAoIShkd0ZsYWdzICYgY21zRkxBR1NfTk9ERUZBVUxUUkVTT1VSQ0VERUYpKSB7CisKKyAgICAgICAgRW1pdEhlYWRlcihtZW0sICJDb2xvciBSZW5kZXJpbmcgRGljdGlvbmFyeSAoQ1JEKSIsIGhQcm9maWxlKTsKKyAgICB9CisKKworICAgIC8vIElzIGEgbmFtZWQgY29sb3IgcHJvZmlsZT8KKyAgICBpZiAoY21zR2V0RGV2aWNlQ2xhc3MoaFByb2ZpbGUpID09IGNtc1NpZ05hbWVkQ29sb3JDbGFzcykgeworCisgICAgICAgIGlmICghV3JpdGVOYW1lZENvbG9yQ1JEKG1lbSwgaFByb2ZpbGUsIEludGVudCwgZHdGbGFncykpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgIC8vIENSRCBhcmUgYWx3YXlzIGltcGxlbWVudGVkIGFzIExVVAorCisgICAgICAgIGlmICghV3JpdGVPdXRwdXRMVVQobWVtLCBoUHJvZmlsZSwgSW50ZW50LCBkd0ZsYWdzKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIShkd0ZsYWdzICYgY21zRkxBR1NfTk9ERUZBVUxUUkVTT1VSQ0VERUYpKSB7CisKKyAgICAgICAgX2Ntc0lPUHJpbnRmKG1lbSwgIiUlJSVFbmRSZXNvdXJjZVxuIik7CisgICAgICAgIF9jbXNJT1ByaW50ZihtZW0sICJcbiUlIENSRCBFbmRcbiIpOworICAgIH0KKworICAgIC8vIERvbmUsIGtlZXAgbWVtb3J5IHVzYWdlCisgICAgZHdCeXRlc1VzZWQgPSBtZW0gLT5Vc2VkU3BhY2U7CisKKyAgICAvLyBGaW5hbGx5LCByZXR1cm4gdXNlZCBieXRlIGNvdW50CisgICAgcmV0dXJuIGR3Qnl0ZXNVc2VkOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihDb250ZXh0SUQpOworfQorCisKKworCitjbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0dldFBvc3RTY3JpcHRDb2xvclJlc291cmNlKGNtc0NvbnRleHQgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zUFNSZXNvdXJjZVR5cGUgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFIGhQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSU9IQU5ETEVSKiBpbykKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgIHJjOworCisKKyAgICBzd2l0Y2ggKFR5cGUpIHsKKworICAgICAgICBjYXNlIGNtc1BTX1JFU09VUkNFX0NTQToKKyAgICAgICAgICAgIHJjID0gR2VuZXJhdGVDU0EoQ29udGV4dElELCBoUHJvZmlsZSwgSW50ZW50LCBkd0ZsYWdzLCBpbyk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICBjYXNlIGNtc1BTX1JFU09VUkNFX0NSRDoKKyAgICAgICAgICAgIHJjID0gR2VuZXJhdGVDUkQoQ29udGV4dElELCBoUHJvZmlsZSwgSW50ZW50LCBkd0ZsYWdzLCBpbyk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcmM7Cit9CisKKworCitjbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0dldFBvc3RTY3JpcHRDUkQoY21zQ29udGV4dCBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSBoUHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogQnVmZmVyLCBjbXNVSW50MzJOdW1iZXIgZHdCdWZmZXJMZW4pCit7CisgICAgY21zSU9IQU5ETEVSKiBtZW07CisgICAgY21zVUludDMyTnVtYmVyIGR3Qnl0ZXNVc2VkOworCisgICAgLy8gU2V0IHVwIHRoZSBzZXJpYWxpemF0aW9uIGVuZ2luZQorICAgIGlmIChCdWZmZXIgPT0gTlVMTCkKKyAgICAgICAgbWVtID0gY21zT3BlbklPaGFuZGxlckZyb21OVUxMKENvbnRleHRJRCk7CisgICAgZWxzZQorICAgICAgICBtZW0gPSBjbXNPcGVuSU9oYW5kbGVyRnJvbU1lbShDb250ZXh0SUQsIEJ1ZmZlciwgZHdCdWZmZXJMZW4sICJ3Iik7CisKKyAgICBpZiAoIW1lbSkgcmV0dXJuIDA7CisKKyAgICBkd0J5dGVzVXNlZCA9ICBjbXNHZXRQb3N0U2NyaXB0Q29sb3JSZXNvdXJjZShDb250ZXh0SUQsIGNtc1BTX1JFU09VUkNFX0NSRCwgaFByb2ZpbGUsIEludGVudCwgZHdGbGFncywgbWVtKTsKKworICAgIC8vIEdldCByaWQgb2YgbWVtb3J5IHN0cmVhbQorICAgIGNtc0Nsb3NlSU9oYW5kbGVyKG1lbSk7CisKKyAgICByZXR1cm4gZHdCeXRlc1VzZWQ7Cit9CisKKworCisvLyBEb2VzIGNyZWF0ZSBhIENvbG9yIFNwYWNlIEFycmF5IG9uIFhZWiBjb2xvcnNwYWNlIGZvciBQb3N0U2NyaXB0IHVzYWdlCitjbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0dldFBvc3RTY3JpcHRDU0EoY21zQ29udGV4dCBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgaFByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3QnVmZmVyTGVuKQoreworICAgIGNtc0lPSEFORExFUiogbWVtOworICAgIGNtc1VJbnQzMk51bWJlciBkd0J5dGVzVXNlZDsKKworICAgIGlmIChCdWZmZXIgPT0gTlVMTCkKKyAgICAgICAgbWVtID0gY21zT3BlbklPaGFuZGxlckZyb21OVUxMKENvbnRleHRJRCk7CisgICAgZWxzZQorICAgICAgICBtZW0gPSBjbXNPcGVuSU9oYW5kbGVyRnJvbU1lbShDb250ZXh0SUQsIEJ1ZmZlciwgZHdCdWZmZXJMZW4sICJ3Iik7CisKKyAgICBpZiAoIW1lbSkgcmV0dXJuIDA7CisKKyAgICBkd0J5dGVzVXNlZCA9ICBjbXNHZXRQb3N0U2NyaXB0Q29sb3JSZXNvdXJjZShDb250ZXh0SUQsIGNtc1BTX1JFU09VUkNFX0NTQSwgaFByb2ZpbGUsIEludGVudCwgZHdGbGFncywgbWVtKTsKKworICAgIC8vIEdldCByaWQgb2YgbWVtb3J5IHN0cmVhbQorICAgIGNtc0Nsb3NlSU9oYW5kbGVyKG1lbSk7CisKKyAgICByZXR1cm4gZHdCeXRlc1VzZWQ7CisKK30KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3NhbXAuYyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3NhbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTk5N2ZhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zc2FtcC5jCkBAIC0wLDAgKzEsNTQ3IEBACisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KKy8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNiBNYXJ0aSBNYXJpYSBTYWd1ZXIKKy8vCisvLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKy8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKy8vIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKy8vIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorLy8gYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlCisvLyBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorLy8KKy8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisvLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKy8vCisvLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKy8vIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTworLy8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKy8vIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKKy8vIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKy8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisKKyNpbmNsdWRlICJsY21zMl9pbnRlcm5hbC5oIgorCisKKyNkZWZpbmUgY21zbWluKGEsIGIpICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgY21zbWF4KGEsIGIpICgoKGEpID4gKGIpKSA/IChhKSA6IChiKSkKKworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIGZvciByZXNhbXBsaW5nIGFuZCBMVVQgb3B0aW1pemF0aW9uLCBibGFjayBwb2ludCBkZXRlY3Rpb24KKy8vIGFuZCBibGFjayBwcmVzZXJ2YXRpb24uCisKKy8vIEJsYWNrIHBvaW50IGRldGVjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworLy8gUENTIC0+IFBDUyByb3VuZCB0cmlwIHRyYW5zZm9ybSwgYWx3YXlzIHVzZXMgcmVsYXRpdmUgaW50ZW50IG9uIHRoZSBkZXZpY2UgLT4gcGNzCitzdGF0aWMKK2Ntc0hUUkFOU0ZPUk0gQ3JlYXRlUm91bmR0cmlwWEZvcm0oY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBuSW50ZW50KQoreworICAgIGNtc0NvbnRleHQgQ29udGV4dElEID0gY21zR2V0UHJvZmlsZUNvbnRleHRJRChoUHJvZmlsZSk7CisgICAgY21zSFBST0ZJTEUgaExhYiA9IGNtc0NyZWF0ZUxhYjRQcm9maWxlVEhSKENvbnRleHRJRCwgTlVMTCk7CisgICAgY21zSFRSQU5TRk9STSB4Zm9ybTsKKyAgICBjbXNCb29sIEJQQ1s0XSA9IHsgRkFMU0UsIEZBTFNFLCBGQUxTRSwgRkFMU0UgfTsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIFN0YXRlc1s0XSA9IHsgMS4wLCAxLjAsIDEuMCwgMS4wIH07CisgICAgY21zSFBST0ZJTEUgaFByb2ZpbGVzWzRdOworICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnRzWzRdOworCisgICAgaFByb2ZpbGVzWzBdID0gaExhYjsgaFByb2ZpbGVzWzFdID0gaFByb2ZpbGU7IGhQcm9maWxlc1syXSA9IGhQcm9maWxlOyBoUHJvZmlsZXNbM10gPSBoTGFiOworICAgIEludGVudHNbMF0gICA9IElOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUM7IEludGVudHNbMV0gPSBuSW50ZW50OyBJbnRlbnRzWzJdID0gSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQzsgSW50ZW50c1szXSA9IElOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUM7CisKKyAgICB4Zm9ybSA9ICBjbXNDcmVhdGVFeHRlbmRlZFRyYW5zZm9ybShDb250ZXh0SUQsIDQsIGhQcm9maWxlcywgQlBDLCBJbnRlbnRzLAorICAgICAgICBTdGF0ZXMsIE5VTEwsIDAsIFRZUEVfTGFiX0RCTCwgVFlQRV9MYWJfREJMLCBjbXNGTEFHU19OT0NBQ0hFfGNtc0ZMQUdTX05PT1BUSU1JWkUpOworCisgICAgY21zQ2xvc2VQcm9maWxlKGhMYWIpOworICAgIHJldHVybiB4Zm9ybTsKK30KKworLy8gVXNlIGRhcmtlciBjb2xvcmFudHMgdG8gb2J0YWluIGJsYWNrIHBvaW50LiBUaGlzIHdvcmtzIGluIHRoZSByZWxhdGl2ZSBjb2xvcmltZXRyaWMgaW50ZW50IGFuZAorLy8gYXNzdW1lcyBtb3JlIGluayByZXN1bHRzIGluIGRhcmtlciBjb2xvcnMuIE5vIGluayBsaW1pdCBpcyBhc3N1bWVkLgorc3RhdGljCitjbXNCb29sICBCbGFja1BvaW50QXNEYXJrZXJDb2xvcmFudChjbXNIUFJPRklMRSAgICBoSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zQ0lFWFlaKiBCbGFja1BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpCit7CisgICAgY21zVUludDE2TnVtYmVyICpCbGFjazsKKyAgICBjbXNIVFJBTlNGT1JNIHhmb3JtOworICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgU3BhY2U7CisgICAgY21zVUludDMyTnVtYmVyIG5DaGFubmVsczsKKyAgICBjbXNVSW50MzJOdW1iZXIgZHdGb3JtYXQ7CisgICAgY21zSFBST0ZJTEUgaExhYjsKKyAgICBjbXNDSUVMYWIgIExhYjsKKyAgICBjbXNDSUVYWVogIEJsYWNrWFlaOworICAgIGNtc0NvbnRleHQgQ29udGV4dElEID0gY21zR2V0UHJvZmlsZUNvbnRleHRJRChoSW5wdXQpOworCisgICAgLy8gSWYgdGhlIHByb2ZpbGUgZG9lcyBub3Qgc3VwcG9ydCBpbnB1dCBkaXJlY3Rpb24sIGFzc3VtZSBCbGFjayBwb2ludCAwCisgICAgaWYgKCFjbXNJc0ludGVudFN1cHBvcnRlZChoSW5wdXQsIEludGVudCwgTENNU19VU0VEX0FTX0lOUFVUKSkgeworCisgICAgICAgIEJsYWNrUG9pbnQgLT4gWCA9IEJsYWNrUG9pbnQgLT5ZID0gQmxhY2tQb2ludCAtPiBaID0gMC4wOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgZm9ybWF0dGVyIHdoaWNoIGhhcyBuIGNoYW5uZWxzIGFuZCBmbG9hdGluZyBwb2ludAorICAgIGR3Rm9ybWF0ID0gY21zRm9ybWF0dGVyRm9yQ29sb3JzcGFjZU9mUHJvZmlsZShoSW5wdXQsIDIsIEZBTFNFKTsKKworICAgLy8gVHJ5IHRvIGdldCBibGFjayBieSB1c2luZyBibGFjayBjb2xvcmFudAorICAgIFNwYWNlID0gY21zR2V0Q29sb3JTcGFjZShoSW5wdXQpOworCisgICAgLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGRhcmtlciBjb2xvcmFudCBpbiAxNiBiaXRzIGZvciBzZXZlcmFsIHNwYWNlcworICAgIGlmICghX2Ntc0VuZFBvaW50c0J5U3BhY2UoU3BhY2UsIE5VTEwsICZCbGFjaywgJm5DaGFubmVscykpIHsKKworICAgICAgICBCbGFja1BvaW50IC0+IFggPSBCbGFja1BvaW50IC0+WSA9IEJsYWNrUG9pbnQgLT4gWiA9IDAuMDsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmIChuQ2hhbm5lbHMgIT0gVF9DSEFOTkVMUyhkd0Zvcm1hdCkpIHsKKyAgICAgICBCbGFja1BvaW50IC0+IFggPSBCbGFja1BvaW50IC0+WSA9IEJsYWNrUG9pbnQgLT4gWiA9IDAuMDsKKyAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLy8gTGFiIHdpbGwgYmUgdXNlZCBhcyB0aGUgb3V0cHV0IHNwYWNlLCBidXQgbGFiMiB3aWxsIGF2b2lkIHJlY3Vyc2lvbgorICAgIGhMYWIgPSBjbXNDcmVhdGVMYWIyUHJvZmlsZVRIUihDb250ZXh0SUQsIE5VTEwpOworICAgIGlmIChoTGFiID09IE5VTEwpIHsKKyAgICAgICBCbGFja1BvaW50IC0+IFggPSBCbGFja1BvaW50IC0+WSA9IEJsYWNrUG9pbnQgLT4gWiA9IDAuMDsKKyAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIHRoZSB0cmFuc2Zvcm0KKyAgICB4Zm9ybSA9IGNtc0NyZWF0ZVRyYW5zZm9ybVRIUihDb250ZXh0SUQsIGhJbnB1dCwgZHdGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhMYWIsIFRZUEVfTGFiX0RCTCwgSW50ZW50LCBjbXNGTEFHU19OT09QVElNSVpFfGNtc0ZMQUdTX05PQ0FDSEUpOworICAgIGNtc0Nsb3NlUHJvZmlsZShoTGFiKTsKKworICAgIGlmICh4Zm9ybSA9PSBOVUxMKSB7CisKKyAgICAgICAgLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcuIEdldCByaWQgb2Ygb3BlbiByZXNvdXJjZXMgYW5kIHJldHVybiB6ZXJvIGFzIGJsYWNrCisgICAgICAgIEJsYWNrUG9pbnQgLT4gWCA9IEJsYWNrUG9pbnQgLT5ZID0gQmxhY2tQb2ludCAtPiBaID0gMC4wOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLy8gQ29udmVydCBibGFjayB0byBMYWIKKyAgICBjbXNEb1RyYW5zZm9ybSh4Zm9ybSwgQmxhY2ssICZMYWIsIDEpOworCisgICAgLy8gRm9yY2UgaXQgdG8gYmUgbmV1dHJhbCwgY2xpcCB0byBtYXguIEwqIG9mIDUwCisgICAgTGFiLmEgPSBMYWIuYiA9IDA7CisgICAgaWYgKExhYi5MID4gNTApIExhYi5MID0gNTA7CisKKyAgICAvLyBGcmVlIHRoZSByZXNvdXJjZXMKKyAgICBjbXNEZWxldGVUcmFuc2Zvcm0oeGZvcm0pOworCisgICAgLy8gQ29udmVydCBmcm9tIExhYiAod2hpY2ggaXMgbm93IGNsaXBwZWQpIHRvIFhZWi4KKyAgICBjbXNMYWIyWFlaKE5VTEwsICZCbGFja1hZWiwgJkxhYik7CisKKyAgICBpZiAoQmxhY2tQb2ludCAhPSBOVUxMKQorICAgICAgICAqQmxhY2tQb2ludCA9IEJsYWNrWFlaOworCisgICAgcmV0dXJuIFRSVUU7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGR3RmxhZ3MpOworfQorCisvLyBHZXQgYSBibGFjayBwb2ludCBvZiBvdXRwdXQgQ01ZSyBwcm9maWxlLCBkaXNjb3VudGluZyBhbnkgaW5rLWxpbWl0aW5nIGVtYmVkZGVkCisvLyBpbiB0aGUgcHJvZmlsZS4gRm9yIGRvaW5nIHRoYXQsIHdlIHVzZSBwZXJjZXB0dWFsIGludGVudCBpbiBpbnB1dCBkaXJlY3Rpb246CisvLyBMYWIgKDAsIDAsIDApIC0+IFtQZXJjZXB0dWFsXSBQcm9maWxlIC0+IENNWUsgLT4gW1JlbC4gY29sb3JpbWV0cmljXSBQcm9maWxlIC0+IExhYgorc3RhdGljCitjbXNCb29sIEJsYWNrUG9pbnRVc2luZ1BlcmNlcHR1YWxCbGFjayhjbXNDSUVYWVoqIEJsYWNrUG9pbnQsIGNtc0hQUk9GSUxFIGhQcm9maWxlKQoreworICAgIGNtc0hUUkFOU0ZPUk0gaFJvdW5kVHJpcDsKKyAgICBjbXNDSUVMYWIgTGFiSW4sIExhYk91dDsKKyAgICBjbXNDSUVYWVogIEJsYWNrWFlaOworCisgICAgIC8vIElzIHRoZSBpbnRlbnQgc3VwcG9ydGVkIGJ5IHRoZSBwcm9maWxlPworICAgIGlmICghY21zSXNJbnRlbnRTdXBwb3J0ZWQoaFByb2ZpbGUsIElOVEVOVF9QRVJDRVBUVUFMLCBMQ01TX1VTRURfQVNfSU5QVVQpKSB7CisKKyAgICAgICAgQmxhY2tQb2ludCAtPiBYID0gQmxhY2tQb2ludCAtPlkgPSBCbGFja1BvaW50IC0+IFogPSAwLjA7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIGhSb3VuZFRyaXAgPSBDcmVhdGVSb3VuZHRyaXBYRm9ybShoUHJvZmlsZSwgSU5URU5UX1BFUkNFUFRVQUwpOworICAgIGlmIChoUm91bmRUcmlwID09IE5VTEwpIHsKKyAgICAgICAgQmxhY2tQb2ludCAtPiBYID0gQmxhY2tQb2ludCAtPlkgPSBCbGFja1BvaW50IC0+IFogPSAwLjA7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBMYWJJbi5MID0gTGFiSW4uYSA9IExhYkluLmIgPSAwOworICAgIGNtc0RvVHJhbnNmb3JtKGhSb3VuZFRyaXAsICZMYWJJbiwgJkxhYk91dCwgMSk7CisKKyAgICAvLyBDbGlwIExhYiB0byByZWFzb25hYmxlIGxpbWl0cworICAgIGlmIChMYWJPdXQuTCA+IDUwKSBMYWJPdXQuTCA9IDUwOworICAgIExhYk91dC5hID0gTGFiT3V0LmIgPSAwOworCisgICAgY21zRGVsZXRlVHJhbnNmb3JtKGhSb3VuZFRyaXApOworCisgICAgLy8gQ29udmVydCBpdCB0byBYWVoKKyAgICBjbXNMYWIyWFlaKE5VTEwsICZCbGFja1hZWiwgJkxhYk91dCk7CisKKyAgICBpZiAoQmxhY2tQb2ludCAhPSBOVUxMKQorICAgICAgICAqQmxhY2tQb2ludCA9IEJsYWNrWFlaOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkbid0IGV4aXN0IGF0IGFsbCAtLSB0aGVyZSBpcyBzdWNoIHF1YW50aXR5IG9mIGJyb2tlbgorLy8gcHJvZmlsZXMgb24gYmxhY2sgcG9pbnQgdGFnLCB0aGF0IHdlIG11c3Qgc29tZWhvdyBmaXggY2hyb21hdGljaXR5IHRvCisvLyBhdm9pZCBodWdlIHRpbnQgd2hlbiBkb2luZyBCbGFjayBwb2ludCBjb21wZW5zYXRpb24uIFRoaXMgZnVuY3Rpb24gZG9lcworLy8ganVzdCB0aGF0LiBUaGVyZSBpcyBhIHNwZWNpYWwgZmxhZyBmb3IgdXNpbmcgYmxhY2sgcG9pbnQgdGFnLCBidXQgdHVybmVkCisvLyBvZmYgYnkgZGVmYXVsdCBiZWNhdXNlIGl0IGlzIGJvZ3VzIG9uIG1vc3QgcHJvZmlsZXMuIFRoZSBkZXRlY3Rpb24gYWxnb3JpdGhtCisvLyBpbnZvbHZlcyB0byB0dXJuIEJQIHRvIG5ldXRyYWwgYW5kIHRvIHVzZSBvbmx5IEwgY29tcG9uZW50LgorY21zQm9vbCBDTVNFWFBPUlQgY21zRGV0ZWN0QmxhY2tQb2ludChjbXNDSUVYWVoqIEJsYWNrUG9pbnQsIGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50MzJOdW1iZXIgSW50ZW50LCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKK3sKKyAgICBjbXNQcm9maWxlQ2xhc3NTaWduYXR1cmUgZGV2Q2xhc3M7CisKKyAgICAvLyBNYWtlIHN1cmUgdGhlIGRldmljZSBjbGFzcyBpcyBhZGVxdWF0ZQorICAgIGRldkNsYXNzID0gY21zR2V0RGV2aWNlQ2xhc3MoaFByb2ZpbGUpOworICAgIGlmIChkZXZDbGFzcyA9PSBjbXNTaWdMaW5rQ2xhc3MgfHwKKyAgICAgICAgZGV2Q2xhc3MgPT0gY21zU2lnQWJzdHJhY3RDbGFzcyB8fAorICAgICAgICBkZXZDbGFzcyA9PSBjbXNTaWdOYW1lZENvbG9yQ2xhc3MpIHsKKyAgICAgICAgICAgIEJsYWNrUG9pbnQgLT4gWCA9IEJsYWNrUG9pbnQgLT5ZID0gQmxhY2tQb2ludCAtPiBaID0gMC4wOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8vIE1ha2Ugc3VyZSBpbnRlbnQgaXMgYWRlcXVhdGUKKyAgICBpZiAoSW50ZW50ICE9IElOVEVOVF9QRVJDRVBUVUFMICYmCisgICAgICAgIEludGVudCAhPSBJTlRFTlRfUkVMQVRJVkVfQ09MT1JJTUVUUklDICYmCisgICAgICAgIEludGVudCAhPSBJTlRFTlRfU0FUVVJBVElPTikgeworICAgICAgICAgICAgQmxhY2tQb2ludCAtPiBYID0gQmxhY2tQb2ludCAtPlkgPSBCbGFja1BvaW50IC0+IFogPSAwLjA7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLy8gdjQgKyBwZXJjZXB0dWFsICYgc2F0dXJhdGlvbiBpbnRlbnRzIGRvZXMgaGF2ZSBpdHMgb3duIGJsYWNrIHBvaW50LCBhbmQgaXQgaXMKKyAgICAvLyB3ZWxsIHNwZWNpZmllZCBlbm91Z2ggdG8gdXNlIGl0LiBCbGFjayBwb2ludCB0YWcgaXMgZGVwcmVjYXRlZCBpbiBWNC4KKyAgICBpZiAoKGNtc0dldEVuY29kZWRJQ0N2ZXJzaW9uKGhQcm9maWxlKSA+PSAweDQwMDAwMDApICYmCisgICAgICAgIChJbnRlbnQgPT0gSU5URU5UX1BFUkNFUFRVQUwgfHwgSW50ZW50ID09IElOVEVOVF9TQVRVUkFUSU9OKSkgeworCisgICAgICAgICAgICAvLyBNYXRyaXggc2hhcGVyIHNoYXJlIE1SQyAmIHBlcmNlcHR1YWwgaW50ZW50cworICAgICAgICAgICAgaWYgKGNtc0lzTWF0cml4U2hhcGVyKGhQcm9maWxlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQmxhY2tQb2ludEFzRGFya2VyQ29sb3JhbnQoaFByb2ZpbGUsIElOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUMsIEJsYWNrUG9pbnQsIDApOworCisgICAgICAgICAgICAvLyBHZXQgUGVyY2VwdHVhbCBibGFjayBvdXQgb2YgdjQgcHJvZmlsZXMuIFRoYXQgaXMgZml4ZWQgZm9yIHBlcmNlcHR1YWwgJiBzYXR1cmF0aW9uIGludGVudHMKKyAgICAgICAgICAgIEJsYWNrUG9pbnQgLT4gWCA9IGNtc1BFUkNFUFRVQUxfQkxBQ0tfWDsKKyAgICAgICAgICAgIEJsYWNrUG9pbnQgLT4gWSA9IGNtc1BFUkNFUFRVQUxfQkxBQ0tfWTsKKyAgICAgICAgICAgIEJsYWNrUG9pbnQgLT4gWiA9IGNtc1BFUkNFUFRVQUxfQkxBQ0tfWjsKKworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisKKyNpZmRlZiBDTVNfVVNFX1BST0ZJTEVfQkxBQ0tfUE9JTlRfVEFHCisKKyAgICAvLyB2MiwgdjQgcmVsL2FicyBjb2xvcmltZXRyaWMKKyAgICBpZiAoY21zSXNUYWcoaFByb2ZpbGUsIGNtc1NpZ01lZGlhQmxhY2tQb2ludFRhZykgJiYKKyAgICAgICAgSW50ZW50ID09IElOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUMpIHsKKworICAgICAgICAgICAgY21zQ0lFWFlaICpCbGFja1B0ciwgQmxhY2tYWVosIFVudHJ1c3RlZEJsYWNrUG9pbnQsIFRydXN0ZWRCbGFja1BvaW50LCBNZWRpYVdoaXRlOworICAgICAgICAgICAgY21zQ0lFTGFiIExhYjsKKworICAgICAgICAgICAgLy8gSWYgYmxhY2sgcG9pbnQgaXMgc3BlY2lmaWVkLCB0aGVuIHVzZSBpdCwKKworICAgICAgICAgICAgQmxhY2tQdHIgPSBjbXNSZWFkVGFnKGhQcm9maWxlLCBjbXNTaWdNZWRpYUJsYWNrUG9pbnRUYWcpOworICAgICAgICAgICAgaWYgKEJsYWNrUHRyICE9IE5VTEwpIHsKKworICAgICAgICAgICAgICAgIEJsYWNrWFlaID0gKkJsYWNrUHRyOworICAgICAgICAgICAgICAgIF9jbXNSZWFkTWVkaWFXaGl0ZVBvaW50KCZNZWRpYVdoaXRlLCBoUHJvZmlsZSk7CisKKyAgICAgICAgICAgICAgICAvLyBCbGFjayBwb2ludCBpcyBhYnNvbHV0ZSBYWVosIHNvIGFkYXB0IHRvIEQ1MCB0byBnZXQgUENTIHZhbHVlCisgICAgICAgICAgICAgICAgY21zQWRhcHRUb0lsbHVtaW5hbnQoJlVudHJ1c3RlZEJsYWNrUG9pbnQsICZNZWRpYVdoaXRlLCBjbXNENTBfWFlaKCksICZCbGFja1hZWik7CisKKyAgICAgICAgICAgICAgICAvLyBGb3JjZSBhPWI9MCB0byBnZXQgcmlkIG9mIGFueSBjaHJvbWEKKyAgICAgICAgICAgICAgICBjbXNYWVoyTGFiKE5VTEwsICZMYWIsICZVbnRydXN0ZWRCbGFja1BvaW50KTsKKyAgICAgICAgICAgICAgICBMYWIuYSA9IExhYi5iID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoTGFiLkwgPiA1MCkgTGFiLkwgPSA1MDsgLy8gQ2xpcCB0byBMKiA8PSA1MAorICAgICAgICAgICAgICAgIGNtc0xhYjJYWVooTlVMTCwgJlRydXN0ZWRCbGFja1BvaW50LCAmTGFiKTsKKworICAgICAgICAgICAgICAgIGlmIChCbGFja1BvaW50ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICpCbGFja1BvaW50ID0gVHJ1c3RlZEJsYWNrUG9pbnQ7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIC8vIFRoYXQgaXMgYWJvdXQgdjIgcHJvZmlsZXMuCisKKyAgICAvLyBJZiBvdXRwdXQgcHJvZmlsZSwgZGlzY291bnQgaW5rLWxpbWl0aW5nIGFuZCB0aGF0J3MgYWxsCisgICAgaWYgKEludGVudCA9PSBJTlRFTlRfUkVMQVRJVkVfQ09MT1JJTUVUUklDICYmCisgICAgICAgIChjbXNHZXREZXZpY2VDbGFzcyhoUHJvZmlsZSkgPT0gY21zU2lnT3V0cHV0Q2xhc3MpICYmCisgICAgICAgIChjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKSAgPT0gY21zU2lnQ215a0RhdGEpKQorICAgICAgICByZXR1cm4gQmxhY2tQb2ludFVzaW5nUGVyY2VwdHVhbEJsYWNrKEJsYWNrUG9pbnQsIGhQcm9maWxlKTsKKworICAgIC8vIE5vcGUsIGNvbXB1dGUgQlAgdXNpbmcgY3VycmVudCBpbnRlbnQuCisgICAgcmV0dXJuIEJsYWNrUG9pbnRBc0RhcmtlckNvbG9yYW50KGhQcm9maWxlLCBJbnRlbnQsIEJsYWNrUG9pbnQsIGR3RmxhZ3MpOworfQorCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIExlYXN0IFNxdWFyZXMgRml0IG9mIGEgUXVhZHJhdGljIEN1cnZlIHRvIERhdGEKKy8vIGh0dHA6Ly93d3cucGVyc29uYWwucHN1LmVkdS9qaG0vZjkwL2xlY3R1cmVzL2xzcTIuaHRtbAorCitzdGF0aWMKK2Ntc0Zsb2F0NjROdW1iZXIgUm9vdE9mTGVhc3RTcXVhcmVzRml0UXVhZHJhdGljQ3VydmUoaW50IG4sIGNtc0Zsb2F0NjROdW1iZXIgeFtdLCBjbXNGbG9hdDY0TnVtYmVyIHlbXSkKK3sKKyAgICBkb3VibGUgc3VtX3ggPSAwLCBzdW1feDIgPSAwLCBzdW1feDMgPSAwLCBzdW1feDQgPSAwOworICAgIGRvdWJsZSBzdW1feSA9IDAsIHN1bV95eCA9IDAsIHN1bV95eDIgPSAwOworICAgIGRvdWJsZSBkLCBhLCBiLCBjOworICAgIGludCBpOworICAgIGNtc01BVDMgbTsKKyAgICBjbXNWRUMzIHYsIHJlczsKKworICAgIGlmIChuIDwgNCkgcmV0dXJuIDA7CisKKyAgICBmb3IgKGk9MDsgaSA8IG47IGkrKykgeworCisgICAgICAgIGRvdWJsZSB4biA9IHhbaV07CisgICAgICAgIGRvdWJsZSB5biA9IHlbaV07CisKKyAgICAgICAgc3VtX3ggICs9IHhuOworICAgICAgICBzdW1feDIgKz0geG4qeG47CisgICAgICAgIHN1bV94MyArPSB4bip4bip4bjsKKyAgICAgICAgc3VtX3g0ICs9IHhuKnhuKnhuKnhuOworCisgICAgICAgIHN1bV95ICs9IHluOworICAgICAgICBzdW1feXggKz0geW4qeG47CisgICAgICAgIHN1bV95eDIgKz0geW4qeG4qeG47CisgICAgfQorCisgICAgX2Ntc1ZFQzNpbml0KCZtLnZbMF0sIG4sICAgICAgc3VtX3gsICBzdW1feDIpOworICAgIF9jbXNWRUMzaW5pdCgmbS52WzFdLCBzdW1feCwgIHN1bV94Miwgc3VtX3gzKTsKKyAgICBfY21zVkVDM2luaXQoJm0udlsyXSwgc3VtX3gyLCBzdW1feDMsIHN1bV94NCk7CisKKyAgICBfY21zVkVDM2luaXQoJnYsIHN1bV95LCBzdW1feXgsIHN1bV95eDIpOworCisgICAgaWYgKCFfY21zTUFUM3NvbHZlKCZyZXMsICZtLCAmdikpIHJldHVybiAwOworCisgICAgICAKKyAgICBhID0gcmVzLm5bMl07CisgICAgYiA9IHJlcy5uWzFdOworICAgIGMgPSByZXMublswXTsKKworICAgIGlmIChmYWJzKGEpIDwgMS4wRS0xMCkgeworICAgIAorICAgICAgICByZXR1cm4gY21zbWluKDAsIGNtc21heCg1MCwgLWMvYiApKTsKKyAgICB9CisgICAgZWxzZSB7CisKKyAgICAgICAgIGQgPSBiKmIgLSA0LjAgKiBhICogYzsKKyAgICAgICAgIGlmIChkIDw9IDApIHsKKyAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgIH0KKyAgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAgZG91YmxlIHJ0ID0gKC1iICsgc3FydChkKSkgLyAoMi4wICogYSk7CisKKyAgICAgICAgICAgICByZXR1cm4gY21zbWF4KDAsIGNtc21pbig1MCwgcnQpKTsKKyAgICAgICAgIH0KKyAgIH0KKworfQorCisKKworLy8gQ2FsY3VsYXRlcyB0aGUgYmxhY2sgcG9pbnQgb2YgYSBkZXN0aW5hdGlvbiBwcm9maWxlLgorLy8gVGhpcyBhbGdvcml0aG0gY29tZXMgZnJvbSB0aGUgQWRvYmUgcGFwZXIgZGlzY2xvc2luZyBpdHMgYmxhY2sgcG9pbnQgY29tcGVuc2F0aW9uIG1ldGhvZC4KK2Ntc0Jvb2wgQ01TRVhQT1JUIGNtc0RldGVjdERlc3RpbmF0aW9uQmxhY2tQb2ludChjbXNDSUVYWVoqIEJsYWNrUG9pbnQsIGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50MzJOdW1iZXIgSW50ZW50LCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKK3sKKyAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2U7CisgICAgY21zSFRSQU5TRk9STSBoUm91bmRUcmlwID0gTlVMTDsKKyAgICBjbXNDSUVMYWIgSW5pdGlhbExhYiwgZGVzdExhYiwgTGFiOworICAgIGNtc0Zsb2F0NjROdW1iZXIgaW5SYW1wWzI1Nl0sIG91dFJhbXBbMjU2XTsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIE1pbkwsIE1heEw7CisgICAgY21zQm9vbCBOZWFybHlTdHJhaWdodE1pZHJhbmdlID0gVFJVRTsgIAorICAgIGNtc0Zsb2F0NjROdW1iZXIgeVJhbXBbMjU2XTsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIHhbMjU2XSwgeVsyNTZdOworICAgIGNtc0Zsb2F0NjROdW1iZXIgbG8sIGhpOworICAgIGludCBuLCBsOworICAgIGNtc1Byb2ZpbGVDbGFzc1NpZ25hdHVyZSBkZXZDbGFzczsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGUgZGV2aWNlIGNsYXNzIGlzIGFkZXF1YXRlCisgICAgZGV2Q2xhc3MgPSBjbXNHZXREZXZpY2VDbGFzcyhoUHJvZmlsZSk7CisgICAgaWYgKGRldkNsYXNzID09IGNtc1NpZ0xpbmtDbGFzcyB8fAorICAgICAgICBkZXZDbGFzcyA9PSBjbXNTaWdBYnN0cmFjdENsYXNzIHx8CisgICAgICAgIGRldkNsYXNzID09IGNtc1NpZ05hbWVkQ29sb3JDbGFzcykgeworICAgICAgICAgICAgQmxhY2tQb2ludCAtPiBYID0gQmxhY2tQb2ludCAtPlkgPSBCbGFja1BvaW50IC0+IFogPSAwLjA7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIGludGVudCBpcyBhZGVxdWF0ZQorICAgIGlmIChJbnRlbnQgIT0gSU5URU5UX1BFUkNFUFRVQUwgJiYKKyAgICAgICAgSW50ZW50ICE9IElOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUMgJiYKKyAgICAgICAgSW50ZW50ICE9IElOVEVOVF9TQVRVUkFUSU9OKSB7CisgICAgICAgICAgICBCbGFja1BvaW50IC0+IFggPSBCbGFja1BvaW50IC0+WSA9IEJsYWNrUG9pbnQgLT4gWiA9IDAuMDsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKworICAgIC8vIHY0ICsgcGVyY2VwdHVhbCAmIHNhdHVyYXRpb24gaW50ZW50cyBkb2VzIGhhdmUgaXRzIG93biBibGFjayBwb2ludCwgYW5kIGl0IGlzCisgICAgLy8gd2VsbCBzcGVjaWZpZWQgZW5vdWdoIHRvIHVzZSBpdC4gQmxhY2sgcG9pbnQgdGFnIGlzIGRlcHJlY2F0ZWQgaW4gVjQuCisgICAgaWYgKChjbXNHZXRFbmNvZGVkSUNDdmVyc2lvbihoUHJvZmlsZSkgPj0gMHg0MDAwMDAwKSAmJgorICAgICAgICAoSW50ZW50ID09IElOVEVOVF9QRVJDRVBUVUFMIHx8IEludGVudCA9PSBJTlRFTlRfU0FUVVJBVElPTikpIHsKKworICAgICAgICAgICAgLy8gTWF0cml4IHNoYXBlciBzaGFyZSBNUkMgJiBwZXJjZXB0dWFsIGludGVudHMKKyAgICAgICAgICAgIGlmIChjbXNJc01hdHJpeFNoYXBlcihoUHJvZmlsZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEJsYWNrUG9pbnRBc0RhcmtlckNvbG9yYW50KGhQcm9maWxlLCBJTlRFTlRfUkVMQVRJVkVfQ09MT1JJTUVUUklDLCBCbGFja1BvaW50LCAwKTsKKworICAgICAgICAgICAgLy8gR2V0IFBlcmNlcHR1YWwgYmxhY2sgb3V0IG9mIHY0IHByb2ZpbGVzLiBUaGF0IGlzIGZpeGVkIGZvciBwZXJjZXB0dWFsICYgc2F0dXJhdGlvbiBpbnRlbnRzCisgICAgICAgICAgICBCbGFja1BvaW50IC0+IFggPSBjbXNQRVJDRVBUVUFMX0JMQUNLX1g7CisgICAgICAgICAgICBCbGFja1BvaW50IC0+IFkgPSBjbXNQRVJDRVBUVUFMX0JMQUNLX1k7CisgICAgICAgICAgICBCbGFja1BvaW50IC0+IFogPSBjbXNQRVJDRVBUVUFMX0JMQUNLX1o7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKworICAgIC8vIENoZWNrIGlmIHRoZSBwcm9maWxlIGlzIGx1dCBiYXNlZCBhbmQgZ3JheSwgcmdiIG9yIGNteWsgKDcuMiBpbiBBZG9iZSdzIGRvY3VtZW50KQorICAgIENvbG9yU3BhY2UgPSBjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKTsKKyAgICBpZiAoIWNtc0lzQ0xVVChoUHJvZmlsZSwgSW50ZW50LCBMQ01TX1VTRURfQVNfT1VUUFVUICkgfHwKKyAgICAgICAgKENvbG9yU3BhY2UgIT0gY21zU2lnR3JheURhdGEgJiYKKyAgICAgICAgIENvbG9yU3BhY2UgIT0gY21zU2lnUmdiRGF0YSAgJiYKKyAgICAgICAgIENvbG9yU3BhY2UgIT0gY21zU2lnQ215a0RhdGEpKSB7CisKKyAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCBoYW5kbGUgYXMgaW5wdXQgY2FzZQorICAgICAgICByZXR1cm4gY21zRGV0ZWN0QmxhY2tQb2ludChCbGFja1BvaW50LCBoUHJvZmlsZSwgSW50ZW50LCBkd0ZsYWdzKTsKKyAgICB9CisKKyAgICAvLyBJdCBpcyBvbmUgb2YgdGhlIHZhbGlkIGNhc2VzISwgdXNlIEFkb2JlIGFsZ29yaXRobQorCisgICAgCisgICAgLy8gU2V0IGEgZmlyc3QgZ3Vlc3MsIHRoYXQgc2hvdWxkIHdvcmsgb24gZ29vZCBwcm9maWxlcy4KKyAgICBpZiAoSW50ZW50ID09IElOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUMpIHsKKworICAgICAgICBjbXNDSUVYWVogSW5pWFlaOworCisgICAgICAgIC8vIGNhbGN1bGF0ZSBpbml0aWFsIExhYiBhcyBzb3VyY2UgYmxhY2sgcG9pbnQKKyAgICAgICAgaWYgKCFjbXNEZXRlY3RCbGFja1BvaW50KCZJbmlYWVosIGhQcm9maWxlLCBJbnRlbnQsIGR3RmxhZ3MpKSB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb252ZXJ0IHRoZSBYWVogdG8gbGFiCisgICAgICAgIGNtc1hZWjJMYWIoTlVMTCwgJkluaXRpYWxMYWIsICZJbmlYWVopOworCisgICAgfSBlbHNlIHsKKworICAgICAgICAvLyBzZXQgdGhlIGluaXRpYWwgTGFiIHRvIHplcm8sIHRoYXQgc2hvdWxkIGJlIHRoZSBibGFjayBwb2ludCBmb3IgcGVyY2VwdHVhbCBhbmQgc2F0dXJhdGlvbgorICAgICAgICBJbml0aWFsTGFiLkwgPSAwOworICAgICAgICBJbml0aWFsTGFiLmEgPSAwOworICAgICAgICBJbml0aWFsTGFiLmIgPSAwOworICAgIH0KKworCisgICAgLy8gU3RlcCAyCisgICAgLy8gPT09PT09CisKKyAgICAvLyBDcmVhdGUgYSByb3VuZHRyaXAuIERlZmluZSBhIFRyYW5zZm9ybSBCVCBmb3IgYWxsIHggaW4gTCphKmIqCisgICAgaFJvdW5kVHJpcCA9IENyZWF0ZVJvdW5kdHJpcFhGb3JtKGhQcm9maWxlLCBJbnRlbnQpOworICAgIGlmIChoUm91bmRUcmlwID09IE5VTEwpICByZXR1cm4gRkFMU0U7CisKKyAgICAvLyBDb21wdXRlIHJhbXBzCisKKyAgICBmb3IgKGw9MDsgbCA8IDI1NjsgbCsrKSB7CisKKyAgICAgICAgTGFiLkwgPSAoY21zRmxvYXQ2NE51bWJlcikgKGwgKiAxMDAuMCkgLyAyNTUuMDsKKyAgICAgICAgTGFiLmEgPSBjbXNtaW4oNTAsIGNtc21heCgtNTAsIEluaXRpYWxMYWIuYSkpOworICAgICAgICBMYWIuYiA9IGNtc21pbig1MCwgY21zbWF4KC01MCwgSW5pdGlhbExhYi5iKSk7CisKKyAgICAgICAgY21zRG9UcmFuc2Zvcm0oaFJvdW5kVHJpcCwgJkxhYiwgJmRlc3RMYWIsIDEpOworCisgICAgICAgIGluUmFtcFtsXSAgPSBMYWIuTDsKKyAgICAgICAgb3V0UmFtcFtsXSA9IGRlc3RMYWIuTDsKKyAgICB9CisKKyAgICAvLyBNYWtlIG1vbm90b25pYworICAgIGZvciAobCA9IDI1NDsgbCA+IDA7IC0tbCkgeworICAgICAgICBvdXRSYW1wW2xdID0gY21zbWluKG91dFJhbXBbbF0sIG91dFJhbXBbbCsxXSk7CisgICAgfQorCisgICAgLy8gQ2hlY2sKKyAgICBpZiAoISAob3V0UmFtcFswXSA8IG91dFJhbXBbMjU1XSkpIHsKKworICAgICAgICBjbXNEZWxldGVUcmFuc2Zvcm0oaFJvdW5kVHJpcCk7CisgICAgICAgIEJsYWNrUG9pbnQgLT4gWCA9IEJsYWNrUG9pbnQgLT5ZID0gQmxhY2tQb2ludCAtPiBaID0gMC4wOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisKKyAgICAvLyBUZXN0IGZvciBtaWQgcmFuZ2Ugc3RyYWlnaHQgKG9ubHkgb24gcmVsYXRpdmUgY29sb3JpbWV0cmljKQorICAgIE5lYXJseVN0cmFpZ2h0TWlkcmFuZ2UgPSBUUlVFOworICAgIE1pbkwgPSBvdXRSYW1wWzBdOyBNYXhMID0gb3V0UmFtcFsyNTVdOworICAgIGlmIChJbnRlbnQgPT0gSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQykgeworICAgICAgCisgICAgICAgIGZvciAobD0wOyBsIDwgMjU2OyBsKyspIHsKKworICAgICAgICAgICAgaWYgKCEgKChpblJhbXBbbF0gPD0gTWluTCArIDAuMiAqIChNYXhMIC0gTWluTCkgKSB8fCAgIAorICAgICAgICAgICAgICAgIChmYWJzKGluUmFtcFtsXSAtIG91dFJhbXBbbF0pIDwgNC4wICkpKQorICAgICAgICAgICAgICAgIE5lYXJseVN0cmFpZ2h0TWlkcmFuZ2UgPSBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSBtaWQgcmFuZ2UgaXMgc3RyYWlnaHQgKGFzIGRldGVybWluZWQgYWJvdmUpIHRoZW4gdGhlIAorICAgICAgICAvLyBEZXN0aW5hdGlvbkJsYWNrUG9pbnQgc2hhbGwgYmUgdGhlIHNhbWUgYXMgaW5pdGlhbExhYi4gCisgICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIERlc3RpbmF0aW9uQmxhY2tQb2ludCBzaGFsbCBiZSBkZXRlcm1pbmVkIAorICAgICAgICAvLyB1c2luZyBjdXJ2ZSBmaXR0aW5nLgorICAgICAgICBpZiAoTmVhcmx5U3RyYWlnaHRNaWRyYW5nZSkgeworCisgICAgICAgICAgICBjbXNMYWIyWFlaKE5VTEwsIEJsYWNrUG9pbnQsICZJbml0aWFsTGFiKTsKKyAgICAgICAgICAgIGNtc0RlbGV0ZVRyYW5zZm9ybShoUm91bmRUcmlwKTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgfQorCisgCisgICAgLy8gY3VydmUgZml0dGluZzogVGhlIHJvdW5kLXRyaXAgY3VydmUgbm9ybWFsbHkgbG9va3MgbGlrZSBhIG5lYXJseSBjb25zdGFudCBzZWN0aW9uIGF0IHRoZSBibGFjayBwb2ludCwKKyAgICAvLyB3aXRoIGEgY29ybmVyIGFuZCBhIG5lYXJseSBzdHJhaWdodCBsaW5lIHRvIHRoZSB3aGl0ZSBwb2ludC4gIAorICAgIGZvciAobD0wOyBsIDwgMjU2OyBsKyspIHsKKyAgICAKKyAgICAgICAgeVJhbXBbbF0gPSAob3V0UmFtcFtsXSAtIE1pbkwpIC8gKE1heEwgLSBNaW5MKTsKKyAgICB9CisKKyAgICAvLyBmaW5kIHRoZSBibGFjayBwb2ludCB1c2luZyB0aGUgbGVhc3Qgc3F1YXJlcyBlcnJvciBxdWFkcmF0aWMgY3VydmUgZml0dGluZworICAgIGlmIChJbnRlbnQgPT0gSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQykgeworICAgICAgICBsbyA9IDAuMTsKKyAgICAgICAgaGkgPSAwLjU7CisgICAgfQorICAgIGVsc2UgeworCisgICAgICAgIC8vIFBlcmNlcHR1YWwgYW5kIHNhdHVyYXRpb24KKyAgICAgICAgbG8gPSAwLjAzOworICAgICAgICBoaSA9IDAuMjU7CisgICAgfQorCisgICAgLy8gQ2FwdHVyZSBzaGFkb3cgcG9pbnRzIGZvciB0aGUgZml0dGluZy4KKyAgICBuID0gMDsKKyAgICBmb3IgKGw9MDsgbCA8IDI1NjsgbCsrKSB7CisgICAgCisgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgZmYgPSB5UmFtcFtsXTsKKworICAgICAgICBpZiAoZmYgPj0gbG8gJiYgZmYgPCBoaSkgeworICAgICAgICAgICAgeFtuXSA9IGluUmFtcFtsXTsKKyAgICAgICAgICAgIHlbbl0gPSB5UmFtcFtsXTsKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgfSAgICAKKyAgICB9CisKKyAgICAKKyAgICAvLyBObyBzdWl0YWJsZSBwb2ludHMKKyAgICBpZiAobiA8IDMgKSB7CisgICAgICAgIGNtc0RlbGV0ZVRyYW5zZm9ybShoUm91bmRUcmlwKTsKKyAgICAgICAgQmxhY2tQb2ludCAtPiBYID0gQmxhY2tQb2ludCAtPlkgPSBCbGFja1BvaW50IC0+IFogPSAwLjA7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgCisgICAgLy8gZml0IGFuZCBnZXQgdGhlIHZlcnRleCBvZiBxdWFkcmF0aWMgY3VydmUKKyAgICBMYWIuTCA9IFJvb3RPZkxlYXN0U3F1YXJlc0ZpdFF1YWRyYXRpY0N1cnZlKG4sIHgsIHkpOworCisgICAgaWYgKExhYi5MIDwgMC4wKSB7IC8vIGNsaXAgdG8gemVybyBMKiBpZiB0aGUgdmVydGV4IGlzIG5lZ2F0aXZlCisgICAgICAgIExhYi5MID0gMDsKKyAgICB9CisKKyAgICBMYWIuYSA9IEluaXRpYWxMYWIuYTsKKyAgICBMYWIuYiA9IEluaXRpYWxMYWIuYjsKKworICAgIGNtc0xhYjJYWVooTlVMTCwgQmxhY2tQb2ludCwgJkxhYik7CisKKyAgICBjbXNEZWxldGVUcmFuc2Zvcm0oaFJvdW5kVHJpcCk7CisgICAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXNzbS5jIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zc20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjdjYjdmCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zc20uYwpAQCAtMCwwICsxLDczNiBAQAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCisvLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTYgTWFydGkgTWFyaWEgU2FndWVyCisvLworLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisvLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisvLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisvLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKy8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQorLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKy8vCisvLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisvLworLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisvLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KKy8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisvLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCisvLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisvLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKy8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworCisjaW5jbHVkZSAibGNtczJfaW50ZXJuYWwuaCIKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gR2FtdXQgYm91bmRhcnkgZGVzY3JpcHRpb24gYnkgdXNpbmcgSmFuIE1vcm92aWMncyBTZWdtZW50IG1heGltYSBtZXRob2QKKy8vIE1hbnkgdGhhbmtzIHRvIEphbiBmb3IgYWxsb3dpbmcgbWUgdG8gdXNlIGhpcyBhbGdvcml0aG0uCisKKy8vIHIgPSBDKgorLy8gYWxwaGEgPSBIYWIKKy8vIHRoZXRhID0gTCoKKworI2RlZmluZSBTRUNUT1JTIDE2ICAgICAgLy8gbnVtYmVyIG9mIGRpdmlzaW9ucyBpbiBhbHBoYSBhbmQgdGhldGEKKworLy8gU3BoZXJpY2FsIGNvb3JkaW5hdGVzCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBjbXNGbG9hdDY0TnVtYmVyIHI7CisgICAgY21zRmxvYXQ2NE51bWJlciBhbHBoYTsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIHRoZXRhOworCit9IGNtc1NwaGVyaWNhbDsKKwordHlwZWRlZiAgZW51bSB7CisgICAgICAgIEdQX0VNUFRZLAorICAgICAgICBHUF9TUEVDSUZJRUQsCisgICAgICAgIEdQX01PREVMRUQKKworICAgIH0gR0RCUG9pbnRUeXBlOworCisKK3R5cGVkZWYgc3RydWN0IHsKKworICAgIEdEQlBvaW50VHlwZSBUeXBlOworICAgIGNtc1NwaGVyaWNhbCBwOyAgICAgICAgIC8vIEtlZXAgYWxzbyBhbHBoYSAmIHRoZXRhIG9mIG1heGltdW0KKworfSBjbXNHREJQb2ludDsKKworCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBjbXNDb250ZXh0IENvbnRleHRJRDsKKyAgICBjbXNHREJQb2ludCBHYW11dFtTRUNUT1JTXVtTRUNUT1JTXTsKKworfSBjbXNHREI7CisKKworLy8gQSBsaW5lIHVzaW5nIHRoZSBwYXJhbWV0cmljIGZvcm0KKy8vIFAgPSBhICsgdCp1Cit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBjbXNWRUMzIGE7CisgICAgY21zVkVDMyB1OworCit9IGNtc0xpbmU7CisKKworLy8gQSBwbGFuZSB1c2luZyB0aGUgcGFyYW1ldHJpYyBmb3JtCisvLyBRID0gYiArIHIqdiArIHMqdwordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgY21zVkVDMyBiOworICAgIGNtc1ZFQzMgdjsKKyAgICBjbXNWRUMzIHc7CisKK30gY21zUGxhbmU7CisKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBBVEFOMigpIHdoaWNoIGFsd2F5cyByZXR1cm5zIGRlZ3JlZSBwb3NpdGl2ZSBudW1iZXJzCisKK3N0YXRpYworY21zRmxvYXQ2NE51bWJlciBfY21zQXRhbjIoY21zRmxvYXQ2NE51bWJlciB5LCBjbXNGbG9hdDY0TnVtYmVyIHgpCit7CisgICAgY21zRmxvYXQ2NE51bWJlciBhOworCisgICAgLy8gRGVhbCB3aXRoIHVuZGVmaW5lZCBjYXNlCisgICAgaWYgKHggPT0gMC4wICYmIHkgPT0gMC4wKSByZXR1cm4gMDsKKworICAgIGEgPSAoYXRhbjIoeSwgeCkgKiAxODAuMCkgLyBNX1BJOworCisgICAgd2hpbGUgKGEgPCAwKSB7CisgICAgICAgIGEgKz0gMzYwOworICAgIH0KKworICAgIHJldHVybiBhOworfQorCisvLyBDb252ZXJ0IHRvIHNwaGVyaWNhbCBjb29yZGluYXRlcworc3RhdGljCit2b2lkIFRvU3BoZXJpY2FsKGNtc1NwaGVyaWNhbCogc3AsIGNvbnN0IGNtc1ZFQzMqIHYpCit7CisKKyAgICBjbXNGbG9hdDY0TnVtYmVyIEwsIGEsIGI7CisKKyAgICBMID0gdiAtPm5bVlhdOworICAgIGEgPSB2IC0+bltWWV07CisgICAgYiA9IHYgLT5uW1ZaXTsKKworICAgIHNwIC0+ciA9IHNxcnQoIEwqTCArIGEqYSArIGIqYiApOworCisgICBpZiAoc3AgLT5yID09IDApIHsKKyAgICAgICAgc3AgLT5hbHBoYSA9IHNwIC0+dGhldGEgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3AgLT5hbHBoYSA9IF9jbXNBdGFuMihhLCBiKTsKKyAgICBzcCAtPnRoZXRhID0gX2Ntc0F0YW4yKHNxcnQoYSphICsgYipiKSwgTCk7Cit9CisKKworLy8gQ29udmVydCB0byBjYXJ0ZXNpYW4gZnJvbSBzcGhlcmljYWwKK3N0YXRpYwordm9pZCBUb0NhcnRlc2lhbihjbXNWRUMzKiB2LCBjb25zdCBjbXNTcGhlcmljYWwqIHNwKQoreworICAgIGNtc0Zsb2F0NjROdW1iZXIgc2luX2FscGhhOworICAgIGNtc0Zsb2F0NjROdW1iZXIgY29zX2FscGhhOworICAgIGNtc0Zsb2F0NjROdW1iZXIgc2luX3RoZXRhOworICAgIGNtc0Zsb2F0NjROdW1iZXIgY29zX3RoZXRhOworICAgIGNtc0Zsb2F0NjROdW1iZXIgTCwgYSwgYjsKKworICAgIHNpbl9hbHBoYSA9IHNpbigoTV9QSSAqIHNwIC0+YWxwaGEpIC8gMTgwLjApOworICAgIGNvc19hbHBoYSA9IGNvcygoTV9QSSAqIHNwIC0+YWxwaGEpIC8gMTgwLjApOworICAgIHNpbl90aGV0YSA9IHNpbigoTV9QSSAqIHNwIC0+dGhldGEpIC8gMTgwLjApOworICAgIGNvc190aGV0YSA9IGNvcygoTV9QSSAqIHNwIC0+dGhldGEpIC8gMTgwLjApOworCisgICAgYSA9IHNwIC0+ciAqIHNpbl90aGV0YSAqIHNpbl9hbHBoYTsKKyAgICBiID0gc3AgLT5yICogc2luX3RoZXRhICogY29zX2FscGhhOworICAgIEwgPSBzcCAtPnIgKiBjb3NfdGhldGE7CisKKyAgICB2IC0+bltWWF0gPSBMOworICAgIHYgLT5uW1ZZXSA9IGE7CisgICAgdiAtPm5bVlpdID0gYjsKK30KKworCisvLyBRdWFudGl6ZSBzZWN0b3Igb2YgYSBzcGhlcmljYWwgY29vcmRpbmF0ZS4gU2F0dXJhdGUgMzYwLCAxODAgdG8gbGFzdCBzZWN0b3IKKy8vIFRoZSBsaW1pdHMgYXJlIHRoZSBjZW50ZXJzIG9mIGVhY2ggc2VjdG9yLCBzbworc3RhdGljCit2b2lkIFF1YW50aXplVG9TZWN0b3IoY29uc3QgY21zU3BoZXJpY2FsKiBzcCwgaW50KiBhbHBoYSwgaW50KiB0aGV0YSkKK3sKKyAgICAqYWxwaGEgPSAoaW50KSBmbG9vcigoKHNwLT5hbHBoYSAqIChTRUNUT1JTKSkgLyAzNjAuMCkgKTsKKyAgICAqdGhldGEgPSAoaW50KSBmbG9vcigoKHNwLT50aGV0YSAqIChTRUNUT1JTKSkgLyAxODAuMCkgKTsKKworICAgIGlmICgqYWxwaGEgPj0gU0VDVE9SUykKKyAgICAgICAgKmFscGhhID0gU0VDVE9SUy0xOworICAgIGlmICgqdGhldGEgPj0gU0VDVE9SUykKKyAgICAgICAgKnRoZXRhID0gU0VDVE9SUy0xOworfQorCisKKy8vIExpbmUgZGV0ZXJtaW5lZCBieSAyIHBvaW50cworc3RhdGljCit2b2lkIExpbmVPZjJQb2ludHMoY21zTGluZSogbGluZSwgY21zVkVDMyogYSwgY21zVkVDMyogYikKK3sKKworICAgIF9jbXNWRUMzaW5pdCgmbGluZSAtPmEsIGEgLT5uW1ZYXSwgYSAtPm5bVlldLCBhIC0+bltWWl0pOworICAgIF9jbXNWRUMzaW5pdCgmbGluZSAtPnUsIGIgLT5uW1ZYXSAtIGEgLT5uW1ZYXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiIC0+bltWWV0gLSBhIC0+bltWWV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiAtPm5bVlpdIC0gYSAtPm5bVlpdKTsKK30KKworCisvLyBFdmFsdWF0ZSBwYXJhbWV0cmljIGxpbmUKK3N0YXRpYwordm9pZCBHZXRQb2ludE9mTGluZShjbXNWRUMzKiBwLCBjb25zdCBjbXNMaW5lKiBsaW5lLCBjbXNGbG9hdDY0TnVtYmVyIHQpCit7CisgICAgcCAtPm5bVlhdID0gbGluZSAtPmEubltWWF0gKyB0ICogbGluZS0+dS5uW1ZYXTsKKyAgICBwIC0+bltWWV0gPSBsaW5lIC0+YS5uW1ZZXSArIHQgKiBsaW5lLT51Lm5bVlldOworICAgIHAgLT5uW1ZaXSA9IGxpbmUgLT5hLm5bVlpdICsgdCAqIGxpbmUtPnUubltWWl07Cit9CisKKworCisvKgorICAgIENsb3Nlc3QgcG9pbnQgaW4gc2VjdG9yIGxpbmUxIHRvIHNlY3RvciBsaW5lMiAoYm90aCBhcmUgZGVmaW5lZCBhcyAwIDw9dCA8PSAxKQorICAgIGh0dHA6Ly9zb2Z0c3VyZmVyLmNvbS9BcmNoaXZlL2FsZ29yaXRobV8wMTA2L2FsZ29yaXRobV8wMTA2Lmh0bQorCisgICAgQ29weXJpZ2h0IDIwMDEsIHNvZnRTdXJmZXIgKHd3dy5zb2Z0c3VyZmVyLmNvbSkKKyAgICBUaGlzIGNvZGUgbWF5IGJlIGZyZWVseSB1c2VkIGFuZCBtb2RpZmllZCBmb3IgYW55IHB1cnBvc2UKKyAgICBwcm92aWRpbmcgdGhhdCB0aGlzIGNvcHlyaWdodCBub3RpY2UgaXMgaW5jbHVkZWQgd2l0aCBpdC4KKyAgICBTb2Z0U3VyZmVyIG1ha2VzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGNvZGUsIGFuZCBjYW5ub3QgYmUgaGVsZAorICAgIGxpYWJsZSBmb3IgYW55IHJlYWwgb3IgaW1hZ2luZWQgZGFtYWdlIHJlc3VsdGluZyBmcm9tIGl0cyB1c2UuCisgICAgVXNlcnMgb2YgdGhpcyBjb2RlIG11c3QgdmVyaWZ5IGNvcnJlY3RuZXNzIGZvciB0aGVpciBhcHBsaWNhdGlvbi4KKworKi8KKworc3RhdGljCitjbXNCb29sIENsb3Nlc3RMaW5lVG9MaW5lKGNtc1ZFQzMqIHIsIGNvbnN0IGNtc0xpbmUqIGxpbmUxLCBjb25zdCBjbXNMaW5lKiBsaW5lMikKK3sKKyAgICBjbXNGbG9hdDY0TnVtYmVyIGEsIGIsIGMsIGQsIGUsIEQ7CisgICAgY21zRmxvYXQ2NE51bWJlciBzYywgc04sIHNEOworICAgIC8vY21zRmxvYXQ2NE51bWJlciB0YzsgLy8gbGVmdCBmb3IgZnV0dXJlIHVzZQorICAgIGNtc0Zsb2F0NjROdW1iZXIgdE4sIHREOworICAgIGNtc1ZFQzMgdzA7CisKKyAgICBfY21zVkVDM21pbnVzKCZ3MCwgJmxpbmUxIC0+YSwgJmxpbmUyIC0+YSk7CisKKyAgICBhICA9IF9jbXNWRUMzZG90KCZsaW5lMSAtPnUsICZsaW5lMSAtPnUpOworICAgIGIgID0gX2Ntc1ZFQzNkb3QoJmxpbmUxIC0+dSwgJmxpbmUyIC0+dSk7CisgICAgYyAgPSBfY21zVkVDM2RvdCgmbGluZTIgLT51LCAmbGluZTIgLT51KTsKKyAgICBkICA9IF9jbXNWRUMzZG90KCZsaW5lMSAtPnUsICZ3MCk7CisgICAgZSAgPSBfY21zVkVDM2RvdCgmbGluZTIgLT51LCAmdzApOworCisgICAgRCAgPSBhKmMgLSBiICogYjsgICAgICAvLyBEZW5vbWluYXRvcgorICAgIHNEID0gdEQgPSBEOyAgICAgICAgICAgLy8gZGVmYXVsdCBzRCA9IEQgPj0gMAorCisgICAgaWYgKEQgPCAgTUFUUklYX0RFVF9UT0xFUkFOQ0UpIHsgICAvLyB0aGUgbGluZXMgYXJlIGFsbW9zdCBwYXJhbGxlbAorCisgICAgICAgIHNOID0gMC4wOyAgICAgICAgLy8gZm9yY2UgdXNpbmcgcG9pbnQgUDAgb24gc2VnbWVudCBTMQorICAgICAgICBzRCA9IDEuMDsgICAgICAgIC8vIHRvIHByZXZlbnQgcG9zc2libGUgZGl2aXNpb24gYnkgMC4wIGxhdGVyCisgICAgICAgIHROID0gZTsKKyAgICAgICAgdEQgPSBjOworICAgIH0KKyAgICBlbHNlIHsgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBjbG9zZXN0IHBvaW50cyBvbiB0aGUgaW5maW5pdGUgbGluZXMKKworICAgICAgICBzTiA9IChiKmUgLSBjKmQpOworICAgICAgICB0TiA9IChhKmUgLSBiKmQpOworCisgICAgICAgIGlmIChzTiA8IDAuMCkgeyAgICAgICAvLyBzYyA8IDAgPT4gdGhlIHM9MCBlZGdlIGlzIHZpc2libGUKKworICAgICAgICAgICAgc04gPSAwLjA7CisgICAgICAgICAgICB0TiA9IGU7CisgICAgICAgICAgICB0RCA9IGM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc04gPiBzRCkgeyAgIC8vIHNjID4gMSA9PiB0aGUgcz0xIGVkZ2UgaXMgdmlzaWJsZQorICAgICAgICAgICAgc04gPSBzRDsKKyAgICAgICAgICAgIHROID0gZSArIGI7CisgICAgICAgICAgICB0RCA9IGM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodE4gPCAwLjApIHsgICAgICAgICAgIC8vIHRjIDwgMCA9PiB0aGUgdD0wIGVkZ2UgaXMgdmlzaWJsZQorCisgICAgICAgIHROID0gMC4wOworICAgICAgICAvLyByZWNvbXB1dGUgc2MgZm9yIHRoaXMgZWRnZQorICAgICAgICBpZiAoLWQgPCAwLjApCisgICAgICAgICAgICBzTiA9IDAuMDsKKyAgICAgICAgZWxzZSBpZiAoLWQgPiBhKQorICAgICAgICAgICAgc04gPSBzRDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzTiA9IC1kOworICAgICAgICAgICAgc0QgPSBhOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKHROID4gdEQpIHsgICAgICAvLyB0YyA+IDEgPT4gdGhlIHQ9MSBlZGdlIGlzIHZpc2libGUKKworICAgICAgICB0TiA9IHREOworCisgICAgICAgIC8vIHJlY29tcHV0ZSBzYyBmb3IgdGhpcyBlZGdlCisgICAgICAgIGlmICgoLWQgKyBiKSA8IDAuMCkKKyAgICAgICAgICAgIHNOID0gMDsKKyAgICAgICAgZWxzZSBpZiAoKC1kICsgYikgPiBhKQorICAgICAgICAgICAgc04gPSBzRDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzTiA9ICgtZCArIGIpOworICAgICAgICAgICAgc0QgPSBhOworICAgICAgICB9CisgICAgfQorICAgIC8vIGZpbmFsbHkgZG8gdGhlIGRpdmlzaW9uIHRvIGdldCBzYyBhbmQgdGMKKyAgICBzYyA9IChmYWJzKHNOKSA8IE1BVFJJWF9ERVRfVE9MRVJBTkNFID8gMC4wIDogc04gLyBzRCk7CisgICAgLy90YyA9IChmYWJzKHROKSA8IE1BVFJJWF9ERVRfVE9MRVJBTkNFID8gMC4wIDogdE4gLyB0RCk7IC8vIGxlZnQgZm9yIGZ1dHVyZSB1c2UuCisKKyAgICBHZXRQb2ludE9mTGluZShyLCBsaW5lMSwgc2MpOworICAgIHJldHVybiBUUlVFOworfQorCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdyYXBwZXIKKworCisvLyBBbGxvY2F0ZSAmIGZyZWUgc3RydWN0dXJlCitjbXNIQU5ETEUgIENNU0VYUE9SVCBjbXNHQkRBbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCkKK3sKKyAgICBjbXNHREIqIGdiZCA9IChjbXNHREIqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihjbXNHREIpKTsKKyAgICBpZiAoZ2JkID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgZ2JkIC0+IENvbnRleHRJRCA9IENvbnRleHRJRDsKKworICAgIHJldHVybiAoY21zSEFORExFKSBnYmQ7Cit9CisKKwordm9pZCBDTVNFWFBPUlQgY21zR0JERnJlZShjbXNIQU5ETEUgaEdCRCkKK3sKKyAgICBjbXNHREIqIGdiZCA9IChjbXNHREIqKSBoR0JEOworICAgIGlmIChoR0JEICE9IE5VTEwpCisgICAgICAgIF9jbXNGcmVlKGdiZC0+Q29udGV4dElELCAodm9pZCopIGdiZCk7Cit9CisKKworLy8gQXV4aWxpYXJ5IHRvIHJldHJpZXZlIGEgcG9pbnRlciB0byB0aGUgc2VnbWVudHIgY29udGFpbmluZyB0aGUgTGFiIHZhbHVlCitzdGF0aWMKK2Ntc0dEQlBvaW50KiBHZXRQb2ludChjbXNHREIqIGdiZCwgY29uc3QgY21zQ0lFTGFiKiBMYWIsIGNtc1NwaGVyaWNhbCogc3ApCit7CisgICAgY21zVkVDMyB2OworICAgIGludCBhbHBoYSwgdGhldGE7CisKKyAgICAvLyBIb3VzZWtlZXBpbmcKKyAgICBfY21zQXNzZXJ0KGdiZCAhPSBOVUxMKTsKKyAgICBfY21zQXNzZXJ0KExhYiAhPSBOVUxMKTsKKyAgICBfY21zQXNzZXJ0KHNwICE9IE5VTEwpOworCisgICAgLy8gQ2VudGVyIEwqIGJ5IHN1YnRyYWN0aW5nIGhhbGYgb2YgaXRzIGRvbWFpbiwgdGhhdCdzIDUwCisgICAgX2Ntc1ZFQzNpbml0KCZ2LCBMYWIgLT5MIC0gNTAuMCwgTGFiIC0+YSwgTGFiIC0+Yik7CisKKyAgICAvLyBDb252ZXJ0IHRvIHNwaGVyaWNhbCBjb29yZGluYXRlcworICAgIFRvU3BoZXJpY2FsKHNwLCAmdik7CisKKyAgICBpZiAoc3AgLT5yIDwgMCB8fCBzcCAtPmFscGhhIDwgMCB8fCBzcC0+dGhldGEgPCAwKSB7CisgICAgICAgICBjbXNTaWduYWxFcnJvcihnYmQgLT5Db250ZXh0SUQsIGNtc0VSUk9SX1JBTkdFLCAic3BoZXJpY2FsIHZhbHVlIG91dCBvZiByYW5nZSIpOworICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLy8gT24gd2hpY2ggc2VjdG9yIGl0IGZhbGxzPworICAgIFF1YW50aXplVG9TZWN0b3Ioc3AsICZhbHBoYSwgJnRoZXRhKTsKKworICAgIGlmIChhbHBoYSA8IDAgfHwgdGhldGEgPCAwIHx8IGFscGhhID49IFNFQ1RPUlMgfHwgdGhldGEgPj0gU0VDVE9SUykgeworICAgICAgICAgY21zU2lnbmFsRXJyb3IoZ2JkIC0+Q29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgIiBxdWFkcmFudCBvdXQgb2YgcmFuZ2UiKTsKKyAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIEdldCBwb2ludGVyIHRvIHRoZSBzZWN0b3IKKyAgICByZXR1cm4gJmdiZCAtPkdhbXV0W3RoZXRhXVthbHBoYV07Cit9CisKKy8vIEFkZCBhIHBvaW50IHRvIGdhbXV0IGRlc2NyaXB0b3IuIFBvaW50IHRvIGFkZCBpcyBpbiBMYWIgY29sb3Igc3BhY2UuCisvLyBHQkQgaXMgY2VudGVyZWQgb24gYT1iPTAgYW5kIEwqPTUwCitjbXNCb29sIENNU0VYUE9SVCBjbXNHREJBZGRQb2ludChjbXNIQU5ETEUgaEdCRCwgY29uc3QgY21zQ0lFTGFiKiBMYWIpCit7CisgICAgY21zR0RCKiBnYmQgPSAoY21zR0RCKikgaEdCRDsKKyAgICBjbXNHREJQb2ludCogcHRyOworICAgIGNtc1NwaGVyaWNhbCBzcDsKKworCisgICAgLy8gR2V0IHBvaW50ZXIgdG8gdGhlIHNlY3RvcgorICAgIHB0ciA9IEdldFBvaW50KGdiZCwgTGFiLCAmc3ApOworICAgIGlmIChwdHIgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworCisgICAgLy8gSWYgbm8gc2FtcGxlcyBhdCB0aGlzIHNlY3RvciwgYWRkIGl0CisgICAgaWYgKHB0ciAtPlR5cGUgPT0gR1BfRU1QVFkpIHsKKworICAgICAgICBwdHIgLT4gVHlwZSA9IEdQX1NQRUNJRklFRDsKKyAgICAgICAgcHRyIC0+IHAgICAgPSBzcDsKKyAgICB9CisgICAgZWxzZSB7CisKKworICAgICAgICAvLyBTdWJzdGl0dXRlIG9ubHkgaWYgcmFkaXVzIGlzIGdyZWF0ZXIKKyAgICAgICAgaWYgKHNwLnIgPiBwdHIgLT4gcC5yKSB7CisKKyAgICAgICAgICAgICAgICBwdHIgLT4gVHlwZSA9IEdQX1NQRUNJRklFRDsKKyAgICAgICAgICAgICAgICBwdHIgLT4gcCAgICA9IHNwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8vIENoZWNrIGlmIGEgZ2l2ZW4gcG9pbnQgZmFsbHMgaW5zaWRlIGdhbXV0CitjbXNCb29sIENNU0VYUE9SVCBjbXNHREJDaGVja1BvaW50KGNtc0hBTkRMRSBoR0JELCBjb25zdCBjbXNDSUVMYWIqIExhYikKK3sKKyAgICBjbXNHREIqIGdiZCA9IChjbXNHREIqKSBoR0JEOworICAgIGNtc0dEQlBvaW50KiBwdHI7CisgICAgY21zU3BoZXJpY2FsIHNwOworCisgICAgLy8gR2V0IHBvaW50ZXIgdG8gdGhlIHNlY3RvcgorICAgIHB0ciA9IEdldFBvaW50KGdiZCwgTGFiLCAmc3ApOworICAgIGlmIChwdHIgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworCisgICAgLy8gSWYgbm8gc2FtcGxlcyBhdCB0aGlzIHNlY3RvciwgcmV0dXJuIG5vIGRhdGEKKyAgICBpZiAocHRyIC0+VHlwZSA9PSBHUF9FTVBUWSkgcmV0dXJuIEZBTFNFOworCisgICAgLy8gSW4gZ2FtdXQgb25seSBpZiByYWRpdXMgaXMgZ3JlYXRlcgorCisgICAgcmV0dXJuIChzcC5yIDw9IHB0ciAtPiBwLnIpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBGaW5kIG5lYXIgc2VjdG9ycy4gVGhlIGxpc3Qgb2Ygc2VjdG9ycyBmb3VuZCBpcyByZXR1cm5lZCBvbiBDbG9zZVtdLgorLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBzZWN0b3JzIGFzIHdlbGwuCisKKy8vIDI0ICAgOSAgMTAgIDExICAxMgorLy8gMjMgICA4ICAgMSAgIDIgIDEzCisvLyAyMiAgIDcgICAqICAgMyAgMTQKKy8vIDIxICAgNiAgIDUgICA0ICAxNQorLy8gMjAgIDE5ICAxOCAgMTcgIDE2CisvLworLy8gVGhvc2UgYXJlIHRoZSByZWxhdGl2ZSBtb3ZlbWVudHMKKy8vIHstMiwtMn0sIHstMSwgLTJ9LCB7MCwgLTJ9LCB7KzEsIC0yfSwgeysyLCAgLTJ9LAorLy8gey0yLC0xfSwgey0xLCAtMX0sIHswLCAtMX0sIHsrMSwgLTF9LCB7KzIsICAtMX0sCisvLyB7LTIsIDB9LCB7LTEsICAwfSwgezAsICAwfSwgeysxLCAgMH0sIHsrMiwgICAwfSwKKy8vIHstMiwrMX0sIHstMSwgKzF9LCB7MCwgKzF9LCB7KzEsICArMX0sIHsrMiwgICsxfSwKKy8vIHstMiwrMn0sIHstMSwgKzJ9LCB7MCwgKzJ9LCB7KzEsICArMn0sIHsrMiwgICsyfX07CisKKworc3RhdGljCitjb25zdCBzdHJ1Y3QgX3NwaXJhbCB7CisKKyAgICBpbnQgQWR2WCwgQWR2WTsKKworICAgIH0gU3BpcmFsW10gPSB7IHswLCAgLTF9LCB7KzEsIC0xfSwgeysxLCAgMH0sIHsrMSwgKzF9LCB7MCwgICsxfSwgey0xLCArMX0sCisgICAgICAgICAgICAgICAgICAgey0xLCAgMH0sIHstMSwgLTF9LCB7LTEsIC0yfSwgezAsICAtMn0sIHsrMSwgLTJ9LCB7KzIsIC0yfSwKKyAgICAgICAgICAgICAgICAgICB7KzIsIC0xfSwgeysyLCAgMH0sIHsrMiwgKzF9LCB7KzIsICsyfSwgeysxLCArMn0sIHswLCAgKzJ9LAorICAgICAgICAgICAgICAgICAgIHstMSwgKzJ9LCB7LTIsICsyfSwgey0yLCArMX0sIHstMiwgMH0sICB7LTIsIC0xfSwgey0yLCAtMn0gfTsKKworI2RlZmluZSBOU1RFUFMgKHNpemVvZihTcGlyYWwpIC8gc2l6ZW9mKHN0cnVjdCBfc3BpcmFsKSkKKworc3RhdGljCitpbnQgRmluZE5lYXJTZWN0b3JzKGNtc0dEQiogZ2JkLCBpbnQgYWxwaGEsIGludCB0aGV0YSwgY21zR0RCUG9pbnQqIENsb3NlW10pCit7CisgICAgaW50IG5TZWN0b3JzID0gMDsKKyAgICBpbnQgYSwgdDsKKyAgICBjbXNVSW50MzJOdW1iZXIgaTsKKyAgICBjbXNHREJQb2ludCogcHQ7CisKKyAgICBmb3IgKGk9MDsgaSA8IE5TVEVQUzsgaSsrKSB7CisKKyAgICAgICAgYSA9IGFscGhhICsgU3BpcmFsW2ldLkFkdlg7CisgICAgICAgIHQgPSB0aGV0YSArIFNwaXJhbFtpXS5BZHZZOworCisgICAgICAgIC8vIEN5Y2xlIGF0IHRoZSBlbmQKKyAgICAgICAgYSAlPSBTRUNUT1JTOworICAgICAgICB0ICU9IFNFQ1RPUlM7CisKKyAgICAgICAgLy8gQ3ljbGUgYXQgdGhlIGJlZ2luCisgICAgICAgIGlmIChhIDwgMCkgYSA9IFNFQ1RPUlMgKyBhOworICAgICAgICBpZiAodCA8IDApIHQgPSBTRUNUT1JTICsgdDsKKworICAgICAgICBwdCA9ICZnYmQgLT5HYW11dFt0XVthXTsKKworICAgICAgICBpZiAocHQgLT4gVHlwZSAhPSBHUF9FTVBUWSkgeworCisgICAgICAgICAgICBDbG9zZVtuU2VjdG9ycysrXSA9IHB0OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG5TZWN0b3JzOworfQorCisKKy8vIEludGVycG9sYXRlIGEgbWlzc2luZyBzZWN0b3IuIE1ldGhvZCBpZGVudGlmaWVzIHdoYXRldmVyIHRoaXMgaXMgdG9wLCBib3R0b20gb3IgbWlkCitzdGF0aWMKK2Ntc0Jvb2wgSW50ZXJwb2xhdGVNaXNzaW5nU2VjdG9yKGNtc0dEQiogZ2JkLCBpbnQgYWxwaGEsIGludCB0aGV0YSkKK3sKKyAgICBjbXNTcGhlcmljYWwgc3A7CisgICAgY21zVkVDMyBMYWI7CisgICAgY21zVkVDMyBDZW50cmU7CisgICAgY21zTGluZSByYXk7CisgICAgaW50IG5DbG9zZVNlY3RvcnM7CisgICAgY21zR0RCUG9pbnQqIENsb3NlW05TVEVQUyArIDFdOworICAgIGNtc1NwaGVyaWNhbCBjbG9zZWwsIHRlbXBsOworICAgIGNtc0xpbmUgZWRnZTsKKyAgICBpbnQgaywgbTsKKworICAgIC8vIElzIHRoYXQgcG9pbnQgYWxyZWFkeSBzcGVjaWZpZWQ/CisgICAgaWYgKGdiZCAtPkdhbXV0W3RoZXRhXVthbHBoYV0uVHlwZSAhPSBHUF9FTVBUWSkgcmV0dXJuIFRSVUU7CisKKyAgICAvLyBGaWxsIGNsb3NlIHBvaW50cworICAgIG5DbG9zZVNlY3RvcnMgPSBGaW5kTmVhclNlY3RvcnMoZ2JkLCBhbHBoYSwgdGhldGEsIENsb3NlKTsKKworCisgICAgLy8gRmluZCBhIGNlbnRyYWwgcG9pbnQgb24gdGhlIHNlY3RvcgorICAgIHNwLmFscGhhID0gKGNtc0Zsb2F0NjROdW1iZXIpICgoYWxwaGEgKyAwLjUpICogMzYwLjApIC8gKFNFQ1RPUlMpOworICAgIHNwLnRoZXRhID0gKGNtc0Zsb2F0NjROdW1iZXIpICgodGhldGEgKyAwLjUpICogMTgwLjApIC8gKFNFQ1RPUlMpOworICAgIHNwLnIgICAgID0gNTAuMDsKKworICAgIC8vIENvbnZlcnQgdG8gQ2FydGVzaWFuCisgICAgVG9DYXJ0ZXNpYW4oJkxhYiwgJnNwKTsKKworICAgIC8vIENyZWF0ZSBhIHJheSBsaW5lIGZyb20gY2VudHJlIHRvIHRoaXMgcG9pbnQKKyAgICBfY21zVkVDM2luaXQoJkNlbnRyZSwgNTAuMCwgMCwgMCk7CisgICAgTGluZU9mMlBvaW50cygmcmF5LCAmTGFiLCAmQ2VudHJlKTsKKworICAgIC8vIEZvciBhbGwgY2xvc2Ugc2VjdG9ycworICAgIGNsb3NlbC5yID0gMC4wOworICAgIGNsb3NlbC5hbHBoYSA9IDA7CisgICAgY2xvc2VsLnRoZXRhID0gMDsKKworICAgIGZvciAoaz0wOyBrIDwgbkNsb3NlU2VjdG9yczsgaysrKSB7CisKKyAgICAgICAgZm9yKG0gPSBrKzE7IG0gPCBuQ2xvc2VTZWN0b3JzOyBtKyspIHsKKworICAgICAgICAgICAgY21zVkVDMyB0ZW1wLCBhMSwgYTI7CisKKyAgICAgICAgICAgIC8vIEEgbGluZSBmcm9tIHNlY3RvciB0byBzZWN0b3IKKyAgICAgICAgICAgIFRvQ2FydGVzaWFuKCZhMSwgJkNsb3NlW2tdLT5wKTsKKyAgICAgICAgICAgIFRvQ2FydGVzaWFuKCZhMiwgJkNsb3NlW21dLT5wKTsKKworICAgICAgICAgICAgTGluZU9mMlBvaW50cygmZWRnZSwgJmExLCAmYTIpOworCisgICAgICAgICAgICAvLyBGaW5kIGEgbGluZQorICAgICAgICAgICAgQ2xvc2VzdExpbmVUb0xpbmUoJnRlbXAsICZyYXksICZlZGdlKTsKKworICAgICAgICAgICAgLy8gQ29udmVydCB0byBzcGhlcmljYWwKKyAgICAgICAgICAgIFRvU3BoZXJpY2FsKCZ0ZW1wbCwgJnRlbXApOworCisKKyAgICAgICAgICAgIGlmICggdGVtcGwuciA+IGNsb3NlbC5yICYmCisgICAgICAgICAgICAgICAgIHRlbXBsLnRoZXRhID49ICh0aGV0YSoxODAuMC9TRUNUT1JTKSAmJgorICAgICAgICAgICAgICAgICB0ZW1wbC50aGV0YSA8PSAoKHRoZXRhKzEpKjE4MC4wL1NFQ1RPUlMpICYmCisgICAgICAgICAgICAgICAgIHRlbXBsLmFscGhhID49IChhbHBoYSozNjAuMC9TRUNUT1JTKSAmJgorICAgICAgICAgICAgICAgICB0ZW1wbC5hbHBoYSA8PSAoKGFscGhhKzEpKjM2MC4wL1NFQ1RPUlMpKSB7CisKKyAgICAgICAgICAgICAgICBjbG9zZWwgPSB0ZW1wbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGdiZCAtPkdhbXV0W3RoZXRhXVthbHBoYV0ucCA9IGNsb3NlbDsKKyAgICBnYmQgLT5HYW11dFt0aGV0YV1bYWxwaGFdLlR5cGUgPSBHUF9NT0RFTEVEOworCisgICAgcmV0dXJuIFRSVUU7CisKK30KKworCisvLyBJbnRlcnBvbGF0ZSBtaXNzaW5nIHBhcnRzLiBUaGUgYWxnb3JpdGhtIGZpc3QgY29tcHV0ZXMgc2xpY2VzIGF0CisvLyB0aGV0YT0wIGFuZCB0aGV0YT1NYXguCitjbXNCb29sIENNU0VYUE9SVCBjbXNHREJDb21wdXRlKGNtc0hBTkRMRSBoR0JELCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKK3sKKyAgICBpbnQgYWxwaGEsIHRoZXRhOworICAgIGNtc0dEQiogZ2JkID0gKGNtc0dEQiopIGhHQkQ7CisKKyAgICBfY21zQXNzZXJ0KGhHQkQgIT0gTlVMTCk7CisKKyAgICAvLyBJbnRlcnBvbGF0ZSBibGFjaworICAgIGZvciAoYWxwaGEgPSAwOyBhbHBoYSA8IFNFQ1RPUlM7IGFscGhhKyspIHsKKworICAgICAgICBpZiAoIUludGVycG9sYXRlTWlzc2luZ1NlY3RvcihnYmQsIGFscGhhLCAwKSkgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8vIEludGVycG9sYXRlIHdoaXRlCisgICAgZm9yIChhbHBoYSA9IDA7IGFscGhhIDwgU0VDVE9SUzsgYWxwaGErKykgeworCisgICAgICAgIGlmICghSW50ZXJwb2xhdGVNaXNzaW5nU2VjdG9yKGdiZCwgYWxwaGEsIFNFQ1RPUlMtMSkpIHJldHVybiBGQUxTRTsKKyAgICB9CisKKworICAgIC8vIEludGVycG9sYXRlIE1pZAorICAgIGZvciAodGhldGEgPSAxOyB0aGV0YSA8IFNFQ1RPUlM7IHRoZXRhKyspIHsKKyAgICAgICAgZm9yIChhbHBoYSA9IDA7IGFscGhhIDwgU0VDVE9SUzsgYWxwaGErKykgeworCisgICAgICAgICAgICBpZiAoIUludGVycG9sYXRlTWlzc2luZ1NlY3RvcihnYmQsIGFscGhhLCB0aGV0YSkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIERvbmUKKyAgICByZXR1cm4gVFJVRTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoZHdGbGFncyk7Cit9CisKKworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEdyZWF0IGZvciBkZWJ1ZywgYnV0IG5vdCBzdWl0YWJsZSBmb3IgcmVhbCB1c2UKKworI2lmIDAKK2Ntc0Jvb2wgY21zR0JEZHVtcFZSTUwoY21zSEFORExFIGhHQkQsIGNvbnN0IGNoYXIqIGZuYW1lKQoreworICAgIEZJTEUqIGZwOworICAgIGludCAgIGksIGo7CisgICAgY21zR0RCKiBnYmQgPSAoY21zR0RCKikgaEdCRDsKKyAgICBjbXNHREJQb2ludCogcHQ7CisKKyAgICBmcCA9IGZvcGVuIChmbmFtZSwgInd0Iik7CisgICAgaWYgKGZwID09IE5VTEwpCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIGZwcmludGYgKGZwLCAiI1ZSTUwgVjIuMCB1dGY4XG4iKTsKKworICAgIC8vIHNldCB0aGUgdmlld2luZyBvcmllbnRhdGlvbiBhbmQgZGlzdGFuY2UKKyAgICBmcHJpbnRmIChmcCwgIkRFRiBDYW1UZXN0IEdyb3VwIHtcbiIpOworICAgIGZwcmludGYgKGZwLCAiXHRjaGlsZHJlbiBbXG4iKTsKKyAgICBmcHJpbnRmIChmcCwgIlx0XHRERUYgQ2FtZXJhcyBHcm91cCB7XG4iKTsKKyAgICBmcHJpbnRmIChmcCwgIlx0XHRcdGNoaWxkcmVuIFtcbiIpOworICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRERUYgRGVmYXVsdFZpZXcgVmlld3BvaW50IHtcbiIpOworICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRcdHBvc2l0aW9uIDAgMCAzNDBcbiIpOworICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRcdG9yaWVudGF0aW9uIDAgMCAxIDBcbiIpOworICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRcdGRlc2NyaXB0aW9uIFwiZGVmYXVsdCB2aWV3XCJcbiIpOworICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHR9XG4iKTsKKyAgICBmcHJpbnRmIChmcCwgIlx0XHRcdF1cbiIpOworICAgIGZwcmludGYgKGZwLCAiXHRcdH0sXG4iKTsKKyAgICBmcHJpbnRmIChmcCwgIlx0XVxuIik7CisgICAgZnByaW50ZiAoZnAsICJ9XG4iKTsKKworICAgIC8vIE91dHB1dCB0aGUgYmFja2dyb3VuZCBzdHVmZgorICAgIGZwcmludGYgKGZwLCAiQmFja2dyb3VuZCB7XG4iKTsKKyAgICBmcHJpbnRmIChmcCwgIlx0c2t5Q29sb3IgW1xuIik7CisgICAgZnByaW50ZiAoZnAsICJcdFx0LjUgLjUgLjVcbiIpOworICAgIGZwcmludGYgKGZwLCAiXHRdXG4iKTsKKyAgICBmcHJpbnRmIChmcCwgIn1cbiIpOworCisgICAgLy8gT3V0cHV0IHRoZSBzaGFwZSBzdHVmZgorICAgIGZwcmludGYgKGZwLCAiVHJhbnNmb3JtIHtcbiIpOworICAgIGZwcmludGYgKGZwLCAiXHRzY2FsZSAuMyAuMyAuM1xuIik7CisgICAgZnByaW50ZiAoZnAsICJcdGNoaWxkcmVuIFtcbiIpOworCisgICAgLy8gRHJhdyB0aGUgYXhlcyBhcyBhIHNoYXBlOgorICAgIGZwcmludGYgKGZwLCAiXHRcdFNoYXBlIHtcbiIpOworICAgIGZwcmludGYgKGZwLCAiXHRcdFx0YXBwZWFyYW5jZSBBcHBlYXJhbmNlIHtcbiIpOworICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRtYXRlcmlhbCBNYXRlcmlhbCB7XG4iKTsKKyAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0XHRkaWZmdXNlQ29sb3IgMCAwLjggMFxuIik7CisgICAgZnByaW50ZiAoZnAsICJcdFx0XHRcdFx0ZW1pc3NpdmVDb2xvciAxLjAgMS4wIDEuMFxuIik7CisgICAgZnByaW50ZiAoZnAsICJcdFx0XHRcdFx0c2hpbmluZXNzIDAuOFxuIik7CisgICAgZnByaW50ZiAoZnAsICJcdFx0XHRcdH1cbiIpOworICAgIGZwcmludGYgKGZwLCAiXHRcdFx0fVxuIik7CisgICAgZnByaW50ZiAoZnAsICJcdFx0XHRnZW9tZXRyeSBJbmRleGVkTGluZVNldCB7XG4iKTsKKyAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0Y29vcmQgQ29vcmRpbmF0ZSB7XG4iKTsKKyAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0XHRwb2ludCBbXG4iKTsKKyAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0XHQwLjAgMC4wIDAuMCxcbiIpOworICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRcdCVmIDAuMCAwLjAsXG4iLCAgMjU1LjApOworICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRcdDAuMCAlZiAwLjAsXG4iLCAgMjU1LjApOworICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRcdDAuMCAwLjAgJWZdXG4iLCAgMjU1LjApOworICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHR9XG4iKTsKKyAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0Y29vcmRJbmRleCBbXG4iKTsKKyAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0XHQwLCAxLCAtMVxuIik7CisgICAgZnByaW50ZiAoZnAsICJcdFx0XHRcdFx0MCwgMiwgLTFcbiIpOworICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRcdDAsIDMsIC0xXVxuIik7CisgICAgZnByaW50ZiAoZnAsICJcdFx0XHR9XG4iKTsKKyAgICBmcHJpbnRmIChmcCwgIlx0XHR9XG4iKTsKKworCisgICAgZnByaW50ZiAoZnAsICJcdFx0U2hhcGUge1xuIik7CisgICAgZnByaW50ZiAoZnAsICJcdFx0XHRhcHBlYXJhbmNlIEFwcGVhcmFuY2Uge1xuIik7CisgICAgZnByaW50ZiAoZnAsICJcdFx0XHRcdG1hdGVyaWFsIE1hdGVyaWFsIHtcbiIpOworICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRcdGRpZmZ1c2VDb2xvciAwIDAuOCAwXG4iKTsKKyAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0XHRlbWlzc2l2ZUNvbG9yIDEgMSAxXG4iKTsKKyAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0XHRzaGluaW5lc3MgMC44XG4iKTsKKyAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0fVxuIik7CisgICAgZnByaW50ZiAoZnAsICJcdFx0XHR9XG4iKTsKKyAgICBmcHJpbnRmIChmcCwgIlx0XHRcdGdlb21ldHJ5IFBvaW50U2V0IHtcbiIpOworCisgICAgLy8gZmlsbCBpbiB0aGUgcG9pbnRzIGhlcmUKKyAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0Y29vcmQgQ29vcmRpbmF0ZSB7XG4iKTsKKyAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0XHRwb2ludCBbXG4iKTsKKworICAgIC8vIFdlIG5lZWQgdG8gdHJhbnN2ZXJzZSBhbGwgZ2FtdXQgaHVsbC4KKyAgICBmb3IgKGk9MDsgaSA8IFNFQ1RPUlM7IGkrKykKKyAgICAgICAgZm9yIChqPTA7IGogPCBTRUNUT1JTOyBqKyspIHsKKworICAgICAgICAgICAgY21zVkVDMyB2OworCisgICAgICAgICAgICBwdCA9ICZnYmQgLT5HYW11dFtpXVtqXTsKKyAgICAgICAgICAgIFRvQ2FydGVzaWFuKCZ2LCAmcHQgLT5wKTsKKworICAgICAgICAgICAgZnByaW50ZiAoZnAsICJcdFx0XHRcdFx0JWcgJWcgJWciLCB2Lm5bMF0rNTAsIHYublsxXSwgdi5uWzJdKTsKKworICAgICAgICAgICAgaWYgKChqID09IFNFQ1RPUlMgLSAxKSAmJiAoaSA9PSBTRUNUT1JTIC0gMSkpCisgICAgICAgICAgICAgICAgZnByaW50ZiAoZnAsICJdXG4iKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmcHJpbnRmIChmcCwgIixcbiIpOworCisgICAgICAgIH0KKworICAgICAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0fVxuIik7CisKKworCisgICAgLy8gZmlsbCBpbiB0aGUgZmFjZSBjb2xvcnMKKyAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0Y29sb3IgQ29sb3Ige1xuIik7CisgICAgZnByaW50ZiAoZnAsICJcdFx0XHRcdFx0Y29sb3IgW1xuIik7CisKKyAgICBmb3IgKGk9MDsgaSA8IFNFQ1RPUlM7IGkrKykKKyAgICAgICAgZm9yIChqPTA7IGogPCBTRUNUT1JTOyBqKyspIHsKKworICAgICAgICAgICBjbXNWRUMzIHY7CisKKyAgICAgICAgICAgIHB0ID0gJmdiZCAtPkdhbXV0W2ldW2pdOworCisKKyAgICAgICAgICAgIFRvQ2FydGVzaWFuKCZ2LCAmcHQgLT5wKTsKKworCisgICAgICAgIGlmIChwdCAtPlR5cGUgPT0gR1BfRU1QVFkpCisgICAgICAgICAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0XHQlZyAlZyAlZyIsIDAuMCwgMC4wLCAwLjApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpZiAocHQgLT5UeXBlID09IEdQX01PREVMRUQpCisgICAgICAgICAgICAgICAgZnByaW50ZiAoZnAsICJcdFx0XHRcdFx0JWcgJWcgJWciLCAxLjAsIC41LCAuNSk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0XHQlZyAlZyAlZyIsIDEuMCwgMS4wLCAxLjApOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgaWYgKChqID09IFNFQ1RPUlMgLSAxKSAmJiAoaSA9PSBTRUNUT1JTIC0gMSkpCisgICAgICAgICAgICAgICAgZnByaW50ZiAoZnAsICJdXG4iKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmcHJpbnRmIChmcCwgIixcbiIpOworICAgIH0KKyAgICBmcHJpbnRmIChmcCwgIlx0XHRcdH1cbiIpOworCisKKyAgICBmcHJpbnRmIChmcCwgIlx0XHRcdH1cbiIpOworICAgIGZwcmludGYgKGZwLCAiXHRcdH1cbiIpOworICAgIGZwcmludGYgKGZwLCAiXHRdXG4iKTsKKyAgICBmcHJpbnRmIChmcCwgIn1cbiIpOworCisgICAgZmNsb3NlIChmcCk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXN0eXBlcy5jIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjAyZjg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zdHlwZXMuYwpAQCAtMCwwICsxLDU2MTYgQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8KKy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisvLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKKy8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisvLworLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKy8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorLy8KKy8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCisvLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQorLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisvLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKworI2luY2x1ZGUgImxjbXMyX2ludGVybmFsLmgiCisKKy8vIFRhZyBTZXJpYWxpemF0aW9uICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgZXZlcnkgc2luZ2xlIHRhZyBhbmQgdGFnIHR5cGUgYXMgZGVzY3JpYmVkIGluIHRoZSBJQ0Mgc3BlYy4gU29tZSB0eXBlcworLy8gaGF2ZSBiZWVuIGRlcHJlY2F0ZWQsIGxpa2UgbmNsIGFuZCBEYXRhLiBUaGVyZSBpcyBubyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhvc2UgdHlwZXMgYXMgdGhlcmUKKy8vIGFyZSBubyBwcm9maWxlcyBob2xkaW5nIHRoZW0uIFRoZSBwcm9ncmFtbWVyIGNhbiBhbHNvIGV4dGVuZCB0aGlzIGxpc3QgYnkgZGVmaW5pbmcgaGlzIG93biB0eXBlcworLy8gYnkgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIHBsdWctaW4uIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBwbHVnIGlucyByZWdhcmRpbmcgdGhhdC4gRmlyc3QgdHlwZQorLy8gYWxsb3dzIHRvIGRlZmluZSBuZXcgdGFncyB1c2luZyBhbnkgZXhpc3RpbmcgdHlwZS4gTmV4dCBwbHVnLWluIHR5cGUgYWxsb3dzIHRvIGRlZmluZSBuZXcgdHlwZXMKKy8vIGFuZCB0aGUgdGhpcmQgb25lIGlzIHZlcnkgc3BlY2lmaWM6IGFsbG93cyB0byBleHRlbmQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbXVsdGlwcm9jZXNzaW5nCisvLyBlbGVtZW50cyBzcGVjaWFsIHR5cGUuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFNvbWUgYnJva2VuIHR5cGVzCisjZGVmaW5lIGNtc0NvcmJpc0Jyb2tlblhZWnR5cGUgICAgKChjbXNUYWdUeXBlU2lnbmF0dXJlKSAweDE3QTUwNUI4KQorI2RlZmluZSBjbXNNb25hY29Ccm9rZW5DdXJ2ZVR5cGUgICgoY21zVGFnVHlwZVNpZ25hdHVyZSkgMHg5NDc4ZWUwMCkKKworLy8gVGhpcyBpcyB0aGUgbGlua2VkIGxpc3QgdGhhdCBrZWVwcyB0cmFjayBvZiB0aGUgZGVmaW5lZCB0eXBlcwordHlwZWRlZiBzdHJ1Y3QgX2Ntc1RhZ1R5cGVMaW5rZWRMaXN0X3N0IHsKKworICAgIGNtc1RhZ1R5cGVIYW5kbGVyIEhhbmRsZXI7CisgICAgc3RydWN0IF9jbXNUYWdUeXBlTGlua2VkTGlzdF9zdCogTmV4dDsKKworfSBfY21zVGFnVHlwZUxpbmtlZExpc3Q7CisKKy8vIFNvbWUgbWFjcm9zIHRvIGRlZmluZSBjYWxsYmFja3MuCisjZGVmaW5lIFJFQURfRk4oeCkgIFR5cGVfIyN4IyNfUmVhZAorI2RlZmluZSBXUklURV9GTih4KSBUeXBlXyMjeCMjX1dyaXRlCisjZGVmaW5lIEZSRUVfRk4oeCkgIFR5cGVfIyN4IyNfRnJlZQorI2RlZmluZSBEVVBfRk4oeCkgICBUeXBlXyMjeCMjX0R1cAorCisvLyBIZWxwZXIgbWFjcm8gdG8gZGVmaW5lIGEgaGFuZGxlci4gQ2FsbGJhY2tzIGRvIGhhdmUgYSBmaXhlZCBuYW1pbmcgY29udmVudGlvbi4KKyNkZWZpbmUgVFlQRV9IQU5ETEVSKHQsIHgpICB7ICh0KSwgUkVBRF9GTih4KSwgV1JJVEVfRk4oeCksIERVUF9GTih4KSwgRlJFRV9GTih4KSwgTlVMTCwgMCB9CisKKy8vIEhlbHBlciBtYWNybyB0byBkZWZpbmUgYSBNUEUgaGFuZGxlci4gQ2FsbGJhY2tzIGRvIGhhdmUgYSBmaXhlZCBuYW1pbmcgY29udmVudGlvbgorI2RlZmluZSBUWVBFX01QRV9IQU5ETEVSKHQsIHgpICB7ICh0KSwgUkVBRF9GTih4KSwgV1JJVEVfRk4oeCksIEdlbmVyaWNNUEVkdXAsIEdlbmVyaWNNUEVmcmVlLCBOVUxMLCAwIH0KKworLy8gUmVnaXN0ZXIgYSBuZXcgdHlwZSBoYW5kbGVyLiBUaGlzIHJvdXRpbmUgaXMgc2hhcmVkIGJldHdlZW4gbm9ybWFsIHR5cGVzIGFuZCBNUEUuIExpbmtlZExpc3QgcG9pbnRzIHRvIHRoZSBvcHRpb25hbCBsaXN0IGhlYWQKK3N0YXRpYworY21zQm9vbCBSZWdpc3RlclR5cGVzUGx1Z2luKGNtc0NvbnRleHQgaWQsIGNtc1BsdWdpbkJhc2UqIERhdGEsIF9jbXNNZW1vcnlDbGllbnQgcG9zKQoreworICAgIGNtc1BsdWdpblRhZ1R5cGUqIFBsdWdpbiA9IChjbXNQbHVnaW5UYWdUeXBlKikgRGF0YTsKKyAgICBfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSogY3R4ID0gKCBfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoaWQsIHBvcyk7CisgICAgX2Ntc1RhZ1R5cGVMaW5rZWRMaXN0ICpwdDsKKworICAgIC8vIENhbGxpbmcgdGhlIGZ1bmN0aW9uIHdpdGggTlVMTCBhcyBwbHVnLWluIHdvdWxkIHVucmVnaXN0ZXIgdGhlIHBsdWcgaW4uCisgICAgaWYgKERhdGEgPT0gTlVMTCkgeworCisgICAgICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2V0IGZyZWUgdGhlIG1lbW9yeSwgYXMgcG9vbCBpcyBkZXN0cm95ZWQgYXMgYSB3aG9sZS4KKyAgICAgICAgY3R4IC0+VGFnVHlwZXMgPSBOVUxMOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICAvLyBSZWdpc3RlcmluZyBoYXBwZW5zIGluIHBsdWctaW4gbWVtb3J5IHBvb2wuCisgICAgcHQgPSAoX2Ntc1RhZ1R5cGVMaW5rZWRMaXN0KikgX2Ntc1BsdWdpbk1hbGxvYyhpZCwgc2l6ZW9mKF9jbXNUYWdUeXBlTGlua2VkTGlzdCkpOworICAgIGlmIChwdCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICBwdCAtPkhhbmRsZXIgICA9IFBsdWdpbiAtPkhhbmRsZXI7CisgICAgcHQgLT5OZXh0ICAgICAgPSBjdHggLT5UYWdUeXBlczsKKworICAgIGN0eCAtPlRhZ1R5cGVzID0gcHQ7CisgICAgIAorICAgIHJldHVybiBUUlVFOworfQorCisvLyBSZXR1cm4gaGFuZGxlciBmb3IgYSBnaXZlbiB0eXBlIG9yIE5VTEwgaWYgbm90IGZvdW5kLiBTaGFyZWQgYmV0d2VlbiBub3JtYWwgdHlwZXMgYW5kIE1QRS4gSXQgZmlyc3QgdHJpZXMgdGhlIGFkZGl0b25zIAorLy8gbWFkZSBieSBwbHVnLWlucyBhbmQgdGhlbiB0aGUgYnVpbHQtaW4gZGVmYXVsdHMuCitzdGF0aWMKK2Ntc1RhZ1R5cGVIYW5kbGVyKiBHZXRIYW5kbGVyKGNtc1RhZ1R5cGVTaWduYXR1cmUgc2lnLCBfY21zVGFnVHlwZUxpbmtlZExpc3QqIFBsdWdpbkxpbmtlZExpc3QsIF9jbXNUYWdUeXBlTGlua2VkTGlzdCogRGVmYXVsdExpbmtlZExpc3QpCit7CisgICAgX2Ntc1RhZ1R5cGVMaW5rZWRMaXN0KiBwdDsKKworICAgIGZvciAocHQgPSBQbHVnaW5MaW5rZWRMaXN0OworICAgICAgICAgcHQgIT0gTlVMTDsKKyAgICAgICAgIHB0ID0gcHQgLT5OZXh0KSB7CisKKyAgICAgICAgICAgIGlmIChzaWcgPT0gcHQgLT4gSGFuZGxlci5TaWduYXR1cmUpIHJldHVybiAmcHQgLT5IYW5kbGVyOworICAgIH0KKworICAgIGZvciAocHQgPSBEZWZhdWx0TGlua2VkTGlzdDsKKyAgICAgICAgIHB0ICE9IE5VTEw7CisgICAgICAgICBwdCA9IHB0IC0+TmV4dCkgeworCisgICAgICAgICAgICBpZiAoc2lnID09IHB0IC0+IEhhbmRsZXIuU2lnbmF0dXJlKSByZXR1cm4gJnB0IC0+SGFuZGxlcjsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworCisvLyBBdXhpbGlhcnkgdG8gY29udmVydCBVVEYtMzIgdG8gVVRGLTE2IGluIHNvbWUgY2FzZXMKK3N0YXRpYworY21zQm9vbCBfY21zV3JpdGVXQ2hhckFycmF5KGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciBuLCBjb25zdCB3Y2hhcl90KiBBcnJheSkKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgaTsKKworICAgIF9jbXNBc3NlcnQoaW8gIT0gTlVMTCk7CisgICAgX2Ntc0Fzc2VydCghKEFycmF5ID09IE5VTEwgJiYgbiA+IDApKTsKKworICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCAoY21zVUludDE2TnVtYmVyKSBBcnJheVtpXSkpIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gQXV4aWxpYXJ5IHRvIHJlYWQgYW4gYXJyYXkgb2Ygd2NoYXJfdAorc3RhdGljCitjbXNCb29sIF9jbXNSZWFkV0NoYXJBcnJheShjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIgbiwgd2NoYXJfdCogQXJyYXkpCit7CisgICAgY21zVUludDMyTnVtYmVyIGk7CisgICAgY21zVUludDE2TnVtYmVyIHRtcDsKKworICAgIF9jbXNBc3NlcnQoaW8gIT0gTlVMTCk7CisKKyAgICBmb3IgKGk9MDsgaSA8IG47IGkrKykgeworCisgICAgICAgIGlmIChBcnJheSAhPSBOVUxMKSB7CisKKyAgICAgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sICZ0bXApKSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICBBcnJheVtpXSA9ICh3Y2hhcl90KSB0bXA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoIV9jbXNSZWFkVUludDE2TnVtYmVyKGlvLCBOVUxMKSkgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8vIFRvIGRlYWwgd2l0aCBwb3NpdGlvbiB0YWJsZXMKK3R5cGVkZWYgY21zQm9vbCAoKiBQb3NpdGlvblRhYmxlRW50cnlGbikoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSU9IQU5ETEVSKiBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIENhcmdvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKTsKKworLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGRlYWwgd2l0aCBwb3NpdGlvbiB0YWJsZXMgYXMgZGVzY3JpYmVkIGluIElDQyBzcGVjIDQuMworLy8gQSB0YWJsZSBvZiBuIGVsZW1lbnRzIGlzIHJlYWRlZCwgd2hlcmUgZmlyc3QgY29tZXMgbiByZWNvcmRzIGNvbnRhaW5pbmcgb2Zmc2V0cyBhbmQgc2l6ZXMgYW5kCisvLyB0aGVuIGEgYmxvY2sgY29udGFpbmluZyB0aGUgZGF0YSBpdHNlbGYuIFRoaXMgYWxsb3dzIHRvIHJldXNlIHNhbWUgZGF0YSBpbiBtb3JlIHRoYW4gb25lIGVudHJ5CitzdGF0aWMKK2Ntc0Jvb2wgUmVhZFBvc2l0aW9uVGFibGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSU9IQU5ETEVSKiBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBCYXNlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqQ2FyZ28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NpdGlvblRhYmxlRW50cnlGbiBFbGVtZW50Rm4pCit7CisgICAgY21zVUludDMyTnVtYmVyIGk7CisgICAgY21zVUludDMyTnVtYmVyICpFbGVtZW50T2Zmc2V0cyA9IE5VTEwsICpFbGVtZW50U2l6ZXMgPSBOVUxMOworICAgIGNtc1VJbnQzMk51bWJlciBjdXJyZW50UG9zaXRpb247CisKKyAgICBjdXJyZW50UG9zaXRpb24gPSBpby0+VGVsbChpbyk7CisgICAgLy8gVmVyaWZ5IHRoZXJlIGlzIGVub3VnaCBzcGFjZSBsZWZ0IHRvIHJlYWQgdHdvIGNtc1VJbnQzMk51bWJlciBpdGVtcyBmb3IgQ291bnQgaXRlbXMuCisgICAgaWYgKCgoaW8tPlJlcG9ydGVkU2l6ZSAtIGN1cnJlbnRQb3NpdGlvbikgLyAoMiAqIHNpemVvZihjbXNVSW50MzJOdW1iZXIpKSkgPCBDb3VudCkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgLy8gTGV0J3MgdGFrZSB0aGUgb2Zmc2V0cyB0byBlYWNoIGVsZW1lbnQKKyAgICBFbGVtZW50T2Zmc2V0cyA9IChjbXNVSW50MzJOdW1iZXIgKikgX2Ntc0NhbGxvYyhpbyAtPkNvbnRleHRJRCwgQ291bnQsIHNpemVvZihjbXNVSW50MzJOdW1iZXIpKTsKKyAgICBpZiAoRWxlbWVudE9mZnNldHMgPT0gTlVMTCkgZ290byBFcnJvcjsKKworICAgIEVsZW1lbnRTaXplcyA9IChjbXNVSW50MzJOdW1iZXIgKikgX2Ntc0NhbGxvYyhpbyAtPkNvbnRleHRJRCwgQ291bnQsIHNpemVvZihjbXNVSW50MzJOdW1iZXIpKTsKKyAgICBpZiAoRWxlbWVudFNpemVzID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgICBmb3IgKGk9MDsgaSA8IENvdW50OyBpKyspIHsKKworICAgICAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmRWxlbWVudE9mZnNldHNbaV0pKSBnb3RvIEVycm9yOworICAgICAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmRWxlbWVudFNpemVzW2ldKSkgZ290byBFcnJvcjsKKworICAgICAgICBFbGVtZW50T2Zmc2V0c1tpXSArPSBCYXNlT2Zmc2V0OworICAgIH0KKworICAgIC8vIFNlZWsgdG8gZWFjaCBlbGVtZW50IGFuZCByZWFkIGl0CisgICAgZm9yIChpPTA7IGkgPCBDb3VudDsgaSsrKSB7CisKKyAgICAgICAgaWYgKCFpbyAtPiBTZWVrKGlvLCBFbGVtZW50T2Zmc2V0c1tpXSkpIGdvdG8gRXJyb3I7CisKKyAgICAgICAgLy8gVGhpcyBpcyB0aGUgcmVhZGVyIGNhbGxiYWNrCisgICAgICAgIGlmICghRWxlbWVudEZuKHNlbGYsIGlvLCBDYXJnbywgaSwgRWxlbWVudFNpemVzW2ldKSkgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICAvLyBTdWNjZXNzCisgICAgaWYgKEVsZW1lbnRPZmZzZXRzICE9IE5VTEwpIF9jbXNGcmVlKGlvIC0+Q29udGV4dElELCBFbGVtZW50T2Zmc2V0cyk7CisgICAgaWYgKEVsZW1lbnRTaXplcyAhPSBOVUxMKSBfY21zRnJlZShpbyAtPkNvbnRleHRJRCwgRWxlbWVudFNpemVzKTsKKyAgICByZXR1cm4gVFJVRTsKKworRXJyb3I6CisgICAgaWYgKEVsZW1lbnRPZmZzZXRzICE9IE5VTEwpIF9jbXNGcmVlKGlvIC0+Q29udGV4dElELCBFbGVtZW50T2Zmc2V0cyk7CisgICAgaWYgKEVsZW1lbnRTaXplcyAhPSBOVUxMKSBfY21zRnJlZShpbyAtPkNvbnRleHRJRCwgRWxlbWVudFNpemVzKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8vIFNhbWUgYXMgYW50ZXJpb3IsIGJ1dCBmb3Igd3JpdGUgcG9zaXRpb24gdGFibGVzCitzdGF0aWMKK2Ntc0Jvb2wgV3JpdGVQb3NpdGlvblRhYmxlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNJT0hBTkRMRVIqIGlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBCYXNlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNhcmdvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc2l0aW9uVGFibGVFbnRyeUZuIEVsZW1lbnRGbikKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgaTsKKyAgICBjbXNVSW50MzJOdW1iZXIgRGlyZWN0b3J5UG9zLCBDdXJyZW50UG9zLCBCZWZvcmU7CisgICAgY21zVUludDMyTnVtYmVyICpFbGVtZW50T2Zmc2V0cyA9IE5VTEwsICpFbGVtZW50U2l6ZXMgPSBOVUxMOworCisgICAgIC8vIENyZWF0ZSB0YWJsZQorICAgIEVsZW1lbnRPZmZzZXRzID0gKGNtc1VJbnQzMk51bWJlciAqKSBfY21zQ2FsbG9jKGlvIC0+Q29udGV4dElELCBDb3VudCwgc2l6ZW9mKGNtc1VJbnQzMk51bWJlcikpOworICAgIGlmIChFbGVtZW50T2Zmc2V0cyA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgRWxlbWVudFNpemVzID0gKGNtc1VJbnQzMk51bWJlciAqKSBfY21zQ2FsbG9jKGlvIC0+Q29udGV4dElELCBDb3VudCwgc2l6ZW9mKGNtc1VJbnQzMk51bWJlcikpOworICAgIGlmIChFbGVtZW50U2l6ZXMgPT0gTlVMTCkgZ290byBFcnJvcjsKKworICAgIC8vIEtlZXAgc3RhcnRpbmcgcG9zaXRpb24gb2YgY3VydmUgb2Zmc2V0cworICAgIERpcmVjdG9yeVBvcyA9IGlvIC0+VGVsbChpbyk7CisKKyAgICAvLyBXcml0ZSBhIGZha2UgZGlyZWN0b3J5IHRvIGJlIGZpbGxlZCBsYXR0ZXIgb24KKyAgICBmb3IgKGk9MDsgaSA8IENvdW50OyBpKyspIHsKKworICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgMCkpIGdvdG8gRXJyb3I7ICAvLyBPZmZzZXQKKyAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIDApKSBnb3RvIEVycm9yOyAgLy8gc2l6ZQorICAgIH0KKworICAgIC8vIFdyaXRlIGVhY2ggZWxlbWVudC4gS2VlcCB0cmFjayBvZiB0aGUgc2l6ZSBhcyB3ZWxsLgorICAgIGZvciAoaT0wOyBpIDwgQ291bnQ7IGkrKykgeworCisgICAgICAgIEJlZm9yZSA9IGlvIC0+VGVsbChpbyk7CisgICAgICAgIEVsZW1lbnRPZmZzZXRzW2ldID0gQmVmb3JlIC0gQmFzZU9mZnNldDsKKworICAgICAgICAvLyBDYWxsYmFjayB0byB3cml0ZS4uLgorICAgICAgICBpZiAoIUVsZW1lbnRGbihzZWxmLCBpbywgQ2FyZ28sIGksIFNpemVPZlRhZykpIGdvdG8gRXJyb3I7CisKKyAgICAgICAgLy8gTm93IHRoZSBzaXplCisgICAgICAgIEVsZW1lbnRTaXplc1tpXSA9IGlvIC0+VGVsbChpbykgLSBCZWZvcmU7CisgICAgfQorCisgICAgLy8gV3JpdGUgdGhlIGRpcmVjdG9yeQorICAgIEN1cnJlbnRQb3MgPSBpbyAtPlRlbGwoaW8pOworICAgIGlmICghaW8gLT5TZWVrKGlvLCBEaXJlY3RvcnlQb3MpKSBnb3RvIEVycm9yOworCisgICAgZm9yIChpPTA7IGkgPCAgQ291bnQ7IGkrKykgeworICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgRWxlbWVudE9mZnNldHNbaV0pKSBnb3RvIEVycm9yOworICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgRWxlbWVudFNpemVzW2ldKSkgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICBpZiAoIWlvIC0+U2VlayhpbywgQ3VycmVudFBvcykpIGdvdG8gRXJyb3I7CisKKyAgICBpZiAoRWxlbWVudE9mZnNldHMgIT0gTlVMTCkgX2Ntc0ZyZWUoaW8gLT5Db250ZXh0SUQsIEVsZW1lbnRPZmZzZXRzKTsKKyAgICBpZiAoRWxlbWVudFNpemVzICE9IE5VTEwpIF9jbXNGcmVlKGlvIC0+Q29udGV4dElELCBFbGVtZW50U2l6ZXMpOworICAgIHJldHVybiBUUlVFOworCitFcnJvcjoKKyAgICBpZiAoRWxlbWVudE9mZnNldHMgIT0gTlVMTCkgX2Ntc0ZyZWUoaW8gLT5Db250ZXh0SUQsIEVsZW1lbnRPZmZzZXRzKTsKKyAgICBpZiAoRWxlbWVudFNpemVzICE9IE5VTEwpIF9jbXNGcmVlKGlvIC0+Q29udGV4dElELCBFbGVtZW50U2l6ZXMpOworICAgIHJldHVybiBGQUxTRTsKK30KKworCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gVHlwZSBYWVouIE9ubHkgb25lIHZhbHVlIGlzIGFsbG93ZWQKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8vVGhlIFhZWlR5cGUgY29udGFpbnMgYW4gYXJyYXkgb2YgdGhyZWUgZW5jb2RlZCB2YWx1ZXMgZm9yIHRoZSBYWVogdHJpc3RpbXVsdXMKKy8vdmFsdWVzLiBUcmlzdGltdWx1cyB2YWx1ZXMgbXVzdCBiZSBub24tbmVnYXRpdmUuIFRoZSBzaWduZWQgZW5jb2RpbmcgYWxsb3dzIGZvcgorLy9pbXBsZW1lbnRhdGlvbiBvcHRpbWl6YXRpb25zIGJ5IG1pbmltaXppbmcgdGhlIG51bWJlciBvZiBmaXhlZCBmb3JtYXRzLgorCisKK3N0YXRpYwordm9pZCAqVHlwZV9YWVpfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQoreworICAgIGNtc0NJRVhZWiogeHl6OworCisgICAgKm5JdGVtcyA9IDA7CisgICAgeHl6ID0gKGNtc0NJRVhZWiopIF9jbXNNYWxsb2NaZXJvKHNlbGYgLT5Db250ZXh0SUQsIHNpemVvZihjbXNDSUVYWVopKTsKKyAgICBpZiAoeHl6ID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgaWYgKCFfY21zUmVhZFhZWk51bWJlcihpbywgeHl6KSkgeworICAgICAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCB4eXopOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAqbkl0ZW1zID0gMTsKKyAgICByZXR1cm4gKHZvaWQqKSB4eXo7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFNpemVPZlRhZyk7Cit9CisKK3N0YXRpYworY21zQm9vbCAgVHlwZV9YWVpfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCit7CisgICAgcmV0dXJuIF9jbXNXcml0ZVhZWk51bWJlcihpbywgKGNtc0NJRVhZWiopIFB0cik7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKK30KKworc3RhdGljCit2b2lkKiBUeXBlX1hZWl9EdXAoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjb25zdCB2b2lkICpQdHIsIGNtc1VJbnQzMk51bWJlciBuKQoreworICAgIHJldHVybiBfY21zRHVwTWVtKHNlbGYgLT5Db250ZXh0SUQsIFB0ciwgc2l6ZW9mKGNtc0NJRVhZWikpOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKK30KKworc3RhdGljCit2b2lkIFR5cGVfWFlaX0ZyZWUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCB2b2lkICpQdHIpCit7CisgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgUHRyKTsKK30KKworCitzdGF0aWMKK2Ntc1RhZ1R5cGVTaWduYXR1cmUgRGVjaWRlWFladHlwZShjbXNGbG9hdDY0TnVtYmVyIElDQ1ZlcnNpb24sIGNvbnN0IHZvaWQgKkRhdGEpCit7CisgICAgcmV0dXJuIGNtc1NpZ1hZWlR5cGU7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKElDQ1ZlcnNpb24pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoRGF0YSk7Cit9CisKKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIFR5cGUgY2hyb21hdGljaXR5LiBPbmx5IG9uZSB2YWx1ZSBpcyBhbGxvd2VkCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gVGhlIGNocm9tYXRpY2l0eSB0YWcgdHlwZSBwcm92aWRlcyBiYXNpYyBjaHJvbWF0aWNpdHkgZGF0YSBhbmQgdHlwZSBvZgorLy8gcGhvc3Bob3JzIG9yIGNvbG9yYW50cyBvZiBhIG1vbml0b3IgdG8gYXBwbGljYXRpb25zIGFuZCB1dGlsaXRpZXMuCisKK3N0YXRpYwordm9pZCAqVHlwZV9DaHJvbWF0aWNpdHlfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQoreworICAgIGNtc0NJRXh5WVRSSVBMRSogY2hybTsKKyAgICBjbXNVSW50MTZOdW1iZXIgbkNoYW5zLCBUYWJsZTsKKworICAgICpuSXRlbXMgPSAwOworICAgIGNocm0gPSAgKGNtc0NJRXh5WVRSSVBMRSopIF9jbXNNYWxsb2NaZXJvKHNlbGYgLT5Db250ZXh0SUQsIHNpemVvZihjbXNDSUV4eVlUUklQTEUpKTsKKyAgICBpZiAoY2hybSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sICZuQ2hhbnMpKSBnb3RvIEVycm9yOworCisgICAgLy8gTGV0J3MgcmVjb3ZlciBmcm9tIGEgYnVnIGludHJvZHVjZWQgaW4gZWFybHkgdmVyc2lvbnMgb2YgbGNtczEKKyAgICBpZiAobkNoYW5zID09IDAgJiYgU2l6ZU9mVGFnID09IDMyKSB7CisKKyAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgTlVMTCkpIGdvdG8gRXJyb3I7CisgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sICZuQ2hhbnMpKSBnb3RvIEVycm9yOworICAgIH0KKworICAgIGlmIChuQ2hhbnMgIT0gMykgZ290byBFcnJvcjsKKworICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sICZUYWJsZSkpIGdvdG8gRXJyb3I7CisKKyAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAmY2hybSAtPlJlZC54KSkgZ290byBFcnJvcjsKKyAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAmY2hybSAtPlJlZC55KSkgZ290byBFcnJvcjsKKworICAgIGNocm0gLT5SZWQuWSA9IDEuMDsKKworICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICZjaHJtIC0+R3JlZW4ueCkpIGdvdG8gRXJyb3I7CisgICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgJmNocm0gLT5HcmVlbi55KSkgZ290byBFcnJvcjsKKworICAgIGNocm0gLT5HcmVlbi5ZID0gMS4wOworCisgICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgJmNocm0gLT5CbHVlLngpKSBnb3RvIEVycm9yOworICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICZjaHJtIC0+Qmx1ZS55KSkgZ290byBFcnJvcjsKKworICAgIGNocm0gLT5CbHVlLlkgPSAxLjA7CisKKyAgICAqbkl0ZW1zID0gMTsKKyAgICByZXR1cm4gKHZvaWQqKSBjaHJtOworCitFcnJvcjoKKyAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCAodm9pZCopIGNocm0pOworICAgIHJldHVybiBOVUxMOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTaXplT2ZUYWcpOworfQorCitzdGF0aWMKK2Ntc0Jvb2wgIFNhdmVPbmVDaHJvbWF0aWNpdHkoY21zRmxvYXQ2NE51bWJlciB4LCBjbXNGbG9hdDY0TnVtYmVyIHksIGNtc0lPSEFORExFUiogaW8pCit7CisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIF9jbXNEb3VibGVUbzE1Rml4ZWQxNih4KSkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgX2Ntc0RvdWJsZVRvMTVGaXhlZDE2KHkpKSkgcmV0dXJuIEZBTFNFOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYworY21zQm9vbCAgVHlwZV9DaHJvbWF0aWNpdHlfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCit7CisgICAgY21zQ0lFeHlZVFJJUExFKiBjaHJtID0gKGNtc0NJRXh5WVRSSVBMRSopIFB0cjsKKworICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCAzKSkgcmV0dXJuIEZBTFNFOyAgICAgICAgLy8gbkNoYW5uZWxzCisgICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7ICAgICAgICAvLyBUYWJsZQorCisgICAgaWYgKCFTYXZlT25lQ2hyb21hdGljaXR5KGNocm0gLT4gUmVkLngsICAgY2hybSAtPiBSZWQueSwgaW8pKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFTYXZlT25lQ2hyb21hdGljaXR5KGNocm0gLT4gR3JlZW4ueCwgY2hybSAtPiBHcmVlbi55LCBpbykpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIVNhdmVPbmVDaHJvbWF0aWNpdHkoY2hybSAtPiBCbHVlLngsICBjaHJtIC0+IEJsdWUueSwgaW8pKSByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gVFJVRTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobkl0ZW1zKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOworfQorCitzdGF0aWMKK3ZvaWQqIFR5cGVfQ2hyb21hdGljaXR5X0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQgKlB0ciwgY21zVUludDMyTnVtYmVyIG4pCit7CisgICAgcmV0dXJuIF9jbXNEdXBNZW0oc2VsZiAtPkNvbnRleHRJRCwgUHRyLCBzaXplb2YoY21zQ0lFeHlZVFJJUExFKSk7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOworfQorCitzdGF0aWMKK3ZvaWQgVHlwZV9DaHJvbWF0aWNpdHlfRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQqIFB0cikKK3sKKyAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBQdHIpOworfQorCisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBUeXBlIGNtc1NpZ0NvbG9yYW50T3JkZXJUeXBlCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisvLyBUaGlzIGlzIGFuIG9wdGlvbmFsIHRhZyB3aGljaCBzcGVjaWZpZXMgdGhlIGxheWRvd24gb3JkZXIgaW4gd2hpY2ggY29sb3JhbnRzIHdpbGwKKy8vIGJlIHByaW50ZWQgb24gYW4gbi1jb2xvcmFudCBkZXZpY2UuIFRoZSBsYXlkb3duIG9yZGVyIG1heSBiZSB0aGUgc2FtZSBhcyB0aGUKKy8vIGNoYW5uZWwgZ2VuZXJhdGlvbiBvcmRlciBsaXN0ZWQgaW4gdGhlIGNvbG9yYW50VGFibGVUYWcgb3IgdGhlIGNoYW5uZWwgb3JkZXIgb2YgYQorLy8gY29sb3VyIHNwYWNlIHN1Y2ggYXMgQ01ZSywgaW4gd2hpY2ggY2FzZSB0aGlzIHRhZyBpcyBub3QgbmVlZGVkLiBXaGVuIHRoaXMgaXMgbm90CisvLyB0aGUgY2FzZSAoZm9yIGV4YW1wbGUsIGluay10b3dlcnMgc29tZXRpbWVzIHVzZSB0aGUgb3JkZXIgS0NNWSksIHRoaXMgdGFnIG1heSBiZQorLy8gdXNlZCB0byBzcGVjaWZ5IHRoZSBsYXlkb3duIG9yZGVyIG9mIHRoZSBjb2xvcmFudHMuCisKKworc3RhdGljCit2b2lkICpUeXBlX0NvbG9yYW50T3JkZXJUeXBlX1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG5JdGVtcywgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKK3sKKyAgICBjbXNVSW50OE51bWJlciogQ29sb3JhbnRPcmRlcjsKKyAgICBjbXNVSW50MzJOdW1iZXIgQ291bnQ7CisKKyAgICAqbkl0ZW1zID0gMDsKKyAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmQ291bnQpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoQ291bnQgPiBjbXNNQVhDSEFOTkVMUykgcmV0dXJuIE5VTEw7CisKKyAgICBDb2xvcmFudE9yZGVyID0gKGNtc1VJbnQ4TnVtYmVyKikgX2Ntc0NhbGxvYyhzZWxmIC0+Q29udGV4dElELCBjbXNNQVhDSEFOTkVMUywgc2l6ZW9mKGNtc1VJbnQ4TnVtYmVyKSk7CisgICAgaWYgKENvbG9yYW50T3JkZXIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICAvLyBXZSB1c2UgRkYgYXMgZW5kIG1hcmtlcgorICAgIG1lbXNldChDb2xvcmFudE9yZGVyLCAweEZGLCBjbXNNQVhDSEFOTkVMUyAqIHNpemVvZihjbXNVSW50OE51bWJlcikpOworCisgICAgaWYgKGlvIC0+UmVhZChpbywgQ29sb3JhbnRPcmRlciwgc2l6ZW9mKGNtc1VJbnQ4TnVtYmVyKSwgQ291bnQpICE9IENvdW50KSB7CisKKyAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgKHZvaWQqKSBDb2xvcmFudE9yZGVyKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgKm5JdGVtcyA9IDE7CisgICAgcmV0dXJuICh2b2lkKikgQ29sb3JhbnRPcmRlcjsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU2l6ZU9mVGFnKTsKK30KKworc3RhdGljCitjbXNCb29sIFR5cGVfQ29sb3JhbnRPcmRlclR5cGVfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCit7CisgICAgY21zVUludDhOdW1iZXIqICBDb2xvcmFudE9yZGVyID0gKGNtc1VJbnQ4TnVtYmVyKikgUHRyOworICAgIGNtc1VJbnQzMk51bWJlciBpLCBzeiwgQ291bnQ7CisKKyAgICAvLyBHZXQgdGhlIGxlbmd0aAorICAgIGZvciAoQ291bnQ9aT0wOyBpIDwgY21zTUFYQ0hBTk5FTFM7IGkrKykgeworICAgICAgICBpZiAoQ29sb3JhbnRPcmRlcltpXSAhPSAweEZGKSBDb3VudCsrOworICAgIH0KKworICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBDb3VudCkpIHJldHVybiBGQUxTRTsKKworICAgIHN6ID0gQ291bnQgKiBzaXplb2YoY21zVUludDhOdW1iZXIpOworICAgIGlmICghaW8gLT4gV3JpdGUoaW8sIHN6LCBDb2xvcmFudE9yZGVyKSkgcmV0dXJuIEZBTFNFOworCisgICAgcmV0dXJuIFRSVUU7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKK30KKworc3RhdGljCit2b2lkKiBUeXBlX0NvbG9yYW50T3JkZXJUeXBlX0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQgKlB0ciwgY21zVUludDMyTnVtYmVyIG4pCit7CisgICAgcmV0dXJuIF9jbXNEdXBNZW0oc2VsZiAtPkNvbnRleHRJRCwgUHRyLCBjbXNNQVhDSEFOTkVMUyAqIHNpemVvZihjbXNVSW50OE51bWJlcikpOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKK30KKworCitzdGF0aWMKK3ZvaWQgVHlwZV9Db2xvcmFudE9yZGVyVHlwZV9GcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCogUHRyKQoreworICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFB0cik7Cit9CisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBUeXBlIGNtc1NpZ1MxNUZpeGVkMTZBcnJheVR5cGUKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBUaGlzIHR5cGUgcmVwcmVzZW50cyBhbiBhcnJheSBvZiBnZW5lcmljIDQtYnl0ZS8zMi1iaXQgZml4ZWQgcG9pbnQgcXVhbnRpdHkuCisvLyBUaGUgbnVtYmVyIG9mIHZhbHVlcyBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIHNpemUgb2YgdGhlIHRhZy4KKworc3RhdGljCit2b2lkICpUeXBlX1MxNUZpeGVkMTZfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQoreworICAgIGNtc0Zsb2F0NjROdW1iZXIqICBhcnJheV9kb3VibGU7CisgICAgY21zVUludDMyTnVtYmVyIGksIG47CisKKyAgICAqbkl0ZW1zID0gMDsKKyAgICBuID0gU2l6ZU9mVGFnIC8gc2l6ZW9mKGNtc1VJbnQzMk51bWJlcik7CisgICAgYXJyYXlfZG91YmxlID0gKGNtc0Zsb2F0NjROdW1iZXIqKSBfY21zQ2FsbG9jKHNlbGYgLT5Db250ZXh0SUQsIG4sIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKSk7CisgICAgaWYgKGFycmF5X2RvdWJsZSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7CisKKyAgICAgICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgJmFycmF5X2RvdWJsZVtpXSkpIHsKKworICAgICAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgYXJyYXlfZG91YmxlKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgKm5JdGVtcyA9IG47CisgICAgcmV0dXJuICh2b2lkKikgYXJyYXlfZG91YmxlOworfQorCitzdGF0aWMKK2Ntc0Jvb2wgVHlwZV9TMTVGaXhlZDE2X1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQoreworICAgIGNtc0Zsb2F0NjROdW1iZXIqIFZhbHVlID0gKGNtc0Zsb2F0NjROdW1iZXIqKSBQdHI7CisgICAgY21zVUludDMyTnVtYmVyIGk7CisKKyAgICBmb3IgKGk9MDsgaSA8IG5JdGVtczsgaSsrKSB7CisKKyAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIFZhbHVlW2ldKSkgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKK30KKworc3RhdGljCit2b2lkKiBUeXBlX1MxNUZpeGVkMTZfRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKK3sKKyAgICByZXR1cm4gX2Ntc0R1cE1lbShzZWxmIC0+Q29udGV4dElELCBQdHIsIG4gKiBzaXplb2YoY21zRmxvYXQ2NE51bWJlcikpOworfQorCisKK3N0YXRpYwordm9pZCBUeXBlX1MxNUZpeGVkMTZfRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQqIFB0cikKK3sKKyAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBQdHIpOworfQorCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gVHlwZSBjbXNTaWdVMTZGaXhlZDE2QXJyYXlUeXBlCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gVGhpcyB0eXBlIHJlcHJlc2VudHMgYW4gYXJyYXkgb2YgZ2VuZXJpYyA0LWJ5dGUvMzItYml0IHF1YW50aXR5LgorLy8gVGhlIG51bWJlciBvZiB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBzaXplIG9mIHRoZSB0YWcuCisKKworc3RhdGljCit2b2lkICpUeXBlX1UxNkZpeGVkMTZfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQoreworICAgIGNtc0Zsb2F0NjROdW1iZXIqICBhcnJheV9kb3VibGU7CisgICAgY21zVUludDMyTnVtYmVyIHY7CisgICAgY21zVUludDMyTnVtYmVyIGksIG47CisKKyAgICAqbkl0ZW1zID0gMDsKKyAgICBuID0gU2l6ZU9mVGFnIC8gc2l6ZW9mKGNtc1VJbnQzMk51bWJlcik7CisgICAgYXJyYXlfZG91YmxlID0gKGNtc0Zsb2F0NjROdW1iZXIqKSBfY21zQ2FsbG9jKHNlbGYgLT5Db250ZXh0SUQsIG4sIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKSk7CisgICAgaWYgKGFycmF5X2RvdWJsZSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7CisKKyAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJnYpKSB7CisgICAgICAgICAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCAodm9pZCopIGFycmF5X2RvdWJsZSk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbnZlcnQgdG8gY21zRmxvYXQ2NE51bWJlcgorICAgICAgICBhcnJheV9kb3VibGVbaV0gPSAgKGNtc0Zsb2F0NjROdW1iZXIpICh2IC8gNjU1MzYuMCk7CisgICAgfQorCisgICAgKm5JdGVtcyA9IG47CisgICAgcmV0dXJuICh2b2lkKikgYXJyYXlfZG91YmxlOworfQorCitzdGF0aWMKK2Ntc0Jvb2wgVHlwZV9VMTZGaXhlZDE2X1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQoreworICAgIGNtc0Zsb2F0NjROdW1iZXIqIFZhbHVlID0gKGNtc0Zsb2F0NjROdW1iZXIqKSBQdHI7CisgICAgY21zVUludDMyTnVtYmVyIGk7CisKKyAgICBmb3IgKGk9MDsgaSA8IG5JdGVtczsgaSsrKSB7CisKKyAgICAgICAgY21zVUludDMyTnVtYmVyIHYgPSAoY21zVUludDMyTnVtYmVyKSBmbG9vcihWYWx1ZVtpXSo2NTUzNi4wICsgMC41KTsKKworICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgdikpIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Cit9CisKKworc3RhdGljCit2b2lkKiBUeXBlX1UxNkZpeGVkMTZfRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKK3sKKyAgICByZXR1cm4gX2Ntc0R1cE1lbShzZWxmIC0+Q29udGV4dElELCBQdHIsIG4gKiBzaXplb2YoY21zRmxvYXQ2NE51bWJlcikpOworfQorCitzdGF0aWMKK3ZvaWQgVHlwZV9VMTZGaXhlZDE2X0ZyZWUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCB2b2lkKiBQdHIpCit7CisgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgUHRyKTsKK30KKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIFR5cGUgY21zU2lnU2lnbmF0dXJlVHlwZQorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgc2lnbmF0dXJlVHlwZSBjb250YWlucyBhIGZvdXItYnl0ZSBzZXF1ZW5jZSwgU2VxdWVuY2VzIG9mIGxlc3MgdGhhbiBmb3VyCisvLyBjaGFyYWN0ZXJzIGFyZSBwYWRkZWQgYXQgdGhlIGVuZCB3aXRoIHNwYWNlcywgMjBoLgorLy8gVHlwaWNhbGx5IHRoaXMgdHlwZSBpcyB1c2VkIGZvciByZWdpc3RlcmVkIHRhZ3MgdGhhdCBjYW4gYmUgZGlzcGxheWVkIG9uIG1hbnkKKy8vIGRldmVsb3BtZW50IHN5c3RlbXMgYXMgYSBzZXF1ZW5jZSBvZiBmb3VyIGNoYXJhY3RlcnMuCisKK3N0YXRpYwordm9pZCAqVHlwZV9TaWduYXR1cmVfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQoreworICAgIGNtc1NpZ25hdHVyZSogU2lnUHRyID0gKGNtc1NpZ25hdHVyZSopIF9jbXNNYWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgc2l6ZW9mKGNtc1NpZ25hdHVyZSkpOworICAgIGlmIChTaWdQdHIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgU2lnUHRyKSkgcmV0dXJuIE5VTEw7CisgICAgICpuSXRlbXMgPSAxOworCisgICAgIHJldHVybiBTaWdQdHI7CisKKyAgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTaXplT2ZUYWcpOworfQorCitzdGF0aWMKK2Ntc0Jvb2wgIFR5cGVfU2lnbmF0dXJlX1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQoreworICAgIGNtc1NpZ25hdHVyZSogU2lnUHRyID0gKGNtc1NpZ25hdHVyZSopIFB0cjsKKworICAgIHJldHVybiBfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sICpTaWdQdHIpOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihuSXRlbXMpOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Cit9CisKK3N0YXRpYwordm9pZCogVHlwZV9TaWduYXR1cmVfRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKK3sKKyAgICByZXR1cm4gX2Ntc0R1cE1lbShzZWxmIC0+Q29udGV4dElELCBQdHIsIG4gKiBzaXplb2YoY21zU2lnbmF0dXJlKSk7Cit9CisKK3N0YXRpYwordm9pZCBUeXBlX1NpZ25hdHVyZV9GcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCogUHRyKQoreworICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFB0cik7Cit9CisKKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIFR5cGUgY21zU2lnVGV4dFR5cGUKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIHRleHRUeXBlIGlzIGEgc2ltcGxlIHRleHQgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgYSA3LWJpdCBBU0NJSSB0ZXh0IHN0cmluZy4KKy8vIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBpcyBvYnRhaW5lZCBieSBzdWJ0cmFjdGluZyA4IGZyb20gdGhlIGVsZW1lbnQgc2l6ZSBwb3J0aW9uCisvLyBvZiB0aGUgdGFnIGl0c2VsZi4gVGhpcyBzdHJpbmcgbXVzdCBiZSB0ZXJtaW5hdGVkIHdpdGggYSAwMGggYnl0ZS4KKworc3RhdGljCit2b2lkICpUeXBlX1RleHRfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQoreworICAgIGNoYXIqIFRleHQgPSBOVUxMOworICAgIGNtc01MVSogbWx1ID0gTlVMTDsKKworICAgIC8vIENyZWF0ZSBhIGNvbnRhaW5lcgorICAgIG1sdSA9IGNtc01MVWFsbG9jKHNlbGYgLT5Db250ZXh0SUQsIDEpOworICAgIGlmIChtbHUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICAqbkl0ZW1zID0gMDsKKworICAgIC8vIFdlIG5lZWQgdG8gc3RvcmUgdGhlICJcMCIgYXQgdGhlIGVuZCwgc28gKzEKKyAgICBpZiAoU2l6ZU9mVGFnID09IFVJTlRfTUFYKSBnb3RvIEVycm9yOworCisgICAgVGV4dCA9IChjaGFyKikgX2Ntc01hbGxvYyhzZWxmIC0+Q29udGV4dElELCBTaXplT2ZUYWcgKyAxKTsKKyAgICBpZiAoVGV4dCA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgaWYgKGlvIC0+IFJlYWQoaW8sIFRleHQsIHNpemVvZihjaGFyKSwgU2l6ZU9mVGFnKSAhPSBTaXplT2ZUYWcpIGdvdG8gRXJyb3I7CisKKyAgICAvLyBNYWtlIHN1cmUgdGV4dCBpcyBwcm9wZXJseSBlbmRlZAorICAgIFRleHRbU2l6ZU9mVGFnXSA9IDA7CisgICAgKm5JdGVtcyA9IDE7CisKKyAgICAvLyBLZWVwIHRoZSByZXN1bHQKKyAgICBpZiAoIWNtc01MVXNldEFTQ0lJKG1sdSwgY21zTm9MYW5ndWFnZSwgY21zTm9Db3VudHJ5LCBUZXh0KSkgZ290byBFcnJvcjsKKworICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFRleHQpOworICAgIHJldHVybiAodm9pZCopIG1sdTsKKworRXJyb3I6CisgICAgaWYgKG1sdSAhPSBOVUxMKQorICAgICAgICBjbXNNTFVmcmVlKG1sdSk7CisgICAgaWYgKFRleHQgIT0gTlVMTCkKKyAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgVGV4dCk7CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gVGhlIGNvbnZlcnNpb24gaW1wbGllcyB0byBjaG9vc2UgYSBsYW5ndWFnZS4gU28sIHdlIGNob29zZSB0aGUgYWN0dWFsIGxhbmd1YWdlLgorc3RhdGljCitjbXNCb29sIFR5cGVfVGV4dF9Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKK3sKKyAgICBjbXNNTFUqIG1sdSA9IChjbXNNTFUqKSBQdHI7CisgICAgY21zVUludDMyTnVtYmVyIHNpemU7CisgICAgY21zQm9vbCAgcmM7CisgICAgY2hhciogVGV4dDsKKworICAgIC8vIEdldCB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nLiBOb3RlIHRoZXJlIGlzIGFuIGV4dHJhICJcMCIgYXQgdGhlIGVuZAorICAgIHNpemUgPSBjbXNNTFVnZXRBU0NJSShtbHUsIGNtc05vTGFuZ3VhZ2UsIGNtc05vQ291bnRyeSwgTlVMTCwgMCk7CisgICAgaWYgKHNpemUgPT0gMCkgcmV0dXJuIEZBTFNFOyAgICAgICAvLyBDYW5ub3QgYmUgemVybyEKKworICAgIC8vIENyZWF0ZSBtZW1vcnkKKyAgICBUZXh0ID0gKGNoYXIqKSBfY21zTWFsbG9jKHNlbGYgLT5Db250ZXh0SUQsIHNpemUpOworICAgIGlmIChUZXh0ID09IE5VTEwpIHJldHVybiBGQUxTRTsKKworICAgIGNtc01MVWdldEFTQ0lJKG1sdSwgY21zTm9MYW5ndWFnZSwgY21zTm9Db3VudHJ5LCBUZXh0LCBzaXplKTsKKworICAgIC8vIFdyaXRlIGl0LCBpbmNsdWRpbmcgc2VwYXJhdG9yCisgICAgcmMgPSBpbyAtPldyaXRlKGlvLCBzaXplLCBUZXh0KTsKKworICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFRleHQpOworICAgIHJldHVybiByYzsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobkl0ZW1zKTsKK30KKworc3RhdGljCit2b2lkKiBUeXBlX1RleHRfRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKK3sKKyAgICByZXR1cm4gKHZvaWQqKSBjbXNNTFVkdXAoKGNtc01MVSopIFB0cik7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Cit9CisKKworc3RhdGljCit2b2lkIFR5cGVfVGV4dF9GcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCogUHRyKQoreworICAgIGNtc01MVSogbWx1ID0gKGNtc01MVSopIFB0cjsKKyAgICBjbXNNTFVmcmVlKG1sdSk7CisgICAgcmV0dXJuOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKK30KKworc3RhdGljCitjbXNUYWdUeXBlU2lnbmF0dXJlIERlY2lkZVRleHRUeXBlKGNtc0Zsb2F0NjROdW1iZXIgSUNDVmVyc2lvbiwgY29uc3Qgdm9pZCAqRGF0YSkKK3sKKyAgICBpZiAoSUNDVmVyc2lvbiA+PSA0LjApCisgICAgICAgIHJldHVybiBjbXNTaWdNdWx0aUxvY2FsaXplZFVuaWNvZGVUeXBlOworCisgICAgcmV0dXJuIGNtc1NpZ1RleHRUeXBlOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihEYXRhKTsKK30KKworCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gVHlwZSBjbXNTaWdEYXRhVHlwZQorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLy8gR2VuZXJhbCBwdXJwb3NlIGRhdGEgdHlwZQorc3RhdGljCit2b2lkICpUeXBlX0RhdGFfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQoreworICAgIGNtc0lDQ0RhdGEqIEJpbkRhdGE7CisgICAgY21zVUludDMyTnVtYmVyIExlbk9mRGF0YTsKKworICAgICpuSXRlbXMgPSAwOworCisgICAgaWYgKFNpemVPZlRhZyA8IHNpemVvZihjbXNVSW50MzJOdW1iZXIpKSByZXR1cm4gTlVMTDsKKworICAgIExlbk9mRGF0YSA9IFNpemVPZlRhZyAtIHNpemVvZihjbXNVSW50MzJOdW1iZXIpOworICAgIGlmIChMZW5PZkRhdGEgPiBJTlRfTUFYKSByZXR1cm4gTlVMTDsKKworICAgIEJpbkRhdGEgPSAoY21zSUNDRGF0YSopIF9jbXNNYWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgc2l6ZW9mKGNtc0lDQ0RhdGEpICsgTGVuT2ZEYXRhIC0gMSk7CisgICAgaWYgKEJpbkRhdGEgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBCaW5EYXRhIC0+bGVuID0gTGVuT2ZEYXRhOworICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZCaW5EYXRhLT5mbGFnKSkgeworICAgICAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBCaW5EYXRhKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKGlvIC0+IFJlYWQoaW8sIEJpbkRhdGEgLT5kYXRhLCBzaXplb2YoY21zVUludDhOdW1iZXIpLCBMZW5PZkRhdGEpICE9IExlbk9mRGF0YSkgeworCisgICAgICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIEJpbkRhdGEpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICAqbkl0ZW1zID0gMTsKKworICAgIHJldHVybiAodm9pZCopIEJpbkRhdGE7Cit9CisKKworc3RhdGljCitjbXNCb29sIFR5cGVfRGF0YV9Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKK3sKKyAgIGNtc0lDQ0RhdGEqIEJpbkRhdGEgPSAoY21zSUNDRGF0YSopIFB0cjsKKworICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIEJpbkRhdGEgLT5mbGFnKSkgcmV0dXJuIEZBTFNFOworCisgICByZXR1cm4gaW8gLT5Xcml0ZShpbywgQmluRGF0YSAtPmxlbiwgQmluRGF0YSAtPmRhdGEpOworCisgICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7CisgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOworfQorCisKK3N0YXRpYwordm9pZCogVHlwZV9EYXRhX0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQgKlB0ciwgY21zVUludDMyTnVtYmVyIG4pCit7CisgICAgY21zSUNDRGF0YSogQmluRGF0YSA9IChjbXNJQ0NEYXRhKikgUHRyOworCisgICAgcmV0dXJuIF9jbXNEdXBNZW0oc2VsZiAtPkNvbnRleHRJRCwgUHRyLCBzaXplb2YoY21zSUNDRGF0YSkgKyBCaW5EYXRhIC0+bGVuIC0gMSk7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOworfQorCitzdGF0aWMKK3ZvaWQgVHlwZV9EYXRhX0ZyZWUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCB2b2lkKiBQdHIpCit7CisgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgUHRyKTsKK30KKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIFR5cGUgY21zU2lnVGV4dERlc2NyaXB0aW9uVHlwZQorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworc3RhdGljCit2b2lkICpUeXBlX1RleHRfRGVzY3JpcHRpb25fUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQoreworICAgIGNoYXIqIFRleHQgPSBOVUxMOworICAgIGNtc01MVSogbWx1ID0gTlVMTDsKKyAgICBjbXNVSW50MzJOdW1iZXIgIEFzY2lpQ291bnQ7CisgICAgY21zVUludDMyTnVtYmVyICBpLCBVbmljb2RlQ29kZSwgVW5pY29kZUNvdW50OworICAgIGNtc1VJbnQxNk51bWJlciAgU2NyaXB0Q29kZUNvZGUsIER1bW15OworICAgIGNtc1VJbnQ4TnVtYmVyICAgU2NyaXB0Q29kZUNvdW50OworCisgICAgKm5JdGVtcyA9IDA7CisKKyAgICAvLyAgT25lIGR3b3JkIHNob3VsZCBiZSB0aGVyZQorICAgIGlmIChTaXplT2ZUYWcgPCBzaXplb2YoY21zVUludDMyTnVtYmVyKSkgcmV0dXJuIE5VTEw7CisKKyAgICAvLyBSZWFkIGxlbiBvZiBBU0NJSQorICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZBc2NpaUNvdW50KSkgcmV0dXJuIE5VTEw7CisgICAgU2l6ZU9mVGFnIC09IHNpemVvZihjbXNVSW50MzJOdW1iZXIpOworCisgICAgLy8gQ2hlY2sgZm9yIHNpemUKKyAgICBpZiAoU2l6ZU9mVGFnIDwgQXNjaWlDb3VudCkgcmV0dXJuIE5VTEw7CisKKyAgICAvLyBBbGwgc2VlbXMgT2ssIGFsbG9jYXRlIHRoZSBjb250YWluZXIKKyAgICBtbHUgPSBjbXNNTFVhbGxvYyhzZWxmIC0+Q29udGV4dElELCAxKTsKKyAgICBpZiAobWx1ID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgLy8gQXMgbWFueSBtZW1vcnkgYXMgc2l6ZSBvZiB0YWcKKyAgICBUZXh0ID0gKGNoYXIqKSBfY21zTWFsbG9jKHNlbGYgLT5Db250ZXh0SUQsIEFzY2lpQ291bnQgKyAxKTsKKyAgICBpZiAoVGV4dCA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgLy8gUmVhZCBpdAorICAgIGlmIChpbyAtPlJlYWQoaW8sIFRleHQsIHNpemVvZihjaGFyKSwgQXNjaWlDb3VudCkgIT0gQXNjaWlDb3VudCkgZ290byBFcnJvcjsKKyAgICBTaXplT2ZUYWcgLT0gQXNjaWlDb3VudDsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIHRlcm1pbmF0b3IKKyAgICBUZXh0W0FzY2lpQ291bnRdID0gMDsKKworICAgIC8vIFNldCB0aGUgTUxVIGVudHJ5LiBGcm9tIGhlcmUgd2UgY2FuIGJlIHRvbGVyYW50IHRvIHdyb25nIHR5cGVzCisgICAgaWYgKCFjbXNNTFVzZXRBU0NJSShtbHUsIGNtc05vTGFuZ3VhZ2UsIGNtc05vQ291bnRyeSwgVGV4dCkpIGdvdG8gRXJyb3I7CisgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgKHZvaWQqKSBUZXh0KTsKKyAgICBUZXh0ID0gTlVMTDsKKworICAgIC8vIFNraXAgVW5pY29kZSBjb2RlCisgICAgaWYgKFNpemVPZlRhZyA8IDIqIHNpemVvZihjbXNVSW50MzJOdW1iZXIpKSBnb3RvIERvbmU7CisgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJlVuaWNvZGVDb2RlKSkgZ290byBEb25lOworICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZVbmljb2RlQ291bnQpKSBnb3RvIERvbmU7CisgICAgU2l6ZU9mVGFnIC09IDIqIHNpemVvZihjbXNVSW50MzJOdW1iZXIpOworCisgICAgaWYgKFNpemVPZlRhZyA8IFVuaWNvZGVDb3VudCpzaXplb2YoY21zVUludDE2TnVtYmVyKSkgZ290byBEb25lOworCisgICAgZm9yIChpPTA7IGkgPCBVbmljb2RlQ291bnQ7IGkrKykgeworICAgICAgICBpZiAoIWlvIC0+UmVhZChpbywgJkR1bW15LCBzaXplb2YoY21zVUludDE2TnVtYmVyKSwgMSkpIGdvdG8gRG9uZTsKKyAgICB9CisgICAgU2l6ZU9mVGFnIC09IFVuaWNvZGVDb3VudCpzaXplb2YoY21zVUludDE2TnVtYmVyKTsKKworICAgIC8vIFNraXAgU2NyaXB0Q29kZSBjb2RlIGlmIHByZXNlbnQuIFNvbWUgYnVnZ3kgcHJvZmlsZXMgZG9lcyBoYXZlIGxlc3MKKyAgICAvLyBkYXRhIHRoYXQgc3RyaWN0dGx5IHJlcXVpcmVkLiBXZSBuZWVkIHRvIHNraXAgaXQgYXMgdGhpcyB0eXBlIG1heSBjb21lCisgICAgLy8gZW1iZWRkZWQgaW4gb3RoZXIgdHlwZXMuCisKKyAgICBpZiAoU2l6ZU9mVGFnID49IHNpemVvZihjbXNVSW50MTZOdW1iZXIpICsgc2l6ZW9mKGNtc1VJbnQ4TnVtYmVyKSArIDY3KSB7CisKKyAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgJlNjcmlwdENvZGVDb2RlKSkgZ290byBEb25lOworICAgICAgICBpZiAoIV9jbXNSZWFkVUludDhOdW1iZXIoaW8sICAmU2NyaXB0Q29kZUNvdW50KSkgZ290byBEb25lOworCisgICAgICAgIC8vIFNraXAgcmVzdCBvZiB0YWcKKyAgICAgICAgZm9yIChpPTA7IGkgPCA2NzsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWlvIC0+UmVhZChpbywgJkR1bW15LCBzaXplb2YoY21zVUludDhOdW1iZXIpLCAxKSkgZ290byBFcnJvcjsKKyAgICAgICAgfQorICAgIH0KKworRG9uZToKKworICAgICpuSXRlbXMgPSAxOworICAgIHJldHVybiBtbHU7CisKK0Vycm9yOgorICAgIGlmIChUZXh0KSBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCAodm9pZCopIFRleHQpOworICAgIGlmIChtbHUpIGNtc01MVWZyZWUobWx1KTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworCisvLyBUaGlzIHRhZyBjYW4gY29tZSBJTiBVTkFMSUdORUQgU0laRS4gSW4gb3JkZXIgdG8gcHJldmVudCBpc3N1ZXMsIHdlIGZvcmNlIHplcm9zIG9uIGRlc2NyaXB0aW9uIHRvIGFsaWduIGl0CitzdGF0aWMKK2Ntc0Jvb2wgIFR5cGVfVGV4dF9EZXNjcmlwdGlvbl9Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKK3sKKyAgICBjbXNNTFUqIG1sdSA9IChjbXNNTFUqKSBQdHI7CisgICAgY2hhciAqVGV4dCA9IE5VTEw7CisgICAgd2NoYXJfdCAqV2lkZSA9IE5VTEw7CisgICAgY21zVUludDMyTnVtYmVyIGxlbiwgbGVuX3RleHQsIGxlbl90YWdfcmVxdWlyZW1lbnQsIGxlbl9hbGlnbmVkOworICAgIGNtc0Jvb2wgIHJjID0gRkFMU0U7CisgICAgY2hhciBGaWxsZXJbNjhdOworCisgICAgLy8gVXNlZCBiZWxvdyBmb3Igd3JpdHRpbmcgemVyb2VzCisgICAgbWVtc2V0KEZpbGxlciwgMCwgc2l6ZW9mKEZpbGxlcikpOworCisgICAgLy8gR2V0IHRoZSBsZW4gb2Ygc3RyaW5nCisgICAgbGVuID0gY21zTUxVZ2V0QVNDSUkobWx1LCBjbXNOb0xhbmd1YWdlLCBjbXNOb0NvdW50cnksIE5VTEwsIDApOworCisgICAgLy8gU3BlY2lmaWNhdGlvbiBJQ0MuMToyMDAxLTA0ICh2Mi40LjApOiBJdCBoYXMgYmVlbiBmb3VuZCB0aGF0IHRleHREZXNjcmlwdGlvblR5cGUgY2FuIGNvbnRhaW4gbWlzYWxpZ25lZCBkYXRhCisgICAgLy8oc2VlIGNsYXVzZSA0LjEgZm9yIHRoZSBkZWZpbml0aW9uIG9mICdhbGlnbmVkJy4gQmVjYXVzZSB0aGUgVW5pY29kZSBsYW5ndWFnZQorICAgIC8vIGNvZGUgYW5kIFVuaWNvZGUgY291bnQgaW1tZWRpYXRlbHkgZm9sbG93IHRoZSBBU0NJSSBkZXNjcmlwdGlvbiwgdGhlaXIKKyAgICAvLyBhbGlnbm1lbnQgaXMgbm90IGNvcnJlY3QgaWYgdGhlIEFTQ0lJIGNvdW50IGlzIG5vdCBhIG11bHRpcGxlIG9mIGZvdXIuIFRoZQorICAgIC8vIFNjcmlwdENvZGUgY29kZSBpcyBtaXNhbGlnbmVkIHdoZW4gdGhlIEFTQ0lJIGNvdW50IGlzIG9kZC4gUHJvZmlsZSByZWFkaW5nIGFuZAorICAgIC8vIHdyaXRpbmcgc29mdHdhcmUgbXVzdCBiZSB3cml0dGVuIGNhcmVmdWxseSBpbiBvcmRlciB0byBoYW5kbGUgdGhlc2UgYWxpZ25tZW50CisgICAgLy8gcHJvYmxlbXMuCisgICAgLy8KKyAgICAvLyBUaGUgYWJvdmUgbGFzdCBzZW50ZW5jZSBzdWdnZXN0IHRvIGhhbmRsZSBhbGlnbm1lbnQgaXNzdWVzIGluIHRoZQorICAgIC8vIHBhcnNlci4gVGhlIHByb3ZpZGVkIGV4YW1wbGUgKFRhYmxlIDY5IG9uIFBhZ2UgNjApIG1ha2VzIHRoaXMgY2xlYXIuIAorICAgIC8vIFRoZSBwYWRkaW5nIG9ubHkgaW4gdGhlIEFTQ0lJIGNvdW50IGlzIG5vdCBzdWZmaWNpZW50IGZvciBhIGFsaWduZWQgdGFnCisgICAgLy8gc2l6ZSwgd2l0aCB0aGUgc2FtZSB0ZXh0IHNpemUgaW4gQVNDSUkgYW5kIFVuaWNvZGUuCisKKyAgICAvLyBOdWxsIHN0cmluZ3MKKyAgICBpZiAobGVuIDw9IDApIHsKKworICAgICAgICBUZXh0ID0gKGNoYXIqKSAgICBfY21zRHVwTWVtKHNlbGYgLT5Db250ZXh0SUQsICIiLCBzaXplb2YoY2hhcikpOworICAgICAgICBXaWRlID0gKHdjaGFyX3QqKSBfY21zRHVwTWVtKHNlbGYgLT5Db250ZXh0SUQsIEwiIiwgc2l6ZW9mKHdjaGFyX3QpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIENyZWF0ZSBpbmRlcGVuZGVudCBidWZmZXJzCisgICAgICAgIFRleHQgPSAoY2hhciopIF9jbXNDYWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgbGVuLCBzaXplb2YoY2hhcikpOworICAgICAgICBpZiAoVGV4dCA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgICAgIFdpZGUgPSAod2NoYXJfdCopIF9jbXNDYWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgbGVuLCBzaXplb2Yod2NoYXJfdCkpOworICAgICAgICBpZiAoV2lkZSA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgICAgIC8vIEdldCBib3RoIHJlcHJlc2VudGF0aW9ucy4KKyAgICAgICAgY21zTUxVZ2V0QVNDSUkobWx1LCBjbXNOb0xhbmd1YWdlLCBjbXNOb0NvdW50cnksICBUZXh0LCBsZW4gKiBzaXplb2YoY2hhcikpOworICAgICAgICBjbXNNTFVnZXRXaWRlKG1sdSwgIGNtc05vTGFuZ3VhZ2UsIGNtc05vQ291bnRyeSwgIFdpZGUsIGxlbiAqIHNpemVvZih3Y2hhcl90KSk7CisgICAgfQorCisgICAgLy8gVGVsbCB0aGUgcmVhbCB0ZXh0IGxlbiBpbmNsdWRpbmcgdGhlIG51bGwgdGVybWluYXRvciBhbmQgcGFkZGluZworICAgIGxlbl90ZXh0ID0gKGNtc1VJbnQzMk51bWJlcikgc3RybGVuKFRleHQpICsgMTsKKyAgICAvLyBDb21wdXRlIGFuIHRvdGFsIHRhZyBzaXplIHJlcXVpcmVtZW50CisgICAgbGVuX3RhZ19yZXF1aXJlbWVudCA9ICg4KzQrbGVuX3RleHQrNCs0KzIqbGVuX3RleHQrMisxKzY3KTsKKyAgICBsZW5fYWxpZ25lZCA9IF9jbXNBTElHTkxPTkcobGVuX3RhZ19yZXF1aXJlbWVudCk7CisKKyAgLy8gKiBjbXNVSW50MzJOdW1iZXIgICAgICAgY291bnQ7ICAgICAgICAgICogRGVzY3JpcHRpb24gbGVuZ3RoCisgIC8vICogY21zSW50OE51bWJlciAgICAgICAgIGRlc2NbY291bnRdICAgICAqIE5VTEwgdGVybWluYXRlZCBhc2NpaSBzdHJpbmcKKyAgLy8gKiBjbXNVSW50MzJOdW1iZXIgICAgICAgdWNMYW5nQ29kZTsgICAgICogVW5pQ29kZSBsYW5ndWFnZSBjb2RlCisgIC8vICogY21zVUludDMyTnVtYmVyICAgICAgIHVjQ291bnQ7ICAgICAgICAqIFVuaUNvZGUgZGVzY3JpcHRpb24gbGVuZ3RoCisgIC8vICogY21zSW50MTZOdW1iZXIgICAgICAgIHVjRGVzY1t1Y0NvdW50XTsqIFRoZSBVbmlDb2RlIGRlc2NyaXB0aW9uCisgIC8vICogY21zVUludDE2TnVtYmVyICAgICAgIHNjQ29kZTsgICAgICAgICAqIFNjcmlwdENvZGUgY29kZQorICAvLyAqIGNtc1VJbnQ4TnVtYmVyICAgICAgICBzY0NvdW50OyAgICAgICAgKiBTY3JpcHRDb2RlIGNvdW50CisgIC8vICogY21zSW50OE51bWJlciAgICAgICAgIHNjRGVzY1s2N107ICAgICAqIFNjcmlwdENvZGUgRGVzY3JpcHRpb24KKworICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBsZW5fdGV4dCkpIGdvdG8gRXJyb3I7CisgICAgaWYgKCFpbyAtPldyaXRlKGlvLCBsZW5fdGV4dCwgVGV4dCkpIGdvdG8gRXJyb3I7CisKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgMCkpIGdvdG8gRXJyb3I7ICAvLyB1Y0xhbmd1YWdlQ29kZQorCisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIGxlbl90ZXh0KSkgZ290byBFcnJvcjsKKyAgICAvLyBOb3RlIHRoYXQgaW4gc29tZSBjb21waWxlcnMgc2l6ZW9mKGNtc1VJbnQxNk51bWJlcikgIT0gc2l6ZW9mKHdjaGFyX3QpCisgICAgaWYgKCFfY21zV3JpdGVXQ2hhckFycmF5KGlvLCBsZW5fdGV4dCwgV2lkZSkpIGdvdG8gRXJyb3I7CisKKyAgICAvLyBTY3JpcHRDb2RlIENvZGUgJiBjb3VudCAodW51c2VkKQorICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCAwKSkgZ290byBFcnJvcjsKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQ4TnVtYmVyKGlvLCAwKSkgZ290byBFcnJvcjsKKworICAgIGlmICghaW8gLT5Xcml0ZShpbywgNjcsIEZpbGxlcikpIGdvdG8gRXJyb3I7CisKKyAgICAvLyBwb3NzaWJseSBhZGQgcGFkIGF0IHRoZSBlbmQgb2YgdGFnCisgICAgaWYobGVuX2FsaWduZWQgLSBsZW5fdGFnX3JlcXVpcmVtZW50ID4gMCkKKyAgICAgIGlmICghaW8gLT5Xcml0ZShpbywgbGVuX2FsaWduZWQgLSBsZW5fdGFnX3JlcXVpcmVtZW50LCBGaWxsZXIpKSBnb3RvIEVycm9yOworCisgICAgcmMgPSBUUlVFOworCitFcnJvcjoKKyAgICBpZiAoVGV4dCkgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgVGV4dCk7CisgICAgaWYgKFdpZGUpIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFdpZGUpOworCisgICAgcmV0dXJuIHJjOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihuSXRlbXMpOworfQorCisKK3N0YXRpYwordm9pZCogVHlwZV9UZXh0X0Rlc2NyaXB0aW9uX0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQgKlB0ciwgY21zVUludDMyTnVtYmVyIG4pCit7CisgICAgcmV0dXJuICh2b2lkKikgY21zTUxVZHVwKChjbXNNTFUqKSBQdHIpOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOworfQorCitzdGF0aWMKK3ZvaWQgVHlwZV9UZXh0X0Rlc2NyaXB0aW9uX0ZyZWUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCB2b2lkKiBQdHIpCit7CisgICAgY21zTUxVKiBtbHUgPSAoY21zTUxVKikgUHRyOworCisgICAgY21zTUxVZnJlZShtbHUpOworICAgIHJldHVybjsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Cit9CisKKworc3RhdGljCitjbXNUYWdUeXBlU2lnbmF0dXJlIERlY2lkZVRleHREZXNjVHlwZShjbXNGbG9hdDY0TnVtYmVyIElDQ1ZlcnNpb24sIGNvbnN0IHZvaWQgKkRhdGEpCit7CisgICAgaWYgKElDQ1ZlcnNpb24gPj0gNC4wKQorICAgICAgICByZXR1cm4gY21zU2lnTXVsdGlMb2NhbGl6ZWRVbmljb2RlVHlwZTsKKworICAgIHJldHVybiBjbXNTaWdUZXh0RGVzY3JpcHRpb25UeXBlOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihEYXRhKTsKK30KKworCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gVHlwZSBjbXNTaWdDdXJ2ZVR5cGUKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK3N0YXRpYwordm9pZCAqVHlwZV9DdXJ2ZV9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyKiBuSXRlbXMsIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcpCit7CisgICAgY21zVUludDMyTnVtYmVyIENvdW50OworICAgIGNtc1RvbmVDdXJ2ZSogTmV3R2FtbWE7CisgICAgCisgICAgKm5JdGVtcyA9IDA7CisgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJkNvdW50KSkgcmV0dXJuIE5VTEw7CisKKyAgICBzd2l0Y2ggKENvdW50KSB7CisKKyAgICAgICAgICAgY2FzZSAwOiAgIC8vIExpbmVhci4KKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIFNpbmdsZUdhbW1hID0gMS4wOworCisgICAgICAgICAgICAgICAgICAgTmV3R2FtbWEgPSBjbXNCdWlsZFBhcmFtZXRyaWNUb25lQ3VydmUoc2VsZiAtPkNvbnRleHRJRCwgMSwgJlNpbmdsZUdhbW1hKTsKKyAgICAgICAgICAgICAgICAgICBpZiAoIU5ld0dhbW1hKSByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAqbkl0ZW1zID0gMTsKKyAgICAgICAgICAgICAgICAgICByZXR1cm4gTmV3R2FtbWE7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIAorICAgICAgICAgICBjYXNlIDE6ICAvLyBTcGVjaWZpZWQgYXMgdGhlIGV4cG9uZW50IG9mIGdhbW1hIGZ1bmN0aW9uCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgY21zVUludDE2TnVtYmVyIFNpbmdsZUdhbW1hRml4ZWQ7CisgICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBTaW5nbGVHYW1tYTsKKworICAgICAgICAgICAgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sICZTaW5nbGVHYW1tYUZpeGVkKSkgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgU2luZ2xlR2FtbWEgPSBfY21zOEZpeGVkOHRvRG91YmxlKFNpbmdsZUdhbW1hRml4ZWQpOworCisgICAgICAgICAgICAgICAgICAgKm5JdGVtcyA9IDE7CisgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNtc0J1aWxkUGFyYW1ldHJpY1RvbmVDdXJ2ZShzZWxmIC0+Q29udGV4dElELCAxLCAmU2luZ2xlR2FtbWEpOworICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgIGRlZmF1bHQ6ICAvLyBDdXJ2ZQorCisgICAgICAgICAgICAgICBpZiAoQ291bnQgPiAweDdGRkYpCisgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7IC8vIFRoaXMgaXMgdG8gcHJldmVudCBiYWQgZ3V5cyBmb3IgZG9pbmcgYmFkIHRoaW5ncworCisgICAgICAgICAgICAgICBOZXdHYW1tYSA9IGNtc0J1aWxkVGFidWxhdGVkVG9uZUN1cnZlMTYoc2VsZiAtPkNvbnRleHRJRCwgQ291bnQsIE5VTEwpOworICAgICAgICAgICAgICAgaWYgKCFOZXdHYW1tYSkgcmV0dXJuIE5VTEw7CisKKyAgICAgICAgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZBcnJheShpbywgQ291bnQsIE5ld0dhbW1hIC0+IFRhYmxlMTYpKSB7CisgICAgICAgICAgICAgICAgIGNtc0ZyZWVUb25lQ3VydmUoTmV3R2FtbWEpOworICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgKm5JdGVtcyA9IDE7CisgICAgICAgICAgICAgICByZXR1cm4gTmV3R2FtbWE7CisgICAgfQorCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTaXplT2ZUYWcpOworfQorCisKK3N0YXRpYworY21zQm9vbCAgVHlwZV9DdXJ2ZV9Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKK3sKKyAgICBjbXNUb25lQ3VydmUqIEN1cnZlID0gKGNtc1RvbmVDdXJ2ZSopIFB0cjsKKworICAgIGlmIChDdXJ2ZSAtPm5TZWdtZW50cyA9PSAxICYmIEN1cnZlIC0+U2VnbWVudHNbMF0uVHlwZSA9PSAxKSB7CisKKyAgICAgICAgICAgIC8vIFNpbmdsZSBnYW1tYSwgcHJlc2VydmUgbnVtYmVyCisgICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIgU2luZ2xlR2FtbWFGaXhlZCA9IF9jbXNEb3VibGVUbzhGaXhlZDgoQ3VydmUgLT5TZWdtZW50c1swXS5QYXJhbXNbMF0pOworCisgICAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgMSkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCBTaW5nbGVHYW1tYUZpeGVkKSkgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICB9CisKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgQ3VydmUgLT5uRW50cmllcykpIHJldHVybiBGQUxTRTsKKyAgICByZXR1cm4gX2Ntc1dyaXRlVUludDE2QXJyYXkoaW8sIEN1cnZlIC0+bkVudHJpZXMsIEN1cnZlIC0+VGFibGUxNik7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKK30KKworCitzdGF0aWMKK3ZvaWQqIFR5cGVfQ3VydmVfRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKK3sKKyAgICByZXR1cm4gKHZvaWQqKSBjbXNEdXBUb25lQ3VydmUoKGNtc1RvbmVDdXJ2ZSopIFB0cik7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Cit9CisKK3N0YXRpYwordm9pZCBUeXBlX0N1cnZlX0ZyZWUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCB2b2lkKiBQdHIpCit7CisgICAgY21zVG9uZUN1cnZlKiBnYW1tYSA9IChjbXNUb25lQ3VydmUqKSBQdHI7CisKKyAgICBjbXNGcmVlVG9uZUN1cnZlKGdhbW1hKTsKKyAgICByZXR1cm47CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOworfQorCisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBUeXBlIGNtc1NpZ1BhcmFtZXRyaWNDdXJ2ZVR5cGUKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKworLy8gRGVjaWRlIHdoaWNoIGN1cnZlIHR5cGUgdG8gdXNlIG9uIHdyaXR0aW5nCitzdGF0aWMKK2Ntc1RhZ1R5cGVTaWduYXR1cmUgRGVjaWRlQ3VydmVUeXBlKGNtc0Zsb2F0NjROdW1iZXIgSUNDVmVyc2lvbiwgY29uc3Qgdm9pZCAqRGF0YSkKK3sKKyAgICBjbXNUb25lQ3VydmUqIEN1cnZlID0gKGNtc1RvbmVDdXJ2ZSopIERhdGE7CisKKyAgICBpZiAoSUNDVmVyc2lvbiA8IDQuMCkgcmV0dXJuIGNtc1NpZ0N1cnZlVHlwZTsKKyAgICBpZiAoQ3VydmUgLT5uU2VnbWVudHMgIT0gMSkgcmV0dXJuIGNtc1NpZ0N1cnZlVHlwZTsgICAgICAgICAgLy8gT25seSAxLXNlZ21lbnQgY3VydmVzIGNhbiBiZSBzYXZlZCBhcyBwYXJhbWV0cmljCisgICAgaWYgKEN1cnZlIC0+U2VnbWVudHNbMF0uVHlwZSA8IDApIHJldHVybiBjbXNTaWdDdXJ2ZVR5cGU7ICAgIC8vIE9ubHkgbm9uLWludmVydGVkIGN1cnZlcworICAgIGlmIChDdXJ2ZSAtPlNlZ21lbnRzWzBdLlR5cGUgPiA1KSByZXR1cm4gY21zU2lnQ3VydmVUeXBlOyAgICAvLyBPbmx5IElDQyBwYXJhbWV0cmljIGN1cnZlcworCisgICAgcmV0dXJuIGNtc1NpZ1BhcmFtZXRyaWNDdXJ2ZVR5cGU7Cit9CisKK3N0YXRpYwordm9pZCAqVHlwZV9QYXJhbWV0cmljQ3VydmVfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQoreworICAgIHN0YXRpYyBjb25zdCBpbnQgUGFyYW1zQnlUeXBlW10gPSB7IDEsIDMsIDQsIDUsIDcgfTsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIFBhcmFtc1sxMF07CisgICAgY21zVUludDE2TnVtYmVyIFR5cGU7CisgICAgaW50IGksIG47CisgICAgY21zVG9uZUN1cnZlKiBOZXdHYW1tYTsKKworICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sICZUeXBlKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgTlVMTCkpIHJldHVybiBOVUxMOyAgIC8vIFJlc2VydmVkCisKKyAgICBpZiAoVHlwZSA+IDQpIHsKKworICAgICAgICBjbXNTaWduYWxFcnJvcihzZWxmLT5Db250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5rbm93biBwYXJhbWV0cmljIGN1cnZlIHR5cGUgJyVkJyIsIFR5cGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBtZW1zZXQoUGFyYW1zLCAwLCBzaXplb2YoUGFyYW1zKSk7CisgICAgbiA9IFBhcmFtc0J5VHlwZVtUeXBlXTsKKworICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7CisKKyAgICAgICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgJlBhcmFtc1tpXSkpIHJldHVybiBOVUxMOworICAgIH0KKworICAgIE5ld0dhbW1hID0gY21zQnVpbGRQYXJhbWV0cmljVG9uZUN1cnZlKHNlbGYgLT5Db250ZXh0SUQsIFR5cGUrMSwgUGFyYW1zKTsKKworICAgICpuSXRlbXMgPSAxOworICAgIHJldHVybiBOZXdHYW1tYTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU2l6ZU9mVGFnKTsKK30KKworCitzdGF0aWMKK2Ntc0Jvb2wgIFR5cGVfUGFyYW1ldHJpY0N1cnZlX1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQoreworICAgIGNtc1RvbmVDdXJ2ZSogQ3VydmUgPSAoY21zVG9uZUN1cnZlKikgUHRyOworICAgIGludCBpLCBuUGFyYW1zLCB0eXBlbjsKKyAgICBzdGF0aWMgY29uc3QgaW50IFBhcmFtc0J5VHlwZVtdID0geyAwLCAxLCAzLCA0LCA1LCA3IH07CisKKyAgICB0eXBlbiA9IEN1cnZlIC0+IFNlZ21lbnRzWzBdLlR5cGU7CisKKyAgICBpZiAoQ3VydmUgLT5uU2VnbWVudHMgPiAxIHx8IHR5cGVuIDwgMSkgeworCisgICAgICAgIGNtc1NpZ25hbEVycm9yKHNlbGYtPkNvbnRleHRJRCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJNdWx0aXNlZ21lbnQgb3IgSW52ZXJ0ZWQgcGFyYW1ldHJpYyBjdXJ2ZXMgY2Fubm90IGJlIHdyaXR0ZW4iKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmICh0eXBlbiA+IDUpIHsKKyAgICAgICAgY21zU2lnbmFsRXJyb3Ioc2VsZi0+Q29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVuc3VwcG9ydGVkIHBhcmFtZXRyaWMgY3VydmUiKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIG5QYXJhbXMgPSBQYXJhbXNCeVR5cGVbdHlwZW5dOworCisgICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIChjbXNVSW50MTZOdW1iZXIpIChDdXJ2ZSAtPlNlZ21lbnRzWzBdLlR5cGUgLSAxKSkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsgICAgICAgIC8vIFJlc2VydmVkCisKKyAgICBmb3IgKGk9MDsgaSA8IG5QYXJhbXM7IGkrKykgeworCisgICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBDdXJ2ZSAtPiBTZWdtZW50c1swXS5QYXJhbXNbaV0pKSByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7Cit9CisKK3N0YXRpYwordm9pZCogVHlwZV9QYXJhbWV0cmljQ3VydmVfRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKK3sKKyAgICByZXR1cm4gKHZvaWQqKSBjbXNEdXBUb25lQ3VydmUoKGNtc1RvbmVDdXJ2ZSopIFB0cik7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Cit9CisKK3N0YXRpYwordm9pZCBUeXBlX1BhcmFtZXRyaWNDdXJ2ZV9GcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCogUHRyKQoreworICAgIGNtc1RvbmVDdXJ2ZSogZ2FtbWEgPSAoY21zVG9uZUN1cnZlKikgUHRyOworCisgICAgY21zRnJlZVRvbmVDdXJ2ZShnYW1tYSk7CisgICAgcmV0dXJuOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKK30KKworCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gVHlwZSBjbXNTaWdEYXRlVGltZVR5cGUKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8vIEEgMTItYnl0ZSB2YWx1ZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGltZSBhbmQgZGF0ZSwgd2hlcmUgdGhlIGJ5dGUgdXNhZ2UgaXMgYXNzaWduZWQKKy8vIGFzIHNwZWNpZmllZCBpbiB0YWJsZSAxLiBUaGUgYWN0dWFsIHZhbHVlcyBhcmUgZW5jb2RlZCBhcyAxNi1iaXQgdW5zaWduZWQgaW50ZWdlcnMKKy8vICh1SW50MTZOdW1iZXIgLSBzZWUgNS4xLjYpLgorLy8KKy8vIEFsbCB0aGUgZGF0ZVRpbWVOdW1iZXIgdmFsdWVzIGluIGEgcHJvZmlsZSBzaGFsbCBiZSBpbiBDb29yZGluYXRlZCBVbml2ZXJzYWwgVGltZQorLy8gKFVUQywgYWxzbyBrbm93biBhcyBHTVQgb3IgWlVMVSBUaW1lKS4gUHJvZmlsZSB3cml0ZXJzIGFyZSByZXF1aXJlZCB0byBjb252ZXJ0IGxvY2FsCisvLyB0aW1lIHRvIFVUQyB3aGVuIHNldHRpbmcgdGhlc2UgdmFsdWVzLiBQcm9ncmFtbWVzIHRoYXQgZGlzcGxheSB0aGVzZSB2YWx1ZXMgbWF5IHNob3cKKy8vIHRoZSBkYXRlVGltZU51bWJlciBhcyBVVEMsIHNob3cgdGhlIGVxdWl2YWxlbnQgbG9jYWwgdGltZSAoYXQgY3VycmVudCBsb2NhbGUpLCBvcgorLy8gZGlzcGxheSBib3RoIFVUQyBhbmQgbG9jYWwgdmVyc2lvbnMgb2YgdGhlIGRhdGVUaW1lTnVtYmVyLgorCitzdGF0aWMKK3ZvaWQgKlR5cGVfRGF0ZVRpbWVfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQoreworICAgIGNtc0RhdGVUaW1lTnVtYmVyIHRpbWVzdGFtcDsKKyAgICBzdHJ1Y3QgdG0gKiBOZXdEYXRlVGltZTsKKworICAgICpuSXRlbXMgPSAwOworICAgIE5ld0RhdGVUaW1lID0gKHN0cnVjdCB0bSopIF9jbXNNYWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgc2l6ZW9mKHN0cnVjdCB0bSkpOworICAgIGlmIChOZXdEYXRlVGltZSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIGlmIChpby0+UmVhZChpbywgJnRpbWVzdGFtcCwgc2l6ZW9mKGNtc0RhdGVUaW1lTnVtYmVyKSwgMSkgIT0gMSkgcmV0dXJuIE5VTEw7CisKKyAgICAgX2Ntc0RlY29kZURhdGVUaW1lTnVtYmVyKCZ0aW1lc3RhbXAsIE5ld0RhdGVUaW1lKTsKKworICAgICAqbkl0ZW1zID0gMTsKKyAgICAgcmV0dXJuIE5ld0RhdGVUaW1lOworCisgICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU2l6ZU9mVGFnKTsKK30KKworCitzdGF0aWMKK2Ntc0Jvb2wgIFR5cGVfRGF0ZVRpbWVfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCit7CisgICAgc3RydWN0IHRtICogRGF0ZVRpbWUgPSAoc3RydWN0IHRtKikgUHRyOworICAgIGNtc0RhdGVUaW1lTnVtYmVyIHRpbWVzdGFtcDsKKworICAgIF9jbXNFbmNvZGVEYXRlVGltZU51bWJlcigmdGltZXN0YW1wLCBEYXRlVGltZSk7CisgICAgaWYgKCFpbyAtPldyaXRlKGlvLCBzaXplb2YoY21zRGF0ZVRpbWVOdW1iZXIpLCAmdGltZXN0YW1wKSkgcmV0dXJuIEZBTFNFOworCisgICAgcmV0dXJuIFRSVUU7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKK30KKworc3RhdGljCit2b2lkKiBUeXBlX0RhdGVUaW1lX0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQgKlB0ciwgY21zVUludDMyTnVtYmVyIG4pCit7CisgICAgcmV0dXJuIF9jbXNEdXBNZW0oc2VsZiAtPkNvbnRleHRJRCwgUHRyLCBzaXplb2Yoc3RydWN0IHRtKSk7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOworfQorCitzdGF0aWMKK3ZvaWQgVHlwZV9EYXRlVGltZV9GcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCogUHRyKQoreworICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFB0cik7Cit9CisKKworCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gVHlwZSBpY01lYXN1cmVtZW50VHlwZQorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLyoKK1RoZSBtZWFzdXJlbWVudFR5cGUgaW5mb3JtYXRpb24gcmVmZXJzIG9ubHkgdG8gdGhlIGludGVybmFsIHByb2ZpbGUgZGF0YSBhbmQgaXMKK21lYW50IHRvIHByb3ZpZGUgcHJvZmlsZSBtYWtlcnMgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIGRlZmF1bHQgbWVhc3VyZW1lbnQKK3NwZWNpZmljYXRpb25zLgorKi8KKworc3RhdGljCit2b2lkICpUeXBlX01lYXN1cmVtZW50X1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG5JdGVtcywgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKK3sKKyAgICBjbXNJQ0NNZWFzdXJlbWVudENvbmRpdGlvbnMgbWM7CisKKwkKKyAgICBtZW1zZXQoJm1jLCAwLCBzaXplb2YobWMpKTsKKwkKKyAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmbWMuT2JzZXJ2ZXIpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIV9jbXNSZWFkWFlaTnVtYmVyKGlvLCAgICAmbWMuQmFja2luZykpIHJldHVybiBOVUxMOworICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZtYy5HZW9tZXRyeSkpIHJldHVybiBOVUxMOworICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICZtYy5GbGFyZSkpIHJldHVybiBOVUxMOworICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZtYy5JbGx1bWluYW50VHlwZSkpIHJldHVybiBOVUxMOworCisgICAgKm5JdGVtcyA9IDE7CisgICAgcmV0dXJuIF9jbXNEdXBNZW0oc2VsZiAtPkNvbnRleHRJRCwgJm1jLCBzaXplb2YoY21zSUNDTWVhc3VyZW1lbnRDb25kaXRpb25zKSk7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFNpemVPZlRhZyk7Cit9CisKKworc3RhdGljCitjbXNCb29sICBUeXBlX01lYXN1cmVtZW50X1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQoreworICAgIGNtc0lDQ01lYXN1cmVtZW50Q29uZGl0aW9ucyogbWMgPShjbXNJQ0NNZWFzdXJlbWVudENvbmRpdGlvbnMqKSBQdHI7CisKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgbWMtPk9ic2VydmVyKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghX2Ntc1dyaXRlWFlaTnVtYmVyKGlvLCAgICAmbWMtPkJhY2tpbmcpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIG1jLT5HZW9tZXRyeSkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgbWMtPkZsYXJlKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBtYy0+SWxsdW1pbmFudFR5cGUpKSByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gVFJVRTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobkl0ZW1zKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOworfQorCitzdGF0aWMKK3ZvaWQqIFR5cGVfTWVhc3VyZW1lbnRfRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKK3sKKyAgICAgcmV0dXJuIF9jbXNEdXBNZW0oc2VsZiAtPkNvbnRleHRJRCwgUHRyLCBzaXplb2YoY21zSUNDTWVhc3VyZW1lbnRDb25kaXRpb25zKSk7CisKKyAgICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKK30KKworc3RhdGljCit2b2lkIFR5cGVfTWVhc3VyZW1lbnRfRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQqIFB0cikKK3sKKyAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFB0cik7Cit9CisKKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIFR5cGUgY21zU2lnTXVsdGlMb2NhbGl6ZWRVbmljb2RlVHlwZQorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyAgIERvIE5PVCB0cnVzdCBTaXplT2ZUYWcgYXMgdGhlcmUgaXMgYW4gaXNzdWUgb24gdGhlIGRlZmluaXRpb24gb2YgcHJvZmlsZVNlcXVlbmNlRGVzY1RhZy4gU2VlIHRoZSBUZWNoTm90ZSBmcm9tCisvLyAgIE1heCBEZXJoYWsgYW5kIFJvaGl0IFBhdGlsIGFib3V0IHRoaXM6IGJhc2ljYWxseSB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nIHRhYmxlIHNob3VsZCBiZSBndWVzc2VkIGFuZCBjYW5ub3QgYmUKKy8vICAgdGFrZW4gZnJvbSB0aGUgc2l6ZSBvZiB0YWcgaWYgdGhpcyB0YWcgaXMgZW1iZWRkZWQgYXMgcGFydCBvZiBiaWdnZXIgc3RydWN0dXJlcyAocHJvZmlsZVNlcXVlbmNlRGVzY1RhZywgZm9yIGluc3RhbmNlKQorLy8KKworc3RhdGljCit2b2lkICpUeXBlX01MVV9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyKiBuSXRlbXMsIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcpCit7CisgICAgY21zTUxVKiBtbHU7CisgICAgY21zVUludDMyTnVtYmVyIENvdW50LCBSZWNMZW4sIE51bU9mV2NoYXI7CisgICAgY21zVUludDMyTnVtYmVyIFNpemVPZkhlYWRlcjsKKyAgICBjbXNVSW50MzJOdW1iZXIgIExlbiwgT2Zmc2V0OworICAgIGNtc1VJbnQzMk51bWJlciAgaTsKKyAgICB3Y2hhcl90KiAgICAgICAgIEJsb2NrOworICAgIGNtc1VJbnQzMk51bWJlciAgQmVnaW5PZlRoaXNTdHJpbmcsIEVuZE9mVGhpc1N0cmluZywgTGFyZ2VzdFBvc2l0aW9uOworCisgICAgKm5JdGVtcyA9IDA7CisgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJkNvdW50KSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJlJlY0xlbikpIHJldHVybiBOVUxMOworCisgICAgaWYgKFJlY0xlbiAhPSAxMikgeworCisgICAgICAgIGNtc1NpZ25hbEVycm9yKHNlbGYtPkNvbnRleHRJRCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJtdWx0aUxvY2FsaXplZFVuaWNvZGVUeXBlIG9mIGxlbiAhPSAxMiBpcyBub3Qgc3VwcG9ydGVkLiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBtbHUgPSBjbXNNTFVhbGxvYyhzZWxmIC0+Q29udGV4dElELCBDb3VudCk7CisgICAgaWYgKG1sdSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIG1sdSAtPlVzZWRFbnRyaWVzID0gQ291bnQ7CisKKyAgICBTaXplT2ZIZWFkZXIgPSAxMiAqIENvdW50ICsgc2l6ZW9mKF9jbXNUYWdCYXNlKTsKKyAgICBMYXJnZXN0UG9zaXRpb24gPSAwOworCisgICAgZm9yIChpPTA7IGkgPCBDb3VudDsgaSsrKSB7CisKKyAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgJm1sdSAtPkVudHJpZXNbaV0uTGFuZ3VhZ2UpKSBnb3RvIEVycm9yOworICAgICAgICBpZiAoIV9jbXNSZWFkVUludDE2TnVtYmVyKGlvLCAmbWx1IC0+RW50cmllc1tpXS5Db3VudHJ5KSkgIGdvdG8gRXJyb3I7CisKKyAgICAgICAgLy8gTm93IGRlYWwgd2l0aCBMZW4gYW5kIG9mZnNldC4KKyAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJkxlbikpIGdvdG8gRXJyb3I7CisgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZPZmZzZXQpKSBnb3RvIEVycm9yOworCisgICAgICAgIC8vIENoZWNrIGZvciBvdmVyZmxvdworICAgICAgICBpZiAoT2Zmc2V0IDwgKFNpemVPZkhlYWRlciArIDgpKSBnb3RvIEVycm9yOworCisgICAgICAgIC8vIFRydWUgYmVnaW4gb2YgdGhlIHN0cmluZworICAgICAgICBCZWdpbk9mVGhpc1N0cmluZyA9IE9mZnNldCAtIFNpemVPZkhlYWRlciAtIDg7CisKKyAgICAgICAgLy8gQWp1c3QgdG8gd2NoYXJfdCBlbGVtZW50cworICAgICAgICBtbHUgLT5FbnRyaWVzW2ldLkxlbiA9IChMZW4gKiBzaXplb2Yod2NoYXJfdCkpIC8gc2l6ZW9mKGNtc1VJbnQxNk51bWJlcik7CisgICAgICAgIG1sdSAtPkVudHJpZXNbaV0uU3RyVyA9IChCZWdpbk9mVGhpc1N0cmluZyAqIHNpemVvZih3Y2hhcl90KSkgLyBzaXplb2YoY21zVUludDE2TnVtYmVyKTsKKworICAgICAgICAvLyBUbyBndWVzcyBtYXhpbXVtIHNpemUsIGFkZCBvZmZzZXQgKyBsZW4KKyAgICAgICAgRW5kT2ZUaGlzU3RyaW5nID0gQmVnaW5PZlRoaXNTdHJpbmcgKyBMZW47CisgICAgICAgIGlmIChFbmRPZlRoaXNTdHJpbmcgPiBMYXJnZXN0UG9zaXRpb24pCisgICAgICAgICAgICBMYXJnZXN0UG9zaXRpb24gPSBFbmRPZlRoaXNTdHJpbmc7CisgICAgfQorCisgICAgLy8gTm93IHJlYWQgdGhlIHJlbWFpbmluZyBvZiB0YWcgYW5kIGZpbGwgYWxsIHN0cmluZ3MuIFN1YnRyYWN0IHRoZSBkaXJlY3RvcnkKKyAgICBTaXplT2ZUYWcgICA9IChMYXJnZXN0UG9zaXRpb24gKiBzaXplb2Yod2NoYXJfdCkpIC8gc2l6ZW9mKGNtc1VJbnQxNk51bWJlcik7CisgICAgaWYgKFNpemVPZlRhZyA9PSAwKQorICAgIHsKKyAgICAgICAgQmxvY2sgPSBOVUxMOworICAgICAgICBOdW1PZldjaGFyID0gMDsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBCbG9jayA9ICh3Y2hhcl90KikgX2Ntc01hbGxvYyhzZWxmIC0+Q29udGV4dElELCBTaXplT2ZUYWcpOworICAgICAgICBpZiAoQmxvY2sgPT0gTlVMTCkgZ290byBFcnJvcjsKKyAgICAgICAgTnVtT2ZXY2hhciA9IFNpemVPZlRhZyAvIHNpemVvZih3Y2hhcl90KTsKKyAgICAgICAgaWYgKCFfY21zUmVhZFdDaGFyQXJyYXkoaW8sIE51bU9mV2NoYXIsIEJsb2NrKSkgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICBtbHUgLT5NZW1Qb29sICA9IEJsb2NrOworICAgIG1sdSAtPlBvb2xTaXplID0gU2l6ZU9mVGFnOworICAgIG1sdSAtPlBvb2xVc2VkID0gU2l6ZU9mVGFnOworCisgICAgKm5JdGVtcyA9IDE7CisgICAgcmV0dXJuICh2b2lkKikgbWx1OworCitFcnJvcjoKKyAgICBpZiAobWx1KSBjbXNNTFVmcmVlKG1sdSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYworY21zQm9vbCAgVHlwZV9NTFVfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCit7CisgICAgY21zTUxVKiBtbHUgPShjbXNNTFUqKSBQdHI7CisgICAgY21zVUludDMyTnVtYmVyIEhlYWRlclNpemU7CisgICAgY21zVUludDMyTnVtYmVyICBMZW4sIE9mZnNldDsKKyAgICBjbXNVSW50MzJOdW1iZXIgaTsKKworICAgIGlmIChQdHIgPT0gTlVMTCkgeworCisgICAgICAgICAgLy8gRW1wdHkgcGxhY2Vob2xkZXIKKyAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgMTIpKSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIG1sdSAtPlVzZWRFbnRyaWVzKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCAxMikpIHJldHVybiBGQUxTRTsKKworICAgIEhlYWRlclNpemUgPSAxMiAqIG1sdSAtPlVzZWRFbnRyaWVzICsgc2l6ZW9mKF9jbXNUYWdCYXNlKTsKKworICAgIGZvciAoaT0wOyBpIDwgbWx1IC0+VXNlZEVudHJpZXM7IGkrKykgeworCisgICAgICAgIExlbiAgICA9ICBtbHUgLT5FbnRyaWVzW2ldLkxlbjsKKyAgICAgICAgT2Zmc2V0ID0gIG1sdSAtPkVudHJpZXNbaV0uU3RyVzsKKworICAgICAgICBMZW4gICAgPSAoTGVuICogc2l6ZW9mKGNtc1VJbnQxNk51bWJlcikpIC8gc2l6ZW9mKHdjaGFyX3QpOworICAgICAgICBPZmZzZXQgPSAoT2Zmc2V0ICogc2l6ZW9mKGNtc1VJbnQxNk51bWJlcikpIC8gc2l6ZW9mKHdjaGFyX3QpICsgSGVhZGVyU2l6ZSArIDg7CisKKyAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIG1sdSAtPkVudHJpZXNbaV0uTGFuZ3VhZ2UpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCBtbHUgLT5FbnRyaWVzW2ldLkNvdW50cnkpKSAgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgTGVuKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgT2Zmc2V0KSkgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmICghX2Ntc1dyaXRlV0NoYXJBcnJheShpbywgbWx1IC0+UG9vbFVzZWQgLyBzaXplb2Yod2NoYXJfdCksICh3Y2hhcl90KikgIG1sdSAtPk1lbVBvb2wpKSByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gVFJVRTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobkl0ZW1zKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOworfQorCisKK3N0YXRpYwordm9pZCogVHlwZV9NTFVfRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKK3sKKyAgICByZXR1cm4gKHZvaWQqKSBjbXNNTFVkdXAoKGNtc01MVSopIFB0cik7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Cit9CisKK3N0YXRpYwordm9pZCBUeXBlX01MVV9GcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCogUHRyKQoreworICAgIGNtc01MVWZyZWUoKGNtc01MVSopIFB0cik7CisgICAgcmV0dXJuOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKK30KKworCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gVHlwZSBjbXNTaWdMdXQ4VHlwZQorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLy8gRGVjaWRlIHdoaWNoIExVVCB0eXBlIHRvIHVzZSBvbiB3cml0dGluZworc3RhdGljCitjbXNUYWdUeXBlU2lnbmF0dXJlIERlY2lkZUxVVHR5cGVBMkIoY21zRmxvYXQ2NE51bWJlciBJQ0NWZXJzaW9uLCBjb25zdCB2b2lkICpEYXRhKQoreworICAgIGNtc1BpcGVsaW5lKiBMdXQgPSAoY21zUGlwZWxpbmUqKSBEYXRhOworCisgICAgaWYgKElDQ1ZlcnNpb24gPCA0LjApIHsKKyAgICAgICAgaWYgKEx1dCAtPlNhdmVBczhCaXRzKSByZXR1cm4gY21zU2lnTHV0OFR5cGU7CisgICAgICAgIHJldHVybiBjbXNTaWdMdXQxNlR5cGU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAgcmV0dXJuIGNtc1NpZ0x1dEF0b0JUeXBlOworICAgIH0KK30KKworc3RhdGljCitjbXNUYWdUeXBlU2lnbmF0dXJlIERlY2lkZUxVVHR5cGVCMkEoY21zRmxvYXQ2NE51bWJlciBJQ0NWZXJzaW9uLCBjb25zdCB2b2lkICpEYXRhKQoreworICAgIGNtc1BpcGVsaW5lKiBMdXQgPSAoY21zUGlwZWxpbmUqKSBEYXRhOworCisgICAgaWYgKElDQ1ZlcnNpb24gPCA0LjApIHsKKyAgICAgICAgaWYgKEx1dCAtPlNhdmVBczhCaXRzKSByZXR1cm4gY21zU2lnTHV0OFR5cGU7CisgICAgICAgIHJldHVybiBjbXNTaWdMdXQxNlR5cGU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAgcmV0dXJuIGNtc1NpZ0x1dEJ0b0FUeXBlOworICAgIH0KK30KKworLyoKK1RoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgYSBjb2xvdXIgdHJhbnNmb3JtIHVzaW5nIHRhYmxlcyBvZiA4LWJpdCBwcmVjaXNpb24uCitUaGlzIHR5cGUgY29udGFpbnMgZm91ciBwcm9jZXNzaW5nIGVsZW1lbnRzOiBhIDMgYnkgMyBtYXRyaXggKHdoaWNoIHNoYWxsIGJlCit0aGUgaWRlbnRpdHkgbWF0cml4IHVubGVzcyB0aGUgaW5wdXQgY29sb3VyIHNwYWNlIGlzIFhZWiksIGEgc2V0IG9mIG9uZSBkaW1lbnNpb25hbAoraW5wdXQgdGFibGVzLCBhIG11bHRpZGltZW5zaW9uYWwgbG9va3VwIHRhYmxlLCBhbmQgYSBzZXQgb2Ygb25lIGRpbWVuc2lvbmFsIG91dHB1dAordGFibGVzLiBEYXRhIGlzIHByb2Nlc3NlZCB1c2luZyB0aGVzZSBlbGVtZW50cyB2aWEgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZToKKyhtYXRyaXgpIC0+ICgxZCBpbnB1dCB0YWJsZXMpICAtPiAobXVsdGlkaW1lbnNpb25hbCBsb29rdXAgdGFibGUgLSBDTFVUKSAtPiAoMWQgb3V0cHV0IHRhYmxlcykKKworQnl0ZSBQb3NpdGlvbiAgIEZpZWxkIExlbmd0aCAoYnl0ZXMpICBDb250ZW50IEVuY29kZWQgYXMuLi4KKzggICAgICAgICAgICAgICAgICAxICAgICAgICAgIE51bWJlciBvZiBJbnB1dCBDaGFubmVscyAoaSkgICAgdUludDhOdW1iZXIKKzkgICAgICAgICAgICAgICAgICAxICAgICAgICAgIE51bWJlciBvZiBPdXRwdXQgQ2hhbm5lbHMgKG8pICAgdUludDhOdW1iZXIKKzEwICAgICAgICAgICAgICAgICAxICAgICAgICAgIE51bWJlciBvZiBDTFVUIGdyaWQgcG9pbnRzIChpZGVudGljYWwgZm9yIGVhY2ggc2lkZSkgKGcpIHVJbnQ4TnVtYmVyCisxMSAgICAgICAgICAgICAgICAgMSAgICAgICAgICBSZXNlcnZlZCBmb3IgcGFkZGluZyAoZmlsbCB3aXRoIDAwaCkKKworMTIuLjE1ICAgICAgICAgICAgIDQgICAgICAgICAgRW5jb2RlZCBlMDAgcGFyYW1ldGVyICAgczE1Rml4ZWQxNk51bWJlcgorKi8KKworCisvLyBSZWFkIDggYml0IHRhYmxlcyBhcyBnYW1tYSBmdW5jdGlvbnMKK3N0YXRpYworY21zQm9vbCAgUmVhZDhiaXRUYWJsZXMoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc0lPSEFORExFUiogaW8sIGNtc1BpcGVsaW5lKiBsdXQsIGludCBuQ2hhbm5lbHMpCit7CisgICAgY21zVUludDhOdW1iZXIqIFRlbXAgPSBOVUxMOworICAgIGludCBpLCBqOworICAgIGNtc1RvbmVDdXJ2ZSogVGFibGVzW2Ntc01BWENIQU5ORUxTXTsKKworICAgIGlmIChuQ2hhbm5lbHMgPiBjbXNNQVhDSEFOTkVMUykgcmV0dXJuIEZBTFNFOworICAgIGlmIChuQ2hhbm5lbHMgPD0gMCkgcmV0dXJuIEZBTFNFOworCisgICAgbWVtc2V0KFRhYmxlcywgMCwgc2l6ZW9mKFRhYmxlcykpOworCisgICAgVGVtcCA9IChjbXNVSW50OE51bWJlciopIF9jbXNNYWxsb2MoQ29udGV4dElELCAyNTYpOworICAgIGlmIChUZW1wID09IE5VTEwpIHJldHVybiBGQUxTRTsKKworICAgIGZvciAoaT0wOyBpIDwgbkNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgVGFibGVzW2ldID0gY21zQnVpbGRUYWJ1bGF0ZWRUb25lQ3VydmUxNihDb250ZXh0SUQsIDI1NiwgTlVMTCk7CisgICAgICAgIGlmIChUYWJsZXNbaV0gPT0gTlVMTCkgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICBmb3IgKGk9MDsgaSA8IG5DaGFubmVsczsgaSsrKSB7CisKKyAgICAgICAgaWYgKGlvIC0+UmVhZChpbywgVGVtcCwgMjU2LCAxKSAhPSAxKSBnb3RvIEVycm9yOworCisgICAgICAgIGZvciAoaj0wOyBqIDwgMjU2OyBqKyspCisgICAgICAgICAgICBUYWJsZXNbaV0tPlRhYmxlMTZbal0gPSAoY21zVUludDE2TnVtYmVyKSBGUk9NXzhfVE9fMTYoVGVtcFtqXSk7CisgICAgfQorCisgICAgX2Ntc0ZyZWUoQ29udGV4dElELCBUZW1wKTsKKyAgICBUZW1wID0gTlVMTDsKKworICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShsdXQsIGNtc0FUX0VORCwgY21zU3RhZ2VBbGxvY1RvbmVDdXJ2ZXMoQ29udGV4dElELCBuQ2hhbm5lbHMsIFRhYmxlcykpKQorICAgICAgICBnb3RvIEVycm9yOworCisgICAgZm9yIChpPTA7IGkgPCBuQ2hhbm5lbHM7IGkrKykKKyAgICAgICAgY21zRnJlZVRvbmVDdXJ2ZShUYWJsZXNbaV0pOworCisgICAgcmV0dXJuIFRSVUU7CisKK0Vycm9yOgorICAgIGZvciAoaT0wOyBpIDwgbkNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgaWYgKFRhYmxlc1tpXSkgY21zRnJlZVRvbmVDdXJ2ZShUYWJsZXNbaV0pOworICAgIH0KKworICAgIGlmIChUZW1wKSBfY21zRnJlZShDb250ZXh0SUQsIFRlbXApOworICAgIHJldHVybiBGQUxTRTsKK30KKworCitzdGF0aWMKK2Ntc0Jvb2wgV3JpdGU4Yml0VGFibGVzKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIgbiwgX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqIFRhYmxlcykKK3sKKyAgICBpbnQgajsKKyAgICBjbXNVSW50MzJOdW1iZXIgaTsKKyAgICBjbXNVSW50OE51bWJlciB2YWw7CisKKyAgICBmb3IgKGk9MDsgaSA8IG47IGkrKykgeworCisgICAgICAgIGlmIChUYWJsZXMpIHsKKworICAgICAgICAgICAgLy8gVXN1YWwgY2FzZSBvZiBpZGVudGl0eSBjdXJ2ZXMKKyAgICAgICAgICAgIGlmICgoVGFibGVzIC0+VGhlQ3VydmVzW2ldLT5uRW50cmllcyA9PSAyKSAmJiAKKyAgICAgICAgICAgICAgICAoVGFibGVzLT5UaGVDdXJ2ZXNbaV0tPlRhYmxlMTZbMF0gPT0gMCkgJiYgCisgICAgICAgICAgICAgICAgKFRhYmxlcy0+VGhlQ3VydmVzW2ldLT5UYWJsZTE2WzFdID09IDY1NTM1KSkgeworCisgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgMjU2OyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDhOdW1iZXIoaW8sIChjbXNVSW50OE51bWJlcikgaikpIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICBpZiAoVGFibGVzIC0+VGhlQ3VydmVzW2ldLT5uRW50cmllcyAhPSAyNTYpIHsKKyAgICAgICAgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgIkxVVDggbmVlZHMgMjU2IGVudHJpZXMgb24gcHJlbGluZWFyaXphdGlvbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgMjU2OyBqKyspIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gKGNtc1VJbnQ4TnVtYmVyKSBGUk9NXzE2X1RPXzgoVGFibGVzLT5UaGVDdXJ2ZXNbaV0tPlRhYmxlMTZbal0pOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQ4TnVtYmVyKGlvLCB2YWwpKSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLyBDaGVjayBvdmVyZmxvdworc3RhdGljCitjbXNVSW50MzJOdW1iZXIgdWlwb3coY21zVUludDMyTnVtYmVyIG4sIGNtc1VJbnQzMk51bWJlciBhLCBjbXNVSW50MzJOdW1iZXIgYikKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgcnYgPSAxLCByYzsKKworICAgIGlmIChhID09IDApIHJldHVybiAwOworICAgIGlmIChuID09IDApIHJldHVybiAwOworCisgICAgZm9yICg7IGIgPiAwOyBiLS0pIHsKKworICAgICAgICBydiAqPSBhOworCisgICAgICAgIC8vIENoZWNrIGZvciBvdmVyZmxvdworICAgICAgICBpZiAocnYgPiBVSU5UX01BWCAvIGEpIHJldHVybiAoY21zVUludDMyTnVtYmVyKSAtMTsKKworICAgIH0KKworICAgIHJjID0gcnYgKiBuOworCisgICAgaWYgKHJ2ICE9IHJjIC8gbikgcmV0dXJuIChjbXNVSW50MzJOdW1iZXIpIC0xOworICAgIHJldHVybiByYzsKK30KKworCisvLyBUaGF0IHdpbGwgY3JlYXRlIGEgTVBFIExVVCB3aXRoIE1hdHJpeCwgcHJlIHRhYmxlcywgQ0xVVCBhbmQgcG9zdCB0YWJsZXMuCisvLyA4IGJpdCBsdXQgbWF5IGJlIHNjYWxlZCBlYXNlbHkgdG8gdjQgUENTLCBidXQgd2UgbmVlZCBhbHNvIHRvIHByb3Blcmx5IGFkanVzdAorLy8gUENTIG9uIEJUb0F4eCB0YWdzIGFuZCBBdG9CIGlmIGFic3RyYWN0LiBXZSBuZWVkIHRvIGZpeCBpbnB1dCBkaXJlY3Rpb24uCisKK3N0YXRpYwordm9pZCAqVHlwZV9MVVQ4X1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG5JdGVtcywgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKK3sKKyAgICBjbXNVSW50OE51bWJlciBJbnB1dENoYW5uZWxzLCBPdXRwdXRDaGFubmVscywgQ0xVVHBvaW50czsKKyAgICBjbXNVSW50OE51bWJlciogVGVtcCA9IE5VTEw7CisgICAgY21zUGlwZWxpbmUqIE5ld0xVVCA9IE5VTEw7CisgICAgY21zVUludDMyTnVtYmVyIG5UYWJTaXplLCBpOworICAgIGNtc0Zsb2F0NjROdW1iZXIgTWF0cml4WzMqM107CisKKyAgICAqbkl0ZW1zID0gMDsKKworICAgIGlmICghX2Ntc1JlYWRVSW50OE51bWJlcihpbywgJklucHV0Q2hhbm5lbHMpKSBnb3RvIEVycm9yOworICAgIGlmICghX2Ntc1JlYWRVSW50OE51bWJlcihpbywgJk91dHB1dENoYW5uZWxzKSkgZ290byBFcnJvcjsKKyAgICBpZiAoIV9jbXNSZWFkVUludDhOdW1iZXIoaW8sICZDTFVUcG9pbnRzKSkgZ290byBFcnJvcjsKKworICAgICBpZiAoQ0xVVHBvaW50cyA9PSAxKSBnb3RvIEVycm9yOyAvLyBJbXBvc3NpYmxlIHZhbHVlLCAwIGZvciBubyBDTFVUIGFuZCB0aGVuIDIgYXQgbGVhc3QKKworICAgIC8vIFBhZGRpbmcKKyAgICBpZiAoIV9jbXNSZWFkVUludDhOdW1iZXIoaW8sIE5VTEwpKSBnb3RvIEVycm9yOworCisgICAgLy8gRG8gc29tZSBjaGVja2luZworICAgIGlmIChJbnB1dENoYW5uZWxzID09IDAgfHwgSW5wdXRDaGFubmVscyA+IGNtc01BWENIQU5ORUxTKSAgZ290byBFcnJvcjsKKyAgICBpZiAoT3V0cHV0Q2hhbm5lbHMgPT0gMCB8fCBPdXRwdXRDaGFubmVscyA+IGNtc01BWENIQU5ORUxTKSBnb3RvIEVycm9yOworCisgICAvLyBBbGxvY2F0ZXMgYW4gZW1wdHkgUGlwZWxpbmUKKyAgICBOZXdMVVQgPSBjbXNQaXBlbGluZUFsbG9jKHNlbGYgLT5Db250ZXh0SUQsIElucHV0Q2hhbm5lbHMsIE91dHB1dENoYW5uZWxzKTsKKyAgICBpZiAoTmV3TFVUID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgICAvLyBSZWFkIHRoZSBNYXRyaXgKKyAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAgJk1hdHJpeFswXSkpIGdvdG8gRXJyb3I7CisgICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgICZNYXRyaXhbMV0pKSBnb3RvIEVycm9yOworICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICAmTWF0cml4WzJdKSkgZ290byBFcnJvcjsKKyAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAgJk1hdHJpeFszXSkpIGdvdG8gRXJyb3I7CisgICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgICZNYXRyaXhbNF0pKSBnb3RvIEVycm9yOworICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICAmTWF0cml4WzVdKSkgZ290byBFcnJvcjsKKyAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAgJk1hdHJpeFs2XSkpIGdvdG8gRXJyb3I7CisgICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgICZNYXRyaXhbN10pKSBnb3RvIEVycm9yOworICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICAmTWF0cml4WzhdKSkgZ290byBFcnJvcjsKKworCisgICAgLy8gT25seSBvcGVyYXRlcyBpZiBub3QgaWRlbnRpdHkuLi4KKyAgICBpZiAoKElucHV0Q2hhbm5lbHMgPT0gMykgJiYgIV9jbXNNQVQzaXNJZGVudGl0eSgoY21zTUFUMyopIE1hdHJpeCkpIHsKKworICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTmV3TFVULCBjbXNBVF9CRUdJTiwgY21zU3RhZ2VBbGxvY01hdHJpeChzZWxmIC0+Q29udGV4dElELCAzLCAzLCBNYXRyaXgsIE5VTEwpKSkKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgLy8gR2V0IGlucHV0IHRhYmxlcworICAgIGlmICghUmVhZDhiaXRUYWJsZXMoc2VsZiAtPkNvbnRleHRJRCwgaW8sICBOZXdMVVQsIElucHV0Q2hhbm5lbHMpKSBnb3RvIEVycm9yOworCisgICAgLy8gR2V0IDNEIENMVVQuIENoZWNrIHRoZSBvdmVyZmxvdy4uLi4KKyAgICBuVGFiU2l6ZSA9IHVpcG93KE91dHB1dENoYW5uZWxzLCBDTFVUcG9pbnRzLCBJbnB1dENoYW5uZWxzKTsKKyAgICBpZiAoblRhYlNpemUgPT0gKGNtc1VJbnQzMk51bWJlcikgLTEpIGdvdG8gRXJyb3I7CisgICAgaWYgKG5UYWJTaXplID4gMCkgeworCisgICAgICAgIGNtc1VJbnQxNk51bWJlciAqUHRyVywgKlQ7CisgICAgICAgCisgICAgICAgIFB0clcgPSBUICA9IChjbXNVSW50MTZOdW1iZXIqKSBfY21zQ2FsbG9jKHNlbGYgLT5Db250ZXh0SUQsIG5UYWJTaXplLCBzaXplb2YoY21zVUludDE2TnVtYmVyKSk7CisgICAgICAgIGlmIChUICA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgICAgIFRlbXAgPSAoY21zVUludDhOdW1iZXIqKSBfY21zTWFsbG9jKHNlbGYgLT5Db250ZXh0SUQsIG5UYWJTaXplKTsKKyAgICAgICAgaWYgKFRlbXAgPT0gTlVMTCkgeworICAgICAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgVCk7CisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlvIC0+UmVhZChpbywgVGVtcCwgblRhYlNpemUsIDEpICE9IDEpIHsKKyAgICAgICAgICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFQpOworICAgICAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgVGVtcCk7CisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5UYWJTaXplOyBpKyspIHsKKworICAgICAgICAgICAgKlB0clcrKyA9IEZST01fOF9UT18xNihUZW1wW2ldKTsKKyAgICAgICAgfQorICAgICAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBUZW1wKTsKKyAgICAgICAgVGVtcCA9IE5VTEw7CisKKyAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKE5ld0xVVCwgY21zQVRfRU5ELCBjbXNTdGFnZUFsbG9jQ0x1dDE2Yml0KHNlbGYgLT5Db250ZXh0SUQsIENMVVRwb2ludHMsIElucHV0Q2hhbm5lbHMsIE91dHB1dENoYW5uZWxzLCBUKSkpCisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBUKTsKKyAgICB9CisKKworICAgIC8vIEdldCBvdXRwdXQgdGFibGVzCisgICAgaWYgKCFSZWFkOGJpdFRhYmxlcyhzZWxmIC0+Q29udGV4dElELCBpbywgIE5ld0xVVCwgT3V0cHV0Q2hhbm5lbHMpKSBnb3RvIEVycm9yOworCisgICAgKm5JdGVtcyA9IDE7CisgICAgcmV0dXJuIE5ld0xVVDsKKworRXJyb3I6CisgICAgaWYgKE5ld0xVVCAhPSBOVUxMKSBjbXNQaXBlbGluZUZyZWUoTmV3TFVUKTsKKyAgICByZXR1cm4gTlVMTDsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU2l6ZU9mVGFnKTsKK30KKworLy8gV2Ugb25seSBhbGxvdyBhIHNwZWNpZmljIE1QRSBzdHJ1Y3R1cmU6IE1hdHJpeCBwbHVzIHByZWxpbiwgcGx1cyBjbHV0LCBwbHVzIHBvc3QtbGluLgorc3RhdGljCitjbXNCb29sICBUeXBlX0xVVDhfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCit7CisgICAgY21zVUludDMyTnVtYmVyIGosIG5UYWJTaXplOworICAgIGNtc1VJbnQ4TnVtYmVyICB2YWw7CisgICAgY21zUGlwZWxpbmUqIE5ld0xVVCA9IChjbXNQaXBlbGluZSopIFB0cjsKKyAgICBjbXNTdGFnZSogbXBlOworICAgIF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKiBQcmVNUEUgPSBOVUxMLCAqUG9zdE1QRSA9IE5VTEw7CisgICAgX2Ntc1N0YWdlTWF0cml4RGF0YSogTWF0TVBFID0gTlVMTDsKKyAgICBfY21zU3RhZ2VDTHV0RGF0YSogY2x1dCA9IE5VTEw7CisgICAgaW50IGNsdXRQb2ludHM7CisKKyAgICAvLyBEaXNhc3NlbWJsZSB0aGUgTFVUIGludG8gY29tcG9uZW50cy4KKyAgICBtcGUgPSBOZXdMVVQgLT4gRWxlbWVudHM7CisgICAgaWYgKG1wZSAtPlR5cGUgPT0gY21zU2lnTWF0cml4RWxlbVR5cGUpIHsKKworICAgICAgICBNYXRNUEUgPSAoX2Ntc1N0YWdlTWF0cml4RGF0YSopIG1wZSAtPkRhdGE7CisgICAgICAgIG1wZSA9IG1wZSAtPiBOZXh0OworICAgIH0KKworICAgIGlmIChtcGUgIT0gTlVMTCAmJiBtcGUgLT5UeXBlID09IGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUpIHsKKyAgICAgICAgUHJlTVBFID0gKF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKikgbXBlIC0+RGF0YTsKKyAgICAgICAgbXBlID0gbXBlIC0+IE5leHQ7CisgICAgfQorCisgICAgaWYgKG1wZSAhPSBOVUxMICYmIG1wZSAtPlR5cGUgPT0gY21zU2lnQ0x1dEVsZW1UeXBlKSB7CisgICAgICAgIGNsdXQgID0gKF9jbXNTdGFnZUNMdXREYXRhKikgbXBlIC0+IERhdGE7CisgICAgICAgIG1wZSA9IG1wZSAtPk5leHQ7CisgICAgfQorCisgICAgaWYgKG1wZSAhPSBOVUxMICYmIG1wZSAtPlR5cGUgPT0gY21zU2lnQ3VydmVTZXRFbGVtVHlwZSkgeworICAgICAgICBQb3N0TVBFID0gKF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKikgbXBlIC0+RGF0YTsKKyAgICAgICAgbXBlID0gbXBlIC0+IE5leHQ7CisgICAgfQorCisgICAgLy8gVGhhdCBzaG91bGQgYmUgYWxsCisgICAgaWYgKG1wZSAhPSBOVUxMKSB7CisgICAgICAgIGNtc1NpZ25hbEVycm9yKG1wZS0+Q29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIkxVVCBpcyBub3Qgc3VpdGFibGUgdG8gYmUgc2F2ZWQgYXMgTFVUOCIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisKKyAgICBpZiAoY2x1dCA9PSBOVUxMKQorICAgICAgICBjbHV0UG9pbnRzID0gMDsKKyAgICBlbHNlCisgICAgICAgIGNsdXRQb2ludHMgICAgPSBjbHV0LT5QYXJhbXMtPm5TYW1wbGVzWzBdOworCisgICAgaWYgKCFfY21zV3JpdGVVSW50OE51bWJlcihpbywgKGNtc1VJbnQ4TnVtYmVyKSBOZXdMVVQgLT5JbnB1dENoYW5uZWxzKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghX2Ntc1dyaXRlVUludDhOdW1iZXIoaW8sIChjbXNVSW50OE51bWJlcikgTmV3TFVUIC0+T3V0cHV0Q2hhbm5lbHMpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFfY21zV3JpdGVVSW50OE51bWJlcihpbywgKGNtc1VJbnQ4TnVtYmVyKSBjbHV0UG9pbnRzKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghX2Ntc1dyaXRlVUludDhOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7IC8vIFBhZGRpbmcKKworCisgICAgaWYgKE1hdE1QRSAhPSBOVUxMKSB7CisKKyAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIE1hdE1QRSAtPiBEb3VibGVbMF0pKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBNYXRNUEUgLT4gRG91YmxlWzFdKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgTWF0TVBFIC0+IERvdWJsZVsyXSkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIE1hdE1QRSAtPiBEb3VibGVbM10pKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBNYXRNUEUgLT4gRG91YmxlWzRdKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgTWF0TVBFIC0+IERvdWJsZVs1XSkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIE1hdE1QRSAtPiBEb3VibGVbNl0pKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBNYXRNUEUgLT4gRG91YmxlWzddKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgTWF0TVBFIC0+IERvdWJsZVs4XSkpIHJldHVybiBGQUxTRTsKKworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgMSkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCAwKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIDEpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCAwKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCAxKSkgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIC8vIFRoZSBwcmVsaW5lYXJpemF0aW9uIHRhYmxlCisgICAgaWYgKCFXcml0ZThiaXRUYWJsZXMoc2VsZiAtPkNvbnRleHRJRCwgaW8sIE5ld0xVVCAtPklucHV0Q2hhbm5lbHMsIFByZU1QRSkpIHJldHVybiBGQUxTRTsKKworICAgIG5UYWJTaXplID0gdWlwb3coTmV3TFVULT5PdXRwdXRDaGFubmVscywgY2x1dFBvaW50cywgTmV3TFVUIC0+SW5wdXRDaGFubmVscyk7CisgICAgaWYgKG5UYWJTaXplID09IChjbXNVSW50MzJOdW1iZXIpIC0xKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKG5UYWJTaXplID4gMCkgeworCisgICAgICAgIC8vIFRoZSAzRCBDTFVULgorICAgICAgICBpZiAoY2x1dCAhPSBOVUxMKSB7CisKKyAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgblRhYlNpemU7IGorKykgeworCisgICAgICAgICAgICAgICAgdmFsID0gKGNtc1VJbnQ4TnVtYmVyKSBGUk9NXzE2X1RPXzgoY2x1dCAtPlRhYi5UW2pdKTsKKyAgICAgICAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQ4TnVtYmVyKGlvLCB2YWwpKSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGUgcG9zdGxpbmVhcml6YXRpb24gdGFibGUKKyAgICBpZiAoIVdyaXRlOGJpdFRhYmxlcyhzZWxmIC0+Q29udGV4dElELCBpbywgTmV3TFVUIC0+T3V0cHV0Q2hhbm5lbHMsIFBvc3RNUEUpKSByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gVFJVRTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobkl0ZW1zKTsKK30KKworCitzdGF0aWMKK3ZvaWQqIFR5cGVfTFVUOF9EdXAoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjb25zdCB2b2lkICpQdHIsIGNtc1VJbnQzMk51bWJlciBuKQoreworICAgIHJldHVybiAodm9pZCopIGNtc1BpcGVsaW5lRHVwKChjbXNQaXBlbGluZSopIFB0cik7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Cit9CisKK3N0YXRpYwordm9pZCBUeXBlX0xVVDhfRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQqIFB0cikKK3sKKyAgICBjbXNQaXBlbGluZUZyZWUoKGNtc1BpcGVsaW5lKikgUHRyKTsKKyAgICByZXR1cm47CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOworfQorCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gVHlwZSBjbXNTaWdMdXQxNlR5cGUKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8vIFJlYWQgMTYgYml0IHRhYmxlcyBhcyBnYW1tYSBmdW5jdGlvbnMKK3N0YXRpYworY21zQm9vbCAgUmVhZDE2Yml0VGFibGVzKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNQaXBlbGluZSogbHV0LCBpbnQgbkNoYW5uZWxzLCBpbnQgbkVudHJpZXMpCit7CisgICAgaW50IGk7CisgICAgY21zVG9uZUN1cnZlKiBUYWJsZXNbY21zTUFYQ0hBTk5FTFNdOworCisgICAgLy8gTWF5YmUgYW4gZW1wdHkgdGFibGU/ICh0aGlzIGlzIGEgbGNtcyBleHRlbnNpb24pCisgICAgaWYgKG5FbnRyaWVzIDw9IDApIHJldHVybiBUUlVFOworCisgICAgLy8gQ2hlY2sgZm9yIG1hbGljaW91cyBwcm9maWxlcworICAgIGlmIChuRW50cmllcyA8IDIpIHJldHVybiBGQUxTRTsKKyAgICBpZiAobkNoYW5uZWxzID4gY21zTUFYQ0hBTk5FTFMpIHJldHVybiBGQUxTRTsKKworICAgIC8vIEluaXQgdGFibGUgdG8gemVybworICAgIG1lbXNldChUYWJsZXMsIDAsIHNpemVvZihUYWJsZXMpKTsKKworICAgIGZvciAoaT0wOyBpIDwgbkNoYW5uZWxzOyBpKyspIHsKKworICAgICAgICBUYWJsZXNbaV0gPSBjbXNCdWlsZFRhYnVsYXRlZFRvbmVDdXJ2ZTE2KENvbnRleHRJRCwgbkVudHJpZXMsIE5VTEwpOworICAgICAgICBpZiAoVGFibGVzW2ldID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQxNkFycmF5KGlvLCBuRW50cmllcywgVGFibGVzW2ldLT5UYWJsZTE2KSkgZ290byBFcnJvcjsKKyAgICB9CisKKworICAgIC8vIEFkZCB0aGUgdGFibGUgKHdoaWNoIG1heSBjZXJ0YWlubHkgYmUgYW4gaWRlbnRpdHksIGJ1dCB0aGlzIGlzIHVwIHRvIHRoZSBvcHRpbWl6ZXIsIG5vdCB0aGUgcmVhZGluZyBjb2RlKQorICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShsdXQsIGNtc0FUX0VORCwgY21zU3RhZ2VBbGxvY1RvbmVDdXJ2ZXMoQ29udGV4dElELCBuQ2hhbm5lbHMsIFRhYmxlcykpKQorICAgICAgICBnb3RvIEVycm9yOworCisgICAgZm9yIChpPTA7IGkgPCBuQ2hhbm5lbHM7IGkrKykKKyAgICAgICAgY21zRnJlZVRvbmVDdXJ2ZShUYWJsZXNbaV0pOworCisgICAgcmV0dXJuIFRSVUU7CisKK0Vycm9yOgorICAgIGZvciAoaT0wOyBpIDwgbkNoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgaWYgKFRhYmxlc1tpXSkgY21zRnJlZVRvbmVDdXJ2ZShUYWJsZXNbaV0pOworICAgIH0KKworICAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljCitjbXNCb29sIFdyaXRlMTZiaXRUYWJsZXMoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc0lPSEFORExFUiogaW8sIF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKiBUYWJsZXMpCit7CisgICAgaW50IGo7CisgICAgY21zVUludDMyTnVtYmVyIGk7CisgICAgY21zVUludDE2TnVtYmVyIHZhbDsKKyAgICBpbnQgbkVudHJpZXM7CisKKyAgICBfY21zQXNzZXJ0KFRhYmxlcyAhPSBOVUxMKTsKKworICAgIG5FbnRyaWVzID0gVGFibGVzLT5UaGVDdXJ2ZXNbMF0tPm5FbnRyaWVzOworCisgICAgZm9yIChpPTA7IGkgPCBUYWJsZXMgLT5uQ3VydmVzOyBpKyspIHsKKworICAgICAgICBmb3IgKGo9MDsgaiA8IG5FbnRyaWVzOyBqKyspIHsKKworICAgICAgICAgICAgdmFsID0gVGFibGVzLT5UaGVDdXJ2ZXNbaV0tPlRhYmxlMTZbal07ICAgICAgICAKKyAgICAgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCB2YWwpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKENvbnRleHRJRCk7Cit9CisKK3N0YXRpYwordm9pZCAqVHlwZV9MVVQxNl9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyKiBuSXRlbXMsIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcpCit7CisgICAgY21zVUludDhOdW1iZXIgSW5wdXRDaGFubmVscywgT3V0cHV0Q2hhbm5lbHMsIENMVVRwb2ludHM7CisgICAgY21zUGlwZWxpbmUqIE5ld0xVVCA9IE5VTEw7CisgICAgY21zVUludDMyTnVtYmVyIG5UYWJTaXplOworICAgIGNtc0Zsb2F0NjROdW1iZXIgTWF0cml4WzMqM107CisgICAgY21zVUludDE2TnVtYmVyIElucHV0RW50cmllcywgT3V0cHV0RW50cmllczsKKworICAgICpuSXRlbXMgPSAwOworCisgICAgaWYgKCFfY21zUmVhZFVJbnQ4TnVtYmVyKGlvLCAmSW5wdXRDaGFubmVscykpIHJldHVybiBOVUxMOworICAgIGlmICghX2Ntc1JlYWRVSW50OE51bWJlcihpbywgJk91dHB1dENoYW5uZWxzKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFfY21zUmVhZFVJbnQ4TnVtYmVyKGlvLCAmQ0xVVHBvaW50cykpIHJldHVybiBOVUxMOyAgIC8vIDI1NSBtYXhpbXVtCisKKyAgICAvLyBQYWRkaW5nCisgICAgaWYgKCFfY21zUmVhZFVJbnQ4TnVtYmVyKGlvLCBOVUxMKSkgcmV0dXJuIE5VTEw7CisKKyAgICAvLyBEbyBzb21lIGNoZWNraW5nCisgICAgaWYgKElucHV0Q2hhbm5lbHMgPT0gMCB8fCBJbnB1dENoYW5uZWxzID4gY21zTUFYQ0hBTk5FTFMpICBnb3RvIEVycm9yOworICAgIGlmIChPdXRwdXRDaGFubmVscyA9PSAwIHx8IE91dHB1dENoYW5uZWxzID4gY21zTUFYQ0hBTk5FTFMpIGdvdG8gRXJyb3I7CisKKyAgICAvLyBBbGxvY2F0ZXMgYW4gZW1wdHkgTFVUCisgICAgTmV3TFVUID0gY21zUGlwZWxpbmVBbGxvYyhzZWxmIC0+Q29udGV4dElELCBJbnB1dENoYW5uZWxzLCBPdXRwdXRDaGFubmVscyk7CisgICAgaWYgKE5ld0xVVCA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgLy8gUmVhZCB0aGUgTWF0cml4CisgICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgICZNYXRyaXhbMF0pKSBnb3RvIEVycm9yOworICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICAmTWF0cml4WzFdKSkgZ290byBFcnJvcjsKKyAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAgJk1hdHJpeFsyXSkpIGdvdG8gRXJyb3I7CisgICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgICZNYXRyaXhbM10pKSBnb3RvIEVycm9yOworICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICAmTWF0cml4WzRdKSkgZ290byBFcnJvcjsKKyAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAgJk1hdHJpeFs1XSkpIGdvdG8gRXJyb3I7CisgICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgICZNYXRyaXhbNl0pKSBnb3RvIEVycm9yOworICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICAmTWF0cml4WzddKSkgZ290byBFcnJvcjsKKyAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAgJk1hdHJpeFs4XSkpIGdvdG8gRXJyb3I7CisKKworICAgIC8vIE9ubHkgb3BlcmF0ZXMgb24gMyBjaGFubmVscworICAgIGlmICgoSW5wdXRDaGFubmVscyA9PSAzKSAmJiAhX2Ntc01BVDNpc0lkZW50aXR5KChjbXNNQVQzKikgTWF0cml4KSkgeworCisgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShOZXdMVVQsIGNtc0FUX0VORCwgY21zU3RhZ2VBbGxvY01hdHJpeChzZWxmIC0+Q29udGV4dElELCAzLCAzLCBNYXRyaXgsIE5VTEwpKSkKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgJklucHV0RW50cmllcykpIGdvdG8gRXJyb3I7CisgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgJk91dHB1dEVudHJpZXMpKSBnb3RvIEVycm9yOworCisgICAgaWYgKElucHV0RW50cmllcyA+IDB4N0ZGRiB8fCBPdXRwdXRFbnRyaWVzID4gMHg3RkZGKSBnb3RvIEVycm9yOworICAgIGlmIChDTFVUcG9pbnRzID09IDEpIGdvdG8gRXJyb3I7IC8vIEltcG9zc2libGUgdmFsdWUsIDAgZm9yIG5vIENMVVQgYW5kIHRoZW4gMiBhdCBsZWFzdAorCisgICAgLy8gR2V0IGlucHV0IHRhYmxlcworICAgIGlmICghUmVhZDE2Yml0VGFibGVzKHNlbGYgLT5Db250ZXh0SUQsIGlvLCAgTmV3TFVULCBJbnB1dENoYW5uZWxzLCBJbnB1dEVudHJpZXMpKSBnb3RvIEVycm9yOworCisgICAgLy8gR2V0IDNEIENMVVQKKyAgICBuVGFiU2l6ZSA9IHVpcG93KE91dHB1dENoYW5uZWxzLCBDTFVUcG9pbnRzLCBJbnB1dENoYW5uZWxzKTsKKyAgICBpZiAoblRhYlNpemUgPT0gKGNtc1VJbnQzMk51bWJlcikgLTEpIGdvdG8gRXJyb3I7CisgICAgaWYgKG5UYWJTaXplID4gMCkgeworCisgICAgICAgIGNtc1VJbnQxNk51bWJlciAqVDsKKworICAgICAgICBUICA9IChjbXNVSW50MTZOdW1iZXIqKSBfY21zQ2FsbG9jKHNlbGYgLT5Db250ZXh0SUQsIG5UYWJTaXplLCBzaXplb2YoY21zVUludDE2TnVtYmVyKSk7CisgICAgICAgIGlmIChUICA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZBcnJheShpbywgblRhYlNpemUsIFQpKSB7CisgICAgICAgICAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBUKTsKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTmV3TFVULCBjbXNBVF9FTkQsIGNtc1N0YWdlQWxsb2NDTHV0MTZiaXQoc2VsZiAtPkNvbnRleHRJRCwgQ0xVVHBvaW50cywgSW5wdXRDaGFubmVscywgT3V0cHV0Q2hhbm5lbHMsIFQpKSkgeworICAgICAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgVCk7CisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICB9CisgICAgICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFQpOworICAgIH0KKworCisgICAgLy8gR2V0IG91dHB1dCB0YWJsZXMKKyAgICBpZiAoIVJlYWQxNmJpdFRhYmxlcyhzZWxmIC0+Q29udGV4dElELCBpbywgIE5ld0xVVCwgT3V0cHV0Q2hhbm5lbHMsIE91dHB1dEVudHJpZXMpKSBnb3RvIEVycm9yOworCisgICAgKm5JdGVtcyA9IDE7CisgICAgcmV0dXJuIE5ld0xVVDsKKworRXJyb3I6CisgICAgaWYgKE5ld0xVVCAhPSBOVUxMKSBjbXNQaXBlbGluZUZyZWUoTmV3TFVUKTsKKyAgICByZXR1cm4gTlVMTDsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU2l6ZU9mVGFnKTsKK30KKworLy8gV2Ugb25seSBhbGxvdyBzb21lIHNwZWNpZmljIE1QRSBzdHJ1Y3R1cmVzOiBNYXRyaXggcGx1cyBwcmVsaW4sIHBsdXMgY2x1dCwgcGx1cyBwb3N0LWxpbi4KKy8vIFNvbWUgZW1wdHkgZGVmYXVsdHMgYXJlIGNyZWF0ZWQgZm9yIG1pc3NpbmcgcGFydHMKKworc3RhdGljCitjbXNCb29sICBUeXBlX0xVVDE2X1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQoreworICAgIGNtc1VJbnQzMk51bWJlciBuVGFiU2l6ZTsKKyAgICBjbXNQaXBlbGluZSogTmV3TFVUID0gKGNtc1BpcGVsaW5lKikgUHRyOworICAgIGNtc1N0YWdlKiBtcGU7CisgICAgX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqIFByZU1QRSA9IE5VTEwsICpQb3N0TVBFID0gTlVMTDsKKyAgICBfY21zU3RhZ2VNYXRyaXhEYXRhKiBNYXRNUEUgPSBOVUxMOworICAgIF9jbXNTdGFnZUNMdXREYXRhKiBjbHV0ID0gTlVMTDsKKyAgICBpbnQgaSwgSW5wdXRDaGFubmVscywgT3V0cHV0Q2hhbm5lbHMsIGNsdXRQb2ludHM7CisKKyAgICAvLyBEaXNhc3NlbWJsZSB0aGUgTFVUIGludG8gY29tcG9uZW50cy4KKyAgICBtcGUgPSBOZXdMVVQgLT4gRWxlbWVudHM7CisgICAgaWYgKG1wZSAhPSBOVUxMICYmIG1wZSAtPlR5cGUgPT0gY21zU2lnTWF0cml4RWxlbVR5cGUpIHsKKworICAgICAgICBNYXRNUEUgPSAoX2Ntc1N0YWdlTWF0cml4RGF0YSopIG1wZSAtPkRhdGE7CisgICAgICAgIG1wZSA9IG1wZSAtPiBOZXh0OworICAgIH0KKworCisgICAgaWYgKG1wZSAhPSBOVUxMICYmIG1wZSAtPlR5cGUgPT0gY21zU2lnQ3VydmVTZXRFbGVtVHlwZSkgeworICAgICAgICBQcmVNUEUgPSAoX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqKSBtcGUgLT5EYXRhOworICAgICAgICBtcGUgPSBtcGUgLT4gTmV4dDsKKyAgICB9CisKKyAgICBpZiAobXBlICE9IE5VTEwgJiYgbXBlIC0+VHlwZSA9PSBjbXNTaWdDTHV0RWxlbVR5cGUpIHsKKyAgICAgICAgY2x1dCAgPSAoX2Ntc1N0YWdlQ0x1dERhdGEqKSBtcGUgLT4gRGF0YTsKKyAgICAgICAgbXBlID0gbXBlIC0+TmV4dDsKKyAgICB9CisKKyAgICBpZiAobXBlICE9IE5VTEwgJiYgbXBlIC0+VHlwZSA9PSBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlKSB7CisgICAgICAgIFBvc3RNUEUgPSAoX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqKSBtcGUgLT5EYXRhOworICAgICAgICBtcGUgPSBtcGUgLT4gTmV4dDsKKyAgICB9CisKKyAgICAvLyBUaGF0IHNob3VsZCBiZSBhbGwKKyAgICBpZiAobXBlICE9IE5VTEwpIHsKKyAgICAgICAgY21zU2lnbmFsRXJyb3IobXBlLT5Db250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiTFVUIGlzIG5vdCBzdWl0YWJsZSB0byBiZSBzYXZlZCBhcyBMVVQxNiIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgSW5wdXRDaGFubmVscyAgPSBjbXNQaXBlbGluZUlucHV0Q2hhbm5lbHMoTmV3TFVUKTsKKyAgICBPdXRwdXRDaGFubmVscyA9IGNtc1BpcGVsaW5lT3V0cHV0Q2hhbm5lbHMoTmV3TFVUKTsKKworICAgIGlmIChjbHV0ID09IE5VTEwpCisgICAgICAgIGNsdXRQb2ludHMgPSAwOworICAgIGVsc2UKKyAgICAgICAgY2x1dFBvaW50cyAgICA9IGNsdXQtPlBhcmFtcy0+blNhbXBsZXNbMF07CisKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQ4TnVtYmVyKGlvLCAoY21zVUludDhOdW1iZXIpIElucHV0Q2hhbm5lbHMpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFfY21zV3JpdGVVSW50OE51bWJlcihpbywgKGNtc1VJbnQ4TnVtYmVyKSBPdXRwdXRDaGFubmVscykpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQ4TnVtYmVyKGlvLCAoY21zVUludDhOdW1iZXIpIGNsdXRQb2ludHMpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFfY21zV3JpdGVVSW50OE51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsgLy8gUGFkZGluZworCisKKyAgICBpZiAoTWF0TVBFICE9IE5VTEwpIHsKKworICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgTWF0TVBFIC0+IERvdWJsZVswXSkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIE1hdE1QRSAtPiBEb3VibGVbMV0pKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBNYXRNUEUgLT4gRG91YmxlWzJdKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgTWF0TVBFIC0+IERvdWJsZVszXSkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIE1hdE1QRSAtPiBEb3VibGVbNF0pKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBNYXRNUEUgLT4gRG91YmxlWzVdKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgTWF0TVBFIC0+IERvdWJsZVs2XSkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIE1hdE1QRSAtPiBEb3VibGVbN10pKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBNYXRNUEUgLT4gRG91YmxlWzhdKSkgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgMSkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCAwKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIDEpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCAwKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCAxKSkgcmV0dXJuIEZBTFNFOworICAgIH0KKworCisgICAgaWYgKFByZU1QRSAhPSBOVUxMKSB7CisgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCAoY21zVUludDE2TnVtYmVyKSBQcmVNUEUgLT5UaGVDdXJ2ZXNbMF0tPm5FbnRyaWVzKSkgcmV0dXJuIEZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgMikpIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoUG9zdE1QRSAhPSBOVUxMKSB7CisgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCAoY21zVUludDE2TnVtYmVyKSBQb3N0TVBFIC0+VGhlQ3VydmVzWzBdLT5uRW50cmllcykpIHJldHVybiBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgMikpIHJldHVybiBGQUxTRTsKKworICAgIH0KKworICAgIC8vIFRoZSBwcmVsaW5lYXJpemF0aW9uIHRhYmxlCisKKyAgICBpZiAoUHJlTVBFICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCFXcml0ZTE2Yml0VGFibGVzKHNlbGYgLT5Db250ZXh0SUQsIGlvLCBQcmVNUEUpKSByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmb3IgKGk9MDsgaSA8IElucHV0Q2hhbm5lbHM7IGkrKykgeworCisgICAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCAweGZmZmYpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuVGFiU2l6ZSA9IHVpcG93KE91dHB1dENoYW5uZWxzLCBjbHV0UG9pbnRzLCBJbnB1dENoYW5uZWxzKTsKKyAgICBpZiAoblRhYlNpemUgPT0gKGNtc1VJbnQzMk51bWJlcikgLTEpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoblRhYlNpemUgPiAwKSB7CisgICAgICAgIC8vIFRoZSAzRCBDTFVULgorICAgICAgICBpZiAoY2x1dCAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNkFycmF5KGlvLCBuVGFiU2l6ZSwgY2x1dC0+VGFiLlQpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGUgcG9zdGxpbmVhcml6YXRpb24gdGFibGUKKyAgICBpZiAoUG9zdE1QRSAhPSBOVUxMKSB7CisgICAgICAgIGlmICghV3JpdGUxNmJpdFRhYmxlcyhzZWxmIC0+Q29udGV4dElELCBpbywgUG9zdE1QRSkpIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoaT0wOyBpIDwgT3V0cHV0Q2hhbm5lbHM7IGkrKykgeworCisgICAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCAweGZmZmYpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobkl0ZW1zKTsKK30KKworc3RhdGljCit2b2lkKiBUeXBlX0xVVDE2X0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQgKlB0ciwgY21zVUludDMyTnVtYmVyIG4pCit7CisgICAgcmV0dXJuICh2b2lkKikgY21zUGlwZWxpbmVEdXAoKGNtc1BpcGVsaW5lKikgUHRyKTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobik7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKK30KKworc3RhdGljCit2b2lkIFR5cGVfTFVUMTZfRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQqIFB0cikKK3sKKyAgICBjbXNQaXBlbGluZUZyZWUoKGNtc1BpcGVsaW5lKikgUHRyKTsKKyAgICByZXR1cm47CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOworfQorCisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBUeXBlIGNtc1NpZ0x1dEFUb0JUeXBlCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisKKy8vIFY0IHN0dWZmLiBSZWFkIG1hdHJpeCBmb3IgTHV0QXRvQiBhbmQgTHV0QnRvQQorCitzdGF0aWMKK2Ntc1N0YWdlKiBSZWFkTWF0cml4KHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyIE9mZnNldCkKK3sKKyAgICBjbXNGbG9hdDY0TnVtYmVyIGRNYXRbMyozXTsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIGRPZmZbM107CisgICAgY21zU3RhZ2UqIE1hdDsKKworICAgIC8vIEdvIHRvIGFkZHJlc3MKKyAgICBpZiAoIWlvIC0+IFNlZWsoaW8sIE9mZnNldCkpIHJldHVybiBOVUxMOworCisgICAgLy8gUmVhZCB0aGUgTWF0cml4CisgICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgJmRNYXRbMF0pKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAmZE1hdFsxXSkpIHJldHVybiBOVUxMOworICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICZkTWF0WzJdKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgJmRNYXRbM10pKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAmZE1hdFs0XSkpIHJldHVybiBOVUxMOworICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICZkTWF0WzVdKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgJmRNYXRbNl0pKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAmZE1hdFs3XSkpIHJldHVybiBOVUxMOworICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICZkTWF0WzhdKSkgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAmZE9mZlswXSkpIHJldHVybiBOVUxMOworICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICZkT2ZmWzFdKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgJmRPZmZbMl0pKSByZXR1cm4gTlVMTDsKKworICAgIE1hdCA9IGNtc1N0YWdlQWxsb2NNYXRyaXgoc2VsZiAtPkNvbnRleHRJRCwgMywgMywgZE1hdCwgZE9mZik7CisKKyAgICAgcmV0dXJuIE1hdDsKK30KKworCisKKworLy8gIFY0IHN0dWZmLiBSZWFkIENMVVQgcGFydCBmb3IgTHV0QXRvQiBhbmQgTHV0QnRvQQorCitzdGF0aWMKK2Ntc1N0YWdlKiBSZWFkQ0xVVChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciBPZmZzZXQsIGludCBJbnB1dENoYW5uZWxzLCBpbnQgT3V0cHV0Q2hhbm5lbHMpCit7CisgICAgY21zVUludDhOdW1iZXIgIGdyaWRQb2ludHM4W2Ntc01BWENIQU5ORUxTXTsgLy8gTnVtYmVyIG9mIGdyaWQgcG9pbnRzIGluIGVhY2ggZGltZW5zaW9uLgorICAgIGNtc1VJbnQzMk51bWJlciBHcmlkUG9pbnRzW2Ntc01BWENIQU5ORUxTXSwgaTsKKyAgICBjbXNVSW50OE51bWJlciAgUHJlY2lzaW9uOworICAgIGNtc1N0YWdlKiBDTFVUOworICAgIF9jbXNTdGFnZUNMdXREYXRhKiBEYXRhOworCisgICAgaWYgKCFpbyAtPiBTZWVrKGlvLCBPZmZzZXQpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoaW8gLT4gUmVhZChpbywgZ3JpZFBvaW50czgsIGNtc01BWENIQU5ORUxTLCAxKSAhPSAxKSByZXR1cm4gTlVMTDsKKworCisgICAgZm9yIChpPTA7IGkgPCBjbXNNQVhDSEFOTkVMUzsgaSsrKSB7CisKKyAgICAgICAgaWYgKGdyaWRQb2ludHM4W2ldID09IDEpIHJldHVybiBOVUxMOyAvLyBJbXBvc3NpYmxlIHZhbHVlLCAwIGZvciBubyBDTFVUIGFuZCB0aGVuIDIgYXQgbGVhc3QKKyAgICAgICAgR3JpZFBvaW50c1tpXSA9IGdyaWRQb2ludHM4W2ldOworICAgIH0KKworICAgIGlmICghX2Ntc1JlYWRVSW50OE51bWJlcihpbywgJlByZWNpc2lvbikpIHJldHVybiBOVUxMOworCisgICAgaWYgKCFfY21zUmVhZFVJbnQ4TnVtYmVyKGlvLCBOVUxMKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFfY21zUmVhZFVJbnQ4TnVtYmVyKGlvLCBOVUxMKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFfY21zUmVhZFVJbnQ4TnVtYmVyKGlvLCBOVUxMKSkgcmV0dXJuIE5VTEw7CisKKyAgICBDTFVUID0gY21zU3RhZ2VBbGxvY0NMdXQxNmJpdEdyYW51bGFyKHNlbGYgLT5Db250ZXh0SUQsIEdyaWRQb2ludHMsIElucHV0Q2hhbm5lbHMsIE91dHB1dENoYW5uZWxzLCBOVUxMKTsKKyAgICBpZiAoQ0xVVCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIERhdGEgPSAoX2Ntc1N0YWdlQ0x1dERhdGEqKSBDTFVUIC0+RGF0YTsKKworICAgIC8vIFByZWNpc2lvbiBjYW4gYmUgMSBvciAyIGJ5dGVzCisgICAgaWYgKFByZWNpc2lvbiA9PSAxKSB7CisKKyAgICAgICAgY21zVUludDhOdW1iZXIgIHY7CisKKyAgICAgICAgZm9yIChpPTA7IGkgPCBEYXRhIC0+bkVudHJpZXM7IGkrKykgeworCisgICAgICAgICAgICBpZiAoaW8gLT5SZWFkKGlvLCAmdiwgc2l6ZW9mKGNtc1VJbnQ4TnVtYmVyKSwgMSkgIT0gMSkgeworICAgICAgICAgICAgICBjbXNTdGFnZUZyZWUoQ0xVVCk7CisgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRGF0YSAtPlRhYi5UW2ldID0gRlJPTV84X1RPXzE2KHYpOworICAgICAgICB9CisKKyAgICB9CisgICAgZWxzZQorICAgICAgICBpZiAoUHJlY2lzaW9uID09IDIpIHsKKworICAgICAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQxNkFycmF5KGlvLCBEYXRhLT5uRW50cmllcywgRGF0YSAtPlRhYi5UKSkgeworICAgICAgICAgICAgICAgIGNtc1N0YWdlRnJlZShDTFVUKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNtc1N0YWdlRnJlZShDTFVUKTsKKyAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKHNlbGYgLT5Db250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5rbm93biBwcmVjaXNpb24gb2YgJyVkJyIsIFByZWNpc2lvbik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDTFVUOworfQorCitzdGF0aWMKK2Ntc1RvbmVDdXJ2ZSogUmVhZEVtYmVkZGVkQ3VydmUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvKQoreworICAgIGNtc1RhZ1R5cGVTaWduYXR1cmUgIEJhc2VUeXBlOworICAgIGNtc1VJbnQzMk51bWJlciBuSXRlbXM7CisKKyAgICBCYXNlVHlwZSA9IF9jbXNSZWFkVHlwZUJhc2UoaW8pOworICAgIHN3aXRjaCAoQmFzZVR5cGUpIHsKKworICAgICAgICAgICAgY2FzZSBjbXNTaWdDdXJ2ZVR5cGU6CisgICAgICAgICAgICAgICAgcmV0dXJuIChjbXNUb25lQ3VydmUqKSBUeXBlX0N1cnZlX1JlYWQoc2VsZiwgaW8sICZuSXRlbXMsIDApOworCisgICAgICAgICAgICBjYXNlIGNtc1NpZ1BhcmFtZXRyaWNDdXJ2ZVR5cGU6CisgICAgICAgICAgICAgICAgcmV0dXJuIChjbXNUb25lQ3VydmUqKSBUeXBlX1BhcmFtZXRyaWNDdXJ2ZV9SZWFkKHNlbGYsIGlvLCAmbkl0ZW1zLCAwKTsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgU3RyaW5nWzVdOworCisgICAgICAgICAgICAgICAgICAgIF9jbXNUYWdTaWduYXR1cmUyU3RyaW5nKFN0cmluZywgKGNtc1RhZ1NpZ25hdHVyZSkgQmFzZVR5cGUpOworICAgICAgICAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihzZWxmIC0+Q29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVua25vd24gY3VydmUgdHlwZSAnJXMnIiwgU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCisKKy8vIFJlYWQgYSBzZXQgb2YgY3VydmVzIGZyb20gc3BlY2lmaWMgb2Zmc2V0CitzdGF0aWMKK2Ntc1N0YWdlKiBSZWFkU2V0T2ZDdXJ2ZXMoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIgT2Zmc2V0LCBjbXNVSW50MzJOdW1iZXIgbkN1cnZlcykKK3sKKyAgICBjbXNUb25lQ3VydmUqIEN1cnZlc1tjbXNNQVhDSEFOTkVMU107CisgICAgY21zVUludDMyTnVtYmVyIGk7CisgICAgY21zU3RhZ2UqIExpbiA9IE5VTEw7CisKKyAgICBpZiAobkN1cnZlcyA+IGNtc01BWENIQU5ORUxTKSByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoIWlvIC0+IFNlZWsoaW8sIE9mZnNldCkpIHJldHVybiBGQUxTRTsKKworICAgIGZvciAoaT0wOyBpIDwgbkN1cnZlczsgaSsrKQorICAgICAgICBDdXJ2ZXNbaV0gPSBOVUxMOworCisgICAgZm9yIChpPTA7IGkgPCBuQ3VydmVzOyBpKyspIHsKKworICAgICAgICBDdXJ2ZXNbaV0gPSBSZWFkRW1iZWRkZWRDdXJ2ZShzZWxmLCBpbyk7CisgICAgICAgIGlmIChDdXJ2ZXNbaV0gPT0gTlVMTCkgZ290byBFcnJvcjsKKyAgICAgICAgaWYgKCFfY21zUmVhZEFsaWdubWVudChpbykpIGdvdG8gRXJyb3I7CisKKyAgICB9CisKKyAgICBMaW4gPSBjbXNTdGFnZUFsbG9jVG9uZUN1cnZlcyhzZWxmIC0+Q29udGV4dElELCBuQ3VydmVzLCBDdXJ2ZXMpOworCitFcnJvcjoKKyAgICBmb3IgKGk9MDsgaSA8IG5DdXJ2ZXM7IGkrKykKKyAgICAgICAgY21zRnJlZVRvbmVDdXJ2ZShDdXJ2ZXNbaV0pOworCisgICAgcmV0dXJuIExpbjsKK30KKworCisvLyBMdXRBdG9CIHR5cGUKKworLy8gVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50cyBhIGNvbG91ciB0cmFuc2Zvcm0uIFRoZSB0eXBlIGNvbnRhaW5zIHVwIHRvIGZpdmUgcHJvY2Vzc2luZworLy8gZWxlbWVudHMgd2hpY2ggYXJlIHN0b3JlZCBpbiB0aGUgQXRvQlRhZyB0YWcgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogYSBzZXQgb2Ygb25lCisvLyBkaW1lbnNpb25hbCBjdXJ2ZXMsIGEgMyBieSAzIG1hdHJpeCB3aXRoIG9mZnNldCB0ZXJtcywgYSBzZXQgb2Ygb25lIGRpbWVuc2lvbmFsIGN1cnZlcywKKy8vIGEgbXVsdGlkaW1lbnNpb25hbCBsb29rdXAgdGFibGUsIGFuZCBhIHNldCBvZiBvbmUgZGltZW5zaW9uYWwgb3V0cHV0IGN1cnZlcy4KKy8vIERhdGEgYXJlIHByb2Nlc3NlZCB1c2luZyB0aGVzZSBlbGVtZW50cyB2aWEgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZToKKy8vCisvLygiQSIgY3VydmVzKSAtPiAobXVsdGlkaW1lbnNpb25hbCBsb29rdXAgdGFibGUgLSBDTFVUKSAtPiAoIk0iIGN1cnZlcykgLT4gKG1hdHJpeCkgLT4gKCJCIiBjdXJ2ZXMpLgorLy8KKy8qCitJdCBpcyBwb3NzaWJsZSB0byB1c2UgYW55IG9yIGFsbCBvZiB0aGVzZSBwcm9jZXNzaW5nIGVsZW1lbnRzLiBBdCBsZWFzdCBvbmUgcHJvY2Vzc2luZyBlbGVtZW50CittdXN0IGJlIGluY2x1ZGVkLk9ubHkgdGhlIGZvbGxvd2luZyBjb21iaW5hdGlvbnMgYXJlIGFsbG93ZWQ6CisKK0IKK00gLSBNYXRyaXggLSBCCitBIC0gQ0xVVCAtIEIKK0EgLSBDTFVUIC0gTSAtIE1hdHJpeCAtIEIKKworKi8KKworc3RhdGljCit2b2lkKiBUeXBlX0xVVEEyQl9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyKiBuSXRlbXMsIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcpCit7CisgICAgY21zVUludDMyTnVtYmVyICAgICAgQmFzZU9mZnNldDsKKyAgICBjbXNVSW50OE51bWJlciAgICAgICBpbnB1dENoYW47ICAgICAgLy8gTnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzCisgICAgY21zVUludDhOdW1iZXIgICAgICAgb3V0cHV0Q2hhbjsgICAgIC8vIE51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMKKyAgICBjbXNVSW50MzJOdW1iZXIgICAgICBvZmZzZXRCOyAgICAgICAgLy8gT2Zmc2V0IHRvIGZpcnN0ICJCIiBjdXJ2ZQorICAgIGNtc1VJbnQzMk51bWJlciAgICAgIG9mZnNldE1hdDsgICAgICAvLyBPZmZzZXQgdG8gbWF0cml4CisgICAgY21zVUludDMyTnVtYmVyICAgICAgb2Zmc2V0TTsgICAgICAgIC8vIE9mZnNldCB0byBmaXJzdCAiTSIgY3VydmUKKyAgICBjbXNVSW50MzJOdW1iZXIgICAgICBvZmZzZXRDOyAgICAgICAgLy8gT2Zmc2V0IHRvIENMVVQKKyAgICBjbXNVSW50MzJOdW1iZXIgICAgICBvZmZzZXRBOyAgICAgICAgLy8gT2Zmc2V0IHRvIGZpcnN0ICJBIiBjdXJ2ZQorICAgIGNtc1BpcGVsaW5lKiBOZXdMVVQgPSBOVUxMOworCisKKyAgICBCYXNlT2Zmc2V0ID0gaW8gLT5UZWxsKGlvKSAtIHNpemVvZihfY21zVGFnQmFzZSk7CisKKyAgICBpZiAoIV9jbXNSZWFkVUludDhOdW1iZXIoaW8sICZpbnB1dENoYW4pKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIV9jbXNSZWFkVUludDhOdW1iZXIoaW8sICZvdXRwdXRDaGFuKSkgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoIV9jbXNSZWFkVUludDE2TnVtYmVyKGlvLCBOVUxMKSkgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmb2Zmc2V0QikpIHJldHVybiBOVUxMOworICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZvZmZzZXRNYXQpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmb2Zmc2V0TSkpIHJldHVybiBOVUxMOworICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZvZmZzZXRDKSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJm9mZnNldEEpKSByZXR1cm4gTlVMTDsKKworICAgIGlmIChpbnB1dENoYW4gPT0gMCB8fCBpbnB1dENoYW4gPj0gY21zTUFYQ0hBTk5FTFMpIHJldHVybiBOVUxMOworICAgIGlmIChvdXRwdXRDaGFuID09IDAgfHwgb3V0cHV0Q2hhbiA+PSBjbXNNQVhDSEFOTkVMUykgcmV0dXJuIE5VTEw7CisKKyAgICAvLyBBbGxvY2F0ZXMgYW4gZW1wdHkgTFVUCisgICAgTmV3TFVUID0gY21zUGlwZWxpbmVBbGxvYyhzZWxmIC0+Q29udGV4dElELCBpbnB1dENoYW4sIG91dHB1dENoYW4pOworICAgIGlmIChOZXdMVVQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAob2Zmc2V0QSE9IDApIHsKKyAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKE5ld0xVVCwgY21zQVRfRU5ELCBSZWFkU2V0T2ZDdXJ2ZXMoc2VsZiwgaW8sIEJhc2VPZmZzZXQgKyBvZmZzZXRBLCBpbnB1dENoYW4pKSkKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgaWYgKG9mZnNldEMgIT0gMCkgeworICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTmV3TFVULCBjbXNBVF9FTkQsIFJlYWRDTFVUKHNlbGYsIGlvLCBCYXNlT2Zmc2V0ICsgb2Zmc2V0QywgaW5wdXRDaGFuLCBvdXRwdXRDaGFuKSkpCisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgIH0KKworICAgIGlmIChvZmZzZXRNICE9IDApIHsKKyAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKE5ld0xVVCwgY21zQVRfRU5ELCBSZWFkU2V0T2ZDdXJ2ZXMoc2VsZiwgaW8sIEJhc2VPZmZzZXQgKyBvZmZzZXRNLCBvdXRwdXRDaGFuKSkpCisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgIH0KKworICAgIGlmIChvZmZzZXRNYXQgIT0gMCkgeworICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTmV3TFVULCBjbXNBVF9FTkQsIFJlYWRNYXRyaXgoc2VsZiwgaW8sIEJhc2VPZmZzZXQgKyBvZmZzZXRNYXQpKSkKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgaWYgKG9mZnNldEIgIT0gMCkgeworICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTmV3TFVULCBjbXNBVF9FTkQsIFJlYWRTZXRPZkN1cnZlcyhzZWxmLCBpbywgQmFzZU9mZnNldCArIG9mZnNldEIsIG91dHB1dENoYW4pKSkKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgKm5JdGVtcyA9IDE7CisgICAgcmV0dXJuIE5ld0xVVDsKK0Vycm9yOgorICAgIGNtc1BpcGVsaW5lRnJlZShOZXdMVVQpOworICAgIHJldHVybiBOVUxMOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTaXplT2ZUYWcpOworfQorCisvLyBXcml0ZSBhIHNldCBvZiBjdXJ2ZXMKK3N0YXRpYworY21zQm9vbCAgV3JpdGVNYXRyaXgoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNTdGFnZSogbXBlKQoreworICAgIF9jbXNTdGFnZU1hdHJpeERhdGEqIG0gPSAoX2Ntc1N0YWdlTWF0cml4RGF0YSopIG1wZSAtPiBEYXRhOworCisgICAgLy8gV3JpdGUgdGhlIE1hdHJpeAorICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBtIC0+IERvdWJsZVswXSkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgbSAtPiBEb3VibGVbMV0pKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIG0gLT4gRG91YmxlWzJdKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBtIC0+IERvdWJsZVszXSkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgbSAtPiBEb3VibGVbNF0pKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIG0gLT4gRG91YmxlWzVdKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBtIC0+IERvdWJsZVs2XSkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgbSAtPiBEb3VibGVbN10pKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIG0gLT4gRG91YmxlWzhdKSkgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKG0gLT5PZmZzZXQgIT0gTlVMTCkgeworCisgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIG0gLT4gT2Zmc2V0WzBdKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBtIC0+IE9mZnNldFsxXSkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgbSAtPiBPZmZzZXRbMl0pKSByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCAwKSkgcmV0dXJuIEZBTFNFOworCisgICAgfQorCisKKyAgICByZXR1cm4gVFJVRTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Cit9CisKKworLy8gV3JpdGUgYSBzZXQgb2YgY3VydmVzCitzdGF0aWMKK2Ntc0Jvb2wgV3JpdGVTZXRPZkN1cnZlcyhzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1RhZ1R5cGVTaWduYXR1cmUgVHlwZSwgY21zU3RhZ2UqIG1wZSkKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgaSwgbjsKKyAgICBjbXNUYWdUeXBlU2lnbmF0dXJlIEN1cnJlbnRUeXBlOworICAgIGNtc1RvbmVDdXJ2ZSoqIEN1cnZlczsKKworCisgICAgbiAgICAgID0gY21zU3RhZ2VPdXRwdXRDaGFubmVscyhtcGUpOworICAgIEN1cnZlcyA9IF9jbXNTdGFnZUdldFB0clRvQ3VydmVTZXQobXBlKTsKKworICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7CisKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHRhYmxlLWJhc2VkIGN1cnZlLCB1c2UgY3VydmUgdHlwZSBldmVuIG9uIFY0CisgICAgICAgIEN1cnJlbnRUeXBlID0gVHlwZTsKKworICAgICAgICBpZiAoKEN1cnZlc1tpXSAtPm5TZWdtZW50cyA9PSAwKXx8CisgICAgICAgICAgICAoKEN1cnZlc1tpXS0+blNlZ21lbnRzID09IDIpICYmIChDdXJ2ZXNbaV0gLT5TZWdtZW50c1sxXS5UeXBlID09IDApKSApCisgICAgICAgICAgICBDdXJyZW50VHlwZSA9IGNtc1NpZ0N1cnZlVHlwZTsKKyAgICAgICAgZWxzZQorICAgICAgICBpZiAoQ3VydmVzW2ldIC0+U2VnbWVudHNbMF0uVHlwZSA8IDApCisgICAgICAgICAgICBDdXJyZW50VHlwZSA9IGNtc1NpZ0N1cnZlVHlwZTsKKworICAgICAgICBpZiAoIV9jbXNXcml0ZVR5cGVCYXNlKGlvLCBDdXJyZW50VHlwZSkpIHJldHVybiBGQUxTRTsKKworICAgICAgICBzd2l0Y2ggKEN1cnJlbnRUeXBlKSB7CisKKyAgICAgICAgICAgIGNhc2UgY21zU2lnQ3VydmVUeXBlOgorICAgICAgICAgICAgICAgIGlmICghVHlwZV9DdXJ2ZV9Xcml0ZShzZWxmLCBpbywgQ3VydmVzW2ldLCAxKSkgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNtc1NpZ1BhcmFtZXRyaWNDdXJ2ZVR5cGU6CisgICAgICAgICAgICAgICAgaWYgKCFUeXBlX1BhcmFtZXRyaWNDdXJ2ZV9Xcml0ZShzZWxmLCBpbywgQ3VydmVzW2ldLCAxKSkgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBTdHJpbmdbNV07CisKKyAgICAgICAgICAgICAgICAgICAgX2Ntc1RhZ1NpZ25hdHVyZTJTdHJpbmcoU3RyaW5nLCAoY21zVGFnU2lnbmF0dXJlKSBUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3Ioc2VsZiAtPkNvbnRleHRJRCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJVbmtub3duIGN1cnZlIHR5cGUgJyVzJyIsIFN0cmluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghX2Ntc1dyaXRlQWxpZ25tZW50KGlvKSkgcmV0dXJuIEZBTFNFOworICAgIH0KKworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljCitjbXNCb29sIFdyaXRlQ0xVVChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQ4TnVtYmVyICBQcmVjaXNpb24sIGNtc1N0YWdlKiBtcGUpCit7CisgICAgY21zVUludDhOdW1iZXIgIGdyaWRQb2ludHNbY21zTUFYQ0hBTk5FTFNdOyAvLyBOdW1iZXIgb2YgZ3JpZCBwb2ludHMgaW4gZWFjaCBkaW1lbnNpb24uCisgICAgY21zVUludDMyTnVtYmVyIGk7CisgICAgX2Ntc1N0YWdlQ0x1dERhdGEqIENMVVQgPSAoIF9jbXNTdGFnZUNMdXREYXRhKikgbXBlIC0+IERhdGE7CisKKyAgICBpZiAoQ0xVVCAtPkhhc0Zsb2F0VmFsdWVzKSB7CisgICAgICAgICBjbXNTaWduYWxFcnJvcihzZWxmIC0+Q29udGV4dElELCBjbXNFUlJPUl9OT1RfU1VJVEFCTEUsICJDYW5ub3Qgc2F2ZSBmbG9hdGluZyBwb2ludCBkYXRhLCBDTFVUIGFyZSA4IG9yIDE2IGJpdCBvbmx5Iik7CisgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgbWVtc2V0KGdyaWRQb2ludHMsIDAsIHNpemVvZihncmlkUG9pbnRzKSk7CisgICAgZm9yIChpPTA7IGkgPCAoY21zVUludDMyTnVtYmVyKSBDTFVUIC0+UGFyYW1zIC0+bklucHV0czsgaSsrKQorICAgICAgICBncmlkUG9pbnRzW2ldID0gKGNtc1VJbnQ4TnVtYmVyKSBDTFVUIC0+UGFyYW1zIC0+blNhbXBsZXNbaV07CisKKyAgICBpZiAoIWlvIC0+IFdyaXRlKGlvLCBjbXNNQVhDSEFOTkVMUypzaXplb2YoY21zVUludDhOdW1iZXIpLCBncmlkUG9pbnRzKSkgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKCFfY21zV3JpdGVVSW50OE51bWJlcihpbywgKGNtc1VJbnQ4TnVtYmVyKSBQcmVjaXNpb24pKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFfY21zV3JpdGVVSW50OE51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQ4TnVtYmVyKGlvLCAwKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghX2Ntc1dyaXRlVUludDhOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7CisKKyAgICAvLyBQcmVjaXNpb24gY2FuIGJlIDEgb3IgMiBieXRlcworICAgIGlmIChQcmVjaXNpb24gPT0gMSkgeworCisgICAgICAgIGZvciAoaT0wOyBpIDwgQ0xVVC0+bkVudHJpZXM7IGkrKykgeworCisgICAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQ4TnVtYmVyKGlvLCBGUk9NXzE2X1RPXzgoQ0xVVC0+VGFiLlRbaV0pKSkgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgaWYgKFByZWNpc2lvbiA9PSAyKSB7CisKKyAgICAgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDE2QXJyYXkoaW8sIENMVVQtPm5FbnRyaWVzLCBDTFVUIC0+VGFiLlQpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3Ioc2VsZiAtPkNvbnRleHRJRCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJVbmtub3duIHByZWNpc2lvbiBvZiAnJWQnIiwgUHJlY2lzaW9uKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghX2Ntc1dyaXRlQWxpZ25tZW50KGlvKSkgcmV0dXJuIEZBTFNFOworCisgICAgICAgIHJldHVybiBUUlVFOworfQorCisKKworCitzdGF0aWMKK2Ntc0Jvb2wgVHlwZV9MVVRBMkJfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCit7CisgICAgY21zUGlwZWxpbmUqIEx1dCA9IChjbXNQaXBlbGluZSopIFB0cjsKKyAgICBpbnQgaW5wdXRDaGFuLCBvdXRwdXRDaGFuOworICAgIGNtc1N0YWdlICpBID0gTlVMTCwgKkIgPSBOVUxMLCAqTSA9IE5VTEw7CisgICAgY21zU3RhZ2UgKiBNYXRyaXggPSBOVUxMOworICAgIGNtc1N0YWdlICogQ0xVVCA9IE5VTEw7CisgICAgY21zVUludDMyTnVtYmVyIG9mZnNldEIgPSAwLCBvZmZzZXRNYXQgPSAwLCBvZmZzZXRNID0gMCwgb2Zmc2V0QyA9IDAsIG9mZnNldEEgPSAwOworICAgIGNtc1VJbnQzMk51bWJlciBCYXNlT2Zmc2V0LCBEaXJlY3RvcnlQb3MsIEN1cnJlbnRQb3M7CisKKyAgICAvLyBHZXQgdGhlIGJhc2UgZm9yIGFsbCBvZmZzZXRzCisgICAgQmFzZU9mZnNldCA9IGlvIC0+VGVsbChpbykgLSBzaXplb2YoX2Ntc1RhZ0Jhc2UpOworCisgICAgaWYgKEx1dCAtPkVsZW1lbnRzICE9IE5VTEwpCisgICAgICAgIGlmICghY21zUGlwZWxpbmVDaGVja0FuZFJldHJlaXZlU3RhZ2VzKEx1dCwgMSwgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgJkIpKQorICAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUNoZWNrQW5kUmV0cmVpdmVTdGFnZXMoTHV0LCAzLCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLCBjbXNTaWdNYXRyaXhFbGVtVHlwZSwgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgJk0sICZNYXRyaXgsICZCKSkKKyAgICAgICAgICAgICAgICBpZiAoIWNtc1BpcGVsaW5lQ2hlY2tBbmRSZXRyZWl2ZVN0YWdlcyhMdXQsIDMsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsIGNtc1NpZ0NMdXRFbGVtVHlwZSwgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgJkEsICZDTFVULCAmQikpCisgICAgICAgICAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVDaGVja0FuZFJldHJlaXZlU3RhZ2VzKEx1dCwgNSwgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgY21zU2lnQ0x1dEVsZW1UeXBlLCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY21zU2lnTWF0cml4RWxlbVR5cGUsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsICZBLCAmQ0xVVCwgJk0sICZNYXRyaXgsICZCKSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3Ioc2VsZi0+Q29udGV4dElELCBjbXNFUlJPUl9OT1RfU1VJVEFCTEUsICJMVVQgaXMgbm90IHN1aXRhYmxlIHRvIGJlIHNhdmVkIGFzIEx1dEFUb0IiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgIC8vIEdldCBpbnB1dCwgb3V0cHV0IGNoYW5uZWxzCisgICAgaW5wdXRDaGFuICA9IGNtc1BpcGVsaW5lSW5wdXRDaGFubmVscyhMdXQpOworICAgIG91dHB1dENoYW4gPSBjbXNQaXBlbGluZU91dHB1dENoYW5uZWxzKEx1dCk7CisKKyAgICAvLyBXcml0ZSBjaGFubmVsIGNvdW50CisgICAgaWYgKCFfY21zV3JpdGVVSW50OE51bWJlcihpbywgKGNtc1VJbnQ4TnVtYmVyKSBpbnB1dENoYW4pKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFfY21zV3JpdGVVSW50OE51bWJlcihpbywgKGNtc1VJbnQ4TnVtYmVyKSBvdXRwdXRDaGFuKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCAwKSkgcmV0dXJuIEZBTFNFOworCisgICAgLy8gS2VlcCBkaXJlY3RvcnkgdG8gYmUgZmlsbGVkIGxhdHRlcgorICAgIERpcmVjdG9yeVBvcyA9IGlvIC0+VGVsbChpbyk7CisKKyAgICAvLyBXcml0ZSB0aGUgZGlyZWN0b3J5CisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoQSAhPSBOVUxMKSB7CisKKyAgICAgICAgb2Zmc2V0QSA9IGlvIC0+VGVsbChpbykgLSBCYXNlT2Zmc2V0OworICAgICAgICBpZiAoIVdyaXRlU2V0T2ZDdXJ2ZXMoc2VsZiwgaW8sIGNtc1NpZ1BhcmFtZXRyaWNDdXJ2ZVR5cGUsIEEpKSByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaWYgKENMVVQgIT0gTlVMTCkgeworICAgICAgICBvZmZzZXRDID0gaW8gLT5UZWxsKGlvKSAtIEJhc2VPZmZzZXQ7CisgICAgICAgIGlmICghV3JpdGVDTFVUKHNlbGYsIGlvLCBMdXQgLT5TYXZlQXM4Qml0cyA/IDEgOiAyLCBDTFVUKSkgcmV0dXJuIEZBTFNFOworCisgICAgfQorICAgIGlmIChNICE9IE5VTEwpIHsKKworICAgICAgICBvZmZzZXRNID0gaW8gLT5UZWxsKGlvKSAtIEJhc2VPZmZzZXQ7CisgICAgICAgIGlmICghV3JpdGVTZXRPZkN1cnZlcyhzZWxmLCBpbywgY21zU2lnUGFyYW1ldHJpY0N1cnZlVHlwZSwgTSkpIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoTWF0cml4ICE9IE5VTEwpIHsKKyAgICAgICAgb2Zmc2V0TWF0ID0gaW8gLT5UZWxsKGlvKSAtIEJhc2VPZmZzZXQ7CisgICAgICAgIGlmICghV3JpdGVNYXRyaXgoc2VsZiwgaW8sIE1hdHJpeCkpIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoQiAhPSBOVUxMKSB7CisKKyAgICAgICAgb2Zmc2V0QiA9IGlvIC0+VGVsbChpbykgLSBCYXNlT2Zmc2V0OworICAgICAgICBpZiAoIVdyaXRlU2V0T2ZDdXJ2ZXMoc2VsZiwgaW8sIGNtc1NpZ1BhcmFtZXRyaWNDdXJ2ZVR5cGUsIEIpKSByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgQ3VycmVudFBvcyA9IGlvIC0+VGVsbChpbyk7CisKKyAgICBpZiAoIWlvIC0+U2VlayhpbywgRGlyZWN0b3J5UG9zKSkgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIG9mZnNldEIpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIG9mZnNldE1hdCkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgb2Zmc2V0TSkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgb2Zmc2V0QykpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgb2Zmc2V0QSkpIHJldHVybiBGQUxTRTsKKworICAgIGlmICghaW8gLT5TZWVrKGlvLCBDdXJyZW50UG9zKSkgcmV0dXJuIEZBTFNFOworCisgICAgcmV0dXJuIFRSVUU7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7Cit9CisKKworc3RhdGljCit2b2lkKiBUeXBlX0xVVEEyQl9EdXAoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjb25zdCB2b2lkICpQdHIsIGNtc1VJbnQzMk51bWJlciBuKQoreworICAgIHJldHVybiAodm9pZCopIGNtc1BpcGVsaW5lRHVwKChjbXNQaXBlbGluZSopIFB0cik7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Cit9CisKK3N0YXRpYwordm9pZCBUeXBlX0xVVEEyQl9GcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCogUHRyKQoreworICAgIGNtc1BpcGVsaW5lRnJlZSgoY21zUGlwZWxpbmUqKSBQdHIpOworICAgIHJldHVybjsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Cit9CisKKworLy8gTHV0QlRvQSB0eXBlCisKK3N0YXRpYwordm9pZCogVHlwZV9MVVRCMkFfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQoreworICAgIGNtc1VJbnQ4TnVtYmVyICAgICAgIGlucHV0Q2hhbjsgICAgICAvLyBOdW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMKKyAgICBjbXNVSW50OE51bWJlciAgICAgICBvdXRwdXRDaGFuOyAgICAgLy8gTnVtYmVyIG9mIG91dHB1dCBjaGFubmVscworICAgIGNtc1VJbnQzMk51bWJlciAgICAgIEJhc2VPZmZzZXQ7ICAgICAvLyBBY3R1YWwgcG9zaXRpb24gaW4gZmlsZQorICAgIGNtc1VJbnQzMk51bWJlciAgICAgIG9mZnNldEI7ICAgICAgICAvLyBPZmZzZXQgdG8gZmlyc3QgIkIiIGN1cnZlCisgICAgY21zVUludDMyTnVtYmVyICAgICAgb2Zmc2V0TWF0OyAgICAgIC8vIE9mZnNldCB0byBtYXRyaXgKKyAgICBjbXNVSW50MzJOdW1iZXIgICAgICBvZmZzZXRNOyAgICAgICAgLy8gT2Zmc2V0IHRvIGZpcnN0ICJNIiBjdXJ2ZQorICAgIGNtc1VJbnQzMk51bWJlciAgICAgIG9mZnNldEM7ICAgICAgICAvLyBPZmZzZXQgdG8gQ0xVVAorICAgIGNtc1VJbnQzMk51bWJlciAgICAgIG9mZnNldEE7ICAgICAgICAvLyBPZmZzZXQgdG8gZmlyc3QgIkEiIGN1cnZlCisgICAgY21zUGlwZWxpbmUqIE5ld0xVVCA9IE5VTEw7CisKKworICAgIEJhc2VPZmZzZXQgPSBpbyAtPlRlbGwoaW8pIC0gc2l6ZW9mKF9jbXNUYWdCYXNlKTsKKworICAgIGlmICghX2Ntc1JlYWRVSW50OE51bWJlcihpbywgJmlucHV0Q2hhbikpIHJldHVybiBOVUxMOworICAgIGlmICghX2Ntc1JlYWRVSW50OE51bWJlcihpbywgJm91dHB1dENoYW4pKSByZXR1cm4gTlVMTDsKKworICAgIGlmIChpbnB1dENoYW4gPT0gMCB8fCBpbnB1dENoYW4gPj0gY21zTUFYQ0hBTk5FTFMpIHJldHVybiBOVUxMOworICAgIGlmIChvdXRwdXRDaGFuID09IDAgfHwgb3V0cHV0Q2hhbiA+PSBjbXNNQVhDSEFOTkVMUykgcmV0dXJuIE5VTEw7CisKKyAgICAvLyBQYWRkaW5nCisgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgTlVMTCkpIHJldHVybiBOVUxMOworCisgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJm9mZnNldEIpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmb2Zmc2V0TWF0KSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJm9mZnNldE0pKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmb2Zmc2V0QykpIHJldHVybiBOVUxMOworICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZvZmZzZXRBKSkgcmV0dXJuIE5VTEw7CisKKyAgICAvLyBBbGxvY2F0ZXMgYW4gZW1wdHkgTFVUCisgICAgTmV3TFVUID0gY21zUGlwZWxpbmVBbGxvYyhzZWxmIC0+Q29udGV4dElELCBpbnB1dENoYW4sIG91dHB1dENoYW4pOworICAgIGlmIChOZXdMVVQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAob2Zmc2V0QiAhPSAwKSB7CisgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShOZXdMVVQsIGNtc0FUX0VORCwgUmVhZFNldE9mQ3VydmVzKHNlbGYsIGlvLCBCYXNlT2Zmc2V0ICsgb2Zmc2V0QiwgaW5wdXRDaGFuKSkpCisgICAgICAgICAgICBnb3RvIEVycm9yOworICAgIH0KKworICAgIGlmIChvZmZzZXRNYXQgIT0gMCkgeworICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTmV3TFVULCBjbXNBVF9FTkQsIFJlYWRNYXRyaXgoc2VsZiwgaW8sIEJhc2VPZmZzZXQgKyBvZmZzZXRNYXQpKSkKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgaWYgKG9mZnNldE0gIT0gMCkgeworICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTmV3TFVULCBjbXNBVF9FTkQsIFJlYWRTZXRPZkN1cnZlcyhzZWxmLCBpbywgQmFzZU9mZnNldCArIG9mZnNldE0sIGlucHV0Q2hhbikpKQorICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0QyAhPSAwKSB7CisgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShOZXdMVVQsIGNtc0FUX0VORCwgUmVhZENMVVQoc2VsZiwgaW8sIEJhc2VPZmZzZXQgKyBvZmZzZXRDLCBpbnB1dENoYW4sIG91dHB1dENoYW4pKSkKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgaWYgKG9mZnNldEEhPSAwKSB7CisgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShOZXdMVVQsIGNtc0FUX0VORCwgUmVhZFNldE9mQ3VydmVzKHNlbGYsIGlvLCBCYXNlT2Zmc2V0ICsgb2Zmc2V0QSwgb3V0cHV0Q2hhbikpKQorICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICAqbkl0ZW1zID0gMTsKKyAgICByZXR1cm4gTmV3TFVUOworRXJyb3I6CisgICAgY21zUGlwZWxpbmVGcmVlKE5ld0xVVCk7CisgICAgcmV0dXJuIE5VTEw7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFNpemVPZlRhZyk7Cit9CisKKworLyoKK0IKK0IgLSBNYXRyaXggLSBNCitCIC0gQ0xVVCAtIEEKK0IgLSBNYXRyaXggLSBNIC0gQ0xVVCAtIEEKKyovCisKK3N0YXRpYworY21zQm9vbCAgVHlwZV9MVVRCMkFfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCit7CisgICAgY21zUGlwZWxpbmUqIEx1dCA9IChjbXNQaXBlbGluZSopIFB0cjsKKyAgICBpbnQgaW5wdXRDaGFuLCBvdXRwdXRDaGFuOworICAgIGNtc1N0YWdlICpBID0gTlVMTCwgKkIgPSBOVUxMLCAqTSA9IE5VTEw7CisgICAgY21zU3RhZ2UgKk1hdHJpeCA9IE5VTEw7CisgICAgY21zU3RhZ2UgKkNMVVQgPSBOVUxMOworICAgIGNtc1VJbnQzMk51bWJlciBvZmZzZXRCID0gMCwgb2Zmc2V0TWF0ID0gMCwgb2Zmc2V0TSA9IDAsIG9mZnNldEMgPSAwLCBvZmZzZXRBID0gMDsKKyAgICBjbXNVSW50MzJOdW1iZXIgQmFzZU9mZnNldCwgRGlyZWN0b3J5UG9zLCBDdXJyZW50UG9zOworCisKKyAgICBCYXNlT2Zmc2V0ID0gaW8gLT5UZWxsKGlvKSAtIHNpemVvZihfY21zVGFnQmFzZSk7CisKKyAgICBpZiAoIWNtc1BpcGVsaW5lQ2hlY2tBbmRSZXRyZWl2ZVN0YWdlcyhMdXQsIDEsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsICZCKSkKKyAgICAgICAgaWYgKCFjbXNQaXBlbGluZUNoZWNrQW5kUmV0cmVpdmVTdGFnZXMoTHV0LCAzLCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLCBjbXNTaWdNYXRyaXhFbGVtVHlwZSwgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgJkIsICZNYXRyaXgsICZNKSkKKyAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVDaGVja0FuZFJldHJlaXZlU3RhZ2VzKEx1dCwgMywgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgY21zU2lnQ0x1dEVsZW1UeXBlLCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLCAmQiwgJkNMVVQsICZBKSkKKyAgICAgICAgICAgICAgICBpZiAoIWNtc1BpcGVsaW5lQ2hlY2tBbmRSZXRyZWl2ZVN0YWdlcyhMdXQsIDUsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsIGNtc1NpZ01hdHJpeEVsZW1UeXBlLCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLAorICAgICAgICAgICAgICAgICAgICBjbXNTaWdDTHV0RWxlbVR5cGUsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsICZCLCAmTWF0cml4LCAmTSwgJkNMVVQsICZBKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3Ioc2VsZi0+Q29udGV4dElELCBjbXNFUlJPUl9OT1RfU1VJVEFCTEUsICJMVVQgaXMgbm90IHN1aXRhYmxlIHRvIGJlIHNhdmVkIGFzIEx1dEJUb0EiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICBpbnB1dENoYW4gID0gY21zUGlwZWxpbmVJbnB1dENoYW5uZWxzKEx1dCk7CisgICAgb3V0cHV0Q2hhbiA9IGNtc1BpcGVsaW5lT3V0cHV0Q2hhbm5lbHMoTHV0KTsKKworICAgIGlmICghX2Ntc1dyaXRlVUludDhOdW1iZXIoaW8sIChjbXNVSW50OE51bWJlcikgaW5wdXRDaGFuKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghX2Ntc1dyaXRlVUludDhOdW1iZXIoaW8sIChjbXNVSW50OE51bWJlcikgb3V0cHV0Q2hhbikpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKKworICAgIERpcmVjdG9yeVBvcyA9IGlvIC0+VGVsbChpbyk7CisKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKKworICAgIGlmIChBICE9IE5VTEwpIHsKKworICAgICAgICBvZmZzZXRBID0gaW8gLT5UZWxsKGlvKSAtIEJhc2VPZmZzZXQ7CisgICAgICAgIGlmICghV3JpdGVTZXRPZkN1cnZlcyhzZWxmLCBpbywgY21zU2lnUGFyYW1ldHJpY0N1cnZlVHlwZSwgQSkpIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoQ0xVVCAhPSBOVUxMKSB7CisgICAgICAgIG9mZnNldEMgPSBpbyAtPlRlbGwoaW8pIC0gQmFzZU9mZnNldDsKKyAgICAgICAgaWYgKCFXcml0ZUNMVVQoc2VsZiwgaW8sIEx1dCAtPlNhdmVBczhCaXRzID8gMSA6IDIsIENMVVQpKSByZXR1cm4gRkFMU0U7CisKKyAgICB9CisgICAgaWYgKE0gIT0gTlVMTCkgeworCisgICAgICAgIG9mZnNldE0gPSBpbyAtPlRlbGwoaW8pIC0gQmFzZU9mZnNldDsKKyAgICAgICAgaWYgKCFXcml0ZVNldE9mQ3VydmVzKHNlbGYsIGlvLCBjbXNTaWdQYXJhbWV0cmljQ3VydmVUeXBlLCBNKSkgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmIChNYXRyaXggIT0gTlVMTCkgeworICAgICAgICBvZmZzZXRNYXQgPSBpbyAtPlRlbGwoaW8pIC0gQmFzZU9mZnNldDsKKyAgICAgICAgaWYgKCFXcml0ZU1hdHJpeChzZWxmLCBpbywgTWF0cml4KSkgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIGlmIChCICE9IE5VTEwpIHsKKworICAgICAgICBvZmZzZXRCID0gaW8gLT5UZWxsKGlvKSAtIEJhc2VPZmZzZXQ7CisgICAgICAgIGlmICghV3JpdGVTZXRPZkN1cnZlcyhzZWxmLCBpbywgY21zU2lnUGFyYW1ldHJpY0N1cnZlVHlwZSwgQikpIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBDdXJyZW50UG9zID0gaW8gLT5UZWxsKGlvKTsKKworICAgIGlmICghaW8gLT5TZWVrKGlvLCBEaXJlY3RvcnlQb3MpKSByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgb2Zmc2V0QikpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgb2Zmc2V0TWF0KSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBvZmZzZXRNKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBvZmZzZXRDKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBvZmZzZXRBKSkgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKCFpbyAtPlNlZWsoaW8sIEN1cnJlbnRQb3MpKSByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gVFJVRTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobkl0ZW1zKTsKK30KKworCisKK3N0YXRpYwordm9pZCogVHlwZV9MVVRCMkFfRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKK3sKKyAgICByZXR1cm4gKHZvaWQqKSBjbXNQaXBlbGluZUR1cCgoY21zUGlwZWxpbmUqKSBQdHIpOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOworfQorCitzdGF0aWMKK3ZvaWQgVHlwZV9MVVRCMkFfRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQqIFB0cikKK3sKKyAgICBjbXNQaXBlbGluZUZyZWUoKGNtc1BpcGVsaW5lKikgUHRyKTsKKyAgICByZXR1cm47CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOworfQorCisKKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIFR5cGUgY21zU2lnQ29sb3JhbnRUYWJsZVR5cGUKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKgorVGhlIHB1cnBvc2Ugb2YgdGhpcyB0YWcgaXMgdG8gaWRlbnRpZnkgdGhlIGNvbG9yYW50cyB1c2VkIGluIHRoZSBwcm9maWxlIGJ5IGEKK3VuaXF1ZSBuYW1lIGFuZCBzZXQgb2YgWFlaIG9yIEwqYSpiKiB2YWx1ZXMgdG8gZ2l2ZSB0aGUgY29sb3JhbnQgYW4gdW5hbWJpZ3VvdXMKK3ZhbHVlLiBUaGUgZmlyc3QgY29sb3JhbnQgbGlzdGVkIGlzIHRoZSBjb2xvcmFudCBvZiB0aGUgZmlyc3QgZGV2aWNlIGNoYW5uZWwgb2YKK2EgbHV0IHRhZy4gVGhlIHNlY29uZCBjb2xvcmFudCBsaXN0ZWQgaXMgdGhlIGNvbG9yYW50IG9mIHRoZSBzZWNvbmQgZGV2aWNlIGNoYW5uZWwKK29mIGEgbHV0IHRhZywgYW5kIHNvIG9uLgorKi8KKworc3RhdGljCit2b2lkICpUeXBlX0NvbG9yYW50VGFibGVfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQoreworICAgIGNtc1VJbnQzMk51bWJlciBpLCBDb3VudDsKKyAgICBjbXNOQU1FRENPTE9STElTVCogTGlzdDsKKyAgICBjaGFyIE5hbWVbMzNdOworICAgIGNtc1VJbnQxNk51bWJlciBQQ1NbM107CisKKworICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZDb3VudCkpIHJldHVybiBOVUxMOworCisgICAgaWYgKENvdW50ID4gY21zTUFYQ0hBTk5FTFMpIHsKKyAgICAgICAgY21zU2lnbmFsRXJyb3Ioc2VsZi0+Q29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgIlRvbyBtYW55IGNvbG9yYW50cyAnJWQnIiwgQ291bnQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBMaXN0ID0gY21zQWxsb2NOYW1lZENvbG9yTGlzdChzZWxmIC0+Q29udGV4dElELCBDb3VudCwgMCwgIiIsICIiKTsKKyAgICBmb3IgKGk9MDsgaSA8IENvdW50OyBpKyspIHsKKworICAgICAgICBpZiAoaW8gLT5SZWFkKGlvLCBOYW1lLCAzMiwgMSkgIT0gMSkgZ290byBFcnJvcjsKKyAgICAgICAgTmFtZVszMl0gPSAwOworCisgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZBcnJheShpbywgMywgUENTKSkgZ290byBFcnJvcjsKKworICAgICAgICBpZiAoIWNtc0FwcGVuZE5hbWVkQ29sb3IoTGlzdCwgTmFtZSwgUENTLCBOVUxMKSkgZ290byBFcnJvcjsKKworICAgIH0KKworICAgICpuSXRlbXMgPSAxOworICAgIHJldHVybiBMaXN0OworCitFcnJvcjoKKyAgICAqbkl0ZW1zID0gMDsKKyAgICBjbXNGcmVlTmFtZWRDb2xvckxpc3QoTGlzdCk7CisgICAgcmV0dXJuIE5VTEw7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFNpemVPZlRhZyk7Cit9CisKKworCisvLyBTYXZlcyBhIGNvbG9yYW50IHRhYmxlLiBJdCBpcyB1c2luZyB0aGUgbmFtZWQgY29sb3Igc3RydWN0dXJlIGZvciBzaW1wbGljaXR5IHNha2UKK3N0YXRpYworY21zQm9vbCAgVHlwZV9Db2xvcmFudFRhYmxlX1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQoreworICAgIGNtc05BTUVEQ09MT1JMSVNUKiBOYW1lZENvbG9yTGlzdCA9IChjbXNOQU1FRENPTE9STElTVCopIFB0cjsKKyAgICBpbnQgaSwgbkNvbG9yczsKKworICAgIG5Db2xvcnMgPSBjbXNOYW1lZENvbG9yQ291bnQoTmFtZWRDb2xvckxpc3QpOworCisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIG5Db2xvcnMpKSByZXR1cm4gRkFMU0U7CisKKyAgICBmb3IgKGk9MDsgaSA8IG5Db2xvcnM7IGkrKykgeworCisgICAgICAgIGNoYXIgcm9vdFszM107CisgICAgICAgIGNtc1VJbnQxNk51bWJlciBQQ1NbM107CisKKyAgICAgICAgaWYgKCFjbXNOYW1lZENvbG9ySW5mbyhOYW1lZENvbG9yTGlzdCwgaSwgcm9vdCwgTlVMTCwgTlVMTCwgUENTLCBOVUxMKSkgcmV0dXJuIDA7CisgICAgICAgIHJvb3RbMzJdID0gMDsKKworICAgICAgICBpZiAoIWlvIC0+V3JpdGUoaW8sIDMyLCByb290KSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNkFycmF5KGlvLCAzLCBQQ1MpKSByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKK30KKworCitzdGF0aWMKK3ZvaWQqIFR5cGVfQ29sb3JhbnRUYWJsZV9EdXAoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjb25zdCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuKQoreworICAgIGNtc05BTUVEQ09MT1JMSVNUKiBuYyA9IChjbXNOQU1FRENPTE9STElTVCopIFB0cjsKKyAgICByZXR1cm4gKHZvaWQqKSBjbXNEdXBOYW1lZENvbG9yTGlzdChuYyk7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Cit9CisKKworc3RhdGljCit2b2lkIFR5cGVfQ29sb3JhbnRUYWJsZV9GcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCogUHRyKQoreworICAgIGNtc0ZyZWVOYW1lZENvbG9yTGlzdCgoY21zTkFNRURDT0xPUkxJU1QqKSBQdHIpOworICAgIHJldHVybjsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Cit9CisKKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIFR5cGUgY21zU2lnTmFtZWRDb2xvcjJUeXBlCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vVGhlIG5hbWVkQ29sb3IyVHlwZSBpcyBhIGNvdW50IHZhbHVlIGFuZCBhcnJheSBvZiBzdHJ1Y3R1cmVzIHRoYXQgcHJvdmlkZSBjb2xvcgorLy9jb29yZGluYXRlcyBmb3IgNy1iaXQgQVNDSUkgY29sb3IgbmFtZXMuIEZvciBlYWNoIG5hbWVkIGNvbG9yLCBhIFBDUyBhbmQgb3B0aW9uYWwKKy8vZGV2aWNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb2xvciBhcmUgZ2l2ZW4uIEJvdGggcmVwcmVzZW50YXRpb25zIGFyZSAxNi1iaXQgdmFsdWVzLgorLy9UaGUgZGV2aWNlIHJlcHJlc2VudGF0aW9uIGNvcnJlc3BvbmRzIHRvIHRoZSBoZWFkZXIncyAnY29sb3Igc3BhY2Ugb2YgZGF0YScgZmllbGQuCisvL1RoaXMgcmVwcmVzZW50YXRpb24gc2hvdWxkIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgJ251bWJlciBvZiBkZXZpY2UgY29tcG9uZW50cycKKy8vZmllbGQgaW4gdGhlIG5hbWVkQ29sb3IyVHlwZS4gSWYgdGhpcyBmaWVsZCBpcyAwLCBkZXZpY2UgY29vcmRpbmF0ZXMgYXJlIG5vdCBwcm92aWRlZC4KKy8vVGhlIFBDUyByZXByZXNlbnRhdGlvbiBjb3JyZXNwb25kcyB0byB0aGUgaGVhZGVyJ3MgUENTIGZpZWxkLiBUaGUgUENTIHJlcHJlc2VudGF0aW9uCisvL2lzIGFsd2F5cyBwcm92aWRlZC4gQ29sb3IgbmFtZXMgYXJlIGZpeGVkLWxlbmd0aCwgMzItYnl0ZSBmaWVsZHMgaW5jbHVkaW5nIG51bGwKKy8vdGVybWluYXRpb24uIEluIG9yZGVyIHRvIG1haW50YWluIG1heGltdW0gcG9ydGFiaWxpdHksIGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkCisvL3RoYXQgc3BlY2lhbCBjaGFyYWN0ZXJzIG9mIHRoZSA3LWJpdCBBU0NJSSBzZXQgbm90IGJlIHVzZWQuCisKK3N0YXRpYwordm9pZCAqVHlwZV9OYW1lZENvbG9yX1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG5JdGVtcywgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKK3sKKworICAgIGNtc1VJbnQzMk51bWJlciAgICAgIHZlbmRvckZsYWc7ICAgICAvLyBCb3R0b20gMTYgYml0cyBmb3IgSUNDIHVzZQorICAgIGNtc1VJbnQzMk51bWJlciAgICAgIGNvdW50OyAgICAgICAgICAvLyBDb3VudCBvZiBuYW1lZCBjb2xvcnMKKyAgICBjbXNVSW50MzJOdW1iZXIgICAgICBuRGV2aWNlQ29vcmRzOyAgLy8gTnVtIG9mIGRldmljZSBjb29yZGluYXRlcworICAgIGNoYXIgICAgICAgICAgICAgICAgIHByZWZpeFszMl07ICAgICAvLyBQcmVmaXggZm9yIGVhY2ggY29sb3IgbmFtZQorICAgIGNoYXIgICAgICAgICAgICAgICAgIHN1ZmZpeFszMl07ICAgICAvLyBTdWZmaXggZm9yIGVhY2ggY29sb3IgbmFtZQorICAgIGNtc05BTUVEQ09MT1JMSVNUKiAgdjsKKyAgICBjbXNVSW50MzJOdW1iZXIgaTsKKworCisgICAgKm5JdGVtcyA9IDA7CisgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJnZlbmRvckZsYWcpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmY291bnQpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmbkRldmljZUNvb3JkcykpIHJldHVybiBOVUxMOworCisgICAgaWYgKGlvIC0+IFJlYWQoaW8sIHByZWZpeCwgMzIsIDEpICE9IDEpIHJldHVybiBOVUxMOworICAgIGlmIChpbyAtPiBSZWFkKGlvLCBzdWZmaXgsIDMyLCAxKSAhPSAxKSByZXR1cm4gTlVMTDsKKworICAgIHByZWZpeFszMV0gPSBzdWZmaXhbMzFdID0gMDsKKworICAgIHYgPSBjbXNBbGxvY05hbWVkQ29sb3JMaXN0KHNlbGYgLT5Db250ZXh0SUQsIGNvdW50LCBuRGV2aWNlQ29vcmRzLCBwcmVmaXgsIHN1ZmZpeCk7CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBjbXNTaWduYWxFcnJvcihzZWxmLT5Db250ZXh0SUQsIGNtc0VSUk9SX1JBTkdFLCAiVG9vIG1hbnkgbmFtZWQgY29sb3JzICclZCciLCBjb3VudCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChuRGV2aWNlQ29vcmRzID4gY21zTUFYQ0hBTk5FTFMpIHsKKyAgICAgICAgY21zU2lnbmFsRXJyb3Ioc2VsZi0+Q29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgIlRvbyBtYW55IGRldmljZSBjb29yZGluYXRlcyAnJWQnIiwgbkRldmljZUNvb3Jkcyk7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIGZvciAoaT0wOyBpIDwgY291bnQ7IGkrKykgeworCisgICAgICAgIGNtc1VJbnQxNk51bWJlciBQQ1NbM107CisgICAgICAgIGNtc1VJbnQxNk51bWJlciBDb2xvcmFudFtjbXNNQVhDSEFOTkVMU107CisgICAgICAgIGNoYXIgUm9vdFszM107CisKKyAgICAgICAgbWVtc2V0KENvbG9yYW50LCAwLCBzaXplb2YoQ29sb3JhbnQpKTsKKyAgICAgICAgaWYgKGlvIC0+IFJlYWQoaW8sIFJvb3QsIDMyLCAxKSAhPSAxKSBnb3RvIEVycm9yOworICAgICAgICBSb290WzMyXSA9IDA7ICAvLyBUbyBwcmV2ZW50IGV4cGxvaXRzCisKKyAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQxNkFycmF5KGlvLCAzLCBQQ1MpKSBnb3RvIEVycm9yOworICAgICAgICBpZiAoIV9jbXNSZWFkVUludDE2QXJyYXkoaW8sIG5EZXZpY2VDb29yZHMsIENvbG9yYW50KSkgZ290byBFcnJvcjsKKworICAgICAgICBpZiAoIWNtc0FwcGVuZE5hbWVkQ29sb3IodiwgUm9vdCwgUENTLCBDb2xvcmFudCkpIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgKm5JdGVtcyA9IDE7CisgICAgcmV0dXJuICh2b2lkKikgdiA7CisKK0Vycm9yOgorICAgIGNtc0ZyZWVOYW1lZENvbG9yTGlzdCh2KTsKKyAgICByZXR1cm4gTlVMTDsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU2l6ZU9mVGFnKTsKK30KKworCisvLyBTYXZlcyBhIG5hbWVkIGNvbG9yIGxpc3QgaW50byBhIG5hbWVkIGNvbG9yIHByb2ZpbGUKK3N0YXRpYworY21zQm9vbCBUeXBlX05hbWVkQ29sb3JfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCit7CisgICAgY21zTkFNRURDT0xPUkxJU1QqIE5hbWVkQ29sb3JMaXN0ID0gKGNtc05BTUVEQ09MT1JMSVNUKikgUHRyOworICAgIGNoYXIgICAgICAgICAgICAgICAgcHJlZml4WzMzXTsgICAgIC8vIFByZWZpeCBmb3IgZWFjaCBjb2xvciBuYW1lCisgICAgY2hhciAgICAgICAgICAgICAgICBzdWZmaXhbMzNdOyAgICAgLy8gU3VmZml4IGZvciBlYWNoIGNvbG9yIG5hbWUKKyAgICBpbnQgaSwgbkNvbG9yczsKKworICAgIG5Db2xvcnMgPSBjbXNOYW1lZENvbG9yQ291bnQoTmFtZWRDb2xvckxpc3QpOworCisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIG5Db2xvcnMpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIE5hbWVkQ29sb3JMaXN0IC0+Q29sb3JhbnRDb3VudCkpIHJldHVybiBGQUxTRTsKKworICAgIHN0cm5jcHkocHJlZml4LCAoY29uc3QgY2hhciopIE5hbWVkQ29sb3JMaXN0LT5QcmVmaXgsIDMyKTsKKyAgICBzdHJuY3B5KHN1ZmZpeCwgKGNvbnN0IGNoYXIqKSBOYW1lZENvbG9yTGlzdC0+U3VmZml4LCAzMik7CisKKyAgICBzdWZmaXhbMzJdID0gcHJlZml4WzMyXSA9IDA7CisKKyAgICBpZiAoIWlvIC0+V3JpdGUoaW8sIDMyLCBwcmVmaXgpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFpbyAtPldyaXRlKGlvLCAzMiwgc3VmZml4KSkgcmV0dXJuIEZBTFNFOworCisgICAgZm9yIChpPTA7IGkgPCBuQ29sb3JzOyBpKyspIHsKKworICAgICAgIGNtc1VJbnQxNk51bWJlciBQQ1NbM107CisgICAgICAgY21zVUludDE2TnVtYmVyIENvbG9yYW50W2Ntc01BWENIQU5ORUxTXTsKKyAgICAgICBjaGFyIFJvb3RbMzNdOworCisgICAgICAgIGlmICghY21zTmFtZWRDb2xvckluZm8oTmFtZWRDb2xvckxpc3QsIGksIFJvb3QsIE5VTEwsIE5VTEwsIFBDUywgQ29sb3JhbnQpKSByZXR1cm4gMDsKKyAgICAgICAgUm9vdFszMl0gPSAwOworICAgICAgICBpZiAoIWlvIC0+V3JpdGUoaW8sIDMyICwgUm9vdCkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MTZBcnJheShpbywgMywgUENTKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNkFycmF5KGlvLCBOYW1lZENvbG9yTGlzdCAtPkNvbG9yYW50Q291bnQsIENvbG9yYW50KSkgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihuSXRlbXMpOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Cit9CisKK3N0YXRpYwordm9pZCogVHlwZV9OYW1lZENvbG9yX0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG4pCit7CisgICAgY21zTkFNRURDT0xPUkxJU1QqIG5jID0gKGNtc05BTUVEQ09MT1JMSVNUKikgUHRyOworCisgICAgcmV0dXJuICh2b2lkKikgY21zRHVwTmFtZWRDb2xvckxpc3QobmMpOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOworfQorCisKK3N0YXRpYwordm9pZCBUeXBlX05hbWVkQ29sb3JfRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQqIFB0cikKK3sKKyAgICBjbXNGcmVlTmFtZWRDb2xvckxpc3QoKGNtc05BTUVEQ09MT1JMSVNUKikgUHRyKTsKKyAgICByZXR1cm47CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOworfQorCisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBUeXBlIGNtc1NpZ1Byb2ZpbGVTZXF1ZW5jZURlc2NUeXBlCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisvLyBUaGlzIHR5cGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0dXJlcywgZWFjaCBvZiB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBmcm9tIHRoZQorLy8gaGVhZGVyIGZpZWxkcyBhbmQgdGFncyBmcm9tIHRoZSBvcmlnaW5hbCBwcm9maWxlcyB3aGljaCB3ZXJlIGNvbWJpbmVkIHRvIGNyZWF0ZQorLy8gdGhlIGZpbmFsIHByb2ZpbGUuIFRoZSBvcmRlciBvZiB0aGUgc3RydWN0dXJlcyBpcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHByb2ZpbGVzCisvLyB3ZXJlIGNvbWJpbmVkIGFuZCBpbmNsdWRlcyBhIHN0cnVjdHVyZSBmb3IgdGhlIGZpbmFsIHByb2ZpbGUuIFRoaXMgcHJvdmlkZXMgYQorLy8gZGVzY3JpcHRpb24gb2YgdGhlIHByb2ZpbGUgc2VxdWVuY2UgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24sCisvLyB0eXBpY2FsbHkgdXNlZCB3aXRoIHRoZSBEZXZpY2VMaW5rIHByb2ZpbGUuCisKK3N0YXRpYworY21zQm9vbCBSZWFkRW1iZWRkZWRUZXh0KHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zTUxVKiogbWx1LCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQoreworICAgIGNtc1RhZ1R5cGVTaWduYXR1cmUgIEJhc2VUeXBlOworICAgIGNtc1VJbnQzMk51bWJlciBuSXRlbXM7CisKKyAgICBCYXNlVHlwZSA9IF9jbXNSZWFkVHlwZUJhc2UoaW8pOworCisgICAgc3dpdGNoIChCYXNlVHlwZSkgeworCisgICAgICAgY2FzZSBjbXNTaWdUZXh0VHlwZToKKyAgICAgICAgICAgaWYgKCptbHUpIGNtc01MVWZyZWUoKm1sdSk7CisgICAgICAgICAgICptbHUgPSAoY21zTUxVKilUeXBlX1RleHRfUmVhZChzZWxmLCBpbywgJm5JdGVtcywgU2l6ZU9mVGFnKTsKKyAgICAgICAgICAgcmV0dXJuICgqbWx1ICE9IE5VTEwpOworCisgICAgICAgY2FzZSBjbXNTaWdUZXh0RGVzY3JpcHRpb25UeXBlOgorICAgICAgICAgICBpZiAoKm1sdSkgY21zTUxVZnJlZSgqbWx1KTsKKyAgICAgICAgICAgKm1sdSA9ICAoY21zTUxVKikgVHlwZV9UZXh0X0Rlc2NyaXB0aW9uX1JlYWQoc2VsZiwgaW8sICZuSXRlbXMsIFNpemVPZlRhZyk7CisgICAgICAgICAgIHJldHVybiAoKm1sdSAhPSBOVUxMKTsKKworICAgICAgICAgICAvKgorICAgICAgICAgICBUQkQ6IFNpemUgaXMgbmVlZGVkIGZvciBNTFUsIGFuZCB3ZSBoYXZlIG5vIGlkZWEgb24gd2hpY2ggaXMgdGhlIGF2YWlsYWJsZSBzaXplCisgICAgICAgICAgICovCisKKyAgICAgICBjYXNlIGNtc1NpZ011bHRpTG9jYWxpemVkVW5pY29kZVR5cGU6CisgICAgICAgICAgIGlmICgqbWx1KSBjbXNNTFVmcmVlKCptbHUpOworICAgICAgICAgICAqbWx1ID0gIChjbXNNTFUqKSBUeXBlX01MVV9SZWFkKHNlbGYsIGlvLCAmbkl0ZW1zLCBTaXplT2ZUYWcpOworICAgICAgICAgICByZXR1cm4gKCptbHUgIT0gTlVMTCk7CisKKyAgICAgICBkZWZhdWx0OiByZXR1cm4gRkFMU0U7CisgICAgfQorfQorCisKK3N0YXRpYwordm9pZCAqVHlwZV9Qcm9maWxlU2VxdWVuY2VEZXNjX1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG5JdGVtcywgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKK3sKKyAgICBjbXNTRVEqIE91dFNlcTsKKyAgICBjbXNVSW50MzJOdW1iZXIgaSwgQ291bnQ7CisKKyAgICAqbkl0ZW1zID0gMDsKKworICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZDb3VudCkpIHJldHVybiBOVUxMOworCisgICAgaWYgKFNpemVPZlRhZyA8IHNpemVvZihjbXNVSW50MzJOdW1iZXIpKSByZXR1cm4gTlVMTDsKKyAgICBTaXplT2ZUYWcgLT0gc2l6ZW9mKGNtc1VJbnQzMk51bWJlcik7CisKKworICAgIE91dFNlcSA9IGNtc0FsbG9jUHJvZmlsZVNlcXVlbmNlRGVzY3JpcHRpb24oc2VsZiAtPkNvbnRleHRJRCwgQ291bnQpOworICAgIGlmIChPdXRTZXEgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBPdXRTZXEgLT5uID0gQ291bnQ7CisKKyAgICAvLyBHZXQgc3RydWN0dXJlcyBhcyB3ZWxsCisKKyAgICBmb3IgKGk9MDsgaSA8IENvdW50OyBpKyspIHsKKworICAgICAgICBjbXNQU0VRREVTQyogc2VjID0gJk91dFNlcSAtPiBzZXFbaV07CisKKyAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJnNlYyAtPmRldmljZU1mZykpIGdvdG8gRXJyb3I7CisgICAgICAgIGlmIChTaXplT2ZUYWcgPCBzaXplb2YoY21zVUludDMyTnVtYmVyKSkgZ290byBFcnJvcjsKKyAgICAgICAgU2l6ZU9mVGFnIC09IHNpemVvZihjbXNVSW50MzJOdW1iZXIpOworCisgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZzZWMgLT5kZXZpY2VNb2RlbCkpIGdvdG8gRXJyb3I7CisgICAgICAgIGlmIChTaXplT2ZUYWcgPCBzaXplb2YoY21zVUludDMyTnVtYmVyKSkgZ290byBFcnJvcjsKKyAgICAgICAgU2l6ZU9mVGFnIC09IHNpemVvZihjbXNVSW50MzJOdW1iZXIpOworCisgICAgICAgIGlmICghX2Ntc1JlYWRVSW50NjROdW1iZXIoaW8sICZzZWMgLT5hdHRyaWJ1dGVzKSkgZ290byBFcnJvcjsKKyAgICAgICAgaWYgKFNpemVPZlRhZyA8IHNpemVvZihjbXNVSW50NjROdW1iZXIpKSBnb3RvIEVycm9yOworICAgICAgICBTaXplT2ZUYWcgLT0gc2l6ZW9mKGNtc1VJbnQ2NE51bWJlcik7CisKKyAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgKGNtc1VJbnQzMk51bWJlciAqKSZzZWMgLT50ZWNobm9sb2d5KSkgZ290byBFcnJvcjsKKyAgICAgICAgaWYgKFNpemVPZlRhZyA8IHNpemVvZihjbXNVSW50MzJOdW1iZXIpKSBnb3RvIEVycm9yOworICAgICAgICBTaXplT2ZUYWcgLT0gc2l6ZW9mKGNtc1VJbnQzMk51bWJlcik7CisKKyAgICAgICAgaWYgKCFSZWFkRW1iZWRkZWRUZXh0KHNlbGYsIGlvLCAmc2VjIC0+TWFudWZhY3R1cmVyLCBTaXplT2ZUYWcpKSBnb3RvIEVycm9yOworICAgICAgICBpZiAoIVJlYWRFbWJlZGRlZFRleHQoc2VsZiwgaW8sICZzZWMgLT5Nb2RlbCwgU2l6ZU9mVGFnKSkgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICAqbkl0ZW1zID0gMTsKKyAgICByZXR1cm4gT3V0U2VxOworCitFcnJvcjoKKyAgICBjbXNGcmVlUHJvZmlsZVNlcXVlbmNlRGVzY3JpcHRpb24oT3V0U2VxKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworCisvLyBBdXgtLUVtYmVkIGEgdGV4dCBkZXNjcmlwdGlvbiB0eXBlLiBJdCBjYW4gYmUgb2YgdHlwZSB0ZXh0IGRlc2NyaXB0aW9uIG9yIG11bHRpbG9jYWxpemVkIHVuaWNvZGUKKy8vIGFuZCBpdCBkZXBlbmRzIG9mIHRoZSB2ZXJzaW9uIG51bWJlciBwYXNzZWQgb24gY21zVGFnRGVzY3JpcHRvciBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBzdGFjaworc3RhdGljCitjbXNCb29sICBTYXZlRGVzY3JpcHRpb24oc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNNTFUqIFRleHQpCit7CisgICAgaWYgKHNlbGYgLT5JQ0NWZXJzaW9uIDwgMHg0MDAwMDAwKSB7CisKKyAgICAgICAgaWYgKCFfY21zV3JpdGVUeXBlQmFzZShpbywgY21zU2lnVGV4dERlc2NyaXB0aW9uVHlwZSkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgcmV0dXJuIFR5cGVfVGV4dF9EZXNjcmlwdGlvbl9Xcml0ZShzZWxmLCBpbywgVGV4dCwgMSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIV9jbXNXcml0ZVR5cGVCYXNlKGlvLCBjbXNTaWdNdWx0aUxvY2FsaXplZFVuaWNvZGVUeXBlKSkgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gVHlwZV9NTFVfV3JpdGUoc2VsZiwgaW8sIFRleHQsIDEpOworICAgIH0KK30KKworCitzdGF0aWMKK2Ntc0Jvb2wgIFR5cGVfUHJvZmlsZVNlcXVlbmNlRGVzY19Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKK3sKKyAgICBjbXNTRVEqIFNlcSA9IChjbXNTRVEqKSBQdHI7CisgICAgY21zVUludDMyTnVtYmVyIGk7CisKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgU2VxLT5uKSkgcmV0dXJuIEZBTFNFOworCisgICAgZm9yIChpPTA7IGkgPCBTZXEgLT5uOyBpKyspIHsKKworICAgICAgICBjbXNQU0VRREVTQyogc2VjID0gJlNlcSAtPiBzZXFbaV07CisKKyAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIHNlYyAtPmRldmljZU1mZykpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIHNlYyAtPmRldmljZU1vZGVsKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQ2NE51bWJlcihpbywgJnNlYyAtPmF0dHJpYnV0ZXMpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBzZWMgLT50ZWNobm9sb2d5KSkgcmV0dXJuIEZBTFNFOworCisgICAgICAgIGlmICghU2F2ZURlc2NyaXB0aW9uKHNlbGYsIGlvLCBzZWMgLT5NYW51ZmFjdHVyZXIpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghU2F2ZURlc2NyaXB0aW9uKHNlbGYsIGlvLCBzZWMgLT5Nb2RlbCkpIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAgcmV0dXJuIFRSVUU7CisKKyAgICAgY21zVU5VU0VEX1BBUkFNRVRFUihuSXRlbXMpOworfQorCisKK3N0YXRpYwordm9pZCogVHlwZV9Qcm9maWxlU2VxdWVuY2VEZXNjX0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG4pCit7CisgICAgcmV0dXJuICh2b2lkKikgY21zRHVwUHJvZmlsZVNlcXVlbmNlRGVzY3JpcHRpb24oKGNtc1NFUSopIFB0cik7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Cit9CisKK3N0YXRpYwordm9pZCBUeXBlX1Byb2ZpbGVTZXF1ZW5jZURlc2NfRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQqIFB0cikKK3sKKyAgICBjbXNGcmVlUHJvZmlsZVNlcXVlbmNlRGVzY3JpcHRpb24oKGNtc1NFUSopIFB0cik7CisgICAgcmV0dXJuOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKK30KKworCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gVHlwZSBjbXNTaWdQcm9maWxlU2VxdWVuY2VJZFR5cGUKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvKgorSW4gY2VydGFpbiB3b3JrZmxvd3MgdXNpbmcgSUNDIERldmljZSBMaW5rIFByb2ZpbGVzLCBpdCBpcyBuZWNlc3NhcnkgdG8gaWRlbnRpZnkgdGhlCitvcmlnaW5hbCBwcm9maWxlcyB0aGF0IHdlcmUgY29tYmluZWQgdG8gY3JlYXRlIHRoZSBEZXZpY2UgTGluayBQcm9maWxlLgorVGhpcyB0eXBlIGlzIGFuIGFycmF5IG9mIHN0cnVjdHVyZXMsIGVhY2ggb2Ygd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gZm9yCitpZGVudGlmaWNhdGlvbiBvZiBhIHByb2ZpbGUgdXNlZCBpbiBhIHNlcXVlbmNlCisqLworCisKK3N0YXRpYworY21zQm9vbCBSZWFkU2VxSUQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSU9IQU5ETEVSKiBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIENhcmdvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQoreworICAgIGNtc1NFUSogT3V0U2VxID0gKGNtc1NFUSopIENhcmdvOworICAgIGNtc1BTRVFERVNDKiBzZXEgPSAmT3V0U2VxIC0+c2VxW25dOworCisgICAgaWYgKGlvIC0+IFJlYWQoaW8sIHNlcSAtPlByb2ZpbGVJRC5JRDgsIDE2LCAxKSAhPSAxKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFSZWFkRW1iZWRkZWRUZXh0KHNlbGYsIGlvLCAmc2VxIC0+RGVzY3JpcHRpb24sIFNpemVPZlRhZykpIHJldHVybiBGQUxTRTsKKworICAgIHJldHVybiBUUlVFOworfQorCisKKworc3RhdGljCit2b2lkICpUeXBlX1Byb2ZpbGVTZXF1ZW5jZUlkX1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG5JdGVtcywgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKK3sKKyAgICBjbXNTRVEqIE91dFNlcTsKKyAgICBjbXNVSW50MzJOdW1iZXIgQ291bnQ7CisgICAgY21zVUludDMyTnVtYmVyIEJhc2VPZmZzZXQ7CisKKyAgICAqbkl0ZW1zID0gMDsKKworICAgIC8vIEdldCBhY3R1YWwgcG9zaXRpb24gYXMgYSBiYXNpcyBmb3IgZWxlbWVudCBvZmZzZXRzCisgICAgQmFzZU9mZnNldCA9IGlvIC0+VGVsbChpbykgLSBzaXplb2YoX2Ntc1RhZ0Jhc2UpOworCisgICAgLy8gR2V0IHRhYmxlIGNvdW50CisgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJkNvdW50KSkgcmV0dXJuIE5VTEw7CisgICAgU2l6ZU9mVGFnIC09IHNpemVvZihjbXNVSW50MzJOdW1iZXIpOworCisgICAgLy8gQWxsb2NhdGUgYW4gZW1wdHkgc3RydWN0dXJlCisgICAgT3V0U2VxID0gY21zQWxsb2NQcm9maWxlU2VxdWVuY2VEZXNjcmlwdGlvbihzZWxmIC0+Q29udGV4dElELCBDb3VudCk7CisgICAgaWYgKE91dFNlcSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworCisgICAgLy8gUmVhZCB0aGUgcG9zaXRpb24gdGFibGUKKyAgICBpZiAoIVJlYWRQb3NpdGlvblRhYmxlKHNlbGYsIGlvLCBDb3VudCwgQmFzZU9mZnNldCwgT3V0U2VxLCBSZWFkU2VxSUQpKSB7CisKKyAgICAgICAgY21zRnJlZVByb2ZpbGVTZXF1ZW5jZURlc2NyaXB0aW9uKE91dFNlcSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIFN1Y2Nlc3MKKyAgICAqbkl0ZW1zID0gMTsKKyAgICByZXR1cm4gT3V0U2VxOworCit9CisKKworc3RhdGljCitjbXNCb29sIFdyaXRlU2VxSUQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSU9IQU5ETEVSKiBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIENhcmdvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQoreworICAgIGNtc1NFUSogU2VxID0gKGNtc1NFUSopIENhcmdvOworCisgICAgaWYgKCFpbyAtPldyaXRlKGlvLCAxNiwgU2VxIC0+c2VxW25dLlByb2ZpbGVJRC5JRDgpKSByZXR1cm4gRkFMU0U7CisKKyAgICAvLyBTdG9yZSBoZXJlIHRoZSBNTFUKKyAgICBpZiAoIVNhdmVEZXNjcmlwdGlvbihzZWxmLCBpbywgU2VxIC0+c2VxW25dLkRlc2NyaXB0aW9uKSkgcmV0dXJuIEZBTFNFOworCisgICAgcmV0dXJuIFRSVUU7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFNpemVPZlRhZyk7Cit9CisKK3N0YXRpYworY21zQm9vbCAgVHlwZV9Qcm9maWxlU2VxdWVuY2VJZF9Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKK3sKKyAgICBjbXNTRVEqIFNlcSA9IChjbXNTRVEqKSBQdHI7CisgICAgY21zVUludDMyTnVtYmVyIEJhc2VPZmZzZXQ7CisKKyAgICAvLyBLZWVwIHRoZSBiYXNlIG9mZnNldAorICAgIEJhc2VPZmZzZXQgPSBpbyAtPlRlbGwoaW8pIC0gc2l6ZW9mKF9jbXNUYWdCYXNlKTsKKworICAgIC8vIFRoaXMgaXMgdGhlIHRhYmxlIGNvdW50CisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIFNlcSAtPm4pKSByZXR1cm4gRkFMU0U7CisKKyAgICAvLyBUaGlzIGlzIHRoZSBwb3NpdGlvbiB0YWJsZSBhbmQgY29udGVudAorICAgIGlmICghV3JpdGVQb3NpdGlvblRhYmxlKHNlbGYsIGlvLCAwLCBTZXEgLT5uLCBCYXNlT2Zmc2V0LCBTZXEsIFdyaXRlU2VxSUQpKSByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gVFJVRTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobkl0ZW1zKTsKK30KKworc3RhdGljCit2b2lkKiBUeXBlX1Byb2ZpbGVTZXF1ZW5jZUlkX0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG4pCit7CisgICAgcmV0dXJuICh2b2lkKikgY21zRHVwUHJvZmlsZVNlcXVlbmNlRGVzY3JpcHRpb24oKGNtc1NFUSopIFB0cik7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Cit9CisKK3N0YXRpYwordm9pZCBUeXBlX1Byb2ZpbGVTZXF1ZW5jZUlkX0ZyZWUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCB2b2lkKiBQdHIpCit7CisgICAgY21zRnJlZVByb2ZpbGVTZXF1ZW5jZURlc2NyaXB0aW9uKChjbXNTRVEqKSBQdHIpOworICAgIHJldHVybjsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Cit9CisKKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIFR5cGUgY21zU2lnVWNyQmdUeXBlCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLyoKK1RoaXMgdHlwZSBjb250YWlucyBjdXJ2ZXMgcmVwcmVzZW50aW5nIHRoZSB1bmRlciBjb2xvciByZW1vdmFsIGFuZCBibGFjaworZ2VuZXJhdGlvbiBhbmQgYSB0ZXh0IHN0cmluZyB3aGljaCBpcyBhIGdlbmVyYWwgZGVzY3JpcHRpb24gb2YgdGhlIG1ldGhvZCB1c2VkCitmb3IgdGhlIHVjci9iZy4KKyovCisKK3N0YXRpYwordm9pZCAqVHlwZV9VY3JCZ19SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyKiBuSXRlbXMsIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcpCit7CisgICAgY21zVWNyQmcqIG4gPSAoY21zVWNyQmcqKSBfY21zTWFsbG9jWmVybyhzZWxmIC0+Q29udGV4dElELCBzaXplb2YoY21zVWNyQmcpKTsKKyAgICBjbXNVSW50MzJOdW1iZXIgQ291bnRVY3IsIENvdW50Qmc7CisgICAgY2hhciogQVNDSUlTdHJpbmc7CisKKyAgICAqbkl0ZW1zID0gMDsKKyAgICBpZiAobiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIC8vIEZpcnN0IGN1cnZlIGlzIFVuZGVyIGNvbG9yIHJlbW92YWwKKyAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmQ291bnRVY3IpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoU2l6ZU9mVGFnIDwgc2l6ZW9mKGNtc1VJbnQzMk51bWJlcikpIHJldHVybiBOVUxMOworICAgIFNpemVPZlRhZyAtPSBzaXplb2YoY21zVUludDMyTnVtYmVyKTsKKworICAgIG4gLT5VY3IgPSBjbXNCdWlsZFRhYnVsYXRlZFRvbmVDdXJ2ZTE2KHNlbGYgLT5Db250ZXh0SUQsIENvdW50VWNyLCBOVUxMKTsKKyAgICBpZiAobiAtPlVjciA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIGlmICghX2Ntc1JlYWRVSW50MTZBcnJheShpbywgQ291bnRVY3IsIG4gLT5VY3ItPlRhYmxlMTYpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoU2l6ZU9mVGFnIDwgc2l6ZW9mKGNtc1VJbnQzMk51bWJlcikpIHJldHVybiBOVUxMOworICAgIFNpemVPZlRhZyAtPSBDb3VudFVjciAqIHNpemVvZihjbXNVSW50MTZOdW1iZXIpOworCisgICAgLy8gU2Vjb25kIGN1cnZlIGlzIEJsYWNrIGdlbmVyYXRpb24KKyAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmQ291bnRCZykpIHJldHVybiBOVUxMOworICAgIGlmIChTaXplT2ZUYWcgPCBzaXplb2YoY21zVUludDMyTnVtYmVyKSkgcmV0dXJuIE5VTEw7CisgICAgU2l6ZU9mVGFnIC09IHNpemVvZihjbXNVSW50MzJOdW1iZXIpOworCisgICAgbiAtPkJnID0gY21zQnVpbGRUYWJ1bGF0ZWRUb25lQ3VydmUxNihzZWxmIC0+Q29udGV4dElELCBDb3VudEJnLCBOVUxMKTsKKyAgICBpZiAobiAtPkJnID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIGlmICghX2Ntc1JlYWRVSW50MTZBcnJheShpbywgQ291bnRCZywgbiAtPkJnLT5UYWJsZTE2KSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKFNpemVPZlRhZyA8IENvdW50QmcgKiBzaXplb2YoY21zVUludDE2TnVtYmVyKSkgcmV0dXJuIE5VTEw7CisgICAgU2l6ZU9mVGFnIC09IENvdW50QmcgKiBzaXplb2YoY21zVUludDE2TnVtYmVyKTsKKyAgICBpZiAoU2l6ZU9mVGFnID09IFVJTlRfTUFYKSByZXR1cm4gTlVMTDsKKworICAgIC8vIE5vdyBjb21lcyB0aGUgdGV4dC4gVGhlIGxlbmd0aCBpcyBzcGVjaWZpZWQgYnkgdGhlIHRhZyBzaXplCisgICAgbiAtPkRlc2MgPSBjbXNNTFVhbGxvYyhzZWxmIC0+Q29udGV4dElELCAxKTsKKyAgICBpZiAobiAtPkRlc2MgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBBU0NJSVN0cmluZyA9IChjaGFyKikgX2Ntc01hbGxvYyhzZWxmIC0+Q29udGV4dElELCBTaXplT2ZUYWcgKyAxKTsKKyAgICBpZiAoaW8gLT5SZWFkKGlvLCBBU0NJSVN0cmluZywgc2l6ZW9mKGNoYXIpLCBTaXplT2ZUYWcpICE9IFNpemVPZlRhZykgcmV0dXJuIE5VTEw7CisgICAgQVNDSUlTdHJpbmdbU2l6ZU9mVGFnXSA9IDA7CisgICAgY21zTUxVc2V0QVNDSUkobiAtPkRlc2MsIGNtc05vTGFuZ3VhZ2UsIGNtc05vQ291bnRyeSwgQVNDSUlTdHJpbmcpOworICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIEFTQ0lJU3RyaW5nKTsKKworICAgICpuSXRlbXMgPSAxOworICAgIHJldHVybiAodm9pZCopIG47Cit9CisKK3N0YXRpYworY21zQm9vbCAgVHlwZV9VY3JCZ19Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKK3sKKyAgICBjbXNVY3JCZyogVmFsdWUgPSAoY21zVWNyQmcqKSBQdHI7CisgICAgY21zVUludDMyTnVtYmVyIFRleHRTaXplOworICAgIGNoYXIqIFRleHQ7CisKKyAgICAvLyBGaXJzdCBjdXJ2ZSBpcyBVbmRlciBjb2xvciByZW1vdmFsCisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIFZhbHVlIC0+VWNyIC0+bkVudHJpZXMpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFfY21zV3JpdGVVSW50MTZBcnJheShpbywgVmFsdWUgLT5VY3IgLT5uRW50cmllcywgVmFsdWUgLT5VY3IgLT5UYWJsZTE2KSkgcmV0dXJuIEZBTFNFOworCisgICAgLy8gVGhlbiBibGFjayBnZW5lcmF0aW9uCisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIFZhbHVlIC0+QmcgLT5uRW50cmllcykpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNkFycmF5KGlvLCBWYWx1ZSAtPkJnIC0+bkVudHJpZXMsIFZhbHVlIC0+QmcgLT5UYWJsZTE2KSkgcmV0dXJuIEZBTFNFOworCisgICAgLy8gTm93IGNvbWVzIHRoZSB0ZXh0LiBUaGUgbGVuZ3RoIGlzIHNwZWNpZmllZCBieSB0aGUgdGFnIHNpemUKKyAgICBUZXh0U2l6ZSA9IGNtc01MVWdldEFTQ0lJKFZhbHVlIC0+RGVzYywgY21zTm9MYW5ndWFnZSwgY21zTm9Db3VudHJ5LCBOVUxMLCAwKTsKKyAgICBUZXh0ICAgICA9IChjaGFyKikgX2Ntc01hbGxvYyhzZWxmIC0+Q29udGV4dElELCBUZXh0U2l6ZSk7CisgICAgaWYgKGNtc01MVWdldEFTQ0lJKFZhbHVlIC0+RGVzYywgY21zTm9MYW5ndWFnZSwgY21zTm9Db3VudHJ5LCBUZXh0LCBUZXh0U2l6ZSkgIT0gVGV4dFNpemUpIHJldHVybiBGQUxTRTsKKworICAgIGlmICghaW8gLT5Xcml0ZShpbywgVGV4dFNpemUsIFRleHQpKSByZXR1cm4gRkFMU0U7CisgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgVGV4dCk7CisKKyAgICByZXR1cm4gVFJVRTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobkl0ZW1zKTsKK30KKworc3RhdGljCit2b2lkKiBUeXBlX1VjckJnX0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQgKlB0ciwgY21zVUludDMyTnVtYmVyIG4pCit7CisgICAgY21zVWNyQmcqIFNyYyA9IChjbXNVY3JCZyopIFB0cjsKKyAgICBjbXNVY3JCZyogTmV3VWNyQmcgPSAoY21zVWNyQmcqKSBfY21zTWFsbG9jWmVybyhzZWxmIC0+Q29udGV4dElELCBzaXplb2YoY21zVWNyQmcpKTsKKworICAgIGlmIChOZXdVY3JCZyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIE5ld1VjckJnIC0+QmcgICA9IGNtc0R1cFRvbmVDdXJ2ZShTcmMgLT5CZyk7CisgICAgTmV3VWNyQmcgLT5VY3IgID0gY21zRHVwVG9uZUN1cnZlKFNyYyAtPlVjcik7CisgICAgTmV3VWNyQmcgLT5EZXNjID0gY21zTUxVZHVwKFNyYyAtPkRlc2MpOworCisgICAgcmV0dXJuICh2b2lkKikgTmV3VWNyQmc7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOworfQorCitzdGF0aWMKK3ZvaWQgVHlwZV9VY3JCZ19GcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCAqUHRyKQoreworICAgY21zVWNyQmcqIFNyYyA9IChjbXNVY3JCZyopIFB0cjsKKworICAgaWYgKFNyYyAtPlVjcikgY21zRnJlZVRvbmVDdXJ2ZShTcmMgLT5VY3IpOworICAgaWYgKFNyYyAtPkJnKSAgY21zRnJlZVRvbmVDdXJ2ZShTcmMgLT5CZyk7CisgICBpZiAoU3JjIC0+RGVzYykgY21zTUxVZnJlZShTcmMgLT5EZXNjKTsKKworICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgUHRyKTsKK30KKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIFR5cGUgY21zU2lnQ3JkSW5mb1R5cGUKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8qCitUaGlzIHR5cGUgY29udGFpbnMgdGhlIFBvc3RTY3JpcHQgcHJvZHVjdCBuYW1lIHRvIHdoaWNoIHRoaXMgcHJvZmlsZSBjb3JyZXNwb25kcworYW5kIHRoZSBuYW1lcyBvZiB0aGUgY29tcGFuaW9uIENSRHMuIFJlY2FsbCB0aGF0IGEgc2luZ2xlIHByb2ZpbGUgY2FuIGdlbmVyYXRlCittdWx0aXBsZSBDUkRzLiBJdCBpcyBpbXBsZW1lbnRlZCBhcyBhIE1MVSBiZWluZyB0aGUgbGFuZ3VhZ2UgY29kZSAiUFMiIGFuZCB0aGVuCitjb3VudHJ5IHZhcmllcyBmb3IgZWFjaCBlbGVtZW50OgorCisgICAgICAgICAgICAgICAgbm06IFBvc3RTY3JpcHQgcHJvZHVjdCBuYW1lCisgICAgICAgICAgICAgICAgIzA6IFJlbmRlcmluZyBpbnRlbnQgMCBDUkQgbmFtZQorICAgICAgICAgICAgICAgICMxOiBSZW5kZXJpbmcgaW50ZW50IDEgQ1JEIG5hbWUKKyAgICAgICAgICAgICAgICAjMjogUmVuZGVyaW5nIGludGVudCAyIENSRCBuYW1lCisgICAgICAgICAgICAgICAgIzM6IFJlbmRlcmluZyBpbnRlbnQgMyBDUkQgbmFtZQorKi8KKworCisKKy8vIEF1eGlsaWFyeSwgcmVhZCBhbiBzdHJpbmcgc3BlY2lmaWVkIGFzIGNvdW50ICsgc3RyaW5nCitzdGF0aWMKK2Ntc0Jvb2wgIFJlYWRDb3VudEFuZFN0aW5nKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zTUxVKiBtbHUsIGNtc1VJbnQzMk51bWJlciogU2l6ZU9mVGFnLCBjb25zdCBjaGFyKiBTZWN0aW9uKQoreworICAgIGNtc1VJbnQzMk51bWJlciBDb3VudDsKKyAgICBjaGFyKiBUZXh0OworCisgICAgaWYgKCpTaXplT2ZUYWcgPCBzaXplb2YoY21zVUludDMyTnVtYmVyKSkgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJkNvdW50KSkgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKENvdW50ID4gVUlOVF9NQVggLSBzaXplb2YoY21zVUludDMyTnVtYmVyKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICgqU2l6ZU9mVGFnIDwgQ291bnQgKyBzaXplb2YoY21zVUludDMyTnVtYmVyKSkgcmV0dXJuIEZBTFNFOworCisgICAgVGV4dCAgICAgPSAoY2hhciopIF9jbXNNYWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgQ291bnQrMSk7CisgICAgaWYgKFRleHQgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKGlvIC0+UmVhZChpbywgVGV4dCwgc2l6ZW9mKGNtc1VJbnQ4TnVtYmVyKSwgQ291bnQpICE9IENvdW50KSB7CisgICAgICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFRleHQpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgVGV4dFtDb3VudF0gPSAwOworCisgICAgY21zTUxVc2V0QVNDSUkobWx1LCAiUFMiLCBTZWN0aW9uLCBUZXh0KTsKKyAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBUZXh0KTsKKworICAgICpTaXplT2ZUYWcgLT0gKENvdW50ICsgc2l6ZW9mKGNtc1VJbnQzMk51bWJlcikpOworICAgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMKK2Ntc0Jvb2wgIFdyaXRlQ291bnRBbmRTdGluZyhzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc01MVSogbWx1LCBjb25zdCBjaGFyKiBTZWN0aW9uKQoreworIGNtc1VJbnQzMk51bWJlciBUZXh0U2l6ZTsKKyBjaGFyKiBUZXh0OworCisgICAgVGV4dFNpemUgPSBjbXNNTFVnZXRBU0NJSShtbHUsICJQUyIsIFNlY3Rpb24sIE5VTEwsIDApOworICAgIFRleHQgICAgID0gKGNoYXIqKSBfY21zTWFsbG9jKHNlbGYgLT5Db250ZXh0SUQsIFRleHRTaXplKTsKKworICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBUZXh0U2l6ZSkpIHJldHVybiBGQUxTRTsKKworICAgIGlmIChjbXNNTFVnZXRBU0NJSShtbHUsICJQUyIsIFNlY3Rpb24sIFRleHQsIFRleHRTaXplKSA9PSAwKSByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAoIWlvIC0+V3JpdGUoaW8sIFRleHRTaXplLCBUZXh0KSkgcmV0dXJuIEZBTFNFOworICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFRleHQpOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYwordm9pZCAqVHlwZV9DcmRJbmZvX1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG5JdGVtcywgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKK3sKKyAgICBjbXNNTFUqIG1sdSA9IGNtc01MVWFsbG9jKHNlbGYgLT5Db250ZXh0SUQsIDUpOworCisgICAgKm5JdGVtcyA9IDA7CisgICAgaWYgKCFSZWFkQ291bnRBbmRTdGluZyhzZWxmLCBpbywgbWx1LCAmU2l6ZU9mVGFnLCAibm0iKSkgZ290byBFcnJvcjsKKyAgICBpZiAoIVJlYWRDb3VudEFuZFN0aW5nKHNlbGYsIGlvLCBtbHUsICZTaXplT2ZUYWcsICIjMCIpKSBnb3RvIEVycm9yOworICAgIGlmICghUmVhZENvdW50QW5kU3Rpbmcoc2VsZiwgaW8sIG1sdSwgJlNpemVPZlRhZywgIiMxIikpIGdvdG8gRXJyb3I7CisgICAgaWYgKCFSZWFkQ291bnRBbmRTdGluZyhzZWxmLCBpbywgbWx1LCAmU2l6ZU9mVGFnLCAiIzIiKSkgZ290byBFcnJvcjsKKyAgICBpZiAoIVJlYWRDb3VudEFuZFN0aW5nKHNlbGYsIGlvLCBtbHUsICZTaXplT2ZUYWcsICIjMyIpKSBnb3RvIEVycm9yOworCisgICAgKm5JdGVtcyA9IDE7CisgICAgcmV0dXJuICh2b2lkKikgbWx1OworCitFcnJvcjoKKyAgICBjbXNNTFVmcmVlKG1sdSk7CisgICAgcmV0dXJuIE5VTEw7CisKK30KKworc3RhdGljCitjbXNCb29sICBUeXBlX0NyZEluZm9fV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCit7CisKKyAgICBjbXNNTFUqIG1sdSA9IChjbXNNTFUqKSBQdHI7CisKKyAgICBpZiAoIVdyaXRlQ291bnRBbmRTdGluZyhzZWxmLCBpbywgbWx1LCAibm0iKSkgZ290byBFcnJvcjsKKyAgICBpZiAoIVdyaXRlQ291bnRBbmRTdGluZyhzZWxmLCBpbywgbWx1LCAiIzAiKSkgZ290byBFcnJvcjsKKyAgICBpZiAoIVdyaXRlQ291bnRBbmRTdGluZyhzZWxmLCBpbywgbWx1LCAiIzEiKSkgZ290byBFcnJvcjsKKyAgICBpZiAoIVdyaXRlQ291bnRBbmRTdGluZyhzZWxmLCBpbywgbWx1LCAiIzIiKSkgZ290byBFcnJvcjsKKyAgICBpZiAoIVdyaXRlQ291bnRBbmRTdGluZyhzZWxmLCBpbywgbWx1LCAiIzMiKSkgZ290byBFcnJvcjsKKworICAgIHJldHVybiBUUlVFOworCitFcnJvcjoKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7Cit9CisKKworc3RhdGljCit2b2lkKiBUeXBlX0NyZEluZm9fRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKK3sKKyAgICByZXR1cm4gKHZvaWQqKSBjbXNNTFVkdXAoKGNtc01MVSopIFB0cik7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Cit9CisKK3N0YXRpYwordm9pZCBUeXBlX0NyZEluZm9fRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQgKlB0cikKK3sKKyAgICBjbXNNTFVmcmVlKChjbXNNTFUqKSBQdHIpOworICAgIHJldHVybjsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Cit9CisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBUeXBlIGNtc1NpZ1NjcmVlbmluZ1R5cGUKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy9UaGUgc2NyZWVuaW5nVHlwZSBkZXNjcmliZXMgdmFyaW91cyBzY3JlZW5pbmcgcGFyYW1ldGVycyBpbmNsdWRpbmcgc2NyZWVuCisvL2ZyZXF1ZW5jeSwgc2NyZWVuaW5nIGFuZ2xlLCBhbmQgc3BvdCBzaGFwZS4KKworc3RhdGljCit2b2lkICpUeXBlX1NjcmVlbmluZ19SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyKiBuSXRlbXMsIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcpCit7CisgICAgY21zU2NyZWVuaW5nKiBzYyA9IE5VTEw7CisgICAgY21zVUludDMyTnVtYmVyIGk7CisKKyAgICBzYyA9IChjbXNTY3JlZW5pbmcqKSBfY21zTWFsbG9jWmVybyhzZWxmIC0+Q29udGV4dElELCBzaXplb2YoY21zU2NyZWVuaW5nKSk7CisgICAgaWYgKHNjID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgKm5JdGVtcyA9IDA7CisKKyAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmc2MgLT5GbGFnKSkgZ290byBFcnJvcjsKKyAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmc2MgLT5uQ2hhbm5lbHMpKSBnb3RvIEVycm9yOworCisgICAgaWYgKHNjIC0+bkNoYW5uZWxzID4gY21zTUFYQ0hBTk5FTFMgLSAxKQorICAgICAgICBzYyAtPm5DaGFubmVscyA9IGNtc01BWENIQU5ORUxTIC0gMTsKKworICAgIGZvciAoaT0wOyBpIDwgc2MgLT5uQ2hhbm5lbHM7IGkrKykgeworCisgICAgICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICZzYyAtPkNoYW5uZWxzW2ldLkZyZXF1ZW5jeSkpIGdvdG8gRXJyb3I7CisgICAgICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICZzYyAtPkNoYW5uZWxzW2ldLlNjcmVlbkFuZ2xlKSkgZ290byBFcnJvcjsKKyAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJnNjIC0+Q2hhbm5lbHNbaV0uU3BvdFNoYXBlKSkgZ290byBFcnJvcjsKKyAgICB9CisKKworICAgICpuSXRlbXMgPSAxOworCisgICAgcmV0dXJuICh2b2lkKikgc2M7CisKK0Vycm9yOgorICAgIGlmIChzYyAhPSBOVUxMKQorICAgICAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBzYyk7CisKKyAgICByZXR1cm4gTlVMTDsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU2l6ZU9mVGFnKTsKK30KKworCitzdGF0aWMKK2Ntc0Jvb2wgVHlwZV9TY3JlZW5pbmdfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCit7CisgICAgY21zU2NyZWVuaW5nKiBzYyA9IChjbXNTY3JlZW5pbmcqICkgUHRyOworICAgIGNtc1VJbnQzMk51bWJlciBpOworCisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIHNjIC0+RmxhZykpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgc2MgLT5uQ2hhbm5lbHMpKSByZXR1cm4gRkFMU0U7CisKKyAgICBmb3IgKGk9MDsgaSA8IHNjIC0+bkNoYW5uZWxzOyBpKyspIHsKKworICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgc2MgLT5DaGFubmVsc1tpXS5GcmVxdWVuY3kpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBzYyAtPkNoYW5uZWxzW2ldLlNjcmVlbkFuZ2xlKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgc2MgLT5DaGFubmVsc1tpXS5TcG90U2hhcGUpKSByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKK30KKworCitzdGF0aWMKK3ZvaWQqIFR5cGVfU2NyZWVuaW5nX0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQgKlB0ciwgY21zVUludDMyTnVtYmVyIG4pCit7CisgICByZXR1cm4gX2Ntc0R1cE1lbShzZWxmIC0+Q29udGV4dElELCBQdHIsIHNpemVvZihjbXNTY3JlZW5pbmcpKTsKKworICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKK30KKworCitzdGF0aWMKK3ZvaWQgVHlwZV9TY3JlZW5pbmdfRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQqIFB0cikKK3sKKyAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFB0cik7Cit9CisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBUeXBlIGNtc1NpZ1ZpZXdpbmdDb25kaXRpb25zVHlwZQorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvL1RoaXMgdHlwZSByZXByZXNlbnRzIGEgc2V0IG9mIHZpZXdpbmcgY29uZGl0aW9uIHBhcmFtZXRlcnMgaW5jbHVkaW5nOgorLy9DSUUgJ2Fic29sdXRlJ2lsbHVtaW5hbnQgd2hpdGUgcG9pbnQgdHJpc3RpbXVsdXMgdmFsdWVzIGFuZCBDSUUgJ2Fic29sdXRlJworLy9zdXJyb3VuZCB0cmlzdGltdWx1cyB2YWx1ZXMuCisKK3N0YXRpYwordm9pZCAqVHlwZV9WaWV3aW5nQ29uZGl0aW9uc19SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyKiBuSXRlbXMsIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcpCit7CisgICAgY21zSUNDVmlld2luZ0NvbmRpdGlvbnMqIHZjID0gTlVMTDsKKworICAgIHZjID0gKGNtc0lDQ1ZpZXdpbmdDb25kaXRpb25zKikgX2Ntc01hbGxvY1plcm8oc2VsZiAtPkNvbnRleHRJRCwgc2l6ZW9mKGNtc0lDQ1ZpZXdpbmdDb25kaXRpb25zKSk7CisgICAgaWYgKHZjID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgKm5JdGVtcyA9IDA7CisKKyAgICBpZiAoIV9jbXNSZWFkWFlaTnVtYmVyKGlvLCAmdmMgLT5JbGx1bWluYW50WFlaKSkgZ290byBFcnJvcjsKKyAgICBpZiAoIV9jbXNSZWFkWFlaTnVtYmVyKGlvLCAmdmMgLT5TdXJyb3VuZFhZWikpIGdvdG8gRXJyb3I7CisgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJnZjIC0+SWxsdW1pbmFudFR5cGUpKSBnb3RvIEVycm9yOworCisgICAgKm5JdGVtcyA9IDE7CisKKyAgICByZXR1cm4gKHZvaWQqKSB2YzsKKworRXJyb3I6CisgICAgaWYgKHZjICE9IE5VTEwpCisgICAgICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIHZjKTsKKworICAgIHJldHVybiBOVUxMOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTaXplT2ZUYWcpOworfQorCisKK3N0YXRpYworY21zQm9vbCBUeXBlX1ZpZXdpbmdDb25kaXRpb25zX1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQoreworICAgIGNtc0lDQ1ZpZXdpbmdDb25kaXRpb25zKiBzYyA9IChjbXNJQ0NWaWV3aW5nQ29uZGl0aW9ucyogKSBQdHI7CisKKyAgICBpZiAoIV9jbXNXcml0ZVhZWk51bWJlcihpbywgJnNjIC0+SWxsdW1pbmFudFhZWikpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZVhZWk51bWJlcihpbywgJnNjIC0+U3Vycm91bmRYWVopKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIHNjIC0+SWxsdW1pbmFudFR5cGUpKSByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gVFJVRTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobkl0ZW1zKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOworfQorCisKK3N0YXRpYwordm9pZCogVHlwZV9WaWV3aW5nQ29uZGl0aW9uc19EdXAoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjb25zdCB2b2lkICpQdHIsIGNtc1VJbnQzMk51bWJlciBuKQoreworICAgcmV0dXJuIF9jbXNEdXBNZW0oc2VsZi0+Q29udGV4dElELCBQdHIsIHNpemVvZihjbXNJQ0NWaWV3aW5nQ29uZGl0aW9ucykpOworCisgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOworfQorCisKK3N0YXRpYwordm9pZCBUeXBlX1ZpZXdpbmdDb25kaXRpb25zX0ZyZWUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCB2b2lkKiBQdHIpCit7CisgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBQdHIpOworfQorCisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBUeXBlIGNtc1NpZ011bHRpUHJvY2Vzc0VsZW1lbnRUeXBlCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisKK3N0YXRpYwordm9pZCogR2VuZXJpY01QRWR1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQgKlB0ciwgY21zVUludDMyTnVtYmVyIG4pCit7CisgICAgcmV0dXJuICh2b2lkKikgY21zU3RhZ2VEdXAoKGNtc1N0YWdlKikgUHRyKTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobik7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKK30KKworc3RhdGljCit2b2lkIEdlbmVyaWNNUEVmcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCAqUHRyKQoreworICAgIGNtc1N0YWdlRnJlZSgoY21zU3RhZ2UqKSBQdHIpOworICAgIHJldHVybjsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Cit9CisKKy8vIEVhY2ggY3VydmUgaXMgc3RvcmVkIGluIG9uZSBvciBtb3JlIGN1cnZlIHNlZ21lbnRzLCB3aXRoIGJyZWFrLXBvaW50cyBzcGVjaWZpZWQgYmV0d2VlbiBjdXJ2ZSBzZWdtZW50cy4KKy8vIFRoZSBmaXJzdCBjdXJ2ZSBzZWdtZW50IGFsd2F5cyBzdGFydHMgYXQgLUluZmluaXR5LCBhbmQgdGhlIGxhc3QgY3VydmUgc2VnbWVudCBhbHdheXMgZW5kcyBhdCArSW5maW5pdHkuIFRoZQorLy8gZmlyc3QgYW5kIGxhc3QgY3VydmUgc2VnbWVudHMgc2hhbGwgYmUgc3BlY2lmaWVkIGluIHRlcm1zIG9mIGEgZm9ybXVsYSwgd2hlcmVhcyB0aGUgb3RoZXIgc2VnbWVudHMgc2hhbGwgYmUKKy8vIHNwZWNpZmllZCBlaXRoZXIgaW4gdGVybXMgb2YgYSBmb3JtdWxhLCBvciBieSBhIHNhbXBsZWQgY3VydmUuCisKKworLy8gUmVhZCBhbiBlbWJlZGRlZCBzZWdtZW50ZWQgY3VydmUKK3N0YXRpYworY21zVG9uZUN1cnZlKiBSZWFkU2VnbWVudGVkQ3VydmUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvKQoreworICAgIGNtc0N1cnZlU2VnU2lnbmF0dXJlIEVsZW1lbnRTaWc7CisgICAgY21zVUludDMyTnVtYmVyIGksIGo7CisgICAgY21zVUludDE2TnVtYmVyIG5TZWdtZW50czsKKyAgICBjbXNDdXJ2ZVNlZ21lbnQqICBTZWdtZW50czsKKyAgICBjbXNUb25lQ3VydmUqIEN1cnZlOworICAgIGNtc0Zsb2F0MzJOdW1iZXIgUHJldkJyZWFrID0gLTFFMjJGOyAgICAvLyAtIGluZmluaXRlCisKKyAgICAvLyBUYWtlIHNpZ25hdHVyZSBhbmQgY2hhbm5lbHMgZm9yIGVhY2ggZWxlbWVudC4KKyAgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgKGNtc1VJbnQzMk51bWJlciopICZFbGVtZW50U2lnKSkgcmV0dXJuIE5VTEw7CisKKyAgICAgLy8gVGhhdCBzaG91bGQgYmUgYSBzZWdtZW50ZWQgY3VydmUKKyAgICAgaWYgKEVsZW1lbnRTaWcgIT0gY21zU2lnU2VnbWVudGVkQ3VydmUpIHJldHVybiBOVUxMOworCisgICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sIE5VTEwpKSByZXR1cm4gTlVMTDsKKyAgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgJm5TZWdtZW50cykpIHJldHVybiBOVUxMOworICAgICBpZiAoIV9jbXNSZWFkVUludDE2TnVtYmVyKGlvLCBOVUxMKSkgcmV0dXJuIE5VTEw7CisKKyAgICAgaWYgKG5TZWdtZW50cyA8IDEpIHJldHVybiBOVUxMOworICAgICBTZWdtZW50cyA9IChjbXNDdXJ2ZVNlZ21lbnQqKSBfY21zQ2FsbG9jKHNlbGYgLT5Db250ZXh0SUQsIG5TZWdtZW50cywgc2l6ZW9mKGNtc0N1cnZlU2VnbWVudCkpOworICAgICBpZiAoU2VnbWVudHMgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICAgLy8gUmVhZCBicmVha3BvaW50cworICAgICBmb3IgKGk9MDsgaSA8IChjbXNVSW50MzJOdW1iZXIpIG5TZWdtZW50cyAtIDE7IGkrKykgeworCisgICAgICAgICBTZWdtZW50c1tpXS54MCA9IFByZXZCcmVhazsKKyAgICAgICAgIGlmICghX2Ntc1JlYWRGbG9hdDMyTnVtYmVyKGlvLCAmU2VnbWVudHNbaV0ueDEpKSBnb3RvIEVycm9yOworICAgICAgICAgUHJldkJyZWFrID0gU2VnbWVudHNbaV0ueDE7CisgICAgIH0KKworICAgICBTZWdtZW50c1tuU2VnbWVudHMtMV0ueDAgPSBQcmV2QnJlYWs7CisgICAgIFNlZ21lbnRzW25TZWdtZW50cy0xXS54MSA9IDFFMjJGOyAgICAgLy8gQSBiaWcgY21zRmxvYXQzMk51bWJlciBudW1iZXIKKworICAgICAvLyBSZWFkIHNlZ21lbnRzCisgICAgIGZvciAoaT0wOyBpIDwgblNlZ21lbnRzOyBpKyspIHsKKworICAgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sIChjbXNVSW50MzJOdW1iZXIqKSAmRWxlbWVudFNpZykpIGdvdG8gRXJyb3I7CisgICAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgTlVMTCkpIGdvdG8gRXJyb3I7CisKKyAgICAgICAgICAgc3dpdGNoIChFbGVtZW50U2lnKSB7CisKKyAgICAgICAgICAgIGNhc2UgY21zU2lnRm9ybXVsYUN1cnZlU2VnOiB7CisKKyAgICAgICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIgVHlwZTsKKyAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgUGFyYW1zQnlUeXBlW10gPSB7NCwgNSwgNSB9OworCisgICAgICAgICAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgJlR5cGUpKSBnb3RvIEVycm9yOworICAgICAgICAgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sIE5VTEwpKSBnb3RvIEVycm9yOworCisgICAgICAgICAgICAgICAgU2VnbWVudHNbaV0uVHlwZSA9IFR5cGUgKyA2OworICAgICAgICAgICAgICAgIGlmIChUeXBlID4gMikgZ290byBFcnJvcjsKKworICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgUGFyYW1zQnlUeXBlW1R5cGVdOyBqKyspIHsKKworICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIGY7CisgICAgICAgICAgICAgICAgICAgIGlmICghX2Ntc1JlYWRGbG9hdDMyTnVtYmVyKGlvLCAmZikpIGdvdG8gRXJyb3I7CisgICAgICAgICAgICAgICAgICAgIFNlZ21lbnRzW2ldLlBhcmFtc1tqXSA9IGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworCisgICAgICAgICAgICBjYXNlIGNtc1NpZ1NhbXBsZWRDdXJ2ZVNlZzogeworICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBDb3VudDsKKworICAgICAgICAgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZDb3VudCkpIGdvdG8gRXJyb3I7CisKKyAgICAgICAgICAgICAgICBTZWdtZW50c1tpXS5uR3JpZFBvaW50cyA9IENvdW50OworICAgICAgICAgICAgICAgIFNlZ21lbnRzW2ldLlNhbXBsZWRQb2ludHMgPSAoY21zRmxvYXQzMk51bWJlciopIF9jbXNDYWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgQ291bnQsIHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKSk7CisgICAgICAgICAgICAgICAgaWYgKFNlZ21lbnRzW2ldLlNhbXBsZWRQb2ludHMgPT0gTlVMTCkgZ290byBFcnJvcjsKKworICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgQ291bnQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoIV9jbXNSZWFkRmxvYXQzMk51bWJlcihpbywgJlNlZ21lbnRzW2ldLlNhbXBsZWRQb2ludHNbal0pKSBnb3RvIEVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgU3RyaW5nWzVdOworCisgICAgICAgICAgICAgICAgX2Ntc1RhZ1NpZ25hdHVyZTJTdHJpbmcoU3RyaW5nLCAoY21zVGFnU2lnbmF0dXJlKSBFbGVtZW50U2lnKTsKKyAgICAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihzZWxmLT5Db250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5rbm93biBjdXJ2ZSBlbGVtZW50IHR5cGUgJyVzJyBmb3VuZC4iLCBTdHJpbmcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIEVycm9yOworCisgICAgICAgICB9CisgICAgIH0KKworICAgICBDdXJ2ZSA9IGNtc0J1aWxkU2VnbWVudGVkVG9uZUN1cnZlKHNlbGYgLT5Db250ZXh0SUQsIG5TZWdtZW50cywgU2VnbWVudHMpOworCisgICAgIGZvciAoaT0wOyBpIDwgblNlZ21lbnRzOyBpKyspIHsKKyAgICAgICAgIGlmIChTZWdtZW50c1tpXS5TYW1wbGVkUG9pbnRzKSBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBTZWdtZW50c1tpXS5TYW1wbGVkUG9pbnRzKTsKKyAgICAgfQorICAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBTZWdtZW50cyk7CisgICAgIHJldHVybiBDdXJ2ZTsKKworRXJyb3I6CisgICAgIGlmIChTZWdtZW50cykgeworICAgICAgICAgZm9yIChpPTA7IGkgPCBuU2VnbWVudHM7IGkrKykgeworICAgICAgICAgICAgIGlmIChTZWdtZW50c1tpXS5TYW1wbGVkUG9pbnRzKSBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBTZWdtZW50c1tpXS5TYW1wbGVkUG9pbnRzKTsKKyAgICAgICAgIH0KKyAgICAgICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFNlZ21lbnRzKTsKKyAgICAgfQorICAgICByZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMKK2Ntc0Jvb2wgUmVhZE1QRUN1cnZlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgIGNtc0lPSEFORExFUiogaW8sCisgICAgICAgICAgICAgICAgICAgICB2b2lkKiBDYXJnbywKKyAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuLAorICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKK3sKKyAgICAgIGNtc1RvbmVDdXJ2ZSoqIEdhbW1hVGFibGVzID0gKCBjbXNUb25lQ3VydmUqKikgQ2FyZ287CisKKyAgICAgIEdhbW1hVGFibGVzW25dID0gUmVhZFNlZ21lbnRlZEN1cnZlKHNlbGYsIGlvKTsKKyAgICAgIHJldHVybiAoR2FtbWFUYWJsZXNbbl0gIT0gTlVMTCk7CisKKyAgICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU2l6ZU9mVGFnKTsKK30KKworc3RhdGljCit2b2lkICpUeXBlX01QRWN1cnZlX1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG5JdGVtcywgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKK3sKKyAgICBjbXNTdGFnZSogbXBlID0gTlVMTDsKKyAgICBjbXNVSW50MTZOdW1iZXIgSW5wdXRDaGFucywgT3V0cHV0Q2hhbnM7CisgICAgY21zVUludDMyTnVtYmVyIGksIEJhc2VPZmZzZXQ7CisgICAgY21zVG9uZUN1cnZlKiogR2FtbWFUYWJsZXM7CisKKyAgICAqbkl0ZW1zID0gMDsKKworICAgIC8vIEdldCBhY3R1YWwgcG9zaXRpb24gYXMgYSBiYXNpcyBmb3IgZWxlbWVudCBvZmZzZXRzCisgICAgQmFzZU9mZnNldCA9IGlvIC0+VGVsbChpbykgLSBzaXplb2YoX2Ntc1RhZ0Jhc2UpOworCisgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgJklucHV0Q2hhbnMpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIV9jbXNSZWFkVUludDE2TnVtYmVyKGlvLCAmT3V0cHV0Q2hhbnMpKSByZXR1cm4gTlVMTDsKKworICAgIGlmIChJbnB1dENoYW5zICE9IE91dHB1dENoYW5zKSByZXR1cm4gTlVMTDsKKworICAgIEdhbW1hVGFibGVzID0gKGNtc1RvbmVDdXJ2ZSoqKSBfY21zQ2FsbG9jKHNlbGYgLT5Db250ZXh0SUQsIElucHV0Q2hhbnMsIHNpemVvZihjbXNUb25lQ3VydmUqKSk7CisgICAgaWYgKEdhbW1hVGFibGVzID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgaWYgKFJlYWRQb3NpdGlvblRhYmxlKHNlbGYsIGlvLCBJbnB1dENoYW5zLCBCYXNlT2Zmc2V0LCBHYW1tYVRhYmxlcywgUmVhZE1QRUN1cnZlKSkgeworCisgICAgICAgIG1wZSA9IGNtc1N0YWdlQWxsb2NUb25lQ3VydmVzKHNlbGYgLT5Db250ZXh0SUQsIElucHV0Q2hhbnMsIEdhbW1hVGFibGVzKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG1wZSA9IE5VTEw7CisgICAgfQorCisgICAgZm9yIChpPTA7IGkgPCBJbnB1dENoYW5zOyBpKyspIHsKKyAgICAgICAgaWYgKEdhbW1hVGFibGVzW2ldKSBjbXNGcmVlVG9uZUN1cnZlKEdhbW1hVGFibGVzW2ldKTsKKyAgICB9CisKKyAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBHYW1tYVRhYmxlcyk7CisgICAgKm5JdGVtcyA9IChtcGUgIT0gTlVMTCkgPyAxIDogMDsKKyAgICByZXR1cm4gbXBlOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTaXplT2ZUYWcpOworfQorCisKKy8vIFdyaXRlIGEgc2luZ2xlIHNlZ21lbnRlZCBjdXJ2ZS4gTk8gQ0hFQ0sgSVMgUEVSRk9STUVEIE9OIFZBTElESVRZCitzdGF0aWMKK2Ntc0Jvb2wgV3JpdGVTZWdtZW50ZWRDdXJ2ZShjbXNJT0hBTkRMRVIqIGlvLCBjbXNUb25lQ3VydmUqIGcpCit7CisgICAgY21zVUludDMyTnVtYmVyIGksIGo7CisgICAgY21zQ3VydmVTZWdtZW50KiBTZWdtZW50cyA9IGcgLT5TZWdtZW50czsKKyAgICBjbXNVSW50MzJOdW1iZXIgblNlZ21lbnRzID0gZyAtPm5TZWdtZW50czsKKworICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBjbXNTaWdTZWdtZW50ZWRDdXJ2ZSkpIGdvdG8gRXJyb3I7CisgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIDApKSBnb3RvIEVycm9yOworICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCAoY21zVUludDE2TnVtYmVyKSBuU2VnbWVudHMpKSBnb3RvIEVycm9yOworICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCAwKSkgZ290byBFcnJvcjsKKworICAgIC8vIFdyaXRlIHRoZSBicmVhay1wb2ludHMKKyAgICBmb3IgKGk9MDsgaSA8IG5TZWdtZW50cyAtIDE7IGkrKykgeworICAgICAgICBpZiAoIV9jbXNXcml0ZUZsb2F0MzJOdW1iZXIoaW8sIFNlZ21lbnRzW2ldLngxKSkgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICAvLyBXcml0ZSB0aGUgc2VnbWVudHMKKyAgICBmb3IgKGk9MDsgaSA8IGcgLT5uU2VnbWVudHM7IGkrKykgeworCisgICAgICAgIGNtc0N1cnZlU2VnbWVudCogQWN0dWFsU2VnID0gU2VnbWVudHMgKyBpOworCisgICAgICAgIGlmIChBY3R1YWxTZWcgLT4gVHlwZSA9PSAwKSB7CisKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzYW1wbGVkIGN1cnZlCisgICAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgKGNtc1VJbnQzMk51bWJlcikgY21zU2lnU2FtcGxlZEN1cnZlU2VnKSkgZ290byBFcnJvcjsKKyAgICAgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCAwKSkgZ290byBFcnJvcjsKKyAgICAgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBBY3R1YWxTZWcgLT4gbkdyaWRQb2ludHMpKSBnb3RvIEVycm9yOworCisgICAgICAgICAgICBmb3IgKGo9MDsgaiA8IGcgLT5TZWdtZW50c1tpXS5uR3JpZFBvaW50czsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFfY21zV3JpdGVGbG9hdDMyTnVtYmVyKGlvLCBBY3R1YWxTZWcgLT4gU2FtcGxlZFBvaW50c1tqXSkpIGdvdG8gRXJyb3I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGludCBUeXBlOworICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFBhcmFtc0J5VHlwZVtdID0geyA0LCA1LCA1IH07CisKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBmb3JtdWxhLWJhc2VkCisgICAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgKGNtc1VJbnQzMk51bWJlcikgY21zU2lnRm9ybXVsYUN1cnZlU2VnKSkgZ290byBFcnJvcjsKKyAgICAgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCAwKSkgZ290byBFcnJvcjsKKworICAgICAgICAgICAgLy8gV2Ugb25seSBhbGxvdyAxLCAyIGFuZCAzIGFzIHR5cGVzCisgICAgICAgICAgICBUeXBlID0gQWN0dWFsU2VnIC0+VHlwZSAtIDY7CisgICAgICAgICAgICBpZiAoVHlwZSA+IDIgfHwgVHlwZSA8IDApIGdvdG8gRXJyb3I7CisKKyAgICAgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCAoY21zVUludDE2TnVtYmVyKSBUeXBlKSkgZ290byBFcnJvcjsKKyAgICAgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCAwKSkgZ290byBFcnJvcjsKKworICAgICAgICAgICAgZm9yIChqPTA7IGogPCBQYXJhbXNCeVR5cGVbVHlwZV07IGorKykgeworICAgICAgICAgICAgICAgIGlmICghX2Ntc1dyaXRlRmxvYXQzMk51bWJlcihpbywgKGNtc0Zsb2F0MzJOdW1iZXIpIEFjdHVhbFNlZyAtPlBhcmFtc1tqXSkpIGdvdG8gRXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJdCBzZWVtcyB0aGVyZSBpcyBubyBuZWVkIHRvIGFsaWduLiBDb2RlIGlzIGhlcmUsIGFuZCBmb3Igc2FmZXR5IGNvbW1lbnRlZCBvdXQKKyAgICAgICAgLy8gaWYgKCFfY21zV3JpdGVBbGlnbm1lbnQoaW8pKSBnb3RvIEVycm9yOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworCitFcnJvcjoKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKworc3RhdGljCitjbXNCb29sIFdyaXRlTVBFQ3VydmUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLAorICAgICAgICAgICAgICAgICAgICAgIGNtc0lPSEFORExFUiogaW8sCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCogQ2FyZ28sCisgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG4sCisgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKK3sKKyAgICBfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSogQ3VydmVzICA9IChfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSopIENhcmdvOworCisgICAgcmV0dXJuIFdyaXRlU2VnbWVudGVkQ3VydmUoaW8sIEN1cnZlcyAtPlRoZUN1cnZlc1tuXSk7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFNpemVPZlRhZyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKK30KKworLy8gV3JpdGUgYSBjdXJ2ZSwgY2hlY2tpbmcgZmlyc3QgZm9yIHZhbGlkaXR5CitzdGF0aWMKK2Ntc0Jvb2wgIFR5cGVfTVBFY3VydmVfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCit7CisgICAgY21zVUludDMyTnVtYmVyIEJhc2VPZmZzZXQ7CisgICAgY21zU3RhZ2UqIG1wZSA9IChjbXNTdGFnZSopIFB0cjsKKyAgICBfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSogQ3VydmVzID0gKF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKikgbXBlIC0+RGF0YTsKKworICAgIEJhc2VPZmZzZXQgPSBpbyAtPlRlbGwoaW8pIC0gc2l6ZW9mKF9jbXNUYWdCYXNlKTsKKworICAgIC8vIFdyaXRlIHRoZSBoZWFkZXIuIFNpbmNlIHRob3NlIGFyZSBjdXJ2ZXMsIGlucHV0IGFuZCBvdXRwdXQgY2hhbm5lbHMgYXJlIHNhbWUKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgKGNtc1VJbnQxNk51bWJlcikgbXBlIC0+SW5wdXRDaGFubmVscykpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgKGNtc1VJbnQxNk51bWJlcikgbXBlIC0+SW5wdXRDaGFubmVscykpIHJldHVybiBGQUxTRTsKKworICAgIGlmICghV3JpdGVQb3NpdGlvblRhYmxlKHNlbGYsIGlvLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGUgLT5JbnB1dENoYW5uZWxzLCBCYXNlT2Zmc2V0LCBDdXJ2ZXMsIFdyaXRlTVBFQ3VydmUpKSByZXR1cm4gRkFMU0U7CisKKworICAgIHJldHVybiBUUlVFOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihuSXRlbXMpOworfQorCisKKworLy8gVGhlIG1hdHJpeCBpcyBvcmdhbml6ZWQgYXMgYW4gYXJyYXkgb2YgUHhRK1EgZWxlbWVudHMsIHdoZXJlIFAgaXMgdGhlIG51bWJlciBvZiBpbnB1dCBjaGFubmVscyB0byB0aGUKKy8vIG1hdHJpeCwgYW5kIFEgaXMgdGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMuIFRoZSBtYXRyaXggZWxlbWVudHMgYXJlIGVhY2ggZmxvYXQzMk51bWJlcnMuIFRoZSBhcnJheQorLy8gaXMgb3JnYW5pemVkIGFzIGZvbGxvd3M6CisvLyBhcnJheSA9IFtlMTEsIGUxMiwgLi4uLCBlMVAsIGUyMSwgZTIyLCAuLi4sIGUyUCwgLi4uLCBlUTEsIGVRMiwgLi4uLCBlUVAsIGUxLCBlMiwgLi4uLCBlUV0KKworc3RhdGljCit2b2lkICpUeXBlX01QRW1hdHJpeF9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyKiBuSXRlbXMsIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcpCit7CisgICAgY21zU3RhZ2UqIG1wZTsKKyAgICBjbXNVSW50MTZOdW1iZXIgICBJbnB1dENoYW5zLCBPdXRwdXRDaGFuczsKKyAgICBjbXNVSW50MzJOdW1iZXIgICBuRWxlbXMsIGk7CisgICAgY21zRmxvYXQ2NE51bWJlciogTWF0cml4OworICAgIGNtc0Zsb2F0NjROdW1iZXIqIE9mZnNldHM7CisKKyAgICBpZiAoIV9jbXNSZWFkVUludDE2TnVtYmVyKGlvLCAmSW5wdXRDaGFucykpIHJldHVybiBOVUxMOworICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sICZPdXRwdXRDaGFucykpIHJldHVybiBOVUxMOworCisKKyAgICAvLyBJbnB1dCBhbmQgb3V0cHV0IGNoYW5zIG1heSBiZSBBTlkgKHVwIHRvIDB4ZmZmZiksIAorICAgIC8vIGJ1dCB3ZSBjaG9vc2UgdG8gbGltaXQgdG8gMTYgY2hhbm5lbHMgZm9yIG5vdworICAgIGlmIChJbnB1dENoYW5zID49IGNtc01BWENIQU5ORUxTKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoT3V0cHV0Q2hhbnMgPj0gY21zTUFYQ0hBTk5FTFMpIHJldHVybiBOVUxMOworCisgICAgbkVsZW1zID0gSW5wdXRDaGFucyAqIE91dHB1dENoYW5zOworCisgICAgTWF0cml4ID0gKGNtc0Zsb2F0NjROdW1iZXIqKSBfY21zQ2FsbG9jKHNlbGYgLT5Db250ZXh0SUQsIG5FbGVtcywgc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpKTsKKyAgICBpZiAoTWF0cml4ID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgT2Zmc2V0cyA9IChjbXNGbG9hdDY0TnVtYmVyKikgX2Ntc0NhbGxvYyhzZWxmIC0+Q29udGV4dElELCBPdXRwdXRDaGFucywgc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpKTsKKyAgICBpZiAoT2Zmc2V0cyA9PSBOVUxMKSB7CisKKyAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgTWF0cml4KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yIChpPTA7IGkgPCBuRWxlbXM7IGkrKykgeworCisgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgdjsKKworICAgICAgICBpZiAoIV9jbXNSZWFkRmxvYXQzMk51bWJlcihpbywgJnYpKSB7CisgICAgICAgICAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBNYXRyaXgpOworICAgICAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgT2Zmc2V0cyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBNYXRyaXhbaV0gPSB2OworICAgIH0KKworCisgICAgZm9yIChpPTA7IGkgPCBPdXRwdXRDaGFuczsgaSsrKSB7CisKKyAgICAgICAgY21zRmxvYXQzMk51bWJlciB2OworCisgICAgICAgIGlmICghX2Ntc1JlYWRGbG9hdDMyTnVtYmVyKGlvLCAmdikpIHsKKyAgICAgICAgICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIE1hdHJpeCk7CisgICAgICAgICAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBPZmZzZXRzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIE9mZnNldHNbaV0gPSB2OworICAgIH0KKworCisgICAgbXBlID0gY21zU3RhZ2VBbGxvY01hdHJpeChzZWxmIC0+Q29udGV4dElELCBPdXRwdXRDaGFucywgSW5wdXRDaGFucywgTWF0cml4LCBPZmZzZXRzKTsKKyAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBNYXRyaXgpOworICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIE9mZnNldHMpOworCisgICAgKm5JdGVtcyA9IDE7CisKKyAgICByZXR1cm4gbXBlOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTaXplT2ZUYWcpOworfQorCitzdGF0aWMKK2Ntc0Jvb2wgIFR5cGVfTVBFbWF0cml4X1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQoreworICAgIGNtc1VJbnQzMk51bWJlciBpLCBuRWxlbXM7CisgICAgY21zU3RhZ2UqIG1wZSA9IChjbXNTdGFnZSopIFB0cjsKKyAgICBfY21zU3RhZ2VNYXRyaXhEYXRhKiBNYXRyaXggPSAoX2Ntc1N0YWdlTWF0cml4RGF0YSopIG1wZSAtPkRhdGE7CisKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgKGNtc1VJbnQxNk51bWJlcikgbXBlIC0+SW5wdXRDaGFubmVscykpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgKGNtc1VJbnQxNk51bWJlcikgbXBlIC0+T3V0cHV0Q2hhbm5lbHMpKSByZXR1cm4gRkFMU0U7CisKKyAgICBuRWxlbXMgPSBtcGUgLT5JbnB1dENoYW5uZWxzICogbXBlIC0+T3V0cHV0Q2hhbm5lbHM7CisKKyAgICBmb3IgKGk9MDsgaSA8IG5FbGVtczsgaSsrKSB7CisgICAgICAgIGlmICghX2Ntc1dyaXRlRmxvYXQzMk51bWJlcihpbywgKGNtc0Zsb2F0MzJOdW1iZXIpIE1hdHJpeC0+RG91YmxlW2ldKSkgcmV0dXJuIEZBTFNFOworICAgIH0KKworCisgICAgZm9yIChpPTA7IGkgPCBtcGUgLT5PdXRwdXRDaGFubmVsczsgaSsrKSB7CisKKyAgICAgICAgaWYgKE1hdHJpeCAtPk9mZnNldCA9PSBOVUxMKSB7CisKKyAgICAgICAgICAgICAgIGlmICghX2Ntc1dyaXRlRmxvYXQzMk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgIGlmICghX2Ntc1dyaXRlRmxvYXQzMk51bWJlcihpbywgKGNtc0Zsb2F0MzJOdW1iZXIpIE1hdHJpeC0+T2Zmc2V0W2ldKSkgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKK30KKworCisKK3N0YXRpYwordm9pZCAqVHlwZV9NUEVjbHV0X1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG5JdGVtcywgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKK3sKKyAgICBjbXNTdGFnZSogbXBlID0gTlVMTDsKKyAgICBjbXNVSW50MTZOdW1iZXIgSW5wdXRDaGFucywgT3V0cHV0Q2hhbnM7CisgICAgY21zVUludDhOdW1iZXIgRGltZW5zaW9uczhbMTZdOworICAgIGNtc1VJbnQzMk51bWJlciBpLCBuTWF4R3JpZHMsIEdyaWRQb2ludHNbTUFYX0lOUFVUX0RJTUVOU0lPTlNdOworICAgIF9jbXNTdGFnZUNMdXREYXRhKiBjbHV0OworCisgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgJklucHV0Q2hhbnMpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIV9jbXNSZWFkVUludDE2TnVtYmVyKGlvLCAmT3V0cHV0Q2hhbnMpKSByZXR1cm4gTlVMTDsKKworICAgIGlmIChJbnB1dENoYW5zID09IDApIGdvdG8gRXJyb3I7CisgICAgaWYgKE91dHB1dENoYW5zID09IDApIGdvdG8gRXJyb3I7CisKKyAgICBpZiAoaW8gLT5SZWFkKGlvLCBEaW1lbnNpb25zOCwgc2l6ZW9mKGNtc1VJbnQ4TnVtYmVyKSwgMTYpICE9IDE2KQorICAgICAgICBnb3RvIEVycm9yOworCisgICAgLy8gQ29weSBNQVhfSU5QVVRfRElNRU5TSU9OUyBhdCBtb3N0LiBFeHBhbmQgdG8gY21zVUludDMyTnVtYmVyCisgICAgbk1heEdyaWRzID0gSW5wdXRDaGFucyA+IE1BWF9JTlBVVF9ESU1FTlNJT05TID8gTUFYX0lOUFVUX0RJTUVOU0lPTlMgOiBJbnB1dENoYW5zOworCisgICAgZm9yIChpID0gMDsgaSA8IG5NYXhHcmlkczsgaSsrKSB7CisgICAgICAgIGlmIChEaW1lbnNpb25zOFtpXSA9PSAxKSBnb3RvIEVycm9yOyAvLyBJbXBvc3NpYmxlIHZhbHVlLCAwIGZvciBubyBDTFVUIGFuZCB0aGVuIDIgYXQgbGVhc3QKKyAgICAgICAgR3JpZFBvaW50c1tpXSA9IChjbXNVSW50MzJOdW1iZXIpRGltZW5zaW9uczhbaV07CisgICAgfQorCisgICAgLy8gQWxsb2NhdGUgdGhlIHRydWUgQ0xVVAorICAgIG1wZSA9IGNtc1N0YWdlQWxsb2NDTHV0RmxvYXRHcmFudWxhcihzZWxmIC0+Q29udGV4dElELCBHcmlkUG9pbnRzLCBJbnB1dENoYW5zLCBPdXRwdXRDaGFucywgTlVMTCk7CisgICAgaWYgKG1wZSA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgLy8gUmVhZCB0aGUgZGF0YQorICAgIGNsdXQgPSAoX2Ntc1N0YWdlQ0x1dERhdGEqKSBtcGUgLT5EYXRhOworICAgIGZvciAoaT0wOyBpIDwgY2x1dCAtPm5FbnRyaWVzOyBpKyspIHsKKworICAgICAgICBpZiAoIV9jbXNSZWFkRmxvYXQzMk51bWJlcihpbywgJmNsdXQgLT5UYWIuVEZsb2F0W2ldKSkgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICAqbkl0ZW1zID0gMTsKKyAgICByZXR1cm4gbXBlOworCitFcnJvcjoKKyAgICAqbkl0ZW1zID0gMDsKKyAgICBpZiAobXBlICE9IE5VTEwpIGNtc1N0YWdlRnJlZShtcGUpOworICAgIHJldHVybiBOVUxMOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTaXplT2ZUYWcpOworfQorCisvLyBXcml0ZSBhIENMVVQgaW4gZmxvYXRpbmcgcG9pbnQKK3N0YXRpYworY21zQm9vbCAgVHlwZV9NUEVjbHV0X1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQoreworICAgIGNtc1VJbnQ4TnVtYmVyIERpbWVuc2lvbnM4WzE2XTsgIC8vIDE2IGJlY2F1c2UgdGhlIHNwZWMgc2F5cyAxNiBhbmQgbm90IG1heCBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICBjbXNVSW50MzJOdW1iZXIgaTsKKyAgICBjbXNTdGFnZSogbXBlID0gKGNtc1N0YWdlKikgUHRyOworICAgIF9jbXNTdGFnZUNMdXREYXRhKiBjbHV0ID0gKF9jbXNTdGFnZUNMdXREYXRhKikgbXBlIC0+RGF0YTsKKworICAgIC8vIENoZWNrIGZvciBtYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyBzdXBwb3J0ZWQgYnkgbGNtcworICAgIGlmIChtcGUgLT4gSW5wdXRDaGFubmVscyA+IE1BWF9JTlBVVF9ESU1FTlNJT05TKSByZXR1cm4gRkFMU0U7CisKKyAgICAvLyBPbmx5IGZsb2F0cyBhcmUgc3VwcG9ydGVkIGluIE1QRQorICAgIGlmIChjbHV0IC0+SGFzRmxvYXRWYWx1ZXMgPT0gRkFMU0UpIHJldHVybiBGQUxTRTsKKworICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCAoY21zVUludDE2TnVtYmVyKSBtcGUgLT5JbnB1dENoYW5uZWxzKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCAoY21zVUludDE2TnVtYmVyKSBtcGUgLT5PdXRwdXRDaGFubmVscykpIHJldHVybiBGQUxTRTsKKworICAgIG1lbXNldChEaW1lbnNpb25zOCwgMCwgc2l6ZW9mKERpbWVuc2lvbnM4KSk7CisKKyAgICBmb3IgKGk9MDsgaSA8IG1wZSAtPklucHV0Q2hhbm5lbHM7IGkrKykKKyAgICAgICAgRGltZW5zaW9uczhbaV0gPSAoY21zVUludDhOdW1iZXIpIGNsdXQgLT5QYXJhbXMgLT5uU2FtcGxlc1tpXTsKKworICAgIGlmICghaW8gLT5Xcml0ZShpbywgMTYsIERpbWVuc2lvbnM4KSkgcmV0dXJuIEZBTFNFOworCisgICAgZm9yIChpPTA7IGkgPCBjbHV0IC0+bkVudHJpZXM7IGkrKykgeworCisgICAgICAgIGlmICghX2Ntc1dyaXRlRmxvYXQzMk51bWJlcihpbywgY2x1dCAtPlRhYi5URmxvYXRbaV0pKSByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKK30KKworCisKKy8vIFRoaXMgaXMgdGhlIGxpc3Qgb2YgYnVpbHQtaW4gTVBFIHR5cGVzCitzdGF0aWMgX2Ntc1RhZ1R5cGVMaW5rZWRMaXN0IFN1cHBvcnRlZE1QRXR5cGVzW10gPSB7CisKK3t7IChjbXNUYWdUeXBlU2lnbmF0dXJlKSBjbXNTaWdCQWNzRWxlbVR5cGUsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgJlN1cHBvcnRlZE1QRXR5cGVzWzFdIH0sICAgLy8gSWdub3JlIHRob3NlIGVsZW1lbnRzIGZvciBub3cKK3t7IChjbXNUYWdUeXBlU2lnbmF0dXJlKSBjbXNTaWdFQWNzRWxlbVR5cGUsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIDAgfSwgJlN1cHBvcnRlZE1QRXR5cGVzWzJdIH0sICAgLy8gKFRoYXQncyB3aGF0IHRoZSBzcGVjIHNheXMpCisKK3tUWVBFX01QRV9IQU5ETEVSKChjbXNUYWdUeXBlU2lnbmF0dXJlKSBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLCAgICAgTVBFY3VydmUpLCAgICAgICZTdXBwb3J0ZWRNUEV0eXBlc1szXSB9LAore1RZUEVfTVBFX0hBTkRMRVIoKGNtc1RhZ1R5cGVTaWduYXR1cmUpIGNtc1NpZ01hdHJpeEVsZW1UeXBlLCAgICAgICBNUEVtYXRyaXgpLCAgICAgJlN1cHBvcnRlZE1QRXR5cGVzWzRdIH0sCit7VFlQRV9NUEVfSEFORExFUigoY21zVGFnVHlwZVNpZ25hdHVyZSkgY21zU2lnQ0x1dEVsZW1UeXBlLCAgICAgICAgIE1QRWNsdXQpLCAgICAgICAgTlVMTCB9LAorfTsKKworX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUgX2Ntc01QRVR5cGVQbHVnaW5DaHVuayA9IHsgTlVMTCB9OworCitzdGF0aWMKK2Ntc0Jvb2wgUmVhZE1QRUVsZW0oc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLAorICAgICAgICAgICAgICAgICAgICBjbXNJT0hBTkRMRVIqIGlvLAorICAgICAgICAgICAgICAgICAgICB2b2lkKiBDYXJnbywKKyAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG4sCisgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcpCit7CisgICAgY21zU3RhZ2VTaWduYXR1cmUgRWxlbWVudFNpZzsKKyAgICBjbXNUYWdUeXBlSGFuZGxlciogVHlwZUhhbmRsZXI7CisgICAgY21zVUludDMyTnVtYmVyIG5JdGVtczsKKyAgICBjbXNQaXBlbGluZSAqTmV3TFVUID0gKGNtc1BpcGVsaW5lICopIENhcmdvOworICAgIF9jbXNUYWdUeXBlUGx1Z2luQ2h1bmtUeXBlKiBNUEVUeXBlUGx1Z2luQ2h1bmsgID0gKCBfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoc2VsZi0+Q29udGV4dElELCBNUEVQbHVnaW4pOworCisKKyAgICAvLyBUYWtlIHNpZ25hdHVyZSBhbmQgY2hhbm5lbHMgZm9yIGVhY2ggZWxlbWVudC4KKyAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAoY21zVUludDMyTnVtYmVyKikgJkVsZW1lbnRTaWcpKSByZXR1cm4gRkFMU0U7CisKKyAgICAvLyBUaGUgcmVzZXJ2ZWQgcGxhY2Vob2xkZXIKKyAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCBOVUxMKSkgcmV0dXJuIEZBTFNFOworCisgICAgLy8gUmVhZCBkaXZlcnNlIE1QRSB0eXBlcworICAgIFR5cGVIYW5kbGVyID0gR2V0SGFuZGxlcigoY21zVGFnVHlwZVNpZ25hdHVyZSkgRWxlbWVudFNpZywgTVBFVHlwZVBsdWdpbkNodW5rIC0+VGFnVHlwZXMsIFN1cHBvcnRlZE1QRXR5cGVzKTsKKyAgICBpZiAoVHlwZUhhbmRsZXIgPT0gTlVMTCkgIHsKKworICAgICAgICBjaGFyIFN0cmluZ1s1XTsKKworICAgICAgICBfY21zVGFnU2lnbmF0dXJlMlN0cmluZyhTdHJpbmcsIChjbXNUYWdTaWduYXR1cmUpIEVsZW1lbnRTaWcpOworCisgICAgICAgIC8vIEFuIHVua25vd24gZWxlbWVudCB3YXMgZm91bmQuCisgICAgICAgIGNtc1NpZ25hbEVycm9yKHNlbGYgLT5Db250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5rbm93biBNUEUgdHlwZSAnJXMnIGZvdW5kLiIsIFN0cmluZyk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvLyBJZiBubyByZWFkIG1ldGhvZCwganVzdCBpZ25vcmUgdGhlIGVsZW1lbnQgKHZhbGlkIGZvciBjbXNTaWdCQWNzRWxlbVR5cGUgYW5kIGNtc1NpZ0VBY3NFbGVtVHlwZSkKKyAgICAvLyBSZWFkIHRoZSBNUEUuIE5vIHNpemUgaXMgZ2l2ZW4KKyAgICBpZiAoVHlwZUhhbmRsZXIgLT5SZWFkUHRyICE9IE5VTEwpIHsKKworICAgICAgICAvLyBUaGlzIGlzIGEgcmVhbCBlbGVtZW50IHdoaWNoIHNob3VsZCBiZSByZWFkIGFuZCBwcm9jZXNzZWQKKyAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKE5ld0xVVCwgY21zQVRfRU5ELCAoY21zU3RhZ2UqKSBUeXBlSGFuZGxlciAtPlJlYWRQdHIoc2VsZiwgaW8sICZuSXRlbXMsIFNpemVPZlRhZykpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTaXplT2ZUYWcpOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobik7Cit9CisKKworLy8gVGhpcyBpcyB0aGUgbWFpbiBkaXNwYXRjaGVyIGZvciBNUEUKK3N0YXRpYwordm9pZCAqVHlwZV9NUEVfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQoreworICAgIGNtc1VJbnQxNk51bWJlciBJbnB1dENoYW5zLCBPdXRwdXRDaGFuczsKKyAgICBjbXNVSW50MzJOdW1iZXIgRWxlbWVudENvdW50OworICAgIGNtc1BpcGVsaW5lICpOZXdMVVQgPSBOVUxMOworICAgIGNtc1VJbnQzMk51bWJlciBCYXNlT2Zmc2V0OworCisgICAgLy8gR2V0IGFjdHVhbCBwb3NpdGlvbiBhcyBhIGJhc2lzIGZvciBlbGVtZW50IG9mZnNldHMKKyAgICBCYXNlT2Zmc2V0ID0gaW8gLT5UZWxsKGlvKSAtIHNpemVvZihfY21zVGFnQmFzZSk7CisKKyAgICAvLyBSZWFkIGNoYW5uZWxzIGFuZCBlbGVtZW50IGNvdW50CisgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgJklucHV0Q2hhbnMpKSByZXR1cm4gTlVMTDsKKyAgICBpZiAoIV9jbXNSZWFkVUludDE2TnVtYmVyKGlvLCAmT3V0cHV0Q2hhbnMpKSByZXR1cm4gTlVMTDsKKworICAgIGlmIChJbnB1dENoYW5zID09IDAgfHwgSW5wdXRDaGFucyA+PSBjbXNNQVhDSEFOTkVMUykgcmV0dXJuIE5VTEw7CisgICAgaWYgKE91dHB1dENoYW5zID09IDAgfHwgT3V0cHV0Q2hhbnMgPj0gY21zTUFYQ0hBTk5FTFMpIHJldHVybiBOVUxMOworCisgICAgLy8gQWxsb2NhdGVzIGFuIGVtcHR5IExVVAorICAgIE5ld0xVVCA9IGNtc1BpcGVsaW5lQWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgSW5wdXRDaGFucywgT3V0cHV0Q2hhbnMpOworICAgIGlmIChOZXdMVVQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmRWxlbWVudENvdW50KSkgZ290byBFcnJvcjsKKyAgICBpZiAoIVJlYWRQb3NpdGlvblRhYmxlKHNlbGYsIGlvLCBFbGVtZW50Q291bnQsIEJhc2VPZmZzZXQsIE5ld0xVVCwgUmVhZE1QRUVsZW0pKSBnb3RvIEVycm9yOworCisgICAgLy8gU3VjY2VzcworICAgICpuSXRlbXMgPSAxOworICAgIHJldHVybiBOZXdMVVQ7CisKKyAgICAvLyBFcnJvcgorRXJyb3I6CisgICAgaWYgKE5ld0xVVCAhPSBOVUxMKSBjbXNQaXBlbGluZUZyZWUoTmV3TFVUKTsKKyAgICAqbkl0ZW1zID0gMDsKKyAgICByZXR1cm4gTlVMTDsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU2l6ZU9mVGFnKTsKK30KKworCisKKy8vIFRoaXMgb25lIGlzIGEgbGlpdGxlIGJpdCBtb3JlIGNvbXBsZXgsIHNvIHdlIGRvbid0IHVzZSBwb3NpdGlvbiB0YWJsZXMgdGhpcyB0aW1lLgorc3RhdGljCitjbXNCb29sIFR5cGVfTVBFX1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQoreworICAgIGNtc1VJbnQzMk51bWJlciBpLCBCYXNlT2Zmc2V0LCBEaXJlY3RvcnlQb3MsIEN1cnJlbnRQb3M7CisgICAgaW50IGlucHV0Q2hhbiwgb3V0cHV0Q2hhbjsKKyAgICBjbXNVSW50MzJOdW1iZXIgRWxlbUNvdW50OworICAgIGNtc1VJbnQzMk51bWJlciAqRWxlbWVudE9mZnNldHMgPSBOVUxMLCAqRWxlbWVudFNpemVzID0gTlVMTCwgQmVmb3JlOworICAgIGNtc1N0YWdlU2lnbmF0dXJlIEVsZW1lbnRTaWc7CisgICAgY21zUGlwZWxpbmUqIEx1dCA9IChjbXNQaXBlbGluZSopIFB0cjsKKyAgICBjbXNTdGFnZSogRWxlbSA9IEx1dCAtPkVsZW1lbnRzOworICAgIGNtc1RhZ1R5cGVIYW5kbGVyKiBUeXBlSGFuZGxlcjsKKyAgICBfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSogTVBFVHlwZVBsdWdpbkNodW5rICA9ICggX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKHNlbGYtPkNvbnRleHRJRCwgTVBFUGx1Z2luKTsKKworICAgIEJhc2VPZmZzZXQgPSBpbyAtPlRlbGwoaW8pIC0gc2l6ZW9mKF9jbXNUYWdCYXNlKTsKKworICAgIGlucHV0Q2hhbiAgPSBjbXNQaXBlbGluZUlucHV0Q2hhbm5lbHMoTHV0KTsKKyAgICBvdXRwdXRDaGFuID0gY21zUGlwZWxpbmVPdXRwdXRDaGFubmVscyhMdXQpOworICAgIEVsZW1Db3VudCAgPSBjbXNQaXBlbGluZVN0YWdlQ291bnQoTHV0KTsKKworICAgIEVsZW1lbnRPZmZzZXRzID0gKGNtc1VJbnQzMk51bWJlciAqKSBfY21zQ2FsbG9jKHNlbGYgLT5Db250ZXh0SUQsIEVsZW1Db3VudCwgc2l6ZW9mKGNtc1VJbnQzMk51bWJlcikpOworICAgIGlmIChFbGVtZW50T2Zmc2V0cyA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgRWxlbWVudFNpemVzID0gKGNtc1VJbnQzMk51bWJlciAqKSBfY21zQ2FsbG9jKHNlbGYgLT5Db250ZXh0SUQsIEVsZW1Db3VudCwgc2l6ZW9mKGNtc1VJbnQzMk51bWJlcikpOworICAgIGlmIChFbGVtZW50U2l6ZXMgPT0gTlVMTCkgZ290byBFcnJvcjsKKworICAgIC8vIFdyaXRlIHRoZSBoZWFkCisgICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIChjbXNVSW50MTZOdW1iZXIpIGlucHV0Q2hhbikpIGdvdG8gRXJyb3I7CisgICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIChjbXNVSW50MTZOdW1iZXIpIG91dHB1dENoYW4pKSBnb3RvIEVycm9yOworICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCAoY21zVUludDE2TnVtYmVyKSBFbGVtQ291bnQpKSBnb3RvIEVycm9yOworCisgICAgRGlyZWN0b3J5UG9zID0gaW8gLT5UZWxsKGlvKTsKKworICAgIC8vIFdyaXRlIGEgZmFrZSBkaXJlY3RvcnkgdG8gYmUgZmlsbGVkIGxhdHRlciBvbgorICAgIGZvciAoaT0wOyBpIDwgRWxlbUNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIDApKSBnb3RvIEVycm9yOyAgLy8gT2Zmc2V0CisgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCAwKSkgZ290byBFcnJvcjsgIC8vIHNpemUKKyAgICB9CisKKyAgICAvLyBXcml0ZSBlYWNoIHNpbmdsZSB0YWcuIEtlZXAgdHJhY2sgb2YgdGhlIHNpemUgYXMgd2VsbC4KKyAgICBmb3IgKGk9MDsgaSA8IEVsZW1Db3VudDsgaSsrKSB7CisKKyAgICAgICAgRWxlbWVudE9mZnNldHNbaV0gPSBpbyAtPlRlbGwoaW8pIC0gQmFzZU9mZnNldDsKKworICAgICAgICBFbGVtZW50U2lnID0gRWxlbSAtPlR5cGU7CisKKyAgICAgICAgVHlwZUhhbmRsZXIgPSBHZXRIYW5kbGVyKChjbXNUYWdUeXBlU2lnbmF0dXJlKSBFbGVtZW50U2lnLCBNUEVUeXBlUGx1Z2luQ2h1bmstPlRhZ1R5cGVzLCBTdXBwb3J0ZWRNUEV0eXBlcyk7CisgICAgICAgIGlmIChUeXBlSGFuZGxlciA9PSBOVUxMKSAgeworCisgICAgICAgICAgICAgICAgY2hhciBTdHJpbmdbNV07CisKKyAgICAgICAgICAgICAgICBfY21zVGFnU2lnbmF0dXJlMlN0cmluZyhTdHJpbmcsIChjbXNUYWdTaWduYXR1cmUpIEVsZW1lbnRTaWcpOworCisgICAgICAgICAgICAgICAgIC8vIEFuIHVua25vdyBlbGVtZW50IHdhcyBmb3VuZC4KKyAgICAgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3Ioc2VsZi0+Q29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIkZvdW5kIHVua25vd24gTVBFIHR5cGUgJyVzJyIsIFN0cmluZyk7CisgICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgRWxlbWVudFNpZykpIGdvdG8gRXJyb3I7CisgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCAwKSkgZ290byBFcnJvcjsKKyAgICAgICAgQmVmb3JlID0gaW8gLT5UZWxsKGlvKTsKKyAgICAgICAgaWYgKCFUeXBlSGFuZGxlciAtPldyaXRlUHRyKHNlbGYsIGlvLCBFbGVtLCAxKSkgZ290byBFcnJvcjsKKyAgICAgICAgaWYgKCFfY21zV3JpdGVBbGlnbm1lbnQoaW8pKSBnb3RvIEVycm9yOworCisgICAgICAgIEVsZW1lbnRTaXplc1tpXSA9IGlvIC0+VGVsbChpbykgLSBCZWZvcmU7CisKKyAgICAgICAgRWxlbSA9IEVsZW0gLT5OZXh0OworICAgIH0KKworICAgIC8vIFdyaXRlIHRoZSBkaXJlY3RvcnkKKyAgICBDdXJyZW50UG9zID0gaW8gLT5UZWxsKGlvKTsKKworICAgIGlmICghaW8gLT5TZWVrKGlvLCBEaXJlY3RvcnlQb3MpKSBnb3RvIEVycm9yOworCisgICAgZm9yIChpPTA7IGkgPCBFbGVtQ291bnQ7IGkrKykgeworICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgRWxlbWVudE9mZnNldHNbaV0pKSBnb3RvIEVycm9yOworICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgRWxlbWVudFNpemVzW2ldKSkgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICBpZiAoIWlvIC0+U2VlayhpbywgQ3VycmVudFBvcykpIGdvdG8gRXJyb3I7CisKKyAgICBpZiAoRWxlbWVudE9mZnNldHMgIT0gTlVMTCkgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgRWxlbWVudE9mZnNldHMpOworICAgIGlmIChFbGVtZW50U2l6ZXMgIT0gTlVMTCkgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgRWxlbWVudFNpemVzKTsKKyAgICByZXR1cm4gVFJVRTsKKworRXJyb3I6CisgICAgaWYgKEVsZW1lbnRPZmZzZXRzICE9IE5VTEwpIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIEVsZW1lbnRPZmZzZXRzKTsKKyAgICBpZiAoRWxlbWVudFNpemVzICE9IE5VTEwpIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIEVsZW1lbnRTaXplcyk7CisgICAgcmV0dXJuIEZBTFNFOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihuSXRlbXMpOworfQorCisKK3N0YXRpYwordm9pZCogVHlwZV9NUEVfRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKK3sKKyAgICByZXR1cm4gKHZvaWQqKSBjbXNQaXBlbGluZUR1cCgoY21zUGlwZWxpbmUqKSBQdHIpOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOworfQorCitzdGF0aWMKK3ZvaWQgVHlwZV9NUEVfRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQgKlB0cikKK3sKKyAgICBjbXNQaXBlbGluZUZyZWUoKGNtc1BpcGVsaW5lKikgUHRyKTsKKyAgICByZXR1cm47CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOworfQorCisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBUeXBlIGNtc1NpZ1ZjZ3RUeXBlCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisKKyNkZWZpbmUgY21zVmlkZW9DYXJkR2FtbWFUYWJsZVR5cGUgICAgMAorI2RlZmluZSBjbXNWaWRlb0NhcmRHYW1tYUZvcm11bGFUeXBlICAxCisKKy8vIFVzZWQgaW50ZXJuYWxseQordHlwZWRlZiBzdHJ1Y3QgeworICAgIGRvdWJsZSBHYW1tYTsKKyAgICBkb3VibGUgTWluOworICAgIGRvdWJsZSBNYXg7Cit9IF9jbXNWQ0dUR0FNTUE7CisKKworc3RhdGljCit2b2lkICpUeXBlX3ZjZ3RfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBjbXNJT0hBTkRMRVIqIGlvLAorICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyKiBuSXRlbXMsCisgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQoreworICAgIGNtc1VJbnQzMk51bWJlciBUYWdUeXBlLCBuLCBpOworICAgIGNtc1RvbmVDdXJ2ZSoqIEN1cnZlczsKKworICAgICpuSXRlbXMgPSAwOworCisgICAgLy8gUmVhZCB0YWcgdHlwZQorICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZUYWdUeXBlKSkgcmV0dXJuIE5VTEw7CisKKyAgICAvLyBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGFycmF5CisgICAgQ3VydmVzID0gKCBjbXNUb25lQ3VydmUqKikgX2Ntc0NhbGxvYyhzZWxmIC0+Q29udGV4dElELCAzLCBzaXplb2YoY21zVG9uZUN1cnZlKikpOworICAgIGlmIChDdXJ2ZXMgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICAvLyBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIGZsYXZvcnMKKyAgICBzd2l0Y2ggKFRhZ1R5cGUpIHsKKworICAgIC8vIEdhbW1hIGlzIHN0b3JlZCBhcyBhIHRhYmxlCisgICAgY2FzZSBjbXNWaWRlb0NhcmRHYW1tYVRhYmxlVHlwZToKKyAgICB7CisgICAgICAgY21zVUludDE2TnVtYmVyIG5DaGFubmVscywgbkVsZW1zLCBuQnl0ZXM7CisKKyAgICAgICAvLyBDaGVjayBjaGFubmVsIGNvdW50LCB3aGljaCBzaG91bGQgYmUgMyAod2UgZG9uJ3Qgc3VwcG9ydCBtb25vY2hyb21lIHRoaXMgdGltZSkKKyAgICAgICBpZiAoIV9jbXNSZWFkVUludDE2TnVtYmVyKGlvLCAmbkNoYW5uZWxzKSkgZ290byBFcnJvcjsKKworICAgICAgIGlmIChuQ2hhbm5lbHMgIT0gMykgeworICAgICAgICAgICBjbXNTaWduYWxFcnJvcihzZWxmLT5Db250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzIGZvciBWQ0dUICclZCciLCBuQ2hhbm5lbHMpOworICAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgIH0KKworICAgICAgIC8vIEdldCBUYWJsZSBlbGVtZW50IGNvdW50IGFuZCBieXRlcyBwZXIgZWxlbWVudAorICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sICZuRWxlbXMpKSBnb3RvIEVycm9yOworICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sICZuQnl0ZXMpKSBnb3RvIEVycm9yOworCisgICAgICAgLy8gQWRvYmUncyBxdWlyayBmaXh1cC4gRml4aW5nIGJyb2tlbiBwcm9maWxlcy4uLgorICAgICAgIGlmIChuRWxlbXMgPT0gMjU2ICYmIG5CeXRlcyA9PSAxICYmIFNpemVPZlRhZyA9PSAxNTc2KQorICAgICAgICAgICBuQnl0ZXMgPSAyOworCisKKyAgICAgICAvLyBQb3B1bGF0ZSB0b25lIGN1cnZlcworICAgICAgIGZvciAobj0wOyBuIDwgMzsgbisrKSB7CisKKyAgICAgICAgICAgQ3VydmVzW25dID0gY21zQnVpbGRUYWJ1bGF0ZWRUb25lQ3VydmUxNihzZWxmIC0+Q29udGV4dElELCBuRWxlbXMsIE5VTEwpOworICAgICAgICAgICBpZiAoQ3VydmVzW25dID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgICAgICAgICAgLy8gT24gZGVwZW5kaW5nIG9uIGJ5dGUgZGVwdGgKKyAgICAgICAgICAgc3dpdGNoIChuQnl0ZXMpIHsKKworICAgICAgICAgICAvLyBPbmUgYnl0ZSwgMC4uMjU1CisgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgbkVsZW1zOyBpKyspIHsKKworICAgICAgICAgICAgICAgICAgIGNtc1VJbnQ4TnVtYmVyIHY7CisKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoIV9jbXNSZWFkVUludDhOdW1iZXIoaW8sICZ2KSkgZ290byBFcnJvcjsKKyAgICAgICAgICAgICAgICAgICAgICBDdXJ2ZXNbbl0gLT5UYWJsZTE2W2ldID0gRlJPTV84X1RPXzE2KHYpOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgLy8gT25lIHdvcmQgMC4uNjU1MzUKKyAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICBpZiAoIV9jbXNSZWFkVUludDE2QXJyYXkoaW8sIG5FbGVtcywgQ3VydmVzW25dLT5UYWJsZTE2KSkgZ290byBFcnJvcjsKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAvLyBVbnN1cHBvcnRlZAorICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihzZWxmLT5Db250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5zdXBwb3J0ZWQgYml0IGRlcHRoIGZvciBWQ0dUICclZCciLCBuQnl0ZXMgKiA4KTsKKyAgICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICAgICAgICAgfQorICAgICAgIH0gLy8gRm9yIGFsbCAzIGNoYW5uZWxzCisgICAgfQorICAgIGJyZWFrOworCisgICAvLyBJbiB0aGlzIGNhc2UsIGdhbW1hIGlzIHN0b3JlZCBhcyBhIGZvcm11bGEKKyAgIGNhc2UgY21zVmlkZW9DYXJkR2FtbWFGb3JtdWxhVHlwZToKKyAgIHsKKyAgICAgICBfY21zVkNHVEdBTU1BIENvbG9yYW50WzNdOworCisgICAgICAgIC8vIFBvcHVsYXRlIHRvbmUgY3VydmVzCisgICAgICAgZm9yIChuPTA7IG4gPCAzOyBuKyspIHsKKworICAgICAgICAgICBkb3VibGUgUGFyYW1zWzEwXTsKKworICAgICAgICAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAmQ29sb3JhbnRbbl0uR2FtbWEpKSBnb3RvIEVycm9yOworICAgICAgICAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAmQ29sb3JhbnRbbl0uTWluKSkgZ290byBFcnJvcjsKKyAgICAgICAgICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgJkNvbG9yYW50W25dLk1heCkpIGdvdG8gRXJyb3I7CisKKyAgICAgICAgICAgIC8vIFBhcmFtZXRyaWMgY3VydmUgdHlwZSA1IGlzOgorICAgICAgICAgICAgLy8gWSA9IChhWCArIGIpXkdhbW1hICsgZSB8IFggPj0gZAorICAgICAgICAgICAgLy8gWSA9IGNYICsgZiAgICAgICAgICAgICB8IFggPCBkCisKKyAgICAgICAgICAgIC8vIHZjZ3QgZm9ybXVsYSBpczoKKyAgICAgICAgICAgIC8vIFkgPSAoTWF4IC0gTWluKSAqIChYIF4gR2FtbWEpICsgTWluCisKKyAgICAgICAgICAgIC8vIFNvLCB0aGUgdHJhbnNsYXRpb24gaXMKKyAgICAgICAgICAgIC8vIGEgPSAoTWF4IC0gTWluKSBeICggMSAvIEdhbW1hKQorICAgICAgICAgICAgLy8gZSA9IE1pbgorICAgICAgICAgICAgLy8gYj1jPWQ9Zj0wCisKKyAgICAgICAgICAgUGFyYW1zWzBdID0gQ29sb3JhbnRbbl0uR2FtbWE7CisgICAgICAgICAgIFBhcmFtc1sxXSA9IHBvdygoQ29sb3JhbnRbbl0uTWF4IC0gQ29sb3JhbnRbbl0uTWluKSwgKDEuMCAvIENvbG9yYW50W25dLkdhbW1hKSk7CisgICAgICAgICAgIFBhcmFtc1syXSA9IDA7CisgICAgICAgICAgIFBhcmFtc1szXSA9IDA7CisgICAgICAgICAgIFBhcmFtc1s0XSA9IDA7CisgICAgICAgICAgIFBhcmFtc1s1XSA9IENvbG9yYW50W25dLk1pbjsKKyAgICAgICAgICAgUGFyYW1zWzZdID0gMDsKKworICAgICAgICAgICBDdXJ2ZXNbbl0gPSBjbXNCdWlsZFBhcmFtZXRyaWNUb25lQ3VydmUoc2VsZiAtPkNvbnRleHRJRCwgNSwgUGFyYW1zKTsKKyAgICAgICAgICAgaWYgKEN1cnZlc1tuXSA9PSBOVUxMKSBnb3RvIEVycm9yOworICAgICAgIH0KKyAgIH0KKyAgIGJyZWFrOworCisgICAvLyBVbnN1cHBvcnRlZAorICAgZGVmYXVsdDoKKyAgICAgIGNtc1NpZ25hbEVycm9yKHNlbGYtPkNvbnRleHRJRCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJVbnN1cHBvcnRlZCB0YWcgdHlwZSBmb3IgVkNHVCAnJWQnIiwgVGFnVHlwZSk7CisgICAgICBnb3RvIEVycm9yOworICAgfQorCisgICAqbkl0ZW1zID0gMTsKKyAgIHJldHVybiAodm9pZCopIEN1cnZlczsKKworLy8gUmVncmV0LCAgZnJlZSBhbGwgcmVzb3VyY2VzCitFcnJvcjoKKworICAgIGNtc0ZyZWVUb25lQ3VydmVUcmlwbGUoQ3VydmVzKTsKKyAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBDdXJ2ZXMpOworICAgIHJldHVybiBOVUxMOworCisgICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU2l6ZU9mVGFnKTsKK30KKworCisvLyBXZSBkb24ndCBzdXBwb3J0IGFsbCBmbGF2b3JzLCBvbmx5IDE2Yml0cyB0YWJsZXMgYW5kIGZvcm11bGEKK3N0YXRpYworY21zQm9vbCBUeXBlX3ZjZ3RfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCit7CisgICAgY21zVG9uZUN1cnZlKiogQ3VydmVzID0gIChjbXNUb25lQ3VydmUqKikgUHRyOworICAgIGNtc1VJbnQzMk51bWJlciBpLCBqOworCisgICAgaWYgKGNtc0dldFRvbmVDdXJ2ZVBhcmFtZXRyaWNUeXBlKEN1cnZlc1swXSkgPT0gNSAmJgorICAgICAgICBjbXNHZXRUb25lQ3VydmVQYXJhbWV0cmljVHlwZShDdXJ2ZXNbMV0pID09IDUgJiYKKyAgICAgICAgY21zR2V0VG9uZUN1cnZlUGFyYW1ldHJpY1R5cGUoQ3VydmVzWzJdKSA9PSA1KSB7CisKKyAgICAgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBjbXNWaWRlb0NhcmRHYW1tYUZvcm11bGFUeXBlKSkgcmV0dXJuIEZBTFNFOworCisgICAgICAgICAgICAvLyBTYXZlIHBhcmFtZXRlcnMKKyAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgMzsgaSsrKSB7CisKKyAgICAgICAgICAgICAgICBfY21zVkNHVEdBTU1BIHY7CisKKyAgICAgICAgICAgICAgICB2LkdhbW1hID0gQ3VydmVzW2ldIC0+U2VnbWVudHNbMF0uUGFyYW1zWzBdOworICAgICAgICAgICAgICAgIHYuTWluICAgPSBDdXJ2ZXNbaV0gLT5TZWdtZW50c1swXS5QYXJhbXNbNV07CisgICAgICAgICAgICAgICAgdi5NYXggICA9IHBvdyhDdXJ2ZXNbaV0gLT5TZWdtZW50c1swXS5QYXJhbXNbMV0sIHYuR2FtbWEpICsgdi5NaW47CisKKyAgICAgICAgICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgdi5HYW1tYSkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgdi5NaW4pKSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIHYuTWF4KSkgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIGVsc2UgeworCisgICAgICAgIC8vIEFsd2F5cyBzdG9yZSBhcyBhIHRhYmxlIG9mIDI1NiB3b3JkcworICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgY21zVmlkZW9DYXJkR2FtbWFUYWJsZVR5cGUpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCAzKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgMjU2KSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgMikpIHJldHVybiBGQUxTRTsKKworICAgICAgICBmb3IgKGk9MDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgZm9yIChqPTA7IGogPCAyNTY7IGorKykgeworCisgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciB2ID0gY21zRXZhbFRvbmVDdXJ2ZUZsb2F0KEN1cnZlc1tpXSwgKGNtc0Zsb2F0MzJOdW1iZXIpIChqIC8gMjU1LjApKTsKKyAgICAgICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIgIG4gPSBfY21zUXVpY2tTYXR1cmF0ZVdvcmQodiAqIDY1NTM1LjApOworCisgICAgICAgICAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIG4pKSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKKworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihuSXRlbXMpOworfQorCitzdGF0aWMKK3ZvaWQqIFR5cGVfdmNndF9EdXAoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjb25zdCB2b2lkICpQdHIsIGNtc1VJbnQzMk51bWJlciBuKQoreworICAgIGNtc1RvbmVDdXJ2ZSoqIE9sZEN1cnZlcyA9ICAoY21zVG9uZUN1cnZlKiopIFB0cjsKKyAgICBjbXNUb25lQ3VydmUqKiBOZXdDdXJ2ZXM7CisKKyAgICBOZXdDdXJ2ZXMgPSAoIGNtc1RvbmVDdXJ2ZSoqKSBfY21zQ2FsbG9jKHNlbGYgLT5Db250ZXh0SUQsIDMsIHNpemVvZihjbXNUb25lQ3VydmUqKSk7CisgICAgaWYgKE5ld0N1cnZlcyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIE5ld0N1cnZlc1swXSA9IGNtc0R1cFRvbmVDdXJ2ZShPbGRDdXJ2ZXNbMF0pOworICAgIE5ld0N1cnZlc1sxXSA9IGNtc0R1cFRvbmVDdXJ2ZShPbGRDdXJ2ZXNbMV0pOworICAgIE5ld0N1cnZlc1syXSA9IGNtc0R1cFRvbmVDdXJ2ZShPbGRDdXJ2ZXNbMl0pOworCisgICAgcmV0dXJuICh2b2lkKikgTmV3Q3VydmVzOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKK30KKworCitzdGF0aWMKK3ZvaWQgVHlwZV92Y2d0X0ZyZWUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCB2b2lkKiBQdHIpCit7CisgICAgY21zRnJlZVRvbmVDdXJ2ZVRyaXBsZSgoY21zVG9uZUN1cnZlKiopIFB0cik7CisgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgUHRyKTsKK30KKworCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gVHlwZSBjbXNTaWdEaWN0VHlwZQorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworLy8gU2luZ2xlIGNvbHVtbiBvZiB0aGUgdGFibGUgY2FuIHBvaW50IHRvIHdjaGFyIG9yIE1MVUMgZWxlbWVudHMuIEhvbGRzIGFycmF5cyBvZiBkYXRhCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY21zQ29udGV4dCBDb250ZXh0SUQ7CisgICAgY21zVUludDMyTnVtYmVyICpPZmZzZXRzOworICAgIGNtc1VJbnQzMk51bWJlciAqU2l6ZXM7Cit9IF9jbXNESUNlbGVtOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgX2Ntc0RJQ2VsZW0gTmFtZSwgVmFsdWUsIERpc3BsYXlOYW1lLCBEaXNwbGF5VmFsdWU7CisKK30gX2Ntc0RJQ2FycmF5OworCisvLyBBbGxvY2F0ZSBhbiBlbXB0eSBhcnJheSBlbGVtZW50CitzdGF0aWMKK2Ntc0Jvb2wgQWxsb2NFbGVtKGNtc0NvbnRleHQgQ29udGV4dElELCBfY21zRElDZWxlbSogZSwgIGNtc1VJbnQzMk51bWJlciBDb3VudCkKK3sKKyAgICBlLT5PZmZzZXRzID0gKGNtc1VJbnQzMk51bWJlciAqKSBfY21zQ2FsbG9jKENvbnRleHRJRCwgQ291bnQsIHNpemVvZihjbXNVSW50MzJOdW1iZXIpKTsKKyAgICBpZiAoZS0+T2Zmc2V0cyA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICBlLT5TaXplcyA9IChjbXNVSW50MzJOdW1iZXIgKikgX2Ntc0NhbGxvYyhDb250ZXh0SUQsIENvdW50LCBzaXplb2YoY21zVUludDMyTnVtYmVyKSk7CisgICAgaWYgKGUtPlNpemVzID09IE5VTEwpIHsKKworICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIGUgLT4gT2Zmc2V0cyk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBlIC0+Q29udGV4dElEID0gQ29udGV4dElEOworICAgIHJldHVybiBUUlVFOworfQorCisvLyBGcmVlIGFuIGFycmF5IGVsZW1lbnQKK3N0YXRpYwordm9pZCBGcmVlRWxlbShfY21zRElDZWxlbSogZSkKK3sKKyAgICBpZiAoZSAtPk9mZnNldHMgIT0gTlVMTCkgIF9jbXNGcmVlKGUgLT4gQ29udGV4dElELCBlIC0+IE9mZnNldHMpOworICAgIGlmIChlIC0+U2l6ZXMgICAhPSBOVUxMKSAgX2Ntc0ZyZWUoZSAtPiBDb250ZXh0SUQsIGUgLT4gU2l6ZXMpOworICAgIGUtPk9mZnNldHMgPSBlIC0+U2l6ZXMgPSBOVUxMOworfQorCisvLyBHZXQgcmlkIG9mIHdob2xlIGFycmF5CitzdGF0aWMKK3ZvaWQgRnJlZUFycmF5KCBfY21zRElDYXJyYXkqIGEpCit7CisgICAgaWYgKGEgLT5OYW1lLk9mZnNldHMgIT0gTlVMTCkgRnJlZUVsZW0oJmEtPk5hbWUpOworICAgIGlmIChhIC0+VmFsdWUuT2Zmc2V0cyAhPSBOVUxMKSBGcmVlRWxlbSgmYSAtPlZhbHVlKTsKKyAgICBpZiAoYSAtPkRpc3BsYXlOYW1lLk9mZnNldHMgIT0gTlVMTCkgRnJlZUVsZW0oJmEtPkRpc3BsYXlOYW1lKTsKKyAgICBpZiAoYSAtPkRpc3BsYXlWYWx1ZS5PZmZzZXRzICE9IE5VTEwpIEZyZWVFbGVtKCZhIC0+RGlzcGxheVZhbHVlKTsKK30KKworCisvLyBBbGxvY2F0ZSB3aG9sZSBhcnJheQorc3RhdGljCitjbXNCb29sIEFsbG9jQXJyYXkoY21zQ29udGV4dCBDb250ZXh0SUQsIF9jbXNESUNhcnJheSogYSwgY21zVUludDMyTnVtYmVyIENvdW50LCBjbXNVSW50MzJOdW1iZXIgTGVuZ3RoKQoreworICAgIC8vIEVtcHR5IHZhbHVlcworICAgIG1lbXNldChhLCAwLCBzaXplb2YoX2Ntc0RJQ2FycmF5KSk7CisKKyAgICAvLyBPbiBkZXBlbmRpbmcgb24gcmVjb3JkIHNpemUsIGNyZWF0ZSBjb2x1bW4gYXJyYXlzCisgICAgaWYgKCFBbGxvY0VsZW0oQ29udGV4dElELCAmYSAtPk5hbWUsIENvdW50KSkgZ290byBFcnJvcjsKKyAgICBpZiAoIUFsbG9jRWxlbShDb250ZXh0SUQsICZhIC0+VmFsdWUsIENvdW50KSkgZ290byBFcnJvcjsKKworICAgIGlmIChMZW5ndGggPiAxNikgeworICAgICAgICBpZiAoIUFsbG9jRWxlbShDb250ZXh0SUQsICZhIC0+IERpc3BsYXlOYW1lLCBDb3VudCkpIGdvdG8gRXJyb3I7CisKKyAgICB9CisgICAgaWYgKExlbmd0aCA+IDI0KSB7CisgICAgICAgIGlmICghQWxsb2NFbGVtKENvbnRleHRJRCwgJmEgLT5EaXNwbGF5VmFsdWUsIENvdW50KSkgZ290byBFcnJvcjsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisKK0Vycm9yOgorICAgIEZyZWVBcnJheShhKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKKy8vIFJlYWQgb25lIGVsZW1lbnQKK3N0YXRpYworY21zQm9vbCBSZWFkT25lRWxlbShjbXNJT0hBTkRMRVIqIGlvLCAgX2Ntc0RJQ2VsZW0qIGUsIGNtc1VJbnQzMk51bWJlciBpLCBjbXNVSW50MzJOdW1iZXIgQmFzZU9mZnNldCkKK3sKKyAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmZS0+T2Zmc2V0c1tpXSkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmZSAtPlNpemVzW2ldKSkgcmV0dXJuIEZBTFNFOworCisgICAgLy8gQW4gb2Zmc2V0IG9mIHplcm8gaGFzIHNwZWNpYWwgbWVhbmluZyBhbmQgc2hhbCBiZSBwcmVzZXJ2ZWQKKyAgICBpZiAoZSAtPk9mZnNldHNbaV0gPiAwKQorICAgICAgICBlIC0+T2Zmc2V0c1tpXSArPSBCYXNlT2Zmc2V0OworICAgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYworY21zQm9vbCBSZWFkT2Zmc2V0QXJyYXkoY21zSU9IQU5ETEVSKiBpbywgIF9jbXNESUNhcnJheSogYSwgY21zVUludDMyTnVtYmVyIENvdW50LCBjbXNVSW50MzJOdW1iZXIgTGVuZ3RoLCBjbXNVSW50MzJOdW1iZXIgQmFzZU9mZnNldCkKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgaTsKKworICAgIC8vIFJlYWQgY29sdW1uIGFycmF5cworICAgIGZvciAoaT0wOyBpIDwgQ291bnQ7IGkrKykgeworCisgICAgICAgIGlmICghUmVhZE9uZUVsZW0oaW8sICZhIC0+IE5hbWUsIGksIEJhc2VPZmZzZXQpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghUmVhZE9uZUVsZW0oaW8sICZhIC0+IFZhbHVlLCBpLCBCYXNlT2Zmc2V0KSkgcmV0dXJuIEZBTFNFOworCisgICAgICAgIGlmIChMZW5ndGggPiAxNikgeworCisgICAgICAgICAgICBpZiAoIVJlYWRPbmVFbGVtKGlvLCAmYSAtPkRpc3BsYXlOYW1lLCBpLCBCYXNlT2Zmc2V0KSkgcmV0dXJuIEZBTFNFOworCisgICAgICAgIH0KKworICAgICAgICBpZiAoTGVuZ3RoID4gMjQpIHsKKworICAgICAgICAgICAgaWYgKCFSZWFkT25lRWxlbShpbywgJiBhIC0+IERpc3BsYXlWYWx1ZSwgaSwgQmFzZU9mZnNldCkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLyBXcml0ZSBvbmUgZWxlbWVudAorc3RhdGljCitjbXNCb29sIFdyaXRlT25lRWxlbShjbXNJT0hBTkRMRVIqIGlvLCAgX2Ntc0RJQ2VsZW0qIGUsIGNtc1VJbnQzMk51bWJlciBpKQoreworICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBlLT5PZmZzZXRzW2ldKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBlIC0+U2l6ZXNbaV0pKSByZXR1cm4gRkFMU0U7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljCitjbXNCb29sIFdyaXRlT2Zmc2V0QXJyYXkoY21zSU9IQU5ETEVSKiBpbywgIF9jbXNESUNhcnJheSogYSwgY21zVUludDMyTnVtYmVyIENvdW50LCBjbXNVSW50MzJOdW1iZXIgTGVuZ3RoKQoreworICAgIGNtc1VJbnQzMk51bWJlciBpOworCisgICAgZm9yIChpPTA7IGkgPCBDb3VudDsgaSsrKSB7CisKKyAgICAgICAgaWYgKCFXcml0ZU9uZUVsZW0oaW8sICZhIC0+IE5hbWUsIGkpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIGlmICghV3JpdGVPbmVFbGVtKGlvLCAmYSAtPiBWYWx1ZSwgaSkpICByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgaWYgKExlbmd0aCA+IDE2KSB7CisKKyAgICAgICAgICAgIGlmICghV3JpdGVPbmVFbGVtKGlvLCAmYSAtPiBEaXNwbGF5TmFtZSwgaSkpICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoTGVuZ3RoID4gMjQpIHsKKworICAgICAgICAgICAgaWYgKCFXcml0ZU9uZUVsZW0oaW8sICZhIC0+IERpc3BsYXlWYWx1ZSwgaSkpICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljCitjbXNCb29sIFJlYWRPbmVXQ2hhcihjbXNJT0hBTkRMRVIqIGlvLCAgX2Ntc0RJQ2VsZW0qIGUsIGNtc1VJbnQzMk51bWJlciBpLCB3Y2hhcl90ICoqIHdjc3RyKQoreworCisgICAgY21zVUludDMyTnVtYmVyIG5DaGFyczsKKworICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciB1bmRlZmluZWQgc3RyaW5ncyAoc2VlIElDQyBWb3RhYmxlCisgICAgICAvLyBQcm9wb3NhbCBTdWJtaXNzaW9uLCBEaWN0aW9uYXJ5IFR5cGUgYW5kIE1ldGFkYXRhIFRBRyBEZWZpbml0aW9uKQorICAgICAgaWYgKGUgLT4gT2Zmc2V0c1tpXSA9PSAwKSB7CisKKyAgICAgICAgICAqd2NzdHIgPSBOVUxMOworICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgfQorCisgICAgICBpZiAoIWlvIC0+IFNlZWsoaW8sIGUgLT4gT2Zmc2V0c1tpXSkpIHJldHVybiBGQUxTRTsKKworICAgICAgbkNoYXJzID0gZSAtPlNpemVzW2ldIC8gc2l6ZW9mKGNtc1VJbnQxNk51bWJlcik7CisKKworICAgICAgKndjc3RyID0gKHdjaGFyX3QqKSBfY21zTWFsbG9jWmVybyhlIC0+Q29udGV4dElELCAobkNoYXJzICsgMSkgKiBzaXplb2Yod2NoYXJfdCkpOworICAgICAgaWYgKCp3Y3N0ciA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICAgIGlmICghX2Ntc1JlYWRXQ2hhckFycmF5KGlvLCBuQ2hhcnMsICp3Y3N0cikpIHsKKyAgICAgICAgICBfY21zRnJlZShlIC0+Q29udGV4dElELCAqd2NzdHIpOworICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIH0KKworICAgICAgLy8gRW5kIG9mIHN0cmluZyBtYXJrZXIKKyAgICAgICgqd2NzdHIpW25DaGFyc10gPSAwOworICAgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYworY21zVUludDMyTnVtYmVyIG15d2NzbGVuKGNvbnN0IHdjaGFyX3QgKnMpCit7CisgICAgY29uc3Qgd2NoYXJfdCAqcDsKKworICAgIHAgPSBzOworICAgIHdoaWxlICgqcCkKKyAgICAgICAgcCsrOworCisgICAgcmV0dXJuIChjbXNVSW50MzJOdW1iZXIpKHAgLSBzKTsKK30KKworc3RhdGljCitjbXNCb29sIFdyaXRlT25lV0NoYXIoY21zSU9IQU5ETEVSKiBpbywgIF9jbXNESUNlbGVtKiBlLCBjbXNVSW50MzJOdW1iZXIgaSwgY29uc3Qgd2NoYXJfdCAqIHdjc3RyLCBjbXNVSW50MzJOdW1iZXIgQmFzZU9mZnNldCkKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgQmVmb3JlID0gaW8gLT5UZWxsKGlvKTsKKyAgICBjbXNVSW50MzJOdW1iZXIgbjsKKworICAgIGUgLT5PZmZzZXRzW2ldID0gQmVmb3JlIC0gQmFzZU9mZnNldDsKKworICAgIGlmICh3Y3N0ciA9PSBOVUxMKSB7CisgICAgICAgIGUgLT5TaXplc1tpXSA9IDA7CisgICAgICAgIGUgLT5PZmZzZXRzW2ldID0gMDsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgbiA9IG15d2NzbGVuKHdjc3RyKTsKKyAgICBpZiAoIV9jbXNXcml0ZVdDaGFyQXJyYXkoaW8sICBuLCB3Y3N0cikpIHJldHVybiBGQUxTRTsKKworICAgIGUgLT5TaXplc1tpXSA9IGlvIC0+VGVsbChpbykgLSBCZWZvcmU7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYworY21zQm9vbCBSZWFkT25lTUxVQyhzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sICBfY21zRElDZWxlbSogZSwgY21zVUludDMyTnVtYmVyIGksIGNtc01MVSoqIG1sdSkKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zID0gMDsKKworICAgIC8vIEEgd2F5IHRvIGdldCBudWxsIE1MVUNzCisgICAgaWYgKGUgLT4gT2Zmc2V0c1tpXSA9PSAwIHx8IGUgLT5TaXplc1tpXSA9PSAwKSB7CisKKyAgICAgICAgKm1sdSA9IE5VTEw7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKworICAgIGlmICghaW8gLT4gU2VlayhpbywgZSAtPiBPZmZzZXRzW2ldKSkgcmV0dXJuIEZBTFNFOworCisgICAgKm1sdSA9IChjbXNNTFUqKSBUeXBlX01MVV9SZWFkKHNlbGYsIGlvLCAmbkl0ZW1zLCBlIC0+U2l6ZXNbaV0pOworICAgIHJldHVybiAqbWx1ICE9IE5VTEw7Cit9CisKK3N0YXRpYworY21zQm9vbCBXcml0ZU9uZU1MVUMoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCAgX2Ntc0RJQ2VsZW0qIGUsIGNtc1VJbnQzMk51bWJlciBpLCBjb25zdCBjbXNNTFUqIG1sdSwgY21zVUludDMyTnVtYmVyIEJhc2VPZmZzZXQpCit7CisgICAgY21zVUludDMyTnVtYmVyIEJlZm9yZTsKKworICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHVuZGVmaW5lZCBzdHJpbmdzIChzZWUgSUNDIFZvdGFibGUKKyAgICAgLy8gUHJvcG9zYWwgU3VibWlzc2lvbiwgRGljdGlvbmFyeSBUeXBlIGFuZCBNZXRhZGF0YSBUQUcgRGVmaW5pdGlvbikKKyAgICAgaWYgKG1sdSA9PSBOVUxMKSB7CisgICAgICAgIGUgLT5TaXplc1tpXSA9IDA7CisgICAgICAgIGUgLT5PZmZzZXRzW2ldID0gMDsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgQmVmb3JlID0gaW8gLT5UZWxsKGlvKTsKKyAgICBlIC0+T2Zmc2V0c1tpXSA9IEJlZm9yZSAtIEJhc2VPZmZzZXQ7CisKKyAgICBpZiAoIVR5cGVfTUxVX1dyaXRlKHNlbGYsIGlvLCAodm9pZCopIG1sdSwgMSkpIHJldHVybiBGQUxTRTsKKworICAgIGUgLT5TaXplc1tpXSA9IGlvIC0+VGVsbChpbykgLSBCZWZvcmU7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljCit2b2lkICpUeXBlX0RpY3Rpb25hcnlfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQoreworICAgY21zSEFORExFIGhEaWN0OworICAgY21zVUludDMyTnVtYmVyIGksIENvdW50LCBMZW5ndGg7CisgICBjbXNVSW50MzJOdW1iZXIgQmFzZU9mZnNldDsKKyAgIF9jbXNESUNhcnJheSBhOworICAgd2NoYXJfdCAqTmFtZVdDUyA9IE5VTEwsICpWYWx1ZVdDUyA9IE5VTEw7CisgICBjbXNNTFUgKkRpc3BsYXlOYW1lTUxVID0gTlVMTCwgKkRpc3BsYXlWYWx1ZU1MVT1OVUxMOworICAgY21zQm9vbCByYzsKKworICAgICpuSXRlbXMgPSAwOworCisgICAgLy8gR2V0IGFjdHVhbCBwb3NpdGlvbiBhcyBhIGJhc2lzIGZvciBlbGVtZW50IG9mZnNldHMKKyAgICBCYXNlT2Zmc2V0ID0gaW8gLT5UZWxsKGlvKSAtIHNpemVvZihfY21zVGFnQmFzZSk7CisKKyAgICAvLyBHZXQgbmFtZS12YWx1ZSByZWNvcmQgY291bnQKKyAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmQ291bnQpKSByZXR1cm4gTlVMTDsKKyAgICBTaXplT2ZUYWcgLT0gc2l6ZW9mKGNtc1VJbnQzMk51bWJlcik7CisKKyAgICAvLyBHZXQgcmVjIGxlbmd0aAorICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZMZW5ndGgpKSByZXR1cm4gTlVMTDsKKyAgICBTaXplT2ZUYWcgLT0gc2l6ZW9mKGNtc1VJbnQzMk51bWJlcik7CisKKyAgICAvLyBDaGVjayBmb3IgdmFsaWQgbGVuZ3RocworICAgIGlmIChMZW5ndGggIT0gMTYgJiYgTGVuZ3RoICE9IDI0ICYmIExlbmd0aCAhPSAzMikgeworICAgICAgICAgY21zU2lnbmFsRXJyb3Ioc2VsZi0+Q29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVua25vd24gcmVjb3JkIGxlbmd0aCBpbiBkaWN0aW9uYXJ5ICclZCciLCBMZW5ndGgpOworICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLy8gQ3JlYXRlcyBhbiBlbXB0eSBkaWN0aW9uYXJ5CisgICAgaERpY3QgPSBjbXNEaWN0QWxsb2Moc2VsZiAtPiBDb250ZXh0SUQpOworICAgIGlmIChoRGljdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIC8vIE9uIGRlcGVuZGluZyBvbiByZWNvcmQgc2l6ZSwgY3JlYXRlIGNvbHVtbiBhcnJheXMKKyAgICBpZiAoIUFsbG9jQXJyYXkoc2VsZiAtPiBDb250ZXh0SUQsICZhLCBDb3VudCwgTGVuZ3RoKSkgZ290byBFcnJvcjsKKworICAgIC8vIFJlYWQgY29sdW1uIGFycmF5cworICAgIGlmICghUmVhZE9mZnNldEFycmF5KGlvLCAmYSwgQ291bnQsIExlbmd0aCwgQmFzZU9mZnNldCkpIGdvdG8gRXJyb3I7CisKKyAgICAvLyBTZWVrIHRvIGVhY2ggZWxlbWVudCBhbmQgcmVhZCBpdAorICAgIGZvciAoaT0wOyBpIDwgQ291bnQ7IGkrKykgeworCisgICAgICAgIGlmICghUmVhZE9uZVdDaGFyKGlvLCAmYS5OYW1lLCBpLCAmTmFtZVdDUykpIGdvdG8gRXJyb3I7CisgICAgICAgIGlmICghUmVhZE9uZVdDaGFyKGlvLCAmYS5WYWx1ZSwgaSwgJlZhbHVlV0NTKSkgZ290byBFcnJvcjsKKworICAgICAgICBpZiAoTGVuZ3RoID4gMTYpIHsKKyAgICAgICAgICAgIGlmICghUmVhZE9uZU1MVUMoc2VsZiwgaW8sICZhLkRpc3BsYXlOYW1lLCBpLCAmRGlzcGxheU5hbWVNTFUpKSBnb3RvIEVycm9yOworICAgICAgICB9CisKKyAgICAgICAgaWYgKExlbmd0aCA+IDI0KSB7CisgICAgICAgICAgICBpZiAoIVJlYWRPbmVNTFVDKHNlbGYsIGlvLCAmYS5EaXNwbGF5VmFsdWUsIGksICZEaXNwbGF5VmFsdWVNTFUpKSBnb3RvIEVycm9yOworICAgICAgICB9CisKKyAgICAgICAgaWYgKE5hbWVXQ1MgPT0gTlVMTCB8fCBWYWx1ZVdDUyA9PSBOVUxMKSB7CisgICAgICAgIAorICAgICAgICAgICAgY21zU2lnbmFsRXJyb3Ioc2VsZi0+Q29udGV4dElELCBjbXNFUlJPUl9DT1JSVVBUSU9OX0RFVEVDVEVELCAiQmFkIGRpY3Rpb25hcnkgTmFtZS9WYWx1ZSIpOyAgICAgICAgCisgICAgICAgICAgICByYyA9IEZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICByYyA9IGNtc0RpY3RBZGRFbnRyeShoRGljdCwgTmFtZVdDUywgVmFsdWVXQ1MsIERpc3BsYXlOYW1lTUxVLCBEaXNwbGF5VmFsdWVNTFUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKE5hbWVXQ1MgIT0gTlVMTCkgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgTmFtZVdDUyk7CisgICAgICAgIGlmIChWYWx1ZVdDUyAhPSBOVUxMKSBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBWYWx1ZVdDUyk7CisgICAgICAgIGlmIChEaXNwbGF5TmFtZU1MVSAhPSBOVUxMKSBjbXNNTFVmcmVlKERpc3BsYXlOYW1lTUxVKTsKKyAgICAgICAgaWYgKERpc3BsYXlWYWx1ZU1MVSAhPSBOVUxMKSBjbXNNTFVmcmVlKERpc3BsYXlWYWx1ZU1MVSk7CisKKyAgICAgICAgaWYgKCFyYykgZ290byBFcnJvcjsKKyAgICB9CisKKyAgIEZyZWVBcnJheSgmYSk7CisgICAqbkl0ZW1zID0gMTsKKyAgIHJldHVybiAodm9pZCopIGhEaWN0OworCitFcnJvcjoKKyAgIEZyZWVBcnJheSgmYSk7CisgICBjbXNEaWN0RnJlZShoRGljdCk7CisgICByZXR1cm4gTlVMTDsKK30KKworCitzdGF0aWMKK2Ntc0Jvb2wgVHlwZV9EaWN0aW9uYXJ5X1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQoreworICAgIGNtc0hBTkRMRSBoRGljdCA9IChjbXNIQU5ETEUpIFB0cjsKKyAgICBjb25zdCBjbXNESUNUZW50cnkqIHA7CisgICAgY21zQm9vbCBBbnlOYW1lLCBBbnlWYWx1ZTsKKyAgICBjbXNVSW50MzJOdW1iZXIgaSwgQ291bnQsIExlbmd0aDsKKyAgICBjbXNVSW50MzJOdW1iZXIgRGlyZWN0b3J5UG9zLCBDdXJyZW50UG9zLCBCYXNlT2Zmc2V0OworICAgX2Ntc0RJQ2FycmF5IGE7CisKKyAgICBpZiAoaERpY3QgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworCisgICAgQmFzZU9mZnNldCA9IGlvIC0+VGVsbChpbykgLSBzaXplb2YoX2Ntc1RhZ0Jhc2UpOworCisgICAgLy8gTGV0J3MgaW5zcGVjdCB0aGUgZGljdGlvbmFyeQorICAgIENvdW50ID0gMDsgQW55TmFtZSA9IEZBTFNFOyBBbnlWYWx1ZSA9IEZBTFNFOworICAgIGZvciAocCA9IGNtc0RpY3RHZXRFbnRyeUxpc3QoaERpY3QpOyBwICE9IE5VTEw7IHAgPSBjbXNEaWN0TmV4dEVudHJ5KHApKSB7CisKKyAgICAgICAgaWYgKHAgLT5EaXNwbGF5TmFtZSAhPSBOVUxMKSBBbnlOYW1lID0gVFJVRTsKKyAgICAgICAgaWYgKHAgLT5EaXNwbGF5VmFsdWUgIT0gTlVMTCkgQW55VmFsdWUgPSBUUlVFOworICAgICAgICBDb3VudCsrOworICAgIH0KKworICAgIExlbmd0aCA9IDE2OworICAgIGlmIChBbnlOYW1lKSAgTGVuZ3RoICs9IDg7CisgICAgaWYgKEFueVZhbHVlKSBMZW5ndGggKz0gODsKKworICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBDb3VudCkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgTGVuZ3RoKSkgcmV0dXJuIEZBTFNFOworCisgICAgLy8gS2VlcCBzdGFydGluZyBwb3NpdGlvbiBvZiBvZmZzZXRzIHRhYmxlCisgICAgRGlyZWN0b3J5UG9zID0gaW8gLT5UZWxsKGlvKTsKKworICAgIC8vIEFsbG9jYXRlIG9mZnNldHMgYXJyYXkKKyAgICBpZiAoIUFsbG9jQXJyYXkoc2VsZiAtPkNvbnRleHRJRCwgJmEsIENvdW50LCBMZW5ndGgpKSBnb3RvIEVycm9yOworCisgICAgLy8gV3JpdGUgYSBmYWtlIGRpcmVjdG9yeSB0byBiZSBmaWxsZWQgbGF0dGVyIG9uCisgICAgaWYgKCFXcml0ZU9mZnNldEFycmF5KGlvLCAmYSwgQ291bnQsIExlbmd0aCkpIGdvdG8gRXJyb3I7CisKKyAgICAvLyBXcml0ZSBlYWNoIGVsZW1lbnQuIEtlZXAgdHJhY2sgb2YgdGhlIHNpemUgYXMgd2VsbC4KKyAgICBwID0gY21zRGljdEdldEVudHJ5TGlzdChoRGljdCk7CisgICAgZm9yIChpPTA7IGkgPCBDb3VudDsgaSsrKSB7CisKKyAgICAgICAgaWYgKCFXcml0ZU9uZVdDaGFyKGlvLCAmYS5OYW1lLCBpLCAgcCAtPk5hbWUsIEJhc2VPZmZzZXQpKSBnb3RvIEVycm9yOworICAgICAgICBpZiAoIVdyaXRlT25lV0NoYXIoaW8sICZhLlZhbHVlLCBpLCBwIC0+VmFsdWUsIEJhc2VPZmZzZXQpKSBnb3RvIEVycm9yOworCisgICAgICAgIGlmIChwIC0+RGlzcGxheU5hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFXcml0ZU9uZU1MVUMoc2VsZiwgaW8sICZhLkRpc3BsYXlOYW1lLCBpLCBwIC0+RGlzcGxheU5hbWUsIEJhc2VPZmZzZXQpKSBnb3RvIEVycm9yOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHAgLT5EaXNwbGF5VmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFXcml0ZU9uZU1MVUMoc2VsZiwgaW8sICZhLkRpc3BsYXlWYWx1ZSwgaSwgcCAtPkRpc3BsYXlWYWx1ZSwgQmFzZU9mZnNldCkpIGdvdG8gRXJyb3I7CisgICAgICAgIH0KKworICAgICAgIHAgPSBjbXNEaWN0TmV4dEVudHJ5KHApOworICAgIH0KKworICAgIC8vIFdyaXRlIHRoZSBkaXJlY3RvcnkKKyAgICBDdXJyZW50UG9zID0gaW8gLT5UZWxsKGlvKTsKKyAgICBpZiAoIWlvIC0+U2VlayhpbywgRGlyZWN0b3J5UG9zKSkgZ290byBFcnJvcjsKKworICAgIGlmICghV3JpdGVPZmZzZXRBcnJheShpbywgJmEsIENvdW50LCBMZW5ndGgpKSBnb3RvIEVycm9yOworCisgICAgaWYgKCFpbyAtPlNlZWsoaW8sIEN1cnJlbnRQb3MpKSBnb3RvIEVycm9yOworCisgICAgRnJlZUFycmF5KCZhKTsKKyAgICByZXR1cm4gVFJVRTsKKworRXJyb3I6CisgICAgRnJlZUFycmF5KCZhKTsKKyAgICByZXR1cm4gRkFMU0U7CisKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7Cit9CisKKworc3RhdGljCit2b2lkKiBUeXBlX0RpY3Rpb25hcnlfRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKK3sKKyAgICByZXR1cm4gKHZvaWQqKSAgY21zRGljdER1cCgoY21zSEFORExFKSBQdHIpOworCisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOworfQorCisKK3N0YXRpYwordm9pZCBUeXBlX0RpY3Rpb25hcnlfRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQqIFB0cikKK3sKKyAgICBjbXNEaWN0RnJlZSgoY21zSEFORExFKSBQdHIpOworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Cit9CisKKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIFR5cGUgc3VwcG9ydCBtYWluIHJvdXRpbmVzCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisKKy8vIFRoaXMgaXMgdGhlIGxpc3Qgb2YgYnVpbHQtaW4gdHlwZXMKK3N0YXRpYyBfY21zVGFnVHlwZUxpbmtlZExpc3QgU3VwcG9ydGVkVGFnVHlwZXNbXSA9IHsKKwore1RZUEVfSEFORExFUihjbXNTaWdDaHJvbWF0aWNpdHlUeXBlLCAgICAgICAgICBDaHJvbWF0aWNpdHkpLCAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzFdIH0sCit7VFlQRV9IQU5ETEVSKGNtc1NpZ0NvbG9yYW50T3JkZXJUeXBlLCAgICAgICAgIENvbG9yYW50T3JkZXJUeXBlKSwgICAmU3VwcG9ydGVkVGFnVHlwZXNbMl0gfSwKK3tUWVBFX0hBTkRMRVIoY21zU2lnUzE1Rml4ZWQxNkFycmF5VHlwZSwgICAgICAgUzE1Rml4ZWQxNiksICAgICAgICAgICZTdXBwb3J0ZWRUYWdUeXBlc1szXSB9LAore1RZUEVfSEFORExFUihjbXNTaWdVMTZGaXhlZDE2QXJyYXlUeXBlLCAgICAgICBVMTZGaXhlZDE2KSwgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzRdIH0sCit7VFlQRV9IQU5ETEVSKGNtc1NpZ1RleHRUeXBlLCAgICAgICAgICAgICAgICAgIFRleHQpLCAgICAgICAgICAgICAgICAmU3VwcG9ydGVkVGFnVHlwZXNbNV0gfSwKK3tUWVBFX0hBTkRMRVIoY21zU2lnVGV4dERlc2NyaXB0aW9uVHlwZSwgICAgICAgVGV4dF9EZXNjcmlwdGlvbiksICAgICZTdXBwb3J0ZWRUYWdUeXBlc1s2XSB9LAore1RZUEVfSEFORExFUihjbXNTaWdDdXJ2ZVR5cGUsICAgICAgICAgICAgICAgICBDdXJ2ZSksICAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzddIH0sCit7VFlQRV9IQU5ETEVSKGNtc1NpZ1BhcmFtZXRyaWNDdXJ2ZVR5cGUsICAgICAgIFBhcmFtZXRyaWNDdXJ2ZSksICAgICAmU3VwcG9ydGVkVGFnVHlwZXNbOF0gfSwKK3tUWVBFX0hBTkRMRVIoY21zU2lnRGF0ZVRpbWVUeXBlLCAgICAgICAgICAgICAgRGF0ZVRpbWUpLCAgICAgICAgICAgICZTdXBwb3J0ZWRUYWdUeXBlc1s5XSB9LAore1RZUEVfSEFORExFUihjbXNTaWdMdXQ4VHlwZSwgICAgICAgICAgICAgICAgICBMVVQ4KSwgICAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzEwXSB9LAore1RZUEVfSEFORExFUihjbXNTaWdMdXQxNlR5cGUsICAgICAgICAgICAgICAgICBMVVQxNiksICAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzExXSB9LAore1RZUEVfSEFORExFUihjbXNTaWdDb2xvcmFudFRhYmxlVHlwZSwgICAgICAgICBDb2xvcmFudFRhYmxlKSwgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzEyXSB9LAore1RZUEVfSEFORExFUihjbXNTaWdOYW1lZENvbG9yMlR5cGUsICAgICAgICAgICBOYW1lZENvbG9yKSwgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzEzXSB9LAore1RZUEVfSEFORExFUihjbXNTaWdNdWx0aUxvY2FsaXplZFVuaWNvZGVUeXBlLCBNTFUpLCAgICAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzE0XSB9LAore1RZUEVfSEFORExFUihjbXNTaWdQcm9maWxlU2VxdWVuY2VEZXNjVHlwZSwgICBQcm9maWxlU2VxdWVuY2VEZXNjKSwgJlN1cHBvcnRlZFRhZ1R5cGVzWzE1XSB9LAore1RZUEVfSEFORExFUihjbXNTaWdTaWduYXR1cmVUeXBlLCAgICAgICAgICAgICBTaWduYXR1cmUpLCAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzE2XSB9LAore1RZUEVfSEFORExFUihjbXNTaWdNZWFzdXJlbWVudFR5cGUsICAgICAgICAgICBNZWFzdXJlbWVudCksICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzE3XSB9LAore1RZUEVfSEFORExFUihjbXNTaWdEYXRhVHlwZSwgICAgICAgICAgICAgICAgICBEYXRhKSwgICAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzE4XSB9LAore1RZUEVfSEFORExFUihjbXNTaWdMdXRBdG9CVHlwZSwgICAgICAgICAgICAgICBMVVRBMkIpLCAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzE5XSB9LAore1RZUEVfSEFORExFUihjbXNTaWdMdXRCdG9BVHlwZSwgICAgICAgICAgICAgICBMVVRCMkEpLCAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzIwXSB9LAore1RZUEVfSEFORExFUihjbXNTaWdVY3JCZ1R5cGUsICAgICAgICAgICAgICAgICBVY3JCZyksICAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzIxXSB9LAore1RZUEVfSEFORExFUihjbXNTaWdDcmRJbmZvVHlwZSwgICAgICAgICAgICAgICBDcmRJbmZvKSwgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzIyXSB9LAore1RZUEVfSEFORExFUihjbXNTaWdNdWx0aVByb2Nlc3NFbGVtZW50VHlwZSwgICBNUEUpLCAgICAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzIzXSB9LAore1RZUEVfSEFORExFUihjbXNTaWdTY3JlZW5pbmdUeXBlLCAgICAgICAgICAgICBTY3JlZW5pbmcpLCAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzI0XSB9LAore1RZUEVfSEFORExFUihjbXNTaWdWaWV3aW5nQ29uZGl0aW9uc1R5cGUsICAgICBWaWV3aW5nQ29uZGl0aW9ucyksICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzI1XSB9LAore1RZUEVfSEFORExFUihjbXNTaWdYWVpUeXBlLCAgICAgICAgICAgICAgICAgICBYWVopLCAgICAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzI2XSB9LAore1RZUEVfSEFORExFUihjbXNDb3JiaXNCcm9rZW5YWVp0eXBlLCAgICAgICAgICBYWVopLCAgICAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzI3XSB9LAore1RZUEVfSEFORExFUihjbXNNb25hY29Ccm9rZW5DdXJ2ZVR5cGUsICAgICAgICBDdXJ2ZSksICAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzI4XSB9LAore1RZUEVfSEFORExFUihjbXNTaWdQcm9maWxlU2VxdWVuY2VJZFR5cGUsICAgICBQcm9maWxlU2VxdWVuY2VJZCksICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzI5XSB9LAore1RZUEVfSEFORExFUihjbXNTaWdEaWN0VHlwZSwgICAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5KSwgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzMwXSB9LAore1RZUEVfSEFORExFUihjbXNTaWdWY2d0VHlwZSwgICAgICAgICAgICAgICAgICB2Y2d0KSwgICAgICAgICAgICAgICAgTlVMTCB9Cit9OworCisKK19jbXNUYWdUeXBlUGx1Z2luQ2h1bmtUeXBlIF9jbXNUYWdUeXBlUGx1Z2luQ2h1bmsgPSB7IE5VTEwgfTsKKworCisKKy8vIER1cGxpY2F0ZXMgdGhlIHpvbmUgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIHBsdWctaW4gaW4gdGhlIG5ldyBjb250ZXh0CitzdGF0aWMKK3ZvaWQgRHVwVGFnVHlwZUxpc3Qoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjLCAKKyAgICAgICAgICAgICAgICAgICAgaW50IGxvYykKK3sKKyAgIF9jbXNUYWdUeXBlUGx1Z2luQ2h1bmtUeXBlIG5ld0hlYWQgPSB7IE5VTEwgfTsKKyAgIF9jbXNUYWdUeXBlTGlua2VkTGlzdCogIGVudHJ5OworICAgX2Ntc1RhZ1R5cGVMaW5rZWRMaXN0KiAgQW50ZXJpb3IgPSBOVUxMOworICAgX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUqIGhlYWQgPSAoX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUqKSBzcmMtPmNodW5rc1tsb2NdOworCisgICAvLyBXYWxrIHRoZSBsaXN0IGNvcHlpbmcgYWxsIG5vZGVzCisgICBmb3IgKGVudHJ5ID0gaGVhZC0+VGFnVHlwZXM7CisgICAgICAgZW50cnkgIT0gTlVMTDsKKyAgICAgICBlbnRyeSA9IGVudHJ5IC0+TmV4dCkgeworCisgICAgICAgICAgIF9jbXNUYWdUeXBlTGlua2VkTGlzdCAqbmV3RW50cnkgPSAoIF9jbXNUYWdUeXBlTGlua2VkTGlzdCAqKSBfY21zU3ViQWxsb2NEdXAoY3R4IC0+TWVtUG9vbCwgZW50cnksIHNpemVvZihfY21zVGFnVHlwZUxpbmtlZExpc3QpKTsKKworICAgICAgICAgICBpZiAobmV3RW50cnkgPT0gTlVMTCkgCisgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgLy8gV2Ugd2FudCB0byBrZWVwIHRoZSBsaW5rZWQgbGlzdCBvcmRlciwgc28gdGhpcyBpcyBhIGxpdHRsZSBiaXQgdHJpY2t5CisgICAgICAgICAgIG5ld0VudHJ5IC0+IE5leHQgPSBOVUxMOworICAgICAgICAgICBpZiAoQW50ZXJpb3IpCisgICAgICAgICAgICAgICBBbnRlcmlvciAtPiBOZXh0ID0gbmV3RW50cnk7CisKKyAgICAgICAgICAgQW50ZXJpb3IgPSBuZXdFbnRyeTsKKworICAgICAgICAgICBpZiAobmV3SGVhZC5UYWdUeXBlcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgbmV3SGVhZC5UYWdUeXBlcyA9IG5ld0VudHJ5OworICAgfQorCisgICBjdHggLT5jaHVua3NbbG9jXSA9IF9jbXNTdWJBbGxvY0R1cChjdHgtPk1lbVBvb2wsICZuZXdIZWFkLCBzaXplb2YoX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUpKTsKK30KKworCit2b2lkIF9jbXNBbGxvY1RhZ1R5cGVQbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQoreworICAgIGlmIChzcmMgIT0gTlVMTCkgeworICAgICAgICAKKyAgICAgICAgLy8gRHVwbGljYXRlIHRoZSBMSVNUCisgICAgICAgIER1cFRhZ1R5cGVMaXN0KGN0eCwgc3JjLCBUYWdUeXBlUGx1Z2luKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN0YXRpYyBfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSBUYWdUeXBlUGx1Z2luQ2h1bmsgPSB7IE5VTEwgfTsKKyAgICAgICAgY3R4IC0+Y2h1bmtzW1RhZ1R5cGVQbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsICZUYWdUeXBlUGx1Z2luQ2h1bmssIHNpemVvZihfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSkpOworICAgIH0KK30KKwordm9pZCBfY21zQWxsb2NNUEVUeXBlUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCit7CisgICAgaWYgKHNyYyAhPSBOVUxMKSB7CisgICAgICAgIAorICAgICAgICAvLyBEdXBsaWNhdGUgdGhlIExJU1QKKyAgICAgICAgRHVwVGFnVHlwZUxpc3QoY3R4LCBzcmMsIE1QRVBsdWdpbik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzdGF0aWMgX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUgVGFnVHlwZVBsdWdpbkNodW5rID0geyBOVUxMIH07CisgICAgICAgIGN0eCAtPmNodW5rc1tNUEVQbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsICZUYWdUeXBlUGx1Z2luQ2h1bmssIHNpemVvZihfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSkpOworICAgIH0KKworfQorCisKKy8vIEJvdGgga2luZCBvZiBwbHVnLWlucyBzaGFyZSBzYW1lIHN0cnVjdHVyZQorY21zQm9vbCAgX2Ntc1JlZ2lzdGVyVGFnVHlwZVBsdWdpbihjbXNDb250ZXh0IGlkLCBjbXNQbHVnaW5CYXNlKiBEYXRhKQoreworICAgIHJldHVybiBSZWdpc3RlclR5cGVzUGx1Z2luKGlkLCBEYXRhLCBUYWdUeXBlUGx1Z2luKTsKK30KKworY21zQm9vbCAgX2Ntc1JlZ2lzdGVyTXVsdGlQcm9jZXNzRWxlbWVudFBsdWdpbihjbXNDb250ZXh0IGlkLCBjbXNQbHVnaW5CYXNlKiBEYXRhKQoreworICAgIHJldHVybiBSZWdpc3RlclR5cGVzUGx1Z2luKGlkLCBEYXRhLE1QRVBsdWdpbik7Cit9CisKKworLy8gV3JhcHBlciBmb3IgdGFnIHR5cGVzCitjbXNUYWdUeXBlSGFuZGxlciogX2Ntc0dldFRhZ1R5cGVIYW5kbGVyKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNUYWdUeXBlU2lnbmF0dXJlIHNpZykKK3sKKyAgICBfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSogY3R4ID0gKCBfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBUYWdUeXBlUGx1Z2luKTsKKworICAgIHJldHVybiBHZXRIYW5kbGVyKHNpZywgY3R4LT5UYWdUeXBlcywgU3VwcG9ydGVkVGFnVHlwZXMpOworfQorCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gVGFnIHN1cHBvcnQgbWFpbiByb3V0aW5lcworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwordHlwZWRlZiBzdHJ1Y3QgX2Ntc1RhZ0xpbmtlZExpc3Rfc3QgeworCisgICAgICAgICAgICBjbXNUYWdTaWduYXR1cmUgU2lnbmF0dXJlOworICAgICAgICAgICAgY21zVGFnRGVzY3JpcHRvciBEZXNjcmlwdG9yOworICAgICAgICAgICAgc3RydWN0IF9jbXNUYWdMaW5rZWRMaXN0X3N0KiBOZXh0OworCit9IF9jbXNUYWdMaW5rZWRMaXN0OworCisvLyBUaGlzIGlzIHRoZSBsaXN0IG9mIGJ1aWx0LWluIHRhZ3MKK3N0YXRpYyBfY21zVGFnTGlua2VkTGlzdCBTdXBwb3J0ZWRUYWdzW10gPSB7CisKKyAgICB7IGNtc1NpZ0FUb0IwVGFnLCAgICAgICAgICAgICAgIHsgMSwgMywgIHsgY21zU2lnTHV0MTZUeXBlLCAgY21zU2lnTHV0QXRvQlR5cGUsIGNtc1NpZ0x1dDhUeXBlfSwgRGVjaWRlTFVUdHlwZUEyQn0sICZTdXBwb3J0ZWRUYWdzWzFdfSwKKyAgICB7IGNtc1NpZ0FUb0IxVGFnLCAgICAgICAgICAgICAgIHsgMSwgMywgIHsgY21zU2lnTHV0MTZUeXBlLCAgY21zU2lnTHV0QXRvQlR5cGUsIGNtc1NpZ0x1dDhUeXBlfSwgRGVjaWRlTFVUdHlwZUEyQn0sICZTdXBwb3J0ZWRUYWdzWzJdfSwKKyAgICB7IGNtc1NpZ0FUb0IyVGFnLCAgICAgICAgICAgICAgIHsgMSwgMywgIHsgY21zU2lnTHV0MTZUeXBlLCAgY21zU2lnTHV0QXRvQlR5cGUsIGNtc1NpZ0x1dDhUeXBlfSwgRGVjaWRlTFVUdHlwZUEyQn0sICZTdXBwb3J0ZWRUYWdzWzNdfSwKKyAgICB7IGNtc1NpZ0JUb0EwVGFnLCAgICAgICAgICAgICAgIHsgMSwgMywgIHsgY21zU2lnTHV0MTZUeXBlLCAgY21zU2lnTHV0QnRvQVR5cGUsIGNtc1NpZ0x1dDhUeXBlfSwgRGVjaWRlTFVUdHlwZUIyQX0sICZTdXBwb3J0ZWRUYWdzWzRdfSwKKyAgICB7IGNtc1NpZ0JUb0ExVGFnLCAgICAgICAgICAgICAgIHsgMSwgMywgIHsgY21zU2lnTHV0MTZUeXBlLCAgY21zU2lnTHV0QnRvQVR5cGUsIGNtc1NpZ0x1dDhUeXBlfSwgRGVjaWRlTFVUdHlwZUIyQX0sICZTdXBwb3J0ZWRUYWdzWzVdfSwKKyAgICB7IGNtc1NpZ0JUb0EyVGFnLCAgICAgICAgICAgICAgIHsgMSwgMywgIHsgY21zU2lnTHV0MTZUeXBlLCAgY21zU2lnTHV0QnRvQVR5cGUsIGNtc1NpZ0x1dDhUeXBlfSwgRGVjaWRlTFVUdHlwZUIyQX0sICZTdXBwb3J0ZWRUYWdzWzZdfSwKKworICAgIC8vIEFsbG93IGNvcmJpcyAgYW5kIGl0cyBicm9rZW4gWFlaIHR5cGUKKyAgICB7IGNtc1NpZ1JlZENvbG9yYW50VGFnLCAgICAgICAgIHsgMSwgMiwgeyBjbXNTaWdYWVpUeXBlLCBjbXNDb3JiaXNCcm9rZW5YWVp0eXBlIH0sIERlY2lkZVhZWnR5cGV9LCAmU3VwcG9ydGVkVGFnc1s3XX0sCisgICAgeyBjbXNTaWdHcmVlbkNvbG9yYW50VGFnLCAgICAgICB7IDEsIDIsIHsgY21zU2lnWFlaVHlwZSwgY21zQ29yYmlzQnJva2VuWFladHlwZSB9LCBEZWNpZGVYWVp0eXBlfSwgJlN1cHBvcnRlZFRhZ3NbOF19LAorICAgIHsgY21zU2lnQmx1ZUNvbG9yYW50VGFnLCAgICAgICAgeyAxLCAyLCB7IGNtc1NpZ1hZWlR5cGUsIGNtc0NvcmJpc0Jyb2tlblhZWnR5cGUgfSwgRGVjaWRlWFladHlwZX0sICZTdXBwb3J0ZWRUYWdzWzldfSwKKworICAgIHsgY21zU2lnUmVkVFJDVGFnLCAgICAgICAgICAgICAgeyAxLCAzLCB7IGNtc1NpZ0N1cnZlVHlwZSwgY21zU2lnUGFyYW1ldHJpY0N1cnZlVHlwZSwgY21zTW9uYWNvQnJva2VuQ3VydmVUeXBlIH0sIERlY2lkZUN1cnZlVHlwZX0sICZTdXBwb3J0ZWRUYWdzWzEwXX0sCisgICAgeyBjbXNTaWdHcmVlblRSQ1RhZywgICAgICAgICAgICB7IDEsIDMsIHsgY21zU2lnQ3VydmVUeXBlLCBjbXNTaWdQYXJhbWV0cmljQ3VydmVUeXBlLCBjbXNNb25hY29Ccm9rZW5DdXJ2ZVR5cGUgfSwgRGVjaWRlQ3VydmVUeXBlfSwgJlN1cHBvcnRlZFRhZ3NbMTFdfSwKKyAgICB7IGNtc1NpZ0JsdWVUUkNUYWcsICAgICAgICAgICAgIHsgMSwgMywgeyBjbXNTaWdDdXJ2ZVR5cGUsIGNtc1NpZ1BhcmFtZXRyaWNDdXJ2ZVR5cGUsIGNtc01vbmFjb0Jyb2tlbkN1cnZlVHlwZSB9LCBEZWNpZGVDdXJ2ZVR5cGV9LCAmU3VwcG9ydGVkVGFnc1sxMl19LAorCisgICAgeyBjbXNTaWdDYWxpYnJhdGlvbkRhdGVUaW1lVGFnLCB7IDEsIDEsIHsgY21zU2lnRGF0ZVRpbWVUeXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1sxM119LAorICAgIHsgY21zU2lnQ2hhclRhcmdldFRhZywgICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ1RleHRUeXBlIH0sICAgICBOVUxMfSwgJlN1cHBvcnRlZFRhZ3NbMTRdfSwKKworICAgIHsgY21zU2lnQ2hyb21hdGljQWRhcHRhdGlvblRhZywgeyA5LCAxLCB7IGNtc1NpZ1MxNUZpeGVkMTZBcnJheVR5cGUgfSwgTlVMTH0sICZTdXBwb3J0ZWRUYWdzWzE1XX0sCisgICAgeyBjbXNTaWdDaHJvbWF0aWNpdHlUYWcsICAgICAgICB7IDEsIDEsIHsgY21zU2lnQ2hyb21hdGljaXR5VHlwZSAgICB9LCBOVUxMfSwgJlN1cHBvcnRlZFRhZ3NbMTZdfSwKKyAgICB7IGNtc1NpZ0NvbG9yYW50T3JkZXJUYWcsICAgICAgIHsgMSwgMSwgeyBjbXNTaWdDb2xvcmFudE9yZGVyVHlwZSAgIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1sxN119LAorICAgIHsgY21zU2lnQ29sb3JhbnRUYWJsZVRhZywgICAgICAgeyAxLCAxLCB7IGNtc1NpZ0NvbG9yYW50VGFibGVUeXBlICAgfSwgTlVMTH0sICZTdXBwb3J0ZWRUYWdzWzE4XX0sCisgICAgeyBjbXNTaWdDb2xvcmFudFRhYmxlT3V0VGFnLCAgICB7IDEsIDEsIHsgY21zU2lnQ29sb3JhbnRUYWJsZVR5cGUgICB9LCBOVUxMfSwgJlN1cHBvcnRlZFRhZ3NbMTldfSwKKworICAgIHsgY21zU2lnQ29weXJpZ2h0VGFnLCAgICAgICAgICAgeyAxLCAzLCB7IGNtc1NpZ1RleHRUeXBlLCAgY21zU2lnTXVsdGlMb2NhbGl6ZWRVbmljb2RlVHlwZSwgY21zU2lnVGV4dERlc2NyaXB0aW9uVHlwZX0sIERlY2lkZVRleHRUeXBlfSwgJlN1cHBvcnRlZFRhZ3NbMjBdfSwKKyAgICB7IGNtc1NpZ0RhdGVUaW1lVGFnLCAgICAgICAgICAgIHsgMSwgMSwgeyBjbXNTaWdEYXRlVGltZVR5cGUgfSwgTlVMTH0sICZTdXBwb3J0ZWRUYWdzWzIxXX0sCisKKyAgICB7IGNtc1NpZ0RldmljZU1mZ0Rlc2NUYWcsICAgICAgIHsgMSwgMywgeyBjbXNTaWdUZXh0RGVzY3JpcHRpb25UeXBlLCBjbXNTaWdNdWx0aUxvY2FsaXplZFVuaWNvZGVUeXBlLCBjbXNTaWdUZXh0VHlwZX0sIERlY2lkZVRleHREZXNjVHlwZX0sICZTdXBwb3J0ZWRUYWdzWzIyXX0sCisgICAgeyBjbXNTaWdEZXZpY2VNb2RlbERlc2NUYWcsICAgICB7IDEsIDMsIHsgY21zU2lnVGV4dERlc2NyaXB0aW9uVHlwZSwgY21zU2lnTXVsdGlMb2NhbGl6ZWRVbmljb2RlVHlwZSwgY21zU2lnVGV4dFR5cGV9LCBEZWNpZGVUZXh0RGVzY1R5cGV9LCAmU3VwcG9ydGVkVGFnc1syM119LAorCisgICAgeyBjbXNTaWdHYW11dFRhZywgICAgICAgICAgICAgICB7IDEsIDMsIHsgY21zU2lnTHV0MTZUeXBlLCBjbXNTaWdMdXRCdG9BVHlwZSwgY21zU2lnTHV0OFR5cGUgfSwgRGVjaWRlTFVUdHlwZUIyQX0sICZTdXBwb3J0ZWRUYWdzWzI0XX0sCisKKyAgICB7IGNtc1NpZ0dyYXlUUkNUYWcsICAgICAgICAgICAgIHsgMSwgMiwgeyBjbXNTaWdDdXJ2ZVR5cGUsIGNtc1NpZ1BhcmFtZXRyaWNDdXJ2ZVR5cGUgfSwgRGVjaWRlQ3VydmVUeXBlfSwgJlN1cHBvcnRlZFRhZ3NbMjVdfSwKKyAgICB7IGNtc1NpZ0x1bWluYW5jZVRhZywgICAgICAgICAgIHsgMSwgMSwgeyBjbXNTaWdYWVpUeXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1syNl19LAorCisgICAgeyBjbXNTaWdNZWRpYUJsYWNrUG9pbnRUYWcsICAgICB7IDEsIDIsIHsgY21zU2lnWFlaVHlwZSwgY21zQ29yYmlzQnJva2VuWFladHlwZSB9LCBOVUxMfSwgJlN1cHBvcnRlZFRhZ3NbMjddfSwKKyAgICB7IGNtc1NpZ01lZGlhV2hpdGVQb2ludFRhZywgICAgIHsgMSwgMiwgeyBjbXNTaWdYWVpUeXBlLCBjbXNDb3JiaXNCcm9rZW5YWVp0eXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1syOF19LAorCisgICAgeyBjbXNTaWdOYW1lZENvbG9yMlRhZywgICAgICAgICB7IDEsIDEsIHsgY21zU2lnTmFtZWRDb2xvcjJUeXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1syOV19LAorCisgICAgeyBjbXNTaWdQcmV2aWV3MFRhZywgICAgICAgICAgICB7IDEsIDMsICB7IGNtc1NpZ0x1dDE2VHlwZSwgY21zU2lnTHV0QnRvQVR5cGUsIGNtc1NpZ0x1dDhUeXBlIH0sIERlY2lkZUxVVHR5cGVCMkF9LCAmU3VwcG9ydGVkVGFnc1szMF19LAorICAgIHsgY21zU2lnUHJldmlldzFUYWcsICAgICAgICAgICAgeyAxLCAzLCAgeyBjbXNTaWdMdXQxNlR5cGUsIGNtc1NpZ0x1dEJ0b0FUeXBlLCBjbXNTaWdMdXQ4VHlwZSB9LCBEZWNpZGVMVVR0eXBlQjJBfSwgJlN1cHBvcnRlZFRhZ3NbMzFdfSwKKyAgICB7IGNtc1NpZ1ByZXZpZXcyVGFnLCAgICAgICAgICAgIHsgMSwgMywgIHsgY21zU2lnTHV0MTZUeXBlLCBjbXNTaWdMdXRCdG9BVHlwZSwgY21zU2lnTHV0OFR5cGUgfSwgRGVjaWRlTFVUdHlwZUIyQX0sICZTdXBwb3J0ZWRUYWdzWzMyXX0sCisKKyAgICB7IGNtc1NpZ1Byb2ZpbGVEZXNjcmlwdGlvblRhZywgIHsgMSwgMywgeyBjbXNTaWdUZXh0RGVzY3JpcHRpb25UeXBlLCBjbXNTaWdNdWx0aUxvY2FsaXplZFVuaWNvZGVUeXBlLCBjbXNTaWdUZXh0VHlwZX0sIERlY2lkZVRleHREZXNjVHlwZX0sICZTdXBwb3J0ZWRUYWdzWzMzXX0sCisgICAgeyBjbXNTaWdQcm9maWxlU2VxdWVuY2VEZXNjVGFnLCB7IDEsIDEsIHsgY21zU2lnUHJvZmlsZVNlcXVlbmNlRGVzY1R5cGUgfSwgTlVMTH0sICZTdXBwb3J0ZWRUYWdzWzM0XX0sCisgICAgeyBjbXNTaWdUZWNobm9sb2d5VGFnLCAgICAgICAgICB7IDEsIDEsIHsgY21zU2lnU2lnbmF0dXJlVHlwZSB9LCBOVUxMfSwgICZTdXBwb3J0ZWRUYWdzWzM1XX0sCisKKyAgICB7IGNtc1NpZ0NvbG9yaW1ldHJpY0ludGVudEltYWdlU3RhdGVUYWcsICAgeyAxLCAxLCB7IGNtc1NpZ1NpZ25hdHVyZVR5cGUgfSwgTlVMTH0sICZTdXBwb3J0ZWRUYWdzWzM2XX0sCisgICAgeyBjbXNTaWdQZXJjZXB0dWFsUmVuZGVyaW5nSW50ZW50R2FtdXRUYWcsIHsgMSwgMSwgeyBjbXNTaWdTaWduYXR1cmVUeXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1szN119LAorICAgIHsgY21zU2lnU2F0dXJhdGlvblJlbmRlcmluZ0ludGVudEdhbXV0VGFnLCB7IDEsIDEsIHsgY21zU2lnU2lnbmF0dXJlVHlwZSB9LCBOVUxMfSwgJlN1cHBvcnRlZFRhZ3NbMzhdfSwKKworICAgIHsgY21zU2lnTWVhc3VyZW1lbnRUYWcsICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ01lYXN1cmVtZW50VHlwZSB9LCBOVUxMfSwgJlN1cHBvcnRlZFRhZ3NbMzldfSwKKworICAgIHsgY21zU2lnUHMyQ1JEMFRhZywgICAgICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ0RhdGFUeXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1s0MF19LAorICAgIHsgY21zU2lnUHMyQ1JEMVRhZywgICAgICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ0RhdGFUeXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1s0MV19LAorICAgIHsgY21zU2lnUHMyQ1JEMlRhZywgICAgICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ0RhdGFUeXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1s0Ml19LAorICAgIHsgY21zU2lnUHMyQ1JEM1RhZywgICAgICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ0RhdGFUeXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1s0M119LAorICAgIHsgY21zU2lnUHMyQ1NBVGFnLCAgICAgICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ0RhdGFUeXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1s0NF19LAorICAgIHsgY21zU2lnUHMyUmVuZGVyaW5nSW50ZW50VGFnLCAgeyAxLCAxLCB7IGNtc1NpZ0RhdGFUeXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1s0NV19LAorCisgICAgeyBjbXNTaWdWaWV3aW5nQ29uZERlc2NUYWcsICAgICB7IDEsIDMsIHsgY21zU2lnVGV4dERlc2NyaXB0aW9uVHlwZSwgY21zU2lnTXVsdGlMb2NhbGl6ZWRVbmljb2RlVHlwZSwgY21zU2lnVGV4dFR5cGV9LCBEZWNpZGVUZXh0RGVzY1R5cGV9LCAmU3VwcG9ydGVkVGFnc1s0Nl19LAorCisgICAgeyBjbXNTaWdVY3JCZ1RhZywgICAgICAgICAgICAgICB7IDEsIDEsIHsgY21zU2lnVWNyQmdUeXBlfSwgTlVMTH0sICAgICZTdXBwb3J0ZWRUYWdzWzQ3XX0sCisgICAgeyBjbXNTaWdDcmRJbmZvVGFnLCAgICAgICAgICAgICB7IDEsIDEsIHsgY21zU2lnQ3JkSW5mb1R5cGV9LCBOVUxMfSwgICZTdXBwb3J0ZWRUYWdzWzQ4XX0sCisKKyAgICB7IGNtc1NpZ0RUb0IwVGFnLCAgICAgICAgICAgICAgIHsgMSwgMSwgeyBjbXNTaWdNdWx0aVByb2Nlc3NFbGVtZW50VHlwZX0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1s0OV19LAorICAgIHsgY21zU2lnRFRvQjFUYWcsICAgICAgICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ011bHRpUHJvY2Vzc0VsZW1lbnRUeXBlfSwgTlVMTH0sICZTdXBwb3J0ZWRUYWdzWzUwXX0sCisgICAgeyBjbXNTaWdEVG9CMlRhZywgICAgICAgICAgICAgICB7IDEsIDEsIHsgY21zU2lnTXVsdGlQcm9jZXNzRWxlbWVudFR5cGV9LCBOVUxMfSwgJlN1cHBvcnRlZFRhZ3NbNTFdfSwKKyAgICB7IGNtc1NpZ0RUb0IzVGFnLCAgICAgICAgICAgICAgIHsgMSwgMSwgeyBjbXNTaWdNdWx0aVByb2Nlc3NFbGVtZW50VHlwZX0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1s1Ml19LAorICAgIHsgY21zU2lnQlRvRDBUYWcsICAgICAgICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ011bHRpUHJvY2Vzc0VsZW1lbnRUeXBlfSwgTlVMTH0sICZTdXBwb3J0ZWRUYWdzWzUzXX0sCisgICAgeyBjbXNTaWdCVG9EMVRhZywgICAgICAgICAgICAgICB7IDEsIDEsIHsgY21zU2lnTXVsdGlQcm9jZXNzRWxlbWVudFR5cGV9LCBOVUxMfSwgJlN1cHBvcnRlZFRhZ3NbNTRdfSwKKyAgICB7IGNtc1NpZ0JUb0QyVGFnLCAgICAgICAgICAgICAgIHsgMSwgMSwgeyBjbXNTaWdNdWx0aVByb2Nlc3NFbGVtZW50VHlwZX0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1s1NV19LAorICAgIHsgY21zU2lnQlRvRDNUYWcsICAgICAgICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ011bHRpUHJvY2Vzc0VsZW1lbnRUeXBlfSwgTlVMTH0sICZTdXBwb3J0ZWRUYWdzWzU2XX0sCisKKyAgICB7IGNtc1NpZ1NjcmVlbmluZ0Rlc2NUYWcsICAgICAgIHsgMSwgMSwgeyBjbXNTaWdUZXh0RGVzY3JpcHRpb25UeXBlIH0sICAgIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1s1N119LAorICAgIHsgY21zU2lnVmlld2luZ0NvbmRpdGlvbnNUYWcsICAgeyAxLCAxLCB7IGNtc1NpZ1ZpZXdpbmdDb25kaXRpb25zVHlwZSB9LCAgTlVMTH0sICZTdXBwb3J0ZWRUYWdzWzU4XX0sCisKKyAgICB7IGNtc1NpZ1NjcmVlbmluZ1RhZywgICAgICAgICAgIHsgMSwgMSwgeyBjbXNTaWdTY3JlZW5pbmdUeXBlfSwgICAgICAgICAgTlVMTCB9LCAmU3VwcG9ydGVkVGFnc1s1OV19LAorICAgIHsgY21zU2lnVmNndFRhZywgICAgICAgICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ1ZjZ3RUeXBlfSwgICAgICAgICAgICAgICBOVUxMIH0sICZTdXBwb3J0ZWRUYWdzWzYwXX0sCisgICAgeyBjbXNTaWdNZXRhVGFnLCAgICAgICAgICAgICAgICB7IDEsIDEsIHsgY21zU2lnRGljdFR5cGV9LCAgICAgICAgICAgICAgIE5VTEwgfSwgJlN1cHBvcnRlZFRhZ3NbNjFdfSwKKyAgICB7IGNtc1NpZ1Byb2ZpbGVTZXF1ZW5jZUlkVGFnLCAgIHsgMSwgMSwgeyBjbXNTaWdQcm9maWxlU2VxdWVuY2VJZFR5cGV9LCAgTlVMTCB9LCAmU3VwcG9ydGVkVGFnc1s2Ml19LAorICAgIHsgY21zU2lnUHJvZmlsZURlc2NyaXB0aW9uTUxUYWcseyAxLCAxLCB7IGNtc1NpZ011bHRpTG9jYWxpemVkVW5pY29kZVR5cGV9LCBOVUxMfSwgJlN1cHBvcnRlZFRhZ3NbNjNdfSwKKyAgICB7IGNtc1NpZ0FyZ3lsbEFydHNUYWcsICAgICAgICAgIHsgOSwgMSwgeyBjbXNTaWdTMTVGaXhlZDE2QXJyYXlUeXBlfSwgICAgTlVMTH0sIE5VTEx9CisKKworfTsKKworLyoKKyAgICBOb3Qgc3VwcG9ydGVkICAgICAgICAgICAgICAgICBXaHkKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PSAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIGNtc1NpZ091dHB1dFJlc3BvbnNlVGFnICAgPT0+IFdBUk5JTkcsIFBPU1NJQkxFIFBBVEVOVCBPTiBUSElTIFNVQkpFQ1QhCisgICAgY21zU2lnTmFtZWRDb2xvclRhZyAgICAgICA9PT4gRGVwcmVjYXRlZAorICAgIGNtc1NpZ0RhdGFUYWcgICAgICAgICAgICAgPT0+IEFuY2llbnQsIHVudXNlZAorICAgIGNtc1NpZ0RldmljZVNldHRpbmdzVGFnICAgPT0+IERlcHJlY2F0ZWQsIHVzZWxlc3MKKyovCisKKworX2Ntc1RhZ1BsdWdpbkNodW5rVHlwZSBfY21zVGFnUGx1Z2luQ2h1bmsgPSB7IE5VTEwgfTsKKworCisvLyBEdXBsaWNhdGVzIHRoZSB6b25lIG9mIG1lbW9yeSB1c2VkIGJ5IHRoZSBwbHVnLWluIGluIHRoZSBuZXcgY29udGV4dAorc3RhdGljCit2b2lkIER1cFRhZ0xpc3Qoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQoreworICAgX2Ntc1RhZ1BsdWdpbkNodW5rVHlwZSBuZXdIZWFkID0geyBOVUxMIH07CisgICBfY21zVGFnTGlua2VkTGlzdCogIGVudHJ5OworICAgX2Ntc1RhZ0xpbmtlZExpc3QqICBBbnRlcmlvciA9IE5VTEw7CisgICBfY21zVGFnUGx1Z2luQ2h1bmtUeXBlKiBoZWFkID0gKF9jbXNUYWdQbHVnaW5DaHVua1R5cGUqKSBzcmMtPmNodW5rc1tUYWdQbHVnaW5dOworCisgICAvLyBXYWxrIHRoZSBsaXN0IGNvcHlpbmcgYWxsIG5vZGVzCisgICBmb3IgKGVudHJ5ID0gaGVhZC0+VGFnOworICAgICAgIGVudHJ5ICE9IE5VTEw7CisgICAgICAgZW50cnkgPSBlbnRyeSAtPk5leHQpIHsKKworICAgICAgICAgICBfY21zVGFnTGlua2VkTGlzdCAqbmV3RW50cnkgPSAoIF9jbXNUYWdMaW5rZWRMaXN0ICopIF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCBlbnRyeSwgc2l6ZW9mKF9jbXNUYWdMaW5rZWRMaXN0KSk7CisKKyAgICAgICAgICAgaWYgKG5ld0VudHJ5ID09IE5VTEwpIAorICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgIC8vIFdlIHdhbnQgdG8ga2VlcCB0aGUgbGlua2VkIGxpc3Qgb3JkZXIsIHNvIHRoaXMgaXMgYSBsaXR0bGUgYml0IHRyaWNreQorICAgICAgICAgICBuZXdFbnRyeSAtPiBOZXh0ID0gTlVMTDsKKyAgICAgICAgICAgaWYgKEFudGVyaW9yKQorICAgICAgICAgICAgICAgQW50ZXJpb3IgLT4gTmV4dCA9IG5ld0VudHJ5OworCisgICAgICAgICAgIEFudGVyaW9yID0gbmV3RW50cnk7CisKKyAgICAgICAgICAgaWYgKG5ld0hlYWQuVGFnID09IE5VTEwpCisgICAgICAgICAgICAgICBuZXdIZWFkLlRhZyA9IG5ld0VudHJ5OworICAgfQorCisgICBjdHggLT5jaHVua3NbVGFnUGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHgtPk1lbVBvb2wsICZuZXdIZWFkLCBzaXplb2YoX2Ntc1RhZ1BsdWdpbkNodW5rVHlwZSkpOworfQorCit2b2lkIF9jbXNBbGxvY1RhZ1BsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCit7CisgICAgaWYgKHNyYyAhPSBOVUxMKSB7CisKKyAgICAgICAgRHVwVGFnTGlzdChjdHgsIHNyYyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzdGF0aWMgX2Ntc1RhZ1BsdWdpbkNodW5rVHlwZSBUYWdQbHVnaW5DaHVuayA9IHsgTlVMTCB9OworICAgICAgICBjdHggLT5jaHVua3NbVGFnUGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCAmVGFnUGx1Z2luQ2h1bmssIHNpemVvZihfY21zVGFnUGx1Z2luQ2h1bmtUeXBlKSk7CisgICAgfQorCit9CisKK2Ntc0Jvb2wgIF9jbXNSZWdpc3RlclRhZ1BsdWdpbihjbXNDb250ZXh0IGlkLCBjbXNQbHVnaW5CYXNlKiBEYXRhKQoreworICAgIGNtc1BsdWdpblRhZyogUGx1Z2luID0gKGNtc1BsdWdpblRhZyopIERhdGE7CisgICAgX2Ntc1RhZ0xpbmtlZExpc3QgKnB0OworICAgIF9jbXNUYWdQbHVnaW5DaHVua1R5cGUqIFRhZ1BsdWdpbkNodW5rID0gKCBfY21zVGFnUGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhpZCwgVGFnUGx1Z2luKTsKKworICAgIGlmIChEYXRhID09IE5VTEwpIHsKKworICAgICAgICBUYWdQbHVnaW5DaHVuay0+VGFnID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcHQgPSAoX2Ntc1RhZ0xpbmtlZExpc3QqKSBfY21zUGx1Z2luTWFsbG9jKGlkLCBzaXplb2YoX2Ntc1RhZ0xpbmtlZExpc3QpKTsKKyAgICBpZiAocHQgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworCisgICAgcHQgLT5TaWduYXR1cmUgID0gUGx1Z2luIC0+U2lnbmF0dXJlOworICAgIHB0IC0+RGVzY3JpcHRvciA9IFBsdWdpbiAtPkRlc2NyaXB0b3I7CisgICAgcHQgLT5OZXh0ICAgICAgID0gVGFnUGx1Z2luQ2h1bmsgLT5UYWc7CisKKyAgICBUYWdQbHVnaW5DaHVuayAtPlRhZyA9IHB0OworICAgIAorICAgIHJldHVybiBUUlVFOworfQorCisvLyBSZXR1cm4gYSBkZXNjcmlwdG9yIGZvciBhIGdpdmVuIHRhZyBvciBOVUxMCitjbXNUYWdEZXNjcmlwdG9yKiBfY21zR2V0VGFnRGVzY3JpcHRvcihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVGFnU2lnbmF0dXJlIHNpZykKK3sKKyAgICBfY21zVGFnTGlua2VkTGlzdCogcHQ7CisgICAgX2Ntc1RhZ1BsdWdpbkNodW5rVHlwZSogVGFnUGx1Z2luQ2h1bmsgPSAoIF9jbXNUYWdQbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgVGFnUGx1Z2luKTsKKworICAgIGZvciAocHQgPSBUYWdQbHVnaW5DaHVuay0+VGFnOworICAgICAgICAgICAgIHB0ICE9IE5VTEw7CisgICAgICAgICAgICAgcHQgPSBwdCAtPk5leHQpIHsKKworICAgICAgICAgICAgICAgIGlmIChzaWcgPT0gcHQgLT4gU2lnbmF0dXJlKSByZXR1cm4gJnB0IC0+RGVzY3JpcHRvcjsKKyAgICB9CisKKyAgICBmb3IgKHB0ID0gU3VwcG9ydGVkVGFnczsKKyAgICAgICAgICAgIHB0ICE9IE5VTEw7CisgICAgICAgICAgICBwdCA9IHB0IC0+TmV4dCkgeworCisgICAgICAgICAgICAgICAgaWYgKHNpZyA9PSBwdCAtPiBTaWduYXR1cmUpIHJldHVybiAmcHQgLT5EZXNjcmlwdG9yOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXN2aXJ0LmMgYi90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXN2aXJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVmZjFmNwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2Ntc3ZpcnQuYwpAQCAtMCwwICsxLDEyMDggQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8KKy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisvLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKKy8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisvLworLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKy8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorLy8KKy8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCisvLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQorLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisvLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKworI2luY2x1ZGUgImxjbXMyX2ludGVybmFsLmgiCisKKy8vIFZpcnR1YWwgKGJ1aWx0LWluKSBwcm9maWxlcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljCitjbXNCb29sIFNldFRleHRUYWdzKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjb25zdCB3Y2hhcl90KiBEZXNjcmlwdGlvbikKK3sKKyAgICBjbXNNTFUgKkRlc2NyaXB0aW9uTUxVLCAqQ29weXJpZ2h0TUxVOworICAgIGNtc0Jvb2wgIHJjID0gRkFMU0U7CisgICAgY21zQ29udGV4dCBDb250ZXh0SUQgPSBjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKTsKKworICAgIERlc2NyaXB0aW9uTUxVICA9IGNtc01MVWFsbG9jKENvbnRleHRJRCwgMSk7CisgICAgQ29weXJpZ2h0TUxVICAgID0gY21zTUxVYWxsb2MoQ29udGV4dElELCAxKTsKKworICAgIGlmIChEZXNjcmlwdGlvbk1MVSA9PSBOVUxMIHx8IENvcHlyaWdodE1MVSA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgaWYgKCFjbXNNTFVzZXRXaWRlKERlc2NyaXB0aW9uTUxVLCAgImVuIiwgIlVTIiwgRGVzY3JpcHRpb24pKSBnb3RvIEVycm9yOworICAgIGlmICghY21zTUxVc2V0V2lkZShDb3B5cmlnaHRNTFUsICAgICJlbiIsICJVUyIsIEwiTm8gY29weXJpZ2h0LCB1c2UgZnJlZWx5IikpIGdvdG8gRXJyb3I7CisKKyAgICBpZiAoIWNtc1dyaXRlVGFnKGhQcm9maWxlLCBjbXNTaWdQcm9maWxlRGVzY3JpcHRpb25UYWcsICBEZXNjcmlwdGlvbk1MVSkpIGdvdG8gRXJyb3I7CisgICAgaWYgKCFjbXNXcml0ZVRhZyhoUHJvZmlsZSwgY21zU2lnQ29weXJpZ2h0VGFnLCAgICAgICAgICAgQ29weXJpZ2h0TUxVKSkgZ290byBFcnJvcjsKKworICAgIHJjID0gVFJVRTsKKworRXJyb3I6CisKKyAgICBpZiAoRGVzY3JpcHRpb25NTFUpCisgICAgICAgIGNtc01MVWZyZWUoRGVzY3JpcHRpb25NTFUpOworICAgIGlmIChDb3B5cmlnaHRNTFUpCisgICAgICAgIGNtc01MVWZyZWUoQ29weXJpZ2h0TUxVKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKworc3RhdGljCitjbXNCb29sICBTZXRTZXFEZXNjVGFnKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjb25zdCBjaGFyKiBNb2RlbCkKK3sKKyAgICBjbXNCb29sICByYyA9IEZBTFNFOworICAgIGNtc0NvbnRleHQgQ29udGV4dElEID0gY21zR2V0UHJvZmlsZUNvbnRleHRJRChoUHJvZmlsZSk7CisgICAgY21zU0VRKiBTZXEgPSBjbXNBbGxvY1Byb2ZpbGVTZXF1ZW5jZURlc2NyaXB0aW9uKENvbnRleHRJRCwgMSk7CisKKyAgICBpZiAoU2VxID09IE5VTEwpIHJldHVybiBGQUxTRTsKKworICAgIFNlcS0+c2VxWzBdLmRldmljZU1mZyA9IChjbXNTaWduYXR1cmUpIDA7CisgICAgU2VxLT5zZXFbMF0uZGV2aWNlTW9kZWwgPSAoY21zU2lnbmF0dXJlKSAwOworCisjaWZkZWYgQ01TX0RPTlRfVVNFX0lOVDY0CisgICAgU2VxLT5zZXFbMF0uYXR0cmlidXRlc1swXSA9IDA7CisgICAgU2VxLT5zZXFbMF0uYXR0cmlidXRlc1sxXSA9IDA7CisjZWxzZQorICAgIFNlcS0+c2VxWzBdLmF0dHJpYnV0ZXMgPSAwOworI2VuZGlmCisKKyAgICBTZXEtPnNlcVswXS50ZWNobm9sb2d5ID0gKGNtc1RlY2hub2xvZ3lTaWduYXR1cmUpIDA7CisKKyAgICBjbXNNTFVzZXRBU0NJSSggU2VxLT5zZXFbMF0uTWFudWZhY3R1cmVyLCBjbXNOb0xhbmd1YWdlLCBjbXNOb0NvdW50cnksICJMaXR0bGUgQ01TIik7CisgICAgY21zTUxVc2V0QVNDSUkoIFNlcS0+c2VxWzBdLk1vZGVsLCAgICAgICAgY21zTm9MYW5ndWFnZSwgY21zTm9Db3VudHJ5LCBNb2RlbCk7CisKKyAgICBpZiAoIV9jbXNXcml0ZVByb2ZpbGVTZXF1ZW5jZShoUHJvZmlsZSwgU2VxKSkgZ290byBFcnJvcjsKKworICAgIHJjID0gVFJVRTsKKworRXJyb3I6CisgICAgaWYgKFNlcSkKKyAgICAgICAgY21zRnJlZVByb2ZpbGVTZXF1ZW5jZURlc2NyaXB0aW9uKFNlcSk7CisKKyAgICByZXR1cm4gcmM7Cit9CisKKworCisvLyBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBwcm9maWxlIGJhc2VkIG9uIFdoaXRlIHBvaW50LCBwcmltYXJpZXMgYW5kCisvLyB0cmFuc2ZlciBmdW5jdGlvbnMuCitjbXNIUFJPRklMRSBDTVNFWFBPUlQgY21zQ3JlYXRlUkdCUHJvZmlsZVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0NJRXh5WSogV2hpdGVQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0NJRXh5WVRSSVBMRSogUHJpbWFyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVG9uZUN1cnZlKiBjb25zdCBUcmFuc2ZlckZ1bmN0aW9uWzNdKQoreworICAgIGNtc0hQUk9GSUxFIGhJQ0M7CisgICAgY21zTUFUMyBNQ29sb3JhbnRzOworICAgIGNtc0NJRVhZWlRSSVBMRSBDb2xvcmFudHM7CisgICAgY21zQ0lFeHlZIE1heFdoaXRlOworICAgIGNtc01BVDMgQ0hBRDsKKyAgICBjbXNDSUVYWVogV2hpdGVQb2ludFhZWjsKKworICAgIGhJQ0MgPSBjbXNDcmVhdGVQcm9maWxlUGxhY2Vob2xkZXIoQ29udGV4dElEKTsKKyAgICBpZiAoIWhJQ0MpICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4ndCBhbGxvY2F0ZQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGNtc1NldFByb2ZpbGVWZXJzaW9uKGhJQ0MsIDQuMyk7CisKKyAgICBjbXNTZXREZXZpY2VDbGFzcyhoSUNDLCAgICAgIGNtc1NpZ0Rpc3BsYXlDbGFzcyk7CisgICAgY21zU2V0Q29sb3JTcGFjZShoSUNDLCAgICAgICBjbXNTaWdSZ2JEYXRhKTsKKyAgICBjbXNTZXRQQ1MoaElDQywgICAgICAgICAgICAgIGNtc1NpZ1hZWkRhdGEpOworCisgICAgY21zU2V0SGVhZGVyUmVuZGVyaW5nSW50ZW50KGhJQ0MsICBJTlRFTlRfUEVSQ0VQVFVBTCk7CisKKworICAgIC8vIEltcGxlbWVudCBwcm9maWxlIHVzaW5nIGZvbGxvd2luZyB0YWdzOgorICAgIC8vCisgICAgLy8gIDEgY21zU2lnUHJvZmlsZURlc2NyaXB0aW9uVGFnCisgICAgLy8gIDIgY21zU2lnTWVkaWFXaGl0ZVBvaW50VGFnCisgICAgLy8gIDMgY21zU2lnUmVkQ29sb3JhbnRUYWcKKyAgICAvLyAgNCBjbXNTaWdHcmVlbkNvbG9yYW50VGFnCisgICAgLy8gIDUgY21zU2lnQmx1ZUNvbG9yYW50VGFnCisgICAgLy8gIDYgY21zU2lnUmVkVFJDVGFnCisgICAgLy8gIDcgY21zU2lnR3JlZW5UUkNUYWcKKyAgICAvLyAgOCBjbXNTaWdCbHVlVFJDVGFnCisgICAgLy8gIDkgQ2hyb21hdGljIGFkYXB0YXRpb24gVGFnCisgICAgLy8gVGhpcyBjb25mb3JtcyBhIHN0YW5kYXJkIFJHQiBEaXNwbGF5UHJvZmlsZSBhcyBzYXlzIElDQywgYW5kIHRoZW4gSSBhZGQgKEFzIHBlciBhZGRlbmR1bSBJSSkKKyAgICAvLyAxMCBjbXNTaWdDaHJvbWF0aWNpdHlUYWcKKworCisgICAgaWYgKCFTZXRUZXh0VGFncyhoSUNDLCBMIlJHQiBidWlsdC1pbiIpKSBnb3RvIEVycm9yOworCisgICAgaWYgKFdoaXRlUG9pbnQpIHsKKworICAgICAgICBpZiAoIWNtc1dyaXRlVGFnKGhJQ0MsIGNtc1NpZ01lZGlhV2hpdGVQb2ludFRhZywgY21zRDUwX1hZWigpKSkgZ290byBFcnJvcjsKKworICAgICAgICBjbXN4eVkyWFlaKCZXaGl0ZVBvaW50WFlaLCBXaGl0ZVBvaW50KTsKKyAgICAgICAgX2Ntc0FkYXB0YXRpb25NYXRyaXgoJkNIQUQsIE5VTEwsICZXaGl0ZVBvaW50WFlaLCBjbXNENTBfWFlaKCkpOworCisgICAgICAgIC8vIFRoaXMgaXMgYSBWNCB0YWcsIGJ1dCBtYW55IENNTSBkb2VzIHJlYWQgYW5kIHVuZGVyc3RhbmQgaXQgbm8gbWF0dGVyIHdoaWNoIHZlcnNpb24KKyAgICAgICAgaWYgKCFjbXNXcml0ZVRhZyhoSUNDLCBjbXNTaWdDaHJvbWF0aWNBZGFwdGF0aW9uVGFnLCAodm9pZCopICZDSEFEKSkgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICBpZiAoV2hpdGVQb2ludCAmJiBQcmltYXJpZXMpIHsKKworICAgICAgICBNYXhXaGl0ZS54ID0gIFdoaXRlUG9pbnQgLT4geDsKKyAgICAgICAgTWF4V2hpdGUueSA9ICBXaGl0ZVBvaW50IC0+IHk7CisgICAgICAgIE1heFdoaXRlLlkgPSAgMS4wOworCisgICAgICAgIGlmICghX2Ntc0J1aWxkUkdCMlhZWnRyYW5zZmVyTWF0cml4KCZNQ29sb3JhbnRzLCAmTWF4V2hpdGUsIFByaW1hcmllcykpIGdvdG8gRXJyb3I7CisKKyAgICAgICAgQ29sb3JhbnRzLlJlZC5YICAgPSBNQ29sb3JhbnRzLnZbMF0ublswXTsKKyAgICAgICAgQ29sb3JhbnRzLlJlZC5ZICAgPSBNQ29sb3JhbnRzLnZbMV0ublswXTsKKyAgICAgICAgQ29sb3JhbnRzLlJlZC5aICAgPSBNQ29sb3JhbnRzLnZbMl0ublswXTsKKworICAgICAgICBDb2xvcmFudHMuR3JlZW4uWCA9IE1Db2xvcmFudHMudlswXS5uWzFdOworICAgICAgICBDb2xvcmFudHMuR3JlZW4uWSA9IE1Db2xvcmFudHMudlsxXS5uWzFdOworICAgICAgICBDb2xvcmFudHMuR3JlZW4uWiA9IE1Db2xvcmFudHMudlsyXS5uWzFdOworCisgICAgICAgIENvbG9yYW50cy5CbHVlLlggID0gTUNvbG9yYW50cy52WzBdLm5bMl07CisgICAgICAgIENvbG9yYW50cy5CbHVlLlkgID0gTUNvbG9yYW50cy52WzFdLm5bMl07CisgICAgICAgIENvbG9yYW50cy5CbHVlLlogID0gTUNvbG9yYW50cy52WzJdLm5bMl07CisKKyAgICAgICAgaWYgKCFjbXNXcml0ZVRhZyhoSUNDLCBjbXNTaWdSZWRDb2xvcmFudFRhZywgICAodm9pZCopICZDb2xvcmFudHMuUmVkKSkgZ290byBFcnJvcjsKKyAgICAgICAgaWYgKCFjbXNXcml0ZVRhZyhoSUNDLCBjbXNTaWdCbHVlQ29sb3JhbnRUYWcsICAodm9pZCopICZDb2xvcmFudHMuQmx1ZSkpIGdvdG8gRXJyb3I7CisgICAgICAgIGlmICghY21zV3JpdGVUYWcoaElDQywgY21zU2lnR3JlZW5Db2xvcmFudFRhZywgKHZvaWQqKSAmQ29sb3JhbnRzLkdyZWVuKSkgZ290byBFcnJvcjsKKyAgICB9CisKKworICAgIGlmIChUcmFuc2ZlckZ1bmN0aW9uKSB7CisKKyAgICAgICAgLy8gVHJpZXMgdG8gbWluaW1pemUgc3BhY2UuIFRoYW5rcyB0byBSaWNoYXJkIEh1Z2hlcyBmb3IgdGhpcyBuaWNlIGlkZWEgICAgICAgICAKKyAgICAgICAgaWYgKCFjbXNXcml0ZVRhZyhoSUNDLCBjbXNTaWdSZWRUUkNUYWcsICAgKHZvaWQqKSBUcmFuc2ZlckZ1bmN0aW9uWzBdKSkgZ290byBFcnJvcjsKKworICAgICAgICBpZiAoVHJhbnNmZXJGdW5jdGlvblsxXSA9PSBUcmFuc2ZlckZ1bmN0aW9uWzBdKSB7CisKKyAgICAgICAgICAgIGlmICghY21zTGlua1RhZyAoaElDQywgY21zU2lnR3JlZW5UUkNUYWcsIGNtc1NpZ1JlZFRSQ1RhZykpIGdvdG8gRXJyb3I7CisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgaWYgKCFjbXNXcml0ZVRhZyhoSUNDLCBjbXNTaWdHcmVlblRSQ1RhZywgKHZvaWQqKSBUcmFuc2ZlckZ1bmN0aW9uWzFdKSkgZ290byBFcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChUcmFuc2ZlckZ1bmN0aW9uWzJdID09IFRyYW5zZmVyRnVuY3Rpb25bMF0pIHsKKworICAgICAgICAgICAgaWYgKCFjbXNMaW5rVGFnIChoSUNDLCBjbXNTaWdCbHVlVFJDVGFnLCBjbXNTaWdSZWRUUkNUYWcpKSBnb3RvIEVycm9yOworCisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIGlmICghY21zV3JpdGVUYWcoaElDQywgY21zU2lnQmx1ZVRSQ1RhZywgKHZvaWQqKSBUcmFuc2ZlckZ1bmN0aW9uWzJdKSkgZ290byBFcnJvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChQcmltYXJpZXMpIHsKKyAgICAgICAgaWYgKCFjbXNXcml0ZVRhZyhoSUNDLCBjbXNTaWdDaHJvbWF0aWNpdHlUYWcsICh2b2lkKikgUHJpbWFyaWVzKSkgZ290byBFcnJvcjsKKyAgICB9CisKKworICAgIHJldHVybiBoSUNDOworCitFcnJvcjoKKyAgICBpZiAoaElDQykKKyAgICAgICAgY21zQ2xvc2VQcm9maWxlKGhJQ0MpOworICAgIHJldHVybiBOVUxMOworfQorCitjbXNIUFJPRklMRSBDTVNFWFBPUlQgY21zQ3JlYXRlUkdCUHJvZmlsZShjb25zdCBjbXNDSUV4eVkqIFdoaXRlUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNDSUV4eVlUUklQTEUqIFByaW1hcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1RvbmVDdXJ2ZSogY29uc3QgVHJhbnNmZXJGdW5jdGlvblszXSkKK3sKKyAgICByZXR1cm4gY21zQ3JlYXRlUkdCUHJvZmlsZVRIUihOVUxMLCBXaGl0ZVBvaW50LCBQcmltYXJpZXMsIFRyYW5zZmVyRnVuY3Rpb24pOworfQorCisKKworLy8gVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgcHJvZmlsZSBiYXNlZCBvbiBXaGl0ZSBwb2ludCBhbmQgdHJhbnNmZXIgZnVuY3Rpb24uCitjbXNIUFJPRklMRSBDTVNFWFBPUlQgY21zQ3JlYXRlR3JheVByb2ZpbGVUSFIoY21zQ29udGV4dCBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zQ0lFeHlZKiBXaGl0ZVBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1RvbmVDdXJ2ZSogVHJhbnNmZXJGdW5jdGlvbikKK3sKKyAgICBjbXNIUFJPRklMRSBoSUNDOworICAgIGNtc0NJRVhZWiB0bXA7CisKKyAgICBoSUNDID0gY21zQ3JlYXRlUHJvZmlsZVBsYWNlaG9sZGVyKENvbnRleHRJRCk7CisgICAgaWYgKCFoSUNDKSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuJ3QgYWxsb2NhdGUKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBjbXNTZXRQcm9maWxlVmVyc2lvbihoSUNDLCA0LjMpOworCisgICAgY21zU2V0RGV2aWNlQ2xhc3MoaElDQywgICAgICBjbXNTaWdEaXNwbGF5Q2xhc3MpOworICAgIGNtc1NldENvbG9yU3BhY2UoaElDQywgICAgICAgY21zU2lnR3JheURhdGEpOworICAgIGNtc1NldFBDUyhoSUNDLCAgICAgICAgICAgICAgY21zU2lnWFlaRGF0YSk7CisgICAgY21zU2V0SGVhZGVyUmVuZGVyaW5nSW50ZW50KGhJQ0MsICBJTlRFTlRfUEVSQ0VQVFVBTCk7CisKKworICAgIC8vIEltcGxlbWVudCBwcm9maWxlIHVzaW5nIGZvbGxvd2luZyB0YWdzOgorICAgIC8vCisgICAgLy8gIDEgY21zU2lnUHJvZmlsZURlc2NyaXB0aW9uVGFnCisgICAgLy8gIDIgY21zU2lnTWVkaWFXaGl0ZVBvaW50VGFnCisgICAgLy8gIDMgY21zU2lnR3JheVRSQ1RhZworCisgICAgLy8gVGhpcyBjb25mb3JtcyBhIHN0YW5kYXJkIEdyYXkgRGlzcGxheVByb2ZpbGUKKworICAgIC8vIEZpbGwtaW4gdGhlIHRhZ3MKKworICAgIGlmICghU2V0VGV4dFRhZ3MoaElDQywgTCJncmF5IGJ1aWx0LWluIikpIGdvdG8gRXJyb3I7CisKKworICAgIGlmIChXaGl0ZVBvaW50KSB7CisKKyAgICAgICAgY21zeHlZMlhZWigmdG1wLCBXaGl0ZVBvaW50KTsKKyAgICAgICAgaWYgKCFjbXNXcml0ZVRhZyhoSUNDLCBjbXNTaWdNZWRpYVdoaXRlUG9pbnRUYWcsICh2b2lkKikgJnRtcCkpIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgaWYgKFRyYW5zZmVyRnVuY3Rpb24pIHsKKworICAgICAgICBpZiAoIWNtc1dyaXRlVGFnKGhJQ0MsIGNtc1NpZ0dyYXlUUkNUYWcsICh2b2lkKikgVHJhbnNmZXJGdW5jdGlvbikpIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgcmV0dXJuIGhJQ0M7CisKK0Vycm9yOgorICAgIGlmIChoSUNDKQorICAgICAgICBjbXNDbG9zZVByb2ZpbGUoaElDQyk7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworCitjbXNIUFJPRklMRSBDTVNFWFBPUlQgY21zQ3JlYXRlR3JheVByb2ZpbGUoY29uc3QgY21zQ0lFeHlZKiBXaGl0ZVBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1RvbmVDdXJ2ZSogVHJhbnNmZXJGdW5jdGlvbikKK3sKKyAgICByZXR1cm4gY21zQ3JlYXRlR3JheVByb2ZpbGVUSFIoTlVMTCwgV2hpdGVQb2ludCwgVHJhbnNmZXJGdW5jdGlvbik7Cit9CisKKy8vIFRoaXMgaXMgYSBkZXZpY2VsaW5rIG9wZXJhdGluZyBpbiB0aGUgdGFyZ2V0IGNvbG9yc3BhY2Ugd2l0aCBhcyBtYW55IHRyYW5zZmVyIGZ1bmN0aW9ucyBhcyBjb21wb25lbnRzCisKK2Ntc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNDcmVhdGVMaW5lYXJpemF0aW9uRGV2aWNlTGlua1RIUihjbXNDb250ZXh0IENvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVG9uZUN1cnZlKiBjb25zdCBUcmFuc2ZlckZ1bmN0aW9uc1tdKQoreworICAgIGNtc0hQUk9GSUxFIGhJQ0M7CisgICAgY21zUGlwZWxpbmUqIFBpcGVsaW5lOworICAgIGludCBuQ2hhbm5lbHM7CisKKyAgICBoSUNDID0gY21zQ3JlYXRlUHJvZmlsZVBsYWNlaG9sZGVyKENvbnRleHRJRCk7CisgICAgaWYgKCFoSUNDKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGNtc1NldFByb2ZpbGVWZXJzaW9uKGhJQ0MsIDQuMyk7CisKKyAgICBjbXNTZXREZXZpY2VDbGFzcyhoSUNDLCAgICAgIGNtc1NpZ0xpbmtDbGFzcyk7CisgICAgY21zU2V0Q29sb3JTcGFjZShoSUNDLCAgICAgICBDb2xvclNwYWNlKTsKKyAgICBjbXNTZXRQQ1MoaElDQywgICAgICAgICAgICAgIENvbG9yU3BhY2UpOworCisgICAgY21zU2V0SGVhZGVyUmVuZGVyaW5nSW50ZW50KGhJQ0MsICBJTlRFTlRfUEVSQ0VQVFVBTCk7CisKKyAgICAvLyBTZXQgdXAgY2hhbm5lbHMKKyAgICBuQ2hhbm5lbHMgPSBjbXNDaGFubmVsc09mKENvbG9yU3BhY2UpOworCisgICAgLy8gQ3JlYXRlcyBhIFBpcGVsaW5lIHdpdGggcHJlbGluZWFyaXphdGlvbiBzdGVwIG9ubHkKKyAgICBQaXBlbGluZSA9IGNtc1BpcGVsaW5lQWxsb2MoQ29udGV4dElELCBuQ2hhbm5lbHMsIG5DaGFubmVscyk7CisgICAgaWYgKFBpcGVsaW5lID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKworICAgIC8vIENvcHkgdGFibGVzIHRvIFBpcGVsaW5lCisgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKFBpcGVsaW5lLCBjbXNBVF9CRUdJTiwgY21zU3RhZ2VBbGxvY1RvbmVDdXJ2ZXMoQ29udGV4dElELCBuQ2hhbm5lbHMsIFRyYW5zZmVyRnVuY3Rpb25zKSkpCisgICAgICAgIGdvdG8gRXJyb3I7CisKKyAgICAvLyBDcmVhdGUgdGFncworICAgIGlmICghU2V0VGV4dFRhZ3MoaElDQywgTCJMaW5lYXJpemF0aW9uIGJ1aWx0LWluIikpIGdvdG8gRXJyb3I7CisgICAgaWYgKCFjbXNXcml0ZVRhZyhoSUNDLCBjbXNTaWdBVG9CMFRhZywgKHZvaWQqKSBQaXBlbGluZSkpIGdvdG8gRXJyb3I7CisgICAgaWYgKCFTZXRTZXFEZXNjVGFnKGhJQ0MsICJMaW5lYXJpemF0aW9uIGJ1aWx0LWluIikpIGdvdG8gRXJyb3I7CisKKyAgICAvLyBQaXBlbGluZSBpcyBhbHJlYWR5IG9uIHZpcnR1YWwgcHJvZmlsZQorICAgIGNtc1BpcGVsaW5lRnJlZShQaXBlbGluZSk7CisKKyAgICAvLyBPaywgZG9uZQorICAgIHJldHVybiBoSUNDOworCitFcnJvcjoKKyAgICBjbXNQaXBlbGluZUZyZWUoUGlwZWxpbmUpOworICAgIGlmIChoSUNDKQorICAgICAgICBjbXNDbG9zZVByb2ZpbGUoaElDQyk7CisKKworICAgIHJldHVybiBOVUxMOworfQorCitjbXNIUFJPRklMRSBDTVNFWFBPUlQgY21zQ3JlYXRlTGluZWFyaXphdGlvbkRldmljZUxpbmsoY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBDb2xvclNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNUb25lQ3VydmUqIGNvbnN0IFRyYW5zZmVyRnVuY3Rpb25zW10pCit7CisgICAgcmV0dXJuIGNtc0NyZWF0ZUxpbmVhcml6YXRpb25EZXZpY2VMaW5rVEhSKE5VTEwsIENvbG9yU3BhY2UsIFRyYW5zZmVyRnVuY3Rpb25zKTsKK30KKworLy8gSW5rLWxpbWl0aW5nIGFsZ29yaXRobQorLy8KKy8vICBTdW0gPSBDICsgTSArIFkgKyBLCisvLyAgSWYgU3VtID4gSW5rTGltaXQKKy8vICAgICAgICBSYXRpbz0gMSAtIChTdW0gLSBJbmtMaW1pdCkgLyAoQyArIE0gKyBZKQorLy8gICAgICAgIGlmIFJhdGlvIDwwCisvLyAgICAgICAgICAgICAgUmF0aW89MAorLy8gICAgICAgIGVuZGlmCisvLyAgICAgRWxzZQorLy8gICAgICAgICBSYXRpbz0xCisvLyAgICAgZW5kaWYKKy8vCisvLyAgICAgQyA9IFJhdGlvICogQworLy8gICAgIE0gPSBSYXRpbyAqIE0KKy8vICAgICBZID0gUmF0aW8gKiBZCisvLyAgICAgSzogRG9lcyBub3QgY2hhbmdlCisKK3N0YXRpYworaW50IElua0xpbWl0aW5nU2FtcGxlcihyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5bXSwgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIE91dFtdLCByZWdpc3RlciB2b2lkKiBDYXJnbykKK3sKKyAgICBjbXNGbG9hdDY0TnVtYmVyIElua0xpbWl0ID0gKihjbXNGbG9hdDY0TnVtYmVyICopIENhcmdvOworICAgIGNtc0Zsb2F0NjROdW1iZXIgU3VtQ01ZLCBTdW1DTVlLLCBSYXRpbzsKKworICAgIElua0xpbWl0ID0gKElua0xpbWl0ICogNjU1LjM1KTsKKworICAgIFN1bUNNWSAgID0gSW5bMF0gICsgSW5bMV0gKyBJblsyXTsKKyAgICBTdW1DTVlLICA9IFN1bUNNWSArIEluWzNdOworCisgICAgaWYgKFN1bUNNWUsgPiBJbmtMaW1pdCkgeworCisgICAgICAgIFJhdGlvID0gMSAtICgoU3VtQ01ZSyAtIElua0xpbWl0KSAvIFN1bUNNWSk7CisgICAgICAgIGlmIChSYXRpbyA8IDApCisgICAgICAgICAgICBSYXRpbyA9IDA7CisgICAgfQorICAgIGVsc2UgUmF0aW8gPSAxOworCisgICAgT3V0WzBdID0gX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKEluWzBdICogUmF0aW8pOyAgICAgLy8gQworICAgIE91dFsxXSA9IF9jbXNRdWlja1NhdHVyYXRlV29yZChJblsxXSAqIFJhdGlvKTsgICAgIC8vIE0KKyAgICBPdXRbMl0gPSBfY21zUXVpY2tTYXR1cmF0ZVdvcmQoSW5bMl0gKiBSYXRpbyk7ICAgICAvLyBZCisKKyAgICBPdXRbM10gPSBJblszXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBLICh1bnRvdWNoZWQpCisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gVGhpcyBpcyBhIGRldmljZWxpbmsgb3BlcmF0aW5nIGluIENNWUsgZm9yIGluay1saW1pdGluZworCitjbXNIUFJPRklMRSBDTVNFWFBPUlQgY21zQ3JlYXRlSW5rTGltaXRpbmdEZXZpY2VMaW5rVEhSKGNtc0NvbnRleHQgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgTGltaXQpCit7CisgICAgY21zSFBST0ZJTEUgaElDQzsKKyAgICBjbXNQaXBlbGluZSogTFVUOworICAgIGNtc1N0YWdlKiBDTFVUOworICAgIGludCBuQ2hhbm5lbHM7CisKKyAgICBpZiAoQ29sb3JTcGFjZSAhPSBjbXNTaWdDbXlrRGF0YSkgeworICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX0NPTE9SU1BBQ0VfQ0hFQ0ssICJJbmtMaW1pdGluZzogT25seSBDTVlLIGN1cnJlbnRseSBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKExpbWl0IDwgMC4wIHx8IExpbWl0ID4gNDAwKSB7CisKKyAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgIklua0xpbWl0aW5nOiBMaW1pdCBzaG91bGQgYmUgYmV0d2VlbiAwLi40MDAiKTsKKyAgICAgICAgaWYgKExpbWl0IDwgMCkgTGltaXQgPSAwOworICAgICAgICBpZiAoTGltaXQgPiA0MDApIExpbWl0ID0gNDAwOworCisgICAgfQorCisgICAgaElDQyA9IGNtc0NyZWF0ZVByb2ZpbGVQbGFjZWhvbGRlcihDb250ZXh0SUQpOworICAgIGlmICghaElDQykgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbid0IGFsbG9jYXRlCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgY21zU2V0UHJvZmlsZVZlcnNpb24oaElDQywgNC4zKTsKKworICAgIGNtc1NldERldmljZUNsYXNzKGhJQ0MsICAgICAgY21zU2lnTGlua0NsYXNzKTsKKyAgICBjbXNTZXRDb2xvclNwYWNlKGhJQ0MsICAgICAgIENvbG9yU3BhY2UpOworICAgIGNtc1NldFBDUyhoSUNDLCAgICAgICAgICAgICAgQ29sb3JTcGFjZSk7CisKKyAgICBjbXNTZXRIZWFkZXJSZW5kZXJpbmdJbnRlbnQoaElDQywgIElOVEVOVF9QRVJDRVBUVUFMKTsKKworCisgICAgLy8gQ3JlYXRlcyBhIFBpcGVsaW5lIHdpdGggM0QgZ3JpZCBvbmx5CisgICAgTFVUID0gY21zUGlwZWxpbmVBbGxvYyhDb250ZXh0SUQsIDQsIDQpOworICAgIGlmIChMVVQgPT0gTlVMTCkgZ290byBFcnJvcjsKKworCisgICAgbkNoYW5uZWxzID0gY21zQ2hhbm5lbHNPZihDb2xvclNwYWNlKTsKKworICAgIENMVVQgPSBjbXNTdGFnZUFsbG9jQ0x1dDE2Yml0KENvbnRleHRJRCwgMTcsIG5DaGFubmVscywgbkNoYW5uZWxzLCBOVUxMKTsKKyAgICBpZiAoQ0xVVCA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgaWYgKCFjbXNTdGFnZVNhbXBsZUNMdXQxNmJpdChDTFVULCBJbmtMaW1pdGluZ1NhbXBsZXIsICh2b2lkKikgJkxpbWl0LCAwKSkgZ290byBFcnJvcjsKKworICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMVVQsIGNtc0FUX0JFR0lOLCBfY21zU3RhZ2VBbGxvY0lkZW50aXR5Q3VydmVzKENvbnRleHRJRCwgbkNoYW5uZWxzKSkgfHwKKyAgICAgICAgIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTFVULCBjbXNBVF9FTkQsIENMVVQpIHx8CisgICAgICAgICFjbXNQaXBlbGluZUluc2VydFN0YWdlKExVVCwgY21zQVRfRU5ELCBfY21zU3RhZ2VBbGxvY0lkZW50aXR5Q3VydmVzKENvbnRleHRJRCwgbkNoYW5uZWxzKSkpCisgICAgICAgIGdvdG8gRXJyb3I7CisKKyAgICAvLyBDcmVhdGUgdGFncworICAgIGlmICghU2V0VGV4dFRhZ3MoaElDQywgTCJpbmstbGltaXRpbmcgYnVpbHQtaW4iKSkgZ290byBFcnJvcjsKKworICAgIGlmICghY21zV3JpdGVUYWcoaElDQywgY21zU2lnQVRvQjBUYWcsICh2b2lkKikgTFVUKSkgIGdvdG8gRXJyb3I7CisgICAgaWYgKCFTZXRTZXFEZXNjVGFnKGhJQ0MsICJpbmstbGltaXRpbmcgYnVpbHQtaW4iKSkgZ290byBFcnJvcjsKKworICAgIC8vIGNtc1BpcGVsaW5lIGlzIGFscmVhZHkgb24gdmlydHVhbCBwcm9maWxlCisgICAgY21zUGlwZWxpbmVGcmVlKExVVCk7CisKKyAgICAvLyBPaywgZG9uZQorICAgIHJldHVybiBoSUNDOworCitFcnJvcjoKKyAgICBpZiAoTFVUICE9IE5VTEwpCisgICAgICAgIGNtc1BpcGVsaW5lRnJlZShMVVQpOworCisgICAgaWYgKGhJQ0MgIT0gTlVMTCkKKyAgICAgICAgY21zQ2xvc2VQcm9maWxlKGhJQ0MpOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2Ntc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNDcmVhdGVJbmtMaW1pdGluZ0RldmljZUxpbmsoY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBDb2xvclNwYWNlLCBjbXNGbG9hdDY0TnVtYmVyIExpbWl0KQoreworICAgIHJldHVybiBjbXNDcmVhdGVJbmtMaW1pdGluZ0RldmljZUxpbmtUSFIoTlVMTCwgQ29sb3JTcGFjZSwgTGltaXQpOworfQorCisKKy8vIENyZWF0ZXMgYSBmYWtlIExhYiBpZGVudGl0eS4KK2Ntc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNDcmVhdGVMYWIyUHJvZmlsZVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3QgY21zQ0lFeHlZKiBXaGl0ZVBvaW50KQoreworICAgIGNtc0hQUk9GSUxFIGhQcm9maWxlOworICAgIGNtc1BpcGVsaW5lKiBMVVQgPSBOVUxMOworCisgICAgaFByb2ZpbGUgPSBjbXNDcmVhdGVSR0JQcm9maWxlVEhSKENvbnRleHRJRCwgV2hpdGVQb2ludCA9PSBOVUxMID8gY21zRDUwX3h5WSgpIDogV2hpdGVQb2ludCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKGhQcm9maWxlID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgY21zU2V0UHJvZmlsZVZlcnNpb24oaFByb2ZpbGUsIDIuMSk7CisKKyAgICBjbXNTZXREZXZpY2VDbGFzcyhoUHJvZmlsZSwgY21zU2lnQWJzdHJhY3RDbGFzcyk7CisgICAgY21zU2V0Q29sb3JTcGFjZShoUHJvZmlsZSwgIGNtc1NpZ0xhYkRhdGEpOworICAgIGNtc1NldFBDUyhoUHJvZmlsZSwgICAgICAgICBjbXNTaWdMYWJEYXRhKTsKKworICAgIGlmICghU2V0VGV4dFRhZ3MoaFByb2ZpbGUsIEwiTGFiIGlkZW50aXR5IGJ1aWx0LWluIikpIHJldHVybiBOVUxMOworCisgICAgLy8gQW4gaWRlbnRpdHkgTFVUIGlzIGFsbCB3ZSBuZWVkCisgICAgTFVUID0gY21zUGlwZWxpbmVBbGxvYyhDb250ZXh0SUQsIDMsIDMpOworICAgIGlmIChMVVQgPT0gTlVMTCkgZ290byBFcnJvcjsKKworICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMVVQsIGNtc0FUX0JFR0lOLCBfY21zU3RhZ2VBbGxvY0lkZW50aXR5Q0x1dChDb250ZXh0SUQsIDMpKSkKKyAgICAgICAgZ290byBFcnJvcjsKKworICAgIGlmICghY21zV3JpdGVUYWcoaFByb2ZpbGUsIGNtc1NpZ0FUb0IwVGFnLCBMVVQpKSBnb3RvIEVycm9yOworICAgIGNtc1BpcGVsaW5lRnJlZShMVVQpOworCisgICAgcmV0dXJuIGhQcm9maWxlOworCitFcnJvcjoKKworICAgIGlmIChMVVQgIT0gTlVMTCkKKyAgICAgICAgY21zUGlwZWxpbmVGcmVlKExVVCk7CisKKyAgICBpZiAoaFByb2ZpbGUgIT0gTlVMTCkKKyAgICAgICAgY21zQ2xvc2VQcm9maWxlKGhQcm9maWxlKTsKKworICAgIHJldHVybiBOVUxMOworfQorCisKK2Ntc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNDcmVhdGVMYWIyUHJvZmlsZShjb25zdCBjbXNDSUV4eVkqIFdoaXRlUG9pbnQpCit7CisgICAgcmV0dXJuIGNtc0NyZWF0ZUxhYjJQcm9maWxlVEhSKE5VTEwsIFdoaXRlUG9pbnQpOworfQorCisKKy8vIENyZWF0ZXMgYSBmYWtlIExhYiBWNCBpZGVudGl0eS4KK2Ntc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNDcmVhdGVMYWI0UHJvZmlsZVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3QgY21zQ0lFeHlZKiBXaGl0ZVBvaW50KQoreworICAgIGNtc0hQUk9GSUxFIGhQcm9maWxlOworICAgIGNtc1BpcGVsaW5lKiBMVVQgPSBOVUxMOworCisgICAgaFByb2ZpbGUgPSBjbXNDcmVhdGVSR0JQcm9maWxlVEhSKENvbnRleHRJRCwgV2hpdGVQb2ludCA9PSBOVUxMID8gY21zRDUwX3h5WSgpIDogV2hpdGVQb2ludCwgTlVMTCwgTlVMTCk7CisgICAgaWYgKGhQcm9maWxlID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgY21zU2V0UHJvZmlsZVZlcnNpb24oaFByb2ZpbGUsIDQuMyk7CisKKyAgICBjbXNTZXREZXZpY2VDbGFzcyhoUHJvZmlsZSwgY21zU2lnQWJzdHJhY3RDbGFzcyk7CisgICAgY21zU2V0Q29sb3JTcGFjZShoUHJvZmlsZSwgIGNtc1NpZ0xhYkRhdGEpOworICAgIGNtc1NldFBDUyhoUHJvZmlsZSwgICAgICAgICBjbXNTaWdMYWJEYXRhKTsKKworICAgIGlmICghU2V0VGV4dFRhZ3MoaFByb2ZpbGUsIEwiTGFiIGlkZW50aXR5IGJ1aWx0LWluIikpIGdvdG8gRXJyb3I7CisKKyAgICAvLyBBbiBlbXB0eSBMVVRzIGlzIGFsbCB3ZSBuZWVkCisgICAgTFVUID0gY21zUGlwZWxpbmVBbGxvYyhDb250ZXh0SUQsIDMsIDMpOworICAgIGlmIChMVVQgPT0gTlVMTCkgZ290byBFcnJvcjsKKworICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMVVQsIGNtc0FUX0JFR0lOLCBfY21zU3RhZ2VBbGxvY0lkZW50aXR5Q3VydmVzKENvbnRleHRJRCwgMykpKQorICAgICAgICBnb3RvIEVycm9yOworCisgICAgaWYgKCFjbXNXcml0ZVRhZyhoUHJvZmlsZSwgY21zU2lnQVRvQjBUYWcsIExVVCkpIGdvdG8gRXJyb3I7CisgICAgY21zUGlwZWxpbmVGcmVlKExVVCk7CisKKyAgICByZXR1cm4gaFByb2ZpbGU7CisKK0Vycm9yOgorCisgICAgaWYgKExVVCAhPSBOVUxMKQorICAgICAgICBjbXNQaXBlbGluZUZyZWUoTFVUKTsKKworICAgIGlmIChoUHJvZmlsZSAhPSBOVUxMKQorICAgICAgICBjbXNDbG9zZVByb2ZpbGUoaFByb2ZpbGUpOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2Ntc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNDcmVhdGVMYWI0UHJvZmlsZShjb25zdCBjbXNDSUV4eVkqIFdoaXRlUG9pbnQpCit7CisgICAgcmV0dXJuIGNtc0NyZWF0ZUxhYjRQcm9maWxlVEhSKE5VTEwsIFdoaXRlUG9pbnQpOworfQorCisKKy8vIENyZWF0ZXMgYSBmYWtlIFhZWiBpZGVudGl0eQorY21zSFBST0ZJTEUgQ01TRVhQT1JUIGNtc0NyZWF0ZVhZWlByb2ZpbGVUSFIoY21zQ29udGV4dCBDb250ZXh0SUQpCit7CisgICAgY21zSFBST0ZJTEUgaFByb2ZpbGU7CisgICAgY21zUGlwZWxpbmUqIExVVCA9IE5VTEw7CisKKyAgICBoUHJvZmlsZSA9IGNtc0NyZWF0ZVJHQlByb2ZpbGVUSFIoQ29udGV4dElELCBjbXNENTBfeHlZKCksIE5VTEwsIE5VTEwpOworICAgIGlmIChoUHJvZmlsZSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIGNtc1NldFByb2ZpbGVWZXJzaW9uKGhQcm9maWxlLCA0LjMpOworCisgICAgY21zU2V0RGV2aWNlQ2xhc3MoaFByb2ZpbGUsIGNtc1NpZ0Fic3RyYWN0Q2xhc3MpOworICAgIGNtc1NldENvbG9yU3BhY2UoaFByb2ZpbGUsICBjbXNTaWdYWVpEYXRhKTsKKyAgICBjbXNTZXRQQ1MoaFByb2ZpbGUsICAgICAgICAgY21zU2lnWFlaRGF0YSk7CisKKyAgICBpZiAoIVNldFRleHRUYWdzKGhQcm9maWxlLCBMIlhZWiBpZGVudGl0eSBidWlsdC1pbiIpKSBnb3RvIEVycm9yOworCisgICAgLy8gQW4gaWRlbnRpdHkgTFVUIGlzIGFsbCB3ZSBuZWVkCisgICAgTFVUID0gY21zUGlwZWxpbmVBbGxvYyhDb250ZXh0SUQsIDMsIDMpOworICAgIGlmIChMVVQgPT0gTlVMTCkgZ290byBFcnJvcjsKKworICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMVVQsIGNtc0FUX0JFR0lOLCBfY21zU3RhZ2VBbGxvY0lkZW50aXR5Q3VydmVzKENvbnRleHRJRCwgMykpKQorICAgICAgICBnb3RvIEVycm9yOworCisgICAgaWYgKCFjbXNXcml0ZVRhZyhoUHJvZmlsZSwgY21zU2lnQVRvQjBUYWcsIExVVCkpIGdvdG8gRXJyb3I7CisgICAgY21zUGlwZWxpbmVGcmVlKExVVCk7CisKKyAgICByZXR1cm4gaFByb2ZpbGU7CisKK0Vycm9yOgorCisgICAgaWYgKExVVCAhPSBOVUxMKQorICAgICAgICBjbXNQaXBlbGluZUZyZWUoTFVUKTsKKworICAgIGlmIChoUHJvZmlsZSAhPSBOVUxMKQorICAgICAgICBjbXNDbG9zZVByb2ZpbGUoaFByb2ZpbGUpOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworY21zSFBST0ZJTEUgQ01TRVhQT1JUIGNtc0NyZWF0ZVhZWlByb2ZpbGUodm9pZCkKK3sKKyAgICByZXR1cm4gY21zQ3JlYXRlWFlaUHJvZmlsZVRIUihOVUxMKTsKK30KKworCisvL3NSR0IgQ3VydmVzIGFyZSBkZWZpbmVkIGJ5OgorLy8KKy8vSWYgIFInc1JHQixHJ3NSR0IsIEInc1JHQiA8IDAuMDQwNDUKKy8vCisvLyAgICBSID0gIFInc1JHQiAvIDEyLjkyCisvLyAgICBHID0gIEcnc1JHQiAvIDEyLjkyCisvLyAgICBCID0gIEInc1JHQiAvIDEyLjkyCisvLworLy8KKy8vZWxzZSBpZiAgUidzUkdCLEcnc1JHQiwgQidzUkdCID49IDAuMDQwNDUKKy8vCisvLyAgICBSID0gKChSJ3NSR0IgKyAwLjA1NSkgLyAxLjA1NSleMi40CisvLyAgICBHID0gKChHJ3NSR0IgKyAwLjA1NSkgLyAxLjA1NSleMi40CisvLyAgICBCID0gKChCJ3NSR0IgKyAwLjA1NSkgLyAxLjA1NSleMi40CisKK3N0YXRpYworY21zVG9uZUN1cnZlKiBCdWlsZF9zUkdCR2FtbWEoY21zQ29udGV4dCBDb250ZXh0SUQpCit7CisgICAgY21zRmxvYXQ2NE51bWJlciBQYXJhbWV0ZXJzWzVdOworCisgICAgUGFyYW1ldGVyc1swXSA9IDIuNDsKKyAgICBQYXJhbWV0ZXJzWzFdID0gMS4gLyAxLjA1NTsKKyAgICBQYXJhbWV0ZXJzWzJdID0gMC4wNTUgLyAxLjA1NTsKKyAgICBQYXJhbWV0ZXJzWzNdID0gMS4gLyAxMi45MjsKKyAgICBQYXJhbWV0ZXJzWzRdID0gMC4wNDA0NTsKKworICAgIHJldHVybiBjbXNCdWlsZFBhcmFtZXRyaWNUb25lQ3VydmUoQ29udGV4dElELCA0LCBQYXJhbWV0ZXJzKTsKK30KKworLy8gQ3JlYXRlIHRoZSBJQ0MgdmlydHVhbCBwcm9maWxlIGZvciBzUkdCIHNwYWNlCitjbXNIUFJPRklMRSBDTVNFWFBPUlQgY21zQ3JlYXRlX3NSR0JQcm9maWxlVEhSKGNtc0NvbnRleHQgQ29udGV4dElEKQoreworICAgICAgIGNtc0NJRXh5WSAgICAgICBENjUgPSB7IDAuMzEyNywgMC4zMjkwLCAxLjAgfTsKKyAgICAgICBjbXNDSUV4eVlUUklQTEUgUmVjNzA5UHJpbWFyaWVzID0geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MC42NDAwLCAwLjMzMDAsIDEuMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLjMwMDAsIDAuNjAwMCwgMS4wfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAuMTUwMCwgMC4wNjAwLCAxLjB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgY21zVG9uZUN1cnZlKiBHYW1tYTIyWzNdOworICAgICAgIGNtc0hQUk9GSUxFICBoc1JHQjsKKworICAgICAgLy8gY21zV2hpdGVQb2ludEZyb21UZW1wKCZENjUsIDY1MDQpOworICAgICAgIEdhbW1hMjJbMF0gPSBHYW1tYTIyWzFdID0gR2FtbWEyMlsyXSA9IEJ1aWxkX3NSR0JHYW1tYShDb250ZXh0SUQpOworICAgICAgIGlmIChHYW1tYTIyWzBdID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgICAgaHNSR0IgPSBjbXNDcmVhdGVSR0JQcm9maWxlVEhSKENvbnRleHRJRCwgJkQ2NSwgJlJlYzcwOVByaW1hcmllcywgR2FtbWEyMik7CisgICAgICAgY21zRnJlZVRvbmVDdXJ2ZShHYW1tYTIyWzBdKTsKKyAgICAgICBpZiAoaHNSR0IgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgICAgICBpZiAoIVNldFRleHRUYWdzKGhzUkdCLCBMInNSR0IgYnVpbHQtaW4iKSkgeworICAgICAgICAgICBjbXNDbG9zZVByb2ZpbGUoaHNSR0IpOworICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICB9CisKKyAgICAgICByZXR1cm4gaHNSR0I7Cit9CisKK2Ntc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNDcmVhdGVfc1JHQlByb2ZpbGUodm9pZCkKK3sKKyAgICByZXR1cm4gY21zQ3JlYXRlX3NSR0JQcm9maWxlVEhSKE5VTEwpOworfQorCisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgQnJpZ2h0bmVzczsKKyAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIENvbnRyYXN0OworICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgSHVlOworICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgU2F0dXJhdGlvbjsKKyAgICAgICAgICAgICAgICBjbXNCb29sICAgICAgICAgIGxBZGp1c3RXUDsKKyAgICAgICAgICAgICAgICBjbXNDSUVYWVogV1BzcmMsIFdQZGVzdDsKKworfSBCQ0hTV0FESlVTVFMsICpMUEJDSFNXQURKVVNUUzsKKworCitzdGF0aWMKK2ludCBiY2hzd1NhbXBsZXIocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIEluW10sIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciBPdXRbXSwgcmVnaXN0ZXIgdm9pZCogQ2FyZ28pCit7CisgICAgY21zQ0lFTGFiIExhYkluLCBMYWJPdXQ7CisgICAgY21zQ0lFTENoIExDaEluLCBMQ2hPdXQ7CisgICAgY21zQ0lFWFlaIFhZWjsKKyAgICBMUEJDSFNXQURKVVNUUyBiY2hzdyA9IChMUEJDSFNXQURKVVNUUykgQ2FyZ287CisKKworICAgIGNtc0xhYkVuY29kZWQyRmxvYXQoJkxhYkluLCBJbik7CisKKworICAgIGNtc0xhYjJMQ2goJkxDaEluLCAmTGFiSW4pOworCisgICAgLy8gRG8gc29tZSBhZGp1c3RzIG9uIExDaAorCisgICAgTENoT3V0LkwgPSBMQ2hJbi5MICogYmNoc3cgLT5Db250cmFzdCArIGJjaHN3IC0+QnJpZ2h0bmVzczsKKyAgICBMQ2hPdXQuQyA9IExDaEluLkMgKyBiY2hzdyAtPiBTYXR1cmF0aW9uOworICAgIExDaE91dC5oID0gTENoSW4uaCArIGJjaHN3IC0+IEh1ZTsKKworCisgICAgY21zTENoMkxhYigmTGFiT3V0LCAmTENoT3V0KTsKKworICAgIC8vIE1vdmUgd2hpdGUgcG9pbnQgaW4gTGFiCisgICAgaWYgKGJjaHN3LT5sQWRqdXN0V1ApIHsKKyAgICAgICAgICAgY21zTGFiMlhZWigmYmNoc3ctPldQc3JjLCAmWFlaLCAmTGFiT3V0KTsKKyAgICAgICAgICAgY21zWFlaMkxhYigmYmNoc3ctPldQZGVzdCwgJkxhYk91dCwgJlhZWik7CisgICAgfQorCisgICAgLy8gQmFjayB0byBlbmNvZGVkCisKKyAgICBjbXNGbG9hdDJMYWJFbmNvZGVkKE91dCwgJkxhYk91dCk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvLyBDcmVhdGVzIGFuIGFic3RyYWN0IHByb2ZpbGUgb3BlcmF0aW5nIGluIExhYiBzcGFjZSBmb3IgQnJpZ2h0bmVzcywKKy8vIGNvbnRyYXN0LCBTYXR1cmF0aW9uIGFuZCB3aGl0ZSBwb2ludCBkaXNwbGFjZW1lbnQKKworY21zSFBST0ZJTEUgQ01TRVhQT1JUIGNtc0NyZWF0ZUJDSFNXYWJzdHJhY3RQcm9maWxlVEhSKGNtc0NvbnRleHQgQ29udGV4dElELAorICAgIGludCBuTFVUUG9pbnRzLAorICAgIGNtc0Zsb2F0NjROdW1iZXIgQnJpZ2h0LAorICAgIGNtc0Zsb2F0NjROdW1iZXIgQ29udHJhc3QsCisgICAgY21zRmxvYXQ2NE51bWJlciBIdWUsCisgICAgY21zRmxvYXQ2NE51bWJlciBTYXR1cmF0aW9uLAorICAgIGludCBUZW1wU3JjLAorICAgIGludCBUZW1wRGVzdCkKK3sKKyAgICBjbXNIUFJPRklMRSBoSUNDOworICAgIGNtc1BpcGVsaW5lKiBQaXBlbGluZTsKKyAgICBCQ0hTV0FESlVTVFMgYmNoc3c7CisgICAgY21zQ0lFeHlZIFdoaXRlUG50OworICAgIGNtc1N0YWdlKiBDTFVUOworICAgIGNtc1VJbnQzMk51bWJlciBEaW1lbnNpb25zW01BWF9JTlBVVF9ESU1FTlNJT05TXTsKKyAgICBpbnQgaTsKKworICAgIGJjaHN3LkJyaWdodG5lc3MgPSBCcmlnaHQ7CisgICAgYmNoc3cuQ29udHJhc3QgICA9IENvbnRyYXN0OworICAgIGJjaHN3Lkh1ZSAgICAgICAgPSBIdWU7CisgICAgYmNoc3cuU2F0dXJhdGlvbiA9IFNhdHVyYXRpb247CisgICAgaWYgKFRlbXBTcmMgPT0gVGVtcERlc3QpIHsKKworICAgICAgICAgICBiY2hzdy5sQWRqdXN0V1AgPSBGQUxTRTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICAgIGJjaHN3LmxBZGp1c3RXUCA9IFRSVUU7CisgICAgICAgICAgIGNtc1doaXRlUG9pbnRGcm9tVGVtcCgmV2hpdGVQbnQsIFRlbXBTcmMpOworICAgICAgICAgICBjbXN4eVkyWFlaKCZiY2hzdy5XUHNyYywgJldoaXRlUG50KTsKKyAgICAgICAgICAgY21zV2hpdGVQb2ludEZyb21UZW1wKCZXaGl0ZVBudCwgVGVtcERlc3QpOworICAgICAgICAgICBjbXN4eVkyWFlaKCZiY2hzdy5XUGRlc3QsICZXaGl0ZVBudCk7CisgICAgIAorICAgIH0KKworICAgIGhJQ0MgPSBjbXNDcmVhdGVQcm9maWxlUGxhY2Vob2xkZXIoQ29udGV4dElEKTsKKyAgICBpZiAoIWhJQ0MpICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4ndCBhbGxvY2F0ZQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIGNtc1NldERldmljZUNsYXNzKGhJQ0MsICAgICAgY21zU2lnQWJzdHJhY3RDbGFzcyk7CisgICAgY21zU2V0Q29sb3JTcGFjZShoSUNDLCAgICAgICBjbXNTaWdMYWJEYXRhKTsKKyAgICBjbXNTZXRQQ1MoaElDQywgICAgICAgICAgICAgIGNtc1NpZ0xhYkRhdGEpOworCisgICAgY21zU2V0SGVhZGVyUmVuZGVyaW5nSW50ZW50KGhJQ0MsICBJTlRFTlRfUEVSQ0VQVFVBTCk7CisKKyAgICAvLyBDcmVhdGVzIGEgUGlwZWxpbmUgd2l0aCAzRCBncmlkIG9ubHkKKyAgICBQaXBlbGluZSA9IGNtc1BpcGVsaW5lQWxsb2MoQ29udGV4dElELCAzLCAzKTsKKyAgICBpZiAoUGlwZWxpbmUgPT0gTlVMTCkgeworICAgICAgICBjbXNDbG9zZVByb2ZpbGUoaElDQyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAoaT0wOyBpIDwgTUFYX0lOUFVUX0RJTUVOU0lPTlM7IGkrKykgRGltZW5zaW9uc1tpXSA9IG5MVVRQb2ludHM7CisgICAgQ0xVVCA9IGNtc1N0YWdlQWxsb2NDTHV0MTZiaXRHcmFudWxhcihDb250ZXh0SUQsIERpbWVuc2lvbnMsIDMsIDMsIE5VTEwpOworICAgIGlmIChDTFVUID09IE5VTEwpIHJldHVybiBOVUxMOworCisKKyAgICBpZiAoIWNtc1N0YWdlU2FtcGxlQ0x1dDE2Yml0KENMVVQsIGJjaHN3U2FtcGxlciwgKHZvaWQqKSAmYmNoc3csIDApKSB7CisKKyAgICAgICAgLy8gU2hvdWxkbid0IHJlYWNoIGhlcmUKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoUGlwZWxpbmUsIGNtc0FUX0VORCwgQ0xVVCkpIHsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgdGFncworICAgIGlmICghU2V0VGV4dFRhZ3MoaElDQywgTCJCQ0hTIGJ1aWx0LWluIikpIHJldHVybiBOVUxMOworCisgICAgY21zV3JpdGVUYWcoaElDQywgY21zU2lnTWVkaWFXaGl0ZVBvaW50VGFnLCAodm9pZCopIGNtc0Q1MF9YWVooKSk7CisKKyAgICBjbXNXcml0ZVRhZyhoSUNDLCBjbXNTaWdBVG9CMFRhZywgKHZvaWQqKSBQaXBlbGluZSk7CisKKyAgICAvLyBQaXBlbGluZSBpcyBhbHJlYWR5IG9uIHZpcnR1YWwgcHJvZmlsZQorICAgIGNtc1BpcGVsaW5lRnJlZShQaXBlbGluZSk7CisKKyAgICAvLyBPaywgZG9uZQorICAgIHJldHVybiBoSUNDOworCitFcnJvcjoKKyAgICBjbXNQaXBlbGluZUZyZWUoUGlwZWxpbmUpOworICAgIGNtc0Nsb3NlUHJvZmlsZShoSUNDKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworCitDTVNBUEkgY21zSFBST0ZJTEUgICBDTVNFWFBPUlQgY21zQ3JlYXRlQkNIU1dhYnN0cmFjdFByb2ZpbGUoaW50IG5MVVRQb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBCcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBDb250cmFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEh1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIFNhdHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFRlbXBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFRlbXBEZXN0KQoreworICAgIHJldHVybiBjbXNDcmVhdGVCQ0hTV2Fic3RyYWN0UHJvZmlsZVRIUihOVUxMLCBuTFVUUG9pbnRzLCBCcmlnaHQsIENvbnRyYXN0LCBIdWUsIFNhdHVyYXRpb24sIFRlbXBTcmMsIFRlbXBEZXN0KTsKK30KKworCisvLyBDcmVhdGVzIGEgZmFrZSBOVUxMIHByb2ZpbGUuIFRoaXMgcHJvZmlsZSByZXR1cm4gMSBjaGFubmVsIGFzIGFsd2F5cyAwLgorLy8gSXMgdXNlZnVsIG9ubHkgZm9yIGdhbXV0IGNoZWNraW5nIHRyaWNrcworY21zSFBST0ZJTEUgQ01TRVhQT1JUIGNtc0NyZWF0ZU5VTExQcm9maWxlVEhSKGNtc0NvbnRleHQgQ29udGV4dElEKQoreworICAgIGNtc0hQUk9GSUxFIGhQcm9maWxlOworICAgIGNtc1BpcGVsaW5lKiBMVVQgPSBOVUxMOworICAgIGNtc1N0YWdlKiBQb3N0TGluOworICAgIGNtc1RvbmVDdXJ2ZSogRW1wdHlUYWI7CisgICAgY21zVUludDE2TnVtYmVyIFplcm9bMl0gPSB7IDAsIDAgfTsKKworICAgIGhQcm9maWxlID0gY21zQ3JlYXRlUHJvZmlsZVBsYWNlaG9sZGVyKENvbnRleHRJRCk7CisgICAgaWYgKCFoUHJvZmlsZSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbid0IGFsbG9jYXRlCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgY21zU2V0UHJvZmlsZVZlcnNpb24oaFByb2ZpbGUsIDQuMyk7CisKKyAgICBpZiAoIVNldFRleHRUYWdzKGhQcm9maWxlLCBMIk5VTEwgcHJvZmlsZSBidWlsdC1pbiIpKSBnb3RvIEVycm9yOworCisKKworICAgIGNtc1NldERldmljZUNsYXNzKGhQcm9maWxlLCBjbXNTaWdPdXRwdXRDbGFzcyk7CisgICAgY21zU2V0Q29sb3JTcGFjZShoUHJvZmlsZSwgIGNtc1NpZ0dyYXlEYXRhKTsKKyAgICBjbXNTZXRQQ1MoaFByb2ZpbGUsICAgICAgICAgY21zU2lnTGFiRGF0YSk7CisKKyAgICAvLyBBbiBlbXB0eSBMVVRzIGlzIGFsbCB3ZSBuZWVkCisgICAgTFVUID0gY21zUGlwZWxpbmVBbGxvYyhDb250ZXh0SUQsIDEsIDEpOworICAgIGlmIChMVVQgPT0gTlVMTCkgZ290byBFcnJvcjsKKworICAgIEVtcHR5VGFiID0gY21zQnVpbGRUYWJ1bGF0ZWRUb25lQ3VydmUxNihDb250ZXh0SUQsIDIsIFplcm8pOworICAgIFBvc3RMaW4gPSBjbXNTdGFnZUFsbG9jVG9uZUN1cnZlcyhDb250ZXh0SUQsIDEsICZFbXB0eVRhYik7CisgICAgY21zRnJlZVRvbmVDdXJ2ZShFbXB0eVRhYik7CisKKyAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTFVULCBjbXNBVF9FTkQsIFBvc3RMaW4pKQorICAgICAgICBnb3RvIEVycm9yOworCisgICAgaWYgKCFjbXNXcml0ZVRhZyhoUHJvZmlsZSwgY21zU2lnQlRvQTBUYWcsICh2b2lkKikgTFVUKSkgZ290byBFcnJvcjsKKyAgICBpZiAoIWNtc1dyaXRlVGFnKGhQcm9maWxlLCBjbXNTaWdNZWRpYVdoaXRlUG9pbnRUYWcsIGNtc0Q1MF9YWVooKSkpIGdvdG8gRXJyb3I7CisKKyAgICBjbXNQaXBlbGluZUZyZWUoTFVUKTsKKyAgICByZXR1cm4gaFByb2ZpbGU7CisKK0Vycm9yOgorCisgICAgaWYgKExVVCAhPSBOVUxMKQorICAgICAgICBjbXNQaXBlbGluZUZyZWUoTFVUKTsKKworICAgIGlmIChoUHJvZmlsZSAhPSBOVUxMKQorICAgICAgICBjbXNDbG9zZVByb2ZpbGUoaFByb2ZpbGUpOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK2Ntc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNDcmVhdGVOVUxMUHJvZmlsZSh2b2lkKQoreworICAgIHJldHVybiBjbXNDcmVhdGVOVUxMUHJvZmlsZVRIUihOVUxMKTsKK30KKworCitzdGF0aWMKK2ludCBJc1BDUyhjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2UpCit7CisgICAgcmV0dXJuIChDb2xvclNwYWNlID09IGNtc1NpZ1hZWkRhdGEgfHwKKyAgICAgICAgICAgIENvbG9yU3BhY2UgPT0gY21zU2lnTGFiRGF0YSk7Cit9CisKKworc3RhdGljCit2b2lkIEZpeENvbG9yU3BhY2VzKGNtc0hQUk9GSUxFIGhQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBDb2xvclNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBQQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKK3sKKyAgICBpZiAoZHdGbGFncyAmIGNtc0ZMQUdTX0dVRVNTREVWSUNFQ0xBU1MpIHsKKworICAgICAgICAgICAgaWYgKElzUENTKENvbG9yU3BhY2UpICYmIElzUENTKFBDUykpIHsKKworICAgICAgICAgICAgICAgICAgICBjbXNTZXREZXZpY2VDbGFzcyhoUHJvZmlsZSwgICAgICBjbXNTaWdBYnN0cmFjdENsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgY21zU2V0Q29sb3JTcGFjZShoUHJvZmlsZSwgICAgICAgQ29sb3JTcGFjZSk7CisgICAgICAgICAgICAgICAgICAgIGNtc1NldFBDUyhoUHJvZmlsZSwgICAgICAgICAgICAgIFBDUyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKElzUENTKENvbG9yU3BhY2UpICYmICFJc1BDUyhQQ1MpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgY21zU2V0RGV2aWNlQ2xhc3MoaFByb2ZpbGUsIGNtc1NpZ091dHB1dENsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgY21zU2V0UENTKGhQcm9maWxlLCAgICAgICAgIENvbG9yU3BhY2UpOworICAgICAgICAgICAgICAgICAgICBjbXNTZXRDb2xvclNwYWNlKGhQcm9maWxlLCAgUENTKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoSXNQQ1MoUENTKSAmJiAhSXNQQ1MoQ29sb3JTcGFjZSkpIHsKKworICAgICAgICAgICAgICAgICAgIGNtc1NldERldmljZUNsYXNzKGhQcm9maWxlLCAgY21zU2lnSW5wdXRDbGFzcyk7CisgICAgICAgICAgICAgICAgICAgY21zU2V0Q29sb3JTcGFjZShoUHJvZmlsZSwgICBDb2xvclNwYWNlKTsKKyAgICAgICAgICAgICAgICAgICBjbXNTZXRQQ1MoaFByb2ZpbGUsICAgICAgICAgIFBDUyk7CisgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIGNtc1NldERldmljZUNsYXNzKGhQcm9maWxlLCAgICAgIGNtc1NpZ0xpbmtDbGFzcyk7CisgICAgY21zU2V0Q29sb3JTcGFjZShoUHJvZmlsZSwgICAgICAgQ29sb3JTcGFjZSk7CisgICAgY21zU2V0UENTKGhQcm9maWxlLCAgICAgICAgICAgICAgUENTKTsKK30KKworCisKKy8vIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIG5hbWVkIGNvbG9yIHByb2ZpbGUgZHVtcGluZyBhbGwgdGhlIGNvbnRlbnRzIG9mIHRyYW5zZm9ybSB0byBhIHNpbmdsZSBwcm9maWxlCisvLyBJbiB0aGlzIHdheSwgTGl0dGxlQ01TIG1heSBiZSB1c2VkIHRvICJncm91cCIgc2V2ZXJhbCBuYW1lZCBjb2xvciBkYXRhYmFzZXMgaW50byBhIHNpbmdsZSBwcm9maWxlLgorLy8gSXQgaGFzLCBob3dldmVyLCBzZXZlcmFsIG1pbm9yIGxpbWl0YXRpb25zLiBQQ1MgaXMgYWx3YXlzIExhYiwgd2hpY2ggaXMgbm90IHZlcnkgY3JpdGljIHNpbmNlIHRoaXMKKy8vIGlzIHRoZSBub3JtYWwgUENTIGZvciBuYW1lZCBjb2xvciBwcm9maWxlcy4KK3N0YXRpYworY21zSFBST0ZJTEUgQ3JlYXRlTmFtZWRDb2xvckRldmljZWxpbmsoY21zSFRSQU5TRk9STSB4Zm9ybSkKK3sKKyAgICBfY21zVFJBTlNGT1JNKiB2ID0gKF9jbXNUUkFOU0ZPUk0qKSB4Zm9ybTsKKyAgICBjbXNIUFJPRklMRSBoSUNDID0gTlVMTDsKKyAgICBpbnQgaSwgbkNvbG9yczsKKyAgICBjbXNOQU1FRENPTE9STElTVCAqbmMyID0gTlVMTCwgKk9yaWdpbmFsID0gTlVMTDsKKworICAgIC8vIENyZWF0ZSBhbiBlbXB0eSBwbGFjZWhvbGRlcgorICAgIGhJQ0MgPSBjbXNDcmVhdGVQcm9maWxlUGxhY2Vob2xkZXIodi0+Q29udGV4dElEKTsKKyAgICBpZiAoaElDQyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICAgIC8vIENyaXRpY2FsIGluZm9ybWF0aW9uCisgICAgY21zU2V0RGV2aWNlQ2xhc3MoaElDQywgY21zU2lnTmFtZWRDb2xvckNsYXNzKTsKKyAgICBjbXNTZXRDb2xvclNwYWNlKGhJQ0MsIHYgLT5FeGl0Q29sb3JTcGFjZSk7CisgICAgY21zU2V0UENTKGhJQ0MsIGNtc1NpZ0xhYkRhdGEpOworCisgICAgLy8gVGFnIHByb2ZpbGUgd2l0aCBpbmZvcm1hdGlvbgorICAgIGlmICghU2V0VGV4dFRhZ3MoaElDQywgTCJOYW1lZCBjb2xvciBkZXZpY2VsaW5rIikpIGdvdG8gRXJyb3I7CisKKyAgICBPcmlnaW5hbCA9IGNtc0dldE5hbWVkQ29sb3JMaXN0KHhmb3JtKTsKKyAgICBpZiAoT3JpZ2luYWwgPT0gTlVMTCkgZ290byBFcnJvcjsKKworICAgIG5Db2xvcnMgPSBjbXNOYW1lZENvbG9yQ291bnQoT3JpZ2luYWwpOworICAgIG5jMiAgICAgPSBjbXNEdXBOYW1lZENvbG9yTGlzdChPcmlnaW5hbCk7CisgICAgaWYgKG5jMiA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgICAgLy8gQ29sb3JhbnQgY291bnQgbm93IGRlcGVuZHMgb24gdGhlIG91dHB1dCBzcGFjZQorICAgIG5jMiAtPkNvbG9yYW50Q291bnQgPSBjbXNQaXBlbGluZU91dHB1dENoYW5uZWxzKHYgLT5MdXQpOworCisgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgcHJvcGVyIGZvcm1hdHRlcnMKKyAgICBjbXNDaGFuZ2VCdWZmZXJzRm9ybWF0KHhmb3JtLCBUWVBFX05BTUVEX0NPTE9SX0lOREVYLAorICAgICAgICBGTE9BVF9TSCgwKSB8IENPTE9SU1BBQ0VfU0goX2Ntc0xDTVNjb2xvclNwYWNlKHYgLT5FeGl0Q29sb3JTcGFjZSkpCisgICAgICAgIHwgQllURVNfU0goMikgfCBDSEFOTkVMU19TSChjbXNDaGFubmVsc09mKHYgLT5FeGl0Q29sb3JTcGFjZSkpKTsKKworICAgIC8vIEFwcGx5IHRoZSB0cmFuc2ZvciB0byBjb2xvcmFudHMuCisgICAgZm9yIChpPTA7IGkgPCBuQ29sb3JzOyBpKyspIHsKKyAgICAgICAgY21zRG9UcmFuc2Zvcm0oeGZvcm0sICZpLCBuYzIgLT5MaXN0W2ldLkRldmljZUNvbG9yYW50LCAxKTsKKyAgICB9CisKKyAgICBpZiAoIWNtc1dyaXRlVGFnKGhJQ0MsIGNtc1NpZ05hbWVkQ29sb3IyVGFnLCAodm9pZCopIG5jMikpIGdvdG8gRXJyb3I7CisgICAgY21zRnJlZU5hbWVkQ29sb3JMaXN0KG5jMik7CisKKyAgICByZXR1cm4gaElDQzsKKworRXJyb3I6CisgICAgaWYgKGhJQ0MgIT0gTlVMTCkgY21zQ2xvc2VQcm9maWxlKGhJQ0MpOworICAgIHJldHVybiBOVUxMOworfQorCisKKy8vIFRoaXMgc3RydWN0dXJlIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIE1QVSBjYW4gYmUgc3RvcmVkIG9uIGEgcHJvZmlsZSBiYXNlZCBvbiB0aGUgdmVyc2lvbgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY21zQm9vbCAgICAgICAgICAgICAgSXNWNDsgICAgICAgICAgICAgLy8gSXMgYSBWNCB0YWc/CisgICAgY21zVGFnU2lnbmF0dXJlICAgICAgUmVxdWlyZWRUYWc7ICAgICAgLy8gU2V0IHRvIDAgZm9yIGJvdGggdHlwZXMKKyAgICBjbXNUYWdUeXBlU2lnbmF0dXJlICBMdXRUeXBlOyAgICAgICAgICAvLyBUaGUgTFVUIHR5cGUKKyAgICBpbnQgICAgICAgICAgICAgICAgICBuVHlwZXM7ICAgICAgICAgICAvLyBOdW1iZXIgb2YgdHlwZXMgKHVwIHRvIDUpCisgICAgY21zU3RhZ2VTaWduYXR1cmUgICAgTXBlVHlwZXNbNV07ICAgICAgLy8gNSBpcyB0aGUgbWF4aW11bSBudW1iZXIKKworfSBjbXNBbGxvd2VkTFVUOworCisjZGVmaW5lIGNtc1NpZzAgKChjbXNUYWdTaWduYXR1cmUpIDApIAorCitzdGF0aWMgY29uc3QgY21zQWxsb3dlZExVVCBBbGxvd2VkTFVUVHlwZXNbXSA9IHsKKworICAgIHsgRkFMU0UsIGNtc1NpZzAsICAgICAgICBjbXNTaWdMdXQxNlR5cGUsIDQsIHsgY21zU2lnTWF0cml4RWxlbVR5cGUsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsIGNtc1NpZ0NMdXRFbGVtVHlwZSwgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSB9IH0sCisgICAgeyBGQUxTRSwgY21zU2lnMCwgICAgICAgIGNtc1NpZ0x1dDE2VHlwZSwgMywgeyBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLCBjbXNTaWdDTHV0RWxlbVR5cGUsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUgfSB9LAorICAgIHsgRkFMU0UsIGNtc1NpZzAsICAgICAgICBjbXNTaWdMdXQxNlR5cGUsIDIsIHsgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgY21zU2lnQ0x1dEVsZW1UeXBlIH0gfSwKKyAgICB7IFRSVUUsICBjbXNTaWcwLCAgICAgICAgY21zU2lnTHV0QXRvQlR5cGUsIDEsIHsgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSB9IH0sCisgICAgeyBUUlVFICwgY21zU2lnQVRvQjBUYWcsIGNtc1NpZ0x1dEF0b0JUeXBlLCAgMywgIHsgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgY21zU2lnTWF0cml4RWxlbVR5cGUsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUgfSB9LAorICAgIHsgVFJVRSAsIGNtc1NpZ0FUb0IwVGFnLCBjbXNTaWdMdXRBdG9CVHlwZSwgIDMsICB7IGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsIGNtc1NpZ0NMdXRFbGVtVHlwZSwgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSAgIH0gfSwKKyAgICB7IFRSVUUgLCBjbXNTaWdBVG9CMFRhZywgY21zU2lnTHV0QXRvQlR5cGUsICA1LCAgeyBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLCBjbXNTaWdDTHV0RWxlbVR5cGUsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsIGNtc1NpZ01hdHJpeEVsZW1UeXBlLCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlIH19LAorICAgIHsgVFJVRSAsIGNtc1NpZ0JUb0EwVGFnLCBjbXNTaWdMdXRCdG9BVHlwZSwgIDEsICB7IGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUgfX0sCisgICAgeyBUUlVFICwgY21zU2lnQlRvQTBUYWcsIGNtc1NpZ0x1dEJ0b0FUeXBlLCAgMywgIHsgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgY21zU2lnTWF0cml4RWxlbVR5cGUsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUgfX0sCisgICAgeyBUUlVFICwgY21zU2lnQlRvQTBUYWcsIGNtc1NpZ0x1dEJ0b0FUeXBlLCAgMywgIHsgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgY21zU2lnQ0x1dEVsZW1UeXBlLCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlIH19LAorICAgIHsgVFJVRSAsIGNtc1NpZ0JUb0EwVGFnLCBjbXNTaWdMdXRCdG9BVHlwZSwgIDUsICB7IGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsIGNtc1NpZ01hdHJpeEVsZW1UeXBlLCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLCBjbXNTaWdDTHV0RWxlbVR5cGUsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUgfX0KK307CisKKyNkZWZpbmUgU0laRV9PRl9BTExPV0VEX0xVVCAoc2l6ZW9mKEFsbG93ZWRMVVRUeXBlcykvc2l6ZW9mKGNtc0FsbG93ZWRMVVQpKQorCisvLyBDaGVjayBhIHNpbmdsZSBlbnRyeQorc3RhdGljCitjbXNCb29sIENoZWNrT25lKGNvbnN0IGNtc0FsbG93ZWRMVVQqIFRhYiwgY29uc3QgY21zUGlwZWxpbmUqIEx1dCkKK3sKKyAgICBjbXNTdGFnZSogbXBlOworICAgIGludCBuOworCisgICAgZm9yIChuPTAsIG1wZSA9IEx1dCAtPkVsZW1lbnRzOyBtcGUgIT0gTlVMTDsgbXBlID0gbXBlIC0+TmV4dCwgbisrKSB7CisKKyAgICAgICAgaWYgKG4gPiBUYWIgLT5uVHlwZXMpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKGNtc1N0YWdlVHlwZShtcGUpICE9IFRhYiAtPk1wZVR5cGVzW25dKSByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIChuID09IFRhYiAtPm5UeXBlcyk7Cit9CisKKworc3RhdGljCitjb25zdCBjbXNBbGxvd2VkTFVUKiBGaW5kQ29tYmluYXRpb24oY29uc3QgY21zUGlwZWxpbmUqIEx1dCwgY21zQm9vbCBJc1Y0LCBjbXNUYWdTaWduYXR1cmUgRGVzdGluYXRpb25UYWcpCit7CisgICAgY21zVUludDMyTnVtYmVyIG47CisKKyAgICBmb3IgKG49MDsgbiA8IFNJWkVfT0ZfQUxMT1dFRF9MVVQ7IG4rKykgeworCisgICAgICAgIGNvbnN0IGNtc0FsbG93ZWRMVVQqIFRhYiA9IEFsbG93ZWRMVVRUeXBlcyArIG47CisKKyAgICAgICAgaWYgKElzVjQgXiBUYWIgLT4gSXNWNCkgY29udGludWU7CisgICAgICAgIGlmICgoVGFiIC0+UmVxdWlyZWRUYWcgIT0gMCkgJiYgKFRhYiAtPlJlcXVpcmVkVGFnICE9IERlc3RpbmF0aW9uVGFnKSkgY29udGludWU7CisKKyAgICAgICAgaWYgKENoZWNrT25lKFRhYiwgTHV0KSkgcmV0dXJuIFRhYjsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworCisvLyBEb2VzIGNvbnZlcnQgYSB0cmFuc2Zvcm0gaW50byBhIGRldmljZSBsaW5rIHByb2ZpbGUKK2Ntc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNUcmFuc2Zvcm0yRGV2aWNlTGluayhjbXNIVFJBTlNGT1JNIGhUcmFuc2Zvcm0sIGNtc0Zsb2F0NjROdW1iZXIgVmVyc2lvbiwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpCit7CisgICAgY21zSFBST0ZJTEUgaFByb2ZpbGUgPSBOVUxMOworICAgIGNtc1VJbnQzMk51bWJlciBGcm1JbiwgRnJtT3V0LCBDaGFuc0luLCBDaGFuc091dDsKKyAgICBjbXNVSW50MzJOdW1iZXIgQ29sb3JTcGFjZUJpdHNJbiwgQ29sb3JTcGFjZUJpdHNPdXQ7CisgICAgX2Ntc1RSQU5TRk9STSogeGZvcm0gPSAoX2Ntc1RSQU5TRk9STSopIGhUcmFuc2Zvcm07CisgICAgY21zUGlwZWxpbmUqIExVVCA9IE5VTEw7CisgICAgY21zU3RhZ2UqIG1wZTsKKyAgICBjbXNDb250ZXh0IENvbnRleHRJRCA9IGNtc0dldFRyYW5zZm9ybUNvbnRleHRJRChoVHJhbnNmb3JtKTsKKyAgICBjb25zdCBjbXNBbGxvd2VkTFVUKiBBbGxvd2VkTFVUOworICAgIGNtc1RhZ1NpZ25hdHVyZSBEZXN0aW5hdGlvblRhZzsKKyAgICBjbXNQcm9maWxlQ2xhc3NTaWduYXR1cmUgZGV2aWNlQ2xhc3M7IAorCisgICAgX2Ntc0Fzc2VydChoVHJhbnNmb3JtICE9IE5VTEwpOworCisgICAgLy8gR2V0IHRoZSBmaXJzdCBtcGUgdG8gY2hlY2sgZm9yIG5hbWVkIGNvbG9yCisgICAgbXBlID0gY21zUGlwZWxpbmVHZXRQdHJUb0ZpcnN0U3RhZ2UoeGZvcm0gLT5MdXQpOworCisgICAgLy8gQ2hlY2sgaWYgaXMgYSBuYW1lZCBjb2xvciB0cmFuc2Zvcm0KKyAgICBpZiAobXBlICE9IE5VTEwpIHsKKworICAgICAgICBpZiAoY21zU3RhZ2VUeXBlKG1wZSkgPT0gY21zU2lnTmFtZWRDb2xvckVsZW1UeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gQ3JlYXRlTmFtZWRDb2xvckRldmljZWxpbmsoaFRyYW5zZm9ybSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGaXJzdCB0aGluZyB0byBkbyBpcyB0byBnZXQgYSBjb3B5IG9mIHRoZSB0cmFuc2Zvcm1hdGlvbgorICAgIExVVCA9IGNtc1BpcGVsaW5lRHVwKHhmb3JtIC0+THV0KTsKKyAgICBpZiAoTFVUID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgLy8gVGltZSB0byBmaXggdGhlIExhYjIvTGFiNCBpc3N1ZS4KKyAgICBpZiAoKHhmb3JtIC0+RW50cnlDb2xvclNwYWNlID09IGNtc1NpZ0xhYkRhdGEpICYmIChWZXJzaW9uIDwgNC4wKSkgeworCisgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMVVQsIGNtc0FUX0JFR0lOLCBfY21zU3RhZ2VBbGxvY0xhYlYyVG9WNGN1cnZlcyhDb250ZXh0SUQpKSkKKyAgICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgLy8gT24gdGhlIG91dHB1dCBzaWRlIHRvbworICAgIGlmICgoeGZvcm0gLT5FeGl0Q29sb3JTcGFjZSkgPT0gY21zU2lnTGFiRGF0YSAmJiAoVmVyc2lvbiA8IDQuMCkpIHsKKworICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTFVULCBjbXNBVF9FTkQsIF9jbXNTdGFnZUFsbG9jTGFiVjRUb1YyKENvbnRleHRJRCkpKQorICAgICAgICAgICAgZ290byBFcnJvcjsKKyAgICB9CisKKworICAgIGhQcm9maWxlID0gY21zQ3JlYXRlUHJvZmlsZVBsYWNlaG9sZGVyKENvbnRleHRJRCk7CisgICAgaWYgKCFoUHJvZmlsZSkgZ290byBFcnJvcjsgICAgICAgICAgICAgICAgICAgIC8vIGNhbid0IGFsbG9jYXRlCisKKyAgICBjbXNTZXRQcm9maWxlVmVyc2lvbihoUHJvZmlsZSwgVmVyc2lvbik7CisKKyAgICBGaXhDb2xvclNwYWNlcyhoUHJvZmlsZSwgeGZvcm0gLT4gRW50cnlDb2xvclNwYWNlLCB4Zm9ybSAtPiBFeGl0Q29sb3JTcGFjZSwgZHdGbGFncyk7CisKKyAgICAvLyBPcHRpbWl6ZSB0aGUgTFVUIGFuZCBwcmVjYWxjdWxhdGUgYSBkZXZpY2VsaW5rCisKKyAgICBDaGFuc0luICA9IGNtc0NoYW5uZWxzT2YoeGZvcm0gLT4gRW50cnlDb2xvclNwYWNlKTsKKyAgICBDaGFuc091dCA9IGNtc0NoYW5uZWxzT2YoeGZvcm0gLT4gRXhpdENvbG9yU3BhY2UpOworCisgICAgQ29sb3JTcGFjZUJpdHNJbiAgPSBfY21zTENNU2NvbG9yU3BhY2UoeGZvcm0gLT4gRW50cnlDb2xvclNwYWNlKTsKKyAgICBDb2xvclNwYWNlQml0c091dCA9IF9jbXNMQ01TY29sb3JTcGFjZSh4Zm9ybSAtPiBFeGl0Q29sb3JTcGFjZSk7CisKKyAgICBGcm1JbiAgPSBDT0xPUlNQQUNFX1NIKENvbG9yU3BhY2VCaXRzSW4pIHwgQ0hBTk5FTFNfU0goQ2hhbnNJbil8QllURVNfU0goMik7CisgICAgRnJtT3V0ID0gQ09MT1JTUEFDRV9TSChDb2xvclNwYWNlQml0c091dCkgfCBDSEFOTkVMU19TSChDaGFuc091dCl8QllURVNfU0goMik7CisKKyAgICBkZXZpY2VDbGFzcyA9IGNtc0dldERldmljZUNsYXNzKGhQcm9maWxlKTsKKworICAgICBpZiAoZGV2aWNlQ2xhc3MgPT0gY21zU2lnT3V0cHV0Q2xhc3MpCisgICAgICAgICBEZXN0aW5hdGlvblRhZyA9IGNtc1NpZ0JUb0EwVGFnOworICAgICBlbHNlCisgICAgICAgICBEZXN0aW5hdGlvblRhZyA9IGNtc1NpZ0FUb0IwVGFnOworCisgICAgLy8gQ2hlY2sgaWYgdGhlIHByb2ZpbGUvdmVyc2lvbiBjYW4gc3RvcmUgdGhlIHJlc3VsdAorICAgIGlmIChkd0ZsYWdzICYgY21zRkxBR1NfRk9SQ0VfQ0xVVCkKKyAgICAgICAgQWxsb3dlZExVVCA9IE5VTEw7CisgICAgZWxzZQorICAgICAgICBBbGxvd2VkTFVUID0gRmluZENvbWJpbmF0aW9uKExVVCwgVmVyc2lvbiA+PSA0LjAsIERlc3RpbmF0aW9uVGFnKTsKKworICAgIGlmIChBbGxvd2VkTFVUID09IE5VTEwpIHsKKworICAgICAgICAvLyBUcnkgdG8gb3B0aW1pemUKKyAgICAgICAgX2Ntc09wdGltaXplUGlwZWxpbmUoQ29udGV4dElELCAmTFVULCB4Zm9ybSAtPlJlbmRlcmluZ0ludGVudCwgJkZybUluLCAmRnJtT3V0LCAmZHdGbGFncyk7CisgICAgICAgIEFsbG93ZWRMVVQgPSBGaW5kQ29tYmluYXRpb24oTFVULCBWZXJzaW9uID49IDQuMCwgRGVzdGluYXRpb25UYWcpOworCisgICAgfQorCisgICAgLy8gSWYgbm8gd2F5LCB0aGVuIGZvcmNlIENMVVQgdGhhdCBmb3Igc3VyZSBjYW4gYmUgd3JpdHRlbgorICAgIGlmIChBbGxvd2VkTFVUID09IE5VTEwpIHsKKworICAgICAgICBjbXNTdGFnZSogRmlyc3RTdGFnZTsKKyAgICAgICAgY21zU3RhZ2UqIExhc3RTdGFnZTsKKworICAgICAgICBkd0ZsYWdzIHw9IGNtc0ZMQUdTX0ZPUkNFX0NMVVQ7CisgICAgICAgIF9jbXNPcHRpbWl6ZVBpcGVsaW5lKENvbnRleHRJRCwgJkxVVCwgeGZvcm0gLT5SZW5kZXJpbmdJbnRlbnQsICZGcm1JbiwgJkZybU91dCwgJmR3RmxhZ3MpOworCisgICAgICAgIC8vIFB1dCBpZGVudGl0eSBjdXJ2ZXMgaWYgbmVlZGVkCisgICAgICAgIEZpcnN0U3RhZ2UgPSBjbXNQaXBlbGluZUdldFB0clRvRmlyc3RTdGFnZShMVVQpOworICAgICAgICBpZiAoRmlyc3RTdGFnZSAhPSBOVUxMICYmIEZpcnN0U3RhZ2UgLT5UeXBlICE9IGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUpCisgICAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKExVVCwgY21zQVRfQkVHSU4sIF9jbXNTdGFnZUFsbG9jSWRlbnRpdHlDdXJ2ZXMoQ29udGV4dElELCBDaGFuc0luKSkpCisgICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7CisKKyAgICAgICAgTGFzdFN0YWdlID0gY21zUGlwZWxpbmVHZXRQdHJUb0xhc3RTdGFnZShMVVQpOworICAgICAgICBpZiAoTGFzdFN0YWdlICE9IE5VTEwgJiYgTGFzdFN0YWdlIC0+VHlwZSAhPSBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlKQorICAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMVVQsIGNtc0FUX0VORCwgICBfY21zU3RhZ2VBbGxvY0lkZW50aXR5Q3VydmVzKENvbnRleHRJRCwgQ2hhbnNPdXQpKSkKKyAgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKKworICAgICAgICBBbGxvd2VkTFVUID0gRmluZENvbWJpbmF0aW9uKExVVCwgVmVyc2lvbiA+PSA0LjAsIERlc3RpbmF0aW9uVGFnKTsKKyAgICB9CisKKyAgICAvLyBTb21ldGhpbmdzIGlzIHdyb25nLi4uCisgICAgaWYgKEFsbG93ZWRMVVQgPT0gTlVMTCkgeworICAgICAgICBnb3RvIEVycm9yOworICAgIH0KKworCisgICAgaWYgKGR3RmxhZ3MgJiBjbXNGTEFHU184QklUU19ERVZJQ0VMSU5LKQorICAgICAgICAgICAgICAgICAgICAgY21zUGlwZWxpbmVTZXRTYXZlQXM4Yml0c0ZsYWcoTFVULCBUUlVFKTsKKworICAgIC8vIFRhZyBwcm9maWxlIHdpdGggaW5mb3JtYXRpb24KKyAgICBpZiAoIVNldFRleHRUYWdzKGhQcm9maWxlLCBMImRldmljZWxpbmsiKSkgZ290byBFcnJvcjsKKworICAgIC8vIFN0b3JlIHJlc3VsdAorICAgIGlmICghY21zV3JpdGVUYWcoaFByb2ZpbGUsIERlc3RpbmF0aW9uVGFnLCBMVVQpKSBnb3RvIEVycm9yOworCisKKyAgICBpZiAoeGZvcm0gLT4gSW5wdXRDb2xvcmFudCAhPSBOVUxMKSB7CisgICAgICAgICAgIGlmICghY21zV3JpdGVUYWcoaFByb2ZpbGUsIGNtc1NpZ0NvbG9yYW50VGFibGVUYWcsIHhmb3JtLT5JbnB1dENvbG9yYW50KSkgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICBpZiAoeGZvcm0gLT4gT3V0cHV0Q29sb3JhbnQgIT0gTlVMTCkgeworICAgICAgICAgICBpZiAoIWNtc1dyaXRlVGFnKGhQcm9maWxlLCBjbXNTaWdDb2xvcmFudFRhYmxlT3V0VGFnLCB4Zm9ybS0+T3V0cHV0Q29sb3JhbnQpKSBnb3RvIEVycm9yOworICAgIH0KKworICAgIGlmICgoZGV2aWNlQ2xhc3MgPT0gY21zU2lnTGlua0NsYXNzKSAmJiAoeGZvcm0gLT5TZXF1ZW5jZSAhPSBOVUxMKSkgeworICAgICAgICBpZiAoIV9jbXNXcml0ZVByb2ZpbGVTZXF1ZW5jZShoUHJvZmlsZSwgeGZvcm0gLT5TZXF1ZW5jZSkpIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgLy8gU2V0IHRoZSB3aGl0ZSBwb2ludAorICAgIGlmIChkZXZpY2VDbGFzcyA9PSBjbXNTaWdJbnB1dENsYXNzKSB7CisgICAgICAgIGlmICghY21zV3JpdGVUYWcoaFByb2ZpbGUsIGNtc1NpZ01lZGlhV2hpdGVQb2ludFRhZywgJnhmb3JtIC0+RW50cnlXaGl0ZVBvaW50KSkgZ290byBFcnJvcjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICBpZiAoIWNtc1dyaXRlVGFnKGhQcm9maWxlLCBjbXNTaWdNZWRpYVdoaXRlUG9pbnRUYWcsICZ4Zm9ybSAtPkV4aXRXaGl0ZVBvaW50KSkgZ290byBFcnJvcjsKKyAgICB9CisKKyAgCisgICAgLy8gUGVyIDcuMi4xNSBpbiBzcGVjIDQuMworICAgIGNtc1NldEhlYWRlclJlbmRlcmluZ0ludGVudChoUHJvZmlsZSwgeGZvcm0gLT5SZW5kZXJpbmdJbnRlbnQpOworCisgICAgY21zUGlwZWxpbmVGcmVlKExVVCk7CisgICAgcmV0dXJuIGhQcm9maWxlOworCitFcnJvcjoKKyAgICBpZiAoTFVUICE9IE5VTEwpIGNtc1BpcGVsaW5lRnJlZShMVVQpOworICAgIGNtc0Nsb3NlUHJvZmlsZShoUHJvZmlsZSk7CisgICAgcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXN3dHBudC5jIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zd3RwbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmI2MTI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zd3RwbnQuYwpAQCAtMCwwICsxLDM1MSBAQAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCisvLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTYgTWFydGkgTWFyaWEgU2FndWVyCisvLworLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisvLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisvLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisvLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKy8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQorLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKy8vCisvLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisvLworLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisvLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KKy8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisvLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCisvLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisvLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKy8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworCisjaW5jbHVkZSAibGNtczJfaW50ZXJuYWwuaCIKKworCisvLyBENTAgLSBXaWRlbHkgdXNlZAorY29uc3QgY21zQ0lFWFlaKiBDTVNFWFBPUlQgY21zRDUwX1hZWih2b2lkKQoreworICAgIHN0YXRpYyBjbXNDSUVYWVogRDUwWFlaID0ge2Ntc0Q1MFgsIGNtc0Q1MFksIGNtc0Q1MFp9OworCisgICAgcmV0dXJuICZENTBYWVo7Cit9CisKK2NvbnN0IGNtc0NJRXh5WSogQ01TRVhQT1JUIGNtc0Q1MF94eVkodm9pZCkKK3sKKyAgICBzdGF0aWMgY21zQ0lFeHlZIEQ1MHh5WTsKKworICAgIGNtc1hZWjJ4eVkoJkQ1MHh5WSwgY21zRDUwX1hZWigpKTsKKworICAgIHJldHVybiAmRDUweHlZOworfQorCisvLyBPYnRhaW5zIFdoaXRlUG9pbnQgZnJvbSBUZW1wZXJhdHVyZQorY21zQm9vbCAgQ01TRVhQT1JUIGNtc1doaXRlUG9pbnRGcm9tVGVtcChjbXNDSUV4eVkqIFdoaXRlUG9pbnQsIGNtc0Zsb2F0NjROdW1iZXIgVGVtcEspCit7CisgICAgY21zRmxvYXQ2NE51bWJlciB4LCB5OworICAgIGNtc0Zsb2F0NjROdW1iZXIgVCwgVDIsIFQzOworICAgIC8vIGNtc0Zsb2F0NjROdW1iZXIgTTEsIE0yOworCisgICAgX2Ntc0Fzc2VydChXaGl0ZVBvaW50ICE9IE5VTEwpOworCisgICAgVCA9IFRlbXBLOworICAgIFQyID0gVCpUOyAgICAgICAgICAgIC8vIFNxdWFyZQorICAgIFQzID0gVDIqVDsgICAgICAgICAgIC8vIEN1YmUKKworICAgIC8vIEZvciBjb3JyZWxhdGVkIGNvbG9yIHRlbXBlcmF0dXJlIChUKSBiZXR3ZWVuIDQwMDBLIGFuZCA3MDAwSzoKKworICAgIGlmIChUID49IDQwMDAuICYmIFQgPD0gNzAwMC4pCisgICAgeworICAgICAgICB4ID0gLTQuNjA3MCooMUU5L1QzKSArIDIuOTY3OCooMUU2L1QyKSArIDAuMDk5MTEqKDFFMy9UKSArIDAuMjQ0MDYzOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIC8vIG9yIGZvciBjb3JyZWxhdGVkIGNvbG9yIHRlbXBlcmF0dXJlIChUKSBiZXR3ZWVuIDcwMDBLIGFuZCAyNTAwMEs6CisKKyAgICAgICAgaWYgKFQgPiA3MDAwLjAgJiYgVCA8PSAyNTAwMC4wKQorICAgICAgICB7CisgICAgICAgICAgICB4ID0gLTIuMDA2NCooMUU5L1QzKSArIDEuOTAxOCooMUU2L1QyKSArIDAuMjQ3NDgqKDFFMy9UKSArIDAuMjM3MDQwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoMCwgY21zRVJST1JfUkFOR0UsICJjbXNXaGl0ZVBvaW50RnJvbVRlbXA6IGludmFsaWQgdGVtcCIpOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLy8gT2J0YWluIHkoeCkKKworICAgICAgICB5ID0gLTMuMDAwKih4KngpICsgMi44NzAqeCAtIDAuMjc1OworCisgICAgICAgIC8vIHdhdmUgZmFjdG9ycyAobm90IHVzZWQsIGJ1dCBoZXJlIGZvciBmdXR1cmVzIGV4dGVuc2lvbnMpCisKKyAgICAgICAgLy8gTTEgPSAoLTEuMzUxNSAtIDEuNzcwMyp4ICsgNS45MTE0ICp5KS8oMC4wMjQxICsgMC4yNTYyKnggLSAwLjczNDEqeSk7CisgICAgICAgIC8vIE0yID0gKDAuMDMwMCAtIDMxLjQ0MjQqeCArIDMwLjA3MTcqeSkvKDAuMDI0MSArIDAuMjU2Mip4IC0gMC43MzQxKnkpOworCisgICAgICAgIFdoaXRlUG9pbnQgLT4geCA9IHg7CisgICAgICAgIFdoaXRlUG9pbnQgLT4geSA9IHk7CisgICAgICAgIFdoaXRlUG9pbnQgLT4gWSA9IDEuMDsKKworICAgICAgICByZXR1cm4gVFJVRTsKK30KKworCisKK3R5cGVkZWYgc3RydWN0IHsKKworICAgIGNtc0Zsb2F0NjROdW1iZXIgbWlyZWs7ICAvLyB0ZW1wIChpbiBtaWNyb3JlY2lwcm9jYWwga2VsdmluKQorICAgIGNtc0Zsb2F0NjROdW1iZXIgdXQ7ICAgICAvLyB1IGNvb3JkIG9mIGludGVyc2VjdGlvbiB3LyBibGFja2JvZHkgbG9jdXMKKyAgICBjbXNGbG9hdDY0TnVtYmVyIHZ0OyAgICAgLy8gdiBjb29yZCBvZiBpbnRlcnNlY3Rpb24gdy8gYmxhY2tib2R5IGxvY3VzCisgICAgY21zRmxvYXQ2NE51bWJlciB0dDsgICAgIC8vIHNsb3BlIG9mIElTT1RFTVBFUkFUVVJFLiBsaW5lCisKKyAgICB9IElTT1RFTVBFUkFUVVJFOworCitzdGF0aWMgSVNPVEVNUEVSQVRVUkUgaXNvdGVtcGRhdGFbXSA9IHsKKy8vICB7TWlyZWssIFV0LCAgICAgICBWdCwgICAgICBUdCAgICAgIH0KKyAgICB7MCwgICAgIDAuMTgwMDYsICAwLjI2MzUyLCAgLTAuMjQzNDF9LAorICAgIHsxMCwgICAgMC4xODA2NiwgIDAuMjY1ODksICAtMC4yNTQ3OX0sCisgICAgezIwLCAgICAwLjE4MTMzLCAgMC4yNjg0NiwgIC0wLjI2ODc2fSwKKyAgICB7MzAsICAgIDAuMTgyMDgsICAwLjI3MTE5LCAgLTAuMjg1Mzl9LAorICAgIHs0MCwgICAgMC4xODI5MywgIDAuMjc0MDcsICAtMC4zMDQ3MH0sCisgICAgezUwLCAgICAwLjE4Mzg4LCAgMC4yNzcwOSwgIC0wLjMyNjc1fSwKKyAgICB7NjAsICAgIDAuMTg0OTQsICAwLjI4MDIxLCAgLTAuMzUxNTZ9LAorICAgIHs3MCwgICAgMC4xODYxMSwgIDAuMjgzNDIsICAtMC4zNzkxNX0sCisgICAgezgwLCAgICAwLjE4NzQwLCAgMC4yODY2OCwgIC0wLjQwOTU1fSwKKyAgICB7OTAsICAgIDAuMTg4ODAsICAwLjI4OTk3LCAgLTAuNDQyNzh9LAorICAgIHsxMDAsICAgMC4xOTAzMiwgIDAuMjkzMjYsICAtMC40Nzg4OH0sCisgICAgezEyNSwgICAwLjE5NDYyLCAgMC4zMDE0MSwgIC0wLjU4MjA0fSwKKyAgICB7MTUwLCAgIDAuMTk5NjIsICAwLjMwOTIxLCAgLTAuNzA0NzF9LAorICAgIHsxNzUsICAgMC4yMDUyNSwgIDAuMzE2NDcsICAtMC44NDkwMX0sCisgICAgezIwMCwgICAwLjIxMTQyLCAgMC4zMjMxMiwgIC0xLjAxODIgfSwKKyAgICB7MjI1LCAgIDAuMjE4MDcsICAwLjMyOTA5LCAgLTEuMjE2OCB9LAorICAgIHsyNTAsICAgMC4yMjUxMSwgIDAuMzM0MzksICAtMS40NTEyIH0sCisgICAgezI3NSwgICAwLjIzMjQ3LCAgMC4zMzkwNCwgIC0xLjcyOTggfSwKKyAgICB7MzAwLCAgIDAuMjQwMTAsICAwLjM0MzA4LCAgLTIuMDYzNyB9LAorICAgIHszMjUsICAgMC4yNDcwMiwgIDAuMzQ2NTUsICAtMi40NjgxIH0sCisgICAgezM1MCwgICAwLjI1NTkxLCAgMC4zNDk1MSwgIC0yLjk2NDEgfSwKKyAgICB7Mzc1LCAgIDAuMjY0MDAsICAwLjM1MjAwLCAgLTMuNTgxNCB9LAorICAgIHs0MDAsICAgMC4yNzIxOCwgIDAuMzU0MDcsICAtNC4zNjMzIH0sCisgICAgezQyNSwgICAwLjI4MDM5LCAgMC4zNTU3NywgIC01LjM3NjIgfSwKKyAgICB7NDUwLCAgIDAuMjg4NjMsICAwLjM1NzE0LCAgLTYuNzI2MiB9LAorICAgIHs0NzUsICAgMC4yOTY4NSwgIDAuMzU4MjMsICAtOC41OTU1IH0sCisgICAgezUwMCwgICAwLjMwNTA1LCAgMC4zNTkwNywgIC0xMS4zMjQgfSwKKyAgICB7NTI1LCAgIDAuMzEzMjAsICAwLjM1OTY4LCAgLTE1LjYyOCB9LAorICAgIHs1NTAsICAgMC4zMjEyOSwgIDAuMzYwMTEsICAtMjMuMzI1IH0sCisgICAgezU3NSwgICAwLjMyOTMxLCAgMC4zNjAzOCwgIC00MC43NzAgfSwKKyAgICB7NjAwLCAgIDAuMzM3MjQsICAwLjM2MDUxLCAgLTExNi40NSAgfQorfTsKKworI2RlZmluZSBOSVNPIHNpemVvZihpc290ZW1wZGF0YSkvc2l6ZW9mKElTT1RFTVBFUkFUVVJFKQorCisKKy8vIFJvYmVydHNvbidzIG1ldGhvZAorY21zQm9vbCAgQ01TRVhQT1JUIGNtc1RlbXBGcm9tV2hpdGVQb2ludChjbXNGbG9hdDY0TnVtYmVyKiBUZW1wSywgY29uc3QgY21zQ0lFeHlZKiBXaGl0ZVBvaW50KQoreworICAgIGNtc1VJbnQzMk51bWJlciBqOworICAgIGNtc0Zsb2F0NjROdW1iZXIgdXMsdnM7CisgICAgY21zRmxvYXQ2NE51bWJlciB1aix2aix0aixkaSxkaixtaSxtajsKKyAgICBjbXNGbG9hdDY0TnVtYmVyIHhzLCB5czsKKworICAgIF9jbXNBc3NlcnQoV2hpdGVQb2ludCAhPSBOVUxMKTsKKyAgICBfY21zQXNzZXJ0KFRlbXBLICE9IE5VTEwpOworCisgICAgZGkgPSBtaSA9IDA7CisgICAgeHMgPSBXaGl0ZVBvaW50IC0+IHg7CisgICAgeXMgPSBXaGl0ZVBvaW50IC0+IHk7CisKKyAgICAvLyBjb252ZXJ0ICh4LHkpIHRvIENJRSAxOTYwICh1LFdoaXRlUG9pbnQpCisKKyAgICB1cyA9ICgyKnhzKSAvICgteHMgKyA2KnlzICsgMS41KTsKKyAgICB2cyA9ICgzKnlzKSAvICgteHMgKyA2KnlzICsgMS41KTsKKworCisgICAgZm9yIChqPTA7IGogPCBOSVNPOyBqKyspIHsKKworICAgICAgICB1aiA9IGlzb3RlbXBkYXRhW2pdLnV0OworICAgICAgICB2aiA9IGlzb3RlbXBkYXRhW2pdLnZ0OworICAgICAgICB0aiA9IGlzb3RlbXBkYXRhW2pdLnR0OworICAgICAgICBtaiA9IGlzb3RlbXBkYXRhW2pdLm1pcmVrOworCisgICAgICAgIGRqID0gKCh2cyAtIHZqKSAtIHRqICogKHVzIC0gdWopKSAvIHNxcnQoMS4wICsgdGogKiB0aik7CisKKyAgICAgICAgaWYgKChqICE9IDApICYmIChkaS9kaiA8IDAuMCkpIHsKKworICAgICAgICAgICAgLy8gRm91bmQgYSBtYXRjaAorICAgICAgICAgICAgKlRlbXBLID0gMTAwMDAwMC4wIC8gKG1pICsgKGRpIC8gKGRpIC0gZGopKSAqIChtaiAtIG1pKSk7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIGRpID0gZGo7CisgICAgICAgIG1pID0gbWo7CisgICAgfQorCisgICAgLy8gTm90IGZvdW5kCisgICAgcmV0dXJuIEZBTFNFOworfQorCisKKy8vIENvbXB1dGUgY2hyb21hdGljIGFkYXB0YXRpb24gbWF0cml4IHVzaW5nIENoYWQgYXMgY29uZSBtYXRyaXgKKworc3RhdGljCitjbXNCb29sIENvbXB1dGVDaHJvbWF0aWNBZGFwdGF0aW9uKGNtc01BVDMqIENvbnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0NJRVhZWiogU291cmNlV2hpdGVQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zQ0lFWFlaKiBEZXN0V2hpdGVQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zTUFUMyogQ2hhZCkKKworeworCisgICAgY21zTUFUMyBDaGFkX0ludjsKKyAgICBjbXNWRUMzIENvbmVTb3VyY2VYWVosIENvbmVTb3VyY2VSR0I7CisgICAgY21zVkVDMyBDb25lRGVzdFhZWiwgQ29uZURlc3RSR0I7CisgICAgY21zTUFUMyBDb25lLCBUbXA7CisKKworICAgIFRtcCA9ICpDaGFkOworICAgIGlmICghX2Ntc01BVDNpbnZlcnNlKCZUbXAsICZDaGFkX0ludikpIHJldHVybiBGQUxTRTsKKworICAgIF9jbXNWRUMzaW5pdCgmQ29uZVNvdXJjZVhZWiwgU291cmNlV2hpdGVQb2ludCAtPiBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VXaGl0ZVBvaW50IC0+IFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVdoaXRlUG9pbnQgLT4gWik7CisKKyAgICBfY21zVkVDM2luaXQoJkNvbmVEZXN0WFlaLCAgIERlc3RXaGl0ZVBvaW50IC0+IFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3RXaGl0ZVBvaW50IC0+IFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc3RXaGl0ZVBvaW50IC0+IFopOworCisgICAgX2Ntc01BVDNldmFsKCZDb25lU291cmNlUkdCLCBDaGFkLCAmQ29uZVNvdXJjZVhZWik7CisgICAgX2Ntc01BVDNldmFsKCZDb25lRGVzdFJHQiwgICBDaGFkLCAmQ29uZURlc3RYWVopOworCisgICAgLy8gQnVpbGQgbWF0cml4CisgICAgX2Ntc1ZFQzNpbml0KCZDb25lLnZbMF0sIENvbmVEZXN0UkdCLm5bMF0vQ29uZVNvdXJjZVJHQi5uWzBdLCAgICAwLjAsICAwLjApOworICAgIF9jbXNWRUMzaW5pdCgmQ29uZS52WzFdLCAwLjAsICAgQ29uZURlc3RSR0IublsxXS9Db25lU291cmNlUkdCLm5bMV0sICAgMC4wKTsKKyAgICBfY21zVkVDM2luaXQoJkNvbmUudlsyXSwgMC4wLCAgIDAuMCwgICBDb25lRGVzdFJHQi5uWzJdL0NvbmVTb3VyY2VSR0IublsyXSk7CisKKworICAgIC8vIE5vcm1hbGl6ZQorICAgIF9jbXNNQVQzcGVyKCZUbXAsICZDb25lLCBDaGFkKTsKKyAgICBfY21zTUFUM3BlcihDb252ZXJzaW9uLCAmQ2hhZF9JbnYsICZUbXApOworCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8vIFJldHVybnMgdGhlIGZpbmFsIGNocm1hdGljIGFkYXB0YXRpb24gZnJvbSBpbGx1bWluYW50IEZyb21JbGwgdG8gSWxsdW1pbmFudCBUb0lsbAorLy8gVGhlIGNvbmUgbWF0cml4IGNhbiBiZSBzcGVjaWZpZWQgaW4gQ29uZU1hdHJpeC4gSWYgTlVMTCwgQnJhZGZvcmQgaXMgYXNzdW1lZAorY21zQm9vbCAgX2Ntc0FkYXB0YXRpb25NYXRyaXgoY21zTUFUMyogciwgY29uc3QgY21zTUFUMyogQ29uZU1hdHJpeCwgY29uc3QgY21zQ0lFWFlaKiBGcm9tSWxsLCBjb25zdCBjbXNDSUVYWVoqIFRvSWxsKQoreworICAgIGNtc01BVDMgTGFtUmlnZyAgID0ge3sgLy8gQnJhZGZvcmQgbWF0cml4CisgICAgICAgIHt7ICAwLjg5NTEsICAwLjI2NjQsIC0wLjE2MTQgfX0sCisgICAgICAgIHt7IC0wLjc1MDIsICAxLjcxMzUsICAwLjAzNjcgfX0sCisgICAgICAgIHt7ICAwLjAzODksIC0wLjA2ODUsICAxLjAyOTYgfX0KKyAgICB9fTsKKworICAgIGlmIChDb25lTWF0cml4ID09IE5VTEwpCisgICAgICAgIENvbmVNYXRyaXggPSAmTGFtUmlnZzsKKworICAgIHJldHVybiBDb21wdXRlQ2hyb21hdGljQWRhcHRhdGlvbihyLCBGcm9tSWxsLCBUb0lsbCwgQ29uZU1hdHJpeCk7Cit9CisKKy8vIFNhbWUgYXMgYW50ZXJpb3IsIGJ1dCBhc3N1bWluZyBENTAgZGVzdGluYXRpb24uIFdoaXRlIHBvaW50IGlzIGdpdmVuIGluIHh5WQorc3RhdGljCitjbXNCb29sIF9jbXNBZGFwdE1hdHJpeFRvRDUwKGNtc01BVDMqIHIsIGNvbnN0IGNtc0NJRXh5WSogU291cmNlV2hpdGVQdCkKK3sKKyAgICBjbXNDSUVYWVogRG47CisgICAgY21zTUFUMyBCcmFkZm9yZDsKKyAgICBjbXNNQVQzIFRtcDsKKworICAgIGNtc3h5WTJYWVooJkRuLCBTb3VyY2VXaGl0ZVB0KTsKKworICAgIGlmICghX2Ntc0FkYXB0YXRpb25NYXRyaXgoJkJyYWRmb3JkLCBOVUxMLCAmRG4sIGNtc0Q1MF9YWVooKSkpIHJldHVybiBGQUxTRTsKKworICAgIFRtcCA9ICpyOworICAgIF9jbXNNQVQzcGVyKHIsICZCcmFkZm9yZCwgJlRtcCk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gQnVpbGQgYSBXaGl0ZSBwb2ludCwgcHJpbWFyeSBjaHJvbWFzIHRyYW5zZmVyIG1hdHJpeCBmcm9tIFJHQiB0byBDSUUgWFlaCisvLyBUaGlzIGlzIGp1c3QgYW4gYXBwcm94aW1hdGlvbiwgSSBhbSBub3QgaGFuZGxpbmcgYWxsIHRoZSBub24tbGluZWFyCisvLyBhc3BlY3RzIG9mIHRoZSBSR0IgdG8gWFlaIHByb2Nlc3MsIGFuZCBhc3N1bW1pbmcgdGhhdCB0aGUgZ2FtbWEgY29ycmVjdGlvbgorLy8gaGFzIHRyYW5zaXRpdmUgcHJvcGVydHkgaW4gdGhlIHRyYW5mb3JtYXRpb24gY2hhaW4uCisvLworLy8gdGhlIGFsZ2hvcml0bToKKy8vCisvLyAgICAgICAgICAgIC0gRmlyc3QgSSBidWlsZCB0aGUgYWJzb2x1dGUgY29udmVyc2lvbiBtYXRyaXggdXNpbmcKKy8vICAgICAgICAgICAgICBwcmltYXJpZXMgaW4gWFlaLiBUaGlzIG1hdHJpeCBpcyBuZXh0IGludmVydGVkCisvLyAgICAgICAgICAgIC0gVGhlbiBJIGV2YWwgdGhlIHNvdXJjZSB3aGl0ZSBwb2ludCBhY3Jvc3MgdGhpcyBtYXRyaXgKKy8vICAgICAgICAgICAgICBvYnRhaW5pbmcgdGhlIGNvZWZpY2llbnRzIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbgorLy8gICAgICAgICAgICAtIFRoZW4sIEkgYXBwbHkgdGhlc2UgY29lZmljaWVudHMgdG8gdGhlIG9yaWdpbmFsIG1hdHJpeAorLy8KK2Ntc0Jvb2wgX2Ntc0J1aWxkUkdCMlhZWnRyYW5zZmVyTWF0cml4KGNtc01BVDMqIHIsIGNvbnN0IGNtc0NJRXh5WSogV2hpdGVQdCwgY29uc3QgY21zQ0lFeHlZVFJJUExFKiBQcmltcnMpCit7CisgICAgY21zVkVDMyBXaGl0ZVBvaW50LCBDb2VmOworICAgIGNtc01BVDMgUmVzdWx0LCBQcmltYXJpZXM7CisgICAgY21zRmxvYXQ2NE51bWJlciB4biwgeW47CisgICAgY21zRmxvYXQ2NE51bWJlciB4ciwgeXI7CisgICAgY21zRmxvYXQ2NE51bWJlciB4ZywgeWc7CisgICAgY21zRmxvYXQ2NE51bWJlciB4YiwgeWI7CisKKyAgICB4biA9IFdoaXRlUHQgLT4geDsKKyAgICB5biA9IFdoaXRlUHQgLT4geTsKKyAgICB4ciA9IFByaW1ycyAtPiBSZWQueDsKKyAgICB5ciA9IFByaW1ycyAtPiBSZWQueTsKKyAgICB4ZyA9IFByaW1ycyAtPiBHcmVlbi54OworICAgIHlnID0gUHJpbXJzIC0+IEdyZWVuLnk7CisgICAgeGIgPSBQcmltcnMgLT4gQmx1ZS54OworICAgIHliID0gUHJpbXJzIC0+IEJsdWUueTsKKworICAgIC8vIEJ1aWxkIFByaW1hcmllcyBtYXRyaXgKKyAgICBfY21zVkVDM2luaXQoJlByaW1hcmllcy52WzBdLCB4ciwgICAgICAgIHhnLCAgICAgICAgIHhiKTsKKyAgICBfY21zVkVDM2luaXQoJlByaW1hcmllcy52WzFdLCB5ciwgICAgICAgIHlnLCAgICAgICAgIHliKTsKKyAgICBfY21zVkVDM2luaXQoJlByaW1hcmllcy52WzJdLCAoMS14ci15ciksICgxLXhnLXlnKSwgICgxLXhiLXliKSk7CisKKworICAgIC8vIFJlc3VsdCA9IFByaW1hcmllcyBeICgtMSkgaW52ZXJzZSBtYXRyaXgKKyAgICBpZiAoIV9jbXNNQVQzaW52ZXJzZSgmUHJpbWFyaWVzLCAmUmVzdWx0KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworCisKKyAgICBfY21zVkVDM2luaXQoJldoaXRlUG9pbnQsIHhuL3luLCAxLjAsICgxLjAteG4teW4pL3luKTsKKworICAgIC8vIEFjcm9zcyBpbnZlcnNlIHByaW1hcmllcyAuLi4KKyAgICBfY21zTUFUM2V2YWwoJkNvZWYsICZSZXN1bHQsICZXaGl0ZVBvaW50KTsKKworICAgIC8vIEdpdmUgdXMgdGhlIENvZWZzLCB0aGVuIEkgYnVpbGQgdHJhbnNmb3JtYXRpb24gbWF0cml4CisgICAgX2Ntc1ZFQzNpbml0KCZyIC0+IHZbMF0sIENvZWYubltWWF0qeHIsICAgICAgICAgIENvZWYubltWWV0qeGcsICAgICAgICAgIENvZWYubltWWl0qeGIpOworICAgIF9jbXNWRUMzaW5pdCgmciAtPiB2WzFdLCBDb2VmLm5bVlhdKnlyLCAgICAgICAgICBDb2VmLm5bVlldKnlnLCAgICAgICAgICBDb2VmLm5bVlpdKnliKTsKKyAgICBfY21zVkVDM2luaXQoJnIgLT4gdlsyXSwgQ29lZi5uW1ZYXSooMS4wLXhyLXlyKSwgQ29lZi5uW1ZZXSooMS4wLXhnLXlnKSwgQ29lZi5uW1ZaXSooMS4wLXhiLXliKSk7CisKKworICAgIHJldHVybiBfY21zQWRhcHRNYXRyaXhUb0Q1MChyLCBXaGl0ZVB0KTsKKworfQorCisKKy8vIEFkYXB0cyBhIGNvbG9yIHRvIGEgZ2l2ZW4gaWxsdW1pbmFudC4gT3JpZ2luYWwgY29sb3IgaXMgZXhwZWN0ZWQgdG8gaGF2ZQorLy8gYSBTb3VyY2VXaGl0ZVB0IHdoaXRlIHBvaW50LgorY21zQm9vbCBDTVNFWFBPUlQgY21zQWRhcHRUb0lsbHVtaW5hbnQoY21zQ0lFWFlaKiBSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNDSUVYWVoqIFNvdXJjZVdoaXRlUHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNDSUVYWVoqIElsbHVtaW5hbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNDSUVYWVoqIFZhbHVlKQoreworICAgIGNtc01BVDMgQnJhZGZvcmQ7CisgICAgY21zVkVDMyBJbiwgT3V0OworCisgICAgX2Ntc0Fzc2VydChSZXN1bHQgIT0gTlVMTCk7CisgICAgX2Ntc0Fzc2VydChTb3VyY2VXaGl0ZVB0ICE9IE5VTEwpOworICAgIF9jbXNBc3NlcnQoSWxsdW1pbmFudCAhPSBOVUxMKTsKKyAgICBfY21zQXNzZXJ0KFZhbHVlICE9IE5VTEwpOworCisgICAgaWYgKCFfY21zQWRhcHRhdGlvbk1hdHJpeCgmQnJhZGZvcmQsIE5VTEwsIFNvdXJjZVdoaXRlUHQsIElsbHVtaW5hbnQpKSByZXR1cm4gRkFMU0U7CisKKyAgICBfY21zVkVDM2luaXQoJkluLCBWYWx1ZSAtPiBYLCBWYWx1ZSAtPiBZLCBWYWx1ZSAtPiBaKTsKKyAgICBfY21zTUFUM2V2YWwoJk91dCwgJkJyYWRmb3JkLCAmSW4pOworCisgICAgUmVzdWx0IC0+IFggPSBPdXQublswXTsKKyAgICBSZXN1bHQgLT4gWSA9IE91dC5uWzFdOworICAgIFJlc3VsdCAtPiBaID0gT3V0Lm5bMl07CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zL3NyYy9jbXN4Zm9ybS5jIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zeGZvcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzgwMmYwCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGNtcy9zcmMvY21zeGZvcm0uYwpAQCAtMCwwICsxLDEzMzEgQEAKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQorLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE2IE1hcnRpIE1hcmlhIFNhZ3VlcgorLy8KKy8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisvLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKKy8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisvLworLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKy8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorLy8KKy8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCisvLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAorLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQorLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgorLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCisvLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKworI2luY2x1ZGUgImxjbXMyX2ludGVybmFsLmgiCisKKy8vIFRyYW5zZm9ybWF0aW9ucyBzdHVmZgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBERUZBVUxUX09CU0VSVkVSX0FEQVBUQVRJT05fU1RBVEUgMS4wCisKKy8vIFRoZSBDb250ZXh0MCBvYnNlcnZlciBhZGFwdGF0aW9uIHN0YXRlLgorX2Ntc0FkYXB0YXRpb25TdGF0ZUNodW5rVHlwZSBfY21zQWRhcHRhdGlvblN0YXRlQ2h1bmsgPSB7IERFRkFVTFRfT0JTRVJWRVJfQURBUFRBVElPTl9TVEFURSB9OworCisvLyBJbml0IGFuZCBkdXBsaWNhdGUgb2JzZXJ2ZXIgYWRhcHRhdGlvbiBzdGF0ZQordm9pZCBfY21zQWxsb2NBZGFwdGF0aW9uU3RhdGVDaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCit7CisgICAgc3RhdGljIF9jbXNBZGFwdGF0aW9uU3RhdGVDaHVua1R5cGUgQWRhcHRhdGlvblN0YXRlQ2h1bmsgPSB7IERFRkFVTFRfT0JTRVJWRVJfQURBUFRBVElPTl9TVEFURSB9OworICAgIHZvaWQqIGZyb207CisgICAgIAorICAgIGlmIChzcmMgIT0gTlVMTCkgeworICAgICAgICBmcm9tID0gc3JjIC0+Y2h1bmtzW0FkYXB0YXRpb25TdGF0ZUNvbnRleHRdOyAgICAgICAKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgZnJvbSA9ICZBZGFwdGF0aW9uU3RhdGVDaHVuazsKKyAgICB9CisgICAgCisgICAgY3R4IC0+Y2h1bmtzW0FkYXB0YXRpb25TdGF0ZUNvbnRleHRdID0gX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsIGZyb20sIHNpemVvZihfY21zQWRhcHRhdGlvblN0YXRlQ2h1bmtUeXBlKSk7ICAgICAKK30KKworCisvLyBTZXRzIGFkYXB0YXRpb24gc3RhdGUgZm9yIGFic29sdXRlIGNvbG9yaW1ldHJpYyBpbnRlbnQgaW4gdGhlIGdpdmVuIGNvbnRleHQuICBBZGFwdGF0aW9uIHN0YXRlIGFwcGxpZXMgb24gYWxsIAorLy8gYnV0IGNtc0NyZWF0ZUV4dGVuZGVkVHJhbnNmb3JtVEhSKCkuICBMaXR0bGUgQ01TIGNhbiBoYW5kbGUgaW5jb21wbGV0ZSBhZGFwdGF0aW9uIHN0YXRlcy4KK2Ntc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIGNtc1NldEFkYXB0YXRpb25TdGF0ZVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zRmxvYXQ2NE51bWJlciBkKQoreworICAgIGNtc0Zsb2F0NjROdW1iZXIgcHJldjsKKyAgICBfY21zQWRhcHRhdGlvblN0YXRlQ2h1bmtUeXBlKiBwdHIgPSAoX2Ntc0FkYXB0YXRpb25TdGF0ZUNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBBZGFwdGF0aW9uU3RhdGVDb250ZXh0KTsKKworICAgIC8vIEdldCBwcmV2aW91cyB2YWx1ZSBmb3IgcmV0dXJuCisgICAgcHJldiA9IHB0ciAtPkFkYXB0YXRpb25TdGF0ZTsKKworICAgIC8vIFNldCB0aGUgdmFsdWUgaWYgZCBpcyBwb3NpdGl2ZSBvciB6ZXJvCisgICAgaWYgKGQgPj0gMC4wKSB7CisKKyAgICAgICAgcHRyIC0+QWRhcHRhdGlvblN0YXRlID0gZDsKKyAgICB9CisKKyAgICAvLyBBbHdheXMgcmV0dXJuIHByZXZpb3VzIHZhbHVlCisgICAgcmV0dXJuIHByZXY7Cit9CisKKworLy8gVGhlIGFkYXB0YXRpb24gc3RhdGUgbWF5IGJlIGRlZmF1bHRlZCBieSB0aGlzIGZ1bmN0aW9uLiBJZiB5b3UgZG9uJ3QgbGlrZSBpdCwgdXNlIHRoZSBleHRlbmRlZCB0cmFuc2Zvcm0gcm91dGluZQorY21zRmxvYXQ2NE51bWJlciBDTVNFWFBPUlQgY21zU2V0QWRhcHRhdGlvblN0YXRlKGNtc0Zsb2F0NjROdW1iZXIgZCkKK3sgICAgCisgICAgcmV0dXJuIGNtc1NldEFkYXB0YXRpb25TdGF0ZVRIUihOVUxMLCBkKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQWxhcm0gY29kZXMgZm9yIDE2LWJpdCB0cmFuc2Zvcm1hdGlvbnMsIGJlY2F1c2UgdGhlIGZpeGVkIHJhbmdlIG9mIGNvbnRhaW5lcnMgdGhlcmUgYXJlCisvLyBubyB2YWx1ZXMgbGVmdCB0byBtYXJrIG91dCBvZiBnYW11dC4gCisKKyNkZWZpbmUgREVGQVVMVF9BTEFSTV9DT0RFU19WQUxVRSB7MHg3RjAwLCAweDdGMDAsIDB4N0YwMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KKworX2Ntc0FsYXJtQ29kZXNDaHVua1R5cGUgX2Ntc0FsYXJtQ29kZXNDaHVuayA9IHsgREVGQVVMVF9BTEFSTV9DT0RFU19WQUxVRSB9OworCisvLyBTZXRzIHRoZSBjb2RlcyB1c2VkIHRvIG1hcmsgb3V0LW91dC1nYW11dCBvbiBQcm9vZmluZyB0cmFuc2Zvcm1zIGZvciBhIGdpdmVuIGNvbnRleHQuIFZhbHVlcyBhcmUgbWVhbnQgdG8gYmUgCisvLyBlbmNvZGVkIGluIDE2IGJpdHMuCit2b2lkIENNU0VYUE9SVCBjbXNTZXRBbGFybUNvZGVzVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCBjbXNVSW50MTZOdW1iZXIgQWxhcm1Db2Rlc1BbY21zTUFYQ0hBTk5FTFNdKQoreworICAgIF9jbXNBbGFybUNvZGVzQ2h1bmtUeXBlKiBDb250ZXh0QWxhcm1Db2RlcyA9IChfY21zQWxhcm1Db2Rlc0NodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBBbGFybUNvZGVzQ29udGV4dCk7CisgICAgICAgCisgICAgX2Ntc0Fzc2VydChDb250ZXh0QWxhcm1Db2RlcyAhPSBOVUxMKTsgLy8gQ2FuJ3QgaGFwcGVuCisgICAgCisgICAgbWVtY3B5KENvbnRleHRBbGFybUNvZGVzLT5BbGFybUNvZGVzLCBBbGFybUNvZGVzUCwgc2l6ZW9mKENvbnRleHRBbGFybUNvZGVzLT5BbGFybUNvZGVzKSk7ICAgIAorfQorCisvLyBHZXRzIHRoZSBjdXJyZW50IGNvZGVzIHVzZWQgdG8gbWFyayBvdXQtb3V0LWdhbXV0IG9uIFByb29maW5nIHRyYW5zZm9ybXMgZm9yIHRoZSBnaXZlbiBjb250ZXh0LgorLy8gVmFsdWVzIGFyZSBtZWFudCB0byBiZSBlbmNvZGVkIGluIDE2IGJpdHMuCit2b2lkIENNU0VYUE9SVCBjbXNHZXRBbGFybUNvZGVzVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MTZOdW1iZXIgQWxhcm1Db2Rlc1BbY21zTUFYQ0hBTk5FTFNdKQoreworICAgIF9jbXNBbGFybUNvZGVzQ2h1bmtUeXBlKiBDb250ZXh0QWxhcm1Db2RlcyA9IChfY21zQWxhcm1Db2Rlc0NodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBBbGFybUNvZGVzQ29udGV4dCk7CisKKyAgICBfY21zQXNzZXJ0KENvbnRleHRBbGFybUNvZGVzICE9IE5VTEwpOyAvLyBDYW4ndCBoYXBwZW4KKworICAgIG1lbWNweShBbGFybUNvZGVzUCwgQ29udGV4dEFsYXJtQ29kZXMtPkFsYXJtQ29kZXMsIHNpemVvZihDb250ZXh0QWxhcm1Db2Rlcy0+QWxhcm1Db2RlcykpOworfQorCit2b2lkIENNU0VYUE9SVCBjbXNTZXRBbGFybUNvZGVzKGNvbnN0IGNtc1VJbnQxNk51bWJlciBOZXdBbGFybVtjbXNNQVhDSEFOTkVMU10pCit7CisgICAgX2Ntc0Fzc2VydChOZXdBbGFybSAhPSBOVUxMKTsKKworICAgIGNtc1NldEFsYXJtQ29kZXNUSFIoTlVMTCwgTmV3QWxhcm0pOworfQorCit2b2lkIENNU0VYUE9SVCBjbXNHZXRBbGFybUNvZGVzKGNtc1VJbnQxNk51bWJlciBPbGRBbGFybVtjbXNNQVhDSEFOTkVMU10pCit7IAorICAgIF9jbXNBc3NlcnQoT2xkQWxhcm0gIT0gTlVMTCk7CisgICAgY21zR2V0QWxhcm1Db2Rlc1RIUihOVUxMLCBPbGRBbGFybSk7Cit9CisKKworLy8gSW5pdCBhbmQgZHVwbGljYXRlIGFsYXJtIGNvZGVzCit2b2lkIF9jbXNBbGxvY0FsYXJtQ29kZXNDaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQoreworICAgIHN0YXRpYyBfY21zQWxhcm1Db2Rlc0NodW5rVHlwZSBBbGFybUNvZGVzQ2h1bmsgPSB7IERFRkFVTFRfQUxBUk1fQ09ERVNfVkFMVUUgfTsKKyAgICB2b2lkKiBmcm9tOworICAgICAKKyAgICBpZiAoc3JjICE9IE5VTEwpIHsKKyAgICAgICAgZnJvbSA9IHNyYyAtPmNodW5rc1tBbGFybUNvZGVzQ29udGV4dF07ICAgICAgIAorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICBmcm9tID0gJkFsYXJtQ29kZXNDaHVuazsKKyAgICB9CisgICAgCisgICAgY3R4IC0+Y2h1bmtzW0FsYXJtQ29kZXNDb250ZXh0XSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCBmcm9tLCBzaXplb2YoX2Ntc0FsYXJtQ29kZXNDaHVua1R5cGUpKTsgICAgIAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBHZXQgcmlkIG9mIHRyYW5zZm9ybSByZXNvdXJjZXMKK3ZvaWQgQ01TRVhQT1JUIGNtc0RlbGV0ZVRyYW5zZm9ybShjbXNIVFJBTlNGT1JNIGhUcmFuc2Zvcm0pCit7CisgICAgX2Ntc1RSQU5TRk9STSogcCA9IChfY21zVFJBTlNGT1JNKikgaFRyYW5zZm9ybTsKKworICAgIF9jbXNBc3NlcnQocCAhPSBOVUxMKTsKKworICAgIGlmIChwIC0+IEdhbXV0Q2hlY2spCisgICAgICAgIGNtc1BpcGVsaW5lRnJlZShwIC0+IEdhbXV0Q2hlY2spOworCisgICAgaWYgKHAgLT4gTHV0KQorICAgICAgICBjbXNQaXBlbGluZUZyZWUocCAtPiBMdXQpOworCisgICAgaWYgKHAgLT5JbnB1dENvbG9yYW50KQorICAgICAgICBjbXNGcmVlTmFtZWRDb2xvckxpc3QocCAtPklucHV0Q29sb3JhbnQpOworCisgICAgaWYgKHAgLT4gT3V0cHV0Q29sb3JhbnQpCisgICAgICAgIGNtc0ZyZWVOYW1lZENvbG9yTGlzdChwIC0+T3V0cHV0Q29sb3JhbnQpOworCisgICAgaWYgKHAgLT5TZXF1ZW5jZSkKKyAgICAgICAgY21zRnJlZVByb2ZpbGVTZXF1ZW5jZURlc2NyaXB0aW9uKHAgLT5TZXF1ZW5jZSk7CisKKyAgICBpZiAocCAtPlVzZXJEYXRhKQorICAgICAgICBwIC0+RnJlZVVzZXJEYXRhKHAgLT5Db250ZXh0SUQsIHAgLT5Vc2VyRGF0YSk7CisKKyAgICBfY21zRnJlZShwIC0+Q29udGV4dElELCAodm9pZCAqKSBwKTsKK30KKworLy8gQXBwbHkgdHJhbnNmb3JtLgordm9pZCBDTVNFWFBPUlQgY21zRG9UcmFuc2Zvcm0oY21zSFRSQU5TRk9STSAgVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogSW5wdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBPdXRwdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU2l6ZSkKKworeworICAgIF9jbXNUUkFOU0ZPUk0qIHAgPSAoX2Ntc1RSQU5TRk9STSopIFRyYW5zZm9ybTsKKyAgICBjbXNTdHJpZGUgc3RyaWRlOworCisgICAgc3RyaWRlLkJ5dGVzUGVyTGluZUluID0gMDsgIC8vIE5vdCB1c2VkCisgICAgc3RyaWRlLkJ5dGVzUGVyTGluZU91dCA9IDA7CisgICAgc3RyaWRlLkJ5dGVzUGVyUGxhbmVJbiA9IFNpemU7CisgICAgc3RyaWRlLkJ5dGVzUGVyUGxhbmVPdXQgPSBTaXplOworICAgICAgICAgICAKKyAgICBwIC0+IHhmb3JtKHAsIElucHV0QnVmZmVyLCBPdXRwdXRCdWZmZXIsIFNpemUsIDEsICZzdHJpZGUpOworfQorCisKKy8vIFRoaXMgaXMgYSBsZWdhY3kgc3RyaWRlIGZvciBwbGFuYXIKK3ZvaWQgQ01TRVhQT1JUIGNtc0RvVHJhbnNmb3JtU3RyaWRlKGNtc0hUUkFOU0ZPUk0gIFRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIElucHV0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogT3V0cHV0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFNpemUsIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCisKK3sKKyAgICBfY21zVFJBTlNGT1JNKiBwID0gKF9jbXNUUkFOU0ZPUk0qKSBUcmFuc2Zvcm07CisgICAgY21zU3RyaWRlIHN0cmlkZTsKKworICAgIHN0cmlkZS5CeXRlc1BlckxpbmVJbiA9IDA7ICAKKyAgICBzdHJpZGUuQnl0ZXNQZXJMaW5lT3V0ID0gMDsKKyAgICBzdHJpZGUuQnl0ZXNQZXJQbGFuZUluID0gU3RyaWRlOworICAgIHN0cmlkZS5CeXRlc1BlclBsYW5lT3V0ID0gU3RyaWRlOworCisgICAgcCAtPiB4Zm9ybShwLCBJbnB1dEJ1ZmZlciwgT3V0cHV0QnVmZmVyLCBTaXplLCAxLCAmc3RyaWRlKTsKK30KKworLy8gVGhpcyBpcyB0aGUgImZhc3QiIGZ1bmN0aW9uIGZvciBwbHVnaW5zCit2b2lkIENNU0VYUE9SVCBjbXNEb1RyYW5zZm9ybUxpbmVTdHJpZGUoY21zSFRSQU5TRk9STSAgVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogSW5wdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBPdXRwdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgUGl4ZWxzUGVyTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBMaW5lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgQnl0ZXNQZXJMaW5lSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgQnl0ZXNQZXJMaW5lT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEJ5dGVzUGVyUGxhbmVJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBCeXRlc1BlclBsYW5lT3V0KQorCit7CisgICAgX2Ntc1RSQU5TRk9STSogcCA9IChfY21zVFJBTlNGT1JNKikgVHJhbnNmb3JtOworICAgIGNtc1N0cmlkZSBzdHJpZGU7CisKKyAgICBzdHJpZGUuQnl0ZXNQZXJMaW5lSW4gPSBCeXRlc1BlckxpbmVJbjsKKyAgICBzdHJpZGUuQnl0ZXNQZXJMaW5lT3V0ID0gQnl0ZXNQZXJMaW5lT3V0OworICAgIHN0cmlkZS5CeXRlc1BlclBsYW5lSW4gPSBCeXRlc1BlclBsYW5lSW47CisgICAgc3RyaWRlLkJ5dGVzUGVyUGxhbmVPdXQgPSBCeXRlc1BlclBsYW5lT3V0OworCisgICAgcC0+eGZvcm0ocCwgSW5wdXRCdWZmZXIsIE91dHB1dEJ1ZmZlciwgUGl4ZWxzUGVyTGluZSwgTGluZUNvdW50LCAmc3RyaWRlKTsKK30KKworCisKKy8vIFRyYW5zZm9ybSByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEZsb2F0IHhmb3JtIGNvbnZlcnRzIGZsb2F0cy4gU2luY2UgdGhlcmUgYXJlIG5vIHBlcmZvcm1hbmNlIGlzc3Vlcywgb25lIHJvdXRpbmUgZG9lcyBhbGwgam9iLCBpbmNsdWRpbmcgZ2FtdXQgY2hlY2suCisvLyBOb3RlIHRoYXQgYmVjYXVzZSBleHRlbmRlZCByYW5nZSwgd2UgY2FuIHVzZSBhIC0xLjAgdmFsdWUgZm9yIG91dCBvZiBnYW11dCBpbiB0aGlzIGNhc2UuCitzdGF0aWMKK3ZvaWQgRmxvYXRYRk9STShfY21zVFJBTlNGT1JNKiBwLAorICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGluLAorICAgICAgICAgICAgICAgIHZvaWQqIG91dCwgCisgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFBpeGVsc1BlckxpbmUsCisgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIExpbmVDb3VudCwKKyAgICAgICAgICAgICAgICBjb25zdCBjbXNTdHJpZGUqIFN0cmlkZSkKK3sKKyAgICBjbXNVSW50OE51bWJlciogYWNjdW07CisgICAgY21zVUludDhOdW1iZXIqIG91dHB1dDsKKyAgICBjbXNGbG9hdDMyTnVtYmVyIGZJbltjbXNNQVhDSEFOTkVMU10sIGZPdXRbY21zTUFYQ0hBTk5FTFNdOworICAgIGNtc0Zsb2F0MzJOdW1iZXIgT3V0T2ZHYW11dDsKKyAgICBjbXNVSW50MzJOdW1iZXIgaSwgaiwgYywgc3RyaWRlSW4sIHN0cmlkZU91dDsKKworICAgIF9jbXNIYW5kbGVFeHRyYUNoYW5uZWxzKHAsIGluLCBvdXQsIFBpeGVsc1BlckxpbmUsIExpbmVDb3VudCwgU3RyaWRlKTsKKworICAgIHN0cmlkZUluID0gMDsKKyAgICBzdHJpZGVPdXQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IExpbmVDb3VudDsgaSsrKSB7CisKKyAgICAgICAgYWNjdW0gPSAoY21zVUludDhOdW1iZXIqKWluICsgc3RyaWRlSW47CisgICAgICAgIG91dHB1dCA9IChjbXNVSW50OE51bWJlciopb3V0ICsgc3RyaWRlT3V0OworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBQaXhlbHNQZXJMaW5lOyBqKyspIHsKKworICAgICAgICAgICAgYWNjdW0gPSBwLT5Gcm9tSW5wdXRGbG9hdChwLCBmSW4sIGFjY3VtLCBTdHJpZGUtPkJ5dGVzUGVyUGxhbmVJbik7CisKKyAgICAgICAgICAgIC8vIEFueSBnYW11dCBjaGFjayB0byBkbz8KKyAgICAgICAgICAgIGlmIChwLT5HYW11dENoZWNrICE9IE5VTEwpIHsKKworICAgICAgICAgICAgICAgIC8vIEV2YWx1YXRlIGdhbXV0IG1hcmtlci4KKyAgICAgICAgICAgICAgICBjbXNQaXBlbGluZUV2YWxGbG9hdChmSW4sICZPdXRPZkdhbXV0LCBwLT5HYW11dENoZWNrKTsKKworICAgICAgICAgICAgICAgIC8vIElzIGN1cnJlbnQgY29sb3Igb3V0IG9mIGdhbXV0PworICAgICAgICAgICAgICAgIGlmIChPdXRPZkdhbXV0ID4gMC4wKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQ2VydGFpbmx5LCBvdXQgb2YgZ2FtdXQKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IGNtc01BWENIQU5ORUxTOyBjKyspCisgICAgICAgICAgICAgICAgICAgICAgICBmT3V0W2NdID0gLTEuMDsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm8sIHByb2NlZWQgbm9ybWFsbHkKKyAgICAgICAgICAgICAgICAgICAgY21zUGlwZWxpbmVFdmFsRmxvYXQoZkluLCBmT3V0LCBwLT5MdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICAgICAgLy8gTm8gZ2FtdXQgY2hlY2sgYXQgYWxsCisgICAgICAgICAgICAgICAgY21zUGlwZWxpbmVFdmFsRmxvYXQoZkluLCBmT3V0LCBwLT5MdXQpOworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIG91dHB1dCA9IHAtPlRvT3V0cHV0RmxvYXQocCwgZk91dCwgb3V0cHV0LCBTdHJpZGUtPkJ5dGVzUGVyUGxhbmVPdXQpOworICAgICAgICB9CisKKyAgICAgICAgc3RyaWRlSW4gKz0gU3RyaWRlLT5CeXRlc1BlckxpbmVJbjsKKyAgICAgICAgc3RyaWRlT3V0ICs9IFN0cmlkZS0+Qnl0ZXNQZXJMaW5lT3V0OworICAgIH0KKworfQorCisKK3N0YXRpYwordm9pZCBOdWxsRmxvYXRYRk9STShfY21zVFJBTlNGT1JNKiBwLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBpbiwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCogb3V0LCAKKyAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFBpeGVsc1BlckxpbmUsCisgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBMaW5lQ291bnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1N0cmlkZSogU3RyaWRlKQorCit7CisgICAgY21zVUludDhOdW1iZXIqIGFjY3VtOworICAgIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQ7CisgICAgY21zRmxvYXQzMk51bWJlciBmSW5bY21zTUFYQ0hBTk5FTFNdOworICAgIGNtc1VJbnQzMk51bWJlciBpLCBqLCBzdHJpZGVJbiwgc3RyaWRlT3V0OworCisgICAgX2Ntc0hhbmRsZUV4dHJhQ2hhbm5lbHMocCwgaW4sIG91dCwgUGl4ZWxzUGVyTGluZSwgTGluZUNvdW50LCBTdHJpZGUpOworCisgICAgc3RyaWRlSW4gPSAwOworICAgIHN0cmlkZU91dCA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTGluZUNvdW50OyBpKyspIHsKKworICAgICAgICAgICBhY2N1bSA9IChjbXNVSW50OE51bWJlciopIGluICsgc3RyaWRlSW47CisgICAgICAgICAgIG91dHB1dCA9IChjbXNVSW50OE51bWJlciopIG91dCArIHN0cmlkZU91dDsKKworICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgUGl4ZWxzUGVyTGluZTsgaisrKSB7CisKKyAgICAgICAgICAgICAgICAgIGFjY3VtID0gcC0+RnJvbUlucHV0RmxvYXQocCwgZkluLCBhY2N1bSwgU3RyaWRlIC0+Qnl0ZXNQZXJQbGFuZUluKTsKKyAgICAgICAgICAgICAgICAgIG91dHB1dCA9IHAtPlRvT3V0cHV0RmxvYXQocCwgZkluLCBvdXRwdXQsIFN0cmlkZS0+Qnl0ZXNQZXJQbGFuZU91dCk7CisgICAgICAgICAgIH0KKworICAgICAgICAgICBzdHJpZGVJbiArPSBTdHJpZGUtPkJ5dGVzUGVyTGluZUluOworICAgICAgICAgICBzdHJpZGVPdXQgKz0gU3RyaWRlLT5CeXRlc1BlckxpbmVPdXQ7CisgICAgfQorfQorCisvLyAxNiBiaXQgcHJlY2lzaW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE51bGwgdHJhbnNmb3JtYXRpb24sIG9ubHkgYXBwbGllcyBmb3JtYXR0ZXJzLiBObyBjYWNoZQorc3RhdGljCit2b2lkIE51bGxYRk9STShfY21zVFJBTlNGT1JNKiBwLAorICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogaW4sCisgICAgICAgICAgICAgICB2b2lkKiBvdXQsCisgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgUGl4ZWxzUGVyTGluZSwKKyAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBMaW5lQ291bnQsCisgICAgICAgICAgICAgICBjb25zdCBjbXNTdHJpZGUqIFN0cmlkZSkKK3sKKyAgICBjbXNVSW50OE51bWJlciogYWNjdW07CisgICAgY21zVUludDhOdW1iZXIqIG91dHB1dDsKKyAgICBjbXNVSW50MTZOdW1iZXIgd0luW2Ntc01BWENIQU5ORUxTXTsKKyAgICBjbXNVSW50MzJOdW1iZXIgaSwgaiwgc3RyaWRlSW4sIHN0cmlkZU91dDsKKworICAgIF9jbXNIYW5kbGVFeHRyYUNoYW5uZWxzKHAsIGluLCBvdXQsIFBpeGVsc1BlckxpbmUsIExpbmVDb3VudCwgU3RyaWRlKTsKKworICAgIHN0cmlkZUluID0gMDsKKyAgICBzdHJpZGVPdXQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IExpbmVDb3VudDsgaSsrKSB7CisKKyAgICAgICAgICAgYWNjdW0gPSAoY21zVUludDhOdW1iZXIqKWluICsgc3RyaWRlSW47CisgICAgICAgICAgIG91dHB1dCA9IChjbXNVSW50OE51bWJlciopb3V0ICsgc3RyaWRlT3V0OworCisgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBQaXhlbHNQZXJMaW5lOyBqKyspIHsKKworICAgICAgICAgICAgICAgICAgYWNjdW0gPSBwLT5Gcm9tSW5wdXQocCwgd0luLCBhY2N1bSwgU3RyaWRlLT5CeXRlc1BlclBsYW5lSW4pOworICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gcC0+VG9PdXRwdXQocCwgd0luLCBvdXRwdXQsIFN0cmlkZS0+Qnl0ZXNQZXJQbGFuZU91dCk7CisgICAgfQorCisgICAgICAgICAgIHN0cmlkZUluICs9IFN0cmlkZS0+Qnl0ZXNQZXJMaW5lSW47CisgICAgICAgICAgIHN0cmlkZU91dCArPSBTdHJpZGUtPkJ5dGVzUGVyTGluZU91dDsKKyAgICB9CisKK30KKworCisvLyBObyBnYW11dCBjaGVjaywgbm8gY2FjaGUsIDE2IGJpdHMKK3N0YXRpYwordm9pZCBQcmVjYWxjdWxhdGVkWEZPUk0oX2Ntc1RSQU5TRk9STSogcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBQaXhlbHNQZXJMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIExpbmVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1N0cmlkZSogU3RyaWRlKQoreworICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bTsKKyAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0OworICAgIGNtc1VJbnQxNk51bWJlciB3SW5bY21zTUFYQ0hBTk5FTFNdLCB3T3V0W2Ntc01BWENIQU5ORUxTXTsKKyAgICBjbXNVSW50MzJOdW1iZXIgaSwgaiwgc3RyaWRlSW4sIHN0cmlkZU91dDsKKworICAgIF9jbXNIYW5kbGVFeHRyYUNoYW5uZWxzKHAsIGluLCBvdXQsIFBpeGVsc1BlckxpbmUsIExpbmVDb3VudCwgU3RyaWRlKTsKKworICAgIHN0cmlkZUluID0gMDsKKyAgICBzdHJpZGVPdXQgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IExpbmVDb3VudDsgaSsrKSB7CisKKyAgICAgICAgYWNjdW0gPSAoY21zVUludDhOdW1iZXIqKWluICsgc3RyaWRlSW47CisgICAgICAgIG91dHB1dCA9IChjbXNVSW50OE51bWJlciopb3V0ICsgc3RyaWRlT3V0OworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBQaXhlbHNQZXJMaW5lOyBqKyspIHsKKworICAgICAgICAgICAgYWNjdW0gPSBwLT5Gcm9tSW5wdXQocCwgd0luLCBhY2N1bSwgU3RyaWRlLT5CeXRlc1BlclBsYW5lSW4pOworICAgICAgICAgICAgcC0+THV0LT5FdmFsMTZGbih3SW4sIHdPdXQsIHAtPkx1dC0+RGF0YSk7CisgICAgICAgICAgICBvdXRwdXQgPSBwLT5Ub091dHB1dChwLCB3T3V0LCBvdXRwdXQsIFN0cmlkZS0+Qnl0ZXNQZXJQbGFuZU91dCk7CisgICAgICAgIH0KKworICAgICAgICBzdHJpZGVJbiArPSBTdHJpZGUtPkJ5dGVzUGVyTGluZUluOworICAgICAgICBzdHJpZGVPdXQgKz0gU3RyaWRlLT5CeXRlc1BlckxpbmVPdXQ7CisgICAgfQorCit9CisKKworLy8gQXV4aWxpYXJ5OiBIYW5kbGUgcHJlY2FsY3VsYXRlZCBnYW11dCBjaGVjay4gVGhlIHJldHJpZXZhbCBvZiBjb250ZXh0IG1heSBiZSBhbGl0dGxlIGJpdCBzbG93LCBidXQgdGhpcyBmdW5jdGlvbiBpcyBub3QgY3JpdGljYWwuCitzdGF0aWMKK3ZvaWQgVHJhbnNmb3JtT25lUGl4ZWxXaXRoR2FtdXRDaGVjayhfY21zVFJBTlNGT1JNKiBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1VJbnQxNk51bWJlciB3SW5bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIgd091dFtdKQoreworICAgIGNtc1VJbnQxNk51bWJlciB3T3V0T2ZHYW11dDsKKworICAgIHAgLT5HYW11dENoZWNrIC0+RXZhbDE2Rm4od0luLCAmd091dE9mR2FtdXQsIHAgLT5HYW11dENoZWNrIC0+RGF0YSk7CisgICAgaWYgKHdPdXRPZkdhbXV0ID49IDEpIHsKKworICAgICAgICBjbXNVSW50MTZOdW1iZXIgaTsKKyAgICAgICAgX2Ntc0FsYXJtQ29kZXNDaHVua1R5cGUqIENvbnRleHRBbGFybUNvZGVzID0gKF9jbXNBbGFybUNvZGVzQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhwLT5Db250ZXh0SUQsIEFsYXJtQ29kZXNDb250ZXh0KTsgICAgICAgIAorCisgICAgICAgIGZvciAoaT0wOyBpIDwgcCAtPkx1dC0+T3V0cHV0Q2hhbm5lbHM7IGkrKykgeworCisgICAgICAgICAgICB3T3V0W2ldID0gQ29udGV4dEFsYXJtQ29kZXMgLT5BbGFybUNvZGVzW2ldOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcCAtPkx1dCAtPkV2YWwxNkZuKHdJbiwgd091dCwgcCAtPiBMdXQtPkRhdGEpOworfQorCisvLyBHYW11dCBjaGVjaywgTm8gY2FjaGUsIDE2IGJpdHMuCitzdGF0aWMKK3ZvaWQgUHJlY2FsY3VsYXRlZFhGT1JNR2FtdXRDaGVjayhfY21zVFJBTlNGT1JNKiBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG91dCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFBpeGVsc1BlckxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIExpbmVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNTdHJpZGUqIFN0cmlkZSkKK3sKKyAgICBjbXNVSW50OE51bWJlciogYWNjdW07CisgICAgY21zVUludDhOdW1iZXIqIG91dHB1dDsKKyAgICBjbXNVSW50MTZOdW1iZXIgd0luW2Ntc01BWENIQU5ORUxTXSwgd091dFtjbXNNQVhDSEFOTkVMU107CisgICAgY21zVUludDMyTnVtYmVyIGksIGosIHN0cmlkZUluLCBzdHJpZGVPdXQ7CisKKyAgICBfY21zSGFuZGxlRXh0cmFDaGFubmVscyhwLCBpbiwgb3V0LCBQaXhlbHNQZXJMaW5lLCBMaW5lQ291bnQsIFN0cmlkZSk7CisKKyAgICBzdHJpZGVJbiA9IDA7CisgICAgc3RyaWRlT3V0ID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBMaW5lQ291bnQ7IGkrKykgeworCisgICAgICAgICAgIGFjY3VtID0gKGNtc1VJbnQ4TnVtYmVyKilpbiArIHN0cmlkZUluOworICAgICAgICAgICBvdXRwdXQgPSAoY21zVUludDhOdW1iZXIqKW91dCArIHN0cmlkZU91dDsKKworICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgUGl4ZWxzUGVyTGluZTsgaisrKSB7CisKKyAgICAgICAgICAgICAgICAgIGFjY3VtID0gcC0+RnJvbUlucHV0KHAsIHdJbiwgYWNjdW0sIFN0cmlkZS0+Qnl0ZXNQZXJQbGFuZUluKTsKKyAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybU9uZVBpeGVsV2l0aEdhbXV0Q2hlY2socCwgd0luLCB3T3V0KTsKKyAgICAgICAgICAgICAgICAgIG91dHB1dCA9IHAtPlRvT3V0cHV0KHAsIHdPdXQsIG91dHB1dCwgU3RyaWRlLT5CeXRlc1BlclBsYW5lT3V0KTsKKyAgICAgICAgICAgfQorCisgICAgICAgICAgIHN0cmlkZUluICs9IFN0cmlkZS0+Qnl0ZXNQZXJMaW5lSW47CisgICAgICAgICAgIHN0cmlkZU91dCArPSBTdHJpZGUtPkJ5dGVzUGVyTGluZU91dDsKKyAgICB9Cit9CisKKworLy8gTm8gZ2FtdXQgY2hlY2ssIENhY2hlLCAxNiBiaXRzLAorc3RhdGljCit2b2lkIENhY2hlZFhGT1JNKF9jbXNUUkFOU0ZPUk0qIHAsCisgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGluLAorICAgICAgICAgICAgICAgICB2b2lkKiBvdXQsCisgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBQaXhlbHNQZXJMaW5lLAorICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgTGluZUNvdW50LAorICAgICAgICAgICAgICAgICBjb25zdCBjbXNTdHJpZGUqIFN0cmlkZSkKK3sKKyAgICBjbXNVSW50OE51bWJlciogYWNjdW07CisgICAgY21zVUludDhOdW1iZXIqIG91dHB1dDsKKyAgICBjbXNVSW50MTZOdW1iZXIgd0luW2Ntc01BWENIQU5ORUxTXSwgd091dFtjbXNNQVhDSEFOTkVMU107CisgICAgX2Ntc0NBQ0hFIENhY2hlOworICAgIGNtc1VJbnQzMk51bWJlciBpLCBqLCBzdHJpZGVJbiwgc3RyaWRlT3V0OworCisgICAgX2Ntc0hhbmRsZUV4dHJhQ2hhbm5lbHMocCwgaW4sIG91dCwgUGl4ZWxzUGVyTGluZSwgTGluZUNvdW50LCBTdHJpZGUpOworCisgICAgLy8gRW1wdHkgYnVmZmVycyBmb3IgcXVpY2sgbWVtY21wCisgICAgbWVtc2V0KHdJbiwgMCwgc2l6ZW9mKHdJbikpOworICAgIG1lbXNldCh3T3V0LCAwLCBzaXplb2Yod091dCkpOworCisgICAgLy8gR2V0IGNvcHkgb2YgemVybyBjYWNoZQorICAgIG1lbWNweSgmQ2FjaGUsICZwLT5DYWNoZSwgc2l6ZW9mKENhY2hlKSk7CisKKyAgICBzdHJpZGVJbiA9IDA7CisgICAgc3RyaWRlT3V0ID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBMaW5lQ291bnQ7IGkrKykgeworCisgICAgICAgIGFjY3VtID0gKGNtc1VJbnQ4TnVtYmVyKilpbiArIHN0cmlkZUluOworICAgICAgICBvdXRwdXQgPSAoY21zVUludDhOdW1iZXIqKW91dCArIHN0cmlkZU91dDsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgUGl4ZWxzUGVyTGluZTsgaisrKSB7CisKKyAgICAgICAgICAgIGFjY3VtID0gcC0+RnJvbUlucHV0KHAsIHdJbiwgYWNjdW0sIFN0cmlkZS0+Qnl0ZXNQZXJQbGFuZUluKTsKKworICAgICAgICAgICAgaWYgKG1lbWNtcCh3SW4sIENhY2hlLkNhY2hlSW4sIHNpemVvZihDYWNoZS5DYWNoZUluKSkgPT0gMCkgeworCisgICAgICAgICAgICAgICAgbWVtY3B5KHdPdXQsIENhY2hlLkNhY2hlT3V0LCBzaXplb2YoQ2FjaGUuQ2FjaGVPdXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHAtPkx1dC0+RXZhbDE2Rm4od0luLCB3T3V0LCBwLT5MdXQtPkRhdGEpOworCisgICAgICAgICAgICAgICAgbWVtY3B5KENhY2hlLkNhY2hlSW4sIHdJbiwgc2l6ZW9mKENhY2hlLkNhY2hlSW4pKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoQ2FjaGUuQ2FjaGVPdXQsIHdPdXQsIHNpemVvZihDYWNoZS5DYWNoZU91dCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXRwdXQgPSBwLT5Ub091dHB1dChwLCB3T3V0LCBvdXRwdXQsIFN0cmlkZS0+Qnl0ZXNQZXJQbGFuZU91dCk7CisgICAgICAgIH0KKworICAgICAgICBzdHJpZGVJbiArPSBTdHJpZGUtPkJ5dGVzUGVyTGluZUluOworICAgICAgICBzdHJpZGVPdXQgKz0gU3RyaWRlLT5CeXRlc1BlckxpbmVPdXQ7CisgICAgfQorfQorCisvLyBBbGwgdGhvc2UgbmljZSBmZWF0dXJlcyB0b2dldGhlcgorc3RhdGljCit2b2lkIENhY2hlZFhGT1JNR2FtdXRDaGVjayhfY21zVFJBTlNGT1JNKiBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvdXQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFBpeGVsc1BlckxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgTGluZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zU3RyaWRlKiBTdHJpZGUpCit7CisgICAgY21zVUludDhOdW1iZXIqIGFjY3VtOworICAgIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQ7CisgICAgY21zVUludDE2TnVtYmVyIHdJbltjbXNNQVhDSEFOTkVMU10sIHdPdXRbY21zTUFYQ0hBTk5FTFNdOworICAgIF9jbXNDQUNIRSBDYWNoZTsKKyAgICBjbXNVSW50MzJOdW1iZXIgaSwgaiwgc3RyaWRlSW4sIHN0cmlkZU91dDsKKworICAgIF9jbXNIYW5kbGVFeHRyYUNoYW5uZWxzKHAsIGluLCBvdXQsIFBpeGVsc1BlckxpbmUsIExpbmVDb3VudCwgU3RyaWRlKTsKKworICAgIC8vIEVtcHR5IGJ1ZmZlcnMgZm9yIHF1aWNrIG1lbWNtcAorICAgIG1lbXNldCh3SW4sIDAsIHNpemVvZih3SW4pKTsKKyAgICBtZW1zZXQod091dCwgMCwgc2l6ZW9mKHdPdXQpKTsKKworICAgIC8vIEdldCBjb3B5IG9mIHplcm8gY2FjaGUKKyAgICBtZW1jcHkoJkNhY2hlLCAmcC0+Q2FjaGUsIHNpemVvZihDYWNoZSkpOworCisgICAgc3RyaWRlSW4gPSAwOworICAgIHN0cmlkZU91dCA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTGluZUNvdW50OyBpKyspIHsKKworICAgICAgICBhY2N1bSA9IChjbXNVSW50OE51bWJlciopaW4gKyBzdHJpZGVJbjsKKyAgICAgICAgb3V0cHV0ID0gKGNtc1VJbnQ4TnVtYmVyKilvdXQgKyBzdHJpZGVPdXQ7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IFBpeGVsc1BlckxpbmU7IGorKykgeworCisgICAgICAgICAgICBhY2N1bSA9IHAtPkZyb21JbnB1dChwLCB3SW4sIGFjY3VtLCBTdHJpZGUtPkJ5dGVzUGVyUGxhbmVJbik7CisKKyAgICAgICAgICAgIGlmIChtZW1jbXAod0luLCBDYWNoZS5DYWNoZUluLCBzaXplb2YoQ2FjaGUuQ2FjaGVJbikpID09IDApIHsKKworICAgICAgICAgICAgICAgIG1lbWNweSh3T3V0LCBDYWNoZS5DYWNoZU91dCwgc2l6ZW9mKENhY2hlLkNhY2hlT3V0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBUcmFuc2Zvcm1PbmVQaXhlbFdpdGhHYW11dENoZWNrKHAsIHdJbiwgd091dCk7CisKKyAgICAgICAgICAgICAgICBtZW1jcHkoQ2FjaGUuQ2FjaGVJbiwgd0luLCBzaXplb2YoQ2FjaGUuQ2FjaGVJbikpOworICAgICAgICAgICAgICAgIG1lbWNweShDYWNoZS5DYWNoZU91dCwgd091dCwgc2l6ZW9mKENhY2hlLkNhY2hlT3V0KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG91dHB1dCA9IHAtPlRvT3V0cHV0KHAsIHdPdXQsIG91dHB1dCwgU3RyaWRlLT5CeXRlc1BlclBsYW5lT3V0KTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmlkZUluICs9IFN0cmlkZS0+Qnl0ZXNQZXJMaW5lSW47CisgICAgICAgIHN0cmlkZU91dCArPSBTdHJpZGUtPkJ5dGVzUGVyTGluZU91dDsKKyAgICB9Cit9CisKKy8vIFRyYW5zZm9ybSBwbHVnLWlucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIExpc3Qgb2YgdXNlZC1kZWZpbmVkIHRyYW5zZm9ybSBmYWN0b3JpZXMKK3R5cGVkZWYgc3RydWN0IF9jbXNUcmFuc2Zvcm1Db2xsZWN0aW9uX3N0IHsKKworICAgIF9jbXNUcmFuc2Zvcm0yRmFjdG9yeSAgRmFjdG9yeTsKKyAgICBjbXNCb29sICAgICAgICAgICAgICAgIE9sZFhmb3JtOyAgIC8vIEZhY3RvcnkgcmV0dXJucyB4Zm9ybSBmdW5jdGlvbiBpbiB0aGUgb2xkIHN0eWxlCisKKyAgICBzdHJ1Y3QgX2Ntc1RyYW5zZm9ybUNvbGxlY3Rpb25fc3QgKk5leHQ7CisKK30gX2Ntc1RyYW5zZm9ybUNvbGxlY3Rpb247CisKKy8vIFRoZSBsaW5rZWQgbGlzdCBoZWFkCitfY21zVHJhbnNmb3JtUGx1Z2luQ2h1bmtUeXBlIF9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVuayA9IHsgTlVMTCB9OworCisKKy8vIER1cGxpY2F0ZXMgdGhlIHpvbmUgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIHBsdWctaW4gaW4gdGhlIG5ldyBjb250ZXh0CitzdGF0aWMKK3ZvaWQgRHVwUGx1Z2luVHJhbnNmb3JtTGlzdChzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCit7CisgICBfY21zVHJhbnNmb3JtUGx1Z2luQ2h1bmtUeXBlIG5ld0hlYWQgPSB7IE5VTEwgfTsKKyAgIF9jbXNUcmFuc2Zvcm1Db2xsZWN0aW9uKiAgZW50cnk7CisgICBfY21zVHJhbnNmb3JtQ29sbGVjdGlvbiogIEFudGVyaW9yID0gTlVMTDsKKyAgIF9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVua1R5cGUqIGhlYWQgPSAoX2Ntc1RyYW5zZm9ybVBsdWdpbkNodW5rVHlwZSopIHNyYy0+Y2h1bmtzW1RyYW5zZm9ybVBsdWdpbl07CisKKyAgICAvLyBXYWxrIHRoZSBsaXN0IGNvcHlpbmcgYWxsIG5vZGVzCisgICBmb3IgKGVudHJ5ID0gaGVhZC0+VHJhbnNmb3JtQ29sbGVjdGlvbjsKKyAgICAgICAgZW50cnkgIT0gTlVMTDsKKyAgICAgICAgZW50cnkgPSBlbnRyeSAtPk5leHQpIHsKKworICAgICAgICAgICAgX2Ntc1RyYW5zZm9ybUNvbGxlY3Rpb24gKm5ld0VudHJ5ID0gKCBfY21zVHJhbnNmb3JtQ29sbGVjdGlvbiAqKSBfY21zU3ViQWxsb2NEdXAoY3R4IC0+TWVtUG9vbCwgZW50cnksIHNpemVvZihfY21zVHJhbnNmb3JtQ29sbGVjdGlvbikpOworICAgCisgICAgICAgICAgICBpZiAobmV3RW50cnkgPT0gTlVMTCkgCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGtlZXAgdGhlIGxpbmtlZCBsaXN0IG9yZGVyLCBzbyB0aGlzIGlzIGEgbGl0dGxlIGJpdCB0cmlja3kKKyAgICAgICAgICAgIG5ld0VudHJ5IC0+IE5leHQgPSBOVUxMOworICAgICAgICAgICAgaWYgKEFudGVyaW9yKQorICAgICAgICAgICAgICAgIEFudGVyaW9yIC0+IE5leHQgPSBuZXdFbnRyeTsKKyAgICAgCisgICAgICAgICAgICBBbnRlcmlvciA9IG5ld0VudHJ5OworCisgICAgICAgICAgICBpZiAobmV3SGVhZC5UcmFuc2Zvcm1Db2xsZWN0aW9uID09IE5VTEwpCisgICAgICAgICAgICAgICAgbmV3SGVhZC5UcmFuc2Zvcm1Db2xsZWN0aW9uID0gbmV3RW50cnk7CisgICAgfQorCisgIGN0eCAtPmNodW5rc1tUcmFuc2Zvcm1QbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eC0+TWVtUG9vbCwgJm5ld0hlYWQsIHNpemVvZihfY21zVHJhbnNmb3JtUGx1Z2luQ2h1bmtUeXBlKSk7Cit9CisKKy8vIEFsbG9jYXRlcyBtZW1vcnkgZm9yIHRyYW5zZm9ybSBwbHVnaW4gZmFjdG9yeQordm9pZCBfY21zQWxsb2NUcmFuc2Zvcm1QbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKK3sKKyAgICBpZiAoc3JjICE9IE5VTEwpIHsKKworICAgICAgICAvLyBDb3B5IGFsbCBsaW5rZWQgbGlzdAorICAgICAgICBEdXBQbHVnaW5UcmFuc2Zvcm1MaXN0KGN0eCwgc3JjKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN0YXRpYyBfY21zVHJhbnNmb3JtUGx1Z2luQ2h1bmtUeXBlIFRyYW5zZm9ybVBsdWdpbkNodW5rVHlwZSA9IHsgTlVMTCB9OworICAgICAgICBjdHggLT5jaHVua3NbVHJhbnNmb3JtUGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCAmVHJhbnNmb3JtUGx1Z2luQ2h1bmtUeXBlLCBzaXplb2YoX2Ntc1RyYW5zZm9ybVBsdWdpbkNodW5rVHlwZSkpOworICAgIH0KK30KKworLy8gQWRhcHRvciBmb3Igb2xkIHZlcnNpb25zIG9mIHBsdWctaW4KK3N0YXRpYwordm9pZCBfY21zVHJhbnNmb3JtMnRvVHJhbnNmb3JtQWRhcHRvcihzdHJ1Y3QgX2Ntc3RyYW5zZm9ybV9zdHJ1Y3QgKkNNTWNhcmdvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBJbnB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogT3V0cHV0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgUGl4ZWxzUGVyTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIExpbmVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zU3RyaWRlKiBTdHJpZGUpCit7CisgICAgIAorICAgICAgIGNtc1VJbnQzMk51bWJlciBpLCBzdHJpZGVJbiwgc3RyaWRlT3V0OworCisgICAgICAgX2Ntc0hhbmRsZUV4dHJhQ2hhbm5lbHMoQ01NY2FyZ28sIElucHV0QnVmZmVyLCBPdXRwdXRCdWZmZXIsIFBpeGVsc1BlckxpbmUsIExpbmVDb3VudCwgU3RyaWRlKTsKKworICAgICAgIHN0cmlkZUluID0gMDsKKyAgICAgICBzdHJpZGVPdXQgPSAwOworCisgICAgICAgZm9yIChpID0gMDsgaSA8IExpbmVDb3VudDsgaSsrKSB7CisKKyAgICAgICAgICAgICAgdm9pZCAqYWNjdW0gPSAoY21zVUludDhOdW1iZXIqKUlucHV0QnVmZmVyICsgc3RyaWRlSW47CisgICAgICAgICAgICAgIHZvaWQgKm91dHB1dCA9IChjbXNVSW50OE51bWJlciopT3V0cHV0QnVmZmVyICsgc3RyaWRlT3V0OworCisgICAgICAgICAgICAgIENNTWNhcmdvLT5PbGRYZm9ybShDTU1jYXJnbywgYWNjdW0sIG91dHB1dCwgUGl4ZWxzUGVyTGluZSwgU3RyaWRlLT5CeXRlc1BlclBsYW5lSW4pOworCisgICAgICAgICAgICAgIHN0cmlkZUluICs9IFN0cmlkZS0+Qnl0ZXNQZXJMaW5lSW47CisgICAgICAgICAgICAgIHN0cmlkZU91dCArPSBTdHJpZGUtPkJ5dGVzUGVyTGluZU91dDsKKyAgICAgICB9Cit9CisKKworCisvLyBSZWdpc3RlciBuZXcgd2F5cyB0byB0cmFuc2Zvcm0KK2Ntc0Jvb2wgIF9jbXNSZWdpc3RlclRyYW5zZm9ybVBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogRGF0YSkKK3sKKyAgICBjbXNQbHVnaW5UcmFuc2Zvcm0qIFBsdWdpbiA9IChjbXNQbHVnaW5UcmFuc2Zvcm0qKSBEYXRhOworICAgIF9jbXNUcmFuc2Zvcm1Db2xsZWN0aW9uKiBmbDsKKyAgICBfY21zVHJhbnNmb3JtUGx1Z2luQ2h1bmtUeXBlKiBjdHggPSAoIF9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCxUcmFuc2Zvcm1QbHVnaW4pOworCisgICAgaWYgKERhdGEgPT0gTlVMTCkgeworCisgICAgICAgIC8vIEZyZWUgdGhlIGNoYWluLiBNZW1vcnkgaXMgc2FmZWx5IGZyZWVkIGF0IGV4aXQKKyAgICAgICAgY3R4LT5UcmFuc2Zvcm1Db2xsZWN0aW9uID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgLy8gRmFjdG9yeSBjYWxsYmFjayBpcyByZXF1aXJlZAorICAgIGlmIChQbHVnaW4tPmZhY3Rvcmllcy54Zm9ybSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKworICAgIGZsID0gKF9jbXNUcmFuc2Zvcm1Db2xsZWN0aW9uKikgX2Ntc1BsdWdpbk1hbGxvYyhDb250ZXh0SUQsIHNpemVvZihfY21zVHJhbnNmb3JtQ29sbGVjdGlvbikpOworICAgIGlmIChmbCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICAvLyBDaGVjayBmb3IgZnVsbCB4Zm9ybSBwbHVnLWlucyBwcmV2aW91cyB0byAyLjgsIHdlIHdvdWxkIG5lZWQgYW4gYWRhcHRlciBpbiB0aGF0IGNhc2UKKyAgICBpZiAoUGx1Z2luLT5iYXNlLkV4cGVjdGVkVmVyc2lvbiA8IDIwODApIHsKKworICAgICAgICAgICBmbC0+T2xkWGZvcm0gPSBUUlVFOworICAgIH0KKyAgICBlbHNlCisgICAgICAgICAgIGZsLT5PbGRYZm9ybSA9IEZBTFNFOworCisgICAgLy8gQ29weSB0aGUgcGFyYW1ldGVycworICAgIGZsLT5GYWN0b3J5ID0gUGx1Z2luLT5mYWN0b3JpZXMueGZvcm07CisKKyAgICAvLyBLZWVwIGxpbmtlZCBsaXN0CisgICAgZmwgLT5OZXh0ID0gY3R4LT5UcmFuc2Zvcm1Db2xsZWN0aW9uOworICAgIGN0eC0+VHJhbnNmb3JtQ29sbGVjdGlvbiA9IGZsOworCisgICAgLy8gQWxsIGlzIG9rCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKwordm9pZCBDTVNFWFBPUlQgX2Ntc1NldFRyYW5zZm9ybVVzZXJEYXRhKHN0cnVjdCBfY21zdHJhbnNmb3JtX3N0cnVjdCAqQ01NY2FyZ28sIHZvaWQqIHB0ciwgX2Ntc0ZyZWVVc2VyRGF0YUZuIEZyZWVQcml2YXRlRGF0YUZuKQoreworICAgIF9jbXNBc3NlcnQoQ01NY2FyZ28gIT0gTlVMTCk7CisgICAgQ01NY2FyZ28gLT5Vc2VyRGF0YSA9IHB0cjsKKyAgICBDTU1jYXJnbyAtPkZyZWVVc2VyRGF0YSA9IEZyZWVQcml2YXRlRGF0YUZuOworfQorCisvLyByZXR1cm5zIHRoZSBwb2ludGVyIGRlZmluZWQgYnkgdGhlIHBsdWctaW4gdG8gc3RvcmUgcHJpdmF0ZSBkYXRhCit2b2lkICogQ01TRVhQT1JUIF9jbXNHZXRUcmFuc2Zvcm1Vc2VyRGF0YShzdHJ1Y3QgX2Ntc3RyYW5zZm9ybV9zdHJ1Y3QgKkNNTWNhcmdvKQoreworICAgIF9jbXNBc3NlcnQoQ01NY2FyZ28gIT0gTlVMTCk7CisgICAgcmV0dXJuIENNTWNhcmdvIC0+VXNlckRhdGE7Cit9CisKKy8vIHJldHVybnMgdGhlIGN1cnJlbnQgZm9ybWF0dGVycwordm9pZCBDTVNFWFBPUlQgX2Ntc0dldFRyYW5zZm9ybUZvcm1hdHRlcnMxNihzdHJ1Y3QgX2Ntc3RyYW5zZm9ybV9zdHJ1Y3QgKkNNTWNhcmdvLCBjbXNGb3JtYXR0ZXIxNiogRnJvbUlucHV0LCBjbXNGb3JtYXR0ZXIxNiogVG9PdXRwdXQpCit7CisgICAgIF9jbXNBc3NlcnQoQ01NY2FyZ28gIT0gTlVMTCk7CisgICAgIGlmIChGcm9tSW5wdXQpICpGcm9tSW5wdXQgPSBDTU1jYXJnbyAtPkZyb21JbnB1dDsKKyAgICAgaWYgKFRvT3V0cHV0KSAgKlRvT3V0cHV0ICA9IENNTWNhcmdvIC0+VG9PdXRwdXQ7Cit9CisKK3ZvaWQgQ01TRVhQT1JUIF9jbXNHZXRUcmFuc2Zvcm1Gb3JtYXR0ZXJzRmxvYXQoc3RydWN0IF9jbXN0cmFuc2Zvcm1fc3RydWN0ICpDTU1jYXJnbywgY21zRm9ybWF0dGVyRmxvYXQqIEZyb21JbnB1dCwgY21zRm9ybWF0dGVyRmxvYXQqIFRvT3V0cHV0KQoreworICAgICBfY21zQXNzZXJ0KENNTWNhcmdvICE9IE5VTEwpOworICAgICBpZiAoRnJvbUlucHV0KSAqRnJvbUlucHV0ID0gQ01NY2FyZ28gLT5Gcm9tSW5wdXRGbG9hdDsKKyAgICAgaWYgKFRvT3V0cHV0KSAgKlRvT3V0cHV0ICA9IENNTWNhcmdvIC0+VG9PdXRwdXRGbG9hdDsKK30KKworCisvLyBBbGxvY2F0ZSB0cmFuc2Zvcm0gc3RydWN0IGFuZCBzZXQgaXQgdG8gZGVmYXVsdHMuIEFzayB0aGUgb3B0aW1pemF0aW9uIHBsdWctaW4gYWJvdXQgaWYgdGhvc2UgZm9ybWF0cyBhcmUgcHJvcGVyCisvLyBmb3Igc2VwYXJhdGVkIHRyYW5zZm9ybXMuIElmIHRoaXMgaXMgdGhlIGNhc2UsCitzdGF0aWMKK19jbXNUUkFOU0ZPUk0qIEFsbG9jRW1wdHlUcmFuc2Zvcm0oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BpcGVsaW5lKiBsdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsIGNtc1VJbnQzMk51bWJlciogSW5wdXRGb3JtYXQsIGNtc1VJbnQzMk51bWJlciogT3V0cHV0Rm9ybWF0LCBjbXNVSW50MzJOdW1iZXIqIGR3RmxhZ3MpCit7CisgICAgIF9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVua1R5cGUqIGN0eCA9ICggX2Ntc1RyYW5zZm9ybVBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBUcmFuc2Zvcm1QbHVnaW4pOworICAgICBfY21zVHJhbnNmb3JtQ29sbGVjdGlvbiogUGx1Z2luOworCisgICAgICAgLy8gQWxsb2NhdGUgbmVlZGVkIG1lbW9yeQorICAgICAgIF9jbXNUUkFOU0ZPUk0qIHAgPSAoX2Ntc1RSQU5TRk9STSopX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBzaXplb2YoX2Ntc1RSQU5TRk9STSkpOworICAgICAgIGlmICghcCkgeworICAgICAgICAgIGNtc1BpcGVsaW5lRnJlZShsdXQpOworICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgfQorCisgICAgICAgLy8gU3RvcmUgdGhlIHByb3Bvc2VkIHBpcGVsaW5lCisgICAgICAgcC0+THV0ID0gbHV0OworCisgICAgICAgLy8gTGV0J3Mgc2VlIGlmIGFueSBwbHVnLWluIHdhbnQgdG8gZG8gdGhlIHRyYW5zZm9ybSBieSBpdHNlbGYKKyAgICAgICBpZiAocC0+THV0ICE9IE5VTEwpIHsKKworICAgICAgICAgICAgICBmb3IgKFBsdWdpbiA9IGN0eC0+VHJhbnNmb3JtQ29sbGVjdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgIFBsdWdpbiAhPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgUGx1Z2luID0gUGx1Z2luLT5OZXh0KSB7CisKKyAgICAgICAgICAgICAgICAgICAgIGlmIChQbHVnaW4tPkZhY3RvcnkoJnAtPnhmb3JtLCAmcC0+VXNlckRhdGEsICZwLT5GcmVlVXNlckRhdGEsICZwLT5MdXQsIElucHV0Rm9ybWF0LCBPdXRwdXRGb3JtYXQsIGR3RmxhZ3MpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMYXN0IHBsdWdpbiBpbiB0aGUgZGVjbGFyYXRpb24gb3JkZXIgdGFrZXMgY29udHJvbC4gV2UganVzdCBrZWVwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIHBhcmFtZXRlcnMgYXMgYSBsb2dnaW5nLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgY21zRkxBR1NfQ0FOX0NIQU5HRV9GT1JNQVRURVIgaXMgbm90IHNldCwgc28gYnkgZGVmYXVsdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBvcHRpbWl6ZWQgdHJhbnNmb3JtIGlzIG5vdCByZXVzYWJsZS4gVGhlIHBsdWctaW4gY2FuLCBob3dldmVyLCBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZmxhZ3MgYW5kIG1ha2UgaXQgc3VpdGFibGUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5Db250ZXh0SUQgPSBDb250ZXh0SUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+SW5wdXRGb3JtYXQgPSAqSW5wdXRGb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+T3V0cHV0Rm9ybWF0ID0gKk91dHB1dEZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5kd09yaWdpbmFsRmxhZ3MgPSAqZHdGbGFnczsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpbGwgdGhlIGZvcm1hdHRlcnMganVzdCBpbiBjYXNlIHRoZSBvcHRpbWl6ZWQgcm91dGluZSBpcyBpbnRlcmVzdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGVycm9yIGlzIHRocm93biBpZiB0aGUgZm9ybWF0dGVyIGRvZXNuJ3QgZXhpc3QuIEl0IGlzIHVwIHRvIHRoZSBvcHRpbWl6YXRpb24gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFjdG9yeSB0byBkZWNpZGUgd2hhdCB0byBkbyBpbiB0aG9zZSBjYXNlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5Gcm9tSW5wdXQgPSBfY21zR2V0Rm9ybWF0dGVyKENvbnRleHRJRCwgKklucHV0Rm9ybWF0LCBjbXNGb3JtYXR0ZXJJbnB1dCwgQ01TX1BBQ0tfRkxBR1NfMTZCSVRTKS5GbXQxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLT5Ub091dHB1dCA9IF9jbXNHZXRGb3JtYXR0ZXIoQ29udGV4dElELCAqT3V0cHV0Rm9ybWF0LCBjbXNGb3JtYXR0ZXJPdXRwdXQsIENNU19QQUNLX0ZMQUdTXzE2QklUUykuRm10MTY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+RnJvbUlucHV0RmxvYXQgPSBfY21zR2V0Rm9ybWF0dGVyKENvbnRleHRJRCwgKklucHV0Rm9ybWF0LCBjbXNGb3JtYXR0ZXJJbnB1dCwgQ01TX1BBQ0tfRkxBR1NfRkxPQVQpLkZtdEZsb2F0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPlRvT3V0cHV0RmxvYXQgPSBfY21zR2V0Rm9ybWF0dGVyKENvbnRleHRJRCwgKk91dHB1dEZvcm1hdCwgY21zRm9ybWF0dGVyT3V0cHV0LCBDTVNfUEFDS19GTEFHU19GTE9BVCkuRm10RmxvYXQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSBkYXk/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBsdWdpbi0+T2xkWGZvcm0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+T2xkWGZvcm0gPSAoX2Ntc1RyYW5zZm9ybUZuKSBwLT54Zm9ybTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC0+eGZvcm0gPSBfY21zVHJhbnNmb3JtMnRvVHJhbnNmb3JtQWRhcHRvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgLy8gTm90IHN1aXRhYmxlIGZvciB0aGUgdHJhbnNmb3JtIHBsdWctaW4sIGxldCdzIGNoZWNrICB0aGUgcGlwZWxpbmUgcGx1Zy1pbgorICAgICAgICAgICAgICBfY21zT3B0aW1pemVQaXBlbGluZShDb250ZXh0SUQsICZwLT5MdXQsIEludGVudCwgSW5wdXRGb3JtYXQsIE91dHB1dEZvcm1hdCwgZHdGbGFncyk7CisgICAgICAgfQorCisgICAgLy8gQ2hlY2sgd2hhdGV2ZXIgdGhpcyBpcyBhIHRydWUgZmxvYXRpbmcgcG9pbnQgdHJhbnNmb3JtCisgICAgaWYgKF9jbXNGb3JtYXR0ZXJJc0Zsb2F0KCpJbnB1dEZvcm1hdCkgJiYgX2Ntc0Zvcm1hdHRlcklzRmxvYXQoKk91dHB1dEZvcm1hdCkpIHsKKworICAgICAgICAvLyBHZXQgZm9ybWF0dGVyIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm4gYSB2YWxpZCB1bmlvbiwgYnV0IHRoZSBjb250ZW50cyBvZiB0aGlzIHVuaW9uIG1heSBiZSBOVUxMLgorICAgICAgICBwIC0+RnJvbUlucHV0RmxvYXQgPSBfY21zR2V0Rm9ybWF0dGVyKENvbnRleHRJRCwgKklucHV0Rm9ybWF0LCAgY21zRm9ybWF0dGVySW5wdXQsIENNU19QQUNLX0ZMQUdTX0ZMT0FUKS5GbXRGbG9hdDsKKyAgICAgICAgcCAtPlRvT3V0cHV0RmxvYXQgID0gX2Ntc0dldEZvcm1hdHRlcihDb250ZXh0SUQsICpPdXRwdXRGb3JtYXQsIGNtc0Zvcm1hdHRlck91dHB1dCwgQ01TX1BBQ0tfRkxBR1NfRkxPQVQpLkZtdEZsb2F0OworICAgICAgICAqZHdGbGFncyB8PSBjbXNGTEFHU19DQU5fQ0hBTkdFX0ZPUk1BVFRFUjsKKworICAgICAgICBpZiAocCAtPkZyb21JbnB1dEZsb2F0ID09IE5VTEwgfHwgcCAtPlRvT3V0cHV0RmxvYXQgPT0gTlVMTCkgeworCisgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5zdXBwb3J0ZWQgcmFzdGVyIGZvcm1hdCIpOworICAgICAgICAgICAgY21zRGVsZXRlVHJhbnNmb3JtKHApOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKmR3RmxhZ3MgJiBjbXNGTEFHU19OVUxMVFJBTlNGT1JNKSB7CisKKyAgICAgICAgICAgIHAgLT54Zm9ybSA9IE51bGxGbG9hdFhGT1JNOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8gRmxvYXQgdHJhbnNmb3JtcyBkb24ndCB1c2UgY2FjaGUsIGFsd2F5cyBhcmUgbm9uLU5VTEwKKyAgICAgICAgICAgIHAgLT54Zm9ybSA9IEZsb2F0WEZPUk07CisgICAgICAgIH0KKworICAgIH0KKyAgICBlbHNlIHsKKworICAgICAgICBpZiAoKklucHV0Rm9ybWF0ID09IDAgJiYgKk91dHB1dEZvcm1hdCA9PSAwKSB7CisgICAgICAgICAgICBwIC0+RnJvbUlucHV0ID0gcCAtPlRvT3V0cHV0ID0gTlVMTDsKKyAgICAgICAgICAgICpkd0ZsYWdzIHw9IGNtc0ZMQUdTX0NBTl9DSEFOR0VfRk9STUFUVEVSOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICBpbnQgQnl0ZXNQZXJQaXhlbElucHV0OworCisgICAgICAgICAgICBwIC0+RnJvbUlucHV0ID0gX2Ntc0dldEZvcm1hdHRlcihDb250ZXh0SUQsICpJbnB1dEZvcm1hdCwgIGNtc0Zvcm1hdHRlcklucHV0LCBDTVNfUEFDS19GTEFHU18xNkJJVFMpLkZtdDE2OworICAgICAgICAgICAgcCAtPlRvT3V0cHV0ICA9IF9jbXNHZXRGb3JtYXR0ZXIoQ29udGV4dElELCAqT3V0cHV0Rm9ybWF0LCBjbXNGb3JtYXR0ZXJPdXRwdXQsIENNU19QQUNLX0ZMQUdTXzE2QklUUykuRm10MTY7CisKKyAgICAgICAgICAgIGlmIChwIC0+RnJvbUlucHV0ID09IE5VTEwgfHwgcCAtPlRvT3V0cHV0ID09IE5VTEwpIHsKKworICAgICAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJVbnN1cHBvcnRlZCByYXN0ZXIgZm9ybWF0Iik7CisgICAgICAgICAgICAgICAgY21zRGVsZXRlVHJhbnNmb3JtKHApOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBCeXRlc1BlclBpeGVsSW5wdXQgPSBUX0JZVEVTKHAgLT5JbnB1dEZvcm1hdCk7CisgICAgICAgICAgICBpZiAoQnl0ZXNQZXJQaXhlbElucHV0ID09IDAgfHwgQnl0ZXNQZXJQaXhlbElucHV0ID49IDIpCisgICAgICAgICAgICAgICAgICAgKmR3RmxhZ3MgfD0gY21zRkxBR1NfQ0FOX0NIQU5HRV9GT1JNQVRURVI7CisKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqZHdGbGFncyAmIGNtc0ZMQUdTX05VTExUUkFOU0ZPUk0pIHsKKworICAgICAgICAgICAgcCAtPnhmb3JtID0gTnVsbFhGT1JNOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKCpkd0ZsYWdzICYgY21zRkxBR1NfTk9DQUNIRSkgeworCisgICAgICAgICAgICAgICAgaWYgKCpkd0ZsYWdzICYgY21zRkxBR1NfR0FNVVRDSEVDSykKKyAgICAgICAgICAgICAgICAgICAgcCAtPnhmb3JtID0gUHJlY2FsY3VsYXRlZFhGT1JNR2FtdXRDaGVjazsgIC8vIEdhbXV0IGNoZWNrLCBubyBjYWNoZQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcCAtPnhmb3JtID0gUHJlY2FsY3VsYXRlZFhGT1JNOyAgLy8gTm8gY2FjaGUsIG5vIGdhbXV0IGNoZWNrCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgICAgIGlmICgqZHdGbGFncyAmIGNtc0ZMQUdTX0dBTVVUQ0hFQ0spCisgICAgICAgICAgICAgICAgICAgIHAgLT54Zm9ybSA9IENhY2hlZFhGT1JNR2FtdXRDaGVjazsgICAgLy8gR2FtdXQgY2hlY2ssIGNhY2hlCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwIC0+eGZvcm0gPSBDYWNoZWRYRk9STTsgIC8vIE5vIGdhbXV0IGNoZWNrLCBjYWNoZQorCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwIC0+SW5wdXRGb3JtYXQgICAgID0gKklucHV0Rm9ybWF0OworICAgIHAgLT5PdXRwdXRGb3JtYXQgICAgPSAqT3V0cHV0Rm9ybWF0OworICAgIHAgLT5kd09yaWdpbmFsRmxhZ3MgPSAqZHdGbGFnczsKKyAgICBwIC0+Q29udGV4dElEICAgICAgID0gQ29udGV4dElEOworICAgIHAgLT5Vc2VyRGF0YSAgICAgICAgPSBOVUxMOworICAgIHJldHVybiBwOworfQorCitzdGF0aWMKK2Ntc0Jvb2wgR2V0WEZvcm1Db2xvclNwYWNlcyhpbnQgblByb2ZpbGVzLCBjbXNIUFJPRklMRSBoUHJvZmlsZXNbXSwgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSogSW5wdXQsIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUqIE91dHB1dCkKK3sKKyAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2VJbiwgQ29sb3JTcGFjZU91dDsKKyAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIFBvc3RDb2xvclNwYWNlOworICAgIGludCBpOworCisgICAgaWYgKG5Qcm9maWxlcyA8PSAwKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKGhQcm9maWxlc1swXSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICAqSW5wdXQgPSBQb3N0Q29sb3JTcGFjZSA9IGNtc0dldENvbG9yU3BhY2UoaFByb2ZpbGVzWzBdKTsKKworICAgIGZvciAoaT0wOyBpIDwgblByb2ZpbGVzOyBpKyspIHsKKworICAgICAgICBjbXNQcm9maWxlQ2xhc3NTaWduYXR1cmUgY2xzOworICAgICAgICBjbXNIUFJPRklMRSBoUHJvZmlsZSA9IGhQcm9maWxlc1tpXTsKKworICAgICAgICBpbnQgbElzSW5wdXQgPSAoUG9zdENvbG9yU3BhY2UgIT0gY21zU2lnWFlaRGF0YSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgKFBvc3RDb2xvclNwYWNlICE9IGNtc1NpZ0xhYkRhdGEpOworCisgICAgICAgIGlmIChoUHJvZmlsZSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgY2xzID0gY21zR2V0RGV2aWNlQ2xhc3MoaFByb2ZpbGUpOworCisgICAgICAgIGlmIChjbHMgPT0gY21zU2lnTmFtZWRDb2xvckNsYXNzKSB7CisKKyAgICAgICAgICAgIENvbG9yU3BhY2VJbiAgICA9IGNtc1NpZzFjb2xvckRhdGE7CisgICAgICAgICAgICBDb2xvclNwYWNlT3V0ICAgPSAoblByb2ZpbGVzID4gMSkgPyBjbXNHZXRQQ1MoaFByb2ZpbGUpIDogY21zR2V0Q29sb3JTcGFjZShoUHJvZmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICBpZiAobElzSW5wdXQgfHwgKGNscyA9PSBjbXNTaWdMaW5rQ2xhc3MpKSB7CisKKyAgICAgICAgICAgIENvbG9yU3BhY2VJbiAgICA9IGNtc0dldENvbG9yU3BhY2UoaFByb2ZpbGUpOworICAgICAgICAgICAgQ29sb3JTcGFjZU91dCAgID0gY21zR2V0UENTKGhQcm9maWxlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIENvbG9yU3BhY2VJbiAgICA9IGNtc0dldFBDUyhoUHJvZmlsZSk7CisgICAgICAgICAgICBDb2xvclNwYWNlT3V0ICAgPSBjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpPT0wKQorICAgICAgICAgICAgKklucHV0ID0gQ29sb3JTcGFjZUluOworCisgICAgICAgIFBvc3RDb2xvclNwYWNlID0gQ29sb3JTcGFjZU91dDsKKyAgICB9CisKKyAgICAqT3V0cHV0ID0gUG9zdENvbG9yU3BhY2U7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworLy8gQ2hlY2sgY29sb3JzcGFjZQorc3RhdGljCitjbXNCb29sICBJc1Byb3BlckNvbG9yU3BhY2UoY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBDaGVjaywgY21zVUludDMyTnVtYmVyIGR3Rm9ybWF0KQoreworICAgIGludCBTcGFjZTEgPSBUX0NPTE9SU1BBQ0UoZHdGb3JtYXQpOworICAgIGludCBTcGFjZTIgPSBfY21zTENNU2NvbG9yU3BhY2UoQ2hlY2spOworCisgICAgaWYgKFNwYWNlMSA9PSBQVF9BTlkpIHJldHVybiBUUlVFOworICAgIGlmIChTcGFjZTEgPT0gU3BhY2UyKSByZXR1cm4gVFJVRTsKKworICAgIGlmIChTcGFjZTEgPT0gUFRfTGFiVjIgJiYgU3BhY2UyID09IFBUX0xhYikgcmV0dXJuIFRSVUU7CisgICAgaWYgKFNwYWNlMSA9PSBQVF9MYWIgICAmJiBTcGFjZTIgPT0gUFRfTGFiVjIpIHJldHVybiBUUlVFOworCisgICAgcmV0dXJuIEZBTFNFOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEp1bi0yMS0yMDAwOiBTb21lIHByb2ZpbGVzICh0aG9zZSB0aGF0IGNvbWVzIHdpdGggVzJLKSBjb21lcworLy8gd2l0aCB0aGUgbWVkaWEgd2hpdGUgKG1lZGlhIGJsYWNrPykgeCAxMDAuIEFkZCBhIHNhbml0eSBjaGVjaworCitzdGF0aWMKK3ZvaWQgTm9ybWFsaXplWFlaKGNtc0NJRVhZWiogRGVzdCkKK3sKKyAgICB3aGlsZSAoRGVzdCAtPiBYID4gMi4gJiYKKyAgICAgICAgICAgRGVzdCAtPiBZID4gMi4gJiYKKyAgICAgICAgICAgRGVzdCAtPiBaID4gMi4pIHsKKworICAgICAgICAgICAgICAgRGVzdCAtPiBYIC89IDEwLjsKKyAgICAgICAgICAgICAgIERlc3QgLT4gWSAvPSAxMC47CisgICAgICAgICAgICAgICBEZXN0IC0+IFogLz0gMTAuOworICAgICAgIH0KK30KKworc3RhdGljCit2b2lkIFNldFdoaXRlUG9pbnQoY21zQ0lFWFlaKiB3dFB0LCBjb25zdCBjbXNDSUVYWVoqIHNyYykKK3sKKyAgICBpZiAoc3JjID09IE5VTEwpIHsKKyAgICAgICAgd3RQdCAtPlggPSBjbXNENTBYOworICAgICAgICB3dFB0IC0+WSA9IGNtc0Q1MFk7CisgICAgICAgIHd0UHQgLT5aID0gY21zRDUwWjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHd0UHQgLT5YID0gc3JjLT5YOworICAgICAgICB3dFB0IC0+WSA9IHNyYy0+WTsKKyAgICAgICAgd3RQdCAtPlogPSBzcmMtPlo7CisKKyAgICAgICAgTm9ybWFsaXplWFlaKHd0UHQpOworICAgIH0KKworfQorCisvLyBOZXcgdG8gbGNtcyAyLjAgLS0gaGF2ZSBhbGwgcGFyYW1ldGVycyBhdmFpbGFibGUuCitjbXNIVFJBTlNGT1JNIENNU0VYUE9SVCBjbXNDcmVhdGVFeHRlbmRlZFRyYW5zZm9ybShjbXNDb250ZXh0IENvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuUHJvZmlsZXMsIGNtc0hQUk9GSUxFIGhQcm9maWxlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zQm9vbCAgQlBDW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW50ZW50c1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uU3RhdGVzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSBoR2FtdXRQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG5HYW11dFBDU3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIElucHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIE91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKQoreworICAgIF9jbXNUUkFOU0ZPUk0qIHhmb3JtOyAgICAKKyAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIEVudHJ5Q29sb3JTcGFjZTsKKyAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIEV4aXRDb2xvclNwYWNlOworICAgIGNtc1BpcGVsaW5lKiBMdXQ7CisgICAgY21zVUludDMyTnVtYmVyIExhc3RJbnRlbnQgPSBJbnRlbnRzW25Qcm9maWxlcy0xXTsKKworICAgIC8vIElmIGl0IGlzIGEgZmFrZSB0cmFuc2Zvcm0KKyAgICBpZiAoZHdGbGFncyAmIGNtc0ZMQUdTX05VTExUUkFOU0ZPUk0pCisgICAgeworICAgICAgICByZXR1cm4gQWxsb2NFbXB0eVRyYW5zZm9ybShDb250ZXh0SUQsIE5VTEwsIElOVEVOVF9QRVJDRVBUVUFMLCAmSW5wdXRGb3JtYXQsICZPdXRwdXRGb3JtYXQsICZkd0ZsYWdzKTsKKyAgICB9CisKKyAgICAvLyBJZiBnYW11dCBjaGVjayBpcyByZXF1ZXN0ZWQsIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgZ2FtdXQgcHJvZmlsZQorICAgIGlmIChkd0ZsYWdzICYgY21zRkxBR1NfR0FNVVRDSEVDSykgeworICAgICAgICBpZiAoaEdhbXV0UHJvZmlsZSA9PSBOVUxMKSBkd0ZsYWdzICY9IH5jbXNGTEFHU19HQU1VVENIRUNLOworICAgIH0KKworICAgIC8vIE9uIGZsb2F0aW5nIHBvaW50IHRyYW5zZm9ybXMsIGluaGliaXQgY2FjaGUKKyAgICBpZiAoX2Ntc0Zvcm1hdHRlcklzRmxvYXQoSW5wdXRGb3JtYXQpIHx8IF9jbXNGb3JtYXR0ZXJJc0Zsb2F0KE91dHB1dEZvcm1hdCkpCisgICAgICAgIGR3RmxhZ3MgfD0gY21zRkxBR1NfTk9DQUNIRTsKKworICAgIC8vIE1hcmsgZW50cnkvZXhpdCBzcGFjZXMKKyAgICBpZiAoIUdldFhGb3JtQ29sb3JTcGFjZXMoblByb2ZpbGVzLCBoUHJvZmlsZXMsICZFbnRyeUNvbG9yU3BhY2UsICZFeGl0Q29sb3JTcGFjZSkpIHsKKyAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9OVUxMLCAiTlVMTCBpbnB1dCBwcm9maWxlcyBvbiB0cmFuc2Zvcm0iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgcHJvcGVyIGNvbG9yc3BhY2VzCisgICAgaWYgKCFJc1Byb3BlckNvbG9yU3BhY2UoRW50cnlDb2xvclNwYWNlLCBJbnB1dEZvcm1hdCkpIHsKKyAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9DT0xPUlNQQUNFX0NIRUNLLCAiV3JvbmcgaW5wdXQgY29sb3Igc3BhY2Ugb24gdHJhbnNmb3JtIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghSXNQcm9wZXJDb2xvclNwYWNlKEV4aXRDb2xvclNwYWNlLCBPdXRwdXRGb3JtYXQpKSB7CisgICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfQ09MT1JTUEFDRV9DSEVDSywgIldyb25nIG91dHB1dCBjb2xvciBzcGFjZSBvbiB0cmFuc2Zvcm0iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgcGlwZWxpbmUgd2l0aCBhbGwgdHJhbnNmb3JtYXRpb25zCisgICAgTHV0ID0gX2Ntc0xpbmtQcm9maWxlcyhDb250ZXh0SUQsIG5Qcm9maWxlcywgSW50ZW50cywgaFByb2ZpbGVzLCBCUEMsIEFkYXB0YXRpb25TdGF0ZXMsIGR3RmxhZ3MpOworICAgIGlmIChMdXQgPT0gTlVMTCkgeworICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX05PVF9TVUlUQUJMRSwgIkNvdWxkbid0IGxpbmsgdGhlIHByb2ZpbGVzIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIENoZWNrIGNoYW5uZWwgY291bnQKKyAgICBpZiAoKGNtc0NoYW5uZWxzT2YoRW50cnlDb2xvclNwYWNlKSAhPSBjbXNQaXBlbGluZUlucHV0Q2hhbm5lbHMoTHV0KSkgfHwKKyAgICAgICAgKGNtc0NoYW5uZWxzT2YoRXhpdENvbG9yU3BhY2UpICAhPSBjbXNQaXBlbGluZU91dHB1dENoYW5uZWxzKEx1dCkpKSB7CisgICAgICAgIGNtc1BpcGVsaW5lRnJlZShMdXQpOworICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX05PVF9TVUlUQUJMRSwgIkNoYW5uZWwgY291bnQgZG9lc24ndCBtYXRjaC4gUHJvZmlsZSBpcyBjb3JydXB0ZWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisKKyAgICAvLyBBbGwgc2VlbXMgb2sKKyAgICB4Zm9ybSA9IEFsbG9jRW1wdHlUcmFuc2Zvcm0oQ29udGV4dElELCBMdXQsIExhc3RJbnRlbnQsICZJbnB1dEZvcm1hdCwgJk91dHB1dEZvcm1hdCwgJmR3RmxhZ3MpOworICAgIGlmICh4Zm9ybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8vIEtlZXAgdmFsdWVzCisgICAgeGZvcm0gLT5FbnRyeUNvbG9yU3BhY2UgPSBFbnRyeUNvbG9yU3BhY2U7CisgICAgeGZvcm0gLT5FeGl0Q29sb3JTcGFjZSAgPSBFeGl0Q29sb3JTcGFjZTsKKyAgICB4Zm9ybSAtPlJlbmRlcmluZ0ludGVudCA9IEludGVudHNbblByb2ZpbGVzLTFdOworCisgICAgLy8gVGFrZSB3aGl0ZSBwb2ludHMKKyAgICBTZXRXaGl0ZVBvaW50KCZ4Zm9ybS0+RW50cnlXaGl0ZVBvaW50LCAoY21zQ0lFWFlaKikgY21zUmVhZFRhZyhoUHJvZmlsZXNbMF0sIGNtc1NpZ01lZGlhV2hpdGVQb2ludFRhZykpOworICAgIFNldFdoaXRlUG9pbnQoJnhmb3JtLT5FeGl0V2hpdGVQb2ludCwgIChjbXNDSUVYWVoqKSBjbXNSZWFkVGFnKGhQcm9maWxlc1tuUHJvZmlsZXMtMV0sIGNtc1NpZ01lZGlhV2hpdGVQb2ludFRhZykpOworICAgCisKKyAgICAvLyBDcmVhdGUgYSBnYW11dCBjaGVjayBMVVQgaWYgcmVxdWVzdGVkCisgICAgaWYgKGhHYW11dFByb2ZpbGUgIT0gTlVMTCAmJiAoZHdGbGFncyAmIGNtc0ZMQUdTX0dBTVVUQ0hFQ0spKQorICAgICAgICB4Zm9ybSAtPkdhbXV0Q2hlY2sgID0gX2Ntc0NyZWF0ZUdhbXV0Q2hlY2tQaXBlbGluZShDb250ZXh0SUQsIGhQcm9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBDLCBJbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGF0aW9uU3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuR2FtdXRQQ1Nwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaEdhbXV0UHJvZmlsZSk7CisKKworICAgIC8vIFRyeSB0byByZWFkIGlucHV0IGFuZCBvdXRwdXQgY29sb3JhbnQgdGFibGUKKyAgICBpZiAoY21zSXNUYWcoaFByb2ZpbGVzWzBdLCBjbXNTaWdDb2xvcmFudFRhYmxlVGFnKSkgeworCisgICAgICAgIC8vIElucHV0IHRhYmxlIGNhbiBvbmx5IGNvbWUgaW4gdGhpcyB3YXkuCisgICAgICAgIHhmb3JtIC0+SW5wdXRDb2xvcmFudCA9IGNtc0R1cE5hbWVkQ29sb3JMaXN0KChjbXNOQU1FRENPTE9STElTVCopIGNtc1JlYWRUYWcoaFByb2ZpbGVzWzBdLCBjbXNTaWdDb2xvcmFudFRhYmxlVGFnKSk7CisgICAgfQorCisgICAgLy8gT3V0cHV0IGlzIGEgbGl0dGxlIGJpdCBtb3JlIGNvbXBsZXguCisgICAgaWYgKGNtc0dldERldmljZUNsYXNzKGhQcm9maWxlc1tuUHJvZmlsZXMtMV0pID09IGNtc1NpZ0xpbmtDbGFzcykgeworCisgICAgICAgIC8vIFRoaXMgdGFnIG1heSBleGlzdCBvbmx5IG9uIGRldmljZWxpbmsgcHJvZmlsZXMuCisgICAgICAgIGlmIChjbXNJc1RhZyhoUHJvZmlsZXNbblByb2ZpbGVzLTFdLCBjbXNTaWdDb2xvcmFudFRhYmxlT3V0VGFnKSkgeworCisgICAgICAgICAgICAvLyBJdCBtYXkgYmUgTlVMTCBpZiBlcnJvcgorICAgICAgICAgICAgeGZvcm0gLT5PdXRwdXRDb2xvcmFudCA9IGNtc0R1cE5hbWVkQ29sb3JMaXN0KChjbXNOQU1FRENPTE9STElTVCopIGNtc1JlYWRUYWcoaFByb2ZpbGVzW25Qcm9maWxlcy0xXSwgY21zU2lnQ29sb3JhbnRUYWJsZU91dFRhZykpOworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIGlmIChjbXNJc1RhZyhoUHJvZmlsZXNbblByb2ZpbGVzLTFdLCBjbXNTaWdDb2xvcmFudFRhYmxlVGFnKSkgeworCisgICAgICAgICAgICB4Zm9ybSAtPiBPdXRwdXRDb2xvcmFudCA9IGNtc0R1cE5hbWVkQ29sb3JMaXN0KChjbXNOQU1FRENPTE9STElTVCopIGNtc1JlYWRUYWcoaFByb2ZpbGVzW25Qcm9maWxlcy0xXSwgY21zU2lnQ29sb3JhbnRUYWJsZVRhZykpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU3RvcmUgdGhlIHNlcXVlbmNlIG9mIHByb2ZpbGVzCisgICAgaWYgKGR3RmxhZ3MgJiBjbXNGTEFHU19LRUVQX1NFUVVFTkNFKSB7CisgICAgICAgIHhmb3JtIC0+U2VxdWVuY2UgPSBfY21zQ29tcGlsZVByb2ZpbGVTZXF1ZW5jZShDb250ZXh0SUQsIG5Qcm9maWxlcywgaFByb2ZpbGVzKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICB4Zm9ybSAtPlNlcXVlbmNlID0gTlVMTDsKKworICAgIC8vIElmIHRoaXMgaXMgYSBjYWNoZWQgdHJhbnNmb3JtLCBpbml0IGZpcnN0IHZhbHVlLCB3aGljaCBpcyB6ZXJvICgxNiBiaXRzIG9ubHkpCisgICAgaWYgKCEoZHdGbGFncyAmIGNtc0ZMQUdTX05PQ0FDSEUpKSB7CisKKyAgICAgICAgbWVtc2V0KCZ4Zm9ybSAtPkNhY2hlLkNhY2hlSW4sIDAsIHNpemVvZih4Zm9ybSAtPkNhY2hlLkNhY2hlSW4pKTsKKworICAgICAgICBpZiAoeGZvcm0gLT5HYW11dENoZWNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgIFRyYW5zZm9ybU9uZVBpeGVsV2l0aEdhbXV0Q2hlY2soeGZvcm0sIHhmb3JtIC0+Q2FjaGUuQ2FjaGVJbiwgeGZvcm0tPkNhY2hlLkNhY2hlT3V0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKworICAgICAgICAgICAgeGZvcm0gLT5MdXQgLT5FdmFsMTZGbih4Zm9ybSAtPkNhY2hlLkNhY2hlSW4sIHhmb3JtLT5DYWNoZS5DYWNoZU91dCwgeGZvcm0gLT4gTHV0LT5EYXRhKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuIChjbXNIVFJBTlNGT1JNKSB4Zm9ybTsKK30KKworLy8gTXVsdGlwcm9maWxlIHRyYW5zZm9ybXM6IEdhbXV0IGNoZWNrIGlzIG5vdCBhdmFpbGFibGUgaGVyZSwgYXMgaXQgaXMgdW5jbGVhciBmcm9tIHdoaWNoIHByb2ZpbGUgdGhlIGdhbXV0IGNvbWVzLgorY21zSFRSQU5TRk9STSBDTVNFWFBPUlQgY21zQ3JlYXRlTXVsdGlwcm9maWxlVHJhbnNmb3JtVEhSKGNtc0NvbnRleHQgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFIGhQcm9maWxlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuUHJvZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIElucHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBPdXRwdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKK3sKKyAgICBjbXNVSW50MzJOdW1iZXIgaTsKKyAgICBjbXNCb29sIEJQQ1syNTZdOworICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnRzWzI1Nl07CisgICAgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uU3RhdGVzWzI1Nl07CisKKyAgICBpZiAoblByb2ZpbGVzIDw9IDAgfHwgblByb2ZpbGVzID4gMjU1KSB7CisgICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX1JBTkdFLCAiV3JvbmcgbnVtYmVyIG9mIHByb2ZpbGVzLiAxLi4yNTUgZXhwZWN0ZWQsICVkIGZvdW5kLiIsIG5Qcm9maWxlcyk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGZvciAoaT0wOyBpIDwgblByb2ZpbGVzOyBpKyspIHsKKyAgICAgICAgQlBDW2ldID0gZHdGbGFncyAmIGNtc0ZMQUdTX0JMQUNLUE9JTlRDT01QRU5TQVRJT04gPyBUUlVFIDogRkFMU0U7CisgICAgICAgIEludGVudHNbaV0gPSBJbnRlbnQ7CisgICAgICAgIEFkYXB0YXRpb25TdGF0ZXNbaV0gPSBjbXNTZXRBZGFwdGF0aW9uU3RhdGVUSFIoQ29udGV4dElELCAtMSk7CisgICAgfQorCisKKyAgICByZXR1cm4gY21zQ3JlYXRlRXh0ZW5kZWRUcmFuc2Zvcm0oQ29udGV4dElELCBuUHJvZmlsZXMsIGhQcm9maWxlcywgQlBDLCBJbnRlbnRzLCBBZGFwdGF0aW9uU3RhdGVzLCBOVUxMLCAwLCBJbnB1dEZvcm1hdCwgT3V0cHV0Rm9ybWF0LCBkd0ZsYWdzKTsKK30KKworCisKK2Ntc0hUUkFOU0ZPUk0gQ01TRVhQT1JUIGNtc0NyZWF0ZU11bHRpcHJvZmlsZVRyYW5zZm9ybShjbXNIUFJPRklMRSBoUHJvZmlsZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG5Qcm9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIElucHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgT3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKK3sKKworICAgIGlmIChuUHJvZmlsZXMgPD0gMCB8fCBuUHJvZmlsZXMgPiAyNTUpIHsKKyAgICAgICAgIGNtc1NpZ25hbEVycm9yKE5VTEwsIGNtc0VSUk9SX1JBTkdFLCAiV3JvbmcgbnVtYmVyIG9mIHByb2ZpbGVzLiAxLi4yNTUgZXhwZWN0ZWQsICVkIGZvdW5kLiIsIG5Qcm9maWxlcyk7CisgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gY21zQ3JlYXRlTXVsdGlwcm9maWxlVHJhbnNmb3JtVEhSKGNtc0dldFByb2ZpbGVDb250ZXh0SUQoaFByb2ZpbGVzWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFByb2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuUHJvZmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncyk7Cit9CisKK2Ntc0hUUkFOU0ZPUk0gQ01TRVhQT1JUIGNtc0NyZWF0ZVRyYW5zZm9ybVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW5wdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBPdXRwdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKK3sKKworICAgIGNtc0hQUk9GSUxFIGhBcnJheVsyXTsKKworICAgIGhBcnJheVswXSA9IElucHV0OworICAgIGhBcnJheVsxXSA9IE91dHB1dDsKKworICAgIHJldHVybiBjbXNDcmVhdGVNdWx0aXByb2ZpbGVUcmFuc2Zvcm1USFIoQ29udGV4dElELCBoQXJyYXksIE91dHB1dCA9PSBOVUxMID8gMSA6IDIsIElucHV0Rm9ybWF0LCBPdXRwdXRGb3JtYXQsIEludGVudCwgZHdGbGFncyk7Cit9CisKK0NNU0FQSSBjbXNIVFJBTlNGT1JNIENNU0VYUE9SVCBjbXNDcmVhdGVUcmFuc2Zvcm0oY21zSFBST0ZJTEUgSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnB1dEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgT3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKK3sKKyAgICByZXR1cm4gY21zQ3JlYXRlVHJhbnNmb3JtVEhSKGNtc0dldFByb2ZpbGVDb250ZXh0SUQoSW5wdXQpLCBJbnB1dCwgSW5wdXRGb3JtYXQsIE91dHB1dCwgT3V0cHV0Rm9ybWF0LCBJbnRlbnQsIGR3RmxhZ3MpOworfQorCisKK2Ntc0hUUkFOU0ZPUk0gQ01TRVhQT1JUIGNtc0NyZWF0ZVByb29maW5nVHJhbnNmb3JtVEhSKGNtc0NvbnRleHQgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgSW5wdXRQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIElucHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgT3V0cHV0UHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBPdXRwdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSBQcm9vZmluZ1Byb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgbkludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBQcm9vZmluZ0ludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKQoreworICAgIGNtc0hQUk9GSUxFIGhBcnJheVs0XTsKKyAgICBjbXNVSW50MzJOdW1iZXIgSW50ZW50c1s0XTsKKyAgICBjbXNCb29sICBCUENbNF07CisgICAgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uWzRdOworICAgIGNtc0Jvb2wgIERvQlBDID0gKGR3RmxhZ3MgJiBjbXNGTEFHU19CTEFDS1BPSU5UQ09NUEVOU0FUSU9OKSA/IFRSVUUgOiBGQUxTRTsKKworCisgICAgaEFycmF5WzBdICA9IElucHV0UHJvZmlsZTsgaEFycmF5WzFdID0gUHJvb2ZpbmdQcm9maWxlOyBoQXJyYXlbMl0gID0gUHJvb2ZpbmdQcm9maWxlOyAgICAgICAgICAgICAgIGhBcnJheVszXSA9IE91dHB1dFByb2ZpbGU7CisgICAgSW50ZW50c1swXSA9IG5JbnRlbnQ7ICAgICAgSW50ZW50c1sxXSA9IG5JbnRlbnQ7ICAgICAgICBJbnRlbnRzWzJdID0gSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQzsgIEludGVudHNbM10gPSBQcm9vZmluZ0ludGVudDsKKyAgICBCUENbMF0gICAgID0gRG9CUEM7ICAgICAgICBCUENbMV0gPSBEb0JQQzsgICAgICAgICAgICAgIEJQQ1syXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBDWzNdID0gMDsKKworICAgIEFkYXB0YXRpb25bMF0gPSBBZGFwdGF0aW9uWzFdID0gQWRhcHRhdGlvblsyXSA9IEFkYXB0YXRpb25bM10gPSBjbXNTZXRBZGFwdGF0aW9uU3RhdGVUSFIoQ29udGV4dElELCAtMSk7CisKKyAgICBpZiAoIShkd0ZsYWdzICYgKGNtc0ZMQUdTX1NPRlRQUk9PRklOR3xjbXNGTEFHU19HQU1VVENIRUNLKSkpCisgICAgICAgIHJldHVybiBjbXNDcmVhdGVUcmFuc2Zvcm1USFIoQ29udGV4dElELCBJbnB1dFByb2ZpbGUsIElucHV0Rm9ybWF0LCBPdXRwdXRQcm9maWxlLCBPdXRwdXRGb3JtYXQsIG5JbnRlbnQsIGR3RmxhZ3MpOworCisgICAgcmV0dXJuIGNtc0NyZWF0ZUV4dGVuZGVkVHJhbnNmb3JtKENvbnRleHRJRCwgNCwgaEFycmF5LCBCUEMsIEludGVudHMsIEFkYXB0YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvb2ZpbmdQcm9maWxlLCAxLCBJbnB1dEZvcm1hdCwgT3V0cHV0Rm9ybWF0LCBkd0ZsYWdzKTsKKworfQorCisKK2Ntc0hUUkFOU0ZPUk0gQ01TRVhQT1JUIGNtc0NyZWF0ZVByb29maW5nVHJhbnNmb3JtKGNtc0hQUk9GSUxFIElucHV0UHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnB1dEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFIE91dHB1dFByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgT3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgUHJvb2ZpbmdQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG5JbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgUHJvb2ZpbmdJbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKK3sKKyAgICByZXR1cm4gY21zQ3JlYXRlUHJvb2ZpbmdUcmFuc2Zvcm1USFIoY21zR2V0UHJvZmlsZUNvbnRleHRJRChJbnB1dFByb2ZpbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvb2ZpbmdQcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkludGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb29maW5nSW50ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncyk7Cit9CisKKworLy8gR3JhYiB0aGUgQ29udGV4dElEIGZyb20gYW4gb3BlbiB0cmFuc2Zvcm0uIFJldHVybnMgTlVMTCBpZiBhIE5VTEwgdHJhbnNmb3JtIGlzIHBhc3NlZAorY21zQ29udGV4dCBDTVNFWFBPUlQgY21zR2V0VHJhbnNmb3JtQ29udGV4dElEKGNtc0hUUkFOU0ZPUk0gaFRyYW5zZm9ybSkKK3sKKyAgICBfY21zVFJBTlNGT1JNKiB4Zm9ybSA9IChfY21zVFJBTlNGT1JNKikgaFRyYW5zZm9ybTsKKworICAgIGlmICh4Zm9ybSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICByZXR1cm4geGZvcm0gLT4gQ29udGV4dElEOworfQorCisvLyBHcmFiIHRoZSBpbnB1dC9vdXRwdXQgZm9ybWF0cworY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNHZXRUcmFuc2Zvcm1JbnB1dEZvcm1hdChjbXNIVFJBTlNGT1JNIGhUcmFuc2Zvcm0pCit7CisgICAgX2Ntc1RSQU5TRk9STSogeGZvcm0gPSAoX2Ntc1RSQU5TRk9STSopIGhUcmFuc2Zvcm07CisKKyAgICBpZiAoeGZvcm0gPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgcmV0dXJuIHhmb3JtLT5JbnB1dEZvcm1hdDsKK30KKworY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNHZXRUcmFuc2Zvcm1PdXRwdXRGb3JtYXQoY21zSFRSQU5TRk9STSBoVHJhbnNmb3JtKQoreworICAgIF9jbXNUUkFOU0ZPUk0qIHhmb3JtID0gKF9jbXNUUkFOU0ZPUk0qKSBoVHJhbnNmb3JtOworCisgICAgaWYgKHhmb3JtID09IE5VTEwpIHJldHVybiAwOworICAgIHJldHVybiB4Zm9ybS0+T3V0cHV0Rm9ybWF0OworfQorCisvLyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKK2Ntc0Jvb2wgQ01TRVhQT1JUIGNtc0NoYW5nZUJ1ZmZlcnNGb3JtYXQoY21zSFRSQU5TRk9STSBoVHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW5wdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBPdXRwdXRGb3JtYXQpCit7CisgICAgX2Ntc1RSQU5TRk9STSogeGZvcm0gPSAoX2Ntc1RSQU5TRk9STSopIGhUcmFuc2Zvcm07CisgICAgY21zRm9ybWF0dGVyMTYgRnJvbUlucHV0LCBUb091dHB1dDsKKworCisgICAgLy8gV2Ugb25seSBjYW4gYWZmb3JkIHRvIGNoYW5nZSBmb3JtYXR0ZXJzIGlmIHByZXZpb3VzIHRyYW5zZm9ybSBpcyBhdCBsZWFzdCAxNiBiaXRzCisgICAgaWYgKCEoeGZvcm0gLT5kd09yaWdpbmFsRmxhZ3MgJiBjbXNGTEFHU19DQU5fQ0hBTkdFX0ZPUk1BVFRFUikpIHsKKworICAgICAgICBjbXNTaWduYWxFcnJvcih4Zm9ybSAtPkNvbnRleHRJRCwgY21zRVJST1JfTk9UX1NVSVRBQkxFLCAiY21zQ2hhbmdlQnVmZmVyc0Zvcm1hdCB3b3JrcyBvbmx5IG9uIHRyYW5zZm9ybXMgY3JlYXRlZCBvcmlnaW5hbGx5IHdpdGggYXQgbGVhc3QgMTYgYml0cyBvZiBwcmVjaXNpb24iKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIEZyb21JbnB1dCA9IF9jbXNHZXRGb3JtYXR0ZXIoeGZvcm0tPkNvbnRleHRJRCwgSW5wdXRGb3JtYXQsICBjbXNGb3JtYXR0ZXJJbnB1dCwgQ01TX1BBQ0tfRkxBR1NfMTZCSVRTKS5GbXQxNjsKKyAgICBUb091dHB1dCAgPSBfY21zR2V0Rm9ybWF0dGVyKHhmb3JtLT5Db250ZXh0SUQsIE91dHB1dEZvcm1hdCwgY21zRm9ybWF0dGVyT3V0cHV0LCBDTVNfUEFDS19GTEFHU18xNkJJVFMpLkZtdDE2OworCisgICAgaWYgKEZyb21JbnB1dCA9PSBOVUxMIHx8IFRvT3V0cHV0ID09IE5VTEwpIHsKKworICAgICAgICBjbXNTaWduYWxFcnJvcih4Zm9ybSAtPiBDb250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5zdXBwb3J0ZWQgcmFzdGVyIGZvcm1hdCIpOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgeGZvcm0gLT5JbnB1dEZvcm1hdCAgPSBJbnB1dEZvcm1hdDsKKyAgICB4Zm9ybSAtPk91dHB1dEZvcm1hdCA9IE91dHB1dEZvcm1hdDsKKyAgICB4Zm9ybSAtPkZyb21JbnB1dCAgICA9IEZyb21JbnB1dDsKKyAgICB4Zm9ybSAtPlRvT3V0cHV0ICAgICA9IFRvT3V0cHV0OworICAgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtcy9zcmMvbGNtczJfaW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2xjbXMyX2ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE1YWM1OQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xjbXMvc3JjL2xjbXMyX2ludGVybmFsLmgKQEAgLTAsMCArMSwxMDU3IEBACisKKy8vCisvLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCisvLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTYgTWFydGkgTWFyaWEgU2FndWVyCisvLworLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisvLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisvLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisvLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKy8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQorLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKy8vCisvLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisvLworLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisvLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KKy8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisvLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCisvLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisvLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKy8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworCisjaWZuZGVmIF9sY21zX2ludGVybmFsX0gKKworLy8gSW5jbHVkZSBwbHVnLWluIGZvdW5kYXRpb24KKyNpZm5kZWYgX2xjbXNfcGx1Z2luX0gKKyMgICBpbmNsdWRlICJ0aGlyZF9wYXJ0eS9sY21zL2luY2x1ZGUvbGNtczJfcGx1Z2luLmgiCisjZW5kaWYKKworLy8gY3R5cGUgaXMgcGFydCBvZiBDOTkgYXMgcGVyIDcuMS4yCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworLy8gYXNzZXJ0IG1hY3JvIGlzIHBhcnQgb2YgQzk5IGFzIHBlciA3LjIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworLy8gU29tZSBuZWVkZWQgY29uc3RhbnRzCisjaWZuZGVmIE1fUEkKKyMgICAgICAgZGVmaW5lIE1fUEkgICAgICAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKKyNlbmRpZgorCisjaWZuZGVmIE1fTE9HMTBFCisjICAgICAgIGRlZmluZSBNX0xPRzEwRSAgICAwLjQzNDI5NDQ4MTkwMzI1MTgyNzY1MQorI2VuZGlmCisKKy8vIEJvcmxhbmRDIDUuNSwgVkMyMDAzIGFyZSBicm9rZW4gb24gdGhhdAorI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCAoX01TQ19WRVIgPCAxNDAwKSAvLyAxNDAwID09IFZDKysgOC4wCisjZGVmaW5lIHNpbmYoeCkgKGZsb2F0KXNpbigoZmxvYXQpeCkKKyNkZWZpbmUgc3FydGYoeCkgKGZsb2F0KXNxcnQoKGZsb2F0KXgpCisjZW5kaWYKKworCisvLyBBbGlnbm1lbnQgb2YgSUNDIGZpbGUgZm9ybWF0IHVzZXMgNCBieXRlcyAoY21zVUludDMyTnVtYmVyKQorI2RlZmluZSBfY21zQUxJR05MT05HKHgpICgoKHgpKyhzaXplb2YoY21zVUludDMyTnVtYmVyKS0xKSkgJiB+KHNpemVvZihjbXNVSW50MzJOdW1iZXIpLTEpKQorCisvLyBBbGlnbm1lbnQgdG8gbWVtb3J5IHBvaW50ZXIKKworLy8gKFVsdHJhKVNQQVJDIHdpdGggZ2NjIHJlcXVpcmVzIHB0ciBhbGlnbm1lbnQgb2YgOCBieXRlcworLy8gZXZlbiB0aG91Z2ggc2l6ZW9mKHZvaWQgKikgaXMgb25seSBmb3VyOiBmb3IgZ3JlYXRlc3QgZmxleGliaWxpdHkKKy8vIGFsbG93IHRoZSBidWlsZCB0byBzcGVjaWZ5IHB0ciBhbGlnbm1lbnQuCisjaWZuZGVmIENNU19QVFJfQUxJR05NRU5UCisjIGRlZmluZSBDTVNfUFRSX0FMSUdOTUVOVCBzaXplb2Yodm9pZCAqKQorI2VuZGlmCisKKyNkZWZpbmUgX2Ntc0FMSUdOTUVNKHgpICAoKCh4KSsoQ01TX1BUUl9BTElHTk1FTlQgLSAxKSkgJiB+KENNU19QVFJfQUxJR05NRU5UIC0gMSkpCisKKy8vIE1heGltdW0gZW5jb2RlYWJsZSB2YWx1ZXMgaW4gZmxvYXRpbmcgcG9pbnQKKyNkZWZpbmUgTUFYX0VOQ09ERUFCTEVfWFlaICAoMS4wICsgMzI3NjcuMC8zMjc2OC4wKQorI2RlZmluZSBNSU5fRU5DT0RFQUJMRV9hYjIgICgtMTI4LjApCisjZGVmaW5lIE1BWF9FTkNPREVBQkxFX2FiMiAgKCg2NTUzNS4wLzI1Ni4wKSAtIDEyOC4wKQorI2RlZmluZSBNSU5fRU5DT0RFQUJMRV9hYjQgICgtMTI4LjApCisjZGVmaW5lIE1BWF9FTkNPREVBQkxFX2FiNCAgKDEyNy4wKQorCisvLyBNYXhpbXVtIG9mIGNoYW5uZWxzIGZvciBpbnRlcm5hbCBwaXBlbGluZSBldmFsdWF0aW9uCisjZGVmaW5lIE1BWF9TVEFHRV9DSEFOTkVMUyAgMTI4CisKKy8vIFVudXNlZCBwYXJhbWV0ZXIgd2FybmluZyBzdXByZXNzaW9uCisjZGVmaW5lIGNtc1VOVVNFRF9QQVJBTUVURVIoeCkgKCh2b2lkKXgpCisKKy8vIFRoZSBzcGVjaWZpY2F0aW9uIGZvciAiaW5saW5lIiBpcyBzZWN0aW9uIDYuNy40IG9mIHRoZSBDOTkgc3RhbmRhcmQgKElTTy9JRUMgOTg5OToxOTk5KS4KKy8vIHVuZm9ydHVuYXRlbHkgVmlzdWFsQysrIGRvZXMgbm90IGNvbmZvcm0gdGhhdAorI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQorIyAgIGRlZmluZSBjbXNJTkxJTkUgX19pbmxpbmUKKyNlbHNlCisjICAgZGVmaW5lIGNtc0lOTElORSBzdGF0aWMgaW5saW5lCisjZW5kaWYKKworLy8gT3RoZXIgcmVwbGFjZW1lbnQgZnVuY3Rpb25zCisjaWZkZWYgX01TQ19WRVIKKyMgaWZuZGVmIHNucHJpbnRmCisjICAgICAgIGRlZmluZSBzbnByaW50ZiAgX3NucHJpbnRmCisjIGVuZGlmCisjIGlmbmRlZiB2c25wcmludGYKKyMgICAgICAgZGVmaW5lIHZzbnByaW50ZiAgX3ZzbnByaW50ZgorIyBlbmRpZgorI2VuZGlmCisKKworLy8gQSBmYXN0IHdheSB0byBjb252ZXJ0IGZyb20vdG8gMTYgPC0+IDggYml0cworI2RlZmluZSBGUk9NXzhfVE9fMTYocmdiKSAoY21zVUludDE2TnVtYmVyKSAoKCgoY21zVUludDE2TnVtYmVyKSAocmdiKSkgPDwgOCl8KHJnYikpCisjZGVmaW5lIEZST01fMTZfVE9fOChyZ2IpIChjbXNVSW50OE51bWJlcikgKCgoKGNtc1VJbnQzMk51bWJlcikocmdiKSAqIDY1MjgxVSArIDgzODg2MDhVKSA+PiAyNCkgJiAweEZGVSkKKworLy8gQ29kZSBhbmFseXNpcyBpcyBicm9rZW4gb24gYXNzZXJ0cworI2lmZGVmIF9NU0NfVkVSCisjICAgIGlmIChfTVNDX1ZFUiA+PSAxNTAwKQorIyAgICAgICAgICAgIGRlZmluZSBfY21zQXNzZXJ0KGEpICB7IGFzc2VydCgoYSkpOyBfX2FuYWx5c2lzX2Fzc3VtZSgoYSkpOyB9CisjICAgICBlbHNlCisjICAgICAgICAgICAgZGVmaW5lIF9jbXNBc3NlcnQoYSkgICBhc3NlcnQoKGEpKQorIyAgICAgZW5kaWYKKyNlbHNlCisjICAgICAgZGVmaW5lIF9jbXNBc3NlcnQoYSkgICBhc3NlcnQoKGEpKQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIERldGVybWluYW50IGxvd2VyIHRoYW4gdGhhdCBhcmUgYXNzdW1lZCB6ZXJvICh1c2VkIG9uIG1hdHJpeCBpbnZlcnQpCisjZGVmaW5lIE1BVFJJWF9ERVRfVE9MRVJBTkNFICAgIDAuMDAwMQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBGaXhlZCBwb2ludAorI2RlZmluZSBGSVhFRF9UT19JTlQoeCkgICAgICAgICAoKHgpPj4xNikKKyNkZWZpbmUgRklYRURfUkVTVF9UT19JTlQoeCkgICAgKCh4KSYweEZGRkZVKQorI2RlZmluZSBST1VORF9GSVhFRF9UT19JTlQoeCkgICAoKCh4KSsweDgwMDApPj4xNikKKworY21zSU5MSU5FIGNtc1MxNUZpeGVkMTZOdW1iZXIgX2Ntc1RvRml4ZWREb21haW4oaW50IGEpICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGEgKyAoKGEgKyAweDdmZmYpIC8gMHhmZmZmKTsgfQorY21zSU5MSU5FIGludCAgICAgICAgICAgICAgICAgX2Ntc0Zyb21GaXhlZERvbWFpbihjbXNTMTVGaXhlZDE2TnVtYmVyIGEpIHsgcmV0dXJuIGEgLSAoKGEgKyAweDdmZmYpID4+IDE2KTsgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBGYXN0IGZsb29yIGNvbnZlcnNpb24gbG9naWMuIFRoYW5rcyB0byBTcmVlIEtvdGF5IGFuZCBTdHVhcnQgTml4b24KKy8vIG5vdGUgdGhhbiB0aGlzIG9ubHkgd29ya3MgaW4gdGhlIHJhbmdlIC4uLTMyNzY3Li4uKzMyNzY3IGJlY2F1c2UKKy8vIG1hbnRpc3NhIGlzIGludGVycHJldGVkIGFzIDE1LjE2IGZpeGVkIHBvaW50LgorLy8gVGhlIHVuaW9uIGlzIHRvIGF2b2lkIHBvaW50ZXIgYWxpYXNpbmcgb3Zlcm9wdGltaXphdGlvbi4KK2Ntc0lOTElORSBpbnQgX2Ntc1F1aWNrRmxvb3IoY21zRmxvYXQ2NE51bWJlciB2YWwpCit7CisjaWZkZWYgQ01TX0RPTlRfVVNFX0ZBU1RfRkxPT1IKKyAgICByZXR1cm4gKGludCkgZmxvb3IodmFsKTsKKyNlbHNlCisgICAgY29uc3QgY21zRmxvYXQ2NE51bWJlciBfbGNtc19kb3VibGUyZml4bWFnaWMgPSA2ODcxOTQ3NjczNi4wICogMS41OyAgLy8gMl4zNiAqIDEuNSwgKDUyLTE2PTM2KSB1c2VzIGxpbWl0ZWQgcHJlY2lzaW9uIHRvIGZsb29yCisgICAgdW5pb24geworICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIHZhbDsKKyAgICAgICAgaW50IGhhbHZlc1syXTsKKyAgICB9IHRlbXA7CisKKyAgICB0ZW1wLnZhbCA9IHZhbCArIF9sY21zX2RvdWJsZTJmaXhtYWdpYzsKKworI2lmZGVmIENNU19VU0VfQklHX0VORElBTgorICAgIHJldHVybiB0ZW1wLmhhbHZlc1sxXSA+PiAxNjsKKyNlbHNlCisgICAgcmV0dXJuIHRlbXAuaGFsdmVzWzBdID4+IDE2OworI2VuZGlmCisjZW5kaWYKK30KKworLy8gRmFzdCBmbG9vciByZXN0cmljdGVkIHRvIDAuLjY1NTM1LjAKK2Ntc0lOTElORSBjbXNVSW50MTZOdW1iZXIgX2Ntc1F1aWNrRmxvb3JXb3JkKGNtc0Zsb2F0NjROdW1iZXIgZCkKK3sKKyAgICByZXR1cm4gKGNtc1VJbnQxNk51bWJlcikgX2Ntc1F1aWNrRmxvb3IoZCAtIDMyNzY3LjApICsgMzI3NjdVOworfQorCisvLyBGbG9vciB0byB3b3JkLCB0YWtpbmcgY2FyZSBvZiBzYXR1cmF0aW9uCitjbXNJTkxJTkUgY21zVUludDE2TnVtYmVyIF9jbXNRdWlja1NhdHVyYXRlV29yZChjbXNGbG9hdDY0TnVtYmVyIGQpCit7CisgICAgZCArPSAwLjU7CisgICAgaWYgKGQgPD0gMCkgcmV0dXJuIDA7CisgICAgaWYgKGQgPj0gNjU1MzUuMCkgcmV0dXJuIDB4ZmZmZjsKKworICAgIHJldHVybiBfY21zUXVpY2tGbG9vcldvcmQoZCk7Cit9CisKKworLy8gUHRocmVhZCBzdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZuZGVmIENNU19OT19QVEhSRUFEUworCisvLyBUaGlzIGlzIHRoZSB0aHJlYWRpbmcgc3VwcG9ydC4gVW5mb3J0dW5hdGVseSwgaXQgaGFzIHRvIGJlIHBsYXRmb3JtLWRlcGVuZGVudCBiZWNhdXNlIAorLy8gd2luZG93cyBkb2VzIG5vdCBzdXBwb3J0IHB0aHJlYWRzLiAKKworI2lmZGVmIENNU19JU19XSU5ET1dTXworCisjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gMQorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworCisvLyBGcm9tOiBodHRwOi8vbG9ja2xlc3NpbmMuY29tL2FydGljbGVzL3B0aHJlYWRzX29uX3dpbmRvd3MvCisvLyBUaGUgcHRocmVhZHMgQVBJIGhhcyBhbiBpbml0aWFsaXphdGlvbiBtYWNybyB0aGF0IGhhcyBubyBjb3JyZXNwb25kZW5jZSB0byBhbnl0aGluZyBpbiAKKy8vIHRoZSB3aW5kb3dzIEFQSS4gQnkgaW52ZXN0aWdhdGluZyB0aGUgaW50ZXJuYWwgZGVmaW5pdGlvbiBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbiB0eXBlLCAKKy8vIG9uZSBtYXkgd29yayBvdXQgaG93IHRvIGluaXRpYWxpemUgb25lIHdpdGhvdXQgY2FsbGluZyBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCkuIAorLy8gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCkgaXMgbm90IGFsbG93ZWQgdG8gZmFpbC4gSXQgdHJpZXMgCisvLyB0byBhbGxvY2F0ZSBhIGNyaXRpY2FsIHNlY3Rpb24gZGVidWcgb2JqZWN0LCBidXQgaWYgbm8gbWVtb3J5IGlzIGF2YWlsYWJsZSwgaXQgc2V0cyAKKy8vIHRoZSBwb2ludGVyIHRvIGEgc3BlY2lmaWMgdmFsdWUuIChPbmUgd291bGQgZXhwZWN0IHRoYXQgdmFsdWUgdG8gYmUgTlVMTCwgYnV0IGl0IGlzIAorLy8gYWN0dWFsbHkgKHZvaWQgKiktMSBmb3Igc29tZSByZWFzb24uKSBUaHVzIHdlIGNhbiB1c2UgdGhpcyBzcGVjaWFsIHZhbHVlIGZvciB0aGF0IAorLy8gcG9pbnRlciwgYW5kIHRoZSBjcml0aWNhbCBzZWN0aW9uIGNvZGUgd2lsbCB3b3JrLgorCisvLyBUaGUgb3RoZXIgaW1wb3J0YW50IHBhcnQgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24gdHlwZSB0byBpbml0aWFsaXplIGlzIHRoZSBudW1iZXIgCisvLyBvZiB3YWl0ZXJzLiBUaGlzIGNvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSBtdXRleCBpcyBsb2NrZWQuIEZvcnR1bmF0ZWx5LCB0aGlzIAorLy8gcGFydCBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbiBpcyB1bmxpa2VseSB0byBjaGFuZ2UuIEFwcGFyZW50bHksIG1hbnkgcHJvZ3JhbXMgCisvLyBhbHJlYWR5IHRlc3QgY3JpdGljYWwgc2VjdGlvbnMgdG8gc2VlIGlmIHRoZXkgYXJlIGxvY2tlZCB1c2luZyB0aGlzIHZhbHVlLCBzbyAKKy8vIE1pY3Jvc29mdCBmZWx0IHRoYXQgaXQgd2FzIG5lY2Vzc2FyeSB0byBrZWVwIGl0IHNldCBhdCAtMSBmb3IgYW4gdW5sb2NrZWQgY3JpdGljYWwKKy8vIHNlY3Rpb24sIGV2ZW4gd2hlbiB0aGV5IGNoYW5nZWQgdGhlIHVuZGVybHlpbmcgYWxnb3JpdGhtIHRvIGJlIG1vcmUgc2NhbGFibGUuIAorLy8gVGhlIGZpbmFsIHBhcnRzIG9mIHRoZSBjcml0aWNhbCBzZWN0aW9uIG9iamVjdCBhcmUgdW5pbXBvcnRhbnQsIGFuZCBjYW4gYmUgc2V0IAorLy8gdG8gemVybyBmb3IgdGhlaXIgZGVmYXVsdHMuIFRoaXMgeWllbGRzIHRvIGFuIGluaXRpYWxpemF0aW9uIG1hY3JvOgorCit0eXBlZGVmIENSSVRJQ0FMX1NFQ1RJT04gX2Ntc011dGV4OworCisjZGVmaW5lIENNU19NVVRFWF9JTklUSUFMSVpFUiB7KFBSVExfQ1JJVElDQUxfU0VDVElPTl9ERUJVRykgLTEsLTEsMCwwLDAsMH0KKworI2lmZGVmIF9NU0NfVkVSCisjICAgIGlmIChfTVNDX1ZFUiA+PSAxODAwKQorIyAgICAgICAgICBwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogMjYxMzUpCisjICAgIGVuZGlmCisjZW5kaWYKKworY21zSU5MSU5FIGludCBfY21zTG9ja1ByaW1pdGl2ZShfY21zTXV0ZXggKm0pCit7CisJRW50ZXJDcml0aWNhbFNlY3Rpb24obSk7CisJcmV0dXJuIDA7Cit9CisKK2Ntc0lOTElORSBpbnQgX2Ntc1VubG9ja1ByaW1pdGl2ZShfY21zTXV0ZXggKm0pCit7CisJTGVhdmVDcml0aWNhbFNlY3Rpb24obSk7CisJcmV0dXJuIDA7Cit9CisJCitjbXNJTkxJTkUgaW50IF9jbXNJbml0TXV0ZXhQcmltaXRpdmUoX2Ntc011dGV4ICptKQoreworCUluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24obSk7CisJcmV0dXJuIDA7Cit9CisKK2Ntc0lOTElORSBpbnQgX2Ntc0Rlc3Ryb3lNdXRleFByaW1pdGl2ZShfY21zTXV0ZXggKm0pCit7CisJRGVsZXRlQ3JpdGljYWxTZWN0aW9uKG0pOworCXJldHVybiAwOworfQorCitjbXNJTkxJTkUgaW50IF9jbXNFbnRlckNyaXRpY2FsU2VjdGlvblByaW1pdGl2ZShfY21zTXV0ZXggKm0pCit7CisJRW50ZXJDcml0aWNhbFNlY3Rpb24obSk7CisJcmV0dXJuIDA7Cit9CisKK2Ntc0lOTElORSBpbnQgX2Ntc0xlYXZlQ3JpdGljYWxTZWN0aW9uUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKK3sKKwlMZWF2ZUNyaXRpY2FsU2VjdGlvbihtKTsKKwlyZXR1cm4gMDsKK30KKworI2Vsc2UKKworLy8gUmVzdCBvZiB0aGUgd2lkZSB3b3JsZAorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2RlZmluZSBDTVNfTVVURVhfSU5JVElBTElaRVIgUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUgordHlwZWRlZiBwdGhyZWFkX211dGV4X3QgX2Ntc011dGV4OworCisKK2Ntc0lOTElORSBpbnQgX2Ntc0xvY2tQcmltaXRpdmUoX2Ntc011dGV4ICptKQoreworCXJldHVybiBwdGhyZWFkX211dGV4X2xvY2sobSk7Cit9CisKK2Ntc0lOTElORSBpbnQgX2Ntc1VubG9ja1ByaW1pdGl2ZShfY21zTXV0ZXggKm0pCit7CisJcmV0dXJuIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKG0pOworfQorCQorY21zSU5MSU5FIGludCBfY21zSW5pdE11dGV4UHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKK3sKKwlyZXR1cm4gcHRocmVhZF9tdXRleF9pbml0KG0sIE5VTEwpOworfQorCitjbXNJTkxJTkUgaW50IF9jbXNEZXN0cm95TXV0ZXhQcmltaXRpdmUoX2Ntc011dGV4ICptKQoreworCXJldHVybiBwdGhyZWFkX211dGV4X2Rlc3Ryb3kobSk7Cit9CisKK2Ntc0lOTElORSBpbnQgX2Ntc0VudGVyQ3JpdGljYWxTZWN0aW9uUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKK3sKKwlyZXR1cm4gcHRocmVhZF9tdXRleF9sb2NrKG0pOworfQorCitjbXNJTkxJTkUgaW50IF9jbXNMZWF2ZUNyaXRpY2FsU2VjdGlvblByaW1pdGl2ZShfY21zTXV0ZXggKm0pCit7CisJcmV0dXJuIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKG0pOworfQorCisjZW5kaWYKKyNlbHNlCisKKyNkZWZpbmUgQ01TX01VVEVYX0lOSVRJQUxJWkVSIDAKK3R5cGVkZWYgaW50IF9jbXNNdXRleDsKKworCitjbXNJTkxJTkUgaW50IF9jbXNMb2NrUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKK3sKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG0pOworCXJldHVybiAwOworfQorCitjbXNJTkxJTkUgaW50IF9jbXNVbmxvY2tQcmltaXRpdmUoX2Ntc011dGV4ICptKQoreworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobSk7CisJcmV0dXJuIDA7Cit9CisJCitjbXNJTkxJTkUgaW50IF9jbXNJbml0TXV0ZXhQcmltaXRpdmUoX2Ntc011dGV4ICptKQoreworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobSk7CisJcmV0dXJuIDA7Cit9CisKK2Ntc0lOTElORSBpbnQgX2Ntc0Rlc3Ryb3lNdXRleFByaW1pdGl2ZShfY21zTXV0ZXggKm0pCit7CisgICAgY21zVU5VU0VEX1BBUkFNRVRFUihtKTsKKwlyZXR1cm4gMDsKK30KKworY21zSU5MSU5FIGludCBfY21zRW50ZXJDcml0aWNhbFNlY3Rpb25QcmltaXRpdmUoX2Ntc011dGV4ICptKQoreworICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobSk7CisJcmV0dXJuIDA7Cit9CisKK2Ntc0lOTElORSBpbnQgX2Ntc0xlYXZlQ3JpdGljYWxTZWN0aW9uUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKK3sKKyAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG0pOworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8vIFBsdWctSW4gcmVnaXN0cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBTcGVjaWFsaXplZCBmdW5jdGlvbiBmb3IgcGx1Zy1pbiBtZW1vcnkgbWFuYWdlbWVudC4gTm8gcGFpcmluZyBmcmVlKCkgc2luY2Ugd2hvbGUgcG9vbCBpcyBmcmVlZCBhdCBvbmNlLgordm9pZCogX2Ntc1BsdWdpbk1hbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIHNpemUpOworCisvLyBNZW1vcnkgbWFuYWdlbWVudAorY21zQm9vbCAgIF9jbXNSZWdpc3Rlck1lbUhhbmRsZXJQbHVnaW4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BsdWdpbkJhc2UqIFBsdWdpbik7CisKKy8vIEludGVycG9sYXRpb24KK2Ntc0Jvb2wgIF9jbXNSZWdpc3RlckludGVycFBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKTsKKworLy8gUGFyYW1ldHJpYyBjdXJ2ZXMKK2Ntc0Jvb2wgIF9jbXNSZWdpc3RlclBhcmFtZXRyaWNDdXJ2ZXNQbHVnaW4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BsdWdpbkJhc2UqIFBsdWdpbik7CisKKy8vIEZvcm1hdHRlcnMgbWFuYWdlbWVudAorY21zQm9vbCAgX2Ntc1JlZ2lzdGVyRm9ybWF0dGVyc1BsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKTsKKworLy8gVGFnIHR5cGUgbWFuYWdlbWVudAorY21zQm9vbCAgX2Ntc1JlZ2lzdGVyVGFnVHlwZVBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKTsKKworLy8gVGFnIG1hbmFnZW1lbnQKK2Ntc0Jvb2wgIF9jbXNSZWdpc3RlclRhZ1BsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKTsKKworLy8gSW50ZW50IG1hbmFnZW1lbnQKK2Ntc0Jvb2wgIF9jbXNSZWdpc3RlclJlbmRlcmluZ0ludGVudFBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKTsKKworLy8gTXVsdGkgUHJvY2VzcyBlbGVtZW50cworY21zQm9vbCAgX2Ntc1JlZ2lzdGVyTXVsdGlQcm9jZXNzRWxlbWVudFBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKTsKKworLy8gT3B0aW1pemF0aW9uCitjbXNCb29sICBfY21zUmVnaXN0ZXJPcHRpbWl6YXRpb25QbHVnaW4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BsdWdpbkJhc2UqIFBsdWdpbik7CisKKy8vIFRyYW5zZm9ybQorY21zQm9vbCAgX2Ntc1JlZ2lzdGVyVHJhbnNmb3JtUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOworCisvLyBNdXRleAorY21zQm9vbCBfY21zUmVnaXN0ZXJNdXRleFBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFN1YmFsbG9jYXRvcnMuIAordHlwZWRlZiBzdHJ1Y3QgX2Ntc1N1YkFsbG9jYXRvcl9jaHVua19zdCB7CisKKyAgICBjbXNVSW50OE51bWJlciogQmxvY2s7CisgICAgY21zVUludDMyTnVtYmVyIEJsb2NrU2l6ZTsKKyAgICBjbXNVSW50MzJOdW1iZXIgVXNlZDsKKworICAgIHN0cnVjdCBfY21zU3ViQWxsb2NhdG9yX2NodW5rX3N0KiBuZXh0OworCit9IF9jbXNTdWJBbGxvY2F0b3JfY2h1bms7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgY21zQ29udGV4dCBDb250ZXh0SUQ7CisgICAgX2Ntc1N1YkFsbG9jYXRvcl9jaHVuayogaDsKKworfSBfY21zU3ViQWxsb2NhdG9yOworCisKK19jbXNTdWJBbGxvY2F0b3IqIF9jbXNDcmVhdGVTdWJBbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIEluaXRpYWwpOwordm9pZCAgICAgICAgICAgICAgX2Ntc1N1YkFsbG9jRGVzdHJveShfY21zU3ViQWxsb2NhdG9yKiBzKTsKK3ZvaWQqICAgICAgICAgICAgIF9jbXNTdWJBbGxvYyhfY21zU3ViQWxsb2NhdG9yKiBzLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSk7Cit2b2lkKiAgICAgICAgICAgICBfY21zU3ViQWxsb2NEdXAoX2Ntc1N1YkFsbG9jYXRvciogcywgY29uc3Qgdm9pZCAqcHRyLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhlIGNvbnRleHQgY2xpZW50cy4gCit0eXBlZGVmIGVudW0geworCisgICAgVXNlclB0ciwgICAgICAgICAgICAvLyBVc2VyLWRlZmluZWQgcG9pbnRlcgorICAgIExvZ2dlciwKKyAgICBBbGFybUNvZGVzQ29udGV4dCwKKyAgICBBZGFwdGF0aW9uU3RhdGVDb250ZXh0LCAKKyAgICBNZW1QbHVnaW4sCisgICAgSW50ZXJwUGx1Z2luLAorICAgIEN1cnZlc1BsdWdpbiwKKyAgICBGb3JtYXR0ZXJzUGx1Z2luLAorICAgIFRhZ1R5cGVQbHVnaW4sCisgICAgVGFnUGx1Z2luLAorICAgIEludGVudFBsdWdpbiwKKyAgICBNUEVQbHVnaW4sCisgICAgT3B0aW1pemF0aW9uUGx1Z2luLAorICAgIFRyYW5zZm9ybVBsdWdpbiwKKyAgICBNdXRleFBsdWdpbiwKKworICAgIC8vIExhc3QgaW4gbGlzdAorICAgIE1lbW9yeUNsaWVudE1heAorCit9IF9jbXNNZW1vcnlDbGllbnQ7CisKKworLy8gQ29udGFpbmVyIGZvciBtZW1vcnkgbWFuYWdlbWVudCBwbHVnLWluLgordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgX2Ntc01hbGxvY0ZuUHRyVHlwZSAgICAgTWFsbG9jUHRyOyAgICAKKyAgICBfY21zTWFsbG9aZXJvY0ZuUHRyVHlwZSBNYWxsb2NaZXJvUHRyOworICAgIF9jbXNGcmVlRm5QdHJUeXBlICAgICAgIEZyZWVQdHI7CisgICAgX2Ntc1JlYWxsb2NGblB0clR5cGUgICAgUmVhbGxvY1B0cjsKKyAgICBfY21zQ2FsbG9jRm5QdHJUeXBlICAgICBDYWxsb2NQdHI7CisgICAgX2Ntc0R1cEZuUHRyVHlwZSAgICAgICAgRHVwUHRyOworCit9IF9jbXNNZW1QbHVnaW5DaHVua1R5cGU7CisKKy8vIENvcHkgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb24gcG9pbnRlcnMgZnJvbSBwbHVnLWluIHRvIGNodW5rLCB0YWtpbmcgY2FyZSBvZiBtaXNzaW5nIHJvdXRpbmVzCit2b2lkICBfY21zSW5zdGFsbEFsbG9jRnVuY3Rpb25zKGNtc1BsdWdpbk1lbUhhbmRsZXIqIFBsdWdpbiwgX2Ntc01lbVBsdWdpbkNodW5rVHlwZSogcHRyKTsKKworLy8gSW50ZXJuYWwgc3RydWN0dXJlIGZvciBjb250ZXh0CitzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0IHsKKyAgICAKKyAgICBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBOZXh0OyAgLy8gUG9pbnRzIHRvIG5leHQgY29udGV4dCBpbiB0aGUgbmV3IHN0eWxlCisgICAgX2Ntc1N1YkFsbG9jYXRvciogTWVtUG9vbDsgICAgICAgIC8vIFRoZSBtZW1vcnkgcG9vbCB0aGF0IHN0b3JlcyBjb250ZXh0IGRhdGEKKyAgICAKKyAgICB2b2lkKiBjaHVua3NbTWVtb3J5Q2xpZW50TWF4XTsgICAgLy8gYXJyYXkgb2YgcG9pbnRlcnMgdG8gY2xpZW50IGNodW5rcy4gTWVtb3J5IGl0c2VsZiBpcyBob2xkIGluIHRoZSBzdWJhbGxvY2F0b3IuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBOVUxMLCB0aGVuIGl0IHJldmVydHMgdG8gZ2xvYmFsIENvbnRleHQwCisKKyAgICBfY21zTWVtUGx1Z2luQ2h1bmtUeXBlIERlZmF1bHRNZW1vcnlNYW5hZ2VyOyAgLy8gVGhlIGFsbG9jYXRvcnMgdXNlZCBmb3IgY3JlYXRpbmcgdGhlIGNvbnRleHQgaXRzZWxmLiBDYW5ub3QgYmUgb3ZlcnJpZGVuCit9OworCisvLyBSZXR1cm5zIGEgcG9pbnRlciB0byBhIHZhbGlkIGNvbnRleHQgc3RydWN0dXJlLCBpbmNsdWRpbmcgdGhlIGdsb2JhbCBvbmUgaWYgaWQgaXMgemVyby4gCisvLyBWZXJpZmllcyB0aGUgbWFnaWMgbnVtYmVyLgorc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogX2Ntc0dldENvbnRleHQoY21zQ29udGV4dCBDb250ZXh0SUQpOworCisvLyBSZXR1cm5zIHRoZSBibG9jayBhc3NpZ25lZCB0byB0aGUgc3BlY2lmaWMgem9uZS4gCit2b2lkKiAgICAgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhjbXNDb250ZXh0IGlkLCBfY21zTWVtb3J5Q2xpZW50IG1jKTsKKworCisvLyBDaHVua3Mgb2YgY29udGV4dCBtZW1vcnkgYnkgcGx1Zy1pbiBjbGllbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBUaG9zZSBzdHJ1Y3R1cmVzIGVuY2Fwc3VsYXRlcyBhbGwgdmFyaWFibGVzIG5lZWRlZCBieSB0aGUgc2V2ZXJhbCBjb250ZXh0IGNsaWVudHMgKG1vc3RseSBwbHVnLWlucykKKworLy8gQ29udGFpbmVyIGZvciBlcnJvciBsb2dnZXIgLS0gbm90IGEgcGx1Zy1pbgordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgY21zTG9nRXJyb3JIYW5kbGVyRnVuY3Rpb24gTG9nRXJyb3JIYW5kbGVyOyAgLy8gU2V0IHRvIE5VTEwgZm9yIENvbnRleHQwIGZhbGxiYWNrCisKK30gX2Ntc0xvZ0Vycm9yQ2h1bmtUeXBlOworCisvLyBUaGUgZ2xvYmFsIENvbnRleHQwIHN0b3JhZ2UgZm9yIGVycm9yIGxvZ2dlcgorZXh0ZXJuICBfY21zTG9nRXJyb3JDaHVua1R5cGUgIF9jbXNMb2dFcnJvckNodW5rOworCisvLyBBbGxvY2F0ZSBhbmQgaW5pdCBlcnJvciBsb2dnZXIgY29udGFpbmVyLiAKK3ZvaWQgX2Ntc0FsbG9jTG9nRXJyb3JDaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7CisKKy8vIENvbnRhaW5lciBmb3IgYWxhcm0gY29kZXMgLS0gbm90IGEgcGx1Zy1pbgordHlwZWRlZiBzdHJ1Y3QgeworICAgCisgICAgY21zVUludDE2TnVtYmVyIEFsYXJtQ29kZXNbY21zTUFYQ0hBTk5FTFNdOworCit9IF9jbXNBbGFybUNvZGVzQ2h1bmtUeXBlOworCisvLyBUaGUgZ2xvYmFsIENvbnRleHQwIHN0b3JhZ2UgZm9yIGFsYXJtIGNvZGVzCitleHRlcm4gIF9jbXNBbGFybUNvZGVzQ2h1bmtUeXBlIF9jbXNBbGFybUNvZGVzQ2h1bms7CisKKy8vIEFsbG9jYXRlIGFuZCBpbml0IGFsYXJtIGNvZGVzIGNvbnRhaW5lci4gCit2b2lkIF9jbXNBbGxvY0FsYXJtQ29kZXNDaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7CisKKy8vIENvbnRhaW5lciBmb3IgYWRhcHRhdGlvbiBzdGF0ZSAtLSBub3QgYSBwbHVnLWluCit0eXBlZGVmIHN0cnVjdCB7CisgICAgCisgICAgY21zRmxvYXQ2NE51bWJlciAgQWRhcHRhdGlvblN0YXRlOworCit9IF9jbXNBZGFwdGF0aW9uU3RhdGVDaHVua1R5cGU7CisKKy8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgYWRhcHRhdGlvbiBzdGF0ZQorZXh0ZXJuICBfY21zQWRhcHRhdGlvblN0YXRlQ2h1bmtUeXBlICAgIF9jbXNBZGFwdGF0aW9uU3RhdGVDaHVuazsKKworLy8gQWxsb2NhdGUgYW5kIGluaXQgYWRhcHRhdGlvbiBzdGF0ZSBjb250YWluZXIuCit2b2lkIF9jbXNBbGxvY0FkYXB0YXRpb25TdGF0ZUNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7CisKKworLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciBtZW1vcnkgbWFuYWdlbWVudAorZXh0ZXJuICBfY21zTWVtUGx1Z2luQ2h1bmtUeXBlIF9jbXNNZW1QbHVnaW5DaHVuazsKKworLy8gQWxsb2NhdGUgYW5kIGluaXQgbWVtb3J5IG1hbmFnZW1lbnQgY29udGFpbmVyLgordm9pZCBfY21zQWxsb2NNZW1QbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOworCisvLyBDb250YWluZXIgZm9yIGludGVycG9sYXRpb24gcGx1Zy1pbgordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgY21zSW50ZXJwRm5GYWN0b3J5IEludGVycG9sYXRvcnM7CisKK30gX2Ntc0ludGVycFBsdWdpbkNodW5rVHlwZTsKKworLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciBpbnRlcnBvbGF0aW9uIHBsdWctaW4KK2V4dGVybiAgX2Ntc0ludGVycFBsdWdpbkNodW5rVHlwZSBfY21zSW50ZXJwUGx1Z2luQ2h1bms7CisKKy8vIEFsbG9jYXRlIGFuZCBpbml0IGludGVycG9sYXRpb24gY29udGFpbmVyLgordm9pZCBfY21zQWxsb2NJbnRlcnBQbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOworCisvLyBDb250YWluZXIgZm9yIHBhcmFtZXRyaWMgY3VydmVzIHBsdWctaW4KK3R5cGVkZWYgc3RydWN0IHsKKworICAgIHN0cnVjdCBfY21zUGFyYW1ldHJpY0N1cnZlc0NvbGxlY3Rpb25fc3QqIFBhcmFtZXRyaWNDdXJ2ZXM7CisKK30gX2Ntc0N1cnZlc1BsdWdpbkNodW5rVHlwZTsKKworLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciB0b25lIGN1cnZlcyBwbHVnLWluCitleHRlcm4gIF9jbXNDdXJ2ZXNQbHVnaW5DaHVua1R5cGUgX2Ntc0N1cnZlc1BsdWdpbkNodW5rOworCisvLyBBbGxvY2F0ZSBhbmQgaW5pdCBwYXJhbWV0cmljIGN1cnZlcyBjb250YWluZXIuCit2b2lkIF9jbXNBbGxvY0N1cnZlc1BsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOworCisvLyBDb250YWluZXIgZm9yIGZvcm1hdHRlcnMgcGx1Zy1pbgordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgc3RydWN0IF9jbXNfZm9ybWF0dGVyc19mYWN0b3J5X2xpc3QqIEZhY3RvcnlMaXN0OworCit9IF9jbXNGb3JtYXR0ZXJzUGx1Z2luQ2h1bmtUeXBlOworCisvLyBUaGUgZ2xvYmFsIENvbnRleHQwIHN0b3JhZ2UgZm9yIGZvcm1hdHRlcnMgcGx1Zy1pbgorZXh0ZXJuICBfY21zRm9ybWF0dGVyc1BsdWdpbkNodW5rVHlwZSBfY21zRm9ybWF0dGVyc1BsdWdpbkNodW5rOworCisvLyBBbGxvY2F0ZSBhbmQgaW5pdCBmb3JtYXR0ZXJzIGNvbnRhaW5lci4KK3ZvaWQgX2Ntc0FsbG9jRm9ybWF0dGVyc1BsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsKKworLy8gVGhpcyBjaHVuayB0eXBlIGlzIHNoYXJlZCBieSBUYWdUeXBlIHBsdWctaW4gYW5kIE1QRSBQbHVnLWluCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICBzdHJ1Y3QgX2Ntc1RhZ1R5cGVMaW5rZWRMaXN0X3N0KiBUYWdUeXBlczsKKworfSBfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZTsKKworCisvLyBUaGUgZ2xvYmFsIENvbnRleHQwIHN0b3JhZ2UgZm9yIHRhZyB0eXBlcyBwbHVnLWluCitleHRlcm4gIF9jbXNUYWdUeXBlUGx1Z2luQ2h1bmtUeXBlICAgICAgX2Ntc1RhZ1R5cGVQbHVnaW5DaHVuazsKKworCisvLyBUaGUgZ2xvYmFsIENvbnRleHQwIHN0b3JhZ2UgZm9yIG11bHQgcHJvY2VzcyBlbGVtZW50cyBwbHVnLWluCitleHRlcm4gIF9jbXNUYWdUeXBlUGx1Z2luQ2h1bmtUeXBlICAgICAgX2Ntc01QRVR5cGVQbHVnaW5DaHVuazsKKworLy8gQWxsb2NhdGUgYW5kIGluaXQgVGFnIHR5cGVzIGNvbnRhaW5lci4KK3ZvaWQgX2Ntc0FsbG9jVGFnVHlwZVBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7CisvLyBBbGxvY2F0ZSBhbmQgaW5pdCBNUEUgY29udGFpbmVyLgordm9pZCBfY21zQWxsb2NNUEVUeXBlUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsKKy8vIENvbnRhaW5lciBmb3IgdGFnIHBsdWctaW4KK3R5cGVkZWYgc3RydWN0IHsKKyAgIAorICAgIHN0cnVjdCBfY21zVGFnTGlua2VkTGlzdF9zdCogVGFnOworCit9IF9jbXNUYWdQbHVnaW5DaHVua1R5cGU7CisKKworLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciB0YWcgcGx1Zy1pbgorZXh0ZXJuICBfY21zVGFnUGx1Z2luQ2h1bmtUeXBlIF9jbXNUYWdQbHVnaW5DaHVuazsKKworLy8gQWxsb2NhdGUgYW5kIGluaXQgVGFnIGNvbnRhaW5lci4KK3ZvaWQgX2Ntc0FsbG9jVGFnUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7IAorCisvLyBDb250YWluZXIgZm9yIGludGVudHMgcGx1Zy1pbgordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgc3RydWN0IF9jbXNfaW50ZW50c19saXN0KiBJbnRlbnRzOworCit9IF9jbXNJbnRlbnRzUGx1Z2luQ2h1bmtUeXBlOworCisKKy8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgaW50ZW50cyBwbHVnLWluCitleHRlcm4gIF9jbXNJbnRlbnRzUGx1Z2luQ2h1bmtUeXBlIF9jbXNJbnRlbnRzUGx1Z2luQ2h1bms7CisKKy8vIEFsbG9jYXRlIGFuZCBpbml0IGludGVudHMgY29udGFpbmVyLgordm9pZCBfY21zQWxsb2NJbnRlbnRzUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsgCisKKy8vIENvbnRhaW5lciBmb3Igb3B0aW1pemF0aW9uIHBsdWctaW4KK3R5cGVkZWYgc3RydWN0IHsKKworICAgIHN0cnVjdCBfY21zT3B0aW1pemF0aW9uQ29sbGVjdGlvbl9zdCogT3B0aW1pemF0aW9uQ29sbGVjdGlvbjsKKworfSBfY21zT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmtUeXBlOworCisKKy8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3Igb3B0aW1pemVycyBwbHVnLWluCitleHRlcm4gIF9jbXNPcHRpbWl6YXRpb25QbHVnaW5DaHVua1R5cGUgX2Ntc09wdGltaXphdGlvblBsdWdpbkNodW5rOworCisvLyBBbGxvY2F0ZSBhbmQgaW5pdCBvcHRpbWl6ZXJzIGNvbnRhaW5lci4KK3ZvaWQgX2Ntc0FsbG9jT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsKKworLy8gQ29udGFpbmVyIGZvciB0cmFuc2Zvcm0gcGx1Zy1pbgordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgc3RydWN0IF9jbXNUcmFuc2Zvcm1Db2xsZWN0aW9uX3N0KiBUcmFuc2Zvcm1Db2xsZWN0aW9uOworCit9IF9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVua1R5cGU7CisKKy8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgZnVsbC10cmFuc2Zvcm0gcmVwbGFjZW1lbnQgcGx1Zy1pbgorZXh0ZXJuICBfY21zVHJhbnNmb3JtUGx1Z2luQ2h1bmtUeXBlIF9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVuazsKKworLy8gQWxsb2NhdGUgYW5kIGluaXQgdHJhbnNmb3JtIGNvbnRhaW5lci4KK3ZvaWQgX2Ntc0FsbG9jVHJhbnNmb3JtUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOworCisvLyBDb250YWluZXIgZm9yIG11dGV4IHBsdWctaW4KK3R5cGVkZWYgc3RydWN0IHsKKworICAgIF9jbXNDcmVhdGVNdXRleEZuUHRyVHlwZSAgQ3JlYXRlTXV0ZXhQdHI7CisgICAgX2Ntc0Rlc3Ryb3lNdXRleEZuUHRyVHlwZSBEZXN0cm95TXV0ZXhQdHI7CisgICAgX2Ntc0xvY2tNdXRleEZuUHRyVHlwZSAgICBMb2NrTXV0ZXhQdHI7CisgICAgX2Ntc1VubG9ja011dGV4Rm5QdHJUeXBlICBVbmxvY2tNdXRleFB0cjsKKworfSBfY21zTXV0ZXhQbHVnaW5DaHVua1R5cGU7CisKKy8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgbXV0ZXggcGx1Zy1pbgorZXh0ZXJuICBfY21zTXV0ZXhQbHVnaW5DaHVua1R5cGUgX2Ntc011dGV4UGx1Z2luQ2h1bms7CisKKy8vIEFsbG9jYXRlIGFuZCBpbml0IG11dGV4IGNvbnRhaW5lci4KK3ZvaWQgX2Ntc0FsbG9jTXV0ZXhQbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1MVSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbgordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgY21zVUludDE2TnVtYmVyIExhbmd1YWdlOworICAgIGNtc1VJbnQxNk51bWJlciBDb3VudHJ5OworCisgICAgY21zVUludDMyTnVtYmVyIFN0clc7ICAgICAgIC8vIE9mZnNldCB0byBjdXJyZW50IHVuaWNvZGUgc3RyaW5nCisgICAgY21zVUludDMyTnVtYmVyIExlbjsgICAgICAgIC8vIExlbmd0aCBpbiBieXRlcworCit9IF9jbXNNTFVlbnRyeTsKKworc3RydWN0IF9jbXNfTUxVX3N0cnVjdCB7CisKKyAgICBjbXNDb250ZXh0IENvbnRleHRJRDsKKworICAgIC8vIFRoZSBkaXJlY3RvcnkKKyAgICBjbXNVSW50MzJOdW1iZXIgIEFsbG9jYXRlZEVudHJpZXM7CisgICAgY21zVUludDMyTnVtYmVyICBVc2VkRW50cmllczsKKyAgICBfY21zTUxVZW50cnkqIEVudHJpZXM7ICAgICAvLyBBcnJheSBvZiBwb2ludGVycyB0byBzdHJpbmdzIGFsbG9jYXRlZCBpbiBNZW1Qb29sCisKKyAgICAvLyBUaGUgUG9vbAorICAgIGNtc1VJbnQzMk51bWJlciBQb29sU2l6ZTsgIC8vIFRoZSBtYXhpbXVtIGFsbG9jYXRlZCBzaXplCisgICAgY21zVUludDMyTnVtYmVyIFBvb2xVc2VkOyAgLy8gVGhlIHVzZWQgc2l6ZQorICAgIHZvaWQqICBNZW1Qb29sOyAgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gYmVnaW4gb2YgbWVtb3J5IHBvb2wKK307CisKKy8vIE5hbWVkIGNvbG9yIGxpc3QgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24KK3R5cGVkZWYgc3RydWN0IHsKKworICAgIGNoYXIgTmFtZVtjbXNNQVhfUEFUSF07CisgICAgY21zVUludDE2TnVtYmVyIFBDU1szXTsKKyAgICBjbXNVSW50MTZOdW1iZXIgRGV2aWNlQ29sb3JhbnRbY21zTUFYQ0hBTk5FTFNdOworCit9IF9jbXNOQU1FRENPTE9SOworCitzdHJ1Y3QgX2Ntc19OQU1FRENPTE9STElTVF9zdHJ1Y3QgeworCisgICAgY21zVUludDMyTnVtYmVyIG5Db2xvcnM7CisgICAgY21zVUludDMyTnVtYmVyIEFsbG9jYXRlZDsKKyAgICBjbXNVSW50MzJOdW1iZXIgQ29sb3JhbnRDb3VudDsKKworICAgIGNoYXIgUHJlZml4WzMzXTsgICAgICAvLyBQcmVmaXggYW5kIHN1ZmZpeCBhcmUgZGVmaW5lZCB0byBiZSAzMiBjaGFyYWN0ZXJzIGF0IG1vc3QKKyAgICBjaGFyIFN1ZmZpeFszM107CisKKyAgICBfY21zTkFNRURDT0xPUiogTGlzdDsKKworICAgIGNtc0NvbnRleHQgQ29udGV4dElEOworfTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoaXMgaXMgdGhlIGludGVybmFsIHN0cnVjdCBob2xkaW5nIHByb2ZpbGUgZGV0YWlscy4KKworLy8gTWF4aW11bSBzdXBwb3J0ZWQgdGFncyBpbiBhIHByb2ZpbGUKKyNkZWZpbmUgTUFYX1RBQkxFX1RBRyAgICAgICAxMDAKKwordHlwZWRlZiBzdHJ1Y3QgX2Ntc19pY2Nwcm9maWxlX3N0cnVjdCB7CisKKyAgICAvLyBJL08gaGFuZGxlcgorICAgIGNtc0lPSEFORExFUiogICAgICAgICAgICBJT2hhbmRsZXI7CisKKyAgICAvLyBUaGUgdGhyZWFkIElECisgICAgY21zQ29udGV4dCAgICAgICAgICAgICAgIENvbnRleHRJRDsKKworICAgIC8vIENyZWF0aW9uIHRpbWUKKyAgICBzdHJ1Y3QgdG0gICAgICAgICAgICAgICAgQ3JlYXRlZDsKKworICAgIC8vIE9ubHkgbW9zdCBpbXBvcnRhbnQgaXRlbXMgZm91bmQgaW4gSUNDIHByb2ZpbGVzCisgICAgY21zVUludDMyTnVtYmVyICAgICAgICAgIFZlcnNpb247CisgICAgY21zUHJvZmlsZUNsYXNzU2lnbmF0dXJlIERldmljZUNsYXNzOworICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgICBDb2xvclNwYWNlOworICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgICBQQ1M7CisgICAgY21zVUludDMyTnVtYmVyICAgICAgICAgIFJlbmRlcmluZ0ludGVudDsKKworICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgICBmbGFnczsKKyAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgICAgbWFudWZhY3R1cmVyLCBtb2RlbDsKKyAgICBjbXNVSW50NjROdW1iZXIgICAgICAgICAgYXR0cmlidXRlczsKKyAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgICAgY3JlYXRvcjsKKworICAgIGNtc1Byb2ZpbGVJRCAgICAgICAgICAgICBQcm9maWxlSUQ7CisKKyAgICAvLyBEaWN0aW9uYXJ5CisgICAgY21zVUludDMyTnVtYmVyICAgICAgICAgIFRhZ0NvdW50OworICAgIGNtc1RhZ1NpZ25hdHVyZSAgICAgICAgICBUYWdOYW1lc1tNQVhfVEFCTEVfVEFHXTsKKyAgICBjbXNUYWdTaWduYXR1cmUgICAgICAgICAgVGFnTGlua2VkW01BWF9UQUJMRV9UQUddOyAgICAgICAgICAgLy8gVGhlIHRhZyB0byB3aGljaCBpcyBsaW5rZWQgKDA9bm9uZSkKKyAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgICAgVGFnU2l6ZXNbTUFYX1RBQkxFX1RBR107ICAgICAgICAgICAgLy8gU2l6ZSBvbiBkaXNrCisgICAgY21zVUludDMyTnVtYmVyICAgICAgICAgIFRhZ09mZnNldHNbTUFYX1RBQkxFX1RBR107CisgICAgY21zQm9vbCAgICAgICAgICAgICAgICAgIFRhZ1NhdmVBc1Jhd1tNQVhfVEFCTEVfVEFHXTsgICAgICAgIC8vIFRydWUgdG8gd3JpdGUgdW5jb29rZWQKKyAgICB2b2lkICogICAgICAgICAgICAgICAgICAgVGFnUHRyc1tNQVhfVEFCTEVfVEFHXTsKKyAgICBjbXNUYWdUeXBlSGFuZGxlciogICAgICAgVGFnVHlwZUhhbmRsZXJzW01BWF9UQUJMRV9UQUddOyAgICAgLy8gU2FtZSBzdHJ1Y3R1cmUgbWF5IGJlIHNlcmlhbGl6ZWQgb24gZGlmZmVyZW50IHR5cGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcGVuZGluZyBvbiBwcm9maWxlIHZlcnNpb24sIHNvIHdlIGtlZXAgdHJhY2sgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUgaGFuZGxlciBmb3IgZWFjaCB0YWcgaW4gdGhlIGxpc3QuCisgICAgLy8gU3BlY2lhbAorICAgIGNtc0Jvb2wgICAgICAgICAgICAgICAgICBJc1dyaXRlOworCisgICAgLy8gS2VlcCBhIG11dGV4IGZvciBjbXNSZWFkVGFnIC0tIE5vdGUgdGhhdCB0aGlzIG9ubHkgd29ya3MgaWYgdGhlIHVzZXIgaW5jbHVkZXMgYSBtdXRleCBwbHVnaW4KKyAgICB2b2lkICogICAgICAgICAgICAgICAgICAgVXNyTXV0ZXg7CisKK30gX2Ntc0lDQ1BST0ZJTEU7CisKKy8vIElPIGhlbHBlcnMgZm9yIHByb2ZpbGVzCitjbXNCb29sICAgICAgICAgICAgICBfY21zUmVhZEhlYWRlcihfY21zSUNDUFJPRklMRSogSWNjKTsKK2Ntc0Jvb2wgICAgICAgICAgICAgIF9jbXNXcml0ZUhlYWRlcihfY21zSUNDUFJPRklMRSogSWNjLCBjbXNVSW50MzJOdW1iZXIgVXNlZFNwYWNlKTsKK2ludCAgICAgICAgICAgICAgICAgIF9jbXNTZWFyY2hUYWcoX2Ntc0lDQ1BST0ZJTEUqIEljYywgY21zVGFnU2lnbmF0dXJlIHNpZywgY21zQm9vbCBsRm9sbG93TGlua3MpOworCisvLyBUYWcgdHlwZXMKK2Ntc1RhZ1R5cGVIYW5kbGVyKiAgIF9jbXNHZXRUYWdUeXBlSGFuZGxlcihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVGFnVHlwZVNpZ25hdHVyZSBzaWcpOworY21zVGFnVHlwZVNpZ25hdHVyZSAgX2Ntc0dldFRhZ1RydWVUeXBlKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNUYWdTaWduYXR1cmUgc2lnKTsKK2Ntc1RhZ0Rlc2NyaXB0b3IqICAgIF9jbXNHZXRUYWdEZXNjcmlwdG9yKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNUYWdTaWduYXR1cmUgc2lnKTsKKworLy8gRXJyb3IgbG9nZ2luZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCAgICAgICAgICAgICAgICAgX2Ntc1RhZ1NpZ25hdHVyZTJTdHJpbmcoY2hhciBTdHJpbmdbNV0sIGNtc1RhZ1NpZ25hdHVyZSBzaWcpOworCisvLyBJbnRlcnBvbGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbXNJbnRlcnBQYXJhbXMqICAgICBfY21zQ29tcHV0ZUludGVycFBhcmFtcyhjbXNDb250ZXh0IENvbnRleHRJRCwgaW50IG5TYW1wbGVzLCBpbnQgSW5wdXRDaGFuLCBpbnQgT3V0cHV0Q2hhbiwgY29uc3Qgdm9pZCogVGFibGUsIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKTsKK2Ntc0ludGVycFBhcmFtcyogICAgIF9jbXNDb21wdXRlSW50ZXJwUGFyYW1zRXgoY21zQ29udGV4dCBDb250ZXh0SUQsIGNvbnN0IGNtc1VJbnQzMk51bWJlciBuU2FtcGxlc1tdLCBpbnQgSW5wdXRDaGFuLCBpbnQgT3V0cHV0Q2hhbiwgY29uc3Qgdm9pZCogVGFibGUsIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKTsKK3ZvaWQgICAgICAgICAgICAgICAgIF9jbXNGcmVlSW50ZXJwUGFyYW1zKGNtc0ludGVycFBhcmFtcyogcCk7CitjbXNCb29sICAgICAgICAgICAgICBfY21zU2V0SW50ZXJwb2xhdGlvblJvdXRpbmUoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc0ludGVycFBhcmFtcyogcCk7CisKKy8vIEN1cnZlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRoaXMgc3RydWN0IGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IGEgc2VnbWVudCwgcGx1cyBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyB0aGUgZXZhbHVhdGlvbi4KKy8vIEluIHRoZSBjYXNlIG9mIHRhYmxlLWJhc2VkLCBFdmFsIHBvaW50ZXIgaXMgc2V0IHRvIE5VTEwKKworLy8gVGhlIGdhbW1hIGZ1bmN0aW9uIG1haW4gc3RydWN0dXJlCitzdHJ1Y3QgX2Ntc19jdXJ2ZV9zdHJ1Y3QgeworCisgICAgY21zSW50ZXJwUGFyYW1zKiAgSW50ZXJwUGFyYW1zOyAgLy8gUHJpdmF0ZSBvcHRpbWl6YXRpb25zIGZvciBpbnRlcnBvbGF0aW9uCisKKyAgICBjbXNVSW50MzJOdW1iZXIgICBuU2VnbWVudHM7ICAgICAvLyBOdW1iZXIgb2Ygc2VnbWVudHMgaW4gdGhlIGN1cnZlLiBaZXJvIGZvciBhIDE2LWJpdCBiYXNlZCB0YWJsZXMKKyAgICBjbXNDdXJ2ZVNlZ21lbnQqICBTZWdtZW50czsgICAgICAvLyBUaGUgc2VnbWVudHMKKyAgICBjbXNJbnRlcnBQYXJhbXMqKiBTZWdJbnRlcnA7ICAgICAvLyBBcnJheSBvZiBwcml2YXRlIG9wdGltaXphdGlvbnMgZm9yIGludGVycG9sYXRpb24gaW4gdGFibGUtYmFzZWQgc2VnbWVudHMKKworICAgIGNtc1BhcmFtZXRyaWNDdXJ2ZUV2YWx1YXRvciogRXZhbHM7ICAvLyBFdmFsdWF0b3JzIChvbmUgcGVyIHNlZ21lbnQpCisKKyAgICAvLyAxNiBiaXQgVGFibGUtYmFzZWQgcmVwcmVzZW50YXRpb24gZm9sbG93cworICAgIGNtc1VJbnQzMk51bWJlciAgICBuRW50cmllczsgICAgICAvLyBOdW1iZXIgb2YgdGFibGUgZWxlbWVudHMKKyAgICBjbXNVSW50MTZOdW1iZXIqICAgVGFibGUxNjsgICAgICAgLy8gVGhlIHRhYmxlIGl0c2VsZi4KK307CisKKworLy8gIFBpcGVsaW5lcyAmIFN0YWdlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQSBzaW5nbGUgc3RhZ2UKK3N0cnVjdCBfY21zU3RhZ2Vfc3RydWN0IHsKKworICAgIGNtc0NvbnRleHQgICAgICAgICAgQ29udGV4dElEOworCisgICAgY21zU3RhZ2VTaWduYXR1cmUgICBUeXBlOyAgICAgICAgICAgLy8gSWRlbnRpZmllcyB0aGUgc3RhZ2UKKyAgICBjbXNTdGFnZVNpZ25hdHVyZSAgIEltcGxlbWVudHM7ICAgICAvLyBJZGVudGlmaWVzIHRoZSAqZnVuY3Rpb24qIG9mIHRoZSBzdGFnZSAoZm9yIG9wdGltaXphdGlvbnMpCisKKyAgICBjbXNVSW50MzJOdW1iZXIgICAgIElucHV0Q2hhbm5lbHM7ICAvLyBJbnB1dCBjaGFubmVscyAtLSBmb3Igb3B0aW1pemF0aW9uIHB1cnBvc2VzCisgICAgY21zVUludDMyTnVtYmVyICAgICBPdXRwdXRDaGFubmVsczsgLy8gT3V0cHV0IGNoYW5uZWxzIC0tIGZvciBvcHRpbWl6YXRpb24gcHVycG9zZXMKKworICAgIF9jbXNTdGFnZUV2YWxGbiAgICAgRXZhbFB0cjsgICAgICAgIC8vIFBvaW50cyB0byBmbiB0aGF0IGV2YWx1YXRlcyB0aGUgc3RhZ2UgKGFsd2F5cyBpbiBmbG9hdGluZyBwb2ludCkKKyAgICBfY21zU3RhZ2VEdXBFbGVtRm4gIER1cEVsZW1QdHI7ICAgICAvLyBQb2ludHMgdG8gYSBmbiB0aGF0IGR1cGxpY2F0ZXMgdGhlICpkYXRhKiBvZiB0aGUgc3RhZ2UKKyAgICBfY21zU3RhZ2VGcmVlRWxlbUZuIEZyZWVQdHI7ICAgICAgICAvLyBQb2ludHMgdG8gYSBmbiB0aGF0IHNldHMgdGhlICpkYXRhKiBvZiB0aGUgc3RhZ2UgZnJlZQorCisgICAgLy8gQSBnZW5lcmljIHBvaW50ZXIgdG8gd2hhdGV2ZXIgbWVtb3J5IG5lZWRlZCBieSB0aGUgc3RhZ2UKKyAgICB2b2lkKiAgICAgICAgICAgICAgIERhdGE7CisKKyAgICAvLyBNYWludGFpbnMgbGlua2VkIGxpc3QgKHVzZWQgaW50ZXJuYWxseSkKKyAgICBzdHJ1Y3QgX2Ntc1N0YWdlX3N0cnVjdCogTmV4dDsKK307CisKKworLy8gU3BlY2lhbCBTdGFnZXMgKGNhbm5vdCBiZSBzYXZlZCkKK2Ntc1N0YWdlKiAgICAgICAgX2Ntc1N0YWdlQWxsb2NMYWIyWFlaKGNtc0NvbnRleHQgQ29udGV4dElEKTsKK2Ntc1N0YWdlKiAgICAgICAgX2Ntc1N0YWdlQWxsb2NYWVoyTGFiKGNtc0NvbnRleHQgQ29udGV4dElEKTsKK2Ntc1N0YWdlKiAgICAgICAgX2Ntc1N0YWdlQWxsb2NMYWJQcmVsaW4oY21zQ29udGV4dCBDb250ZXh0SUQpOworY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VBbGxvY0xhYlYyVG9WNChjbXNDb250ZXh0IENvbnRleHRJRCk7CitjbXNTdGFnZSogICAgICAgIF9jbXNTdGFnZUFsbG9jTGFiVjJUb1Y0Y3VydmVzKGNtc0NvbnRleHQgQ29udGV4dElEKTsKK2Ntc1N0YWdlKiAgICAgICAgX2Ntc1N0YWdlQWxsb2NMYWJWNFRvVjIoY21zQ29udGV4dCBDb250ZXh0SUQpOworY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VBbGxvY05hbWVkQ29sb3IoY21zTkFNRURDT0xPUkxJU1QqIE5hbWVkQ29sb3JMaXN0LCBjbXNCb29sIFVzZVBDUyk7CitjbXNTdGFnZSogICAgICAgIF9jbXNTdGFnZUFsbG9jSWRlbnRpdHlDdXJ2ZXMoY21zQ29udGV4dCBDb250ZXh0SUQsIGludCBuQ2hhbm5lbHMpOworY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VBbGxvY0lkZW50aXR5Q0x1dChjbXNDb250ZXh0IENvbnRleHRJRCwgaW50IG5DaGFuKTsKK2Ntc1N0YWdlKiAgICAgICAgX2Ntc1N0YWdlTm9ybWFsaXplRnJvbUxhYkZsb2F0KGNtc0NvbnRleHQgQ29udGV4dElEKTsKK2Ntc1N0YWdlKiAgICAgICAgX2Ntc1N0YWdlTm9ybWFsaXplRnJvbVh5ekZsb2F0KGNtc0NvbnRleHQgQ29udGV4dElEKTsKK2Ntc1N0YWdlKiAgICAgICAgX2Ntc1N0YWdlTm9ybWFsaXplVG9MYWJGbG9hdChjbXNDb250ZXh0IENvbnRleHRJRCk7CitjbXNTdGFnZSogICAgICAgIF9jbXNTdGFnZU5vcm1hbGl6ZVRvWHl6RmxvYXQoY21zQ29udGV4dCBDb250ZXh0SUQpOworY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VDbGlwTmVnYXRpdmVzKGNtc0NvbnRleHQgQ29udGV4dElELCBpbnQgbkNoYW5uZWxzKTsKKworCisvLyBGb3IgY3VydmUgc2V0IG9ubHkKK2Ntc1RvbmVDdXJ2ZSoqICAgICBfY21zU3RhZ2VHZXRQdHJUb0N1cnZlU2V0KGNvbnN0IGNtc1N0YWdlKiBtcGUpOworCisKKy8vIFBpcGVsaW5lIEV2YWx1YXRvciAoaW4gZmxvYXRpbmcgcG9pbnQpCit0eXBlZGVmIHZvaWQgKCogX2Ntc1BpcGVsaW5lRXZhbEZsb2F0Rm4pKGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIgSW5bXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciBPdXRbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogRGF0YSk7CisKK3N0cnVjdCBfY21zUGlwZWxpbmVfc3RydWN0IHsKKworICAgIGNtc1N0YWdlKiBFbGVtZW50czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBvaW50cyB0byBlbGVtZW50cyBjaGFpbgorICAgIGNtc1VJbnQzMk51bWJlciBJbnB1dENoYW5uZWxzLCBPdXRwdXRDaGFubmVsczsKKworICAgIC8vIERhdGEgJiBldmFsdWF0b3JzCisgICAgdm9pZCAqRGF0YTsKKworICAgX2Ntc09QVGV2YWwxNkZuICAgICAgICAgRXZhbDE2Rm47CisgICBfY21zUGlwZWxpbmVFdmFsRmxvYXRGbiBFdmFsRmxvYXRGbjsKKyAgIF9jbXNGcmVlVXNlckRhdGFGbiAgICAgIEZyZWVEYXRhRm47CisgICBfY21zRHVwVXNlckRhdGFGbiAgICAgICBEdXBEYXRhRm47CisKKyAgICBjbXNDb250ZXh0IENvbnRleHRJRDsgICAgICAgICAgICAvLyBFbnZpcm9ubWVudAorCisgICAgY21zQm9vbCAgU2F2ZUFzOEJpdHM7ICAgICAgICAgICAgLy8gSW1wbGVtZW50YXRpb24tc3BlY2lmaWM6IHNhdmUgYXMgOCBiaXRzIGlmIHBvc3NpYmxlCit9OworCisvLyBMVVQgcmVhZGluZyAmIGNyZWF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUmVhZCB0YWdzIHVzaW5nIGxvdy1sZXZlbCBmdW5jdGlvbiwgcHJvdmlkZSBuZWNlc3NhcnkgZ2x1ZSBjb2RlIHRvIGFkYXB0IHZlcnNpb25zLCBldGMuIEFsbCB0aG9zZSByZXR1cm4gYSBicmFuZCBuZXcgY29weQorLy8gb2YgdGhlIExVVFMsIHNpbmNlIG93bmVyc2hpcCBvZiBvcmlnaW5hbCBpcyB1cCB0byB0aGUgcHJvZmlsZS4gVGhlIHVzZXIgc2hvdWxkIGZyZWUgYWxsb2NhdGVkIHJlc291cmNlcy4KKworY21zUGlwZWxpbmUqICAgICAgX2Ntc1JlYWRJbnB1dExVVChjbXNIUFJPRklMRSBoUHJvZmlsZSwgaW50IEludGVudCk7CitjbXNQaXBlbGluZSogICAgICBfY21zUmVhZE91dHB1dExVVChjbXNIUFJPRklMRSBoUHJvZmlsZSwgaW50IEludGVudCk7CitjbXNQaXBlbGluZSogICAgICBfY21zUmVhZERldmljZWxpbmtMVVQoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGludCBJbnRlbnQpOworCisvLyBTcGVjaWFsIHZhbHVlcworY21zQm9vbCAgICAgICAgICAgX2Ntc1JlYWRNZWRpYVdoaXRlUG9pbnQoY21zQ0lFWFlaKiBEZXN0LCBjbXNIUFJPRklMRSBoUHJvZmlsZSk7CitjbXNCb29sICAgICAgICAgICBfY21zUmVhZENIQUQoY21zTUFUMyogRGVzdCwgY21zSFBST0ZJTEUgaFByb2ZpbGUpOworCisvLyBQcm9maWxlIGxpbmtlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbXNQaXBlbGluZSogX2Ntc0xpbmtQcm9maWxlcyhjbXNDb250ZXh0ICAgICAgICAgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgIG5Qcm9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgICBUaGVJbnRlbnRzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSAgICAgICAgaFByb2ZpbGVzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNCb29sICAgICAgICAgICAgQlBDW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyICAgQWRhcHRhdGlvblN0YXRlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgIGR3RmxhZ3MpOworCisvLyBTZXF1ZW5jZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbXNTRVEqIF9jbXNSZWFkUHJvZmlsZVNlcXVlbmNlKGNtc0hQUk9GSUxFIGhQcm9maWxlKTsKK2Ntc0Jvb2wgX2Ntc1dyaXRlUHJvZmlsZVNlcXVlbmNlKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjb25zdCBjbXNTRVEqIHNlcSk7CitjbXNTRVEqIF9jbXNDb21waWxlUHJvZmlsZVNlcXVlbmNlKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgblByb2ZpbGVzLCBjbXNIUFJPRklMRSBoUHJvZmlsZXNbXSk7CisKKworLy8gTFVUIG9wdGltaXphdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY21zVUludDE2TnVtYmVyICBfY21zUXVhbnRpemVWYWwoY21zRmxvYXQ2NE51bWJlciBpLCBpbnQgTWF4U2FtcGxlcyk7CitpbnQgICAgICAgICAgICAgIF9jbXNSZWFzb25hYmxlR3JpZHBvaW50c0J5Q29sb3JzcGFjZShjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yc3BhY2UsIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKTsKKworY21zQm9vbCAgICAgICAgICBfY21zRW5kUG9pbnRzQnlTcGFjZShjbXNDb2xvclNwYWNlU2lnbmF0dXJlIFNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIgKipXaGl0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDE2TnVtYmVyICoqQmxhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAqbk91dHB1dHMpOworCitjbXNCb29sICAgICAgICAgIF9jbXNPcHRpbWl6ZVBpcGVsaW5lKGNtc0NvbnRleHQgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNQaXBlbGluZSoqICAgIEx1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBJbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciogSW5wdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciogT3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIqIGR3RmxhZ3MgKTsKKworCisvLyBIaSBsZXZlbCBMVVQgYnVpbGRpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbXNQaXBlbGluZSogICAgIF9jbXNDcmVhdGVHYW11dENoZWNrUGlwZWxpbmUoY21zQ29udGV4dCBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgaFByb2ZpbGVzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zQm9vbCAgQlBDW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEludGVudHNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEFkYXB0YXRpb25TdGF0ZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgbkdhbXV0UENTcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgaEdhbXV0KTsKKworCisvLyBGb3JtYXR0ZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIGNtc0ZMQUdTX0NBTl9DSEFOR0VfRk9STUFUVEVSICAgICAweDAyMDAwMDAwICAgLy8gQWxsb3cgY2hhbmdlIGJ1ZmZlciBmb3JtYXQKKworY21zQm9vbCAgICAgICAgIF9jbXNGb3JtYXR0ZXJJc0Zsb2F0KGNtc1VJbnQzMk51bWJlciBUeXBlKTsKK2Ntc0Jvb2wgICAgICAgICBfY21zRm9ybWF0dGVySXM4Yml0KGNtc1VJbnQzMk51bWJlciBUeXBlKTsKKworY21zRm9ybWF0dGVyICAgIF9jbXNHZXRGb3JtYXR0ZXIoY21zQ29udGV4dCBDb250ZXh0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgVHlwZSwgICAgICAgICAgLy8gU3BlY2lmaWMgdHlwZSwgaS5lLiBUWVBFX1JHQl84CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGb3JtYXR0ZXJEaXJlY3Rpb24gRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOworCisKKyNpZm5kZWYgQ01TX05PX0hBTEZfU1VQUE9SVCAKKworLy8gSGFsZiBmbG9hdAorY21zRmxvYXQzMk51bWJlciBfY21zSGFsZjJGbG9hdChjbXNVSW50MTZOdW1iZXIgaCk7CitjbXNVSW50MTZOdW1iZXIgIF9jbXNGbG9hdDJIYWxmKGNtc0Zsb2F0MzJOdW1iZXIgZmx0KTsKKworI2VuZGlmCisKKy8vIFRyYW5zZm9ybSBsb2dpYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RydWN0IF9jbXN0cmFuc2Zvcm1fc3RydWN0OworCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICAvLyAxLXBpeGVsIGNhY2hlICgxNiBiaXRzIG9ubHkpCisgICAgY21zVUludDE2TnVtYmVyIENhY2hlSW5bY21zTUFYQ0hBTk5FTFNdOworICAgIGNtc1VJbnQxNk51bWJlciBDYWNoZU91dFtjbXNNQVhDSEFOTkVMU107CisKK30gX2Ntc0NBQ0hFOworCisKKworLy8gVHJhbnNmb3JtYXRpb24KK3R5cGVkZWYgc3RydWN0IF9jbXN0cmFuc2Zvcm1fc3RydWN0IHsKKworICAgIGNtc1VJbnQzMk51bWJlciBJbnB1dEZvcm1hdCwgT3V0cHV0Rm9ybWF0OyAvLyBLZWVwIGZvcm1hdHMgZm9yIGZ1cnRoZXIgcmVmZXJlbmNlCisKKyAgICAvLyBQb2ludHMgdG8gdHJhbnNmb3JtIGNvZGUKKyAgICBfY21zVHJhbnNmb3JtMkZuIHhmb3JtOworCisgICAgLy8gRm9ybWF0dGVycywgY2Fubm90IGJlIGVtYmVkZGVkIGludG8gTFVUIGJlY2F1c2UgY2FjaGUKKyAgICBjbXNGb3JtYXR0ZXIxNiBGcm9tSW5wdXQ7CisgICAgY21zRm9ybWF0dGVyMTYgVG9PdXRwdXQ7CisKKyAgICBjbXNGb3JtYXR0ZXJGbG9hdCBGcm9tSW5wdXRGbG9hdDsKKyAgICBjbXNGb3JtYXR0ZXJGbG9hdCBUb091dHB1dEZsb2F0OworCisgICAgLy8gMS1waXhlbCBjYWNoZSBzZWVkIGZvciB6ZXJvIGFzIGlucHV0ICgxNiBiaXRzLCByZWFkIG9ubHkpCisgICAgX2Ntc0NBQ0hFIENhY2hlOworCisgICAgLy8gQSBQaXBlbGluZSBob2xkaW5nIHRoZSBmdWxsIChvcHRpbWl6ZWQpIHRyYW5zZm9ybQorICAgIGNtc1BpcGVsaW5lKiBMdXQ7CisKKyAgICAvLyBBIFBpcGVsaW5lIGhvbGRpbmcgdGhlIGdhbXV0IGNoZWNrLiBJdCBnb2VzIGZyb20gdGhlIGlucHV0IHNwYWNlIHRvIGJpbGV2ZWwKKyAgICBjbXNQaXBlbGluZSogR2FtdXRDaGVjazsKKworICAgIC8vIENvbG9yYW50IHRhYmxlcworICAgIGNtc05BTUVEQ09MT1JMSVNUKiBJbnB1dENvbG9yYW50OyAgICAgICAvLyBJbnB1dCBDb2xvcmFudCB0YWJsZQorICAgIGNtc05BTUVEQ09MT1JMSVNUKiBPdXRwdXRDb2xvcmFudDsgICAgICAvLyBDb2xvcmFudCB0YWJsZSAoZm9yIG4gY2hhbnMgPiBDTVlLKQorCisgICAgLy8gSW5mb3JtYXRpb25hbCBvbmx5CisgICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBFbnRyeUNvbG9yU3BhY2U7CisgICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBFeGl0Q29sb3JTcGFjZTsKKworICAgIC8vIFdoaXRlIHBvaW50cyAoaW5mb3JtYXRpdmUgb25seSkKKyAgICBjbXNDSUVYWVogRW50cnlXaGl0ZVBvaW50OworICAgIGNtc0NJRVhZWiBFeGl0V2hpdGVQb2ludDsKKworICAgIC8vIFByb2ZpbGVzIHVzZWQgdG8gY3JlYXRlIHRoZSB0cmFuc2Zvcm0KKyAgICBjbXNTRVEqIFNlcXVlbmNlOworCisgICAgY21zVUludDMyTnVtYmVyICBkd09yaWdpbmFsRmxhZ3M7CisgICAgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uU3RhdGU7CisKKyAgICAvLyBUaGUgaW50ZW50IG9mIHRoaXMgdHJhbnNmb3JtLiBUaGF0IGlzIHVzdWFsbHkgdGhlIGxhc3QgaW50ZW50IGluIHRoZSBwcm9maWxlY2hhaW4sIGJ1dCBtYXkgZGlmZmVyCisgICAgY21zVUludDMyTnVtYmVyIFJlbmRlcmluZ0ludGVudDsKKworICAgIC8vIEFuIGlkIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgcnVubmluZyBjb250ZXh0LiBNYXkgYmUgbnVsbC4KKyAgICBjbXNDb250ZXh0IENvbnRleHRJRDsKKworICAgIC8vIEEgdXNlci1kZWZpbmVkIHBvaW50ZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBzdG9yZSBkYXRhIGZvciB0cmFuc2Zvcm0gcGx1Zy1pbnMKKyAgICB2b2lkKiBVc2VyRGF0YTsKKyAgICBfY21zRnJlZVVzZXJEYXRhRm4gRnJlZVVzZXJEYXRhOworCisgICAgLy8gQSB3YXkgdG8gcHJvdmlkZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGZ1bGwgeGZvcm0gcGx1Z2lucworICAgIF9jbXNUcmFuc2Zvcm1GbiBPbGRYZm9ybTsKKworfSBfY21zVFJBTlNGT1JNOworCisvLyBDb3BpZXMgZXh0cmEgY2hhbm5lbHMgZnJvbSBpbnB1dCB0byBvdXRwdXQgaWYgdGhlIG9yaWdpbmFsIGZsYWdzIGluIHRoZSB0cmFuc2Zvcm0gc3RydWN0dXJlCisvLyBpbnN0cnVjdHMgdG8gZG8gc28uIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGFsbCBzdGFuZGFyZCB0cmFuc2Zvcm0gZnVuY3Rpb25zLgordm9pZCBfY21zSGFuZGxlRXh0cmFDaGFubmVscyhfY21zVFJBTlNGT1JNKiBwLCBjb25zdCB2b2lkKiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFBpeGVsc1BlckxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBMaW5lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1N0cmlkZSogU3RyaWRlKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY21zSFRSQU5TRk9STSBfY21zQ2hhaW4yTGFiKGNtc0NvbnRleHQgICAgICAgICAgICAgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgblByb2ZpbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgSW5wdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgICBPdXRwdXRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zVUludDMyTnVtYmVyICBJbnRlbnRzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zSFBST0ZJTEUgICAgICBoUHJvZmlsZXNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNCb29sICAgICAgICAgIEJQQ1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIgQWRhcHRhdGlvblN0YXRlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgZHdGbGFncyk7CisKKworY21zVG9uZUN1cnZlKiBfY21zQnVpbGRLVG9uZUN1cnZlKGNtc0NvbnRleHQgICAgICAgQ29udGV4dElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgblBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgIG5Qcm9maWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNVSW50MzJOdW1iZXIgIEludGVudHNbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNIUFJPRklMRSAgICAgIGhQcm9maWxlc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0Jvb2wgICAgICAgICAgQlBDW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uU3RhdGVzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgICBkd0ZsYWdzKTsKKworY21zQm9vbCAgIF9jbXNBZGFwdGF0aW9uTWF0cml4KGNtc01BVDMqIHIsIGNvbnN0IGNtc01BVDMqIENvbmVNYXRyaXgsIGNvbnN0IGNtc0NJRVhZWiogRnJvbUlsbCwgY29uc3QgY21zQ0lFWFlaKiBUb0lsbCk7CisKK2Ntc0Jvb2wgICBfY21zQnVpbGRSR0IyWFladHJhbnNmZXJNYXRyaXgoY21zTUFUMyogciwgY29uc3QgY21zQ0lFeHlZKiBXaGl0ZVBvaW50LCBjb25zdCBjbXNDSUV4eVlUUklQTEUqIFByaW1hcmllcyk7CisKKworI2RlZmluZSBfbGNtc19pbnRlcm5hbF9ICisjZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDAwLXRhZy10eXBlLWNvbmZ1c2lvbi5wYXRjaCBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDAwLXRhZy10eXBlLWNvbmZ1c2lvbi5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY5NGNiNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvMDAwMC10YWctdHlwZS1jb25mdXNpb24ucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1kaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNpbzAuYyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zaW8wLmMKLWluZGV4IDY1NDlkMTUuLjVmOWYwOGEgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2lvMC5jCi0rKysgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2lvMC5jCi1AQCAtNzE5LDcgKzcxOSw4IEBAIGNtc0Jvb2wgX2Ntc1JlYWRIZWFkZXIoX2Ntc0lDQ1BST0ZJTEUqIEljYykKLSAgICAgICAgIGZvciAoaj0wOyBqIDwgSWNjIC0+VGFnQ291bnQ7IGorKykgewotIAotICAgICAgICAgICAgIGlmICgoSWNjIC0+VGFnT2Zmc2V0c1tqXSA9PSBUYWcub2Zmc2V0KSAmJgotLSAgICAgICAgICAgICAgICAoSWNjIC0+VGFnU2l6ZXNbal0gICA9PSBUYWcuc2l6ZSkpIHsKLSsgICAgICAgICAgICAgICAgKEljYyAtPlRhZ1NpemVzW2pdICAgPT0gVGFnLnNpemUpICYmCi0rICAgICAgICAgICAgICAgIChJY2MgLT5UYWdOYW1lc1tqXSAgID09IFRhZy5zaWcpKSB7Ci0gCi0gICAgICAgICAgICAgICAgIEljYyAtPlRhZ0xpbmtlZFtJY2MgLT5UYWdDb3VudF0gPSBJY2MgLT5UYWdOYW1lc1tqXTsKLSAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvMDAwMS1mcm9tMTYtdG8tOC1vdmVyZmxvdy5wYXRjaCBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDAxLWZyb20xNi10by04LW92ZXJmbG93LnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTdiMTZkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDAxLWZyb20xNi10by04LW92ZXJmbG93LnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvbGNtczJfaW50ZXJuYWwuaCBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvbGNtczJfaW50ZXJuYWwuaAotaW5kZXggODYxN2U5Mi4uY2M3NmQ0OCAxMDA2NDQKLS0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvbGNtczJfaW50ZXJuYWwuaAotKysrIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9sY21zMl9pbnRlcm5hbC5oCi1AQCAtOTQsNyArOTQsNyBAQAotIAotIC8vIEEgZmFzdCB3YXkgdG8gY29udmVydCBmcm9tL3RvIDE2IDwtPiA4IGJpdHMKLSAjZGVmaW5lIEZST01fOF9UT18xNihyZ2IpIChjbXNVSW50MTZOdW1iZXIpICgoKChjbXNVSW50MTZOdW1iZXIpIChyZ2IpKSA8PCA4KXwocmdiKSkKLS0jZGVmaW5lIEZST01fMTZfVE9fOChyZ2IpIChjbXNVSW50OE51bWJlcikgKCgoKHJnYikgKiA2NTI4MSArIDgzODg2MDgpID4+IDI0KSAmIDB4RkYpCi0rI2RlZmluZSBGUk9NXzE2X1RPXzgocmdiKSAoY21zVUludDhOdW1iZXIpICgoKChjbXNVSW50MzJOdW1iZXIpKHJnYikgKiA2NTI4MVUgKyA4Mzg4NjA4VSkgPj4gMjQpICYgMHhGRlUpCi0gCi0gLy8gQ29kZSBhbmFseXNpcyBpcyBicm9rZW4gb24gYXNzZXJ0cwotICNpZmRlZiBfTVNDX1ZFUgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42LzAwMDItaW5maW5pdGUtbG9vcC1Hcm93TmFtZWRDb2xvckxpc3QucGF0Y2ggYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvMDAwMi1pbmZpbml0ZS1sb29wLUdyb3dOYW1lZENvbG9yTGlzdC5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMwMWE1MS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvMDAwMi1pbmZpbml0ZS1sb29wLUdyb3dOYW1lZENvbG9yTGlzdC5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc25hbWVkLmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc25hbWVkLmMKLWluZGV4IGFjZmQxYzguLmVmMWViMzAgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc25hbWVkLmMKLSsrKyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zbmFtZWQuYwotQEAgLTUxNCw4ICs1MTQsMTIgQEAgY21zTkFNRURDT0xPUkxJU1QqIENNU0VYUE9SVCBjbXNBbGxvY05hbWVkQ29sb3JMaXN0KGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW4KLSAgICAgdiAtPm5Db2xvcnMgICA9IDA7Ci0gICAgIHYgLT5Db250ZXh0SUQgID0gQ29udGV4dElEOwotIAotLSAgICB3aGlsZSAodiAtPiBBbGxvY2F0ZWQgPCBuKQotLSAgICAgICAgR3Jvd05hbWVkQ29sb3JMaXN0KHYpOwotKyAgICB3aGlsZSAodiAtPiBBbGxvY2F0ZWQgPCBuKSB7Ci0rICAgICAgICBpZiAoIUdyb3dOYW1lZENvbG9yTGlzdCh2KSkgewotKyAgICAgICAgICAgIGNtc0ZyZWVOYW1lZENvbG9yTGlzdCh2KTsKLSsgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSsgICAgICAgIH0KLSsgICAgfQotIAotICAgICBzdHJuY3B5KHYgLT5QcmVmaXgsIFByZWZpeCwgc2l6ZW9mKHYgLT5QcmVmaXgpLTEpOwotICAgICBzdHJuY3B5KHYgLT5TdWZmaXgsIFN1ZmZpeCwgc2l6ZW9mKHYgLT5TdWZmaXgpLTEpOwotQEAgLTU0NCw4ICs1NDgsMTIgQEAgY21zTkFNRURDT0xPUkxJU1QqIENNU0VYUE9SVCBjbXNEdXBOYW1lZENvbG9yTGlzdChjb25zdCBjbXNOQU1FRENPTE9STElTVCogdikKLSAgICAgaWYgKE5ld05DID09IE5VTEwpIHJldHVybiBOVUxMOwotIAotICAgICAvLyBGb3IgcmVhbGx5IGxhcmdlIHRhYmxlcyB3ZSBuZWVkIHRoaXMKLS0gICAgd2hpbGUgKE5ld05DIC0+QWxsb2NhdGVkIDwgdiAtPkFsbG9jYXRlZCkKLS0gICAgICAgIEdyb3dOYW1lZENvbG9yTGlzdChOZXdOQyk7Ci0rICAgIHdoaWxlIChOZXdOQyAtPkFsbG9jYXRlZCA8IHYgLT5BbGxvY2F0ZWQpIHsKLSsgICAgICAgIGlmICghR3Jvd05hbWVkQ29sb3JMaXN0KE5ld05DKSkgewotKyAgICAgICAgICAgIGNtc0ZyZWVOYW1lZENvbG9yTGlzdChOZXdOQyk7Ci0rICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0rICAgICAgICB9Ci0rICAgIH0KLSAKLSAgICAgbWVtbW92ZShOZXdOQyAtPlByZWZpeCwgdiAtPlByZWZpeCwgc2l6ZW9mKHYgLT5QcmVmaXgpKTsKLSAgICAgbWVtbW92ZShOZXdOQyAtPlN1ZmZpeCwgdiAtPlN1ZmZpeCwgc2l6ZW9mKHYgLT5TdWZmaXgpKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDAzLXVuaW5pdC5wYXRjaCBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDAzLXVuaW5pdC5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc2MDA3ZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvMDAwMy11bmluaXQucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1kaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN0eXBlcy5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN0eXBlcy5jCi1pbmRleCAwNjc0MmI1Li40NGM1Yjg3IDEwMDY0NAotLS0tIGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN0eXBlcy5jCi0rKysgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMKLUBAIC0yOTY0LDcgKzI5NjQsNyBAQCB2b2lkICpUeXBlX0NvbG9yYW50VGFibGVfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUgotIHsKLSAgICAgY21zVUludDMyTnVtYmVyIGksIENvdW50OwotICAgICBjbXNOQU1FRENPTE9STElTVCogTGlzdDsKLS0gICAgY2hhciBOYW1lWzM0XTsKLSsgICAgY2hhciBOYW1lWzMzXTsKLSAgICAgY21zVUludDE2TnVtYmVyIFBDU1szXTsKLSAKLSAKLUBAIC0yOTc5LDcgKzI5NzksNyBAQCB2b2lkICpUeXBlX0NvbG9yYW50VGFibGVfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUgotICAgICBmb3IgKGk9MDsgaSA8IENvdW50OyBpKyspIHsKLSAKLSAgICAgICAgIGlmIChpbyAtPlJlYWQoaW8sIE5hbWUsIDMyLCAxKSAhPSAxKSBnb3RvIEVycm9yOwotLSAgICAgICAgTmFtZVszM10gPSAwOwotKyAgICAgICAgTmFtZVszMl0gPSAwOwotIAotICAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQxNkFycmF5KGlvLCAzLCBQQ1MpKSBnb3RvIEVycm9yOwotIAotQEAgLTMxMDYsNiArMzEwNiw3IEBAIHZvaWQgKlR5cGVfTmFtZWRDb2xvcl9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpCi0gCi0gICAgICAgICBtZW1zZXQoQ29sb3JhbnQsIDAsIHNpemVvZihDb2xvcmFudCkpOwotICAgICAgICAgaWYgKGlvIC0+IFJlYWQoaW8sIFJvb3QsIDMyLCAxKSAhPSAxKSByZXR1cm4gTlVMTDsKLSsgICAgICAgIFJvb3RbMzJdID0gMDsKLSAgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZBcnJheShpbywgMywgUENTKSkgZ290byBFcnJvcjsKLSAgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZBcnJheShpbywgbkRldmljZUNvb3JkcywgQ29sb3JhbnQpKSBnb3RvIEVycm9yOwotIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42LzAwMDQtbWVtb3J5LWxlYWstVHlwZV9DdXJ2ZV9SZWFkLnBhdGNoIGIvdGhpcmRfcGFydHkvbGNtczItMi42LzAwMDQtbWVtb3J5LWxlYWstVHlwZV9DdXJ2ZV9SZWFkLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDFhMWM2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDA0LW1lbW9yeS1sZWFrLVR5cGVfQ3VydmVfUmVhZC5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMKLWluZGV4IDA2NzQyYjUuLjlmZTVlMmEgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMKLSsrKyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zdHlwZXMuYwotQEAgLTExMTIsNyArMTExMiwxMCBAQCB2b2lkICpUeXBlX0N1cnZlX1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbQotICAgICAgICAgICAgICAgIE5ld0dhbW1hID0gY21zQnVpbGRUYWJ1bGF0ZWRUb25lQ3VydmUxNihzZWxmIC0+Q29udGV4dElELCBDb3VudCwgTlVMTCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFOZXdHYW1tYSkgcmV0dXJuIE5VTEw7Ci0gCi0tICAgICAgICAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQxNkFycmF5KGlvLCBDb3VudCwgTmV3R2FtbWEgLT4gVGFibGUxNikpIHJldHVybiBOVUxMOwotKyAgICAgICAgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZBcnJheShpbywgQ291bnQsIE5ld0dhbW1hIC0+IFRhYmxlMTYpKSB7Ci0rICAgICAgICAgICAgICAgICBjbXNGcmVlVG9uZUN1cnZlKE5ld0dhbW1hKTsKLSsgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotKyAgICAgICAgICAgICAgIH0KLSAKLSAgICAgICAgICAgICAgICAqbkl0ZW1zID0gMTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTmV3R2FtbWE7Ci1AQCAtMjM1MCw3ICsyMzUzLDEwIEBAIGNtc1N0YWdlKiBSZWFkQ0xVVChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJCi0gCi0gICAgICAgICBmb3IgKGk9MDsgaSA8IERhdGEgLT5uRW50cmllczsgaSsrKSB7Ci0gCi0tICAgICAgICAgICAgaWYgKGlvIC0+UmVhZChpbywgJnYsIHNpemVvZihjbXNVSW50OE51bWJlciksIDEpICE9IDEpIHJldHVybiBOVUxMOwotKyAgICAgICAgICAgIGlmIChpbyAtPlJlYWQoaW8sICZ2LCBzaXplb2YoY21zVUludDhOdW1iZXIpLCAxKSAhPSAxKSB7Ci0rICAgICAgICAgICAgICBjbXNTdGFnZUZyZWUoQ0xVVCk7Ci0rICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSsgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgRGF0YSAtPlRhYi5UW2ldID0gRlJPTV84X1RPXzE2KHYpOwotICAgICAgICAgfQotIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42LzAwMDUtbWVtb3J5LWxlYWstQWxsb2NFbXB0eVRyYW5zZm9ybS5wYXRjaCBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDA1LW1lbW9yeS1sZWFrLUFsbG9jRW1wdHlUcmFuc2Zvcm0ucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NWE5NjguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGNtczItMi42LzAwMDUtbWVtb3J5LWxlYWstQWxsb2NFbXB0eVRyYW5zZm9ybS5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3hmb3JtLmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3hmb3JtLmMKLWluZGV4IGVkZGI5YmQuLjY0NjZkMjcgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3hmb3JtLmMKLSsrKyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zeGZvcm0uYwotQEAgLTU5Myw3ICs1OTMsMTAgQEAgX2Ntc1RSQU5TRk9STSogQWxsb2NFbXB0eVRyYW5zZm9ybShjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGlwZWxpbmUqIGx1dCwKLSAKLSAgICAgLy8gQWxsb2NhdGUgbmVlZGVkIG1lbW9yeQotICAgICBfY21zVFJBTlNGT1JNKiBwID0gKF9jbXNUUkFOU0ZPUk0qKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihfY21zVFJBTlNGT1JNKSk7Ci0tICAgIGlmICghcCkgcmV0dXJuIE5VTEw7Ci0rICAgIGlmICghcCkgewotKyAgICAgIGNtc1BpcGVsaW5lRnJlZShsdXQpOwotKyAgICAgIHJldHVybiBOVUxMOwotKyAgICB9Ci0gCi0gICAgIC8vIFN0b3JlIHRoZSBwcm9wb3NlZCBwaXBlbGluZQotICAgICBwIC0+THV0ID0gbHV0OwotQEAgLTY0Myw3ICs2NDYsNyBAQCBfY21zVFJBTlNGT1JNKiBBbGxvY0VtcHR5VHJhbnNmb3JtKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQaXBlbGluZSogbHV0LAotICAgICAgICAgaWYgKHAgLT5Gcm9tSW5wdXRGbG9hdCA9PSBOVUxMIHx8IHAgLT5Ub091dHB1dEZsb2F0ID09IE5VTEwpIHsKLSAKLSAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5zdXBwb3J0ZWQgcmFzdGVyIGZvcm1hdCIpOwotLSAgICAgICAgICAgIF9jbXNGcmVlKENvbnRleHRJRCwgcCk7Ci0rICAgICAgICAgICAgY21zRGVsZXRlVHJhbnNmb3JtKHApOwotICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgfQotIAotQEAgLTY3Myw3ICs2NzYsNyBAQCBfY21zVFJBTlNGT1JNKiBBbGxvY0VtcHR5VHJhbnNmb3JtKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQaXBlbGluZSogbHV0LAotICAgICAgICAgICAgIGlmIChwIC0+RnJvbUlucHV0ID09IE5VTEwgfHwgcCAtPlRvT3V0cHV0ID09IE5VTEwpIHsKLSAKLSAgICAgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVuc3VwcG9ydGVkIHJhc3RlciBmb3JtYXQiKTsKLS0gICAgICAgICAgICAgICAgX2Ntc0ZyZWUoQ29udGV4dElELCBwKTsKLSsgICAgICAgICAgICAgICAgY21zRGVsZXRlVHJhbnNmb3JtKHApOwotICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgICB9Ci0gCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvMDAwNi1tZW1vcnktbGVhay1UeXBlX05hbWVkQ29sb3JfUmVhZC5wYXRjaCBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDA2LW1lbW9yeS1sZWFrLVR5cGVfTmFtZWRDb2xvcl9SZWFkLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDI1ZDVhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDA2LW1lbW9yeS1sZWFrLVR5cGVfTmFtZWRDb2xvcl9SZWFkLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zdHlwZXMuYyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zdHlwZXMuYwotaW5kZXggZmViYTM4Ny4uNGQyNGZjMiAxMDA2NDQKLS0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zdHlwZXMuYwotKysrIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN0eXBlcy5jCi1AQCAtMzEwMiw3ICszMTAyLDcgQEAgdm9pZCAqVHlwZV9OYW1lZENvbG9yX1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGkKLSAKLSAgICAgaWYgKG5EZXZpY2VDb29yZHMgPiBjbXNNQVhDSEFOTkVMUykgewotICAgICAgICAgY21zU2lnbmFsRXJyb3Ioc2VsZi0+Q29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgIlRvbyBtYW55IGRldmljZSBjb29yZGluYXRlcyAnJWQnIiwgbkRldmljZUNvb3Jkcyk7Ci0tICAgICAgICByZXR1cm4gMDsKLSsgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgIH0KLSAgICAgZm9yIChpPTA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gCi1AQCAtMzExMSw3ICszMTExLDcgQEAgdm9pZCAqVHlwZV9OYW1lZENvbG9yX1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGkKLSAgICAgICAgIGNoYXIgUm9vdFszM107Ci0gCi0gICAgICAgICBtZW1zZXQoQ29sb3JhbnQsIDAsIHNpemVvZihDb2xvcmFudCkpOwotLSAgICAgICAgaWYgKGlvIC0+IFJlYWQoaW8sIFJvb3QsIDMyLCAxKSAhPSAxKSByZXR1cm4gTlVMTDsKLSsgICAgICAgIGlmIChpbyAtPiBSZWFkKGlvLCBSb290LCAzMiwgMSkgIT0gMSkgZ290byBFcnJvcjsKLSAgICAgICAgIFJvb3RbMzJdID0gMDsKLSAgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZBcnJheShpbywgMywgUENTKSkgZ290byBFcnJvcjsKLSAgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZBcnJheShpbywgbkRldmljZUNvb3JkcywgQ29sb3JhbnQpKSBnb3RvIEVycm9yOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42LzAwMDctbWVtb3J5LWxlYWstT3B0aW1pemVCeVJlc2FtcGxpbmcucGF0Y2ggYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvMDAwNy1tZW1vcnktbGVhay1PcHRpbWl6ZUJ5UmVzYW1wbGluZy5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM1NWI5NC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvMDAwNy1tZW1vcnktbGVhay1PcHRpbWl6ZUJ5UmVzYW1wbGluZy5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc29wdC5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNvcHQuYwotaW5kZXggZjg4NWVmMy4uNjg0OTEwZCAxMDA2NDQKLS0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zb3B0LmMKLSsrKyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zb3B0LmMKLUBAIC02MTIsNyArNjEyLDcgQEAgY21zQm9vbCBPcHRpbWl6ZUJ5UmVzYW1wbGluZyhjbXNQaXBlbGluZSoqIEx1dCwgY21zVUludDMyTnVtYmVyIEludGVudCwgY21zVUludDMKLSAKLSAgICAgLy8gQWxsb2NhdGUgdGhlIENMVVQKLSAgICAgQ0xVVCA9IGNtc1N0YWdlQWxsb2NDTHV0MTZiaXQoU3JjIC0+Q29udGV4dElELCBuR3JpZFBvaW50cywgU3JjIC0+SW5wdXRDaGFubmVscywgU3JjLT5PdXRwdXRDaGFubmVscywgTlVMTCk7Ci0tICAgIGlmIChDTFVUID09IE5VTEwpIHJldHVybiBGQUxTRTsKLSsgICAgaWYgKENMVVQgPT0gTlVMTCkgZ290byBFcnJvcjsKLSAKLSAgICAgLy8gQWRkIHRoZSBDTFVUIHRvIHRoZSBkZXN0aW5hdGlvbiBMVVQKLSAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKERlc3QsIGNtc0FUX0VORCwgQ0xVVCkpIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDA4LW1lbW9yeS1sZWFrLVR5cGVfTVBFbWF0cml4X1JlYWQucGF0Y2ggYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvMDAwOC1tZW1vcnktbGVhay1UeXBlX01QRW1hdHJpeF9SZWFkLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2VlM2QzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDA4LW1lbW9yeS1sZWFrLVR5cGVfTVBFbWF0cml4X1JlYWQucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1kaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN0eXBlcy5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN0eXBlcy5jCi1pbmRleCA0NDFkNmJiLi4xNTE5OWM3IDEwMDY0NAotLS0tIGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN0eXBlcy5jCi0rKysgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMKLUBAIC00MjAzLDcgKzQyMDMsMTEgQEAgdm9pZCAqVHlwZV9NUEVtYXRyaXhfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8KLSAKLSAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgdjsKLSAKLS0gICAgICAgIGlmICghX2Ntc1JlYWRGbG9hdDMyTnVtYmVyKGlvLCAmdikpIHJldHVybiBOVUxMOwotKyAgICAgICAgaWYgKCFfY21zUmVhZEZsb2F0MzJOdW1iZXIoaW8sICZ2KSkgewotKyAgICAgICAgICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIE1hdHJpeCk7Ci0rICAgICAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgT2Zmc2V0cyk7Ci0rICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0rICAgICAgICB9Ci0gICAgICAgICBNYXRyaXhbaV0gPSB2OwotICAgICB9Ci0gCi1AQCAtNDIxMiw3ICs0MjE2LDExIEBAIHZvaWQgKlR5cGVfTVBFbWF0cml4X1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvCi0gCi0gICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHY7Ci0gCi0tICAgICAgICBpZiAoIV9jbXNSZWFkRmxvYXQzMk51bWJlcihpbywgJnYpKSByZXR1cm4gTlVMTDsKLSsgICAgICAgIGlmICghX2Ntc1JlYWRGbG9hdDMyTnVtYmVyKGlvLCAmdikpIHsKLSsgICAgICAgICAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBNYXRyaXgpOwotKyAgICAgICAgICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIE9mZnNldHMpOwotKyAgICAgICAgICAgIHJldHVybiBOVUxMOwotKyAgICAgICAgfQotICAgICAgICAgT2Zmc2V0c1tpXSA9IHY7Ci0gICAgIH0KLSAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDA5LWNtc1N0YWdlQWxsb2NNYXRyaXgtcGFyYW0tc3dhcC5wYXRjaCBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDA5LWNtc1N0YWdlQWxsb2NNYXRyaXgtcGFyYW0tc3dhcC5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZkYjNkZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvMDAwOS1jbXNTdGFnZUFsbG9jTWF0cml4LXBhcmFtLXN3YXAucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1kaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNsdXQuYyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zbHV0LmMKLWluZGV4IDczZTY3MjYuLjliMGViNGIgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2x1dC5jCi0rKysgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2x1dC5jCi1AQCAtNDE0LDEzICs0MTQsMTMgQEAgY21zU3RhZ2UqICBDTVNFWFBPUlQgY21zU3RhZ2VBbGxvY01hdHJpeChjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIFIKLSAKLSAgICAgaWYgKE9mZnNldCAhPSBOVUxMKSB7Ci0gCi0tICAgICAgICBOZXdFbGVtIC0+T2Zmc2V0ID0gKGNtc0Zsb2F0NjROdW1iZXIqKSBfY21zQ2FsbG9jKENvbnRleHRJRCwgQ29scywgc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpKTsKLSsgICAgICAgIE5ld0VsZW0gLT5PZmZzZXQgPSAoY21zRmxvYXQ2NE51bWJlciopIF9jbXNDYWxsb2MoQ29udGV4dElELCBSb3dzLCBzaXplb2YoY21zRmxvYXQ2NE51bWJlcikpOwotICAgICAgICAgaWYgKE5ld0VsZW0tPk9mZnNldCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBNYXRyaXhFbGVtVHlwZUZyZWUoTmV3TVBFKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgfQotIAotLSAgICAgICAgZm9yIChpPTA7IGkgPCBDb2xzOyBpKyspIHsKLSsgICAgICAgIGZvciAoaT0wOyBpIDwgUm93czsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgIE5ld0VsZW0gLT5PZmZzZXRbaV0gPSBPZmZzZXRbaV07Ci0gICAgICAgICB9Ci0gCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvMDAxMC1yZWplY3QtbmFuLnBhdGNoIGIvdGhpcmRfcGFydHkvbGNtczItMi42LzAwMTAtcmVqZWN0LW5hbi5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmNDljYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvMDAxMC1yZWplY3QtbmFuLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zcGx1Z2luLmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3BsdWdpbi5jCi1pbmRleCA4OTAzZDJiLi5iOTViZWZiIDEwMDY0NAotLS0tIGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNwbHVnaW4uYwotKysrIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNwbHVnaW4uYwotQEAgLTE3OSw2ICsxNzksOCBAQCBjbXNCb29sIENNU0VYUE9SVCAgX2Ntc1JlYWRGbG9hdDMyTnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNtc0Zsb2F0MzJOdW1iZXIqIG4pCi0gCi0gICAgICAgICB0bXAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIodG1wKTsKLSAgICAgICAgICpuID0gKihjbXNGbG9hdDMyTnVtYmVyKikgJnRtcDsKLSsgICAgICAgIGlmIChpc25hbigqbikpCi0rICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICB9Ci0gICAgIHJldHVybiBUUlVFOwotIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDExLW1lbW9yeS1sZWFrLVJlYWRTZWdtZW50ZWRDdXJ2ZS5wYXRjaCBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDExLW1lbW9yeS1sZWFrLVJlYWRTZWdtZW50ZWRDdXJ2ZS5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZjZmUwMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvMDAxMS1tZW1vcnktbGVhay1SZWFkU2VnbWVudGVkQ3VydmUucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi1kaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN0eXBlcy5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN0eXBlcy5jCi1pbmRleCAxNTE5OWM3Li4wNGRkMGM0IDEwMDY0NAotLS0tIGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN0eXBlcy5jCi0rKysgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMKLUBAIC0zOTY4LDcgKzM5NjgsNyBAQCBjbXNUb25lQ3VydmUqIFJlYWRTZWdtZW50ZWRDdXJ2ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORAotICAgICAgICAgICAgIGNhc2UgY21zU2lnU2FtcGxlZEN1cnZlU2VnOiB7Ci0gICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBDb3VudDsKLSAKLS0gICAgICAgICAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJkNvdW50KSkgcmV0dXJuIE5VTEw7Ci0rICAgICAgICAgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZDb3VudCkpIGdvdG8gRXJyb3I7Ci0gCi0gICAgICAgICAgICAgICAgIFNlZ21lbnRzW2ldLm5HcmlkUG9pbnRzID0gQ291bnQ7Ci0gICAgICAgICAgICAgICAgIFNlZ21lbnRzW2ldLlNhbXBsZWRQb2ludHMgPSAoY21zRmxvYXQzMk51bWJlciopIF9jbXNDYWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgQ291bnQsIHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKSk7Ci1AQCAtMzk4Nyw3ICszOTg3LDcgQEAgY21zVG9uZUN1cnZlKiBSZWFkU2VnbWVudGVkQ3VydmUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkQKLSAgICAgICAgICAgICAgICAgX2Ntc1RhZ1NpZ25hdHVyZTJTdHJpbmcoU3RyaW5nLCAoY21zVGFnU2lnbmF0dXJlKSBFbGVtZW50U2lnKTsKLSAgICAgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3Ioc2VsZi0+Q29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVua25vd24gY3VydmUgZWxlbWVudCB0eXBlICclcycgZm91bmQuIiwgU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgfQotLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSsgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKLSAKLSAgICAgICAgICB9Ci0gICAgICB9Ci1AQCAtNDAwMSw3ICs0MDAxLDEyIEBAIGNtc1RvbmVDdXJ2ZSogUmVhZFNlZ21lbnRlZEN1cnZlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ECi0gICAgICByZXR1cm4gQ3VydmU7Ci0gCi0gRXJyb3I6Ci0tICAgICBpZiAoU2VnbWVudHMpIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFNlZ21lbnRzKTsKLSsgICAgIGlmIChTZWdtZW50cykgewotKyAgICAgICAgIGZvciAoaT0wOyBpIDwgblNlZ21lbnRzOyBpKyspIHsKLSsgICAgICAgICAgICAgaWYgKFNlZ21lbnRzW2ldLlNhbXBsZWRQb2ludHMpIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFNlZ21lbnRzW2ldLlNhbXBsZWRQb2ludHMpOwotKyAgICAgICAgIH0KLSsgICAgICAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBTZWdtZW50cyk7Ci0rICAgICB9Ci0gICAgICByZXR1cm4gTlVMTDsKLSB9Ci0gCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvMDAxMi1iYWNrcG9ydC1jMGE5OGQ4Ni5wYXRjaCBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDEyLWJhY2twb3J0LWMwYTk4ZDg2LnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDQxZTMxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDEyLWJhY2twb3J0LWMwYTk4ZDg2LnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zaW50cnAuYyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zaW50cnAuYwotaW5kZXggNWQ1ZjM1ZC4uMTRjNjg1NiAxMDA2NDQKLS0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zaW50cnAuYwotKysrIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNpbnRycC5jCi1AQCAtMjE1LDcgKzIxNSw3IEBAIHZvaWQgTGluTGVycDFEKHJlZ2lzdGVyIGNvbnN0IGNtc1VJbnQxNk51bWJlciBWYWx1ZVtdLAotIC8vIFRvIHByZXZlbnQgb3V0IG9mIGJvdW5kcyBpbmRleGluZwotIGNtc0lOTElORSBjbXNGbG9hdDMyTnVtYmVyIGZjbGFtcChjbXNGbG9hdDMyTnVtYmVyIHYpIAotIHsKLS0gICAgcmV0dXJuIHYgPCAwLjBmID8gMC4wZiA6ICh2ID4gMS4wZiA/IDEuMGYgOiB2KTsKLSsgICAgcmV0dXJuICgodiA8IDAuMGYpIHx8IGlzbmFuKHYpKSA/IDAuMGYgOiAodiA+IDEuMGYgPyAxLjBmIDogdik7Ci0gfQotIAotIC8vIEZsb2F0aW5nLXBvaW50IHZlcnNpb24gb2YgMUQgaW50ZXJwb2xhdGlvbgotZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zaW8wLmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2lvMC5jCi1pbmRleCA1ZjlmMDhhLi4zZWQ3MzBhIDEwMDY0NAotLS0tIGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNpbzAuYwotKysrIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNpbzAuYwotQEAgLTE0NzUsNiArMTQ3NSwxNyBAQCB2b2lkKiBDTVNFWFBPUlQgY21zUmVhZFRhZyhjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVGFnU2lnbmF0dXJlIHNpZykKLSAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBpbiBtZW1vcnksIHJldHVybiB0aGUgcG9pbnRlcgotICAgICBpZiAoSWNjIC0+IFRhZ1B0cnNbbl0pIHsKLSAKLSsgICAgICAgIGlmIChJY2MtPlRhZ1R5cGVIYW5kbGVyc1tuXSA9PSBOVUxMKSBnb3RvIEVycm9yOwotKwotKyAgICAgICAgLy8gU2FuaXR5IGNoZWNrCi0rICAgICAgICBCYXNlVHlwZSA9IEljYy0+VGFnVHlwZUhhbmRsZXJzW25dLT5TaWduYXR1cmU7Ci0rICAgICAgICBpZiAoQmFzZVR5cGUgPT0gMCkgZ290byBFcnJvcjsKLSsKLSsgICAgICAgIFRhZ0Rlc2NyaXB0b3IgPSBfY21zR2V0VGFnRGVzY3JpcHRvcihJY2MtPkNvbnRleHRJRCwgc2lnKTsKLSsgICAgICAgIGlmIChUYWdEZXNjcmlwdG9yID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0rCi0rICAgICAgICBpZiAoIUlzVHlwZVN1cHBvcnRlZChUYWdEZXNjcmlwdG9yLCBCYXNlVHlwZSkpIGdvdG8gRXJyb3I7Ci0rCi0gICAgICAgICBpZiAoSWNjIC0+VGFnU2F2ZUFzUmF3W25dKSBnb3RvIEVycm9yOyAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCByZWFkIHJhdyB0YWdzIGFzIGNvb2tlZAotIAotICAgICAgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7Ci1kaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN0eXBlcy5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN0eXBlcy5jCi1pbmRleCAwNGRkMGM0Li4zODY0MzliIDEwMDY0NAotLS0tIGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN0eXBlcy5jCi0rKysgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMKLUBAIC00Mjk3LDggKzQyOTcsMTIgQEAgdm9pZCAqVHlwZV9NUEVjbHV0X1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLAotIAotICAgICAvLyBDb3B5IE1BWF9JTlBVVF9ESU1FTlNJT05TIGF0IG1vc3QuIEV4cGFuZCB0byBjbXNVSW50MzJOdW1iZXIKLSAgICAgbk1heEdyaWRzID0gSW5wdXRDaGFucyA+IE1BWF9JTlBVVF9ESU1FTlNJT05TID8gTUFYX0lOUFVUX0RJTUVOU0lPTlMgOiBJbnB1dENoYW5zOwotLSAgICBmb3IgKGk9MDsgaSA8IG5NYXhHcmlkczsgaSsrKSBHcmlkUG9pbnRzW2ldID0gKGNtc1VJbnQzMk51bWJlcikgRGltZW5zaW9uczhbaV07Ci0gCi0rICAgIGZvciAoaSA9IDA7IGkgPCBuTWF4R3JpZHM7IGkrKykgewotKyAgICAgICAgaWYgKERpbWVuc2lvbnM4W2ldID09IDEpIGdvdG8gRXJyb3I7IC8vIEltcG9zc2libGUgdmFsdWUsIDAgZm9yIG5vIENMVVQgYW5kIHRoZW4gMiBhdCBsZWFzdAotKyAgICAgICAgR3JpZFBvaW50c1tpXSA9IChjbXNVSW50MzJOdW1iZXIpRGltZW5zaW9uczhbaV07Ci0rICAgIH0KLSsgICAgCi0gICAgIC8vIEFsbG9jYXRlIHRoZSB0cnVlIENMVVQKLSAgICAgbXBlID0gY21zU3RhZ2VBbGxvY0NMdXRGbG9hdEdyYW51bGFyKHNlbGYgLT5Db250ZXh0SUQsIEdyaWRQb2ludHMsIElucHV0Q2hhbnMsIE91dHB1dENoYW5zLCBOVUxMKTsKLSAgICAgaWYgKG1wZSA9PSBOVUxMKSBnb3RvIEVycm9yOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42LzAwMTMtdXRmOC5wYXRjaCBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDEzLXV0ZjgucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyOGQyYzIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGNtczItMi42LzAwMTMtdXRmOC5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2NnYXRzLmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2NnYXRzLmMKLWluZGV4IDkwMTc0MzUuLjU3MjBjNjYgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2NnYXRzLmMKLSsrKyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zY2dhdHMuYwotQEAgLTI1OCw3ICsyNTgsNyBAQCBzdGF0aWMgUFJPUEVSVFkgUHJlZGVmaW5lZFByb3BlcnRpZXNbXSA9IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZGVkLgotIAotICAgICAgICAgeyJTQU1QTEVfQkFDS0lORyIsICAgV1JJVEVfU1RSSU5HSUZZfSwgICAvLyBJZGVudGlmaWVzIHRoZSBiYWNraW5nIG1hdGVyaWFsIHVzZWQgYmVoaW5kIHRoZSBzYW1wbGUgZHVyaW5nCi0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lYXN1cmVtZW50LiBBbGxvd2VkIHZhbHVlcyBhcmUgk2JsYWNrPyCTd2hpdGU/IG9yIHsibmEiLgotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZWFzdXJlbWVudC4gQWxsb3dlZCB2YWx1ZXMgYXJlICJibGFjayIgIndoaXRlIiBvciAibmEiLgotIAotICAgICAgICAgeyJDSElTUV9ET0YiLCAgICAgICAgV1JJVEVfU1RSSU5HSUZZfSwgICAvLyBEZWdyZWVzIG9mIGZyZWVkb20gYXNzb2NpYXRlZCB3aXRoIHRoZSBDaGkgc3F1YXJlZCBzdGF0aXN0aWMKLSAKLUBAIC0yNzQsNyArMjc0LDcgQEAgc3RhdGljIFBST1BFUlRZIFByZWRlZmluZWRQcm9wZXJ0aWVzW10gPSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbm90ZSB0aGUgdXNlIG9mIGZpbHRlcnMgc3VjaCBhcyBub25lLCBENjUsIFJlZCwgR3JlZW4gb3IgQmx1ZS4KLSAKLSAgICAgICAgeyJQT0xBUklaQVRJT04iLCAgICAgIFdSSVRFX1NUUklOR0lGWX0sICAgLy8gSWRlbnRpZmllcyB0aGUgdXNlIG9mIGEgcGh5c2ljYWwgcG9sYXJpemF0aW9uIGZpbHRlciBkdXJpbmcgbWVhc3VyZW1lbnQuIEFsbG93ZWQKLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzIGFyZSB7Inllcz8gk3doaXRlPyCTbm9uZT9vciCTbmE/Ci0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlcyBhcmUgInllcyIgIndoaXRlIiAibm9uZSIgb3IgIm5hIgotIAotICAgICAgICB7IldFSUdIVElOR19GVU5DVElPTiIsIFdSSVRFX1BBSVJ9LCAgIC8vIEluZGljYXRlcyBzdWNoIGZ1bmN0aW9ucyBhczogdGhlIENJRSBzdGFuZGFyZCBvYnNlcnZlciBmdW5jdGlvbnMgdXNlZCBpbiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRpb24gb2YgdmFyaW91cyBkYXRhIHBhcmFtZXRlcnMgKDIgZGVncmVlIGFuZCAxMCBkZWdyZWUpLCBDSUUgc3RhbmRhcmQKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMKLWluZGV4IDM4NjQzOWIuLmU1ZWQwNmMgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMKLSsrKyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zdHlwZXMuYwotQEAgLTk2Miw3ICs5NjIsNyBAQCBjbXNCb29sICBUeXBlX1RleHRfRGVzY3JpcHRpb25fV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJTwotICAgICBsZW4gPSBjbXNNTFVnZXRBU0NJSShtbHUsIGNtc05vTGFuZ3VhZ2UsIGNtc05vQ291bnRyeSwgTlVMTCwgMCk7Ci0gCi0gICAgIC8vIEZyb20gSUNDMy40OiBJdCBoYXMgYmVlbiBmb3VuZCB0aGF0IHRleHREZXNjcmlwdGlvblR5cGUgY2FuIGNvbnRhaW4gbWlzYWxpZ25lZCBkYXRhCi0tICAgIC8vKHNlZSBjbGF1c2UgNC4xIGZvciB0aGUgZGVmaW5pdGlvbiBvZiCTYWxpZ25lZD8uIEJlY2F1c2UgdGhlIFVuaWNvZGUgbGFuZ3VhZ2UKLSsgICAgLy8oc2VlIGNsYXVzZSA0LjEgZm9yIHRoZSBkZWZpbml0aW9uIG9mICdhbGlnbmVkJy4gQmVjYXVzZSB0aGUgVW5pY29kZSBsYW5ndWFnZQotICAgICAvLyBjb2RlIGFuZCBVbmljb2RlIGNvdW50IGltbWVkaWF0ZWx5IGZvbGxvdyB0aGUgQVNDSUkgZGVzY3JpcHRpb24sIHRoZWlyCi0gICAgIC8vIGFsaWdubWVudCBpcyBub3QgY29ycmVjdCBpZiB0aGUgQVNDSUkgY291bnQgaXMgbm90IGEgbXVsdGlwbGUgb2YgZm91ci4gVGhlCi0gICAgIC8vIFNjcmlwdENvZGUgY29kZSBpcyBtaXNhbGlnbmVkIHdoZW4gdGhlIEFTQ0lJIGNvdW50IGlzIG9kZC4gUHJvZmlsZSByZWFkaW5nIGFuZAotQEAgLTMwNjQsOSArMzA2NCwxMCBAQCB2b2lkIFR5cGVfQ29sb3JhbnRUYWJsZV9GcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCogUHRyKQotIC8vVGhlIG5hbWVkQ29sb3IyVHlwZSBpcyBhIGNvdW50IHZhbHVlIGFuZCBhcnJheSBvZiBzdHJ1Y3R1cmVzIHRoYXQgcHJvdmlkZSBjb2xvcgotIC8vY29vcmRpbmF0ZXMgZm9yIDctYml0IEFTQ0lJIGNvbG9yIG5hbWVzLiBGb3IgZWFjaCBuYW1lZCBjb2xvciwgYSBQQ1MgYW5kIG9wdGlvbmFsCi0gLy9kZXZpY2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbG9yIGFyZSBnaXZlbi4gQm90aCByZXByZXNlbnRhdGlvbnMgYXJlIDE2LWJpdCB2YWx1ZXMuCi0tLy9UaGUgZGV2aWNlIHJlcHJlc2VudGF0aW9uIGNvcnJlc3BvbmRzIHRvIHRoZSBoZWFkZXKScyCTY29sb3Igc3BhY2Ugb2YgZGF0YT9maWVsZC4KLS0vL1RoaXMgcmVwcmVzZW50YXRpb24gc2hvdWxkIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgk251bWJlciBvZiBkZXZpY2UgY29tcG9uZW50cz8vL2ZpZWxkIGluIHRoZSBuYW1lZENvbG9yMlR5cGUuIElmIHRoaXMgZmllbGQgaXMgMCwgZGV2aWNlIGNvb3JkaW5hdGVzIGFyZSBub3QgcHJvdmlkZWQuCi0tLy9UaGUgUENTIHJlcHJlc2VudGF0aW9uIGNvcnJlc3BvbmRzIHRvIHRoZSBoZWFkZXKScyBQQ1MgZmllbGQuIFRoZSBQQ1MgcmVwcmVzZW50YXRpb24KLSsvL1RoZSBkZXZpY2UgcmVwcmVzZW50YXRpb24gY29ycmVzcG9uZHMgdG8gdGhlIGhlYWRlcidzICdjb2xvciBzcGFjZSBvZiBkYXRhJyBmaWVsZC4KLSsvL1RoaXMgcmVwcmVzZW50YXRpb24gc2hvdWxkIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgJ251bWJlciBvZiBkZXZpY2UgY29tcG9uZW50cycKLSsvL2ZpZWxkIGluIHRoZSBuYW1lZENvbG9yMlR5cGUuIElmIHRoaXMgZmllbGQgaXMgMCwgZGV2aWNlIGNvb3JkaW5hdGVzIGFyZSBub3QgcHJvdmlkZWQuCi0rLy9UaGUgUENTIHJlcHJlc2VudGF0aW9uIGNvcnJlc3BvbmRzIHRvIHRoZSBoZWFkZXIncyBQQ1MgZmllbGQuIFRoZSBQQ1MgcmVwcmVzZW50YXRpb24KLSAvL2lzIGFsd2F5cyBwcm92aWRlZC4gQ29sb3IgbmFtZXMgYXJlIGZpeGVkLWxlbmd0aCwgMzItYnl0ZSBmaWVsZHMgaW5jbHVkaW5nIG51bGwKLSAvL3Rlcm1pbmF0aW9uLiBJbiBvcmRlciB0byBtYWludGFpbiBtYXhpbXVtIHBvcnRhYmlsaXR5LCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZAotIC8vdGhhdCBzcGVjaWFsIGNoYXJhY3RlcnMgb2YgdGhlIDctYml0IEFTQ0lJIHNldCBub3QgYmUgdXNlZC4KLUBAIC0zODA5LDcgKzM4MTAsOCBAQCB2b2lkIFR5cGVfU2NyZWVuaW5nX0ZyZWUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCB2b2lkKiBQdHIpCi0gLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAvLwotIC8vVGhpcyB0eXBlIHJlcHJlc2VudHMgYSBzZXQgb2Ygdmlld2luZyBjb25kaXRpb24gcGFyYW1ldGVycyBpbmNsdWRpbmc6Ci0tLy9DSUUgkmFic29sdXRlP2lsbHVtaW5hbnQgd2hpdGUgcG9pbnQgdHJpc3RpbXVsdXMgdmFsdWVzIGFuZCBDSUUgkmFic29sdXRlPy8vc3Vycm91bmQgdHJpc3RpbXVsdXMgdmFsdWVzLgotKy8vQ0lFICdhYnNvbHV0ZSdpbGx1bWluYW50IHdoaXRlIHBvaW50IHRyaXN0aW11bHVzIHZhbHVlcyBhbmQgQ0lFICdhYnNvbHV0ZScKLSsvL3N1cnJvdW5kIHRyaXN0aW11bHVzIHZhbHVlcy4KLSAKLSBzdGF0aWMKLSB2b2lkICpUeXBlX1ZpZXdpbmdDb25kaXRpb25zX1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG5JdGVtcywgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKLUBAIC0zODk1LDcgKzM4OTcsNyBAQCB2b2lkIEdlbmVyaWNNUEVmcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCAqUHRyKQotIH0KLSAKLSAvLyBFYWNoIGN1cnZlIGlzIHN0b3JlZCBpbiBvbmUgb3IgbW9yZSBjdXJ2ZSBzZWdtZW50cywgd2l0aCBicmVhay1wb2ludHMgc3BlY2lmaWVkIGJldHdlZW4gY3VydmUgc2VnbWVudHMuCi0tLy8gVGhlIGZpcnN0IGN1cnZlIHNlZ21lbnQgYWx3YXlzIHN0YXJ0cyBhdCCWSW5maW5pdHksIGFuZCB0aGUgbGFzdCBjdXJ2ZSBzZWdtZW50IGFsd2F5cyBlbmRzIGF0ICtJbmZpbml0eS4gVGhlCi0rLy8gVGhlIGZpcnN0IGN1cnZlIHNlZ21lbnQgYWx3YXlzIHN0YXJ0cyBhdCAtSW5maW5pdHksIGFuZCB0aGUgbGFzdCBjdXJ2ZSBzZWdtZW50IGFsd2F5cyBlbmRzIGF0ICtJbmZpbml0eS4gVGhlCi0gLy8gZmlyc3QgYW5kIGxhc3QgY3VydmUgc2VnbWVudHMgc2hhbGwgYmUgc3BlY2lmaWVkIGluIHRlcm1zIG9mIGEgZm9ybXVsYSwgd2hlcmVhcyB0aGUgb3RoZXIgc2VnbWVudHMgc2hhbGwgYmUKLSAvLyBzcGVjaWZpZWQgZWl0aGVyIGluIHRlcm1zIG9mIGEgZm9ybXVsYSwgb3IgYnkgYSBzYW1wbGVkIGN1cnZlLgotIAotZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zdmlydC5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN2aXJ0LmMKLWluZGV4IGIzMjRjOTkuLmQxOWFjZTEgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3ZpcnQuYwotKysrIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN2aXJ0LmMKLUBAIC02MTIsMTggKzYxMiwxOCBAQCBjbXNIUFJPRklMRSBDTVNFWFBPUlQgY21zQ3JlYXRlWFlaUHJvZmlsZSh2b2lkKQotIAotIC8vc1JHQiBDdXJ2ZXMgYXJlIGRlZmluZWQgYnk6Ci0gLy8KLS0vL0lmICBSknNSR0IsR5JzUkdCLCBCknNSR0IgPCAwLjA0MDQ1Ci0rLy9JZiAgUidzUkdCLEcnc1JHQiwgQidzUkdCIDwgMC4wNDA0NQotIC8vCi0tLy8gICAgUiA9ICBSknNSR0IgLyAxMi45MgotLS8vICAgIEcgPSAgR5JzUkdCIC8gMTIuOTIKLS0vLyAgICBCID0gIEKSc1JHQiAvIDEyLjkyCi0rLy8gICAgUiA9ICBSJ3NSR0IgLyAxMi45MgotKy8vICAgIEcgPSAgRydzUkdCIC8gMTIuOTIKLSsvLyAgICBCID0gIEInc1JHQiAvIDEyLjkyCi0gLy8KLSAvLwotLS8vZWxzZSBpZiAgUpJzUkdCLEeSc1JHQiwgQpJzUkdCID49IDAuMDQwNDUKLSsvL2Vsc2UgaWYgIFInc1JHQixHJ3NSR0IsIEInc1JHQiA+PSAwLjA0MDQ1Ci0gLy8KLS0vLyAgICBSID0gKChSknNSR0IgKyAwLjA1NSkgLyAxLjA1NSleMi40Ci0tLy8gICAgRyA9ICgoR5JzUkdCICsgMC4wNTUpIC8gMS4wNTUpXjIuNAotLS8vICAgIEIgPSAoKEKSc1JHQiArIDAuMDU1KSAvIDEuMDU1KV4yLjQKLSsvLyAgICBSID0gKChSJ3NSR0IgKyAwLjA1NSkgLyAxLjA1NSleMi40Ci0rLy8gICAgRyA9ICgoRydzUkdCICsgMC4wNTUpIC8gMS4wNTUpXjIuNAotKy8vICAgIEIgPSAoKEInc1JHQiArIDAuMDU1KSAvIDEuMDU1KV4yLjQKLSAKLSBzdGF0aWMKLSBjbXNUb25lQ3VydmUqIEJ1aWxkX3NSR0JHYW1tYShjbXNDb250ZXh0IENvbnRleHRJRCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDE0LWF2b2lkLWZpeGVkLWluZi5wYXRjaCBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDE0LWF2b2lkLWZpeGVkLWluZi5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzNzg3YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvMDAxNC1hdm9pZC1maXhlZC1pbmYucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi1kaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNvcHQuYyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zb3B0LmMKLWluZGV4IDY4NDkxMGQuLjc2ZGUwMTUgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc29wdC5jCi0rKysgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc29wdC5jCi1AQCAtMTQ0Myw3ICsxNDQzLDcgQEAgdm9pZCBNYXRTaGFwZXJFdmFsMTYocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIEluW10sCi0gCi0gLy8gVGhpcyB0YWJsZSBjb252ZXJ0cyBmcm9tIDggYml0cyB0byAxLjE0IGFmdGVyIGFwcGx5aW5nIHRoZSBjdXJ2ZQotIHN0YXRpYwotLXZvaWQgRmlsbEZpcnN0U2hhcGVyKGNtc1MxRml4ZWQxNE51bWJlciogVGFibGUsIGNtc1RvbmVDdXJ2ZSogQ3VydmUpCi0rY21zQm9vbCBGaWxsRmlyc3RTaGFwZXIoY21zUzFGaXhlZDE0TnVtYmVyKiBUYWJsZSwgY21zVG9uZUN1cnZlKiBDdXJ2ZSkKLSB7Ci0gICAgIGludCBpOwotICAgICBjbXNGbG9hdDMyTnVtYmVyIFIsIHk7Ci1AQCAtMTQ1MiwxNCArMTQ1MiwxNyBAQCB2b2lkIEZpbGxGaXJzdFNoYXBlcihjbXNTMUZpeGVkMTROdW1iZXIqIFRhYmxlLCBjbXNUb25lQ3VydmUqIEN1cnZlKQotIAotICAgICAgICAgUiAgID0gKGNtc0Zsb2F0MzJOdW1iZXIpIChpIC8gMjU1LjApOwotICAgICAgICAgeSAgID0gY21zRXZhbFRvbmVDdXJ2ZUZsb2F0KEN1cnZlLCBSKTsKLSsgICAgICAgIGlmIChpc2luZih5KSkKLSsgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gCi0gICAgICAgICBUYWJsZVtpXSA9IERPVUJMRV9UT18xRklYRUQxNCh5KTsKLSAgICAgfQotKyAgICByZXR1cm4gVFJVRTsKLSB9Ci0gCi0gLy8gVGhpcyB0YWJsZSBjb252ZXJ0cyBmb3JtIDEuMTQgKGJlaW5nIDB4NDAwMCB0aGUgbGFzdCBlbnRyeSkgdG8gOCBiaXRzIGFmdGVyIGFwcGx5aW5nIHRoZSBjdXJ2ZQotIHN0YXRpYwotLXZvaWQgRmlsbFNlY29uZFNoYXBlcihjbXNVSW50MTZOdW1iZXIqIFRhYmxlLCBjbXNUb25lQ3VydmUqIEN1cnZlLCBjbXNCb29sIElzOEJpdHNPdXRwdXQpCi0rY21zQm9vbCBGaWxsU2Vjb25kU2hhcGVyKGNtc1VJbnQxNk51bWJlciogVGFibGUsIGNtc1RvbmVDdXJ2ZSogQ3VydmUsIGNtc0Jvb2wgSXM4Qml0c091dHB1dCkKLSB7Ci0gICAgIGludCBpOwotICAgICBjbXNGbG9hdDMyTnVtYmVyIFIsIFZhbDsKLUBAIC0xNDY4LDYgKzE0NzEsOCBAQCB2b2lkIEZpbGxTZWNvbmRTaGFwZXIoY21zVUludDE2TnVtYmVyKiBUYWJsZSwgY21zVG9uZUN1cnZlKiBDdXJ2ZSwgY21zQm9vbCBJczhCaQotIAotICAgICAgICAgUiAgID0gKGNtc0Zsb2F0MzJOdW1iZXIpIChpIC8gMTYzODQuMCk7Ci0gICAgICAgICBWYWwgPSBjbXNFdmFsVG9uZUN1cnZlRmxvYXQoQ3VydmUsIFIpOyAgICAvLyBWYWwgY29tZXMgMC4uMS4wCi0rICAgICAgICBpZiAoaXNpbmYoVmFsKSkKLSsgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gCi0gICAgICAgICBpZiAoSXM4Qml0c091dHB1dCkgewotIAotQEAgLTE0ODIsNiArMTQ4Nyw3IEBAIHZvaWQgRmlsbFNlY29uZFNoYXBlcihjbXNVSW50MTZOdW1iZXIqIFRhYmxlLCBjbXNUb25lQ3VydmUqIEN1cnZlLCBjbXNCb29sIElzOEJpCi0gICAgICAgICB9Ci0gICAgICAgICBlbHNlIFRhYmxlW2ldICA9IF9jbXNRdWlja1NhdHVyYXRlV29yZChWYWwgKiA2NTUzNS4wKTsKLSAgICAgfQotKyAgICByZXR1cm4gVFJVRTsKLSB9Ci0gCi0gLy8gQ29tcHV0ZSB0aGUgbWF0cml4LXNoYXBlciBzdHJ1Y3R1cmUKLUBAIC0xNDk5LDEzICsxNTA1LDE5IEBAIGNtc0Jvb2wgU2V0TWF0U2hhcGVyKGNtc1BpcGVsaW5lKiBEZXN0LCBjbXNUb25lQ3VydmUqIEN1cnZlMVszXSwgY21zTUFUMyogTWF0LCBjCi0gICAgIHAgLT4gQ29udGV4dElEID0gRGVzdCAtPiBDb250ZXh0SUQ7Ci0gCi0gICAgIC8vIFByZWNvbXB1dGUgdGFibGVzCi0tICAgIEZpbGxGaXJzdFNoYXBlcihwIC0+U2hhcGVyMVIsIEN1cnZlMVswXSk7Ci0tICAgIEZpbGxGaXJzdFNoYXBlcihwIC0+U2hhcGVyMUcsIEN1cnZlMVsxXSk7Ci0tICAgIEZpbGxGaXJzdFNoYXBlcihwIC0+U2hhcGVyMUIsIEN1cnZlMVsyXSk7Ci0rICAgIGlmICghRmlsbEZpcnN0U2hhcGVyKHAgLT5TaGFwZXIxUiwgQ3VydmUxWzBdKSkKLSsgICAgICAgIGdvdG8gRXJyb3I7Ci0rICAgIGlmICghRmlsbEZpcnN0U2hhcGVyKHAgLT5TaGFwZXIxRywgQ3VydmUxWzFdKSkKLSsgICAgICAgIGdvdG8gRXJyb3I7Ci0rICAgIGlmICghRmlsbEZpcnN0U2hhcGVyKHAgLT5TaGFwZXIxQiwgQ3VydmUxWzJdKSkKLSsgICAgICAgIGdvdG8gRXJyb3I7Ci0gCi0tICAgIEZpbGxTZWNvbmRTaGFwZXIocCAtPlNoYXBlcjJSLCBDdXJ2ZTJbMF0sIElzOEJpdHMpOwotLSAgICBGaWxsU2Vjb25kU2hhcGVyKHAgLT5TaGFwZXIyRywgQ3VydmUyWzFdLCBJczhCaXRzKTsKLS0gICAgRmlsbFNlY29uZFNoYXBlcihwIC0+U2hhcGVyMkIsIEN1cnZlMlsyXSwgSXM4Qml0cyk7Ci0rICAgIGlmICghRmlsbFNlY29uZFNoYXBlcihwIC0+U2hhcGVyMlIsIEN1cnZlMlswXSwgSXM4Qml0cykpCi0rICAgICAgICBnb3RvIEVycm9yOwotKyAgICBpZiAoIUZpbGxTZWNvbmRTaGFwZXIocCAtPlNoYXBlcjJHLCBDdXJ2ZTJbMV0sIElzOEJpdHMpKQotKyAgICAgICAgZ290byBFcnJvcjsKLSsgICAgaWYgKCFGaWxsU2Vjb25kU2hhcGVyKHAgLT5TaGFwZXIyQiwgQ3VydmUyWzJdLCBJczhCaXRzKSkKLSsgICAgICAgIGdvdG8gRXJyb3I7Ci0gCi0gICAgIC8vIENvbnZlcnQgbWF0cml4IHRvIG5GaXhlZDE0LiBOb3RlIHRoYXQgdGhvc2UgdmFsdWVzIG1heSB0YWtlIG1vcmUgdGhhbiAxNiBiaXRzIGFzCi0gICAgIGZvciAoaT0wOyBpIDwgMzsgaSsrKSB7Ci1AQCAtMTUzMSw2ICsxNTQzLDkgQEAgY21zQm9vbCBTZXRNYXRTaGFwZXIoY21zUGlwZWxpbmUqIERlc3QsIGNtc1RvbmVDdXJ2ZSogQ3VydmUxWzNdLCBjbXNNQVQzKiBNYXQsIGMKLSAgICAgLy8gRmlsbCBmdW5jdGlvbiBwb2ludGVycwotICAgICBfY21zUGlwZWxpbmVTZXRPcHRpbWl6YXRpb25QYXJhbWV0ZXJzKERlc3QsIE1hdFNoYXBlckV2YWwxNiwgKHZvaWQqKSBwLCBGcmVlTWF0U2hhcGVyLCBEdXBNYXRTaGFwZXIpOwotICAgICByZXR1cm4gVFJVRTsKLStFcnJvcjoKLSsgICAgX2Ntc0ZyZWUoRGVzdC0+Q29udGV4dElELCBwKTsKLSsgICAgcmV0dXJuIEZBTFNFOwotIH0KLSAKLSAvLyAgOCBiaXRzIG9uIGlucHV0IGFsbG93cyBtYXRyaXgtc2hhcGVyIGJvb3QgdXAgdG8gMjUgTXBpeGVscyBwZXIgc2Vjb25kIG9uIFJHQi4gVGhhdCdzIGZhc3QhCi1AQCAtMTYwNiw3ICsxNjIxLDggQEAgY21zQm9vbCBPcHRpbWl6ZU1hdHJpeFNoYXBlcihjbXNQaXBlbGluZSoqIEx1dCwgY21zVUludDMyTnVtYmVyIEludGVudCwgY21zVUludDMKLSAgICAgICAgICpkd0ZsYWdzIHw9IGNtc0ZMQUdTX05PQ0FDSEU7Ci0gCi0gICAgICAgICAvLyBTZXR1cCB0aGUgb3B0aW1pemFyaW9uIHJvdXRpbmVzCi0tICAgICAgICBTZXRNYXRTaGFwZXIoRGVzdCwgbXBlQzEgLT5UaGVDdXJ2ZXMsICZyZXMsIChjbXNWRUMzKikgRGF0YTIgLT5PZmZzZXQsIG1wZUMyLT5UaGVDdXJ2ZXMsIE91dHB1dEZvcm1hdCk7Ci0rICAgICAgICBpZiAoIVNldE1hdFNoYXBlcihEZXN0LCBtcGVDMSAtPlRoZUN1cnZlcywgJnJlcywgKGNtc1ZFQzMqKSBEYXRhMiAtPk9mZnNldCwgbXBlQzItPlRoZUN1cnZlcywgT3V0cHV0Rm9ybWF0KSkKLSsgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICB9Ci0gCi0gICAgIGNtc1BpcGVsaW5lRnJlZShTcmMpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42LzAwMTUtc2FuaXRpemUtZmxvYXQtcmVhZC5wYXRjaCBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDE1LXNhbml0aXplLWZsb2F0LXJlYWQucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZGM3YjMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGNtczItMi42LzAwMTUtc2FuaXRpemUtZmxvYXQtcmVhZC5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3BsdWdpbi5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNwbHVnaW4uYwotaW5kZXggYjk1YmVmYi4uNGJhOTk4YiAxMDA2NDQKLS0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zcGx1Z2luLmMKLSsrKyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zcGx1Z2luLmMKLUBAIC0xODIsNyArMTgyLDkgQEAgY21zQm9vbCBDTVNFWFBPUlQgIF9jbXNSZWFkRmxvYXQzMk51bWJlcihjbXNJT0hBTkRMRVIqIGlvLCBjbXNGbG9hdDMyTnVtYmVyKiBuKQotICAgICAgICAgaWYgKGlzbmFuKCpuKSkKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIH0KLS0gICAgcmV0dXJuIFRSVUU7Ci0rCi0rICAgIC8vIGZwY2xhc3NpZnkoKSByZXF1aXJlZCBieSBDOTkKLSsgICAgcmV0dXJuIChmcGNsYXNzaWZ5KCpuKSA9PSBGUF9aRVJPKSB8fCAoZnBjbGFzc2lmeSgqbikgPT0gRlBfTk9STUFMKTsKLSB9Ci0gCi0gCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvMDAxNi1jaGVjay1MVVQtYW5kLU1QRS5wYXRjaCBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDE2LWNoZWNrLUxVVC1hbmQtTVBFLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmE4NGUyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDE2LWNoZWNrLUxVVC1hbmQtTVBFLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2x1dC5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNsdXQuYwotaW5kZXggOWIwZWI0YjU0Li4xOWQ0MzM2MWYgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2x1dC5jCi0rKysgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2x1dC5jCi1AQCAtMTI1NSwyMSArMTI1NSwzOSBAQCBjbXNTdGFnZSogQ01TRVhQT1JUIGNtc1N0YWdlRHVwKGNtc1N0YWdlKiBtcGUpCi0gLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAKLSAvLyBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgdGhlIGNoYW5uZWwgY291bnQKLS0KLSBzdGF0aWMKLS12b2lkIEJsZXNzTFVUKGNtc1BpcGVsaW5lKiBsdXQpCi0rY21zQm9vbCBCbGVzc0xVVChjbXNQaXBlbGluZSogbHV0KQotIHsKLSAgICAgLy8gV2UgY2FuIHNldCB0aGUgaW5wdXQvb3VwdXQgY2hhbm5lbHMgb25seSBpZiB3ZSBoYXZlIGVsZW1lbnRzLgotICAgICBpZiAobHV0IC0+RWxlbWVudHMgIT0gTlVMTCkgewotIAotLSAgICAgICAgY21zU3RhZ2UgKkZpcnN0LCAqTGFzdDsKLSsgICAgICAgIGNtc1N0YWdlKiBwcmV2OwotKyAgICAgICAgY21zU3RhZ2UqIG5leHQ7Ci0rICAgICAgICBjbXNTdGFnZSogRmlyc3Q7Ci0rICAgICAgICBjbXNTdGFnZSogTGFzdDsKLSAKLSAgICAgICAgIEZpcnN0ICA9IGNtc1BpcGVsaW5lR2V0UHRyVG9GaXJzdFN0YWdlKGx1dCk7Ci0gICAgICAgICBMYXN0ICAgPSBjbXNQaXBlbGluZUdldFB0clRvTGFzdFN0YWdlKGx1dCk7Ci0gCi0tICAgICAgICBpZiAoRmlyc3QgIT0gTlVMTClsdXQgLT5JbnB1dENoYW5uZWxzID0gRmlyc3QgLT5JbnB1dENoYW5uZWxzOwotLSAgICAgICAgaWYgKExhc3QgIT0gTlVMTCkgbHV0IC0+T3V0cHV0Q2hhbm5lbHMgPSBMYXN0IC0+T3V0cHV0Q2hhbm5lbHM7Ci0rICAgICAgICBpZiAoRmlyc3QgPT0gTlVMTCB8fCBMYXN0ID09IE5VTEwpIHJldHVybiBGQUxTRTsKLSsKLSsgICAgICAgIGx1dC0+SW5wdXRDaGFubmVscyA9IEZpcnN0LT5JbnB1dENoYW5uZWxzOwotKyAgICAgICAgbHV0LT5PdXRwdXRDaGFubmVscyA9IExhc3QtPk91dHB1dENoYW5uZWxzOwotKwotKyAgICAgICAgLy8gQ2hlY2sgY2hhaW4gY29uc2lzdGVuY3kKLSsgICAgICAgIHByZXYgPSBGaXJzdDsKLSsgICAgICAgIG5leHQgPSBwcmV2LT5OZXh0OwotKwotKyAgICAgICAgd2hpbGUgKG5leHQgIT0gTlVMTCkKLSsgICAgICAgIHsKLSsgICAgICAgICAgICBpZiAobmV4dC0+SW5wdXRDaGFubmVscyAhPSBwcmV2LT5PdXRwdXRDaGFubmVscykKLSsgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotKwotKyAgICAgICAgICAgIG5leHQgPSBuZXh0LT5OZXh0OwotKyAgICAgICAgICAgIHByZXYgPSBwcmV2LT5OZXh0OwotKyAgICAgICAgfQotICAgICB9Ci0rICAgIHJldHVybiBUUlVFOyAgICAKLSB9Ci0gCi0gCi1AQCAtMTMzMSw2ICsxMzQ5LDcgQEAgY21zUGlwZWxpbmUqIENNU0VYUE9SVCBjbXNQaXBlbGluZUFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgSW4KLSB7Ci0gICAgICAgIGNtc1BpcGVsaW5lKiBOZXdMVVQ7Ci0gCi0rICAgICAgIC8vIEEgdmFsdWUgb2YgemVybyBpbiBjaGFubmVscyBpcyBhbGxvd2VkIGFzIHBsYWNlaG9sZGVyCi0gICAgICAgIGlmIChJbnB1dENoYW5uZWxzID49IGNtc01BWENIQU5ORUxTIHx8Ci0gICAgICAgICAgICBPdXRwdXRDaGFubmVscyA+PSBjbXNNQVhDSEFOTkVMUykgcmV0dXJuIE5VTEw7Ci0gCi1AQCAtMTM0OCw3ICsxMzY3LDExIEBAIGNtc1BpcGVsaW5lKiBDTVNFWFBPUlQgY21zUGlwZWxpbmVBbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIEluCi0gICAgICAgIE5ld0xVVCAtPkRhdGEgICAgICAgID0gTmV3TFVUOwotICAgICAgICBOZXdMVVQgLT5Db250ZXh0SUQgICA9IENvbnRleHRJRDsKLSAKLS0gICAgICAgQmxlc3NMVVQoTmV3TFVUKTsKLSsgICAgICAgaWYgKCFCbGVzc0xVVChOZXdMVVQpKQotKyAgICAgICB7Ci0rICAgICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIE5ld0xVVCk7Ci0rICAgICAgICAgICByZXR1cm4gTlVMTDsKLSsgICAgICAgfQotIAotICAgICAgICByZXR1cm4gTmV3TFVUOwotIH0KLUBAIC0xNDU0LDcgKzE0NzcsMTIgQEAgY21zUGlwZWxpbmUqIENNU0VYUE9SVCBjbXNQaXBlbGluZUR1cChjb25zdCBjbXNQaXBlbGluZSogbHV0KQotIAotICAgICBOZXdMVVQgLT5TYXZlQXM4Qml0cyAgICA9IGx1dCAtPlNhdmVBczhCaXRzOwotIAotLSAgICBCbGVzc0xVVChOZXdMVVQpOwotKyAgICBpZiAoIUJsZXNzTFVUKE5ld0xVVCkpCi0rICAgIHsKLSsgICAgICAgIF9jbXNGcmVlKGx1dC0+Q29udGV4dElELCBOZXdMVVQpOwotKyAgICAgICAgcmV0dXJuIE5VTEw7Ci0rICAgIH0KLSsKLSAgICAgcmV0dXJuIE5ld0xVVDsKLSB9Ci0gCi1AQCAtMTQ5MSw4ICsxNTE5LDcgQEAgaW50IENNU0VYUE9SVCBjbXNQaXBlbGluZUluc2VydFN0YWdlKGNtc1BpcGVsaW5lKiBsdXQsIGNtc1N0YWdlTG9jIGxvYywgY21zU3RhZ2UKLSAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgIH0KLSAKLS0gICAgQmxlc3NMVVQobHV0KTsKLS0gICAgcmV0dXJuIFRSVUU7Ci0rICAgIHJldHVybiBCbGVzc0xVVChsdXQpOyAgICAKLSB9Ci0gCi0gLy8gVW5saW5rIGFuIGVsZW1lbnQgYW5kIHJldHVybiB0aGUgcG9pbnRlciB0byBpdAotQEAgLTE1NDcsNiArMTU3NCw3IEBAIHZvaWQgQ01TRVhQT1JUIGNtc1BpcGVsaW5lVW5saW5rU3RhZ2UoY21zUGlwZWxpbmUqIGx1dCwgY21zU3RhZ2VMb2MgbG9jLCBjbXNTdGFnCi0gICAgIGVsc2UKLSAgICAgICAgIGNtc1N0YWdlRnJlZShVbmxpbmtlZCk7Ci0gCi0rICAgIC8vIE1heSBmYWlsLCBidXQgd2UgaWdub3JlIGl0Ci0gICAgIEJsZXNzTFVUKGx1dCk7Ci0gfQotIAotQEAgLTE1NzMsOCArMTYwMSw3IEBAIGNtc0Jvb2wgIENNU0VYUE9SVCBjbXNQaXBlbGluZUNhdChjbXNQaXBlbGluZSogbDEsIGNvbnN0IGNtc1BpcGVsaW5lKiBsMikKLSAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICB9Ci0gCi0tICAgIEJsZXNzTFVUKGwxKTsKLS0gICAgcmV0dXJuIFRSVUU7Ci0rICAgIHJldHVybiBCbGVzc0xVVChsMSk7ICAgIAotIH0KLSAKLSAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMKLWluZGV4IGU1ZWQwNmMzMy4uMDI1NmUyNDdiIDEwMDY0NAotLS0tIGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN0eXBlcy5jCi0rKysgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMKLUBAIC0xNzU1LDggKzE3NTUsOCBAQCB2b2lkICpUeXBlX0xVVDhfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtcwotICAgICBpZiAoIV9jbXNSZWFkVUludDhOdW1iZXIoaW8sIE5VTEwpKSBnb3RvIEVycm9yOwotIAotICAgICAvLyBEbyBzb21lIGNoZWNraW5nCi0tICAgIGlmIChJbnB1dENoYW5uZWxzID4gY21zTUFYQ0hBTk5FTFMpICBnb3RvIEVycm9yOwotLSAgICBpZiAoT3V0cHV0Q2hhbm5lbHMgPiBjbXNNQVhDSEFOTkVMUykgZ290byBFcnJvcjsKLSsgICAgaWYgKElucHV0Q2hhbm5lbHMgPT0gMCB8fCBJbnB1dENoYW5uZWxzID4gY21zTUFYQ0hBTk5FTFMpICBnb3RvIEVycm9yOwotKyAgICBpZiAoT3V0cHV0Q2hhbm5lbHMgPT0gMCB8fCBPdXRwdXRDaGFubmVscyA+IGNtc01BWENIQU5ORUxTKSBnb3RvIEVycm9yOwotIAotICAgIC8vIEFsbG9jYXRlcyBhbiBlbXB0eSBQaXBlbGluZQotICAgICBOZXdMVVQgPSBjbXNQaXBlbGluZUFsbG9jKHNlbGYgLT5Db250ZXh0SUQsIElucHV0Q2hhbm5lbHMsIE91dHB1dENoYW5uZWxzKTsKLUBAIC0yMDQ4LDggKzIwNDgsOCBAQCB2b2lkICpUeXBlX0xVVDE2X1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbQotICAgICBpZiAoIV9jbXNSZWFkVUludDhOdW1iZXIoaW8sIE5VTEwpKSByZXR1cm4gTlVMTDsKLSAKLSAgICAgLy8gRG8gc29tZSBjaGVja2luZwotLSAgICBpZiAoSW5wdXRDaGFubmVscyA+IGNtc01BWENIQU5ORUxTKSAgZ290byBFcnJvcjsKLS0gICAgaWYgKE91dHB1dENoYW5uZWxzID4gY21zTUFYQ0hBTk5FTFMpIGdvdG8gRXJyb3I7Ci0rICAgIGlmIChJbnB1dENoYW5uZWxzID09IDAgfHwgSW5wdXRDaGFubmVscyA+IGNtc01BWENIQU5ORUxTKSAgZ290byBFcnJvcjsKLSsgICAgaWYgKE91dHB1dENoYW5uZWxzID09IDAgfHwgT3V0cHV0Q2hhbm5lbHMgPiBjbXNNQVhDSEFOTkVMUykgZ290byBFcnJvcjsKLSAKLSAgICAgLy8gQWxsb2NhdGVzIGFuIGVtcHR5IExVVAotICAgICBOZXdMVVQgPSBjbXNQaXBlbGluZUFsbG9jKHNlbGYgLT5Db250ZXh0SUQsIElucHV0Q2hhbm5lbHMsIE91dHB1dENoYW5uZWxzKTsKLUBAIC0yNDg2LDcgKzI0ODYsMTAgQEAgdm9pZCogVHlwZV9MVVRBMkJfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGMKLSAgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJm9mZnNldEMpKSByZXR1cm4gTlVMTDsKLSAgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJm9mZnNldEEpKSByZXR1cm4gTlVMTDsKLSAKLS0gICAvLyBBbGxvY2F0ZXMgYW4gZW1wdHkgTFVUCi0rICAgIGlmIChpbnB1dENoYW4gPT0gMCB8fCBpbnB1dENoYW4gPj0gY21zTUFYQ0hBTk5FTFMpIHJldHVybiBOVUxMOwotKyAgICBpZiAob3V0cHV0Q2hhbiA9PSAwIHx8IG91dHB1dENoYW4gPj0gY21zTUFYQ0hBTk5FTFMpIHJldHVybiBOVUxMOwotKwotKyAgICAvLyBBbGxvY2F0ZXMgYW4gZW1wdHkgTFVUCi0gICAgIE5ld0xVVCA9IGNtc1BpcGVsaW5lQWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgaW5wdXRDaGFuLCBvdXRwdXRDaGFuKTsKLSAgICAgaWYgKE5ld0xVVCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAKLUBAIC0yNzk0LDYgKzI3OTcsOSBAQCB2b2lkKiBUeXBlX0xVVEIyQV9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgYwotICAgICBpZiAoIV9jbXNSZWFkVUludDhOdW1iZXIoaW8sICZpbnB1dENoYW4pKSByZXR1cm4gTlVMTDsKLSAgICAgaWYgKCFfY21zUmVhZFVJbnQ4TnVtYmVyKGlvLCAmb3V0cHV0Q2hhbikpIHJldHVybiBOVUxMOwotIAotKyAgICBpZiAoaW5wdXRDaGFuID09IDAgfHwgaW5wdXRDaGFuID49IGNtc01BWENIQU5ORUxTKSByZXR1cm4gTlVMTDsKLSsgICAgaWYgKG91dHB1dENoYW4gPT0gMCB8fCBvdXRwdXRDaGFuID49IGNtc01BWENIQU5ORUxTKSByZXR1cm4gTlVMTDsKLSsKLSAgICAgLy8gUGFkZGluZwotICAgICBpZiAoIV9jbXNSZWFkVUludDE2TnVtYmVyKGlvLCBOVUxMKSkgcmV0dXJuIE5VTEw7Ci0gCi1AQCAtNDQ0Myw2ICs0NDQ5LDkgQEAgdm9pZCAqVHlwZV9NUEVfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1UKLSAgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgJklucHV0Q2hhbnMpKSByZXR1cm4gTlVMTDsKLSAgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgJk91dHB1dENoYW5zKSkgcmV0dXJuIE5VTEw7Ci0gCi0rICAgIGlmIChJbnB1dENoYW5zID09IDAgfHwgSW5wdXRDaGFucyA+PSBjbXNNQVhDSEFOTkVMUykgcmV0dXJuIE5VTEw7Ci0rICAgIGlmIChPdXRwdXRDaGFucyA9PSAwIHx8IE91dHB1dENoYW5zID49IGNtc01BWENIQU5ORUxTKSByZXR1cm4gTlVMTDsKLSsKLSAgICAgLy8gQWxsb2NhdGVzIGFuIGVtcHR5IExVVAotICAgICBOZXdMVVQgPSBjbXNQaXBlbGluZUFsbG9jKHNlbGYgLT5Db250ZXh0SUQsIElucHV0Q2hhbnMsIE91dHB1dENoYW5zKTsKLSAgICAgaWYgKE5ld0xVVCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDE3LXVwc3RyZWFtLWludGVnZXItb3ZlcmZsb3ctTVBFbWF0cml4X1JlYWQucGF0Y2ggYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvMDAxNy11cHN0cmVhbS1pbnRlZ2VyLW92ZXJmbG93LU1QRW1hdHJpeF9SZWFkLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2RmN2E4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi8wMDE3LXVwc3RyZWFtLWludGVnZXItb3ZlcmZsb3ctTVBFbWF0cml4X1JlYWQucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi1kaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNjZ2F0cy5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNjZ2F0cy5jCi1pbmRleCA1NzIwYzY2YTcuLmNjZTRjZWRiYSAxMDA2NDQKLS0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zY2dhdHMuYwotKysrIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNjZ2F0cy5jCi1AQCAtMTUwLDIzICsxNTAsMjQgQEAgdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICAgU1VCQUxMT0NBVE9SICAgQWxsb2NhdG9yOyAgICAgICAgICAgICAvLyBTdHJpbmcgc3ViYWxsb2NhdG9yIC0tIGp1c3QgdG8ga2VlcCBpdCBmYXN0Ci0gCi0gICAgICAgICAvLyBQYXJzZXIgc3RhdGUgbWFjaGluZQotLSAgICAgICAgU1lNQk9MICAgICAgICAgc3k7ICAgICAgICAgICAgICAgICAgICAvLyBDdXJyZW50IHN5bWJvbAotLSAgICAgICAgaW50ICAgICAgICAgICAgY2g7ICAgICAgICAgICAgICAgICAgICAvLyBDdXJyZW50IGNoYXJhY3RlcgotKyAgICAgICAgU1lNQk9MICAgICAgICAgICAgIHN5OyAgICAgICAgICAgICAgICAvLyBDdXJyZW50IHN5bWJvbAotKyAgICAgICAgaW50ICAgICAgICAgICAgICAgIGNoOyAgICAgICAgICAgICAgICAvLyBDdXJyZW50IGNoYXJhY3RlcgotKwotKyAgICAgICAgY21zSW50MzJOdW1iZXIgICAgIGludW07ICAgICAgICAgICAgICAvLyBpbnRlZ2VyIHZhbHVlCi0rICAgICAgICBjbXNGbG9hdDY0TnVtYmVyICAgZG51bTsgICAgICAgICAgICAgIC8vIHJlYWwgdmFsdWUKLSAKLS0gICAgICAgIGludCAgICAgICAgICAgIGludW07ICAgICAgICAgICAgICAgICAgLy8gaW50ZWdlciB2YWx1ZQotLSAgICAgICAgY21zRmxvYXQ2NE51bWJlciAgICAgICAgIGRudW07ICAgICAgICAgICAgICAgICAgLy8gcmVhbCB2YWx1ZQotICAgICAgICAgY2hhciAgICAgICAgICAgaWRbTUFYSURdOyAgICAgICAgICAgICAvLyBpZGVudGlmaWVyCi0gICAgICAgICBjaGFyICAgICAgICAgICBzdHJbTUFYU1RSXTsgICAgICAgICAgIC8vIHN0cmluZwotIAotICAgICAgICAgLy8gQWxsb3dlZCBrZXl3b3JkcyAmIGRhdGFzZXRzLiBUaGV5IGhhdmUgdmlzaWJpbGl0eSBvbiB3aG9sZSBzdHJlYW0KLS0gICAgICAgIEtFWVZBTFVFKiAgICAgVmFsaWRLZXl3b3JkczsKLS0gICAgICAgIEtFWVZBTFVFKiAgICAgVmFsaWRTYW1wbGVJRDsKLSsgICAgICAgIEtFWVZBTFVFKiAgICAgIFZhbGlkS2V5d29yZHM7Ci0rICAgICAgICBLRVlWQUxVRSogICAgICBWYWxpZFNhbXBsZUlEOwotIAotICAgICAgICAgY2hhciogICAgICAgICAgU291cmNlOyAgICAgICAgICAgICAgICAvLyBQb2ludHMgdG8gbG9jLiBiZWluZyBwYXJzZWQKLS0gICAgICAgIGludCAgICAgICAgICAgIGxpbmVubzsgICAgICAgICAgICAgICAgLy8gbGluZSBjb3VudGVyIGZvciBlcnJvciByZXBvcnRpbmcKLSsgICAgICAgIGNtc0ludDMyTnVtYmVyIGxpbmVubzsgICAgICAgICAgICAgICAgLy8gbGluZSBjb3VudGVyIGZvciBlcnJvciByZXBvcnRpbmcKLSAKLSAgICAgICAgIEZJTEVDVFgqICAgICAgIEZpbGVTdGFja1tNQVhJTkNMVURFXTsgLy8gU3RhY2sgb2YgZmlsZXMgYmVpbmcgcGFyc2VkCi0tICAgICAgICBpbnQgICAgICAgICAgICBJbmNsdWRlU1A7ICAgICAgICAgICAgIC8vIEluY2x1ZGUgU3RhY2sgUG9pbnRlcgotKyAgICAgICAgY21zSW50MzJOdW1iZXIgSW5jbHVkZVNQOyAgICAgICAgICAgICAvLyBJbmNsdWRlIFN0YWNrIFBvaW50ZXIKLSAKLSAgICAgICAgIGNoYXIqICAgICAgICAgIE1lbW9yeUJsb2NrOyAgICAgICAgICAgLy8gVGhlIHN0cmVhbSBpZiBob2xkZWQgaW4gbWVtb3J5Ci0gCi1AQCAtNTY4LDggKzU2OSw4IEBAIHZvaWQgUmVhZFJlYWwoY21zSVQ4KiBpdDgsIGludCBpbnVtKQotICAgICAvLyBFeHBvbmVudCwgZXhhbXBsZSAzNC4wMEUrMjAKLSAgICAgaWYgKHRvdXBwZXIoaXQ4LT5jaCkgPT0gJ0UnKSB7Ci0gCi0tICAgICAgICBpbnQgZTsKLS0gICAgICAgIGludCBzZ247Ci0rICAgICAgICBjbXNJbnQzMk51bWJlciBlOwotKyAgICAgICAgY21zSW50MzJOdW1iZXIgc2duOwotIAotICAgICAgICAgTmV4dENoKGl0OCk7IHNnbiA9IDE7Ci0gCi1AQCAtNTg3LDcgKzU4OCw3IEBAIHZvaWQgUmVhZFJlYWwoY21zSVQ4KiBpdDgsIGludCBpbnVtKQotICAgICAgICAgICAgIGUgPSAwOwotICAgICAgICAgICAgIHdoaWxlIChpc2RpZ2l0KGl0OC0+Y2gpKSB7Ci0gCi0tICAgICAgICAgICAgICAgIGlmICgoY21zRmxvYXQ2NE51bWJlcikgZSAqIDEwTCA8IElOVF9NQVgpCi0rICAgICAgICAgICAgICAgIGlmICgoY21zRmxvYXQ2NE51bWJlcikgZSAqIDEwTCA8IChjbXNGbG9hdDY0TnVtYmVyKSArMjE0NzQ4MzY0Ny4wKQotICAgICAgICAgICAgICAgICAgICAgZSA9IGUgKiAxMCArIChpdDgtPmNoIC0gJzAnKTsKLSAKLSAgICAgICAgICAgICAgICAgTmV4dENoKGl0OCk7Ci1AQCAtNzc3LDcgKzc3OCw3IEBAIHZvaWQgSW5TeW1ib2woY21zSVQ4KiBpdDgpCi0gCi0gICAgICAgICAgICAgICAgIHdoaWxlIChpc2RpZ2l0KGl0OC0+Y2gpKSB7Ci0gCi0tICAgICAgICAgICAgICAgICAgICBpZiAoKGxvbmcpIGl0OC0+aW51bSAqIDEwTCA+IChsb25nKSBJTlRfTUFYKSB7Ci0rICAgICAgICAgICAgICAgICAgICBpZiAoKGNtc0Zsb2F0NjROdW1iZXIpIGl0OC0+aW51bSAqIDEwTCA+IChjbXNGbG9hdDY0TnVtYmVyKSArMjE0NzQ4MzY0Ny4wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgUmVhZFJlYWwoaXQ4LCBpdDgtPmludW0pOwotICAgICAgICAgICAgICAgICAgICAgICAgIGl0OC0+c3kgPSBTRE5VTTsKLSAgICAgICAgICAgICAgICAgICAgICAgICBpdDgtPmRudW0gKj0gc2lnbjsKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMKLWluZGV4IDAyNTZlMjQ3Yi4uNzVmMWZhZTMyIDEwMDY0NAotLS0tIGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN0eXBlcy5jCi0rKysgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMKLUBAIC00MTk5LDkgKzQxOTksMTMgQEAgdm9pZCAqVHlwZV9NUEVtYXRyaXhfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8KLSAgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgJk91dHB1dENoYW5zKSkgcmV0dXJuIE5VTEw7Ci0gCi0gCi0rICAgIC8vIElucHV0IGFuZCBvdXRwdXQgY2hhbnMgbWF5IGJlIEFOWSAodXAgdG8gMHhmZmZmKSwgCi0rICAgIC8vIGJ1dCB3ZSBjaG9vc2UgdG8gbGltaXQgdG8gMTYgY2hhbm5lbHMgZm9yIG5vdwotKyAgICBpZiAoSW5wdXRDaGFucyA+PSBjbXNNQVhDSEFOTkVMUykgcmV0dXJuIE5VTEw7Ci0rICAgIGlmIChPdXRwdXRDaGFucyA+PSBjbXNNQVhDSEFOTkVMUykgcmV0dXJuIE5VTEw7Ci0rCi0gICAgIG5FbGVtcyA9IElucHV0Q2hhbnMgKiBPdXRwdXRDaGFuczsKLSAKLS0gICAgLy8gSW5wdXQgYW5kIG91dHB1dCBjaGFucyBtYXkgYmUgQU5ZICh1cCB0byAweGZmZmYpCi0gICAgIE1hdHJpeCA9IChjbXNGbG9hdDY0TnVtYmVyKikgX2Ntc0NhbGxvYyhzZWxmIC0+Q29udGV4dElELCBuRWxlbXMsIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKSk7Ci0gICAgIGlmIChNYXRyaXggPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0gCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvUkVBRE1FLnBkZml1bSBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9SRUFETUUucGRmaXVtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTA0Mjk4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9SRUFETUUucGRmaXVtCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotTmFtZTogTGl0dGxlIENNUwotVVJMOiBodHRwOi8vd3d3LmxpdHRsZWNtcy5jb20vCi1WZXJzaW9uOiAyLjYKLVNlY3VyaXR5IENyaXRpY2FsOiB5ZXMKLUxpY2Vuc2U6IE1JVCBMaWNlbnNlCi0KLURlc2NyaXB0aW9uOgotQ29sb3IgTWFuYWdlbWVudCBFbmdpbmUuCi0KLUxvY2FsIE1vZGlmaWNhdGlvbnM6Ci0KLTAwMDAtdGFnLXR5cGUtY29uZnVzaW9uLnBhdGNoOiBGaXggYSB0eXBlIGNvbmZ1c2lvbi4KLTAwMDEtZnJvbTE2LXRvLTgtb3ZlcmZsb3cucGF0Y2g6IFByZXZlbnQgYSBVQlNhbiB3YXJuaW5nLgotMDAwMi1pbmZpbml0ZS1sb29wLUdyb3dOYW1lZENvbG9yTGlzdC5wYXRjaDogRml4IGluZmluaXRlIGxvb3Agd2hlbiBjYWxsaW5nIEdyb3dOYW1lZENvbG9yTGlzdC4KLTAwMDMtdW5pbml0LnBhdGNoOiBGaXggdXNlIHVuaW5pdGlhbGl6ZWQgdmFsdWUgYW5kIHN0YWNrIGJ1ZmZlciBvdmVyZmxvdyByZWFkLgotMDAwNC1tZW1vcnktbGVhay1UeXBlX0N1cnZlX1JlYWQucGF0Y2g6IEZpeCBtZW1vcnkgbGVhayBpbiBUeXBlX0N1cnZlX1JlYWQuCi0wMDA1LW1lbW9yeS1sZWFrLUFsbG9jRW1wdHlUcmFuc2Zvcm0ucGF0Y2g6IEZpeCBtZW1vcnkgbGVhayBpbiBBbGxvY0VtcHR5VHJhbnNmb3JtLgotMDAwNi1tZW1vcnktbGVhay1UeXBlX05hbWVkQ29sb3JfUmVhZC5wYXRjaDogRml4IG1lbW9yeSBsZWFrIGluIFR5cGVfTmFtZWRDb2xvcl9SZWFkLgotMDAwNy1tZW1vcnktbGVhay1PcHRpbWl6ZUJ5UmVzYW1wbGluZy5wYXRjaDogRml4IG1lbW9yeSBsZWFrIGluIE9wdGltaXplQnlSZXNhbXBsaW5nLgotMDAwOC1tZW1vcnktbGVhay1UeXBlX01QRW1hdHJpeF9SZWFkLnBhdGNoOiBGaXggbWVtb3J5IGxlYWsgaW4gTVBFbWF0cml4X1JlYWQuCi0wMDA5LWNtc1N0YWdlQWxsb2NNYXRyaXgtcGFyYW0tc3dhcC5wYXRjaDogRml4IHJvd3MvY29scyBzd2FwIGluIGNtc1N0YWdlQWxsb2NNYXRyaXguCi0wMDEwLXJlamVjdC1uYW4ucGF0Y2g6IFJlamVjdCBOYU4gd2hlbiByZWFkaW5nIGZsb2F0IG51bWJlcnMuCi0wMDExLW1lbW9yeS1sZWFrLVJlYWRTZWdtZW50ZWRDdXJ2ZS5wYXRjaDogRml4IG1lbW9yeSBsZWFrIGluIFJlYWRTZWdtZW50ZWRDdXJ2ZS4KLTAwMTItYmFja3BvcnQtYzBhOThkODYucGF0Y2g6IEZpeCBzZXZlcmFsIGlzc3Vlcy4gQmFja3BvcnQgZnJvbSB1cHN0cmVhbQotICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9tbTIvTGl0dGxlLUNNUy9jb21taXQvYzBhOThkODYKLTAwMTMtdXRmOC5wYXRjaDogRW5jb2RlIHNvdXJjZSBmaWxlcyBhcyB1dGYtOC4KLTAwMTQtYXZvaWQtZml4ZWQtaW5mLnBhdGNoOiBBdm9pZCBmaXhlZCBudW1iZXIgTFVUIG9wdGltaXphdGlvbiBvbiBpbmYgdmFsdWVzLgotMDAxNS1zYW5pdGl6ZS1mbG9hdC1yZWFkLnBhdGNoOiBTYW5pdGl6ZSBmbG9hdGluZyBwb2ludCByZWFkLiBQYXJ0aWFsbHkgYmFja3BvcnQKLSAgICBmcm9tIHVwc3RyZWFtIGh0dHBzOi8vZ2l0aHViLmNvbS9tbTIvTGl0dGxlLUNNUy9jb21taXQvNDAxMWE2ZTMKLTAwMTYtY2hlY2stTFVULWFuZC1NUEUucGF0Y2g6IGNoZWNrIExVVCBjb25zaXN0ZW5jeSBhbmQgc2FuaXRpemUgTVBFIHByb2ZpbGVzLgotMDAxNy11cHN0cmVhbS1pbnRlZ2VyLW92ZXJmbG93LU1QRW1hdHJpeF9SZWFkLnBhdGNoOiBmaXggc29tZSBpbnRlZ2VyIG92ZXJmbG93cy4KLVRPRE8ob2NoYW5nKTogTGlzdCBvdGhlciBwYXRjaGVzLgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42L2luY2x1ZGUvbGNtczIuaCBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9pbmNsdWRlL2xjbXMyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1OTVmNzAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGNtczItMi42L2luY2x1ZGUvbGNtczIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4ODIgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTQgTWFydGkgTWFyaWEgU2FndWVyCi0vLwotLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0vLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0vLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0vLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLS8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQotLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLS8vCi0vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0vLwotLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0vLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KLS8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi0vLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCi0vLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0vLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLS8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gVmVyc2lvbiAyLjYKLS8vCi0KLSNpZm5kZWYgX2xjbXMyX0gKLQotLy8gKioqKioqKioqKiBDb25maWd1cmF0aW9uIHRvZ2dsZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0vLyBVbmNvbW1lbnQgdGhpcyBvbmUgaWYgeW91IGFyZSB1c2luZyBiaWcgZW5kaWFuIG1hY2hpbmVzCi0vLyAjZGVmaW5lIENNU19VU0VfQklHX0VORElBTiAgIDEKLQotLy8gVW5jb21tZW50IHRoaXMgb25lIGlmIHlvdXIgY29tcGlsZXIvbWFjaGluZSBkb2VzIE5PVCBzdXBwb3J0IHRoZQotLy8gImxvbmcgbG9uZyIgdHlwZS4KLS8vICNkZWZpbmUgQ01TX0RPTlRfVVNFX0lOVDY0ICAgICAgICAxCi0KLS8vIFVuY29tbWVudCB0aGlzIGlmIHlvdXIgY29tcGlsZXIgZG9lc24ndCB3b3JrIHdpdGggZmFzdCBmbG9vciBmdW5jdGlvbgotLy8gI2RlZmluZSBDTVNfRE9OVF9VU0VfRkFTVF9GTE9PUiAxCi0KLS8vIFVuY29tbWVudCB0aGlzIGxpbmUgaWYgeW91IHdhbnQgbGNtcyB0byB1c2UgdGhlIGJsYWNrIHBvaW50IHRhZyBpbiBwcm9maWxlLAotLy8gaWYgY29tbWVudGVkLCBsY21zIHdpbGwgY29tcHV0ZSB0aGUgYmxhY2sgcG9pbnQgYnkgaXRzIG93bi4KLS8vIEl0IGlzIHNhZmVyIHRvIGxlYXZlIGl0IGNvbW1lbnRlZCBvdXQKLS8vICNkZWZpbmUgQ01TX1VTRV9QUk9GSUxFX0JMQUNLX1BPSU5UX1RBRyAgICAxCi0KLS8vIFVuY29tbWVudCB0aGlzIGxpbmUgaWYgeW91IGFyZSBjb21waWxpbmcgYXMgQysrIGFuZCB3YW50IGEgQysrIEFQSQotLy8gI2RlZmluZSBDTVNfVVNFX0NQUF9BUEkKLQotLy8gVW5jb21tZW50IHRoaXMgbGluZSBpZiB5b3UgbmVlZCBzdHJpY3QgQ0dBVFMgc3ludGF4LiBNYWtlcyBDR0FUUyBmaWxlcyB0bwotLy8gcmVxdWlyZSAiS0VZV09SRCIgb24gdW5kZWZpbmVkIGlkZW50aWZpZXJzLCBrZWVwIGl0IGNvbWVudGVkIG91dCB1bmxlc3MgbmVlZGVkCi0vLyAjZGVmaW5lIENNU19TVFJJQ1RfQ0dBVFMgIDEKLQotLy8gVW5jb21tZW50IHRvIGdldCByaWQgb2YgdGhlIHRhYmxlcyBmb3IgImhhbGYiIGZsb2F0IHN1cHBvcnQKLS8vICNkZWZpbmUgQ01TX05PX0hBTEZfU1VQUE9SVCAxCi0KLS8vIFVuY29tbWVudCB0byBnZXQgcmlkIG9mIHB0aHJlYWRzL3dpbmRvd3MgZGVwZW5kZW5jeQotLy8gI2RlZmluZSBDTVNfTk9fUFRIUkVBRFMgIDEKLQotLy8gKioqKioqKioqKiBFbmQgb2YgY29uZmlndXJhdGlvbiB0b2dnbGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0vLyBOZWVkZWQgZm9yIHN0cmVhbXMKLSNpbmNsdWRlIDxzdGRpby5oPgotCi0vLyBOZWVkZWQgZm9yIHBvcnRhYmlsaXR5IChDOTkgcGVyIDcuMS4yKQotI2luY2x1ZGUgPGxpbWl0cy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2lmbmRlZiBDTVNfVVNFX0NQUF9BUEkKLSMgICBpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jICAgZW5kaWYKLSNlbmRpZgotCi0vLyBWZXJzaW9uL3JlbGVhc2UKLSNkZWZpbmUgTENNU19WRVJTSU9OICAgICAgICAyMDYwCi0KLS8vIEkgd2lsbCBnaXZlIHRoZSBjaGFuY2Ugb2YgcmVkZWZpbmluZyBiYXNpYyB0eXBlcyBmb3IgY29tcGlsZXJzIHRoYXQgYXJlIG5vdCBmdWxseSBDOTkgY29tcGxpYW50Ci0jaWZuZGVmIENNU19CQVNJQ19UWVBFU19BTFJFQURZX0RFRklORUQKLQotLy8gQmFzZSB0eXBlcwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyICAgICAgICBjbXNVSW50OE51bWJlcjsgICAvLyBUaGF0IGlzIGd1YXJhbnRlZWQgYnkgdGhlIEM5OSBzcGVjCi10eXBlZGVmIHNpZ25lZCBjaGFyICAgICAgICAgIGNtc0ludDhOdW1iZXI7ICAgIC8vIFRoYXQgaXMgZ3VhcmFudGVlZCBieSB0aGUgQzk5IHNwZWMKLQotI2lmIENIQVJfQklUICE9IDgKLSMgIGVycm9yICJVbmFibGUgdG8gZmluZCA4IGJpdCB0eXBlLCB1bnN1cHBvcnRlZCBjb21waWxlciIKLSNlbmRpZgotCi0vLyBJRUVFIGZsb2F0IHN0b3JhZ2UgbnVtYmVycwotdHlwZWRlZiBmbG9hdCAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyOwotdHlwZWRlZiBkb3VibGUgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyOwotCi0vLyAxNi1iaXQgYmFzZSB0eXBlcwotI2lmIChVU0hSVF9NQVggPT0gNjU1MzVVKQotIHR5cGVkZWYgdW5zaWduZWQgc2hvcnQgICAgICBjbXNVSW50MTZOdW1iZXI7Ci0jZWxpZiAoVUlOVF9NQVggPT0gNjU1MzVVKQotIHR5cGVkZWYgdW5zaWduZWQgaW50ICAgICAgICBjbXNVSW50MTZOdW1iZXI7Ci0jZWxzZQotIyAgZXJyb3IgIlVuYWJsZSB0byBmaW5kIDE2IGJpdHMgdW5zaWduZWQgdHlwZSwgdW5zdXBwb3J0ZWQgY29tcGlsZXIiCi0jZW5kaWYKLQotI2lmIChTSFJUX01BWCA9PSAzMjc2NykKLSAgdHlwZWRlZiAgc2hvcnQgICAgICAgICAgICAgY21zSW50MTZOdW1iZXI7Ci0jZWxpZiAoSU5UX01BWCA9PSAzMjc2NykKLSAgdHlwZWRlZiAgaW50ICAgICAgICAgICAgICAgY21zSW50MTZOdW1iZXI7Ci0jZWxzZQotIyAgZXJyb3IgIlVuYWJsZSB0byBmaW5kIDE2IGJpdHMgc2lnbmVkIHR5cGUsIHVuc3VwcG9ydGVkIGNvbXBpbGVyIgotI2VuZGlmCi0KLS8vIDMyLWJpdCBiYXNlIHR5cGUKLSNpZiAoVUlOVF9NQVggPT0gNDI5NDk2NzI5NVUpCi0gdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICAgIGNtc1VJbnQzMk51bWJlcjsKLSNlbGlmIChVTE9OR19NQVggPT0gNDI5NDk2NzI5NVUpCi0gdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgICAgIGNtc1VJbnQzMk51bWJlcjsKLSNlbHNlCi0jICBlcnJvciAiVW5hYmxlIHRvIGZpbmQgMzIgYml0IHVuc2lnbmVkIHR5cGUsIHVuc3VwcG9ydGVkIGNvbXBpbGVyIgotI2VuZGlmCi0KLSNpZiAoSU5UX01BWCA9PSArMjE0NzQ4MzY0NykKLSB0eXBlZGVmICBpbnQgICAgICAgICAgICAgICAgY21zSW50MzJOdW1iZXI7Ci0jZWxpZiAoTE9OR19NQVggPT0gKzIxNDc0ODM2NDcpCi0gdHlwZWRlZiAgbG9uZyAgICAgICAgICAgICAgIGNtc0ludDMyTnVtYmVyOwotI2Vsc2UKLSMgIGVycm9yICJVbmFibGUgdG8gZmluZCAzMiBiaXQgc2lnbmVkIHR5cGUsIHVuc3VwcG9ydGVkIGNvbXBpbGVyIgotI2VuZGlmCi0KLS8vIDY0LWJpdCBiYXNlIHR5cGVzCi0jaWZuZGVmIENNU19ET05UX1VTRV9JTlQ2NAotIyAgaWYgKFVMT05HX01BWCAgPT0gMTg0NDY3NDQwNzM3MDk1NTE2MTVVKQotICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyAgIGNtc1VJbnQ2NE51bWJlcjsKLSMgIGVsaWYgKFVMTE9OR19NQVggPT0gMTg0NDY3NDQwNzM3MDk1NTE2MTVVKQotICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgICBjbXNVSW50NjROdW1iZXI7Ci0jICBlbHNlCi0jICAgICBkZWZpbmUgQ01TX0RPTlRfVVNFX0lOVDY0IDEKLSMgIGVuZGlmCi0jICBpZiAoTE9OR19NQVggPT0gKzkyMjMzNzIwMzY4NTQ3NzU4MDcpCi0gICAgICB0eXBlZGVmICBsb25nICAgICAgICAgIGNtc0ludDY0TnVtYmVyOwotIyAgZWxpZiAoTExPTkdfTUFYID09ICs5MjIzMzcyMDM2ODU0Nzc1ODA3KQotICAgICAgdHlwZWRlZiAgbG9uZyBsb25nICAgICBjbXNJbnQ2NE51bWJlcjsKLSMgIGVsc2UKLSMgICAgIGRlZmluZSBDTVNfRE9OVF9VU0VfSU5UNjQgMQotIyAgZW5kaWYKLSNlbmRpZgotI2VuZGlmCi0KLS8vIEluIHRoZSBjYXNlIDY0IGJpdCBudW1iZXJzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjb21waWxlcgotI2lmZGVmIENNU19ET05UX1VTRV9JTlQ2NAotICAgIHR5cGVkZWYgY21zVUludDMyTnVtYmVyICAgICAgY21zVUludDY0TnVtYmVyWzJdOwotICAgIHR5cGVkZWYgY21zSW50MzJOdW1iZXIgICAgICAgY21zSW50NjROdW1iZXJbMl07Ci0jZW5kaWYKLQotLy8gRGVyaXZhdGl2ZSB0eXBlcwotdHlwZWRlZiBjbXNVSW50MzJOdW1iZXIgICAgICBjbXNTaWduYXR1cmU7Ci10eXBlZGVmIGNtc1VJbnQxNk51bWJlciAgICAgIGNtc1U4Rml4ZWQ4TnVtYmVyOwotdHlwZWRlZiBjbXNJbnQzMk51bWJlciAgICAgICBjbXNTMTVGaXhlZDE2TnVtYmVyOwotdHlwZWRlZiBjbXNVSW50MzJOdW1iZXIgICAgICBjbXNVMTZGaXhlZDE2TnVtYmVyOwotCi0vLyBCb29sZWFuIHR5cGUsIHdoaWNoIHdpbGwgYmUgdXNpbmcgdGhlIG5hdGl2ZSBpbnRlZ2VyCi10eXBlZGVmIGludCAgICAgICAgICAgICAgICAgIGNtc0Jvb2w7Ci0KLS8vIFRyeSB0byBkZXRlY3Qgd2luZG93cwotI2lmIGRlZmluZWQgKF9XSU4zMikgfHwgZGVmaW5lZChfV0lONjQpIHx8IGRlZmluZWQoV0lOMzIpIHx8IGRlZmluZWQoX1dJTjMyXykKLSMgIGRlZmluZSBDTVNfSVNfV0lORE9XU18gMQotI2VuZGlmCi0KLSNpZmRlZiBfTVNDX1ZFUgotIyAgZGVmaW5lIENNU19JU19XSU5ET1dTXyAxCi0jZW5kaWYKLQotI2lmZGVmIF9fQk9STEFORENfXwotIyAgZGVmaW5lIENNU19JU19XSU5ET1dTXyAxCi0jZW5kaWYKLQotLy8gVHJ5IHRvIGRldGVjdCBiaWcgZW5kaWFuIHBsYXRmb3Jtcy4gVGhpcyBsaXN0IGNhbiBiZSBlbmRsZXNzLCBzbyBvbmx5IHNvbWUgY2hlY2tzIGFyZSBwZXJmb3JtZWQgb3ZlciBoZXJlLgotLy8geW91IGNhbiBwYXNzIHRoaXMgdG9nZ2xlIHRvIHRoZSBjb21waWxlciBieSB1c2luZyAtRENNU19VU0VfQklHX0VORElBTiBvciBzb21ldGhpbmcgc2ltaWxhcgotCi0jaWYgZGVmaW5lZChfX3NnaV9fKSB8fCBkZWZpbmVkKF9fc2dpKSB8fCBkZWZpbmVkKHNwYXJjKQotIyAgIGRlZmluZSBDTVNfVVNFX0JJR19FTkRJQU4gICAgICAxCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19zMzkwX18pIHx8IGRlZmluZWQoX19zMzkweF9fKQotIyAgIGRlZmluZSBDTVNfVVNFX0JJR19FTkRJQU4gICAxCi0jZW5kaWYKLQotIyAgaWZkZWYgVEFSR0VUX0NQVV9QUEMKLSMgICAgaWYgVEFSR0VUX0NQVV9QUEMKLSMgICAgICBkZWZpbmUgQ01TX1VTRV9CSUdfRU5ESUFOICAgMQotIyAgICBlbmRpZgotIyAgZW5kaWYKLQotI2lmIGRlZmluZWQoX19wb3dlcnBjX18pIHx8IGRlZmluZWQoX19wcGNfXykgfHwgZGVmaW5lZChUQVJHRVRfQ1BVX1BQQykKLSMgICBkZWZpbmUgQ01TX1VTRV9CSUdfRU5ESUFOICAgMQotIyAgIGlmIGRlZmluZWQgKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fQllURV9PUkRFUikgJiYgZGVmaW5lZChfX0xJVFRMRV9FTkRJQU4pCi0jICAgICAgIGlmIF9fQllURV9PUkRFUiAgPT0gX19MSVRUTEVfRU5ESUFOCi0vLyAgICAgICAgICAgICAgIC8vIERvbid0IHVzZSBiaWcgZW5kaWFuIGZvciBQb3dlclBDIGxpdHRsZSBlbmRpYW4gbW9kZQotIyAgICAgICAgICAgICAgICB1bmRlZiBDTVNfVVNFX0JJR19FTkRJQU4KLSMgICAgICAgZW5kaWYKLSMgICBlbmRpZgotI2VuZGlmCi0KLS8vIFdPUkRTX0JJR0VORElBTiB0YWtlcyBwcmVjZWRlbmNlCi0jaWYgZGVmaW5lZChfSE9TVF9CSUdfRU5ESUFOKSB8fCBkZWZpbmVkKF9fQklHX0VORElBTl9fKSB8fCBkZWZpbmVkKFdPUkRTX0JJR0VORElBTikKLSMgICBkZWZpbmUgQ01TX1VTRV9CSUdfRU5ESUFOICAgICAgMQotI2VuZGlmCi0KLSNpZmRlZiBtYWNpbnRvc2gKLSMgaWZkZWYgX19CSUdfRU5ESUFOX18KLSMgICBkZWZpbmUgQ01TX1VTRV9CSUdfRU5ESUFOICAgICAgMQotIyBlbmRpZgotIyBpZmRlZiBfX0xJVFRMRV9FTkRJQU5fXwotIyAgIHVuZGVmIENNU19VU0VfQklHX0VORElBTgotIyBlbmRpZgotI2VuZGlmCi0KLS8vIENhbGxpbmcgY29udmVudGlvbiAtLSB0aGlzIGlzIGhhcmRseSBwbGF0Zm9ybSBhbmQgY29tcGlsZXIgZGVwZW5kZW50Ci0jaWZkZWYgQ01TX0lTX1dJTkRPV1NfCi0jICBpZiBkZWZpbmVkKENNU19ETEwpIHx8IGRlZmluZWQoQ01TX0RMTF9CVUlMRCkKLSMgICAgIGlmZGVmIF9fQk9STEFORENfXwotIyAgICAgICAgZGVmaW5lIENNU0VYUE9SVCAgICAgICBfX3N0ZGNhbGwgX2V4cG9ydAotIyAgICAgICAgZGVmaW5lIENNU0FQSQotIyAgICAgZWxzZQotIyAgICAgICAgZGVmaW5lIENNU0VYUE9SVCAgICAgIF9zdGRjYWxsCi0jICAgICAgICBpZmRlZiBDTVNfRExMX0JVSUxECi0jICAgICAgICAgICAgZGVmaW5lIENNU0FQSSAgICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSMgICAgICAgIGVsc2UKLSMgICAgICAgICAgIGRlZmluZSBDTVNBUEkgICAgIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQotIyAgICAgICBlbmRpZgotIyAgICAgZW5kaWYKLSMgIGVsc2UKLSMgICAgICAgZGVmaW5lIENNU0VYUE9SVAotIyAgICAgICBkZWZpbmUgQ01TQVBJCi0jICBlbmRpZgotI2Vsc2UKLSMgZGVmaW5lIENNU0VYUE9SVAotIyBkZWZpbmUgQ01TQVBJCi0jZW5kaWYKLQotI2lmZGVmIEhhc1RIUkVBRFMKLSMgaWYgSGFzVEhSRUFEUyA9PSAxCi0jICAgIHVuZGVmIENNU19OT19QVEhSRUFEUwotIyBlbHNlCi0jICAgIGRlZmluZSBDTVNfTk9fUFRIUkVBRFMgMQotIyBlbmRpZgotI2VuZGlmCi0KLS8vIFNvbWUgY29tbW9uIGRlZmluaXRpb25zCi0jZGVmaW5lIGNtc01BWF9QQVRIICAgICAyNTYKLQotI2lmbmRlZiBGQUxTRQotIyAgICAgICBkZWZpbmUgRkFMU0UgMAotI2VuZGlmCi0jaWZuZGVmIFRSVUUKLSMgICAgICAgZGVmaW5lIFRSVUUgIDEKLSNlbmRpZgotCi0vLyBENTAgWFlaIG5vcm1hbGl6ZWQgdG8gWT0xLjAKLSNkZWZpbmUgY21zRDUwWCAgICAgICAgICAgICAwLjk2NDIKLSNkZWZpbmUgY21zRDUwWSAgICAgICAgICAgICAxLjAKLSNkZWZpbmUgY21zRDUwWiAgICAgICAgICAgICAwLjgyNDkKLQotLy8gVjQgcGVyY2VwdHVhbCBibGFjawotI2RlZmluZSBjbXNQRVJDRVBUVUFMX0JMQUNLX1ggIDAuMDAzMzYKLSNkZWZpbmUgY21zUEVSQ0VQVFVBTF9CTEFDS19ZICAwLjAwMzQ3MzEKLSNkZWZpbmUgY21zUEVSQ0VQVFVBTF9CTEFDS19aICAwLjAwMjg3Ci0KLS8vIERlZmluaXRpb25zIGluIElDQyBzcGVjCi0jZGVmaW5lIGNtc01hZ2ljTnVtYmVyICAgICAgMHg2MTYzNzM3MCAgICAgLy8gJ2Fjc3AnCi0jZGVmaW5lIGxjbXNTaWduYXR1cmUgICAgICAgMHg2YzYzNmQ3MyAgICAgLy8gJ2xjbXMnCi0KLQotLy8gQmFzZSBJQ0MgdHlwZSBkZWZpbml0aW9ucwotdHlwZWRlZiBlbnVtIHsKLSAgICBjbXNTaWdDaHJvbWF0aWNpdHlUeXBlICAgICAgICAgICAgICAgICAgPSAweDYzNjg3MjZELCAgLy8gJ2Nocm0nCi0gICAgY21zU2lnQ29sb3JhbnRPcmRlclR5cGUgICAgICAgICAgICAgICAgID0gMHg2MzZDNzI2RiwgIC8vICdjbHJvJwotICAgIGNtc1NpZ0NvbG9yYW50VGFibGVUeXBlICAgICAgICAgICAgICAgICA9IDB4NjM2QzcyNzQsICAvLyAnY2xydCcKLSAgICBjbXNTaWdDcmRJbmZvVHlwZSAgICAgICAgICAgICAgICAgICAgICAgPSAweDYzNzI2NDY5LCAgLy8gJ2NyZGknCi0gICAgY21zU2lnQ3VydmVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg2Mzc1NzI3NiwgIC8vICdjdXJ2JwotICAgIGNtc1NpZ0RhdGFUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NjQ2MTc0NjEsICAvLyAnZGF0YScKLSAgICBjbXNTaWdEaWN0VHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDY0Njk2Mzc0LCAgLy8gJ2RpY3QnCi0gICAgY21zU2lnRGF0ZVRpbWVUeXBlICAgICAgICAgICAgICAgICAgICAgID0gMHg2NDc0Njk2RCwgIC8vICdkdGltJwotICAgIGNtc1NpZ0RldmljZVNldHRpbmdzVHlwZSAgICAgICAgICAgICAgICA9IDB4NjQ2NTc2NzMsICAvLyAnZGV2cycKLSAgICBjbXNTaWdMdXQxNlR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDZkNjY3NDMyLCAgLy8gJ21mdDInCi0gICAgY21zU2lnTHV0OFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg2ZDY2NzQzMSwgIC8vICdtZnQxJwotICAgIGNtc1NpZ0x1dEF0b0JUeXBlICAgICAgICAgICAgICAgICAgICAgICA9IDB4NmQ0MTQyMjAsICAvLyAnbUFCICcKLSAgICBjbXNTaWdMdXRCdG9BVHlwZSAgICAgICAgICAgICAgICAgICAgICAgPSAweDZkNDI0MTIwLCAgLy8gJ21CQSAnCi0gICAgY21zU2lnTWVhc3VyZW1lbnRUeXBlICAgICAgICAgICAgICAgICAgID0gMHg2RDY1NjE3MywgIC8vICdtZWFzJwotICAgIGNtc1NpZ011bHRpTG9jYWxpemVkVW5pY29kZVR5cGUgICAgICAgICA9IDB4NkQ2Qzc1NjMsICAvLyAnbWx1YycKLSAgICBjbXNTaWdNdWx0aVByb2Nlc3NFbGVtZW50VHlwZSAgICAgICAgICAgPSAweDZENzA2NTc0LCAgLy8gJ21wZXQnCi0gICAgY21zU2lnTmFtZWRDb2xvclR5cGUgICAgICAgICAgICAgICAgICAgID0gMHg2RTYzNmY2QywgIC8vICduY29sJyAtLSBERVBSRUNBVEVEIQotICAgIGNtc1NpZ05hbWVkQ29sb3IyVHlwZSAgICAgICAgICAgICAgICAgICA9IDB4NkU2MzZDMzIsICAvLyAnbmNsMicKLSAgICBjbXNTaWdQYXJhbWV0cmljQ3VydmVUeXBlICAgICAgICAgICAgICAgPSAweDcwNjE3MjYxLCAgLy8gJ3BhcmEnCi0gICAgY21zU2lnUHJvZmlsZVNlcXVlbmNlRGVzY1R5cGUgICAgICAgICAgID0gMHg3MDczNjU3MSwgIC8vICdwc2VxJwotICAgIGNtc1NpZ1Byb2ZpbGVTZXF1ZW5jZUlkVHlwZSAgICAgICAgICAgICA9IDB4NzA3MzY5NjQsICAvLyAncHNpZCcKLSAgICBjbXNTaWdSZXNwb25zZUN1cnZlU2V0MTZUeXBlICAgICAgICAgICAgPSAweDcyNjM3MzMyLCAgLy8gJ3JjczInCi0gICAgY21zU2lnUzE1Rml4ZWQxNkFycmF5VHlwZSAgICAgICAgICAgICAgID0gMHg3MzY2MzMzMiwgIC8vICdzZjMyJwotICAgIGNtc1NpZ1NjcmVlbmluZ1R5cGUgICAgICAgICAgICAgICAgICAgICA9IDB4NzM2MzcyNkUsICAvLyAnc2NybicKLSAgICBjbXNTaWdTaWduYXR1cmVUeXBlICAgICAgICAgICAgICAgICAgICAgPSAweDczNjk2NzIwLCAgLy8gJ3NpZyAnCi0gICAgY21zU2lnVGV4dFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg3NDY1Nzg3NCwgIC8vICd0ZXh0JwotICAgIGNtc1NpZ1RleHREZXNjcmlwdGlvblR5cGUgICAgICAgICAgICAgICA9IDB4NjQ2NTczNjMsICAvLyAnZGVzYycKLSAgICBjbXNTaWdVMTZGaXhlZDE2QXJyYXlUeXBlICAgICAgICAgICAgICAgPSAweDc1NjYzMzMyLCAgLy8gJ3VmMzInCi0gICAgY21zU2lnVWNyQmdUeXBlICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg2MjY2NjQyMCwgIC8vICdiZmQgJwotICAgIGNtc1NpZ1VJbnQxNkFycmF5VHlwZSAgICAgICAgICAgICAgICAgICA9IDB4NzU2OTMxMzYsICAvLyAndWkxNicKLSAgICBjbXNTaWdVSW50MzJBcnJheVR5cGUgICAgICAgICAgICAgICAgICAgPSAweDc1NjkzMzMyLCAgLy8gJ3VpMzInCi0gICAgY21zU2lnVUludDY0QXJyYXlUeXBlICAgICAgICAgICAgICAgICAgID0gMHg3NTY5MzYzNCwgIC8vICd1aTY0JwotICAgIGNtc1NpZ1VJbnQ4QXJyYXlUeXBlICAgICAgICAgICAgICAgICAgICA9IDB4NzU2OTMwMzgsICAvLyAndWkwOCcKLSAgICBjbXNTaWdWY2d0VHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDc2NjM2Nzc0LCAgLy8gJ3ZjZ3QnCi0gICAgY21zU2lnVmlld2luZ0NvbmRpdGlvbnNUeXBlICAgICAgICAgICAgID0gMHg3NjY5NjU3NywgIC8vICd2aWV3JwotICAgIGNtc1NpZ1hZWlR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NTg1OTVBMjAgICAvLyAnWFlaICcKLQotCi19IGNtc1RhZ1R5cGVTaWduYXR1cmU7Ci0KLS8vIEJhc2UgSUNDIHRhZyBkZWZpbml0aW9ucwotdHlwZWRlZiBlbnVtIHsKLSAgICBjbXNTaWdBVG9CMFRhZyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQxMzI0MjMwLCAgLy8gJ0EyQjAnCi0gICAgY21zU2lnQVRvQjFUYWcgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MTMyNDIzMSwgIC8vICdBMkIxJwotICAgIGNtc1NpZ0FUb0IyVGFnICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDEzMjQyMzIsICAvLyAnQTJCMicKLSAgICBjbXNTaWdCbHVlQ29sb3JhbnRUYWcgICAgICAgICAgICAgICAgICAgPSAweDYyNTg1OTVBLCAgLy8gJ2JYWVonCi0gICAgY21zU2lnQmx1ZU1hdHJpeENvbHVtblRhZyAgICAgICAgICAgICAgID0gMHg2MjU4NTk1QSwgIC8vICdiWFlaJwotICAgIGNtc1NpZ0JsdWVUUkNUYWcgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NjI1NDUyNDMsICAvLyAnYlRSQycKLSAgICBjbXNTaWdCVG9BMFRhZyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQyMzI0MTMwLCAgLy8gJ0IyQTAnCi0gICAgY21zU2lnQlRvQTFUYWcgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MjMyNDEzMSwgIC8vICdCMkExJwotICAgIGNtc1NpZ0JUb0EyVGFnICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDIzMjQxMzIsICAvLyAnQjJBMicKLSAgICBjbXNTaWdDYWxpYnJhdGlvbkRhdGVUaW1lVGFnICAgICAgICAgICAgPSAweDYzNjE2Qzc0LCAgLy8gJ2NhbHQnCi0gICAgY21zU2lnQ2hhclRhcmdldFRhZyAgICAgICAgICAgICAgICAgICAgID0gMHg3NDYxNzI2NywgIC8vICd0YXJnJwotICAgIGNtc1NpZ0Nocm9tYXRpY0FkYXB0YXRpb25UYWcgICAgICAgICAgICA9IDB4NjM2ODYxNjQsICAvLyAnY2hhZCcKLSAgICBjbXNTaWdDaHJvbWF0aWNpdHlUYWcgICAgICAgICAgICAgICAgICAgPSAweDYzNjg3MjZELCAgLy8gJ2Nocm0nCi0gICAgY21zU2lnQ29sb3JhbnRPcmRlclRhZyAgICAgICAgICAgICAgICAgID0gMHg2MzZDNzI2RiwgIC8vICdjbHJvJwotICAgIGNtc1NpZ0NvbG9yYW50VGFibGVUYWcgICAgICAgICAgICAgICAgICA9IDB4NjM2QzcyNzQsICAvLyAnY2xydCcKLSAgICBjbXNTaWdDb2xvcmFudFRhYmxlT3V0VGFnICAgICAgICAgICAgICAgPSAweDYzNkM2Rjc0LCAgLy8gJ2Nsb3QnCi0gICAgY21zU2lnQ29sb3JpbWV0cmljSW50ZW50SW1hZ2VTdGF0ZVRhZyAgID0gMHg2MzY5Njk3MywgIC8vICdjaWlzJwotICAgIGNtc1NpZ0NvcHlyaWdodFRhZyAgICAgICAgICAgICAgICAgICAgICA9IDB4NjM3MDcyNzQsICAvLyAnY3BydCcKLSAgICBjbXNTaWdDcmRJbmZvVGFnICAgICAgICAgICAgICAgICAgICAgICAgPSAweDYzNzI2NDY5LCAgLy8gJ2NyZGknCi0gICAgY21zU2lnRGF0YVRhZyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg2NDYxNzQ2MSwgIC8vICdkYXRhJwotICAgIGNtc1NpZ0RhdGVUaW1lVGFnICAgICAgICAgICAgICAgICAgICAgICA9IDB4NjQ3NDY5NkQsICAvLyAnZHRpbScKLSAgICBjbXNTaWdEZXZpY2VNZmdEZXNjVGFnICAgICAgICAgICAgICAgICAgPSAweDY0NkQ2RTY0LCAgLy8gJ2RtbmQnCi0gICAgY21zU2lnRGV2aWNlTW9kZWxEZXNjVGFnICAgICAgICAgICAgICAgID0gMHg2NDZENjQ2NCwgIC8vICdkbWRkJwotICAgIGNtc1NpZ0RldmljZVNldHRpbmdzVGFnICAgICAgICAgICAgICAgICA9IDB4NjQ2NTc2NzMsICAvLyAnZGV2cycKLSAgICBjbXNTaWdEVG9CMFRhZyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQ0MzI0MjMwLCAgLy8gJ0QyQjAnCi0gICAgY21zU2lnRFRvQjFUYWcgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0NDMyNDIzMSwgIC8vICdEMkIxJwotICAgIGNtc1NpZ0RUb0IyVGFnICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDQzMjQyMzIsICAvLyAnRDJCMicKLSAgICBjbXNTaWdEVG9CM1RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQ0MzI0MjMzLCAgLy8gJ0QyQjMnCi0gICAgY21zU2lnQlRvRDBUYWcgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MjMyNDQzMCwgIC8vICdCMkQwJwotICAgIGNtc1NpZ0JUb0QxVGFnICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDIzMjQ0MzEsICAvLyAnQjJEMScKLSAgICBjbXNTaWdCVG9EMlRhZyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQyMzI0NDMyLCAgLy8gJ0IyRDInCi0gICAgY21zU2lnQlRvRDNUYWcgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MjMyNDQzMywgIC8vICdCMkQzJwotICAgIGNtc1NpZ0dhbXV0VGFnICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4Njc2MTZENzQsICAvLyAnZ2FtdCcKLSAgICBjbXNTaWdHcmF5VFJDVGFnICAgICAgICAgICAgICAgICAgICAgICAgPSAweDZiNTQ1MjQzLCAgLy8gJ2tUUkMnCi0gICAgY21zU2lnR3JlZW5Db2xvcmFudFRhZyAgICAgICAgICAgICAgICAgID0gMHg2NzU4NTk1QSwgIC8vICdnWFlaJwotICAgIGNtc1NpZ0dyZWVuTWF0cml4Q29sdW1uVGFnICAgICAgICAgICAgICA9IDB4Njc1ODU5NUEsICAvLyAnZ1hZWicKLSAgICBjbXNTaWdHcmVlblRSQ1RhZyAgICAgICAgICAgICAgICAgICAgICAgPSAweDY3NTQ1MjQzLCAgLy8gJ2dUUkMnCi0gICAgY21zU2lnTHVtaW5hbmNlVGFnICAgICAgICAgICAgICAgICAgICAgID0gMHg2Qzc1NmQ2OSwgIC8vICdsdW1pJwotICAgIGNtc1NpZ01lYXN1cmVtZW50VGFnICAgICAgICAgICAgICAgICAgICA9IDB4NkQ2NTYxNzMsICAvLyAnbWVhcycKLSAgICBjbXNTaWdNZWRpYUJsYWNrUG9pbnRUYWcgICAgICAgICAgICAgICAgPSAweDYyNkI3MDc0LCAgLy8gJ2JrcHQnCi0gICAgY21zU2lnTWVkaWFXaGl0ZVBvaW50VGFnICAgICAgICAgICAgICAgID0gMHg3Nzc0NzA3NCwgIC8vICd3dHB0JwotICAgIGNtc1NpZ05hbWVkQ29sb3JUYWcgICAgICAgICAgICAgICAgICAgICA9IDB4NkU2MzZmNkMsICAvLyAnbmNvbCcgLy8gRGVwcmVjYXRlZCBieSB0aGUgSUNDCi0gICAgY21zU2lnTmFtZWRDb2xvcjJUYWcgICAgICAgICAgICAgICAgICAgID0gMHg2RTYzNkMzMiwgIC8vICduY2wyJwotICAgIGNtc1NpZ091dHB1dFJlc3BvbnNlVGFnICAgICAgICAgICAgICAgICA9IDB4NzI2NTczNzAsICAvLyAncmVzcCcKLSAgICBjbXNTaWdQZXJjZXB0dWFsUmVuZGVyaW5nSW50ZW50R2FtdXRUYWcgPSAweDcyNjk2NzMwLCAgLy8gJ3JpZzAnCi0gICAgY21zU2lnUHJldmlldzBUYWcgICAgICAgICAgICAgICAgICAgICAgID0gMHg3MDcyNjUzMCwgIC8vICdwcmUwJwotICAgIGNtc1NpZ1ByZXZpZXcxVGFnICAgICAgICAgICAgICAgICAgICAgICA9IDB4NzA3MjY1MzEsICAvLyAncHJlMScKLSAgICBjbXNTaWdQcmV2aWV3MlRhZyAgICAgICAgICAgICAgICAgICAgICAgPSAweDcwNzI2NTMyLCAgLy8gJ3ByZTInCi0gICAgY21zU2lnUHJvZmlsZURlc2NyaXB0aW9uVGFnICAgICAgICAgICAgID0gMHg2NDY1NzM2MywgIC8vICdkZXNjJwotICAgIGNtc1NpZ1Byb2ZpbGVEZXNjcmlwdGlvbk1MVGFnICAgICAgICAgICA9IDB4NjQ3MzYzNmQsICAvLyAnZHNjbScKLSAgICBjbXNTaWdQcm9maWxlU2VxdWVuY2VEZXNjVGFnICAgICAgICAgICAgPSAweDcwNzM2NTcxLCAgLy8gJ3BzZXEnCi0gICAgY21zU2lnUHJvZmlsZVNlcXVlbmNlSWRUYWcgICAgICAgICAgICAgID0gMHg3MDczNjk2NCwgIC8vICdwc2lkJwotICAgIGNtc1NpZ1BzMkNSRDBUYWcgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NzA3MzY0MzAsICAvLyAncHNkMCcKLSAgICBjbXNTaWdQczJDUkQxVGFnICAgICAgICAgICAgICAgICAgICAgICAgPSAweDcwNzM2NDMxLCAgLy8gJ3BzZDEnCi0gICAgY21zU2lnUHMyQ1JEMlRhZyAgICAgICAgICAgICAgICAgICAgICAgID0gMHg3MDczNjQzMiwgIC8vICdwc2QyJwotICAgIGNtc1NpZ1BzMkNSRDNUYWcgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NzA3MzY0MzMsICAvLyAncHNkMycKLSAgICBjbXNTaWdQczJDU0FUYWcgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDcwNzMzMjczLCAgLy8gJ3BzMnMnCi0gICAgY21zU2lnUHMyUmVuZGVyaW5nSW50ZW50VGFnICAgICAgICAgICAgID0gMHg3MDczMzI2OSwgIC8vICdwczJpJwotICAgIGNtc1NpZ1JlZENvbG9yYW50VGFnICAgICAgICAgICAgICAgICAgICA9IDB4NzI1ODU5NUEsICAvLyAnclhZWicKLSAgICBjbXNTaWdSZWRNYXRyaXhDb2x1bW5UYWcgICAgICAgICAgICAgICAgPSAweDcyNTg1OTVBLCAgLy8gJ3JYWVonCi0gICAgY21zU2lnUmVkVFJDVGFnICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg3MjU0NTI0MywgIC8vICdyVFJDJwotICAgIGNtc1NpZ1NhdHVyYXRpb25SZW5kZXJpbmdJbnRlbnRHYW11dFRhZyA9IDB4NzI2OTY3MzIsICAvLyAncmlnMicKLSAgICBjbXNTaWdTY3JlZW5pbmdEZXNjVGFnICAgICAgICAgICAgICAgICAgPSAweDczNjM3MjY0LCAgLy8gJ3NjcmQnCi0gICAgY21zU2lnU2NyZWVuaW5nVGFnICAgICAgICAgICAgICAgICAgICAgID0gMHg3MzYzNzI2RSwgIC8vICdzY3JuJwotICAgIGNtc1NpZ1RlY2hub2xvZ3lUYWcgICAgICAgICAgICAgICAgICAgICA9IDB4NzQ2NTYzNjgsICAvLyAndGVjaCcKLSAgICBjbXNTaWdVY3JCZ1RhZyAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDYyNjY2NDIwLCAgLy8gJ2JmZCAnCi0gICAgY21zU2lnVmlld2luZ0NvbmREZXNjVGFnICAgICAgICAgICAgICAgID0gMHg3Njc1NjU2NCwgIC8vICd2dWVkJwotICAgIGNtc1NpZ1ZpZXdpbmdDb25kaXRpb25zVGFnICAgICAgICAgICAgICA9IDB4NzY2OTY1NzcsICAvLyAndmlldycKLSAgICBjbXNTaWdWY2d0VGFnICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDc2NjM2Nzc0LCAgLy8gJ3ZjZ3QnCi0gICAgY21zU2lnTWV0YVRhZyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg2RDY1NzQ2MSAgIC8vICdtZXRhJwotCi19IGNtc1RhZ1NpZ25hdHVyZTsKLQotCi0vLyBJQ0MgVGVjaG5vbG9neSB0YWcKLXR5cGVkZWYgZW51bSB7Ci0gICAgY21zU2lnRGlnaXRhbENhbWVyYSAgICAgICAgICAgICAgICAgICAgID0gMHg2NDYzNjE2RCwgIC8vICdkY2FtJwotICAgIGNtc1NpZ0ZpbG1TY2FubmVyICAgICAgICAgICAgICAgICAgICAgICA9IDB4NjY3MzYzNkUsICAvLyAnZnNjbicKLSAgICBjbXNTaWdSZWZsZWN0aXZlU2Nhbm5lciAgICAgICAgICAgICAgICAgPSAweDcyNzM2MzZFLCAgLy8gJ3JzY24nCi0gICAgY21zU2lnSW5rSmV0UHJpbnRlciAgICAgICAgICAgICAgICAgICAgID0gMHg2OTZBNjU3NCwgIC8vICdpamV0JwotICAgIGNtc1NpZ1RoZXJtYWxXYXhQcmludGVyICAgICAgICAgICAgICAgICA9IDB4NzQ3NzYxNzgsICAvLyAndHdheCcKLSAgICBjbXNTaWdFbGVjdHJvcGhvdG9ncmFwaGljUHJpbnRlciAgICAgICAgPSAweDY1NzA2ODZGLCAgLy8gJ2VwaG8nCi0gICAgY21zU2lnRWxlY3Ryb3N0YXRpY1ByaW50ZXIgICAgICAgICAgICAgID0gMHg2NTczNzQ2MSwgIC8vICdlc3RhJwotICAgIGNtc1NpZ0R5ZVN1YmxpbWF0aW9uUHJpbnRlciAgICAgICAgICAgICA9IDB4NjQ3Mzc1NjIsICAvLyAnZHN1YicKLSAgICBjbXNTaWdQaG90b2dyYXBoaWNQYXBlclByaW50ZXIgICAgICAgICAgPSAweDcyNzA2ODZGLCAgLy8gJ3JwaG8nCi0gICAgY21zU2lnRmlsbVdyaXRlciAgICAgICAgICAgICAgICAgICAgICAgID0gMHg2NjcwNzI2RSwgIC8vICdmcHJuJwotICAgIGNtc1NpZ1ZpZGVvTW9uaXRvciAgICAgICAgICAgICAgICAgICAgICA9IDB4NzY2OTY0NkQsICAvLyAndmlkbScKLSAgICBjbXNTaWdWaWRlb0NhbWVyYSAgICAgICAgICAgICAgICAgICAgICAgPSAweDc2Njk2NDYzLCAgLy8gJ3ZpZGMnCi0gICAgY21zU2lnUHJvamVjdGlvblRlbGV2aXNpb24gICAgICAgICAgICAgID0gMHg3MDZBNzQ3NiwgIC8vICdwanR2JwotICAgIGNtc1NpZ0NSVERpc3BsYXkgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDM1MjU0MjAsICAvLyAnQ1JUICcKLSAgICBjbXNTaWdQTURpc3BsYXkgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDUwNEQ0NDIwLCAgLy8gJ1BNRCAnCi0gICAgY21zU2lnQU1EaXNwbGF5ICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MTRENDQyMCwgIC8vICdBTUQgJwotICAgIGNtc1NpZ1Bob3RvQ0QgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NEI1MDQzNDQsICAvLyAnS1BDRCcKLSAgICBjbXNTaWdQaG90b0ltYWdlU2V0dGVyICAgICAgICAgICAgICAgICAgPSAweDY5NkQ2NzczLCAgLy8gJ2ltZ3MnCi0gICAgY21zU2lnR3JhdnVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg2NzcyNjE3NiwgIC8vICdncmF2JwotICAgIGNtc1NpZ09mZnNldExpdGhvZ3JhcGh5ICAgICAgICAgICAgICAgICA9IDB4NkY2NjY2NzMsICAvLyAnb2ZmcycKLSAgICBjbXNTaWdTaWxrc2NyZWVuICAgICAgICAgICAgICAgICAgICAgICAgPSAweDczNjk2QzZCLCAgLy8gJ3NpbGsnCi0gICAgY21zU2lnRmxleG9ncmFwaHkgICAgICAgICAgICAgICAgICAgICAgID0gMHg2NjZDNjU3OCwgIC8vICdmbGV4JwotICAgIGNtc1NpZ01vdGlvblBpY3R1cmVGaWxtU2Nhbm5lciAgICAgICAgICA9IDB4NkQ3MDY2NzMsICAvLyAnbXBmcycKLSAgICBjbXNTaWdNb3Rpb25QaWN0dXJlRmlsbVJlY29yZGVyICAgICAgICAgPSAweDZENzA2NjcyLCAgLy8gJ21wZnInCi0gICAgY21zU2lnRGlnaXRhbE1vdGlvblBpY3R1cmVDYW1lcmEgICAgICAgID0gMHg2NDZENzA2MywgIC8vICdkbXBjJwotICAgIGNtc1NpZ0RpZ2l0YWxDaW5lbWFQcm9qZWN0b3IgICAgICAgICAgICA9IDB4NjQ2MzZBNzAgICAvLyAnZGNwaicKLQotfSBjbXNUZWNobm9sb2d5U2lnbmF0dXJlOwotCi0KLS8vIElDQyBDb2xvciBzcGFjZXMKLXR5cGVkZWYgZW51bSB7Ci0gICAgY21zU2lnWFlaRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg1ODU5NUEyMCwgIC8vICdYWVogJwotICAgIGNtc1NpZ0xhYkRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NEM2MTYyMjAsICAvLyAnTGFiICcKLSAgICBjbXNTaWdMdXZEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDRDNzU3NjIwLCAgLy8gJ0x1diAnCi0gICAgY21zU2lnWUNiQ3JEYXRhICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg1OTQzNjI3MiwgIC8vICdZQ2JyJwotICAgIGNtc1NpZ1l4eURhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NTk3ODc5MjAsICAvLyAnWXh5ICcKLSAgICBjbXNTaWdSZ2JEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDUyNDc0MjIwLCAgLy8gJ1JHQiAnCi0gICAgY21zU2lnR3JheURhdGEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0NzUyNDE1OSwgIC8vICdHUkFZJwotICAgIGNtc1NpZ0hzdkRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDg1MzU2MjAsICAvLyAnSFNWICcKLSAgICBjbXNTaWdIbHNEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDQ4NEM1MzIwLCAgLy8gJ0hMUyAnCi0gICAgY21zU2lnQ215a0RhdGEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MzRENTk0QiwgIC8vICdDTVlLJwotICAgIGNtc1NpZ0NteURhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDM0RDU5MjAsICAvLyAnQ01ZICcKLSAgICBjbXNTaWdNQ0gxRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDRENDM0ODMxLCAgLy8gJ01DSDEnCi0gICAgY21zU2lnTUNIMkRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0RDQzNDgzMiwgIC8vICdNQ0gyJwotICAgIGNtc1NpZ01DSDNEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NEQ0MzQ4MzMsICAvLyAnTUNIMycKLSAgICBjbXNTaWdNQ0g0RGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDRENDM0ODM0LCAgLy8gJ01DSDQnCi0gICAgY21zU2lnTUNINURhdGEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0RDQzNDgzNSwgIC8vICdNQ0g1JwotICAgIGNtc1NpZ01DSDZEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NEQ0MzQ4MzYsICAvLyAnTUNINicKLSAgICBjbXNTaWdNQ0g3RGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDRENDM0ODM3LCAgLy8gJ01DSDcnCi0gICAgY21zU2lnTUNIOERhdGEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0RDQzNDgzOCwgIC8vICdNQ0g4JwotICAgIGNtc1NpZ01DSDlEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NEQ0MzQ4MzksICAvLyAnTUNIOScKLSAgICBjbXNTaWdNQ0hBRGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDRENDM0ODQxLCAgLy8gJ01DSEEnCi0gICAgY21zU2lnTUNIQkRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0RDQzNDg0MiwgIC8vICdNQ0hCJwotICAgIGNtc1NpZ01DSENEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NEQ0MzQ4NDMsICAvLyAnTUNIQycKLSAgICBjbXNTaWdNQ0hERGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDRENDM0ODQ0LCAgLy8gJ01DSEQnCi0gICAgY21zU2lnTUNIRURhdGEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0RDQzNDg0NSwgIC8vICdNQ0hFJwotICAgIGNtc1NpZ01DSEZEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NEQ0MzQ4NDYsICAvLyAnTUNIRicKLSAgICBjbXNTaWdOYW1lZERhdGEgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDZlNmQ2MzZjLCAgLy8gJ25tY2wnCi0gICAgY21zU2lnMWNvbG9yRGF0YSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzMTQzNEM1MiwgIC8vICcxQ0xSJwotICAgIGNtc1NpZzJjb2xvckRhdGEgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzI0MzRDNTIsICAvLyAnMkNMUicKLSAgICBjbXNTaWczY29sb3JEYXRhICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMzNDM0QzUyLCAgLy8gJzNDTFInCi0gICAgY21zU2lnNGNvbG9yRGF0YSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzNDQzNEM1MiwgIC8vICc0Q0xSJwotICAgIGNtc1NpZzVjb2xvckRhdGEgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MzU0MzRDNTIsICAvLyAnNUNMUicKLSAgICBjbXNTaWc2Y29sb3JEYXRhICAgICAgICAgICAgICAgICAgICAgICAgPSAweDM2NDM0QzUyLCAgLy8gJzZDTFInCi0gICAgY21zU2lnN2NvbG9yRGF0YSAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzNzQzNEM1MiwgIC8vICc3Q0xSJwotICAgIGNtc1NpZzhjb2xvckRhdGEgICAgICAgICAgICAgICAgICAgICAgICA9IDB4Mzg0MzRDNTIsICAvLyAnOENMUicKLSAgICBjbXNTaWc5Y29sb3JEYXRhICAgICAgICAgICAgICAgICAgICAgICAgPSAweDM5NDM0QzUyLCAgLy8gJzlDTFInCi0gICAgY21zU2lnMTBjb2xvckRhdGEgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MTQzNEM1MiwgIC8vICdBQ0xSJwotICAgIGNtc1NpZzExY29sb3JEYXRhICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDI0MzRDNTIsICAvLyAnQkNMUicKLSAgICBjbXNTaWcxMmNvbG9yRGF0YSAgICAgICAgICAgICAgICAgICAgICAgPSAweDQzNDM0QzUyLCAgLy8gJ0NDTFInCi0gICAgY21zU2lnMTNjb2xvckRhdGEgICAgICAgICAgICAgICAgICAgICAgID0gMHg0NDQzNEM1MiwgIC8vICdEQ0xSJwotICAgIGNtc1NpZzE0Y29sb3JEYXRhICAgICAgICAgICAgICAgICAgICAgICA9IDB4NDU0MzRDNTIsICAvLyAnRUNMUicKLSAgICBjbXNTaWcxNWNvbG9yRGF0YSAgICAgICAgICAgICAgICAgICAgICAgPSAweDQ2NDM0QzUyLCAgLy8gJ0ZDTFInCi0gICAgY21zU2lnTHV2S0RhdGEgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0Qzc1NzY0QiAgIC8vICdMdXZLJwotCi19IGNtc0NvbG9yU3BhY2VTaWduYXR1cmU7Ci0KLS8vIElDQyBQcm9maWxlIENsYXNzCi10eXBlZGVmIGVudW0gewotICAgIGNtc1NpZ0lucHV0Q2xhc3MgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NzM2MzZFNzIsICAvLyAnc2NucicKLSAgICBjbXNTaWdEaXNwbGF5Q2xhc3MgICAgICAgICAgICAgICAgICAgICAgPSAweDZENkU3NDcyLCAgLy8gJ21udHInCi0gICAgY21zU2lnT3V0cHV0Q2xhc3MgICAgICAgICAgICAgICAgICAgICAgID0gMHg3MDcyNzQ3MiwgIC8vICdwcnRyJwotICAgIGNtc1NpZ0xpbmtDbGFzcyAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NkM2OTZFNkIsICAvLyAnbGluaycKLSAgICBjbXNTaWdBYnN0cmFjdENsYXNzICAgICAgICAgICAgICAgICAgICAgPSAweDYxNjI3Mzc0LCAgLy8gJ2Fic3QnCi0gICAgY21zU2lnQ29sb3JTcGFjZUNsYXNzICAgICAgICAgICAgICAgICAgID0gMHg3MzcwNjE2MywgIC8vICdzcGFjJwotICAgIGNtc1NpZ05hbWVkQ29sb3JDbGFzcyAgICAgICAgICAgICAgICAgICA9IDB4NmU2ZDYzNmMgICAvLyAnbm1jbCcKLQotfSBjbXNQcm9maWxlQ2xhc3NTaWduYXR1cmU7Ci0KLS8vIElDQyBQbGF0Zm9ybXMKLXR5cGVkZWYgZW51bSB7Ci0gICAgY21zU2lnTWFjaW50b3NoICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MTUwNTA0QywgIC8vICdBUFBMJwotICAgIGNtc1NpZ01pY3Jvc29mdCAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NEQ1MzQ2NTQsICAvLyAnTVNGVCcKLSAgICBjbXNTaWdTb2xhcmlzICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDUzNTU0RTU3LCAgLy8gJ1NVTlcnCi0gICAgY21zU2lnU0dJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg1MzQ3NDkyMCwgIC8vICdTR0kgJwotICAgIGNtc1NpZ1RhbGlnZW50ICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NTQ0NzRFNTQsICAvLyAnVEdOVCcKLSAgICBjbXNTaWdVbmljZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDJBNkU2OTc4ICAgLy8gJypuaXgnICAgLy8gRnJvbSBhcmd5bGwgLS0gTm90IG9mZmljaWFsCi0KLX0gY21zUGxhdGZvcm1TaWduYXR1cmU7Ci0KLS8vIFJlZmVyZW5jZSBnYW11dAotI2RlZmluZSAgY21zU2lnUGVyY2VwdHVhbFJlZmVyZW5jZU1lZGl1bUdhbXV0ICAgICAgICAgMHg3MDcyNmQ2NyAgLy8ncHJtZycKLQotLy8gRm9yIGNtc1NpZ0NvbG9yaW1ldHJpY0ludGVudEltYWdlU3RhdGVUYWcKLSNkZWZpbmUgIGNtc1NpZ1NjZW5lQ29sb3JpbWV0cnlFc3RpbWF0ZXMgICAgICAgICAgICAgIDB4NzM2MzZGNjUgIC8vJ3Njb2UnCi0jZGVmaW5lICBjbXNTaWdTY2VuZUFwcGVhcmFuY2VFc3RpbWF0ZXMgICAgICAgICAgICAgICAweDczNjE3MDY1ICAvLydzYXBlJwotI2RlZmluZSAgY21zU2lnRm9jYWxQbGFuZUNvbG9yaW1ldHJ5RXN0aW1hdGVzICAgICAgICAgMHg2NjcwNjM2NSAgLy8nZnBjZScKLSNkZWZpbmUgIGNtc1NpZ1JlZmxlY3Rpb25IYXJkY29weU9yaWdpbmFsQ29sb3JpbWV0cnkgIDB4NzI2ODZGNjMgIC8vJ3Job2MnCi0jZGVmaW5lICBjbXNTaWdSZWZsZWN0aW9uUHJpbnRPdXRwdXRDb2xvcmltZXRyeSAgICAgICAweDcyNzA2RjYzICAvLydycG9jJwotCi0vLyBNdWx0aSBwcm9jZXNzIGVsZW1lbnRzIHR5cGVzCi10eXBlZGVmIGVudW0gewotICAgIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUgICAgICAgICAgICAgID0gMHg2Mzc2NzM3NCwgIC8vJ2N2c3QnCi0gICAgY21zU2lnTWF0cml4RWxlbVR5cGUgICAgICAgICAgICAgICAgPSAweDZENjE3NDY2LCAgLy8nbWF0ZicKLSAgICBjbXNTaWdDTHV0RWxlbVR5cGUgICAgICAgICAgICAgICAgICA9IDB4NjM2Qzc1NzQsICAvLydjbHV0JwotCi0gICAgY21zU2lnQkFjc0VsZW1UeXBlICAgICAgICAgICAgICAgICAgPSAweDYyNDE0MzUzLCAgLy8gJ2JBQ1MnCi0gICAgY21zU2lnRUFjc0VsZW1UeXBlICAgICAgICAgICAgICAgICAgPSAweDY1NDE0MzUzLCAgLy8gJ2VBQ1MnCi0KLSAgICAvLyBDdXN0b20gZnJvbSBoZXJlLCBub3QgaW4gdGhlIElDQyBTcGVjCi0gICAgY21zU2lnWFlaMkxhYkVsZW1UeXBlICAgICAgICAgICAgICAgPSAweDZDMzI3ODIwLCAgLy8gJ2wyeCAnCi0gICAgY21zU2lnTGFiMlhZWkVsZW1UeXBlICAgICAgICAgICAgICAgPSAweDc4MzI2QzIwLCAgLy8gJ3gybCAnCi0gICAgY21zU2lnTmFtZWRDb2xvckVsZW1UeXBlICAgICAgICAgICAgPSAweDZFNjM2QzIwLCAgLy8gJ25jbCAnCi0gICAgY21zU2lnTGFiVjJ0b1Y0ICAgICAgICAgICAgICAgICAgICAgPSAweDMyMjAzNDIwLCAgLy8gJzIgNCAnCi0gICAgY21zU2lnTGFiVjR0b1YyICAgICAgICAgICAgICAgICAgICAgPSAweDM0MjAzMjIwLCAgLy8gJzQgMiAnCi0KLSAgICAvLyBJZGVudGl0aWVzCi0gICAgY21zU2lnSWRlbnRpdHlFbGVtVHlwZSAgICAgICAgICAgICAgPSAweDY5NjQ2RTIwLCAgLy8gJ2lkbiAnCi0KLSAgICAvLyBGbG9hdCB0byBmbG9hdFBDUwotICAgIGNtc1NpZ0xhYjJGbG9hdFBDUyAgICAgICAgICAgICAgICAgID0gMHg2NDMyNkMyMCwgIC8vICdkMmwgJwotICAgIGNtc1NpZ0Zsb2F0UENTMkxhYiAgICAgICAgICAgICAgICAgID0gMHg2QzMyNjQyMCwgIC8vICdsMmQgJwotICAgIGNtc1NpZ1hZWjJGbG9hdFBDUyAgICAgICAgICAgICAgICAgID0gMHg2NDMyNzgyMCwgIC8vICdkMnggJwotICAgIGNtc1NpZ0Zsb2F0UENTMlhZWiAgICAgICAgICAgICAgICAgID0gMHg3ODMyNjQyMCAgIC8vICd4MmQgJwotCi19IGNtc1N0YWdlU2lnbmF0dXJlOwotCi0vLyBUeXBlcyBvZiBDdXJ2ZUVsZW1lbnRzCi10eXBlZGVmIGVudW0gewotCi0gICAgY21zU2lnRm9ybXVsYUN1cnZlU2VnICAgICAgICAgICAgICAgPSAweDcwNjE3MjY2LCAvLyAncGFyZicKLSAgICBjbXNTaWdTYW1wbGVkQ3VydmVTZWcgICAgICAgICAgICAgICA9IDB4NzM2MTZENjYsIC8vICdzYW1mJwotICAgIGNtc1NpZ1NlZ21lbnRlZEN1cnZlICAgICAgICAgICAgICAgID0gMHg2Mzc1NzI2NiAgLy8gJ2N1cmYnCi0KLX0gY21zQ3VydmVTZWdTaWduYXR1cmU7Ci0KLS8vIFVzZWQgaW4gUmVzcG9uc2VDdXJ2ZVR5cGUKLSNkZWZpbmUgIGNtc1NpZ1N0YXR1c0EgICAgICAgICAgICAgICAgICAgIDB4NTM3NDYxNDEgLy8nU3RhQScKLSNkZWZpbmUgIGNtc1NpZ1N0YXR1c0UgICAgICAgICAgICAgICAgICAgIDB4NTM3NDYxNDUgLy8nU3RhRScKLSNkZWZpbmUgIGNtc1NpZ1N0YXR1c0kgICAgICAgICAgICAgICAgICAgIDB4NTM3NDYxNDkgLy8nU3RhSScKLSNkZWZpbmUgIGNtc1NpZ1N0YXR1c1QgICAgICAgICAgICAgICAgICAgIDB4NTM3NDYxNTQgLy8nU3RhVCcKLSNkZWZpbmUgIGNtc1NpZ1N0YXR1c00gICAgICAgICAgICAgICAgICAgIDB4NTM3NDYxNEQgLy8nU3RhTScKLSNkZWZpbmUgIGNtc1NpZ0ROICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDQ0RTIwMjAgLy8nRE4gICcKLSNkZWZpbmUgIGNtc1NpZ0ROUCAgICAgICAgICAgICAgICAgICAgICAgIDB4NDQ0RTIwNTAgLy8nRE4gUCcKLSNkZWZpbmUgIGNtc1NpZ0ROTiAgICAgICAgICAgICAgICAgICAgICAgIDB4NDQ0RTRFMjAgLy8nRE5OICcKLSNkZWZpbmUgIGNtc1NpZ0ROTlAgICAgICAgICAgICAgICAgICAgICAgIDB4NDQ0RTRFNTAgLy8nRE5OUCcKLQotLy8gRGV2aWNlIGF0dHJpYnV0ZXMsIGN1cnJlbnRseSBkZWZpbmVkIHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBsb3cgNCBieXRlcwotLy8gb2YgdGhlIDggYnl0ZSBhdHRyaWJ1dGUgcXVhbnRpdHkKLSNkZWZpbmUgY21zUmVmbGVjdGl2ZSAgICAgMAotI2RlZmluZSBjbXNUcmFuc3BhcmVuY3kgICAxCi0jZGVmaW5lIGNtc0dsb3NzeSAgICAgICAgIDAKLSNkZWZpbmUgY21zTWF0dGUgICAgICAgICAgMgotCi0vLyBDb21tb24gc3RydWN0dXJlcyBpbiBJQ0MgdGFncwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNtc1VJbnQzMk51bWJlciBsZW47Ci0gICAgY21zVUludDMyTnVtYmVyIGZsYWc7Ci0gICAgY21zVUludDhOdW1iZXIgIGRhdGFbMV07Ci0KLX0gY21zSUNDRGF0YTsKLQotLy8gSUNDIGRhdGUgdGltZQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNtc1VJbnQxNk51bWJlciAgICAgIHllYXI7Ci0gICAgY21zVUludDE2TnVtYmVyICAgICAgbW9udGg7Ci0gICAgY21zVUludDE2TnVtYmVyICAgICAgZGF5OwotICAgIGNtc1VJbnQxNk51bWJlciAgICAgIGhvdXJzOwotICAgIGNtc1VJbnQxNk51bWJlciAgICAgIG1pbnV0ZXM7Ci0gICAgY21zVUludDE2TnVtYmVyICAgICAgc2Vjb25kczsKLQotfSBjbXNEYXRlVGltZU51bWJlcjsKLQotLy8gSUNDIFhZWgotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgIFg7Ci0gICAgY21zUzE1Rml4ZWQxNk51bWJlciAgWTsKLSAgICBjbXNTMTVGaXhlZDE2TnVtYmVyICBaOwotCi19IGNtc0VuY29kZWRYWVpOdW1iZXI7Ci0KLQotLy8gUHJvZmlsZSBJRCBhcyBjb21wdXRlZCBieSBNRDUgYWxnb3JpdGhtCi10eXBlZGVmIHVuaW9uIHsKLSAgICBjbXNVSW50OE51bWJlciAgICAgICBJRDhbMTZdOwotICAgIGNtc1VJbnQxNk51bWJlciAgICAgIElEMTZbOF07Ci0gICAgY21zVUludDMyTnVtYmVyICAgICAgSUQzMls0XTsKLQotfSBjbXNQcm9maWxlSUQ7Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSUNDIHByb2ZpbGUgaW50ZXJuYWwgYmFzZSB0eXBlcy4gU3RyaWN0bHksIHNob3VsZG4ndCBiZSBkZWNsYXJlZCBpbiB0aGlzIGhlYWRlciwgYnV0IG1heWJlCi0vLyBzb21lYm9keSB3YW50IHRvIHVzZSB0aGlzIGluZm8gZm9yIGFjY2Vzc2luZyBwcm9maWxlIGhlYWRlciBkaXJlY3RseSwgc28gaGVyZSBpdCBpcy4KLQotLy8gUHJvZmlsZSBoZWFkZXIgLS0gaXQgaXMgMzItYml0IGFsaWduZWQsIHNvIG5vIGlzc3VlcyBhcmUgZXhwZWN0ZWQgb24gYWxpZ25tZW50Ci10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY21zVUludDMyTnVtYmVyICAgICAgICAgICAgICBzaXplOyAgICAgICAgICAgLy8gUHJvZmlsZSBzaXplIGluIGJ5dGVzCi0gICAgY21zU2lnbmF0dXJlICAgICAgICAgICAgICAgICBjbW1JZDsgICAgICAgICAgLy8gQ01NIGZvciB0aGlzIHByb2ZpbGUKLSAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgICAgICAgIHZlcnNpb247ICAgICAgICAvLyBGb3JtYXQgdmVyc2lvbiBudW1iZXIKLSAgICBjbXNQcm9maWxlQ2xhc3NTaWduYXR1cmUgICAgIGRldmljZUNsYXNzOyAgICAvLyBUeXBlIG9mIHByb2ZpbGUKLSAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlICAgICAgIGNvbG9yU3BhY2U7ICAgICAvLyBDb2xvciBzcGFjZSBvZiBkYXRhCi0gICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSAgICAgICBwY3M7ICAgICAgICAgICAgLy8gUENTLCBYWVogb3IgTGFiIG9ubHkKLSAgICBjbXNEYXRlVGltZU51bWJlciAgICAgICAgICAgIGRhdGU7ICAgICAgICAgICAvLyBEYXRlIHByb2ZpbGUgd2FzIGNyZWF0ZWQKLSAgICBjbXNTaWduYXR1cmUgICAgICAgICAgICAgICAgIG1hZ2ljOyAgICAgICAgICAvLyBNYWdpYyBOdW1iZXIgdG8gaWRlbnRpZnkgYW4gSUNDIHByb2ZpbGUKLSAgICBjbXNQbGF0Zm9ybVNpZ25hdHVyZSAgICAgICAgIHBsYXRmb3JtOyAgICAgICAvLyBQcmltYXJ5IFBsYXRmb3JtCi0gICAgY21zVUludDMyTnVtYmVyICAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgLy8gVmFyaW91cyBiaXQgc2V0dGluZ3MKLSAgICBjbXNTaWduYXR1cmUgICAgICAgICAgICAgICAgIG1hbnVmYWN0dXJlcjsgICAvLyBEZXZpY2UgbWFudWZhY3R1cmVyCi0gICAgY21zVUludDMyTnVtYmVyICAgICAgICAgICAgICBtb2RlbDsgICAgICAgICAgLy8gRGV2aWNlIG1vZGVsIG51bWJlcgotICAgIGNtc1VJbnQ2NE51bWJlciAgICAgICAgICAgICAgYXR0cmlidXRlczsgICAgIC8vIERldmljZSBhdHRyaWJ1dGVzCi0gICAgY21zVUludDMyTnVtYmVyICAgICAgICAgICAgICByZW5kZXJpbmdJbnRlbnQ7Ly8gUmVuZGVyaW5nIGludGVudAotICAgIGNtc0VuY29kZWRYWVpOdW1iZXIgICAgICAgICAgaWxsdW1pbmFudDsgICAgIC8vIFByb2ZpbGUgaWxsdW1pbmFudAotICAgIGNtc1NpZ25hdHVyZSAgICAgICAgICAgICAgICAgY3JlYXRvcjsgICAgICAgIC8vIFByb2ZpbGUgY3JlYXRvcgotICAgIGNtc1Byb2ZpbGVJRCAgICAgICAgICAgICAgICAgcHJvZmlsZUlEOyAgICAgIC8vIFByb2ZpbGUgSUQgdXNpbmcgTUQ1Ci0gICAgY21zSW50OE51bWJlciAgICAgICAgICAgICAgICByZXNlcnZlZFsyOF07ICAgLy8gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UKLQotfSBjbXNJQ0NIZWFkZXI7Ci0KLS8vIElDQyBiYXNlIHRhZwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNtc1RhZ1R5cGVTaWduYXR1cmUgIHNpZzsKLSAgICBjbXNJbnQ4TnVtYmVyICAgICAgICByZXNlcnZlZFs0XTsKLQotfSBjbXNUYWdCYXNlOwotCi0vLyBBIHRhZyBlbnRyeSBpbiBkaXJlY3RvcnkKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjbXNUYWdTaWduYXR1cmUgICAgICBzaWc7ICAgICAgICAgICAgLy8gVGhlIHRhZyBzaWduYXR1cmUKLSAgICBjbXNVSW50MzJOdW1iZXIgICAgICBvZmZzZXQ7ICAgICAgICAgLy8gU3RhcnQgb2YgdGFnCi0gICAgY21zVUludDMyTnVtYmVyICAgICAgc2l6ZTsgICAgICAgICAgIC8vIFNpemUgaW4gYnl0ZXMKLQotfSBjbXNUYWdFbnRyeTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBMaXR0bGUgQ01TIHNwZWNpZmljIHR5cGVkZWZzCi0KLXR5cGVkZWYgdm9pZCogY21zSEFORExFIDsgICAgICAgICAgICAgIC8vIEdlbmVyaWMgaGFuZGxlCi10eXBlZGVmIHZvaWQqIGNtc0hQUk9GSUxFOyAgICAgICAgICAgICAvLyBPcGFxdWUgdHlwZWRlZnMgdG8gaGlkZSBpbnRlcm5hbHMKLXR5cGVkZWYgdm9pZCogY21zSFRSQU5TRk9STTsKLQotI2RlZmluZSBjbXNNQVhDSEFOTkVMUyAgMTYgICAgICAgICAgICAgICAgLy8gTWF4aW11bSBudW1iZXIgb2YgY2hhbm5lbHMgaW4gSUNDIHByb2ZpbGVzCi0KLS8vIEZvcm1hdCBvZiBwaXhlbCBpcyBkZWZpbmVkIGJ5IG9uZSBjbXNVSW50MzJOdW1iZXIsIHVzaW5nIGJpdCBmaWVsZHMgYXMgZm9sbG93cwotLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgMSAgICAgICAgICAwCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgMyAyIDEwOTg3IDYgNSA0IDMgMiAxIDA5OCA3NjU0IDMyMQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgIEEgTyBUVFRUVCBVIFkgRiBQIFggUyBFRUUgQ0NDQyBCQkIKLS8vCi0vLyAgICAgICAgICAgIEE6IEZsb2F0aW5nIHBvaW50IC0tIFdpdGggdGhpcyBmbGFnIHdlIGNhbiBkaWZmZXJlbnRpYXRlIDE2IGJpdHMgYXMgZmxvYXQgYW5kIGFzIGludAotLy8gICAgICAgICAgICBPOiBPcHRpbWl6ZWQgLS0gcHJldmlvdXMgb3B0aW1pemF0aW9uIGFscmVhZHkgcmV0dXJucyB0aGUgZmluYWwgOC1iaXQgdmFsdWUKLS8vICAgICAgICAgICAgVDogUGl4ZWx0eXBlCi0vLyAgICAgICAgICAgIEY6IEZsYXZvciAgMD1NaW5Jc0JsYWNrKENob2NvbGF0ZSkgMT1NaW5Jc1doaXRlKFZhbmlsbGEpCi0vLyAgICAgICAgICAgIFA6IFBsYW5hcj8gMD1DaHVua3ksIDE9UGxhbmFyCi0vLyAgICAgICAgICAgIFg6IHN3YXAgMTYgYnBzIGVuZGlhbmVzcz8KLS8vICAgICAgICAgICAgUzogRG8gc3dhcD8gaWUsIEJHUiwgS1lNQwotLy8gICAgICAgICAgICBFOiBFeHRyYSBzYW1wbGVzCi0vLyAgICAgICAgICAgIEM6IENoYW5uZWxzIChTYW1wbGVzIHBlciBwaXhlbCkKLS8vICAgICAgICAgICAgQjogYnl0ZXMgcGVyIHNhbXBsZQotLy8gICAgICAgICAgICBZOiBTd2FwIGZpcnN0IC0gY2hhbmdlcyBBQkdSIHRvIEJHUkEgYW5kIEtDTVkgdG8gQ01ZSwotCi0jZGVmaW5lIEZMT0FUX1NIKGEpICAgICAgICAgICAgKChhKSA8PCAyMikKLSNkZWZpbmUgT1BUSU1JWkVEX1NIKHMpICAgICAgICAoKHMpIDw8IDIxKQotI2RlZmluZSBDT0xPUlNQQUNFX1NIKHMpICAgICAgICgocykgPDwgMTYpCi0jZGVmaW5lIFNXQVBGSVJTVF9TSChzKSAgICAgICAgKChzKSA8PCAxNCkKLSNkZWZpbmUgRkxBVk9SX1NIKHMpICAgICAgICAgICAoKHMpIDw8IDEzKQotI2RlZmluZSBQTEFOQVJfU0gocCkgICAgICAgICAgICgocCkgPDwgMTIpCi0jZGVmaW5lIEVORElBTjE2X1NIKGUpICAgICAgICAgKChlKSA8PCAxMSkKLSNkZWZpbmUgRE9TV0FQX1NIKGUpICAgICAgICAgICAoKGUpIDw8IDEwKQotI2RlZmluZSBFWFRSQV9TSChlKSAgICAgICAgICAgICgoZSkgPDwgNykKLSNkZWZpbmUgQ0hBTk5FTFNfU0goYykgICAgICAgICAoKGMpIDw8IDMpCi0jZGVmaW5lIEJZVEVTX1NIKGIpICAgICAgICAgICAgKGIpCi0KLS8vIFRoZXNlIG1hY3JvcyB1bnBhY2sgZm9ybWF0IHNwZWNpZmllcnMgaW50byBpbnRlZ2VycwotI2RlZmluZSBUX0ZMT0FUKGEpICAgICAgICAgICAgKCgoYSk+PjIyKSYxKQotI2RlZmluZSBUX09QVElNSVpFRChvKSAgICAgICAgKCgobyk+PjIxKSYxKQotI2RlZmluZSBUX0NPTE9SU1BBQ0UocykgICAgICAgKCgocyk+PjE2KSYzMSkKLSNkZWZpbmUgVF9TV0FQRklSU1QocykgICAgICAgICgoKHMpPj4xNCkmMSkKLSNkZWZpbmUgVF9GTEFWT1IocykgICAgICAgICAgICgoKHMpPj4xMykmMSkKLSNkZWZpbmUgVF9QTEFOQVIocCkgICAgICAgICAgICgoKHApPj4xMikmMSkKLSNkZWZpbmUgVF9FTkRJQU4xNihlKSAgICAgICAgICgoKGUpPj4xMSkmMSkKLSNkZWZpbmUgVF9ET1NXQVAoZSkgICAgICAgICAgICgoKGUpPj4xMCkmMSkKLSNkZWZpbmUgVF9FWFRSQShlKSAgICAgICAgICAgICgoKGUpPj43KSY3KQotI2RlZmluZSBUX0NIQU5ORUxTKGMpICAgICAgICAgKCgoYyk+PjMpJjE1KQotI2RlZmluZSBUX0JZVEVTKGIpICAgICAgICAgICAgKChiKSY3KQotCi0KLS8vIFBpeGVsIHR5cGVzCi0jZGVmaW5lIFBUX0FOWSAgICAgICAwICAgIC8vIERvbid0IGNoZWNrIGNvbG9yc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMSAmIDIgYXJlIHJlc2VydmVkCi0jZGVmaW5lIFBUX0dSQVkgICAgICAzCi0jZGVmaW5lIFBUX1JHQiAgICAgICA0Ci0jZGVmaW5lIFBUX0NNWSAgICAgICA1Ci0jZGVmaW5lIFBUX0NNWUsgICAgICA2Ci0jZGVmaW5lIFBUX1lDYkNyICAgICA3Ci0jZGVmaW5lIFBUX1lVViAgICAgICA4ICAgICAgLy8gTHUndicKLSNkZWZpbmUgUFRfWFlaICAgICAgIDkKLSNkZWZpbmUgUFRfTGFiICAgICAgIDEwCi0jZGVmaW5lIFBUX1lVVksgICAgICAxMSAgICAgLy8gTHUndidLCi0jZGVmaW5lIFBUX0hTViAgICAgICAxMgotI2RlZmluZSBQVF9ITFMgICAgICAgMTMKLSNkZWZpbmUgUFRfWXh5ICAgICAgIDE0Ci0KLSNkZWZpbmUgUFRfTUNIMSAgICAgIDE1Ci0jZGVmaW5lIFBUX01DSDIgICAgICAxNgotI2RlZmluZSBQVF9NQ0gzICAgICAgMTcKLSNkZWZpbmUgUFRfTUNINCAgICAgIDE4Ci0jZGVmaW5lIFBUX01DSDUgICAgICAxOQotI2RlZmluZSBQVF9NQ0g2ICAgICAgMjAKLSNkZWZpbmUgUFRfTUNINyAgICAgIDIxCi0jZGVmaW5lIFBUX01DSDggICAgICAyMgotI2RlZmluZSBQVF9NQ0g5ICAgICAgMjMKLSNkZWZpbmUgUFRfTUNIMTAgICAgIDI0Ci0jZGVmaW5lIFBUX01DSDExICAgICAyNQotI2RlZmluZSBQVF9NQ0gxMiAgICAgMjYKLSNkZWZpbmUgUFRfTUNIMTMgICAgIDI3Ci0jZGVmaW5lIFBUX01DSDE0ICAgICAyOAotI2RlZmluZSBQVF9NQ0gxNSAgICAgMjkKLQotI2RlZmluZSBQVF9MYWJWMiAgICAgMzAgICAgIC8vIElkZW50aWNhbCB0byBQVF9MYWIsIGJ1dCB1c2luZyB0aGUgVjIgb2xkIGVuY29kaW5nCi0KLS8vIFNvbWUgKG5vdCBhbGwhKSByZXByZXNlbnRhdGlvbnMKLQotI2lmbmRlZiBUWVBFX1JHQl84ICAgICAgLy8gVFlQRV9SR0JfOCBpcyBhIHZlcnkgY29tbW9uIGlkZW50aWZpZXIsIHNvIGRvbid0IGluY2x1ZGUgb3VycwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdXNlciBoYXMgaXQgYWxyZWFkeSBkZWZpbmVkLgotCi0jZGVmaW5lIFRZUEVfR1JBWV84ICAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfR1JBWSl8Q0hBTk5FTFNfU0goMSl8QllURVNfU0goMSkpCi0jZGVmaW5lIFRZUEVfR1JBWV84X1JFViAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfR1JBWSl8Q0hBTk5FTFNfU0goMSl8QllURVNfU0goMSl8RkxBVk9SX1NIKDEpKQotI2RlZmluZSBUWVBFX0dSQVlfMTYgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0dSQVkpfENIQU5ORUxTX1NIKDEpfEJZVEVTX1NIKDIpKQotI2RlZmluZSBUWVBFX0dSQVlfMTZfUkVWICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0dSQVkpfENIQU5ORUxTX1NIKDEpfEJZVEVTX1NIKDIpfEZMQVZPUl9TSCgxKSkKLSNkZWZpbmUgVFlQRV9HUkFZXzE2X1NFICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9HUkFZKXxDSEFOTkVMU19TSCgxKXxCWVRFU19TSCgyKXxFTkRJQU4xNl9TSCgxKSkKLSNkZWZpbmUgVFlQRV9HUkFZQV84ICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9HUkFZKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgxKXxCWVRFU19TSCgxKSkKLSNkZWZpbmUgVFlQRV9HUkFZQV8xNiAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9HUkFZKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgxKXxCWVRFU19TSCgyKSkKLSNkZWZpbmUgVFlQRV9HUkFZQV8xNl9TRSAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9HUkFZKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgxKXxCWVRFU19TSCgyKXxFTkRJQU4xNl9TSCgxKSkKLSNkZWZpbmUgVFlQRV9HUkFZQV84X1BMQU5BUiAgICAoQ09MT1JTUEFDRV9TSChQVF9HUkFZKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgxKXxCWVRFU19TSCgxKXxQTEFOQVJfU0goMSkpCi0jZGVmaW5lIFRZUEVfR1JBWUFfMTZfUExBTkFSICAgKENPTE9SU1BBQ0VfU0goUFRfR1JBWSl8RVhUUkFfU0goMSl8Q0hBTk5FTFNfU0goMSl8QllURVNfU0goMil8UExBTkFSX1NIKDEpKQotCi0jZGVmaW5lIFRZUEVfUkdCXzggICAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfUkdCKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKSkKLSNkZWZpbmUgVFlQRV9SR0JfOF9QTEFOQVIgICAgICAoQ09MT1JTUEFDRV9TSChQVF9SR0IpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpfFBMQU5BUl9TSCgxKSkKLSNkZWZpbmUgVFlQRV9CR1JfOCAgICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9SR0IpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpfERPU1dBUF9TSCgxKSkKLSNkZWZpbmUgVFlQRV9CR1JfOF9QTEFOQVIgICAgICAoQ09MT1JTUEFDRV9TSChQVF9SR0IpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpfERPU1dBUF9TSCgxKXxQTEFOQVJfU0goMSkpCi0jZGVmaW5lIFRZUEVfUkdCXzE2ICAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfUkdCKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKSkKLSNkZWZpbmUgVFlQRV9SR0JfMTZfUExBTkFSICAgICAoQ09MT1JTUEFDRV9TSChQVF9SR0IpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfFBMQU5BUl9TSCgxKSkKLSNkZWZpbmUgVFlQRV9SR0JfMTZfU0UgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9SR0IpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfEVORElBTjE2X1NIKDEpKQotI2RlZmluZSBUWVBFX0JHUl8xNiAgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX1JHQil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RE9TV0FQX1NIKDEpKQotI2RlZmluZSBUWVBFX0JHUl8xNl9QTEFOQVIgICAgIChDT0xPUlNQQUNFX1NIKFBUX1JHQil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RE9TV0FQX1NIKDEpfFBMQU5BUl9TSCgxKSkKLSNkZWZpbmUgVFlQRV9CR1JfMTZfU0UgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9SR0IpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKXxFTkRJQU4xNl9TSCgxKSkKLQotI2RlZmluZSBUWVBFX1JHQkFfOCAgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX1JHQil8RVhUUkFfU0goMSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMSkpCi0jZGVmaW5lIFRZUEVfUkdCQV84X1BMQU5BUiAgICAgKENPTE9SU1BBQ0VfU0goUFRfUkdCKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKXxQTEFOQVJfU0goMSkpCi0jZGVmaW5lIFRZUEVfUkdCQV8xNiAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfUkdCKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKSkKLSNkZWZpbmUgVFlQRV9SR0JBXzE2X1BMQU5BUiAgICAoQ09MT1JTUEFDRV9TSChQVF9SR0IpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfFBMQU5BUl9TSCgxKSkKLSNkZWZpbmUgVFlQRV9SR0JBXzE2X1NFICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9SR0IpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfEVORElBTjE2X1NIKDEpKQotCi0jZGVmaW5lIFRZUEVfQVJHQl84ICAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfUkdCKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKXxTV0FQRklSU1RfU0goMSkpCi0jZGVmaW5lIFRZUEVfQVJHQl84X1BMQU5BUiAgICAgKENPTE9SU1BBQ0VfU0goUFRfUkdCKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKXxTV0FQRklSU1RfU0goMSl8UExBTkFSX1NIKDEpKQotI2RlZmluZSBUWVBFX0FSR0JfMTYgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX1JHQil8RVhUUkFfU0goMSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8U1dBUEZJUlNUX1NIKDEpKQotCi0jZGVmaW5lIFRZUEVfQUJHUl84ICAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfUkdCKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKXxET1NXQVBfU0goMSkpCi0jZGVmaW5lIFRZUEVfQUJHUl84X1BMQU5BUiAgICAgKENPTE9SU1BBQ0VfU0goUFRfUkdCKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKXxET1NXQVBfU0goMSl8UExBTkFSX1NIKDEpKQotI2RlZmluZSBUWVBFX0FCR1JfMTYgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX1JHQil8RVhUUkFfU0goMSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RE9TV0FQX1NIKDEpKQotI2RlZmluZSBUWVBFX0FCR1JfMTZfUExBTkFSICAgIChDT0xPUlNQQUNFX1NIKFBUX1JHQil8RVhUUkFfU0goMSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RE9TV0FQX1NIKDEpfFBMQU5BUl9TSCgxKSkKLSNkZWZpbmUgVFlQRV9BQkdSXzE2X1NFICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9SR0IpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKXxFTkRJQU4xNl9TSCgxKSkKLQotI2RlZmluZSBUWVBFX0JHUkFfOCAgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX1JHQil8RVhUUkFfU0goMSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMSl8RE9TV0FQX1NIKDEpfFNXQVBGSVJTVF9TSCgxKSkKLSNkZWZpbmUgVFlQRV9CR1JBXzhfUExBTkFSICAgICAoQ09MT1JTUEFDRV9TSChQVF9SR0IpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpfERPU1dBUF9TSCgxKXxTV0FQRklSU1RfU0goMSl8UExBTkFSX1NIKDEpKQotI2RlZmluZSBUWVBFX0JHUkFfMTYgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX1JHQil8RVhUUkFfU0goMSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RE9TV0FQX1NIKDEpfFNXQVBGSVJTVF9TSCgxKSkKLSNkZWZpbmUgVFlQRV9CR1JBXzE2X1NFICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9SR0IpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfEVORElBTjE2X1NIKDEpfERPU1dBUF9TSCgxKXxTV0FQRklSU1RfU0goMSkpCi0KLSNkZWZpbmUgVFlQRV9DTVlfOCAgICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9DTVkpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpKQotI2RlZmluZSBUWVBFX0NNWV84X1BMQU5BUiAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0NNWSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMSl8UExBTkFSX1NIKDEpKQotI2RlZmluZSBUWVBFX0NNWV8xNiAgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0NNWSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMikpCi0jZGVmaW5lIFRZUEVfQ01ZXzE2X1BMQU5BUiAgICAgKENPTE9SU1BBQ0VfU0goUFRfQ01ZKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxQTEFOQVJfU0goMSkpCi0jZGVmaW5lIFRZUEVfQ01ZXzE2X1NFICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfQ01ZKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxFTkRJQU4xNl9TSCgxKSkKLQotI2RlZmluZSBUWVBFX0NNWUtfOCAgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0NNWUspfENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDEpKQotI2RlZmluZSBUWVBFX0NNWUtBXzggICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0NNWUspfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDEpKQotI2RlZmluZSBUWVBFX0NNWUtfOF9SRVYgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0NNWUspfENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDEpfEZMQVZPUl9TSCgxKSkKLSNkZWZpbmUgVFlQRV9ZVVZLXzggICAgICAgICAgICBUWVBFX0NNWUtfOF9SRVYKLSNkZWZpbmUgVFlQRV9DTVlLXzhfUExBTkFSICAgICAoQ09MT1JTUEFDRV9TSChQVF9DTVlLKXxDSEFOTkVMU19TSCg0KXxCWVRFU19TSCgxKXxQTEFOQVJfU0goMSkpCi0jZGVmaW5lIFRZUEVfQ01ZS18xNiAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfQ01ZSyl8Q0hBTk5FTFNfU0goNCl8QllURVNfU0goMikpCi0jZGVmaW5lIFRZUEVfQ01ZS18xNl9SRVYgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfQ01ZSyl8Q0hBTk5FTFNfU0goNCl8QllURVNfU0goMil8RkxBVk9SX1NIKDEpKQotI2RlZmluZSBUWVBFX1lVVktfMTYgICAgICAgICAgIFRZUEVfQ01ZS18xNl9SRVYKLSNkZWZpbmUgVFlQRV9DTVlLXzE2X1BMQU5BUiAgICAoQ09MT1JTUEFDRV9TSChQVF9DTVlLKXxDSEFOTkVMU19TSCg0KXxCWVRFU19TSCgyKXxQTEFOQVJfU0goMSkpCi0jZGVmaW5lIFRZUEVfQ01ZS18xNl9TRSAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfQ01ZSyl8Q0hBTk5FTFNfU0goNCl8QllURVNfU0goMil8RU5ESUFOMTZfU0goMSkpCi0KLSNkZWZpbmUgVFlQRV9LWU1DXzggICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9DTVlLKXxDSEFOTkVMU19TSCg0KXxCWVRFU19TSCgxKXxET1NXQVBfU0goMSkpCi0jZGVmaW5lIFRZUEVfS1lNQ18xNiAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfQ01ZSyl8Q0hBTk5FTFNfU0goNCl8QllURVNfU0goMil8RE9TV0FQX1NIKDEpKQotI2RlZmluZSBUWVBFX0tZTUNfMTZfU0UgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0NNWUspfENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKXxFTkRJQU4xNl9TSCgxKSkKLQotI2RlZmluZSBUWVBFX0tDTVlfOCAgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0NNWUspfENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDEpfFNXQVBGSVJTVF9TSCgxKSkKLSNkZWZpbmUgVFlQRV9LQ01ZXzhfUkVWICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9DTVlLKXxDSEFOTkVMU19TSCg0KXxCWVRFU19TSCgxKXxGTEFWT1JfU0goMSl8U1dBUEZJUlNUX1NIKDEpKQotI2RlZmluZSBUWVBFX0tDTVlfMTYgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0NNWUspfENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDIpfFNXQVBGSVJTVF9TSCgxKSkKLSNkZWZpbmUgVFlQRV9LQ01ZXzE2X1JFViAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9DTVlLKXxDSEFOTkVMU19TSCg0KXxCWVRFU19TSCgyKXxGTEFWT1JfU0goMSl8U1dBUEZJUlNUX1NIKDEpKQotI2RlZmluZSBUWVBFX0tDTVlfMTZfU0UgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0NNWUspfENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDIpfEVORElBTjE2X1NIKDEpfFNXQVBGSVJTVF9TSCgxKSkKLQotI2RlZmluZSBUWVBFX0NNWUs1XzggICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX01DSDUpfENIQU5ORUxTX1NIKDUpfEJZVEVTX1NIKDEpKQotI2RlZmluZSBUWVBFX0NNWUs1XzE2ICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX01DSDUpfENIQU5ORUxTX1NIKDUpfEJZVEVTX1NIKDIpKQotI2RlZmluZSBUWVBFX0NNWUs1XzE2X1NFICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX01DSDUpfENIQU5ORUxTX1NIKDUpfEJZVEVTX1NIKDIpfEVORElBTjE2X1NIKDEpKQotI2RlZmluZSBUWVBFX0tZTUM1XzggICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX01DSDUpfENIQU5ORUxTX1NIKDUpfEJZVEVTX1NIKDEpfERPU1dBUF9TSCgxKSkKLSNkZWZpbmUgVFlQRV9LWU1DNV8xNiAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0g1KXxDSEFOTkVMU19TSCg1KXxCWVRFU19TSCgyKXxET1NXQVBfU0goMSkpCi0jZGVmaW5lIFRZUEVfS1lNQzVfMTZfU0UgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNINSl8Q0hBTk5FTFNfU0goNSl8QllURVNfU0goMil8RE9TV0FQX1NIKDEpfEVORElBTjE2X1NIKDEpKQotI2RlZmluZSBUWVBFX0NNWUs2XzggICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX01DSDYpfENIQU5ORUxTX1NIKDYpfEJZVEVTX1NIKDEpKQotI2RlZmluZSBUWVBFX0NNWUs2XzhfUExBTkFSICAgIChDT0xPUlNQQUNFX1NIKFBUX01DSDYpfENIQU5ORUxTX1NIKDYpfEJZVEVTX1NIKDEpfFBMQU5BUl9TSCgxKSkKLSNkZWZpbmUgVFlQRV9DTVlLNl8xNiAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0g2KXxDSEFOTkVMU19TSCg2KXxCWVRFU19TSCgyKSkKLSNkZWZpbmUgVFlQRV9DTVlLNl8xNl9QTEFOQVIgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0g2KXxDSEFOTkVMU19TSCg2KXxCWVRFU19TSCgyKXxQTEFOQVJfU0goMSkpCi0jZGVmaW5lIFRZUEVfQ01ZSzZfMTZfU0UgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNINil8Q0hBTk5FTFNfU0goNil8QllURVNfU0goMil8RU5ESUFOMTZfU0goMSkpCi0jZGVmaW5lIFRZUEVfQ01ZSzdfOCAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNINyl8Q0hBTk5FTFNfU0goNyl8QllURVNfU0goMSkpCi0jZGVmaW5lIFRZUEVfQ01ZSzdfMTYgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNINyl8Q0hBTk5FTFNfU0goNyl8QllURVNfU0goMikpCi0jZGVmaW5lIFRZUEVfQ01ZSzdfMTZfU0UgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNINyl8Q0hBTk5FTFNfU0goNyl8QllURVNfU0goMil8RU5ESUFOMTZfU0goMSkpCi0jZGVmaW5lIFRZUEVfS1lNQzdfOCAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNINyl8Q0hBTk5FTFNfU0goNyl8QllURVNfU0goMSl8RE9TV0FQX1NIKDEpKQotI2RlZmluZSBUWVBFX0tZTUM3XzE2ICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX01DSDcpfENIQU5ORUxTX1NIKDcpfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKSkKLSNkZWZpbmUgVFlQRV9LWU1DN18xNl9TRSAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0g3KXxDSEFOTkVMU19TSCg3KXxCWVRFU19TSCgyKXxET1NXQVBfU0goMSl8RU5ESUFOMTZfU0goMSkpCi0jZGVmaW5lIFRZUEVfQ01ZSzhfOCAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIOCl8Q0hBTk5FTFNfU0goOCl8QllURVNfU0goMSkpCi0jZGVmaW5lIFRZUEVfQ01ZSzhfMTYgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIOCl8Q0hBTk5FTFNfU0goOCl8QllURVNfU0goMikpCi0jZGVmaW5lIFRZUEVfQ01ZSzhfMTZfU0UgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIOCl8Q0hBTk5FTFNfU0goOCl8QllURVNfU0goMil8RU5ESUFOMTZfU0goMSkpCi0jZGVmaW5lIFRZUEVfS1lNQzhfOCAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIOCl8Q0hBTk5FTFNfU0goOCl8QllURVNfU0goMSl8RE9TV0FQX1NIKDEpKQotI2RlZmluZSBUWVBFX0tZTUM4XzE2ICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX01DSDgpfENIQU5ORUxTX1NIKDgpfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKSkKLSNkZWZpbmUgVFlQRV9LWU1DOF8xNl9TRSAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0g4KXxDSEFOTkVMU19TSCg4KXxCWVRFU19TSCgyKXxET1NXQVBfU0goMSl8RU5ESUFOMTZfU0goMSkpCi0jZGVmaW5lIFRZUEVfQ01ZSzlfOCAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIOSl8Q0hBTk5FTFNfU0goOSl8QllURVNfU0goMSkpCi0jZGVmaW5lIFRZUEVfQ01ZSzlfMTYgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIOSl8Q0hBTk5FTFNfU0goOSl8QllURVNfU0goMikpCi0jZGVmaW5lIFRZUEVfQ01ZSzlfMTZfU0UgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIOSl8Q0hBTk5FTFNfU0goOSl8QllURVNfU0goMil8RU5ESUFOMTZfU0goMSkpCi0jZGVmaW5lIFRZUEVfS1lNQzlfOCAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIOSl8Q0hBTk5FTFNfU0goOSl8QllURVNfU0goMSl8RE9TV0FQX1NIKDEpKQotI2RlZmluZSBUWVBFX0tZTUM5XzE2ICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX01DSDkpfENIQU5ORUxTX1NIKDkpfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKSkKLSNkZWZpbmUgVFlQRV9LWU1DOV8xNl9TRSAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0g5KXxDSEFOTkVMU19TSCg5KXxCWVRFU19TSCgyKXxET1NXQVBfU0goMSl8RU5ESUFOMTZfU0goMSkpCi0jZGVmaW5lIFRZUEVfQ01ZSzEwXzggICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIMTApfENIQU5ORUxTX1NIKDEwKXxCWVRFU19TSCgxKSkKLSNkZWZpbmUgVFlQRV9DTVlLMTBfMTYgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0gxMCl8Q0hBTk5FTFNfU0goMTApfEJZVEVTX1NIKDIpKQotI2RlZmluZSBUWVBFX0NNWUsxMF8xNl9TRSAgICAgIChDT0xPUlNQQUNFX1NIKFBUX01DSDEwKXxDSEFOTkVMU19TSCgxMCl8QllURVNfU0goMil8RU5ESUFOMTZfU0goMSkpCi0jZGVmaW5lIFRZUEVfS1lNQzEwXzggICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIMTApfENIQU5ORUxTX1NIKDEwKXxCWVRFU19TSCgxKXxET1NXQVBfU0goMSkpCi0jZGVmaW5lIFRZUEVfS1lNQzEwXzE2ICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIMTApfENIQU5ORUxTX1NIKDEwKXxCWVRFU19TSCgyKXxET1NXQVBfU0goMSkpCi0jZGVmaW5lIFRZUEVfS1lNQzEwXzE2X1NFICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIMTApfENIQU5ORUxTX1NIKDEwKXxCWVRFU19TSCgyKXxET1NXQVBfU0goMSl8RU5ESUFOMTZfU0goMSkpCi0jZGVmaW5lIFRZUEVfQ01ZSzExXzggICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIMTEpfENIQU5ORUxTX1NIKDExKXxCWVRFU19TSCgxKSkKLSNkZWZpbmUgVFlQRV9DTVlLMTFfMTYgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0gxMSl8Q0hBTk5FTFNfU0goMTEpfEJZVEVTX1NIKDIpKQotI2RlZmluZSBUWVBFX0NNWUsxMV8xNl9TRSAgICAgIChDT0xPUlNQQUNFX1NIKFBUX01DSDExKXxDSEFOTkVMU19TSCgxMSl8QllURVNfU0goMil8RU5ESUFOMTZfU0goMSkpCi0jZGVmaW5lIFRZUEVfS1lNQzExXzggICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIMTEpfENIQU5ORUxTX1NIKDExKXxCWVRFU19TSCgxKXxET1NXQVBfU0goMSkpCi0jZGVmaW5lIFRZUEVfS1lNQzExXzE2ICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIMTEpfENIQU5ORUxTX1NIKDExKXxCWVRFU19TSCgyKXxET1NXQVBfU0goMSkpCi0jZGVmaW5lIFRZUEVfS1lNQzExXzE2X1NFICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIMTEpfENIQU5ORUxTX1NIKDExKXxCWVRFU19TSCgyKXxET1NXQVBfU0goMSl8RU5ESUFOMTZfU0goMSkpCi0jZGVmaW5lIFRZUEVfQ01ZSzEyXzggICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIMTIpfENIQU5ORUxTX1NIKDEyKXxCWVRFU19TSCgxKSkKLSNkZWZpbmUgVFlQRV9DTVlLMTJfMTYgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9NQ0gxMil8Q0hBTk5FTFNfU0goMTIpfEJZVEVTX1NIKDIpKQotI2RlZmluZSBUWVBFX0NNWUsxMl8xNl9TRSAgICAgIChDT0xPUlNQQUNFX1NIKFBUX01DSDEyKXxDSEFOTkVMU19TSCgxMil8QllURVNfU0goMil8RU5ESUFOMTZfU0goMSkpCi0jZGVmaW5lIFRZUEVfS1lNQzEyXzggICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIMTIpfENIQU5ORUxTX1NIKDEyKXxCWVRFU19TSCgxKXxET1NXQVBfU0goMSkpCi0jZGVmaW5lIFRZUEVfS1lNQzEyXzE2ICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIMTIpfENIQU5ORUxTX1NIKDEyKXxCWVRFU19TSCgyKXxET1NXQVBfU0goMSkpCi0jZGVmaW5lIFRZUEVfS1lNQzEyXzE2X1NFICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTUNIMTIpfENIQU5ORUxTX1NIKDEyKXxCWVRFU19TSCgyKXxET1NXQVBfU0goMSl8RU5ESUFOMTZfU0goMSkpCi0KLS8vIENvbG9yaW1ldHJpYwotI2RlZmluZSBUWVBFX1hZWl8xNiAgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX1hZWil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMikpCi0jZGVmaW5lIFRZUEVfTGFiXzggICAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTGFiKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKSkKLSNkZWZpbmUgVFlQRV9MYWJWMl84ICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9MYWJWMil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMSkpCi0KLSNkZWZpbmUgVFlQRV9BTGFiXzggICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9MYWIpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpfEVYVFJBX1NIKDEpfFNXQVBGSVJTVF9TSCgxKSkKLSNkZWZpbmUgVFlQRV9BTGFiVjJfOCAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9MYWJWMil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMSl8RVhUUkFfU0goMSl8U1dBUEZJUlNUX1NIKDEpKQotI2RlZmluZSBUWVBFX0xhYl8xNiAgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0xhYil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMikpCi0jZGVmaW5lIFRZUEVfTGFiVjJfMTYgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfTGFiVjIpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpKQotI2RlZmluZSBUWVBFX1l4eV8xNiAgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX1l4eSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMikpCi0KLS8vIFlDYkNyCi0jZGVmaW5lIFRZUEVfWUNiQ3JfOCAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfWUNiQ3IpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpKQotI2RlZmluZSBUWVBFX1lDYkNyXzhfUExBTkFSICAgIChDT0xPUlNQQUNFX1NIKFBUX1lDYkNyKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKXxQTEFOQVJfU0goMSkpCi0jZGVmaW5lIFRZUEVfWUNiQ3JfMTYgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfWUNiQ3IpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpKQotI2RlZmluZSBUWVBFX1lDYkNyXzE2X1BMQU5BUiAgIChDT0xPUlNQQUNFX1NIKFBUX1lDYkNyKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxQTEFOQVJfU0goMSkpCi0jZGVmaW5lIFRZUEVfWUNiQ3JfMTZfU0UgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfWUNiQ3IpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfEVORElBTjE2X1NIKDEpKQotCi0vLyBZVVYKLSNkZWZpbmUgVFlQRV9ZVVZfOCAgICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9ZVVYpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpKQotI2RlZmluZSBUWVBFX1lVVl84X1BMQU5BUiAgICAgIChDT0xPUlNQQUNFX1NIKFBUX1lVVil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMSl8UExBTkFSX1NIKDEpKQotI2RlZmluZSBUWVBFX1lVVl8xNiAgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX1lVVil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMikpCi0jZGVmaW5lIFRZUEVfWVVWXzE2X1BMQU5BUiAgICAgKENPTE9SU1BBQ0VfU0goUFRfWVVWKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxQTEFOQVJfU0goMSkpCi0jZGVmaW5lIFRZUEVfWVVWXzE2X1NFICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfWVVWKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxFTkRJQU4xNl9TSCgxKSkKLQotLy8gSExTCi0jZGVmaW5lIFRZUEVfSExTXzggICAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfSExTKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKSkKLSNkZWZpbmUgVFlQRV9ITFNfOF9QTEFOQVIgICAgICAoQ09MT1JTUEFDRV9TSChQVF9ITFMpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpfFBMQU5BUl9TSCgxKSkKLSNkZWZpbmUgVFlQRV9ITFNfMTYgICAgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9ITFMpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpKQotI2RlZmluZSBUWVBFX0hMU18xNl9QTEFOQVIgICAgIChDT0xPUlNQQUNFX1NIKFBUX0hMUyl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8UExBTkFSX1NIKDEpKQotI2RlZmluZSBUWVBFX0hMU18xNl9TRSAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0hMUyl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RU5ESUFOMTZfU0goMSkpCi0KLS8vIEhTVgotI2RlZmluZSBUWVBFX0hTVl84ICAgICAgICAgICAgIChDT0xPUlNQQUNFX1NIKFBUX0hTVil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMSkpCi0jZGVmaW5lIFRZUEVfSFNWXzhfUExBTkFSICAgICAgKENPTE9SU1BBQ0VfU0goUFRfSFNWKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKXxQTEFOQVJfU0goMSkpCi0jZGVmaW5lIFRZUEVfSFNWXzE2ICAgICAgICAgICAgKENPTE9SU1BBQ0VfU0goUFRfSFNWKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKSkKLSNkZWZpbmUgVFlQRV9IU1ZfMTZfUExBTkFSICAgICAoQ09MT1JTUEFDRV9TSChQVF9IU1YpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfFBMQU5BUl9TSCgxKSkKLSNkZWZpbmUgVFlQRV9IU1ZfMTZfU0UgICAgICAgICAoQ09MT1JTUEFDRV9TSChQVF9IU1YpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfEVORElBTjE2X1NIKDEpKQotCi0vLyBOYW1lZCBjb2xvciBpbmRleC4gT25seSAxNiBiaXRzIGFsbG93ZWQgKGRvbid0IGNoZWNrIGNvbG9yc3BhY2UpCi0jZGVmaW5lIFRZUEVfTkFNRURfQ09MT1JfSU5ERVggKENIQU5ORUxTX1NIKDEpfEJZVEVTX1NIKDIpKQotCi0vLyBGbG9hdCBmb3JtYXR0ZXJzLgotI2RlZmluZSBUWVBFX1hZWl9GTFQgICAgICAgICAgKEZMT0FUX1NIKDEpfENPTE9SU1BBQ0VfU0goUFRfWFlaKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCg0KSkKLSNkZWZpbmUgVFlQRV9MYWJfRkxUICAgICAgICAgIChGTE9BVF9TSCgxKXxDT0xPUlNQQUNFX1NIKFBUX0xhYil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goNCkpCi0jZGVmaW5lIFRZUEVfTGFiQV9GTFQgICAgICAgICAoRkxPQVRfU0goMSl8Q09MT1JTUEFDRV9TSChQVF9MYWIpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDQpKQotI2RlZmluZSBUWVBFX0dSQVlfRkxUICAgICAgICAgKEZMT0FUX1NIKDEpfENPTE9SU1BBQ0VfU0goUFRfR1JBWSl8Q0hBTk5FTFNfU0goMSl8QllURVNfU0goNCkpCi0jZGVmaW5lIFRZUEVfUkdCX0ZMVCAgICAgICAgICAoRkxPQVRfU0goMSl8Q09MT1JTUEFDRV9TSChQVF9SR0IpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDQpKQotCi0jZGVmaW5lIFRZUEVfUkdCQV9GTFQgICAgICAgICAoRkxPQVRfU0goMSl8Q09MT1JTUEFDRV9TSChQVF9SR0IpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDQpKQotI2RlZmluZSBUWVBFX0FSR0JfRkxUICAgICAgICAgKEZMT0FUX1NIKDEpfENPTE9SU1BBQ0VfU0goUFRfUkdCKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCg0KXxTV0FQRklSU1RfU0goMSkpCi0jZGVmaW5lIFRZUEVfQkdSX0ZMVCAgICAgICAgICAoRkxPQVRfU0goMSl8Q09MT1JTUEFDRV9TSChQVF9SR0IpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDQpfERPU1dBUF9TSCgxKSkKLSNkZWZpbmUgVFlQRV9CR1JBX0ZMVCAgICAgICAgIChGTE9BVF9TSCgxKXxDT0xPUlNQQUNFX1NIKFBUX1JHQil8RVhUUkFfU0goMSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goNCl8RE9TV0FQX1NIKDEpfFNXQVBGSVJTVF9TSCgxKSkKLSNkZWZpbmUgVFlQRV9BQkdSX0ZMVCAgICAgICAgIChGTE9BVF9TSCgxKXxDT0xPUlNQQUNFX1NIKFBUX1JHQil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goNCl8RE9TV0FQX1NIKDEpKQotCi0jZGVmaW5lIFRZUEVfQ01ZS19GTFQgICAgICAgICAoRkxPQVRfU0goMSl8Q09MT1JTUEFDRV9TSChQVF9DTVlLKXxDSEFOTkVMU19TSCg0KXxCWVRFU19TSCg0KSkKLQotLy8gRmxvYXRpbmcgcG9pbnQgZm9ybWF0dGVycy4KLS8vIE5PVEUgVEhBVCAnQllURVMnIEZJRUxEIElTIFNFVCBUTyBaRVJPIE9OIERMQiBiZWNhdXNlIDggYnl0ZXMgb3ZlcmZsb3dzIHRoZSBiaXRmaWVsZAotI2RlZmluZSBUWVBFX1hZWl9EQkwgICAgICAgICAgKEZMT0FUX1NIKDEpfENPTE9SU1BBQ0VfU0goUFRfWFlaKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgwKSkKLSNkZWZpbmUgVFlQRV9MYWJfREJMICAgICAgICAgIChGTE9BVF9TSCgxKXxDT0xPUlNQQUNFX1NIKFBUX0xhYil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMCkpCi0jZGVmaW5lIFRZUEVfR1JBWV9EQkwgICAgICAgICAoRkxPQVRfU0goMSl8Q09MT1JTUEFDRV9TSChQVF9HUkFZKXxDSEFOTkVMU19TSCgxKXxCWVRFU19TSCgwKSkKLSNkZWZpbmUgVFlQRV9SR0JfREJMICAgICAgICAgIChGTE9BVF9TSCgxKXxDT0xPUlNQQUNFX1NIKFBUX1JHQil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMCkpCi0jZGVmaW5lIFRZUEVfQkdSX0RCTCAgICAgICAgICAoRkxPQVRfU0goMSl8Q09MT1JTUEFDRV9TSChQVF9SR0IpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDApfERPU1dBUF9TSCgxKSkKLSNkZWZpbmUgVFlQRV9DTVlLX0RCTCAgICAgICAgIChGTE9BVF9TSCgxKXxDT0xPUlNQQUNFX1NIKFBUX0NNWUspfENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDApKQotCi0vLyBJRUVFIDc1NC0yMDA4ICJoYWxmIgotI2RlZmluZSBUWVBFX0dSQVlfSEFMRl9GTFQgICAgKEZMT0FUX1NIKDEpfENPTE9SU1BBQ0VfU0goUFRfR1JBWSl8Q0hBTk5FTFNfU0goMSl8QllURVNfU0goMikpCi0jZGVmaW5lIFRZUEVfUkdCX0hBTEZfRkxUICAgICAoRkxPQVRfU0goMSl8Q09MT1JTUEFDRV9TSChQVF9SR0IpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpKQotI2RlZmluZSBUWVBFX1JHQkFfSEFMRl9GTFQgICAgKEZMT0FUX1NIKDEpfENPTE9SU1BBQ0VfU0goUFRfUkdCKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKSkKLSNkZWZpbmUgVFlQRV9DTVlLX0hBTEZfRkxUICAgIChGTE9BVF9TSCgxKXxDT0xPUlNQQUNFX1NIKFBUX0NNWUspfENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDIpKQotCi0jZGVmaW5lIFRZUEVfUkdCQV9IQUxGX0ZMVCAgICAoRkxPQVRfU0goMSl8Q09MT1JTUEFDRV9TSChQVF9SR0IpfEVYVFJBX1NIKDEpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpKQotI2RlZmluZSBUWVBFX0FSR0JfSEFMRl9GTFQgICAgKEZMT0FUX1NIKDEpfENPTE9SU1BBQ0VfU0goUFRfUkdCKXxFWFRSQV9TSCgxKXxDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxTV0FQRklSU1RfU0goMSkpCi0jZGVmaW5lIFRZUEVfQkdSX0hBTEZfRkxUICAgICAoRkxPQVRfU0goMSl8Q09MT1JTUEFDRV9TSChQVF9SR0IpfENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKSkKLSNkZWZpbmUgVFlQRV9CR1JBX0hBTEZfRkxUICAgIChGTE9BVF9TSCgxKXxDT0xPUlNQQUNFX1NIKFBUX1JHQil8RVhUUkFfU0goMSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RE9TV0FQX1NIKDEpfFNXQVBGSVJTVF9TSCgxKSkKLSNkZWZpbmUgVFlQRV9BQkdSX0hBTEZfRkxUICAgIChGTE9BVF9TSCgxKXxDT0xPUlNQQUNFX1NIKFBUX1JHQil8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RE9TV0FQX1NIKDEpKQotCi0jZW5kaWYKLQotLy8gQ29sb3JzcGFjZXMKLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgY21zRmxvYXQ2NE51bWJlciBYOwotICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIFk7Ci0gICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgWjsKLQotICAgIH0gY21zQ0lFWFlaOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgeDsKLSAgICAgICAgY21zRmxvYXQ2NE51bWJlciB5OwotICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIFk7Ci0KLSAgICB9IGNtc0NJRXh5WTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEw7Ci0gICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgYTsKLSAgICAgICAgY21zRmxvYXQ2NE51bWJlciBiOwotCi0gICAgfSBjbXNDSUVMYWI7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgY21zRmxvYXQ2NE51bWJlciBMOwotICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEM7Ci0gICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgaDsKLQotICAgIH0gY21zQ0lFTENoOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgSjsKLSAgICAgICAgY21zRmxvYXQ2NE51bWJlciBDOwotICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIGg7Ci0KLSAgICB9IGNtc0pDaDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICBjbXNDSUVYWVogIFJlZDsKLSAgICAgICAgY21zQ0lFWFlaICBHcmVlbjsKLSAgICAgICAgY21zQ0lFWFlaICBCbHVlOwotCi0gICAgfSBjbXNDSUVYWVpUUklQTEU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgY21zQ0lFeHlZICBSZWQ7Ci0gICAgICAgIGNtc0NJRXh5WSAgR3JlZW47Ci0gICAgICAgIGNtc0NJRXh5WSAgQmx1ZTsKLQotICAgIH0gY21zQ0lFeHlZVFJJUExFOwotCi0vLyBJbGx1bWluYW50IHR5cGVzIGZvciBzdHJ1Y3RzIGJlbG93Ci0jZGVmaW5lIGNtc0lMTFVNSU5BTlRfVFlQRV9VTktOT1dOIDB4MDAwMDAwMAotI2RlZmluZSBjbXNJTExVTUlOQU5UX1RZUEVfRDUwICAgICAweDAwMDAwMDEKLSNkZWZpbmUgY21zSUxMVU1JTkFOVF9UWVBFX0Q2NSAgICAgMHgwMDAwMDAyCi0jZGVmaW5lIGNtc0lMTFVNSU5BTlRfVFlQRV9EOTMgICAgIDB4MDAwMDAwMwotI2RlZmluZSBjbXNJTExVTUlOQU5UX1RZUEVfRjIgICAgICAweDAwMDAwMDQKLSNkZWZpbmUgY21zSUxMVU1JTkFOVF9UWVBFX0Q1NSAgICAgMHgwMDAwMDA1Ci0jZGVmaW5lIGNtc0lMTFVNSU5BTlRfVFlQRV9BICAgICAgIDB4MDAwMDAwNgotI2RlZmluZSBjbXNJTExVTUlOQU5UX1RZUEVfRSAgICAgICAweDAwMDAwMDcKLSNkZWZpbmUgY21zSUxMVU1JTkFOVF9UWVBFX0Y4ICAgICAgMHgwMDAwMDA4Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgY21zVUludDMyTnVtYmVyICBPYnNlcnZlcjsgICAgLy8gMCA9IHVua25vd24sIDE9Q0lFIDE5MzEsIDI9Q0lFIDE5NjQKLSAgICAgICAgY21zQ0lFWFlaICAgICAgICBCYWNraW5nOyAgICAgLy8gVmFsdWUgb2YgYmFja2luZwotICAgICAgICBjbXNVSW50MzJOdW1iZXIgIEdlb21ldHJ5OyAgICAvLyAwPXVua25vd24sIDE9NDUvMCwgMC80NSAyPTBkLCBkLzAKLSAgICAgICAgY21zRmxvYXQ2NE51bWJlciBGbGFyZTsgICAgICAgLy8gMC4uMS4wCi0gICAgICAgIGNtc1VJbnQzMk51bWJlciAgSWxsdW1pbmFudFR5cGU7Ci0KLSAgICB9IGNtc0lDQ01lYXN1cmVtZW50Q29uZGl0aW9uczsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICBjbXNDSUVYWVogICAgICAgSWxsdW1pbmFudFhZWjsgICAvLyBOb3QgdGhlIHNhbWUgc3RydWN0IGFzIENBTTAyLAotICAgICAgICBjbXNDSUVYWVogICAgICAgU3Vycm91bmRYWVo7ICAgICAvLyBUaGlzIGlzIGZvciBzdG9yaW5nIHRoZSB0YWcKLSAgICAgICAgY21zVUludDMyTnVtYmVyIElsbHVtaW5hbnRUeXBlOyAgLy8gdmlld2luZyBjb25kaXRpb24KLQotICAgIH0gY21zSUNDVmlld2luZ0NvbmRpdGlvbnM7Ci0KLS8vIFN1cHBvcnQgb2Ygbm9uLXN0YW5kYXJkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DTVNBUEkgaW50ICAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc3N0cmNhc2VjbXAoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKTsKLUNNU0FQSSBsb25nIGludCAgICAgICAgICBDTVNFWFBPUlQgY21zZmlsZWxlbmd0aChGSUxFKiBmKTsKLQotCi0vLyBDb250ZXh0IGhhbmRsaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEVhY2ggY29udGV4dCBob2xkcyBpdHMgb3ducyBnbG9iYWxzIGFuZCBpdHMgb3duIHBsdWctaW5zLiBUaGVyZSBpcyBhIGdsb2JhbCBjb250ZXh0IHdpdGggdGhlIGlkID0gMCBmb3IgbGVjYWN5IGNvbXBhdGliaWxpdHkKLS8vIHRob3VnaCB1c2luZyB0aGUgZ2xvYmFsIGNvbnRleHQgaXMgbm90IHJlY29tZW5kZWQuIFByb3BlciBjb250ZXh0IGhhbmRsaW5nIG1ha2VzIGxjbXMgbW9yZSB0aHJlYWQtc2FmZS4KLQotdHlwZWRlZiBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjbXNDb250ZXh0OwotCi1DTVNBUEkgY21zQ29udGV4dCAgICAgICBDTVNFWFBPUlQgY21zQ3JlYXRlQ29udGV4dCh2b2lkKiBQbHVnaW4sIHZvaWQqIFVzZXJEYXRhKTsKLUNNU0FQSSB2b2lkICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNEZWxldGVDb250ZXh0KGNtc0NvbnRleHQgQ29udGV4SUQpOwotQ01TQVBJIGNtc0NvbnRleHQgICAgICAgQ01TRVhQT1JUIGNtc0R1cENvbnRleHQoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIE5ld1VzZXJEYXRhKTsKLUNNU0FQSSB2b2lkKiAgICAgICAgICAgIENNU0VYUE9SVCBjbXNHZXRDb250ZXh0VXNlckRhdGEoY21zQ29udGV4dCBDb250ZXh0SUQpOwotCi0vLyBQbHVnLUluIHJlZ2lzdGVyaW5nICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUIGNtc1BsdWdpbih2b2lkKiBQbHVnaW4pOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNQbHVnaW5USFIoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIFBsdWdpbik7Ci1DTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc1VucmVnaXN0ZXJQbHVnaW5zKHZvaWQpOwotQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNVbnJlZ2lzdGVyUGx1Z2luc1RIUihjbXNDb250ZXh0IENvbnRleHRJRCk7Ci0KLS8vIEVycm9yIGxvZ2dpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBUaGVyZSBpcyBubyBlcnJvciBoYW5kbGluZyBhdCBhbGwuIFdoZW4gYSBmdW5jdGlvbiBmYWlscywgaXQgcmV0dXJucyBwcm9wZXIgdmFsdWUuCi0vLyBGb3IgZXhhbXBsZSwgYWxsIGNyZWF0ZSBmdW5jdGlvbnMgZG9lcyByZXR1cm4gTlVMTCBvbiBmYWlsdXJlLiBPdGhlciBtYXkgcmV0dXJuIEZBTFNFLgotLy8gSXQgbWF5IGJlIGludGVyZXN0aW5nLCBmb3IgdGhlIGRldmVsb3BlciwgdG8ga25vdyB3aHkgdGhlIGZ1bmN0aW9uIGlzIGZhaWxpbmcuCi0vLyBmb3IgdGhhdCByZWFzb24sIGxjbXMyIGRvZXMgb2ZmZXIgYSBsb2dnaW5nIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHdpbGwgZ2V0Ci0vLyBhbiBFTkdMSVNIIHN0cmluZyB3aXRoIHNvbWUgY2x1ZXMgb24gd2hhdCBpcyBnb2luZyB3cm9uZy4gWW91IGNhbiBzaG93IHRoaXMKLS8vIGluZm8gdG8gdGhlIGVuZCB1c2VyIGlmIHlvdSB3aXNoLCBvciBqdXN0IGNyZWF0ZSBzb21lIHNvcnQgb2YgbG9nIG9uIGRpc2suCi0vLyBUaGUgbG9nZ2luZyBmdW5jdGlvbiBzaG91bGQgTk9UIHRlcm1pbmF0ZSB0aGUgcHJvZ3JhbSwgYXMgdGhpcyBvYnZpb3VzbHkgY2FuIGxlYXZlCi0vLyB1bmZyZWVkIHJlc291cmNlcy4gSXQgaXMgdGhlIHByb2dyYW1tZXIncyByZXNwb25zaWJpbGl0eSB0byBjaGVjayBlYWNoIGZ1bmN0aW9uCi0vLyByZXR1cm4gY29kZSB0byBtYWtlIHN1cmUgaXQgZGlkbid0IGZhaWwuCi0KLSNkZWZpbmUgY21zRVJST1JfVU5ERUZJTkVEICAgICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIGNtc0VSUk9SX0ZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBjbXNFUlJPUl9SQU5HRSAgICAgICAgICAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgY21zRVJST1JfSU5URVJOQUwgICAgICAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIGNtc0VSUk9SX05VTEwgICAgICAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBjbXNFUlJPUl9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgY21zRVJST1JfU0VFSyAgICAgICAgICAgICAgICAgICAgICAgICA2Ci0jZGVmaW5lIGNtc0VSUk9SX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgNwotI2RlZmluZSBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiAgICAgICAgICAgIDgKLSNkZWZpbmUgY21zRVJST1JfQ09MT1JTUEFDRV9DSEVDSyAgICAgICAgICAgICA5Ci0jZGVmaW5lIGNtc0VSUk9SX0FMUkVBRFlfREVGSU5FRCAgICAgICAgICAgICAgMTAKLSNkZWZpbmUgY21zRVJST1JfQkFEX1NJR05BVFVSRSAgICAgICAgICAgICAgICAxMQotI2RlZmluZSBjbXNFUlJPUl9DT1JSVVBUSU9OX0RFVEVDVEVEICAgICAgICAgIDEyCi0jZGVmaW5lIGNtc0VSUk9SX05PVF9TVUlUQUJMRSAgICAgICAgICAgICAgICAgMTMKLQotLy8gRXJyb3IgbG9nZ2VyIGlzIGNhbGxlZCB3aXRoIHRoZSBDb250ZXh0SUQgd2hlbiBhIG1lc3NhZ2UgaXMgcmFpc2VkLiBUaGlzIGdpdmVzIHRoZQotLy8gY2hhbmNlIHRvIGtub3cgd2hpY2ggdGhyZWFkIGlzIHJlc3BvbnNpYmxlIG9mIHRoZSB3YXJuaW5nIGFuZCBhbnkgZW52aXJvbm1lbnQgYXNzb2NpYXRlZAotLy8gd2l0aCBpdC4gTm9uLW11bHRpdGhyZWFkaW5nIGFwcGxpY2F0aW9ucyBtYXkgc2FmZWx5IGlnbm9yZSB0aGlzIHBhcmFtZXRlci4KLS8vIE5vdGUgdGhhdCB1bmRlciBjZXJ0YWluIHNwZWNpYWwgY2lyY3Vtc3RhbmNlcywgQ29udGV4dElEIG1heSBiZSBOVUxMLgotdHlwZWRlZiB2b2lkICAoKiBjbXNMb2dFcnJvckhhbmRsZXJGdW5jdGlvbikoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBFcnJvckNvZGUsIGNvbnN0IGNoYXIgKlRleHQpOwotCi0vLyBBbGxvd3MgdXNlciB0byBzZXQgYW55IHNwZWNpZmljIGxvZ2dlcgotQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNTZXRMb2dFcnJvckhhbmRsZXIoY21zTG9nRXJyb3JIYW5kbGVyRnVuY3Rpb24gRm4pOwotQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNTZXRMb2dFcnJvckhhbmRsZXJUSFIoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc0xvZ0Vycm9ySGFuZGxlckZ1bmN0aW9uIEZuKTsKLQotLy8gQ29udmVyc2lvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gUmV0dXJucyBwb2ludGVycyB0byBjb25zdGFudCBzdHJ1Y3RzCi1DTVNBUEkgY29uc3QgY21zQ0lFWFlaKiAgQ01TRVhQT1JUIGNtc0Q1MF9YWVoodm9pZCk7Ci1DTVNBUEkgY29uc3QgY21zQ0lFeHlZKiAgQ01TRVhQT1JUIGNtc0Q1MF94eVkodm9pZCk7Ci0KLS8vIENvbG9yaW1ldHJpYyBzcGFjZSBjb252ZXJzaW9ucwotQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNYWVoyeHlZKGNtc0NJRXh5WSogRGVzdCwgY29uc3QgY21zQ0lFWFlaKiBTb3VyY2UpOwotQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXN4eVkyWFlaKGNtc0NJRVhZWiogRGVzdCwgY29uc3QgY21zQ0lFeHlZKiBTb3VyY2UpOwotQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNYWVoyTGFiKGNvbnN0IGNtc0NJRVhZWiogV2hpdGVQb2ludCwgY21zQ0lFTGFiKiBMYWIsIGNvbnN0IGNtc0NJRVhZWiogeHl6KTsKLUNNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zTGFiMlhZWihjb25zdCBjbXNDSUVYWVoqIFdoaXRlUG9pbnQsIGNtc0NJRVhZWiogeHl6LCBjb25zdCBjbXNDSUVMYWIqIExhYik7Ci1DTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0xhYjJMQ2goY21zQ0lFTENoKkxDaCwgY29uc3QgY21zQ0lFTGFiKiBMYWIpOwotQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNMQ2gyTGFiKGNtc0NJRUxhYiogTGFiLCBjb25zdCBjbXNDSUVMQ2gqIExDaCk7Ci0KLS8vIEVuY29kaW5nIC9EZWNvZGluZyBvbiBQQ1MKLUNNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zTGFiRW5jb2RlZDJGbG9hdChjbXNDSUVMYWIqIExhYiwgY29uc3QgY21zVUludDE2TnVtYmVyIHdMYWJbM10pOwotQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNMYWJFbmNvZGVkMkZsb2F0VjIoY21zQ0lFTGFiKiBMYWIsIGNvbnN0IGNtc1VJbnQxNk51bWJlciB3TGFiWzNdKTsKLUNNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zRmxvYXQyTGFiRW5jb2RlZChjbXNVSW50MTZOdW1iZXIgd0xhYlszXSwgY29uc3QgY21zQ0lFTGFiKiBMYWIpOwotQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNGbG9hdDJMYWJFbmNvZGVkVjIoY21zVUludDE2TnVtYmVyIHdMYWJbM10sIGNvbnN0IGNtc0NJRUxhYiogTGFiKTsKLUNNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zWFlaRW5jb2RlZDJGbG9hdChjbXNDSUVYWVoqIGZ4eXosIGNvbnN0IGNtc1VJbnQxNk51bWJlciBYWVpbM10pOwotQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNGbG9hdDJYWVpFbmNvZGVkKGNtc1VJbnQxNk51bWJlciBYWVpbM10sIGNvbnN0IGNtc0NJRVhZWiogZlhZWik7Ci0KLS8vIERlbHRhRSBtZXRyaWNzCi1DTVNBUEkgY21zRmxvYXQ2NE51bWJlciAgQ01TRVhQT1JUIGNtc0RlbHRhRShjb25zdCBjbXNDSUVMYWIqIExhYjEsIGNvbnN0IGNtc0NJRUxhYiogTGFiMik7Ci1DTVNBUEkgY21zRmxvYXQ2NE51bWJlciAgQ01TRVhQT1JUIGNtc0NJRTk0RGVsdGFFKGNvbnN0IGNtc0NJRUxhYiogTGFiMSwgY29uc3QgY21zQ0lFTGFiKiBMYWIyKTsKLUNNU0FQSSBjbXNGbG9hdDY0TnVtYmVyICBDTVNFWFBPUlQgY21zQkZEZGVsdGFFKGNvbnN0IGNtc0NJRUxhYiogTGFiMSwgY29uc3QgY21zQ0lFTGFiKiBMYWIyKTsKLUNNU0FQSSBjbXNGbG9hdDY0TnVtYmVyICBDTVNFWFBPUlQgY21zQ01DZGVsdGFFKGNvbnN0IGNtc0NJRUxhYiogTGFiMSwgY29uc3QgY21zQ0lFTGFiKiBMYWIyLCBjbXNGbG9hdDY0TnVtYmVyIGwsIGNtc0Zsb2F0NjROdW1iZXIgYyk7Ci1DTVNBUEkgY21zRmxvYXQ2NE51bWJlciAgQ01TRVhQT1JUIGNtc0NJRTIwMDBEZWx0YUUoY29uc3QgY21zQ0lFTGFiKiBMYWIxLCBjb25zdCBjbXNDSUVMYWIqIExhYjIsIGNtc0Zsb2F0NjROdW1iZXIgS2wsIGNtc0Zsb2F0NjROdW1iZXIgS2MsIGNtc0Zsb2F0NjROdW1iZXIgS2gpOwotCi0vLyBUZW1wZXJhdHVyZSA8LT4gQ2hyb21hdGljaXR5IChCbGFjayBib2R5KQotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNXaGl0ZVBvaW50RnJvbVRlbXAoY21zQ0lFeHlZKiBXaGl0ZVBvaW50LCBjbXNGbG9hdDY0TnVtYmVyICBUZW1wSyk7Ci1DTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUIGNtc1RlbXBGcm9tV2hpdGVQb2ludChjbXNGbG9hdDY0TnVtYmVyKiBUZW1wSywgY29uc3QgY21zQ0lFeHlZKiBXaGl0ZVBvaW50KTsKLQotLy8gQ2hyb21hdGljIGFkYXB0YXRpb24KLUNNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zQWRhcHRUb0lsbHVtaW5hbnQoY21zQ0lFWFlaKiBSZXN1bHQsIGNvbnN0IGNtc0NJRVhZWiogU291cmNlV2hpdGVQdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0NJRVhZWiogSWxsdW1pbmFudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0NJRVhZWiogVmFsdWUpOwotCi0vLyBDSUVDQU0wMiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gVmlld2luZyBjb25kaXRpb25zLiBQbGVhc2Ugbm90ZSB0aG9zZSBhcmUgQ0FNIG1vZGVsIHZpZXdpbmcgY29uZGl0aW9ucywgYW5kIG5vdCB0aGUgSUNDIHRhZyB2aWV3aW5nCi0vLyBjb25kaXRpb25zLCB3aGljaCBJJ20gbmFtaW5nIGNtc0lDQ1ZpZXdpbmdDb25kaXRpb25zIHRvIG1ha2UgZGlmZmVyZW5jZXMgZXZpZGVudC4gVW5mb3J0dW5hdGVseSwgdGhlIHRhZwotLy8gY2Fubm90IGRlYWwgd2l0aCBzdXJyb3VuZCBMYSwgWWIgYW5kIEQgdmFsdWUgc28gaXMgYmFzaWNhbGx5IHVzZWxlc3MgdG8gc3RvcmUgQ0FNMDIgdmlld2luZyBjb25kaXRpb25zLgotCi0KLSNkZWZpbmUgQVZHX1NVUlJPVU5EICAgICAgIDEKLSNkZWZpbmUgRElNX1NVUlJPVU5EICAgICAgIDIKLSNkZWZpbmUgREFSS19TVVJST1VORCAgICAgIDMKLSNkZWZpbmUgQ1VUU0hFRVRfU1VSUk9VTkQgIDQKLQotI2RlZmluZSBEX0NBTENVTEFURSAgICAgICAgKC0xKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY21zQ0lFWFlaICAgICAgICB3aGl0ZVBvaW50OwotICAgIGNtc0Zsb2F0NjROdW1iZXIgWWI7Ci0gICAgY21zRmxvYXQ2NE51bWJlciBMYTsKLSAgICBpbnQgICAgICAgICAgICAgIHN1cnJvdW5kOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgRF92YWx1ZTsKLQotICAgIH0gY21zVmlld2luZ0NvbmRpdGlvbnM7Ci0KLUNNU0FQSSBjbXNIQU5ETEUgICAgICAgICBDTVNFWFBPUlQgY21zQ0lFQ0FNMDJJbml0KGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCBjbXNWaWV3aW5nQ29uZGl0aW9ucyogcFZDKTsKLUNNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zQ0lFQ0FNMDJEb25lKGNtc0hBTkRMRSBoTW9kZWwpOwotQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNDSUVDQU0wMkZvcndhcmQoY21zSEFORExFIGhNb2RlbCwgY29uc3QgY21zQ0lFWFlaKiBwSW4sIGNtc0pDaCogcE91dCk7Ci1DTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0NJRUNBTTAyUmV2ZXJzZShjbXNIQU5ETEUgaE1vZGVsLCBjb25zdCBjbXNKQ2gqIHBJbiwgICAgY21zQ0lFWFlaKiBwT3V0KTsKLQotCi0vLyBUb25lIGN1cnZlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBUaGlzIGRlc2NyaWJlcyBhIGN1cnZlIHNlZ21lbnQuIEZvciBhIHRhYmxlIG9mIHN1cHBvcnRlZCB0eXBlcywgc2VlIHRoZSBtYW51YWwuIFVzZXIgY2FuIGluY3JlYXNlIHRoZSBudW1iZXIgb2YKLS8vIGF2YWlsYWJsZSB0eXBlcyBieSB1c2luZyBhIHByb3BlciBwbHVnLWluLiBQYXJhbWV0cmljIHNlZ21lbnRzIGFsbG93IDEwIHBhcmFtZXRlcnMgYXQgbW9zdAotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY21zRmxvYXQzMk51bWJlciAgIHgwLCB4MTsgICAgICAgICAgIC8vIERvbWFpbjsgZm9yIHgwIDwgeCA8PSB4MQotICAgIGNtc0ludDMyTnVtYmVyICAgICBUeXBlOyAgICAgICAgICAgICAvLyBQYXJhbWV0cmljIHR5cGUsIFR5cGUgPT0gMCBtZWFucyBzYW1wbGVkIHNlZ21lbnQuIE5lZ2F0aXZlIHZhbHVlcyBhcmUgcmVzZXJ2ZWQKLSAgICBjbXNGbG9hdDY0TnVtYmVyICAgUGFyYW1zWzEwXTsgICAgICAgLy8gUGFyYW1ldGVycyBpZiBUeXBlICE9IDAKLSAgICBjbXNVSW50MzJOdW1iZXIgICAgbkdyaWRQb2ludHM7ICAgICAgLy8gTnVtYmVyIG9mIGdyaWQgcG9pbnRzIGlmIFR5cGUgPT0gMAotICAgIGNtc0Zsb2F0MzJOdW1iZXIqICBTYW1wbGVkUG9pbnRzOyAgICAvLyBQb2ludHMgdG8gYW4gYXJyYXkgb2YgZmxvYXRzIGlmIFR5cGUgPT0gMAotCi19IGNtc0N1cnZlU2VnbWVudDsKLQotLy8gVGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGlzIG5vbmUgb2YgeW91ciBidXNpbmVzcy4KLXR5cGVkZWYgc3RydWN0IF9jbXNfY3VydmVfc3RydWN0IGNtc1RvbmVDdXJ2ZTsKLQotQ01TQVBJIGNtc1RvbmVDdXJ2ZSogICAgIENNU0VYUE9SVCBjbXNCdWlsZFNlZ21lbnRlZFRvbmVDdXJ2ZShjbXNDb250ZXh0IENvbnRleHRJRCwgY21zSW50MzJOdW1iZXIgblNlZ21lbnRzLCBjb25zdCBjbXNDdXJ2ZVNlZ21lbnQgU2VnbWVudHNbXSk7Ci1DTVNBUEkgY21zVG9uZUN1cnZlKiAgICAgQ01TRVhQT1JUIGNtc0J1aWxkUGFyYW1ldHJpY1RvbmVDdXJ2ZShjbXNDb250ZXh0IENvbnRleHRJRCwgY21zSW50MzJOdW1iZXIgVHlwZSwgY29uc3QgY21zRmxvYXQ2NE51bWJlciBQYXJhbXNbXSk7Ci1DTVNBUEkgY21zVG9uZUN1cnZlKiAgICAgQ01TRVhQT1JUIGNtc0J1aWxkR2FtbWEoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc0Zsb2F0NjROdW1iZXIgR2FtbWEpOwotQ01TQVBJIGNtc1RvbmVDdXJ2ZSogICAgIENNU0VYUE9SVCBjbXNCdWlsZFRhYnVsYXRlZFRvbmVDdXJ2ZTE2KGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNJbnQzMk51bWJlciBuRW50cmllcywgY29uc3QgY21zVUludDE2TnVtYmVyIHZhbHVlc1tdKTsKLUNNU0FQSSBjbXNUb25lQ3VydmUqICAgICBDTVNFWFBPUlQgY21zQnVpbGRUYWJ1bGF0ZWRUb25lQ3VydmVGbG9hdChjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIG5FbnRyaWVzLCBjb25zdCBjbXNGbG9hdDMyTnVtYmVyIHZhbHVlc1tdKTsKLUNNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zRnJlZVRvbmVDdXJ2ZShjbXNUb25lQ3VydmUqIEN1cnZlKTsKLUNNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zRnJlZVRvbmVDdXJ2ZVRyaXBsZShjbXNUb25lQ3VydmUqIEN1cnZlWzNdKTsKLUNNU0FQSSBjbXNUb25lQ3VydmUqICAgICBDTVNFWFBPUlQgY21zRHVwVG9uZUN1cnZlKGNvbnN0IGNtc1RvbmVDdXJ2ZSogU3JjKTsKLUNNU0FQSSBjbXNUb25lQ3VydmUqICAgICBDTVNFWFBPUlQgY21zUmV2ZXJzZVRvbmVDdXJ2ZShjb25zdCBjbXNUb25lQ3VydmUqIEluR2FtbWEpOwotQ01TQVBJIGNtc1RvbmVDdXJ2ZSogICAgIENNU0VYUE9SVCBjbXNSZXZlcnNlVG9uZUN1cnZlRXgoY21zSW50MzJOdW1iZXIgblJlc3VsdFNhbXBsZXMsIGNvbnN0IGNtc1RvbmVDdXJ2ZSogSW5HYW1tYSk7Ci1DTVNBUEkgY21zVG9uZUN1cnZlKiAgICAgQ01TRVhQT1JUIGNtc0pvaW5Ub25lQ3VydmUoY21zQ29udGV4dCBDb250ZXh0SUQsIGNvbnN0IGNtc1RvbmVDdXJ2ZSogWCwgIGNvbnN0IGNtc1RvbmVDdXJ2ZSogWSwgY21zVUludDMyTnVtYmVyIG5Qb2ludHMpOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNTbW9vdGhUb25lQ3VydmUoY21zVG9uZUN1cnZlKiBUYWIsIGNtc0Zsb2F0NjROdW1iZXIgbGFtYmRhKTsKLUNNU0FQSSBjbXNGbG9hdDMyTnVtYmVyICBDTVNFWFBPUlQgY21zRXZhbFRvbmVDdXJ2ZUZsb2F0KGNvbnN0IGNtc1RvbmVDdXJ2ZSogQ3VydmUsIGNtc0Zsb2F0MzJOdW1iZXIgdik7Ci1DTVNBUEkgY21zVUludDE2TnVtYmVyICAgQ01TRVhQT1JUIGNtc0V2YWxUb25lQ3VydmUxNihjb25zdCBjbXNUb25lQ3VydmUqIEN1cnZlLCBjbXNVSW50MTZOdW1iZXIgdik7Ci1DTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUIGNtc0lzVG9uZUN1cnZlTXVsdGlzZWdtZW50KGNvbnN0IGNtc1RvbmVDdXJ2ZSogSW5HYW1tYSk7Ci1DTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUIGNtc0lzVG9uZUN1cnZlTGluZWFyKGNvbnN0IGNtc1RvbmVDdXJ2ZSogQ3VydmUpOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNJc1RvbmVDdXJ2ZU1vbm90b25pYyhjb25zdCBjbXNUb25lQ3VydmUqIHQpOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNJc1RvbmVDdXJ2ZURlc2NlbmRpbmcoY29uc3QgY21zVG9uZUN1cnZlKiB0KTsKLUNNU0FQSSBjbXNJbnQzMk51bWJlciAgICBDTVNFWFBPUlQgY21zR2V0VG9uZUN1cnZlUGFyYW1ldHJpY1R5cGUoY29uc3QgY21zVG9uZUN1cnZlKiB0KTsKLUNNU0FQSSBjbXNGbG9hdDY0TnVtYmVyICBDTVNFWFBPUlQgY21zRXN0aW1hdGVHYW1tYShjb25zdCBjbXNUb25lQ3VydmUqIHQsIGNtc0Zsb2F0NjROdW1iZXIgUHJlY2lzaW9uKTsKLQotLy8gVG9uZSBjdXJ2ZSB0YWJ1bGFyIGVzdGltYXRpb24KLUNNU0FQSSBjbXNVSW50MzJOdW1iZXIgICAgICAgICBDTVNFWFBPUlQgY21zR2V0VG9uZUN1cnZlRXN0aW1hdGVkVGFibGVFbnRyaWVzKGNvbnN0IGNtc1RvbmVDdXJ2ZSogdCk7Ci1DTVNBUEkgY29uc3QgY21zVUludDE2TnVtYmVyKiAgQ01TRVhQT1JUIGNtc0dldFRvbmVDdXJ2ZUVzdGltYXRlZFRhYmxlKGNvbnN0IGNtc1RvbmVDdXJ2ZSogdCk7Ci0KLQotLy8gSW1wbGVtZW50cyBwaXBlbGluZXMgb2YgbXVsdGktcHJvY2Vzc2luZyBlbGVtZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIE5vdGhpbmcgdG8gc2VlIGhlcmUsIG1vdmUgYWxvbmcKLXR5cGVkZWYgc3RydWN0IF9jbXNQaXBlbGluZV9zdHJ1Y3QgY21zUGlwZWxpbmU7Ci10eXBlZGVmIHN0cnVjdCBfY21zU3RhZ2Vfc3RydWN0IGNtc1N0YWdlOwotCi0vLyBUaG9zZSBhcmUgaGktbGV2ZWwgcGlwZWxpbmVzCi1DTVNBUEkgY21zUGlwZWxpbmUqICAgICAgQ01TRVhQT1JUIGNtc1BpcGVsaW5lQWxsb2MoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBJbnB1dENoYW5uZWxzLCBjbXNVSW50MzJOdW1iZXIgT3V0cHV0Q2hhbm5lbHMpOwotQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNQaXBlbGluZUZyZWUoY21zUGlwZWxpbmUqIGx1dCk7Ci1DTVNBUEkgY21zUGlwZWxpbmUqICAgICAgQ01TRVhQT1JUIGNtc1BpcGVsaW5lRHVwKGNvbnN0IGNtc1BpcGVsaW5lKiBPcmlnKTsKLQotQ01TQVBJIGNtc0NvbnRleHQgICAgICAgIENNU0VYUE9SVCBjbXNHZXRQaXBlbGluZUNvbnRleHRJRChjb25zdCBjbXNQaXBlbGluZSogbHV0KTsKLUNNU0FQSSBjbXNVSW50MzJOdW1iZXIgICBDTVNFWFBPUlQgY21zUGlwZWxpbmVJbnB1dENoYW5uZWxzKGNvbnN0IGNtc1BpcGVsaW5lKiBsdXQpOwotQ01TQVBJIGNtc1VJbnQzMk51bWJlciAgIENNU0VYUE9SVCBjbXNQaXBlbGluZU91dHB1dENoYW5uZWxzKGNvbnN0IGNtc1BpcGVsaW5lKiBsdXQpOwotCi1DTVNBUEkgY21zVUludDMyTnVtYmVyICAgQ01TRVhQT1JUIGNtc1BpcGVsaW5lU3RhZ2VDb3VudChjb25zdCBjbXNQaXBlbGluZSogbHV0KTsKLUNNU0FQSSBjbXNTdGFnZSogICAgICAgICBDTVNFWFBPUlQgY21zUGlwZWxpbmVHZXRQdHJUb0ZpcnN0U3RhZ2UoY29uc3QgY21zUGlwZWxpbmUqIGx1dCk7Ci1DTVNBUEkgY21zU3RhZ2UqICAgICAgICAgQ01TRVhQT1JUIGNtc1BpcGVsaW5lR2V0UHRyVG9MYXN0U3RhZ2UoY29uc3QgY21zUGlwZWxpbmUqIGx1dCk7Ci0KLUNNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zUGlwZWxpbmVFdmFsMTYoY29uc3QgY21zVUludDE2TnVtYmVyIEluW10sIGNtc1VJbnQxNk51bWJlciBPdXRbXSwgY29uc3QgY21zUGlwZWxpbmUqIGx1dCk7Ci1DTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc1BpcGVsaW5lRXZhbEZsb2F0KGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIgSW5bXSwgY21zRmxvYXQzMk51bWJlciBPdXRbXSwgY29uc3QgY21zUGlwZWxpbmUqIGx1dCk7Ci1DTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUIGNtc1BpcGVsaW5lRXZhbFJldmVyc2VGbG9hdChjbXNGbG9hdDMyTnVtYmVyIFRhcmdldFtdLCBjbXNGbG9hdDMyTnVtYmVyIFJlc3VsdFtdLCBjbXNGbG9hdDMyTnVtYmVyIEhpbnRbXSwgY29uc3QgY21zUGlwZWxpbmUqIGx1dCk7Ci1DTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUIGNtc1BpcGVsaW5lQ2F0KGNtc1BpcGVsaW5lKiBsMSwgY29uc3QgY21zUGlwZWxpbmUqIGwyKTsKLUNNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zUGlwZWxpbmVTZXRTYXZlQXM4Yml0c0ZsYWcoY21zUGlwZWxpbmUqIGx1dCwgY21zQm9vbCBPbik7Ci0KLS8vIFdoZXJlIHRvIHBsYWNlL2xvY2F0ZSB0aGUgc3RhZ2VzIGluIHRoZSBwaXBlbGluZSBjaGFpbgotdHlwZWRlZiBlbnVtIHsgY21zQVRfQkVHSU4sIGNtc0FUX0VORCB9IGNtc1N0YWdlTG9jOwotCi1DTVNBUEkgaW50ICAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoY21zUGlwZWxpbmUqIGx1dCwgY21zU3RhZ2VMb2MgbG9jLCBjbXNTdGFnZSogbXBlKTsKLUNNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zUGlwZWxpbmVVbmxpbmtTdGFnZShjbXNQaXBlbGluZSogbHV0LCBjbXNTdGFnZUxvYyBsb2MsIGNtc1N0YWdlKiogbXBlKTsKLQotLy8gVGhpcyBmdW5jdGlvbiBpcyBxdWl0ZSB1c2VmdWwgdG8gYW5hbHl6ZSB0aGUgc3RydWN0dXJlIG9mIGEgUGlwZWxpbmUgYW5kIHJldHJpZXZlIHRoZSBTdGFnZSBlbGVtZW50cwotLy8gdGhhdCBjb25mb3JtIHRoZSBQaXBlbGluZS4gSXQgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHRoZSBQaXBlbGluZSwgdGhlIG51bWJlciBvZiBleHBlY3RlZCBlbGVtZW50cyBhbmQKLS8vIHRoZW4gYSBsaXN0IG9mIGV4cGVjdGVkIHR5cGVzIGZvbGxvd2VkIHdpdGggYSBsaXN0IG9mIGRvdWJsZSBwb2ludGVycyB0byBTdGFnZSBlbGVtZW50cy4gSWYKLS8vIHRoZSBmdW5jdGlvbiBmb3VuZHMgYSBtYXRjaCB3aXRoIGN1cnJlbnQgcGlwZWxpbmUsIGl0IGZpbGxzIHRoZSBwb2ludGVycyBhbmQgcmV0dXJucyBUUlVFCi0vLyBpZiBub3QsIHJldHVybnMgRkFMU0Ugd2l0aG91dCB0b3VjaGluZyBhbnl0aGluZy4KLUNNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zUGlwZWxpbmVDaGVja0FuZFJldHJlaXZlU3RhZ2VzKGNvbnN0IGNtc1BpcGVsaW5lKiBMdXQsIGNtc1VJbnQzMk51bWJlciBuLCAuLi4pOwotCi0vLyBNYXRyaXggaGFzIGRvdWJsZSBwcmVjaXNpb24gYW5kIENMVVQgaGFzIG9ubHkgZmxvYXQgcHJlY2lzaW9uLiBUaGF0IGlzIGJlY2F1c2UgYW4gSUNDIHByb2ZpbGUgY2FuIGVuY29kZQotLy8gbWF0cmljZXMgd2l0aCBmYXIgbW9yZSBwcmVjaXNpb24gdGhhdCBDTFVUUwotQ01TQVBJIGNtc1N0YWdlKiAgICAgICAgIENNU0VYUE9SVCBjbXNTdGFnZUFsbG9jSWRlbnRpdHkoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBuQ2hhbm5lbHMpOwotQ01TQVBJIGNtc1N0YWdlKiAgICAgICAgIENNU0VYUE9SVCBjbXNTdGFnZUFsbG9jVG9uZUN1cnZlcyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIG5DaGFubmVscywgY21zVG9uZUN1cnZlKiBjb25zdCBDdXJ2ZXNbXSk7Ci1DTVNBUEkgY21zU3RhZ2UqICAgICAgICAgQ01TRVhQT1JUIGNtc1N0YWdlQWxsb2NNYXRyaXgoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBSb3dzLCBjbXNVSW50MzJOdW1iZXIgQ29scywgY29uc3QgY21zRmxvYXQ2NE51bWJlciogTWF0cml4LCBjb25zdCBjbXNGbG9hdDY0TnVtYmVyKiBPZmZzZXQpOwotCi1DTVNBUEkgY21zU3RhZ2UqICAgICAgICAgQ01TRVhQT1JUIGNtc1N0YWdlQWxsb2NDTHV0MTZiaXQoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBuR3JpZFBvaW50cywgY21zVUludDMyTnVtYmVyIGlucHV0Q2hhbiwgY21zVUludDMyTnVtYmVyIG91dHB1dENoYW4sIGNvbnN0IGNtc1VJbnQxNk51bWJlciogVGFibGUpOwotQ01TQVBJIGNtc1N0YWdlKiAgICAgICAgIENNU0VYUE9SVCBjbXNTdGFnZUFsbG9jQ0x1dEZsb2F0KGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgbkdyaWRQb2ludHMsIGNtc1VJbnQzMk51bWJlciBpbnB1dENoYW4sIGNtc1VJbnQzMk51bWJlciBvdXRwdXRDaGFuLCBjb25zdCBjbXNGbG9hdDMyTnVtYmVyKiBUYWJsZSk7Ci0KLUNNU0FQSSBjbXNTdGFnZSogICAgICAgICBDTVNFWFBPUlQgY21zU3RhZ2VBbGxvY0NMdXQxNmJpdEdyYW51bGFyKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCBjbXNVSW50MzJOdW1iZXIgY2x1dFBvaW50c1tdLCBjbXNVSW50MzJOdW1iZXIgaW5wdXRDaGFuLCBjbXNVSW50MzJOdW1iZXIgb3V0cHV0Q2hhbiwgY29uc3QgY21zVUludDE2TnVtYmVyKiBUYWJsZSk7Ci1DTVNBUEkgY21zU3RhZ2UqICAgICAgICAgQ01TRVhQT1JUIGNtc1N0YWdlQWxsb2NDTHV0RmxvYXRHcmFudWxhcihjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3QgY21zVUludDMyTnVtYmVyIGNsdXRQb2ludHNbXSwgY21zVUludDMyTnVtYmVyIGlucHV0Q2hhbiwgY21zVUludDMyTnVtYmVyIG91dHB1dENoYW4sIGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIqIFRhYmxlKTsKLQotQ01TQVBJIGNtc1N0YWdlKiAgICAgICAgIENNU0VYUE9SVCBjbXNTdGFnZUR1cChjbXNTdGFnZSogbXBlKTsKLUNNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zU3RhZ2VGcmVlKGNtc1N0YWdlKiBtcGUpOwotQ01TQVBJIGNtc1N0YWdlKiAgICAgICAgIENNU0VYUE9SVCBjbXNTdGFnZU5leHQoY29uc3QgY21zU3RhZ2UqIG1wZSk7Ci0KLUNNU0FQSSBjbXNVSW50MzJOdW1iZXIgICBDTVNFWFBPUlQgY21zU3RhZ2VJbnB1dENoYW5uZWxzKGNvbnN0IGNtc1N0YWdlKiBtcGUpOwotQ01TQVBJIGNtc1VJbnQzMk51bWJlciAgIENNU0VYUE9SVCBjbXNTdGFnZU91dHB1dENoYW5uZWxzKGNvbnN0IGNtc1N0YWdlKiBtcGUpOwotQ01TQVBJIGNtc1N0YWdlU2lnbmF0dXJlIENNU0VYUE9SVCBjbXNTdGFnZVR5cGUoY29uc3QgY21zU3RhZ2UqIG1wZSk7Ci1DTVNBUEkgdm9pZCogICAgICAgICAgICAgQ01TRVhQT1JUIGNtc1N0YWdlRGF0YShjb25zdCBjbXNTdGFnZSogbXBlKTsKLQotLy8gU2FtcGxpbmcKLXR5cGVkZWYgY21zSW50MzJOdW1iZXIgKCogY21zU0FNUExFUjE2KSAgIChyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIE91dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciB2b2lkICogQ2FyZ28pOwotCi10eXBlZGVmIGNtc0ludDMyTnVtYmVyICgqIGNtc1NBTVBMRVJGTE9BVCkocmVnaXN0ZXIgY29uc3QgY21zRmxvYXQzMk51bWJlciBJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNGbG9hdDMyTnVtYmVyIE91dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciB2b2lkICogQ2FyZ28pOwotCi0vLyBVc2UgdGhpcyBmbGFnIHRvIHByZXZlbnQgY2hhbmdlcyBiZWluZyB3cml0dGVuIHRvIGRlc3RpbmF0aW9uCi0jZGVmaW5lIFNBTVBMRVJfSU5TUEVDVCAgICAgMHgwMTAwMDAwMAotCi0vLyBGb3IgQ0xVVCBvbmx5Ci1DTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUIGNtc1N0YWdlU2FtcGxlQ0x1dDE2Yml0KGNtc1N0YWdlKiBtcGUsICAgIGNtc1NBTVBMRVIxNiBTYW1wbGVyLCB2b2lkKiBDYXJnbywgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNTdGFnZVNhbXBsZUNMdXRGbG9hdChjbXNTdGFnZSogbXBlLCBjbXNTQU1QTEVSRkxPQVQgU2FtcGxlciwgdm9pZCogQ2FyZ28sIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKTsKLQotLy8gU2xpY2VycwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNTbGljZVNwYWNlMTYoY21zVUludDMyTnVtYmVyIG5JbnB1dHMsIGNvbnN0IGNtc1VJbnQzMk51bWJlciBjbHV0UG9pbnRzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNTQU1QTEVSMTYgU2FtcGxlciwgdm9pZCAqIENhcmdvKTsKLQotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNTbGljZVNwYWNlRmxvYXQoY21zVUludDMyTnVtYmVyIG5JbnB1dHMsIGNvbnN0IGNtc1VJbnQzMk51bWJlciBjbHV0UG9pbnRzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNTQU1QTEVSRkxPQVQgU2FtcGxlciwgdm9pZCAqIENhcmdvKTsKLQotLy8gTXVsdGlsb2NhbGl6ZWQgVW5pY29kZSBtYW5hZ2VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10eXBlZGVmIHN0cnVjdCBfY21zX01MVV9zdHJ1Y3QgY21zTUxVOwotCi0jZGVmaW5lICBjbXNOb0xhbmd1YWdlICJcMFwwIgotI2RlZmluZSAgY21zTm9Db3VudHJ5ICAiXDBcMCIKLQotQ01TQVBJIGNtc01MVSogICAgICAgICAgIENNU0VYUE9SVCBjbXNNTFVhbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIG5JdGVtcyk7Ci1DTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc01MVWZyZWUoY21zTUxVKiBtbHUpOwotQ01TQVBJIGNtc01MVSogICAgICAgICAgIENNU0VYUE9SVCBjbXNNTFVkdXAoY29uc3QgY21zTUxVKiBtbHUpOwotCi1DTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUIGNtc01MVXNldEFTQ0lJKGNtc01MVSogbWx1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIExhbmd1YWdlQ29kZVszXSwgY29uc3QgY2hhciBDb3VudHJ5Q29kZVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogQVNDSUlTdHJpbmcpOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNNTFVzZXRXaWRlKGNtc01MVSogbWx1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIExhbmd1YWdlQ29kZVszXSwgY29uc3QgY2hhciBDb3VudHJ5Q29kZVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogV2lkZVN0cmluZyk7Ci0KLUNNU0FQSSBjbXNVSW50MzJOdW1iZXIgICBDTVNFWFBPUlQgY21zTUxVZ2V0QVNDSUkoY29uc3QgY21zTUxVKiBtbHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgTGFuZ3VhZ2VDb2RlWzNdLCBjb25zdCBjaGFyIENvdW50cnlDb2RlWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBCdWZmZXIsICAgIGNtc1VJbnQzMk51bWJlciBCdWZmZXJTaXplKTsKLQotQ01TQVBJIGNtc1VJbnQzMk51bWJlciAgIENNU0VYUE9SVCBjbXNNTFVnZXRXaWRlKGNvbnN0IGNtc01MVSogbWx1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgTGFuZ3VhZ2VDb2RlWzNdLCBjb25zdCBjaGFyIENvdW50cnlDb2RlWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqIEJ1ZmZlciwgY21zVUludDMyTnVtYmVyIEJ1ZmZlclNpemUpOwotCi1DTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUIGNtc01MVWdldFRyYW5zbGF0aW9uKGNvbnN0IGNtc01MVSogbWx1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBMYW5ndWFnZUNvZGVbM10sIGNvbnN0IGNoYXIgQ291bnRyeUNvZGVbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIE9idGFpbmVkTGFuZ3VhZ2VbM10sIGNoYXIgT2J0YWluZWRDb3VudHJ5WzNdKTsKLQotQ01TQVBJIGNtc1VJbnQzMk51bWJlciAgIENNU0VYUE9SVCBjbXNNTFV0cmFuc2xhdGlvbnNDb3VudChjb25zdCBjbXNNTFUqIG1sdSk7Ci0KLUNNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zTUxVdHJhbnNsYXRpb25zQ29kZXMoY29uc3QgY21zTUxVKiBtbHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIExhbmd1YWdlQ29kZVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIENvdW50cnlDb2RlWzNdKTsKLSAKLS8vIFVuZGVyY29sb3JyZW1vdmFsICYgYmxhY2sgZ2VuZXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgY21zVG9uZUN1cnZlKiBVY3I7Ci0gICAgICAgIGNtc1RvbmVDdXJ2ZSogQmc7Ci0gICAgICAgIGNtc01MVSogICAgICAgRGVzYzsKLQotfSBjbXNVY3JCZzsKLQotLy8gU2NyZWVuaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2RlZmluZSBjbXNQUklOVEVSX0RFRkFVTFRfU0NSRUVOUyAgICAgMHgwMDAxCi0jZGVmaW5lIGNtc0ZSRVFVRU5DRV9VTklUU19MSU5FU19DTSAgICAweDAwMDAKLSNkZWZpbmUgY21zRlJFUVVFTkNFX1VOSVRTX0xJTkVTX0lOQ0ggIDB4MDAwMgotCi0jZGVmaW5lIGNtc1NQT1RfVU5LTk9XTiAgICAgICAgIDAKLSNkZWZpbmUgY21zU1BPVF9QUklOVEVSX0RFRkFVTFQgMQotI2RlZmluZSBjbXNTUE9UX1JPVU5EICAgICAgICAgICAyCi0jZGVmaW5lIGNtc1NQT1RfRElBTU9ORCAgICAgICAgIDMKLSNkZWZpbmUgY21zU1BPVF9FTExJUFNFICAgICAgICAgNAotI2RlZmluZSBjbXNTUE9UX0xJTkUgICAgICAgICAgICA1Ci0jZGVmaW5lIGNtc1NQT1RfU1FVQVJFICAgICAgICAgIDYKLSNkZWZpbmUgY21zU1BPVF9DUk9TUyAgICAgICAgICAgNwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY21zRmxvYXQ2NE51bWJlciAgRnJlcXVlbmN5OwotICAgIGNtc0Zsb2F0NjROdW1iZXIgIFNjcmVlbkFuZ2xlOwotICAgIGNtc1VJbnQzMk51bWJlciAgIFNwb3RTaGFwZTsKLQotfSBjbXNTY3JlZW5pbmdDaGFubmVsOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY21zVUludDMyTnVtYmVyIEZsYWc7Ci0gICAgY21zVUludDMyTnVtYmVyIG5DaGFubmVsczsKLSAgICBjbXNTY3JlZW5pbmdDaGFubmVsIENoYW5uZWxzW2Ntc01BWENIQU5ORUxTXTsKLQotfSBjbXNTY3JlZW5pbmc7Ci0KLQotLy8gTmFtZWQgY29sb3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdHlwZWRlZiBzdHJ1Y3QgX2Ntc19OQU1FRENPTE9STElTVF9zdHJ1Y3QgY21zTkFNRURDT0xPUkxJU1Q7Ci0KLUNNU0FQSSBjbXNOQU1FRENPTE9STElTVCogQ01TRVhQT1JUIGNtc0FsbG9jTmFtZWRDb2xvckxpc3QoY21zQ29udGV4dCBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgQ29sb3JhbnRDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogUHJlZml4LCBjb25zdCBjaGFyKiBTdWZmaXgpOwotCi1DTVNBUEkgdm9pZCAgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNGcmVlTmFtZWRDb2xvckxpc3QoY21zTkFNRURDT0xPUkxJU1QqIHYpOwotQ01TQVBJIGNtc05BTUVEQ09MT1JMSVNUKiBDTVNFWFBPUlQgY21zRHVwTmFtZWRDb2xvckxpc3QoY29uc3QgY21zTkFNRURDT0xPUkxJU1QqIHYpOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgICBDTVNFWFBPUlQgY21zQXBwZW5kTmFtZWRDb2xvcihjbXNOQU1FRENPTE9STElTVCogdiwgY29uc3QgY2hhciogTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQxNk51bWJlciBQQ1NbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIgQ29sb3JhbnRbY21zTUFYQ0hBTk5FTFNdKTsKLQotQ01TQVBJIGNtc1VJbnQzMk51bWJlciAgICBDTVNFWFBPUlQgY21zTmFtZWRDb2xvckNvdW50KGNvbnN0IGNtc05BTUVEQ09MT1JMSVNUKiB2KTsKLUNNU0FQSSBjbXNJbnQzMk51bWJlciAgICAgQ01TRVhQT1JUIGNtc05hbWVkQ29sb3JJbmRleChjb25zdCBjbXNOQU1FRENPTE9STElTVCogdiwgY29uc3QgY2hhciogTmFtZSk7Ci0KLUNNU0FQSSBjbXNCb29sICAgICAgICAgICAgQ01TRVhQT1JUIGNtc05hbWVkQ29sb3JJbmZvKGNvbnN0IGNtc05BTUVEQ09MT1JMSVNUKiBOYW1lZENvbG9yTGlzdCwgY21zVUludDMyTnVtYmVyIG5Db2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBQcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBTdWZmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIqIFBDUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQxNk51bWJlciogQ29sb3JhbnQpOwotCi0vLyBSZXRyaWV2ZSBuYW1lZCBjb2xvciBsaXN0IGZyb20gdHJhbnNmb3JtCi1DTVNBUEkgY21zTkFNRURDT0xPUkxJU1QqIENNU0VYUE9SVCBjbXNHZXROYW1lZENvbG9yTGlzdChjbXNIVFJBTlNGT1JNIHhmb3JtKTsKLQotLy8gUHJvZmlsZSBzZXF1ZW5jZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBQcm9maWxlIHNlcXVlbmNlIGRlc2NyaXB0b3IuIFNvbWUgZmllbGRzIGNvbWUgZnJvbSBwcm9maWxlIHNlcXVlbmNlIGRlc2NyaXB0b3IgdGFnLCBvdGhlcnMKLS8vIGNvbWUgZnJvbSBQcm9maWxlIFNlcXVlbmNlIElkZW50aWZpZXIgVGFnCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBjbXNTaWduYXR1cmUgICAgICAgICAgIGRldmljZU1mZzsKLSAgICBjbXNTaWduYXR1cmUgICAgICAgICAgIGRldmljZU1vZGVsOwotICAgIGNtc1VJbnQ2NE51bWJlciAgICAgICAgYXR0cmlidXRlczsKLSAgICBjbXNUZWNobm9sb2d5U2lnbmF0dXJlIHRlY2hub2xvZ3k7Ci0gICAgY21zUHJvZmlsZUlEICAgICAgICAgICBQcm9maWxlSUQ7Ci0gICAgY21zTUxVKiAgICAgICAgICAgICAgICBNYW51ZmFjdHVyZXI7Ci0gICAgY21zTUxVKiAgICAgICAgICAgICAgICBNb2RlbDsKLSAgICBjbXNNTFUqICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uOwotCi19IGNtc1BTRVFERVNDOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBjbXNVSW50MzJOdW1iZXIgbjsKLSAgICBjbXNDb250ZXh0ICAgICBDb250ZXh0SUQ7Ci0gICAgY21zUFNFUURFU0MqICAgIHNlcTsKLQotfSBjbXNTRVE7Ci0KLUNNU0FQSSBjbXNTRVEqICAgICAgICAgICBDTVNFWFBPUlQgY21zQWxsb2NQcm9maWxlU2VxdWVuY2VEZXNjcmlwdGlvbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIG4pOwotQ01TQVBJIGNtc1NFUSogICAgICAgICAgIENNU0VYUE9SVCBjbXNEdXBQcm9maWxlU2VxdWVuY2VEZXNjcmlwdGlvbihjb25zdCBjbXNTRVEqIHBzZXEpOwotQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNGcmVlUHJvZmlsZVNlcXVlbmNlRGVzY3JpcHRpb24oY21zU0VRKiBwc2VxKTsKLQotLy8gRGljdGlvbmFyaWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXR5cGVkZWYgc3RydWN0IF9jbXNESUNUZW50cnlfc3RydWN0IHsKLQotICAgIHN0cnVjdCBfY21zRElDVGVudHJ5X3N0cnVjdCogTmV4dDsKLQotICAgIGNtc01MVSAqRGlzcGxheU5hbWU7Ci0gICAgY21zTUxVICpEaXNwbGF5VmFsdWU7Ci0gICAgd2NoYXJfdCogTmFtZTsKLSAgICB3Y2hhcl90KiBWYWx1ZTsKLQotfSBjbXNESUNUZW50cnk7Ci0KLUNNU0FQSSBjbXNIQU5ETEUgICAgICAgICAgIENNU0VYUE9SVCBjbXNEaWN0QWxsb2MoY21zQ29udGV4dCBDb250ZXh0SUQpOwotQ01TQVBJIHZvaWQgICAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0RpY3RGcmVlKGNtc0hBTkRMRSBoRGljdCk7Ci1DTVNBUEkgY21zSEFORExFICAgICAgICAgICBDTVNFWFBPUlQgY21zRGljdER1cChjbXNIQU5ETEUgaERpY3QpOwotCi1DTVNBUEkgY21zQm9vbCAgICAgICAgICAgICBDTVNFWFBPUlQgY21zRGljdEFkZEVudHJ5KGNtc0hBTkRMRSBoRGljdCwgY29uc3Qgd2NoYXJfdCogTmFtZSwgY29uc3Qgd2NoYXJfdCogVmFsdWUsIGNvbnN0IGNtc01MVSAqRGlzcGxheU5hbWUsIGNvbnN0IGNtc01MVSAqRGlzcGxheVZhbHVlKTsKLUNNU0FQSSBjb25zdCBjbXNESUNUZW50cnkqIENNU0VYUE9SVCBjbXNEaWN0R2V0RW50cnlMaXN0KGNtc0hBTkRMRSBoRGljdCk7Ci1DTVNBUEkgY29uc3QgY21zRElDVGVudHJ5KiBDTVNFWFBPUlQgY21zRGljdE5leHRFbnRyeShjb25zdCBjbXNESUNUZW50cnkqIGUpOwotCi0vLyBBY2Nlc3MgdG8gUHJvZmlsZSBkYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUNNU0FQSSBjbXNIUFJPRklMRSAgICAgICBDTVNFWFBPUlQgY21zQ3JlYXRlUHJvZmlsZVBsYWNlaG9sZGVyKGNtc0NvbnRleHQgQ29udGV4dElEKTsKLQotQ01TQVBJIGNtc0NvbnRleHQgICAgICAgIENNU0VYUE9SVCBjbXNHZXRQcm9maWxlQ29udGV4dElEKGNtc0hQUk9GSUxFIGhQcm9maWxlKTsKLUNNU0FQSSBjbXNJbnQzMk51bWJlciAgICBDTVNFWFBPUlQgY21zR2V0VGFnQ291bnQoY21zSFBST0ZJTEUgaFByb2ZpbGUpOwotQ01TQVBJIGNtc1RhZ1NpZ25hdHVyZSAgIENNU0VYUE9SVCBjbXNHZXRUYWdTaWduYXR1cmUoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBuKTsKLUNNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zSXNUYWcoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1RhZ1NpZ25hdHVyZSBzaWcpOwotCi0vLyBSZWFkIGFuZCB3cml0ZSBwcmUtZm9ybWF0dGVkIGRhdGEKLUNNU0FQSSB2b2lkKiAgICAgICAgICAgICBDTVNFWFBPUlQgY21zUmVhZFRhZyhjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVGFnU2lnbmF0dXJlIHNpZyk7Ci1DTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUIGNtc1dyaXRlVGFnKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNUYWdTaWduYXR1cmUgc2lnLCBjb25zdCB2b2lkKiBkYXRhKTsKLUNNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zTGlua1RhZyhjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVGFnU2lnbmF0dXJlIHNpZywgY21zVGFnU2lnbmF0dXJlIGRlc3QpOwotQ01TQVBJIGNtc1RhZ1NpZ25hdHVyZSAgIENNU0VYUE9SVCBjbXNUYWdMaW5rZWRUbyhjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVGFnU2lnbmF0dXJlIHNpZyk7Ci0KLS8vIFJlYWQgYW5kIHdyaXRlIHJhdyBkYXRhCi1DTVNBUEkgY21zSW50MzJOdW1iZXIgICAgQ01TRVhQT1JUIGNtc1JlYWRSYXdUYWcoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1RhZ1NpZ25hdHVyZSBzaWcsIHZvaWQqIEJ1ZmZlciwgY21zVUludDMyTnVtYmVyIEJ1ZmZlclNpemUpOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNXcml0ZVJhd1RhZyhjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVGFnU2lnbmF0dXJlIHNpZywgY29uc3Qgdm9pZCogZGF0YSwgY21zVUludDMyTnVtYmVyIFNpemUpOwotCi0vLyBBY2Nlc3MgaGVhZGVyIGRhdGEKLSNkZWZpbmUgY21zRW1iZWRkZWRQcm9maWxlRmFsc2UgICAgMHgwMDAwMDAwMAotI2RlZmluZSBjbXNFbWJlZGRlZFByb2ZpbGVUcnVlICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIGNtc1VzZUFueXdoZXJlICAgICAgICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgY21zVXNlV2l0aEVtYmVkZGVkRGF0YU9ubHkgMHgwMDAwMDAwMgotCi1DTVNBUEkgY21zVUludDMyTnVtYmVyICAgQ01TRVhQT1JUIGNtc0dldEhlYWRlckZsYWdzKGNtc0hQUk9GSUxFIGhQcm9maWxlKTsKLUNNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zR2V0SGVhZGVyQXR0cmlidXRlcyhjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVUludDY0TnVtYmVyKiBGbGFncyk7Ci1DTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0dldEhlYWRlclByb2ZpbGVJRChjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVUludDhOdW1iZXIqIFByb2ZpbGVJRCk7Ci1DTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUIGNtc0dldEhlYWRlckNyZWF0aW9uRGF0ZVRpbWUoY21zSFBST0ZJTEUgaFByb2ZpbGUsIHN0cnVjdCB0bSAqRGVzdCk7Ci1DTVNBUEkgY21zVUludDMyTnVtYmVyICAgQ01TRVhQT1JUIGNtc0dldEhlYWRlclJlbmRlcmluZ0ludGVudChjbXNIUFJPRklMRSBoUHJvZmlsZSk7Ci0KLUNNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zU2V0SGVhZGVyRmxhZ3MoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBGbGFncyk7Ci1DTVNBUEkgY21zVUludDMyTnVtYmVyICAgQ01TRVhQT1JUIGNtc0dldEhlYWRlck1hbnVmYWN0dXJlcihjbXNIUFJPRklMRSBoUHJvZmlsZSk7Ci1DTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc1NldEhlYWRlck1hbnVmYWN0dXJlcihjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVUludDMyTnVtYmVyIG1hbnVmYWN0dXJlcik7Ci1DTVNBUEkgY21zVUludDMyTnVtYmVyICAgQ01TRVhQT1JUIGNtc0dldEhlYWRlckNyZWF0b3IoY21zSFBST0ZJTEUgaFByb2ZpbGUpOwotQ01TQVBJIGNtc1VJbnQzMk51bWJlciAgIENNU0VYUE9SVCBjbXNHZXRIZWFkZXJNb2RlbChjbXNIUFJPRklMRSBoUHJvZmlsZSk7Ci1DTVNBUEkgdm9pZCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc1NldEhlYWRlck1vZGVsKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50MzJOdW1iZXIgbW9kZWwpOwotQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNTZXRIZWFkZXJBdHRyaWJ1dGVzKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50NjROdW1iZXIgRmxhZ3MpOwotQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNTZXRIZWFkZXJQcm9maWxlSUQoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQ4TnVtYmVyKiBQcm9maWxlSUQpOwotQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNTZXRIZWFkZXJSZW5kZXJpbmdJbnRlbnQoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBSZW5kZXJpbmdJbnRlbnQpOwotCi1DTVNBUEkgY21zQ29sb3JTcGFjZVNpZ25hdHVyZQotICAgICAgICAgICAgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNHZXRQQ1MoY21zSFBST0ZJTEUgaFByb2ZpbGUpOwotQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNTZXRQQ1MoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgcGNzKTsKLUNNU0FQSSBjbXNDb2xvclNwYWNlU2lnbmF0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0dldENvbG9yU3BhY2UoY21zSFBST0ZJTEUgaFByb2ZpbGUpOwotQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNTZXRDb2xvclNwYWNlKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIHNpZyk7Ci1DTVNBUEkgY21zUHJvZmlsZUNsYXNzU2lnbmF0dXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0dldERldmljZUNsYXNzKGNtc0hQUk9GSUxFIGhQcm9maWxlKTsKLUNNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zU2V0RGV2aWNlQ2xhc3MoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1Byb2ZpbGVDbGFzc1NpZ25hdHVyZSBzaWcpOwotQ01TQVBJIHZvaWQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNTZXRQcm9maWxlVmVyc2lvbihjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zRmxvYXQ2NE51bWJlciBWZXJzaW9uKTsKLUNNU0FQSSBjbXNGbG9hdDY0TnVtYmVyICBDTVNFWFBPUlQgY21zR2V0UHJvZmlsZVZlcnNpb24oY21zSFBST0ZJTEUgaFByb2ZpbGUpOwotCi1DTVNBUEkgY21zVUludDMyTnVtYmVyICAgQ01TRVhQT1JUIGNtc0dldEVuY29kZWRJQ0N2ZXJzaW9uKGNtc0hQUk9GSUxFIGhQcm9maWxlKTsKLUNNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zU2V0RW5jb2RlZElDQ3ZlcnNpb24oY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBWZXJzaW9uKTsKLQotLy8gSG93IHByb2ZpbGVzIG1heSBiZSB1c2VkCi0jZGVmaW5lIExDTVNfVVNFRF9BU19JTlBVVCAgICAgIDAKLSNkZWZpbmUgTENNU19VU0VEX0FTX09VVFBVVCAgICAgMQotI2RlZmluZSBMQ01TX1VTRURfQVNfUFJPT0YgICAgICAyCi0KLUNNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zSXNJbnRlbnRTdXBwb3J0ZWQoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsIGNtc1VJbnQzMk51bWJlciBVc2VkRGlyZWN0aW9uKTsKLUNNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zSXNNYXRyaXhTaGFwZXIoY21zSFBST0ZJTEUgaFByb2ZpbGUpOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNJc0NMVVQoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsIGNtc1VJbnQzMk51bWJlciBVc2VkRGlyZWN0aW9uKTsKLQotLy8gVHJhbnNsYXRlIGZvcm0vdG8gb3VyIG5vdGF0aW9uIHRvIElDQwotQ01TQVBJIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgICBDTVNFWFBPUlQgX2Ntc0lDQ2NvbG9yU3BhY2UoaW50IE91ck5vdGF0aW9uKTsKLUNNU0FQSSBpbnQgICAgICAgICAgICAgICAgICAgICAgQ01TRVhQT1JUIF9jbXNMQ01TY29sb3JTcGFjZShjbXNDb2xvclNwYWNlU2lnbmF0dXJlIFByb2ZpbGVTcGFjZSk7Ci0KLUNNU0FQSSBjbXNVSW50MzJOdW1iZXIgICBDTVNFWFBPUlQgY21zQ2hhbm5lbHNPZihjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2UpOwotCi0vLyBCdWlsZCBhIHN1aXRhYmxlIGZvcm1hdHRlciBmb3IgdGhlIGNvbG9yc3BhY2Ugb2YgdGhpcyBwcm9maWxlCi1DTVNBUEkgY21zVUludDMyTnVtYmVyICAgQ01TRVhQT1JUIGNtc0Zvcm1hdHRlckZvckNvbG9yc3BhY2VPZlByb2ZpbGUoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBuQnl0ZXMsIGNtc0Jvb2wgbElzRmxvYXQpOwotQ01TQVBJIGNtc1VJbnQzMk51bWJlciAgIENNU0VYUE9SVCBjbXNGb3JtYXR0ZXJGb3JQQ1NPZlByb2ZpbGUoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBuQnl0ZXMsIGNtc0Jvb2wgbElzRmxvYXQpOwotCi0KLS8vIExvY2FsaXplZCBpbmZvCi10eXBlZGVmIGVudW0gewotICAgICAgICAgICAgIGNtc0luZm9EZXNjcmlwdGlvbiAgPSAwLAotICAgICAgICAgICAgIGNtc0luZm9NYW51ZmFjdHVyZXIgPSAxLAotICAgICAgICAgICAgIGNtc0luZm9Nb2RlbCAgICAgICAgPSAyLAotICAgICAgICAgICAgIGNtc0luZm9Db3B5cmlnaHQgICAgPSAzCi19IGNtc0luZm9UeXBlOwotCi1DTVNBUEkgY21zVUludDMyTnVtYmVyICAgQ01TRVhQT1JUIGNtc0dldFByb2ZpbGVJbmZvKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNJbmZvVHlwZSBJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBMYW5ndWFnZUNvZGVbM10sIGNvbnN0IGNoYXIgQ291bnRyeUNvZGVbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90KiBCdWZmZXIsIGNtc1VJbnQzMk51bWJlciBCdWZmZXJTaXplKTsKLQotQ01TQVBJIGNtc1VJbnQzMk51bWJlciAgIENNU0VYUE9SVCBjbXNHZXRQcm9maWxlSW5mb0FTQ0lJKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNJbmZvVHlwZSBJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBMYW5ndWFnZUNvZGVbM10sIGNvbnN0IGNoYXIgQ291bnRyeUNvZGVbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBCdWZmZXIsIGNtc1VJbnQzMk51bWJlciBCdWZmZXJTaXplKTsKLQotLy8gSU8gaGFuZGxlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10eXBlZGVmIHN0cnVjdCBfY21zX2lvX2hhbmRsZXIgY21zSU9IQU5ETEVSOwotCi1DTVNBUEkgY21zSU9IQU5ETEVSKiAgICAgQ01TRVhQT1JUIGNtc09wZW5JT2hhbmRsZXJGcm9tRmlsZShjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3QgY2hhciogRmlsZU5hbWUsIGNvbnN0IGNoYXIqIEFjY2Vzc01vZGUpOwotQ01TQVBJIGNtc0lPSEFORExFUiogICAgIENNU0VYUE9SVCBjbXNPcGVuSU9oYW5kbGVyRnJvbVN0cmVhbShjbXNDb250ZXh0IENvbnRleHRJRCwgRklMRSogU3RyZWFtKTsKLUNNU0FQSSBjbXNJT0hBTkRMRVIqICAgICBDTVNFWFBPUlQgY21zT3BlbklPaGFuZGxlckZyb21NZW0oY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQgKkJ1ZmZlciwgY21zVUludDMyTnVtYmVyIHNpemUsIGNvbnN0IGNoYXIqIEFjY2Vzc01vZGUpOwotQ01TQVBJIGNtc0lPSEFORExFUiogICAgIENNU0VYUE9SVCBjbXNPcGVuSU9oYW5kbGVyRnJvbU5VTEwoY21zQ29udGV4dCBDb250ZXh0SUQpOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCBjbXNDbG9zZUlPaGFuZGxlcihjbXNJT0hBTkRMRVIqIGlvKTsKLQotLy8gTUQ1IG1lc3NhZ2UgZGlnZXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgY21zTUQ1Y29tcHV0ZUlEKGNtc0hQUk9GSUxFIGhQcm9maWxlKTsKLUNNU0FQSSBjbXNCb29sCQkJIENNU0VYUE9SVCBjbXNNRDVjb21wdXRlSURFeHQoY29uc3Qgdm9pZCogYnVmLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGNoYXIgUHJvZmlsZUlEWzE2XSk7Ci0KLS8vIFByb2ZpbGUgaGlnaCBsZXZlbCBmdW50aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc09wZW5Qcm9maWxlRnJvbUZpbGUoY29uc3QgY2hhciAqSUNDUHJvZmlsZSwgY29uc3QgY2hhciAqc0FjY2Vzcyk7Ci1DTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zT3BlblByb2ZpbGVGcm9tRmlsZVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3QgY2hhciAqSUNDUHJvZmlsZSwgY29uc3QgY2hhciAqc0FjY2Vzcyk7Ci1DTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zT3BlblByb2ZpbGVGcm9tU3RyZWFtKEZJTEUqIElDQ1Byb2ZpbGUsIGNvbnN0IGNoYXIqIHNBY2Nlc3MpOwotQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc09wZW5Qcm9maWxlRnJvbVN0cmVhbVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwgRklMRSogSUNDUHJvZmlsZSwgY29uc3QgY2hhciogc0FjY2Vzcyk7Ci1DTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zT3BlblByb2ZpbGVGcm9tTWVtKGNvbnN0IHZvaWQgKiBNZW1QdHIsIGNtc1VJbnQzMk51bWJlciBkd1NpemUpOwotQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc09wZW5Qcm9maWxlRnJvbU1lbVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3Qgdm9pZCAqIE1lbVB0ciwgY21zVUludDMyTnVtYmVyIGR3U2l6ZSk7Ci1DTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zT3BlblByb2ZpbGVGcm9tSU9oYW5kbGVyVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNJT0hBTkRMRVIqIGlvKTsKLUNNU0FQSSBjbXNIUFJPRklMRSAgICAgIENNU0VYUE9SVCBjbXNPcGVuUHJvZmlsZUZyb21JT2hhbmRsZXIyVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNCb29sIHdyaXRlKTsKLUNNU0FQSSBjbXNCb29sICAgICAgICAgIENNU0VYUE9SVCBjbXNDbG9zZVByb2ZpbGUoY21zSFBST0ZJTEUgaFByb2ZpbGUpOwotCi1DTVNBUEkgY21zQm9vbCAgICAgICAgICBDTVNFWFBPUlQgY21zU2F2ZVByb2ZpbGVUb0ZpbGUoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNvbnN0IGNoYXIqIEZpbGVOYW1lKTsKLUNNU0FQSSBjbXNCb29sICAgICAgICAgIENNU0VYUE9SVCBjbXNTYXZlUHJvZmlsZVRvU3RyZWFtKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBGSUxFKiBTdHJlYW0pOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgQ01TRVhQT1JUIGNtc1NhdmVQcm9maWxlVG9NZW0oY21zSFBST0ZJTEUgaFByb2ZpbGUsIHZvaWQgKk1lbVB0ciwgY21zVUludDMyTnVtYmVyKiBCeXRlc05lZWRlZCk7Ci1DTVNBUEkgY21zVUludDMyTnVtYmVyICBDTVNFWFBPUlQgY21zU2F2ZVByb2ZpbGVUb0lPaGFuZGxlcihjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zSU9IQU5ETEVSKiBpbyk7Ci0KLS8vIFByZWRlZmluZWQgdmlydHVhbCBwcm9maWxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZVJHQlByb2ZpbGVUSFIoY21zQ29udGV4dCBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNDSUV4eVkqIFdoaXRlUG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNDSUV4eVlUUklQTEUqIFByaW1hcmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1RvbmVDdXJ2ZSogY29uc3QgVHJhbnNmZXJGdW5jdGlvblszXSk7Ci0KLUNNU0FQSSBjbXNIUFJPRklMRSAgICAgIENNU0VYUE9SVCBjbXNDcmVhdGVSR0JQcm9maWxlKGNvbnN0IGNtc0NJRXh5WSogV2hpdGVQb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0NJRXh5WVRSSVBMRSogUHJpbWFyaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVG9uZUN1cnZlKiBjb25zdCBUcmFuc2ZlckZ1bmN0aW9uWzNdKTsKLQotQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZUdyYXlQcm9maWxlVEhSKGNtc0NvbnRleHQgQ29udGV4dElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0NJRXh5WSogV2hpdGVQb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNUb25lQ3VydmUqIFRyYW5zZmVyRnVuY3Rpb24pOwotCi1DTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zQ3JlYXRlR3JheVByb2ZpbGUoY29uc3QgY21zQ0lFeHlZKiBXaGl0ZVBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1RvbmVDdXJ2ZSogVHJhbnNmZXJGdW5jdGlvbik7Ci0KLUNNU0FQSSBjbXNIUFJPRklMRSAgICAgIENNU0VYUE9SVCBjbXNDcmVhdGVMaW5lYXJpemF0aW9uRGV2aWNlTGlua1RIUihjbXNDb250ZXh0IENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVG9uZUN1cnZlKiBjb25zdCBUcmFuc2ZlckZ1bmN0aW9uc1tdKTsKLQotQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZUxpbmVhcml6YXRpb25EZXZpY2VMaW5rKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgQ29sb3JTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNUb25lQ3VydmUqIGNvbnN0IFRyYW5zZmVyRnVuY3Rpb25zW10pOwotCi1DTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zQ3JlYXRlSW5rTGltaXRpbmdEZXZpY2VMaW5rVEhSKGNtc0NvbnRleHQgQ29udGV4dElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2UsIGNtc0Zsb2F0NjROdW1iZXIgTGltaXQpOwotCi1DTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zQ3JlYXRlSW5rTGltaXRpbmdEZXZpY2VMaW5rKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgQ29sb3JTcGFjZSwgY21zRmxvYXQ2NE51bWJlciBMaW1pdCk7Ci0KLQotQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZUxhYjJQcm9maWxlVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCBjbXNDSUV4eVkqIFdoaXRlUG9pbnQpOwotQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZUxhYjJQcm9maWxlKGNvbnN0IGNtc0NJRXh5WSogV2hpdGVQb2ludCk7Ci1DTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zQ3JlYXRlTGFiNFByb2ZpbGVUSFIoY21zQ29udGV4dCBDb250ZXh0SUQsIGNvbnN0IGNtc0NJRXh5WSogV2hpdGVQb2ludCk7Ci1DTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zQ3JlYXRlTGFiNFByb2ZpbGUoY29uc3QgY21zQ0lFeHlZKiBXaGl0ZVBvaW50KTsKLQotQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZVhZWlByb2ZpbGVUSFIoY21zQ29udGV4dCBDb250ZXh0SUQpOwotQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZVhZWlByb2ZpbGUodm9pZCk7Ci0KLUNNU0FQSSBjbXNIUFJPRklMRSAgICAgIENNU0VYUE9SVCBjbXNDcmVhdGVfc1JHQlByb2ZpbGVUSFIoY21zQ29udGV4dCBDb250ZXh0SUQpOwotQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZV9zUkdCUHJvZmlsZSh2b2lkKTsKLQotQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZUJDSFNXYWJzdHJhY3RQcm9maWxlVEhSKGNtc0NvbnRleHQgQ29udGV4dElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuTFVUUG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgQnJpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgQ29udHJhc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBIdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBTYXR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBUZW1wU3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBUZW1wRGVzdCk7Ci0KLUNNU0FQSSBjbXNIUFJPRklMRSAgICAgIENNU0VYUE9SVCBjbXNDcmVhdGVCQ0hTV2Fic3RyYWN0UHJvZmlsZShpbnQgbkxVVFBvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEJyaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIENvbnRyYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgSHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgU2F0dXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgVGVtcFNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgVGVtcERlc3QpOwotCi1DTVNBUEkgY21zSFBST0ZJTEUgICAgICBDTVNFWFBPUlQgY21zQ3JlYXRlTlVMTFByb2ZpbGVUSFIoY21zQ29udGV4dCBDb250ZXh0SUQpOwotQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc0NyZWF0ZU5VTExQcm9maWxlKHZvaWQpOwotCi0vLyBDb252ZXJ0cyBhIHRyYW5zZm9ybSB0byBhIGRldmljZWxpbmsgcHJvZmlsZQotQ01TQVBJIGNtc0hQUk9GSUxFICAgICAgQ01TRVhQT1JUIGNtc1RyYW5zZm9ybTJEZXZpY2VMaW5rKGNtc0hUUkFOU0ZPUk0gaFRyYW5zZm9ybSwgY21zRmxvYXQ2NE51bWJlciBWZXJzaW9uLCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncyk7Ci0KLS8vIEludGVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBJQ0MgSW50ZW50cwotI2RlZmluZSBJTlRFTlRfUEVSQ0VQVFVBTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSNkZWZpbmUgSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQyAgICAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIElOVEVOVF9TQVRVUkFUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBJTlRFTlRfQUJTT0xVVEVfQ09MT1JJTUVUUklDICAgICAgICAgICAgICAgICAgIDMKLQotLy8gTm9uLUlDQyBpbnRlbnRzCi0jZGVmaW5lIElOVEVOVF9QUkVTRVJWRV9LX09OTFlfUEVSQ0VQVFVBTCAgICAgICAgICAgICAxMAotI2RlZmluZSBJTlRFTlRfUFJFU0VSVkVfS19PTkxZX1JFTEFUSVZFX0NPTE9SSU1FVFJJQyAgMTEKLSNkZWZpbmUgSU5URU5UX1BSRVNFUlZFX0tfT05MWV9TQVRVUkFUSU9OICAgICAgICAgICAgIDEyCi0jZGVmaW5lIElOVEVOVF9QUkVTRVJWRV9LX1BMQU5FX1BFUkNFUFRVQUwgICAgICAgICAgICAxMwotI2RlZmluZSBJTlRFTlRfUFJFU0VSVkVfS19QTEFORV9SRUxBVElWRV9DT0xPUklNRVRSSUMgMTQKLSNkZWZpbmUgSU5URU5UX1BSRVNFUlZFX0tfUExBTkVfU0FUVVJBVElPTiAgICAgICAgICAgIDE1Ci0KLS8vIENhbGwgd2l0aCBOVUxMIGFzIHBhcmFtZXRlcnMgdG8gZ2V0IHRoZSBpbnRlbnQgY291bnQKLUNNU0FQSSBjbXNVSW50MzJOdW1iZXIgIENNU0VYUE9SVCBjbXNHZXRTdXBwb3J0ZWRJbnRlbnRzKGNtc1VJbnQzMk51bWJlciBuTWF4LCBjbXNVSW50MzJOdW1iZXIqIENvZGVzLCBjaGFyKiogRGVzY3JpcHRpb25zKTsKLUNNU0FQSSBjbXNVSW50MzJOdW1iZXIgIENNU0VYUE9SVCBjbXNHZXRTdXBwb3J0ZWRJbnRlbnRzVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgbk1heCwgY21zVUludDMyTnVtYmVyKiBDb2RlcywgY2hhcioqIERlc2NyaXB0aW9ucyk7Ci0KLS8vIEZsYWdzCi0KLSNkZWZpbmUgY21zRkxBR1NfTk9DQUNIRSAgICAgICAgICAgICAgICAgIDB4MDA0MCAgICAvLyBJbmhpYml0IDEtcGl4ZWwgY2FjaGUKLSNkZWZpbmUgY21zRkxBR1NfTk9PUFRJTUlaRSAgICAgICAgICAgICAgIDB4MDEwMCAgICAvLyBJbmhpYml0IG9wdGltaXphdGlvbnMKLSNkZWZpbmUgY21zRkxBR1NfTlVMTFRSQU5TRk9STSAgICAgICAgICAgIDB4MDIwMCAgICAvLyBEb24ndCB0cmFuc2Zvcm0gYW55d2F5Ci0KLS8vIFByb29maW5nIGZsYWdzCi0jZGVmaW5lIGNtc0ZMQUdTX0dBTVVUQ0hFQ0sgICAgICAgICAgICAgICAweDEwMDAgICAgLy8gT3V0IG9mIEdhbXV0IGFsYXJtCi0jZGVmaW5lIGNtc0ZMQUdTX1NPRlRQUk9PRklORyAgICAgICAgICAgICAweDQwMDAgICAgLy8gRG8gc29mdHByb29maW5nCi0KLS8vIE1pc2MKLSNkZWZpbmUgY21zRkxBR1NfQkxBQ0tQT0lOVENPTVBFTlNBVElPTiAgIDB4MjAwMAotI2RlZmluZSBjbXNGTEFHU19OT1dISVRFT05XSElURUZJWFVQICAgICAgMHgwMDA0ICAgIC8vIERvbid0IGZpeCBzY3VtIGRvdAotI2RlZmluZSBjbXNGTEFHU19ISUdIUkVTUFJFQ0FMQyAgICAgICAgICAgMHgwNDAwICAgIC8vIFVzZSBtb3JlIG1lbW9yeSB0byBnaXZlIGJldHRlciBhY2N1cmFuY3kKLSNkZWZpbmUgY21zRkxBR1NfTE9XUkVTUFJFQ0FMQyAgICAgICAgICAgIDB4MDgwMCAgICAvLyBVc2UgbGVzcyBtZW1vcnkgdG8gbWluaW1pemUgcmVzb3VjZXMKLQotLy8gRm9yIGRldmljZWxpbmsgY3JlYXRpb24KLSNkZWZpbmUgY21zRkxBR1NfOEJJVFNfREVWSUNFTElOSyAgICAgICAgIDB4MDAwOCAgIC8vIENyZWF0ZSA4IGJpdHMgZGV2aWNlbGlua3MKLSNkZWZpbmUgY21zRkxBR1NfR1VFU1NERVZJQ0VDTEFTUyAgICAgICAgIDB4MDAyMCAgIC8vIEd1ZXNzIGRldmljZSBjbGFzcyAoZm9yIHRyYW5zZm9ybTJkZXZpY2VsaW5rKQotI2RlZmluZSBjbXNGTEFHU19LRUVQX1NFUVVFTkNFICAgICAgICAgICAgMHgwMDgwICAgLy8gS2VlcCBwcm9maWxlIHNlcXVlbmNlIGZvciBkZXZpY2VsaW5rIGNyZWF0aW9uCi0KLS8vIFNwZWNpZmljIHRvIGEgcGFydGljdWxhciBvcHRpbWl6YXRpb25zCi0jZGVmaW5lIGNtc0ZMQUdTX0ZPUkNFX0NMVVQgICAgICAgICAgICAgICAweDAwMDIgICAgLy8gRm9yY2UgQ0xVVCBvcHRpbWl6YXRpb24KLSNkZWZpbmUgY21zRkxBR1NfQ0xVVF9QT1NUX0xJTkVBUklaQVRJT04gIDB4MDAwMSAgICAvLyBjcmVhdGUgcG9zdGxpbmVhcml6YXRpb24gdGFibGVzIGlmIHBvc3NpYmxlCi0jZGVmaW5lIGNtc0ZMQUdTX0NMVVRfUFJFX0xJTkVBUklaQVRJT04gICAweDAwMTAgICAgLy8gY3JlYXRlIHByZWxpbmVhcml6YXRpb24gdGFibGVzIGlmIHBvc3NpYmxlCi0KLS8vIEZpbmUtdHVuZSBjb250cm9sIG92ZXIgbnVtYmVyIG9mIGdyaWRwb2ludHMKLSNkZWZpbmUgY21zRkxBR1NfR1JJRFBPSU5UUyhuKSAgICAgICAgICAgKCgobikgJiAweEZGKSA8PCAxNikKLQotLy8gQ1JEIHNwZWNpYWwKLSNkZWZpbmUgY21zRkxBR1NfTk9ERUZBVUxUUkVTT1VSQ0VERUYgICAgIDB4MDEwMDAwMDAKLQotLy8gVHJhbnNmb3JtcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ01TQVBJIGNtc0hUUkFOU0ZPUk0gICAgQ01TRVhQT1JUIGNtc0NyZWF0ZVRyYW5zZm9ybVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgT3V0cHV0Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW50ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncyk7Ci0KLUNNU0FQSSBjbXNIVFJBTlNGT1JNICAgIENNU0VYUE9SVCBjbXNDcmVhdGVUcmFuc2Zvcm0oY21zSFBST0ZJTEUgSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgT3V0cHV0Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW50ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncyk7Ci0KLUNNU0FQSSBjbXNIVFJBTlNGT1JNICAgIENNU0VYUE9SVCBjbXNDcmVhdGVQcm9vZmluZ1RyYW5zZm9ybVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgT3V0cHV0Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSBQcm9vZmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEludGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFByb29maW5nSW50ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncyk7Ci0KLUNNU0FQSSBjbXNIVFJBTlNGT1JNICAgIENNU0VYUE9SVCBjbXNDcmVhdGVQcm9vZmluZ1RyYW5zZm9ybShjbXNIUFJPRklMRSBJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIElucHV0Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSBPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBPdXRwdXRGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFIFByb29maW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW50ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgUHJvb2ZpbmdJbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKTsKLQotQ01TQVBJIGNtc0hUUkFOU0ZPUk0gICAgQ01TRVhQT1JUIGNtc0NyZWF0ZU11bHRpcHJvZmlsZVRyYW5zZm9ybVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgaFByb2ZpbGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuUHJvZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIE91dHB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEludGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOwotCi0KLUNNU0FQSSBjbXNIVFJBTlNGT1JNICAgIENNU0VYUE9SVCBjbXNDcmVhdGVNdWx0aXByb2ZpbGVUcmFuc2Zvcm0oY21zSFBST0ZJTEUgaFByb2ZpbGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuUHJvZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIE91dHB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEludGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOwotCi0KLUNNU0FQSSBjbXNIVFJBTlNGT1JNICAgIENNU0VYUE9SVCBjbXNDcmVhdGVFeHRlbmRlZFRyYW5zZm9ybShjbXNDb250ZXh0IENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuUHJvZmlsZXMsIGNtc0hQUk9GSUxFIGhQcm9maWxlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zQm9vbCAgQlBDW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW50ZW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uU3RhdGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSBoR2FtdXRQcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG5HYW11dFBDU3Bvc2l0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIElucHV0Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIE91dHB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKTsKLQotQ01TQVBJIHZvaWQgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0RlbGV0ZVRyYW5zZm9ybShjbXNIVFJBTlNGT1JNIGhUcmFuc2Zvcm0pOwotCi1DTVNBUEkgdm9pZCAgICAgICAgICAgICBDTVNFWFBPUlQgY21zRG9UcmFuc2Zvcm0oY21zSFRSQU5TRk9STSBUcmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIElucHV0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFNpemUpOwotCi1DTVNBUEkgdm9pZCAgICAgICAgICAgICBDTVNFWFBPUlQgY21zRG9UcmFuc2Zvcm1TdHJpZGUoY21zSFRSQU5TRk9STSBUcmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqIElucHV0QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFN0cmlkZSk7Ci0KLQotQ01TQVBJIHZvaWQgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc1NldEFsYXJtQ29kZXMoY29uc3QgY21zVUludDE2TnVtYmVyIE5ld0FsYXJtW2Ntc01BWENIQU5ORUxTXSk7Ci1DTVNBUEkgdm9pZCAgICAgICAgICAgICBDTVNFWFBPUlQgY21zR2V0QWxhcm1Db2RlcyhjbXNVSW50MTZOdW1iZXIgTmV3QWxhcm1bY21zTUFYQ0hBTk5FTFNdKTsKLQotCi1DTVNBUEkgdm9pZCAgICAgICAgICAgICBDTVNFWFBPUlQgY21zU2V0QWxhcm1Db2Rlc1RIUihjbXNDb250ZXh0IENvbnRleHRJRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zVUludDE2TnVtYmVyIEFsYXJtQ29kZXNbY21zTUFYQ0hBTk5FTFNdKTsKLUNNU0FQSSB2b2lkICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNHZXRBbGFybUNvZGVzVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIgQWxhcm1Db2Rlc1tjbXNNQVhDSEFOTkVMU10pOwotCi0KLQotLy8gQWRhcHRhdGlvbiBzdGF0ZSBmb3IgYWJzb2x1dGUgY29sb3JpbWV0cmljIGludGVudAotQ01TQVBJIGNtc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIGNtc1NldEFkYXB0YXRpb25TdGF0ZShjbXNGbG9hdDY0TnVtYmVyIGQpOwotQ01TQVBJIGNtc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIGNtc1NldEFkYXB0YXRpb25TdGF0ZVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zRmxvYXQ2NE51bWJlciBkKTsKLQotCi0KLS8vIEdyYWIgdGhlIENvbnRleHRJRCBmcm9tIGFuIG9wZW4gdHJhbnNmb3JtLiBSZXR1cm5zIE5VTEwgaWYgYSBOVUxMIHRyYW5zZm9ybSBpcyBwYXNzZWQKLUNNU0FQSSBjbXNDb250ZXh0ICAgICAgIENNU0VYUE9SVCBjbXNHZXRUcmFuc2Zvcm1Db250ZXh0SUQoY21zSFRSQU5TRk9STSBoVHJhbnNmb3JtKTsKLQotLy8gR3JhYiB0aGUgaW5wdXQvb3V0cHV0IGZvcm1hdHMKLUNNU0FQSSBjbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0dldFRyYW5zZm9ybUlucHV0Rm9ybWF0KGNtc0hUUkFOU0ZPUk0gaFRyYW5zZm9ybSk7Ci1DTVNBUEkgY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNHZXRUcmFuc2Zvcm1PdXRwdXRGb3JtYXQoY21zSFRSQU5TRk9STSBoVHJhbnNmb3JtKTsKLQotLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ci1DTVNBUEkgY21zQm9vbCAgICAgICAgICBDTVNFWFBPUlQgY21zQ2hhbmdlQnVmZmVyc0Zvcm1hdChjbXNIVFJBTlNGT1JNIGhUcmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW5wdXRGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgT3V0cHV0Rm9ybWF0KTsKLQotCi0KLS8vIFBvc3RTY3JpcHQgQ29sb3JSZW5kZXJpbmdEaWN0aW9uYXJ5IGFuZCBDb2xvclNwYWNlQXJyYXkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10eXBlZGVmIGVudW0geyBjbXNQU19SRVNPVVJDRV9DU0EsIGNtc1BTX1JFU09VUkNFX0NSRCB9IGNtc1BTUmVzb3VyY2VUeXBlOwotCi0vLyBsY21zMiB1bmlmaWVkIG1ldGhvZCB0byBhY2Nlc3MgcG9zdHNjcmlwdCBjb2xvciByZXNvdXJjZXMKLUNNU0FQSSBjbXNVSW50MzJOdW1iZXIgIENNU0VYUE9SVCBjbXNHZXRQb3N0U2NyaXB0Q29sb3JSZXNvdXJjZShjbXNDb250ZXh0IENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNQU1Jlc291cmNlVHlwZSBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFIGhQcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSU9IQU5ETEVSKiBpbyk7Ci0KLUNNU0FQSSBjbXNVSW50MzJOdW1iZXIgIENNU0VYUE9SVCBjbXNHZXRQb3N0U2NyaXB0Q1NBKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVUludDMyTnVtYmVyIEludGVudCwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MsIHZvaWQqIEJ1ZmZlciwgY21zVUludDMyTnVtYmVyIGR3QnVmZmVyTGVuKTsKLUNNU0FQSSBjbXNVSW50MzJOdW1iZXIgIENNU0VYUE9SVCBjbXNHZXRQb3N0U2NyaXB0Q1JEKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVUludDMyTnVtYmVyIEludGVudCwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MsIHZvaWQqIEJ1ZmZlciwgY21zVUludDMyTnVtYmVyIGR3QnVmZmVyTGVuKTsKLQotCi0vLyBJVDguNyAvIENHQVRTLjE3LTIwMHggaGFuZGxpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ01TQVBJIGNtc0hBTkRMRSAgICAgICAgQ01TRVhQT1JUIGNtc0lUOEFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElEKTsKLUNNU0FQSSB2b2lkICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNJVDhGcmVlKGNtc0hBTkRMRSBoSVQ4KTsKLQotLy8gVGFibGVzCi1DTVNBUEkgY21zVUludDMyTnVtYmVyICBDTVNFWFBPUlQgY21zSVQ4VGFibGVDb3VudChjbXNIQU5ETEUgaElUOCk7Ci1DTVNBUEkgY21zSW50MzJOdW1iZXIgICBDTVNFWFBPUlQgY21zSVQ4U2V0VGFibGUoY21zSEFORExFIGhJVDgsIGNtc1VJbnQzMk51bWJlciBuVGFibGUpOwotCi0vLyBQZXJzaXN0ZW5jZQotQ01TQVBJIGNtc0hBTkRMRSAgICAgICAgQ01TRVhQT1JUIGNtc0lUOExvYWRGcm9tRmlsZShjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3QgY2hhciogY0ZpbGVOYW1lKTsKLUNNU0FQSSBjbXNIQU5ETEUgICAgICAgIENNU0VYUE9SVCBjbXNJVDhMb2FkRnJvbU1lbShjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbGVuKTsKLS8vIENNU0FQSSBjbXNIQU5ETEUgICAgICAgIENNU0VYUE9SVCBjbXNJVDhMb2FkRnJvbUlPaGFuZGxlcihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zSU9IQU5ETEVSKiBpbyk7Ci0KLUNNU0FQSSBjbXNCb29sICAgICAgICAgIENNU0VYUE9SVCBjbXNJVDhTYXZlVG9GaWxlKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBjRmlsZU5hbWUpOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgQ01TRVhQT1JUIGNtc0lUOFNhdmVUb01lbShjbXNIQU5ETEUgaElUOCwgdm9pZCAqTWVtUHRyLCBjbXNVSW50MzJOdW1iZXIqIEJ5dGVzTmVlZGVkKTsKLQotLy8gUHJvcGVydGllcwotQ01TQVBJIGNvbnN0IGNoYXIqICAgICAgQ01TRVhQT1JUIGNtc0lUOEdldFNoZWV0VHlwZShjbXNIQU5ETEUgaElUOCk7Ci1DTVNBUEkgY21zQm9vbCAgICAgICAgICBDTVNFWFBPUlQgY21zSVQ4U2V0U2hlZXRUeXBlKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBUeXBlKTsKLQotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgQ01TRVhQT1JUIGNtc0lUOFNldENvbW1lbnQoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIGNDb21tZW50KTsKLQotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgQ01TRVhQT1JUIGNtc0lUOFNldFByb3BlcnR5U3RyKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBjUHJvcCwgY29uc3QgY2hhciAqU3RyKTsKLUNNU0FQSSBjbXNCb29sICAgICAgICAgIENNU0VYUE9SVCBjbXNJVDhTZXRQcm9wZXJ0eURibChjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciogY1Byb3AsIGNtc0Zsb2F0NjROdW1iZXIgVmFsKTsKLUNNU0FQSSBjbXNCb29sICAgICAgICAgIENNU0VYUE9SVCBjbXNJVDhTZXRQcm9wZXJ0eUhleChjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciogY1Byb3AsIGNtc1VJbnQzMk51bWJlciBWYWwpOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgQ01TRVhQT1JUIGNtc0lUOFNldFByb3BlcnR5TXVsdGkoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIEtleSwgY29uc3QgY2hhciogU3ViS2V5LCBjb25zdCBjaGFyICpCdWZmZXIpOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgQ01TRVhQT1JUIGNtc0lUOFNldFByb3BlcnR5VW5jb29rZWQoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIEtleSwgY29uc3QgY2hhciogQnVmZmVyKTsKLQotCi1DTVNBUEkgY29uc3QgY2hhciogICAgICBDTVNFWFBPUlQgY21zSVQ4R2V0UHJvcGVydHkoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIGNQcm9wKTsKLUNNU0FQSSBjbXNGbG9hdDY0TnVtYmVyIENNU0VYUE9SVCBjbXNJVDhHZXRQcm9wZXJ0eURibChjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciogY1Byb3ApOwotQ01TQVBJIGNvbnN0IGNoYXIqICAgICAgQ01TRVhQT1JUIGNtc0lUOEdldFByb3BlcnR5TXVsdGkoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIEtleSwgY29uc3QgY2hhciAqU3ViS2V5KTsKLUNNU0FQSSBjbXNVSW50MzJOdW1iZXIgIENNU0VYUE9SVCBjbXNJVDhFbnVtUHJvcGVydGllcyhjbXNIQU5ETEUgaElUOCwgY2hhciAqKipQcm9wZXJ0eU5hbWVzKTsKLUNNU0FQSSBjbXNVSW50MzJOdW1iZXIgIENNU0VYUE9SVCBjbXNJVDhFbnVtUHJvcGVydHlNdWx0aShjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciogY1Byb3AsIGNvbnN0IGNoYXIgKioqU3VicHJvcGVydHlOYW1lcyk7Ci0KLS8vIERhdGFzZXRzCi1DTVNBUEkgY29uc3QgY2hhciogICAgICBDTVNFWFBPUlQgY21zSVQ4R2V0RGF0YVJvd0NvbChjbXNIQU5ETEUgaElUOCwgaW50IHJvdywgaW50IGNvbCk7Ci1DTVNBUEkgY21zRmxvYXQ2NE51bWJlciBDTVNFWFBPUlQgY21zSVQ4R2V0RGF0YVJvd0NvbERibChjbXNIQU5ETEUgaElUOCwgaW50IHJvdywgaW50IGNvbCk7Ci0KLUNNU0FQSSBjbXNCb29sICAgICAgICAgIENNU0VYUE9SVCBjbXNJVDhTZXREYXRhUm93Q29sKGNtc0hBTkRMRSBoSVQ4LCBpbnQgcm93LCBpbnQgY29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogVmFsKTsKLQotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgQ01TRVhQT1JUIGNtc0lUOFNldERhdGFSb3dDb2xEYmwoY21zSEFORExFIGhJVDgsIGludCByb3csIGludCBjb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIFZhbCk7Ci0KLUNNU0FQSSBjb25zdCBjaGFyKiAgICAgIENNU0VYUE9SVCBjbXNJVDhHZXREYXRhKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBjUGF0Y2gsIGNvbnN0IGNoYXIqIGNTYW1wbGUpOwotCi0KLUNNU0FQSSBjbXNGbG9hdDY0TnVtYmVyIENNU0VYUE9SVCBjbXNJVDhHZXREYXRhRGJsKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBjUGF0Y2gsIGNvbnN0IGNoYXIqIGNTYW1wbGUpOwotCi1DTVNBUEkgY21zQm9vbCAgICAgICAgICBDTVNFWFBPUlQgY21zSVQ4U2V0RGF0YShjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciogY1BhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY1NhbXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKlZhbCk7Ci0KLUNNU0FQSSBjbXNCb29sICAgICAgICAgIENNU0VYUE9SVCBjbXNJVDhTZXREYXRhRGJsKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBjUGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjU2FtcGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBWYWwpOwotCi1DTVNBUEkgaW50ICAgICAgICAgICAgICBDTVNFWFBPUlQgY21zSVQ4RmluZERhdGFGb3JtYXQoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIGNTYW1wbGUpOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgQ01TRVhQT1JUIGNtc0lUOFNldERhdGFGb3JtYXQoY21zSEFORExFIGhJVDgsIGludCBuLCBjb25zdCBjaGFyICpTYW1wbGUpOwotQ01TQVBJIGludCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0lUOEVudW1EYXRhRm9ybWF0KGNtc0hBTkRMRSBoSVQ4LCBjaGFyICoqKlNhbXBsZU5hbWVzKTsKLQotQ01TQVBJIGNvbnN0IGNoYXIqICAgICAgQ01TRVhQT1JUIGNtc0lUOEdldFBhdGNoTmFtZShjbXNIQU5ETEUgaElUOCwgaW50IG5QYXRjaCwgY2hhciogYnVmZmVyKTsKLUNNU0FQSSBpbnQgICAgICAgICAgICAgIENNU0VYUE9SVCBjbXNJVDhHZXRQYXRjaEJ5TmFtZShjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciAqY1BhdGNoKTsKLQotLy8gVGhlIExBQkVMIGV4dGVuc2lvbgotQ01TQVBJIGludCAgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0lUOFNldFRhYmxlQnlMYWJlbChjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciogY1NldCwgY29uc3QgY2hhciogY0ZpZWxkLCBjb25zdCBjaGFyKiBFeHBlY3RlZFR5cGUpOwotCi1DTVNBUEkgY21zQm9vbCAgICAgICAgICBDTVNFWFBPUlQgY21zSVQ4U2V0SW5kZXhDb2x1bW4oY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIGNTYW1wbGUpOwotCi0vLyBGb3JtYXR0ZXIgZm9yIGRvdWJsZQotQ01TQVBJIHZvaWQgICAgICAgICAgICAgQ01TRVhQT1JUIGNtc0lUOERlZmluZURibEZvcm1hdChjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciogRm9ybWF0dGVyKTsKLQotLy8gR2FtdXQgYm91bmRhcnkgZGVzY3JpcHRpb24gcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUNNU0FQSSBjbXNIQU5ETEUgICAgICAgIENNU0VYUE9SVCBjbXNHQkRBbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCk7Ci1DTVNBUEkgdm9pZCAgICAgICAgICAgICBDTVNFWFBPUlQgY21zR0JERnJlZShjbXNIQU5ETEUgaEdCRCk7Ci1DTVNBUEkgY21zQm9vbCAgICAgICAgICBDTVNFWFBPUlQgY21zR0RCQWRkUG9pbnQoY21zSEFORExFIGhHQkQsIGNvbnN0IGNtc0NJRUxhYiogTGFiKTsKLUNNU0FQSSBjbXNCb29sICAgICAgICAgIENNU0VYUE9SVCBjbXNHREJDb21wdXRlKGNtc0hBTkRMRSAgaEdEQiwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgQ01TRVhQT1JUIGNtc0dEQkNoZWNrUG9pbnQoY21zSEFORExFIGhHQkQsIGNvbnN0IGNtc0NJRUxhYiogTGFiKTsKLQotLy8gRmVhdHVyZSBkZXRlY3Rpb24gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRXN0aW1hdGUgdGhlIGJsYWNrIHBvaW50Ci1DTVNBUEkgY21zQm9vbCAgICAgICAgICBDTVNFWFBPUlQgY21zRGV0ZWN0QmxhY2tQb2ludChjbXNDSUVYWVoqIEJsYWNrUG9pbnQsIGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50MzJOdW1iZXIgSW50ZW50LCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncyk7Ci1DTVNBUEkgY21zQm9vbCAgICAgICAgICBDTVNFWFBPUlQgY21zRGV0ZWN0RGVzdGluYXRpb25CbGFja1BvaW50KGNtc0NJRVhZWiogQmxhY2tQb2ludCwgY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKTsKLQotLy8gRXN0aW1hdGUgdG90YWwgYXJlYSBjb3ZlcmFnZQotQ01TQVBJIGNtc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIGNtc0RldGVjdFRBQyhjbXNIUFJPRklMRSBoUHJvZmlsZSk7Ci0KLQotLy8gUG9vciBtYW4ncyBnYW11dCBtYXBwaW5nCi1DTVNBUEkgY21zQm9vbCAgICAgICAgICBDTVNFWFBPUlQgY21zRGVzYXR1cmF0ZUxhYihjbXNDSUVMYWIqIExhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhbWF4LCBkb3VibGUgYW1pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBibWF4LCBkb3VibGUgYm1pbik7Ci0KLSNpZm5kZWYgQ01TX1VTRV9DUFBfQVBJCi0jICAgaWZkZWYgX19jcGx1c3BsdXMKLSAgICB9Ci0jICAgZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIF9sY21zMl9ICi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9pbmNsdWRlL2xjbXMyX3BsdWdpbi5oIGIvdGhpcmRfcGFydHkvbGNtczItMi42L2luY2x1ZGUvbGNtczJfcGx1Z2luLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjOTVkMWYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGNtczItMi42L2luY2x1ZGUvbGNtczJfcGx1Z2luLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTEgTWFydGkgTWFyaWEgU2FndWVyCi0vLwotLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0vLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0vLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0vLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLS8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQotLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLS8vCi0vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0vLwotLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0vLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KLS8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi0vLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCi0vLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0vLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLS8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gVGhpcyBpcyB0aGUgcGx1Zy1pbiBoZWFkZXIgZmlsZS4gTm9ybWFsIExpdHRsZUNNUyBjbGllbnRzIHNob3VsZCBub3QgdXNlIGl0LgotLy8gSXQgaXMgcHJvdmlkZWQgZm9yIHBsdWctaW4gd3JpdHRlcnMgdGhhdCBtYXkgd2FudCB0byBhY2Nlc3MgdGhlIHN1cHBvcnQKLS8vIGZ1bmN0aW9ucyB0byBkbyBsb3cgbGV2ZWwgb3BlcmF0aW9ucy4gQWxsIHBsdWctaW4gcmVsYXRlZCBzdHJ1Y3R1cmVzCi0vLyBhcmUgZGVmaW5lZCBoZXJlLiBJbmNsdWRpbmcgdGhpcyBmaWxlIGZvcmNlcyB0byBpbmNsdWRlIHRoZSBzdGFuZGFyZCBBUEkgdG9vLgotCi0jaWZuZGVmIF9sY21zX3BsdWdpbl9ICi0KLS8vIERlYWwgd2l0aCBNaWNyb3NvZnQncyBhdHRlbXB0IGF0IGRlcHJlY2F0aW5nIEMgc3RhbmRhcmQgcnVudGltZSBmdW5jdGlvbnMKLSNpZmRlZiBfTVNDX1ZFUgotIyAgICBpZiAoX01TQ19WRVIgPj0gMTQwMCkKLSMgICAgICBpZm5kZWYgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFCi0jICAgICAgICBkZWZpbmUgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFCi0jICAgICAgZW5kaWYKLSMgICAgICBpZm5kZWYgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKLSMgICAgICAgIGRlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwotIyAgICAgIGVuZGlmCi0jICAgIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBfbGNtczJfSAotI2luY2x1ZGUgImxjbXMyLmgiCi0jZW5kaWYKLQotLy8gV2UgbmVlZCBzb21lIHN0YW5kYXJkIEMgZnVuY3Rpb25zLgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxtZW1vcnkuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotCi0jaWZuZGVmIENNU19VU0VfQ1BQX0FQSQotIyAgIGlmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSMgICBlbmRpZgotI2VuZGlmCi0KLS8vIFZlY3RvciAmIE1hdHJpeCBvcGVyYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEF4aXMgb2YgdGhlIG1hdHJpeC9hcnJheS4gTm8gc3BlY2lmaWMgbWVhbmluZyBhdCBhbGwuCi0jZGVmaW5lIFZYICAgICAgMAotI2RlZmluZSBWWSAgICAgIDEKLSNkZWZpbmUgVlogICAgICAyCi0KLS8vIFZlY3RvcnMKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIG5bM107Ci0KLSAgICB9IGNtc1ZFQzM7Ci0KLS8vIDN4MyBNYXRyaXgKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjbXNWRUMzIHZbM107Ci0KLSAgICB9IGNtc01BVDM7Ci0KLUNNU0FQSSB2b2lkICAgICAgICAgICAgICAgQ01TRVhQT1JUIF9jbXNWRUMzaW5pdChjbXNWRUMzKiByLCBjbXNGbG9hdDY0TnVtYmVyIHgsIGNtc0Zsb2F0NjROdW1iZXIgeSwgY21zRmxvYXQ2NE51bWJlciB6KTsKLUNNU0FQSSB2b2lkICAgICAgICAgICAgICAgQ01TRVhQT1JUIF9jbXNWRUMzbWludXMoY21zVkVDMyogciwgY29uc3QgY21zVkVDMyogYSwgY29uc3QgY21zVkVDMyogYik7Ci1DTVNBUEkgdm9pZCAgICAgICAgICAgICAgIENNU0VYUE9SVCBfY21zVkVDM2Nyb3NzKGNtc1ZFQzMqIHIsIGNvbnN0IGNtc1ZFQzMqIHUsIGNvbnN0IGNtc1ZFQzMqIHYpOwotQ01TQVBJIGNtc0Zsb2F0NjROdW1iZXIgICBDTVNFWFBPUlQgX2Ntc1ZFQzNkb3QoY29uc3QgY21zVkVDMyogdSwgY29uc3QgY21zVkVDMyogdik7Ci1DTVNBUEkgY21zRmxvYXQ2NE51bWJlciAgIENNU0VYUE9SVCBfY21zVkVDM2xlbmd0aChjb25zdCBjbXNWRUMzKiBhKTsKLUNNU0FQSSBjbXNGbG9hdDY0TnVtYmVyICAgQ01TRVhQT1JUIF9jbXNWRUMzZGlzdGFuY2UoY29uc3QgY21zVkVDMyogYSwgY29uc3QgY21zVkVDMyogYik7Ci0KLUNNU0FQSSB2b2lkICAgICAgICAgICAgICAgQ01TRVhQT1JUIF9jbXNNQVQzaWRlbnRpdHkoY21zTUFUMyogYSk7Ci1DTVNBUEkgY21zQm9vbCAgICAgICAgICAgIENNU0VYUE9SVCBfY21zTUFUM2lzSWRlbnRpdHkoY29uc3QgY21zTUFUMyogYSk7Ci1DTVNBUEkgdm9pZCAgICAgICAgICAgICAgIENNU0VYUE9SVCBfY21zTUFUM3BlcihjbXNNQVQzKiByLCBjb25zdCBjbXNNQVQzKiBhLCBjb25zdCBjbXNNQVQzKiBiKTsKLUNNU0FQSSBjbXNCb29sICAgICAgICAgICAgQ01TRVhQT1JUIF9jbXNNQVQzaW52ZXJzZShjb25zdCBjbXNNQVQzKiBhLCBjbXNNQVQzKiBiKTsKLUNNU0FQSSBjbXNCb29sICAgICAgICAgICAgQ01TRVhQT1JUIF9jbXNNQVQzc29sdmUoY21zVkVDMyogeCwgY21zTUFUMyogYSwgY21zVkVDMyogYik7Ci1DTVNBUEkgdm9pZCAgICAgICAgICAgICAgIENNU0VYUE9SVCBfY21zTUFUM2V2YWwoY21zVkVDMyogciwgY29uc3QgY21zTUFUMyogYSwgY29uc3QgY21zVkVDMyogdik7Ci0KLQotLy8gRXJyb3IgbG9nZ2luZyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DTVNBUEkgdm9pZCAgICAgICAgICAgICAgIENNU0VYUE9SVCAgY21zU2lnbmFsRXJyb3IoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBFcnJvckNvZGUsIGNvbnN0IGNoYXIgKkVycm9yVGV4dCwgLi4uKTsKLQotLy8gTWVtb3J5IG1hbmFnZW1lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1DTVNBUEkgdm9pZCogICAgICAgICAgICAgIENNU0VYUE9SVCBfY21zTWFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgc2l6ZSk7Ci1DTVNBUEkgdm9pZCogICAgICAgICAgICAgIENNU0VYUE9SVCBfY21zTWFsbG9jWmVybyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIHNpemUpOwotQ01TQVBJIHZvaWQqICAgICAgICAgICAgICBDTVNFWFBPUlQgX2Ntc0NhbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIG51bSwgY21zVUludDMyTnVtYmVyIHNpemUpOwotQ01TQVBJIHZvaWQqICAgICAgICAgICAgICBDTVNFWFBPUlQgX2Ntc1JlYWxsb2MoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIE5ld1NpemUpOwotQ01TQVBJIHZvaWQgICAgICAgICAgICAgICBDTVNFWFBPUlQgX2Ntc0ZyZWUoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIFB0cik7Ci1DTVNBUEkgdm9pZCogICAgICAgICAgICAgIENNU0VYUE9SVCBfY21zRHVwTWVtKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCB2b2lkKiBPcmcsIGNtc1VJbnQzMk51bWJlciBzaXplKTsKLQotLy8gSS9PIGhhbmRsZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdHJ1Y3QgX2Ntc19pb19oYW5kbGVyIHsKLQotICAgIHZvaWQqIHN0cmVhbTsgICAvLyBBc3NvY2lhdGVkIHN0cmVhbSwgd2hpY2ggaXMgaW1wbGVtZW50ZWQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIG1lZGlhLgotCi0gICAgY21zQ29udGV4dCAgICAgICAgQ29udGV4dElEOwotICAgIGNtc1VJbnQzMk51bWJlciAgIFVzZWRTcGFjZTsKLSAgICBjbXNVSW50MzJOdW1iZXIgICBSZXBvcnRlZFNpemU7Ci0gICAgY2hhciAgICAgICAgICAgICAgUGh5c2ljYWxGaWxlW2Ntc01BWF9QQVRIXTsKLQotICAgIGNtc1VJbnQzMk51bWJlciAgICgqIFJlYWQpKHN0cnVjdCBfY21zX2lvX2hhbmRsZXIqIGlvaGFuZGxlciwgdm9pZCAqQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgY291bnQpOwotICAgIGNtc0Jvb2wgICAgICAgICAgICgqIFNlZWspKHN0cnVjdCBfY21zX2lvX2hhbmRsZXIqIGlvaGFuZGxlciwgY21zVUludDMyTnVtYmVyIG9mZnNldCk7Ci0gICAgY21zQm9vbCAgICAgICAgICAgKCogQ2xvc2UpKHN0cnVjdCBfY21zX2lvX2hhbmRsZXIqIGlvaGFuZGxlcik7Ci0gICAgY21zVUludDMyTnVtYmVyICAgKCogVGVsbCkoc3RydWN0IF9jbXNfaW9faGFuZGxlciogaW9oYW5kbGVyKTsKLSAgICBjbXNCb29sICAgICAgICAgICAoKiBXcml0ZSkoc3RydWN0IF9jbXNfaW9faGFuZGxlciogaW9oYW5kbGVyLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBCdWZmZXIpOwotfTsKLQotLy8gRW5kaWFuZXNzIGFkanVzdCBmdW5jdGlvbnMKLUNNU0FQSSBjbXNVSW50MTZOdW1iZXIgICBDTVNFWFBPUlQgIF9jbXNBZGp1c3RFbmRpYW5lc3MxNihjbXNVSW50MTZOdW1iZXIgV29yZCk7Ci1DTVNBUEkgY21zVUludDMyTnVtYmVyICAgQ01TRVhQT1JUICBfY21zQWRqdXN0RW5kaWFuZXNzMzIoY21zVUludDMyTnVtYmVyIFZhbHVlKTsKLUNNU0FQSSB2b2lkICAgICAgICAgICAgICBDTVNFWFBPUlQgIF9jbXNBZGp1c3RFbmRpYW5lc3M2NChjbXNVSW50NjROdW1iZXIqIFJlc3VsdCwgY21zVUludDY0TnVtYmVyKiBRV29yZCk7Ci0KLS8vIEhlbHBlciBJTyBmdW5jdGlvbnMKLUNNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgIF9jbXNSZWFkVUludDhOdW1iZXIoY21zSU9IQU5ETEVSKiBpbywgIGNtc1VJbnQ4TnVtYmVyKiBuKTsKLUNNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgIF9jbXNSZWFkVUludDE2TnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQxNk51bWJlciogbik7Ci1DTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUICBfY21zUmVhZFVJbnQzMk51bWJlcihjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG4pOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCAgX2Ntc1JlYWRGbG9hdDMyTnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNtc0Zsb2F0MzJOdW1iZXIqIG4pOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCAgX2Ntc1JlYWRVSW50NjROdW1iZXIoY21zSU9IQU5ETEVSKiBpbywgY21zVUludDY0TnVtYmVyKiBuKTsKLUNNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgIF9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNtc0Zsb2F0NjROdW1iZXIqIG4pOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCAgX2Ntc1JlYWRYWVpOdW1iZXIoY21zSU9IQU5ETEVSKiBpbywgY21zQ0lFWFlaKiBYWVopOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCAgX2Ntc1JlYWRVSW50MTZBcnJheShjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIgbiwgY21zVUludDE2TnVtYmVyKiBBcnJheSk7Ci0KLUNNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgIF9jbXNXcml0ZVVJbnQ4TnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQ4TnVtYmVyIG4pOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCAgX2Ntc1dyaXRlVUludDE2TnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQxNk51bWJlciBuKTsKLUNNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgIF9jbXNXcml0ZVVJbnQzMk51bWJlcihjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIgbik7Ci1DTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUICBfY21zV3JpdGVGbG9hdDMyTnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNtc0Zsb2F0MzJOdW1iZXIgbik7Ci1DTVNBUEkgY21zQm9vbCAgICAgICAgICAgQ01TRVhQT1JUICBfY21zV3JpdGVVSW50NjROdW1iZXIoY21zSU9IQU5ETEVSKiBpbywgY21zVUludDY0TnVtYmVyKiBuKTsKLUNNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgIF9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihjbXNJT0hBTkRMRVIqIGlvLCBjbXNGbG9hdDY0TnVtYmVyIG4pOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgIENNU0VYUE9SVCAgX2Ntc1dyaXRlWFlaTnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNvbnN0IGNtc0NJRVhZWiogWFlaKTsKLUNNU0FQSSBjbXNCb29sICAgICAgICAgICBDTVNFWFBPUlQgIF9jbXNXcml0ZVVJbnQxNkFycmF5KGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciBuLCBjb25zdCBjbXNVSW50MTZOdW1iZXIqIEFycmF5KTsKLQotLy8gSUNDIGJhc2UgdGFnCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY21zVGFnVHlwZVNpZ25hdHVyZSAgc2lnOwotICAgIGNtc0ludDhOdW1iZXIgICAgICAgIHJlc2VydmVkWzRdOwotCi19IF9jbXNUYWdCYXNlOwotCi0vLyBUeXBlIGJhc2UgaGVscGVyIGZ1bmN0aW9ucwotQ01TQVBJIGNtc1RhZ1R5cGVTaWduYXR1cmUgIENNU0VYUE9SVCBfY21zUmVhZFR5cGVCYXNlKGNtc0lPSEFORExFUiogaW8pOwotQ01TQVBJIGNtc0Jvb2wgICAgICAgICAgICAgIENNU0VYUE9SVCBfY21zV3JpdGVUeXBlQmFzZShjbXNJT0hBTkRMRVIqIGlvLCBjbXNUYWdUeXBlU2lnbmF0dXJlIHNpZyk7Ci0KLS8vIEFsaWdubWVudCBmdW5jdGlvbnMKLUNNU0FQSSBjbXNCb29sICAgICAgICAgICAgIENNU0VYUE9SVCBfY21zUmVhZEFsaWdubWVudChjbXNJT0hBTkRMRVIqIGlvKTsKLUNNU0FQSSBjbXNCb29sICAgICAgICAgICAgIENNU0VYUE9SVCBfY21zV3JpdGVBbGlnbm1lbnQoY21zSU9IQU5ETEVSKiBpbyk7Ci0KLS8vIFRvIGRlYWwgd2l0aCB0ZXh0IHN0cmVhbXMuIDJLIGF0IG1vc3QKLUNNU0FQSSBjbXNCb29sICAgICAgICAgICAgIENNU0VYUE9SVCBfY21zSU9QcmludGYoY21zSU9IQU5ETEVSKiBpbywgY29uc3QgY2hhciogZnJtLCAuLi4pOwotCi0vLyBGaXhlZCBwb2ludCBoZWxwZXIgZnVuY3Rpb25zCi1DTVNBUEkgY21zRmxvYXQ2NE51bWJlciAgICBDTVNFWFBPUlQgX2NtczhGaXhlZDh0b0RvdWJsZShjbXNVSW50MTZOdW1iZXIgZml4ZWQ4KTsKLUNNU0FQSSBjbXNVSW50MTZOdW1iZXIgICAgIENNU0VYUE9SVCBfY21zRG91YmxlVG84Rml4ZWQ4KGNtc0Zsb2F0NjROdW1iZXIgdmFsKTsKLQotQ01TQVBJIGNtc0Zsb2F0NjROdW1iZXIgICAgQ01TRVhQT1JUIF9jbXMxNUZpeGVkMTZ0b0RvdWJsZShjbXNTMTVGaXhlZDE2TnVtYmVyIGZpeDMyKTsKLUNNU0FQSSBjbXNTMTVGaXhlZDE2TnVtYmVyIENNU0VYUE9SVCBfY21zRG91YmxlVG8xNUZpeGVkMTYoY21zRmxvYXQ2NE51bWJlciB2KTsKLQotLy8gRGF0ZS90aW1lIGhlbHBlciBmdW5jdGlvbnMKLUNNU0FQSSB2b2lkICAgICAgICAgICAgICAgIENNU0VYUE9SVCBfY21zRW5jb2RlRGF0ZVRpbWVOdW1iZXIoY21zRGF0ZVRpbWVOdW1iZXIgKkRlc3QsIGNvbnN0IHN0cnVjdCB0bSAqU291cmNlKTsKLUNNU0FQSSB2b2lkICAgICAgICAgICAgICAgIENNU0VYUE9SVCBfY21zRGVjb2RlRGF0ZVRpbWVOdW1iZXIoY29uc3QgY21zRGF0ZVRpbWVOdW1iZXIgKlNvdXJjZSwgc3RydWN0IHRtICpEZXN0KTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFNoYXJlZCBjYWxsYmFja3MgZm9yIHVzZXIgZGF0YQotdHlwZWRlZiB2b2lkICAgICAoKiBfY21zRnJlZVVzZXJEYXRhRm4pKGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBEYXRhKTsKLXR5cGVkZWYgdm9pZCogICAgKCogX2Ntc0R1cFVzZXJEYXRhRm4pKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCB2b2lkKiBEYXRhKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFBsdWctaW4gZm91bmRhdGlvbgotI2RlZmluZSBjbXNQbHVnaW5NYWdpY051bWJlciAgICAgICAgICAgICAgICAgMHg2MTYzNzA3MCAgICAgLy8gJ2FjcHAnCi0KLSNkZWZpbmUgY21zUGx1Z2luTWVtSGFuZGxlclNpZyAgICAgICAgICAgICAgIDB4NkQ2NTZENDggICAgIC8vICdtZW1IJwotI2RlZmluZSBjbXNQbHVnaW5JbnRlcnBvbGF0aW9uU2lnICAgICAgICAgICAgMHg2OTZFNzA0OCAgICAgLy8gJ2lucEgnCi0jZGVmaW5lIGNtc1BsdWdpblBhcmFtZXRyaWNDdXJ2ZVNpZyAgICAgICAgICAweDcwNjE3MjQ4ICAgICAvLyAncGFySCcKLSNkZWZpbmUgY21zUGx1Z2luRm9ybWF0dGVyc1NpZyAgICAgICAgICAgICAgIDB4NjY3MjZENDggICAgIC8vICdmcm1ICi0jZGVmaW5lIGNtc1BsdWdpblRhZ1R5cGVTaWcgICAgICAgICAgICAgICAgICAweDc0Nzk3MDQ4ICAgICAvLyAndHlwSCcKLSNkZWZpbmUgY21zUGx1Z2luVGFnU2lnICAgICAgICAgICAgICAgICAgICAgIDB4NzQ2MTY3NDggICAgIC8vICd0YWdIJwotI2RlZmluZSBjbXNQbHVnaW5SZW5kZXJpbmdJbnRlbnRTaWcgICAgICAgICAgMHg2OTZFNzQ0OCAgICAgLy8gJ2ludEgnCi0jZGVmaW5lIGNtc1BsdWdpbk11bHRpUHJvY2Vzc0VsZW1lbnRTaWcgICAgICAweDZENzA2NTQ4ICAgICAvLyAnbXBlSCcKLSNkZWZpbmUgY21zUGx1Z2luT3B0aW1pemF0aW9uU2lnICAgICAgICAgICAgIDB4NkY3MDc0NDggICAgIC8vICdvcHRIJwotI2RlZmluZSBjbXNQbHVnaW5UcmFuc2Zvcm1TaWcgICAgICAgICAgICAgICAgMHg3QTY2NkQ0OCAgICAgLy8gJ3hmbUgnCi0jZGVmaW5lIGNtc1BsdWdpbk11dGV4U2lnICAgICAgICAgICAgICAgICAgICAweDZENzQ3QTQ4ICAgICAvLyAnbXR4SCcKLQotdHlwZWRlZiBzdHJ1Y3QgX2Ntc1BsdWdpbkJhc2VTdHJ1Y3QgewotCi0gICAgICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgICAgICAgICBNYWdpYzsgICAgICAgICAgICAgICAvLyAnYWNwcCcgc2lnbmF0dXJlCi0gICAgICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgICAgICAgICBFeHBlY3RlZFZlcnNpb247ICAgICAvLyBFeHBlY3RlZCB2ZXJzaW9uIG9mIExpdHRsZUNNUwotICAgICAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgICAgICAgICAgVHlwZTsgICAgICAgICAgICAgICAgLy8gVHlwZSBvZiBwbHVnLWluCi0gICAgICAgIHN0cnVjdCBfY21zUGx1Z2luQmFzZVN0cnVjdCogICBOZXh0OyAgICAgICAgICAgICAgICAvLyBGb3IgbXVsdGlwbGUgcGx1Z2luIGRlZmluaXRpb24uIE5VTEwgZm9yIGVuZCBvZiBsaXN0LgotCi19IGNtc1BsdWdpbkJhc2U7Ci0KLS8vIE1heGltdW0gbnVtYmVyIG9mIHR5cGVzIGluIGEgcGx1Z2luIGFycmF5Ci0jZGVmaW5lIE1BWF9UWVBFU19JTl9MQ01TX1BMVUdJTiAgICAyMAotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gTWVtb3J5IGhhbmRsZXIuIEVhY2ggbmV3IHBsdWctaW4gdHlwZSByZXBsYWNlcyBjdXJyZW50IGJlaGF2aW91cgotCi10eXBlZGVmIHZvaWQqICgqIF9jbXNNYWxsb2NGblB0clR5cGUpKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgc2l6ZSk7IAotdHlwZWRlZiB2b2lkICAoKiBfY21zRnJlZUZuUHRyVHlwZSkoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQgKlB0cik7Ci10eXBlZGVmIHZvaWQqICgqIF9jbXNSZWFsbG9jRm5QdHJUeXBlKShjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgTmV3U2l6ZSk7Ci0KLXR5cGVkZWYgdm9pZCogKCogX2Ntc01hbGxvWmVyb2NGblB0clR5cGUpKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgc2l6ZSk7IAotdHlwZWRlZiB2b2lkKiAoKiBfY21zQ2FsbG9jRm5QdHJUeXBlKShjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIG51bSwgY21zVUludDMyTnVtYmVyIHNpemUpOwotdHlwZWRlZiB2b2lkKiAoKiBfY21zRHVwRm5QdHJUeXBlKShjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3Qgdm9pZCogT3JnLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSk7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQotICAgICAgICBjbXNQbHVnaW5CYXNlIGJhc2U7Ci0KLSAgICAgICAgLy8gUmVxdWlyZWQKLSAgICAgICAgX2Ntc01hbGxvY0ZuUHRyVHlwZSAgTWFsbG9jUHRyOwotICAgICAgICBfY21zRnJlZUZuUHRyVHlwZSAgICBGcmVlUHRyOwotICAgICAgICBfY21zUmVhbGxvY0ZuUHRyVHlwZSBSZWFsbG9jUHRyOwotCi0gICAgICAgIC8vIE9wdGlvbmFsCi0gICAgICAgX2Ntc01hbGxvWmVyb2NGblB0clR5cGUgTWFsbG9jWmVyb1B0cjsKLSAgICAgICBfY21zQ2FsbG9jRm5QdHJUeXBlICAgICBDYWxsb2NQdHI7Ci0gICAgICAgX2Ntc0R1cEZuUHRyVHlwZSAgICAgICAgRHVwUHRyOwotCi19IGNtc1BsdWdpbk1lbUhhbmRsZXI7Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEludGVycG9sYXRpb24uIDE2IGJpdHMgYW5kIGZsb2F0aW5nIHBvaW50IHZlcnNpb25zLgotc3RydWN0IF9jbXNfaW50ZXJwX3N0cnVjOwotCi0vLyBJbnRlcnBvbGF0aW9uIGNhbGxiYWNrcwotCi0vLyAxNiBiaXRzIGZvcndhcmQgaW50ZXJwb2xhdGlvbi4gVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBwcmVjaXNpb24tbGltaXRlZCBsaW5lYXIgaW50ZXJwb2xhdGlvbgotLy8gYW5kIGlzIHN1cHBvc2VkIHRvIGJlIHF1aXRlIGZhc3QuIEltcGxlbWVudGF0aW9uIG1heSBiZSB0ZXRyYWhlZHJhbCBvciB0cmlsaW5lYXIsIGFuZCBwbHVnLWlucyBtYXkKLS8vIGNob29zZSB0byBpbXBsZW1lbnQgYW55IG90aGVyIGludGVycG9sYXRpb24gYWxnb3JpdGhtLgotdHlwZWRlZiB2b2lkICgqIF9jbXNJbnRlcnBGbjE2KShyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5wdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIE91dHB1dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjb25zdCBzdHJ1Y3QgX2Ntc19pbnRlcnBfc3RydWMqIHApOwotCi0vLyBGbG9hdGluZyBwb2ludCBmb3J3YXJkIGludGVycG9sYXRpb24uIEZ1bGwgcHJlY2lzaW9uIGludGVycG9sYXRpb24gdXNpbmcgZmxvYXRzLiBUaGlzIGlzIG5vdCBhCi0vLyB0aW1lIGNyaXRpY2FsIGZ1bmN0aW9uLiBJbXBsZW1lbnRhdGlvbiBtYXkgYmUgdGV0cmFoZWRyYWwgb3IgdHJpbGluZWFyLCBhbmQgcGx1Zy1pbnMgbWF5Ci0vLyBjaG9vc2UgdG8gaW1wbGVtZW50IGFueSBvdGhlciBpbnRlcnBvbGF0aW9uIGFsZ29yaXRobS4KLXR5cGVkZWYgdm9pZCAoKiBfY21zSW50ZXJwRm5GbG9hdCkoY21zRmxvYXQzMk51bWJlciBjb25zdCBJbnB1dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIE91dHB1dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc19pbnRlcnBfc3RydWMqIHApOwotCi0KLQotLy8gVGhpcyB0eXBlIGhvbGRzIGEgcG9pbnRlciB0byBhbiBpbnRlcnBvbGF0b3IgdGhhdCBjYW4gYmUgZWl0aGVyIDE2IGJpdHMgb3IgZmxvYXQKLXR5cGVkZWYgdW5pb24gewotICAgIF9jbXNJbnRlcnBGbjE2ICAgICAgIExlcnAxNjsgICAgICAgICAgICAvLyBGb3J3YXJkIGludGVycG9sYXRpb24gaW4gMTYgYml0cwotICAgIF9jbXNJbnRlcnBGbkZsb2F0ICAgIExlcnBGbG9hdDsgICAgICAgICAvLyBGb3J3YXJkIGludGVycG9sYXRpb24gaW4gZmxvYXRpbmcgcG9pbnQKLX0gY21zSW50ZXJwRnVuY3Rpb247Ci0KLS8vIEZsYWdzIGZvciBpbnRlcnBvbGF0b3Igc2VsZWN0aW9uCi0jZGVmaW5lIENNU19MRVJQX0ZMQUdTXzE2QklUUyAgICAgICAgICAgICAweDAwMDAgICAgICAgIC8vIFRoZSBkZWZhdWx0Ci0jZGVmaW5lIENNU19MRVJQX0ZMQUdTX0ZMT0FUICAgICAgICAgICAgICAweDAwMDEgICAgICAgIC8vIFJlcXVpcmVzIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbgotI2RlZmluZSBDTVNfTEVSUF9GTEFHU19UUklMSU5FQVIgICAgICAgICAgMHgwMTAwICAgICAgICAvLyBIaW50IG9ubHkKLQotCi0jZGVmaW5lIE1BWF9JTlBVVF9ESU1FTlNJT05TIDgKLQotdHlwZWRlZiBzdHJ1Y3QgX2Ntc19pbnRlcnBfc3RydWMgeyAgLy8gVXNlZCBvbiBhbGwgaW50ZXJwb2xhdGlvbnMuIFN1cHBsaWVkIGJ5IGxjbXMyIHdoZW4gY2FsbGluZyB0aGUgaW50ZXJwb2xhdGlvbiBmdW5jdGlvbgotCi0gICAgY21zQ29udGV4dCBDb250ZXh0SUQ7ICAgICAvLyBUaGUgY2FsbGluZyB0aHJlYWQKLQotICAgIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzOyAgLy8gS2VlcCBvcmlnaW5hbCBmbGFncwotICAgIGNtc1VJbnQzMk51bWJlciBuSW5wdXRzOyAgLy8gIT0gMSBvbmx5IGluIDNEIGludGVycG9sYXRpb24KLSAgICBjbXNVSW50MzJOdW1iZXIgbk91dHB1dHM7IC8vICE9IDEgb25seSBpbiAzRCBpbnRlcnBvbGF0aW9uCi0KLSAgICBjbXNVSW50MzJOdW1iZXIgblNhbXBsZXNbTUFYX0lOUFVUX0RJTUVOU0lPTlNdOyAgLy8gVmFsaWQgb24gYWxsIGtpbmRzIG9mIHRhYmxlcwotICAgIGNtc1VJbnQzMk51bWJlciBEb21haW5bTUFYX0lOUFVUX0RJTUVOU0lPTlNdOyAgICAvLyBEb21haW4gPSBuU2FtcGxlcyAtIDEKLQotICAgIGNtc1VJbnQzMk51bWJlciBvcHRhW01BWF9JTlBVVF9ESU1FTlNJT05TXTsgICAgIC8vIE9wdGltaXphdGlvbiBmb3IgM0QgQ0xVVC4gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIG5vZGVzIHByZW11bHRpcGxpZWQgZm9yIGVhY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaW1lbnNpb24uIEZvciBleGFtcGxlLCBpbiA3IG5vZGVzLCA3LCA3XjIgLCA3XjMsIDdeNCwgZXRjLiBPbiBub24tcmVndWxhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbXBsaW5ncyBtYXkgdmFyeSBhY2NvcmRpbmcgb2YgdGhlIG51bWJlciBvZiBub2RlcyBmb3IgZWFjaCBkaW1lbnNpb24uCi0KLSAgICBjb25zdCB2b2lkICpUYWJsZTsgICAgICAgICAgICAgICAgLy8gUG9pbnRzIHRvIHRoZSBhY3R1YWwgaW50ZXJwb2xhdGlvbiB0YWJsZQotICAgIGNtc0ludGVycEZ1bmN0aW9uIEludGVycG9sYXRpb247ICAvLyBQb2ludHMgdG8gdGhlIGZ1bmN0aW9uIHRvIGRvIHRoZSBpbnRlcnBvbGF0aW9uCi0KLSB9IGNtc0ludGVycFBhcmFtczsKLQotLy8gSW50ZXJwb2xhdG9ycyBmYWN0b3J5Ci10eXBlZGVmIGNtc0ludGVycEZ1bmN0aW9uICgqIGNtc0ludGVycEZuRmFjdG9yeSkoY21zVUludDMyTnVtYmVyIG5JbnB1dENoYW5uZWxzLCBjbXNVSW50MzJOdW1iZXIgbk91dHB1dENoYW5uZWxzLCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncyk7Ci0KLS8vIFRoZSBwbHVnLWluCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY21zUGx1Z2luQmFzZSBiYXNlOwotCi0gICAgLy8gUG9pbnRzIHRvIGEgdXNlci1zdXBwbGllZCBmdW5jdGlvbiB3aGljaCBpbXBsZW1lbnRzIHRoZSBmYWN0b3J5Ci0gICAgY21zSW50ZXJwRm5GYWN0b3J5IEludGVycG9sYXRvcnNGYWN0b3J5OwotCi19IGNtc1BsdWdpbkludGVycG9sYXRpb247Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBQYXJhbWV0cmljIGN1cnZlcy4gQSBuZWdhdGl2ZSB0eXBlIG1lYW5zIHNhbWUgZnVuY3Rpb24gYnV0IGFuYWx5dGljYWxseSBpbnZlcnRlZC4gTWF4LiBudW1iZXIgb2YgcGFyYW1zIGlzIDEwCi0KLS8vIEV2YWx1YXRvciBjYWxsYmFjayBmb3IgdXNlci1zdXBsaWVkIHBhcmFtZXRyaWMgY3VydmVzLiBNYXkgaW1wbGVtZW50IG1vcmUgdGhhbiBvbmUgdHlwZQotdHlwZWRlZiAgY21zRmxvYXQ2NE51bWJlciAoKiBjbXNQYXJhbWV0cmljQ3VydmVFdmFsdWF0b3IpKGNtc0ludDMyTnVtYmVyIFR5cGUsIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIgUGFyYW1zWzEwXSwgY21zRmxvYXQ2NE51bWJlciBSKTsKLQotLy8gUGx1Zy1pbiBtYXkgaW1wbGVtZW50IGFuIGFyYml0cmFyeSBudW1iZXIgb2YgcGFyYW1ldHJpYyBjdXJ2ZXMKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjbXNQbHVnaW5CYXNlIGJhc2U7Ci0KLSAgICBjbXNVSW50MzJOdW1iZXIgbkZ1bmN0aW9uczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIHN1cHBvcnRlZCBmdW5jdGlvbnMKLSAgICBjbXNVSW50MzJOdW1iZXIgRnVuY3Rpb25UeXBlc1tNQVhfVFlQRVNfSU5fTENNU19QTFVHSU5dOyAgICAgICAgLy8gVGhlIGlkZW50aWZpY2F0aW9uIHR5cGVzCi0gICAgY21zVUludDMyTnVtYmVyIFBhcmFtZXRlckNvdW50W01BWF9UWVBFU19JTl9MQ01TX1BMVUdJTl07ICAgICAgIC8vIE51bWJlciBvZiBwYXJhbWV0ZXJzIGZvciBlYWNoIGZ1bmN0aW9uCi0KLSAgICBjbXNQYXJhbWV0cmljQ3VydmVFdmFsdWF0b3IgICAgRXZhbHVhdG9yOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGV2YWx1YXRvcgotCi19IGNtc1BsdWdpblBhcmFtZXRyaWNDdXJ2ZXM7Ci0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRm9ybWF0dGVycy4gVGhpcyBwbHVnLWluIGFkZHMgbmV3IGhhbmRsZXJzLCByZXBsYWNpbmcgdGhlbSBpZiB0aGV5IGFscmVhZHkgZXhpc3QuIEZvcm1hdHRlcnMgZGVhbGluZyB3aXRoCi0vLyBjbXNGbG9hdDMyTnVtYmVyIChicHMgPSA0KSBvciBkb3VibGUgKGJwcyA9IDApIHR5cGVzIGFyZSByZXF1ZXN0ZWQgdmlhIEZvcm1hdHRlckZsb2F0IGNhbGxiYWNrLiBPdGhlcnMgY29tZSBhY3Jvc3MKLS8vIEZvcm1hdHRlcjE2IGNhbGxiYWNrCi0KLXN0cnVjdCBfY21zdHJhbnNmb3JtX3N0cnVjdDsKLQotdHlwZWRlZiBjbXNVSW50OE51bWJlciogKCogY21zRm9ybWF0dGVyMTYpKHJlZ2lzdGVyIHN0cnVjdCBfY21zdHJhbnNmb3JtX3N0cnVjdCogQ01NY2FyZ28sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIFZhbHVlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiAgQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciAgU3RyaWRlKTsKLQotdHlwZWRlZiBjbXNVSW50OE51bWJlciogKCogY21zRm9ybWF0dGVyRmxvYXQpKHN0cnVjdCBfY21zdHJhbnNmb3JtX3N0cnVjdCogQ01NY2FyZ28sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciBWYWx1ZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50OE51bWJlciogIEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgIFN0cmlkZSk7Ci0KLS8vIFRoaXMgdHlwZSBob2xkcyBhIHBvaW50ZXIgdG8gYSBmb3JtYXR0ZXIgdGhhdCBjYW4gYmUgZWl0aGVyIDE2IGJpdHMgb3IgY21zRmxvYXQzMk51bWJlcgotdHlwZWRlZiB1bmlvbiB7Ci0gICAgY21zRm9ybWF0dGVyMTYgICAgRm10MTY7Ci0gICAgY21zRm9ybWF0dGVyRmxvYXQgRm10RmxvYXQ7Ci0KLX0gY21zRm9ybWF0dGVyOwotCi0jZGVmaW5lIENNU19QQUNLX0ZMQUdTXzE2QklUUyAgICAgICAweDAwMDAKLSNkZWZpbmUgQ01TX1BBQ0tfRkxBR1NfRkxPQVQgICAgICAgIDB4MDAwMQotCi10eXBlZGVmIGVudW0geyBjbXNGb3JtYXR0ZXJJbnB1dD0wLCBjbXNGb3JtYXR0ZXJPdXRwdXQ9MSB9IGNtc0Zvcm1hdHRlckRpcmVjdGlvbjsKLQotdHlwZWRlZiBjbXNGb3JtYXR0ZXIgKCogY21zRm9ybWF0dGVyRmFjdG9yeSkoY21zVUludDMyTnVtYmVyIFR5cGUsICAgICAgICAgICAvLyBTcGVjaWZpYyB0eXBlLCBpLmUuIFRZUEVfUkdCXzgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zvcm1hdHRlckRpcmVjdGlvbiBEaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncyk7ICAgICAgLy8gcHJlY2lzaW9uCi0KLS8vIFBsdWctaW4gbWF5IGltcGxlbWVudCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGZvcm1hdHRlcnMKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjbXNQbHVnaW5CYXNlICAgICAgICAgIGJhc2U7Ci0gICAgY21zRm9ybWF0dGVyRmFjdG9yeSAgICBGb3JtYXR0ZXJzRmFjdG9yeTsKLQotfSBjbXNQbHVnaW5Gb3JtYXR0ZXJzOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gVGFnIHR5cGUgaGFuZGxlci4gRWFjaCB0eXBlIGlzIGZyZWUgdG8gcmV0dXJuIGFueXRoaW5nIGl0IHdhbnRzLCBhbmQgaXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0bwotLy8ga25vdyBpbiBhZHZhbmNlIHdoYXQgaXMgdGhlIHR5cGUgY29udGFpbmVkIGluIHRoZSB0YWcuCi10eXBlZGVmIHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCB7Ci0KLSAgICAgICAgY21zVGFnVHlwZVNpZ25hdHVyZSBTaWduYXR1cmU7ICAgICAvLyBUaGUgc2lnbmF0dXJlIG9mIHRoZSB0eXBlCi0KLSAgICAgICAgLy8gQWxsb2NhdGVzIGFuZCByZWFkcyBpdGVtcwotICAgICAgICB2b2lkICogICAoKiBSZWFkUHRyKShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0lPSEFORExFUiogICAgICBpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyKiAgIG5JdGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgIFNpemVPZlRhZyk7Ci0KLSAgICAgICAgLy8gV3JpdGVzIG4gSXRlbXMKLSAgICAgICAgY21zQm9vbCAgKCogV3JpdGVQdHIpKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0lPSEFORExFUiogICAgIGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgbkl0ZW1zKTsKLQotICAgICAgICAvLyBEdXBsaWNhdGUgYW4gaXRlbSBvciBhcnJheSBvZiBpdGVtcwotICAgICAgICB2b2lkKiAgICgqIER1cFB0cikoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG4pOwotCi0gICAgICAgIC8vIEZyZWUgYWxsIHJlc291cmNlcwotICAgICAgICB2b2lkICAgICgqIEZyZWVQdHIpKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpQdHIpOwotCi0gICAgICAgIC8vIEFkZGl0aW9uYWwgcGFyYW1ldGVycyB1c2VkIGJ5IHRoZSBjYWxsaW5nIHRocmVhZAotICAgICAgICBjbXNDb250ZXh0ICAgICAgIENvbnRleHRJRDsKLSAgICAgICAgY21zVUludDMyTnVtYmVyICBJQ0NWZXJzaW9uOwotCi19IGNtc1RhZ1R5cGVIYW5kbGVyOwotCi0vLyBFYWNoIHBsdWctaW4gaW1wbGVtZW50cyBhIHNpbmdsZSB0eXBlCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIGNtc1BsdWdpbkJhc2UgICAgICBiYXNlOwotICAgICAgICBjbXNUYWdUeXBlSGFuZGxlciAgSGFuZGxlcjsKLQotfSBjbXNQbHVnaW5UYWdUeXBlOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gVGhpcyBpcyB0aGUgdGFnIHBsdWdpbiwgd2hpY2ggaWRlbnRpZmllcyB0YWdzLiBGb3Igd3JpdGluZywgYSBwb2ludGVyIHRvIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLgotLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRoZSBkZXNpcmVkIHR5cGUgZm9yIHRoaXMgdGFnLCBnaXZlbiB0aGUgdmVyc2lvbiBvZiBwcm9maWxlCi0vLyBhbmQgdGhlIGRhdGEgYmVpbmcgc2VyaWFsaXplZC4KLXR5cGVkZWYgc3RydWN0IHsKLQotICAgIGNtc1VJbnQzMk51bWJlciAgICAgRWxlbUNvdW50OyAgICAgICAgICAvLyBJZiB0aGlzIHRhZyBuZWVkcyBhbiBhcnJheSwgaG93IG1hbnkgZWxlbWVudHMgc2hvdWxkIGtlZXAKLQotICAgIC8vIEZvciByZWFkaW5nLgotICAgIGNtc1VJbnQzMk51bWJlciAgICAgblN1cHBvcnRlZFR5cGVzOyAgICAvLyBJbiBob3cgbWFueSB0eXBlcyB0aGlzIHRhZyBjYW4gY29tZSAoTUFYX1RZUEVTX0lOX0xDTVNfUExVR0lOIG1heGltdW0pCi0gICAgY21zVGFnVHlwZVNpZ25hdHVyZSBTdXBwb3J0ZWRUeXBlc1tNQVhfVFlQRVNfSU5fTENNU19QTFVHSU5dOwotCi0gICAgLy8gRm9yIHdyaXR0aW5nCi0gICAgY21zVGFnVHlwZVNpZ25hdHVyZSAoKiBEZWNpZGVUeXBlKShjbXNGbG9hdDY0TnVtYmVyIElDQ1ZlcnNpb24sIGNvbnN0IHZvaWQgKkRhdGEpOwotCi19IGNtc1RhZ0Rlc2NyaXB0b3I7Ci0KLS8vIFBsdWctaW4gaW1wbGVtZW50cyBhIHNpbmdsZSB0YWcKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjbXNQbHVnaW5CYXNlICAgIGJhc2U7Ci0KLSAgICBjbXNUYWdTaWduYXR1cmUgIFNpZ25hdHVyZTsKLSAgICBjbXNUYWdEZXNjcmlwdG9yIERlc2NyaXB0b3I7Ci0KLX0gY21zUGx1Z2luVGFnOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gQ3VzdG9tIGludGVudHMuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGpvaW4gYWxsIHByb2ZpbGVzIHNwZWNpZmllZCBpbiB0aGUgYXJyYXkgaW4KLS8vIGEgc2luZ2xlIExVVC4gQW55IGN1c3RvbSBpbnRlbnQgaW4gdGhlIGNoYWluIHJlZGlyZWN0cyB0byBjdXN0b20gZnVuY3Rpb24uIElmIG1vcmUgdGhhbgotLy8gb25lIGN1c3RvbSBpbnRlbnQgaXMgZm91bmQsIHRoZSBvbmUgbG9jYXRlZCBmaXJzdCBpcyBpbnZva2VkLiBVc3VhbGx5IHVzZXJzIHNob3VsZCB1c2Ugb25seSBvbmUKLS8vIGN1c3RvbSBpbnRlbnQsIHNvIG1peGluZyBjdXN0b20gaW50ZW50cyBpbiBzYW1lIG11bHRpcHJvZmlsZSB0cmFuc2Zvcm0gaXMgbm90IHN1cHBvcnRlZC4KLQotdHlwZWRlZiBjbXNQaXBlbGluZSogKCogY21zSW50ZW50Rm4pKCBjbXNDb250ZXh0ICAgICAgIENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICBuUHJvZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgSW50ZW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSAgICAgIGhQcm9maWxlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNCb29sICAgICAgICAgIEJQQ1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEFkYXB0YXRpb25TdGF0ZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICBkd0ZsYWdzKTsKLQotCi0vLyBFYWNoIHBsdWctaW4gZGVmaW5lcyBhIHNpbmdsZSBpbnRlbnQgbnVtYmVyLgotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNtc1BsdWdpbkJhc2UgICAgIGJhc2U7Ci0gICAgY21zVUludDMyTnVtYmVyICAgSW50ZW50OwotICAgIGNtc0ludGVudEZuICAgICAgIExpbms7Ci0gICAgY2hhciAgICAgICAgICAgICAgRGVzY3JpcHRpb25bMjU2XTsKLQotfSBjbXNQbHVnaW5SZW5kZXJpbmdJbnRlbnQ7Ci0KLQotLy8gVGhlIGRlZmF1bHQgSUNDIGludGVudHMgKHBlcmNlcHR1YWwsIHNhdHVyYXRpb24sIHJlbC5jb2wgYW5kIGFicy5jb2wpCi1DTVNBUEkgY21zUGlwZWxpbmUqICBDTVNFWFBPUlQgX2Ntc0RlZmF1bHRJQ0NpbnRlbnRzKGNtc0NvbnRleHQgICAgICAgQ29udGV4dElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgIG5Qcm9maWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICBJbnRlbnRzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFICAgICAgaFByb2ZpbGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Jvb2wgICAgICAgICAgQlBDW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgQWRhcHRhdGlvblN0YXRlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgIGR3RmxhZ3MpOwotCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBQaXBlbGluZXMsIE11bHRpIFByb2Nlc3MgRWxlbWVudHMuCi0KLXR5cGVkZWYgdm9pZCAoKiBfY21zU3RhZ2VFdmFsRm4pICAgICAoY29uc3QgY21zRmxvYXQzMk51bWJlciBJbltdLCBjbXNGbG9hdDMyTnVtYmVyIE91dFtdLCBjb25zdCBjbXNTdGFnZSogbXBlKTsKLXR5cGVkZWYgdm9pZCooKiBfY21zU3RhZ2VEdXBFbGVtRm4pICAoY21zU3RhZ2UqIG1wZSk7Ci10eXBlZGVmIHZvaWQgKCogX2Ntc1N0YWdlRnJlZUVsZW1GbikgKGNtc1N0YWdlKiBtcGUpOwotCi0KLS8vIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGEgZ2VuZXJpYyBNUEUKLUNNU0FQSSBjbXNTdGFnZSogQ01TRVhQT1JUIF9jbXNTdGFnZUFsbG9jUGxhY2Vob2xkZXIoY21zQ29udGV4dCBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1N0YWdlU2lnbmF0dXJlICAgICBUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgSW5wdXRDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgIE91dHB1dENoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY21zU3RhZ2VFdmFsRm4gICAgICAgRXZhbFB0ciwgICAgICAgICAgICAvLyBQb2ludHMgdG8gZm4gdGhhdCBldmFsdWF0ZXMgdGhlIGVsZW1lbnQgKGFsd2F5cyBpbiBmbG9hdGluZyBwb2ludCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Ntc1N0YWdlRHVwRWxlbUZuICAgIER1cEVsZW1QdHIsICAgICAgICAgLy8gUG9pbnRzIHRvIGEgZm4gdGhhdCBkdXBsaWNhdGVzIHRoZSBzdGFnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY21zU3RhZ2VGcmVlRWxlbUZuICAgRnJlZVB0ciwgICAgICAgICAgICAvLyBQb2ludHMgdG8gYSBmbiB0aGF0IHNldHMgdGhlIGVsZW1lbnQgZnJlZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgRGF0YSk7ICAgICAgICAgICAgICAvLyBBIGdlbmVyaWMgcG9pbnRlciB0byB3aGF0ZXZlciBtZW1vcnkgbmVlZGVkIGJ5IHRoZSBlbGVtZW50Ci10eXBlZGVmIHN0cnVjdCB7Ci0gICAgICBjbXNQbHVnaW5CYXNlICAgICBiYXNlOwotICAgICAgY21zVGFnVHlwZUhhbmRsZXIgSGFuZGxlcjsKLQotfSAgY21zUGx1Z2luTXVsdGlQcm9jZXNzRWxlbWVudDsKLQotCi0vLyBEYXRhIGtlcHQgaW4gIkVsZW1lbnQiIG1lbWJlciBvZiBjbXNTdGFnZQotCi0vLyBDdXJ2ZXMKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjbXNVSW50MzJOdW1iZXIgbkN1cnZlczsKLSAgICBjbXNUb25lQ3VydmUqKiAgVGhlQ3VydmVzOwotCi19IF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhOwotCi0vLyBNYXRyaXgKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjbXNGbG9hdDY0TnVtYmVyKiAgRG91YmxlOyAgICAgICAgICAvLyBmbG9hdGluZyBwb2ludCBmb3IgdGhlIG1hdHJpeAotICAgIGNtc0Zsb2F0NjROdW1iZXIqICBPZmZzZXQ7ICAgICAgICAgIC8vIFRoZSBvZmZzZXQKLQotfSBfY21zU3RhZ2VNYXRyaXhEYXRhOwotCi0vLyBDTFVUCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICB1bmlvbiB7ICAgICAgICAgICAgICAgICAgICAgICAvLyBDYW4gaGF2ZSBvbmx5IG9uZSBvZiBib3RoIHJlcHJlc2VudGF0aW9ucyBhdCBzYW1lIHRpbWUKLSAgICAgICAgY21zVUludDE2TnVtYmVyKiAgVDsgICAgICAvLyBQb2ludHMgdG8gdGhlIHRhYmxlIDE2IGJpdHMgdGFibGUKLSAgICAgICAgY21zRmxvYXQzMk51bWJlciogVEZsb2F0OyAvLyBQb2ludHMgdG8gdGhlIGNtc0Zsb2F0MzJOdW1iZXIgdGFibGUKLQotICAgIH0gVGFiOwotCi0gICAgY21zSW50ZXJwUGFyYW1zKiBQYXJhbXM7Ci0gICAgY21zVUludDMyTnVtYmVyICBuRW50cmllczsKLSAgICBjbXNCb29sICAgICAgICAgIEhhc0Zsb2F0VmFsdWVzOwotCi19IF9jbXNTdGFnZUNMdXREYXRhOwotCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gT3B0aW1pemF0aW9uLiBVc2luZyB0aGlzIHBsdWctaW4sIGFkZGl0aW9uYWwgb3B0aW1pemF0aW9uIHN0cmF0ZWdpZXMgbWF5IGJlIGltcGxlbWVudGVkLgotLy8gVGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gVFJVRSBpZiBhbnkgb3B0aW1pemF0aW9uIGlzIGRvbmUgb24gdGhlIExVVCwgdGhpcyB0ZXJtaW5hdGVzCi0vLyB0aGUgb3B0aW1pemF0aW9uICBzZWFyY2guIE9yIEZBTFNFIGlmIGl0IGlzIHVuYWJsZSB0byBvcHRpbWl6ZSBhbmQgd2FudCB0byBnaXZlIGEgY2hhbmNlCi0vLyB0byB0aGUgcmVzdCBvZiBvcHRpbWl6ZXJzLgotCi10eXBlZGVmIHZvaWQgICAgICgqIF9jbXNPUFRldmFsMTZGbikocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIEluW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIE91dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNvbnN0IHZvaWQqIERhdGEpOwotCi0KLXR5cGVkZWYgY21zQm9vbCAgKCogX2Ntc09QVG9wdGltaXplRm4pKGNtc1BpcGVsaW5lKiogTHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICBJbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIqIElucHV0Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyKiBPdXRwdXRGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIqIGR3RmxhZ3MpOwotCi0vLyBUaGlzIGZ1bmN0aW9uIG1heSBiZSB1c2VkIHRvIHNldCB0aGUgb3B0aW9uYWwgZXZhbHVhdG9yIGFuZCBhIGJsb2NrIG9mIHByaXZhdGUgZGF0YS4gSWYgcHJpdmF0ZSBkYXRhIGlzIGJlaW5nIHVzZWQsIGFuIG9wdGlvbmFsCi0vLyBkdXBsaWNhdG9yIGFuZCBmcmVlIGZ1bmN0aW9ucyBzaG91bGQgYWxzbyBiZSBzcGVjaWZpZWQgaW4gb3JkZXIgdG8gZHVwbGljYXRlIHRoZSBMVVQgY29uc3RydWN0LiBVc2UgTlVMTCB0byBpbmhpYml0IHN1Y2ggZnVuY3Rpb25hbGl0eS4KLQotQ01TQVBJIHZvaWQgQ01TRVhQT1JUIF9jbXNQaXBlbGluZVNldE9wdGltaXphdGlvblBhcmFtZXRlcnMoY21zUGlwZWxpbmUqIEx1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Ntc09QVGV2YWwxNkZuIEV2YWwxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogUHJpdmF0ZURhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jbXNGcmVlVXNlckRhdGFGbiBGcmVlUHJpdmF0ZURhdGFGbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Ntc0R1cFVzZXJEYXRhRm4gRHVwUHJpdmF0ZURhdGFGbik7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgIGNtc1BsdWdpbkJhc2UgICAgIGJhc2U7Ci0KLSAgICAgIC8vIE9wdGltaXplIGVudHJ5IHBvaW50Ci0gICAgICBfY21zT1BUb3B0aW1pemVGbiAgT3B0aW1pemVQdHI7Ci0KLX0gIGNtc1BsdWdpbk9wdGltaXphdGlvbjsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGdWxsIHhmb3JtCi10eXBlZGVmIHZvaWQgICAgICgqIF9jbXNUcmFuc2Zvcm1Gbikoc3RydWN0IF9jbXN0cmFuc2Zvcm1fc3RydWN0ICpDTU1jYXJnbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBJbnB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBPdXRwdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFN0cmlkZSk7Ci0KLXR5cGVkZWYgY21zQm9vbCAgKCogX2Ntc1RyYW5zZm9ybUZhY3RvcnkpKF9jbXNUcmFuc2Zvcm1GbiogeGZvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBVc2VyRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Ntc0ZyZWVVc2VyRGF0YUZuKiBGcmVlUHJpdmF0ZURhdGFGbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zUGlwZWxpbmUqKiBMdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciogSW5wdXRGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciogT3V0cHV0Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIqIGR3RmxhZ3MpOwotCi0KLS8vIFJldHJpZXZlIHVzZXIgZGF0YSBhcyBzcGVjaWZpZWQgYnkgdGhlIGZhY3RvcnkKLUNNU0FQSSB2b2lkICAgQ01TRVhQT1JUIF9jbXNTZXRUcmFuc2Zvcm1Vc2VyRGF0YShzdHJ1Y3QgX2Ntc3RyYW5zZm9ybV9zdHJ1Y3QgKkNNTWNhcmdvLCB2b2lkKiBwdHIsIF9jbXNGcmVlVXNlckRhdGFGbiBGcmVlUHJpdmF0ZURhdGFGbik7Ci1DTVNBUEkgdm9pZCAqIENNU0VYUE9SVCBfY21zR2V0VHJhbnNmb3JtVXNlckRhdGEoc3RydWN0IF9jbXN0cmFuc2Zvcm1fc3RydWN0ICpDTU1jYXJnbyk7Ci0KLQotLy8gUmV0cmlldmUgZm9ybWF0dGVycwotQ01TQVBJIHZvaWQgICBDTVNFWFBPUlQgX2Ntc0dldFRyYW5zZm9ybUZvcm1hdHRlcnMxNiAgIChzdHJ1Y3QgX2Ntc3RyYW5zZm9ybV9zdHJ1Y3QgKkNNTWNhcmdvLCBjbXNGb3JtYXR0ZXIxNiogRnJvbUlucHV0LCBjbXNGb3JtYXR0ZXIxNiogVG9PdXRwdXQpOwotQ01TQVBJIHZvaWQgICBDTVNFWFBPUlQgX2Ntc0dldFRyYW5zZm9ybUZvcm1hdHRlcnNGbG9hdChzdHJ1Y3QgX2Ntc3RyYW5zZm9ybV9zdHJ1Y3QgKkNNTWNhcmdvLCBjbXNGb3JtYXR0ZXJGbG9hdCogRnJvbUlucHV0LCBjbXNGb3JtYXR0ZXJGbG9hdCogVG9PdXRwdXQpOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgICBjbXNQbHVnaW5CYXNlICAgICBiYXNlOwotCi0gICAgICAvLyBUcmFuc2Zvcm0gZW50cnkgcG9pbnQKLSAgICAgIF9jbXNUcmFuc2Zvcm1GYWN0b3J5ICBGYWN0b3J5OwotCi19ICBjbXNQbHVnaW5UcmFuc2Zvcm07Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTXV0ZXggCi0KLXR5cGVkZWYgdm9pZCogICAgKCogX2Ntc0NyZWF0ZU11dGV4Rm5QdHJUeXBlKShjbXNDb250ZXh0IENvbnRleHRJRCk7Ci10eXBlZGVmIHZvaWQgICAgICgqIF9jbXNEZXN0cm95TXV0ZXhGblB0clR5cGUpKGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBtdHgpOwotdHlwZWRlZiBjbXNCb29sICAoKiBfY21zTG9ja011dGV4Rm5QdHJUeXBlKShjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogbXR4KTsKLXR5cGVkZWYgdm9pZCAgICAgKCogX2Ntc1VubG9ja011dGV4Rm5QdHJUeXBlKShjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogbXR4KTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgY21zUGx1Z2luQmFzZSAgICAgYmFzZTsKLQotICAgICBfY21zQ3JlYXRlTXV0ZXhGblB0clR5cGUgIENyZWF0ZU11dGV4UHRyOwotICAgICBfY21zRGVzdHJveU11dGV4Rm5QdHJUeXBlIERlc3Ryb3lNdXRleFB0cjsKLSAgICAgX2Ntc0xvY2tNdXRleEZuUHRyVHlwZSAgICBMb2NrTXV0ZXhQdHI7Ci0gICAgIF9jbXNVbmxvY2tNdXRleEZuUHRyVHlwZSAgVW5sb2NrTXV0ZXhQdHI7Ci0KLX0gIGNtc1BsdWdpbk11dGV4OwotCi1DTVNBUEkgdm9pZCogICBDTVNFWFBPUlQgX2Ntc0NyZWF0ZU11dGV4KGNtc0NvbnRleHQgQ29udGV4dElEKTsKLUNNU0FQSSB2b2lkICAgIENNU0VYUE9SVCBfY21zRGVzdHJveU11dGV4KGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBtdHgpOwotQ01TQVBJIGNtc0Jvb2wgQ01TRVhQT1JUIF9jbXNMb2NrTXV0ZXgoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIG10eCk7Ci1DTVNBUEkgdm9pZCAgICBDTVNFWFBPUlQgX2Ntc1VubG9ja011dGV4KGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBtdHgpOwotCi0KLSNpZm5kZWYgQ01TX1VTRV9DUFBfQVBJCi0jICAgaWZkZWYgX19jcGx1c3BsdXMKLSAgICB9Ci0jICAgZW5kaWYKLSNlbmRpZgotCi0jZGVmaW5lIF9sY21zX3BsdWdpbl9ICi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zY2FtMDIuYyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zY2FtMDIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ4NzRhYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2NhbTAyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0ODYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTIgTWFydGkgTWFyaWEgU2FndWVyCi0vLwotLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0vLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0vLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0vLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLS8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQotLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLS8vCi0vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0vLwotLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0vLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KLS8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi0vLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCi0vLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0vLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLS8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotCi0jaW5jbHVkZSAibGNtczJfaW50ZXJuYWwuaCIKLQotLy8gQ0lFQ0FNIDAyIGFwcGVhcmFuY2UgbW9kZWwuIE1hbnkgdGhhbmtzIHRvIEpvcmRpIFZpbGFyIGZvciB0aGUgZGVidWdnaW5nLgotCi0vLyAtLS0tLS0tLS0tIEltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXR5cGVkZWYgc3RydWN0ICB7Ci0KLSAgICBjbXNGbG9hdDY0TnVtYmVyIFhZWlszXTsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIFJHQlszXTsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIFJHQmNbM107Ci0gICAgY21zRmxvYXQ2NE51bWJlciBSR0JwWzNdOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgUkdCcGFbM107Ci0gICAgY21zRmxvYXQ2NE51bWJlciBhLCBiLCBoLCBlLCBILCBBLCBKLCBRLCBzLCB0LCBDLCBNOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgYWJDWzJdOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgYWJzWzJdOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgYWJNWzJdOwotCi19IENBTTAyQ09MT1I7Ci0KLXR5cGVkZWYgc3RydWN0ICB7Ci0KLSAgICBDQU0wMkNPTE9SIGFkb3B0ZWRXaGl0ZTsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIExBLCBZYjsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIEYsIGMsIE5jOwotICAgIGNtc1VJbnQzMk51bWJlciBzdXJyb3VuZDsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIG4sIE5iYiwgTmNiLCB6LCBGTCwgRDsKLQotICAgIGNtc0NvbnRleHQgQ29udGV4dElEOwotCi19IGNtc0NJRUNBTTAyOwotCi0KLXN0YXRpYwotY21zRmxvYXQ2NE51bWJlciBjb21wdXRlX24oY21zQ0lFQ0FNMDIqIHBNb2QpCi17Ci0gICAgcmV0dXJuIChwTW9kIC0+IFliIC8gcE1vZCAtPiBhZG9wdGVkV2hpdGUuWFlaWzFdKTsKLX0KLQotc3RhdGljCi1jbXNGbG9hdDY0TnVtYmVyIGNvbXB1dGVfeihjbXNDSUVDQU0wMiogcE1vZCkKLXsKLSAgICByZXR1cm4gKDEuNDggKyBwb3cocE1vZCAtPiBuLCAwLjUpKTsKLX0KLQotc3RhdGljCi1jbXNGbG9hdDY0TnVtYmVyIGNvbXB1dGVOYmIoY21zQ0lFQ0FNMDIqIHBNb2QpCi17Ci0gICAgcmV0dXJuICgwLjcyNSAqIHBvdygoMS4wIC8gcE1vZCAtPiBuKSwgMC4yKSk7Ci19Ci0KLXN0YXRpYwotY21zRmxvYXQ2NE51bWJlciBjb21wdXRlRkwoY21zQ0lFQ0FNMDIqIHBNb2QpCi17Ci0gICAgY21zRmxvYXQ2NE51bWJlciBrLCBGTDsKLQotICAgIGsgPSAxLjAgLyAoKDUuMCAqIHBNb2QtPkxBKSArIDEuMCk7Ci0gICAgRkwgPSAwLjIgKiBwb3coaywgNC4wKSAqICg1LjAgKiBwTW9kLT5MQSkgKyAwLjEgKgotICAgICAgICAocG93KCgxLjAgLSBwb3coaywgNC4wKSksIDIuMCkpICoKLSAgICAgICAgKHBvdygoNS4wICogcE1vZC0+TEEpLCAoMS4wIC8gMy4wKSkpOwotCi0gICAgcmV0dXJuIEZMOwotfQotCi1zdGF0aWMKLWNtc0Zsb2F0NjROdW1iZXIgY29tcHV0ZUQoY21zQ0lFQ0FNMDIqIHBNb2QpCi17Ci0gICAgY21zRmxvYXQ2NE51bWJlciBEOwotCi0gICAgRCA9IHBNb2QtPkYgLSAoMS4wLzMuNikqKGV4cCgoKC1wTW9kIC0+TEEtNDIpIC8gOTIuMCkpKTsKLQotICAgIHJldHVybiBEOwotfQotCi0KLXN0YXRpYwotQ0FNMDJDT0xPUiBYWVp0b0NBVDAyKENBTTAyQ09MT1IgY2xyKQotewotICAgIGNsci5SR0JbMF0gPSAoY2xyLlhZWlswXSAqICAwLjczMjgpICsgKGNsci5YWVpbMV0gKiAgMC40Mjk2KSArIChjbHIuWFlaWzJdICogLTAuMTYyNCk7Ci0gICAgY2xyLlJHQlsxXSA9IChjbHIuWFlaWzBdICogLTAuNzAzNikgKyAoY2xyLlhZWlsxXSAqICAxLjY5NzUpICsgKGNsci5YWVpbMl0gKiAgMC4wMDYxKTsKLSAgICBjbHIuUkdCWzJdID0gKGNsci5YWVpbMF0gKiAgMC4wMDMwKSArIChjbHIuWFlaWzFdICogIDAuMDEzNikgKyAoY2xyLlhZWlsyXSAqICAwLjk4MzQpOwotCi0gICAgcmV0dXJuIGNscjsKLX0KLQotc3RhdGljCi1DQU0wMkNPTE9SIENocm9tYXRpY0FkYXB0YXRpb24oQ0FNMDJDT0xPUiBjbHIsIGNtc0NJRUNBTTAyKiBwTW9kKQotewotICAgIGNtc1VJbnQzMk51bWJlciBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICBjbHIuUkdCY1tpXSA9ICgocE1vZCAtPiBhZG9wdGVkV2hpdGUuWFlaWzFdICoKLSAgICAgICAgICAgIChwTW9kLT5EIC8gcE1vZCAtPiBhZG9wdGVkV2hpdGUuUkdCW2ldKSkgKwotICAgICAgICAgICAgKDEuMCAtIHBNb2QtPkQpKSAqIGNsci5SR0JbaV07Ci0gICAgfQotCi0gICAgcmV0dXJuIGNscjsKLX0KLQotCi1zdGF0aWMKLUNBTTAyQ09MT1IgQ0FUMDJ0b0hQRShDQU0wMkNPTE9SIGNscikKLXsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIE1bOV07Ci0KLSAgICBNWzBdID0oKCAwLjM4OTcxICogIDEuMDk2MTI0KSArICgwLjY4ODk4ICogMC40NTQzNjkpICsgKC0wLjA3ODY4ICogLTAuMDA5NjI4KSk7Ci0gICAgTVsxXSA9KCggMC4zODk3MSAqIC0wLjI3ODg2OSkgKyAoMC42ODg5OCAqIDAuNDczNTMzKSArICgtMC4wNzg2OCAqIC0wLjAwNTY5OCkpOwotICAgIE1bMl0gPSgoIDAuMzg5NzEgKiAgMC4xODI3NDUpICsgKDAuNjg4OTggKiAwLjA3MjA5OCkgKyAoLTAuMDc4NjggKiAgMS4wMTUzMjYpKTsKLSAgICBNWzNdID0oKC0wLjIyOTgxICogIDEuMDk2MTI0KSArICgxLjE4MzQwICogMC40NTQzNjkpICsgKCAwLjA0NjQxICogLTAuMDA5NjI4KSk7Ci0gICAgTVs0XSA9KCgtMC4yMjk4MSAqIC0wLjI3ODg2OSkgKyAoMS4xODM0MCAqIDAuNDczNTMzKSArICggMC4wNDY0MSAqIC0wLjAwNTY5OCkpOwotICAgIE1bNV0gPSgoLTAuMjI5ODEgKiAgMC4xODI3NDUpICsgKDEuMTgzNDAgKiAwLjA3MjA5OCkgKyAoIDAuMDQ2NDEgKiAgMS4wMTUzMjYpKTsKLSAgICBNWzZdID0oLTAuMDA5NjI4KTsKLSAgICBNWzddID0oLTAuMDA1Njk4KTsKLSAgICBNWzhdID0oIDEuMDE1MzI2KTsKLQotICAgIGNsci5SR0JwWzBdID0gKGNsci5SR0JjWzBdICogTVswXSkgKyAgKGNsci5SR0JjWzFdICogTVsxXSkgKyAoY2xyLlJHQmNbMl0gKiBNWzJdKTsKLSAgICBjbHIuUkdCcFsxXSA9IChjbHIuUkdCY1swXSAqIE1bM10pICsgIChjbHIuUkdCY1sxXSAqIE1bNF0pICsgKGNsci5SR0JjWzJdICogTVs1XSk7Ci0gICAgY2xyLlJHQnBbMl0gPSAoY2xyLlJHQmNbMF0gKiBNWzZdKSArICAoY2xyLlJHQmNbMV0gKiBNWzddKSArIChjbHIuUkdCY1syXSAqIE1bOF0pOwotCi0gICAgcmV0dXJuICBjbHI7Ci19Ci0KLXN0YXRpYwotQ0FNMDJDT0xPUiBOb25saW5lYXJDb21wcmVzc2lvbihDQU0wMkNPTE9SIGNsciwgY21zQ0lFQ0FNMDIqIHBNb2QpCi17Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0gICAgY21zRmxvYXQ2NE51bWJlciB0ZW1wOwotCi0gICAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgICBpZiAoY2xyLlJHQnBbaV0gPCAwKSB7Ci0KLSAgICAgICAgICAgIHRlbXAgPSBwb3coKC0xLjAgKiBwTW9kLT5GTCAqIGNsci5SR0JwW2ldIC8gMTAwLjApLCAwLjQyKTsKLSAgICAgICAgICAgIGNsci5SR0JwYVtpXSA9ICgtMS4wICogNDAwLjAgKiB0ZW1wKSAvICh0ZW1wICsgMjcuMTMpICsgMC4xOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgdGVtcCA9IHBvdygocE1vZC0+RkwgKiBjbHIuUkdCcFtpXSAvIDEwMC4wKSwgMC40Mik7Ci0gICAgICAgICAgICBjbHIuUkdCcGFbaV0gPSAoNDAwLjAgKiB0ZW1wKSAvICh0ZW1wICsgMjcuMTMpICsgMC4xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY2xyLkEgPSAoKCgyLjAgKiBjbHIuUkdCcGFbMF0pICsgY2xyLlJHQnBhWzFdICsKLSAgICAgICAgKGNsci5SR0JwYVsyXSAvIDIwLjApKSAtIDAuMzA1KSAqIHBNb2QtPk5iYjsKLQotICAgIHJldHVybiBjbHI7Ci19Ci0KLXN0YXRpYwotQ0FNMDJDT0xPUiBDb21wdXRlQ29ycmVsYXRlcyhDQU0wMkNPTE9SIGNsciwgY21zQ0lFQ0FNMDIqIHBNb2QpCi17Ci0gICAgY21zRmxvYXQ2NE51bWJlciBhLCBiLCB0ZW1wLCBlLCB0LCByMmQsIGQycjsKLQotICAgIGEgPSBjbHIuUkdCcGFbMF0gLSAoMTIuMCAqIGNsci5SR0JwYVsxXSAvIDExLjApICsgKGNsci5SR0JwYVsyXSAvIDExLjApOwotICAgIGIgPSAoY2xyLlJHQnBhWzBdICsgY2xyLlJHQnBhWzFdIC0gKDIuMCAqIGNsci5SR0JwYVsyXSkpIC8gOS4wOwotCi0gICAgcjJkID0gKDE4MC4wIC8gMy4xNDE1OTI2NTQpOwotICAgIGlmIChhID09IDApIHsKLSAgICAgICAgaWYgKGIgPT0gMCkgICAgIGNsci5oID0gMDsKLSAgICAgICAgZWxzZSBpZiAoYiA+IDApIGNsci5oID0gOTA7Ci0gICAgICAgIGVsc2UgICAgICAgICAgICBjbHIuaCA9IDI3MDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoYSA+IDApIHsKLSAgICAgICAgdGVtcCA9IGIgLyBhOwotICAgICAgICBpZiAoYiA+IDApICAgICAgIGNsci5oID0gKHIyZCAqIGF0YW4odGVtcCkpOwotICAgICAgICBlbHNlIGlmIChiID09IDApIGNsci5oID0gMDsKLSAgICAgICAgZWxzZSAgICAgICAgICAgICBjbHIuaCA9IChyMmQgKiBhdGFuKHRlbXApKSArIDM2MDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHRlbXAgPSBiIC8gYTsKLSAgICAgICAgY2xyLmggPSAocjJkICogYXRhbih0ZW1wKSkgKyAxODA7Ci0gICAgfQotCi0gICAgZDJyID0gKDMuMTQxNTkyNjU0IC8gMTgwLjApOwotICAgIGUgPSAoKDEyNTAwLjAgLyAxMy4wKSAqIHBNb2QtPk5jICogcE1vZC0+TmNiKSAqCi0gICAgICAgIChjb3MoKGNsci5oICogZDJyICsgMi4wKSkgKyAzLjgpOwotCi0gICAgaWYgKGNsci5oIDwgMjAuMTQpIHsKLSAgICAgICAgdGVtcCA9ICgoY2xyLmggKyAxMjIuNDcpLzEuMikgKyAoKDIwLjE0IC0gY2xyLmgpLzAuOCk7Ci0gICAgICAgIGNsci5IID0gMzAwICsgKDEwMCooKGNsci5oICsgMTIyLjQ3KS8xLjIpKSAvIHRlbXA7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNsci5oIDwgOTAuMCkgewotICAgICAgICB0ZW1wID0gKChjbHIuaCAtIDIwLjE0KS8wLjgpICsgKCg5MC4wMCAtIGNsci5oKS8wLjcpOwotICAgICAgICBjbHIuSCA9ICgxMDAqKChjbHIuaCAtIDIwLjE0KS8wLjgpKSAvIHRlbXA7Ci0gICAgfQotICAgIGVsc2UgaWYgKGNsci5oIDwgMTY0LjI1KSB7Ci0gICAgICAgIHRlbXAgPSAoKGNsci5oIC0gOTAuMDApLzAuNykgKyAoKDE2NC4yNSAtIGNsci5oKS8xLjApOwotICAgICAgICBjbHIuSCA9IDEwMCArICgoMTAwKigoY2xyLmggLSA5MC4wMCkvMC43KSkgLyB0ZW1wKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoY2xyLmggPCAyMzcuNTMpIHsKLSAgICAgICAgdGVtcCA9ICgoY2xyLmggLSAxNjQuMjUpLzEuMCkgKyAoKDIzNy41MyAtIGNsci5oKS8xLjIpOwotICAgICAgICBjbHIuSCA9IDIwMCArICgoMTAwKigoY2xyLmggLSAxNjQuMjUpLzEuMCkpIC8gdGVtcCk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICB0ZW1wID0gKChjbHIuaCAtIDIzNy41MykvMS4yKSArICgoMzYwIC0gY2xyLmggKyAyMC4xNCkvMC44KTsKLSAgICAgICAgY2xyLkggPSAzMDAgKyAoKDEwMCooKGNsci5oIC0gMjM3LjUzKS8xLjIpKSAvIHRlbXApOwotICAgIH0KLQotICAgIGNsci5KID0gMTAwLjAgKiBwb3coKGNsci5BIC8gcE1vZC0+YWRvcHRlZFdoaXRlLkEpLAotICAgICAgICAocE1vZC0+YyAqIHBNb2QtPnopKTsKLQotICAgIGNsci5RID0gKDQuMCAvIHBNb2QtPmMpICogcG93KChjbHIuSiAvIDEwMC4wKSwgMC41KSAqCi0gICAgICAgIChwTW9kLT5hZG9wdGVkV2hpdGUuQSArIDQuMCkgKiBwb3cocE1vZC0+RkwsIDAuMjUpOwotCi0gICAgdCA9IChlICogcG93KCgoYSAqIGEpICsgKGIgKiBiKSksIDAuNSkpIC8KLSAgICAgICAgKGNsci5SR0JwYVswXSArIGNsci5SR0JwYVsxXSArCi0gICAgICAgICgoMjEuMCAvIDIwLjApICogY2xyLlJHQnBhWzJdKSk7Ci0KLSAgICBjbHIuQyA9IHBvdyh0LCAwLjkpICogcG93KChjbHIuSiAvIDEwMC4wKSwgMC41KSAqCi0gICAgICAgIHBvdygoMS42NCAtIHBvdygwLjI5LCBwTW9kLT5uKSksIDAuNzMpOwotCi0gICAgY2xyLk0gPSBjbHIuQyAqIHBvdyhwTW9kLT5GTCwgMC4yNSk7Ci0gICAgY2xyLnMgPSAxMDAuMCAqIHBvdygoY2xyLk0gLyBjbHIuUSksIDAuNSk7Ci0KLSAgICByZXR1cm4gY2xyOwotfQotCi0KLXN0YXRpYwotQ0FNMDJDT0xPUiBJbnZlcnNlQ29ycmVsYXRlcyhDQU0wMkNPTE9SIGNsciwgY21zQ0lFQ0FNMDIqIHBNb2QpCi17Ci0KLSAgICBjbXNGbG9hdDY0TnVtYmVyIHQsIGUsIHAxLCBwMiwgcDMsIHA0LCBwNSwgaHIsIGQycjsKLSAgICBkMnIgPSAzLjE0MTU5MjY1NCAvIDE4MC4wOwotCi0gICAgdCA9IHBvdyggKGNsci5DIC8gKHBvdygoY2xyLkogLyAxMDAuMCksIDAuNSkgKgotICAgICAgICAocG93KCgxLjY0IC0gcG93KDAuMjksIHBNb2QtPm4pKSwgMC43MykpKSksCi0gICAgICAgICgxLjAgLyAwLjkpICk7Ci0gICAgZSA9ICgoMTI1MDAuMCAvIDEzLjApICogcE1vZC0+TmMgKiBwTW9kLT5OY2IpICoKLSAgICAgICAgKGNvcygoY2xyLmggKiBkMnIgKyAyLjApKSArIDMuOCk7Ci0KLSAgICBjbHIuQSA9IHBNb2QtPmFkb3B0ZWRXaGl0ZS5BICogcG93KAotICAgICAgICAgICAoY2xyLkogLyAxMDAuMCksCi0gICAgICAgICAgICgxLjAgLyAocE1vZC0+YyAqIHBNb2QtPnopKSk7Ci0KLSAgICBwMSA9IGUgLyB0OwotICAgIHAyID0gKGNsci5BIC8gcE1vZC0+TmJiKSArIDAuMzA1OwotICAgIHAzID0gMjEuMCAvIDIwLjA7Ci0KLSAgICBociA9IGNsci5oICogZDJyOwotCi0gICAgaWYgKGZhYnMoc2luKGhyKSkgPj0gZmFicyhjb3MoaHIpKSkgewotICAgICAgICBwNCA9IHAxIC8gc2luKGhyKTsKLSAgICAgICAgY2xyLmIgPSAocDIgKiAoMi4wICsgcDMpICogKDQ2MC4wIC8gMTQwMy4wKSkgLwotICAgICAgICAgICAgKHA0ICsgKDIuMCArIHAzKSAqICgyMjAuMCAvIDE0MDMuMCkgKgotICAgICAgICAgICAgKGNvcyhocikgLyBzaW4oaHIpKSAtICgyNy4wIC8gMTQwMy4wKSArCi0gICAgICAgICAgICBwMyAqICg2MzAwLjAgLyAxNDAzLjApKTsKLSAgICAgICAgY2xyLmEgPSBjbHIuYiAqIChjb3MoaHIpIC8gc2luKGhyKSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBwNSA9IHAxIC8gY29zKGhyKTsKLSAgICAgICAgY2xyLmEgPSAocDIgKiAoMi4wICsgcDMpICogKDQ2MC4wIC8gMTQwMy4wKSkgLwotICAgICAgICAgICAgKHA1ICsgKDIuMCArIHAzKSAqICgyMjAuMCAvIDE0MDMuMCkgLQotICAgICAgICAgICAgKCgyNy4wIC8gMTQwMy4wKSAtIHAzICogKDYzMDAuMCAvIDE0MDMuMCkpICoKLSAgICAgICAgICAgIChzaW4oaHIpIC8gY29zKGhyKSkpOwotICAgICAgICBjbHIuYiA9IGNsci5hICogKHNpbihocikgLyBjb3MoaHIpKTsKLSAgICB9Ci0KLSAgICBjbHIuUkdCcGFbMF0gPSAoKDQ2MC4wIC8gMTQwMy4wKSAqIHAyKSArCi0gICAgICAgICAgICAgICgoNDUxLjAgLyAxNDAzLjApICogY2xyLmEpICsKLSAgICAgICAgICAgICAgKCgyODguMCAvIDE0MDMuMCkgKiBjbHIuYik7Ci0gICAgY2xyLlJHQnBhWzFdID0gKCg0NjAuMCAvIDE0MDMuMCkgKiBwMikgLQotICAgICAgICAgICAgICAoKDg5MS4wIC8gMTQwMy4wKSAqIGNsci5hKSAtCi0gICAgICAgICAgICAgICgoMjYxLjAgLyAxNDAzLjApICogY2xyLmIpOwotICAgIGNsci5SR0JwYVsyXSA9ICgoNDYwLjAgLyAxNDAzLjApICogcDIpIC0KLSAgICAgICAgICAgICAgKCgyMjAuMCAvIDE0MDMuMCkgKiBjbHIuYSkgLQotICAgICAgICAgICAgICAoKDYzMDAuMCAvIDE0MDMuMCkgKiBjbHIuYik7Ci0KLSAgICByZXR1cm4gY2xyOwotfQotCi1zdGF0aWMKLUNBTTAyQ09MT1IgSW52ZXJzZU5vbmxpbmVhcml0eShDQU0wMkNPTE9SIGNsciwgY21zQ0lFQ0FNMDIqIHBNb2QpCi17Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0gICAgY21zRmxvYXQ2NE51bWJlciBjMTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgaWYgKChjbHIuUkdCcGFbaV0gLSAwLjEpIDwgMCkgYzEgPSAtMTsKLSAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMSA9IDE7Ci0gICAgICAgIGNsci5SR0JwW2ldID0gYzEgKiAoMTAwLjAgLyBwTW9kLT5GTCkgKgotICAgICAgICAgICAgcG93KCgoMjcuMTMgKiBmYWJzKGNsci5SR0JwYVtpXSAtIDAuMSkpIC8KLSAgICAgICAgICAgICg0MDAuMCAtIGZhYnMoY2xyLlJHQnBhW2ldIC0gMC4xKSkpLAotICAgICAgICAgICAgKDEuMCAvIDAuNDIpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY2xyOwotfQotCi1zdGF0aWMKLUNBTTAyQ09MT1IgSFBFdG9DQVQwMihDQU0wMkNPTE9SIGNscikKLXsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIE1bOV07Ci0KLSAgICBNWzBdID0gKCggMC43MzI4ICogIDEuOTEwMTk3KSArICgwLjQyOTYgKiAwLjM3MDk1MCkpOwotICAgIE1bMV0gPSAoKCAwLjczMjggKiAtMS4xMTIxMjQpICsgKDAuNDI5NiAqIDAuNjI5MDU0KSk7Ci0gICAgTVsyXSA9ICgoIDAuNzMyOCAqICAwLjIwMTkwOCkgKyAoMC40Mjk2ICogMC4wMDAwMDgpIC0gMC4xNjI0KTsKLSAgICBNWzNdID0gKCgtMC43MDM2ICogIDEuOTEwMTk3KSArICgxLjY5NzUgKiAwLjM3MDk1MCkpOwotICAgIE1bNF0gPSAoKC0wLjcwMzYgKiAtMS4xMTIxMjQpICsgKDEuNjk3NSAqIDAuNjI5MDU0KSk7Ci0gICAgTVs1XSA9ICgoLTAuNzAzNiAqICAwLjIwMTkwOCkgKyAoMS42OTc1ICogMC4wMDAwMDgpICsgMC4wMDYxKTsKLSAgICBNWzZdID0gKCggMC4wMDMwICogIDEuOTEwMTk3KSArICgwLjAxMzYgKiAwLjM3MDk1MCkpOwotICAgIE1bN10gPSAoKCAwLjAwMzAgKiAtMS4xMTIxMjQpICsgKDAuMDEzNiAqIDAuNjI5MDU0KSk7Ci0gICAgTVs4XSA9ICgoIDAuMDAzMCAqICAwLjIwMTkwOCkgKyAoMC4wMTM2ICogMC4wMDAwMDgpICsgMC45ODM0KTs7Ci0KLSAgICBjbHIuUkdCY1swXSA9IChjbHIuUkdCcFswXSAqIE1bMF0pICsgKGNsci5SR0JwWzFdICogTVsxXSkgKyAoY2xyLlJHQnBbMl0gKiBNWzJdKTsKLSAgICBjbHIuUkdCY1sxXSA9IChjbHIuUkdCcFswXSAqIE1bM10pICsgKGNsci5SR0JwWzFdICogTVs0XSkgKyAoY2xyLlJHQnBbMl0gKiBNWzVdKTsKLSAgICBjbHIuUkdCY1syXSA9IChjbHIuUkdCcFswXSAqIE1bNl0pICsgKGNsci5SR0JwWzFdICogTVs3XSkgKyAoY2xyLlJHQnBbMl0gKiBNWzhdKTsKLSAgICByZXR1cm4gY2xyOwotfQotCi0KLXN0YXRpYwotQ0FNMDJDT0xPUiBJbnZlcnNlQ2hyb21hdGljQWRhcHRhdGlvbihDQU0wMkNPTE9SIGNsciwgIGNtc0NJRUNBTTAyKiBwTW9kKQotewotICAgIGNtc1VJbnQzMk51bWJlciBpOwotICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgY2xyLlJHQltpXSA9IGNsci5SR0JjW2ldIC8KLSAgICAgICAgICAgICgocE1vZC0+YWRvcHRlZFdoaXRlLlhZWlsxXSAqIHBNb2QtPkQgLyBwTW9kLT5hZG9wdGVkV2hpdGUuUkdCW2ldKSArIDEuMCAtIHBNb2QtPkQpOwotICAgIH0KLSAgICByZXR1cm4gY2xyOwotfQotCi0KLXN0YXRpYwotQ0FNMDJDT0xPUiBDQVQwMnRvWFlaKENBTTAyQ09MT1IgY2xyKQotewotICAgIGNsci5YWVpbMF0gPSAoY2xyLlJHQlswXSAqICAxLjA5NjEyNCkgKyAoY2xyLlJHQlsxXSAqIC0wLjI3ODg2OSkgKyAoY2xyLlJHQlsyXSAqICAwLjE4Mjc0NSk7Ci0gICAgY2xyLlhZWlsxXSA9IChjbHIuUkdCWzBdICogIDAuNDU0MzY5KSArIChjbHIuUkdCWzFdICogIDAuNDczNTMzKSArIChjbHIuUkdCWzJdICogIDAuMDcyMDk4KTsKLSAgICBjbHIuWFlaWzJdID0gKGNsci5SR0JbMF0gKiAtMC4wMDk2MjgpICsgKGNsci5SR0JbMV0gKiAtMC4wMDU2OTgpICsgKGNsci5SR0JbMl0gKiAgMS4wMTUzMjYpOwotCi0gICAgcmV0dXJuIGNscjsKLX0KLQotCi1jbXNIQU5ETEUgIENNU0VYUE9SVCBjbXNDSUVDQU0wMkluaXQoY21zQ29udGV4dCBDb250ZXh0SUQsIGNvbnN0IGNtc1ZpZXdpbmdDb25kaXRpb25zKiBwVkMpCi17Ci0gICAgY21zQ0lFQ0FNMDIqIGxwTW9kOwotCi0gICAgX2Ntc0Fzc2VydChwVkMgIT0gTlVMTCk7Ci0KLSAgICBpZigobHBNb2QgPSAoY21zQ0lFQ0FNMDIqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihjbXNDSUVDQU0wMikpKSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGxwTW9kIC0+Q29udGV4dElEID0gQ29udGV4dElEOwotCi0gICAgbHBNb2QgLT5hZG9wdGVkV2hpdGUuWFlaWzBdID0gcFZDIC0+d2hpdGVQb2ludC5YOwotICAgIGxwTW9kIC0+YWRvcHRlZFdoaXRlLlhZWlsxXSA9IHBWQyAtPndoaXRlUG9pbnQuWTsKLSAgICBscE1vZCAtPmFkb3B0ZWRXaGl0ZS5YWVpbMl0gPSBwVkMgLT53aGl0ZVBvaW50Llo7Ci0KLSAgICBscE1vZCAtPiBMQSAgICAgICA9IHBWQyAtPkxhOwotICAgIGxwTW9kIC0+IFliICAgICAgID0gcFZDIC0+WWI7Ci0gICAgbHBNb2QgLT4gRCAgICAgICAgPSBwVkMgLT5EX3ZhbHVlOwotICAgIGxwTW9kIC0+IHN1cnJvdW5kID0gcFZDIC0+c3Vycm91bmQ7Ci0KLSAgICBzd2l0Y2ggKGxwTW9kIC0+IHN1cnJvdW5kKSB7Ci0KLQotICAgIGNhc2UgQ1VUU0hFRVRfU1VSUk9VTkQ6Ci0gICAgICAgIGxwTW9kLT5GID0gMC44OwotICAgICAgICBscE1vZC0+YyA9IDAuNDE7Ci0gICAgICAgIGxwTW9kLT5OYyA9IDAuODsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERBUktfU1VSUk9VTkQ6Ci0gICAgICAgIGxwTW9kIC0+IEYgID0gMC44OwotICAgICAgICBscE1vZCAtPiBjICA9IDAuNTI1OwotICAgICAgICBscE1vZCAtPiBOYyA9IDAuODsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIERJTV9TVVJST1VORDoKLSAgICAgICAgbHBNb2QgLT4gRiAgPSAwLjk7Ci0gICAgICAgIGxwTW9kIC0+IGMgID0gMC41OTsKLSAgICAgICAgbHBNb2QgLT4gTmMgPSAwLjk1OwotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8vIEF2ZXJhZ2Ugc3Vycm91bmQKLSAgICAgICAgbHBNb2QgLT4gRiAgPSAxLjA7Ci0gICAgICAgIGxwTW9kIC0+IGMgID0gMC42OTsKLSAgICAgICAgbHBNb2QgLT4gTmMgPSAxLjA7Ci0gICAgfQotCi0gICAgbHBNb2QgLT4gbiAgID0gY29tcHV0ZV9uKGxwTW9kKTsKLSAgICBscE1vZCAtPiB6ICAgPSBjb21wdXRlX3oobHBNb2QpOwotICAgIGxwTW9kIC0+IE5iYiA9IGNvbXB1dGVOYmIobHBNb2QpOwotICAgIGxwTW9kIC0+IEZMICA9IGNvbXB1dGVGTChscE1vZCk7Ci0KLSAgICBpZiAobHBNb2QgLT4gRCA9PSBEX0NBTENVTEFURSkgewotICAgICAgICBscE1vZCAtPiBEICAgPSBjb21wdXRlRChscE1vZCk7Ci0gICAgfQotCi0gICAgbHBNb2QgLT4gTmNiID0gbHBNb2QgLT4gTmJiOwotCi0gICAgbHBNb2QgLT4gYWRvcHRlZFdoaXRlID0gWFladG9DQVQwMihscE1vZCAtPiBhZG9wdGVkV2hpdGUpOwotICAgIGxwTW9kIC0+IGFkb3B0ZWRXaGl0ZSA9IENocm9tYXRpY0FkYXB0YXRpb24obHBNb2QgLT4gYWRvcHRlZFdoaXRlLCBscE1vZCk7Ci0gICAgbHBNb2QgLT4gYWRvcHRlZFdoaXRlID0gQ0FUMDJ0b0hQRShscE1vZCAtPiBhZG9wdGVkV2hpdGUpOwotICAgIGxwTW9kIC0+IGFkb3B0ZWRXaGl0ZSA9IE5vbmxpbmVhckNvbXByZXNzaW9uKGxwTW9kIC0+IGFkb3B0ZWRXaGl0ZSwgbHBNb2QpOwotCi0gICAgcmV0dXJuIChjbXNIQU5ETEUpIGxwTW9kOwotCi19Ci0KLXZvaWQgQ01TRVhQT1JUIGNtc0NJRUNBTTAyRG9uZShjbXNIQU5ETEUgaE1vZGVsKQotewotICAgIGNtc0NJRUNBTTAyKiBscE1vZCA9IChjbXNDSUVDQU0wMiopIGhNb2RlbDsKLQotICAgIGlmIChscE1vZCkgX2Ntc0ZyZWUobHBNb2QgLT5Db250ZXh0SUQsIGxwTW9kKTsKLX0KLQotCi12b2lkIENNU0VYUE9SVCBjbXNDSUVDQU0wMkZvcndhcmQoY21zSEFORExFIGhNb2RlbCwgY29uc3QgY21zQ0lFWFlaKiBwSW4sIGNtc0pDaCogcE91dCkKLXsKLSAgICBDQU0wMkNPTE9SIGNscjsKLSAgICBjbXNDSUVDQU0wMiogbHBNb2QgPSAoY21zQ0lFQ0FNMDIqKSBoTW9kZWw7Ci0gIAotICAgIF9jbXNBc3NlcnQobHBNb2QgIT0gTlVMTCk7Ci0gICAgX2Ntc0Fzc2VydChwSW4gIT0gTlVMTCk7Ci0gICAgX2Ntc0Fzc2VydChwT3V0ICE9IE5VTEwpOwotCi0gICAgbWVtc2V0KCZjbHIsIDAsIHNpemVvZihjbHIpKTsKLQotICAgIGNsci5YWVpbMF0gPSBwSW4gLT5YOwotICAgIGNsci5YWVpbMV0gPSBwSW4gLT5ZOwotICAgIGNsci5YWVpbMl0gPSBwSW4gLT5aOwotCi0gICAgY2xyID0gWFladG9DQVQwMihjbHIpOwotICAgIGNsciA9IENocm9tYXRpY0FkYXB0YXRpb24oY2xyLCBscE1vZCk7Ci0gICAgY2xyID0gQ0FUMDJ0b0hQRShjbHIpOwotICAgIGNsciA9IE5vbmxpbmVhckNvbXByZXNzaW9uKGNsciwgbHBNb2QpOwotICAgIGNsciA9IENvbXB1dGVDb3JyZWxhdGVzKGNsciwgbHBNb2QpOwotCi0gICAgcE91dCAtPkogPSBjbHIuSjsKLSAgICBwT3V0IC0+QyA9IGNsci5DOwotICAgIHBPdXQgLT5oID0gY2xyLmg7Ci19Ci0KLXZvaWQgQ01TRVhQT1JUIGNtc0NJRUNBTTAyUmV2ZXJzZShjbXNIQU5ETEUgaE1vZGVsLCBjb25zdCBjbXNKQ2gqIHBJbiwgY21zQ0lFWFlaKiBwT3V0KQotewotICAgIENBTTAyQ09MT1IgY2xyOwotICAgIGNtc0NJRUNBTTAyKiBscE1vZCA9IChjbXNDSUVDQU0wMiopIGhNb2RlbDsKLSAgICAKLSAgICBfY21zQXNzZXJ0KGxwTW9kICE9IE5VTEwpOwotICAgIF9jbXNBc3NlcnQocEluICE9IE5VTEwpOwotICAgIF9jbXNBc3NlcnQocE91dCAhPSBOVUxMKTsKLQotICAgIG1lbXNldCgmY2xyLCAwLCBzaXplb2YoY2xyKSk7Ci0KLSAgICBjbHIuSiA9IHBJbiAtPiBKOwotICAgIGNsci5DID0gcEluIC0+IEM7Ci0gICAgY2xyLmggPSBwSW4gLT4gaDsKLQotICAgIGNsciA9IEludmVyc2VDb3JyZWxhdGVzKGNsciwgbHBNb2QpOwotICAgIGNsciA9IEludmVyc2VOb25saW5lYXJpdHkoY2xyLCBscE1vZCk7Ci0gICAgY2xyID0gSFBFdG9DQVQwMihjbHIpOwotICAgIGNsciA9IEludmVyc2VDaHJvbWF0aWNBZGFwdGF0aW9uKGNsciwgbHBNb2QpOwotICAgIGNsciA9IENBVDAydG9YWVooY2xyKTsKLQotICAgIHBPdXQgLT5YID0gY2xyLlhZWlswXTsKLSAgICBwT3V0IC0+WSA9IGNsci5YWVpbMV07Ci0gICAgcE91dCAtPlogPSBjbHIuWFlaWzJdOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNjZ2F0cy5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNjZ2F0cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2U0Y2VkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zY2dhdHMuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NzYgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTIgTWFydGkgTWFyaWEgU2FndWVyCi0vLwotLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0vLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0vLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0vLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLS8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQotLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLS8vCi0vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0vLwotLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0vLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KLS8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi0vLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCi0vLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0vLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLS8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotCi0jaW5jbHVkZSAibGNtczJfaW50ZXJuYWwuaCIKLQotCi0vLyBJVDguNyAvIENHQVRTLjE3LTIwMHggaGFuZGxpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0jZGVmaW5lIE1BWElEICAgICAgICAxMjggICAgIC8vIE1heCBsZW5ndGggb2YgaWRlbnRpZmllcgotI2RlZmluZSBNQVhTVFIgICAgICAxMDI0ICAgICAvLyBNYXggbGVuZ3RoIG9mIHN0cmluZwotI2RlZmluZSBNQVhUQUJMRVMgICAgMjU1ICAgICAvLyBNYXggTnVtYmVyIG9mIHRhYmxlcyBpbiBhIHNpbmdsZSBzdHJlYW0KLSNkZWZpbmUgTUFYSU5DTFVERSAgICAyMCAgICAgLy8gTWF4IG51bWJlciBvZiBuZXN0ZWQgaW5jbHVkZXMKLQotI2RlZmluZSBERUZBVUxUX0RCTF9GT1JNQVQgICIlLjEwZyIgLy8gRG91YmxlIGZvcm1hdHRpbmcKLQotI2lmZGVmIENNU19JU19XSU5ET1dTXwotLy9zdW5saWFuZy5saXUgbW9kaWZpZWQgMjAxMDQyNiBmb3Igd2luY2UgZXJyb3IKLSMJaWZuZGVmIF9XSU4zMl9XQ0UKLSMJCWluY2x1ZGUgPGlvLmg+Ci0jCWVuZGlmCi0jICAgIGRlZmluZSBESVJfQ0hBUiAgICAnXFwnCi0jZWxzZQotIyAgICBkZWZpbmUgRElSX0NIQVIgICAgJy8nCi0jZW5kaWYKLQotCi0vLyBTeW1ib2xzCi10eXBlZGVmIGVudW0gewotCi0gICAgICAgIFNOT05FLAotICAgICAgICBTSU5VTSwgICAgICAvLyBJbnRlZ2VyCi0gICAgICAgIFNETlVNLCAgICAgIC8vIFJlYWwKLSAgICAgICAgU0lERU5ULCAgICAgLy8gSWRlbnRpZmllcgotICAgICAgICBTU1RSSU5HLCAgICAvLyBzdHJpbmcKLSAgICAgICAgU0NPTU1FTlQsICAgLy8gY29tbWVudAotICAgICAgICBTRU9MTiwgICAgICAvLyBFbmQgb2YgbGluZQotICAgICAgICBTRU9GLCAgICAgICAvLyBFbmQgb2Ygc3RyZWFtCi0gICAgICAgIFNTWU5FUlJPUiwgIC8vIFN5bnRheCBlcnJvciBmb3VuZCBvbiBzdHJlYW0KLQotICAgICAgICAvLyBLZXl3b3JkcwotCi0gICAgICAgIFNCRUdJTl9EQVRBLAotICAgICAgICBTQkVHSU5fREFUQV9GT1JNQVQsCi0gICAgICAgIFNFTkRfREFUQSwKLSAgICAgICAgU0VORF9EQVRBX0ZPUk1BVCwKLSAgICAgICAgU0tFWVdPUkQsCi0gICAgICAgIFNEQVRBX0ZPUk1BVF9JRCwKLSAgICAgICAgU0lOQ0xVREUKLQotICAgIH0gU1lNQk9MOwotCi0KLS8vIEhvdyB0byB3cml0ZSB0aGUgdmFsdWUKLXR5cGVkZWYgZW51bSB7Ci0KLSAgICAgICAgV1JJVEVfVU5DT09LRUQsCi0gICAgICAgIFdSSVRFX1NUUklOR0lGWSwKLSAgICAgICAgV1JJVEVfSEVYQURFQ0lNQUwsCi0gICAgICAgIFdSSVRFX0JJTkFSWSwKLSAgICAgICAgV1JJVEVfUEFJUgotCi0gICAgfSBXUklURU1PREU7Ci0KLS8vIExpbmtlZCBsaXN0IG9mIHZhcmlhYmxlIG5hbWVzCi10eXBlZGVmIHN0cnVjdCBfS2V5VmFsIHsKLQotICAgICAgICBzdHJ1Y3QgX0tleVZhbCogIE5leHQ7Ci0gICAgICAgIGNoYXIqICAgICAgICAgICAgS2V5d29yZDsgICAgICAgLy8gTmFtZSBvZiB2YXJpYWJsZQotICAgICAgICBzdHJ1Y3QgX0tleVZhbCogIE5leHRTdWJrZXk7ICAgIC8vIElmIGtleSBpcyBhIGRpY3Rpb25hcnksIHBvaW50cyB0byB0aGUgbmV4dCBpdGVtCi0gICAgICAgIGNoYXIqICAgICAgICAgICAgU3Via2V5OyAgICAgICAgLy8gSWYga2V5IGlzIGEgZGljdGlvbmFyeSwgcG9pbnRzIHRvIHRoZSBzdWJrZXkgbmFtZQotICAgICAgICBjaGFyKiAgICAgICAgICAgIFZhbHVlOyAgICAgICAgIC8vIFBvaW50cyB0byB2YWx1ZQotICAgICAgICBXUklURU1PREUgICAgICAgIFdyaXRlQXM7ICAgICAgIC8vIEhvdyB0byB3cml0ZSB0aGUgdmFsdWUKLQotICAgfSBLRVlWQUxVRTsKLQotCi0vLyBMaW5rZWQgbGlzdCBvZiBtZW1vcnkgY2h1bmtzIChNZW1vcnkgc2luaykKLXR5cGVkZWYgc3RydWN0IF9Pd25lZE1lbSB7Ci0KLSAgICAgICAgc3RydWN0IF9Pd25lZE1lbSogTmV4dDsKLSAgICAgICAgdm9pZCAqICAgICAgICAgICAgUHRyOyAgICAgICAgICAvLyBQb2ludCB0byB2YWx1ZQotCi0gICB9IE9XTkVETUVNOwotCi0vLyBTdWJhbGxvY2F0b3IKLXR5cGVkZWYgc3RydWN0IF9TdWJBbGxvY2F0b3IgewotCi0gICAgICAgICBjbXNVSW50OE51bWJlciogQmxvY2s7Ci0gICAgICAgICBjbXNVSW50MzJOdW1iZXIgQmxvY2tTaXplOwotICAgICAgICAgY21zVUludDMyTnVtYmVyIFVzZWQ7Ci0KLSAgICB9IFNVQkFMTE9DQVRPUjsKLQotLy8gVGFibGUuIEVhY2ggaW5kaXZpZHVhbCB0YWJsZSBjYW4gaG9sZCBwcm9wZXJ0aWVzIGFuZCByb3dzICYgY29scwotdHlwZWRlZiBzdHJ1Y3QgX1RhYmxlIHsKLQotICAgICAgICBjaGFyIFNoZWV0VHlwZVtNQVhTVFJdOyAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCByb3cgb2YgdGhlIElUOCAodGhlIHR5cGUpCi0KLSAgICAgICAgaW50ICAgICAgICAgICAgblNhbXBsZXMsIG5QYXRjaGVzOyAgICAvLyBDb2xzLCBSb3dzCi0gICAgICAgIGludCAgICAgICAgICAgIFNhbXBsZUlEOyAgICAgICAgICAgICAgLy8gUG9zIG9mIElECi0KLSAgICAgICAgS0VZVkFMVUUqICAgICAgSGVhZGVyTGlzdDsgICAgICAgICAgICAvLyBUaGUgcHJvcGVydGllcwotCi0gICAgICAgIGNoYXIqKiAgICAgICAgIERhdGFGb3JtYXQ7ICAgICAgICAgICAgLy8gVGhlIGJpbmFyeSBzdHJlYW0gZGVzY3JpcHRvcgotICAgICAgICBjaGFyKiogICAgICAgICBEYXRhOyAgICAgICAgICAgICAgICAgIC8vIFRoZSBiaW5hcnkgc3RyZWFtCi0KLSAgICB9IFRBQkxFOwotCi0vLyBGaWxlIHN0cmVhbSBiZWluZyBwYXJzZWQKLXR5cGVkZWYgc3RydWN0IF9GaWxlQ29udGV4dCB7Ci0gICAgICAgIGNoYXIgICAgICAgICAgIEZpbGVOYW1lW2Ntc01BWF9QQVRIXTsgICAgLy8gRmlsZSBuYW1lIGlmIGJlaW5nIHJlYWRlZCBmcm9tIGZpbGUKLSAgICAgICAgRklMRSogICAgICAgICAgU3RyZWFtOyAgICAgICAgICAgICAgICAgICAvLyBGaWxlIHN0cmVhbSBvciBOVUxMIGlmIGhvbGRlZCBpbiBtZW1vcnkKLSAgICB9IEZJTEVDVFg7Ci0KLS8vIFRoaXMgc3RydWN0IGhvbGQgYWxsIGluZm9ybWF0aW9uIGFib3V0IGFuIG9wZW4gSVQ4IGhhbmRsZXIuCi10eXBlZGVmIHN0cnVjdCB7Ci0KLQotICAgICAgICBjbXNVSW50MzJOdW1iZXIgIFRhYmxlc0NvdW50OyAgICAgICAgICAgICAgICAgICAgIC8vIEhvdyBtYW55IHRhYmxlcyBpbiB0aGlzIHN0cmVhbQotICAgICAgICBjbXNVSW50MzJOdW1iZXIgIG5UYWJsZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBhY3R1YWwgdGFibGUKLQotICAgICAgICBUQUJMRSBUYWJbTUFYVEFCTEVTXTsKLQotICAgICAgICAvLyBNZW1vcnkgbWFuYWdlbWVudAotICAgICAgICBPV05FRE1FTSogICAgICBNZW1vcnlTaW5rOyAgICAgICAgICAgIC8vIFRoZSBzdG9yYWdlIGJhY2tlbmQKLSAgICAgICAgU1VCQUxMT0NBVE9SICAgQWxsb2NhdG9yOyAgICAgICAgICAgICAvLyBTdHJpbmcgc3ViYWxsb2NhdG9yIC0tIGp1c3QgdG8ga2VlcCBpdCBmYXN0Ci0KLSAgICAgICAgLy8gUGFyc2VyIHN0YXRlIG1hY2hpbmUKLSAgICAgICAgU1lNQk9MICAgICAgICAgICAgIHN5OyAgICAgICAgICAgICAgICAvLyBDdXJyZW50IHN5bWJvbAotICAgICAgICBpbnQgICAgICAgICAgICAgICAgY2g7ICAgICAgICAgICAgICAgIC8vIEN1cnJlbnQgY2hhcmFjdGVyCi0KLSAgICAgICAgY21zSW50MzJOdW1iZXIgICAgIGludW07ICAgICAgICAgICAgICAvLyBpbnRlZ2VyIHZhbHVlCi0gICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgICBkbnVtOyAgICAgICAgICAgICAgLy8gcmVhbCB2YWx1ZQotCi0gICAgICAgIGNoYXIgICAgICAgICAgIGlkW01BWElEXTsgICAgICAgICAgICAgLy8gaWRlbnRpZmllcgotICAgICAgICBjaGFyICAgICAgICAgICBzdHJbTUFYU1RSXTsgICAgICAgICAgIC8vIHN0cmluZwotCi0gICAgICAgIC8vIEFsbG93ZWQga2V5d29yZHMgJiBkYXRhc2V0cy4gVGhleSBoYXZlIHZpc2liaWxpdHkgb24gd2hvbGUgc3RyZWFtCi0gICAgICAgIEtFWVZBTFVFKiAgICAgIFZhbGlkS2V5d29yZHM7Ci0gICAgICAgIEtFWVZBTFVFKiAgICAgIFZhbGlkU2FtcGxlSUQ7Ci0KLSAgICAgICAgY2hhciogICAgICAgICAgU291cmNlOyAgICAgICAgICAgICAgICAvLyBQb2ludHMgdG8gbG9jLiBiZWluZyBwYXJzZWQKLSAgICAgICAgY21zSW50MzJOdW1iZXIgbGluZW5vOyAgICAgICAgICAgICAgICAvLyBsaW5lIGNvdW50ZXIgZm9yIGVycm9yIHJlcG9ydGluZwotCi0gICAgICAgIEZJTEVDVFgqICAgICAgIEZpbGVTdGFja1tNQVhJTkNMVURFXTsgLy8gU3RhY2sgb2YgZmlsZXMgYmVpbmcgcGFyc2VkCi0gICAgICAgIGNtc0ludDMyTnVtYmVyIEluY2x1ZGVTUDsgICAgICAgICAgICAgLy8gSW5jbHVkZSBTdGFjayBQb2ludGVyCi0KLSAgICAgICAgY2hhciogICAgICAgICAgTWVtb3J5QmxvY2s7ICAgICAgICAgICAvLyBUaGUgc3RyZWFtIGlmIGhvbGRlZCBpbiBtZW1vcnkKLQotICAgICAgICBjaGFyICAgICAgICAgICBEb3VibGVGb3JtYXR0ZXJbTUFYSURdOy8vIFByaW50Zi1saWtlICdjbXNGbG9hdDY0TnVtYmVyJyBmb3JtYXR0ZXIKLQotICAgICAgICBjbXNDb250ZXh0ICAgIENvbnRleHRJRDsgICAgICAgICAgICAgIC8vIFRoZSB0aHJlYWRpbmcgY29udGV4dAotCi0gICB9IGNtc0lUODsKLQotCi0vLyBUaGUgc3RyZWFtIGZvciBzYXZlIG9wZXJhdGlvbnMKLXR5cGVkZWYgc3RydWN0IHsKLQotICAgICAgICBGSUxFKiBzdHJlYW07ICAgLy8gRm9yIHNhdmUtdG8tZmlsZSBiZWhhdmlvdXIKLQotICAgICAgICBjbXNVSW50OE51bWJlciogQmFzZTsKLSAgICAgICAgY21zVUludDhOdW1iZXIqIFB0cjsgICAgICAgIC8vIEZvciBzYXZlLXRvLW1lbSBiZWhhdmlvdXIKLSAgICAgICAgY21zVUludDMyTnVtYmVyIFVzZWQ7Ci0gICAgICAgIGNtc1VJbnQzMk51bWJlciBNYXg7Ci0KLSAgICB9IFNBVkVTVFJFQU07Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNtc0lUOCBwYXJzaW5nIHJvdXRpbmVzCi0KLQotLy8gQSBrZXl3b3JkCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICAgICAgY29uc3QgY2hhciAqaWQ7Ci0gICAgICAgIFNZTUJPTCBzeTsKLQotICAgfSBLRVlXT1JEOwotCi0vLyBUaGUga2V5d29yZC0+c3ltYm9sIHRyYW5zbGF0aW9uIHRhYmxlLiBTb3J0aW5nIGlzIHJlcXVpcmVkLgotc3RhdGljIGNvbnN0IEtFWVdPUkQgVGFiS2V5c1tdID0gewotCi0gICAgICAgIHsiJElOQ0xVREUiLCAgICAgICAgICAgICAgIFNJTkNMVURFfSwgICAvLyBUaGlzIGlzIGFuIGV4dGVuc2lvbiEKLSAgICAgICAgeyIuSU5DTFVERSIsICAgICAgICAgICAgICAgU0lOQ0xVREV9LCAgIC8vIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIQotCi0gICAgICAgIHsiQkVHSU5fREFUQSIsICAgICAgICAgICAgIFNCRUdJTl9EQVRBIH0sCi0gICAgICAgIHsiQkVHSU5fREFUQV9GT1JNQVQiLCAgICAgIFNCRUdJTl9EQVRBX0ZPUk1BVCB9LAotICAgICAgICB7IkRBVEFfRk9STUFUX0lERU5USUZJRVIiLCBTREFUQV9GT1JNQVRfSUR9LAotICAgICAgICB7IkVORF9EQVRBIiwgICAgICAgICAgICAgICBTRU5EX0RBVEF9LAotICAgICAgICB7IkVORF9EQVRBX0ZPUk1BVCIsICAgICAgICBTRU5EX0RBVEFfRk9STUFUfSwKLSAgICAgICAgeyJLRVlXT1JEIiwgICAgICAgICAgICAgICAgU0tFWVdPUkR9Ci0gICAgICAgIH07Ci0KLSNkZWZpbmUgTlVNS0VZUyAoc2l6ZW9mKFRhYktleXMpL3NpemVvZihLRVlXT1JEKSkKLQotLy8gUHJlZGVmaW5lZCBwcm9wZXJ0aWVzCi0KLS8vIEEgcHJvcGVydHkKLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgY29uc3QgY2hhciAqaWQ7ICAgIC8vIFRoZSBpZGVudGlmaWVyCi0gICAgICAgIFdSSVRFTU9ERSBhczsgICAgICAvLyBIb3cgaXMgc3VwcG9zZWQgdG8gYmUgd3JpdHRlbgotICAgIH0gUFJPUEVSVFk7Ci0KLXN0YXRpYyBQUk9QRVJUWSBQcmVkZWZpbmVkUHJvcGVydGllc1tdID0gewotCi0gICAgICAgIHsiTlVNQkVSX09GX0ZJRUxEUyIsIFdSSVRFX1VOQ09PS0VEfSwgICAgLy8gUmVxdWlyZWQgLSBOVU1CRVIgT0YgRklFTERTCi0gICAgICAgIHsiTlVNQkVSX09GX1NFVFMiLCAgIFdSSVRFX1VOQ09PS0VEfSwgICAgLy8gUmVxdWlyZWQgLSBOVU1CRVIgT0YgU0VUUwotICAgICAgICB7Ik9SSUdJTkFUT1IiLCAgICAgICBXUklURV9TVFJJTkdJRll9LCAgIC8vIFJlcXVpcmVkIC0gSWRlbnRpZmllcyB0aGUgc3BlY2lmaWMgc3lzdGVtLCBvcmdhbml6YXRpb24gb3IgaW5kaXZpZHVhbCB0aGF0IGNyZWF0ZWQgdGhlIGRhdGEgZmlsZS4KLSAgICAgICAgeyJGSUxFX0RFU0NSSVBUT1IiLCAgV1JJVEVfU1RSSU5HSUZZfSwgICAvLyBSZXF1aXJlZCAtIERlc2NyaWJlcyB0aGUgcHVycG9zZSBvciBjb250ZW50cyBvZiB0aGUgZGF0YSBmaWxlLgotICAgICAgICB7IkNSRUFURUQiLCAgICAgICAgICBXUklURV9TVFJJTkdJRll9LCAgIC8vIFJlcXVpcmVkIC0gSW5kaWNhdGVzIGRhdGUgb2YgY3JlYXRpb24gb2YgdGhlIGRhdGEgZmlsZS4KLSAgICAgICAgeyJERVNDUklQVE9SIiwgICAgICAgV1JJVEVfU1RSSU5HSUZZfSwgICAvLyBSZXF1aXJlZCAgLSBEZXNjcmliZXMgdGhlIHB1cnBvc2Ugb3IgY29udGVudHMgb2YgdGhlIGRhdGEgZmlsZS4KLSAgICAgICAgeyJESUZGVVNFX0dFT01FVFJZIiwgV1JJVEVfU1RSSU5HSUZZfSwgICAvLyBUaGUgZGlmZnVzZSBnZW9tZXRyeSB1c2VkLiBBbGxvd2VkIHZhbHVlcyBhcmUgInNwaGVyZSIgb3IgIm9wYWwiLgotICAgICAgICB7Ik1BTlVGQUNUVVJFUiIsICAgICBXUklURV9TVFJJTkdJRll9LAotICAgICAgICB7Ik1BTlVGQUNUVVJFIiwgICAgICBXUklURV9TVFJJTkdJRll9LCAgIC8vIFNvbWUgYnJva2VuIEZ1amkgdGFyZ2V0cyBkb2VzIHN0b3JlIHRoaXMgdmFsdWUKLSAgICAgICAgeyJQUk9EX0RBVEUiLCAgICAgICAgV1JJVEVfU1RSSU5HSUZZfSwgICAvLyBJZGVudGlmaWVzIHllYXIgYW5kIG1vbnRoIG9mIHByb2R1Y3Rpb24gb2YgdGhlIHRhcmdldCBpbiB0aGUgZm9ybSB5eXl5Om1tLgotICAgICAgICB7IlNFUklBTCIsICAgICAgICAgICBXUklURV9TVFJJTkdJRll9LCAgIC8vIFVuaXF1ZWx5IGlkZW50aWZpZXMgaW5kaXZpZHVhbCBwaHlzaWNhbCB0YXJnZXQuCi0KLSAgICAgICAgeyJNQVRFUklBTCIsICAgICAgICAgV1JJVEVfU1RSSU5HSUZZfSwgICAvLyBJZGVudGlmaWVzIHRoZSBtYXRlcmlhbCBvbiB3aGljaCB0aGUgdGFyZ2V0IHdhcyBwcm9kdWNlZCB1c2luZyBhIGNvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmlxdWVseSBpZGVudGlmeWluZyB0aCBlIG1hdGVyaWFsLiBUaGlzIGlzIGludGVuZCBlZCB0byBiZSB1c2VkIGZvciBJVDguNwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBoeXNpY2FsIHRhcmdldHMgb25seSAoaS5lIC4gSVQ4LjcvMSBhIG5kIElUOC43LzIpLgotCi0gICAgICAgIHsiSU5TVFJVTUVOVEFUSU9OIiwgIFdSSVRFX1NUUklOR0lGWX0sICAgLy8gVXNlZCB0byByZXBvcnQgdGhlIHNwZWNpZmljIGluc3RydW1lbnRhdGlvbiB1c2VkIChtYW51ZmFjdHVyZXIgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9kZWwgbnVtYmVyKSB0byBnZW5lcmF0ZSB0aGUgZGF0YSByZXBvcnRlZC4gVGhpcyBkYXRhIHdpbGwgb2Z0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm92aWRlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhcnRpY3VsYXIgZGF0YSBjb2xsZWN0ZWQgdGhhbiBhbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4dGVuc2l2ZSBsaXN0IG9mIHNwZWNpZmljIGRldGFpbHMuIFRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjdHJhbCBkYXRhIG9yIGRhdGEgZGVyaXZlZCBmcm9tIHNwZWN0cm9waG90b21ldHJ5LgotCi0gICAgICAgIHsiTUVBU1VSRU1FTlRfU09VUkNFIiwgV1JJVEVfU1RSSU5HSUZZfSwgLy8gSWxsdW1pbmF0aW9uIHVzZWQgZm9yIHNwZWN0cmFsIG1lYXN1cmVtZW50cy4gVGhpcyBkYXRhIGhlbHBzIHByb3ZpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGd1aWRlIHRvIHRoZSBwb3RlbnRpYWwgZm9yIGlzc3VlcyBvZiBwYXBlciBmbHVvcmVzY2VuY2UsIGV0Yy4KLQotICAgICAgICB7IlBSSU5UX0NPTkRJVElPTlMiLCBXUklURV9TVFJJTkdJRll9LCAgIC8vIFVzZWQgdG8gZGVmaW5lIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIHByaW50ZWQgc2hlZXQgYmVpbmcgcmVwb3J0ZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlcmUgc3RhbmRhcmQgY29uZGl0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCAoZS5nLiwgU1dPUCBhdCBub21pbmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5hbWVkIGNvbmRpdGlvbnMgbWF5IHN1ZmZpY2UuIE90aGVyd2lzZSwgZGV0YWlsZWQgaW5mb3JtYXRpb24gaXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkZWQuCi0KLSAgICAgICAgeyJTQU1QTEVfQkFDS0lORyIsICAgV1JJVEVfU1RSSU5HSUZZfSwgICAvLyBJZGVudGlmaWVzIHRoZSBiYWNraW5nIG1hdGVyaWFsIHVzZWQgYmVoaW5kIHRoZSBzYW1wbGUgZHVyaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVhc3VyZW1lbnQuIEFsbG93ZWQgdmFsdWVzIGFyZSAiYmxhY2siICJ3aGl0ZSIgb3IgIm5hIi4KLQotICAgICAgICB7IkNISVNRX0RPRiIsICAgICAgICBXUklURV9TVFJJTkdJRll9LCAgIC8vIERlZ3JlZXMgb2YgZnJlZWRvbSBhc3NvY2lhdGVkIHdpdGggdGhlIENoaSBzcXVhcmVkIHN0YXRpc3RpYwotCi0gICAgICAgLy8gYmVsb3cgcHJvcGVydGllcyBhcmUgbmV3IGluIHJlY2VudCBzcGVjczoKLQotICAgICAgICB7Ik1FQVNVUkVNRU5UX0dFT01FVFJZIiwgV1JJVEVfU1RSSU5HSUZZfSwgLy8gVGhlIHR5cGUgb2YgbWVhc3VyZW1lbnQsIGVpdGhlciByZWZsZWN0aW9uIG9yIHRyYW5zbWlzc2lvbiwgc2hvdWxkIGJlIGluZGljYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsb25nIHdpdGggZGV0YWlscyBvZiB0aGUgZ2VvbWV0cnkgYW5kIHRoZSBhcGVydHVyZSBzaXplIGFuZCBzaGFwZS4gRm9yIGV4YW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRyYW5zbWlzc2lvbiBtZWFzdXJlbWVudHMgaXQgaXMgaW1wb3J0YW50IHRvIGlkZW50aWZ5IDAvZGlmZnVzZSwgZGlmZnVzZS8wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9wYWwgb3IgaW50ZWdyYXRpbmcgc3BoZXJlLCBldGMuIEZvciByZWZsZWN0aW9uIGl0IGlzIGltcG9ydGFudCB0byBpZGVudGlmeSAwLzQ1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQ1LzAsIHNwaGVyZSAoc3BlY3VsYXIgaW5jbHVkZWQgb3IgZXhjbHVkZWQpLCBldGMuCi0KLSAgICAgICB7IkZJTFRFUiIsICAgICAgICAgICAgV1JJVEVfU1RSSU5HSUZZfSwgICAvLyBJZGVudGlmaWVzIHRoZSB1c2Ugb2YgcGh5c2ljYWwgZmlsdGVyKHMpIGR1cmluZyBtZWFzdXJlbWVudC4gVHlwaWNhbGx5IHVzZWQgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZW5vdGUgdGhlIHVzZSBvZiBmaWx0ZXJzIHN1Y2ggYXMgbm9uZSwgRDY1LCBSZWQsIEdyZWVuIG9yIEJsdWUuCi0KLSAgICAgICB7IlBPTEFSSVpBVElPTiIsICAgICAgV1JJVEVfU1RSSU5HSUZZfSwgICAvLyBJZGVudGlmaWVzIHRoZSB1c2Ugb2YgYSBwaHlzaWNhbCBwb2xhcml6YXRpb24gZmlsdGVyIGR1cmluZyBtZWFzdXJlbWVudC4gQWxsb3dlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlcyBhcmUgInllcyIgIndoaXRlIiAibm9uZSIgb3IgIm5hIgotCi0gICAgICAgeyJXRUlHSFRJTkdfRlVOQ1RJT04iLCBXUklURV9QQUlSfSwgICAvLyBJbmRpY2F0ZXMgc3VjaCBmdW5jdGlvbnMgYXM6IHRoZSBDSUUgc3RhbmRhcmQgb2JzZXJ2ZXIgZnVuY3Rpb25zIHVzZWQgaW4gdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRpb24gb2YgdmFyaW91cyBkYXRhIHBhcmFtZXRlcnMgKDIgZGVncmVlIGFuZCAxMCBkZWdyZWUpLCBDSUUgc3RhbmRhcmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbGx1bWluYW50IGZ1bmN0aW9ucyB1c2VkIGluIHRoZSBjYWxjdWxhdGlvbiBvZiB2YXJpb3VzIGRhdGEgcGFyYW1ldGVycyAoZS5nLiwgRDUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEQ2NSwgZXRjLiksIGRlbnNpdHkgc3RhdHVzIHJlc3BvbnNlLCBldGMuIElmIHVzZWQgdGhlcmUgc2hhbGwgYmUgYXQgbGVhc3Qgb25lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmFtZS12YWx1ZSBwYWlyIGZvbGxvd2luZyB0aGUgV0VJR0hUSU5HX0ZVTkNUSU9OIHRhZy9rZXl3b3JkLiBUaGUgZmlyc3QgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIHNldCBzaGFsbCBiZSB7Im5hbWUiIGFuZCBzaGFsbCBpZGVudGlmeSB0aGUgcGFydGljdWxhciBwYXJhbWV0ZXIgdXNlZC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc2Vjb25kIHNoYWxsIGJlIHsidmFsdWUiIGFuZCBzaGFsbCBwcm92aWRlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBuYW1lLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBBU0NJSSBkYXRhLCBhIHN0cmluZyBjb250YWluaW5nIHRoZSBOYW1lIGFuZCBWYWx1ZSBhdHRyaWJ1dGUgcGFpcnMgc2hhbGwgZm9sbG93Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHdlaWdodGluZyBmdW5jdGlvbiBrZXl3b3JkLiBBIHNlbWktY29sb24gc2VwYXJhdGVzIGF0dHJpYnV0ZSBwYWlycyBmcm9tIGVhY2gKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlciBhbmQgd2l0aGluIHRoZSBhdHRyaWJ1dGUgdGhlIG5hbWUgYW5kIHZhbHVlIGFyZSBzZXBhcmF0ZWQgYnkgYSBjb21tYS4KLQotICAgICAgIHsiQ09NUFVUQVRJT05BTF9QQVJBTUVURVIiLCBXUklURV9QQUlSfSwgLy8gUGFyYW1ldGVyIHRoYXQgaXMgdXNlZCBpbiBjb21wdXRpbmcgYSB2YWx1ZSBmcm9tIG1lYXN1cmVkIGRhdGEuIE5hbWUgaXMgdGhlIG5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiB0aGUgY2FsY3VsYXRpb24sIHBhcmFtZXRlciBpcyB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIHVzZWQgaW4gdGhlIGNhbGN1bGF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHZhbHVlIGlzIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLgotCi0gICAgICAgeyJUQVJHRVRfVFlQRSIsICAgICAgICBXUklURV9TVFJJTkdJRll9LCAgLy8gVGhlIHR5cGUgb2YgdGFyZ2V0IGJlaW5nIG1lYXN1cmVkLCBlLmcuIElUOC43LzEsIElUOC43LzMsIHVzZXIgZGVmaW5lZCwgZXRjLgotCi0gICAgICAgeyJDT0xPUkFOVCIsICAgICAgICAgICBXUklURV9TVFJJTkdJRll9LCAgLy8gSWRlbnRpZmllcyB0aGUgY29sb3JhbnQocykgdXNlZCBpbiBjcmVhdGluZyB0aGUgdGFyZ2V0LgotCi0gICAgICAgeyJUQUJMRV9ERVNDUklQVE9SIiwgICBXUklURV9TVFJJTkdJRll9LCAgLy8gRGVzY3JpYmVzIHRoZSBwdXJwb3NlIG9yIGNvbnRlbnRzIG9mIGEgZGF0YSB0YWJsZS4KLQotICAgICAgIHsiVEFCTEVfTkFNRSIsICAgICAgICAgV1JJVEVfU1RSSU5HSUZZfSAgIC8vIFByb3ZpZGVzIGEgc2hvcnQgbmFtZSBmb3IgYSBkYXRhIHRhYmxlLgotfTsKLQotI2RlZmluZSBOVU1QUkVERUZJTkVEUFJPUFMgKHNpemVvZihQcmVkZWZpbmVkUHJvcGVydGllcykvc2l6ZW9mKFBST1BFUlRZKSkKLQotCi0vLyBQcmVkZWZpbmVkIHNhbXBsZSB0eXBlcyBvbiBkYXRhc2V0Ci1zdGF0aWMgY29uc3QgY2hhciogUHJlZGVmaW5lZFNhbXBsZUlEW10gPSB7Ci0gICAgICAgICJTQU1QTEVfSUQiLCAgICAgIC8vIElkZW50aWZpZXMgc2FtcGxlIHRoYXQgZGF0YSByZXByZXNlbnRzCi0gICAgICAgICJTVFJJTkciLCAgICAgICAgIC8vIElkZW50aWZpZXMgbGFiZWwsIG9yIG90aGVyIG5vbi1tYWNoaW5lIHJlYWRhYmxlIHZhbHVlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWYWx1ZSBtdXN0IGJlZ2luIGFuZCBlbmQgd2l0aCBhICIgc3ltYm9sCi0KLSAgICAgICAgIkNNWUtfQyIsICAgICAgICAgLy8gQ3lhbiBjb21wb25lbnQgb2YgQ01ZSyBkYXRhIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UKLSAgICAgICAgIkNNWUtfTSIsICAgICAgICAgLy8gTWFnZW50YSBjb21wb25lbnQgb2YgQ01ZSyBkYXRhIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UKLSAgICAgICAgIkNNWUtfWSIsICAgICAgICAgLy8gWWVsbG93IGNvbXBvbmVudCBvZiBDTVlLIGRhdGEgZXhwcmVzc2VkIGFzIGEgcGVyY2VudGFnZQotICAgICAgICAiQ01ZS19LIiwgICAgICAgICAvLyBCbGFjayBjb21wb25lbnQgb2YgQ01ZSyBkYXRhIGV4cHJlc3NlZCBhcyBhIHBlcmNlbnRhZ2UKLSAgICAgICAgIkRfUkVEIiwgICAgICAgICAgLy8gUmVkIGZpbHRlciBkZW5zaXR5Ci0gICAgICAgICJEX0dSRUVOIiwgICAgICAgIC8vIEdyZWVuIGZpbHRlciBkZW5zaXR5Ci0gICAgICAgICJEX0JMVUUiLCAgICAgICAgIC8vIEJsdWUgZmlsdGVyIGRlbnNpdHkKLSAgICAgICAgIkRfVklTIiwgICAgICAgICAgLy8gVmlzdWFsIGZpbHRlciBkZW5zaXR5Ci0gICAgICAgICJEX01BSk9SX0ZJTFRFUiIsIC8vIE1ham9yIGZpbHRlciBkIGVuc2l0eQotICAgICAgICAiUkdCX1IiLCAgICAgICAgICAvLyBSZWQgY29tcG9uZW50IG9mIFJHQiBkYXRhCi0gICAgICAgICJSR0JfRyIsICAgICAgICAgIC8vIEdyZWVuIGNvbXBvbmVudCBvZiBSR0IgZGF0YQotICAgICAgICAiUkdCX0IiLCAgICAgICAgICAvLyBCbHVlIGNvbSBwb25lbnQgb2YgUkdCIGRhdGEKLSAgICAgICAgIlNQRUNUUkFMX05NIiwgICAgLy8gV2F2ZWxlbmd0aCBvZiBtZWFzdXJlbWVudCBleHByZXNzZWQgaW4gbmFub21ldGVycwotICAgICAgICAiU1BFQ1RSQUxfUENUIiwgICAvLyBQZXJjZW50YWdlIHJlZmxlY3RhbmNlL3RyYW5zbWl0dGFuY2UKLSAgICAgICAgIlNQRUNUUkFMX0RFQyIsICAgLy8gUmVmbGVjdGFuY2UvdHJhbnNtaXR0YW5jZQotICAgICAgICAiWFlaX1giLCAgICAgICAgICAvLyBYIGNvbXBvbmVudCBvZiB0cmlzdGltdWx1cyBkYXRhCi0gICAgICAgICJYWVpfWSIsICAgICAgICAgIC8vIFkgY29tcG9uZW50IG9mIHRyaXN0aW11bHVzIGRhdGEKLSAgICAgICAgIlhZWl9aIiwgICAgICAgICAgLy8gWiBjb21wb25lbnQgb2YgdHJpc3RpbXVsdXMgZGF0YQotICAgICAgICAiWFlZX1giICAgICAgICAgICAvLyB4IGNvbXBvbmVudCBvZiBjaHJvbWF0aWNpdHkgZGF0YQotICAgICAgICAiWFlZX1kiLCAgICAgICAgICAvLyB5IGNvbXBvbmVudCBvZiBjaHJvbWF0aWNpdHkgZGF0YQotICAgICAgICAiWFlZX0NBUFkiLCAgICAgICAvLyBZIGNvbXBvbmVudCBvZiB0cmlzdGltdWx1cyBkYXRhCi0gICAgICAgICJMQUJfTCIsICAgICAgICAgIC8vIEwqIGNvbXBvbmVudCBvZiBMYWIgZGF0YQotICAgICAgICAiTEFCX0EiLCAgICAgICAgICAvLyBhKiBjb21wb25lbnQgb2YgTGFiIGRhdGEKLSAgICAgICAgIkxBQl9CIiwgICAgICAgICAgLy8gYiogY29tcG9uZW50IG9mIExhYiBkYXRhCi0gICAgICAgICJMQUJfQyIsICAgICAgICAgIC8vIEMqYWIgY29tcG9uZW50IG9mIExhYiBkYXRhCi0gICAgICAgICJMQUJfSCIsICAgICAgICAgIC8vIGhhYiBjb21wb25lbnQgb2YgTGFiIGRhdGEKLSAgICAgICAgIkxBQl9ERSIsICAgICAgICAgLy8gQ0lFIGRFCi0gICAgICAgICJMQUJfREVfOTQiLCAgICAgIC8vIENJRSBkRSB1c2luZyBDSUUgOTQKLSAgICAgICAgIkxBQl9ERV9DTUMiLCAgICAgLy8gZEUgdXNpbmcgQ01DCi0gICAgICAgICJMQUJfREVfMjAwMCIsICAgIC8vIENJRSBkRSB1c2luZyBDSUUgREUgMjAwMAotICAgICAgICAiTUVBTl9ERSIsICAgICAgICAvLyBNZWFuIERlbHRhIEUgKExBQl9ERSkgb2Ygc2FtcGxlcyBjb21wYXJlZCB0byBiYXRjaCBhdmVyYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChVc2VkIGZvciBkYXRhIGZpbGVzIGZvciBBTlNJIElUOC43LzEgYW5kIElUOC43LzIgdGFyZ2V0cykKLSAgICAgICAgIlNUREVWX1giLCAgICAgICAgLy8gU3RhbmRhcmQgZGV2aWF0aW9uIG9mIFggKHRyaXN0aW11bHVzIGRhdGEpCi0gICAgICAgICJTVERFVl9ZIiwgICAgICAgIC8vIFN0YW5kYXJkIGRldmlhdGlvbiBvZiBZICh0cmlzdGltdWx1cyBkYXRhKQotICAgICAgICAiU1RERVZfWiIsICAgICAgICAvLyBTdGFuZGFyZCBkZXZpYXRpb24gb2YgWiAodHJpc3RpbXVsdXMgZGF0YSkKLSAgICAgICAgIlNUREVWX0wiLCAgICAgICAgLy8gU3RhbmRhcmQgZGV2aWF0aW9uIG9mIEwqCi0gICAgICAgICJTVERFVl9BIiwgICAgICAgIC8vIFN0YW5kYXJkIGRldmlhdGlvbiBvZiBhKgotICAgICAgICAiU1RERVZfQiIsICAgICAgICAvLyBTdGFuZGFyZCBkZXZpYXRpb24gb2YgYioKLSAgICAgICAgIlNUREVWX0RFIiwgICAgICAgLy8gU3RhbmRhcmQgZGV2aWF0aW9uIG9mIENJRSBkRQotICAgICAgICAiQ0hJX1NRRF9QQVIifTsgICAvLyBUaGUgYXZlcmFnZSBvZiB0aGUgc3RhbmRhcmQgZGV2aWF0aW9ucyBvZiBMKiwgYSogYW5kIGIqLiBJdCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2VkIHRvIGRlcml2ZSBhbiBlc3RpbWF0ZSBvZiB0aGUgY2hpLXNxdWFyZWQgcGFyYW1ldGVyIHdoaWNoIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY29tbWVuZGVkIGFzIHRoZSBwcmVkaWN0b3Igb2YgdGhlIHZhcmlhYmlsaXR5IG9mIGRFCi0KLSNkZWZpbmUgTlVNUFJFREVGSU5FRFNBTVBMRUlEIChzaXplb2YoUHJlZGVmaW5lZFNhbXBsZUlEKS9zaXplb2YoY2hhciAqKSkKLQotLy9Gb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHNvbWUgaW50ZXJuYWwgZnVuY3Rpb25zCi1zdGF0aWMgdm9pZCogQWxsb2NDaHVuayhjbXNJVDgqIGl0OCwgY21zVUludDMyTnVtYmVyIHNpemUpOwotCi0vLyBDaGVja3Mgd2hhdGV2ZXIgYyBpcyBhIHNlcGFyYXRvcgotc3RhdGljCi1jbXNCb29sIGlzc2VwYXJhdG9yKGludCBjKQotewotICAgIHJldHVybiAoYyA9PSAnICcpIHx8IChjID09ICdcdCcpIDsgCi19Ci0KLS8vIENoZWNrcyB3aGF0ZXZlciBjIGlzIGEgdmFsaWQgaWRlbnRpZmllciBjaGFyCi1zdGF0aWMKLWNtc0Jvb2wgaXNtaWRkbGUoaW50IGMpCi17Ci0gICByZXR1cm4gKCFpc3NlcGFyYXRvcihjKSAmJiAoYyAhPSAnIycpICYmIChjICE9J1wiJykgJiYgKGMgIT0gJ1wnJykgJiYgKGMgPiAzMikgJiYgKGMgPCAxMjcpKTsKLX0KLQotLy8gQ2hlY2tzIHdoYXRzZXZlciBjIGlzIGEgdmFsaWQgaWRlbnRpZmllciBtaWRkbGUgY2hhci4KLXN0YXRpYwotY21zQm9vbCBpc2lkY2hhcihpbnQgYykKLXsKLSAgIHJldHVybiBpc2FsbnVtKGMpIHx8IGlzbWlkZGxlKGMpOwotfQotCi0vLyBDaGVja3Mgd2hhdHNldmVyIGMgaXMgYSB2YWxpZCBpZGVudGlmaWVyIGZpcnN0IGNoYXIuCi1zdGF0aWMKLWNtc0Jvb2wgaXNmaXJzdGlkY2hhcihpbnQgYykKLXsKLSAgICAgcmV0dXJuICFpc2RpZ2l0KGMpICYmIGlzbWlkZGxlKGMpOwotfQotCi0vLyBHdWVzcyB3aGV0aGVyIHRoZSBzdXBwbGllZCBwYXRoIGxvb2tzIGxpa2UgYW4gYWJzb2x1dGUgcGF0aAotc3RhdGljCi1jbXNCb29sIGlzYWJzb2x1dGVwYXRoKGNvbnN0IGNoYXIgKnBhdGgpCi17Ci0gICAgY2hhciBUaHJlZUNoYXJzWzRdOwotCi0gICAgaWYocGF0aCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKHBhdGhbMF0gPT0gMCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgc3RybmNweShUaHJlZUNoYXJzLCBwYXRoLCAzKTsKLSAgICBUaHJlZUNoYXJzWzNdID0gMDsKLQotICAgIGlmKFRocmVlQ2hhcnNbMF0gPT0gRElSX0NIQVIpCi0gICAgICAgIHJldHVybiBUUlVFOwotCi0jaWZkZWYgIENNU19JU19XSU5ET1dTXwotICAgIGlmIChpc2FscGhhKChpbnQpIFRocmVlQ2hhcnNbMF0pICYmIFRocmVlQ2hhcnNbMV0gPT0gJzonKQotICAgICAgICByZXR1cm4gVFJVRTsKLSNlbmRpZgotICAgIHJldHVybiBGQUxTRTsKLX0KLQotCi0vLyBNYWtlcyBhIGZpbGUgcGF0aCBiYXNlZCBvbiBhIGdpdmVuIHJlZmVyZW5jZSBwYXRoCi0vLyBOT1RFOiB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgY2hlY2sgaWYgdGhlIHBhdGggZXhpc3RzIG9yIGV2ZW4gaWYgaXQncyBsZWdhbAotc3RhdGljCi1jbXNCb29sIEJ1aWxkQWJzb2x1dGVQYXRoKGNvbnN0IGNoYXIgKnJlbFBhdGgsIGNvbnN0IGNoYXIgKmJhc2VQYXRoLCBjaGFyICpidWZmZXIsIGNtc1VJbnQzMk51bWJlciBNYXhMZW4pCi17Ci0gICAgY2hhciAqdGFpbDsKLSAgICBjbXNVSW50MzJOdW1iZXIgbGVuOwotCi0gICAgLy8gQWxyZWFkeSBhYnNvbHV0ZT8KLSAgICBpZiAoaXNhYnNvbHV0ZXBhdGgocmVsUGF0aCkpIHsKLQotICAgICAgICBzdHJuY3B5KGJ1ZmZlciwgcmVsUGF0aCwgTWF4TGVuKTsKLSAgICAgICAgYnVmZmVyW01heExlbi0xXSA9IDA7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIC8vIE5vLCBzZWFyY2ggZm9yIGxhc3QKLSAgICBzdHJuY3B5KGJ1ZmZlciwgYmFzZVBhdGgsIE1heExlbik7Ci0gICAgYnVmZmVyW01heExlbi0xXSA9IDA7Ci0KLSAgICB0YWlsID0gc3RycmNocihidWZmZXIsIERJUl9DSEFSKTsKLSAgICBpZiAodGFpbCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7ICAgIC8vIElzIG5vdCBhYnNvbHV0ZSBhbmQgaGFzIG5vIHNlcGFyYXRvcnM/PwotCi0gICAgbGVuID0gKGNtc1VJbnQzMk51bWJlcikgKHRhaWwgLSBidWZmZXIpOwotICAgIGlmIChsZW4gPj0gTWF4TGVuKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAvLyBObyBuZWVkIHRvIGFzc3VyZSB6ZXJvIHRlcm1pbmF0b3Igb3ZlciBoZXJlCi0gICAgc3RybmNweSh0YWlsICsgMSwgcmVsUGF0aCwgTWF4TGVuIC0gbGVuKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0KLS8vIE1ha2Ugc3VyZSBubyBleHBsb2l0IGlzIGJlaW5nIGV2ZW4gdHJpZWQKLXN0YXRpYwotY29uc3QgY2hhciogTm9NZXRhKGNvbnN0IGNoYXIqIHN0cikKLXsKLSAgICBpZiAoc3RyY2hyKHN0ciwgJyUnKSAhPSBOVUxMKQotICAgICAgICByZXR1cm4gIioqKiogQ09SUlVQVEVEIEZPUk1BVCBTVFJJTkcgKioqIjsKLQotICAgIHJldHVybiBzdHI7Ci19Ci0KLS8vIFN5bnRheCBlcnJvcgotc3RhdGljCi1jbXNCb29sIFN5bkVycm9yKGNtc0lUOCogaXQ4LCBjb25zdCBjaGFyICpUeHQsIC4uLikKLXsKLSAgICBjaGFyIEJ1ZmZlclsyNTZdLCBFcnJNc2dbMTAyNF07Ci0gICAgdmFfbGlzdCBhcmdzOwotCi0gICAgdmFfc3RhcnQoYXJncywgVHh0KTsKLSAgICB2c25wcmludGYoQnVmZmVyLCAyNTUsIFR4dCwgYXJncyk7Ci0gICAgQnVmZmVyWzI1NV0gPSAwOwotICAgIHZhX2VuZChhcmdzKTsKLQotICAgIHNucHJpbnRmKEVyck1zZywgMTAyMywgIiVzOiBMaW5lICVkLCAlcyIsIGl0OC0+RmlsZVN0YWNrW2l0OCAtPkluY2x1ZGVTUF0tPkZpbGVOYW1lLCBpdDgtPmxpbmVubywgQnVmZmVyKTsKLSAgICBFcnJNc2dbMTAyM10gPSAwOwotICAgIGl0OC0+c3kgPSBTU1lORVJST1I7Ci0gICAgY21zU2lnbmFsRXJyb3IoaXQ4IC0+Q29udGV4dElELCBjbXNFUlJPUl9DT1JSVVBUSU9OX0RFVEVDVEVELCAiJXMiLCBFcnJNc2cpOwotICAgIHJldHVybiBGQUxTRTsKLX0KLQotLy8gQ2hlY2sgaWYgY3VycmVudCBzeW1ib2wgaXMgc2FtZSBhcyBzcGVjaWZpZWQuIGlzc3VlIGFuIGVycm9yIGVsc2UuCi1zdGF0aWMKLWNtc0Jvb2wgQ2hlY2soY21zSVQ4KiBpdDgsIFNZTUJPTCBzeSwgY29uc3QgY2hhciogRXJyKQotewotICAgICAgICBpZiAoaXQ4IC0+IHN5ICE9IHN5KQotICAgICAgICAgICAgICAgIHJldHVybiBTeW5FcnJvcihpdDgsIE5vTWV0YShFcnIpKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8vIFJlYWQgTmV4dCBjaGFyYWN0ZXIgZnJvbSBzdHJlYW0KLXN0YXRpYwotdm9pZCBOZXh0Q2goY21zSVQ4KiBpdDgpCi17Ci0gICAgaWYgKGl0OCAtPiBGaWxlU3RhY2tbaXQ4IC0+SW5jbHVkZVNQXS0+U3RyZWFtKSB7Ci0KLSAgICAgICAgaXQ4IC0+Y2ggPSBmZ2V0YyhpdDggLT5GaWxlU3RhY2tbaXQ4IC0+SW5jbHVkZVNQXS0+U3RyZWFtKTsKLQotICAgICAgICBpZiAoZmVvZihpdDggLT4gRmlsZVN0YWNrW2l0OCAtPkluY2x1ZGVTUF0tPlN0cmVhbSkpICB7Ci0KLSAgICAgICAgICAgIGlmIChpdDggLT5JbmNsdWRlU1AgPiAwKSB7Ci0KLSAgICAgICAgICAgICAgICBmY2xvc2UoaXQ4IC0+RmlsZVN0YWNrW2l0OC0+SW5jbHVkZVNQLS1dLT5TdHJlYW0pOwotICAgICAgICAgICAgICAgIGl0OCAtPiBjaCA9ICcgJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hpdGVzcGFjZSB0byBiZSBpZ25vcmVkCi0KLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIGl0OCAtPmNoID0gMDsgICAvLyBFT0YKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgaXQ4LT5jaCA9ICppdDgtPlNvdXJjZTsKLSAgICAgICAgaWYgKGl0OC0+Y2gpIGl0OC0+U291cmNlKys7Ci0gICAgfQotfQotCi0KLS8vIFRyeSB0byBzZWUgaWYgY3VycmVudCBpZGVudGlmaWVyIGlzIGEga2V5d29yZCwgaWYgc28gcmV0dXJuIHRoZSByZWZlcnJlZCBzeW1ib2wKLXN0YXRpYwotU1lNQk9MIEJpblNyY2hLZXkoY29uc3QgY2hhciAqaWQpCi17Ci0gICAgaW50IGwgPSAxOwotICAgIGludCByID0gTlVNS0VZUzsKLSAgICBpbnQgeCwgcmVzOwotCi0gICAgd2hpbGUgKHIgPj0gbCkKLSAgICB7Ci0gICAgICAgIHggPSAobCtyKS8yOwotICAgICAgICByZXMgPSBjbXNzdHJjYXNlY21wKGlkLCBUYWJLZXlzW3gtMV0uaWQpOwotICAgICAgICBpZiAocmVzID09IDApIHJldHVybiBUYWJLZXlzW3gtMV0uc3k7Ci0gICAgICAgIGlmIChyZXMgPCAwKSByID0geCAtIDE7Ci0gICAgICAgIGVsc2UgbCA9IHggKyAxOwotICAgIH0KLQotICAgIHJldHVybiBTTk9ORTsKLX0KLQotCi0vLyAxMCBebgotc3RhdGljCi1jbXNGbG9hdDY0TnVtYmVyIHhwb3cxMChpbnQgbikKLXsKLSAgICByZXR1cm4gcG93KDEwLCAoY21zRmxvYXQ2NE51bWJlcikgbik7Ci19Ci0KLQotLy8gIFJlYWRzIGEgUmVhbCBudW1iZXIsIHRyaWVzIHRvIGZvbGxvdyBmcm9tIGludGVnZXIgbnVtYmVyCi1zdGF0aWMKLXZvaWQgUmVhZFJlYWwoY21zSVQ4KiBpdDgsIGludCBpbnVtKQotewotICAgIGl0OC0+ZG51bSA9IChjbXNGbG9hdDY0TnVtYmVyKSBpbnVtOwotCi0gICAgd2hpbGUgKGlzZGlnaXQoaXQ4LT5jaCkpIHsKLQotICAgICAgICBpdDgtPmRudW0gPSBpdDgtPmRudW0gKiAxMC4wICsgKGl0OC0+Y2ggLSAnMCcpOwotICAgICAgICBOZXh0Q2goaXQ4KTsKLSAgICB9Ci0KLSAgICBpZiAoaXQ4LT5jaCA9PSAnLicpIHsgICAgICAgIC8vIERlY2ltYWwgcG9pbnQKLQotICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIGZyYWMgPSAwLjA7ICAgICAgLy8gZnJhY3Rpb24KLSAgICAgICAgaW50IHByZWMgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8vIHByZWNpc2lvbgotCi0gICAgICAgIE5leHRDaChpdDgpOyAgICAgICAgICAgICAgIC8vIEVhdHMgZGVjLiBwb2ludAotCi0gICAgICAgIHdoaWxlIChpc2RpZ2l0KGl0OC0+Y2gpKSB7Ci0KLSAgICAgICAgICAgIGZyYWMgPSBmcmFjICogMTAuMCArIChpdDgtPmNoIC0gJzAnKTsKLSAgICAgICAgICAgIHByZWMrKzsKLSAgICAgICAgICAgIE5leHRDaChpdDgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaXQ4LT5kbnVtID0gaXQ4LT5kbnVtICsgKGZyYWMgLyB4cG93MTAocHJlYykpOwotICAgIH0KLQotICAgIC8vIEV4cG9uZW50LCBleGFtcGxlIDM0LjAwRSsyMAotICAgIGlmICh0b3VwcGVyKGl0OC0+Y2gpID09ICdFJykgewotCi0gICAgICAgIGNtc0ludDMyTnVtYmVyIGU7Ci0gICAgICAgIGNtc0ludDMyTnVtYmVyIHNnbjsKLQotICAgICAgICBOZXh0Q2goaXQ4KTsgc2duID0gMTsKLQotICAgICAgICBpZiAoaXQ4LT5jaCA9PSAnLScpIHsKLQotICAgICAgICAgICAgc2duID0gLTE7IE5leHRDaChpdDgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGlmIChpdDgtPmNoID09ICcrJykgewotCi0gICAgICAgICAgICAgICAgc2duID0gKzE7Ci0gICAgICAgICAgICAgICAgTmV4dENoKGl0OCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGUgPSAwOwotICAgICAgICAgICAgd2hpbGUgKGlzZGlnaXQoaXQ4LT5jaCkpIHsKLQotICAgICAgICAgICAgICAgIGlmICgoY21zRmxvYXQ2NE51bWJlcikgZSAqIDEwTCA8IChjbXNGbG9hdDY0TnVtYmVyKSArMjE0NzQ4MzY0Ny4wKQotICAgICAgICAgICAgICAgICAgICBlID0gZSAqIDEwICsgKGl0OC0+Y2ggLSAnMCcpOwotCi0gICAgICAgICAgICAgICAgTmV4dENoKGl0OCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGUgPSBzZ24qZTsKLSAgICAgICAgICAgIGl0OCAtPiBkbnVtID0gaXQ4IC0+IGRudW0gKiB4cG93MTAoZSk7Ci0gICAgfQotfQotCi0vLyBQYXJzZXMgYSBmbG9hdCBudW1iZXIKLS8vIFRoaXMgY2FuIG5vdCBjYWxsIGRpcmVjdGx5IGF0b2YgYmVjYXVzZSBpdCB1c2VzIGxvY2FsZSBkZXBlbmRhbnQKLS8vIHBhcnNpbmcsIHdoaWxlIENDTVggZmlsZXMgYWx3YXlzIHVzZSAuIGFzIGRlY2ltYWwgc2VwYXJhdG9yCi1zdGF0aWMKLWNtc0Zsb2F0NjROdW1iZXIgUGFyc2VGbG9hdE51bWJlcihjb25zdCBjaGFyICpCdWZmZXIpCi17Ci0gICAgY21zRmxvYXQ2NE51bWJlciBkbnVtID0gMC4wOwotICAgIGludCBzaWduID0gMTsKLQotICAgIC8vIGtlZXAgc2FmZQotICAgIGlmIChCdWZmZXIgPT0gTlVMTCkgcmV0dXJuIDAuMDsKLQotICAgIGlmICgqQnVmZmVyID09ICctJyB8fCAqQnVmZmVyID09ICcrJykgewotCi0gICAgICAgICBzaWduID0gKCpCdWZmZXIgPT0gJy0nKSA/IC0xIDogMTsKLSAgICAgICAgIEJ1ZmZlcisrOwotICAgIH0KLQotCi0gICAgd2hpbGUgKCpCdWZmZXIgJiYgaXNkaWdpdCgoaW50KSAqQnVmZmVyKSkgewotCi0gICAgICAgIGRudW0gPSBkbnVtICogMTAuMCArICgqQnVmZmVyIC0gJzAnKTsKLSAgICAgICAgaWYgKCpCdWZmZXIpIEJ1ZmZlcisrOwotICAgIH0KLQotICAgIGlmICgqQnVmZmVyID09ICcuJykgewotCi0gICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgZnJhYyA9IDAuMDsgICAgICAvLyBmcmFjdGlvbgotICAgICAgICBpbnQgcHJlYyA9IDA7ICAgICAgICAgICAgICAgICAgICAgLy8gcHJlY2lzc2lvbgotCi0gICAgICAgIGlmICgqQnVmZmVyKSBCdWZmZXIrKzsKLQotICAgICAgICB3aGlsZSAoKkJ1ZmZlciAmJiBpc2RpZ2l0KChpbnQpICpCdWZmZXIpKSB7Ci0KLSAgICAgICAgICAgIGZyYWMgPSBmcmFjICogMTAuMCArICgqQnVmZmVyIC0gJzAnKTsKLSAgICAgICAgICAgIHByZWMrKzsKLSAgICAgICAgICAgIGlmICgqQnVmZmVyKSBCdWZmZXIrKzsKLSAgICAgICAgfQotCi0gICAgICAgIGRudW0gPSBkbnVtICsgKGZyYWMgLyB4cG93MTAocHJlYykpOwotICAgIH0KLQotICAgIC8vIEV4cG9uZW50LCBleGFtcGxlIDM0LjAwRSsyMAotICAgIGlmICgqQnVmZmVyICYmIHRvdXBwZXIoKkJ1ZmZlcikgPT0gJ0UnKSB7Ci0KLSAgICAgICAgaW50IGU7Ci0gICAgICAgIGludCBzZ247Ci0KLSAgICAgICAgaWYgKCpCdWZmZXIpIEJ1ZmZlcisrOwotICAgICAgICBzZ24gPSAxOwotCi0gICAgICAgIGlmICgqQnVmZmVyID09ICctJykgewotCi0gICAgICAgICAgICBzZ24gPSAtMTsKLSAgICAgICAgICAgIGlmICgqQnVmZmVyKSBCdWZmZXIrKzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpZiAoKkJ1ZmZlciA9PSAnKycpIHsKLQotICAgICAgICAgICAgICAgIHNnbiA9ICsxOwotICAgICAgICAgICAgICAgIGlmICgqQnVmZmVyKSBCdWZmZXIrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZSA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoKkJ1ZmZlciAmJiBpc2RpZ2l0KChpbnQpICpCdWZmZXIpKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKGNtc0Zsb2F0NjROdW1iZXIpIGUgKiAxMEwgPCBJTlRfTUFYKQotICAgICAgICAgICAgICAgICAgICBlID0gZSAqIDEwICsgKCpCdWZmZXIgLSAnMCcpOwotCi0gICAgICAgICAgICAgICAgaWYgKCpCdWZmZXIpIEJ1ZmZlcisrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlID0gc2duKmU7Ci0gICAgICAgICAgICBkbnVtID0gZG51bSAqIHhwb3cxMChlKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc2lnbiAqIGRudW07Ci19Ci0KLQotLy8gUmVhZHMgbmV4dCBzeW1ib2wKLXN0YXRpYwotdm9pZCBJblN5bWJvbChjbXNJVDgqIGl0OCkKLXsKLSAgICByZWdpc3RlciBjaGFyICppZHB0cjsKLSAgICByZWdpc3RlciBpbnQgazsKLSAgICBTWU1CT0wga2V5OwotICAgIGludCBzbmc7Ci0gICAgCi0gICAgZG8gewotCi0gICAgICAgIHdoaWxlIChpc3NlcGFyYXRvcihpdDgtPmNoKSkKLSAgICAgICAgICAgIE5leHRDaChpdDgpOwotCi0gICAgICAgIGlmIChpc2ZpcnN0aWRjaGFyKGl0OC0+Y2gpKSB7ICAgICAgICAgIC8vIElkZW50aWZpZXIKLQotICAgICAgICAgICAgayA9IDA7Ci0gICAgICAgICAgICBpZHB0ciA9IGl0OC0+aWQ7Ci0KLSAgICAgICAgICAgIGRvIHsKLQotICAgICAgICAgICAgICAgIGlmICgrK2sgPCBNQVhJRCkgKmlkcHRyKysgPSAoY2hhcikgaXQ4LT5jaDsKLQotICAgICAgICAgICAgICAgIE5leHRDaChpdDgpOwotCi0gICAgICAgICAgICB9IHdoaWxlIChpc2lkY2hhcihpdDgtPmNoKSk7Ci0KLSAgICAgICAgICAgICppZHB0ciA9ICdcMCc7Ci0KLQotICAgICAgICAgICAga2V5ID0gQmluU3JjaEtleShpdDgtPmlkKTsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gU05PTkUpIGl0OC0+c3kgPSBTSURFTlQ7Ci0gICAgICAgICAgICBlbHNlIGl0OC0+c3kgPSBrZXk7Ci0KLSAgICAgICAgfQotICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIGEgbnVtYmVyPwotICAgICAgICAgICAgaWYgKGlzZGlnaXQoaXQ4LT5jaCkgfHwgaXQ4LT5jaCA9PSAnLicgfHwgaXQ4LT5jaCA9PSAnLScgfHwgaXQ4LT5jaCA9PSAnKycpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHNpZ24gPSAxOwotCi0gICAgICAgICAgICAgICAgaWYgKGl0OC0+Y2ggPT0gJy0nKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpZ24gPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgTmV4dENoKGl0OCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaXQ4LT5pbnVtID0gMDsKLSAgICAgICAgICAgICAgICBpdDgtPnN5ICAgPSBTSU5VTTsKLQotICAgICAgICAgICAgICAgIGlmIChpdDgtPmNoID09ICcwJykgeyAgICAgICAgICAvLyAweG5ubm4gKEhleGEpIG9yIDBibm5ubiAoQmluYXJ5KQotCi0gICAgICAgICAgICAgICAgICAgIE5leHRDaChpdDgpOwotICAgICAgICAgICAgICAgICAgICBpZiAodG91cHBlcihpdDgtPmNoKSA9PSAnWCcpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGo7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIE5leHRDaChpdDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlzeGRpZ2l0KGl0OC0+Y2gpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0OC0+Y2ggPSB0b3VwcGVyKGl0OC0+Y2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdDgtPmNoID49ICdBJyAmJiBpdDgtPmNoIDw9ICdGJykgIGogPSBpdDgtPmNoIC0nQScrMTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBqID0gaXQ4LT5jaCAtICcwJzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobG9uZykgaXQ4LT5pbnVtICogMTZMID4gKGxvbmcpIElOVF9NQVgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW5FcnJvcihpdDgsICJJbnZhbGlkIGhleGFkZWNpbWFsIG51bWJlciIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQ4LT5pbnVtID0gaXQ4LT5pbnVtICogMTYgKyBqOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5leHRDaChpdDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRvdXBwZXIoaXQ4LT5jaCkgPT0gJ0InKSB7ICAvLyBCaW5hcnkKLQotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGo7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIE5leHRDaChpdDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0OC0+Y2ggPT0gJzAnIHx8IGl0OC0+Y2ggPT0gJzEnKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGogPSBpdDgtPmNoIC0gJzAnOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsb25nKSBpdDgtPmludW0gKiAyTCA+IChsb25nKSBJTlRfTUFYKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luRXJyb3IoaXQ4LCAiSW52YWxpZCBiaW5hcnkgbnVtYmVyIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdDgtPmludW0gPSBpdDgtPmludW0gKiAyICsgajsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXh0Q2goaXQ4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAgICAgd2hpbGUgKGlzZGlnaXQoaXQ4LT5jaCkpIHsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoKGNtc0Zsb2F0NjROdW1iZXIpIGl0OC0+aW51bSAqIDEwTCA+IChjbXNGbG9hdDY0TnVtYmVyKSArMjE0NzQ4MzY0Ny4wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSZWFkUmVhbChpdDgsIGl0OC0+aW51bSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdDgtPnN5ID0gU0ROVU07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdDgtPmRudW0gKj0gc2lnbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGl0OC0+aW51bSA9IGl0OC0+aW51bSAqIDEwICsgKGl0OC0+Y2ggLSAnMCcpOwotICAgICAgICAgICAgICAgICAgICBOZXh0Q2goaXQ4KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXQ4LT5jaCA9PSAnLicpIHsKLQotICAgICAgICAgICAgICAgICAgICBSZWFkUmVhbChpdDgsIGl0OC0+aW51bSk7Ci0gICAgICAgICAgICAgICAgICAgIGl0OC0+c3kgPSBTRE5VTTsKLSAgICAgICAgICAgICAgICAgICAgaXQ4LT5kbnVtICo9IHNpZ247Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpdDggLT4gaW51bSAqPSBzaWduOwotCi0gICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlLiBOdW1iZXJzIGZvbGxvd2VkIGJ5IGxldHRlcnMgYXJlIHRha2VuIGFzIGlkZW50aWZpZXJzCi0KLSAgICAgICAgICAgICAgICBpZiAoaXNpZGNoYXIoaXQ4IC0+Y2gpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGl0OCAtPnN5ID09IFNJTlVNKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoaXQ4LT5pZCwgIiVkIiwgaXQ4LT5pbnVtKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihpdDgtPmlkLCBpdDggLT5Eb3VibGVGb3JtYXR0ZXIsIGl0OC0+ZG51bSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBrID0gKGludCkgc3RybGVuKGl0OCAtPmlkKTsKLSAgICAgICAgICAgICAgICAgICAgaWRwdHIgPSBpdDggLT5pZCArIGs7Ci0gICAgICAgICAgICAgICAgICAgIGRvIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrayA8IE1BWElEKSAqaWRwdHIrKyA9IChjaGFyKSBpdDgtPmNoOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBOZXh0Q2goaXQ4KTsKLQotICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChpc2lkY2hhcihpdDgtPmNoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgKmlkcHRyID0gJ1wwJzsKLSAgICAgICAgICAgICAgICAgICAgaXQ4LT5zeSA9IFNJREVOVDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc3dpdGNoICgoaW50KSBpdDgtPmNoKSB7Ci0KLSAgICAgICAgLy8gRU9GIG1hcmtlciAtLSBpZ25vcmUgaXQKLSAgICAgICAgY2FzZSAnXHgxYSc6Ci0gICAgICAgICAgICBOZXh0Q2goaXQ4KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIEVvZiBzdHJlYW0gbWFya2VycwotICAgICAgICBjYXNlIDA6Ci0gICAgICAgIGNhc2UgLTE6Ci0gICAgICAgICAgICBpdDgtPnN5ID0gU0VPRjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0KLSAgICAgICAgLy8gTmV4dCBsaW5lCi0gICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgIE5leHRDaChpdDgpOwotICAgICAgICAgICAgaWYgKGl0OCAtPmNoID09ICdcbicpIAotICAgICAgICAgICAgICAgIE5leHRDaChpdDgpOwotICAgICAgICAgICAgaXQ4LT5zeSA9IFNFT0xOOwotICAgICAgICAgICAgaXQ4LT5saW5lbm8rKzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICAgIE5leHRDaChpdDgpOwotICAgICAgICAgICAgaXQ4LT5zeSA9IFNFT0xOOwotICAgICAgICAgICAgaXQ4LT5saW5lbm8rKzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIENvbW1lbnQKLSAgICAgICAgY2FzZSAnIyc6Ci0gICAgICAgICAgICBOZXh0Q2goaXQ4KTsKLSAgICAgICAgICAgIHdoaWxlIChpdDgtPmNoICYmIGl0OC0+Y2ggIT0gJ1xuJyAmJiBpdDgtPmNoICE9ICdccicpCi0gICAgICAgICAgICAgICAgTmV4dENoKGl0OCk7Ci0KLSAgICAgICAgICAgIGl0OC0+c3kgPSBTQ09NTUVOVDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIFN0cmluZy4KLSAgICAgICAgY2FzZSAnXCcnOgotICAgICAgICBjYXNlICdcIic6Ci0gICAgICAgICAgICBpZHB0ciA9IGl0OC0+c3RyOwotICAgICAgICAgICAgc25nID0gaXQ4LT5jaDsKLSAgICAgICAgICAgIGsgPSAwOwotICAgICAgICAgICAgTmV4dENoKGl0OCk7Ci0KLSAgICAgICAgICAgIHdoaWxlIChrIDwgTUFYU1RSICYmIGl0OC0+Y2ggIT0gc25nKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXQ4LT5jaCA9PSAnXG4nfHwgaXQ4LT5jaCA9PSAnXHInKSBrID0gTUFYU1RSKzE7Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICppZHB0cisrID0gKGNoYXIpIGl0OC0+Y2g7Ci0gICAgICAgICAgICAgICAgICAgIE5leHRDaChpdDgpOwotICAgICAgICAgICAgICAgICAgICBrKys7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpdDgtPnN5ID0gU1NUUklORzsKLSAgICAgICAgICAgICppZHB0ciA9ICdcMCc7Ci0gICAgICAgICAgICBOZXh0Q2goaXQ4KTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFN5bkVycm9yKGl0OCwgIlVucmVjb2duaXplZCBjaGFyYWN0ZXI6IDB4JXgiLCBpdDggLT5jaCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICB9IHdoaWxlIChpdDgtPnN5ID09IFNDT01NRU5UKTsKLQotICAgIC8vIEhhbmRsZSB0aGUgaW5jbHVkZSBzcGVjaWFsIHRva2VuCi0KLSAgICBpZiAoaXQ4IC0+IHN5ID09IFNJTkNMVURFKSB7Ci0KLSAgICAgICAgICAgICAgICBGSUxFQ1RYKiBGaWxlTmVzdDsKLQotICAgICAgICAgICAgICAgIGlmKGl0OCAtPiBJbmNsdWRlU1AgPj0gKE1BWElOQ0xVREUtMSkpIHsKLQotICAgICAgICAgICAgICAgICAgICBTeW5FcnJvcihpdDgsICJUb28gbWFueSByZWN1cnNpb24gbGV2ZWxzIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBJblN5bWJvbChpdDgpOwotICAgICAgICAgICAgICAgIGlmICghQ2hlY2soaXQ4LCBTU1RSSU5HLCAiRmlsZW5hbWUgZXhwZWN0ZWQiKSkgcmV0dXJuOwotCi0gICAgICAgICAgICAgICAgRmlsZU5lc3QgPSBpdDggLT4gRmlsZVN0YWNrW2l0OCAtPiBJbmNsdWRlU1AgKyAxXTsKLSAgICAgICAgICAgICAgICBpZihGaWxlTmVzdCA9PSBOVUxMKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgRmlsZU5lc3QgPSBpdDggLT5GaWxlU3RhY2tbaXQ4IC0+IEluY2x1ZGVTUCArIDFdID0gKEZJTEVDVFgqKUFsbG9jQ2h1bmsoaXQ4LCBzaXplb2YoRklMRUNUWCkpOwotICAgICAgICAgICAgICAgICAgICAvL2lmKEZpbGVOZXN0ID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIC8vICBUT0RPOiBob3cgdG8gbWFuYWdlIG91dC1vZi1tZW1vcnkgY29uZGl0aW9ucz8KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoQnVpbGRBYnNvbHV0ZVBhdGgoaXQ4LT5zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0OC0+RmlsZVN0YWNrW2l0OC0+SW5jbHVkZVNQXS0+RmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVOZXN0LT5GaWxlTmFtZSwgY21zTUFYX1BBVEgtMSkgPT0gRkFMU0UpIHsKLSAgICAgICAgICAgICAgICAgICAgU3luRXJyb3IoaXQ4LCAiRmlsZSBwYXRoIHRvbyBsb25nIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBGaWxlTmVzdC0+U3RyZWFtID0gZm9wZW4oRmlsZU5lc3QtPkZpbGVOYW1lLCAicnQiKTsKLSAgICAgICAgICAgICAgICBpZiAoRmlsZU5lc3QtPlN0cmVhbSA9PSBOVUxMKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFN5bkVycm9yKGl0OCwgIkZpbGUgJXMgbm90IGZvdW5kIiwgRmlsZU5lc3QtPkZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaXQ4LT5JbmNsdWRlU1ArKzsKLQotICAgICAgICAgICAgICAgIGl0OCAtPmNoID0gJyAnOwotICAgICAgICAgICAgICAgIEluU3ltYm9sKGl0OCk7Ci0gICAgfQotCi19Ci0KLS8vIENoZWNrcyBlbmQgb2YgbGluZSBzZXBhcmF0b3IKLXN0YXRpYwotY21zQm9vbCBDaGVja0VPTE4oY21zSVQ4KiBpdDgpCi17Ci0gICAgICAgIGlmICghQ2hlY2soaXQ4LCBTRU9MTiwgIkV4cGVjdGVkIHNlcGFyYXRvciIpKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIHdoaWxlIChpdDggLT4gc3kgPT0gU0VPTE4pCi0gICAgICAgICAgICAgICAgICAgICAgICBJblN5bWJvbChpdDgpOwotICAgICAgICByZXR1cm4gVFJVRTsKLQotfQotCi0vLyBTa2lwIGEgc3ltYm9sCi0KLXN0YXRpYwotdm9pZCBTa2lwKGNtc0lUOCogaXQ4LCBTWU1CT0wgc3kpCi17Ci0gICAgICAgIGlmIChpdDgtPnN5ID09IHN5ICYmIGl0OC0+c3kgIT0gU0VPRikKLSAgICAgICAgICAgICAgICAgICAgICAgIEluU3ltYm9sKGl0OCk7Ci19Ci0KLQotLy8gU2tpcCBtdWx0aXBsZSBFT0xOCi1zdGF0aWMKLXZvaWQgU2tpcEVPTE4oY21zSVQ4KiBpdDgpCi17Ci0gICAgd2hpbGUgKGl0OC0+c3kgPT0gU0VPTE4pIHsKLSAgICAgICAgICAgICBJblN5bWJvbChpdDgpOwotICAgIH0KLX0KLQotCi0vLyBSZXR1cm5zIGEgc3RyaW5nIGhvbGRpbmcgY3VycmVudCB2YWx1ZQotc3RhdGljCi1jbXNCb29sIEdldFZhbChjbXNJVDgqIGl0OCwgY2hhciogQnVmZmVyLCBjbXNVSW50MzJOdW1iZXIgbWF4LCBjb25zdCBjaGFyKiBFcnJvclRpdGxlKQotewotICAgIHN3aXRjaCAoaXQ4LT5zeSkgewotCi0gICAgY2FzZSBTRU9MTjogICAvLyBFbXB0eSB2YWx1ZQotICAgICAgICAgICAgICAgICAgQnVmZmVyWzBdPTA7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICBjYXNlIFNJREVOVDogIHN0cm5jcHkoQnVmZmVyLCBpdDgtPmlkLCBtYXgpOwotICAgICAgICAgICAgICAgICAgQnVmZmVyW21heC0xXT0wOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBTSU5VTTogICBzbnByaW50ZihCdWZmZXIsIG1heCwgIiVkIiwgaXQ4IC0+IGludW0pOyBicmVhazsKLSAgICBjYXNlIFNETlVNOiAgIHNucHJpbnRmKEJ1ZmZlciwgbWF4LCBpdDgtPkRvdWJsZUZvcm1hdHRlciwgaXQ4IC0+IGRudW0pOyBicmVhazsKLSAgICBjYXNlIFNTVFJJTkc6IHN0cm5jcHkoQnVmZmVyLCBpdDgtPnN0ciwgbWF4KTsKLSAgICAgICAgICAgICAgICAgIEJ1ZmZlclttYXgtMV0gPSAwOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgICByZXR1cm4gU3luRXJyb3IoaXQ4LCAiJXMiLCBFcnJvclRpdGxlKTsKLSAgICB9Ci0KLSAgICBCdWZmZXJbbWF4XSA9IDA7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGFibGUKLQotc3RhdGljCi1UQUJMRSogR2V0VGFibGUoY21zSVQ4KiBpdDgpCi17Ci0gICBpZiAoKGl0OCAtPiBuVGFibGUgPj0gaXQ4IC0+VGFibGVzQ291bnQpKSB7Ci0KLSAgICAgICAgICAgU3luRXJyb3IoaXQ4LCAiVGFibGUgJWQgb3V0IG9mIHNlcXVlbmNlIiwgaXQ4IC0+IG5UYWJsZSk7Ci0gICAgICAgICAgIHJldHVybiBpdDggLT4gVGFiOwotICAgfQotCi0gICByZXR1cm4gaXQ4IC0+VGFiICsgaXQ4IC0+blRhYmxlOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1lbW9yeSBtYW5hZ2VtZW50Ci0KLQotLy8gRnJlZXMgYW4gYWxsb2NhdG9yIGFuZCBvd25lZCBtZW1vcnkKLXZvaWQgQ01TRVhQT1JUIGNtc0lUOEZyZWUoY21zSEFORExFIGhJVDgpCi17Ci0gICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OwotCi0gICAgaWYgKGl0OCA9PSBOVUxMKQotICAgICAgICByZXR1cm47Ci0KLSAgICBpZiAoaXQ4LT5NZW1vcnlTaW5rKSB7Ci0KLSAgICAgICAgT1dORURNRU0qIHA7Ci0gICAgICAgIE9XTkVETUVNKiBuOwotCi0gICAgICAgIGZvciAocCA9IGl0OC0+TWVtb3J5U2luazsgcCAhPSBOVUxMOyBwID0gbikgewotCi0gICAgICAgICAgICBuID0gcC0+TmV4dDsKLSAgICAgICAgICAgIGlmIChwLT5QdHIpIF9jbXNGcmVlKGl0OCAtPkNvbnRleHRJRCwgcC0+UHRyKTsKLSAgICAgICAgICAgIF9jbXNGcmVlKGl0OCAtPkNvbnRleHRJRCwgcCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoaXQ4LT5NZW1vcnlCbG9jaykKLSAgICAgICAgX2Ntc0ZyZWUoaXQ4IC0+Q29udGV4dElELCBpdDgtPk1lbW9yeUJsb2NrKTsKLQotICAgIF9jbXNGcmVlKGl0OCAtPkNvbnRleHRJRCwgaXQ4KTsKLX0KLQotCi0vLyBBbGxvY2F0ZXMgYSBjaHVuayBvZiBkYXRhLCBrZWVwIGxpbmtlZCBsaXN0Ci1zdGF0aWMKLXZvaWQqIEFsbG9jQmlnQmxvY2soY21zSVQ4KiBpdDgsIGNtc1VJbnQzMk51bWJlciBzaXplKQotewotICAgIE9XTkVETUVNKiBwdHIxOwotICAgIHZvaWQqIHB0ciA9IF9jbXNNYWxsb2NaZXJvKGl0OC0+Q29udGV4dElELCBzaXplKTsKLQotICAgIGlmIChwdHIgIT0gTlVMTCkgewotCi0gICAgICAgIHB0cjEgPSAoT1dORURNRU0qKSBfY21zTWFsbG9jWmVybyhpdDggLT5Db250ZXh0SUQsIHNpemVvZihPV05FRE1FTSkpOwotCi0gICAgICAgIGlmIChwdHIxID09IE5VTEwpIHsKLQotICAgICAgICAgICAgX2Ntc0ZyZWUoaXQ4IC0+Q29udGV4dElELCBwdHIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdHIxLT4gUHRyICAgICAgICA9IHB0cjsKLSAgICAgICAgcHRyMS0+IE5leHQgICAgICAgPSBpdDggLT4gTWVtb3J5U2luazsKLSAgICAgICAgaXQ4IC0+IE1lbW9yeVNpbmsgPSBwdHIxOwotICAgIH0KLQotICAgIHJldHVybiBwdHI7Ci19Ci0KLQotLy8gU3ViYWxsb2NhdG9yLgotc3RhdGljCi12b2lkKiBBbGxvY0NodW5rKGNtc0lUOCogaXQ4LCBjbXNVSW50MzJOdW1iZXIgc2l6ZSkKLXsKLSAgICBjbXNVSW50MzJOdW1iZXIgRnJlZSA9IGl0OCAtPkFsbG9jYXRvci5CbG9ja1NpemUgLSBpdDggLT5BbGxvY2F0b3IuVXNlZDsKLSAgICBjbXNVSW50OE51bWJlciogcHRyOwotCi0gICAgc2l6ZSA9IF9jbXNBTElHTk1FTShzaXplKTsKLQotICAgIGlmIChzaXplID4gRnJlZSkgewotCi0gICAgICAgIGlmIChpdDggLT4gQWxsb2NhdG9yLkJsb2NrU2l6ZSA9PSAwKQotCi0gICAgICAgICAgICAgICAgaXQ4IC0+IEFsbG9jYXRvci5CbG9ja1NpemUgPSAyMCoxMDI0OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaXQ4IC0+QWxsb2NhdG9yLkJsb2NrU2l6ZSAqPSAyOwotCi0gICAgICAgIGlmIChpdDggLT5BbGxvY2F0b3IuQmxvY2tTaXplIDwgc2l6ZSkKLSAgICAgICAgICAgICAgICBpdDggLT5BbGxvY2F0b3IuQmxvY2tTaXplID0gc2l6ZTsKLQotICAgICAgICBpdDggLT5BbGxvY2F0b3IuVXNlZCA9IDA7Ci0gICAgICAgIGl0OCAtPkFsbG9jYXRvci5CbG9jayA9IChjbXNVSW50OE51bWJlciopICBBbGxvY0JpZ0Jsb2NrKGl0OCwgaXQ4IC0+QWxsb2NhdG9yLkJsb2NrU2l6ZSk7Ci0gICAgfQotCi0gICAgcHRyID0gaXQ4IC0+QWxsb2NhdG9yLkJsb2NrICsgaXQ4IC0+QWxsb2NhdG9yLlVzZWQ7Ci0gICAgaXQ4IC0+QWxsb2NhdG9yLlVzZWQgKz0gc2l6ZTsKLQotICAgIHJldHVybiAodm9pZCopIHB0cjsKLQotfQotCi0KLS8vIEFsbG9jYXRlcyBhIHN0cmluZwotc3RhdGljCi1jaGFyICpBbGxvY1N0cmluZyhjbXNJVDgqIGl0OCwgY29uc3QgY2hhciogc3RyKQotewotICAgIGNtc1VJbnQzMk51bWJlciBTaXplID0gKGNtc1VJbnQzMk51bWJlcikgc3RybGVuKHN0cikrMTsKLSAgICBjaGFyICpwdHI7Ci0KLQotICAgIHB0ciA9IChjaGFyICopIEFsbG9jQ2h1bmsoaXQ4LCBTaXplKTsKLSAgICBpZiAocHRyKSBzdHJuY3B5IChwdHIsIHN0ciwgU2l6ZS0xKTsKLQotICAgIHJldHVybiBwdHI7Ci19Ci0KLS8vIFNlYXJjaGVzIHRocm91Z2ggbGlua2VkIGxpc3QKLQotc3RhdGljCi1jbXNCb29sIElzQXZhaWxhYmxlT25MaXN0KEtFWVZBTFVFKiBwLCBjb25zdCBjaGFyKiBLZXksIGNvbnN0IGNoYXIqIFN1YmtleSwgS0VZVkFMVUUqKiBMYXN0UHRyKQotewotICAgIGlmIChMYXN0UHRyKSAqTGFzdFB0ciA9IHA7Ci0KLSAgICBmb3IgKDsgIHAgIT0gTlVMTDsgcCA9IHAtPk5leHQpIHsKLQotICAgICAgICBpZiAoTGFzdFB0cikgKkxhc3RQdHIgPSBwOwotCi0gICAgICAgIGlmICgqS2V5ICE9ICcjJykgeyAvLyBDb21tZW50cyBhcmUgaWdub3JlZAotCi0gICAgICAgICAgICBpZiAoY21zc3RyY2FzZWNtcChLZXksIHAtPktleXdvcmQpID09IDApCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBpZiAoU3Via2V5ID09IDApCi0gICAgICAgIHJldHVybiBUUlVFOwotCi0gICAgZm9yICg7IHAgIT0gTlVMTDsgcCA9IHAtPk5leHRTdWJrZXkpIHsKLQotICAgICAgICBpZiAocCAtPlN1YmtleSA9PSBOVUxMKSBjb250aW51ZTsKLQotICAgICAgICBpZiAoTGFzdFB0cikgKkxhc3RQdHIgPSBwOwotCi0gICAgICAgIGlmIChjbXNzdHJjYXNlY21wKFN1YmtleSwgcC0+U3Via2V5KSA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgcmV0dXJuIEZBTFNFOwotfQotCi0KLQotLy8gQWRkIGEgcHJvcGVydHkgaW50byBhIGxpbmtlZCBsaXN0Ci1zdGF0aWMKLUtFWVZBTFVFKiBBZGRUb0xpc3QoY21zSVQ4KiBpdDgsIEtFWVZBTFVFKiogSGVhZCwgY29uc3QgY2hhciAqS2V5LCBjb25zdCBjaGFyICpTdWJrZXksIGNvbnN0IGNoYXIqIHhWYWx1ZSwgV1JJVEVNT0RFIFdyaXRlQXMpCi17Ci0gICAgS0VZVkFMVUUqIHA7Ci0gICAgS0VZVkFMVUUqIGxhc3Q7Ci0KLQotICAgIC8vIENoZWNrIGlmIHByb3BlcnR5IGlzIGFscmVhZHkgaW4gbGlzdAotCi0gICAgaWYgKElzQXZhaWxhYmxlT25MaXN0KCpIZWFkLCBLZXksIFN1YmtleSwgJnApKSB7Ci0KLSAgICAgICAgLy8gVGhpcyBtYXkgd29yayBmb3IgZWRpdGluZyBwcm9wZXJ0aWVzCi0KLSAgICAgICAgLy8gICAgIHJldHVybiBTeW5FcnJvcihpdDgsICJkdXBsaWNhdGUga2V5IDwlcz4iLCBLZXkpOwotICAgIH0KLSAgICBlbHNlIHsKLQotICAgICAgICBsYXN0ID0gcDsKLQotICAgICAgICAvLyBBbGxvY2F0ZSB0aGUgY29udGFpbmVyCi0gICAgICAgIHAgPSAoS0VZVkFMVUUqKSBBbGxvY0NodW5rKGl0OCwgc2l6ZW9mKEtFWVZBTFVFKSk7Ci0gICAgICAgIGlmIChwID09IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5bkVycm9yKGl0OCwgIkFkZFRvTGlzdDogb3V0IG9mIG1lbW9yeSIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdG9yZSBuYW1lIGFuZCB2YWx1ZQotICAgICAgICBwLT5LZXl3b3JkID0gQWxsb2NTdHJpbmcoaXQ4LCBLZXkpOwotICAgICAgICBwLT5TdWJrZXkgPSAoU3Via2V5ID09IE5VTEwpID8gTlVMTCA6IEFsbG9jU3RyaW5nKGl0OCwgU3Via2V5KTsKLQotICAgICAgICAvLyBLZWVwIHRoZSBjb250YWluZXIgaW4gb3VyIGxpc3QKLSAgICAgICAgaWYgKCpIZWFkID09IE5VTEwpIHsKLSAgICAgICAgICAgICpIZWFkID0gcDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChTdWJrZXkgIT0gTlVMTCAmJiBsYXN0ICE9IE5VTEwpIHsKLQotICAgICAgICAgICAgICAgIGxhc3QtPk5leHRTdWJrZXkgPSBwOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgU3Via2V5IGlzIG5vdCBudWxsLCB0aGVuIGxhc3QgaXMgdGhlIGxhc3QgcHJvcGVydHkgd2l0aCB0aGUgc2FtZSBrZXksCi0gICAgICAgICAgICAgICAgLy8gYnV0IG5vdCBuZWNlc3NhcmlseSBpcyB0aGUgbGFzdCBwcm9wZXJ0eSBpbiB0aGUgbGlzdCwgc28gd2UgbmVlZCB0byBtb3ZlCi0gICAgICAgICAgICAgICAgLy8gdG8gdGhlIGFjdHVhbCBsaXN0IGVuZAotICAgICAgICAgICAgICAgIHdoaWxlIChsYXN0LT5OZXh0ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGxhc3QtPk5leHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChsYXN0ICE9IE5VTEwpIGxhc3QtPk5leHQgPSBwOwotICAgICAgICB9Ci0KLSAgICAgICAgcC0+TmV4dCAgICA9IE5VTEw7Ci0gICAgICAgIHAtPk5leHRTdWJrZXkgPSBOVUxMOwotICAgIH0KLQotICAgIHAtPldyaXRlQXMgPSBXcml0ZUFzOwotCi0gICAgaWYgKHhWYWx1ZSAhPSBOVUxMKSB7Ci0KLSAgICAgICAgcC0+VmFsdWUgICA9IEFsbG9jU3RyaW5nKGl0OCwgeFZhbHVlKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHAtPlZhbHVlICAgPSBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBwOwotfQotCi1zdGF0aWMKLUtFWVZBTFVFKiBBZGRBdmFpbGFibGVQcm9wZXJ0eShjbXNJVDgqIGl0OCwgY29uc3QgY2hhciogS2V5LCBXUklURU1PREUgYXMpCi17Ci0gICAgcmV0dXJuIEFkZFRvTGlzdChpdDgsICZpdDgtPlZhbGlkS2V5d29yZHMsIEtleSwgTlVMTCwgTlVMTCwgYXMpOwotfQotCi0KLXN0YXRpYwotS0VZVkFMVUUqIEFkZEF2YWlsYWJsZVNhbXBsZUlEKGNtc0lUOCogaXQ4LCBjb25zdCBjaGFyKiBLZXkpCi17Ci0gICAgcmV0dXJuIEFkZFRvTGlzdChpdDgsICZpdDgtPlZhbGlkU2FtcGxlSUQsIEtleSwgTlVMTCwgTlVMTCwgV1JJVEVfVU5DT09LRUQpOwotfQotCi0KLXN0YXRpYwotdm9pZCBBbGxvY1RhYmxlKGNtc0lUOCogaXQ4KQotewotICAgIFRBQkxFKiB0OwotCi0gICAgdCA9IGl0OCAtPlRhYiArIGl0OCAtPlRhYmxlc0NvdW50OwotCi0gICAgdC0+SGVhZGVyTGlzdCA9IE5VTEw7Ci0gICAgdC0+RGF0YUZvcm1hdCA9IE5VTEw7Ci0gICAgdC0+RGF0YSAgICAgICA9IE5VTEw7Ci0KLSAgICBpdDggLT5UYWJsZXNDb3VudCsrOwotfQotCi0KLWNtc0ludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNJVDhTZXRUYWJsZShjbXNIQU5ETEUgIElUOCwgY21zVUludDMyTnVtYmVyIG5UYWJsZSkKLXsKLSAgICAgY21zSVQ4KiBpdDggPSAoY21zSVQ4KikgSVQ4OwotCi0gICAgIGlmIChuVGFibGUgPj0gaXQ4IC0+VGFibGVzQ291bnQpIHsKLQotICAgICAgICAgaWYgKG5UYWJsZSA9PSBpdDggLT5UYWJsZXNDb3VudCkgewotCi0gICAgICAgICAgICAgQWxsb2NUYWJsZShpdDgpOwotICAgICAgICAgfQotICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgU3luRXJyb3IoaXQ4LCAiVGFibGUgJWQgaXMgb3V0IG9mIHNlcXVlbmNlIiwgblRhYmxlKTsKLSAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICB9Ci0gICAgIH0KLQotICAgICBpdDggLT5uVGFibGUgPSBuVGFibGU7Ci0KLSAgICAgcmV0dXJuIChjbXNJbnQzMk51bWJlcikgblRhYmxlOwotfQotCi0KLQotLy8gSW5pdCBhbiBlbXB0eSBjb250YWluZXIKLWNtc0hBTkRMRSAgQ01TRVhQT1JUIGNtc0lUOEFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElEKQotewotICAgIGNtc0lUOCogaXQ4OwotICAgIGNtc1VJbnQzMk51bWJlciBpOwotCi0gICAgaXQ4ID0gKGNtc0lUOCopIF9jbXNNYWxsb2NaZXJvKENvbnRleHRJRCwgc2l6ZW9mKGNtc0lUOCkpOwotICAgIGlmIChpdDggPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBBbGxvY1RhYmxlKGl0OCk7Ci0KLSAgICBpdDgtPk1lbW9yeUJsb2NrID0gTlVMTDsKLSAgICBpdDgtPk1lbW9yeVNpbmsgID0gTlVMTDsKLQotICAgIGl0OCAtPm5UYWJsZSA9IDA7Ci0KLSAgICBpdDgtPkNvbnRleHRJRCA9IENvbnRleHRJRDsKLSAgICBpdDgtPkFsbG9jYXRvci5Vc2VkID0gMDsKLSAgICBpdDgtPkFsbG9jYXRvci5CbG9jayA9IE5VTEw7Ci0gICAgaXQ4LT5BbGxvY2F0b3IuQmxvY2tTaXplID0gMDsKLQotICAgIGl0OC0+VmFsaWRLZXl3b3JkcyA9IE5VTEw7Ci0gICAgaXQ4LT5WYWxpZFNhbXBsZUlEID0gTlVMTDsKLQotICAgIGl0OCAtPiBzeSA9IFNOT05FOwotICAgIGl0OCAtPiBjaCA9ICcgJzsKLSAgICBpdDggLT4gU291cmNlID0gTlVMTDsKLSAgICBpdDggLT4gaW51bSA9IDA7Ci0gICAgaXQ4IC0+IGRudW0gPSAwLjA7Ci0KLSAgICBpdDgtPkZpbGVTdGFja1swXSA9IChGSUxFQ1RYKilBbGxvY0NodW5rKGl0OCwgc2l6ZW9mKEZJTEVDVFgpKTsKLSAgICBpdDgtPkluY2x1ZGVTUCAgID0gMDsKLSAgICBpdDggLT4gbGluZW5vID0gMTsKLQotICAgIHN0cmNweShpdDgtPkRvdWJsZUZvcm1hdHRlciwgREVGQVVMVF9EQkxfRk9STUFUKTsKLSAgICBjbXNJVDhTZXRTaGVldFR5cGUoKGNtc0hBTkRMRSkgaXQ4LCAiQ0dBVFMuMTciKTsKLQotICAgIC8vIEluaXRpYWxpemUgcHJlZGVmaW5lZCBwcm9wZXJ0aWVzICYgZGF0YQotCi0gICAgZm9yIChpPTA7IGkgPCBOVU1QUkVERUZJTkVEUFJPUFM7IGkrKykKLSAgICAgICAgICAgIEFkZEF2YWlsYWJsZVByb3BlcnR5KGl0OCwgUHJlZGVmaW5lZFByb3BlcnRpZXNbaV0uaWQsIFByZWRlZmluZWRQcm9wZXJ0aWVzW2ldLmFzKTsKLQotICAgIGZvciAoaT0wOyBpIDwgTlVNUFJFREVGSU5FRFNBTVBMRUlEOyBpKyspCi0gICAgICAgICAgICBBZGRBdmFpbGFibGVTYW1wbGVJRChpdDgsIFByZWRlZmluZWRTYW1wbGVJRFtpXSk7Ci0KLQotICAgcmV0dXJuIChjbXNIQU5ETEUpIGl0ODsKLX0KLQotCi1jb25zdCBjaGFyKiBDTVNFWFBPUlQgY21zSVQ4R2V0U2hlZXRUeXBlKGNtc0hBTkRMRSBoSVQ4KQotewotICAgICAgICByZXR1cm4gR2V0VGFibGUoKGNtc0lUOCopIGhJVDgpLT5TaGVldFR5cGU7Ci19Ci0KLWNtc0Jvb2wgQ01TRVhQT1JUIGNtc0lUOFNldFNoZWV0VHlwZShjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciogVHlwZSkKLXsKLSAgICAgICAgVEFCTEUqIHQgPSBHZXRUYWJsZSgoY21zSVQ4KikgaElUOCk7Ci0KLSAgICAgICAgc3RybmNweSh0IC0+U2hlZXRUeXBlLCBUeXBlLCBNQVhTVFItMSk7Ci0gICAgICAgIHQgLT5TaGVldFR5cGVbTUFYU1RSLTFdID0gMDsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWNtc0Jvb2wgQ01TRVhQT1JUIGNtc0lUOFNldENvbW1lbnQoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIFZhbCkKLXsKLSAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OwotCi0gICAgaWYgKCFWYWwpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoISpWYWwpIHJldHVybiBGQUxTRTsKLQotICAgIHJldHVybiBBZGRUb0xpc3QoaXQ4LCAmR2V0VGFibGUoaXQ4KS0+SGVhZGVyTGlzdCwgIiMgIiwgTlVMTCwgVmFsLCBXUklURV9VTkNPT0tFRCkgIT0gTlVMTDsKLX0KLQotLy8gU2V0cyBhIHByb3BlcnR5Ci1jbXNCb29sIENNU0VYUE9SVCBjbXNJVDhTZXRQcm9wZXJ0eVN0cihjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciogS2V5LCBjb25zdCBjaGFyICpWYWwpCi17Ci0gICAgY21zSVQ4KiBpdDggPSAoY21zSVQ4KikgaElUODsKLQotICAgIGlmICghVmFsKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCEqVmFsKSByZXR1cm4gRkFMU0U7Ci0KLSAgICByZXR1cm4gQWRkVG9MaXN0KGl0OCwgJkdldFRhYmxlKGl0OCktPkhlYWRlckxpc3QsIEtleSwgTlVMTCwgVmFsLCBXUklURV9TVFJJTkdJRlkpICE9IE5VTEw7Ci19Ci0KLWNtc0Jvb2wgQ01TRVhQT1JUIGNtc0lUOFNldFByb3BlcnR5RGJsKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBjUHJvcCwgY21zRmxvYXQ2NE51bWJlciBWYWwpCi17Ci0gICAgY21zSVQ4KiBpdDggPSAoY21zSVQ4KikgaElUODsKLSAgICBjaGFyIEJ1ZmZlclsxMDI0XTsKLQotICAgIHNwcmludGYoQnVmZmVyLCBpdDgtPkRvdWJsZUZvcm1hdHRlciwgVmFsKTsKLQotICAgIHJldHVybiBBZGRUb0xpc3QoaXQ4LCAmR2V0VGFibGUoaXQ4KS0+SGVhZGVyTGlzdCwgY1Byb3AsIE5VTEwsIEJ1ZmZlciwgV1JJVEVfVU5DT09LRUQpICE9IE5VTEw7Ci19Ci0KLWNtc0Jvb2wgQ01TRVhQT1JUIGNtc0lUOFNldFByb3BlcnR5SGV4KGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBjUHJvcCwgY21zVUludDMyTnVtYmVyIFZhbCkKLXsKLSAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OwotICAgIGNoYXIgQnVmZmVyWzEwMjRdOwotCi0gICAgc3ByaW50ZihCdWZmZXIsICIldSIsIFZhbCk7Ci0KLSAgICByZXR1cm4gQWRkVG9MaXN0KGl0OCwgJkdldFRhYmxlKGl0OCktPkhlYWRlckxpc3QsIGNQcm9wLCBOVUxMLCBCdWZmZXIsIFdSSVRFX0hFWEFERUNJTUFMKSAhPSBOVUxMOwotfQotCi1jbXNCb29sIENNU0VYUE9SVCBjbXNJVDhTZXRQcm9wZXJ0eVVuY29va2VkKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBLZXksIGNvbnN0IGNoYXIqIEJ1ZmZlcikKLXsKLSAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OwotCi0gICAgcmV0dXJuIEFkZFRvTGlzdChpdDgsICZHZXRUYWJsZShpdDgpLT5IZWFkZXJMaXN0LCBLZXksIE5VTEwsIEJ1ZmZlciwgV1JJVEVfVU5DT09LRUQpICE9IE5VTEw7Ci19Ci0KLWNtc0Jvb2wgQ01TRVhQT1JUIGNtc0lUOFNldFByb3BlcnR5TXVsdGkoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIEtleSwgY29uc3QgY2hhciogU3ViS2V5LCBjb25zdCBjaGFyICpCdWZmZXIpCi17Ci0gICAgY21zSVQ4KiBpdDggPSAoY21zSVQ4KikgaElUODsKLQotICAgIHJldHVybiBBZGRUb0xpc3QoaXQ4LCAmR2V0VGFibGUoaXQ4KS0+SGVhZGVyTGlzdCwgS2V5LCBTdWJLZXksIEJ1ZmZlciwgV1JJVEVfUEFJUikgIT0gTlVMTDsKLX0KLQotLy8gR2V0cyBhIHByb3BlcnR5Ci1jb25zdCBjaGFyKiBDTVNFWFBPUlQgY21zSVQ4R2V0UHJvcGVydHkoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIEtleSkKLXsKLSAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OwotICAgIEtFWVZBTFVFKiBwOwotCi0gICAgaWYgKElzQXZhaWxhYmxlT25MaXN0KEdldFRhYmxlKGl0OCkgLT4gSGVhZGVyTGlzdCwgS2V5LCBOVUxMLCAmcCkpCi0gICAgewotICAgICAgICByZXR1cm4gcCAtPiBWYWx1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotY21zRmxvYXQ2NE51bWJlciBDTVNFWFBPUlQgY21zSVQ4R2V0UHJvcGVydHlEYmwoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIGNQcm9wKQotewotICAgIGNvbnN0IGNoYXIgKnYgPSBjbXNJVDhHZXRQcm9wZXJ0eShoSVQ4LCBjUHJvcCk7Ci0KLSAgICBpZiAodiA9PSBOVUxMKSByZXR1cm4gMC4wOwotCi0gICAgcmV0dXJuIFBhcnNlRmxvYXROdW1iZXIodik7Ci19Ci0KLWNvbnN0IGNoYXIqIENNU0VYUE9SVCBjbXNJVDhHZXRQcm9wZXJ0eU11bHRpKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBLZXksIGNvbnN0IGNoYXIgKlN1YktleSkKLXsKLSAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OwotICAgIEtFWVZBTFVFKiBwOwotCi0gICAgaWYgKElzQXZhaWxhYmxlT25MaXN0KEdldFRhYmxlKGl0OCkgLT4gSGVhZGVyTGlzdCwgS2V5LCBTdWJLZXksICZwKSkgewotICAgICAgICByZXR1cm4gcCAtPiBWYWx1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIERhdGFzZXRzCi0KLQotc3RhdGljCi12b2lkIEFsbG9jYXRlRGF0YUZvcm1hdChjbXNJVDgqIGl0OCkKLXsKLSAgICBUQUJMRSogdCA9IEdldFRhYmxlKGl0OCk7Ci0KLSAgICBpZiAodCAtPiBEYXRhRm9ybWF0KSByZXR1cm47ICAgIC8vIEFscmVhZHkgYWxsb2NhdGVkCi0KLSAgICB0IC0+IG5TYW1wbGVzICA9IChpbnQpIGNtc0lUOEdldFByb3BlcnR5RGJsKGl0OCwgIk5VTUJFUl9PRl9GSUVMRFMiKTsKLQotICAgIGlmICh0IC0+IG5TYW1wbGVzIDw9IDApIHsKLQotICAgICAgICBTeW5FcnJvcihpdDgsICJBbGxvY2F0ZURhdGFGb3JtYXQ6IFVua25vd24gTlVNQkVSX09GX0ZJRUxEUyIpOwotICAgICAgICB0IC0+IG5TYW1wbGVzID0gMTA7Ci0gICAgICAgIH0KLQotICAgIHQgLT4gRGF0YUZvcm1hdCA9IChjaGFyKiopIEFsbG9jQ2h1bmsgKGl0OCwgKChjbXNVSW50MzJOdW1iZXIpIHQtPm5TYW1wbGVzICsgMSkgKiBzaXplb2YoY2hhciAqKSk7Ci0gICAgaWYgKHQtPkRhdGFGb3JtYXQgPT0gTlVMTCkgewotCi0gICAgICAgIFN5bkVycm9yKGl0OCwgIkFsbG9jYXRlRGF0YUZvcm1hdDogVW5hYmxlIHRvIGFsbG9jYXRlIGRhdGFGb3JtYXQgYXJyYXkiKTsKLSAgICB9Ci0KLX0KLQotc3RhdGljCi1jb25zdCBjaGFyICpHZXREYXRhRm9ybWF0KGNtc0lUOCogaXQ4LCBpbnQgbikKLXsKLSAgICBUQUJMRSogdCA9IEdldFRhYmxlKGl0OCk7Ci0KLSAgICBpZiAodC0+RGF0YUZvcm1hdCkKLSAgICAgICAgcmV0dXJuIHQtPkRhdGFGb3JtYXRbbl07Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljCi1jbXNCb29sIFNldERhdGFGb3JtYXQoY21zSVQ4KiBpdDgsIGludCBuLCBjb25zdCBjaGFyICpsYWJlbCkKLXsKLSAgICBUQUJMRSogdCA9IEdldFRhYmxlKGl0OCk7Ci0KLSAgICBpZiAoIXQtPkRhdGFGb3JtYXQpCi0gICAgICAgIEFsbG9jYXRlRGF0YUZvcm1hdChpdDgpOwotCi0gICAgaWYgKG4gPiB0IC0+IG5TYW1wbGVzKSB7Ci0gICAgICAgIFN5bkVycm9yKGl0OCwgIk1vcmUgdGhhbiBOVU1CRVJfT0ZfRklFTERTIGZpZWxkcy4iKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIGlmICh0LT5EYXRhRm9ybWF0KSB7Ci0gICAgICAgIHQtPkRhdGFGb3JtYXRbbl0gPSBBbGxvY1N0cmluZyhpdDgsIGxhYmVsKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi1jbXNCb29sIENNU0VYUE9SVCBjbXNJVDhTZXREYXRhRm9ybWF0KGNtc0hBTkRMRSAgaCwgaW50IG4sIGNvbnN0IGNoYXIgKlNhbXBsZSkKLXsKLSAgICAgICAgY21zSVQ4KiBpdDggPSAoY21zSVQ4KikgaDsKLSAgICAgICAgcmV0dXJuIFNldERhdGFGb3JtYXQoaXQ4LCBuLCBTYW1wbGUpOwotfQotCi1zdGF0aWMKLXZvaWQgQWxsb2NhdGVEYXRhU2V0KGNtc0lUOCogaXQ4KQotewotICAgIFRBQkxFKiB0ID0gR2V0VGFibGUoaXQ4KTsKLQotICAgIGlmICh0IC0+IERhdGEpIHJldHVybjsgICAgLy8gQWxyZWFkeSBhbGxvY2F0ZWQKLQotICAgIHQtPiBuU2FtcGxlcyAgID0gYXRvaShjbXNJVDhHZXRQcm9wZXJ0eShpdDgsICJOVU1CRVJfT0ZfRklFTERTIikpOwotICAgIHQtPiBuUGF0Y2hlcyAgID0gYXRvaShjbXNJVDhHZXRQcm9wZXJ0eShpdDgsICJOVU1CRVJfT0ZfU0VUUyIpKTsKLQotICAgIHQtPiBEYXRhID0gKGNoYXIqKilBbGxvY0NodW5rIChpdDgsICgoY21zVUludDMyTnVtYmVyKSB0LT5uU2FtcGxlcyArIDEpICogKChjbXNVSW50MzJOdW1iZXIpIHQtPm5QYXRjaGVzICsgMSkgKnNpemVvZiAoY2hhciopKTsKLSAgICBpZiAodC0+RGF0YSA9PSBOVUxMKSB7Ci0KLSAgICAgICAgU3luRXJyb3IoaXQ4LCAiQWxsb2NhdGVEYXRhU2V0OiBVbmFibGUgdG8gYWxsb2NhdGUgZGF0YSBhcnJheSIpOwotICAgIH0KLQotfQotCi1zdGF0aWMKLWNoYXIqIEdldERhdGEoY21zSVQ4KiBpdDgsIGludCBuU2V0LCBpbnQgbkZpZWxkKQotewotICAgIFRBQkxFKiB0ID0gR2V0VGFibGUoaXQ4KTsKLSAgICBpbnQgIG5TYW1wbGVzICAgPSB0IC0+IG5TYW1wbGVzOwotICAgIGludCAgblBhdGNoZXMgICA9IHQgLT4gblBhdGNoZXM7Ci0KLSAgICBpZiAoblNldCA+PSBuUGF0Y2hlcyB8fCBuRmllbGQgPj0gblNhbXBsZXMpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgaWYgKCF0LT5EYXRhKSByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gdC0+RGF0YSBbblNldCAqIG5TYW1wbGVzICsgbkZpZWxkXTsKLX0KLQotc3RhdGljCi1jbXNCb29sIFNldERhdGEoY21zSVQ4KiBpdDgsIGludCBuU2V0LCBpbnQgbkZpZWxkLCBjb25zdCBjaGFyICpWYWwpCi17Ci0gICAgVEFCTEUqIHQgPSBHZXRUYWJsZShpdDgpOwotCi0gICAgaWYgKCF0LT5EYXRhKQotICAgICAgICBBbGxvY2F0ZURhdGFTZXQoaXQ4KTsKLQotICAgIGlmICghdC0+RGF0YSkgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKG5TZXQgPiB0IC0+IG5QYXRjaGVzIHx8IG5TZXQgPCAwKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBTeW5FcnJvcihpdDgsICJQYXRjaCAlZCBvdXQgb2YgcmFuZ2UsIHRoZXJlIGFyZSAlZCBwYXRjaGVzIiwgblNldCwgdCAtPiBuUGF0Y2hlcyk7Ci0gICAgfQotCi0gICAgaWYgKG5GaWVsZCA+IHQgLT5uU2FtcGxlcyB8fCBuRmllbGQgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3luRXJyb3IoaXQ4LCAiU2FtcGxlICVkIG91dCBvZiByYW5nZSwgdGhlcmUgYXJlICVkIHNhbXBsZXMiLCBuRmllbGQsIHQgLT5uU2FtcGxlcyk7Ci0KLSAgICB9Ci0KLSAgICB0LT5EYXRhIFtuU2V0ICogdCAtPiBuU2FtcGxlcyArIG5GaWVsZF0gPSBBbGxvY1N0cmluZyhpdDgsIFZhbCk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpbGUgSS9PCi0KLQotLy8gV3JpdGVzIGEgc3RyaW5nIHRvIGZpbGUKLXN0YXRpYwotdm9pZCBXcml0ZVN0cihTQVZFU1RSRUFNKiBmLCBjb25zdCBjaGFyICpzdHIpCi17Ci0gICAgY21zVUludDMyTnVtYmVyIGxlbjsKLQotICAgIGlmIChzdHIgPT0gTlVMTCkKLSAgICAgICAgc3RyID0gIiAiOwotCi0gICAgLy8gTGVuZ3RoIHRvIHdyaXRlCi0gICAgbGVuID0gKGNtc1VJbnQzMk51bWJlcikgc3RybGVuKHN0cik7Ci0gICAgZiAtPlVzZWQgKz0gbGVuOwotCi0KLSAgICBpZiAoZiAtPnN0cmVhbSkgeyAgIC8vIFNob3VsZCBJIHdyaXRlIGl0IHRvIGEgZmlsZT8KLQotICAgICAgICBpZiAoZndyaXRlKHN0ciwgMSwgbGVuLCBmLT5zdHJlYW0pICE9IGxlbikgewotICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoMCwgY21zRVJST1JfV1JJVEUsICJXcml0ZSB0byBmaWxlIGVycm9yIGluIENHQVRTIHBhcnNlciIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZSB7ICAvLyBPciB0byBhIG1lbW9yeSBibG9jaz8KLQotICAgICAgICBpZiAoZiAtPkJhc2UpIHsgICAvLyBBbSBJIGp1c3QgY291bnRpbmcgdGhlIGJ5dGVzPwotCi0gICAgICAgICAgICBpZiAoZiAtPlVzZWQgPiBmIC0+TWF4KSB7Ci0KLSAgICAgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoMCwgY21zRVJST1JfV1JJVEUsICJXcml0ZSB0byBtZW1vcnkgb3ZlcmZsb3dzIGluIENHQVRTIHBhcnNlciIpOwotICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1lbW1vdmUoZiAtPlB0ciwgc3RyLCBsZW4pOwotICAgICAgICAgICAgZi0+UHRyICs9IGxlbjsKLSAgICAgICAgfQotCi0gICAgfQotfQotCi0KLS8vIFdyaXRlIGZvcm1hdHRlZAotCi1zdGF0aWMKLXZvaWQgV3JpdGVmKFNBVkVTVFJFQU0qIGYsIGNvbnN0IGNoYXIqIGZybSwgLi4uKQotewotICAgIGNoYXIgQnVmZmVyWzQwOTZdOwotICAgIHZhX2xpc3QgYXJnczsKLQotICAgIHZhX3N0YXJ0KGFyZ3MsIGZybSk7Ci0gICAgdnNucHJpbnRmKEJ1ZmZlciwgNDA5NSwgZnJtLCBhcmdzKTsKLSAgICBCdWZmZXJbNDA5NV0gPSAwOwotICAgIFdyaXRlU3RyKGYsIEJ1ZmZlcik7Ci0gICAgdmFfZW5kKGFyZ3MpOwotCi19Ci0KLS8vIFdyaXRlcyBmdWxsIGhlYWRlcgotc3RhdGljCi12b2lkIFdyaXRlSGVhZGVyKGNtc0lUOCogaXQ4LCBTQVZFU1RSRUFNKiBmcCkKLXsKLSAgICBLRVlWQUxVRSogcDsKLSAgICBUQUJMRSogdCA9IEdldFRhYmxlKGl0OCk7Ci0KLSAgICAvLyBXcml0ZXMgdGhlIHR5cGUKLSAgICBXcml0ZVN0cihmcCwgdC0+U2hlZXRUeXBlKTsKLSAgICBXcml0ZVN0cihmcCwgIlxuIik7Ci0KLSAgICBmb3IgKHAgPSB0LT5IZWFkZXJMaXN0OyAocCAhPSBOVUxMKTsgcCA9IHAtPk5leHQpCi0gICAgewotICAgICAgICBpZiAoKnAgLT5LZXl3b3JkID09ICcjJykgewotCi0gICAgICAgICAgICBjaGFyKiBQdDsKLQotICAgICAgICAgICAgV3JpdGVTdHIoZnAsICIjXG4jICIpOwotICAgICAgICAgICAgZm9yIChQdCA9IHAgLT5WYWx1ZTsgKlB0OyBQdCsrKSB7Ci0KLQotICAgICAgICAgICAgICAgIFdyaXRlZihmcCwgIiVjIiwgKlB0KTsKLQotICAgICAgICAgICAgICAgIGlmICgqUHQgPT0gJ1xuJykgewotICAgICAgICAgICAgICAgICAgICBXcml0ZVN0cihmcCwgIiMgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBXcml0ZVN0cihmcCwgIlxuI1xuIik7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYgKCFJc0F2YWlsYWJsZU9uTGlzdChpdDgtPiBWYWxpZEtleXdvcmRzLCBwLT5LZXl3b3JkLCBOVUxMLCBOVUxMKSkgewotCi0jaWZkZWYgQ01TX1NUUklDVF9DR0FUUwotICAgICAgICAgICAgV3JpdGVTdHIoZnAsICJLRVlXT1JEXHRcIiIpOwotICAgICAgICAgICAgV3JpdGVTdHIoZnAsIHAtPktleXdvcmQpOwotICAgICAgICAgICAgV3JpdGVTdHIoZnAsICJcIlxuIik7Ci0jZW5kaWYKLQotICAgICAgICAgICAgQWRkQXZhaWxhYmxlUHJvcGVydHkoaXQ4LCBwLT5LZXl3b3JkLCBXUklURV9VTkNPT0tFRCk7Ci0gICAgICAgIH0KLQotICAgICAgICBXcml0ZVN0cihmcCwgcC0+S2V5d29yZCk7Ci0gICAgICAgIGlmIChwLT5WYWx1ZSkgewotCi0gICAgICAgICAgICBzd2l0Y2ggKHAgLT5Xcml0ZUFzKSB7Ci0KLSAgICAgICAgICAgIGNhc2UgV1JJVEVfVU5DT09LRUQ6Ci0gICAgICAgICAgICAgICAgICAgIFdyaXRlZihmcCwgIlx0JXMiLCBwIC0+VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBXUklURV9TVFJJTkdJRlk6Ci0gICAgICAgICAgICAgICAgICAgIFdyaXRlZihmcCwgIlx0XCIlc1wiIiwgcC0+VmFsdWUgKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgV1JJVEVfSEVYQURFQ0lNQUw6Ci0gICAgICAgICAgICAgICAgICAgIFdyaXRlZihmcCwgIlx0MHglWCIsIGF0b2kocCAtPlZhbHVlKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFdSSVRFX0JJTkFSWToKLSAgICAgICAgICAgICAgICAgICAgV3JpdGVmKGZwLCAiXHQweCVCIiwgYXRvaShwIC0+VmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgV1JJVEVfUEFJUjoKLSAgICAgICAgICAgICAgICAgICAgV3JpdGVmKGZwLCAiXHRcIiVzLCVzXCIiLCBwLT5TdWJrZXksIHAtPlZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6IFN5bkVycm9yKGl0OCwgIlVua25vd24gd3JpdGUgbW9kZSAlZCIsIHAgLT5Xcml0ZUFzKTsKLSAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFdyaXRlU3RyIChmcCwgIlxuIik7Ci0gICAgfQotCi19Ci0KLQotLy8gV3JpdGVzIHRoZSBkYXRhIGZvcm1hdAotc3RhdGljCi12b2lkIFdyaXRlRGF0YUZvcm1hdChTQVZFU1RSRUFNKiBmcCwgY21zSVQ4KiBpdDgpCi17Ci0gICAgaW50IGksIG5TYW1wbGVzOwotICAgIFRBQkxFKiB0ID0gR2V0VGFibGUoaXQ4KTsKLQotICAgIGlmICghdCAtPiBEYXRhRm9ybWF0KSByZXR1cm47Ci0KLSAgICAgICBXcml0ZVN0cihmcCwgIkJFR0lOX0RBVEFfRk9STUFUXG4iKTsKLSAgICAgICBXcml0ZVN0cihmcCwgIiAiKTsKLSAgICAgICBuU2FtcGxlcyA9IGF0b2koY21zSVQ4R2V0UHJvcGVydHkoaXQ4LCAiTlVNQkVSX09GX0ZJRUxEUyIpKTsKLQotICAgICAgIGZvciAoaSA9IDA7IGkgPCBuU2FtcGxlczsgaSsrKSB7Ci0KLSAgICAgICAgICAgICAgV3JpdGVTdHIoZnAsIHQtPkRhdGFGb3JtYXRbaV0pOwotICAgICAgICAgICAgICBXcml0ZVN0cihmcCwgKChpID09IChuU2FtcGxlcy0xKSkgPyAiXG4iIDogIlx0IikpOwotICAgICAgICAgIH0KLQotICAgICAgIFdyaXRlU3RyIChmcCwgIkVORF9EQVRBX0ZPUk1BVFxuIik7Ci19Ci0KLQotLy8gV3JpdGVzIGRhdGEgYXJyYXkKLXN0YXRpYwotdm9pZCBXcml0ZURhdGEoU0FWRVNUUkVBTSogZnAsIGNtc0lUOCogaXQ4KQotewotICAgICAgIGludCAgaSwgajsKLSAgICAgICBUQUJMRSogdCA9IEdldFRhYmxlKGl0OCk7Ci0KLSAgICAgICBpZiAoIXQtPkRhdGEpIHJldHVybjsKLQotICAgICAgIFdyaXRlU3RyIChmcCwgIkJFR0lOX0RBVEFcbiIpOwotCi0gICAgICAgdC0+blBhdGNoZXMgPSBhdG9pKGNtc0lUOEdldFByb3BlcnR5KGl0OCwgIk5VTUJFUl9PRl9TRVRTIikpOwotCi0gICAgICAgZm9yIChpID0gMDsgaSA8IHQtPiBuUGF0Y2hlczsgaSsrKSB7Ci0KLSAgICAgICAgICAgICAgV3JpdGVTdHIoZnAsICIgIik7Ci0KLSAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHQtPm5TYW1wbGVzOyBqKyspIHsKLQotICAgICAgICAgICAgICAgICAgICAgY2hhciAqcHRyID0gdC0+RGF0YVtpKnQtPm5TYW1wbGVzK2pdOwotCi0gICAgICAgICAgICAgICAgICAgICBpZiAocHRyID09IE5VTEwpIFdyaXRlU3RyKGZwLCAiXCJcIiIpOwotICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdmFsdWUgY29udGFpbnMgd2hpdGVzcGFjZSwgZW5jbG9zZSB3aXRoaW4gcXVvdGUKLQotICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJjaHIocHRyLCAnICcpICE9IE5VTEwpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZVN0cihmcCwgIlwiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlU3RyKGZwLCBwdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZVN0cihmcCwgIlwiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcml0ZVN0cihmcCwgcHRyKTsKLSAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgV3JpdGVTdHIoZnAsICgoaiA9PSAodC0+blNhbXBsZXMtMSkpID8gIlxuIiA6ICJcdCIpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICBXcml0ZVN0ciAoZnAsICJFTkRfREFUQVxuIik7Ci19Ci0KLQotCi0vLyBTYXZlcyB3aG9sZSBmaWxlCi1jbXNCb29sIENNU0VYUE9SVCBjbXNJVDhTYXZlVG9GaWxlKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBjRmlsZU5hbWUpCi17Ci0gICAgU0FWRVNUUkVBTSBzZDsKLSAgICBjbXNVSW50MzJOdW1iZXIgaTsKLSAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OwotCi0gICAgbWVtc2V0KCZzZCwgMCwgc2l6ZW9mKHNkKSk7Ci0KLSAgICBzZC5zdHJlYW0gPSBmb3BlbihjRmlsZU5hbWUsICJ3dCIpOwotICAgIGlmICghc2Quc3RyZWFtKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IGl0OCAtPlRhYmxlc0NvdW50OyBpKyspIHsKLQotICAgICAgICAgICAgY21zSVQ4U2V0VGFibGUoaElUOCwgaSk7Ci0gICAgICAgICAgICBXcml0ZUhlYWRlcihpdDgsICZzZCk7Ci0gICAgICAgICAgICBXcml0ZURhdGFGb3JtYXQoJnNkLCBpdDgpOwotICAgICAgICAgICAgV3JpdGVEYXRhKCZzZCwgaXQ4KTsKLSAgICB9Ci0KLSAgICBpZiAoZmNsb3NlKHNkLnN0cmVhbSkgIT0gMCkgcmV0dXJuIEZBTFNFOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLy8gU2F2ZXMgdG8gbWVtb3J5Ci1jbXNCb29sIENNU0VYUE9SVCBjbXNJVDhTYXZlVG9NZW0oY21zSEFORExFIGhJVDgsIHZvaWQgKk1lbVB0ciwgY21zVUludDMyTnVtYmVyKiBCeXRlc05lZWRlZCkKLXsKLSAgICBTQVZFU1RSRUFNIHNkOwotICAgIGNtc1VJbnQzMk51bWJlciBpOwotICAgIGNtc0lUOCogaXQ4ID0gKGNtc0lUOCopIGhJVDg7Ci0KLSAgICBtZW1zZXQoJnNkLCAwLCBzaXplb2Yoc2QpKTsKLQotICAgIHNkLnN0cmVhbSA9IE5VTEw7Ci0gICAgc2QuQmFzZSAgID0gKGNtc1VJbnQ4TnVtYmVyKikgIE1lbVB0cjsKLSAgICBzZC5QdHIgICAgPSBzZC5CYXNlOwotCi0gICAgc2QuVXNlZCA9IDA7Ci0KLSAgICBpZiAoc2QuQmFzZSkKLSAgICAgICAgc2QuTWF4ICA9ICpCeXRlc05lZWRlZDsgICAgIC8vIFdyaXRlIHRvIG1lbW9yeT8KLSAgICBlbHNlCi0gICAgICAgIHNkLk1heCAgPSAwOyAgICAgICAgICAgICAgICAvLyBKdXN0IGNvdW50aW5nIHRoZSBuZWVkZWQgYnl0ZXMKLQotICAgIGZvciAoaT0wOyBpIDwgaXQ4IC0+VGFibGVzQ291bnQ7IGkrKykgewotCi0gICAgICAgIGNtc0lUOFNldFRhYmxlKGhJVDgsIGkpOwotICAgICAgICBXcml0ZUhlYWRlcihpdDgsICZzZCk7Ci0gICAgICAgIFdyaXRlRGF0YUZvcm1hdCgmc2QsIGl0OCk7Ci0gICAgICAgIFdyaXRlRGF0YSgmc2QsIGl0OCk7Ci0gICAgfQotCi0gICAgc2QuVXNlZCsrOyAgLy8gVGhlIFwwIGF0IHRoZSB2ZXJ5IGVuZAotCi0gICAgaWYgKHNkLkJhc2UpCi0gICAgICAgICpzZC5QdHIgPSAwOwotCi0gICAgKkJ5dGVzTmVlZGVkID0gc2QuVXNlZDsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhpZ2VyIGxldmVsIHBhcnNpbmcKLQotc3RhdGljCi1jbXNCb29sIERhdGFGb3JtYXRTZWN0aW9uKGNtc0lUOCogaXQ4KQotewotICAgIGludCBpRmllbGQgPSAwOwotICAgIFRBQkxFKiB0ID0gR2V0VGFibGUoaXQ4KTsKLQotICAgIEluU3ltYm9sKGl0OCk7ICAgLy8gRWF0cyAiQkVHSU5fREFUQV9GT1JNQVQiCi0gICAgQ2hlY2tFT0xOKGl0OCk7Ci0KLSAgICB3aGlsZSAoaXQ4LT5zeSAhPSBTRU5EX0RBVEFfRk9STUFUICYmCi0gICAgICAgIGl0OC0+c3kgIT0gU0VPTE4gJiYKLSAgICAgICAgaXQ4LT5zeSAhPSBTRU9GICYmCi0gICAgICAgIGl0OC0+c3kgIT0gU1NZTkVSUk9SKSAgewotCi0gICAgICAgICAgICBpZiAoaXQ4LT5zeSAhPSBTSURFTlQpIHsKLQotICAgICAgICAgICAgICAgIHJldHVybiBTeW5FcnJvcihpdDgsICJTYW1wbGUgdHlwZSBleHBlY3RlZCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIVNldERhdGFGb3JtYXQoaXQ4LCBpRmllbGQsIGl0OC0+aWQpKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICBpRmllbGQrKzsKLQotICAgICAgICAgICAgSW5TeW1ib2woaXQ4KTsKLSAgICAgICAgICAgIFNraXBFT0xOKGl0OCk7Ci0gICAgICAgfQotCi0gICAgICAgU2tpcEVPTE4oaXQ4KTsKLSAgICAgICBTa2lwKGl0OCwgU0VORF9EQVRBX0ZPUk1BVCk7Ci0gICAgICAgU2tpcEVPTE4oaXQ4KTsKLQotICAgICAgIGlmIChpRmllbGQgIT0gdCAtPm5TYW1wbGVzKSB7Ci0gICAgICAgICAgIFN5bkVycm9yKGl0OCwgIkNvdW50IG1pc21hdGNoLiBOVU1CRVJfT0ZfRklFTERTIHdhcyAlZCwgZm91bmQgJWRcbiIsIHQgLT5uU2FtcGxlcywgaUZpZWxkKTsKLQotCi0gICAgICAgfQotCi0gICAgICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotCi1zdGF0aWMKLWNtc0Jvb2wgRGF0YVNlY3Rpb24gKGNtc0lUOCogaXQ4KQotewotICAgIGludCAgaUZpZWxkID0gMDsKLSAgICBpbnQgIGlTZXQgICA9IDA7Ci0gICAgY2hhciBCdWZmZXJbMjU2XTsKLSAgICBUQUJMRSogdCA9IEdldFRhYmxlKGl0OCk7Ci0KLSAgICBJblN5bWJvbChpdDgpOyAgIC8vIEVhdHMgIkJFR0lOX0RBVEEiCi0gICAgQ2hlY2tFT0xOKGl0OCk7Ci0KLSAgICBpZiAoIXQtPkRhdGEpCi0gICAgICAgIEFsbG9jYXRlRGF0YVNldChpdDgpOwotCi0gICAgd2hpbGUgKGl0OC0+c3kgIT0gU0VORF9EQVRBICYmIGl0OC0+c3kgIT0gU0VPRikKLSAgICB7Ci0gICAgICAgIGlmIChpRmllbGQgPj0gdCAtPiBuU2FtcGxlcykgewotICAgICAgICAgICAgaUZpZWxkID0gMDsKLSAgICAgICAgICAgIGlTZXQrKzsKLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGl0OC0+c3kgIT0gU0VORF9EQVRBICYmIGl0OC0+c3kgIT0gU0VPRikgewotCi0gICAgICAgICAgICBpZiAoIUdldFZhbChpdDgsIEJ1ZmZlciwgMjU1LCAiU2FtcGxlIGRhdGEgZXhwZWN0ZWQiKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgICAgIGlmICghU2V0RGF0YShpdDgsIGlTZXQsIGlGaWVsZCwgQnVmZmVyKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgICAgIGlGaWVsZCsrOwotCi0gICAgICAgICAgICBJblN5bWJvbChpdDgpOwotICAgICAgICAgICAgU2tpcEVPTE4oaXQ4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFNraXBFT0xOKGl0OCk7Ci0gICAgU2tpcChpdDgsIFNFTkRfREFUQSk7Ci0gICAgU2tpcEVPTE4oaXQ4KTsKLQotICAgIC8vIENoZWNrIGZvciBkYXRhIGNvbXBsZXRpb24uCi0KLSAgICBpZiAoKGlTZXQrMSkgIT0gdCAtPiBuUGF0Y2hlcykKLSAgICAgICAgcmV0dXJuIFN5bkVycm9yKGl0OCwgIkNvdW50IG1pc21hdGNoLiBOVU1CRVJfT0ZfU0VUUyB3YXMgJWQsIGZvdW5kICVkXG4iLCB0IC0+blBhdGNoZXMsIGlTZXQrMSk7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0KLQotc3RhdGljCi1jbXNCb29sIEhlYWRlclNlY3Rpb24oY21zSVQ4KiBpdDgpCi17Ci0gICAgY2hhciBWYXJOYW1lW01BWElEXTsKLSAgICBjaGFyIEJ1ZmZlcltNQVhTVFJdOwotICAgIEtFWVZBTFVFKiBLZXk7Ci0KLSAgICAgICAgd2hpbGUgKGl0OC0+c3kgIT0gU0VPRiAmJgotICAgICAgICAgICAgICAgaXQ4LT5zeSAhPSBTU1lORVJST1IgJiYKLSAgICAgICAgICAgICAgIGl0OC0+c3kgIT0gU0JFR0lOX0RBVEFfRk9STUFUICYmCi0gICAgICAgICAgICAgICBpdDgtPnN5ICE9IFNCRUdJTl9EQVRBKSB7Ci0KLQotICAgICAgICBzd2l0Y2ggKGl0OCAtPiBzeSkgewotCi0gICAgICAgIGNhc2UgU0tFWVdPUkQ6Ci0gICAgICAgICAgICAgICAgSW5TeW1ib2woaXQ4KTsKLSAgICAgICAgICAgICAgICBpZiAoIUdldFZhbChpdDgsIEJ1ZmZlciwgTUFYU1RSLTEsICJLZXl3b3JkIGV4cGVjdGVkIikpIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICBpZiAoIUFkZEF2YWlsYWJsZVByb3BlcnR5KGl0OCwgQnVmZmVyLCBXUklURV9VTkNPT0tFRCkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICBJblN5bWJvbChpdDgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0KLSAgICAgICAgY2FzZSBTREFUQV9GT1JNQVRfSUQ6Ci0gICAgICAgICAgICAgICAgSW5TeW1ib2woaXQ4KTsKLSAgICAgICAgICAgICAgICBpZiAoIUdldFZhbChpdDgsIEJ1ZmZlciwgTUFYU1RSLTEsICJLZXl3b3JkIGV4cGVjdGVkIikpIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICBpZiAoIUFkZEF2YWlsYWJsZVNhbXBsZUlEKGl0OCwgQnVmZmVyKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgIEluU3ltYm9sKGl0OCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQotICAgICAgICBjYXNlIFNJREVOVDoKLSAgICAgICAgICAgICAgICBzdHJuY3B5KFZhck5hbWUsIGl0OC0+aWQsIE1BWElELTEpOwotICAgICAgICAgICAgICAgIFZhck5hbWVbTUFYSUQtMV0gPSAwOwotCi0gICAgICAgICAgICAgICAgaWYgKCFJc0F2YWlsYWJsZU9uTGlzdChpdDgtPiBWYWxpZEtleXdvcmRzLCBWYXJOYW1lLCBOVUxMLCAmS2V5KSkgewotCi0jaWZkZWYgQ01TX1NUUklDVF9DR0FUUwotICAgICAgICAgICAgICAgICByZXR1cm4gU3luRXJyb3IoaXQ4LCAiVW5kZWZpbmVkIGtleXdvcmQgJyVzJyIsIFZhck5hbWUpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgS2V5ID0gQWRkQXZhaWxhYmxlUHJvcGVydHkoaXQ4LCBWYXJOYW1lLCBXUklURV9VTkNPT0tFRCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChLZXkgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgSW5TeW1ib2woaXQ4KTsKLSAgICAgICAgICAgICAgICBpZiAoIUdldFZhbChpdDgsIEJ1ZmZlciwgTUFYU1RSLTEsICJQcm9wZXJ0eSBkYXRhIGV4cGVjdGVkIikpIHJldHVybiBGQUxTRTsKLQotICAgICAgICAgICAgICAgIGlmKEtleS0+V3JpdGVBcyAhPSBXUklURV9QQUlSKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFkZFRvTGlzdChpdDgsICZHZXRUYWJsZShpdDgpLT5IZWFkZXJMaXN0LCBWYXJOYW1lLCBOVUxMLCBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdDgtPnN5ID09IFNTVFJJTkcpID8gV1JJVEVfU1RSSU5HSUZZIDogV1JJVEVfVU5DT09LRUQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqU3Via2V5OwotICAgICAgICAgICAgICAgICAgICBjaGFyICpOZXh0a2V5OwotICAgICAgICAgICAgICAgICAgICBpZiAoaXQ4LT5zeSAhPSBTU1RSSU5HKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN5bkVycm9yKGl0OCwgIkludmFsaWQgdmFsdWUgJyVzJyBmb3IgcHJvcGVydHkgJyVzJy4iLCBCdWZmZXIsIFZhck5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGNob3AgdGhlIHN0cmluZyBhcyBhIGxpc3Qgb2YgInN1YmtleSwgdmFsdWUiIHBhaXJzLCB1c2luZyAnOycgYXMgYSBzZXBhcmF0b3IKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdWJrZXkgPSBCdWZmZXI7IFN1YmtleSAhPSBOVUxMOyBTdWJrZXkgPSBOZXh0a2V5KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpWYWx1ZSwgKnRlbXA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vICBpZGVudGlmeSB0b2tlbiBwYWlyIGJvdW5kYXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICBOZXh0a2V5ID0gKGNoYXIqKSBzdHJjaHIoU3Via2V5LCAnOycpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoTmV4dGtleSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTmV4dGtleSsrID0gJ1wwJzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGVhY2ggcGFpciwgc3BsaXQgdGhlIHN1YmtleSBhbmQgdGhlIHZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IChjaGFyKikgc3RycmNocihTdWJrZXksICcsJyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZihWYWx1ZSA9PSBOVUxMKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTeW5FcnJvcihpdDgsICJJbnZhbGlkIHZhbHVlIGZvciBwcm9wZXJ0eSAnJXMnLiIsIFZhck5hbWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBnb2JibGUgdGhlIHNwYWNlcyBiZWZvcmUgdGhlIGNvbWEsIGFuZCB0aGUgY29tYSBpdHNlbGYKLSAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBWYWx1ZSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgZG8gKnRlbXAtLSA9ICdcMCc7IHdoaWxlKHRlbXAgPj0gU3Via2V5ICYmICp0ZW1wID09ICcgJyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvYmJsZSBhbnkgc3BhY2UgYXQgdGhlIHJpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gVmFsdWUgKyBzdHJsZW4oVmFsdWUpIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCp0ZW1wID09ICcgJykgKnRlbXAtLSA9ICdcMCc7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyaW0gdGhlIHN0cmluZ3MgZnJvbSB0aGUgbGVmdAotICAgICAgICAgICAgICAgICAgICAgICAgU3Via2V5ICs9IHN0cnNwbihTdWJrZXksICIgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSArPSBzdHJzcG4oVmFsdWUsICIgIik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKFN1YmtleVswXSA9PSAwIHx8IFZhbHVlWzBdID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN5bkVycm9yKGl0OCwgIkludmFsaWQgdmFsdWUgZm9yIHByb3BlcnR5ICclcycuIiwgVmFyTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBZGRUb0xpc3QoaXQ4LCAmR2V0VGFibGUoaXQ4KS0+SGVhZGVyTGlzdCwgVmFyTmFtZSwgU3Via2V5LCBWYWx1ZSwgV1JJVEVfUEFJUik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBJblN5bWJvbChpdDgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0KLSAgICAgICAgY2FzZSBTRU9MTjogYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gU3luRXJyb3IoaXQ4LCAiZXhwZWN0ZWQga2V5d29yZCBvciBpZGVudGlmaWVyIik7Ci0gICAgICAgIH0KLQotICAgIFNraXBFT0xOKGl0OCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci0KLX0KLQotCi1zdGF0aWMKLXZvaWQgUmVhZFR5cGUoY21zSVQ4KiBpdDgsIGNoYXIqIFNoZWV0VHlwZVB0cikKLXsKLSAgICAvLyBGaXJzdCBsaW5lIGlzIGEgdmVyeSBzcGVjaWFsIGNhc2UuCi0KLSAgICB3aGlsZSAoaXNzZXBhcmF0b3IoaXQ4LT5jaCkpCi0gICAgICAgICAgICBOZXh0Q2goaXQ4KTsKLQotICAgIHdoaWxlIChpdDgtPmNoICE9ICdccicgJiYgaXQ4IC0+Y2ggIT0gJ1xuJyAmJiBpdDgtPmNoICE9ICdcdCcgJiYgaXQ4IC0+IGNoICE9IC0xKSB7Ci0KLSAgICAgICAgKlNoZWV0VHlwZVB0cisrPSAoY2hhcikgaXQ4IC0+Y2g7Ci0gICAgICAgIE5leHRDaChpdDgpOwotICAgIH0KLQotICAgICpTaGVldFR5cGVQdHIgPSAwOwotfQotCi0KLXN0YXRpYwotY21zQm9vbCBQYXJzZUlUOChjbXNJVDgqIGl0OCwgY21zQm9vbCBub3NoZWV0KQotewotICAgIGNoYXIqIFNoZWV0VHlwZVB0ciA9IGl0OCAtPlRhYlswXS5TaGVldFR5cGU7Ci0KLSAgICBpZiAobm9zaGVldCA9PSAwKSB7Ci0gICAgICAgIFJlYWRUeXBlKGl0OCwgU2hlZXRUeXBlUHRyKTsKLSAgICB9Ci0KLSAgICBJblN5bWJvbChpdDgpOwotCi0gICAgU2tpcEVPTE4oaXQ4KTsKLQotICAgIHdoaWxlIChpdDgtPiBzeSAhPSBTRU9GICYmCi0gICAgICAgICAgIGl0OC0+IHN5ICE9IFNTWU5FUlJPUikgewotCi0gICAgICAgICAgICBzd2l0Y2ggKGl0OCAtPiBzeSkgewotCi0gICAgICAgICAgICBjYXNlIFNCRUdJTl9EQVRBX0ZPUk1BVDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFEYXRhRm9ybWF0U2VjdGlvbihpdDgpKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIFNCRUdJTl9EQVRBOgotCi0gICAgICAgICAgICAgICAgICAgIGlmICghRGF0YVNlY3Rpb24oaXQ4KSkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChpdDggLT4gc3kgIT0gU0VPRikgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NUYWJsZShpdDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0OCAtPm5UYWJsZSA9IGl0OCAtPlRhYmxlc0NvdW50IC0gMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlYWQgc2hlZXQgdHlwZSBpZiBwcmVzZW50LiBXZSBvbmx5IHN1cHBvcnQgaWRlbnRpZmllciBhbmQgc3RyaW5nLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxpZGVudD4gPGVvbG4+IGlzIGEgdHlwZSBzdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnl0aGluZyBlbHNlLCBpcyBub3QgYSB0eXBlIHN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3NoZWV0ID09IDApIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXQ4IC0+c3kgPT0gU0lERU5UKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1heSBiZSBhIHR5cGUgc2hlZXQgb3IgbWF5IGJlIGEgcHJvcCB2YWx1ZSBzdGF0ZW1lbnQuIFdlIGNhbm5vdCB1c2UgaW5zeW1ib2wgaW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc3BlY2lhbCBjYXNlLi4uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGlzc2VwYXJhdG9yKGl0OC0+Y2gpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXh0Q2goaXQ4KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGEgbmV3bGluZSBpcyBmb3VuZCwgdGhlbiB0aGlzIGlzIGEgdHlwZSBzdHJpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdDggLT5jaCA9PSAnXG4nIHx8IGl0OC0+Y2ggPT0gJ1xyJykgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0lUOFNldFNoZWV0VHlwZShpdDgsIGl0OCAtPmlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5TeW1ib2woaXQ4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBpcyBub3QuIEp1c3QgY29udGludWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNJVDhTZXRTaGVldFR5cGUoaXQ4LCAiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFsaWRhdGUgcXVvdGVkIHN0cmluZ3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdDggLT5zeSA9PSBTU1RSSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSVQ4U2V0U2hlZXRUeXBlKGl0OCwgaXQ4IC0+c3RyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJblN5bWJvbChpdDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGNhc2UgU0VPTE46Ci0gICAgICAgICAgICAgICAgICAgIFNraXBFT0xOKGl0OCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBpZiAoIUhlYWRlclNlY3Rpb24oaXQ4KSkgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICByZXR1cm4gKGl0OCAtPiBzeSAhPSBTU1lORVJST1IpOwotfQotCi0KLQotLy8gSW5pdCB1c2VmdWxsIHBvaW50ZXJzCi0KLXN0YXRpYwotdm9pZCBDb29rUG9pbnRlcnMoY21zSVQ4KiBpdDgpCi17Ci0gICAgaW50IGlkRmllbGQsIGk7Ci0gICAgY2hhciogRmxkOwotICAgIGNtc1VJbnQzMk51bWJlciBqOwotICAgIGNtc1VJbnQzMk51bWJlciBuT2xkVGFibGUgPSBpdDggLT5uVGFibGU7Ci0KLSAgICBmb3IgKGo9MDsgaiA8IGl0OCAtPlRhYmxlc0NvdW50OyBqKyspIHsKLQotICAgIFRBQkxFKiB0ID0gaXQ4IC0+VGFiICsgajsKLQotICAgIHQgLT4gU2FtcGxlSUQgPSAwOwotICAgIGl0OCAtPm5UYWJsZSA9IGo7Ci0KLSAgICBmb3IgKGlkRmllbGQgPSAwOyBpZEZpZWxkIDwgdCAtPiBuU2FtcGxlczsgaWRGaWVsZCsrKQotICAgIHsKLSAgICAgICAgaWYgKHQgLT5EYXRhRm9ybWF0ID09IE5VTEwpewotICAgICAgICAgICAgU3luRXJyb3IoaXQ4LCAiVW5kZWZpbmVkIERBVEFfRk9STUFUIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBGbGQgPSB0LT5EYXRhRm9ybWF0W2lkRmllbGRdOwotICAgICAgICBpZiAoIUZsZCkgY29udGludWU7Ci0KLQotICAgICAgICBpZiAoY21zc3RyY2FzZWNtcChGbGQsICJTQU1QTEVfSUQiKSA9PSAwKSB7Ci0KLSAgICAgICAgICAgIHQgLT4gU2FtcGxlSUQgPSBpZEZpZWxkOwotCi0gICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHQgLT4gblBhdGNoZXM7IGkrKykgewotCi0gICAgICAgICAgICAgICAgY2hhciAqRGF0YSA9IEdldERhdGEoaXQ4LCBpLCBpZEZpZWxkKTsKLSAgICAgICAgICAgICAgICBpZiAoRGF0YSkgewotICAgICAgICAgICAgICAgICAgICBjaGFyIEJ1ZmZlclsyNTZdOwotCi0gICAgICAgICAgICAgICAgICAgIHN0cm5jcHkoQnVmZmVyLCBEYXRhLCAyNTUpOwotICAgICAgICAgICAgICAgICAgICBCdWZmZXJbMjU1XSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmxlbihCdWZmZXIpIDw9IHN0cmxlbihEYXRhKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNweShEYXRhLCBCdWZmZXIpOwotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBTZXREYXRhKGl0OCwgaSwgaWRGaWVsZCwgQnVmZmVyKTsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gIkxBQkVMIiBpcyBhbiBleHRlbnNpb24uIEl0IGtlZXBzIHJlZmVyZW5jZXMgdG8gZm9yd2FyZCB0YWJsZXMKLQotICAgICAgICBpZiAoKGNtc3N0cmNhc2VjbXAoRmxkLCAiTEFCRUwiKSA9PSAwKSB8fCBGbGRbMF0gPT0gJyQnICkgewotCi0gICAgICAgICAgICAgICAgICAgIC8vIFNlYXJjaCBmb3IgdGFibGUgcmVmZXJlbmNlcy4uLgotICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IHQgLT4gblBhdGNoZXM7IGkrKykgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqTGFiZWwgPSBHZXREYXRhKGl0OCwgaSwgaWRGaWVsZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTGFiZWwpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBsYWJlbCwgc2VhcmNoIGZvciBhIHRhYmxlIGNvbnRhaW5pbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBwcm9wZXJ0eQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaz0wOyBrIDwgaXQ4IC0+VGFibGVzQ291bnQ7IGsrKykgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUJMRSogVGFibGUgPSBpdDggLT5UYWIgKyBrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZVkFMVUUqIHA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJc0F2YWlsYWJsZU9uTGlzdChUYWJsZS0+SGVhZGVyTGlzdCwgTGFiZWwsIE5VTEwsICZwKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXZhaWxhYmxlLCBrZWVwIHR5cGUgYW5kIHRhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBCdWZmZXJbMjU2XTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKlR5cGUgID0gcCAtPlZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgblRhYmxlID0gKGludCkgazsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKEJ1ZmZlciwgMjU1LCAiJXMgJWQgJXMiLCBMYWJlbCwgblRhYmxlLCBUeXBlICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXREYXRhKGl0OCwgaSwgaWRGaWVsZCwgQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgfQotCi0gICAgfQotICAgIH0KLQotICAgIGl0OCAtPm5UYWJsZSA9IG5PbGRUYWJsZTsKLX0KLQotLy8gVHJ5IHRvIGluZmVyZSBpZiB0aGUgZmlsZSBpcyBhIENHQVRTL0lUOCBmaWxlIGF0IGFsbC4gUmVhZCBmaXJzdCBsaW5lCi0vLyB0aGF0IHNob3VsZCBiZSBzb21ldGhpbmcgbGlrZSBzb21lIHByaW50YWJsZSBjaGFyYWN0ZXJzIHBsdXMgYSBcbgotLy8gcmV0dXJucyAwIGlmIHRoaXMgaXMgbm90IGxpa2UgYSBDR0FUUywgb3IgYW4gaW50ZWdlciBvdGhlcndpc2UuIFRoaXMgaW50ZWdlciBpcyB0aGUgbnVtYmVyIG9mIHdvcmRzIGluIGZpcnN0IGxpbmU/Ci1zdGF0aWMKLWludCBJc015QmxvY2soY21zVUludDhOdW1iZXIqIEJ1ZmZlciwgaW50IG4pCi17Ci0gICAgaW50IHdvcmRzID0gMSwgc3BhY2UgPSAwLCBxdW90ID0gMDsKLSAgICBpbnQgaTsKLQotICAgIGlmIChuIDwgMTApIHJldHVybiAwOyAgIC8vIFRvbyBzbWFsbAotCi0gICAgaWYgKG4gPiAxMzIpCi0gICAgICAgIG4gPSAxMzI7Ci0KLSAgICBmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7Ci0KLSAgICAgICAgc3dpdGNoKEJ1ZmZlcltpXSkKLSAgICAgICAgewotICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgIHJldHVybiAoKHF1b3QgPT0gMSkgfHwgKHdvcmRzID4gMikpID8gMCA6IHdvcmRzOwotICAgICAgICBjYXNlICdcdCc6Ci0gICAgICAgIGNhc2UgJyAnOgotICAgICAgICAgICAgaWYoIXF1b3QgJiYgIXNwYWNlKQotICAgICAgICAgICAgICAgIHNwYWNlID0gMTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcIic6Ci0gICAgICAgICAgICBxdW90ID0gIXF1b3Q7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlmIChCdWZmZXJbaV0gPCAzMikgcmV0dXJuIDA7Ci0gICAgICAgICAgICBpZiAoQnVmZmVyW2ldID4gMTI3KSByZXR1cm4gMDsKLSAgICAgICAgICAgIHdvcmRzICs9IHNwYWNlOwotICAgICAgICAgICAgc3BhY2UgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMKLWNtc0Jvb2wgSXNNeUZpbGUoY29uc3QgY2hhciogRmlsZU5hbWUpCi17Ci0gICBGSUxFICpmcDsKLSAgIGNtc1VJbnQzMk51bWJlciBTaXplOwotICAgY21zVUludDhOdW1iZXIgUHRyWzEzM107Ci0KLSAgIGZwID0gZm9wZW4oRmlsZU5hbWUsICJydCIpOwotICAgaWYgKCFmcCkgewotICAgICAgIGNtc1NpZ25hbEVycm9yKDAsIGNtc0VSUk9SX0ZJTEUsICJGaWxlICclcycgbm90IGZvdW5kIiwgRmlsZU5hbWUpOwotICAgICAgIHJldHVybiBGQUxTRTsKLSAgIH0KLQotICAgU2l6ZSA9IChjbXNVSW50MzJOdW1iZXIpIGZyZWFkKFB0ciwgMSwgMTMyLCBmcCk7Ci0KLSAgIGlmIChmY2xvc2UoZnApICE9IDApCi0gICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICBQdHJbU2l6ZV0gPSAnXDAnOwotCi0gICByZXR1cm4gSXNNeUJsb2NrKFB0ciwgU2l6ZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRXhwb3J0ZWQgcm91dGluZXMKLQotCi1jbXNIQU5ETEUgIENNU0VYUE9SVCBjbXNJVDhMb2FkRnJvbU1lbShjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbGVuKQotewotICAgIGNtc0hBTkRMRSBoSVQ4OwotICAgIGNtc0lUOCogIGl0ODsKLSAgICBpbnQgdHlwZTsKLQotICAgIF9jbXNBc3NlcnQoUHRyICE9IE5VTEwpOwotICAgIF9jbXNBc3NlcnQobGVuICE9IDApOwotCi0gICAgdHlwZSA9IElzTXlCbG9jaygoY21zVUludDhOdW1iZXIqKVB0ciwgbGVuKTsKLSAgICBpZiAodHlwZSA9PSAwKSByZXR1cm4gTlVMTDsKLQotICAgIGhJVDggPSBjbXNJVDhBbGxvYyhDb250ZXh0SUQpOwotICAgIGlmICghaElUOCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBpdDggPSAoY21zSVQ4KikgaElUODsKLSAgICBpdDggLT5NZW1vcnlCbG9jayA9IChjaGFyKikgX2Ntc01hbGxvYyhDb250ZXh0SUQsIGxlbiArIDEpOwotCi0gICAgc3RybmNweShpdDggLT5NZW1vcnlCbG9jaywgKGNvbnN0IGNoYXIqKSBQdHIsIGxlbik7Ci0gICAgaXQ4IC0+TWVtb3J5QmxvY2tbbGVuXSA9IDA7Ci0KLSAgICBzdHJuY3B5KGl0OC0+RmlsZVN0YWNrWzBdLT5GaWxlTmFtZSwgIiIsIGNtc01BWF9QQVRILTEpOwotICAgIGl0OC0+IFNvdXJjZSA9IGl0OCAtPiBNZW1vcnlCbG9jazsKLQotICAgIGlmICghUGFyc2VJVDgoaXQ4LCB0eXBlLTEpKSB7Ci0KLSAgICAgICAgY21zSVQ4RnJlZShoSVQ4KTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIENvb2tQb2ludGVycyhpdDgpOwotICAgIGl0OCAtPm5UYWJsZSA9IDA7Ci0KLSAgICBfY21zRnJlZShDb250ZXh0SUQsIGl0OC0+TWVtb3J5QmxvY2spOwotICAgIGl0OCAtPiBNZW1vcnlCbG9jayA9IE5VTEw7Ci0KLSAgICByZXR1cm4gaElUODsKLQotCi19Ci0KLQotY21zSEFORExFICBDTVNFWFBPUlQgY21zSVQ4TG9hZEZyb21GaWxlKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCBjaGFyKiBjRmlsZU5hbWUpCi17Ci0KLSAgICAgY21zSEFORExFIGhJVDg7Ci0gICAgIGNtc0lUOCogIGl0ODsKLSAgICAgaW50IHR5cGU7Ci0KLSAgICAgX2Ntc0Fzc2VydChjRmlsZU5hbWUgIT0gTlVMTCk7Ci0KLSAgICAgdHlwZSA9IElzTXlGaWxlKGNGaWxlTmFtZSk7Ci0gICAgIGlmICh0eXBlID09IDApIHJldHVybiBOVUxMOwotCi0gICAgIGhJVDggPSBjbXNJVDhBbGxvYyhDb250ZXh0SUQpOwotICAgICBpdDggPSAoY21zSVQ4KikgaElUODsKLSAgICAgaWYgKCFoSVQ4KSByZXR1cm4gTlVMTDsKLQotCi0gICAgIGl0OCAtPkZpbGVTdGFja1swXS0+U3RyZWFtID0gZm9wZW4oY0ZpbGVOYW1lLCAicnQiKTsKLQotICAgICBpZiAoIWl0OCAtPkZpbGVTdGFja1swXS0+U3RyZWFtKSB7Ci0gICAgICAgICBjbXNJVDhGcmVlKGhJVDgpOwotICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgIH0KLQotCi0gICAgc3RybmNweShpdDgtPkZpbGVTdGFja1swXS0+RmlsZU5hbWUsIGNGaWxlTmFtZSwgY21zTUFYX1BBVEgtMSk7Ci0gICAgaXQ4LT5GaWxlU3RhY2tbMF0tPkZpbGVOYW1lW2Ntc01BWF9QQVRILTFdID0gMDsKLQotICAgIGlmICghUGFyc2VJVDgoaXQ4LCB0eXBlLTEpKSB7Ci0KLSAgICAgICAgICAgIGZjbG9zZShpdDggLT5GaWxlU3RhY2tbMF0tPlN0cmVhbSk7Ci0gICAgICAgICAgICBjbXNJVDhGcmVlKGhJVDgpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgQ29va1BvaW50ZXJzKGl0OCk7Ci0gICAgaXQ4IC0+blRhYmxlID0gMDsKLQotICAgIGlmIChmY2xvc2UoaXQ4IC0+RmlsZVN0YWNrWzBdLT5TdHJlYW0pIT0gMCkgewotICAgICAgICAgICAgY21zSVQ4RnJlZShoSVQ4KTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBoSVQ4OwotCi19Ci0KLWludCBDTVNFWFBPUlQgY21zSVQ4RW51bURhdGFGb3JtYXQoY21zSEFORExFIGhJVDgsIGNoYXIgKioqU2FtcGxlTmFtZXMpCi17Ci0gICAgY21zSVQ4KiBpdDggPSAoY21zSVQ4KikgaElUODsKLSAgICBUQUJMRSogdDsKLQotICAgIF9jbXNBc3NlcnQoaElUOCAhPSBOVUxMKTsKLQotICAgIHQgPSBHZXRUYWJsZShpdDgpOwotCi0gICAgaWYgKFNhbXBsZU5hbWVzKQotICAgICAgICAqU2FtcGxlTmFtZXMgPSB0IC0+IERhdGFGb3JtYXQ7Ci0gICAgcmV0dXJuIHQgLT4gblNhbXBsZXM7Ci19Ci0KLQotY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNJVDhFbnVtUHJvcGVydGllcyhjbXNIQU5ETEUgaElUOCwgY2hhciAqKipQcm9wZXJ0eU5hbWVzKQotewotICAgIGNtc0lUOCogaXQ4ID0gKGNtc0lUOCopIGhJVDg7Ci0gICAgS0VZVkFMVUUqIHA7Ci0gICAgY21zVUludDMyTnVtYmVyIG47Ci0gICAgY2hhciAqKlByb3BzOwotICAgIFRBQkxFKiB0OwotCi0gICAgX2Ntc0Fzc2VydChoSVQ4ICE9IE5VTEwpOwotCi0gICAgdCA9IEdldFRhYmxlKGl0OCk7Ci0KLSAgICAvLyBQYXNzIzEgLSBjb3VudCBwcm9wZXJ0aWVzCi0KLSAgICBuID0gMDsKLSAgICBmb3IgKHAgPSB0IC0+IEhlYWRlckxpc3Q7ICBwICE9IE5VTEw7IHAgPSBwLT5OZXh0KSB7Ci0gICAgICAgIG4rKzsKLSAgICB9Ci0KLQotICAgIFByb3BzID0gKGNoYXIgKiopIEFsbG9jQ2h1bmsoaXQ4LCBzaXplb2YoY2hhciAqKSAqIG4pOwotCi0gICAgLy8gUGFzcyMyIC0gRmlsbCBwb2ludGVycwotICAgIG4gPSAwOwotICAgIGZvciAocCA9IHQgLT4gSGVhZGVyTGlzdDsgIHAgIT0gTlVMTDsgcCA9IHAtPk5leHQpIHsKLSAgICAgICAgUHJvcHNbbisrXSA9IHAgLT4gS2V5d29yZDsKLSAgICB9Ci0KLSAgICAqUHJvcGVydHlOYW1lcyA9IFByb3BzOwotICAgIHJldHVybiBuOwotfQotCi1jbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0lUOEVudW1Qcm9wZXJ0eU11bHRpKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBjUHJvcCwgY29uc3QgY2hhciAqKipTdWJwcm9wZXJ0eU5hbWVzKQotewotICAgIGNtc0lUOCogaXQ4ID0gKGNtc0lUOCopIGhJVDg7Ci0gICAgS0VZVkFMVUUgKnAsICp0bXA7Ci0gICAgY21zVUludDMyTnVtYmVyIG47Ci0gICAgY29uc3QgY2hhciAqKlByb3BzOwotICAgIFRBQkxFKiB0OwotCi0gICAgX2Ntc0Fzc2VydChoSVQ4ICE9IE5VTEwpOwotCi0KLSAgICB0ID0gR2V0VGFibGUoaXQ4KTsKLQotICAgIGlmKCFJc0F2YWlsYWJsZU9uTGlzdCh0LT5IZWFkZXJMaXN0LCBjUHJvcCwgTlVMTCwgJnApKSB7Ci0gICAgICAgICpTdWJwcm9wZXJ0eU5hbWVzID0gMDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLy8gUGFzcyMxIC0gY291bnQgcHJvcGVydGllcwotCi0gICAgbiA9IDA7Ci0gICAgZm9yICh0bXAgPSBwOyAgdG1wICE9IE5VTEw7IHRtcCA9IHRtcC0+TmV4dFN1YmtleSkgewotICAgICAgICBpZih0bXAtPlN1YmtleSAhPSBOVUxMKQotICAgICAgICAgICAgbisrOwotICAgIH0KLQotCi0gICAgUHJvcHMgPSAoY29uc3QgY2hhciAqKikgQWxsb2NDaHVuayhpdDgsIHNpemVvZihjaGFyICopICogbik7Ci0KLSAgICAvLyBQYXNzIzIgLSBGaWxsIHBvaW50ZXJzCi0gICAgbiA9IDA7Ci0gICAgZm9yICh0bXAgPSBwOyAgdG1wICE9IE5VTEw7IHRtcCA9IHRtcC0+TmV4dFN1YmtleSkgewotICAgICAgICBpZih0bXAtPlN1YmtleSAhPSBOVUxMKQotICAgICAgICAgICAgUHJvcHNbbisrXSA9IHAgLT5TdWJrZXk7Ci0gICAgfQotCi0gICAgKlN1YnByb3BlcnR5TmFtZXMgPSBQcm9wczsKLSAgICByZXR1cm4gbjsKLX0KLQotc3RhdGljCi1pbnQgTG9jYXRlUGF0Y2goY21zSVQ4KiBpdDgsIGNvbnN0IGNoYXIqIGNQYXRjaCkKLXsKLSAgICBpbnQgaTsKLSAgICBjb25zdCBjaGFyICpkYXRhOwotICAgIFRBQkxFKiB0ID0gR2V0VGFibGUoaXQ4KTsKLQotICAgIGZvciAoaT0wOyBpIDwgdC0+IG5QYXRjaGVzOyBpKyspIHsKLQotICAgICAgICBkYXRhID0gR2V0RGF0YShpdDgsIGksIHQtPlNhbXBsZUlEKTsKLQotICAgICAgICBpZiAoZGF0YSAhPSBOVUxMKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY21zc3RyY2FzZWNtcChkYXRhLCBjUGF0Y2gpID09IDApCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTeW5FcnJvcihpdDgsICJDb3VsZG4ndCBmaW5kIHBhdGNoICclcydcbiIsIGNQYXRjaCk7Ci0gICAgICAgIHJldHVybiAtMTsKLX0KLQotCi1zdGF0aWMKLWludCBMb2NhdGVFbXB0eVBhdGNoKGNtc0lUOCogaXQ4KQotewotICAgIGludCBpOwotICAgIGNvbnN0IGNoYXIgKmRhdGE7Ci0gICAgVEFCTEUqIHQgPSBHZXRUYWJsZShpdDgpOwotCi0gICAgZm9yIChpPTA7IGkgPCB0LT4gblBhdGNoZXM7IGkrKykgewotCi0gICAgICAgIGRhdGEgPSBHZXREYXRhKGl0OCwgaSwgdC0+U2FtcGxlSUQpOwotCi0gICAgICAgIGlmIChkYXRhID09IE5VTEwpCi0gICAgICAgICAgICByZXR1cm4gaTsKLQotICAgIH0KLQotICAgIHJldHVybiAtMTsKLX0KLQotc3RhdGljCi1pbnQgTG9jYXRlU2FtcGxlKGNtc0lUOCogaXQ4LCBjb25zdCBjaGFyKiBjU2FtcGxlKQotewotICAgIGludCBpOwotICAgIGNvbnN0IGNoYXIgKmZsZDsKLSAgICBUQUJMRSogdCA9IEdldFRhYmxlKGl0OCk7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IHQtPm5TYW1wbGVzOyBpKyspIHsKLQotICAgICAgICBmbGQgPSBHZXREYXRhRm9ybWF0KGl0OCwgaSk7Ci0gICAgICAgIGlmIChjbXNzdHJjYXNlY21wKGZsZCwgY1NhbXBsZSkgPT0gMCkKLSAgICAgICAgICAgIHJldHVybiBpOwotICAgIH0KLQotICAgIHJldHVybiAtMTsKLQotfQotCi0KLWludCBDTVNFWFBPUlQgY21zSVQ4RmluZERhdGFGb3JtYXQoY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIGNTYW1wbGUpCi17Ci0gICAgY21zSVQ4KiBpdDggPSAoY21zSVQ4KikgaElUODsKLQotICAgIF9jbXNBc3NlcnQoaElUOCAhPSBOVUxMKTsKLQotICAgIHJldHVybiBMb2NhdGVTYW1wbGUoaXQ4LCBjU2FtcGxlKTsKLX0KLQotCi0KLWNvbnN0IGNoYXIqIENNU0VYUE9SVCBjbXNJVDhHZXREYXRhUm93Q29sKGNtc0hBTkRMRSBoSVQ4LCBpbnQgcm93LCBpbnQgY29sKQotewotICAgIGNtc0lUOCogaXQ4ID0gKGNtc0lUOCopIGhJVDg7Ci0KLSAgICBfY21zQXNzZXJ0KGhJVDggIT0gTlVMTCk7Ci0KLSAgICByZXR1cm4gR2V0RGF0YShpdDgsIHJvdywgY29sKTsKLX0KLQotCi1jbXNGbG9hdDY0TnVtYmVyIENNU0VYUE9SVCBjbXNJVDhHZXREYXRhUm93Q29sRGJsKGNtc0hBTkRMRSBoSVQ4LCBpbnQgcm93LCBpbnQgY29sKQotewotICAgIGNvbnN0IGNoYXIqIEJ1ZmZlcjsKLQotICAgIEJ1ZmZlciA9IGNtc0lUOEdldERhdGFSb3dDb2woaElUOCwgcm93LCBjb2wpOwotCi0gICAgaWYgKEJ1ZmZlciA9PSBOVUxMKSByZXR1cm4gMC4wOwotCi0gICAgcmV0dXJuIFBhcnNlRmxvYXROdW1iZXIoQnVmZmVyKTsKLX0KLQotCi1jbXNCb29sIENNU0VYUE9SVCBjbXNJVDhTZXREYXRhUm93Q29sKGNtc0hBTkRMRSBoSVQ4LCBpbnQgcm93LCBpbnQgY29sLCBjb25zdCBjaGFyKiBWYWwpCi17Ci0gICAgY21zSVQ4KiBpdDggPSAoY21zSVQ4KikgaElUODsKLQotICAgIF9jbXNBc3NlcnQoaElUOCAhPSBOVUxMKTsKLQotICAgIHJldHVybiBTZXREYXRhKGl0OCwgcm93LCBjb2wsIFZhbCk7Ci19Ci0KLQotY21zQm9vbCBDTVNFWFBPUlQgY21zSVQ4U2V0RGF0YVJvd0NvbERibChjbXNIQU5ETEUgaElUOCwgaW50IHJvdywgaW50IGNvbCwgY21zRmxvYXQ2NE51bWJlciBWYWwpCi17Ci0gICAgY21zSVQ4KiBpdDggPSAoY21zSVQ4KikgaElUODsKLSAgICBjaGFyIEJ1ZmZbMjU2XTsKLQotICAgIF9jbXNBc3NlcnQoaElUOCAhPSBOVUxMKTsKLQotICAgIHNwcmludGYoQnVmZiwgaXQ4LT5Eb3VibGVGb3JtYXR0ZXIsIFZhbCk7Ci0KLSAgICByZXR1cm4gU2V0RGF0YShpdDgsIHJvdywgY29sLCBCdWZmKTsKLX0KLQotCi0KLWNvbnN0IGNoYXIqIENNU0VYUE9SVCBjbXNJVDhHZXREYXRhKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBjUGF0Y2gsIGNvbnN0IGNoYXIqIGNTYW1wbGUpCi17Ci0gICAgY21zSVQ4KiBpdDggPSAoY21zSVQ4KikgaElUODsKLSAgICBpbnQgaUZpZWxkLCBpU2V0OwotCi0gICAgX2Ntc0Fzc2VydChoSVQ4ICE9IE5VTEwpOwotCi0gICAgaUZpZWxkID0gTG9jYXRlU2FtcGxlKGl0OCwgY1NhbXBsZSk7Ci0gICAgaWYgKGlGaWVsZCA8IDApIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaVNldCA9IExvY2F0ZVBhdGNoKGl0OCwgY1BhdGNoKTsKLSAgICBpZiAoaVNldCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBHZXREYXRhKGl0OCwgaVNldCwgaUZpZWxkKTsKLX0KLQotCi1jbXNGbG9hdDY0TnVtYmVyIENNU0VYUE9SVCBjbXNJVDhHZXREYXRhRGJsKGNtc0hBTkRMRSAgaXQ4LCBjb25zdCBjaGFyKiBjUGF0Y2gsIGNvbnN0IGNoYXIqIGNTYW1wbGUpCi17Ci0gICAgY29uc3QgY2hhciogQnVmZmVyOwotCi0gICAgQnVmZmVyID0gY21zSVQ4R2V0RGF0YShpdDgsIGNQYXRjaCwgY1NhbXBsZSk7Ci0KLSAgICByZXR1cm4gUGFyc2VGbG9hdE51bWJlcihCdWZmZXIpOwotfQotCi0KLQotY21zQm9vbCBDTVNFWFBPUlQgY21zSVQ4U2V0RGF0YShjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciogY1BhdGNoLCBjb25zdCBjaGFyKiBjU2FtcGxlLCBjb25zdCBjaGFyICpWYWwpCi17Ci0gICAgY21zSVQ4KiBpdDggPSAoY21zSVQ4KikgaElUODsKLSAgICBpbnQgaUZpZWxkLCBpU2V0OwotICAgIFRBQkxFKiB0OwotCi0gICAgX2Ntc0Fzc2VydChoSVQ4ICE9IE5VTEwpOwotCi0gICAgdCA9IEdldFRhYmxlKGl0OCk7Ci0KLSAgICBpRmllbGQgPSBMb2NhdGVTYW1wbGUoaXQ4LCBjU2FtcGxlKTsKLQotICAgIGlmIChpRmllbGQgPCAwKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBpZiAodC0+IG5QYXRjaGVzID09IDApIHsKLQotICAgICAgICBBbGxvY2F0ZURhdGFGb3JtYXQoaXQ4KTsKLSAgICAgICAgQWxsb2NhdGVEYXRhU2V0KGl0OCk7Ci0gICAgICAgIENvb2tQb2ludGVycyhpdDgpOwotICAgIH0KLQotICAgIGlmIChjbXNzdHJjYXNlY21wKGNTYW1wbGUsICJTQU1QTEVfSUQiKSA9PSAwKSB7Ci0KLSAgICAgICAgaVNldCAgID0gTG9jYXRlRW1wdHlQYXRjaChpdDgpOwotICAgICAgICBpZiAoaVNldCA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBTeW5FcnJvcihpdDgsICJDb3VsZG4ndCBhZGQgbW9yZSBwYXRjaGVzICclcydcbiIsIGNQYXRjaCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpRmllbGQgPSB0IC0+IFNhbXBsZUlEOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgaVNldCA9IExvY2F0ZVBhdGNoKGl0OCwgY1BhdGNoKTsKLSAgICAgICAgaWYgKGlTZXQgPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gU2V0RGF0YShpdDgsIGlTZXQsIGlGaWVsZCwgVmFsKTsKLX0KLQotCi1jbXNCb29sIENNU0VYUE9SVCBjbXNJVDhTZXREYXRhRGJsKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBjUGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNTYW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgVmFsKQotewotICAgIGNtc0lUOCogaXQ4ID0gKGNtc0lUOCopIGhJVDg7Ci0gICAgY2hhciBCdWZmWzI1Nl07Ci0KLSAgICBfY21zQXNzZXJ0KGhJVDggIT0gTlVMTCk7Ci0KLSAgICBzbnByaW50ZihCdWZmLCAyNTUsIGl0OC0+RG91YmxlRm9ybWF0dGVyLCBWYWwpOwotICAgIHJldHVybiBjbXNJVDhTZXREYXRhKGhJVDgsIGNQYXRjaCwgY1NhbXBsZSwgQnVmZik7Ci19Ci0KLS8vIEJ1ZmZlciBzaG91bGQgZ2V0IE1BWFNUUiBhdCBsZWFzdAotCi1jb25zdCBjaGFyKiBDTVNFWFBPUlQgY21zSVQ4R2V0UGF0Y2hOYW1lKGNtc0hBTkRMRSBoSVQ4LCBpbnQgblBhdGNoLCBjaGFyKiBidWZmZXIpCi17Ci0gICAgY21zSVQ4KiBpdDggPSAoY21zSVQ4KikgaElUODsKLSAgICBUQUJMRSogdDsKLSAgICBjaGFyKiBEYXRhOwotCi0gICAgX2Ntc0Fzc2VydChoSVQ4ICE9IE5VTEwpOwotCi0gICAgdCA9IEdldFRhYmxlKGl0OCk7Ci0gICAgRGF0YSA9IEdldERhdGEoaXQ4LCBuUGF0Y2gsIHQtPlNhbXBsZUlEKTsKLQotICAgIGlmICghRGF0YSkgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFidWZmZXIpIHJldHVybiBEYXRhOwotCi0gICAgc3RybmNweShidWZmZXIsIERhdGEsIE1BWFNUUi0xKTsKLSAgICBidWZmZXJbTUFYU1RSLTFdID0gMDsKLSAgICByZXR1cm4gYnVmZmVyOwotfQotCi1pbnQgQ01TRVhQT1JUIGNtc0lUOEdldFBhdGNoQnlOYW1lKGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyICpjUGF0Y2gpCi17Ci0gICAgX2Ntc0Fzc2VydChoSVQ4ICE9IE5VTEwpOwotCi0gICAgcmV0dXJuIExvY2F0ZVBhdGNoKChjbXNJVDgqKWhJVDgsIGNQYXRjaCk7Ci19Ci0KLWNtc1VJbnQzMk51bWJlciBDTVNFWFBPUlQgY21zSVQ4VGFibGVDb3VudChjbXNIQU5ETEUgaElUOCkKLXsKLSAgICBjbXNJVDgqIGl0OCA9IChjbXNJVDgqKSBoSVQ4OwotCi0gICAgX2Ntc0Fzc2VydChoSVQ4ICE9IE5VTEwpOwotCi0gICAgcmV0dXJuIGl0OCAtPlRhYmxlc0NvdW50OwotfQotCi0vLyBUaGlzIGhhbmRsZXMgdGhlICJMQUJFTCIgZXh0ZW5zaW9uLgotLy8gTGFiZWwsIG5UYWJsZSwgVHlwZQotCi1pbnQgQ01TRVhQT1JUIGNtc0lUOFNldFRhYmxlQnlMYWJlbChjbXNIQU5ETEUgaElUOCwgY29uc3QgY2hhciogY1NldCwgY29uc3QgY2hhciogY0ZpZWxkLCBjb25zdCBjaGFyKiBFeHBlY3RlZFR5cGUpCi17Ci0gICAgY29uc3QgY2hhciogY0xhYmVsRmxkOwotICAgIGNoYXIgVHlwZVsyNTZdLCBMYWJlbFsyNTZdOwotICAgIGludCBuVGFibGU7Ci0KLSAgICBfY21zQXNzZXJ0KGhJVDggIT0gTlVMTCk7Ci0KLSAgICBpZiAoY0ZpZWxkICE9IE5VTEwgJiYgKmNGaWVsZCA9PSAwKQotICAgICAgICAgICAgY0ZpZWxkID0gIkxBQkVMIjsKLQotICAgIGlmIChjRmllbGQgPT0gTlVMTCkKLSAgICAgICAgICAgIGNGaWVsZCA9ICJMQUJFTCI7Ci0KLSAgICBjTGFiZWxGbGQgPSBjbXNJVDhHZXREYXRhKGhJVDgsIGNTZXQsIGNGaWVsZCk7Ci0gICAgaWYgKCFjTGFiZWxGbGQpIHJldHVybiAtMTsKLQotICAgIGlmIChzc2NhbmYoY0xhYmVsRmxkLCAiJTI1NXMgJWQgJTI1NXMiLCBMYWJlbCwgJm5UYWJsZSwgVHlwZSkgIT0gMykKLSAgICAgICAgICAgIHJldHVybiAtMTsKLQotICAgIGlmIChFeHBlY3RlZFR5cGUgIT0gTlVMTCAmJiAqRXhwZWN0ZWRUeXBlID09IDApCi0gICAgICAgIEV4cGVjdGVkVHlwZSA9IE5VTEw7Ci0KLSAgICBpZiAoRXhwZWN0ZWRUeXBlKSB7Ci0KLSAgICAgICAgaWYgKGNtc3N0cmNhc2VjbXAoVHlwZSwgRXhwZWN0ZWRUeXBlKSAhPSAwKSByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNtc0lUOFNldFRhYmxlKGhJVDgsIG5UYWJsZSk7Ci19Ci0KLQotY21zQm9vbCBDTVNFWFBPUlQgY21zSVQ4U2V0SW5kZXhDb2x1bW4oY21zSEFORExFIGhJVDgsIGNvbnN0IGNoYXIqIGNTYW1wbGUpCi17Ci0gICAgY21zSVQ4KiBpdDggPSAoY21zSVQ4KikgaElUODsKLSAgICBpbnQgcG9zOwotCi0gICAgX2Ntc0Fzc2VydChoSVQ4ICE9IE5VTEwpOwotCi0gICAgcG9zID0gTG9jYXRlU2FtcGxlKGl0OCwgY1NhbXBsZSk7Ci0gICAgaWYocG9zID09IC0xKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBpdDgtPlRhYltpdDgtPm5UYWJsZV0uU2FtcGxlSUQgPSBwb3M7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotdm9pZCBDTVNFWFBPUlQgY21zSVQ4RGVmaW5lRGJsRm9ybWF0KGNtc0hBTkRMRSBoSVQ4LCBjb25zdCBjaGFyKiBGb3JtYXR0ZXIpCi17Ci0gICAgY21zSVQ4KiBpdDggPSAoY21zSVQ4KikgaElUODsKLQotICAgIF9jbXNBc3NlcnQoaElUOCAhPSBOVUxMKTsKLQotICAgIGlmIChGb3JtYXR0ZXIgPT0gTlVMTCkKLSAgICAgICAgc3RyY3B5KGl0OC0+RG91YmxlRm9ybWF0dGVyLCBERUZBVUxUX0RCTF9GT1JNQVQpOwotICAgIGVsc2UKLSAgICAgICAgc3RybmNweShpdDgtPkRvdWJsZUZvcm1hdHRlciwgRm9ybWF0dGVyLCBzaXplb2YoaXQ4LT5Eb3VibGVGb3JtYXR0ZXIpKTsKLQotICAgIGl0OCAtPkRvdWJsZUZvcm1hdHRlcltzaXplb2YoaXQ4IC0+RG91YmxlRm9ybWF0dGVyKS0xXSA9IDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2NudnJ0LmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2NudnJ0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOTNlODMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNjbnZydC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE0MiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMiBNYXJ0aSBNYXJpYSBTYWd1ZXIKLS8vCi0vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLS8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLS8vIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLS8vIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotLy8gYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlCi0vLyBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotLy8KLS8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi0vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLS8vCi0vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLS8vIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTwotLy8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLS8vIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKLS8vIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLS8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgotLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0KLSNpbmNsdWRlICJsY21zMl9pbnRlcm5hbC5oIgotCi0KLS8vIExpbmsgc2V2ZXJhbCBwcm9maWxlcyB0byBvYnRhaW4gYSBzaW5nbGUgTFVUIG1vZGVsbGluZyB0aGUgd2hvbGUgY29sb3IgdHJhbnNmb3JtLiBJbnRlbnRzLCBCbGFjayBwb2ludAotLy8gY29tcGVuc2F0aW9uIGFuZCBBZGFwdGF0aW9uIHBhcmFtZXRlcnMgbWF5IHZhcnkgYWNyb3NzIHByb2ZpbGVzLiBCUEMgYW5kIEFkYXB0YXRpb24gcmVmZXJzIHRvIHRoZSBQQ1MKLS8vIGFmdGVyIHRoZSBwcm9maWxlLiBJLmUsIEJQQ1swXSByZWZlcnMgdG8gY29ubmV4aW9uIGJldHdlZW4gcHJvZmlsZSgwKSBhbmQgcHJvZmlsZSgxKQotY21zUGlwZWxpbmUqIF9jbXNMaW5rUHJvZmlsZXMoY21zQ29udGV4dCAgICAgQ29udGV4dElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG5Qcm9maWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnRzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSAgICAgaFByb2ZpbGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNCb29sICAgICAgICAgQlBDW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEFkYXB0YXRpb25TdGF0ZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCByb3V0aW5lIGZvciBJQ0Mtc3R5bGUgaW50ZW50cy4gQSB1c2VyIG1heSBkZWNpZGUgdG8gb3ZlcnJpZGUgaXQgYnkgdXNpbmcgYSBwbHVnaW4uCi0vLyBTdXBwb3J0ZWQgaW50ZW50cyBhcmUgcGVyY2VwdHVhbCwgcmVsYXRpdmUgY29sb3JpbWV0cmljLCBzYXR1cmF0aW9uIGFuZCBJQ0MtYWJzb2x1dGUgY29sb3JpbWV0cmljCi1zdGF0aWMKLWNtc1BpcGVsaW5lKiBEZWZhdWx0SUNDaW50ZW50cyhjbXNDb250ZXh0ICAgICBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG5Qcm9maWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW50ZW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFICAgICBoUHJvZmlsZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNCb29sICAgICAgICAgQlBDW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uU3RhdGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBUaGlzIGlzIHRoZSBlbnRyeSBmb3IgYmxhY2stcHJlc2VydmluZyBLLW9ubHkgaW50ZW50cywgd2hpY2ggYXJlIG5vbi1JQ0MuIExhc3QgcHJvZmlsZSBoYXZlIHRvIGJlIGEgb3V0cHV0IHByb2ZpbGUKLS8vIHRvIGRvIHRoZSB0cmljayAobm8gZGV2aWNlbGlua3MgYWxsb3dlZCBhdCB0aGF0IHBvc2l0aW9uKQotc3RhdGljCi1jbXNQaXBlbGluZSogIEJsYWNrUHJlc2VydmluZ0tPbmx5SW50ZW50cyhjbXNDb250ZXh0ICAgICBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgblByb2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEludGVudHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFICAgICBoUHJvZmlsZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Jvb2wgICAgICAgICBCUENbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgQWRhcHRhdGlvblN0YXRlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBUaGlzIGlzIHRoZSBlbnRyeSBmb3IgYmxhY2stcGxhbmUgcHJlc2VydmluZywgd2hpY2ggYXJlIG5vbi1JQ0MuIEFnYWluLCBMYXN0IHByb2ZpbGUgaGF2ZSB0byBiZSBhIG91dHB1dCBwcm9maWxlCi0vLyB0byBkbyB0aGUgdHJpY2sgKG5vIGRldmljZWxpbmtzIGFsbG93ZWQgYXQgdGhhdCBwb3NpdGlvbikKLXN0YXRpYwotY21zUGlwZWxpbmUqICBCbGFja1ByZXNlcnZpbmdLUGxhbmVJbnRlbnRzKGNtc0NvbnRleHQgICAgIENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgblByb2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnRzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgICAgIGhQcm9maWxlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Jvb2wgICAgICAgICBCUENbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEFkYXB0YXRpb25TdGF0ZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncyk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotLy8gVGhpcyBpcyBhIHN0cnVjdHVyZSBob2xkaW5nIGltcGxlbWVudGF0aW9ucyBmb3IgYWxsIHN1cHBvcnRlZCBpbnRlbnRzLgotdHlwZWRlZiBzdHJ1Y3QgX2Ntc19pbnRlbnRzX2xpc3QgewotCi0gICAgY21zVUludDMyTnVtYmVyIEludGVudDsKLSAgICBjaGFyICAgICAgICAgICAgRGVzY3JpcHRpb25bMjU2XTsKLSAgICBjbXNJbnRlbnRGbiAgICAgTGluazsKLSAgICBzdHJ1Y3QgX2Ntc19pbnRlbnRzX2xpc3QqICBOZXh0OwotCi19IGNtc0ludGVudHNMaXN0OwotCi0KLS8vIEJ1aWx0LWluIGludGVudHMKLXN0YXRpYyBjbXNJbnRlbnRzTGlzdCBEZWZhdWx0SW50ZW50c1tdID0gewotCi0gICAgeyBJTlRFTlRfUEVSQ0VQVFVBTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBlcmNlcHR1YWwiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdElDQ2ludGVudHMsICAgICAgICAgICAgJkRlZmF1bHRJbnRlbnRzWzFdIH0sCi0gICAgeyBJTlRFTlRfUkVMQVRJVkVfQ09MT1JJTUVUUklDLCAgICAgICAgICAgICAgICAgIlJlbGF0aXZlIGNvbG9yaW1ldHJpYyIsICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdElDQ2ludGVudHMsICAgICAgICAgICAgJkRlZmF1bHRJbnRlbnRzWzJdIH0sCi0gICAgeyBJTlRFTlRfU0FUVVJBVElPTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNhdHVyYXRpb24iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdElDQ2ludGVudHMsICAgICAgICAgICAgJkRlZmF1bHRJbnRlbnRzWzNdIH0sCi0gICAgeyBJTlRFTlRfQUJTT0xVVEVfQ09MT1JJTUVUUklDLCAgICAgICAgICAgICAgICAgIkFic29sdXRlIGNvbG9yaW1ldHJpYyIsICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdElDQ2ludGVudHMsICAgICAgICAgICAgJkRlZmF1bHRJbnRlbnRzWzRdIH0sCi0gICAgeyBJTlRFTlRfUFJFU0VSVkVfS19PTkxZX1BFUkNFUFRVQUwsICAgICAgICAgICAgIlBlcmNlcHR1YWwgcHJlc2VydmluZyBibGFjayBpbmsiLCAgICAgICAgICAgICAgQmxhY2tQcmVzZXJ2aW5nS09ubHlJbnRlbnRzLCAgJkRlZmF1bHRJbnRlbnRzWzVdIH0sCi0gICAgeyBJTlRFTlRfUFJFU0VSVkVfS19PTkxZX1JFTEFUSVZFX0NPTE9SSU1FVFJJQywgIlJlbGF0aXZlIGNvbG9yaW1ldHJpYyBwcmVzZXJ2aW5nIGJsYWNrIGluayIsICAgQmxhY2tQcmVzZXJ2aW5nS09ubHlJbnRlbnRzLCAgJkRlZmF1bHRJbnRlbnRzWzZdIH0sCi0gICAgeyBJTlRFTlRfUFJFU0VSVkVfS19PTkxZX1NBVFVSQVRJT04sICAgICAgICAgICAgIlNhdHVyYXRpb24gcHJlc2VydmluZyBibGFjayBpbmsiLCAgICAgICAgICAgICAgQmxhY2tQcmVzZXJ2aW5nS09ubHlJbnRlbnRzLCAgJkRlZmF1bHRJbnRlbnRzWzddIH0sCi0gICAgeyBJTlRFTlRfUFJFU0VSVkVfS19QTEFORV9QRVJDRVBUVUFMLCAgICAgICAgICAgIlBlcmNlcHR1YWwgcHJlc2VydmluZyBibGFjayBwbGFuZSIsICAgICAgICAgICAgQmxhY2tQcmVzZXJ2aW5nS1BsYW5lSW50ZW50cywgJkRlZmF1bHRJbnRlbnRzWzhdIH0sCi0gICAgeyBJTlRFTlRfUFJFU0VSVkVfS19QTEFORV9SRUxBVElWRV9DT0xPUklNRVRSSUMsIlJlbGF0aXZlIGNvbG9yaW1ldHJpYyBwcmVzZXJ2aW5nIGJsYWNrIHBsYW5lIiwgQmxhY2tQcmVzZXJ2aW5nS1BsYW5lSW50ZW50cywgJkRlZmF1bHRJbnRlbnRzWzldIH0sCi0gICAgeyBJTlRFTlRfUFJFU0VSVkVfS19QTEFORV9TQVRVUkFUSU9OLCAgICAgICAgICAgIlNhdHVyYXRpb24gcHJlc2VydmluZyBibGFjayBwbGFuZSIsICAgICAgICAgICAgQmxhY2tQcmVzZXJ2aW5nS1BsYW5lSW50ZW50cywgTlVMTCB9Ci19OwotCi0KLS8vIEEgcG9pbnRlciB0byB0aGUgYmVnaW5pbmcgb2YgdGhlIGxpc3QKLV9jbXNJbnRlbnRzUGx1Z2luQ2h1bmtUeXBlIF9jbXNJbnRlbnRzUGx1Z2luQ2h1bmsgPSB7IE5VTEwgfTsKLQotLy8gRHVwbGljYXRlcyB0aGUgem9uZSBvZiBtZW1vcnkgdXNlZCBieSB0aGUgcGx1Zy1pbiBpbiB0aGUgbmV3IGNvbnRleHQKLXN0YXRpYwotdm9pZCBEdXBQbHVnaW5JbnRlbnRzTGlzdChzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCi17Ci0gICBfY21zSW50ZW50c1BsdWdpbkNodW5rVHlwZSBuZXdIZWFkID0geyBOVUxMIH07Ci0gICBjbXNJbnRlbnRzTGlzdCogIGVudHJ5OwotICAgY21zSW50ZW50c0xpc3QqICBBbnRlcmlvciA9IE5VTEw7Ci0gICBfY21zSW50ZW50c1BsdWdpbkNodW5rVHlwZSogaGVhZCA9IChfY21zSW50ZW50c1BsdWdpbkNodW5rVHlwZSopIHNyYy0+Y2h1bmtzW0ludGVudFBsdWdpbl07Ci0KLSAgICAvLyBXYWxrIHRoZSBsaXN0IGNvcHlpbmcgYWxsIG5vZGVzCi0gICBmb3IgKGVudHJ5ID0gaGVhZC0+SW50ZW50czsKLSAgICAgICAgZW50cnkgIT0gTlVMTDsKLSAgICAgICAgZW50cnkgPSBlbnRyeSAtPk5leHQpIHsKLQotICAgICAgICAgICAgY21zSW50ZW50c0xpc3QgKm5ld0VudHJ5ID0gKCBjbXNJbnRlbnRzTGlzdCAqKSBfY21zU3ViQWxsb2NEdXAoY3R4IC0+TWVtUG9vbCwgZW50cnksIHNpemVvZihjbXNJbnRlbnRzTGlzdCkpOwotICAgCi0gICAgICAgICAgICBpZiAobmV3RW50cnkgPT0gTlVMTCkgCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICAvLyBXZSB3YW50IHRvIGtlZXAgdGhlIGxpbmtlZCBsaXN0IG9yZGVyLCBzbyB0aGlzIGlzIGEgbGl0dGxlIGJpdCB0cmlja3kKLSAgICAgICAgICAgIG5ld0VudHJ5IC0+IE5leHQgPSBOVUxMOwotICAgICAgICAgICAgaWYgKEFudGVyaW9yKQotICAgICAgICAgICAgICAgIEFudGVyaW9yIC0+IE5leHQgPSBuZXdFbnRyeTsKLSAgICAgCi0gICAgICAgICAgICBBbnRlcmlvciA9IG5ld0VudHJ5OwotCi0gICAgICAgICAgICBpZiAobmV3SGVhZC5JbnRlbnRzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgbmV3SGVhZC5JbnRlbnRzID0gbmV3RW50cnk7Ci0gICAgfQotCi0gIGN0eCAtPmNodW5rc1tJbnRlbnRQbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eC0+TWVtUG9vbCwgJm5ld0hlYWQsIHNpemVvZihfY21zSW50ZW50c1BsdWdpbkNodW5rVHlwZSkpOwotfQotCi12b2lkICBfY21zQWxsb2NJbnRlbnRzUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQotewotICAgIGlmIChzcmMgIT0gTlVMTCkgewotCi0gICAgICAgIC8vIENvcHkgYWxsIGxpbmtlZCBsaXN0Ci0gICAgICAgIER1cFBsdWdpbkludGVudHNMaXN0KGN0eCwgc3JjKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHN0YXRpYyBfY21zSW50ZW50c1BsdWdpbkNodW5rVHlwZSBJbnRlbnRzUGx1Z2luQ2h1bmtUeXBlID0geyBOVUxMIH07Ci0gICAgICAgIGN0eCAtPmNodW5rc1tJbnRlbnRQbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsICZJbnRlbnRzUGx1Z2luQ2h1bmtUeXBlLCBzaXplb2YoX2Ntc0ludGVudHNQbHVnaW5DaHVua1R5cGUpKTsKLSAgICB9Ci19Ci0KLQotLy8gU2VhcmNoIHRoZSBsaXN0IGZvciBhIHN1aXRhYmxlIGludGVudC4gUmV0dXJucyBOVUxMIGlmIG5vdCBmb3VuZAotc3RhdGljCi1jbXNJbnRlbnRzTGlzdCogU2VhcmNoSW50ZW50KGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgSW50ZW50KQotewotICAgIF9jbXNJbnRlbnRzUGx1Z2luQ2h1bmtUeXBlKiBjdHggPSAoIF9jbXNJbnRlbnRzUGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIEludGVudFBsdWdpbik7Ci0gICAgY21zSW50ZW50c0xpc3QqIHB0OwotCi0gICAgZm9yIChwdCA9IGN0eCAtPiBJbnRlbnRzOyBwdCAhPSBOVUxMOyBwdCA9IHB0IC0+IE5leHQpCi0gICAgICAgIGlmIChwdCAtPkludGVudCA9PSBJbnRlbnQpIHJldHVybiBwdDsKLQotICAgIGZvciAocHQgPSBEZWZhdWx0SW50ZW50czsgcHQgIT0gTlVMTDsgcHQgPSBwdCAtPiBOZXh0KQotICAgICAgICBpZiAocHQgLT5JbnRlbnQgPT0gSW50ZW50KSByZXR1cm4gcHQ7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLy8gQmxhY2sgcG9pbnQgY29tcGVuc2F0aW9uLiBJbXBsZW1lbnRlZCBhcyBhIGxpbmVhciBzY2FsaW5nIGluIFhZWi4gQmxhY2sgcG9pbnRzCi0vLyBzaG91bGQgY29tZSByZWxhdGl2ZSB0byB0aGUgd2hpdGUgcG9pbnQuIEZpbGxzIGFuIG1hdHJpeC9vZmZzZXQgZWxlbWVudCBtCi0vLyB3aGljaCBpcyBvcmdhbml6ZWQgYXMgYSA0eDQgbWF0cml4Lgotc3RhdGljCi12b2lkIENvbXB1dGVCbGFja1BvaW50Q29tcGVuc2F0aW9uKGNvbnN0IGNtc0NJRVhZWiogQmxhY2tQb2ludEluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNDSUVYWVoqIEJsYWNrUG9pbnRPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc01BVDMqIG0sIGNtc1ZFQzMqIG9mZikKLXsKLSAgY21zRmxvYXQ2NE51bWJlciBheCwgYXksIGF6LCBieCwgYnksIGJ6LCB0eCwgdHksIHR6OwotCi0gICAvLyBOb3cgd2UgbmVlZCB0byBjb21wdXRlIGEgbWF0cml4IHBsdXMgYW4gb2Zmc2V0IG0gYW5kIG9mIHN1Y2ggb2YKLSAgIC8vIFttXSpicGluICsgb2ZmID0gYnBvdXQKLSAgIC8vIFttXSpENTAgICsgb2ZmID0gRDUwCi0gICAvLwotICAgLy8gVGhpcyBpcyBhIGxpbmVhciBzY2FsaW5nIGluIHRoZSBmb3JtIGF4K2IsIHdoZXJlCi0gICAvLyBhID0gKGJwb3V0IC0gRDUwKSAvIChicGluIC0gRDUwKQotICAgLy8gYiA9IC0gRDUwKiAoYnBvdXQgLSBicGluKSAvIChicGluIC0gRDUwKQotCi0gICB0eCA9IEJsYWNrUG9pbnRJbi0+WCAtIGNtc0Q1MF9YWVooKS0+WDsKLSAgIHR5ID0gQmxhY2tQb2ludEluLT5ZIC0gY21zRDUwX1hZWigpLT5ZOwotICAgdHogPSBCbGFja1BvaW50SW4tPlogLSBjbXNENTBfWFlaKCktPlo7Ci0KLSAgIGF4ID0gKEJsYWNrUG9pbnRPdXQtPlggLSBjbXNENTBfWFlaKCktPlgpIC8gdHg7Ci0gICBheSA9IChCbGFja1BvaW50T3V0LT5ZIC0gY21zRDUwX1hZWigpLT5ZKSAvIHR5OwotICAgYXogPSAoQmxhY2tQb2ludE91dC0+WiAtIGNtc0Q1MF9YWVooKS0+WikgLyB0ejsKLQotICAgYnggPSAtIGNtc0Q1MF9YWVooKS0+IFggKiAoQmxhY2tQb2ludE91dC0+WCAtIEJsYWNrUG9pbnRJbi0+WCkgLyB0eDsKLSAgIGJ5ID0gLSBjbXNENTBfWFlaKCktPiBZICogKEJsYWNrUG9pbnRPdXQtPlkgLSBCbGFja1BvaW50SW4tPlkpIC8gdHk7Ci0gICBieiA9IC0gY21zRDUwX1hZWigpLT4gWiAqIChCbGFja1BvaW50T3V0LT5aIC0gQmxhY2tQb2ludEluLT5aKSAvIHR6OwotCi0gICBfY21zVkVDM2luaXQoJm0gLT52WzBdLCBheCwgMCwgIDApOwotICAgX2Ntc1ZFQzNpbml0KCZtIC0+dlsxXSwgMCwgYXksICAwKTsKLSAgIF9jbXNWRUMzaW5pdCgmbSAtPnZbMl0sIDAsICAwLCAgYXopOwotICAgX2Ntc1ZFQzNpbml0KG9mZiwgYngsIGJ5LCBieik7Ci0KLX0KLQotCi0vLyBBcHByb3hpbWF0ZSBhIGJsYWNrYm9keSBpbGx1bWluYW50IGJhc2VkIG9uIENIQUQgaW5mb3JtYXRpb24KLXN0YXRpYwotY21zRmxvYXQ2NE51bWJlciBDSEFEMlRlbXAoY29uc3QgY21zTUFUMyogQ2hhZCkKLXsKLSAgICAvLyBDb252ZXJ0IEQ1MCBhY3Jvc3MgaW52ZXJzZSBDSEFEIHRvIGdldCB0aGUgYWJzb2x1dGUgd2hpdGUgcG9pbnQKLSAgICBjbXNWRUMzIGQsIHM7Ci0gICAgY21zQ0lFWFlaIERlc3Q7Ci0gICAgY21zQ0lFeHlZIERlc3RDaHJvbWF0aWNpdHk7Ci0gICAgY21zRmxvYXQ2NE51bWJlciBUZW1wSzsKLSAgICBjbXNNQVQzIG0xLCBtMjsKLQotICAgIG0xID0gKkNoYWQ7Ci0gICAgaWYgKCFfY21zTUFUM2ludmVyc2UoJm0xLCAmbTIpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBzLm5bVlhdID0gY21zRDUwX1hZWigpIC0+IFg7Ci0gICAgcy5uW1ZZXSA9IGNtc0Q1MF9YWVooKSAtPiBZOwotICAgIHMubltWWl0gPSBjbXNENTBfWFlaKCkgLT4gWjsKLQotICAgIF9jbXNNQVQzZXZhbCgmZCwgJm0yLCAmcyk7Ci0KLSAgICBEZXN0LlggPSBkLm5bVlhdOwotICAgIERlc3QuWSA9IGQubltWWV07Ci0gICAgRGVzdC5aID0gZC5uW1ZaXTsKLQotICAgIGNtc1hZWjJ4eVkoJkRlc3RDaHJvbWF0aWNpdHksICZEZXN0KTsKLQotICAgIGlmICghY21zVGVtcEZyb21XaGl0ZVBvaW50KCZUZW1wSywgJkRlc3RDaHJvbWF0aWNpdHkpKQotICAgICAgICByZXR1cm4gLTEuMDsKLQotICAgIHJldHVybiBUZW1wSzsKLX0KLQotLy8gQ29tcHV0ZSBhIENIQUQgYmFzZWQgb24gYSBnaXZlbiB0ZW1wZXJhdHVyZQotc3RhdGljCi0gICAgdm9pZCBUZW1wMkNIQUQoY21zTUFUMyogQ2hhZCwgY21zRmxvYXQ2NE51bWJlciBUZW1wKQotewotICAgIGNtc0NJRVhZWiBXaGl0ZTsKLSAgICBjbXNDSUV4eVkgQ2hyb21hdGljaXR5T2ZXaGl0ZTsKLQotICAgIGNtc1doaXRlUG9pbnRGcm9tVGVtcCgmQ2hyb21hdGljaXR5T2ZXaGl0ZSwgVGVtcCk7Ci0gICAgY21zeHlZMlhZWigmV2hpdGUsICZDaHJvbWF0aWNpdHlPZldoaXRlKTsKLSAgICBfY21zQWRhcHRhdGlvbk1hdHJpeChDaGFkLCBOVUxMLCAmV2hpdGUsIGNtc0Q1MF9YWVooKSk7Ci19Ci0KLS8vIEpvaW4gc2NhbGluZ3MgdG8gb2J0YWluIHJlbGF0aXZlIGlucHV0IHRvIGFic29sdXRlIGFuZCB0aGVuIHRvIHJlbGF0aXZlIG91dHB1dC4KLS8vIFJlc3VsdCBpcyBzdG9yZWQgaW4gYSAzeDMgbWF0cml4Ci1zdGF0aWMKLWNtc0Jvb2wgIENvbXB1dGVBYnNvbHV0ZUludGVudChjbXNGbG9hdDY0TnVtYmVyIEFkYXB0YXRpb25TdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNDSUVYWVoqIFdoaXRlUG9pbnRJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNNQVQzKiBDaHJvbWF0aWNBZGFwdGF0aW9uTWF0cml4SW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zQ0lFWFlaKiBXaGl0ZVBvaW50T3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc01BVDMqIENocm9tYXRpY0FkYXB0YXRpb25NYXRyaXhPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zTUFUMyogbSkKLXsKLSAgICBjbXNNQVQzIFNjYWxlLCBtMSwgbTIsIG0zLCBtNDsKLQotICAgIC8vIEFkYXB0YXRpb24gc3RhdGUKLSAgICBpZiAoQWRhcHRhdGlvblN0YXRlID09IDEuMCkgewotCi0gICAgICAgIC8vIE9ic2VydmVyIGlzIGZ1bGx5IGFkYXB0ZWQuIEtlZXAgY2hyb21hdGljIGFkYXB0YXRpb24uCi0gICAgICAgIC8vIFRoYXQgaXMgdGhlIHN0YW5kYXJkIFY0IGJlaGF2aW91cgotICAgICAgICBfY21zVkVDM2luaXQoJm0tPnZbMF0sIFdoaXRlUG9pbnRJbi0+WCAvIFdoaXRlUG9pbnRPdXQtPlgsIDAsIDApOwotICAgICAgICBfY21zVkVDM2luaXQoJm0tPnZbMV0sIDAsIFdoaXRlUG9pbnRJbi0+WSAvIFdoaXRlUG9pbnRPdXQtPlksIDApOwotICAgICAgICBfY21zVkVDM2luaXQoJm0tPnZbMl0sIDAsIDAsIFdoaXRlUG9pbnRJbi0+WiAvIFdoaXRlUG9pbnRPdXQtPlopOwotCi0gICAgfQotICAgIGVsc2UgIHsKLQotICAgICAgICAvLyBJbmNvbXBsZXRlIGFkYXB0YXRpb24uIFRoaXMgaXMgYW4gYWR2YW5jZWQgZmVhdHVyZS4KLSAgICAgICAgX2Ntc1ZFQzNpbml0KCZTY2FsZS52WzBdLCBXaGl0ZVBvaW50SW4tPlggLyBXaGl0ZVBvaW50T3V0LT5YLCAwLCAwKTsKLSAgICAgICAgX2Ntc1ZFQzNpbml0KCZTY2FsZS52WzFdLCAwLCAgV2hpdGVQb2ludEluLT5ZIC8gV2hpdGVQb2ludE91dC0+WSwgMCk7Ci0gICAgICAgIF9jbXNWRUMzaW5pdCgmU2NhbGUudlsyXSwgMCwgMCwgIFdoaXRlUG9pbnRJbi0+WiAvIFdoaXRlUG9pbnRPdXQtPlopOwotCi0KLSAgICAgICAgaWYgKEFkYXB0YXRpb25TdGF0ZSA9PSAwLjApIHsKLQotICAgICAgICAgICAgbTEgPSAqQ2hyb21hdGljQWRhcHRhdGlvbk1hdHJpeE91dDsKLSAgICAgICAgICAgIF9jbXNNQVQzcGVyKCZtMiwgJm0xLCAmU2NhbGUpOwotICAgICAgICAgICAgLy8gbTIgaG9sZHMgQ0hBRCBmcm9tIG91dHB1dCB3aGl0ZSB0byBENTAgdGltZXMgYWJzLiBjb2wuIHNjYWxpbmcKLQotICAgICAgICAgICAgLy8gT2JzZXJ2ZXIgaXMgbm90IGFkYXB0ZWQsIHVuZG8gdGhlIGNocm9tYXRpYyBhZGFwdGF0aW9uCi0gICAgICAgICAgICBfY21zTUFUM3BlcihtLCAmbTIsIENocm9tYXRpY0FkYXB0YXRpb25NYXRyaXhPdXQpOwotCi0gICAgICAgICAgICBtMyA9ICpDaHJvbWF0aWNBZGFwdGF0aW9uTWF0cml4SW47Ci0gICAgICAgICAgICBpZiAoIV9jbXNNQVQzaW52ZXJzZSgmbTMsICZtNCkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIF9jbXNNQVQzcGVyKG0sICZtMiwgJm00KTsKLQotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICBjbXNNQVQzIE1peGVkQ0hBRDsKLSAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgVGVtcFNyYywgVGVtcERlc3QsIFRlbXA7Ci0KLSAgICAgICAgICAgIG0xID0gKkNocm9tYXRpY0FkYXB0YXRpb25NYXRyaXhJbjsKLSAgICAgICAgICAgIGlmICghX2Ntc01BVDNpbnZlcnNlKCZtMSwgJm0yKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgX2Ntc01BVDNwZXIoJm0zLCAmbTIsICZTY2FsZSk7Ci0gICAgICAgICAgICAvLyBtMyBob2xkcyBDSEFEIGZyb20gaW5wdXQgd2hpdGUgdG8gRDUwIHRpbWVzIGFicy4gY29sLiBzY2FsaW5nCi0KLSAgICAgICAgICAgIFRlbXBTcmMgID0gQ0hBRDJUZW1wKENocm9tYXRpY0FkYXB0YXRpb25NYXRyaXhJbik7Ci0gICAgICAgICAgICBUZW1wRGVzdCA9IENIQUQyVGVtcChDaHJvbWF0aWNBZGFwdGF0aW9uTWF0cml4T3V0KTsKLQotICAgICAgICAgICAgaWYgKFRlbXBTcmMgPCAwLjAgfHwgVGVtcERlc3QgPCAwLjApIHJldHVybiBGQUxTRTsgLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcKLQotICAgICAgICAgICAgaWYgKF9jbXNNQVQzaXNJZGVudGl0eSgmU2NhbGUpICYmIGZhYnMoVGVtcFNyYyAtIFRlbXBEZXN0KSA8IDAuMDEpIHsKLQotICAgICAgICAgICAgICAgIF9jbXNNQVQzaWRlbnRpdHkobSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFRlbXAgPSAoMS4wIC0gQWRhcHRhdGlvblN0YXRlKSAqIFRlbXBEZXN0ICsgQWRhcHRhdGlvblN0YXRlICogVGVtcFNyYzsKLQotICAgICAgICAgICAgLy8gR2V0IGEgQ0hBRCBmcm9tIHdoYXRldmVyIG91dHB1dCB0ZW1wZXJhdHVyZSB0byBENTAuIFRoaXMgcmVwbGFjZXMgb3V0cHV0IENIQUQKLSAgICAgICAgICAgIFRlbXAyQ0hBRCgmTWl4ZWRDSEFELCBUZW1wKTsKLQotICAgICAgICAgICAgX2Ntc01BVDNwZXIobSwgJm0zLCAmTWl4ZWRDSEFEKTsKLSAgICAgICAgfQotCi0gICAgfQotICAgIHJldHVybiBUUlVFOwotCi19Ci0KLS8vIEp1c3QgdG8gc2VlIGlmIG0gbWF0cml4IHNob3VsZCBiZSBhcHBsaWVkCi1zdGF0aWMKLWNtc0Jvb2wgSXNFbXB0eUxheWVyKGNtc01BVDMqIG0sIGNtc1ZFQzMqIG9mZikKLXsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIGRpZmYgPSAwOwotICAgIGNtc01BVDMgSWRlbnQ7Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAobSA9PSBOVUxMICYmIG9mZiA9PSBOVUxMKSByZXR1cm4gVFJVRTsgIC8vIE5VTEwgaXMgYWxsb3dlZCBhcyBhbiBlbXB0eSBsYXllcgotICAgIGlmIChtID09IE5VTEwgJiYgb2ZmICE9IE5VTEwpIHJldHVybiBGQUxTRTsgLy8gVGhpcyBpcyBhbiBpbnRlcm5hbCBlcnJvcgotCi0gICAgX2Ntc01BVDNpZGVudGl0eSgmSWRlbnQpOwotCi0gICAgZm9yIChpPTA7IGkgPCAzKjM7IGkrKykKLSAgICAgICAgZGlmZiArPSBmYWJzKCgoY21zRmxvYXQ2NE51bWJlciopbSlbaV0gLSAoKGNtc0Zsb2F0NjROdW1iZXIqKSZJZGVudClbaV0pOwotCi0gICAgZm9yIChpPTA7IGkgPCAzOyBpKyspCi0gICAgICAgIGRpZmYgKz0gZmFicygoKGNtc0Zsb2F0NjROdW1iZXIqKW9mZilbaV0pOwotCi0KLSAgICByZXR1cm4gKGRpZmYgPCAwLjAwMik7Ci19Ci0KLQotLy8gQ29tcHV0ZSB0aGUgY29udmVyc2lvbiBsYXllcgotc3RhdGljCi1jbXNCb29sIENvbXB1dGVDb252ZXJzaW9uKGludCBpLCBjbXNIUFJPRklMRSBoUHJvZmlsZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNCb29sIEJQQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgQWRhcHRhdGlvblN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zTUFUMyogbSwgY21zVkVDMyogb2ZmKQotewotCi0gICAgaW50IGs7Ci0KLSAgICAvLyBtICBhbmQgb2ZmIGFyZSBzZXQgdG8gaWRlbnRpdHkgYW5kIHRoaXMgaXMgZGV0ZWN0ZWQgbGF0dGVyIG9uCi0gICAgX2Ntc01BVDNpZGVudGl0eShtKTsKLSAgICBfY21zVkVDM2luaXQob2ZmLCAwLCAwLCAwKTsKLQotICAgIC8vIElmIGludGVudCBpcyBhYnMuIGNvbG9yaW1ldHJpYywKLSAgICBpZiAoSW50ZW50ID09IElOVEVOVF9BQlNPTFVURV9DT0xPUklNRVRSSUMpIHsKLQotICAgICAgICBjbXNDSUVYWVogV2hpdGVQb2ludEluLCBXaGl0ZVBvaW50T3V0OwotICAgICAgICBjbXNNQVQzIENocm9tYXRpY0FkYXB0YXRpb25NYXRyaXhJbiwgQ2hyb21hdGljQWRhcHRhdGlvbk1hdHJpeE91dDsKLQotICAgICAgICBfY21zUmVhZE1lZGlhV2hpdGVQb2ludCgmV2hpdGVQb2ludEluLCAgaFByb2ZpbGVzW2ktMV0pOwotICAgICAgICBfY21zUmVhZENIQUQoJkNocm9tYXRpY0FkYXB0YXRpb25NYXRyaXhJbiwgaFByb2ZpbGVzW2ktMV0pOwotCi0gICAgICAgIF9jbXNSZWFkTWVkaWFXaGl0ZVBvaW50KCZXaGl0ZVBvaW50T3V0LCAgaFByb2ZpbGVzW2ldKTsKLSAgICAgICAgX2Ntc1JlYWRDSEFEKCZDaHJvbWF0aWNBZGFwdGF0aW9uTWF0cml4T3V0LCBoUHJvZmlsZXNbaV0pOwotCi0gICAgICAgIGlmICghQ29tcHV0ZUFic29sdXRlSW50ZW50KEFkYXB0YXRpb25TdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV2hpdGVQb2ludEluLCAgJkNocm9tYXRpY0FkYXB0YXRpb25NYXRyaXhJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmV2hpdGVQb2ludE91dCwgJkNocm9tYXRpY0FkYXB0YXRpb25NYXRyaXhPdXQsIG0pKSByZXR1cm4gRkFMU0U7Ci0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8vIFJlc3Qgb2YgaW50ZW50cyBtYXkgYXBwbHkgQlBDLgotCi0gICAgICAgIGlmIChCUEMpIHsKLQotICAgICAgICAgICAgY21zQ0lFWFlaIEJsYWNrUG9pbnRJbiwgQmxhY2tQb2ludE91dDsKLQotICAgICAgICAgICAgY21zRGV0ZWN0QmxhY2tQb2ludCgmQmxhY2tQb2ludEluLCAgaFByb2ZpbGVzW2ktMV0sIEludGVudCwgMCk7Ci0gICAgICAgICAgICBjbXNEZXRlY3REZXN0aW5hdGlvbkJsYWNrUG9pbnQoJkJsYWNrUG9pbnRPdXQsIGhQcm9maWxlc1tpXSwgSW50ZW50LCAwKTsKLQotICAgICAgICAgICAgLy8gSWYgYmxhY2sgcG9pbnRzIGFyZSBlcXVhbCwgdGhlbiBkbyBub3RoaW5nCi0gICAgICAgICAgICBpZiAoQmxhY2tQb2ludEluLlggIT0gQmxhY2tQb2ludE91dC5YIHx8Ci0gICAgICAgICAgICAgICAgQmxhY2tQb2ludEluLlkgIT0gQmxhY2tQb2ludE91dC5ZIHx8Ci0gICAgICAgICAgICAgICAgQmxhY2tQb2ludEluLlogIT0gQmxhY2tQb2ludE91dC5aKQotICAgICAgICAgICAgICAgICAgICBDb21wdXRlQmxhY2tQb2ludENvbXBlbnNhdGlvbigmQmxhY2tQb2ludEluLCAmQmxhY2tQb2ludE91dCwgbSwgb2ZmKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE9mZnNldCBzaG91bGQgYmUgYWRqdXN0ZWQgYmVjYXVzZSB0aGUgZW5jb2RpbmcuIFdlIGVuY29kZSBYWVogbm9ybWFsaXplZCB0byAwLi4xLjAsCi0gICAgLy8gdG8gZG8gdGhhdCwgd2UgZGl2aWRlIGJ5IE1BWF9FTkNPREVBQkxFX1haWS4gVGhlIGNvbnZlcnNpb24gc3RhZ2UgZ29lcyBYWVogLT4gWFlaIHNvCi0gICAgLy8gd2UgaGF2ZSBmaXJzdCB0byBjb252ZXJ0IGZyb20gZW5jb2RlZCB0byBYWVogYW5kIHRoZW4gY29udmVydCBiYWNrIHRvIGVuY29kZWQuCi0gICAgLy8geSA9IE14ICsgT2ZmCi0gICAgLy8geCA9IHgnYwotICAgIC8vIHkgPSBNIHgnYyArIE9mZgotICAgIC8vIHkgPSB5J2M7IHknID0geSAvIGMKLSAgICAvLyB5JyA9IChNeCdjICsgT2ZmKSAvYyA9IE14JyArIChPZmYgLyBjKQotCi0gICAgZm9yIChrPTA7IGsgPCAzOyBrKyspIHsKLSAgICAgICAgb2ZmIC0+bltrXSAvPSBNQVhfRU5DT0RFQUJMRV9YWVo7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLy8gQWRkIGEgY29udmVyc2lvbiBzdGFnZSBpZiBuZWVkZWQuIElmIGEgbWF0cml4L29mZnNldCBtIGlzIGdpdmVuLCBpdCBhcHBsaWVzIHRvIFhZWiBzcGFjZQotc3RhdGljCi1jbXNCb29sIEFkZENvbnZlcnNpb24oY21zUGlwZWxpbmUqIFJlc3VsdCwgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBJblBDUywgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBPdXRQQ1MsIGNtc01BVDMqIG0sIGNtc1ZFQzMqIG9mZikKLXsKLSAgICBjbXNGbG9hdDY0TnVtYmVyKiBtX2FzX2RibCA9IChjbXNGbG9hdDY0TnVtYmVyKikgbTsKLSAgICBjbXNGbG9hdDY0TnVtYmVyKiBvZmZfYXNfZGJsID0gKGNtc0Zsb2F0NjROdW1iZXIqKSBvZmY7Ci0KLSAgICAvLyBIYW5kbGUgUENTIG1pc21hdGNoZXMuIEEgc3BlY2lhbGl6ZWQgc3RhZ2UgaXMgYWRkZWQgdG8gdGhlIExVVCBpbiBzdWNoIGNhc2UKLSAgICBzd2l0Y2ggKEluUENTKSB7Ci0KLSAgICBjYXNlIGNtc1NpZ1hZWkRhdGE6IC8vIElucHV0IHByb2ZpbGUgb3BlcmF0ZXMgaW4gWFlaCi0KLSAgICAgICAgc3dpdGNoIChPdXRQQ1MpIHsKLQotICAgICAgICBjYXNlIGNtc1NpZ1hZWkRhdGE6ICAvLyBYWVogLT4gWFlaCi0gICAgICAgICAgICBpZiAoIUlzRW1wdHlMYXllcihtLCBvZmYpICYmCi0gICAgICAgICAgICAgICAgIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoUmVzdWx0LCBjbXNBVF9FTkQsIGNtc1N0YWdlQWxsb2NNYXRyaXgoUmVzdWx0IC0+Q29udGV4dElELCAzLCAzLCBtX2FzX2RibCwgb2ZmX2FzX2RibCkpKQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY21zU2lnTGFiRGF0YTogIC8vIFhZWiAtPiBMYWIKLSAgICAgICAgICAgIGlmICghSXNFbXB0eUxheWVyKG0sIG9mZikgJiYKLSAgICAgICAgICAgICAgICAhY21zUGlwZWxpbmVJbnNlcnRTdGFnZShSZXN1bHQsIGNtc0FUX0VORCwgY21zU3RhZ2VBbGxvY01hdHJpeChSZXN1bHQgLT5Db250ZXh0SUQsIDMsIDMsIG1fYXNfZGJsLCBvZmZfYXNfZGJsKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKFJlc3VsdCwgY21zQVRfRU5ELCBfY21zU3RhZ2VBbGxvY1hZWjJMYWIoUmVzdWx0IC0+Q29udGV4dElEKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsgICAvLyBDb2xvcnNwYWNlIG1pc21hdGNoCi0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGNtc1NpZ0xhYkRhdGE6IC8vIElucHV0IHByb2ZpbGUgb3BlcmF0ZXMgaW4gTGFiCi0KLSAgICAgICAgc3dpdGNoIChPdXRQQ1MpIHsKLQotICAgICAgICBjYXNlIGNtc1NpZ1hZWkRhdGE6ICAvLyBMYWIgLT4gWFlaCi0KLSAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShSZXN1bHQsIGNtc0FUX0VORCwgX2Ntc1N0YWdlQWxsb2NMYWIyWFlaKFJlc3VsdCAtPkNvbnRleHRJRCkpKQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIGlmICghSXNFbXB0eUxheWVyKG0sIG9mZikgJiYKLSAgICAgICAgICAgICAgICAhY21zUGlwZWxpbmVJbnNlcnRTdGFnZShSZXN1bHQsIGNtc0FUX0VORCwgY21zU3RhZ2VBbGxvY01hdHJpeChSZXN1bHQgLT5Db250ZXh0SUQsIDMsIDMsIG1fYXNfZGJsLCBvZmZfYXNfZGJsKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBjbXNTaWdMYWJEYXRhOiAgLy8gTGFiIC0+IExhYgotCi0gICAgICAgICAgICBpZiAoIUlzRW1wdHlMYXllcihtLCBvZmYpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKFJlc3VsdCwgY21zQVRfRU5ELCBfY21zU3RhZ2VBbGxvY0xhYjJYWVooUmVzdWx0IC0+Q29udGV4dElEKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoUmVzdWx0LCBjbXNBVF9FTkQsIGNtc1N0YWdlQWxsb2NNYXRyaXgoUmVzdWx0IC0+Q29udGV4dElELCAzLCAzLCBtX2FzX2RibCwgb2ZmX2FzX2RibCkpIHx8Ci0gICAgICAgICAgICAgICAgICAgICFjbXNQaXBlbGluZUluc2VydFN0YWdlKFJlc3VsdCwgY21zQVRfRU5ELCBfY21zU3RhZ2VBbGxvY1hZWjJMYWIoUmVzdWx0IC0+Q29udGV4dElEKSkpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvLyBNaXNtYXRjaAotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIE9uIGNvbG9yc3BhY2VzIG90aGVyIHRoYW4gUENTLCBjaGVjayBmb3Igc2FtZSBzcGFjZQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmIChJblBDUyAhPSBPdXRQQ1MpIHJldHVybiBGQUxTRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLy8gSXMgYSBnaXZlbiBzcGFjZSBjb21wYXRpYmxlIHdpdGggYW5vdGhlcj8KLXN0YXRpYwotY21zQm9vbCBDb2xvclNwYWNlSXNDb21wYXRpYmxlKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgYSwgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBiKQotewotICAgIC8vIElmIHRoZXkgYXJlIHNhbWUsIHRoZXkgYXJlIGNvbXBhdGlibGUuCi0gICAgaWYgKGEgPT0gYikgcmV0dXJuIFRSVUU7Ci0KLSAgICAvLyBDaGVjayBmb3IgTUNINCBzdWJzdGl0dXRpb24gb2YgQ01ZSwotICAgIGlmICgoYSA9PSBjbXNTaWc0Y29sb3JEYXRhKSAmJiAoYiA9PSBjbXNTaWdDbXlrRGF0YSkpIHJldHVybiBUUlVFOwotICAgIGlmICgoYSA9PSBjbXNTaWdDbXlrRGF0YSkgJiYgKGIgPT0gY21zU2lnNGNvbG9yRGF0YSkpIHJldHVybiBUUlVFOwotCi0gICAgLy8gQ2hlY2sgZm9yIFhZWi9MYWIuIFRob3NlIHNwYWNlcyBhcmUgaW50ZXJjaGFuZ2VhYmxlIGFzIHRoZXkgY2FuIGJlIGNvbXB1dGVkIG9uZSBmcm9tIG90aGVyLgotICAgIGlmICgoYSA9PSBjbXNTaWdYWVpEYXRhKSAmJiAoYiA9PSBjbXNTaWdMYWJEYXRhKSkgcmV0dXJuIFRSVUU7Ci0gICAgaWYgKChhID09IGNtc1NpZ0xhYkRhdGEpICYmIChiID09IGNtc1NpZ1hZWkRhdGEpKSByZXR1cm4gVFJVRTsKLQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotCi0vLyBEZWZhdWx0IGhhbmRsZXIgZm9yIElDQy1zdHlsZSBpbnRlbnRzCi1zdGF0aWMKLWNtc1BpcGVsaW5lKiBEZWZhdWx0SUNDaW50ZW50cyhjbXNDb250ZXh0ICAgICAgIENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgIG5Qcm9maWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgIFRoZUludGVudHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSAgICAgIGhQcm9maWxlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Jvb2wgICAgICAgICAgQlBDW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uU3RhdGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICBkd0ZsYWdzKQotewotICAgIGNtc1BpcGVsaW5lKiBMdXQgPSBOVUxMOwotICAgIGNtc1BpcGVsaW5lKiBSZXN1bHQ7Ci0gICAgY21zSFBST0ZJTEUgaFByb2ZpbGU7Ci0gICAgY21zTUFUMyBtOwotICAgIGNtc1ZFQzMgb2ZmOwotICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgQ29sb3JTcGFjZUluLCBDb2xvclNwYWNlT3V0LCBDdXJyZW50Q29sb3JTcGFjZTsKLSAgICBjbXNQcm9maWxlQ2xhc3NTaWduYXR1cmUgQ2xhc3NTaWc7Ci0gICAgY21zVUludDMyTnVtYmVyICBpLCBJbnRlbnQ7Ci0KLSAgICAvLyBGb3Igc2FmZXR5Ci0gICAgaWYgKG5Qcm9maWxlcyA9PSAwKSByZXR1cm4gTlVMTDsKLQotICAgIC8vIEFsbG9jYXRlIGFuIGVtcHR5IExVVCBmb3IgaG9sZGluZyB0aGUgcmVzdWx0LiAwIGFzIGNoYW5uZWwgY291bnQgbWVhbnMgJ3VuZGVmaW5lZCcKLSAgICBSZXN1bHQgPSBjbXNQaXBlbGluZUFsbG9jKENvbnRleHRJRCwgMCwgMCk7Ci0gICAgaWYgKFJlc3VsdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIEN1cnJlbnRDb2xvclNwYWNlID0gY21zR2V0Q29sb3JTcGFjZShoUHJvZmlsZXNbMF0pOwotCi0gICAgZm9yIChpPTA7IGkgPCBuUHJvZmlsZXM7IGkrKykgewotCi0gICAgICAgIGNtc0Jvb2wgIGxJc0RldmljZUxpbmssIGxJc0lucHV0OwotCi0gICAgICAgIGhQcm9maWxlICAgICAgPSBoUHJvZmlsZXNbaV07Ci0gICAgICAgIENsYXNzU2lnICAgICAgPSBjbXNHZXREZXZpY2VDbGFzcyhoUHJvZmlsZSk7Ci0gICAgICAgIGxJc0RldmljZUxpbmsgPSAoQ2xhc3NTaWcgPT0gY21zU2lnTGlua0NsYXNzIHx8IENsYXNzU2lnID09IGNtc1NpZ0Fic3RyYWN0Q2xhc3MgKTsKLQotICAgICAgICAvLyBGaXJzdCBwcm9maWxlIGlzIHVzZWQgYXMgaW5wdXQgdW5sZXNzIGRldmljZWxpbmsgb3IgYWJzdHJhY3QKLSAgICAgICAgaWYgKChpID09IDApICYmICFsSXNEZXZpY2VMaW5rKSB7Ci0gICAgICAgICAgICBsSXNJbnB1dCA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgLy8gRWxzZSB1c2UgcHJvZmlsZSBpbiB0aGUgaW5wdXQgZGlyZWN0aW9uIGlmIGN1cnJlbnQgc3BhY2UgaXMgbm90IFBDUwotICAgICAgICBsSXNJbnB1dCAgICAgID0gKEN1cnJlbnRDb2xvclNwYWNlICE9IGNtc1NpZ1hZWkRhdGEpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoQ3VycmVudENvbG9yU3BhY2UgIT0gY21zU2lnTGFiRGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICBJbnRlbnQgICAgICAgID0gVGhlSW50ZW50c1tpXTsKLQotICAgICAgICBpZiAobElzSW5wdXQgfHwgbElzRGV2aWNlTGluaykgewotCi0gICAgICAgICAgICBDb2xvclNwYWNlSW4gICAgPSBjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKTsKLSAgICAgICAgICAgIENvbG9yU3BhY2VPdXQgICA9IGNtc0dldFBDUyhoUHJvZmlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0KLSAgICAgICAgICAgIENvbG9yU3BhY2VJbiAgICA9IGNtc0dldFBDUyhoUHJvZmlsZSk7Ci0gICAgICAgICAgICBDb2xvclNwYWNlT3V0ICAgPSBjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghQ29sb3JTcGFjZUlzQ29tcGF0aWJsZShDb2xvclNwYWNlSW4sIEN1cnJlbnRDb2xvclNwYWNlKSkgewotCi0gICAgICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX0NPTE9SU1BBQ0VfQ0hFQ0ssICJDb2xvclNwYWNlIG1pc21hdGNoIik7Ci0gICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgZGV2aWNlbGluayBpcyBmb3VuZCwgdGhlbiBubyBjdXN0b20gaW50ZW50IGlzIGFsbG93ZWQgYW5kIHdlIGNhbgotICAgICAgICAvLyByZWFkIHRoZSBMVVQgdG8gYmUgYXBwbGllZC4gU2V0dGluZ3MgZG9uJ3QgYXBwbHkgaGVyZS4KLSAgICAgICAgaWYgKGxJc0RldmljZUxpbmsgfHwgKChDbGFzc1NpZyA9PSBjbXNTaWdOYW1lZENvbG9yQ2xhc3MpICYmIChuUHJvZmlsZXMgPT0gMSkpKSB7Ci0KLSAgICAgICAgICAgIC8vIEdldCB0aGUgaW52b2x2ZWQgTFVUIGZyb20gdGhlIHByb2ZpbGUKLSAgICAgICAgICAgIEx1dCA9IF9jbXNSZWFkRGV2aWNlbGlua0xVVChoUHJvZmlsZSwgSW50ZW50KTsKLSAgICAgICAgICAgIGlmIChMdXQgPT0gTlVMTCkgZ290byBFcnJvcjsKLQotICAgICAgICAgICAgLy8gV2hhdCBhYm91dCBhYnN0cmFjdCBwcm9maWxlcz8KLSAgICAgICAgICAgICBpZiAoQ2xhc3NTaWcgPT0gY21zU2lnQWJzdHJhY3RDbGFzcyAmJiBpID4gMCkgewotICAgICAgICAgICAgICAgIGlmICghQ29tcHV0ZUNvbnZlcnNpb24oaSwgaFByb2ZpbGVzLCBJbnRlbnQsIEJQQ1tpXSwgQWRhcHRhdGlvblN0YXRlc1tpXSwgJm0sICZvZmYpKSBnb3RvIEVycm9yOwotICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBfY21zTUFUM2lkZW50aXR5KCZtKTsKLSAgICAgICAgICAgICAgICBfY21zVkVDM2luaXQoJm9mZiwgMCwgMCwgMCk7Ci0gICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIGlmICghQWRkQ29udmVyc2lvbihSZXN1bHQsIEN1cnJlbnRDb2xvclNwYWNlLCBDb2xvclNwYWNlSW4sICZtLCAmb2ZmKSkgZ290byBFcnJvcjsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCi0gICAgICAgICAgICBpZiAobElzSW5wdXQpIHsKLSAgICAgICAgICAgICAgICAvLyBJbnB1dCBkaXJlY3Rpb24gbWVhbnMgbm9uLXBjcyBjb25uZWN0aW9uLCBzbyBwcm9jZWVkIGxpa2UgZGV2aWNlbGlua3MKLSAgICAgICAgICAgICAgICBMdXQgPSBfY21zUmVhZElucHV0TFVUKGhQcm9maWxlLCBJbnRlbnQpOwotICAgICAgICAgICAgICAgIGlmIChMdXQgPT0gTlVMTCkgZ290byBFcnJvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotCi0gICAgICAgICAgICAgICAgLy8gT3V0cHV0IGRpcmVjdGlvbiBtZWFucyBQQ1MgY29ubmVjdGlvbi4gSW50ZW50IG1heSBhcHBseSBoZXJlCi0gICAgICAgICAgICAgICAgTHV0ID0gX2Ntc1JlYWRPdXRwdXRMVVQoaFByb2ZpbGUsIEludGVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKEx1dCA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0KLSAgICAgICAgICAgICAgICBpZiAoIUNvbXB1dGVDb252ZXJzaW9uKGksIGhQcm9maWxlcywgSW50ZW50LCBCUENbaV0sIEFkYXB0YXRpb25TdGF0ZXNbaV0sICZtLCAmb2ZmKSkgZ290byBFcnJvcjsKLSAgICAgICAgICAgICAgICBpZiAoIUFkZENvbnZlcnNpb24oUmVzdWx0LCBDdXJyZW50Q29sb3JTcGFjZSwgQ29sb3JTcGFjZUluLCAmbSwgJm9mZikpIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvbmNhdGVuYXRlIHRvIHRoZSBvdXRwdXQgTFVUCi0gICAgICAgIGlmICghY21zUGlwZWxpbmVDYXQoUmVzdWx0LCBMdXQpKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLQotICAgICAgICBjbXNQaXBlbGluZUZyZWUoTHV0KTsKLSAgICAgICAgTHV0ID0gTlVMTDsKLQotICAgICAgICAvLyBVcGRhdGUgY3VycmVudCBzcGFjZQotICAgICAgICBDdXJyZW50Q29sb3JTcGFjZSA9IENvbG9yU3BhY2VPdXQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIFJlc3VsdDsKLQotRXJyb3I6Ci0KLSAgICBpZiAoTHV0ICE9IE5VTEwpIGNtc1BpcGVsaW5lRnJlZShMdXQpOwotICAgIGlmIChSZXN1bHQgIT0gTlVMTCkgY21zUGlwZWxpbmVGcmVlKFJlc3VsdCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGR3RmxhZ3MpOwotfQotCi0KLS8vIFdyYXBwZXIgZm9yIERMTCBjYWxsaW5nIGNvbnZlbnRpb24KLWNtc1BpcGVsaW5lKiAgQ01TRVhQT1JUIF9jbXNEZWZhdWx0SUNDaW50ZW50cyhjbXNDb250ZXh0ICAgICBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG5Qcm9maWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgVGhlSW50ZW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFICAgICBoUHJvZmlsZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNCb29sICAgICAgICAgQlBDW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uU3RhdGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpCi17Ci0gICAgcmV0dXJuIERlZmF1bHRJQ0NpbnRlbnRzKENvbnRleHRJRCwgblByb2ZpbGVzLCBUaGVJbnRlbnRzLCBoUHJvZmlsZXMsIEJQQywgQWRhcHRhdGlvblN0YXRlcywgZHdGbGFncyk7Ci19Ci0KLS8vIEJsYWNrIHByZXNlcnZpbmcgaW50ZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gVHJhbnNsYXRlIGJsYWNrLXByZXNlcnZpbmcgaW50ZW50cyB0byBJQ0Mgb25lcwotc3RhdGljCi1pbnQgVHJhbnNsYXRlTm9uSUNDSW50ZW50cyhpbnQgSW50ZW50KQotewotICAgIHN3aXRjaCAoSW50ZW50KSB7Ci0gICAgICAgIGNhc2UgSU5URU5UX1BSRVNFUlZFX0tfT05MWV9QRVJDRVBUVUFMOgotICAgICAgICBjYXNlIElOVEVOVF9QUkVTRVJWRV9LX1BMQU5FX1BFUkNFUFRVQUw6Ci0gICAgICAgICAgICByZXR1cm4gSU5URU5UX1BFUkNFUFRVQUw7Ci0KLSAgICAgICAgY2FzZSBJTlRFTlRfUFJFU0VSVkVfS19PTkxZX1JFTEFUSVZFX0NPTE9SSU1FVFJJQzoKLSAgICAgICAgY2FzZSBJTlRFTlRfUFJFU0VSVkVfS19QTEFORV9SRUxBVElWRV9DT0xPUklNRVRSSUM6Ci0gICAgICAgICAgICByZXR1cm4gSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQzsKLQotICAgICAgICBjYXNlIElOVEVOVF9QUkVTRVJWRV9LX09OTFlfU0FUVVJBVElPTjoKLSAgICAgICAgY2FzZSBJTlRFTlRfUFJFU0VSVkVfS19QTEFORV9TQVRVUkFUSU9OOgotICAgICAgICAgICAgcmV0dXJuIElOVEVOVF9TQVRVUkFUSU9OOwotCi0gICAgICAgIGRlZmF1bHQ6IHJldHVybiBJbnRlbnQ7Ci0gICAgfQotfQotCi0vLyBTYW1wbGVyIGZvciBCbGFjay1vbmx5IHByZXNlcnZpbmcgQ01ZSy0+Q01ZSyB0cmFuc2Zvcm1zCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjbXNQaXBlbGluZSogICAgY215azJjbXlrOyAgICAgIC8vIFRoZSBvcmlnaW5hbCB0cmFuc2Zvcm0KLSAgICBjbXNUb25lQ3VydmUqICAgS1RvbmU7ICAgICAgICAgIC8vIEJsYWNrLXRvLWJsYWNrIHRvbmUgY3VydmUKLQotfSBHcmF5T25seVBhcmFtczsKLQotCi0vLyBQcmVzZXJ2ZSBibGFjayBvbmx5IGlmIHRoYXQgaXMgdGhlIG9ubHkgaW5rIHVzZWQKLXN0YXRpYwotaW50IEJsYWNrUHJlc2VydmluZ0dyYXlPbmx5U2FtcGxlcihyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5bXSwgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIE91dFtdLCByZWdpc3RlciB2b2lkKiBDYXJnbykKLXsKLSAgICBHcmF5T25seVBhcmFtcyogYnAgPSAoR3JheU9ubHlQYXJhbXMqKSBDYXJnbzsKLQotICAgIC8vIElmIGdvaW5nIGFjcm9zcyBibGFjayBvbmx5LCBrZWVwIGJsYWNrIG9ubHkKLSAgICBpZiAoSW5bMF0gPT0gMCAmJiBJblsxXSA9PSAwICYmIEluWzJdID09IDApIHsKLQotICAgICAgICAvLyBUQUMgZG9lcyBub3QgYXBwbHkgYmVjYXVzZSBpdCBpcyBibGFjayBpbmshCi0gICAgICAgIE91dFswXSA9IE91dFsxXSA9IE91dFsyXSA9IDA7Ci0gICAgICAgIE91dFszXSA9IGNtc0V2YWxUb25lQ3VydmUxNihicC0+S1RvbmUsIEluWzNdKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgLy8gS2VlcCBub3JtYWwgdHJhbnNmb3JtIGZvciBvdGhlciBjb2xvcnMKLSAgICBicCAtPmNteWsyY215ayAtPkV2YWwxNkZuKEluLCBPdXQsIGJwIC0+Y215azJjbXlrLT5EYXRhKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLy8gVGhpcyBpcyB0aGUgZW50cnkgZm9yIGJsYWNrLXByZXNlcnZpbmcgSy1vbmx5IGludGVudHMsIHdoaWNoIGFyZSBub24tSUNDCi1zdGF0aWMKLWNtc1BpcGVsaW5lKiAgQmxhY2tQcmVzZXJ2aW5nS09ubHlJbnRlbnRzKGNtc0NvbnRleHQgICAgIENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuUHJvZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgVGhlSW50ZW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgICAgIGhQcm9maWxlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zQm9vbCAgICAgICAgIEJQQ1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uU3RhdGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKLXsKLSAgICBHcmF5T25seVBhcmFtcyAgYnA7Ci0gICAgY21zUGlwZWxpbmUqICAgIFJlc3VsdDsKLSAgICBjbXNVSW50MzJOdW1iZXIgSUNDSW50ZW50c1syNTZdOwotICAgIGNtc1N0YWdlKiAgICAgICAgIENMVVQ7Ci0gICAgY21zVUludDMyTnVtYmVyIGksIG5HcmlkUG9pbnRzOwotCi0KLSAgICAvLyBTYW5pdHkgY2hlY2sKLSAgICBpZiAoblByb2ZpbGVzIDwgMSB8fCBuUHJvZmlsZXMgPiAyNTUpIHJldHVybiBOVUxMOwotCi0gICAgLy8gVHJhbnNsYXRlIGJsYWNrLXByZXNlcnZpbmcgaW50ZW50cyB0byBJQ0Mgb25lcwotICAgIGZvciAoaT0wOyBpIDwgblByb2ZpbGVzOyBpKyspCi0gICAgICAgIElDQ0ludGVudHNbaV0gPSBUcmFuc2xhdGVOb25JQ0NJbnRlbnRzKFRoZUludGVudHNbaV0pOwotCi0gICAgLy8gQ2hlY2sgZm9yIG5vbi1jbXlrIHByb2ZpbGVzCi0gICAgaWYgKGNtc0dldENvbG9yU3BhY2UoaFByb2ZpbGVzWzBdKSAhPSBjbXNTaWdDbXlrRGF0YSB8fAotICAgICAgICBjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlc1tuUHJvZmlsZXMtMV0pICE9IGNtc1NpZ0NteWtEYXRhKQotICAgICAgICAgICByZXR1cm4gRGVmYXVsdElDQ2ludGVudHMoQ29udGV4dElELCBuUHJvZmlsZXMsIElDQ0ludGVudHMsIGhQcm9maWxlcywgQlBDLCBBZGFwdGF0aW9uU3RhdGVzLCBkd0ZsYWdzKTsKLQotICAgIG1lbXNldCgmYnAsIDAsIHNpemVvZihicCkpOwotCi0gICAgLy8gQWxsb2NhdGUgYW4gZW1wdHkgTFVUIGZvciBob2xkaW5nIHRoZSByZXN1bHQKLSAgICBSZXN1bHQgPSBjbXNQaXBlbGluZUFsbG9jKENvbnRleHRJRCwgNCwgNCk7Ci0gICAgaWYgKFJlc3VsdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIC8vIENyZWF0ZSBhIExVVCBob2xkaW5nIG5vcm1hbCBJQ0MgdHJhbnNmb3JtCi0gICAgYnAuY215azJjbXlrID0gRGVmYXVsdElDQ2ludGVudHMoQ29udGV4dElELAotICAgICAgICBuUHJvZmlsZXMsCi0gICAgICAgIElDQ0ludGVudHMsCi0gICAgICAgIGhQcm9maWxlcywKLSAgICAgICAgQlBDLAotICAgICAgICBBZGFwdGF0aW9uU3RhdGVzLAotICAgICAgICBkd0ZsYWdzKTsKLQotICAgIGlmIChicC5jbXlrMmNteWsgPT0gTlVMTCkgZ290byBFcnJvcjsKLQotICAgIC8vIE5vdywgY29tcHV0ZSB0aGUgdG9uZSBjdXJ2ZQotICAgIGJwLktUb25lID0gX2Ntc0J1aWxkS1RvbmVDdXJ2ZShDb250ZXh0SUQsCi0gICAgICAgIDQwOTYsCi0gICAgICAgIG5Qcm9maWxlcywKLSAgICAgICAgSUNDSW50ZW50cywKLSAgICAgICAgaFByb2ZpbGVzLAotICAgICAgICBCUEMsCi0gICAgICAgIEFkYXB0YXRpb25TdGF0ZXMsCi0gICAgICAgIGR3RmxhZ3MpOwotCi0gICAgaWYgKGJwLktUb25lID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLQotICAgIC8vIEhvdyBtYW55IGdyaWRwb2ludHMgYXJlIHdlIGdvaW5nIHRvIHVzZT8KLSAgICBuR3JpZFBvaW50cyA9IF9jbXNSZWFzb25hYmxlR3JpZHBvaW50c0J5Q29sb3JzcGFjZShjbXNTaWdDbXlrRGF0YSwgZHdGbGFncyk7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIENMVVQuIDE2IGJpdHMKLSAgICBDTFVUID0gY21zU3RhZ2VBbGxvY0NMdXQxNmJpdChDb250ZXh0SUQsIG5HcmlkUG9pbnRzLCA0LCA0LCBOVUxMKTsKLSAgICBpZiAoQ0xVVCA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgLy8gVGhpcyBpcyB0aGUgb25lIGFuZCBvbmx5IE1QRSBpbiB0aGlzIExVVAotICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShSZXN1bHQsIGNtc0FUX0JFR0lOLCBDTFVUKSkKLSAgICAgICAgZ290byBFcnJvcjsKLQotICAgIC8vIFNhbXBsZSBpdC4gV2UgY2Fubm90IGFmZm9yZCBwcmUvcG9zdCBsaW5lYXJpemF0aW9uIHRoaXMgdGltZS4KLSAgICBpZiAoIWNtc1N0YWdlU2FtcGxlQ0x1dDE2Yml0KENMVVQsIEJsYWNrUHJlc2VydmluZ0dyYXlPbmx5U2FtcGxlciwgKHZvaWQqKSAmYnAsIDApKQotICAgICAgICBnb3RvIEVycm9yOwotCi0gICAgLy8gR2V0IHJpZCBvZiB4Zm9ybSBhbmQgdG9uZSBjdXJ2ZQotICAgIGNtc1BpcGVsaW5lRnJlZShicC5jbXlrMmNteWspOwotICAgIGNtc0ZyZWVUb25lQ3VydmUoYnAuS1RvbmUpOwotCi0gICAgcmV0dXJuIFJlc3VsdDsKLQotRXJyb3I6Ci0KLSAgICBpZiAoYnAuY215azJjbXlrICE9IE5VTEwpIGNtc1BpcGVsaW5lRnJlZShicC5jbXlrMmNteWspOwotICAgIGlmIChicC5LVG9uZSAhPSBOVUxMKSAgY21zRnJlZVRvbmVDdXJ2ZShicC5LVG9uZSk7Ci0gICAgaWYgKFJlc3VsdCAhPSBOVUxMKSBjbXNQaXBlbGluZUZyZWUoUmVzdWx0KTsKLSAgICByZXR1cm4gTlVMTDsKLQotfQotCi0vLyBLIFBsYW5lLXByZXNlcnZpbmcgQ01ZSyB0byBDTVlLIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBjbXNQaXBlbGluZSogICAgIGNteWsyY215azsgICAgIC8vIFRoZSBvcmlnaW5hbCB0cmFuc2Zvcm0KLSAgICBjbXNIVFJBTlNGT1JNICAgIGhQcm9vZk91dHB1dDsgIC8vIE91dHB1dCBDTVlLIHRvIExhYiAobGFzdCBwcm9maWxlKQotICAgIGNtc0hUUkFOU0ZPUk0gICAgY215azJMYWI7ICAgICAgLy8gVGhlIGlucHV0IGNoYWluCi0gICAgY21zVG9uZUN1cnZlKiAgICBLVG9uZTsgICAgICAgICAvLyBCbGFjay10by1ibGFjayB0b25lIGN1cnZlCi0gICAgY21zUGlwZWxpbmUqICAgICBMYWJLMmNteWs7ICAgICAvLyBUaGUgb3V0cHV0IHByb2ZpbGUKLSAgICBjbXNGbG9hdDY0TnVtYmVyIE1heEVycm9yOwotCi0gICAgY21zSFRSQU5TRk9STSAgICBoUm91bmRUcmlwOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgTWF4VEFDOwotCi0KLX0gUHJlc2VydmVLUGxhbmVQYXJhbXM7Ci0KLQotLy8gVGhlIENMVVQgd2lsbCBiZSBzdG9yZWQgYXQgMTYgYml0cywgYnV0IGNhbGN1bGF0aW9ucyBhcmUgcGVyZm9ybWVkIGF0IGNtc0Zsb2F0MzJOdW1iZXIgcHJlY2lzaW9uCi1zdGF0aWMKLWludCBCbGFja1ByZXNlcnZpbmdTYW1wbGVyKHJlZ2lzdGVyIGNvbnN0IGNtc1VJbnQxNk51bWJlciBJbltdLCByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgT3V0W10sIHJlZ2lzdGVyIHZvaWQqIENhcmdvKQotewotICAgIGludCBpOwotICAgIGNtc0Zsb2F0MzJOdW1iZXIgSW5mWzRdLCBPdXRmWzRdOwotICAgIGNtc0Zsb2F0MzJOdW1iZXIgTGFiS1s0XTsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIFN1bUNNWSwgU3VtQ01ZSywgRXJyb3IsIFJhdGlvOwotICAgIGNtc0NJRUxhYiBDb2xvcmltZXRyaWNMYWIsIEJsYWNrUHJlc2VydmluZ0xhYjsKLSAgICBQcmVzZXJ2ZUtQbGFuZVBhcmFtcyogYnAgPSAoUHJlc2VydmVLUGxhbmVQYXJhbXMqKSBDYXJnbzsKLQotICAgIC8vIENvbnZlcnQgZnJvbSAxNiBiaXRzIHRvIGZsb2F0aW5nIHBvaW50Ci0gICAgZm9yIChpPTA7IGkgPCA0OyBpKyspCi0gICAgICAgIEluZltpXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoSW5baV0gLyA2NTUzNS4wKTsKLQotICAgIC8vIEdldCB0aGUgSyBhY3Jvc3MgVG9uZSBjdXJ2ZQotICAgIExhYktbM10gPSBjbXNFdmFsVG9uZUN1cnZlRmxvYXQoYnAgLT5LVG9uZSwgSW5mWzNdKTsKLQotICAgIC8vIElmIGdvaW5nIGFjcm9zcyBibGFjayBvbmx5LCBrZWVwIGJsYWNrIG9ubHkKLSAgICBpZiAoSW5bMF0gPT0gMCAmJiBJblsxXSA9PSAwICYmIEluWzJdID09IDApIHsKLQotICAgICAgICBPdXRbMF0gPSBPdXRbMV0gPSBPdXRbMl0gPSAwOwotICAgICAgICBPdXRbM10gPSBfY21zUXVpY2tTYXR1cmF0ZVdvcmQoTGFiS1szXSAqIDY1NTM1LjApOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICAvLyBUcnkgdGhlIG9yaWdpbmFsIHRyYW5zZm9ybSwKLSAgICBjbXNQaXBlbGluZUV2YWxGbG9hdCggSW5mLCBPdXRmLCBicCAtPmNteWsyY215ayk7Ci0KLSAgICAvLyBTdG9yZSBhIGNvcHkgb2YgdGhlIGZsb2F0aW5nIHBvaW50IHJlc3VsdCBpbnRvIDE2LWJpdAotICAgIGZvciAoaT0wOyBpIDwgNDsgaSsrKQotICAgICAgICAgICAgT3V0W2ldID0gX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKE91dGZbaV0gKiA2NTUzNS4wKTsKLQotICAgIC8vIE1heWJlIEsgaXMgYWxyZWFkeSBvayAobW9zdGx5IG9uIEs9MCkKLSAgICBpZiAoIGZhYnMoT3V0ZlszXSAtIExhYktbM10pIDwgKDMuMCAvIDY1NTM1LjApICkgewotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICAvLyBLIGRpZmZlciwgbWVzdXJlIGFuZCBrZWVwIExhYiBtZWFzdXJlbWVudCBmb3IgZnVydGhlciB1c2FnZQotICAgIC8vIHRoaXMgaXMgZG9uZSBpbiByZWxhdGl2ZSBjb2xvcmltZXRyaWMgaW50ZW50Ci0gICAgY21zRG9UcmFuc2Zvcm0oYnAtPmhQcm9vZk91dHB1dCwgT3V0LCAmQ29sb3JpbWV0cmljTGFiLCAxKTsKLQotICAgIC8vIElzIG5vdCBibGFjayBvbmx5IGFuZCB0aGUgdHJhbnNmb3JtIGRvZXNuJ3Qga2VlcCBibGFjay4KLSAgICAvLyBPYnRhaW4gdGhlIExhYiBvZiBvdXRwdXQgQ01ZSy4gQWZ0ZXIgdGhhdCB3ZSBoYXZlIExhYiArIEsKLSAgICBjbXNEb1RyYW5zZm9ybShicCAtPmNteWsyTGFiLCBPdXRmLCBMYWJLLCAxKTsKLQotICAgIC8vIE9idGFpbiB0aGUgY29ycmVzcG9uZGluZyBDTVkgdXNpbmcgcmV2ZXJzZSBpbnRlcnBvbGF0aW9uCi0gICAgLy8gKEsgaXMgZml4ZWQgaW4gTGFiS1szXSkKLSAgICBpZiAoIWNtc1BpcGVsaW5lRXZhbFJldmVyc2VGbG9hdChMYWJLLCBPdXRmLCBPdXRmLCBicCAtPkxhYksyY215aykpIHsKLQotICAgICAgICAvLyBDYW5ub3QgZmluZCBhIHN1aXRhYmxlIHZhbHVlLCBzbyB1c2UgY29sb3JpbWV0cmljIHhmb3JtCi0gICAgICAgIC8vIHdoaWNoIGlzIGFscmVhZHkgc3RvcmVkIGluIE91dFtdCi0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIC8vIE1ha2Ugc3VyZSB0byBwYXNzIHRocnUgSyAod2hpY2ggbm93IGlzIGZpeGVkKQotICAgIE91dGZbM10gPSBMYWJLWzNdOwotCi0gICAgLy8gQXBwbHkgVEFDIGlmIG5lZWRlZAotICAgIFN1bUNNWSAgID0gT3V0ZlswXSAgKyBPdXRmWzFdICsgT3V0ZlsyXTsKLSAgICBTdW1DTVlLICA9IFN1bUNNWSArIE91dGZbM107Ci0KLSAgICBpZiAoU3VtQ01ZSyA+IGJwIC0+TWF4VEFDKSB7Ci0KLSAgICAgICAgUmF0aW8gPSAxIC0gKChTdW1DTVlLIC0gYnAtPk1heFRBQykgLyBTdW1DTVkpOwotICAgICAgICBpZiAoUmF0aW8gPCAwKQotICAgICAgICAgICAgUmF0aW8gPSAwOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgUmF0aW8gPSAxLjA7Ci0KLSAgICBPdXRbMF0gPSBfY21zUXVpY2tTYXR1cmF0ZVdvcmQoT3V0ZlswXSAqIFJhdGlvICogNjU1MzUuMCk7ICAgICAvLyBDCi0gICAgT3V0WzFdID0gX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKE91dGZbMV0gKiBSYXRpbyAqIDY1NTM1LjApOyAgICAgLy8gTQotICAgIE91dFsyXSA9IF9jbXNRdWlja1NhdHVyYXRlV29yZChPdXRmWzJdICogUmF0aW8gKiA2NTUzNS4wKTsgICAgIC8vIFkKLSAgICBPdXRbM10gPSBfY21zUXVpY2tTYXR1cmF0ZVdvcmQoT3V0ZlszXSAqIDY1NTM1LjApOwotCi0gICAgLy8gRXN0aW1hdGUgdGhlIGVycm9yICh0aGlzIGdvZXMgMTYgYml0cyB0byBMYWIgREJMKQotICAgIGNtc0RvVHJhbnNmb3JtKGJwLT5oUHJvb2ZPdXRwdXQsIE91dCwgJkJsYWNrUHJlc2VydmluZ0xhYiwgMSk7Ci0gICAgRXJyb3IgPSBjbXNEZWx0YUUoJkNvbG9yaW1ldHJpY0xhYiwgJkJsYWNrUHJlc2VydmluZ0xhYik7Ci0gICAgaWYgKEVycm9yID4gYnAgLT4gTWF4RXJyb3IpCi0gICAgICAgIGJwLT5NYXhFcnJvciA9IEVycm9yOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8vIFRoaXMgaXMgdGhlIGVudHJ5IGZvciBibGFjay1wbGFuZSBwcmVzZXJ2aW5nLCB3aGljaCBhcmUgbm9uLUlDQwotc3RhdGljCi1jbXNQaXBlbGluZSogQmxhY2tQcmVzZXJ2aW5nS1BsYW5lSW50ZW50cyhjbXNDb250ZXh0ICAgICBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgblByb2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFRoZUludGVudHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFICAgICBoUHJvZmlsZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Jvb2wgICAgICAgICBCUENbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgQWRhcHRhdGlvblN0YXRlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpCi17Ci0gICAgUHJlc2VydmVLUGxhbmVQYXJhbXMgYnA7Ci0gICAgY21zUGlwZWxpbmUqICAgIFJlc3VsdCA9IE5VTEw7Ci0gICAgY21zVUludDMyTnVtYmVyIElDQ0ludGVudHNbMjU2XTsKLSAgICBjbXNTdGFnZSogICAgICAgICBDTFVUOwotICAgIGNtc1VJbnQzMk51bWJlciBpLCBuR3JpZFBvaW50czsKLSAgICBjbXNIUFJPRklMRSBoTGFiOwotCi0gICAgLy8gU2FuaXR5IGNoZWNrCi0gICAgaWYgKG5Qcm9maWxlcyA8IDEgfHwgblByb2ZpbGVzID4gMjU1KSByZXR1cm4gTlVMTDsKLQotICAgIC8vIFRyYW5zbGF0ZSBibGFjay1wcmVzZXJ2aW5nIGludGVudHMgdG8gSUNDIG9uZXMKLSAgICBmb3IgKGk9MDsgaSA8IG5Qcm9maWxlczsgaSsrKQotICAgICAgICBJQ0NJbnRlbnRzW2ldID0gVHJhbnNsYXRlTm9uSUNDSW50ZW50cyhUaGVJbnRlbnRzW2ldKTsKLQotICAgIC8vIENoZWNrIGZvciBub24tY215ayBwcm9maWxlcwotICAgIGlmIChjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlc1swXSkgIT0gY21zU2lnQ215a0RhdGEgfHwKLSAgICAgICAgIShjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlc1tuUHJvZmlsZXMtMV0pID09IGNtc1NpZ0NteWtEYXRhIHx8Ci0gICAgICAgIGNtc0dldERldmljZUNsYXNzKGhQcm9maWxlc1tuUHJvZmlsZXMtMV0pID09IGNtc1NpZ091dHB1dENsYXNzKSkKLSAgICAgICAgICAgcmV0dXJuICBEZWZhdWx0SUNDaW50ZW50cyhDb250ZXh0SUQsIG5Qcm9maWxlcywgSUNDSW50ZW50cywgaFByb2ZpbGVzLCBCUEMsIEFkYXB0YXRpb25TdGF0ZXMsIGR3RmxhZ3MpOwotCi0gICAgLy8gQWxsb2NhdGUgYW4gZW1wdHkgTFVUIGZvciBob2xkaW5nIHRoZSByZXN1bHQKLSAgICBSZXN1bHQgPSBjbXNQaXBlbGluZUFsbG9jKENvbnRleHRJRCwgNCwgNCk7Ci0gICAgaWYgKFJlc3VsdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotCi0gICAgbWVtc2V0KCZicCwgMCwgc2l6ZW9mKGJwKSk7Ci0KLSAgICAvLyBXZSBuZWVkIHRoZSBpbnB1dCBMVVQgb2YgdGhlIGxhc3QgcHJvZmlsZSwgYXNzdW1pbmcgdGhpcyBvbmUgaXMgcmVzcG9uc2libGUgb2YKLSAgICAvLyBibGFjayBnZW5lcmF0aW9uLiBUaGlzIExVVCB3aWxsIGJlIHNlYWNoZWQgaW4gaW52ZXJzZSBvcmRlci4KLSAgICBicC5MYWJLMmNteWsgPSBfY21zUmVhZElucHV0TFVUKGhQcm9maWxlc1tuUHJvZmlsZXMtMV0sIElOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUMpOwotICAgIGlmIChicC5MYWJLMmNteWsgPT0gTlVMTCkgZ290byBDbGVhbnVwOwotCi0gICAgLy8gR2V0IHRvdGFsIGFyZWEgY292ZXJhZ2UgKGluIDAuLjEgZG9tYWluKQotICAgIGJwLk1heFRBQyA9IGNtc0RldGVjdFRBQyhoUHJvZmlsZXNbblByb2ZpbGVzLTFdKSAvIDEwMC4wOwotICAgIGlmIChicC5NYXhUQUMgPD0gMCkgZ290byBDbGVhbnVwOwotCi0KLSAgICAvLyBDcmVhdGUgYSBMVVQgaG9sZGluZyBub3JtYWwgSUNDIHRyYW5zZm9ybQotICAgIGJwLmNteWsyY215ayA9IERlZmF1bHRJQ0NpbnRlbnRzKENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblByb2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ0NJbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUHJvZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRhdGlvblN0YXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncyk7Ci0gICAgaWYgKGJwLmNteWsyY215ayA9PSBOVUxMKSBnb3RvIENsZWFudXA7Ci0KLSAgICAvLyBOb3cgdGhlIHRvbmUgY3VydmUKLSAgICBicC5LVG9uZSA9IF9jbXNCdWlsZEtUb25lQ3VydmUoQ29udGV4dElELCA0MDk2LCBuUHJvZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDQ0ludGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQcm9maWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGF0aW9uU3RhdGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWdzKTsKLSAgICBpZiAoYnAuS1RvbmUgPT0gTlVMTCkgZ290byBDbGVhbnVwOwotCi0gICAgLy8gVG8gbWVhc3VyZSB0aGUgb3V0cHV0LCBMYXN0IHByb2ZpbGUgdG8gTGFiCi0gICAgaExhYiA9IGNtc0NyZWF0ZUxhYjRQcm9maWxlVEhSKENvbnRleHRJRCwgTlVMTCk7Ci0gICAgYnAuaFByb29mT3V0cHV0ID0gY21zQ3JlYXRlVHJhbnNmb3JtVEhSKENvbnRleHRJRCwgaFByb2ZpbGVzW25Qcm9maWxlcy0xXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTk5FTFNfU0goNCl8QllURVNfU0goMiksIGhMYWIsIFRZUEVfTGFiX0RCTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRkxBR1NfTk9DQUNIRXxjbXNGTEFHU19OT09QVElNSVpFKTsKLSAgICBpZiAoIGJwLmhQcm9vZk91dHB1dCA9PSBOVUxMKSBnb3RvIENsZWFudXA7Ci0KLSAgICAvLyBTYW1lIGFzIGFudGVyaW9yLCBidXQgbGFiIGluIHRoZSAwLi4xIHJhbmdlCi0gICAgYnAuY215azJMYWIgPSBjbXNDcmVhdGVUcmFuc2Zvcm1USFIoQ29udGV4dElELCBoUHJvZmlsZXNbblByb2ZpbGVzLTFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTE9BVF9TSCgxKXxDSEFOTkVMU19TSCg0KXxCWVRFU19TSCg0KSwgaExhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxPQVRfU0goMSl8Q0hBTk5FTFNfU0goMyl8QllURVNfU0goNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0ZMQUdTX05PQ0FDSEV8Y21zRkxBR1NfTk9PUFRJTUlaRSk7Ci0gICAgaWYgKGJwLmNteWsyTGFiID09IE5VTEwpIGdvdG8gQ2xlYW51cDsKLSAgICBjbXNDbG9zZVByb2ZpbGUoaExhYik7Ci0KLSAgICAvLyBFcnJvciBlc3RpbWF0aW9uIChmb3IgZGVidWcgb25seSkKLSAgICBicC5NYXhFcnJvciA9IDA7Ci0KLSAgICAvLyBIb3cgbWFueSBncmlkcG9pbnRzIGFyZSB3ZSBnb2luZyB0byB1c2U/Ci0gICAgbkdyaWRQb2ludHMgPSBfY21zUmVhc29uYWJsZUdyaWRwb2ludHNCeUNvbG9yc3BhY2UoY21zU2lnQ215a0RhdGEsIGR3RmxhZ3MpOwotCi0KLSAgICBDTFVUID0gY21zU3RhZ2VBbGxvY0NMdXQxNmJpdChDb250ZXh0SUQsIG5HcmlkUG9pbnRzLCA0LCA0LCBOVUxMKTsKLSAgICBpZiAoQ0xVVCA9PSBOVUxMKSBnb3RvIENsZWFudXA7Ci0KLSAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoUmVzdWx0LCBjbXNBVF9CRUdJTiwgQ0xVVCkpCi0gICAgICAgIGdvdG8gQ2xlYW51cDsKLQotICAgIGNtc1N0YWdlU2FtcGxlQ0x1dDE2Yml0KENMVVQsIEJsYWNrUHJlc2VydmluZ1NhbXBsZXIsICh2b2lkKikgJmJwLCAwKTsKLQotQ2xlYW51cDoKLQotICAgIGlmIChicC5jbXlrMmNteWspIGNtc1BpcGVsaW5lRnJlZShicC5jbXlrMmNteWspOwotICAgIGlmIChicC5jbXlrMkxhYikgY21zRGVsZXRlVHJhbnNmb3JtKGJwLmNteWsyTGFiKTsKLSAgICBpZiAoYnAuaFByb29mT3V0cHV0KSBjbXNEZWxldGVUcmFuc2Zvcm0oYnAuaFByb29mT3V0cHV0KTsKLQotICAgIGlmIChicC5LVG9uZSkgY21zRnJlZVRvbmVDdXJ2ZShicC5LVG9uZSk7Ci0gICAgaWYgKGJwLkxhYksyY215aykgY21zUGlwZWxpbmVGcmVlKGJwLkxhYksyY215ayk7Ci0KLSAgICByZXR1cm4gUmVzdWx0OwotfQotCi0vLyBMaW5rIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBDaGFpbiBzZXZlcmFsIHByb2ZpbGVzIGludG8gYSBzaW5nbGUgTFVULiBJdCBqdXN0IGNoZWNrcyB0aGUgcGFyYW1ldGVycyBhbmQgdGhlbiBjYWxscyB0aGUgaGFuZGxlcgotLy8gZm9yIHRoZSBmaXJzdCBpbnRlbnQgaW4gY2hhaW4uIFRoZSBoYW5kbGVyIG1heSBiZSB1c2VyLWRlZmluZWQuIElzIHVwIHRvIHRoZSBoYW5kbGVyIHRvIGRlYWwgd2l0aCB0aGUKLS8vIHJlc3Qgb2YgaW50ZW50cyBpbiBjaGFpbi4gQSBtYXhpbXVtIG9mIDI1NSBwcm9maWxlcyBhdCB0aW1lIGFyZSBzdXBwb3J0ZWQsIHdoaWNoIGlzIHByZXR0eSByZWFzb25hYmxlLgotY21zUGlwZWxpbmUqIF9jbXNMaW5rUHJvZmlsZXMoY21zQ29udGV4dCAgICAgQ29udGV4dElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG5Qcm9maWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBUaGVJbnRlbnRzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSAgICAgaFByb2ZpbGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNCb29sICAgICAgICAgQlBDW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEFkYXB0YXRpb25TdGF0ZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKQotewotICAgIGNtc1VJbnQzMk51bWJlciBpOwotICAgIGNtc0ludGVudHNMaXN0KiBJbnRlbnQ7Ci0KLSAgICAvLyBNYWtlIHN1cmUgYSByZWFzb25hYmxlIG51bWJlciBvZiBwcm9maWxlcyBpcyBwcm92aWRlZAotICAgIGlmIChuUHJvZmlsZXMgPD0gMCB8fCBuUHJvZmlsZXMgPiAyNTUpIHsKLSAgICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfUkFOR0UsICJDb3VsZG4ndCBsaW5rICclZCcgcHJvZmlsZXMiLCBuUHJvZmlsZXMpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG5Qcm9maWxlczsgaSsrKSB7Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgYmxhY2sgcG9pbnQgaXMgcmVhbGx5IG5lZWRlZCBvciBhbGxvd2VkLiBOb3RlIHRoYXQKLSAgICAgICAgLy8gZm9sbG93aW5nIEFkb2JlJ3MgZG9jdW1lbnQ6Ci0gICAgICAgIC8vIEJQQyBkb2VzIG5vdCBhcHBseSB0byBkZXZpY2VsaW5rIHByb2ZpbGVzLCBub3IgdG8gYWJzIGNvbG9yaW1ldHJpYywKLSAgICAgICAgLy8gYW5kIGFwcGxpZXMgYWx3YXlzIG9uIFY0IHBlcmNlcHR1YWwgYW5kIHNhdHVyYXRpb24uCi0KLSAgICAgICAgaWYgKFRoZUludGVudHNbaV0gPT0gSU5URU5UX0FCU09MVVRFX0NPTE9SSU1FVFJJQykKLSAgICAgICAgICAgIEJQQ1tpXSA9IEZBTFNFOwotCi0gICAgICAgIGlmIChUaGVJbnRlbnRzW2ldID09IElOVEVOVF9QRVJDRVBUVUFMIHx8IFRoZUludGVudHNbaV0gPT0gSU5URU5UX1NBVFVSQVRJT04pIHsKLQotICAgICAgICAgICAgLy8gRm9yY2UgQlBDIGZvciBWNCBwcm9maWxlcyBpbiBwZXJjZXB0dWFsIGFuZCBzYXR1cmF0aW9uCi0gICAgICAgICAgICBpZiAoY21zR2V0UHJvZmlsZVZlcnNpb24oaFByb2ZpbGVzW2ldKSA+PSA0LjApCi0gICAgICAgICAgICAgICAgQlBDW2ldID0gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFNlYXJjaCBmb3IgYSBoYW5kbGVyLiBUaGUgZmlyc3QgaW50ZW50IGluIHRoZSBjaGFpbiBkZWZpbmVzIHRoZSBoYW5kbGVyLiBUaGF0IHdvdWxkCi0gICAgLy8gcHJldmVudCB1c2luZyBtdWx0aXBsZSBjdXN0b20gaW50ZW50cyBpbiBhIG11bHRpaW50ZW50IGNoYWluLCBidXQgdGhlIGJlaGF2aW91ciBvZgotICAgIC8vIHRoaXMgY2FzZSB3b3VsZCBwcmVzZW50IHNvbWUgaXNzdWVzIGlmIHRoZSBjdXN0b20gaW50ZW50IHRyaWVzIHRvIGRvIHRoaW5ncyBsaWtlCi0gICAgLy8gcHJlc2VydmUgcHJpbWFyaWVzLiBUaGlzIHNvbHV0aW9uIGlzIG5vdCBwZXJmZWN0LCBidXQgd29ya3Mgd2VsbCBvbiBtb3N0IGNhc2VzLgotCi0gICAgSW50ZW50ID0gU2VhcmNoSW50ZW50KENvbnRleHRJRCwgVGhlSW50ZW50c1swXSk7Ci0gICAgaWYgKEludGVudCA9PSBOVUxMKSB7Ci0gICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJVbnN1cHBvcnRlZCBpbnRlbnQgJyVkJyIsIFRoZUludGVudHNbMF0pOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBDYWxsIHRoZSBoYW5kbGVyCi0gICAgcmV0dXJuIEludGVudCAtPkxpbmsoQ29udGV4dElELCBuUHJvZmlsZXMsIFRoZUludGVudHMsIGhQcm9maWxlcywgQlBDLCBBZGFwdGF0aW9uU3RhdGVzLCBkd0ZsYWdzKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgYXZhaWxhYmxlIGludGVudHMuIG5NYXggaXMgdGhlIG1heGltdW0gc3BhY2UgZm9yIHRoZSBzdXBwbGllZCAiQ29kZXMiCi0vLyBhbmQgIkRlc2NyaXB0aW9ucyIgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBpbnRlbnRzLCB3aGljaCBtYXkgYmUgZ3JlYXRlcgotLy8gdGhhbiBuTWF4LCBhbHRob3VnaCB0aGUgbWF0cmljZXMgYXJlIG5vdCBwb3B1bGF0ZWQgYmV5b25kIHRoaXMgbGV2ZWwuCi1jbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0dldFN1cHBvcnRlZEludGVudHNUSFIoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBuTWF4LCBjbXNVSW50MzJOdW1iZXIqIENvZGVzLCBjaGFyKiogRGVzY3JpcHRpb25zKQotewotICAgIF9jbXNJbnRlbnRzUGx1Z2luQ2h1bmtUeXBlKiBjdHggPSAoIF9jbXNJbnRlbnRzUGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIEludGVudFBsdWdpbik7Ci0gICAgY21zSW50ZW50c0xpc3QqIHB0OwotICAgIGNtc1VJbnQzMk51bWJlciBuSW50ZW50czsKLQotCi0gICAgZm9yIChuSW50ZW50cz0wLCBwdCA9IGN0eC0+SW50ZW50czsgcHQgIT0gTlVMTDsgcHQgPSBwdCAtPiBOZXh0KQotICAgIHsKLSAgICAgICAgaWYgKG5JbnRlbnRzIDwgbk1heCkgewotICAgICAgICAgICAgaWYgKENvZGVzICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgQ29kZXNbbkludGVudHNdID0gcHQgLT5JbnRlbnQ7Ci0KLSAgICAgICAgICAgIGlmIChEZXNjcmlwdGlvbnMgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbnNbbkludGVudHNdID0gcHQgLT5EZXNjcmlwdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIG5JbnRlbnRzKys7Ci0gICAgfQotCi0gICAgZm9yIChuSW50ZW50cz0wLCBwdCA9IERlZmF1bHRJbnRlbnRzOyBwdCAhPSBOVUxMOyBwdCA9IHB0IC0+IE5leHQpCi0gICAgewotICAgICAgICBpZiAobkludGVudHMgPCBuTWF4KSB7Ci0gICAgICAgICAgICBpZiAoQ29kZXMgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICBDb2Rlc1tuSW50ZW50c10gPSBwdCAtPkludGVudDsKLQotICAgICAgICAgICAgaWYgKERlc2NyaXB0aW9ucyAhPSBOVUxMKQotICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uc1tuSW50ZW50c10gPSBwdCAtPkRlc2NyaXB0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgbkludGVudHMrKzsKLSAgICB9Ci0gICAgcmV0dXJuIG5JbnRlbnRzOwotfQotCi1jbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0dldFN1cHBvcnRlZEludGVudHMoY21zVUludDMyTnVtYmVyIG5NYXgsIGNtc1VJbnQzMk51bWJlciogQ29kZXMsIGNoYXIqKiBEZXNjcmlwdGlvbnMpCi17Ci0gICAgcmV0dXJuIGNtc0dldFN1cHBvcnRlZEludGVudHNUSFIoTlVMTCwgbk1heCwgQ29kZXMsIERlc2NyaXB0aW9ucyk7Ci19Ci0KLS8vIFRoZSBwbHVnLWluIHJlZ2lzdHJhdGlvbi4gVXNlciBjYW4gYWRkIG5ldyBpbnRlbnRzIG9yIG92ZXJyaWRlIGRlZmF1bHQgcm91dGluZXMKLWNtc0Jvb2wgIF9jbXNSZWdpc3RlclJlbmRlcmluZ0ludGVudFBsdWdpbihjbXNDb250ZXh0IGlkLCBjbXNQbHVnaW5CYXNlKiBEYXRhKQotewotICAgIF9jbXNJbnRlbnRzUGx1Z2luQ2h1bmtUeXBlKiBjdHggPSAoIF9jbXNJbnRlbnRzUGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhpZCwgSW50ZW50UGx1Z2luKTsKLSAgICBjbXNQbHVnaW5SZW5kZXJpbmdJbnRlbnQqIFBsdWdpbiA9IChjbXNQbHVnaW5SZW5kZXJpbmdJbnRlbnQqKSBEYXRhOwotICAgIGNtc0ludGVudHNMaXN0KiBmbDsKLQotICAgIC8vIERvIHdlIGhhdmUgdG8gcmVzZXQgdGhlIGN1c3RvbSBpbnRlbnRzPwotICAgIGlmIChEYXRhID09IE5VTEwpIHsKLQotICAgICAgICBjdHgtPkludGVudHMgPSBOVUxMOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICBmbCA9IChjbXNJbnRlbnRzTGlzdCopIF9jbXNQbHVnaW5NYWxsb2MoaWQsIHNpemVvZihjbXNJbnRlbnRzTGlzdCkpOwotICAgIGlmIChmbCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0KLQotICAgIGZsIC0+SW50ZW50ICA9IFBsdWdpbiAtPkludGVudDsKLSAgICBzdHJuY3B5KGZsIC0+RGVzY3JpcHRpb24sIFBsdWdpbiAtPkRlc2NyaXB0aW9uLCBzaXplb2YoZmwgLT5EZXNjcmlwdGlvbiktMSk7Ci0gICAgZmwgLT5EZXNjcmlwdGlvbltzaXplb2YoZmwgLT5EZXNjcmlwdGlvbiktMV0gPSAwOwotCi0gICAgZmwgLT5MaW5rICAgID0gUGx1Z2luIC0+TGluazsKLQotICAgIGZsIC0+TmV4dCA9IGN0eCAtPkludGVudHM7Ci0gICAgY3R4IC0+SW50ZW50cyA9IGZsOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zZXJyLmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2Vyci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2I2N2I0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zZXJyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MDcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTIgTWFydGkgTWFyaWEgU2FndWVyCi0vLwotLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0vLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0vLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0vLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLS8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQotLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLS8vCi0vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0vLwotLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0vLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KLS8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi0vLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCi0vLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0vLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLS8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpbmNsdWRlICJsY21zMl9pbnRlcm5hbC5oIgotCi0vLyBJIGFtIHNvIHRpcmVkIGFib3V0IGluY29tcGF0aWJpbGl0aWVzIG9uIHRob3NlIGZ1bmN0aW9ucyB0aGF0IGhlcmUgYXJlIHNvbWUgcmVwbGFjZW1lbnRzCi0vLyB0aGF0IGhvcGVmdWxseSB3b3VsZCBiZSBmdWxseSBwb3J0YWJsZS4KLQotLy8gY29tcGFyZSB0d28gc3RyaW5ncyBpZ25vcmluZyBjYXNlCi1pbnQgQ01TRVhQT1JUIGNtc3N0cmNhc2VjbXAoY29uc3QgY2hhciogczEsIGNvbnN0IGNoYXIqIHMyKQotewotICAgIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVzMSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopczEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdXMyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilzMjsKLQotICAgIHdoaWxlICh0b3VwcGVyKCp1czEpID09IHRvdXBwZXIoKnVzMisrKSkKLSAgICAgICAgaWYgKCp1czErKyA9PSAnXDAnKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gKHRvdXBwZXIoKnVzMSkgLSB0b3VwcGVyKCotLXVzMikpOwotfQotCi0vLyBsb25nIGludCBiZWNhdXNlIEM5OSBzcGVjaWZpZXMgZnRlbGwgaW4gc3VjaCB3YXkgKDcuMTkuOS4yKQotbG9uZyBpbnQgQ01TRVhQT1JUIGNtc2ZpbGVsZW5ndGgoRklMRSogZikKLXsKLSAgICBsb25nIGludCBwICwgbjsKLQotICAgIHAgPSBmdGVsbChmKTsgLy8gcmVnaXN0ZXIgY3VycmVudCBmaWxlIHBvc2l0aW9uCi0KLSAgICBpZiAoZnNlZWsoZiwgMCwgU0VFS19FTkQpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIG4gPSBmdGVsbChmKTsKLSAgICBmc2VlayhmLCBwLCBTRUVLX1NFVCk7IC8vIGZpbGUgcG9zaXRpb24gcmVzdG9yZWQKLQotICAgIHJldHVybiBuOwotfQotCi0jaWYgMAotLy8gTWVtb3J5IGhhbmRsaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFRoaXMgaXMgdGhlIGludGVyZmFjZSB0byBsb3ctbGV2ZWwgbWVtb3J5IG1hbmFnZW1lbnQgcm91dGluZXMuIEJ5IGRlZmF1bHQgYSBzaW1wbGUKLS8vIHdyYXBwaW5nIHRvIG1hbGxvYy9mcmVlL3JlYWxsb2MgaXMgcHJvdmlkZWQsIGFsdGhvdWdoIHRoZXJlIGlzIGEgbGltaXQgb24gdGhlIG1heAotLy8gYW1vdW50IG9mIG1lbW95IHRoYXQgY2FuIGJlIHJlY2xhaW1lZC4gVGhpcyBpcyBtb3N0bHkgYXMgYSBzYWZldHkgZmVhdHVyZSB0byBwcmV2ZW50Ci0vLyBib2d1cyBvciBldmlsIGNvZGUgdG8gYWxsb2NhdGUgaHVnZSBibG9ja3MgdGhhdCBvdGhlcndpc2UgbGNtcyB3b3VsZCBuZXZlciBuZWVkLgotCi0jZGVmaW5lIE1BWF9NRU1PUllfRk9SX0FMTE9DICAoKGNtc1VJbnQzMk51bWJlcikoMTAyNFUqMTAyNFUqNTEyVSkpCi0KLS8vIFVzZXIgbWF5IG92ZXJyaWRlIHRoaXMgYmVoYXZpb3VyIGJ5IHVzaW5nIGEgbWVtb3J5IHBsdWctaW4sIHdoaWNoIGJhc2ljYWxseSByZXBsYWNlcwotLy8gdGhlIGRlZmF1bHQgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zLiBJbiB0aGlzIGNhc2UsIG5vIGNoZWNrIGlzIHBlcmZvcm1lZCBhbmQgaXQKLS8vIGlzIHVwIHRvIHRoZSBwbHVnLWluIHdyaXR0ZXIgdG8ga2VlcCBpbiB0aGUgc2FmZSBzaWRlLiBUaGVyZSBhcmUgb25seSB0aHJlZSBmdW5jdGlvbnMKLS8vIHJlcXVpcmVkIHRvIGJlIGltcGxlbWVudGVkOiBtYWxsb2MsIHJlYWxsb2MgYW5kIGZyZWUsIGFsdGhvdWdoIHRoZSB1c2VyIG1heSB3YW50IHRvCi0vLyByZXBsYWNlIHRoZSBvcHRpb25hbCBtYWxsb2NaZXJvLCBjYWxsb2MgYW5kIGR1cCBhcyB3ZWxsLgotCi1jbXNCb29sICAgX2Ntc1JlZ2lzdGVyTWVtSGFuZGxlclBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKTsKLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLS8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb24uIEl0IGRvZXMgYSB2ZXJ5IGNvYXJzZQotLy8gY2hlY2sgb2YgYW1vdXQgb2YgbWVtb3J5LCBqdXN0IHRvIHByZXZlbnQgZXhwbG9pdHMKLXN0YXRpYwotdm9pZCogX2Ntc01hbGxvY0RlZmF1bHRGbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIHNpemUpCi17Ci0gICAgaWYgKHNpemUgPiBNQVhfTUVNT1JZX0ZPUl9BTExPQykgcmV0dXJuIE5VTEw7ICAvLyBOZXZlciBhbGxvdyBvdmVyIG1heGltdW0KLQotICAgIHJldHVybiAodm9pZCopIG1hbGxvYyhzaXplKTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoQ29udGV4dElEKTsKLX0KLQotLy8gR2VuZXJpYyBhbGxvY2F0ZSAmIHplcm8KLXN0YXRpYwotdm9pZCogX2Ntc01hbGxvY1plcm9EZWZhdWx0Rm4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBzaXplKQotewotICAgIHZvaWQgKnB0ID0gX2Ntc01hbGxvYyhDb250ZXh0SUQsIHNpemUpOwotICAgIGlmIChwdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIG1lbXNldChwdCwgMCwgc2l6ZSk7Ci0gICAgcmV0dXJuIHB0OwotfQotCi0KLS8vIFRoZSBkZWZhdWx0IGZyZWUgZnVuY3Rpb24uIFRoZSBvbmx5IGNoZWNrIHByb2Zvcm1lZCBpcyBhZ2FpbnN0IE5VTEwgcG9pbnRlcnMKLXN0YXRpYwotdm9pZCBfY21zRnJlZURlZmF1bHRGbihjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCAqUHRyKQotewotICAgIC8vIGZyZWUoTlVMTCkgaXMgZGVmaW5lZCBhIG5vLW9wIGJ5IEM5OSwgdGhlcmVmb3JlIGl0IGlzIHNhZmUgdG8KLSAgICAvLyBhdm9pZCB0aGUgY2hlY2ssIGJ1dCBpdCBpcyBoZXJlIGp1c3QgaW4gY2FzZS4uLgotCi0gICAgaWYgKFB0cikgZnJlZShQdHIpOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihDb250ZXh0SUQpOwotfQotCi0vLyBUaGUgZGVmYXVsdCByZWFsbG9jIGZ1bmN0aW9uLiBBZ2FpbiBpdCBjaGVja3MgZm9yIGV4cGxvaXRzLiBJZiBQdHIgaXMgTlVMTCwKLS8vIHJlYWxsb2MgYmVoYXZlcyB0aGUgc2FtZSB3YXkgYXMgbWFsbG9jIGFuZCBhbGxvY2F0ZXMgYSBuZXcgYmxvY2sgb2Ygc2l6ZSBieXRlcy4KLXN0YXRpYwotdm9pZCogX2Ntc1JlYWxsb2NEZWZhdWx0Rm4oY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIHNpemUpCi17Ci0KLSAgICBpZiAoc2l6ZSA+IE1BWF9NRU1PUllfRk9SX0FMTE9DKSByZXR1cm4gTlVMTDsgIC8vIE5ldmVyIHJlYWxsb2Mgb3ZlciA1MTJNYgotCi0gICAgcmV0dXJuIHJlYWxsb2MoUHRyLCBzaXplKTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoQ29udGV4dElEKTsKLX0KLQotCi0vLyBUaGUgZGVmYXVsdCBjYWxsb2MgZnVuY3Rpb24uIEFsbG9jYXRlcyBhbiBhcnJheSBvZiBudW0gZWxlbWVudHMsIGVhY2ggb25lIG9mIHNpemUgYnl0ZXMKLS8vIGFsbCBtZW1vcnkgaXMgaW5pdGlhbGl6ZWQgdG8gemVyby4KLXN0YXRpYwotdm9pZCogX2Ntc0NhbGxvY0RlZmF1bHRGbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIG51bSwgY21zVUludDMyTnVtYmVyIHNpemUpCi17Ci0gICAgY21zVUludDMyTnVtYmVyIFRvdGFsID0gbnVtICogc2l6ZTsKLQotICAgIC8vIFByZXNlcnZlIGNhbGxvYyBiZWhhdmlvdXIKLSAgICBpZiAoVG90YWwgPT0gMCkgcmV0dXJuIE5VTEw7Ci0KLSAgICAvLyBTYWZlIGNoZWNrIGZvciBvdmVyZmxvdy4KLSAgICBpZiAobnVtID49IFVJTlRfTUFYIC8gc2l6ZSkgcmV0dXJuIE5VTEw7Ci0KLSAgICAvLyBDaGVjayBmb3Igb3ZlcmZsb3cKLSAgICBpZiAoVG90YWwgPCBudW0gfHwgVG90YWwgPCBzaXplKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmIChUb3RhbCA+IE1BWF9NRU1PUllfRk9SX0FMTE9DKSByZXR1cm4gTlVMTDsgIC8vIE5ldmVyIGFsbG9jIG92ZXIgNTEyTWIKLQotICAgIHJldHVybiBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIFRvdGFsKTsKLX0KLQotLy8gR2VuZXJpYyBibG9jayBkdXBsaWNhdGlvbgotc3RhdGljCi12b2lkKiBfY21zRHVwRGVmYXVsdEZuKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCB2b2lkKiBPcmcsIGNtc1VJbnQzMk51bWJlciBzaXplKQotewotICAgIHZvaWQqIG1lbTsKLQotICAgIGlmIChzaXplID4gTUFYX01FTU9SWV9GT1JfQUxMT0MpIHJldHVybiBOVUxMOyAgLy8gTmV2ZXIgZHVwIG92ZXIgNTEyTWIKLQotICAgIG1lbSA9IF9jbXNNYWxsb2MoQ29udGV4dElELCBzaXplKTsKLQotICAgIGlmIChtZW0gIT0gTlVMTCAmJiBPcmcgIT0gTlVMTCkKLSAgICAgICAgbWVtbW92ZShtZW0sIE9yZywgc2l6ZSk7Ci0KLSAgICByZXR1cm4gbWVtOwotfQotCi0KLS8vIFBvaW50ZXJzIHRvIG1lbW9yeSBtYW5hZ2VyIGZ1bmN0aW9ucyBpbiBDb250ZXh0MAotX2Ntc01lbVBsdWdpbkNodW5rVHlwZSBfY21zTWVtUGx1Z2luQ2h1bmsgPSB7IF9jbXNNYWxsb2NEZWZhdWx0Rm4sIF9jbXNNYWxsb2NaZXJvRGVmYXVsdEZuLCBfY21zRnJlZURlZmF1bHRGbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY21zUmVhbGxvY0RlZmF1bHRGbiwgX2Ntc0NhbGxvY0RlZmF1bHRGbiwgICAgX2Ntc0R1cERlZmF1bHRGbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0KLS8vIFJlc2V0IGFuZCBkdXBsaWNhdGUgbWVtb3J5IG1hbmFnZXIKLXZvaWQgX2Ntc0FsbG9jTWVtUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCi17Ci0gICAgX2Ntc0Fzc2VydChjdHggIT0gTlVMTCk7Ci0KLSAgICBpZiAoc3JjICE9IE5VTEwpIHsKLQotICAgICAgICAvLyBEdXBsaWNhdGUKLSAgICAgICAgY3R4IC0+Y2h1bmtzW01lbVBsdWdpbl0gPSBfY21zU3ViQWxsb2NEdXAoY3R4IC0+TWVtUG9vbCwgc3JjIC0+Y2h1bmtzW01lbVBsdWdpbl0sIHNpemVvZihfY21zTWVtUGx1Z2luQ2h1bmtUeXBlKSk7Ci0gICAgfQotICAgIGVsc2UgewotCi0gICAgICAgIC8vIFRvIHJlc2V0IGl0LCB3ZSB1c2UgdGhlIGRlZmF1bHQgYWxsb2NhdG9ycywgd2hpY2ggY2Fubm90IGJlIG92ZXJyaWRlbgotICAgICAgICBjdHggLT5jaHVua3NbTWVtUGx1Z2luXSA9ICZjdHggLT5EZWZhdWx0TWVtb3J5TWFuYWdlcjsKLSAgICB9Ci19Ci0KLS8vIEF1eGlsaWFyIHRvIGZpbGwgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zIGZyb20gcGx1Z2luIChvciBjb250ZXh0IDAgZGVmYXVsdHMpCi12b2lkIF9jbXNJbnN0YWxsQWxsb2NGdW5jdGlvbnMoY21zUGx1Z2luTWVtSGFuZGxlciogUGx1Z2luLCBfY21zTWVtUGx1Z2luQ2h1bmtUeXBlKiBwdHIpCi17Ci0gICAgaWYgKFBsdWdpbiA9PSBOVUxMKSB7Ci0KLSAgICAgICAgbWVtY3B5KHB0ciwgJl9jbXNNZW1QbHVnaW5DaHVuaywgc2l6ZW9mKF9jbXNNZW1QbHVnaW5DaHVuaykpOwotICAgIH0KLSAgICBlbHNlIHsKLQotICAgICAgICBwdHIgLT5NYWxsb2NQdHIgID0gUGx1Z2luIC0+IE1hbGxvY1B0cjsKLSAgICAgICAgcHRyIC0+RnJlZVB0ciAgICA9IFBsdWdpbiAtPiBGcmVlUHRyOwotICAgICAgICBwdHIgLT5SZWFsbG9jUHRyID0gUGx1Z2luIC0+IFJlYWxsb2NQdHI7Ci0KLSAgICAgICAgLy8gTWFrZSBzdXJlIHdlIHJldmVydCB0byBkZWZhdWx0cwotICAgICAgICBwdHIgLT5NYWxsb2NaZXJvUHRyPSBfY21zTWFsbG9jWmVyb0RlZmF1bHRGbjsKLSAgICAgICAgcHRyIC0+Q2FsbG9jUHRyICAgID0gX2Ntc0NhbGxvY0RlZmF1bHRGbjsKLSAgICAgICAgcHRyIC0+RHVwUHRyICAgICAgID0gX2Ntc0R1cERlZmF1bHRGbjsKLQotICAgICAgICBpZiAoUGx1Z2luIC0+TWFsbG9jWmVyb1B0ciAhPSBOVUxMKSBwdHIgLT5NYWxsb2NaZXJvUHRyID0gUGx1Z2luIC0+IE1hbGxvY1plcm9QdHI7Ci0gICAgICAgIGlmIChQbHVnaW4gLT5DYWxsb2NQdHIgIT0gTlVMTCkgICAgIHB0ciAtPkNhbGxvY1B0ciAgICAgPSBQbHVnaW4gLT4gQ2FsbG9jUHRyOwotICAgICAgICBpZiAoUGx1Z2luIC0+RHVwUHRyICE9IE5VTEwpICAgICAgICBwdHIgLT5EdXBQdHIgICAgICAgID0gUGx1Z2luIC0+IER1cFB0cjsKLQotICAgIH0KLX0KLQotCi0vLyBQbHVnLWluIHJlcGxhY2VtZW50IGVudHJ5Ci1jbXNCb29sICBfY21zUmVnaXN0ZXJNZW1IYW5kbGVyUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlICpEYXRhKQotewotICAgIGNtc1BsdWdpbk1lbUhhbmRsZXIqIFBsdWdpbiA9IChjbXNQbHVnaW5NZW1IYW5kbGVyKikgRGF0YTsKLSAgICBfY21zTWVtUGx1Z2luQ2h1bmtUeXBlKiBwdHI7Ci0KLSAgICAvLyBOVUxMIGZvcmNlcyB0byByZXNldCB0byBkZWZhdWx0cy4gSW4gdGhpcyBzcGVjaWFsIGNhc2UsIHRoZSBkZWZhdWx0cyBhcmUgc3RvcmVkIGluIHRoZSBjb250ZXh0IHN0cnVjdHVyZS4KLSAgICAvLyBSZW1haW5pbmcgcGx1Zy1pbnMgZG9lcyBOT1QgaGF2ZSBhbnkgY29weSBpbiB0aGUgY29udGV4dCBzdHJ1Y3R1cmUsIGJ1dCB0aGlzIGlzIHNvbWVob3cgc3BlY2lhbCBhcyB0aGUKLSAgICAvLyBjb250ZXh0IGludGVybmFsIGRhdGEgc2hvdWxkIGJlIG1hbGxvY2UnZCBieSB1c2luZyB0aG9zZSBmdW5jdGlvbnMuCi0gICAgaWYgKERhdGEgPT0gTlVMTCkgewotCi0gICAgICAgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4ID0gKCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KikgQ29udGV4dElEOwotCi0gICAgICAgLy8gUmV0dXJuIHRvIHRoZSBkZWZhdWx0IGFsbG9jYXRvcnMKLSAgICAgICAgaWYgKENvbnRleHRJRCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjdHgtPmNodW5rc1tNZW1QbHVnaW5dID0gKHZvaWQqKSAmY3R4LT5EZWZhdWx0TWVtb3J5TWFuYWdlcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayBmb3IgcmVxdWlyZWQgY2FsbGJhY2tzCi0gICAgaWYgKFBsdWdpbiAtPiBNYWxsb2NQdHIgPT0gTlVMTCB8fAotICAgICAgICBQbHVnaW4gLT4gRnJlZVB0ciA9PSBOVUxMIHx8Ci0gICAgICAgIFBsdWdpbiAtPiBSZWFsbG9jUHRyID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQotICAgIC8vIFNldCByZXBsYWNlbWVudCBmdW5jdGlvbnMKLSAgICBwdHIgPSAoX2Ntc01lbVBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBNZW1QbHVnaW4pOwotICAgIGlmIChwdHIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgX2Ntc0luc3RhbGxBbGxvY0Z1bmN0aW9ucyhQbHVnaW4sIHB0cik7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0jZWxzZQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfbWVtb3J5LmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLQotY21zQm9vbCAgX2Ntc1JlZ2lzdGVyTWVtSGFuZGxlclBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKQotewotCXJldHVybiBUUlVFOwotfQotCi0vLyBHZW5lcmljIGFsbG9jYXRlCi12b2lkKiBDTVNFWFBPUlQgX2Ntc01hbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIHNpemUpCi17Ci0gICAgcmV0dXJuIEZYTUVNX0RlZmF1bHRBbGxvYyhzaXplLCAxKTsKLX0KLQotLy8gR2VuZXJpYyBhbGxvY2F0ZSAmIHplcm8KLXZvaWQqIENNU0VYUE9SVCBfY21zTWFsbG9jWmVybyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIHNpemUpCi17Ci0Jdm9pZCogcCA9IEZYTUVNX0RlZmF1bHRBbGxvYyhzaXplLCAxKTsKLQlpZiAocCkgRlhTWVNfbWVtc2V0KHAsIDAsIHNpemUpOwotCXJldHVybiBwOwotfQotCi0vLyBHZW5lcmljIGNhbGxvYwotdm9pZCogQ01TRVhQT1JUIF9jbXNDYWxsb2MoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBudW0sIGNtc1VJbnQzMk51bWJlciBzaXplKQotewotCWNtc1VJbnQzMk51bWJlciB0b3RhbCA9IG51bSAqIHNpemU7Ci0JaWYgKHRvdGFsID09IDAgfHwgdG90YWwgLyBzaXplICE9IG51bSB8fCB0b3RhbCA+PSA1MTIgKiAxMDI0ICogMTAyNCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBudW0gKiBzaXplKTsKLX0KLQotLy8gR2VuZXJpYyByZWFsbG9jYXRlCi12b2lkKiBDTVNFWFBPUlQgX2Ntc1JlYWxsb2MoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIHNpemUpCi17Ci0JcmV0dXJuIEZYTUVNX0RlZmF1bHRSZWFsbG9jKFB0ciwgc2l6ZSwgMSk7Ci19Ci0KLS8vIEdlbmVyaWMgZnJlZSBtZW1vcnkKLXZvaWQgQ01TRVhQT1JUIF9jbXNGcmVlKGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBQdHIpCi17Ci0JaWYgKFB0ciAhPSBOVUxMKSBGWE1FTV9EZWZhdWx0RnJlZShQdHIsIDApOwotfQotCi0vLyBHZW5lcmljIGJsb2NrIGR1cGxpY2F0aW9uCi12b2lkKiBDTVNFWFBPUlQgX2Ntc0R1cE1lbShjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3Qgdm9pZCogT3JnLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSkKLXsKLQl2b2lkKiBwID0gRlhNRU1fRGVmYXVsdEFsbG9jKHNpemUsIDEpOwotCUZYU1lTX21lbW1vdmUocCwgT3JnLCBzaXplKTsKLQlyZXR1cm4gcDsKLX0KLQotX2Ntc01lbVBsdWdpbkNodW5rVHlwZSBfY21zTWVtUGx1Z2luQ2h1bmsgPSB7X2Ntc01hbGxvYywgX2Ntc01hbGxvY1plcm8sIF9jbXNGcmVlLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Ntc1JlYWxsb2MsIF9jbXNDYWxsb2MsICAgIF9jbXNEdXBNZW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotdm9pZCBfY21zQWxsb2NNZW1QbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKLXsKLQlfY21zQXNzZXJ0KGN0eCAhPSBOVUxMKTsKLQotCWlmIChzcmMgIT0gTlVMTCkgewotCi0JCS8vIER1cGxpY2F0ZQotCQljdHggLT5jaHVua3NbTWVtUGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCBzcmMgLT5jaHVua3NbTWVtUGx1Z2luXSwgc2l6ZW9mKF9jbXNNZW1QbHVnaW5DaHVua1R5cGUpKTsKLQl9Ci0JZWxzZSB7Ci0KLQkJLy8gVG8gcmVzZXQgaXQsIHdlIHVzZSB0aGUgZGVmYXVsdCBhbGxvY2F0b3JzLCB3aGljaCBjYW5ub3QgYmUgb3ZlcnJpZGVuCi0JCWN0eCAtPmNodW5rc1tNZW1QbHVnaW5dID0gJmN0eCAtPkRlZmF1bHRNZW1vcnlNYW5hZ2VyOwotCX0KLX0KLQotdm9pZCBfY21zSW5zdGFsbEFsbG9jRnVuY3Rpb25zKGNtc1BsdWdpbk1lbUhhbmRsZXIqIFBsdWdpbiwgX2Ntc01lbVBsdWdpbkNodW5rVHlwZSogcHRyKQotewotCWlmIChQbHVnaW4gPT0gTlVMTCkgewotCi0JCW1lbWNweShwdHIsICZfY21zTWVtUGx1Z2luQ2h1bmssIHNpemVvZihfY21zTWVtUGx1Z2luQ2h1bmspKTsKLQl9Ci0JZWxzZSB7Ci0KLQkJcHRyIC0+TWFsbG9jUHRyICA9IFBsdWdpbiAtPiBNYWxsb2NQdHI7Ci0JCXB0ciAtPkZyZWVQdHIgICAgPSBQbHVnaW4gLT4gRnJlZVB0cjsKLQkJcHRyIC0+UmVhbGxvY1B0ciA9IFBsdWdpbiAtPiBSZWFsbG9jUHRyOwotCi0JCS8vIE1ha2Ugc3VyZSB3ZSByZXZlcnQgdG8gZGVmYXVsdHMKLQkJcHRyIC0+TWFsbG9jWmVyb1B0cj0gX2Ntc01hbGxvY1plcm87Ci0JCXB0ciAtPkNhbGxvY1B0ciAgICA9IF9jbXNDYWxsb2M7Ci0JCXB0ciAtPkR1cFB0ciAgICAgICA9IF9jbXNEdXBNZW07Ci0KLQkJaWYgKFBsdWdpbiAtPk1hbGxvY1plcm9QdHIgIT0gTlVMTCkgcHRyIC0+TWFsbG9jWmVyb1B0ciA9IFBsdWdpbiAtPiBNYWxsb2NaZXJvUHRyOwotCQlpZiAoUGx1Z2luIC0+Q2FsbG9jUHRyICE9IE5VTEwpICAgICBwdHIgLT5DYWxsb2NQdHIgICAgID0gUGx1Z2luIC0+IENhbGxvY1B0cjsKLQkJaWYgKFBsdWdpbiAtPkR1cFB0ciAhPSBOVUxMKSAgICAgICAgcHRyIC0+RHVwUHRyICAgICAgICA9IFBsdWdpbiAtPiBEdXBQdHI7Ci0KLQl9Ci19Ci0jZW5kaWYKLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotLy8gU3ViIGFsbG9jYXRpb24gdGFrZXMgY2FyZSBvZiBtYW55IHBvaW50ZXJzIG9mIHNtYWxsIHNpemUuIFRoZSBtZW1vcnkgYWxsb2NhdGVkIGluCi0vLyB0aGlzIHdheSBoYXZlIGJlIGZyZWVkIGF0IG9uY2UuIE5leHQgZnVuY3Rpb24gYWxsb2NhdGVzIGEgc2luZ2xlIGNodW5rIGZvciBsaW5rZWQgbGlzdAotLy8gSSBwcmVmZXIgdGhpcyBtZXRob2Qgb3ZlciByZWFsbG9jIGR1ZSB0byB0aGUgYmlnIGlucGFjdCBvbiB4cHV0IHJlYWxsb2MgbWF5IGhhdmUgaWYKLS8vIG1lbW9yeSBpcyBiZWluZyBzd2FwcGVkIHRvIGRpc2suIFRoaXMgYXBwcm9hY2ggaXMgc2FmZXIgKGFsdGhvdWdoIHRoYXQgbWF5IG5vdCBiZSB0cnVlIG9uIGFsbCBwbGF0Zm9ybXMpCi1zdGF0aWMKLV9jbXNTdWJBbGxvY2F0b3JfY2h1bmsqIF9jbXNDcmVhdGVTdWJBbGxvY0NodW5rKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgSW5pdGlhbCkKLXsKLSAgICBfY21zU3ViQWxsb2NhdG9yX2NodW5rKiBjaHVuazsKLQotICAgIC8vIDIwSyBieSBkZWZhdWx0Ci0gICAgaWYgKEluaXRpYWwgPT0gMCkKLSAgICAgICAgSW5pdGlhbCA9IDIwKjEwMjQ7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIGNvbnRhaW5lcgotICAgIGNodW5rID0gKF9jbXNTdWJBbGxvY2F0b3JfY2h1bmsqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihfY21zU3ViQWxsb2NhdG9yX2NodW5rKSk7Ci0gICAgaWYgKGNodW5rID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgLy8gSW5pdGlhbGl6ZSB2YWx1ZXMKLSAgICBjaHVuayAtPkJsb2NrICAgICA9IChjbXNVSW50OE51bWJlciopIF9jbXNNYWxsb2MoQ29udGV4dElELCBJbml0aWFsKTsKLSAgICBpZiAoY2h1bmsgLT5CbG9jayA9PSBOVUxMKSB7Ci0KLSAgICAgICAgLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcKLSAgICAgICAgX2Ntc0ZyZWUoQ29udGV4dElELCBjaHVuayk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGNodW5rIC0+QmxvY2tTaXplID0gSW5pdGlhbDsKLSAgICBjaHVuayAtPlVzZWQgICAgICA9IDA7Ci0gICAgY2h1bmsgLT5uZXh0ICAgICAgPSBOVUxMOwotCi0gICAgcmV0dXJuIGNodW5rOwotfQotCi0vLyBUaGUgc3ViYWxsb2NhdGVkIGlzIG5vdGhpbmcgYnV0IGEgcG9pbnRlciB0byB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgbGlzdC4gV2UgYWxzbyBrZWVwCi0vLyB0aGUgdGhyZWFkIElEIGluIHRoaXMgc3RydWN0dXJlLgotX2Ntc1N1YkFsbG9jYXRvciogX2Ntc0NyZWF0ZVN1YkFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgSW5pdGlhbCkKLXsKLSAgICBfY21zU3ViQWxsb2NhdG9yKiBzdWI7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIGNvbnRhaW5lcgotICAgIHN1YiA9IChfY21zU3ViQWxsb2NhdG9yKikgX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBzaXplb2YoX2Ntc1N1YkFsbG9jYXRvcikpOwotICAgIGlmIChzdWIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBzdWIgLT5Db250ZXh0SUQgPSBDb250ZXh0SUQ7Ci0KLSAgICBzdWIgLT5oID0gX2Ntc0NyZWF0ZVN1YkFsbG9jQ2h1bmsoQ29udGV4dElELCBJbml0aWFsKTsKLSAgICBpZiAoc3ViIC0+aCA9PSBOVUxMKSB7Ci0gICAgICAgIF9jbXNGcmVlKENvbnRleHRJRCwgc3ViKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN1YjsKLX0KLQotCi0vLyBHZXQgcmlkIG9mIHdob2xlIGxpbmtlZCBsaXN0Ci12b2lkIF9jbXNTdWJBbGxvY0Rlc3Ryb3koX2Ntc1N1YkFsbG9jYXRvciogc3ViKQotewotICAgIF9jbXNTdWJBbGxvY2F0b3JfY2h1bmsgKmNodW5rLCAqbjsKLQotICAgIGZvciAoY2h1bmsgPSBzdWIgLT5oOyBjaHVuayAhPSBOVUxMOyBjaHVuayA9IG4pIHsKLQotICAgICAgICBuID0gY2h1bmstPm5leHQ7Ci0gICAgICAgIGlmIChjaHVuay0+QmxvY2sgIT0gTlVMTCkgX2Ntc0ZyZWUoc3ViIC0+Q29udGV4dElELCBjaHVuay0+QmxvY2spOwotICAgICAgICBfY21zRnJlZShzdWIgLT5Db250ZXh0SUQsIGNodW5rKTsKLSAgICB9Ci0KLSAgICAvLyBGcmVlIHRoZSBoZWFkZXIKLSAgICBfY21zRnJlZShzdWIgLT5Db250ZXh0SUQsIHN1Yik7Ci19Ci0KLQotLy8gR2V0IGEgcG9pbnRlciB0byBzbWFsbCBtZW1vcnkgYmxvY2suCi12b2lkKiAgX2Ntc1N1YkFsbG9jKF9jbXNTdWJBbGxvY2F0b3IqIHN1YiwgY21zVUludDMyTnVtYmVyIHNpemUpCi17Ci0gICAgY21zVUludDMyTnVtYmVyIEZyZWUgPSBzdWIgLT4gaCAtPkJsb2NrU2l6ZSAtIHN1YiAtPiBoIC0+IFVzZWQ7Ci0gICAgY21zVUludDhOdW1iZXIqIHB0cjsKLQotICAgIHNpemUgPSBfY21zQUxJR05NRU0oc2l6ZSk7Ci0KLSAgICAvLyBDaGVjayBmb3IgbWVtb3J5LiBJZiB0aGVyZSBpcyBubyByb29tLCBhbGxvY2F0ZSBhIG5ldyBjaHVuayBvZiBkb3VibGUgbWVtb3J5IHNpemUuCi0gICAgaWYgKHNpemUgPiBGcmVlKSB7Ci0KLSAgICAgICAgX2Ntc1N1YkFsbG9jYXRvcl9jaHVuayogY2h1bms7Ci0gICAgICAgIGNtc1VJbnQzMk51bWJlciBuZXdTaXplOwotCi0gICAgICAgIG5ld1NpemUgPSBzdWIgLT4gaCAtPkJsb2NrU2l6ZSAqIDI7Ci0gICAgICAgIGlmIChuZXdTaXplIDwgc2l6ZSkgbmV3U2l6ZSA9IHNpemU7Ci0KLSAgICAgICAgY2h1bmsgPSBfY21zQ3JlYXRlU3ViQWxsb2NDaHVuayhzdWIgLT4gQ29udGV4dElELCBuZXdTaXplKTsKLSAgICAgICAgaWYgKGNodW5rID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgICAgIC8vIExpbmsgbGlzdAotICAgICAgICBjaHVuayAtPm5leHQgPSBzdWIgLT5oOwotICAgICAgICBzdWIgLT5oICAgID0gY2h1bms7Ci0KLSAgICB9Ci0KLSAgICBwdHIgPSAgc3ViIC0+IGggLT5CbG9jayArIHN1YiAtPiBoIC0+VXNlZDsKLSAgICBzdWIgLT4gaCAtPiBVc2VkICs9IHNpemU7Ci0KLSAgICByZXR1cm4gKHZvaWQqKSBwdHI7Ci19Ci0KLS8vIER1cGxpY2F0ZSBpbiBwb29sCi12b2lkKiBfY21zU3ViQWxsb2NEdXAoX2Ntc1N1YkFsbG9jYXRvciogcywgY29uc3Qgdm9pZCAqcHRyLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSkKLXsKLSAgICB2b2lkICpOZXdQdHI7Ci0KLSAgICAvLyBEdXAgb2YgbnVsbCBwb2ludGVyIGlzIGFsc28gTlVMTAotICAgIGlmIChwdHIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBOZXdQdHIgPSBfY21zU3ViQWxsb2Mocywgc2l6ZSk7Ci0KLSAgICBpZiAocHRyICE9IE5VTEwgJiYgTmV3UHRyICE9IE5VTEwpIHsKLSAgICAgICAgbWVtY3B5KE5ld1B0ciwgcHRyLCBzaXplKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTmV3UHRyOwotfQotCi0KLQotLy8gRXJyb3IgbG9nZ2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotLy8gVGhlcmUgaXMgbm8gZXJyb3IgaGFuZGxpbmcgYXQgYWxsLiBXaGVuIGEgZnVudGlvbiBmYWlscywgaXQgcmV0dXJucyBwcm9wZXIgdmFsdWUuCi0vLyBGb3IgZXhhbXBsZSwgYWxsIGNyZWF0ZSBmdW5jdGlvbnMgZG9lcyByZXR1cm4gTlVMTCBvbiBmYWlsdXJlLiBPdGhlciByZXR1cm4gRkFMU0UKLS8vIEl0IG1heSBiZSBpbnRlcmVzdGluZywgZm9yIHRoZSBkZXZlbG9wZXIsIHRvIGtub3cgd2h5IHRoZSBmdW5jdGlvbiBpcyBmYWlsaW5nLgotLy8gZm9yIHRoYXQgcmVhc29uLCBsY21zMiBkb2VzIG9mZmVyIGEgbG9nZ2luZyBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBkb2VzIHJlY2l2ZQotLy8gYSBFTkdMSVNIIHN0cmluZyB3aXRoIHNvbWUgY2x1ZXMgb24gd2hhdCBpcyBnb2luZyB3cm9uZy4gWW91IGNhbiBzaG93IHRoaXMKLS8vIGluZm8gdG8gdGhlIGVuZCB1c2VyLCBvciBqdXN0IGNyZWF0ZSBzb21lIHNvcnQgb2YgbG9nLgotLy8gVGhlIGxvZ2dpbmcgZnVuY3Rpb24gc2hvdWxkIE5PVCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0sIGFzIHRoaXMgb2J2aW91c2x5IGNhbiBsZWF2ZQotLy8gcmVzb3VyY2VzLiBJdCBpcyB0aGUgcHJvZ3JhbW1lcidzIHJlc3BvbnNhYmlsaXR5IHRvIGNoZWNrIGVhY2ggZnVuY3Rpb24gcmV0dXJuIGNvZGUKLS8vIHRvIG1ha2Ugc3VyZSBpdCBkaWRuJ3QgZmFpbC4KLQotLy8gRXJyb3IgbWVzc2FnZXMgYXJlIGxpbWl0ZWQgdG8gTUFYX0VSUk9SX01FU1NBR0VfTEVOCi0KLSNkZWZpbmUgTUFYX0VSUk9SX01FU1NBR0VfTEVOICAgMTAyNAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gVGhpcyBpcyBvdXIgZGVmYXVsdCBsb2cgZXJyb3IKLXN0YXRpYyB2b2lkIERlZmF1bHRMb2dFcnJvckhhbmRsZXJGdW5jdGlvbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIEVycm9yQ29kZSwgY29uc3QgY2hhciAqVGV4dCk7Ci0KLS8vIENvbnRleHQwIHN0b3JhZ2UsIHdoaWNoIGlzIGdsb2JhbAotX2Ntc0xvZ0Vycm9yQ2h1bmtUeXBlIF9jbXNMb2dFcnJvckNodW5rID0geyBEZWZhdWx0TG9nRXJyb3JIYW5kbGVyRnVuY3Rpb24gfTsKLQotLy8gQWxsb2NhdGVzIGFuZCBpbml0cyBlcnJvciBsb2dnZXIgY29udGFpbmVyIGZvciBhIGdpdmVuIGNvbnRleHQuIElmIHNyYyBpcyBOVUxMLCBvbmx5IGluaXRpYWxpemVzIHRoZSB2YWx1ZQotLy8gdG8gdGhlIGRlZmF1bHQuIE90aGVyd2lzZSwgaXQgZHVwbGljYXRlcyB0aGUgdmFsdWUuIFRoZSBpbnRlcmZhY2UgaXMgc3RhbmRhcmQgYWNyb3NzIGFsbCBjb250ZXh0IGNsaWVudHMKLXZvaWQgX2Ntc0FsbG9jTG9nRXJyb3JDaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQotewotICAgIHN0YXRpYyBfY21zTG9nRXJyb3JDaHVua1R5cGUgTG9nRXJyb3JDaHVuayA9IHsgRGVmYXVsdExvZ0Vycm9ySGFuZGxlckZ1bmN0aW9uIH07Ci0gICAgdm9pZCogZnJvbTsKLQotICAgICBpZiAoc3JjICE9IE5VTEwpIHsKLSAgICAgICAgZnJvbSA9IHNyYyAtPmNodW5rc1tMb2dnZXJdOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICBmcm9tID0gJkxvZ0Vycm9yQ2h1bms7Ci0gICAgfQotCi0gICAgY3R4IC0+Y2h1bmtzW0xvZ2dlcl0gPSBfY21zU3ViQWxsb2NEdXAoY3R4IC0+TWVtUG9vbCwgZnJvbSwgc2l6ZW9mKF9jbXNMb2dFcnJvckNodW5rVHlwZSkpOwotfQotCi0vLyBUaGUgZGVmYXVsdCBlcnJvciBsb2dnZXIgZG9lcyBub3RoaW5nLgotc3RhdGljCi12b2lkIERlZmF1bHRMb2dFcnJvckhhbmRsZXJGdW5jdGlvbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIEVycm9yQ29kZSwgY29uc3QgY2hhciAqVGV4dCkKLXsKLSAgICAvLyBmcHJpbnRmKHN0ZGVyciwgIltsY21zXTogJXNcbiIsIFRleHQpOwotICAgIC8vIGZmbHVzaChzdGRlcnIpOwotCi0gICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoQ29udGV4dElEKTsKLSAgICAgY21zVU5VU0VEX1BBUkFNRVRFUihFcnJvckNvZGUpOwotICAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFRleHQpOwotfQotCi0vLyBDaGFuZ2UgbG9nIGVycm9yLCBjb250ZXh0IGJhc2VkCi12b2lkIENNU0VYUE9SVCBjbXNTZXRMb2dFcnJvckhhbmRsZXJUSFIoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc0xvZ0Vycm9ySGFuZGxlckZ1bmN0aW9uIEZuKQotewotICAgIF9jbXNMb2dFcnJvckNodW5rVHlwZSogbGhnID0gKF9jbXNMb2dFcnJvckNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBMb2dnZXIpOwotCi0gICAgaWYgKGxoZyAhPSBOVUxMKSB7Ci0KLSAgICAgICAgaWYgKEZuID09IE5VTEwpCi0gICAgICAgICAgICBsaGcgLT4gTG9nRXJyb3JIYW5kbGVyID0gRGVmYXVsdExvZ0Vycm9ySGFuZGxlckZ1bmN0aW9uOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBsaGcgLT4gTG9nRXJyb3JIYW5kbGVyID0gRm47Ci0gICAgfQotfQotCi0vLyBDaGFuZ2UgbG9nIGVycm9yLCBsZWdhY3kKLXZvaWQgQ01TRVhQT1JUIGNtc1NldExvZ0Vycm9ySGFuZGxlcihjbXNMb2dFcnJvckhhbmRsZXJGdW5jdGlvbiBGbikKLXsKLSAgICBjbXNTZXRMb2dFcnJvckhhbmRsZXJUSFIoTlVMTCwgRm4pOwotfQotCi0vLyBMb2cgYW4gZXJyb3IKLS8vIEVycm9yVGV4dCBpcyBhIHRleHQgaG9sZGluZyBhbiBlbmdsaXNoIGRlc2NyaXB0aW9uIG9mIGVycm9yLgotdm9pZCBDTVNFWFBPUlQgY21zU2lnbmFsRXJyb3IoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBFcnJvckNvZGUsIGNvbnN0IGNoYXIgKkVycm9yVGV4dCwgLi4uKQotewotICAgIHZhX2xpc3QgYXJnczsKLSAgICBjaGFyIEJ1ZmZlcltNQVhfRVJST1JfTUVTU0FHRV9MRU5dOwotICAgIF9jbXNMb2dFcnJvckNodW5rVHlwZSogbGhnOwotCi0KLSAgICB2YV9zdGFydChhcmdzLCBFcnJvclRleHQpOwotICAgIHZzbnByaW50ZihCdWZmZXIsIE1BWF9FUlJPUl9NRVNTQUdFX0xFTi0xLCBFcnJvclRleHQsIGFyZ3MpOwotICAgIHZhX2VuZChhcmdzKTsKLQotICAgIC8vIENoZWNrIGZvciB0aGUgY29udGV4dCwgaWYgc3BlY2lmaWVkIGdvIHRoZXJlLiBJZiBub3QsIGdvIGZvciB0aGUgZ2xvYmFsCi0gICAgbGhnID0gKF9jbXNMb2dFcnJvckNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBMb2dnZXIpOwotICAgIGlmIChsaGcgLT5Mb2dFcnJvckhhbmRsZXIpIHsKLSAgICAgICAgbGhnIC0+TG9nRXJyb3JIYW5kbGVyKENvbnRleHRJRCwgRXJyb3JDb2RlLCBCdWZmZXIpOwotICAgIH0KLX0KLQotLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBwcmludCBzaWduYXR1cmVzCi12b2lkIF9jbXNUYWdTaWduYXR1cmUyU3RyaW5nKGNoYXIgU3RyaW5nWzVdLCBjbXNUYWdTaWduYXR1cmUgc2lnKQotewotICAgIGNtc1VJbnQzMk51bWJlciBiZTsKLQotICAgIC8vIENvbnZlcnQgdG8gYmlnIGVuZGlhbgotICAgIGJlID0gX2Ntc0FkanVzdEVuZGlhbmVzczMyKChjbXNVSW50MzJOdW1iZXIpIHNpZyk7Ci0KLSAgICAvLyBNb3ZlIGNoYXJzCi0gICAgbWVtbW92ZShTdHJpbmcsICZiZSwgNCk7Ci0KLSAgICAvLyBNYWtlIHN1cmUgb2YgdGVybWluYXRvcgotICAgIFN0cmluZ1s0XSA9IDA7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1zdGF0aWMKLXZvaWQqIGRlZk10eENyZWF0ZShjbXNDb250ZXh0IGlkKQotewotICAgIF9jbXNNdXRleCogcHRyX211dGV4ID0gKF9jbXNNdXRleCopIF9jbXNNYWxsb2MoaWQsIHNpemVvZihfY21zTXV0ZXgpKTsKLSAgICBfY21zSW5pdE11dGV4UHJpbWl0aXZlKHB0cl9tdXRleCk7Ci0gICAgcmV0dXJuICh2b2lkKikgcHRyX211dGV4OwotfQotCi1zdGF0aWMKLXZvaWQgZGVmTXR4RGVzdHJveShjbXNDb250ZXh0IGlkLCB2b2lkKiBtdHgpCi17Ci0gICAgX2Ntc0Rlc3Ryb3lNdXRleFByaW1pdGl2ZSgoX2Ntc011dGV4ICopIG10eCk7Ci0gICAgX2Ntc0ZyZWUoaWQsIG10eCk7Ci19Ci0KLXN0YXRpYwotY21zQm9vbCBkZWZNdHhMb2NrKGNtc0NvbnRleHQgaWQsIHZvaWQqIG10eCkKLXsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGlkKTsKLSAgICByZXR1cm4gX2Ntc0xvY2tQcmltaXRpdmUoKF9jbXNNdXRleCAqKSBtdHgpID09IDA7Ci19Ci0KLXN0YXRpYwotdm9pZCBkZWZNdHhVbmxvY2soY21zQ29udGV4dCBpZCwgdm9pZCogbXR4KQotewotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaWQpOwotICAgIF9jbXNVbmxvY2tQcmltaXRpdmUoKF9jbXNNdXRleCAqKSBtdHgpOwotfQotCi0KLQotLy8gUG9pbnRlcnMgdG8gbWVtb3J5IG1hbmFnZXIgZnVuY3Rpb25zIGluIENvbnRleHQwCi1fY21zTXV0ZXhQbHVnaW5DaHVua1R5cGUgX2Ntc011dGV4UGx1Z2luQ2h1bmsgPSB7IGRlZk10eENyZWF0ZSwgZGVmTXR4RGVzdHJveSwgZGVmTXR4TG9jaywgZGVmTXR4VW5sb2NrIH07Ci0KLS8vIEFsbG9jYXRlIGFuZCBpbml0IG11dGV4IGNvbnRhaW5lci4KLXZvaWQgX2Ntc0FsbG9jTXV0ZXhQbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQotewotICAgIHN0YXRpYyBfY21zTXV0ZXhQbHVnaW5DaHVua1R5cGUgTXV0ZXhDaHVuayA9IHtkZWZNdHhDcmVhdGUsIGRlZk10eERlc3Ryb3ksIGRlZk10eExvY2ssIGRlZk10eFVubG9jayB9OwotICAgIHZvaWQqIGZyb207Ci0KLSAgICAgaWYgKHNyYyAhPSBOVUxMKSB7Ci0gICAgICAgIGZyb20gPSBzcmMgLT5jaHVua3NbTXV0ZXhQbHVnaW5dOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICBmcm9tID0gJk11dGV4Q2h1bms7Ci0gICAgfQotCi0gICAgY3R4IC0+Y2h1bmtzW011dGV4UGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCBmcm9tLCBzaXplb2YoX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlKSk7Ci19Ci0KLS8vIFJlZ2lzdGVyIG5ldyB3YXlzIHRvIHRyYW5zZm9ybQotY21zQm9vbCAgX2Ntc1JlZ2lzdGVyTXV0ZXhQbHVnaW4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BsdWdpbkJhc2UqIERhdGEpCi17Ci0gICAgY21zUGx1Z2luTXV0ZXgqIFBsdWdpbiA9IChjbXNQbHVnaW5NdXRleCopIERhdGE7Ci0gICAgX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlKiBjdHggPSAoIF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBNdXRleFBsdWdpbik7Ci0KLSAgICBpZiAoRGF0YSA9PSBOVUxMKSB7Ci0KLSAgICAgICAgLy8gTm8gbG9jayByb3V0aW5lcwotICAgICAgICBjdHgtPkNyZWF0ZU11dGV4UHRyID0gTlVMTDsKLSAgICAgICAgY3R4LT5EZXN0cm95TXV0ZXhQdHIgPSBOVUxMOwotICAgICAgICBjdHgtPkxvY2tNdXRleFB0ciA9IE5VTEw7Ci0gICAgICAgIGN0eCAtPlVubG9ja011dGV4UHRyID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgLy8gRmFjdG9yeSBjYWxsYmFjayBpcyByZXF1aXJlZAotICAgIGlmIChQbHVnaW4gLT5DcmVhdGVNdXRleFB0ciA9PSBOVUxMIHx8IFBsdWdpbiAtPkRlc3Ryb3lNdXRleFB0ciA9PSBOVUxMIHx8Ci0gICAgICAgIFBsdWdpbiAtPkxvY2tNdXRleFB0ciA9PSBOVUxMIHx8IFBsdWdpbiAtPlVubG9ja011dGV4UHRyID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQotCi0gICAgY3R4LT5DcmVhdGVNdXRleFB0ciAgPSBQbHVnaW4tPkNyZWF0ZU11dGV4UHRyOwotICAgIGN0eC0+RGVzdHJveU11dGV4UHRyID0gUGx1Z2luIC0+RGVzdHJveU11dGV4UHRyOwotICAgIGN0eCAtPkxvY2tNdXRleFB0ciAgID0gUGx1Z2luIC0+TG9ja011dGV4UHRyOwotICAgIGN0eCAtPlVubG9ja011dGV4UHRyID0gUGx1Z2luIC0+VW5sb2NrTXV0ZXhQdHI7Ci0KLSAgICAvLyBBbGwgaXMgb2sKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLy8gR2VuZXJpYyBNdXRleCBmbnMKLXZvaWQqIENNU0VYUE9SVCBfY21zQ3JlYXRlTXV0ZXgoY21zQ29udGV4dCBDb250ZXh0SUQpCi17Ci0gICAgX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlKiBwdHIgPSAoX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIE11dGV4UGx1Z2luKTsKLQotICAgIGlmIChwdHIgLT5DcmVhdGVNdXRleFB0ciA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIHJldHVybiBwdHIgLT5DcmVhdGVNdXRleFB0cihDb250ZXh0SUQpOwotfQotCi12b2lkIENNU0VYUE9SVCBfY21zRGVzdHJveU11dGV4KGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBtdHgpCi17Ci0gICAgX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlKiBwdHIgPSAoX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIE11dGV4UGx1Z2luKTsKLQotICAgIGlmIChwdHIgLT5EZXN0cm95TXV0ZXhQdHIgIT0gTlVMTCkgewotCi0gICAgICAgIHB0ciAtPkRlc3Ryb3lNdXRleFB0cihDb250ZXh0SUQsIG10eCk7Ci0gICAgfQotfQotCi1jbXNCb29sIENNU0VYUE9SVCBfY21zTG9ja011dGV4KGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBtdHgpCi17Ci0gICAgX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlKiBwdHIgPSAoX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIE11dGV4UGx1Z2luKTsKLQotICAgIGlmIChwdHIgLT5Mb2NrTXV0ZXhQdHIgPT0gTlVMTCkgcmV0dXJuIFRSVUU7Ci0KLSAgICByZXR1cm4gcHRyIC0+TG9ja011dGV4UHRyKENvbnRleHRJRCwgbXR4KTsKLX0KLQotdm9pZCBDTVNFWFBPUlQgX2Ntc1VubG9ja011dGV4KGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkKiBtdHgpCi17Ci0gICAgX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlKiBwdHIgPSAoX2Ntc011dGV4UGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIE11dGV4UGx1Z2luKTsKLQotICAgIGlmIChwdHIgLT5VbmxvY2tNdXRleFB0ciAhPSBOVUxMKSB7Ci0KLSAgICAgICAgcHRyIC0+VW5sb2NrTXV0ZXhQdHIoQ29udGV4dElELCBtdHgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zZ2FtbWEuYyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zZ2FtbWEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdhZWI3Yy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2dhbW1hLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjk4ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDEzIE1hcnRpIE1hcmlhIFNhZ3VlcgotLy8KLS8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCi0vLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKLS8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0vLwotLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLS8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotLy8KLS8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAotLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCi0vLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQotLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgotLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLQotI2luY2x1ZGUgImxjbXMyX2ludGVybmFsLmgiCi0KLS8vIFRvbmUgY3VydmVzIGFyZSBwb3dlcmZ1bCBjb25zdHJ1Y3RzIHRoYXQgY2FuIGNvbnRhaW4gY3VydmVzIHNwZWNpZmllZCBpbiBkaXZlcnNlIHdheXMuCi0vLyBUaGUgY3VydmUgaXMgc3RvcmVkIGluIHNlZ21lbnRzLCB3aGVyZSBlYWNoIHNlZ21lbnQgY2FuIGJlIHNhbXBsZWQgb3Igc3BlY2lmaWVkIGJ5IHBhcmFtZXRlcnMuCi0vLyBhIDE2LmJpdCBzaW1wbGlmaWNhdGlvbiBvZiB0aGUgKndob2xlKiBjdXJ2ZSBpcyBrZXB0IGZvciBvcHRpbWl6YXRpb24gcHVycG9zZXMuIEZvciBmbG9hdCBvcGVyYXRpb24sCi0vLyBlYWNoIHNlZ21lbnQgaXMgZXZhbHVhdGVkIHNlcGFyYXRlbHkuIFBsdWctaW5zIG1heSBiZSB1c2VkIHRvIGRlZmluZSBuZXcgcGFyYW1ldHJpYyBzY2hlbWVzLAotLy8gZWFjaCBwbHVnLWluIG1heSBkZWZpbmUgdXAgdG8gTUFYX1RZUEVTX0lOX0xDTVNfUExVR0lOIGZ1bmN0aW9ucyB0eXBlcy4gRm9yIGRlZmluaW5nIGEgZnVuY3Rpb24sCi0vLyB0aGUgcGx1Zy1pbiBzaG91bGQgcHJvdmlkZSB0aGUgdHlwZSBpZCwgaG93IG1hbnkgcGFyYW1ldGVycyBlYWNoIHR5cGUgaGFzLCBhbmQgYSBwb2ludGVyIHRvCi0vLyBhIHByb2NlZHVyZSB0aGF0IGV2YWx1YXRlcyB0aGUgZnVuY3Rpb24uIEluIHRoZSBjYXNlIG9mIHJldmVyc2UgZXZhbHVhdGlvbiwgdGhlIGV2YWx1YXRvciB3aWxsCi0vLyBiZSBjYWxsZWQgd2l0aCB0aGUgdHlwZSBpZCBhcyBhIG5lZ2F0aXZlIHZhbHVlLCBhbmQgYSBzYW1wbGVkIHZlcnNpb24gb2YgdGhlIHJldmVyc2VkIGN1cnZlCi0vLyB3aWxsIGJlIGJ1aWx0LgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJbXBsZW1lbnRhdGlvbgotLy8gTWF4aW0gbnVtYmVyIG9mIG5vZGVzCi0jZGVmaW5lIE1BWF9OT0RFU19JTl9DVVJWRSAgIDQwOTcKLSNkZWZpbmUgTUlOVVNfSU5GICAgICAgICAgICAgKC0xRTIyRikKLSNkZWZpbmUgUExVU19JTkYgICAgICAgICAgICAgKCsxRTIyRikKLQotLy8gVGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHBhcmFtZXRyaWMgY3VydmVzCi10eXBlZGVmIHN0cnVjdCBfY21zUGFyYW1ldHJpY0N1cnZlc0NvbGxlY3Rpb25fc3QgewotCi0gICAgaW50IG5GdW5jdGlvbnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBzdXBwb3J0ZWQgZnVuY3Rpb25zIGluIHRoaXMgY2h1bmsKLSAgICBpbnQgRnVuY3Rpb25UeXBlc1tNQVhfVFlQRVNfSU5fTENNU19QTFVHSU5dOyAgICAgICAgLy8gVGhlIGlkZW50aWZpY2F0aW9uIHR5cGVzCi0gICAgaW50IFBhcmFtZXRlckNvdW50W01BWF9UWVBFU19JTl9MQ01TX1BMVUdJTl07ICAgICAgIC8vIE51bWJlciBvZiBwYXJhbWV0ZXJzIGZvciBlYWNoIGZ1bmN0aW9uCi0gICAgY21zUGFyYW1ldHJpY0N1cnZlRXZhbHVhdG9yICAgIEV2YWx1YXRvcjsgICAgICAgICAgIC8vIFRoZSBldmFsdWF0b3IKLQotICAgIHN0cnVjdCBfY21zUGFyYW1ldHJpY0N1cnZlc0NvbGxlY3Rpb25fc3QqIE5leHQ7IC8vIE5leHQgaW4gbGlzdAotCi19IF9jbXNQYXJhbWV0cmljQ3VydmVzQ29sbGVjdGlvbjsKLQotLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCAoYnVpbHQtaW4pIGV2YWx1YXRvcgotc3RhdGljIGNtc0Zsb2F0NjROdW1iZXIgRGVmYXVsdEV2YWxQYXJhbWV0cmljRm4oY21zSW50MzJOdW1iZXIgVHlwZSwgY29uc3QgY21zRmxvYXQ2NE51bWJlciBQYXJhbXNbXSwgY21zRmxvYXQ2NE51bWJlciBSKTsKLQotLy8gVGhlIGJ1aWx0LWluIGxpc3QKLXN0YXRpYyBfY21zUGFyYW1ldHJpY0N1cnZlc0NvbGxlY3Rpb24gRGVmYXVsdEN1cnZlcyA9IHsKLSAgICA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAjIG9mIGN1cnZlIHR5cGVzCi0gICAgeyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCAxMDggfSwgICAgLy8gUGFyYW1ldHJpYyBjdXJ2ZSBJRAotICAgIHsgMSwgMywgNCwgNSwgNywgNCwgNSwgNSwgMSB9LCAgICAgIC8vIFBhcmFtZXRlcnMgYnkgdHlwZQotICAgIERlZmF1bHRFdmFsUGFyYW1ldHJpY0ZuLCAgICAgICAgICAgIC8vIEV2YWx1YXRvcgotICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5leHQgaW4gY2hhaW4KLX07Ci0KLS8vIER1cGxpY2F0ZXMgdGhlIHpvbmUgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIHBsdWctaW4gaW4gdGhlIG5ldyBjb250ZXh0Ci1zdGF0aWMKLXZvaWQgRHVwUGx1Z2luQ3VydmVzTGlzdChzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCi17Ci0gICBfY21zQ3VydmVzUGx1Z2luQ2h1bmtUeXBlIG5ld0hlYWQgPSB7IE5VTEwgfTsKLSAgIF9jbXNQYXJhbWV0cmljQ3VydmVzQ29sbGVjdGlvbiogIGVudHJ5OwotICAgX2Ntc1BhcmFtZXRyaWNDdXJ2ZXNDb2xsZWN0aW9uKiAgQW50ZXJpb3IgPSBOVUxMOwotICAgX2Ntc0N1cnZlc1BsdWdpbkNodW5rVHlwZSogaGVhZCA9IChfY21zQ3VydmVzUGx1Z2luQ2h1bmtUeXBlKikgc3JjLT5jaHVua3NbQ3VydmVzUGx1Z2luXTsKLQotICAgIF9jbXNBc3NlcnQoaGVhZCAhPSBOVUxMKTsKLQotICAgIC8vIFdhbGsgdGhlIGxpc3QgY29weWluZyBhbGwgbm9kZXMKLSAgIGZvciAoZW50cnkgPSBoZWFkLT5QYXJhbWV0cmljQ3VydmVzOwotICAgICAgICBlbnRyeSAhPSBOVUxMOwotICAgICAgICBlbnRyeSA9IGVudHJ5IC0+TmV4dCkgewotCi0gICAgICAgICAgICBfY21zUGFyYW1ldHJpY0N1cnZlc0NvbGxlY3Rpb24gKm5ld0VudHJ5ID0gKCBfY21zUGFyYW1ldHJpY0N1cnZlc0NvbGxlY3Rpb24gKikgX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsIGVudHJ5LCBzaXplb2YoX2Ntc1BhcmFtZXRyaWNDdXJ2ZXNDb2xsZWN0aW9uKSk7Ci0gICAKLSAgICAgICAgICAgIGlmIChuZXdFbnRyeSA9PSBOVUxMKSAKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8ga2VlcCB0aGUgbGlua2VkIGxpc3Qgb3JkZXIsIHNvIHRoaXMgaXMgYSBsaXR0bGUgYml0IHRyaWNreQotICAgICAgICAgICAgbmV3RW50cnkgLT4gTmV4dCA9IE5VTEw7Ci0gICAgICAgICAgICBpZiAoQW50ZXJpb3IpCi0gICAgICAgICAgICAgICAgQW50ZXJpb3IgLT4gTmV4dCA9IG5ld0VudHJ5OwotICAgICAKLSAgICAgICAgICAgIEFudGVyaW9yID0gbmV3RW50cnk7Ci0KLSAgICAgICAgICAgIGlmIChuZXdIZWFkLlBhcmFtZXRyaWNDdXJ2ZXMgPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBuZXdIZWFkLlBhcmFtZXRyaWNDdXJ2ZXMgPSBuZXdFbnRyeTsKLSAgICB9Ci0KLSAgY3R4IC0+Y2h1bmtzW0N1cnZlc1BsdWdpbl0gPSBfY21zU3ViQWxsb2NEdXAoY3R4LT5NZW1Qb29sLCAmbmV3SGVhZCwgc2l6ZW9mKF9jbXNDdXJ2ZXNQbHVnaW5DaHVua1R5cGUpKTsKLX0KLQotLy8gVGhlIGFsbG9jYXRvciBoYXZlIHRvIGZvbGxvdyB0aGUgY2hhaW4KLXZvaWQgX2Ntc0FsbG9jQ3VydmVzUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQotewotICAgIF9jbXNBc3NlcnQoY3R4ICE9IE5VTEwpOwotCi0gICAgaWYgKHNyYyAhPSBOVUxMKSB7Ci0KLSAgICAgICAgLy8gQ29weSBhbGwgbGlua2VkIGxpc3QKLSAgICAgICBEdXBQbHVnaW5DdXJ2ZXNMaXN0KGN0eCwgc3JjKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHN0YXRpYyBfY21zQ3VydmVzUGx1Z2luQ2h1bmtUeXBlIEN1cnZlc1BsdWdpbkNodW5rID0geyBOVUxMIH07Ci0gICAgICAgIGN0eCAtPmNodW5rc1tDdXJ2ZXNQbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsICZDdXJ2ZXNQbHVnaW5DaHVuaywgc2l6ZW9mKF9jbXNDdXJ2ZXNQbHVnaW5DaHVua1R5cGUpKTsKLSAgICB9Ci19Ci0KLQotLy8gVGhlIGxpbmtlZCBsaXN0IGhlYWQKLV9jbXNDdXJ2ZXNQbHVnaW5DaHVua1R5cGUgX2Ntc0N1cnZlc1BsdWdpbkNodW5rID0geyBOVUxMIH07Ci0KLS8vIEFzIGEgd2F5IHRvIGluc3RhbGwgbmV3IHBhcmFtZXRyaWMgY3VydmVzCi1jbXNCb29sIF9jbXNSZWdpc3RlclBhcmFtZXRyaWNDdXJ2ZXNQbHVnaW4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BsdWdpbkJhc2UqIERhdGEpCi17Ci0gICAgX2Ntc0N1cnZlc1BsdWdpbkNodW5rVHlwZSogY3R4ID0gKCBfY21zQ3VydmVzUGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIEN1cnZlc1BsdWdpbik7Ci0gICAgY21zUGx1Z2luUGFyYW1ldHJpY0N1cnZlcyogUGx1Z2luID0gKGNtc1BsdWdpblBhcmFtZXRyaWNDdXJ2ZXMqKSBEYXRhOwotICAgIF9jbXNQYXJhbWV0cmljQ3VydmVzQ29sbGVjdGlvbiogZmw7Ci0KLSAgICBpZiAoRGF0YSA9PSBOVUxMKSB7Ci0KLSAgICAgICAgICBjdHggLT4gUGFyYW1ldHJpY0N1cnZlcyA9ICBOVUxMOwotICAgICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIGZsID0gKF9jbXNQYXJhbWV0cmljQ3VydmVzQ29sbGVjdGlvbiopIF9jbXNQbHVnaW5NYWxsb2MoQ29udGV4dElELCBzaXplb2YoX2Ntc1BhcmFtZXRyaWNDdXJ2ZXNDb2xsZWN0aW9uKSk7Ci0gICAgaWYgKGZsID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQotICAgIC8vIENvcHkgdGhlIHBhcmFtZXRlcnMKLSAgICBmbCAtPkV2YWx1YXRvciAgPSBQbHVnaW4gLT5FdmFsdWF0b3I7Ci0gICAgZmwgLT5uRnVuY3Rpb25zID0gUGx1Z2luIC0+bkZ1bmN0aW9uczsKLQotICAgIC8vIE1ha2Ugc3VyZSBubyBtZW0gb3ZlcndyaXRlcwotICAgIGlmIChmbCAtPm5GdW5jdGlvbnMgPiBNQVhfVFlQRVNfSU5fTENNU19QTFVHSU4pCi0gICAgICAgIGZsIC0+bkZ1bmN0aW9ucyA9IE1BWF9UWVBFU19JTl9MQ01TX1BMVUdJTjsKLQotICAgIC8vIENvcHkgdGhlIGRhdGEKLSAgICBtZW1tb3ZlKGZsLT5GdW5jdGlvblR5cGVzLCAgUGx1Z2luIC0+RnVuY3Rpb25UeXBlcywgICBmbC0+bkZ1bmN0aW9ucyAqIHNpemVvZihjbXNVSW50MzJOdW1iZXIpKTsKLSAgICBtZW1tb3ZlKGZsLT5QYXJhbWV0ZXJDb3VudCwgUGx1Z2luIC0+UGFyYW1ldGVyQ291bnQsICBmbC0+bkZ1bmN0aW9ucyAqIHNpemVvZihjbXNVSW50MzJOdW1iZXIpKTsKLQotICAgIC8vIEtlZXAgbGlua2VkIGxpc3QKLSAgICBmbCAtPk5leHQgPSBjdHgtPlBhcmFtZXRyaWNDdXJ2ZXM7Ci0gICAgY3R4LT5QYXJhbWV0cmljQ3VydmVzID0gZmw7Ci0KLSAgICAvLyBBbGwgaXMgb2sKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0vLyBTZWFyY2ggaW4gdHlwZSBsaXN0LCByZXR1cm4gcG9zaXRpb24gb3IgLTEgaWYgbm90IGZvdW5kCi1zdGF0aWMKLWludCBJc0luU2V0KGludCBUeXBlLCBfY21zUGFyYW1ldHJpY0N1cnZlc0NvbGxlY3Rpb24qIGMpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IGMgLT5uRnVuY3Rpb25zOyBpKyspCi0gICAgICAgIGlmIChhYnMoVHlwZSkgPT0gYyAtPkZ1bmN0aW9uVHlwZXNbaV0pIHJldHVybiBpOwotCi0gICAgcmV0dXJuIC0xOwotfQotCi0KLS8vIFNlYXJjaCBmb3IgdGhlIGNvbGxlY3Rpb24gd2hpY2ggY29udGFpbnMgYSBzcGVjaWZpYyB0eXBlCi1zdGF0aWMKLV9jbXNQYXJhbWV0cmljQ3VydmVzQ29sbGVjdGlvbiAqR2V0UGFyYW1ldHJpY0N1cnZlQnlUeXBlKGNtc0NvbnRleHQgQ29udGV4dElELCBpbnQgVHlwZSwgaW50KiBpbmRleCkKLXsKLSAgICBfY21zUGFyYW1ldHJpY0N1cnZlc0NvbGxlY3Rpb24qIGM7Ci0gICAgaW50IFBvc2l0aW9uOwotICAgIF9jbXNDdXJ2ZXNQbHVnaW5DaHVua1R5cGUqIGN0eCA9ICggX2Ntc0N1cnZlc1BsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBDdXJ2ZXNQbHVnaW4pOwotCi0gICAgZm9yIChjID0gY3R4LT5QYXJhbWV0cmljQ3VydmVzOyBjICE9IE5VTEw7IGMgPSBjIC0+TmV4dCkgewotCi0gICAgICAgIFBvc2l0aW9uID0gSXNJblNldChUeXBlLCBjKTsKLQotICAgICAgICBpZiAoUG9zaXRpb24gIT0gLTEpIHsKLSAgICAgICAgICAgIGlmIChpbmRleCAhPSBOVUxMKQotICAgICAgICAgICAgICAgICppbmRleCA9IFBvc2l0aW9uOwotICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gSWYgbm9uZSBmb3VuZCwgcmV2ZXJ0IGZvciBkZWZhdWx0cwotICAgIGZvciAoYyA9ICZEZWZhdWx0Q3VydmVzOyBjICE9IE5VTEw7IGMgPSBjIC0+TmV4dCkgewotCi0gICAgICAgIFBvc2l0aW9uID0gSXNJblNldChUeXBlLCBjKTsKLQotICAgICAgICBpZiAoUG9zaXRpb24gIT0gLTEpIHsKLSAgICAgICAgICAgIGlmIChpbmRleCAhPSBOVUxMKQotICAgICAgICAgICAgICAgICppbmRleCA9IFBvc2l0aW9uOwotICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLy8gTG93IGxldmVsIGFsbG9jYXRlLCB3aGljaCB0YWtlcyBjYXJlIG9mIG1lbW9yeSBkZXRhaWxzLiBuRW50cmllcyBtYXkgYmUgemVybywgYW5kIGluIHRoaXMgY2FzZQotLy8gbm8gb3B0aW1hdGlvbiBjdXJ2ZSBpcyBjb21wdXRlZC4gblNlZ21lbnRzIG1heSBhbHNvIGJlIHplcm8gaW4gdGhlIGludmVyc2UgY2FzZSwgd2hlcmUgb25seSB0aGUKLS8vIG9wdGltaXphdGlvbiBjdXJ2ZSBpcyBnaXZlbi4gQm90aCBmZWF0dXJlcyBzaW11bHRhbmVvdXNseSBpcyBhbiBlcnJvcgotc3RhdGljCi1jbXNUb25lQ3VydmUqIEFsbG9jYXRlVG9uZUN1cnZlU3RydWN0KGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNJbnQzMk51bWJlciBuRW50cmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSW50MzJOdW1iZXIgblNlZ21lbnRzLCBjb25zdCBjbXNDdXJ2ZVNlZ21lbnQqIFNlZ21lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNVSW50MTZOdW1iZXIqIFZhbHVlcykKLXsKLSAgICBjbXNUb25lQ3VydmUqIHA7Ci0gICAgaW50IGk7Ci0KLSAgICAvLyBXZSBhbGxvdyBodWdlIHRhYmxlcywgd2hpY2ggYXJlIHRoZW4gcmVzdHJpY3RlZCBmb3Igc21vb3RoaW5nIG9wZXJhdGlvbnMKLSAgICBpZiAobkVudHJpZXMgPiA2NTUzMCB8fCBuRW50cmllcyA8IDApIHsKLSAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgIkNvdWxkbid0IGNyZWF0ZSB0b25lIGN1cnZlIG9mIG1vcmUgdGhhbiA2NTUzMCBlbnRyaWVzIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmIChuRW50cmllcyA8PSAwICYmIG5TZWdtZW50cyA8PSAwKSB7Ci0gICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfUkFOR0UsICJDb3VsZG4ndCBjcmVhdGUgdG9uZSBjdXJ2ZSB3aXRoIHplcm8gc2VnbWVudHMgYW5kIG5vIHRhYmxlIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8vIEFsbG9jYXRlIGFsbCByZXF1aXJlZCBwb2ludGVycywgZXRjLgotICAgIHAgPSAoY21zVG9uZUN1cnZlKikgX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBzaXplb2YoY21zVG9uZUN1cnZlKSk7Ci0gICAgaWYgKCFwKSByZXR1cm4gTlVMTDsKLQotICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlcmUgYXJlIG5vIHNlZ21lbnRzCi0gICAgaWYgKG5TZWdtZW50cyA8PSAwKSB7Ci0gICAgICAgIHAgLT5TZWdtZW50cyA9IE5VTEw7Ci0gICAgICAgIHAgLT5FdmFscyA9IE5VTEw7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBwIC0+U2VnbWVudHMgPSAoY21zQ3VydmVTZWdtZW50KikgX2Ntc0NhbGxvYyhDb250ZXh0SUQsIG5TZWdtZW50cywgc2l6ZW9mKGNtc0N1cnZlU2VnbWVudCkpOwotICAgICAgICBpZiAocCAtPlNlZ21lbnRzID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAgcCAtPkV2YWxzICAgID0gKGNtc1BhcmFtZXRyaWNDdXJ2ZUV2YWx1YXRvciopIF9jbXNDYWxsb2MoQ29udGV4dElELCBuU2VnbWVudHMsIHNpemVvZihjbXNQYXJhbWV0cmljQ3VydmVFdmFsdWF0b3IpKTsKLSAgICAgICAgaWYgKHAgLT5FdmFscyA9PSBOVUxMKSBnb3RvIEVycm9yOwotICAgIH0KLQotICAgIHAgLT4gblNlZ21lbnRzID0gblNlZ21lbnRzOwotCi0gICAgLy8gVGhpcyAxNi1iaXQgdGFibGUgY29udGFpbnMgYSBsaW1pdGVkIHByZWNpc2lvbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2hvbGUgY3VydmUgYW5kIGlzIGtlcHQgZm9yCi0gICAgLy8gaW5jcmVhc2luZyB4cHV0IG9uIGNlcnRhaW4gb3BlcmF0aW9ucy4KLSAgICBpZiAobkVudHJpZXMgPD0gMCkgewotICAgICAgICBwIC0+VGFibGUxNiA9IE5VTEw7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgIHAgLT5UYWJsZTE2ID0gKGNtc1VJbnQxNk51bWJlciopICBfY21zQ2FsbG9jKENvbnRleHRJRCwgbkVudHJpZXMsIHNpemVvZihjbXNVSW50MTZOdW1iZXIpKTsKLSAgICAgICBpZiAocCAtPlRhYmxlMTYgPT0gTlVMTCkgZ290byBFcnJvcjsKLSAgICB9Ci0KLSAgICBwIC0+IG5FbnRyaWVzICA9IG5FbnRyaWVzOwotCi0gICAgLy8gSW5pdGlhbGl6ZSBtZW1iZXJzIGlmIHJlcXVlc3RlZAotICAgIGlmIChWYWx1ZXMgIT0gTlVMTCAmJiAobkVudHJpZXMgPiAwKSkgewotCi0gICAgICAgIGZvciAoaT0wOyBpIDwgbkVudHJpZXM7IGkrKykKLSAgICAgICAgICAgIHAgLT5UYWJsZTE2W2ldID0gVmFsdWVzW2ldOwotICAgIH0KLQotICAgIC8vIEluaXRpYWxpemUgdGhlIHNlZ21lbnRzIHN0dWZmLiBUaGUgZXZhbHVhdG9yIGZvciBlYWNoIHNlZ21lbnQgaXMgbG9jYXRlZCBhbmQgYSBwb2ludGVyIHRvIGl0Ci0gICAgLy8gaXMgcGxhY2VkIGluIGFkdmFuY2UgdG8gbWF4aW1pemUgcGVyZm9ybWFuY2UuCi0gICAgaWYgKFNlZ21lbnRzICE9IE5VTEwgJiYgKG5TZWdtZW50cyA+IDApKSB7Ci0KLSAgICAgICAgX2Ntc1BhcmFtZXRyaWNDdXJ2ZXNDb2xsZWN0aW9uICpjOwotCi0gICAgICAgIHAgLT5TZWdJbnRlcnAgPSAoY21zSW50ZXJwUGFyYW1zKiopIF9jbXNDYWxsb2MoQ29udGV4dElELCBuU2VnbWVudHMsIHNpemVvZihjbXNJbnRlcnBQYXJhbXMqKSk7Ci0gICAgICAgIGlmIChwIC0+U2VnSW50ZXJwID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAgZm9yIChpPTA7IGk8IG5TZWdtZW50czsgaSsrKSB7Ci0KLSAgICAgICAgICAgIC8vIFR5cGUgMCBpcyBhIHNwZWNpYWwgbWFya2VyIGZvciB0YWJsZS1iYXNlZCBjdXJ2ZXMKLSAgICAgICAgICAgIGlmIChTZWdtZW50c1tpXS5UeXBlID09IDApCi0gICAgICAgICAgICAgICAgcCAtPlNlZ0ludGVycFtpXSA9IF9jbXNDb21wdXRlSW50ZXJwUGFyYW1zKENvbnRleHRJRCwgU2VnbWVudHNbaV0ubkdyaWRQb2ludHMsIDEsIDEsIE5VTEwsIENNU19MRVJQX0ZMQUdTX0ZMT0FUKTsKLQotICAgICAgICAgICAgbWVtbW92ZSgmcCAtPlNlZ21lbnRzW2ldLCAmU2VnbWVudHNbaV0sIHNpemVvZihjbXNDdXJ2ZVNlZ21lbnQpKTsKLQotICAgICAgICAgICAgaWYgKFNlZ21lbnRzW2ldLlR5cGUgPT0gMCAmJiBTZWdtZW50c1tpXS5TYW1wbGVkUG9pbnRzICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgcCAtPlNlZ21lbnRzW2ldLlNhbXBsZWRQb2ludHMgPSAoY21zRmxvYXQzMk51bWJlciopIF9jbXNEdXBNZW0oQ29udGV4dElELCBTZWdtZW50c1tpXS5TYW1wbGVkUG9pbnRzLCBzaXplb2YoY21zRmxvYXQzMk51bWJlcikgKiBTZWdtZW50c1tpXS5uR3JpZFBvaW50cyk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcCAtPlNlZ21lbnRzW2ldLlNhbXBsZWRQb2ludHMgPSBOVUxMOwotCi0KLSAgICAgICAgICAgIGMgPSBHZXRQYXJhbWV0cmljQ3VydmVCeVR5cGUoQ29udGV4dElELCBTZWdtZW50c1tpXS5UeXBlLCBOVUxMKTsKLSAgICAgICAgICAgIGlmIChjICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgIHAgLT5FdmFsc1tpXSA9IGMgLT5FdmFsdWF0b3I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwIC0+SW50ZXJwUGFyYW1zID0gX2Ntc0NvbXB1dGVJbnRlcnBQYXJhbXMoQ29udGV4dElELCBwIC0+bkVudHJpZXMsIDEsIDEsIHAtPlRhYmxlMTYsIENNU19MRVJQX0ZMQUdTXzE2QklUUyk7Ci0gICAgaWYgKHAtPkludGVycFBhcmFtcyAhPSBOVUxMKQotICAgICAgICByZXR1cm4gcDsKLQotRXJyb3I6Ci0gICAgaWYgKHAgLT4gU2VnbWVudHMpIF9jbXNGcmVlKENvbnRleHRJRCwgcCAtPlNlZ21lbnRzKTsKLSAgICBpZiAocCAtPiBFdmFscykgX2Ntc0ZyZWUoQ29udGV4dElELCBwIC0+IEV2YWxzKTsKLSAgICBpZiAocCAtPlRhYmxlMTYpIF9jbXNGcmVlKENvbnRleHRJRCwgcCAtPlRhYmxlMTYpOwotICAgIF9jbXNGcmVlKENvbnRleHRJRCwgcCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotLy8gUGFyYW1ldHJpYyBGbiB1c2luZyBmbG9hdGluZyBwb2ludAotc3RhdGljCi1jbXNGbG9hdDY0TnVtYmVyIERlZmF1bHRFdmFsUGFyYW1ldHJpY0ZuKGNtc0ludDMyTnVtYmVyIFR5cGUsIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIgUGFyYW1zW10sIGNtc0Zsb2F0NjROdW1iZXIgUikKLXsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIGUsIFZhbCwgZGlzYzsKLQotICAgIHN3aXRjaCAoVHlwZSkgewotCi0gICAvLyBYID0gWSBeIEdhbW1hCi0gICAgY2FzZSAxOgotICAgICAgICBpZiAoUiA8IDApIHsKLQotICAgICAgICAgICAgaWYgKGZhYnMoUGFyYW1zWzBdIC0gMS4wKSA8IE1BVFJJWF9ERVRfVE9MRVJBTkNFKQotICAgICAgICAgICAgICAgIFZhbCA9IFI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgVmFsID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBWYWwgPSBwb3coUiwgUGFyYW1zWzBdKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAvLyBUeXBlIDEgUmV2ZXJzZWQ6IFggPSBZIF4xL2dhbW1hCi0gICAgY2FzZSAtMToKLSAgICAgICAgIGlmIChSIDwgMCkgewotCi0gICAgICAgICAgICBpZiAoZmFicyhQYXJhbXNbMF0gLSAxLjApIDwgTUFUUklYX0RFVF9UT0xFUkFOQ0UpCi0gICAgICAgICAgICAgICAgVmFsID0gUjsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBWYWwgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIFZhbCA9IHBvdyhSLCAxL1BhcmFtc1swXSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgLy8gQ0lFIDEyMi0xOTY2Ci0gICAgLy8gWSA9IChhWCArIGIpXkdhbW1hICB8IFggPj0gLWIvYQotICAgIC8vIFkgPSAwICAgICAgICAgICAgICAgfCBlbHNlCi0gICAgY2FzZSAyOgotICAgICAgICBkaXNjID0gLVBhcmFtc1syXSAvIFBhcmFtc1sxXTsKLQotICAgICAgICBpZiAoUiA+PSBkaXNjICkgewotCi0gICAgICAgICAgICBlID0gUGFyYW1zWzFdKlIgKyBQYXJhbXNbMl07Ci0KLSAgICAgICAgICAgIGlmIChlID4gMCkKLSAgICAgICAgICAgICAgICBWYWwgPSBwb3coZSwgUGFyYW1zWzBdKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBWYWwgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIFZhbCA9IDA7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgIC8vIFR5cGUgMiBSZXZlcnNlZAotICAgICAvLyBYID0gKFkgXjEvZyAgLSBiKSAvIGEKLSAgICAgY2FzZSAtMjoKLSAgICAgICAgIGlmIChSIDwgMCkKLSAgICAgICAgICAgICBWYWwgPSAwOwotICAgICAgICAgZWxzZQotICAgICAgICAgICAgIFZhbCA9IChwb3coUiwgMS4wL1BhcmFtc1swXSkgLSBQYXJhbXNbMl0pIC8gUGFyYW1zWzFdOwotCi0gICAgICAgICBpZiAoVmFsIDwgMCkKLSAgICAgICAgICAgICAgVmFsID0gMDsKLSAgICAgICAgIGJyZWFrOwotCi0KLSAgICAvLyBJRUMgNjE5NjYtMwotICAgIC8vIFkgPSAoYVggKyBiKV5HYW1tYSB8IFggPD0gLWIvYQotICAgIC8vIFkgPSBjICAgICAgICAgICAgICB8IGVsc2UKLSAgICBjYXNlIDM6Ci0gICAgICAgIGRpc2MgPSAtUGFyYW1zWzJdIC8gUGFyYW1zWzFdOwotICAgICAgICBpZiAoZGlzYyA8IDApCi0gICAgICAgICAgICBkaXNjID0gMDsKLQotICAgICAgICBpZiAoUiA+PSBkaXNjKSB7Ci0KLSAgICAgICAgICAgIGUgPSBQYXJhbXNbMV0qUiArIFBhcmFtc1syXTsKLQotICAgICAgICAgICAgaWYgKGUgPiAwKQotICAgICAgICAgICAgICAgIFZhbCA9IHBvdyhlLCBQYXJhbXNbMF0pICsgUGFyYW1zWzNdOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIFZhbCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgVmFsID0gUGFyYW1zWzNdOwotICAgICAgICBicmVhazsKLQotCi0gICAgLy8gVHlwZSAzIHJldmVyc2VkCi0gICAgLy8gWD0oKFktYyleMS9nIC0gYikvYSAgICAgIHwgKFk+PWMpCi0gICAgLy8gWD0tYi9hICAgICAgICAgICAgICAgICAgIHwgKFk8YykKLSAgICBjYXNlIC0zOgotICAgICAgICBpZiAoUiA+PSBQYXJhbXNbM10pICB7Ci0KLSAgICAgICAgICAgIGUgPSBSIC0gUGFyYW1zWzNdOwotCi0gICAgICAgICAgICBpZiAoZSA+IDApCi0gICAgICAgICAgICAgICAgVmFsID0gKHBvdyhlLCAxL1BhcmFtc1swXSkgLSBQYXJhbXNbMl0pIC8gUGFyYW1zWzFdOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIFZhbCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBWYWwgPSAtUGFyYW1zWzJdIC8gUGFyYW1zWzFdOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0KLSAgICAvLyBJRUMgNjE5NjYtMi4xIChzUkdCKQotICAgIC8vIFkgPSAoYVggKyBiKV5HYW1tYSB8IFggPj0gZAotICAgIC8vIFkgPSBjWCAgICAgICAgICAgICB8IFggPCBkCi0gICAgY2FzZSA0OgotICAgICAgICBpZiAoUiA+PSBQYXJhbXNbNF0pIHsKLQotICAgICAgICAgICAgZSA9IFBhcmFtc1sxXSpSICsgUGFyYW1zWzJdOwotCi0gICAgICAgICAgICBpZiAoZSA+IDApCi0gICAgICAgICAgICAgICAgVmFsID0gcG93KGUsIFBhcmFtc1swXSk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgVmFsID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBWYWwgPSBSICogUGFyYW1zWzNdOwotICAgICAgICBicmVhazsKLQotICAgIC8vIFR5cGUgNCByZXZlcnNlZAotICAgIC8vIFg9KChZXjEvZy1iKS9hKSAgICB8IFkgPj0gKGFkK2IpXmcKLSAgICAvLyBYPVkvYyAgICAgICAgICAgICAgfCBZPCAoYWQrYileZwotICAgIGNhc2UgLTQ6Ci0gICAgICAgIGUgPSBQYXJhbXNbMV0gKiBQYXJhbXNbNF0gKyBQYXJhbXNbMl07Ci0gICAgICAgIGlmIChlIDwgMCkKLSAgICAgICAgICAgIGRpc2MgPSAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBkaXNjID0gcG93KGUsIFBhcmFtc1swXSk7Ci0KLSAgICAgICAgaWYgKFIgPj0gZGlzYykgewotCi0gICAgICAgICAgICBWYWwgPSAocG93KFIsIDEuMC9QYXJhbXNbMF0pIC0gUGFyYW1zWzJdKSAvIFBhcmFtc1sxXTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIFZhbCA9IFIgLyBQYXJhbXNbM107Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLQotICAgIC8vIFkgPSAoYVggKyBiKV5HYW1tYSArIGUgfCBYID49IGQKLSAgICAvLyBZID0gY1ggKyBmICAgICAgICAgICAgIHwgWCA8IGQKLSAgICBjYXNlIDU6Ci0gICAgICAgIGlmIChSID49IFBhcmFtc1s0XSkgewotCi0gICAgICAgICAgICBlID0gUGFyYW1zWzFdKlIgKyBQYXJhbXNbMl07Ci0KLSAgICAgICAgICAgIGlmIChlID4gMCkKLSAgICAgICAgICAgICAgICBWYWwgPSBwb3coZSwgUGFyYW1zWzBdKSArIFBhcmFtc1s1XTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBWYWwgPSBQYXJhbXNbNV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgVmFsID0gUipQYXJhbXNbM10gKyBQYXJhbXNbNl07Ci0gICAgICAgIGJyZWFrOwotCi0KLSAgICAvLyBSZXZlcnNlZCB0eXBlIDUKLSAgICAvLyBYPSgoWS1lKTEvZy1iKS9hICAgfCBZID49KGFkK2IpXmcrZSksIGNkK2YKLSAgICAvLyBYPShZLWYpL2MgICAgICAgICAgfCBlbHNlCi0gICAgY2FzZSAtNToKLQotICAgICAgICBkaXNjID0gUGFyYW1zWzNdICogUGFyYW1zWzRdICsgUGFyYW1zWzZdOwotICAgICAgICBpZiAoUiA+PSBkaXNjKSB7Ci0KLSAgICAgICAgICAgIGUgPSBSIC0gUGFyYW1zWzVdOwotICAgICAgICAgICAgaWYgKGUgPCAwKQotICAgICAgICAgICAgICAgIFZhbCA9IDA7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgVmFsID0gKHBvdyhlLCAxLjAvUGFyYW1zWzBdKSAtIFBhcmFtc1syXSkgLyBQYXJhbXNbMV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBWYWwgPSAoUiAtIFBhcmFtc1s2XSkgLyBQYXJhbXNbM107Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLQotICAgIC8vIFR5cGVzIDYsNyw4IGNvbWVzIGZyb20gc2VnbWVudGVkIGN1cnZlcyBhcyBkZXNjcmliZWQgaW4gSUNDU3BlY1JldmlzaW9uXzAyXzExXzA2X0Zsb2F0LnBkZgotICAgIC8vIFR5cGUgNiBpcyBiYXNpY2FsbHkgaWRlbnRpY2FsIHRvIHR5cGUgNSB3aXRob3V0IGQKLQotICAgIC8vIFkgPSAoYSAqIFggKyBiKSBeIEdhbW1hICsgYwotICAgIGNhc2UgNjoKLSAgICAgICAgZSA9IFBhcmFtc1sxXSpSICsgUGFyYW1zWzJdOwotCi0gICAgICAgIGlmIChlIDwgMCkKLSAgICAgICAgICAgIFZhbCA9IFBhcmFtc1szXTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgVmFsID0gcG93KGUsIFBhcmFtc1swXSkgKyBQYXJhbXNbM107Ci0gICAgICAgIGJyZWFrOwotCi0gICAgLy8gKChZIC0gYykgXjEvR2FtbWEgLSBiKSAvIGEKLSAgICBjYXNlIC02OgotICAgICAgICBlID0gUiAtIFBhcmFtc1szXTsKLSAgICAgICAgaWYgKGUgPCAwKQotICAgICAgICAgICAgVmFsID0gMDsKLSAgICAgICAgZWxzZQotICAgICAgICBWYWwgPSAocG93KGUsIDEuMC9QYXJhbXNbMF0pIC0gUGFyYW1zWzJdKSAvIFBhcmFtc1sxXTsKLSAgICAgICAgYnJlYWs7Ci0KLQotICAgIC8vIFkgPSBhICogbG9nIChiICogWF5HYW1tYSArIGMpICsgZAotICAgIGNhc2UgNzoKLQotICAgICAgIGUgPSBQYXJhbXNbMl0gKiBwb3coUiwgUGFyYW1zWzBdKSArIFBhcmFtc1szXTsKLSAgICAgICBpZiAoZSA8PSAwKQotICAgICAgICAgICBWYWwgPSBQYXJhbXNbNF07Ci0gICAgICAgZWxzZQotICAgICAgICAgICBWYWwgPSBQYXJhbXNbMV0qbG9nMTAoZSkgKyBQYXJhbXNbNF07Ci0gICAgICAgYnJlYWs7Ci0KLSAgICAvLyAoWSAtIGQpIC8gYSA9IGxvZyhiICogWCBeR2FtbWEgKyBjKQotICAgIC8vIHBvdygxMCwgKFktZCkgLyBhKSA9IGIgKiBYIF5HYW1tYSArIGMKLSAgICAvLyBwb3coKHBvdygxMCwgKFktZCkgLyBhKSAtIGMpIC8gYiwgMS9nKSA9IFgKLSAgICBjYXNlIC03OgotICAgICAgIFZhbCA9IHBvdygocG93KDEwLjAsIChSLVBhcmFtc1s0XSkgLyBQYXJhbXNbMV0pIC0gUGFyYW1zWzNdKSAvIFBhcmFtc1syXSwgMS4wIC8gUGFyYW1zWzBdKTsKLSAgICAgICBicmVhazsKLQotCi0gICAvL1kgPSBhICogYl4oYypYK2QpICsgZQotICAgY2FzZSA4OgotICAgICAgIFZhbCA9IChQYXJhbXNbMF0gKiBwb3coUGFyYW1zWzFdLCBQYXJhbXNbMl0gKiBSICsgUGFyYW1zWzNdKSArIFBhcmFtc1s0XSk7Ci0gICAgICAgYnJlYWs7Ci0KLQotICAgLy8gWSA9IChsb2coKHktZSkgLyBhKSAvIGxvZyhiKSAtIGQgKSAvIGMKLSAgIC8vIGE9MCwgYj0xLCBjPTIsIGQ9MywgZT00LAotICAgY2FzZSAtODoKLQotICAgICAgIGRpc2MgPSBSIC0gUGFyYW1zWzRdOwotICAgICAgIGlmIChkaXNjIDwgMCkgVmFsID0gMDsKLSAgICAgICBlbHNlCi0gICAgICAgICAgIFZhbCA9IChsb2coZGlzYyAvIFBhcmFtc1swXSkgLyBsb2coUGFyYW1zWzFdKSAtIFBhcmFtc1szXSkgLyBQYXJhbXNbMl07Ci0gICAgICAgYnJlYWs7Ci0KLSAgIC8vIFMtU2hhcGVkOiAoMSAtICgxLXgpXjEvZyleMS9nCi0gICBjYXNlIDEwODoKLSAgICAgIFZhbCA9IHBvdygxLjAgLSBwb3coMSAtIFIsIDEvUGFyYW1zWzBdKSwgMS9QYXJhbXNbMF0pOwotICAgICAgYnJlYWs7Ci0KLSAgICAvLyB5ID0gKDEgLSAoMS14KV4xL2cpXjEvZwotICAgIC8vIHleZyA9ICgxIC0gKDEteCleMS9nKQotICAgIC8vIDEgLSB5XmcgPSAoMS14KV4xL2cKLSAgICAvLyAoMSAtIHleZyleZyA9IDEgLSB4Ci0gICAgLy8gMSAtICgxIC0geV5nKV5nCi0gICAgY2FzZSAtMTA4OgotICAgICAgICBWYWwgPSAxIC0gcG93KDEgLSBwb3coUiwgUGFyYW1zWzBdKSwgUGFyYW1zWzBdKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICAvLyBVbnN1cHBvcnRlZCBwYXJhbWV0cmljIGN1cnZlLiBTaG91bGQgbmV2ZXIgcmVhY2ggaGVyZQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gVmFsOwotfQotCi0vLyBFdmFsdWF0ZSBhIHNlZ21lbnRlZCBmdW50aW9uIGZvciBhIHNpbmdsZSB2YWx1ZS4gUmV0dXJuIC0xIGlmIG5vIHZhbGlkIHNlZ21lbnQgZm91bmQgLgotLy8gSWYgZm4gdHlwZSBpcyAwLCBwZXJmb3JtIGFuIGludGVycG9sYXRpb24gb24gdGhlIHRhYmxlCi1zdGF0aWMKLWNtc0Zsb2F0NjROdW1iZXIgRXZhbFNlZ21lbnRlZEZuKGNvbnN0IGNtc1RvbmVDdXJ2ZSAqZywgY21zRmxvYXQ2NE51bWJlciBSKQotewotICAgIGludCBpOwotCi0gICAgZm9yIChpID0gZyAtPm5TZWdtZW50cy0xOyBpID49IDAgOyAtLWkpIHsKLQotICAgICAgICAvLyBDaGVjayBmb3IgZG9tYWluCi0gICAgICAgIGlmICgoUiA+IGcgLT5TZWdtZW50c1tpXS54MCkgJiYgKFIgPD0gZyAtPlNlZ21lbnRzW2ldLngxKSkgewotCi0gICAgICAgICAgICAvLyBUeXBlID09IDAgbWVhbnMgc2VnbWVudCBpcyBzYW1wbGVkCi0gICAgICAgICAgICBpZiAoZyAtPlNlZ21lbnRzW2ldLlR5cGUgPT0gMCkgewotCi0gICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciBSMSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoUiAtIGcgLT5TZWdtZW50c1tpXS54MCkgLyAoZyAtPlNlZ21lbnRzW2ldLngxIC0gZyAtPlNlZ21lbnRzW2ldLngwKTsKLSAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIE91dDsKLQotICAgICAgICAgICAgICAgIC8vIFNldHVwIHRoZSB0YWJsZSAoVE9ETzogY2xlYW4gdGhhdCkKLSAgICAgICAgICAgICAgICBnIC0+U2VnSW50ZXJwW2ldLT4gVGFibGUgPSBnIC0+U2VnbWVudHNbaV0uU2FtcGxlZFBvaW50czsKLQotICAgICAgICAgICAgICAgIGcgLT5TZWdJbnRlcnBbaV0gLT4gSW50ZXJwb2xhdGlvbi5MZXJwRmxvYXQoJlIxLCAmT3V0LCBnIC0+U2VnSW50ZXJwW2ldKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBPdXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgcmV0dXJuIGcgLT5FdmFsc1tpXShnLT5TZWdtZW50c1tpXS5UeXBlLCBnIC0+U2VnbWVudHNbaV0uUGFyYW1zLCBSKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBNSU5VU19JTkY7Ci19Ci0KLS8vIEFjY2VzcyB0byBlc3RpbWF0ZWQgbG93LXJlcyB0YWJsZQotY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNHZXRUb25lQ3VydmVFc3RpbWF0ZWRUYWJsZUVudHJpZXMoY29uc3QgY21zVG9uZUN1cnZlKiB0KQotewotICAgIF9jbXNBc3NlcnQodCAhPSBOVUxMKTsKLSAgICByZXR1cm4gdCAtPm5FbnRyaWVzOwotfQotCi1jb25zdCBjbXNVSW50MTZOdW1iZXIqIENNU0VYUE9SVCBjbXNHZXRUb25lQ3VydmVFc3RpbWF0ZWRUYWJsZShjb25zdCBjbXNUb25lQ3VydmUqIHQpCi17Ci0gICAgX2Ntc0Fzc2VydCh0ICE9IE5VTEwpOwotICAgIHJldHVybiB0IC0+VGFibGUxNjsKLX0KLQotCi0vLyBDcmVhdGUgYW4gZW1wdHkgZ2FtbWEgY3VydmUsIGJ5IHVzaW5nIHRhYmxlcy4gVGhpcyBzcGVjaWZpZXMgb25seSB0aGUgbGltaXRlZC1wcmVjaXNpb24gcGFydCwgYW5kIGxlYXZlcyB0aGUKLS8vIGZsb2F0aW5nIHBvaW50IGRlc2NyaXB0aW9uIGVtcHR5LgotY21zVG9uZUN1cnZlKiBDTVNFWFBPUlQgY21zQnVpbGRUYWJ1bGF0ZWRUb25lQ3VydmUxNihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zSW50MzJOdW1iZXIgbkVudHJpZXMsIGNvbnN0IGNtc1VJbnQxNk51bWJlciBWYWx1ZXNbXSkKLXsKLSAgICByZXR1cm4gQWxsb2NhdGVUb25lQ3VydmVTdHJ1Y3QoQ29udGV4dElELCBuRW50cmllcywgMCwgTlVMTCwgVmFsdWVzKTsKLX0KLQotc3RhdGljCi1pbnQgRW50cmllc0J5R2FtbWEoY21zRmxvYXQ2NE51bWJlciBHYW1tYSkKLXsKLSAgICBpZiAoZmFicyhHYW1tYSAtIDEuMCkgPCAwLjAwMSkgcmV0dXJuIDI7Ci0gICAgcmV0dXJuIDQwOTY7Ci19Ci0KLQotLy8gQ3JlYXRlIGEgc2VnbWVudGVkIGdhbW1hLCBmaWxsIHRoZSB0YWJsZQotY21zVG9uZUN1cnZlKiBDTVNFWFBPUlQgY21zQnVpbGRTZWdtZW50ZWRUb25lQ3VydmUoY21zQ29udGV4dCBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNJbnQzMk51bWJlciBuU2VnbWVudHMsIGNvbnN0IGNtc0N1cnZlU2VnbWVudCBTZWdtZW50c1tdKQotewotICAgIGludCBpOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgUiwgVmFsOwotICAgIGNtc1RvbmVDdXJ2ZSogZzsKLSAgICBpbnQgbkdyaWRQb2ludHMgPSA0MDk2OwotCi0gICAgX2Ntc0Fzc2VydChTZWdtZW50cyAhPSBOVUxMKTsKLQotICAgIC8vIE9wdGltaXphdGluIGZvciBpZGVudGl0eSBjdXJ2ZXMuCi0gICAgaWYgKG5TZWdtZW50cyA9PSAxICYmIFNlZ21lbnRzWzBdLlR5cGUgPT0gMSkgewotCi0gICAgICAgIG5HcmlkUG9pbnRzID0gRW50cmllc0J5R2FtbWEoU2VnbWVudHNbMF0uUGFyYW1zWzBdKTsKLSAgICB9Ci0KLSAgICBnID0gQWxsb2NhdGVUb25lQ3VydmVTdHJ1Y3QoQ29udGV4dElELCBuR3JpZFBvaW50cywgblNlZ21lbnRzLCBTZWdtZW50cywgTlVMTCk7Ci0gICAgaWYgKGcgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICAvLyBPbmNlIHdlIGhhdmUgdGhlIGZsb2F0aW5nIHBvaW50IHZlcnNpb24sIHdlIGNhbiBhcHByb3hpbWF0ZSBhIDE2IGJpdCB0YWJsZSBvZiA0MDk2IGVudHJpZXMKLSAgICAvLyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gVGhpcyB0YWJsZSB3b3VsZCBub3JtYWxseSBub3QgYmUgdXNlZCBleGNlcHQgb24gOC8xNiBiaXRzIHRyYW5zZm9ybXMuCi0gICAgZm9yIChpPTA7IGkgPCBuR3JpZFBvaW50czsgaSsrKSB7Ci0KLSAgICAgICAgUiAgID0gKGNtc0Zsb2F0NjROdW1iZXIpIGkgLyAobkdyaWRQb2ludHMtMSk7Ci0KLSAgICAgICAgVmFsID0gRXZhbFNlZ21lbnRlZEZuKGcsIFIpOwotCi0gICAgICAgIC8vIFJvdW5kIGFuZCBzYXR1cmF0ZQotICAgICAgICBnIC0+VGFibGUxNltpXSA9IF9jbXNRdWlja1NhdHVyYXRlV29yZChWYWwgKiA2NTUzNS4wKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZzsKLX0KLQotLy8gVXNlIGEgc2VnbWVudGVkIGN1cnZlIHRvIHN0b3JlIHRoZSBmbG9hdGluZyBwb2ludCB0YWJsZQotY21zVG9uZUN1cnZlKiBDTVNFWFBPUlQgY21zQnVpbGRUYWJ1bGF0ZWRUb25lQ3VydmVGbG9hdChjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIG5FbnRyaWVzLCBjb25zdCBjbXNGbG9hdDMyTnVtYmVyIHZhbHVlc1tdKQotewotICAgIGNtc0N1cnZlU2VnbWVudCBTZWdbM107Ci0KLSAgICAvLyBBIHNlZ21lbnRlZCB0b25lIGN1cnZlIHNob3VsZCBoYXZlIGZ1bmN0aW9uIHNlZ21lbnRzIGluIHRoZSBmaXJzdCBhbmQgbGFzdCBwb3NpdGlvbnMKLSAgICAvLyBJbml0aWFsaXplIHNlZ21lbnRlZCBjdXJ2ZSBwYXJ0IHVwIHRvIDAgdG8gY29uc3RhbnQgdmFsdWUgPSBzYW1wbGVzWzBdCi0gICAgU2VnWzBdLngwID0gTUlOVVNfSU5GOwotICAgIFNlZ1swXS54MSA9IDA7Ci0gICAgU2VnWzBdLlR5cGUgPSA2OwotCi0gICAgU2VnWzBdLlBhcmFtc1swXSA9IDE7Ci0gICAgU2VnWzBdLlBhcmFtc1sxXSA9IDA7Ci0gICAgU2VnWzBdLlBhcmFtc1syXSA9IDA7Ci0gICAgU2VnWzBdLlBhcmFtc1szXSA9IHZhbHVlc1swXTsKLSAgICBTZWdbMF0uUGFyYW1zWzRdID0gMDsKLQotICAgIC8vIEZyb20gemVybyB0byAxCi0gICAgU2VnWzFdLngwID0gMDsKLSAgICBTZWdbMV0ueDEgPSAxLjA7Ci0gICAgU2VnWzFdLlR5cGUgPSAwOwotCi0gICAgU2VnWzFdLm5HcmlkUG9pbnRzID0gbkVudHJpZXM7Ci0gICAgU2VnWzFdLlNhbXBsZWRQb2ludHMgPSAoY21zRmxvYXQzMk51bWJlciopIHZhbHVlczsKLQotICAgIC8vIEZpbmFsIHNlZ21lbnQgaXMgY29uc3RhbnQgPSBsYXN0c2FtcGxlCi0gICAgU2VnWzJdLngwID0gMS4wOwotICAgIFNlZ1syXS54MSA9IFBMVVNfSU5GOwotICAgIFNlZ1syXS5UeXBlID0gNjsKLSAgICAKLSAgICBTZWdbMl0uUGFyYW1zWzBdID0gMTsKLSAgICBTZWdbMl0uUGFyYW1zWzFdID0gMDsKLSAgICBTZWdbMl0uUGFyYW1zWzJdID0gMDsKLSAgICBTZWdbMl0uUGFyYW1zWzNdID0gdmFsdWVzW25FbnRyaWVzLTFdOwotICAgIFNlZ1syXS5QYXJhbXNbNF0gPSAwOwotICAgIAotCi0gICAgcmV0dXJuIGNtc0J1aWxkU2VnbWVudGVkVG9uZUN1cnZlKENvbnRleHRJRCwgMywgU2VnKTsKLX0KLQotLy8gUGFyYW1ldHJpYyBjdXJ2ZXMKLS8vCi0vLyBQYXJhbWV0ZXJzIGdvZXMgYXM6IEN1cnZlLCBhLCBiLCBjLCBkLCBlLCBmCi0vLyBUeXBlIGlzIHRoZSBJQ0MgdHlwZSArMQotLy8gaWYgdHlwZSBpcyBuZWdhdGl2ZSwgdGhlbiB0aGUgY3VydmUgaXMgYW5hbHl0aWNhbHkgaW52ZXJ0ZWQKLWNtc1RvbmVDdXJ2ZSogQ01TRVhQT1JUIGNtc0J1aWxkUGFyYW1ldHJpY1RvbmVDdXJ2ZShjbXNDb250ZXh0IENvbnRleHRJRCwgY21zSW50MzJOdW1iZXIgVHlwZSwgY29uc3QgY21zRmxvYXQ2NE51bWJlciBQYXJhbXNbXSkKLXsKLSAgICBjbXNDdXJ2ZVNlZ21lbnQgU2VnMDsKLSAgICBpbnQgUG9zID0gMDsKLSAgICBjbXNVSW50MzJOdW1iZXIgc2l6ZTsKLSAgICBfY21zUGFyYW1ldHJpY0N1cnZlc0NvbGxlY3Rpb24qIGMgPSBHZXRQYXJhbWV0cmljQ3VydmVCeVR5cGUoQ29udGV4dElELCBUeXBlLCAmUG9zKTsKLQotICAgIF9jbXNBc3NlcnQoUGFyYW1zICE9IE5VTEwpOwotCi0gICAgaWYgKGMgPT0gTlVMTCkgewotICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiSW52YWxpZCBwYXJhbWV0cmljIGN1cnZlIHR5cGUgJWQiLCBUeXBlKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgbWVtc2V0KCZTZWcwLCAwLCBzaXplb2YoU2VnMCkpOwotCi0gICAgU2VnMC54MCAgID0gTUlOVVNfSU5GOwotICAgIFNlZzAueDEgICA9IFBMVVNfSU5GOwotICAgIFNlZzAuVHlwZSA9IFR5cGU7Ci0KLSAgICBzaXplID0gYy0+UGFyYW1ldGVyQ291bnRbUG9zXSAqIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKTsKLSAgICBtZW1tb3ZlKFNlZzAuUGFyYW1zLCBQYXJhbXMsIHNpemUpOwotCi0gICAgcmV0dXJuIGNtc0J1aWxkU2VnbWVudGVkVG9uZUN1cnZlKENvbnRleHRJRCwgMSwgJlNlZzApOwotfQotCi0KLQotLy8gQnVpbGQgYSBnYW1tYSB0YWJsZSBiYXNlZCBvbiBnYW1tYSBjb25zdGFudAotY21zVG9uZUN1cnZlKiBDTVNFWFBPUlQgY21zQnVpbGRHYW1tYShjbXNDb250ZXh0IENvbnRleHRJRCwgY21zRmxvYXQ2NE51bWJlciBHYW1tYSkKLXsKLSAgICByZXR1cm4gY21zQnVpbGRQYXJhbWV0cmljVG9uZUN1cnZlKENvbnRleHRJRCwgMSwgJkdhbW1hKTsKLX0KLQotCi0vLyBGcmVlIGFsbCBtZW1vcnkgdGFrZW4gYnkgdGhlIGdhbW1hIGN1cnZlCi12b2lkIENNU0VYUE9SVCBjbXNGcmVlVG9uZUN1cnZlKGNtc1RvbmVDdXJ2ZSogQ3VydmUpCi17Ci0gICAgY21zQ29udGV4dCBDb250ZXh0SUQ7Ci0KLQkvLyBhZGRlZCBieSBYaWFvY2h1YW4gTGl1Ci0JLy8gQ3VydmUtPkludGVycFBhcmFtcyBtYXkgYmUgbnVsbAotICAgIGlmIChDdXJ2ZSA9PSBOVUxMIHx8IEN1cnZlLT5JbnRlcnBQYXJhbXMgPT0gTlVMTCkgcmV0dXJuOwotCi0gICAgQ29udGV4dElEID0gQ3VydmUgLT5JbnRlcnBQYXJhbXMtPkNvbnRleHRJRDsKLQotICAgIF9jbXNGcmVlSW50ZXJwUGFyYW1zKEN1cnZlIC0+SW50ZXJwUGFyYW1zKTsKLQlDdXJ2ZSAtPkludGVycFBhcmFtcyA9IE5VTEw7Ci0KLSAgICBpZiAoQ3VydmUgLT4gVGFibGUxNikKLQl7Ci0gICAgICAgIF9jbXNGcmVlKENvbnRleHRJRCwgQ3VydmUgLT5UYWJsZTE2KTsKLQkJQ3VydmUgLT5UYWJsZTE2ID0gTlVMTDsKLQl9Ci0KLSAgICBpZiAoQ3VydmUgLT5TZWdtZW50cykgewotCi0gICAgICAgIGNtc1VJbnQzMk51bWJlciBpOwotCi0gICAgICAgIGZvciAoaT0wOyBpIDwgQ3VydmUgLT5uU2VnbWVudHM7IGkrKykgewotCi0gICAgICAgICAgICBpZiAoQ3VydmUgLT5TZWdtZW50c1tpXS5TYW1wbGVkUG9pbnRzKSB7Ci0gICAgICAgICAgICAgICAgX2Ntc0ZyZWUoQ29udGV4dElELCBDdXJ2ZSAtPlNlZ21lbnRzW2ldLlNhbXBsZWRQb2ludHMpOwotCQkJCUN1cnZlIC0+U2VnbWVudHNbaV0uU2FtcGxlZFBvaW50cyA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChDdXJ2ZSAtPlNlZ0ludGVycFtpXSAhPSAwKQotCQkJewotICAgICAgICAgICAgICAgIF9jbXNGcmVlSW50ZXJwUGFyYW1zKEN1cnZlLT5TZWdJbnRlcnBbaV0pOwotCQkJCUN1cnZlLT5TZWdJbnRlcnBbaV0gPSBOVUxMOwotCQkJfQotICAgICAgICB9Ci0KLSAgICAgICAgX2Ntc0ZyZWUoQ29udGV4dElELCBDdXJ2ZSAtPlNlZ21lbnRzKTsKLQkJQ3VydmUgLT5TZWdtZW50cyA9IE5VTEw7Ci0gICAgICAgIF9jbXNGcmVlKENvbnRleHRJRCwgQ3VydmUgLT5TZWdJbnRlcnApOwotCQlDdXJ2ZSAtPlNlZ0ludGVycCA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKEN1cnZlIC0+IEV2YWxzKQotCXsKLSAgICAgICAgX2Ntc0ZyZWUoQ29udGV4dElELCBDdXJ2ZSAtPiBFdmFscyk7Ci0JCUN1cnZlIC0+IEV2YWxzID0gTlVMTDsKLQl9Ci0KLSAgICBpZiAoQ3VydmUpCi0JewotCQlfY21zRnJlZShDb250ZXh0SUQsIEN1cnZlKTsKLQkJQ3VydmUgPSBOVUxMOwotCX0KLX0KLQotLy8gVXRpbGl0eSBmdW5jdGlvbiwgZnJlZSAzIGdhbW1hIHRhYmxlcwotdm9pZCBDTVNFWFBPUlQgY21zRnJlZVRvbmVDdXJ2ZVRyaXBsZShjbXNUb25lQ3VydmUqIEN1cnZlWzNdKQotewotCi0gICAgX2Ntc0Fzc2VydChDdXJ2ZSAhPSBOVUxMKTsKLQotICAgIGlmIChDdXJ2ZVswXSAhPSBOVUxMKSBjbXNGcmVlVG9uZUN1cnZlKEN1cnZlWzBdKTsKLSAgICBpZiAoQ3VydmVbMV0gIT0gTlVMTCkgY21zRnJlZVRvbmVDdXJ2ZShDdXJ2ZVsxXSk7Ci0gICAgaWYgKEN1cnZlWzJdICE9IE5VTEwpIGNtc0ZyZWVUb25lQ3VydmUoQ3VydmVbMl0pOwotCi0gICAgQ3VydmVbMF0gPSBDdXJ2ZVsxXSA9IEN1cnZlWzJdID0gTlVMTDsKLX0KLQotCi0vLyBEdXBsaWNhdGUgYSBnYW1tYSB0YWJsZQotY21zVG9uZUN1cnZlKiBDTVNFWFBPUlQgY21zRHVwVG9uZUN1cnZlKGNvbnN0IGNtc1RvbmVDdXJ2ZSogSW4pCi17ICAgCi0JLy8gWGlhb2NodWFuIExpdQotCS8vIGZpeCBvcGVucGRmIGJ1ZyhtYW50aXMgaWQ6MDA1NTY4MywgZ29vZ2xlIGlkOjM2MDE5OCkKLQkvLyB0aGUgZnVuY3Rpb24gQ3VydmVTZXRFbGVtVHlwZUZyZWUgaW4gY21zbHV0LmMgYWxzbyBuZWVkcyB0byBjaGVjayBwb2ludGVyCi0gICAgaWYgKEluID09IE5VTEwgfHwgSW4gLT5JbnRlcnBQYXJhbXMgPT0gTlVMTCB8fCBJbiAtPlNlZ21lbnRzID09IE5VTEwgfHwgSW4gLT5UYWJsZTE2ID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgcmV0dXJuICBBbGxvY2F0ZVRvbmVDdXJ2ZVN0cnVjdChJbiAtPkludGVycFBhcmFtcyAtPkNvbnRleHRJRCwgSW4gLT5uRW50cmllcywgSW4gLT5uU2VnbWVudHMsIEluIC0+U2VnbWVudHMsIEluIC0+VGFibGUxNik7Ci19Ci0KLS8vIEpvaW5zIHR3byBjdXJ2ZXMgZm9yIFggYW5kIFkuIEN1cnZlcyBzaG91bGQgYmUgbW9ub3RvbmljLgotLy8gV2Ugd2FudCB0byBnZXQKLS8vCi0vLyAgICAgIHkgPSBZXi0xKFgodCkpCi0vLwotY21zVG9uZUN1cnZlKiBDTVNFWFBPUlQgY21zSm9pblRvbmVDdXJ2ZShjbXNDb250ZXh0IENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zVG9uZUN1cnZlKiBYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNUb25lQ3VydmUqIFksIGNtc1VJbnQzMk51bWJlciBuUmVzdWx0aW5nUG9pbnRzKQotewotICAgIGNtc1RvbmVDdXJ2ZSogb3V0ID0gTlVMTDsKLSAgICBjbXNUb25lQ3VydmUqIFlyZXZlcnNlZCA9IE5VTEw7Ci0gICAgY21zRmxvYXQzMk51bWJlciB0LCB4OwotICAgIGNtc0Zsb2F0MzJOdW1iZXIqIFJlcyA9IE5VTEw7Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0KLQotICAgIF9jbXNBc3NlcnQoWCAhPSBOVUxMKTsKLSAgICBfY21zQXNzZXJ0KFkgIT0gTlVMTCk7Ci0KLSAgICBZcmV2ZXJzZWQgPSBjbXNSZXZlcnNlVG9uZUN1cnZlRXgoblJlc3VsdGluZ1BvaW50cywgWSk7Ci0gICAgaWYgKFlyZXZlcnNlZCA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgUmVzID0gKGNtc0Zsb2F0MzJOdW1iZXIqKSBfY21zQ2FsbG9jKENvbnRleHRJRCwgblJlc3VsdGluZ1BvaW50cywgc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpKTsKLSAgICBpZiAoUmVzID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLSAgICAvL0l0ZXJhdGUKLSAgICBmb3IgKGk9MDsgaSA8ICBuUmVzdWx0aW5nUG9pbnRzOyBpKyspIHsKLQotICAgICAgICB0ID0gKGNtc0Zsb2F0MzJOdW1iZXIpIGkgLyAoblJlc3VsdGluZ1BvaW50cy0xKTsKLSAgICAgICAgeCA9IGNtc0V2YWxUb25lQ3VydmVGbG9hdChYLCAgdCk7Ci0gICAgICAgIFJlc1tpXSA9IGNtc0V2YWxUb25lQ3VydmVGbG9hdChZcmV2ZXJzZWQsIHgpOwotICAgIH0KLQotICAgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciBvdXRwdXQKLSAgICBvdXQgPSBjbXNCdWlsZFRhYnVsYXRlZFRvbmVDdXJ2ZUZsb2F0KENvbnRleHRJRCwgblJlc3VsdGluZ1BvaW50cywgUmVzKTsKLQotRXJyb3I6Ci0KLSAgICBpZiAoUmVzICE9IE5VTEwpIF9jbXNGcmVlKENvbnRleHRJRCwgUmVzKTsKLSAgICBpZiAoWXJldmVyc2VkICE9IE5VTEwpIGNtc0ZyZWVUb25lQ3VydmUoWXJldmVyc2VkKTsKLQotICAgIHJldHVybiBvdXQ7Ci19Ci0KLQotCi0vLyBHZXQgdGhlIHN1cnJvdW5kaW5nIG5vZGVzLiBUaGlzIGlzIHRyaWNreSBvbiBub24tbW9ub3RvbmljIHRhYmxlcwotc3RhdGljCi1pbnQgR2V0SW50ZXJ2YWwoY21zRmxvYXQ2NE51bWJlciBJbiwgY29uc3QgY21zVUludDE2TnVtYmVyIEx1dFRhYmxlW10sIGNvbnN0IHN0cnVjdCBfY21zX2ludGVycF9zdHJ1YyogcCkKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgeTAsIHkxOwotCi0gICAgLy8gQSAxIHBvaW50IHRhYmxlIGlzIG5vdCBhbGxvd2VkCi0gICAgaWYgKHAgLT4gRG9tYWluWzBdIDwgMSkgcmV0dXJuIC0xOwotCi0gICAgLy8gTGV0J3Mgc2VlIGlmIGFzY2VuZGluZyBvciBkZXNjZW5kaW5nLgotICAgIGlmIChMdXRUYWJsZVswXSA8IEx1dFRhYmxlW3AgLT5Eb21haW5bMF1dKSB7Ci0KLSAgICAgICAgLy8gVGFibGUgaXMgb3ZlcmFsbCBhc2NlbmRpbmcKLSAgICAgICAgZm9yIChpPXAtPkRvbWFpblswXS0xOyBpID49MDsgLS1pKSB7Ci0KLSAgICAgICAgICAgIHkwID0gTHV0VGFibGVbaV07Ci0gICAgICAgICAgICB5MSA9IEx1dFRhYmxlW2krMV07Ci0KLSAgICAgICAgICAgIGlmICh5MCA8PSB5MSkgeyAvLyBJbmNyZWFzaW5nCi0gICAgICAgICAgICAgICAgaWYgKEluID49IHkwICYmIEluIDw9IHkxKSByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBpZiAoeTEgPCB5MCkgeyAvLyBEZWNyZWFzaW5nCi0gICAgICAgICAgICAgICAgICAgIGlmIChJbiA+PSB5MSAmJiBJbiA8PSB5MCkgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAvLyBUYWJsZSBpcyBvdmVyYWxsIGRlc2NlbmRpbmcKLSAgICAgICAgZm9yIChpPTA7IGkgPCAoaW50KSBwIC0+IERvbWFpblswXTsgaSsrKSB7Ci0KLSAgICAgICAgICAgIHkwID0gTHV0VGFibGVbaV07Ci0gICAgICAgICAgICB5MSA9IEx1dFRhYmxlW2krMV07Ci0KLSAgICAgICAgICAgIGlmICh5MCA8PSB5MSkgeyAvLyBJbmNyZWFzaW5nCi0gICAgICAgICAgICAgICAgaWYgKEluID49IHkwICYmIEluIDw9IHkxKSByZXR1cm4gaTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBpZiAoeTEgPCB5MCkgeyAvLyBEZWNyZWFzaW5nCi0gICAgICAgICAgICAgICAgICAgIGlmIChJbiA+PSB5MSAmJiBJbiA8PSB5MCkgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIC0xOwotfQotCi0vLyBSZXZlcnNlIGEgZ2FtbWEgdGFibGUKLWNtc1RvbmVDdXJ2ZSogQ01TRVhQT1JUIGNtc1JldmVyc2VUb25lQ3VydmVFeChjbXNJbnQzMk51bWJlciBuUmVzdWx0U2FtcGxlcywgY29uc3QgY21zVG9uZUN1cnZlKiBJbkN1cnZlKQotewotICAgIGNtc1RvbmVDdXJ2ZSAqb3V0OwotICAgIGNtc0Zsb2F0NjROdW1iZXIgYSA9IDAsIGIgPSAwLCB5LCB4MSwgeTEsIHgyLCB5MjsKLSAgICBpbnQgaSwgajsKLSAgICBpbnQgQXNjZW5kaW5nOwotCi0gICAgX2Ntc0Fzc2VydChJbkN1cnZlICE9IE5VTEwpOwotCi0gICAgLy8gVHJ5IHRvIHJldmVyc2UgaXQgYW5hbHl0aWNhbGx5IHdoYXRldmVyIHBvc3NpYmxlCi0gCi0gICAgaWYgKEluQ3VydmUgLT5uU2VnbWVudHMgPT0gMSAmJiBJbkN1cnZlIC0+U2VnbWVudHNbMF0uVHlwZSA+IDAgJiYgCi0gICAgICAgIC8qIEluQ3VydmUgLT4gU2VnbWVudHNbMF0uVHlwZSA8PSA1ICovIAotICAgICAgICBHZXRQYXJhbWV0cmljQ3VydmVCeVR5cGUoSW5DdXJ2ZSAtPkludGVycFBhcmFtcy0+Q29udGV4dElELCBJbkN1cnZlIC0+U2VnbWVudHNbMF0uVHlwZSwgTlVMTCkgIT0gTlVMTCkgewotCi0gICAgICAgIHJldHVybiBjbXNCdWlsZFBhcmFtZXRyaWNUb25lQ3VydmUoSW5DdXJ2ZSAtPkludGVycFBhcmFtcy0+Q29udGV4dElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLShJbkN1cnZlIC0+IFNlZ21lbnRzWzBdLlR5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5DdXJ2ZSAtPiBTZWdtZW50c1swXS5QYXJhbXMpOwotICAgIH0KLQotICAgIC8vIE5vcGUsIHJldmVyc2UgdGhlIHRhYmxlLgotICAgIG91dCA9IGNtc0J1aWxkVGFidWxhdGVkVG9uZUN1cnZlMTYoSW5DdXJ2ZSAtPkludGVycFBhcmFtcy0+Q29udGV4dElELCBuUmVzdWx0U2FtcGxlcywgTlVMTCk7Ci0gICAgaWYgKG91dCA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIC8vIFdlIHdhbnQgdG8ga25vdyBpZiB0aGlzIGlzIGFuIGFzY2VuZGluZyBvciBkZXNjZW5kaW5nIHRhYmxlCi0gICAgQXNjZW5kaW5nID0gIWNtc0lzVG9uZUN1cnZlRGVzY2VuZGluZyhJbkN1cnZlKTsKLQotICAgIC8vIEl0ZXJhdGUgYWNyb3NzIFkgYXhpcwotICAgIGZvciAoaT0wOyBpIDwgIG5SZXN1bHRTYW1wbGVzOyBpKyspIHsKLQotICAgICAgICB5ID0gKGNtc0Zsb2F0NjROdW1iZXIpIGkgKiA2NTUzNS4wIC8gKG5SZXN1bHRTYW1wbGVzIC0gMSk7Ci0KLSAgICAgICAgLy8gRmluZCBpbnRlcnZhbCBpbiB3aGljaCB5IGlzIHdpdGhpbi4KLSAgICAgICAgaiA9IEdldEludGVydmFsKHksIEluQ3VydmUtPlRhYmxlMTYsIEluQ3VydmUtPkludGVycFBhcmFtcyk7Ci0gICAgICAgIGlmIChqID49IDApIHsKLQotCi0gICAgICAgICAgICAvLyBHZXQgbGltaXRzIG9mIGludGVydmFsCi0gICAgICAgICAgICB4MSA9IEluQ3VydmUgLT5UYWJsZTE2W2pdOwotICAgICAgICAgICAgeDIgPSBJbkN1cnZlIC0+VGFibGUxNltqKzFdOwotCi0gICAgICAgICAgICB5MSA9IChjbXNGbG9hdDY0TnVtYmVyKSAoaiAqIDY1NTM1LjApIC8gKEluQ3VydmUgLT5uRW50cmllcyAtIDEpOwotICAgICAgICAgICAgeTIgPSAoY21zRmxvYXQ2NE51bWJlcikgKChqKzEpICogNjU1MzUuMCApIC8gKEluQ3VydmUgLT5uRW50cmllcyAtIDEpOwotCi0gICAgICAgICAgICAvLyBJZiBjb2xsYXBzZWQsIHRoZW4gdXNlIGFueQotICAgICAgICAgICAgaWYgKHgxID09IHgyKSB7Ci0KLSAgICAgICAgICAgICAgICBvdXQgLT5UYWJsZTE2W2ldID0gX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKEFzY2VuZGluZyA/IHkyIDogeTEpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgLy8gSW50ZXJwb2xhdGUKLSAgICAgICAgICAgICAgICBhID0gKHkyIC0geTEpIC8gKHgyIC0geDEpOwotICAgICAgICAgICAgICAgIGIgPSB5MiAtIGEgKiB4MjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG91dCAtPlRhYmxlMTZbaV0gPSBfY21zUXVpY2tTYXR1cmF0ZVdvcmQoYSogeSArIGIpOwotICAgIH0KLQotCi0gICAgcmV0dXJuIG91dDsKLX0KLQotLy8gUmV2ZXJzZSBhIGdhbW1hIHRhYmxlCi1jbXNUb25lQ3VydmUqIENNU0VYUE9SVCBjbXNSZXZlcnNlVG9uZUN1cnZlKGNvbnN0IGNtc1RvbmVDdXJ2ZSogSW5HYW1tYSkKLXsKLSAgICBfY21zQXNzZXJ0KEluR2FtbWEgIT0gTlVMTCk7Ci0KLSAgICByZXR1cm4gY21zUmV2ZXJzZVRvbmVDdXJ2ZUV4KDQwOTYsIEluR2FtbWEpOwotfQotCi0vLyBGcm9tOiBFaWxlcnMsIFAuSC5DLiAoMTk5NCkgU21vb3RoaW5nIGFuZCBpbnRlcnBvbGF0aW9uIHdpdGggZmluaXRlCi0vLyBkaWZmZXJlbmNlcy4gaW46IEdyYXBoaWMgR2VtcyBJViwgSGVja2JlcnQsIFAuUy4gKGVkLiksIEFjYWRlbWljIHByZXNzLgotLy8KLS8vIFNtb290aGluZyBhbmQgaW50ZXJwb2xhdGlvbiB3aXRoIHNlY29uZCBkaWZmZXJlbmNlcy4KLS8vCi0vLyAgIElucHV0OiAgd2VpZ2h0cyAodyksIGRhdGEgKHkpOiB2ZWN0b3IgZnJvbSAxIHRvIG0uCi0vLyAgIElucHV0OiAgc21vb3RoaW5nIHBhcmFtZXRlciAobGFtYmRhKSwgbGVuZ3RoIChtKS4KLS8vICAgT3V0cHV0OiBzbW9vdGhlZCB2ZWN0b3IgKHopOiB2ZWN0b3IgZnJvbSAxIHRvIG0uCi0KLXN0YXRpYwotY21zQm9vbCBzbW9vdGgyKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNGbG9hdDMyTnVtYmVyIHdbXSwgY21zRmxvYXQzMk51bWJlciB5W10sIGNtc0Zsb2F0MzJOdW1iZXIgeltdLCBjbXNGbG9hdDMyTnVtYmVyIGxhbWJkYSwgaW50IG0pCi17Ci0gICAgaW50IGksIGkxLCBpMjsKLSAgICBjbXNGbG9hdDMyTnVtYmVyICpjLCAqZCwgKmU7Ci0gICAgY21zQm9vbCBzdDsKLQotCi0gICAgYyA9IChjbXNGbG9hdDMyTnVtYmVyKikgX2Ntc0NhbGxvYyhDb250ZXh0SUQsIE1BWF9OT0RFU19JTl9DVVJWRSwgc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpKTsKLSAgICBkID0gKGNtc0Zsb2F0MzJOdW1iZXIqKSBfY21zQ2FsbG9jKENvbnRleHRJRCwgTUFYX05PREVTX0lOX0NVUlZFLCBzaXplb2YoY21zRmxvYXQzMk51bWJlcikpOwotICAgIGUgPSAoY21zRmxvYXQzMk51bWJlciopIF9jbXNDYWxsb2MoQ29udGV4dElELCBNQVhfTk9ERVNfSU5fQ1VSVkUsIHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKSk7Ci0KLSAgICBpZiAoYyAhPSBOVUxMICYmIGQgIT0gTlVMTCAmJiBlICE9IE5VTEwpIHsKLQotCi0gICAgZFsxXSA9IHdbMV0gKyBsYW1iZGE7Ci0gICAgY1sxXSA9IC0yICogbGFtYmRhIC8gZFsxXTsKLSAgICBlWzFdID0gbGFtYmRhIC9kWzFdOwotICAgIHpbMV0gPSB3WzFdICogeVsxXTsKLSAgICBkWzJdID0gd1syXSArIDUgKiBsYW1iZGEgLSBkWzFdICogY1sxXSAqICBjWzFdOwotICAgIGNbMl0gPSAoLTQgKiBsYW1iZGEgLSBkWzFdICogY1sxXSAqIGVbMV0pIC8gZFsyXTsKLSAgICBlWzJdID0gbGFtYmRhIC8gZFsyXTsKLSAgICB6WzJdID0gd1syXSAqIHlbMl0gLSBjWzFdICogelsxXTsKLQotICAgIGZvciAoaSA9IDM7IGkgPCBtIC0gMTsgaSsrKSB7Ci0gICAgICAgIGkxID0gaSAtIDE7IGkyID0gaSAtIDI7Ci0gICAgICAgIGRbaV09IHdbaV0gKyA2ICogbGFtYmRhIC0gY1tpMV0gKiBjW2kxXSAqIGRbaTFdIC0gZVtpMl0gKiBlW2kyXSAqIGRbaTJdOwotICAgICAgICBjW2ldID0gKC00ICogbGFtYmRhIC1kW2kxXSAqIGNbaTFdICogZVtpMV0pLyBkW2ldOwotICAgICAgICBlW2ldID0gbGFtYmRhIC8gZFtpXTsKLSAgICAgICAgeltpXSA9IHdbaV0gKiB5W2ldIC0gY1tpMV0gKiB6W2kxXSAtIGVbaTJdICogeltpMl07Ci0gICAgfQotCi0gICAgaTEgPSBtIC0gMjsgaTIgPSBtIC0gMzsKLQotICAgIGRbbSAtIDFdID0gd1ttIC0gMV0gKyA1ICogbGFtYmRhIC1jW2kxXSAqIGNbaTFdICogZFtpMV0gLSBlW2kyXSAqIGVbaTJdICogZFtpMl07Ci0gICAgY1ttIC0gMV0gPSAoLTIgKiBsYW1iZGEgLSBkW2kxXSAqIGNbaTFdICogZVtpMV0pIC8gZFttIC0gMV07Ci0gICAgelttIC0gMV0gPSB3W20gLSAxXSAqIHlbbSAtIDFdIC0gY1tpMV0gKiB6W2kxXSAtIGVbaTJdICogeltpMl07Ci0gICAgaTEgPSBtIC0gMTsgaTIgPSBtIC0gMjsKLQotICAgIGRbbV0gPSB3W21dICsgbGFtYmRhIC0gY1tpMV0gKiBjW2kxXSAqIGRbaTFdIC0gZVtpMl0gKiBlW2kyXSAqIGRbaTJdOwotICAgIHpbbV0gPSAod1ttXSAqIHlbbV0gLSBjW2kxXSAqIHpbaTFdIC0gZVtpMl0gKiB6W2kyXSkgLyBkW21dOwotICAgIHpbbSAtIDFdID0gelttIC0gMV0gLyBkW20gLSAxXSAtIGNbbSAtIDFdICogelttXTsKLQotICAgIGZvciAoaSA9IG0gLSAyOyAxPD0gaTsgaS0tKQotICAgICAgICB6W2ldID0geltpXSAvIGRbaV0gLSBjW2ldICogeltpICsgMV0gLSBlW2ldICogeltpICsgMl07Ci0KLSAgICAgIHN0ID0gVFJVRTsKLSAgICB9Ci0gICAgZWxzZSBzdCA9IEZBTFNFOwotCi0gICAgaWYgKGMgIT0gTlVMTCkgX2Ntc0ZyZWUoQ29udGV4dElELCBjKTsKLSAgICBpZiAoZCAhPSBOVUxMKSBfY21zRnJlZShDb250ZXh0SUQsIGQpOwotICAgIGlmIChlICE9IE5VTEwpIF9jbXNGcmVlKENvbnRleHRJRCwgZSk7Ci0KLSAgICByZXR1cm4gc3Q7Ci19Ci0KLS8vIFNtb290aHMgYSBjdXJ2ZSBzYW1wbGVkIGF0IHJlZ3VsYXIgaW50ZXJ2YWxzLgotY21zQm9vbCAgQ01TRVhQT1JUIGNtc1Ntb290aFRvbmVDdXJ2ZShjbXNUb25lQ3VydmUqIFRhYiwgY21zRmxvYXQ2NE51bWJlciBsYW1iZGEpCi17Ci0gICAgY21zRmxvYXQzMk51bWJlciB3W01BWF9OT0RFU19JTl9DVVJWRV0sIHlbTUFYX05PREVTX0lOX0NVUlZFXSwgeltNQVhfTk9ERVNfSU5fQ1VSVkVdOwotICAgIGludCBpLCBuSXRlbXMsIFplcm9zLCBQb2xlczsKLQotICAgIGlmIChUYWIgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKGNtc0lzVG9uZUN1cnZlTGluZWFyKFRhYikpIHJldHVybiBUUlVFOyAvLyBOb3RoaW5nIHRvIGRvCi0KLSAgICBuSXRlbXMgPSBUYWIgLT4gbkVudHJpZXM7Ci0KLSAgICBpZiAobkl0ZW1zID49IE1BWF9OT0RFU19JTl9DVVJWRSkgewotICAgICAgICBjbXNTaWduYWxFcnJvcihUYWIgLT5JbnRlcnBQYXJhbXMtPkNvbnRleHRJRCwgY21zRVJST1JfUkFOR0UsICJjbXNTbW9vdGhUb25lQ3VydmU6IHRvbyBtYW55IHBvaW50cy4iKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIG1lbXNldCh3LCAwLCBuSXRlbXMgKiBzaXplb2YoY21zRmxvYXQzMk51bWJlcikpOwotICAgIG1lbXNldCh5LCAwLCBuSXRlbXMgKiBzaXplb2YoY21zRmxvYXQzMk51bWJlcikpOwotICAgIG1lbXNldCh6LCAwLCBuSXRlbXMgKiBzaXplb2YoY21zRmxvYXQzMk51bWJlcikpOwotCi0gICAgZm9yIChpPTA7IGkgPCBuSXRlbXM7IGkrKykKLSAgICB7Ci0gICAgICAgIHlbaSsxXSA9IChjbXNGbG9hdDMyTnVtYmVyKSBUYWIgLT4gVGFibGUxNltpXTsKLSAgICAgICAgd1tpKzFdID0gMS4wOwotICAgIH0KLQotICAgIGlmICghc21vb3RoMihUYWIgLT5JbnRlcnBQYXJhbXMtPkNvbnRleHRJRCwgdywgeSwgeiwgKGNtc0Zsb2F0MzJOdW1iZXIpIGxhbWJkYSwgbkl0ZW1zKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgLy8gRG8gc29tZSByZWFsaXR5IC0gY2hlY2tpbmcuLi4KLSAgICBaZXJvcyA9IFBvbGVzID0gMDsKLSAgICBmb3IgKGk9bkl0ZW1zOyBpID4gMTsgLS1pKSB7Ci0KLSAgICAgICAgaWYgKHpbaV0gPT0gMC4pIFplcm9zKys7Ci0gICAgICAgIGlmICh6W2ldID49IDY1NTM1LikgUG9sZXMrKzsKLSAgICAgICAgaWYgKHpbaV0gPCB6W2ktMV0pIHsKLSAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKFRhYiAtPkludGVycFBhcmFtcy0+Q29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgImNtc1Ntb290aFRvbmVDdXJ2ZTogTm9uLU1vbm90b25pYy4iKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChaZXJvcyA+IChuSXRlbXMgLyAzKSkgewotICAgICAgICBjbXNTaWduYWxFcnJvcihUYWIgLT5JbnRlcnBQYXJhbXMtPkNvbnRleHRJRCwgY21zRVJST1JfUkFOR0UsICJjbXNTbW9vdGhUb25lQ3VydmU6IERlZ2VuZXJhdGVkLCBtb3N0bHkgemVyb3MuIik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgaWYgKFBvbGVzID4gKG5JdGVtcyAvIDMpKSB7Ci0gICAgICAgIGNtc1NpZ25hbEVycm9yKFRhYiAtPkludGVycFBhcmFtcy0+Q29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgImNtc1Ntb290aFRvbmVDdXJ2ZTogRGVnZW5lcmF0ZWQsIG1vc3RseSBwb2xlcy4iKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIC8vIFNlZW1zIG9rCi0gICAgZm9yIChpPTA7IGkgPCBuSXRlbXM7IGkrKykgewotCi0gICAgICAgIC8vIENsYW1wIHRvIGNtc1VJbnQxNk51bWJlcgotICAgICAgICBUYWIgLT4gVGFibGUxNltpXSA9IF9jbXNRdWlja1NhdHVyYXRlV29yZCh6W2krMV0pOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vLyBJcyBhIHRhYmxlIGxpbmVhcj8gRG8gbm90IHVzZSBwYXJhbWV0cmljIHNpbmNlIHdlIGNhbm5vdCBndWFyYW50ZWUgc29tZSB3ZWlyZCBwYXJhbWV0ZXJzIHJlc3VsdGluZwotLy8gaW4gYSBsaW5lYXIgdGFibGUuIFRoaXMgd2F5IGFzc3VyZXMgaXQgaXMgbGluZWFyIGluIDEyIGJpdHMsIHdoaWNoIHNob3VsZCBiZSBlbm91Z2h0IGluIG1vc3QgY2FzZXMuCi1jbXNCb29sIENNU0VYUE9SVCBjbXNJc1RvbmVDdXJ2ZUxpbmVhcihjb25zdCBjbXNUb25lQ3VydmUqIEN1cnZlKQotewotICAgIGNtc1VJbnQzMk51bWJlciBpOwotICAgIGludCBkaWZmOwotCi0gICAgX2Ntc0Fzc2VydChDdXJ2ZSAhPSBOVUxMKTsKLQotICAgIGZvciAoaT0wOyBpIDwgQ3VydmUgLT5uRW50cmllczsgaSsrKSB7Ci0KLSAgICAgICAgZGlmZiA9IGFicygoaW50KSBDdXJ2ZS0+VGFibGUxNltpXSAtIChpbnQpIF9jbXNRdWFudGl6ZVZhbChpLCBDdXJ2ZSAtPm5FbnRyaWVzKSk7Ci0gICAgICAgIGlmIChkaWZmID4gMHgwZikKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLy8gU2FtZSwgYnV0IGZvciBtb25vdG9uaWNpdHkKLWNtc0Jvb2wgIENNU0VYUE9SVCBjbXNJc1RvbmVDdXJ2ZU1vbm90b25pYyhjb25zdCBjbXNUb25lQ3VydmUqIHQpCi17Ci0gICAgaW50IG47Ci0gICAgaW50IGksIGxhc3Q7Ci0gICAgY21zQm9vbCBsRGVzY2VuZGluZzsKLQotICAgIF9jbXNBc3NlcnQodCAhPSBOVUxMKTsKLQotICAgIC8vIERlZ2VuZXJhdGVkIGN1cnZlcyBhcmUgbW9ub3RvbmljPyBPaywgbGV0J3MgcGFzcyB0aGVtCi0gICAgbiA9IHQgLT5uRW50cmllczsKLSAgICBpZiAobiA8IDIpIHJldHVybiBUUlVFOwotCi0gICAgLy8gQ3VydmUgZGlyZWN0aW9uCi0gICAgbERlc2NlbmRpbmcgPSBjbXNJc1RvbmVDdXJ2ZURlc2NlbmRpbmcodCk7Ci0KLSAgICBpZiAobERlc2NlbmRpbmcpIHsKLQotICAgICAgICBsYXN0ID0gdCAtPlRhYmxlMTZbMF07Ci0KLSAgICAgICAgZm9yIChpID0gMTsgaSA8IG47IGkrKykgewotCi0gICAgICAgICAgICBpZiAodCAtPlRhYmxlMTZbaV0gLSBsYXN0ID4gMikgLy8gV2UgYWxsb3cgc29tZSByaXBwbGUKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbGFzdCA9IHQgLT5UYWJsZTE2W2ldOwotCi0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0KLSAgICAgICAgbGFzdCA9IHQgLT5UYWJsZTE2W24tMV07Ci0KLSAgICAgICAgZm9yIChpID0gbi0yOyBpID49IDA7IC0taSkgewotCi0gICAgICAgICAgICBpZiAodCAtPlRhYmxlMTZbaV0gLSBsYXN0ID4gMikKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbGFzdCA9IHQgLT5UYWJsZTE2W2ldOwotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLy8gU2FtZSwgYnV0IGZvciBkZXNjZW5kaW5nIHRhYmxlcwotY21zQm9vbCAgQ01TRVhQT1JUIGNtc0lzVG9uZUN1cnZlRGVzY2VuZGluZyhjb25zdCBjbXNUb25lQ3VydmUqIHQpCi17Ci0gICAgX2Ntc0Fzc2VydCh0ICE9IE5VTEwpOwotCi0gICAgcmV0dXJuIHQgLT5UYWJsZTE2WzBdID4gdCAtPlRhYmxlMTZbdCAtPm5FbnRyaWVzLTFdOwotfQotCi0KLS8vIEFub3RoZXIgaW5mbyBmbjogaXMgb3V0IGdhbW1hIHRhYmxlIG11bHRpc2VnbWVudD8KLWNtc0Jvb2wgIENNU0VYUE9SVCBjbXNJc1RvbmVDdXJ2ZU11bHRpc2VnbWVudChjb25zdCBjbXNUb25lQ3VydmUqIHQpCi17Ci0gICAgX2Ntc0Fzc2VydCh0ICE9IE5VTEwpOwotCi0gICAgcmV0dXJuIHQgLT4gblNlZ21lbnRzID4gMTsKLX0KLQotY21zSW50MzJOdW1iZXIgIENNU0VYUE9SVCBjbXNHZXRUb25lQ3VydmVQYXJhbWV0cmljVHlwZShjb25zdCBjbXNUb25lQ3VydmUqIHQpCi17Ci0gICAgX2Ntc0Fzc2VydCh0ICE9IE5VTEwpOwotCi0gICAgaWYgKHQgLT4gblNlZ21lbnRzICE9IDEpIHJldHVybiAwOwotICAgIHJldHVybiB0IC0+U2VnbWVudHNbMF0uVHlwZTsKLX0KLQotLy8gV2UgbmVlZCBhY2N1cmFjeSB0aGlzIHRpbWUKLWNtc0Zsb2F0MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0V2YWxUb25lQ3VydmVGbG9hdChjb25zdCBjbXNUb25lQ3VydmUqIEN1cnZlLCBjbXNGbG9hdDMyTnVtYmVyIHYpCi17Ci0gICAgX2Ntc0Fzc2VydChDdXJ2ZSAhPSBOVUxMKTsKLQotICAgIC8vIENoZWNrIGZvciAxNiBiaXRzIHRhYmxlLiBJZiBzbywgdGhpcyBpcyBhIGxpbWl0ZWQtcHJlY2lzaW9uIHRvbmUgY3VydmUKLSAgICBpZiAoQ3VydmUgLT5uU2VnbWVudHMgPT0gMCkgewotCi0gICAgICAgIGNtc1VJbnQxNk51bWJlciBJbiwgT3V0OwotCi0gICAgICAgIEluID0gKGNtc1VJbnQxNk51bWJlcikgX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKHYgKiA2NTUzNS4wKTsKLSAgICAgICAgT3V0ID0gY21zRXZhbFRvbmVDdXJ2ZTE2KEN1cnZlLCBJbik7Ci0KLSAgICAgICAgcmV0dXJuIChjbXNGbG9hdDMyTnVtYmVyKSAoT3V0IC8gNjU1MzUuMCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIChjbXNGbG9hdDMyTnVtYmVyKSBFdmFsU2VnbWVudGVkRm4oQ3VydmUsIHYpOwotfQotCi0vLyBXZSBuZWVkIHhwdXQgb3ZlciBoZXJlCi1jbXNVSW50MTZOdW1iZXIgQ01TRVhQT1JUIGNtc0V2YWxUb25lQ3VydmUxNihjb25zdCBjbXNUb25lQ3VydmUqIEN1cnZlLCBjbXNVSW50MTZOdW1iZXIgdikKLXsKLSAgICBjbXNVSW50MTZOdW1iZXIgb3V0OwotCi0gICAgX2Ntc0Fzc2VydChDdXJ2ZSAhPSBOVUxMKTsKLQotICAgIEN1cnZlIC0+SW50ZXJwUGFyYW1zIC0+SW50ZXJwb2xhdGlvbi5MZXJwMTYoJnYsICZvdXQsIEN1cnZlIC0+SW50ZXJwUGFyYW1zKTsKLSAgICByZXR1cm4gb3V0OwotfQotCi0KLS8vIExlYXN0IHNxdWFyZXMgZml0dGluZy4KLS8vIEEgbWF0aGVtYXRpY2FsIHByb2NlZHVyZSBmb3IgZmluZGluZyB0aGUgYmVzdC1maXR0aW5nIGN1cnZlIHRvIGEgZ2l2ZW4gc2V0IG9mIHBvaW50cyBieQotLy8gbWluaW1pemluZyB0aGUgc3VtIG9mIHRoZSBzcXVhcmVzIG9mIHRoZSBvZmZzZXRzICgidGhlIHJlc2lkdWFscyIpIG9mIHRoZSBwb2ludHMgZnJvbSB0aGUgY3VydmUuCi0vLyBUaGUgc3VtIG9mIHRoZSBzcXVhcmVzIG9mIHRoZSBvZmZzZXRzIGlzIHVzZWQgaW5zdGVhZCBvZiB0aGUgb2Zmc2V0IGFic29sdXRlIHZhbHVlcyBiZWNhdXNlCi0vLyB0aGlzIGFsbG93cyB0aGUgcmVzaWR1YWxzIHRvIGJlIHRyZWF0ZWQgYXMgYSBjb250aW51b3VzIGRpZmZlcmVudGlhYmxlIHF1YW50aXR5LgotLy8KLS8vIHkgPSBmKHgpID0geCBeIGcKLS8vCi0vLyBSICA9ICh5aSAtICh4aV5nKSkKLS8vIFIyID0gKHlpIC0gKHhpXmcpKTIKLS8vIFNVTSBSMiA9IFNVTSAoeWkgLSAoeGleZykpMgotLy8KLS8vIGRSMi9kZyA9IC0yIFNVTSB4XmcgbG9nKHgpKHkgLSB4XmcpCi0vLyBzb2x2aW5nIGZvciBkUjIvZGcgPSAwCi0vLwotLy8gZyA9IDEvbiAqIFNVTShsb2coeSkgLyBsb2coeCkpCi0KLWNtc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIGNtc0VzdGltYXRlR2FtbWEoY29uc3QgY21zVG9uZUN1cnZlKiB0LCBjbXNGbG9hdDY0TnVtYmVyIFByZWNpc2lvbikKLXsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIGdhbW1hLCBzdW0sIHN1bTI7Ci0gICAgY21zRmxvYXQ2NE51bWJlciBuLCB4LCB5LCBTdGQ7Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0KLSAgICBfY21zQXNzZXJ0KHQgIT0gTlVMTCk7Ci0KLSAgICBzdW0gPSBzdW0yID0gbiA9IDA7Ci0KLSAgICAvLyBFeGNsdWRpbmcgZW5kcG9pbnRzCi0gICAgZm9yIChpPTE7IGkgPCAoTUFYX05PREVTX0lOX0NVUlZFLTEpOyBpKyspIHsKLQotICAgICAgICB4ID0gKGNtc0Zsb2F0NjROdW1iZXIpIGkgLyAoTUFYX05PREVTX0lOX0NVUlZFLTEpOwotICAgICAgICB5ID0gKGNtc0Zsb2F0NjROdW1iZXIpIGNtc0V2YWxUb25lQ3VydmVGbG9hdCh0LCAoY21zRmxvYXQzMk51bWJlcikgeCk7Ci0KLSAgICAgICAgLy8gQXZvaWQgNyUgb24gbG93ZXIgcGFydCB0byBwcmV2ZW50Ci0gICAgICAgIC8vIGFydGlmYWN0cyBkdWUgdG8gbGluZWFyIHJhbXBzCi0KLSAgICAgICAgaWYgKHkgPiAwLiAmJiB5IDwgMS4gJiYgeCA+IDAuMDcpIHsKLQotICAgICAgICAgICAgZ2FtbWEgPSBsb2coeSkgLyBsb2coeCk7Ci0gICAgICAgICAgICBzdW0gICs9IGdhbW1hOwotICAgICAgICAgICAgc3VtMiArPSBnYW1tYSAqIGdhbW1hOwotICAgICAgICAgICAgbisrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGFrZSBhIGxvb2sgb24gU0QgdG8gc2VlIGlmIGdhbW1hIGlzbid0IGV4cG9uZW50aWFsIGF0IGFsbAotICAgIFN0ZCA9IHNxcnQoKG4gKiBzdW0yIC0gc3VtICogc3VtKSAvIChuKihuLTEpKSk7Ci0KLSAgICBpZiAoU3RkID4gUHJlY2lzaW9uKQotICAgICAgICByZXR1cm4gLTEuMDsKLQotICAgIHJldHVybiAoc3VtIC8gbik7ICAgLy8gVGhlIG1lYW4KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zZ210LmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2dtdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTAzMzYzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zZ210LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTAgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTIgTWFydGkgTWFyaWEgU2FndWVyCi0vLwotLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0vLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0vLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0vLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLS8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQotLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLS8vCi0vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0vLwotLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0vLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KLS8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi0vLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCi0vLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0vLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLS8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotCi0jaW5jbHVkZSAibGNtczJfaW50ZXJuYWwuaCIKLQotCi0vLyBBdXhpbGlhcjogYXBwZW5kIGEgTGFiIGlkZW50aXR5IGFmdGVyIHRoZSBnaXZlbiBzZXF1ZW5jZSBvZiBwcm9maWxlcwotLy8gYW5kIHJldHVybiB0aGUgdHJhbnNmb3JtLiBMYWIgcHJvZmlsZSBpcyBjbG9zZWQsIHJlc3Qgb2YgcHJvZmlsZXMgYXJlIGtlcHQgb3Blbi4KLWNtc0hUUkFOU0ZPUk0gX2Ntc0NoYWluMkxhYihjbXNDb250ZXh0ICAgICAgICAgICAgQ29udGV4dElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgblByb2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgSW5wdXRGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgICBPdXRwdXRGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zVUludDMyTnVtYmVyICBJbnRlbnRzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zSFBST0ZJTEUgICAgICBoUHJvZmlsZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNCb29sICAgICAgICAgIEJQQ1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIgQWRhcHRhdGlvblN0YXRlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgZHdGbGFncykKLXsKLSAgICBjbXNIVFJBTlNGT1JNIHhmb3JtOwotICAgIGNtc0hQUk9GSUxFICAgaExhYjsKLSAgICBjbXNIUFJPRklMRSAgIFByb2ZpbGVMaXN0WzI1Nl07Ci0gICAgY21zQm9vbCAgICAgICBCUENMaXN0WzI1Nl07Ci0gICAgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uTGlzdFsyNTZdOwotICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnRMaXN0WzI1Nl07Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0KLSAgICAvLyBUaGlzIGlzIGEgcmF0aGVyIGJpZyBudW1iZXIgYW5kIHRoZXJlIGlzIG5vIG5lZWQgb2YgZHluYW1pYyBtZW1vcnkKLSAgICAvLyBzaW5jZSB3ZSBhcmUgYWRkaW5nIGEgcHJvZmlsZSwgMjU0ICsgMSA9IDI1NSBhbmQgdGhpcyBpcyB0aGUgbGltaXQKLSAgICBpZiAoblByb2ZpbGVzID4gMjU0KSByZXR1cm4gTlVMTDsKLQotICAgIC8vIFRoZSBvdXRwdXQgc3BhY2UKLSAgICBoTGFiID0gY21zQ3JlYXRlTGFiNFByb2ZpbGVUSFIoQ29udGV4dElELCBOVUxMKTsKLSAgICBpZiAoaExhYiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgcGFyYW1ldGVycwotICAgIGZvciAoaT0wOyBpIDwgblByb2ZpbGVzOyBpKyspIHsKLQotICAgICAgICBQcm9maWxlTGlzdFtpXSAgICA9IGhQcm9maWxlc1tpXTsKLSAgICAgICAgQlBDTGlzdFtpXSAgICAgICAgPSBCUENbaV07Ci0gICAgICAgIEFkYXB0YXRpb25MaXN0W2ldID0gQWRhcHRhdGlvblN0YXRlc1tpXTsKLSAgICAgICAgSW50ZW50TGlzdFtpXSAgICAgPSBJbnRlbnRzW2ldOwotICAgIH0KLQotICAgIC8vIFBsYWNlIExhYiBpZGVudGl0eSBhdCBjaGFpbidzIGVuZC4KLSAgICBQcm9maWxlTGlzdFtuUHJvZmlsZXNdICAgID0gaExhYjsKLSAgICBCUENMaXN0W25Qcm9maWxlc10gICAgICAgID0gMDsKLSAgICBBZGFwdGF0aW9uTGlzdFtuUHJvZmlsZXNdID0gMS4wOwotICAgIEludGVudExpc3RbblByb2ZpbGVzXSAgICAgPSBJTlRFTlRfUkVMQVRJVkVfQ09MT1JJTUVUUklDOwotCi0gICAgLy8gQ3JlYXRlIHRoZSB0cmFuc2Zvcm0KLSAgICB4Zm9ybSA9IGNtc0NyZWF0ZUV4dGVuZGVkVHJhbnNmb3JtKENvbnRleHRJRCwgblByb2ZpbGVzICsgMSwgUHJvZmlsZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUENMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZW50TGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0YXRpb25MaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncyk7Ci0KLSAgICBjbXNDbG9zZVByb2ZpbGUoaExhYik7Ci0KLSAgICByZXR1cm4geGZvcm07Ci19Ci0KLQotLy8gQ29tcHV0ZSBLIC0+IEwqIHJlbGF0aW9uc2hpcC4gRmxhZ3MgbWF5IGluY2x1ZGUgYmxhY2sgcG9pbnQgY29tcGVuc2F0aW9uLiBJbiB0aGlzIGNhc2UsCi0vLyB0aGUgcmVsYXRpb25zaGlwIGlzIGFzc3VtZWQgZnJvbSB0aGUgcHJvZmlsZSB3aXRoIEJQQyB0byBhIGJsYWNrIHBvaW50IHplcm8uCi1zdGF0aWMKLWNtc1RvbmVDdXJ2ZSogQ29tcHV0ZUtUb0xzdGFyKGNtc0NvbnRleHQgICAgICAgICAgICBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgIG5Qb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgIG5Qcm9maWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNVSW50MzJOdW1iZXIgSW50ZW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0hQUk9GSUxFICAgICBoUHJvZmlsZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNCb29sICAgICAgICAgQlBDW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uU3RhdGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpCi17Ci0gICAgY21zVG9uZUN1cnZlKiBvdXQgPSBOVUxMOwotICAgIGNtc1VJbnQzMk51bWJlciBpOwotICAgIGNtc0hUUkFOU0ZPUk0geGZvcm07Ci0gICAgY21zQ0lFTGFiIExhYjsKLSAgICBjbXNGbG9hdDMyTnVtYmVyIGNteWtbNF07Ci0gICAgY21zRmxvYXQzMk51bWJlciogU2FtcGxlZFBvaW50czsKLQotICAgIHhmb3JtID0gX2Ntc0NoYWluMkxhYihDb250ZXh0SUQsIG5Qcm9maWxlcywgVFlQRV9DTVlLX0ZMVCwgVFlQRV9MYWJfREJMLCBJbnRlbnRzLCBoUHJvZmlsZXMsIEJQQywgQWRhcHRhdGlvblN0YXRlcywgZHdGbGFncyk7Ci0gICAgaWYgKHhmb3JtID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgU2FtcGxlZFBvaW50cyA9IChjbXNGbG9hdDMyTnVtYmVyKikgX2Ntc0NhbGxvYyhDb250ZXh0SUQsIG5Qb2ludHMsIHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKSk7Ci0gICAgaWYgKFNhbXBsZWRQb2ludHMgID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG5Qb2ludHM7IGkrKykgewotCi0gICAgICAgIGNteWtbMF0gPSAwOwotICAgICAgICBjbXlrWzFdID0gMDsKLSAgICAgICAgY215a1syXSA9IDA7Ci0gICAgICAgIGNteWtbM10gPSAoY21zRmxvYXQzMk51bWJlcikgKChpICogMTAwLjApIC8gKG5Qb2ludHMtMSkpOwotCi0gICAgICAgIGNtc0RvVHJhbnNmb3JtKHhmb3JtLCBjbXlrLCAmTGFiLCAxKTsKLSAgICAgICAgU2FtcGxlZFBvaW50c1tpXT0gKGNtc0Zsb2F0MzJOdW1iZXIpICgxLjAgLSBMYWIuTCAvIDEwMC4wKTsgLy8gTmVnYXRlIEsgZm9yIGVhc2llciBvcGVyYXRpb24KLSAgICB9Ci0KLSAgICBvdXQgPSBjbXNCdWlsZFRhYnVsYXRlZFRvbmVDdXJ2ZUZsb2F0KENvbnRleHRJRCwgblBvaW50cywgU2FtcGxlZFBvaW50cyk7Ci0KLUVycm9yOgotCi0gICAgY21zRGVsZXRlVHJhbnNmb3JtKHhmb3JtKTsKLSAgICBpZiAoU2FtcGxlZFBvaW50cykgX2Ntc0ZyZWUoQ29udGV4dElELCBTYW1wbGVkUG9pbnRzKTsKLQotICAgIHJldHVybiBvdXQ7Ci19Ci0KLQotLy8gQ29tcHV0ZSBCbGFjayB0b25lIGN1cnZlIG9uIGEgQ01ZSyAtPiBDTVlLIHRyYW5zZm9ybS4gVGhpcyBpcyBkb25lIGJ5Ci0vLyB1c2luZyB0aGUgcHJvb2YgZGlyZWN0aW9uIG9uIGJvdGggcHJvZmlsZXMgdG8gZmluZCBLLT5MKiByZWxhdGlvbnNoaXAKLS8vIHRoZW4gam9pbmluZyBib3RoIGN1cnZlcy4gZHdGbGFncyBtYXkgaW5jbHVkZSBibGFjayBwb2ludCBjb21wZW5zYXRpb24uCi1jbXNUb25lQ3VydmUqIF9jbXNCdWlsZEtUb25lQ3VydmUoY21zQ29udGV4dCAgICAgICAgQ29udGV4dElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgICBuUG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgICBuUHJvZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1VJbnQzMk51bWJlciBJbnRlbnRzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0hQUk9GSUxFIGhQcm9maWxlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNCb29sICAgICBCUENbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uU3RhdGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgIGR3RmxhZ3MpCi17Ci0gICAgY21zVG9uZUN1cnZlICppbiwgKm91dCwgKktUb25lOwotCi0gICAgLy8gTWFrZSBzdXJlIENNWUsgLT4gQ01ZSwotICAgIGlmIChjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlc1swXSkgIT0gY21zU2lnQ215a0RhdGEgfHwKLSAgICAgICAgY21zR2V0Q29sb3JTcGFjZShoUHJvZmlsZXNbblByb2ZpbGVzLTFdKSE9IGNtc1NpZ0NteWtEYXRhKSByZXR1cm4gTlVMTDsKLQotCi0gICAgLy8gTWFrZSBzdXJlIGxhc3QgaXMgYW4gb3V0cHV0IHByb2ZpbGUKLSAgICBpZiAoY21zR2V0RGV2aWNlQ2xhc3MoaFByb2ZpbGVzW25Qcm9maWxlcyAtIDFdKSAhPSBjbXNTaWdPdXRwdXRDbGFzcykgcmV0dXJuIE5VTEw7Ci0KLSAgICAvLyBDcmVhdGUgaW5kaXZpZHVhbCBjdXJ2ZXMuIEJQQyB3b3JrcyBhbHNvIGFzIGVhY2ggSyB0byBMKiBpcwotICAgIC8vIGNvbXB1dGVkIGFzIGEgQlBDIHRvIHplcm8gYmxhY2sgcG9pbnQgaW4gY2FzZSBvZiBMKgotICAgIGluICA9IENvbXB1dGVLVG9Mc3RhcihDb250ZXh0SUQsIG5Qb2ludHMsIG5Qcm9maWxlcyAtIDEsIEludGVudHMsIGhQcm9maWxlcywgQlBDLCBBZGFwdGF0aW9uU3RhdGVzLCBkd0ZsYWdzKTsKLSAgICBpZiAoaW4gPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBvdXQgPSBDb21wdXRlS1RvTHN0YXIoQ29udGV4dElELCBuUG9pbnRzLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVudHMgKyAoblByb2ZpbGVzIC0gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhQcm9maWxlcyBbblByb2ZpbGVzIC0gMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBDICsgKG5Qcm9maWxlcyAtIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkYXB0YXRpb25TdGF0ZXMgKyAoblByb2ZpbGVzIC0gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdGbGFncyk7Ci0gICAgaWYgKG91dCA9PSBOVUxMKSB7Ci0gICAgICAgIGNtc0ZyZWVUb25lQ3VydmUoaW4pOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBCdWlsZCB0aGUgcmVsYXRpb25zaGlwLiBUaGlzIGVmZmVjdGl2ZWx5IGxpbWl0cyB0aGUgbWF4aW11bSBhY2N1cmFjeSB0byAxNiBiaXRzLCBidXQKLSAgICAvLyBzaW5jZSB0aGlzIGlzIHVzZWQgb24gYmxhY2stcHJlc2VydmluZyBMVVRzLCB3ZSBhcmUgbm90IGxvb3NpbmcgIGFjY3VyYWN5IGluIGFueSBjYXNlCi0gICAgS1RvbmUgPSBjbXNKb2luVG9uZUN1cnZlKENvbnRleHRJRCwgaW4sIG91dCwgblBvaW50cyk7Ci0KLSAgICAvLyBHZXQgcmlkIG9mIGNvbXBvbmVudHMKLSAgICBjbXNGcmVlVG9uZUN1cnZlKGluKTsgY21zRnJlZVRvbmVDdXJ2ZShvdXQpOwotCi0gICAgLy8gU29tZXRoaW5nIHdlbnQgd3JvbmcuLi4KLSAgICBpZiAoS1RvbmUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICAvLyBNYWtlIHN1cmUgaXQgaXMgbW9ub3RvbmljCi0gICAgaWYgKCFjbXNJc1RvbmVDdXJ2ZU1vbm90b25pYyhLVG9uZSkpIHsKLSAgICAgICAgY21zRnJlZVRvbmVDdXJ2ZShLVG9uZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBLVG9uZTsKLX0KLQotCi0vLyBHYW11dCBMVVQgQ3JlYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gVXNlZCBieSBnYW11dCAmIHNvZnRwcm9vZmluZwotCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBjbXNIVFJBTlNGT1JNIGhJbnB1dDsgICAgICAgICAgICAgICAvLyBGcm9tIHdoYXRldmVyIGlucHV0IGNvbG9yIHNwYWNlLiAxNiBiaXRzIHRvIERCTAotICAgIGNtc0hUUkFOU0ZPUk0gaEZvcndhcmQsIGhSZXZlcnNlOyAgIC8vIFRyYW5zZm9ybXMgZ29pbmcgZnJvbSBMYWIgdG8gY29sb3JhbnQgYW5kIGJhY2sKLSAgICBjbXNGbG9hdDY0TnVtYmVyIFRoZXJlc2hvbGQ7ICAgICAgICAvLyBUaGUgdGhlcmVzaG9sZCBhZnRlciB3aGljaCBpcyBjb25zaWRlcmVkIG91dCBvZiBnYW11dAotCi0gICAgfSBHQU1VVENIQUlOOwotCi0vLyBUaGlzIHNhbXBsZXIgZG9lcyBjb21wdXRlIGdhbXV0IGJvdW5kYXJpZXMgYnkgY29tcGFyaW5nIG9yaWdpbmFsCi0vLyB2YWx1ZXMgd2l0aCBhIHRyYW5zZm9ybSBnb2luZyBiYWNrIGFuZCBmb3J0aC4gVmFsdWVzIGFib3ZlIEVSUl9USEVSRVNIT0xECi0vLyBvZiBtYXhpbXVtIGFyZSBjb25zaWRlcmVkIG91dCBvZiBnYW11dC4KLQotI2RlZmluZSBFUlJfVEhFUkVTSE9MRCAgICAgIDUKLQotCi1zdGF0aWMKLWludCBHYW11dFNhbXBsZXIocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIEluW10sIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciBPdXRbXSwgcmVnaXN0ZXIgdm9pZCogQ2FyZ28pCi17Ci0gICAgR0FNVVRDSEFJTiogIHQgPSAoR0FNVVRDSEFJTiogKSBDYXJnbzsKLSAgICBjbXNDSUVMYWIgTGFiSW4xLCBMYWJPdXQxOwotICAgIGNtc0NJRUxhYiBMYWJJbjIsIExhYk91dDI7Ci0gICAgY21zVUludDE2TnVtYmVyIFByb29mW2Ntc01BWENIQU5ORUxTXSwgUHJvb2YyW2Ntc01BWENIQU5ORUxTXTsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIGRFMSwgZEUyLCBFcnJvclJhdGlvOwotCi0gICAgLy8gQXNzdW1lIGluLWdhbXV0IGJ5IGRlZmF1bHQuCi0gICAgRXJyb3JSYXRpbyA9IDEuMDsKLQotICAgIC8vIENvbnZlcnQgaW5wdXQgdG8gTGFiCi0gICAgY21zRG9UcmFuc2Zvcm0odCAtPiBoSW5wdXQsIEluLCAmTGFiSW4xLCAxKTsKLQotICAgIC8vIGNvbnZlcnRzIGZyb20gUENTIHRvIGNvbG9yYW50LiBUaGlzIGFsd2F5cwotICAgIC8vIGRvZXMgcmV0dXJuIGluLWdhbXV0IHZhbHVlcywKLSAgICBjbXNEb1RyYW5zZm9ybSh0IC0+IGhGb3J3YXJkLCAmTGFiSW4xLCBQcm9vZiwgMSk7Ci0KLSAgICAvLyBOb3csIGRvIHRoZSBpbnZlcnNlLCBmcm9tIGNvbG9yYW50IHRvIFBDUy4KLSAgICBjbXNEb1RyYW5zZm9ybSh0IC0+IGhSZXZlcnNlLCBQcm9vZiwgJkxhYk91dDEsIDEpOwotCi0gICAgbWVtbW92ZSgmTGFiSW4yLCAmTGFiT3V0MSwgc2l6ZW9mKGNtc0NJRUxhYikpOwotCi0gICAgLy8gVHJ5IGFnYWluLCBidXQgdGhpcyB0aW1lIHRha2luZyBDaGVjayBhcyBpbnB1dAotICAgIGNtc0RvVHJhbnNmb3JtKHQgLT4gaEZvcndhcmQsICZMYWJPdXQxLCBQcm9vZjIsIDEpOwotICAgIGNtc0RvVHJhbnNmb3JtKHQgLT4gaFJldmVyc2UsIFByb29mMiwgJkxhYk91dDIsIDEpOwotCi0gICAgLy8gVGFrZSBkaWZmZXJlbmNlIG9mIGRpcmVjdCB2YWx1ZQotICAgIGRFMSA9IGNtc0RlbHRhRSgmTGFiSW4xLCAmTGFiT3V0MSk7Ci0KLSAgICAvLyBUYWtlIGRpZmZlcmVuY2Ugb2YgY29udmVydGVkIHZhbHVlCi0gICAgZEUyID0gY21zRGVsdGFFKCZMYWJJbjIsICZMYWJPdXQyKTsKLQotCi0gICAgLy8gaWYgZEUxIGlzIHNtYWxsIGFuZCBkRTIgaXMgc21hbGwsIHZhbHVlIGlzIGxpa2VseSB0byBiZSBpbiBnYW11dAotICAgIGlmIChkRTEgPCB0LT5UaGVyZXNob2xkICYmIGRFMiA8IHQtPlRoZXJlc2hvbGQpCi0gICAgICAgIE91dFswXSA9IDA7Ci0gICAgZWxzZSB7Ci0KLSAgICAgICAgLy8gaWYgZEUxIGlzIHNtYWxsIGFuZCBkRTIgaXMgYmlnLCB1bmRlZmluZWQuIEFzc3VtZSBpbiBnYW11dAotICAgICAgICBpZiAoZEUxIDwgdC0+VGhlcmVzaG9sZCAmJiBkRTIgPiB0LT5UaGVyZXNob2xkKQotICAgICAgICAgICAgT3V0WzBdID0gMDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgLy8gZEUxIGlzIGJpZyBhbmQgZEUyIGlzIHNtYWxsLCBjbGVhcmx5IG91dCBvZiBnYW11dAotICAgICAgICAgICAgaWYgKGRFMSA+IHQtPlRoZXJlc2hvbGQgJiYgZEUyIDwgdC0+VGhlcmVzaG9sZCkKLSAgICAgICAgICAgICAgICBPdXRbMF0gPSAoY21zVUludDE2TnVtYmVyKSBfY21zUXVpY2tGbG9vcigoZEUxIC0gdC0+VGhlcmVzaG9sZCkgKyAuNSk7Ci0gICAgICAgICAgICBlbHNlICB7Ci0KLSAgICAgICAgICAgICAgICAvLyBkRTEgaXMgYmlnIGFuZCBkRTIgaXMgYWxzbyBiaWcsIGNvdWxkIGJlIGR1ZSB0byBwZXJjZXB0dWFsIG1hcHBpbmcKLSAgICAgICAgICAgICAgICAvLyBzbyB0YWtlIGVycm9yIHJhdGlvCi0gICAgICAgICAgICAgICAgaWYgKGRFMiA9PSAwLjApCi0gICAgICAgICAgICAgICAgICAgIEVycm9yUmF0aW8gPSBkRTE7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBFcnJvclJhdGlvID0gZEUxIC8gZEUyOwotCi0gICAgICAgICAgICAgICAgaWYgKEVycm9yUmF0aW8gPiB0LT5UaGVyZXNob2xkKQotICAgICAgICAgICAgICAgICAgICBPdXRbMF0gPSAoY21zVUludDE2TnVtYmVyKSAgX2Ntc1F1aWNrRmxvb3IoKEVycm9yUmF0aW8gLSB0LT5UaGVyZXNob2xkKSArIC41KTsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIE91dFswXSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgfQotCi0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLy8gRG9lcyBjb21wdXRlIGEgZ2FtdXQgTFVUIGdvaW5nIGJhY2sgYW5kIGZvcnRoIGFjcm9zcyBwY3MgLT4gcmVsYXRpdi4gY29sb3JpbWV0cmljIGludGVudCAtPiBwY3MKLS8vIHRoZSBkRSBvYnRhaW5lZCBpcyB0aGVuIGFubm90YXRlZCBvbiB0aGUgTFVULiBWYWx1ZXMgdHJ1ZWx5IG91dCBvZiBnYW11dCBhcmUgY2xpcHBlZCB0byBkRSA9IDB4RkZGRQotLy8gYW5kIHZhbHVlcyBjaGFuZ2VkIGFyZSBzdXBwb3NlZCB0byBiZSBoYW5kbGVkIGJ5IGFueSBnYW11dCByZW1hcHBpbmcsIHNvLCBhcmUgb3V0IG9mIGdhbXV0IGFzIHdlbGwuCi0vLwotLy8gKipXQVJOSU5HOiBUaGlzIGFsZ29yaXRobSBkb2VzIGFzc3VtZSB0aGF0IGdhbXV0IHJlbWFwcGluZyBhbGdvcml0aG1zIGRvZXMgTk9UIG1vdmUgaW4tZ2FtdXQgY29sb3JzLAotLy8gb2YgY291cnNlLCBtYW55IHBlcmNlcHR1YWwgYW5kIHNhdHVyYXRpb24gaW50ZW50cyBkb2VzIG5vdCB3b3JrIGluIHN1Y2ggd2F5LCBidXQgcmVsYXRpdi4gb25lcyBzaG91bGQuCi0KLWNtc1BpcGVsaW5lKiBfY21zQ3JlYXRlR2FtdXRDaGVja1BpcGVsaW5lKGNtc0NvbnRleHQgQ29udGV4dElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgaFByb2ZpbGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNCb29sICBCUENbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnRzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEFkYXB0YXRpb25TdGF0ZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuR2FtdXRQQ1Nwb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFIGhHYW11dCkKLXsKLSAgICBjbXNIUFJPRklMRSBoTGFiOwotICAgIGNtc1BpcGVsaW5lKiBHYW11dDsKLSAgICBjbXNTdGFnZSogQ0xVVDsKLSAgICBjbXNVSW50MzJOdW1iZXIgZHdGb3JtYXQ7Ci0gICAgR0FNVVRDSEFJTiBDaGFpbjsKLSAgICBpbnQgbkNoYW5uZWxzLCBuR3JpZHBvaW50czsKLSAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2U7Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0gICAgY21zSFBST0ZJTEUgUHJvZmlsZUxpc3RbMjU2XTsKLSAgICBjbXNCb29sICAgICBCUENMaXN0WzI1Nl07Ci0gICAgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uTGlzdFsyNTZdOwotICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnRMaXN0WzI1Nl07Ci0KLSAgICBtZW1zZXQoJkNoYWluLCAwLCBzaXplb2YoR0FNVVRDSEFJTikpOwotCi0KLSAgICBpZiAobkdhbXV0UENTcG9zaXRpb24gPD0gMCB8fCBuR2FtdXRQQ1Nwb3NpdGlvbiA+IDI1NSkgewotICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX1JBTkdFLCAiV3JvbmcgcG9zaXRpb24gb2YgUENTLiAxLi4yNTUgZXhwZWN0ZWQsICVkIGZvdW5kLiIsIG5HYW11dFBDU3Bvc2l0aW9uKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaExhYiA9IGNtc0NyZWF0ZUxhYjRQcm9maWxlVEhSKENvbnRleHRJRCwgTlVMTCk7Ci0gICAgaWYgKGhMYWIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLQotICAgIC8vIFRoZSBmaWd1cmUgb2YgbWVyaXQuIE9uIG1hdHJpeC1zaGFwZXIgcHJvZmlsZXMsIHNob3VsZCBiZSBhbG1vc3QgemVybyBhcwotICAgIC8vIHRoZSBjb252ZXJzaW9uIGlzIHByZXR0eSBleGFjdC4gT24gTFVUIGJhc2VkIHByb2ZpbGVzLCBkaWZmZXJlbnQgcmVzb2x1dGlvbnMKLSAgICAvLyBvZiBpbnB1dCBhbmQgb3V0cHV0IENMVVQgbWF5IHJlc3VsdCBpbiBkaWZmZXJlbmNlcy4KLQotICAgIGlmIChjbXNJc01hdHJpeFNoYXBlcihoR2FtdXQpKSB7Ci0KLSAgICAgICAgQ2hhaW4uVGhlcmVzaG9sZCA9IDEuMDsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIENoYWluLlRoZXJlc2hvbGQgPSBFUlJfVEhFUkVTSE9MRDsKLSAgICB9Ci0KLQotICAgIC8vIENyZWF0ZSBhIGNvcHkgb2YgcGFyYW1ldGVycwotICAgIGZvciAoaT0wOyBpIDwgbkdhbXV0UENTcG9zaXRpb247IGkrKykgewotICAgICAgICBQcm9maWxlTGlzdFtpXSAgICA9IGhQcm9maWxlc1tpXTsKLSAgICAgICAgQlBDTGlzdFtpXSAgICAgICAgPSBCUENbaV07Ci0gICAgICAgIEFkYXB0YXRpb25MaXN0W2ldID0gQWRhcHRhdGlvblN0YXRlc1tpXTsKLSAgICAgICAgSW50ZW50TGlzdFtpXSAgICAgPSBJbnRlbnRzW2ldOwotICAgIH0KLQotICAgIC8vIEZpbGwgTGFiIGlkZW50aXR5Ci0gICAgUHJvZmlsZUxpc3RbbkdhbXV0UENTcG9zaXRpb25dID0gaExhYjsKLSAgICBCUENMaXN0W25HYW11dFBDU3Bvc2l0aW9uXSA9IDA7Ci0gICAgQWRhcHRhdGlvbkxpc3RbbkdhbXV0UENTcG9zaXRpb25dID0gMS4wOwotICAgIEludGVudExpc3RbbkdhbXV0UENTcG9zaXRpb25dID0gSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQzsKLQotCi0gICAgQ29sb3JTcGFjZSAgPSBjbXNHZXRDb2xvclNwYWNlKGhHYW11dCk7Ci0KLSAgICBuQ2hhbm5lbHMgICA9IGNtc0NoYW5uZWxzT2YoQ29sb3JTcGFjZSk7Ci0gICAgbkdyaWRwb2ludHMgPSBfY21zUmVhc29uYWJsZUdyaWRwb2ludHNCeUNvbG9yc3BhY2UoQ29sb3JTcGFjZSwgY21zRkxBR1NfSElHSFJFU1BSRUNBTEMpOwotICAgIGR3Rm9ybWF0ICAgID0gKENIQU5ORUxTX1NIKG5DaGFubmVscyl8QllURVNfU0goMikpOwotCi0gICAgLy8gMTYgYml0cyB0byBMYWIgZG91YmxlCi0gICAgQ2hhaW4uaElucHV0ID0gY21zQ3JlYXRlRXh0ZW5kZWRUcmFuc2Zvcm0oQ29udGV4dElELAotICAgICAgICBuR2FtdXRQQ1Nwb3NpdGlvbiArIDEsCi0gICAgICAgIFByb2ZpbGVMaXN0LAotICAgICAgICBCUENMaXN0LAotICAgICAgICBJbnRlbnRMaXN0LAotICAgICAgICBBZGFwdGF0aW9uTGlzdCwKLSAgICAgICAgTlVMTCwgMCwKLSAgICAgICAgZHdGb3JtYXQsIFRZUEVfTGFiX0RCTCwKLSAgICAgICAgY21zRkxBR1NfTk9DQUNIRSk7Ci0KLQotICAgIC8vIERvZXMgY3JlYXRlIHRoZSBmb3J3YXJkIHN0ZXAuIExhYiBkb3VibGUgdG8gZGV2aWNlCi0gICAgZHdGb3JtYXQgICAgPSAoQ0hBTk5FTFNfU0gobkNoYW5uZWxzKXxCWVRFU19TSCgyKSk7Ci0gICAgQ2hhaW4uaEZvcndhcmQgPSBjbXNDcmVhdGVUcmFuc2Zvcm1USFIoQ29udGV4dElELAotICAgICAgICBoTGFiLCBUWVBFX0xhYl9EQkwsCi0gICAgICAgIGhHYW11dCwgZHdGb3JtYXQsCi0gICAgICAgIElOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUMsCi0gICAgICAgIGNtc0ZMQUdTX05PQ0FDSEUpOwotCi0gICAgLy8gRG9lcyBjcmVhdGUgdGhlIGJhY2t3YXJkcyBzdGVwCi0gICAgQ2hhaW4uaFJldmVyc2UgPSBjbXNDcmVhdGVUcmFuc2Zvcm1USFIoQ29udGV4dElELCBoR2FtdXQsIGR3Rm9ybWF0LAotICAgICAgICBoTGFiLCBUWVBFX0xhYl9EQkwsCi0gICAgICAgIElOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUMsCi0gICAgICAgIGNtc0ZMQUdTX05PQ0FDSEUpOwotCi0KLSAgICAvLyBBbGwgb2s/Ci0gICAgaWYgKENoYWluLmhJbnB1dCAmJiBDaGFpbi5oRm9yd2FyZCAmJiBDaGFpbi5oUmV2ZXJzZSkgewotCi0gICAgICAgIC8vIEdvIG9uLCB0cnkgdG8gY29tcHV0ZSBnYW11dCBMVVQgZnJvbSBQQ1MuIFRoaXMgY29uc2lzdCBvbiBhIHNpbmdsZSBjaGFubmVsIGNvbnRhaW5pbmcKLSAgICAgICAgLy8gZEUgd2hlbiBkb2luZyBhIHRyYW5zZm9ybSBiYWNrIGFuZCBmb3J0aCBvbiB0aGUgY29sb3JpbWV0cmljIGludGVudC4KLQotICAgICAgICBHYW11dCA9IGNtc1BpcGVsaW5lQWxsb2MoQ29udGV4dElELCAzLCAxKTsKLSAgICAgICAgaWYgKEdhbXV0ICE9IE5VTEwpIHsKLQotICAgICAgICAgICAgQ0xVVCA9IGNtc1N0YWdlQWxsb2NDTHV0MTZiaXQoQ29udGV4dElELCBuR3JpZHBvaW50cywgbkNoYW5uZWxzLCAxLCBOVUxMKTsKLSAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShHYW11dCwgY21zQVRfQkVHSU4sIENMVVQpKSB7Ci0gICAgICAgICAgICAgICAgY21zUGlwZWxpbmVGcmVlKEdhbXV0KTsKLSAgICAgICAgICAgICAgICBHYW11dCA9IE5VTEw7Ci0gICAgICAgICAgICB9IAotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgY21zU3RhZ2VTYW1wbGVDTHV0MTZiaXQoQ0xVVCwgR2FtdXRTYW1wbGVyLCAodm9pZCopICZDaGFpbiwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBHYW11dCA9IE5VTEw7ICAgLy8gRGlkbid0IHdvcmsuLi4KLQotICAgIC8vIEZyZWUgYWxsIG5lZWRlZCBzdHVmZi4KLSAgICBpZiAoQ2hhaW4uaElucHV0KSAgIGNtc0RlbGV0ZVRyYW5zZm9ybShDaGFpbi5oSW5wdXQpOwotICAgIGlmIChDaGFpbi5oRm9yd2FyZCkgY21zRGVsZXRlVHJhbnNmb3JtKENoYWluLmhGb3J3YXJkKTsKLSAgICBpZiAoQ2hhaW4uaFJldmVyc2UpIGNtc0RlbGV0ZVRyYW5zZm9ybShDaGFpbi5oUmV2ZXJzZSk7Ci0gICAgaWYgKGhMYWIpIGNtc0Nsb3NlUHJvZmlsZShoTGFiKTsKLQotICAgIC8vIEFuZCByZXR1cm4gY29tcHV0ZWQgaHVsbAotICAgIHJldHVybiBHYW11dDsKLX0KLQotLy8gVG90YWwgQXJlYSBDb3ZlcmFnZSBlc3RpbWF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNtc1VJbnQzMk51bWJlciAgbk91dHB1dENoYW5zOwotICAgIGNtc0hUUkFOU0ZPUk0gICAgaFJvdW5kVHJpcDsKLSAgICBjbXNGbG9hdDMyTnVtYmVyIE1heFRBQzsKLSAgICBjbXNGbG9hdDMyTnVtYmVyIE1heElucHV0W2Ntc01BWENIQU5ORUxTXTsKLQotfSBjbXNUQUNlc3RpbWF0b3I7Ci0KLQotLy8gVGhpcyBjYWxsYmFjayBqdXN0IGFjY291bnRzIHRoZSBtYXhpbXVtIGluayBkcm9wcGVkIGluIHRoZSBnaXZlbiBub2RlLiBJdCBkb2VzIG5vdCBwb3B1bGF0ZSBhbnkKLS8vIG1lbW9yeSwgYXMgdGhlIGRlc3RpbmF0aW9uIHRhYmxlIGlzIE5VTEwuIEl0cyBvbmx5IHB1cnBvc2UgaXQgdG8ga25vdyB0aGUgZ2xvYmFsIG1heGltdW0uCi1zdGF0aWMKLWludCBFc3RpbWF0ZVRBQyhyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5bXSwgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIE91dFtdLCByZWdpc3RlciB2b2lkICogQ2FyZ28pCi17Ci0gICAgY21zVEFDZXN0aW1hdG9yKiBicCA9IChjbXNUQUNlc3RpbWF0b3IqKSBDYXJnbzsKLSAgICBjbXNGbG9hdDMyTnVtYmVyIFJvdW5kVHJpcFtjbXNNQVhDSEFOTkVMU107Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0gICAgY21zRmxvYXQzMk51bWJlciBTdW07Ci0KLQotICAgIC8vIEV2YWx1YXRlIHRoZSB4Zm9ybQotICAgIGNtc0RvVHJhbnNmb3JtKGJwLT5oUm91bmRUcmlwLCBJbiwgUm91bmRUcmlwLCAxKTsKLQotICAgIC8vIEFsbCBhbGwgYW1vdW50cyBvZiBpbmsKLSAgICBmb3IgKFN1bT0wLCBpPTA7IGkgPCBicCAtPm5PdXRwdXRDaGFuczsgaSsrKQotICAgICAgICAgICAgU3VtICs9IFJvdW5kVHJpcFtpXTsKLQotICAgIC8vIElmIGFib3ZlIG1heGltdW0sIGtlZXAgdHJhY2sgb2YgaW5wdXQgdmFsdWVzCi0gICAgaWYgKFN1bSA+IGJwIC0+TWF4VEFDKSB7Ci0KLSAgICAgICAgICAgIGJwIC0+TWF4VEFDID0gU3VtOwotCi0gICAgICAgICAgICBmb3IgKGk9MDsgaSA8IGJwIC0+bk91dHB1dENoYW5zOyBpKyspIHsKLSAgICAgICAgICAgICAgICBicCAtPk1heElucHV0W2ldID0gSW5baV07Ci0gICAgICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKE91dCk7Ci19Ci0KLQotLy8gRGV0ZWN0IFRvdGFsIGFyZWEgY292ZXJhZ2Ugb2YgdGhlIHByb2ZpbGUKLWNtc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIGNtc0RldGVjdFRBQyhjbXNIUFJPRklMRSBoUHJvZmlsZSkKLXsKLSAgICBjbXNUQUNlc3RpbWF0b3IgYnA7Ci0gICAgY21zVUludDMyTnVtYmVyIGR3Rm9ybWF0dGVyOwotICAgIGNtc1VJbnQzMk51bWJlciBHcmlkUG9pbnRzW01BWF9JTlBVVF9ESU1FTlNJT05TXTsKLSAgICBjbXNIUFJPRklMRSBoTGFiOwotICAgIGNtc0NvbnRleHQgQ29udGV4dElEID0gY21zR2V0UHJvZmlsZUNvbnRleHRJRChoUHJvZmlsZSk7Ci0KLSAgICAvLyBUQUMgb25seSB3b3JrcyBvbiBvdXRwdXQgcHJvZmlsZXMKLSAgICBpZiAoY21zR2V0RGV2aWNlQ2xhc3MoaFByb2ZpbGUpICE9IGNtc1NpZ091dHB1dENsYXNzKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vIENyZWF0ZSBhIGZha2UgZm9ybWF0dGVyIGZvciByZXN1bHQKLSAgICBkd0Zvcm1hdHRlciA9IGNtc0Zvcm1hdHRlckZvckNvbG9yc3BhY2VPZlByb2ZpbGUoaFByb2ZpbGUsIDQsIFRSVUUpOwotCi0gICAgYnAubk91dHB1dENoYW5zID0gVF9DSEFOTkVMUyhkd0Zvcm1hdHRlcik7Ci0gICAgYnAuTWF4VEFDID0gMDsgICAgLy8gSW5pdGlhbCBUQUMgaXMgMAotCi0gICAgLy8gIGZvciBzYWZldHkKLSAgICBpZiAoYnAubk91dHB1dENoYW5zID49IGNtc01BWENIQU5ORUxTKSByZXR1cm4gMDsKLQotICAgIGhMYWIgPSBjbXNDcmVhdGVMYWI0UHJvZmlsZVRIUihDb250ZXh0SUQsIE5VTEwpOwotICAgIGlmIChoTGFiID09IE5VTEwpIHJldHVybiAwOwotICAgIC8vIFNldHVwIGEgcm91bmR0cmlwIG9uIHBlcmNlcHR1YWwgaW50ZW50IGluIG91dHB1dCBwcm9maWxlIGZvciBUQUMgZXN0aW1hdGlvbgotICAgIGJwLmhSb3VuZFRyaXAgPSBjbXNDcmVhdGVUcmFuc2Zvcm1USFIoQ29udGV4dElELCBoTGFiLCBUWVBFX0xhYl8xNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQcm9maWxlLCBkd0Zvcm1hdHRlciwgSU5URU5UX1BFUkNFUFRVQUwsIGNtc0ZMQUdTX05PT1BUSU1JWkV8Y21zRkxBR1NfTk9DQUNIRSk7Ci0KLSAgICBjbXNDbG9zZVByb2ZpbGUoaExhYik7Ci0gICAgaWYgKGJwLmhSb3VuZFRyaXAgPT0gTlVMTCkgcmV0dXJuIDA7Ci0KLSAgICAvLyBGb3IgTCogd2Ugb25seSBuZWVkIGJsYWNrIGFuZCB3aGl0ZS4gRm9yIEMqIHdlIG5lZWQgbWFueSBwb2ludHMKLSAgICBHcmlkUG9pbnRzWzBdID0gNjsKLSAgICBHcmlkUG9pbnRzWzFdID0gNzQ7Ci0gICAgR3JpZFBvaW50c1syXSA9IDc0OwotCi0KLSAgICBpZiAoIWNtc1NsaWNlU3BhY2UxNigzLCBHcmlkUG9pbnRzLCBFc3RpbWF0ZVRBQywgJmJwKSkgewotICAgICAgICBicC5NYXhUQUMgPSAwOwotICAgIH0KLQotICAgIGNtc0RlbGV0ZVRyYW5zZm9ybShicC5oUm91bmRUcmlwKTsKLQotICAgIC8vIFJlc3VsdHMgaW4gJQotICAgIHJldHVybiBicC5NYXhUQUM7Ci19Ci0KLQotLy8gQ2FyZWZ1bGx5LCAgY2xhbXAgb24gQ0lFTGFiIHNwYWNlLgotCi1jbXNCb29sIENNU0VYUE9SVCBjbXNEZXNhdHVyYXRlTGFiKGNtc0NJRUxhYiogTGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYW1heCwgZG91YmxlIGFtaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBibWF4LCBkb3VibGUgYm1pbikKLXsKLQotICAgIC8vIFdob2xlIEx1bWEgc3VyZmFjZSB0byB6ZXJvCi0KLSAgICBpZiAoTGFiIC0+IEwgPCAwKSB7Ci0KLSAgICAgICAgTGFiLT4gTCA9IExhYi0+YSA9IExhYi0+IGIgPSAwLjA7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICAvLyBDbGFtcCB3aGl0ZSwgRElTQ0FSRCBISUdITElHSFRTLiBUaGlzIGlzIGRvbmUKLSAgICAvLyBpbiBzdWNoIHdheSBiZWNhdXNlIGljYyBzcGVjIGRvZXNuJ3QgYWxsb3cgdGhlCi0gICAgLy8gdXNlIG9mIEw+MTAwIGFzIGEgaGlnaGxpZ2h0IG1lYW5zLgotCi0gICAgaWYgKExhYi0+TCA+IDEwMCkKLSAgICAgICAgTGFiIC0+IEwgPSAxMDA7Ci0KLSAgICAvLyBDaGVjayBvdXQgZ2FtdXQgcHJpc20sIG9uIGEsIGIgZmFjZXMKLQotICAgIGlmIChMYWIgLT4gYSA8IGFtaW4gfHwgTGFiLT5hID4gYW1heHx8Ci0gICAgICAgIExhYiAtPiBiIDwgYm1pbiB8fCBMYWItPmIgPiBibWF4KSB7Ci0KLSAgICAgICAgICAgIGNtc0NJRUxDaCBMQ2g7Ci0gICAgICAgICAgICBkb3VibGUgaCwgc2xvcGU7Ci0KLSAgICAgICAgICAgIC8vIEZhbGxzIG91dHNpZGUgYSwgYiBsaW1pdHMuIFRyYW5zcG9ydHMgdG8gTENoIHNwYWNlLAotICAgICAgICAgICAgLy8gYW5kIHRoZW4gZG8gdGhlIGNsaXBwaW5nCi0KLQotICAgICAgICAgICAgaWYgKExhYiAtPiBhID09IDAuMCkgeyAvLyBJcyBodWUgZXhhY3RseSA5MD8KLQotICAgICAgICAgICAgICAgIC8vIGF0YW4gd2lsbCBub3Qgd29yaywgc28gY2xhbXAgaGVyZQotICAgICAgICAgICAgICAgIExhYiAtPiBiID0gTGFiLT5iIDwgMCA/IGJtaW4gOiBibWF4OwotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjbXNMYWIyTENoKCZMQ2gsIExhYik7Ci0KLSAgICAgICAgICAgIHNsb3BlID0gTGFiIC0+IGIgLyBMYWIgLT4gYTsKLSAgICAgICAgICAgIGggPSBMQ2guaDsKLQotICAgICAgICAgICAgLy8gVGhlcmUgYXJlIDQgem9uZXMKLQotICAgICAgICAgICAgaWYgKChoID49IDAuICYmIGggPCA0NS4pIHx8Ci0gICAgICAgICAgICAgICAgKGggPj0gMzE1ICYmIGggPD0gMzYwLikpIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBjbGlwIGJ5IGFtYXgKLSAgICAgICAgICAgICAgICAgICAgTGFiIC0+IGEgPSBhbWF4OwotICAgICAgICAgICAgICAgICAgICBMYWIgLT4gYiA9IGFtYXggKiBzbG9wZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBpZiAoaCA+PSA0NS4gJiYgaCA8IDEzNS4pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBjbGlwIGJ5IGJtYXgKLSAgICAgICAgICAgICAgICAgICAgTGFiIC0+IGIgPSBibWF4OwotICAgICAgICAgICAgICAgICAgICBMYWIgLT4gYSA9IGJtYXggLyBzbG9wZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBpZiAoaCA+PSAxMzUuICYmIGggPCAyMjUuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGlwIGJ5IGFtaW4KLSAgICAgICAgICAgICAgICAgICAgICAgIExhYiAtPiBhID0gYW1pbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIExhYiAtPiBiID0gYW1pbiAqIHNsb3BlOwotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGggPj0gMjI1LiAmJiBoIDwgMzE1LikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsaXAgYnkgYm1pbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhYiAtPiBiID0gYm1pbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYWIgLT4gYSA9IGJtaW4gLyBzbG9wZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcigwLCBjbXNFUlJPUl9SQU5HRSwgIkludmFsaWQgYW5nbGUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zaGFsZi5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNoYWxmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMzhiNTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNoYWxmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTIgTWFydGkgTWFyaWEgU2FndWVyCi0vLwotLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0vLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0vLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0vLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLS8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQotLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLS8vCi0vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0vLwotLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0vLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KLS8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi0vLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCi0vLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0vLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLS8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpbmNsdWRlICJsY21zMl9pbnRlcm5hbC5oIgotCi0jaWZuZGVmIENNU19OT19IQUxGX1NVUFBPUlQgCi0KLS8vIFRoaXMgY29kZSBpcyBpbnNwaXJlZCBpbiB0aGUgcGFwZXIgIkZhc3QgSGFsZiBGbG9hdCBDb252ZXJzaW9ucyIKLS8vIGJ5IEplcm9lbiB2YW4gZGVyIFppanAKLQotc3RhdGljIGNtc1VJbnQzMk51bWJlciBNYW50aXNzYVsyMDQ4XSA9IHsKLQotMHgwMDAwMDAwMCwgMHgzMzgwMDAwMCwgMHgzNDAwMDAwMCwgMHgzNDQwMDAwMCwgMHgzNDgwMDAwMCwgMHgzNGEwMDAwMCwKLTB4MzRjMDAwMDAsIDB4MzRlMDAwMDAsIDB4MzUwMDAwMDAsIDB4MzUxMDAwMDAsIDB4MzUyMDAwMDAsIDB4MzUzMDAwMDAsCi0weDM1NDAwMDAwLCAweDM1NTAwMDAwLCAweDM1NjAwMDAwLCAweDM1NzAwMDAwLCAweDM1ODAwMDAwLCAweDM1ODgwMDAwLAotMHgzNTkwMDAwMCwgMHgzNTk4MDAwMCwgMHgzNWEwMDAwMCwgMHgzNWE4MDAwMCwgMHgzNWIwMDAwMCwgMHgzNWI4MDAwMCwKLTB4MzVjMDAwMDAsIDB4MzVjODAwMDAsIDB4MzVkMDAwMDAsIDB4MzVkODAwMDAsIDB4MzVlMDAwMDAsIDB4MzVlODAwMDAsCi0weDM1ZjAwMDAwLCAweDM1ZjgwMDAwLCAweDM2MDAwMDAwLCAweDM2MDQwMDAwLCAweDM2MDgwMDAwLCAweDM2MGMwMDAwLAotMHgzNjEwMDAwMCwgMHgzNjE0MDAwMCwgMHgzNjE4MDAwMCwgMHgzNjFjMDAwMCwgMHgzNjIwMDAwMCwgMHgzNjI0MDAwMCwKLTB4MzYyODAwMDAsIDB4MzYyYzAwMDAsIDB4MzYzMDAwMDAsIDB4MzYzNDAwMDAsIDB4MzYzODAwMDAsIDB4MzYzYzAwMDAsCi0weDM2NDAwMDAwLCAweDM2NDQwMDAwLCAweDM2NDgwMDAwLCAweDM2NGMwMDAwLCAweDM2NTAwMDAwLCAweDM2NTQwMDAwLAotMHgzNjU4MDAwMCwgMHgzNjVjMDAwMCwgMHgzNjYwMDAwMCwgMHgzNjY0MDAwMCwgMHgzNjY4MDAwMCwgMHgzNjZjMDAwMCwKLTB4MzY3MDAwMDAsIDB4MzY3NDAwMDAsIDB4MzY3ODAwMDAsIDB4MzY3YzAwMDAsIDB4MzY4MDAwMDAsIDB4MzY4MjAwMDAsCi0weDM2ODQwMDAwLCAweDM2ODYwMDAwLCAweDM2ODgwMDAwLCAweDM2OGEwMDAwLCAweDM2OGMwMDAwLCAweDM2OGUwMDAwLAotMHgzNjkwMDAwMCwgMHgzNjkyMDAwMCwgMHgzNjk0MDAwMCwgMHgzNjk2MDAwMCwgMHgzNjk4MDAwMCwgMHgzNjlhMDAwMCwKLTB4MzY5YzAwMDAsIDB4MzY5ZTAwMDAsIDB4MzZhMDAwMDAsIDB4MzZhMjAwMDAsIDB4MzZhNDAwMDAsIDB4MzZhNjAwMDAsCi0weDM2YTgwMDAwLCAweDM2YWEwMDAwLCAweDM2YWMwMDAwLCAweDM2YWUwMDAwLCAweDM2YjAwMDAwLCAweDM2YjIwMDAwLAotMHgzNmI0MDAwMCwgMHgzNmI2MDAwMCwgMHgzNmI4MDAwMCwgMHgzNmJhMDAwMCwgMHgzNmJjMDAwMCwgMHgzNmJlMDAwMCwKLTB4MzZjMDAwMDAsIDB4MzZjMjAwMDAsIDB4MzZjNDAwMDAsIDB4MzZjNjAwMDAsIDB4MzZjODAwMDAsIDB4MzZjYTAwMDAsCi0weDM2Y2MwMDAwLCAweDM2Y2UwMDAwLCAweDM2ZDAwMDAwLCAweDM2ZDIwMDAwLCAweDM2ZDQwMDAwLCAweDM2ZDYwMDAwLAotMHgzNmQ4MDAwMCwgMHgzNmRhMDAwMCwgMHgzNmRjMDAwMCwgMHgzNmRlMDAwMCwgMHgzNmUwMDAwMCwgMHgzNmUyMDAwMCwKLTB4MzZlNDAwMDAsIDB4MzZlNjAwMDAsIDB4MzZlODAwMDAsIDB4MzZlYTAwMDAsIDB4MzZlYzAwMDAsIDB4MzZlZTAwMDAsCi0weDM2ZjAwMDAwLCAweDM2ZjIwMDAwLCAweDM2ZjQwMDAwLCAweDM2ZjYwMDAwLCAweDM2ZjgwMDAwLCAweDM2ZmEwMDAwLAotMHgzNmZjMDAwMCwgMHgzNmZlMDAwMCwgMHgzNzAwMDAwMCwgMHgzNzAxMDAwMCwgMHgzNzAyMDAwMCwgMHgzNzAzMDAwMCwKLTB4MzcwNDAwMDAsIDB4MzcwNTAwMDAsIDB4MzcwNjAwMDAsIDB4MzcwNzAwMDAsIDB4MzcwODAwMDAsIDB4MzcwOTAwMDAsCi0weDM3MGEwMDAwLCAweDM3MGIwMDAwLCAweDM3MGMwMDAwLCAweDM3MGQwMDAwLCAweDM3MGUwMDAwLCAweDM3MGYwMDAwLAotMHgzNzEwMDAwMCwgMHgzNzExMDAwMCwgMHgzNzEyMDAwMCwgMHgzNzEzMDAwMCwgMHgzNzE0MDAwMCwgMHgzNzE1MDAwMCwKLTB4MzcxNjAwMDAsIDB4MzcxNzAwMDAsIDB4MzcxODAwMDAsIDB4MzcxOTAwMDAsIDB4MzcxYTAwMDAsIDB4MzcxYjAwMDAsCi0weDM3MWMwMDAwLCAweDM3MWQwMDAwLCAweDM3MWUwMDAwLCAweDM3MWYwMDAwLCAweDM3MjAwMDAwLCAweDM3MjEwMDAwLAotMHgzNzIyMDAwMCwgMHgzNzIzMDAwMCwgMHgzNzI0MDAwMCwgMHgzNzI1MDAwMCwgMHgzNzI2MDAwMCwgMHgzNzI3MDAwMCwKLTB4MzcyODAwMDAsIDB4MzcyOTAwMDAsIDB4MzcyYTAwMDAsIDB4MzcyYjAwMDAsIDB4MzcyYzAwMDAsIDB4MzcyZDAwMDAsCi0weDM3MmUwMDAwLCAweDM3MmYwMDAwLCAweDM3MzAwMDAwLCAweDM3MzEwMDAwLCAweDM3MzIwMDAwLCAweDM3MzMwMDAwLAotMHgzNzM0MDAwMCwgMHgzNzM1MDAwMCwgMHgzNzM2MDAwMCwgMHgzNzM3MDAwMCwgMHgzNzM4MDAwMCwgMHgzNzM5MDAwMCwKLTB4MzczYTAwMDAsIDB4MzczYjAwMDAsIDB4MzczYzAwMDAsIDB4MzczZDAwMDAsIDB4MzczZTAwMDAsIDB4MzczZjAwMDAsCi0weDM3NDAwMDAwLCAweDM3NDEwMDAwLCAweDM3NDIwMDAwLCAweDM3NDMwMDAwLCAweDM3NDQwMDAwLCAweDM3NDUwMDAwLAotMHgzNzQ2MDAwMCwgMHgzNzQ3MDAwMCwgMHgzNzQ4MDAwMCwgMHgzNzQ5MDAwMCwgMHgzNzRhMDAwMCwgMHgzNzRiMDAwMCwKLTB4Mzc0YzAwMDAsIDB4Mzc0ZDAwMDAsIDB4Mzc0ZTAwMDAsIDB4Mzc0ZjAwMDAsIDB4Mzc1MDAwMDAsIDB4Mzc1MTAwMDAsCi0weDM3NTIwMDAwLCAweDM3NTMwMDAwLCAweDM3NTQwMDAwLCAweDM3NTUwMDAwLCAweDM3NTYwMDAwLCAweDM3NTcwMDAwLAotMHgzNzU4MDAwMCwgMHgzNzU5MDAwMCwgMHgzNzVhMDAwMCwgMHgzNzViMDAwMCwgMHgzNzVjMDAwMCwgMHgzNzVkMDAwMCwKLTB4Mzc1ZTAwMDAsIDB4Mzc1ZjAwMDAsIDB4Mzc2MDAwMDAsIDB4Mzc2MTAwMDAsIDB4Mzc2MjAwMDAsIDB4Mzc2MzAwMDAsCi0weDM3NjQwMDAwLCAweDM3NjUwMDAwLCAweDM3NjYwMDAwLCAweDM3NjcwMDAwLCAweDM3NjgwMDAwLCAweDM3NjkwMDAwLAotMHgzNzZhMDAwMCwgMHgzNzZiMDAwMCwgMHgzNzZjMDAwMCwgMHgzNzZkMDAwMCwgMHgzNzZlMDAwMCwgMHgzNzZmMDAwMCwKLTB4Mzc3MDAwMDAsIDB4Mzc3MTAwMDAsIDB4Mzc3MjAwMDAsIDB4Mzc3MzAwMDAsIDB4Mzc3NDAwMDAsIDB4Mzc3NTAwMDAsCi0weDM3NzYwMDAwLCAweDM3NzcwMDAwLCAweDM3NzgwMDAwLCAweDM3NzkwMDAwLCAweDM3N2EwMDAwLCAweDM3N2IwMDAwLAotMHgzNzdjMDAwMCwgMHgzNzdkMDAwMCwgMHgzNzdlMDAwMCwgMHgzNzdmMDAwMCwgMHgzNzgwMDAwMCwgMHgzNzgwODAwMCwKLTB4Mzc4MTAwMDAsIDB4Mzc4MTgwMDAsIDB4Mzc4MjAwMDAsIDB4Mzc4MjgwMDAsIDB4Mzc4MzAwMDAsIDB4Mzc4MzgwMDAsCi0weDM3ODQwMDAwLCAweDM3ODQ4MDAwLCAweDM3ODUwMDAwLCAweDM3ODU4MDAwLCAweDM3ODYwMDAwLCAweDM3ODY4MDAwLAotMHgzNzg3MDAwMCwgMHgzNzg3ODAwMCwgMHgzNzg4MDAwMCwgMHgzNzg4ODAwMCwgMHgzNzg5MDAwMCwgMHgzNzg5ODAwMCwKLTB4Mzc4YTAwMDAsIDB4Mzc4YTgwMDAsIDB4Mzc4YjAwMDAsIDB4Mzc4YjgwMDAsIDB4Mzc4YzAwMDAsIDB4Mzc4YzgwMDAsCi0weDM3OGQwMDAwLCAweDM3OGQ4MDAwLCAweDM3OGUwMDAwLCAweDM3OGU4MDAwLCAweDM3OGYwMDAwLCAweDM3OGY4MDAwLAotMHgzNzkwMDAwMCwgMHgzNzkwODAwMCwgMHgzNzkxMDAwMCwgMHgzNzkxODAwMCwgMHgzNzkyMDAwMCwgMHgzNzkyODAwMCwKLTB4Mzc5MzAwMDAsIDB4Mzc5MzgwMDAsIDB4Mzc5NDAwMDAsIDB4Mzc5NDgwMDAsIDB4Mzc5NTAwMDAsIDB4Mzc5NTgwMDAsCi0weDM3OTYwMDAwLCAweDM3OTY4MDAwLCAweDM3OTcwMDAwLCAweDM3OTc4MDAwLCAweDM3OTgwMDAwLCAweDM3OTg4MDAwLAotMHgzNzk5MDAwMCwgMHgzNzk5ODAwMCwgMHgzNzlhMDAwMCwgMHgzNzlhODAwMCwgMHgzNzliMDAwMCwgMHgzNzliODAwMCwKLTB4Mzc5YzAwMDAsIDB4Mzc5YzgwMDAsIDB4Mzc5ZDAwMDAsIDB4Mzc5ZDgwMDAsIDB4Mzc5ZTAwMDAsIDB4Mzc5ZTgwMDAsCi0weDM3OWYwMDAwLCAweDM3OWY4MDAwLCAweDM3YTAwMDAwLCAweDM3YTA4MDAwLCAweDM3YTEwMDAwLCAweDM3YTE4MDAwLAotMHgzN2EyMDAwMCwgMHgzN2EyODAwMCwgMHgzN2EzMDAwMCwgMHgzN2EzODAwMCwgMHgzN2E0MDAwMCwgMHgzN2E0ODAwMCwKLTB4MzdhNTAwMDAsIDB4MzdhNTgwMDAsIDB4MzdhNjAwMDAsIDB4MzdhNjgwMDAsIDB4MzdhNzAwMDAsIDB4MzdhNzgwMDAsCi0weDM3YTgwMDAwLCAweDM3YTg4MDAwLCAweDM3YTkwMDAwLCAweDM3YTk4MDAwLCAweDM3YWEwMDAwLCAweDM3YWE4MDAwLAotMHgzN2FiMDAwMCwgMHgzN2FiODAwMCwgMHgzN2FjMDAwMCwgMHgzN2FjODAwMCwgMHgzN2FkMDAwMCwgMHgzN2FkODAwMCwKLTB4MzdhZTAwMDAsIDB4MzdhZTgwMDAsIDB4MzdhZjAwMDAsIDB4MzdhZjgwMDAsIDB4MzdiMDAwMDAsIDB4MzdiMDgwMDAsCi0weDM3YjEwMDAwLCAweDM3YjE4MDAwLCAweDM3YjIwMDAwLCAweDM3YjI4MDAwLCAweDM3YjMwMDAwLCAweDM3YjM4MDAwLAotMHgzN2I0MDAwMCwgMHgzN2I0ODAwMCwgMHgzN2I1MDAwMCwgMHgzN2I1ODAwMCwgMHgzN2I2MDAwMCwgMHgzN2I2ODAwMCwKLTB4MzdiNzAwMDAsIDB4MzdiNzgwMDAsIDB4MzdiODAwMDAsIDB4MzdiODgwMDAsIDB4MzdiOTAwMDAsIDB4MzdiOTgwMDAsCi0weDM3YmEwMDAwLCAweDM3YmE4MDAwLCAweDM3YmIwMDAwLCAweDM3YmI4MDAwLCAweDM3YmMwMDAwLCAweDM3YmM4MDAwLAotMHgzN2JkMDAwMCwgMHgzN2JkODAwMCwgMHgzN2JlMDAwMCwgMHgzN2JlODAwMCwgMHgzN2JmMDAwMCwgMHgzN2JmODAwMCwKLTB4MzdjMDAwMDAsIDB4MzdjMDgwMDAsIDB4MzdjMTAwMDAsIDB4MzdjMTgwMDAsIDB4MzdjMjAwMDAsIDB4MzdjMjgwMDAsCi0weDM3YzMwMDAwLCAweDM3YzM4MDAwLCAweDM3YzQwMDAwLCAweDM3YzQ4MDAwLCAweDM3YzUwMDAwLCAweDM3YzU4MDAwLAotMHgzN2M2MDAwMCwgMHgzN2M2ODAwMCwgMHgzN2M3MDAwMCwgMHgzN2M3ODAwMCwgMHgzN2M4MDAwMCwgMHgzN2M4ODAwMCwKLTB4MzdjOTAwMDAsIDB4MzdjOTgwMDAsIDB4MzdjYTAwMDAsIDB4MzdjYTgwMDAsIDB4MzdjYjAwMDAsIDB4MzdjYjgwMDAsCi0weDM3Y2MwMDAwLCAweDM3Y2M4MDAwLCAweDM3Y2QwMDAwLCAweDM3Y2Q4MDAwLCAweDM3Y2UwMDAwLCAweDM3Y2U4MDAwLAotMHgzN2NmMDAwMCwgMHgzN2NmODAwMCwgMHgzN2QwMDAwMCwgMHgzN2QwODAwMCwgMHgzN2QxMDAwMCwgMHgzN2QxODAwMCwKLTB4MzdkMjAwMDAsIDB4MzdkMjgwMDAsIDB4MzdkMzAwMDAsIDB4MzdkMzgwMDAsIDB4MzdkNDAwMDAsIDB4MzdkNDgwMDAsCi0weDM3ZDUwMDAwLCAweDM3ZDU4MDAwLCAweDM3ZDYwMDAwLCAweDM3ZDY4MDAwLCAweDM3ZDcwMDAwLCAweDM3ZDc4MDAwLAotMHgzN2Q4MDAwMCwgMHgzN2Q4ODAwMCwgMHgzN2Q5MDAwMCwgMHgzN2Q5ODAwMCwgMHgzN2RhMDAwMCwgMHgzN2RhODAwMCwKLTB4MzdkYjAwMDAsIDB4MzdkYjgwMDAsIDB4MzdkYzAwMDAsIDB4MzdkYzgwMDAsIDB4MzdkZDAwMDAsIDB4MzdkZDgwMDAsCi0weDM3ZGUwMDAwLCAweDM3ZGU4MDAwLCAweDM3ZGYwMDAwLCAweDM3ZGY4MDAwLCAweDM3ZTAwMDAwLCAweDM3ZTA4MDAwLAotMHgzN2UxMDAwMCwgMHgzN2UxODAwMCwgMHgzN2UyMDAwMCwgMHgzN2UyODAwMCwgMHgzN2UzMDAwMCwgMHgzN2UzODAwMCwKLTB4MzdlNDAwMDAsIDB4MzdlNDgwMDAsIDB4MzdlNTAwMDAsIDB4MzdlNTgwMDAsIDB4MzdlNjAwMDAsIDB4MzdlNjgwMDAsCi0weDM3ZTcwMDAwLCAweDM3ZTc4MDAwLCAweDM3ZTgwMDAwLCAweDM3ZTg4MDAwLCAweDM3ZTkwMDAwLCAweDM3ZTk4MDAwLAotMHgzN2VhMDAwMCwgMHgzN2VhODAwMCwgMHgzN2ViMDAwMCwgMHgzN2ViODAwMCwgMHgzN2VjMDAwMCwgMHgzN2VjODAwMCwKLTB4MzdlZDAwMDAsIDB4MzdlZDgwMDAsIDB4MzdlZTAwMDAsIDB4MzdlZTgwMDAsIDB4MzdlZjAwMDAsIDB4MzdlZjgwMDAsCi0weDM3ZjAwMDAwLCAweDM3ZjA4MDAwLCAweDM3ZjEwMDAwLCAweDM3ZjE4MDAwLCAweDM3ZjIwMDAwLCAweDM3ZjI4MDAwLAotMHgzN2YzMDAwMCwgMHgzN2YzODAwMCwgMHgzN2Y0MDAwMCwgMHgzN2Y0ODAwMCwgMHgzN2Y1MDAwMCwgMHgzN2Y1ODAwMCwKLTB4MzdmNjAwMDAsIDB4MzdmNjgwMDAsIDB4MzdmNzAwMDAsIDB4MzdmNzgwMDAsIDB4MzdmODAwMDAsIDB4MzdmODgwMDAsCi0weDM3ZjkwMDAwLCAweDM3Zjk4MDAwLCAweDM3ZmEwMDAwLCAweDM3ZmE4MDAwLCAweDM3ZmIwMDAwLCAweDM3ZmI4MDAwLAotMHgzN2ZjMDAwMCwgMHgzN2ZjODAwMCwgMHgzN2ZkMDAwMCwgMHgzN2ZkODAwMCwgMHgzN2ZlMDAwMCwgMHgzN2ZlODAwMCwKLTB4MzdmZjAwMDAsIDB4MzdmZjgwMDAsIDB4MzgwMDAwMDAsIDB4MzgwMDQwMDAsIDB4MzgwMDgwMDAsIDB4MzgwMGMwMDAsCi0weDM4MDEwMDAwLCAweDM4MDE0MDAwLCAweDM4MDE4MDAwLCAweDM4MDFjMDAwLCAweDM4MDIwMDAwLCAweDM4MDI0MDAwLAotMHgzODAyODAwMCwgMHgzODAyYzAwMCwgMHgzODAzMDAwMCwgMHgzODAzNDAwMCwgMHgzODAzODAwMCwgMHgzODAzYzAwMCwKLTB4MzgwNDAwMDAsIDB4MzgwNDQwMDAsIDB4MzgwNDgwMDAsIDB4MzgwNGMwMDAsIDB4MzgwNTAwMDAsIDB4MzgwNTQwMDAsCi0weDM4MDU4MDAwLCAweDM4MDVjMDAwLCAweDM4MDYwMDAwLCAweDM4MDY0MDAwLCAweDM4MDY4MDAwLCAweDM4MDZjMDAwLAotMHgzODA3MDAwMCwgMHgzODA3NDAwMCwgMHgzODA3ODAwMCwgMHgzODA3YzAwMCwgMHgzODA4MDAwMCwgMHgzODA4NDAwMCwKLTB4MzgwODgwMDAsIDB4MzgwOGMwMDAsIDB4MzgwOTAwMDAsIDB4MzgwOTQwMDAsIDB4MzgwOTgwMDAsIDB4MzgwOWMwMDAsCi0weDM4MGEwMDAwLCAweDM4MGE0MDAwLCAweDM4MGE4MDAwLCAweDM4MGFjMDAwLCAweDM4MGIwMDAwLCAweDM4MGI0MDAwLAotMHgzODBiODAwMCwgMHgzODBiYzAwMCwgMHgzODBjMDAwMCwgMHgzODBjNDAwMCwgMHgzODBjODAwMCwgMHgzODBjYzAwMCwKLTB4MzgwZDAwMDAsIDB4MzgwZDQwMDAsIDB4MzgwZDgwMDAsIDB4MzgwZGMwMDAsIDB4MzgwZTAwMDAsIDB4MzgwZTQwMDAsCi0weDM4MGU4MDAwLCAweDM4MGVjMDAwLCAweDM4MGYwMDAwLCAweDM4MGY0MDAwLCAweDM4MGY4MDAwLCAweDM4MGZjMDAwLAotMHgzODEwMDAwMCwgMHgzODEwNDAwMCwgMHgzODEwODAwMCwgMHgzODEwYzAwMCwgMHgzODExMDAwMCwgMHgzODExNDAwMCwKLTB4MzgxMTgwMDAsIDB4MzgxMWMwMDAsIDB4MzgxMjAwMDAsIDB4MzgxMjQwMDAsIDB4MzgxMjgwMDAsIDB4MzgxMmMwMDAsCi0weDM4MTMwMDAwLCAweDM4MTM0MDAwLCAweDM4MTM4MDAwLCAweDM4MTNjMDAwLCAweDM4MTQwMDAwLCAweDM4MTQ0MDAwLAotMHgzODE0ODAwMCwgMHgzODE0YzAwMCwgMHgzODE1MDAwMCwgMHgzODE1NDAwMCwgMHgzODE1ODAwMCwgMHgzODE1YzAwMCwKLTB4MzgxNjAwMDAsIDB4MzgxNjQwMDAsIDB4MzgxNjgwMDAsIDB4MzgxNmMwMDAsIDB4MzgxNzAwMDAsIDB4MzgxNzQwMDAsCi0weDM4MTc4MDAwLCAweDM4MTdjMDAwLCAweDM4MTgwMDAwLCAweDM4MTg0MDAwLCAweDM4MTg4MDAwLCAweDM4MThjMDAwLAotMHgzODE5MDAwMCwgMHgzODE5NDAwMCwgMHgzODE5ODAwMCwgMHgzODE5YzAwMCwgMHgzODFhMDAwMCwgMHgzODFhNDAwMCwKLTB4MzgxYTgwMDAsIDB4MzgxYWMwMDAsIDB4MzgxYjAwMDAsIDB4MzgxYjQwMDAsIDB4MzgxYjgwMDAsIDB4MzgxYmMwMDAsCi0weDM4MWMwMDAwLCAweDM4MWM0MDAwLCAweDM4MWM4MDAwLCAweDM4MWNjMDAwLCAweDM4MWQwMDAwLCAweDM4MWQ0MDAwLAotMHgzODFkODAwMCwgMHgzODFkYzAwMCwgMHgzODFlMDAwMCwgMHgzODFlNDAwMCwgMHgzODFlODAwMCwgMHgzODFlYzAwMCwKLTB4MzgxZjAwMDAsIDB4MzgxZjQwMDAsIDB4MzgxZjgwMDAsIDB4MzgxZmMwMDAsIDB4MzgyMDAwMDAsIDB4MzgyMDQwMDAsCi0weDM4MjA4MDAwLCAweDM4MjBjMDAwLCAweDM4MjEwMDAwLCAweDM4MjE0MDAwLCAweDM4MjE4MDAwLCAweDM4MjFjMDAwLAotMHgzODIyMDAwMCwgMHgzODIyNDAwMCwgMHgzODIyODAwMCwgMHgzODIyYzAwMCwgMHgzODIzMDAwMCwgMHgzODIzNDAwMCwKLTB4MzgyMzgwMDAsIDB4MzgyM2MwMDAsIDB4MzgyNDAwMDAsIDB4MzgyNDQwMDAsIDB4MzgyNDgwMDAsIDB4MzgyNGMwMDAsCi0weDM4MjUwMDAwLCAweDM4MjU0MDAwLCAweDM4MjU4MDAwLCAweDM4MjVjMDAwLCAweDM4MjYwMDAwLCAweDM4MjY0MDAwLAotMHgzODI2ODAwMCwgMHgzODI2YzAwMCwgMHgzODI3MDAwMCwgMHgzODI3NDAwMCwgMHgzODI3ODAwMCwgMHgzODI3YzAwMCwKLTB4MzgyODAwMDAsIDB4MzgyODQwMDAsIDB4MzgyODgwMDAsIDB4MzgyOGMwMDAsIDB4MzgyOTAwMDAsIDB4MzgyOTQwMDAsCi0weDM4Mjk4MDAwLCAweDM4MjljMDAwLCAweDM4MmEwMDAwLCAweDM4MmE0MDAwLCAweDM4MmE4MDAwLCAweDM4MmFjMDAwLAotMHgzODJiMDAwMCwgMHgzODJiNDAwMCwgMHgzODJiODAwMCwgMHgzODJiYzAwMCwgMHgzODJjMDAwMCwgMHgzODJjNDAwMCwKLTB4MzgyYzgwMDAsIDB4MzgyY2MwMDAsIDB4MzgyZDAwMDAsIDB4MzgyZDQwMDAsIDB4MzgyZDgwMDAsIDB4MzgyZGMwMDAsCi0weDM4MmUwMDAwLCAweDM4MmU0MDAwLCAweDM4MmU4MDAwLCAweDM4MmVjMDAwLCAweDM4MmYwMDAwLCAweDM4MmY0MDAwLAotMHgzODJmODAwMCwgMHgzODJmYzAwMCwgMHgzODMwMDAwMCwgMHgzODMwNDAwMCwgMHgzODMwODAwMCwgMHgzODMwYzAwMCwKLTB4MzgzMTAwMDAsIDB4MzgzMTQwMDAsIDB4MzgzMTgwMDAsIDB4MzgzMWMwMDAsIDB4MzgzMjAwMDAsIDB4MzgzMjQwMDAsCi0weDM4MzI4MDAwLCAweDM4MzJjMDAwLCAweDM4MzMwMDAwLCAweDM4MzM0MDAwLCAweDM4MzM4MDAwLCAweDM4MzNjMDAwLAotMHgzODM0MDAwMCwgMHgzODM0NDAwMCwgMHgzODM0ODAwMCwgMHgzODM0YzAwMCwgMHgzODM1MDAwMCwgMHgzODM1NDAwMCwKLTB4MzgzNTgwMDAsIDB4MzgzNWMwMDAsIDB4MzgzNjAwMDAsIDB4MzgzNjQwMDAsIDB4MzgzNjgwMDAsIDB4MzgzNmMwMDAsCi0weDM4MzcwMDAwLCAweDM4Mzc0MDAwLCAweDM4Mzc4MDAwLCAweDM4MzdjMDAwLCAweDM4MzgwMDAwLCAweDM4Mzg0MDAwLAotMHgzODM4ODAwMCwgMHgzODM4YzAwMCwgMHgzODM5MDAwMCwgMHgzODM5NDAwMCwgMHgzODM5ODAwMCwgMHgzODM5YzAwMCwKLTB4MzgzYTAwMDAsIDB4MzgzYTQwMDAsIDB4MzgzYTgwMDAsIDB4MzgzYWMwMDAsIDB4MzgzYjAwMDAsIDB4MzgzYjQwMDAsCi0weDM4M2I4MDAwLCAweDM4M2JjMDAwLCAweDM4M2MwMDAwLCAweDM4M2M0MDAwLCAweDM4M2M4MDAwLCAweDM4M2NjMDAwLAotMHgzODNkMDAwMCwgMHgzODNkNDAwMCwgMHgzODNkODAwMCwgMHgzODNkYzAwMCwgMHgzODNlMDAwMCwgMHgzODNlNDAwMCwKLTB4MzgzZTgwMDAsIDB4MzgzZWMwMDAsIDB4MzgzZjAwMDAsIDB4MzgzZjQwMDAsIDB4MzgzZjgwMDAsIDB4MzgzZmMwMDAsCi0weDM4NDAwMDAwLCAweDM4NDA0MDAwLCAweDM4NDA4MDAwLCAweDM4NDBjMDAwLCAweDM4NDEwMDAwLCAweDM4NDE0MDAwLAotMHgzODQxODAwMCwgMHgzODQxYzAwMCwgMHgzODQyMDAwMCwgMHgzODQyNDAwMCwgMHgzODQyODAwMCwgMHgzODQyYzAwMCwKLTB4Mzg0MzAwMDAsIDB4Mzg0MzQwMDAsIDB4Mzg0MzgwMDAsIDB4Mzg0M2MwMDAsIDB4Mzg0NDAwMDAsIDB4Mzg0NDQwMDAsCi0weDM4NDQ4MDAwLCAweDM4NDRjMDAwLCAweDM4NDUwMDAwLCAweDM4NDU0MDAwLCAweDM4NDU4MDAwLCAweDM4NDVjMDAwLAotMHgzODQ2MDAwMCwgMHgzODQ2NDAwMCwgMHgzODQ2ODAwMCwgMHgzODQ2YzAwMCwgMHgzODQ3MDAwMCwgMHgzODQ3NDAwMCwKLTB4Mzg0NzgwMDAsIDB4Mzg0N2MwMDAsIDB4Mzg0ODAwMDAsIDB4Mzg0ODQwMDAsIDB4Mzg0ODgwMDAsIDB4Mzg0OGMwMDAsCi0weDM4NDkwMDAwLCAweDM4NDk0MDAwLCAweDM4NDk4MDAwLCAweDM4NDljMDAwLCAweDM4NGEwMDAwLCAweDM4NGE0MDAwLAotMHgzODRhODAwMCwgMHgzODRhYzAwMCwgMHgzODRiMDAwMCwgMHgzODRiNDAwMCwgMHgzODRiODAwMCwgMHgzODRiYzAwMCwKLTB4Mzg0YzAwMDAsIDB4Mzg0YzQwMDAsIDB4Mzg0YzgwMDAsIDB4Mzg0Y2MwMDAsIDB4Mzg0ZDAwMDAsIDB4Mzg0ZDQwMDAsCi0weDM4NGQ4MDAwLCAweDM4NGRjMDAwLCAweDM4NGUwMDAwLCAweDM4NGU0MDAwLCAweDM4NGU4MDAwLCAweDM4NGVjMDAwLAotMHgzODRmMDAwMCwgMHgzODRmNDAwMCwgMHgzODRmODAwMCwgMHgzODRmYzAwMCwgMHgzODUwMDAwMCwgMHgzODUwNDAwMCwKLTB4Mzg1MDgwMDAsIDB4Mzg1MGMwMDAsIDB4Mzg1MTAwMDAsIDB4Mzg1MTQwMDAsIDB4Mzg1MTgwMDAsIDB4Mzg1MWMwMDAsCi0weDM4NTIwMDAwLCAweDM4NTI0MDAwLCAweDM4NTI4MDAwLCAweDM4NTJjMDAwLCAweDM4NTMwMDAwLCAweDM4NTM0MDAwLAotMHgzODUzODAwMCwgMHgzODUzYzAwMCwgMHgzODU0MDAwMCwgMHgzODU0NDAwMCwgMHgzODU0ODAwMCwgMHgzODU0YzAwMCwKLTB4Mzg1NTAwMDAsIDB4Mzg1NTQwMDAsIDB4Mzg1NTgwMDAsIDB4Mzg1NWMwMDAsIDB4Mzg1NjAwMDAsIDB4Mzg1NjQwMDAsCi0weDM4NTY4MDAwLCAweDM4NTZjMDAwLCAweDM4NTcwMDAwLCAweDM4NTc0MDAwLCAweDM4NTc4MDAwLCAweDM4NTdjMDAwLAotMHgzODU4MDAwMCwgMHgzODU4NDAwMCwgMHgzODU4ODAwMCwgMHgzODU4YzAwMCwgMHgzODU5MDAwMCwgMHgzODU5NDAwMCwKLTB4Mzg1OTgwMDAsIDB4Mzg1OWMwMDAsIDB4Mzg1YTAwMDAsIDB4Mzg1YTQwMDAsIDB4Mzg1YTgwMDAsIDB4Mzg1YWMwMDAsCi0weDM4NWIwMDAwLCAweDM4NWI0MDAwLCAweDM4NWI4MDAwLCAweDM4NWJjMDAwLCAweDM4NWMwMDAwLCAweDM4NWM0MDAwLAotMHgzODVjODAwMCwgMHgzODVjYzAwMCwgMHgzODVkMDAwMCwgMHgzODVkNDAwMCwgMHgzODVkODAwMCwgMHgzODVkYzAwMCwKLTB4Mzg1ZTAwMDAsIDB4Mzg1ZTQwMDAsIDB4Mzg1ZTgwMDAsIDB4Mzg1ZWMwMDAsIDB4Mzg1ZjAwMDAsIDB4Mzg1ZjQwMDAsCi0weDM4NWY4MDAwLCAweDM4NWZjMDAwLCAweDM4NjAwMDAwLCAweDM4NjA0MDAwLCAweDM4NjA4MDAwLCAweDM4NjBjMDAwLAotMHgzODYxMDAwMCwgMHgzODYxNDAwMCwgMHgzODYxODAwMCwgMHgzODYxYzAwMCwgMHgzODYyMDAwMCwgMHgzODYyNDAwMCwKLTB4Mzg2MjgwMDAsIDB4Mzg2MmMwMDAsIDB4Mzg2MzAwMDAsIDB4Mzg2MzQwMDAsIDB4Mzg2MzgwMDAsIDB4Mzg2M2MwMDAsCi0weDM4NjQwMDAwLCAweDM4NjQ0MDAwLCAweDM4NjQ4MDAwLCAweDM4NjRjMDAwLCAweDM4NjUwMDAwLCAweDM4NjU0MDAwLAotMHgzODY1ODAwMCwgMHgzODY1YzAwMCwgMHgzODY2MDAwMCwgMHgzODY2NDAwMCwgMHgzODY2ODAwMCwgMHgzODY2YzAwMCwKLTB4Mzg2NzAwMDAsIDB4Mzg2NzQwMDAsIDB4Mzg2NzgwMDAsIDB4Mzg2N2MwMDAsIDB4Mzg2ODAwMDAsIDB4Mzg2ODQwMDAsCi0weDM4Njg4MDAwLCAweDM4NjhjMDAwLCAweDM4NjkwMDAwLCAweDM4Njk0MDAwLCAweDM4Njk4MDAwLCAweDM4NjljMDAwLAotMHgzODZhMDAwMCwgMHgzODZhNDAwMCwgMHgzODZhODAwMCwgMHgzODZhYzAwMCwgMHgzODZiMDAwMCwgMHgzODZiNDAwMCwKLTB4Mzg2YjgwMDAsIDB4Mzg2YmMwMDAsIDB4Mzg2YzAwMDAsIDB4Mzg2YzQwMDAsIDB4Mzg2YzgwMDAsIDB4Mzg2Y2MwMDAsCi0weDM4NmQwMDAwLCAweDM4NmQ0MDAwLCAweDM4NmQ4MDAwLCAweDM4NmRjMDAwLCAweDM4NmUwMDAwLCAweDM4NmU0MDAwLAotMHgzODZlODAwMCwgMHgzODZlYzAwMCwgMHgzODZmMDAwMCwgMHgzODZmNDAwMCwgMHgzODZmODAwMCwgMHgzODZmYzAwMCwKLTB4Mzg3MDAwMDAsIDB4Mzg3MDQwMDAsIDB4Mzg3MDgwMDAsIDB4Mzg3MGMwMDAsIDB4Mzg3MTAwMDAsIDB4Mzg3MTQwMDAsCi0weDM4NzE4MDAwLCAweDM4NzFjMDAwLCAweDM4NzIwMDAwLCAweDM4NzI0MDAwLCAweDM4NzI4MDAwLCAweDM4NzJjMDAwLAotMHgzODczMDAwMCwgMHgzODczNDAwMCwgMHgzODczODAwMCwgMHgzODczYzAwMCwgMHgzODc0MDAwMCwgMHgzODc0NDAwMCwKLTB4Mzg3NDgwMDAsIDB4Mzg3NGMwMDAsIDB4Mzg3NTAwMDAsIDB4Mzg3NTQwMDAsIDB4Mzg3NTgwMDAsIDB4Mzg3NWMwMDAsCi0weDM4NzYwMDAwLCAweDM4NzY0MDAwLCAweDM4NzY4MDAwLCAweDM4NzZjMDAwLCAweDM4NzcwMDAwLCAweDM4Nzc0MDAwLAotMHgzODc3ODAwMCwgMHgzODc3YzAwMCwgMHgzODc4MDAwMCwgMHgzODc4NDAwMCwgMHgzODc4ODAwMCwgMHgzODc4YzAwMCwKLTB4Mzg3OTAwMDAsIDB4Mzg3OTQwMDAsIDB4Mzg3OTgwMDAsIDB4Mzg3OWMwMDAsIDB4Mzg3YTAwMDAsIDB4Mzg3YTQwMDAsCi0weDM4N2E4MDAwLCAweDM4N2FjMDAwLCAweDM4N2IwMDAwLCAweDM4N2I0MDAwLCAweDM4N2I4MDAwLCAweDM4N2JjMDAwLAotMHgzODdjMDAwMCwgMHgzODdjNDAwMCwgMHgzODdjODAwMCwgMHgzODdjYzAwMCwgMHgzODdkMDAwMCwgMHgzODdkNDAwMCwKLTB4Mzg3ZDgwMDAsIDB4Mzg3ZGMwMDAsIDB4Mzg3ZTAwMDAsIDB4Mzg3ZTQwMDAsIDB4Mzg3ZTgwMDAsIDB4Mzg3ZWMwMDAsCi0weDM4N2YwMDAwLCAweDM4N2Y0MDAwLCAweDM4N2Y4MDAwLCAweDM4N2ZjMDAwLCAweDM4MDAwMDAwLCAweDM4MDAyMDAwLAotMHgzODAwNDAwMCwgMHgzODAwNjAwMCwgMHgzODAwODAwMCwgMHgzODAwYTAwMCwgMHgzODAwYzAwMCwgMHgzODAwZTAwMCwKLTB4MzgwMTAwMDAsIDB4MzgwMTIwMDAsIDB4MzgwMTQwMDAsIDB4MzgwMTYwMDAsIDB4MzgwMTgwMDAsIDB4MzgwMWEwMDAsCi0weDM4MDFjMDAwLCAweDM4MDFlMDAwLCAweDM4MDIwMDAwLCAweDM4MDIyMDAwLCAweDM4MDI0MDAwLCAweDM4MDI2MDAwLAotMHgzODAyODAwMCwgMHgzODAyYTAwMCwgMHgzODAyYzAwMCwgMHgzODAyZTAwMCwgMHgzODAzMDAwMCwgMHgzODAzMjAwMCwKLTB4MzgwMzQwMDAsIDB4MzgwMzYwMDAsIDB4MzgwMzgwMDAsIDB4MzgwM2EwMDAsIDB4MzgwM2MwMDAsIDB4MzgwM2UwMDAsCi0weDM4MDQwMDAwLCAweDM4MDQyMDAwLCAweDM4MDQ0MDAwLCAweDM4MDQ2MDAwLCAweDM4MDQ4MDAwLCAweDM4MDRhMDAwLAotMHgzODA0YzAwMCwgMHgzODA0ZTAwMCwgMHgzODA1MDAwMCwgMHgzODA1MjAwMCwgMHgzODA1NDAwMCwgMHgzODA1NjAwMCwKLTB4MzgwNTgwMDAsIDB4MzgwNWEwMDAsIDB4MzgwNWMwMDAsIDB4MzgwNWUwMDAsIDB4MzgwNjAwMDAsIDB4MzgwNjIwMDAsCi0weDM4MDY0MDAwLCAweDM4MDY2MDAwLCAweDM4MDY4MDAwLCAweDM4MDZhMDAwLCAweDM4MDZjMDAwLCAweDM4MDZlMDAwLAotMHgzODA3MDAwMCwgMHgzODA3MjAwMCwgMHgzODA3NDAwMCwgMHgzODA3NjAwMCwgMHgzODA3ODAwMCwgMHgzODA3YTAwMCwKLTB4MzgwN2MwMDAsIDB4MzgwN2UwMDAsIDB4MzgwODAwMDAsIDB4MzgwODIwMDAsIDB4MzgwODQwMDAsIDB4MzgwODYwMDAsCi0weDM4MDg4MDAwLCAweDM4MDhhMDAwLCAweDM4MDhjMDAwLCAweDM4MDhlMDAwLCAweDM4MDkwMDAwLCAweDM4MDkyMDAwLAotMHgzODA5NDAwMCwgMHgzODA5NjAwMCwgMHgzODA5ODAwMCwgMHgzODA5YTAwMCwgMHgzODA5YzAwMCwgMHgzODA5ZTAwMCwKLTB4MzgwYTAwMDAsIDB4MzgwYTIwMDAsIDB4MzgwYTQwMDAsIDB4MzgwYTYwMDAsIDB4MzgwYTgwMDAsIDB4MzgwYWEwMDAsCi0weDM4MGFjMDAwLCAweDM4MGFlMDAwLCAweDM4MGIwMDAwLCAweDM4MGIyMDAwLCAweDM4MGI0MDAwLCAweDM4MGI2MDAwLAotMHgzODBiODAwMCwgMHgzODBiYTAwMCwgMHgzODBiYzAwMCwgMHgzODBiZTAwMCwgMHgzODBjMDAwMCwgMHgzODBjMjAwMCwKLTB4MzgwYzQwMDAsIDB4MzgwYzYwMDAsIDB4MzgwYzgwMDAsIDB4MzgwY2EwMDAsIDB4MzgwY2MwMDAsIDB4MzgwY2UwMDAsCi0weDM4MGQwMDAwLCAweDM4MGQyMDAwLCAweDM4MGQ0MDAwLCAweDM4MGQ2MDAwLCAweDM4MGQ4MDAwLCAweDM4MGRhMDAwLAotMHgzODBkYzAwMCwgMHgzODBkZTAwMCwgMHgzODBlMDAwMCwgMHgzODBlMjAwMCwgMHgzODBlNDAwMCwgMHgzODBlNjAwMCwKLTB4MzgwZTgwMDAsIDB4MzgwZWEwMDAsIDB4MzgwZWMwMDAsIDB4MzgwZWUwMDAsIDB4MzgwZjAwMDAsIDB4MzgwZjIwMDAsCi0weDM4MGY0MDAwLCAweDM4MGY2MDAwLCAweDM4MGY4MDAwLCAweDM4MGZhMDAwLCAweDM4MGZjMDAwLCAweDM4MGZlMDAwLAotMHgzODEwMDAwMCwgMHgzODEwMjAwMCwgMHgzODEwNDAwMCwgMHgzODEwNjAwMCwgMHgzODEwODAwMCwgMHgzODEwYTAwMCwKLTB4MzgxMGMwMDAsIDB4MzgxMGUwMDAsIDB4MzgxMTAwMDAsIDB4MzgxMTIwMDAsIDB4MzgxMTQwMDAsIDB4MzgxMTYwMDAsCi0weDM4MTE4MDAwLCAweDM4MTFhMDAwLCAweDM4MTFjMDAwLCAweDM4MTFlMDAwLCAweDM4MTIwMDAwLCAweDM4MTIyMDAwLAotMHgzODEyNDAwMCwgMHgzODEyNjAwMCwgMHgzODEyODAwMCwgMHgzODEyYTAwMCwgMHgzODEyYzAwMCwgMHgzODEyZTAwMCwKLTB4MzgxMzAwMDAsIDB4MzgxMzIwMDAsIDB4MzgxMzQwMDAsIDB4MzgxMzYwMDAsIDB4MzgxMzgwMDAsIDB4MzgxM2EwMDAsCi0weDM4MTNjMDAwLCAweDM4MTNlMDAwLCAweDM4MTQwMDAwLCAweDM4MTQyMDAwLCAweDM4MTQ0MDAwLCAweDM4MTQ2MDAwLAotMHgzODE0ODAwMCwgMHgzODE0YTAwMCwgMHgzODE0YzAwMCwgMHgzODE0ZTAwMCwgMHgzODE1MDAwMCwgMHgzODE1MjAwMCwKLTB4MzgxNTQwMDAsIDB4MzgxNTYwMDAsIDB4MzgxNTgwMDAsIDB4MzgxNWEwMDAsIDB4MzgxNWMwMDAsIDB4MzgxNWUwMDAsCi0weDM4MTYwMDAwLCAweDM4MTYyMDAwLCAweDM4MTY0MDAwLCAweDM4MTY2MDAwLCAweDM4MTY4MDAwLCAweDM4MTZhMDAwLAotMHgzODE2YzAwMCwgMHgzODE2ZTAwMCwgMHgzODE3MDAwMCwgMHgzODE3MjAwMCwgMHgzODE3NDAwMCwgMHgzODE3NjAwMCwKLTB4MzgxNzgwMDAsIDB4MzgxN2EwMDAsIDB4MzgxN2MwMDAsIDB4MzgxN2UwMDAsIDB4MzgxODAwMDAsIDB4MzgxODIwMDAsCi0weDM4MTg0MDAwLCAweDM4MTg2MDAwLCAweDM4MTg4MDAwLCAweDM4MThhMDAwLCAweDM4MThjMDAwLCAweDM4MThlMDAwLAotMHgzODE5MDAwMCwgMHgzODE5MjAwMCwgMHgzODE5NDAwMCwgMHgzODE5NjAwMCwgMHgzODE5ODAwMCwgMHgzODE5YTAwMCwKLTB4MzgxOWMwMDAsIDB4MzgxOWUwMDAsIDB4MzgxYTAwMDAsIDB4MzgxYTIwMDAsIDB4MzgxYTQwMDAsIDB4MzgxYTYwMDAsCi0weDM4MWE4MDAwLCAweDM4MWFhMDAwLCAweDM4MWFjMDAwLCAweDM4MWFlMDAwLCAweDM4MWIwMDAwLCAweDM4MWIyMDAwLAotMHgzODFiNDAwMCwgMHgzODFiNjAwMCwgMHgzODFiODAwMCwgMHgzODFiYTAwMCwgMHgzODFiYzAwMCwgMHgzODFiZTAwMCwKLTB4MzgxYzAwMDAsIDB4MzgxYzIwMDAsIDB4MzgxYzQwMDAsIDB4MzgxYzYwMDAsIDB4MzgxYzgwMDAsIDB4MzgxY2EwMDAsCi0weDM4MWNjMDAwLCAweDM4MWNlMDAwLCAweDM4MWQwMDAwLCAweDM4MWQyMDAwLCAweDM4MWQ0MDAwLCAweDM4MWQ2MDAwLAotMHgzODFkODAwMCwgMHgzODFkYTAwMCwgMHgzODFkYzAwMCwgMHgzODFkZTAwMCwgMHgzODFlMDAwMCwgMHgzODFlMjAwMCwKLTB4MzgxZTQwMDAsIDB4MzgxZTYwMDAsIDB4MzgxZTgwMDAsIDB4MzgxZWEwMDAsIDB4MzgxZWMwMDAsIDB4MzgxZWUwMDAsCi0weDM4MWYwMDAwLCAweDM4MWYyMDAwLCAweDM4MWY0MDAwLCAweDM4MWY2MDAwLCAweDM4MWY4MDAwLCAweDM4MWZhMDAwLAotMHgzODFmYzAwMCwgMHgzODFmZTAwMCwgMHgzODIwMDAwMCwgMHgzODIwMjAwMCwgMHgzODIwNDAwMCwgMHgzODIwNjAwMCwKLTB4MzgyMDgwMDAsIDB4MzgyMGEwMDAsIDB4MzgyMGMwMDAsIDB4MzgyMGUwMDAsIDB4MzgyMTAwMDAsIDB4MzgyMTIwMDAsCi0weDM4MjE0MDAwLCAweDM4MjE2MDAwLCAweDM4MjE4MDAwLCAweDM4MjFhMDAwLCAweDM4MjFjMDAwLCAweDM4MjFlMDAwLAotMHgzODIyMDAwMCwgMHgzODIyMjAwMCwgMHgzODIyNDAwMCwgMHgzODIyNjAwMCwgMHgzODIyODAwMCwgMHgzODIyYTAwMCwKLTB4MzgyMmMwMDAsIDB4MzgyMmUwMDAsIDB4MzgyMzAwMDAsIDB4MzgyMzIwMDAsIDB4MzgyMzQwMDAsIDB4MzgyMzYwMDAsCi0weDM4MjM4MDAwLCAweDM4MjNhMDAwLCAweDM4MjNjMDAwLCAweDM4MjNlMDAwLCAweDM4MjQwMDAwLCAweDM4MjQyMDAwLAotMHgzODI0NDAwMCwgMHgzODI0NjAwMCwgMHgzODI0ODAwMCwgMHgzODI0YTAwMCwgMHgzODI0YzAwMCwgMHgzODI0ZTAwMCwKLTB4MzgyNTAwMDAsIDB4MzgyNTIwMDAsIDB4MzgyNTQwMDAsIDB4MzgyNTYwMDAsIDB4MzgyNTgwMDAsIDB4MzgyNWEwMDAsCi0weDM4MjVjMDAwLCAweDM4MjVlMDAwLCAweDM4MjYwMDAwLCAweDM4MjYyMDAwLCAweDM4MjY0MDAwLCAweDM4MjY2MDAwLAotMHgzODI2ODAwMCwgMHgzODI2YTAwMCwgMHgzODI2YzAwMCwgMHgzODI2ZTAwMCwgMHgzODI3MDAwMCwgMHgzODI3MjAwMCwKLTB4MzgyNzQwMDAsIDB4MzgyNzYwMDAsIDB4MzgyNzgwMDAsIDB4MzgyN2EwMDAsIDB4MzgyN2MwMDAsIDB4MzgyN2UwMDAsCi0weDM4MjgwMDAwLCAweDM4MjgyMDAwLCAweDM4Mjg0MDAwLCAweDM4Mjg2MDAwLCAweDM4Mjg4MDAwLCAweDM4MjhhMDAwLAotMHgzODI4YzAwMCwgMHgzODI4ZTAwMCwgMHgzODI5MDAwMCwgMHgzODI5MjAwMCwgMHgzODI5NDAwMCwgMHgzODI5NjAwMCwKLTB4MzgyOTgwMDAsIDB4MzgyOWEwMDAsIDB4MzgyOWMwMDAsIDB4MzgyOWUwMDAsIDB4MzgyYTAwMDAsIDB4MzgyYTIwMDAsCi0weDM4MmE0MDAwLCAweDM4MmE2MDAwLCAweDM4MmE4MDAwLCAweDM4MmFhMDAwLCAweDM4MmFjMDAwLCAweDM4MmFlMDAwLAotMHgzODJiMDAwMCwgMHgzODJiMjAwMCwgMHgzODJiNDAwMCwgMHgzODJiNjAwMCwgMHgzODJiODAwMCwgMHgzODJiYTAwMCwKLTB4MzgyYmMwMDAsIDB4MzgyYmUwMDAsIDB4MzgyYzAwMDAsIDB4MzgyYzIwMDAsIDB4MzgyYzQwMDAsIDB4MzgyYzYwMDAsCi0weDM4MmM4MDAwLCAweDM4MmNhMDAwLCAweDM4MmNjMDAwLCAweDM4MmNlMDAwLCAweDM4MmQwMDAwLCAweDM4MmQyMDAwLAotMHgzODJkNDAwMCwgMHgzODJkNjAwMCwgMHgzODJkODAwMCwgMHgzODJkYTAwMCwgMHgzODJkYzAwMCwgMHgzODJkZTAwMCwKLTB4MzgyZTAwMDAsIDB4MzgyZTIwMDAsIDB4MzgyZTQwMDAsIDB4MzgyZTYwMDAsIDB4MzgyZTgwMDAsIDB4MzgyZWEwMDAsCi0weDM4MmVjMDAwLCAweDM4MmVlMDAwLCAweDM4MmYwMDAwLCAweDM4MmYyMDAwLCAweDM4MmY0MDAwLCAweDM4MmY2MDAwLAotMHgzODJmODAwMCwgMHgzODJmYTAwMCwgMHgzODJmYzAwMCwgMHgzODJmZTAwMCwgMHgzODMwMDAwMCwgMHgzODMwMjAwMCwKLTB4MzgzMDQwMDAsIDB4MzgzMDYwMDAsIDB4MzgzMDgwMDAsIDB4MzgzMGEwMDAsIDB4MzgzMGMwMDAsIDB4MzgzMGUwMDAsCi0weDM4MzEwMDAwLCAweDM4MzEyMDAwLCAweDM4MzE0MDAwLCAweDM4MzE2MDAwLCAweDM4MzE4MDAwLCAweDM4MzFhMDAwLAotMHgzODMxYzAwMCwgMHgzODMxZTAwMCwgMHgzODMyMDAwMCwgMHgzODMyMjAwMCwgMHgzODMyNDAwMCwgMHgzODMyNjAwMCwKLTB4MzgzMjgwMDAsIDB4MzgzMmEwMDAsIDB4MzgzMmMwMDAsIDB4MzgzMmUwMDAsIDB4MzgzMzAwMDAsIDB4MzgzMzIwMDAsCi0weDM4MzM0MDAwLCAweDM4MzM2MDAwLCAweDM4MzM4MDAwLCAweDM4MzNhMDAwLCAweDM4MzNjMDAwLCAweDM4MzNlMDAwLAotMHgzODM0MDAwMCwgMHgzODM0MjAwMCwgMHgzODM0NDAwMCwgMHgzODM0NjAwMCwgMHgzODM0ODAwMCwgMHgzODM0YTAwMCwKLTB4MzgzNGMwMDAsIDB4MzgzNGUwMDAsIDB4MzgzNTAwMDAsIDB4MzgzNTIwMDAsIDB4MzgzNTQwMDAsIDB4MzgzNTYwMDAsCi0weDM4MzU4MDAwLCAweDM4MzVhMDAwLCAweDM4MzVjMDAwLCAweDM4MzVlMDAwLCAweDM4MzYwMDAwLCAweDM4MzYyMDAwLAotMHgzODM2NDAwMCwgMHgzODM2NjAwMCwgMHgzODM2ODAwMCwgMHgzODM2YTAwMCwgMHgzODM2YzAwMCwgMHgzODM2ZTAwMCwKLTB4MzgzNzAwMDAsIDB4MzgzNzIwMDAsIDB4MzgzNzQwMDAsIDB4MzgzNzYwMDAsIDB4MzgzNzgwMDAsIDB4MzgzN2EwMDAsCi0weDM4MzdjMDAwLCAweDM4MzdlMDAwLCAweDM4MzgwMDAwLCAweDM4MzgyMDAwLCAweDM4Mzg0MDAwLCAweDM4Mzg2MDAwLAotMHgzODM4ODAwMCwgMHgzODM4YTAwMCwgMHgzODM4YzAwMCwgMHgzODM4ZTAwMCwgMHgzODM5MDAwMCwgMHgzODM5MjAwMCwKLTB4MzgzOTQwMDAsIDB4MzgzOTYwMDAsIDB4MzgzOTgwMDAsIDB4MzgzOWEwMDAsIDB4MzgzOWMwMDAsIDB4MzgzOWUwMDAsCi0weDM4M2EwMDAwLCAweDM4M2EyMDAwLCAweDM4M2E0MDAwLCAweDM4M2E2MDAwLCAweDM4M2E4MDAwLCAweDM4M2FhMDAwLAotMHgzODNhYzAwMCwgMHgzODNhZTAwMCwgMHgzODNiMDAwMCwgMHgzODNiMjAwMCwgMHgzODNiNDAwMCwgMHgzODNiNjAwMCwKLTB4MzgzYjgwMDAsIDB4MzgzYmEwMDAsIDB4MzgzYmMwMDAsIDB4MzgzYmUwMDAsIDB4MzgzYzAwMDAsIDB4MzgzYzIwMDAsCi0weDM4M2M0MDAwLCAweDM4M2M2MDAwLCAweDM4M2M4MDAwLCAweDM4M2NhMDAwLCAweDM4M2NjMDAwLCAweDM4M2NlMDAwLAotMHgzODNkMDAwMCwgMHgzODNkMjAwMCwgMHgzODNkNDAwMCwgMHgzODNkNjAwMCwgMHgzODNkODAwMCwgMHgzODNkYTAwMCwKLTB4MzgzZGMwMDAsIDB4MzgzZGUwMDAsIDB4MzgzZTAwMDAsIDB4MzgzZTIwMDAsIDB4MzgzZTQwMDAsIDB4MzgzZTYwMDAsCi0weDM4M2U4MDAwLCAweDM4M2VhMDAwLCAweDM4M2VjMDAwLCAweDM4M2VlMDAwLCAweDM4M2YwMDAwLCAweDM4M2YyMDAwLAotMHgzODNmNDAwMCwgMHgzODNmNjAwMCwgMHgzODNmODAwMCwgMHgzODNmYTAwMCwgMHgzODNmYzAwMCwgMHgzODNmZTAwMCwKLTB4Mzg0MDAwMDAsIDB4Mzg0MDIwMDAsIDB4Mzg0MDQwMDAsIDB4Mzg0MDYwMDAsIDB4Mzg0MDgwMDAsIDB4Mzg0MGEwMDAsCi0weDM4NDBjMDAwLCAweDM4NDBlMDAwLCAweDM4NDEwMDAwLCAweDM4NDEyMDAwLCAweDM4NDE0MDAwLCAweDM4NDE2MDAwLAotMHgzODQxODAwMCwgMHgzODQxYTAwMCwgMHgzODQxYzAwMCwgMHgzODQxZTAwMCwgMHgzODQyMDAwMCwgMHgzODQyMjAwMCwKLTB4Mzg0MjQwMDAsIDB4Mzg0MjYwMDAsIDB4Mzg0MjgwMDAsIDB4Mzg0MmEwMDAsIDB4Mzg0MmMwMDAsIDB4Mzg0MmUwMDAsCi0weDM4NDMwMDAwLCAweDM4NDMyMDAwLCAweDM4NDM0MDAwLCAweDM4NDM2MDAwLCAweDM4NDM4MDAwLCAweDM4NDNhMDAwLAotMHgzODQzYzAwMCwgMHgzODQzZTAwMCwgMHgzODQ0MDAwMCwgMHgzODQ0MjAwMCwgMHgzODQ0NDAwMCwgMHgzODQ0NjAwMCwKLTB4Mzg0NDgwMDAsIDB4Mzg0NGEwMDAsIDB4Mzg0NGMwMDAsIDB4Mzg0NGUwMDAsIDB4Mzg0NTAwMDAsIDB4Mzg0NTIwMDAsCi0weDM4NDU0MDAwLCAweDM4NDU2MDAwLCAweDM4NDU4MDAwLCAweDM4NDVhMDAwLCAweDM4NDVjMDAwLCAweDM4NDVlMDAwLAotMHgzODQ2MDAwMCwgMHgzODQ2MjAwMCwgMHgzODQ2NDAwMCwgMHgzODQ2NjAwMCwgMHgzODQ2ODAwMCwgMHgzODQ2YTAwMCwKLTB4Mzg0NmMwMDAsIDB4Mzg0NmUwMDAsIDB4Mzg0NzAwMDAsIDB4Mzg0NzIwMDAsIDB4Mzg0NzQwMDAsIDB4Mzg0NzYwMDAsCi0weDM4NDc4MDAwLCAweDM4NDdhMDAwLCAweDM4NDdjMDAwLCAweDM4NDdlMDAwLCAweDM4NDgwMDAwLCAweDM4NDgyMDAwLAotMHgzODQ4NDAwMCwgMHgzODQ4NjAwMCwgMHgzODQ4ODAwMCwgMHgzODQ4YTAwMCwgMHgzODQ4YzAwMCwgMHgzODQ4ZTAwMCwKLTB4Mzg0OTAwMDAsIDB4Mzg0OTIwMDAsIDB4Mzg0OTQwMDAsIDB4Mzg0OTYwMDAsIDB4Mzg0OTgwMDAsIDB4Mzg0OWEwMDAsCi0weDM4NDljMDAwLCAweDM4NDllMDAwLCAweDM4NGEwMDAwLCAweDM4NGEyMDAwLCAweDM4NGE0MDAwLCAweDM4NGE2MDAwLAotMHgzODRhODAwMCwgMHgzODRhYTAwMCwgMHgzODRhYzAwMCwgMHgzODRhZTAwMCwgMHgzODRiMDAwMCwgMHgzODRiMjAwMCwKLTB4Mzg0YjQwMDAsIDB4Mzg0YjYwMDAsIDB4Mzg0YjgwMDAsIDB4Mzg0YmEwMDAsIDB4Mzg0YmMwMDAsIDB4Mzg0YmUwMDAsCi0weDM4NGMwMDAwLCAweDM4NGMyMDAwLCAweDM4NGM0MDAwLCAweDM4NGM2MDAwLCAweDM4NGM4MDAwLCAweDM4NGNhMDAwLAotMHgzODRjYzAwMCwgMHgzODRjZTAwMCwgMHgzODRkMDAwMCwgMHgzODRkMjAwMCwgMHgzODRkNDAwMCwgMHgzODRkNjAwMCwKLTB4Mzg0ZDgwMDAsIDB4Mzg0ZGEwMDAsIDB4Mzg0ZGMwMDAsIDB4Mzg0ZGUwMDAsIDB4Mzg0ZTAwMDAsIDB4Mzg0ZTIwMDAsCi0weDM4NGU0MDAwLCAweDM4NGU2MDAwLCAweDM4NGU4MDAwLCAweDM4NGVhMDAwLCAweDM4NGVjMDAwLCAweDM4NGVlMDAwLAotMHgzODRmMDAwMCwgMHgzODRmMjAwMCwgMHgzODRmNDAwMCwgMHgzODRmNjAwMCwgMHgzODRmODAwMCwgMHgzODRmYTAwMCwKLTB4Mzg0ZmMwMDAsIDB4Mzg0ZmUwMDAsIDB4Mzg1MDAwMDAsIDB4Mzg1MDIwMDAsIDB4Mzg1MDQwMDAsIDB4Mzg1MDYwMDAsCi0weDM4NTA4MDAwLCAweDM4NTBhMDAwLCAweDM4NTBjMDAwLCAweDM4NTBlMDAwLCAweDM4NTEwMDAwLCAweDM4NTEyMDAwLAotMHgzODUxNDAwMCwgMHgzODUxNjAwMCwgMHgzODUxODAwMCwgMHgzODUxYTAwMCwgMHgzODUxYzAwMCwgMHgzODUxZTAwMCwKLTB4Mzg1MjAwMDAsIDB4Mzg1MjIwMDAsIDB4Mzg1MjQwMDAsIDB4Mzg1MjYwMDAsIDB4Mzg1MjgwMDAsIDB4Mzg1MmEwMDAsCi0weDM4NTJjMDAwLCAweDM4NTJlMDAwLCAweDM4NTMwMDAwLCAweDM4NTMyMDAwLCAweDM4NTM0MDAwLCAweDM4NTM2MDAwLAotMHgzODUzODAwMCwgMHgzODUzYTAwMCwgMHgzODUzYzAwMCwgMHgzODUzZTAwMCwgMHgzODU0MDAwMCwgMHgzODU0MjAwMCwKLTB4Mzg1NDQwMDAsIDB4Mzg1NDYwMDAsIDB4Mzg1NDgwMDAsIDB4Mzg1NGEwMDAsIDB4Mzg1NGMwMDAsIDB4Mzg1NGUwMDAsCi0weDM4NTUwMDAwLCAweDM4NTUyMDAwLCAweDM4NTU0MDAwLCAweDM4NTU2MDAwLCAweDM4NTU4MDAwLCAweDM4NTVhMDAwLAotMHgzODU1YzAwMCwgMHgzODU1ZTAwMCwgMHgzODU2MDAwMCwgMHgzODU2MjAwMCwgMHgzODU2NDAwMCwgMHgzODU2NjAwMCwKLTB4Mzg1NjgwMDAsIDB4Mzg1NmEwMDAsIDB4Mzg1NmMwMDAsIDB4Mzg1NmUwMDAsIDB4Mzg1NzAwMDAsIDB4Mzg1NzIwMDAsCi0weDM4NTc0MDAwLCAweDM4NTc2MDAwLCAweDM4NTc4MDAwLCAweDM4NTdhMDAwLCAweDM4NTdjMDAwLCAweDM4NTdlMDAwLAotMHgzODU4MDAwMCwgMHgzODU4MjAwMCwgMHgzODU4NDAwMCwgMHgzODU4NjAwMCwgMHgzODU4ODAwMCwgMHgzODU4YTAwMCwKLTB4Mzg1OGMwMDAsIDB4Mzg1OGUwMDAsIDB4Mzg1OTAwMDAsIDB4Mzg1OTIwMDAsIDB4Mzg1OTQwMDAsIDB4Mzg1OTYwMDAsCi0weDM4NTk4MDAwLCAweDM4NTlhMDAwLCAweDM4NTljMDAwLCAweDM4NTllMDAwLCAweDM4NWEwMDAwLCAweDM4NWEyMDAwLAotMHgzODVhNDAwMCwgMHgzODVhNjAwMCwgMHgzODVhODAwMCwgMHgzODVhYTAwMCwgMHgzODVhYzAwMCwgMHgzODVhZTAwMCwKLTB4Mzg1YjAwMDAsIDB4Mzg1YjIwMDAsIDB4Mzg1YjQwMDAsIDB4Mzg1YjYwMDAsIDB4Mzg1YjgwMDAsIDB4Mzg1YmEwMDAsCi0weDM4NWJjMDAwLCAweDM4NWJlMDAwLCAweDM4NWMwMDAwLCAweDM4NWMyMDAwLCAweDM4NWM0MDAwLCAweDM4NWM2MDAwLAotMHgzODVjODAwMCwgMHgzODVjYTAwMCwgMHgzODVjYzAwMCwgMHgzODVjZTAwMCwgMHgzODVkMDAwMCwgMHgzODVkMjAwMCwKLTB4Mzg1ZDQwMDAsIDB4Mzg1ZDYwMDAsIDB4Mzg1ZDgwMDAsIDB4Mzg1ZGEwMDAsIDB4Mzg1ZGMwMDAsIDB4Mzg1ZGUwMDAsCi0weDM4NWUwMDAwLCAweDM4NWUyMDAwLCAweDM4NWU0MDAwLCAweDM4NWU2MDAwLCAweDM4NWU4MDAwLCAweDM4NWVhMDAwLAotMHgzODVlYzAwMCwgMHgzODVlZTAwMCwgMHgzODVmMDAwMCwgMHgzODVmMjAwMCwgMHgzODVmNDAwMCwgMHgzODVmNjAwMCwKLTB4Mzg1ZjgwMDAsIDB4Mzg1ZmEwMDAsIDB4Mzg1ZmMwMDAsIDB4Mzg1ZmUwMDAsIDB4Mzg2MDAwMDAsIDB4Mzg2MDIwMDAsCi0weDM4NjA0MDAwLCAweDM4NjA2MDAwLCAweDM4NjA4MDAwLCAweDM4NjBhMDAwLCAweDM4NjBjMDAwLCAweDM4NjBlMDAwLAotMHgzODYxMDAwMCwgMHgzODYxMjAwMCwgMHgzODYxNDAwMCwgMHgzODYxNjAwMCwgMHgzODYxODAwMCwgMHgzODYxYTAwMCwKLTB4Mzg2MWMwMDAsIDB4Mzg2MWUwMDAsIDB4Mzg2MjAwMDAsIDB4Mzg2MjIwMDAsIDB4Mzg2MjQwMDAsIDB4Mzg2MjYwMDAsCi0weDM4NjI4MDAwLCAweDM4NjJhMDAwLCAweDM4NjJjMDAwLCAweDM4NjJlMDAwLCAweDM4NjMwMDAwLCAweDM4NjMyMDAwLAotMHgzODYzNDAwMCwgMHgzODYzNjAwMCwgMHgzODYzODAwMCwgMHgzODYzYTAwMCwgMHgzODYzYzAwMCwgMHgzODYzZTAwMCwKLTB4Mzg2NDAwMDAsIDB4Mzg2NDIwMDAsIDB4Mzg2NDQwMDAsIDB4Mzg2NDYwMDAsIDB4Mzg2NDgwMDAsIDB4Mzg2NGEwMDAsCi0weDM4NjRjMDAwLCAweDM4NjRlMDAwLCAweDM4NjUwMDAwLCAweDM4NjUyMDAwLCAweDM4NjU0MDAwLCAweDM4NjU2MDAwLAotMHgzODY1ODAwMCwgMHgzODY1YTAwMCwgMHgzODY1YzAwMCwgMHgzODY1ZTAwMCwgMHgzODY2MDAwMCwgMHgzODY2MjAwMCwKLTB4Mzg2NjQwMDAsIDB4Mzg2NjYwMDAsIDB4Mzg2NjgwMDAsIDB4Mzg2NmEwMDAsIDB4Mzg2NmMwMDAsIDB4Mzg2NmUwMDAsCi0weDM4NjcwMDAwLCAweDM4NjcyMDAwLCAweDM4Njc0MDAwLCAweDM4Njc2MDAwLCAweDM4Njc4MDAwLCAweDM4NjdhMDAwLAotMHgzODY3YzAwMCwgMHgzODY3ZTAwMCwgMHgzODY4MDAwMCwgMHgzODY4MjAwMCwgMHgzODY4NDAwMCwgMHgzODY4NjAwMCwKLTB4Mzg2ODgwMDAsIDB4Mzg2OGEwMDAsIDB4Mzg2OGMwMDAsIDB4Mzg2OGUwMDAsIDB4Mzg2OTAwMDAsIDB4Mzg2OTIwMDAsCi0weDM4Njk0MDAwLCAweDM4Njk2MDAwLCAweDM4Njk4MDAwLCAweDM4NjlhMDAwLCAweDM4NjljMDAwLCAweDM4NjllMDAwLAotMHgzODZhMDAwMCwgMHgzODZhMjAwMCwgMHgzODZhNDAwMCwgMHgzODZhNjAwMCwgMHgzODZhODAwMCwgMHgzODZhYTAwMCwKLTB4Mzg2YWMwMDAsIDB4Mzg2YWUwMDAsIDB4Mzg2YjAwMDAsIDB4Mzg2YjIwMDAsIDB4Mzg2YjQwMDAsIDB4Mzg2YjYwMDAsCi0weDM4NmI4MDAwLCAweDM4NmJhMDAwLCAweDM4NmJjMDAwLCAweDM4NmJlMDAwLCAweDM4NmMwMDAwLCAweDM4NmMyMDAwLAotMHgzODZjNDAwMCwgMHgzODZjNjAwMCwgMHgzODZjODAwMCwgMHgzODZjYTAwMCwgMHgzODZjYzAwMCwgMHgzODZjZTAwMCwKLTB4Mzg2ZDAwMDAsIDB4Mzg2ZDIwMDAsIDB4Mzg2ZDQwMDAsIDB4Mzg2ZDYwMDAsIDB4Mzg2ZDgwMDAsIDB4Mzg2ZGEwMDAsCi0weDM4NmRjMDAwLCAweDM4NmRlMDAwLCAweDM4NmUwMDAwLCAweDM4NmUyMDAwLCAweDM4NmU0MDAwLCAweDM4NmU2MDAwLAotMHgzODZlODAwMCwgMHgzODZlYTAwMCwgMHgzODZlYzAwMCwgMHgzODZlZTAwMCwgMHgzODZmMDAwMCwgMHgzODZmMjAwMCwKLTB4Mzg2ZjQwMDAsIDB4Mzg2ZjYwMDAsIDB4Mzg2ZjgwMDAsIDB4Mzg2ZmEwMDAsIDB4Mzg2ZmMwMDAsIDB4Mzg2ZmUwMDAsCi0weDM4NzAwMDAwLCAweDM4NzAyMDAwLCAweDM4NzA0MDAwLCAweDM4NzA2MDAwLCAweDM4NzA4MDAwLCAweDM4NzBhMDAwLAotMHgzODcwYzAwMCwgMHgzODcwZTAwMCwgMHgzODcxMDAwMCwgMHgzODcxMjAwMCwgMHgzODcxNDAwMCwgMHgzODcxNjAwMCwKLTB4Mzg3MTgwMDAsIDB4Mzg3MWEwMDAsIDB4Mzg3MWMwMDAsIDB4Mzg3MWUwMDAsIDB4Mzg3MjAwMDAsIDB4Mzg3MjIwMDAsCi0weDM4NzI0MDAwLCAweDM4NzI2MDAwLCAweDM4NzI4MDAwLCAweDM4NzJhMDAwLCAweDM4NzJjMDAwLCAweDM4NzJlMDAwLAotMHgzODczMDAwMCwgMHgzODczMjAwMCwgMHgzODczNDAwMCwgMHgzODczNjAwMCwgMHgzODczODAwMCwgMHgzODczYTAwMCwKLTB4Mzg3M2MwMDAsIDB4Mzg3M2UwMDAsIDB4Mzg3NDAwMDAsIDB4Mzg3NDIwMDAsIDB4Mzg3NDQwMDAsIDB4Mzg3NDYwMDAsCi0weDM4NzQ4MDAwLCAweDM4NzRhMDAwLCAweDM4NzRjMDAwLCAweDM4NzRlMDAwLCAweDM4NzUwMDAwLCAweDM4NzUyMDAwLAotMHgzODc1NDAwMCwgMHgzODc1NjAwMCwgMHgzODc1ODAwMCwgMHgzODc1YTAwMCwgMHgzODc1YzAwMCwgMHgzODc1ZTAwMCwKLTB4Mzg3NjAwMDAsIDB4Mzg3NjIwMDAsIDB4Mzg3NjQwMDAsIDB4Mzg3NjYwMDAsIDB4Mzg3NjgwMDAsIDB4Mzg3NmEwMDAsCi0weDM4NzZjMDAwLCAweDM4NzZlMDAwLCAweDM4NzcwMDAwLCAweDM4NzcyMDAwLCAweDM4Nzc0MDAwLCAweDM4Nzc2MDAwLAotMHgzODc3ODAwMCwgMHgzODc3YTAwMCwgMHgzODc3YzAwMCwgMHgzODc3ZTAwMCwgMHgzODc4MDAwMCwgMHgzODc4MjAwMCwKLTB4Mzg3ODQwMDAsIDB4Mzg3ODYwMDAsIDB4Mzg3ODgwMDAsIDB4Mzg3OGEwMDAsIDB4Mzg3OGMwMDAsIDB4Mzg3OGUwMDAsCi0weDM4NzkwMDAwLCAweDM4NzkyMDAwLCAweDM4Nzk0MDAwLCAweDM4Nzk2MDAwLCAweDM4Nzk4MDAwLCAweDM4NzlhMDAwLAotMHgzODc5YzAwMCwgMHgzODc5ZTAwMCwgMHgzODdhMDAwMCwgMHgzODdhMjAwMCwgMHgzODdhNDAwMCwgMHgzODdhNjAwMCwKLTB4Mzg3YTgwMDAsIDB4Mzg3YWEwMDAsIDB4Mzg3YWMwMDAsIDB4Mzg3YWUwMDAsIDB4Mzg3YjAwMDAsIDB4Mzg3YjIwMDAsCi0weDM4N2I0MDAwLCAweDM4N2I2MDAwLCAweDM4N2I4MDAwLCAweDM4N2JhMDAwLCAweDM4N2JjMDAwLCAweDM4N2JlMDAwLAotMHgzODdjMDAwMCwgMHgzODdjMjAwMCwgMHgzODdjNDAwMCwgMHgzODdjNjAwMCwgMHgzODdjODAwMCwgMHgzODdjYTAwMCwKLTB4Mzg3Y2MwMDAsIDB4Mzg3Y2UwMDAsIDB4Mzg3ZDAwMDAsIDB4Mzg3ZDIwMDAsIDB4Mzg3ZDQwMDAsIDB4Mzg3ZDYwMDAsCi0weDM4N2Q4MDAwLCAweDM4N2RhMDAwLCAweDM4N2RjMDAwLCAweDM4N2RlMDAwLCAweDM4N2UwMDAwLCAweDM4N2UyMDAwLAotMHgzODdlNDAwMCwgMHgzODdlNjAwMCwgMHgzODdlODAwMCwgMHgzODdlYTAwMCwgMHgzODdlYzAwMCwgMHgzODdlZTAwMCwKLTB4Mzg3ZjAwMDAsIDB4Mzg3ZjIwMDAsIDB4Mzg3ZjQwMDAsIDB4Mzg3ZjYwMDAsIDB4Mzg3ZjgwMDAsIDB4Mzg3ZmEwMDAsCi0weDM4N2ZjMDAwLCAweDM4N2ZlMDAwCi19OwotCi1zdGF0aWMgY21zVUludDE2TnVtYmVyIE9mZnNldFs2NF0gPSB7Ci0weDAwMDAsIDB4MDQwMCwgMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwgMHgwNDAwLAotMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwgMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwKLTB4MDQwMCwgMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwgMHgwNDAwLCAweDA0MDAsCi0weDA0MDAsIDB4MDQwMCwgMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwgMHgwNDAwLAotMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwgMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwKLTB4MDQwMCwgMHgwNDAwLCAweDAwMDAsIDB4MDQwMCwgMHgwNDAwLCAweDA0MDAsCi0weDA0MDAsIDB4MDQwMCwgMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwgMHgwNDAwLAotMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwgMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwKLTB4MDQwMCwgMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwgMHgwNDAwLCAweDA0MDAsCi0weDA0MDAsIDB4MDQwMCwgMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwgMHgwNDAwLAotMHgwNDAwLCAweDA0MDAsIDB4MDQwMCwgMHgwNDAwCi19OwotCi1zdGF0aWMgY21zVUludDMyTnVtYmVyIEV4cG9uZW50WzY0XSA9IHsKLTB4MDAwMDAwMDAsIDB4MDA4MDAwMDAsIDB4MDEwMDAwMDAsIDB4MDE4MDAwMDAsIDB4MDIwMDAwMDAsIDB4MDI4MDAwMDAsCi0weDAzMDAwMDAwLCAweDAzODAwMDAwLCAweDA0MDAwMDAwLCAweDA0ODAwMDAwLCAweDA1MDAwMDAwLCAweDA1ODAwMDAwLAotMHgwNjAwMDAwMCwgMHgwNjgwMDAwMCwgMHgwNzAwMDAwMCwgMHgwNzgwMDAwMCwgMHgwODAwMDAwMCwgMHgwODgwMDAwMCwKLTB4MDkwMDAwMDAsIDB4MDk4MDAwMDAsIDB4MGEwMDAwMDAsIDB4MGE4MDAwMDAsIDB4MGIwMDAwMDAsIDB4MGI4MDAwMDAsCi0weDBjMDAwMDAwLCAweDBjODAwMDAwLCAweDBkMDAwMDAwLCAweDBkODAwMDAwLCAweDBlMDAwMDAwLCAweDBlODAwMDAwLAotMHgwZjAwMDAwMCwgMHg0NzgwMDAwMCwgMHg4MDAwMDAwMCwgMHg4MDgwMDAwMCwgMHg4MTAwMDAwMCwgMHg4MTgwMDAwMCwKLTB4ODIwMDAwMDAsIDB4ODI4MDAwMDAsIDB4ODMwMDAwMDAsIDB4ODM4MDAwMDAsIDB4ODQwMDAwMDAsIDB4ODQ4MDAwMDAsCi0weDg1MDAwMDAwLCAweDg1ODAwMDAwLCAweDg2MDAwMDAwLCAweDg2ODAwMDAwLCAweDg3MDAwMDAwLCAweDg3ODAwMDAwLAotMHg4ODAwMDAwMCwgMHg4ODgwMDAwMCwgMHg4OTAwMDAwMCwgMHg4OTgwMDAwMCwgMHg4YTAwMDAwMCwgMHg4YTgwMDAwMCwKLTB4OGIwMDAwMDAsIDB4OGI4MDAwMDAsIDB4OGMwMDAwMDAsIDB4OGM4MDAwMDAsIDB4OGQwMDAwMDAsIDB4OGQ4MDAwMDAsCi0weDhlMDAwMDAwLCAweDhlODAwMDAwLCAweDhmMDAwMDAwLCAweGM3ODAwMDAwCi19OwotCi1zdGF0aWMgY21zVUludDE2TnVtYmVyIEJhc2VbNTEyXSA9IHsKLTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKLTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMSwgMHgwMDAyLCAweDAwMDQsIDB4MDAwOCwgMHgwMDEwLCAweDAwMjAsIDB4MDA0MCwKLTB4MDA4MCwgMHgwMTAwLCAweDAyMDAsIDB4MDQwMCwgMHgwODAwLCAweDBjMDAsIDB4MTAwMCwgMHgxNDAwLCAweDE4MDAsIDB4MWMwMCwKLTB4MjAwMCwgMHgyNDAwLCAweDI4MDAsIDB4MmMwMCwgMHgzMDAwLCAweDM0MDAsIDB4MzgwMCwgMHgzYzAwLCAweDQwMDAsIDB4NDQwMCwKLTB4NDgwMCwgMHg0YzAwLCAweDUwMDAsIDB4NTQwMCwgMHg1ODAwLCAweDVjMDAsIDB4NjAwMCwgMHg2NDAwLCAweDY4MDAsIDB4NmMwMCwKLTB4NzAwMCwgMHg3NDAwLCAweDc4MDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwKLTB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwKLTB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwKLTB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwKLTB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwKLTB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwKLTB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwKLTB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwKLTB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwKLTB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwKLTB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwKLTB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4N2MwMCwgMHg3YzAwLCAweDdjMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKLTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKLTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKLTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKLTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKLTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKLTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKLTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKLTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKLTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwKLTB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMCwgMHg4MDAwLCAweDgwMDAsIDB4ODAwMSwKLTB4ODAwMiwgMHg4MDA0LCAweDgwMDgsIDB4ODAxMCwgMHg4MDIwLCAweDgwNDAsIDB4ODA4MCwgMHg4MTAwLCAweDgyMDAsIDB4ODQwMCwKLTB4ODgwMCwgMHg4YzAwLCAweDkwMDAsIDB4OTQwMCwgMHg5ODAwLCAweDljMDAsIDB4YTAwMCwgMHhhNDAwLCAweGE4MDAsIDB4YWMwMCwKLTB4YjAwMCwgMHhiNDAwLCAweGI4MDAsIDB4YmMwMCwgMHhjMDAwLCAweGM0MDAsIDB4YzgwMCwgMHhjYzAwLCAweGQwMDAsIDB4ZDQwMCwKLTB4ZDgwMCwgMHhkYzAwLCAweGUwMDAsIDB4ZTQwMCwgMHhlODAwLCAweGVjMDAsIDB4ZjAwMCwgMHhmNDAwLCAweGY4MDAsIDB4ZmMwMCwKLTB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwKLTB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwKLTB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwKLTB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwKLTB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwKLTB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwKLTB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwKLTB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwKLTB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwKLTB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwKLTB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwgMHhmYzAwLCAweGZjMDAsIDB4ZmMwMCwKLTB4ZmMwMCwgMHhmYzAwCi19OwotCi1zdGF0aWMgY21zVUludDhOdW1iZXIgIFNoaWZ0WzUxMl0gPSB7Ci0weDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAotMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKLTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCi0weDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAotMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKLTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCi0weDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAotMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxNywKLTB4MTYsIDB4MTUsIDB4MTQsIDB4MTMsIDB4MTIsIDB4MTEsIDB4MTAsIDB4MGYsIDB4MGUsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsCi0weDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLAotMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwKLTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCi0weDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAotMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKLTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCi0weDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAotMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKLTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCi0weDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAotMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgwZCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKLTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCi0weDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAotMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKLTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCi0weDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAotMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKLTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCi0weDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE3LCAweDE2LCAweDE1LCAweDE0LCAweDEzLAotMHgxMiwgMHgxMSwgMHgxMCwgMHgwZiwgMHgwZSwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwKLTB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsIDB4MGQsCi0weDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDBkLCAweDE4LCAweDE4LCAweDE4LCAweDE4LAotMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKLTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCi0weDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAotMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKLTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCi0weDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LCAweDE4LAotMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwgMHgxOCwKLTB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsIDB4MTgsCi0weDE4LCAweDE4LCAweDE4LCAweDE4LCAweDBkCi19OwotCi1jbXNGbG9hdDMyTnVtYmVyIF9jbXNIYWxmMkZsb2F0KGNtc1VJbnQxNk51bWJlciBoKQotewotICAgIHVuaW9uIHsKLSAgICAgICAgY21zRmxvYXQzMk51bWJlciBmbHQ7Ci0gICAgICAgIGNtc1VJbnQzMk51bWJlciAgbnVtOwotICAgIH0gb3V0OwotCi0gICAgaW50IG4gPSBoID4+IDEwOwotCi0gICAgb3V0Lm51bSA9IE1hbnRpc3NhWyAgKGggJiAweDNmZikgKyBPZmZzZXRbIG4gXSBdICsgRXhwb25lbnRbIG4gXTsKLSAgICByZXR1cm4gb3V0LmZsdDsKLX0KLQotY21zVUludDE2TnVtYmVyIF9jbXNGbG9hdDJIYWxmKGNtc0Zsb2F0MzJOdW1iZXIgZmx0KQotewotICAgIHVuaW9uIHsKLSAgICAgICAgY21zRmxvYXQzMk51bWJlciBmbHQ7Ci0gICAgICAgIGNtc1VJbnQzMk51bWJlciAgbnVtOwotICAgIH0gaW47Ci0KLSAgICBjbXNVSW50MzJOdW1iZXIgbiwgajsKLQotICAgIGluLmZsdCA9IGZsdDsKLSAgICBuID0gaW4ubnVtOwotICAgIGogPSAobiA+PiAyMykgJiAweDFmZjsKLQotICAgIHJldHVybiAoY21zVUludDE2TnVtYmVyKSAoKGNtc1VJbnQzMk51bWJlcikgQmFzZVsgaiBdICsgKCggbiAmIDB4MDA3ZmZmZmYpID4+IFNoaWZ0WyBqIF0pKTsKLX0KLQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2ludHJwLmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2ludHJwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YzY4NTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNpbnRycC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUwNiArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMiBNYXJ0aSBNYXJpYSBTYWd1ZXIKLS8vCi0vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLS8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLS8vIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLS8vIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotLy8gYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlCi0vLyBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotLy8KLS8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi0vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLS8vCi0vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLS8vIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTwotLy8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLS8vIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKLS8vIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLS8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgotLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0KLSNpbmNsdWRlICJsY21zMl9pbnRlcm5hbC5oIgotCi0vLyBUaGlzIG1vZHVsZSBpbmNvcnBvcmF0ZXMgc2V2ZXJhbCBpbnRlcnBvbGF0aW9uIHJvdXRpbmVzLCBmb3IgMSB0byA4IGNoYW5uZWxzIG9uIGlucHV0IGFuZAotLy8gdXAgdG8gNjU1MzUgY2hhbm5lbHMgb24gb3V0cHV0LiBUaGUgdXNlciBtYXkgY2hhbmdlIHRob3NlIGJ5IHVzaW5nIHRoZSBpbnRlcnBvbGF0aW9uIHBsdWctaW4KLQotLy8gSW50ZXJwb2xhdGlvbiByb3V0aW5lcyBieSBkZWZhdWx0Ci1zdGF0aWMgY21zSW50ZXJwRnVuY3Rpb24gRGVmYXVsdEludGVycG9sYXRvcnNGYWN0b3J5KGNtc1VJbnQzMk51bWJlciBuSW5wdXRDaGFubmVscywgY21zVUludDMyTnVtYmVyIG5PdXRwdXRDaGFubmVscywgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOwotCi0vLyBUaGlzIGlzIHRoZSBkZWZhdWx0IGZhY3RvcnkKLV9jbXNJbnRlcnBQbHVnaW5DaHVua1R5cGUgX2Ntc0ludGVycFBsdWdpbkNodW5rID0geyBOVUxMIH07Ci0KLS8vIFRoZSBpbnRlcnBvbGF0aW9uIHBsdWctaW4gbWVtb3J5IGNodW5rIGFsbG9jYXRvci9kdXAKLXZvaWQgX2Ntc0FsbG9jSW50ZXJwUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCi17Ci0gICAgdm9pZCogZnJvbTsKLQotICAgIF9jbXNBc3NlcnQoY3R4ICE9IE5VTEwpOwotCi0gICAgaWYgKHNyYyAhPSBOVUxMKSB7Ci0gICAgICAgIGZyb20gPSBzcmMgLT5jaHVua3NbSW50ZXJwUGx1Z2luXTsgICAgICAgCi0gICAgfQotICAgIGVsc2UgeyAKLSAgICAgICAgc3RhdGljIF9jbXNJbnRlcnBQbHVnaW5DaHVua1R5cGUgSW50ZXJwUGx1Z2luQ2h1bmsgPSB7IE5VTEwgfTsKLQotICAgICAgICBmcm9tID0gJkludGVycFBsdWdpbkNodW5rOwotICAgIH0KLQotICAgIF9jbXNBc3NlcnQoZnJvbSAhPSBOVUxMKTsKLSAgICBjdHggLT5jaHVua3NbSW50ZXJwUGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCBmcm9tLCBzaXplb2YoX2Ntc0ludGVycFBsdWdpbkNodW5rVHlwZSkpOwotfQotCi0KLS8vIE1haW4gcGx1Zy1pbiBlbnRyeQotY21zQm9vbCAgX2Ntc1JlZ2lzdGVySW50ZXJwUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBEYXRhKQotewotICAgIGNtc1BsdWdpbkludGVycG9sYXRpb24qIFBsdWdpbiA9IChjbXNQbHVnaW5JbnRlcnBvbGF0aW9uKikgRGF0YTsKLSAgICBfY21zSW50ZXJwUGx1Z2luQ2h1bmtUeXBlKiBwdHIgPSAoX2Ntc0ludGVycFBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBJbnRlcnBQbHVnaW4pOwotCi0gICAgaWYgKERhdGEgPT0gTlVMTCkgewotCi0gICAgICAgIHB0ciAtPkludGVycG9sYXRvcnMgPSBOVUxMOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICAvLyBTZXQgcmVwbGFjZW1lbnQgZnVuY3Rpb25zCi0gICAgcHRyIC0+SW50ZXJwb2xhdG9ycyA9IFBsdWdpbiAtPkludGVycG9sYXRvcnNGYWN0b3J5OwotICAgIHJldHVybiBUUlVFOwotfQotCi0KLS8vIFNldCB0aGUgaW50ZXJwb2xhdGlvbiBtZXRob2QKLWNtc0Jvb2wgX2Ntc1NldEludGVycG9sYXRpb25Sb3V0aW5lKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNJbnRlcnBQYXJhbXMqIHApCi17ICAgICAgCi0gICAgX2Ntc0ludGVycFBsdWdpbkNodW5rVHlwZSogcHRyID0gKF9jbXNJbnRlcnBQbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgSW50ZXJwUGx1Z2luKTsKLQotICAgIHAgLT5JbnRlcnBvbGF0aW9uLkxlcnAxNiA9IE5VTEw7Ci0KLSAgIC8vIEludm9rZSBmYWN0b3J5LCBwb3NzaWJseSBpbiB0aGUgUGx1Zy1pbgotICAgIGlmIChwdHIgLT5JbnRlcnBvbGF0b3JzICE9IE5VTEwpCi0gICAgICAgIHAgLT5JbnRlcnBvbGF0aW9uID0gcHRyLT5JbnRlcnBvbGF0b3JzKHAgLT4gbklucHV0cywgcCAtPm5PdXRwdXRzLCBwIC0+ZHdGbGFncyk7Ci0gICAgCi0gICAgLy8gSWYgdW5zdXBwb3J0ZWQgYnkgdGhlIHBsdWctaW4sIGdvIGZvciB0aGUgTGl0dGxlQ01TIGRlZmF1bHQuCi0gICAgLy8gSWYgaGFwcGVucyBvbmx5IGlmIGFuIGV4dGVybiBwbHVnLWluIGlzIGJlaW5nIHVzZWQKLSAgICBpZiAocCAtPkludGVycG9sYXRpb24uTGVycDE2ID09IE5VTEwpCi0gICAgICAgIHAgLT5JbnRlcnBvbGF0aW9uID0gRGVmYXVsdEludGVycG9sYXRvcnNGYWN0b3J5KHAgLT5uSW5wdXRzLCBwIC0+bk91dHB1dHMsIHAgLT5kd0ZsYWdzKTsKLQotICAgIC8vIENoZWNrIGZvciB2YWxpZCBpbnRlcnBvbGF0b3IgKHdlIGp1c3QgY2hlY2sgb25lIG1lbWJlciBvZiB0aGUgdW5pb24pCi0gICAgaWYgKHAgLT5JbnRlcnBvbGF0aW9uLkxlcnAxNiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLy8gVGhpcyBmdW5jdGlvbiBwcmVjYWxjdWxhdGVzIGFzIG1hbnkgcGFyYW1ldGVycyBhcyBwb3NzaWJsZSB0byBzcGVlZCB1cCB0aGUgaW50ZXJwb2xhdGlvbi4KLWNtc0ludGVycFBhcmFtcyogX2Ntc0NvbXB1dGVJbnRlcnBQYXJhbXNFeChjbXNDb250ZXh0IENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNVSW50MzJOdW1iZXIgblNhbXBsZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgSW5wdXRDaGFuLCBpbnQgT3V0cHV0Q2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKLXsKLSAgICBjbXNJbnRlcnBQYXJhbXMqIHA7Ci0gICAgaW50IGk7Ci0KLSAgICAvLyBDaGVjayBmb3IgbWF4aW11bSBpbnB1dHMKLSAgICBpZiAoSW5wdXRDaGFuID4gTUFYX0lOUFVUX0RJTUVOU0lPTlMpIHsKLSAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX1JBTkdFLCAiVG9vIG1hbnkgaW5wdXQgY2hhbm5lbHMgKCVkIGNoYW5uZWxzLCBtYXg9JWQpIiwgSW5wdXRDaGFuLCBNQVhfSU5QVVRfRElNRU5TSU9OUyk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGVzIGFuIGVtcHR5IG9iamVjdAotICAgIHAgPSAoY21zSW50ZXJwUGFyYW1zKikgX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBzaXplb2YoY21zSW50ZXJwUGFyYW1zKSk7Ci0gICAgaWYgKHAgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICAvLyBLZWVwIG9yaWdpbmFsIHBhcmFtZXRlcnMKLSAgICBwIC0+IGR3RmxhZ3MgID0gZHdGbGFnczsKLSAgICBwIC0+IG5JbnB1dHMgID0gSW5wdXRDaGFuOwotICAgIHAgLT4gbk91dHB1dHMgPSBPdXRwdXRDaGFuOwotICAgIHAgLT5UYWJsZSAgICAgPSBUYWJsZTsKLSAgICBwIC0+Q29udGV4dElEICA9IENvbnRleHRJRDsKLQotICAgIC8vIEZpbGwgc2FtcGxlcyBwZXIgaW5wdXQgZGlyZWN0aW9uIGFuZCBkb21haW4gKHdoaWNoIGlzIG51bWJlciBvZiBub2RlcyBtaW51cyBvbmUpCi0gICAgZm9yIChpPTA7IGkgPCBJbnB1dENoYW47IGkrKykgewotCi0gICAgICAgIHAgLT4gblNhbXBsZXNbaV0gPSBuU2FtcGxlc1tpXTsKLSAgICAgICAgcCAtPiBEb21haW5baV0gICA9IG5TYW1wbGVzW2ldIC0gMTsKLSAgICB9Ci0KLSAgICAvLyBDb21wdXRlIGZhY3RvcnMgdG8gYXBwbHkgdG8gZWFjaCBjb21wb25lbnQgdG8gaW5kZXggdGhlIGdyaWQgYXJyYXkKLSAgICBwIC0+IG9wdGFbMF0gPSBwIC0+IG5PdXRwdXRzOwotICAgIGZvciAoaT0xOyBpIDwgSW5wdXRDaGFuOyBpKyspCi0gICAgICAgIHAgLT5vcHRhW2ldID0gcCAtPm9wdGFbaS0xXSAqIG5TYW1wbGVzW0lucHV0Q2hhbi1pXTsKLQotCi0gICAgaWYgKCFfY21zU2V0SW50ZXJwb2xhdGlvblJvdXRpbmUoQ29udGV4dElELCBwKSkgewotICAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVuc3VwcG9ydGVkIGludGVycG9sYXRpb24gKCVkLT4lZCBjaGFubmVscykiLCBJbnB1dENoYW4sIE91dHB1dENoYW4pOwotICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIHApOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBBbGwgc2VlbXMgb2sKLSAgICByZXR1cm4gcDsKLX0KLQotCi0vLyBUaGlzIG9uZSBpcyBhIHdyYXBwZXIgb24gdGhlIGFudGVyaW9yLCBidXQgYXNzdW1pbmcgYWxsIGRpcmVjdGlvbnMgaGF2ZSBzYW1lIG51bWJlciBvZiBub2RlcwotY21zSW50ZXJwUGFyYW1zKiBfY21zQ29tcHV0ZUludGVycFBhcmFtcyhjbXNDb250ZXh0IENvbnRleHRJRCwgaW50IG5TYW1wbGVzLCBpbnQgSW5wdXRDaGFuLCBpbnQgT3V0cHV0Q2hhbiwgY29uc3Qgdm9pZCogVGFibGUsIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKQotewotICAgIGludCBpOwotICAgIGNtc1VJbnQzMk51bWJlciBTYW1wbGVzW01BWF9JTlBVVF9ESU1FTlNJT05TXTsKLQotICAgIC8vIEZpbGwgdGhlIGF1eGlsaWFyIGFycmF5Ci0gICAgZm9yIChpPTA7IGkgPCBNQVhfSU5QVVRfRElNRU5TSU9OUzsgaSsrKQotICAgICAgICBTYW1wbGVzW2ldID0gblNhbXBsZXM7Ci0KLSAgICAvLyBDYWxsIHRoZSBleHRlbmRlZCBmdW5jdGlvbgotICAgIHJldHVybiBfY21zQ29tcHV0ZUludGVycFBhcmFtc0V4KENvbnRleHRJRCwgU2FtcGxlcywgSW5wdXRDaGFuLCBPdXRwdXRDaGFuLCBUYWJsZSwgZHdGbGFncyk7Ci19Ci0KLQotLy8gRnJlZSBhbGwgYXNzb2NpYXRlZCBtZW1vcnkKLXZvaWQgX2Ntc0ZyZWVJbnRlcnBQYXJhbXMoY21zSW50ZXJwUGFyYW1zKiBwKQotewotICAgIGlmIChwICE9IE5VTEwpIF9jbXNGcmVlKHAgLT5Db250ZXh0SUQsIHApOwotfQotCi0KLS8vIElubGluZSBmaXhlZCBwb2ludCBpbnRlcnBvbGF0aW9uCi1jbXNJTkxJTkUgY21zVUludDE2TnVtYmVyIExpbmVhckludGVycChjbXNTMTVGaXhlZDE2TnVtYmVyIGEsIGNtc1MxNUZpeGVkMTZOdW1iZXIgbCwgY21zUzE1Rml4ZWQxNk51bWJlciBoKQotewotICAgIGNtc1VJbnQzMk51bWJlciBkaWYgPSAoY21zVUludDMyTnVtYmVyKSAoaCAtIGwpICogYSArIDB4ODAwMDsKLSAgICBkaWYgPSAoZGlmID4+IDE2KSArIGw7Ci0gICAgcmV0dXJuIChjbXNVSW50MTZOdW1iZXIpIChkaWYpOwotfQotCi0KLS8vICBMaW5lYXIgaW50ZXJwb2xhdGlvbiAoRml4ZWQtcG9pbnQgb3B0aW1pemVkKQotc3RhdGljCi12b2lkIExpbkxlcnAxRChyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgVmFsdWVbXSwKLSAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciBPdXRwdXRbXSwKLSAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNvbnN0IGNtc0ludGVycFBhcmFtcyogcCkKLXsKLSAgICBjbXNVSW50MTZOdW1iZXIgeTEsIHkwOwotICAgIGludCBjZWxsMCwgcmVzdDsKLSAgICBpbnQgdmFsMzsKLSAgICBjb25zdCBjbXNVSW50MTZOdW1iZXIqIEx1dFRhYmxlID0gKGNtc1VJbnQxNk51bWJlciopIHAgLT5UYWJsZTsKLQotICAgIC8vIGlmIGxhc3QgdmFsdWUuLi4KLSAgICBpZiAoVmFsdWVbMF0gPT0gMHhmZmZmKSB7Ci0KLSAgICAgICAgT3V0cHV0WzBdID0gTHV0VGFibGVbcCAtPiBEb21haW5bMF1dOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdmFsMyA9IHAgLT4gRG9tYWluWzBdICogVmFsdWVbMF07Ci0gICAgdmFsMyA9IF9jbXNUb0ZpeGVkRG9tYWluKHZhbDMpOyAgICAvLyBUbyBmaXhlZCAxNS4xNgotCi0gICAgY2VsbDAgPSBGSVhFRF9UT19JTlQodmFsMyk7ICAgICAgICAgICAgIC8vIENlbGwgaXMgMTYgTVNCIGJpdHMKLSAgICByZXN0ICA9IEZJWEVEX1JFU1RfVE9fSU5UKHZhbDMpOyAgICAgICAgLy8gUmVzdCBpcyAxNiBMU0IgYml0cwotCi0gICAgeTAgPSBMdXRUYWJsZVtjZWxsMF07Ci0gICAgeTEgPSBMdXRUYWJsZVtjZWxsMCsxXTsKLQotCi0gICAgT3V0cHV0WzBdID0gTGluZWFySW50ZXJwKHJlc3QsIHkwLCB5MSk7Ci19Ci0KLS8vIFRvIHByZXZlbnQgb3V0IG9mIGJvdW5kcyBpbmRleGluZwotY21zSU5MSU5FIGNtc0Zsb2F0MzJOdW1iZXIgZmNsYW1wKGNtc0Zsb2F0MzJOdW1iZXIgdikgCi17Ci0gICAgcmV0dXJuICgodiA8IDAuMGYpIHx8IGlzbmFuKHYpKSA/IDAuMGYgOiAodiA+IDEuMGYgPyAxLjBmIDogdik7Ci19Ci0KLS8vIEZsb2F0aW5nLXBvaW50IHZlcnNpb24gb2YgMUQgaW50ZXJwb2xhdGlvbgotc3RhdGljCi12b2lkIExpbkxlcnAxRGZsb2F0KGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIgVmFsdWVbXSwKLSAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciBPdXRwdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBwKQotewotICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgeTEsIHkwOwotICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgdmFsMiwgcmVzdDsKLSAgICAgICBpbnQgY2VsbDAsIGNlbGwxOwotICAgICAgIGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIqIEx1dFRhYmxlID0gKGNtc0Zsb2F0MzJOdW1iZXIqKSBwIC0+VGFibGU7Ci0KLSAgICAgICB2YWwyID0gZmNsYW1wKFZhbHVlWzBdKTsKLQotICAgICAgIC8vIGlmIGxhc3QgdmFsdWUuLi4KLSAgICAgICBpZiAodmFsMiA9PSAxLjApIHsKLSAgICAgICAgICAgT3V0cHV0WzBdID0gTHV0VGFibGVbcCAtPiBEb21haW5bMF1dOwotICAgICAgICAgICByZXR1cm47Ci0gICAgICAgfQotCi0gICAgICAgdmFsMiAqPSBwIC0+IERvbWFpblswXTsKLQotICAgICAgIGNlbGwwID0gKGludCkgZmxvb3IodmFsMik7Ci0gICAgICAgY2VsbDEgPSAoaW50KSBjZWlsKHZhbDIpOwotCi0gICAgICAgLy8gUmVzdCBpcyAxNiBMU0IgYml0cwotICAgICAgIHJlc3QgPSB2YWwyIC0gY2VsbDA7Ci0KLSAgICAgICB5MCA9IEx1dFRhYmxlW2NlbGwwXSA7Ci0gICAgICAgeTEgPSBMdXRUYWJsZVtjZWxsMV0gOwotCi0gICAgICAgT3V0cHV0WzBdID0geTAgKyAoeTEgLSB5MCkgKiByZXN0OwotfQotCi0KLQotLy8gRXZhbCBncmF5IExVVCBoYXZpbmcgb25seSBvbmUgaW5wdXQgY2hhbm5lbAotc3RhdGljCi12b2lkIEV2YWwxSW5wdXQocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIElucHV0W10sCi0gICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIE91dHB1dFtdLAotICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNvbnN0IGNtc0ludGVycFBhcmFtcyogcDE2KQotewotICAgICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgZms7Ci0gICAgICAgY21zUzE1Rml4ZWQxNk51bWJlciBrMCwgazEsIHJrLCBLMCwgSzE7Ci0gICAgICAgaW50IHY7Ci0gICAgICAgY21zVUludDMyTnVtYmVyIE91dENoYW47Ci0gICAgICAgY29uc3QgY21zVUludDE2TnVtYmVyKiBMdXRUYWJsZSA9IChjbXNVSW50MTZOdW1iZXIqKSBwMTYgLT4gVGFibGU7Ci0KLSAgICAgICB2ID0gSW5wdXRbMF0gKiBwMTYgLT4gRG9tYWluWzBdOwotICAgICAgIGZrID0gX2Ntc1RvRml4ZWREb21haW4odik7Ci0KLSAgICAgICBrMCA9IEZJWEVEX1RPX0lOVChmayk7Ci0gICAgICAgcmsgPSAoY21zVUludDE2TnVtYmVyKSBGSVhFRF9SRVNUX1RPX0lOVChmayk7Ci0KLSAgICAgICBrMSA9IGswICsgKElucHV0WzBdICE9IDB4RkZGRlUgPyAxIDogMCk7Ci0KLSAgICAgICBLMCA9IHAxNiAtPiBvcHRhWzBdICogazA7Ci0gICAgICAgSzEgPSBwMTYgLT4gb3B0YVswXSAqIGsxOwotCi0gICAgICAgZm9yIChPdXRDaGFuPTA7IE91dENoYW4gPCBwMTYtPm5PdXRwdXRzOyBPdXRDaGFuKyspIHsKLQotICAgICAgICAgICBPdXRwdXRbT3V0Q2hhbl0gPSBMaW5lYXJJbnRlcnAocmssIEx1dFRhYmxlW0swK091dENoYW5dLCBMdXRUYWJsZVtLMStPdXRDaGFuXSk7Ci0gICAgICAgfQotfQotCi0KLQotLy8gRXZhbCBncmF5IExVVCBoYXZpbmcgb25seSBvbmUgaW5wdXQgY2hhbm5lbAotc3RhdGljCi12b2lkIEV2YWwxSW5wdXRGbG9hdChjb25zdCBjbXNGbG9hdDMyTnVtYmVyIFZhbHVlW10sCi0gICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIE91dHB1dFtdLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBwKQotewotICAgIGNtc0Zsb2F0MzJOdW1iZXIgeTEsIHkwOwotICAgIGNtc0Zsb2F0MzJOdW1iZXIgdmFsMiwgcmVzdDsKLSAgICBpbnQgY2VsbDAsIGNlbGwxOwotICAgIGNtc1VJbnQzMk51bWJlciBPdXRDaGFuOwotICAgIGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIqIEx1dFRhYmxlID0gKGNtc0Zsb2F0MzJOdW1iZXIqKSBwIC0+VGFibGU7Ci0KLSAgICB2YWwyID0gZmNsYW1wKFZhbHVlWzBdKTsKLQotICAgICAgICAvLyBpZiBsYXN0IHZhbHVlLi4uCi0gICAgICAgaWYgKHZhbDIgPT0gMS4wKSB7Ci0gICAgICAgICAgIE91dHB1dFswXSA9IEx1dFRhYmxlW3AgLT4gRG9tYWluWzBdXTsKLSAgICAgICAgICAgcmV0dXJuOwotICAgICAgIH0KLQotICAgICAgIHZhbDIgKj0gcCAtPiBEb21haW5bMF07Ci0KLSAgICAgICBjZWxsMCA9IChpbnQpIGZsb29yKHZhbDIpOwotICAgICAgIGNlbGwxID0gKGludCkgY2VpbCh2YWwyKTsKLQotICAgICAgIC8vIFJlc3QgaXMgMTYgTFNCIGJpdHMKLSAgICAgICByZXN0ID0gdmFsMiAtIGNlbGwwOwotCi0gICAgICAgY2VsbDAgKj0gcCAtPiBvcHRhWzBdOwotICAgICAgIGNlbGwxICo9IHAgLT4gb3B0YVswXTsKLQotICAgICAgIGZvciAoT3V0Q2hhbj0wOyBPdXRDaGFuIDwgcC0+bk91dHB1dHM7IE91dENoYW4rKykgewotCi0gICAgICAgICAgICB5MCA9IEx1dFRhYmxlW2NlbGwwICsgT3V0Q2hhbl0gOwotICAgICAgICAgICAgeTEgPSBMdXRUYWJsZVtjZWxsMSArIE91dENoYW5dIDsKLQotICAgICAgICAgICAgT3V0cHV0W091dENoYW5dID0geTAgKyAoeTEgLSB5MCkgKiByZXN0OwotICAgICAgIH0KLX0KLQotLy8gQmlsaW5lYXIgaW50ZXJwb2xhdGlvbiAoMTYgYml0cykgLSBjbXNGbG9hdDMyTnVtYmVyIHZlcnNpb24KLXN0YXRpYwotdm9pZCBCaWxpbmVhckludGVycEZsb2F0KGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIgSW5wdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIE91dHB1dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0ludGVycFBhcmFtcyogcCkKLQotewotIyAgIGRlZmluZSBMRVJQKGEsbCxoKSAgICAoY21zRmxvYXQzMk51bWJlcikgKChsKSsoKChoKS0obCkpKihhKSkpCi0jICAgZGVmaW5lIERFTlMoaSxqKSAgICAgIChMdXRUYWJsZVsoaSkrKGopK091dENoYW5dKQotCi0gICAgY29uc3QgY21zRmxvYXQzMk51bWJlciogTHV0VGFibGUgPSAoY21zRmxvYXQzMk51bWJlciopIHAgLT5UYWJsZTsKLSAgICBjbXNGbG9hdDMyTnVtYmVyICAgICAgcHgsIHB5OwotICAgIGludCAgICAgICAgeDAsIHkwLAotICAgICAgICAgICAgICAgWDAsIFkwLCBYMSwgWTE7Ci0gICAgaW50ICAgICAgICBUb3RhbE91dCwgT3V0Q2hhbjsKLSAgICBjbXNGbG9hdDMyTnVtYmVyICAgICAgZngsIGZ5LAotICAgICAgICBkMDAsIGQwMSwgZDEwLCBkMTEsCi0gICAgICAgIGR4MCwgZHgxLAotICAgICAgICBkeHk7Ci0KLSAgICBUb3RhbE91dCAgID0gcCAtPiBuT3V0cHV0czsKLSAgICBweCA9IGZjbGFtcChJbnB1dFswXSkgKiBwLT5Eb21haW5bMF07Ci0gICAgcHkgPSBmY2xhbXAoSW5wdXRbMV0pICogcC0+RG9tYWluWzFdOwotCi0gICAgeDAgPSAoaW50KSBfY21zUXVpY2tGbG9vcihweCk7IGZ4ID0gcHggLSAoY21zRmxvYXQzMk51bWJlcikgeDA7Ci0gICAgeTAgPSAoaW50KSBfY21zUXVpY2tGbG9vcihweSk7IGZ5ID0gcHkgLSAoY21zRmxvYXQzMk51bWJlcikgeTA7Ci0KLSAgICBYMCA9IHAgLT4gb3B0YVsxXSAqIHgwOwotICAgIFgxID0gWDAgKyAoSW5wdXRbMF0gPj0gMS4wID8gMCA6IHAtPm9wdGFbMV0pOwotCi0gICAgWTAgPSBwIC0+IG9wdGFbMF0gKiB5MDsKLSAgICBZMSA9IFkwICsgKElucHV0WzFdID49IDEuMCA/IDAgOiBwLT5vcHRhWzBdKTsKLQotICAgIGZvciAoT3V0Q2hhbiA9IDA7IE91dENoYW4gPCBUb3RhbE91dDsgT3V0Q2hhbisrKSB7Ci0KLSAgICAgICAgZDAwID0gREVOUyhYMCwgWTApOwotICAgICAgICBkMDEgPSBERU5TKFgwLCBZMSk7Ci0gICAgICAgIGQxMCA9IERFTlMoWDEsIFkwKTsKLSAgICAgICAgZDExID0gREVOUyhYMSwgWTEpOwotCi0gICAgICAgIGR4MCA9IExFUlAoZngsIGQwMCwgZDEwKTsKLSAgICAgICAgZHgxID0gTEVSUChmeCwgZDAxLCBkMTEpOwotCi0gICAgICAgIGR4eSA9IExFUlAoZnksIGR4MCwgZHgxKTsKLQotICAgICAgICBPdXRwdXRbT3V0Q2hhbl0gPSBkeHk7Ci0gICAgfQotCi0KLSMgICB1bmRlZiBMRVJQCi0jICAgdW5kZWYgREVOUwotfQotCi0vLyBCaWxpbmVhciBpbnRlcnBvbGF0aW9uICgxNiBiaXRzKSAtIG9wdGltaXplZCB2ZXJzaW9uCi1zdGF0aWMKLXZvaWQgQmlsaW5lYXJJbnRlcnAxNihyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5wdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgT3V0cHV0W10sCi0gICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBwKQotCi17Ci0jZGVmaW5lIERFTlMoaSxqKSAoTHV0VGFibGVbKGkpKyhqKStPdXRDaGFuXSkKLSNkZWZpbmUgTEVSUChhLGwsaCkgICAgIChjbXNVSW50MTZOdW1iZXIpIChsICsgUk9VTkRfRklYRURfVE9fSU5UKCgoaC1sKSphKSkpCi0KLSAgICAgICAgICAgY29uc3QgY21zVUludDE2TnVtYmVyKiBMdXRUYWJsZSA9IChjbXNVSW50MTZOdW1iZXIqKSBwIC0+VGFibGU7Ci0gICAgICAgICAgIGludCAgICAgICAgT3V0Q2hhbiwgVG90YWxPdXQ7Ci0gICAgICAgICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgICAgZngsIGZ5OwotICByZWdpc3RlciBpbnQgICAgICAgIHJ4LCByeTsKLSAgICAgICAgICAgaW50ICAgICAgICB4MCwgeTA7Ci0gIHJlZ2lzdGVyIGludCAgICAgICAgWDAsIFgxLCBZMCwgWTE7Ci0gICAgICAgICAgIGludCAgICAgICAgZDAwLCBkMDEsIGQxMCwgZDExLAotICAgICAgICAgICAgICAgICAgICAgIGR4MCwgZHgxLAotICAgICAgICAgICAgICAgICAgICAgIGR4eTsKLQotICAgIFRvdGFsT3V0ICAgPSBwIC0+IG5PdXRwdXRzOwotCi0gICAgZnggPSBfY21zVG9GaXhlZERvbWFpbigoaW50KSBJbnB1dFswXSAqIHAgLT4gRG9tYWluWzBdKTsKLSAgICB4MCAgPSBGSVhFRF9UT19JTlQoZngpOwotICAgIHJ4ICA9IEZJWEVEX1JFU1RfVE9fSU5UKGZ4KTsgICAgLy8gUmVzdCBpbiAwLi4xLjAgZG9tYWluCi0KLQotICAgIGZ5ID0gX2Ntc1RvRml4ZWREb21haW4oKGludCkgSW5wdXRbMV0gKiBwIC0+IERvbWFpblsxXSk7Ci0gICAgeTAgID0gRklYRURfVE9fSU5UKGZ5KTsKLSAgICByeSAgPSBGSVhFRF9SRVNUX1RPX0lOVChmeSk7Ci0KLQotICAgIFgwID0gcCAtPiBvcHRhWzFdICogeDA7Ci0gICAgWDEgPSBYMCArIChJbnB1dFswXSA9PSAweEZGRkZVID8gMCA6IHAtPm9wdGFbMV0pOwotCi0gICAgWTAgPSBwIC0+IG9wdGFbMF0gKiB5MDsKLSAgICBZMSA9IFkwICsgKElucHV0WzFdID09IDB4RkZGRlUgPyAwIDogcC0+b3B0YVswXSk7Ci0KLSAgICBmb3IgKE91dENoYW4gPSAwOyBPdXRDaGFuIDwgVG90YWxPdXQ7IE91dENoYW4rKykgewotCi0gICAgICAgIGQwMCA9IERFTlMoWDAsIFkwKTsKLSAgICAgICAgZDAxID0gREVOUyhYMCwgWTEpOwotICAgICAgICBkMTAgPSBERU5TKFgxLCBZMCk7Ci0gICAgICAgIGQxMSA9IERFTlMoWDEsIFkxKTsKLQotICAgICAgICBkeDAgPSBMRVJQKHJ4LCBkMDAsIGQxMCk7Ci0gICAgICAgIGR4MSA9IExFUlAocngsIGQwMSwgZDExKTsKLQotICAgICAgICBkeHkgPSBMRVJQKHJ5LCBkeDAsIGR4MSk7Ci0KLSAgICAgICAgT3V0cHV0W091dENoYW5dID0gKGNtc1VJbnQxNk51bWJlcikgZHh5OwotICAgIH0KLQotCi0jICAgdW5kZWYgTEVSUAotIyAgIHVuZGVmIERFTlMKLX0KLQotCi0vLyBUcmlsaW5lYXIgaW50ZXJwb2xhdGlvbiAoMTYgYml0cykgLSBjbXNGbG9hdDMyTnVtYmVyIHZlcnNpb24KLXN0YXRpYwotdm9pZCBUcmlsaW5lYXJJbnRlcnBGbG9hdChjb25zdCBjbXNGbG9hdDMyTnVtYmVyIElucHV0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgT3V0cHV0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0ludGVycFBhcmFtcyogcCkKLQotewotIyAgIGRlZmluZSBMRVJQKGEsbCxoKSAgICAgIChjbXNGbG9hdDMyTnVtYmVyKSAoKGwpKygoKGgpLShsKSkqKGEpKSkKLSMgICBkZWZpbmUgREVOUyhpLGosaykgICAgICAoTHV0VGFibGVbKGkpKyhqKSsoaykrT3V0Q2hhbl0pCi0KLSAgICBjb25zdCBjbXNGbG9hdDMyTnVtYmVyKiBMdXRUYWJsZSA9IChjbXNGbG9hdDMyTnVtYmVyKikgcCAtPlRhYmxlOwotICAgIGNtc0Zsb2F0MzJOdW1iZXIgICAgICBweCwgcHksIHB6OwotICAgIGludCAgICAgICAgeDAsIHkwLCB6MCwKLSAgICAgICAgICAgICAgIFgwLCBZMCwgWjAsIFgxLCBZMSwgWjE7Ci0gICAgaW50ICAgICAgICBUb3RhbE91dCwgT3V0Q2hhbjsKLSAgICBjbXNGbG9hdDMyTnVtYmVyICAgICAgZngsIGZ5LCBmeiwKLSAgICAgICAgZDAwMCwgZDAwMSwgZDAxMCwgZDAxMSwKLSAgICAgICAgZDEwMCwgZDEwMSwgZDExMCwgZDExMSwKLSAgICAgICAgZHgwMCwgZHgwMSwgZHgxMCwgZHgxMSwKLSAgICAgICAgZHh5MCwgZHh5MSwgZHh5ejsKLQotICAgIFRvdGFsT3V0ICAgPSBwIC0+IG5PdXRwdXRzOwotCi0gICAgLy8gV2UgbmVlZCBzb21lIGNsaXBwaW5nIGhlcmUKLSAgICBweCA9IGZjbGFtcChJbnB1dFswXSkgKiBwLT5Eb21haW5bMF07Ci0gICAgcHkgPSBmY2xhbXAoSW5wdXRbMV0pICogcC0+RG9tYWluWzFdOwotICAgIHB6ID0gZmNsYW1wKElucHV0WzJdKSAqIHAtPkRvbWFpblsyXTsKLQotICAgIHgwID0gKGludCkgX2Ntc1F1aWNrRmxvb3IocHgpOyBmeCA9IHB4IC0gKGNtc0Zsb2F0MzJOdW1iZXIpIHgwOwotICAgIHkwID0gKGludCkgX2Ntc1F1aWNrRmxvb3IocHkpOyBmeSA9IHB5IC0gKGNtc0Zsb2F0MzJOdW1iZXIpIHkwOwotICAgIHowID0gKGludCkgX2Ntc1F1aWNrRmxvb3IocHopOyBmeiA9IHB6IC0gKGNtc0Zsb2F0MzJOdW1iZXIpIHowOwotCi0gICAgWDAgPSBwIC0+IG9wdGFbMl0gKiB4MDsKLSAgICBYMSA9IFgwICsgKElucHV0WzBdID49IDEuMCA/IDAgOiBwLT5vcHRhWzJdKTsKLQotICAgIFkwID0gcCAtPiBvcHRhWzFdICogeTA7Ci0gICAgWTEgPSBZMCArIChJbnB1dFsxXSA+PSAxLjAgPyAwIDogcC0+b3B0YVsxXSk7Ci0KLSAgICBaMCA9IHAgLT4gb3B0YVswXSAqIHowOwotICAgIFoxID0gWjAgKyAoSW5wdXRbMl0gPj0gMS4wID8gMCA6IHAtPm9wdGFbMF0pOwotCi0gICAgZm9yIChPdXRDaGFuID0gMDsgT3V0Q2hhbiA8IFRvdGFsT3V0OyBPdXRDaGFuKyspIHsKLQotICAgICAgICBkMDAwID0gREVOUyhYMCwgWTAsIFowKTsKLSAgICAgICAgZDAwMSA9IERFTlMoWDAsIFkwLCBaMSk7Ci0gICAgICAgIGQwMTAgPSBERU5TKFgwLCBZMSwgWjApOwotICAgICAgICBkMDExID0gREVOUyhYMCwgWTEsIFoxKTsKLQotICAgICAgICBkMTAwID0gREVOUyhYMSwgWTAsIFowKTsKLSAgICAgICAgZDEwMSA9IERFTlMoWDEsIFkwLCBaMSk7Ci0gICAgICAgIGQxMTAgPSBERU5TKFgxLCBZMSwgWjApOwotICAgICAgICBkMTExID0gREVOUyhYMSwgWTEsIFoxKTsKLQotCi0gICAgICAgIGR4MDAgPSBMRVJQKGZ4LCBkMDAwLCBkMTAwKTsKLSAgICAgICAgZHgwMSA9IExFUlAoZngsIGQwMDEsIGQxMDEpOwotICAgICAgICBkeDEwID0gTEVSUChmeCwgZDAxMCwgZDExMCk7Ci0gICAgICAgIGR4MTEgPSBMRVJQKGZ4LCBkMDExLCBkMTExKTsKLQotICAgICAgICBkeHkwID0gTEVSUChmeSwgZHgwMCwgZHgxMCk7Ci0gICAgICAgIGR4eTEgPSBMRVJQKGZ5LCBkeDAxLCBkeDExKTsKLQotICAgICAgICBkeHl6ID0gTEVSUChmeiwgZHh5MCwgZHh5MSk7Ci0KLSAgICAgICAgT3V0cHV0W091dENoYW5dID0gZHh5ejsKLSAgICB9Ci0KLQotIyAgIHVuZGVmIExFUlAKLSMgICB1bmRlZiBERU5TCi19Ci0KLS8vIFRyaWxpbmVhciBpbnRlcnBvbGF0aW9uICgxNiBiaXRzKSAtIG9wdGltaXplZCB2ZXJzaW9uCi1zdGF0aWMKLXZvaWQgVHJpbGluZWFySW50ZXJwMTYocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIElucHV0W10sCi0gICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciBPdXRwdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBwKQotCi17Ci0jZGVmaW5lIERFTlMoaSxqLGspIChMdXRUYWJsZVsoaSkrKGopKyhrKStPdXRDaGFuXSkKLSNkZWZpbmUgTEVSUChhLGwsaCkgICAgIChjbXNVSW50MTZOdW1iZXIpIChsICsgUk9VTkRfRklYRURfVE9fSU5UKCgoaC1sKSphKSkpCi0KLSAgICAgICAgICAgY29uc3QgY21zVUludDE2TnVtYmVyKiBMdXRUYWJsZSA9IChjbXNVSW50MTZOdW1iZXIqKSBwIC0+VGFibGU7Ci0gICAgICAgICAgIGludCAgICAgICAgT3V0Q2hhbiwgVG90YWxPdXQ7Ci0gICAgICAgICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgICAgZngsIGZ5LCBmejsKLSAgcmVnaXN0ZXIgaW50ICAgICAgICByeCwgcnksIHJ6OwotICAgICAgICAgICBpbnQgICAgICAgIHgwLCB5MCwgejA7Ci0gIHJlZ2lzdGVyIGludCAgICAgICAgWDAsIFgxLCBZMCwgWTEsIFowLCBaMTsKLSAgICAgICAgICAgaW50ICAgICAgICBkMDAwLCBkMDAxLCBkMDEwLCBkMDExLAotICAgICAgICAgICAgICAgICAgICAgIGQxMDAsIGQxMDEsIGQxMTAsIGQxMTEsCi0gICAgICAgICAgICAgICAgICAgICAgZHgwMCwgZHgwMSwgZHgxMCwgZHgxMSwKLSAgICAgICAgICAgICAgICAgICAgICBkeHkwLCBkeHkxLCBkeHl6OwotCi0gICAgVG90YWxPdXQgICA9IHAgLT4gbk91dHB1dHM7Ci0KLSAgICBmeCA9IF9jbXNUb0ZpeGVkRG9tYWluKChpbnQpIElucHV0WzBdICogcCAtPiBEb21haW5bMF0pOwotICAgIHgwICA9IEZJWEVEX1RPX0lOVChmeCk7Ci0gICAgcnggID0gRklYRURfUkVTVF9UT19JTlQoZngpOyAgICAvLyBSZXN0IGluIDAuLjEuMCBkb21haW4KLQotCi0gICAgZnkgPSBfY21zVG9GaXhlZERvbWFpbigoaW50KSBJbnB1dFsxXSAqIHAgLT4gRG9tYWluWzFdKTsKLSAgICB5MCAgPSBGSVhFRF9UT19JTlQoZnkpOwotICAgIHJ5ICA9IEZJWEVEX1JFU1RfVE9fSU5UKGZ5KTsKLQotICAgIGZ6ID0gX2Ntc1RvRml4ZWREb21haW4oKGludCkgSW5wdXRbMl0gKiBwIC0+IERvbWFpblsyXSk7Ci0gICAgejAgPSBGSVhFRF9UT19JTlQoZnopOwotICAgIHJ6ID0gRklYRURfUkVTVF9UT19JTlQoZnopOwotCi0KLSAgICBYMCA9IHAgLT4gb3B0YVsyXSAqIHgwOwotICAgIFgxID0gWDAgKyAoSW5wdXRbMF0gPT0gMHhGRkZGVSA/IDAgOiBwLT5vcHRhWzJdKTsKLQotICAgIFkwID0gcCAtPiBvcHRhWzFdICogeTA7Ci0gICAgWTEgPSBZMCArIChJbnB1dFsxXSA9PSAweEZGRkZVID8gMCA6IHAtPm9wdGFbMV0pOwotCi0gICAgWjAgPSBwIC0+IG9wdGFbMF0gKiB6MDsKLSAgICBaMSA9IFowICsgKElucHV0WzJdID09IDB4RkZGRlUgPyAwIDogcC0+b3B0YVswXSk7Ci0KLSAgICBmb3IgKE91dENoYW4gPSAwOyBPdXRDaGFuIDwgVG90YWxPdXQ7IE91dENoYW4rKykgewotCi0gICAgICAgIGQwMDAgPSBERU5TKFgwLCBZMCwgWjApOwotICAgICAgICBkMDAxID0gREVOUyhYMCwgWTAsIFoxKTsKLSAgICAgICAgZDAxMCA9IERFTlMoWDAsIFkxLCBaMCk7Ci0gICAgICAgIGQwMTEgPSBERU5TKFgwLCBZMSwgWjEpOwotCi0gICAgICAgIGQxMDAgPSBERU5TKFgxLCBZMCwgWjApOwotICAgICAgICBkMTAxID0gREVOUyhYMSwgWTAsIFoxKTsKLSAgICAgICAgZDExMCA9IERFTlMoWDEsIFkxLCBaMCk7Ci0gICAgICAgIGQxMTEgPSBERU5TKFgxLCBZMSwgWjEpOwotCi0KLSAgICAgICAgZHgwMCA9IExFUlAocngsIGQwMDAsIGQxMDApOwotICAgICAgICBkeDAxID0gTEVSUChyeCwgZDAwMSwgZDEwMSk7Ci0gICAgICAgIGR4MTAgPSBMRVJQKHJ4LCBkMDEwLCBkMTEwKTsKLSAgICAgICAgZHgxMSA9IExFUlAocngsIGQwMTEsIGQxMTEpOwotCi0gICAgICAgIGR4eTAgPSBMRVJQKHJ5LCBkeDAwLCBkeDEwKTsKLSAgICAgICAgZHh5MSA9IExFUlAocnksIGR4MDEsIGR4MTEpOwotCi0gICAgICAgIGR4eXogPSBMRVJQKHJ6LCBkeHkwLCBkeHkxKTsKLQotICAgICAgICBPdXRwdXRbT3V0Q2hhbl0gPSAoY21zVUludDE2TnVtYmVyKSBkeHl6OwotICAgIH0KLQotCi0jICAgdW5kZWYgTEVSUAotIyAgIHVuZGVmIERFTlMKLX0KLQotCi0vLyBUZXRyYWhlZHJhbCBpbnRlcnBvbGF0aW9uLCB1c2luZyBTYWthbW90byBhbGdvcml0aG0uCi0jZGVmaW5lIERFTlMoaSxqLGspIChMdXRUYWJsZVsoaSkrKGopKyhrKStPdXRDaGFuXSkKLXN0YXRpYwotdm9pZCBUZXRyYWhlZHJhbEludGVycEZsb2F0KGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIgSW5wdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIE91dHB1dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0ludGVycFBhcmFtcyogcCkKLXsKLSAgICBjb25zdCBjbXNGbG9hdDMyTnVtYmVyKiBMdXRUYWJsZSA9IChjbXNGbG9hdDMyTnVtYmVyKikgcCAtPiBUYWJsZTsKLSAgICBjbXNGbG9hdDMyTnVtYmVyICAgICBweCwgcHksIHB6OwotICAgIGludCAgICAgICAgeDAsIHkwLCB6MCwKLSAgICAgICAgICAgICAgIFgwLCBZMCwgWjAsIFgxLCBZMSwgWjE7Ci0gICAgY21zRmxvYXQzMk51bWJlciAgICAgcngsIHJ5LCByejsKLSAgICBjbXNGbG9hdDMyTnVtYmVyICAgICBjMCwgYzE9MCwgYzI9MCwgYzM9MDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICBPdXRDaGFuLCBUb3RhbE91dDsKLQotICAgIFRvdGFsT3V0ICAgPSBwIC0+IG5PdXRwdXRzOwotCi0gICAgLy8gV2UgbmVlZCBzb21lIGNsaXBwaW5nIGhlcmUKLSAgICBweCA9IGZjbGFtcChJbnB1dFswXSkgKiBwLT5Eb21haW5bMF07Ci0gICAgcHkgPSBmY2xhbXAoSW5wdXRbMV0pICogcC0+RG9tYWluWzFdOwotICAgIHB6ID0gZmNsYW1wKElucHV0WzJdKSAqIHAtPkRvbWFpblsyXTsKLQotICAgIHgwID0gKGludCkgX2Ntc1F1aWNrRmxvb3IocHgpOyByeCA9IChweCAtIChjbXNGbG9hdDMyTnVtYmVyKSB4MCk7Ci0gICAgeTAgPSAoaW50KSBfY21zUXVpY2tGbG9vcihweSk7IHJ5ID0gKHB5IC0gKGNtc0Zsb2F0MzJOdW1iZXIpIHkwKTsKLSAgICB6MCA9IChpbnQpIF9jbXNRdWlja0Zsb29yKHB6KTsgcnogPSAocHogLSAoY21zRmxvYXQzMk51bWJlcikgejApOwotCi0KLSAgICBYMCA9IHAgLT4gb3B0YVsyXSAqIHgwOwotICAgIFgxID0gWDAgKyAoSW5wdXRbMF0gPj0gMS4wID8gMCA6IHAtPm9wdGFbMl0pOwotCi0gICAgWTAgPSBwIC0+IG9wdGFbMV0gKiB5MDsKLSAgICBZMSA9IFkwICsgKElucHV0WzFdID49IDEuMCA/IDAgOiBwLT5vcHRhWzFdKTsKLQotICAgIFowID0gcCAtPiBvcHRhWzBdICogejA7Ci0gICAgWjEgPSBaMCArIChJbnB1dFsyXSA+PSAxLjAgPyAwIDogcC0+b3B0YVswXSk7Ci0KLSAgICBmb3IgKE91dENoYW49MDsgT3V0Q2hhbiA8IFRvdGFsT3V0OyBPdXRDaGFuKyspIHsKLQotICAgICAgIC8vIFRoZXNlIGFyZSB0aGUgNiBUZXRyYWhlZHJhbAotCi0gICAgICAgIGMwID0gREVOUyhYMCwgWTAsIFowKTsKLQotICAgICAgICBpZiAocnggPj0gcnkgJiYgcnkgPj0gcnopIHsKLQotICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMCwgWjApIC0gYzA7Ci0gICAgICAgICAgICBjMiA9IERFTlMoWDEsIFkxLCBaMCkgLSBERU5TKFgxLCBZMCwgWjApOwotICAgICAgICAgICAgYzMgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMSwgWTEsIFowKTsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGlmIChyeCA+PSByeiAmJiByeiA+PSByeSkgewotCi0gICAgICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMCwgWjApIC0gYzA7Ci0gICAgICAgICAgICAgICAgYzIgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMSwgWTAsIFoxKTsKLSAgICAgICAgICAgICAgICBjMyA9IERFTlMoWDEsIFkwLCBaMSkgLSBERU5TKFgxLCBZMCwgWjApOwotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgaWYgKHJ6ID49IHJ4ICYmIHJ4ID49IHJ5KSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMCwgWjEpIC0gREVOUyhYMCwgWTAsIFoxKTsKLSAgICAgICAgICAgICAgICAgICAgYzIgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMSwgWTAsIFoxKTsKLSAgICAgICAgICAgICAgICAgICAgYzMgPSBERU5TKFgwLCBZMCwgWjEpIC0gYzA7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBpZiAocnkgPj0gcnggJiYgcnggPj0gcnopIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMSwgWjApIC0gREVOUyhYMCwgWTEsIFowKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMyID0gREVOUyhYMCwgWTEsIFowKSAtIGMwOwotICAgICAgICAgICAgICAgICAgICAgICAgYzMgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMSwgWTEsIFowKTsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyeSA+PSByeiAmJiByeiA+PSByeCkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMCwgWTEsIFoxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMiA9IERFTlMoWDAsIFkxLCBaMCkgLSBjMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMyA9IERFTlMoWDAsIFkxLCBaMSkgLSBERU5TKFgwLCBZMSwgWjApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ6ID49IHJ5ICYmIHJ5ID49IHJ4KSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMCwgWTEsIFoxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzIgPSBERU5TKFgwLCBZMSwgWjEpIC0gREVOUyhYMCwgWTAsIFoxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzMgPSBERU5TKFgwLCBZMCwgWjEpIC0gYzA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMSA9IGMyID0gYzMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgIE91dHB1dFtPdXRDaGFuXSA9IGMwICsgYzEgKiByeCArIGMyICogcnkgKyBjMyAqIHJ6OwotICAgICAgIH0KLQotfQotCi0jdW5kZWYgREVOUwotCi0KLQotCi1zdGF0aWMKLXZvaWQgVGV0cmFoZWRyYWxJbnRlcnAxNihyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5wdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgT3V0cHV0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBwKQotewotICAgIGNvbnN0IGNtc1VJbnQxNk51bWJlciogTHV0VGFibGUgPSAoY21zVUludDE2TnVtYmVyKikgcCAtPiBUYWJsZTsKLSAgICBjbXNTMTVGaXhlZDE2TnVtYmVyIGZ4LCBmeSwgZno7Ci0gICAgY21zUzE1Rml4ZWQxNk51bWJlciByeCwgcnksIHJ6OwotICAgIGludCB4MCwgeTAsIHowOwotICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgYzAsIGMxLCBjMiwgYzMsIFJlc3Q7Ci0gICAgY21zUzE1Rml4ZWQxNk51bWJlciBYMCwgWDEsIFkwLCBZMSwgWjAsIFoxOwotICAgIGNtc1VJbnQzMk51bWJlciBUb3RhbE91dCA9IHAgLT4gbk91dHB1dHM7Ci0KLSAgICBmeCA9IF9jbXNUb0ZpeGVkRG9tYWluKChpbnQpIElucHV0WzBdICogcCAtPiBEb21haW5bMF0pOwotICAgIGZ5ID0gX2Ntc1RvRml4ZWREb21haW4oKGludCkgSW5wdXRbMV0gKiBwIC0+IERvbWFpblsxXSk7Ci0gICAgZnogPSBfY21zVG9GaXhlZERvbWFpbigoaW50KSBJbnB1dFsyXSAqIHAgLT4gRG9tYWluWzJdKTsKLQotICAgIHgwID0gRklYRURfVE9fSU5UKGZ4KTsKLSAgICB5MCA9IEZJWEVEX1RPX0lOVChmeSk7Ci0gICAgejAgPSBGSVhFRF9UT19JTlQoZnopOwotCi0gICAgcnggPSBGSVhFRF9SRVNUX1RPX0lOVChmeCk7Ci0gICAgcnkgPSBGSVhFRF9SRVNUX1RPX0lOVChmeSk7Ci0gICAgcnogPSBGSVhFRF9SRVNUX1RPX0lOVChmeik7Ci0KLSAgICBYMCA9IHAgLT4gb3B0YVsyXSAqIHgwOwotICAgIFgxID0gKElucHV0WzBdID09IDB4RkZGRlUgPyAwIDogcC0+b3B0YVsyXSk7Ci0KLSAgICBZMCA9IHAgLT4gb3B0YVsxXSAqIHkwOwotICAgIFkxID0gKElucHV0WzFdID09IDB4RkZGRlUgPyAwIDogcC0+b3B0YVsxXSk7Ci0KLSAgICBaMCA9IHAgLT4gb3B0YVswXSAqIHowOwotICAgIFoxID0gKElucHV0WzJdID09IDB4RkZGRlUgPyAwIDogcC0+b3B0YVswXSk7Ci0KLSAgICBMdXRUYWJsZSA9ICZMdXRUYWJsZVtYMCtZMCtaMF07Ci0KLSAgICAvLyBPdXRwdXQgc2hvdWxkIGJlIGNvbXB1dGVkIGFzIHggPSBST1VORF9GSVhFRF9UT19JTlQoX2Ntc1RvRml4ZWREb21haW4oUmVzdCkpCi0gICAgLy8gd2hpY2ggZXhwYW5kcyBhczogeCA9IChSZXN0ICsgKChSZXN0KzB4N2ZmZikvMHhGRkZGKSArIDB4ODAwMCk+PjE2Ci0gICAgLy8gVGhpcyBjYW4gYmUgcmVwbGFjZWQgYnk6IHQgPSBSZXN0KzB4ODAwMSwgeCA9ICh0ICsgKHQ+PjE2KSk+PjE2Ci0gICAgLy8gYXQgdGhlIGNvc3Qgb2YgYmVpbmcgb2ZmIGJ5IG9uZSBhdCA3ZmZmIGFuZCAxN2ZmZS4KLQotICAgIGlmIChyeCA+PSByeSkgewotICAgICAgICBpZiAocnkgPj0gcnopIHsKLSAgICAgICAgICAgIFkxICs9IFgxOwotICAgICAgICAgICAgWjEgKz0gWTE7Ci0gICAgICAgICAgICBmb3IgKDsgVG90YWxPdXQ7IFRvdGFsT3V0LS0pIHsKLSAgICAgICAgICAgICAgICBjMSA9IEx1dFRhYmxlW1gxXTsKLSAgICAgICAgICAgICAgICBjMiA9IEx1dFRhYmxlW1kxXTsKLSAgICAgICAgICAgICAgICBjMyA9IEx1dFRhYmxlW1oxXTsKLSAgICAgICAgICAgICAgICBjMCA9ICpMdXRUYWJsZSsrOwotICAgICAgICAgICAgICAgIGMzIC09IGMyOwotICAgICAgICAgICAgICAgIGMyIC09IGMxOwotICAgICAgICAgICAgICAgIGMxIC09IGMwOwotICAgICAgICAgICAgICAgIFJlc3QgPSBjMSAqIHJ4ICsgYzIgKiByeSArIGMzICogcnogKyAweDgwMDE7Ci0gICAgICAgICAgICAgICAgKk91dHB1dCsrID0gKGNtc1VJbnQxNk51bWJlcikgYzAgKyAoKFJlc3QgKyAoUmVzdD4+MTYpKT4+MTYpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHJ6ID49IHJ4KSB7Ci0gICAgICAgICAgICBYMSArPSBaMTsKLSAgICAgICAgICAgIFkxICs9IFgxOwotICAgICAgICAgICAgZm9yICg7IFRvdGFsT3V0OyBUb3RhbE91dC0tKSB7Ci0gICAgICAgICAgICAgICAgYzEgPSBMdXRUYWJsZVtYMV07Ci0gICAgICAgICAgICAgICAgYzIgPSBMdXRUYWJsZVtZMV07Ci0gICAgICAgICAgICAgICAgYzMgPSBMdXRUYWJsZVtaMV07Ci0gICAgICAgICAgICAgICAgYzAgPSAqTHV0VGFibGUrKzsKLSAgICAgICAgICAgICAgICBjMiAtPSBjMTsKLSAgICAgICAgICAgICAgICBjMSAtPSBjMzsKLSAgICAgICAgICAgICAgICBjMyAtPSBjMDsKLSAgICAgICAgICAgICAgICBSZXN0ID0gYzEgKiByeCArIGMyICogcnkgKyBjMyAqIHJ6ICsgMHg4MDAxOwotICAgICAgICAgICAgICAgICpPdXRwdXQrKyA9IChjbXNVSW50MTZOdW1iZXIpIGMwICsgKChSZXN0ICsgKFJlc3Q+PjE2KSk+PjE2KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFoxICs9IFgxOwotICAgICAgICAgICAgWTEgKz0gWjE7Ci0gICAgICAgICAgICBmb3IgKDsgVG90YWxPdXQ7IFRvdGFsT3V0LS0pIHsKLSAgICAgICAgICAgICAgICBjMSA9IEx1dFRhYmxlW1gxXTsKLSAgICAgICAgICAgICAgICBjMiA9IEx1dFRhYmxlW1kxXTsKLSAgICAgICAgICAgICAgICBjMyA9IEx1dFRhYmxlW1oxXTsKLSAgICAgICAgICAgICAgICBjMCA9ICpMdXRUYWJsZSsrOwotICAgICAgICAgICAgICAgIGMyIC09IGMzOwotICAgICAgICAgICAgICAgIGMzIC09IGMxOwotICAgICAgICAgICAgICAgIGMxIC09IGMwOwotICAgICAgICAgICAgICAgIFJlc3QgPSBjMSAqIHJ4ICsgYzIgKiByeSArIGMzICogcnogKyAweDgwMDE7Ci0gICAgICAgICAgICAgICAgKk91dHB1dCsrID0gKGNtc1VJbnQxNk51bWJlcikgYzAgKyAoKFJlc3QgKyAoUmVzdD4+MTYpKT4+MTYpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHJ4ID49IHJ6KSB7Ci0gICAgICAgICAgICBYMSArPSBZMTsKLSAgICAgICAgICAgIFoxICs9IFgxOwotICAgICAgICAgICAgZm9yICg7IFRvdGFsT3V0OyBUb3RhbE91dC0tKSB7Ci0gICAgICAgICAgICAgICAgYzEgPSBMdXRUYWJsZVtYMV07Ci0gICAgICAgICAgICAgICAgYzIgPSBMdXRUYWJsZVtZMV07Ci0gICAgICAgICAgICAgICAgYzMgPSBMdXRUYWJsZVtaMV07Ci0gICAgICAgICAgICAgICAgYzAgPSAqTHV0VGFibGUrKzsKLSAgICAgICAgICAgICAgICBjMyAtPSBjMTsKLSAgICAgICAgICAgICAgICBjMSAtPSBjMjsKLSAgICAgICAgICAgICAgICBjMiAtPSBjMDsKLSAgICAgICAgICAgICAgICBSZXN0ID0gYzEgKiByeCArIGMyICogcnkgKyBjMyAqIHJ6ICsgMHg4MDAxOwotICAgICAgICAgICAgICAgICpPdXRwdXQrKyA9IChjbXNVSW50MTZOdW1iZXIpIGMwICsgKChSZXN0ICsgKFJlc3Q+PjE2KSk+PjE2KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChyeSA+PSByeikgewotICAgICAgICAgICAgWjEgKz0gWTE7Ci0gICAgICAgICAgICBYMSArPSBaMTsKLSAgICAgICAgICAgIGZvciAoOyBUb3RhbE91dDsgVG90YWxPdXQtLSkgewotICAgICAgICAgICAgICAgIGMxID0gTHV0VGFibGVbWDFdOwotICAgICAgICAgICAgICAgIGMyID0gTHV0VGFibGVbWTFdOwotICAgICAgICAgICAgICAgIGMzID0gTHV0VGFibGVbWjFdOwotICAgICAgICAgICAgICAgIGMwID0gKkx1dFRhYmxlKys7Ci0gICAgICAgICAgICAgICAgYzEgLT0gYzM7Ci0gICAgICAgICAgICAgICAgYzMgLT0gYzI7Ci0gICAgICAgICAgICAgICAgYzIgLT0gYzA7Ci0gICAgICAgICAgICAgICAgUmVzdCA9IGMxICogcnggKyBjMiAqIHJ5ICsgYzMgKiByeiArIDB4ODAwMTsKLSAgICAgICAgICAgICAgICAqT3V0cHV0KysgPSAoY21zVUludDE2TnVtYmVyKSBjMCArICgoUmVzdCArIChSZXN0Pj4xNikpPj4xNik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBZMSArPSBaMTsKLSAgICAgICAgICAgIFgxICs9IFkxOwotICAgICAgICAgICAgZm9yICg7IFRvdGFsT3V0OyBUb3RhbE91dC0tKSB7Ci0gICAgICAgICAgICAgICAgYzEgPSBMdXRUYWJsZVtYMV07Ci0gICAgICAgICAgICAgICAgYzIgPSBMdXRUYWJsZVtZMV07Ci0gICAgICAgICAgICAgICAgYzMgPSBMdXRUYWJsZVtaMV07Ci0gICAgICAgICAgICAgICAgYzAgPSAqTHV0VGFibGUrKzsKLSAgICAgICAgICAgICAgICBjMSAtPSBjMjsKLSAgICAgICAgICAgICAgICBjMiAtPSBjMzsKLSAgICAgICAgICAgICAgICBjMyAtPSBjMDsKLSAgICAgICAgICAgICAgICBSZXN0ID0gYzEgKiByeCArIGMyICogcnkgKyBjMyAqIHJ6ICsgMHg4MDAxOwotICAgICAgICAgICAgICAgICpPdXRwdXQrKyA9IChjbXNVSW50MTZOdW1iZXIpIGMwICsgKChSZXN0ICsgKFJlc3Q+PjE2KSk+PjE2KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotCi0jZGVmaW5lIERFTlMoaSxqLGspIChMdXRUYWJsZVsoaSkrKGopKyhrKStPdXRDaGFuXSkKLXN0YXRpYwotdm9pZCBFdmFsNElucHV0cyhyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5wdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciBPdXRwdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNvbnN0IGNtc0ludGVycFBhcmFtcyogcDE2KQotewotICAgIGNvbnN0IGNtc1VJbnQxNk51bWJlciogTHV0VGFibGU7Ci0gICAgY21zUzE1Rml4ZWQxNk51bWJlciBmazsKLSAgICBjbXNTMTVGaXhlZDE2TnVtYmVyIGswLCByazsKLSAgICBpbnQgSzAsIEsxOwotICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgICAgZngsIGZ5LCBmejsKLSAgICBjbXNTMTVGaXhlZDE2TnVtYmVyICAgIHJ4LCByeSwgcno7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICB4MCwgeTAsIHowOwotICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgICAgWDAsIFgxLCBZMCwgWTEsIFowLCBaMTsKLSAgICBjbXNVSW50MzJOdW1iZXIgaTsKLSAgICBjbXNTMTVGaXhlZDE2TnVtYmVyICAgIGMwLCBjMSwgYzIsIGMzLCBSZXN0OwotICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgT3V0Q2hhbjsKLSAgICBjbXNVSW50MTZOdW1iZXIgICAgICAgIFRtcDFbTUFYX1NUQUdFX0NIQU5ORUxTXSwgVG1wMltNQVhfU1RBR0VfQ0hBTk5FTFNdOwotCi0KLSAgICBmayAgPSBfY21zVG9GaXhlZERvbWFpbigoaW50KSBJbnB1dFswXSAqIHAxNiAtPiBEb21haW5bMF0pOwotICAgIGZ4ICA9IF9jbXNUb0ZpeGVkRG9tYWluKChpbnQpIElucHV0WzFdICogcDE2IC0+IERvbWFpblsxXSk7Ci0gICAgZnkgID0gX2Ntc1RvRml4ZWREb21haW4oKGludCkgSW5wdXRbMl0gKiBwMTYgLT4gRG9tYWluWzJdKTsKLSAgICBmeiAgPSBfY21zVG9GaXhlZERvbWFpbigoaW50KSBJbnB1dFszXSAqIHAxNiAtPiBEb21haW5bM10pOwotCi0gICAgazAgID0gRklYRURfVE9fSU5UKGZrKTsKLSAgICB4MCAgPSBGSVhFRF9UT19JTlQoZngpOwotICAgIHkwICA9IEZJWEVEX1RPX0lOVChmeSk7Ci0gICAgejAgID0gRklYRURfVE9fSU5UKGZ6KTsKLQotICAgIHJrICA9IEZJWEVEX1JFU1RfVE9fSU5UKGZrKTsKLSAgICByeCAgPSBGSVhFRF9SRVNUX1RPX0lOVChmeCk7Ci0gICAgcnkgID0gRklYRURfUkVTVF9UT19JTlQoZnkpOwotICAgIHJ6ICA9IEZJWEVEX1JFU1RfVE9fSU5UKGZ6KTsKLQotICAgIEswID0gcDE2IC0+IG9wdGFbM10gKiBrMDsKLSAgICBLMSA9IEswICsgKElucHV0WzBdID09IDB4RkZGRlUgPyAwIDogcDE2LT5vcHRhWzNdKTsKLQotICAgIFgwID0gcDE2IC0+IG9wdGFbMl0gKiB4MDsKLSAgICBYMSA9IFgwICsgKElucHV0WzFdID09IDB4RkZGRlUgPyAwIDogcDE2LT5vcHRhWzJdKTsKLQotICAgIFkwID0gcDE2IC0+IG9wdGFbMV0gKiB5MDsKLSAgICBZMSA9IFkwICsgKElucHV0WzJdID09IDB4RkZGRlUgPyAwIDogcDE2LT5vcHRhWzFdKTsKLQotICAgIFowID0gcDE2IC0+IG9wdGFbMF0gKiB6MDsKLSAgICBaMSA9IFowICsgKElucHV0WzNdID09IDB4RkZGRlUgPyAwIDogcDE2LT5vcHRhWzBdKTsKLQotICAgIEx1dFRhYmxlID0gKGNtc1VJbnQxNk51bWJlciopIHAxNiAtPiBUYWJsZTsKLSAgICBMdXRUYWJsZSArPSBLMDsKLQotICAgIGZvciAoT3V0Q2hhbj0wOyBPdXRDaGFuIDwgcDE2IC0+IG5PdXRwdXRzOyBPdXRDaGFuKyspIHsKLQotICAgICAgICBjMCA9IERFTlMoWDAsIFkwLCBaMCk7Ci0KLSAgICAgICAgaWYgKHJ4ID49IHJ5ICYmIHJ5ID49IHJ6KSB7Ci0KLSAgICAgICAgICAgIGMxID0gREVOUyhYMSwgWTAsIFowKSAtIGMwOwotICAgICAgICAgICAgYzIgPSBERU5TKFgxLCBZMSwgWjApIC0gREVOUyhYMSwgWTAsIFowKTsKLSAgICAgICAgICAgIGMzID0gREVOUyhYMSwgWTEsIFoxKSAtIERFTlMoWDEsIFkxLCBaMCk7Ci0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpZiAocnggPj0gcnogJiYgcnogPj0gcnkpIHsKLQotICAgICAgICAgICAgICAgIGMxID0gREVOUyhYMSwgWTAsIFowKSAtIGMwOwotICAgICAgICAgICAgICAgIGMyID0gREVOUyhYMSwgWTEsIFoxKSAtIERFTlMoWDEsIFkwLCBaMSk7Ci0gICAgICAgICAgICAgICAgYzMgPSBERU5TKFgxLCBZMCwgWjEpIC0gREVOUyhYMSwgWTAsIFowKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGlmIChyeiA+PSByeCAmJiByeCA+PSByeSkgewotCi0gICAgICAgICAgICAgICAgICAgIGMxID0gREVOUyhYMSwgWTAsIFoxKSAtIERFTlMoWDAsIFkwLCBaMSk7Ci0gICAgICAgICAgICAgICAgICAgIGMyID0gREVOUyhYMSwgWTEsIFoxKSAtIERFTlMoWDEsIFkwLCBaMSk7Ci0gICAgICAgICAgICAgICAgICAgIGMzID0gREVOUyhYMCwgWTAsIFoxKSAtIGMwOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJ5ID49IHJ4ICYmIHJ4ID49IHJ6KSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGMxID0gREVOUyhYMSwgWTEsIFowKSAtIERFTlMoWDAsIFkxLCBaMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjMiA9IERFTlMoWDAsIFkxLCBaMCkgLSBjMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMzID0gREVOUyhYMSwgWTEsIFoxKSAtIERFTlMoWDEsIFkxLCBaMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnkgPj0gcnogJiYgcnogPj0gcngpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMxID0gREVOUyhYMSwgWTEsIFoxKSAtIERFTlMoWDAsIFkxLCBaMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzIgPSBERU5TKFgwLCBZMSwgWjApIC0gYzA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzMgPSBERU5TKFgwLCBZMSwgWjEpIC0gREVOUyhYMCwgWTEsIFowKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyeiA+PSByeSAmJiByeSA+PSByeCkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMxID0gREVOUyhYMSwgWTEsIFoxKSAtIERFTlMoWDAsIFkxLCBaMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMyID0gREVOUyhYMCwgWTEsIFoxKSAtIERFTlMoWDAsIFkwLCBaMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMzID0gREVOUyhYMCwgWTAsIFoxKSAtIGMwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzEgPSBjMiA9IGMzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN0ID0gYzEgKiByeCArIGMyICogcnkgKyBjMyAqIHJ6OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG1wMVtPdXRDaGFuXSA9IChjbXNVSW50MTZOdW1iZXIpIGMwICsgUk9VTkRfRklYRURfVE9fSU5UKF9jbXNUb0ZpeGVkRG9tYWluKFJlc3QpKTsKLSAgICB9Ci0KLQotICAgIEx1dFRhYmxlID0gKGNtc1VJbnQxNk51bWJlciopIHAxNiAtPiBUYWJsZTsKLSAgICBMdXRUYWJsZSArPSBLMTsKLQotICAgIGZvciAoT3V0Q2hhbj0wOyBPdXRDaGFuIDwgcDE2IC0+IG5PdXRwdXRzOyBPdXRDaGFuKyspIHsKLQotICAgICAgICBjMCA9IERFTlMoWDAsIFkwLCBaMCk7Ci0KLSAgICAgICAgaWYgKHJ4ID49IHJ5ICYmIHJ5ID49IHJ6KSB7Ci0KLSAgICAgICAgICAgIGMxID0gREVOUyhYMSwgWTAsIFowKSAtIGMwOwotICAgICAgICAgICAgYzIgPSBERU5TKFgxLCBZMSwgWjApIC0gREVOUyhYMSwgWTAsIFowKTsKLSAgICAgICAgICAgIGMzID0gREVOUyhYMSwgWTEsIFoxKSAtIERFTlMoWDEsIFkxLCBaMCk7Ci0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpZiAocnggPj0gcnogJiYgcnogPj0gcnkpIHsKLQotICAgICAgICAgICAgICAgIGMxID0gREVOUyhYMSwgWTAsIFowKSAtIGMwOwotICAgICAgICAgICAgICAgIGMyID0gREVOUyhYMSwgWTEsIFoxKSAtIERFTlMoWDEsIFkwLCBaMSk7Ci0gICAgICAgICAgICAgICAgYzMgPSBERU5TKFgxLCBZMCwgWjEpIC0gREVOUyhYMSwgWTAsIFowKTsKLQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGlmIChyeiA+PSByeCAmJiByeCA+PSByeSkgewotCi0gICAgICAgICAgICAgICAgICAgIGMxID0gREVOUyhYMSwgWTAsIFoxKSAtIERFTlMoWDAsIFkwLCBaMSk7Ci0gICAgICAgICAgICAgICAgICAgIGMyID0gREVOUyhYMSwgWTEsIFoxKSAtIERFTlMoWDEsIFkwLCBaMSk7Ci0gICAgICAgICAgICAgICAgICAgIGMzID0gREVOUyhYMCwgWTAsIFoxKSAtIGMwOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJ5ID49IHJ4ICYmIHJ4ID49IHJ6KSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGMxID0gREVOUyhYMSwgWTEsIFowKSAtIERFTlMoWDAsIFkxLCBaMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjMiA9IERFTlMoWDAsIFkxLCBaMCkgLSBjMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMzID0gREVOUyhYMSwgWTEsIFoxKSAtIERFTlMoWDEsIFkxLCBaMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnkgPj0gcnogJiYgcnogPj0gcngpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMxID0gREVOUyhYMSwgWTEsIFoxKSAtIERFTlMoWDAsIFkxLCBaMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzIgPSBERU5TKFgwLCBZMSwgWjApIC0gYzA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzMgPSBERU5TKFgwLCBZMSwgWjEpIC0gREVOUyhYMCwgWTEsIFowKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyeiA+PSByeSAmJiByeSA+PSByeCkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMxID0gREVOUyhYMSwgWTEsIFoxKSAtIERFTlMoWDAsIFkxLCBaMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMyID0gREVOUyhYMCwgWTEsIFoxKSAtIERFTlMoWDAsIFkwLCBaMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMzID0gREVOUyhYMCwgWTAsIFoxKSAtIGMwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYzEgPSBjMiA9IGMzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN0ID0gYzEgKiByeCArIGMyICogcnkgKyBjMyAqIHJ6OwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVG1wMltPdXRDaGFuXSA9IChjbXNVSW50MTZOdW1iZXIpIGMwICsgUk9VTkRfRklYRURfVE9fSU5UKF9jbXNUb0ZpeGVkRG9tYWluKFJlc3QpKTsKLSAgICB9Ci0KLQotCi0gICAgZm9yIChpPTA7IGkgPCBwMTYgLT4gbk91dHB1dHM7IGkrKykgewotICAgICAgICBPdXRwdXRbaV0gPSBMaW5lYXJJbnRlcnAocmssIFRtcDFbaV0sIFRtcDJbaV0pOwotICAgIH0KLX0KLSN1bmRlZiBERU5TCi0KLQotLy8gRm9yIG1vcmUgdGhhdCAzIGlucHV0cyAoaS5lLiwgQ01ZSykKLS8vIGV2YWx1YXRlIHR3byAzLWRpbWVuc2lvbmFsIGludGVycG9sYXRpb25zIGFuZCB0aGVuIGxpbmVhcmx5IGludGVycG9sYXRlIGJldHdlZW4gdGhlbS4KLQotCi1zdGF0aWMKLXZvaWQgRXZhbDRJbnB1dHNGbG9hdChjb25zdCBjbXNGbG9hdDMyTnVtYmVyIElucHV0W10sCi0gICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciBPdXRwdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNJbnRlcnBQYXJhbXMqIHApCi17Ci0gICAgICAgY29uc3QgY21zRmxvYXQzMk51bWJlciogTHV0VGFibGUgPSAoY21zRmxvYXQzMk51bWJlciopIHAgLT4gVGFibGU7Ci0gICAgICAgY21zRmxvYXQzMk51bWJlciByZXN0OwotICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgcGs7Ci0gICAgICAgaW50IGswLCBLMCwgSzE7Ci0gICAgICAgY29uc3QgY21zRmxvYXQzMk51bWJlciogVDsKLSAgICAgICBjbXNVSW50MzJOdW1iZXIgaTsKLSAgICAgICBjbXNGbG9hdDMyTnVtYmVyIFRtcDFbTUFYX1NUQUdFX0NIQU5ORUxTXSwgVG1wMltNQVhfU1RBR0VfQ0hBTk5FTFNdOwotICAgICAgIGNtc0ludGVycFBhcmFtcyBwMTsKLQotICAgICAgIHBrID0gZmNsYW1wKElucHV0WzBdKSAqIHAtPkRvbWFpblswXTsKLSAgICAgICBrMCA9IF9jbXNRdWlja0Zsb29yKHBrKTsKLSAgICAgICByZXN0ID0gcGsgLSAoY21zRmxvYXQzMk51bWJlcikgazA7Ci0KLSAgICAgICBLMCA9IHAgLT4gb3B0YVszXSAqIGswOwotICAgICAgIEsxID0gSzAgKyAoSW5wdXRbMF0gPj0gMS4wID8gMCA6IHAtPm9wdGFbM10pOwotCi0gICAgICAgcDEgPSAqcDsKLSAgICAgICBtZW1tb3ZlKCZwMS5Eb21haW5bMF0sICZwIC0+RG9tYWluWzFdLCAzKnNpemVvZihjbXNVSW50MzJOdW1iZXIpKTsKLQotICAgICAgIFQgPSBMdXRUYWJsZSArIEswOwotICAgICAgIHAxLlRhYmxlID0gVDsKLQotICAgICAgIFRldHJhaGVkcmFsSW50ZXJwRmxvYXQoSW5wdXQgKyAxLCAgVG1wMSwgJnAxKTsKLQotICAgICAgIFQgPSBMdXRUYWJsZSArIEsxOwotICAgICAgIHAxLlRhYmxlID0gVDsKLSAgICAgICBUZXRyYWhlZHJhbEludGVycEZsb2F0KElucHV0ICsgMSwgIFRtcDIsICZwMSk7Ci0KLSAgICAgICBmb3IgKGk9MDsgaSA8IHAgLT4gbk91dHB1dHM7IGkrKykKLSAgICAgICB7Ci0gICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgeTAgPSBUbXAxW2ldOwotICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHkxID0gVG1wMltpXTsKLQotICAgICAgICAgICAgICBPdXRwdXRbaV0gPSB5MCArICh5MSAtIHkwKSAqIHJlc3Q7Ci0gICAgICAgfQotfQotCi0KLXN0YXRpYwotdm9pZCBFdmFsNUlucHV0cyhyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5wdXRbXSwKLSAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIE91dHB1dFtdLAotCi0gICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNvbnN0IGNtc0ludGVycFBhcmFtcyogcDE2KQotewotICAgICAgIGNvbnN0IGNtc1VJbnQxNk51bWJlciogTHV0VGFibGUgPSAoY21zVUludDE2TnVtYmVyKikgcDE2IC0+IFRhYmxlOwotICAgICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgZms7Ci0gICAgICAgY21zUzE1Rml4ZWQxNk51bWJlciBrMCwgcms7Ci0gICAgICAgaW50IEswLCBLMTsKLSAgICAgICBjb25zdCBjbXNVSW50MTZOdW1iZXIqIFQ7Ci0gICAgICAgY21zVUludDMyTnVtYmVyIGk7Ci0gICAgICAgY21zVUludDE2TnVtYmVyIFRtcDFbTUFYX1NUQUdFX0NIQU5ORUxTXSwgVG1wMltNQVhfU1RBR0VfQ0hBTk5FTFNdOwotICAgICAgIGNtc0ludGVycFBhcmFtcyBwMTsKLQotCi0gICAgICAgZmsgPSBfY21zVG9GaXhlZERvbWFpbigoY21zUzE1Rml4ZWQxNk51bWJlcikgSW5wdXRbMF0gKiBwMTYgLT4gRG9tYWluWzBdKTsKLSAgICAgICBrMCA9IEZJWEVEX1RPX0lOVChmayk7Ci0gICAgICAgcmsgPSBGSVhFRF9SRVNUX1RPX0lOVChmayk7Ci0KLSAgICAgICBLMCA9IHAxNiAtPiBvcHRhWzRdICogazA7Ci0gICAgICAgSzEgPSBwMTYgLT4gb3B0YVs0XSAqIChrMCArIChJbnB1dFswXSAhPSAweEZGRkZVID8gMSA6IDApKTsKLQotICAgICAgIHAxID0gKnAxNjsKLSAgICAgICBtZW1tb3ZlKCZwMS5Eb21haW5bMF0sICZwMTYgLT5Eb21haW5bMV0sIDQqc2l6ZW9mKGNtc1VJbnQzMk51bWJlcikpOwotCi0gICAgICAgVCA9IEx1dFRhYmxlICsgSzA7Ci0gICAgICAgcDEuVGFibGUgPSBUOwotCi0gICAgICAgRXZhbDRJbnB1dHMoSW5wdXQgKyAxLCBUbXAxLCAmcDEpOwotCi0gICAgICAgVCA9IEx1dFRhYmxlICsgSzE7Ci0gICAgICAgcDEuVGFibGUgPSBUOwotCi0gICAgICAgRXZhbDRJbnB1dHMoSW5wdXQgKyAxLCBUbXAyLCAmcDEpOwotCi0gICAgICAgZm9yIChpPTA7IGkgPCBwMTYgLT4gbk91dHB1dHM7IGkrKykgewotCi0gICAgICAgICAgICAgIE91dHB1dFtpXSA9IExpbmVhckludGVycChyaywgVG1wMVtpXSwgVG1wMltpXSk7Ci0gICAgICAgfQotCi19Ci0KLQotc3RhdGljCi12b2lkIEV2YWw1SW5wdXRzRmxvYXQoY29uc3QgY21zRmxvYXQzMk51bWJlciBJbnB1dFtdLAotICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgT3V0cHV0W10sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBwKQotewotICAgICAgIGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIqIEx1dFRhYmxlID0gKGNtc0Zsb2F0MzJOdW1iZXIqKSBwIC0+IFRhYmxlOwotICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgcmVzdDsKLSAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHBrOwotICAgICAgIGludCBrMCwgSzAsIEsxOwotICAgICAgIGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIqIFQ7Ci0gICAgICAgY21zVUludDMyTnVtYmVyIGk7Ci0gICAgICAgY21zRmxvYXQzMk51bWJlciBUbXAxW01BWF9TVEFHRV9DSEFOTkVMU10sIFRtcDJbTUFYX1NUQUdFX0NIQU5ORUxTXTsKLSAgICAgICBjbXNJbnRlcnBQYXJhbXMgcDE7Ci0KLSAgICAgICBwayA9IGZjbGFtcChJbnB1dFswXSkgKiBwLT5Eb21haW5bMF07Ci0gICAgICAgazAgPSBfY21zUXVpY2tGbG9vcihwayk7Ci0gICAgICAgcmVzdCA9IHBrIC0gKGNtc0Zsb2F0MzJOdW1iZXIpIGswOwotCi0gICAgICAgSzAgPSBwIC0+IG9wdGFbNF0gKiBrMDsKLSAgICAgICBLMSA9IEswICsgKElucHV0WzBdID49IDEuMCA/IDAgOiBwLT5vcHRhWzRdKTsKLQotICAgICAgIHAxID0gKnA7Ci0gICAgICAgbWVtbW92ZSgmcDEuRG9tYWluWzBdLCAmcCAtPkRvbWFpblsxXSwgNCpzaXplb2YoY21zVUludDMyTnVtYmVyKSk7Ci0KLSAgICAgICBUID0gTHV0VGFibGUgKyBLMDsKLSAgICAgICBwMS5UYWJsZSA9IFQ7Ci0KLSAgICAgICBFdmFsNElucHV0c0Zsb2F0KElucHV0ICsgMSwgIFRtcDEsICZwMSk7Ci0KLSAgICAgICBUID0gTHV0VGFibGUgKyBLMTsKLSAgICAgICBwMS5UYWJsZSA9IFQ7Ci0KLSAgICAgICBFdmFsNElucHV0c0Zsb2F0KElucHV0ICsgMSwgIFRtcDIsICZwMSk7Ci0KLSAgICAgICBmb3IgKGk9MDsgaSA8IHAgLT4gbk91dHB1dHM7IGkrKykgewotCi0gICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgeTAgPSBUbXAxW2ldOwotICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHkxID0gVG1wMltpXTsKLQotICAgICAgICAgICAgICBPdXRwdXRbaV0gPSB5MCArICh5MSAtIHkwKSAqIHJlc3Q7Ci0gICAgICAgfQotfQotCi0KLQotc3RhdGljCi12b2lkIEV2YWw2SW5wdXRzKHJlZ2lzdGVyIGNvbnN0IGNtc1VJbnQxNk51bWJlciBJbnB1dFtdLAotICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgT3V0cHV0W10sCi0gICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNvbnN0IGNtc0ludGVycFBhcmFtcyogcDE2KQotewotICAgICAgIGNvbnN0IGNtc1VJbnQxNk51bWJlciogTHV0VGFibGUgPSAoY21zVUludDE2TnVtYmVyKikgcDE2IC0+IFRhYmxlOwotICAgICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgZms7Ci0gICAgICAgY21zUzE1Rml4ZWQxNk51bWJlciBrMCwgcms7Ci0gICAgICAgaW50IEswLCBLMTsKLSAgICAgICBjb25zdCBjbXNVSW50MTZOdW1iZXIqIFQ7Ci0gICAgICAgY21zVUludDMyTnVtYmVyIGk7Ci0gICAgICAgY21zVUludDE2TnVtYmVyIFRtcDFbTUFYX1NUQUdFX0NIQU5ORUxTXSwgVG1wMltNQVhfU1RBR0VfQ0hBTk5FTFNdOwotICAgICAgIGNtc0ludGVycFBhcmFtcyBwMTsKLQotICAgICAgIGZrID0gX2Ntc1RvRml4ZWREb21haW4oKGNtc1MxNUZpeGVkMTZOdW1iZXIpIElucHV0WzBdICogcDE2IC0+IERvbWFpblswXSk7Ci0gICAgICAgazAgPSBGSVhFRF9UT19JTlQoZmspOwotICAgICAgIHJrID0gRklYRURfUkVTVF9UT19JTlQoZmspOwotCi0gICAgICAgSzAgPSBwMTYgLT4gb3B0YVs1XSAqIGswOwotICAgICAgIEsxID0gcDE2IC0+IG9wdGFbNV0gKiAoazAgKyAoSW5wdXRbMF0gIT0gMHhGRkZGVSA/IDEgOiAwKSk7Ci0KLSAgICAgICBwMSA9ICpwMTY7Ci0gICAgICAgbWVtbW92ZSgmcDEuRG9tYWluWzBdLCAmcDE2IC0+RG9tYWluWzFdLCA1KnNpemVvZihjbXNVSW50MzJOdW1iZXIpKTsKLQotICAgICAgIFQgPSBMdXRUYWJsZSArIEswOwotICAgICAgIHAxLlRhYmxlID0gVDsKLQotICAgICAgIEV2YWw1SW5wdXRzKElucHV0ICsgMSwgVG1wMSwgJnAxKTsKLQotICAgICAgIFQgPSBMdXRUYWJsZSArIEsxOwotICAgICAgIHAxLlRhYmxlID0gVDsKLQotICAgICAgIEV2YWw1SW5wdXRzKElucHV0ICsgMSwgVG1wMiwgJnAxKTsKLQotICAgICAgIGZvciAoaT0wOyBpIDwgcDE2IC0+IG5PdXRwdXRzOyBpKyspIHsKLQotICAgICAgICAgICAgICBPdXRwdXRbaV0gPSBMaW5lYXJJbnRlcnAocmssIFRtcDFbaV0sIFRtcDJbaV0pOwotICAgICAgIH0KLQotfQotCi0KLXN0YXRpYwotdm9pZCBFdmFsNklucHV0c0Zsb2F0KGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIgSW5wdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIE91dHB1dFtdLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0ludGVycFBhcmFtcyogcCkKLXsKLSAgICAgICBjb25zdCBjbXNGbG9hdDMyTnVtYmVyKiBMdXRUYWJsZSA9IChjbXNGbG9hdDMyTnVtYmVyKikgcCAtPiBUYWJsZTsKLSAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHJlc3Q7Ci0gICAgICAgY21zRmxvYXQzMk51bWJlciBwazsKLSAgICAgICBpbnQgazAsIEswLCBLMTsKLSAgICAgICBjb25zdCBjbXNGbG9hdDMyTnVtYmVyKiBUOwotICAgICAgIGNtc1VJbnQzMk51bWJlciBpOwotICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgVG1wMVtNQVhfU1RBR0VfQ0hBTk5FTFNdLCBUbXAyW01BWF9TVEFHRV9DSEFOTkVMU107Ci0gICAgICAgY21zSW50ZXJwUGFyYW1zIHAxOwotCi0gICAgICAgcGsgPSBmY2xhbXAoSW5wdXRbMF0pICogcC0+RG9tYWluWzBdOwotICAgICAgIGswID0gX2Ntc1F1aWNrRmxvb3IocGspOwotICAgICAgIHJlc3QgPSBwayAtIChjbXNGbG9hdDMyTnVtYmVyKSBrMDsKLQotICAgICAgIEswID0gcCAtPiBvcHRhWzVdICogazA7Ci0gICAgICAgSzEgPSBLMCArIChJbnB1dFswXSA+PSAxLjAgPyAwIDogcC0+b3B0YVs1XSk7Ci0KLSAgICAgICBwMSA9ICpwOwotICAgICAgIG1lbW1vdmUoJnAxLkRvbWFpblswXSwgJnAgLT5Eb21haW5bMV0sIDUqc2l6ZW9mKGNtc1VJbnQzMk51bWJlcikpOwotCi0gICAgICAgVCA9IEx1dFRhYmxlICsgSzA7Ci0gICAgICAgcDEuVGFibGUgPSBUOwotCi0gICAgICAgRXZhbDVJbnB1dHNGbG9hdChJbnB1dCArIDEsICBUbXAxLCAmcDEpOwotCi0gICAgICAgVCA9IEx1dFRhYmxlICsgSzE7Ci0gICAgICAgcDEuVGFibGUgPSBUOwotCi0gICAgICAgRXZhbDVJbnB1dHNGbG9hdChJbnB1dCArIDEsICBUbXAyLCAmcDEpOwotCi0gICAgICAgZm9yIChpPTA7IGkgPCBwIC0+IG5PdXRwdXRzOyBpKyspIHsKLQotICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHkwID0gVG1wMVtpXTsKLSAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciB5MSA9IFRtcDJbaV07Ci0KLSAgICAgICAgICAgICAgT3V0cHV0W2ldID0geTAgKyAoeTEgLSB5MCkgKiByZXN0OwotICAgICAgIH0KLX0KLQotCi1zdGF0aWMKLXZvaWQgRXZhbDdJbnB1dHMocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIElucHV0W10sCi0gICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciBPdXRwdXRbXSwKLSAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBwMTYpCi17Ci0gICAgICAgY29uc3QgY21zVUludDE2TnVtYmVyKiBMdXRUYWJsZSA9IChjbXNVSW50MTZOdW1iZXIqKSBwMTYgLT4gVGFibGU7Ci0gICAgICAgY21zUzE1Rml4ZWQxNk51bWJlciBmazsKLSAgICAgICBjbXNTMTVGaXhlZDE2TnVtYmVyIGswLCByazsKLSAgICAgICBpbnQgSzAsIEsxOwotICAgICAgIGNvbnN0IGNtc1VJbnQxNk51bWJlciogVDsKLSAgICAgICBjbXNVSW50MzJOdW1iZXIgaTsKLSAgICAgICBjbXNVSW50MTZOdW1iZXIgVG1wMVtNQVhfU1RBR0VfQ0hBTk5FTFNdLCBUbXAyW01BWF9TVEFHRV9DSEFOTkVMU107Ci0gICAgICAgY21zSW50ZXJwUGFyYW1zIHAxOwotCi0KLSAgICAgICBmayA9IF9jbXNUb0ZpeGVkRG9tYWluKChjbXNTMTVGaXhlZDE2TnVtYmVyKSBJbnB1dFswXSAqIHAxNiAtPiBEb21haW5bMF0pOwotICAgICAgIGswID0gRklYRURfVE9fSU5UKGZrKTsKLSAgICAgICByayA9IEZJWEVEX1JFU1RfVE9fSU5UKGZrKTsKLQotICAgICAgIEswID0gcDE2IC0+IG9wdGFbNl0gKiBrMDsKLSAgICAgICBLMSA9IHAxNiAtPiBvcHRhWzZdICogKGswICsgKElucHV0WzBdICE9IDB4RkZGRlUgPyAxIDogMCkpOwotCi0gICAgICAgcDEgPSAqcDE2OwotICAgICAgIG1lbW1vdmUoJnAxLkRvbWFpblswXSwgJnAxNiAtPkRvbWFpblsxXSwgNipzaXplb2YoY21zVUludDMyTnVtYmVyKSk7Ci0KLSAgICAgICBUID0gTHV0VGFibGUgKyBLMDsKLSAgICAgICBwMS5UYWJsZSA9IFQ7Ci0KLSAgICAgICBFdmFsNklucHV0cyhJbnB1dCArIDEsIFRtcDEsICZwMSk7Ci0KLSAgICAgICBUID0gTHV0VGFibGUgKyBLMTsKLSAgICAgICBwMS5UYWJsZSA9IFQ7Ci0KLSAgICAgICBFdmFsNklucHV0cyhJbnB1dCArIDEsIFRtcDIsICZwMSk7Ci0KLSAgICAgICBmb3IgKGk9MDsgaSA8IHAxNiAtPiBuT3V0cHV0czsgaSsrKSB7Ci0gICAgICAgICAgICAgIE91dHB1dFtpXSA9IExpbmVhckludGVycChyaywgVG1wMVtpXSwgVG1wMltpXSk7Ci0gICAgICAgfQotfQotCi0KLXN0YXRpYwotdm9pZCBFdmFsN0lucHV0c0Zsb2F0KGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIgSW5wdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIE91dHB1dFtdLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0ludGVycFBhcmFtcyogcCkKLXsKLSAgICAgICBjb25zdCBjbXNGbG9hdDMyTnVtYmVyKiBMdXRUYWJsZSA9IChjbXNGbG9hdDMyTnVtYmVyKikgcCAtPiBUYWJsZTsKLSAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHJlc3Q7Ci0gICAgICAgY21zRmxvYXQzMk51bWJlciBwazsKLSAgICAgICBpbnQgazAsIEswLCBLMTsKLSAgICAgICBjb25zdCBjbXNGbG9hdDMyTnVtYmVyKiBUOwotICAgICAgIGNtc1VJbnQzMk51bWJlciBpOwotICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgVG1wMVtNQVhfU1RBR0VfQ0hBTk5FTFNdLCBUbXAyW01BWF9TVEFHRV9DSEFOTkVMU107Ci0gICAgICAgY21zSW50ZXJwUGFyYW1zIHAxOwotCi0gICAgICAgcGsgPSBmY2xhbXAoSW5wdXRbMF0pICogcC0+RG9tYWluWzBdOwotICAgICAgIGswID0gX2Ntc1F1aWNrRmxvb3IocGspOwotICAgICAgIHJlc3QgPSBwayAtIChjbXNGbG9hdDMyTnVtYmVyKSBrMDsKLQotICAgICAgIEswID0gcCAtPiBvcHRhWzZdICogazA7Ci0gICAgICAgSzEgPSBLMCArIChJbnB1dFswXSA+PSAxLjAgPyAwIDogcC0+b3B0YVs2XSk7Ci0KLSAgICAgICBwMSA9ICpwOwotICAgICAgIG1lbW1vdmUoJnAxLkRvbWFpblswXSwgJnAgLT5Eb21haW5bMV0sIDYqc2l6ZW9mKGNtc1VJbnQzMk51bWJlcikpOwotCi0gICAgICAgVCA9IEx1dFRhYmxlICsgSzA7Ci0gICAgICAgcDEuVGFibGUgPSBUOwotCi0gICAgICAgRXZhbDZJbnB1dHNGbG9hdChJbnB1dCArIDEsICBUbXAxLCAmcDEpOwotCi0gICAgICAgVCA9IEx1dFRhYmxlICsgSzE7Ci0gICAgICAgcDEuVGFibGUgPSBUOwotCi0gICAgICAgRXZhbDZJbnB1dHNGbG9hdChJbnB1dCArIDEsICBUbXAyLCAmcDEpOwotCi0KLSAgICAgICBmb3IgKGk9MDsgaSA8IHAgLT4gbk91dHB1dHM7IGkrKykgewotCi0gICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgeTAgPSBUbXAxW2ldOwotICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHkxID0gVG1wMltpXTsKLQotICAgICAgICAgICAgICBPdXRwdXRbaV0gPSB5MCArICh5MSAtIHkwKSAqIHJlc3Q7Ci0KLSAgICAgICB9Ci19Ci0KLXN0YXRpYwotdm9pZCBFdmFsOElucHV0cyhyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5wdXRbXSwKLSAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIE91dHB1dFtdLAotICAgICAgICAgICAgICAgICByZWdpc3RlciBjb25zdCBjbXNJbnRlcnBQYXJhbXMqIHAxNikKLXsKLSAgICAgICBjb25zdCBjbXNVSW50MTZOdW1iZXIqIEx1dFRhYmxlID0gKGNtc1VJbnQxNk51bWJlciopIHAxNiAtPiBUYWJsZTsKLSAgICAgICBjbXNTMTVGaXhlZDE2TnVtYmVyIGZrOwotICAgICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgazAsIHJrOwotICAgICAgIGludCBLMCwgSzE7Ci0gICAgICAgY29uc3QgY21zVUludDE2TnVtYmVyKiBUOwotICAgICAgIGNtc1VJbnQzMk51bWJlciBpOwotICAgICAgIGNtc1VJbnQxNk51bWJlciBUbXAxW01BWF9TVEFHRV9DSEFOTkVMU10sIFRtcDJbTUFYX1NUQUdFX0NIQU5ORUxTXTsKLSAgICAgICBjbXNJbnRlcnBQYXJhbXMgcDE7Ci0KLSAgICAgICBmayA9IF9jbXNUb0ZpeGVkRG9tYWluKChjbXNTMTVGaXhlZDE2TnVtYmVyKSBJbnB1dFswXSAqIHAxNiAtPiBEb21haW5bMF0pOwotICAgICAgIGswID0gRklYRURfVE9fSU5UKGZrKTsKLSAgICAgICByayA9IEZJWEVEX1JFU1RfVE9fSU5UKGZrKTsKLQotICAgICAgIEswID0gcDE2IC0+IG9wdGFbN10gKiBrMDsKLSAgICAgICBLMSA9IHAxNiAtPiBvcHRhWzddICogKGswICsgKElucHV0WzBdICE9IDB4RkZGRlUgPyAxIDogMCkpOwotCi0gICAgICAgcDEgPSAqcDE2OwotICAgICAgIG1lbW1vdmUoJnAxLkRvbWFpblswXSwgJnAxNiAtPkRvbWFpblsxXSwgNypzaXplb2YoY21zVUludDMyTnVtYmVyKSk7Ci0KLSAgICAgICBUID0gTHV0VGFibGUgKyBLMDsKLSAgICAgICBwMS5UYWJsZSA9IFQ7Ci0KLSAgICAgICBFdmFsN0lucHV0cyhJbnB1dCArIDEsIFRtcDEsICZwMSk7Ci0KLSAgICAgICBUID0gTHV0VGFibGUgKyBLMTsKLSAgICAgICBwMS5UYWJsZSA9IFQ7Ci0gICAgICAgRXZhbDdJbnB1dHMoSW5wdXQgKyAxLCBUbXAyLCAmcDEpOwotCi0gICAgICAgZm9yIChpPTA7IGkgPCBwMTYgLT4gbk91dHB1dHM7IGkrKykgewotICAgICAgICAgICAgICBPdXRwdXRbaV0gPSBMaW5lYXJJbnRlcnAocmssIFRtcDFbaV0sIFRtcDJbaV0pOwotICAgICAgIH0KLX0KLQotCi0KLXN0YXRpYwotdm9pZCBFdmFsOElucHV0c0Zsb2F0KGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIgSW5wdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIE91dHB1dFtdLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0ludGVycFBhcmFtcyogcCkKLXsKLSAgICAgICBjb25zdCBjbXNGbG9hdDMyTnVtYmVyKiBMdXRUYWJsZSA9IChjbXNGbG9hdDMyTnVtYmVyKikgcCAtPiBUYWJsZTsKLSAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHJlc3Q7Ci0gICAgICAgY21zRmxvYXQzMk51bWJlciBwazsKLSAgICAgICBpbnQgazAsIEswLCBLMTsKLSAgICAgICBjb25zdCBjbXNGbG9hdDMyTnVtYmVyKiBUOwotICAgICAgIGNtc1VJbnQzMk51bWJlciBpOwotICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgVG1wMVtNQVhfU1RBR0VfQ0hBTk5FTFNdLCBUbXAyW01BWF9TVEFHRV9DSEFOTkVMU107Ci0gICAgICAgY21zSW50ZXJwUGFyYW1zIHAxOwotCi0gICAgICAgcGsgPSBmY2xhbXAoSW5wdXRbMF0pICogcC0+RG9tYWluWzBdOwotICAgICAgIGswID0gX2Ntc1F1aWNrRmxvb3IocGspOwotICAgICAgIHJlc3QgPSBwayAtIChjbXNGbG9hdDMyTnVtYmVyKSBrMDsKLQotICAgICAgIEswID0gcCAtPiBvcHRhWzddICogazA7Ci0gICAgICAgSzEgPSBLMCArIChJbnB1dFswXSA+PSAxLjAgPyAwIDogcC0+b3B0YVs3XSk7Ci0KLSAgICAgICBwMSA9ICpwOwotICAgICAgIG1lbW1vdmUoJnAxLkRvbWFpblswXSwgJnAgLT5Eb21haW5bMV0sIDcqc2l6ZW9mKGNtc1VJbnQzMk51bWJlcikpOwotCi0gICAgICAgVCA9IEx1dFRhYmxlICsgSzA7Ci0gICAgICAgcDEuVGFibGUgPSBUOwotCi0gICAgICAgRXZhbDdJbnB1dHNGbG9hdChJbnB1dCArIDEsICBUbXAxLCAmcDEpOwotCi0gICAgICAgVCA9IEx1dFRhYmxlICsgSzE7Ci0gICAgICAgcDEuVGFibGUgPSBUOwotCi0gICAgICAgRXZhbDdJbnB1dHNGbG9hdChJbnB1dCArIDEsICBUbXAyLCAmcDEpOwotCi0KLSAgICAgICBmb3IgKGk9MDsgaSA8IHAgLT4gbk91dHB1dHM7IGkrKykgewotCi0gICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgeTAgPSBUbXAxW2ldOwotICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHkxID0gVG1wMltpXTsKLQotICAgICAgICAgICAgICBPdXRwdXRbaV0gPSB5MCArICh5MSAtIHkwKSAqIHJlc3Q7Ci0gICAgICAgfQotfQotCi0vLyBUaGUgZGVmYXVsdCBmYWN0b3J5Ci1zdGF0aWMKLWNtc0ludGVycEZ1bmN0aW9uIERlZmF1bHRJbnRlcnBvbGF0b3JzRmFjdG9yeShjbXNVSW50MzJOdW1iZXIgbklucHV0Q2hhbm5lbHMsIGNtc1VJbnQzMk51bWJlciBuT3V0cHV0Q2hhbm5lbHMsIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKQotewotCi0gICAgY21zSW50ZXJwRnVuY3Rpb24gSW50ZXJwb2xhdGlvbjsKLSAgICBjbXNCb29sICBJc0Zsb2F0ICAgICA9IChkd0ZsYWdzICYgQ01TX0xFUlBfRkxBR1NfRkxPQVQpOwotICAgIGNtc0Jvb2wgIElzVHJpbGluZWFyID0gKGR3RmxhZ3MgJiBDTVNfTEVSUF9GTEFHU19UUklMSU5FQVIpOwotCi0gICAgbWVtc2V0KCZJbnRlcnBvbGF0aW9uLCAwLCBzaXplb2YoSW50ZXJwb2xhdGlvbikpOwotCi0gICAgLy8gU2FmZXR5IGNoZWNrCi0gICAgaWYgKG5JbnB1dENoYW5uZWxzID49IDQgJiYgbk91dHB1dENoYW5uZWxzID49IE1BWF9TVEFHRV9DSEFOTkVMUykKLSAgICAgICAgcmV0dXJuIEludGVycG9sYXRpb247Ci0KLSAgICBzd2l0Y2ggKG5JbnB1dENoYW5uZWxzKSB7Ci0KLSAgICAgICAgICAgY2FzZSAxOiAvLyBHcmF5IExVVCAvIGxpbmVhcgotCi0gICAgICAgICAgICAgICBpZiAobk91dHB1dENoYW5uZWxzID09IDEpIHsKLQotICAgICAgICAgICAgICAgICAgIGlmIChJc0Zsb2F0KQotICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnBvbGF0aW9uLkxlcnBGbG9hdCA9IExpbkxlcnAxRGZsb2F0OwotICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJwb2xhdGlvbi5MZXJwMTYgPSBMaW5MZXJwMUQ7Ci0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGVsc2UgewotCi0gICAgICAgICAgICAgICAgICAgaWYgKElzRmxvYXQpCi0gICAgICAgICAgICAgICAgICAgICAgIEludGVycG9sYXRpb24uTGVycEZsb2F0ID0gRXZhbDFJbnB1dEZsb2F0OwotICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJwb2xhdGlvbi5MZXJwMTYgPSBFdmFsMUlucHV0OwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgY2FzZSAyOiAvLyBEdW90b25lCi0gICAgICAgICAgICAgICBpZiAoSXNGbG9hdCkKLSAgICAgICAgICAgICAgICAgICAgICBJbnRlcnBvbGF0aW9uLkxlcnBGbG9hdCA9ICBCaWxpbmVhckludGVycEZsb2F0OwotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgIEludGVycG9sYXRpb24uTGVycDE2ICAgID0gIEJpbGluZWFySW50ZXJwMTY7Ci0gICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICBjYXNlIDM6ICAvLyBSR0IgZXQgYWwKLQotICAgICAgICAgICAgICAgaWYgKElzVHJpbGluZWFyKSB7Ci0KLSAgICAgICAgICAgICAgICAgICBpZiAoSXNGbG9hdCkKLSAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJwb2xhdGlvbi5MZXJwRmxvYXQgPSBUcmlsaW5lYXJJbnRlcnBGbG9hdDsKLSAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgIEludGVycG9sYXRpb24uTGVycDE2ID0gVHJpbGluZWFySW50ZXJwMTY7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBlbHNlIHsKLQotICAgICAgICAgICAgICAgICAgIGlmIChJc0Zsb2F0KQotICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnBvbGF0aW9uLkxlcnBGbG9hdCA9IFRldHJhaGVkcmFsSW50ZXJwRmxvYXQ7Ci0gICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJwb2xhdGlvbi5MZXJwMTYgPSBUZXRyYWhlZHJhbEludGVycDE2OwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgIGNhc2UgNDogIC8vIENNWUsgbHV0Ci0KLSAgICAgICAgICAgICAgIGlmIChJc0Zsb2F0KQotICAgICAgICAgICAgICAgICAgIEludGVycG9sYXRpb24uTGVycEZsb2F0ID0gIEV2YWw0SW5wdXRzRmxvYXQ7Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgSW50ZXJwb2xhdGlvbi5MZXJwMTYgICAgPSAgRXZhbDRJbnB1dHM7Ci0gICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICBjYXNlIDU6IC8vIDUgSW5rcwotICAgICAgICAgICAgICAgaWYgKElzRmxvYXQpCi0gICAgICAgICAgICAgICAgICAgSW50ZXJwb2xhdGlvbi5MZXJwRmxvYXQgPSAgRXZhbDVJbnB1dHNGbG9hdDsKLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICBJbnRlcnBvbGF0aW9uLkxlcnAxNiAgICA9ICBFdmFsNUlucHV0czsKLSAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgIGNhc2UgNjogLy8gNiBJbmtzCi0gICAgICAgICAgICAgICBpZiAoSXNGbG9hdCkKLSAgICAgICAgICAgICAgICAgICBJbnRlcnBvbGF0aW9uLkxlcnBGbG9hdCA9ICBFdmFsNklucHV0c0Zsb2F0OwotICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgIEludGVycG9sYXRpb24uTGVycDE2ICAgID0gIEV2YWw2SW5wdXRzOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgY2FzZSA3OiAvLyA3IGlua3MKLSAgICAgICAgICAgICAgIGlmIChJc0Zsb2F0KQotICAgICAgICAgICAgICAgICAgIEludGVycG9sYXRpb24uTGVycEZsb2F0ID0gIEV2YWw3SW5wdXRzRmxvYXQ7Ci0gICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgSW50ZXJwb2xhdGlvbi5MZXJwMTYgICAgPSAgRXZhbDdJbnB1dHM7Ci0gICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICBjYXNlIDg6IC8vIDggaW5rcwotICAgICAgICAgICAgICAgaWYgKElzRmxvYXQpCi0gICAgICAgICAgICAgICAgICAgSW50ZXJwb2xhdGlvbi5MZXJwRmxvYXQgPSAgRXZhbDhJbnB1dHNGbG9hdDsKLSAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICBJbnRlcnBvbGF0aW9uLkxlcnAxNiAgICA9ICBFdmFsOElucHV0czsKLSAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgSW50ZXJwb2xhdGlvbi5MZXJwMTYgPSBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBJbnRlcnBvbGF0aW9uOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNpbzAuYyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zaW8wLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZDczMGEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNpbzAuYworKysgL2Rldi9udWxsCkBAIC0xLDE4OTUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTIgTWFydGkgTWFyaWEgU2FndWVyCi0vLwotLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0vLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0vLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0vLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLS8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQotLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLS8vCi0vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0vLwotLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0vLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KLS8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi0vLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCi0vLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0vLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLS8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotI2luY2x1ZGUgImxjbXMyX2ludGVybmFsLmgiCi0KLS8vIEdlbmVyaWMgSS9PLCB0YWcgZGljdGlvbmFyeSBtYW5hZ2VtZW50LCBwcm9maWxlIHN0cnVjdAotCi0vLyBJT2hhbmRsZXJzIGFyZSBhYnN0cmFjdGlvbnMgdXNlZCBieSBsaXR0bGVDTVMgdG8gcmVhZCBmcm9tIHdoYXRldmVyIGZpbGUsIHN0cmVhbSwKLS8vIG1lbW9yeSBibG9jayBvciBhbnkgc3RvcmFnZS4gRWFjaCBJT2hhbmRsZXIgcHJvdmlkZXMgaW1wbGVtZW50YXRpb25zIGZvciByZWFkLAotLy8gd3JpdGUsIHNlZWsgYW5kIHRlbGwgZnVuY3Rpb25zLiBMaXR0bGVDTVMgY29kZSBkZWFscyB3aXRoIElPIGFjcm9zcyB0aG9zZSBvYmplY3RzLgotLy8gSW4gdGhpcyB3YXksIGlzIGVhc2llciB0byBhZGQgc3VwcG9ydCBmb3IgbmV3IHN0b3JhZ2UgbWVkaWEuCi0KLS8vIE5VTEwgc3RyZWFtLCBmb3IgdGFraW5nIGNhcmUgb2YgdXNlZCBzcGFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIE5VTEwgSU9oYW5kbGVyIGJhc2ljYWxseSBkb2VzIG5vdGhpbmcgYnV0IGtlZXAgdHJhY2sgb24gaG93IG1hbnkgYnl0ZXMgaGF2ZSBiZWVuCi0vLyB3cml0dGVuLiBUaGlzIGlzIGhhbmR5IHdoZW4gY3JlYXRpbmcgcHJvZmlsZXMsIHdoZXJlIHRoZSBmaWxlIHNpemUgaXMgbmVlZGVkIGluIHRoZQotLy8gaGVhZGVyLiBUaGVuLCB3aG9sZSBwcm9maWxlIGlzIHNlcmlhbGl6ZWQgYWNyb3NzIE5VTEwgSU9oYW5kbGVyIGFuZCBhIHNlY29uZCBwYXNzCi0vLyB3cml0ZXMgdGhlIGJ5dGVzIHRvIHRoZSBwZXJ0aW5lbnQgSU9oYW5kbGVyLgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY21zVUludDMyTnVtYmVyIFBvaW50ZXI7ICAgICAgICAgLy8gUG9pbnRzIHRvIGN1cnJlbnQgbG9jYXRpb24KLX0gRklMRU5VTEw7Ci0KLXN0YXRpYwotY21zVUludDMyTnVtYmVyIE5VTExSZWFkKGNtc0lPSEFORExFUiogaW9oYW5kbGVyLCB2b2lkICpCdWZmZXIsIGNtc1VJbnQzMk51bWJlciBzaXplLCBjbXNVSW50MzJOdW1iZXIgY291bnQpCi17Ci0gICAgRklMRU5VTEwqIFJlc0RhdGEgPSAoRklMRU5VTEwqKSBpb2hhbmRsZXIgLT5zdHJlYW07Ci0KLSAgICBjbXNVSW50MzJOdW1iZXIgbGVuID0gc2l6ZSAqIGNvdW50OwotICAgIFJlc0RhdGEgLT4gUG9pbnRlciArPSBsZW47Ci0gICAgcmV0dXJuIGNvdW50OwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihCdWZmZXIpOwotfQotCi1zdGF0aWMKLWNtc0Jvb2wgIE5VTExTZWVrKGNtc0lPSEFORExFUiogaW9oYW5kbGVyLCBjbXNVSW50MzJOdW1iZXIgb2Zmc2V0KQotewotICAgIEZJTEVOVUxMKiBSZXNEYXRhID0gKEZJTEVOVUxMKikgaW9oYW5kbGVyIC0+c3RyZWFtOwotCi0gICAgUmVzRGF0YSAtPlBvaW50ZXIgPSBvZmZzZXQ7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLXN0YXRpYwotY21zVUludDMyTnVtYmVyIE5VTExUZWxsKGNtc0lPSEFORExFUiogaW9oYW5kbGVyKQotewotICAgIEZJTEVOVUxMKiBSZXNEYXRhID0gKEZJTEVOVUxMKikgaW9oYW5kbGVyIC0+c3RyZWFtOwotICAgIHJldHVybiBSZXNEYXRhIC0+IFBvaW50ZXI7Ci19Ci0KLXN0YXRpYwotY21zQm9vbCAgTlVMTFdyaXRlKGNtc0lPSEFORExFUiogaW9oYW5kbGVyLCBjbXNVSW50MzJOdW1iZXIgc2l6ZSwgY29uc3Qgdm9pZCAqUHRyKQotewotICAgIEZJTEVOVUxMKiBSZXNEYXRhID0gKEZJTEVOVUxMKikgaW9oYW5kbGVyIC0+c3RyZWFtOwotCi0gICAgUmVzRGF0YSAtPlBvaW50ZXIgKz0gc2l6ZTsKLSAgICBpZiAoUmVzRGF0YSAtPlBvaW50ZXIgPiBpb2hhbmRsZXItPlVzZWRTcGFjZSkKLSAgICAgICAgaW9oYW5kbGVyLT5Vc2VkU3BhY2UgPSBSZXNEYXRhIC0+UG9pbnRlcjsKLQotICAgIHJldHVybiBUUlVFOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihQdHIpOwotfQotCi1zdGF0aWMKLWNtc0Jvb2wgIE5VTExDbG9zZShjbXNJT0hBTkRMRVIqIGlvaGFuZGxlcikKLXsKLSAgICBGSUxFTlVMTCogUmVzRGF0YSA9IChGSUxFTlVMTCopIGlvaGFuZGxlciAtPnN0cmVhbTsKLQotICAgIF9jbXNGcmVlKGlvaGFuZGxlciAtPkNvbnRleHRJRCwgUmVzRGF0YSk7Ci0gICAgX2Ntc0ZyZWUoaW9oYW5kbGVyIC0+Q29udGV4dElELCBpb2hhbmRsZXIpOwotICAgIHJldHVybiBUUlVFOwotfQotCi0vLyBUaGUgTlVMTCBJT2hhbmRsZXIgY3JlYXRvcgotY21zSU9IQU5ETEVSKiAgQ01TRVhQT1JUIGNtc09wZW5JT2hhbmRsZXJGcm9tTlVMTChjbXNDb250ZXh0IENvbnRleHRJRCkKLXsKLSAgICBzdHJ1Y3QgX2Ntc19pb19oYW5kbGVyKiBpb2hhbmRsZXIgPSBOVUxMOwotICAgIEZJTEVOVUxMKiBmbSA9IE5VTEw7Ci0KLSAgICBpb2hhbmRsZXIgPSAoc3RydWN0IF9jbXNfaW9faGFuZGxlciopIF9jbXNNYWxsb2NaZXJvKENvbnRleHRJRCwgc2l6ZW9mKHN0cnVjdCBfY21zX2lvX2hhbmRsZXIpKTsKLSAgICBpZiAoaW9oYW5kbGVyID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgZm0gPSAoRklMRU5VTEwqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihGSUxFTlVMTCkpOwotICAgIGlmIChmbSA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgZm0gLT5Qb2ludGVyID0gMDsKLQotICAgIGlvaGFuZGxlciAtPkNvbnRleHRJRCA9IENvbnRleHRJRDsKLSAgICBpb2hhbmRsZXIgLT5zdHJlYW0gID0gKHZvaWQqKSBmbTsKLSAgICBpb2hhbmRsZXIgLT5Vc2VkU3BhY2UgPSAwOwotICAgIGlvaGFuZGxlciAtPlJlcG9ydGVkU2l6ZSA9IDA7Ci0gICAgaW9oYW5kbGVyIC0+UGh5c2ljYWxGaWxlWzBdID0gMDsKLQotICAgIGlvaGFuZGxlciAtPlJlYWQgICAgPSBOVUxMUmVhZDsKLSAgICBpb2hhbmRsZXIgLT5TZWVrICAgID0gTlVMTFNlZWs7Ci0gICAgaW9oYW5kbGVyIC0+Q2xvc2UgICA9IE5VTExDbG9zZTsKLSAgICBpb2hhbmRsZXIgLT5UZWxsICAgID0gTlVMTFRlbGw7Ci0gICAgaW9oYW5kbGVyIC0+V3JpdGUgICA9IE5VTExXcml0ZTsKLQotICAgIHJldHVybiBpb2hhbmRsZXI7Ci0KLUVycm9yOiAgICAKLSAgICBpZiAoaW9oYW5kbGVyKSBfY21zRnJlZShDb250ZXh0SUQsIGlvaGFuZGxlcik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0KLX0KLQotCi0vLyBNZW1vcnktYmFzZWQgc3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFRob3NlIGZ1bmN0aW9ucyBpbXBsZW1lbnRzIGFuIGlvaGFuZGxlciB3aGljaCB0YWtlcyBhIGJsb2NrIG9mIG1lbW9yeSBhcyBzdG9yYWdlIG1lZGl1bS4KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNtc1VJbnQ4TnVtYmVyKiBCbG9jazsgICAgLy8gUG9pbnRzIHRvIGFsbG9jYXRlZCBtZW1vcnkKLSAgICBjbXNVSW50MzJOdW1iZXIgU2l6ZTsgICAgIC8vIFNpemUgb2YgYWxsb2NhdGVkIG1lbW9yeQotICAgIGNtc1VJbnQzMk51bWJlciBQb2ludGVyOyAgLy8gUG9pbnRzIHRvIGN1cnJlbnQgbG9jYXRpb24KLSAgICBpbnQgRnJlZUJsb2NrT25DbG9zZTsgICAgIC8vIEFzIHRpdGxlCi0KLX0gRklMRU1FTTsKLQotc3RhdGljCi1jbXNVSW50MzJOdW1iZXIgTWVtb3J5UmVhZChzdHJ1Y3QgX2Ntc19pb19oYW5kbGVyKiBpb2hhbmRsZXIsIHZvaWQgKkJ1ZmZlciwgY21zVUludDMyTnVtYmVyIHNpemUsIGNtc1VJbnQzMk51bWJlciBjb3VudCkKLXsKLSAgICBGSUxFTUVNKiBSZXNEYXRhID0gKEZJTEVNRU0qKSBpb2hhbmRsZXIgLT5zdHJlYW07Ci0gICAgY21zVUludDhOdW1iZXIqIFB0cjsKLSAgICBjbXNVSW50MzJOdW1iZXIgbGVuID0gc2l6ZSAqIGNvdW50OwotCi0gICAgaWYgKFJlc0RhdGEgLT4gUG9pbnRlciArIGxlbiA+IFJlc0RhdGEgLT4gU2l6ZSl7Ci0KLSAgICAgICAgbGVuID0gKFJlc0RhdGEgLT4gU2l6ZSAtIFJlc0RhdGEgLT4gUG9pbnRlcik7Ci0gICAgICAgIGNtc1NpZ25hbEVycm9yKGlvaGFuZGxlciAtPkNvbnRleHRJRCwgY21zRVJST1JfUkVBRCwgIlJlYWQgZnJvbSBtZW1vcnkgZXJyb3IuIEdvdCAlZCBieXRlcywgYmxvY2sgc2hvdWxkIGJlIG9mICVkIGJ5dGVzIiwgbGVuLCBjb3VudCAqIHNpemUpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBQdHIgID0gUmVzRGF0YSAtPiBCbG9jazsKLSAgICBQdHIgKz0gUmVzRGF0YSAtPiBQb2ludGVyOwotICAgIG1lbW1vdmUoQnVmZmVyLCBQdHIsIGxlbik7Ci0gICAgUmVzRGF0YSAtPiBQb2ludGVyICs9IGxlbjsKLQotICAgIHJldHVybiBjb3VudDsKLX0KLQotLy8gU0VFS19DVVIgaXMgYXNzdW1lZAotc3RhdGljCi1jbXNCb29sICBNZW1vcnlTZWVrKHN0cnVjdCBfY21zX2lvX2hhbmRsZXIqIGlvaGFuZGxlciwgY21zVUludDMyTnVtYmVyIG9mZnNldCkKLXsKLSAgICBGSUxFTUVNKiBSZXNEYXRhID0gKEZJTEVNRU0qKSBpb2hhbmRsZXIgLT5zdHJlYW07Ci0KLSAgICBpZiAob2Zmc2V0ID4gUmVzRGF0YSAtPlNpemUpIHsKLSAgICAgICAgY21zU2lnbmFsRXJyb3IoaW9oYW5kbGVyIC0+Q29udGV4dElELCBjbXNFUlJPUl9TRUVLLCAgIlRvbyBmZXcgZGF0YTsgcHJvYmFibHkgY29ycnVwdGVkIHByb2ZpbGUiKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIFJlc0RhdGEgLT5Qb2ludGVyID0gb2Zmc2V0OwotICAgIHJldHVybiBUUlVFOwotfQotCi0vLyBUZWxsIGZvciBtZW1vcnkKLXN0YXRpYwotY21zVUludDMyTnVtYmVyIE1lbW9yeVRlbGwoc3RydWN0IF9jbXNfaW9faGFuZGxlciogaW9oYW5kbGVyKQotewotICAgIEZJTEVNRU0qIFJlc0RhdGEgPSAoRklMRU1FTSopIGlvaGFuZGxlciAtPnN0cmVhbTsKLQotICAgIGlmIChSZXNEYXRhID09IE5VTEwpIHJldHVybiAwOwotICAgIHJldHVybiBSZXNEYXRhIC0+IFBvaW50ZXI7Ci19Ci0KLQotLy8gV3JpdGVzIGRhdGEgdG8gbWVtb3J5LCBhbHNvIGtlZXBzIHVzZWQgc3BhY2UgZm9yIGZ1cnRoZXIgcmVmZXJlbmNlLgotc3RhdGljCi1jbXNCb29sIE1lbW9yeVdyaXRlKHN0cnVjdCBfY21zX2lvX2hhbmRsZXIqIGlvaGFuZGxlciwgY21zVUludDMyTnVtYmVyIHNpemUsIGNvbnN0IHZvaWQgKlB0cikKLXsKLSAgICBGSUxFTUVNKiBSZXNEYXRhID0gKEZJTEVNRU0qKSBpb2hhbmRsZXIgLT5zdHJlYW07Ci0KLSAgICBpZiAoUmVzRGF0YSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7IC8vIEhvdXNla2VlcGluZwotCi0gICAgLy8gQ2hlY2sgZm9yIGF2YWlsYWJsZSBzcGFjZS4gQ2xpcC4KLSAgICBpZiAoUmVzRGF0YS0+UG9pbnRlciArIHNpemUgPiBSZXNEYXRhLT5TaXplKSB7Ci0gICAgICAgIHNpemUgPSBSZXNEYXRhIC0+U2l6ZSAtIFJlc0RhdGEtPlBvaW50ZXI7Ci0gICAgfQotICAgICAgCi0gICAgaWYgKHNpemUgPT0gMCkgcmV0dXJuIFRSVUU7ICAgICAvLyBXcml0ZSB6ZXJvIGJ5dGVzIGlzIG9rLCBidXQgZG9lcyBub3RoaW5nCi0KLSAgICBtZW1tb3ZlKFJlc0RhdGEgLT5CbG9jayArIFJlc0RhdGEgLT5Qb2ludGVyLCBQdHIsIHNpemUpOwotICAgIFJlc0RhdGEgLT5Qb2ludGVyICs9IHNpemU7Ci0KLSAgICBpZiAoUmVzRGF0YSAtPlBvaW50ZXIgPiBpb2hhbmRsZXItPlVzZWRTcGFjZSkKLSAgICAgICAgaW9oYW5kbGVyLT5Vc2VkU3BhY2UgPSBSZXNEYXRhIC0+UG9pbnRlcjsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0KLXN0YXRpYwotY21zQm9vbCAgTWVtb3J5Q2xvc2Uoc3RydWN0IF9jbXNfaW9faGFuZGxlciogaW9oYW5kbGVyKQotewotICAgIEZJTEVNRU0qIFJlc0RhdGEgPSAoRklMRU1FTSopIGlvaGFuZGxlciAtPnN0cmVhbTsKLQotICAgIGlmIChSZXNEYXRhIC0+RnJlZUJsb2NrT25DbG9zZSkgewotCi0gICAgICAgIGlmIChSZXNEYXRhIC0+QmxvY2spIF9jbXNGcmVlKGlvaGFuZGxlciAtPkNvbnRleHRJRCwgUmVzRGF0YSAtPkJsb2NrKTsKLSAgICB9Ci0KLSAgICBfY21zRnJlZShpb2hhbmRsZXIgLT5Db250ZXh0SUQsIFJlc0RhdGEpOwotICAgIF9jbXNGcmVlKGlvaGFuZGxlciAtPkNvbnRleHRJRCwgaW9oYW5kbGVyKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vLyBDcmVhdGUgYSBpb2hhbmRsZXIgZm9yIG1lbW9yeSBibG9jay4gQWNjZXNzTW9kZT09J3InIGFzc3VtZXMgdGhlIGlvaGFuZGxlciBpcyBnb2luZyB0byByZWFkLCBhbmQgbWFrZXMKLS8vIGEgY29weSBvZiB0aGUgbWVtb3J5IGJsb2NrIGZvciBsZXR0aW5nIHVzZXIgdG8gZnJlZSB0aGUgbWVtb3J5IGFmdGVyIGludm9raW5nIG9wZW4gcHJvZmlsZS4gSW4gd3JpdGUKLS8vIG1vZGUgKCJ3IiksIEJ1ZmZlcmUgcG9pbnRzIHRvIHRoZSBiZWdpbiBvZiBtZW1vcnkgYmxvY2sgdG8gYmUgd3JpdHRlbi4KLWNtc0lPSEFORExFUiogQ01TRVhQT1JUIGNtc09wZW5JT2hhbmRsZXJGcm9tTWVtKGNtc0NvbnRleHQgQ29udGV4dElELCB2b2lkICpCdWZmZXIsIGNtc1VJbnQzMk51bWJlciBzaXplLCBjb25zdCBjaGFyKiBBY2Nlc3NNb2RlKQotewotICAgIGNtc0lPSEFORExFUiogaW9oYW5kbGVyID0gTlVMTDsKLSAgICBGSUxFTUVNKiBmbSA9IE5VTEw7Ci0KLSAgICBfY21zQXNzZXJ0KEFjY2Vzc01vZGUgIT0gTlVMTCk7Ci0KLSAgICBpb2hhbmRsZXIgPSAoY21zSU9IQU5ETEVSKikgX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBzaXplb2YoY21zSU9IQU5ETEVSKSk7Ci0gICAgaWYgKGlvaGFuZGxlciA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIHN3aXRjaCAoKkFjY2Vzc01vZGUpIHsKLQotICAgIGNhc2UgJ3InOgotICAgICAgICBmbSA9IChGSUxFTUVNKikgX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBzaXplb2YoRklMRU1FTSkpOwotICAgICAgICBpZiAoZm0gPT0gTlVMTCkgZ290byBFcnJvcjsKLQotICAgICAgICBpZiAoQnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfUkVBRCwgIkNvdWxkbid0IHJlYWQgcHJvZmlsZSBmcm9tIE5VTEwgcG9pbnRlciIpOwotICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICAgICAgfQotCi0gICAgICAgIGZtIC0+QmxvY2sgPSAoY21zVUludDhOdW1iZXIqKSBfY21zTWFsbG9jKENvbnRleHRJRCwgc2l6ZSk7Ci0gICAgICAgIGlmIChmbSAtPkJsb2NrID09IE5VTEwpIHsKLQotICAgICAgICAgICAgX2Ntc0ZyZWUoQ29udGV4dElELCBmbSk7Ci0gICAgICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIGlvaGFuZGxlcik7Ci0gICAgICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX1JFQUQsICJDb3VsZG4ndCBhbGxvY2F0ZSAlbGQgYnl0ZXMgZm9yIHByb2ZpbGUiLCBzaXplKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLQotICAgICAgICBtZW1tb3ZlKGZtLT5CbG9jaywgQnVmZmVyLCBzaXplKTsKLSAgICAgICAgZm0gLT5GcmVlQmxvY2tPbkNsb3NlID0gVFJVRTsKLSAgICAgICAgZm0gLT5TaXplICAgID0gc2l6ZTsKLSAgICAgICAgZm0gLT5Qb2ludGVyID0gMDsKLSAgICAgICAgaW9oYW5kbGVyIC0+IFJlcG9ydGVkU2l6ZSA9IHNpemU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAndyc6Ci0gICAgICAgIGZtID0gKEZJTEVNRU0qKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihGSUxFTUVNKSk7Ci0gICAgICAgIGlmIChmbSA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgICAgIGZtIC0+QmxvY2sgPSAoY21zVUludDhOdW1iZXIqKSBCdWZmZXI7Ci0gICAgICAgIGZtIC0+RnJlZUJsb2NrT25DbG9zZSA9IEZBTFNFOwotICAgICAgICBmbSAtPlNpemUgICAgPSBzaXplOwotICAgICAgICBmbSAtPlBvaW50ZXIgPSAwOwotICAgICAgICBpb2hhbmRsZXIgLT4gUmVwb3J0ZWRTaXplID0gMDsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5rbm93biBhY2Nlc3MgbW9kZSAnJWMnIiwgKkFjY2Vzc01vZGUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpb2hhbmRsZXIgLT5Db250ZXh0SUQgPSBDb250ZXh0SUQ7Ci0gICAgaW9oYW5kbGVyIC0+c3RyZWFtICA9ICh2b2lkKikgZm07Ci0gICAgaW9oYW5kbGVyIC0+VXNlZFNwYWNlID0gMDsKLSAgICBpb2hhbmRsZXIgLT5QaHlzaWNhbEZpbGVbMF0gPSAwOwotCi0gICAgaW9oYW5kbGVyIC0+UmVhZCAgICA9IE1lbW9yeVJlYWQ7Ci0gICAgaW9oYW5kbGVyIC0+U2VlayAgICA9IE1lbW9yeVNlZWs7Ci0gICAgaW9oYW5kbGVyIC0+Q2xvc2UgICA9IE1lbW9yeUNsb3NlOwotICAgIGlvaGFuZGxlciAtPlRlbGwgICAgPSBNZW1vcnlUZWxsOwotICAgIGlvaGFuZGxlciAtPldyaXRlICAgPSBNZW1vcnlXcml0ZTsKLQotICAgIHJldHVybiBpb2hhbmRsZXI7Ci0KLUVycm9yOgotICAgIGlmIChmbSkgX2Ntc0ZyZWUoQ29udGV4dElELCBmbSk7Ci0gICAgaWYgKGlvaGFuZGxlcikgX2Ntc0ZyZWUoQ29udGV4dElELCBpb2hhbmRsZXIpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vLyBGaWxlLWJhc2VkIHN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFJlYWQgY291bnQgZWxlbWVudHMgb2Ygc2l6ZSBieXRlcyBlYWNoLiBSZXR1cm4gbnVtYmVyIG9mIGVsZW1lbnRzIHJlYWQKLXN0YXRpYwotY21zVUludDMyTnVtYmVyIEZpbGVSZWFkKGNtc0lPSEFORExFUiogaW9oYW5kbGVyLCB2b2lkICpCdWZmZXIsIGNtc1VJbnQzMk51bWJlciBzaXplLCBjbXNVSW50MzJOdW1iZXIgY291bnQpCi17Ci0gICAgY21zVUludDMyTnVtYmVyIG5SZWFkZWQgPSAoY21zVUludDMyTnVtYmVyKSBmcmVhZChCdWZmZXIsIHNpemUsIGNvdW50LCAoRklMRSopIGlvaGFuZGxlci0+c3RyZWFtKTsKLQotICAgIGlmIChuUmVhZGVkICE9IGNvdW50KSB7Ci0gICAgICAgICAgICBjbXNTaWduYWxFcnJvcihpb2hhbmRsZXIgLT5Db250ZXh0SUQsIGNtc0VSUk9SX0ZJTEUsICJSZWFkIGVycm9yLiBHb3QgJWQgYnl0ZXMsIGJsb2NrIHNob3VsZCBiZSBvZiAlZCBieXRlcyIsIG5SZWFkZWQgKiBzaXplLCBjb3VudCAqIHNpemUpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5SZWFkZWQ7Ci19Ci0KLS8vIFBvc3Rpb24gZmlsZSBwb2ludGVyIGluIHRoZSBmaWxlCi1zdGF0aWMKLWNtc0Jvb2wgIEZpbGVTZWVrKGNtc0lPSEFORExFUiogaW9oYW5kbGVyLCBjbXNVSW50MzJOdW1iZXIgb2Zmc2V0KQotewotICAgIGlmIChmc2VlaygoRklMRSopIGlvaGFuZGxlciAtPnN0cmVhbSwgKGxvbmcpIG9mZnNldCwgU0VFS19TRVQpICE9IDApIHsKLQotICAgICAgIGNtc1NpZ25hbEVycm9yKGlvaGFuZGxlciAtPkNvbnRleHRJRCwgY21zRVJST1JfRklMRSwgIlNlZWsgZXJyb3I7IHByb2JhYmx5IGNvcnJ1cHRlZCBmaWxlIik7Ci0gICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vLyBSZXR1cm5zIGZpbGUgcG9pbnRlciBwb3NpdGlvbgotc3RhdGljCi1jbXNVSW50MzJOdW1iZXIgRmlsZVRlbGwoY21zSU9IQU5ETEVSKiBpb2hhbmRsZXIpCi17Ci0gICAgcmV0dXJuIChjbXNVSW50MzJOdW1iZXIpIGZ0ZWxsKChGSUxFKilpb2hhbmRsZXIgLT5zdHJlYW0pOwotfQotCi0vLyBXcml0ZXMgZGF0YSB0byBzdHJlYW0sIGFsc28ga2VlcHMgdXNlZCBzcGFjZSBmb3IgZnVydGhlciByZWZlcmVuY2UuIFJldHVybnMgVFJVRSBvbiBzdWNjZXNzLCBGQUxTRSBvbiBlcnJvcgotc3RhdGljCi1jbXNCb29sICBGaWxlV3JpdGUoY21zSU9IQU5ETEVSKiBpb2hhbmRsZXIsIGNtc1VJbnQzMk51bWJlciBzaXplLCBjb25zdCB2b2lkKiBCdWZmZXIpCi17Ci0gICAgICAgaWYgKHNpemUgPT0gMCkgcmV0dXJuIFRSVUU7ICAvLyBXZSBhbGxvdyB0byB3cml0ZSAwIGJ5dGVzLCBidXQgbm90aGluZyBpcyB3cml0dGVuCi0KLSAgICAgICBpb2hhbmRsZXItPlVzZWRTcGFjZSArPSBzaXplOwotICAgICAgIHJldHVybiAoZndyaXRlKEJ1ZmZlciwgc2l6ZSwgMSwgKEZJTEUqKSBpb2hhbmRsZXItPnN0cmVhbSkgPT0gMSk7Ci19Ci0KLS8vIENsb3NlcyB0aGUgZmlsZQotc3RhdGljCi1jbXNCb29sICBGaWxlQ2xvc2UoY21zSU9IQU5ETEVSKiBpb2hhbmRsZXIpCi17Ci0gICAgaWYgKGZjbG9zZSgoRklMRSopIGlvaGFuZGxlciAtPnN0cmVhbSkgIT0gMCkgcmV0dXJuIEZBTFNFOwotICAgIF9jbXNGcmVlKGlvaGFuZGxlciAtPkNvbnRleHRJRCwgaW9oYW5kbGVyKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLy8gQ3JlYXRlIGEgaW9oYW5kbGVyIGZvciBkaXNrIGJhc2VkIGZpbGVzLgotY21zSU9IQU5ETEVSKiBDTVNFWFBPUlQgY21zT3BlbklPaGFuZGxlckZyb21GaWxlKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCBjaGFyKiBGaWxlTmFtZSwgY29uc3QgY2hhciogQWNjZXNzTW9kZSkKLXsKLSAgICBjbXNJT0hBTkRMRVIqIGlvaGFuZGxlciA9IE5VTEw7Ci0gICAgRklMRSogZm0gPSBOVUxMOwotCi0gICAgX2Ntc0Fzc2VydChGaWxlTmFtZSAhPSBOVUxMKTsKLSAgICBfY21zQXNzZXJ0KEFjY2Vzc01vZGUgIT0gTlVMTCk7Ci0KLSAgICBpb2hhbmRsZXIgPSAoY21zSU9IQU5ETEVSKikgX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBzaXplb2YoY21zSU9IQU5ETEVSKSk7Ci0gICAgaWYgKGlvaGFuZGxlciA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIHN3aXRjaCAoKkFjY2Vzc01vZGUpIHsKLQotICAgIGNhc2UgJ3InOgotICAgICAgICBmbSA9IGZvcGVuKEZpbGVOYW1lLCAicmIiKTsKLSAgICAgICAgaWYgKGZtID09IE5VTEwpIHsKLSAgICAgICAgICAgIF9jbXNGcmVlKENvbnRleHRJRCwgaW9oYW5kbGVyKTsKLSAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX0ZJTEUsICJGaWxlICclcycgbm90IGZvdW5kIiwgRmlsZU5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgaW9oYW5kbGVyIC0+IFJlcG9ydGVkU2l6ZSA9IChjbXNVSW50MzJOdW1iZXIpIGNtc2ZpbGVsZW5ndGgoZm0pOwotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgJ3cnOgotICAgICAgICBmbSA9IGZvcGVuKEZpbGVOYW1lLCAid2IiKTsKLSAgICAgICAgaWYgKGZtID09IE5VTEwpIHsKLSAgICAgICAgICAgIF9jbXNGcmVlKENvbnRleHRJRCwgaW9oYW5kbGVyKTsKLSAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX0ZJTEUsICJDb3VsZG4ndCBjcmVhdGUgJyVzJyIsIEZpbGVOYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlvaGFuZGxlciAtPiBSZXBvcnRlZFNpemUgPSAwOwotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIF9jbXNGcmVlKENvbnRleHRJRCwgaW9oYW5kbGVyKTsKLSAgICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfRklMRSwgIlVua25vd24gYWNjZXNzIG1vZGUgJyVjJyIsICpBY2Nlc3NNb2RlKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaW9oYW5kbGVyIC0+Q29udGV4dElEID0gQ29udGV4dElEOwotICAgIGlvaGFuZGxlciAtPnN0cmVhbSA9ICh2b2lkKikgZm07Ci0gICAgaW9oYW5kbGVyIC0+VXNlZFNwYWNlID0gMDsKLQotICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIG9yaWdpbmFsIGZpbGUgICAgCi0gICAgc3RybmNweShpb2hhbmRsZXIgLT4gUGh5c2ljYWxGaWxlLCBGaWxlTmFtZSwgc2l6ZW9mKGlvaGFuZGxlciAtPiBQaHlzaWNhbEZpbGUpLTEpOwotICAgIGlvaGFuZGxlciAtPiBQaHlzaWNhbEZpbGVbc2l6ZW9mKGlvaGFuZGxlciAtPiBQaHlzaWNhbEZpbGUpLTFdID0gMDsKLQotICAgIGlvaGFuZGxlciAtPlJlYWQgICAgPSBGaWxlUmVhZDsKLSAgICBpb2hhbmRsZXIgLT5TZWVrICAgID0gRmlsZVNlZWs7Ci0gICAgaW9oYW5kbGVyIC0+Q2xvc2UgICA9IEZpbGVDbG9zZTsKLSAgICBpb2hhbmRsZXIgLT5UZWxsICAgID0gRmlsZVRlbGw7Ci0gICAgaW9oYW5kbGVyIC0+V3JpdGUgICA9IEZpbGVXcml0ZTsKLQotICAgIHJldHVybiBpb2hhbmRsZXI7Ci19Ci0KLS8vIENyZWF0ZSBhIGlvaGFuZGxlciBmb3Igc3RyZWFtIGJhc2VkIGZpbGVzCi1jbXNJT0hBTkRMRVIqIENNU0VYUE9SVCBjbXNPcGVuSU9oYW5kbGVyRnJvbVN0cmVhbShjbXNDb250ZXh0IENvbnRleHRJRCwgRklMRSogU3RyZWFtKQotewotICAgIGNtc0lPSEFORExFUiogaW9oYW5kbGVyID0gTlVMTDsKLQotICAgIGlvaGFuZGxlciA9IChjbXNJT0hBTkRMRVIqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihjbXNJT0hBTkRMRVIpKTsKLSAgICBpZiAoaW9oYW5kbGVyID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgaW9oYW5kbGVyIC0+IENvbnRleHRJRCA9IENvbnRleHRJRDsKLSAgICBpb2hhbmRsZXIgLT4gc3RyZWFtID0gKHZvaWQqKSBTdHJlYW07Ci0gICAgaW9oYW5kbGVyIC0+IFVzZWRTcGFjZSA9IDA7Ci0gICAgaW9oYW5kbGVyIC0+IFJlcG9ydGVkU2l6ZSA9IChjbXNVSW50MzJOdW1iZXIpIGNtc2ZpbGVsZW5ndGgoU3RyZWFtKTsKLSAgICBpb2hhbmRsZXIgLT4gUGh5c2ljYWxGaWxlWzBdID0gMDsKLQotICAgIGlvaGFuZGxlciAtPlJlYWQgICAgPSBGaWxlUmVhZDsKLSAgICBpb2hhbmRsZXIgLT5TZWVrICAgID0gRmlsZVNlZWs7Ci0gICAgaW9oYW5kbGVyIC0+Q2xvc2UgICA9IEZpbGVDbG9zZTsKLSAgICBpb2hhbmRsZXIgLT5UZWxsICAgID0gRmlsZVRlbGw7Ci0gICAgaW9oYW5kbGVyIC0+V3JpdGUgICA9IEZpbGVXcml0ZTsKLQotICAgIHJldHVybiBpb2hhbmRsZXI7Ci19Ci0KLQotCi0vLyBDbG9zZSBhbiBvcGVuIElPIGhhbmRsZXIKLWNtc0Jvb2wgQ01TRVhQT1JUIGNtc0Nsb3NlSU9oYW5kbGVyKGNtc0lPSEFORExFUiogaW8pCi17Ci0gICAgcmV0dXJuIGlvIC0+IENsb3NlKGlvKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWZkZWYgX1dJTjMyX1dDRQotdGltZV90IHdjZWV4X3RpbWUodGltZV90ICp0aW1lcik7Ci1zdHJ1Y3QgdG0gKiB3Y2VleF9nbXRpbWUoY29uc3QgdGltZV90ICp0aW1lcik7Ci0KLSNkZWZpbmUgdGltZSB3Y2VleF90aW1lCi0jZGVmaW5lIGdtdGltZSB3Y2VleF9nbXRpbWUKLSNlbmRpZgotCi0vLyBDcmVhdGVzIGFuIGVtcHR5IHN0cnVjdHVyZSBob2xkaW5nIGFsbCByZXF1aXJlZCBwYXJhbWV0ZXJzCi1jbXNIUFJPRklMRSBDTVNFWFBPUlQgY21zQ3JlYXRlUHJvZmlsZVBsYWNlaG9sZGVyKGNtc0NvbnRleHQgQ29udGV4dElEKQotewotICAgIHRpbWVfdCBub3cgPSB0aW1lKE5VTEwpOwotICAgIF9jbXNJQ0NQUk9GSUxFKiBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihfY21zSUNDUFJPRklMRSkpOwotICAgIGlmIChJY2MgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBJY2MgLT5Db250ZXh0SUQgPSBDb250ZXh0SUQ7Ci0KLSAgICAvLyBTZXQgaXQgdG8gZW1wdHkKLSAgICBJY2MgLT4gVGFnQ291bnQgICA9IDA7Ci0KLSAgICAvLyBTZXQgZGVmYXVsdCB2ZXJzaW9uCi0gICAgSWNjIC0+VmVyc2lvbiA9ICAweDAyMTAwMDAwOwotCi0gICAgLy8gU2V0IGNyZWF0aW9uIGRhdGUvdGltZQotICAgIG1lbW1vdmUoJkljYyAtPkNyZWF0ZWQsIGdtdGltZSgmbm93KSwgc2l6ZW9mKEljYyAtPkNyZWF0ZWQpKTsKLQotICAgIC8vIENyZWF0ZSBhIG11dGV4IGlmIHRoZSB1c2VyIHByb3ZpZGVkIHByb3BlciBwbHVnaW4uIE5VTEwgb3RoZXJ3aXNlCi0gICAgSWNjIC0+VXNyTXV0ZXggPSBfY21zQ3JlYXRlTXV0ZXgoQ29udGV4dElEKTsKLQotICAgIC8vIFJldHVybiB0aGUgaGFuZGxlCi0gICAgcmV0dXJuIChjbXNIUFJPRklMRSkgSWNjOwotfQotCi1jbXNDb250ZXh0IENNU0VYUE9SVCBjbXNHZXRQcm9maWxlQ29udGV4dElEKGNtc0hQUk9GSUxFIGhQcm9maWxlKQotewotICAgICBfY21zSUNDUFJPRklMRSogSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7Ci0KLSAgICBpZiAoSWNjID09IE5VTEwpIHJldHVybiBOVUxMOwotICAgIHJldHVybiBJY2MgLT4gQ29udGV4dElEOwotfQotCi0KLS8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHRhZ3MKLWNtc0ludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNHZXRUYWdDb3VudChjbXNIUFJPRklMRSBoUHJvZmlsZSkKLXsKLSAgICBfY21zSUNDUFJPRklMRSogSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7Ci0gICAgaWYgKEljYyA9PSBOVUxMKSByZXR1cm4gLTE7Ci0KLSAgICByZXR1cm4gIEljYy0+VGFnQ291bnQ7Ci19Ci0KLS8vIFJldHVybiB0aGUgdGFnIHNpZ25hdHVyZSBvZiBhIGdpdmVuIHRhZyBudW1iZXIKLWNtc1RhZ1NpZ25hdHVyZSBDTVNFWFBPUlQgY21zR2V0VGFnU2lnbmF0dXJlKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50MzJOdW1iZXIgbikKLXsKLSAgICBfY21zSUNDUFJPRklMRSogSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7Ci0KLSAgICBpZiAobiA+IEljYy0+VGFnQ291bnQpIHJldHVybiAoY21zVGFnU2lnbmF0dXJlKSAwOyAgLy8gTWFyayBhcyBub3QgYXZhaWxhYmxlCi0gICAgaWYgKG4gPj0gTUFYX1RBQkxFX1RBRykgcmV0dXJuIChjbXNUYWdTaWduYXR1cmUpIDA7IC8vIEFzIGRvdWJsZSBjaGVjawotCi0gICAgcmV0dXJuIEljYyAtPlRhZ05hbWVzW25dOwotfQotCi0KLXN0YXRpYwotaW50IFNlYXJjaE9uZVRhZyhfY21zSUNDUFJPRklMRSogUHJvZmlsZSwgY21zVGFnU2lnbmF0dXJlIHNpZykKLXsKLSAgICBjbXNVSW50MzJOdW1iZXIgaTsKLQotICAgIGZvciAoaT0wOyBpIDwgUHJvZmlsZSAtPiBUYWdDb3VudDsgaSsrKSB7Ci0KLSAgICAgICAgaWYgKHNpZyA9PSBQcm9maWxlIC0+IFRhZ05hbWVzW2ldKQotICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgfQotCi0gICAgcmV0dXJuIC0xOwotfQotCi0vLyBTZWFyY2ggZm9yIGEgc3BlY2lmaWMgdGFnIGluIHRhZyBkaWN0aW9uYXJ5LiBSZXR1cm5zIHBvc2l0aW9uIG9yIC0xIGlmIHRhZyBub3QgZm91bmQuCi0vLyBJZiBmb2xsb3dsaW5rcyBpcyB0dXJuZWQgb24sIHRoZW4gdGhlIHBvc2l0aW9uIG9mIHRoZSBsaW5rZWQgdGFnIGlzIHJldHVybmVkCi1pbnQgX2Ntc1NlYXJjaFRhZyhfY21zSUNDUFJPRklMRSogSWNjLCBjbXNUYWdTaWduYXR1cmUgc2lnLCBjbXNCb29sIGxGb2xsb3dMaW5rcykKLXsKLSAgICBpbnQgbjsKLSAgICBjbXNUYWdTaWduYXR1cmUgTGlua2VkU2lnOwotCi0gICAgZG8gewotCi0gICAgICAgIC8vIFNlYXJjaCBmb3IgZ2l2ZW4gdGFnIGluIElDQyBwcm9maWxlIGRpcmVjdG9yeQotICAgICAgICBuID0gU2VhcmNoT25lVGFnKEljYywgc2lnKTsKLSAgICAgICAgaWYgKG4gPCAwKQotICAgICAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgLy8gTm90IGZvdW5kCi0KLSAgICAgICAgaWYgKCFsRm9sbG93TGlua3MpCi0gICAgICAgICAgICByZXR1cm4gbjsgICAgICAgICAvLyBGb3VuZCwgZG9uJ3QgZm9sbG93IGxpbmtzCi0KLSAgICAgICAgLy8gSXMgdGhpcyBhIGxpbmtlZCB0YWc/Ci0gICAgICAgIExpbmtlZFNpZyA9IEljYyAtPlRhZ0xpbmtlZFtuXTsKLQotICAgICAgICAvLyBZZXMsIGZvbGxvdyBsaW5rCi0gICAgICAgIGlmIChMaW5rZWRTaWcgIT0gKGNtc1RhZ1NpZ25hdHVyZSkgMCkgewotCQkJLy8gZml4IGJ1ZyBtYW50aXMgaWQjMDA1NTk0MgotCQkJLy8gYXNzdW1lIHRoYXQgVFJDVGFnIGFuZCBDb2xvcmFudFRhZyBjYW4ndCBiZSBsaW5rZWQuCi0JCQkvLyBYaWFvY2h1YW4gTGl1IDIwMTQtMDQtMjMKLQkJCWlmICgoc2lnID09IGNtc1NpZ1JlZFRSQ1RhZyB8fCBzaWcgPT0gY21zU2lnR3JlZW5UUkNUYWcgfHwgc2lnID09IGNtc1NpZ0JsdWVUUkNUYWcpICYmIAotCQkJCShMaW5rZWRTaWcgPT0gY21zU2lnUmVkQ29sb3JhbnRUYWcgfHwgTGlua2VkU2lnID09IGNtc1NpZ0dyZWVuQ29sb3JhbnRUYWcgfHwgTGlua2VkU2lnID09IGNtc1NpZ0JsdWVDb2xvcmFudFRhZykpCi0JCQl7Ci0JCQkJcmV0dXJuIG47Ci0JCQl9Ci0gICAgICAgICAgICBzaWcgPSBMaW5rZWRTaWc7Ci0gICAgICAgIH0KLQotICAgIH0gd2hpbGUgKExpbmtlZFNpZyAhPSAoY21zVGFnU2lnbmF0dXJlKSAwKTsKLQotICAgIHJldHVybiBuOwotfQotCi0vLyBEZWxldGVzIGEgdGFnIGVudHJ5Ci0KLXN0YXRpYwotdm9pZCBfY21zRGVsZXRlVGFnQnlQb3MoX2Ntc0lDQ1BST0ZJTEUqIEljYywgaW50IGkpCi17Ci0gICAgX2Ntc0Fzc2VydChJY2MgIT0gTlVMTCk7Ci0gICAgX2Ntc0Fzc2VydChpID49IDApOwotCi0gICAKLSAgICBpZiAoSWNjIC0+IFRhZ1B0cnNbaV0gIT0gTlVMTCkgewotCi0gICAgICAgIC8vIEZyZWUgcHJldmlvdXMgdmVyc2lvbgotICAgICAgICBpZiAoSWNjIC0+VGFnU2F2ZUFzUmF3W2ldKSB7Ci0gICAgICAgICAgICBfY21zRnJlZShJY2MgLT5Db250ZXh0SUQsIEljYyAtPlRhZ1B0cnNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgY21zVGFnVHlwZUhhbmRsZXIqIFR5cGVIYW5kbGVyID0gSWNjIC0+VGFnVHlwZUhhbmRsZXJzW2ldOwotCi0gICAgICAgICAgICBpZiAoVHlwZUhhbmRsZXIgIT0gTlVMTCkgewotCi0gICAgICAgICAgICAgICAgY21zVGFnVHlwZUhhbmRsZXIgTG9jYWxUeXBlSGFuZGxlciA9ICpUeXBlSGFuZGxlcjsKLSAgICAgICAgICAgICAgICBMb2NhbFR5cGVIYW5kbGVyLkNvbnRleHRJRCA9IEljYyAtPkNvbnRleHRJRDsgICAgICAgICAgICAgIC8vIEFzIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgTG9jYWxUeXBlSGFuZGxlci5JQ0NWZXJzaW9uID0gSWNjIC0+VmVyc2lvbjsKLSAgICAgICAgICAgICAgICBMb2NhbFR5cGVIYW5kbGVyLkZyZWVQdHIoJkxvY2FsVHlwZUhhbmRsZXIsIEljYyAtPiBUYWdQdHJzW2ldKTsKLSAgICAgICAgICAgICAgICBJY2MgLT5UYWdQdHJzW2ldID0gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgfSAKLX0KLQotCi0vLyBDcmVhdGVzIGEgbmV3IHRhZyBlbnRyeQotc3RhdGljCi1jbXNCb29sIF9jbXNOZXdUYWcoX2Ntc0lDQ1BST0ZJTEUqIEljYywgY21zVGFnU2lnbmF0dXJlIHNpZywgaW50KiBOZXdQb3MpCi17Ci0gICAgaW50IGk7Ci0KLSAgICAvLyBTZWFyY2ggZm9yIHRoZSB0YWcKLSAgICBpID0gX2Ntc1NlYXJjaFRhZyhJY2MsIHNpZywgRkFMU0UpOwotICAgIGlmIChpID49IDApIHsKLQotICAgICAgICAvLyBBbHJlYWR5IGV4aXN0cz8gZGVsZXRlIGl0Ci0gICAgICAgIF9jbXNEZWxldGVUYWdCeVBvcyhJY2MsIGkpOwotICAgICAgICAqTmV3UG9zID0gaTsKLSAgICB9Ci0gICAgZWxzZSAgewotCi0gICAgICAgIC8vIE5vLCBtYWtlIGEgbmV3IG9uZQotCi0gICAgICAgIGlmIChJY2MgLT4gVGFnQ291bnQgPj0gTUFYX1RBQkxFX1RBRykgewotICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoSWNjIC0+Q29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgIlRvbyBtYW55IHRhZ3MgKCVkKSIsIE1BWF9UQUJMRV9UQUcpOwotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgKk5ld1BvcyA9IEljYyAtPlRhZ0NvdW50OwotICAgICAgICBJY2MgLT4gVGFnQ291bnQrKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0vLyBDaGVjayBleGlzdGFuY2UKLWNtc0Jvb2wgQ01TRVhQT1JUIGNtc0lzVGFnKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNUYWdTaWduYXR1cmUgc2lnKQotewotICAgICAgIF9jbXNJQ0NQUk9GSUxFKiAgSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgKHZvaWQqKSBoUHJvZmlsZTsKLSAgICAgICByZXR1cm4gX2Ntc1NlYXJjaFRhZyhJY2MsIHNpZywgRkFMU0UpID49IDA7Ci19Ci0KLQotLy8gUmVhZCBwcm9maWxlIGhlYWRlciBhbmQgdmFsaWRhdGUgaXQKLWNtc0Jvb2wgX2Ntc1JlYWRIZWFkZXIoX2Ntc0lDQ1BST0ZJTEUqIEljYykKLXsKLSAgICBjbXNUYWdFbnRyeSBUYWc7Ci0gICAgY21zSUNDSGVhZGVyIEhlYWRlcjsKLSAgICBjbXNVSW50MzJOdW1iZXIgaSwgajsKLSAgICBjbXNVSW50MzJOdW1iZXIgSGVhZGVyU2l6ZTsKLSAgICBjbXNJT0hBTkRMRVIqIGlvID0gSWNjIC0+SU9oYW5kbGVyOwotICAgIGNtc1VJbnQzMk51bWJlciBUYWdDb3VudDsKLQotCi0gICAgLy8gUmVhZCB0aGUgaGVhZGVyCi0gICAgaWYgKGlvIC0+IFJlYWQoaW8sICZIZWFkZXIsIHNpemVvZihjbXNJQ0NIZWFkZXIpLCAxKSAhPSAxKSB7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICAvLyBWYWxpZGF0ZSBmaWxlIGFzIGFuIElDQyBwcm9maWxlCi0gICAgaWYgKF9jbXNBZGp1c3RFbmRpYW5lc3MzMihIZWFkZXIubWFnaWMpICE9IGNtc01hZ2ljTnVtYmVyKSB7Ci0gICAgICAgIGNtc1NpZ25hbEVycm9yKEljYyAtPkNvbnRleHRJRCwgY21zRVJST1JfQkFEX1NJR05BVFVSRSwgIm5vdCBhbiBJQ0MgcHJvZmlsZSwgaW52YWxpZCBzaWduYXR1cmUiKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIC8vIEFkanVzdCBlbmRpYW5lc3Mgb2YgdGhlIHVzZWQgcGFyYW1ldGVycwotICAgIEljYyAtPiBEZXZpY2VDbGFzcyAgICAgPSAoY21zUHJvZmlsZUNsYXNzU2lnbmF0dXJlKSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoSGVhZGVyLmRldmljZUNsYXNzKTsKLSAgICBJY2MgLT4gQ29sb3JTcGFjZSAgICAgID0gKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUpICAgX2Ntc0FkanVzdEVuZGlhbmVzczMyKEhlYWRlci5jb2xvclNwYWNlKTsKLSAgICBJY2MgLT4gUENTICAgICAgICAgICAgID0gKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUpICAgX2Ntc0FkanVzdEVuZGlhbmVzczMyKEhlYWRlci5wY3MpOwotICAgCi0gICAgSWNjIC0+IFJlbmRlcmluZ0ludGVudCA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMihIZWFkZXIucmVuZGVyaW5nSW50ZW50KTsKLSAgICBJY2MgLT4gZmxhZ3MgICAgICAgICAgID0gX2Ntc0FkanVzdEVuZGlhbmVzczMyKEhlYWRlci5mbGFncyk7Ci0gICAgSWNjIC0+IG1hbnVmYWN0dXJlciAgICA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMihIZWFkZXIubWFudWZhY3R1cmVyKTsKLSAgICBJY2MgLT4gbW9kZWwgICAgICAgICAgID0gX2Ntc0FkanVzdEVuZGlhbmVzczMyKEhlYWRlci5tb2RlbCk7Ci0gICAgSWNjIC0+IGNyZWF0b3IgICAgICAgICA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMihIZWFkZXIuY3JlYXRvcik7Ci0gICAgCi0gICAgX2Ntc0FkanVzdEVuZGlhbmVzczY0KCZJY2MgLT4gYXR0cmlidXRlcywgJkhlYWRlci5hdHRyaWJ1dGVzKTsKLSAgICBJY2MgLT4gVmVyc2lvbiAgICAgICAgID0gX2Ntc0FkanVzdEVuZGlhbmVzczMyKEhlYWRlci52ZXJzaW9uKTsKLQotICAgIC8vIEdldCBzaXplIGFzIHJlcG9ydGVkIGluIGhlYWRlcgotICAgIEhlYWRlclNpemUgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoSGVhZGVyLnNpemUpOwotCi0gICAgLy8gTWFrZSBzdXJlIEhlYWRlclNpemUgaXMgbG93ZXIgdGhhbiBwcm9maWxlIHNpemUKLSAgICBpZiAoSGVhZGVyU2l6ZSA+PSBJY2MgLT5JT2hhbmRsZXIgLT5SZXBvcnRlZFNpemUpCi0gICAgICAgICAgICBIZWFkZXJTaXplID0gSWNjIC0+SU9oYW5kbGVyIC0+UmVwb3J0ZWRTaXplOwotCi0KLSAgICAvLyBHZXQgY3JlYXRpb24gZGF0ZS90aW1lCi0gICAgX2Ntc0RlY29kZURhdGVUaW1lTnVtYmVyKCZIZWFkZXIuZGF0ZSwgJkljYyAtPkNyZWF0ZWQpOwotCi0gICAgLy8gVGhlIHByb2ZpbGUgSUQgYXJlIDMyIHJhdyBieXRlcwotICAgIG1lbW1vdmUoSWNjIC0+UHJvZmlsZUlELklEMzIsIEhlYWRlci5wcm9maWxlSUQuSUQzMiwgMTYpOwotCi0KLSAgICAvLyBSZWFkIHRhZyBkaXJlY3RvcnkKLSAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmVGFnQ291bnQpKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKFRhZ0NvdW50ID4gTUFYX1RBQkxFX1RBRykgewotCi0gICAgICAgIGNtc1NpZ25hbEVycm9yKEljYyAtPkNvbnRleHRJRCwgY21zRVJST1JfUkFOR0UsICJUb28gbWFueSB0YWdzICglZCkiLCBUYWdDb3VudCk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLQotICAgIC8vIFJlYWQgdGFnIGRpcmVjdG9yeQotICAgIEljYyAtPiBUYWdDb3VudCA9IDA7Ci0gICAgZm9yIChpPTA7IGkgPCBUYWdDb3VudDsgaSsrKSB7Ci0KLSAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgKGNtc1VJbnQzMk51bWJlciAqKSAmVGFnLnNpZykpIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJlRhZy5vZmZzZXQpKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZUYWcuc2l6ZSkpIHJldHVybiBGQUxTRTsKLQotICAgICAgICAvLyBQZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNrLiBPZmZzZXQgKyBzaXplIHNob3VsZCBmYWxsIGluc2lkZSBmaWxlLgotICAgICAgICBpZiAoVGFnLm9mZnNldCArIFRhZy5zaXplID4gSGVhZGVyU2l6ZSB8fAotICAgICAgICAgICAgVGFnLm9mZnNldCArIFRhZy5zaXplIDwgVGFnLm9mZnNldCkKLSAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIEljYyAtPiBUYWdOYW1lc1tJY2MgLT5UYWdDb3VudF0gICA9IFRhZy5zaWc7Ci0gICAgICAgIEljYyAtPiBUYWdPZmZzZXRzW0ljYyAtPlRhZ0NvdW50XSA9IFRhZy5vZmZzZXQ7Ci0gICAgICAgIEljYyAtPiBUYWdTaXplc1tJY2MgLT5UYWdDb3VudF0gICA9IFRhZy5zaXplOwotCi0gICAgICAgLy8gU2VhcmNoIGZvciBsaW5rcwotICAgICAgICBmb3IgKGo9MDsgaiA8IEljYyAtPlRhZ0NvdW50OyBqKyspIHsKLQotICAgICAgICAgICAgaWYgKChJY2MgLT5UYWdPZmZzZXRzW2pdID09IFRhZy5vZmZzZXQpICYmCi0gICAgICAgICAgICAgICAgKEljYyAtPlRhZ1NpemVzW2pdICAgPT0gVGFnLnNpemUpICYmCi0gICAgICAgICAgICAgICAgKEljYyAtPlRhZ05hbWVzW2pdICAgPT0gVGFnLnNpZykpIHsKLQotICAgICAgICAgICAgICAgIEljYyAtPlRhZ0xpbmtlZFtJY2MgLT5UYWdDb3VudF0gPSBJY2MgLT5UYWdOYW1lc1tqXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICB9Ci0KLSAgICAgICAgSWNjIC0+VGFnQ291bnQrKzsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLy8gU2F2ZXMgcHJvZmlsZSBoZWFkZXIKLWNtc0Jvb2wgX2Ntc1dyaXRlSGVhZGVyKF9jbXNJQ0NQUk9GSUxFKiBJY2MsIGNtc1VJbnQzMk51bWJlciBVc2VkU3BhY2UpCi17Ci0gICAgY21zSUNDSGVhZGVyIEhlYWRlcjsKLSAgICBjbXNVSW50MzJOdW1iZXIgaTsKLSAgICBjbXNUYWdFbnRyeSBUYWc7Ci0gICAgY21zSW50MzJOdW1iZXIgQ291bnQgPSAwOwotCi0gICAgSGVhZGVyLnNpemUgICAgICAgID0gX2Ntc0FkanVzdEVuZGlhbmVzczMyKFVzZWRTcGFjZSk7Ci0gICAgSGVhZGVyLmNtbUlkICAgICAgID0gX2Ntc0FkanVzdEVuZGlhbmVzczMyKGxjbXNTaWduYXR1cmUpOwotICAgIEhlYWRlci52ZXJzaW9uICAgICA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMihJY2MgLT5WZXJzaW9uKTsKLQotICAgIEhlYWRlci5kZXZpY2VDbGFzcyA9IChjbXNQcm9maWxlQ2xhc3NTaWduYXR1cmUpIF9jbXNBZGp1c3RFbmRpYW5lc3MzMihJY2MgLT4gRGV2aWNlQ2xhc3MpOwotICAgIEhlYWRlci5jb2xvclNwYWNlICA9IChjbXNDb2xvclNwYWNlU2lnbmF0dXJlKSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoSWNjIC0+IENvbG9yU3BhY2UpOwotICAgIEhlYWRlci5wY3MgICAgICAgICA9IChjbXNDb2xvclNwYWNlU2lnbmF0dXJlKSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoSWNjIC0+IFBDUyk7Ci0KLSAgICAvLyAgIE5PVEU6IGluIHY0IFRpbWVzdGFtcCBtdXN0IGJlIGluIFVUQyByYXRoZXIgdGhhbiBpbiBsb2NhbCB0aW1lCi0gICAgX2Ntc0VuY29kZURhdGVUaW1lTnVtYmVyKCZIZWFkZXIuZGF0ZSwgJkljYyAtPkNyZWF0ZWQpOwotCi0gICAgSGVhZGVyLm1hZ2ljICAgICAgID0gX2Ntc0FkanVzdEVuZGlhbmVzczMyKGNtc01hZ2ljTnVtYmVyKTsKLQotI2lmZGVmIENNU19JU19XSU5ET1dTXwotICAgIEhlYWRlci5wbGF0Zm9ybSAgICA9IChjbXNQbGF0Zm9ybVNpZ25hdHVyZSkgX2Ntc0FkanVzdEVuZGlhbmVzczMyKGNtc1NpZ01pY3Jvc29mdCk7Ci0jZWxzZQotICAgIEhlYWRlci5wbGF0Zm9ybSAgICA9IChjbXNQbGF0Zm9ybVNpZ25hdHVyZSkgX2Ntc0FkanVzdEVuZGlhbmVzczMyKGNtc1NpZ01hY2ludG9zaCk7Ci0jZW5kaWYKLQotICAgIEhlYWRlci5mbGFncyAgICAgICAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoSWNjIC0+IGZsYWdzKTsKLSAgICBIZWFkZXIubWFudWZhY3R1cmVyID0gX2Ntc0FkanVzdEVuZGlhbmVzczMyKEljYyAtPiBtYW51ZmFjdHVyZXIpOwotICAgIEhlYWRlci5tb2RlbCAgICAgICAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoSWNjIC0+IG1vZGVsKTsKLQotICAgIF9jbXNBZGp1c3RFbmRpYW5lc3M2NCgmSGVhZGVyLmF0dHJpYnV0ZXMsICZJY2MgLT4gYXR0cmlidXRlcyk7Ci0KLSAgICAvLyBSZW5kZXJpbmcgaW50ZW50IGluIHRoZSBoZWFkZXIgKGZvciBlbWJlZGRlZCBwcm9maWxlcykKLSAgICBIZWFkZXIucmVuZGVyaW5nSW50ZW50ID0gX2Ntc0FkanVzdEVuZGlhbmVzczMyKEljYyAtPiBSZW5kZXJpbmdJbnRlbnQpOwotCi0gICAgLy8gSWxsdW1pbmFudCBpcyBhbHdheXMgRDUwCi0gICAgSGVhZGVyLmlsbHVtaW5hbnQuWCA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMihfY21zRG91YmxlVG8xNUZpeGVkMTYoY21zRDUwX1hZWigpLT5YKSk7Ci0gICAgSGVhZGVyLmlsbHVtaW5hbnQuWSA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMihfY21zRG91YmxlVG8xNUZpeGVkMTYoY21zRDUwX1hZWigpLT5ZKSk7Ci0gICAgSGVhZGVyLmlsbHVtaW5hbnQuWiA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMihfY21zRG91YmxlVG8xNUZpeGVkMTYoY21zRDUwX1hZWigpLT5aKSk7Ci0KLSAgICAvLyBDcmVhdGVkIGJ5IExpdHRsZUNNUyAodGhhdCdzIG1lISkKLSAgICBIZWFkZXIuY3JlYXRvciAgICAgID0gX2Ntc0FkanVzdEVuZGlhbmVzczMyKGxjbXNTaWduYXR1cmUpOwotCi0gICAgbWVtc2V0KCZIZWFkZXIucmVzZXJ2ZWQsIDAsIHNpemVvZihIZWFkZXIucmVzZXJ2ZWQpKTsKLQotICAgIC8vIFNldCBwcm9maWxlIElELiBFbmRpYW5lc3MgaXMgYWx3YXlzIGJpZyBlbmRpYW4KLSAgICBtZW1tb3ZlKCZIZWFkZXIucHJvZmlsZUlELCAmSWNjIC0+UHJvZmlsZUlELCAxNik7Ci0KLSAgICAvLyBEdW1wIHRoZSBoZWFkZXIKLSAgICBpZiAoIUljYyAtPiBJT2hhbmRsZXItPldyaXRlKEljYy0+SU9oYW5kbGVyLCBzaXplb2YoY21zSUNDSGVhZGVyKSwgJkhlYWRlcikpIHJldHVybiBGQUxTRTsKLQotICAgIC8vIFNhdmVzIFRhZyBkaXJlY3RvcnkKLQotICAgIC8vIEdldCB0cnVlIGNvdW50Ci0gICAgZm9yIChpPTA7ICBpIDwgSWNjIC0+IFRhZ0NvdW50OyBpKyspIHsKLSAgICAgICAgaWYgKEljYyAtPlRhZ05hbWVzW2ldICE9IDApCi0gICAgICAgICAgICBDb3VudCsrOwotICAgIH0KLQotICAgIC8vIFN0b3JlIG51bWJlciBvZiB0YWdzCi0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoSWNjIC0+SU9oYW5kbGVyLCBDb3VudCkpIHJldHVybiBGQUxTRTsKLQotICAgIGZvciAoaT0wOyBpIDwgSWNjIC0+IFRhZ0NvdW50OyBpKyspIHsKLQotICAgICAgICBpZiAoSWNjIC0+VGFnTmFtZXNbaV0gPT0gMCkgY29udGludWU7ICAgLy8gSXQgaXMganVzdCBhIHBsYWNlaG9sZGVyCi0KLSAgICAgICAgVGFnLnNpZyAgICA9IChjbXNUYWdTaWduYXR1cmUpIF9jbXNBZGp1c3RFbmRpYW5lc3MzMigoY21zSW50MzJOdW1iZXIpIEljYyAtPiBUYWdOYW1lc1tpXSk7Ci0gICAgICAgIFRhZy5vZmZzZXQgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoKGNtc0ludDMyTnVtYmVyKSBJY2MgLT4gVGFnT2Zmc2V0c1tpXSk7Ci0gICAgICAgIFRhZy5zaXplICAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoKGNtc0ludDMyTnVtYmVyKSBJY2MgLT4gVGFnU2l6ZXNbaV0pOwotCi0gICAgICAgIGlmICghSWNjIC0+SU9oYW5kbGVyIC0+IFdyaXRlKEljYy0+IElPaGFuZGxlciwgc2l6ZW9mKGNtc1RhZ0VudHJ5KSwgJlRhZykpIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU2V0L0dldCBzZXZlcmFsIHN0cnVjdCBtZW1iZXJzCi0KLQotY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNHZXRIZWFkZXJSZW5kZXJpbmdJbnRlbnQoY21zSFBST0ZJTEUgaFByb2ZpbGUpCi17Ci0gICAgX2Ntc0lDQ1BST0ZJTEUqICBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKLSAgICByZXR1cm4gSWNjIC0+IFJlbmRlcmluZ0ludGVudDsKLX0KLQotdm9pZCBDTVNFWFBPUlQgY21zU2V0SGVhZGVyUmVuZGVyaW5nSW50ZW50KGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50MzJOdW1iZXIgUmVuZGVyaW5nSW50ZW50KQotewotICAgIF9jbXNJQ0NQUk9GSUxFKiAgSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7Ci0gICAgSWNjIC0+IFJlbmRlcmluZ0ludGVudCA9IFJlbmRlcmluZ0ludGVudDsKLX0KLQotY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNHZXRIZWFkZXJGbGFncyhjbXNIUFJPRklMRSBoUHJvZmlsZSkKLXsKLSAgICBfY21zSUNDUFJPRklMRSogIEljYyA9IChfY21zSUNDUFJPRklMRSopIGhQcm9maWxlOwotICAgIHJldHVybiAoY21zVUludDMyTnVtYmVyKSBJY2MgLT4gZmxhZ3M7Ci19Ci0KLXZvaWQgQ01TRVhQT1JUIGNtc1NldEhlYWRlckZsYWdzKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50MzJOdW1iZXIgRmxhZ3MpCi17Ci0gICAgX2Ntc0lDQ1BST0ZJTEUqICBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKLSAgICBJY2MgLT4gZmxhZ3MgPSAoY21zVUludDMyTnVtYmVyKSBGbGFnczsKLX0KLQotY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNHZXRIZWFkZXJNYW51ZmFjdHVyZXIoY21zSFBST0ZJTEUgaFByb2ZpbGUpCi17Ci0gICAgX2Ntc0lDQ1BST0ZJTEUqICBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKLSAgICByZXR1cm4gSWNjIC0+bWFudWZhY3R1cmVyOwotfQotCi12b2lkIENNU0VYUE9SVCBjbXNTZXRIZWFkZXJNYW51ZmFjdHVyZXIoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBtYW51ZmFjdHVyZXIpCi17Ci0gICAgX2Ntc0lDQ1BST0ZJTEUqICBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKLSAgICBJY2MgLT4gbWFudWZhY3R1cmVyID0gbWFudWZhY3R1cmVyOwotfQotCi1jbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0dldEhlYWRlckNyZWF0b3IoY21zSFBST0ZJTEUgaFByb2ZpbGUpCi17Ci0gICAgX2Ntc0lDQ1BST0ZJTEUqICBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKLSAgICByZXR1cm4gSWNjIC0+Y3JlYXRvcjsKLX0KLQotY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNHZXRIZWFkZXJNb2RlbChjbXNIUFJPRklMRSBoUHJvZmlsZSkKLXsKLSAgICBfY21zSUNDUFJPRklMRSogIEljYyA9IChfY21zSUNDUFJPRklMRSopIGhQcm9maWxlOwotICAgIHJldHVybiBJY2MgLT5tb2RlbDsKLX0KLQotdm9pZCBDTVNFWFBPUlQgY21zU2V0SGVhZGVyTW9kZWwoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBtb2RlbCkKLXsKLSAgICBfY21zSUNDUFJPRklMRSogIEljYyA9IChfY21zSUNDUFJPRklMRSopIGhQcm9maWxlOwotICAgIEljYyAtPiBtb2RlbCA9IG1vZGVsOwotfQotCi12b2lkIENNU0VYUE9SVCBjbXNHZXRIZWFkZXJBdHRyaWJ1dGVzKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50NjROdW1iZXIqIEZsYWdzKQotewotICAgIF9jbXNJQ0NQUk9GSUxFKiAgSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7Ci0gICAgbWVtbW92ZShGbGFncywgJkljYyAtPiBhdHRyaWJ1dGVzLCBzaXplb2YoY21zVUludDY0TnVtYmVyKSk7Ci19Ci0KLXZvaWQgQ01TRVhQT1JUIGNtc1NldEhlYWRlckF0dHJpYnV0ZXMoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQ2NE51bWJlciBGbGFncykKLXsKLSAgICBfY21zSUNDUFJPRklMRSogIEljYyA9IChfY21zSUNDUFJPRklMRSopIGhQcm9maWxlOwotICAgIG1lbW1vdmUoJkljYyAtPiBhdHRyaWJ1dGVzLCAmRmxhZ3MsIHNpemVvZihjbXNVSW50NjROdW1iZXIpKTsKLX0KLQotdm9pZCBDTVNFWFBPUlQgY21zR2V0SGVhZGVyUHJvZmlsZUlEKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50OE51bWJlciogUHJvZmlsZUlEKQotewotICAgIF9jbXNJQ0NQUk9GSUxFKiAgSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7Ci0gICAgbWVtbW92ZShQcm9maWxlSUQsIEljYyAtPlByb2ZpbGVJRC5JRDgsIDE2KTsKLX0KLQotdm9pZCBDTVNFWFBPUlQgY21zU2V0SGVhZGVyUHJvZmlsZUlEKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50OE51bWJlciogUHJvZmlsZUlEKQotewotICAgIF9jbXNJQ0NQUk9GSUxFKiAgSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7Ci0gICAgbWVtbW92ZSgmSWNjIC0+IFByb2ZpbGVJRCwgUHJvZmlsZUlELCAxNik7Ci19Ci0KLWNtc0Jvb2wgIENNU0VYUE9SVCBjbXNHZXRIZWFkZXJDcmVhdGlvbkRhdGVUaW1lKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBzdHJ1Y3QgdG0gKkRlc3QpCi17Ci0gICAgX2Ntc0lDQ1BST0ZJTEUqICBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKLSAgICBtZW1tb3ZlKERlc3QsICZJY2MgLT5DcmVhdGVkLCBzaXplb2Yoc3RydWN0IHRtKSk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWNtc0NvbG9yU3BhY2VTaWduYXR1cmUgQ01TRVhQT1JUIGNtc0dldFBDUyhjbXNIUFJPRklMRSBoUHJvZmlsZSkKLXsKLSAgICBfY21zSUNDUFJPRklMRSogIEljYyA9IChfY21zSUNDUFJPRklMRSopIGhQcm9maWxlOwotICAgIHJldHVybiBJY2MgLT4gUENTOwotfQotCi12b2lkIENNU0VYUE9SVCBjbXNTZXRQQ1MoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgcGNzKQotewotICAgIF9jbXNJQ0NQUk9GSUxFKiAgSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7Ci0gICAgSWNjIC0+IFBDUyA9IHBjczsKLX0KLQotY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBDTVNFWFBPUlQgY21zR2V0Q29sb3JTcGFjZShjbXNIUFJPRklMRSBoUHJvZmlsZSkKLXsKLSAgICBfY21zSUNDUFJPRklMRSogIEljYyA9IChfY21zSUNDUFJPRklMRSopIGhQcm9maWxlOwotICAgIHJldHVybiBJY2MgLT4gQ29sb3JTcGFjZTsKLX0KLQotdm9pZCBDTVNFWFBPUlQgY21zU2V0Q29sb3JTcGFjZShjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBzaWcpCi17Ci0gICAgX2Ntc0lDQ1BST0ZJTEUqICBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKLSAgICBJY2MgLT4gQ29sb3JTcGFjZSA9IHNpZzsKLX0KLQotY21zUHJvZmlsZUNsYXNzU2lnbmF0dXJlIENNU0VYUE9SVCBjbXNHZXREZXZpY2VDbGFzcyhjbXNIUFJPRklMRSBoUHJvZmlsZSkKLXsKLSAgICBfY21zSUNDUFJPRklMRSogIEljYyA9IChfY21zSUNDUFJPRklMRSopIGhQcm9maWxlOwotICAgIHJldHVybiBJY2MgLT4gRGV2aWNlQ2xhc3M7Ci19Ci0KLXZvaWQgQ01TRVhQT1JUIGNtc1NldERldmljZUNsYXNzKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNQcm9maWxlQ2xhc3NTaWduYXR1cmUgc2lnKQotewotICAgIF9jbXNJQ0NQUk9GSUxFKiAgSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7Ci0gICAgSWNjIC0+IERldmljZUNsYXNzID0gc2lnOwotfQotCi1jbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0dldEVuY29kZWRJQ0N2ZXJzaW9uKGNtc0hQUk9GSUxFIGhQcm9maWxlKQotewotICAgIF9jbXNJQ0NQUk9GSUxFKiAgSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7Ci0gICAgcmV0dXJuIEljYyAtPiBWZXJzaW9uOwotfQotCi12b2lkIENNU0VYUE9SVCBjbXNTZXRFbmNvZGVkSUNDdmVyc2lvbihjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVUludDMyTnVtYmVyIFZlcnNpb24pCi17Ci0gICAgX2Ntc0lDQ1BST0ZJTEUqICBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKLSAgICBJY2MgLT4gVmVyc2lvbiA9IFZlcnNpb247Ci19Ci0KLS8vIEdldCBhbiBoZXhhZGVjaW1hbCBudW1iZXIgd2l0aCBzYW1lIGRpZ2l0cyBhcyB2Ci1zdGF0aWMKLWNtc1VJbnQzMk51bWJlciBCYXNlVG9CYXNlKGNtc1VJbnQzMk51bWJlciBpbiwgaW50IEJhc2VJbiwgaW50IEJhc2VPdXQpCi17Ci0gICAgY2hhciBCdWZmWzEwMF07Ci0gICAgaW50IGksIGxlbjsKLSAgICBjbXNVSW50MzJOdW1iZXIgb3V0OwotCi0gICAgZm9yIChsZW49MDsgaW4gPiAwICYmIGxlbiA8IDEwMDsgbGVuKyspIHsKLQotICAgICAgICBCdWZmW2xlbl0gPSAoY2hhcikgKGluICUgQmFzZUluKTsKLSAgICAgICAgaW4gLz0gQmFzZUluOwotICAgIH0KLQotICAgIGZvciAoaT1sZW4tMSwgb3V0PTA7IGkgPj0gMDsgLS1pKSB7Ci0gICAgICAgIG91dCA9IG91dCAqIEJhc2VPdXQgKyBCdWZmW2ldOwotICAgIH0KLQotICAgIHJldHVybiBvdXQ7Ci19Ci0KLXZvaWQgIENNU0VYUE9SVCBjbXNTZXRQcm9maWxlVmVyc2lvbihjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zRmxvYXQ2NE51bWJlciBWZXJzaW9uKQotewotICAgIF9jbXNJQ0NQUk9GSUxFKiAgSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7Ci0KLSAgICAvLyA0LjIgLT4gMHg0MjAwMDAwCi0KLSAgICBJY2MgLT4gVmVyc2lvbiA9IEJhc2VUb0Jhc2UoKGNtc1VJbnQzMk51bWJlcikgZmxvb3IoVmVyc2lvbiAqIDEwMC4wICsgMC41KSwgMTAsIDE2KSA8PCAxNjsKLX0KLQotY21zRmxvYXQ2NE51bWJlciBDTVNFWFBPUlQgY21zR2V0UHJvZmlsZVZlcnNpb24oY21zSFBST0ZJTEUgaFByb2ZpbGUpCi17Ci0gICAgX2Ntc0lDQ1BST0ZJTEUqICBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKLSAgICBjbXNVSW50MzJOdW1iZXIgbiA9IEljYyAtPiBWZXJzaW9uID4+IDE2OwotCi0gICAgcmV0dXJuIEJhc2VUb0Jhc2UobiwgMTYsIDEwKSAvIDEwMC4wOwotfQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0vLyBDcmVhdGUgcHJvZmlsZSBmcm9tIElPaGFuZGxlcgotY21zSFBST0ZJTEUgQ01TRVhQT1JUIGNtc09wZW5Qcm9maWxlRnJvbUlPaGFuZGxlclRIUihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zSU9IQU5ETEVSKiBpbykKLXsKLSAgICBfY21zSUNDUFJPRklMRSogTmV3SWNjOwotICAgIGNtc0hQUk9GSUxFIGhFbXB0eSA9IGNtc0NyZWF0ZVByb2ZpbGVQbGFjZWhvbGRlcihDb250ZXh0SUQpOwotCi0gICAgaWYgKGhFbXB0eSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIE5ld0ljYyA9IChfY21zSUNDUFJPRklMRSopIGhFbXB0eTsKLQotICAgIE5ld0ljYyAtPklPaGFuZGxlciA9IGlvOwotICAgIGlmICghX2Ntc1JlYWRIZWFkZXIoTmV3SWNjKSkgZ290byBFcnJvcjsKLSAgICByZXR1cm4gaEVtcHR5OwotCi1FcnJvcjoKLSAgICBjbXNDbG9zZVByb2ZpbGUoaEVtcHR5KTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLy8gQ3JlYXRlIHByb2ZpbGUgZnJvbSBJT2hhbmRsZXIKLWNtc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNPcGVuUHJvZmlsZUZyb21JT2hhbmRsZXIyVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNCb29sIHdyaXRlKQotewotICAgIF9jbXNJQ0NQUk9GSUxFKiBOZXdJY2M7Ci0gICAgY21zSFBST0ZJTEUgaEVtcHR5ID0gY21zQ3JlYXRlUHJvZmlsZVBsYWNlaG9sZGVyKENvbnRleHRJRCk7Ci0KLSAgICBpZiAoaEVtcHR5ID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgTmV3SWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaEVtcHR5OwotCi0gICAgTmV3SWNjIC0+SU9oYW5kbGVyID0gaW87Ci0gICAgaWYgKHdyaXRlKSB7Ci0KLSAgICAgICAgTmV3SWNjIC0+IElzV3JpdGUgPSBUUlVFOwotICAgICAgICByZXR1cm4gaEVtcHR5OwotICAgIH0KLQotICAgIGlmICghX2Ntc1JlYWRIZWFkZXIoTmV3SWNjKSkgZ290byBFcnJvcjsKLSAgICByZXR1cm4gaEVtcHR5OwotCi1FcnJvcjoKLSAgICBjbXNDbG9zZVByb2ZpbGUoaEVtcHR5KTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi0vLyBDcmVhdGUgcHJvZmlsZSBmcm9tIGRpc2sgZmlsZQotY21zSFBST0ZJTEUgQ01TRVhQT1JUIGNtc09wZW5Qcm9maWxlRnJvbUZpbGVUSFIoY21zQ29udGV4dCBDb250ZXh0SUQsIGNvbnN0IGNoYXIgKmxwRmlsZU5hbWUsIGNvbnN0IGNoYXIgKnNBY2Nlc3MpCi17Ci0gICAgX2Ntc0lDQ1BST0ZJTEUqIE5ld0ljYzsKLSAgICBjbXNIUFJPRklMRSBoRW1wdHkgPSBjbXNDcmVhdGVQcm9maWxlUGxhY2Vob2xkZXIoQ29udGV4dElEKTsKLQotICAgIGlmIChoRW1wdHkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBOZXdJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoRW1wdHk7Ci0KLSAgICBOZXdJY2MgLT5JT2hhbmRsZXIgPSBjbXNPcGVuSU9oYW5kbGVyRnJvbUZpbGUoQ29udGV4dElELCBscEZpbGVOYW1lLCBzQWNjZXNzKTsKLSAgICBpZiAoTmV3SWNjIC0+SU9oYW5kbGVyID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLSAgICBpZiAoKnNBY2Nlc3MgPT0gJ1cnIHx8ICpzQWNjZXNzID09ICd3JykgewotCi0gICAgICAgIE5ld0ljYyAtPiBJc1dyaXRlID0gVFJVRTsKLQotICAgICAgICByZXR1cm4gaEVtcHR5OwotICAgIH0KLQotICAgIGlmICghX2Ntc1JlYWRIZWFkZXIoTmV3SWNjKSkgZ290byBFcnJvcjsKLSAgICByZXR1cm4gaEVtcHR5OwotCi1FcnJvcjoKLSAgICBjbXNDbG9zZVByb2ZpbGUoaEVtcHR5KTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi1jbXNIUFJPRklMRSBDTVNFWFBPUlQgY21zT3BlblByb2ZpbGVGcm9tRmlsZShjb25zdCBjaGFyICpJQ0NQcm9maWxlLCBjb25zdCBjaGFyICpzQWNjZXNzKQotewotICAgIHJldHVybiBjbXNPcGVuUHJvZmlsZUZyb21GaWxlVEhSKE5VTEwsIElDQ1Byb2ZpbGUsIHNBY2Nlc3MpOwotfQotCi0KLWNtc0hQUk9GSUxFICBDTVNFWFBPUlQgY21zT3BlblByb2ZpbGVGcm9tU3RyZWFtVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBGSUxFKiBJQ0NQcm9maWxlLCBjb25zdCBjaGFyICpzQWNjZXNzKQotewotICAgIF9jbXNJQ0NQUk9GSUxFKiBOZXdJY2M7Ci0gICAgY21zSFBST0ZJTEUgaEVtcHR5ID0gY21zQ3JlYXRlUHJvZmlsZVBsYWNlaG9sZGVyKENvbnRleHRJRCk7Ci0KLSAgICBpZiAoaEVtcHR5ID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgTmV3SWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaEVtcHR5OwotCi0gICAgTmV3SWNjIC0+SU9oYW5kbGVyID0gY21zT3BlbklPaGFuZGxlckZyb21TdHJlYW0oQ29udGV4dElELCBJQ0NQcm9maWxlKTsKLSAgICBpZiAoTmV3SWNjIC0+SU9oYW5kbGVyID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLSAgICBpZiAoKnNBY2Nlc3MgPT0gJ3cnKSB7Ci0KLSAgICAgICAgTmV3SWNjIC0+IElzV3JpdGUgPSBUUlVFOwotICAgICAgICByZXR1cm4gaEVtcHR5OwotICAgIH0KLQotICAgIGlmICghX2Ntc1JlYWRIZWFkZXIoTmV3SWNjKSkgZ290byBFcnJvcjsKLSAgICByZXR1cm4gaEVtcHR5OwotCi1FcnJvcjoKLSAgICBjbXNDbG9zZVByb2ZpbGUoaEVtcHR5KTsKLSAgICByZXR1cm4gTlVMTDsKLQotfQotCi1jbXNIUFJPRklMRSAgQ01TRVhQT1JUIGNtc09wZW5Qcm9maWxlRnJvbVN0cmVhbShGSUxFKiBJQ0NQcm9maWxlLCBjb25zdCBjaGFyICpzQWNjZXNzKQotewotICAgIHJldHVybiBjbXNPcGVuUHJvZmlsZUZyb21TdHJlYW1USFIoTlVMTCwgSUNDUHJvZmlsZSwgc0FjY2Vzcyk7Ci19Ci0KLQotLy8gT3BlbiBmcm9tIG1lbW9yeSBibG9jawotY21zSFBST0ZJTEUgQ01TRVhQT1JUIGNtc09wZW5Qcm9maWxlRnJvbU1lbVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3Qgdm9pZCogTWVtUHRyLCBjbXNVSW50MzJOdW1iZXIgZHdTaXplKQotewotICAgIF9jbXNJQ0NQUk9GSUxFKiBOZXdJY2M7Ci0gICAgY21zSFBST0ZJTEUgaEVtcHR5OwotCi0gICAgaEVtcHR5ID0gY21zQ3JlYXRlUHJvZmlsZVBsYWNlaG9sZGVyKENvbnRleHRJRCk7Ci0gICAgaWYgKGhFbXB0eSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIE5ld0ljYyA9IChfY21zSUNDUFJPRklMRSopIGhFbXB0eTsKLQotICAgIC8vIE9rLCBpbiB0aGlzIGNhc2UgY29uc3Qgdm9pZCogaXMgY2FzdGVkIHRvIHZvaWQqIGp1c3QgYmVjYXVzZSBvcGVuIElPIGhhbmRsZXIKLSAgICAvLyBzaGFyZXMgcmVhZCBhbmQgd3JpdHRpbmcgbW9kZXMuIERvbid0IGFidXNlIHRoaXMgZmVhdHVyZSEKLSAgICBOZXdJY2MgLT5JT2hhbmRsZXIgPSBjbXNPcGVuSU9oYW5kbGVyRnJvbU1lbShDb250ZXh0SUQsICh2b2lkKikgTWVtUHRyLCBkd1NpemUsICJyIik7Ci0gICAgaWYgKE5ld0ljYyAtPklPaGFuZGxlciA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgaWYgKCFfY21zUmVhZEhlYWRlcihOZXdJY2MpKSBnb3RvIEVycm9yOwotCi0gICAgcmV0dXJuIGhFbXB0eTsKLQotRXJyb3I6Ci0gICAgY21zQ2xvc2VQcm9maWxlKGhFbXB0eSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNtc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNPcGVuUHJvZmlsZUZyb21NZW0oY29uc3Qgdm9pZCogTWVtUHRyLCBjbXNVSW50MzJOdW1iZXIgZHdTaXplKQotewotICAgIHJldHVybiBjbXNPcGVuUHJvZmlsZUZyb21NZW1USFIoTlVMTCwgTWVtUHRyLCBkd1NpemUpOwotfQotCi0KLQotLy8gRHVtcCB0YWcgY29udGVudHMuIElmIHRoZSBwcm9maWxlIGlzIGJlaW5nIG1vZGlmaWVkLCB1bnRvdWNoZWQgdGFncyBhcmUgY29waWVkIGZyb20gRmlsZU9yaWcKLXN0YXRpYwotY21zQm9vbCBTYXZlVGFncyhfY21zSUNDUFJPRklMRSogSWNjLCBfY21zSUNDUFJPRklMRSogRmlsZU9yaWcpCi17Ci0gICAgY21zVUludDhOdW1iZXIqIERhdGE7Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0gICAgY21zVUludDMyTnVtYmVyIEJlZ2luOwotICAgIGNtc0lPSEFORExFUiogaW8gPSBJY2MgLT5JT2hhbmRsZXI7Ci0gICAgY21zVGFnRGVzY3JpcHRvciogVGFnRGVzY3JpcHRvcjsKLSAgICBjbXNUYWdUeXBlU2lnbmF0dXJlIFR5cGVCYXNlOwotICAgIGNtc1RhZ1R5cGVTaWduYXR1cmUgVHlwZTsKLSAgICBjbXNUYWdUeXBlSGFuZGxlciogVHlwZUhhbmRsZXI7Ci0gICAgY21zRmxvYXQ2NE51bWJlciAgIFZlcnNpb24gPSBjbXNHZXRQcm9maWxlVmVyc2lvbigoY21zSFBST0ZJTEUpIEljYyk7Ci0gICAgY21zVGFnVHlwZUhhbmRsZXIgTG9jYWxUeXBlSGFuZGxlcjsKLQotICAgIGZvciAoaT0wOyBpIDwgSWNjIC0+IFRhZ0NvdW50OyBpKyspIHsKLQotICAgICAgICBpZiAoSWNjIC0+VGFnTmFtZXNbaV0gPT0gMCkgY29udGludWU7Ci0KLSAgICAgICAgLy8gTGlua2VkIHRhZ3MgYXJlIG5vdCB3cml0dGVuCi0gICAgICAgIGlmIChJY2MgLT5UYWdMaW5rZWRbaV0gIT0gKGNtc1RhZ1NpZ25hdHVyZSkgMCkgY29udGludWU7Ci0KLSAgICAgICAgSWNjIC0+IFRhZ09mZnNldHNbaV0gPSBCZWdpbiA9IGlvIC0+VXNlZFNwYWNlOwotCi0gICAgICAgIERhdGEgPSAoY21zVUludDhOdW1iZXIqKSAgSWNjIC0+IFRhZ1B0cnNbaV07Ci0KLSAgICAgICAgaWYgKCFEYXRhKSB7Ci0KLSAgICAgICAgICAgIC8vIFJlYWNoIGhlcmUgaWYgd2UgYXJlIGNvcHlpbmcgYSB0YWcgZnJvbSBhIGRpc2stYmFzZWQgSUNDIHByb2ZpbGUgd2hpY2ggaGFzIG5vdCBiZWVuIG1vZGlmaWVkIGJ5IHVzZXIuCi0gICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UgYSBibGluZCBjb3B5IG9mIHRoZSBibG9jayBkYXRhIGlzIHBlcmZvcm1lZAotICAgICAgICAgICAgaWYgKEZpbGVPcmlnICE9IE5VTEwgJiYgSWNjIC0+IFRhZ09mZnNldHNbaV0pIHsKLQotICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBUYWdTaXplICAgPSBGaWxlT3JpZyAtPiBUYWdTaXplc1tpXTsKLSAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgVGFnT2Zmc2V0ID0gRmlsZU9yaWcgLT4gVGFnT2Zmc2V0c1tpXTsKLSAgICAgICAgICAgICAgICB2b2lkKiBNZW07Ci0KLSAgICAgICAgICAgICAgICBpZiAoIUZpbGVPcmlnIC0+SU9oYW5kbGVyLT5TZWVrKEZpbGVPcmlnIC0+SU9oYW5kbGVyLCBUYWdPZmZzZXQpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICBNZW0gPSBfY21zTWFsbG9jKEljYyAtPkNvbnRleHRJRCwgVGFnU2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKE1lbSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgICAgICAgICBpZiAoRmlsZU9yaWcgLT5JT2hhbmRsZXItPlJlYWQoRmlsZU9yaWctPklPaGFuZGxlciwgTWVtLCBUYWdTaXplLCAxKSAhPSAxKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbyAtPldyaXRlKGlvLCBUYWdTaXplLCBNZW0pKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgX2Ntc0ZyZWUoSWNjIC0+Q29udGV4dElELCBNZW0pOwotCi0gICAgICAgICAgICAgICAgSWNjIC0+IFRhZ1NpemVzW2ldID0gKGlvIC0+VXNlZFNwYWNlIC0gQmVnaW4pOwotCi0KLSAgICAgICAgICAgICAgICAvLyBBbGlnbiB0byAzMiBiaXQgYm91bmRhcnkuCi0gICAgICAgICAgICAgICAgaWYgKCEgX2Ntc1dyaXRlQWxpZ25tZW50KGlvKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8gU2hvdWxkIHRoaXMgdGFnIGJlIHNhdmVkIGFzIFJBVz8gSWYgc28sIHRhZ3NpemVzIHNob3VsZCBiZSBzcGVjaWZpZWQgaW4gYWR2YW5jZSAobm8gZnVydGhlciBjb29raW5nIGlzIGRvbmUpCi0gICAgICAgIGlmIChJY2MgLT5UYWdTYXZlQXNSYXdbaV0pIHsKLQotICAgICAgICAgICAgaWYgKGlvIC0+IFdyaXRlKGlvLCBJY2MgLT5UYWdTaXplc1tpXSwgRGF0YSkgIT0gMSkgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCi0gICAgICAgICAgICAvLyBTZWFyY2ggZm9yIHN1cHBvcnQgb24gdGhpcyB0YWcKLSAgICAgICAgICAgIFRhZ0Rlc2NyaXB0b3IgPSBfY21zR2V0VGFnRGVzY3JpcHRvcihJY2MtPiBDb250ZXh0SUQsIEljYyAtPiBUYWdOYW1lc1tpXSk7Ci0gICAgICAgICAgICBpZiAoVGFnRGVzY3JpcHRvciA9PSBOVUxMKSBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbnN1cHBvcnRlZCwgaWdub3JlIGl0Ci0gICAgICAgICAgIAotICAgICAgICAgICAgaWYgKFRhZ0Rlc2NyaXB0b3IgLT5EZWNpZGVUeXBlICE9IE5VTEwpIHsKLQotICAgICAgICAgICAgICAgIFR5cGUgPSBUYWdEZXNjcmlwdG9yIC0+RGVjaWRlVHlwZShWZXJzaW9uLCBEYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotCi0gICAgICAgICAgICAgICAgVHlwZSA9IFRhZ0Rlc2NyaXB0b3IgLT5TdXBwb3J0ZWRUeXBlc1swXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVHlwZUhhbmRsZXIgPSAgX2Ntc0dldFRhZ1R5cGVIYW5kbGVyKEljYy0+Q29udGV4dElELCBUeXBlKTsKLQotICAgICAgICAgICAgaWYgKFR5cGVIYW5kbGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihJY2MgLT5Db250ZXh0SUQsIGNtc0VSUk9SX0lOVEVSTkFMLCAiKEludGVybmFsKSBubyBoYW5kbGVyIGZvciB0YWcgJXgiLCBJY2MgLT4gVGFnTmFtZXNbaV0pOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBUeXBlQmFzZSA9IFR5cGVIYW5kbGVyIC0+U2lnbmF0dXJlOwotICAgICAgICAgICAgaWYgKCFfY21zV3JpdGVUeXBlQmFzZShpbywgVHlwZUJhc2UpKQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICAgICAgTG9jYWxUeXBlSGFuZGxlciA9ICpUeXBlSGFuZGxlcjsKLSAgICAgICAgICAgIExvY2FsVHlwZUhhbmRsZXIuQ29udGV4dElEICA9IEljYyAtPkNvbnRleHRJRDsKLSAgICAgICAgICAgIExvY2FsVHlwZUhhbmRsZXIuSUNDVmVyc2lvbiA9IEljYyAtPlZlcnNpb247Ci0gICAgICAgICAgICBpZiAoIUxvY2FsVHlwZUhhbmRsZXIuV3JpdGVQdHIoJkxvY2FsVHlwZUhhbmRsZXIsIGlvLCBEYXRhLCBUYWdEZXNjcmlwdG9yIC0+RWxlbUNvdW50KSkgewotCi0gICAgICAgICAgICAgICAgY2hhciBTdHJpbmdbNV07Ci0KLSAgICAgICAgICAgICAgICBfY21zVGFnU2lnbmF0dXJlMlN0cmluZyhTdHJpbmcsIChjbXNUYWdTaWduYXR1cmUpIFR5cGVCYXNlKTsKLSAgICAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihJY2MgLT5Db250ZXh0SUQsIGNtc0VSUk9SX1dSSVRFLCAiQ291bGRuJ3Qgd3JpdGUgdHlwZSAnJXMnIiwgU3RyaW5nKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIEljYyAtPiBUYWdTaXplc1tpXSA9IChpbyAtPlVzZWRTcGFjZSAtIEJlZ2luKTsKLQotICAgICAgICAvLyBBbGlnbiB0byAzMiBiaXQgYm91bmRhcnkuCi0gICAgICAgIGlmICghIF9jbXNXcml0ZUFsaWdubWVudChpbykpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0vLyBGaWxsIHRoZSBvZmZzZXQgYW5kIHNpemUgZmllbGRzIGZvciBhbGwgbGlua2VkIHRhZ3MKLXN0YXRpYwotY21zQm9vbCBTZXRMaW5rcyggX2Ntc0lDQ1BST0ZJTEUqIEljYykKLXsKLSAgICBjbXNVSW50MzJOdW1iZXIgaTsKLQotICAgIGZvciAoaT0wOyBpIDwgSWNjIC0+IFRhZ0NvdW50OyBpKyspIHsKLQotICAgICAgICBjbXNUYWdTaWduYXR1cmUgbG5rID0gSWNjIC0+VGFnTGlua2VkW2ldOwotICAgICAgICBpZiAobG5rICE9IChjbXNUYWdTaWduYXR1cmUpIDApIHsKLQotICAgICAgICAgICAgaW50IGogPSBfY21zU2VhcmNoVGFnKEljYywgbG5rLCBGQUxTRSk7Ci0gICAgICAgICAgICBpZiAoaiA+PSAwKSB7Ci0KLSAgICAgICAgICAgICAgICBJY2MgLT5UYWdPZmZzZXRzW2ldID0gSWNjIC0+VGFnT2Zmc2V0c1tqXTsKLSAgICAgICAgICAgICAgICBJY2MgLT5UYWdTaXplc1tpXSAgID0gSWNjIC0+VGFnU2l6ZXNbal07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vLyBMb3ctbGV2ZWwgc2F2ZSB0byBJT0hBTkRMRVIuIEl0IHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB1c2VkIHRvCi0vLyBzdG9yZSB0aGUgcHJvZmlsZSwgb3IgemVybyBvbiBlcnJvci4gaW8gbWF5IGJlIE5VTEwgYW5kIGluIHRoaXMgY2FzZQotLy8gbm8gZGF0YSBpcyB3cml0dGVuLS1vbmx5IHNpemVzIGFyZSBjYWxjdWxhdGVkCi1jbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc1NhdmVQcm9maWxlVG9JT2hhbmRsZXIoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc0lPSEFORExFUiogaW8pCi17Ci0gICAgX2Ntc0lDQ1BST0ZJTEUqIEljYyA9IChfY21zSUNDUFJPRklMRSopIGhQcm9maWxlOwotICAgIF9jbXNJQ0NQUk9GSUxFIEtlZXA7Ci0gICAgY21zSU9IQU5ETEVSKiBQcmV2SU8gPSBOVUxMOwotICAgIGNtc1VJbnQzMk51bWJlciBVc2VkU3BhY2U7Ci0gICAgY21zQ29udGV4dCBDb250ZXh0SUQ7Ci0KLSAgICBfY21zQXNzZXJ0KGhQcm9maWxlICE9IE5VTEwpOwotCi0gICAgbWVtbW92ZSgmS2VlcCwgSWNjLCBzaXplb2YoX2Ntc0lDQ1BST0ZJTEUpKTsKLQotICAgIENvbnRleHRJRCA9IGNtc0dldFByb2ZpbGVDb250ZXh0SUQoaFByb2ZpbGUpOwotICAgIFByZXZJTyA9IEljYyAtPklPaGFuZGxlciA9IGNtc09wZW5JT2hhbmRsZXJGcm9tTlVMTChDb250ZXh0SUQpOwotICAgIGlmIChQcmV2SU8gPT0gTlVMTCkgcmV0dXJuIDA7Ci0KLSAgICAvLyBQYXNzICMxIGRvZXMgY29tcHV0ZSBvZmZzZXRzCi0KLSAgICBpZiAoIV9jbXNXcml0ZUhlYWRlcihJY2MsIDApKSBnb3RvIEVycm9yOwotICAgIGlmICghU2F2ZVRhZ3MoSWNjLCAmS2VlcCkpIGdvdG8gRXJyb3I7Ci0KLSAgICBVc2VkU3BhY2UgPSBQcmV2SU8gLT5Vc2VkU3BhY2U7Ci0KLSAgICAvLyBQYXNzICMyIGRvZXMgc2F2ZSB0byBpb2hhbmRsZXIKLQotICAgIGlmIChpbyAhPSBOVUxMKSB7Ci0KLSAgICAgICAgSWNjIC0+SU9oYW5kbGVyID0gaW87Ci0gICAgICAgIGlmICghU2V0TGlua3MoSWNjKSkgZ290byBFcnJvcjsKLSAgICAgICAgaWYgKCFfY21zV3JpdGVIZWFkZXIoSWNjLCBVc2VkU3BhY2UpKSBnb3RvIEVycm9yOwotICAgICAgICBpZiAoIVNhdmVUYWdzKEljYywgJktlZXApKSBnb3RvIEVycm9yOwotICAgIH0KLQotICAgIG1lbW1vdmUoSWNjLCAmS2VlcCwgc2l6ZW9mKF9jbXNJQ0NQUk9GSUxFKSk7Ci0gICAgaWYgKCFjbXNDbG9zZUlPaGFuZGxlcihQcmV2SU8pKSByZXR1cm4gMDsKLQotICAgIHJldHVybiBVc2VkU3BhY2U7Ci0KLQotRXJyb3I6Ci0gICAgY21zQ2xvc2VJT2hhbmRsZXIoUHJldklPKTsKLSAgICBtZW1tb3ZlKEljYywgJktlZXAsIHNpemVvZihfY21zSUNDUFJPRklMRSkpOwotICAgIHJldHVybiAwOwotfQotCi0jaWZkZWYgX1dJTjMyX1dDRQotaW50IHdjZWV4X3VubGluayhjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci0jaWZuZGVmIHJlbW92ZQotIwlkZWZpbmUgcmVtb3ZlIHdjZWV4X3VubGluawotI2VuZGlmCi0jZW5kaWYKLQotLy8gTG93LWxldmVsIHNhdmUgdG8gZGlzay4KLWNtc0Jvb2wgIENNU0VYUE9SVCBjbXNTYXZlUHJvZmlsZVRvRmlsZShjbXNIUFJPRklMRSBoUHJvZmlsZSwgY29uc3QgY2hhciogRmlsZU5hbWUpCi17Ci0gICAgY21zQ29udGV4dCBDb250ZXh0SUQgPSBjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKTsKLSAgICBjbXNJT0hBTkRMRVIqIGlvID0gY21zT3BlbklPaGFuZGxlckZyb21GaWxlKENvbnRleHRJRCwgRmlsZU5hbWUsICJ3Iik7Ci0gICAgY21zQm9vbCByYzsKLQotICAgIGlmIChpbyA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0KLSAgICByYyA9IChjbXNTYXZlUHJvZmlsZVRvSU9oYW5kbGVyKGhQcm9maWxlLCBpbykgIT0gMCk7Ci0gICAgcmMgJj0gY21zQ2xvc2VJT2hhbmRsZXIoaW8pOwotCi0gICAgaWYgKHJjID09IEZBTFNFKSB7ICAgICAgICAgIC8vIHJlbW92ZSgpIGlzIEM5OSBwZXIgNy4xOS40LjEKLSAgICAgICAgICAgIHJlbW92ZShGaWxlTmFtZSk7ICAgLy8gV2UgaGF2ZSB0byBJR05PUkUgcmV0dXJuIHZhbHVlIGluIHRoaXMgY2FzZQotICAgIH0KLSAgICByZXR1cm4gcmM7Ci19Ci0KLS8vIFNhbWUgYXMgYW50ZXJpb3IsIGJ1dCBmb3Igc3RyZWFtcwotY21zQm9vbCBDTVNFWFBPUlQgY21zU2F2ZVByb2ZpbGVUb1N0cmVhbShjbXNIUFJPRklMRSBoUHJvZmlsZSwgRklMRSogU3RyZWFtKQotewotICAgIGNtc0Jvb2wgcmM7Ci0gICAgY21zQ29udGV4dCBDb250ZXh0SUQgPSBjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKTsKLSAgICBjbXNJT0hBTkRMRVIqIGlvID0gY21zT3BlbklPaGFuZGxlckZyb21TdHJlYW0oQ29udGV4dElELCBTdHJlYW0pOwotCi0gICAgaWYgKGlvID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQotICAgIHJjID0gKGNtc1NhdmVQcm9maWxlVG9JT2hhbmRsZXIoaFByb2ZpbGUsIGlvKSAhPSAwKTsKLSAgICByYyAmPSBjbXNDbG9zZUlPaGFuZGxlcihpbyk7Ci0KLSAgICByZXR1cm4gcmM7Ci19Ci0KLQotLy8gU2FtZSBhcyBhbnRlcmlvciwgYnV0IGZvciBtZW1vcnkgYmxvY2tzLiBJbiB0aGlzIGNhc2UsIGEgTlVMTCBhcyBNZW1QdHIgbWVhbnMgY2FsY3VsYXRlIG5lZWRlZCBzcGFjZSBvbmx5Ci1jbXNCb29sIENNU0VYUE9SVCBjbXNTYXZlUHJvZmlsZVRvTWVtKGNtc0hQUk9GSUxFIGhQcm9maWxlLCB2b2lkICpNZW1QdHIsIGNtc1VJbnQzMk51bWJlciogQnl0ZXNOZWVkZWQpCi17Ci0gICAgY21zQm9vbCByYzsKLSAgICBjbXNJT0hBTkRMRVIqIGlvOwotICAgIGNtc0NvbnRleHQgQ29udGV4dElEID0gY21zR2V0UHJvZmlsZUNvbnRleHRJRChoUHJvZmlsZSk7Ci0KLSAgICBfY21zQXNzZXJ0KEJ5dGVzTmVlZGVkICE9IE5VTEwpOwotCi0gICAgLy8gU2hvdWxkIHdlIGp1c3QgY2FsY3VsYXRlIHRoZSBuZWVkZWQgc3BhY2U/Ci0gICAgaWYgKE1lbVB0ciA9PSBOVUxMKSB7Ci0KLSAgICAgICAgICAgKkJ5dGVzTmVlZGVkID0gIGNtc1NhdmVQcm9maWxlVG9JT2hhbmRsZXIoaFByb2ZpbGUsIE5VTEwpOwotICAgICAgICAgICAgcmV0dXJuICgqQnl0ZXNOZWVkZWQgPT0gMCkgPyBGQUxTRSA6IFRSVUU7Ci0gICAgfQotCi0gICAgLy8gVGhhdCBpcyBhIHJlYWwgd3JpdGUgb3BlcmF0aW9uCi0gICAgaW8gPSAgY21zT3BlbklPaGFuZGxlckZyb21NZW0oQ29udGV4dElELCBNZW1QdHIsICpCeXRlc05lZWRlZCwgInciKTsKLSAgICBpZiAoaW8gPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0gICAgcmMgPSAoY21zU2F2ZVByb2ZpbGVUb0lPaGFuZGxlcihoUHJvZmlsZSwgaW8pICE9IDApOwotICAgIHJjICY9IGNtc0Nsb3NlSU9oYW5kbGVyKGlvKTsKLQotICAgIHJldHVybiByYzsKLX0KLQotCi0KLS8vIENsb3NlcyBhIHByb2ZpbGUgZnJlZWluZyBhbnkgaW52b2x2ZWQgcmVzb3VyY2VzCi1jbXNCb29sICBDTVNFWFBPUlQgY21zQ2xvc2VQcm9maWxlKGNtc0hQUk9GSUxFIGhQcm9maWxlKQotewotICAgIF9jbXNJQ0NQUk9GSUxFKiBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKLSAgICBjbXNCb29sICByYyA9IFRSVUU7Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0KLSAgICBpZiAoIUljYykgcmV0dXJuIEZBTFNFOwotCi0gICAgLy8gV2FzIG9wZW4gaW4gd3JpdGUgbW9kZT8KLSAgICBpZiAoSWNjIC0+SXNXcml0ZSkgewotCi0gICAgICAgIEljYyAtPklzV3JpdGUgPSBGQUxTRTsgICAgICAvLyBBc3N1cmUgbm8gZnVydGhlciB3cml0dGluZwotICAgICAgICByYyAmPSBjbXNTYXZlUHJvZmlsZVRvRmlsZShoUHJvZmlsZSwgSWNjIC0+SU9oYW5kbGVyLT5QaHlzaWNhbEZpbGUpOwotICAgIH0KLQotICAgIGZvciAoaT0wOyBpIDwgSWNjIC0+IFRhZ0NvdW50OyBpKyspIHsKLQotICAgICAgICBpZiAoSWNjIC0+IFRhZ1B0cnNbaV0pIHsKLQotICAgICAgICAgICAgY21zVGFnVHlwZUhhbmRsZXIqIFR5cGVIYW5kbGVyID0gSWNjIC0+VGFnVHlwZUhhbmRsZXJzW2ldOwotCi0gICAgICAgICAgICBpZiAoVHlwZUhhbmRsZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGNtc1RhZ1R5cGVIYW5kbGVyIExvY2FsVHlwZUhhbmRsZXIgPSAqVHlwZUhhbmRsZXI7Ci0KLSAgICAgICAgICAgICAgICBMb2NhbFR5cGVIYW5kbGVyLkNvbnRleHRJRCA9IEljYyAtPkNvbnRleHRJRDsgICAgICAgICAgICAgIC8vIEFzIGFuIGFkZGl0aW9uYWwgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgIExvY2FsVHlwZUhhbmRsZXIuSUNDVmVyc2lvbiA9IEljYyAtPlZlcnNpb247Ci0gICAgICAgICAgICAgICAgTG9jYWxUeXBlSGFuZGxlci5GcmVlUHRyKCZMb2NhbFR5cGVIYW5kbGVyLCBJY2MgLT4gVGFnUHRyc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgX2Ntc0ZyZWUoSWNjIC0+Q29udGV4dElELCBJY2MgLT5UYWdQdHJzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChJY2MgLT5JT2hhbmRsZXIgIT0gTlVMTCkgewotICAgICAgICByYyAmPSBjbXNDbG9zZUlPaGFuZGxlcihJY2MtPklPaGFuZGxlcik7Ci0gICAgfQotCi0gICAgX2Ntc0Rlc3Ryb3lNdXRleChJY2MtPkNvbnRleHRJRCwgSWNjLT5Vc3JNdXRleCk7Ci0KLSAgICBfY21zRnJlZShJY2MgLT5Db250ZXh0SUQsIEljYyk7ICAgLy8gRnJlZSBwbGFjZWhvbGRlciBtZW1vcnkKLQotICAgIHJldHVybiByYzsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotLy8gUmV0dXJucyBUUlVFIGlmIGEgZ2l2ZW4gdGFnIGlzIHN1cHBvcnRlZCBieSBhIHBsdWctaW4KLXN0YXRpYwotY21zQm9vbCBJc1R5cGVTdXBwb3J0ZWQoY21zVGFnRGVzY3JpcHRvciogVGFnRGVzY3JpcHRvciwgY21zVGFnVHlwZVNpZ25hdHVyZSBUeXBlKQotewotICAgIGNtc1VJbnQzMk51bWJlciBpLCBuTWF4VHlwZXM7Ci0KLSAgICBuTWF4VHlwZXMgPSBUYWdEZXNjcmlwdG9yLT5uU3VwcG9ydGVkVHlwZXM7Ci0gICAgaWYgKG5NYXhUeXBlcyA+PSBNQVhfVFlQRVNfSU5fTENNU19QTFVHSU4pCi0gICAgICAgIG5NYXhUeXBlcyA9IE1BWF9UWVBFU19JTl9MQ01TX1BMVUdJTjsKLQotICAgIGZvciAoaT0wOyBpIDwgbk1heFR5cGVzOyBpKyspIHsKLSAgICAgICAgaWYgKFR5cGUgPT0gVGFnRGVzY3JpcHRvciAtPlN1cHBvcnRlZFR5cGVzW2ldKSByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLQotLy8gVGhhdCdzIHRoZSBtYWluIHJlYWQgZnVuY3Rpb24KLXZvaWQqIENNU0VYUE9SVCBjbXNSZWFkVGFnKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNUYWdTaWduYXR1cmUgc2lnKQotewotICAgIF9jbXNJQ0NQUk9GSUxFKiBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKLSAgICBjbXNJT0hBTkRMRVIqIGlvID0gSWNjIC0+SU9oYW5kbGVyOwotICAgIGNtc1RhZ1R5cGVIYW5kbGVyKiBUeXBlSGFuZGxlcjsKLSAgICBjbXNUYWdUeXBlSGFuZGxlciBMb2NhbFR5cGVIYW5kbGVyOwotICAgIGNtc1RhZ0Rlc2NyaXB0b3IqICBUYWdEZXNjcmlwdG9yOwotICAgIGNtc1RhZ1R5cGVTaWduYXR1cmUgQmFzZVR5cGU7Ci0gICAgY21zVUludDMyTnVtYmVyIE9mZnNldCwgVGFnU2l6ZTsKLSAgICBjbXNVSW50MzJOdW1iZXIgRWxlbUNvdW50OwotICAgIGludCBuOwotCi0gICAgaWYgKCFfY21zTG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCkpIHJldHVybiBOVUxMOwotCi0gICAgbiA9IF9jbXNTZWFyY2hUYWcoSWNjLCBzaWcsIFRSVUUpOwotICAgIGlmIChuIDwgMCkgZ290byBFcnJvcjsgICAgICAgICAgICAgICAvLyBOb3QgZm91bmQsIHJldHVybiBOVUxMCi0KLQotICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIGFscmVhZHkgaW4gbWVtb3J5LCByZXR1cm4gdGhlIHBvaW50ZXIKLSAgICBpZiAoSWNjIC0+IFRhZ1B0cnNbbl0pIHsKLQotICAgICAgICBpZiAoSWNjLT5UYWdUeXBlSGFuZGxlcnNbbl0gPT0gTlVMTCkgZ290byBFcnJvcjsKLQotICAgICAgICAvLyBTYW5pdHkgY2hlY2sKLSAgICAgICAgQmFzZVR5cGUgPSBJY2MtPlRhZ1R5cGVIYW5kbGVyc1tuXS0+U2lnbmF0dXJlOwotICAgICAgICBpZiAoQmFzZVR5cGUgPT0gMCkgZ290byBFcnJvcjsKLQotICAgICAgICBUYWdEZXNjcmlwdG9yID0gX2Ntc0dldFRhZ0Rlc2NyaXB0b3IoSWNjLT5Db250ZXh0SUQsIHNpZyk7Ci0gICAgICAgIGlmIChUYWdEZXNjcmlwdG9yID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAgaWYgKCFJc1R5cGVTdXBwb3J0ZWQoVGFnRGVzY3JpcHRvciwgQmFzZVR5cGUpKSBnb3RvIEVycm9yOwotCi0gICAgICAgIGlmIChJY2MgLT5UYWdTYXZlQXNSYXdbbl0pIGdvdG8gRXJyb3I7ICAvLyBXZSBkb24ndCBzdXBwb3J0IHJlYWQgcmF3IHRhZ3MgYXMgY29va2VkCi0KLSAgICAgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7Ci0gICAgICAgIHJldHVybiBJY2MgLT4gVGFnUHRyc1tuXTsKLSAgICB9Ci0KLSAgICAvLyBXZSBuZWVkIHRvIHJlYWQgaXQuIEdldCB0aGUgb2Zmc2V0IGFuZCBzaXplIHRvIHRoZSBmaWxlCi0gICAgT2Zmc2V0ICAgID0gSWNjIC0+IFRhZ09mZnNldHNbbl07Ci0gICAgVGFnU2l6ZSAgID0gSWNjIC0+IFRhZ1NpemVzW25dOwotCi0gICAgLy8gU2VlayB0byBpdHMgbG9jYXRpb24KLSAgICBpZiAoIWlvIC0+IFNlZWsoaW8sIE9mZnNldCkpCi0gICAgICAgIGdvdG8gRXJyb3I7Ci0KLSAgICAvLyBTZWFyY2ggZm9yIHN1cHBvcnQgb24gdGhpcyB0YWcKLSAgICBUYWdEZXNjcmlwdG9yID0gX2Ntc0dldFRhZ0Rlc2NyaXB0b3IoSWNjLT4gQ29udGV4dElELCBzaWcpOwotICAgIGlmIChUYWdEZXNjcmlwdG9yID09IE5VTEwpIHsKLQotICAgICAgICBjaGFyIFN0cmluZ1s1XTsKLQotICAgICAgICBfY21zVGFnU2lnbmF0dXJlMlN0cmluZyhTdHJpbmcsIHNpZyk7Ci0KLSAgICAgICAgLy8gQW4gdW5rbm93biBlbGVtZW50IHdhcyBmb3VuZC4KLSAgICAgICAgY21zU2lnbmFsRXJyb3IoSWNjIC0+Q29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVua25vd24gdGFnIHR5cGUgJyVzJyBmb3VuZC4iLCBTdHJpbmcpOwotICAgICAgICBnb3RvIEVycm9yOyAgICAgLy8gVW5zdXBwb3J0ZWQuCi0gICAgfQotCi0gICAgLy8gaWYgc3VwcG9ydGVkLCBnZXQgdHlwZSBhbmQgY2hlY2sgaWYgaW4gbGlzdAotICAgIEJhc2VUeXBlID0gX2Ntc1JlYWRUeXBlQmFzZShpbyk7Ci0gICAgaWYgKEJhc2VUeXBlID09IDApIGdvdG8gRXJyb3I7Ci0KLSAgICBpZiAoIUlzVHlwZVN1cHBvcnRlZChUYWdEZXNjcmlwdG9yLCBCYXNlVHlwZSkpIGdvdG8gRXJyb3I7Ci0KLSAgICBUYWdTaXplICAtPSA4OyAgICAgICAgICAgICAgICAgICAgICAvLyBBbHJlZHkgcmVhZCBieSB0aGUgdHlwZSBiYXNlIGxvZ2ljCi0KLSAgICAvLyBHZXQgdHlwZSBoYW5kbGVyCi0gICAgVHlwZUhhbmRsZXIgPSBfY21zR2V0VGFnVHlwZUhhbmRsZXIoSWNjIC0+Q29udGV4dElELCBCYXNlVHlwZSk7Ci0gICAgaWYgKFR5cGVIYW5kbGVyID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0gICAgTG9jYWxUeXBlSGFuZGxlciA9ICpUeXBlSGFuZGxlcjsKLQotCi0gICAgLy8gUmVhZCB0aGUgdGFnCi0gICAgSWNjIC0+IFRhZ1R5cGVIYW5kbGVyc1tuXSA9IFR5cGVIYW5kbGVyOwotCi0gICAgTG9jYWxUeXBlSGFuZGxlci5Db250ZXh0SUQgPSBJY2MgLT5Db250ZXh0SUQ7Ci0gICAgTG9jYWxUeXBlSGFuZGxlci5JQ0NWZXJzaW9uID0gSWNjIC0+VmVyc2lvbjsKLSAgICBJY2MgLT4gVGFnUHRyc1tuXSA9IExvY2FsVHlwZUhhbmRsZXIuUmVhZFB0cigmTG9jYWxUeXBlSGFuZGxlciwgaW8sICZFbGVtQ291bnQsIFRhZ1NpemUpOwotCi0gICAgLy8gVGhlIHRhZyB0eXBlIGlzIHN1cHBvcnRlZCwgYnV0IHNvbWV0aGluZyB3cm9uZyBoYXBwZW5kIGFuZCB3ZSBjYW5ub3QgcmVhZCB0aGUgdGFnLgotICAgIC8vIGxldCBrbm93IHRoZSB1c2VyIGFib3V0IHRoaXMgKGFsdGhvdWdoIGl0IGlzIGp1c3QgYSB3YXJuaW5nKQotICAgIGlmIChJY2MgLT4gVGFnUHRyc1tuXSA9PSBOVUxMKSB7Ci0KLSAgICAgICAgY2hhciBTdHJpbmdbNV07Ci0KLSAgICAgICAgX2Ntc1RhZ1NpZ25hdHVyZTJTdHJpbmcoU3RyaW5nLCBzaWcpOwotICAgICAgICBjbXNTaWduYWxFcnJvcihJY2MgLT5Db250ZXh0SUQsIGNtc0VSUk9SX0NPUlJVUFRJT05fREVURUNURUQsICJDb3JydXB0ZWQgdGFnICclcyciLCBTdHJpbmcpOwotICAgICAgICBnb3RvIEVycm9yOwotICAgIH0KLQotICAgIC8vIFRoaXMgaXMgYSB3ZWlyZCBlcnJvciB0aGF0IG1heSBiZSBhIHN5bXB0b20gb2Ygc29tZXRoaW5nIG1vcmUgc2VyaW91cywgdGhlIG51bWJlciBvZgotICAgIC8vIHN0b3JlZCBpdGVtIGlzIGFjdHVhbGx5IGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHJlcXVpcmVkIGVsZW1lbnRzLgotICAgIGlmIChFbGVtQ291bnQgPCBUYWdEZXNjcmlwdG9yIC0+RWxlbUNvdW50KSB7Ci0KLSAgICAgICAgY2hhciBTdHJpbmdbNV07Ci0KLSAgICAgICAgX2Ntc1RhZ1NpZ25hdHVyZTJTdHJpbmcoU3RyaW5nLCBzaWcpOwotICAgICAgICBjbXNTaWduYWxFcnJvcihJY2MgLT5Db250ZXh0SUQsIGNtc0VSUk9SX0NPUlJVUFRJT05fREVURUNURUQsICInJXMnIEluY29uc2lzdGVudCBudW1iZXIgb2YgaXRlbXM6IGV4cGVjdGVkICVkLCBnb3QgJWQiLAotICAgICAgICAgICAgU3RyaW5nLCBUYWdEZXNjcmlwdG9yIC0+RWxlbUNvdW50LCBFbGVtQ291bnQpOwotICAgIH0KLQotCi0gICAgLy8gUmV0dXJuIHRoZSBkYXRhCi0gICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7Ci0gICAgcmV0dXJuIEljYyAtPiBUYWdQdHJzW25dOwotCi0KLSAgICAvLyBSZXR1cm4gZXJyb3IgYW5kIHVubG9jayB0aGEgZGF0YQotRXJyb3I6Ci0gICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotLy8gR2V0IHRydWUgdHlwZSBvZiBkYXRhCi1jbXNUYWdUeXBlU2lnbmF0dXJlIF9jbXNHZXRUYWdUcnVlVHlwZShjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVGFnU2lnbmF0dXJlIHNpZykKLXsKLSAgICBfY21zSUNDUFJPRklMRSogSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7Ci0gICAgY21zVGFnVHlwZUhhbmRsZXIqIFR5cGVIYW5kbGVyOwotICAgIGludCBuOwotCi0gICAgLy8gU2VhcmNoIGZvciBnaXZlbiB0YWcgaW4gSUNDIHByb2ZpbGUgZGlyZWN0b3J5Ci0gICAgbiA9IF9jbXNTZWFyY2hUYWcoSWNjLCBzaWcsIFRSVUUpOwotICAgIGlmIChuIDwgMCkgcmV0dXJuIChjbXNUYWdUeXBlU2lnbmF0dXJlKSAwOyAgICAgICAgICAgICAgICAvLyBOb3QgZm91bmQsIHJldHVybiBOVUxMCi0KLSAgICAvLyBHZXQgdGhlIGhhbmRsZXIuIFRoZSB0cnVlIHR5cGUgaXMgdGhlcmUKLSAgICBUeXBlSGFuZGxlciA9ICBJY2MgLT4gVGFnVHlwZUhhbmRsZXJzW25dOwotICAgIHJldHVybiBUeXBlSGFuZGxlciAtPlNpZ25hdHVyZTsKLX0KLQotCi0vLyBXcml0ZSBhIHNpbmdsZSB0YWcuIFRoaXMganVzdCBrZWVwcyB0cmFjayBvZiB0aGUgdGFrIGludG8gYSBsaXN0IG9mICJ0byBiZSB3cml0dGVuIi4gSWYgdGhlIHRhZyBpcyBhbHJlYWR5Ci0vLyBpbiB0aGF0IGxpc3QsIHRoZSBwcmV2aW91cyB2ZXJzaW9uIGlzIGRlbGV0ZWQuCi1jbXNCb29sIENNU0VYUE9SVCBjbXNXcml0ZVRhZyhjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVGFnU2lnbmF0dXJlIHNpZywgY29uc3Qgdm9pZCogZGF0YSkKLXsKLSAgICBfY21zSUNDUFJPRklMRSogSWNjID0gKF9jbXNJQ0NQUk9GSUxFKikgaFByb2ZpbGU7Ci0gICAgY21zVGFnVHlwZUhhbmRsZXIqIFR5cGVIYW5kbGVyID0gTlVMTDsKLSAgICBjbXNUYWdUeXBlSGFuZGxlciBMb2NhbFR5cGVIYW5kbGVyOwotICAgIGNtc1RhZ0Rlc2NyaXB0b3IqIFRhZ0Rlc2NyaXB0b3IgPSBOVUxMOwotICAgIGNtc1RhZ1R5cGVTaWduYXR1cmUgVHlwZTsKLSAgICBpbnQgaTsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIFZlcnNpb247Ci0gICAgY2hhciBUeXBlU3RyaW5nWzVdLCBTaWdTdHJpbmdbNV07Ci0KLSAgICBpZiAoIV9jbXNMb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KSkgcmV0dXJuIEZBTFNFOwotCi0gICAgLy8gVG8gZGVsZXRlIHRhZ3MuCi0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotCi0gICAgICAgICAvLyBEZWxldGUgdGhlIHRhZwotICAgICAgICAgaSA9IF9jbXNTZWFyY2hUYWcoSWNjLCBzaWcsIEZBTFNFKTsKLSAgICAgICAgIGlmIChpID49IDApIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAvLyBVc2UgemVybyBhcyBhIG1hcmsgb2YgZGVsZXRlZCAKLSAgICAgICAgICAgICBfY21zRGVsZXRlVGFnQnlQb3MoSWNjLCBpKTsKLSAgICAgICAgICAgICBJY2MgLT5UYWdOYW1lc1tpXSA9IChjbXNUYWdTaWduYXR1cmUpIDA7Ci0gICAgICAgICAgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7Ci0gICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICB9Ci0gICAgICAgICAvLyBEaWRuJ3QgZmluZCB0aGUgdGFnCi0gICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgfQotCi0gICAgaWYgKCFfY21zTmV3VGFnKEljYywgc2lnLCAmaSkpIGdvdG8gRXJyb3I7Ci0KLSAgICAvLyBUaGlzIGlzIG5vdCByYXcKLSAgICBJY2MgLT5UYWdTYXZlQXNSYXdbaV0gPSBGQUxTRTsKLQotICAgIC8vIFRoaXMgaXMgbm90IGEgbGluawotICAgIEljYyAtPlRhZ0xpbmtlZFtpXSA9IChjbXNUYWdTaWduYXR1cmUpIDA7Ci0KLSAgICAvLyBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFRBRy4KLSAgICBUYWdEZXNjcmlwdG9yID0gX2Ntc0dldFRhZ0Rlc2NyaXB0b3IoSWNjLT4gQ29udGV4dElELCBzaWcpOwotICAgIGlmIChUYWdEZXNjcmlwdG9yID09IE5VTEwpewotICAgICAgICAgY21zU2lnbmFsRXJyb3IoSWNjIC0+Q29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVuc3VwcG9ydGVkIHRhZyAnJXgnIiwgc2lnKTsKLSAgICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0KLQotICAgIC8vIE5vdyB3ZSBuZWVkIHRvIGtub3cgd2hpY2ggdHlwZSB0byB1c2UuIEl0IGRlcGVuZHMgb24gdGhlIHZlcnNpb24uCi0gICAgVmVyc2lvbiA9IGNtc0dldFByb2ZpbGVWZXJzaW9uKGhQcm9maWxlKTsKLQotICAgIGlmIChUYWdEZXNjcmlwdG9yIC0+RGVjaWRlVHlwZSAhPSBOVUxMKSB7Ci0KLSAgICAgICAgLy8gTGV0IHRoZSB0YWcgZGVzY3JpcHRvciB0byBkZWNpZGUgdGhlIHR5cGUgYmFzZSBvbiBkZXBlbmRpbmcgb24KLSAgICAgICAgLy8gdGhlIGRhdGEuIFRoaXMgaXMgdXNlZnVsIGZvciBleGFtcGxlIG9uIHBhcmFtZXRyaWMgY3VydmVzLCB3aGVyZQotICAgICAgICAvLyBjdXJ2ZXMgc3BlY2lmaWVkIGJ5IGEgdGFibGUgY2Fubm90IGJlIHNhdmVkIGFzIHBhcmFtZXRyaWMgYW5kIG5lZWRzCi0gICAgICAgIC8vIHRvIGJlIGNhc3RlZCB0byBzaW5nbGUgdjItY3VydmVzLCBldmVuIG9uIHY0IHByb2ZpbGVzLgotCi0gICAgICAgIFR5cGUgPSBUYWdEZXNjcmlwdG9yIC0+RGVjaWRlVHlwZShWZXJzaW9uLCBkYXRhKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0KLSAgICAgICAgVHlwZSA9IFRhZ0Rlc2NyaXB0b3IgLT5TdXBwb3J0ZWRUeXBlc1swXTsKLSAgICB9Ci0KLSAgICAvLyBEb2VzIHRoZSB0YWcgc3VwcG9ydCB0aGlzIHR5cGU/Ci0gICAgaWYgKCFJc1R5cGVTdXBwb3J0ZWQoVGFnRGVzY3JpcHRvciwgVHlwZSkpIHsKLQotICAgICAgICBfY21zVGFnU2lnbmF0dXJlMlN0cmluZyhUeXBlU3RyaW5nLCAoY21zVGFnU2lnbmF0dXJlKSBUeXBlKTsKLSAgICAgICAgX2Ntc1RhZ1NpZ25hdHVyZTJTdHJpbmcoU2lnU3RyaW5nLCAgc2lnKTsKLQotICAgICAgICBjbXNTaWduYWxFcnJvcihJY2MgLT5Db250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5zdXBwb3J0ZWQgdHlwZSAnJXMnIGZvciB0YWcgJyVzJyIsIFR5cGVTdHJpbmcsIFNpZ1N0cmluZyk7Ci0gICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgfQotCi0gICAgLy8gRG9lcyB3ZSBoYXZlIGEgaGFuZGxlciBmb3IgdGhpcyB0eXBlPwotICAgIFR5cGVIYW5kbGVyID0gIF9jbXNHZXRUYWdUeXBlSGFuZGxlcihJY2MtPkNvbnRleHRJRCwgVHlwZSk7Ci0gICAgaWYgKFR5cGVIYW5kbGVyID09IE5VTEwpIHsKLQotICAgICAgICBfY21zVGFnU2lnbmF0dXJlMlN0cmluZyhUeXBlU3RyaW5nLCAoY21zVGFnU2lnbmF0dXJlKSBUeXBlKTsKLSAgICAgICAgX2Ntc1RhZ1NpZ25hdHVyZTJTdHJpbmcoU2lnU3RyaW5nLCAgc2lnKTsKLQotICAgICAgICBjbXNTaWduYWxFcnJvcihJY2MgLT5Db250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5zdXBwb3J0ZWQgdHlwZSAnJXMnIGZvciB0YWcgJyVzJyIsIFR5cGVTdHJpbmcsIFNpZ1N0cmluZyk7Ci0gICAgICAgIGdvdG8gRXJyb3I7ICAgICAgICAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuCi0gICAgfQotCi0KLSAgICAvLyBGaWxsIGZpZWxkcyBvbiBpY2Mgc3RydWN0dXJlCi0gICAgSWNjIC0+VGFnVHlwZUhhbmRsZXJzW2ldICA9IFR5cGVIYW5kbGVyOwotICAgIEljYyAtPlRhZ05hbWVzW2ldICAgICAgICAgPSBzaWc7Ci0gICAgSWNjIC0+VGFnU2l6ZXNbaV0gICAgICAgICA9IDA7Ci0gICAgSWNjIC0+VGFnT2Zmc2V0c1tpXSAgICAgICA9IDA7Ci0KLSAgICBMb2NhbFR5cGVIYW5kbGVyID0gKlR5cGVIYW5kbGVyOwotICAgIExvY2FsVHlwZUhhbmRsZXIuQ29udGV4dElEICA9IEljYyAtPkNvbnRleHRJRDsKLSAgICBMb2NhbFR5cGVIYW5kbGVyLklDQ1ZlcnNpb24gPSBJY2MgLT5WZXJzaW9uOwotICAgIEljYyAtPlRhZ1B0cnNbaV0gICAgICAgICAgICA9IExvY2FsVHlwZUhhbmRsZXIuRHVwUHRyKCZMb2NhbFR5cGVIYW5kbGVyLCBkYXRhLCBUYWdEZXNjcmlwdG9yIC0+RWxlbUNvdW50KTsKLQotICAgIGlmIChJY2MgLT5UYWdQdHJzW2ldID09IE5VTEwpICB7Ci0KLSAgICAgICAgX2Ntc1RhZ1NpZ25hdHVyZTJTdHJpbmcoVHlwZVN0cmluZywgKGNtc1RhZ1NpZ25hdHVyZSkgVHlwZSk7Ci0gICAgICAgIF9jbXNUYWdTaWduYXR1cmUyU3RyaW5nKFNpZ1N0cmluZywgIHNpZyk7Ci0gICAgICAgIGNtc1NpZ25hbEVycm9yKEljYyAtPkNvbnRleHRJRCwgY21zRVJST1JfQ09SUlVQVElPTl9ERVRFQ1RFRCwgIk1hbGZvcm1lZCBzdHJ1Y3QgaW4gdHlwZSAnJXMnIGZvciB0YWcgJyVzJyIsIFR5cGVTdHJpbmcsIFNpZ1N0cmluZyk7Ci0KLSAgICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0KLSAgICBfY21zVW5sb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KTsKLSAgICByZXR1cm4gVFJVRTsKLQotRXJyb3I6Ci0gICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7Ci0gICAgcmV0dXJuIEZBTFNFOwotCi19Ci0KLS8vIFJlYWQgYW5kIHdyaXRlIHJhdyBkYXRhLiBUaGUgb25seSB3YXkgdGhvc2UgZnVuY3Rpb24gd291bGQgd29yayBhbmQga2VlcCBjb25zaXN0ZW5jZSB3aXRoIG5vcm1hbCByZWFkIGFuZCB3cml0ZQotLy8gaXMgdG8gZG8gYW4gYWRkaXRpb25hbCBzdGVwIG9mIHNlcmlhbGl6YXRpb24uIFRoYXQgbWVhbnMsIHJlYWRSYXcgd291bGQgaXNzdWUgYSBub3JtYWwgcmVhZCBhbmQgdGhlbiBjb252ZXJ0IHRoZSBvYnRhaW5lZAotLy8gZGF0YSB0byByYXcgYnl0ZXMgYnkgdXNpbmcgdGhlICJ3cml0ZSIgc2VyaWFsaXphdGlvbiBsb2dpYy4gQW5kIHZpY2UtdmVyc2EuIEkga25vdyB0aGlzIG1heSBlbmQgaW4gc2l0dWF0aW9ucyB3aGVyZQotLy8gcmF3IGRhdGEgd3JpdHRlbiBkb2VzIG5vdCBleGFjdGx5IGNvcnJlc3BvbmQgd2l0aCB0aGUgcmF3IGRhdGEgcHJvcG9zZWQgdG8gY21zV3JpdGVSYXcgZGF0YSwgYnV0IHRoaXMgYXBwcm9hY2ggYWxsb3dzCi0vLyB0byB3cml0ZSBhIHRhZyBhcyByYXcgZGF0YSBhbmQgdGhlIHJlYWQgaXQgYXMgaGFuZGxlZC4KLQotY21zSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc1JlYWRSYXdUYWcoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1RhZ1NpZ25hdHVyZSBzaWcsIHZvaWQqIGRhdGEsIGNtc1VJbnQzMk51bWJlciBCdWZmZXJTaXplKQotewotICAgIF9jbXNJQ0NQUk9GSUxFKiBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKLSAgICB2b2lkICpPYmplY3Q7Ci0gICAgaW50IGk7Ci0gICAgY21zSU9IQU5ETEVSKiBNZW1JTzsKLSAgICBjbXNUYWdUeXBlSGFuZGxlciogVHlwZUhhbmRsZXIgPSBOVUxMOwotICAgIGNtc1RhZ1R5cGVIYW5kbGVyIExvY2FsVHlwZUhhbmRsZXI7Ci0gICAgY21zVGFnRGVzY3JpcHRvciogVGFnRGVzY3JpcHRvciA9IE5VTEw7Ci0gICAgY21zVUludDMyTnVtYmVyIHJjOwotICAgIGNtc1VJbnQzMk51bWJlciBPZmZzZXQsIFRhZ1NpemU7Ci0KLSAgICBpZiAoIV9jbXNMb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KSkgcmV0dXJuIDA7Ci0KLSAgICAvLyBTZWFyY2ggZm9yIGdpdmVuIHRhZyBpbiBJQ0MgcHJvZmlsZSBkaXJlY3RvcnkKLSAgICBpID0gX2Ntc1NlYXJjaFRhZyhJY2MsIHNpZywgVFJVRSk7Ci0gICAgaWYgKGkgPCAwKSBnb3RvIEVycm9yOyAgICAgICAgICAgICAgICAgLy8gTm90IGZvdW5kLCAKLQotICAgIC8vIEl0IGlzIGFscmVhZHkgcmVhZD8KLSAgICBpZiAoSWNjIC0+IFRhZ1B0cnNbaV0gPT0gTlVMTCkgewotCi0gICAgICAgIC8vIE5vIHlldCwgZ2V0IG9yaWdpbmFsIHBvc2l0aW9uCi0gICAgICAgIE9mZnNldCAgID0gSWNjIC0+VGFnT2Zmc2V0c1tpXTsKLSAgICAgICAgVGFnU2l6ZSAgPSBJY2MgLT5UYWdTaXplc1tpXTsKLQotICAgICAgICAvLyByZWFkIHRoZSBkYXRhIGRpcmVjdGx5LCBkb24ndCBrZWVwIGNvcHkKLSAgICAgICAgaWYgKGRhdGEgIT0gTlVMTCkgewotCi0gICAgICAgICAgICBpZiAoQnVmZmVyU2l6ZSA8IFRhZ1NpemUpCi0gICAgICAgICAgICAgICAgVGFnU2l6ZSA9IEJ1ZmZlclNpemU7Ci0KLSAgICAgICAgICAgIGlmICghSWNjIC0+SU9oYW5kbGVyIC0+U2VlayhJY2MgLT5JT2hhbmRsZXIsIE9mZnNldCkpIGdvdG8gRXJyb3I7Ci0gICAgICAgICAgICBpZiAoIUljYyAtPklPaGFuZGxlciAtPlJlYWQoSWNjIC0+SU9oYW5kbGVyLCBkYXRhLCAxLCBUYWdTaXplKSkgZ290byBFcnJvcjsKLQotICAgICAgICAgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7Ci0gICAgICAgICAgICByZXR1cm4gVGFnU2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIF9jbXNVbmxvY2tNdXRleChJY2MtPkNvbnRleHRJRCwgSWNjIC0+VXNyTXV0ZXgpOwotICAgICAgICByZXR1cm4gSWNjIC0+VGFnU2l6ZXNbaV07Ci0gICAgfQotCi0gICAgLy8gVGhlIGRhdGEgaGFzIGJlZW4gYWxyZWFkeSByZWFkLCBvciB3cml0dGVuLiBCdXQgd2FpdCEsIG1heWJlIHRoZSB1c2VyIGNob29zZWQgdG8gc2F2ZSBhcwotICAgIC8vIHJhdyBkYXRhLiBJbiB0aGlzIGNhc2UsIHJldHVybiB0aGUgcmF3IGRhdGEgZGlyZWN0bHkKLSAgICBpZiAoSWNjIC0+VGFnU2F2ZUFzUmF3W2ldKSB7Ci0KLSAgICAgICAgaWYgKGRhdGEgIT0gTlVMTCkgIHsKLQotICAgICAgICAgICAgVGFnU2l6ZSAgPSBJY2MgLT5UYWdTaXplc1tpXTsKLSAgICAgICAgICAgIGlmIChCdWZmZXJTaXplIDwgVGFnU2l6ZSkKLSAgICAgICAgICAgICAgICBUYWdTaXplID0gQnVmZmVyU2l6ZTsKLQotICAgICAgICAgICAgbWVtbW92ZShkYXRhLCBJY2MgLT5UYWdQdHJzW2ldLCBUYWdTaXplKTsKLQotICAgICAgICAgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7Ci0gICAgICAgICAgICByZXR1cm4gVGFnU2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIF9jbXNVbmxvY2tNdXRleChJY2MtPkNvbnRleHRJRCwgSWNjIC0+VXNyTXV0ZXgpOwotICAgICAgICByZXR1cm4gSWNjIC0+VGFnU2l6ZXNbaV07Ci0gICAgfQotCi0gICAgLy8gQWxyZWFkeSByZWFkZWQsIG9yIHByZXZpb3VzbHkgc2V0IGJ5IGNtc1dyaXRlVGFnKCkuIFdlIG5lZWQgdG8gc2VyaWFsaXplIHRoYXQKLSAgICAvLyBkYXRhIHRvIHJhdyBpbiBvcmRlciB0byBtYWludGFpbiBjb25zaXN0ZW5jeS4KLQotICAgIF9jbXNVbmxvY2tNdXRleChJY2MtPkNvbnRleHRJRCwgSWNjIC0+VXNyTXV0ZXgpOwotICAgIE9iamVjdCA9IGNtc1JlYWRUYWcoaFByb2ZpbGUsIHNpZyk7Ci0gICAgaWYgKCFfY21zTG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCkpIHJldHVybiAwOwotCi0gICAgaWYgKE9iamVjdCA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgLy8gTm93IHdlIG5lZWQgdG8gc2VyaWFsaXplIHRvIGEgbWVtb3J5IGJsb2NrOiBqdXN0IHVzZSBhIG1lbW9yeSBpb2hhbmRsZXIKLQotICAgIGlmIChkYXRhID09IE5VTEwpIHsKLSAgICAgICAgTWVtSU8gPSBjbXNPcGVuSU9oYW5kbGVyRnJvbU5VTEwoY21zR2V0UHJvZmlsZUNvbnRleHRJRChoUHJvZmlsZSkpOwotICAgIH0gZWxzZXsKLSAgICAgICAgTWVtSU8gPSBjbXNPcGVuSU9oYW5kbGVyRnJvbU1lbShjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKSwgZGF0YSwgQnVmZmVyU2l6ZSwgInciKTsKLSAgICB9Ci0gICAgaWYgKE1lbUlPID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLSAgICAvLyBPYnRhaW4gdHlwZSBoYW5kbGluZyBmb3IgdGhlIHRhZwotICAgIFR5cGVIYW5kbGVyID0gSWNjIC0+VGFnVHlwZUhhbmRsZXJzW2ldOwotICAgIFRhZ0Rlc2NyaXB0b3IgPSBfY21zR2V0VGFnRGVzY3JpcHRvcihJY2MtPiBDb250ZXh0SUQsIHNpZyk7Ci0gICAgaWYgKFRhZ0Rlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgICAgICBjbXNDbG9zZUlPaGFuZGxlcihNZW1JTyk7Ci0gICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgfQotICAgIAotICAgIGlmIChUeXBlSGFuZGxlciA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgLy8gU2VyaWFsaXplCi0gICAgTG9jYWxUeXBlSGFuZGxlciA9ICpUeXBlSGFuZGxlcjsKLSAgICBMb2NhbFR5cGVIYW5kbGVyLkNvbnRleHRJRCAgPSBJY2MgLT5Db250ZXh0SUQ7Ci0gICAgTG9jYWxUeXBlSGFuZGxlci5JQ0NWZXJzaW9uID0gSWNjIC0+VmVyc2lvbjsKLQotICAgIGlmICghX2Ntc1dyaXRlVHlwZUJhc2UoTWVtSU8sIFR5cGVIYW5kbGVyIC0+U2lnbmF0dXJlKSkgewotICAgICAgICBjbXNDbG9zZUlPaGFuZGxlcihNZW1JTyk7Ci0gICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgfQotCi0gICAgaWYgKCFMb2NhbFR5cGVIYW5kbGVyLldyaXRlUHRyKCZMb2NhbFR5cGVIYW5kbGVyLCBNZW1JTywgT2JqZWN0LCBUYWdEZXNjcmlwdG9yIC0+RWxlbUNvdW50KSkgewotICAgICAgICBjbXNDbG9zZUlPaGFuZGxlcihNZW1JTyk7Ci0gICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgfQotCi0gICAgLy8gR2V0IFNpemUgYW5kIGNsb3NlCi0gICAgcmMgPSBNZW1JTyAtPlRlbGwoTWVtSU8pOwotICAgIGNtc0Nsb3NlSU9oYW5kbGVyKE1lbUlPKTsgICAgICAvLyBJZ25vcmUgcmV0dXJuIGNvZGUgdGhpcyB0aW1lCi0KLSAgICBfY21zVW5sb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KTsKLSAgICByZXR1cm4gcmM7Ci0KLUVycm9yOgotICAgIF9jbXNVbmxvY2tNdXRleChJY2MtPkNvbnRleHRJRCwgSWNjIC0+VXNyTXV0ZXgpOwotICAgIHJldHVybiAwOwotfQotCi0vLyBTaW1pbGFyIHRvIHRoZSBhbnRlcmlvci4gVGhpcyBmdW5jdGlvbiBhbGxvd3MgdG8gd3JpdGUgZGlyZWN0bHkgdG8gdGhlIElDQyBwcm9maWxlIGFueSBkYXRhLCB3aXRob3V0Ci0vLyBjaGVja2luZyBhbnl0aGluZy4gQXMgYSBydWxlLCBtaXhpbmcgUmF3IHdpdGggY29va2VkIGRvZXNuJ3Qgd29yaywgc28gd3JpdHRpbmcgYSB0YWcgYXMgcmF3IGFuZCB0aGVuIHJlYWRpbmcKLS8vIGl0IGFzIGNvb2tlZCB3aXRob3V0IHNlcmlhbGl6aW5nIGRvZXMgcmVzdWx0IGludG8gYW4gZXJyb3IuIElmIHRoYXQgaXMgd2hhIHlvdSB3YW50LCB5b3Ugd2lsbCBuZWVkIHRvIGR1bXAKLS8vIHRoZSBwcm9maWxlIHRvIG1lbXJ5IG9yIGRpc2sgYW5kIHRoZW4gcmVvcGVuIGl0LgotY21zQm9vbCBDTVNFWFBPUlQgY21zV3JpdGVSYXdUYWcoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1RhZ1NpZ25hdHVyZSBzaWcsIGNvbnN0IHZvaWQqIGRhdGEsIGNtc1VJbnQzMk51bWJlciBTaXplKQotewotICAgIF9jbXNJQ0NQUk9GSUxFKiBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKLSAgICBpbnQgaTsKLQotICAgIGlmICghX2Ntc0xvY2tNdXRleChJY2MtPkNvbnRleHRJRCwgSWNjIC0+VXNyTXV0ZXgpKSByZXR1cm4gMDsKLQotICAgIGlmICghX2Ntc05ld1RhZyhJY2MsIHNpZywgJmkpKSB7Ci0gICAgICAgIF9jbXNVbmxvY2tNdXRleChJY2MtPkNvbnRleHRJRCwgSWNjIC0+VXNyTXV0ZXgpOwotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIC8vIE1hcmsgdGhlIHRhZyBhcyBiZWluZyB3cml0dGVuIGFzIFJBVwotICAgIEljYyAtPlRhZ1NhdmVBc1Jhd1tpXSA9IFRSVUU7Ci0gICAgSWNjIC0+VGFnTmFtZXNbaV0gICAgID0gc2lnOwotICAgIEljYyAtPlRhZ0xpbmtlZFtpXSAgICA9IChjbXNUYWdTaWduYXR1cmUpIDA7Ci0KLSAgICAvLyBLZWVwIGEgY29weSBvZiB0aGUgYmxvY2sKLSAgICBJY2MgLT5UYWdQdHJzW2ldICA9IF9jbXNEdXBNZW0oSWNjIC0+Q29udGV4dElELCBkYXRhLCBTaXplKTsKLSAgICBJY2MgLT5UYWdTaXplc1tpXSA9IFNpemU7Ci0KLSAgICBfY21zVW5sb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLy8gVXNpbmcgdGhpcyBmdW5jdGlvbiB5b3UgY2FuIGNvbGxhcHNlIHNldmVyYWwgdGFnIGVudHJpZXMgdG8gdGhlIHNhbWUgYmxvY2sgaW4gdGhlIHByb2ZpbGUKLWNtc0Jvb2wgQ01TRVhQT1JUIGNtc0xpbmtUYWcoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1RhZ1NpZ25hdHVyZSBzaWcsIGNtc1RhZ1NpZ25hdHVyZSBkZXN0KQotewotICAgIF9jbXNJQ0NQUk9GSUxFKiBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKLSAgICBpbnQgaTsKLQotICAgICBpZiAoIV9jbXNMb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KSkgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKCFfY21zTmV3VGFnKEljYywgc2lnLCAmaSkpIHsKLSAgICAgICAgX2Ntc1VubG9ja011dGV4KEljYy0+Q29udGV4dElELCBJY2MgLT5Vc3JNdXRleCk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICAvLyBLZWVwIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbgotICAgIEljYyAtPlRhZ1NhdmVBc1Jhd1tpXSA9IEZBTFNFOwotICAgIEljYyAtPlRhZ05hbWVzW2ldICAgICA9IHNpZzsKLSAgICBJY2MgLT5UYWdMaW5rZWRbaV0gICAgPSBkZXN0OwotCi0gICAgSWNjIC0+VGFnUHRyc1tpXSAgICA9IE5VTEw7Ci0gICAgSWNjIC0+VGFnU2l6ZXNbaV0gICA9IDA7Ci0gICAgSWNjIC0+VGFnT2Zmc2V0c1tpXSA9IDA7Ci0KLSAgICBfY21zVW5sb2NrTXV0ZXgoSWNjLT5Db250ZXh0SUQsIEljYyAtPlVzck11dGV4KTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0vLyBSZXR1cm5zIHRoZSB0YWcgbGlua2VkIHRvIHNpZywgaW4gdGhlIGNhc2UgdHdvIHRhZ3MgYXJlIHNoYXJpbmcgc2FtZSByZXNvdXJjZQotY21zVGFnU2lnbmF0dXJlICBDTVNFWFBPUlQgY21zVGFnTGlua2VkVG8oY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1RhZ1NpZ25hdHVyZSBzaWcpCi17Ci0gICAgX2Ntc0lDQ1BST0ZJTEUqIEljYyA9IChfY21zSUNDUFJPRklMRSopIGhQcm9maWxlOwotICAgIGludCBpOwotCi0gICAgLy8gU2VhcmNoIGZvciBnaXZlbiB0YWcgaW4gSUNDIHByb2ZpbGUgZGlyZWN0b3J5Ci0gICAgaSA9IF9jbXNTZWFyY2hUYWcoSWNjLCBzaWcsIEZBTFNFKTsKLSAgICBpZiAoaSA8IDApIHJldHVybiAoY21zVGFnU2lnbmF0dXJlKSAwOyAgICAgICAgICAgICAgICAgLy8gTm90IGZvdW5kLCByZXR1cm4gMAotCi0gICAgcmV0dXJuIEljYyAtPiBUYWdMaW5rZWRbaV07Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2lvMS5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNpbzEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc4YWEyYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2lvMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMiBNYXJ0aSBNYXJpYSBTYWd1ZXIKLS8vCi0vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLS8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLS8vIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLS8vIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotLy8gYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlCi0vLyBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotLy8KLS8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi0vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLS8vCi0vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLS8vIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTwotLy8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLS8vIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKLS8vIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLS8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgotLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0KLSNpbmNsdWRlICJsY21zMl9pbnRlcm5hbC5oIgotCi0vLyBSZWFkIHRhZ3MgdXNpbmcgbG93LWxldmVsIGZ1bmN0aW9ucywgcHJvdmlkZXMgbmVjZXNzYXJ5IGdsdWUgY29kZSB0byBhZGFwdCB2ZXJzaW9ucywgZXRjLgotCi0vLyBMVVQgdGFncwotc3RhdGljIGNvbnN0IGNtc1RhZ1NpZ25hdHVyZSBEZXZpY2UyUENTMTZbXSAgID0gIHtjbXNTaWdBVG9CMFRhZywgICAgIC8vIFBlcmNlcHR1YWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zU2lnQVRvQjFUYWcsICAgICAvLyBSZWxhdGl2ZSBjb2xvcmltZXRyaWMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zU2lnQVRvQjJUYWcsICAgICAvLyBTYXR1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1NpZ0FUb0IxVGFnIH07ICAgLy8gQWJzb2x1dGUgY29sb3JpbWV0cmljCi0KLXN0YXRpYyBjb25zdCBjbXNUYWdTaWduYXR1cmUgRGV2aWNlMlBDU0Zsb2F0W10gPSB7Y21zU2lnRFRvQjBUYWcsICAgICAvLyBQZXJjZXB0dWFsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1NpZ0RUb0IxVGFnLCAgICAgLy8gUmVsYXRpdmUgY29sb3JpbWV0cmljCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1NpZ0RUb0IyVGFnLCAgICAgLy8gU2F0dXJhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNTaWdEVG9CM1RhZyB9OyAgIC8vIEFic29sdXRlIGNvbG9yaW1ldHJpYwotCi1zdGF0aWMgY29uc3QgY21zVGFnU2lnbmF0dXJlIFBDUzJEZXZpY2UxNltdICAgID0ge2Ntc1NpZ0JUb0EwVGFnLCAgICAgLy8gUGVyY2VwdHVhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNTaWdCVG9BMVRhZywgICAgIC8vIFJlbGF0aXZlIGNvbG9yaW1ldHJpYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNTaWdCVG9BMlRhZywgICAgIC8vIFNhdHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zU2lnQlRvQTFUYWcgfTsgICAvLyBBYnNvbHV0ZSBjb2xvcmltZXRyaWMKLQotc3RhdGljIGNvbnN0IGNtc1RhZ1NpZ25hdHVyZSBQQ1MyRGV2aWNlRmxvYXRbXSA9IHtjbXNTaWdCVG9EMFRhZywgICAgIC8vIFBlcmNlcHR1YWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zU2lnQlRvRDFUYWcsICAgICAvLyBSZWxhdGl2ZSBjb2xvcmltZXRyaWMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zU2lnQlRvRDJUYWcsICAgICAvLyBTYXR1cmF0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1NpZ0JUb0QzVGFnIH07ICAgLy8gQWJzb2x1dGUgY29sb3JpbWV0cmljCi0KLQotLy8gRmFjdG9ycyB0byBjb252ZXJ0IGZyb20gMS4xNSBmaXhlZCBwb2ludCB0byAwLi4xLjAgcmFuZ2UgYW5kIHZpY2UtdmVyc2EKLSNkZWZpbmUgSW5wQWRqICAgKDEuMC9NQVhfRU5DT0RFQUJMRV9YWVopICAgICAvLyAoNjU1MzYuMC8oNjU1MzUuMCoyLjApKQotI2RlZmluZSBPdXRwQWRqICAoTUFYX0VOQ09ERUFCTEVfWFlaKSAgICAgICAgIC8vICgoMi4wKjY1NTM1LjApLzY1NTM2LjApCi0KLS8vIFNldmVyYWwgcmVzb3VyY2VzIGZvciBncmF5IGNvbnZlcnNpb25zLgotc3RhdGljIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIgR3JheUlucHV0TWF0cml4W10gPSB7IChJbnBBZGoqY21zRDUwWCksICAoSW5wQWRqKmNtc0Q1MFkpLCAgKElucEFkaipjbXNENTBaKSB9Owotc3RhdGljIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIgT25lVG9UaHJlZUlucHV0TWF0cml4W10gPSB7IDEsIDEsIDEgfTsKLXN0YXRpYyBjb25zdCBjbXNGbG9hdDY0TnVtYmVyIFBpY2tZTWF0cml4W10gPSB7IDAsIChPdXRwQWRqKmNtc0Q1MFkpLCAwIH07Ci1zdGF0aWMgY29uc3QgY21zRmxvYXQ2NE51bWJlciBQaWNrTHN0YXJNYXRyaXhbXSA9IHsgMSwgMCwgMCB9OwotCi0vLyBHZXQgYSBtZWRpYSB3aGl0ZSBwb2ludCBmaXhpbmcgc29tZSBpc3N1ZXMgZm91bmQgaW4gY2VydGFpbiBvbGQgcHJvZmlsZXMKLWNtc0Jvb2wgIF9jbXNSZWFkTWVkaWFXaGl0ZVBvaW50KGNtc0NJRVhZWiogRGVzdCwgY21zSFBST0ZJTEUgaFByb2ZpbGUpCi17Ci0gICAgY21zQ0lFWFlaKiBUYWc7Ci0KLSAgICBfY21zQXNzZXJ0KERlc3QgIT0gTlVMTCk7Ci0KLSAgICBUYWcgPSAoY21zQ0lFWFlaKikgY21zUmVhZFRhZyhoUHJvZmlsZSwgY21zU2lnTWVkaWFXaGl0ZVBvaW50VGFnKTsKLQotICAgIC8vIElmIG5vIHdwLCB0YWtlIEQ1MAotICAgIGlmIChUYWcgPT0gTlVMTCkgewotICAgICAgICAqRGVzdCA9ICpjbXNENTBfWFlaKCk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIC8vIFYyIGRpc3BsYXkgcHJvZmlsZXMgc2hvdWxkIGdpdmUgRDUwCi0gICAgaWYgKGNtc0dldEVuY29kZWRJQ0N2ZXJzaW9uKGhQcm9maWxlKSA8IDB4NDAwMDAwMCkgewotCi0gICAgICAgIGlmIChjbXNHZXREZXZpY2VDbGFzcyhoUHJvZmlsZSkgPT0gY21zU2lnRGlzcGxheUNsYXNzKSB7Ci0gICAgICAgICAgICAqRGVzdCA9ICpjbXNENTBfWFlaKCk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEFsbCBzZWVtcyBvawotICAgICpEZXN0ID0gKlRhZzsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0vLyBDaHJvbWF0aWMgYWRhcHRhdGlvbiBtYXRyaXguIEZpeCBzb21lIGlzc3VlcyBhcyB3ZWxsCi1jbXNCb29sICBfY21zUmVhZENIQUQoY21zTUFUMyogRGVzdCwgY21zSFBST0ZJTEUgaFByb2ZpbGUpCi17Ci0gICAgY21zTUFUMyogVGFnOwotCi0gICAgX2Ntc0Fzc2VydChEZXN0ICE9IE5VTEwpOwotCi0gICAgVGFnID0gKGNtc01BVDMqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCBjbXNTaWdDaHJvbWF0aWNBZGFwdGF0aW9uVGFnKTsKLQotICAgIGlmIChUYWcgIT0gTlVMTCkgewotICAgICAgICAqRGVzdCA9ICpUYWc7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIC8vIE5vIENIQUQgYXZhaWxhYmxlLCBkZWZhdWx0IGl0IHRvIGlkZW50aXR5Ci0gICAgX2Ntc01BVDNpZGVudGl0eShEZXN0KTsKLQotICAgIC8vIFYyIGRpc3BsYXkgcHJvZmlsZXMgc2hvdWxkIGdpdmUgRDUwCi0gICAgaWYgKGNtc0dldEVuY29kZWRJQ0N2ZXJzaW9uKGhQcm9maWxlKSA8IDB4NDAwMDAwMCkgewotCi0gICAgICAgIGlmIChjbXNHZXREZXZpY2VDbGFzcyhoUHJvZmlsZSkgPT0gY21zU2lnRGlzcGxheUNsYXNzKSB7Ci0KLSAgICAgICAgICAgIGNtc0NJRVhZWiogV2hpdGUgPSAoY21zQ0lFWFlaKikgY21zUmVhZFRhZyhoUHJvZmlsZSwgY21zU2lnTWVkaWFXaGl0ZVBvaW50VGFnKTsKLQotICAgICAgICAgICAgaWYgKFdoaXRlID09IE5VTEwpIHsKLQotICAgICAgICAgICAgICAgIF9jbXNNQVQzaWRlbnRpdHkoRGVzdCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBfY21zQWRhcHRhdGlvbk1hdHJpeChEZXN0LCBOVUxMLCBXaGl0ZSwgY21zRDUwX1hZWigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0KLS8vIEF1eGlsaWFyLCByZWFkIGNvbG9yYW50cyBhcyBhIE1BVDMgc3RydWN0dXJlLiBVc2VkIGJ5IGFueSBmdW5jdGlvbiB0aGF0IG5lZWRzIGEgbWF0cml4LXNoYXBlcgotc3RhdGljCi1jbXNCb29sIFJlYWRJQ0NNYXRyaXhSR0IyWFlaKGNtc01BVDMqIHIsIGNtc0hQUk9GSUxFIGhQcm9maWxlKQotewotICAgIGNtc0NJRVhZWiAqUHRyUmVkLCAqUHRyR3JlZW4sICpQdHJCbHVlOwotCi0gICAgX2Ntc0Fzc2VydChyICE9IE5VTEwpOwotCi0gICAgUHRyUmVkICAgPSAoY21zQ0lFWFlaICopIGNtc1JlYWRUYWcoaFByb2ZpbGUsIGNtc1NpZ1JlZENvbG9yYW50VGFnKTsKLSAgICBQdHJHcmVlbiA9IChjbXNDSUVYWVogKikgY21zUmVhZFRhZyhoUHJvZmlsZSwgY21zU2lnR3JlZW5Db2xvcmFudFRhZyk7Ci0gICAgUHRyQmx1ZSAgPSAoY21zQ0lFWFlaICopIGNtc1JlYWRUYWcoaFByb2ZpbGUsIGNtc1NpZ0JsdWVDb2xvcmFudFRhZyk7Ci0KLSAgICBpZiAoUHRyUmVkID09IE5VTEwgfHwgUHRyR3JlZW4gPT0gTlVMTCB8fCBQdHJCbHVlID09IE5VTEwpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIF9jbXNWRUMzaW5pdCgmciAtPiB2WzBdLCBQdHJSZWQgLT4gWCwgUHRyR3JlZW4gLT4gWCwgIFB0ckJsdWUgLT4gWCk7Ci0gICAgX2Ntc1ZFQzNpbml0KCZyIC0+IHZbMV0sIFB0clJlZCAtPiBZLCBQdHJHcmVlbiAtPiBZLCAgUHRyQmx1ZSAtPiBZKTsKLSAgICBfY21zVkVDM2luaXQoJnIgLT4gdlsyXSwgUHRyUmVkIC0+IFosIFB0ckdyZWVuIC0+IFosICBQdHJCbHVlIC0+IFopOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLy8gR3JheSBpbnB1dCBwaXBlbGluZQotc3RhdGljCi1jbXNQaXBlbGluZSogQnVpbGRHcmF5SW5wdXRNYXRyaXhQaXBlbGluZShjbXNIUFJPRklMRSBoUHJvZmlsZSkKLXsKLSAgICBjbXNUb25lQ3VydmUgKkdyYXlUUkM7Ci0gICAgY21zUGlwZWxpbmUqIEx1dDsKLSAgICBjbXNDb250ZXh0IENvbnRleHRJRCA9IGNtc0dldFByb2ZpbGVDb250ZXh0SUQoaFByb2ZpbGUpOwotCi0gICAgR3JheVRSQyA9IChjbXNUb25lQ3VydmUgKikgY21zUmVhZFRhZyhoUHJvZmlsZSwgY21zU2lnR3JheVRSQ1RhZyk7Ci0gICAgaWYgKEdyYXlUUkMgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBMdXQgPSBjbXNQaXBlbGluZUFsbG9jKENvbnRleHRJRCwgMSwgMyk7Ci0gICAgaWYgKEx1dCA9PSBOVUxMKQotICAgICAgICBnb3RvIEVycm9yOwotCi0gICAgaWYgKGNtc0dldFBDUyhoUHJvZmlsZSkgPT0gY21zU2lnTGFiRGF0YSkgewotCi0gICAgICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBpbXBsZW1lbnQgdGhlIHByb2ZpbGUgYXMgYW4gIGlkZW50aXR5IG1hdHJpeCBwbHVzIDMgdG9uZSBjdXJ2ZXMKLSAgICAgICAgY21zVUludDE2TnVtYmVyIFplcm9bMl0gPSB7IDB4ODA4MCwgMHg4MDgwIH07Ci0gICAgICAgIGNtc1RvbmVDdXJ2ZSogRW1wdHlUYWI7Ci0gICAgICAgIGNtc1RvbmVDdXJ2ZSogTGFiQ3VydmVzWzNdOwotCi0gICAgICAgIEVtcHR5VGFiID0gY21zQnVpbGRUYWJ1bGF0ZWRUb25lQ3VydmUxNihDb250ZXh0SUQsIDIsIFplcm8pOwotCi0gICAgICAgIGlmIChFbXB0eVRhYiA9PSBOVUxMKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLQotICAgICAgICBMYWJDdXJ2ZXNbMF0gPSBHcmF5VFJDOwotICAgICAgICBMYWJDdXJ2ZXNbMV0gPSBFbXB0eVRhYjsKLSAgICAgICAgTGFiQ3VydmVzWzJdID0gRW1wdHlUYWI7Ci0KLSAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfRU5ELCBjbXNTdGFnZUFsbG9jTWF0cml4KENvbnRleHRJRCwgMywgIDEsIE9uZVRvVGhyZWVJbnB1dE1hdHJpeCwgTlVMTCkpIHx8Ci0gICAgICAgICAgICAhY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgY21zU3RhZ2VBbGxvY1RvbmVDdXJ2ZXMoQ29udGV4dElELCAzLCBMYWJDdXJ2ZXMpKSkgewotICAgICAgICAgICAgICAgIGNtc0ZyZWVUb25lQ3VydmUoRW1wdHlUYWIpOwotICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBjbXNGcmVlVG9uZUN1cnZlKEVtcHR5VGFiKTsKLQotICAgIH0KLSAgICBlbHNlICB7Ci0KLSAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfRU5ELCBjbXNTdGFnZUFsbG9jVG9uZUN1cnZlcyhDb250ZXh0SUQsIDEsICZHcmF5VFJDKSkgfHwKLSAgICAgICAgICAgICFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfRU5ELCBjbXNTdGFnZUFsbG9jTWF0cml4KENvbnRleHRJRCwgMywgIDEsIEdyYXlJbnB1dE1hdHJpeCwgTlVMTCkpKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTHV0OwotCi1FcnJvcjoKLQkvLyBtZW1vcnkgcG9pbnRlZCBieSBHcmF5VFJDIGlzIG5vdCBhIG5ldyBtYWxsb2MgbWVtb3J5LCBzbyBkb24ndCBmcmVlIGl0IGhlcmUsIAotCS8vIG1lbW9yeSBwb2ludGVkIGJ5IEdyYXlUUkMgd2lsbCBiZSBmcmVlZCB3aGVuIGhQcm9maWxlIGlzIGNsb3NlZC4KLQkvLyB0ZXN0IGZpbGUgOjAwNDc3NzZfUG9ja2V0IE1lZGljaW5lXyBUaGUgTWFzc2FjaHVzZXR0cyBHZW5lcmFsIEhvc3BpdGFsIEhhbmRib29rIG9mIEludGVybmFsIE1lZGljaW5lLTIucGRmCi0JLy8gWGlhb2NodWFuIExpdSwgMjAxNDA0MjEKLSAgICAvL2Ntc0ZyZWVUb25lQ3VydmUoR3JheVRSQyk7Ci0gICAgY21zUGlwZWxpbmVGcmVlKEx1dCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8vIFJHQiBNYXRyaXggc2hhcGVyCi1zdGF0aWMKLWNtc1BpcGVsaW5lKiBCdWlsZFJHQklucHV0TWF0cml4U2hhcGVyKGNtc0hQUk9GSUxFIGhQcm9maWxlKQotewotICAgIGNtc1BpcGVsaW5lKiBMdXQ7Ci0gICAgY21zTUFUMyBNYXQ7Ci0gICAgY21zVG9uZUN1cnZlICpTaGFwZXNbM107Ci0gICAgY21zQ29udGV4dCBDb250ZXh0SUQgPSBjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKTsKLSAgICBpbnQgaSwgajsKLQotICAgIGlmICghUmVhZElDQ01hdHJpeFJHQjJYWVooJk1hdCwgaFByb2ZpbGUpKSByZXR1cm4gTlVMTDsKLQotICAgIC8vIFhZWiBQQ1MgaW4gZW5jb2RlZCBpbiAxLjE1IGZvcm1hdCwgYW5kIHRoZSBtYXRyaXggb3V0cHV0IGNvbWVzIGluIDAuLjB4ZmZmZiByYW5nZSwgc28KLSAgICAvLyB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgb3V0cHV0IGJ5IGEgZmFjdG9yIG9mICgweDEwMDAwLzB4ZmZmZikgdG8gcHV0IGRhdGEgaW4KLSAgICAvLyBhIDEuMTYgcmFuZ2UsIGFuZCB0aGVuIGEgPj4gMSB0byBvYnRhaW4gMS4xNS4gVGhlIHRvdGFsIGZhY3RvciBpcyAoNjU1MzYuMCkvKDY1NTM1LjAqMikKLQotICAgIGZvciAoaT0wOyBpIDwgMzsgaSsrKQotICAgICAgICBmb3IgKGo9MDsgaiA8IDM7IGorKykKLSAgICAgICAgICAgIE1hdC52W2ldLm5bal0gKj0gSW5wQWRqOwotCi0KLSAgICBTaGFwZXNbMF0gPSAoY21zVG9uZUN1cnZlICopIGNtc1JlYWRUYWcoaFByb2ZpbGUsIGNtc1NpZ1JlZFRSQ1RhZyk7Ci0gICAgU2hhcGVzWzFdID0gKGNtc1RvbmVDdXJ2ZSAqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCBjbXNTaWdHcmVlblRSQ1RhZyk7Ci0gICAgU2hhcGVzWzJdID0gKGNtc1RvbmVDdXJ2ZSAqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCBjbXNTaWdCbHVlVFJDVGFnKTsKLQotICAgIGlmICghU2hhcGVzWzBdIHx8ICFTaGFwZXNbMV0gfHwgIVNoYXBlc1syXSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBMdXQgPSBjbXNQaXBlbGluZUFsbG9jKENvbnRleHRJRCwgMywgMyk7Ci0gICAgaWYgKEx1dCAhPSBOVUxMKSB7Ci0KLSAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfRU5ELCBjbXNTdGFnZUFsbG9jVG9uZUN1cnZlcyhDb250ZXh0SUQsIDMsIFNoYXBlcykpIHx8Ci0gICAgICAgICAgICAhY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgY21zU3RhZ2VBbGxvY01hdHJpeChDb250ZXh0SUQsIDMsIDMsIChjbXNGbG9hdDY0TnVtYmVyKikgJk1hdCwgTlVMTCkpKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLQotICAgICAgICAvLyBOb3RlIHRoYXQgaXQgaXMgY2VydGFpbmx5IHBvc3NpYmxlIGEgc2luZ2xlIHByb2ZpbGUgd291bGQgaGF2ZSBhIExVVCBiYXNlZAotICAgICAgICAvLyB0YWcgZm9yIG91dHB1dCB3b3JraW5nIGluIGxhYiBhbmQgYSBtYXRyaXgtc2hhcGVyIGZvciB0aGUgZmFsbGJhY2sgY2FzZXMuIAotICAgICAgICAvLyBUaGlzIGlzIG5vdCBhbGxvd2VkIGJ5IHRoZSBzcGVjLCBidXQgdGhpcyBjb2RlIGlzIHRvbGVyYW50IHRvIHRob3NlIGNhc2VzICAgIAotICAgICAgICBpZiAoY21zR2V0UENTKGhQcm9maWxlKSA9PSBjbXNTaWdMYWJEYXRhKSB7Ci0KLSAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgX2Ntc1N0YWdlQWxsb2NYWVoyTGFiKENvbnRleHRJRCkpKQotICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHJldHVybiBMdXQ7Ci0KLUVycm9yOgotICAgIGNtc1BpcGVsaW5lRnJlZShMdXQpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0KLQotLy8gUmVhZCB0aGUgRFRvQVggdGFnLCBhZGp1c3RpbmcgdGhlIGVuY29kaW5nIG9mIExhYiBvciBYWVogaWYgbmVkZWQKLXN0YXRpYwotY21zUGlwZWxpbmUqIF9jbXNSZWFkRmxvYXRJbnB1dFRhZyhjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVGFnU2lnbmF0dXJlIHRhZ0Zsb2F0KQotewotICAgIGNtc0NvbnRleHQgQ29udGV4dElEICAgICAgID0gY21zR2V0UHJvZmlsZUNvbnRleHRJRChoUHJvZmlsZSk7Ci0gICAgY21zUGlwZWxpbmUqIEx1dCAgICAgICAgICAgPSBjbXNQaXBlbGluZUR1cCgoY21zUGlwZWxpbmUqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCB0YWdGbG9hdCkpOwotICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgc3BjID0gY21zR2V0Q29sb3JTcGFjZShoUHJvZmlsZSk7Ci0gICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBQQ1MgPSBjbXNHZXRQQ1MoaFByb2ZpbGUpOwotICAgIAotICAgIGlmIChMdXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0gICAgCi0gICAgLy8gaW5wdXQgYW5kIG91dHB1dCBvZiB0cmFuc2Zvcm0gYXJlIGluIGxjbXMgMC4uMSBlbmNvZGluZy4gIElmIFhZWiBvciBMYWIgc3BhY2VzIGFyZSB1c2VkLCAKLSAgICAvLyAgdGhlc2UgbmVlZCB0byBiZSBub3JtYWxpemVkIGludG8gdGhlIGFwcHJvcHJpYXRlIHJhbmdlcyAoTGFiID0gMTAwLDAsMCwgWFlaPTEuMCwxLjAsMS4wKQotICAgIGlmICggc3BjID09IGNtc1NpZ0xhYkRhdGEpCi0gICAgewotICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9CRUdJTiwgX2Ntc1N0YWdlTm9ybWFsaXplVG9MYWJGbG9hdChDb250ZXh0SUQpKSkKLSAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgfQotICAgIGVsc2UgaWYgKHNwYyA9PSBjbXNTaWdYWVpEYXRhKQotICAgIHsKLSAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfQkVHSU4sIF9jbXNTdGFnZU5vcm1hbGl6ZVRvWHl6RmxvYXQoQ29udGV4dElEKSkpCi0gICAgICAgICAgICBnb3RvIEVycm9yOwotICAgIH0KLSAgICAKLSAgICBpZiAoIFBDUyA9PSBjbXNTaWdMYWJEYXRhKQotICAgIHsKLSAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfRU5ELCBfY21zU3RhZ2VOb3JtYWxpemVGcm9tTGFiRmxvYXQoQ29udGV4dElEKSkpCi0gICAgICAgICAgICBnb3RvIEVycm9yOwotICAgIH0KLSAgICBlbHNlIGlmKCBQQ1MgPT0gY21zU2lnWFlaRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgX2Ntc1N0YWdlTm9ybWFsaXplRnJvbVh5ekZsb2F0KENvbnRleHRJRCkpKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIEx1dDsKLQotRXJyb3I6Ci0gICAgY21zUGlwZWxpbmVGcmVlKEx1dCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotLy8gUmVhZCBhbmQgY3JlYXRlIGEgQlJBTkQgTkVXIE1QRSBMVVQgZnJvbSBhIGdpdmVuIHByb2ZpbGUuIEFsbCBzdHVmZiBkZXBlbmRlbnQgb2YgdmVyc2lvbiwgZXRjCi0vLyBpcyBhZGp1c3RlZCBoZXJlIGluIG9yZGVyIHRvIGNyZWF0ZSBhIExVVCB0aGF0IHRha2VzIGNhcmUgb2YgYWxsIHRob3NlIGRldGFpbHMuCi0vLyBXZSBhZGQgaW50ZW50ID0gLTEgYXMgYSB3YXkgdG8gcmVhZCBtYXRyaXggc2hhcGVyIGFsd2F5cywgbm8gbWF0dGVyIG9mIG90aGVyIExVVAotY21zUGlwZWxpbmUqIF9jbXNSZWFkSW5wdXRMVVQoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGludCBJbnRlbnQpCi17Ci0gICAgY21zVGFnVHlwZVNpZ25hdHVyZSBPcmlnaW5hbFR5cGU7Ci0gICAgY21zVGFnU2lnbmF0dXJlIHRhZzE2ICAgID0gRGV2aWNlMlBDUzE2W0ludGVudF07Ci0gICAgY21zVGFnU2lnbmF0dXJlIHRhZ0Zsb2F0ID0gRGV2aWNlMlBDU0Zsb2F0W0ludGVudF07Ci0gICAgY21zQ29udGV4dCBDb250ZXh0SUQgPSBjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKTsKLQotICAgIC8vIE9uIG5hbWVkIGNvbG9yLCB0YWtlIHRoZSBhcHByb3BpYXRlIHRhZwotICAgIGlmIChjbXNHZXREZXZpY2VDbGFzcyhoUHJvZmlsZSkgPT0gY21zU2lnTmFtZWRDb2xvckNsYXNzKSB7Ci0KLSAgICAgICAgY21zUGlwZWxpbmUqIEx1dDsKLSAgICAgICAgY21zTkFNRURDT0xPUkxJU1QqIG5jID0gKGNtc05BTUVEQ09MT1JMSVNUKikgY21zUmVhZFRhZyhoUHJvZmlsZSwgY21zU2lnTmFtZWRDb2xvcjJUYWcpOwotCi0gICAgICAgIGlmIChuYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgICAgICBMdXQgPSBjbXNQaXBlbGluZUFsbG9jKENvbnRleHRJRCwgMCwgMCk7Ci0gICAgICAgIGlmIChMdXQgPT0gTlVMTCkgewotICAgICAgICAgICAgY21zRnJlZU5hbWVkQ29sb3JMaXN0KG5jKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfQkVHSU4sIF9jbXNTdGFnZUFsbG9jTmFtZWRDb2xvcihuYywgVFJVRSkpIHx8Ci0gICAgICAgICAgICAhY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgX2Ntc1N0YWdlQWxsb2NMYWJWMlRvVjQoQ29udGV4dElEKSkpIHsKLSAgICAgICAgICAgIGNtc1BpcGVsaW5lRnJlZShMdXQpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEx1dDsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIGlzIGFuIGF0dGVtcHQgdG8gcmV1c2UgdGhpcyBmdW50aW9uIHRvIHJldHJpZXZlIHRoZSBtYXRyaXgtc2hhcGVyIGFzIHBpcGVsaW5lIG5vCi0gICAgLy8gbWF0dGVyIG90aGVyIExVVCBhcmUgcHJlc2VudCBhbmQgaGF2ZSBwcmVjZWRlbmNlLiBJbnRlbnQgPSAtMSBtZWFucyBqdXN0IHRoaXMuCi0gICAgaWYgKEludGVudCAhPSAtMSkgewotCi0gICAgICAgIGlmIChjbXNJc1RhZyhoUHJvZmlsZSwgdGFnRmxvYXQpKSB7ICAvLyBGbG9hdCB0YWcgdGFrZXMgcHJlY2VkZW5jZQotCi0gICAgICAgICAgICAvLyBGbG9hdGluZyBwb2ludCBMVVQgYXJlIGFsd2F5cyBWNCwgYnV0IHRoZSBlbmNvZGluZyByYW5nZSBpcyBubwotICAgICAgICAgICAgLy8gbG9uZ2VyIDAuLjEuMCwgc28gd2UgbmVlZCB0byBhZGQgYW4gc3RhZ2UgZGVwZW5kaW5nIG9uIHRoZSBjb2xvciBzcGFjZQotICAgICAgICAgICAgcmV0dXJuIF9jbXNSZWFkRmxvYXRJbnB1dFRhZyhoUHJvZmlsZSwgdGFnRmxvYXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmV2ZXJ0IHRvIHBlcmNlcHR1YWwgaWYgbm8gdGFnIGlzIGZvdW5kCi0gICAgICAgIGlmICghY21zSXNUYWcoaFByb2ZpbGUsIHRhZzE2KSkgewotICAgICAgICAgICAgdGFnMTYgPSBEZXZpY2UyUENTMTZbMF07Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY21zSXNUYWcoaFByb2ZpbGUsIHRhZzE2KSkgeyAvLyBJcyB0aGVyZSBhbnkgTFVULUJhc2VkIHRhYmxlPwotCi0gICAgICAgICAgICAvLyBDaGVjayBwcm9maWxlIHZlcnNpb24gYW5kIExVVCB0eXBlLiBEbyB0aGUgbmVjZXNzYXJ5IGFkanVzdG1lbnRzIGlmIG5lZWRlZAotCi0gICAgICAgICAgICAvLyBGaXJzdCByZWFkIHRoZSB0YWcKLSAgICAgICAgICAgIGNtc1BpcGVsaW5lKiBMdXQgPSAoY21zUGlwZWxpbmUqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCB0YWcxNik7Ci0gICAgICAgICAgICBpZiAoTHV0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgICAgICAgICAvLyBBZnRlciByZWFkaW5nIGl0LCB3ZSBoYXZlIG5vdyBpbmZvIGFib3V0IHRoZSBvcmlnaW5hbCB0eXBlCi0gICAgICAgICAgICBPcmlnaW5hbFR5cGUgPSAgX2Ntc0dldFRhZ1RydWVUeXBlKGhQcm9maWxlLCB0YWcxNik7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBwcm9maWxlIG93bnMgdGhlIEx1dCwgc28gd2UgbmVlZCB0byBjb3B5IGl0Ci0gICAgICAgICAgICBMdXQgPSBjbXNQaXBlbGluZUR1cChMdXQpOwotCi0gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGFkanVzdCBkYXRhIG9ubHkgZm9yIExhYjE2IG9uIG91dHB1dAotICAgICAgICAgICAgaWYgKE9yaWdpbmFsVHlwZSAhPSBjbXNTaWdMdXQxNlR5cGUgfHwgY21zR2V0UENTKGhQcm9maWxlKSAhPSBjbXNTaWdMYWJEYXRhKQotICAgICAgICAgICAgICAgIHJldHVybiBMdXQ7Ci0KLSAgICAgICAgICAgIC8vIElmIHRoZSBpbnB1dCBpcyBMYWIsIGFkZCBhbHNvIGEgY29udmVyc2lvbiBhdCB0aGUgYmVnaW4KLSAgICAgICAgICAgIGlmIChjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKSA9PSBjbXNTaWdMYWJEYXRhICYmCi0gICAgICAgICAgICAgICAgIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9CRUdJTiwgX2Ntc1N0YWdlQWxsb2NMYWJWNFRvVjIoQ29udGV4dElEKSkpCi0gICAgICAgICAgICAgICAgZ290byBFcnJvcjsKLQotICAgICAgICAgICAgLy8gQWRkIGEgbWF0cml4IGZvciBjb252ZXJzaW9uIFYyIHRvIFY0IExhYiBQQ1MKLSAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgX2Ntc1N0YWdlQWxsb2NMYWJWMlRvVjQoQ29udGV4dElEKSkpCi0gICAgICAgICAgICAgICAgZ290byBFcnJvcjsKLQotICAgICAgICAgICAgcmV0dXJuIEx1dDsKLUVycm9yOgotICAgICAgICAgICAgY21zUGlwZWxpbmVGcmVlKEx1dCk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEx1dCB3YXMgbm90IGZvdW5kLCB0cnkgdG8gY3JlYXRlIGEgbWF0cml4LXNoYXBlcgotCi0gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGdyYXlzY2FsZSBwcm9maWxlLgotICAgIGlmIChjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKSA9PSBjbXNTaWdHcmF5RGF0YSkgewotCi0gICAgICAgIC8vIGlmIHNvLCBidWlsZCBhcHByb3BpYXRlIGNvbnZlcnNpb24gdGFibGVzLgotICAgICAgICAvLyBUaGUgdGFibGVzIGFyZSB0aGUgUENTIGlsdW1pbmFudCwgc2NhbGVkIGFjcm9zcyBHcmF5VFJDCi0gICAgICAgIHJldHVybiBCdWlsZEdyYXlJbnB1dE1hdHJpeFBpcGVsaW5lKGhQcm9maWxlKTsKLSAgICB9Ci0KLSAgICAvLyBOb3QgZ3JheSwgY3JlYXRlIGEgbm9ybWFsIG1hdHJpeC1zaGFwZXIKLSAgICByZXR1cm4gQnVpbGRSR0JJbnB1dE1hdHJpeFNoYXBlcihoUHJvZmlsZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBHcmF5IG91dHB1dCBwaXBlbGluZS4KLS8vIFhZWiAtPiBHcmF5IG9yIExhYiAtPiBHcmF5LiBTaW5jZSB3ZSBvbmx5IGtub3cgdGhlIEdyYXlUUkMsIHdlIG5lZWQgdG8gZG8gc29tZSBhc3N1bXB0aW9ucy4gR3JheSBjb21wb25lbnQgd2lsbCBiZQotLy8gZ2l2ZW4gYnkgWSBvbiBYWVogUENTIGFuZCBieSBMKiBvbiBMYWIgUENTLCBCb3RoIGFjcm9zcyBpbnZlcnNlIFRSQyBjdXJ2ZS4KLS8vIFRoZSBjb21wbGV0ZSBwaXBlbGluZSBvbiBYWVogaXMgTWF0cml4WzM6MV0gLT4gVG9uZSBjdXJ2ZSBhbmQgaW4gTGFiIE1hdHJpeFszOjFdIC0+IFRvbmUgQ3VydmUgYXMgd2VsbC4KLQotc3RhdGljCi1jbXNQaXBlbGluZSogQnVpbGRHcmF5T3V0cHV0UGlwZWxpbmUoY21zSFBST0ZJTEUgaFByb2ZpbGUpCi17Ci0gICAgY21zVG9uZUN1cnZlICpHcmF5VFJDLCAqUmV2R3JheVRSQzsKLSAgICBjbXNQaXBlbGluZSogTHV0OwotICAgIGNtc0NvbnRleHQgQ29udGV4dElEID0gY21zR2V0UHJvZmlsZUNvbnRleHRJRChoUHJvZmlsZSk7Ci0KLSAgICBHcmF5VFJDID0gKGNtc1RvbmVDdXJ2ZSAqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCBjbXNTaWdHcmF5VFJDVGFnKTsKLSAgICBpZiAoR3JheVRSQyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIFJldkdyYXlUUkMgPSBjbXNSZXZlcnNlVG9uZUN1cnZlKEdyYXlUUkMpOwotICAgIGlmIChSZXZHcmF5VFJDID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgTHV0ID0gY21zUGlwZWxpbmVBbGxvYyhDb250ZXh0SUQsIDMsIDEpOwotICAgIGlmIChMdXQgPT0gTlVMTCkgewotICAgICAgICBjbXNGcmVlVG9uZUN1cnZlKFJldkdyYXlUUkMpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoY21zR2V0UENTKGhQcm9maWxlKSA9PSBjbXNTaWdMYWJEYXRhKSB7Ci0KLSAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfRU5ELCBjbXNTdGFnZUFsbG9jTWF0cml4KENvbnRleHRJRCwgMSwgIDMsIFBpY2tMc3Rhck1hdHJpeCwgTlVMTCkpKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0gICAgZWxzZSAgewotICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9FTkQsIGNtc1N0YWdlQWxsb2NNYXRyaXgoQ29udGV4dElELCAxLCAgMywgUGlja1lNYXRyaXgsIE5VTEwpKSkKLSAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgfQotCi0gICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dCwgY21zQVRfRU5ELCBjbXNTdGFnZUFsbG9jVG9uZUN1cnZlcyhDb250ZXh0SUQsIDEsICZSZXZHcmF5VFJDKSkpCi0gICAgICAgIGdvdG8gRXJyb3I7Ci0KLSAgICBjbXNGcmVlVG9uZUN1cnZlKFJldkdyYXlUUkMpOwotICAgIHJldHVybiBMdXQ7Ci0KLUVycm9yOgotICAgIGNtc0ZyZWVUb25lQ3VydmUoUmV2R3JheVRSQyk7Ci0gICAgY21zUGlwZWxpbmVGcmVlKEx1dCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljCi1jbXNQaXBlbGluZSogQnVpbGRSR0JPdXRwdXRNYXRyaXhTaGFwZXIoY21zSFBST0ZJTEUgaFByb2ZpbGUpCi17Ci0gICAgY21zUGlwZWxpbmUqIEx1dDsKLSAgICBjbXNUb25lQ3VydmUgKlNoYXBlc1szXSwgKkludlNoYXBlc1szXTsKLSAgICBjbXNNQVQzIE1hdCwgSW52OwotICAgIGludCBpLCBqOwotICAgIGNtc0NvbnRleHQgQ29udGV4dElEID0gY21zR2V0UHJvZmlsZUNvbnRleHRJRChoUHJvZmlsZSk7Ci0KLSAgICBpZiAoIVJlYWRJQ0NNYXRyaXhSR0IyWFlaKCZNYXQsIGhQcm9maWxlKSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoIV9jbXNNQVQzaW52ZXJzZSgmTWF0LCAmSW52KSkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAvLyBYWVogUENTIGluIGVuY29kZWQgaW4gMS4xNSBmb3JtYXQsIGFuZCB0aGUgbWF0cml4IGlucHV0IHNob3VsZCBjb21lIGluIDAuLjB4ZmZmZiByYW5nZSwgc28KLSAgICAvLyB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgaW5wdXQgYnkgYSA8PCAxIHRvIG9idGFpbiBhIDEuMTYgZml4ZWQgYW5kIHRoZW4gYnkgYSBmYWN0b3Igb2YKLSAgICAvLyAoMHhmZmZmLzB4MTAwMDApIHRvIHB1dCBkYXRhIGluIDAuLjB4ZmZmZiByYW5nZS4gVG90YWwgZmFjdG9yIGlzICgyLjAqNjU1MzUuMCkvNjU1MzYuMDsKLQotICAgIGZvciAoaT0wOyBpIDwgMzsgaSsrKQotICAgICAgICBmb3IgKGo9MDsgaiA8IDM7IGorKykKLSAgICAgICAgICAgIEludi52W2ldLm5bal0gKj0gT3V0cEFkajsKLQotICAgIFNoYXBlc1swXSA9IChjbXNUb25lQ3VydmUgKikgY21zUmVhZFRhZyhoUHJvZmlsZSwgY21zU2lnUmVkVFJDVGFnKTsKLSAgICBTaGFwZXNbMV0gPSAoY21zVG9uZUN1cnZlICopIGNtc1JlYWRUYWcoaFByb2ZpbGUsIGNtc1NpZ0dyZWVuVFJDVGFnKTsKLSAgICBTaGFwZXNbMl0gPSAoY21zVG9uZUN1cnZlICopIGNtc1JlYWRUYWcoaFByb2ZpbGUsIGNtc1NpZ0JsdWVUUkNUYWcpOwotCi0gICAgaWYgKCFTaGFwZXNbMF0gfHwgIVNoYXBlc1sxXSB8fCAhU2hhcGVzWzJdKQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIEludlNoYXBlc1swXSA9IGNtc1JldmVyc2VUb25lQ3VydmUoU2hhcGVzWzBdKTsKLSAgICBJbnZTaGFwZXNbMV0gPSBjbXNSZXZlcnNlVG9uZUN1cnZlKFNoYXBlc1sxXSk7Ci0gICAgSW52U2hhcGVzWzJdID0gY21zUmV2ZXJzZVRvbmVDdXJ2ZShTaGFwZXNbMl0pOwotCi0gICAgaWYgKCFJbnZTaGFwZXNbMF0gfHwgIUludlNoYXBlc1sxXSB8fCAhSW52U2hhcGVzWzJdKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIEx1dCA9IGNtc1BpcGVsaW5lQWxsb2MoQ29udGV4dElELCAzLCAzKTsKLSAgICBpZiAoTHV0ICE9IE5VTEwpIHsKLQotICAgICAgICAvLyBOb3RlIHRoYXQgaXQgaXMgY2VydGFpbmx5IHBvc3NpYmxlIGEgc2luZ2xlIHByb2ZpbGUgd291bGQgaGF2ZSBhIExVVCBiYXNlZAotICAgICAgICAvLyB0YWcgZm9yIG91dHB1dCB3b3JraW5nIGluIGxhYiBhbmQgYSBtYXRyaXgtc2hhcGVyIGZvciB0aGUgZmFsbGJhY2sgY2FzZXMuIAotICAgICAgICAvLyBUaGlzIGlzIG5vdCBhbGxvd2VkIGJ5IHRoZSBzcGVjLCBidXQgdGhpcyBjb2RlIGlzIHRvbGVyYW50IHRvIHRob3NlIGNhc2VzICAgIAotICAgICAgICBpZiAoY21zR2V0UENTKGhQcm9maWxlKSA9PSBjbXNTaWdMYWJEYXRhKSB7Ci0KLSAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgX2Ntc1N0YWdlQWxsb2NMYWIyWFlaKENvbnRleHRJRCkpKQotICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9FTkQsIGNtc1N0YWdlQWxsb2NNYXRyaXgoQ29udGV4dElELCAzLCAzLCAoY21zRmxvYXQ2NE51bWJlciopICZJbnYsIE5VTEwpKSB8fAotICAgICAgICAgICAgIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9FTkQsIGNtc1N0YWdlQWxsb2NUb25lQ3VydmVzKENvbnRleHRJRCwgMywgSW52U2hhcGVzKSkpCi0gICAgICAgICAgICBnb3RvIEVycm9yOwotICAgIH0KLQotICAgIGNtc0ZyZWVUb25lQ3VydmVUcmlwbGUoSW52U2hhcGVzKTsKLSAgICByZXR1cm4gTHV0OwotRXJyb3I6Ci0gICAgY21zRnJlZVRvbmVDdXJ2ZVRyaXBsZShJbnZTaGFwZXMpOwotICAgIGNtc1BpcGVsaW5lRnJlZShMdXQpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0KLS8vIENoYW5nZSBDTFVUIGludGVycG9sYXRpb24gdG8gdHJpbGluZWFyCi1zdGF0aWMKLXZvaWQgQ2hhbmdlSW50ZXJwb2xhdGlvblRvVHJpbGluZWFyKGNtc1BpcGVsaW5lKiBMdXQpCi17Ci0gICAgY21zU3RhZ2UqIFN0YWdlOwotCi0gICAgZm9yIChTdGFnZSA9IGNtc1BpcGVsaW5lR2V0UHRyVG9GaXJzdFN0YWdlKEx1dCk7Ci0gICAgICAgIFN0YWdlICE9IE5VTEw7Ci0gICAgICAgIFN0YWdlID0gY21zU3RhZ2VOZXh0KFN0YWdlKSkgewotCi0gICAgICAgICAgICBpZiAoY21zU3RhZ2VUeXBlKFN0YWdlKSA9PSBjbXNTaWdDTHV0RWxlbVR5cGUpIHsKLQotICAgICAgICAgICAgICAgIF9jbXNTdGFnZUNMdXREYXRhKiBDTFVUID0gKF9jbXNTdGFnZUNMdXREYXRhKikgU3RhZ2UgLT5EYXRhOwotCi0gICAgICAgICAgICAgICAgQ0xVVCAtPlBhcmFtcy0+ZHdGbGFncyB8PSBDTVNfTEVSUF9GTEFHU19UUklMSU5FQVI7Ci0gICAgICAgICAgICAgICAgX2Ntc1NldEludGVycG9sYXRpb25Sb3V0aW5lKEx1dC0+Q29udGV4dElELCBDTFVUIC0+UGFyYW1zKTsKLSAgICAgICAgICAgIH0KLSAgICB9Ci19Ci0KLQotLy8gUmVhZCB0aGUgRFRvQVggdGFnLCBhZGp1c3RpbmcgdGhlIGVuY29kaW5nIG9mIExhYiBvciBYWVogaWYgbmVkZWQKLXN0YXRpYwotY21zUGlwZWxpbmUqIF9jbXNSZWFkRmxvYXRPdXRwdXRUYWcoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1RhZ1NpZ25hdHVyZSB0YWdGbG9hdCkKLXsKLSAgICBjbXNDb250ZXh0IENvbnRleHRJRCAgICAgICA9IGNtc0dldFByb2ZpbGVDb250ZXh0SUQoaFByb2ZpbGUpOwotICAgIGNtc1BpcGVsaW5lKiBMdXQgICAgICAgICAgID0gY21zUGlwZWxpbmVEdXAoKGNtc1BpcGVsaW5lKikgY21zUmVhZFRhZyhoUHJvZmlsZSwgdGFnRmxvYXQpKTsKLSAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIFBDUyA9IGNtc0dldFBDUyhoUHJvZmlsZSk7Ci0gICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBkYXRhU3BhY2UgPSBjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKTsKLSAgICAKLSAgICBpZiAoTHV0ID09IE5VTEwpIHJldHVybiBOVUxMOwotICAgIAotICAgIC8vIElmIFBDUyBpcyBMYWIgb3IgWFlaLCB0aGUgZmxvYXRpbmcgcG9pbnQgdGFnIGlzIGFjY2VwdGluZyBkYXRhIGluIHRoZSBzcGFjZSBlbmNvZGluZywKLSAgICAvLyBhbmQgc2luY2UgdGhlIGZvcm1hdHRlciBoYXMgYWxyZWFkeSBhY2NvbW9kYXRlZCB0byAwLi4xLjAsIHdlIHNob3VsZCB1bmRvIHRoaXMgY2hhbmdlCi0gICAgaWYgKCBQQ1MgPT0gY21zU2lnTGFiRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0JFR0lOLCBfY21zU3RhZ2VOb3JtYWxpemVUb0xhYkZsb2F0KENvbnRleHRJRCkpKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBpZiAoUENTID09IGNtc1NpZ1hZWkRhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0JFR0lOLCBfY21zU3RhZ2VOb3JtYWxpemVUb1h5ekZsb2F0KENvbnRleHRJRCkpKQotICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICAgIH0KLSAgICAKLSAgICAvLyB0aGUgb3V0cHV0IGNhbiBiZSBMYWIgb3IgWFlaLCBpbiB3aGljaCBjYXNlIG5vcm1hbGlzYXRpb24gaXMgbmVlZGVkIG9uIHRoZSBlbmQgb2YgdGhlIHBpcGVsaW5lCi0gICAgaWYgKCBkYXRhU3BhY2UgPT0gY21zU2lnTGFiRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgX2Ntc1N0YWdlTm9ybWFsaXplRnJvbUxhYkZsb2F0KENvbnRleHRJRCkpKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZGF0YVNwYWNlID09IGNtc1NpZ1hZWkRhdGEpCi0gICAgewotICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9FTkQsIF9jbXNTdGFnZU5vcm1hbGl6ZUZyb21YeXpGbG9hdChDb250ZXh0SUQpKSkKLSAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBMdXQ7Ci0KLUVycm9yOgotICAgIGNtc1BpcGVsaW5lRnJlZShMdXQpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vLyBDcmVhdGUgYW4gb3V0cHV0IE1QRSBMVVQgZnJvbSBhZ2l2ZW4gcHJvZmlsZS4gVmVyc2lvbiBtaXNtYXRjaGVzIGFyZSBoYW5kbGVkIGhlcmUKLWNtc1BpcGVsaW5lKiBfY21zUmVhZE91dHB1dExVVChjbXNIUFJPRklMRSBoUHJvZmlsZSwgaW50IEludGVudCkKLXsKLSAgICBjbXNUYWdUeXBlU2lnbmF0dXJlIE9yaWdpbmFsVHlwZTsKLSAgICBjbXNUYWdTaWduYXR1cmUgdGFnMTYgICAgPSBQQ1MyRGV2aWNlMTZbSW50ZW50XTsKLSAgICBjbXNUYWdTaWduYXR1cmUgdGFnRmxvYXQgPSBQQ1MyRGV2aWNlRmxvYXRbSW50ZW50XTsKLSAgICBjbXNDb250ZXh0IENvbnRleHRJRCAgICAgPSBjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKTsKLQotCi0gICAgaWYgKEludGVudCAhPSAtMSkgewotCi0gICAgICAgIGlmIChjbXNJc1RhZyhoUHJvZmlsZSwgdGFnRmxvYXQpKSB7ICAvLyBGbG9hdCB0YWcgdGFrZXMgcHJlY2VkZW5jZQotCi0gICAgICAgICAgICAvLyBGbG9hdGluZyBwb2ludCBMVVQgYXJlIGFsd2F5cyBWNAotICAgICAgICAgICAgcmV0dXJuIF9jbXNSZWFkRmxvYXRPdXRwdXRUYWcoaFByb2ZpbGUsIHRhZ0Zsb2F0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJldmVydCB0byBwZXJjZXB0dWFsIGlmIG5vIHRhZyBpcyBmb3VuZAotICAgICAgICBpZiAoIWNtc0lzVGFnKGhQcm9maWxlLCB0YWcxNikpIHsKLSAgICAgICAgICAgIHRhZzE2ID0gUENTMkRldmljZTE2WzBdOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNtc0lzVGFnKGhQcm9maWxlLCB0YWcxNikpIHsgLy8gSXMgdGhlcmUgYW55IExVVC1CYXNlZCB0YWJsZT8KLQotICAgICAgICAgICAgLy8gQ2hlY2sgcHJvZmlsZSB2ZXJzaW9uIGFuZCBMVVQgdHlwZS4gRG8gdGhlIG5lY2Vzc2FyeSBhZGp1c3RtZW50cyBpZiBuZWVkZWQKLQotICAgICAgICAgICAgLy8gRmlyc3QgcmVhZCB0aGUgdGFnCi0gICAgICAgICAgICBjbXNQaXBlbGluZSogTHV0ID0gKGNtc1BpcGVsaW5lKikgY21zUmVhZFRhZyhoUHJvZmlsZSwgdGFnMTYpOwotICAgICAgICAgICAgaWYgKEx1dCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgICAgICAgICAgLy8gQWZ0ZXIgcmVhZGluZyBpdCwgd2UgaGF2ZSBpbmZvIGFib3V0IHRoZSBvcmlnaW5hbCB0eXBlCi0gICAgICAgICAgICBPcmlnaW5hbFR5cGUgPSAgX2Ntc0dldFRhZ1RydWVUeXBlKGhQcm9maWxlLCB0YWcxNik7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBwcm9maWxlIG93bnMgdGhlIEx1dCwgc28gd2UgbmVlZCB0byBjb3B5IGl0Ci0gICAgICAgICAgICBMdXQgPSBjbXNQaXBlbGluZUR1cChMdXQpOwotICAgICAgICAgICAgaWYgKEx1dCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgICAgICAgICAgLy8gTm93IGl0IGlzIHRpbWUgZm9yIGEgY29udHJvdmVyc2lhbCBzdHVmZi4gSSBmb3VuZCB0aGF0IGZvciAzRCBMVVRTIHVzaW5nCi0gICAgICAgICAgICAvLyBMYWIgdXNlZCBhcyBpbmRleGVyIHNwYWNlLCAgdHJpbGluZWFyIGludGVycG9sYXRpb24gc2hvdWxkIGJlIHVzZWQKLSAgICAgICAgICAgIGlmIChjbXNHZXRQQ1MoaFByb2ZpbGUpID09IGNtc1NpZ0xhYkRhdGEpCi0gICAgICAgICAgICAgICAgQ2hhbmdlSW50ZXJwb2xhdGlvblRvVHJpbGluZWFyKEx1dCk7Ci0KLSAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0IGRhdGEgb25seSBmb3IgTGFiIGFuZCBMdXQxNiB0eXBlCi0gICAgICAgICAgICBpZiAoT3JpZ2luYWxUeXBlICE9IGNtc1NpZ0x1dDE2VHlwZSB8fCBjbXNHZXRQQ1MoaFByb2ZpbGUpICE9IGNtc1NpZ0xhYkRhdGEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEx1dDsKLQotICAgICAgICAgICAgLy8gQWRkIGEgbWF0cml4IGZvciBjb252ZXJzaW9uIFY0IHRvIFYyIExhYiBQQ1MKLSAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0JFR0lOLCBfY21zU3RhZ2VBbGxvY0xhYlY0VG9WMihDb250ZXh0SUQpKSkKLSAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotCi0gICAgICAgICAgICAvLyBJZiB0aGUgb3V0cHV0IGlzIExhYiwgYWRkIGFsc28gYSBjb252ZXJzaW9uIGF0IHRoZSBlbmQKLSAgICAgICAgICAgIGlmIChjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKSA9PSBjbXNTaWdMYWJEYXRhKQotICAgICAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgX2Ntc1N0YWdlQWxsb2NMYWJWMlRvVjQoQ29udGV4dElEKSkpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAgICAgIHJldHVybiBMdXQ7Ci1FcnJvcjoKLSAgICAgICAgICAgIGNtc1BpcGVsaW5lRnJlZShMdXQpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBMdXQgbm90IGZvdW5kLCB0cnkgdG8gY3JlYXRlIGEgbWF0cml4LXNoYXBlcgotCi0gICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGdyYXlzY2FsZSBwcm9maWxlLgotICAgIGlmIChjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKSA9PSBjbXNTaWdHcmF5RGF0YSkgewotCi0gICAgICAgIC8vIGlmIHNvLCBidWlsZCBhcHByb3BpYXRlIGNvbnZlcnNpb24gdGFibGVzLgotICAgICAgICAvLyBUaGUgdGFibGVzIGFyZSB0aGUgUENTIGlsdW1pbmFudCwgc2NhbGVkIGFjcm9zcyBHcmF5VFJDCi0gICAgICAgIHJldHVybiBCdWlsZEdyYXlPdXRwdXRQaXBlbGluZShoUHJvZmlsZSk7Ci0gICAgfQotCi0gICAgLy8gTm90IGdyYXksIGNyZWF0ZSBhIG5vcm1hbCBtYXRyaXgtc2hhcGVyLCB3aGljaCBvbmx5IG9wZXJhdGVzIGluIFhZWiBzcGFjZSAgCi0gICAgcmV0dXJuIEJ1aWxkUkdCT3V0cHV0TWF0cml4U2hhcGVyKGhQcm9maWxlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFJlYWQgdGhlIEFUb0QwIHRhZywgYWRqdXN0aW5nIHRoZSBlbmNvZGluZyBvZiBMYWIgb3IgWFlaIGlmIG5lZGVkCi1zdGF0aWMKLWNtc1BpcGVsaW5lKiBfY21zUmVhZEZsb2F0RGV2aWNlbGlua1RhZyhjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVGFnU2lnbmF0dXJlIHRhZ0Zsb2F0KQotewotICAgIGNtc0NvbnRleHQgQ29udGV4dElEICAgICAgID0gY21zR2V0UHJvZmlsZUNvbnRleHRJRChoUHJvZmlsZSk7Ci0gICAgY21zUGlwZWxpbmUqIEx1dCAgICAgICAgICAgPSBjbXNQaXBlbGluZUR1cCgoY21zUGlwZWxpbmUqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCB0YWdGbG9hdCkpOwotICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgUENTID0gY21zR2V0UENTKGhQcm9maWxlKTsKLSAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIHNwYyA9IGNtc0dldENvbG9yU3BhY2UoaFByb2ZpbGUpOwotCi0gICAgaWYgKEx1dCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIGlmIChzcGMgPT0gY21zU2lnTGFiRGF0YSkKLSAgICB7Ci0gICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0JFR0lOLCBfY21zU3RhZ2VOb3JtYWxpemVUb0xhYkZsb2F0KENvbnRleHRJRCkpKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBpZiAoc3BjID09IGNtc1NpZ1hZWkRhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0JFR0lOLCBfY21zU3RhZ2VOb3JtYWxpemVUb1h5ekZsb2F0KENvbnRleHRJRCkpKQotICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoUENTID09IGNtc1NpZ0xhYkRhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgX2Ntc1N0YWdlTm9ybWFsaXplRnJvbUxhYkZsb2F0KENvbnRleHRJRCkpKQotICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaWYgKFBDUyA9PSBjbXNTaWdYWVpEYXRhKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgX2Ntc1N0YWdlTm9ybWFsaXplRnJvbVh5ekZsb2F0KENvbnRleHRJRCkpKQotICAgICAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotCi0gICAgcmV0dXJuIEx1dDsKLUVycm9yOgotICAgIGNtc1BpcGVsaW5lRnJlZShMdXQpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vLyBUaGlzIG9uZSBpbmNsdWRlcyBhYnN0cmFjdCBwcm9maWxlcyBhcyB3ZWxsLiBNYXRyaXgtc2hhcGVyIGNhbm5vdCBiZSBvYnRhaW5lZCBvbiB0aGF0IGRldmljZSBjbGFzcy4gVGhlCi0vLyB0YWcgbmFtZSBoZXJlIG1heSBkZWZhdWx0IHRvIEFUb0IwCi1jbXNQaXBlbGluZSogX2Ntc1JlYWREZXZpY2VsaW5rTFVUKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBpbnQgSW50ZW50KQotewotICAgIGNtc1BpcGVsaW5lKiBMdXQ7Ci0gICAgY21zVGFnVHlwZVNpZ25hdHVyZSBPcmlnaW5hbFR5cGU7Ci0gICAgY21zVGFnU2lnbmF0dXJlIHRhZzE2ICAgID0gRGV2aWNlMlBDUzE2W0ludGVudF07Ci0gICAgY21zVGFnU2lnbmF0dXJlIHRhZ0Zsb2F0ID0gRGV2aWNlMlBDU0Zsb2F0W0ludGVudF07Ci0gICAgY21zQ29udGV4dCBDb250ZXh0SUQgPSBjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKTsKLQotCi0gICAgLy8gT24gbmFtZWQgY29sb3IsIHRha2UgdGhlIGFwcHJvcGlhdGUgdGFnCi0gICAgaWYgKGNtc0dldERldmljZUNsYXNzKGhQcm9maWxlKSA9PSBjbXNTaWdOYW1lZENvbG9yQ2xhc3MpIHsKLQotICAgICAgICBjbXNOQU1FRENPTE9STElTVCogbmMgPSAoY21zTkFNRURDT0xPUkxJU1QqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCBjbXNTaWdOYW1lZENvbG9yMlRhZyk7Ci0KLSAgICAgICAgaWYgKG5jID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgICAgIEx1dCA9IGNtc1BpcGVsaW5lQWxsb2MoQ29udGV4dElELCAwLCAwKTsKLSAgICAgICAgaWYgKEx1dCA9PSBOVUxMKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLQotICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9CRUdJTiwgX2Ntc1N0YWdlQWxsb2NOYW1lZENvbG9yKG5jLCBGQUxTRSkpKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLQotICAgICAgICBpZiAoY21zR2V0Q29sb3JTcGFjZShoUHJvZmlsZSkgPT0gY21zU2lnTGFiRGF0YSkKLSAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0VORCwgX2Ntc1N0YWdlQWxsb2NMYWJWMlRvVjQoQ29udGV4dElEKSkpCi0gICAgICAgICAgICAgICAgZ290byBFcnJvcjsKLQotICAgICAgICByZXR1cm4gTHV0OwotRXJyb3I6Ci0gICAgICAgIGNtc1BpcGVsaW5lRnJlZShMdXQpOwotICAgICAgICBjbXNGcmVlTmFtZWRDb2xvckxpc3QobmMpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoY21zSXNUYWcoaFByb2ZpbGUsIHRhZ0Zsb2F0KSkgeyAgLy8gRmxvYXQgdGFnIHRha2VzIHByZWNlZGVuY2UKLQotICAgICAgICAvLyBGbG9hdGluZyBwb2ludCBMVVQgYXJlIGFsd2F5cyBWCi0gICAgICAgIHJldHVybiBfY21zUmVhZEZsb2F0RGV2aWNlbGlua1RhZyhoUHJvZmlsZSwgdGFnRmxvYXQpOwotICAgIH0KLQotICAgIHRhZ0Zsb2F0ID0gRGV2aWNlMlBDU0Zsb2F0WzBdOwotICAgIGlmIChjbXNJc1RhZyhoUHJvZmlsZSwgdGFnRmxvYXQpKSB7Ci0KLSAgICAgICAgcmV0dXJuIGNtc1BpcGVsaW5lRHVwKChjbXNQaXBlbGluZSopIGNtc1JlYWRUYWcoaFByb2ZpbGUsIHRhZ0Zsb2F0KSk7Ci0gICAgfQotCi0gICAgaWYgKCFjbXNJc1RhZyhoUHJvZmlsZSwgdGFnMTYpKSB7ICAvLyBJcyB0aGVyZSBhbnkgTFVULUJhc2VkIHRhYmxlPwotCi0gICAgICAgIHRhZzE2ICAgID0gRGV2aWNlMlBDUzE2WzBdOwotICAgICAgICBpZiAoIWNtc0lzVGFnKGhQcm9maWxlLCB0YWcxNikpIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8vIENoZWNrIHByb2ZpbGUgdmVyc2lvbiBhbmQgTFVUIHR5cGUuIERvIHRoZSBuZWNlc3NhcnkgYWRqdXN0bWVudHMgaWYgbmVlZGVkCi0KLSAgICAvLyBSZWFkIHRoZSB0YWcKLSAgICBMdXQgPSAoY21zUGlwZWxpbmUqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCB0YWcxNik7Ci0gICAgaWYgKEx1dCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIC8vIFRoZSBwcm9maWxlIG93bnMgdGhlIEx1dCwgc28gd2UgbmVlZCB0byBjb3B5IGl0Ci0gICAgTHV0ID0gY21zUGlwZWxpbmVEdXAoTHV0KTsKLSAgICBpZiAoTHV0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgLy8gTm93IGl0IGlzIHRpbWUgZm9yIGEgY29udHJvdmVyc2lhbCBzdHVmZi4gSSBmb3VuZCB0aGF0IGZvciAzRCBMVVRTIHVzaW5nCi0gICAgLy8gTGFiIHVzZWQgYXMgaW5kZXhlciBzcGFjZSwgIHRyaWxpbmVhciBpbnRlcnBvbGF0aW9uIHNob3VsZCBiZSB1c2VkCi0gICAgaWYgKGNtc0dldFBDUyhoUHJvZmlsZSkgPT0gY21zU2lnTGFiRGF0YSkKLSAgICAgICAgQ2hhbmdlSW50ZXJwb2xhdGlvblRvVHJpbGluZWFyKEx1dCk7Ci0KLSAgICAvLyBBZnRlciByZWFkaW5nIGl0LCB3ZSBoYXZlIGluZm8gYWJvdXQgdGhlIG9yaWdpbmFsIHR5cGUKLSAgICBPcmlnaW5hbFR5cGUgPSAgX2Ntc0dldFRhZ1RydWVUeXBlKGhQcm9maWxlLCB0YWcxNik7Ci0KLSAgICAvLyBXZSBuZWVkIHRvIGFkanVzdCBkYXRhIGZvciBMYWIxNiBvbiBvdXRwdXQKLSAgICBpZiAoT3JpZ2luYWxUeXBlICE9IGNtc1NpZ0x1dDE2VHlwZSkgcmV0dXJuIEx1dDsKLQotICAgIC8vIEhlcmUgaXQgaXMgcG9zc2libGUgdG8gZ2V0IExhYiBvbiBib3RoIHNpZGVzCi0KLSAgICBpZiAoY21zR2V0Q29sb3JTcGFjZShoUHJvZmlsZSkgPT0gY21zU2lnTGFiRGF0YSkgewotICAgICAgICBpZighY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMdXQsIGNtc0FUX0JFR0lOLCBfY21zU3RhZ2VBbGxvY0xhYlY0VG9WMihDb250ZXh0SUQpKSkKLSAgICAgICAgICAgIGdvdG8gRXJyb3IyOwotICAgIH0KLQotICAgIGlmIChjbXNHZXRQQ1MoaFByb2ZpbGUpID09IGNtc1NpZ0xhYkRhdGEpIHsKLSAgICAgICAgaWYoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTHV0LCBjbXNBVF9FTkQsIF9jbXNTdGFnZUFsbG9jTGFiVjJUb1Y0KENvbnRleHRJRCkpKQotICAgICAgICAgICAgZ290byBFcnJvcjI7Ci0gICAgfQotCi0gICAgcmV0dXJuIEx1dDsKLQotRXJyb3IyOgotICAgIGNtc1BpcGVsaW5lRnJlZShMdXQpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gUmV0dXJucyBUUlVFIGlmIHRoZSBwcm9maWxlIGlzIGltcGxlbWVudGVkIGFzIG1hdHJpeC1zaGFwZXIKLWNtc0Jvb2wgIENNU0VYUE9SVCBjbXNJc01hdHJpeFNoYXBlcihjbXNIUFJPRklMRSBoUHJvZmlsZSkKLXsKLSAgICBzd2l0Y2ggKGNtc0dldENvbG9yU3BhY2UoaFByb2ZpbGUpKSB7Ci0KLSAgICBjYXNlIGNtc1NpZ0dyYXlEYXRhOgotCi0gICAgICAgIHJldHVybiBjbXNJc1RhZyhoUHJvZmlsZSwgY21zU2lnR3JheVRSQ1RhZyk7Ci0KLSAgICBjYXNlIGNtc1NpZ1JnYkRhdGE6Ci0KLSAgICAgICAgcmV0dXJuIChjbXNJc1RhZyhoUHJvZmlsZSwgY21zU2lnUmVkQ29sb3JhbnRUYWcpICYmCi0gICAgICAgICAgICAgICAgY21zSXNUYWcoaFByb2ZpbGUsIGNtc1NpZ0dyZWVuQ29sb3JhbnRUYWcpICYmCi0gICAgICAgICAgICAgICAgY21zSXNUYWcoaFByb2ZpbGUsIGNtc1NpZ0JsdWVDb2xvcmFudFRhZykgJiYKLSAgICAgICAgICAgICAgICBjbXNJc1RhZyhoUHJvZmlsZSwgY21zU2lnUmVkVFJDVGFnKSAmJgotICAgICAgICAgICAgICAgIGNtc0lzVGFnKGhQcm9maWxlLCBjbXNTaWdHcmVlblRSQ1RhZykgJiYKLSAgICAgICAgICAgICAgICBjbXNJc1RhZyhoUHJvZmlsZSwgY21zU2lnQmx1ZVRSQ1RhZykpOwotCi0gICAgZGVmYXVsdDoKLQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotfQotCi0vLyBSZXR1cm5zIFRSVUUgaWYgdGhlIGludGVudCBpcyBpbXBsZW1lbnRlZCBhcyBDTFVUCi1jbXNCb29sICBDTVNFWFBPUlQgY21zSXNDTFVUKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50MzJOdW1iZXIgSW50ZW50LCBjbXNVSW50MzJOdW1iZXIgVXNlZERpcmVjdGlvbikKLXsKLSAgICBjb25zdCBjbXNUYWdTaWduYXR1cmUqIFRhZ1RhYmxlOwotCi0gICAgLy8gRm9yIGRldmljZWxpbmtzLCB0aGUgc3VwcG9ydGVkIGludGVudCBpcyB0aGF0IG9uZSBzdGF0ZWQgaW4gdGhlIGhlYWRlcgotICAgIGlmIChjbXNHZXREZXZpY2VDbGFzcyhoUHJvZmlsZSkgPT0gY21zU2lnTGlua0NsYXNzKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGNtc0dldEhlYWRlclJlbmRlcmluZ0ludGVudChoUHJvZmlsZSkgPT0gSW50ZW50KTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKFVzZWREaXJlY3Rpb24pIHsKLQotICAgICAgIGNhc2UgTENNU19VU0VEX0FTX0lOUFVUOiBUYWdUYWJsZSA9IERldmljZTJQQ1MxNjsgYnJlYWs7Ci0gICAgICAgY2FzZSBMQ01TX1VTRURfQVNfT1VUUFVUOlRhZ1RhYmxlID0gUENTMkRldmljZTE2OyBicmVhazsKLQotICAgICAgIC8vIEZvciBwcm9vZmluZywgd2UgbmVlZCByZWwuIGNvbG9yaW1ldHJpYyBpbiBvdXRwdXQuIExldCdzIGRvIHNvbWUgcmVjdXJzaW9uCi0gICAgICAgY2FzZSBMQ01TX1VTRURfQVNfUFJPT0Y6Ci0gICAgICAgICAgIHJldHVybiBjbXNJc0ludGVudFN1cHBvcnRlZChoUHJvZmlsZSwgSW50ZW50LCBMQ01TX1VTRURfQVNfSU5QVVQpICYmCi0gICAgICAgICAgICAgICAgICBjbXNJc0ludGVudFN1cHBvcnRlZChoUHJvZmlsZSwgSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQywgTENNU19VU0VEX0FTX09VVFBVVCk7Ci0KLSAgICAgICBkZWZhdWx0OgotICAgICAgICAgICBjbXNTaWduYWxFcnJvcihjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKSwgY21zRVJST1JfUkFOR0UsICJVbmV4cGVjdGVkIGRpcmVjdGlvbiAoJWQpIiwgVXNlZERpcmVjdGlvbik7Ci0gICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gY21zSXNUYWcoaFByb2ZpbGUsIFRhZ1RhYmxlW0ludGVudF0pOwotCi19Ci0KLQotLy8gUmV0dXJuIGluZm8gYWJvdXQgc3VwcG9ydGVkIGludGVudHMKLWNtc0Jvb2wgIENNU0VYUE9SVCBjbXNJc0ludGVudFN1cHBvcnRlZChjbXNIUFJPRklMRSBoUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW50ZW50LCBjbXNVSW50MzJOdW1iZXIgVXNlZERpcmVjdGlvbikKLXsKLQotICAgIGlmIChjbXNJc0NMVVQoaFByb2ZpbGUsIEludGVudCwgVXNlZERpcmVjdGlvbikpIHJldHVybiBUUlVFOwotCi0gICAgLy8gSXMgdGhlcmUgYW55IG1hdHJpeC1zaGFwZXI/IElmIHNvLCB0aGUgaW50ZW50IGlzIHN1cHBvcnRlZC4gVGhpcyBpcyBhIGJpdCBvZGQsIHNpbmNlIFYyIG1hdHJpeCBzaGFwZXIKLSAgICAvLyBkb2VzIG5vdCBmdWxseSBzdXBwb3J0IHJlbGF0aXZlIGNvbG9yaW1ldHJpYyBiZWNhdXNlIHRoZXkgY2Fubm90IGRlYWwgd2l0aCBub24temVybyBibGFjayBwb2ludHMsIGJ1dAotICAgIC8vIG1hbnkgcHJvZmlsZXMgY2xhaW1zIHRoYXQsIGFuZCB0aGlzIGlzIGNlcnRhaW5seSBub3QgdHJ1ZSBmb3IgVjQgcHJvZmlsZXMuIExldHMgYW5zd2VyICJ5ZXMiIG5vIG1hdHRlcgotICAgIC8vIHRoZSBhY2N1cmFjeSB3b3VsZCBiZSBsZXNzIHRoYW4gb3B0aW1hbCBpbiByZWwuY29sIGFuZCB2MiBjYXNlLgotCi0gICAgcmV0dXJuIGNtc0lzTWF0cml4U2hhcGVyKGhQcm9maWxlKTsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gUmVhZCBib3RoLCBwcm9maWxlIHNlcXVlbmNlIGRlc2NyaXB0aW9uIGFuZCBwcm9maWxlIHNlcXVlbmNlIGlkIGlmIHByZXNlbnQuIFRoZW4gY29tYmluZSBib3RoIHRvCi0vLyBjcmVhdGUgcWEgdW5pcXVlIHN0cnVjdHVyZSBob2xkaW5nIGJvdGguIFNoYW1lIG9uIElDQyB0byBzdG9yZSB0aGluZ3MgaW4gc3VjaCBjb21wbGljYXRlZCB3YXkuCi1jbXNTRVEqIF9jbXNSZWFkUHJvZmlsZVNlcXVlbmNlKGNtc0hQUk9GSUxFIGhQcm9maWxlKQotewotICAgIGNtc1NFUSogUHJvZmlsZVNlcTsKLSAgICBjbXNTRVEqIFByb2ZpbGVJZDsKLSAgICBjbXNTRVEqIE5ld1NlcTsKLSAgICBjbXNVSW50MzJOdW1iZXIgaTsKLQotICAgIC8vIFRha2UgcHJvZmlsZSBzZXF1ZW5jZSBkZXNjcmlwdGlvbiBmaXJzdAotICAgIFByb2ZpbGVTZXEgPSAoY21zU0VRKikgY21zUmVhZFRhZyhoUHJvZmlsZSwgY21zU2lnUHJvZmlsZVNlcXVlbmNlRGVzY1RhZyk7Ci0KLSAgICAvLyBUYWtlIHByb2ZpbGUgc2VxdWVuY2UgSUQKLSAgICBQcm9maWxlSWQgID0gKGNtc1NFUSopIGNtc1JlYWRUYWcoaFByb2ZpbGUsIGNtc1NpZ1Byb2ZpbGVTZXF1ZW5jZUlkVGFnKTsKLQotICAgIGlmIChQcm9maWxlU2VxID09IE5VTEwgJiYgUHJvZmlsZUlkID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgaWYgKFByb2ZpbGVTZXEgPT0gTlVMTCkgcmV0dXJuIGNtc0R1cFByb2ZpbGVTZXF1ZW5jZURlc2NyaXB0aW9uKFByb2ZpbGVJZCk7Ci0gICAgaWYgKFByb2ZpbGVJZCAgPT0gTlVMTCkgcmV0dXJuIGNtc0R1cFByb2ZpbGVTZXF1ZW5jZURlc2NyaXB0aW9uKFByb2ZpbGVTZXEpOwotCi0gICAgLy8gV2UgaGF2ZSB0byBtaXggYm90aCB0b2dldGhlci4gRm9yIHRoYXQgdGhleSBtdXN0IGFncmVlCi0gICAgaWYgKFByb2ZpbGVTZXEgLT5uICE9IFByb2ZpbGVJZCAtPm4pIHJldHVybiBjbXNEdXBQcm9maWxlU2VxdWVuY2VEZXNjcmlwdGlvbihQcm9maWxlU2VxKTsKLQotICAgIE5ld1NlcSA9IGNtc0R1cFByb2ZpbGVTZXF1ZW5jZURlc2NyaXB0aW9uKFByb2ZpbGVTZXEpOwotCi0gICAgLy8gT2ssIHByb2NlZWQgdG8gdGhlIG1peGluZwotICAgIGlmIChOZXdTZXEgIT0gTlVMTCkgewotICAgICAgICBmb3IgKGk9MDsgaSA8IFByb2ZpbGVTZXEgLT5uOyBpKyspIHsKLQotICAgICAgICAgICAgbWVtbW92ZSgmTmV3U2VxIC0+c2VxW2ldLlByb2ZpbGVJRCwgJlByb2ZpbGVJZCAtPnNlcVtpXS5Qcm9maWxlSUQsIHNpemVvZihjbXNQcm9maWxlSUQpKTsKLSAgICAgICAgICAgIE5ld1NlcSAtPnNlcVtpXS5EZXNjcmlwdGlvbiA9IGNtc01MVWR1cChQcm9maWxlSWQgLT5zZXFbaV0uRGVzY3JpcHRpb24pOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOZXdTZXE7Ci19Ci0KLS8vIER1bXAgdGhlIGNvbnRlbnRzIG9mIHByb2ZpbGUgc2VxdWVuY2UgaW4gYm90aCB0YWdzIChpZiB2NCBhdmFpbGFibGUpCi1jbXNCb29sIF9jbXNXcml0ZVByb2ZpbGVTZXF1ZW5jZShjbXNIUFJPRklMRSBoUHJvZmlsZSwgY29uc3QgY21zU0VRKiBzZXEpCi17Ci0gICAgaWYgKCFjbXNXcml0ZVRhZyhoUHJvZmlsZSwgY21zU2lnUHJvZmlsZVNlcXVlbmNlRGVzY1RhZywgc2VxKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKGNtc0dldFByb2ZpbGVWZXJzaW9uKGhQcm9maWxlKSA+PSA0LjApIHsKLQotICAgICAgICAgICAgaWYgKCFjbXNXcml0ZVRhZyhoUHJvZmlsZSwgY21zU2lnUHJvZmlsZVNlcXVlbmNlSWRUYWcsIHNlcSkpIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0vLyBBdXhpbGlhciwgcmVhZCBhbmQgZHVwbGljYXRlIGEgTUxVIGlmIGZvdW5kLgotc3RhdGljCi1jbXNNTFUqIEdldE1MVUZyb21Qcm9maWxlKGNtc0hQUk9GSUxFIGgsIGNtc1RhZ1NpZ25hdHVyZSBzaWcpCi17Ci0gICAgY21zTUxVKiBtbHUgPSAoY21zTUxVKikgY21zUmVhZFRhZyhoLCBzaWcpOwotICAgIGlmIChtbHUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICByZXR1cm4gY21zTUxVZHVwKG1sdSk7Ci19Ci0KLS8vIENyZWF0ZSBhIHNlcXVlbmNlIGRlc2NyaXB0aW9uIG91dCBvZiBhbiBhcnJheSBvZiBwcm9maWxlcwotY21zU0VRKiBfY21zQ29tcGlsZVByb2ZpbGVTZXF1ZW5jZShjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIG5Qcm9maWxlcywgY21zSFBST0ZJTEUgaFByb2ZpbGVzW10pCi17Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0gICAgY21zU0VRKiBzZXEgPSBjbXNBbGxvY1Byb2ZpbGVTZXF1ZW5jZURlc2NyaXB0aW9uKENvbnRleHRJRCwgblByb2ZpbGVzKTsKLQotICAgIGlmIChzZXEgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG5Qcm9maWxlczsgaSsrKSB7Ci0KLSAgICAgICAgY21zUFNFUURFU0MqIHBzID0gJnNlcSAtPnNlcVtpXTsKLSAgICAgICAgY21zSFBST0ZJTEUgaCA9IGhQcm9maWxlc1tpXTsKLSAgICAgICAgY21zVGVjaG5vbG9neVNpZ25hdHVyZSogdGVjaHB0OwotCi0gICAgICAgIGNtc0dldEhlYWRlckF0dHJpYnV0ZXMoaCwgJnBzIC0+YXR0cmlidXRlcyk7Ci0gICAgICAgIGNtc0dldEhlYWRlclByb2ZpbGVJRChoLCBwcyAtPlByb2ZpbGVJRC5JRDgpOwotICAgICAgICBwcyAtPmRldmljZU1mZyAgID0gY21zR2V0SGVhZGVyTWFudWZhY3R1cmVyKGgpOwotICAgICAgICBwcyAtPmRldmljZU1vZGVsID0gY21zR2V0SGVhZGVyTW9kZWwoaCk7Ci0KLSAgICAgICAgdGVjaHB0ID0gKGNtc1RlY2hub2xvZ3lTaWduYXR1cmUqKSBjbXNSZWFkVGFnKGgsIGNtc1NpZ1RlY2hub2xvZ3lUYWcpOwotICAgICAgICBpZiAodGVjaHB0ID09IE5VTEwpCi0gICAgICAgICAgICBwcyAtPnRlY2hub2xvZ3kgICA9ICAoY21zVGVjaG5vbG9neVNpZ25hdHVyZSkgMDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcHMgLT50ZWNobm9sb2d5ICAgPSAqdGVjaHB0OwotCi0gICAgICAgIHBzIC0+TWFudWZhY3R1cmVyID0gR2V0TUxVRnJvbVByb2ZpbGUoaCwgIGNtc1NpZ0RldmljZU1mZ0Rlc2NUYWcpOwotICAgICAgICBwcyAtPk1vZGVsICAgICAgICA9IEdldE1MVUZyb21Qcm9maWxlKGgsICBjbXNTaWdEZXZpY2VNb2RlbERlc2NUYWcpOwotICAgICAgICBwcyAtPkRlc2NyaXB0aW9uICA9IEdldE1MVUZyb21Qcm9maWxlKGgsIGNtc1NpZ1Byb2ZpbGVEZXNjcmlwdGlvblRhZyk7Ci0KLSAgICB9Ci0KLSAgICByZXR1cm4gc2VxOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotc3RhdGljCi1jb25zdCBjbXNNTFUqIEdldEluZm8oY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc0luZm9UeXBlIEluZm8pCi17Ci0gICAgY21zVGFnU2lnbmF0dXJlIHNpZzsKLQotICAgIHN3aXRjaCAoSW5mbykgewotCi0gICAgY2FzZSBjbXNJbmZvRGVzY3JpcHRpb246Ci0gICAgICAgIHNpZyA9IGNtc1NpZ1Byb2ZpbGVEZXNjcmlwdGlvblRhZzsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIGNtc0luZm9NYW51ZmFjdHVyZXI6Ci0gICAgICAgIHNpZyA9IGNtc1NpZ0RldmljZU1mZ0Rlc2NUYWc7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBjbXNJbmZvTW9kZWw6Ci0gICAgICAgIHNpZyA9IGNtc1NpZ0RldmljZU1vZGVsRGVzY1RhZzsKLSAgICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBjbXNJbmZvQ29weXJpZ2h0OgotICAgICAgICBzaWcgPSBjbXNTaWdDb3B5cmlnaHRUYWc7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDogcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0KLSAgICByZXR1cm4gKGNtc01MVSopIGNtc1JlYWRUYWcoaFByb2ZpbGUsIHNpZyk7Ci19Ci0KLQotCi1jbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0dldFByb2ZpbGVJbmZvKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNJbmZvVHlwZSBJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIExhbmd1YWdlQ29kZVszXSwgY29uc3QgY2hhciBDb3VudHJ5Q29kZVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCogQnVmZmVyLCBjbXNVSW50MzJOdW1iZXIgQnVmZmVyU2l6ZSkKLXsKLSAgICBjb25zdCBjbXNNTFUqIG1sdSA9IEdldEluZm8oaFByb2ZpbGUsIEluZm8pOwotICAgIGlmIChtbHUgPT0gTlVMTCkgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gY21zTUxVZ2V0V2lkZShtbHUsIExhbmd1YWdlQ29kZSwgQ291bnRyeUNvZGUsIEJ1ZmZlciwgQnVmZmVyU2l6ZSk7Ci19Ci0KLQotY21zVUludDMyTnVtYmVyICBDTVNFWFBPUlQgY21zR2V0UHJvZmlsZUluZm9BU0NJSShjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zSW5mb1R5cGUgSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIExhbmd1YWdlQ29kZVszXSwgY29uc3QgY2hhciBDb3VudHJ5Q29kZVszXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBCdWZmZXIsIGNtc1VJbnQzMk51bWJlciBCdWZmZXJTaXplKQotewotICAgIGNvbnN0IGNtc01MVSogbWx1ID0gR2V0SW5mbyhoUHJvZmlsZSwgSW5mbyk7Ci0gICAgaWYgKG1sdSA9PSBOVUxMKSByZXR1cm4gMDsKLQotICAgIHJldHVybiBjbXNNTFVnZXRBU0NJSShtbHUsIExhbmd1YWdlQ29kZSwgQ291bnRyeUNvZGUsIEJ1ZmZlciwgQnVmZmVyU2l6ZSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2x1dC5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNsdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlkNDMzNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc2x1dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTgyMCArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMiBNYXJ0aSBNYXJpYSBTYWd1ZXIKLS8vCi0vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLS8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLS8vIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLS8vIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotLy8gYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlCi0vLyBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotLy8KLS8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi0vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLS8vCi0vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLS8vIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTwotLy8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLS8vIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKLS8vIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLS8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgotLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0KLSNpbmNsdWRlICJsY21zMl9pbnRlcm5hbC5oIgotCi0KLS8vIEFsbG9jYXRlcyBhbiBlbXB0eSBtdWx0aSBwcm9maWxlIGVsZW1lbnQKLWNtc1N0YWdlKiBDTVNFWFBPUlQgX2Ntc1N0YWdlQWxsb2NQbGFjZWhvbGRlcihjbXNDb250ZXh0IENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zU3RhZ2VTaWduYXR1cmUgVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIElucHV0Q2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBPdXRwdXRDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Ntc1N0YWdlRXZhbEZuICAgICBFdmFsUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY21zU3RhZ2VEdXBFbGVtRm4gIER1cEVsZW1QdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jbXNTdGFnZUZyZWVFbGVtRm4gRnJlZVB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgICAgICAgICAgRGF0YSkKLXsKLSAgICBjbXNTdGFnZSogcGggPSAoY21zU3RhZ2UqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihjbXNTdGFnZSkpOwotCi0gICAgaWYgKHBoID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0KLSAgICBwaCAtPkNvbnRleHRJRCA9IENvbnRleHRJRDsKLQotICAgIHBoIC0+VHlwZSAgICAgICA9IFR5cGU7Ci0gICAgcGggLT5JbXBsZW1lbnRzID0gVHlwZTsgICAvLyBCeSBkZWZhdWx0LCBubyBjbHVlIG9uIHdoYXQgaXMgaW1wbGVtZW50aW5nCi0KLSAgICBwaCAtPklucHV0Q2hhbm5lbHMgID0gSW5wdXRDaGFubmVsczsKLSAgICBwaCAtPk91dHB1dENoYW5uZWxzID0gT3V0cHV0Q2hhbm5lbHM7Ci0gICAgcGggLT5FdmFsUHRyICAgICAgICA9IEV2YWxQdHI7Ci0gICAgcGggLT5EdXBFbGVtUHRyICAgICA9IER1cEVsZW1QdHI7Ci0gICAgcGggLT5GcmVlUHRyICAgICAgICA9IEZyZWVQdHI7Ci0gICAgcGggLT5EYXRhICAgICAgICAgICA9IERhdGE7Ci0KLSAgICByZXR1cm4gcGg7Ci19Ci0KLQotc3RhdGljCi12b2lkIEV2YWx1YXRlSWRlbnRpdHkoY29uc3QgY21zRmxvYXQzMk51bWJlciBJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgT3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zU3RhZ2UgKm1wZSkKLXsKLSAgICBtZW1tb3ZlKE91dCwgSW4sIG1wZSAtPklucHV0Q2hhbm5lbHMgKiBzaXplb2YoY21zRmxvYXQzMk51bWJlcikpOwotfQotCi0KLWNtc1N0YWdlKiBDTVNFWFBPUlQgY21zU3RhZ2VBbGxvY0lkZW50aXR5KGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgbkNoYW5uZWxzKQotewotICAgIHJldHVybiBfY21zU3RhZ2VBbGxvY1BsYWNlaG9sZGVyKENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zU2lnSWRlbnRpdHlFbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkNoYW5uZWxzLCBuQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2YWx1YXRlSWRlbnRpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotIH0KLQotLy8gQ29udmVyc2lvbiBmdW5jdGlvbnMuIEZyb20gZmxvYXRpbmcgcG9pbnQgdG8gMTYgYml0cwotc3RhdGljCi12b2lkIEZyb21GbG9hdFRvMTYoY29uc3QgY21zRmxvYXQzMk51bWJlciBJbltdLCBjbXNVSW50MTZOdW1iZXIgT3V0W10sIGNtc1VJbnQzMk51bWJlciBuKQotewotICAgIGNtc1VJbnQzMk51bWJlciBpOwotCi0gICAgZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgT3V0W2ldID0gX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKEluW2ldICogNjU1MzUuMCk7Ci0gICAgfQotfQotCi0vLyBGcm9tIDE2IGJpdHMgdG8gZmxvYXRpbmcgcG9pbnQKLXN0YXRpYwotdm9pZCBGcm9tMTZUb0Zsb2F0KGNvbnN0IGNtc1VJbnQxNk51bWJlciBJbltdLCBjbXNGbG9hdDMyTnVtYmVyIE91dFtdLCBjbXNVSW50MzJOdW1iZXIgbikKLXsKLSAgICBjbXNVSW50MzJOdW1iZXIgaTsKLQotICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIE91dFtpXSA9IChjbXNGbG9hdDMyTnVtYmVyKSBJbltpXSAvIDY1NTM1LjBGOwotICAgIH0KLX0KLQotCi0vLyBUaGlzIGZ1bmN0aW9uIGlzIHF1aXRlIHVzZWZ1bCB0byBhbmFseXplIHRoZSBzdHJ1Y3R1cmUgb2YgYSBMVVQgYW5kIHJldHJpZXZlIHRoZSBNUEUgZWxlbWVudHMKLS8vIHRoYXQgY29uZm9ybSB0aGUgTFVULiBJdCBzaG91bGQgYmUgY2FsbGVkIHdpdGggdGhlIExVVCwgdGhlIG51bWJlciBvZiBleHBlY3RlZCBlbGVtZW50cyBhbmQKLS8vIHRoZW4gYSBsaXN0IG9mIGV4cGVjdGVkIHR5cGVzIGZvbGxvd2VkIHdpdGggYSBsaXN0IG9mIGNtc0Zsb2F0NjROdW1iZXIgcG9pbnRlcnMgdG8gTVBFIGVsZW1lbnRzLiBJZgotLy8gdGhlIGZ1bmN0aW9uIGZvdW5kcyBhIG1hdGNoIHdpdGggY3VycmVudCBwaXBlbGluZSwgaXQgZmlsbHMgdGhlIHBvaW50ZXJzIGFuZCByZXR1cm5zIFRSVUUKLS8vIGlmIG5vdCwgcmV0dXJucyBGQUxTRSB3aXRob3V0IHRvdWNoaW5nIGFueXRoaW5nLiBTZXR0aW5nIHBvaW50ZXJzIHRvIE5VTEwgZG9lcyBieXBhc3MKLS8vIHRoZSBzdG9yYWdlIHByb2Nlc3MuCi1jbXNCb29sICBDTVNFWFBPUlQgY21zUGlwZWxpbmVDaGVja0FuZFJldHJlaXZlU3RhZ2VzKGNvbnN0IGNtc1BpcGVsaW5lKiBMdXQsIGNtc1VJbnQzMk51bWJlciBuLCAuLi4pCi17Ci0gICAgdmFfbGlzdCBhcmdzOwotICAgIGNtc1VJbnQzMk51bWJlciBpOwotICAgIGNtc1N0YWdlKiBtcGU7Ci0gICAgY21zU3RhZ2VTaWduYXR1cmUgVHlwZTsKLSAgICB2b2lkKiogRWxlbVB0cjsKLQotICAgIC8vIE1ha2Ugc3VyZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cwotICAgIGlmIChjbXNQaXBlbGluZVN0YWdlQ291bnQoTHV0KSAhPSBuKSByZXR1cm4gRkFMU0U7Ci0KLSAgICB2YV9zdGFydChhcmdzLCBuKTsKLQotICAgIC8vIEl0ZXJhdGUgYWNyb3NzIGFza2VkIHR5cGVzCi0gICAgbXBlID0gTHV0IC0+RWxlbWVudHM7Ci0gICAgZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKLQotICAgICAgICAvLyBHZXQgYXNrZWQgdHlwZQotICAgICAgICBUeXBlICA9IChjbXNTdGFnZVNpZ25hdHVyZSl2YV9hcmcoYXJncywgY21zU3RhZ2VTaWduYXR1cmUpOwotICAgICAgICBpZiAobXBlIC0+VHlwZSAhPSBUeXBlKSB7Ci0KLSAgICAgICAgICAgIHZhX2VuZChhcmdzKTsgICAgICAgLy8gTWlzbWF0Y2guIFdlIGFyZSBkb25lLgotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIG1wZSA9IG1wZSAtPk5leHQ7Ci0gICAgfQotCi0gICAgLy8gRm91bmQgYSBjb21iaW5hdGlvbiwgZmlsbCBwb2ludGVycyBpZiBub3QgTlVMTAotICAgIG1wZSA9IEx1dCAtPkVsZW1lbnRzOwotICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7Ci0KLSAgICAgICAgRWxlbVB0ciA9IHZhX2FyZyhhcmdzLCB2b2lkKiopOwotICAgICAgICBpZiAoRWxlbVB0ciAhPSBOVUxMKQotICAgICAgICAgICAgKkVsZW1QdHIgPSBtcGU7Ci0KLSAgICAgICAgbXBlID0gbXBlIC0+TmV4dDsKLSAgICB9Ci0KLSAgICB2YV9lbmQoYXJncyk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8vIEJlbG93IHRoZXJlIGFyZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHNldmVyYWwgdHlwZXMgb2YgZWxlbWVudHMuIEVhY2ggdHlwZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgYQotLy8gZXZhbHVhdGlvbiBmdW5jdGlvbiwgYSBkdXBsaWNhdGlvbiBmdW5jdGlvbiwgYSBmdW5jdGlvbiB0byBmcmVlIHJlc291cmNlcyBhbmQgYSBjb25zdHJ1Y3Rvci4KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gVHlwZSBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlIChjdXJ2ZXMpCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLWNtc1RvbmVDdXJ2ZSoqIF9jbXNTdGFnZUdldFB0clRvQ3VydmVTZXQoY29uc3QgY21zU3RhZ2UqIG1wZSkKLXsKLSAgICBfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSogRGF0YSA9IChfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSopIG1wZSAtPkRhdGE7Ci0KLSAgICByZXR1cm4gRGF0YSAtPlRoZUN1cnZlczsKLX0KLQotc3RhdGljCi12b2lkIEV2YWx1YXRlQ3VydmVzKGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIgSW5bXSwKLSAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciBPdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zU3RhZ2UgKm1wZSkKLXsKLSAgICBfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSogRGF0YTsKLSAgICBjbXNVSW50MzJOdW1iZXIgaTsKLQotICAgIF9jbXNBc3NlcnQobXBlICE9IE5VTEwpOwotCi0gICAgRGF0YSA9IChfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSopIG1wZSAtPkRhdGE7Ci0gICAgaWYgKERhdGEgPT0gTlVMTCkgcmV0dXJuOwotCi0gICAgaWYgKERhdGEgLT5UaGVDdXJ2ZXMgPT0gTlVMTCkgcmV0dXJuOwotCi0gICAgZm9yIChpPTA7IGkgPCBEYXRhIC0+bkN1cnZlczsgaSsrKSB7Ci0gICAgICAgIE91dFtpXSA9IGNtc0V2YWxUb25lQ3VydmVGbG9hdChEYXRhIC0+VGhlQ3VydmVzW2ldLCBJbltpXSk7Ci0gICAgfQotfQotCi1zdGF0aWMKLXZvaWQgQ3VydmVTZXRFbGVtVHlwZUZyZWUoY21zU3RhZ2UqIG1wZSkKLXsKLSAgICBfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSogRGF0YTsKLSAgICBjbXNVSW50MzJOdW1iZXIgaTsKLQotICAgIF9jbXNBc3NlcnQobXBlICE9IE5VTEwpOwotCi0gICAgRGF0YSA9IChfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSopIG1wZSAtPkRhdGE7Ci0gICAgaWYgKERhdGEgPT0gTlVMTCkgcmV0dXJuOwotCi0gICAgaWYgKERhdGEgLT5UaGVDdXJ2ZXMgIT0gTlVMTCkgewotICAgICAgICBmb3IgKGk9MDsgaSA8IERhdGEgLT5uQ3VydmVzOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChEYXRhIC0+VGhlQ3VydmVzW2ldICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgY21zRnJlZVRvbmVDdXJ2ZShEYXRhIC0+VGhlQ3VydmVzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBfY21zRnJlZShtcGUgLT5Db250ZXh0SUQsIERhdGEgLT5UaGVDdXJ2ZXMpOwotICAgIF9jbXNGcmVlKG1wZSAtPkNvbnRleHRJRCwgRGF0YSk7Ci19Ci0KLQotc3RhdGljCi12b2lkKiBDdXJ2ZVNldER1cChjbXNTdGFnZSogbXBlKQotewotICAgIF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKiBEYXRhID0gKF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKikgbXBlIC0+RGF0YTsKLSAgICBfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSogTmV3RWxlbTsKLSAgICBjbXNVSW50MzJOdW1iZXIgaTsKLQotICAgIE5ld0VsZW0gPSAoX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqKSBfY21zTWFsbG9jWmVybyhtcGUgLT5Db250ZXh0SUQsIHNpemVvZihfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSkpOwotICAgIGlmIChOZXdFbGVtID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgTmV3RWxlbSAtPm5DdXJ2ZXMgICA9IERhdGEgLT5uQ3VydmVzOwotICAgIE5ld0VsZW0gLT5UaGVDdXJ2ZXMgPSAoY21zVG9uZUN1cnZlKiopIF9jbXNDYWxsb2MobXBlIC0+Q29udGV4dElELCBOZXdFbGVtIC0+bkN1cnZlcywgc2l6ZW9mKGNtc1RvbmVDdXJ2ZSopKTsKLQotICAgIGlmIChOZXdFbGVtIC0+VGhlQ3VydmVzID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IE5ld0VsZW0gLT5uQ3VydmVzOyBpKyspIHsKLQotICAgICAgICAvLyBEdXBsaWNhdGUgZWFjaCBjdXJ2ZS4gSXQgbWF5IGZhaWwuCi0gICAgICAgIE5ld0VsZW0gLT5UaGVDdXJ2ZXNbaV0gPSBjbXNEdXBUb25lQ3VydmUoRGF0YSAtPlRoZUN1cnZlc1tpXSk7Ci0gICAgICAgIGlmIChOZXdFbGVtIC0+VGhlQ3VydmVzW2ldID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLQotICAgIH0KLSAgICByZXR1cm4gKHZvaWQqKSBOZXdFbGVtOwotCi1FcnJvcjoKLQotICAgIGlmIChOZXdFbGVtIC0+VGhlQ3VydmVzICE9IE5VTEwpIHsKLSAgICAgICAgZm9yIChpPTA7IGkgPCBOZXdFbGVtIC0+bkN1cnZlczsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoTmV3RWxlbSAtPlRoZUN1cnZlc1tpXSkKLSAgICAgICAgICAgICAgICBjbXNGcmVlVG9uZUN1cnZlKE5ld0VsZW0gLT5UaGVDdXJ2ZXNbaV0pOwotICAgICAgICB9Ci0gICAgfQotICAgIF9jbXNGcmVlKG1wZSAtPkNvbnRleHRJRCwgTmV3RWxlbSAtPlRoZUN1cnZlcyk7Ci0gICAgX2Ntc0ZyZWUobXBlIC0+Q29udGV4dElELCBOZXdFbGVtKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi0vLyBDdXJ2ZXMgPT0gTlVMTCBmb3JjZXMgaWRlbnRpdHkgY3VydmVzCi1jbXNTdGFnZSogQ01TRVhQT1JUIGNtc1N0YWdlQWxsb2NUb25lQ3VydmVzKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgbkNoYW5uZWxzLCBjbXNUb25lQ3VydmUqIGNvbnN0IEN1cnZlc1tdKQotewotICAgIGNtc1VJbnQzMk51bWJlciBpOwotICAgIF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKiBOZXdFbGVtOwotICAgIGNtc1N0YWdlKiBOZXdNUEU7Ci0KLQotICAgIE5ld01QRSA9IF9jbXNTdGFnZUFsbG9jUGxhY2Vob2xkZXIoQ29udGV4dElELCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLCBuQ2hhbm5lbHMsIG5DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmFsdWF0ZUN1cnZlcywgQ3VydmVTZXREdXAsIEN1cnZlU2V0RWxlbVR5cGVGcmVlLCBOVUxMICk7Ci0gICAgaWYgKE5ld01QRSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIE5ld0VsZW0gPSAoX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSkpOwotICAgIGlmIChOZXdFbGVtID09IE5VTEwpIHsKLSAgICAgICAgY21zU3RhZ2VGcmVlKE5ld01QRSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIE5ld01QRSAtPkRhdGEgID0gKHZvaWQqKSBOZXdFbGVtOwotCi0gICAgTmV3RWxlbSAtPm5DdXJ2ZXMgICA9IG5DaGFubmVsczsKLSAgICBOZXdFbGVtIC0+VGhlQ3VydmVzID0gKGNtc1RvbmVDdXJ2ZSoqKSBfY21zQ2FsbG9jKENvbnRleHRJRCwgbkNoYW5uZWxzLCBzaXplb2YoY21zVG9uZUN1cnZlKikpOwotICAgIGlmIChOZXdFbGVtIC0+VGhlQ3VydmVzID09IE5VTEwpIHsKLSAgICAgICAgY21zU3RhZ2VGcmVlKE5ld01QRSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGZvciAoaT0wOyBpIDwgbkNoYW5uZWxzOyBpKyspIHsKLQotICAgICAgICBpZiAoQ3VydmVzID09IE5VTEwpIHsKLSAgICAgICAgICAgIE5ld0VsZW0gLT5UaGVDdXJ2ZXNbaV0gPSBjbXNCdWlsZEdhbW1hKENvbnRleHRJRCwgMS4wKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIE5ld0VsZW0gLT5UaGVDdXJ2ZXNbaV0gPSBjbXNEdXBUb25lQ3VydmUoQ3VydmVzW2ldKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChOZXdFbGVtIC0+VGhlQ3VydmVzW2ldID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNtc1N0YWdlRnJlZShOZXdNUEUpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgcmV0dXJuIE5ld01QRTsKLX0KLQotCi0vLyBDcmVhdGUgYSBidW5jaCBvZiBpZGVudGl0eSBjdXJ2ZXMKLWNtc1N0YWdlKiBfY21zU3RhZ2VBbGxvY0lkZW50aXR5Q3VydmVzKGNtc0NvbnRleHQgQ29udGV4dElELCBpbnQgbkNoYW5uZWxzKQotewotICAgIGNtc1N0YWdlKiBtcGUgPSBjbXNTdGFnZUFsbG9jVG9uZUN1cnZlcyhDb250ZXh0SUQsIG5DaGFubmVscywgTlVMTCk7Ci0KLSAgICBpZiAobXBlID09IE5VTEwpIHJldHVybiBOVUxMOwotICAgIG1wZSAtPkltcGxlbWVudHMgPSBjbXNTaWdJZGVudGl0eUVsZW1UeXBlOwotICAgIHJldHVybiBtcGU7Ci19Ci0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gVHlwZSBjbXNTaWdNYXRyaXhFbGVtVHlwZSAoTWF0cmljZXMpCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQotLy8gU3BlY2lhbCBjYXJlIHNob3VsZCBiZSB0YWtlbiBoZXJlIGJlY2F1c2UgcHJlY2lzaW9uIGxvc3MuIEEgdGVtcG9yYXJ5IGNtc0Zsb2F0NjROdW1iZXIgYnVmZmVyIGlzIGJlaW5nIHVzZWQKLXN0YXRpYwotdm9pZCBFdmFsdWF0ZU1hdHJpeChjb25zdCBjbXNGbG9hdDMyTnVtYmVyIEluW10sCi0gICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgT3V0W10sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1N0YWdlICptcGUpCi17Ci0gICAgY21zVUludDMyTnVtYmVyIGksIGo7Ci0gICAgX2Ntc1N0YWdlTWF0cml4RGF0YSogRGF0YSA9IChfY21zU3RhZ2VNYXRyaXhEYXRhKikgbXBlIC0+RGF0YTsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIFRtcDsKLQotICAgIC8vIElucHV0IGlzIGFscmVhZHkgaW4gMC4uMS4wIG5vdGF0aW9uCi0gICAgZm9yIChpPTA7IGkgPCBtcGUgLT5PdXRwdXRDaGFubmVsczsgaSsrKSB7Ci0KLSAgICAgICAgVG1wID0gMDsKLSAgICAgICAgZm9yIChqPTA7IGogPCBtcGUtPklucHV0Q2hhbm5lbHM7IGorKykgewotICAgICAgICAgICAgVG1wICs9IEluW2pdICogRGF0YS0+RG91YmxlW2kqbXBlLT5JbnB1dENoYW5uZWxzICsgal07Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoRGF0YSAtPk9mZnNldCAhPSBOVUxMKQotICAgICAgICAgICAgVG1wICs9IERhdGEtPk9mZnNldFtpXTsKLQotICAgICAgICBPdXRbaV0gPSAoY21zRmxvYXQzMk51bWJlcikgVG1wOwotICAgIH0KLQotCi0gICAgLy8gT3V0cHV0IGluIDAuLjEuMCBkb21haW4KLX0KLQotCi0vLyBEdXBsaWNhdGUgYSB5ZXQtZXhpc3RpbmcgbWF0cml4IGVsZW1lbnQKLXN0YXRpYwotdm9pZCogTWF0cml4RWxlbUR1cChjbXNTdGFnZSogbXBlKQotewotICAgIF9jbXNTdGFnZU1hdHJpeERhdGEqIERhdGEgPSAoX2Ntc1N0YWdlTWF0cml4RGF0YSopIG1wZSAtPkRhdGE7Ci0gICAgX2Ntc1N0YWdlTWF0cml4RGF0YSogTmV3RWxlbTsKLSAgICBjbXNVSW50MzJOdW1iZXIgc3o7Ci0KLSAgICBOZXdFbGVtID0gKF9jbXNTdGFnZU1hdHJpeERhdGEqKSBfY21zTWFsbG9jWmVybyhtcGUgLT5Db250ZXh0SUQsIHNpemVvZihfY21zU3RhZ2VNYXRyaXhEYXRhKSk7Ci0gICAgaWYgKE5ld0VsZW0gPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBzeiA9IG1wZSAtPklucHV0Q2hhbm5lbHMgKiBtcGUgLT5PdXRwdXRDaGFubmVsczsKLQotICAgIE5ld0VsZW0gLT5Eb3VibGUgPSAoY21zRmxvYXQ2NE51bWJlciopIF9jbXNEdXBNZW0obXBlIC0+Q29udGV4dElELCBEYXRhIC0+RG91YmxlLCBzeiAqIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKSkgOwotCi0gICAgaWYgKERhdGEgLT5PZmZzZXQpCi0gICAgICAgIE5ld0VsZW0gLT5PZmZzZXQgPSAoY21zRmxvYXQ2NE51bWJlciopIF9jbXNEdXBNZW0obXBlIC0+Q29udGV4dElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAtPk9mZnNldCwgbXBlIC0+IE91dHB1dENoYW5uZWxzICogc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpKSA7Ci0KLSAgICByZXR1cm4gKHZvaWQqKSBOZXdFbGVtOwotfQotCi0KLXN0YXRpYwotdm9pZCBNYXRyaXhFbGVtVHlwZUZyZWUoY21zU3RhZ2UqIG1wZSkKLXsKLSAgICBfY21zU3RhZ2VNYXRyaXhEYXRhKiBEYXRhID0gKF9jbXNTdGFnZU1hdHJpeERhdGEqKSBtcGUgLT5EYXRhOwotICAgIGlmIChEYXRhID09IE5VTEwpCi0gICAgICAgIHJldHVybjsKLSAgICBpZiAoRGF0YSAtPkRvdWJsZSkKLSAgICAgICAgX2Ntc0ZyZWUobXBlIC0+Q29udGV4dElELCBEYXRhIC0+RG91YmxlKTsKLQotICAgIGlmIChEYXRhIC0+T2Zmc2V0KQotICAgICAgICBfY21zRnJlZShtcGUgLT5Db250ZXh0SUQsIERhdGEgLT5PZmZzZXQpOwotCi0gICAgX2Ntc0ZyZWUobXBlIC0+Q29udGV4dElELCBtcGUgLT5EYXRhKTsKLX0KLQotCi0KLWNtc1N0YWdlKiAgQ01TRVhQT1JUIGNtc1N0YWdlQWxsb2NNYXRyaXgoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBSb3dzLCBjbXNVSW50MzJOdW1iZXIgQ29scywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNGbG9hdDY0TnVtYmVyKiBNYXRyaXgsIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIqIE9mZnNldCkKLXsKLSAgICBjbXNVSW50MzJOdW1iZXIgaSwgbjsKLSAgICBfY21zU3RhZ2VNYXRyaXhEYXRhKiBOZXdFbGVtOwotICAgIGNtc1N0YWdlKiBOZXdNUEU7Ci0KLSAgICBuID0gUm93cyAqIENvbHM7Ci0KLSAgICAvLyBDaGVjayBmb3Igb3ZlcmZsb3cKLSAgICBpZiAobiA9PSAwKSByZXR1cm4gTlVMTDsKLSAgICBpZiAobiA+PSBVSU5UX01BWCAvIENvbHMpIHJldHVybiBOVUxMOwotICAgIGlmIChuID49IFVJTlRfTUFYIC8gUm93cykgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKG4gPCBSb3dzIHx8IG4gPCBDb2xzKSByZXR1cm4gTlVMTDsKLQotICAgIE5ld01QRSA9IF9jbXNTdGFnZUFsbG9jUGxhY2Vob2xkZXIoQ29udGV4dElELCBjbXNTaWdNYXRyaXhFbGVtVHlwZSwgQ29scywgUm93cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmFsdWF0ZU1hdHJpeCwgTWF0cml4RWxlbUR1cCwgTWF0cml4RWxlbVR5cGVGcmVlLCBOVUxMICk7Ci0gICAgaWYgKE5ld01QRSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotCi0gICAgTmV3RWxlbSA9IChfY21zU3RhZ2VNYXRyaXhEYXRhKikgX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBzaXplb2YoX2Ntc1N0YWdlTWF0cml4RGF0YSkpOwotICAgIGlmIChOZXdFbGVtID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0KLSAgICBOZXdFbGVtIC0+RG91YmxlID0gKGNtc0Zsb2F0NjROdW1iZXIqKSBfY21zQ2FsbG9jKENvbnRleHRJRCwgbiwgc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpKTsKLQotICAgIGlmIChOZXdFbGVtLT5Eb3VibGUgPT0gTlVMTCkgewotICAgICAgICBNYXRyaXhFbGVtVHlwZUZyZWUoTmV3TVBFKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgTmV3RWxlbSAtPkRvdWJsZVtpXSA9IE1hdHJpeFtpXTsKLSAgICB9Ci0KLQotICAgIGlmIChPZmZzZXQgIT0gTlVMTCkgewotCi0gICAgICAgIE5ld0VsZW0gLT5PZmZzZXQgPSAoY21zRmxvYXQ2NE51bWJlciopIF9jbXNDYWxsb2MoQ29udGV4dElELCBSb3dzLCBzaXplb2YoY21zRmxvYXQ2NE51bWJlcikpOwotICAgICAgICBpZiAoTmV3RWxlbS0+T2Zmc2V0ID09IE5VTEwpIHsKLSAgICAgICAgICAgTWF0cml4RWxlbVR5cGVGcmVlKE5ld01QRSk7Ci0gICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpPTA7IGkgPCBSb3dzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBOZXdFbGVtIC0+T2Zmc2V0W2ldID0gT2Zmc2V0W2ldOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBOZXdNUEUgLT5EYXRhICA9ICh2b2lkKikgTmV3RWxlbTsKLSAgICByZXR1cm4gTmV3TVBFOwotfQotCi0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIFR5cGUgY21zU2lnQ0x1dEVsZW1UeXBlCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQotLy8gRXZhbHVhdGUgaW4gdHJ1ZSBmbG9hdGluZyBwb2ludAotc3RhdGljCi12b2lkIEV2YWx1YXRlQ0xVVGZsb2F0KGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIgSW5bXSwgY21zRmxvYXQzMk51bWJlciBPdXRbXSwgY29uc3QgY21zU3RhZ2UgKm1wZSkKLXsKLSAgICBfY21zU3RhZ2VDTHV0RGF0YSogRGF0YSA9IChfY21zU3RhZ2VDTHV0RGF0YSopIG1wZSAtPkRhdGE7Ci0KLSAgICBEYXRhIC0+IFBhcmFtcyAtPkludGVycG9sYXRpb24uTGVycEZsb2F0KEluLCBPdXQsIERhdGEtPlBhcmFtcyk7Ci19Ci0KLQotLy8gQ29udmVydCB0byAxNiBiaXRzLCBldmFsdWF0ZSwgYW5kIGJhY2sgdG8gZmxvYXRpbmcgcG9pbnQKLXN0YXRpYwotdm9pZCBFdmFsdWF0ZUNMVVRmbG9hdEluMTYoY29uc3QgY21zRmxvYXQzMk51bWJlciBJbltdLCBjbXNGbG9hdDMyTnVtYmVyIE91dFtdLCBjb25zdCBjbXNTdGFnZSAqbXBlKQotewotICAgIF9jbXNTdGFnZUNMdXREYXRhKiBEYXRhID0gKF9jbXNTdGFnZUNMdXREYXRhKikgbXBlIC0+RGF0YTsKLSAgICBjbXNVSW50MTZOdW1iZXIgSW4xNltNQVhfU1RBR0VfQ0hBTk5FTFNdLCBPdXQxNltNQVhfU1RBR0VfQ0hBTk5FTFNdOwotCi0gICAgX2Ntc0Fzc2VydChtcGUgLT5JbnB1dENoYW5uZWxzICA8PSBNQVhfU1RBR0VfQ0hBTk5FTFMpOwotICAgIF9jbXNBc3NlcnQobXBlIC0+T3V0cHV0Q2hhbm5lbHMgPD0gTUFYX1NUQUdFX0NIQU5ORUxTKTsKLQotICAgIEZyb21GbG9hdFRvMTYoSW4sIEluMTYsIG1wZSAtPklucHV0Q2hhbm5lbHMpOwotICAgIERhdGEgLT4gUGFyYW1zIC0+SW50ZXJwb2xhdGlvbi5MZXJwMTYoSW4xNiwgT3V0MTYsIERhdGEtPlBhcmFtcyk7Ci0gICAgRnJvbTE2VG9GbG9hdChPdXQxNiwgT3V0LCAgbXBlIC0+T3V0cHV0Q2hhbm5lbHMpOwotfQotCi0KLS8vIEdpdmVuIGFuIGh5cGVyY3ViZSBvZiBiIGRpbWVuc2lvbnMsIHdpdGggRGltc1tdIG51bWJlciBvZiBub2RlcyBieSBkaW1lbnNpb24sIGNhbGN1bGF0ZSB0aGUgdG90YWwgYW1vdW50IG9mIG5vZGVzCi1zdGF0aWMKLWNtc1VJbnQzMk51bWJlciBDdWJlU2l6ZShjb25zdCBjbXNVSW50MzJOdW1iZXIgRGltc1tdLCBjbXNVSW50MzJOdW1iZXIgYikKLXsKLSAgICBjbXNVSW50MzJOdW1iZXIgcnYsIGRpbTsKLQotICAgIF9jbXNBc3NlcnQoRGltcyAhPSBOVUxMKTsKLQotICAgIGZvciAocnYgPSAxOyBiID4gMDsgYi0tKSB7Ci0KLSAgICAgICAgZGltID0gRGltc1tiLTFdOwotICAgICAgICBpZiAoZGltID09IDApIHJldHVybiAwOyAgLy8gRXJyb3IKLQotICAgICAgICBydiAqPSBkaW07Ci0KLSAgICAgICAgLy8gQ2hlY2sgZm9yIG92ZXJmbG93Ci0gICAgICAgIGlmIChydiA+IFVJTlRfTUFYIC8gZGltKSByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4gcnY7Ci19Ci0KLXN0YXRpYwotdm9pZCogQ0xVVEVsZW1EdXAoY21zU3RhZ2UqIG1wZSkKLXsKLSAgICBfY21zU3RhZ2VDTHV0RGF0YSogRGF0YSA9IChfY21zU3RhZ2VDTHV0RGF0YSopIG1wZSAtPkRhdGE7Ci0gICAgX2Ntc1N0YWdlQ0x1dERhdGEqIE5ld0VsZW07Ci0KLQotICAgIE5ld0VsZW0gPSAoX2Ntc1N0YWdlQ0x1dERhdGEqKSBfY21zTWFsbG9jWmVybyhtcGUgLT5Db250ZXh0SUQsIHNpemVvZihfY21zU3RhZ2VDTHV0RGF0YSkpOwotICAgIGlmIChOZXdFbGVtID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgTmV3RWxlbSAtPm5FbnRyaWVzICAgICAgID0gRGF0YSAtPm5FbnRyaWVzOwotICAgIE5ld0VsZW0gLT5IYXNGbG9hdFZhbHVlcyA9IERhdGEgLT5IYXNGbG9hdFZhbHVlczsKLQotICAgIGlmIChEYXRhIC0+VGFiLlQpIHsKLQotICAgICAgICBpZiAoRGF0YSAtPkhhc0Zsb2F0VmFsdWVzKSB7Ci0gICAgICAgICAgICBOZXdFbGVtIC0+VGFiLlRGbG9hdCA9IChjbXNGbG9hdDMyTnVtYmVyKikgX2Ntc0R1cE1lbShtcGUgLT5Db250ZXh0SUQsIERhdGEgLT5UYWIuVEZsb2F0LCBEYXRhIC0+bkVudHJpZXMgKiBzaXplb2YgKGNtc0Zsb2F0MzJOdW1iZXIpKTsKLSAgICAgICAgICAgIGlmIChOZXdFbGVtIC0+VGFiLlRGbG9hdCA9PSBOVUxMKQotICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBOZXdFbGVtIC0+VGFiLlQgPSAoY21zVUludDE2TnVtYmVyKikgX2Ntc0R1cE1lbShtcGUgLT5Db250ZXh0SUQsIERhdGEgLT5UYWIuVCwgRGF0YSAtPm5FbnRyaWVzICogc2l6ZW9mIChjbXNVSW50MTZOdW1iZXIpKTsKLSAgICAgICAgICAgIGlmIChOZXdFbGVtIC0+VGFiLlRGbG9hdCA9PSBOVUxMKQotICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBOZXdFbGVtIC0+UGFyYW1zICAgPSBfY21zQ29tcHV0ZUludGVycFBhcmFtc0V4KG1wZSAtPkNvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgLT5QYXJhbXMgLT5uU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgLT5QYXJhbXMgLT5uSW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAtPlBhcmFtcyAtPm5PdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3RWxlbSAtPlRhYi5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAtPlBhcmFtcyAtPmR3RmxhZ3MpOwotICAgIGlmIChOZXdFbGVtLT5QYXJhbXMgIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuICh2b2lkKikgTmV3RWxlbTsKLSBFcnJvcjoKLSAgICBpZiAoTmV3RWxlbS0+VGFiLlQpCi0gICAgICAgIC8vIFRoaXMgd29ya3MgZm9yIGJvdGggdHlwZXMKLSAgICAgICAgX2Ntc0ZyZWUobXBlIC0+Q29udGV4dElELCBOZXdFbGVtIC0+IFRhYi5UKTsKLSAgICBfY21zRnJlZShtcGUgLT5Db250ZXh0SUQsIE5ld0VsZW0pOwotICAgIHJldHVybiBOVUxMOwotfQotCi0KLXN0YXRpYwotdm9pZCBDTHV0RWxlbVR5cGVGcmVlKGNtc1N0YWdlKiBtcGUpCi17Ci0KLSAgICBfY21zU3RhZ2VDTHV0RGF0YSogRGF0YSA9IChfY21zU3RhZ2VDTHV0RGF0YSopIG1wZSAtPkRhdGE7Ci0KLSAgICAvLyBBbHJlYWR5IGVtcHR5Ci0gICAgaWYgKERhdGEgPT0gTlVMTCkgcmV0dXJuOwotCi0gICAgLy8gVGhpcyB3b3JrcyBmb3IgYm90aCB0eXBlcwotICAgIGlmIChEYXRhIC0+IFRhYi5UKQotICAgICAgICBfY21zRnJlZShtcGUgLT5Db250ZXh0SUQsIERhdGEgLT4gVGFiLlQpOwotCi0gICAgX2Ntc0ZyZWVJbnRlcnBQYXJhbXMoRGF0YSAtPlBhcmFtcyk7Ci0gICAgX2Ntc0ZyZWUobXBlIC0+Q29udGV4dElELCBtcGUgLT5EYXRhKTsKLX0KLQotCi0vLyBBbGxvY2F0ZXMgYSAxNi1iaXQgbXVsdGlkaW1lbnNpb25hbCBDTFVULiBUaGlzIGlzIGV2YWx1YXRlZCBhdCAxNi1iaXQgcHJlY2lzaW9uLiBUYWJsZSBtYXkgaGF2ZSBkaWZmZXJlbnQKLS8vIGdyYW51bGFyaXR5IG9uIGVhY2ggZGltZW5zaW9uLgotY21zU3RhZ2UqIENNU0VYUE9SVCBjbXNTdGFnZUFsbG9jQ0x1dDE2Yml0R3JhbnVsYXIoY21zQ29udGV4dCBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1VJbnQzMk51bWJlciBjbHV0UG9pbnRzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBpbnB1dENoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBvdXRwdXRDaGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNVSW50MTZOdW1iZXIqIFRhYmxlKQotewotICAgIGNtc1VJbnQzMk51bWJlciBpLCBuOwotICAgIF9jbXNTdGFnZUNMdXREYXRhKiBOZXdFbGVtOwotICAgIGNtc1N0YWdlKiBOZXdNUEU7Ci0KLSAgICBfY21zQXNzZXJ0KGNsdXRQb2ludHMgIT0gTlVMTCk7Ci0KLSAgICBpZiAoaW5wdXRDaGFuID4gTUFYX0lOUFVUX0RJTUVOU0lPTlMpIHsKLSAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgIlRvbyBtYW55IGlucHV0IGNoYW5uZWxzICglZCBjaGFubmVscywgbWF4PSVkKSIsIGlucHV0Q2hhbiwgTUFYX0lOUFVUX0RJTUVOU0lPTlMpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBOZXdNUEUgPSBfY21zU3RhZ2VBbGxvY1BsYWNlaG9sZGVyKENvbnRleHRJRCwgY21zU2lnQ0x1dEVsZW1UeXBlLCBpbnB1dENoYW4sIG91dHB1dENoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZhbHVhdGVDTFVUZmxvYXRJbjE2LCBDTFVURWxlbUR1cCwgQ0x1dEVsZW1UeXBlRnJlZSwgTlVMTCApOwotCi0gICAgaWYgKE5ld01QRSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIE5ld0VsZW0gPSAoX2Ntc1N0YWdlQ0x1dERhdGEqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihfY21zU3RhZ2VDTHV0RGF0YSkpOwotICAgIGlmIChOZXdFbGVtID09IE5VTEwpIHsKLSAgICAgICAgY21zU3RhZ2VGcmVlKE5ld01QRSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIE5ld01QRSAtPkRhdGEgID0gKHZvaWQqKSBOZXdFbGVtOwotCi0gICAgTmV3RWxlbSAtPiBuRW50cmllcyA9IG4gPSBvdXRwdXRDaGFuICogQ3ViZVNpemUoY2x1dFBvaW50cywgaW5wdXRDaGFuKTsKLSAgICBOZXdFbGVtIC0+IEhhc0Zsb2F0VmFsdWVzID0gRkFMU0U7Ci0KLSAgICBpZiAobiA9PSAwKSB7Ci0gICAgICAgIGNtc1N0YWdlRnJlZShOZXdNUEUpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLQotICAgIE5ld0VsZW0gLT5UYWIuVCAgPSAoY21zVUludDE2TnVtYmVyKikgX2Ntc0NhbGxvYyhDb250ZXh0SUQsIG4sIHNpemVvZihjbXNVSW50MTZOdW1iZXIpKTsKLSAgICBpZiAoTmV3RWxlbSAtPlRhYi5UID09IE5VTEwpIHsKLSAgICAgICAgY21zU3RhZ2VGcmVlKE5ld01QRSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmIChUYWJsZSAhPSBOVUxMKSB7Ci0gICAgICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgICAgICBOZXdFbGVtIC0+VGFiLlRbaV0gPSBUYWJsZVtpXTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIE5ld0VsZW0gLT5QYXJhbXMgPSBfY21zQ29tcHV0ZUludGVycFBhcmFtc0V4KENvbnRleHRJRCwgY2x1dFBvaW50cywgaW5wdXRDaGFuLCBvdXRwdXRDaGFuLCBOZXdFbGVtIC0+VGFiLlQsIENNU19MRVJQX0ZMQUdTXzE2QklUUyk7Ci0gICAgaWYgKE5ld0VsZW0gLT5QYXJhbXMgPT0gTlVMTCkgewotICAgICAgICBjbXNTdGFnZUZyZWUoTmV3TVBFKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5ld01QRTsKLX0KLQotY21zU3RhZ2UqIENNU0VYUE9SVCBjbXNTdGFnZUFsbG9jQ0x1dDE2Yml0KGNtc0NvbnRleHQgQ29udGV4dElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG5HcmlkUG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGlucHV0Q2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBvdXRwdXRDaGFuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zVUludDE2TnVtYmVyKiBUYWJsZSkKLXsKLSAgICBjbXNVSW50MzJOdW1iZXIgRGltZW5zaW9uc1tNQVhfSU5QVVRfRElNRU5TSU9OU107Ci0gICAgaW50IGk7Ci0KLSAgIC8vIE91ciByZXN1bHRpbmcgTFVUIHdvdWxkIGJlIHNhbWUgZ3JpZHBvaW50cyBvbiBhbGwgZGltZW5zaW9ucwotICAgIGZvciAoaT0wOyBpIDwgTUFYX0lOUFVUX0RJTUVOU0lPTlM7IGkrKykKLSAgICAgICAgRGltZW5zaW9uc1tpXSA9IG5HcmlkUG9pbnRzOwotCi0gICAgcmV0dXJuIGNtc1N0YWdlQWxsb2NDTHV0MTZiaXRHcmFudWxhcihDb250ZXh0SUQsIERpbWVuc2lvbnMsIGlucHV0Q2hhbiwgb3V0cHV0Q2hhbiwgVGFibGUpOwotfQotCi0KLWNtc1N0YWdlKiBDTVNFWFBPUlQgY21zU3RhZ2VBbGxvY0NMdXRGbG9hdChjbXNDb250ZXh0IENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuR3JpZFBvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBpbnB1dENoYW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgb3V0cHV0Q2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIqIFRhYmxlKQotewotICAgY21zVUludDMyTnVtYmVyIERpbWVuc2lvbnNbTUFYX0lOUFVUX0RJTUVOU0lPTlNdOwotICAgaW50IGk7Ci0KLSAgICAvLyBPdXIgcmVzdWx0aW5nIExVVCB3b3VsZCBiZSBzYW1lIGdyaWRwb2ludHMgb24gYWxsIGRpbWVuc2lvbnMKLSAgICBmb3IgKGk9MDsgaSA8IE1BWF9JTlBVVF9ESU1FTlNJT05TOyBpKyspCi0gICAgICAgIERpbWVuc2lvbnNbaV0gPSBuR3JpZFBvaW50czsKLQotICAgIHJldHVybiBjbXNTdGFnZUFsbG9jQ0x1dEZsb2F0R3JhbnVsYXIoQ29udGV4dElELCBEaW1lbnNpb25zLCBpbnB1dENoYW4sIG91dHB1dENoYW4sIFRhYmxlKTsKLX0KLQotCi0KLWNtc1N0YWdlKiBDTVNFWFBPUlQgY21zU3RhZ2VBbGxvY0NMdXRGbG9hdEdyYW51bGFyKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCBjbXNVSW50MzJOdW1iZXIgY2x1dFBvaW50c1tdLCBjbXNVSW50MzJOdW1iZXIgaW5wdXRDaGFuLCBjbXNVSW50MzJOdW1iZXIgb3V0cHV0Q2hhbiwgY29uc3QgY21zRmxvYXQzMk51bWJlciogVGFibGUpCi17Ci0gICAgY21zVUludDMyTnVtYmVyIGksIG47Ci0gICAgX2Ntc1N0YWdlQ0x1dERhdGEqIE5ld0VsZW07Ci0gICAgY21zU3RhZ2UqIE5ld01QRTsKLQotICAgIF9jbXNBc3NlcnQoY2x1dFBvaW50cyAhPSBOVUxMKTsKLQotICAgIGlmIChpbnB1dENoYW4gPiBNQVhfSU5QVVRfRElNRU5TSU9OUykgewotICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX1JBTkdFLCAiVG9vIG1hbnkgaW5wdXQgY2hhbm5lbHMgKCVkIGNoYW5uZWxzLCBtYXg9JWQpIiwgaW5wdXRDaGFuLCBNQVhfSU5QVVRfRElNRU5TSU9OUyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIE5ld01QRSA9IF9jbXNTdGFnZUFsbG9jUGxhY2Vob2xkZXIoQ29udGV4dElELCBjbXNTaWdDTHV0RWxlbVR5cGUsIGlucHV0Q2hhbiwgb3V0cHV0Q2hhbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2YWx1YXRlQ0xVVGZsb2F0LCBDTFVURWxlbUR1cCwgQ0x1dEVsZW1UeXBlRnJlZSwgTlVMTCk7Ci0gICAgaWYgKE5ld01QRSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotCi0gICAgTmV3RWxlbSA9IChfY21zU3RhZ2VDTHV0RGF0YSopIF9jbXNNYWxsb2NaZXJvKENvbnRleHRJRCwgc2l6ZW9mKF9jbXNTdGFnZUNMdXREYXRhKSk7Ci0gICAgaWYgKE5ld0VsZW0gPT0gTlVMTCkgewotICAgICAgICBjbXNTdGFnZUZyZWUoTmV3TVBFKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgTmV3TVBFIC0+RGF0YSAgPSAodm9pZCopIE5ld0VsZW07Ci0KLSAgICAvLyBUaGVyZSBpcyBhIHBvdGVudGlhbCBpbnRlZ2VyIG92ZXJmbG93IG9uIGNvbnB1dGluZyBuIGFuZCBuRW50cmllcy4KLSAgICBOZXdFbGVtIC0+IG5FbnRyaWVzID0gbiA9IG91dHB1dENoYW4gKiBDdWJlU2l6ZShjbHV0UG9pbnRzLCBpbnB1dENoYW4pOwotICAgIE5ld0VsZW0gLT4gSGFzRmxvYXRWYWx1ZXMgPSBUUlVFOwotCi0gICAgaWYgKG4gPT0gMCkgewotICAgICAgICBjbXNTdGFnZUZyZWUoTmV3TVBFKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgTmV3RWxlbSAtPlRhYi5URmxvYXQgID0gKGNtc0Zsb2F0MzJOdW1iZXIqKSBfY21zQ2FsbG9jKENvbnRleHRJRCwgbiwgc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpKTsKLSAgICBpZiAoTmV3RWxlbSAtPlRhYi5URmxvYXQgPT0gTlVMTCkgewotICAgICAgICBjbXNTdGFnZUZyZWUoTmV3TVBFKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKFRhYmxlICE9IE5VTEwpIHsKLSAgICAgICAgZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgIE5ld0VsZW0gLT5UYWIuVEZsb2F0W2ldID0gVGFibGVbaV07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBOZXdFbGVtIC0+UGFyYW1zID0gX2Ntc0NvbXB1dGVJbnRlcnBQYXJhbXNFeChDb250ZXh0SUQsIGNsdXRQb2ludHMsICBpbnB1dENoYW4sIG91dHB1dENoYW4sIE5ld0VsZW0gLT5UYWIuVEZsb2F0LCBDTVNfTEVSUF9GTEFHU19GTE9BVCk7Ci0gICAgaWYgKE5ld0VsZW0gLT5QYXJhbXMgPT0gTlVMTCkgewotICAgICAgICBjbXNTdGFnZUZyZWUoTmV3TVBFKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5ld01QRTsKLX0KLQotCi1zdGF0aWMKLWludCBJZGVudGl0eVNhbXBsZXIocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIEluW10sIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciBPdXRbXSwgcmVnaXN0ZXIgdm9pZCAqIENhcmdvKQotewotICAgIGludCBuQ2hhbiA9ICooaW50KikgQ2FyZ287Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG5DaGFuOyBpKyspCi0gICAgICAgIE91dFtpXSA9IEluW2ldOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLS8vIENyZWF0ZXMgYW4gTVBFIHRoYXQganVzdCBjb3BpZXMgaW5wdXQgdG8gb3V0cHV0Ci1jbXNTdGFnZSogX2Ntc1N0YWdlQWxsb2NJZGVudGl0eUNMdXQoY21zQ29udGV4dCBDb250ZXh0SUQsIGludCBuQ2hhbikKLXsKLSAgICBjbXNVSW50MzJOdW1iZXIgRGltZW5zaW9uc1tNQVhfSU5QVVRfRElNRU5TSU9OU107Ci0gICAgY21zU3RhZ2UqIG1wZSA7Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IE1BWF9JTlBVVF9ESU1FTlNJT05TOyBpKyspCi0gICAgICAgIERpbWVuc2lvbnNbaV0gPSAyOwotCi0gICAgbXBlID0gY21zU3RhZ2VBbGxvY0NMdXQxNmJpdEdyYW51bGFyKENvbnRleHRJRCwgRGltZW5zaW9ucywgbkNoYW4sIG5DaGFuLCBOVUxMKTsKLSAgICBpZiAobXBlID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgaWYgKCFjbXNTdGFnZVNhbXBsZUNMdXQxNmJpdChtcGUsIElkZW50aXR5U2FtcGxlciwgJm5DaGFuLCAwKSkgewotICAgICAgICBjbXNTdGFnZUZyZWUobXBlKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgbXBlIC0+SW1wbGVtZW50cyA9IGNtc1NpZ0lkZW50aXR5RWxlbVR5cGU7Ci0gICAgcmV0dXJuIG1wZTsKLX0KLQotCi0KLS8vIFF1YW50aXplIGEgdmFsdWUgMCA8PSBpIDwgTWF4U2FtcGxlcyB0byAwLi4weGZmZmYKLWNtc1VJbnQxNk51bWJlciBfY21zUXVhbnRpemVWYWwoY21zRmxvYXQ2NE51bWJlciBpLCBpbnQgTWF4U2FtcGxlcykKLXsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIHg7Ci0KLSAgICB4ID0gKChjbXNGbG9hdDY0TnVtYmVyKSBpICogNjU1MzUuKSAvIChjbXNGbG9hdDY0TnVtYmVyKSAoTWF4U2FtcGxlcyAtIDEpOwotICAgIHJldHVybiBfY21zUXVpY2tTYXR1cmF0ZVdvcmQoeCk7Ci19Ci0KLQotLy8gVGhpcyByb3V0aW5lIGRvZXMgYSBzd2VlcCBvbiB3aG9sZSBpbnB1dCBzcGFjZSwgYW5kIGNhbGxzIGl0cyBjYWxsYmFjawotLy8gZnVuY3Rpb24gb24ga25vdHMuIHJldHVybnMgVFJVRSBpZiBhbGwgb2ssIEZBTFNFIG90aGVyd2lzZS4KLWNtc0Jvb2wgQ01TRVhQT1JUIGNtc1N0YWdlU2FtcGxlQ0x1dDE2Yml0KGNtc1N0YWdlKiBtcGUsIGNtc1NBTVBMRVIxNiBTYW1wbGVyLCB2b2lkICogQ2FyZ28sIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKQotewotICAgIGludCBpLCB0LCBuVG90YWxQb2ludHMsIGluZGV4LCByZXN0OwotICAgIGludCBuSW5wdXRzLCBuT3V0cHV0czsKLSAgICBjbXNVSW50MzJOdW1iZXIqIG5TYW1wbGVzOwotICAgIGNtc1VJbnQxNk51bWJlciBJbltNQVhfSU5QVVRfRElNRU5TSU9OUysxXSwgT3V0W01BWF9TVEFHRV9DSEFOTkVMU107Ci0gICAgX2Ntc1N0YWdlQ0x1dERhdGEqIGNsdXQ7Ci0KLSAgICBpZiAobXBlID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQotICAgIGNsdXQgPSAoX2Ntc1N0YWdlQ0x1dERhdGEqKSBtcGUtPkRhdGE7Ci0KLSAgICBpZiAoY2x1dCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBuU2FtcGxlcyA9IGNsdXQtPlBhcmFtcyAtPm5TYW1wbGVzOwotICAgIG5JbnB1dHMgID0gY2x1dC0+UGFyYW1zIC0+bklucHV0czsKLSAgICBuT3V0cHV0cyA9IGNsdXQtPlBhcmFtcyAtPm5PdXRwdXRzOwotCi0gICAgaWYgKG5JbnB1dHMgPD0gMCkgcmV0dXJuIEZBTFNFOwotICAgIGlmIChuT3V0cHV0cyA8PSAwKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKG5JbnB1dHMgPiBNQVhfSU5QVVRfRElNRU5TSU9OUykgcmV0dXJuIEZBTFNFOwotICAgIGlmIChuT3V0cHV0cyA+PSBNQVhfU1RBR0VfQ0hBTk5FTFMpIHJldHVybiBGQUxTRTsKLQotICAgIG5Ub3RhbFBvaW50cyA9IEN1YmVTaXplKG5TYW1wbGVzLCBuSW5wdXRzKTsKLSAgICBpZiAoblRvdGFsUG9pbnRzID09IDApIHJldHVybiBGQUxTRTsKLQotICAgIGluZGV4ID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgblRvdGFsUG9pbnRzOyBpKyspIHsKLQotICAgICAgICByZXN0ID0gaTsKLSAgICAgICAgZm9yICh0ID0gbklucHV0cy0xOyB0ID49MDsgLS10KSB7Ci0KLSAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgQ29sb3JhbnQgPSByZXN0ICUgblNhbXBsZXNbdF07Ci0KLSAgICAgICAgICAgIHJlc3QgLz0gblNhbXBsZXNbdF07Ci0KLSAgICAgICAgICAgIEluW3RdID0gX2Ntc1F1YW50aXplVmFsKENvbG9yYW50LCBuU2FtcGxlc1t0XSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2x1dCAtPlRhYi5UICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGZvciAodD0wOyB0IDwgbk91dHB1dHM7IHQrKykKLSAgICAgICAgICAgICAgICBPdXRbdF0gPSBjbHV0LT5UYWIuVFtpbmRleCArIHRdOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFTYW1wbGVyKEluLCBPdXQsIENhcmdvKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICBpZiAoIShkd0ZsYWdzICYgU0FNUExFUl9JTlNQRUNUKSkgewotCi0gICAgICAgICAgICBpZiAoY2x1dCAtPlRhYi5UICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHQ9MDsgdCA8IG5PdXRwdXRzOyB0KyspCi0gICAgICAgICAgICAgICAgICAgIGNsdXQtPlRhYi5UW2luZGV4ICsgdF0gPSBPdXRbdF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbmRleCArPSBuT3V0cHV0czsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLy8gU2FtZSBhcyBhbnRlcmlvciwgYnV0IGZvciBmbG90aW5nIHBvaW50Ci1jbXNCb29sIENNU0VYUE9SVCBjbXNTdGFnZVNhbXBsZUNMdXRGbG9hdChjbXNTdGFnZSogbXBlLCBjbXNTQU1QTEVSRkxPQVQgU2FtcGxlciwgdm9pZCAqIENhcmdvLCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKLXsKLSAgICBpbnQgaSwgdCwgblRvdGFsUG9pbnRzLCBpbmRleCwgcmVzdDsKLSAgICBpbnQgbklucHV0cywgbk91dHB1dHM7Ci0gICAgY21zVUludDMyTnVtYmVyKiBuU2FtcGxlczsKLSAgICBjbXNGbG9hdDMyTnVtYmVyIEluW01BWF9JTlBVVF9ESU1FTlNJT05TKzFdLCBPdXRbTUFYX1NUQUdFX0NIQU5ORUxTXTsKLSAgICBfY21zU3RhZ2VDTHV0RGF0YSogY2x1dCA9IChfY21zU3RhZ2VDTHV0RGF0YSopIG1wZS0+RGF0YTsKLQotICAgIG5TYW1wbGVzID0gY2x1dC0+UGFyYW1zIC0+blNhbXBsZXM7Ci0gICAgbklucHV0cyAgPSBjbHV0LT5QYXJhbXMgLT5uSW5wdXRzOwotICAgIG5PdXRwdXRzID0gY2x1dC0+UGFyYW1zIC0+bk91dHB1dHM7Ci0KLSAgICBpZiAobklucHV0cyA8PSAwKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKG5PdXRwdXRzIDw9IDApIHJldHVybiBGQUxTRTsKLSAgICBpZiAobklucHV0cyAgPiBNQVhfSU5QVVRfRElNRU5TSU9OUykgcmV0dXJuIEZBTFNFOwotICAgIGlmIChuT3V0cHV0cyA+PSBNQVhfU1RBR0VfQ0hBTk5FTFMpIHJldHVybiBGQUxTRTsKLQotICAgIG5Ub3RhbFBvaW50cyA9IEN1YmVTaXplKG5TYW1wbGVzLCBuSW5wdXRzKTsKLSAgICBpZiAoblRvdGFsUG9pbnRzID09IDApIHJldHVybiBGQUxTRTsKLQotICAgIGluZGV4ID0gMDsKLSAgICBmb3IgKGkgPSAwOyBpIDwgblRvdGFsUG9pbnRzOyBpKyspIHsKLQotICAgICAgICByZXN0ID0gaTsKLSAgICAgICAgZm9yICh0ID0gbklucHV0cy0xOyB0ID49MDsgLS10KSB7Ci0KLSAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgQ29sb3JhbnQgPSByZXN0ICUgblNhbXBsZXNbdF07Ci0KLSAgICAgICAgICAgIHJlc3QgLz0gblNhbXBsZXNbdF07Ci0KLSAgICAgICAgICAgIEluW3RdID0gIChjbXNGbG9hdDMyTnVtYmVyKSAoX2Ntc1F1YW50aXplVmFsKENvbG9yYW50LCBuU2FtcGxlc1t0XSkgLyA2NTUzNS4wKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjbHV0IC0+VGFiLlRGbG9hdCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBmb3IgKHQ9MDsgdCA8IG5PdXRwdXRzOyB0KyspCi0gICAgICAgICAgICAgICAgT3V0W3RdID0gY2x1dC0+VGFiLlRGbG9hdFtpbmRleCArIHRdOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFTYW1wbGVyKEluLCBPdXQsIENhcmdvKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICBpZiAoIShkd0ZsYWdzICYgU0FNUExFUl9JTlNQRUNUKSkgewotCi0gICAgICAgICAgICBpZiAoY2x1dCAtPlRhYi5URmxvYXQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGZvciAodD0wOyB0IDwgbk91dHB1dHM7IHQrKykKLSAgICAgICAgICAgICAgICAgICAgY2x1dC0+VGFiLlRGbG9hdFtpbmRleCArIHRdID0gT3V0W3RdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW5kZXggKz0gbk91dHB1dHM7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotCi0vLyBUaGlzIHJvdXRpbmUgZG9lcyBhIHN3ZWVwIG9uIHdob2xlIGlucHV0IHNwYWNlLCBhbmQgY2FsbHMgaXRzIGNhbGxiYWNrCi0vLyBmdW5jdGlvbiBvbiBrbm90cy4gcmV0dXJucyBUUlVFIGlmIGFsbCBvaywgRkFMU0Ugb3RoZXJ3aXNlLgotY21zQm9vbCBDTVNFWFBPUlQgY21zU2xpY2VTcGFjZTE2KGNtc1VJbnQzMk51bWJlciBuSW5wdXRzLCBjb25zdCBjbXNVSW50MzJOdW1iZXIgY2x1dFBvaW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNTQU1QTEVSMTYgU2FtcGxlciwgdm9pZCAqIENhcmdvKQotewotICAgIGludCBpLCB0LCBuVG90YWxQb2ludHMsIHJlc3Q7Ci0gICAgY21zVUludDE2TnVtYmVyIEluW2Ntc01BWENIQU5ORUxTXTsKLQotICAgIGlmIChuSW5wdXRzID49IGNtc01BWENIQU5ORUxTKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBuVG90YWxQb2ludHMgPSBDdWJlU2l6ZShjbHV0UG9pbnRzLCBuSW5wdXRzKTsKLSAgICBpZiAoblRvdGFsUG9pbnRzID09IDApIHJldHVybiBGQUxTRTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuVG90YWxQb2ludHM7IGkrKykgewotCi0gICAgICAgIHJlc3QgPSBpOwotICAgICAgICBmb3IgKHQgPSBuSW5wdXRzLTE7IHQgPj0wOyAtLXQpIHsKLQotICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICBDb2xvcmFudCA9IHJlc3QgJSBjbHV0UG9pbnRzW3RdOwotCi0gICAgICAgICAgICByZXN0IC89IGNsdXRQb2ludHNbdF07Ci0gICAgICAgICAgICBJblt0XSA9IF9jbXNRdWFudGl6ZVZhbChDb2xvcmFudCwgY2x1dFBvaW50c1t0XSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghU2FtcGxlcihJbiwgTlVMTCwgQ2FyZ28pKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi1jbXNJbnQzMk51bWJlciBDTVNFWFBPUlQgY21zU2xpY2VTcGFjZUZsb2F0KGNtc1VJbnQzMk51bWJlciBuSW5wdXRzLCBjb25zdCBjbXNVSW50MzJOdW1iZXIgY2x1dFBvaW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNTQU1QTEVSRkxPQVQgU2FtcGxlciwgdm9pZCAqIENhcmdvKQotewotICAgIGludCBpLCB0LCBuVG90YWxQb2ludHMsIHJlc3Q7Ci0gICAgY21zRmxvYXQzMk51bWJlciBJbltjbXNNQVhDSEFOTkVMU107Ci0KLSAgICBpZiAobklucHV0cyA+PSBjbXNNQVhDSEFOTkVMUykgcmV0dXJuIEZBTFNFOwotCi0gICAgblRvdGFsUG9pbnRzID0gQ3ViZVNpemUoY2x1dFBvaW50cywgbklucHV0cyk7Ci0gICAgaWYgKG5Ub3RhbFBvaW50cyA9PSAwKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgblRvdGFsUG9pbnRzOyBpKyspIHsKLQotICAgICAgICByZXN0ID0gaTsKLSAgICAgICAgZm9yICh0ID0gbklucHV0cy0xOyB0ID49MDsgLS10KSB7Ci0KLSAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgQ29sb3JhbnQgPSByZXN0ICUgY2x1dFBvaW50c1t0XTsKLQotICAgICAgICAgICAgcmVzdCAvPSBjbHV0UG9pbnRzW3RdOwotICAgICAgICAgICAgSW5bdF0gPSAgKGNtc0Zsb2F0MzJOdW1iZXIpIChfY21zUXVhbnRpemVWYWwoQ29sb3JhbnQsIGNsdXRQb2ludHNbdF0pIC8gNjU1MzUuMCk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICghU2FtcGxlcihJbiwgTlVMTCwgQ2FyZ28pKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gVHlwZSBjbXNTaWdMYWIyWFlaRWxlbVR5cGUKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQotc3RhdGljCi12b2lkIEV2YWx1YXRlTGFiMlhZWihjb25zdCBjbXNGbG9hdDMyTnVtYmVyIEluW10sCi0gICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIE91dFtdLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zU3RhZ2UgKm1wZSkKLXsKLSAgICBjbXNDSUVMYWIgTGFiOwotICAgIGNtc0NJRVhZWiBYWVo7Ci0gICAgY29uc3QgY21zRmxvYXQ2NE51bWJlciBYWVphZGogPSBNQVhfRU5DT0RFQUJMRV9YWVo7Ci0KLSAgICAvLyBWNCBydWxlcwotICAgIExhYi5MID0gSW5bMF0gKiAxMDAuMDsKLSAgICBMYWIuYSA9IEluWzFdICogMjU1LjAgLSAxMjguMDsKLSAgICBMYWIuYiA9IEluWzJdICogMjU1LjAgLSAxMjguMDsKLQotICAgIGNtc0xhYjJYWVooTlVMTCwgJlhZWiwgJkxhYik7Ci0KLSAgICAvLyBGcm9tIFhZWiwgcmFuZ2UgMC4uMTk5OTcgdG8gMC4uMS4wLCBub3RlIHRoYXQgMS45OTk5NyBjb21lcyBmcm9tIDB4ZmZmZgotICAgIC8vIGVuY29kZWQgYXMgMS4xNSBmaXhlZCBwb2ludCwgc28gMSArICgzMjc2Ny4wIC8gMzI3NjguMCkKLQotICAgIE91dFswXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoKGNtc0Zsb2F0NjROdW1iZXIpIFhZWi5YIC8gWFlaYWRqKTsKLSAgICBPdXRbMV0gPSAoY21zRmxvYXQzMk51bWJlcikgKChjbXNGbG9hdDY0TnVtYmVyKSBYWVouWSAvIFhZWmFkaik7Ci0gICAgT3V0WzJdID0gKGNtc0Zsb2F0MzJOdW1iZXIpICgoY21zRmxvYXQ2NE51bWJlcikgWFlaLlogLyBYWVphZGopOwotICAgIHJldHVybjsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobXBlKTsKLX0KLQotCi0vLyBObyBkdXAgb3IgZnJlZSByb3V0aW5lcyBuZWVkZWQsIGFzIHRoZSBzdHJ1Y3R1cmUgaGFzIG5vIHBvaW50ZXJzIGluIGl0LgotY21zU3RhZ2UqIF9jbXNTdGFnZUFsbG9jTGFiMlhZWihjbXNDb250ZXh0IENvbnRleHRJRCkKLXsKLSAgICByZXR1cm4gX2Ntc1N0YWdlQWxsb2NQbGFjZWhvbGRlcihDb250ZXh0SUQsIGNtc1NpZ0xhYjJYWVpFbGVtVHlwZSwgMywgMywgRXZhbHVhdGVMYWIyWFlaLCBOVUxMLCBOVUxMLCBOVUxMKTsKLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotLy8gdjIgTD0xMDAgaXMgc3VwcG9zZWQgdG8gYmUgcGxhY2VkIG9uIDB4RkYwMC4gVGhlcmUgaXMgbm8gcmVhc29uYWJsZQotLy8gbnVtYmVyIG9mIGdyaWRwb2ludHMgdGhhdCB3b3VsZCBtYWtlIGV4YWN0IG1hdGNoLiBIb3dldmVyLCBhIHByZWxpbmVhcml6YXRpb24KLS8vIG9mIDI1OCBlbnRyaWVzLCB3b3VsZCBtYXAgMHhGRjAwIGV4YWN0bHkgb24gZW50cnkgMjU3LCBhbmQgdGhpcyBpcyBnb29kIHRvIGF2b2lkIHNjdW0gZG90LgotLy8gQWxtb3N0IGFsbCB3aGF0IHdlIG5lZWQgYnV0IHVuZm9ydHVuYXRlbHksIHRoZSByZXN0IG9mIGVudHJpZXMgc2hvdWxkIGJlIHNjYWxlZCBieQotLy8gKDI1NSoyNTcvMjU2KSBhbmQgdGhpcyBpcyBub3QgZXhhY3QuCi0KLWNtc1N0YWdlKiBfY21zU3RhZ2VBbGxvY0xhYlYyVG9WNGN1cnZlcyhjbXNDb250ZXh0IENvbnRleHRJRCkKLXsKLSAgICBjbXNTdGFnZSogbXBlOwotICAgIGNtc1RvbmVDdXJ2ZSogTGFiVGFibGVbM107Ci0gICAgaW50IGksIGo7Ci0KLSAgICBMYWJUYWJsZVswXSA9IGNtc0J1aWxkVGFidWxhdGVkVG9uZUN1cnZlMTYoQ29udGV4dElELCAyNTgsIE5VTEwpOwotICAgIExhYlRhYmxlWzFdID0gY21zQnVpbGRUYWJ1bGF0ZWRUb25lQ3VydmUxNihDb250ZXh0SUQsIDI1OCwgTlVMTCk7Ci0gICAgTGFiVGFibGVbMl0gPSBjbXNCdWlsZFRhYnVsYXRlZFRvbmVDdXJ2ZTE2KENvbnRleHRJRCwgMjU4LCBOVUxMKTsKLQotICAgIGZvciAoaj0wOyBqIDwgMzsgaisrKSB7Ci0KLSAgICAgICAgaWYgKExhYlRhYmxlW2pdID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNtc0ZyZWVUb25lQ3VydmVUcmlwbGUoTGFiVGFibGUpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBuZWVkIHRvIG1hcCAqICgweGZmZmYgLyAweGZmMDApLCB0aGF0cyBzYW1lIGFzICgyNTcgLyAyNTYpCi0gICAgICAgIC8vIFNvIHdlIGNhbiB1c2UgMjU4LWVudHJ5IHRhYmxlcyB0byBkbyB0aGUgdHJpY2sgKGkgLyAyNTcpICogKDI1NSAqIDI1NykgKiAoMjU3IC8gMjU2KTsKLSAgICAgICAgZm9yIChpPTA7IGkgPCAyNTc7IGkrKykgIHsKLQotICAgICAgICAgICAgTGFiVGFibGVbal0tPlRhYmxlMTZbaV0gPSAoY21zVUludDE2TnVtYmVyKSAoKGkgKiAweGZmZmYgKyAweDgwKSA+PiA4KTsKLSAgICAgICAgfQotCi0gICAgICAgIExhYlRhYmxlW2pdIC0+VGFibGUxNlsyNTddID0gMHhmZmZmOwotICAgIH0KLQotICAgIG1wZSA9IGNtc1N0YWdlQWxsb2NUb25lQ3VydmVzKENvbnRleHRJRCwgMywgTGFiVGFibGUpOwotICAgIGNtc0ZyZWVUb25lQ3VydmVUcmlwbGUoTGFiVGFibGUpOwotCi0gICAgaWYgKG1wZSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgICBtcGUgLT5JbXBsZW1lbnRzID0gY21zU2lnTGFiVjJ0b1Y0OwotICAgIHJldHVybiBtcGU7Ci19Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLS8vIE1hdHJpeC1iYXNlZCBjb252ZXJzaW9uLCB3aGljaCBpcyBtb3JlIGFjY3VyYXRlLCBidXQgc2xvd2VyIGFuZCBjYW5ub3QgcHJvcGVybHkgYmUgc2F2ZWQgaW4gZGV2aWNlbGluayBwcm9maWxlcwotY21zU3RhZ2UqIF9jbXNTdGFnZUFsbG9jTGFiVjJUb1Y0KGNtc0NvbnRleHQgQ29udGV4dElEKQotewotICAgIHN0YXRpYyBjb25zdCBjbXNGbG9hdDY0TnVtYmVyIFYyVG9WNFtdID0geyA2NTUzNS4wLzY1MjgwLjAsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgNjU1MzUuMC82NTI4MC4wLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDY1NTM1LjAvNjUyODAuMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSAgICBjbXNTdGFnZSAqbXBlID0gY21zU3RhZ2VBbGxvY01hdHJpeChDb250ZXh0SUQsIDMsIDMsIFYyVG9WNCwgTlVMTCk7Ci0KLSAgICBpZiAobXBlID09IE5VTEwpIHJldHVybiBtcGU7Ci0gICAgbXBlIC0+SW1wbGVtZW50cyA9IGNtc1NpZ0xhYlYydG9WNDsKLSAgICByZXR1cm4gbXBlOwotfQotCi0KLS8vIFJldmVyc2UgZGlyZWN0aW9uCi1jbXNTdGFnZSogX2Ntc1N0YWdlQWxsb2NMYWJWNFRvVjIoY21zQ29udGV4dCBDb250ZXh0SUQpCi17Ci0gICAgc3RhdGljIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIgVjRUb1YyW10gPSB7IDY1MjgwLjAvNjU1MzUuMCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCA2NTI4MC4wLzY1NTM1LjAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgNjUyODAuMC82NTUzNS4wCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotICAgICBjbXNTdGFnZSAqbXBlID0gY21zU3RhZ2VBbGxvY01hdHJpeChDb250ZXh0SUQsIDMsIDMsIFY0VG9WMiwgTlVMTCk7Ci0KLSAgICBpZiAobXBlID09IE5VTEwpIHJldHVybiBtcGU7Ci0gICAgbXBlIC0+SW1wbGVtZW50cyA9IGNtc1NpZ0xhYlY0dG9WMjsKLSAgICByZXR1cm4gbXBlOwotfQotCi0KLS8vIFRvIExhYiB0byBmbG9hdC4gTm90ZSB0aGF0IHRoZSBNUEUgZ2l2ZXMgbnVtYmVycyBpbiBub3JtYWwgTGFiIHJhbmdlCi0vLyBhbmQgd2UgbmVlZCAwLi4xLjAgcmFuZ2UgZm9yIHRoZSBmb3JtYXR0ZXJzCi0vLyBMKiA6IDAuLi4xMDAgPT4gMC4uLjEuMCAgKEwqIC8gMTAwKQotLy8gYWIqIDogLTEyOC4uKzEyNyB0byAwLi4xICAoKGFiKiArIDEyOCkgLyAyNTUpCi0KLWNtc1N0YWdlKiBfY21zU3RhZ2VOb3JtYWxpemVGcm9tTGFiRmxvYXQoY21zQ29udGV4dCBDb250ZXh0SUQpCi17Ci0gICAgc3RhdGljIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIgYTFbXSA9IHsKLSAgICAgICAgMS4wLzEwMC4wLCAwLCAwLAotICAgICAgICAwLCAxLjAvMjU1LjAsIDAsCi0gICAgICAgIDAsIDAsIDEuMC8yNTUuMAotICAgIH07Ci0KLSAgICBzdGF0aWMgY29uc3QgY21zRmxvYXQ2NE51bWJlciBvMVtdID0gewotICAgICAgICAwLAotICAgICAgICAxMjguMC8yNTUuMCwKLSAgICAgICAgMTI4LjAvMjU1LjAKLSAgICB9OwotCi0gICAgY21zU3RhZ2UgKm1wZSA9IGNtc1N0YWdlQWxsb2NNYXRyaXgoQ29udGV4dElELCAzLCAzLCBhMSwgbzEpOwotCi0gICAgaWYgKG1wZSA9PSBOVUxMKSByZXR1cm4gbXBlOwotICAgIG1wZSAtPkltcGxlbWVudHMgPSBjbXNTaWdMYWIyRmxvYXRQQ1M7Ci0gICAgcmV0dXJuIG1wZTsKLX0KLQotLy8gRm9tIFhZWiB0byBmbG9hdGluZyBwb2ludCBQQ1MKLWNtc1N0YWdlKiBfY21zU3RhZ2VOb3JtYWxpemVGcm9tWHl6RmxvYXQoY21zQ29udGV4dCBDb250ZXh0SUQpCi17Ci0jZGVmaW5lIG4gKDMyNzY4LjAvNjU1MzUuMCkKLSAgICBzdGF0aWMgY29uc3QgY21zRmxvYXQ2NE51bWJlciBhMVtdID0gewotICAgICAgICBuLCAwLCAwLAotICAgICAgICAwLCBuLCAwLAotICAgICAgICAwLCAwLCBuCi0gICAgfTsKLSN1bmRlZiBuCi0KLSAgICBjbXNTdGFnZSAqbXBlID0gIGNtc1N0YWdlQWxsb2NNYXRyaXgoQ29udGV4dElELCAzLCAzLCBhMSwgTlVMTCk7Ci0KLSAgICBpZiAobXBlID09IE5VTEwpIHJldHVybiBtcGU7Ci0gICAgbXBlIC0+SW1wbGVtZW50cyA9IGNtc1NpZ1hZWjJGbG9hdFBDUzsKLSAgICByZXR1cm4gbXBlOwotfQotCi1jbXNTdGFnZSogX2Ntc1N0YWdlTm9ybWFsaXplVG9MYWJGbG9hdChjbXNDb250ZXh0IENvbnRleHRJRCkKLXsKLSAgICBzdGF0aWMgY29uc3QgY21zRmxvYXQ2NE51bWJlciBhMVtdID0gewotICAgICAgICAxMDAuMCwgMCwgMCwKLSAgICAgICAgMCwgMjU1LjAsIDAsCi0gICAgICAgIDAsIDAsIDI1NS4wCi0gICAgfTsKLQotICAgIHN0YXRpYyBjb25zdCBjbXNGbG9hdDY0TnVtYmVyIG8xW10gPSB7Ci0gICAgICAgIDAsCi0gICAgICAgIC0xMjguMCwKLSAgICAgICAgLTEyOC4wCi0gICAgfTsKLQotICAgIGNtc1N0YWdlICptcGUgPSAgY21zU3RhZ2VBbGxvY01hdHJpeChDb250ZXh0SUQsIDMsIDMsIGExLCBvMSk7Ci0gICAgaWYgKG1wZSA9PSBOVUxMKSByZXR1cm4gbXBlOwotICAgIG1wZSAtPkltcGxlbWVudHMgPSBjbXNTaWdGbG9hdFBDUzJMYWI7Ci0gICAgcmV0dXJuIG1wZTsKLX0KLQotY21zU3RhZ2UqIF9jbXNTdGFnZU5vcm1hbGl6ZVRvWHl6RmxvYXQoY21zQ29udGV4dCBDb250ZXh0SUQpCi17Ci0jZGVmaW5lIG4gKDY1NTM1LjAvMzI3NjguMCkKLQotICAgIHN0YXRpYyBjb25zdCBjbXNGbG9hdDY0TnVtYmVyIGExW10gPSB7Ci0gICAgICAgIG4sIDAsIDAsCi0gICAgICAgIDAsIG4sIDAsCi0gICAgICAgIDAsIDAsIG4KLSAgICB9OwotI3VuZGVmIG4KLQotICAgIGNtc1N0YWdlICptcGUgPSBjbXNTdGFnZUFsbG9jTWF0cml4KENvbnRleHRJRCwgMywgMywgYTEsIE5VTEwpOwotICAgIGlmIChtcGUgPT0gTlVMTCkgcmV0dXJuIG1wZTsKLSAgICBtcGUgLT5JbXBsZW1lbnRzID0gY21zU2lnRmxvYXRQQ1MyWFlaOwotICAgIHJldHVybiBtcGU7Ci19Ci0KLQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gVHlwZSBjbXNTaWdYWVoyTGFiRWxlbVR5cGUKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLXN0YXRpYwotdm9pZCBFdmFsdWF0ZVhZWjJMYWIoY29uc3QgY21zRmxvYXQzMk51bWJlciBJbltdLCBjbXNGbG9hdDMyTnVtYmVyIE91dFtdLCBjb25zdCBjbXNTdGFnZSAqbXBlKQotewotICAgIGNtc0NJRUxhYiBMYWI7Ci0gICAgY21zQ0lFWFlaIFhZWjsKLSAgICBjb25zdCBjbXNGbG9hdDY0TnVtYmVyIFhZWmFkaiA9IE1BWF9FTkNPREVBQkxFX1hZWjsKLQotICAgIC8vIEZyb20gMC4uMS4wIHRvIFhZWgotCi0gICAgWFlaLlggPSBJblswXSAqIFhZWmFkajsKLSAgICBYWVouWSA9IEluWzFdICogWFlaYWRqOwotICAgIFhZWi5aID0gSW5bMl0gKiBYWVphZGo7Ci0KLSAgICBjbXNYWVoyTGFiKE5VTEwsICZMYWIsICZYWVopOwotCi0gICAgLy8gRnJvbSBWNCBMYWIgdG8gMC4uMS4wCi0KLSAgICBPdXRbMF0gPSAoY21zRmxvYXQzMk51bWJlcikgKExhYi5MIC8gMTAwLjApOwotICAgIE91dFsxXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoKExhYi5hICsgMTI4LjApIC8gMjU1LjApOwotICAgIE91dFsyXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoKExhYi5iICsgMTI4LjApIC8gMjU1LjApOwotICAgIHJldHVybjsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobXBlKTsKLX0KLQotY21zU3RhZ2UqIF9jbXNTdGFnZUFsbG9jWFlaMkxhYihjbXNDb250ZXh0IENvbnRleHRJRCkKLXsKLSAgICByZXR1cm4gX2Ntc1N0YWdlQWxsb2NQbGFjZWhvbGRlcihDb250ZXh0SUQsIGNtc1NpZ1hZWjJMYWJFbGVtVHlwZSwgMywgMywgRXZhbHVhdGVYWVoyTGFiLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0vLyBGb3IgdjQsIFMtU2hhcGVkIGN1cnZlcyBhcmUgcGxhY2VkIGluIGEvYiBheGlzIHRvIGluY3JlYXNlIHJlc29sdXRpb24gbmVhciBncmF5Ci0KLWNtc1N0YWdlKiBfY21zU3RhZ2VBbGxvY0xhYlByZWxpbihjbXNDb250ZXh0IENvbnRleHRJRCkKLXsKLSAgICBjbXNUb25lQ3VydmUqIExhYlRhYmxlWzNdOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgUGFyYW1zWzFdID0gIHsyLjR9IDsKLQotICAgIExhYlRhYmxlWzBdID0gY21zQnVpbGRHYW1tYShDb250ZXh0SUQsIDEuMCk7Ci0gICAgTGFiVGFibGVbMV0gPSBjbXNCdWlsZFBhcmFtZXRyaWNUb25lQ3VydmUoQ29udGV4dElELCAxMDgsIFBhcmFtcyk7Ci0gICAgTGFiVGFibGVbMl0gPSBjbXNCdWlsZFBhcmFtZXRyaWNUb25lQ3VydmUoQ29udGV4dElELCAxMDgsIFBhcmFtcyk7Ci0KLSAgICByZXR1cm4gY21zU3RhZ2VBbGxvY1RvbmVDdXJ2ZXMoQ29udGV4dElELCAzLCBMYWJUYWJsZSk7Ci19Ci0KLQotLy8gRnJlZSBhIHNpbmdsZSBNUEUKLXZvaWQgQ01TRVhQT1JUIGNtc1N0YWdlRnJlZShjbXNTdGFnZSogbXBlKQotewotICAgIGlmIChtcGUgLT5GcmVlUHRyKQotICAgICAgICBtcGUgLT5GcmVlUHRyKG1wZSk7Ci0KLSAgICBfY21zRnJlZShtcGUgLT5Db250ZXh0SUQsIG1wZSk7Ci19Ci0KLQotY21zVUludDMyTnVtYmVyICBDTVNFWFBPUlQgY21zU3RhZ2VJbnB1dENoYW5uZWxzKGNvbnN0IGNtc1N0YWdlKiBtcGUpCi17Ci0gICAgcmV0dXJuIG1wZSAtPklucHV0Q2hhbm5lbHM7Ci19Ci0KLWNtc1VJbnQzMk51bWJlciAgQ01TRVhQT1JUIGNtc1N0YWdlT3V0cHV0Q2hhbm5lbHMoY29uc3QgY21zU3RhZ2UqIG1wZSkKLXsKLSAgICByZXR1cm4gbXBlIC0+T3V0cHV0Q2hhbm5lbHM7Ci19Ci0KLWNtc1N0YWdlU2lnbmF0dXJlIENNU0VYUE9SVCBjbXNTdGFnZVR5cGUoY29uc3QgY21zU3RhZ2UqIG1wZSkKLXsKLSAgICByZXR1cm4gbXBlIC0+IFR5cGU7Ci19Ci0KLXZvaWQqIENNU0VYUE9SVCBjbXNTdGFnZURhdGEoY29uc3QgY21zU3RhZ2UqIG1wZSkKLXsKLSAgICByZXR1cm4gbXBlIC0+IERhdGE7Ci19Ci0KLWNtc1N0YWdlKiAgQ01TRVhQT1JUIGNtc1N0YWdlTmV4dChjb25zdCBjbXNTdGFnZSogbXBlKQotewotICAgIHJldHVybiBtcGUgLT4gTmV4dDsKLX0KLQotCi0vLyBEdXBsaWNhdGVzIGFuIE1QRQotY21zU3RhZ2UqIENNU0VYUE9SVCBjbXNTdGFnZUR1cChjbXNTdGFnZSogbXBlKQotewotICAgIGNtc1N0YWdlKiBOZXdNUEU7Ci0KLSAgICBpZiAobXBlID09IE5VTEwpIHJldHVybiBOVUxMOwotICAgIE5ld01QRSA9IF9jbXNTdGFnZUFsbG9jUGxhY2Vob2xkZXIobXBlIC0+Q29udGV4dElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZSAtPlR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlIC0+SW5wdXRDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGUgLT5PdXRwdXRDaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcGUgLT5FdmFsUHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wZSAtPkR1cEVsZW1QdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlIC0+RnJlZVB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICBpZiAoTmV3TVBFID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgTmV3TVBFIC0+SW1wbGVtZW50cyA9IG1wZSAtPkltcGxlbWVudHM7Ci0KLSAgICBpZiAobXBlIC0+RHVwRWxlbVB0cikgewotCi0gICAgICAgIE5ld01QRSAtPkRhdGEgPSBtcGUgLT5EdXBFbGVtUHRyKG1wZSk7Ci0KLSAgICAgICAgaWYgKE5ld01QRS0+RGF0YSA9PSBOVUxMKSB7Ci0KLSAgICAgICAgICAgIGNtc1N0YWdlRnJlZShOZXdNUEUpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgTmV3TVBFIC0+RGF0YSAgICAgICA9IE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5ld01QRTsKLX0KLQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0vLyBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgdGhlIGNoYW5uZWwgY291bnQKLXN0YXRpYwotY21zQm9vbCBCbGVzc0xVVChjbXNQaXBlbGluZSogbHV0KQotewotICAgIC8vIFdlIGNhbiBzZXQgdGhlIGlucHV0L291cHV0IGNoYW5uZWxzIG9ubHkgaWYgd2UgaGF2ZSBlbGVtZW50cy4KLSAgICBpZiAobHV0IC0+RWxlbWVudHMgIT0gTlVMTCkgewotCi0gICAgICAgIGNtc1N0YWdlKiBwcmV2OwotICAgICAgICBjbXNTdGFnZSogbmV4dDsKLSAgICAgICAgY21zU3RhZ2UqIEZpcnN0OwotICAgICAgICBjbXNTdGFnZSogTGFzdDsKLQotICAgICAgICBGaXJzdCAgPSBjbXNQaXBlbGluZUdldFB0clRvRmlyc3RTdGFnZShsdXQpOwotICAgICAgICBMYXN0ICAgPSBjbXNQaXBlbGluZUdldFB0clRvTGFzdFN0YWdlKGx1dCk7Ci0KLSAgICAgICAgaWYgKEZpcnN0ID09IE5VTEwgfHwgTGFzdCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgbHV0LT5JbnB1dENoYW5uZWxzID0gRmlyc3QtPklucHV0Q2hhbm5lbHM7Ci0gICAgICAgIGx1dC0+T3V0cHV0Q2hhbm5lbHMgPSBMYXN0LT5PdXRwdXRDaGFubmVsczsKLQotICAgICAgICAvLyBDaGVjayBjaGFpbiBjb25zaXN0ZW5jeQotICAgICAgICBwcmV2ID0gRmlyc3Q7Ci0gICAgICAgIG5leHQgPSBwcmV2LT5OZXh0OwotCi0gICAgICAgIHdoaWxlIChuZXh0ICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChuZXh0LT5JbnB1dENoYW5uZWxzICE9IHByZXYtPk91dHB1dENoYW5uZWxzKQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICAgICAgbmV4dCA9IG5leHQtPk5leHQ7Ci0gICAgICAgICAgICBwcmV2ID0gcHJldi0+TmV4dDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsgICAgCi19Ci0KLQotLy8gRGVmYXVsdCB0byBldmFsdWF0ZSB0aGUgTFVUIG9uIDE2IGJpdC1iYXNpcy4gUHJlY2lzaW9uIGlzIHJldGFpbmVkLgotc3RhdGljCi12b2lkIF9MVVRldmFsMTYocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIEluW10sIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciBPdXRbXSwgIHJlZ2lzdGVyIGNvbnN0IHZvaWQqIEQpCi17Ci0gICAgY21zUGlwZWxpbmUqIGx1dCA9IChjbXNQaXBlbGluZSopIEQ7Ci0gICAgY21zU3RhZ2UgKm1wZTsKLSAgICBjbXNGbG9hdDMyTnVtYmVyIFN0b3JhZ2VbMl1bTUFYX1NUQUdFX0NIQU5ORUxTXSA9IHswLjBmfTsKLSAgICBpbnQgUGhhc2UgPSAwLCBOZXh0UGhhc2U7Ci0KLSAgICBGcm9tMTZUb0Zsb2F0KEluLCAmU3RvcmFnZVtQaGFzZV1bMF0sIGx1dCAtPklucHV0Q2hhbm5lbHMpOwotCi0gICAgZm9yIChtcGUgPSBsdXQgLT5FbGVtZW50czsKLSAgICAgICAgIG1wZSAhPSBOVUxMOwotICAgICAgICAgbXBlID0gbXBlIC0+TmV4dCkgewotCi0gICAgICAgICAgICAgTmV4dFBoYXNlID0gUGhhc2UgXiAxOwotICAgICAgICAgICAgIG1wZSAtPkV2YWxQdHIoJlN0b3JhZ2VbUGhhc2VdWzBdLCAmU3RvcmFnZVtOZXh0UGhhc2VdWzBdLCBtcGUpOwotICAgICAgICAgICAgIFBoYXNlID0gTmV4dFBoYXNlOwotICAgIH0KLQotCi0gICAgRnJvbUZsb2F0VG8xNigmU3RvcmFnZVtQaGFzZV1bMF0sIE91dCwgbHV0IC0+T3V0cHV0Q2hhbm5lbHMpOwotfQotCi0KLQotLy8gRG9lcyBldmFsdWF0ZSB0aGUgTFVUIG9uIGNtc0Zsb2F0MzJOdW1iZXItYmFzaXMuCi1zdGF0aWMKLXZvaWQgX0xVVGV2YWxGbG9hdChyZWdpc3RlciBjb25zdCBjbXNGbG9hdDMyTnVtYmVyIEluW10sIHJlZ2lzdGVyIGNtc0Zsb2F0MzJOdW1iZXIgT3V0W10sIGNvbnN0IHZvaWQqIEQpCi17Ci0gICAgY21zUGlwZWxpbmUqIGx1dCA9IChjbXNQaXBlbGluZSopIEQ7Ci0gICAgY21zU3RhZ2UgKm1wZTsKLSAgICBjbXNGbG9hdDMyTnVtYmVyIFN0b3JhZ2VbMl1bTUFYX1NUQUdFX0NIQU5ORUxTXSA9IHswLjBmfTsKLSAgICBpbnQgUGhhc2UgPSAwLCBOZXh0UGhhc2U7Ci0KLSAgICBtZW1tb3ZlKCZTdG9yYWdlW1BoYXNlXVswXSwgSW4sIGx1dCAtPklucHV0Q2hhbm5lbHMgICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpKTsKLQotICAgIGZvciAobXBlID0gbHV0IC0+RWxlbWVudHM7Ci0gICAgICAgICBtcGUgIT0gTlVMTDsKLSAgICAgICAgIG1wZSA9IG1wZSAtPk5leHQpIHsKLQotICAgICAgICAgICAgICBOZXh0UGhhc2UgPSBQaGFzZSBeIDE7Ci0gICAgICAgICAgICAgIG1wZSAtPkV2YWxQdHIoJlN0b3JhZ2VbUGhhc2VdWzBdLCAmU3RvcmFnZVtOZXh0UGhhc2VdWzBdLCBtcGUpOwotICAgICAgICAgICAgICBQaGFzZSA9IE5leHRQaGFzZTsKLSAgICB9Ci0KLSAgICBtZW1tb3ZlKE91dCwgJlN0b3JhZ2VbUGhhc2VdWzBdLCBsdXQgLT5PdXRwdXRDaGFubmVscyAqIHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKSk7Ci19Ci0KLQotCi0KLS8vIExVVCBDcmVhdGlvbiAmIERlc3RydWN0aW9uCi0KLWNtc1BpcGVsaW5lKiBDTVNFWFBPUlQgY21zUGlwZWxpbmVBbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIElucHV0Q2hhbm5lbHMsIGNtc1VJbnQzMk51bWJlciBPdXRwdXRDaGFubmVscykKLXsKLSAgICAgICBjbXNQaXBlbGluZSogTmV3TFVUOwotCi0gICAgICAgLy8gQSB2YWx1ZSBvZiB6ZXJvIGluIGNoYW5uZWxzIGlzIGFsbG93ZWQgYXMgcGxhY2Vob2xkZXIKLSAgICAgICBpZiAoSW5wdXRDaGFubmVscyA+PSBjbXNNQVhDSEFOTkVMUyB8fAotICAgICAgICAgICBPdXRwdXRDaGFubmVscyA+PSBjbXNNQVhDSEFOTkVMUykgcmV0dXJuIE5VTEw7Ci0KLSAgICAgICBOZXdMVVQgPSAoY21zUGlwZWxpbmUqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihjbXNQaXBlbGluZSkpOwotICAgICAgIGlmIChOZXdMVVQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLQotICAgICAgIE5ld0xVVCAtPiBJbnB1dENoYW5uZWxzICA9IElucHV0Q2hhbm5lbHM7Ci0gICAgICAgTmV3TFVUIC0+IE91dHB1dENoYW5uZWxzID0gT3V0cHV0Q2hhbm5lbHM7Ci0KLSAgICAgICBOZXdMVVQgLT5FdmFsMTZGbiAgICA9IF9MVVRldmFsMTY7Ci0gICAgICAgTmV3TFVUIC0+RXZhbEZsb2F0Rm4gPSBfTFVUZXZhbEZsb2F0OwotICAgICAgIE5ld0xVVCAtPkR1cERhdGFGbiAgID0gTlVMTDsKLSAgICAgICBOZXdMVVQgLT5GcmVlRGF0YUZuICA9IE5VTEw7Ci0gICAgICAgTmV3TFVUIC0+RGF0YSAgICAgICAgPSBOZXdMVVQ7Ci0gICAgICAgTmV3TFVUIC0+Q29udGV4dElEICAgPSBDb250ZXh0SUQ7Ci0KLSAgICAgICBpZiAoIUJsZXNzTFVUKE5ld0xVVCkpCi0gICAgICAgewotICAgICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIE5ld0xVVCk7Ci0gICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgIH0KLQotICAgICAgIHJldHVybiBOZXdMVVQ7Ci19Ci0KLWNtc0NvbnRleHQgQ01TRVhQT1JUIGNtc0dldFBpcGVsaW5lQ29udGV4dElEKGNvbnN0IGNtc1BpcGVsaW5lKiBsdXQpCi17Ci0gICAgX2Ntc0Fzc2VydChsdXQgIT0gTlVMTCk7Ci0gICAgcmV0dXJuIGx1dCAtPkNvbnRleHRJRDsKLX0KLQotY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNQaXBlbGluZUlucHV0Q2hhbm5lbHMoY29uc3QgY21zUGlwZWxpbmUqIGx1dCkKLXsKLSAgICBfY21zQXNzZXJ0KGx1dCAhPSBOVUxMKTsKLSAgICByZXR1cm4gbHV0IC0+SW5wdXRDaGFubmVsczsKLX0KLQotY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNQaXBlbGluZU91dHB1dENoYW5uZWxzKGNvbnN0IGNtc1BpcGVsaW5lKiBsdXQpCi17Ci0gICAgX2Ntc0Fzc2VydChsdXQgIT0gTlVMTCk7Ci0gICAgcmV0dXJuIGx1dCAtPk91dHB1dENoYW5uZWxzOwotfQotCi0vLyBGcmVlIGEgcHJvZmlsZSBlbGVtZW50cyBMVVQKLXZvaWQgQ01TRVhQT1JUIGNtc1BpcGVsaW5lRnJlZShjbXNQaXBlbGluZSogbHV0KQotewotICAgIGNtc1N0YWdlICptcGUsICpOZXh0OwotCi0gICAgaWYgKGx1dCA9PSBOVUxMKSByZXR1cm47Ci0KLSAgICBmb3IgKG1wZSA9IGx1dCAtPkVsZW1lbnRzOwotICAgICAgICBtcGUgIT0gTlVMTDsKLSAgICAgICAgbXBlID0gTmV4dCkgewotCi0gICAgICAgICAgICBOZXh0ID0gbXBlIC0+TmV4dDsKLSAgICAgICAgICAgIGNtc1N0YWdlRnJlZShtcGUpOwotICAgIH0KLQotICAgIGlmIChsdXQgLT5GcmVlRGF0YUZuKSBsdXQgLT5GcmVlRGF0YUZuKGx1dCAtPkNvbnRleHRJRCwgbHV0IC0+RGF0YSk7Ci0KLSAgICBfY21zRnJlZShsdXQgLT5Db250ZXh0SUQsIGx1dCk7Ci19Ci0KLQotLy8gRGVmYXVsdCB0byBldmFsdWF0ZSB0aGUgTFVUIG9uIDE2IGJpdC1iYXNpcy4KLXZvaWQgQ01TRVhQT1JUIGNtc1BpcGVsaW5lRXZhbDE2KGNvbnN0IGNtc1VJbnQxNk51bWJlciBJbltdLCBjbXNVSW50MTZOdW1iZXIgT3V0W10sICBjb25zdCBjbXNQaXBlbGluZSogbHV0KQotewotICAgIF9jbXNBc3NlcnQobHV0ICE9IE5VTEwpOwotICAgIGx1dCAtPkV2YWwxNkZuKEluLCBPdXQsIGx1dC0+RGF0YSk7Ci19Ci0KLQotLy8gRG9lcyBldmFsdWF0ZSB0aGUgTFVUIG9uIGNtc0Zsb2F0MzJOdW1iZXItYmFzaXMuCi12b2lkIENNU0VYUE9SVCBjbXNQaXBlbGluZUV2YWxGbG9hdChjb25zdCBjbXNGbG9hdDMyTnVtYmVyIEluW10sIGNtc0Zsb2F0MzJOdW1iZXIgT3V0W10sIGNvbnN0IGNtc1BpcGVsaW5lKiBsdXQpCi17Ci0gICAgX2Ntc0Fzc2VydChsdXQgIT0gTlVMTCk7Ci0gICAgbHV0IC0+RXZhbEZsb2F0Rm4oSW4sIE91dCwgbHV0KTsKLX0KLQotCi0KLS8vIER1cGxpY2F0ZXMgYSBMVVQKLWNtc1BpcGVsaW5lKiBDTVNFWFBPUlQgY21zUGlwZWxpbmVEdXAoY29uc3QgY21zUGlwZWxpbmUqIGx1dCkKLXsKLSAgICBjbXNQaXBlbGluZSogTmV3TFVUOwotICAgIGNtc1N0YWdlICpOZXdNUEUsICpBbnRlcmlvciA9IE5VTEwsICptcGU7Ci0gICAgY21zQm9vbCAgRmlyc3QgPSBUUlVFOwotCi0gICAgaWYgKGx1dCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIE5ld0xVVCA9IGNtc1BpcGVsaW5lQWxsb2MobHV0IC0+Q29udGV4dElELCBsdXQgLT5JbnB1dENoYW5uZWxzLCBsdXQgLT5PdXRwdXRDaGFubmVscyk7Ci0gICAgaWYgKE5ld0xVVCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIGZvciAobXBlID0gbHV0IC0+RWxlbWVudHM7Ci0gICAgICAgICBtcGUgIT0gTlVMTDsKLSAgICAgICAgIG1wZSA9IG1wZSAtPk5leHQpIHsKLQotICAgICAgICAgICAgIE5ld01QRSA9IGNtc1N0YWdlRHVwKG1wZSk7Ci0KLSAgICAgICAgICAgICBpZiAoTmV3TVBFID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgY21zUGlwZWxpbmVGcmVlKE5ld0xVVCk7Ci0gICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgIGlmIChGaXJzdCkgewotICAgICAgICAgICAgICAgICBOZXdMVVQgLT5FbGVtZW50cyA9IE5ld01QRTsKLSAgICAgICAgICAgICAgICAgRmlyc3QgPSBGQUxTRTsKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgQW50ZXJpb3IgLT5OZXh0ID0gTmV3TVBFOwotICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQW50ZXJpb3IgPSBOZXdNUEU7Ci0gICAgfQotCi0gICAgTmV3TFVUIC0+RXZhbDE2Rm4gICAgPSBsdXQgLT5FdmFsMTZGbjsKLSAgICBOZXdMVVQgLT5FdmFsRmxvYXRGbiA9IGx1dCAtPkV2YWxGbG9hdEZuOwotICAgIE5ld0xVVCAtPkR1cERhdGFGbiAgID0gbHV0IC0+RHVwRGF0YUZuOwotICAgIE5ld0xVVCAtPkZyZWVEYXRhRm4gID0gbHV0IC0+RnJlZURhdGFGbjsKLQotICAgIGlmIChOZXdMVVQgLT5EdXBEYXRhRm4gIT0gTlVMTCkKLSAgICAgICAgTmV3TFVUIC0+RGF0YSA9IE5ld0xVVCAtPkR1cERhdGFGbihsdXQgLT5Db250ZXh0SUQsIGx1dC0+RGF0YSk7Ci0KLQotICAgIE5ld0xVVCAtPlNhdmVBczhCaXRzICAgID0gbHV0IC0+U2F2ZUFzOEJpdHM7Ci0KLSAgICBpZiAoIUJsZXNzTFVUKE5ld0xVVCkpCi0gICAgewotICAgICAgICBfY21zRnJlZShsdXQtPkNvbnRleHRJRCwgTmV3TFVUKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5ld0xVVDsKLX0KLQotCi1pbnQgQ01TRVhQT1JUIGNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoY21zUGlwZWxpbmUqIGx1dCwgY21zU3RhZ2VMb2MgbG9jLCBjbXNTdGFnZSogbXBlKQotewotICAgIGNtc1N0YWdlKiBBbnRlcmlvciA9IE5VTEwsICpwdDsKLQotICAgIGlmIChsdXQgPT0gTlVMTCB8fCBtcGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgc3dpdGNoIChsb2MpIHsKLQotICAgICAgICBjYXNlIGNtc0FUX0JFR0lOOgotICAgICAgICAgICAgbXBlIC0+TmV4dCA9IGx1dCAtPkVsZW1lbnRzOwotICAgICAgICAgICAgbHV0IC0+RWxlbWVudHMgPSBtcGU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGNtc0FUX0VORDoKLQotICAgICAgICAgICAgaWYgKGx1dCAtPkVsZW1lbnRzID09IE5VTEwpCi0gICAgICAgICAgICAgICAgbHV0IC0+RWxlbWVudHMgPSBtcGU7Ci0gICAgICAgICAgICBlbHNlIHsKLQotICAgICAgICAgICAgICAgIGZvciAocHQgPSBsdXQgLT5FbGVtZW50czsKLSAgICAgICAgICAgICAgICAgICAgIHB0ICE9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICBwdCA9IHB0IC0+IE5leHQpIEFudGVyaW9yID0gcHQ7Ci0KLSAgICAgICAgICAgICAgICBBbnRlcmlvciAtPk5leHQgPSBtcGU7Ci0gICAgICAgICAgICAgICAgbXBlIC0+TmV4dCA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDo7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgcmV0dXJuIEJsZXNzTFVUKGx1dCk7ICAgIAotfQotCi0vLyBVbmxpbmsgYW4gZWxlbWVudCBhbmQgcmV0dXJuIHRoZSBwb2ludGVyIHRvIGl0Ci12b2lkIENNU0VYUE9SVCBjbXNQaXBlbGluZVVubGlua1N0YWdlKGNtc1BpcGVsaW5lKiBsdXQsIGNtc1N0YWdlTG9jIGxvYywgY21zU3RhZ2UqKiBtcGUpCi17Ci0gICAgY21zU3RhZ2UgKkFudGVyaW9yLCAqcHQsICpMYXN0OwotICAgIGNtc1N0YWdlICpVbmxpbmtlZCA9IE5VTEw7Ci0KLQotICAgIC8vIElmIGVtcHR5IExVVCwgdGhlcmUgaXMgbm90aGluZyB0byByZW1vdmUKLSAgICBpZiAobHV0IC0+RWxlbWVudHMgPT0gTlVMTCkgewotICAgICAgICBpZiAobXBlKSAqbXBlID0gTlVMTDsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIE9uIGRlcGVuZGluZyBvbiB0aGUgc3RyYXRlZ3kuLi4KLSAgICBzd2l0Y2ggKGxvYykgewotCi0gICAgICAgIGNhc2UgY21zQVRfQkVHSU46Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY21zU3RhZ2UqIGVsZW0gPSBsdXQgLT5FbGVtZW50czsKLQotICAgICAgICAgICAgICAgIGx1dCAtPkVsZW1lbnRzID0gZWxlbSAtPiBOZXh0OwotICAgICAgICAgICAgICAgIGVsZW0gLT5OZXh0ID0gTlVMTDsKLSAgICAgICAgICAgICAgICBVbmxpbmtlZCA9IGVsZW07Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgY21zQVRfRU5EOgotICAgICAgICAgICAgQW50ZXJpb3IgPSBMYXN0ID0gTlVMTDsKLSAgICAgICAgICAgIGZvciAocHQgPSBsdXQgLT5FbGVtZW50czsKLSAgICAgICAgICAgICAgICBwdCAhPSBOVUxMOwotICAgICAgICAgICAgICAgIHB0ID0gcHQgLT4gTmV4dCkgewotICAgICAgICAgICAgICAgICAgICBBbnRlcmlvciA9IExhc3Q7Ci0gICAgICAgICAgICAgICAgICAgIExhc3QgPSBwdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVW5saW5rZWQgPSBMYXN0OyAgLy8gTmV4dCBhbHJlYWR5IHBvaW50cyB0byBOVUxMCi0KLSAgICAgICAgICAgIC8vIFRydW5jYXRlIHRoZSBjaGFpbgotICAgICAgICAgICAgaWYgKEFudGVyaW9yKQotICAgICAgICAgICAgICAgIEFudGVyaW9yIC0+TmV4dCA9IE5VTEw7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbHV0IC0+RWxlbWVudHMgPSBOVUxMOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6OwotICAgIH0KLQotICAgIGlmIChtcGUpCi0gICAgICAgICptcGUgPSBVbmxpbmtlZDsKLSAgICBlbHNlCi0gICAgICAgIGNtc1N0YWdlRnJlZShVbmxpbmtlZCk7Ci0KLSAgICAvLyBNYXkgZmFpbCwgYnV0IHdlIGlnbm9yZSBpdAotICAgIEJsZXNzTFVUKGx1dCk7Ci19Ci0KLQotLy8gQ29uY2F0ZW5hdGUgdHdvIExVVCBpbnRvIGEgbmV3IHNpbmdsZSBvbmUKLWNtc0Jvb2wgIENNU0VYUE9SVCBjbXNQaXBlbGluZUNhdChjbXNQaXBlbGluZSogbDEsIGNvbnN0IGNtc1BpcGVsaW5lKiBsMikKLXsKLSAgICBjbXNTdGFnZSogbXBlOwotCi0gICAgLy8gSWYgYm90aCBMVVRTIGRvZXMgbm90IGhhdmUgZWxlbWVudHMsIHdlIG5lZWQgdG8gaW5oZXJpdAotICAgIC8vIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKLSAgICBpZiAobDEgLT5FbGVtZW50cyA9PSBOVUxMICYmIGwyIC0+RWxlbWVudHMgPT0gTlVMTCkgewotICAgICAgICBsMSAtPklucHV0Q2hhbm5lbHMgID0gbDIgLT5JbnB1dENoYW5uZWxzOwotICAgICAgICBsMSAtPk91dHB1dENoYW5uZWxzID0gbDIgLT5PdXRwdXRDaGFubmVsczsKLSAgICB9Ci0KLSAgICAvLyBDYXQgc2Vjb25kCi0gICAgZm9yIChtcGUgPSBsMiAtPkVsZW1lbnRzOwotICAgICAgICAgbXBlICE9IE5VTEw7Ci0gICAgICAgICBtcGUgPSBtcGUgLT5OZXh0KSB7Ci0KLSAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gZHVwIGVhY2ggZWxlbWVudAotICAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKGwxLCBjbXNBVF9FTkQsIGNtc1N0YWdlRHVwKG1wZSkpKQotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gQmxlc3NMVVQobDEpOyAgICAKLX0KLQotCi1jbXNCb29sIENNU0VYUE9SVCBjbXNQaXBlbGluZVNldFNhdmVBczhiaXRzRmxhZyhjbXNQaXBlbGluZSogbHV0LCBjbXNCb29sIE9uKQotewotICAgIGNtc0Jvb2wgQW50ZXJpb3IgPSBsdXQgLT5TYXZlQXM4Qml0czsKLQotICAgIGx1dCAtPlNhdmVBczhCaXRzID0gT247Ci0gICAgcmV0dXJuIEFudGVyaW9yOwotfQotCi0KLWNtc1N0YWdlKiBDTVNFWFBPUlQgY21zUGlwZWxpbmVHZXRQdHJUb0ZpcnN0U3RhZ2UoY29uc3QgY21zUGlwZWxpbmUqIGx1dCkKLXsKLSAgICByZXR1cm4gbHV0IC0+RWxlbWVudHM7Ci19Ci0KLWNtc1N0YWdlKiBDTVNFWFBPUlQgY21zUGlwZWxpbmVHZXRQdHJUb0xhc3RTdGFnZShjb25zdCBjbXNQaXBlbGluZSogbHV0KQotewotICAgIGNtc1N0YWdlICptcGUsICpBbnRlcmlvciA9IE5VTEw7Ci0KLSAgICBmb3IgKG1wZSA9IGx1dCAtPkVsZW1lbnRzOyBtcGUgIT0gTlVMTDsgbXBlID0gbXBlIC0+TmV4dCkKLSAgICAgICAgQW50ZXJpb3IgPSBtcGU7Ci0KLSAgICByZXR1cm4gQW50ZXJpb3I7Ci19Ci0KLWNtc1VJbnQzMk51bWJlciBDTVNFWFBPUlQgY21zUGlwZWxpbmVTdGFnZUNvdW50KGNvbnN0IGNtc1BpcGVsaW5lKiBsdXQpCi17Ci0gICAgY21zU3RhZ2UgKm1wZTsKLSAgICBjbXNVSW50MzJOdW1iZXIgbjsKLQotICAgIGZvciAobj0wLCBtcGUgPSBsdXQgLT5FbGVtZW50czsgbXBlICE9IE5VTEw7IG1wZSA9IG1wZSAtPk5leHQpCi0gICAgICAgICAgICBuKys7Ci0KLSAgICByZXR1cm4gbjsKLX0KLQotLy8gVGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byBzZXQgdGhlIG9wdGlvbmFsIGV2YWx1YXRvciBhbmQgYSBibG9jayBvZiBwcml2YXRlIGRhdGEuIElmIHByaXZhdGUgZGF0YSBpcyBiZWluZyB1c2VkLCBhbiBvcHRpb25hbAotLy8gZHVwbGljYXRvciBhbmQgZnJlZSBmdW5jdGlvbnMgc2hvdWxkIGFsc28gYmUgc3BlY2lmaWVkIGluIG9yZGVyIHRvIGR1cGxpY2F0ZSB0aGUgTFVUIGNvbnN0cnVjdC4gVXNlIE5VTEwgdG8gaW5oaWJpdCBzdWNoIGZ1bmN0aW9uYWxpdHkuCi12b2lkIENNU0VYUE9SVCBfY21zUGlwZWxpbmVTZXRPcHRpbWl6YXRpb25QYXJhbWV0ZXJzKGNtc1BpcGVsaW5lKiBMdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Ntc09QVGV2YWwxNkZuIEV2YWwxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBQcml2YXRlRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY21zRnJlZVVzZXJEYXRhRm4gRnJlZVByaXZhdGVEYXRhRm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Ntc0R1cFVzZXJEYXRhRm4gIER1cFByaXZhdGVEYXRhRm4pCi17Ci0KLSAgICBMdXQgLT5FdmFsMTZGbiA9IEV2YWwxNjsKLSAgICBMdXQgLT5EdXBEYXRhRm4gPSBEdXBQcml2YXRlRGF0YUZuOwotICAgIEx1dCAtPkZyZWVEYXRhRm4gPSBGcmVlUHJpdmF0ZURhdGFGbjsKLSAgICBMdXQgLT5EYXRhID0gUHJpdmF0ZURhdGE7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmV2ZXJzZSBpbnRlcnBvbGF0aW9uCi0vLyBIZXJlJ3MgaG93IGl0IGdvZXMuIFRoZSBkZXJpdmF0aXZlIERmKHgpIG9mIHRoZSBmdW5jdGlvbiBmIGlzIHRoZSBsaW5lYXIKLS8vIHRyYW5zZm9ybWF0aW9uIHRoYXQgYmVzdCBhcHByb3hpbWF0ZXMgZiBuZWFyIHRoZSBwb2ludCB4LiBJdCBjYW4gYmUgcmVwcmVzZW50ZWQKLS8vIGJ5IGEgbWF0cml4IEEgd2hvc2UgZW50cmllcyBhcmUgdGhlIHBhcnRpYWwgZGVyaXZhdGl2ZXMgb2YgdGhlIGNvbXBvbmVudHMgb2YgZgotLy8gd2l0aCByZXNwZWN0IHRvIGFsbCB0aGUgY29vcmRpbmF0ZXMuIFRoaXMgaXMga25vdyBhcyB0aGUgSmFjb2JpYW4KLS8vCi0vLyBUaGUgYmVzdCBsaW5lYXIgYXBwcm94aW1hdGlvbiB0byBmIGlzIGdpdmVuIGJ5IHRoZSBtYXRyaXggZXF1YXRpb246Ci0vLwotLy8geS15MCA9IEEgKHgteDApCi0vLwotLy8gU28sIGlmIHgwIGlzIGEgZ29vZCAiZ3Vlc3MiIGZvciB0aGUgemVybyBvZiBmLCB0aGVuIHNvbHZpbmcgZm9yIHRoZSB6ZXJvIG9mIHRoaXMKLS8vIGxpbmVhciBhcHByb3hpbWF0aW9uIHdpbGwgZ2l2ZSBhICJiZXR0ZXIgZ3Vlc3MiIGZvciB0aGUgemVybyBvZiBmLiBUaHVzIGxldCB5PTAsCi0vLyBhbmQgc2luY2UgeTA9Zih4MCkgb25lIGNhbiBzb2x2ZSB0aGUgYWJvdmUgZXF1YXRpb24gZm9yIHguIFRoaXMgbGVhZHMgdG8gdGhlCi0vLyBOZXd0b24ncyBtZXRob2QgZm9ybXVsYToKLS8vCi0vLyB4bisxID0geG4gLSBBLTEgZih4bikKLS8vCi0vLyB3aGVyZSB4bisxIGRlbm90ZXMgdGhlIChuKzEpLXN0IGd1ZXNzLCBvYnRhaW5lZCBmcm9tIHRoZSBuLXRoIGd1ZXNzIHhuIGluIHRoZQotLy8gZmFzaGlvbiBkZXNjcmliZWQgYWJvdmUuIEl0ZXJhdGluZyB0aGlzIHdpbGwgZ2l2ZSBiZXR0ZXIgYW5kIGJldHRlciBhcHByb3hpbWF0aW9ucwotLy8gaWYgeW91IGhhdmUgYSAiZ29vZCBlbm91Z2giIGluaXRpYWwgZ3Vlc3MuCi0KLQotI2RlZmluZSBKQUNPQklBTl9FUFNJTE9OICAgICAgICAgICAgMC4wMDFmCi0jZGVmaW5lIElOVkVSU0lPTl9NQVhfSVRFUkFUSU9OUyAgICAzMAotCi0vLyBJbmNyZW1lbnQgd2l0aCByZWZsZXhpb24gb24gYm91bmRhcnkKLXN0YXRpYwotdm9pZCBJbmNEZWx0YShjbXNGbG9hdDMyTnVtYmVyICpWYWwpCi17Ci0gICAgaWYgKCpWYWwgPCAoMS4wIC0gSkFDT0JJQU5fRVBTSUxPTikpCi0KLSAgICAgICAgKlZhbCArPSBKQUNPQklBTl9FUFNJTE9OOwotCi0gICAgZWxzZQotICAgICAgICAqVmFsIC09IEpBQ09CSUFOX0VQU0lMT047Ci0KLX0KLQotCi0KLS8vIEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWN0b3JzIG9mIG4gZWxlbWVudHMgZWFjaCBvbmUKLXN0YXRpYwotY21zRmxvYXQzMk51bWJlciBFdWNsaWRlYW5EaXN0YW5jZShjbXNGbG9hdDMyTnVtYmVyIGFbXSwgY21zRmxvYXQzMk51bWJlciBiW10sIGludCBuKQotewotICAgIGNtc0Zsb2F0MzJOdW1iZXIgc3VtID0gMDsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgZGlmID0gYltpXSAtIGFbaV07Ci0gICAgICAgIHN1bSArPSAgZGlmICogZGlmOwotICAgIH0KLQotICAgIHJldHVybiBzcXJ0ZihzdW0pOwotfQotCi0KLS8vIEV2YWx1YXRlIGEgTFVUIGluIHJldmVyc2UgZGlyZWN0aW9uLiBJdCBvbmx5IHNlYXJjaGVzIG9uIDMtPjMgTFVULiBVc2VzIE5ld3RvbiBtZXRob2QKLS8vCi0vLyB4MSA8LSB4IC0gW0ooeCldXi0xICogZih4KQotLy8KLS8vIGx1dDogVGhlIExVVCBvbiB3aGVyZSB0byBkbyB0aGUgc2VhcmNoCi0vLyBUYXJnZXQ6IExhYkssIDMgdmFsdWVzIG9mIExhYiBwbHVzIGRlc3RpbmF0aW9uIEsgd2hpY2ggaXMgZml4ZWQKLS8vIFJlc3VsdDogVGhlIG9idGFpbmVkIENNWUsKLS8vIEhpbnQ6ICAgTG9jYXRpb24gd2hlcmUgYmVnaW4gdGhlIHNlYXJjaAotCi1jbXNCb29sIENNU0VYUE9SVCBjbXNQaXBlbGluZUV2YWxSZXZlcnNlRmxvYXQoY21zRmxvYXQzMk51bWJlciBUYXJnZXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIFJlc3VsdFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgSGludFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1BpcGVsaW5lKiBsdXQpCi17Ci0gICAgY21zVUludDMyTnVtYmVyICBpLCBqOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgIGVycm9yLCBMYXN0RXJyb3IgPSAxRTIwOwotICAgIGNtc0Zsb2F0MzJOdW1iZXIgIGZ4WzRdLCB4WzRdLCB4ZFs0XSwgZnhkWzRdOwotICAgIGNtc1ZFQzMgdG1wLCB0bXAyOwotICAgIGNtc01BVDMgSmFjb2JpYW47Ci0gICAgCi0gICAgLy8gT25seSAzLT4zIGFuZCA0LT4zIGFyZSBzdXBwb3J0ZWQKLSAgICBpZiAobHV0IC0+SW5wdXRDaGFubmVscyAhPSAzICYmIGx1dCAtPklucHV0Q2hhbm5lbHMgIT0gNCkgcmV0dXJuIEZBTFNFOwotICAgIGlmIChsdXQgLT5PdXRwdXRDaGFubmVscyAhPSAzKSByZXR1cm4gRkFMU0U7Ci0gICAKLSAgICAvLyBUYWtlIHRoZSBoaW50IGFzIHN0YXJ0aW5nIHBvaW50IGlmIHNwZWNpZmllZAotICAgIGlmIChIaW50ID09IE5VTEwpIHsKLQotICAgICAgICAvLyBCZWdpbiBhdCBhbnkgcG9pbnQsIHdlIGNob29zZSAxLzMgb2YgQ01ZIGF4aXMKLSAgICAgICAgeFswXSA9IHhbMV0gPSB4WzJdID0gMC4zZjsKLSAgICB9Ci0gICAgZWxzZSB7Ci0KLSAgICAgICAgLy8gT25seSBjb3B5IDMgY2hhbm5lbHMgZnJvbSBoaW50Li4uCi0gICAgICAgIGZvciAoaj0wOyBqIDwgMzsgaisrKQotICAgICAgICAgICAgeFtqXSA9IEhpbnRbal07Ci0gICAgfQotCi0gICAgLy8gSWYgTHV0IGlzIDQtZGltZW5zaW9ucywgdGhlbiBncmFiIHRhcmdldFszXSwgd2hpY2ggaXMgZml4ZWQKLSAgICBpZiAobHV0IC0+SW5wdXRDaGFubmVscyA9PSA0KSB7Ci0gICAgICAgIHhbM10gPSBUYXJnZXRbM107Ci0gICAgfQotICAgIGVsc2UgeFszXSA9IDA7IC8vIFRvIGtlZXAgbGludCBoYXBweQotCi0KLSAgICAvLyBJdGVyYXRlCi0gICAgZm9yIChpID0gMDsgaSA8IElOVkVSU0lPTl9NQVhfSVRFUkFUSU9OUzsgaSsrKSB7Ci0KLSAgICAgICAgLy8gR2V0IGJlZ2lubmluZyBmeAotICAgICAgICBjbXNQaXBlbGluZUV2YWxGbG9hdCh4LCBmeCwgbHV0KTsKLQotICAgICAgICAvLyBDb21wdXRlIGVycm9yCi0gICAgICAgIGVycm9yID0gRXVjbGlkZWFuRGlzdGFuY2UoZngsIFRhcmdldCwgMyk7Ci0KLSAgICAgICAgLy8gSWYgbm90IGNvbnZlcmdlbnQsIHJldHVybiBsYXN0IHNhZmUgdmFsdWUKLSAgICAgICAgaWYgKGVycm9yID49IExhc3RFcnJvcikKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIEtlZXAgbGF0ZXN0IHZhbHVlcwotICAgICAgICBMYXN0RXJyb3IgICAgID0gZXJyb3I7Ci0gICAgICAgIGZvciAoaj0wOyBqIDwgbHV0IC0+SW5wdXRDaGFubmVsczsgaisrKQotICAgICAgICAgICAgICAgIFJlc3VsdFtqXSA9IHhbal07Ci0KLSAgICAgICAgLy8gRm91bmQgYW4gZXhhY3QgbWF0Y2g/Ci0gICAgICAgIGlmIChlcnJvciA8PSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgLy8gT2J0YWluIHNsb3BlICh0aGUgSmFjb2JpYW4pCi0gICAgICAgIGZvciAoaiA9IDA7IGogPCAzOyBqKyspIHsKLQotICAgICAgICAgICAgeGRbMF0gPSB4WzBdOwotICAgICAgICAgICAgeGRbMV0gPSB4WzFdOwotICAgICAgICAgICAgeGRbMl0gPSB4WzJdOwotICAgICAgICAgICAgeGRbM10gPSB4WzNdOyAgLy8gS2VlcCBmaXhlZCBjaGFubmVsCi0KLSAgICAgICAgICAgIEluY0RlbHRhKCZ4ZFtqXSk7Ci0KLSAgICAgICAgICAgIGNtc1BpcGVsaW5lRXZhbEZsb2F0KHhkLCBmeGQsIGx1dCk7Ci0KLSAgICAgICAgICAgIEphY29iaWFuLnZbMF0ubltqXSA9ICgoZnhkWzBdIC0gZnhbMF0pIC8gSkFDT0JJQU5fRVBTSUxPTik7Ci0gICAgICAgICAgICBKYWNvYmlhbi52WzFdLm5bal0gPSAoKGZ4ZFsxXSAtIGZ4WzFdKSAvIEpBQ09CSUFOX0VQU0lMT04pOwotICAgICAgICAgICAgSmFjb2JpYW4udlsyXS5uW2pdID0gKChmeGRbMl0gLSBmeFsyXSkgLyBKQUNPQklBTl9FUFNJTE9OKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNvbHZlIHN5c3RlbQotICAgICAgICB0bXAyLm5bMF0gPSBmeFswXSAtIFRhcmdldFswXTsKLSAgICAgICAgdG1wMi5uWzFdID0gZnhbMV0gLSBUYXJnZXRbMV07Ci0gICAgICAgIHRtcDIublsyXSA9IGZ4WzJdIC0gVGFyZ2V0WzJdOwotCi0gICAgICAgIGlmICghX2Ntc01BVDNzb2x2ZSgmdG1wLCAmSmFjb2JpYW4sICZ0bXAyKSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgICAgICAvLyBNb3ZlIG91ciBndWVzcwotICAgICAgICB4WzBdIC09IChjbXNGbG9hdDMyTnVtYmVyKSB0bXAublswXTsKLSAgICAgICAgeFsxXSAtPSAoY21zRmxvYXQzMk51bWJlcikgdG1wLm5bMV07Ci0gICAgICAgIHhbMl0gLT0gKGNtc0Zsb2F0MzJOdW1iZXIpIHRtcC5uWzJdOwotCi0gICAgICAgIC8vIFNvbWUgY2xpcHBpbmcuLi4uCi0gICAgICAgIGZvciAoaj0wOyBqIDwgMzsgaisrKSB7Ci0gICAgICAgICAgICBpZiAoeFtqXSA8IDApIHhbal0gPSAwOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGlmICh4W2pdID4gMS4wKSB4W2pdID0gMS4wOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc21kNS5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNtZDUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ3NThmZi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc21kNS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDEyIE1hcnRpIE1hcmlhIFNhZ3VlcgotLy8KLS8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCi0vLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKLS8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0vLwotLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLS8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotLy8KLS8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAotLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCi0vLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQotLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgotLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaW5jbHVkZSAibGNtczJfaW50ZXJuYWwuaCIKLQotI2lmZGVmIENNU19VU0VfQklHX0VORElBTgotCi1zdGF0aWMKLXZvaWQgYnl0ZVJldmVyc2UoY21zVUludDhOdW1iZXIgKiBidWYsIGNtc1VJbnQzMk51bWJlciBsb25ncykKLXsKLSAgICBkbyB7Ci0KLSAgICAgICAgY21zVUludDMyTnVtYmVyIHQgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoKihjbXNVSW50MzJOdW1iZXIgKikgYnVmKTsKLSAgICAgICAgKihjbXNVSW50MzJOdW1iZXIgKikgYnVmID0gdDsKLSAgICAgICAgYnVmICs9IHNpemVvZihjbXNVSW50MzJOdW1iZXIpOwotCi0gICAgfSB3aGlsZSAoLS1sb25ncyk7Ci0KLX0KLQotI2Vsc2UKLSNkZWZpbmUgYnl0ZVJldmVyc2UoYnVmLCBsZW4pCi0jZW5kaWYKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBjbXNVSW50MzJOdW1iZXIgYnVmWzRdOwotICAgIGNtc1VJbnQzMk51bWJlciBiaXRzWzJdOwotICAgIGNtc1VJbnQ4TnVtYmVyIGluWzY0XTsKLSAgICBjbXNDb250ZXh0IENvbnRleHRJRDsKLQotfSBfY21zTUQ1OwotCi0jZGVmaW5lIEYxKHgsIHksIHopICh6IF4gKHggJiAoeSBeIHopKSkKLSNkZWZpbmUgRjIoeCwgeSwgeikgRjEoeiwgeCwgeSkKLSNkZWZpbmUgRjMoeCwgeSwgeikgKHggXiB5IF4geikKLSNkZWZpbmUgRjQoeCwgeSwgeikgKHkgXiAoeCB8IH56KSkKLQotI2RlZmluZSBTVEVQKGYsIHcsIHgsIHksIHosIGRhdGEsIHMpIFwKLSAgICAoIHcgKz0gZih4LCB5LCB6KSArIGRhdGEsICB3ID0gdzw8cyB8IHc+PigzMi1zKSwgIHcgKz0geCApCi0KLQotc3RhdGljCi12b2lkIE1ENV9UcmFuc2Zvcm0oY21zVUludDMyTnVtYmVyIGJ1Zls0XSwgY21zVUludDMyTnVtYmVyIGluWzE2XSkKLQotewotICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBhLCBiLCBjLCBkOwotCi0gICAgYSA9IGJ1ZlswXTsKLSAgICBiID0gYnVmWzFdOwotICAgIGMgPSBidWZbMl07Ci0gICAgZCA9IGJ1ZlszXTsKLQotICAgIFNURVAoRjEsIGEsIGIsIGMsIGQsIGluWzBdICsgMHhkNzZhYTQ3OCwgNyk7Ci0gICAgU1RFUChGMSwgZCwgYSwgYiwgYywgaW5bMV0gKyAweGU4YzdiNzU2LCAxMik7Ci0gICAgU1RFUChGMSwgYywgZCwgYSwgYiwgaW5bMl0gKyAweDI0MjA3MGRiLCAxNyk7Ci0gICAgU1RFUChGMSwgYiwgYywgZCwgYSwgaW5bM10gKyAweGMxYmRjZWVlLCAyMik7Ci0gICAgU1RFUChGMSwgYSwgYiwgYywgZCwgaW5bNF0gKyAweGY1N2MwZmFmLCA3KTsKLSAgICBTVEVQKEYxLCBkLCBhLCBiLCBjLCBpbls1XSArIDB4NDc4N2M2MmEsIDEyKTsKLSAgICBTVEVQKEYxLCBjLCBkLCBhLCBiLCBpbls2XSArIDB4YTgzMDQ2MTMsIDE3KTsKLSAgICBTVEVQKEYxLCBiLCBjLCBkLCBhLCBpbls3XSArIDB4ZmQ0Njk1MDEsIDIyKTsKLSAgICBTVEVQKEYxLCBhLCBiLCBjLCBkLCBpbls4XSArIDB4Njk4MDk4ZDgsIDcpOwotICAgIFNURVAoRjEsIGQsIGEsIGIsIGMsIGluWzldICsgMHg4YjQ0ZjdhZiwgMTIpOwotICAgIFNURVAoRjEsIGMsIGQsIGEsIGIsIGluWzEwXSArIDB4ZmZmZjViYjEsIDE3KTsKLSAgICBTVEVQKEYxLCBiLCBjLCBkLCBhLCBpblsxMV0gKyAweDg5NWNkN2JlLCAyMik7Ci0gICAgU1RFUChGMSwgYSwgYiwgYywgZCwgaW5bMTJdICsgMHg2YjkwMTEyMiwgNyk7Ci0gICAgU1RFUChGMSwgZCwgYSwgYiwgYywgaW5bMTNdICsgMHhmZDk4NzE5MywgMTIpOwotICAgIFNURVAoRjEsIGMsIGQsIGEsIGIsIGluWzE0XSArIDB4YTY3OTQzOGUsIDE3KTsKLSAgICBTVEVQKEYxLCBiLCBjLCBkLCBhLCBpblsxNV0gKyAweDQ5YjQwODIxLCAyMik7Ci0KLSAgICBTVEVQKEYyLCBhLCBiLCBjLCBkLCBpblsxXSArIDB4ZjYxZTI1NjIsIDUpOwotICAgIFNURVAoRjIsIGQsIGEsIGIsIGMsIGluWzZdICsgMHhjMDQwYjM0MCwgOSk7Ci0gICAgU1RFUChGMiwgYywgZCwgYSwgYiwgaW5bMTFdICsgMHgyNjVlNWE1MSwgMTQpOwotICAgIFNURVAoRjIsIGIsIGMsIGQsIGEsIGluWzBdICsgMHhlOWI2YzdhYSwgMjApOwotICAgIFNURVAoRjIsIGEsIGIsIGMsIGQsIGluWzVdICsgMHhkNjJmMTA1ZCwgNSk7Ci0gICAgU1RFUChGMiwgZCwgYSwgYiwgYywgaW5bMTBdICsgMHgwMjQ0MTQ1MywgOSk7Ci0gICAgU1RFUChGMiwgYywgZCwgYSwgYiwgaW5bMTVdICsgMHhkOGExZTY4MSwgMTQpOwotICAgIFNURVAoRjIsIGIsIGMsIGQsIGEsIGluWzRdICsgMHhlN2QzZmJjOCwgMjApOwotICAgIFNURVAoRjIsIGEsIGIsIGMsIGQsIGluWzldICsgMHgyMWUxY2RlNiwgNSk7Ci0gICAgU1RFUChGMiwgZCwgYSwgYiwgYywgaW5bMTRdICsgMHhjMzM3MDdkNiwgOSk7Ci0gICAgU1RFUChGMiwgYywgZCwgYSwgYiwgaW5bM10gKyAweGY0ZDUwZDg3LCAxNCk7Ci0gICAgU1RFUChGMiwgYiwgYywgZCwgYSwgaW5bOF0gKyAweDQ1NWExNGVkLCAyMCk7Ci0gICAgU1RFUChGMiwgYSwgYiwgYywgZCwgaW5bMTNdICsgMHhhOWUzZTkwNSwgNSk7Ci0gICAgU1RFUChGMiwgZCwgYSwgYiwgYywgaW5bMl0gKyAweGZjZWZhM2Y4LCA5KTsKLSAgICBTVEVQKEYyLCBjLCBkLCBhLCBiLCBpbls3XSArIDB4Njc2ZjAyZDksIDE0KTsKLSAgICBTVEVQKEYyLCBiLCBjLCBkLCBhLCBpblsxMl0gKyAweDhkMmE0YzhhLCAyMCk7Ci0KLSAgICBTVEVQKEYzLCBhLCBiLCBjLCBkLCBpbls1XSArIDB4ZmZmYTM5NDIsIDQpOwotICAgIFNURVAoRjMsIGQsIGEsIGIsIGMsIGluWzhdICsgMHg4NzcxZjY4MSwgMTEpOwotICAgIFNURVAoRjMsIGMsIGQsIGEsIGIsIGluWzExXSArIDB4NmQ5ZDYxMjIsIDE2KTsKLSAgICBTVEVQKEYzLCBiLCBjLCBkLCBhLCBpblsxNF0gKyAweGZkZTUzODBjLCAyMyk7Ci0gICAgU1RFUChGMywgYSwgYiwgYywgZCwgaW5bMV0gKyAweGE0YmVlYTQ0LCA0KTsKLSAgICBTVEVQKEYzLCBkLCBhLCBiLCBjLCBpbls0XSArIDB4NGJkZWNmYTksIDExKTsKLSAgICBTVEVQKEYzLCBjLCBkLCBhLCBiLCBpbls3XSArIDB4ZjZiYjRiNjAsIDE2KTsKLSAgICBTVEVQKEYzLCBiLCBjLCBkLCBhLCBpblsxMF0gKyAweGJlYmZiYzcwLCAyMyk7Ci0gICAgU1RFUChGMywgYSwgYiwgYywgZCwgaW5bMTNdICsgMHgyODliN2VjNiwgNCk7Ci0gICAgU1RFUChGMywgZCwgYSwgYiwgYywgaW5bMF0gKyAweGVhYTEyN2ZhLCAxMSk7Ci0gICAgU1RFUChGMywgYywgZCwgYSwgYiwgaW5bM10gKyAweGQ0ZWYzMDg1LCAxNik7Ci0gICAgU1RFUChGMywgYiwgYywgZCwgYSwgaW5bNl0gKyAweDA0ODgxZDA1LCAyMyk7Ci0gICAgU1RFUChGMywgYSwgYiwgYywgZCwgaW5bOV0gKyAweGQ5ZDRkMDM5LCA0KTsKLSAgICBTVEVQKEYzLCBkLCBhLCBiLCBjLCBpblsxMl0gKyAweGU2ZGI5OWU1LCAxMSk7Ci0gICAgU1RFUChGMywgYywgZCwgYSwgYiwgaW5bMTVdICsgMHgxZmEyN2NmOCwgMTYpOwotICAgIFNURVAoRjMsIGIsIGMsIGQsIGEsIGluWzJdICsgMHhjNGFjNTY2NSwgMjMpOwotCi0gICAgU1RFUChGNCwgYSwgYiwgYywgZCwgaW5bMF0gKyAweGY0MjkyMjQ0LCA2KTsKLSAgICBTVEVQKEY0LCBkLCBhLCBiLCBjLCBpbls3XSArIDB4NDMyYWZmOTcsIDEwKTsKLSAgICBTVEVQKEY0LCBjLCBkLCBhLCBiLCBpblsxNF0gKyAweGFiOTQyM2E3LCAxNSk7Ci0gICAgU1RFUChGNCwgYiwgYywgZCwgYSwgaW5bNV0gKyAweGZjOTNhMDM5LCAyMSk7Ci0gICAgU1RFUChGNCwgYSwgYiwgYywgZCwgaW5bMTJdICsgMHg2NTViNTljMywgNik7Ci0gICAgU1RFUChGNCwgZCwgYSwgYiwgYywgaW5bM10gKyAweDhmMGNjYzkyLCAxMCk7Ci0gICAgU1RFUChGNCwgYywgZCwgYSwgYiwgaW5bMTBdICsgMHhmZmVmZjQ3ZCwgMTUpOwotICAgIFNURVAoRjQsIGIsIGMsIGQsIGEsIGluWzFdICsgMHg4NTg0NWRkMSwgMjEpOwotICAgIFNURVAoRjQsIGEsIGIsIGMsIGQsIGluWzhdICsgMHg2ZmE4N2U0ZiwgNik7Ci0gICAgU1RFUChGNCwgZCwgYSwgYiwgYywgaW5bMTVdICsgMHhmZTJjZTZlMCwgMTApOwotICAgIFNURVAoRjQsIGMsIGQsIGEsIGIsIGluWzZdICsgMHhhMzAxNDMxNCwgMTUpOwotICAgIFNURVAoRjQsIGIsIGMsIGQsIGEsIGluWzEzXSArIDB4NGUwODExYTEsIDIxKTsKLSAgICBTVEVQKEY0LCBhLCBiLCBjLCBkLCBpbls0XSArIDB4Zjc1MzdlODIsIDYpOwotICAgIFNURVAoRjQsIGQsIGEsIGIsIGMsIGluWzExXSArIDB4YmQzYWYyMzUsIDEwKTsKLSAgICBTVEVQKEY0LCBjLCBkLCBhLCBiLCBpblsyXSArIDB4MmFkN2QyYmIsIDE1KTsKLSAgICBTVEVQKEY0LCBiLCBjLCBkLCBhLCBpbls5XSArIDB4ZWI4NmQzOTEsIDIxKTsKLQotICAgIGJ1ZlswXSArPSBhOwotICAgIGJ1ZlsxXSArPSBiOwotICAgIGJ1ZlsyXSArPSBjOwotICAgIGJ1ZlszXSArPSBkOwotfQotCi0KLS8vIENyZWF0ZSBhIE1ENSBvYmplY3QKLXN0YXRpYwotY21zSEFORExFICBNRDVhbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCkKLXsKLSAgICBfY21zTUQ1KiBjdHggPSAoX2Ntc01ENSopIF9jbXNNYWxsb2NaZXJvKENvbnRleHRJRCwgc2l6ZW9mKF9jbXNNRDUpKTsKLSAgICBpZiAoY3R4ID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgY3R4IC0+Q29udGV4dElEID0gQ29udGV4dElEOwotCi0gICAgY3R4LT5idWZbMF0gPSAweDY3NDUyMzAxOwotICAgIGN0eC0+YnVmWzFdID0gMHhlZmNkYWI4OTsKLSAgICBjdHgtPmJ1ZlsyXSA9IDB4OThiYWRjZmU7Ci0gICAgY3R4LT5idWZbM10gPSAweDEwMzI1NDc2OwotCi0gICAgY3R4LT5iaXRzWzBdID0gMDsKLSAgICBjdHgtPmJpdHNbMV0gPSAwOwotCi0gICAgcmV0dXJuIChjbXNIQU5ETEUpIGN0eDsKLX0KLQotCi1zdGF0aWMKLXZvaWQgTUQ1YWRkKGNtc0hBTkRMRSBIYW5kbGUsIGNtc1VJbnQ4TnVtYmVyKiBidWYsIGNtc1VJbnQzMk51bWJlciBsZW4pCi17Ci0gICAgX2Ntc01ENSogY3R4ID0gKF9jbXNNRDUqKSBIYW5kbGU7Ci0gICAgY21zVUludDMyTnVtYmVyIHQ7Ci0KLSAgICB0ID0gY3R4LT5iaXRzWzBdOwotICAgIGlmICgoY3R4LT5iaXRzWzBdID0gdCArIChsZW4gPDwgMykpIDwgdCkKLSAgICAgICAgY3R4LT5iaXRzWzFdKys7Ci0KLSAgICBjdHgtPmJpdHNbMV0gKz0gbGVuID4+IDI5OwotCi0gICAgdCA9ICh0ID4+IDMpICYgMHgzZjsKLQotICAgIGlmICh0KSB7Ci0KLSAgICAgICAgY21zVUludDhOdW1iZXIgKnAgPSAoY21zVUludDhOdW1iZXIgKikgY3R4LT5pbiArIHQ7Ci0KLSAgICAgICAgdCA9IDY0IC0gdDsKLSAgICAgICAgaWYgKGxlbiA8IHQpIHsKLSAgICAgICAgICAgIG1lbW1vdmUocCwgYnVmLCBsZW4pOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbWVtbW92ZShwLCBidWYsIHQpOwotICAgICAgICBieXRlUmV2ZXJzZShjdHgtPmluLCAxNik7Ci0KLSAgICAgICAgTUQ1X1RyYW5zZm9ybShjdHgtPmJ1ZiwgKGNtc1VJbnQzMk51bWJlciAqKSBjdHgtPmluKTsKLSAgICAgICAgYnVmICs9IHQ7Ci0gICAgICAgIGxlbiAtPSB0OwotICAgIH0KLQotICAgIHdoaWxlIChsZW4gPj0gNjQpIHsKLSAgICAgICAgbWVtbW92ZShjdHgtPmluLCBidWYsIDY0KTsKLSAgICAgICAgYnl0ZVJldmVyc2UoY3R4LT5pbiwgMTYpOwotICAgICAgICBNRDVfVHJhbnNmb3JtKGN0eC0+YnVmLCAoY21zVUludDMyTnVtYmVyICopIGN0eC0+aW4pOwotICAgICAgICBidWYgKz0gNjQ7Ci0gICAgICAgIGxlbiAtPSA2NDsKLSAgICB9Ci0KLSAgICBtZW1tb3ZlKGN0eC0+aW4sIGJ1ZiwgbGVuKTsKLX0KLQotLy8gRGVzdHJveSB0aGUgb2JqZWN0IGFuZCByZXR1cm4gdGhlIGNoZWNrc3VtCi1zdGF0aWMKLXZvaWQgTUQ1ZmluaXNoKGNtc1Byb2ZpbGVJRCogUHJvZmlsZUlELCAgY21zSEFORExFIEhhbmRsZSkKLXsKLSAgICBfY21zTUQ1KiBjdHggPSAoX2Ntc01ENSopIEhhbmRsZTsKLSAgICBjbXNVSW50MzJOdW1iZXIgY291bnQ7Ci0gICAgY21zVUludDhOdW1iZXIgKnA7Ci0KLSAgICBjb3VudCA9IChjdHgtPmJpdHNbMF0gPj4gMykgJiAweDNGOwotCi0gICAgcCA9IGN0eC0+aW4gKyBjb3VudDsKLSAgICAqcCsrID0gMHg4MDsKLQotICAgIGNvdW50ID0gNjQgLSAxIC0gY291bnQ7Ci0KLSAgICBpZiAoY291bnQgPCA4KSB7Ci0KLSAgICAgICAgbWVtc2V0KHAsIDAsIGNvdW50KTsKLSAgICAgICAgYnl0ZVJldmVyc2UoY3R4LT5pbiwgMTYpOwotICAgICAgICBNRDVfVHJhbnNmb3JtKGN0eC0+YnVmLCAoY21zVUludDMyTnVtYmVyICopIGN0eC0+aW4pOwotCi0gICAgICAgIG1lbXNldChjdHgtPmluLCAwLCA1Nik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbWVtc2V0KHAsIDAsIGNvdW50IC0gOCk7Ci0gICAgfQotICAgIGJ5dGVSZXZlcnNlKGN0eC0+aW4sIDE0KTsKLQotICAgICgoY21zVUludDMyTnVtYmVyICopIGN0eC0+aW4pWzE0XSA9IGN0eC0+Yml0c1swXTsKLSAgICAoKGNtc1VJbnQzMk51bWJlciAqKSBjdHgtPmluKVsxNV0gPSBjdHgtPmJpdHNbMV07Ci0KLSAgICBNRDVfVHJhbnNmb3JtKGN0eC0+YnVmLCAoY21zVUludDMyTnVtYmVyICopIGN0eC0+aW4pOwotCi0gICAgYnl0ZVJldmVyc2UoKGNtc1VJbnQ4TnVtYmVyICopIGN0eC0+YnVmLCA0KTsKLSAgICBtZW1tb3ZlKFByb2ZpbGVJRCAtPklEOCwgY3R4LT5idWYsIDE2KTsKLQotICAgIF9jbXNGcmVlKGN0eCAtPkNvbnRleHRJRCwgY3R4KTsKLX0KLQotCi0KLS8vIEFzc3VtaW5nIGlvIHBvaW50cyB0byBhbiBJQ0MgcHJvZmlsZSwgY29tcHV0ZSBhbmQgc3RvcmUgTUQ1IGNoZWNrc3VtCi0vLyBJbiB0aGUgaGVhZGVyLCByZW5kZXJpbmcgaW50ZW50ZW50LCBhdHRyaWJ1dGVzIGFuZCBJRCBzaG91bGQgYmUgc2V0IHRvIHplcm8KLS8vIGJlZm9yZSBjb21wdXRpbmcgTUQ1IGNoZWNrc3VtIChwZXIgNi4xLjEzIGluIElDQyBzcGVjKQotCi1jbXNCb29sIENNU0VYUE9SVCBjbXNNRDVjb21wdXRlSUQoY21zSFBST0ZJTEUgaFByb2ZpbGUpCi17Ci0gICAgY21zQ29udGV4dCAgIENvbnRleHRJRDsKLSAgICBjbXNVSW50MzJOdW1iZXIgQnl0ZXNOZWVkZWQ7Ci0gICAgY21zVUludDhOdW1iZXIqIE1lbSA9IE5VTEw7Ci0gICAgY21zSEFORExFICBNRDUgPSBOVUxMOwotICAgIF9jbXNJQ0NQUk9GSUxFKiBJY2MgPSAoX2Ntc0lDQ1BST0ZJTEUqKSBoUHJvZmlsZTsKLSAgICBfY21zSUNDUFJPRklMRSBLZWVwOwotCi0gICAgX2Ntc0Fzc2VydChoUHJvZmlsZSAhPSBOVUxMKTsKLQotICAgIENvbnRleHRJRCA9IGNtc0dldFByb2ZpbGVDb250ZXh0SUQoaFByb2ZpbGUpOwotCi0gICAgLy8gU2F2ZSBhIGNvcHkgb2YgdGhlIHByb2ZpbGUgaGVhZGVyCi0gICAgbWVtbW92ZSgmS2VlcCwgSWNjLCBzaXplb2YoX2Ntc0lDQ1BST0ZJTEUpKTsKLQotICAgIC8vIFNldCBSSSwgYXR0cmlidXRlcyBhbmQgSUQKLSAgICBtZW1zZXQoJkljYyAtPmF0dHJpYnV0ZXMsIDAsIHNpemVvZihJY2MgLT5hdHRyaWJ1dGVzKSk7Ci0gICAgSWNjIC0+UmVuZGVyaW5nSW50ZW50ID0gMDsKLSAgICBtZW1zZXQoJkljYyAtPlByb2ZpbGVJRCwgMCwgc2l6ZW9mKEljYyAtPlByb2ZpbGVJRCkpOwotCi0gICAgLy8gQ29tcHV0ZSBuZWVkZWQgc3RvcmFnZQotICAgIGlmICghY21zU2F2ZVByb2ZpbGVUb01lbShoUHJvZmlsZSwgTlVMTCwgJkJ5dGVzTmVlZGVkKSkgZ290byBFcnJvcjsKLQotICAgIC8vIEFsbG9jYXRlIG1lbW9yeQotICAgIE1lbSA9IChjbXNVSW50OE51bWJlciopIF9jbXNNYWxsb2MoQ29udGV4dElELCBCeXRlc05lZWRlZCk7Ci0gICAgaWYgKE1lbSA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgLy8gU2F2ZSB0byB0ZW1wb3Jhcnkgc3RvcmFnZQotICAgIGlmICghY21zU2F2ZVByb2ZpbGVUb01lbShoUHJvZmlsZSwgTWVtLCAmQnl0ZXNOZWVkZWQpKSBnb3RvIEVycm9yOwotCi0gICAgLy8gQ3JlYXRlIE1ENSBvYmplY3QKLSAgICBNRDUgPSBNRDVhbGxvYyhDb250ZXh0SUQpOwotICAgIGlmIChNRDUgPT0gTlVMTCkgZ290byBFcnJvcjsKLQotICAgIC8vIEFkZCBhbGwgYnl0ZXMKLSAgICBNRDVhZGQoTUQ1LCBNZW0sIEJ5dGVzTmVlZGVkKTsKLQotICAgIC8vIFRlbXAgc3RvcmFnZSBpcyBubyBsb25nZXIgbmVlZGVkCi0gICAgX2Ntc0ZyZWUoQ29udGV4dElELCBNZW0pOwotCi0gICAgLy8gUmVzdG9yZSBoZWFkZXIKLSAgICBtZW1tb3ZlKEljYywgJktlZXAsIHNpemVvZihfY21zSUNDUFJPRklMRSkpOwotCi0gICAgLy8gQW5kIHN0b3JlIHRoZSBJRAotICAgIE1ENWZpbmlzaCgmSWNjIC0+UHJvZmlsZUlELCAgTUQ1KTsKLSAgICByZXR1cm4gVFJVRTsKLQotRXJyb3I6Ci0KLSAgICAvLyBGcmVlIHJlc291cmNlcyBhcyBzb21ldGhpbmcgd2VudCB3cm9uZwotICAgIC8vICJNRDUiIGNhbm5vdCBiZSBvdGhlciB0aGFuIE5VTEwgaGVyZSwgc28gbm8gbmVlZCB0byBmcmVlIGl0Ci0gICAgaWYgKE1lbSAhPSBOVUxMKSBfY21zRnJlZShDb250ZXh0SUQsIE1lbSk7Ci0gICAgbWVtbW92ZShJY2MsICZLZWVwLCBzaXplb2YoX2Ntc0lDQ1BST0ZJTEUpKTsKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLWNtc0Jvb2wgQ01TRVhQT1JUIGNtc01ENWNvbXB1dGVJREV4dChjb25zdCB2b2lkKiBidWYsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgY2hhciBQcm9maWxlSURbMTZdKQotewotCWNtc0hBTkRMRSAgTUQ1OwotCWNtc1VJbnQ4TnVtYmVyKiBNZW07Ci0KLQlpZiAoYnVmID09IE5VTEwpCi0JCXJldHVybiBGQUxTRTsKLSAgICBNRDUgPSBOVUxMOwotCU1lbSA9IChjbXNVSW50OE51bWJlciopX2Ntc01hbGxvYyhOVUxMLHNpemUpOwotCW1lbW1vdmUoTWVtLGJ1ZixzaXplKTsKLQkvLyBDcmVhdGUgTUQ1IG9iamVjdAotICAgIE1ENSA9IE1ENWFsbG9jKE5VTEwpOwotICAgIGlmIChNRDUgPT0gTlVMTCkgZ290byBFcnJvcjsKLQotCS8vIEFkZCBhbGwgYnl0ZXMKLSAgICBNRDVhZGQoTUQ1LCBNZW0sIHNpemUpOwotCi0JLy8gVGVtcCBzdG9yYWdlIGlzIG5vIGxvbmdlciBuZWVkZWQKLSAgICBfY21zRnJlZShOVUxMLCBNZW0pOwotCi0JLy8gQW5kIHN0b3JlIHRoZSBJRAotICAgIE1ENWZpbmlzaCgoY21zUHJvZmlsZUlEKilQcm9maWxlSUQsICBNRDUpOwotCXJldHVybiBUUlVFOwotRXJyb3I6Ci0JaWYgKE1ENSAhPSBOVUxMKSBfY21zRnJlZShOVUxMLCBNRDUpOwotCXJldHVybiBGQUxTRTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zbXRyeC5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNtdHJ4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiN2I5MWMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNtdHJ4LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTIgTWFydGkgTWFyaWEgU2FndWVyCi0vLwotLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0vLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0vLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0vLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLS8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQotLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLS8vCi0vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0vLwotLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0vLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KLS8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi0vLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCi0vLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0vLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLS8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotCi0jaW5jbHVkZSAibGNtczJfaW50ZXJuYWwuaCIKLQotCi0jZGVmaW5lIERTV0FQKHgsIHkpICAgICB7Y21zRmxvYXQ2NE51bWJlciB0bXAgPSAoeCk7ICh4KT0oeSk7ICh5KT10bXA7fQotCi0KLS8vIEluaXRpYXRlIGEgdmVjdG9yCi12b2lkIENNU0VYUE9SVCBfY21zVkVDM2luaXQoY21zVkVDMyogciwgY21zRmxvYXQ2NE51bWJlciB4LCBjbXNGbG9hdDY0TnVtYmVyIHksIGNtc0Zsb2F0NjROdW1iZXIgeikKLXsKLSAgICByIC0+IG5bVlhdID0geDsKLSAgICByIC0+IG5bVlldID0geTsKLSAgICByIC0+IG5bVlpdID0gejsKLX0KLQotLy8gVmVjdG9yIHN1YnN0cmFjdGlvbgotdm9pZCBDTVNFWFBPUlQgX2Ntc1ZFQzNtaW51cyhjbXNWRUMzKiByLCBjb25zdCBjbXNWRUMzKiBhLCBjb25zdCBjbXNWRUMzKiBiKQotewotICByIC0+IG5bVlhdID0gYSAtPiBuW1ZYXSAtIGIgLT4gbltWWF07Ci0gIHIgLT4gbltWWV0gPSBhIC0+IG5bVlldIC0gYiAtPiBuW1ZZXTsKLSAgciAtPiBuW1ZaXSA9IGEgLT4gbltWWl0gLSBiIC0+IG5bVlpdOwotfQotCi0vLyBWZWN0b3IgY3Jvc3MgcHJvZHVjdAotdm9pZCBDTVNFWFBPUlQgX2Ntc1ZFQzNjcm9zcyhjbXNWRUMzKiByLCBjb25zdCBjbXNWRUMzKiB1LCBjb25zdCBjbXNWRUMzKiB2KQotewotICAgIHIgLT5uW1ZYXSA9IHUtPm5bVlldICogdi0+bltWWl0gLSB2LT5uW1ZZXSAqIHUtPm5bVlpdOwotICAgIHIgLT5uW1ZZXSA9IHUtPm5bVlpdICogdi0+bltWWF0gLSB2LT5uW1ZaXSAqIHUtPm5bVlhdOwotICAgIHIgLT5uW1ZaXSA9IHUtPm5bVlhdICogdi0+bltWWV0gLSB2LT5uW1ZYXSAqIHUtPm5bVlldOwotfQotCi0vLyBWZWN0b3IgZG90IHByb2R1Y3QKLWNtc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIF9jbXNWRUMzZG90KGNvbnN0IGNtc1ZFQzMqIHUsIGNvbnN0IGNtc1ZFQzMqIHYpCi17Ci0gICAgcmV0dXJuIHUtPm5bVlhdICogdi0+bltWWF0gKyB1LT5uW1ZZXSAqIHYtPm5bVlldICsgdS0+bltWWl0gKiB2LT5uW1ZaXTsKLX0KLQotLy8gRXVjbGlkZWFuIGxlbmd0aAotY21zRmxvYXQ2NE51bWJlciBDTVNFWFBPUlQgX2Ntc1ZFQzNsZW5ndGgoY29uc3QgY21zVkVDMyogYSkKLXsKLSAgICByZXR1cm4gc3FydChhIC0+bltWWF0gKiBhIC0+bltWWF0gKwotICAgICAgICAgICAgICAgIGEgLT5uW1ZZXSAqIGEgLT5uW1ZZXSArCi0gICAgICAgICAgICAgICAgYSAtPm5bVlpdICogYSAtPm5bVlpdKTsKLX0KLQotLy8gRXVjbGlkZWFuIGRpc3RhbmNlCi1jbXNGbG9hdDY0TnVtYmVyIENNU0VYUE9SVCBfY21zVkVDM2Rpc3RhbmNlKGNvbnN0IGNtc1ZFQzMqIGEsIGNvbnN0IGNtc1ZFQzMqIGIpCi17Ci0gICAgY21zRmxvYXQ2NE51bWJlciBkMSA9IGEgLT5uW1ZYXSAtIGIgLT5uW1ZYXTsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIGQyID0gYSAtPm5bVlldIC0gYiAtPm5bVlldOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgZDMgPSBhIC0+bltWWl0gLSBiIC0+bltWWl07Ci0KLSAgICByZXR1cm4gc3FydChkMSpkMSArIGQyKmQyICsgZDMqZDMpOwotfQotCi0KLQotLy8gM3gzIElkZW50aXR5Ci12b2lkIENNU0VYUE9SVCBfY21zTUFUM2lkZW50aXR5KGNtc01BVDMqIGEpCi17Ci0gICAgX2Ntc1ZFQzNpbml0KCZhLT4gdlswXSwgMS4wLCAwLjAsIDAuMCk7Ci0gICAgX2Ntc1ZFQzNpbml0KCZhLT4gdlsxXSwgMC4wLCAxLjAsIDAuMCk7Ci0gICAgX2Ntc1ZFQzNpbml0KCZhLT4gdlsyXSwgMC4wLCAwLjAsIDEuMCk7Ci19Ci0KLXN0YXRpYwotY21zQm9vbCBDbG9zZUVub3VnaChjbXNGbG9hdDY0TnVtYmVyIGEsIGNtc0Zsb2F0NjROdW1iZXIgYikKLXsKLSAgICByZXR1cm4gZmFicyhiIC0gYSkgPCAoMS4wIC8gNjU1MzUuMCk7Ci19Ci0KLQotY21zQm9vbCBDTVNFWFBPUlQgX2Ntc01BVDNpc0lkZW50aXR5KGNvbnN0IGNtc01BVDMqIGEpCi17Ci0gICAgY21zTUFUMyBJZGVudGl0eTsKLSAgICBpbnQgaSwgajsKLQotICAgIF9jbXNNQVQzaWRlbnRpdHkoJklkZW50aXR5KTsKLQotICAgIGZvciAoaT0wOyBpIDwgMzsgaSsrKQotICAgICAgICBmb3IgKGo9MDsgaiA8IDM7IGorKykKLSAgICAgICAgICAgIGlmICghQ2xvc2VFbm91Z2goYSAtPnZbaV0ubltqXSwgSWRlbnRpdHkudltpXS5uW2pdKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLy8gTXVsdGlwbHkgdHdvIG1hdHJpY2VzCi12b2lkIENNU0VYUE9SVCBfY21zTUFUM3BlcihjbXNNQVQzKiByLCBjb25zdCBjbXNNQVQzKiBhLCBjb25zdCBjbXNNQVQzKiBiKQotewotI2RlZmluZSBST1dDT0woaSwgaikgXAotICAgIGEtPnZbaV0ublswXSpiLT52WzBdLm5bal0gKyBhLT52W2ldLm5bMV0qYi0+dlsxXS5uW2pdICsgYS0+dltpXS5uWzJdKmItPnZbMl0ubltqXQotCi0gICAgX2Ntc1ZFQzNpbml0KCZyLT4gdlswXSwgUk9XQ09MKDAsMCksIFJPV0NPTCgwLDEpLCBST1dDT0woMCwyKSk7Ci0gICAgX2Ntc1ZFQzNpbml0KCZyLT4gdlsxXSwgUk9XQ09MKDEsMCksIFJPV0NPTCgxLDEpLCBST1dDT0woMSwyKSk7Ci0gICAgX2Ntc1ZFQzNpbml0KCZyLT4gdlsyXSwgUk9XQ09MKDIsMCksIFJPV0NPTCgyLDEpLCBST1dDT0woMiwyKSk7Ci0KLSN1bmRlZiBST1dDT0wgLy8oaSwgaikKLX0KLQotCi0KLS8vIEludmVyc2Ugb2YgYSBtYXRyaXggYiA9IGFeKC0xKQotY21zQm9vbCAgQ01TRVhQT1JUIF9jbXNNQVQzaW52ZXJzZShjb25zdCBjbXNNQVQzKiBhLCBjbXNNQVQzKiBiKQotewotICAgY21zRmxvYXQ2NE51bWJlciBkZXQsIGMwLCBjMSwgYzI7Ci0KLSAgIGMwID0gIGEgLT4gdlsxXS5uWzFdKmEgLT4gdlsyXS5uWzJdIC0gYSAtPiB2WzFdLm5bMl0qYSAtPiB2WzJdLm5bMV07Ci0gICBjMSA9IC1hIC0+IHZbMV0ublswXSphIC0+IHZbMl0ublsyXSArIGEgLT4gdlsxXS5uWzJdKmEgLT4gdlsyXS5uWzBdOwotICAgYzIgPSAgYSAtPiB2WzFdLm5bMF0qYSAtPiB2WzJdLm5bMV0gLSBhIC0+IHZbMV0ublsxXSphIC0+IHZbMl0ublswXTsKLQotICAgZGV0ID0gYSAtPiB2WzBdLm5bMF0qYzAgKyBhIC0+IHZbMF0ublsxXSpjMSArIGEgLT4gdlswXS5uWzJdKmMyOwotCi0gICBpZiAoZmFicyhkZXQpIDwgTUFUUklYX0RFVF9UT0xFUkFOQ0UpIHJldHVybiBGQUxTRTsgIC8vIHNpbmd1bGFyIG1hdHJpeDsgY2FuJ3QgaW52ZXJ0Ci0KLSAgIGIgLT4gdlswXS5uWzBdID0gYzAvZGV0OwotICAgYiAtPiB2WzBdLm5bMV0gPSAoYSAtPiB2WzBdLm5bMl0qYSAtPiB2WzJdLm5bMV0gLSBhIC0+IHZbMF0ublsxXSphIC0+IHZbMl0ublsyXSkvZGV0OwotICAgYiAtPiB2WzBdLm5bMl0gPSAoYSAtPiB2WzBdLm5bMV0qYSAtPiB2WzFdLm5bMl0gLSBhIC0+IHZbMF0ublsyXSphIC0+IHZbMV0ublsxXSkvZGV0OwotICAgYiAtPiB2WzFdLm5bMF0gPSBjMS9kZXQ7Ci0gICBiIC0+IHZbMV0ublsxXSA9IChhIC0+IHZbMF0ublswXSphIC0+IHZbMl0ublsyXSAtIGEgLT4gdlswXS5uWzJdKmEgLT4gdlsyXS5uWzBdKS9kZXQ7Ci0gICBiIC0+IHZbMV0ublsyXSA9IChhIC0+IHZbMF0ublsyXSphIC0+IHZbMV0ublswXSAtIGEgLT4gdlswXS5uWzBdKmEgLT4gdlsxXS5uWzJdKS9kZXQ7Ci0gICBiIC0+IHZbMl0ublswXSA9IGMyL2RldDsKLSAgIGIgLT4gdlsyXS5uWzFdID0gKGEgLT4gdlswXS5uWzFdKmEgLT4gdlsyXS5uWzBdIC0gYSAtPiB2WzBdLm5bMF0qYSAtPiB2WzJdLm5bMV0pL2RldDsKLSAgIGIgLT4gdlsyXS5uWzJdID0gKGEgLT4gdlswXS5uWzBdKmEgLT4gdlsxXS5uWzFdIC0gYSAtPiB2WzBdLm5bMV0qYSAtPiB2WzFdLm5bMF0pL2RldDsKLQotICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLy8gU29sdmUgYSBzeXN0ZW0gaW4gdGhlIGZvcm0gQXggPSBiCi1jbXNCb29sICBDTVNFWFBPUlQgX2Ntc01BVDNzb2x2ZShjbXNWRUMzKiB4LCBjbXNNQVQzKiBhLCBjbXNWRUMzKiBiKQotewotICAgIGNtc01BVDMgbSwgYV8xOwotCi0gICAgbWVtbW92ZSgmbSwgYSwgc2l6ZW9mKGNtc01BVDMpKTsKLQotICAgIGlmICghX2Ntc01BVDNpbnZlcnNlKCZtLCAmYV8xKSkgcmV0dXJuIEZBTFNFOyAgLy8gU2luZ3VsYXIgbWF0cml4Ci0KLSAgICBfY21zTUFUM2V2YWwoeCwgJmFfMSwgYik7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8vIEV2YWx1YXRlIGEgdmVjdG9yIGFjcm9zcyBhIG1hdHJpeAotdm9pZCBDTVNFWFBPUlQgX2Ntc01BVDNldmFsKGNtc1ZFQzMqIHIsIGNvbnN0IGNtc01BVDMqIGEsIGNvbnN0IGNtc1ZFQzMqIHYpCi17Ci0gICAgci0+bltWWF0gPSBhLT52WzBdLm5bVlhdKnYtPm5bVlhdICsgYS0+dlswXS5uW1ZZXSp2LT5uW1ZZXSArIGEtPnZbMF0ubltWWl0qdi0+bltWWl07Ci0gICAgci0+bltWWV0gPSBhLT52WzFdLm5bVlhdKnYtPm5bVlhdICsgYS0+dlsxXS5uW1ZZXSp2LT5uW1ZZXSArIGEtPnZbMV0ubltWWl0qdi0+bltWWl07Ci0gICAgci0+bltWWl0gPSBhLT52WzJdLm5bVlhdKnYtPm5bVlhdICsgYS0+dlsyXS5uW1ZZXSp2LT5uW1ZZXSArIGEtPnZbMl0ubltWWl0qdi0+bltWWl07Ci19Ci0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zbmFtZWQuYyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zbmFtZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYxZWIzMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc25hbWVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTIgTWFydGkgTWFyaWEgU2FndWVyCi0vLwotLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0vLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0vLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0vLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLS8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQotLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLS8vCi0vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0vLwotLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0vLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KLS8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi0vLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCi0vLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0vLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLS8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotCi0jaW5jbHVkZSAibGNtczJfaW50ZXJuYWwuaCIKLQotLy8gTXVsdGlsb2NhbGl6ZWQgdW5pY29kZSBvYmplY3RzLiBUaGF0IGlzIGFuIGF0dGVtcHQgdG8gZW5jYXBzdWxhdGUgaTE4bi4KLQotCi0vLyBBbGxvY2F0ZXMgYW4gZW1wdHkgbXVsdGkgbG9jYWxpemFkIHVuaWNvZGUgb2JqZWN0Ci1jbXNNTFUqIENNU0VYUE9SVCBjbXNNTFVhbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKLXsKLSAgICBjbXNNTFUqIG1sdTsKLQotICAgIC8vIG5JdGVtcyBzaG91bGQgYmUgcG9zaXRpdmUgaWYgZ2l2ZW4KLSAgICBpZiAobkl0ZW1zIDw9IDApIG5JdGVtcyA9IDI7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIGNvbnRhaW5lcgotICAgIG1sdSA9IChjbXNNTFUqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihjbXNNTFUpKTsKLSAgICBpZiAobWx1ID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgbWx1IC0+Q29udGV4dElEID0gQ29udGV4dElEOwotCi0gICAgLy8gQ3JlYXRlIGVudHJ5IGFycmF5Ci0gICAgbWx1IC0+RW50cmllcyA9IChfY21zTUxVZW50cnkqKSBfY21zQ2FsbG9jKENvbnRleHRJRCwgbkl0ZW1zLCBzaXplb2YoX2Ntc01MVWVudHJ5KSk7Ci0gICAgaWYgKG1sdSAtPkVudHJpZXMgPT0gTlVMTCkgewotICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIG1sdSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8vIE9rLCBrZWVwIGluZGV4ZXMgdXAgdG8gZGF0ZQotICAgIG1sdSAtPkFsbG9jYXRlZEVudHJpZXMgICAgPSBuSXRlbXM7Ci0gICAgbWx1IC0+VXNlZEVudHJpZXMgICAgICAgICA9IDA7Ci0KLSAgICByZXR1cm4gbWx1OwotfQotCi0KLS8vIEdyb3dzIGEgbWVtcG9vbCB0YWJsZSBmb3IgYSBNTFUuIEVhY2ggdGltZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgbWVtcG9vbCBzaXplIGlzIG11bHRpcGxpZWQgdGltZXMgdHdvLgotc3RhdGljCi1jbXNCb29sIEdyb3dNTFVwb29sKGNtc01MVSogbWx1KQotewotICAgIGNtc1VJbnQzMk51bWJlciBzaXplOwotICAgIHZvaWQgKk5ld1B0cjsKLQotICAgIC8vIFNhbml0eSBjaGVjawotICAgIGlmIChtbHUgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKG1sdSAtPlBvb2xTaXplID09IDApCi0gICAgICAgIHNpemUgPSAyNTY7Ci0gICAgZWxzZQotICAgICAgICBzaXplID0gbWx1IC0+UG9vbFNpemUgKiAyOwotCi0gICAgLy8gQ2hlY2sgZm9yIG92ZXJmbG93Ci0gICAgaWYgKHNpemUgPCBtbHUgLT5Qb29sU2l6ZSkgcmV0dXJuIEZBTFNFOwotCi0gICAgLy8gUmVhbGxvY2F0ZSB0aGUgcG9vbAotICAgIE5ld1B0ciA9IF9jbXNSZWFsbG9jKG1sdSAtPkNvbnRleHRJRCwgbWx1IC0+TWVtUG9vbCwgc2l6ZSk7Ci0gICAgaWYgKE5ld1B0ciA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0KLQotICAgIG1sdSAtPk1lbVBvb2wgID0gTmV3UHRyOwotICAgIG1sdSAtPlBvb2xTaXplID0gc2l6ZTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0KLS8vIEdyb3dzIGEgZW50cnkgdGFibGUgZm9yIGEgTUxVLiBFYWNoIHRpbWUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHRhYmxlIHNpemUgaXMgbXVsdGlwbGllZCB0aW1lcyB0d28uCi1zdGF0aWMKLWNtc0Jvb2wgR3Jvd01MVXRhYmxlKGNtc01MVSogbWx1KQotewotICAgIGludCBBbGxvY2F0ZWRFbnRyaWVzOwotICAgIF9jbXNNTFVlbnRyeSAqTmV3UHRyOwotCi0gICAgLy8gU2FuaXR5IGNoZWNrCi0gICAgaWYgKG1sdSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBBbGxvY2F0ZWRFbnRyaWVzID0gbWx1IC0+QWxsb2NhdGVkRW50cmllcyAqIDI7Ci0KLSAgICAvLyBDaGVjayBmb3Igb3ZlcmZsb3cKLSAgICBpZiAoQWxsb2NhdGVkRW50cmllcyAvIDIgIT0gbWx1IC0+QWxsb2NhdGVkRW50cmllcykgcmV0dXJuIEZBTFNFOwotCi0gICAgLy8gUmVhbGxvY2F0ZSB0aGUgbWVtb3J5Ci0gICAgTmV3UHRyID0gKF9jbXNNTFVlbnRyeSopX2Ntc1JlYWxsb2MobWx1IC0+Q29udGV4dElELCBtbHUgLT5FbnRyaWVzLCBBbGxvY2F0ZWRFbnRyaWVzKnNpemVvZihfY21zTUxVZW50cnkpKTsKLSAgICBpZiAoTmV3UHRyID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQotICAgIG1sdSAtPkVudHJpZXMgICAgICAgICAgPSBOZXdQdHI7Ci0gICAgbWx1IC0+QWxsb2NhdGVkRW50cmllcyA9IEFsbG9jYXRlZEVudHJpZXM7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0vLyBTZWFyY2ggZm9yIGEgc3BlY2lmaWMgZW50cnkgaW4gdGhlIHN0cnVjdHVyZS4gTGFuZ3VhZ2UgYW5kIENvdW50cnkgYXJlIHVzZWQuCi1zdGF0aWMKLWludCBTZWFyY2hNTFVFbnRyeShjbXNNTFUqIG1sdSwgY21zVUludDE2TnVtYmVyIExhbmd1YWdlQ29kZSwgY21zVUludDE2TnVtYmVyIENvdW50cnlDb2RlKQotewotICAgIGludCBpOwotCi0gICAgLy8gU2FuaXR5IGNoZWNrCi0gICAgaWYgKG1sdSA9PSBOVUxMKSByZXR1cm4gLTE7Ci0KLSAgICAvLyBJdGVyYXRlIHdob2xlIHRhYmxlCi0gICAgZm9yIChpPTA7IGkgPCBtbHUgLT5Vc2VkRW50cmllczsgaSsrKSB7Ci0KLSAgICAgICAgaWYgKG1sdSAtPkVudHJpZXNbaV0uQ291bnRyeSAgPT0gQ291bnRyeUNvZGUgJiYKLSAgICAgICAgICAgIG1sdSAtPkVudHJpZXNbaV0uTGFuZ3VhZ2UgPT0gTGFuZ3VhZ2VDb2RlKSByZXR1cm4gaTsKLSAgICB9Ci0KLSAgICAvLyBOb3QgZm91bmQKLSAgICByZXR1cm4gLTE7Ci19Ci0KLS8vIEFkZCBhIGJsb2NrIG9mIGNoYXJhY3RlcnMgdG8gdGhlIGludGVuZGVkIE1MVS4gTGFuZ3VhZ2UgYW5kIGNvdW50cnkgYXJlIHNwZWNpZmllZC4KLS8vIE9ubHkgb25lIGVudHJ5IGZvciBMYW5ndWFnZS9jb3VudHJ5IHBhaXIgaXMgYWxsb3dlZC4KLXN0YXRpYwotY21zQm9vbCBBZGRNTFVCbG9jayhjbXNNTFUqIG1sdSwgY21zVUludDMyTnVtYmVyIHNpemUsIGNvbnN0IHdjaGFyX3QgKkJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgY21zVUludDE2TnVtYmVyIExhbmd1YWdlQ29kZSwgY21zVUludDE2TnVtYmVyIENvdW50cnlDb2RlKQotewotICAgIGNtc1VJbnQzMk51bWJlciBPZmZzZXQ7Ci0gICAgY21zVUludDhOdW1iZXIqIFB0cjsKLQotICAgIC8vIFNhbml0eSBjaGVjawotICAgIGlmIChtbHUgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0gICAgLy8gSXMgdGhlcmUgYW55IHJvb20gYXZhaWxhYmxlPwotICAgIGlmIChtbHUgLT5Vc2VkRW50cmllcyA+PSBtbHUgLT5BbGxvY2F0ZWRFbnRyaWVzKSB7Ci0gICAgICAgIGlmICghR3Jvd01MVXRhYmxlKG1sdSkpIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICAvLyBPbmx5IG9uZSBBU0NJSSBzdHJpbmcKLSAgICBpZiAoU2VhcmNoTUxVRW50cnkobWx1LCBMYW5ndWFnZUNvZGUsIENvdW50cnlDb2RlKSA+PSAwKSByZXR1cm4gRkFMU0U7ICAvLyBPbmx5IG9uZSAgaXMgYWxsb3dlZCEKLQotICAgIC8vIENoZWNrIGZvciBzaXplCi0gICAgd2hpbGUgKChtbHUgLT5Qb29sU2l6ZSAtIG1sdSAtPlBvb2xVc2VkKSA8IHNpemUpIHsKLQotICAgICAgICAgICAgaWYgKCFHcm93TUxVcG9vbChtbHUpKSByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgT2Zmc2V0ID0gbWx1IC0+UG9vbFVzZWQ7Ci0KLSAgICBQdHIgPSAoY21zVUludDhOdW1iZXIqKSBtbHUgLT5NZW1Qb29sOwotICAgIGlmIChQdHIgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0gICAgLy8gU2V0IHRoZSBlbnRyeQotICAgIG1lbW1vdmUoUHRyICsgT2Zmc2V0LCBCbG9jaywgc2l6ZSk7Ci0gICAgbWx1IC0+UG9vbFVzZWQgKz0gc2l6ZTsKLQotICAgIG1sdSAtPkVudHJpZXNbbWx1IC0+VXNlZEVudHJpZXNdLlN0clcgICAgID0gT2Zmc2V0OwotICAgIG1sdSAtPkVudHJpZXNbbWx1IC0+VXNlZEVudHJpZXNdLkxlbiAgICAgID0gc2l6ZTsKLSAgICBtbHUgLT5FbnRyaWVzW21sdSAtPlVzZWRFbnRyaWVzXS5Db3VudHJ5ICA9IENvdW50cnlDb2RlOwotICAgIG1sdSAtPkVudHJpZXNbbWx1IC0+VXNlZEVudHJpZXNdLkxhbmd1YWdlID0gTGFuZ3VhZ2VDb2RlOwotICAgIG1sdSAtPlVzZWRFbnRyaWVzKys7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0vLyBBZGQgYW4gQVNDSUkgZW50cnkuCi1jbXNCb29sIENNU0VYUE9SVCBjbXNNTFVzZXRBU0NJSShjbXNNTFUqIG1sdSwgY29uc3QgY2hhciBMYW5ndWFnZUNvZGVbM10sIGNvbnN0IGNoYXIgQ291bnRyeUNvZGVbM10sIGNvbnN0IGNoYXIqIEFTQ0lJU3RyaW5nKQotewotICAgIGNtc1VJbnQzMk51bWJlciBpLCBsZW4gPSAoY21zVUludDMyTnVtYmVyKSBzdHJsZW4oQVNDSUlTdHJpbmcpKzE7Ci0gICAgd2NoYXJfdCogV1N0cjsKLSAgICBjbXNCb29sICByYzsKLSAgICBjbXNVSW50MTZOdW1iZXIgTGFuZyAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMTYoKihjbXNVSW50MTZOdW1iZXIqKSBMYW5ndWFnZUNvZGUpOwotICAgIGNtc1VJbnQxNk51bWJlciBDbnRyeSA9IF9jbXNBZGp1c3RFbmRpYW5lc3MxNigqKGNtc1VJbnQxNk51bWJlciopIENvdW50cnlDb2RlKTsKLQotICAgIGlmIChtbHUgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0gICAgV1N0ciA9ICh3Y2hhcl90KikgX2Ntc0NhbGxvYyhtbHUgLT5Db250ZXh0SUQsIGxlbiwgIHNpemVvZih3Y2hhcl90KSk7Ci0gICAgaWYgKFdTdHIgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0gICAgZm9yIChpPTA7IGkgPCBsZW47IGkrKykKLSAgICAgICAgV1N0cltpXSA9ICh3Y2hhcl90KSBBU0NJSVN0cmluZ1tpXTsKLQotICAgIHJjID0gQWRkTUxVQmxvY2sobWx1LCBsZW4gICogc2l6ZW9mKHdjaGFyX3QpLCBXU3RyLCBMYW5nLCBDbnRyeSk7Ci0KLSAgICBfY21zRnJlZShtbHUgLT5Db250ZXh0SUQsIFdTdHIpOwotICAgIHJldHVybiByYzsKLQotfQotCi0vLyBXZSBkb24ndCBuZWVkIGFueSB3Y3Mgc3VwcG9ydCBsaWJyYXJ5Ci1zdGF0aWMKLWNtc1VJbnQzMk51bWJlciBteXdjc2xlbihjb25zdCB3Y2hhcl90ICpzKQotewotICAgIGNvbnN0IHdjaGFyX3QgKnA7Ci0KLSAgICBwID0gczsKLSAgICB3aGlsZSAoKnApCi0gICAgICAgIHArKzsKLQotICAgIHJldHVybiAoY21zVUludDMyTnVtYmVyKShwIC0gcyk7Ci19Ci0KLQotLy8gQWRkIGEgd2lkZSBlbnRyeQotY21zQm9vbCAgQ01TRVhQT1JUIGNtc01MVXNldFdpZGUoY21zTUxVKiBtbHUsIGNvbnN0IGNoYXIgTGFuZ3VhZ2VbM10sIGNvbnN0IGNoYXIgQ291bnRyeVszXSwgY29uc3Qgd2NoYXJfdCogV2lkZVN0cmluZykKLXsKLSAgICBjbXNVSW50MTZOdW1iZXIgTGFuZyAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMTYoKihjbXNVSW50MTZOdW1iZXIqKSBMYW5ndWFnZSk7Ci0gICAgY21zVUludDE2TnVtYmVyIENudHJ5ID0gX2Ntc0FkanVzdEVuZGlhbmVzczE2KCooY21zVUludDE2TnVtYmVyKikgQ291bnRyeSk7Ci0gICAgY21zVUludDMyTnVtYmVyIGxlbjsKLQotICAgIGlmIChtbHUgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotICAgIGlmIChXaWRlU3RyaW5nID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQotICAgIGxlbiA9IChjbXNVSW50MzJOdW1iZXIpIChteXdjc2xlbihXaWRlU3RyaW5nKSArIDEpICogc2l6ZW9mKHdjaGFyX3QpOwotICAgIHJldHVybiBBZGRNTFVCbG9jayhtbHUsIGxlbiwgV2lkZVN0cmluZywgTGFuZywgQ250cnkpOwotfQotCi0vLyBEdXBsaWNhdGluZyBhIE1MVSBpcyBhcyBlYXN5IGFzIGNvcHlpbmcgYWxsIG1lbWJlcnMKLWNtc01MVSogQ01TRVhQT1JUIGNtc01MVWR1cChjb25zdCBjbXNNTFUqIG1sdSkKLXsKLSAgICBjbXNNTFUqIE5ld01sdSA9IE5VTEw7Ci0KLSAgICAvLyBEdXBsaWNhdGluZyBhIE5VTEwgb2J0YWlucyBhIE5VTEwKLSAgICBpZiAobWx1ID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgTmV3TWx1ID0gY21zTUxVYWxsb2MobWx1IC0+Q29udGV4dElELCBtbHUgLT5Vc2VkRW50cmllcyk7Ci0gICAgaWYgKE5ld01sdSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4KLSAgICBpZiAoTmV3TWx1IC0+QWxsb2NhdGVkRW50cmllcyA8IG1sdSAtPlVzZWRFbnRyaWVzKQotICAgICAgICBnb3RvIEVycm9yOwotCi0gICAgLy8gU2FuaXRpemUuLi4KLSAgICBpZiAoTmV3TWx1IC0+RW50cmllcyA9PSBOVUxMIHx8IG1sdSAtPkVudHJpZXMgPT0gTlVMTCkgIGdvdG8gRXJyb3I7Ci0KLSAgICBtZW1tb3ZlKE5ld01sdSAtPkVudHJpZXMsIG1sdSAtPkVudHJpZXMsIG1sdSAtPlVzZWRFbnRyaWVzICogc2l6ZW9mKF9jbXNNTFVlbnRyeSkpOwotICAgIE5ld01sdSAtPlVzZWRFbnRyaWVzID0gbWx1IC0+VXNlZEVudHJpZXM7Ci0KLSAgICAvLyBUaGUgTUxVIG1heSBiZSBlbXB0eQotICAgIGlmIChtbHUgLT5Qb29sVXNlZCA9PSAwKSB7Ci0gICAgICAgIE5ld01sdSAtPk1lbVBvb2wgPSBOVUxMOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLy8gSXQgaXMgbm90IGVtcHR5Ci0gICAgICAgIE5ld01sdSAtPk1lbVBvb2wgPSBfY21zTWFsbG9jKG1sdSAtPkNvbnRleHRJRCwgbWx1IC0+UG9vbFVzZWQpOwotICAgICAgICBpZiAoTmV3TWx1IC0+TWVtUG9vbCA9PSBOVUxMKSBnb3RvIEVycm9yOwotICAgIH0KLQotICAgIE5ld01sdSAtPlBvb2xTaXplID0gbWx1IC0+UG9vbFVzZWQ7Ci0KLSAgICBpZiAoTmV3TWx1IC0+TWVtUG9vbCA9PSBOVUxMIHx8IG1sdSAtPk1lbVBvb2wgPT0gTlVMTCkgZ290byBFcnJvcjsKLQotICAgIG1lbW1vdmUoTmV3TWx1IC0+TWVtUG9vbCwgbWx1LT5NZW1Qb29sLCBtbHUgLT5Qb29sVXNlZCk7Ci0gICAgTmV3TWx1IC0+UG9vbFVzZWQgPSBtbHUgLT5Qb29sVXNlZDsKLQotICAgIHJldHVybiBOZXdNbHU7Ci0KLUVycm9yOgotCi0gICAgaWYgKE5ld01sdSAhPSBOVUxMKSBjbXNNTFVmcmVlKE5ld01sdSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8vIEZyZWUgYW55IHVzZWQgbWVtb3J5Ci12b2lkIENNU0VYUE9SVCBjbXNNTFVmcmVlKGNtc01MVSogbWx1KQotewotICAgIGlmIChtbHUpIHsKLQotICAgICAgICBpZiAobWx1IC0+IEVudHJpZXMpIF9jbXNGcmVlKG1sdSAtPkNvbnRleHRJRCwgbWx1LT5FbnRyaWVzKTsKLSAgICAgICAgaWYgKG1sdSAtPiBNZW1Qb29sKSBfY21zRnJlZShtbHUgLT5Db250ZXh0SUQsIG1sdS0+TWVtUG9vbCk7Ci0KLSAgICAgICAgX2Ntc0ZyZWUobWx1IC0+Q29udGV4dElELCBtbHUpOwotICAgIH0KLX0KLQotCi0vLyBUaGUgYWxnb3JpdGhtIGZpcnN0IHNlYXJjaGVzIGZvciBhbiBleGFjdCBtYXRjaCBvZiBjb3VudHJ5IGFuZCBsYW5ndWFnZSwgaWYgbm90IGZvdW5kIGl0IHVzZXMKLS8vIHRoZSBMYW5ndWFnZS4gSWYgbm9uZSBpcyBmb3VuZCwgZmlyc3QgZW50cnkgaXMgdXNlZCBpbnN0ZWFkLgotc3RhdGljCi1jb25zdCB3Y2hhcl90KiBfY21zTUxVZ2V0V2lkZShjb25zdCBjbXNNTFUqIG1sdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAqbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDE2TnVtYmVyIExhbmd1YWdlQ29kZSwgY21zVUludDE2TnVtYmVyIENvdW50cnlDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDE2TnVtYmVyKiBVc2VkTGFuZ3VhZ2VDb2RlLCBjbXNVSW50MTZOdW1iZXIqIFVzZWRDb3VudHJ5Q29kZSkKLXsKLSAgICBpbnQgaTsKLSAgICBpbnQgQmVzdCA9IC0xOwotICAgIF9jbXNNTFVlbnRyeSogdjsKLQotICAgIGlmIChtbHUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAobWx1IC0+IEFsbG9jYXRlZEVudHJpZXMgPD0gMCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG1sdSAtPlVzZWRFbnRyaWVzOyBpKyspIHsKLQotICAgICAgICB2ID0gbWx1IC0+RW50cmllcyArIGk7Ci0KLSAgICAgICAgaWYgKHYgLT4gTGFuZ3VhZ2UgPT0gTGFuZ3VhZ2VDb2RlKSB7Ci0KLSAgICAgICAgICAgIGlmIChCZXN0ID09IC0xKSBCZXN0ID0gaTsKLQotICAgICAgICAgICAgaWYgKHYgLT4gQ291bnRyeSA9PSBDb3VudHJ5Q29kZSkgewotCi0gICAgICAgICAgICAgICAgaWYgKFVzZWRMYW5ndWFnZUNvZGUgIT0gTlVMTCkgKlVzZWRMYW5ndWFnZUNvZGUgPSB2IC0+TGFuZ3VhZ2U7Ci0gICAgICAgICAgICAgICAgaWYgKFVzZWRDb3VudHJ5Q29kZSAgIT0gTlVMTCkgKlVzZWRDb3VudHJ5Q29kZSA9IHYgLT5Db3VudHJ5OwotCi0gICAgICAgICAgICAgICAgaWYgKGxlbiAhPSBOVUxMKSAqbGVuID0gdiAtPkxlbjsKLQotICAgICAgICAgICAgICAgIHJldHVybiAod2NoYXJfdCopICgoY21zVUludDhOdW1iZXIqKSBtbHUgLT5NZW1Qb29sICsgdiAtPiBTdHJXKTsgICAgICAgIC8vIEZvdW5kIGV4YWN0IG1hdGNoCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBObyBzdHJpbmcgZm91bmQuIFJldHVybiBGaXJzdCBvbmUKLSAgICBpZiAoQmVzdCA9PSAtMSkKLSAgICAgICAgQmVzdCA9IDA7Ci0KLSAgICB2ID0gbWx1IC0+RW50cmllcyArIEJlc3Q7Ci0KLSAgICBpZiAoVXNlZExhbmd1YWdlQ29kZSAhPSBOVUxMKSAqVXNlZExhbmd1YWdlQ29kZSA9IHYgLT5MYW5ndWFnZTsKLSAgICBpZiAoVXNlZENvdW50cnlDb2RlICAhPSBOVUxMKSAqVXNlZENvdW50cnlDb2RlID0gdiAtPkNvdW50cnk7Ci0KLSAgICBpZiAobGVuICE9IE5VTEwpICpsZW4gICA9IHYgLT5MZW47Ci0KLSAgICByZXR1cm4od2NoYXJfdCopICgoY21zVUludDhOdW1iZXIqKSBtbHUgLT5NZW1Qb29sICsgdiAtPlN0clcpOwotfQotCi0KLS8vIE9idGFpbiBhbiBBU0NJSSByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2lkZSBzdHJpbmcuIFNldHRpbmcgYnVmZmVyIHRvIE5VTEwgcmV0dXJucyB0aGUgbGVuCi1jbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc01MVWdldEFTQ0lJKGNvbnN0IGNtc01MVSogbWx1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBMYW5ndWFnZUNvZGVbM10sIGNvbnN0IGNoYXIgQ291bnRyeUNvZGVbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBCdWZmZXIsIGNtc1VJbnQzMk51bWJlciBCdWZmZXJTaXplKQotewotICAgIGNvbnN0IHdjaGFyX3QgKldpZGU7Ci0gICAgY21zVUludDMyTnVtYmVyICBTdHJMZW4gPSAwOwotICAgIGNtc1VJbnQzMk51bWJlciBBU0NJSWxlbiwgaTsKLQotICAgIGNtc1VJbnQxNk51bWJlciBMYW5nICA9IF9jbXNBZGp1c3RFbmRpYW5lc3MxNigqKGNtc1VJbnQxNk51bWJlciopIExhbmd1YWdlQ29kZSk7Ci0gICAgY21zVUludDE2TnVtYmVyIENudHJ5ID0gX2Ntc0FkanVzdEVuZGlhbmVzczE2KCooY21zVUludDE2TnVtYmVyKikgQ291bnRyeUNvZGUpOwotCi0gICAgLy8gU2FuaXRpemUKLSAgICBpZiAobWx1ID09IE5VTEwpIHJldHVybiAwOwotCi0gICAgLy8gR2V0IFdpZGVDaGFyCi0gICAgV2lkZSA9IF9jbXNNTFVnZXRXaWRlKG1sdSwgJlN0ckxlbiwgTGFuZywgQ250cnksIE5VTEwsIE5VTEwpOwotICAgIGlmIChXaWRlID09IE5VTEwpIHJldHVybiAwOwotCi0gICAgQVNDSUlsZW4gPSBTdHJMZW4gLyBzaXplb2Yod2NoYXJfdCk7Ci0KLSAgICAvLyBNYXliZSB3ZSB3YW50IG9ubHkgdG8ga25vdyB0aGUgbGVuPwotICAgIGlmIChCdWZmZXIgPT0gTlVMTCkgcmV0dXJuIEFTQ0lJbGVuICsgMTsgLy8gTm90ZSB0aGUgemVybyBhdCB0aGUgZW5kCi0KLSAgICAvLyBObyBidWZmZXIgc2l6ZSBtZWFucyBubyBkYXRhCi0gICAgaWYgKEJ1ZmZlclNpemUgPD0gMCkgcmV0dXJuIDA7Ci0KLSAgICAvLyBTb21lIGNsaXBwaW5nIG1heSBiZSByZXF1aXJlZAotICAgIGlmIChCdWZmZXJTaXplIDwgQVNDSUlsZW4gKyAxKQotICAgICAgICBBU0NJSWxlbiA9IEJ1ZmZlclNpemUgLSAxOwotCi0gICAgLy8gUHJlY2VzcyBlYWNoIGNoYXJhY3RlcgotICAgIGZvciAoaT0wOyBpIDwgQVNDSUlsZW47IGkrKykgewotCi0gICAgICAgIGlmIChXaWRlW2ldID09IDApCi0gICAgICAgICAgICBCdWZmZXJbaV0gPSAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBCdWZmZXJbaV0gPSAoY2hhcikgV2lkZVtpXTsKLSAgICB9Ci0KLSAgICAvLyBXZSBwdXQgYSB0ZXJtaW5hdGlvbiAiXDAiCi0gICAgQnVmZmVyW0FTQ0lJbGVuXSA9IDA7Ci0gICAgcmV0dXJuIEFTQ0lJbGVuICsgMTsKLX0KLQotLy8gT2J0YWluIGEgd2lkZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgTUxVLCBvbiBkZXBlbmRpbmcgb24gY3VycmVudCBsb2NhbGUgc2V0dGluZ3MKLWNtc1VJbnQzMk51bWJlciBDTVNFWFBPUlQgY21zTUxVZ2V0V2lkZShjb25zdCBjbXNNTFUqIG1sdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBMYW5ndWFnZUNvZGVbM10sIGNvbnN0IGNoYXIgQ291bnRyeUNvZGVbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QqIEJ1ZmZlciwgY21zVUludDMyTnVtYmVyIEJ1ZmZlclNpemUpCi17Ci0gICAgY29uc3Qgd2NoYXJfdCAqV2lkZTsKLSAgICBjbXNVSW50MzJOdW1iZXIgIFN0ckxlbiA9IDA7Ci0KLSAgICBjbXNVSW50MTZOdW1iZXIgTGFuZyAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMTYoKihjbXNVSW50MTZOdW1iZXIqKSBMYW5ndWFnZUNvZGUpOwotICAgIGNtc1VJbnQxNk51bWJlciBDbnRyeSA9IF9jbXNBZGp1c3RFbmRpYW5lc3MxNigqKGNtc1VJbnQxNk51bWJlciopIENvdW50cnlDb2RlKTsKLQotICAgIC8vIFNhbml0aXplCi0gICAgaWYgKG1sdSA9PSBOVUxMKSByZXR1cm4gMDsKLQotICAgIFdpZGUgPSBfY21zTUxVZ2V0V2lkZShtbHUsICZTdHJMZW4sIExhbmcsIENudHJ5LCBOVUxMLCBOVUxMKTsKLSAgICBpZiAoV2lkZSA9PSBOVUxMKSByZXR1cm4gMDsKLQotICAgIC8vIE1heWJlIHdlIHdhbnQgb25seSB0byBrbm93IHRoZSBsZW4/Ci0gICAgaWYgKEJ1ZmZlciA9PSBOVUxMKSByZXR1cm4gU3RyTGVuICsgc2l6ZW9mKHdjaGFyX3QpOwotCi0gIC8vIE5vIGJ1ZmZlciBzaXplIG1lYW5zIG5vIGRhdGEKLSAgICBpZiAoQnVmZmVyU2l6ZSA8PSAwKSByZXR1cm4gMDsKLQotICAgIC8vIFNvbWUgY2xpcHBpbmcgbWF5IGJlIHJlcXVpcmVkCi0gICAgaWYgKEJ1ZmZlclNpemUgPCBTdHJMZW4gKyBzaXplb2Yod2NoYXJfdCkpCi0gICAgICAgIFN0ckxlbiA9IEJ1ZmZlclNpemUgLSArIHNpemVvZih3Y2hhcl90KTsKLQotICAgIG1lbW1vdmUoQnVmZmVyLCBXaWRlLCBTdHJMZW4pOwotICAgIEJ1ZmZlcltTdHJMZW4gLyBzaXplb2Yod2NoYXJfdCldID0gMDsKLQotICAgIHJldHVybiBTdHJMZW4gKyBzaXplb2Yod2NoYXJfdCk7Ci19Ci0KLQotLy8gR2V0IGFsc28gdGhlIGxhbmd1YWdlIGFuZCBjb3VudHJ5Ci1DTVNBUEkgY21zQm9vbCBDTVNFWFBPUlQgY21zTUxVZ2V0VHJhbnNsYXRpb24oY29uc3QgY21zTUxVKiBtbHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBMYW5ndWFnZUNvZGVbM10sIGNvbnN0IGNoYXIgQ291bnRyeUNvZGVbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBPYnRhaW5lZExhbmd1YWdlWzNdLCBjaGFyIE9idGFpbmVkQ291bnRyeVszXSkKLXsKLSAgICBjb25zdCB3Y2hhcl90ICpXaWRlOwotCi0gICAgY21zVUludDE2TnVtYmVyIExhbmcgID0gX2Ntc0FkanVzdEVuZGlhbmVzczE2KCooY21zVUludDE2TnVtYmVyKikgTGFuZ3VhZ2VDb2RlKTsKLSAgICBjbXNVSW50MTZOdW1iZXIgQ250cnkgPSBfY21zQWRqdXN0RW5kaWFuZXNzMTYoKihjbXNVSW50MTZOdW1iZXIqKSBDb3VudHJ5Q29kZSk7Ci0gICAgY21zVUludDE2TnVtYmVyIE9idExhbmcsIE9idENvZGU7Ci0KLSAgICAvLyBTYW5pdGl6ZQotICAgIGlmIChtbHUgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0gICAgV2lkZSA9IF9jbXNNTFVnZXRXaWRlKG1sdSwgTlVMTCwgTGFuZywgQ250cnksICZPYnRMYW5nLCAmT2J0Q29kZSk7Ci0gICAgaWYgKFdpZGUgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0gICAgLy8gR2V0IHVzZWQgbGFuZ3VhZ2UgYW5kIGNvZGUKLSAgICAqKGNtc1VJbnQxNk51bWJlciAqKU9idGFpbmVkTGFuZ3VhZ2UgPSBfY21zQWRqdXN0RW5kaWFuZXNzMTYoT2J0TGFuZyk7Ci0gICAgKihjbXNVSW50MTZOdW1iZXIgKilPYnRhaW5lZENvdW50cnkgID0gX2Ntc0FkanVzdEVuZGlhbmVzczE2KE9idENvZGUpOwotCi0gICAgT2J0YWluZWRMYW5ndWFnZVsyXSA9IE9idGFpbmVkQ291bnRyeVsyXSA9IDA7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotCi0vLyBHZXQgdGhlIG51bWJlciBvZiB0cmFuc2xhdGlvbnMgaW4gdGhlIE1MVSBvYmplY3QKLWNtc1VJbnQzMk51bWJlciBDTVNFWFBPUlQgY21zTUxVdHJhbnNsYXRpb25zQ291bnQoY29uc3QgY21zTUxVKiBtbHUpCi17Ci0gICAgaWYgKG1sdSA9PSBOVUxMKSByZXR1cm4gMDsKLSAgICByZXR1cm4gbWx1LT5Vc2VkRW50cmllczsKLX0KLQotLy8gR2V0IHRoZSBsYW5ndWFnZSBhbmQgY291bnRyeSBjb2RlcyBmb3IgYSBzcGVjaWZpYyBNTFUgaW5kZXgKLWNtc0Jvb2wgQ01TRVhQT1JUIGNtc01MVXRyYW5zbGF0aW9uc0NvZGVzKGNvbnN0IGNtc01MVSogbWx1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgTGFuZ3VhZ2VDb2RlWzNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBDb3VudHJ5Q29kZVszXSkKLXsKLSAgICBfY21zTUxVZW50cnkgKmVudHJ5OwotCi0gICAgaWYgKG1sdSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBpZiAoaWR4ID49IChjbXNVSW50MzJOdW1iZXIpIG1sdS0+VXNlZEVudHJpZXMpIHJldHVybiBGQUxTRTsKLQotICAgIGVudHJ5ID0gJm1sdS0+RW50cmllc1tpZHhdOwotICAgIAotICAgICooY21zVUludDE2TnVtYmVyICopTGFuZ3VhZ2VDb2RlID0gX2Ntc0FkanVzdEVuZGlhbmVzczE2KGVudHJ5LT5MYW5ndWFnZSk7Ci0gICAgKihjbXNVSW50MTZOdW1iZXIgKilDb3VudHJ5Q29kZSAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMTYoZW50cnktPkNvdW50cnkpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLy8gTmFtZWQgY29sb3IgbGlzdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gR3JvdyB0aGUgbGlzdCB0byBrZWVwIGF0IGxlYXN0IE51bUVsZW1lbnRzCi1zdGF0aWMKLWNtc0Jvb2wgIEdyb3dOYW1lZENvbG9yTGlzdChjbXNOQU1FRENPTE9STElTVCogdikKLXsKLSAgICBjbXNVSW50MzJOdW1iZXIgc2l6ZTsKLSAgICBfY21zTkFNRURDT0xPUiAqIE5ld1B0cjsKLQotICAgIGlmICh2ID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQotICAgIGlmICh2IC0+QWxsb2NhdGVkID09IDApCi0gICAgICAgIHNpemUgPSA2NDsgICAvLyBJbml0aWFsIGd1ZXNzCi0gICAgZWxzZQotICAgICAgICBzaXplID0gdiAtPkFsbG9jYXRlZCAqIDI7Ci0KLSAgICAvLyBLZWVwIGEgbWF4aW11bSBjb2xvciBsaXN0cyBjYW4gZ3JvdywgMTAwSyBlbnRyaWVzIHNlZW1zIHJlYXNvbmFibGUKLSAgICBpZiAoc2l6ZSA+IDEwMjQqMTAwKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBOZXdQdHIgPSAoX2Ntc05BTUVEQ09MT1IqKSBfY21zUmVhbGxvYyh2IC0+Q29udGV4dElELCB2IC0+TGlzdCwgc2l6ZSAqIHNpemVvZihfY21zTkFNRURDT0xPUikpOwotICAgIGlmIChOZXdQdHIgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgdiAtPkxpc3QgICAgICA9IE5ld1B0cjsKLSAgICB2IC0+QWxsb2NhdGVkID0gc2l6ZTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLy8gQWxsb2NhdGUgYSBsaXN0IGZvciBuIGVsZW1lbnRzCi1jbXNOQU1FRENPTE9STElTVCogQ01TRVhQT1JUIGNtc0FsbG9jTmFtZWRDb2xvckxpc3QoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBuLCBjbXNVSW50MzJOdW1iZXIgQ29sb3JhbnRDb3VudCwgY29uc3QgY2hhciogUHJlZml4LCBjb25zdCBjaGFyKiBTdWZmaXgpCi17Ci0gICAgY21zTkFNRURDT0xPUkxJU1QqIHYgPSAoY21zTkFNRURDT0xPUkxJU1QqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihjbXNOQU1FRENPTE9STElTVCkpOwotCi0gICAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICB2IC0+TGlzdCAgICAgID0gTlVMTDsKLSAgICB2IC0+bkNvbG9ycyAgID0gMDsKLSAgICB2IC0+Q29udGV4dElEICA9IENvbnRleHRJRDsKLQotICAgIHdoaWxlICh2IC0+IEFsbG9jYXRlZCA8IG4pIHsKLSAgICAgICAgaWYgKCFHcm93TmFtZWRDb2xvckxpc3QodikpIHsKLSAgICAgICAgICAgIGNtc0ZyZWVOYW1lZENvbG9yTGlzdCh2KTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RybmNweSh2IC0+UHJlZml4LCBQcmVmaXgsIHNpemVvZih2IC0+UHJlZml4KS0xKTsKLSAgICBzdHJuY3B5KHYgLT5TdWZmaXgsIFN1ZmZpeCwgc2l6ZW9mKHYgLT5TdWZmaXgpLTEpOwotICAgIHYtPlByZWZpeFszMl0gPSB2LT5TdWZmaXhbMzJdID0gMDsKLQotICAgIHYgLT4gQ29sb3JhbnRDb3VudCA9IENvbG9yYW50Q291bnQ7Ci0KLSAgICByZXR1cm4gdjsKLX0KLQotLy8gRnJlZSBhIGxpc3QKLXZvaWQgQ01TRVhQT1JUIGNtc0ZyZWVOYW1lZENvbG9yTGlzdChjbXNOQU1FRENPTE9STElTVCogdikKLXsKLSAgICBpZiAodiA9PSBOVUxMKSByZXR1cm47Ci0gICAgaWYgKHYgLT5MaXN0KSBfY21zRnJlZSh2IC0+Q29udGV4dElELCB2IC0+TGlzdCk7Ci0gICAgX2Ntc0ZyZWUodiAtPkNvbnRleHRJRCwgdik7Ci19Ci0KLWNtc05BTUVEQ09MT1JMSVNUKiBDTVNFWFBPUlQgY21zRHVwTmFtZWRDb2xvckxpc3QoY29uc3QgY21zTkFNRURDT0xPUkxJU1QqIHYpCi17Ci0gICAgY21zTkFNRURDT0xPUkxJU1QqIE5ld05DOwotCi0gICAgaWYgKHYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBOZXdOQz0gY21zQWxsb2NOYW1lZENvbG9yTGlzdCh2IC0+Q29udGV4dElELCB2IC0+IG5Db2xvcnMsIHYgLT5Db2xvcmFudENvdW50LCB2IC0+UHJlZml4LCB2IC0+U3VmZml4KTsKLSAgICBpZiAoTmV3TkMgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICAvLyBGb3IgcmVhbGx5IGxhcmdlIHRhYmxlcyB3ZSBuZWVkIHRoaXMKLSAgICB3aGlsZSAoTmV3TkMgLT5BbGxvY2F0ZWQgPCB2IC0+QWxsb2NhdGVkKSB7Ci0gICAgICAgIGlmICghR3Jvd05hbWVkQ29sb3JMaXN0KE5ld05DKSkgewotICAgICAgICAgICAgY21zRnJlZU5hbWVkQ29sb3JMaXN0KE5ld05DKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbWVtbW92ZShOZXdOQyAtPlByZWZpeCwgdiAtPlByZWZpeCwgc2l6ZW9mKHYgLT5QcmVmaXgpKTsKLSAgICBtZW1tb3ZlKE5ld05DIC0+U3VmZml4LCB2IC0+U3VmZml4LCBzaXplb2YodiAtPlN1ZmZpeCkpOwotICAgIE5ld05DIC0+Q29sb3JhbnRDb3VudCA9IHYgLT5Db2xvcmFudENvdW50OwotICAgIG1lbW1vdmUoTmV3TkMtPkxpc3QsIHYgLT5MaXN0LCB2LT5uQ29sb3JzICogc2l6ZW9mKF9jbXNOQU1FRENPTE9SKSk7Ci0gICAgTmV3TkMgLT5uQ29sb3JzID0gdiAtPm5Db2xvcnM7Ci0gICAgcmV0dXJuIE5ld05DOwotfQotCi0KLS8vIEFwcGVuZCBhIGNvbG9yIHRvIGEgbGlzdC4gTGlzdCBwb2ludGVyIG1heSBjaGFuZ2UgaWYgcmVhbGxvY2F0ZWQKLWNtc0Jvb2wgIENNU0VYUE9SVCBjbXNBcHBlbmROYW1lZENvbG9yKGNtc05BTUVEQ09MT1JMSVNUKiBOYW1lZENvbG9yTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIgUENTWzNdLCBjbXNVSW50MTZOdW1iZXIgQ29sb3JhbnRbY21zTUFYQ0hBTk5FTFNdKQotewotICAgIGNtc1VJbnQzMk51bWJlciBpOwotCi0gICAgaWYgKE5hbWVkQ29sb3JMaXN0ID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQotICAgIGlmIChOYW1lZENvbG9yTGlzdCAtPm5Db2xvcnMgKyAxID4gTmFtZWRDb2xvckxpc3QgLT5BbGxvY2F0ZWQpIHsKLSAgICAgICAgaWYgKCFHcm93TmFtZWRDb2xvckxpc3QoTmFtZWRDb2xvckxpc3QpKSByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgZm9yIChpPTA7IGkgPCBOYW1lZENvbG9yTGlzdCAtPkNvbG9yYW50Q291bnQ7IGkrKykKLSAgICAgICAgTmFtZWRDb2xvckxpc3QgLT5MaXN0W05hbWVkQ29sb3JMaXN0IC0+bkNvbG9yc10uRGV2aWNlQ29sb3JhbnRbaV0gPSBDb2xvcmFudCA9PSBOVUxMPyAwIDogQ29sb3JhbnRbaV07Ci0KLSAgICBmb3IgKGk9MDsgaSA8IDM7IGkrKykKLSAgICAgICAgTmFtZWRDb2xvckxpc3QgLT5MaXN0W05hbWVkQ29sb3JMaXN0IC0+bkNvbG9yc10uUENTW2ldID0gUENTID09IE5VTEwgPyAwIDogUENTW2ldOwotCi0gICAgaWYgKE5hbWUgIT0gTlVMTCkgewotCi0gICAgICAgIHN0cm5jcHkoTmFtZWRDb2xvckxpc3QgLT5MaXN0W05hbWVkQ29sb3JMaXN0IC0+bkNvbG9yc10uTmFtZSwgTmFtZSwgY21zTUFYX1BBVEgtMSk7Ci0gICAgICAgIE5hbWVkQ29sb3JMaXN0IC0+TGlzdFtOYW1lZENvbG9yTGlzdCAtPm5Db2xvcnNdLk5hbWVbY21zTUFYX1BBVEgtMV0gPSAwOwotCi0gICAgfQotICAgIGVsc2UKLSAgICAgICAgTmFtZWRDb2xvckxpc3QgLT5MaXN0W05hbWVkQ29sb3JMaXN0IC0+bkNvbG9yc10uTmFtZVswXSA9IDA7Ci0KLQotICAgIE5hbWVkQ29sb3JMaXN0IC0+bkNvbG9ycysrOwotICAgIHJldHVybiBUUlVFOwotfQotCi0vLyBSZXR1cm5zIG51bWJlciBvZiBlbGVtZW50cwotY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNOYW1lZENvbG9yQ291bnQoY29uc3QgY21zTkFNRURDT0xPUkxJU1QqIE5hbWVkQ29sb3JMaXN0KQotewotICAgICBpZiAoTmFtZWRDb2xvckxpc3QgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gICAgIHJldHVybiBOYW1lZENvbG9yTGlzdCAtPm5Db2xvcnM7Ci19Ci0KLS8vIEluZm8gYWJvb3V0IGEgZ2l2ZW4gY29sb3IKLWNtc0Jvb2wgIENNU0VYUE9SVCBjbXNOYW1lZENvbG9ySW5mbyhjb25zdCBjbXNOQU1FRENPTE9STElTVCogTmFtZWRDb2xvckxpc3QsIGNtc1VJbnQzMk51bWJlciBuQ29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBQcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogU3VmZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQxNk51bWJlciogUENTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQxNk51bWJlciogQ29sb3JhbnQpCi17Ci0gICAgaWYgKE5hbWVkQ29sb3JMaXN0ID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQotICAgIGlmIChuQ29sb3IgPj0gY21zTmFtZWRDb2xvckNvdW50KE5hbWVkQ29sb3JMaXN0KSkgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKE5hbWUpIHN0cmNweShOYW1lLCBOYW1lZENvbG9yTGlzdC0+TGlzdFtuQ29sb3JdLk5hbWUpOwotICAgIGlmIChQcmVmaXgpIHN0cmNweShQcmVmaXgsIE5hbWVkQ29sb3JMaXN0LT5QcmVmaXgpOwotICAgIGlmIChTdWZmaXgpIHN0cmNweShTdWZmaXgsIE5hbWVkQ29sb3JMaXN0LT5TdWZmaXgpOwotICAgIGlmIChQQ1MpCi0gICAgICAgIG1lbW1vdmUoUENTLCBOYW1lZENvbG9yTGlzdCAtPkxpc3RbbkNvbG9yXS5QQ1MsIDMqc2l6ZW9mKGNtc1VJbnQxNk51bWJlcikpOwotCi0gICAgaWYgKENvbG9yYW50KQotICAgICAgICBtZW1tb3ZlKENvbG9yYW50LCBOYW1lZENvbG9yTGlzdCAtPkxpc3RbbkNvbG9yXS5EZXZpY2VDb2xvcmFudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNtc1VJbnQxNk51bWJlcikgKiBOYW1lZENvbG9yTGlzdCAtPkNvbG9yYW50Q291bnQpOwotCi0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLy8gU2VhcmNoIGZvciBhIGdpdmVuIGNvbG9yIG5hbWUgKG5vIHByZWZpeCBvciBzdWZmaXgpCi1jbXNJbnQzMk51bWJlciBDTVNFWFBPUlQgY21zTmFtZWRDb2xvckluZGV4KGNvbnN0IGNtc05BTUVEQ09MT1JMSVNUKiBOYW1lZENvbG9yTGlzdCwgY29uc3QgY2hhciogTmFtZSkKLXsKLSAgICBpbnQgaSwgbjsKLQotICAgIGlmIChOYW1lZENvbG9yTGlzdCA9PSBOVUxMKSByZXR1cm4gLTE7Ci0gICAgbiA9IGNtc05hbWVkQ29sb3JDb3VudChOYW1lZENvbG9yTGlzdCk7Ci0gICAgZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgaWYgKGNtc3N0cmNhc2VjbXAoTmFtZSwgIE5hbWVkQ29sb3JMaXN0LT5MaXN0W2ldLk5hbWUpID09IDApCi0gICAgICAgICAgICByZXR1cm4gaTsKLSAgICB9Ci0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLS8vIE1QRSBzdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYwotdm9pZCBGcmVlTmFtZWRDb2xvckxpc3QoY21zU3RhZ2UqIG1wZSkKLXsKLSAgICBjbXNOQU1FRENPTE9STElTVCogTGlzdCA9IChjbXNOQU1FRENPTE9STElTVCopIG1wZSAtPkRhdGE7Ci0gICAgY21zRnJlZU5hbWVkQ29sb3JMaXN0KExpc3QpOwotfQotCi1zdGF0aWMKLXZvaWQqIER1cE5hbWVkQ29sb3JMaXN0KGNtc1N0YWdlKiBtcGUpCi17Ci0gICAgY21zTkFNRURDT0xPUkxJU1QqIExpc3QgPSAoY21zTkFNRURDT0xPUkxJU1QqKSBtcGUgLT5EYXRhOwotICAgIHJldHVybiBjbXNEdXBOYW1lZENvbG9yTGlzdChMaXN0KTsKLX0KLQotc3RhdGljCi12b2lkIEV2YWxOYW1lZENvbG9yUENTKGNvbnN0IGNtc0Zsb2F0MzJOdW1iZXIgSW5bXSwgY21zRmxvYXQzMk51bWJlciBPdXRbXSwgY29uc3QgY21zU3RhZ2UgKm1wZSkKLXsKLSAgICBjbXNOQU1FRENPTE9STElTVCogTmFtZWRDb2xvckxpc3QgPSAoY21zTkFNRURDT0xPUkxJU1QqKSBtcGUgLT5EYXRhOwotICAgIGNtc1VJbnQxNk51bWJlciBpbmRleCA9IChjbXNVSW50MTZOdW1iZXIpIF9jbXNRdWlja1NhdHVyYXRlV29yZChJblswXSAqIDY1NTM1LjApOwotCi0gICAgaWYgKGluZGV4ID49IE5hbWVkQ29sb3JMaXN0LT4gbkNvbG9ycykgewotICAgICAgICBjbXNTaWduYWxFcnJvcihOYW1lZENvbG9yTGlzdCAtPkNvbnRleHRJRCwgY21zRVJST1JfUkFOR0UsICJDb2xvciAlZCBvdXQgb2YgcmFuZ2U7IGlnbm9yZWQiLCBpbmRleCk7Ci0gICAgfQotICAgIGVsc2UgewotCi0gICAgICAgICAgICAvLyBOYW1lZCBjb2xvciBhbHdheXMgdXNlcyBMYWIKLSAgICAgICAgICAgIE91dFswXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoTmFtZWRDb2xvckxpc3QtPkxpc3RbaW5kZXhdLlBDU1swXSAvIDY1NTM1LjApOwotICAgICAgICAgICAgT3V0WzFdID0gKGNtc0Zsb2F0MzJOdW1iZXIpIChOYW1lZENvbG9yTGlzdC0+TGlzdFtpbmRleF0uUENTWzFdIC8gNjU1MzUuMCk7Ci0gICAgICAgICAgICBPdXRbMl0gPSAoY21zRmxvYXQzMk51bWJlcikgKE5hbWVkQ29sb3JMaXN0LT5MaXN0W2luZGV4XS5QQ1NbMl0gLyA2NTUzNS4wKTsKLSAgICB9Ci19Ci0KLXN0YXRpYwotdm9pZCBFdmFsTmFtZWRDb2xvcihjb25zdCBjbXNGbG9hdDMyTnVtYmVyIEluW10sIGNtc0Zsb2F0MzJOdW1iZXIgT3V0W10sIGNvbnN0IGNtc1N0YWdlICptcGUpCi17Ci0gICAgY21zTkFNRURDT0xPUkxJU1QqIE5hbWVkQ29sb3JMaXN0ID0gKGNtc05BTUVEQ09MT1JMSVNUKikgbXBlIC0+RGF0YTsKLSAgICBjbXNVSW50MTZOdW1iZXIgaW5kZXggPSAoY21zVUludDE2TnVtYmVyKSBfY21zUXVpY2tTYXR1cmF0ZVdvcmQoSW5bMF0gKiA2NTUzNS4wKTsKLSAgICBjbXNVSW50MzJOdW1iZXIgajsKLQotICAgIGlmIChpbmRleCA+PSBOYW1lZENvbG9yTGlzdC0+IG5Db2xvcnMpIHsKLSAgICAgICAgY21zU2lnbmFsRXJyb3IoTmFtZWRDb2xvckxpc3QgLT5Db250ZXh0SUQsIGNtc0VSUk9SX1JBTkdFLCAiQ29sb3IgJWQgb3V0IG9mIHJhbmdlOyBpZ25vcmVkIiwgaW5kZXgpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgZm9yIChqPTA7IGogPCBOYW1lZENvbG9yTGlzdCAtPkNvbG9yYW50Q291bnQ7IGorKykKLSAgICAgICAgICAgIE91dFtqXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoTmFtZWRDb2xvckxpc3QtPkxpc3RbaW5kZXhdLkRldmljZUNvbG9yYW50W2pdIC8gNjU1MzUuMCk7Ci0gICAgfQotfQotCi0KLS8vIE5hbWVkIGNvbG9yIGxvb2t1cCBlbGVtZW50Ci1jbXNTdGFnZSogX2Ntc1N0YWdlQWxsb2NOYW1lZENvbG9yKGNtc05BTUVEQ09MT1JMSVNUKiBOYW1lZENvbG9yTGlzdCwgY21zQm9vbCBVc2VQQ1MpCi17Ci0gICAgcmV0dXJuIF9jbXNTdGFnZUFsbG9jUGxhY2Vob2xkZXIoTmFtZWRDb2xvckxpc3QgLT5Db250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1NpZ05hbWVkQ29sb3JFbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgVXNlUENTID8gMyA6IE5hbWVkQ29sb3JMaXN0IC0+Q29sb3JhbnRDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlUENTID8gRXZhbE5hbWVkQ29sb3JQQ1MgOiBFdmFsTmFtZWRDb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHVwTmFtZWRDb2xvckxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWVOYW1lZENvbG9yTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRHVwTmFtZWRDb2xvckxpc3QoTmFtZWRDb2xvckxpc3QpKTsKLQotfQotCi0KLS8vIFJldHJpZXZlIHRoZSBuYW1lZCBjb2xvciBsaXN0IGZyb20gYSB0cmFuc2Zvcm0uIFNob3VsZCBiZSBmaXJzdCBlbGVtZW50IGluIHRoZSBMVVQKLWNtc05BTUVEQ09MT1JMSVNUKiBDTVNFWFBPUlQgY21zR2V0TmFtZWRDb2xvckxpc3QoY21zSFRSQU5TRk9STSB4Zm9ybSkKLXsKLSAgICBfY21zVFJBTlNGT1JNKiB2ID0gKF9jbXNUUkFOU0ZPUk0qKSB4Zm9ybTsKLSAgICBjbXNTdGFnZSogbXBlICA9IHYgLT5MdXQtPkVsZW1lbnRzOwotCi0gICAgaWYgKG1wZSAtPlR5cGUgIT0gY21zU2lnTmFtZWRDb2xvckVsZW1UeXBlKSByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gKGNtc05BTUVEQ09MT1JMSVNUKikgbXBlIC0+RGF0YTsKLX0KLQotCi0vLyBQcm9maWxlIHNlcXVlbmNlIGRlc2NyaXB0aW9uIHJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY21zU0VRKiBDTVNFWFBPUlQgY21zQWxsb2NQcm9maWxlU2VxdWVuY2VEZXNjcmlwdGlvbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVUludDMyTnVtYmVyIG4pCi17Ci0gICAgY21zU0VRKiBTZXE7Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0KLSAgICBpZiAobiA9PSAwKSByZXR1cm4gTlVMTDsKLQotICAgIC8vIEluIGEgYWJzb2x1dGVseSBhcmJpdHJhcnkgd2F5LCBJIGhlcmVieSBkZWNpZGUgdG8gYWxsb3cgYSBtYXhpbSBvZiAyNTUgcHJvZmlsZXMgbGlua2VkCi0gICAgLy8gaW4gYSBkZXZpY2VsaW5rLiBJdCBtYWtlcyBub3Qgc2Vuc2UgYW55d2F5IGFuZCBtYXkgYmUgdXNlZCBmb3IgZXhwbG9pdHMsIHNvIGxldCdzIGNsb3NlIHRoZSBkb29yIQotICAgIGlmIChuID4gMjU1KSByZXR1cm4gTlVMTDsKLQotICAgIFNlcSA9IChjbXNTRVEqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihjbXNTRVEpKTsKLSAgICBpZiAoU2VxID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgU2VxIC0+IENvbnRleHRJRCA9IENvbnRleHRJRDsKLSAgICBTZXEgLT4gc2VxICAgICAgPSAoY21zUFNFUURFU0MqKSBfY21zQ2FsbG9jKENvbnRleHRJRCwgbiwgc2l6ZW9mKGNtc1BTRVFERVNDKSk7Ci0gICAgU2VxIC0+IG4gICAgICAgID0gbjsKLQotICAgIGlmIChTZXEgLT4gc2VxID09IE5VTEwpIHsKLSAgICAgICAgX2Ntc0ZyZWUoQ29udGV4dElELCBTZXEpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG47IGkrKykgewotICAgICAgICBTZXEgLT4gc2VxW2ldLk1hbnVmYWN0dXJlciA9IE5VTEw7Ci0gICAgICAgIFNlcSAtPiBzZXFbaV0uTW9kZWwgICAgICAgID0gTlVMTDsKLSAgICAgICAgU2VxIC0+IHNlcVtpXS5EZXNjcmlwdGlvbiAgPSBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBTZXE7Ci19Ci0KLXZvaWQgQ01TRVhQT1JUIGNtc0ZyZWVQcm9maWxlU2VxdWVuY2VEZXNjcmlwdGlvbihjbXNTRVEqIHBzZXEpCi17Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IHBzZXEgLT5uOyBpKyspIHsKLSAgICAgICAgaWYgKHBzZXEgLT5zZXFbaV0uTWFudWZhY3R1cmVyICE9IE5VTEwpIGNtc01MVWZyZWUocHNlcSAtPnNlcVtpXS5NYW51ZmFjdHVyZXIpOwotICAgICAgICBpZiAocHNlcSAtPnNlcVtpXS5Nb2RlbCAhPSBOVUxMKSBjbXNNTFVmcmVlKHBzZXEgLT5zZXFbaV0uTW9kZWwpOwotICAgICAgICBpZiAocHNlcSAtPnNlcVtpXS5EZXNjcmlwdGlvbiAhPSBOVUxMKSBjbXNNTFVmcmVlKHBzZXEgLT5zZXFbaV0uRGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIGlmIChwc2VxIC0+c2VxICE9IE5VTEwpIF9jbXNGcmVlKHBzZXEgLT5Db250ZXh0SUQsIHBzZXEgLT5zZXEpOwotICAgIF9jbXNGcmVlKHBzZXEgLT4gQ29udGV4dElELCBwc2VxKTsKLX0KLQotY21zU0VRKiBDTVNFWFBPUlQgY21zRHVwUHJvZmlsZVNlcXVlbmNlRGVzY3JpcHRpb24oY29uc3QgY21zU0VRKiBwc2VxKQotewotICAgIGNtc1NFUSAqTmV3U2VxOwotICAgIGNtc1VJbnQzMk51bWJlciBpOwotCi0gICAgaWYgKHBzZXEgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBOZXdTZXEgPSAoY21zU0VRKikgX2Ntc01hbGxvYyhwc2VxIC0+IENvbnRleHRJRCwgc2l6ZW9mKGNtc1NFUSkpOwotICAgIGlmIChOZXdTZXEgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLQotICAgIE5ld1NlcSAtPiBzZXEgICAgICA9IChjbXNQU0VRREVTQyopIF9jbXNDYWxsb2MocHNlcSAtPkNvbnRleHRJRCwgcHNlcSAtPm4sIHNpemVvZihjbXNQU0VRREVTQykpOwotICAgIGlmIChOZXdTZXEgLT5zZXEgPT0gTlVMTCkgZ290byBFcnJvcjsKLQotICAgIE5ld1NlcSAtPiBDb250ZXh0SUQgPSBwc2VxIC0+Q29udGV4dElEOwotICAgIE5ld1NlcSAtPiBuICAgICAgICA9IHBzZXEgLT5uOwotCi0gICAgZm9yIChpPTA7IGkgPCBwc2VxLT5uOyBpKyspIHsKLQotICAgICAgICBtZW1tb3ZlKCZOZXdTZXEgLT5zZXFbaV0uYXR0cmlidXRlcywgJnBzZXEgLT5zZXFbaV0uYXR0cmlidXRlcywgc2l6ZW9mKGNtc1VJbnQ2NE51bWJlcikpOwotCi0gICAgICAgIE5ld1NlcSAtPnNlcVtpXS5kZXZpY2VNZmcgICA9IHBzZXEgLT5zZXFbaV0uZGV2aWNlTWZnOwotICAgICAgICBOZXdTZXEgLT5zZXFbaV0uZGV2aWNlTW9kZWwgPSBwc2VxIC0+c2VxW2ldLmRldmljZU1vZGVsOwotICAgICAgICBtZW1tb3ZlKCZOZXdTZXEgLT5zZXFbaV0uUHJvZmlsZUlELCAmcHNlcSAtPnNlcVtpXS5Qcm9maWxlSUQsIHNpemVvZihjbXNQcm9maWxlSUQpKTsKLSAgICAgICAgTmV3U2VxIC0+c2VxW2ldLnRlY2hub2xvZ3kgID0gcHNlcSAtPnNlcVtpXS50ZWNobm9sb2d5OwotCi0gICAgICAgIE5ld1NlcSAtPnNlcVtpXS5NYW51ZmFjdHVyZXIgPSBjbXNNTFVkdXAocHNlcSAtPnNlcVtpXS5NYW51ZmFjdHVyZXIpOwotICAgICAgICBOZXdTZXEgLT5zZXFbaV0uTW9kZWwgICAgICAgID0gY21zTUxVZHVwKHBzZXEgLT5zZXFbaV0uTW9kZWwpOwotICAgICAgICBOZXdTZXEgLT5zZXFbaV0uRGVzY3JpcHRpb24gID0gY21zTUxVZHVwKHBzZXEgLT5zZXFbaV0uRGVzY3JpcHRpb24pOwotCi0gICAgfQotCi0gICAgcmV0dXJuIE5ld1NlcTsKLQotRXJyb3I6Ci0KLSAgICBjbXNGcmVlUHJvZmlsZVNlcXVlbmNlRGVzY3JpcHRpb24oTmV3U2VxKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLy8gRGljdGlvbmFyaWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIERpY3Rpb25hcmllcyBhcmUganVzdCB2ZXJ5IHNpbXBsZSBsaW5rZWQgbGlzdHMKLQotCi10eXBlZGVmIHN0cnVjdCBfY21zRElDVF9zdHJ1Y3QgewotICAgIGNtc0RJQ1RlbnRyeSogaGVhZDsKLSAgICBjbXNDb250ZXh0IENvbnRleHRJRDsKLX0gX2Ntc0RJQ1Q7Ci0KLQotLy8gQWxsb2NhdGUgYW4gZW1wdHkgZGljdGlvbmFyeQotY21zSEFORExFIENNU0VYUE9SVCBjbXNEaWN0QWxsb2MoY21zQ29udGV4dCBDb250ZXh0SUQpCi17Ci0gICAgX2Ntc0RJQ1QqIGRpY3QgPSAoX2Ntc0RJQ1QqKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihfY21zRElDVCkpOwotICAgIGlmIChkaWN0ID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgZGljdCAtPkNvbnRleHRJRCA9IENvbnRleHRJRDsKLSAgICByZXR1cm4gKGNtc0hBTkRMRSkgZGljdDsKLQotfQotCi0vLyBEaXNwb3NlIHJlc291cmNlcwotdm9pZCBDTVNFWFBPUlQgY21zRGljdEZyZWUoY21zSEFORExFIGhEaWN0KQotewotICAgIF9jbXNESUNUKiBkaWN0ID0gKF9jbXNESUNUKikgaERpY3Q7Ci0gICAgY21zRElDVGVudHJ5ICplbnRyeSwgKm5leHQ7Ci0KLSAgICBfY21zQXNzZXJ0KGRpY3QgIT0gTlVMTCk7Ci0KLSAgICAvLyBXYWxrIHRoZSBsaXN0IGZyZWVpbmcgYWxsIG5vZGVzCi0gICAgZW50cnkgPSBkaWN0IC0+aGVhZDsKLSAgICB3aGlsZSAoZW50cnkgIT0gTlVMTCkgewotCi0gICAgICAgICAgICBpZiAoZW50cnkgLT5EaXNwbGF5TmFtZSAgIT0gTlVMTCkgY21zTUxVZnJlZShlbnRyeSAtPkRpc3BsYXlOYW1lKTsKLSAgICAgICAgICAgIGlmIChlbnRyeSAtPkRpc3BsYXlWYWx1ZSAhPSBOVUxMKSBjbXNNTFVmcmVlKGVudHJ5IC0+RGlzcGxheVZhbHVlKTsKLSAgICAgICAgICAgIGlmIChlbnRyeSAtPk5hbWUgIT0gTlVMTCkgX2Ntc0ZyZWUoZGljdCAtPkNvbnRleHRJRCwgZW50cnkgLT4gTmFtZSk7Ci0gICAgICAgICAgICBpZiAoZW50cnkgLT5WYWx1ZSAhPSBOVUxMKSBfY21zRnJlZShkaWN0IC0+Q29udGV4dElELCBlbnRyeSAtPiBWYWx1ZSk7Ci0KLSAgICAgICAgICAgIC8vIERvbid0IGZhbGwgaW4gdGhlIGhhYml0dWFsIHRyYXAuLi4KLSAgICAgICAgICAgIG5leHQgPSBlbnRyeSAtPk5leHQ7Ci0gICAgICAgICAgICBfY21zRnJlZShkaWN0IC0+Q29udGV4dElELCBlbnRyeSk7Ci0KLSAgICAgICAgICAgIGVudHJ5ID0gbmV4dDsKLSAgICB9Ci0KLSAgICBfY21zRnJlZShkaWN0IC0+Q29udGV4dElELCBkaWN0KTsKLX0KLQotCi0vLyBEdXBsaWNhdGUgYSB3aWRlIGNoYXIgc3RyaW5nCi1zdGF0aWMKLXdjaGFyX3QqIER1cFdjcyhjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3Qgd2NoYXJfdCogcHRyKQotewotICAgIGlmIChwdHIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuICh3Y2hhcl90KikgX2Ntc0R1cE1lbShDb250ZXh0SUQsIHB0ciwgKG15d2NzbGVuKHB0cikgKyAxKSAqIHNpemVvZih3Y2hhcl90KSk7Ci19Ci0KLS8vIEFkZCBhIG5ldyBlbnRyeSB0byB0aGUgbGlua2VkIGxpc3QKLWNtc0Jvb2wgQ01TRVhQT1JUIGNtc0RpY3RBZGRFbnRyeShjbXNIQU5ETEUgaERpY3QsIGNvbnN0IHdjaGFyX3QqIE5hbWUsIGNvbnN0IHdjaGFyX3QqIFZhbHVlLCBjb25zdCBjbXNNTFUgKkRpc3BsYXlOYW1lLCBjb25zdCBjbXNNTFUgKkRpc3BsYXlWYWx1ZSkKLXsKLSAgICBfY21zRElDVCogZGljdCA9IChfY21zRElDVCopIGhEaWN0OwotICAgIGNtc0RJQ1RlbnRyeSAqZW50cnk7Ci0KLSAgICBfY21zQXNzZXJ0KGRpY3QgIT0gTlVMTCk7Ci0gICAgX2Ntc0Fzc2VydChOYW1lICE9IE5VTEwpOwotCi0gICAgZW50cnkgPSAoY21zRElDVGVudHJ5KikgX2Ntc01hbGxvY1plcm8oZGljdCAtPkNvbnRleHRJRCwgc2l6ZW9mKGNtc0RJQ1RlbnRyeSkpOwotICAgIGlmIChlbnRyeSA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBlbnRyeSAtPkRpc3BsYXlOYW1lICA9IGNtc01MVWR1cChEaXNwbGF5TmFtZSk7Ci0gICAgZW50cnkgLT5EaXNwbGF5VmFsdWUgPSBjbXNNTFVkdXAoRGlzcGxheVZhbHVlKTsKLSAgICBlbnRyeSAtPk5hbWUgICAgICAgICA9IER1cFdjcyhkaWN0IC0+Q29udGV4dElELCBOYW1lKTsKLSAgICBlbnRyeSAtPlZhbHVlICAgICAgICA9IER1cFdjcyhkaWN0IC0+Q29udGV4dElELCBWYWx1ZSk7Ci0KLSAgICBlbnRyeSAtPk5leHQgPSBkaWN0IC0+aGVhZDsKLSAgICBkaWN0IC0+aGVhZCA9IGVudHJ5OwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLy8gRHVwbGljYXRlcyBhbiBleGlzdGluZyBkaWN0aW9uYXJ5Ci1jbXNIQU5ETEUgQ01TRVhQT1JUIGNtc0RpY3REdXAoY21zSEFORExFIGhEaWN0KQotewotICAgIF9jbXNESUNUKiBvbGRfZGljdCA9IChfY21zRElDVCopIGhEaWN0OwotICAgIGNtc0hBTkRMRSBoTmV3OwotICAgIGNtc0RJQ1RlbnRyeSAqZW50cnk7Ci0KLSAgICBfY21zQXNzZXJ0KG9sZF9kaWN0ICE9IE5VTEwpOwotCi0gICAgaE5ldyAgPSBjbXNEaWN0QWxsb2Mob2xkX2RpY3QgLT5Db250ZXh0SUQpOwotICAgIGlmIChoTmV3ID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgLy8gV2FsayB0aGUgbGlzdCBmcmVlaW5nIGFsbCBub2RlcwotICAgIGVudHJ5ID0gb2xkX2RpY3QgLT5oZWFkOwotICAgIHdoaWxlIChlbnRyeSAhPSBOVUxMKSB7Ci0KLSAgICAgICAgaWYgKCFjbXNEaWN0QWRkRW50cnkoaE5ldywgZW50cnkgLT5OYW1lLCBlbnRyeSAtPlZhbHVlLCBlbnRyeSAtPkRpc3BsYXlOYW1lLCBlbnRyeSAtPkRpc3BsYXlWYWx1ZSkpIHsKLQotICAgICAgICAgICAgY21zRGljdEZyZWUoaE5ldyk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGVudHJ5ID0gZW50cnkgLT4gTmV4dDsKLSAgICB9Ci0KLSAgICByZXR1cm4gaE5ldzsKLX0KLQotLy8gR2V0IGEgcG9pbnRlciB0byB0aGUgbGlua2VkIGxpc3QKLWNvbnN0IGNtc0RJQ1RlbnRyeSogQ01TRVhQT1JUIGNtc0RpY3RHZXRFbnRyeUxpc3QoY21zSEFORExFIGhEaWN0KQotewotICAgIF9jbXNESUNUKiBkaWN0ID0gKF9jbXNESUNUKikgaERpY3Q7Ci0KLSAgICBpZiAoZGljdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgICByZXR1cm4gZGljdCAtPmhlYWQ7Ci19Ci0KLS8vIEhlbHBlciBGb3IgZXh0ZXJuYWwgbGFuZ3VhZ2VzCi1jb25zdCBjbXNESUNUZW50cnkqIENNU0VYUE9SVCBjbXNEaWN0TmV4dEVudHJ5KGNvbnN0IGNtc0RJQ1RlbnRyeSogZSkKLXsKLSAgICAgaWYgKGUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0gICAgIHJldHVybiBlIC0+TmV4dDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zb3B0LmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc29wdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmRlMDE1Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zb3B0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODExICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDExIE1hcnRpIE1hcmlhIFNhZ3VlcgotLy8KLS8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCi0vLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKLS8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0vLwotLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLS8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotLy8KLS8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAotLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCi0vLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQotLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgotLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLQotI2luY2x1ZGUgImxjbXMyX2ludGVybmFsLmgiCi0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIE9wdGltaXphdGlvbiBmb3IgOCBiaXRzLCBTaGFwZXItQ0xVVCAoMyBpbnB1dHMgb25seSkKLXR5cGVkZWYgc3RydWN0IHsKLQotICAgIGNtc0NvbnRleHQgQ29udGV4dElEOwotCi0gICAgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBwOyAgIC8vIFRldHJhaGVkcmljYWwgaW50ZXJwb2xhdGlvbiBwYXJhbWV0ZXJzLiBUaGlzIGlzIGEgbm90LW93bmVkIHBvaW50ZXIuCi0KLSAgICBjbXNVSW50MTZOdW1iZXIgcnhbMjU2XSwgcnlbMjU2XSwgcnpbMjU2XTsKLSAgICBjbXNVSW50MzJOdW1iZXIgWDBbMjU2XSwgWTBbMjU2XSwgWjBbMjU2XTsgIC8vIFByZWNvbXB1dGVkIG5vZGVzIGFuZCBvZmZzZXRzIGZvciA4LWJpdCBpbnB1dCBkYXRhCi0KLQotfSBQcmVsaW44RGF0YTsKLQotCi0vLyBHZW5lcmljIG9wdGltaXphdGlvbiBmb3IgMTYgYml0cyBTaGFwZXItQ0xVVC1TaGFwZXIgKGFueSBpbnB1dHMpCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBjbXNDb250ZXh0IENvbnRleHRJRDsKLQotICAgIC8vIE51bWJlciBvZiBjaGFubmVscwotICAgIGludCBuSW5wdXRzOwotICAgIGludCBuT3V0cHV0czsKLQotICAgIF9jbXNJbnRlcnBGbjE2IEV2YWxDdXJ2ZUluMTZbTUFYX0lOUFVUX0RJTUVOU0lPTlNdOyAgICAgICAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMgaXMga25vd24gaW4gYWR2YW5jZQotICAgIGNtc0ludGVycFBhcmFtcyogIFBhcmFtc0N1cnZlSW4xNltNQVhfSU5QVVRfRElNRU5TSU9OU107Ci0KLSAgICBfY21zSW50ZXJwRm4xNiBFdmFsQ0xVVDsgICAgICAgICAgICAvLyBUaGUgZXZhbHVhdG9yIGZvciAzRCBncmlkCi0gICAgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBDTFVUcGFyYW1zOyAgLy8gKG5vdC1vd25lZCBwb2ludGVyKQotCi0KLSAgICBfY21zSW50ZXJwRm4xNiogRXZhbEN1cnZlT3V0MTY7ICAgICAgIC8vIFBvaW50cyB0byBhbiBhcnJheSBvZiBjdXJ2ZSBldmFsdWF0b3JzIGluIDE2IGJpdHMgKG5vdC1vd25lZCBwb2ludGVyKQotICAgIGNtc0ludGVycFBhcmFtcyoqICBQYXJhbXNDdXJ2ZU91dDE2OyAgLy8gUG9pbnRzIHRvIGFuIGFycmF5IG9mIHJlZmVyZW5jZXMgdG8gaW50ZXJwb2xhdGlvbiBwYXJhbXMgKG5vdC1vd25lZCBwb2ludGVyKQotCi0KLX0gUHJlbGluMTZEYXRhOwotCi0KLS8vIE9wdGltaXphdGlvbiBmb3IgbWF0cml4LXNoYXBlciBpbiA4IGJpdHMuIE51bWJlcnMgYXJlIG9wZXJhdGVkIGluIG4uMTQgc2lnbmVkLCB0YWJsZXMgYXJlIHN0b3JlZCBpbiAxLjE0IGZpeGVkCi0KLXR5cGVkZWYgY21zSW50MzJOdW1iZXIgY21zUzFGaXhlZDE0TnVtYmVyOyAgIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBob2xkIG1vcmUgdGhhbiAxNiBiaXRzIQotCi0jZGVmaW5lIERPVUJMRV9UT18xRklYRUQxNCh4KSAoKGNtc1MxRml4ZWQxNE51bWJlcikgZmxvb3IoKHgpICogMTYzODQuMCArIDAuNSkpCi0KLXR5cGVkZWYgc3RydWN0IHsKLQotICAgIGNtc0NvbnRleHQgQ29udGV4dElEOwotCi0gICAgY21zUzFGaXhlZDE0TnVtYmVyIFNoYXBlcjFSWzI1Nl07ICAvLyBmcm9tIDAuLjI1NSB0byAxLjE0ICAoMC4wLi4uMS4wKQotICAgIGNtc1MxRml4ZWQxNE51bWJlciBTaGFwZXIxR1syNTZdOwotICAgIGNtc1MxRml4ZWQxNE51bWJlciBTaGFwZXIxQlsyNTZdOwotCi0gICAgY21zUzFGaXhlZDE0TnVtYmVyIE1hdFszXVszXTsgICAgIC8vIG4uMTQgdG8gbi4xNCAobmVlZHMgYSBzYXR1cmF0aW9uIGFmdGVyIHRoYXQpCi0gICAgY21zUzFGaXhlZDE0TnVtYmVyIE9mZlszXTsKLQotICAgIGNtc1VJbnQxNk51bWJlciBTaGFwZXIyUlsxNjM4NV07ICAgIC8vIDEuMTQgdG8gMC4uMjU1Ci0gICAgY21zVUludDE2TnVtYmVyIFNoYXBlcjJHWzE2Mzg1XTsKLSAgICBjbXNVSW50MTZOdW1iZXIgU2hhcGVyMkJbMTYzODVdOwotCi19IE1hdFNoYXBlcjhEYXRhOwotCi0vLyBDdXJ2ZXMsIG9wdGltaXphdGlvbiBpcyBzaGFyZWQgYmV0d2VlbiA4IGFuZCAxNiBiaXRzCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBjbXNDb250ZXh0IENvbnRleHRJRDsKLQotICAgIGludCBuQ3VydmVzOyAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBjdXJ2ZXMKLSAgICBpbnQgbkVsZW1lbnRzOyAgICAgICAgICAgICAgICAvLyBFbGVtZW50cyBpbiBjdXJ2ZXMKLSAgICBjbXNVSW50MTZOdW1iZXIqKiBDdXJ2ZXM7ICAgICAvLyBQb2ludHMgdG8gYSBkeW5hbWljYWxseSAgYWxsb2NhdGVkIGFycmF5Ci0KLX0gQ3VydmVzMTZEYXRhOwotCi0KLS8vIFNpbXBsZSBvcHRpbWl6YXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0vLyBSZW1vdmUgYW4gZWxlbWVudCBpbiBsaW5rZWQgY2hhaW4KLXN0YXRpYwotdm9pZCBfUmVtb3ZlRWxlbWVudChjbXNTdGFnZSoqIGhlYWQpCi17Ci0gICAgY21zU3RhZ2UqIG1wZSA9ICpoZWFkOwotICAgIGNtc1N0YWdlKiBuZXh0ID0gbXBlIC0+TmV4dDsKLSAgICAqaGVhZCA9IG5leHQ7Ci0gICAgY21zU3RhZ2VGcmVlKG1wZSk7Ci19Ci0KLS8vIFJlbW92ZSBhbGwgaWRlbnRpdGllcyBpbiBjaGFpbi4gTm90ZSB0aGF0IHB0IGFjdHVhbGx5IGlzIGEgZG91YmxlIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnQgdGhhdCBob2xkcyB0aGUgcG9pbnRlci4KLXN0YXRpYwotY21zQm9vbCBfUmVtb3ZlMU9wKGNtc1BpcGVsaW5lKiBMdXQsIGNtc1N0YWdlU2lnbmF0dXJlIFVuYXJ5T3ApCi17Ci0gICAgY21zU3RhZ2UqKiBwdCA9ICZMdXQgLT5FbGVtZW50czsKLSAgICBjbXNCb29sIEFueU9wdCA9IEZBTFNFOwotCi0gICAgd2hpbGUgKCpwdCAhPSBOVUxMKSB7Ci0KLSAgICAgICAgaWYgKCgqcHQpIC0+SW1wbGVtZW50cyA9PSBVbmFyeU9wKSB7Ci0gICAgICAgICAgICBfUmVtb3ZlRWxlbWVudChwdCk7Ci0gICAgICAgICAgICBBbnlPcHQgPSBUUlVFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHB0ID0gJigoKnB0KSAtPiBOZXh0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gQW55T3B0OwotfQotCi0vLyBTYW1lLCBidXQgb25seSBpZiB0d28gYWRqYWNlbnQgZWxlbWVudHMgYXJlIGZvdW5kCi1zdGF0aWMKLWNtc0Jvb2wgX1JlbW92ZTJPcChjbXNQaXBlbGluZSogTHV0LCBjbXNTdGFnZVNpZ25hdHVyZSBPcDEsIGNtc1N0YWdlU2lnbmF0dXJlIE9wMikKLXsKLSAgICBjbXNTdGFnZSoqIHB0MTsKLSAgICBjbXNTdGFnZSoqIHB0MjsKLSAgICBjbXNCb29sIEFueU9wdCA9IEZBTFNFOwotCi0gICAgcHQxID0gJkx1dCAtPkVsZW1lbnRzOwotICAgIGlmICgqcHQxID09IE5VTEwpIHJldHVybiBBbnlPcHQ7Ci0KLSAgICB3aGlsZSAoKnB0MSAhPSBOVUxMKSB7Ci0KLSAgICAgICAgcHQyID0gJigoKnB0MSkgLT4gTmV4dCk7Ci0gICAgICAgIGlmICgqcHQyID09IE5VTEwpIHJldHVybiBBbnlPcHQ7Ci0KLSAgICAgICAgaWYgKCgqcHQxKSAtPkltcGxlbWVudHMgPT0gT3AxICYmICgqcHQyKSAtPkltcGxlbWVudHMgPT0gT3AyKSB7Ci0gICAgICAgICAgICBfUmVtb3ZlRWxlbWVudChwdDIpOwotICAgICAgICAgICAgX1JlbW92ZUVsZW1lbnQocHQxKTsKLSAgICAgICAgICAgIEFueU9wdCA9IFRSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcHQxID0gJigoKnB0MSkgLT4gTmV4dCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEFueU9wdDsKLX0KLQotLy8gUHJlb3B0aW1pemUganVzdCBnZXRzIHJpZiBvZiBuby1vcHMgY29taW5nIHBhaXJlZC4gQ29udmVyc2lvbiBmcm9tIHYyIHRvIHY0IGZvbGxvd2VkCi0vLyBieSBhIHY0IHRvIHYyIGFuZCB2aWNlLXZlcnNhLiBUaGUgZWxlbWVudHMgYXJlIHRoZW4gZGlzY2FyZGVkLgotc3RhdGljCi1jbXNCb29sIFByZU9wdGltaXplKGNtc1BpcGVsaW5lKiBMdXQpCi17Ci0gICAgY21zQm9vbCBBbnlPcHQgPSBGQUxTRSwgT3B0OwotCi0gICAgZG8gewotCi0gICAgICAgIE9wdCA9IEZBTFNFOwotCi0gICAgICAgIC8vIFJlbW92ZSBhbGwgaWRlbnRpdGllcwotICAgICAgICBPcHQgfD0gX1JlbW92ZTFPcChMdXQsIGNtc1NpZ0lkZW50aXR5RWxlbVR5cGUpOwotCi0gICAgICAgIC8vIFJlbW92ZSBYWVoyTGFiIGZvbGxvd2VkIGJ5IExhYjJYWVoKLSAgICAgICAgT3B0IHw9IF9SZW1vdmUyT3AoTHV0LCBjbXNTaWdYWVoyTGFiRWxlbVR5cGUsIGNtc1NpZ0xhYjJYWVpFbGVtVHlwZSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIExhYjJYWVogZm9sbG93ZWQgYnkgWFlaMkxhYgotICAgICAgICBPcHQgfD0gX1JlbW92ZTJPcChMdXQsIGNtc1NpZ0xhYjJYWVpFbGVtVHlwZSwgY21zU2lnWFlaMkxhYkVsZW1UeXBlKTsKLQotICAgICAgICAvLyBSZW1vdmUgVjQgdG8gVjIgZm9sbG93ZWQgYnkgVjIgdG8gVjQKLSAgICAgICAgT3B0IHw9IF9SZW1vdmUyT3AoTHV0LCBjbXNTaWdMYWJWNHRvVjIsIGNtc1NpZ0xhYlYydG9WNCk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIFYyIHRvIFY0IGZvbGxvd2VkIGJ5IFY0IHRvIFYyCi0gICAgICAgIE9wdCB8PSBfUmVtb3ZlMk9wKEx1dCwgY21zU2lnTGFiVjJ0b1Y0LCBjbXNTaWdMYWJWNHRvVjIpOwotCi0gICAgICAgIC8vIFJlbW92ZSBmbG9hdCBwY3MgTGFiIGNvbnZlcnNpb25zCi0gICAgICAgIE9wdCB8PSBfUmVtb3ZlMk9wKEx1dCwgY21zU2lnTGFiMkZsb2F0UENTLCBjbXNTaWdGbG9hdFBDUzJMYWIpOwotCi0gICAgICAgIC8vIFJlbW92ZSBmbG9hdCBwY3MgTGFiIGNvbnZlcnNpb25zCi0gICAgICAgIE9wdCB8PSBfUmVtb3ZlMk9wKEx1dCwgY21zU2lnWFlaMkZsb2F0UENTLCBjbXNTaWdGbG9hdFBDUzJYWVopOwotCi0gICAgICAgIGlmIChPcHQpIEFueU9wdCA9IFRSVUU7Ci0KLSAgICB9IHdoaWxlIChPcHQpOwotCi0gICAgcmV0dXJuIEFueU9wdDsKLX0KLQotc3RhdGljCi12b2lkIEV2YWwxNm5vcDFEKHJlZ2lzdGVyIGNvbnN0IGNtc1VJbnQxNk51bWJlciBJbnB1dFtdLAotICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgT3V0cHV0W10sCi0gICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNvbnN0IHN0cnVjdCBfY21zX2ludGVycF9zdHJ1YyogcCkKLXsKLSAgICBPdXRwdXRbMF0gPSBJbnB1dFswXTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIocCk7Ci19Ci0KLXN0YXRpYwotdm9pZCBQcmVsaW5FdmFsMTYocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIElucHV0W10sCi0gICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgT3V0cHV0W10sCi0gICAgICAgICAgICAgICAgICByZWdpc3RlciBjb25zdCB2b2lkKiBEKQotewotICAgIFByZWxpbjE2RGF0YSogcDE2ID0gKFByZWxpbjE2RGF0YSopIEQ7Ci0gICAgY21zVUludDE2TnVtYmVyICBTdGFnZUFCQ1tNQVhfSU5QVVRfRElNRU5TSU9OU107Ci0gICAgY21zVUludDE2TnVtYmVyICBTdGFnZURFRltjbXNNQVhDSEFOTkVMU107Ci0gICAgaW50IGk7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IHAxNiAtPm5JbnB1dHM7IGkrKykgewotCi0gICAgICAgIHAxNiAtPkV2YWxDdXJ2ZUluMTZbaV0oJklucHV0W2ldLCAmU3RhZ2VBQkNbaV0sIHAxNiAtPlBhcmFtc0N1cnZlSW4xNltpXSk7Ci0gICAgfQotCi0gICAgcDE2IC0+RXZhbENMVVQoU3RhZ2VBQkMsIFN0YWdlREVGLCBwMTYgLT5DTFVUcGFyYW1zKTsKLQotICAgIGZvciAoaT0wOyBpIDwgcDE2IC0+bk91dHB1dHM7IGkrKykgewotCi0gICAgICAgIHAxNiAtPkV2YWxDdXJ2ZU91dDE2W2ldKCZTdGFnZURFRltpXSwgJk91dHB1dFtpXSwgcDE2IC0+UGFyYW1zQ3VydmVPdXQxNltpXSk7Ci0gICAgfQotfQotCi0KLXN0YXRpYwotdm9pZCBQcmVsaW5PcHQxNmZyZWUoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIHB0cikKLXsKLSAgICBQcmVsaW4xNkRhdGEqIHAxNiA9IChQcmVsaW4xNkRhdGEqKSBwdHI7Ci0KLSAgICBfY21zRnJlZShDb250ZXh0SUQsIHAxNiAtPkV2YWxDdXJ2ZU91dDE2KTsKLSAgICBfY21zRnJlZShDb250ZXh0SUQsIHAxNiAtPlBhcmFtc0N1cnZlT3V0MTYpOwotCi0gICAgX2Ntc0ZyZWUoQ29udGV4dElELCBwMTYpOwotfQotCi1zdGF0aWMKLXZvaWQqIFByZWxpbjE2ZHVwKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCB2b2lkKiBwdHIpCi17Ci0gICAgUHJlbGluMTZEYXRhKiBwMTYgPSAoUHJlbGluMTZEYXRhKikgcHRyOwotICAgIFByZWxpbjE2RGF0YSogRHVwZWQgPSBfY21zRHVwTWVtKENvbnRleHRJRCwgcDE2LCBzaXplb2YoUHJlbGluMTZEYXRhKSk7Ci0KLSAgICBpZiAoRHVwZWQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBEdXBlZCAtPkV2YWxDdXJ2ZU91dDE2ICAgPSAoX2Ntc0ludGVycEZuMTYqKV9jbXNEdXBNZW0oQ29udGV4dElELCBwMTYgLT5FdmFsQ3VydmVPdXQxNiwgcDE2IC0+bk91dHB1dHMgKiBzaXplb2YoX2Ntc0ludGVycEZuMTYpKTsKLSAgICBEdXBlZCAtPlBhcmFtc0N1cnZlT3V0MTYgPSAoY21zSW50ZXJwUGFyYW1zKiopX2Ntc0R1cE1lbShDb250ZXh0SUQsIHAxNiAtPlBhcmFtc0N1cnZlT3V0MTYsIHAxNiAtPm5PdXRwdXRzICogc2l6ZW9mKGNtc0ludGVycFBhcmFtcyogKSk7Ci0KLSAgICByZXR1cm4gRHVwZWQ7Ci19Ci0KLQotc3RhdGljCi1QcmVsaW4xNkRhdGEqIFByZWxpbk9wdDE2YWxsb2MoY21zQ29udGV4dCBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBDb2xvck1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbklucHV0cywgY21zVG9uZUN1cnZlKiogSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5PdXRwdXRzLCBjbXNUb25lQ3VydmUqKiBPdXQgKQotewotICAgIGludCBpOwotICAgIFByZWxpbjE2RGF0YSogcDE2ID0gX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBzaXplb2YoUHJlbGluMTZEYXRhKSk7Ci0gICAgaWYgKHAxNiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIHAxNiAtPm5JbnB1dHMgPSBuSW5wdXRzOwotICAgIHAxNiAtPiBuT3V0cHV0cyA9IG5PdXRwdXRzOwotCi0KLSAgICBmb3IgKGk9MDsgaSA8IG5JbnB1dHM7IGkrKykgewotCi0gICAgICAgIGlmIChJbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBwMTYgLT4gUGFyYW1zQ3VydmVJbjE2W2ldID0gTlVMTDsKLSAgICAgICAgICAgIHAxNiAtPiBFdmFsQ3VydmVJbjE2W2ldID0gRXZhbDE2bm9wMUQ7Ci0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHAxNiAtPiBQYXJhbXNDdXJ2ZUluMTZbaV0gPSBJbltpXSAtPkludGVycFBhcmFtczsKLSAgICAgICAgICAgIHAxNiAtPiBFdmFsQ3VydmVJbjE2W2ldID0gcDE2IC0+UGFyYW1zQ3VydmVJbjE2W2ldLT5JbnRlcnBvbGF0aW9uLkxlcnAxNjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHAxNiAtPkNMVVRwYXJhbXMgPSBDb2xvck1hcDsKLSAgICBwMTYgLT5FdmFsQ0xVVCAgID0gQ29sb3JNYXAgLT5JbnRlcnBvbGF0aW9uLkxlcnAxNjsKLQotCi0gICAgcDE2IC0+IEV2YWxDdXJ2ZU91dDE2ID0gKF9jbXNJbnRlcnBGbjE2KikgX2Ntc0NhbGxvYyhDb250ZXh0SUQsIG5PdXRwdXRzLCBzaXplb2YoX2Ntc0ludGVycEZuMTYpKTsKLSAgICBwMTYgLT4gUGFyYW1zQ3VydmVPdXQxNiA9IChjbXNJbnRlcnBQYXJhbXMqKikgX2Ntc0NhbGxvYyhDb250ZXh0SUQsIG5PdXRwdXRzLCBzaXplb2YoY21zSW50ZXJwUGFyYW1zKiApKTsKLQotICAgIGZvciAoaT0wOyBpIDwgbk91dHB1dHM7IGkrKykgewotCi0gICAgICAgIGlmIChPdXQgPT0gTlVMTCkgewotICAgICAgICAgICAgcDE2IC0+UGFyYW1zQ3VydmVPdXQxNltpXSA9IE5VTEw7Ci0gICAgICAgICAgICBwMTYgLT4gRXZhbEN1cnZlT3V0MTZbaV0gPSBFdmFsMTZub3AxRDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLQotICAgICAgICAgICAgcDE2IC0+UGFyYW1zQ3VydmVPdXQxNltpXSA9IE91dFtpXSAtPkludGVycFBhcmFtczsKLSAgICAgICAgICAgIHAxNiAtPiBFdmFsQ3VydmVPdXQxNltpXSA9IHAxNiAtPlBhcmFtc0N1cnZlT3V0MTZbaV0tPkludGVycG9sYXRpb24uTGVycDE2OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHAxNjsKLX0KLQotCi0KLS8vIFJlc2FtcGxpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNkZWZpbmUgUFJFTElORUFSSVpBVElPTl9QT0lOVFMgNDA5NgotCi0vLyBTYW1wbGVyIGltcGxlbWVudGVkIGJ5IGFub3RoZXIgTFVULiBUaGlzIGlzIGEgY2xlYW4gd2F5IHRvIHByZWNhbGN1bGF0ZSB0aGUgZGV2aWNlbGluayAzRCBDTFVUIGZvcgotLy8gYWxtb3N0IGFueSB0cmFuc2Zvcm0uIFdlIHVzZSBmbG9hdGluZyBwb2ludCBwcmVjaXNpb24gYW5kIHRoZW4gY29udmVydCBmcm9tIGZsb2F0aW5nIHBvaW50IHRvIDE2IGJpdHMuCi1zdGF0aWMKLWludCBYRm9ybVNhbXBsZXIxNihyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5bXSwgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIE91dFtdLCByZWdpc3RlciB2b2lkKiBDYXJnbykKLXsKLSAgICBjbXNQaXBlbGluZSogTHV0ID0gKGNtc1BpcGVsaW5lKikgQ2FyZ287Ci0gICAgY21zRmxvYXQzMk51bWJlciBJbkZsb2F0W2Ntc01BWENIQU5ORUxTXSwgT3V0RmxvYXRbY21zTUFYQ0hBTk5FTFNdOwotICAgIGNtc1VJbnQzMk51bWJlciBpOwotCi0gICAgX2Ntc0Fzc2VydChMdXQgLT4gSW5wdXRDaGFubmVscyA8IGNtc01BWENIQU5ORUxTKTsKLSAgICBfY21zQXNzZXJ0KEx1dCAtPiBPdXRwdXRDaGFubmVscyA8IGNtc01BWENIQU5ORUxTKTsKLQotICAgIC8vIEZyb20gMTYgYml0IHRvIGZsb2F0aW5nIHBvaW50Ci0gICAgZm9yIChpPTA7IGkgPCBMdXQgLT5JbnB1dENoYW5uZWxzOyBpKyspCi0gICAgICAgIEluRmxvYXRbaV0gPSAoY21zRmxvYXQzMk51bWJlcikgKEluW2ldIC8gNjU1MzUuMCk7Ci0KLSAgICAvLyBFdmFsdWF0ZSBpbiBmbG9hdGluZyBwb2ludAotICAgIGNtc1BpcGVsaW5lRXZhbEZsb2F0KEluRmxvYXQsIE91dEZsb2F0LCBMdXQpOwotCi0gICAgLy8gQmFjayB0byAxNiBiaXRzIHJlcHJlc2VudGF0aW9uCi0gICAgZm9yIChpPTA7IGkgPCBMdXQgLT5PdXRwdXRDaGFubmVsczsgaSsrKQotICAgICAgICBPdXRbaV0gPSBfY21zUXVpY2tTYXR1cmF0ZVdvcmQoT3V0RmxvYXRbaV0gKiA2NTUzNS4wKTsKLQotICAgIC8vIEFsd2F5cyBzdWNjZWVkCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8vIFRyeSB0byBzZWUgaWYgdGhlIGN1cnZlcyBvZiBhIGdpdmVuIE1QRSBhcmUgbGluZWFyCi1zdGF0aWMKLWNtc0Jvb2wgQWxsQ3VydmVzQXJlTGluZWFyKGNtc1N0YWdlKiBtcGUpCi17Ci0gICAgY21zVG9uZUN1cnZlKiogQ3VydmVzOwotICAgIGNtc1VJbnQzMk51bWJlciBpLCBuOwotCi0gICAgQ3VydmVzID0gX2Ntc1N0YWdlR2V0UHRyVG9DdXJ2ZVNldChtcGUpOwotICAgIGlmIChDdXJ2ZXMgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0gICAgbiA9IGNtc1N0YWdlT3V0cHV0Q2hhbm5lbHMobXBlKTsKLQotICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIGlmICghY21zSXNUb25lQ3VydmVMaW5lYXIoQ3VydmVzW2ldKSkgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vLyBUaGlzIGZ1bmN0aW9uIHJlcGxhY2VzIGEgc3BlY2lmaWMgbm9kZSBwbGFjZWQgaW4gIkF0IiBieSB0aGUgIlZhbHVlIiBudW1iZXJzLiBJdHMgcHVycG9zZQotLy8gaXMgdG8gZml4IHNjdW0gZG90IG9uIGJyb2tlbiBwcm9maWxlcy90cmFuc2Zvcm1zLiBXb3JrcyBvbiAxLCAzIGFuZCA0IGNoYW5uZWxzCi1zdGF0aWMKLWNtc0Jvb2wgIFBhdGNoTFVUKGNtc1N0YWdlKiBDTFVULCBjbXNVSW50MTZOdW1iZXIgQXRbXSwgY21zVUludDE2TnVtYmVyIFZhbHVlW10sCi0gICAgICAgICAgICAgICAgICBpbnQgbkNoYW5uZWxzT3V0LCBpbnQgbkNoYW5uZWxzSW4pCi17Ci0gICAgX2Ntc1N0YWdlQ0x1dERhdGEqIEdyaWQgPSAoX2Ntc1N0YWdlQ0x1dERhdGEqKSBDTFVUIC0+RGF0YTsKLSAgICBjbXNJbnRlcnBQYXJhbXMqIHAxNiAgPSBHcmlkIC0+UGFyYW1zOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgcHgsIHB5LCBweiwgcHc7Ci0gICAgaW50ICAgICAgICB4MCwgeTAsIHowLCB3MDsKLSAgICBpbnQgICAgICAgIGksIGluZGV4OwotCi0gICAgaWYgKENMVVQgLT4gVHlwZSAhPSBjbXNTaWdDTHV0RWxlbVR5cGUpIHsKLSAgICAgICAgY21zU2lnbmFsRXJyb3IoQ0xVVC0+Q29udGV4dElELCBjbXNFUlJPUl9JTlRFUk5BTCwgIihpbnRlcm5hbCkgQXR0ZW1wdCB0byBQYXRjaExVVCBvbiBub24tbHV0IHN0YWdlIik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLQlpZiAobkNoYW5uZWxzSW4gIT0gMSAmJiBuQ2hhbm5lbHNJbiAhPSAzICYmIG5DaGFubmVsc0luICE9IDQpIHsKLQkJY21zU2lnbmFsRXJyb3IoQ0xVVC0+Q29udGV4dElELCBjbXNFUlJPUl9JTlRFUk5BTCwgIihpbnRlcm5hbCkgJWQgQ2hhbm5lbHMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gUGF0Y2hMVVQiLCBuQ2hhbm5lbHNJbik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLQl9Ci0gICAgaWYgKG5DaGFubmVsc0luID09IDQpIHsKLQotICAgICAgICBweCA9ICgoY21zRmxvYXQ2NE51bWJlcikgQXRbMF0gKiAocDE2LT5Eb21haW5bMF0pKSAvIDY1NTM1LjA7Ci0gICAgICAgIHB5ID0gKChjbXNGbG9hdDY0TnVtYmVyKSBBdFsxXSAqIChwMTYtPkRvbWFpblsxXSkpIC8gNjU1MzUuMDsKLSAgICAgICAgcHogPSAoKGNtc0Zsb2F0NjROdW1iZXIpIEF0WzJdICogKHAxNi0+RG9tYWluWzJdKSkgLyA2NTUzNS4wOwotICAgICAgICBwdyA9ICgoY21zRmxvYXQ2NE51bWJlcikgQXRbM10gKiAocDE2LT5Eb21haW5bM10pKSAvIDY1NTM1LjA7Ci0KLSAgICAgICAgeDAgPSAoaW50KSBmbG9vcihweCk7Ci0gICAgICAgIHkwID0gKGludCkgZmxvb3IocHkpOwotICAgICAgICB6MCA9IChpbnQpIGZsb29yKHB6KTsKLSAgICAgICAgdzAgPSAoaW50KSBmbG9vcihwdyk7Ci0KLSAgICAgICAgaWYgKCgocHggLSB4MCkgIT0gMCkgfHwKLSAgICAgICAgICAgICgocHkgLSB5MCkgIT0gMCkgfHwKLSAgICAgICAgICAgICgocHogLSB6MCkgIT0gMCkgfHwKLSAgICAgICAgICAgICgocHcgLSB3MCkgIT0gMCkpIHJldHVybiBGQUxTRTsgLy8gTm90IG9uIGV4YWN0IG5vZGUKLQotICAgICAgICBpbmRleCA9IHAxNiAtPiBvcHRhWzNdICogeDAgKwotICAgICAgICAgICAgICAgIHAxNiAtPiBvcHRhWzJdICogeTAgKwotICAgICAgICAgICAgICAgIHAxNiAtPiBvcHRhWzFdICogejAgKwotICAgICAgICAgICAgICAgIHAxNiAtPiBvcHRhWzBdICogdzA7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgaWYgKG5DaGFubmVsc0luID09IDMpIHsKLQotICAgICAgICAgICAgcHggPSAoKGNtc0Zsb2F0NjROdW1iZXIpIEF0WzBdICogKHAxNi0+RG9tYWluWzBdKSkgLyA2NTUzNS4wOwotICAgICAgICAgICAgcHkgPSAoKGNtc0Zsb2F0NjROdW1iZXIpIEF0WzFdICogKHAxNi0+RG9tYWluWzFdKSkgLyA2NTUzNS4wOwotICAgICAgICAgICAgcHogPSAoKGNtc0Zsb2F0NjROdW1iZXIpIEF0WzJdICogKHAxNi0+RG9tYWluWzJdKSkgLyA2NTUzNS4wOwotICAgICAgICAgICAKLSAgICAgICAgICAgIHgwID0gKGludCkgZmxvb3IocHgpOwotICAgICAgICAgICAgeTAgPSAoaW50KSBmbG9vcihweSk7Ci0gICAgICAgICAgICB6MCA9IChpbnQpIGZsb29yKHB6KTsKLSAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoKChweCAtIHgwKSAhPSAwKSB8fAotICAgICAgICAgICAgICAgICgocHkgLSB5MCkgIT0gMCkgfHwKLSAgICAgICAgICAgICAgICAoKHB6IC0gejApICE9IDApKSByZXR1cm4gRkFMU0U7ICAvLyBOb3Qgb24gZXhhY3Qgbm9kZQotCi0gICAgICAgICAgICBpbmRleCA9IHAxNiAtPiBvcHRhWzJdICogeDAgKwotICAgICAgICAgICAgICAgICAgICBwMTYgLT4gb3B0YVsxXSAqIHkwICsKLSAgICAgICAgICAgICAgICAgICAgcDE2IC0+IG9wdGFbMF0gKiB6MDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpZiAobkNoYW5uZWxzSW4gPT0gMSkgewotCi0gICAgICAgICAgICAgICAgcHggPSAoKGNtc0Zsb2F0NjROdW1iZXIpIEF0WzBdICogKHAxNi0+RG9tYWluWzBdKSkgLyA2NTUzNS4wOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHgwID0gKGludCkgZmxvb3IocHgpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICgoKHB4IC0geDApICE9IDApKSByZXR1cm4gRkFMU0U7IC8vIE5vdCBvbiBleGFjdCBub2RlCi0KLSAgICAgICAgICAgICAgICBpbmRleCA9IHAxNiAtPiBvcHRhWzBdICogeDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihDTFVULT5Db250ZXh0SUQsIGNtc0VSUk9SX0lOVEVSTkFMLCAiKGludGVybmFsKSAlZCBDaGFubmVscyBhcmUgbm90IHN1cHBvcnRlZCBvbiBQYXRjaExVVCIsIG5DaGFubmVsc0luKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgbkNoYW5uZWxzT3V0OyBpKyspCi0gICAgICAgICAgICAgICAgR3JpZCAtPiBUYWIuVFtpbmRleCArIGldID0gVmFsdWVbaV07Ci0KLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotfQotCi0vLyBBdXhpbGlhciwgdG8gc2VlIGlmIHR3byB2YWx1ZXMgYXJlIGVxdWFsIG9yIHZlcnkgZGlmZmVyZW50Ci1zdGF0aWMKLWNtc0Jvb2wgV2hpdGVzQXJlRXF1YWwoaW50IG4sIGNtc1VJbnQxNk51bWJlciBXaGl0ZTFbXSwgY21zVUludDE2TnVtYmVyIFdoaXRlMltdICkKLXsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7Ci0KLSAgICAgICAgaWYgKGFicyhXaGl0ZTFbaV0gLSBXaGl0ZTJbaV0pID4gMHhmMDAwKSByZXR1cm4gVFJVRTsgIC8vIFZhbHVlcyBhcmUgc28gZXh0cmVtbHkgZGlmZmVyZW50IHRoYXQgdGhlIGZpeHVwIHNob3VsZCBiZSBhdm9pZGVkCi0gICAgICAgIGlmIChXaGl0ZTFbaV0gIT0gV2hpdGUyW2ldKSByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotCi0KLS8vIExvY2F0ZSB0aGUgbm9kZSBmb3IgdGhlIHdoaXRlIHBvaW50IGFuZCBmaXggaXQgdG8gcHVyZSB3aGl0ZSBpbiBvcmRlciB0byBhdm9pZCBzY3VtIGRvdC4KLXN0YXRpYwotY21zQm9vbCBGaXhXaGl0ZU1pc2FsaWdubWVudChjbXNQaXBlbGluZSogTHV0LCBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIEVudHJ5Q29sb3JTcGFjZSwgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBFeGl0Q29sb3JTcGFjZSkKLXsKLSAgICBjbXNVSW50MTZOdW1iZXIgKldoaXRlUG9pbnRJbiwgKldoaXRlUG9pbnRPdXQ7Ci0gICAgY21zVUludDE2TnVtYmVyICBXaGl0ZUluW2Ntc01BWENIQU5ORUxTXSwgV2hpdGVPdXRbY21zTUFYQ0hBTk5FTFNdLCBPYnRhaW5lZE91dFtjbXNNQVhDSEFOTkVMU107Ci0gICAgY21zVUludDMyTnVtYmVyIGksIG5PdXRzLCBuSW5zOwotICAgIGNtc1N0YWdlICpQcmVMaW4gPSBOVUxMLCAqQ0xVVCA9IE5VTEwsICpQb3N0TGluID0gTlVMTDsKLQotICAgIGlmICghX2Ntc0VuZFBvaW50c0J5U3BhY2UoRW50cnlDb2xvclNwYWNlLAotICAgICAgICAmV2hpdGVQb2ludEluLCBOVUxMLCAmbklucykpIHJldHVybiBGQUxTRTsKLQotICAgIGlmICghX2Ntc0VuZFBvaW50c0J5U3BhY2UoRXhpdENvbG9yU3BhY2UsCi0gICAgICAgICZXaGl0ZVBvaW50T3V0LCBOVUxMLCAmbk91dHMpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAvLyBJdCBuZWVkcyB0byBiZSBmaXhlZD8KLSAgICBpZiAoTHV0IC0+SW5wdXRDaGFubmVscyAhPSBuSW5zKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKEx1dCAtPk91dHB1dENoYW5uZWxzICE9IG5PdXRzKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBjbXNQaXBlbGluZUV2YWwxNihXaGl0ZVBvaW50SW4sIE9idGFpbmVkT3V0LCBMdXQpOwotCi0gICAgaWYgKFdoaXRlc0FyZUVxdWFsKG5PdXRzLCBXaGl0ZVBvaW50T3V0LCBPYnRhaW5lZE91dCkpIHJldHVybiBUUlVFOyAvLyB3aGl0ZXMgYWxyZWFkeSBtYXRjaAotCi0gICAgLy8gQ2hlY2sgaWYgdGhlIExVVCBjb21lcyBhcyBQcmVsaW4sIENMVVQgb3IgUG9zdGxpbi4gV2UgYWxsb3cgYWxsIGNvbWJpbmF0aW9ucwotICAgIGlmICghY21zUGlwZWxpbmVDaGVja0FuZFJldHJlaXZlU3RhZ2VzKEx1dCwgMywgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgY21zU2lnQ0x1dEVsZW1UeXBlLCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLCAmUHJlTGluLCAmQ0xVVCwgJlBvc3RMaW4pKQotICAgICAgICBpZiAoIWNtc1BpcGVsaW5lQ2hlY2tBbmRSZXRyZWl2ZVN0YWdlcyhMdXQsIDIsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsIGNtc1NpZ0NMdXRFbGVtVHlwZSwgJlByZUxpbiwgJkNMVVQpKQotICAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUNoZWNrQW5kUmV0cmVpdmVTdGFnZXMoTHV0LCAyLCBjbXNTaWdDTHV0RWxlbVR5cGUsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsICZDTFVULCAmUG9zdExpbikpCi0gICAgICAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUNoZWNrQW5kUmV0cmVpdmVTdGFnZXMoTHV0LCAxLCBjbXNTaWdDTHV0RWxlbVR5cGUsICZDTFVUKSkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgLy8gV2UgbmVlZCB0byBpbnRlcnBvbGF0ZSB3aGl0ZSBwb2ludHMgb2YgYm90aCwgcHJlIGFuZCBwb3N0IGN1cnZlcwotICAgIGlmIChQcmVMaW4pIHsKLQotICAgICAgICBjbXNUb25lQ3VydmUqKiBDdXJ2ZXMgPSBfY21zU3RhZ2VHZXRQdHJUb0N1cnZlU2V0KFByZUxpbik7Ci0KLSAgICAgICAgZm9yIChpPTA7IGkgPCBuSW5zOyBpKyspIHsKLSAgICAgICAgICAgIFdoaXRlSW5baV0gPSBjbXNFdmFsVG9uZUN1cnZlMTYoQ3VydmVzW2ldLCBXaGl0ZVBvaW50SW5baV0pOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBmb3IgKGk9MDsgaSA8IG5JbnM7IGkrKykKLSAgICAgICAgICAgIFdoaXRlSW5baV0gPSBXaGl0ZVBvaW50SW5baV07Ci0gICAgfQotCi0gICAgLy8gSWYgYW55IHBvc3QtbGluZWFyaXphdGlvbiwgd2UgbmVlZCB0byBmaW5kIGhvdyBpcyByZXByZXNlbnRlZCB3aGl0ZSBiZWZvcmUgdGhlIGN1cnZlLCBkbwotICAgIC8vIGEgcmV2ZXJzZSBpbnRlcnBvbGF0aW9uIGluIHRoaXMgY2FzZS4KLSAgICBpZiAoUG9zdExpbikgewotCi0gICAgICAgIGNtc1RvbmVDdXJ2ZSoqIEN1cnZlcyA9IF9jbXNTdGFnZUdldFB0clRvQ3VydmVTZXQoUG9zdExpbik7Ci0KLSAgICAgICAgZm9yIChpPTA7IGkgPCBuT3V0czsgaSsrKSB7Ci0KLSAgICAgICAgICAgIGNtc1RvbmVDdXJ2ZSogSW52ZXJzZVBvc3RMaW4gPSBjbXNSZXZlcnNlVG9uZUN1cnZlKEN1cnZlc1tpXSk7Ci0gICAgICAgICAgICBpZiAoSW52ZXJzZVBvc3RMaW4gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFdoaXRlT3V0W2ldID0gV2hpdGVQb2ludE91dFtpXTsgICAgCi0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgICAgICBXaGl0ZU91dFtpXSA9IGNtc0V2YWxUb25lQ3VydmUxNihJbnZlcnNlUG9zdExpbiwgV2hpdGVQb2ludE91dFtpXSk7Ci0gICAgICAgICAgICAgICAgY21zRnJlZVRvbmVDdXJ2ZShJbnZlcnNlUG9zdExpbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGZvciAoaT0wOyBpIDwgbk91dHM7IGkrKykKLSAgICAgICAgICAgIFdoaXRlT3V0W2ldID0gV2hpdGVQb2ludE91dFtpXTsKLSAgICB9Ci0KLSAgICAvLyBPaywgcHJvY2VlZCB3aXRoIHBhdGNoaW5nLiBNYXkgZmFpbCBhbmQgd2UgZG9uJ3QgY2FyZSBpZiBpdCBmYWlscwotICAgIFBhdGNoTFVUKENMVVQsIFdoaXRlSW4sIFdoaXRlT3V0LCBuT3V0cywgbklucyk7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBzaW1wbGUgTFVUIGZyb20gY29tcGxleCBvbmVzLiBUaGUgZ2VuZXJhdGVkIExVVCBoYXMgYW4gb3B0aW9uYWwgc2V0IG9mCi0vLyBwcmVsaW5lYXJpemF0aW9uIGN1cnZlcywgYSBDTFVUIG9mIG5HcmlkUG9pbnRzIGFuZCBvcHRpb25hbCBwb3N0bGluZWFyaXphdGlvbiB0YWJsZXMuCi0vLyBUaGVzZSBjdXJ2ZXMgaGF2ZSB0byBleGlzdCBpbiB0aGUgb3JpZ2luYWwgTFVUIGluIG9yZGVyIHRvIGJlIHVzZWQgaW4gdGhlIHNpbXBsaWZpZWQgb3V0cHV0LgotLy8gQ2FsbGVyIG1heSBhbHNvIHVzZSB0aGUgZmxhZ3MgdG8gYWxsb3cgdGhpcyBmZWF0dXJlLgotLy8gTFVUUyB3aXRoIGFsbCBjdXJ2ZXMgd2lsbCBiZSBzaW1wbGlmaWVkIHRvIGEgc2luZ2xlIGN1cnZlLiBQYXJhbWV0cmljIGN1cnZlcyBhcmUgbG9zdC4KLS8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgb24gMTYtYml0cyBMVVRTIG9ubHksIGFzIGZsb2F0aW5nIHBvaW50IGxvc3NlcyBwcmVjaXNpb24gd2hlbiBzaW1wbGlmaWVkCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMKLWNtc0Jvb2wgT3B0aW1pemVCeVJlc2FtcGxpbmcoY21zUGlwZWxpbmUqKiBMdXQsIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsIGNtc1VJbnQzMk51bWJlciogSW5wdXRGb3JtYXQsIGNtc1VJbnQzMk51bWJlciogT3V0cHV0Rm9ybWF0LCBjbXNVSW50MzJOdW1iZXIqIGR3RmxhZ3MpCi17Ci0gICAgY21zUGlwZWxpbmUqIFNyYyA9IE5VTEw7Ci0gICAgY21zUGlwZWxpbmUqIERlc3QgPSBOVUxMOwotICAgIGNtc1N0YWdlKiBtcGU7Ci0gICAgY21zU3RhZ2UqIENMVVQ7Ci0gICAgY21zU3RhZ2UgKktlZXBQcmVMaW4gPSBOVUxMLCAqS2VlcFBvc3RMaW4gPSBOVUxMOwotICAgIGludCBuR3JpZFBvaW50czsKLSAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2UsIE91dHB1dENvbG9yU3BhY2U7Ci0gICAgY21zU3RhZ2UgKk5ld1ByZUxpbiA9IE5VTEw7Ci0gICAgY21zU3RhZ2UgKk5ld1Bvc3RMaW4gPSBOVUxMOwotICAgIF9jbXNTdGFnZUNMdXREYXRhKiBEYXRhQ0xVVDsKLSAgICBjbXNUb25lQ3VydmUqKiBEYXRhU2V0SW47Ci0gICAgY21zVG9uZUN1cnZlKiogRGF0YVNldE91dDsKLSAgICBQcmVsaW4xNkRhdGEqIHAxNjsKLQotICAgIC8vIFRoaXMgaXMgYSBsb29zeSBvcHRpbWl6YXRpb24hIGRvZXMgbm90IGFwcGx5IGluIGZsb2F0aW5nLXBvaW50IGNhc2VzCi0gICAgaWYgKF9jbXNGb3JtYXR0ZXJJc0Zsb2F0KCpJbnB1dEZvcm1hdCkgfHwgX2Ntc0Zvcm1hdHRlcklzRmxvYXQoKk91dHB1dEZvcm1hdCkpIHJldHVybiBGQUxTRTsKLQotICAgIENvbG9yU3BhY2UgICAgICAgPSBfY21zSUNDY29sb3JTcGFjZShUX0NPTE9SU1BBQ0UoKklucHV0Rm9ybWF0KSk7Ci0gICAgT3V0cHV0Q29sb3JTcGFjZSA9IF9jbXNJQ0Njb2xvclNwYWNlKFRfQ09MT1JTUEFDRSgqT3V0cHV0Rm9ybWF0KSk7Ci0gICAgbkdyaWRQb2ludHMgICAgICA9IF9jbXNSZWFzb25hYmxlR3JpZHBvaW50c0J5Q29sb3JzcGFjZShDb2xvclNwYWNlLCAqZHdGbGFncyk7Ci0KLSAgICAvLyBGb3IgZW1wdHkgTFVUcywgMiBwb2ludHMgYXJlIGVub3VnaAotICAgIGlmIChjbXNQaXBlbGluZVN0YWdlQ291bnQoKkx1dCkgPT0gMCkKLSAgICAgICAgbkdyaWRQb2ludHMgPSAyOwotCi0gICAgU3JjID0gKkx1dDsKLQotICAgIC8vIE5hbWVkIGNvbG9yIHBpcGVsaW5lcyBjYW5ub3QgYmUgb3B0aW1pemVkIGVpdGhlcgotICAgIGZvciAobXBlID0gY21zUGlwZWxpbmVHZXRQdHJUb0ZpcnN0U3RhZ2UoU3JjKTsKLSAgICAgICAgbXBlICE9IE5VTEw7Ci0gICAgICAgIG1wZSA9IGNtc1N0YWdlTmV4dChtcGUpKSB7Ci0gICAgICAgICAgICBpZiAoY21zU3RhZ2VUeXBlKG1wZSkgPT0gY21zU2lnTmFtZWRDb2xvckVsZW1UeXBlKSByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgLy8gQWxsb2NhdGUgYW4gZW1wdHkgTFVUCi0gICAgRGVzdCA9ICBjbXNQaXBlbGluZUFsbG9jKFNyYyAtPkNvbnRleHRJRCwgU3JjIC0+SW5wdXRDaGFubmVscywgU3JjIC0+T3V0cHV0Q2hhbm5lbHMpOwotICAgIGlmICghRGVzdCkgcmV0dXJuIEZBTFNFOwotCi0gICAgLy8gUHJlbGluZWFyaXphdGlvbiB0YWJsZXMgYXJlIGtlcHQgdW5sZXNzIGluZGljYXRlZCBieSBmbGFncwotICAgIGlmICgqZHdGbGFncyAmIGNtc0ZMQUdTX0NMVVRfUFJFX0xJTkVBUklaQVRJT04pIHsKLQotICAgICAgICAvLyBHZXQgYSBwb2ludGVyIHRvIHRoZSBwcmVsaW5lYXJpemF0aW9uIGVsZW1lbnQKLSAgICAgICAgY21zU3RhZ2UqIFByZUxpbiA9IGNtc1BpcGVsaW5lR2V0UHRyVG9GaXJzdFN0YWdlKFNyYyk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgc3VpdGFibGUKLSAgICAgICAgaWYgKFByZUxpbiAtPlR5cGUgPT0gY21zU2lnQ3VydmVTZXRFbGVtVHlwZSkgewotCi0gICAgICAgICAgICAvLyBNYXliZSB0aGlzIGlzIGEgbGluZWFyIHRyYW0sIHNvIHdlIGNhbiBhdm9pZCB0aGUgd2hvbGUgc3R1ZmYKLSAgICAgICAgICAgIGlmICghQWxsQ3VydmVzQXJlTGluZWFyKFByZUxpbikpIHsKLQotICAgICAgICAgICAgICAgIC8vIEFsbCBzZWVtcyBvaywgcHJvY2VlZC4KLSAgICAgICAgICAgICAgICBOZXdQcmVMaW4gPSBjbXNTdGFnZUR1cChQcmVMaW4pOwotICAgICAgICAgICAgICAgIGlmKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKERlc3QsIGNtc0FUX0JFR0lOLCBOZXdQcmVMaW4pKQotICAgICAgICAgICAgICAgICAgICBnb3RvIEVycm9yOwotCi0gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHByZWxpbmVhcml6YXRpb24uIFNpbmNlIHdlIGhhdmUgZHVwbGljYXRlZCB0aGUgY3VydmUKLSAgICAgICAgICAgICAgICAvLyBpbiBkZXN0aW5hdGlvbiBMVVQsIHRoZSBzYW1wbGluZyBzaG91ZCBiZSBhcHBsaWVkIGFmdGVyIHRoaXMgc3RhZ2UuCi0gICAgICAgICAgICAgICAgY21zUGlwZWxpbmVVbmxpbmtTdGFnZShTcmMsIGNtc0FUX0JFR0lOLCAmS2VlcFByZUxpbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBBbGxvY2F0ZSB0aGUgQ0xVVAotICAgIENMVVQgPSBjbXNTdGFnZUFsbG9jQ0x1dDE2Yml0KFNyYyAtPkNvbnRleHRJRCwgbkdyaWRQb2ludHMsIFNyYyAtPklucHV0Q2hhbm5lbHMsIFNyYy0+T3V0cHV0Q2hhbm5lbHMsIE5VTEwpOwotICAgIGlmIChDTFVUID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLSAgICAvLyBBZGQgdGhlIENMVVQgdG8gdGhlIGRlc3RpbmF0aW9uIExVVAotICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShEZXN0LCBjbXNBVF9FTkQsIENMVVQpKSB7Ci0gICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgfQotCi0gICAgLy8gUG9zdGxpbmVhcml6YXRpb24gdGFibGVzIGFyZSBrZXB0IHVubGVzcyBpbmRpY2F0ZWQgYnkgZmxhZ3MKLSAgICBpZiAoKmR3RmxhZ3MgJiBjbXNGTEFHU19DTFVUX1BPU1RfTElORUFSSVpBVElPTikgewotCi0gICAgICAgIC8vIEdldCBhIHBvaW50ZXIgdG8gdGhlIHBvc3RsaW5lYXJpemF0aW9uIGlmIHByZXNlbnQKLSAgICAgICAgY21zU3RhZ2UqIFBvc3RMaW4gPSBjbXNQaXBlbGluZUdldFB0clRvTGFzdFN0YWdlKFNyYyk7Ci0KLSAgICAgICAgLy8gQ2hlY2sgaWYgc3VpdGFibGUKLSAgICAgICAgaWYgKGNtc1N0YWdlVHlwZShQb3N0TGluKSA9PSBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlKSB7Ci0KLSAgICAgICAgICAgIC8vIE1heWJlIHRoaXMgaXMgYSBsaW5lYXIgdHJhbSwgc28gd2UgY2FuIGF2b2lkIHRoZSB3aG9sZSBzdHVmZgotICAgICAgICAgICAgaWYgKCFBbGxDdXJ2ZXNBcmVMaW5lYXIoUG9zdExpbikpIHsKLQotICAgICAgICAgICAgICAgIC8vIEFsbCBzZWVtcyBvaywgcHJvY2VlZC4KLSAgICAgICAgICAgICAgICBOZXdQb3N0TGluID0gY21zU3RhZ2VEdXAoUG9zdExpbik7Ci0gICAgICAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKERlc3QsIGNtc0FUX0VORCwgTmV3UG9zdExpbikpCi0gICAgICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAgICAgICAgICAvLyBJbiBkZXN0aW5hdGlvbiBMVVQsIHRoZSBzYW1wbGluZyBzaG91ZCBiZSBhcHBsaWVkIGFmdGVyIHRoaXMgc3RhZ2UuCi0gICAgICAgICAgICAgICAgY21zUGlwZWxpbmVVbmxpbmtTdGFnZShTcmMsIGNtc0FUX0VORCwgJktlZXBQb3N0TGluKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE5vdyBpdHMgdGltZSB0byBkbyB0aGUgc2FtcGxpbmcuIFdlIGhhdmUgdG8gaWdub3JlIHByZS9wb3N0IGxpbmVhcml6YXRpb24KLSAgICAvLyBUaGUgc291cmNlIExVVCB3aGl0aG91dCBwcmUvcG9zdCBjdXJ2ZXMgaXMgcGFzc2VkIGFzIHBhcmFtZXRlci4KLSAgICBpZiAoIWNtc1N0YWdlU2FtcGxlQ0x1dDE2Yml0KENMVVQsIFhGb3JtU2FtcGxlcjE2LCAodm9pZCopIFNyYywgMCkpIHsKLUVycm9yOgotICAgICAgICAvLyBPcHMsIHNvbWV0aGluZyB3ZW50IHdyb25nLCBSZXN0b3JlIHN0YWdlcwotICAgICAgICBpZiAoS2VlcFByZUxpbiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoU3JjLCBjbXNBVF9CRUdJTiwgS2VlcFByZUxpbikpIHsKLSAgICAgICAgICAgICAgICBfY21zQXNzZXJ0KDApOyAvLyBUaGlzIG5ldmVyIGhhcHBlbnMKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoS2VlcFBvc3RMaW4gIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKFNyYywgY21zQVRfRU5ELCAgIEtlZXBQb3N0TGluKSkgewotICAgICAgICAgICAgICAgIF9jbXNBc3NlcnQoMCk7IC8vIFRoaXMgbmV2ZXIgaGFwcGVucwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNtc1BpcGVsaW5lRnJlZShEZXN0KTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIC8vIERvbmUuCi0KLSAgICBpZiAoS2VlcFByZUxpbiAhPSBOVUxMKSBjbXNTdGFnZUZyZWUoS2VlcFByZUxpbik7Ci0gICAgaWYgKEtlZXBQb3N0TGluICE9IE5VTEwpIGNtc1N0YWdlRnJlZShLZWVwUG9zdExpbik7Ci0gICAgY21zUGlwZWxpbmVGcmVlKFNyYyk7Ci0KLSAgICBEYXRhQ0xVVCA9IChfY21zU3RhZ2VDTHV0RGF0YSopIENMVVQgLT5EYXRhOwotCi0gICAgaWYgKE5ld1ByZUxpbiA9PSBOVUxMKSBEYXRhU2V0SW4gPSBOVUxMOwotICAgIGVsc2UgRGF0YVNldEluID0gKChfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSopIE5ld1ByZUxpbiAtPkRhdGEpIC0+VGhlQ3VydmVzOwotCi0gICAgaWYgKE5ld1Bvc3RMaW4gPT0gTlVMTCkgRGF0YVNldE91dCA9IE5VTEw7Ci0gICAgZWxzZSAgRGF0YVNldE91dCA9ICgoX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqKSBOZXdQb3N0TGluIC0+RGF0YSkgLT5UaGVDdXJ2ZXM7Ci0KLQotICAgIGlmIChEYXRhU2V0SW4gPT0gTlVMTCAmJiBEYXRhU2V0T3V0ID09IE5VTEwpIHsKLQotICAgICAgICBfY21zUGlwZWxpbmVTZXRPcHRpbWl6YXRpb25QYXJhbWV0ZXJzKERlc3QsIChfY21zT1BUZXZhbDE2Rm4pIERhdGFDTFVULT5QYXJhbXMtPkludGVycG9sYXRpb24uTGVycDE2LCBEYXRhQ0xVVC0+UGFyYW1zLCBOVUxMLCBOVUxMKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0KLSAgICAgICAgcDE2ID0gUHJlbGluT3B0MTZhbGxvYyhEZXN0IC0+Q29udGV4dElELAotICAgICAgICAgICAgRGF0YUNMVVQgLT5QYXJhbXMsCi0gICAgICAgICAgICBEZXN0IC0+SW5wdXRDaGFubmVscywKLSAgICAgICAgICAgIERhdGFTZXRJbiwKLSAgICAgICAgICAgIERlc3QgLT5PdXRwdXRDaGFubmVscywKLSAgICAgICAgICAgIERhdGFTZXRPdXQpOwotCi0gICAgICAgIF9jbXNQaXBlbGluZVNldE9wdGltaXphdGlvblBhcmFtZXRlcnMoRGVzdCwgUHJlbGluRXZhbDE2LCAodm9pZCopIHAxNiwgUHJlbGluT3B0MTZmcmVlLCBQcmVsaW4xNmR1cCk7Ci0gICAgfQotCi0KLSAgICAvLyBEb24ndCBmaXggd2hpdGUgb24gYWJzb2x1dGUgY29sb3JpbWV0cmljCi0gICAgaWYgKEludGVudCA9PSBJTlRFTlRfQUJTT0xVVEVfQ09MT1JJTUVUUklDKQotICAgICAgICAqZHdGbGFncyB8PSBjbXNGTEFHU19OT1dISVRFT05XSElURUZJWFVQOwotCi0gICAgaWYgKCEoKmR3RmxhZ3MgJiBjbXNGTEFHU19OT1dISVRFT05XSElURUZJWFVQKSkgewotCi0gICAgICAgIEZpeFdoaXRlTWlzYWxpZ25tZW50KERlc3QsIENvbG9yU3BhY2UsIE91dHB1dENvbG9yU3BhY2UpOwotICAgIH0KLQotICAgICpMdXQgPSBEZXN0OwotICAgIHJldHVybiBUUlVFOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihJbnRlbnQpOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGaXhlcyB0aGUgZ2FtbWEgYmFsYW5jaW5nIG9mIHRyYW5zZm9ybS4gVGhpcyBpcyBkZXNjcmliZWQgaW4gbXkgcGFwZXIgIlByZWxpbmVhcml6YXRpb24gU3RhZ2VzIG9uCi0vLyBDb2xvci1NYW5hZ2VtZW50IEFwcGxpY2F0aW9uLVNwZWNpZmljIEludGVncmF0ZWQgQ2lyY3VpdHMgKEFTSUNzKSIgcHJlc2VudGVkIGF0IE5JUDI0LiBJdCBvbmx5IHdvcmtzCi0vLyBmb3IgUkdCIHRyYW5zZm9ybXMuIFNlZSB0aGUgcGFwZXIgZm9yIG1vcmUgZGV0YWlscwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0vLyBOb3JtYWxpemUgZW5kcG9pbnRzIGJ5IHNsb3BlIGxpbWl0aW5nIG1heCBhbmQgbWluLiBUaGlzIGFzc3VyZXMgZW5kcG9pbnRzIGFzIHdlbGwuCi0vLyBEZXNjZW5kaW5nIGN1cnZlcyBhcmUgaGFuZGxlZCBhcyB3ZWxsLgotc3RhdGljCi12b2lkIFNsb3BlTGltaXRpbmcoY21zVG9uZUN1cnZlKiBnKQotewotICAgIGludCBCZWdpblZhbCwgRW5kVmFsOwotICAgIGludCBBdEJlZ2luID0gKGludCkgZmxvb3IoKGNtc0Zsb2F0NjROdW1iZXIpIGcgLT5uRW50cmllcyAqIDAuMDIgKyAwLjUpOyAgIC8vIEN1dG9mZiBhdCAyJQotICAgIGludCBBdEVuZCAgID0gZyAtPm5FbnRyaWVzIC0gQXRCZWdpbiAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuZCA5OCUKLSAgICBjbXNGbG9hdDY0TnVtYmVyIFZhbCwgU2xvcGUsIGJldGE7Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoY21zSXNUb25lQ3VydmVEZXNjZW5kaW5nKGcpKSB7Ci0gICAgICAgIEJlZ2luVmFsID0gMHhmZmZmOyBFbmRWYWwgPSAwOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgQmVnaW5WYWwgPSAwOyBFbmRWYWwgPSAweGZmZmY7Ci0gICAgfQotCi0gICAgLy8gQ29tcHV0ZSBzbG9wZSBhbmQgb2Zmc2V0IGZvciBiZWdpbiBvZiBjdXJ2ZQotICAgIFZhbCAgID0gZyAtPlRhYmxlMTZbQXRCZWdpbl07Ci0gICAgU2xvcGUgPSAoVmFsIC0gQmVnaW5WYWwpIC8gQXRCZWdpbjsKLSAgICBiZXRhICA9IFZhbCAtIFNsb3BlICogQXRCZWdpbjsKLQotICAgIGZvciAoaT0wOyBpIDwgQXRCZWdpbjsgaSsrKQotICAgICAgICBnIC0+VGFibGUxNltpXSA9IF9jbXNRdWlja1NhdHVyYXRlV29yZChpICogU2xvcGUgKyBiZXRhKTsKLQotICAgIC8vIENvbXB1dGUgc2xvcGUgYW5kIG9mZnNldCBmb3IgdGhlIGVuZAotICAgIFZhbCAgID0gZyAtPlRhYmxlMTZbQXRFbmRdOwotICAgIFNsb3BlID0gKEVuZFZhbCAtIFZhbCkgLyBBdEJlZ2luOyAgIC8vIEF0QmVnaW4gaG9sZHMgdGhlIFggaW50ZXJ2YWwsIHdoaWNoIGlzIHNhbWUgaW4gYm90aCBjYXNlcwotICAgIGJldGEgID0gVmFsIC0gU2xvcGUgKiBBdEVuZDsKLQotICAgIGZvciAoaSA9IEF0RW5kOyBpIDwgKGludCkgZyAtPm5FbnRyaWVzOyBpKyspCi0gICAgICAgIGcgLT5UYWJsZTE2W2ldID0gX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKGkgKiBTbG9wZSArIGJldGEpOwotfQotCi0KLS8vIFByZWNvbXB1dGVzIHRhYmxlcyBmb3IgOC1iaXQgb24gaW5wdXQgZGV2aWNlbGluay4KLXN0YXRpYwotUHJlbGluOERhdGEqIFByZWxpbk9wdDhhbGxvYyhjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3QgY21zSW50ZXJwUGFyYW1zKiBwLCBjbXNUb25lQ3VydmUqIEdbM10pCi17Ci0gICAgaW50IGk7Ci0gICAgY21zVUludDE2TnVtYmVyIElucHV0WzNdOwotICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgdjEsIHYyLCB2MzsKLSAgICBQcmVsaW44RGF0YSogcDg7Ci0KLSAgICBwOCA9IChQcmVsaW44RGF0YSopX2Ntc01hbGxvY1plcm8oQ29udGV4dElELCBzaXplb2YoUHJlbGluOERhdGEpKTsKLSAgICBpZiAocDggPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICAvLyBTaW5jZSB0aGlzIG9ubHkgd29ya3MgZm9yIDggYml0IGlucHV0LCB2YWx1ZXMgY29tZXMgYWx3YXlzIGFzIHggKiAyNTcsCi0gICAgLy8gd2UgY2FuIHNhZmVseSB0YWtlIG1zYiBieXRlICh4IDw8IDggKyB4KQotCi0gICAgZm9yIChpPTA7IGkgPCAyNTY7IGkrKykgewotCi0gICAgICAgIGlmIChHICE9IE5VTEwpIHsKLQotICAgICAgICAgICAgLy8gR2V0IDE2LWJpdCByZXByZXNlbnRhdGlvbgotICAgICAgICAgICAgSW5wdXRbMF0gPSBjbXNFdmFsVG9uZUN1cnZlMTYoR1swXSwgRlJPTV84X1RPXzE2KGkpKTsKLSAgICAgICAgICAgIElucHV0WzFdID0gY21zRXZhbFRvbmVDdXJ2ZTE2KEdbMV0sIEZST01fOF9UT18xNihpKSk7Ci0gICAgICAgICAgICBJbnB1dFsyXSA9IGNtc0V2YWxUb25lQ3VydmUxNihHWzJdLCBGUk9NXzhfVE9fMTYoaSkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgSW5wdXRbMF0gPSBGUk9NXzhfVE9fMTYoaSk7Ci0gICAgICAgICAgICBJbnB1dFsxXSA9IEZST01fOF9UT18xNihpKTsKLSAgICAgICAgICAgIElucHV0WzJdID0gRlJPTV84X1RPXzE2KGkpOwotICAgICAgICB9Ci0KLQotICAgICAgICAvLyBNb3ZlIHRvIDAuLjEuMCBpbiBmaXhlZCBkb21haW4KLSAgICAgICAgdjEgPSBfY21zVG9GaXhlZERvbWFpbihJbnB1dFswXSAqIHAgLT4gRG9tYWluWzBdKTsKLSAgICAgICAgdjIgPSBfY21zVG9GaXhlZERvbWFpbihJbnB1dFsxXSAqIHAgLT4gRG9tYWluWzFdKTsKLSAgICAgICAgdjMgPSBfY21zVG9GaXhlZERvbWFpbihJbnB1dFsyXSAqIHAgLT4gRG9tYWluWzJdKTsKLQotICAgICAgICAvLyBTdG9yZSB0aGUgcHJlY2FsY3VsYXRlZCB0YWJsZSBvZiBub2RlcwotICAgICAgICBwOCAtPlgwW2ldID0gKHAtPm9wdGFbMl0gKiBGSVhFRF9UT19JTlQodjEpKTsKLSAgICAgICAgcDggLT5ZMFtpXSA9IChwLT5vcHRhWzFdICogRklYRURfVE9fSU5UKHYyKSk7Ci0gICAgICAgIHA4IC0+WjBbaV0gPSAocC0+b3B0YVswXSAqIEZJWEVEX1RPX0lOVCh2MykpOwotCi0gICAgICAgIC8vIFN0b3JlIHRoZSBwcmVjYWxjdWxhdGVkIHRhYmxlIG9mIG9mZnNldHMKLSAgICAgICAgcDggLT5yeFtpXSA9IChjbXNVSW50MTZOdW1iZXIpIEZJWEVEX1JFU1RfVE9fSU5UKHYxKTsKLSAgICAgICAgcDggLT5yeVtpXSA9IChjbXNVSW50MTZOdW1iZXIpIEZJWEVEX1JFU1RfVE9fSU5UKHYyKTsKLSAgICAgICAgcDggLT5yeltpXSA9IChjbXNVSW50MTZOdW1iZXIpIEZJWEVEX1JFU1RfVE9fSU5UKHYzKTsKLSAgICB9Ci0KLSAgICBwOCAtPkNvbnRleHRJRCA9IENvbnRleHRJRDsKLSAgICBwOCAtPnAgPSBwOwotCi0gICAgcmV0dXJuIHA4OwotfQotCi1zdGF0aWMKLXZvaWQgUHJlbGluOGZyZWUoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIHB0cikKLXsKLSAgICBfY21zRnJlZShDb250ZXh0SUQsIHB0cik7Ci19Ci0KLXN0YXRpYwotdm9pZCogUHJlbGluOGR1cChjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3Qgdm9pZCogcHRyKQotewotICAgIHJldHVybiBfY21zRHVwTWVtKENvbnRleHRJRCwgcHRyLCBzaXplb2YoUHJlbGluOERhdGEpKTsKLX0KLQotCi0KLS8vIEEgb3B0aW1pemVkIGludGVycG9sYXRpb24gZm9yIDgtYml0IGlucHV0LgotI2RlZmluZSBERU5TKGksaixrKSAoTHV0VGFibGVbKGkpKyhqKSsoaykrT3V0Q2hhbl0pCi1zdGF0aWMKLXZvaWQgUHJlbGluRXZhbDgocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIElucHV0W10sCi0gICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgT3V0cHV0W10sCi0gICAgICAgICAgICAgICAgICByZWdpc3RlciBjb25zdCB2b2lkKiBEKQotewotCi0gICAgY21zVUludDhOdW1iZXIgICAgICAgICByLCBnLCBiOwotICAgIGNtc1MxNUZpeGVkMTZOdW1iZXIgICAgcngsIHJ5LCByejsKLSAgICBjbXNTMTVGaXhlZDE2TnVtYmVyICAgIGMwLCBjMSwgYzIsIGMzLCBSZXN0OwotICAgIGludCAgICAgICAgICAgICAgICAgICAgT3V0Q2hhbjsKLSAgICByZWdpc3RlciBjbXNTMTVGaXhlZDE2TnVtYmVyICAgIFgwLCBYMSwgWTAsIFkxLCBaMCwgWjE7Ci0gICAgUHJlbGluOERhdGEqIHA4ID0gKFByZWxpbjhEYXRhKikgRDsKLSAgICByZWdpc3RlciBjb25zdCBjbXNJbnRlcnBQYXJhbXMqIHAgPSBwOCAtPnA7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICBUb3RhbE91dCA9IHAgLT4gbk91dHB1dHM7Ci0gICAgY29uc3QgY21zVUludDE2TnVtYmVyKiBMdXRUYWJsZSA9IChjb25zdCBjbXNVSW50MTZOdW1iZXIqKXAgLT4gVGFibGU7Ci0KLSAgICByID0gSW5wdXRbMF0gPj4gODsKLSAgICBnID0gSW5wdXRbMV0gPj4gODsKLSAgICBiID0gSW5wdXRbMl0gPj4gODsKLQotICAgIFgwID0gWDEgPSBwOC0+WDBbcl07Ci0gICAgWTAgPSBZMSA9IHA4LT5ZMFtnXTsKLSAgICBaMCA9IFoxID0gcDgtPlowW2JdOwotCi0gICAgcnggPSBwOCAtPnJ4W3JdOwotICAgIHJ5ID0gcDggLT5yeVtnXTsKLSAgICByeiA9IHA4IC0+cnpbYl07Ci0KLSAgICBYMSA9IFgwICsgKChyeCA9PSAwKSA/IDAgOiBwIC0+b3B0YVsyXSk7Ci0gICAgWTEgPSBZMCArICgocnkgPT0gMCkgPyAwIDogcCAtPm9wdGFbMV0pOwotICAgIFoxID0gWjAgKyAoKHJ6ID09IDApID8gMCA6IHAgLT5vcHRhWzBdKTsKLQotCi0gICAgLy8gVGhlc2UgYXJlIHRoZSA2IFRldHJhaGVkcmFsCi0gICAgZm9yIChPdXRDaGFuPTA7IE91dENoYW4gPCBUb3RhbE91dDsgT3V0Q2hhbisrKSB7Ci0KLSAgICAgICAgYzAgPSBERU5TKFgwLCBZMCwgWjApOwotCi0gICAgICAgIGlmIChyeCA+PSByeSAmJiByeSA+PSByeikKLSAgICAgICAgewotICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMCwgWjApIC0gYzA7Ci0gICAgICAgICAgICBjMiA9IERFTlMoWDEsIFkxLCBaMCkgLSBERU5TKFgxLCBZMCwgWjApOwotICAgICAgICAgICAgYzMgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMSwgWTEsIFowKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBpZiAocnggPj0gcnogJiYgcnogPj0gcnkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMCwgWjApIC0gYzA7Ci0gICAgICAgICAgICAgICAgYzIgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMSwgWTAsIFoxKTsKLSAgICAgICAgICAgICAgICBjMyA9IERFTlMoWDEsIFkwLCBaMSkgLSBERU5TKFgxLCBZMCwgWjApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGlmIChyeiA+PSByeCAmJiByeCA+PSByeSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGMxID0gREVOUyhYMSwgWTAsIFoxKSAtIERFTlMoWDAsIFkwLCBaMSk7Ci0gICAgICAgICAgICAgICAgICAgIGMyID0gREVOUyhYMSwgWTEsIFoxKSAtIERFTlMoWDEsIFkwLCBaMSk7Ci0gICAgICAgICAgICAgICAgICAgIGMzID0gREVOUyhYMCwgWTAsIFoxKSAtIGMwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGlmIChyeSA+PSByeCAmJiByeCA+PSByeikKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMSwgWjApIC0gREVOUyhYMCwgWTEsIFowKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMyID0gREVOUyhYMCwgWTEsIFowKSAtIGMwOwotICAgICAgICAgICAgICAgICAgICAgICAgYzMgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMSwgWTEsIFowKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnkgPj0gcnogJiYgcnogPj0gcngpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYzEgPSBERU5TKFgxLCBZMSwgWjEpIC0gREVOUyhYMCwgWTEsIFoxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMiA9IERFTlMoWDAsIFkxLCBaMCkgLSBjMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMyA9IERFTlMoWDAsIFkxLCBaMSkgLSBERU5TKFgwLCBZMSwgWjApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyeiA+PSByeSAmJiByeSA+PSByeCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMxID0gREVOUyhYMSwgWTEsIFoxKSAtIERFTlMoWDAsIFkxLCBaMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMyID0gREVOUyhYMCwgWTEsIFoxKSAtIERFTlMoWDAsIFkwLCBaMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMzID0gREVOUyhYMCwgWTAsIFoxKSAtIGMwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMxID0gYzIgPSBjMyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN0ID0gYzEgKiByeCArIGMyICogcnkgKyBjMyAqIHJ6ICsgMHg4MDAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFtPdXRDaGFuXSA9IChjbXNVSW50MTZOdW1iZXIpYzAgKyAoKFJlc3QgKyAoUmVzdD4+MTYpKT4+MTYpOwotCi0gICAgfQotfQotCi0jdW5kZWYgREVOUwotCi0KLS8vIEN1cnZlcyB0aGF0IGNvbnRhaW4gd2lkZSBlbXB0eSBhcmVhcyBhcmUgbm90IG9wdGltaXplYWJsZQotc3RhdGljCi1jbXNCb29sIElzRGVnZW5lcmF0ZWQoY29uc3QgY21zVG9uZUN1cnZlKiBnKQotewotICAgIGludCBpLCBaZXJvcyA9IDAsIFBvbGVzID0gMDsKLSAgICBpbnQgbkVudHJpZXMgPSBnIC0+bkVudHJpZXM7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG5FbnRyaWVzOyBpKyspIHsKLQotICAgICAgICBpZiAoZyAtPlRhYmxlMTZbaV0gPT0gMHgwMDAwKSBaZXJvcysrOwotICAgICAgICBpZiAoZyAtPlRhYmxlMTZbaV0gPT0gMHhmZmZmKSBQb2xlcysrOwotICAgIH0KLQotICAgIGlmIChaZXJvcyA9PSAxICYmIFBvbGVzID09IDEpIHJldHVybiBGQUxTRTsgIC8vIEZvciBsaW5lYXIgdGFibGVzCi0gICAgaWYgKFplcm9zID4gKG5FbnRyaWVzIC8gNCkpIHJldHVybiBUUlVFOyAgLy8gRGVnZW5lcmF0ZWQsIG1vc3RseSB6ZXJvcwotICAgIGlmIChQb2xlcyA+IChuRW50cmllcyAvIDQpKSByZXR1cm4gVFJVRTsgIC8vIERlZ2VuZXJhdGVkLCBtb3N0bHkgcG9sZXMKLQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFdlIG5lZWQgeHB1dCBvdmVyIGhlcmUKLQotc3RhdGljCi1jbXNCb29sIE9wdGltaXplQnlDb21wdXRpbmdMaW5lYXJpemF0aW9uKGNtc1BpcGVsaW5lKiogTHV0LCBjbXNVSW50MzJOdW1iZXIgSW50ZW50LCBjbXNVSW50MzJOdW1iZXIqIElucHV0Rm9ybWF0LCBjbXNVSW50MzJOdW1iZXIqIE91dHB1dEZvcm1hdCwgY21zVUludDMyTnVtYmVyKiBkd0ZsYWdzKQotewotICAgIGNtc1BpcGVsaW5lKiBPcmlnaW5hbEx1dDsKLSAgICBpbnQgbkdyaWRQb2ludHM7Ci0gICAgY21zVG9uZUN1cnZlICpUcmFuc1tjbXNNQVhDSEFOTkVMU10sICpUcmFuc1JldmVyc2VbY21zTUFYQ0hBTk5FTFNdOwotICAgIGNtc1VJbnQzMk51bWJlciB0LCBpOwotICAgIGNtc0Zsb2F0MzJOdW1iZXIgdiwgSW5bY21zTUFYQ0hBTk5FTFNdLCBPdXRbY21zTUFYQ0hBTk5FTFNdOwotICAgIGNtc0Jvb2wgbElzU3VpdGFibGUsIGxJc0xpbmVhcjsKLSAgICBjbXNQaXBlbGluZSogT3B0aW1pemVkTFVUID0gTlVMTCwgKkx1dFBsdXNDdXJ2ZXMgPSBOVUxMOwotICAgIGNtc1N0YWdlKiBPcHRpbWl6ZWRDTFVUbXBlOwotICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgQ29sb3JTcGFjZSwgT3V0cHV0Q29sb3JTcGFjZTsKLSAgICBjbXNTdGFnZSogT3B0aW1pemVkUHJlbGluTXBlOwotICAgIGNtc1N0YWdlKiBtcGU7Ci0gICAgY21zVG9uZUN1cnZlKiogICBPcHRpbWl6ZWRQcmVsaW5DdXJ2ZXM7Ci0gICAgX2Ntc1N0YWdlQ0x1dERhdGEqICAgICBPcHRpbWl6ZWRQcmVsaW5DTFVUOwotCi0KLSAgICAvLyBUaGlzIGlzIGEgbG9vc3kgb3B0aW1pemF0aW9uISBkb2VzIG5vdCBhcHBseSBpbiBmbG9hdGluZy1wb2ludCBjYXNlcwotICAgIGlmIChfY21zRm9ybWF0dGVySXNGbG9hdCgqSW5wdXRGb3JtYXQpIHx8IF9jbXNGb3JtYXR0ZXJJc0Zsb2F0KCpPdXRwdXRGb3JtYXQpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAvLyBPbmx5IG9uIFJHQgotICAgIGlmIChUX0NPTE9SU1BBQ0UoKklucHV0Rm9ybWF0KSAgIT0gUFRfUkdCKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKFRfQ09MT1JTUEFDRSgqT3V0cHV0Rm9ybWF0KSAhPSBQVF9SR0IpIHJldHVybiBGQUxTRTsKLQotCi0gICAgLy8gT24gMTYgYml0cywgdXNlciBoYXMgdG8gc3BlY2lmeSB0aGUgZmVhdHVyZQotICAgIGlmICghX2Ntc0Zvcm1hdHRlcklzOGJpdCgqSW5wdXRGb3JtYXQpKSB7Ci0gICAgICAgIGlmICghKCpkd0ZsYWdzICYgY21zRkxBR1NfQ0xVVF9QUkVfTElORUFSSVpBVElPTikpIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBPcmlnaW5hbEx1dCA9ICpMdXQ7Ci0KLSAgIC8vIE5hbWVkIGNvbG9yIHBpcGVsaW5lcyBjYW5ub3QgYmUgb3B0aW1pemVkIGVpdGhlcgotICAgZm9yIChtcGUgPSBjbXNQaXBlbGluZUdldFB0clRvRmlyc3RTdGFnZShPcmlnaW5hbEx1dCk7Ci0gICAgICAgICBtcGUgIT0gTlVMTDsKLSAgICAgICAgIG1wZSA9IGNtc1N0YWdlTmV4dChtcGUpKSB7Ci0gICAgICAgICAgICBpZiAoY21zU3RhZ2VUeXBlKG1wZSkgPT0gY21zU2lnTmFtZWRDb2xvckVsZW1UeXBlKSByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgQ29sb3JTcGFjZSAgICAgICA9IF9jbXNJQ0Njb2xvclNwYWNlKFRfQ09MT1JTUEFDRSgqSW5wdXRGb3JtYXQpKTsKLSAgICBPdXRwdXRDb2xvclNwYWNlID0gX2Ntc0lDQ2NvbG9yU3BhY2UoVF9DT0xPUlNQQUNFKCpPdXRwdXRGb3JtYXQpKTsKLSAgICBuR3JpZFBvaW50cyAgICAgID0gX2Ntc1JlYXNvbmFibGVHcmlkcG9pbnRzQnlDb2xvcnNwYWNlKENvbG9yU3BhY2UsICpkd0ZsYWdzKTsKLQotICAgIC8vIEVtcHR5IGdhbW1hIGNvbnRhaW5lcnMKLSAgICBtZW1zZXQoVHJhbnMsIDAsIHNpemVvZihUcmFucykpOwotICAgIG1lbXNldChUcmFuc1JldmVyc2UsIDAsIHNpemVvZihUcmFuc1JldmVyc2UpKTsKLQotICAgIGZvciAodCA9IDA7IHQgPCBPcmlnaW5hbEx1dCAtPklucHV0Q2hhbm5lbHM7IHQrKykgewotICAgICAgICBUcmFuc1t0XSA9IGNtc0J1aWxkVGFidWxhdGVkVG9uZUN1cnZlMTYoT3JpZ2luYWxMdXQgLT5Db250ZXh0SUQsIFBSRUxJTkVBUklaQVRJT05fUE9JTlRTLCBOVUxMKTsKLSAgICAgICAgaWYgKFRyYW5zW3RdID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0gICAgfQotCi0gICAgLy8gUG9wdWxhdGUgdGhlIGN1cnZlcwotICAgIGZvciAoaT0wOyBpIDwgUFJFTElORUFSSVpBVElPTl9QT0lOVFM7IGkrKykgewotCi0gICAgICAgIHYgPSAoY21zRmxvYXQzMk51bWJlcikgKChjbXNGbG9hdDY0TnVtYmVyKSBpIC8gKFBSRUxJTkVBUklaQVRJT05fUE9JTlRTIC0gMSkpOwotCi0gICAgICAgIC8vIEZlZWQgaW5wdXQgd2l0aCBhIGdyYXkgcmFtcAotICAgICAgICBmb3IgKHQ9MDsgdCA8IE9yaWdpbmFsTHV0IC0+SW5wdXRDaGFubmVsczsgdCsrKQotICAgICAgICAgICAgSW5bdF0gPSB2OwotCi0gICAgICAgIC8vIEV2YWx1YXRlIHRoZSBncmF5IHZhbHVlCi0gICAgICAgIGNtc1BpcGVsaW5lRXZhbEZsb2F0KEluLCBPdXQsIE9yaWdpbmFsTHV0KTsKLQotICAgICAgICAvLyBTdG9yZSByZXN1bHQgaW4gY3VydmUKLSAgICAgICAgZm9yICh0PTA7IHQgPCBPcmlnaW5hbEx1dCAtPklucHV0Q2hhbm5lbHM7IHQrKykKLSAgICAgICAgICAgIFRyYW5zW3RdIC0+VGFibGUxNltpXSA9IF9jbXNRdWlja1NhdHVyYXRlV29yZChPdXRbdF0gKiA2NTUzNS4wKTsKLSAgICB9Ci0KLSAgICAvLyBTbG9wZS1saW1pdCB0aGUgb2J0YWluZWQgY3VydmVzCi0gICAgZm9yICh0ID0gMDsgdCA8IE9yaWdpbmFsTHV0IC0+SW5wdXRDaGFubmVsczsgdCsrKQotICAgICAgICBTbG9wZUxpbWl0aW5nKFRyYW5zW3RdKTsKLQotICAgIC8vIENoZWNrIGZvciB2YWxpZGl0eQotICAgIGxJc1N1aXRhYmxlID0gVFJVRTsKLSAgICBsSXNMaW5lYXIgICA9IFRSVUU7Ci0gICAgZm9yICh0PTA7IChsSXNTdWl0YWJsZSAmJiAodCA8IE9yaWdpbmFsTHV0IC0+SW5wdXRDaGFubmVscykpOyB0KyspIHsKLQotICAgICAgICAvLyBFeGNsdWRlIGlmIGFscmVhZHkgbGluZWFyCi0gICAgICAgIGlmICghY21zSXNUb25lQ3VydmVMaW5lYXIoVHJhbnNbdF0pKQotICAgICAgICAgICAgbElzTGluZWFyID0gRkFMU0U7Ci0KLSAgICAgICAgLy8gRXhjbHVkZSBpZiBub24tbW9ub3RvbmljCi0gICAgICAgIGlmICghY21zSXNUb25lQ3VydmVNb25vdG9uaWMoVHJhbnNbdF0pKQotICAgICAgICAgICAgbElzU3VpdGFibGUgPSBGQUxTRTsKLQotICAgICAgICBpZiAoSXNEZWdlbmVyYXRlZChUcmFuc1t0XSkpCi0gICAgICAgICAgICBsSXNTdWl0YWJsZSA9IEZBTFNFOwotICAgIH0KLQotICAgIC8vIElmIGl0IGlzIG5vdCBzdWl0YWJsZSwganVzdCBxdWl0Ci0gICAgaWYgKCFsSXNTdWl0YWJsZSkgZ290byBFcnJvcjsKLQotICAgIC8vIEludmVydCBjdXJ2ZXMgaWYgcG9zc2libGUKLSAgICBmb3IgKHQgPSAwOyB0IDwgT3JpZ2luYWxMdXQgLT5JbnB1dENoYW5uZWxzOyB0KyspIHsKLSAgICAgICAgVHJhbnNSZXZlcnNlW3RdID0gY21zUmV2ZXJzZVRvbmVDdXJ2ZUV4KFBSRUxJTkVBUklaQVRJT05fUE9JTlRTLCBUcmFuc1t0XSk7Ci0gICAgICAgIGlmIChUcmFuc1JldmVyc2VbdF0gPT0gTlVMTCkgZ290byBFcnJvcjsKLSAgICB9Ci0KLSAgICAvLyBOb3cgaW5zZXQgdGhlIHJldmVyc2VkIGN1cnZlcyBhdCB0aGUgYmVnaW4gb2YgdHJhbnNmb3JtCi0gICAgTHV0UGx1c0N1cnZlcyA9IGNtc1BpcGVsaW5lRHVwKE9yaWdpbmFsTHV0KTsKLSAgICBpZiAoTHV0UGx1c0N1cnZlcyA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKEx1dFBsdXNDdXJ2ZXMsIGNtc0FUX0JFR0lOLCBjbXNTdGFnZUFsbG9jVG9uZUN1cnZlcyhPcmlnaW5hbEx1dCAtPkNvbnRleHRJRCwgT3JpZ2luYWxMdXQgLT5JbnB1dENoYW5uZWxzLCBUcmFuc1JldmVyc2UpKSkKLSAgICAgICAgZ290byBFcnJvcjsKLQotICAgIC8vIENyZWF0ZSB0aGUgcmVzdWx0IExVVAotICAgIE9wdGltaXplZExVVCA9IGNtc1BpcGVsaW5lQWxsb2MoT3JpZ2luYWxMdXQgLT5Db250ZXh0SUQsIE9yaWdpbmFsTHV0IC0+SW5wdXRDaGFubmVscywgT3JpZ2luYWxMdXQgLT5PdXRwdXRDaGFubmVscyk7Ci0gICAgaWYgKE9wdGltaXplZExVVCA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgT3B0aW1pemVkUHJlbGluTXBlID0gY21zU3RhZ2VBbGxvY1RvbmVDdXJ2ZXMoT3JpZ2luYWxMdXQgLT5Db250ZXh0SUQsIE9yaWdpbmFsTHV0IC0+SW5wdXRDaGFubmVscywgVHJhbnMpOwotCi0gICAgLy8gQ3JlYXRlIGFuZCBpbnNlcnQgdGhlIGN1cnZlcyBhdCB0aGUgYmVnaW5uaW5nCi0gICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKE9wdGltaXplZExVVCwgY21zQVRfQkVHSU4sIE9wdGltaXplZFByZWxpbk1wZSkpCi0gICAgICAgIGdvdG8gRXJyb3I7Ci0KLSAgICAvLyBBbGxvY2F0ZSB0aGUgQ0xVVCBmb3IgcmVzdWx0Ci0gICAgT3B0aW1pemVkQ0xVVG1wZSA9IGNtc1N0YWdlQWxsb2NDTHV0MTZiaXQoT3JpZ2luYWxMdXQgLT5Db250ZXh0SUQsIG5HcmlkUG9pbnRzLCBPcmlnaW5hbEx1dCAtPklucHV0Q2hhbm5lbHMsIE9yaWdpbmFsTHV0IC0+T3V0cHV0Q2hhbm5lbHMsIE5VTEwpOwotCi0gICAgLy8gQWRkIHRoZSBDTFVUIHRvIHRoZSBkZXN0aW5hdGlvbiBMVVQKLSAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoT3B0aW1pemVkTFVULCBjbXNBVF9FTkQsIE9wdGltaXplZENMVVRtcGUpKQotICAgICAgICBnb3RvIEVycm9yOwotCi0gICAgLy8gUmVzYW1wbGUgdGhlIExVVAotICAgIGlmICghY21zU3RhZ2VTYW1wbGVDTHV0MTZiaXQoT3B0aW1pemVkQ0xVVG1wZSwgWEZvcm1TYW1wbGVyMTYsICh2b2lkKikgTHV0UGx1c0N1cnZlcywgMCkpIGdvdG8gRXJyb3I7Ci0KLSAgICAvLyBGcmVlIHJlc291cmNlcwotICAgIGZvciAodCA9IDA7IHQgPCBPcmlnaW5hbEx1dCAtPklucHV0Q2hhbm5lbHM7IHQrKykgewotCi0gICAgICAgIGlmIChUcmFuc1t0XSkgY21zRnJlZVRvbmVDdXJ2ZShUcmFuc1t0XSk7Ci0gICAgICAgIGlmIChUcmFuc1JldmVyc2VbdF0pIGNtc0ZyZWVUb25lQ3VydmUoVHJhbnNSZXZlcnNlW3RdKTsKLSAgICB9Ci0KLSAgICBjbXNQaXBlbGluZUZyZWUoTHV0UGx1c0N1cnZlcyk7Ci0KLQotICAgIE9wdGltaXplZFByZWxpbkN1cnZlcyA9IF9jbXNTdGFnZUdldFB0clRvQ3VydmVTZXQoT3B0aW1pemVkUHJlbGluTXBlKTsKLSAgICBPcHRpbWl6ZWRQcmVsaW5DTFVUICAgPSAoX2Ntc1N0YWdlQ0x1dERhdGEqKSBPcHRpbWl6ZWRDTFVUbXBlIC0+RGF0YTsKLQotICAgIC8vIFNldCB0aGUgZXZhbHVhdG9yIGlmIDgtYml0Ci0gICAgaWYgKF9jbXNGb3JtYXR0ZXJJczhiaXQoKklucHV0Rm9ybWF0KSkgewotCi0gICAgICAgIFByZWxpbjhEYXRhKiBwOCA9IFByZWxpbk9wdDhhbGxvYyhPcHRpbWl6ZWRMVVQgLT5Db250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpbWl6ZWRQcmVsaW5DTFVUIC0+UGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW1pemVkUHJlbGluQ3VydmVzKTsKLSAgICAgICAgaWYgKHA4ID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBfY21zUGlwZWxpbmVTZXRPcHRpbWl6YXRpb25QYXJhbWV0ZXJzKE9wdGltaXplZExVVCwgUHJlbGluRXZhbDgsICh2b2lkKikgcDgsIFByZWxpbjhmcmVlLCBQcmVsaW44ZHVwKTsKLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBQcmVsaW4xNkRhdGEqIHAxNiA9IFByZWxpbk9wdDE2YWxsb2MoT3B0aW1pemVkTFVUIC0+Q29udGV4dElELAotICAgICAgICAgICAgT3B0aW1pemVkUHJlbGluQ0xVVCAtPlBhcmFtcywKLSAgICAgICAgICAgIDMsIE9wdGltaXplZFByZWxpbkN1cnZlcywgMywgTlVMTCk7Ci0gICAgICAgIGlmIChwMTYgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIF9jbXNQaXBlbGluZVNldE9wdGltaXphdGlvblBhcmFtZXRlcnMoT3B0aW1pemVkTFVULCBQcmVsaW5FdmFsMTYsICh2b2lkKikgcDE2LCBQcmVsaW5PcHQxNmZyZWUsIFByZWxpbjE2ZHVwKTsKLQotICAgIH0KLQotICAgIC8vIERvbid0IGZpeCB3aGl0ZSBvbiBhYnNvbHV0ZSBjb2xvcmltZXRyaWMKLSAgICBpZiAoSW50ZW50ID09IElOVEVOVF9BQlNPTFVURV9DT0xPUklNRVRSSUMpCi0gICAgICAgICpkd0ZsYWdzIHw9IGNtc0ZMQUdTX05PV0hJVEVPTldISVRFRklYVVA7Ci0KLSAgICBpZiAoISgqZHdGbGFncyAmIGNtc0ZMQUdTX05PV0hJVEVPTldISVRFRklYVVApKSB7Ci0KLSAgICAgICAgaWYgKCFGaXhXaGl0ZU1pc2FsaWdubWVudChPcHRpbWl6ZWRMVVQsIENvbG9yU3BhY2UsIE91dHB1dENvbG9yU3BhY2UpKSB7Ci0KLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEFuZCByZXR1cm4gdGhlIG9idGFpbmVkIExVVAotCi0gICAgY21zUGlwZWxpbmVGcmVlKE9yaWdpbmFsTHV0KTsKLSAgICAqTHV0ID0gT3B0aW1pemVkTFVUOwotICAgIHJldHVybiBUUlVFOwotCi1FcnJvcjoKLQotICAgIGZvciAodCA9IDA7IHQgPCBPcmlnaW5hbEx1dCAtPklucHV0Q2hhbm5lbHM7IHQrKykgewotCi0gICAgICAgIGlmIChUcmFuc1t0XSkgY21zRnJlZVRvbmVDdXJ2ZShUcmFuc1t0XSk7Ci0gICAgICAgIGlmIChUcmFuc1JldmVyc2VbdF0pIGNtc0ZyZWVUb25lQ3VydmUoVHJhbnNSZXZlcnNlW3RdKTsKLSAgICB9Ci0KLSAgICBpZiAoTHV0UGx1c0N1cnZlcyAhPSBOVUxMKSBjbXNQaXBlbGluZUZyZWUoTHV0UGx1c0N1cnZlcyk7Ci0gICAgaWYgKE9wdGltaXplZExVVCAhPSBOVUxMKSBjbXNQaXBlbGluZUZyZWUoT3B0aW1pemVkTFVUKTsKLQotICAgIHJldHVybiBGQUxTRTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoSW50ZW50KTsKLX0KLQotCi0vLyBDdXJ2ZXMgb3B0aW1pemVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMKLXZvaWQgQ3VydmVzRnJlZShjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogcHRyKQotewotICAgICBDdXJ2ZXMxNkRhdGEqIERhdGEgPSAoQ3VydmVzMTZEYXRhKikgcHRyOwotICAgICBpbnQgaTsKLQotICAgICBmb3IgKGk9MDsgaSA8IERhdGEgLT4gbkN1cnZlczsgaSsrKSB7Ci0KLSAgICAgICAgIF9jbXNGcmVlKENvbnRleHRJRCwgRGF0YSAtPkN1cnZlc1tpXSk7Ci0gICAgIH0KLQotICAgICBfY21zRnJlZShDb250ZXh0SUQsIERhdGEgLT5DdXJ2ZXMpOwotICAgICBfY21zRnJlZShDb250ZXh0SUQsIHB0cik7Ci19Ci0KLXN0YXRpYwotdm9pZCogQ3VydmVzRHVwKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCB2b2lkKiBwdHIpCi17Ci0gICAgQ3VydmVzMTZEYXRhKiBEYXRhID0gKEN1cnZlczE2RGF0YSopX2Ntc0R1cE1lbShDb250ZXh0SUQsIHB0ciwgc2l6ZW9mKEN1cnZlczE2RGF0YSkpOwotICAgIGludCBpOwotCi0gICAgaWYgKERhdGEgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBEYXRhIC0+Q3VydmVzID0gKGNtc1VJbnQxNk51bWJlcioqKV9jbXNEdXBNZW0oQ29udGV4dElELCBEYXRhIC0+Q3VydmVzLCBEYXRhIC0+bkN1cnZlcyAqIHNpemVvZihjbXNVSW50MTZOdW1iZXIqKSk7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IERhdGEgLT4gbkN1cnZlczsgaSsrKSB7Ci0gICAgICAgIERhdGEgLT5DdXJ2ZXNbaV0gPSAoY21zVUludDE2TnVtYmVyKilfY21zRHVwTWVtKENvbnRleHRJRCwgRGF0YSAtPkN1cnZlc1tpXSwgRGF0YSAtPiBuRWxlbWVudHMgKiBzaXplb2YoY21zVUludDE2TnVtYmVyKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuICh2b2lkKikgRGF0YTsKLX0KLQotLy8gUHJlY29tcHV0ZXMgdGFibGVzIGZvciA4LWJpdCBvbiBpbnB1dCBkZXZpY2VsaW5rLgotc3RhdGljCi1DdXJ2ZXMxNkRhdGEqIEN1cnZlc0FsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCBpbnQgbkN1cnZlcywgaW50IG5FbGVtZW50cywgY21zVG9uZUN1cnZlKiogRykKLXsKLSAgICBpbnQgaSwgajsKLSAgICBDdXJ2ZXMxNkRhdGEqIGMxNjsKLQotICAgIGMxNiA9IChDdXJ2ZXMxNkRhdGEqKV9jbXNNYWxsb2NaZXJvKENvbnRleHRJRCwgc2l6ZW9mKEN1cnZlczE2RGF0YSkpOwotICAgIGlmIChjMTYgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBjMTYgLT5uQ3VydmVzID0gbkN1cnZlczsKLSAgICBjMTYgLT5uRWxlbWVudHMgPSBuRWxlbWVudHM7Ci0KLSAgICBjMTYgLT5DdXJ2ZXMgPSAoY21zVUludDE2TnVtYmVyKiopX2Ntc0NhbGxvYyhDb250ZXh0SUQsIG5DdXJ2ZXMsIHNpemVvZihjbXNVSW50MTZOdW1iZXIqKSk7Ci0gICAgaWYgKGMxNiAtPkN1cnZlcyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIGZvciAoaT0wOyBpIDwgbkN1cnZlczsgaSsrKSB7Ci0KLSAgICAgICAgYzE2LT5DdXJ2ZXNbaV0gPSAoY21zVUludDE2TnVtYmVyKilfY21zQ2FsbG9jKENvbnRleHRJRCwgbkVsZW1lbnRzLCBzaXplb2YoY21zVUludDE2TnVtYmVyKSk7Ci0KLSAgICAgICAgaWYgKGMxNi0+Q3VydmVzW2ldID09IE5VTEwpIHsKLQotICAgICAgICAgICAgZm9yIChqPTA7IGogPCBpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIGMxNi0+Q3VydmVzW2pdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF9jbXNGcmVlKENvbnRleHRJRCwgYzE2LT5DdXJ2ZXMpOwotICAgICAgICAgICAgX2Ntc0ZyZWUoQ29udGV4dElELCBjMTYpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobkVsZW1lbnRzID09IDI1NikgewotCi0gICAgICAgICAgICBmb3IgKGo9MDsgaiA8IG5FbGVtZW50czsgaisrKSB7Ci0KLSAgICAgICAgICAgICAgICBjMTYgLT5DdXJ2ZXNbaV1bal0gPSBjbXNFdmFsVG9uZUN1cnZlMTYoR1tpXSwgRlJPTV84X1RPXzE2KGopKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLQotICAgICAgICAgICAgZm9yIChqPTA7IGogPCBuRWxlbWVudHM7IGorKykgewotICAgICAgICAgICAgICAgIGMxNiAtPkN1cnZlc1tpXVtqXSA9IGNtc0V2YWxUb25lQ3VydmUxNihHW2ldLCAoY21zVUludDE2TnVtYmVyKSBqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBjMTY7Ci19Ci0KLXN0YXRpYwotdm9pZCBGYXN0RXZhbHVhdGVDdXJ2ZXM4KHJlZ2lzdGVyIGNvbnN0IGNtc1VJbnQxNk51bWJlciBJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgT3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNvbnN0IHZvaWQqIEQpCi17Ci0gICAgQ3VydmVzMTZEYXRhKiBEYXRhID0gKEN1cnZlczE2RGF0YSopIEQ7Ci0gICAgY21zVUludDhOdW1iZXIgeDsKLSAgICBpbnQgaTsKLQotICAgIGZvciAoaT0wOyBpIDwgRGF0YSAtPm5DdXJ2ZXM7IGkrKykgewotCi0gICAgICAgICB4ID0gKEluW2ldID4+IDgpOwotICAgICAgICAgT3V0W2ldID0gRGF0YSAtPiBDdXJ2ZXNbaV1beF07Ci0gICAgfQotfQotCi0KLXN0YXRpYwotdm9pZCBGYXN0RXZhbHVhdGVDdXJ2ZXMxNihyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIE91dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjb25zdCB2b2lkKiBEKQotewotICAgIEN1cnZlczE2RGF0YSogRGF0YSA9IChDdXJ2ZXMxNkRhdGEqKSBEOwotICAgIGludCBpOwotCi0gICAgZm9yIChpPTA7IGkgPCBEYXRhIC0+bkN1cnZlczsgaSsrKSB7Ci0gICAgICAgICBPdXRbaV0gPSBEYXRhIC0+IEN1cnZlc1tpXVtJbltpXV07Ci0gICAgfQotfQotCi0KLXN0YXRpYwotdm9pZCBGYXN0SWRlbnRpdHkxNihyZWdpc3RlciBjb25zdCBjbXNVSW50MTZOdW1iZXIgSW5bXSwKLSAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIE91dFtdLAotICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjb25zdCB2b2lkKiBEKQotewotICAgIGNtc1BpcGVsaW5lKiBMdXQgPSAoY21zUGlwZWxpbmUqKSBEOwotICAgIGNtc1VJbnQzMk51bWJlciBpOwotCi0gICAgZm9yIChpPTA7IGkgPCBMdXQgLT5JbnB1dENoYW5uZWxzOyBpKyspIHsKLSAgICAgICAgIE91dFtpXSA9IEluW2ldOwotICAgIH0KLX0KLQotCi0vLyBJZiB0aGUgdGFyZ2V0IExVVCBob2xkcyBvbmx5IGN1cnZlcywgdGhlIG9wdGltaXphdGlvbiBwcm9jZWR1cmUgaXMgdG8gam9pbiBhbGwgdGhvc2UKLS8vIGN1cnZlcyB0b2dldGhlci4gVGhhdCBvbmx5IHdvcmtzIG9uIGN1cnZlcyBhbmQgZG9lcyBub3Qgd29yayBvbiBtYXRyaWNlcy4KLXN0YXRpYwotY21zQm9vbCBPcHRpbWl6ZUJ5Sm9pbmluZ0N1cnZlcyhjbXNQaXBlbGluZSoqIEx1dCwgY21zVUludDMyTnVtYmVyIEludGVudCwgY21zVUludDMyTnVtYmVyKiBJbnB1dEZvcm1hdCwgY21zVUludDMyTnVtYmVyKiBPdXRwdXRGb3JtYXQsIGNtc1VJbnQzMk51bWJlciogZHdGbGFncykKLXsKLSAgICBjbXNUb25lQ3VydmUqKiBHYW1tYVRhYmxlcyA9IE5VTEw7Ci0gICAgY21zRmxvYXQzMk51bWJlciBJbkZsb2F0W2Ntc01BWENIQU5ORUxTXSwgT3V0RmxvYXRbY21zTUFYQ0hBTk5FTFNdOwotICAgIGNtc1VJbnQzMk51bWJlciBpLCBqOwotICAgIGNtc1BpcGVsaW5lKiBTcmMgPSAqTHV0OwotICAgIGNtc1BpcGVsaW5lKiBEZXN0ID0gTlVMTDsKLSAgICBjbXNTdGFnZSogbXBlOwotICAgIGNtc1N0YWdlKiBPYnRhaW5lZEN1cnZlcyA9IE5VTEw7Ci0KLQotICAgIC8vIFRoaXMgaXMgYSBsb29zeSBvcHRpbWl6YXRpb24hIGRvZXMgbm90IGFwcGx5IGluIGZsb2F0aW5nLXBvaW50IGNhc2VzCi0gICAgaWYgKF9jbXNGb3JtYXR0ZXJJc0Zsb2F0KCpJbnB1dEZvcm1hdCkgfHwgX2Ntc0Zvcm1hdHRlcklzRmxvYXQoKk91dHB1dEZvcm1hdCkpIHJldHVybiBGQUxTRTsKLQotICAgIC8vICBPbmx5IGN1cnZlcyBpbiB0aGlzIExVVD8KLSAgICBmb3IgKG1wZSA9IGNtc1BpcGVsaW5lR2V0UHRyVG9GaXJzdFN0YWdlKFNyYyk7Ci0gICAgICAgICBtcGUgIT0gTlVMTDsKLSAgICAgICAgIG1wZSA9IGNtc1N0YWdlTmV4dChtcGUpKSB7Ci0gICAgICAgICAgICBpZiAoY21zU3RhZ2VUeXBlKG1wZSkgIT0gY21zU2lnQ3VydmVTZXRFbGVtVHlwZSkgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIC8vIEFsbG9jYXRlIGFuIGVtcHR5IExVVAotICAgIERlc3QgPSAgY21zUGlwZWxpbmVBbGxvYyhTcmMgLT5Db250ZXh0SUQsIFNyYyAtPklucHV0Q2hhbm5lbHMsIFNyYyAtPk91dHB1dENoYW5uZWxzKTsKLSAgICBpZiAoRGVzdCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAvLyBDcmVhdGUgdGFyZ2V0IGN1cnZlcwotICAgIEdhbW1hVGFibGVzID0gKGNtc1RvbmVDdXJ2ZSoqKSBfY21zQ2FsbG9jKFNyYyAtPkNvbnRleHRJRCwgU3JjIC0+SW5wdXRDaGFubmVscywgc2l6ZW9mKGNtc1RvbmVDdXJ2ZSopKTsKLSAgICBpZiAoR2FtbWFUYWJsZXMgPT0gTlVMTCkgZ290byBFcnJvcjsKLQotICAgIGZvciAoaT0wOyBpIDwgU3JjIC0+SW5wdXRDaGFubmVsczsgaSsrKSB7Ci0gICAgICAgIEdhbW1hVGFibGVzW2ldID0gY21zQnVpbGRUYWJ1bGF0ZWRUb25lQ3VydmUxNihTcmMgLT5Db250ZXh0SUQsIFBSRUxJTkVBUklaQVRJT05fUE9JTlRTLCBOVUxMKTsKLSAgICAgICAgaWYgKEdhbW1hVGFibGVzW2ldID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0gICAgfQotCi0gICAgLy8gQ29tcHV0ZSAxNiBiaXQgcmVzdWx0IGJ5IHVzaW5nIGZsb2F0aW5nIHBvaW50Ci0gICAgZm9yIChpPTA7IGkgPCBQUkVMSU5FQVJJWkFUSU9OX1BPSU5UUzsgaSsrKSB7Ci0KLSAgICAgICAgZm9yIChqPTA7IGogPCBTcmMgLT5JbnB1dENoYW5uZWxzOyBqKyspCi0gICAgICAgICAgICBJbkZsb2F0W2pdID0gKGNtc0Zsb2F0MzJOdW1iZXIpICgoY21zRmxvYXQ2NE51bWJlcikgaSAvIChQUkVMSU5FQVJJWkFUSU9OX1BPSU5UUyAtIDEpKTsKLQotICAgICAgICBjbXNQaXBlbGluZUV2YWxGbG9hdChJbkZsb2F0LCBPdXRGbG9hdCwgU3JjKTsKLQotICAgICAgICBmb3IgKGo9MDsgaiA8IFNyYyAtPklucHV0Q2hhbm5lbHM7IGorKykKLSAgICAgICAgICAgIEdhbW1hVGFibGVzW2pdIC0+IFRhYmxlMTZbaV0gPSBfY21zUXVpY2tTYXR1cmF0ZVdvcmQoT3V0RmxvYXRbal0gKiA2NTUzNS4wKTsKLSAgICB9Ci0KLSAgICBPYnRhaW5lZEN1cnZlcyA9IGNtc1N0YWdlQWxsb2NUb25lQ3VydmVzKFNyYyAtPkNvbnRleHRJRCwgU3JjIC0+SW5wdXRDaGFubmVscywgR2FtbWFUYWJsZXMpOwotICAgIGlmIChPYnRhaW5lZEN1cnZlcyA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgZm9yIChpPTA7IGkgPCBTcmMgLT5JbnB1dENoYW5uZWxzOyBpKyspIHsKLSAgICAgICAgY21zRnJlZVRvbmVDdXJ2ZShHYW1tYVRhYmxlc1tpXSk7Ci0gICAgICAgIEdhbW1hVGFibGVzW2ldID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoR2FtbWFUYWJsZXMgIT0gTlVMTCkgX2Ntc0ZyZWUoU3JjIC0+Q29udGV4dElELCBHYW1tYVRhYmxlcyk7Ci0KLSAgICAvLyBNYXliZSB0aGUgY3VydmVzIGFyZSBsaW5lYXIgYXQgdGhlIGVuZAotICAgIGlmICghQWxsQ3VydmVzQXJlTGluZWFyKE9idGFpbmVkQ3VydmVzKSkgewotCi0gICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShEZXN0LCBjbXNBVF9CRUdJTiwgT2J0YWluZWRDdXJ2ZXMpKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLQotICAgICAgICAvLyBJZiB0aGUgY3VydmVzIGFyZSB0byBiZSBhcHBsaWVkIGluIDggYml0cywgd2UgY2FuIHNhdmUgbWVtb3J5Ci0gICAgICAgIGlmIChfY21zRm9ybWF0dGVySXM4Yml0KCpJbnB1dEZvcm1hdCkpIHsKLQotICAgICAgICAgICAgX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqIERhdGEgPSAoX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqKSBPYnRhaW5lZEN1cnZlcyAtPkRhdGE7Ci0gICAgICAgICAgICAgQ3VydmVzMTZEYXRhKiBjMTYgPSBDdXJ2ZXNBbGxvYyhEZXN0IC0+Q29udGV4dElELCBEYXRhIC0+bkN1cnZlcywgMjU2LCBEYXRhIC0+VGhlQ3VydmVzKTsKLQotICAgICAgICAgICAgIGlmIChjMTYgPT0gTlVMTCkgZ290byBFcnJvcjsgCi0gICAgICAgICAgICAgKmR3RmxhZ3MgfD0gY21zRkxBR1NfTk9DQUNIRTsKLSAgICAgICAgICAgIF9jbXNQaXBlbGluZVNldE9wdGltaXphdGlvblBhcmFtZXRlcnMoRGVzdCwgRmFzdEV2YWx1YXRlQ3VydmVzOCwgYzE2LCBDdXJ2ZXNGcmVlLCBDdXJ2ZXNEdXApOwotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0KLSAgICAgICAgICAgIF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKiBEYXRhID0gKF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKikgY21zU3RhZ2VEYXRhKE9idGFpbmVkQ3VydmVzKTsKLSAgICAgICAgICAgICBDdXJ2ZXMxNkRhdGEqIGMxNiA9IEN1cnZlc0FsbG9jKERlc3QgLT5Db250ZXh0SUQsIERhdGEgLT5uQ3VydmVzLCA2NTUzNiwgRGF0YSAtPlRoZUN1cnZlcyk7Ci0KLSAgICAgICAgICAgICBpZiAoYzE2ID09IE5VTEwpIGdvdG8gRXJyb3I7IAotICAgICAgICAgICAgICpkd0ZsYWdzIHw9IGNtc0ZMQUdTX05PQ0FDSEU7Ci0gICAgICAgICAgICBfY21zUGlwZWxpbmVTZXRPcHRpbWl6YXRpb25QYXJhbWV0ZXJzKERlc3QsIEZhc3RFdmFsdWF0ZUN1cnZlczE2LCBjMTYsIEN1cnZlc0ZyZWUsIEN1cnZlc0R1cCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSB7Ci0KLSAgICAgICAgLy8gTFVUIG9wdGltaXplcyB0byBub3RoaW5nLiBTZXQgdGhlIGlkZW50aXR5IExVVAotICAgICAgICBjbXNTdGFnZUZyZWUoT2J0YWluZWRDdXJ2ZXMpOwotCi0gICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShEZXN0LCBjbXNBVF9CRUdJTiwgY21zU3RhZ2VBbGxvY0lkZW50aXR5KERlc3QgLT5Db250ZXh0SUQsIFNyYyAtPklucHV0Q2hhbm5lbHMpKSkKLSAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAgKmR3RmxhZ3MgfD0gY21zRkxBR1NfTk9DQUNIRTsKLSAgICAgICAgX2Ntc1BpcGVsaW5lU2V0T3B0aW1pemF0aW9uUGFyYW1ldGVycyhEZXN0LCBGYXN0SWRlbnRpdHkxNiwgKHZvaWQqKSBEZXN0LCBOVUxMLCBOVUxMKTsKLSAgICB9Ci0KLSAgICAvLyBXZSBhcmUgZG9uZS4KLSAgICBjbXNQaXBlbGluZUZyZWUoU3JjKTsKLSAgICAqTHV0ID0gRGVzdDsKLSAgICByZXR1cm4gVFJVRTsKLQotRXJyb3I6Ci0KLSAgICBpZiAoT2J0YWluZWRDdXJ2ZXMgIT0gTlVMTCkgY21zU3RhZ2VGcmVlKE9idGFpbmVkQ3VydmVzKTsKLSAgICBpZiAoR2FtbWFUYWJsZXMgIT0gTlVMTCkgewotICAgICAgICBmb3IgKGk9MDsgaSA8IFNyYyAtPklucHV0Q2hhbm5lbHM7IGkrKykgewotICAgICAgICAgICAgaWYgKEdhbW1hVGFibGVzW2ldICE9IE5VTEwpIGNtc0ZyZWVUb25lQ3VydmUoR2FtbWFUYWJsZXNbaV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgX2Ntc0ZyZWUoU3JjIC0+Q29udGV4dElELCBHYW1tYVRhYmxlcyk7Ci0gICAgfQotCi0gICAgaWYgKERlc3QgIT0gTlVMTCkgY21zUGlwZWxpbmVGcmVlKERlc3QpOwotICAgIHJldHVybiBGQUxTRTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoSW50ZW50KTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKElucHV0Rm9ybWF0KTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKE91dHB1dEZvcm1hdCk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihkd0ZsYWdzKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTFVUIGlzIFNoYXBlciAtIE1hdHJpeCAtIE1hdHJpeCAtIFNoYXBlciwgd2hpY2ggaXMgdmVyeSBmcmVxdWVudCB3aGVuIGNvbWJpbmluZyB0d28gbWF0cml4LXNoYXBlciBwcm9maWxlcwotCi0KLXN0YXRpYwotdm9pZCAgRnJlZU1hdFNoYXBlcihjbXNDb250ZXh0IENvbnRleHRJRCwgdm9pZCogRGF0YSkKLXsKLSAgICBpZiAoRGF0YSAhPSBOVUxMKSBfY21zRnJlZShDb250ZXh0SUQsIERhdGEpOwotfQotCi1zdGF0aWMKLXZvaWQqIER1cE1hdFNoYXBlcihjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3Qgdm9pZCogRGF0YSkKLXsKLSAgICByZXR1cm4gX2Ntc0R1cE1lbShDb250ZXh0SUQsIERhdGEsIHNpemVvZihNYXRTaGFwZXI4RGF0YSkpOwotfQotCi0KLS8vIEEgZmFzdCBtYXRyaXgtc2hhcGVyIGV2YWx1YXRvciBmb3IgOCBiaXRzLiBUaGlzIGlzIGEgYml0IHRpY2t5IHNpbmNlIEknbSB1c2luZyAxLjE0IHNpZ25lZCBmaXhlZCBwb2ludAotLy8gdG8gYWNjb21wbGlzaCBzb21lIHBlcmZvcm1hbmNlLiBBY3R1YWxseSBpdCB0YWtlcyAyNTZ4MyAxNiBiaXRzIHRhYmxlcyBhbmQgMTYzODUgeCAzIHRhYmxlcyBvZiA4IGJpdHMsCi0vLyBpbiB0b3RhbCBhYm91dCA1MEssIGFuZCB0aGUgcGVyZm9ybWFuY2UgYm9vc3QgaXMgaHVnZSEKLXN0YXRpYwotdm9pZCBNYXRTaGFwZXJFdmFsMTYocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIEluW10sCi0gICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgT3V0W10sCi0gICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjb25zdCB2b2lkKiBEKQotewotICAgIE1hdFNoYXBlcjhEYXRhKiBwID0gKE1hdFNoYXBlcjhEYXRhKikgRDsKLSAgICBjbXNTMUZpeGVkMTROdW1iZXIgbDEsIGwyLCBsMywgciwgZywgYjsKLSAgICBjbXNVSW50MzJOdW1iZXIgcmksIGdpLCBiaTsKLQotICAgIC8vIEluIHRoaXMgY2FzZSAoYW5kIG9ubHkgaW4gdGhpcyBjYXNlISkgd2UgY2FuIHVzZSB0aGlzIHNpbXBsaWZpY2F0aW9uIHNpbmNlCi0gICAgLy8gSW5bXSBpcyBhc3N1cmVkIHRvIGNvbWUgZnJvbSBhIDggYml0IG51bWJlci4gKGEgPDwgOCB8IGEpCi0gICAgcmkgPSBJblswXSAmIDB4RkY7Ci0gICAgZ2kgPSBJblsxXSAmIDB4RkY7Ci0gICAgYmkgPSBJblsyXSAmIDB4RkY7Ci0KLSAgICAvLyBBY3Jvc3MgZmlyc3Qgc2hhcGVyLCB3aGljaCBhbHNvIGNvbnZlcnRzIHRvIDEuMTQgZml4ZWQgcG9pbnQKLSAgICByID0gcC0+U2hhcGVyMVJbcmldOwotICAgIGcgPSBwLT5TaGFwZXIxR1tnaV07Ci0gICAgYiA9IHAtPlNoYXBlcjFCW2JpXTsKLQotICAgIC8vIEV2YWx1YXRlIHRoZSBtYXRyaXggaW4gMS4xNCBmaXhlZCBwb2ludAotICAgIGwxID0gIChwLT5NYXRbMF1bMF0gKiByICsgcC0+TWF0WzBdWzFdICogZyArIHAtPk1hdFswXVsyXSAqIGIgKyBwLT5PZmZbMF0gKyAweDIwMDApID4+IDE0OwotICAgIGwyID0gIChwLT5NYXRbMV1bMF0gKiByICsgcC0+TWF0WzFdWzFdICogZyArIHAtPk1hdFsxXVsyXSAqIGIgKyBwLT5PZmZbMV0gKyAweDIwMDApID4+IDE0OwotICAgIGwzID0gIChwLT5NYXRbMl1bMF0gKiByICsgcC0+TWF0WzJdWzFdICogZyArIHAtPk1hdFsyXVsyXSAqIGIgKyBwLT5PZmZbMl0gKyAweDIwMDApID4+IDE0OwotCi0gICAgLy8gTm93IHdlIGhhdmUgdG8gY2xpcCB0byAwLi4xLjAgcmFuZ2UKLSAgICByaSA9IChsMSA8IDApID8gMCA6ICgobDEgPiAxNjM4NCkgPyAxNjM4NCA6IGwxKTsKLSAgICBnaSA9IChsMiA8IDApID8gMCA6ICgobDIgPiAxNjM4NCkgPyAxNjM4NCA6IGwyKTsKLSAgICBiaSA9IChsMyA8IDApID8gMCA6ICgobDMgPiAxNjM4NCkgPyAxNjM4NCA6IGwzKTsKLQotICAgIC8vIEFuZCBhY3Jvc3Mgc2Vjb25kIHNoYXBlciwKLSAgICBPdXRbMF0gPSBwLT5TaGFwZXIyUltyaV07Ci0gICAgT3V0WzFdID0gcC0+U2hhcGVyMkdbZ2ldOwotICAgIE91dFsyXSA9IHAtPlNoYXBlcjJCW2JpXTsKLQotfQotCi0vLyBUaGlzIHRhYmxlIGNvbnZlcnRzIGZyb20gOCBiaXRzIHRvIDEuMTQgYWZ0ZXIgYXBwbHlpbmcgdGhlIGN1cnZlCi1zdGF0aWMKLWNtc0Jvb2wgRmlsbEZpcnN0U2hhcGVyKGNtc1MxRml4ZWQxNE51bWJlciogVGFibGUsIGNtc1RvbmVDdXJ2ZSogQ3VydmUpCi17Ci0gICAgaW50IGk7Ci0gICAgY21zRmxvYXQzMk51bWJlciBSLCB5OwotCi0gICAgZm9yIChpPTA7IGkgPCAyNTY7IGkrKykgewotCi0gICAgICAgIFIgICA9IChjbXNGbG9hdDMyTnVtYmVyKSAoaSAvIDI1NS4wKTsKLSAgICAgICAgeSAgID0gY21zRXZhbFRvbmVDdXJ2ZUZsb2F0KEN1cnZlLCBSKTsKLSAgICAgICAgaWYgKGlzaW5mKHkpKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIFRhYmxlW2ldID0gRE9VQkxFX1RPXzFGSVhFRDE0KHkpOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLy8gVGhpcyB0YWJsZSBjb252ZXJ0cyBmb3JtIDEuMTQgKGJlaW5nIDB4NDAwMCB0aGUgbGFzdCBlbnRyeSkgdG8gOCBiaXRzIGFmdGVyIGFwcGx5aW5nIHRoZSBjdXJ2ZQotc3RhdGljCi1jbXNCb29sIEZpbGxTZWNvbmRTaGFwZXIoY21zVUludDE2TnVtYmVyKiBUYWJsZSwgY21zVG9uZUN1cnZlKiBDdXJ2ZSwgY21zQm9vbCBJczhCaXRzT3V0cHV0KQotewotICAgIGludCBpOwotICAgIGNtc0Zsb2F0MzJOdW1iZXIgUiwgVmFsOwotCi0gICAgZm9yIChpPTA7IGkgPCAxNjM4NTsgaSsrKSB7Ci0KLSAgICAgICAgUiAgID0gKGNtc0Zsb2F0MzJOdW1iZXIpIChpIC8gMTYzODQuMCk7Ci0gICAgICAgIFZhbCA9IGNtc0V2YWxUb25lQ3VydmVGbG9hdChDdXJ2ZSwgUik7ICAgIC8vIFZhbCBjb21lcyAwLi4xLjAKLSAgICAgICAgaWYgKGlzaW5mKFZhbCkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgaWYgKElzOEJpdHNPdXRwdXQpIHsKLQotICAgICAgICAgICAgLy8gSWYgOCBiaXRzIG91dHB1dCwgd2UgY2FuIG9wdGltaXplIGZ1cnRoZXIgYnkgY29tcHV0aW5nIHRoZSAvIDI1NyBwYXJ0LgotICAgICAgICAgICAgLy8gZmlyc3Qgd2UgY29tcHV0ZSB0aGUgcmVzdWx0aW5nIGJ5dGUgYW5kIHRoZW4gd2Ugc3RvcmUgdGhlIGJ5dGUgdGltZXMKLSAgICAgICAgICAgIC8vIDI1Ny4gVGhpcyBxdWFudGl6YXRpb24gYWxsb3dzIHRvIHJvdW5kIHZlcnkgcXVpY2sgYnkgZG9pbmcgYSA+PiA4LCBidXQKLSAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBsb3cgYnl0ZSBpcyBhbHdheXMgZXF1YWwgdG8gbXNiLCB3ZSBjYW4gZG8gYSAmIDB4ZmYgYW5kIHRoaXMgd29ya3MhCi0gICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIgdyA9IF9jbXNRdWlja1NhdHVyYXRlV29yZChWYWwgKiA2NTUzNS4wKTsKLSAgICAgICAgICAgIGNtc1VJbnQ4TnVtYmVyICBiID0gRlJPTV8xNl9UT184KHcpOwotCi0gICAgICAgICAgICBUYWJsZVtpXSA9IEZST01fOF9UT18xNihiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIFRhYmxlW2ldICA9IF9jbXNRdWlja1NhdHVyYXRlV29yZChWYWwgKiA2NTUzNS4wKTsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8vIENvbXB1dGUgdGhlIG1hdHJpeC1zaGFwZXIgc3RydWN0dXJlCi1zdGF0aWMKLWNtc0Jvb2wgU2V0TWF0U2hhcGVyKGNtc1BpcGVsaW5lKiBEZXN0LCBjbXNUb25lQ3VydmUqIEN1cnZlMVszXSwgY21zTUFUMyogTWF0LCBjbXNWRUMzKiBPZmYsIGNtc1RvbmVDdXJ2ZSogQ3VydmUyWzNdLCBjbXNVSW50MzJOdW1iZXIqIE91dHB1dEZvcm1hdCkKLXsKLSAgICBNYXRTaGFwZXI4RGF0YSogcDsKLSAgICBpbnQgaSwgajsKLSAgICBjbXNCb29sIElzOEJpdHMgPSBfY21zRm9ybWF0dGVySXM4Yml0KCpPdXRwdXRGb3JtYXQpOwotCi0gICAgLy8gQWxsb2NhdGUgYSBiaWcgY2h1Y2sgb2YgbWVtb3J5IHRvIHN0b3JlIHByZWNvbXB1dGVkIHRhYmxlcwotICAgIHAgPSAoTWF0U2hhcGVyOERhdGEqKSBfY21zTWFsbG9jKERlc3QgLT5Db250ZXh0SUQsIHNpemVvZihNYXRTaGFwZXI4RGF0YSkpOwotICAgIGlmIChwID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQotICAgIHAgLT4gQ29udGV4dElEID0gRGVzdCAtPiBDb250ZXh0SUQ7Ci0KLSAgICAvLyBQcmVjb21wdXRlIHRhYmxlcwotICAgIGlmICghRmlsbEZpcnN0U2hhcGVyKHAgLT5TaGFwZXIxUiwgQ3VydmUxWzBdKSkKLSAgICAgICAgZ290byBFcnJvcjsKLSAgICBpZiAoIUZpbGxGaXJzdFNoYXBlcihwIC0+U2hhcGVyMUcsIEN1cnZlMVsxXSkpCi0gICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgaWYgKCFGaWxsRmlyc3RTaGFwZXIocCAtPlNoYXBlcjFCLCBDdXJ2ZTFbMl0pKQotICAgICAgICBnb3RvIEVycm9yOwotCi0gICAgaWYgKCFGaWxsU2Vjb25kU2hhcGVyKHAgLT5TaGFwZXIyUiwgQ3VydmUyWzBdLCBJczhCaXRzKSkKLSAgICAgICAgZ290byBFcnJvcjsKLSAgICBpZiAoIUZpbGxTZWNvbmRTaGFwZXIocCAtPlNoYXBlcjJHLCBDdXJ2ZTJbMV0sIElzOEJpdHMpKQotICAgICAgICBnb3RvIEVycm9yOwotICAgIGlmICghRmlsbFNlY29uZFNoYXBlcihwIC0+U2hhcGVyMkIsIEN1cnZlMlsyXSwgSXM4Qml0cykpCi0gICAgICAgIGdvdG8gRXJyb3I7Ci0KLSAgICAvLyBDb252ZXJ0IG1hdHJpeCB0byBuRml4ZWQxNC4gTm90ZSB0aGF0IHRob3NlIHZhbHVlcyBtYXkgdGFrZSBtb3JlIHRoYW4gMTYgYml0cyBhcwotICAgIGZvciAoaT0wOyBpIDwgMzsgaSsrKSB7Ci0gICAgICAgIGZvciAoaj0wOyBqIDwgMzsgaisrKSB7Ci0gICAgICAgICAgICBwIC0+TWF0W2ldW2pdID0gRE9VQkxFX1RPXzFGSVhFRDE0KE1hdC0+dltpXS5uW2pdKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaT0wOyBpIDwgMzsgaSsrKSB7Ci0KLSAgICAgICAgaWYgKE9mZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBwIC0+T2ZmW2ldID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHAgLT5PZmZbaV0gPSBET1VCTEVfVE9fMUZJWEVEMTQoT2ZmLT5uW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE1hcmsgYXMgb3B0aW1pemVkIGZvciBmYXN0ZXIgZm9ybWF0dGVyCi0gICAgaWYgKElzOEJpdHMpCi0gICAgICAgICpPdXRwdXRGb3JtYXQgfD0gT1BUSU1JWkVEX1NIKDEpOwotCi0gICAgLy8gRmlsbCBmdW5jdGlvbiBwb2ludGVycwotICAgIF9jbXNQaXBlbGluZVNldE9wdGltaXphdGlvblBhcmFtZXRlcnMoRGVzdCwgTWF0U2hhcGVyRXZhbDE2LCAodm9pZCopIHAsIEZyZWVNYXRTaGFwZXIsIER1cE1hdFNoYXBlcik7Ci0gICAgcmV0dXJuIFRSVUU7Ci1FcnJvcjoKLSAgICBfY21zRnJlZShEZXN0LT5Db250ZXh0SUQsIHApOwotICAgIHJldHVybiBGQUxTRTsKLX0KLQotLy8gIDggYml0cyBvbiBpbnB1dCBhbGxvd3MgbWF0cml4LXNoYXBlciBib290IHVwIHRvIDI1IE1waXhlbHMgcGVyIHNlY29uZCBvbiBSR0IuIFRoYXQncyBmYXN0IQotLy8gVE9ETzogQWxsb3cgYSB0aGlyZCBtYXRyaXggZm9yIGFicy4gY29sb3JpbWV0cmljCi1zdGF0aWMKLWNtc0Jvb2wgT3B0aW1pemVNYXRyaXhTaGFwZXIoY21zUGlwZWxpbmUqKiBMdXQsIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsIGNtc1VJbnQzMk51bWJlciogSW5wdXRGb3JtYXQsIGNtc1VJbnQzMk51bWJlciogT3V0cHV0Rm9ybWF0LCBjbXNVSW50MzJOdW1iZXIqIGR3RmxhZ3MpCi17Ci0gICAgY21zU3RhZ2UqIEN1cnZlMSwgKkN1cnZlMjsKLSAgICBjbXNTdGFnZSogTWF0cml4MSwgKk1hdHJpeDI7Ci0gICAgX2Ntc1N0YWdlTWF0cml4RGF0YSogRGF0YTE7Ci0gICAgX2Ntc1N0YWdlTWF0cml4RGF0YSogRGF0YTI7Ci0gICAgY21zTUFUMyByZXM7Ci0gICAgY21zQm9vbCBJZGVudGl0eU1hdDsKLSAgICBjbXNQaXBlbGluZSogRGVzdCwgKlNyYzsKLQotICAgIC8vIE9ubHkgd29ya3Mgb24gUkdCIHRvIFJHQgotICAgIGlmIChUX0NIQU5ORUxTKCpJbnB1dEZvcm1hdCkgIT0gMyB8fCBUX0NIQU5ORUxTKCpPdXRwdXRGb3JtYXQpICE9IDMpIHJldHVybiBGQUxTRTsKLQotICAgIC8vIE9ubHkgd29ya3Mgb24gOCBiaXQgaW5wdXQKLSAgICBpZiAoIV9jbXNGb3JtYXR0ZXJJczhiaXQoKklucHV0Rm9ybWF0KSkgcmV0dXJuIEZBTFNFOwotCi0gICAgLy8gU2VlbXMgc3VpdGFibGUsIHByb2NlZWQKLSAgICBTcmMgPSAqTHV0OwotCi0gICAgLy8gQ2hlY2sgZm9yIHNoYXBlci1tYXRyaXgtbWF0cml4LXNoYXBlciBzdHJ1Y3R1cmUsIHRoYXQgaXMgd2hhdCB0aGlzIG9wdGltaXplciBzdGFuZHMgZm9yCi0gICAgaWYgKCFjbXNQaXBlbGluZUNoZWNrQW5kUmV0cmVpdmVTdGFnZXMoU3JjLCA0LAotICAgICAgICBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLCBjbXNTaWdNYXRyaXhFbGVtVHlwZSwgY21zU2lnTWF0cml4RWxlbVR5cGUsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsCi0gICAgICAgICZDdXJ2ZTEsICZNYXRyaXgxLCAmTWF0cml4MiwgJkN1cnZlMikpIHJldHVybiBGQUxTRTsKLQotICAgIC8vIEdldCBib3RoIG1hdHJpY2VzCi0gICAgRGF0YTEgPSAoX2Ntc1N0YWdlTWF0cml4RGF0YSopIGNtc1N0YWdlRGF0YShNYXRyaXgxKTsKLSAgICBEYXRhMiA9IChfY21zU3RhZ2VNYXRyaXhEYXRhKikgY21zU3RhZ2VEYXRhKE1hdHJpeDIpOwotCi0gICAgLy8gSW5wdXQgb2Zmc2V0IHNob3VsZCBiZSB6ZXJvCi0gICAgaWYgKERhdGExIC0+T2Zmc2V0ICE9IE5VTEwpIHJldHVybiBGQUxTRTsKLQotICAgIC8vIE11bHRpcGx5IGJvdGggbWF0cmljZXMgdG8gZ2V0IHRoZSByZXN1bHQKLSAgICBfY21zTUFUM3BlcigmcmVzLCAoY21zTUFUMyopIERhdGEyIC0+RG91YmxlLCAoY21zTUFUMyopIERhdGExIC0+RG91YmxlKTsKLQotICAgIC8vIE5vdyB0aGUgcmVzdWx0IGlzIGluIHJlcyArIERhdGEyIC0+IE9mZnNldC4gTWF5YmUgaXMgYSBwbGFpbiBpZGVudGl0eT8KLSAgICBJZGVudGl0eU1hdCA9IEZBTFNFOwotICAgIGlmIChfY21zTUFUM2lzSWRlbnRpdHkoJnJlcykgJiYgRGF0YTIgLT5PZmZzZXQgPT0gTlVMTCkgewotCi0gICAgICAgIC8vIFdlIGNhbiBnZXQgcmlkIG9mIGZ1bGwgbWF0cml4Ci0gICAgICAgIElkZW50aXR5TWF0ID0gVFJVRTsKLSAgICB9Ci0KLSAgICAgIC8vIEFsbG9jYXRlIGFuIGVtcHR5IExVVAotICAgIERlc3QgPSAgY21zUGlwZWxpbmVBbGxvYyhTcmMgLT5Db250ZXh0SUQsIFNyYyAtPklucHV0Q2hhbm5lbHMsIFNyYyAtPk91dHB1dENoYW5uZWxzKTsKLSAgICBpZiAoIURlc3QpIHJldHVybiBGQUxTRTsKLQotICAgIC8vIEFzc2FtYmxlIHRoZSBuZXcgTFVUCi0gICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKERlc3QsIGNtc0FUX0JFR0lOLCBjbXNTdGFnZUR1cChDdXJ2ZTEpKSkKLSAgICAgICAgZ290byBFcnJvcjsKLQotICAgIGlmICghSWRlbnRpdHlNYXQpCi0gICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShEZXN0LCBjbXNBVF9FTkQsIGNtc1N0YWdlQWxsb2NNYXRyaXgoRGVzdCAtPkNvbnRleHRJRCwgMywgMywgKGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIqKSAmcmVzLCBEYXRhMiAtPk9mZnNldCkpKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoRGVzdCwgY21zQVRfRU5ELCBjbXNTdGFnZUR1cChDdXJ2ZTIpKSkKLSAgICAgICAgZ290byBFcnJvcjsKLQotICAgIC8vIElmIGlkZW50aXR5IG9uIG1hdHJpeCwgd2UgY2FuIGZ1cnRoZXIgb3B0aW1pemUgdGhlIGN1cnZlcywgc28gY2FsbCB0aGUgam9pbiBjdXJ2ZXMgcm91dGluZQotICAgIGlmIChJZGVudGl0eU1hdCkgewotCi0gICAgICAgIE9wdGltaXplQnlKb2luaW5nQ3VydmVzKCZEZXN0LCBJbnRlbnQsIElucHV0Rm9ybWF0LCBPdXRwdXRGb3JtYXQsIGR3RmxhZ3MpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqIG1wZUMxID0gKF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKikgY21zU3RhZ2VEYXRhKEN1cnZlMSk7Ci0gICAgICAgIF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKiBtcGVDMiA9IChfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSopIGNtc1N0YWdlRGF0YShDdXJ2ZTIpOwotCi0gICAgICAgIC8vIEluIHRoaXMgcGFydGljdWxhciBvcHRpbWl6YXRpb24sIGNhY2g/ZG9lcyBub3QgaGVscCBhcyBpdCB0YWtlcyBtb3JlIHRpbWUgdG8gZGVhbCB3aXRoCi0gICAgICAgIC8vIHRoZSBjYWNoP3RoYXQgd2l0aCB0aGUgcGl4ZWwgaGFuZGxpbmcKLSAgICAgICAgKmR3RmxhZ3MgfD0gY21zRkxBR1NfTk9DQUNIRTsKLQotICAgICAgICAvLyBTZXR1cCB0aGUgb3B0aW1pemFyaW9uIHJvdXRpbmVzCi0gICAgICAgIGlmICghU2V0TWF0U2hhcGVyKERlc3QsIG1wZUMxIC0+VGhlQ3VydmVzLCAmcmVzLCAoY21zVkVDMyopIERhdGEyIC0+T2Zmc2V0LCBtcGVDMi0+VGhlQ3VydmVzLCBPdXRwdXRGb3JtYXQpKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0KLSAgICBjbXNQaXBlbGluZUZyZWUoU3JjKTsKLSAgICAqTHV0ID0gRGVzdDsKLSAgICByZXR1cm4gVFJVRTsKLUVycm9yOgotICAgIC8vIExlYXZlIFNyYyB1bmNoYW5nZWQKLSAgICBjbXNQaXBlbGluZUZyZWUoRGVzdCk7Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE9wdGltaXphdGlvbiBwbHVnLWlucwotCi0vLyBMaXN0IG9mIG9wdGltaXphdGlvbnMKLXR5cGVkZWYgc3RydWN0IF9jbXNPcHRpbWl6YXRpb25Db2xsZWN0aW9uX3N0IHsKLQotICAgIF9jbXNPUFRvcHRpbWl6ZUZuICBPcHRpbWl6ZVB0cjsKLQotICAgIHN0cnVjdCBfY21zT3B0aW1pemF0aW9uQ29sbGVjdGlvbl9zdCAqTmV4dDsKLQotfSBfY21zT3B0aW1pemF0aW9uQ29sbGVjdGlvbjsKLQotCi0vLyBUaGUgYnVpbHQtaW4gbGlzdC4gV2UgY3VycmVudGx5IGltcGxlbWVudCA0IHR5cGVzIG9mIG9wdGltaXphdGlvbnMuIEpvaW5pbmcgb2YgY3VydmVzLCBtYXRyaXgtc2hhcGVyLCBsaW5lYXJpemF0aW9uIGFuZCByZXNhbXBsaW5nCi1zdGF0aWMgX2Ntc09wdGltaXphdGlvbkNvbGxlY3Rpb24gRGVmYXVsdE9wdGltaXphdGlvbltdID0gewotCi0gICAgeyBPcHRpbWl6ZUJ5Sm9pbmluZ0N1cnZlcywgICAgICAgICAgICAmRGVmYXVsdE9wdGltaXphdGlvblsxXSB9LAotICAgIHsgT3B0aW1pemVNYXRyaXhTaGFwZXIsICAgICAgICAgICAgICAgJkRlZmF1bHRPcHRpbWl6YXRpb25bMl0gfSwKLSAgICB7IE9wdGltaXplQnlDb21wdXRpbmdMaW5lYXJpemF0aW9uLCAgICZEZWZhdWx0T3B0aW1pemF0aW9uWzNdIH0sCi0gICAgeyBPcHRpbWl6ZUJ5UmVzYW1wbGluZywgICAgICAgICAgICAgICBOVUxMIH0KLX07Ci0KLS8vIFRoZSBsaW5rZWQgbGlzdCBoZWFkCi1fY21zT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmtUeXBlIF9jbXNPcHRpbWl6YXRpb25QbHVnaW5DaHVuayA9IHsgTlVMTCB9OwotCi0KLS8vIER1cGxpY2F0ZXMgdGhlIHpvbmUgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIHBsdWctaW4gaW4gdGhlIG5ldyBjb250ZXh0Ci1zdGF0aWMKLXZvaWQgRHVwUGx1Z2luT3B0aW1pemF0aW9uTGlzdChzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKLXsKLSAgIF9jbXNPcHRpbWl6YXRpb25QbHVnaW5DaHVua1R5cGUgbmV3SGVhZCA9IHsgTlVMTCB9OwotICAgX2Ntc09wdGltaXphdGlvbkNvbGxlY3Rpb24qICBlbnRyeTsKLSAgIF9jbXNPcHRpbWl6YXRpb25Db2xsZWN0aW9uKiAgQW50ZXJpb3IgPSBOVUxMOwotICAgX2Ntc09wdGltaXphdGlvblBsdWdpbkNodW5rVHlwZSogaGVhZCA9IChfY21zT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmtUeXBlKikgc3JjLT5jaHVua3NbT3B0aW1pemF0aW9uUGx1Z2luXTsKLQotICAgIF9jbXNBc3NlcnQoY3R4ICE9IE5VTEwpOwotICAgIF9jbXNBc3NlcnQoaGVhZCAhPSBOVUxMKTsKLQotICAgIC8vIFdhbGsgdGhlIGxpc3QgY29weWluZyBhbGwgbm9kZXMKLSAgIGZvciAoZW50cnkgPSBoZWFkLT5PcHRpbWl6YXRpb25Db2xsZWN0aW9uOwotICAgICAgICBlbnRyeSAhPSBOVUxMOwotICAgICAgICBlbnRyeSA9IGVudHJ5IC0+TmV4dCkgewotCi0gICAgICAgICAgICBfY21zT3B0aW1pemF0aW9uQ29sbGVjdGlvbiAqbmV3RW50cnkgPSAoIF9jbXNPcHRpbWl6YXRpb25Db2xsZWN0aW9uICopIF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCBlbnRyeSwgc2l6ZW9mKF9jbXNPcHRpbWl6YXRpb25Db2xsZWN0aW9uKSk7Ci0gICAKLSAgICAgICAgICAgIGlmIChuZXdFbnRyeSA9PSBOVUxMKSAKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8ga2VlcCB0aGUgbGlua2VkIGxpc3Qgb3JkZXIsIHNvIHRoaXMgaXMgYSBsaXR0bGUgYml0IHRyaWNreQotICAgICAgICAgICAgbmV3RW50cnkgLT4gTmV4dCA9IE5VTEw7Ci0gICAgICAgICAgICBpZiAoQW50ZXJpb3IpCi0gICAgICAgICAgICAgICAgQW50ZXJpb3IgLT4gTmV4dCA9IG5ld0VudHJ5OwotICAgICAKLSAgICAgICAgICAgIEFudGVyaW9yID0gbmV3RW50cnk7Ci0KLSAgICAgICAgICAgIGlmIChuZXdIZWFkLk9wdGltaXphdGlvbkNvbGxlY3Rpb24gPT0gTlVMTCkKLSAgICAgICAgICAgICAgICBuZXdIZWFkLk9wdGltaXphdGlvbkNvbGxlY3Rpb24gPSBuZXdFbnRyeTsKLSAgICB9Ci0KLSAgY3R4IC0+Y2h1bmtzW09wdGltaXphdGlvblBsdWdpbl0gPSBfY21zU3ViQWxsb2NEdXAoY3R4LT5NZW1Qb29sLCAmbmV3SGVhZCwgc2l6ZW9mKF9jbXNPcHRpbWl6YXRpb25QbHVnaW5DaHVua1R5cGUpKTsKLX0KLQotdm9pZCAgX2Ntc0FsbG9jT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQotewotICBpZiAoc3JjICE9IE5VTEwpIHsKLQotICAgICAgICAvLyBDb3B5IGFsbCBsaW5rZWQgbGlzdAotICAgICAgIER1cFBsdWdpbk9wdGltaXphdGlvbkxpc3QoY3R4LCBzcmMpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgc3RhdGljIF9jbXNPcHRpbWl6YXRpb25QbHVnaW5DaHVua1R5cGUgT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmtUeXBlID0geyBOVUxMIH07Ci0gICAgICAgIGN0eCAtPmNodW5rc1tPcHRpbWl6YXRpb25QbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsICZPcHRpbWl6YXRpb25QbHVnaW5DaHVua1R5cGUsIHNpemVvZihfY21zT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmtUeXBlKSk7Ci0gICAgfQotfQotCi0KLS8vIFJlZ2lzdGVyIG5ldyB3YXlzIHRvIG9wdGltaXplCi1jbXNCb29sICBfY21zUmVnaXN0ZXJPcHRpbWl6YXRpb25QbHVnaW4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BsdWdpbkJhc2UqIERhdGEpCi17Ci0gICAgY21zUGx1Z2luT3B0aW1pemF0aW9uKiBQbHVnaW4gPSAoY21zUGx1Z2luT3B0aW1pemF0aW9uKikgRGF0YTsKLSAgICBfY21zT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmtUeXBlKiBjdHggPSAoIF9jbXNPcHRpbWl6YXRpb25QbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgT3B0aW1pemF0aW9uUGx1Z2luKTsKLSAgICBfY21zT3B0aW1pemF0aW9uQ29sbGVjdGlvbiogZmw7Ci0KLSAgICBpZiAoRGF0YSA9PSBOVUxMKSB7Ci0KLSAgICAgICAgY3R4LT5PcHRpbWl6YXRpb25Db2xsZWN0aW9uID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgLy8gT3B0aW1pemVyIGNhbGxiYWNrIGlzIHJlcXVpcmVkCi0gICAgaWYgKFBsdWdpbiAtPk9wdGltaXplUHRyID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQotICAgIGZsID0gKF9jbXNPcHRpbWl6YXRpb25Db2xsZWN0aW9uKikgX2Ntc1BsdWdpbk1hbGxvYyhDb250ZXh0SUQsIHNpemVvZihfY21zT3B0aW1pemF0aW9uQ29sbGVjdGlvbikpOwotICAgIGlmIChmbCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAvLyBDb3B5IHRoZSBwYXJhbWV0ZXJzCi0gICAgZmwgLT5PcHRpbWl6ZVB0ciA9IFBsdWdpbiAtPk9wdGltaXplUHRyOwotCi0gICAgLy8gS2VlcCBsaW5rZWQgbGlzdAotICAgIGZsIC0+TmV4dCA9IGN0eC0+T3B0aW1pemF0aW9uQ29sbGVjdGlvbjsKLQotICAgIC8vIFNldCB0aGUgaGVhZAotICAgIGN0eCAtPk9wdGltaXphdGlvbkNvbGxlY3Rpb24gPSBmbDsKLQotICAgIC8vIEFsbCBpcyBvawotICAgIHJldHVybiBUUlVFOwotfQotCi0vLyBUaGUgZW50cnkgcG9pbnQgZm9yIExVVCBvcHRpbWl6YXRpb24KLWNtc0Jvb2wgX2Ntc09wdGltaXplUGlwZWxpbmUoY21zQ29udGV4dCBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1BpcGVsaW5lKiogICAgUHRyTHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIEludGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyKiBJbnB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyKiBPdXRwdXRGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciogZHdGbGFncykKLXsKLSAgICBfY21zT3B0aW1pemF0aW9uUGx1Z2luQ2h1bmtUeXBlKiBjdHggPSAoIF9jbXNPcHRpbWl6YXRpb25QbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgT3B0aW1pemF0aW9uUGx1Z2luKTsKLSAgICBfY21zT3B0aW1pemF0aW9uQ29sbGVjdGlvbiogT3B0czsKLSAgICBjbXNCb29sIEFueVN1Y2Nlc3MgPSBGQUxTRTsKLQotICAgIC8vIEEgQ0xVVCBpcyBiZWluZyBhc2tlZCwgc28gZm9yY2UgdGhpcyBzcGVjaWZpYyBvcHRpbWl6YXRpb24KLSAgICBpZiAoKmR3RmxhZ3MgJiBjbXNGTEFHU19GT1JDRV9DTFVUKSB7Ci0KLSAgICAgICAgUHJlT3B0aW1pemUoKlB0ckx1dCk7Ci0gICAgICAgIHJldHVybiBPcHRpbWl6ZUJ5UmVzYW1wbGluZyhQdHJMdXQsIEludGVudCwgSW5wdXRGb3JtYXQsIE91dHB1dEZvcm1hdCwgZHdGbGFncyk7Ci0gICAgfQotCi0gICAgLy8gQW55dGhpbmcgdG8gb3B0aW1pemU/Ci0gICAgaWYgKCgqUHRyTHV0KSAtPkVsZW1lbnRzID09IE5VTEwpIHsKLSAgICAgICAgX2Ntc1BpcGVsaW5lU2V0T3B0aW1pemF0aW9uUGFyYW1ldGVycygqUHRyTHV0LCBGYXN0SWRlbnRpdHkxNiwgKHZvaWQqKSAqUHRyTHV0LCBOVUxMLCBOVUxMKTsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgLy8gVHJ5IHRvIGdldCByaWQgb2YgaWRlbnRpdGllcyBhbmQgdHJpdmlhbCBjb252ZXJzaW9ucy4KLSAgICBBbnlTdWNjZXNzID0gUHJlT3B0aW1pemUoKlB0ckx1dCk7Ci0KLSAgICAvLyBBZnRlciByZW1vdmFsIGRvIHdlIGVuZCB3aXRoIGFuIGlkZW50aXR5PwotICAgIGlmICgoKlB0ckx1dCkgLT5FbGVtZW50cyA9PSBOVUxMKSB7Ci0gICAgICAgIF9jbXNQaXBlbGluZVNldE9wdGltaXphdGlvblBhcmFtZXRlcnMoKlB0ckx1dCwgRmFzdElkZW50aXR5MTYsICh2b2lkKikgKlB0ckx1dCwgTlVMTCwgTlVMTCk7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIC8vIERvIG5vdCBvcHRpbWl6ZSwga2VlcCBhbGwgcHJlY2lzaW9uCi0gICAgaWYgKCpkd0ZsYWdzICYgY21zRkxBR1NfTk9PUFRJTUlaRSkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgLy8gVHJ5IHBsdWctaW4gb3B0aW1pemF0aW9ucyAKLSAgICBmb3IgKE9wdHMgPSBjdHgtPk9wdGltaXphdGlvbkNvbGxlY3Rpb247Ci0gICAgICAgICBPcHRzICE9IE5VTEw7Ci0gICAgICAgICBPcHRzID0gT3B0cyAtPk5leHQpIHsKLQotICAgICAgICAgICAgLy8gSWYgb25lIHNjaGVtYSBzdWNjZWVkZWQsIHdlIGFyZSBkb25lCi0gICAgICAgICAgICBpZiAoT3B0cyAtPk9wdGltaXplUHRyKFB0ckx1dCwgSW50ZW50LCBJbnB1dEZvcm1hdCwgT3V0cHV0Rm9ybWF0LCBkd0ZsYWdzKSkgewotCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7ICAgIC8vIE9wdGltaXplZCEKLSAgICAgICAgICAgIH0KLSAgICB9Ci0KLSAgIC8vIFRyeSBidWlsdC1pbiBvcHRpbWl6YXRpb25zIAotICAgIGZvciAoT3B0cyA9IERlZmF1bHRPcHRpbWl6YXRpb247Ci0gICAgICAgICBPcHRzICE9IE5VTEw7Ci0gICAgICAgICBPcHRzID0gT3B0cyAtPk5leHQpIHsKLQotICAgICAgICAgICAgaWYgKE9wdHMgLT5PcHRpbWl6ZVB0cihQdHJMdXQsIEludGVudCwgSW5wdXRGb3JtYXQsIE91dHB1dEZvcm1hdCwgZHdGbGFncykpIHsKLQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOyAgCi0gICAgICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gT25seSBzaW1wbGUgb3B0aW1pemF0aW9ucyBzdWNjZWVkZWQKLSAgICByZXR1cm4gQW55U3VjY2VzczsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zcGFjay5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNwYWNrLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMjNiNTMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNwYWNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzY5ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDEwIE1hcnRpIE1hcmlhIFNhZ3VlcgotLy8KLS8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCi0vLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKLS8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0vLwotLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLS8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotLy8KLS8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAotLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCi0vLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQotLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgotLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLSNpbmNsdWRlICJsY21zMl9pbnRlcm5hbC5oIgotCi0vLyBUaGlzIG1vZHVsZSBoYW5kbGVzIGFsbCBmb3JtYXRzIHN1cHBvcnRlZCBieSBsY21zLiBUaGVyZSBhcmUgdHdvIGZsYXZvcnMsIDE2IGJpdHMgYW5kCi0vLyBmbG9hdGluZyBwb2ludC4gRmxvYXRpbmcgcG9pbnQgaXMgc3VwcG9ydGVkIG9ubHkgaW4gYSBzdWJzZXQsIHRob3NlIGZvcm1hdHMgaG9sZGluZwotLy8gY21zRmxvYXQzMk51bWJlciAoNCBieXRlcyBwZXIgY29tcG9uZW50KSBhbmQgZG91YmxlIChtYXJrZWQgYXMgMCBieXRlcyBwZXIgY29tcG9uZW50Ci0vLyBhcyBzcGVjaWFsIGNhc2UpCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLS8vIFRoaXMgbWFjcm8gcmV0dXJuIHdvcmRzIHN0b3JlZCBhcyBiaWcgZW5kaWFuCi0jZGVmaW5lIENIQU5HRV9FTkRJQU4odykgICAgKGNtc1VJbnQxNk51bWJlcikgKChjbXNVSW50MTZOdW1iZXIpICgodyk8PDgpfCgodyk+PjgpKQotCi0vLyBUaGVzZSBtYWNyb3MgaGFuZGxlcyByZXZlcnNpbmcgKG5lZ2F0aXZlKQotI2RlZmluZSBSRVZFUlNFX0ZMQVZPUl84KHgpICAgICAoKGNtc1VJbnQ4TnVtYmVyKSAoMHhmZi0oeCkpKQotI2RlZmluZSBSRVZFUlNFX0ZMQVZPUl8xNih4KSAgICAoKGNtc1VJbnQxNk51bWJlcikoMHhmZmZmLSh4KSkpCi0KLS8vICogMHhmZmZmIC8gMHhmZjAwID0gKDI1NSAqIDI1NykgLyAoMjU1ICogMjU2KSA9IDI1NyAvIDI1NgotY21zSU5MSU5FIGNtc1VJbnQxNk51bWJlciBGb21MYWJWMlRvTGFiVjQoY21zVUludDE2TnVtYmVyIHgpCi17Ci0gICAgaW50IGEgPSAoeCA8PCA4IHwgeCkgPj4gODsgIC8vICogMjU3IC8gMjU2Ci0gICAgaWYgKCBhID4gMHhmZmZmKSByZXR1cm4gMHhmZmZmOwotICAgIHJldHVybiAoY21zVUludDE2TnVtYmVyKSBhOwotfQotCi0vLyAqIDB4ZjAwIC8gMHhmZmZmID0gKiAyNTYgLyAyNTcKLWNtc0lOTElORSBjbXNVSW50MTZOdW1iZXIgRm9tTGFiVjRUb0xhYlYyKGNtc1VJbnQxNk51bWJlciB4KQotewotICAgIHJldHVybiAoY21zVUludDE2TnVtYmVyKSAoKCh4IDw8IDgpICsgMHg4MCkgLyAyNTcpOwotfQotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjbXNVSW50MzJOdW1iZXIgVHlwZTsKLSAgICBjbXNVSW50MzJOdW1iZXIgTWFzazsKLSAgICBjbXNGb3JtYXR0ZXIxNiAgRnJtOwotCi19IGNtc0Zvcm1hdHRlcnMxNjsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIGNtc1VJbnQzMk51bWJlciAgICBUeXBlOwotICAgIGNtc1VJbnQzMk51bWJlciAgICBNYXNrOwotICAgIGNtc0Zvcm1hdHRlckZsb2F0ICBGcm07Ci0KLX0gY21zRm9ybWF0dGVyc0Zsb2F0OwotCi0KLSNkZWZpbmUgQU5ZU1BBQ0UgICAgICAgIENPTE9SU1BBQ0VfU0goMzEpCi0jZGVmaW5lIEFOWUNIQU5ORUxTICAgICBDSEFOTkVMU19TSCgxNSkKLSNkZWZpbmUgQU5ZRVhUUkEgICAgICAgIEVYVFJBX1NIKDcpCi0jZGVmaW5lIEFOWVBMQU5BUiAgICAgICBQTEFOQVJfU0goMSkKLSNkZWZpbmUgQU5ZRU5ESUFOICAgICAgIEVORElBTjE2X1NIKDEpCi0jZGVmaW5lIEFOWVNXQVAgICAgICAgICBET1NXQVBfU0goMSkKLSNkZWZpbmUgQU5ZU1dBUEZJUlNUICAgIFNXQVBGSVJTVF9TSCgxKQotI2RlZmluZSBBTllGTEFWT1IgICAgICAgRkxBVk9SX1NIKDEpCi0KLQotLy8gU3VwcmVzcyB3YW5pbmcgYWJvdXQgaW5mbyBuZXZlciBiZWluZyB1c2VkCi0KLSNpZmRlZiBfTVNDX1ZFUgotI3ByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0MTAwKQotI2VuZGlmCi0KLS8vIFVucGFja2luZyByb3V0aW5lcyAoMTYgYml0cykgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLS8vIERvZXMgYWxtb3N0IGV2ZXJ5dGhpbmcgYnV0IGlzIHNsb3cKLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFVucm9sbENodW5reUJ5dGVzKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIGludCBuQ2hhbiAgICAgID0gVF9DSEFOTkVMUyhpbmZvIC0+IElucHV0Rm9ybWF0KTsKLSAgICBpbnQgRG9Td2FwICAgICA9IFRfRE9TV0FQKGluZm8gLT5JbnB1dEZvcm1hdCk7Ci0gICAgaW50IFJldmVyc2UgICAgPSBUX0ZMQVZPUihpbmZvIC0+SW5wdXRGb3JtYXQpOwotICAgIGludCBTd2FwRmlyc3QgID0gVF9TV0FQRklSU1QoaW5mbyAtPiBJbnB1dEZvcm1hdCk7Ci0gICAgaW50IEV4dHJhICAgICAgPSBUX0VYVFJBKGluZm8gLT4gSW5wdXRGb3JtYXQpOwotICAgIGludCBFeHRyYUZpcnN0ID0gRG9Td2FwIF4gU3dhcEZpcnN0OwotICAgIGNtc1VJbnQxNk51bWJlciB2OwotICAgIGludCBpOwotCi0gICAgaWYgKEV4dHJhRmlyc3QpIHsKLSAgICAgICAgYWNjdW0gKz0gRXh0cmE7Ci0gICAgfQotCi0gICAgZm9yIChpPTA7IGkgPCBuQ2hhbjsgaSsrKSB7Ci0gICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7Ci0KLSAgICAgICAgdiA9IEZST01fOF9UT18xNigqYWNjdW0pOwotICAgICAgICB2ID0gUmV2ZXJzZSA/IFJFVkVSU0VfRkxBVk9SXzE2KHYpIDogdjsKLSAgICAgICAgd0luW2luZGV4XSA9IHY7Ci0gICAgICAgIGFjY3VtKys7Ci0gICAgfQotCi0gICAgaWYgKCFFeHRyYUZpcnN0KSB7Ci0gICAgICAgIGFjY3VtICs9IEV4dHJhOwotICAgIH0KLQotICAgIGlmIChFeHRyYSA9PSAwICYmIFN3YXBGaXJzdCkgewotICAgICAgICBjbXNVSW50MTZOdW1iZXIgdG1wID0gd0luWzBdOwotCi0gICAgICAgIG1lbW1vdmUoJndJblswXSwgJndJblsxXSwgKG5DaGFuLTEpICogc2l6ZW9mKGNtc1VJbnQxNk51bWJlcikpOwotICAgICAgICB3SW5bbkNoYW4tMV0gPSB0bXA7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFjY3VtOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci0KLX0KLQotLy8gRXh0cmEgY2hhbm5lbHMgYXJlIGp1c3QgaWdub3JlZCBiZWNhdXNlIGNvbWUgaW4gdGhlIG5leHQgcGxhbmVzCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBVbnJvbGxQbGFuYXJCeXRlcyhyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3SW5bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICBpbnQgbkNoYW4gICAgID0gVF9DSEFOTkVMUyhpbmZvIC0+IElucHV0Rm9ybWF0KTsKLSAgICBpbnQgRG9Td2FwICAgID0gVF9ET1NXQVAoaW5mbyAtPklucHV0Rm9ybWF0KTsKLSAgICBpbnQgU3dhcEZpcnN0ID0gVF9TV0FQRklSU1QoaW5mbyAtPklucHV0Rm9ybWF0KTsKLSAgICBpbnQgUmV2ZXJzZSAgID0gVF9GTEFWT1IoaW5mbyAtPklucHV0Rm9ybWF0KTsKLSAgICBpbnQgaTsKLSAgICBjbXNVSW50OE51bWJlciogSW5pdCA9IGFjY3VtOwotCi0gICAgaWYgKERvU3dhcCBeIFN3YXBGaXJzdCkgewotICAgICAgICBhY2N1bSArPSBUX0VYVFJBKGluZm8gLT4gSW5wdXRGb3JtYXQpICogU3RyaWRlOwotICAgIH0KLQotICAgIGZvciAoaT0wOyBpIDwgbkNoYW47IGkrKykgewotCi0gICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7Ci0gICAgICAgIGNtc1VJbnQxNk51bWJlciB2ID0gRlJPTV84X1RPXzE2KCphY2N1bSk7Ci0KLSAgICAgICAgd0luW2luZGV4XSA9IFJldmVyc2UgPyBSRVZFUlNFX0ZMQVZPUl8xNih2KSA6IHY7Ci0gICAgICAgIGFjY3VtICs9IFN0cmlkZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKEluaXQgKyAxKTsKLX0KLQotLy8gU3BlY2lhbCBjYXNlcywgcHJvdmlkZWQgZm9yIHBlcmZvcm1hbmNlCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBVbnJvbGw0Qnl0ZXMocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgd0luWzBdID0gRlJPTV84X1RPXzE2KCphY2N1bSk7IGFjY3VtKys7IC8vIEMKLSAgICB3SW5bMV0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgLy8gTQotICAgIHdJblsyXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAvLyBZCi0gICAgd0luWzNdID0gRlJPTV84X1RPXzE2KCphY2N1bSk7IGFjY3VtKys7IC8vIEsKLQotICAgIHJldHVybiBhY2N1bTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBVbnJvbGw0Qnl0ZXNSZXZlcnNlKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIHdJblswXSA9IEZST01fOF9UT18xNihSRVZFUlNFX0ZMQVZPUl84KCphY2N1bSkpOyBhY2N1bSsrOyAvLyBDCi0gICAgd0luWzFdID0gRlJPTV84X1RPXzE2KFJFVkVSU0VfRkxBVk9SXzgoKmFjY3VtKSk7IGFjY3VtKys7IC8vIE0KLSAgICB3SW5bMl0gPSBGUk9NXzhfVE9fMTYoUkVWRVJTRV9GTEFWT1JfOCgqYWNjdW0pKTsgYWNjdW0rKzsgLy8gWQotICAgIHdJblszXSA9IEZST01fOF9UT18xNihSRVZFUlNFX0ZMQVZPUl84KCphY2N1bSkpOyBhY2N1bSsrOyAvLyBLCi0KLSAgICByZXR1cm4gYWNjdW07Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogVW5yb2xsNEJ5dGVzU3dhcEZpcnN0KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3SW5bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIGFjY3VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIHdJblszXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAvLyBLCi0gICAgd0luWzBdID0gRlJPTV84X1RPXzE2KCphY2N1bSk7IGFjY3VtKys7IC8vIEMKLSAgICB3SW5bMV0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgLy8gTQotICAgIHdJblsyXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAvLyBZCi0KLSAgICByZXR1cm4gYWNjdW07Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotLy8gS1lNQwotc3RhdGljCi1jbXNVSW50OE51bWJlciogVW5yb2xsNEJ5dGVzU3dhcChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIGFjY3VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICB3SW5bM10gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgIC8vIEsKLSAgICB3SW5bMl0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgIC8vIFkKLSAgICB3SW5bMV0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgIC8vIE0KLSAgICB3SW5bMF0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgIC8vIEMKLQotICAgIHJldHVybiBhY2N1bTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBVbnJvbGw0Qnl0ZXNTd2FwU3dhcEZpcnN0KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIHdJblsyXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAgLy8gSwotICAgIHdJblsxXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAgLy8gWQotICAgIHdJblswXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAgLy8gTQotICAgIHdJblszXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAgLy8gQwotCi0gICAgcmV0dXJuIGFjY3VtOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFVucm9sbDNCeXRlcyhyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICB3SW5bMF0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgICAgIC8vIFIKLSAgICB3SW5bMV0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgICAgIC8vIEcKLSAgICB3SW5bMl0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgICAgIC8vIEIKLQotICAgIHJldHVybiBhY2N1bTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBVbnJvbGwzQnl0ZXNTa2lwMVN3YXAocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgYWNjdW0rKzsgLy8gQQotICAgIHdJblsyXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAvLyBCCi0gICAgd0luWzFdID0gRlJPTV84X1RPXzE2KCphY2N1bSk7IGFjY3VtKys7IC8vIEcKLSAgICB3SW5bMF0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgLy8gUgotCi0gICAgcmV0dXJuIGFjY3VtOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFVucm9sbDNCeXRlc1NraXAxU3dhcFN3YXBGaXJzdChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIHdJblsyXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAvLyBCCi0gICAgd0luWzFdID0gRlJPTV84X1RPXzE2KCphY2N1bSk7IGFjY3VtKys7IC8vIEcKLSAgICB3SW5bMF0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgLy8gUgotICAgIGFjY3VtKys7IC8vIEEKLQotICAgIHJldHVybiBhY2N1bTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBVbnJvbGwzQnl0ZXNTa2lwMVN3YXBGaXJzdChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIGFjY3VtKys7IC8vIEEKLSAgICB3SW5bMF0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgLy8gUgotICAgIHdJblsxXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAvLyBHCi0gICAgd0luWzJdID0gRlJPTV84X1RPXzE2KCphY2N1bSk7IGFjY3VtKys7IC8vIEIKLQotICAgIHJldHVybiBhY2N1bTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi0KLS8vIEJSRwotc3RhdGljCi1jbXNVSW50OE51bWJlciogVW5yb2xsM0J5dGVzU3dhcChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIGFjY3VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICB3SW5bMl0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgICAgIC8vIEIKLSAgICB3SW5bMV0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgICAgIC8vIEcKLSAgICB3SW5bMF0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgICAgIC8vIFIKLQotICAgIHJldHVybiBhY2N1bTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBVbnJvbGxMYWJWMl84KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIHdJblswXSA9IEZvbUxhYlYyVG9MYWJWNChGUk9NXzhfVE9fMTYoKmFjY3VtKSk7IGFjY3VtKys7ICAgICAvLyBMCi0gICAgd0luWzFdID0gRm9tTGFiVjJUb0xhYlY0KEZST01fOF9UT18xNigqYWNjdW0pKTsgYWNjdW0rKzsgICAgIC8vIGEKLSAgICB3SW5bMl0gPSBGb21MYWJWMlRvTGFiVjQoRlJPTV84X1RPXzE2KCphY2N1bSkpOyBhY2N1bSsrOyAgICAgLy8gYgotCi0gICAgcmV0dXJuIGFjY3VtOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFVucm9sbEFMYWJWMl84KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIGFjY3VtKys7ICAvLyBBCi0gICAgd0luWzBdID0gRm9tTGFiVjJUb0xhYlY0KEZST01fOF9UT18xNigqYWNjdW0pKTsgYWNjdW0rKzsgICAgIC8vIEwKLSAgICB3SW5bMV0gPSBGb21MYWJWMlRvTGFiVjQoRlJPTV84X1RPXzE2KCphY2N1bSkpOyBhY2N1bSsrOyAgICAgLy8gYQotICAgIHdJblsyXSA9IEZvbUxhYlYyVG9MYWJWNChGUk9NXzhfVE9fMTYoKmFjY3VtKSk7IGFjY3VtKys7ICAgICAvLyBiCi0KLSAgICByZXR1cm4gYWNjdW07Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogVW5yb2xsTGFiVjJfMTYocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIGFjY3VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgd0luWzBdID0gRm9tTGFiVjJUb0xhYlY0KCooY21zVUludDE2TnVtYmVyKikgYWNjdW0pOyBhY2N1bSArPSAyOyAgICAgLy8gTAotICAgIHdJblsxXSA9IEZvbUxhYlYyVG9MYWJWNCgqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtKTsgYWNjdW0gKz0gMjsgICAgIC8vIGEKLSAgICB3SW5bMl0gPSBGb21MYWJWMlRvTGFiVjQoKihjbXNVSW50MTZOdW1iZXIqKSBhY2N1bSk7IGFjY3VtICs9IDI7ICAgICAvLyBiCi0KLSAgICByZXR1cm4gYWNjdW07Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotLy8gZm9yIGR1cGxleAotc3RhdGljCi1jbXNVSW50OE51bWJlciogVW5yb2xsMkJ5dGVzKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIHdJblswXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAgICAgLy8gY2gxCi0gICAgd0luWzFdID0gRlJPTV84X1RPXzE2KCphY2N1bSk7IGFjY3VtKys7ICAgICAvLyBjaDIKLQotICAgIHJldHVybiBhY2N1bTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi0KLQotCi0vLyBNb25vY2hyb21lIGR1cGxpY2F0ZXMgTCBpbnRvIFJHQiBmb3IgbnVsbC10cmFuc2Zvcm1zCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBVbnJvbGwxQnl0ZShyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3SW5bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICB3SW5bMF0gPSB3SW5bMV0gPSB3SW5bMl0gPSBGUk9NXzhfVE9fMTYoKmFjY3VtKTsgYWNjdW0rKzsgICAgIC8vIEwKLQotICAgIHJldHVybiBhY2N1bTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi0KLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFVucm9sbDFCeXRlU2tpcDEocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3SW5bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgd0luWzBdID0gd0luWzFdID0gd0luWzJdID0gRlJPTV84X1RPXzE2KCphY2N1bSk7IGFjY3VtKys7ICAgICAvLyBMCi0gICAgYWNjdW0gKz0gMTsKLQotICAgIHJldHVybiBhY2N1bTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBVbnJvbGwxQnl0ZVNraXAyKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIHdJblswXSA9IHdJblsxXSA9IHdJblsyXSA9IEZST01fOF9UT18xNigqYWNjdW0pOyBhY2N1bSsrOyAgICAgLy8gTAotICAgIGFjY3VtICs9IDI7Ci0KLSAgICByZXR1cm4gYWNjdW07Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogVW5yb2xsMUJ5dGVSZXZlcnNlZChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIGFjY3VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICB3SW5bMF0gPSB3SW5bMV0gPSB3SW5bMl0gPSBSRVZFUlNFX0ZMQVZPUl8xNihGUk9NXzhfVE9fMTYoKmFjY3VtKSk7IGFjY3VtKys7ICAgICAvLyBMCi0KLSAgICByZXR1cm4gYWNjdW07Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBVbnJvbGxBbnlXb3JkcyhyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3SW5bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICBpbnQgbkNoYW4gICAgICAgPSBUX0NIQU5ORUxTKGluZm8gLT4gSW5wdXRGb3JtYXQpOwotICAgIGludCBTd2FwRW5kaWFuICA9IFRfRU5ESUFOMTYoaW5mbyAtPiBJbnB1dEZvcm1hdCk7Ci0gICAgaW50IERvU3dhcCAgICAgID0gVF9ET1NXQVAoaW5mbyAtPklucHV0Rm9ybWF0KTsKLSAgICBpbnQgUmV2ZXJzZSAgICAgPSBUX0ZMQVZPUihpbmZvIC0+SW5wdXRGb3JtYXQpOwotICAgIGludCBTd2FwRmlyc3QgICA9IFRfU1dBUEZJUlNUKGluZm8gLT4gSW5wdXRGb3JtYXQpOwotICAgIGludCBFeHRyYSAgICAgICA9IFRfRVhUUkEoaW5mbyAtPiBJbnB1dEZvcm1hdCk7Ci0gICAgaW50IEV4dHJhRmlyc3QgID0gRG9Td2FwIF4gU3dhcEZpcnN0OwotICAgIGludCBpOwotCi0gICAgaWYgKEV4dHJhRmlyc3QpIHsKLSAgICAgICAgYWNjdW0gKz0gRXh0cmEgKiBzaXplb2YoY21zVUludDE2TnVtYmVyKTsKLSAgICB9Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG5DaGFuOyBpKyspIHsKLQotICAgICAgICBpbnQgaW5kZXggPSBEb1N3YXAgPyAobkNoYW4gLSBpIC0gMSkgOiBpOwotICAgICAgICBjbXNVSW50MTZOdW1iZXIgdiA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07Ci0KLSAgICAgICAgaWYgKFN3YXBFbmRpYW4pCi0gICAgICAgICAgICB2ID0gQ0hBTkdFX0VORElBTih2KTsKLQotICAgICAgICB3SW5baW5kZXhdID0gUmV2ZXJzZSA/IFJFVkVSU0VfRkxBVk9SXzE2KHYpIDogdjsKLQotICAgICAgICBhY2N1bSArPSBzaXplb2YoY21zVUludDE2TnVtYmVyKTsKLSAgICB9Ci0KLSAgICBpZiAoIUV4dHJhRmlyc3QpIHsKLSAgICAgICAgYWNjdW0gKz0gRXh0cmEgKiBzaXplb2YoY21zVUludDE2TnVtYmVyKTsKLSAgICB9Ci0KLSAgICBpZiAoRXh0cmEgPT0gMCAmJiBTd2FwRmlyc3QpIHsKLQotICAgICAgICBjbXNVSW50MTZOdW1iZXIgdG1wID0gd0luWzBdOwotCi0gICAgICAgIG1lbW1vdmUoJndJblswXSwgJndJblsxXSwgKG5DaGFuLTEpICogc2l6ZW9mKGNtc1VJbnQxNk51bWJlcikpOwotICAgICAgICB3SW5bbkNoYW4tMV0gPSB0bXA7Ci0gICAgfQotCi0gICAgcmV0dXJuIGFjY3VtOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBVbnJvbGxQbGFuYXJXb3JkcyhyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3SW5bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICBpbnQgbkNoYW4gPSBUX0NIQU5ORUxTKGluZm8gLT4gSW5wdXRGb3JtYXQpOwotICAgIGludCBEb1N3YXA9IFRfRE9TV0FQKGluZm8gLT5JbnB1dEZvcm1hdCk7Ci0gICAgaW50IFJldmVyc2U9IFRfRkxBVk9SKGluZm8gLT5JbnB1dEZvcm1hdCk7Ci0gICAgaW50IFN3YXBFbmRpYW4gPSBUX0VORElBTjE2KGluZm8gLT4gSW5wdXRGb3JtYXQpOwotICAgIGludCBpOwotICAgIGNtc1VJbnQ4TnVtYmVyKiBJbml0ID0gYWNjdW07Ci0KLSAgICBpZiAoRG9Td2FwKSB7Ci0gICAgICAgIGFjY3VtICs9IFRfRVhUUkEoaW5mbyAtPiBJbnB1dEZvcm1hdCkgKiBTdHJpZGUgKiBzaXplb2YoY21zVUludDE2TnVtYmVyKTsKLSAgICB9Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG5DaGFuOyBpKyspIHsKLQotICAgICAgICBpbnQgaW5kZXggPSBEb1N3YXAgPyAobkNoYW4gLSBpIC0gMSkgOiBpOwotICAgICAgICBjbXNVSW50MTZOdW1iZXIgdiA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07Ci0KLSAgICAgICAgaWYgKFN3YXBFbmRpYW4pCi0gICAgICAgICAgICB2ID0gQ0hBTkdFX0VORElBTih2KTsKLQotICAgICAgICB3SW5baW5kZXhdID0gUmV2ZXJzZSA/IFJFVkVSU0VfRkxBVk9SXzE2KHYpIDogdjsKLQotICAgICAgICBhY2N1bSArPSAgU3RyaWRlICogc2l6ZW9mKGNtc1VJbnQxNk51bWJlcik7Ci0gICAgfQotCi0gICAgcmV0dXJuIChJbml0ICsgc2l6ZW9mKGNtc1VJbnQxNk51bWJlcikpOwotfQotCi0KLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFVucm9sbDRXb3JkcyhyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICB3SW5bMF0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7IC8vIEMKLSAgICB3SW5bMV0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7IC8vIE0KLSAgICB3SW5bMl0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7IC8vIFkKLSAgICB3SW5bM10gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7IC8vIEsKLQotICAgIHJldHVybiBhY2N1bTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBVbnJvbGw0V29yZHNSZXZlcnNlKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIHdJblswXSA9IFJFVkVSU0VfRkxBVk9SXzE2KCooY21zVUludDE2TnVtYmVyKikgYWNjdW0pOyBhY2N1bSs9IDI7IC8vIEMKLSAgICB3SW5bMV0gPSBSRVZFUlNFX0ZMQVZPUl8xNigqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtKTsgYWNjdW0rPSAyOyAvLyBNCi0gICAgd0luWzJdID0gUkVWRVJTRV9GTEFWT1JfMTYoKihjbXNVSW50MTZOdW1iZXIqKSBhY2N1bSk7IGFjY3VtKz0gMjsgLy8gWQotICAgIHdJblszXSA9IFJFVkVSU0VfRkxBVk9SXzE2KCooY21zVUludDE2TnVtYmVyKikgYWNjdW0pOyBhY2N1bSs9IDI7IC8vIEsKLQotICAgIHJldHVybiBhY2N1bTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBVbnJvbGw0V29yZHNTd2FwRmlyc3QocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgd0luWzNdID0gKihjbXNVSW50MTZOdW1iZXIqKSBhY2N1bTsgYWNjdW0rPSAyOyAvLyBLCi0gICAgd0luWzBdID0gKihjbXNVSW50MTZOdW1iZXIqKSBhY2N1bTsgYWNjdW0rPSAyOyAvLyBDCi0gICAgd0luWzFdID0gKihjbXNVSW50MTZOdW1iZXIqKSBhY2N1bTsgYWNjdW0rPSAyOyAvLyBNCi0gICAgd0luWzJdID0gKihjbXNVSW50MTZOdW1iZXIqKSBhY2N1bTsgYWNjdW0rPSAyOyAvLyBZCi0KLSAgICByZXR1cm4gYWNjdW07Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotLy8gS1lNQwotc3RhdGljCi1jbXNVSW50OE51bWJlciogVW5yb2xsNFdvcmRzU3dhcChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIGFjY3VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICB3SW5bM10gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7IC8vIEsKLSAgICB3SW5bMl0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7IC8vIFkKLSAgICB3SW5bMV0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7IC8vIE0KLSAgICB3SW5bMF0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7IC8vIEMKLQotICAgIHJldHVybiBhY2N1bTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBVbnJvbGw0V29yZHNTd2FwU3dhcEZpcnN0KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIHdJblsyXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtKz0gMjsgLy8gSwotICAgIHdJblsxXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtKz0gMjsgLy8gWQotICAgIHdJblswXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtKz0gMjsgLy8gTQotICAgIHdJblszXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtKz0gMjsgLy8gQwotCi0gICAgcmV0dXJuIGFjY3VtOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFVucm9sbDNXb3JkcyhyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICB3SW5bMF0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7ICAvLyBDIFIKLSAgICB3SW5bMV0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7ICAvLyBNIEcKLSAgICB3SW5bMl0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSs9IDI7ICAvLyBZIEIKLQotICAgIHJldHVybiBhY2N1bTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBVbnJvbGwzV29yZHNTd2FwKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIHdJblsyXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtKz0gMjsgIC8vIEMgUgotICAgIHdJblsxXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtKz0gMjsgIC8vIE0gRwotICAgIHdJblswXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtKz0gMjsgIC8vIFkgQgotCi0gICAgcmV0dXJuIGFjY3VtOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFVucm9sbDNXb3Jkc1NraXAxU3dhcChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICBhY2N1bSArPSAyOyAvLyBBCi0gICAgd0luWzJdID0gKihjbXNVSW50MTZOdW1iZXIqKSBhY2N1bTsgYWNjdW0gKz0gMjsgLy8gUgotICAgIHdJblsxXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtICs9IDI7IC8vIEcKLSAgICB3SW5bMF0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSArPSAyOyAvLyBCCi0KLSAgICByZXR1cm4gYWNjdW07Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogVW5yb2xsM1dvcmRzU2tpcDFTd2FwRmlyc3QocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIGFjY3VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgYWNjdW0gKz0gMjsgLy8gQQotICAgIHdJblswXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtICs9IDI7IC8vIFIKLSAgICB3SW5bMV0gPSAqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtOyBhY2N1bSArPSAyOyAvLyBHCi0gICAgd0luWzJdID0gKihjbXNVSW50MTZOdW1iZXIqKSBhY2N1bTsgYWNjdW0gKz0gMjsgLy8gQgotCi0gICAgcmV0dXJuIGFjY3VtOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFVucm9sbDFXb3JkKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIHdJblswXSA9IHdJblsxXSA9IHdJblsyXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtKz0gMjsgICAvLyBMCi0KLSAgICByZXR1cm4gYWNjdW07Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogVW5yb2xsMVdvcmRSZXZlcnNlZChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIGFjY3VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICB3SW5bMF0gPSB3SW5bMV0gPSB3SW5bMl0gPSBSRVZFUlNFX0ZMQVZPUl8xNigqKGNtc1VJbnQxNk51bWJlciopIGFjY3VtKTsgYWNjdW0rPSAyOwotCi0gICAgcmV0dXJuIGFjY3VtOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFVucm9sbDFXb3JkU2tpcDMocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3SW5bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgd0luWzBdID0gd0luWzFdID0gd0luWzJdID0gKihjbXNVSW50MTZOdW1iZXIqKSBhY2N1bTsKLQotICAgIGFjY3VtICs9IDg7Ci0KLSAgICByZXR1cm4gYWNjdW07Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogVW5yb2xsMldvcmRzKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIHdJblswXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtICs9IDI7ICAgIC8vIGNoMQotICAgIHdJblsxXSA9ICooY21zVUludDE2TnVtYmVyKikgYWNjdW07IGFjY3VtICs9IDI7ICAgIC8vIGNoMgotCi0gICAgcmV0dXJuIGFjY3VtOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLQotLy8gVGhpcyBpcyBhIGNvbnZlcnNpb24gb2YgTGFiIGRvdWJsZSB0byAxNiBiaXRzCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBVbnJvbGxMYWJEb3VibGVUbzE2KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgIFN0cmlkZSkKLXsKLSAgICBpZiAoVF9QTEFOQVIoaW5mbyAtPiBJbnB1dEZvcm1hdCkpIHsKLQotICAgICAgICBjbXNGbG9hdDY0TnVtYmVyKiBQdCA9IChjbXNGbG9hdDY0TnVtYmVyKikgYWNjdW07Ci0KLSAgICAgICAgY21zQ0lFTGFiIExhYjsKLQotICAgICAgICBMYWIuTCA9IFB0WzBdOwotICAgICAgICBMYWIuYSA9IFB0W1N0cmlkZV07Ci0gICAgICAgIExhYi5iID0gUHRbU3RyaWRlKjJdOwotCi0gICAgICAgIGNtc0Zsb2F0MkxhYkVuY29kZWQod0luLCAmTGFiKTsKLSAgICAgICAgcmV0dXJuIGFjY3VtICsgc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpOwotICAgIH0KLSAgICBlbHNlIHsKLQotICAgICAgICBjbXNGbG9hdDJMYWJFbmNvZGVkKHdJbiwgKGNtc0NJRUxhYiopIGFjY3VtKTsKLSAgICAgICAgYWNjdW0gKz0gc2l6ZW9mKGNtc0NJRUxhYikgKyBUX0VYVFJBKGluZm8gLT5JbnB1dEZvcm1hdCkgKiBzaXplb2YoY21zRmxvYXQ2NE51bWJlcik7Ci0gICAgICAgIHJldHVybiBhY2N1bTsKLSAgICB9Ci19Ci0KLQotLy8gVGhpcyBpcyBhIGNvbnZlcnNpb24gb2YgTGFiIGZsb2F0IHRvIDE2IGJpdHMKLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFVucm9sbExhYkZsb2F0VG8xNihyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIGFjY3VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyICBTdHJpZGUpCi17Ci0gICAgY21zQ0lFTGFiIExhYjsKLSAgICAKLSAgICBpZiAoVF9QTEFOQVIoaW5mbyAtPiBJbnB1dEZvcm1hdCkpIHsKLQotICAgICAgICBjbXNGbG9hdDMyTnVtYmVyKiBQdCA9IChjbXNGbG9hdDMyTnVtYmVyKikgYWNjdW07Ci0KLSAgICAgCi0gICAgICAgIExhYi5MID0gUHRbMF07Ci0gICAgICAgIExhYi5hID0gUHRbU3RyaWRlXTsKLSAgICAgICAgTGFiLmIgPSBQdFtTdHJpZGUqMl07Ci0KLSAgICAgICAgY21zRmxvYXQyTGFiRW5jb2RlZCh3SW4sICZMYWIpOwotICAgICAgICByZXR1cm4gYWNjdW0gKyBzaXplb2YoY21zRmxvYXQzMk51bWJlcik7Ci0gICAgfQotICAgIGVsc2UgewotIAotICAgICAgICBMYWIuTCA9ICgoY21zRmxvYXQzMk51bWJlciopIGFjY3VtKVswXTsKLSAgICAgICAgTGFiLmEgPSAoKGNtc0Zsb2F0MzJOdW1iZXIqKSBhY2N1bSlbMV07Ci0gICAgICAgIExhYi5iID0gKChjbXNGbG9hdDMyTnVtYmVyKikgYWNjdW0pWzJdOwotCi0gICAgICAgIGNtc0Zsb2F0MkxhYkVuY29kZWQod0luLCAmTGFiKTsKLSAgICAgICAgYWNjdW0gKz0gKDMgKyBUX0VYVFJBKGluZm8gLT5JbnB1dEZvcm1hdCkpICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpOwotICAgICAgICByZXR1cm4gYWNjdW07Ci0gICAgfQotfQotCi0vLyBUaGlzIGlzIGEgY29udmVyc2lvbiBvZiBYWVogZG91YmxlIHRvIDE2IGJpdHMKLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFVucm9sbFhZWkRvdWJsZVRvMTYocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3SW5bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgaWYgKFRfUExBTkFSKGluZm8gLT4gSW5wdXRGb3JtYXQpKSB7Ci0KLSAgICAgICAgY21zRmxvYXQ2NE51bWJlciogUHQgPSAoY21zRmxvYXQ2NE51bWJlciopIGFjY3VtOwotICAgICAgICBjbXNDSUVYWVogWFlaOwotCi0gICAgICAgIFhZWi5YID0gUHRbMF07Ci0gICAgICAgIFhZWi5ZID0gUHRbU3RyaWRlXTsKLSAgICAgICAgWFlaLlogPSBQdFtTdHJpZGUqMl07Ci0gICAgICAgIGNtc0Zsb2F0MlhZWkVuY29kZWQod0luLCAmWFlaKTsKLQotICAgICAgICByZXR1cm4gYWNjdW0gKyBzaXplb2YoY21zRmxvYXQ2NE51bWJlcik7Ci0KLSAgICB9Ci0KLSAgICBlbHNlIHsKLSAgICAgICAgY21zRmxvYXQyWFlaRW5jb2RlZCh3SW4sIChjbXNDSUVYWVoqKSBhY2N1bSk7Ci0gICAgICAgIGFjY3VtICs9IHNpemVvZihjbXNDSUVYWVopICsgVF9FWFRSQShpbmZvIC0+SW5wdXRGb3JtYXQpICogc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpOwotCi0gICAgICAgIHJldHVybiBhY2N1bTsKLSAgICB9Ci19Ci0KLS8vIFRoaXMgaXMgYSBjb252ZXJzaW9uIG9mIFhZWiBmbG9hdCB0byAxNiBiaXRzCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBVbnJvbGxYWVpGbG9hdFRvMTYocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgaWYgKFRfUExBTkFSKGluZm8gLT4gSW5wdXRGb3JtYXQpKSB7Ci0KLSAgICAgICAgY21zRmxvYXQzMk51bWJlciogUHQgPSAoY21zRmxvYXQzMk51bWJlciopIGFjY3VtOwotICAgICAgICBjbXNDSUVYWVogWFlaOwotCi0gICAgICAgIFhZWi5YID0gUHRbMF07Ci0gICAgICAgIFhZWi5ZID0gUHRbU3RyaWRlXTsKLSAgICAgICAgWFlaLlogPSBQdFtTdHJpZGUqMl07Ci0gICAgICAgIGNtc0Zsb2F0MlhZWkVuY29kZWQod0luLCAmWFlaKTsKLQotICAgICAgICByZXR1cm4gYWNjdW0gKyBzaXplb2YoY21zRmxvYXQzMk51bWJlcik7Ci0KLSAgICB9Ci0KLSAgICBlbHNlIHsKLSAgICAgICAgY21zRmxvYXQzMk51bWJlciogUHQgPSAoY21zRmxvYXQzMk51bWJlciopIGFjY3VtOwotICAgICAgICBjbXNDSUVYWVogWFlaOwotCi0gICAgICAgIFhZWi5YID0gUHRbMF07Ci0gICAgICAgIFhZWi5ZID0gUHRbMV07Ci0gICAgICAgIFhZWi5aID0gUHRbMl07Ci0gICAgICAgIGNtc0Zsb2F0MlhZWkVuY29kZWQod0luLCAmWFlaKTsKLQotICAgICAgICBhY2N1bSArPSAzICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpICsgVF9FWFRSQShpbmZvIC0+SW5wdXRGb3JtYXQpICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpOwotCi0gICAgICAgIHJldHVybiBhY2N1bTsKLSAgICB9Ci19Ci0KLS8vIENoZWNrIGlmIHNwYWNlIGlzIG1hcmtlZCBhcyBpbmsKLWNtc0lOTElORSBjbXNCb29sIElzSW5rU3BhY2UoY21zVUludDMyTnVtYmVyIFR5cGUpCi17Ci0gICAgc3dpdGNoIChUX0NPTE9SU1BBQ0UoVHlwZSkpIHsKLQotICAgICBjYXNlIFBUX0NNWToKLSAgICAgY2FzZSBQVF9DTVlLOgotICAgICBjYXNlIFBUX01DSDU6Ci0gICAgIGNhc2UgUFRfTUNINjoKLSAgICAgY2FzZSBQVF9NQ0g3OgotICAgICBjYXNlIFBUX01DSDg6Ci0gICAgIGNhc2UgUFRfTUNIOToKLSAgICAgY2FzZSBQVF9NQ0gxMDoKLSAgICAgY2FzZSBQVF9NQ0gxMToKLSAgICAgY2FzZSBQVF9NQ0gxMjoKLSAgICAgY2FzZSBQVF9NQ0gxMzoKLSAgICAgY2FzZSBQVF9NQ0gxNDoKLSAgICAgY2FzZSBQVF9NQ0gxNTogcmV0dXJuIFRSVUU7Ci0KLSAgICAgZGVmYXVsdDogcmV0dXJuIEZBTFNFOwotICAgIH0KLX0KLQotLy8gSW5rcyBkb2VzIGNvbWUgaW4gcGVyY2VudGFnZSwgcmVtYWluaW5nIGNhc2VzIGFyZSBiZXR3ZWVuIDAuLjEuMCwgYWdhaW4gdG8gMTYgYml0cwotc3RhdGljCi1jbXNVSW50OE51bWJlciogVW5yb2xsRG91YmxlVG8xNihyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd0luW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLQotICAgIGludCBuQ2hhbiAgICAgID0gVF9DSEFOTkVMUyhpbmZvIC0+IElucHV0Rm9ybWF0KTsKLSAgICBpbnQgRG9Td2FwICAgICA9IFRfRE9TV0FQKGluZm8gLT5JbnB1dEZvcm1hdCk7Ci0gICAgaW50IFJldmVyc2UgICAgPSBUX0ZMQVZPUihpbmZvIC0+SW5wdXRGb3JtYXQpOwotICAgIGludCBTd2FwRmlyc3QgID0gVF9TV0FQRklSU1QoaW5mbyAtPiBJbnB1dEZvcm1hdCk7Ci0gICAgaW50IEV4dHJhICAgICAgPSBUX0VYVFJBKGluZm8gLT4gSW5wdXRGb3JtYXQpOwotICAgIGludCBFeHRyYUZpcnN0ID0gRG9Td2FwIF4gU3dhcEZpcnN0OwotICAgIGludCBQbGFuYXIgICAgID0gVF9QTEFOQVIoaW5mbyAtPiBJbnB1dEZvcm1hdCk7Ci0gICAgY21zRmxvYXQ2NE51bWJlciB2OwotICAgIGNtc1VJbnQxNk51bWJlciAgdmk7Ci0gICAgaW50IGksIHN0YXJ0ID0gMDsKLSAgIGNtc0Zsb2F0NjROdW1iZXIgbWF4aW11bSA9IElzSW5rU3BhY2UoaW5mbyAtPklucHV0Rm9ybWF0KSA/IDY1NS4zNSA6IDY1NTM1LjA7Ci0KLQotICAgIGlmIChFeHRyYUZpcnN0KQotICAgICAgICAgICAgc3RhcnQgPSBFeHRyYTsKLQotICAgIGZvciAoaT0wOyBpIDwgbkNoYW47IGkrKykgewotCi0gICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7Ci0KLSAgICAgICAgaWYgKFBsYW5hcikKLSAgICAgICAgICAgIHYgPSAoY21zRmxvYXQzMk51bWJlcikgKChjbXNGbG9hdDY0TnVtYmVyKikgYWNjdW0pWyhpICsgc3RhcnQpICogU3RyaWRlXTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdiA9IChjbXNGbG9hdDMyTnVtYmVyKSAoKGNtc0Zsb2F0NjROdW1iZXIqKSBhY2N1bSlbaSArIHN0YXJ0XTsKLQotICAgICAgICB2aSA9IF9jbXNRdWlja1NhdHVyYXRlV29yZCh2ICogbWF4aW11bSk7Ci0KLSAgICAgICAgaWYgKFJldmVyc2UpCi0gICAgICAgICAgICB2aSA9IFJFVkVSU0VfRkxBVk9SXzE2KHZpKTsKLQotICAgICAgICB3SW5baW5kZXhdID0gdmk7Ci0gICAgfQotCi0KLSAgICBpZiAoRXh0cmEgPT0gMCAmJiBTd2FwRmlyc3QpIHsKLSAgICAgICAgY21zVUludDE2TnVtYmVyIHRtcCA9IHdJblswXTsKLQotICAgICAgICBtZW1tb3ZlKCZ3SW5bMF0sICZ3SW5bMV0sIChuQ2hhbi0xKSAqIHNpemVvZihjbXNVSW50MTZOdW1iZXIpKTsKLSAgICAgICAgd0luW25DaGFuLTFdID0gdG1wOwotICAgIH0KLQotICAgIGlmIChUX1BMQU5BUihpbmZvIC0+IElucHV0Rm9ybWF0KSkKLSAgICAgICAgcmV0dXJuIGFjY3VtICsgc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGFjY3VtICsgKG5DaGFuICsgRXh0cmEpICogc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpOwotfQotCi0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogVW5yb2xsRmxvYXRUbzE2KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3SW5bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIGFjY3VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotCi0gICAgaW50IG5DaGFuICAgICAgPSBUX0NIQU5ORUxTKGluZm8gLT4gSW5wdXRGb3JtYXQpOwotICAgIGludCBEb1N3YXAgICAgID0gVF9ET1NXQVAoaW5mbyAtPklucHV0Rm9ybWF0KTsKLSAgICBpbnQgUmV2ZXJzZSAgICA9IFRfRkxBVk9SKGluZm8gLT5JbnB1dEZvcm1hdCk7Ci0gICAgaW50IFN3YXBGaXJzdCAgPSBUX1NXQVBGSVJTVChpbmZvIC0+IElucHV0Rm9ybWF0KTsKLSAgICBpbnQgRXh0cmEgICAgICA9IFRfRVhUUkEoaW5mbyAtPiBJbnB1dEZvcm1hdCk7Ci0gICAgaW50IEV4dHJhRmlyc3QgPSBEb1N3YXAgXiBTd2FwRmlyc3Q7Ci0gICAgaW50IFBsYW5hciAgICAgPSBUX1BMQU5BUihpbmZvIC0+IElucHV0Rm9ybWF0KTsKLSAgICBjbXNGbG9hdDMyTnVtYmVyIHY7Ci0gICAgY21zVUludDE2TnVtYmVyICB2aTsKLSAgICBpbnQgaSwgc3RhcnQgPSAwOwotICAgY21zRmxvYXQ2NE51bWJlciBtYXhpbXVtID0gSXNJbmtTcGFjZShpbmZvIC0+SW5wdXRGb3JtYXQpID8gNjU1LjM1IDogNjU1MzUuMDsKLQotCi0gICAgaWYgKEV4dHJhRmlyc3QpCi0gICAgICAgICAgICBzdGFydCA9IEV4dHJhOwotCi0gICAgZm9yIChpPTA7IGkgPCBuQ2hhbjsgaSsrKSB7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gRG9Td2FwID8gKG5DaGFuIC0gaSAtIDEpIDogaTsKLQotICAgICAgICBpZiAoUGxhbmFyKQotICAgICAgICAgICAgdiA9IChjbXNGbG9hdDMyTnVtYmVyKSAoKGNtc0Zsb2F0MzJOdW1iZXIqKSBhY2N1bSlbKGkgKyBzdGFydCkgKiBTdHJpZGVdOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2ID0gKGNtc0Zsb2F0MzJOdW1iZXIpICgoY21zRmxvYXQzMk51bWJlciopIGFjY3VtKVtpICsgc3RhcnRdOwotCi0gICAgICAgIHZpID0gX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKHYgKiBtYXhpbXVtKTsKLQotICAgICAgICBpZiAoUmV2ZXJzZSkKLSAgICAgICAgICAgIHZpID0gUkVWRVJTRV9GTEFWT1JfMTYodmkpOwotCi0gICAgICAgIHdJbltpbmRleF0gPSB2aTsKLSAgICB9Ci0KLQotICAgIGlmIChFeHRyYSA9PSAwICYmIFN3YXBGaXJzdCkgewotICAgICAgICBjbXNVSW50MTZOdW1iZXIgdG1wID0gd0luWzBdOwotCi0gICAgICAgIG1lbW1vdmUoJndJblswXSwgJndJblsxXSwgKG5DaGFuLTEpICogc2l6ZW9mKGNtc1VJbnQxNk51bWJlcikpOwotICAgICAgICB3SW5bbkNoYW4tMV0gPSB0bXA7Ci0gICAgfQotCi0gICAgaWYgKFRfUExBTkFSKGluZm8gLT4gSW5wdXRGb3JtYXQpKQotICAgICAgICByZXR1cm4gYWNjdW0gKyBzaXplb2YoY21zRmxvYXQzMk51bWJlcik7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gYWNjdW0gKyAobkNoYW4gKyBFeHRyYSkgKiBzaXplb2YoY21zRmxvYXQzMk51bWJlcik7Ci19Ci0KLQotCi0KLS8vIEZvciAxIGNoYW5uZWwsIHdlIG5lZWQgdG8gZHVwbGljYXRlIGRhdGEgKGl0IGNvbWVzIGluIDAuLjEuMCByYW5nZSkKLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFVucm9sbERvdWJsZTFDaGFuKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIGNtc0Zsb2F0NjROdW1iZXIqIElua3MgPSAoY21zRmxvYXQ2NE51bWJlciopIGFjY3VtOwotCi0gICAgd0luWzBdID0gd0luWzFdID0gd0luWzJdID0gX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKElua3NbMF0gKiA2NTUzNS4wKTsKLQotICAgIHJldHVybiBhY2N1bSArIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRm9yIGFueXRoaW5nIGdvaW5nIGZyb20gY21zRmxvYXQzMk51bWJlcgotc3RhdGljCi1jbXNVSW50OE51bWJlciogVW5yb2xsRmxvYXRzVG9GbG9hdChfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciB3SW5bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0KLSAgICBpbnQgbkNoYW4gICAgICA9IFRfQ0hBTk5FTFMoaW5mbyAtPiBJbnB1dEZvcm1hdCk7Ci0gICAgaW50IERvU3dhcCAgICAgPSBUX0RPU1dBUChpbmZvIC0+SW5wdXRGb3JtYXQpOwotICAgIGludCBSZXZlcnNlICAgID0gVF9GTEFWT1IoaW5mbyAtPklucHV0Rm9ybWF0KTsKLSAgICBpbnQgU3dhcEZpcnN0ICA9IFRfU1dBUEZJUlNUKGluZm8gLT4gSW5wdXRGb3JtYXQpOwotICAgIGludCBFeHRyYSAgICAgID0gVF9FWFRSQShpbmZvIC0+IElucHV0Rm9ybWF0KTsKLSAgICBpbnQgRXh0cmFGaXJzdCA9IERvU3dhcCBeIFN3YXBGaXJzdDsKLSAgICBpbnQgUGxhbmFyICAgICA9IFRfUExBTkFSKGluZm8gLT4gSW5wdXRGb3JtYXQpOwotICAgIGNtc0Zsb2F0MzJOdW1iZXIgdjsKLSAgICBpbnQgaSwgc3RhcnQgPSAwOwotICAgIGNtc0Zsb2F0MzJOdW1iZXIgbWF4aW11bSA9IElzSW5rU3BhY2UoaW5mbyAtPklucHV0Rm9ybWF0KSA/IDEwMC4wRiA6IDEuMEY7Ci0KLQotICAgIGlmIChFeHRyYUZpcnN0KQotICAgICAgICAgICAgc3RhcnQgPSBFeHRyYTsKLQotICAgIGZvciAoaT0wOyBpIDwgbkNoYW47IGkrKykgewotCi0gICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7Ci0KLSAgICAgICAgaWYgKFBsYW5hcikKLSAgICAgICAgICAgIHYgPSAoY21zRmxvYXQzMk51bWJlcikgKChjbXNGbG9hdDMyTnVtYmVyKikgYWNjdW0pWyhpICsgc3RhcnQpICogU3RyaWRlXTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdiA9IChjbXNGbG9hdDMyTnVtYmVyKSAoKGNtc0Zsb2F0MzJOdW1iZXIqKSBhY2N1bSlbaSArIHN0YXJ0XTsKLQotICAgICAgICB2IC89IG1heGltdW07Ci0KLSAgICAgICAgd0luW2luZGV4XSA9IFJldmVyc2UgPyAxIC0gdiA6IHY7Ci0gICAgfQotCi0KLSAgICBpZiAoRXh0cmEgPT0gMCAmJiBTd2FwRmlyc3QpIHsKLSAgICAgICAgY21zRmxvYXQzMk51bWJlciB0bXAgPSB3SW5bMF07Ci0KLSAgICAgICAgbWVtbW92ZSgmd0luWzBdLCAmd0luWzFdLCAobkNoYW4tMSkgKiBzaXplb2YoY21zRmxvYXQzMk51bWJlcikpOwotICAgICAgICB3SW5bbkNoYW4tMV0gPSB0bXA7Ci0gICAgfQotCi0gICAgaWYgKFRfUExBTkFSKGluZm8gLT4gSW5wdXRGb3JtYXQpKQotICAgICAgICByZXR1cm4gYWNjdW0gKyBzaXplb2YoY21zRmxvYXQzMk51bWJlcik7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gYWNjdW0gKyAobkNoYW4gKyBFeHRyYSkgKiBzaXplb2YoY21zRmxvYXQzMk51bWJlcik7Ci19Ci0KLS8vIEZvciBhbnl0aGluZyBnb2luZyBmcm9tIGRvdWJsZQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBVbnJvbGxEb3VibGVzVG9GbG9hdChfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciB3SW5bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0KLSAgICBpbnQgbkNoYW4gICAgICA9IFRfQ0hBTk5FTFMoaW5mbyAtPiBJbnB1dEZvcm1hdCk7Ci0gICAgaW50IERvU3dhcCAgICAgPSBUX0RPU1dBUChpbmZvIC0+SW5wdXRGb3JtYXQpOwotICAgIGludCBSZXZlcnNlICAgID0gVF9GTEFWT1IoaW5mbyAtPklucHV0Rm9ybWF0KTsKLSAgICBpbnQgU3dhcEZpcnN0ICA9IFRfU1dBUEZJUlNUKGluZm8gLT4gSW5wdXRGb3JtYXQpOwotICAgIGludCBFeHRyYSAgICAgID0gVF9FWFRSQShpbmZvIC0+IElucHV0Rm9ybWF0KTsKLSAgICBpbnQgRXh0cmFGaXJzdCA9IERvU3dhcCBeIFN3YXBGaXJzdDsKLSAgICBpbnQgUGxhbmFyICAgICA9IFRfUExBTkFSKGluZm8gLT4gSW5wdXRGb3JtYXQpOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgdjsKLSAgICBpbnQgaSwgc3RhcnQgPSAwOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgbWF4aW11bSA9IElzSW5rU3BhY2UoaW5mbyAtPklucHV0Rm9ybWF0KSA/IDEwMC4wIDogMS4wOwotCi0KLSAgICBpZiAoRXh0cmFGaXJzdCkKLSAgICAgICAgICAgIHN0YXJ0ID0gRXh0cmE7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG5DaGFuOyBpKyspIHsKLQotICAgICAgICBpbnQgaW5kZXggPSBEb1N3YXAgPyAobkNoYW4gLSBpIC0gMSkgOiBpOwotCi0gICAgICAgIGlmIChQbGFuYXIpCi0gICAgICAgICAgICB2ID0gKGNtc0Zsb2F0NjROdW1iZXIpICgoY21zRmxvYXQ2NE51bWJlciopIGFjY3VtKVsoaSArIHN0YXJ0KSAgKiBTdHJpZGVdOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2ID0gKGNtc0Zsb2F0NjROdW1iZXIpICgoY21zRmxvYXQ2NE51bWJlciopIGFjY3VtKVtpICsgc3RhcnRdOwotCi0gICAgICAgIHYgLz0gbWF4aW11bTsKLQotICAgICAgICB3SW5baW5kZXhdID0gKGNtc0Zsb2F0MzJOdW1iZXIpIChSZXZlcnNlID8gMS4wIC0gdiA6IHYpOwotICAgIH0KLQotCi0gICAgaWYgKEV4dHJhID09IDAgJiYgU3dhcEZpcnN0KSB7Ci0gICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgdG1wID0gd0luWzBdOwotCi0gICAgICAgIG1lbW1vdmUoJndJblswXSwgJndJblsxXSwgKG5DaGFuLTEpICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpKTsKLSAgICAgICAgd0luW25DaGFuLTFdID0gdG1wOwotICAgIH0KLQotICAgIGlmIChUX1BMQU5BUihpbmZvIC0+IElucHV0Rm9ybWF0KSkKLSAgICAgICAgcmV0dXJuIGFjY3VtICsgc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIGFjY3VtICsgKG5DaGFuICsgRXh0cmEpICogc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpOwotfQotCi0KLQotLy8gRnJvbSBMYWIgZG91YmxlIHRvIGNtc0Zsb2F0MzJOdW1iZXIKLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFVucm9sbExhYkRvdWJsZVRvRmxvYXQoX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgd0luW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50OE51bWJlciogYWNjdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIGNtc0Zsb2F0NjROdW1iZXIqIFB0ID0gKGNtc0Zsb2F0NjROdW1iZXIqKSBhY2N1bTsKLQotICAgIGlmIChUX1BMQU5BUihpbmZvIC0+IElucHV0Rm9ybWF0KSkgewotCi0gICAgICAgIHdJblswXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoUHRbMF0gLyAxMDAuMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gMC4uMTAwIHRvIDAuLjEKLSAgICAgICAgd0luWzFdID0gKGNtc0Zsb2F0MzJOdW1iZXIpICgoUHRbU3RyaWRlXSArIDEyOCkgLyAyNTUuMCk7ICAgIC8vIGZvcm0gLTEyOC4uKzEyNyB0byAwLi4xCi0gICAgICAgIHdJblsyXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoKFB0W1N0cmlkZSoyXSArIDEyOCkgLyAyNTUuMCk7Ci0KLSAgICAgICAgcmV0dXJuIGFjY3VtICsgc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpOwotICAgIH0KLSAgICBlbHNlIHsKLQotICAgICAgICB3SW5bMF0gPSAoY21zRmxvYXQzMk51bWJlcikgKFB0WzBdIC8gMTAwLjApOyAgICAgICAgICAgIC8vIGZyb20gMC4uMTAwIHRvIDAuLjEKLSAgICAgICAgd0luWzFdID0gKGNtc0Zsb2F0MzJOdW1iZXIpICgoUHRbMV0gKyAxMjgpIC8gMjU1LjApOyAgICAvLyBmb3JtIC0xMjguLisxMjcgdG8gMC4uMQotICAgICAgICB3SW5bMl0gPSAoY21zRmxvYXQzMk51bWJlcikgKChQdFsyXSArIDEyOCkgLyAyNTUuMCk7Ci0KLSAgICAgICAgYWNjdW0gKz0gc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpKigzICsgVF9FWFRSQShpbmZvIC0+SW5wdXRGb3JtYXQpKTsKLSAgICAgICAgcmV0dXJuIGFjY3VtOwotICAgIH0KLX0KLQotLy8gRnJvbSBMYWIgZG91YmxlIHRvIGNtc0Zsb2F0MzJOdW1iZXIKLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFVucm9sbExhYkZsb2F0VG9GbG9hdChfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHdJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50OE51bWJlciogYWNjdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgY21zRmxvYXQzMk51bWJlciogUHQgPSAoY21zRmxvYXQzMk51bWJlciopIGFjY3VtOwotCi0gICAgaWYgKFRfUExBTkFSKGluZm8gLT4gSW5wdXRGb3JtYXQpKSB7Ci0KLSAgICAgICAgd0luWzBdID0gKGNtc0Zsb2F0MzJOdW1iZXIpIChQdFswXSAvIDEwMC4wKTsgICAgICAgICAgICAgICAgIC8vIGZyb20gMC4uMTAwIHRvIDAuLjEKLSAgICAgICAgd0luWzFdID0gKGNtc0Zsb2F0MzJOdW1iZXIpICgoUHRbU3RyaWRlXSArIDEyOCkgLyAyNTUuMCk7ICAgIC8vIGZvcm0gLTEyOC4uKzEyNyB0byAwLi4xCi0gICAgICAgIHdJblsyXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoKFB0W1N0cmlkZSoyXSArIDEyOCkgLyAyNTUuMCk7Ci0KLSAgICAgICAgcmV0dXJuIGFjY3VtICsgc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpOwotICAgIH0KLSAgICBlbHNlIHsKLQotICAgICAgICB3SW5bMF0gPSAoY21zRmxvYXQzMk51bWJlcikgKFB0WzBdIC8gMTAwLjApOyAgICAgICAgICAgIC8vIGZyb20gMC4uMTAwIHRvIDAuLjEKLSAgICAgICAgd0luWzFdID0gKGNtc0Zsb2F0MzJOdW1iZXIpICgoUHRbMV0gKyAxMjgpIC8gMjU1LjApOyAgICAvLyBmb3JtIC0xMjguLisxMjcgdG8gMC4uMQotICAgICAgICB3SW5bMl0gPSAoY21zRmxvYXQzMk51bWJlcikgKChQdFsyXSArIDEyOCkgLyAyNTUuMCk7Ci0KLSAgICAgICAgYWNjdW0gKz0gc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpKigzICsgVF9FWFRSQShpbmZvIC0+SW5wdXRGb3JtYXQpKTsKLSAgICAgICAgcmV0dXJuIGFjY3VtOwotICAgIH0KLX0KLQotCi0KLS8vIDEuMTUgZml4ZWQgcG9pbnQsIHRoYXQgbWVhbnMgbWF4aW11bSB2YWx1ZSBpcyBNQVhfRU5DT0RFQUJMRV9YWVogKDB4RkZGRikKLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFVucm9sbFhZWkRvdWJsZVRvRmxvYXQoX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgd0luW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50OE51bWJlciogYWNjdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIGNtc0Zsb2F0NjROdW1iZXIqIFB0ID0gKGNtc0Zsb2F0NjROdW1iZXIqKSBhY2N1bTsKLQotICAgIGlmIChUX1BMQU5BUihpbmZvIC0+IElucHV0Rm9ybWF0KSkgewotCi0gICAgICAgIHdJblswXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoUHRbMF0gLyBNQVhfRU5DT0RFQUJMRV9YWVopOwotICAgICAgICB3SW5bMV0gPSAoY21zRmxvYXQzMk51bWJlcikgKFB0W1N0cmlkZV0gLyBNQVhfRU5DT0RFQUJMRV9YWVopOwotICAgICAgICB3SW5bMl0gPSAoY21zRmxvYXQzMk51bWJlcikgKFB0W1N0cmlkZSoyXSAvIE1BWF9FTkNPREVBQkxFX1hZWik7Ci0KLSAgICAgICAgcmV0dXJuIGFjY3VtICsgc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpOwotICAgIH0KLSAgICBlbHNlIHsKLQotICAgICAgICB3SW5bMF0gPSAoY21zRmxvYXQzMk51bWJlcikgKFB0WzBdIC8gTUFYX0VOQ09ERUFCTEVfWFlaKTsKLSAgICAgICAgd0luWzFdID0gKGNtc0Zsb2F0MzJOdW1iZXIpIChQdFsxXSAvIE1BWF9FTkNPREVBQkxFX1hZWik7Ci0gICAgICAgIHdJblsyXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoUHRbMl0gLyBNQVhfRU5DT0RFQUJMRV9YWVopOwotCi0gICAgICAgIGFjY3VtICs9IHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKSooMyArIFRfRVhUUkEoaW5mbyAtPklucHV0Rm9ybWF0KSk7Ci0gICAgICAgIHJldHVybiBhY2N1bTsKLSAgICB9Ci19Ci0KLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFVucm9sbFhZWkZsb2F0VG9GbG9hdChfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHdJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50OE51bWJlciogYWNjdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgY21zRmxvYXQzMk51bWJlciogUHQgPSAoY21zRmxvYXQzMk51bWJlciopIGFjY3VtOwotCi0gICAgaWYgKFRfUExBTkFSKGluZm8gLT4gSW5wdXRGb3JtYXQpKSB7Ci0KLSAgICAgICAgd0luWzBdID0gKGNtc0Zsb2F0MzJOdW1iZXIpIChQdFswXSAvIE1BWF9FTkNPREVBQkxFX1hZWik7Ci0gICAgICAgIHdJblsxXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoUHRbU3RyaWRlXSAvIE1BWF9FTkNPREVBQkxFX1hZWik7Ci0gICAgICAgIHdJblsyXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoUHRbU3RyaWRlKjJdIC8gTUFYX0VOQ09ERUFCTEVfWFlaKTsKLQotICAgICAgICByZXR1cm4gYWNjdW0gKyBzaXplb2YoY21zRmxvYXQzMk51bWJlcik7Ci0gICAgfQotICAgIGVsc2UgewotCi0gICAgICAgIHdJblswXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAoUHRbMF0gLyBNQVhfRU5DT0RFQUJMRV9YWVopOwotICAgICAgICB3SW5bMV0gPSAoY21zRmxvYXQzMk51bWJlcikgKFB0WzFdIC8gTUFYX0VOQ09ERUFCTEVfWFlaKTsKLSAgICAgICAgd0luWzJdID0gKGNtc0Zsb2F0MzJOdW1iZXIpIChQdFsyXSAvIE1BWF9FTkNPREVBQkxFX1hZWik7Ci0KLSAgICAgICAgYWNjdW0gKz0gc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpKigzICsgVF9FWFRSQShpbmZvIC0+SW5wdXRGb3JtYXQpKTsKLSAgICAgICAgcmV0dXJuIGFjY3VtOwotICAgIH0KLX0KLQotCi0KLS8vIFBhY2tpbmcgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0vLyBHZW5lcmljIGNodW5reSBmb3IgYnl0ZQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrQW55Qnl0ZXMocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICBpbnQgbkNoYW4gICAgICA9IFRfQ0hBTk5FTFMoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOwotICAgIGludCBEb1N3YXAgICAgID0gVF9ET1NXQVAoaW5mbyAtPk91dHB1dEZvcm1hdCk7Ci0gICAgaW50IFJldmVyc2UgICAgPSBUX0ZMQVZPUihpbmZvIC0+T3V0cHV0Rm9ybWF0KTsKLSAgICBpbnQgRXh0cmEgICAgICA9IFRfRVhUUkEoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOwotICAgIGludCBTd2FwRmlyc3QgID0gVF9TV0FQRklSU1QoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOwotICAgIGludCBFeHRyYUZpcnN0ID0gRG9Td2FwIF4gU3dhcEZpcnN0OwotICAgIGNtc1VJbnQ4TnVtYmVyKiBzd2FwMTsKLSAgICBjbXNVSW50OE51bWJlciB2ID0gMDsKLSAgICBpbnQgaTsKLQotICAgIHN3YXAxID0gb3V0cHV0OwotCi0gICAgaWYgKEV4dHJhRmlyc3QpIHsKLSAgICAgICAgb3V0cHV0ICs9IEV4dHJhOwotICAgIH0KLQotICAgIGZvciAoaT0wOyBpIDwgbkNoYW47IGkrKykgewotCi0gICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7Ci0KLSAgICAgICAgdiA9IEZST01fMTZfVE9fOCh3T3V0W2luZGV4XSk7Ci0KLSAgICAgICAgaWYgKFJldmVyc2UpCi0gICAgICAgICAgICB2ID0gUkVWRVJTRV9GTEFWT1JfOCh2KTsKLQotICAgICAgICAqb3V0cHV0KysgPSB2OwotICAgIH0KLQotICAgIGlmICghRXh0cmFGaXJzdCkgewotICAgICAgICBvdXRwdXQgKz0gRXh0cmE7Ci0gICAgfQotCi0gICAgaWYgKEV4dHJhID09IDAgJiYgU3dhcEZpcnN0KSB7Ci0KLSAgICAgICAgbWVtbW92ZShzd2FwMSArIDEsIHN3YXAxLCBuQ2hhbi0xKTsKLSAgICAgICAgKnN3YXAxID0gdjsKLSAgICB9Ci0KLQotICAgIHJldHVybiBvdXRwdXQ7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrQW55V29yZHMocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICBpbnQgbkNoYW4gICAgICA9IFRfQ0hBTk5FTFMoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOwotICAgIGludCBTd2FwRW5kaWFuID0gVF9FTkRJQU4xNihpbmZvIC0+IElucHV0Rm9ybWF0KTsKLSAgICBpbnQgRG9Td2FwICAgICA9IFRfRE9TV0FQKGluZm8gLT5PdXRwdXRGb3JtYXQpOwotICAgIGludCBSZXZlcnNlICAgID0gVF9GTEFWT1IoaW5mbyAtPk91dHB1dEZvcm1hdCk7Ci0gICAgaW50IEV4dHJhICAgICAgPSBUX0VYVFJBKGluZm8gLT4gT3V0cHV0Rm9ybWF0KTsKLSAgICBpbnQgU3dhcEZpcnN0ICA9IFRfU1dBUEZJUlNUKGluZm8gLT4gT3V0cHV0Rm9ybWF0KTsKLSAgICBpbnQgRXh0cmFGaXJzdCA9IERvU3dhcCBeIFN3YXBGaXJzdDsKLSAgICBjbXNVSW50MTZOdW1iZXIqIHN3YXAxOwotICAgIGNtc1VJbnQxNk51bWJlciB2ID0gMDsKLSAgICBpbnQgaTsKLQotICAgIHN3YXAxID0gKGNtc1VJbnQxNk51bWJlciopIG91dHB1dDsKLQotICAgIGlmIChFeHRyYUZpcnN0KSB7Ci0gICAgICAgIG91dHB1dCArPSBFeHRyYSAqIHNpemVvZihjbXNVSW50MTZOdW1iZXIpOwotICAgIH0KLQotICAgIGZvciAoaT0wOyBpIDwgbkNoYW47IGkrKykgewotCi0gICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7Ci0KLSAgICAgICAgdiA9IHdPdXRbaW5kZXhdOwotCi0gICAgICAgIGlmIChTd2FwRW5kaWFuKQotICAgICAgICAgICAgdiA9IENIQU5HRV9FTkRJQU4odik7Ci0KLSAgICAgICAgaWYgKFJldmVyc2UpCi0gICAgICAgICAgICB2ID0gUkVWRVJTRV9GTEFWT1JfMTYodik7Ci0KLSAgICAgICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB2OwotCi0gICAgICAgIG91dHB1dCArPSBzaXplb2YoY21zVUludDE2TnVtYmVyKTsKLSAgICB9Ci0KLSAgICBpZiAoIUV4dHJhRmlyc3QpIHsKLSAgICAgICAgb3V0cHV0ICs9IEV4dHJhICogc2l6ZW9mKGNtc1VJbnQxNk51bWJlcik7Ci0gICAgfQotCi0gICAgaWYgKEV4dHJhID09IDAgJiYgU3dhcEZpcnN0KSB7Ci0KLSAgICAgICAgbWVtbW92ZShzd2FwMSArIDEsIHN3YXAxLCAobkNoYW4tMSkqIHNpemVvZihjbXNVSW50MTZOdW1iZXIpKTsKLSAgICAgICAgKnN3YXAxID0gdjsKLSAgICB9Ci0KLQotICAgIHJldHVybiBvdXRwdXQ7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogUGFja1BsYW5hckJ5dGVzKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgaW50IG5DaGFuICAgICA9IFRfQ0hBTk5FTFMoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOwotICAgIGludCBEb1N3YXAgICAgPSBUX0RPU1dBUChpbmZvIC0+T3V0cHV0Rm9ybWF0KTsKLSAgICBpbnQgU3dhcEZpcnN0ID0gVF9TV0FQRklSU1QoaW5mbyAtPk91dHB1dEZvcm1hdCk7Ci0gICAgaW50IFJldmVyc2UgICA9IFRfRkxBVk9SKGluZm8gLT5PdXRwdXRGb3JtYXQpOwotICAgIGludCBpOwotICAgIGNtc1VJbnQ4TnVtYmVyKiBJbml0ID0gb3V0cHV0OwotCi0KLSAgICBpZiAoRG9Td2FwIF4gU3dhcEZpcnN0KSB7Ci0gICAgICAgIG91dHB1dCArPSBUX0VYVFJBKGluZm8gLT4gT3V0cHV0Rm9ybWF0KSAqIFN0cmlkZTsKLSAgICB9Ci0KLQotICAgIGZvciAoaT0wOyBpIDwgbkNoYW47IGkrKykgewotCi0gICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7Ci0gICAgICAgIGNtc1VJbnQ4TnVtYmVyIHYgPSBGUk9NXzE2X1RPXzgod091dFtpbmRleF0pOwotCi0gICAgICAgICooY21zVUludDhOdW1iZXIqKSAgb3V0cHV0ID0gKGNtc1VJbnQ4TnVtYmVyKSAoUmV2ZXJzZSA/IFJFVkVSU0VfRkxBVk9SXzgodikgOiB2KTsKLSAgICAgICAgb3V0cHV0ICs9IFN0cmlkZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKEluaXQgKyAxKTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrUGxhbmFyV29yZHMocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICBpbnQgbkNoYW4gPSBUX0NIQU5ORUxTKGluZm8gLT4gT3V0cHV0Rm9ybWF0KTsKLSAgICBpbnQgRG9Td2FwID0gVF9ET1NXQVAoaW5mbyAtPk91dHB1dEZvcm1hdCk7Ci0gICAgaW50IFJldmVyc2U9IFRfRkxBVk9SKGluZm8gLT5PdXRwdXRGb3JtYXQpOwotICAgIGludCBTd2FwRW5kaWFuID0gVF9FTkRJQU4xNihpbmZvIC0+IE91dHB1dEZvcm1hdCk7Ci0gICAgaW50IGk7Ci0gICAgY21zVUludDhOdW1iZXIqIEluaXQgPSBvdXRwdXQ7Ci0gICAgY21zVUludDE2TnVtYmVyIHY7Ci0KLSAgICBpZiAoRG9Td2FwKSB7Ci0gICAgICAgIG91dHB1dCArPSBUX0VYVFJBKGluZm8gLT4gT3V0cHV0Rm9ybWF0KSAqIFN0cmlkZSAqIHNpemVvZihjbXNVSW50MTZOdW1iZXIpOwotICAgIH0KLQotICAgIGZvciAoaT0wOyBpIDwgbkNoYW47IGkrKykgewotCi0gICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7Ci0KLSAgICAgICAgdiA9IHdPdXRbaW5kZXhdOwotCi0gICAgICAgIGlmIChTd2FwRW5kaWFuKQotICAgICAgICAgICAgdiA9IENIQU5HRV9FTkRJQU4odik7Ci0KLSAgICAgICAgaWYgKFJldmVyc2UpCi0gICAgICAgICAgICB2ID0gIFJFVkVSU0VfRkxBVk9SXzE2KHYpOwotCi0gICAgICAgICooY21zVUludDE2TnVtYmVyKikgb3V0cHV0ID0gdjsKLSAgICAgICAgb3V0cHV0ICs9IChTdHJpZGUgKiBzaXplb2YoY21zVUludDE2TnVtYmVyKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIChJbml0ICsgc2l6ZW9mKGNtc1VJbnQxNk51bWJlcikpOwotfQotCi0vLyBDTVlLY20gKHVucm9sbGVkIGZvciBzcGVlZCkKLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogUGFjazZCeXRlcyhyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzBdKTsKLSAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFsxXSk7Ci0gICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMl0pOwotICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzNdKTsKLSAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFs0XSk7Ci0gICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbNV0pOwotCi0gICAgcmV0dXJuIG91dHB1dDsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi0vLyBLQ01ZY20KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogUGFjazZCeXRlc1N3YXAocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFs1XSk7Ci0gICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbNF0pOwotICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzNdKTsKLSAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFsyXSk7Ci0gICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMV0pOwotICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzBdKTsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotLy8gQ01ZS2NtCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrNldvcmRzKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzBdOwotICAgIG91dHB1dCs9IDI7Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzFdOwotICAgIG91dHB1dCs9IDI7Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzJdOwotICAgIG91dHB1dCs9IDI7Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzNdOwotICAgIG91dHB1dCs9IDI7Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzRdOwotICAgIG91dHB1dCs9IDI7Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzVdOwotICAgIG91dHB1dCs9IDI7Ci0KLSAgICByZXR1cm4gb3V0cHV0OwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLS8vIEtDTVljbQotc3RhdGljCi1jbXNVSW50OE51bWJlciogUGFjazZXb3Jkc1N3YXAocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbNV07Ci0gICAgb3V0cHV0Kz0gMjsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbNF07Ci0gICAgb3V0cHV0Kz0gMjsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbM107Ci0gICAgb3V0cHV0Kz0gMjsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMl07Ci0gICAgb3V0cHV0Kz0gMjsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMV07Ci0gICAgb3V0cHV0Kz0gMjsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMF07Ci0gICAgb3V0cHV0Kz0gMjsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrNEJ5dGVzKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMF0pOwotICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzFdKTsKLSAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFsyXSk7Ci0gICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbM10pOwotCi0gICAgcmV0dXJuIG91dHB1dDsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrNEJ5dGVzUmV2ZXJzZShyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgICpvdXRwdXQrKyA9IFJFVkVSU0VfRkxBVk9SXzgoRlJPTV8xNl9UT184KHdPdXRbMF0pKTsKLSAgICAqb3V0cHV0KysgPSBSRVZFUlNFX0ZMQVZPUl84KEZST01fMTZfVE9fOCh3T3V0WzFdKSk7Ci0gICAgKm91dHB1dCsrID0gUkVWRVJTRV9GTEFWT1JfOChGUk9NXzE2X1RPXzgod091dFsyXSkpOwotICAgICpvdXRwdXQrKyA9IFJFVkVSU0VfRkxBVk9SXzgoRlJPTV8xNl9UT184KHdPdXRbM10pKTsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrNEJ5dGVzU3dhcEZpcnN0KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbM10pOwotICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzBdKTsKLSAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFsxXSk7Ci0gICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMl0pOwotCi0gICAgcmV0dXJuIG91dHB1dDsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi0vLyBBQkdSCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrNEJ5dGVzU3dhcChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzNdKTsKLSAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFsyXSk7Ci0gICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMV0pOwotICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzBdKTsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogUGFjazRCeXRlc1N3YXBTd2FwRmlyc3QocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFsyXSk7Ci0gICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMV0pOwotICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzBdKTsKLSAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFszXSk7Ci0KLSAgICByZXR1cm4gb3V0cHV0OwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFBhY2s0V29yZHMocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMF07Ci0gICAgb3V0cHV0Kz0gMjsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMV07Ci0gICAgb3V0cHV0Kz0gMjsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMl07Ci0gICAgb3V0cHV0Kz0gMjsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbM107Ci0gICAgb3V0cHV0Kz0gMjsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogUGFjazRXb3Jkc1JldmVyc2UocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IFJFVkVSU0VfRkxBVk9SXzE2KHdPdXRbMF0pOwotICAgIG91dHB1dCs9IDI7Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSBSRVZFUlNFX0ZMQVZPUl8xNih3T3V0WzFdKTsKLSAgICBvdXRwdXQrPSAyOwotICAgICooY21zVUludDE2TnVtYmVyKikgb3V0cHV0ID0gUkVWRVJTRV9GTEFWT1JfMTYod091dFsyXSk7Ci0gICAgb3V0cHV0Kz0gMjsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IFJFVkVSU0VfRkxBVk9SXzE2KHdPdXRbM10pOwotICAgIG91dHB1dCs9IDI7Ci0KLSAgICByZXR1cm4gb3V0cHV0OwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLS8vIEFCR1IKLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFBhY2s0V29yZHNTd2FwKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzNdOwotICAgIG91dHB1dCs9IDI7Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzJdOwotICAgIG91dHB1dCs9IDI7Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzFdOwotICAgIG91dHB1dCs9IDI7Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzBdOwotICAgIG91dHB1dCs9IDI7Ci0KLSAgICByZXR1cm4gb3V0cHV0OwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLS8vIENNWUsKLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFBhY2s0V29yZHNCaWdFbmRpYW4ocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IENIQU5HRV9FTkRJQU4od091dFswXSk7Ci0gICAgb3V0cHV0Kz0gMjsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IENIQU5HRV9FTkRJQU4od091dFsxXSk7Ci0gICAgb3V0cHV0Kz0gMjsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IENIQU5HRV9FTkRJQU4od091dFsyXSk7Ci0gICAgb3V0cHV0Kz0gMjsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IENIQU5HRV9FTkRJQU4od091dFszXSk7Ci0gICAgb3V0cHV0Kz0gMjsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrTGFiVjJfOChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOChGb21MYWJWNFRvTGFiVjIod091dFswXSkpOwotICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOChGb21MYWJWNFRvTGFiVjIod091dFsxXSkpOwotICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOChGb21MYWJWNFRvTGFiVjIod091dFsyXSkpOwotCi0gICAgcmV0dXJuIG91dHB1dDsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrQUxhYlYyXzgocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICBvdXRwdXQrKzsKLSAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgoRm9tTGFiVjRUb0xhYlYyKHdPdXRbMF0pKTsKLSAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgoRm9tTGFiVjRUb0xhYlYyKHdPdXRbMV0pKTsKLSAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgoRm9tTGFiVjRUb0xhYlYyKHdPdXRbMl0pKTsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogUGFja0xhYlYyXzE2KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSBGb21MYWJWNFRvTGFiVjIod091dFswXSk7Ci0gICAgb3V0cHV0ICs9IDI7Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSBGb21MYWJWNFRvTGFiVjIod091dFsxXSk7Ci0gICAgb3V0cHV0ICs9IDI7Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSBGb21MYWJWNFRvTGFiVjIod091dFsyXSk7Ci0gICAgb3V0cHV0ICs9IDI7Ci0KLSAgICByZXR1cm4gb3V0cHV0OwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFBhY2szQnl0ZXMocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFswXSk7Ci0gICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMV0pOwotICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzJdKTsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogUGFjazNCeXRlc09wdGltaXplZChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgICpvdXRwdXQrKyA9ICh3T3V0WzBdICYgMHhGRik7Ci0gICAgKm91dHB1dCsrID0gKHdPdXRbMV0gJiAweEZGKTsKLSAgICAqb3V0cHV0KysgPSAod091dFsyXSAmIDB4RkYpOwotCi0gICAgcmV0dXJuIG91dHB1dDsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrM0J5dGVzU3dhcChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzJdKTsKLSAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFsxXSk7Ci0gICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMF0pOwotCi0gICAgcmV0dXJuIG91dHB1dDsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrM0J5dGVzU3dhcE9wdGltaXplZChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgICpvdXRwdXQrKyA9ICh3T3V0WzJdICYgMHhGRik7Ci0gICAgKm91dHB1dCsrID0gKHdPdXRbMV0gJiAweEZGKTsKLSAgICAqb3V0cHV0KysgPSAod091dFswXSAmIDB4RkYpOwotCi0gICAgcmV0dXJuIG91dHB1dDsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi0KLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFBhY2szV29yZHMocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMF07Ci0gICAgb3V0cHV0Kz0gMjsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMV07Ci0gICAgb3V0cHV0Kz0gMjsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMl07Ci0gICAgb3V0cHV0Kz0gMjsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogUGFjazNXb3Jkc1N3YXAocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMl07Ci0gICAgb3V0cHV0Kz0gMjsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMV07Ci0gICAgb3V0cHV0Kz0gMjsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMF07Ci0gICAgb3V0cHV0Kz0gMjsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogUGFjazNXb3Jkc0JpZ0VuZGlhbihyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgICooY21zVUludDE2TnVtYmVyKikgb3V0cHV0ID0gQ0hBTkdFX0VORElBTih3T3V0WzBdKTsKLSAgICBvdXRwdXQrPSAyOwotICAgICooY21zVUludDE2TnVtYmVyKikgb3V0cHV0ID0gQ0hBTkdFX0VORElBTih3T3V0WzFdKTsKLSAgICBvdXRwdXQrPSAyOwotICAgICooY21zVUludDE2TnVtYmVyKikgb3V0cHV0ID0gQ0hBTkdFX0VORElBTih3T3V0WzJdKTsKLSAgICBvdXRwdXQrPSAyOwotCi0gICAgcmV0dXJuIG91dHB1dDsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrM0J5dGVzQW5kU2tpcDEocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFswXSk7Ci0gICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMV0pOwotICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzJdKTsKLSAgICBvdXRwdXQrKzsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogUGFjazNCeXRlc0FuZFNraXAxT3B0aW1pemVkKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgKm91dHB1dCsrID0gKHdPdXRbMF0gJiAweEZGKTsKLSAgICAqb3V0cHV0KysgPSAod091dFsxXSAmIDB4RkYpOwotICAgICpvdXRwdXQrKyA9ICh3T3V0WzJdICYgMHhGRik7Ci0gICAgb3V0cHV0Kys7Ci0KLSAgICByZXR1cm4gb3V0cHV0OwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogUGFjazNCeXRlc0FuZFNraXAxU3dhcEZpcnN0KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgb3V0cHV0Kys7Ci0gICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMF0pOwotICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzFdKTsKLSAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFsyXSk7Ci0KLSAgICByZXR1cm4gb3V0cHV0OwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFBhY2szQnl0ZXNBbmRTa2lwMVN3YXBGaXJzdE9wdGltaXplZChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIG91dHB1dCsrOwotICAgICpvdXRwdXQrKyA9ICh3T3V0WzBdICYgMHhGRik7Ci0gICAgKm91dHB1dCsrID0gKHdPdXRbMV0gJiAweEZGKTsKLSAgICAqb3V0cHV0KysgPSAod091dFsyXSAmIDB4RkYpOwotCi0gICAgcmV0dXJuIG91dHB1dDsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrM0J5dGVzQW5kU2tpcDFTd2FwKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgb3V0cHV0Kys7Ci0gICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMl0pOwotICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzFdKTsKLSAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFswXSk7Ci0KLSAgICByZXR1cm4gb3V0cHV0OwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFBhY2szQnl0ZXNBbmRTa2lwMVN3YXBPcHRpbWl6ZWQocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICBvdXRwdXQrKzsKLSAgICAqb3V0cHV0KysgPSAod091dFsyXSAmIDB4RkYpOwotICAgICpvdXRwdXQrKyA9ICh3T3V0WzFdICYgMHhGRik7Ci0gICAgKm91dHB1dCsrID0gKHdPdXRbMF0gJiAweEZGKTsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrM0J5dGVzQW5kU2tpcDFTd2FwU3dhcEZpcnN0KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgKm91dHB1dCsrID0gRlJPTV8xNl9UT184KHdPdXRbMl0pOwotICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzFdKTsKLSAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFswXSk7Ci0gICAgb3V0cHV0Kys7Ci0KLSAgICByZXR1cm4gb3V0cHV0OwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFBhY2szQnl0ZXNBbmRTa2lwMVN3YXBTd2FwRmlyc3RPcHRpbWl6ZWQocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICAqb3V0cHV0KysgPSAod091dFsyXSAmIDB4RkYpOwotICAgICpvdXRwdXQrKyA9ICh3T3V0WzFdICYgMHhGRik7Ci0gICAgKm91dHB1dCsrID0gKHdPdXRbMF0gJiAweEZGKTsKLSAgICBvdXRwdXQrKzsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogUGFjazNXb3Jkc0FuZFNraXAxKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzBdOwotICAgIG91dHB1dCs9IDI7Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzFdOwotICAgIG91dHB1dCs9IDI7Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzJdOwotICAgIG91dHB1dCs9IDI7Ci0gICAgb3V0cHV0Kz0gMjsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogUGFjazNXb3Jkc0FuZFNraXAxU3dhcChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIG91dHB1dCs9IDI7Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzJdOwotICAgIG91dHB1dCs9IDI7Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzFdOwotICAgIG91dHB1dCs9IDI7Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzBdOwotICAgIG91dHB1dCs9IDI7Ci0KLSAgICByZXR1cm4gb3V0cHV0OwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogUGFjazNXb3Jkc0FuZFNraXAxU3dhcEZpcnN0KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgb3V0cHV0Kz0gMjsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMF07Ci0gICAgb3V0cHV0Kz0gMjsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMV07Ci0gICAgb3V0cHV0Kz0gMjsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IHdPdXRbMl07Ci0gICAgb3V0cHV0Kz0gMjsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrM1dvcmRzQW5kU2tpcDFTd2FwU3dhcEZpcnN0KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzJdOwotICAgIG91dHB1dCs9IDI7Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzFdOwotICAgIG91dHB1dCs9IDI7Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSB3T3V0WzBdOwotICAgIG91dHB1dCs9IDI7Ci0gICAgb3V0cHV0Kz0gMjsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotCi0KLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFBhY2sxQnl0ZShyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOCh3T3V0WzBdKTsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrMUJ5dGVSZXZlcnNlZChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgICpvdXRwdXQrKyA9IEZST01fMTZfVE9fOChSRVZFUlNFX0ZMQVZPUl8xNih3T3V0WzBdKSk7Ci0KLSAgICByZXR1cm4gb3V0cHV0OwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogUGFjazFCeXRlU2tpcDEocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFswXSk7Ci0gICAgb3V0cHV0Kys7Ci0KLSAgICByZXR1cm4gb3V0cHV0OwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogUGFjazFCeXRlU2tpcDFTd2FwRmlyc3QocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICBvdXRwdXQrKzsKLSAgICAqb3V0cHV0KysgPSBGUk9NXzE2X1RPXzgod091dFswXSk7Ci0KLSAgICByZXR1cm4gb3V0cHV0OwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihpbmZvKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFN0cmlkZSk7Ci19Ci0KLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFBhY2sxV29yZChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgICooY21zVUludDE2TnVtYmVyKikgb3V0cHV0ID0gd091dFswXTsKLSAgICBvdXRwdXQrPSAyOwotCi0gICAgcmV0dXJuIG91dHB1dDsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi0KLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFBhY2sxV29yZFJldmVyc2VkKHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgKihjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQgPSBSRVZFUlNFX0ZMQVZPUl8xNih3T3V0WzBdKTsKLSAgICBvdXRwdXQrPSAyOwotCi0gICAgcmV0dXJuIG91dHB1dDsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrMVdvcmRCaWdFbmRpYW4ocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICAqKGNtc1VJbnQxNk51bWJlciopIG91dHB1dCA9IENIQU5HRV9FTkRJQU4od091dFswXSk7Ci0gICAgb3V0cHV0Kz0gMjsKLQotICAgIHJldHVybiBvdXRwdXQ7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKGluZm8pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU3RyaWRlKTsKLX0KLQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrMVdvcmRTa2lwMShyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgICooY21zVUludDE2TnVtYmVyKikgb3V0cHV0ID0gd091dFswXTsKLSAgICBvdXRwdXQrPSA0OwotCi0gICAgcmV0dXJuIG91dHB1dDsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrMVdvcmRTa2lwMVN3YXBGaXJzdChyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIG91dHB1dCArPSAyOwotICAgICooY21zVUludDE2TnVtYmVyKikgb3V0cHV0ID0gd091dFswXTsKLSAgICBvdXRwdXQrPSAyOwotCi0gICAgcmV0dXJuIG91dHB1dDsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoaW5mbyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTdHJpZGUpOwotfQotCi0KLS8vIFVuZW5jb2RlZCBGbG9hdCB2YWx1ZXMgLS0gZG9uJ3QgdHJ5IG9wdGltaXplIHNwZWVkCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrTGFiRG91YmxlRnJvbTE2KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0KLSAgICBpZiAoVF9QTEFOQVIoaW5mbyAtPiBPdXRwdXRGb3JtYXQpKSB7Ci0KLSAgICAgICAgY21zQ0lFTGFiICBMYWI7Ci0gICAgICAgIGNtc0Zsb2F0NjROdW1iZXIqIE91dCA9IChjbXNGbG9hdDY0TnVtYmVyKikgb3V0cHV0OwotICAgICAgICBjbXNMYWJFbmNvZGVkMkZsb2F0KCZMYWIsIHdPdXQpOwotCi0gICAgICAgIE91dFswXSAgICAgICAgPSBMYWIuTDsKLSAgICAgICAgT3V0W1N0cmlkZV0gICA9IExhYi5hOwotICAgICAgICBPdXRbU3RyaWRlKjJdID0gTGFiLmI7Ci0KLSAgICAgICAgcmV0dXJuIG91dHB1dCArIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0KLSAgICAgICAgY21zTGFiRW5jb2RlZDJGbG9hdCgoY21zQ0lFTGFiKikgb3V0cHV0LCB3T3V0KTsKLSAgICAgICAgcmV0dXJuIG91dHB1dCArIChzaXplb2YoY21zQ0lFTGFiKSArIFRfRVhUUkEoaW5mbyAtPk91dHB1dEZvcm1hdCkgKiBzaXplb2YoY21zRmxvYXQ2NE51bWJlcikpOwotICAgIH0KLX0KLQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrTGFiRmxvYXRGcm9tMTYocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICBjbXNDSUVMYWIgIExhYjsKLSAgICBjbXNMYWJFbmNvZGVkMkZsb2F0KCZMYWIsIHdPdXQpOwotCi0gICAgaWYgKFRfUExBTkFSKGluZm8gLT4gT3V0cHV0Rm9ybWF0KSkgewotICAgICAgIAotICAgICAgICBjbXNGbG9hdDMyTnVtYmVyKiBPdXQgPSAoY21zRmxvYXQzMk51bWJlciopIG91dHB1dDsKLSAgICAKLSAgICAgICAgT3V0WzBdICAgICAgICA9IChjbXNGbG9hdDMyTnVtYmVyKUxhYi5MOwotICAgICAgICBPdXRbU3RyaWRlXSAgID0gKGNtc0Zsb2F0MzJOdW1iZXIpTGFiLmE7Ci0gICAgICAgIE91dFtTdHJpZGUqMl0gPSAoY21zRmxvYXQzMk51bWJlcilMYWIuYjsKLQotICAgICAgICByZXR1cm4gb3V0cHV0ICsgc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpOwotICAgIH0KLSAgICBlbHNlIHsKLQotICAgICAgICgoY21zRmxvYXQzMk51bWJlciopIG91dHB1dClbMF0gPSAoY21zRmxvYXQzMk51bWJlcikgTGFiLkw7Ci0gICAgICAgKChjbXNGbG9hdDMyTnVtYmVyKikgb3V0cHV0KVsxXSA9IChjbXNGbG9hdDMyTnVtYmVyKSBMYWIuYTsKLSAgICAgICAoKGNtc0Zsb2F0MzJOdW1iZXIqKSBvdXRwdXQpWzJdID0gKGNtc0Zsb2F0MzJOdW1iZXIpIExhYi5iOwotCi0gICAgICAgIHJldHVybiBvdXRwdXQgKyAoMyArIFRfRVhUUkEoaW5mbyAtPk91dHB1dEZvcm1hdCkpICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpOwotICAgIH0KLX0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogUGFja1hZWkRvdWJsZUZyb20xNihyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIGlmIChUX1BMQU5BUihJbmZvIC0+IE91dHB1dEZvcm1hdCkpIHsKLQotICAgICAgICBjbXNDSUVYWVogWFlaOwotICAgICAgICBjbXNGbG9hdDY0TnVtYmVyKiBPdXQgPSAoY21zRmxvYXQ2NE51bWJlciopIG91dHB1dDsKLSAgICAgICAgY21zWFlaRW5jb2RlZDJGbG9hdCgmWFlaLCB3T3V0KTsKLQotICAgICAgICBPdXRbMF0gICAgICAgID0gWFlaLlg7Ci0gICAgICAgIE91dFtTdHJpZGVdICAgPSBYWVouWTsKLSAgICAgICAgT3V0W1N0cmlkZSoyXSA9IFhZWi5aOwotCi0gICAgICAgIHJldHVybiBvdXRwdXQgKyBzaXplb2YoY21zRmxvYXQ2NE51bWJlcik7Ci0KLSAgICB9Ci0gICAgZWxzZSB7Ci0KLSAgICAgICAgY21zWFlaRW5jb2RlZDJGbG9hdCgoY21zQ0lFWFlaKikgb3V0cHV0LCB3T3V0KTsKLQotICAgICAgICByZXR1cm4gb3V0cHV0ICsgKHNpemVvZihjbXNDSUVYWVopICsgVF9FWFRSQShJbmZvIC0+T3V0cHV0Rm9ybWF0KSAqIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKSk7Ci0gICAgfQotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrWFlaRmxvYXRGcm9tMTYocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICBpZiAoVF9QTEFOQVIoSW5mbyAtPiBPdXRwdXRGb3JtYXQpKSB7Ci0KLSAgICAgICAgY21zQ0lFWFlaIFhZWjsKLSAgICAgICAgY21zRmxvYXQzMk51bWJlciogT3V0ID0gKGNtc0Zsb2F0MzJOdW1iZXIqKSBvdXRwdXQ7Ci0gICAgICAgIGNtc1hZWkVuY29kZWQyRmxvYXQoJlhZWiwgd091dCk7Ci0KLSAgICAgICAgT3V0WzBdICAgICAgICA9IChjbXNGbG9hdDMyTnVtYmVyKSBYWVouWDsKLSAgICAgICAgT3V0W1N0cmlkZV0gICA9IChjbXNGbG9hdDMyTnVtYmVyKSBYWVouWTsKLSAgICAgICAgT3V0W1N0cmlkZSoyXSA9IChjbXNGbG9hdDMyTnVtYmVyKSBYWVouWjsKLQotICAgICAgICByZXR1cm4gb3V0cHV0ICsgc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpOwotCi0gICAgfQotICAgIGVsc2UgewotCi0gICAgICAgIGNtc0NJRVhZWiBYWVo7Ci0gICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIqIE91dCA9IChjbXNGbG9hdDMyTnVtYmVyKikgb3V0cHV0OwotICAgICAgICBjbXNYWVpFbmNvZGVkMkZsb2F0KCZYWVosIHdPdXQpOwotCi0gICAgICAgIE91dFswXSA9IChjbXNGbG9hdDMyTnVtYmVyKSBYWVouWDsKLSAgICAgICAgT3V0WzFdID0gKGNtc0Zsb2F0MzJOdW1iZXIpIFhZWi5ZOwotICAgICAgICBPdXRbMl0gPSAoY21zRmxvYXQzMk51bWJlcikgWFlaLlo7Ci0KLSAgICAgICAgcmV0dXJuIG91dHB1dCArICgzICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpICsgVF9FWFRSQShJbmZvIC0+T3V0cHV0Rm9ybWF0KSAqIHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKSk7Ci0gICAgfQotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrRG91YmxlRnJvbTE2KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgaW50IG5DaGFuICAgICAgPSBUX0NIQU5ORUxTKGluZm8gLT4gT3V0cHV0Rm9ybWF0KTsKLSAgICBpbnQgRG9Td2FwICAgICA9IFRfRE9TV0FQKGluZm8gLT5PdXRwdXRGb3JtYXQpOwotICAgIGludCBSZXZlcnNlICAgID0gVF9GTEFWT1IoaW5mbyAtPk91dHB1dEZvcm1hdCk7Ci0gICAgaW50IEV4dHJhICAgICAgPSBUX0VYVFJBKGluZm8gLT4gT3V0cHV0Rm9ybWF0KTsKLSAgICBpbnQgU3dhcEZpcnN0ICA9IFRfU1dBUEZJUlNUKGluZm8gLT4gT3V0cHV0Rm9ybWF0KTsKLSAgICBpbnQgUGxhbmFyICAgICA9IFRfUExBTkFSKGluZm8gLT4gT3V0cHV0Rm9ybWF0KTsKLSAgICBpbnQgRXh0cmFGaXJzdCA9IERvU3dhcCBeIFN3YXBGaXJzdDsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIG1heGltdW0gPSBJc0lua1NwYWNlKGluZm8gLT5PdXRwdXRGb3JtYXQpID8gNjU1LjM1IDogNjU1MzUuMDsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIHYgPSAwOwotICAgIGNtc0Zsb2F0NjROdW1iZXIqIHN3YXAxID0gKGNtc0Zsb2F0NjROdW1iZXIqKSBvdXRwdXQ7Ci0gICAgaW50IGksIHN0YXJ0ID0gMDsKLQotICAgIGlmIChFeHRyYUZpcnN0KQotICAgICAgICBzdGFydCA9IEV4dHJhOwotCi0gICAgZm9yIChpPTA7IGkgPCBuQ2hhbjsgaSsrKSB7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gRG9Td2FwID8gKG5DaGFuIC0gaSAtIDEpIDogaTsKLQotICAgICAgICB2ID0gKGNtc0Zsb2F0NjROdW1iZXIpIHdPdXRbaW5kZXhdIC8gbWF4aW11bTsKLQotICAgICAgICBpZiAoUmV2ZXJzZSkKLSAgICAgICAgICAgIHYgPSBtYXhpbXVtIC0gdjsKLQotICAgICAgICBpZiAoUGxhbmFyKQotICAgICAgICAgICAgKChjbXNGbG9hdDY0TnVtYmVyKikgb3V0cHV0KVsoaSArIHN0YXJ0KSAgKiBTdHJpZGVdPSB2OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAoKGNtc0Zsb2F0NjROdW1iZXIqKSBvdXRwdXQpW2kgKyBzdGFydF0gPSB2OwotICAgIH0KLQotICAgIGlmICghRXh0cmFGaXJzdCkgewotICAgICAgICBvdXRwdXQgKz0gRXh0cmEgKiBzaXplb2YoY21zRmxvYXQ2NE51bWJlcik7Ci0gICAgfQotCi0gICAgaWYgKEV4dHJhID09IDAgJiYgU3dhcEZpcnN0KSB7Ci0KLSAgICAgICAgIG1lbW1vdmUoc3dhcDEgKyAxLCBzd2FwMSwgKG5DaGFuLTEpKiBzaXplb2YoY21zRmxvYXQ2NE51bWJlcikpOwotICAgICAgICAqc3dhcDEgPSB2OwotICAgIH0KLQotICAgIGlmIChUX1BMQU5BUihpbmZvIC0+IE91dHB1dEZvcm1hdCkpCi0gICAgICAgIHJldHVybiBvdXRwdXQgKyBzaXplb2YoY21zRmxvYXQ2NE51bWJlcik7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gb3V0cHV0ICsgbkNoYW4gKiBzaXplb2YoY21zRmxvYXQ2NE51bWJlcik7Ci0KLX0KLQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrRmxvYXRGcm9tMTYocmVnaXN0ZXIgX2Ntc1RSQU5TRk9STSogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDE2TnVtYmVyIHdPdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICBpbnQgbkNoYW4gICAgICA9IFRfQ0hBTk5FTFMoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOwotICAgIGludCBEb1N3YXAgICAgID0gVF9ET1NXQVAoaW5mbyAtPk91dHB1dEZvcm1hdCk7Ci0gICAgaW50IFJldmVyc2UgICAgPSBUX0ZMQVZPUihpbmZvIC0+T3V0cHV0Rm9ybWF0KTsKLSAgICBpbnQgRXh0cmEgICAgICA9IFRfRVhUUkEoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOwotICAgIGludCBTd2FwRmlyc3QgID0gVF9TV0FQRklSU1QoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOwotICAgIGludCBQbGFuYXIgICAgID0gVF9QTEFOQVIoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOwotICAgIGludCBFeHRyYUZpcnN0ID0gRG9Td2FwIF4gU3dhcEZpcnN0OwotICAgIGNtc0Zsb2F0NjROdW1iZXIgbWF4aW11bSA9IElzSW5rU3BhY2UoaW5mbyAtPk91dHB1dEZvcm1hdCkgPyA2NTUuMzUgOiA2NTUzNS4wOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgdiA9IDA7Ci0gICAgY21zRmxvYXQzMk51bWJlciogc3dhcDEgPSAoY21zRmxvYXQzMk51bWJlciopIG91dHB1dDsKLSAgICBpbnQgaSwgc3RhcnQgPSAwOwotCi0gICAgaWYgKEV4dHJhRmlyc3QpCi0gICAgICAgIHN0YXJ0ID0gRXh0cmE7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG5DaGFuOyBpKyspIHsKLQotICAgICAgICBpbnQgaW5kZXggPSBEb1N3YXAgPyAobkNoYW4gLSBpIC0gMSkgOiBpOwotCi0gICAgICAgIHYgPSAoY21zRmxvYXQ2NE51bWJlcikgd091dFtpbmRleF0gLyBtYXhpbXVtOwotCi0gICAgICAgIGlmIChSZXZlcnNlKQotICAgICAgICAgICAgdiA9IG1heGltdW0gLSB2OwotCi0gICAgICAgIGlmIChQbGFuYXIpCi0gICAgICAgICAgICAoKGNtc0Zsb2F0MzJOdW1iZXIqKSBvdXRwdXQpWyhpICsgc3RhcnQgKSAqIFN0cmlkZV09IChjbXNGbG9hdDMyTnVtYmVyKSB2OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAoKGNtc0Zsb2F0MzJOdW1iZXIqKSBvdXRwdXQpW2kgKyBzdGFydF0gPSAoY21zRmxvYXQzMk51bWJlcikgdjsKLSAgICB9Ci0KLSAgICBpZiAoIUV4dHJhRmlyc3QpIHsKLSAgICAgICAgb3V0cHV0ICs9IEV4dHJhICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpOwotICAgIH0KLQotICBpZiAoRXh0cmEgPT0gMCAmJiBTd2FwRmlyc3QpIHsKLQotICAgICAgICAgbWVtbW92ZShzd2FwMSArIDEsIHN3YXAxLCAobkNoYW4tMSkqIHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKSk7Ci0gICAgICAgICpzd2FwMSA9IChjbXNGbG9hdDMyTnVtYmVyKSB2OwotICAgIH0KLQotICAgIGlmIChUX1BMQU5BUihpbmZvIC0+IE91dHB1dEZvcm1hdCkpCi0gICAgICAgIHJldHVybiBvdXRwdXQgKyBzaXplb2YoY21zRmxvYXQzMk51bWJlcik7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gb3V0cHV0ICsgbkNoYW4gKiBzaXplb2YoY21zRmxvYXQzMk51bWJlcik7Ci19Ci0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrRmxvYXRzRnJvbUZsb2F0KF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHdPdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIGludCBuQ2hhbiAgICAgID0gVF9DSEFOTkVMUyhpbmZvIC0+IE91dHB1dEZvcm1hdCk7Ci0gICAgaW50IERvU3dhcCAgICAgPSBUX0RPU1dBUChpbmZvIC0+T3V0cHV0Rm9ybWF0KTsKLSAgICBpbnQgUmV2ZXJzZSAgICA9IFRfRkxBVk9SKGluZm8gLT5PdXRwdXRGb3JtYXQpOwotICAgIGludCBFeHRyYSAgICAgID0gVF9FWFRSQShpbmZvIC0+IE91dHB1dEZvcm1hdCk7Ci0gICAgaW50IFN3YXBGaXJzdCAgPSBUX1NXQVBGSVJTVChpbmZvIC0+IE91dHB1dEZvcm1hdCk7Ci0gICAgaW50IFBsYW5hciAgICAgPSBUX1BMQU5BUihpbmZvIC0+IE91dHB1dEZvcm1hdCk7Ci0gICAgaW50IEV4dHJhRmlyc3QgPSBEb1N3YXAgXiBTd2FwRmlyc3Q7Ci0gICAgY21zRmxvYXQ2NE51bWJlciBtYXhpbXVtID0gSXNJbmtTcGFjZShpbmZvIC0+T3V0cHV0Rm9ybWF0KSA/IDEwMC4wIDogMS4wOwotICAgIGNtc0Zsb2F0MzJOdW1iZXIqIHN3YXAxID0gKGNtc0Zsb2F0MzJOdW1iZXIqKSBvdXRwdXQ7Ci0gICAgY21zRmxvYXQ2NE51bWJlciB2ID0gMDsKLSAgICBpbnQgaSwgc3RhcnQgPSAwOwotCi0gICAgaWYgKEV4dHJhRmlyc3QpCi0gICAgICAgIHN0YXJ0ID0gRXh0cmE7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG5DaGFuOyBpKyspIHsKLQotICAgICAgICBpbnQgaW5kZXggPSBEb1N3YXAgPyAobkNoYW4gLSBpIC0gMSkgOiBpOwotCi0gICAgICAgIHYgPSB3T3V0W2luZGV4XSAqIG1heGltdW07Ci0KLSAgICAgICAgaWYgKFJldmVyc2UpCi0gICAgICAgICAgICB2ID0gbWF4aW11bSAtIHY7Ci0KLSAgICAgICAgaWYgKFBsYW5hcikKLSAgICAgICAgICAgICgoY21zRmxvYXQzMk51bWJlciopIG91dHB1dClbKGkgKyBzdGFydCkqIFN0cmlkZV09IChjbXNGbG9hdDMyTnVtYmVyKSB2OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAoKGNtc0Zsb2F0MzJOdW1iZXIqKSBvdXRwdXQpW2kgKyBzdGFydF0gPSAoY21zRmxvYXQzMk51bWJlcikgdjsKLSAgICB9Ci0KLSAgICBpZiAoIUV4dHJhRmlyc3QpIHsKLSAgICAgICAgb3V0cHV0ICs9IEV4dHJhICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpOwotICAgIH0KLQotICAgaWYgKEV4dHJhID09IDAgJiYgU3dhcEZpcnN0KSB7Ci0KLSAgICAgICAgIG1lbW1vdmUoc3dhcDEgKyAxLCBzd2FwMSwgKG5DaGFuLTEpKiBzaXplb2YoY21zRmxvYXQzMk51bWJlcikpOwotICAgICAgICAqc3dhcDEgPSAoY21zRmxvYXQzMk51bWJlcikgdjsKLSAgICB9Ci0KLSAgICBpZiAoVF9QTEFOQVIoaW5mbyAtPiBPdXRwdXRGb3JtYXQpKQotICAgICAgICByZXR1cm4gb3V0cHV0ICsgc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG91dHB1dCArIG5DaGFuICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpOwotfQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrRG91Ymxlc0Zyb21GbG9hdChfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50OE51bWJlciogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICBpbnQgbkNoYW4gICAgICA9IFRfQ0hBTk5FTFMoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOwotICAgIGludCBEb1N3YXAgICAgID0gVF9ET1NXQVAoaW5mbyAtPk91dHB1dEZvcm1hdCk7Ci0gICAgaW50IFJldmVyc2UgICAgPSBUX0ZMQVZPUihpbmZvIC0+T3V0cHV0Rm9ybWF0KTsKLSAgICBpbnQgRXh0cmEgICAgICA9IFRfRVhUUkEoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOwotICAgIGludCBTd2FwRmlyc3QgID0gVF9TV0FQRklSU1QoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOwotICAgIGludCBQbGFuYXIgICAgID0gVF9QTEFOQVIoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOwotICAgIGludCBFeHRyYUZpcnN0ID0gRG9Td2FwIF4gU3dhcEZpcnN0OwotICAgIGNtc0Zsb2F0NjROdW1iZXIgbWF4aW11bSA9IElzSW5rU3BhY2UoaW5mbyAtPk91dHB1dEZvcm1hdCkgPyAxMDAuMCA6IDEuMDsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIHYgPSAwOwotICAgIGNtc0Zsb2F0NjROdW1iZXIqIHN3YXAxID0gKGNtc0Zsb2F0NjROdW1iZXIqKSBvdXRwdXQ7Ci0gICAgaW50IGksIHN0YXJ0ID0gMDsKLQotICAgIGlmIChFeHRyYUZpcnN0KQotICAgICAgICBzdGFydCA9IEV4dHJhOwotCi0gICAgZm9yIChpPTA7IGkgPCBuQ2hhbjsgaSsrKSB7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gRG9Td2FwID8gKG5DaGFuIC0gaSAtIDEpIDogaTsKLQotICAgICAgICB2ID0gd091dFtpbmRleF0gKiBtYXhpbXVtOwotCi0gICAgICAgIGlmIChSZXZlcnNlKQotICAgICAgICAgICAgdiA9IG1heGltdW0gLSB2OwotCi0gICAgICAgIGlmIChQbGFuYXIpCi0gICAgICAgICAgICAoKGNtc0Zsb2F0NjROdW1iZXIqKSBvdXRwdXQpWyhpICsgc3RhcnQpICogU3RyaWRlXSA9ICB2OwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAoKGNtc0Zsb2F0NjROdW1iZXIqKSBvdXRwdXQpW2kgKyBzdGFydF0gPSAgdjsKLSAgICB9Ci0KLSAgICBpZiAoIUV4dHJhRmlyc3QpIHsKLSAgICAgICAgb3V0cHV0ICs9IEV4dHJhICogc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpOwotICAgIH0KLQotICAgaWYgKEV4dHJhID09IDAgJiYgU3dhcEZpcnN0KSB7Ci0KLSAgICAgICAgIG1lbW1vdmUoc3dhcDEgKyAxLCBzd2FwMSwgKG5DaGFuLTEpKiBzaXplb2YoY21zRmxvYXQ2NE51bWJlcikpOwotICAgICAgICAqc3dhcDEgPSB2OwotICAgIH0KLQotCi0gICAgaWYgKFRfUExBTkFSKGluZm8gLT4gT3V0cHV0Rm9ybWF0KSkKLSAgICAgICAgcmV0dXJuIG91dHB1dCArIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBvdXRwdXQgKyBuQ2hhbiAqIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKTsKLQotfQotCi0KLQotCi0KLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFBhY2tMYWJGbG9hdEZyb21GbG9hdChfY21zVFJBTlNGT1JNKiBJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHdPdXRbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDhOdW1iZXIqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICBjbXNGbG9hdDMyTnVtYmVyKiBPdXQgPSAoY21zRmxvYXQzMk51bWJlciopIG91dHB1dDsKLQotICAgIGlmIChUX1BMQU5BUihJbmZvIC0+IE91dHB1dEZvcm1hdCkpIHsKLQotICAgICAgICBPdXRbMF0gICAgICAgID0gKGNtc0Zsb2F0MzJOdW1iZXIpICh3T3V0WzBdICogMTAwLjApOwotICAgICAgICBPdXRbU3RyaWRlXSAgID0gKGNtc0Zsb2F0MzJOdW1iZXIpICh3T3V0WzFdICogMjU1LjAgLSAxMjguMCk7Ci0gICAgICAgIE91dFtTdHJpZGUqMl0gPSAoY21zRmxvYXQzMk51bWJlcikgKHdPdXRbMl0gKiAyNTUuMCAtIDEyOC4wKTsKLQotICAgICAgICByZXR1cm4gb3V0cHV0ICsgc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpOwotICAgIH0KLSAgICBlbHNlIHsKLQotICAgICAgICBPdXRbMF0gPSAoY21zRmxvYXQzMk51bWJlcikgKHdPdXRbMF0gKiAxMDAuMCk7Ci0gICAgICAgIE91dFsxXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAod091dFsxXSAqIDI1NS4wIC0gMTI4LjApOwotICAgICAgICBPdXRbMl0gPSAoY21zRmxvYXQzMk51bWJlcikgKHdPdXRbMl0gKiAyNTUuMCAtIDEyOC4wKTsKLQotICAgICAgICByZXR1cm4gb3V0cHV0ICsgKHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKSozICsgVF9FWFRSQShJbmZvIC0+T3V0cHV0Rm9ybWF0KSAqIHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKSk7Ci0gICAgfQotCi19Ci0KLQotc3RhdGljCi1jbXNVSW50OE51bWJlciogUGFja0xhYkRvdWJsZUZyb21GbG9hdChfY21zVFJBTlNGT1JNKiBJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50OE51bWJlciogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICBjbXNGbG9hdDY0TnVtYmVyKiBPdXQgPSAoY21zRmxvYXQ2NE51bWJlciopIG91dHB1dDsKLQotICAgIGlmIChUX1BMQU5BUihJbmZvIC0+IE91dHB1dEZvcm1hdCkpIHsKLQotICAgICAgICBPdXRbMF0gICAgICAgID0gKGNtc0Zsb2F0NjROdW1iZXIpICh3T3V0WzBdICogMTAwLjApOwotICAgICAgICBPdXRbU3RyaWRlXSAgID0gKGNtc0Zsb2F0NjROdW1iZXIpICh3T3V0WzFdICogMjU1LjAgLSAxMjguMCk7Ci0gICAgICAgIE91dFtTdHJpZGUqMl0gPSAoY21zRmxvYXQ2NE51bWJlcikgKHdPdXRbMl0gKiAyNTUuMCAtIDEyOC4wKTsKLQotICAgICAgICByZXR1cm4gb3V0cHV0ICsgc2l6ZW9mKGNtc0Zsb2F0NjROdW1iZXIpOwotICAgIH0KLSAgICBlbHNlIHsKLQotICAgICAgICBPdXRbMF0gPSAoY21zRmxvYXQ2NE51bWJlcikgKHdPdXRbMF0gKiAxMDAuMCk7Ci0gICAgICAgIE91dFsxXSA9IChjbXNGbG9hdDY0TnVtYmVyKSAod091dFsxXSAqIDI1NS4wIC0gMTI4LjApOwotICAgICAgICBPdXRbMl0gPSAoY21zRmxvYXQ2NE51bWJlcikgKHdPdXRbMl0gKiAyNTUuMCAtIDEyOC4wKTsKLQotICAgICAgICByZXR1cm4gb3V0cHV0ICsgKHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKSozICsgVF9FWFRSQShJbmZvIC0+T3V0cHV0Rm9ybWF0KSAqIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKSk7Ci0gICAgfQotCi19Ci0KLQotLy8gRnJvbSAwLi4xIHJhbmdlIHRvIDAuLk1BWF9FTkNPREVBQkxFX1hZWgotc3RhdGljCi1jbXNVSW50OE51bWJlciogUGFja1hZWkZsb2F0RnJvbUZsb2F0KF9jbXNUUkFOU0ZPUk0qIEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgd091dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50OE51bWJlciogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIGNtc0Zsb2F0MzJOdW1iZXIqIE91dCA9IChjbXNGbG9hdDMyTnVtYmVyKikgb3V0cHV0OwotCi0gICAgaWYgKFRfUExBTkFSKEluZm8gLT4gT3V0cHV0Rm9ybWF0KSkgewotCi0gICAgICAgIE91dFswXSAgICAgICAgPSAoY21zRmxvYXQzMk51bWJlcikgKHdPdXRbMF0gKiBNQVhfRU5DT0RFQUJMRV9YWVopOwotICAgICAgICBPdXRbU3RyaWRlXSAgID0gKGNtc0Zsb2F0MzJOdW1iZXIpICh3T3V0WzFdICogTUFYX0VOQ09ERUFCTEVfWFlaKTsKLSAgICAgICAgT3V0W1N0cmlkZSoyXSA9IChjbXNGbG9hdDMyTnVtYmVyKSAod091dFsyXSAqIE1BWF9FTkNPREVBQkxFX1hZWik7Ci0KLSAgICAgICAgcmV0dXJuIG91dHB1dCArIHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0KLSAgICAgICAgT3V0WzBdID0gKGNtc0Zsb2F0MzJOdW1iZXIpICh3T3V0WzBdICogTUFYX0VOQ09ERUFCTEVfWFlaKTsKLSAgICAgICAgT3V0WzFdID0gKGNtc0Zsb2F0MzJOdW1iZXIpICh3T3V0WzFdICogTUFYX0VOQ09ERUFCTEVfWFlaKTsKLSAgICAgICAgT3V0WzJdID0gKGNtc0Zsb2F0MzJOdW1iZXIpICh3T3V0WzJdICogTUFYX0VOQ09ERUFCTEVfWFlaKTsKLQotICAgICAgICByZXR1cm4gb3V0cHV0ICsgKHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKSozICsgVF9FWFRSQShJbmZvIC0+T3V0cHV0Rm9ybWF0KSAqIHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKSk7Ci0gICAgfQotCi19Ci0KLS8vIFNhbWUsIGJ1dCBjb252ZXJ0IHRvIGRvdWJsZQotc3RhdGljCi1jbXNVSW50OE51bWJlciogUGFja1hZWkRvdWJsZUZyb21GbG9hdChfY21zVFJBTlNGT1JNKiBJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50OE51bWJlciogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICBjbXNGbG9hdDY0TnVtYmVyKiBPdXQgPSAoY21zRmxvYXQ2NE51bWJlciopIG91dHB1dDsKLQotICAgIGlmIChUX1BMQU5BUihJbmZvIC0+IE91dHB1dEZvcm1hdCkpIHsKLQotICAgICAgICBPdXRbMF0gICAgICAgID0gKGNtc0Zsb2F0NjROdW1iZXIpICh3T3V0WzBdICogTUFYX0VOQ09ERUFCTEVfWFlaKTsKLSAgICAgICAgT3V0W1N0cmlkZV0gICA9IChjbXNGbG9hdDY0TnVtYmVyKSAod091dFsxXSAqIE1BWF9FTkNPREVBQkxFX1hZWik7Ci0gICAgICAgIE91dFtTdHJpZGUqMl0gPSAoY21zRmxvYXQ2NE51bWJlcikgKHdPdXRbMl0gKiBNQVhfRU5DT0RFQUJMRV9YWVopOwotCi0gICAgICAgIHJldHVybiBvdXRwdXQgKyBzaXplb2YoY21zRmxvYXQ2NE51bWJlcik7Ci0gICAgfQotICAgIGVsc2UgewotCi0gICAgICAgIE91dFswXSA9IChjbXNGbG9hdDY0TnVtYmVyKSAod091dFswXSAqIE1BWF9FTkNPREVBQkxFX1hZWik7Ci0gICAgICAgIE91dFsxXSA9IChjbXNGbG9hdDY0TnVtYmVyKSAod091dFsxXSAqIE1BWF9FTkNPREVBQkxFX1hZWik7Ci0gICAgICAgIE91dFsyXSA9IChjbXNGbG9hdDY0TnVtYmVyKSAod091dFsyXSAqIE1BWF9FTkNPREVBQkxFX1hZWik7Ci0KLSAgICAgICAgcmV0dXJuIG91dHB1dCArIChzaXplb2YoY21zRmxvYXQ2NE51bWJlcikqMyArIFRfRVhUUkEoSW5mbyAtPk91dHB1dEZvcm1hdCkgKiBzaXplb2YoY21zRmxvYXQ2NE51bWJlcikpOwotICAgIH0KLQotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmbmRlZiBDTVNfTk9fSEFMRl9TVVBQT1JUIAotCi0vLyBEZWNvZGVzIGFuIHN0cmVhbSBvZiBoYWxmIGZsb2F0cyB0byB3SW5bXSBkZXNjcmliZWQgYnkgaW5wdXQgZm9ybWF0Ci0KLXN0YXRpYwotY21zVUludDhOdW1iZXIqIFVucm9sbEhhbGZUbzE2KHJlZ2lzdGVyIF9jbXNUUkFOU0ZPUk0qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciB3SW5bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIGFjY3VtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotCi0gICAgaW50IG5DaGFuICAgICAgPSBUX0NIQU5ORUxTKGluZm8gLT4gSW5wdXRGb3JtYXQpOwotICAgIGludCBEb1N3YXAgICAgID0gVF9ET1NXQVAoaW5mbyAtPklucHV0Rm9ybWF0KTsKLSAgICBpbnQgUmV2ZXJzZSAgICA9IFRfRkxBVk9SKGluZm8gLT5JbnB1dEZvcm1hdCk7Ci0gICAgaW50IFN3YXBGaXJzdCAgPSBUX1NXQVBGSVJTVChpbmZvIC0+IElucHV0Rm9ybWF0KTsKLSAgICBpbnQgRXh0cmEgICAgICA9IFRfRVhUUkEoaW5mbyAtPiBJbnB1dEZvcm1hdCk7Ci0gICAgaW50IEV4dHJhRmlyc3QgPSBEb1N3YXAgXiBTd2FwRmlyc3Q7Ci0gICAgaW50IFBsYW5hciAgICAgPSBUX1BMQU5BUihpbmZvIC0+IElucHV0Rm9ybWF0KTsKLSAgICBjbXNGbG9hdDMyTnVtYmVyIHY7Ci0gICAgaW50IGksIHN0YXJ0ID0gMDsKLSAgICBjbXNGbG9hdDMyTnVtYmVyIG1heGltdW0gPSBJc0lua1NwYWNlKGluZm8gLT5JbnB1dEZvcm1hdCkgPyA2NTUuMzVGIDogNjU1MzUuMEY7Ci0KLQotICAgIGlmIChFeHRyYUZpcnN0KQotICAgICAgICAgICAgc3RhcnQgPSBFeHRyYTsKLQotICAgIGZvciAoaT0wOyBpIDwgbkNoYW47IGkrKykgewotCi0gICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7Ci0KLSAgICAgICAgaWYgKFBsYW5hcikKLSAgICAgICAgICAgIHYgPSBfY21zSGFsZjJGbG9hdCAoICgoY21zVUludDE2TnVtYmVyKikgYWNjdW0pWyhpICsgc3RhcnQpICogU3RyaWRlXSApOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICB2ID0gX2Ntc0hhbGYyRmxvYXQgKCAoKGNtc1VJbnQxNk51bWJlciopIGFjY3VtKVtpICsgc3RhcnRdICkgOwotCi0gICAgICAgIGlmIChSZXZlcnNlKSB2ID0gbWF4aW11bSAtIHY7Ci0KLSAgICAgICAgd0luW2luZGV4XSA9IF9jbXNRdWlja1NhdHVyYXRlV29yZCh2ICogbWF4aW11bSk7Ci0gICAgfQotCi0KLSAgICBpZiAoRXh0cmEgPT0gMCAmJiBTd2FwRmlyc3QpIHsKLSAgICAgICAgY21zVUludDE2TnVtYmVyIHRtcCA9IHdJblswXTsKLQotICAgICAgICBtZW1tb3ZlKCZ3SW5bMF0sICZ3SW5bMV0sIChuQ2hhbi0xKSAqIHNpemVvZihjbXNVSW50MTZOdW1iZXIpKTsKLSAgICAgICAgd0luW25DaGFuLTFdID0gdG1wOwotICAgIH0KLQotICAgIGlmIChUX1BMQU5BUihpbmZvIC0+IElucHV0Rm9ybWF0KSkKLSAgICAgICAgcmV0dXJuIGFjY3VtICsgc2l6ZW9mKGNtc1VJbnQxNk51bWJlcik7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gYWNjdW0gKyAobkNoYW4gKyBFeHRyYSkgKiBzaXplb2YoY21zVUludDE2TnVtYmVyKTsKLX0KLQotLy8gRGVjb2RlcyBhbiBzdHJlYW0gb2YgaGFsZiBmbG9hdHMgdG8gd0luW10gZGVzY3JpYmVkIGJ5IGlucHV0IGZvcm1hdAotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBVbnJvbGxIYWxmVG9GbG9hdChfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciB3SW5bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQ4TnVtYmVyKiBhY2N1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0KLSAgICBpbnQgbkNoYW4gICAgICA9IFRfQ0hBTk5FTFMoaW5mbyAtPiBJbnB1dEZvcm1hdCk7Ci0gICAgaW50IERvU3dhcCAgICAgPSBUX0RPU1dBUChpbmZvIC0+SW5wdXRGb3JtYXQpOwotICAgIGludCBSZXZlcnNlICAgID0gVF9GTEFWT1IoaW5mbyAtPklucHV0Rm9ybWF0KTsKLSAgICBpbnQgU3dhcEZpcnN0ICA9IFRfU1dBUEZJUlNUKGluZm8gLT4gSW5wdXRGb3JtYXQpOwotICAgIGludCBFeHRyYSAgICAgID0gVF9FWFRSQShpbmZvIC0+IElucHV0Rm9ybWF0KTsKLSAgICBpbnQgRXh0cmFGaXJzdCA9IERvU3dhcCBeIFN3YXBGaXJzdDsKLSAgICBpbnQgUGxhbmFyICAgICA9IFRfUExBTkFSKGluZm8gLT4gSW5wdXRGb3JtYXQpOwotICAgIGNtc0Zsb2F0MzJOdW1iZXIgdjsKLSAgICBpbnQgaSwgc3RhcnQgPSAwOwotICAgIGNtc0Zsb2F0MzJOdW1iZXIgbWF4aW11bSA9IElzSW5rU3BhY2UoaW5mbyAtPklucHV0Rm9ybWF0KSA/IDEwMC4wRiA6IDEuMEY7Ci0KLQotICAgIGlmIChFeHRyYUZpcnN0KQotICAgICAgICAgICAgc3RhcnQgPSBFeHRyYTsKLQotICAgIGZvciAoaT0wOyBpIDwgbkNoYW47IGkrKykgewotCi0gICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7Ci0KLSAgICAgICAgaWYgKFBsYW5hcikKLSAgICAgICAgICAgIHYgPSAgX2Ntc0hhbGYyRmxvYXQgKCAoKGNtc1VJbnQxNk51bWJlciopIGFjY3VtKVsoaSArIHN0YXJ0KSAqIFN0cmlkZV0gKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgdiA9ICBfY21zSGFsZjJGbG9hdCAoICgoY21zVUludDE2TnVtYmVyKikgYWNjdW0pW2kgKyBzdGFydF0gKSA7Ci0KLSAgICAgICAgdiAvPSBtYXhpbXVtOwotCi0gICAgICAgIHdJbltpbmRleF0gPSBSZXZlcnNlID8gMSAtIHYgOiB2OwotICAgIH0KLQotCi0gICAgaWYgKEV4dHJhID09IDAgJiYgU3dhcEZpcnN0KSB7Ci0gICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgdG1wID0gd0luWzBdOwotCi0gICAgICAgIG1lbW1vdmUoJndJblswXSwgJndJblsxXSwgKG5DaGFuLTEpICogc2l6ZW9mKGNtc0Zsb2F0MzJOdW1iZXIpKTsKLSAgICAgICAgd0luW25DaGFuLTFdID0gdG1wOwotICAgIH0KLQotICAgIGlmIChUX1BMQU5BUihpbmZvIC0+IElucHV0Rm9ybWF0KSkKLSAgICAgICAgcmV0dXJuIGFjY3VtICsgc2l6ZW9mKGNtc1VJbnQxNk51bWJlcik7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gYWNjdW0gKyAobkNoYW4gKyBFeHRyYSkgKiBzaXplb2YoY21zVUludDE2TnVtYmVyKTsKLX0KLQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrSGFsZkZyb20xNihyZWdpc3RlciBfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgd091dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotewotICAgIGludCBuQ2hhbiAgICAgID0gVF9DSEFOTkVMUyhpbmZvIC0+IE91dHB1dEZvcm1hdCk7Ci0gICAgaW50IERvU3dhcCAgICAgPSBUX0RPU1dBUChpbmZvIC0+T3V0cHV0Rm9ybWF0KTsKLSAgICBpbnQgUmV2ZXJzZSAgICA9IFRfRkxBVk9SKGluZm8gLT5PdXRwdXRGb3JtYXQpOwotICAgIGludCBFeHRyYSAgICAgID0gVF9FWFRSQShpbmZvIC0+IE91dHB1dEZvcm1hdCk7Ci0gICAgaW50IFN3YXBGaXJzdCAgPSBUX1NXQVBGSVJTVChpbmZvIC0+IE91dHB1dEZvcm1hdCk7Ci0gICAgaW50IFBsYW5hciAgICAgPSBUX1BMQU5BUihpbmZvIC0+IE91dHB1dEZvcm1hdCk7Ci0gICAgaW50IEV4dHJhRmlyc3QgPSBEb1N3YXAgXiBTd2FwRmlyc3Q7Ci0gICAgY21zRmxvYXQzMk51bWJlciBtYXhpbXVtID0gSXNJbmtTcGFjZShpbmZvIC0+T3V0cHV0Rm9ybWF0KSA/IDY1NS4zNUYgOiA2NTUzNS4wRjsKLSAgICBjbXNGbG9hdDMyTnVtYmVyIHYgPSAwOwotICAgIGNtc1VJbnQxNk51bWJlciogc3dhcDEgPSAoY21zVUludDE2TnVtYmVyKikgb3V0cHV0OwotICAgIGludCBpLCBzdGFydCA9IDA7Ci0KLSAgICBpZiAoRXh0cmFGaXJzdCkKLSAgICAgICAgc3RhcnQgPSBFeHRyYTsKLQotICAgIGZvciAoaT0wOyBpIDwgbkNoYW47IGkrKykgewotCi0gICAgICAgIGludCBpbmRleCA9IERvU3dhcCA/IChuQ2hhbiAtIGkgLSAxKSA6IGk7Ci0KLSAgICAgICAgdiA9IChjbXNGbG9hdDMyTnVtYmVyKSB3T3V0W2luZGV4XSAvIG1heGltdW07Ci0KLSAgICAgICAgaWYgKFJldmVyc2UpCi0gICAgICAgICAgICB2ID0gbWF4aW11bSAtIHY7Ci0KLSAgICAgICAgaWYgKFBsYW5hcikKLSAgICAgICAgICAgICgoY21zVUludDE2TnVtYmVyKikgb3V0cHV0KVsoaSArIHN0YXJ0ICkgKiBTdHJpZGVdPSBfY21zRmxvYXQySGFsZih2KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgKChjbXNVSW50MTZOdW1iZXIqKSBvdXRwdXQpW2kgKyBzdGFydF0gPSAgX2Ntc0Zsb2F0MkhhbGYodik7Ci0gICAgfQotCi0gICAgaWYgKCFFeHRyYUZpcnN0KSB7Ci0gICAgICAgIG91dHB1dCArPSBFeHRyYSAqIHNpemVvZihjbXNVSW50MTZOdW1iZXIpOwotICAgIH0KLQotICBpZiAoRXh0cmEgPT0gMCAmJiBTd2FwRmlyc3QpIHsKLQotICAgICAgICAgbWVtbW92ZShzd2FwMSArIDEsIHN3YXAxLCAobkNoYW4tMSkqIHNpemVvZihjbXNVSW50MTZOdW1iZXIpKTsKLSAgICAgICAgKnN3YXAxID0gX2Ntc0Zsb2F0MkhhbGYodik7Ci0gICAgfQotCi0gICAgaWYgKFRfUExBTkFSKGluZm8gLT4gT3V0cHV0Rm9ybWF0KSkKLSAgICAgICAgcmV0dXJuIG91dHB1dCArIHNpemVvZihjbXNVSW50MTZOdW1iZXIpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG91dHB1dCArIG5DaGFuICogc2l6ZW9mKGNtc1VJbnQxNk51bWJlcik7Ci19Ci0KLQotCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyKiBQYWNrSGFsZkZyb21GbG9hdChfY21zVFJBTlNGT1JNKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciB3T3V0W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50OE51bWJlciogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICBpbnQgbkNoYW4gICAgICA9IFRfQ0hBTk5FTFMoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOwotICAgIGludCBEb1N3YXAgICAgID0gVF9ET1NXQVAoaW5mbyAtPk91dHB1dEZvcm1hdCk7Ci0gICAgaW50IFJldmVyc2UgICAgPSBUX0ZMQVZPUihpbmZvIC0+T3V0cHV0Rm9ybWF0KTsKLSAgICBpbnQgRXh0cmEgICAgICA9IFRfRVhUUkEoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOwotICAgIGludCBTd2FwRmlyc3QgID0gVF9TV0FQRklSU1QoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOwotICAgIGludCBQbGFuYXIgICAgID0gVF9QTEFOQVIoaW5mbyAtPiBPdXRwdXRGb3JtYXQpOwotICAgIGludCBFeHRyYUZpcnN0ID0gRG9Td2FwIF4gU3dhcEZpcnN0OwotICAgIGNtc0Zsb2F0MzJOdW1iZXIgbWF4aW11bSA9IElzSW5rU3BhY2UoaW5mbyAtPk91dHB1dEZvcm1hdCkgPyAxMDAuMEYgOiAxLjBGOwotICAgIGNtc1VJbnQxNk51bWJlciogc3dhcDEgPSAoY21zVUludDE2TnVtYmVyKikgb3V0cHV0OwotICAgIGNtc0Zsb2F0MzJOdW1iZXIgdiA9IDA7Ci0gICAgaW50IGksIHN0YXJ0ID0gMDsKLQotICAgIGlmIChFeHRyYUZpcnN0KQotICAgICAgICBzdGFydCA9IEV4dHJhOwotCi0gICAgZm9yIChpPTA7IGkgPCBuQ2hhbjsgaSsrKSB7Ci0KLSAgICAgICAgaW50IGluZGV4ID0gRG9Td2FwID8gKG5DaGFuIC0gaSAtIDEpIDogaTsKLQotICAgICAgICB2ID0gd091dFtpbmRleF0gKiBtYXhpbXVtOwotCi0gICAgICAgIGlmIChSZXZlcnNlKQotICAgICAgICAgICAgdiA9IG1heGltdW0gLSB2OwotCi0gICAgICAgIGlmIChQbGFuYXIpCi0gICAgICAgICAgICAoKGNtc1VJbnQxNk51bWJlciopIG91dHB1dClbKGkgKyBzdGFydCkqIFN0cmlkZV09IF9jbXNGbG9hdDJIYWxmKCB2ICk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICgoY21zVUludDE2TnVtYmVyKikgb3V0cHV0KVtpICsgc3RhcnRdID0gX2Ntc0Zsb2F0MkhhbGYoIHYgKTsKLSAgICB9Ci0KLSAgICBpZiAoIUV4dHJhRmlyc3QpIHsKLSAgICAgICAgb3V0cHV0ICs9IEV4dHJhICogc2l6ZW9mKGNtc1VJbnQxNk51bWJlcik7Ci0gICAgfQotCi0gICBpZiAoRXh0cmEgPT0gMCAmJiBTd2FwRmlyc3QpIHsKLQotICAgICAgICAgbWVtbW92ZShzd2FwMSArIDEsIHN3YXAxLCAobkNoYW4tMSkqIHNpemVvZihjbXNVSW50MTZOdW1iZXIpKTsKLSAgICAgICAgKnN3YXAxID0gKGNtc1VJbnQxNk51bWJlcikgIF9jbXNGbG9hdDJIYWxmKCB2ICk7Ci0gICAgfQotCi0gICAgaWYgKFRfUExBTkFSKGluZm8gLT4gT3V0cHV0Rm9ybWF0KSkKLSAgICAgICAgcmV0dXJuIG91dHB1dCArIHNpemVvZihjbXNVSW50MTZOdW1iZXIpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG91dHB1dCArIG5DaGFuICogc2l6ZW9mKGNtc1VJbnQxNk51bWJlcik7Ci19Ci0KLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotc3RhdGljIGNtc0Zvcm1hdHRlcnMxNiBJbnB1dEZvcm1hdHRlcnMxNltdID0gewotCi0gICAgLy8gICAgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hc2sgICAgICAgICAgICAgICAgICBGdW5jdGlvbgotICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgeyBUWVBFX0xhYl9EQkwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZUExBTkFSfEFOWUVYVFJBLCAgIFVucm9sbExhYkRvdWJsZVRvMTZ9LAotICAgIHsgVFlQRV9YWVpfREJMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVBMQU5BUnxBTllFWFRSQSwgICBVbnJvbGxYWVpEb3VibGVUbzE2fSwKLSAgICB7IFRZUEVfTGFiX0ZMVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllQTEFOQVJ8QU5ZRVhUUkEsICAgVW5yb2xsTGFiRmxvYXRUbzE2fSwKLSAgICB7IFRZUEVfWFlaX0ZMVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllQTEFOQVJ8QU5ZRVhUUkEsICAgVW5yb2xsWFlaRmxvYXRUbzE2fSwKLSAgICB7IFRZUEVfR1JBWV9EQkwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgVW5yb2xsRG91YmxlMUNoYW59LAotICAgIHsgRkxPQVRfU0goMSl8QllURVNfU0goMCksIEFOWUNIQU5ORUxTfEFOWVBMQU5BUnxBTllTV0FQRklSU1R8QU5ZRkxBVk9SfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZU1dBUHxBTllFWFRSQXxBTllTUEFDRSwgICBVbnJvbGxEb3VibGVUbzE2fSwKLSAgICB7IEZMT0FUX1NIKDEpfEJZVEVTX1NIKDQpLCBBTllDSEFOTkVMU3xBTllQTEFOQVJ8QU5ZU1dBUEZJUlNUfEFOWUZMQVZPUnwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVNXQVB8QU5ZRVhUUkF8QU5ZU1BBQ0UsICAgVW5yb2xsRmxvYXRUbzE2fSwKLSNpZm5kZWYgQ01TX05PX0hBTEZfU1VQUE9SVCAKLSAgICB7IEZMT0FUX1NIKDEpfEJZVEVTX1NIKDIpLCBBTllDSEFOTkVMU3xBTllQTEFOQVJ8QU5ZU1dBUEZJUlNUfEFOWUZMQVZPUnwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZRVhUUkF8QU5ZU1dBUHxBTllTUEFDRSwgICBVbnJvbGxIYWxmVG8xNn0sCi0jZW5kaWYKLQotICAgIHsgQ0hBTk5FTFNfU0goMSl8QllURVNfU0goMSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBVbnJvbGwxQnl0ZX0sCi0gICAgeyBDSEFOTkVMU19TSCgxKXxCWVRFU19TSCgxKXxFWFRSQV9TSCgxKSwgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFVucm9sbDFCeXRlU2tpcDF9LAotICAgIHsgQ0hBTk5FTFNfU0goMSl8QllURVNfU0goMSl8RVhUUkFfU0goMiksICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBVbnJvbGwxQnl0ZVNraXAyfSwKLSAgICB7IENIQU5ORUxTX1NIKDEpfEJZVEVTX1NIKDEpfEZMQVZPUl9TSCgxKSwgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgVW5yb2xsMUJ5dGVSZXZlcnNlZH0sCi0gICAgeyBDT0xPUlNQQUNFX1NIKFBUX01DSDIpfENIQU5ORUxTX1NIKDIpfEJZVEVTX1NIKDEpLCAgICAgICAgICAgICAgMCwgIFVucm9sbDJCeXRlc30sCi0KLSAgICB7IFRZUEVfTGFiVjJfOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgVW5yb2xsTGFiVjJfOCB9LAotICAgIHsgVFlQRV9BTGFiVjJfOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICBVbnJvbGxBTGFiVjJfOCB9LAotICAgIHsgVFlQRV9MYWJWMl8xNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICBVbnJvbGxMYWJWMl8xNiB9LAotCi0gICAgeyBDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFVucm9sbDNCeXRlc30sCi0gICAgeyBDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKXxET1NXQVBfU0goMSksICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFVucm9sbDNCeXRlc1N3YXB9LAotICAgIHsgQ0hBTk5FTFNfU0goMyl8RVhUUkFfU0goMSl8QllURVNfU0goMSl8RE9TV0FQX1NIKDEpLCAgICAgQU5ZU1BBQ0UsICBVbnJvbGwzQnl0ZXNTa2lwMVN3YXB9LAotICAgIHsgQ0hBTk5FTFNfU0goMyl8RVhUUkFfU0goMSl8QllURVNfU0goMSl8U1dBUEZJUlNUX1NIKDEpLCAgQU5ZU1BBQ0UsICBVbnJvbGwzQnl0ZXNTa2lwMVN3YXBGaXJzdH0sCi0KLSAgICB7IENIQU5ORUxTX1NIKDMpfEVYVFJBX1NIKDEpfEJZVEVTX1NIKDEpfERPU1dBUF9TSCgxKXxTV0FQRklSU1RfU0goMSksICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgVW5yb2xsM0J5dGVzU2tpcDFTd2FwU3dhcEZpcnN0fSwKLQotICAgIHsgQ0hBTk5FTFNfU0goNCl8QllURVNfU0goMSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBVbnJvbGw0Qnl0ZXN9LAotICAgIHsgQ0hBTk5FTFNfU0goNCl8QllURVNfU0goMSl8RkxBVk9SX1NIKDEpLCAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBVbnJvbGw0Qnl0ZXNSZXZlcnNlfSwKLSAgICB7IENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDEpfFNXQVBGSVJTVF9TSCgxKSwgICAgICAgICAgICAgIEFOWVNQQUNFLCAgVW5yb2xsNEJ5dGVzU3dhcEZpcnN0fSwKLSAgICB7IENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDEpfERPU1dBUF9TSCgxKSwgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgVW5yb2xsNEJ5dGVzU3dhcH0sCi0gICAgeyBDSEFOTkVMU19TSCg0KXxCWVRFU19TSCgxKXxET1NXQVBfU0goMSl8U1dBUEZJUlNUX1NIKDEpLCBBTllTUEFDRSwgIFVucm9sbDRCeXRlc1N3YXBTd2FwRmlyc3R9LAotCi0gICAgeyBCWVRFU19TSCgxKXxQTEFOQVJfU0goMSksIEFOWUZMQVZPUnxBTllTV0FQRklSU1R8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVNXQVB8QU5ZRVhUUkF8QU5ZQ0hBTk5FTFN8QU5ZU1BBQ0UsIFVucm9sbFBsYW5hckJ5dGVzfSwKLQotICAgIHsgQllURVNfU0goMSksICAgIEFOWUZMQVZPUnxBTllTV0FQRklSU1R8QU5ZU1dBUHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllFWFRSQXxBTllDSEFOTkVMU3xBTllTUEFDRSwgVW5yb2xsQ2h1bmt5Qnl0ZXN9LAotCi0gICAgeyBDSEFOTkVMU19TSCgxKXxCWVRFU19TSCgyKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFVucm9sbDFXb3JkfSwKLSAgICB7IENIQU5ORUxTX1NIKDEpfEJZVEVTX1NIKDIpfEZMQVZPUl9TSCgxKSwgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgVW5yb2xsMVdvcmRSZXZlcnNlZH0sCi0gICAgeyBDSEFOTkVMU19TSCgxKXxCWVRFU19TSCgyKXxFWFRSQV9TSCgzKSwgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFVucm9sbDFXb3JkU2tpcDN9LAotCi0gICAgeyBDSEFOTkVMU19TSCgyKXxCWVRFU19TSCgyKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFVucm9sbDJXb3Jkc30sCi0gICAgeyBDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFVucm9sbDNXb3Jkc30sCi0gICAgeyBDSEFOTkVMU19TSCg0KXxCWVRFU19TSCgyKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFVucm9sbDRXb3Jkc30sCi0KLSAgICB7IENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfERPU1dBUF9TSCgxKSwgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgVW5yb2xsM1dvcmRzU3dhcH0sCi0gICAgeyBDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxFWFRSQV9TSCgxKXxTV0FQRklSU1RfU0goMSksICBBTllTUEFDRSwgIFVucm9sbDNXb3Jkc1NraXAxU3dhcEZpcnN0fSwKLSAgICB7IENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpfEVYVFJBX1NIKDEpfERPU1dBUF9TSCgxKSwgICAgIEFOWVNQQUNFLCAgVW5yb2xsM1dvcmRzU2tpcDFTd2FwfSwKLSAgICB7IENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDIpfEZMQVZPUl9TSCgxKSwgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgVW5yb2xsNFdvcmRzUmV2ZXJzZX0sCi0gICAgeyBDSEFOTkVMU19TSCg0KXxCWVRFU19TSCgyKXxTV0FQRklSU1RfU0goMSksICAgICAgICAgICAgICBBTllTUEFDRSwgIFVucm9sbDRXb3Jkc1N3YXBGaXJzdH0sCi0gICAgeyBDSEFOTkVMU19TSCg0KXxCWVRFU19TSCgyKXxET1NXQVBfU0goMSksICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFVucm9sbDRXb3Jkc1N3YXB9LAotICAgIHsgQ0hBTk5FTFNfU0goNCl8QllURVNfU0goMil8RE9TV0FQX1NIKDEpfFNXQVBGSVJTVF9TSCgxKSwgQU5ZU1BBQ0UsICBVbnJvbGw0V29yZHNTd2FwU3dhcEZpcnN0fSwKLQotCi0gICAgeyBCWVRFU19TSCgyKXxQTEFOQVJfU0goMSksICBBTllGTEFWT1J8QU5ZU1dBUHxBTllFTkRJQU58QU5ZRVhUUkF8QU5ZQ0hBTk5FTFN8QU5ZU1BBQ0UsICBVbnJvbGxQbGFuYXJXb3Jkc30sCi0gICAgeyBCWVRFU19TSCgyKSwgIEFOWUZMQVZPUnxBTllTV0FQRklSU1R8QU5ZU1dBUHxBTllFTkRJQU58QU5ZRVhUUkF8QU5ZQ0hBTk5FTFN8QU5ZU1BBQ0UsICBVbnJvbGxBbnlXb3Jkc30sCi19OwotCi0KLQotc3RhdGljIGNtc0Zvcm1hdHRlcnNGbG9hdCBJbnB1dEZvcm1hdHRlcnNGbG9hdFtdID0gewotCi0gICAgLy8gICAgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hc2sgICAgICAgICAgICAgICAgICBGdW5jdGlvbgotICAgIC8vICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgeyAgICAgVFlQRV9MYWJfREJMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZUExBTkFSfEFOWUVYVFJBLCAgIFVucm9sbExhYkRvdWJsZVRvRmxvYXR9LAotICAgIHsgICAgIFRZUEVfTGFiX0ZMVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVBMQU5BUnxBTllFWFRSQSwgICBVbnJvbGxMYWJGbG9hdFRvRmxvYXR9LAotCi0gICAgeyAgICAgVFlQRV9YWVpfREJMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZUExBTkFSfEFOWUVYVFJBLCAgIFVucm9sbFhZWkRvdWJsZVRvRmxvYXR9LAotICAgIHsgICAgIFRZUEVfWFlaX0ZMVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVBMQU5BUnxBTllFWFRSQSwgICBVbnJvbGxYWVpGbG9hdFRvRmxvYXR9LAotCi0gICAgeyAgICAgRkxPQVRfU0goMSl8QllURVNfU0goNCksIEFOWVBMQU5BUnxBTllTV0FQRklSU1R8QU5ZU1dBUHxBTllFWFRSQXwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWUNIQU5ORUxTfEFOWVNQQUNFLCAgVW5yb2xsRmxvYXRzVG9GbG9hdH0sCi0KLSAgICB7ICAgICBGTE9BVF9TSCgxKXxCWVRFU19TSCgwKSwgQU5ZUExBTkFSfEFOWVNXQVBGSVJTVHxBTllTV0FQfEFOWUVYVFJBfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllDSEFOTkVMU3xBTllTUEFDRSwgIFVucm9sbERvdWJsZXNUb0Zsb2F0fSwKLSNpZm5kZWYgQ01TX05PX0hBTEZfU1VQUE9SVCAKLSAgICB7ICAgICBGTE9BVF9TSCgxKXxCWVRFU19TSCgyKSwgQU5ZUExBTkFSfEFOWVNXQVBGSVJTVHxBTllTV0FQfEFOWUVYVFJBfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllDSEFOTkVMU3xBTllTUEFDRSwgIFVucm9sbEhhbGZUb0Zsb2F0fSwKLSNlbmRpZgotfTsKLQotCi0vLyBCaXQgZmllbGRzIHNldCB0byBvbmUgaW4gdGhlIG1hc2sgYXJlIG5vdCBjb21wYXJlZAotc3RhdGljCi1jbXNGb3JtYXR0ZXIgX2Ntc0dldFN0b2NrSW5wdXRGb3JtYXR0ZXIoY21zVUludDMyTnVtYmVyIGR3SW5wdXQsIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKQotewotICAgIGNtc1VJbnQzMk51bWJlciBpOwotICAgIGNtc0Zvcm1hdHRlciBmcjsKLQotICAgIHN3aXRjaCAoZHdGbGFncykgewotCi0gICAgY2FzZSBDTVNfUEFDS19GTEFHU18xNkJJVFM6IHsKLSAgICAgICAgZm9yIChpPTA7IGkgPCBzaXplb2YoSW5wdXRGb3JtYXR0ZXJzMTYpIC8gc2l6ZW9mKGNtc0Zvcm1hdHRlcnMxNik7IGkrKykgewotICAgICAgICAgICAgY21zRm9ybWF0dGVyczE2KiBmID0gSW5wdXRGb3JtYXR0ZXJzMTYgKyBpOwotCi0gICAgICAgICAgICBpZiAoKGR3SW5wdXQgJiB+ZiAtPk1hc2spID09IGYgLT5UeXBlKSB7Ci0gICAgICAgICAgICAgICAgZnIuRm10MTYgPSBmIC0+RnJtOwotICAgICAgICAgICAgICAgIHJldHVybiBmcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLQotICAgIGNhc2UgQ01TX1BBQ0tfRkxBR1NfRkxPQVQ6IHsKLSAgICAgICAgZm9yIChpPTA7IGkgPCBzaXplb2YoSW5wdXRGb3JtYXR0ZXJzRmxvYXQpIC8gc2l6ZW9mKGNtc0Zvcm1hdHRlcnNGbG9hdCk7IGkrKykgewotICAgICAgICAgICAgY21zRm9ybWF0dGVyc0Zsb2F0KiBmID0gSW5wdXRGb3JtYXR0ZXJzRmxvYXQgKyBpOwotCi0gICAgICAgICAgICBpZiAoKGR3SW5wdXQgJiB+ZiAtPk1hc2spID09IGYgLT5UeXBlKSB7Ci0gICAgICAgICAgICAgICAgZnIuRm10RmxvYXQgPSBmIC0+RnJtOwotICAgICAgICAgICAgICAgIHJldHVybiBmcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6OwotCi0gICAgfQotCi0gICAgZnIuRm10MTYgPSBOVUxMOwotICAgIHJldHVybiBmcjsKLX0KLQotc3RhdGljIGNtc0Zvcm1hdHRlcnMxNiBPdXRwdXRGb3JtYXR0ZXJzMTZbXSA9IHsKLSAgICAvLyAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFzayAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uCi0gICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHsgVFlQRV9MYWJfREJMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZUExBTkFSfEFOWUVYVFJBLCAgUGFja0xhYkRvdWJsZUZyb20xNn0sCi0gICAgeyBUWVBFX1hZWl9EQkwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllQTEFOQVJ8QU5ZRVhUUkEsICBQYWNrWFlaRG91YmxlRnJvbTE2fSwKLQotICAgIHsgVFlQRV9MYWJfRkxULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZUExBTkFSfEFOWUVYVFJBLCAgUGFja0xhYkZsb2F0RnJvbTE2fSwKLSAgICB7IFRZUEVfWFlaX0ZMVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVBMQU5BUnxBTllFWFRSQSwgIFBhY2tYWVpGbG9hdEZyb20xNn0sCi0gICAgCi0gICAgeyBGTE9BVF9TSCgxKXxCWVRFU19TSCgwKSwgICAgICBBTllGTEFWT1J8QU5ZU1dBUEZJUlNUfEFOWVNXQVB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllDSEFOTkVMU3xBTllQTEFOQVJ8QU5ZRVhUUkF8QU5ZU1BBQ0UsICBQYWNrRG91YmxlRnJvbTE2fSwKLSAgICB7IEZMT0FUX1NIKDEpfEJZVEVTX1NIKDQpLCAgICAgIEFOWUZMQVZPUnxBTllTV0FQRklSU1R8QU5ZU1dBUHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWUNIQU5ORUxTfEFOWVBMQU5BUnxBTllFWFRSQXxBTllTUEFDRSwgIFBhY2tGbG9hdEZyb20xNn0sCi0jaWZuZGVmIENNU19OT19IQUxGX1NVUFBPUlQgCi0gICAgeyBGTE9BVF9TSCgxKXxCWVRFU19TSCgyKSwgICAgICBBTllGTEFWT1J8QU5ZU1dBUEZJUlNUfEFOWVNXQVB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllDSEFOTkVMU3xBTllQTEFOQVJ8QU5ZRVhUUkF8QU5ZU1BBQ0UsICBQYWNrSGFsZkZyb20xNn0sCi0jZW5kaWYKLQotICAgIHsgQ0hBTk5FTFNfU0goMSl8QllURVNfU0goMSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazFCeXRlfSwKLSAgICB7IENIQU5ORUxTX1NIKDEpfEJZVEVTX1NIKDEpfEVYVFJBX1NIKDEpLCAgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2sxQnl0ZVNraXAxfSwKLSAgICB7IENIQU5ORUxTX1NIKDEpfEJZVEVTX1NIKDEpfEVYVFJBX1NIKDEpfFNXQVBGSVJTVF9TSCgxKSwgICAgICBBTllTUEFDRSwgIFBhY2sxQnl0ZVNraXAxU3dhcEZpcnN0fSwKLQotICAgIHsgQ0hBTk5FTFNfU0goMSl8QllURVNfU0goMSl8RkxBVk9SX1NIKDEpLCAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazFCeXRlUmV2ZXJzZWR9LAotCi0gICAgeyBUWVBFX0xhYlYyXzgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICBQYWNrTGFiVjJfOCB9LAotICAgIHsgVFlQRV9BTGFiVjJfOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgUGFja0FMYWJWMl84IH0sCi0gICAgeyBUWVBFX0xhYlYyXzE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICBQYWNrTGFiVjJfMTYgfSwKLQotICAgIHsgQ0hBTk5FTFNfU0goMyl8QllURVNfU0goMSl8T1BUSU1JWkVEX1NIKDEpLCAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazNCeXRlc09wdGltaXplZH0sCi0gICAgeyBDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKXxFWFRSQV9TSCgxKXxPUFRJTUlaRURfU0goMSksICAgICAgQU5ZU1BBQ0UsICBQYWNrM0J5dGVzQW5kU2tpcDFPcHRpbWl6ZWR9LAotICAgIHsgQ0hBTk5FTFNfU0goMyl8QllURVNfU0goMSl8RVhUUkFfU0goMSl8U1dBUEZJUlNUX1NIKDEpfE9QVElNSVpFRF9TSCgxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2szQnl0ZXNBbmRTa2lwMVN3YXBGaXJzdE9wdGltaXplZH0sCi0gICAgeyBDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKXxFWFRSQV9TSCgxKXxET1NXQVBfU0goMSl8U1dBUEZJUlNUX1NIKDEpfE9QVElNSVpFRF9TSCgxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2szQnl0ZXNBbmRTa2lwMVN3YXBTd2FwRmlyc3RPcHRpbWl6ZWR9LAotICAgIHsgQ0hBTk5FTFNfU0goMyl8QllURVNfU0goMSl8RE9TV0FQX1NIKDEpfEVYVFJBX1NIKDEpfE9QVElNSVpFRF9TSCgxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2szQnl0ZXNBbmRTa2lwMVN3YXBPcHRpbWl6ZWR9LAotICAgIHsgQ0hBTk5FTFNfU0goMyl8QllURVNfU0goMSl8RE9TV0FQX1NIKDEpfE9QVElNSVpFRF9TSCgxKSwgICAgIEFOWVNQQUNFLCAgUGFjazNCeXRlc1N3YXBPcHRpbWl6ZWR9LAotCi0KLQotICAgIHsgQ0hBTk5FTFNfU0goMyl8QllURVNfU0goMSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazNCeXRlc30sCi0gICAgeyBDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgxKXxFWFRSQV9TSCgxKSwgICAgICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBQYWNrM0J5dGVzQW5kU2tpcDF9LAotICAgIHsgQ0hBTk5FTFNfU0goMyl8QllURVNfU0goMSl8RVhUUkFfU0goMSl8U1dBUEZJUlNUX1NIKDEpLCAgICAgIEFOWVNQQUNFLCAgUGFjazNCeXRlc0FuZFNraXAxU3dhcEZpcnN0fSwKLSAgICB7IENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpfEVYVFJBX1NIKDEpfERPU1dBUF9TSCgxKXxTV0FQRklSU1RfU0goMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBQYWNrM0J5dGVzQW5kU2tpcDFTd2FwU3dhcEZpcnN0fSwKLSAgICB7IENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDEpfERPU1dBUF9TSCgxKXxFWFRSQV9TSCgxKSwgICAgICAgICBBTllTUEFDRSwgIFBhY2szQnl0ZXNBbmRTa2lwMVN3YXB9LAotICAgIHsgQ0hBTk5FTFNfU0goMyl8QllURVNfU0goMSl8RE9TV0FQX1NIKDEpLCAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazNCeXRlc1N3YXB9LAotICAgIHsgQ0hBTk5FTFNfU0goNil8QllURVNfU0goMSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazZCeXRlc30sCi0gICAgeyBDSEFOTkVMU19TSCg2KXxCWVRFU19TSCgxKXxET1NXQVBfU0goMSksICAgICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBQYWNrNkJ5dGVzU3dhcH0sCi0gICAgeyBDSEFOTkVMU19TSCg0KXxCWVRFU19TSCgxKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBQYWNrNEJ5dGVzfSwKLSAgICB7IENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDEpfEZMQVZPUl9TSCgxKSwgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2s0Qnl0ZXNSZXZlcnNlfSwKLSAgICB7IENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDEpfFNXQVBGSVJTVF9TSCgxKSwgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2s0Qnl0ZXNTd2FwRmlyc3R9LAotICAgIHsgQ0hBTk5FTFNfU0goNCl8QllURVNfU0goMSl8RE9TV0FQX1NIKDEpLCAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazRCeXRlc1N3YXB9LAotICAgIHsgQ0hBTk5FTFNfU0goNCl8QllURVNfU0goMSl8RE9TV0FQX1NIKDEpfFNXQVBGSVJTVF9TSCgxKSwgICAgIEFOWVNQQUNFLCAgUGFjazRCeXRlc1N3YXBTd2FwRmlyc3R9LAotCi0gICAgeyBCWVRFU19TSCgxKSwgICAgICAgICAgICAgICAgIEFOWUZMQVZPUnxBTllTV0FQRklSU1R8QU5ZU1dBUHxBTllFWFRSQXxBTllDSEFOTkVMU3xBTllTUEFDRSwgUGFja0FueUJ5dGVzfSwKLSAgICB7IEJZVEVTX1NIKDEpfFBMQU5BUl9TSCgxKSwgICAgQU5ZRkxBVk9SfEFOWVNXQVBGSVJTVHxBTllTV0FQfEFOWUVYVFJBfEFOWUNIQU5ORUxTfEFOWVNQQUNFLCBQYWNrUGxhbmFyQnl0ZXN9LAotCi0gICAgeyBDSEFOTkVMU19TSCgxKXxCWVRFU19TSCgyKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBQYWNrMVdvcmR9LAotICAgIHsgQ0hBTk5FTFNfU0goMSl8QllURVNfU0goMil8RVhUUkFfU0goMSksICAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazFXb3JkU2tpcDF9LAotICAgIHsgQ0hBTk5FTFNfU0goMSl8QllURVNfU0goMil8RVhUUkFfU0goMSl8U1dBUEZJUlNUX1NIKDEpLCAgICAgIEFOWVNQQUNFLCAgUGFjazFXb3JkU2tpcDFTd2FwRmlyc3R9LAotICAgIHsgQ0hBTk5FTFNfU0goMSl8QllURVNfU0goMil8RkxBVk9SX1NIKDEpLCAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazFXb3JkUmV2ZXJzZWR9LAotICAgIHsgQ0hBTk5FTFNfU0goMSl8QllURVNfU0goMil8RU5ESUFOMTZfU0goMSksICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazFXb3JkQmlnRW5kaWFufSwKLSAgICB7IENIQU5ORUxTX1NIKDMpfEJZVEVTX1NIKDIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2szV29yZHN9LAotICAgIHsgQ0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RE9TV0FQX1NIKDEpLCAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazNXb3Jkc1N3YXB9LAotICAgIHsgQ0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RU5ESUFOMTZfU0goMSksICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazNXb3Jkc0JpZ0VuZGlhbn0sCi0gICAgeyBDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxFWFRSQV9TSCgxKSwgICAgICAgICAgICAgICAgICAgICAgQU5ZU1BBQ0UsICBQYWNrM1dvcmRzQW5kU2tpcDF9LAotICAgIHsgQ0hBTk5FTFNfU0goMyl8QllURVNfU0goMil8RVhUUkFfU0goMSl8RE9TV0FQX1NIKDEpLCAgICAgICAgIEFOWVNQQUNFLCAgUGFjazNXb3Jkc0FuZFNraXAxU3dhcH0sCi0gICAgeyBDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxFWFRSQV9TSCgxKXxTV0FQRklSU1RfU0goMSksICAgICAgQU5ZU1BBQ0UsICBQYWNrM1dvcmRzQW5kU2tpcDFTd2FwRmlyc3R9LAotCi0gICAgeyBDSEFOTkVMU19TSCgzKXxCWVRFU19TSCgyKXxFWFRSQV9TSCgxKXxET1NXQVBfU0goMSl8U1dBUEZJUlNUX1NIKDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazNXb3Jkc0FuZFNraXAxU3dhcFN3YXBGaXJzdH0sCi0KLSAgICB7IENIQU5ORUxTX1NIKDQpfEJZVEVTX1NIKDIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2s0V29yZHN9LAotICAgIHsgQ0hBTk5FTFNfU0goNCl8QllURVNfU0goMil8RkxBVk9SX1NIKDEpLCAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazRXb3Jkc1JldmVyc2V9LAotICAgIHsgQ0hBTk5FTFNfU0goNCl8QllURVNfU0goMil8RE9TV0FQX1NIKDEpLCAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazRXb3Jkc1N3YXB9LAotICAgIHsgQ0hBTk5FTFNfU0goNCl8QllURVNfU0goMil8RU5ESUFOMTZfU0goMSksICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazRXb3Jkc0JpZ0VuZGlhbn0sCi0KLSAgICB7IENIQU5ORUxTX1NIKDYpfEJZVEVTX1NIKDIpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllTUEFDRSwgIFBhY2s2V29yZHN9LAotICAgIHsgQ0hBTk5FTFNfU0goNil8QllURVNfU0goMil8RE9TV0FQX1NIKDEpLCAgICAgICAgICAgICAgICAgICAgIEFOWVNQQUNFLCAgUGFjazZXb3Jkc1N3YXB9LAotCi0gICAgeyBCWVRFU19TSCgyKXxQTEFOQVJfU0goMSksICAgICBBTllGTEFWT1J8QU5ZRU5ESUFOfEFOWVNXQVB8QU5ZRVhUUkF8QU5ZQ0hBTk5FTFN8QU5ZU1BBQ0UsIFBhY2tQbGFuYXJXb3Jkc30sCi0gICAgeyBCWVRFU19TSCgyKSwgICAgICAgICAgICAgICAgICBBTllGTEFWT1J8QU5ZU1dBUEZJUlNUfEFOWVNXQVB8QU5ZRU5ESUFOfEFOWUVYVFJBfEFOWUNIQU5ORUxTfEFOWVNQQUNFLCBQYWNrQW55V29yZHN9Ci0KLX07Ci0KLQotc3RhdGljIGNtc0Zvcm1hdHRlcnNGbG9hdCBPdXRwdXRGb3JtYXR0ZXJzRmxvYXRbXSA9IHsKLSAgICAvLyAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uCi0gICAgLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICB7ICAgICBUWVBFX0xhYl9GTFQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZUExBTkFSfEFOWUVYVFJBLCAgIFBhY2tMYWJGbG9hdEZyb21GbG9hdH0sCi0gICAgeyAgICAgVFlQRV9YWVpfRkxULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVBMQU5BUnxBTllFWFRSQSwgICBQYWNrWFlaRmxvYXRGcm9tRmxvYXR9LAotCi0gICAgeyAgICAgVFlQRV9MYWJfREJMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFOWVBMQU5BUnxBTllFWFRSQSwgICBQYWNrTGFiRG91YmxlRnJvbUZsb2F0fSwKLSAgICB7ICAgICBUWVBFX1hZWl9EQkwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZUExBTkFSfEFOWUVYVFJBLCAgIFBhY2tYWVpEb3VibGVGcm9tRmxvYXR9LAotCi0gICAgeyAgICAgRkxPQVRfU0goMSl8QllURVNfU0goNCksIEFOWVBMQU5BUnwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5ZRkxBVk9SfEFOWVNXQVBGSVJTVHxBTllTV0FQfEFOWUVYVFJBfEFOWUNIQU5ORUxTfEFOWVNQQUNFLCAgIFBhY2tGbG9hdHNGcm9tRmxvYXQgfSwKLSAgICB7ICAgICBGTE9BVF9TSCgxKXxCWVRFU19TSCgwKSwgQU5ZUExBTkFSfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllGTEFWT1J8QU5ZU1dBUEZJUlNUfEFOWVNXQVB8QU5ZRVhUUkF8QU5ZQ0hBTk5FTFN8QU5ZU1BBQ0UsICAgUGFja0RvdWJsZXNGcm9tRmxvYXQgfSwKLSNpZm5kZWYgQ01TX05PX0hBTEZfU1VQUE9SVCAKLSAgICB7ICAgICBGTE9BVF9TSCgxKXxCWVRFU19TSCgyKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTllGTEFWT1J8QU5ZU1dBUEZJUlNUfEFOWVNXQVB8QU5ZRVhUUkF8QU5ZQ0hBTk5FTFN8QU5ZU1BBQ0UsICAgUGFja0hhbGZGcm9tRmxvYXQgfSwKLSNlbmRpZgotCi0KLQotfTsKLQotCi0vLyBCaXQgZmllbGRzIHNldCB0byBvbmUgaW4gdGhlIG1hc2sgYXJlIG5vdCBjb21wYXJlZAotc3RhdGljCi1jbXNGb3JtYXR0ZXIgX2Ntc0dldFN0b2NrT3V0cHV0Rm9ybWF0dGVyKGNtc1VJbnQzMk51bWJlciBkd0lucHV0LCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKLXsKLSAgICBjbXNVSW50MzJOdW1iZXIgaTsKLSAgICBjbXNGb3JtYXR0ZXIgZnI7Ci0KLQotICAgIHN3aXRjaCAoZHdGbGFncykKLSAgICB7Ci0KLSAgICAgY2FzZSBDTVNfUEFDS19GTEFHU18xNkJJVFM6IHsKLQotICAgICAgICBmb3IgKGk9MDsgaSA8IHNpemVvZihPdXRwdXRGb3JtYXR0ZXJzMTYpIC8gc2l6ZW9mKGNtc0Zvcm1hdHRlcnMxNik7IGkrKykgewotICAgICAgICAgICAgY21zRm9ybWF0dGVyczE2KiBmID0gT3V0cHV0Rm9ybWF0dGVyczE2ICsgaTsKLQotICAgICAgICAgICAgaWYgKChkd0lucHV0ICYgfmYgLT5NYXNrKSA9PSBmIC0+VHlwZSkgewotICAgICAgICAgICAgICAgIGZyLkZtdDE2ID0gZiAtPkZybTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgQ01TX1BBQ0tfRkxBR1NfRkxPQVQ6IHsKLQotICAgICAgICBmb3IgKGk9MDsgaSA8IHNpemVvZihPdXRwdXRGb3JtYXR0ZXJzRmxvYXQpIC8gc2l6ZW9mKGNtc0Zvcm1hdHRlcnNGbG9hdCk7IGkrKykgewotICAgICAgICAgICAgY21zRm9ybWF0dGVyc0Zsb2F0KiBmID0gT3V0cHV0Rm9ybWF0dGVyc0Zsb2F0ICsgaTsKLQotICAgICAgICAgICAgaWYgKChkd0lucHV0ICYgfmYgLT5NYXNrKSA9PSBmIC0+VHlwZSkgewotICAgICAgICAgICAgICAgIGZyLkZtdEZsb2F0ID0gZiAtPkZybTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6OwotCi0gICAgfQotCi0gICAgZnIuRm10MTYgPSBOVUxMOwotICAgIHJldHVybiBmcjsKLX0KLQotCi10eXBlZGVmIHN0cnVjdCBfY21zX2Zvcm1hdHRlcnNfZmFjdG9yeV9saXN0IHsKLQotICAgIGNtc0Zvcm1hdHRlckZhY3RvcnkgRmFjdG9yeTsKLSAgICBzdHJ1Y3QgX2Ntc19mb3JtYXR0ZXJzX2ZhY3RvcnlfbGlzdCAqTmV4dDsKLQotfSBjbXNGb3JtYXR0ZXJzRmFjdG9yeUxpc3Q7Ci0KLV9jbXNGb3JtYXR0ZXJzUGx1Z2luQ2h1bmtUeXBlIF9jbXNGb3JtYXR0ZXJzUGx1Z2luQ2h1bmsgPSB7IE5VTEwgfTsKLQotCi0vLyBEdXBsaWNhdGVzIHRoZSB6b25lIG9mIG1lbW9yeSB1c2VkIGJ5IHRoZSBwbHVnLWluIGluIHRoZSBuZXcgY29udGV4dAotc3RhdGljCi12b2lkIER1cEZvcm1hdHRlckZhY3RvcnlMaXN0KHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKLXsKLSAgIF9jbXNGb3JtYXR0ZXJzUGx1Z2luQ2h1bmtUeXBlIG5ld0hlYWQgPSB7IE5VTEwgfTsKLSAgIGNtc0Zvcm1hdHRlcnNGYWN0b3J5TGlzdCogIGVudHJ5OwotICAgY21zRm9ybWF0dGVyc0ZhY3RvcnlMaXN0KiAgQW50ZXJpb3IgPSBOVUxMOwotICAgX2Ntc0Zvcm1hdHRlcnNQbHVnaW5DaHVua1R5cGUqIGhlYWQgPSAoX2Ntc0Zvcm1hdHRlcnNQbHVnaW5DaHVua1R5cGUqKSBzcmMtPmNodW5rc1tGb3JtYXR0ZXJzUGx1Z2luXTsKLQotICAgICBfY21zQXNzZXJ0KGhlYWQgIT0gTlVMTCk7Ci0KLSAgIC8vIFdhbGsgdGhlIGxpc3QgY29weWluZyBhbGwgbm9kZXMKLSAgIGZvciAoZW50cnkgPSBoZWFkLT5GYWN0b3J5TGlzdDsKLSAgICAgICBlbnRyeSAhPSBOVUxMOwotICAgICAgIGVudHJ5ID0gZW50cnkgLT5OZXh0KSB7Ci0KLSAgICAgICAgICAgY21zRm9ybWF0dGVyc0ZhY3RvcnlMaXN0ICpuZXdFbnRyeSA9ICggY21zRm9ybWF0dGVyc0ZhY3RvcnlMaXN0ICopIF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCBlbnRyeSwgc2l6ZW9mKGNtc0Zvcm1hdHRlcnNGYWN0b3J5TGlzdCkpOwotCi0gICAgICAgICAgIGlmIChuZXdFbnRyeSA9PSBOVUxMKSAKLSAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAvLyBXZSB3YW50IHRvIGtlZXAgdGhlIGxpbmtlZCBsaXN0IG9yZGVyLCBzbyB0aGlzIGlzIGEgbGl0dGxlIGJpdCB0cmlja3kKLSAgICAgICAgICAgbmV3RW50cnkgLT4gTmV4dCA9IE5VTEw7Ci0gICAgICAgICAgIGlmIChBbnRlcmlvcikKLSAgICAgICAgICAgICAgIEFudGVyaW9yIC0+IE5leHQgPSBuZXdFbnRyeTsKLQotICAgICAgICAgICBBbnRlcmlvciA9IG5ld0VudHJ5OwotCi0gICAgICAgICAgIGlmIChuZXdIZWFkLkZhY3RvcnlMaXN0ID09IE5VTEwpCi0gICAgICAgICAgICAgICBuZXdIZWFkLkZhY3RvcnlMaXN0ID0gbmV3RW50cnk7Ci0gICB9Ci0KLSAgIGN0eCAtPmNodW5rc1tGb3JtYXR0ZXJzUGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHgtPk1lbVBvb2wsICZuZXdIZWFkLCBzaXplb2YoX2Ntc0Zvcm1hdHRlcnNQbHVnaW5DaHVua1R5cGUpKTsKLX0KLQotLy8gVGhlIGludGVycG9sYXRpb24gcGx1Zy1pbiBtZW1vcnkgY2h1bmsgYWxsb2NhdG9yL2R1cAotdm9pZCBfY21zQWxsb2NGb3JtYXR0ZXJzUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKLXsKLSAgICAgIF9jbXNBc3NlcnQoY3R4ICE9IE5VTEwpOwotCi0gICAgIGlmIChzcmMgIT0gTlVMTCkgewotICAgICAgICAKLSAgICAgICAgIC8vIER1cGxpY2F0ZSB0aGUgTElTVAotICAgICAgICAgRHVwRm9ybWF0dGVyRmFjdG9yeUxpc3QoY3R4LCBzcmMpOwotICAgICB9Ci0gICAgIGVsc2UgewotICAgICAgICAgIHN0YXRpYyBfY21zRm9ybWF0dGVyc1BsdWdpbkNodW5rVHlwZSBGb3JtYXR0ZXJzUGx1Z2luQ2h1bmsgPSB7IE5VTEwgfTsKLSAgICAgICAgICBjdHggLT5jaHVua3NbRm9ybWF0dGVyc1BsdWdpbl0gPSBfY21zU3ViQWxsb2NEdXAoY3R4IC0+TWVtUG9vbCwgJkZvcm1hdHRlcnNQbHVnaW5DaHVuaywgc2l6ZW9mKF9jbXNGb3JtYXR0ZXJzUGx1Z2luQ2h1bmtUeXBlKSk7Ci0gICAgIH0KLX0KLQotCi0KLS8vIEZvcm1hdHRlcnMgbWFuYWdlbWVudAotY21zQm9vbCAgX2Ntc1JlZ2lzdGVyRm9ybWF0dGVyc1BsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogRGF0YSkKLXsKLSAgICBfY21zRm9ybWF0dGVyc1BsdWdpbkNodW5rVHlwZSogY3R4ID0gKCBfY21zRm9ybWF0dGVyc1BsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBGb3JtYXR0ZXJzUGx1Z2luKTsKLSAgICBjbXNQbHVnaW5Gb3JtYXR0ZXJzKiBQbHVnaW4gPSAoY21zUGx1Z2luRm9ybWF0dGVycyopIERhdGE7Ci0gICAgY21zRm9ybWF0dGVyc0ZhY3RvcnlMaXN0KiBmbCA7Ci0KLSAgICAvLyBSZXNldCB0byBidWlsdC1pbiBkZWZhdWx0cwotICAgIGlmIChEYXRhID09IE5VTEwpIHsKLQotICAgICAgICAgIGN0eCAtPkZhY3RvcnlMaXN0ID0gTlVMTDsKLSAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICBmbCA9IChjbXNGb3JtYXR0ZXJzRmFjdG9yeUxpc3QqKSBfY21zUGx1Z2luTWFsbG9jKENvbnRleHRJRCwgc2l6ZW9mKGNtc0Zvcm1hdHRlcnNGYWN0b3J5TGlzdCkpOwotICAgIGlmIChmbCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBmbCAtPkZhY3RvcnkgICAgPSBQbHVnaW4gLT5Gb3JtYXR0ZXJzRmFjdG9yeTsKLQotICAgIGZsIC0+TmV4dCA9IGN0eCAtPiBGYWN0b3J5TGlzdDsKLSAgICBjdHggLT5GYWN0b3J5TGlzdCA9IGZsOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWNtc0Zvcm1hdHRlciBfY21zR2V0Rm9ybWF0dGVyKGNtc0NvbnRleHQgQ29udGV4dElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgVHlwZSwgICAgICAgICAvLyBTcGVjaWZpYyB0eXBlLCBpLmUuIFRZUEVfUkdCXzgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRm9ybWF0dGVyRGlyZWN0aW9uIERpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpCi17Ci0gICAgX2Ntc0Zvcm1hdHRlcnNQbHVnaW5DaHVua1R5cGUqIGN0eCA9ICggX2Ntc0Zvcm1hdHRlcnNQbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgRm9ybWF0dGVyc1BsdWdpbik7Ci0gICAgY21zRm9ybWF0dGVyc0ZhY3RvcnlMaXN0KiBmOwotCi0gICAgZm9yIChmID1jdHgtPkZhY3RvcnlMaXN0OyBmICE9IE5VTEw7IGYgPSBmIC0+TmV4dCkgewotCi0gICAgICAgIGNtc0Zvcm1hdHRlciBmbiA9IGYgLT5GYWN0b3J5KFR5cGUsIERpciwgZHdGbGFncyk7Ci0gICAgICAgIGlmIChmbi5GbXQxNiAhPSBOVUxMKSByZXR1cm4gZm47Ci0gICAgfQotCi0gICAgLy8gUmV2ZXJ0IHRvIGRlZmF1bHQKLSAgICBpZiAoRGlyID09IGNtc0Zvcm1hdHRlcklucHV0KQotICAgICAgICByZXR1cm4gX2Ntc0dldFN0b2NrSW5wdXRGb3JtYXR0ZXIoVHlwZSwgZHdGbGFncyk7Ci0gICAgZWxzZQotICAgICAgICByZXR1cm4gX2Ntc0dldFN0b2NrT3V0cHV0Rm9ybWF0dGVyKFR5cGUsIGR3RmxhZ3MpOwotfQotCi0KLS8vIFJldHVybiB3aGF0ZXZlciBnaXZlbiBmb3JtYXR0ZXIgcmVmZXJzIHRvIGZsb2F0IHZhbHVlcwotY21zQm9vbCAgX2Ntc0Zvcm1hdHRlcklzRmxvYXQoY21zVUludDMyTnVtYmVyIFR5cGUpCi17Ci0gICAgcmV0dXJuIFRfRkxPQVQoVHlwZSkgPyBUUlVFIDogRkFMU0U7Ci19Ci0KLS8vIFJldHVybiB3aGF0ZXZlciBnaXZlbiBmb3JtYXR0ZXIgcmVmZXJzIHRvIDggYml0cwotY21zQm9vbCAgX2Ntc0Zvcm1hdHRlcklzOGJpdChjbXNVSW50MzJOdW1iZXIgVHlwZSkKLXsKLSAgICBpbnQgQnl0ZXMgPSBUX0JZVEVTKFR5cGUpOwotCi0gICAgcmV0dXJuIChCeXRlcyA9PSAxKTsKLX0KLQotLy8gQnVpbGQgYSBzdWl0YWJsZSBmb3JtYXR0ZXIgZm9yIHRoZSBjb2xvcnNwYWNlIG9mIHRoaXMgcHJvZmlsZQotY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNGb3JtYXR0ZXJGb3JDb2xvcnNwYWNlT2ZQcm9maWxlKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50MzJOdW1iZXIgbkJ5dGVzLCBjbXNCb29sIGxJc0Zsb2F0KQotewotCi0gICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBDb2xvclNwYWNlICAgICAgPSBjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKTsKLSAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgIENvbG9yU3BhY2VCaXRzICA9IF9jbXNMQ01TY29sb3JTcGFjZShDb2xvclNwYWNlKTsKLSAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgIG5PdXRwdXRDaGFucyAgICA9IGNtc0NoYW5uZWxzT2YoQ29sb3JTcGFjZSk7Ci0gICAgY21zVUludDMyTnVtYmVyICAgICAgICBGbG9hdCAgICAgICAgICAgPSBsSXNGbG9hdCA/IDEgOiAwOwotCi0gICAgLy8gQ3JlYXRlIGEgZmFrZSBmb3JtYXR0ZXIgZm9yIHJlc3VsdAotICAgIHJldHVybiBGTE9BVF9TSChGbG9hdCkgfCBDT0xPUlNQQUNFX1NIKENvbG9yU3BhY2VCaXRzKSB8IEJZVEVTX1NIKG5CeXRlcykgfCBDSEFOTkVMU19TSChuT3V0cHV0Q2hhbnMpOwotfQotCi0vLyBCdWlsZCBhIHN1aXRhYmxlIGZvcm1hdHRlciBmb3IgdGhlIGNvbG9yc3BhY2Ugb2YgdGhpcyBwcm9maWxlCi1jbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0Zvcm1hdHRlckZvclBDU09mUHJvZmlsZShjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVUludDMyTnVtYmVyIG5CeXRlcywgY21zQm9vbCBsSXNGbG9hdCkKLXsKLQotICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgQ29sb3JTcGFjZSAgICAgID0gY21zR2V0UENTKGhQcm9maWxlKTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2VCaXRzICA9IF9jbXNMQ01TY29sb3JTcGFjZShDb2xvclNwYWNlKTsKLSAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgIG5PdXRwdXRDaGFucyAgICA9IGNtc0NoYW5uZWxzT2YoQ29sb3JTcGFjZSk7Ci0gICAgY21zVUludDMyTnVtYmVyICAgICAgICBGbG9hdCAgICAgICAgICAgPSBsSXNGbG9hdCA/IDEgOiAwOwotCi0gICAgLy8gQ3JlYXRlIGEgZmFrZSBmb3JtYXR0ZXIgZm9yIHJlc3VsdAotICAgIHJldHVybiBGTE9BVF9TSChGbG9hdCkgfCBDT0xPUlNQQUNFX1NIKENvbG9yU3BhY2VCaXRzKSB8IEJZVEVTX1NIKG5CeXRlcykgfCBDSEFOTkVMU19TSChuT3V0cHV0Q2hhbnMpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNwY3MuYyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zcGNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMmNkN2QuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXNwY3MuYworKysgL2Rldi9udWxsCkBAIC0xLDkzMSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxMCBNYXJ0aSBNYXJpYSBTYWd1ZXIKLS8vCi0vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLS8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLS8vIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLS8vIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotLy8gYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlCi0vLyBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotLy8KLS8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi0vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLS8vCi0vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLS8vIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTwotLy8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLS8vIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKLS8vIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLS8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgotLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0KLSNpbmNsdWRlICJsY21zMl9pbnRlcm5hbC5oIgotCi0vLyAgICAgIGludGVyIFBDUyBjb252ZXJzaW9ucyBYWVogPC0+IENJRSBMKiBhKiBiKgotLyoKLQotCi0gICAgICAgQ0lFIDE1OjIwMDQgQ0lFTGFiIGlzIGRlZmluZWQgYXM6Ci0KLSAgICAgICBMKiA9IDExNipmKFkvWW4pIC0gMTYgICAgICAgICAgICAgICAgICAgICAwIDw9IEwqIDw9IDEwMAotICAgICAgIGEqID0gNTAwKltmKFgvWG4pIC0gZihZL1luKV0KLSAgICAgICBiKiA9IDIwMCpbZihZL1luKSAtIGYoWi9abildCi0KLSAgICAgICBhbmQKLQotICAgICAgICAgICAgICBmKHQpID0gdF4oMS8zKSAgICAgICAgICAgICAgICAgICAgIDEgPj0gdCA+ICAoMjQvMTE2KV4zCi0gICAgICAgICAgICAgICAgICAgICAoODQxLzEwOCkqdCArICgxNi8xMTYpICAgICAgMCA8PSB0IDw9ICgyNC8xMTYpXjMKLQotCi0gICAgICAgUmV2ZXJzZSB0cmFuc2Zvcm0gaXM6Ci0KLSAgICAgICBYID0gWG4qW2EqIC8gNTAwICsgKEwqICsgMTYpIC8gMTE2XSBeIDMgICBpZiAoWC9YbikgPiAoMjQvMTE2KQotICAgICAgICAgPSBYbiooYSogLyA1MDAgKyBMKiAvIDExNikgLyA3Ljc4NyAgICAgIGlmIChYL1huKSA8PSAoMjQvMTE2KQotCi0KLQotICAgICAgIFBDUyBpbiBMYWIyIGlzIGVuY29kZWQgYXM6Ci0KLSAgICAgICAgICAgICAgOCBiaXQgTGFiIFBDUzoKLQotICAgICAgICAgICAgICAgICAgICAgTCogICAgICAwLi4xMDAgaW50byBhIDAuLmZmIGJ5dGUuCi0gICAgICAgICAgICAgICAgICAgICBhKiAgICAgIHQgKyAxMjggcmFuZ2UgaXMgLTEyOC4wICArMTI3LjAKLSAgICAgICAgICAgICAgICAgICAgIGIqCi0KLSAgICAgICAgICAgICAxNiBiaXQgTGFiIFBDUzoKLQotICAgICAgICAgICAgICAgICAgICAgTCogICAgIDAuLjEwMCAgaW50byBhIDAuLmZmMDAgd29yZC4KLSAgICAgICAgICAgICAgICAgICAgIGEqICAgICB0ICsgMTI4ICByYW5nZSBpcyAgLTEyOC4wICArMTI3Ljk5NjEKLSAgICAgICAgICAgICAgICAgICAgIGIqCi0KLQotCi1JbnRlcmNoYW5nZSBTcGFjZSAgIENvbXBvbmVudCAgICAgQWN0dWFsIFJhbmdlICAgICAgICBFbmNvZGVkIFJhbmdlCi1DSUUgWFlaICAgICAgICAgICAgIFggICAgICAgICAgICAgMCAtPiAxLjk5OTk3ICAgICAgICAweDAwMDAgLT4gMHhmZmZmCi1DSUUgWFlaICAgICAgICAgICAgIFkgICAgICAgICAgICAgMCAtPiAxLjk5OTk3ICAgICAgICAweDAwMDAgLT4gMHhmZmZmCi1DSUUgWFlaICAgICAgICAgICAgIFogICAgICAgICAgICAgMCAtPiAxLjk5OTk3ICAgICAgICAweDAwMDAgLT4gMHhmZmZmCi0KLVZlcnNpb24gMiwzCi0tLS0tLS0tLS0tLQotCi1DSUVMQUIgKDE2IGJpdCkgICAgIEwqICAgICAgICAgICAgMCAtPiAxMDAuMCAgICAgICAgICAweDAwMDAgLT4gMHhmZjAwCi1DSUVMQUIgKDE2IGJpdCkgICAgIGEqICAgICAgICAgICAgLTEyOC4wIC0+ICsxMjcuOTk2ICAweDAwMDAgLT4gMHg4MDAwIC0+IDB4ZmZmZgotQ0lFTEFCICgxNiBiaXQpICAgICBiKiAgICAgICAgICAgIC0xMjguMCAtPiArMTI3Ljk5NiAgMHgwMDAwIC0+IDB4ODAwMCAtPiAweGZmZmYKLQotCi1WZXJzaW9uIDQKLS0tLS0tLS0tLQotCi1DSUVMQUIgKDE2IGJpdCkgICAgIEwqICAgICAgICAgICAgMCAtPiAxMDAuMCAgICAgICAgICAweDAwMDAgLT4gMHhmZmZmCi1DSUVMQUIgKDE2IGJpdCkgICAgIGEqICAgICAgICAgICAgLTEyOC4wIC0+ICsxMjcgICAgICAweDAwMDAgLT4gMHg4MDgwIC0+IDB4ZmZmZgotQ0lFTEFCICgxNiBiaXQpICAgICBiKiAgICAgICAgICAgIC0xMjguMCAtPiArMTI3ICAgICAgMHgwMDAwIC0+IDB4ODA4MCAtPiAweGZmZmYKLQotKi8KLQotLy8gQ29udmVyc2lvbnMKLXZvaWQgQ01TRVhQT1JUIGNtc1hZWjJ4eVkoY21zQ0lFeHlZKiBEZXN0LCBjb25zdCBjbXNDSUVYWVoqIFNvdXJjZSkKLXsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIElTdW07Ci0KLSAgICBJU3VtID0gMS4vKFNvdXJjZSAtPiBYICsgU291cmNlIC0+IFkgKyBTb3VyY2UgLT4gWik7Ci0KLSAgICBEZXN0IC0+IHggPSAoU291cmNlIC0+IFgpICogSVN1bTsKLSAgICBEZXN0IC0+IHkgPSAoU291cmNlIC0+IFkpICogSVN1bTsKLSAgICBEZXN0IC0+IFkgPSBTb3VyY2UgLT4gWTsKLX0KLQotdm9pZCBDTVNFWFBPUlQgY21zeHlZMlhZWihjbXNDSUVYWVoqIERlc3QsIGNvbnN0IGNtc0NJRXh5WSogU291cmNlKQotewotICAgIERlc3QgLT4gWCA9IChTb3VyY2UgLT4geCAvIFNvdXJjZSAtPiB5KSAqIFNvdXJjZSAtPiBZOwotICAgIERlc3QgLT4gWSA9IFNvdXJjZSAtPiBZOwotICAgIERlc3QgLT4gWiA9ICgoMSAtIFNvdXJjZSAtPiB4IC0gU291cmNlIC0+IHkpIC8gU291cmNlIC0+IHkpICogU291cmNlIC0+IFk7Ci19Ci0KLXN0YXRpYwotY21zRmxvYXQ2NE51bWJlciBmKGNtc0Zsb2F0NjROdW1iZXIgdCkKLXsKLSAgICBjb25zdCBjbXNGbG9hdDY0TnVtYmVyIExpbWl0ID0gKDI0LjAvMTE2LjApICogKDI0LjAvMTE2LjApICogKDI0LjAvMTE2LjApOwotCi0gICAgaWYgKHQgPD0gTGltaXQpCi0gICAgICAgIHJldHVybiAoODQxLjAvMTA4LjApICogdCArICgxNi4wLzExNi4wKTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBwb3codCwgMS4wLzMuMCk7Ci19Ci0KLXN0YXRpYwotY21zRmxvYXQ2NE51bWJlciBmXzEoY21zRmxvYXQ2NE51bWJlciB0KQotewotICAgIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIgTGltaXQgPSAoMjQuMC8xMTYuMCk7Ci0KLSAgICBpZiAodCA8PSBMaW1pdCkgewotICAgICAgICByZXR1cm4gKDEwOC4wLzg0MS4wKSAqICh0IC0gKDE2LjAvMTE2LjApKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdCAqIHQgKiB0OwotfQotCi0KLS8vIFN0YW5kYXJkIFhZWiB0byBMYWIuIGl0IGNhbiBoYW5kbGUgbmVnYXRpdmUgWFpZIG51bWJlcnMgaW4gc29tZSBjYXNlcwotdm9pZCBDTVNFWFBPUlQgY21zWFlaMkxhYihjb25zdCBjbXNDSUVYWVoqIFdoaXRlUG9pbnQsIGNtc0NJRUxhYiogTGFiLCBjb25zdCBjbXNDSUVYWVoqIHh5eikKLXsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIGZ4LCBmeSwgZno7Ci0KLSAgICBpZiAoV2hpdGVQb2ludCA9PSBOVUxMKQotICAgICAgICBXaGl0ZVBvaW50ID0gY21zRDUwX1hZWigpOwotCi0gICAgZnggPSBmKHh5ei0+WCAvIFdoaXRlUG9pbnQtPlgpOwotICAgIGZ5ID0gZih4eXotPlkgLyBXaGl0ZVBvaW50LT5ZKTsKLSAgICBmeiA9IGYoeHl6LT5aIC8gV2hpdGVQb2ludC0+Wik7Ci0KLSAgICBMYWItPkwgPSAxMTYuMCpmeSAtIDE2LjA7Ci0gICAgTGFiLT5hID0gNTAwLjAqKGZ4IC0gZnkpOwotICAgIExhYi0+YiA9IDIwMC4wKihmeSAtIGZ6KTsKLX0KLQotCi0vLyBTdGFuZGFyZCBYWVogdG8gTGFiLiBJdCBjYW4gcmV0dXJuIG5lZ2F0aXZlIFhZWiBpbiBzb21lIGNhc2VzCi12b2lkIENNU0VYUE9SVCBjbXNMYWIyWFlaKGNvbnN0IGNtc0NJRVhZWiogV2hpdGVQb2ludCwgY21zQ0lFWFlaKiB4eXosICBjb25zdCBjbXNDSUVMYWIqIExhYikKLXsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIHgsIHksIHo7Ci0KLSAgICBpZiAoV2hpdGVQb2ludCA9PSBOVUxMKQotICAgICAgICBXaGl0ZVBvaW50ID0gY21zRDUwX1hZWigpOwotCi0gICAgeSA9IChMYWItPiBMICsgMTYuMCkgLyAxMTYuMDsKLSAgICB4ID0geSArIDAuMDAyICogTGFiIC0+IGE7Ci0gICAgeiA9IHkgLSAwLjAwNSAqIExhYiAtPiBiOwotCi0gICAgeHl6IC0+IFggPSBmXzEoeCkgKiBXaGl0ZVBvaW50IC0+IFg7Ci0gICAgeHl6IC0+IFkgPSBmXzEoeSkgKiBXaGl0ZVBvaW50IC0+IFk7Ci0gICAgeHl6IC0+IFogPSBmXzEoeikgKiBXaGl0ZVBvaW50IC0+IFo7Ci0KLX0KLQotc3RhdGljCi1jbXNGbG9hdDY0TnVtYmVyIEwyZmxvYXQyKGNtc1VJbnQxNk51bWJlciB2KQotewotICAgIHJldHVybiAoY21zRmxvYXQ2NE51bWJlcikgdiAvIDY1Mi44MDA7Ci19Ci0KLS8vIHRoZSBhL2IgcGFydAotc3RhdGljCi1jbXNGbG9hdDY0TnVtYmVyIGFiMmZsb2F0MihjbXNVSW50MTZOdW1iZXIgdikKLXsKLSAgICByZXR1cm4gKChjbXNGbG9hdDY0TnVtYmVyKSB2IC8gMjU2LjApIC0gMTI4LjA7Ci19Ci0KLXN0YXRpYwotY21zVUludDE2TnVtYmVyIEwyRml4MihjbXNGbG9hdDY0TnVtYmVyIEwpCi17Ci0gICAgcmV0dXJuIF9jbXNRdWlja1NhdHVyYXRlV29yZChMICogIDY1Mi44KTsKLX0KLQotc3RhdGljCi1jbXNVSW50MTZOdW1iZXIgYWIyRml4MihjbXNGbG9hdDY0TnVtYmVyIGFiKQotewotICAgIHJldHVybiBfY21zUXVpY2tTYXR1cmF0ZVdvcmQoKGFiICsgMTI4LjApICogMjU2LjApOwotfQotCi0KLXN0YXRpYwotY21zRmxvYXQ2NE51bWJlciBMMmZsb2F0NChjbXNVSW50MTZOdW1iZXIgdikKLXsKLSAgICByZXR1cm4gKGNtc0Zsb2F0NjROdW1iZXIpIHYgLyA2NTUuMzU7Ci19Ci0KLS8vIHRoZSBhL2IgcGFydAotc3RhdGljCi1jbXNGbG9hdDY0TnVtYmVyIGFiMmZsb2F0NChjbXNVSW50MTZOdW1iZXIgdikKLXsKLSAgICByZXR1cm4gKChjbXNGbG9hdDY0TnVtYmVyKSB2IC8gMjU3LjApIC0gMTI4LjA7Ci19Ci0KLQotdm9pZCBDTVNFWFBPUlQgY21zTGFiRW5jb2RlZDJGbG9hdFYyKGNtc0NJRUxhYiogTGFiLCBjb25zdCBjbXNVSW50MTZOdW1iZXIgd0xhYlszXSkKLXsKLSAgICAgICAgTGFiLT5MID0gTDJmbG9hdDIod0xhYlswXSk7Ci0gICAgICAgIExhYi0+YSA9IGFiMmZsb2F0Mih3TGFiWzFdKTsKLSAgICAgICAgTGFiLT5iID0gYWIyZmxvYXQyKHdMYWJbMl0pOwotfQotCi0KLXZvaWQgQ01TRVhQT1JUIGNtc0xhYkVuY29kZWQyRmxvYXQoY21zQ0lFTGFiKiBMYWIsIGNvbnN0IGNtc1VJbnQxNk51bWJlciB3TGFiWzNdKQotewotICAgICAgICBMYWItPkwgPSBMMmZsb2F0NCh3TGFiWzBdKTsKLSAgICAgICAgTGFiLT5hID0gYWIyZmxvYXQ0KHdMYWJbMV0pOwotICAgICAgICBMYWItPmIgPSBhYjJmbG9hdDQod0xhYlsyXSk7Ci19Ci0KLXN0YXRpYwotY21zRmxvYXQ2NE51bWJlciBDbGFtcF9MX2RvdWJsZVYyKGNtc0Zsb2F0NjROdW1iZXIgTCkKLXsKLSAgICBjb25zdCBjbXNGbG9hdDY0TnVtYmVyIExfbWF4ID0gKGNtc0Zsb2F0NjROdW1iZXIpICgweEZGRkYgKiAxMDAuMCkgLyAweEZGMDA7Ci0KLSAgICBpZiAoTCA8IDApIEwgPSAwOwotICAgIGlmIChMID4gTF9tYXgpIEwgPSBMX21heDsKLQotICAgIHJldHVybiBMOwotfQotCi0KLXN0YXRpYwotY21zRmxvYXQ2NE51bWJlciBDbGFtcF9hYl9kb3VibGVWMihjbXNGbG9hdDY0TnVtYmVyIGFiKQotewotICAgIGlmIChhYiA8IE1JTl9FTkNPREVBQkxFX2FiMikgYWIgPSBNSU5fRU5DT0RFQUJMRV9hYjI7Ci0gICAgaWYgKGFiID4gTUFYX0VOQ09ERUFCTEVfYWIyKSBhYiA9IE1BWF9FTkNPREVBQkxFX2FiMjsKLQotICAgIHJldHVybiBhYjsKLX0KLQotdm9pZCBDTVNFWFBPUlQgY21zRmxvYXQyTGFiRW5jb2RlZFYyKGNtc1VJbnQxNk51bWJlciB3TGFiWzNdLCBjb25zdCBjbXNDSUVMYWIqIGZMYWIpCi17Ci0gICAgY21zQ0lFTGFiIExhYjsKLQotICAgIExhYi5MID0gQ2xhbXBfTF9kb3VibGVWMihmTGFiIC0+TCk7Ci0gICAgTGFiLmEgPSBDbGFtcF9hYl9kb3VibGVWMihmTGFiIC0+YSk7Ci0gICAgTGFiLmIgPSBDbGFtcF9hYl9kb3VibGVWMihmTGFiIC0+Yik7Ci0KLSAgICB3TGFiWzBdID0gTDJGaXgyKExhYi5MKTsKLSAgICB3TGFiWzFdID0gYWIyRml4MihMYWIuYSk7Ci0gICAgd0xhYlsyXSA9IGFiMkZpeDIoTGFiLmIpOwotfQotCi0KLXN0YXRpYwotY21zRmxvYXQ2NE51bWJlciBDbGFtcF9MX2RvdWJsZVY0KGNtc0Zsb2F0NjROdW1iZXIgTCkKLXsKLSAgICBpZiAoTCA8IDApIEwgPSAwOwotICAgIGlmIChMID4gMTAwLjApIEwgPSAxMDAuMDsKLQotICAgIHJldHVybiBMOwotfQotCi1zdGF0aWMKLWNtc0Zsb2F0NjROdW1iZXIgQ2xhbXBfYWJfZG91YmxlVjQoY21zRmxvYXQ2NE51bWJlciBhYikKLXsKLSAgICBpZiAoYWIgPCBNSU5fRU5DT0RFQUJMRV9hYjQpIGFiID0gTUlOX0VOQ09ERUFCTEVfYWI0OwotICAgIGlmIChhYiA+IE1BWF9FTkNPREVBQkxFX2FiNCkgYWIgPSBNQVhfRU5DT0RFQUJMRV9hYjQ7Ci0KLSAgICByZXR1cm4gYWI7Ci19Ci0KLXN0YXRpYwotY21zVUludDE2TnVtYmVyIEwyRml4NChjbXNGbG9hdDY0TnVtYmVyIEwpCi17Ci0gICAgcmV0dXJuIF9jbXNRdWlja1NhdHVyYXRlV29yZChMICogIDY1NS4zNSk7Ci19Ci0KLXN0YXRpYwotY21zVUludDE2TnVtYmVyIGFiMkZpeDQoY21zRmxvYXQ2NE51bWJlciBhYikKLXsKLSAgICByZXR1cm4gX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKChhYiArIDEyOC4wKSAqIDI1Ny4wKTsKLX0KLQotdm9pZCBDTVNFWFBPUlQgY21zRmxvYXQyTGFiRW5jb2RlZChjbXNVSW50MTZOdW1iZXIgd0xhYlszXSwgY29uc3QgY21zQ0lFTGFiKiBmTGFiKQotewotICAgIGNtc0NJRUxhYiBMYWI7Ci0KLSAgICBMYWIuTCA9IENsYW1wX0xfZG91YmxlVjQoZkxhYiAtPkwpOwotICAgIExhYi5hID0gQ2xhbXBfYWJfZG91YmxlVjQoZkxhYiAtPmEpOwotICAgIExhYi5iID0gQ2xhbXBfYWJfZG91YmxlVjQoZkxhYiAtPmIpOwotCi0gICAgd0xhYlswXSA9IEwyRml4NChMYWIuTCk7Ci0gICAgd0xhYlsxXSA9IGFiMkZpeDQoTGFiLmEpOwotICAgIHdMYWJbMl0gPSBhYjJGaXg0KExhYi5iKTsKLX0KLQotLy8gQXV4aWxpYXI6IGNvbnZlcnQgdG8gUmFkaWFucwotc3RhdGljCi1jbXNGbG9hdDY0TnVtYmVyIFJBRElBTlMoY21zRmxvYXQ2NE51bWJlciBkZWcpCi17Ci0gICAgcmV0dXJuIChkZWcgKiBNX1BJKSAvIDE4MC47Ci19Ci0KLQotLy8gQXV4aWxpYXI6IGF0YW4yIGJ1dCBvcGVyYXRpbmcgaW4gZGVncmVlcyBhbmQgcmV0dXJuaW5nIDAgaWYgYT09Yj09MAotc3RhdGljCi1jbXNGbG9hdDY0TnVtYmVyIGF0YW4yZGVnKGNtc0Zsb2F0NjROdW1iZXIgYSwgY21zRmxvYXQ2NE51bWJlciBiKQotewotICAgY21zRmxvYXQ2NE51bWJlciBoOwotCi0gICBpZiAoYSA9PSAwICYmIGIgPT0gMCkKLSAgICAgICAgICAgIGggICA9IDA7Ci0gICAgZWxzZQotICAgICAgICAgICAgaCA9IGF0YW4yKGEsIGIpOwotCi0gICAgaCAqPSAoMTgwLiAvIE1fUEkpOwotCi0gICAgd2hpbGUgKGggPiAzNjAuKQotICAgICAgICBoIC09IDM2MC47Ci0KLSAgICB3aGlsZSAoIGggPCAwKQotICAgICAgICBoICs9IDM2MC47Ci0KLSAgICByZXR1cm4gaDsKLX0KLQotCi0vLyBBdXhpbGlhcjogU3F1YXJlCi1zdGF0aWMKLWNtc0Zsb2F0NjROdW1iZXIgU3FyKGNtc0Zsb2F0NjROdW1iZXIgdikKLXsKLSAgICByZXR1cm4gdiAqICB2OwotfQotLy8gRnJvbSBjeWxpbmRyaWNhbCBjb29yZGluYXRlcy4gTm8gY2hlY2sgaXMgcGVyZm9ybWVkLCB0aGVuIG5lZ2F0aXZlIHZhbHVlcyBhcmUgYWxsb3dlZAotdm9pZCBDTVNFWFBPUlQgY21zTGFiMkxDaChjbXNDSUVMQ2gqIExDaCwgY29uc3QgY21zQ0lFTGFiKiBMYWIpCi17Ci0gICAgTENoIC0+IEwgPSBMYWIgLT4gTDsKLSAgICBMQ2ggLT4gQyA9IHBvdyhTcXIoTGFiIC0+YSkgKyBTcXIoTGFiIC0+YiksIDAuNSk7Ci0gICAgTENoIC0+IGggPSBhdGFuMmRlZyhMYWIgLT5iLCBMYWIgLT5hKTsKLX0KLQotCi0vLyBUbyBjeWxpbmRyaWNhbCBjb29yZGluYXRlcy4gTm8gY2hlY2sgaXMgcGVyZm9ybWVkLCB0aGVuIG5lZ2F0aXZlIHZhbHVlcyBhcmUgYWxsb3dlZAotdm9pZCBDTVNFWFBPUlQgY21zTENoMkxhYihjbXNDSUVMYWIqIExhYiwgY29uc3QgY21zQ0lFTENoKiBMQ2gpCi17Ci0gICAgY21zRmxvYXQ2NE51bWJlciBoID0gKExDaCAtPiBoICogTV9QSSkgLyAxODAuMDsKLQotICAgIExhYiAtPiBMID0gTENoIC0+IEw7Ci0gICAgTGFiIC0+IGEgPSBMQ2ggLT4gQyAqIGNvcyhoKTsKLSAgICBMYWIgLT4gYiA9IExDaCAtPiBDICogc2luKGgpOwotfQotCi0vLyBJbiBYWVogQWxsIDMgY29tcG9uZW50cyBhcmUgZW5jb2RlZCB1c2luZyAxLjE1IGZpeGVkIHBvaW50Ci1zdGF0aWMKLWNtc1VJbnQxNk51bWJlciBYWVoyRml4KGNtc0Zsb2F0NjROdW1iZXIgZCkKLXsKLSAgICByZXR1cm4gX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKGQgKiAzMjc2OC4wKTsKLX0KLQotdm9pZCBDTVNFWFBPUlQgY21zRmxvYXQyWFlaRW5jb2RlZChjbXNVSW50MTZOdW1iZXIgWFlaWzNdLCBjb25zdCBjbXNDSUVYWVoqIGZYWVopCi17Ci0gICAgY21zQ0lFWFlaIHh5ejsKLQotICAgIHh5ei5YID0gZlhZWiAtPiBYOwotICAgIHh5ei5ZID0gZlhZWiAtPiBZOwotICAgIHh5ei5aID0gZlhZWiAtPiBaOwotCi0gICAgLy8gQ2xhbXAgdG8gZW5jb2RlYWJsZSB2YWx1ZXMuCi0gICAgaWYgKHh5ei5ZIDw9IDApIHsKLQotICAgICAgICB4eXouWCA9IDA7Ci0gICAgICAgIHh5ei5ZID0gMDsKLSAgICAgICAgeHl6LlogPSAwOwotICAgIH0KLQotICAgIGlmICh4eXouWCA+IE1BWF9FTkNPREVBQkxFX1hZWikKLSAgICAgICAgeHl6LlggPSBNQVhfRU5DT0RFQUJMRV9YWVo7Ci0KLSAgICBpZiAoeHl6LlggPCAwKQotICAgICAgICB4eXouWCA9IDA7Ci0KLSAgICBpZiAoeHl6LlkgPiBNQVhfRU5DT0RFQUJMRV9YWVopCi0gICAgICAgIHh5ei5ZID0gTUFYX0VOQ09ERUFCTEVfWFlaOwotCi0gICAgaWYgKHh5ei5ZIDwgMCkKLSAgICAgICAgeHl6LlkgPSAwOwotCi0gICAgaWYgKHh5ei5aID4gTUFYX0VOQ09ERUFCTEVfWFlaKQotICAgICAgICB4eXouWiA9IE1BWF9FTkNPREVBQkxFX1hZWjsKLQotICAgIGlmICh4eXouWiA8IDApCi0gICAgICAgIHh5ei5aID0gMDsKLQotCi0gICAgWFlaWzBdID0gWFlaMkZpeCh4eXouWCk7Ci0gICAgWFlaWzFdID0gWFlaMkZpeCh4eXouWSk7Ci0gICAgWFlaWzJdID0gWFlaMkZpeCh4eXouWik7Ci19Ci0KLQotLy8gIFRvIGNvbnZlcnQgZnJvbSBGaXhlZCAxLjE1IHBvaW50IHRvIGNtc0Zsb2F0NjROdW1iZXIKLXN0YXRpYwotY21zRmxvYXQ2NE51bWJlciBYWVoyZmxvYXQoY21zVUludDE2TnVtYmVyIHYpCi17Ci0gICAgY21zUzE1Rml4ZWQxNk51bWJlciBmaXgzMjsKLQotICAgIC8vIEZyb20gMS4xNSB0byAxNS4xNgotICAgIGZpeDMyID0gdiA8PCAxOwotCi0gICAgLy8gRnJvbSBmaXhlZCAxNS4xNiB0byBjbXNGbG9hdDY0TnVtYmVyCi0gICAgcmV0dXJuIF9jbXMxNUZpeGVkMTZ0b0RvdWJsZShmaXgzMik7Ci19Ci0KLQotdm9pZCBDTVNFWFBPUlQgY21zWFlaRW5jb2RlZDJGbG9hdChjbXNDSUVYWVoqIGZYWVosIGNvbnN0IGNtc1VJbnQxNk51bWJlciBYWVpbM10pCi17Ci0gICAgZlhZWiAtPiBYID0gWFlaMmZsb2F0KFhZWlswXSk7Ci0gICAgZlhZWiAtPiBZID0gWFlaMmZsb2F0KFhZWlsxXSk7Ci0gICAgZlhZWiAtPiBaID0gWFlaMmZsb2F0KFhZWlsyXSk7Ci19Ci0KLQotLy8gUmV0dXJucyBkRSBvbiB0d28gTGFiIHZhbHVlcwotY21zRmxvYXQ2NE51bWJlciBDTVNFWFBPUlQgY21zRGVsdGFFKGNvbnN0IGNtc0NJRUxhYiogTGFiMSwgY29uc3QgY21zQ0lFTGFiKiBMYWIyKQotewotICAgIGNtc0Zsb2F0NjROdW1iZXIgZEwsIGRhLCBkYjsKLQotICAgIGRMID0gZmFicyhMYWIxIC0+IEwgLSBMYWIyIC0+IEwpOwotICAgIGRhID0gZmFicyhMYWIxIC0+IGEgLSBMYWIyIC0+IGEpOwotICAgIGRiID0gZmFicyhMYWIxIC0+IGIgLSBMYWIyIC0+IGIpOwotCi0gICAgcmV0dXJuIHBvdyhTcXIoZEwpICsgU3FyKGRhKSArIFNxcihkYiksIDAuNSk7Ci19Ci0KLQotLy8gUmV0dXJuIHRoZSBDSUU5NCBEZWx0YSBFCi1jbXNGbG9hdDY0TnVtYmVyIENNU0VYUE9SVCBjbXNDSUU5NERlbHRhRShjb25zdCBjbXNDSUVMYWIqIExhYjEsIGNvbnN0IGNtc0NJRUxhYiogTGFiMikKLXsKLSAgICBjbXNDSUVMQ2ggTENoMSwgTENoMjsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIGRFLCBkTCwgZEMsIGRoLCBkaHNxOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgYzEyLCBzYywgc2g7Ci0KLSAgICBkTCA9IGZhYnMoTGFiMSAtPkwgLSBMYWIyIC0+TCk7Ci0KLSAgICBjbXNMYWIyTENoKCZMQ2gxLCBMYWIxKTsKLSAgICBjbXNMYWIyTENoKCZMQ2gyLCBMYWIyKTsKLQotICAgIGRDICA9IGZhYnMoTENoMS5DIC0gTENoMi5DKTsKLSAgICBkRSAgPSBjbXNEZWx0YUUoTGFiMSwgTGFiMik7Ci0KLSAgICBkaHNxID0gU3FyKGRFKSAtIFNxcihkTCkgLSBTcXIoZEMpOwotICAgIGlmIChkaHNxIDwgMCkKLSAgICAgICAgZGggPSAwOwotICAgIGVsc2UKLSAgICAgICAgZGggPSBwb3coZGhzcSwgMC41KTsKLQotICAgIGMxMiA9IHNxcnQoTENoMS5DICogTENoMi5DKTsKLQotICAgIHNjID0gMS4wICsgKDAuMDQ4ICogYzEyKTsKLSAgICBzaCA9IDEuMCArICgwLjAxNCAqIGMxMik7Ci0KLSAgICByZXR1cm4gc3FydChTcXIoZEwpICArIFNxcihkQykgLyBTcXIoc2MpICsgU3FyKGRoKSAvIFNxcihzaCkpOwotfQotCi0KLS8vIEF1eGlsaWFyeQotc3RhdGljCi1jbXNGbG9hdDY0TnVtYmVyIENvbXB1dGVMQkZEKGNvbnN0IGNtc0NJRUxhYiogTGFiKQotewotICBjbXNGbG9hdDY0TnVtYmVyIHl0OwotCi0gIGlmIChMYWItPkwgPiA3Ljk5Njk2OSkKLSAgICAgICAgeXQgPSAoU3FyKChMYWItPkwrMTYpLzExNikqKChMYWItPkwrMTYpLzExNikpKjEwMDsKLSAgZWxzZQotICAgICAgICB5dCA9IDEwMCAqIChMYWItPkwgLyA5MDMuMyk7Ci0KLSAgcmV0dXJuICg1NC42ICogKE1fTE9HMTBFICogKGxvZyh5dCArIDEuNSkpKSAtIDkuNik7Ci19Ci0KLQotCi0vLyBiZmQgLSBnZXRzIEJGRCgxOjEpIGRpZmZlcmVuY2UgYmV0d2VlbiBMYWIxLCBMYWIyCi1jbXNGbG9hdDY0TnVtYmVyIENNU0VYUE9SVCBjbXNCRkRkZWx0YUUoY29uc3QgY21zQ0lFTGFiKiBMYWIxLCBjb25zdCBjbXNDSUVMYWIqIExhYjIpCi17Ci0gICAgY21zRmxvYXQ2NE51bWJlciBsYmZkMSxsYmZkMixBdmVDLEF2ZWgsZEUsZGVsdGFMLAotICAgICAgICBkZWx0YUMsZGVsdGFoLGRjLHQsZyxkaCxyaCxyYyxydCxiZmQ7Ci0gICAgY21zQ0lFTENoIExDaDEsIExDaDI7Ci0KLQotICAgIGxiZmQxID0gQ29tcHV0ZUxCRkQoTGFiMSk7Ci0gICAgbGJmZDIgPSBDb21wdXRlTEJGRChMYWIyKTsKLSAgICBkZWx0YUwgPSBsYmZkMiAtIGxiZmQxOwotCi0gICAgY21zTGFiMkxDaCgmTENoMSwgTGFiMSk7Ci0gICAgY21zTGFiMkxDaCgmTENoMiwgTGFiMik7Ci0KLSAgICBkZWx0YUMgPSBMQ2gyLkMgLSBMQ2gxLkM7Ci0gICAgQXZlQyA9IChMQ2gxLkMrTENoMi5DKS8yOwotICAgIEF2ZWggPSAoTENoMS5oK0xDaDIuaCkvMjsKLQotICAgIGRFID0gY21zRGVsdGFFKExhYjEsIExhYjIpOwotCi0gICAgaWYgKFNxcihkRSk+KFNxcihMYWIyLT5MLUxhYjEtPkwpK1NxcihkZWx0YUMpKSkKLSAgICAgICAgZGVsdGFoID0gc3FydChTcXIoZEUpLVNxcihMYWIyLT5MLUxhYjEtPkwpLVNxcihkZWx0YUMpKTsKLSAgICBlbHNlCi0gICAgICAgIGRlbHRhaCA9MDsKLQotCi0gICAgZGMgICA9IDAuMDM1ICogQXZlQyAvICgxICsgMC4wMDM2NSAqIEF2ZUMpKzAuNTIxOwotICAgIGcgICAgPSBzcXJ0KFNxcihTcXIoQXZlQykpLyhTcXIoU3FyKEF2ZUMpKSsxNDAwMCkpOwotICAgIHQgICAgPSAwLjYyNysoMC4wNTUqY29zKChBdmVoLTI1NCkvKDE4MC9NX1BJKSktCi0gICAgICAgICAgIDAuMDQwKmNvcygoMipBdmVoLTEzNikvKDE4MC9NX1BJKSkrCi0gICAgICAgICAgIDAuMDcwKmNvcygoMypBdmVoLTMxKS8oMTgwL01fUEkpKSsKLSAgICAgICAgICAgMC4wNDkqY29zKCg0KkF2ZWgrMTE0KS8oMTgwL01fUEkpKS0KLSAgICAgICAgICAgMC4wMTUqY29zKCg1KkF2ZWgtMTAzKS8oMTgwL01fUEkpKSk7Ci0KLSAgICBkaCAgICA9IGRjKihnKnQrMS1nKTsKLSAgICByaCAgICA9IC0wLjI2MCpjb3MoKEF2ZWgtMzA4KS8oMTgwL01fUEkpKS0KLSAgICAgICAgICAgMC4zNzkqY29zKCgyKkF2ZWgtMTYwKS8oMTgwL01fUEkpKS0KLSAgICAgICAgICAgMC42MzYqY29zKCgzKkF2ZWgrMjU0KS8oMTgwL01fUEkpKSsKLSAgICAgICAgICAgMC4yMjYqY29zKCg0KkF2ZWgrMTQwKS8oMTgwL01fUEkpKS0KLSAgICAgICAgICAgMC4xOTQqY29zKCg1KkF2ZWgrMjgwKS8oMTgwL01fUEkpKTsKLQotICAgIHJjID0gc3FydCgoQXZlQypBdmVDKkF2ZUMqQXZlQypBdmVDKkF2ZUMpLygoQXZlQypBdmVDKkF2ZUMqQXZlQypBdmVDKkF2ZUMpKzcwMDAwMDAwKSk7Ci0gICAgcnQgPSByaCpyYzsKLQotICAgIGJmZCA9IHNxcnQoU3FyKGRlbHRhTCkrU3FyKGRlbHRhQy9kYykrU3FyKGRlbHRhaC9kaCkrKHJ0KihkZWx0YUMvZGMpKihkZWx0YWgvZGgpKSk7Ci0KLSAgICByZXR1cm4gYmZkOwotfQotCi0KLS8vICBjbWMgLSBDTUMobDpjKSBkaWZmZXJlbmNlIGJldHdlZW4gTGFiMSwgTGFiMgotY21zRmxvYXQ2NE51bWJlciBDTVNFWFBPUlQgY21zQ01DZGVsdGFFKGNvbnN0IGNtc0NJRUxhYiogTGFiMSwgY29uc3QgY21zQ0lFTGFiKiBMYWIyLCBjbXNGbG9hdDY0TnVtYmVyIGwsIGNtc0Zsb2F0NjROdW1iZXIgYykKLXsKLSAgY21zRmxvYXQ2NE51bWJlciBkRSxkTCxkQyxkaCxzbCxzYyxzaCx0LGYsY21jOwotICBjbXNDSUVMQ2ggTENoMSwgTENoMjsKLQotICBpZiAoTGFiMSAtPkwgPT0gMCAmJiBMYWIyIC0+TCA9PSAwKSByZXR1cm4gMDsKLQotICBjbXNMYWIyTENoKCZMQ2gxLCBMYWIxKTsKLSAgY21zTGFiMkxDaCgmTENoMiwgTGFiMik7Ci0KLQotICBkTCA9IExhYjItPkwtTGFiMS0+TDsKLSAgZEMgPSBMQ2gyLkMtTENoMS5DOwotCi0gIGRFID0gY21zRGVsdGFFKExhYjEsIExhYjIpOwotCi0gIGlmIChTcXIoZEUpPihTcXIoZEwpK1NxcihkQykpKQotICAgICAgICAgICAgZGggPSBzcXJ0KFNxcihkRSktU3FyKGRMKS1TcXIoZEMpKTsKLSAgZWxzZQotICAgICAgICAgICAgZGggPTA7Ci0KLSAgaWYgKChMQ2gxLmggPiAxNjQpICYmIChMQ2gxLmggPCAzNDUpKQotICAgICAgdCA9IDAuNTYgKyBmYWJzKDAuMiAqIGNvcygoKExDaDEuaCArIDE2OCkvKDE4MC9NX1BJKSkpKTsKLSAgZWxzZQotICAgICAgdCA9IDAuMzYgKyBmYWJzKDAuNCAqIGNvcygoKExDaDEuaCArIDM1ICkvKDE4MC9NX1BJKSkpKTsKLQotICAgc2MgID0gMC4wNjM4ICAgKiBMQ2gxLkMgLyAoMSArIDAuMDEzMSAgKiBMQ2gxLkMpICsgMC42Mzg7Ci0gICBzbCAgPSAwLjA0MDk3NSAqIExhYjEtPkwgLygxICsgMC4wMTc2NSAqIExhYjEtPkwpOwotCi0gICBpZiAoTGFiMS0+TDwxNikKLSAgICAgICAgIHNsID0gMC41MTE7Ci0KLSAgIGYgICA9IHNxcnQoKExDaDEuQyAqIExDaDEuQyAqIExDaDEuQyAqIExDaDEuQykvKChMQ2gxLkMgKiBMQ2gxLkMgKiBMQ2gxLkMgKiBMQ2gxLkMpKzE5MDApKTsKLSAgIHNoICA9IHNjKih0KmYrMS1mKTsKLSAgIGNtYyA9IHNxcnQoU3FyKGRMLyhsKnNsKSkrU3FyKGRDLyhjKnNjKSkrU3FyKGRoL3NoKSk7Ci0KLSAgIHJldHVybiBjbWM7Ci19Ci0KLS8vIGRFMjAwMCBUaGUgd2VpZ2h0aW5ncyBLTCwgS0MgYW5kIEtIIGNhbiBiZSBtb2RpZmllZCB0byByZWZsZWN0IHRoZSByZWxhdGl2ZQotLy8gaW1wb3J0YW5jZSBvZiBsaWdodG5lc3MsIGNocm9tYSBhbmQgaHVlIGluIGRpZmZlcmVudCBpbmR1c3RyaWFsIGFwcGxpY2F0aW9ucwotY21zRmxvYXQ2NE51bWJlciBDTVNFWFBPUlQgY21zQ0lFMjAwMERlbHRhRShjb25zdCBjbXNDSUVMYWIqIExhYjEsIGNvbnN0IGNtc0NJRUxhYiogTGFiMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEtsLCBjbXNGbG9hdDY0TnVtYmVyIEtjLCBjbXNGbG9hdDY0TnVtYmVyIEtoKQotewotICAgIGNtc0Zsb2F0NjROdW1iZXIgTDEgID0gTGFiMS0+TDsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIGExICA9IExhYjEtPmE7Ci0gICAgY21zRmxvYXQ2NE51bWJlciBiMSAgPSBMYWIxLT5iOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgQyAgID0gc3FydCggU3FyKGExKSArIFNxcihiMSkgKTsKLQotICAgIGNtc0Zsb2F0NjROdW1iZXIgTHMgPSBMYWIyIC0+TDsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIGFzID0gTGFiMiAtPmE7Ci0gICAgY21zRmxvYXQ2NE51bWJlciBicyA9IExhYjIgLT5iOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgQ3MgPSBzcXJ0KCBTcXIoYXMpICsgU3FyKGJzKSApOwotCi0gICAgY21zRmxvYXQ2NE51bWJlciBHID0gMC41ICogKCAxIC0gc3FydChwb3coKEMgKyBDcykgLyAyICwgNy4wKSAvIChwb3coKEMgKyBDcykgLyAyLCA3LjApICsgcG93KDI1LjAsIDcuMCkgKSApKTsKLQotICAgIGNtc0Zsb2F0NjROdW1iZXIgYV9wID0gKDEgKyBHICkgKiBhMTsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIGJfcCA9IGIxOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgQ19wID0gc3FydCggU3FyKGFfcCkgKyBTcXIoYl9wKSk7Ci0gICAgY21zRmxvYXQ2NE51bWJlciBoX3AgPSBhdGFuMmRlZyhiX3AsIGFfcCk7Ci0KLQotICAgIGNtc0Zsb2F0NjROdW1iZXIgYV9wcyA9ICgxICsgRykgKiBhczsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIGJfcHMgPSBiczsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIENfcHMgPSBzcXJ0KFNxcihhX3BzKSArIFNxcihiX3BzKSk7Ci0gICAgY21zRmxvYXQ2NE51bWJlciBoX3BzID0gYXRhbjJkZWcoYl9wcywgYV9wcyk7Ci0KLSAgICBjbXNGbG9hdDY0TnVtYmVyIG1lYW5DX3AgPShDX3AgKyBDX3BzKSAvIDI7Ci0KLSAgICBjbXNGbG9hdDY0TnVtYmVyIGhwc19wbHVzX2hwICA9IGhfcHMgKyBoX3A7Ci0gICAgY21zRmxvYXQ2NE51bWJlciBocHNfbWludXNfaHAgPSBoX3BzIC0gaF9wOwotCi0gICAgY21zRmxvYXQ2NE51bWJlciBtZWFuaF9wID0gZmFicyhocHNfbWludXNfaHApIDw9IDE4MC4wMDAwMDEgPyAoaHBzX3BsdXNfaHApLzIgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChocHNfcGx1c19ocCkgPCAzNjAgPyAoaHBzX3BsdXNfaHAgKyAzNjApLzIgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChocHNfcGx1c19ocCAtIDM2MCkvMjsKLQotICAgIGNtc0Zsb2F0NjROdW1iZXIgZGVsdGFfaCA9IChocHNfbWludXNfaHApIDw9IC0xODAuMDAwMDAxID8gIChocHNfbWludXNfaHAgKyAzNjApIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaHBzX21pbnVzX2hwKSA+IDE4MCA/IChocHNfbWludXNfaHAgLSAzNjApIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaHBzX21pbnVzX2hwKTsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIGRlbHRhX0wgPSAoTHMgLSBMMSk7Ci0gICAgY21zRmxvYXQ2NE51bWJlciBkZWx0YV9DID0gKENfcHMgLSBDX3AgKTsKLQotCi0gICAgY21zRmxvYXQ2NE51bWJlciBkZWx0YV9IID0yICogc3FydChDX3BzKkNfcCkgKiBzaW4oUkFESUFOUyhkZWx0YV9oKSAvIDIpOwotCi0gICAgY21zRmxvYXQ2NE51bWJlciBUID0gMSAtIDAuMTcgKiBjb3MoUkFESUFOUyhtZWFuaF9wLTMwKSkKLSAgICAgICAgICAgICAgICAgKyAwLjI0ICogY29zKFJBRElBTlMoMiptZWFuaF9wKSkKLSAgICAgICAgICAgICAgICAgKyAwLjMyICogY29zKFJBRElBTlMoMyptZWFuaF9wICsgNikpCi0gICAgICAgICAgICAgICAgIC0gMC4yICAqIGNvcyhSQURJQU5TKDQqbWVhbmhfcCAtIDYzKSk7Ci0KLSAgICBjbXNGbG9hdDY0TnVtYmVyIFNsID0gMSArICgwLjAxNSAqIFNxcigoTHMgKyBMMSkgLzItIDUwKSApLyBzcXJ0KDIwICsgU3FyKCAoTHMrTDEpLzIgLSA1MCkgKTsKLQotICAgIGNtc0Zsb2F0NjROdW1iZXIgU2MgPSAxICsgMC4wNDUgKiAoQ19wICsgQ19wcykvMjsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIFNoID0gMSArIDAuMDE1ICogKChDX3BzICsgQ19wKS8yKSAqIFQ7Ci0KLSAgICBjbXNGbG9hdDY0TnVtYmVyIGRlbHRhX3JvID0gMzAgKiBleHAoIC1TcXIoKChtZWFuaF9wIC0gMjc1ICkgLyAyNSkpKTsKLQotICAgIGNtc0Zsb2F0NjROdW1iZXIgUmMgPSAyICogc3FydCgoIHBvdyhtZWFuQ19wLCA3LjApICkvKCBwb3cobWVhbkNfcCwgNy4wKSArIHBvdygyNS4wLCA3LjApKSk7Ci0KLSAgICBjbXNGbG9hdDY0TnVtYmVyIFJ0ID0gLXNpbigyICogUkFESUFOUyhkZWx0YV9ybykpICogUmM7Ci0KLSAgICBjbXNGbG9hdDY0TnVtYmVyIGRlbHRhRTAwID0gc3FydCggU3FyKGRlbHRhX0wgLyhTbCAqIEtsKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNxcihkZWx0YV9DLyhTYyAqIEtjKSkgICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcXIoZGVsdGFfSC8oU2ggKiBLaCkpICArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUnQqKGRlbHRhX0MvKFNjICogS2MpKSAqIChkZWx0YV9IIC8gKFNoICogS2gpKSk7Ci0KLSAgICByZXR1cm4gZGVsdGFFMDA7Ci19Ci0KLS8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG51bWJlciBvZiBncmlkcG9pbnRzIHRvIGJlIHVzZWQgYXMgTFVUIHRhYmxlLiBJdCBhc3N1bWVzIHNhbWUgbnVtYmVyCi0vLyBvZiBncmlwZHBvaW50cyBpbiBhbGwgZGltZW5zaW9ucy4gRmxhZ3MgbWF5IG92ZXJyaWRlIHRoZSBjaG9pY2UuCi1pbnQgX2Ntc1JlYXNvbmFibGVHcmlkcG9pbnRzQnlDb2xvcnNwYWNlKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgQ29sb3JzcGFjZSwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpCi17Ci0gICAgaW50IG5DaGFubmVsczsKLQotICAgIC8vIEFscmVhZHkgc3BlY2lmaWVkPwotICAgIGlmIChkd0ZsYWdzICYgMHgwMEZGMDAwMCkgewotICAgICAgICAgICAgLy8gWWVzLCBncmFiJ2VtCi0gICAgICAgICAgICByZXR1cm4gKGR3RmxhZ3MgPj4gMTYpICYgMHhGRjsKLSAgICB9Ci0KLSAgICBuQ2hhbm5lbHMgPSBjbXNDaGFubmVsc09mKENvbG9yc3BhY2UpOwotCi0gICAgLy8gSGlnaFJlc1ByZWNhbGMgaXMgbWF4aW11bSByZXNvbHV0aW9uCi0gICAgaWYgKGR3RmxhZ3MgJiBjbXNGTEFHU19ISUdIUkVTUFJFQ0FMQykgewotCi0gICAgICAgIGlmIChuQ2hhbm5lbHMgPiA0KQotICAgICAgICAgICAgICAgIHJldHVybiA3OyAgICAgICAvLyA3IGZvciBIaWZpCi0KLSAgICAgICAgaWYgKG5DaGFubmVscyA9PSA0KSAgICAgLy8gMjMgZm9yIENNWUsKLSAgICAgICAgICAgICAgICByZXR1cm4gMjM7Ci0KLSAgICAgICAgcmV0dXJuIDQ5OyAgICAgIC8vIDQ5IGZvciBSR0IgYW5kIG90aGVycwotICAgIH0KLQotCi0gICAgLy8gTG93UmVzUHJlY2FsIGlzIGxvd2VyIHJlc29sdXRpb24KLSAgICBpZiAoZHdGbGFncyAmIGNtc0ZMQUdTX0xPV1JFU1BSRUNBTEMpIHsKLQotICAgICAgICBpZiAobkNoYW5uZWxzID4gNCkKLSAgICAgICAgICAgICAgICByZXR1cm4gNjsgICAgICAgLy8gNiBmb3IgbW9yZSB0aGFuIDQgY2hhbm5lbHMKLQotICAgICAgICBpZiAobkNoYW5uZWxzID09IDEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDMzOyAgICAgIC8vIEZvciBtb25vY2hyb21lCi0KLSAgICAgICAgcmV0dXJuIDE3OyAgICAgICAgICAgICAgLy8gMTcgZm9yIHJlbWFpbmluZwotICAgIH0KLQotICAgIC8vIERlZmF1bHQgdmFsdWVzCi0gICAgaWYgKG5DaGFubmVscyA+IDQpCi0gICAgICAgICAgICAgICAgcmV0dXJuIDc7ICAgICAgIC8vIDcgZm9yIEhpZmkKLQotICAgIGlmIChuQ2hhbm5lbHMgPT0gNCkKLSAgICAgICAgICAgICAgICByZXR1cm4gMTc7ICAgICAgLy8gMTcgZm9yIENNWUsKLQotICAgIHJldHVybiAzMzsgICAgICAgICAgICAgICAgICAvLyAzMyBmb3IgUkdCCi19Ci0KLQotY21zQm9vbCAgX2Ntc0VuZFBvaW50c0J5U3BhY2UoY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDE2TnVtYmVyICoqV2hpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQxNk51bWJlciAqKkJsYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgKm5PdXRwdXRzKQotewotICAgICAgIC8vIE9ubHkgbW9zdCBjb21tb24gc3BhY2VzCi0KLSAgICAgICBzdGF0aWMgY21zVUludDE2TnVtYmVyIFJHQmJsYWNrWzRdICA9IHsgMCwgMCwgMCB9OwotICAgICAgIHN0YXRpYyBjbXNVSW50MTZOdW1iZXIgUkdCd2hpdGVbNF0gID0geyAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmIH07Ci0gICAgICAgc3RhdGljIGNtc1VJbnQxNk51bWJlciBDTVlLYmxhY2tbNF0gPSB7IDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYsIDB4ZmZmZiB9OyAgIC8vIDQwMCUgb2YgaW5rCi0gICAgICAgc3RhdGljIGNtc1VJbnQxNk51bWJlciBDTVlLd2hpdGVbNF0gPSB7IDAsIDAsIDAsIDAgfTsKLSAgICAgICBzdGF0aWMgY21zVUludDE2TnVtYmVyIExBQmJsYWNrWzRdICA9IHsgMCwgMHg4MDgwLCAweDgwODAgfTsgICAgICAgICAgICAgICAvLyBWNCBMYWIgZW5jb2RpbmcKLSAgICAgICBzdGF0aWMgY21zVUludDE2TnVtYmVyIExBQndoaXRlWzRdICA9IHsgMHhGRkZGLCAweDgwODAsIDB4ODA4MCB9OwotICAgICAgIHN0YXRpYyBjbXNVSW50MTZOdW1iZXIgQ01ZYmxhY2tbNF0gID0geyAweGZmZmYsIDB4ZmZmZiwgMHhmZmZmIH07Ci0gICAgICAgc3RhdGljIGNtc1VJbnQxNk51bWJlciBDTVl3aGl0ZVs0XSAgPSB7IDAsIDAsIDAgfTsKLSAgICAgICBzdGF0aWMgY21zVUludDE2TnVtYmVyIEdyYXlibGFja1s0XSA9IHsgMCB9OwotICAgICAgIHN0YXRpYyBjbXNVSW50MTZOdW1iZXIgR3JheVdoaXRlWzRdID0geyAweGZmZmYgfTsKLQotICAgICAgIHN3aXRjaCAoU3BhY2UpIHsKLQotICAgICAgIGNhc2UgY21zU2lnR3JheURhdGE6IGlmIChXaGl0ZSkgICAgKldoaXRlID0gR3JheVdoaXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJsYWNrKSAgICAqQmxhY2sgPSBHcmF5YmxhY2s7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobk91dHB1dHMpICpuT3V0cHV0cyA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLQotICAgICAgIGNhc2UgY21zU2lnUmdiRGF0YTogIGlmIChXaGl0ZSkgICAgKldoaXRlID0gUkdCd2hpdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQmxhY2spICAgICpCbGFjayA9IFJHQmJsYWNrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5PdXRwdXRzKSAqbk91dHB1dHMgPSAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICAgICBjYXNlIGNtc1NpZ0xhYkRhdGE6ICBpZiAoV2hpdGUpICAgICpXaGl0ZSA9IExBQndoaXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEJsYWNrKSAgICAqQmxhY2sgPSBMQUJibGFjazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuT3V0cHV0cykgKm5PdXRwdXRzID0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotCi0gICAgICAgY2FzZSBjbXNTaWdDbXlrRGF0YTogaWYgKFdoaXRlKSAgICAqV2hpdGUgPSBDTVlLd2hpdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQmxhY2spICAgICpCbGFjayA9IENNWUtibGFjazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuT3V0cHV0cykgKm5PdXRwdXRzID0gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotCi0gICAgICAgY2FzZSBjbXNTaWdDbXlEYXRhOiAgaWYgKFdoaXRlKSAgICAqV2hpdGUgPSBDTVl3aGl0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChCbGFjaykgICAgKkJsYWNrID0gQ01ZYmxhY2s7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobk91dHB1dHMpICpuT3V0cHV0cyA9IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKLQotICAgICAgIGRlZmF1bHQ6OwotICAgICAgIH0KLQotICByZXR1cm4gRkFMU0U7Ci19Ci0KLQotCi0vLyBTZXZlcmFsIHV0aWxpdGllcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFRyYW5zbGF0ZSBmcm9tIG91ciBjb2xvcnNwYWNlIHRvIElDQyByZXByZXNlbnRhdGlvbgotCi1jbXNDb2xvclNwYWNlU2lnbmF0dXJlIENNU0VYUE9SVCBfY21zSUNDY29sb3JTcGFjZShpbnQgT3VyTm90YXRpb24pCi17Ci0gICAgICAgc3dpdGNoIChPdXJOb3RhdGlvbikgewotCi0gICAgICAgY2FzZSAxOgotICAgICAgIGNhc2UgUFRfR1JBWTogcmV0dXJuIGNtc1NpZ0dyYXlEYXRhOwotCi0gICAgICAgY2FzZSAyOgotICAgICAgIGNhc2UgUFRfUkdCOiAgcmV0dXJuIGNtc1NpZ1JnYkRhdGE7Ci0KLSAgICAgICBjYXNlIFBUX0NNWTogIHJldHVybiBjbXNTaWdDbXlEYXRhOwotICAgICAgIGNhc2UgUFRfQ01ZSzogcmV0dXJuIGNtc1NpZ0NteWtEYXRhOwotICAgICAgIGNhc2UgUFRfWUNiQ3I6cmV0dXJuIGNtc1NpZ1lDYkNyRGF0YTsKLSAgICAgICBjYXNlIFBUX1lVVjogIHJldHVybiBjbXNTaWdMdXZEYXRhOwotICAgICAgIGNhc2UgUFRfWFlaOiAgcmV0dXJuIGNtc1NpZ1hZWkRhdGE7Ci0KLSAgICAgICBjYXNlIFBUX0xhYlYyOgotICAgICAgIGNhc2UgUFRfTGFiOiAgcmV0dXJuIGNtc1NpZ0xhYkRhdGE7Ci0KLSAgICAgICBjYXNlIFBUX1lVVks6IHJldHVybiBjbXNTaWdMdXZLRGF0YTsKLSAgICAgICBjYXNlIFBUX0hTVjogIHJldHVybiBjbXNTaWdIc3ZEYXRhOwotICAgICAgIGNhc2UgUFRfSExTOiAgcmV0dXJuIGNtc1NpZ0hsc0RhdGE7Ci0gICAgICAgY2FzZSBQVF9ZeHk6ICByZXR1cm4gY21zU2lnWXh5RGF0YTsKLQotICAgICAgIGNhc2UgUFRfTUNIMTogcmV0dXJuIGNtc1NpZ01DSDFEYXRhOwotICAgICAgIGNhc2UgUFRfTUNIMjogcmV0dXJuIGNtc1NpZ01DSDJEYXRhOwotICAgICAgIGNhc2UgUFRfTUNIMzogcmV0dXJuIGNtc1NpZ01DSDNEYXRhOwotICAgICAgIGNhc2UgUFRfTUNINDogcmV0dXJuIGNtc1NpZ01DSDREYXRhOwotICAgICAgIGNhc2UgUFRfTUNINTogcmV0dXJuIGNtc1NpZ01DSDVEYXRhOwotICAgICAgIGNhc2UgUFRfTUNINjogcmV0dXJuIGNtc1NpZ01DSDZEYXRhOwotICAgICAgIGNhc2UgUFRfTUNINzogcmV0dXJuIGNtc1NpZ01DSDdEYXRhOwotICAgICAgIGNhc2UgUFRfTUNIODogcmV0dXJuIGNtc1NpZ01DSDhEYXRhOwotCi0gICAgICAgY2FzZSBQVF9NQ0g5OiAgcmV0dXJuIGNtc1NpZ01DSDlEYXRhOwotICAgICAgIGNhc2UgUFRfTUNIMTA6IHJldHVybiBjbXNTaWdNQ0hBRGF0YTsKLSAgICAgICBjYXNlIFBUX01DSDExOiByZXR1cm4gY21zU2lnTUNIQkRhdGE7Ci0gICAgICAgY2FzZSBQVF9NQ0gxMjogcmV0dXJuIGNtc1NpZ01DSENEYXRhOwotICAgICAgIGNhc2UgUFRfTUNIMTM6IHJldHVybiBjbXNTaWdNQ0hERGF0YTsKLSAgICAgICBjYXNlIFBUX01DSDE0OiByZXR1cm4gY21zU2lnTUNIRURhdGE7Ci0gICAgICAgY2FzZSBQVF9NQ0gxNTogcmV0dXJuIGNtc1NpZ01DSEZEYXRhOwotCi0gICAgICAgZGVmYXVsdDogIHJldHVybiAoY21zQ29sb3JTcGFjZVNpZ25hdHVyZSkgKC0xKTsKLSAgICAgICB9Ci19Ci0KLQotaW50IENNU0VYUE9SVCBfY21zTENNU2NvbG9yU3BhY2UoY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBQcm9maWxlU3BhY2UpCi17Ci0gICAgc3dpdGNoIChQcm9maWxlU3BhY2UpIHsKLQotICAgIGNhc2UgY21zU2lnR3JheURhdGE6IHJldHVybiAgUFRfR1JBWTsKLSAgICBjYXNlIGNtc1NpZ1JnYkRhdGE6ICByZXR1cm4gIFBUX1JHQjsKLSAgICBjYXNlIGNtc1NpZ0NteURhdGE6ICByZXR1cm4gIFBUX0NNWTsKLSAgICBjYXNlIGNtc1NpZ0NteWtEYXRhOiByZXR1cm4gIFBUX0NNWUs7Ci0gICAgY2FzZSBjbXNTaWdZQ2JDckRhdGE6cmV0dXJuICBQVF9ZQ2JDcjsKLSAgICBjYXNlIGNtc1NpZ0x1dkRhdGE6ICByZXR1cm4gIFBUX1lVVjsKLSAgICBjYXNlIGNtc1NpZ1hZWkRhdGE6ICByZXR1cm4gIFBUX1hZWjsKLSAgICBjYXNlIGNtc1NpZ0xhYkRhdGE6ICByZXR1cm4gIFBUX0xhYjsKLSAgICBjYXNlIGNtc1NpZ0x1dktEYXRhOiByZXR1cm4gIFBUX1lVVks7Ci0gICAgY2FzZSBjbXNTaWdIc3ZEYXRhOiAgcmV0dXJuICBQVF9IU1Y7Ci0gICAgY2FzZSBjbXNTaWdIbHNEYXRhOiAgcmV0dXJuICBQVF9ITFM7Ci0gICAgY2FzZSBjbXNTaWdZeHlEYXRhOiAgcmV0dXJuICBQVF9ZeHk7Ci0KLSAgICBjYXNlIGNtc1NpZzFjb2xvckRhdGE6Ci0gICAgY2FzZSBjbXNTaWdNQ0gxRGF0YTogcmV0dXJuIFBUX01DSDE7Ci0KLSAgICBjYXNlIGNtc1NpZzJjb2xvckRhdGE6Ci0gICAgY2FzZSBjbXNTaWdNQ0gyRGF0YTogcmV0dXJuIFBUX01DSDI7Ci0KLSAgICBjYXNlIGNtc1NpZzNjb2xvckRhdGE6Ci0gICAgY2FzZSBjbXNTaWdNQ0gzRGF0YTogcmV0dXJuIFBUX01DSDM7Ci0KLSAgICBjYXNlIGNtc1NpZzRjb2xvckRhdGE6Ci0gICAgY2FzZSBjbXNTaWdNQ0g0RGF0YTogcmV0dXJuIFBUX01DSDQ7Ci0KLSAgICBjYXNlIGNtc1NpZzVjb2xvckRhdGE6Ci0gICAgY2FzZSBjbXNTaWdNQ0g1RGF0YTogcmV0dXJuIFBUX01DSDU7Ci0KLSAgICBjYXNlIGNtc1NpZzZjb2xvckRhdGE6Ci0gICAgY2FzZSBjbXNTaWdNQ0g2RGF0YTogcmV0dXJuIFBUX01DSDY7Ci0KLSAgICBjYXNlIGNtc1NpZ01DSDdEYXRhOgotICAgIGNhc2UgY21zU2lnN2NvbG9yRGF0YTpyZXR1cm4gUFRfTUNINzsKLQotICAgIGNhc2UgY21zU2lnTUNIOERhdGE6Ci0gICAgY2FzZSBjbXNTaWc4Y29sb3JEYXRhOnJldHVybiBQVF9NQ0g4OwotCi0gICAgY2FzZSBjbXNTaWdNQ0g5RGF0YToKLSAgICBjYXNlIGNtc1NpZzljb2xvckRhdGE6cmV0dXJuIFBUX01DSDk7Ci0KLSAgICBjYXNlIGNtc1NpZ01DSEFEYXRhOgotICAgIGNhc2UgY21zU2lnMTBjb2xvckRhdGE6cmV0dXJuIFBUX01DSDEwOwotCi0gICAgY2FzZSBjbXNTaWdNQ0hCRGF0YToKLSAgICBjYXNlIGNtc1NpZzExY29sb3JEYXRhOnJldHVybiBQVF9NQ0gxMTsKLQotICAgIGNhc2UgY21zU2lnTUNIQ0RhdGE6Ci0gICAgY2FzZSBjbXNTaWcxMmNvbG9yRGF0YTpyZXR1cm4gUFRfTUNIMTI7Ci0KLSAgICBjYXNlIGNtc1NpZ01DSEREYXRhOgotICAgIGNhc2UgY21zU2lnMTNjb2xvckRhdGE6cmV0dXJuIFBUX01DSDEzOwotCi0gICAgY2FzZSBjbXNTaWdNQ0hFRGF0YToKLSAgICBjYXNlIGNtc1NpZzE0Y29sb3JEYXRhOnJldHVybiBQVF9NQ0gxNDsKLQotICAgIGNhc2UgY21zU2lnTUNIRkRhdGE6Ci0gICAgY2FzZSBjbXNTaWcxNWNvbG9yRGF0YTpyZXR1cm4gUFRfTUNIMTU7Ci0KLSAgICBkZWZhdWx0OiAgcmV0dXJuIChjbXNDb2xvclNwYWNlU2lnbmF0dXJlKSAoLTEpOwotICAgIH0KLX0KLQotCi1jbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUIGNtc0NoYW5uZWxzT2YoY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBDb2xvclNwYWNlKQotewotICAgIHN3aXRjaCAoQ29sb3JTcGFjZSkgewotCi0gICAgY2FzZSBjbXNTaWdNQ0gxRGF0YToKLSAgICBjYXNlIGNtc1NpZzFjb2xvckRhdGE6Ci0gICAgY2FzZSBjbXNTaWdHcmF5RGF0YTogcmV0dXJuIDE7Ci0KLSAgICBjYXNlIGNtc1NpZ01DSDJEYXRhOgotICAgIGNhc2UgY21zU2lnMmNvbG9yRGF0YTogIHJldHVybiAyOwotCi0gICAgY2FzZSBjbXNTaWdYWVpEYXRhOgotICAgIGNhc2UgY21zU2lnTGFiRGF0YToKLSAgICBjYXNlIGNtc1NpZ0x1dkRhdGE6Ci0gICAgY2FzZSBjbXNTaWdZQ2JDckRhdGE6Ci0gICAgY2FzZSBjbXNTaWdZeHlEYXRhOgotICAgIGNhc2UgY21zU2lnUmdiRGF0YToKLSAgICBjYXNlIGNtc1NpZ0hzdkRhdGE6Ci0gICAgY2FzZSBjbXNTaWdIbHNEYXRhOgotICAgIGNhc2UgY21zU2lnQ215RGF0YToKLSAgICBjYXNlIGNtc1NpZ01DSDNEYXRhOgotICAgIGNhc2UgY21zU2lnM2NvbG9yRGF0YTogIHJldHVybiAzOwotCi0gICAgY2FzZSBjbXNTaWdMdXZLRGF0YToKLSAgICBjYXNlIGNtc1NpZ0NteWtEYXRhOgotICAgIGNhc2UgY21zU2lnTUNINERhdGE6Ci0gICAgY2FzZSBjbXNTaWc0Y29sb3JEYXRhOiAgcmV0dXJuIDQ7Ci0KLSAgICBjYXNlIGNtc1NpZ01DSDVEYXRhOgotICAgIGNhc2UgY21zU2lnNWNvbG9yRGF0YTogIHJldHVybiA1OwotCi0gICAgY2FzZSBjbXNTaWdNQ0g2RGF0YToKLSAgICBjYXNlIGNtc1NpZzZjb2xvckRhdGE6ICByZXR1cm4gNjsKLQotICAgIGNhc2UgY21zU2lnTUNIN0RhdGE6Ci0gICAgY2FzZSBjbXNTaWc3Y29sb3JEYXRhOiAgcmV0dXJuICA3OwotCi0gICAgY2FzZSBjbXNTaWdNQ0g4RGF0YToKLSAgICBjYXNlIGNtc1NpZzhjb2xvckRhdGE6ICByZXR1cm4gIDg7Ci0KLSAgICBjYXNlIGNtc1NpZ01DSDlEYXRhOgotICAgIGNhc2UgY21zU2lnOWNvbG9yRGF0YTogIHJldHVybiAgOTsKLQotICAgIGNhc2UgY21zU2lnTUNIQURhdGE6Ci0gICAgY2FzZSBjbXNTaWcxMGNvbG9yRGF0YTogcmV0dXJuIDEwOwotCi0gICAgY2FzZSBjbXNTaWdNQ0hCRGF0YToKLSAgICBjYXNlIGNtc1NpZzExY29sb3JEYXRhOiByZXR1cm4gMTE7Ci0KLSAgICBjYXNlIGNtc1NpZ01DSENEYXRhOgotICAgIGNhc2UgY21zU2lnMTJjb2xvckRhdGE6IHJldHVybiAxMjsKLQotICAgIGNhc2UgY21zU2lnTUNIRERhdGE6Ci0gICAgY2FzZSBjbXNTaWcxM2NvbG9yRGF0YTogcmV0dXJuIDEzOwotCi0gICAgY2FzZSBjbXNTaWdNQ0hFRGF0YToKLSAgICBjYXNlIGNtc1NpZzE0Y29sb3JEYXRhOiByZXR1cm4gMTQ7Ci0KLSAgICBjYXNlIGNtc1NpZ01DSEZEYXRhOgotICAgIGNhc2UgY21zU2lnMTVjb2xvckRhdGE6IHJldHVybiAxNTsKLQotICAgIGRlZmF1bHQ6IHJldHVybiAzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zcGx1Z2luLmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3BsdWdpbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmM0MDAyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zcGx1Z2luLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NTkgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTAgTWFydGkgTWFyaWEgU2FndWVyCi0vLwotLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0vLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0vLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0vLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLS8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQotLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLS8vCi0vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0vLwotLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0vLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KLS8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi0vLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCi0vLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0vLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLS8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotCi0jaW5jbHVkZSAibGNtczJfaW50ZXJuYWwuaCIKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFbmNvZGluZyAmIERlY29kaW5nIHN1cHBvcnQgZnVuY3Rpb25zCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vICAgICAgTGl0dGxlLUVuZGlhbiB0byBCaWctRW5kaWFuCi0KLS8vIEFkanVzdCBhIHdvcmQgdmFsdWUgYWZ0ZXIgYmVpbmcgcmVhZGVkLyBiZWZvcmUgYmVpbmcgd3JpdHRlbiBmcm9tL3RvIGFuIElDQyBwcm9maWxlCi1jbXNVSW50MTZOdW1iZXIgQ01TRVhQT1JUICBfY21zQWRqdXN0RW5kaWFuZXNzMTYoY21zVUludDE2TnVtYmVyIFdvcmQpCi17Ci0jaWZuZGVmIENNU19VU0VfQklHX0VORElBTgotCi0gICAgY21zVUludDhOdW1iZXIqIHBCeXRlID0gKGNtc1VJbnQ4TnVtYmVyKikgJldvcmQ7Ci0gICAgY21zVUludDhOdW1iZXIgdG1wOwotCi0gICAgdG1wID0gcEJ5dGVbMF07Ci0gICAgcEJ5dGVbMF0gPSBwQnl0ZVsxXTsKLSAgICBwQnl0ZVsxXSA9IHRtcDsKLSNlbmRpZgotCi0gICAgcmV0dXJuIFdvcmQ7Ci19Ci0KLQotLy8gVHJhbnNwb3J0cyB0byBwcm9wZXJseSBlbmNvZGVkIHZhbHVlcyAtIG5vdGUgdGhhdCBpY2MgcHJvZmlsZXMgZG9lcyB1c2UgYmlnIGVuZGlhbiBub3RhdGlvbi4KLQotLy8gMSAyIDMgNAotLy8gNCAzIDIgMQotCi1jbXNVSW50MzJOdW1iZXIgQ01TRVhQT1JUICBfY21zQWRqdXN0RW5kaWFuZXNzMzIoY21zVUludDMyTnVtYmVyIERXb3JkKQotewotI2lmbmRlZiBDTVNfVVNFX0JJR19FTkRJQU4KLQotICAgIGNtc1VJbnQ4TnVtYmVyKiBwQnl0ZSA9IChjbXNVSW50OE51bWJlciopICZEV29yZDsKLSAgICBjbXNVSW50OE51bWJlciB0ZW1wMTsKLSAgICBjbXNVSW50OE51bWJlciB0ZW1wMjsKLQotICAgIHRlbXAxID0gKnBCeXRlKys7Ci0gICAgdGVtcDIgPSAqcEJ5dGUrKzsKLSAgICAqKHBCeXRlLTEpID0gKnBCeXRlOwotICAgICpwQnl0ZSsrID0gdGVtcDI7Ci0gICAgKihwQnl0ZS0zKSA9ICpwQnl0ZTsKLSAgICAqcEJ5dGUgPSB0ZW1wMTsKLSNlbmRpZgotICAgIHJldHVybiBEV29yZDsKLX0KLQotLy8gMSAyIDMgNCA1IDYgNyA4Ci0vLyA4IDcgNiA1IDQgMyAyIDEKLQotdm9pZCBDTVNFWFBPUlQgIF9jbXNBZGp1c3RFbmRpYW5lc3M2NChjbXNVSW50NjROdW1iZXIqIFJlc3VsdCwgY21zVUludDY0TnVtYmVyKiBRV29yZCkKLXsKLQotI2lmbmRlZiBDTVNfVVNFX0JJR19FTkRJQU4KLQotICAgIGNtc1VJbnQ4TnVtYmVyKiBwSW4gID0gKGNtc1VJbnQ4TnVtYmVyKikgUVdvcmQ7Ci0gICAgY21zVUludDhOdW1iZXIqIHBPdXQgPSAoY21zVUludDhOdW1iZXIqKSBSZXN1bHQ7Ci0KLSAgICBfY21zQXNzZXJ0KFJlc3VsdCAhPSBOVUxMKTsKLQotICAgIHBPdXRbN10gPSBwSW5bMF07Ci0gICAgcE91dFs2XSA9IHBJblsxXTsKLSAgICBwT3V0WzVdID0gcEluWzJdOwotICAgIHBPdXRbNF0gPSBwSW5bM107Ci0gICAgcE91dFszXSA9IHBJbls0XTsKLSAgICBwT3V0WzJdID0gcEluWzVdOwotICAgIHBPdXRbMV0gPSBwSW5bNl07Ci0gICAgcE91dFswXSA9IHBJbls3XTsKLQotI2Vsc2UKLSAgICBfY21zQXNzZXJ0KFJlc3VsdCAhPSBOVUxMKTsKLQotIyAgaWZkZWYgQ01TX0RPTlRfVVNFX0lOVDY0Ci0gICAgKCpSZXN1bHQpWzBdID0gUVdvcmRbMF07Ci0gICAgKCpSZXN1bHQpWzFdID0gUVdvcmRbMV07Ci0jICBlbHNlCi0gICAgKlJlc3VsdCA9ICpRV29yZDsKLSMgIGVuZGlmCi0jZW5kaWYKLX0KLQotLy8gQXV4aWxpYXIgLS0gcmVhZCA4LCAxNiBhbmQgMzItYml0IG51bWJlcnMKLWNtc0Jvb2wgQ01TRVhQT1JUICBfY21zUmVhZFVJbnQ4TnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQ4TnVtYmVyKiBuKQotewotICAgIGNtc1VJbnQ4TnVtYmVyIHRtcDsKLQotICAgIF9jbXNBc3NlcnQoaW8gIT0gTlVMTCk7Ci0KLSAgICBpZiAoaW8gLT4gUmVhZChpbywgJnRtcCwgc2l6ZW9mKGNtc1VJbnQ4TnVtYmVyKSwgMSkgIT0gMSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIGlmIChuICE9IE5VTEwpICpuID0gdG1wOwotICAgIHJldHVybiBUUlVFOwotfQotCi1jbXNCb29sIENNU0VYUE9SVCAgX2Ntc1JlYWRVSW50MTZOdW1iZXIoY21zSU9IQU5ETEVSKiBpbywgY21zVUludDE2TnVtYmVyKiBuKQotewotICAgIGNtc1VJbnQxNk51bWJlciB0bXA7Ci0KLSAgICBfY21zQXNzZXJ0KGlvICE9IE5VTEwpOwotCi0gICAgaWYgKGlvIC0+IFJlYWQoaW8sICZ0bXAsIHNpemVvZihjbXNVSW50MTZOdW1iZXIpLCAxKSAhPSAxKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKG4gIT0gTlVMTCkgKm4gPSBfY21zQWRqdXN0RW5kaWFuZXNzMTYodG1wKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotY21zQm9vbCBDTVNFWFBPUlQgIF9jbXNSZWFkVUludDE2QXJyYXkoY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyIG4sIGNtc1VJbnQxNk51bWJlciogQXJyYXkpCi17Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0KLSAgICBfY21zQXNzZXJ0KGlvICE9IE5VTEwpOwotCi0gICAgZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKLQotICAgICAgICBpZiAoQXJyYXkgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgQXJyYXkgKyBpKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgTlVMTCkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotCi0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotCi1jbXNCb29sIENNU0VYUE9SVCAgX2Ntc1JlYWRVSW50MzJOdW1iZXIoY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyKiBuKQotewotICAgIGNtc1VJbnQzMk51bWJlciB0bXA7Ci0KLSAgICBfY21zQXNzZXJ0KGlvICE9IE5VTEwpOwotCi0gICAgaWYgKGlvIC0+IFJlYWQoaW8sICZ0bXAsIHNpemVvZihjbXNVSW50MzJOdW1iZXIpLCAxKSAhPSAxKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKG4gIT0gTlVMTCkgKm4gPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIodG1wKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotY21zQm9vbCBDTVNFWFBPUlQgIF9jbXNSZWFkRmxvYXQzMk51bWJlcihjbXNJT0hBTkRMRVIqIGlvLCBjbXNGbG9hdDMyTnVtYmVyKiBuKQotewotICAgIGNtc1VJbnQzMk51bWJlciB0bXA7Ci0KLSAgICBfY21zQXNzZXJ0KGlvICE9IE5VTEwpOwotCi0gICAgaWYgKGlvIC0+IFJlYWQoaW8sICZ0bXAsIHNpemVvZihjbXNGbG9hdDMyTnVtYmVyKSwgMSkgIT0gMSkKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLQotICAgIGlmIChuICE9IE5VTEwpIHsKLQotICAgICAgICB0bXAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIodG1wKTsKLSAgICAgICAgKm4gPSAqKGNtc0Zsb2F0MzJOdW1iZXIqKSAmdG1wOwotICAgICAgICBpZiAoaXNuYW4oKm4pKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIC8vIGZwY2xhc3NpZnkoKSByZXF1aXJlZCBieSBDOTkKLSAgICByZXR1cm4gKGZwY2xhc3NpZnkoKm4pID09IEZQX1pFUk8pIHx8IChmcGNsYXNzaWZ5KCpuKSA9PSBGUF9OT1JNQUwpOwotfQotCi0KLWNtc0Jvb2wgQ01TRVhQT1JUICAgX2Ntc1JlYWRVSW50NjROdW1iZXIoY21zSU9IQU5ETEVSKiBpbywgY21zVUludDY0TnVtYmVyKiBuKQotewotICAgIGNtc1VJbnQ2NE51bWJlciB0bXA7Ci0KLSAgICBfY21zQXNzZXJ0KGlvICE9IE5VTEwpOwotCi0gICAgaWYgKGlvIC0+IFJlYWQoaW8sICZ0bXAsIHNpemVvZihjbXNVSW50NjROdW1iZXIpLCAxKSAhPSAxKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKG4gIT0gTlVMTCkgX2Ntc0FkanVzdEVuZGlhbmVzczY0KG4sICZ0bXApOwotICAgIHJldHVybiBUUlVFOwotfQotCi0KLWNtc0Jvb2wgQ01TRVhQT1JUICBfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihjbXNJT0hBTkRMRVIqIGlvLCBjbXNGbG9hdDY0TnVtYmVyKiBuKQotewotICAgIGNtc1VJbnQzMk51bWJlciB0bXA7Ci0KLSAgICBfY21zQXNzZXJ0KGlvICE9IE5VTEwpOwotCi0gICAgaWYgKGlvIC0+IFJlYWQoaW8sICZ0bXAsIHNpemVvZihjbXNVSW50MzJOdW1iZXIpLCAxKSAhPSAxKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKG4gIT0gTlVMTCkgewotICAgICAgICAqbiA9IF9jbXMxNUZpeGVkMTZ0b0RvdWJsZShfY21zQWRqdXN0RW5kaWFuZXNzMzIodG1wKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLy8gSnVuLTIxLTIwMDA6IFNvbWUgcHJvZmlsZXMgKHRob3NlIHRoYXQgY29tZXMgd2l0aCBXMkspIGNvbWVzCi0vLyB3aXRoIHRoZSBtZWRpYSB3aGl0ZSAobWVkaWEgYmxhY2s/KSB4IDEwMC4gQWRkIGEgc2FuaXR5IGNoZWNrCi0KLXN0YXRpYwotdm9pZCBOb3JtYWxpemVYWVooY21zQ0lFWFlaKiBEZXN0KQotewotICAgIHdoaWxlIChEZXN0IC0+IFggPiAyLiAmJgotICAgICAgICAgICBEZXN0IC0+IFkgPiAyLiAmJgotICAgICAgICAgICBEZXN0IC0+IFogPiAyLikgewotCi0gICAgICAgICAgICAgICBEZXN0IC0+IFggLz0gMTAuOwotICAgICAgICAgICAgICAgRGVzdCAtPiBZIC89IDEwLjsKLSAgICAgICAgICAgICAgIERlc3QgLT4gWiAvPSAxMC47Ci0gICAgICAgfQotfQotCi1jbXNCb29sIENNU0VYUE9SVCAgX2Ntc1JlYWRYWVpOdW1iZXIoY21zSU9IQU5ETEVSKiBpbywgY21zQ0lFWFlaKiBYWVopCi17Ci0gICAgY21zRW5jb2RlZFhZWk51bWJlciB4eXo7Ci0KLSAgICBfY21zQXNzZXJ0KGlvICE9IE5VTEwpOwotCi0gICAgaWYgKGlvIC0+UmVhZChpbywgJnh5eiwgc2l6ZW9mKGNtc0VuY29kZWRYWVpOdW1iZXIpLCAxKSAhPSAxKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBpZiAoWFlaICE9IE5VTEwpIHsKLQotICAgICAgICBYWVotPlggPSBfY21zMTVGaXhlZDE2dG9Eb3VibGUoX2Ntc0FkanVzdEVuZGlhbmVzczMyKHh5ei5YKSk7Ci0gICAgICAgIFhZWi0+WSA9IF9jbXMxNUZpeGVkMTZ0b0RvdWJsZShfY21zQWRqdXN0RW5kaWFuZXNzMzIoeHl6LlkpKTsKLSAgICAgICAgWFlaLT5aID0gX2NtczE1Rml4ZWQxNnRvRG91YmxlKF9jbXNBZGp1c3RFbmRpYW5lc3MzMih4eXouWikpOwotCi0gICAgICAgIE5vcm1hbGl6ZVhZWihYWVopOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotY21zQm9vbCBDTVNFWFBPUlQgIF9jbXNXcml0ZVVJbnQ4TnVtYmVyKGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQ4TnVtYmVyIG4pCi17Ci0gICAgX2Ntc0Fzc2VydChpbyAhPSBOVUxMKTsKLQotICAgIGlmIChpbyAtPiBXcml0ZShpbywgc2l6ZW9mKGNtc1VJbnQ4TnVtYmVyKSwgJm4pICE9IDEpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotY21zQm9vbCBDTVNFWFBPUlQgIF9jbXNXcml0ZVVJbnQxNk51bWJlcihjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MTZOdW1iZXIgbikKLXsKLSAgICBjbXNVSW50MTZOdW1iZXIgdG1wOwotCi0gICAgX2Ntc0Fzc2VydChpbyAhPSBOVUxMKTsKLQotICAgIHRtcCA9IF9jbXNBZGp1c3RFbmRpYW5lc3MxNihuKTsKLSAgICBpZiAoaW8gLT4gV3JpdGUoaW8sIHNpemVvZihjbXNVSW50MTZOdW1iZXIpLCAmdG1wKSAhPSAxKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWNtc0Jvb2wgQ01TRVhQT1JUICBfY21zV3JpdGVVSW50MTZBcnJheShjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIgbiwgY29uc3QgY21zVUludDE2TnVtYmVyKiBBcnJheSkKLXsKLSAgICBjbXNVSW50MzJOdW1iZXIgaTsKLQotICAgIF9jbXNBc3NlcnQoaW8gIT0gTlVMTCk7Ci0gICAgX2Ntc0Fzc2VydChBcnJheSAhPSBOVUxMKTsKLQotICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCBBcnJheVtpXSkpIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotY21zQm9vbCBDTVNFWFBPUlQgIF9jbXNXcml0ZVVJbnQzMk51bWJlcihjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIgbikKLXsKLSAgICBjbXNVSW50MzJOdW1iZXIgdG1wOwotCi0gICAgX2Ntc0Fzc2VydChpbyAhPSBOVUxMKTsKLQotICAgIHRtcCA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMihuKTsKLSAgICBpZiAoaW8gLT4gV3JpdGUoaW8sIHNpemVvZihjbXNVSW50MzJOdW1iZXIpLCAmdG1wKSAhPSAxKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotY21zQm9vbCBDTVNFWFBPUlQgIF9jbXNXcml0ZUZsb2F0MzJOdW1iZXIoY21zSU9IQU5ETEVSKiBpbywgY21zRmxvYXQzMk51bWJlciBuKQotewotICAgIGNtc1VJbnQzMk51bWJlciB0bXA7Ci0KLSAgICBfY21zQXNzZXJ0KGlvICE9IE5VTEwpOwotCi0gICAgdG1wID0gKihjbXNVSW50MzJOdW1iZXIqKSAmbjsKLSAgICB0bXAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIodG1wKTsKLSAgICBpZiAoaW8gLT4gV3JpdGUoaW8sIHNpemVvZihjbXNVSW50MzJOdW1iZXIpLCAmdG1wKSAhPSAxKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWNtc0Jvb2wgQ01TRVhQT1JUICBfY21zV3JpdGVVSW50NjROdW1iZXIoY21zSU9IQU5ETEVSKiBpbywgY21zVUludDY0TnVtYmVyKiBuKQotewotICAgIGNtc1VJbnQ2NE51bWJlciB0bXA7Ci0KLSAgICBfY21zQXNzZXJ0KGlvICE9IE5VTEwpOwotCi0gICAgX2Ntc0FkanVzdEVuZGlhbmVzczY0KCZ0bXAsIG4pOwotICAgIGlmIChpbyAtPiBXcml0ZShpbywgc2l6ZW9mKGNtc1VJbnQ2NE51bWJlciksICZ0bXApICE9IDEpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotY21zQm9vbCBDTVNFWFBPUlQgIF9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihjbXNJT0hBTkRMRVIqIGlvLCBjbXNGbG9hdDY0TnVtYmVyIG4pCi17Ci0gICAgY21zVUludDMyTnVtYmVyIHRtcDsKLQotICAgIF9jbXNBc3NlcnQoaW8gIT0gTlVMTCk7Ci0KLSAgICB0bXAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoX2Ntc0RvdWJsZVRvMTVGaXhlZDE2KG4pKTsKLSAgICBpZiAoaW8gLT4gV3JpdGUoaW8sIHNpemVvZihjbXNVSW50MzJOdW1iZXIpLCAmdG1wKSAhPSAxKQotICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLWNtc0Jvb2wgQ01TRVhQT1JUICBfY21zV3JpdGVYWVpOdW1iZXIoY21zSU9IQU5ETEVSKiBpbywgY29uc3QgY21zQ0lFWFlaKiBYWVopCi17Ci0gICAgY21zRW5jb2RlZFhZWk51bWJlciB4eXo7Ci0KLSAgICBfY21zQXNzZXJ0KGlvICE9IE5VTEwpOwotICAgIF9jbXNBc3NlcnQoWFlaICE9IE5VTEwpOwotCi0gICAgeHl6LlggPSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoX2Ntc0RvdWJsZVRvMTVGaXhlZDE2KFhZWi0+WCkpOwotICAgIHh5ei5ZID0gX2Ntc0FkanVzdEVuZGlhbmVzczMyKF9jbXNEb3VibGVUbzE1Rml4ZWQxNihYWVotPlkpKTsKLSAgICB4eXouWiA9IF9jbXNBZGp1c3RFbmRpYW5lc3MzMihfY21zRG91YmxlVG8xNUZpeGVkMTYoWFlaLT5aKSk7Ci0KLSAgICByZXR1cm4gaW8gLT4gV3JpdGUoaW8sICBzaXplb2YoY21zRW5jb2RlZFhZWk51bWJlciksICZ4eXopOwotfQotCi0vLyBmcm9tIEZpeGVkIHBvaW50IDguOCB0byBkb3VibGUKLWNtc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIF9jbXM4Rml4ZWQ4dG9Eb3VibGUoY21zVUludDE2TnVtYmVyIGZpeGVkOCkKLXsKLSAgICAgICBjbXNVSW50OE51bWJlciAgbXNiLCBsc2I7Ci0KLSAgICAgICBsc2IgPSAoY21zVUludDhOdW1iZXIpIChmaXhlZDggJiAweGZmKTsKLSAgICAgICBtc2IgPSAoY21zVUludDhOdW1iZXIpICgoKGNtc1VJbnQxNk51bWJlcikgZml4ZWQ4ID4+IDgpICYgMHhmZik7Ci0KLSAgICAgICByZXR1cm4gKGNtc0Zsb2F0NjROdW1iZXIpICgoY21zRmxvYXQ2NE51bWJlcikgbXNiICsgKChjbXNGbG9hdDY0TnVtYmVyKSBsc2IgLyAyNTYuMCkpOwotfQotCi1jbXNVSW50MTZOdW1iZXIgQ01TRVhQT1JUIF9jbXNEb3VibGVUbzhGaXhlZDgoY21zRmxvYXQ2NE51bWJlciB2YWwpCi17Ci0gICAgY21zUzE1Rml4ZWQxNk51bWJlciBHYW1tYUZpeGVkMzIgPSBfY21zRG91YmxlVG8xNUZpeGVkMTYodmFsKTsKLSAgICByZXR1cm4gIChjbXNVSW50MTZOdW1iZXIpICgoR2FtbWFGaXhlZDMyID4+IDgpICYgMHhGRkZGKTsKLX0KLQotLy8gZnJvbSBGaXhlZCBwb2ludCAxNS4xNiB0byBkb3VibGUKLWNtc0Zsb2F0NjROdW1iZXIgQ01TRVhQT1JUIF9jbXMxNUZpeGVkMTZ0b0RvdWJsZShjbXNTMTVGaXhlZDE2TnVtYmVyIGZpeDMyKQotewotICAgIGNtc0Zsb2F0NjROdW1iZXIgZmxvYXRlciwgc2lnbiwgbWlkOwotICAgIGludCBXaG9sZSwgRnJhY1BhcnQ7Ci0KLSAgICBzaWduICA9IChmaXgzMiA8IDAgPyAtMSA6IDEpOwotICAgIGZpeDMyID0gYWJzKGZpeDMyKTsKLQotICAgIFdob2xlICAgICA9IChjbXNVSW50MTZOdW1iZXIpKGZpeDMyID4+IDE2KSAmIDB4ZmZmZjsKLSAgICBGcmFjUGFydCAgPSAoY21zVUludDE2TnVtYmVyKShmaXgzMiAmIDB4ZmZmZik7Ci0KLSAgICBtaWQgICAgID0gKGNtc0Zsb2F0NjROdW1iZXIpIEZyYWNQYXJ0IC8gNjU1MzYuMDsKLSAgICBmbG9hdGVyID0gKGNtc0Zsb2F0NjROdW1iZXIpIFdob2xlICsgbWlkOwotCi0gICAgcmV0dXJuIHNpZ24gKiBmbG9hdGVyOwotfQotCi0vLyBmcm9tIGRvdWJsZSB0byBGaXhlZCBwb2ludCAxNS4xNgotY21zUzE1Rml4ZWQxNk51bWJlciBDTVNFWFBPUlQgX2Ntc0RvdWJsZVRvMTVGaXhlZDE2KGNtc0Zsb2F0NjROdW1iZXIgdikKLXsKLSAgICByZXR1cm4gKChjbXNTMTVGaXhlZDE2TnVtYmVyKSBmbG9vcigodikqNjU1MzYuMCArIDAuNSkpOwotfQotCi0vLyBEYXRlL1RpbWUgZnVuY3Rpb25zCi0KLXZvaWQgQ01TRVhQT1JUIF9jbXNEZWNvZGVEYXRlVGltZU51bWJlcihjb25zdCBjbXNEYXRlVGltZU51bWJlciAqU291cmNlLCBzdHJ1Y3QgdG0gKkRlc3QpCi17Ci0KLSAgICBfY21zQXNzZXJ0KERlc3QgIT0gTlVMTCk7Ci0gICAgX2Ntc0Fzc2VydChTb3VyY2UgIT0gTlVMTCk7Ci0KLSAgICBEZXN0LT50bV9zZWMgICA9IF9jbXNBZGp1c3RFbmRpYW5lc3MxNihTb3VyY2UtPnNlY29uZHMpOwotICAgIERlc3QtPnRtX21pbiAgID0gX2Ntc0FkanVzdEVuZGlhbmVzczE2KFNvdXJjZS0+bWludXRlcyk7Ci0gICAgRGVzdC0+dG1faG91ciAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMTYoU291cmNlLT5ob3Vycyk7Ci0gICAgRGVzdC0+dG1fbWRheSAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMTYoU291cmNlLT5kYXkpOwotICAgIERlc3QtPnRtX21vbiAgID0gX2Ntc0FkanVzdEVuZGlhbmVzczE2KFNvdXJjZS0+bW9udGgpIC0gMTsKLSAgICBEZXN0LT50bV95ZWFyICA9IF9jbXNBZGp1c3RFbmRpYW5lc3MxNihTb3VyY2UtPnllYXIpIC0gMTkwMDsKLSAgICBEZXN0LT50bV93ZGF5ICA9IC0xOwotICAgIERlc3QtPnRtX3lkYXkgID0gLTE7Ci0gICAgRGVzdC0+dG1faXNkc3QgPSAwOwotfQotCi12b2lkIENNU0VYUE9SVCBfY21zRW5jb2RlRGF0ZVRpbWVOdW1iZXIoY21zRGF0ZVRpbWVOdW1iZXIgKkRlc3QsIGNvbnN0IHN0cnVjdCB0bSAqU291cmNlKQotewotICAgIF9jbXNBc3NlcnQoRGVzdCAhPSBOVUxMKTsKLSAgICBfY21zQXNzZXJ0KFNvdXJjZSAhPSBOVUxMKTsKLQotICAgIERlc3QtPnNlY29uZHMgPSBfY21zQWRqdXN0RW5kaWFuZXNzMTYoKGNtc1VJbnQxNk51bWJlcikgU291cmNlLT50bV9zZWMpOwotICAgIERlc3QtPm1pbnV0ZXMgPSBfY21zQWRqdXN0RW5kaWFuZXNzMTYoKGNtc1VJbnQxNk51bWJlcikgU291cmNlLT50bV9taW4pOwotICAgIERlc3QtPmhvdXJzICAgPSBfY21zQWRqdXN0RW5kaWFuZXNzMTYoKGNtc1VJbnQxNk51bWJlcikgU291cmNlLT50bV9ob3VyKTsKLSAgICBEZXN0LT5kYXkgICAgID0gX2Ntc0FkanVzdEVuZGlhbmVzczE2KChjbXNVSW50MTZOdW1iZXIpIFNvdXJjZS0+dG1fbWRheSk7Ci0gICAgRGVzdC0+bW9udGggICA9IF9jbXNBZGp1c3RFbmRpYW5lc3MxNigoY21zVUludDE2TnVtYmVyKSAoU291cmNlLT50bV9tb24gKyAxKSk7Ci0gICAgRGVzdC0+eWVhciAgICA9IF9jbXNBZGp1c3RFbmRpYW5lc3MxNigoY21zVUludDE2TnVtYmVyKSAoU291cmNlLT50bV95ZWFyICsgMTkwMCkpOwotfQotCi0vLyBSZWFkIGJhc2UgYW5kIHJldHVybiB0eXBlIGJhc2UKLWNtc1RhZ1R5cGVTaWduYXR1cmUgQ01TRVhQT1JUIF9jbXNSZWFkVHlwZUJhc2UoY21zSU9IQU5ETEVSKiBpbykKLXsKLSAgICBfY21zVGFnQmFzZSBCYXNlOwotCi0gICAgX2Ntc0Fzc2VydChpbyAhPSBOVUxMKTsKLQotICAgIGlmIChpbyAtPiBSZWFkKGlvLCAmQmFzZSwgc2l6ZW9mKF9jbXNUYWdCYXNlKSwgMSkgIT0gMSkKLSAgICAgICAgcmV0dXJuIChjbXNUYWdUeXBlU2lnbmF0dXJlKSAwOwotCi0gICAgcmV0dXJuIChjbXNUYWdUeXBlU2lnbmF0dXJlKSBfY21zQWRqdXN0RW5kaWFuZXNzMzIoQmFzZS5zaWcpOwotfQotCi0vLyBTZXR1cCBiYXNlIG1hcmtlcgotY21zQm9vbCAgQ01TRVhQT1JUIF9jbXNXcml0ZVR5cGVCYXNlKGNtc0lPSEFORExFUiogaW8sIGNtc1RhZ1R5cGVTaWduYXR1cmUgc2lnKQotewotICAgIF9jbXNUYWdCYXNlICBCYXNlOwotCi0gICAgX2Ntc0Fzc2VydChpbyAhPSBOVUxMKTsKLQotICAgIEJhc2Uuc2lnID0gKGNtc1RhZ1R5cGVTaWduYXR1cmUpIF9jbXNBZGp1c3RFbmRpYW5lc3MzMihzaWcpOwotICAgIG1lbXNldCgmQmFzZS5yZXNlcnZlZCwgMCwgc2l6ZW9mKEJhc2UucmVzZXJ2ZWQpKTsKLSAgICByZXR1cm4gaW8gLT4gV3JpdGUoaW8sIHNpemVvZihfY21zVGFnQmFzZSksICZCYXNlKTsKLX0KLQotY21zQm9vbCBDTVNFWFBPUlQgX2Ntc1JlYWRBbGlnbm1lbnQoY21zSU9IQU5ETEVSKiBpbykKLXsKLSAgICBjbXNVSW50OE51bWJlciAgQnVmZmVyWzRdOwotICAgIGNtc1VJbnQzMk51bWJlciBOZXh0QWxpZ25lZCwgQXQ7Ci0gICAgY21zVUludDMyTnVtYmVyIEJ5dGVzVG9OZXh0QWxpZ25lZFBvczsKLQotICAgIF9jbXNBc3NlcnQoaW8gIT0gTlVMTCk7Ci0KLSAgICBBdCA9IGlvIC0+IFRlbGwoaW8pOwotICAgIE5leHRBbGlnbmVkID0gX2Ntc0FMSUdOTE9ORyhBdCk7Ci0gICAgQnl0ZXNUb05leHRBbGlnbmVkUG9zID0gTmV4dEFsaWduZWQgLSBBdDsKLSAgICBpZiAoQnl0ZXNUb05leHRBbGlnbmVkUG9zID09IDApIHJldHVybiBUUlVFOwotICAgIGlmIChCeXRlc1RvTmV4dEFsaWduZWRQb3MgPiA0KSAgcmV0dXJuIEZBTFNFOwotCi0gICAgcmV0dXJuIChpbyAtPlJlYWQoaW8sIEJ1ZmZlciwgQnl0ZXNUb05leHRBbGlnbmVkUG9zLCAxKSA9PSAxKTsKLX0KLQotY21zQm9vbCBDTVNFWFBPUlQgX2Ntc1dyaXRlQWxpZ25tZW50KGNtc0lPSEFORExFUiogaW8pCi17Ci0gICAgY21zVUludDhOdW1iZXIgIEJ1ZmZlcls0XTsKLSAgICBjbXNVSW50MzJOdW1iZXIgTmV4dEFsaWduZWQsIEF0OwotICAgIGNtc1VJbnQzMk51bWJlciBCeXRlc1RvTmV4dEFsaWduZWRQb3M7Ci0KLSAgICBfY21zQXNzZXJ0KGlvICE9IE5VTEwpOwotCi0gICAgQXQgPSBpbyAtPiBUZWxsKGlvKTsKLSAgICBOZXh0QWxpZ25lZCA9IF9jbXNBTElHTkxPTkcoQXQpOwotICAgIEJ5dGVzVG9OZXh0QWxpZ25lZFBvcyA9IE5leHRBbGlnbmVkIC0gQXQ7Ci0gICAgaWYgKEJ5dGVzVG9OZXh0QWxpZ25lZFBvcyA9PSAwKSByZXR1cm4gVFJVRTsKLSAgICBpZiAoQnl0ZXNUb05leHRBbGlnbmVkUG9zID4gNCkgIHJldHVybiBGQUxTRTsKLQotICAgIG1lbXNldChCdWZmZXIsIDAsIEJ5dGVzVG9OZXh0QWxpZ25lZFBvcyk7Ci0gICAgcmV0dXJuIGlvIC0+IFdyaXRlKGlvLCBCeXRlc1RvTmV4dEFsaWduZWRQb3MsIEJ1ZmZlcik7Ci19Ci0KLQotLy8gVG8gZGVhbCB3aXRoIHRleHQgc3RyZWFtcy4gMksgYXQgbW9zdAotY21zQm9vbCBDTVNFWFBPUlQgX2Ntc0lPUHJpbnRmKGNtc0lPSEFORExFUiogaW8sIGNvbnN0IGNoYXIqIGZybSwgLi4uKQotewotICAgIHZhX2xpc3QgYXJnczsKLSAgICBpbnQgbGVuOwotICAgIGNtc1VJbnQ4TnVtYmVyIEJ1ZmZlclsyMDQ4XTsKLSAgICBjbXNCb29sIHJjOwotCi0gICAgX2Ntc0Fzc2VydChpbyAhPSBOVUxMKTsKLSAgICBfY21zQXNzZXJ0KGZybSAhPSBOVUxMKTsKLQotICAgIHZhX3N0YXJ0KGFyZ3MsIGZybSk7Ci0KLSAgICBsZW4gPSB2c25wcmludGYoKGNoYXIqKSBCdWZmZXIsIDIwNDcsIGZybSwgYXJncyk7Ci0gICAgaWYgKGxlbiA8IDApIHJldHVybiBGQUxTRTsgICAvLyBUcnVuY2F0ZWQsIHdoaWNoIGlzIGEgZmF0YWwgZXJyb3IgZm9yIHVzCi0KLSAgICByYyA9IGlvIC0+V3JpdGUoaW8sIGxlbiwgQnVmZmVyKTsKLQotICAgIHZhX2VuZChhcmdzKTsKLQotICAgIHJldHVybiByYzsKLX0KLQotCi0vLyBQbHVnaW4gbWVtb3J5IG1hbmFnZW1lbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBTcGVjaWFsaXplZCBtYWxsb2MgZm9yIHBsdWctaW5zLCB0aGF0IGlzIGZyZWVkIHVwb24gZXhpdC4KLXZvaWQqIF9jbXNQbHVnaW5NYWxsb2MoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBzaXplKQotewotICAgIHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCA9IF9jbXNHZXRDb250ZXh0KENvbnRleHRJRCk7Ci0KLSAgICBpZiAoY3R4IC0+TWVtUG9vbCA9PSBOVUxMKSB7Ci0KLSAgICAgICAgaWYgKENvbnRleHRJRCA9PSBOVUxMKSB7Ci0KLSAgICAgICAgICAgIGN0eC0+TWVtUG9vbCA9IF9jbXNDcmVhdGVTdWJBbGxvYygwLCAyKjEwMjQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9DT1JSVVBUSU9OX0RFVEVDVEVELCAiTlVMTCBtZW1vcnkgcG9vbCBvbiBjb250ZXh0Iik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBfY21zU3ViQWxsb2MoY3R4LT5NZW1Qb29sLCBzaXplKTsKLX0KLQotCi0vLyBNYWluIHBsdWctaW4gZGlzcGF0Y2hlcgotY21zQm9vbCBDTVNFWFBPUlQgY21zUGx1Z2luKHZvaWQqIFBsdWdfaW4pCi17Ci0gICAgcmV0dXJuIGNtc1BsdWdpblRIUihOVUxMLCBQbHVnX2luKTsKLX0KLQotY21zQm9vbCBDTVNFWFBPUlQgY21zUGx1Z2luVEhSKGNtc0NvbnRleHQgaWQsIHZvaWQqIFBsdWdfaW4pCi17Ci0gICAgY21zUGx1Z2luQmFzZSogUGx1Z2luOwotCi0gICAgZm9yIChQbHVnaW4gPSAoY21zUGx1Z2luQmFzZSopIFBsdWdfaW47Ci0gICAgICAgICBQbHVnaW4gIT0gTlVMTDsKLSAgICAgICAgIFBsdWdpbiA9IFBsdWdpbiAtPiBOZXh0KSB7Ci0KLSAgICAgICAgICAgIGlmIChQbHVnaW4gLT4gTWFnaWMgIT0gY21zUGx1Z2luTWFnaWNOdW1iZXIpIHsKLSAgICAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihpZCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJVbnJlY29nbml6ZWQgcGx1Z2luIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoUGx1Z2luIC0+RXhwZWN0ZWRWZXJzaW9uID4gTENNU19WRVJTSU9OKSB7Ci0gICAgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoaWQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAicGx1Z2luIG5lZWRzIExpdHRsZSBDTVMgJWQsIGN1cnJlbnQgdmVyc2lvbiBpcyAlZCIsCi0gICAgICAgICAgICAgICAgICAgIFBsdWdpbiAtPkV4cGVjdGVkVmVyc2lvbiwgTENNU19WRVJTSU9OKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN3aXRjaCAoUGx1Z2luIC0+IFR5cGUpIHsKLQotICAgICAgICAgICAgICAgIGNhc2UgY21zUGx1Z2luTWVtSGFuZGxlclNpZzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFfY21zUmVnaXN0ZXJNZW1IYW5kbGVyUGx1Z2luKGlkLCBQbHVnaW4pKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBjbXNQbHVnaW5JbnRlcnBvbGF0aW9uU2lnOgotICAgICAgICAgICAgICAgICAgICBpZiAoIV9jbXNSZWdpc3RlckludGVycFBsdWdpbihpZCwgUGx1Z2luKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgY21zUGx1Z2luVGFnVHlwZVNpZzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFfY21zUmVnaXN0ZXJUYWdUeXBlUGx1Z2luKGlkLCBQbHVnaW4pKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBjbXNQbHVnaW5UYWdTaWc6Ci0gICAgICAgICAgICAgICAgICAgIGlmICghX2Ntc1JlZ2lzdGVyVGFnUGx1Z2luKGlkLCBQbHVnaW4pKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBjbXNQbHVnaW5Gb3JtYXR0ZXJzU2lnOgotICAgICAgICAgICAgICAgICAgICBpZiAoIV9jbXNSZWdpc3RlckZvcm1hdHRlcnNQbHVnaW4oaWQsIFBsdWdpbikpIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIGNtc1BsdWdpblJlbmRlcmluZ0ludGVudFNpZzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFfY21zUmVnaXN0ZXJSZW5kZXJpbmdJbnRlbnRQbHVnaW4oaWQsIFBsdWdpbikpIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIGNtc1BsdWdpblBhcmFtZXRyaWNDdXJ2ZVNpZzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFfY21zUmVnaXN0ZXJQYXJhbWV0cmljQ3VydmVzUGx1Z2luKGlkLCBQbHVnaW4pKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBjbXNQbHVnaW5NdWx0aVByb2Nlc3NFbGVtZW50U2lnOgotICAgICAgICAgICAgICAgICAgICBpZiAoIV9jbXNSZWdpc3Rlck11bHRpUHJvY2Vzc0VsZW1lbnRQbHVnaW4oaWQsIFBsdWdpbikpIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIGNtc1BsdWdpbk9wdGltaXphdGlvblNpZzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFfY21zUmVnaXN0ZXJPcHRpbWl6YXRpb25QbHVnaW4oaWQsIFBsdWdpbikpIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIGNtc1BsdWdpblRyYW5zZm9ybVNpZzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFfY21zUmVnaXN0ZXJUcmFuc2Zvcm1QbHVnaW4oaWQsIFBsdWdpbikpIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIGNtc1BsdWdpbk11dGV4U2lnOgotICAgICAgICAgICAgICAgICAgICBpZiAoIV9jbXNSZWdpc3Rlck11dGV4UGx1Z2luKGlkLCBQbHVnaW4pKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3IoaWQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5yZWNvZ25pemVkIHBsdWdpbiB0eXBlICclWCciLCBQbHVnaW4gLT4gVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBLZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBwbHVnLWluCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLy8gUmV2ZXJ0IGFsbCBwbHVnLWlucyB0byBkZWZhdWx0Ci12b2lkIENNU0VYUE9SVCBjbXNVbnJlZ2lzdGVyUGx1Z2lucyh2b2lkKQotewotICAgIGNtc1VucmVnaXN0ZXJQbHVnaW5zVEhSKE5VTEwpOwotfQotCi0KLS8vIFRoZSBHbG9iYWwgc3RvcmFnZSBmb3Igc3lzdGVtIGNvbnRleHQuIFRoaXMgaXMgdGhlIG9uZSBhbmQgb25seSBnbG9iYWwgdmFyaWFibGUKLS8vIHBvaW50ZXJzIHN0cnVjdHVyZS4gQWxsIGdsb2JhbCB2YXJzIGFyZSByZWZlcmVuY2VkIGhlcmUuCi1zdGF0aWMgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCBnbG9iYWxDb250ZXh0ID0gewotCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3QgaW4gdGhlIGxpbmtlZCBsaXN0Ci0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBzdWJhbGxvY2F0b3IKLSAgICB7Ci0gICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgVXNlclB0ciwgICAgICAgICAgICAKLSAgICAgICAgJl9jbXNMb2dFcnJvckNodW5rLCAgICAgICAgICAgIC8vICBMb2dnZXIsCi0gICAgICAgICZfY21zQWxhcm1Db2Rlc0NodW5rLCAgICAgICAgICAvLyAgQWxhcm1Db2RlcywKLSAgICAgICAgJl9jbXNBZGFwdGF0aW9uU3RhdGVDaHVuaywgICAgIC8vICBBZGFwdGF0aW9uU3RhdGUsIAotICAgICAgICAmX2Ntc01lbVBsdWdpbkNodW5rLCAgICAgICAgICAgLy8gIE1lbVBsdWdpbiwKLSAgICAgICAgJl9jbXNJbnRlcnBQbHVnaW5DaHVuaywgICAgICAgIC8vICBJbnRlcnBQbHVnaW4sCi0gICAgICAgICZfY21zQ3VydmVzUGx1Z2luQ2h1bmssICAgICAgICAvLyAgQ3VydmVzUGx1Z2luLAotICAgICAgICAmX2Ntc0Zvcm1hdHRlcnNQbHVnaW5DaHVuaywgICAgLy8gIEZvcm1hdHRlcnNQbHVnaW4sCi0gICAgICAgICZfY21zVGFnVHlwZVBsdWdpbkNodW5rLCAgICAgICAvLyAgVGFnVHlwZVBsdWdpbiwKLSAgICAgICAgJl9jbXNUYWdQbHVnaW5DaHVuaywgICAgICAgICAgIC8vICBUYWdQbHVnaW4sCi0gICAgICAgICZfY21zSW50ZW50c1BsdWdpbkNodW5rLCAgICAgICAvLyAgSW50ZW50UGx1Z2luLAotICAgICAgICAmX2Ntc01QRVR5cGVQbHVnaW5DaHVuaywgICAgICAgLy8gIE1QRVBsdWdpbiwKLSAgICAgICAgJl9jbXNPcHRpbWl6YXRpb25QbHVnaW5DaHVuaywgIC8vICBPcHRpbWl6YXRpb25QbHVnaW4sCi0gICAgICAgICZfY21zVHJhbnNmb3JtUGx1Z2luQ2h1bmssICAgICAvLyAgVHJhbnNmb3JtUGx1Z2luLAotICAgICAgICAmX2Ntc011dGV4UGx1Z2luQ2h1bmsgICAgICAgICAgLy8gIE11dGV4UGx1Z2luCi0gICAgfSwKLSAgICAKLSAgICB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwgfSAvLyBUaGUgZGVmYXVsdCBtZW1vcnkgYWxsb2NhdG9yIGlzIG5vdCB1c2VkIGZvciBjb250ZXh0IDAKLX07Ci0KLQotLy8gVGhlIGNvbnRleHQgcG9vbCAobGlua2VkIGxpc3QgaGVhZCkKLXN0YXRpYyBfY21zTXV0ZXggX2Ntc0NvbnRleHRQb29sSGVhZE11dGV4ID0gQ01TX01VVEVYX0lOSVRJQUxJWkVSOwotc3RhdGljIHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIF9jbXNDb250ZXh0UG9vbEhlYWQgPSBOVUxMOwotCi0vLyBJbnRlcm5hbCwgZ2V0IGFzc29jaWF0ZWQgcG9pbnRlciwgd2l0aCBndWVzc2luZy4gTmV2ZXIgcmV0dXJucyBOVUxMLgotc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogX2Ntc0dldENvbnRleHQoY21zQ29udGV4dCBDb250ZXh0SUQpCi17Ci0gICAgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogaWQgPSAoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCopIENvbnRleHRJRDsKLSAgICBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHg7Ci0KLQotICAgIC8vIE9uIDAsIHVzZSBnbG9iYWwgc2V0dGluZ3MKLSAgICBpZiAoaWQgPT0gTlVMTCkgCi0gICAgICAgIHJldHVybiAmZ2xvYmFsQ29udGV4dDsKLQotICAgIC8vIFNlYXJjaAotICAgIGZvciAoY3R4ID0gX2Ntc0NvbnRleHRQb29sSGVhZDsKLSAgICAgICAgIGN0eCAhPSBOVUxMOwotICAgICAgICAgY3R4ID0gY3R4IC0+TmV4dCkgewotCi0gICAgICAgICAgICAvLyBGb3VuZCBpdD8KLSAgICAgICAgICAgIGlmIChpZCA9PSBjdHgpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGN0eDsgLy8gTmV3LXN0eWxlIGNvbnRleHQsIAotICAgIH0KLQotICAgIHJldHVybiAmZ2xvYmFsQ29udGV4dDsKLX0KLQotCi0vLyBJbnRlcm5hbDogZ2V0IHRoZSBtZW1vcnkgYXJlYSBhc3NvY2lhbnRlZCB3aXRoIGVhY2ggY29udGV4dCBjbGllbnQKLS8vIFJldHVybnMgdGhlIGJsb2NrIGFzc2lnbmVkIHRvIHRoZSBzcGVjaWZpYyB6b25lLiAKLXZvaWQqIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoY21zQ29udGV4dCBDb250ZXh0SUQsIF9jbXNNZW1vcnlDbGllbnQgbWMpCi17Ci0gICAgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4OwotICAgIHZvaWQgKnB0cjsKLQotICAgIGlmIChtYyA+PSBNZW1vcnlDbGllbnRNYXgpIHsKLSAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgIkJhZCBjb250ZXh0IGNsaWVudCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgCi0gICAgY3R4ID0gX2Ntc0dldENvbnRleHQoQ29udGV4dElEKTsKLSAgICBwdHIgPSBjdHggLT5jaHVua3NbbWNdOwotCi0gICAgaWYgKHB0ciAhPSBOVUxMKQotICAgICAgICByZXR1cm4gcHRyOwotCi0gICAgLy8gQSBudWxsIHB0ciBtZWFucyBubyBzcGVjaWFsIHNldHRpbmdzIGZvciB0aGF0IGNvbnRleHQsIGFuZCB0aGlzIAotICAgIC8vIHJldmVydHMgdG8gQ29udGV4dDAgZ2xvYmFscwotICAgIHJldHVybiBnbG9iYWxDb250ZXh0LmNodW5rc1ttY107ICAgIAotfQotCi0KLS8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZ2l2ZW4gY29udGV4dCBpdHMgZGVmYXVsdCBwcmlzdGluZSBzdGF0ZSwKLS8vIGFzIG5vIHBsdWctaW5zIHdlcmUgZGVjbGFyZWQuIFRoZXJlIGlzIG5vIHdheSB0byB1bnJlZ2lzdGVyIGEgc2luZ2xlIAotLy8gcGx1Zy1pbiwgYXMgYSBzaW5nbGUgY2FsbCB0byBjbXNQbHVnaW5USFIoKSBmdW5jdGlvbiBtYXkgcmVnaXN0ZXIgCi0vLyBtYW55IGRpZmZlcmVudCBwbHVnLWlucyBzaW11bHRhbmVvdXNseSwgdGhlbiB0aGVyZSBpcyBubyB3YXkgdG8gCi0vLyBpZGVudGlmeSB3aGljaCBwbHVnLWluIHRvIHVucmVnaXN0ZXIuCi12b2lkIENNU0VYUE9SVCBjbXNVbnJlZ2lzdGVyUGx1Z2luc1RIUihjbXNDb250ZXh0IENvbnRleHRJRCkKLXsKLSAgICBfY21zUmVnaXN0ZXJNZW1IYW5kbGVyUGx1Z2luKENvbnRleHRJRCwgTlVMTCk7Ci0gICAgX2Ntc1JlZ2lzdGVySW50ZXJwUGx1Z2luKENvbnRleHRJRCwgTlVMTCk7Ci0gICAgX2Ntc1JlZ2lzdGVyVGFnVHlwZVBsdWdpbihDb250ZXh0SUQsIE5VTEwpOwotICAgIF9jbXNSZWdpc3RlclRhZ1BsdWdpbihDb250ZXh0SUQsIE5VTEwpOwotICAgIF9jbXNSZWdpc3RlckZvcm1hdHRlcnNQbHVnaW4oQ29udGV4dElELCBOVUxMKTsKLSAgICBfY21zUmVnaXN0ZXJSZW5kZXJpbmdJbnRlbnRQbHVnaW4oQ29udGV4dElELCBOVUxMKTsKLSAgICBfY21zUmVnaXN0ZXJQYXJhbWV0cmljQ3VydmVzUGx1Z2luKENvbnRleHRJRCwgTlVMTCk7Ci0gICAgX2Ntc1JlZ2lzdGVyTXVsdGlQcm9jZXNzRWxlbWVudFBsdWdpbihDb250ZXh0SUQsIE5VTEwpOwotICAgIF9jbXNSZWdpc3Rlck9wdGltaXphdGlvblBsdWdpbihDb250ZXh0SUQsIE5VTEwpOwotICAgIF9jbXNSZWdpc3RlclRyYW5zZm9ybVBsdWdpbihDb250ZXh0SUQsIE5VTEwpOyAgICAKLSAgICBfY21zUmVnaXN0ZXJNdXRleFBsdWdpbihDb250ZXh0SUQsIE5VTEwpOwotfQotCi0KLS8vIFJldHVybnMgdGhlIG1lbW9yeSBtYW5hZ2VyIHBsdWctaW4sIGlmIGFueSwgZnJvbSB0aGUgUGx1Zy1pbiBidW5kbGUKLXN0YXRpYwotY21zUGx1Z2luTWVtSGFuZGxlciogX2Ntc0ZpbmRNZW1vcnlQbHVnaW4odm9pZCogUGx1Z2luQnVuZGxlKQotewotICAgIGNtc1BsdWdpbkJhc2UqIFBsdWdpbjsKLQotICAgIGZvciAoUGx1Z2luID0gKGNtc1BsdWdpbkJhc2UqKSBQbHVnaW5CdW5kbGU7Ci0gICAgICAgIFBsdWdpbiAhPSBOVUxMOwotICAgICAgICBQbHVnaW4gPSBQbHVnaW4gLT4gTmV4dCkgewotCi0gICAgICAgICAgICBpZiAoUGx1Z2luIC0+IE1hZ2ljID09IGNtc1BsdWdpbk1hZ2ljTnVtYmVyICYmIAotICAgICAgICAgICAgICAgIFBsdWdpbiAtPiBFeHBlY3RlZFZlcnNpb24gPD0gTENNU19WRVJTSU9OICYmIAotICAgICAgICAgICAgICAgIFBsdWdpbiAtPiBUeXBlID09IGNtc1BsdWdpbk1lbUhhbmRsZXJTaWcpIHsKLQotICAgICAgICAgICAgICAgICAgICAvLyBGb3VuZCEKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjbXNQbHVnaW5NZW1IYW5kbGVyKikgUGx1Z2luOyAgCi0gICAgICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm9wZSwgcmV2ZXJ0IHRvIGRlZmF1bHRzIAotICAgIHJldHVybiBOVUxMOwotfQotCi0KLS8vIENyZWF0ZXMgYSBuZXcgY29udGV4dCB3aXRoIG9wdGlvbmFsIGFzc29jaWF0ZWQgcGx1Zy1pbnMuIENhbGxlciBtYXkgYWxzbyBzcGVjaWZ5IGFuIG9wdGlvbmFsIHBvaW50ZXIgdG8gdXNlci1kZWZpbmVkIAotLy8gZGF0YSB0aGF0IHdpbGwgYmUgZm9yd2FyZGVkIHRvIHBsdWctaW5zIGFuZCBsb2dnZXIuCi1jbXNDb250ZXh0IENNU0VYUE9SVCBjbXNDcmVhdGVDb250ZXh0KHZvaWQqIFBsdWdpbiwgdm9pZCogVXNlckRhdGEpCi17Ci0gICAgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4OwotICAgIHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QgIGZha2VDb250ZXh0OwotICAgICAgICAKLSAgICBfY21zSW5zdGFsbEFsbG9jRnVuY3Rpb25zKF9jbXNGaW5kTWVtb3J5UGx1Z2luKFBsdWdpbiksICZmYWtlQ29udGV4dC5EZWZhdWx0TWVtb3J5TWFuYWdlcik7Ci0gICAgCi0gICAgZmFrZUNvbnRleHQuY2h1bmtzW1VzZXJQdHJdICAgICA9IFVzZXJEYXRhOwotICAgIGZha2VDb250ZXh0LmNodW5rc1tNZW1QbHVnaW5dICAgPSAmZmFrZUNvbnRleHQuRGVmYXVsdE1lbW9yeU1hbmFnZXI7Ci0KLSAgICAvLyBDcmVhdGUgdGhlIGNvbnRleHQgc3RydWN0dXJlLgotICAgIGN0eCA9IChzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KikgX2Ntc01hbGxvYygmZmFrZUNvbnRleHQsIHNpemVvZihzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KSk7Ci0gICAgaWYgKGN0eCA9PSBOVUxMKSAgIAotICAgICAgICByZXR1cm4gTlVMTDsgICAgIC8vIFNvbWV0aGluZyB2ZXJ5IHdyb25nIGhhcHBlbmVkIQotCi0gICAgLy8gSW5pdCB0aGUgc3RydWN0dXJlIGFuZCB0aGUgbWVtb3J5IG1hbmFnZXIKLSAgICBtZW1zZXQoY3R4LCAwLCBzaXplb2Yoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCkpOwotCi0gICAgLy8gS2VlcCBtZW1vcnkgbWFuYWdlcgotICAgIG1lbWNweSgmY3R4LT5EZWZhdWx0TWVtb3J5TWFuYWdlciwgJmZha2VDb250ZXh0LkRlZmF1bHRNZW1vcnlNYW5hZ2VyLCBzaXplb2YoX2Ntc01lbVBsdWdpbkNodW5rKSk7IAotICAgCi0gICAgLy8gTWFpbnRhaW4gdGhlIGxpbmtlZCBsaXN0ICh3aXRoIHByb3BlciBsb2NraW5nKQotICAgIF9jbXNFbnRlckNyaXRpY2FsU2VjdGlvblByaW1pdGl2ZSgmX2Ntc0NvbnRleHRQb29sSGVhZE11dGV4KTsKLSAgICAgICBjdHggLT5OZXh0ID0gX2Ntc0NvbnRleHRQb29sSGVhZDsKLSAgICAgICBfY21zQ29udGV4dFBvb2xIZWFkID0gY3R4OwotICAgIF9jbXNMZWF2ZUNyaXRpY2FsU2VjdGlvblByaW1pdGl2ZSgmX2Ntc0NvbnRleHRQb29sSGVhZE11dGV4KTsKLQotICAgIGN0eCAtPmNodW5rc1tVc2VyUHRyXSAgICAgPSBVc2VyRGF0YTsKLSAgICBjdHggLT5jaHVua3NbTWVtUGx1Z2luXSAgID0gJmN0eC0+RGVmYXVsdE1lbW9yeU1hbmFnZXI7Ci0gICAKLSAgICAvLyBOb3cgd2UgY2FuIGFsbG9jYXRlIHRoZSBwb29sIGJ5IHVzaW5nIGRlZmF1bHQgbWVtb3J5IG1hbmFnZXIKLSAgICBjdHggLT5NZW1Qb29sID0gX2Ntc0NyZWF0ZVN1YkFsbG9jKGN0eCwgMjIgKiBzaXplb2Yodm9pZCopKTsgIC8vIGRlZmF1bHQgc2l6ZSBhYm91dCAzMiBwb2ludGVycwotICAgIGlmIChjdHggLT5NZW1Qb29sID09IE5VTEwpIHsKLQotICAgICAgICAgY21zRGVsZXRlQ29udGV4dChjdHgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBfY21zQWxsb2NMb2dFcnJvckNodW5rKGN0eCwgTlVMTCk7Ci0gICAgX2Ntc0FsbG9jQWxhcm1Db2Rlc0NodW5rKGN0eCwgTlVMTCk7Ci0gICAgX2Ntc0FsbG9jQWRhcHRhdGlvblN0YXRlQ2h1bmsoY3R4LCBOVUxMKTsKLSAgICBfY21zQWxsb2NNZW1QbHVnaW5DaHVuayhjdHgsIE5VTEwpOwotICAgIF9jbXNBbGxvY0ludGVycFBsdWdpbkNodW5rKGN0eCwgTlVMTCk7Ci0gICAgX2Ntc0FsbG9jQ3VydmVzUGx1Z2luQ2h1bmsoY3R4LCBOVUxMKTsKLSAgICBfY21zQWxsb2NGb3JtYXR0ZXJzUGx1Z2luQ2h1bmsoY3R4LCBOVUxMKTsKLSAgICBfY21zQWxsb2NUYWdUeXBlUGx1Z2luQ2h1bmsoY3R4LCBOVUxMKTsKLSAgICBfY21zQWxsb2NNUEVUeXBlUGx1Z2luQ2h1bmsoY3R4LCBOVUxMKTsKLSAgICBfY21zQWxsb2NUYWdQbHVnaW5DaHVuayhjdHgsIE5VTEwpOwotICAgIF9jbXNBbGxvY0ludGVudHNQbHVnaW5DaHVuayhjdHgsIE5VTEwpOwotICAgIF9jbXNBbGxvY09wdGltaXphdGlvblBsdWdpbkNodW5rKGN0eCwgTlVMTCk7Ci0gICAgX2Ntc0FsbG9jVHJhbnNmb3JtUGx1Z2luQ2h1bmsoY3R4LCBOVUxMKTsKLSAgICBfY21zQWxsb2NNdXRleFBsdWdpbkNodW5rKGN0eCwgTlVMTCk7Ci0KLSAgICAvLyBTZXR1cCB0aGUgcGx1Zy1pbnMKLSAgICBpZiAoIWNtc1BsdWdpblRIUihjdHgsIFBsdWdpbikpIHsKLSAgICAKLSAgICAgICAgY21zRGVsZXRlQ29udGV4dChjdHgpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKGNtc0NvbnRleHQpIGN0eDsgIAotfQotCi0vLyBEdXBsaWNhdGVzIGEgY29udGV4dCB3aXRoIGFsbCBhc3NvY2lhdGVkIHBsdWctaW5zLiAKLS8vIENhbGxlciBtYXkgc3BlY2lmeSBhbiBvcHRpb25hbCBwb2ludGVyIHRvIHVzZXItZGVmaW5lZCAKLS8vIGRhdGEgdGhhdCB3aWxsIGJlIGZvcndhcmRlZCB0byBwbHVnLWlucyBhbmQgbG9nZ2VyLiAKLWNtc0NvbnRleHQgQ01TRVhQT1JUIGNtc0R1cENvbnRleHQoY21zQ29udGV4dCBDb250ZXh0SUQsIHZvaWQqIE5ld1VzZXJEYXRhKQotewotICAgIGludCBpOwotICAgIHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eDsKLSAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMgPSBfY21zR2V0Q29udGV4dChDb250ZXh0SUQpOwotCi0gICAgdm9pZCogdXNlckRhdGEgPSAoTmV3VXNlckRhdGEgIT0gTlVMTCkgPyBOZXdVc2VyRGF0YSA6IHNyYyAtPiBjaHVua3NbVXNlclB0cl07Ci0gICAgCi0gICAgCi0gICAgY3R4ID0gKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqKSBfY21zTWFsbG9jKENvbnRleHRJRCwgc2l6ZW9mKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QpKTsKLSAgICBpZiAoY3R4ID09IE5VTEwpICAgCi0gICAgICAgIHJldHVybiBOVUxMOyAgICAgLy8gU29tZXRoaW5nIHZlcnkgd3JvbmcgaGFwcGVuZWQKLQotICAgIC8vIFNldHVwIGRlZmF1bHQgbWVtb3J5IGFsbG9jYXRvcnMKLSAgICBtZW1jcHkoJmN0eC0+RGVmYXVsdE1lbW9yeU1hbmFnZXIsICZzcmMtPkRlZmF1bHRNZW1vcnlNYW5hZ2VyLCBzaXplb2YoY3R4LT5EZWZhdWx0TWVtb3J5TWFuYWdlcikpOwotCi0gICAgLy8gTWFpbnRhaW4gdGhlIGxpbmtlZCBsaXN0Ci0gICAgX2Ntc0VudGVyQ3JpdGljYWxTZWN0aW9uUHJpbWl0aXZlKCZfY21zQ29udGV4dFBvb2xIZWFkTXV0ZXgpOwotICAgICAgIGN0eCAtPk5leHQgPSBfY21zQ29udGV4dFBvb2xIZWFkOwotICAgICAgIF9jbXNDb250ZXh0UG9vbEhlYWQgPSBjdHg7Ci0gICAgX2Ntc0xlYXZlQ3JpdGljYWxTZWN0aW9uUHJpbWl0aXZlKCZfY21zQ29udGV4dFBvb2xIZWFkTXV0ZXgpOwotCi0gICAgY3R4IC0+Y2h1bmtzW1VzZXJQdHJdICAgID0gdXNlckRhdGE7Ci0gICAgY3R4IC0+Y2h1bmtzW01lbVBsdWdpbl0gID0gJmN0eC0+RGVmYXVsdE1lbW9yeU1hbmFnZXI7Ci0KLSAgICBjdHggLT5NZW1Qb29sID0gX2Ntc0NyZWF0ZVN1YkFsbG9jKGN0eCwgMjIgKiBzaXplb2Yodm9pZCopKTsKLSAgICBpZiAoY3R4IC0+TWVtUG9vbCA9PSBOVUxMKSB7Ci0KLSAgICAgICAgIGNtc0RlbGV0ZUNvbnRleHQoY3R4KTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgLy8gQWxsb2NhdGUgYWxsIHJlcXVpcmVkIGNodW5rcy4KLSAgICBfY21zQWxsb2NMb2dFcnJvckNodW5rKGN0eCwgc3JjKTsKLSAgICBfY21zQWxsb2NBbGFybUNvZGVzQ2h1bmsoY3R4LCBzcmMpOwotICAgIF9jbXNBbGxvY0FkYXB0YXRpb25TdGF0ZUNodW5rKGN0eCwgc3JjKTsKLSAgICBfY21zQWxsb2NNZW1QbHVnaW5DaHVuayhjdHgsIHNyYyk7Ci0gICAgX2Ntc0FsbG9jSW50ZXJwUGx1Z2luQ2h1bmsoY3R4LCBzcmMpOwotICAgIF9jbXNBbGxvY0N1cnZlc1BsdWdpbkNodW5rKGN0eCwgc3JjKTsKLSAgICBfY21zQWxsb2NGb3JtYXR0ZXJzUGx1Z2luQ2h1bmsoY3R4LCBzcmMpOwotICAgIF9jbXNBbGxvY1RhZ1R5cGVQbHVnaW5DaHVuayhjdHgsIHNyYyk7Ci0gICAgX2Ntc0FsbG9jTVBFVHlwZVBsdWdpbkNodW5rKGN0eCwgc3JjKTsKLSAgICBfY21zQWxsb2NUYWdQbHVnaW5DaHVuayhjdHgsIHNyYyk7Ci0gICAgX2Ntc0FsbG9jSW50ZW50c1BsdWdpbkNodW5rKGN0eCwgc3JjKTsKLSAgICBfY21zQWxsb2NPcHRpbWl6YXRpb25QbHVnaW5DaHVuayhjdHgsIHNyYyk7Ci0gICAgX2Ntc0FsbG9jVHJhbnNmb3JtUGx1Z2luQ2h1bmsoY3R4LCBzcmMpOwotICAgIF9jbXNBbGxvY011dGV4UGx1Z2luQ2h1bmsoY3R4LCBzcmMpOwotCi0gICAgLy8gTWFrZSBzdXJlIG5vIG9uZSBmYWlsZWQKLSAgICBmb3IgKGk9TG9nZ2VyOyBpIDwgTWVtb3J5Q2xpZW50TWF4OyBpKyspIHsKLQotICAgICAgICBpZiAoc3JjIC0+Y2h1bmtzW2ldID09IE5VTEwpIHsKLSAgICAgICAgICAgIGNtc0RlbGV0ZUNvbnRleHQoKGNtc0NvbnRleHQpIGN0eCk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAoY21zQ29udGV4dCkgY3R4OwotfQotCi0KLQotc3RhdGljCi1zdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBGaW5kUHJldihzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBpZCkKLXsKLSAgICBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBwcmV2OwotCi0gICAgLy8gU2VhcmNoIGZvciBwcmV2aW91cwotICAgIGZvciAocHJldiA9IF9jbXNDb250ZXh0UG9vbEhlYWQ7IAotICAgICAgICAgICAgIHByZXYgIT0gTlVMTDsKLSAgICAgICAgICAgICBwcmV2ID0gcHJldiAtPk5leHQpCi0gICAgewotICAgICAgICBpZiAocHJldiAtPk5leHQgPT0gaWQpCi0gICAgICAgICAgICByZXR1cm4gcHJldjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsgIC8vIExpc3QgaXMgZW1wdHkgb3Igb25seSBvbmUgZWxlbWVudCEKLX0KLQotLy8gRnJlZXMgYW55IHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGNvbnRleHQsIAotLy8gYW5kIGRlc3Ryb3lzIHRoZSBjb250ZXh0IHBsYWNlaG9sZGVyLiAKLS8vIFRoZSBDb250ZXh0SUQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIGluIGFueSBUSFIgb3BlcmF0aW9uLiAgCi12b2lkIENNU0VYUE9SVCBjbXNEZWxldGVDb250ZXh0KGNtc0NvbnRleHQgQ29udGV4dElEKQotewotICAgIGlmIChDb250ZXh0SUQgIT0gTlVMTCkgewotCi0gICAgICAgIHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCA9IChzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KikgQ29udGV4dElEOyAgICAgICAgICAgICAgCi0gICAgICAgIHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QgIGZha2VDb250ZXh0OyAgCi0gICAgICAgIHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHByZXY7Ci0KLSAgICAgICAgbWVtY3B5KCZmYWtlQ29udGV4dC5EZWZhdWx0TWVtb3J5TWFuYWdlciwgJmN0eC0+RGVmYXVsdE1lbW9yeU1hbmFnZXIsIHNpemVvZihjdHgtPkRlZmF1bHRNZW1vcnlNYW5hZ2VyKSk7Ci0KLSAgICAgICAgZmFrZUNvbnRleHQuY2h1bmtzW1VzZXJQdHJdICAgICA9IGN0eCAtPmNodW5rc1tVc2VyUHRyXTsKLSAgICAgICAgZmFrZUNvbnRleHQuY2h1bmtzW01lbVBsdWdpbl0gICA9ICZmYWtlQ29udGV4dC5EZWZhdWx0TWVtb3J5TWFuYWdlcjsKLQotICAgICAgICAvLyBHZXQgcmlkIG9mIHBsdWdpbnMKLSAgICAgICAgY21zVW5yZWdpc3RlclBsdWdpbnNUSFIoQ29udGV4dElEKTsgCi0KLSAgICAgICAgLy8gU2luY2UgYWxsIG1lbW9yeSBpcyBhbGxvY2F0ZWQgaW4gdGhlIHByaXZhdGUgcG9vbCwgYWxsIHdoYXQgd2UgbmVlZCB0byBkbyBpcyBkZXN0cm95IHRoZSBwb29sCi0gICAgICAgIGlmIChjdHggLT4gTWVtUG9vbCAhPSBOVUxMKQotICAgICAgICAgICAgICBfY21zU3ViQWxsb2NEZXN0cm95KGN0eCAtPk1lbVBvb2wpOwotICAgICAgICBjdHggLT4gTWVtUG9vbCA9IE5VTEw7Ci0KLSAgICAgICAgLy8gTWFpbnRhaW4gbGlzdAotICAgICAgICBfY21zRW50ZXJDcml0aWNhbFNlY3Rpb25QcmltaXRpdmUoJl9jbXNDb250ZXh0UG9vbEhlYWRNdXRleCk7Ci0gICAgICAgIGlmIChfY21zQ29udGV4dFBvb2xIZWFkID09IGN0eCkgeyAKLQotICAgICAgICAgICAgX2Ntc0NvbnRleHRQb29sSGVhZCA9IGN0eC0+TmV4dDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLQotICAgICAgICAgICAgLy8gU2VhcmNoIGZvciBwcmV2aW91cwotICAgICAgICAgICAgZm9yIChwcmV2ID0gX2Ntc0NvbnRleHRQb29sSGVhZDsgCi0gICAgICAgICAgICAgICAgcHJldiAhPSBOVUxMOwotICAgICAgICAgICAgICAgIHByZXYgPSBwcmV2IC0+TmV4dCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocHJldiAtPiBOZXh0ID09IGN0eCkgewotICAgICAgICAgICAgICAgICAgICBwcmV2IC0+IE5leHQgPSBjdHggLT5OZXh0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgX2Ntc0xlYXZlQ3JpdGljYWxTZWN0aW9uUHJpbWl0aXZlKCZfY21zQ29udGV4dFBvb2xIZWFkTXV0ZXgpOwotCi0gICAgICAgIC8vIGZyZWUgdGhlIG1lbW9yeSBibG9jayBpdHNlbGYKLSAgICAgICAgX2Ntc0ZyZWUoJmZha2VDb250ZXh0LCBjdHgpOwotICAgIH0KLX0KLQotLy8gUmV0dXJucyB0aGUgdXNlciBkYXRhIGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIENvbnRleHRJRCwgb3IgTlVMTCBpZiBubyB1c2VyIGRhdGEgd2FzIGF0dGFjaGVkIG9uIGNvbnRleHQgY3JlYXRpb24KLXZvaWQqIENNU0VYUE9SVCBjbXNHZXRDb250ZXh0VXNlckRhdGEoY21zQ29udGV4dCBDb250ZXh0SUQpCi17Ci0gICAgcmV0dXJuIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBVc2VyUHRyKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zcHMyLmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3BzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjRiNDRiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zcHMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTk3ICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDExIE1hcnRpIE1hcmlhIFNhZ3VlcgotLy8KLS8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCi0vLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKLS8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0vLwotLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLS8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotLy8KLS8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAotLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCi0vLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQotLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgotLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLQotI2luY2x1ZGUgImxjbXMyX2ludGVybmFsLmgiCi0KLS8vIFBvc3RTY3JpcHQgQ29sb3JSZW5kZXJpbmdEaWN0aW9uYXJ5IGFuZCBDb2xvclNwYWNlQXJyYXkKLQotCi0jZGVmaW5lIE1BWFBTQ09MUyAgIDYwICAgICAgLy8gQ29sdW1ucyBvbiB0YWJsZXMKLQotLyoKLSAgICBJbXBsZW1lbnRhdGlvbgotICAgIC0tLS0tLS0tLS0tLS0tCi0KLSAgUG9zdFNjcmlwdCBkb2VzIHVzZSBYWVogYXMgaXRzIGludGVybmFsIFBDUy4gQnV0IHNpbmNlIFBvc3RTY3JpcHQKLSAgaW50ZXJwb2xhdGlvbiB0YWJsZXMgYXJlIGxpbWl0ZWQgdG8gOCBiaXRzLCBJIHVzZSBMYWIgYXMgYSB3YXkgdG8KLSAgaW1wcm92ZSB0aGUgYWNjdXJhY3ksIGZhdm9yaW5nIHBlcmNlcHR1YWwgcmVzdWx0cy4gU28sIGZvciB0aGUgY3JlYXRpb24KLSAgb2YgZWFjaCBDUkQsIENTQSB0aGUgcHJvZmlsZXMgYXJlIGNvbnZlcnRlZCB0byBMYWIgdmlhIGEgZGV2aWNlCi0gIGxpbmsgYmV0d2VlbiAgcHJvZmlsZSAtPiBMYWIgb3IgTGFiIC0+IHByb2ZpbGUuIFRoZSBQUyBjb2RlIG5lY2Vzc2FyeSB0bwotICBjb252ZXJ0IExhYiA8LT4gWFlaIGlzIGFsc28gaW5jbHVkZWQuCi0KLQotCi0gIENvbG9yIFNwYWNlIEFycmF5cyAoQ1NBKQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgSW4gb3JkZXIgdG8gb2J0YWluIHByZWNpc2lvbiwgY29kZSBjaG9vc2VzIGJldHdlZW4gdGhyZWUgd2F5cyB0byBpbXBsZW1lbnQKLSAgdGhlIGRldmljZSAtPiBYWVogdHJhbnNmb3JtLiBUaGVzZSBjYXNlcyBpZGVudGlmaWVzIG1vbm9jaHJvbWUgcHJvZmlsZXMgKG9mdGVuCi0gIGltcGxlbWVudGVkIGFzIGEgc2V0IG9mIGN1cnZlcyksIG1hdHJpeC1zaGFwZXIgYW5kIFBpcGVsaW5lLWJhc2VkLgotCi0gIE1vbm9jaHJvbWUKLSAgLS0tLS0tLS0tLS0KLQotICBUaGlzIGlzIGltcGxlbWVudGVkIGFzIC9DSUVCYXNlZEEgQ1NBLiBUaGUgcHJlbGluZWFyaXphdGlvbiBjdXJ2ZSBpcwotICBwbGFjZWQgaW50byAvRGVjb2RlQSBzZWN0aW9uLCBhbmQgbWF0cml4IGVxdWFscyB0byBENTAuIFNpbmNlIGhlcmUgaXMKLSAgbm8gaW50ZXJwb2xhdGlvbiB0YWJsZXMsIEkgZG8gdGhlIGNvbnZlcnNpb24gZGlyZWN0bHkgdG8gWFlaCi0KLSAgTk9URTogQ0xVVC1iYXNlZCBtb25vY2hyb21lIHByb2ZpbGVzIGFyZSBOT1Qgc3VwcG9ydGVkLiBTbywgY21zRkxBR1NfTUFUUklYSU5QVVQKLSAgZmxhZyBpcyBmb3JjZWQgb24gc3VjaCBwcm9maWxlcy4KLQotICAgIFsgL0NJRUJhc2VkQQotICAgICAgPDwKLSAgICAgICAgICAgIC9EZWNvZGVBIHsgdHJhbnNmZXIgZnVuY3Rpb24gfSBiaW5kCi0gICAgICAgICAgICAvTWF0cml4QSBbRDUwXQotICAgICAgICAgICAgL1JhbmdlTE1OIFsgMC4wIGNtc0Q1MFggMC4wIGNtc0Q1MFkgMC4wIGNtc0Q1MFogXQotICAgICAgICAgICAgL1doaXRlUG9pbnQgW0Q1MF0KLSAgICAgICAgICAgIC9CbGFja1BvaW50IFtCUF0KLSAgICAgICAgICAgIC9SZW5kZXJpbmdJbnRlbnQgKGludGVudCkKLSAgICAgID4+Ci0gICAgXQotCi0gICBPbiBzaW1wbGVyIHByb2ZpbGVzLCB0aGUgUENTIGlzIGFscmVhZHkgWFlaLCBzbyBubyBjb252ZXJzaW9uIGlzIHJlcXVpcmVkLgotCi0KLSAgIE1hdHJpeC1zaGFwZXIgYmFzZWQKLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgVGhpcyBpcyBpbXBsZW1lbnRlZCBib3RoIHdpdGggL0NJRUJhc2VkQUJDIG9yIC9DSUVCYXNlZERFRiBvbiBkZXBlbmRpZwotICAgb2YgcHJvZmlsZSBpbXBsZW1lbnRhdGlvbi4gU2luY2UgaGVyZSB0aGVyZSBhcmUgbm8gaW50ZXJwb2xhdGlvbiB0YWJsZXMsIEkgZG8KLSAgIHRoZSBjb252ZXJzaW9uIGRpcmVjdGx5IHRvIFhZWgotCi0KLQotICAgIFsgL0NJRUJhc2VkQUJDCi0gICAgICAgICAgICA8PAotICAgICAgICAgICAgICAgIC9EZWNvZGVBQkMgWyB7dHJhbnNmZXIxfSB7dHJhbnNmZXIyfSB7dHJhbnNmZXIzfSBdCi0gICAgICAgICAgICAgICAgL01hdHJpeEFCQyBbTWF0cml4XQotICAgICAgICAgICAgICAgIC9SYW5nZUxNTiBbIDAuMCBjbXNENTBYIDAuMCBjbXNENTBZIDAuMCBjbXNENTBaIF0KLSAgICAgICAgICAgICAgICAvRGVjb2RlTE1OIFsgeyAvIDJ9IGR1cCBkdXAgXQotICAgICAgICAgICAgICAgIC9XaGl0ZVBvaW50IFtENTBdCi0gICAgICAgICAgICAgICAgL0JsYWNrUG9pbnQgW0JQXQotICAgICAgICAgICAgICAgIC9SZW5kZXJpbmdJbnRlbnQgKGludGVudCkKLSAgICAgICAgICAgID4+Ci0gICAgXQotCi0KLSAgICBDTFVUIGJhc2VkCi0gICAgLS0tLS0tLS0tLQotCi0gICAgIExhYiBpcyB1c2VkIGluIHN1Y2ggY2FzZXMuCi0KLSAgICBbIC9DSUVCYXNlZERFRgotICAgICAgICAgICAgPDwKLSAgICAgICAgICAgIC9EZWNvZGVERUYgWyA8cHJlbGluZWFyaXphdGlvbj4gXQotICAgICAgICAgICAgL1RhYmxlIFsgcCBwIHAgWzwuLi4+XV0KLSAgICAgICAgICAgIC9SYW5nZUFCQyBbIDAgMSAwIDEgMCAxXQotICAgICAgICAgICAgL0RlY29kZUFCQ1sgPHBvc3RsaW5lYXJpemF0aW9uPiBdCi0gICAgICAgICAgICAvUmFuZ2VMTU4gWyAtMC4yMzYgMS4yNTQgMCAxIC0wLjYzNSAxLjY0MCBdCi0gICAgICAgICAgICAgICAlIC0xMjgvNTAwIDErMTI3LzUwMCAwIDEgIC0xMjcvMjAwIDErMTI4LzIwMAotICAgICAgICAgICAgL01hdHJpeEFCQyBbIDEgMSAxIDEgMCAwIDAgMCAtMV0KLSAgICAgICAgICAgIC9XaGl0ZVBvaW50IFtENTBdCi0gICAgICAgICAgICAvQmxhY2tQb2ludCBbQlBdCi0gICAgICAgICAgICAvUmVuZGVyaW5nSW50ZW50IChpbnRlbnQpCi0gICAgXQotCi0KLSAgQ29sb3IgUmVuZGVyaW5nIERpY3Rpb25hcmllcyAoQ1JEKQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIFRoZXNlIGFyZSBhbHdheXMgaW1wbGVtZW50ZWQgYXMgQ0xVVCwgYW5kIGFsd2F5cyBhcmUgdXNpbmcgTGFiLiBTaW5jZSBDUkQgYXJlIGV4cGVjdGVkIHRvCi0gIGJlIHVzZWQgYXMgcmVzb3VyY2VzLCB0aGUgY29kZSBhZGRzIHRoZSBkZWZpbml0aW9uIGFzIHdlbGwuCi0KLSAgPDwKLSAgICAvQ29sb3JSZW5kZXJpbmdUeXBlIDEKLSAgICAvV2hpdGVQb2ludCBbIEQ1MCBdCi0gICAgL0JsYWNrUG9pbnQgW0JQXQotICAgIC9NYXRyaXhQUVIgWyBCcmFkZm9yZCBdCi0gICAgL1JhbmdlUFFSIFstMC4xMjUgMS4zNzUgLTAuMTI1IDEuMzc1IC0wLjEyNSAxLjM3NSBdCi0gICAgL1RyYW5zZm9ybVBRUiBbCi0gICAgezQgaW5kZXggMyBnZXQgZGl2IDIgaW5kZXggMyBnZXQgbXVsIGV4Y2ggcG9wIGV4Y2ggcG9wIGV4Y2ggcG9wIGV4Y2ggcG9wIH0gYmluZAotICAgIHs0IGluZGV4IDQgZ2V0IGRpdiAyIGluZGV4IDQgZ2V0IG11bCBleGNoIHBvcCBleGNoIHBvcCBleGNoIHBvcCBleGNoIHBvcCB9IGJpbmQKLSAgICB7NCBpbmRleCA1IGdldCBkaXYgMiBpbmRleCA1IGdldCBtdWwgZXhjaCBwb3AgZXhjaCBwb3AgZXhjaCBwb3AgZXhjaCBwb3AgfSBiaW5kCi0gICAgXQotICAgIC9NYXRyaXhBQkMgPC4uLj4KLSAgICAvRW5jb2RlQUJDIDwuLi4+Ci0gICAgL1JhbmdlQUJDICA8Li4gdXNlZCBmb3IgIFhZWiAtPiBMYWI+Ci0gICAgL0VuY29kZUxNTgotICAgIC9SZW5kZXJUYWJsZSBbIHAgcCBwIFs8Li4uPl1dCi0KLSAgICAvUmVuZGVyaW5nSW50ZW50IChQZXJjZXB0dWFsKQotICA+PgotICAvQ3VycmVudCBleGNoIC9Db2xvclJlbmRlcmluZyBkZWZpbmVyZXNvdXJjZSBwb3AKLQotCi0gIFRoZSBmb2xsb3dpbmcgc3RhZ2VzIGFyZSB1c2VkIHRvIGNvbnZlcnQgZnJvbSBYWVogdG8gTGFiCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgSW5wdXQgaXMgZ2l2ZW4gYXQgTE1OIHN0YWdlIG9uIFgsIFksIFoKLQotICBFbmNvZGUgTE1OIGdpdmVzIHVzIGYoWC9YbiksIGYoWS9ZbiksIGYoWi9abikKLQotICAvRW5jb2RlTE1OIFsKLQotICAgIHsgMC45NjQyMDAgIGRpdiBkdXAgMC4wMDg4NTYgbGUgezcuNzg3IG11bCAxNiAxMTYgZGl2IGFkZH17MSAzIGRpdiBleHB9IGlmZWxzZSB9IGJpbmQKLSAgICB7IDEuMDAwMDAwICBkaXYgZHVwIDAuMDA4ODU2IGxlIHs3Ljc4NyBtdWwgMTYgMTE2IGRpdiBhZGR9ezEgMyBkaXYgZXhwfSBpZmVsc2UgfSBiaW5kCi0gICAgeyAwLjgyNDkwMCAgZGl2IGR1cCAwLjAwODg1NiBsZSB7Ny43ODcgbXVsIDE2IDExNiBkaXYgYWRkfXsxIDMgZGl2IGV4cH0gaWZlbHNlIH0gYmluZAotCi0gICAgXQotCi0KLSAgTWF0cml4QUJDIGlzIHVzZWQgdG8gY29tcHV0ZSBmKFkvWW4pLCBmKFgvWG4pIC0gZihZL1luKSwgZihZL1luKSAtIGYoWi9abikKLQotICB8IDAgIDEgIDB8Ci0gIHwgMSAtMSAgMHwKLSAgfCAwICAxIC0xfAotCi0gIC9NYXRyaXhBQkMgWyAwIDEgMCAxIC0xIDEgMCAwIC0xIF0KLQotIEVuY29kZUFCQyBmaW5hbGx5IGdpdmVzIExhYiB2YWx1ZXMuCi0KLSAgL0VuY29kZUFCQyBbCi0gICAgeyAxMTYgbXVsICAxNiBzdWIgMTAwIGRpdiAgfSBiaW5kCi0gICAgeyA1MDAgbXVsIDEyOCBhZGQgMjU1IGRpdiAgfSBiaW5kCi0gICAgeyAyMDAgbXVsIDEyOCBhZGQgMjU1IGRpdiAgfSBiaW5kCi0gICAgXQotCi0gIFRoZSBmb2xsb3dpbmcgc3RhZ2VzIGFyZSB1c2VkIHRvIGNvbnZlcnQgTGFiIHRvIFhZWgotICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvUmFuZ2VBQkMgWyAwIDEgMCAxIDAgMV0KLSAgICAvRGVjb2RlQUJDIFsgeyAxMDAgbXVsIDE2IGFkZCAxMTYgZGl2IH0gYmluZAotICAgICAgICAgICAgICAgICB7IDI1NSBtdWwgMTI4IHN1YiA1MDAgZGl2IH0gYmluZAotICAgICAgICAgICAgICAgICB7IDI1NSBtdWwgMTI4IHN1YiAyMDAgZGl2IH0gYmluZAotICAgICAgICAgICAgICAgXQotCi0gICAgL01hdHJpeEFCQyBbIDEgMSAxIDEgMCAwIDAgMCAtMV0KLSAgICAvRGVjb2RlTE1OIFsKLSAgICAgICAgICAgICAgICB7ZHVwIDYgMjkgZGl2IGdlIHtkdXAgZHVwIG11bCBtdWx9IHs0IDI5IGRpdiBzdWIgMTA4IDg0MSBkaXYgbXVsfSBpZmVsc2UgMC45NjQyMDAgbXVsfSBiaW5kCi0gICAgICAgICAgICAgICAge2R1cCA2IDI5IGRpdiBnZSB7ZHVwIGR1cCBtdWwgbXVsfSB7NCAyOSBkaXYgc3ViIDEwOCA4NDEgZGl2IG11bH0gaWZlbHNlIH0gYmluZAotICAgICAgICAgICAgICAgIHtkdXAgNiAyOSBkaXYgZ2Uge2R1cCBkdXAgbXVsIG11bH0gezQgMjkgZGl2IHN1YiAxMDggODQxIGRpdiBtdWx9IGlmZWxzZSAwLjgyNDkwMCBtdWx9IGJpbmQKLSAgICAgICAgICAgICAgICBdCi0KLQotKi8KLQotLyoKLQotIFBvc3RTY3JpcHQgYWxnb3JpdGhtcyBkaXNjdXNzaW9uLgotID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIDFEIGludGVycG9sYXRpb24gYWxnb3JpdGhtCi0KLQotICAxRCBpbnRlcnBvbGF0aW9uIChmbG9hdCkKLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICB2YWwyID0gRG9tYWluICogVmFsdWU7Ci0KLSAgICBjZWxsMCA9IChpbnQpIGZsb29yKHZhbDIpOwotICAgIGNlbGwxID0gKGludCkgY2VpbCh2YWwyKTsKLQotICAgIHJlc3QgPSB2YWwyIC0gY2VsbDA7Ci0KLSAgICB5MCA9IEx1dFRhYmxlW2NlbGwwXSA7Ci0gICAgeTEgPSBMdXRUYWJsZVtjZWxsMV0gOwotCi0gICAgeSA9IHkwICsgKHkxIC0geTApICogcmVzdDsKLQotCi0KLSAgUG9zdFNjcmlwdCBjb2RlICAgICAgICAgICAgICAgICAgIFN0YWNrCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHYKLSAgICA8Y2hlY2sgMC4uMS4wPgotICAgIFthcnJheV0gICAgICAgICAgICAgICAgICAgICAgICAgJSB2IHRhYgotICAgIGR1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSB2IHRhYiB0YWIKLSAgICBsZW5ndGggMSBzdWIgICAgICAgICAgICAgICAgICAgICUgdiB0YWIgZG9tCi0KLSAgICAzIC0xIHJvbGwgICAgICAgICAgICAgICAgICAgICAgICUgdGFiIGRvbSB2Ci0KLSAgICBtdWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgdGFiIHZhbDIKLSAgICBkdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgdGFiIHZhbDIgdmFsMgotICAgIGR1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSB0YWIgdmFsMiB2YWwyIHZhbDIKLSAgICBmbG9vciBjdmkgICAgICAgICAgICAgICAgICAgICAgICUgdGFiIHZhbDIgdmFsMiBjZWxsMAotICAgIGV4Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgJSB0YWIgdmFsMiBjZWxsMCB2YWwyCi0gICAgY2VpbGluZyBjdmkgICAgICAgICAgICAgICAgICAgICAlIHRhYiB2YWwyIGNlbGwwIGNlbGwxCi0KLSAgICAzIGluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICUgdGFiIHZhbDIgY2VsbDAgY2VsbDEgdGFiCi0gICAgZXhjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHRhYiB2YWwyIGNlbGwwIHRhYiBjZWxsMQotICAgIGdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSB0YWIgdmFsMiBjZWxsMCB5MQotCi0gICAgNCAtMSByb2xsICAgICAgICAgICAgICAgICAgICAgICAlIHZhbDIgY2VsbDAgeTEgdGFiCi0gICAgMyAtMSByb2xsICAgICAgICAgICAgICAgICAgICAgICAlIHZhbDIgeTEgdGFiIGNlbGwwCi0gICAgZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHZhbDIgeTEgeTAKLQotICAgIGR1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSB2YWwyIHkxIHkwIHkwCi0gICAgMyAxIHJvbGwgICAgICAgICAgICAgICAgICAgICAgICAlIHZhbDIgeTAgeTEgeTAKLQotICAgIHN1YiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSB2YWwyIHkwICh5MS15MCkKLSAgICAzIC0xIHJvbGwgICAgICAgICAgICAgICAgICAgICAgICUgeTAgKHkxLXkwKSB2YWwyCi0gICAgZHVwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHkwICh5MS15MCkgdmFsMiB2YWwyCi0gICAgZmxvb3IgY3ZpICAgICAgICAgICAgICAgICAgICAgICAlIHkwICh5MS15MCkgdmFsMiBmbG9vcih2YWwyKQotICAgIHN1YiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSB5MCAoeTEteTApIHJlc3QKLSAgICBtdWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgeTAgdDEKLSAgICBhZGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgeQotICAgIDY1NTM1IGRpdiAgICAgICAgICAgICAgICAgICAgICAgJSByZXN1bHQKLQotICB9IGJpbmQKLQotCi0qLwotCi0KLS8vIFRoaXMgc3RydWN0IGhvbGRzIHRoZSBtZW1vcnkgYmxvY2sgY3VycmVudGx5IGJlaW5nIHdyaXRlCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgX2Ntc1N0YWdlQ0x1dERhdGEqIFBpcGVsaW5lOwotICAgIGNtc0lPSEFORExFUiogbTsKLQotICAgIGludCBGaXJzdENvbXBvbmVudDsKLSAgICBpbnQgU2Vjb25kQ29tcG9uZW50OwotCi0gICAgY29uc3QgY2hhciogUHJlTWFqOwotICAgIGNvbnN0IGNoYXIqIFBvc3RNYWo7Ci0gICAgY29uc3QgY2hhciogUHJlTWluOwotICAgIGNvbnN0IGNoYXIqIFBvc3RNaW47Ci0KLSAgICBpbnQgIEZpeFdoaXRlOyAgICAvLyBGb3JjZSBtYXBwaW5nIG9mIHB1cmUgd2hpdGUKLQotICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgIENvbG9yU3BhY2U7ICAvLyBDb2xvclNwYWNlIG9mIHByb2ZpbGUKLQotCi19IGNtc1BzU2FtcGxlckNhcmdvOwotCi1zdGF0aWMgaW50IF9jbXNQU0FjdHVhbENvbHVtbiA9IDA7Ci0KLQotLy8gQ29udmVydCB0byBieXRlCi1zdGF0aWMKLWNtc1VJbnQ4TnVtYmVyIFdvcmQyQnl0ZShjbXNVSW50MTZOdW1iZXIgdykKLXsKLSAgICByZXR1cm4gKGNtc1VJbnQ4TnVtYmVyKSBmbG9vcigoY21zRmxvYXQ2NE51bWJlcikgdyAvIDI1Ny4wICsgMC41KTsKLX0KLQotCi0vLyBDb252ZXJ0IHRvIGJ5dGUgKHVzaW5nIElDQzIgbm90YXRpb24pCi0vKgotc3RhdGljCi1jbXNVSW50OE51bWJlciBMMkJ5dGUoY21zVUludDE2TnVtYmVyIHcpCi17Ci0gICAgaW50IHd3ID0gdyArIDB4MDA4MDsKLQotICAgIGlmICh3dyA+IDB4RkZGRikgcmV0dXJuIDB4RkY7Ci0KLSAgICByZXR1cm4gKGNtc1VJbnQ4TnVtYmVyKSAoKGNtc1VJbnQxNk51bWJlcikgKHd3ID4+IDgpICYgMHhGRik7Ci19Ci0qLwotCi0vLyBXcml0ZSBhIGNvb2tlZCBieXRlCi0KLXN0YXRpYwotdm9pZCBXcml0ZUJ5dGUoY21zSU9IQU5ETEVSKiBtLCBjbXNVSW50OE51bWJlciBiKQotewotICAgIF9jbXNJT1ByaW50ZihtLCAiJTAyeCIsIGIpOwotICAgIF9jbXNQU0FjdHVhbENvbHVtbiArPSAyOwotCi0gICAgaWYgKF9jbXNQU0FjdHVhbENvbHVtbiA+IE1BWFBTQ09MUykgewotCi0gICAgICAgIF9jbXNJT1ByaW50ZihtLCAiXG4iKTsKLSAgICAgICAgX2Ntc1BTQWN0dWFsQ29sdW1uID0gMDsKLSAgICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFBvc3RTY3JpcHQgZ2VuZXJhdGlvbgotCi0KLS8vIFJlbW92ZXMgb2ZmZW5kaW5nIENhcnJpYWdlIHJldHVybnMKLXN0YXRpYwotY2hhciogUmVtb3ZlQ1IoY29uc3QgY2hhciogdHh0KQotewotICAgIHN0YXRpYyBjaGFyIEJ1ZmZlclsyMDQ4XTsKLSAgICBjaGFyKiBwdDsKLQotICAgIHN0cm5jcHkoQnVmZmVyLCB0eHQsIDIwNDcpOwotICAgIEJ1ZmZlclsyMDQ3XSA9IDA7Ci0gICAgZm9yIChwdCA9IEJ1ZmZlcjsgKnB0OyBwdCsrKQotICAgICAgICAgICAgaWYgKCpwdCA9PSAnXG4nIHx8ICpwdCA9PSAnXHInKSAqcHQgPSAnICc7Ci0KLSAgICByZXR1cm4gQnVmZmVyOwotCi19Ci0KLXN0YXRpYwotdm9pZCBFbWl0SGVhZGVyKGNtc0lPSEFORExFUiogbSwgY29uc3QgY2hhciogVGl0bGUsIGNtc0hQUk9GSUxFIGhQcm9maWxlKQotewotICAgIHRpbWVfdCB0aW1lcjsKLSAgICBjbXNNTFUgKkRlc2NyaXB0aW9uLCAqQ29weXJpZ2h0OwotICAgIGNoYXIgRGVzY0FTQ0lJWzI1Nl0sIENvcHlyaWdodEFTQ0lJWzI1Nl07Ci0KLSAgICB0aW1lKCZ0aW1lcik7Ci0KLSAgICBEZXNjcmlwdGlvbiA9IChjbXNNTFUqKSBjbXNSZWFkVGFnKGhQcm9maWxlLCBjbXNTaWdQcm9maWxlRGVzY3JpcHRpb25UYWcpOwotICAgIENvcHlyaWdodCAgID0gKGNtc01MVSopIGNtc1JlYWRUYWcoaFByb2ZpbGUsIGNtc1NpZ0NvcHlyaWdodFRhZyk7Ci0KLSAgICBEZXNjQVNDSUlbMF0gPSBEZXNjQVNDSUlbMjU1XSA9IDA7Ci0gICAgQ29weXJpZ2h0QVNDSUlbMF0gPSBDb3B5cmlnaHRBU0NJSVsyNTVdID0gMDsKLQotICAgIGlmIChEZXNjcmlwdGlvbiAhPSBOVUxMKSBjbXNNTFVnZXRBU0NJSShEZXNjcmlwdGlvbiwgIGNtc05vTGFuZ3VhZ2UsIGNtc05vQ291bnRyeSwgRGVzY0FTQ0lJLCAgICAgICAyNTUpOwotICAgIGlmIChDb3B5cmlnaHQgIT0gTlVMTCkgICBjbXNNTFVnZXRBU0NJSShDb3B5cmlnaHQsICAgIGNtc05vTGFuZ3VhZ2UsIGNtc05vQ291bnRyeSwgQ29weXJpZ2h0QVNDSUksICAyNTUpOwotCi0gICAgX2Ntc0lPUHJpbnRmKG0sICIlJSFQUy1BZG9iZS0zLjBcbiIpOwotICAgIF9jbXNJT1ByaW50ZihtLCAiJSVcbiIpOwotICAgIF9jbXNJT1ByaW50ZihtLCAiJSUgJXNcbiIsIFRpdGxlKTsKLSAgICBfY21zSU9QcmludGYobSwgIiUlIFNvdXJjZTogJXNcbiIsIFJlbW92ZUNSKERlc2NBU0NJSSkpOwotICAgIF9jbXNJT1ByaW50ZihtLCAiJSUgICAgICAgICAlc1xuIiwgUmVtb3ZlQ1IoQ29weXJpZ2h0QVNDSUkpKTsKLSAgICBfY21zSU9QcmludGYobSwgIiUlIENyZWF0ZWQ6ICVzIiwgY3RpbWUoJnRpbWVyKSk7IC8vIGN0aW1lIGFwcGVuZHMgYSBcbiEhIQotICAgIF9jbXNJT1ByaW50ZihtLCAiJSVcbiIpOwotICAgIF9jbXNJT1ByaW50ZihtLCAiJSUlJUJlZ2luUmVzb3VyY2VcbiIpOwotCi19Ci0KLQotLy8gRW1pdHMgV2hpdGUgJiBCbGFjayBwb2ludC4gV2hpdGUgcG9pbnQgaXMgYWx3YXlzIEQ1MCwgQmxhY2sgcG9pbnQgaXMgdGhlIGRldmljZQotLy8gQmxhY2sgcG9pbnQgYWRhcHRlZCB0byBENTAuCi0KLXN0YXRpYwotdm9pZCBFbWl0V2hpdGVCbGFja0Q1MChjbXNJT0hBTkRMRVIqIG0sIGNtc0NJRVhZWiogQmxhY2tQb2ludCkKLXsKLQotICAgIF9jbXNJT1ByaW50ZihtLCAiL0JsYWNrUG9pbnQgWyVmICVmICVmXVxuIiwgQmxhY2tQb2ludCAtPiBYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxhY2tQb2ludCAtPiBZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxhY2tQb2ludCAtPiBaKTsKLQotICAgIF9jbXNJT1ByaW50ZihtLCAiL1doaXRlUG9pbnQgWyVmICVmICVmXVxuIiwgY21zRDUwX1hZWigpLT5YLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRDUwX1hZWigpLT5ZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRDUwX1hZWigpLT5aKTsKLX0KLQotCi1zdGF0aWMKLXZvaWQgRW1pdFJhbmdlQ2hlY2soY21zSU9IQU5ETEVSKiBtKQotewotICAgIF9jbXNJT1ByaW50ZihtLCAiZHVwIDAuMCBsdCB7IHBvcCAwLjAgfSBpZiAiCi0gICAgICAgICAgICAgICAgICAgICJkdXAgMS4wIGd0IHsgcG9wIDEuMCB9IGlmICIpOwotCi19Ci0KLS8vIERvZXMgd3JpdGUgdGhlIGludGVudAotCi1zdGF0aWMKLXZvaWQgRW1pdEludGVudChjbXNJT0hBTkRMRVIqIG0sIGludCBSZW5kZXJpbmdJbnRlbnQpCi17Ci0gICAgY29uc3QgY2hhciAqaW50ZW50OwotCi0gICAgc3dpdGNoIChSZW5kZXJpbmdJbnRlbnQpIHsKLQotICAgICAgICBjYXNlIElOVEVOVF9QRVJDRVBUVUFMOiAgICAgICAgICAgIGludGVudCA9ICJQZXJjZXB0dWFsIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQzogaW50ZW50ID0gIlJlbGF0aXZlQ29sb3JpbWV0cmljIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgSU5URU5UX0FCU09MVVRFX0NPTE9SSU1FVFJJQzogaW50ZW50ID0gIkFic29sdXRlQ29sb3JpbWV0cmljIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgSU5URU5UX1NBVFVSQVRJT046ICAgICAgICAgICAgaW50ZW50ID0gIlNhdHVyYXRpb24iOyBicmVhazsKLQotICAgICAgICBkZWZhdWx0OiBpbnRlbnQgPSAiVW5kZWZpbmVkIjsgYnJlYWs7Ci0gICAgfQotCi0gICAgX2Ntc0lPUHJpbnRmKG0sICIvUmVuZGVyaW5nSW50ZW50ICglcylcbiIsIGludGVudCApOwotfQotCi0vLwotLy8gIENvbnZlcnQgTCogdG8gWQotLy8KLS8vICAgICAgWSA9IFluKlsgKEwqICsgMTYpIC8gMTE2XSBeIDMgICBpZiAoTCopID49IDYgLyAyOQotLy8gICAgICAgID0gWW4qKCBMKiAvIDExNikgLyA3Ljc4NyAgICAgIGlmIChMKikgPCA2IC8gMjkKLS8vCi0KLS8qCi1zdGF0aWMKLXZvaWQgRW1pdEwyWShjbXNJT0hBTkRMRVIqIG0pCi17Ci0gICAgX2Ntc0lPUHJpbnRmKG0sCi0gICAgICAgICAgICAieyAiCi0gICAgICAgICAgICAgICAgIjEwMCBtdWwgMTYgYWRkIDExNiBkaXYgIiAgICAgICAgICAgICAgIC8vIChMICogMTAwICsgMTYpIC8gMTE2Ci0gICAgICAgICAgICAgICAgICJkdXAgNiAyOSBkaXYgZ2UgIiAgICAgICAgICAgICAgICAgICAgIC8vID49IDYgLyAyOSA/Ci0gICAgICAgICAgICAgICAgICJ7IGR1cCBkdXAgbXVsIG11bCB9ICIgICAgICAgICAgICAgICAgIC8vIHllcywgXjMgYW5kIGRvbmUKLSAgICAgICAgICAgICAgICAgInsgNCAyOSBkaXYgc3ViIDEwOCA4NDEgZGl2IG11bCB9ICIgICAgLy8gbm8sIHNsb3BlIGxpbWl0aW5nCi0gICAgICAgICAgICAiaWZlbHNlIH0gYmluZCAiKTsKLX0KLSovCi0KLQotLy8gTGFiIC0+IFhZWiwgc2VlIHRoZSBkaXNjdXNzaW9uIGFib3ZlCi0KLXN0YXRpYwotdm9pZCBFbWl0TGFiMlhZWihjbXNJT0hBTkRMRVIqIG0pCi17Ci0gICAgX2Ntc0lPUHJpbnRmKG0sICIvUmFuZ2VBQkMgWyAwIDEgMCAxIDAgMV1cbiIpOwotICAgIF9jbXNJT1ByaW50ZihtLCAiL0RlY29kZUFCQyBbXG4iKTsKLSAgICBfY21zSU9QcmludGYobSwgInsxMDAgbXVsICAxNiBhZGQgMTE2IGRpdiB9IGJpbmRcbiIpOwotICAgIF9jbXNJT1ByaW50ZihtLCAiezI1NSBtdWwgMTI4IHN1YiA1MDAgZGl2IH0gYmluZFxuIik7Ci0gICAgX2Ntc0lPUHJpbnRmKG0sICJ7MjU1IG11bCAxMjggc3ViIDIwMCBkaXYgfSBiaW5kXG4iKTsKLSAgICBfY21zSU9QcmludGYobSwgIl1cbiIpOwotICAgIF9jbXNJT1ByaW50ZihtLCAiL01hdHJpeEFCQyBbIDEgMSAxIDEgMCAwIDAgMCAtMV1cbiIpOwotICAgIF9jbXNJT1ByaW50ZihtLCAiL1JhbmdlTE1OIFsgLTAuMjM2IDEuMjU0IDAgMSAtMC42MzUgMS42NDAgXVxuIik7Ci0gICAgX2Ntc0lPUHJpbnRmKG0sICIvRGVjb2RlTE1OIFtcbiIpOwotICAgIF9jbXNJT1ByaW50ZihtLCAie2R1cCA2IDI5IGRpdiBnZSB7ZHVwIGR1cCBtdWwgbXVsfSB7NCAyOSBkaXYgc3ViIDEwOCA4NDEgZGl2IG11bH0gaWZlbHNlIDAuOTY0MjAwIG11bH0gYmluZFxuIik7Ci0gICAgX2Ntc0lPUHJpbnRmKG0sICJ7ZHVwIDYgMjkgZGl2IGdlIHtkdXAgZHVwIG11bCBtdWx9IHs0IDI5IGRpdiBzdWIgMTA4IDg0MSBkaXYgbXVsfSBpZmVsc2UgfSBiaW5kXG4iKTsKLSAgICBfY21zSU9QcmludGYobSwgIntkdXAgNiAyOSBkaXYgZ2Uge2R1cCBkdXAgbXVsIG11bH0gezQgMjkgZGl2IHN1YiAxMDggODQxIGRpdiBtdWx9IGlmZWxzZSAwLjgyNDkwMCBtdWx9IGJpbmRcbiIpOwotICAgIF9jbXNJT1ByaW50ZihtLCAiXVxuIik7Ci19Ci0KLQotCi0vLyBPdXRwdXRzIGEgdGFibGUgb2Ygd29yZHMuIEl0IGRvZXMgdXNlIDE2IGJpdHMKLQotc3RhdGljCi12b2lkIEVtaXQxR2FtbWEoY21zSU9IQU5ETEVSKiBtLCBjbXNUb25lQ3VydmUqIFRhYmxlKQotewotICAgIGNtc1VJbnQzMk51bWJlciBpOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgZ2FtbWE7Ci0KLSAgICBpZiAoVGFibGUgPT0gTlVMTCkgcmV0dXJuOyAvLyBFcnJvcgotCi0gICAgaWYgKFRhYmxlIC0+bkVudHJpZXMgPD0gMCkgcmV0dXJuOyAgLy8gRW1wdHkgdGFibGUKLQotICAgIC8vIFN1cHByZXNzIHdob2xlIGlmIGlkZW50aXR5Ci0gICAgaWYgKGNtc0lzVG9uZUN1cnZlTGluZWFyKFRhYmxlKSkgcmV0dXJuOwotCi0gICAgLy8gQ2hlY2sgaWYgaXMgcmVhbGx5IGFuIGV4cG9uZW50aWFsLiBJZiBzbywgZW1pdCAiZXhwIgotICAgIGdhbW1hID0gY21zRXN0aW1hdGVHYW1tYShUYWJsZSwgMC4wMDEpOwotICAgICBpZiAoZ2FtbWEgPiAwKSB7Ci0gICAgICAgICAgICBfY21zSU9QcmludGYobSwgInsgJWcgZXhwIH0gYmluZCAiLCBnYW1tYSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgIH0KLQotICAgIF9jbXNJT1ByaW50ZihtLCAieyAiKTsKLQotICAgIC8vIEJvdW5kcyBjaGVjawotICAgIEVtaXRSYW5nZUNoZWNrKG0pOwotCi0gICAgLy8gRW1pdCBpbnRlcG9sYXRpb24gY29kZQotCi0gICAgLy8gUG9zdFNjcmlwdCBjb2RlICAgICAgICAgICAgICAgICAgICAgIFN0YWNrCi0gICAgLy8gPT09PT09PT09PT09PT09ICAgICAgICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2Ci0gICAgX2Ntc0lPUHJpbnRmKG0sICIgWyIpOwotCi0gICAgZm9yIChpPTA7IGkgPCBUYWJsZS0+bkVudHJpZXM7IGkrKykgewotICAgICAgICBfY21zSU9QcmludGYobSwgIiVkICIsIFRhYmxlLT5UYWJsZTE2W2ldKTsKLSAgICB9Ci0KLSAgICBfY21zSU9QcmludGYobSwgIl0gIik7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gdiB0YWIKLQotICAgIF9jbXNJT1ByaW50ZihtLCAiZHVwICIpOyAgICAgICAgICAgICAgICAgICAgICAvLyB2IHRhYiB0YWIKLSAgICBfY21zSU9QcmludGYobSwgImxlbmd0aCAxIHN1YiAiKTsgICAgICAgICAgICAgLy8gdiB0YWIgZG9tCi0gICAgX2Ntc0lPUHJpbnRmKG0sICIzIC0xIHJvbGwgIik7ICAgICAgICAgICAgICAgIC8vIHRhYiBkb20gdgotICAgIF9jbXNJT1ByaW50ZihtLCAibXVsICIpOyAgICAgICAgICAgICAgICAgICAgICAvLyB0YWIgdmFsMgotICAgIF9jbXNJT1ByaW50ZihtLCAiZHVwICIpOyAgICAgICAgICAgICAgICAgICAgICAvLyB0YWIgdmFsMiB2YWwyCi0gICAgX2Ntc0lPUHJpbnRmKG0sICJkdXAgIik7ICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYiB2YWwyIHZhbDIgdmFsMgotICAgIF9jbXNJT1ByaW50ZihtLCAiZmxvb3IgY3ZpICIpOyAgICAgICAgICAgICAgICAvLyB0YWIgdmFsMiB2YWwyIGNlbGwwCi0gICAgX2Ntc0lPUHJpbnRmKG0sICJleGNoICIpOyAgICAgICAgICAgICAgICAgICAgIC8vIHRhYiB2YWwyIGNlbGwwIHZhbDIKLSAgICBfY21zSU9QcmludGYobSwgImNlaWxpbmcgY3ZpICIpOyAgICAgICAgICAgICAgLy8gdGFiIHZhbDIgY2VsbDAgY2VsbDEKLSAgICBfY21zSU9QcmludGYobSwgIjMgaW5kZXggIik7ICAgICAgICAgICAgICAgICAgLy8gdGFiIHZhbDIgY2VsbDAgY2VsbDEgdGFiCi0gICAgX2Ntc0lPUHJpbnRmKG0sICJleGNoICIpOyAgICAgICAgICAgICAgICAgICAgIC8vIHRhYiB2YWwyIGNlbGwwIHRhYiBjZWxsMQotICAgIF9jbXNJT1ByaW50ZihtLCAiZ2V0ICIpOyAgICAgICAgICAgICAgICAgICAgICAvLyB0YWIgdmFsMiBjZWxsMCB5MQotICAgIF9jbXNJT1ByaW50ZihtLCAiNCAtMSByb2xsICIpOyAgICAgICAgICAgICAgICAvLyB2YWwyIGNlbGwwIHkxIHRhYgotICAgIF9jbXNJT1ByaW50ZihtLCAiMyAtMSByb2xsICIpOyAgICAgICAgICAgICAgICAvLyB2YWwyIHkxIHRhYiBjZWxsMAotICAgIF9jbXNJT1ByaW50ZihtLCAiZ2V0ICIpOyAgICAgICAgICAgICAgICAgICAgICAvLyB2YWwyIHkxIHkwCi0gICAgX2Ntc0lPUHJpbnRmKG0sICJkdXAgIik7ICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbDIgeTEgeTAgeTAKLSAgICBfY21zSU9QcmludGYobSwgIjMgMSByb2xsICIpOyAgICAgICAgICAgICAgICAgLy8gdmFsMiB5MCB5MSB5MAotICAgIF9jbXNJT1ByaW50ZihtLCAic3ViICIpOyAgICAgICAgICAgICAgICAgICAgICAvLyB2YWwyIHkwICh5MS15MCkKLSAgICBfY21zSU9QcmludGYobSwgIjMgLTEgcm9sbCAiKTsgICAgICAgICAgICAgICAgLy8geTAgKHkxLXkwKSB2YWwyCi0gICAgX2Ntc0lPUHJpbnRmKG0sICJkdXAgIik7ICAgICAgICAgICAgICAgICAgICAgIC8vIHkwICh5MS15MCkgdmFsMiB2YWwyCi0gICAgX2Ntc0lPUHJpbnRmKG0sICJmbG9vciBjdmkgIik7ICAgICAgICAgICAgICAgIC8vIHkwICh5MS15MCkgdmFsMiBmbG9vcih2YWwyKQotICAgIF9jbXNJT1ByaW50ZihtLCAic3ViICIpOyAgICAgICAgICAgICAgICAgICAgICAvLyB5MCAoeTEteTApIHJlc3QKLSAgICBfY21zSU9QcmludGYobSwgIm11bCAiKTsgICAgICAgICAgICAgICAgICAgICAgLy8geTAgdDEKLSAgICBfY21zSU9QcmludGYobSwgImFkZCAiKTsgICAgICAgICAgICAgICAgICAgICAgLy8geQotICAgIF9jbXNJT1ByaW50ZihtLCAiNjU1MzUgZGl2ICIpOyAgICAgICAgICAgICAgICAvLyByZXN1bHQKLQotICAgIF9jbXNJT1ByaW50ZihtLCAiIH0gYmluZCAiKTsKLX0KLQotCi0vLyBDb21wYXJlIGdhbW1hIHRhYmxlCi0KLXN0YXRpYwotY21zQm9vbCBHYW1tYVRhYmxlRXF1YWxzKGNtc1VJbnQxNk51bWJlciogZzEsIGNtc1VJbnQxNk51bWJlciogZzIsIGludCBuRW50cmllcykKLXsKLSAgICByZXR1cm4gbWVtY21wKGcxLCBnMiwgbkVudHJpZXMqIHNpemVvZihjbXNVSW50MTZOdW1iZXIpKSA9PSAwOwotfQotCi0KLS8vIERvZXMgd3JpdGUgYSBzZXQgb2YgZ2FtbWEgY3VydmVzCi0KLXN0YXRpYwotdm9pZCBFbWl0TkdhbW1hKGNtc0lPSEFORExFUiogbSwgaW50IG4sIGNtc1RvbmVDdXJ2ZSogZ1tdKQotewotICAgIGludCBpOwotCi0gICAgZm9yKCBpPTA7IGkgPCBuOyBpKysgKQotICAgIHsKLSAgICAgICAgaWYgKGdbaV0gPT0gTlVMTCkgcmV0dXJuOyAvLyBFcnJvcgotCi0gICAgICAgIGlmIChpID4gMCAmJiBHYW1tYVRhYmxlRXF1YWxzKGdbaS0xXS0+VGFibGUxNiwgZ1tpXS0+VGFibGUxNiwgZ1tpXS0+bkVudHJpZXMpKSB7Ci0KLSAgICAgICAgICAgIF9jbXNJT1ByaW50ZihtLCAiZHVwICIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgRW1pdDFHYW1tYShtLCBnW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotfQotCi0KLQotCi0KLS8vIEZvbGxvd2luZyBjb2RlIGR1bXBzIGEgTFVUIG9udG8gbWVtb3J5IHN0cmVhbQotCi0KLS8vIFRoaXMgaXMgdGhlIHNhbXBsZXIuIEludGVuZGVkIHRvIHdvcmsgaW4gU0FNUExFUl9JTlNQRUNUIG1vZGUsCi0vLyB0aGF0IGlzLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2gga25vdCB3aXRoCi0vLwotLy8gICAgICAgICAgSW5bXSAgVGhlIGdyaWQgbG9jYXRpb24gY29vcmRpbmF0ZXMsIG5vcm1hbGl6ZWQgdG8gMC4uZmZmZgotLy8gICAgICAgICAgT3V0W10gVGhlIFBpcGVsaW5lIHZhbHVlcywgbm9ybWFsaXplZCB0byAwLi5mZmZmCi0vLwotLy8gIFJldHVybmluZyBhIHZhbHVlIG90aGVyIHRoYW4gMCBkb2VzIHRlcm1pbmF0ZSB0aGUgc2FtcGxpbmcgcHJvY2VzcwotLy8KLS8vICBFYWNoIHJvdyBjb250YWlucyBQaXBlbGluZSB2YWx1ZXMgZm9yIGFsbCBidXQgZmlyc3QgY29tcG9uZW50LiBTbywgSQotLy8gIGRldGVjdCByb3cgY2hhbmdpbmcgYnkga2VlcGluZyBhIGNvcHkgb2YgbGFzdCB2YWx1ZSBvZiBmaXJzdAotLy8gIGNvbXBvbmVudC4gLTEgaXMgdXNlZCB0byBtYXJrIGJlZ2luaW5nIG9mIHdob2xlIGJsb2NrLgotCi1zdGF0aWMKLWludCBPdXRwdXRWYWx1ZVNhbXBsZXIocmVnaXN0ZXIgY29uc3QgY21zVUludDE2TnVtYmVyIEluW10sIHJlZ2lzdGVyIGNtc1VJbnQxNk51bWJlciBPdXRbXSwgcmVnaXN0ZXIgdm9pZCogQ2FyZ28pCi17Ci0gICAgY21zUHNTYW1wbGVyQ2FyZ28qIHNjID0gKGNtc1BzU2FtcGxlckNhcmdvKikgQ2FyZ287Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0KLQotICAgIGlmIChzYyAtPiBGaXhXaGl0ZSkgewotCi0gICAgICAgIGlmIChJblswXSA9PSAweEZGRkYpIHsgIC8vIE9ubHkgaW4gTCogPSAxMDAsIGFiID0gWy04Li44XQotCi0gICAgICAgICAgICBpZiAoKEluWzFdID49IDB4NzgwMCAmJiBJblsxXSA8PSAweDg4MDApICYmCi0gICAgICAgICAgICAgICAgKEluWzJdID49IDB4NzgwMCAmJiBJblsyXSA8PSAweDg4MDApKSB7Ci0KLSAgICAgICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIqIEJsYWNrOwotICAgICAgICAgICAgICAgIGNtc1VJbnQxNk51bWJlciogV2hpdGU7Ci0gICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG5PdXRwdXRzOwotCi0gICAgICAgICAgICAgICAgaWYgKCFfY21zRW5kUG9pbnRzQnlTcGFjZShzYyAtPkNvbG9yU3BhY2UsICZXaGl0ZSwgJkJsYWNrLCAmbk91dHB1dHMpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IG5PdXRwdXRzOyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICBPdXRbaV0gPSBXaGl0ZVtpXTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8vIEhhZGxlIHRoZSBwYXJlbnRoZXNpcyBvbiByb3dzCi0KLSAgICBpZiAoSW5bMF0gIT0gc2MgLT5GaXJzdENvbXBvbmVudCkgewotCi0gICAgICAgICAgICBpZiAoc2MgLT5GaXJzdENvbXBvbmVudCAhPSAtMSkgewotCi0gICAgICAgICAgICAgICAgICAgIF9jbXNJT1ByaW50ZihzYyAtPm0sIHNjIC0+UG9zdE1pbik7Ci0gICAgICAgICAgICAgICAgICAgIHNjIC0+U2Vjb25kQ29tcG9uZW50ID0gLTE7Ci0gICAgICAgICAgICAgICAgICAgIF9jbXNJT1ByaW50ZihzYyAtPm0sIHNjIC0+UG9zdE1haik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEJlZ2luIGJsb2NrCi0gICAgICAgICAgICBfY21zUFNBY3R1YWxDb2x1bW4gPSAwOwotCi0gICAgICAgICAgICBfY21zSU9QcmludGYoc2MgLT5tLCBzYyAtPlByZU1haik7Ci0gICAgICAgICAgICBzYyAtPkZpcnN0Q29tcG9uZW50ID0gSW5bMF07Ci0gICAgfQotCi0KLSAgICAgIGlmIChJblsxXSAhPSBzYyAtPlNlY29uZENvbXBvbmVudCkgewotCi0gICAgICAgICAgICBpZiAoc2MgLT5TZWNvbmRDb21wb25lbnQgIT0gLTEpIHsKLQotICAgICAgICAgICAgICAgICAgICBfY21zSU9QcmludGYoc2MgLT5tLCBzYyAtPlBvc3RNaW4pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBfY21zSU9QcmludGYoc2MgLT5tLCBzYyAtPlByZU1pbik7Ci0gICAgICAgICAgICBzYyAtPlNlY29uZENvbXBvbmVudCA9IEluWzFdOwotICAgIH0KLQotICAgICAgLy8gRHVtcCB0YWJsZS4KLQotICAgICAgZm9yIChpPTA7IGkgPCBzYyAtPiBQaXBlbGluZSAtPlBhcmFtcy0+bk91dHB1dHM7IGkrKykgewotCi0gICAgICAgICAgY21zVUludDE2TnVtYmVyIHdXb3JkT3V0ID0gT3V0W2ldOwotICAgICAgICAgIGNtc1VJbnQ4TnVtYmVyIHdCeXRlT3V0OyAgICAgICAgICAgLy8gVmFsdWUgYXMgYnl0ZQotCi0KLSAgICAgICAgICAvLyBXZSBhbHdheXMgZGVhbCB3aXRoIExhYjQKLQotICAgICAgICAgIHdCeXRlT3V0ID0gV29yZDJCeXRlKHdXb3JkT3V0KTsKLSAgICAgICAgICBXcml0ZUJ5dGUoc2MgLT4gbSwgd0J5dGVPdXQpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gMTsKLX0KLQotLy8gV3JpdGVzIGEgUGlwZWxpbmUgb24gbWVtc3RyZWFtLiBDb3VsZCBiZSA4IG9yIDE2IGJpdHMgYmFzZWQKLQotc3RhdGljCi12b2lkIFdyaXRlQ0xVVChjbXNJT0hBTkRMRVIqIG0sIGNtc1N0YWdlKiBtcGUsIGNvbnN0IGNoYXIqIFByZU1haiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIFBvc3RNYWosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBQcmVNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBQb3N0TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IEZpeFdoaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBDb2xvclNwYWNlKQotewotICAgIGNtc1VJbnQzMk51bWJlciBpOwotICAgIGNtc1BzU2FtcGxlckNhcmdvIHNjOwotCi0gICAgc2MuRmlyc3RDb21wb25lbnQgPSAtMTsKLSAgICBzYy5TZWNvbmRDb21wb25lbnQgPSAtMTsKLSAgICBzYy5QaXBlbGluZSA9IChfY21zU3RhZ2VDTHV0RGF0YSAqKSBtcGUgLT5EYXRhOwotICAgIHNjLm0gICA9IG07Ci0gICAgc2MuUHJlTWFqID0gUHJlTWFqOwotICAgIHNjLlBvc3RNYWo9IFBvc3RNYWo7Ci0KLSAgICBzYy5QcmVNaW4gICA9IFByZU1pbjsKLSAgICBzYy5Qb3N0TWluICA9IFBvc3RNaW47Ci0gICAgc2MuRml4V2hpdGUgPSBGaXhXaGl0ZTsKLSAgICBzYy5Db2xvclNwYWNlID0gQ29sb3JTcGFjZTsKLQotICAgIF9jbXNJT1ByaW50ZihtLCAiWyIpOwotCi0gICAgZm9yIChpPTA7IGkgPCBzYy5QaXBlbGluZS0+UGFyYW1zLT5uSW5wdXRzOyBpKyspCi0gICAgICAgIF9jbXNJT1ByaW50ZihtLCAiICVkICIsIHNjLlBpcGVsaW5lLT5QYXJhbXMtPm5TYW1wbGVzW2ldKTsKLQotICAgIF9jbXNJT1ByaW50ZihtLCAiIFtcbiIpOwotCi0gICAgY21zU3RhZ2VTYW1wbGVDTHV0MTZiaXQobXBlLCBPdXRwdXRWYWx1ZVNhbXBsZXIsICh2b2lkKikgJnNjLCBTQU1QTEVSX0lOU1BFQ1QpOwotCi0gICAgX2Ntc0lPUHJpbnRmKG0sIFBvc3RNaW4pOwotICAgIF9jbXNJT1ByaW50ZihtLCBQb3N0TWFqKTsKLSAgICBfY21zSU9QcmludGYobSwgIl0gIik7Ci0KLX0KLQotCi0vLyBEdW1wcyBDSUVCYXNlZEEgQ29sb3IgU3BhY2UgQXJyYXkKLQotc3RhdGljCi1pbnQgRW1pdENJRUJhc2VkQShjbXNJT0hBTkRMRVIqIG0sIGNtc1RvbmVDdXJ2ZSogQ3VydmUsIGNtc0NJRVhZWiogQmxhY2tQb2ludCkKLXsKLQotICAgIF9jbXNJT1ByaW50ZihtLCAiWyAvQ0lFQmFzZWRBXG4iKTsKLSAgICBfY21zSU9QcmludGYobSwgIiAgPDxcbiIpOwotCi0gICAgX2Ntc0lPUHJpbnRmKG0sICIvRGVjb2RlQSAiKTsKLQotICAgIEVtaXQxR2FtbWEobSwgQ3VydmUpOwotCi0gICAgX2Ntc0lPUHJpbnRmKG0sICIgXG4iKTsKLQotICAgIF9jbXNJT1ByaW50ZihtLCAiL01hdHJpeEEgWyAwLjk2NDIgMS4wMDAwIDAuODI0OSBdXG4iKTsKLSAgICBfY21zSU9QcmludGYobSwgIi9SYW5nZUxNTiBbIDAuMCAwLjk2NDIgMC4wIDEuMDAwMCAwLjAgMC44MjQ5IF1cbiIpOwotCi0gICAgRW1pdFdoaXRlQmxhY2tENTAobSwgQmxhY2tQb2ludCk7Ci0gICAgRW1pdEludGVudChtLCBJTlRFTlRfUEVSQ0VQVFVBTCk7Ci0KLSAgICBfY21zSU9QcmludGYobSwgIj4+XG4iKTsKLSAgICBfY21zSU9QcmludGYobSwgIl1cbiIpOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLQotLy8gRHVtcHMgQ0lFQmFzZWRBQkMgQ29sb3IgU3BhY2UgQXJyYXkKLQotc3RhdGljCi1pbnQgRW1pdENJRUJhc2VkQUJDKGNtc0lPSEFORExFUiogbSwgY21zRmxvYXQ2NE51bWJlciogTWF0cml4LCBjbXNUb25lQ3VydmUqKiBDdXJ2ZVNldCwgY21zQ0lFWFlaKiBCbGFja1BvaW50KQotewotICAgIGludCBpOwotCi0gICAgX2Ntc0lPUHJpbnRmKG0sICJbIC9DSUVCYXNlZEFCQ1xuIik7Ci0gICAgX2Ntc0lPUHJpbnRmKG0sICI8PFxuIik7Ci0gICAgX2Ntc0lPUHJpbnRmKG0sICIvRGVjb2RlQUJDIFsgIik7Ci0KLSAgICBFbWl0TkdhbW1hKG0sIDMsIEN1cnZlU2V0KTsKLQotICAgIF9jbXNJT1ByaW50ZihtLCAiXVxuIik7Ci0KLSAgICBfY21zSU9QcmludGYobSwgIi9NYXRyaXhBQkMgWyAiICk7Ci0KLSAgICBmb3IoIGk9MDsgaSA8IDM7IGkrKyApIHsKLQotICAgICAgICBfY21zSU9QcmludGYobSwgIiUuNmYgJS42ZiAlLjZmICIsIE1hdHJpeFtpICsgMyowXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRyaXhbaSArIDMqMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0cml4W2kgKyAzKjJdKTsKLSAgICB9Ci0KLQotICAgIF9jbXNJT1ByaW50ZihtLCAiXVxuIik7Ci0KLSAgICBfY21zSU9QcmludGYobSwgIi9SYW5nZUxNTiBbIDAuMCAwLjk2NDIgMC4wIDEuMDAwMCAwLjAgMC44MjQ5IF1cbiIpOwotCi0gICAgRW1pdFdoaXRlQmxhY2tENTAobSwgQmxhY2tQb2ludCk7Ci0gICAgRW1pdEludGVudChtLCBJTlRFTlRfUEVSQ0VQVFVBTCk7Ci0KLSAgICBfY21zSU9QcmludGYobSwgIj4+XG4iKTsKLSAgICBfY21zSU9QcmludGYobSwgIl1cbiIpOwotCi0KLSAgICByZXR1cm4gMTsKLX0KLQotCi1zdGF0aWMKLWludCBFbWl0Q0lFQmFzZWRERUYoY21zSU9IQU5ETEVSKiBtLCBjbXNQaXBlbGluZSogUGlwZWxpbmUsIGludCBJbnRlbnQsIGNtc0NJRVhZWiogQmxhY2tQb2ludCkKLXsKLSAgICBjb25zdCBjaGFyKiBQcmVNYWo7Ci0gICAgY29uc3QgY2hhciogUG9zdE1hajsKLSAgICBjb25zdCBjaGFyKiBQcmVNaW4sICpQb3N0TWluOwotICAgIGNtc1N0YWdlKiBtcGU7Ci0KLSAgICBtcGUgPSBQaXBlbGluZSAtPkVsZW1lbnRzOwotCi0gICAgc3dpdGNoIChjbXNTdGFnZUlucHV0Q2hhbm5lbHMobXBlKSkgewotICAgIGNhc2UgMzoKLQotICAgICAgICAgICAgX2Ntc0lPUHJpbnRmKG0sICJbIC9DSUVCYXNlZERFRlxuIik7Ci0gICAgICAgICAgICBQcmVNYWogPSI8IjsKLSAgICAgICAgICAgIFBvc3RNYWo9ICI+XG4iOwotICAgICAgICAgICAgUHJlTWluID0gUG9zdE1pbiA9ICIiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgICAgICAgX2Ntc0lPUHJpbnRmKG0sICJbIC9DSUVCYXNlZERFRkdcbiIpOwotICAgICAgICAgICAgUHJlTWFqID0gIlsiOwotICAgICAgICAgICAgUG9zdE1haiA9ICJdXG4iOwotICAgICAgICAgICAgUHJlTWluID0gIjwiOwotICAgICAgICAgICAgUG9zdE1pbiA9ICI+XG4iOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiAwOwotCi0gICAgfQotCi0gICAgX2Ntc0lPUHJpbnRmKG0sICI8PFxuIik7Ci0KLSAgICBpZiAoY21zU3RhZ2VUeXBlKG1wZSkgPT0gY21zU2lnQ3VydmVTZXRFbGVtVHlwZSkgewotCi0gICAgICAgIF9jbXNJT1ByaW50ZihtLCAiL0RlY29kZURFRiBbICIpOwotICAgICAgICBFbWl0TkdhbW1hKG0sIGNtc1N0YWdlT3V0cHV0Q2hhbm5lbHMobXBlKSwgX2Ntc1N0YWdlR2V0UHRyVG9DdXJ2ZVNldChtcGUpKTsKLSAgICAgICAgX2Ntc0lPUHJpbnRmKG0sICJdXG4iKTsKLQotICAgICAgICBtcGUgPSBtcGUgLT5OZXh0OwotICAgIH0KLQotICAgIGlmIChjbXNTdGFnZVR5cGUobXBlKSA9PSBjbXNTaWdDTHV0RWxlbVR5cGUpIHsKLQotICAgICAgICAgICAgX2Ntc0lPUHJpbnRmKG0sICIvVGFibGUgIik7Ci0gICAgICAgICAgICBXcml0ZUNMVVQobSwgbXBlLCBQcmVNYWosIFBvc3RNYWosIFByZU1pbiwgUG9zdE1pbiwgRkFMU0UsIChjbXNDb2xvclNwYWNlU2lnbmF0dXJlKSAwKTsKLSAgICAgICAgICAgIF9jbXNJT1ByaW50ZihtLCAiXVxuIik7Ci0gICAgfQotCi0gICAgRW1pdExhYjJYWVoobSk7Ci0gICAgRW1pdFdoaXRlQmxhY2tENTAobSwgQmxhY2tQb2ludCk7Ci0gICAgRW1pdEludGVudChtLCBJbnRlbnQpOwotCi0gICAgX2Ntc0lPUHJpbnRmKG0sICIgICA+PlxuIik7Ci0gICAgX2Ntc0lPUHJpbnRmKG0sICJdXG4iKTsKLQotICAgIHJldHVybiAxOwotfQotCi0vLyBHZW5lcmF0ZXMgYSBjdXJ2ZSBmcm9tIGEgZ3JheSBwcm9maWxlCi0KLXN0YXRpYwotICAgIGNtc1RvbmVDdXJ2ZSogRXh0cmFjdEdyYXkyWShjbXNDb250ZXh0IENvbnRleHRJRCwgY21zSFBST0ZJTEUgaFByb2ZpbGUsIGludCBJbnRlbnQpCi17Ci0gICAgY21zVG9uZUN1cnZlKiBPdXQgPSBjbXNCdWlsZFRhYnVsYXRlZFRvbmVDdXJ2ZTE2KENvbnRleHRJRCwgMjU2LCBOVUxMKTsKLSAgICBjbXNIUFJPRklMRSBoWFlaICA9IGNtc0NyZWF0ZVhZWlByb2ZpbGUoKTsKLSAgICBjbXNIVFJBTlNGT1JNIHhmb3JtID0gY21zQ3JlYXRlVHJhbnNmb3JtVEhSKENvbnRleHRJRCwgaFByb2ZpbGUsIFRZUEVfR1JBWV84LCBoWFlaLCBUWVBFX1hZWl9EQkwsIEludGVudCwgY21zRkxBR1NfTk9PUFRJTUlaRSk7Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoT3V0ICE9IE5VTEwpIHsKLSAgICAgICAgZm9yIChpPTA7IGkgPCAyNTY7IGkrKykgewotCi0gICAgICAgICAgICBjbXNVSW50OE51bWJlciBHcmF5ID0gKGNtc1VJbnQ4TnVtYmVyKSBpOwotICAgICAgICAgICAgY21zQ0lFWFlaIFhZWjsKLQotICAgICAgICAgICAgY21zRG9UcmFuc2Zvcm0oeGZvcm0sICZHcmF5LCAmWFlaLCAxKTsKLQotICAgICAgICAgICAgT3V0IC0+VGFibGUxNltpXSA9X2Ntc1F1aWNrU2F0dXJhdGVXb3JkKFhZWi5ZICogNjU1MzUuMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjbXNEZWxldGVUcmFuc2Zvcm0oeGZvcm0pOwotICAgIGNtc0Nsb3NlUHJvZmlsZShoWFlaKTsKLSAgICByZXR1cm4gT3V0OwotfQotCi0KLQotLy8gQmVjYXVzZSBQb3N0U2NyaXB0IGhhcyBvbmx5IDggYml0cyBpbiAvVGFibGUsIHdlIHNob3VsZCB1c2UKLS8vIGEgbW9yZSBwZXJjZXB0dWFsbHkgdW5pZm9ybSBzcGFjZS4uLiBJIGRvIGNob29zZSBMYWIuCi0KLXN0YXRpYwotaW50IFdyaXRlSW5wdXRMVVQoY21zSU9IQU5ETEVSKiBtLCBjbXNIUFJPRklMRSBoUHJvZmlsZSwgaW50IEludGVudCwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpCi17Ci0gICAgY21zSFBST0ZJTEUgaExhYjsKLSAgICBjbXNIVFJBTlNGT1JNIHhmb3JtOwotICAgIGNtc1VJbnQzMk51bWJlciBuQ2hhbm5lbHM7Ci0gICAgY21zVUludDMyTnVtYmVyIElucHV0Rm9ybWF0OwotICAgIGludCByYzsKLSAgICBjbXNIUFJPRklMRSBQcm9maWxlc1syXTsKLSAgICBjbXNDSUVYWVogQmxhY2tQb2ludEFkYXB0ZWRUb0Q1MDsKLQotICAgIC8vIERvZXMgY3JlYXRlIGEgZGV2aWNlLWxpbmsgYmFzZWQgdHJhbnNmb3JtLgotICAgIC8vIFRoZSBEZXZpY2VMaW5rIGlzIG5leHQgZHVtcGVkIGFzIHdvcmtpbmcgQ1NBLgotCi0gICAgSW5wdXRGb3JtYXQgPSBjbXNGb3JtYXR0ZXJGb3JDb2xvcnNwYWNlT2ZQcm9maWxlKGhQcm9maWxlLCAyLCBGQUxTRSk7Ci0gICAgbkNoYW5uZWxzICAgPSBUX0NIQU5ORUxTKElucHV0Rm9ybWF0KTsKLQotCi0gICAgY21zRGV0ZWN0QmxhY2tQb2ludCgmQmxhY2tQb2ludEFkYXB0ZWRUb0Q1MCwgaFByb2ZpbGUsIEludGVudCwgMCk7Ci0KLSAgICAvLyBBZGp1c3Qgb3V0cHV0IHRvIExhYjQKLSAgICBoTGFiID0gY21zQ3JlYXRlTGFiNFByb2ZpbGVUSFIobSAtPkNvbnRleHRJRCwgTlVMTCk7Ci0KLSAgICBQcm9maWxlc1swXSA9IGhQcm9maWxlOwotICAgIFByb2ZpbGVzWzFdID0gaExhYjsKLQotICAgIHhmb3JtID0gY21zQ3JlYXRlTXVsdGlwcm9maWxlVHJhbnNmb3JtKFByb2ZpbGVzLCAyLCAgSW5wdXRGb3JtYXQsIFRZUEVfTGFiX0RCTCwgSW50ZW50LCAwKTsKLSAgICBjbXNDbG9zZVByb2ZpbGUoaExhYik7Ci0KLSAgICBpZiAoeGZvcm0gPT0gTlVMTCkgewotCi0gICAgICAgIGNtc1NpZ25hbEVycm9yKG0gLT5Db250ZXh0SUQsIGNtc0VSUk9SX0NPTE9SU1BBQ0VfQ0hFQ0ssICJDYW5ub3QgY3JlYXRlIHRyYW5zZm9ybSBQcm9maWxlIC0+IExhYiIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICAvLyBPbmx5IDEsIDMgYW5kIDQgY2hhbm5lbHMgYXJlIGFsbG93ZWQKLQotICAgIHN3aXRjaCAobkNoYW5uZWxzKSB7Ci0KLSAgICBjYXNlIDE6IHsKLSAgICAgICAgICAgIGNtc1RvbmVDdXJ2ZSogR3JheTJZID0gRXh0cmFjdEdyYXkyWShtIC0+Q29udGV4dElELCBoUHJvZmlsZSwgSW50ZW50KTsKLSAgICAgICAgICAgIEVtaXRDSUVCYXNlZEEobSwgR3JheTJZLCAmQmxhY2tQb2ludEFkYXB0ZWRUb0Q1MCk7Ci0gICAgICAgICAgICBjbXNGcmVlVG9uZUN1cnZlKEdyYXkyWSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLQotICAgIGNhc2UgMzoKLSAgICBjYXNlIDQ6IHsKLSAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBPdXRGcm0gPSBUWVBFX0xhYl8xNjsKLSAgICAgICAgICAgIGNtc1BpcGVsaW5lKiBEZXZpY2VMaW5rOwotICAgICAgICAgICAgX2Ntc1RSQU5TRk9STSogdiA9IChfY21zVFJBTlNGT1JNKikgeGZvcm07Ci0KLSAgICAgICAgICAgIERldmljZUxpbmsgPSBjbXNQaXBlbGluZUR1cCh2IC0+THV0KTsKLSAgICAgICAgICAgIGlmIChEZXZpY2VMaW5rID09IE5VTEwpIHJldHVybiAwOwotCi0gICAgICAgICAgICBkd0ZsYWdzIHw9IGNtc0ZMQUdTX0ZPUkNFX0NMVVQ7Ci0gICAgICAgICAgICBfY21zT3B0aW1pemVQaXBlbGluZShtLT5Db250ZXh0SUQsICZEZXZpY2VMaW5rLCBJbnRlbnQsICZJbnB1dEZvcm1hdCwgJk91dEZybSwgJmR3RmxhZ3MpOwotCi0gICAgICAgICAgICByYyA9IEVtaXRDSUVCYXNlZERFRihtLCBEZXZpY2VMaW5rLCBJbnRlbnQsICZCbGFja1BvaW50QWRhcHRlZFRvRDUwKTsKLSAgICAgICAgICAgIGNtc1BpcGVsaW5lRnJlZShEZXZpY2VMaW5rKTsKLSAgICAgICAgICAgIGlmIChyYyA9PSAwKSByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLQotICAgICAgICBjbXNTaWduYWxFcnJvcihtIC0+Q29udGV4dElELCBjbXNFUlJPUl9DT0xPUlNQQUNFX0NIRUNLLCAiT25seSAzLCA0IGNoYW5uZWxzIHN1cHBvcnRlZCBmb3IgQ1NBLiBUaGlzIHByb2ZpbGUgaGFzICVkIGNoYW5uZWxzLiIsIG5DaGFubmVscyk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotCi0gICAgY21zRGVsZXRlVHJhbnNmb3JtKHhmb3JtKTsKLQotICAgIHJldHVybiAxOwotfQotCi1zdGF0aWMKLWNtc0Zsb2F0NjROdW1iZXIqIEdldFB0clRvTWF0cml4KGNvbnN0IGNtc1N0YWdlKiBtcGUpCi17Ci0gICAgX2Ntc1N0YWdlTWF0cml4RGF0YSogRGF0YSA9IChfY21zU3RhZ2VNYXRyaXhEYXRhKikgbXBlIC0+RGF0YTsKLQotICAgIHJldHVybiBEYXRhIC0+IERvdWJsZTsKLX0KLQotCi0vLyBEb2VzIGNyZWF0ZSBDU0EgYmFzZWQgb24gbWF0cml4LXNoYXBlci4gQWxsb3dlZCB0eXBlcyBhcmUgZ3JheSBhbmQgUkdCIGJhc2VkCi0KLXN0YXRpYwotaW50IFdyaXRlSW5wdXRNYXRyaXhTaGFwZXIoY21zSU9IQU5ETEVSKiBtLCBjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zU3RhZ2UqIE1hdHJpeCwgY21zU3RhZ2UqIFNoYXBlcikKLXsKLSAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2U7Ci0gICAgaW50IHJjOwotICAgIGNtc0NJRVhZWiBCbGFja1BvaW50QWRhcHRlZFRvRDUwOwotCi0gICAgQ29sb3JTcGFjZSA9IGNtc0dldENvbG9yU3BhY2UoaFByb2ZpbGUpOwotCi0gICAgY21zRGV0ZWN0QmxhY2tQb2ludCgmQmxhY2tQb2ludEFkYXB0ZWRUb0Q1MCwgaFByb2ZpbGUsIElOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUMsIDApOwotCi0gICAgaWYgKENvbG9yU3BhY2UgPT0gY21zU2lnR3JheURhdGEpIHsKLQotICAgICAgICBjbXNUb25lQ3VydmUqKiBTaGFwZXJDdXJ2ZSA9IF9jbXNTdGFnZUdldFB0clRvQ3VydmVTZXQoU2hhcGVyKTsKLSAgICAgICAgcmMgPSBFbWl0Q0lFQmFzZWRBKG0sIFNoYXBlckN1cnZlWzBdLCAmQmxhY2tQb2ludEFkYXB0ZWRUb0Q1MCk7Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgICAgICBpZiAoQ29sb3JTcGFjZSA9PSBjbXNTaWdSZ2JEYXRhKSB7Ci0KLSAgICAgICAgICAgIGNtc01BVDMgTWF0OwotICAgICAgICAgICAgaW50IGksIGo7Ci0KLSAgICAgICAgICAgIG1lbW1vdmUoJk1hdCwgR2V0UHRyVG9NYXRyaXgoTWF0cml4KSwgc2l6ZW9mKE1hdCkpOwotCi0gICAgICAgICAgICBmb3IgKGk9MDsgaSA8IDM7IGkrKykKLSAgICAgICAgICAgICAgICBmb3IgKGo9MDsgaiA8IDM7IGorKykKLSAgICAgICAgICAgICAgICAgICAgTWF0LnZbaV0ubltqXSAqPSBNQVhfRU5DT0RFQUJMRV9YWVo7Ci0KLSAgICAgICAgICAgIHJjID0gRW1pdENJRUJhc2VkQUJDKG0sICAoY21zRmxvYXQ2NE51bWJlciAqKSAmTWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY21zU3RhZ2VHZXRQdHJUb0N1cnZlU2V0KFNoYXBlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQmxhY2tQb2ludEFkYXB0ZWRUb0Q1MCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAgewotCi0gICAgICAgICAgICBjbXNTaWduYWxFcnJvcihtIC0+Q29udGV4dElELCBjbXNFUlJPUl9DT0xPUlNQQUNFX0NIRUNLLCAiUHJvZmlsZSBpcyBub3Qgc3VpdGFibGUgZm9yIENTQS4gVW5zdXBwb3J0ZWQgY29sb3JzcGFjZS4iKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJjOwotfQotCi0KLQotLy8gQ3JlYXRlcyBhIFBvc3RTY3JpcHQgY29sb3IgbGlzdCBmcm9tIGEgbmFtZWQgcHJvZmlsZSBkYXRhLgotLy8gVGhpcyBpcyBhIEhQIGV4dGVuc2lvbiwgYW5kIGl0IHdvcmtzIGluIExhYiBpbnN0ZWFkIG9mIFhZWgotCi1zdGF0aWMKLWludCBXcml0ZU5hbWVkQ29sb3JDU0EoY21zSU9IQU5ETEVSKiBtLCBjbXNIUFJPRklMRSBoTmFtZWRDb2xvciwgaW50IEludGVudCkKLXsKLSAgICBjbXNIVFJBTlNGT1JNIHhmb3JtOwotICAgIGNtc0hQUk9GSUxFICAgaExhYjsKLSAgICBpbnQgaSwgbkNvbG9yczsKLSAgICBjaGFyIENvbG9yTmFtZVszMl07Ci0gICAgY21zTkFNRURDT0xPUkxJU1QqIE5hbWVkQ29sb3JMaXN0OwotCi0gICAgaExhYiAgPSBjbXNDcmVhdGVMYWI0UHJvZmlsZVRIUihtIC0+Q29udGV4dElELCBOVUxMKTsKLSAgICB4Zm9ybSA9IGNtc0NyZWF0ZVRyYW5zZm9ybShoTmFtZWRDb2xvciwgVFlQRV9OQU1FRF9DT0xPUl9JTkRFWCwgaExhYiwgVFlQRV9MYWJfREJMLCBJbnRlbnQsIDApOwotICAgIGlmICh4Zm9ybSA9PSBOVUxMKSByZXR1cm4gMDsKLQotICAgIE5hbWVkQ29sb3JMaXN0ID0gY21zR2V0TmFtZWRDb2xvckxpc3QoeGZvcm0pOwotICAgIGlmIChOYW1lZENvbG9yTGlzdCA9PSBOVUxMKSByZXR1cm4gMDsKLQotICAgIF9jbXNJT1ByaW50ZihtLCAiPDxcbiIpOwotICAgIF9jbXNJT1ByaW50ZihtLCAiKGNvbG9ybGlzdGNvbW1lbnQpICglcylcbiIsICJOYW1lZCBjb2xvciBDU0EiKTsKLSAgICBfY21zSU9QcmludGYobSwgIihQcmVmaXgpIFsgKFBhbnRvbmUgKSAoUEFOVE9ORSApIF1cbiIpOwotICAgIF9jbXNJT1ByaW50ZihtLCAiKFN1ZmZpeCkgWyAoIENWKSAoIENWQykgKCBDKSBdXG4iKTsKLQotICAgIG5Db2xvcnMgICA9IGNtc05hbWVkQ29sb3JDb3VudChOYW1lZENvbG9yTGlzdCk7Ci0KLQotICAgIGZvciAoaT0wOyBpIDwgbkNvbG9yczsgaSsrKSB7Ci0KLSAgICAgICAgY21zVUludDE2TnVtYmVyIEluWzFdOwotICAgICAgICBjbXNDSUVMYWIgTGFiOwotCi0gICAgICAgIEluWzBdID0gKGNtc1VJbnQxNk51bWJlcikgaTsKLQotICAgICAgICBpZiAoIWNtc05hbWVkQ29sb3JJbmZvKE5hbWVkQ29sb3JMaXN0LCBpLCBDb2xvck5hbWUsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGNtc0RvVHJhbnNmb3JtKHhmb3JtLCBJbiwgJkxhYiwgMSk7Ci0gICAgICAgIF9jbXNJT1ByaW50ZihtLCAiICAoJXMpIFsgJS4zZiAlLjNmICUuM2YgXVxuIiwgQ29sb3JOYW1lLCBMYWIuTCwgTGFiLmEsIExhYi5iKTsKLSAgICB9Ci0KLQotCi0gICAgX2Ntc0lPUHJpbnRmKG0sICI+PlxuIik7Ci0KLSAgICBjbXNEZWxldGVUcmFuc2Zvcm0oeGZvcm0pOwotICAgIGNtc0Nsb3NlUHJvZmlsZShoTGFiKTsKLSAgICByZXR1cm4gMTsKLX0KLQotCi0vLyBEb2VzIGNyZWF0ZSBhIENvbG9yIFNwYWNlIEFycmF5IG9uIFhZWiBjb2xvcnNwYWNlIGZvciBQb3N0U2NyaXB0IHVzYWdlCi1zdGF0aWMKLWNtc1VJbnQzMk51bWJlciBHZW5lcmF0ZUNTQShjbXNDb250ZXh0IENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSBoUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW50ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0lPSEFORExFUiogbWVtKQotewotICAgIGNtc1VJbnQzMk51bWJlciBkd0J5dGVzVXNlZDsKLSAgICBjbXNQaXBlbGluZSogbHV0ID0gTlVMTDsKLSAgICBjbXNTdGFnZSogTWF0cml4LCAqU2hhcGVyOwotCi0KLSAgICAvLyBJcyBhIG5hbWVkIGNvbG9yIHByb2ZpbGU/Ci0gICAgaWYgKGNtc0dldERldmljZUNsYXNzKGhQcm9maWxlKSA9PSBjbXNTaWdOYW1lZENvbG9yQ2xhc3MpIHsKLQotICAgICAgICBpZiAoIVdyaXRlTmFtZWRDb2xvckNTQShtZW0sIGhQcm9maWxlLCBJbnRlbnQpKSBnb3RvIEVycm9yOwotICAgIH0KLSAgICBlbHNlIHsKLQotCi0gICAgICAgIC8vIEFueSBwcm9maWxlIGNsYXNzIGFyZSBhbGxvd2VkIChpbmNsdWRpbmcgZGV2aWNlbGluayksIGJ1dAotICAgICAgICAvLyBvdXRwdXQgKFBDUykgY29sb3JzcGFjZSBtdXN0IGJlIFhZWiBvciBMYWIKLSAgICAgICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBDb2xvclNwYWNlID0gY21zR2V0UENTKGhQcm9maWxlKTsKLQotICAgICAgICBpZiAoQ29sb3JTcGFjZSAhPSBjbXNTaWdYWVpEYXRhICYmCi0gICAgICAgICAgICBDb2xvclNwYWNlICE9IGNtc1NpZ0xhYkRhdGEpIHsKLQotICAgICAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfQ09MT1JTUEFDRV9DSEVDSywgIkludmFsaWQgb3V0cHV0IGNvbG9yIHNwYWNlIik7Ci0gICAgICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLy8gUmVhZCB0aGUgbHV0IHdpdGggYWxsIG5lY2Vzc2FyeSBjb252ZXJzaW9uIHN0YWdlcwotICAgICAgICBsdXQgPSBfY21zUmVhZElucHV0TFVUKGhQcm9maWxlLCBJbnRlbnQpOwotICAgICAgICBpZiAobHV0ID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLQotICAgICAgICAvLyBUb25lIGN1cnZlcyArIG1hdHJpeCBjYW4gYmUgaW1wbGVtZW50ZWQgd2l0aG91dCBhbnkgTFVUCi0gICAgICAgIGlmIChjbXNQaXBlbGluZUNoZWNrQW5kUmV0cmVpdmVTdGFnZXMobHV0LCAyLCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLCBjbXNTaWdNYXRyaXhFbGVtVHlwZSwgJlNoYXBlciwgJk1hdHJpeCkpIHsKLQotICAgICAgICAgICAgaWYgKCFXcml0ZUlucHV0TWF0cml4U2hhcGVyKG1lbSwgaFByb2ZpbGUsIE1hdHJpeCwgU2hhcGVyKSkgZ290byBFcnJvcjsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAvLyBXZSBuZWVkIGEgTFVUIGZvciB0aGUgcmVzdAotICAgICAgICAgICBpZiAoIVdyaXRlSW5wdXRMVVQobWVtLCBoUHJvZmlsZSwgSW50ZW50LCBkd0ZsYWdzKSkgZ290byBFcnJvcjsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLy8gRG9uZSwga2VlcCBtZW1vcnkgdXNhZ2UKLSAgICBkd0J5dGVzVXNlZCA9IG1lbSAtPlVzZWRTcGFjZTsKLQotICAgIC8vIEdldCByaWQgb2YgTFVUCi0gICAgaWYgKGx1dCAhPSBOVUxMKSBjbXNQaXBlbGluZUZyZWUobHV0KTsKLQotICAgIC8vIEZpbmFsbHksIHJldHVybiB1c2VkIGJ5dGUgY291bnQKLSAgICByZXR1cm4gZHdCeXRlc1VzZWQ7Ci0KLUVycm9yOgotICAgIGlmIChsdXQgIT0gTlVMTCkgY21zUGlwZWxpbmVGcmVlKGx1dCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb2xvciBSZW5kZXJpbmcgRGljdGlvbmFyeSAoQ1JEKQotCi0KLQotLyoKLQotICBCbGFjayBwb2ludCBjb21wZW5zYXRpb24gcGx1cyBjaHJvbWF0aWMgYWRhcHRhdGlvbjoKLQotICBTdGVwIDEgLSBDaHJvbWF0aWMgYWRhcHRhdGlvbgotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgICAgV1BvdXQKLSAgICBYID0gLS0tLS0tLSBQUVIKLSAgICAgICAgICBXcGluCi0KLSAgU3RlcCAyIC0gQmxhY2sgcG9pbnQgY29tcGVuc2F0aW9uCi0gID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICAgICAgICAgKFdQb3V0IC0gQlBvdXQpKlggLSBXUG91dCooQlBpbiAtIEJQb3V0KQotICAgIG91dCA9IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgICAgICAgV1BvdXQgLSBCUGluCi0KLQotICBBbGdvcml0aG0gZGlzY3Vzc2lvbgotICA9PT09PT09PT09PT09PT09PT09PQotCi0gIFRyYW5zZm9ybVBRUihXUGluLCBCUGluLCBXUG91dCwgQlBvdXQsIFBRUikKLQotICBXcGluLGV0Yz0geyBYd3MgWXdzIFp3cyBQd3MgUXdzIFJ3cyB9Ci0KLQotICBBbGdvcml0aG0gICAgICAgICAgICAgU3RhY2sgMC4uLm4KLSAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgICAgICAgICAgICAgICAgICAgIFBRUiBCUG91dCBXUG91dCBCUGluIFdQaW4KLSAgNCBpbmRleCAzIGdldCAgICAgICAgIFdQaW4gUFFSIEJQb3V0IFdQb3V0IEJQaW4gV1BpbgotICBkaXYgICAgICAgICAgICAgICAgICAgKFBRUi9XUGluKSBCUG91dCBXUG91dCBCUGluIFdQaW4KLSAgMiBpbmRleCAzIGdldCAgICAgICAgIFdQb3V0IChQUVIvV1BpbikgQlBvdXQgV1BvdXQgQlBpbiBXUGluCi0gIG11bHQgICAgICAgICAgICAgICAgICBXUG91dCooUFFSL1dQaW4pIEJQb3V0IFdQb3V0IEJQaW4gV1BpbgotCi0gIDIgaW5kZXggMyBnZXQgICAgICAgICBXUG91dCBXUG91dCooUFFSL1dQaW4pIEJQb3V0IFdQb3V0IEJQaW4gV1BpbgotICAyIGluZGV4IDMgZ2V0ICAgICAgICAgQlBvdXQgV1BvdXQgV1BvdXQqKFBRUi9XUGluKSBCUG91dCBXUG91dCBCUGluIFdQaW4KLSAgc3ViICAgICAgICAgICAgICAgICAgIChXUG91dC1CUG91dCkgV1BvdXQqKFBRUi9XUGluKSBCUG91dCBXUG91dCBCUGluIFdQaW4KLSAgbXVsdCAgICAgICAgICAgICAgICAgIChXUG91dC1CUG91dCkqIFdQb3V0KihQUVIvV1BpbikgQlBvdXQgV1BvdXQgQlBpbiBXUGluCi0KLSAgMiBpbmRleCAzIGdldCAgICAgICAgIFdQb3V0IChCUG91dC1XUG91dCkqIFdQb3V0KihQUVIvV1BpbikgQlBvdXQgV1BvdXQgQlBpbiBXUGluCi0gIDQgaW5kZXggMyBnZXQgICAgICAgICBCUGluIFdQb3V0IChCUG91dC1XUG91dCkqIFdQb3V0KihQUVIvV1BpbikgQlBvdXQgV1BvdXQgQlBpbiBXUGluCi0gIDMgaW5kZXggMyBnZXQgICAgICAgICBCUG91dCBCUGluIFdQb3V0IChCUG91dC1XUG91dCkqIFdQb3V0KihQUVIvV1BpbikgQlBvdXQgV1BvdXQgQlBpbiBXUGluCi0KLSAgc3ViICAgICAgICAgICAgICAgICAgIChCUGluLUJQb3V0KSBXUG91dCAoQlBvdXQtV1BvdXQpKiBXUG91dCooUFFSL1dQaW4pIEJQb3V0IFdQb3V0IEJQaW4gV1BpbgotICBtdWx0ICAgICAgICAgICAgICAgICAgKEJQaW4tQlBvdXQpKldQb3V0IChCUG91dC1XUG91dCkqIFdQb3V0KihQUVIvV1BpbikgQlBvdXQgV1BvdXQgQlBpbiBXUGluCi0gIHN1YiAgICAgICAgICAgICAgICAgICAoQlBvdXQtV1BvdXQpKiBXUG91dCooUFFSL1dQaW4pLShCUGluLUJQb3V0KSpXUG91dCBCUG91dCBXUG91dCBCUGluIFdQaW4KLQotICAzIGluZGV4IDMgZ2V0ICAgICAgICAgQlBpbiAoQlBvdXQtV1BvdXQpKiBXUG91dCooUFFSL1dQaW4pLShCUGluLUJQb3V0KSpXUG91dCBCUG91dCBXUG91dCBCUGluIFdQaW4KLSAgMyBpbmRleCAzIGdldCAgICAgICAgIFdQb3V0IEJQaW4gKEJQb3V0LVdQb3V0KSogV1BvdXQqKFBRUi9XUGluKS0oQlBpbi1CUG91dCkqV1BvdXQgQlBvdXQgV1BvdXQgQlBpbiBXUGluCi0gIGV4Y2gKLSAgc3ViICAgICAgICAgICAgICAgICAgIChXUG91dC1CUGluKSAoQlBvdXQtV1BvdXQpKiBXUG91dCooUFFSL1dQaW4pLShCUGluLUJQb3V0KSpXUG91dCBCUG91dCBXUG91dCBCUGluIFdQaW4KLSAgZGl2Ci0KLSAgZXhjaCBwb3AKLSAgZXhjaCBwb3AKLSAgZXhjaCBwb3AKLSAgZXhjaCBwb3AKLQotKi8KLQotCi1zdGF0aWMKLXZvaWQgRW1pdFBRUlN0YWdlKGNtc0lPSEFORExFUiogbSwgY21zSFBST0ZJTEUgaFByb2ZpbGUsIGludCBEb0JQQywgaW50IGxJc0Fic29sdXRlKQotewotCi0KLSAgICAgICAgaWYgKGxJc0Fic29sdXRlKSB7Ci0KLSAgICAgICAgICAgIC8vIEZvciBhYnNvbHV0ZSBjb2xvcmltZXRyaWMgaW50ZW50LCBlbmNvZGUgYmFjayB0byByZWxhdGl2ZQotICAgICAgICAgICAgLy8gYW5kIGdlbmVyYXRlIGEgcmVsYXRpdmUgUGlwZWxpbmUKLQotICAgICAgICAgICAgLy8gUmVsYXRpdmUgZW5jb2RpbmcgaXMgb2J0YWluZWQgYWNyb3NzIFhZWnBjcyooRDUwL1doaXRlUG9pbnQpCi0KLSAgICAgICAgICAgIGNtc0NJRVhZWiBXaGl0ZTsKLQotICAgICAgICAgICAgX2Ntc1JlYWRNZWRpYVdoaXRlUG9pbnQoJldoaXRlLCBoUHJvZmlsZSk7Ci0KLSAgICAgICAgICAgIF9jbXNJT1ByaW50ZihtLCIvTWF0cml4UFFSIFsxIDAgMCAwIDEgMCAwIDAgMSBdXG4iKTsKLSAgICAgICAgICAgIF9jbXNJT1ByaW50ZihtLCIvUmFuZ2VQUVIgWyAtMC41IDIgLTAuNSAyIC0wLjUgMiBdXG4iKTsKLQotICAgICAgICAgICAgX2Ntc0lPUHJpbnRmKG0sICIlJSBBYnNvbHV0ZSBjb2xvcmltZXRyaWMgLS0gZW5jb2RlIHRvIHJlbGF0aXZlIHRvIG1heGltaXplIExVVCB1c2FnZVxuIgotICAgICAgICAgICAgICAgICAgICAgICIvVHJhbnNmb3JtUFFSIFtcbiIKLSAgICAgICAgICAgICAgICAgICAgICAiezAuOTY0MiBtdWwgJWcgZGl2IGV4Y2ggcG9wIGV4Y2ggcG9wIGV4Y2ggcG9wIGV4Y2ggcG9wfSBiaW5kXG4iCi0gICAgICAgICAgICAgICAgICAgICAgInsxLjAwMDAgbXVsICVnIGRpdiBleGNoIHBvcCBleGNoIHBvcCBleGNoIHBvcCBleGNoIHBvcH0gYmluZFxuIgotICAgICAgICAgICAgICAgICAgICAgICJ7MC44MjQ5IG11bCAlZyBkaXYgZXhjaCBwb3AgZXhjaCBwb3AgZXhjaCBwb3AgZXhjaCBwb3B9IGJpbmRcbl1cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgV2hpdGUuWCwgV2hpdGUuWSwgV2hpdGUuWik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotCi0gICAgICAgIF9jbXNJT1ByaW50ZihtLCIlJSBCcmFkZm9yZCBDb25lIFNwYWNlXG4iCi0gICAgICAgICAgICAgICAgICIvTWF0cml4UFFSIFswLjg5NTEgLTAuNzUwMiAwLjAzODkgMC4yNjY0IDEuNzEzNSAtMC4wNjg1IC0wLjE2MTQgMC4wMzY3IDEuMDI5NiBdIFxuIik7Ci0KLSAgICAgICAgX2Ntc0lPUHJpbnRmKG0sICIvUmFuZ2VQUVIgWyAtMC41IDIgLTAuNSAyIC0wLjUgMiBdXG4iKTsKLQotCi0gICAgICAgIC8vIE5vIEJQQwotCi0gICAgICAgIGlmICghRG9CUEMpIHsKLQotICAgICAgICAgICAgX2Ntc0lPUHJpbnRmKG0sICIlJSBWb25Lcmllcy1saWtlIHRyYW5zZm9ybSBpbiBCcmFkZm9yZCBDb25lIFNwYWNlXG4iCi0gICAgICAgICAgICAgICAgICAgICAgIi9UcmFuc2Zvcm1QUVIgW1xuIgotICAgICAgICAgICAgICAgICAgICAgICJ7ZXhjaCBwb3AgZXhjaCAzIGdldCBtdWwgZXhjaCBwb3AgZXhjaCAzIGdldCBkaXZ9IGJpbmRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAie2V4Y2ggcG9wIGV4Y2ggNCBnZXQgbXVsIGV4Y2ggcG9wIGV4Y2ggNCBnZXQgZGl2fSBiaW5kXG4iCi0gICAgICAgICAgICAgICAgICAgICAgIntleGNoIHBvcCBleGNoIDUgZ2V0IG11bCBleGNoIHBvcCBleGNoIDUgZ2V0IGRpdn0gYmluZFxuXVxuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0KLSAgICAgICAgICAgIC8vIEJQQwotCi0gICAgICAgICAgICBfY21zSU9QcmludGYobSwgIiUlIFZvbktyaWVzLWxpa2UgdHJhbnNmb3JtIGluIEJyYWRmb3JkIENvbmUgU3BhY2UgcGx1cyBCUENcbiIKLSAgICAgICAgICAgICAgICAgICAgICAiL1RyYW5zZm9ybVBRUiBbXG4iKTsKLQotICAgICAgICAgICAgX2Ntc0lPUHJpbnRmKG0sICJ7NCBpbmRleCAzIGdldCBkaXYgMiBpbmRleCAzIGdldCBtdWwgIgotICAgICAgICAgICAgICAgICAgICAiMiBpbmRleCAzIGdldCAyIGluZGV4IDMgZ2V0IHN1YiBtdWwgIgotICAgICAgICAgICAgICAgICAgICAiMiBpbmRleCAzIGdldCA0IGluZGV4IDMgZ2V0IDMgaW5kZXggMyBnZXQgc3ViIG11bCBzdWIgIgotICAgICAgICAgICAgICAgICAgICAiMyBpbmRleCAzIGdldCAzIGluZGV4IDMgZ2V0IGV4Y2ggc3ViIGRpdiAiCi0gICAgICAgICAgICAgICAgICAgICJleGNoIHBvcCBleGNoIHBvcCBleGNoIHBvcCBleGNoIHBvcCB9IGJpbmRcbiIpOwotCi0gICAgICAgICAgICBfY21zSU9QcmludGYobSwgIns0IGluZGV4IDQgZ2V0IGRpdiAyIGluZGV4IDQgZ2V0IG11bCAiCi0gICAgICAgICAgICAgICAgICAgICIyIGluZGV4IDQgZ2V0IDIgaW5kZXggNCBnZXQgc3ViIG11bCAiCi0gICAgICAgICAgICAgICAgICAgICIyIGluZGV4IDQgZ2V0IDQgaW5kZXggNCBnZXQgMyBpbmRleCA0IGdldCBzdWIgbXVsIHN1YiAiCi0gICAgICAgICAgICAgICAgICAgICIzIGluZGV4IDQgZ2V0IDMgaW5kZXggNCBnZXQgZXhjaCBzdWIgZGl2ICIKLSAgICAgICAgICAgICAgICAgICAgImV4Y2ggcG9wIGV4Y2ggcG9wIGV4Y2ggcG9wIGV4Y2ggcG9wIH0gYmluZFxuIik7Ci0KLSAgICAgICAgICAgIF9jbXNJT1ByaW50ZihtLCAiezQgaW5kZXggNSBnZXQgZGl2IDIgaW5kZXggNSBnZXQgbXVsICIKLSAgICAgICAgICAgICAgICAgICAgIjIgaW5kZXggNSBnZXQgMiBpbmRleCA1IGdldCBzdWIgbXVsICIKLSAgICAgICAgICAgICAgICAgICAgIjIgaW5kZXggNSBnZXQgNCBpbmRleCA1IGdldCAzIGluZGV4IDUgZ2V0IHN1YiBtdWwgc3ViICIKLSAgICAgICAgICAgICAgICAgICAgIjMgaW5kZXggNSBnZXQgMyBpbmRleCA1IGdldCBleGNoIHN1YiBkaXYgIgotICAgICAgICAgICAgICAgICAgICAiZXhjaCBwb3AgZXhjaCBwb3AgZXhjaCBwb3AgZXhjaCBwb3AgfSBiaW5kXG5dXG4iKTsKLQotICAgICAgICB9Ci0KLQotfQotCi0KLXN0YXRpYwotdm9pZCBFbWl0WFlaMkxhYihjbXNJT0hBTkRMRVIqIG0pCi17Ci0gICAgX2Ntc0lPUHJpbnRmKG0sICIvUmFuZ2VMTU4gWyAtMC42MzUgMi4wIDAgMiAtMC42MzUgMi4wIF1cbiIpOwotICAgIF9jbXNJT1ByaW50ZihtLCAiL0VuY29kZUxNTiBbXG4iKTsKLSAgICBfY21zSU9QcmludGYobSwgInsgMC45NjQyMDAgIGRpdiBkdXAgMC4wMDg4NTYgbGUgezcuNzg3IG11bCAxNiAxMTYgZGl2IGFkZH17MSAzIGRpdiBleHB9IGlmZWxzZSB9IGJpbmRcbiIpOwotICAgIF9jbXNJT1ByaW50ZihtLCAieyAxLjAwMDAwMCAgZGl2IGR1cCAwLjAwODg1NiBsZSB7Ny43ODcgbXVsIDE2IDExNiBkaXYgYWRkfXsxIDMgZGl2IGV4cH0gaWZlbHNlIH0gYmluZFxuIik7Ci0gICAgX2Ntc0lPUHJpbnRmKG0sICJ7IDAuODI0OTAwICBkaXYgZHVwIDAuMDA4ODU2IGxlIHs3Ljc4NyBtdWwgMTYgMTE2IGRpdiBhZGR9ezEgMyBkaXYgZXhwfSBpZmVsc2UgfSBiaW5kXG4iKTsKLSAgICBfY21zSU9QcmludGYobSwgIl1cbiIpOwotICAgIF9jbXNJT1ByaW50ZihtLCAiL01hdHJpeEFCQyBbIDAgMSAwIDEgLTEgMSAwIDAgLTEgXVxuIik7Ci0gICAgX2Ntc0lPUHJpbnRmKG0sICIvRW5jb2RlQUJDIFtcbiIpOwotCi0KLSAgICBfY21zSU9QcmludGYobSwgInsgMTE2IG11bCAgMTYgc3ViIDEwMCBkaXYgIH0gYmluZFxuIik7Ci0gICAgX2Ntc0lPUHJpbnRmKG0sICJ7IDUwMCBtdWwgMTI4IGFkZCAyNTYgZGl2ICB9IGJpbmRcbiIpOwotICAgIF9jbXNJT1ByaW50ZihtLCAieyAyMDAgbXVsIDEyOCBhZGQgMjU2IGRpdiAgfSBiaW5kXG4iKTsKLQotCi0gICAgX2Ntc0lPUHJpbnRmKG0sICJdXG4iKTsKLQotCi19Ci0KLS8vIER1ZSB0byBpbXBlZGFuY2UgbWlzbWF0Y2ggYmV0d2VlbiBYWVogYW5kIGFsbW9zdCBhbGwgUkdCIGFuZCBDTVlLIHNwYWNlcwotLy8gSSBjaG9vc2UgdG8gZHVtcCBMVVRTIGluIExhYiBpbnN0ZWFkIG9mIFhZWi4gVGhlcmUgaXMgc3RpbGwgYSBsb3Qgb2Ygd2FzdGVkCi0vLyBzcGFjZSBvbiAzRCBDTFVULCBidXQgc2luY2Ugc3BhY2Ugc2VlbXMgbm90IHRvIGJlIGEgcHJvYmxlbSBoZXJlLCAzMyBwb2ludHMKLS8vIHdvdWxkIGdpdmUgYSByZWFzb25hYmxlIGFjY3VyYW5jeS4gTm90ZSBhbHNvIHRoYXQgQ1JEIHRhYmxlcyBtdXN0IG9wZXJhdGUgaW4KLS8vIDggYml0cy4KLQotc3RhdGljCi1pbnQgV3JpdGVPdXRwdXRMVVQoY21zSU9IQU5ETEVSKiBtLCBjbXNIUFJPRklMRSBoUHJvZmlsZSwgaW50IEludGVudCwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpCi17Ci0gICAgY21zSFBST0ZJTEUgaExhYjsKLSAgICBjbXNIVFJBTlNGT1JNIHhmb3JtOwotICAgIGludCBpLCBuQ2hhbm5lbHM7Ci0gICAgY21zVUludDMyTnVtYmVyIE91dHB1dEZvcm1hdDsKLSAgICBfY21zVFJBTlNGT1JNKiB2OwotICAgIGNtc1BpcGVsaW5lKiBEZXZpY2VMaW5rOwotICAgIGNtc0hQUk9GSUxFIFByb2ZpbGVzWzNdOwotICAgIGNtc0NJRVhZWiBCbGFja1BvaW50QWRhcHRlZFRvRDUwOwotICAgIGNtc0Jvb2wgbERvQlBDID0gKGR3RmxhZ3MgJiBjbXNGTEFHU19CTEFDS1BPSU5UQ09NUEVOU0FUSU9OKTsKLSAgICBjbXNCb29sIGxGaXhXaGl0ZSA9ICEoZHdGbGFncyAmIGNtc0ZMQUdTX05PV0hJVEVPTldISVRFRklYVVApOwotICAgIGNtc1VJbnQzMk51bWJlciBJbkZybSA9IFRZUEVfTGFiXzE2OwotICAgIGludCBSZWxhdGl2ZUVuY29kaW5nSW50ZW50OwotICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgQ29sb3JTcGFjZTsKLQotCi0gICAgaExhYiA9IGNtc0NyZWF0ZUxhYjRQcm9maWxlVEhSKG0gLT5Db250ZXh0SUQsIE5VTEwpOwotICAgIGlmIChoTGFiID09IE5VTEwpIHJldHVybiAwOwotCi0gICAgT3V0cHV0Rm9ybWF0ID0gY21zRm9ybWF0dGVyRm9yQ29sb3JzcGFjZU9mUHJvZmlsZShoUHJvZmlsZSwgMiwgRkFMU0UpOwotICAgIG5DaGFubmVscyAgICA9IFRfQ0hBTk5FTFMoT3V0cHV0Rm9ybWF0KTsKLQotICAgIENvbG9yU3BhY2UgPSBjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKTsKLQotICAgIC8vIEZvciBhYnNvbHV0ZSBjb2xvcmltZXRyaWMsIHRoZSBMVVQgaXMgZW5jb2RlZCBhcyByZWxhdGl2ZSBpbiBvcmRlciB0byBwcmVzZXJ2ZSBwcmVjaXNpb24uCi0KLSAgICBSZWxhdGl2ZUVuY29kaW5nSW50ZW50ID0gSW50ZW50OwotICAgIGlmIChSZWxhdGl2ZUVuY29kaW5nSW50ZW50ID09IElOVEVOVF9BQlNPTFVURV9DT0xPUklNRVRSSUMpCi0gICAgICAgIFJlbGF0aXZlRW5jb2RpbmdJbnRlbnQgPSBJTlRFTlRfUkVMQVRJVkVfQ09MT1JJTUVUUklDOwotCi0KLSAgICAvLyBVc2UgVjQgTGFiIGFsd2F5cwotICAgIFByb2ZpbGVzWzBdID0gaExhYjsKLSAgICBQcm9maWxlc1sxXSA9IGhQcm9maWxlOwotCi0gICAgeGZvcm0gPSBjbXNDcmVhdGVNdWx0aXByb2ZpbGVUcmFuc2Zvcm1USFIobSAtPkNvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlcywgMiwgVFlQRV9MYWJfREJMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dEZvcm1hdCwgUmVsYXRpdmVFbmNvZGluZ0ludGVudCwgMCk7Ci0gICAgY21zQ2xvc2VQcm9maWxlKGhMYWIpOwotCi0gICAgaWYgKHhmb3JtID09IE5VTEwpIHsKLQotICAgICAgICBjbXNTaWduYWxFcnJvcihtIC0+Q29udGV4dElELCBjbXNFUlJPUl9DT0xPUlNQQUNFX0NIRUNLLCAiQ2Fubm90IGNyZWF0ZSB0cmFuc2Zvcm0gTGFiIC0+IFByb2ZpbGUgaW4gQ1JEIGNyZWF0aW9uIik7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8vIEdldCBhIGNvcHkgb2YgdGhlIGludGVybmFsIGRldmljZWxpbmsKLSAgICB2ID0gKF9jbXNUUkFOU0ZPUk0qKSB4Zm9ybTsKLSAgICBEZXZpY2VMaW5rID0gY21zUGlwZWxpbmVEdXAodiAtPkx1dCk7Ci0gICAgaWYgKERldmljZUxpbmsgPT0gTlVMTCkgcmV0dXJuIDA7Ci0KLQotICAgIC8vIFdlIG5lZWQgYSBDTFVUCi0gICAgZHdGbGFncyB8PSBjbXNGTEFHU19GT1JDRV9DTFVUOwotICAgIF9jbXNPcHRpbWl6ZVBpcGVsaW5lKG0tPkNvbnRleHRJRCwgJkRldmljZUxpbmssIFJlbGF0aXZlRW5jb2RpbmdJbnRlbnQsICZJbkZybSwgJk91dHB1dEZvcm1hdCwgJmR3RmxhZ3MpOwotCi0gICAgX2Ntc0lPUHJpbnRmKG0sICI8PFxuIik7Ci0gICAgX2Ntc0lPUHJpbnRmKG0sICIvQ29sb3JSZW5kZXJpbmdUeXBlIDFcbiIpOwotCi0KLSAgICBjbXNEZXRlY3RCbGFja1BvaW50KCZCbGFja1BvaW50QWRhcHRlZFRvRDUwLCBoUHJvZmlsZSwgSW50ZW50LCAwKTsKLQotICAgIC8vIEVtaXQgaGVhZGVycywgZXRjLgotICAgIEVtaXRXaGl0ZUJsYWNrRDUwKG0sICZCbGFja1BvaW50QWRhcHRlZFRvRDUwKTsKLSAgICBFbWl0UFFSU3RhZ2UobSwgaFByb2ZpbGUsIGxEb0JQQywgSW50ZW50ID09IElOVEVOVF9BQlNPTFVURV9DT0xPUklNRVRSSUMpOwotICAgIEVtaXRYWVoyTGFiKG0pOwotCi0KLSAgICAvLyBGSVhVUDogbWFwIExhYiAoMTAwLCAwLCAwKSB0byBwZXJmZWN0IHdoaXRlLCBiZWNhdXNlIHRoZSBwYXJ0aWN1bGFyIGVuY29kaW5nIGZvciBMYWIKLSAgICAvLyBkb2VzIG1hcCBhPWI9MCBub3QgZmFsbGluZyBpbnRvIGFueSBzcGVjaWZpYyBub2RlLiBTaW5jZSByYW5nZSBhLGIgZ29lcyAtMTI4Li4xMjcsCi0gICAgLy8gemVybyBpcyBzbGlnaHRseSBtb3ZlZCB0b3dhcmRzIHJpZ2h0LCBzbyBhc3N1cmUgbmV4dCBub2RlIChpbiBMPTEwMCBzbGljZSkgaXMgbWFwcGVkIHRvCi0gICAgLy8gemVyby4gVGhpcyB3b3VsZCBzYWNyaWZpY2UgYSBiaXQgb2YgaGlnaGxpZ2h0cywgYnV0IGZhaWx1cmUgdG8gZG8gc28gd291bGQgY2F1c2UKLSAgICAvLyBzY3VtIGRvdC4gT3VjaC4KLQotICAgIGlmIChJbnRlbnQgPT0gSU5URU5UX0FCU09MVVRFX0NPTE9SSU1FVFJJQykKLSAgICAgICAgICAgIGxGaXhXaGl0ZSA9IEZBTFNFOwotCi0gICAgX2Ntc0lPUHJpbnRmKG0sICIvUmVuZGVyVGFibGUgIik7Ci0KLQotICAgIFdyaXRlQ0xVVChtLCBjbXNQaXBlbGluZUdldFB0clRvRmlyc3RTdGFnZShEZXZpY2VMaW5rKSwgIjwiLCAiPlxuIiwgIiIsICIiLCBsRml4V2hpdGUsIENvbG9yU3BhY2UpOwotCi0gICAgX2Ntc0lPUHJpbnRmKG0sICIgJWQge30gYmluZCAiLCBuQ2hhbm5lbHMpOwotCi0gICAgZm9yIChpPTE7IGkgPCBuQ2hhbm5lbHM7IGkrKykKLSAgICAgICAgICAgIF9jbXNJT1ByaW50ZihtLCAiZHVwICIpOwotCi0gICAgX2Ntc0lPUHJpbnRmKG0sICJdXG4iKTsKLQotCi0gICAgRW1pdEludGVudChtLCBJbnRlbnQpOwotCi0gICAgX2Ntc0lPUHJpbnRmKG0sICI+PlxuIik7Ci0KLSAgICBpZiAoIShkd0ZsYWdzICYgY21zRkxBR1NfTk9ERUZBVUxUUkVTT1VSQ0VERUYpKSB7Ci0KLSAgICAgICAgX2Ntc0lPUHJpbnRmKG0sICIvQ3VycmVudCBleGNoIC9Db2xvclJlbmRlcmluZyBkZWZpbmVyZXNvdXJjZSBwb3BcbiIpOwotICAgIH0KLQotICAgIGNtc1BpcGVsaW5lRnJlZShEZXZpY2VMaW5rKTsKLSAgICBjbXNEZWxldGVUcmFuc2Zvcm0oeGZvcm0pOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0KLQotLy8gQnVpbGRzIGEgQVNDSUkgc3RyaW5nIGNvbnRhaW5pbmcgY29sb3JhbnQgbGlzdCBpbiAwLi4xLjAgcmFuZ2UKLXN0YXRpYwotdm9pZCBCdWlsZENvbG9yYW50TGlzdChjaGFyICpDb2xvcmFudCwgaW50IG5Db2xvcmFudCwgY21zVUludDE2TnVtYmVyIE91dFtdKQotewotICAgIGNoYXIgQnVmZlszMl07Ci0gICAgaW50IGo7Ci0KLSAgICBDb2xvcmFudFswXSA9IDA7Ci0gICAgaWYgKG5Db2xvcmFudCA+IGNtc01BWENIQU5ORUxTKQotICAgICAgICBuQ29sb3JhbnQgPSBjbXNNQVhDSEFOTkVMUzsKLQotICAgIGZvciAoaj0wOyBqIDwgbkNvbG9yYW50OyBqKyspIHsKLQotICAgICAgICAgICAgICAgIHNwcmludGYoQnVmZiwgIiUuM2YiLCBPdXRbal0gLyA2NTUzNS4wKTsKLSAgICAgICAgICAgICAgICBzdHJjYXQoQ29sb3JhbnQsIEJ1ZmYpOwotICAgICAgICAgICAgICAgIGlmIChqIDwgbkNvbG9yYW50IC0xKQotICAgICAgICAgICAgICAgICAgICAgICAgc3RyY2F0KENvbG9yYW50LCAiICIpOwotCi0gICAgICAgIH0KLX0KLQotCi0vLyBDcmVhdGVzIGEgUG9zdFNjcmlwdCBjb2xvciBsaXN0IGZyb20gYSBuYW1lZCBwcm9maWxlIGRhdGEuCi0vLyBUaGlzIGlzIGEgSFAgZXh0ZW5zaW9uLgotCi1zdGF0aWMKLWludCBXcml0ZU5hbWVkQ29sb3JDUkQoY21zSU9IQU5ETEVSKiBtLCBjbXNIUFJPRklMRSBoTmFtZWRDb2xvciwgaW50IEludGVudCwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpCi17Ci0gICAgY21zSFRSQU5TRk9STSB4Zm9ybTsKLSAgICBpbnQgaSwgbkNvbG9ycywgbkNvbG9yYW50OwotICAgIGNtc1VJbnQzMk51bWJlciBPdXRwdXRGb3JtYXQ7Ci0gICAgY2hhciBDb2xvck5hbWVbMzJdOwotICAgIGNoYXIgQ29sb3JhbnRbMTI4XTsKLSAgICBjbXNOQU1FRENPTE9STElTVCogTmFtZWRDb2xvckxpc3Q7Ci0KLQotICAgIE91dHB1dEZvcm1hdCA9IGNtc0Zvcm1hdHRlckZvckNvbG9yc3BhY2VPZlByb2ZpbGUoaE5hbWVkQ29sb3IsIDIsIEZBTFNFKTsKLSAgICBuQ29sb3JhbnQgICAgPSBUX0NIQU5ORUxTKE91dHB1dEZvcm1hdCk7Ci0KLQotICAgIHhmb3JtID0gY21zQ3JlYXRlVHJhbnNmb3JtKGhOYW1lZENvbG9yLCBUWVBFX05BTUVEX0NPTE9SX0lOREVYLCBOVUxMLCBPdXRwdXRGb3JtYXQsIEludGVudCwgZHdGbGFncyk7Ci0gICAgaWYgKHhmb3JtID09IE5VTEwpIHJldHVybiAwOwotCi0KLSAgICBOYW1lZENvbG9yTGlzdCA9IGNtc0dldE5hbWVkQ29sb3JMaXN0KHhmb3JtKTsKLSAgICBpZiAoTmFtZWRDb2xvckxpc3QgPT0gTlVMTCkgcmV0dXJuIDA7Ci0KLSAgICBfY21zSU9QcmludGYobSwgIjw8XG4iKTsKLSAgICBfY21zSU9QcmludGYobSwgIihjb2xvcmxpc3Rjb21tZW50KSAoJXMpIFxuIiwgIk5hbWVkIHByb2ZpbGUiKTsKLSAgICBfY21zSU9QcmludGYobSwgIihQcmVmaXgpIFsgKFBhbnRvbmUgKSAoUEFOVE9ORSApIF1cbiIpOwotICAgIF9jbXNJT1ByaW50ZihtLCAiKFN1ZmZpeCkgWyAoIENWKSAoIENWQykgKCBDKSBdXG4iKTsKLQotICAgIG5Db2xvcnMgICA9IGNtc05hbWVkQ29sb3JDb3VudChOYW1lZENvbG9yTGlzdCk7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG5Db2xvcnM7IGkrKykgewotCi0gICAgICAgIGNtc1VJbnQxNk51bWJlciBJblsxXTsKLSAgICAgICAgY21zVUludDE2TnVtYmVyIE91dFtjbXNNQVhDSEFOTkVMU107Ci0KLSAgICAgICAgSW5bMF0gPSAoY21zVUludDE2TnVtYmVyKSBpOwotCi0gICAgICAgIGlmICghY21zTmFtZWRDb2xvckluZm8oTmFtZWRDb2xvckxpc3QsIGksIENvbG9yTmFtZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCkpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgY21zRG9UcmFuc2Zvcm0oeGZvcm0sIEluLCBPdXQsIDEpOwotICAgICAgICBCdWlsZENvbG9yYW50TGlzdChDb2xvcmFudCwgbkNvbG9yYW50LCBPdXQpOwotICAgICAgICBfY21zSU9QcmludGYobSwgIiAgKCVzKSBbICVzIF1cbiIsIENvbG9yTmFtZSwgQ29sb3JhbnQpOwotICAgIH0KLQotICAgIF9jbXNJT1ByaW50ZihtLCAiICAgPj4iKTsKLQotICAgIGlmICghKGR3RmxhZ3MgJiBjbXNGTEFHU19OT0RFRkFVTFRSRVNPVVJDRURFRikpIHsKLQotICAgIF9jbXNJT1ByaW50ZihtLCAiIC9DdXJyZW50IGV4Y2ggL0hQU3BvdFRhYmxlIGRlZmluZXJlc291cmNlIHBvcFxuIik7Ci0gICAgfQotCi0gICAgY21zRGVsZXRlVHJhbnNmb3JtKHhmb3JtKTsKLSAgICByZXR1cm4gMTsKLX0KLQotCi0KLS8vIFRoaXMgb25lIGRvZXMgY3JlYXRlIGEgQ29sb3IgUmVuZGVyaW5nIERpY3Rpb25hcnkuCi0vLyBDUkQgYXJlIGFsd2F5cyBMVVQtQmFzZWQsIG5vIG1hdHRlciBpZiBwcm9maWxlIGlzCi0vLyBpbXBsZW1lbnRlZCBhcyBtYXRyaXgtc2hhcGVyLgotCi1zdGF0aWMKLWNtc1VJbnQzMk51bWJlciAgR2VuZXJhdGVDUkQoY21zQ29udGV4dCBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFIGhQcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW50ZW50LCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSU9IQU5ETEVSKiBtZW0pCi17Ci0gICAgY21zVUludDMyTnVtYmVyIGR3Qnl0ZXNVc2VkOwotCi0gICAgaWYgKCEoZHdGbGFncyAmIGNtc0ZMQUdTX05PREVGQVVMVFJFU09VUkNFREVGKSkgewotCi0gICAgICAgIEVtaXRIZWFkZXIobWVtLCAiQ29sb3IgUmVuZGVyaW5nIERpY3Rpb25hcnkgKENSRCkiLCBoUHJvZmlsZSk7Ci0gICAgfQotCi0KLSAgICAvLyBJcyBhIG5hbWVkIGNvbG9yIHByb2ZpbGU/Ci0gICAgaWYgKGNtc0dldERldmljZUNsYXNzKGhQcm9maWxlKSA9PSBjbXNTaWdOYW1lZENvbG9yQ2xhc3MpIHsKLQotICAgICAgICBpZiAoIVdyaXRlTmFtZWRDb2xvckNSRChtZW0sIGhQcm9maWxlLCBJbnRlbnQsIGR3RmxhZ3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLQotICAgICAgICAvLyBDUkQgYXJlIGFsd2F5cyBpbXBsZW1lbnRlZCBhcyBMVVQKLQotICAgICAgICBpZiAoIVdyaXRlT3V0cHV0TFVUKG1lbSwgaFByb2ZpbGUsIEludGVudCwgZHdGbGFncykpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCEoZHdGbGFncyAmIGNtc0ZMQUdTX05PREVGQVVMVFJFU09VUkNFREVGKSkgewotCi0gICAgICAgIF9jbXNJT1ByaW50ZihtZW0sICIlJSUlRW5kUmVzb3VyY2VcbiIpOwotICAgICAgICBfY21zSU9QcmludGYobWVtLCAiXG4lJSBDUkQgRW5kXG4iKTsKLSAgICB9Ci0KLSAgICAvLyBEb25lLCBrZWVwIG1lbW9yeSB1c2FnZQotICAgIGR3Qnl0ZXNVc2VkID0gbWVtIC0+VXNlZFNwYWNlOwotCi0gICAgLy8gRmluYWxseSwgcmV0dXJuIHVzZWQgYnl0ZSBjb3VudAotICAgIHJldHVybiBkd0J5dGVzVXNlZDsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoQ29udGV4dElEKTsKLX0KLQotCi0KLQotY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNHZXRQb3N0U2NyaXB0Q29sb3JSZXNvdXJjZShjbXNDb250ZXh0IENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1BTUmVzb3VyY2VUeXBlIFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSBoUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0lPSEFORExFUiogaW8pCi17Ci0gICAgY21zVUludDMyTnVtYmVyICByYzsKLQotCi0gICAgc3dpdGNoIChUeXBlKSB7Ci0KLSAgICAgICAgY2FzZSBjbXNQU19SRVNPVVJDRV9DU0E6Ci0gICAgICAgICAgICByYyA9IEdlbmVyYXRlQ1NBKENvbnRleHRJRCwgaFByb2ZpbGUsIEludGVudCwgZHdGbGFncywgaW8pOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgY2FzZSBjbXNQU19SRVNPVVJDRV9DUkQ6Ci0gICAgICAgICAgICByYyA9IEdlbmVyYXRlQ1JEKENvbnRleHRJRCwgaFByb2ZpbGUsIEludGVudCwgZHdGbGFncywgaW8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJjOwotfQotCi0KLQotY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNHZXRQb3N0U2NyaXB0Q1JEKGNtc0NvbnRleHQgQ29udGV4dElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgaFByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW50ZW50LCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIEJ1ZmZlciwgY21zVUludDMyTnVtYmVyIGR3QnVmZmVyTGVuKQotewotICAgIGNtc0lPSEFORExFUiogbWVtOwotICAgIGNtc1VJbnQzMk51bWJlciBkd0J5dGVzVXNlZDsKLQotICAgIC8vIFNldCB1cCB0aGUgc2VyaWFsaXphdGlvbiBlbmdpbmUKLSAgICBpZiAoQnVmZmVyID09IE5VTEwpCi0gICAgICAgIG1lbSA9IGNtc09wZW5JT2hhbmRsZXJGcm9tTlVMTChDb250ZXh0SUQpOwotICAgIGVsc2UKLSAgICAgICAgbWVtID0gY21zT3BlbklPaGFuZGxlckZyb21NZW0oQ29udGV4dElELCBCdWZmZXIsIGR3QnVmZmVyTGVuLCAidyIpOwotCi0gICAgaWYgKCFtZW0pIHJldHVybiAwOwotCi0gICAgZHdCeXRlc1VzZWQgPSAgY21zR2V0UG9zdFNjcmlwdENvbG9yUmVzb3VyY2UoQ29udGV4dElELCBjbXNQU19SRVNPVVJDRV9DUkQsIGhQcm9maWxlLCBJbnRlbnQsIGR3RmxhZ3MsIG1lbSk7Ci0KLSAgICAvLyBHZXQgcmlkIG9mIG1lbW9yeSBzdHJlYW0KLSAgICBjbXNDbG9zZUlPaGFuZGxlcihtZW0pOwotCi0gICAgcmV0dXJuIGR3Qnl0ZXNVc2VkOwotfQotCi0KLQotLy8gRG9lcyBjcmVhdGUgYSBDb2xvciBTcGFjZSBBcnJheSBvbiBYWVogY29sb3JzcGFjZSBmb3IgUG9zdFNjcmlwdCB1c2FnZQotY21zVUludDMyTnVtYmVyIENNU0VYUE9SVCBjbXNHZXRQb3N0U2NyaXB0Q1NBKGNtc0NvbnRleHQgQ29udGV4dElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFIGhQcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBkd0J1ZmZlckxlbikKLXsKLSAgICBjbXNJT0hBTkRMRVIqIG1lbTsKLSAgICBjbXNVSW50MzJOdW1iZXIgZHdCeXRlc1VzZWQ7Ci0KLSAgICBpZiAoQnVmZmVyID09IE5VTEwpCi0gICAgICAgIG1lbSA9IGNtc09wZW5JT2hhbmRsZXJGcm9tTlVMTChDb250ZXh0SUQpOwotICAgIGVsc2UKLSAgICAgICAgbWVtID0gY21zT3BlbklPaGFuZGxlckZyb21NZW0oQ29udGV4dElELCBCdWZmZXIsIGR3QnVmZmVyTGVuLCAidyIpOwotCi0gICAgaWYgKCFtZW0pIHJldHVybiAwOwotCi0gICAgZHdCeXRlc1VzZWQgPSAgY21zR2V0UG9zdFNjcmlwdENvbG9yUmVzb3VyY2UoQ29udGV4dElELCBjbXNQU19SRVNPVVJDRV9DU0EsIGhQcm9maWxlLCBJbnRlbnQsIGR3RmxhZ3MsIG1lbSk7Ci0KLSAgICAvLyBHZXQgcmlkIG9mIG1lbW9yeSBzdHJlYW0KLSAgICBjbXNDbG9zZUlPaGFuZGxlcihtZW0pOwotCi0gICAgcmV0dXJuIGR3Qnl0ZXNVc2VkOwotCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3NhbXAuYyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zc2FtcC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGU0NjkxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zc2FtcC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTcyICswLDAgQEAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDEwIE1hcnRpIE1hcmlhIFNhZ3VlcgotLy8KLS8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCi0vLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKLS8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0vLwotLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLS8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotLy8KLS8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAotLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCi0vLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQotLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgotLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLQotI2luY2x1ZGUgImxjbXMyX2ludGVybmFsLmgiCi0KLQotI2RlZmluZSBjbXNtaW4oYSwgYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQotI2RlZmluZSBjbXNtYXgoYSwgYikgKCgoYSkgPiAoYikpID8gKGEpIDogKGIpKQotCi0vLyBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgZm9yIHJlc2FtcGxpbmcgYW5kIExVVCBvcHRpbWl6YXRpb24sIGJsYWNrIHBvaW50IGRldGVjdGlvbgotLy8gYW5kIGJsYWNrIHByZXNlcnZhdGlvbi4KLQotLy8gQmxhY2sgcG9pbnQgZGV0ZWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0vLyBQQ1MgLT4gUENTIHJvdW5kIHRyaXAgdHJhbnNmb3JtLCBhbHdheXMgdXNlcyByZWxhdGl2ZSBpbnRlbnQgb24gdGhlIGRldmljZSAtPiBwY3MKLXN0YXRpYwotY21zSFRSQU5TRk9STSBDcmVhdGVSb3VuZHRyaXBYRm9ybShjbXNIUFJPRklMRSBoUHJvZmlsZSwgY21zVUludDMyTnVtYmVyIG5JbnRlbnQpCi17Ci0gICAgY21zQ29udGV4dCBDb250ZXh0SUQgPSBjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKTsKLSAgICBjbXNIUFJPRklMRSBoTGFiID0gY21zQ3JlYXRlTGFiNFByb2ZpbGVUSFIoQ29udGV4dElELCBOVUxMKTsKLSAgICBjbXNIVFJBTlNGT1JNIHhmb3JtOwotICAgIGNtc0Jvb2wgQlBDWzRdID0geyBGQUxTRSwgRkFMU0UsIEZBTFNFLCBGQUxTRSB9OwotICAgIGNtc0Zsb2F0NjROdW1iZXIgU3RhdGVzWzRdID0geyAxLjAsIDEuMCwgMS4wLCAxLjAgfTsKLSAgICBjbXNIUFJPRklMRSBoUHJvZmlsZXNbNF07Ci0gICAgY21zVUludDMyTnVtYmVyIEludGVudHNbNF07Ci0KLSAgICBoUHJvZmlsZXNbMF0gPSBoTGFiOyBoUHJvZmlsZXNbMV0gPSBoUHJvZmlsZTsgaFByb2ZpbGVzWzJdID0gaFByb2ZpbGU7IGhQcm9maWxlc1szXSA9IGhMYWI7Ci0gICAgSW50ZW50c1swXSAgID0gSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQzsgSW50ZW50c1sxXSA9IG5JbnRlbnQ7IEludGVudHNbMl0gPSBJTlRFTlRfUkVMQVRJVkVfQ09MT1JJTUVUUklDOyBJbnRlbnRzWzNdID0gSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQzsKLQotICAgIHhmb3JtID0gIGNtc0NyZWF0ZUV4dGVuZGVkVHJhbnNmb3JtKENvbnRleHRJRCwgNCwgaFByb2ZpbGVzLCBCUEMsIEludGVudHMsCi0gICAgICAgIFN0YXRlcywgTlVMTCwgMCwgVFlQRV9MYWJfREJMLCBUWVBFX0xhYl9EQkwsIGNtc0ZMQUdTX05PQ0FDSEV8Y21zRkxBR1NfTk9PUFRJTUlaRSk7Ci0KLSAgICBjbXNDbG9zZVByb2ZpbGUoaExhYik7Ci0gICAgcmV0dXJuIHhmb3JtOwotfQotCi0vLyBVc2UgZGFya2VyIGNvbG9yYW50cyB0byBvYnRhaW4gYmxhY2sgcG9pbnQuIFRoaXMgd29ya3MgaW4gdGhlIHJlbGF0aXZlIGNvbG9yaW1ldHJpYyBpbnRlbnQgYW5kCi0vLyBhc3N1bWVzIG1vcmUgaW5rIHJlc3VsdHMgaW4gZGFya2VyIGNvbG9ycy4gTm8gaW5rIGxpbWl0IGlzIGFzc3VtZWQuCi1zdGF0aWMKLWNtc0Jvb2wgIEJsYWNrUG9pbnRBc0RhcmtlckNvbG9yYW50KGNtc0hQUk9GSUxFICAgIGhJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNDSUVYWVoqIEJsYWNrUG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKLXsKLSAgICBjbXNVSW50MTZOdW1iZXIgKkJsYWNrOwotICAgIGNtc0hUUkFOU0ZPUk0geGZvcm07Ci0gICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBTcGFjZTsKLSAgICBjbXNVSW50MzJOdW1iZXIgbkNoYW5uZWxzOwotICAgIGNtc1VJbnQzMk51bWJlciBkd0Zvcm1hdDsKLSAgICBjbXNIUFJPRklMRSBoTGFiOwotICAgIGNtc0NJRUxhYiAgTGFiOwotICAgIGNtc0NJRVhZWiAgQmxhY2tYWVo7Ci0gICAgY21zQ29udGV4dCBDb250ZXh0SUQgPSBjbXNHZXRQcm9maWxlQ29udGV4dElEKGhJbnB1dCk7Ci0KLSAgICAvLyBJZiB0aGUgcHJvZmlsZSBkb2VzIG5vdCBzdXBwb3J0IGlucHV0IGRpcmVjdGlvbiwgYXNzdW1lIEJsYWNrIHBvaW50IDAKLSAgICBpZiAoIWNtc0lzSW50ZW50U3VwcG9ydGVkKGhJbnB1dCwgSW50ZW50LCBMQ01TX1VTRURfQVNfSU5QVVQpKSB7Ci0KLSAgICAgICAgQmxhY2tQb2ludCAtPiBYID0gQmxhY2tQb2ludCAtPlkgPSBCbGFja1BvaW50IC0+IFogPSAwLjA7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgYSBmb3JtYXR0ZXIgd2hpY2ggaGFzIG4gY2hhbm5lbHMgYW5kIGZsb2F0aW5nIHBvaW50Ci0gICAgZHdGb3JtYXQgPSBjbXNGb3JtYXR0ZXJGb3JDb2xvcnNwYWNlT2ZQcm9maWxlKGhJbnB1dCwgMiwgRkFMU0UpOwotCi0gICAvLyBUcnkgdG8gZ2V0IGJsYWNrIGJ5IHVzaW5nIGJsYWNrIGNvbG9yYW50Ci0gICAgU3BhY2UgPSBjbXNHZXRDb2xvclNwYWNlKGhJbnB1dCk7Ci0KLSAgICAvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgZGFya2VyIGNvbG9yYW50IGluIDE2IGJpdHMgZm9yIHNldmVyYWwgc3BhY2VzCi0gICAgaWYgKCFfY21zRW5kUG9pbnRzQnlTcGFjZShTcGFjZSwgTlVMTCwgJkJsYWNrLCAmbkNoYW5uZWxzKSkgewotCi0gICAgICAgIEJsYWNrUG9pbnQgLT4gWCA9IEJsYWNrUG9pbnQgLT5ZID0gQmxhY2tQb2ludCAtPiBaID0gMC4wOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKG5DaGFubmVscyAhPSBUX0NIQU5ORUxTKGR3Rm9ybWF0KSkgewotICAgICAgIEJsYWNrUG9pbnQgLT4gWCA9IEJsYWNrUG9pbnQgLT5ZID0gQmxhY2tQb2ludCAtPiBaID0gMC4wOwotICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICAvLyBMYWIgd2lsbCBiZSB1c2VkIGFzIHRoZSBvdXRwdXQgc3BhY2UsIGJ1dCBsYWIyIHdpbGwgYXZvaWQgcmVjdXJzaW9uCi0gICAgaExhYiA9IGNtc0NyZWF0ZUxhYjJQcm9maWxlVEhSKENvbnRleHRJRCwgTlVMTCk7Ci0gICAgaWYgKGhMYWIgPT0gTlVMTCkgewotICAgICAgIEJsYWNrUG9pbnQgLT4gWCA9IEJsYWNrUG9pbnQgLT5ZID0gQmxhY2tQb2ludCAtPiBaID0gMC4wOwotICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgdGhlIHRyYW5zZm9ybQotICAgIHhmb3JtID0gY21zQ3JlYXRlVHJhbnNmb3JtVEhSKENvbnRleHRJRCwgaElucHV0LCBkd0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaExhYiwgVFlQRV9MYWJfREJMLCBJbnRlbnQsIGNtc0ZMQUdTX05PT1BUSU1JWkV8Y21zRkxBR1NfTk9DQUNIRSk7Ci0gICAgY21zQ2xvc2VQcm9maWxlKGhMYWIpOwotCi0gICAgaWYgKHhmb3JtID09IE5VTEwpIHsKLQotICAgICAgICAvLyBTb21ldGhpbmcgd2VudCB3cm9uZy4gR2V0IHJpZCBvZiBvcGVuIHJlc291cmNlcyBhbmQgcmV0dXJuIHplcm8gYXMgYmxhY2sKLSAgICAgICAgQmxhY2tQb2ludCAtPiBYID0gQmxhY2tQb2ludCAtPlkgPSBCbGFja1BvaW50IC0+IFogPSAwLjA7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICAvLyBDb252ZXJ0IGJsYWNrIHRvIExhYgotICAgIGNtc0RvVHJhbnNmb3JtKHhmb3JtLCBCbGFjaywgJkxhYiwgMSk7Ci0KLSAgICAvLyBGb3JjZSBpdCB0byBiZSBuZXV0cmFsLCBjbGlwIHRvIG1heC4gTCogb2YgNTAKLSAgICBMYWIuYSA9IExhYi5iID0gMDsKLSAgICBpZiAoTGFiLkwgPiA1MCkgTGFiLkwgPSA1MDsKLQotICAgIC8vIEZyZWUgdGhlIHJlc291cmNlcwotICAgIGNtc0RlbGV0ZVRyYW5zZm9ybSh4Zm9ybSk7Ci0KLSAgICAvLyBDb252ZXJ0IGZyb20gTGFiICh3aGljaCBpcyBub3cgY2xpcHBlZCkgdG8gWFlaLgotICAgIGNtc0xhYjJYWVooTlVMTCwgJkJsYWNrWFlaLCAmTGFiKTsKLQotICAgIGlmIChCbGFja1BvaW50ICE9IE5VTEwpCi0gICAgICAgICpCbGFja1BvaW50ID0gQmxhY2tYWVo7Ci0KLSAgICByZXR1cm4gVFJVRTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoZHdGbGFncyk7Ci19Ci0KLS8vIEdldCBhIGJsYWNrIHBvaW50IG9mIG91dHB1dCBDTVlLIHByb2ZpbGUsIGRpc2NvdW50aW5nIGFueSBpbmstbGltaXRpbmcgZW1iZWRkZWQKLS8vIGluIHRoZSBwcm9maWxlLiBGb3IgZG9pbmcgdGhhdCwgd2UgdXNlIHBlcmNlcHR1YWwgaW50ZW50IGluIGlucHV0IGRpcmVjdGlvbjoKLS8vIExhYiAoMCwgMCwgMCkgLT4gW1BlcmNlcHR1YWxdIFByb2ZpbGUgLT4gQ01ZSyAtPiBbUmVsLiBjb2xvcmltZXRyaWNdIFByb2ZpbGUgLT4gTGFiCi1zdGF0aWMKLWNtc0Jvb2wgQmxhY2tQb2ludFVzaW5nUGVyY2VwdHVhbEJsYWNrKGNtc0NJRVhZWiogQmxhY2tQb2ludCwgY21zSFBST0ZJTEUgaFByb2ZpbGUpCi17Ci0gICAgY21zSFRSQU5TRk9STSBoUm91bmRUcmlwOwotICAgIGNtc0NJRUxhYiBMYWJJbiwgTGFiT3V0OwotICAgIGNtc0NJRVhZWiAgQmxhY2tYWVo7Ci0KLSAgICAgLy8gSXMgdGhlIGludGVudCBzdXBwb3J0ZWQgYnkgdGhlIHByb2ZpbGU/Ci0gICAgaWYgKCFjbXNJc0ludGVudFN1cHBvcnRlZChoUHJvZmlsZSwgSU5URU5UX1BFUkNFUFRVQUwsIExDTVNfVVNFRF9BU19JTlBVVCkpIHsKLQotICAgICAgICBCbGFja1BvaW50IC0+IFggPSBCbGFja1BvaW50IC0+WSA9IEJsYWNrUG9pbnQgLT4gWiA9IDAuMDsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgaFJvdW5kVHJpcCA9IENyZWF0ZVJvdW5kdHJpcFhGb3JtKGhQcm9maWxlLCBJTlRFTlRfUEVSQ0VQVFVBTCk7Ci0gICAgaWYgKGhSb3VuZFRyaXAgPT0gTlVMTCkgewotICAgICAgICBCbGFja1BvaW50IC0+IFggPSBCbGFja1BvaW50IC0+WSA9IEJsYWNrUG9pbnQgLT4gWiA9IDAuMDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIExhYkluLkwgPSBMYWJJbi5hID0gTGFiSW4uYiA9IDA7Ci0gICAgY21zRG9UcmFuc2Zvcm0oaFJvdW5kVHJpcCwgJkxhYkluLCAmTGFiT3V0LCAxKTsKLQotICAgIC8vIENsaXAgTGFiIHRvIHJlYXNvbmFibGUgbGltaXRzCi0gICAgaWYgKExhYk91dC5MID4gNTApIExhYk91dC5MID0gNTA7Ci0gICAgTGFiT3V0LmEgPSBMYWJPdXQuYiA9IDA7Ci0KLSAgICBjbXNEZWxldGVUcmFuc2Zvcm0oaFJvdW5kVHJpcCk7Ci0KLSAgICAvLyBDb252ZXJ0IGl0IHRvIFhZWgotICAgIGNtc0xhYjJYWVooTlVMTCwgJkJsYWNrWFlaLCAmTGFiT3V0KTsKLQotICAgIGlmIChCbGFja1BvaW50ICE9IE5VTEwpCi0gICAgICAgICpCbGFja1BvaW50ID0gQmxhY2tYWVo7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLy8gVGhpcyBmdW5jdGlvbiBzaG91bGRuJ3QgZXhpc3QgYXQgYWxsIC0tIHRoZXJlIGlzIHN1Y2ggcXVhbnRpdHkgb2YgYnJva2VuCi0vLyBwcm9maWxlcyBvbiBibGFjayBwb2ludCB0YWcsIHRoYXQgd2UgbXVzdCBzb21laG93IGZpeCBjaHJvbWF0aWNpdHkgdG8KLS8vIGF2b2lkIGh1Z2UgdGludCB3aGVuIGRvaW5nIEJsYWNrIHBvaW50IGNvbXBlbnNhdGlvbi4gVGhpcyBmdW5jdGlvbiBkb2VzCi0vLyBqdXN0IHRoYXQuIFRoZXJlIGlzIGEgc3BlY2lhbCBmbGFnIGZvciB1c2luZyBibGFjayBwb2ludCB0YWcsIGJ1dCB0dXJuZWQKLS8vIG9mZiBieSBkZWZhdWx0IGJlY2F1c2UgaXQgaXMgYm9ndXMgb24gbW9zdCBwcm9maWxlcy4gVGhlIGRldGVjdGlvbiBhbGdvcml0aG0KLS8vIGludm9sdmVzIHRvIHR1cm4gQlAgdG8gbmV1dHJhbCBhbmQgdG8gdXNlIG9ubHkgTCBjb21wb25lbnQuCi1jbXNCb29sIENNU0VYUE9SVCBjbXNEZXRlY3RCbGFja1BvaW50KGNtc0NJRVhZWiogQmxhY2tQb2ludCwgY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKQotewotICAgIGNtc1Byb2ZpbGVDbGFzc1NpZ25hdHVyZSBkZXZDbGFzczsKLQotICAgIC8vIE1ha2Ugc3VyZSB0aGUgZGV2aWNlIGNsYXNzIGlzIGFkZXF1YXRlCi0gICAgZGV2Q2xhc3MgPSBjbXNHZXREZXZpY2VDbGFzcyhoUHJvZmlsZSk7Ci0gICAgaWYgKGRldkNsYXNzID09IGNtc1NpZ0xpbmtDbGFzcyB8fAotICAgICAgICBkZXZDbGFzcyA9PSBjbXNTaWdBYnN0cmFjdENsYXNzIHx8Ci0gICAgICAgIGRldkNsYXNzID09IGNtc1NpZ05hbWVkQ29sb3JDbGFzcykgewotICAgICAgICAgICAgQmxhY2tQb2ludCAtPiBYID0gQmxhY2tQb2ludCAtPlkgPSBCbGFja1BvaW50IC0+IFogPSAwLjA7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgLy8gTWFrZSBzdXJlIGludGVudCBpcyBhZGVxdWF0ZQotICAgIGlmIChJbnRlbnQgIT0gSU5URU5UX1BFUkNFUFRVQUwgJiYKLSAgICAgICAgSW50ZW50ICE9IElOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUMgJiYKLSAgICAgICAgSW50ZW50ICE9IElOVEVOVF9TQVRVUkFUSU9OKSB7Ci0gICAgICAgICAgICBCbGFja1BvaW50IC0+IFggPSBCbGFja1BvaW50IC0+WSA9IEJsYWNrUG9pbnQgLT4gWiA9IDAuMDsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICAvLyB2NCArIHBlcmNlcHR1YWwgJiBzYXR1cmF0aW9uIGludGVudHMgZG9lcyBoYXZlIGl0cyBvd24gYmxhY2sgcG9pbnQsIGFuZCBpdCBpcwotICAgIC8vIHdlbGwgc3BlY2lmaWVkIGVub3VnaCB0byB1c2UgaXQuIEJsYWNrIHBvaW50IHRhZyBpcyBkZXByZWNhdGVkIGluIFY0LgotICAgIGlmICgoY21zR2V0RW5jb2RlZElDQ3ZlcnNpb24oaFByb2ZpbGUpID49IDB4NDAwMDAwMCkgJiYKLSAgICAgICAgKEludGVudCA9PSBJTlRFTlRfUEVSQ0VQVFVBTCB8fCBJbnRlbnQgPT0gSU5URU5UX1NBVFVSQVRJT04pKSB7Ci0KLSAgICAgICAgICAgIC8vIE1hdHJpeCBzaGFwZXIgc2hhcmUgTVJDICYgcGVyY2VwdHVhbCBpbnRlbnRzCi0gICAgICAgICAgICBpZiAoY21zSXNNYXRyaXhTaGFwZXIoaFByb2ZpbGUpKQotICAgICAgICAgICAgICAgIHJldHVybiBCbGFja1BvaW50QXNEYXJrZXJDb2xvcmFudChoUHJvZmlsZSwgSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQywgQmxhY2tQb2ludCwgMCk7Ci0KLSAgICAgICAgICAgIC8vIEdldCBQZXJjZXB0dWFsIGJsYWNrIG91dCBvZiB2NCBwcm9maWxlcy4gVGhhdCBpcyBmaXhlZCBmb3IgcGVyY2VwdHVhbCAmIHNhdHVyYXRpb24gaW50ZW50cwotICAgICAgICAgICAgQmxhY2tQb2ludCAtPiBYID0gY21zUEVSQ0VQVFVBTF9CTEFDS19YOwotICAgICAgICAgICAgQmxhY2tQb2ludCAtPiBZID0gY21zUEVSQ0VQVFVBTF9CTEFDS19ZOwotICAgICAgICAgICAgQmxhY2tQb2ludCAtPiBaID0gY21zUEVSQ0VQVFVBTF9CTEFDS19aOwotCi0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLQotI2lmZGVmIENNU19VU0VfUFJPRklMRV9CTEFDS19QT0lOVF9UQUcKLQotICAgIC8vIHYyLCB2NCByZWwvYWJzIGNvbG9yaW1ldHJpYwotICAgIGlmIChjbXNJc1RhZyhoUHJvZmlsZSwgY21zU2lnTWVkaWFCbGFja1BvaW50VGFnKSAmJgotICAgICAgICBJbnRlbnQgPT0gSU5URU5UX1JFTEFUSVZFX0NPTE9SSU1FVFJJQykgewotCi0gICAgICAgICAgICBjbXNDSUVYWVogKkJsYWNrUHRyLCBCbGFja1hZWiwgVW50cnVzdGVkQmxhY2tQb2ludCwgVHJ1c3RlZEJsYWNrUG9pbnQsIE1lZGlhV2hpdGU7Ci0gICAgICAgICAgICBjbXNDSUVMYWIgTGFiOwotCi0gICAgICAgICAgICAvLyBJZiBibGFjayBwb2ludCBpcyBzcGVjaWZpZWQsIHRoZW4gdXNlIGl0LAotCi0gICAgICAgICAgICBCbGFja1B0ciA9IGNtc1JlYWRUYWcoaFByb2ZpbGUsIGNtc1NpZ01lZGlhQmxhY2tQb2ludFRhZyk7Ci0gICAgICAgICAgICBpZiAoQmxhY2tQdHIgIT0gTlVMTCkgewotCi0gICAgICAgICAgICAgICAgQmxhY2tYWVogPSAqQmxhY2tQdHI7Ci0gICAgICAgICAgICAgICAgX2Ntc1JlYWRNZWRpYVdoaXRlUG9pbnQoJk1lZGlhV2hpdGUsIGhQcm9maWxlKTsKLQotICAgICAgICAgICAgICAgIC8vIEJsYWNrIHBvaW50IGlzIGFic29sdXRlIFhZWiwgc28gYWRhcHQgdG8gRDUwIHRvIGdldCBQQ1MgdmFsdWUKLSAgICAgICAgICAgICAgICBjbXNBZGFwdFRvSWxsdW1pbmFudCgmVW50cnVzdGVkQmxhY2tQb2ludCwgJk1lZGlhV2hpdGUsIGNtc0Q1MF9YWVooKSwgJkJsYWNrWFlaKTsKLQotICAgICAgICAgICAgICAgIC8vIEZvcmNlIGE9Yj0wIHRvIGdldCByaWQgb2YgYW55IGNocm9tYQotICAgICAgICAgICAgICAgIGNtc1hZWjJMYWIoTlVMTCwgJkxhYiwgJlVudHJ1c3RlZEJsYWNrUG9pbnQpOwotICAgICAgICAgICAgICAgIExhYi5hID0gTGFiLmIgPSAwOwotICAgICAgICAgICAgICAgIGlmIChMYWIuTCA+IDUwKSBMYWIuTCA9IDUwOyAvLyBDbGlwIHRvIEwqIDw9IDUwCi0gICAgICAgICAgICAgICAgY21zTGFiMlhZWihOVUxMLCAmVHJ1c3RlZEJsYWNrUG9pbnQsICZMYWIpOwotCi0gICAgICAgICAgICAgICAgaWYgKEJsYWNrUG9pbnQgIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgKkJsYWNrUG9pbnQgPSBUcnVzdGVkQmxhY2tQb2ludDsKLQotICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICAgICAgfQotICAgIH0KLSNlbmRpZgotCi0gICAgLy8gVGhhdCBpcyBhYm91dCB2MiBwcm9maWxlcy4KLQotICAgIC8vIElmIG91dHB1dCBwcm9maWxlLCBkaXNjb3VudCBpbmstbGltaXRpbmcgYW5kIHRoYXQncyBhbGwKLSAgICBpZiAoSW50ZW50ID09IElOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUMgJiYKLSAgICAgICAgKGNtc0dldERldmljZUNsYXNzKGhQcm9maWxlKSA9PSBjbXNTaWdPdXRwdXRDbGFzcykgJiYKLSAgICAgICAgKGNtc0dldENvbG9yU3BhY2UoaFByb2ZpbGUpICA9PSBjbXNTaWdDbXlrRGF0YSkpCi0gICAgICAgIHJldHVybiBCbGFja1BvaW50VXNpbmdQZXJjZXB0dWFsQmxhY2soQmxhY2tQb2ludCwgaFByb2ZpbGUpOwotCi0gICAgLy8gTm9wZSwgY29tcHV0ZSBCUCB1c2luZyBjdXJyZW50IGludGVudC4KLSAgICByZXR1cm4gQmxhY2tQb2ludEFzRGFya2VyQ29sb3JhbnQoaFByb2ZpbGUsIEludGVudCwgQmxhY2tQb2ludCwgZHdGbGFncyk7Ci19Ci0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gTGVhc3QgU3F1YXJlcyBGaXQgb2YgYSBRdWFkcmF0aWMgQ3VydmUgdG8gRGF0YQotLy8gaHR0cDovL3d3dy5wZXJzb25hbC5wc3UuZWR1L2pobS9mOTAvbGVjdHVyZXMvbHNxMi5odG1sCi0KLXN0YXRpYwotY21zRmxvYXQ2NE51bWJlciBSb290T2ZMZWFzdFNxdWFyZXNGaXRRdWFkcmF0aWNDdXJ2ZShpbnQgbiwgY21zRmxvYXQ2NE51bWJlciB4W10sIGNtc0Zsb2F0NjROdW1iZXIgeVtdKQotewotICAgIGRvdWJsZSBzdW1feCA9IDAsIHN1bV94MiA9IDAsIHN1bV94MyA9IDAsIHN1bV94NCA9IDA7Ci0gICAgZG91YmxlIHN1bV95ID0gMCwgc3VtX3l4ID0gMCwgc3VtX3l4MiA9IDA7Ci0gICAgZG91YmxlIGQsIGEsIGIsIGM7Ci0gICAgaW50IGk7Ci0gICAgY21zTUFUMyBtOwotICAgIGNtc1ZFQzMgdiwgcmVzOwotCi0gICAgaWYgKG4gPCA0KSByZXR1cm4gMDsKLQotICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7Ci0KLSAgICAgICAgZG91YmxlIHhuID0geFtpXTsKLSAgICAgICAgZG91YmxlIHluID0geVtpXTsKLQotICAgICAgICBzdW1feCAgKz0geG47Ci0gICAgICAgIHN1bV94MiArPSB4bip4bjsKLSAgICAgICAgc3VtX3gzICs9IHhuKnhuKnhuOwotICAgICAgICBzdW1feDQgKz0geG4qeG4qeG4qeG47Ci0KLSAgICAgICAgc3VtX3kgKz0geW47Ci0gICAgICAgIHN1bV95eCArPSB5bip4bjsKLSAgICAgICAgc3VtX3l4MiArPSB5bip4bip4bjsKLSAgICB9Ci0KLSAgICBfY21zVkVDM2luaXQoJm0udlswXSwgbiwgICAgICBzdW1feCwgIHN1bV94Mik7Ci0gICAgX2Ntc1ZFQzNpbml0KCZtLnZbMV0sIHN1bV94LCAgc3VtX3gyLCBzdW1feDMpOwotICAgIF9jbXNWRUMzaW5pdCgmbS52WzJdLCBzdW1feDIsIHN1bV94Mywgc3VtX3g0KTsKLQotICAgIF9jbXNWRUMzaW5pdCgmdiwgc3VtX3ksIHN1bV95eCwgc3VtX3l4Mik7Ci0KLSAgICBpZiAoIV9jbXNNQVQzc29sdmUoJnJlcywgJm0sICZ2KSkgcmV0dXJuIDA7Ci0KLSAgICAgIAotICAgIGEgPSByZXMublsyXTsKLSAgICBiID0gcmVzLm5bMV07Ci0gICAgYyA9IHJlcy5uWzBdOwotCi0gICAgaWYgKGZhYnMoYSkgPCAxLjBFLTEwKSB7Ci0gICAgCi0gICAgICAgIHJldHVybiBjbXNtaW4oMCwgY21zbWF4KDUwLCAtYy9iICkpOwotICAgIH0KLSAgICBlbHNlIHsKLQotICAgICAgICAgZCA9IGIqYiAtIDQuMCAqIGEgKiBjOwotICAgICAgICAgaWYgKGQgPD0gMCkgewotICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgfQotICAgICAgICAgZWxzZSB7Ci0KLSAgICAgICAgICAgICBkb3VibGUgcnQgPSAoLWIgKyBzcXJ0KGQpKSAvICgyLjAgKiBhKTsKLQotICAgICAgICAgICAgIHJldHVybiBjbXNtYXgoMCwgY21zbWluKDUwLCBydCkpOwotICAgICAgICAgfQotICAgfQotCi19Ci0KLS8qCi1zdGF0aWMKLWNtc0Jvb2wgSXNNb25vdG9uaWMoaW50IG4sIGNvbnN0IGNtc0Zsb2F0NjROdW1iZXIgVGFibGVbXSkKLXsKLSAgICBpbnQgaTsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIGxhc3Q7Ci0KLSAgICBsYXN0ID0gVGFibGVbbi0xXTsKLQotICAgIGZvciAoaSA9IG4tMjsgaSA+PSAwOyAtLWkpIHsKLQotICAgICAgICBpZiAoVGFibGVbaV0gPiBsYXN0KQotCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGxhc3QgPSBUYWJsZVtpXTsKLQotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotKi8KLQotLy8gQ2FsY3VsYXRlcyB0aGUgYmxhY2sgcG9pbnQgb2YgYSBkZXN0aW5hdGlvbiBwcm9maWxlLgotLy8gVGhpcyBhbGdvcml0aG0gY29tZXMgZnJvbSB0aGUgQWRvYmUgcGFwZXIgZGlzY2xvc2luZyBpdHMgYmxhY2sgcG9pbnQgY29tcGVuc2F0aW9uIG1ldGhvZC4KLWNtc0Jvb2wgQ01TRVhQT1JUIGNtc0RldGVjdERlc3RpbmF0aW9uQmxhY2tQb2ludChjbXNDSUVYWVoqIEJsYWNrUG9pbnQsIGNtc0hQUk9GSUxFIGhQcm9maWxlLCBjbXNVSW50MzJOdW1iZXIgSW50ZW50LCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKLXsKLSAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2U7Ci0gICAgY21zSFRSQU5TRk9STSBoUm91bmRUcmlwID0gTlVMTDsKLSAgICBjbXNDSUVMYWIgSW5pdGlhbExhYiwgZGVzdExhYiwgTGFiOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgaW5SYW1wWzI1Nl0sIG91dFJhbXBbMjU2XTsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIE1pbkwsIE1heEw7Ci0gICAgY21zQm9vbCBOZWFybHlTdHJhaWdodE1pZHJhbmdlID0gVFJVRTsgIAotICAgIGNtc0Zsb2F0NjROdW1iZXIgeVJhbXBbMjU2XTsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIHhbMjU2XSwgeVsyNTZdOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgbG8sIGhpOwotICAgIGludCBuLCBsOwotICAgIGNtc1Byb2ZpbGVDbGFzc1NpZ25hdHVyZSBkZXZDbGFzczsKLQotICAgIC8vIE1ha2Ugc3VyZSB0aGUgZGV2aWNlIGNsYXNzIGlzIGFkZXF1YXRlCi0gICAgZGV2Q2xhc3MgPSBjbXNHZXREZXZpY2VDbGFzcyhoUHJvZmlsZSk7Ci0gICAgaWYgKGRldkNsYXNzID09IGNtc1NpZ0xpbmtDbGFzcyB8fAotICAgICAgICBkZXZDbGFzcyA9PSBjbXNTaWdBYnN0cmFjdENsYXNzIHx8Ci0gICAgICAgIGRldkNsYXNzID09IGNtc1NpZ05hbWVkQ29sb3JDbGFzcykgewotICAgICAgICAgICAgQmxhY2tQb2ludCAtPiBYID0gQmxhY2tQb2ludCAtPlkgPSBCbGFja1BvaW50IC0+IFogPSAwLjA7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgLy8gTWFrZSBzdXJlIGludGVudCBpcyBhZGVxdWF0ZQotICAgIGlmIChJbnRlbnQgIT0gSU5URU5UX1BFUkNFUFRVQUwgJiYKLSAgICAgICAgSW50ZW50ICE9IElOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUMgJiYKLSAgICAgICAgSW50ZW50ICE9IElOVEVOVF9TQVRVUkFUSU9OKSB7Ci0gICAgICAgICAgICBCbGFja1BvaW50IC0+IFggPSBCbGFja1BvaW50IC0+WSA9IEJsYWNrUG9pbnQgLT4gWiA9IDAuMDsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLQotICAgIC8vIHY0ICsgcGVyY2VwdHVhbCAmIHNhdHVyYXRpb24gaW50ZW50cyBkb2VzIGhhdmUgaXRzIG93biBibGFjayBwb2ludCwgYW5kIGl0IGlzCi0gICAgLy8gd2VsbCBzcGVjaWZpZWQgZW5vdWdoIHRvIHVzZSBpdC4gQmxhY2sgcG9pbnQgdGFnIGlzIGRlcHJlY2F0ZWQgaW4gVjQuCi0gICAgaWYgKChjbXNHZXRFbmNvZGVkSUNDdmVyc2lvbihoUHJvZmlsZSkgPj0gMHg0MDAwMDAwKSAmJgotICAgICAgICAoSW50ZW50ID09IElOVEVOVF9QRVJDRVBUVUFMIHx8IEludGVudCA9PSBJTlRFTlRfU0FUVVJBVElPTikpIHsKLQotICAgICAgICAgICAgLy8gTWF0cml4IHNoYXBlciBzaGFyZSBNUkMgJiBwZXJjZXB0dWFsIGludGVudHMKLSAgICAgICAgICAgIGlmIChjbXNJc01hdHJpeFNoYXBlcihoUHJvZmlsZSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIEJsYWNrUG9pbnRBc0RhcmtlckNvbG9yYW50KGhQcm9maWxlLCBJTlRFTlRfUkVMQVRJVkVfQ09MT1JJTUVUUklDLCBCbGFja1BvaW50LCAwKTsKLQotICAgICAgICAgICAgLy8gR2V0IFBlcmNlcHR1YWwgYmxhY2sgb3V0IG9mIHY0IHByb2ZpbGVzLiBUaGF0IGlzIGZpeGVkIGZvciBwZXJjZXB0dWFsICYgc2F0dXJhdGlvbiBpbnRlbnRzCi0gICAgICAgICAgICBCbGFja1BvaW50IC0+IFggPSBjbXNQRVJDRVBUVUFMX0JMQUNLX1g7Ci0gICAgICAgICAgICBCbGFja1BvaW50IC0+IFkgPSBjbXNQRVJDRVBUVUFMX0JMQUNLX1k7Ci0gICAgICAgICAgICBCbGFja1BvaW50IC0+IFogPSBjbXNQRVJDRVBUVUFMX0JMQUNLX1o7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLQotICAgIC8vIENoZWNrIGlmIHRoZSBwcm9maWxlIGlzIGx1dCBiYXNlZCBhbmQgZ3JheSwgcmdiIG9yIGNteWsgKDcuMiBpbiBBZG9iZSdzIGRvY3VtZW50KQotICAgIENvbG9yU3BhY2UgPSBjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKTsKLSAgICBpZiAoIWNtc0lzQ0xVVChoUHJvZmlsZSwgSW50ZW50LCBMQ01TX1VTRURfQVNfT1VUUFVUICkgfHwKLSAgICAgICAgKENvbG9yU3BhY2UgIT0gY21zU2lnR3JheURhdGEgJiYKLSAgICAgICAgIENvbG9yU3BhY2UgIT0gY21zU2lnUmdiRGF0YSAgJiYKLSAgICAgICAgIENvbG9yU3BhY2UgIT0gY21zU2lnQ215a0RhdGEpKSB7Ci0KLSAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCBoYW5kbGUgYXMgaW5wdXQgY2FzZQotICAgICAgICByZXR1cm4gY21zRGV0ZWN0QmxhY2tQb2ludChCbGFja1BvaW50LCBoUHJvZmlsZSwgSW50ZW50LCBkd0ZsYWdzKTsKLSAgICB9Ci0KLSAgICAvLyBJdCBpcyBvbmUgb2YgdGhlIHZhbGlkIGNhc2VzISwgdXNlIEFkb2JlIGFsZ29yaXRobQotCi0gICAgCi0gICAgLy8gU2V0IGEgZmlyc3QgZ3Vlc3MsIHRoYXQgc2hvdWxkIHdvcmsgb24gZ29vZCBwcm9maWxlcy4KLSAgICBpZiAoSW50ZW50ID09IElOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUMpIHsKLQotICAgICAgICBjbXNDSUVYWVogSW5pWFlaOwotCi0gICAgICAgIC8vIGNhbGN1bGF0ZSBpbml0aWFsIExhYiBhcyBzb3VyY2UgYmxhY2sgcG9pbnQKLSAgICAgICAgaWYgKCFjbXNEZXRlY3RCbGFja1BvaW50KCZJbmlYWVosIGhQcm9maWxlLCBJbnRlbnQsIGR3RmxhZ3MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjb252ZXJ0IHRoZSBYWVogdG8gbGFiCi0gICAgICAgIGNtc1hZWjJMYWIoTlVMTCwgJkluaXRpYWxMYWIsICZJbmlYWVopOwotCi0gICAgfSBlbHNlIHsKLQotICAgICAgICAvLyBzZXQgdGhlIGluaXRpYWwgTGFiIHRvIHplcm8sIHRoYXQgc2hvdWxkIGJlIHRoZSBibGFjayBwb2ludCBmb3IgcGVyY2VwdHVhbCBhbmQgc2F0dXJhdGlvbgotICAgICAgICBJbml0aWFsTGFiLkwgPSAwOwotICAgICAgICBJbml0aWFsTGFiLmEgPSAwOwotICAgICAgICBJbml0aWFsTGFiLmIgPSAwOwotICAgIH0KLQotCi0gICAgLy8gU3RlcCAyCi0gICAgLy8gPT09PT09Ci0KLSAgICAvLyBDcmVhdGUgYSByb3VuZHRyaXAuIERlZmluZSBhIFRyYW5zZm9ybSBCVCBmb3IgYWxsIHggaW4gTCphKmIqCi0gICAgaFJvdW5kVHJpcCA9IENyZWF0ZVJvdW5kdHJpcFhGb3JtKGhQcm9maWxlLCBJbnRlbnQpOwotICAgIGlmIChoUm91bmRUcmlwID09IE5VTEwpICByZXR1cm4gRkFMU0U7Ci0KLSAgICAvLyBDb21wdXRlIHJhbXBzCi0KLSAgICBmb3IgKGw9MDsgbCA8IDI1NjsgbCsrKSB7Ci0KLSAgICAgICAgTGFiLkwgPSAoY21zRmxvYXQ2NE51bWJlcikgKGwgKiAxMDAuMCkgLyAyNTUuMDsKLSAgICAgICAgTGFiLmEgPSBjbXNtaW4oNTAsIGNtc21heCgtNTAsIEluaXRpYWxMYWIuYSkpOwotICAgICAgICBMYWIuYiA9IGNtc21pbig1MCwgY21zbWF4KC01MCwgSW5pdGlhbExhYi5iKSk7Ci0KLSAgICAgICAgY21zRG9UcmFuc2Zvcm0oaFJvdW5kVHJpcCwgJkxhYiwgJmRlc3RMYWIsIDEpOwotCi0gICAgICAgIGluUmFtcFtsXSAgPSBMYWIuTDsKLSAgICAgICAgb3V0UmFtcFtsXSA9IGRlc3RMYWIuTDsKLSAgICB9Ci0KLSAgICAvLyBNYWtlIG1vbm90b25pYwotICAgIGZvciAobCA9IDI1NDsgbCA+IDA7IC0tbCkgewotICAgICAgICBvdXRSYW1wW2xdID0gY21zbWluKG91dFJhbXBbbF0sIG91dFJhbXBbbCsxXSk7Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sKLSAgICBpZiAoISAob3V0UmFtcFswXSA8IG91dFJhbXBbMjU1XSkpIHsKLQotICAgICAgICBjbXNEZWxldGVUcmFuc2Zvcm0oaFJvdW5kVHJpcCk7Ci0gICAgICAgIEJsYWNrUG9pbnQgLT4gWCA9IEJsYWNrUG9pbnQgLT5ZID0gQmxhY2tQb2ludCAtPiBaID0gMC4wOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0KLSAgICAvLyBUZXN0IGZvciBtaWQgcmFuZ2Ugc3RyYWlnaHQgKG9ubHkgb24gcmVsYXRpdmUgY29sb3JpbWV0cmljKQotCi0gICAgTmVhcmx5U3RyYWlnaHRNaWRyYW5nZSA9IFRSVUU7Ci0gICAgTWluTCA9IG91dFJhbXBbMF07IE1heEwgPSBvdXRSYW1wWzI1NV07Ci0gICAgaWYgKEludGVudCA9PSBJTlRFTlRfUkVMQVRJVkVfQ09MT1JJTUVUUklDKSB7Ci0gICAgICAKLSAgICAgICAgZm9yIChsPTA7IGwgPCAyNTY7IGwrKykgewotCi0gICAgICAgICAgICBpZiAoISAoKGluUmFtcFtsXSA8PSBNaW5MICsgMC4yICogKE1heEwgLSBNaW5MKSApIHx8ICAgCi0gICAgICAgICAgICAgICAgKGZhYnMoaW5SYW1wW2xdIC0gb3V0UmFtcFtsXSkgPCA0LjAgKSkpCi0gICAgICAgICAgICAgICAgTmVhcmx5U3RyYWlnaHRNaWRyYW5nZSA9IEZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgdGhlIG1pZCByYW5nZSBpcyBzdHJhaWdodCAoYXMgZGV0ZXJtaW5lZCBhYm92ZSkgdGhlbiB0aGUgCi0gICAgICAgIC8vIERlc3RpbmF0aW9uQmxhY2tQb2ludCBzaGFsbCBiZSB0aGUgc2FtZSBhcyBpbml0aWFsTGFiLiAKLSAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgRGVzdGluYXRpb25CbGFja1BvaW50IHNoYWxsIGJlIGRldGVybWluZWQgCi0gICAgICAgIC8vIHVzaW5nIGN1cnZlIGZpdHRpbmcuCi0KLSAgICAgICAgaWYgKE5lYXJseVN0cmFpZ2h0TWlkcmFuZ2UpIHsKLQotICAgICAgICAgICAgY21zTGFiMlhZWihOVUxMLCBCbGFja1BvaW50LCAmSW5pdGlhbExhYik7Ci0gICAgICAgICAgICBjbXNEZWxldGVUcmFuc2Zvcm0oaFJvdW5kVHJpcCk7Ci0gICAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICAgICAgfQotICAgIH0KLQotIAotICAgIC8vIGN1cnZlIGZpdHRpbmc6IFRoZSByb3VuZC10cmlwIGN1cnZlIG5vcm1hbGx5IGxvb2tzIGxpa2UgYSBuZWFybHkgY29uc3RhbnQgc2VjdGlvbiBhdCB0aGUgYmxhY2sgcG9pbnQsCi0gICAgLy8gd2l0aCBhIGNvcm5lciBhbmQgYSBuZWFybHkgc3RyYWlnaHQgbGluZSB0byB0aGUgd2hpdGUgcG9pbnQuCi0gIAotICAgIGZvciAobD0wOyBsIDwgMjU2OyBsKyspIHsKLSAgICAKLSAgICAgICAgeVJhbXBbbF0gPSAob3V0UmFtcFtsXSAtIE1pbkwpIC8gKE1heEwgLSBNaW5MKTsKLSAgICB9Ci0KLSAgICAvLyBmaW5kIHRoZSBibGFjayBwb2ludCB1c2luZyB0aGUgbGVhc3Qgc3F1YXJlcyBlcnJvciBxdWFkcmF0aWMgY3VydmUgZml0dGluZwotCi0gICAgaWYgKEludGVudCA9PSBJTlRFTlRfUkVMQVRJVkVfQ09MT1JJTUVUUklDKSB7Ci0gICAgICAgIGxvID0gMC4xOwotICAgICAgICBoaSA9IDAuNTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0KLSAgICAgICAgLy8gUGVyY2VwdHVhbCBhbmQgc2F0dXJhdGlvbgotICAgICAgICBsbyA9IDAuMDM7Ci0gICAgICAgIGhpID0gMC4yNTsKLSAgICB9Ci0KLSAgICAvLyBDYXB0dXJlIHNoYWRvdyBwb2ludHMgZm9yIHRoZSBmaXR0aW5nLgotICAgIG4gPSAwOwotICAgIGZvciAobD0wOyBsIDwgMjU2OyBsKyspIHsKLSAgICAKLSAgICAgICAgY21zRmxvYXQ2NE51bWJlciBmZiA9IHlSYW1wW2xdOwotCi0gICAgICAgIGlmIChmZiA+PSBsbyAmJiBmZiA8IGhpKSB7Ci0gICAgICAgICAgICB4W25dID0gaW5SYW1wW2xdOwotICAgICAgICAgICAgeVtuXSA9IHlSYW1wW2xdOwotICAgICAgICAgICAgbisrOwotICAgICAgICB9ICAgIAotICAgIH0KLQotICAgIAotICAgIC8vIE5vIHN1aXRhYmxlIHBvaW50cwotICAgIGlmIChuIDwgMyApIHsKLSAgICAgICAgY21zRGVsZXRlVHJhbnNmb3JtKGhSb3VuZFRyaXApOwotICAgICAgICBCbGFja1BvaW50IC0+IFggPSBCbGFja1BvaW50IC0+WSA9IEJsYWNrUG9pbnQgLT4gWiA9IDAuMDsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAKLSAgICAvLyBmaXQgYW5kIGdldCB0aGUgdmVydGV4IG9mIHF1YWRyYXRpYyBjdXJ2ZQotICAgIExhYi5MID0gUm9vdE9mTGVhc3RTcXVhcmVzRml0UXVhZHJhdGljQ3VydmUobiwgeCwgeSk7Ci0KLSAgICBpZiAoTGFiLkwgPCAwLjApIHsgLy8gY2xpcCB0byB6ZXJvIEwqIGlmIHRoZSB2ZXJ0ZXggaXMgbmVnYXRpdmUKLSAgICAgICAgTGFiLkwgPSAwOwotICAgIH0KLQotICAgIExhYi5hID0gSW5pdGlhbExhYi5hOwotICAgIExhYi5iID0gSW5pdGlhbExhYi5iOwotCi0gICAgY21zTGFiMlhZWihOVUxMLCBCbGFja1BvaW50LCAmTGFiKTsKLQotICAgIGNtc0RlbGV0ZVRyYW5zZm9ybShoUm91bmRUcmlwKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zc20uYyBiL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zc20uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzNmUxNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3NtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MzQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTEgTWFydGkgTWFyaWEgU2FndWVyCi0vLwotLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0vLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0vLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0vLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLS8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQotLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLS8vCi0vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0vLwotLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0vLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KLS8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi0vLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCi0vLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0vLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLS8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotCi0jaW5jbHVkZSAibGNtczJfaW50ZXJuYWwuaCIKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gR2FtdXQgYm91bmRhcnkgZGVzY3JpcHRpb24gYnkgdXNpbmcgSmFuIE1vcm92aWMncyBTZWdtZW50IG1heGltYSBtZXRob2QKLS8vIE1hbnkgdGhhbmtzIHRvIEphbiBmb3IgYWxsb3dpbmcgbWUgdG8gdXNlIGhpcyBhbGdvcml0aG0uCi0KLS8vIHIgPSBDKgotLy8gYWxwaGEgPSBIYWIKLS8vIHRoZXRhID0gTCoKLQotI2RlZmluZSBTRUNUT1JTIDE2ICAgICAgLy8gbnVtYmVyIG9mIGRpdmlzaW9ucyBpbiBhbHBoYSBhbmQgdGhldGEKLQotLy8gU3BoZXJpY2FsIGNvb3JkaW5hdGVzCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBjbXNGbG9hdDY0TnVtYmVyIHI7Ci0gICAgY21zRmxvYXQ2NE51bWJlciBhbHBoYTsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIHRoZXRhOwotCi19IGNtc1NwaGVyaWNhbDsKLQotdHlwZWRlZiAgZW51bSB7Ci0gICAgICAgIEdQX0VNUFRZLAotICAgICAgICBHUF9TUEVDSUZJRUQsCi0gICAgICAgIEdQX01PREVMRUQKLQotICAgIH0gR0RCUG9pbnRUeXBlOwotCi0KLXR5cGVkZWYgc3RydWN0IHsKLQotICAgIEdEQlBvaW50VHlwZSBUeXBlOwotICAgIGNtc1NwaGVyaWNhbCBwOyAgICAgICAgIC8vIEtlZXAgYWxzbyBhbHBoYSAmIHRoZXRhIG9mIG1heGltdW0KLQotfSBjbXNHREJQb2ludDsKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBjbXNDb250ZXh0IENvbnRleHRJRDsKLSAgICBjbXNHREJQb2ludCBHYW11dFtTRUNUT1JTXVtTRUNUT1JTXTsKLQotfSBjbXNHREI7Ci0KLQotLy8gQSBsaW5lIHVzaW5nIHRoZSBwYXJhbWV0cmljIGZvcm0KLS8vIFAgPSBhICsgdCp1Ci10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBjbXNWRUMzIGE7Ci0gICAgY21zVkVDMyB1OwotCi19IGNtc0xpbmU7Ci0KLQotLy8gQSBwbGFuZSB1c2luZyB0aGUgcGFyYW1ldHJpYyBmb3JtCi0vLyBRID0gYiArIHIqdiArIHMqdwotdHlwZWRlZiBzdHJ1Y3QgewotCi0gICAgY21zVkVDMyBiOwotICAgIGNtc1ZFQzMgdjsKLSAgICBjbXNWRUMzIHc7Ci0KLX0gY21zUGxhbmU7Ci0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBBVEFOMigpIHdoaWNoIGFsd2F5cyByZXR1cm5zIGRlZ3JlZSBwb3NpdGl2ZSBudW1iZXJzCi0KLXN0YXRpYwotY21zRmxvYXQ2NE51bWJlciBfY21zQXRhbjIoY21zRmxvYXQ2NE51bWJlciB5LCBjbXNGbG9hdDY0TnVtYmVyIHgpCi17Ci0gICAgY21zRmxvYXQ2NE51bWJlciBhOwotCi0gICAgLy8gRGVhbCB3aXRoIHVuZGVmaW5lZCBjYXNlCi0gICAgaWYgKHggPT0gMC4wICYmIHkgPT0gMC4wKSByZXR1cm4gMDsKLQotICAgIGEgPSAoYXRhbjIoeSwgeCkgKiAxODAuMCkgLyBNX1BJOwotCi0gICAgd2hpbGUgKGEgPCAwKSB7Ci0gICAgICAgIGEgKz0gMzYwOwotICAgIH0KLQotICAgIHJldHVybiBhOwotfQotCi0vLyBDb252ZXJ0IHRvIHNwaGVyaWNhbCBjb29yZGluYXRlcwotc3RhdGljCi12b2lkIFRvU3BoZXJpY2FsKGNtc1NwaGVyaWNhbCogc3AsIGNvbnN0IGNtc1ZFQzMqIHYpCi17Ci0KLSAgICBjbXNGbG9hdDY0TnVtYmVyIEwsIGEsIGI7Ci0KLSAgICBMID0gdiAtPm5bVlhdOwotICAgIGEgPSB2IC0+bltWWV07Ci0gICAgYiA9IHYgLT5uW1ZaXTsKLQotICAgIHNwIC0+ciA9IHNxcnQoIEwqTCArIGEqYSArIGIqYiApOwotCi0gICBpZiAoc3AgLT5yID09IDApIHsKLSAgICAgICAgc3AgLT5hbHBoYSA9IHNwIC0+dGhldGEgPSAwOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3AgLT5hbHBoYSA9IF9jbXNBdGFuMihhLCBiKTsKLSAgICBzcCAtPnRoZXRhID0gX2Ntc0F0YW4yKHNxcnQoYSphICsgYipiKSwgTCk7Ci19Ci0KLQotLy8gQ29udmVydCB0byBjYXJ0ZXNpYW4gZnJvbSBzcGhlcmljYWwKLXN0YXRpYwotdm9pZCBUb0NhcnRlc2lhbihjbXNWRUMzKiB2LCBjb25zdCBjbXNTcGhlcmljYWwqIHNwKQotewotICAgIGNtc0Zsb2F0NjROdW1iZXIgc2luX2FscGhhOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgY29zX2FscGhhOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgc2luX3RoZXRhOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgY29zX3RoZXRhOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgTCwgYSwgYjsKLQotICAgIHNpbl9hbHBoYSA9IHNpbigoTV9QSSAqIHNwIC0+YWxwaGEpIC8gMTgwLjApOwotICAgIGNvc19hbHBoYSA9IGNvcygoTV9QSSAqIHNwIC0+YWxwaGEpIC8gMTgwLjApOwotICAgIHNpbl90aGV0YSA9IHNpbigoTV9QSSAqIHNwIC0+dGhldGEpIC8gMTgwLjApOwotICAgIGNvc190aGV0YSA9IGNvcygoTV9QSSAqIHNwIC0+dGhldGEpIC8gMTgwLjApOwotCi0gICAgYSA9IHNwIC0+ciAqIHNpbl90aGV0YSAqIHNpbl9hbHBoYTsKLSAgICBiID0gc3AgLT5yICogc2luX3RoZXRhICogY29zX2FscGhhOwotICAgIEwgPSBzcCAtPnIgKiBjb3NfdGhldGE7Ci0KLSAgICB2IC0+bltWWF0gPSBMOwotICAgIHYgLT5uW1ZZXSA9IGE7Ci0gICAgdiAtPm5bVlpdID0gYjsKLX0KLQotCi0vLyBRdWFudGl6ZSBzZWN0b3Igb2YgYSBzcGhlcmljYWwgY29vcmRpbmF0ZS4gU2F0dXJhdGUgMzYwLCAxODAgdG8gbGFzdCBzZWN0b3IKLS8vIFRoZSBsaW1pdHMgYXJlIHRoZSBjZW50ZXJzIG9mIGVhY2ggc2VjdG9yLCBzbwotc3RhdGljCi12b2lkIFF1YW50aXplVG9TZWN0b3IoY29uc3QgY21zU3BoZXJpY2FsKiBzcCwgaW50KiBhbHBoYSwgaW50KiB0aGV0YSkKLXsKLSAgICAqYWxwaGEgPSAoaW50KSBmbG9vcigoKHNwLT5hbHBoYSAqIChTRUNUT1JTKSkgLyAzNjAuMCkgKTsKLSAgICAqdGhldGEgPSAoaW50KSBmbG9vcigoKHNwLT50aGV0YSAqIChTRUNUT1JTKSkgLyAxODAuMCkgKTsKLQotICAgIGlmICgqYWxwaGEgPj0gU0VDVE9SUykKLSAgICAgICAgKmFscGhhID0gU0VDVE9SUy0xOwotICAgIGlmICgqdGhldGEgPj0gU0VDVE9SUykKLSAgICAgICAgKnRoZXRhID0gU0VDVE9SUy0xOwotfQotCi0KLS8vIExpbmUgZGV0ZXJtaW5lZCBieSAyIHBvaW50cwotc3RhdGljCi12b2lkIExpbmVPZjJQb2ludHMoY21zTGluZSogbGluZSwgY21zVkVDMyogYSwgY21zVkVDMyogYikKLXsKLQotICAgIF9jbXNWRUMzaW5pdCgmbGluZSAtPmEsIGEgLT5uW1ZYXSwgYSAtPm5bVlldLCBhIC0+bltWWl0pOwotICAgIF9jbXNWRUMzaW5pdCgmbGluZSAtPnUsIGIgLT5uW1ZYXSAtIGEgLT5uW1ZYXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiIC0+bltWWV0gLSBhIC0+bltWWV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYiAtPm5bVlpdIC0gYSAtPm5bVlpdKTsKLX0KLQotCi0vLyBFdmFsdWF0ZSBwYXJhbWV0cmljIGxpbmUKLXN0YXRpYwotdm9pZCBHZXRQb2ludE9mTGluZShjbXNWRUMzKiBwLCBjb25zdCBjbXNMaW5lKiBsaW5lLCBjbXNGbG9hdDY0TnVtYmVyIHQpCi17Ci0gICAgcCAtPm5bVlhdID0gbGluZSAtPmEubltWWF0gKyB0ICogbGluZS0+dS5uW1ZYXTsKLSAgICBwIC0+bltWWV0gPSBsaW5lIC0+YS5uW1ZZXSArIHQgKiBsaW5lLT51Lm5bVlldOwotICAgIHAgLT5uW1ZaXSA9IGxpbmUgLT5hLm5bVlpdICsgdCAqIGxpbmUtPnUubltWWl07Ci19Ci0KLQotCi0vKgotICAgIENsb3Nlc3QgcG9pbnQgaW4gc2VjdG9yIGxpbmUxIHRvIHNlY3RvciBsaW5lMiAoYm90aCBhcmUgZGVmaW5lZCBhcyAwIDw9dCA8PSAxKQotICAgIGh0dHA6Ly9zb2Z0c3VyZmVyLmNvbS9BcmNoaXZlL2FsZ29yaXRobV8wMTA2L2FsZ29yaXRobV8wMTA2Lmh0bQotCi0gICAgQ29weXJpZ2h0IDIwMDEsIHNvZnRTdXJmZXIgKHd3dy5zb2Z0c3VyZmVyLmNvbSkKLSAgICBUaGlzIGNvZGUgbWF5IGJlIGZyZWVseSB1c2VkIGFuZCBtb2RpZmllZCBmb3IgYW55IHB1cnBvc2UKLSAgICBwcm92aWRpbmcgdGhhdCB0aGlzIGNvcHlyaWdodCBub3RpY2UgaXMgaW5jbHVkZWQgd2l0aCBpdC4KLSAgICBTb2Z0U3VyZmVyIG1ha2VzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGNvZGUsIGFuZCBjYW5ub3QgYmUgaGVsZAotICAgIGxpYWJsZSBmb3IgYW55IHJlYWwgb3IgaW1hZ2luZWQgZGFtYWdlIHJlc3VsdGluZyBmcm9tIGl0cyB1c2UuCi0gICAgVXNlcnMgb2YgdGhpcyBjb2RlIG11c3QgdmVyaWZ5IGNvcnJlY3RuZXNzIGZvciB0aGVpciBhcHBsaWNhdGlvbi4KLQotKi8KLQotc3RhdGljCi1jbXNCb29sIENsb3Nlc3RMaW5lVG9MaW5lKGNtc1ZFQzMqIHIsIGNvbnN0IGNtc0xpbmUqIGxpbmUxLCBjb25zdCBjbXNMaW5lKiBsaW5lMikKLXsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIGEsIGIsIGMsIGQsIGUsIEQ7Ci0gICAgY21zRmxvYXQ2NE51bWJlciBzYywgc04sIHNEOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgdGMsIHROLCB0RDsKLSAgICBjbXNWRUMzIHcwOwotCi0gICAgX2Ntc1ZFQzNtaW51cygmdzAsICZsaW5lMSAtPmEsICZsaW5lMiAtPmEpOwotCi0gICAgYSAgPSBfY21zVkVDM2RvdCgmbGluZTEgLT51LCAmbGluZTEgLT51KTsKLSAgICBiICA9IF9jbXNWRUMzZG90KCZsaW5lMSAtPnUsICZsaW5lMiAtPnUpOwotICAgIGMgID0gX2Ntc1ZFQzNkb3QoJmxpbmUyIC0+dSwgJmxpbmUyIC0+dSk7Ci0gICAgZCAgPSBfY21zVkVDM2RvdCgmbGluZTEgLT51LCAmdzApOwotICAgIGUgID0gX2Ntc1ZFQzNkb3QoJmxpbmUyIC0+dSwgJncwKTsKLQotICAgIEQgID0gYSpjIC0gYiAqIGI7ICAgICAgLy8gRGVub21pbmF0b3IKLSAgICBzRCA9IHREID0gRDsgICAgICAgICAgIC8vIGRlZmF1bHQgc0QgPSBEID49IDAKLQotICAgIGlmIChEIDwgIE1BVFJJWF9ERVRfVE9MRVJBTkNFKSB7ICAgLy8gdGhlIGxpbmVzIGFyZSBhbG1vc3QgcGFyYWxsZWwKLQotICAgICAgICBzTiA9IDAuMDsgICAgICAgIC8vIGZvcmNlIHVzaW5nIHBvaW50IFAwIG9uIHNlZ21lbnQgUzEKLSAgICAgICAgc0QgPSAxLjA7ICAgICAgICAvLyB0byBwcmV2ZW50IHBvc3NpYmxlIGRpdmlzaW9uIGJ5IDAuMCBsYXRlcgotICAgICAgICB0TiA9IGU7Ci0gICAgICAgIHREID0gYzsKLSAgICB9Ci0gICAgZWxzZSB7ICAgICAgICAgICAgICAgIC8vIGdldCB0aGUgY2xvc2VzdCBwb2ludHMgb24gdGhlIGluZmluaXRlIGxpbmVzCi0KLSAgICAgICAgc04gPSAoYiplIC0gYypkKTsKLSAgICAgICAgdE4gPSAoYSplIC0gYipkKTsKLQotICAgICAgICBpZiAoc04gPCAwLjApIHsgICAgICAgLy8gc2MgPCAwID0+IHRoZSBzPTAgZWRnZSBpcyB2aXNpYmxlCi0KLSAgICAgICAgICAgIHNOID0gMC4wOwotICAgICAgICAgICAgdE4gPSBlOwotICAgICAgICAgICAgdEQgPSBjOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHNOID4gc0QpIHsgICAvLyBzYyA+IDEgPT4gdGhlIHM9MSBlZGdlIGlzIHZpc2libGUKLSAgICAgICAgICAgIHNOID0gc0Q7Ci0gICAgICAgICAgICB0TiA9IGUgKyBiOwotICAgICAgICAgICAgdEQgPSBjOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHROIDwgMC4wKSB7ICAgICAgICAgICAvLyB0YyA8IDAgPT4gdGhlIHQ9MCBlZGdlIGlzIHZpc2libGUKLQotICAgICAgICB0TiA9IDAuMDsKLSAgICAgICAgLy8gcmVjb21wdXRlIHNjIGZvciB0aGlzIGVkZ2UKLSAgICAgICAgaWYgKC1kIDwgMC4wKQotICAgICAgICAgICAgc04gPSAwLjA7Ci0gICAgICAgIGVsc2UgaWYgKC1kID4gYSkKLSAgICAgICAgICAgIHNOID0gc0Q7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgc04gPSAtZDsKLSAgICAgICAgICAgIHNEID0gYTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmICh0TiA+IHREKSB7ICAgICAgLy8gdGMgPiAxID0+IHRoZSB0PTEgZWRnZSBpcyB2aXNpYmxlCi0KLSAgICAgICAgdE4gPSB0RDsKLQotICAgICAgICAvLyByZWNvbXB1dGUgc2MgZm9yIHRoaXMgZWRnZQotICAgICAgICBpZiAoKC1kICsgYikgPCAwLjApCi0gICAgICAgICAgICBzTiA9IDA7Ci0gICAgICAgIGVsc2UgaWYgKCgtZCArIGIpID4gYSkKLSAgICAgICAgICAgIHNOID0gc0Q7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgc04gPSAoLWQgKyBiKTsKLSAgICAgICAgICAgIHNEID0gYTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBmaW5hbGx5IGRvIHRoZSBkaXZpc2lvbiB0byBnZXQgc2MgYW5kIHRjCi0gICAgc2MgPSAoZmFicyhzTikgPCBNQVRSSVhfREVUX1RPTEVSQU5DRSA/IDAuMCA6IHNOIC8gc0QpOwotICAgIHRjID0gKGZhYnModE4pIDwgTUFUUklYX0RFVF9UT0xFUkFOQ0UgPyAwLjAgOiB0TiAvIHREKTsKLQotICAgIEdldFBvaW50T2ZMaW5lKHIsIGxpbmUxLCBzYyk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gV3JhcHBlcgotCi0KLS8vIEFsbG9jYXRlICYgZnJlZSBzdHJ1Y3R1cmUKLWNtc0hBTkRMRSAgQ01TRVhQT1JUIGNtc0dCREFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElEKQotewotICAgIGNtc0dEQiogZ2JkID0gKGNtc0dEQiopIF9jbXNNYWxsb2NaZXJvKENvbnRleHRJRCwgc2l6ZW9mKGNtc0dEQikpOwotICAgIGlmIChnYmQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBnYmQgLT4gQ29udGV4dElEID0gQ29udGV4dElEOwotCi0gICAgcmV0dXJuIChjbXNIQU5ETEUpIGdiZDsKLX0KLQotCi12b2lkIENNU0VYUE9SVCBjbXNHQkRGcmVlKGNtc0hBTkRMRSBoR0JEKQotewotICAgIGNtc0dEQiogZ2JkID0gKGNtc0dEQiopIGhHQkQ7Ci0gICAgaWYgKGhHQkQgIT0gTlVMTCkKLSAgICAgICAgX2Ntc0ZyZWUoZ2JkLT5Db250ZXh0SUQsICh2b2lkKikgZ2JkKTsKLX0KLQotCi0vLyBBdXhpbGlhciB0byByZXRyaWV2ZSBhIHBvaW50ZXIgdG8gdGhlIHNlZ21lbnRyIGNvbnRhaW5pbmcgdGhlIExhYiB2YWx1ZQotc3RhdGljCi1jbXNHREJQb2ludCogR2V0UG9pbnQoY21zR0RCKiBnYmQsIGNvbnN0IGNtc0NJRUxhYiogTGFiLCBjbXNTcGhlcmljYWwqIHNwKQotewotICAgIGNtc1ZFQzMgdjsKLSAgICBpbnQgYWxwaGEsIHRoZXRhOwotCi0gICAgLy8gSG91c2VrZWVwaW5nCi0gICAgX2Ntc0Fzc2VydChnYmQgIT0gTlVMTCk7Ci0gICAgX2Ntc0Fzc2VydChMYWIgIT0gTlVMTCk7Ci0gICAgX2Ntc0Fzc2VydChzcCAhPSBOVUxMKTsKLQotICAgIC8vIENlbnRlciBMKiBieSBzdWJzdHJhY3RpbmcgaGFsZiBvZiBpdHMgZG9tYWluLCB0aGF0J3MgNTAKLSAgICBfY21zVkVDM2luaXQoJnYsIExhYiAtPkwgLSA1MC4wLCBMYWIgLT5hLCBMYWIgLT5iKTsKLQotICAgIC8vIENvbnZlcnQgdG8gc3BoZXJpY2FsIGNvb3JkaW5hdGVzCi0gICAgVG9TcGhlcmljYWwoc3AsICZ2KTsKLQotICAgIGlmIChzcCAtPnIgPCAwIHx8IHNwIC0+YWxwaGEgPCAwIHx8IHNwLT50aGV0YSA8IDApIHsKLSAgICAgICAgIGNtc1NpZ25hbEVycm9yKGdiZCAtPkNvbnRleHRJRCwgY21zRVJST1JfUkFOR0UsICJzcGhlcmljYWwgdmFsdWUgb3V0IG9mIHJhbmdlIik7Ci0gICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBPbiB3aGljaCBzZWN0b3IgaXQgZmFsbHM/Ci0gICAgUXVhbnRpemVUb1NlY3RvcihzcCwgJmFscGhhLCAmdGhldGEpOwotCi0gICAgaWYgKGFscGhhIDwgMCB8fCB0aGV0YSA8IDAgfHwgYWxwaGEgPj0gU0VDVE9SUyB8fCB0aGV0YSA+PSBTRUNUT1JTKSB7Ci0gICAgICAgICBjbXNTaWduYWxFcnJvcihnYmQgLT5Db250ZXh0SUQsIGNtc0VSUk9SX1JBTkdFLCAiIHF1YWRyYW50IG91dCBvZiByYW5nZSIpOwotICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgLy8gR2V0IHBvaW50ZXIgdG8gdGhlIHNlY3RvcgotICAgIHJldHVybiAmZ2JkIC0+R2FtdXRbdGhldGFdW2FscGhhXTsKLX0KLQotLy8gQWRkIGEgcG9pbnQgdG8gZ2FtdXQgZGVzY3JpcHRvci4gUG9pbnQgdG8gYWRkIGlzIGluIExhYiBjb2xvciBzcGFjZS4KLS8vIEdCRCBpcyBjZW50ZXJlZCBvbiBhPWI9MCBhbmQgTCo9NTAKLWNtc0Jvb2wgQ01TRVhQT1JUIGNtc0dEQkFkZFBvaW50KGNtc0hBTkRMRSBoR0JELCBjb25zdCBjbXNDSUVMYWIqIExhYikKLXsKLSAgICBjbXNHREIqIGdiZCA9IChjbXNHREIqKSBoR0JEOwotICAgIGNtc0dEQlBvaW50KiBwdHI7Ci0gICAgY21zU3BoZXJpY2FsIHNwOwotCi0KLSAgICAvLyBHZXQgcG9pbnRlciB0byB0aGUgc2VjdG9yCi0gICAgcHRyID0gR2V0UG9pbnQoZ2JkLCBMYWIsICZzcCk7Ci0gICAgaWYgKHB0ciA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAvLyBJZiBubyBzYW1wbGVzIGF0IHRoaXMgc2VjdG9yLCBhZGQgaXQKLSAgICBpZiAocHRyIC0+VHlwZSA9PSBHUF9FTVBUWSkgewotCi0gICAgICAgIHB0ciAtPiBUeXBlID0gR1BfU1BFQ0lGSUVEOwotICAgICAgICBwdHIgLT4gcCAgICA9IHNwOwotICAgIH0KLSAgICBlbHNlIHsKLQotCi0gICAgICAgIC8vIFN1YnN0aXR1dGUgb25seSBpZiByYWRpdXMgaXMgZ3JlYXRlcgotICAgICAgICBpZiAoc3AuciA+IHB0ciAtPiBwLnIpIHsKLQotICAgICAgICAgICAgICAgIHB0ciAtPiBUeXBlID0gR1BfU1BFQ0lGSUVEOwotICAgICAgICAgICAgICAgIHB0ciAtPiBwICAgID0gc3A7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLy8gQ2hlY2sgaWYgYSBnaXZlbiBwb2ludCBmYWxscyBpbnNpZGUgZ2FtdXQKLWNtc0Jvb2wgQ01TRVhQT1JUIGNtc0dEQkNoZWNrUG9pbnQoY21zSEFORExFIGhHQkQsIGNvbnN0IGNtc0NJRUxhYiogTGFiKQotewotICAgIGNtc0dEQiogZ2JkID0gKGNtc0dEQiopIGhHQkQ7Ci0gICAgY21zR0RCUG9pbnQqIHB0cjsKLSAgICBjbXNTcGhlcmljYWwgc3A7Ci0KLSAgICAvLyBHZXQgcG9pbnRlciB0byB0aGUgc2VjdG9yCi0gICAgcHRyID0gR2V0UG9pbnQoZ2JkLCBMYWIsICZzcCk7Ci0gICAgaWYgKHB0ciA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAvLyBJZiBubyBzYW1wbGVzIGF0IHRoaXMgc2VjdG9yLCByZXR1cm4gbm8gZGF0YQotICAgIGlmIChwdHIgLT5UeXBlID09IEdQX0VNUFRZKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAvLyBJbiBnYW11dCBvbmx5IGlmIHJhZGl1cyBpcyBncmVhdGVyCi0KLSAgICByZXR1cm4gKHNwLnIgPD0gcHRyIC0+IHAucik7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEZpbmQgbmVhciBzZWN0b3JzLiBUaGUgbGlzdCBvZiBzZWN0b3JzIGZvdW5kIGlzIHJldHVybmVkIG9uIENsb3NlW10uCi0vLyBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHNlY3RvcnMgYXMgd2VsbC4KLQotLy8gMjQgICA5ICAxMCAgMTEgIDEyCi0vLyAyMyAgIDggICAxICAgMiAgMTMKLS8vIDIyICAgNyAgICogICAzICAxNAotLy8gMjEgICA2ICAgNSAgIDQgIDE1Ci0vLyAyMCAgMTkgIDE4ICAxNyAgMTYKLS8vCi0vLyBUaG9zZSBhcmUgdGhlIHJlbGF0aXZlIG1vdmVtZW50cwotLy8gey0yLC0yfSwgey0xLCAtMn0sIHswLCAtMn0sIHsrMSwgLTJ9LCB7KzIsICAtMn0sCi0vLyB7LTIsLTF9LCB7LTEsIC0xfSwgezAsIC0xfSwgeysxLCAtMX0sIHsrMiwgIC0xfSwKLS8vIHstMiwgMH0sIHstMSwgIDB9LCB7MCwgIDB9LCB7KzEsICAwfSwgeysyLCAgIDB9LAotLy8gey0yLCsxfSwgey0xLCArMX0sIHswLCArMX0sIHsrMSwgICsxfSwgeysyLCAgKzF9LAotLy8gey0yLCsyfSwgey0xLCArMn0sIHswLCArMn0sIHsrMSwgICsyfSwgeysyLCAgKzJ9fTsKLQotCi1zdGF0aWMKLWNvbnN0IHN0cnVjdCBfc3BpcmFsIHsKLQotICAgIGludCBBZHZYLCBBZHZZOwotCi0gICAgfSBTcGlyYWxbXSA9IHsgezAsICAtMX0sIHsrMSwgLTF9LCB7KzEsICAwfSwgeysxLCArMX0sIHswLCAgKzF9LCB7LTEsICsxfSwKLSAgICAgICAgICAgICAgICAgICB7LTEsICAwfSwgey0xLCAtMX0sIHstMSwgLTJ9LCB7MCwgIC0yfSwgeysxLCAtMn0sIHsrMiwgLTJ9LAotICAgICAgICAgICAgICAgICAgIHsrMiwgLTF9LCB7KzIsICAwfSwgeysyLCArMX0sIHsrMiwgKzJ9LCB7KzEsICsyfSwgezAsICArMn0sCi0gICAgICAgICAgICAgICAgICAgey0xLCArMn0sIHstMiwgKzJ9LCB7LTIsICsxfSwgey0yLCAwfSwgIHstMiwgLTF9LCB7LTIsIC0yfSB9OwotCi0jZGVmaW5lIE5TVEVQUyAoc2l6ZW9mKFNwaXJhbCkgLyBzaXplb2Yoc3RydWN0IF9zcGlyYWwpKQotCi1zdGF0aWMKLWludCBGaW5kTmVhclNlY3RvcnMoY21zR0RCKiBnYmQsIGludCBhbHBoYSwgaW50IHRoZXRhLCBjbXNHREJQb2ludCogQ2xvc2VbXSkKLXsKLSAgICBpbnQgblNlY3RvcnMgPSAwOwotICAgIGludCBhLCB0OwotICAgIGNtc1VJbnQzMk51bWJlciBpOwotICAgIGNtc0dEQlBvaW50KiBwdDsKLQotICAgIGZvciAoaT0wOyBpIDwgTlNURVBTOyBpKyspIHsKLQotICAgICAgICBhID0gYWxwaGEgKyBTcGlyYWxbaV0uQWR2WDsKLSAgICAgICAgdCA9IHRoZXRhICsgU3BpcmFsW2ldLkFkdlk7Ci0KLSAgICAgICAgLy8gQ3ljbGUgYXQgdGhlIGVuZAotICAgICAgICBhICU9IFNFQ1RPUlM7Ci0gICAgICAgIHQgJT0gU0VDVE9SUzsKLQotICAgICAgICAvLyBDeWNsZSBhdCB0aGUgYmVnaW4KLSAgICAgICAgaWYgKGEgPCAwKSBhID0gU0VDVE9SUyArIGE7Ci0gICAgICAgIGlmICh0IDwgMCkgdCA9IFNFQ1RPUlMgKyB0OwotCi0gICAgICAgIHB0ID0gJmdiZCAtPkdhbXV0W3RdW2FdOwotCi0gICAgICAgIGlmIChwdCAtPiBUeXBlICE9IEdQX0VNUFRZKSB7Ci0KLSAgICAgICAgICAgIENsb3NlW25TZWN0b3JzKytdID0gcHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gblNlY3RvcnM7Ci19Ci0KLQotLy8gSW50ZXJwb2xhdGUgYSBtaXNzaW5nIHNlY3Rvci4gTWV0aG9kIGlkZW50aWZpZXMgd2hhdGV2ZXIgdGhpcyBpcyB0b3AsIGJvdHRvbSBvciBtaWQKLXN0YXRpYwotY21zQm9vbCBJbnRlcnBvbGF0ZU1pc3NpbmdTZWN0b3IoY21zR0RCKiBnYmQsIGludCBhbHBoYSwgaW50IHRoZXRhKQotewotICAgIGNtc1NwaGVyaWNhbCBzcDsKLSAgICBjbXNWRUMzIExhYjsKLSAgICBjbXNWRUMzIENlbnRyZTsKLSAgICBjbXNMaW5lIHJheTsKLSAgICBpbnQgbkNsb3NlU2VjdG9yczsKLSAgICBjbXNHREJQb2ludCogQ2xvc2VbTlNURVBTICsgMV07Ci0gICAgY21zU3BoZXJpY2FsIGNsb3NlbCwgdGVtcGw7Ci0gICAgY21zTGluZSBlZGdlOwotICAgIGludCBrLCBtOwotCi0gICAgLy8gSXMgdGhhdCBwb2ludCBhbHJlYWR5IHNwZWNpZmllZD8KLSAgICBpZiAoZ2JkIC0+R2FtdXRbdGhldGFdW2FscGhhXS5UeXBlICE9IEdQX0VNUFRZKSByZXR1cm4gVFJVRTsKLQotICAgIC8vIEZpbGwgY2xvc2UgcG9pbnRzCi0gICAgbkNsb3NlU2VjdG9ycyA9IEZpbmROZWFyU2VjdG9ycyhnYmQsIGFscGhhLCB0aGV0YSwgQ2xvc2UpOwotCi0KLSAgICAvLyBGaW5kIGEgY2VudHJhbCBwb2ludCBvbiB0aGUgc2VjdG9yCi0gICAgc3AuYWxwaGEgPSAoY21zRmxvYXQ2NE51bWJlcikgKChhbHBoYSArIDAuNSkgKiAzNjAuMCkgLyAoU0VDVE9SUyk7Ci0gICAgc3AudGhldGEgPSAoY21zRmxvYXQ2NE51bWJlcikgKCh0aGV0YSArIDAuNSkgKiAxODAuMCkgLyAoU0VDVE9SUyk7Ci0gICAgc3AuciAgICAgPSA1MC4wOwotCi0gICAgLy8gQ29udmVydCB0byBDYXJ0ZXNpYW4KLSAgICBUb0NhcnRlc2lhbigmTGFiLCAmc3ApOwotCi0gICAgLy8gQ3JlYXRlIGEgcmF5IGxpbmUgZnJvbSBjZW50cmUgdG8gdGhpcyBwb2ludAotICAgIF9jbXNWRUMzaW5pdCgmQ2VudHJlLCA1MC4wLCAwLCAwKTsKLSAgICBMaW5lT2YyUG9pbnRzKCZyYXksICZMYWIsICZDZW50cmUpOwotCi0gICAgLy8gRm9yIGFsbCBjbG9zZSBzZWN0b3JzCi0gICAgY2xvc2VsLnIgPSAwLjA7Ci0gICAgY2xvc2VsLmFscGhhID0gMDsKLSAgICBjbG9zZWwudGhldGEgPSAwOwotCi0gICAgZm9yIChrPTA7IGsgPCBuQ2xvc2VTZWN0b3JzOyBrKyspIHsKLQotICAgICAgICBmb3IobSA9IGsrMTsgbSA8IG5DbG9zZVNlY3RvcnM7IG0rKykgewotCi0gICAgICAgICAgICBjbXNWRUMzIHRlbXAsIGExLCBhMjsKLQotICAgICAgICAgICAgLy8gQSBsaW5lIGZyb20gc2VjdG9yIHRvIHNlY3RvcgotICAgICAgICAgICAgVG9DYXJ0ZXNpYW4oJmExLCAmQ2xvc2Vba10tPnApOwotICAgICAgICAgICAgVG9DYXJ0ZXNpYW4oJmEyLCAmQ2xvc2VbbV0tPnApOwotCi0gICAgICAgICAgICBMaW5lT2YyUG9pbnRzKCZlZGdlLCAmYTEsICZhMik7Ci0KLSAgICAgICAgICAgIC8vIEZpbmQgYSBsaW5lCi0gICAgICAgICAgICBDbG9zZXN0TGluZVRvTGluZSgmdGVtcCwgJnJheSwgJmVkZ2UpOwotCi0gICAgICAgICAgICAvLyBDb252ZXJ0IHRvIHNwaGVyaWNhbAotICAgICAgICAgICAgVG9TcGhlcmljYWwoJnRlbXBsLCAmdGVtcCk7Ci0KLQotICAgICAgICAgICAgaWYgKCB0ZW1wbC5yID4gY2xvc2VsLnIgJiYKLSAgICAgICAgICAgICAgICAgdGVtcGwudGhldGEgPj0gKHRoZXRhKjE4MC4wL1NFQ1RPUlMpICYmCi0gICAgICAgICAgICAgICAgIHRlbXBsLnRoZXRhIDw9ICgodGhldGErMSkqMTgwLjAvU0VDVE9SUykgJiYKLSAgICAgICAgICAgICAgICAgdGVtcGwuYWxwaGEgPj0gKGFscGhhKjM2MC4wL1NFQ1RPUlMpICYmCi0gICAgICAgICAgICAgICAgIHRlbXBsLmFscGhhIDw9ICgoYWxwaGErMSkqMzYwLjAvU0VDVE9SUykpIHsKLQotICAgICAgICAgICAgICAgIGNsb3NlbCA9IHRlbXBsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgZ2JkIC0+R2FtdXRbdGhldGFdW2FscGhhXS5wID0gY2xvc2VsOwotICAgIGdiZCAtPkdhbXV0W3RoZXRhXVthbHBoYV0uVHlwZSA9IEdQX01PREVMRUQ7Ci0KLSAgICByZXR1cm4gVFJVRTsKLQotfQotCi0KLS8vIEludGVycG9sYXRlIG1pc3NpbmcgcGFydHMuIFRoZSBhbGdvcml0aG0gZmlzdCBjb21wdXRlcyBzbGljZXMgYXQKLS8vIHRoZXRhPTAgYW5kIHRoZXRhPU1heC4KLWNtc0Jvb2wgQ01TRVhQT1JUIGNtc0dEQkNvbXB1dGUoY21zSEFORExFIGhHQkQsIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKQotewotICAgIGludCBhbHBoYSwgdGhldGE7Ci0gICAgY21zR0RCKiBnYmQgPSAoY21zR0RCKikgaEdCRDsKLQotICAgIF9jbXNBc3NlcnQoaEdCRCAhPSBOVUxMKTsKLQotICAgIC8vIEludGVycG9sYXRlIGJsYWNrCi0gICAgZm9yIChhbHBoYSA9IDA7IGFscGhhIDwgU0VDVE9SUzsgYWxwaGErKykgewotCi0gICAgICAgIGlmICghSW50ZXJwb2xhdGVNaXNzaW5nU2VjdG9yKGdiZCwgYWxwaGEsIDApKSByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgLy8gSW50ZXJwb2xhdGUgd2hpdGUKLSAgICBmb3IgKGFscGhhID0gMDsgYWxwaGEgPCBTRUNUT1JTOyBhbHBoYSsrKSB7Ci0KLSAgICAgICAgaWYgKCFJbnRlcnBvbGF0ZU1pc3NpbmdTZWN0b3IoZ2JkLCBhbHBoYSwgU0VDVE9SUy0xKSkgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotCi0gICAgLy8gSW50ZXJwb2xhdGUgTWlkCi0gICAgZm9yICh0aGV0YSA9IDE7IHRoZXRhIDwgU0VDVE9SUzsgdGhldGErKykgewotICAgICAgICBmb3IgKGFscGhhID0gMDsgYWxwaGEgPCBTRUNUT1JTOyBhbHBoYSsrKSB7Ci0KLSAgICAgICAgICAgIGlmICghSW50ZXJwb2xhdGVNaXNzaW5nU2VjdG9yKGdiZCwgYWxwaGEsIHRoZXRhKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gRG9uZQotICAgIHJldHVybiBUUlVFOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihkd0ZsYWdzKTsKLX0KLQotCi0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gR3JlYXQgZm9yIGRlYnVnLCBidXQgbm90IHN1aXRhYmxlIGZvciByZWFsIHVzZQotCi0jaWYgMAotY21zQm9vbCBjbXNHQkRkdW1wVlJNTChjbXNIQU5ETEUgaEdCRCwgY29uc3QgY2hhciogZm5hbWUpCi17Ci0gICAgRklMRSogZnA7Ci0gICAgaW50ICAgaSwgajsKLSAgICBjbXNHREIqIGdiZCA9IChjbXNHREIqKSBoR0JEOwotICAgIGNtc0dEQlBvaW50KiBwdDsKLQotICAgIGZwID0gZm9wZW4gKGZuYW1lLCAid3QiKTsKLSAgICBpZiAoZnAgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotCi0gICAgZnByaW50ZiAoZnAsICIjVlJNTCBWMi4wIHV0ZjhcbiIpOwotCi0gICAgLy8gc2V0IHRoZSB2aWV3aW5nIG9yaWVudGF0aW9uIGFuZCBkaXN0YW5jZQotICAgIGZwcmludGYgKGZwLCAiREVGIENhbVRlc3QgR3JvdXAge1xuIik7Ci0gICAgZnByaW50ZiAoZnAsICJcdGNoaWxkcmVuIFtcbiIpOwotICAgIGZwcmludGYgKGZwLCAiXHRcdERFRiBDYW1lcmFzIEdyb3VwIHtcbiIpOwotICAgIGZwcmludGYgKGZwLCAiXHRcdFx0Y2hpbGRyZW4gW1xuIik7Ci0gICAgZnByaW50ZiAoZnAsICJcdFx0XHRcdERFRiBEZWZhdWx0VmlldyBWaWV3cG9pbnQge1xuIik7Ci0gICAgZnByaW50ZiAoZnAsICJcdFx0XHRcdFx0cG9zaXRpb24gMCAwIDM0MFxuIik7Ci0gICAgZnByaW50ZiAoZnAsICJcdFx0XHRcdFx0b3JpZW50YXRpb24gMCAwIDEgMFxuIik7Ci0gICAgZnByaW50ZiAoZnAsICJcdFx0XHRcdFx0ZGVzY3JpcHRpb24gXCJkZWZhdWx0IHZpZXdcIlxuIik7Ci0gICAgZnByaW50ZiAoZnAsICJcdFx0XHRcdH1cbiIpOwotICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XVxuIik7Ci0gICAgZnByaW50ZiAoZnAsICJcdFx0fSxcbiIpOwotICAgIGZwcmludGYgKGZwLCAiXHRdXG4iKTsKLSAgICBmcHJpbnRmIChmcCwgIn1cbiIpOwotCi0gICAgLy8gT3V0cHV0IHRoZSBiYWNrZ3JvdW5kIHN0dWZmCi0gICAgZnByaW50ZiAoZnAsICJCYWNrZ3JvdW5kIHtcbiIpOwotICAgIGZwcmludGYgKGZwLCAiXHRza3lDb2xvciBbXG4iKTsKLSAgICBmcHJpbnRmIChmcCwgIlx0XHQuNSAuNSAuNVxuIik7Ci0gICAgZnByaW50ZiAoZnAsICJcdF1cbiIpOwotICAgIGZwcmludGYgKGZwLCAifVxuIik7Ci0KLSAgICAvLyBPdXRwdXQgdGhlIHNoYXBlIHN0dWZmCi0gICAgZnByaW50ZiAoZnAsICJUcmFuc2Zvcm0ge1xuIik7Ci0gICAgZnByaW50ZiAoZnAsICJcdHNjYWxlIC4zIC4zIC4zXG4iKTsKLSAgICBmcHJpbnRmIChmcCwgIlx0Y2hpbGRyZW4gW1xuIik7Ci0KLSAgICAvLyBEcmF3IHRoZSBheGVzIGFzIGEgc2hhcGU6Ci0gICAgZnByaW50ZiAoZnAsICJcdFx0U2hhcGUge1xuIik7Ci0gICAgZnByaW50ZiAoZnAsICJcdFx0XHRhcHBlYXJhbmNlIEFwcGVhcmFuY2Uge1xuIik7Ci0gICAgZnByaW50ZiAoZnAsICJcdFx0XHRcdG1hdGVyaWFsIE1hdGVyaWFsIHtcbiIpOwotICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRcdGRpZmZ1c2VDb2xvciAwIDAuOCAwXG4iKTsKLSAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0XHRlbWlzc2l2ZUNvbG9yIDEuMCAxLjAgMS4wXG4iKTsKLSAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0XHRzaGluaW5lc3MgMC44XG4iKTsKLSAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0fVxuIik7Ci0gICAgZnByaW50ZiAoZnAsICJcdFx0XHR9XG4iKTsKLSAgICBmcHJpbnRmIChmcCwgIlx0XHRcdGdlb21ldHJ5IEluZGV4ZWRMaW5lU2V0IHtcbiIpOwotICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRjb29yZCBDb29yZGluYXRlIHtcbiIpOwotICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRcdHBvaW50IFtcbiIpOwotICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRcdDAuMCAwLjAgMC4wLFxuIik7Ci0gICAgZnByaW50ZiAoZnAsICJcdFx0XHRcdFx0JWYgMC4wIDAuMCxcbiIsICAyNTUuMCk7Ci0gICAgZnByaW50ZiAoZnAsICJcdFx0XHRcdFx0MC4wICVmIDAuMCxcbiIsICAyNTUuMCk7Ci0gICAgZnByaW50ZiAoZnAsICJcdFx0XHRcdFx0MC4wIDAuMCAlZl1cbiIsICAyNTUuMCk7Ci0gICAgZnByaW50ZiAoZnAsICJcdFx0XHRcdH1cbiIpOwotICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRjb29yZEluZGV4IFtcbiIpOwotICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRcdDAsIDEsIC0xXG4iKTsKLSAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0XHQwLCAyLCAtMVxuIik7Ci0gICAgZnByaW50ZiAoZnAsICJcdFx0XHRcdFx0MCwgMywgLTFdXG4iKTsKLSAgICBmcHJpbnRmIChmcCwgIlx0XHRcdH1cbiIpOwotICAgIGZwcmludGYgKGZwLCAiXHRcdH1cbiIpOwotCi0KLSAgICBmcHJpbnRmIChmcCwgIlx0XHRTaGFwZSB7XG4iKTsKLSAgICBmcHJpbnRmIChmcCwgIlx0XHRcdGFwcGVhcmFuY2UgQXBwZWFyYW5jZSB7XG4iKTsKLSAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0bWF0ZXJpYWwgTWF0ZXJpYWwge1xuIik7Ci0gICAgZnByaW50ZiAoZnAsICJcdFx0XHRcdFx0ZGlmZnVzZUNvbG9yIDAgMC44IDBcbiIpOwotICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRcdGVtaXNzaXZlQ29sb3IgMSAxIDFcbiIpOwotICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRcdHNoaW5pbmVzcyAwLjhcbiIpOwotICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHR9XG4iKTsKLSAgICBmcHJpbnRmIChmcCwgIlx0XHRcdH1cbiIpOwotICAgIGZwcmludGYgKGZwLCAiXHRcdFx0Z2VvbWV0cnkgUG9pbnRTZXQge1xuIik7Ci0KLSAgICAvLyBmaWxsIGluIHRoZSBwb2ludHMgaGVyZQotICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRjb29yZCBDb29yZGluYXRlIHtcbiIpOwotICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRcdHBvaW50IFtcbiIpOwotCi0gICAgLy8gV2UgbmVlZCB0byB0cmFuc3ZlcnNlIGFsbCBnYW11dCBodWxsLgotICAgIGZvciAoaT0wOyBpIDwgU0VDVE9SUzsgaSsrKQotICAgICAgICBmb3IgKGo9MDsgaiA8IFNFQ1RPUlM7IGorKykgewotCi0gICAgICAgICAgICBjbXNWRUMzIHY7Ci0KLSAgICAgICAgICAgIHB0ID0gJmdiZCAtPkdhbXV0W2ldW2pdOwotICAgICAgICAgICAgVG9DYXJ0ZXNpYW4oJnYsICZwdCAtPnApOwotCi0gICAgICAgICAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0XHQlZyAlZyAlZyIsIHYublswXSs1MCwgdi5uWzFdLCB2Lm5bMl0pOwotCi0gICAgICAgICAgICBpZiAoKGogPT0gU0VDVE9SUyAtIDEpICYmIChpID09IFNFQ1RPUlMgLSAxKSkKLSAgICAgICAgICAgICAgICBmcHJpbnRmIChmcCwgIl1cbiIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGZwcmludGYgKGZwLCAiLFxuIik7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHR9XG4iKTsKLQotCi0KLSAgICAvLyBmaWxsIGluIHRoZSBmYWNlIGNvbG9ycwotICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRjb2xvciBDb2xvciB7XG4iKTsKLSAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0XHRjb2xvciBbXG4iKTsKLQotICAgIGZvciAoaT0wOyBpIDwgU0VDVE9SUzsgaSsrKQotICAgICAgICBmb3IgKGo9MDsgaiA8IFNFQ1RPUlM7IGorKykgewotCi0gICAgICAgICAgIGNtc1ZFQzMgdjsKLQotICAgICAgICAgICAgcHQgPSAmZ2JkIC0+R2FtdXRbaV1bal07Ci0KLQotICAgICAgICAgICAgVG9DYXJ0ZXNpYW4oJnYsICZwdCAtPnApOwotCi0KLSAgICAgICAgaWYgKHB0IC0+VHlwZSA9PSBHUF9FTVBUWSkKLSAgICAgICAgICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRcdCVnICVnICVnIiwgMC4wLCAwLjAsIDAuMCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGlmIChwdCAtPlR5cGUgPT0gR1BfTU9ERUxFRCkKLSAgICAgICAgICAgICAgICBmcHJpbnRmIChmcCwgIlx0XHRcdFx0XHQlZyAlZyAlZyIsIDEuMCwgLjUsIC41KTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGZwcmludGYgKGZwLCAiXHRcdFx0XHRcdCVnICVnICVnIiwgMS4wLCAxLjAsIDEuMCk7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICBpZiAoKGogPT0gU0VDVE9SUyAtIDEpICYmIChpID09IFNFQ1RPUlMgLSAxKSkKLSAgICAgICAgICAgICAgICBmcHJpbnRmIChmcCwgIl1cbiIpOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIGZwcmludGYgKGZwLCAiLFxuIik7Ci0gICAgfQotICAgIGZwcmludGYgKGZwLCAiXHRcdFx0fVxuIik7Ci0KLQotICAgIGZwcmludGYgKGZwLCAiXHRcdFx0fVxuIik7Ci0gICAgZnByaW50ZiAoZnAsICJcdFx0fVxuIik7Ci0gICAgZnByaW50ZiAoZnAsICJcdF1cbiIpOwotICAgIGZwcmludGYgKGZwLCAifVxuIik7Ci0KLSAgICBmY2xvc2UgKGZwKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3R5cGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZjFmYWUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN0eXBlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTYwMyArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNCBNYXJ0aSBNYXJpYSBTYWd1ZXIKLS8vCi0vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLS8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLS8vIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLS8vIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotLy8gYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlCi0vLyBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotLy8KLS8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi0vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLS8vCi0vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLS8vIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTwotLy8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLS8vIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKLS8vIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLS8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgotLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0KLSNpbmNsdWRlICJsY21zMl9pbnRlcm5hbC5oIgotCi0vLyBUYWcgU2VyaWFsaXphdGlvbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGV2ZXJ5IHNpbmdsZSB0YWcgYW5kIHRhZyB0eXBlIGFzIGRlc2NyaWJlZCBpbiB0aGUgSUNDIHNwZWMuIFNvbWUgdHlwZXMKLS8vIGhhdmUgYmVlbiBkZXByZWNhdGVkLCBsaWtlIG5jbCBhbmQgRGF0YS4gVGhlcmUgaXMgbm8gaW1wbGVtZW50YXRpb24gZm9yIHRob3NlIHR5cGVzIGFzIHRoZXJlCi0vLyBhcmUgbm8gcHJvZmlsZXMgaG9sZGluZyB0aGVtLiBUaGUgcHJvZ3JhbW1lciBjYW4gYWxzbyBleHRlbmQgdGhpcyBsaXN0IGJ5IGRlZmluaW5nIGhpcyBvd24gdHlwZXMKLS8vIGJ5IHVzaW5nIHRoZSBhcHByb3BpYXRlIHBsdWctaW4uIFRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBwbHVnIGlucyByZWdhcmRpbmcgdGhhdC4gRmlyc3QgdHlwZQotLy8gYWxsb3dzIHRvIGRlZmluZSBuZXcgdGFncyB1c2luZyBhbnkgZXhpc3RpbmcgdHlwZS4gTmV4dCBwbHVnLWluIHR5cGUgYWxsb3dzIHRvIGRlZmluZSBuZXcgdHlwZXMKLS8vIGFuZCB0aGUgdGhpcmQgb25lIGlzIHZlcnkgc3BlY2lmaWM6IGFsbG93cyB0byBleHRlbmQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgbXVsdGlwcm9jZXNzaW5nCi0vLyBlbGVtZW50cyBzcGVjaWFsIHR5cGUuCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFNvbWUgYnJva2VuIHR5cGVzCi0jZGVmaW5lIGNtc0NvcmJpc0Jyb2tlblhZWnR5cGUgICAgKChjbXNUYWdUeXBlU2lnbmF0dXJlKSAweDE3QTUwNUI4KQotI2RlZmluZSBjbXNNb25hY29Ccm9rZW5DdXJ2ZVR5cGUgICgoY21zVGFnVHlwZVNpZ25hdHVyZSkgMHg5NDc4ZWUwMCkKLQotLy8gVGhpcyBpcyB0aGUgbGlua2VkIGxpc3QgdGhhdCBrZWVwcyB0cmFjayBvZiB0aGUgZGVmaW5lZCB0eXBlcwotdHlwZWRlZiBzdHJ1Y3QgX2Ntc1RhZ1R5cGVMaW5rZWRMaXN0X3N0IHsKLQotICAgIGNtc1RhZ1R5cGVIYW5kbGVyIEhhbmRsZXI7Ci0gICAgc3RydWN0IF9jbXNUYWdUeXBlTGlua2VkTGlzdF9zdCogTmV4dDsKLQotfSBfY21zVGFnVHlwZUxpbmtlZExpc3Q7Ci0KLS8vIFNvbWUgbWFjcm9zIHRvIGRlZmluZSBjYWxsYmFja3MuCi0jZGVmaW5lIFJFQURfRk4oeCkgIFR5cGVfIyN4IyNfUmVhZAotI2RlZmluZSBXUklURV9GTih4KSBUeXBlXyMjeCMjX1dyaXRlCi0jZGVmaW5lIEZSRUVfRk4oeCkgIFR5cGVfIyN4IyNfRnJlZQotI2RlZmluZSBEVVBfRk4oeCkgICBUeXBlXyMjeCMjX0R1cAotCi0vLyBIZWxwZXIgbWFjcm8gdG8gZGVmaW5lIGEgaGFuZGxlci4gQ2FsbGJhY2tzIGRvIGhhdmUgYSBmaXhlZCBuYW1pbmcgY29udmVudGlvbi4KLSNkZWZpbmUgVFlQRV9IQU5ETEVSKHQsIHgpICB7ICh0KSwgUkVBRF9GTih4KSwgV1JJVEVfRk4oeCksIERVUF9GTih4KSwgRlJFRV9GTih4KSwgTlVMTCwgMCB9Ci0KLS8vIEhlbHBlciBtYWNybyB0byBkZWZpbmUgYSBNUEUgaGFuZGxlci4gQ2FsbGJhY2tzIGRvIGhhdmUgYSBmaXhlZCBuYW1pbmcgY29udmVudGlvbgotI2RlZmluZSBUWVBFX01QRV9IQU5ETEVSKHQsIHgpICB7ICh0KSwgUkVBRF9GTih4KSwgV1JJVEVfRk4oeCksIEdlbmVyaWNNUEVkdXAsIEdlbmVyaWNNUEVmcmVlLCBOVUxMLCAwIH0KLQotLy8gUmVnaXN0ZXIgYSBuZXcgdHlwZSBoYW5kbGVyLiBUaGlzIHJvdXRpbmUgaXMgc2hhcmVkIGJldHdlZW4gbm9ybWFsIHR5cGVzIGFuZCBNUEUuIExpbmtlZExpc3QgcG9pbnRzIHRvIHRoZSBvcHRpb25hbCBsaXN0IGhlYWQKLXN0YXRpYwotY21zQm9vbCBSZWdpc3RlclR5cGVzUGx1Z2luKGNtc0NvbnRleHQgaWQsIGNtc1BsdWdpbkJhc2UqIERhdGEsIF9jbXNNZW1vcnlDbGllbnQgcG9zKQotewotICAgIGNtc1BsdWdpblRhZ1R5cGUqIFBsdWdpbiA9IChjbXNQbHVnaW5UYWdUeXBlKikgRGF0YTsKLSAgICBfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSogY3R4ID0gKCBfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoaWQsIHBvcyk7Ci0gICAgX2Ntc1RhZ1R5cGVMaW5rZWRMaXN0ICpwdDsKLQotICAgIC8vIENhbGxpbmcgdGhlIGZ1bmN0aW9uIHdpdGggTlVMTCBhcyBwbHVnLWluIHdvdWxkIHVucmVnaXN0ZXIgdGhlIHBsdWcgaW4uCi0gICAgaWYgKERhdGEgPT0gTlVMTCkgewotCi0gICAgICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2V0IGZyZWUgdGhlIG1lbW9yeSwgYXMgcG9vbCBpcyBkZXN0cm95ZWQgYXMgYSB3aG9sZS4KLSAgICAgICAgY3R4IC0+VGFnVHlwZXMgPSBOVUxMOwotICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICAvLyBSZWdpc3RlcmluZyBoYXBwZW5zIGluIHBsdWctaW4gbWVtb3J5IHBvb2wuCi0gICAgcHQgPSAoX2Ntc1RhZ1R5cGVMaW5rZWRMaXN0KikgX2Ntc1BsdWdpbk1hbGxvYyhpZCwgc2l6ZW9mKF9jbXNUYWdUeXBlTGlua2VkTGlzdCkpOwotICAgIGlmIChwdCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBwdCAtPkhhbmRsZXIgICA9IFBsdWdpbiAtPkhhbmRsZXI7Ci0gICAgcHQgLT5OZXh0ICAgICAgPSBjdHggLT5UYWdUeXBlczsKLQotICAgIGN0eCAtPlRhZ1R5cGVzID0gcHQ7Ci0gICAgIAotICAgIHJldHVybiBUUlVFOwotfQotCi0vLyBSZXR1cm4gaGFuZGxlciBmb3IgYSBnaXZlbiB0eXBlIG9yIE5VTEwgaWYgbm90IGZvdW5kLiBTaGFyZWQgYmV0d2VlbiBub3JtYWwgdHlwZXMgYW5kIE1QRS4gSXQgZmlyc3QgdHJpZXMgdGhlIGFkZGl0b25zIAotLy8gbWFkZSBieSBwbHVnLWlucyBhbmQgdGhlbiB0aGUgYnVpbHQtaW4gZGVmYXVsdHMuCi1zdGF0aWMKLWNtc1RhZ1R5cGVIYW5kbGVyKiBHZXRIYW5kbGVyKGNtc1RhZ1R5cGVTaWduYXR1cmUgc2lnLCBfY21zVGFnVHlwZUxpbmtlZExpc3QqIFBsdWdpbkxpbmtlZExpc3QsIF9jbXNUYWdUeXBlTGlua2VkTGlzdCogRGVmYXVsdExpbmtlZExpc3QpCi17Ci0gICAgX2Ntc1RhZ1R5cGVMaW5rZWRMaXN0KiBwdDsKLQotICAgIGZvciAocHQgPSBQbHVnaW5MaW5rZWRMaXN0OwotICAgICAgICAgcHQgIT0gTlVMTDsKLSAgICAgICAgIHB0ID0gcHQgLT5OZXh0KSB7Ci0KLSAgICAgICAgICAgIGlmIChzaWcgPT0gcHQgLT4gSGFuZGxlci5TaWduYXR1cmUpIHJldHVybiAmcHQgLT5IYW5kbGVyOwotICAgIH0KLQotICAgIGZvciAocHQgPSBEZWZhdWx0TGlua2VkTGlzdDsKLSAgICAgICAgIHB0ICE9IE5VTEw7Ci0gICAgICAgICBwdCA9IHB0IC0+TmV4dCkgewotCi0gICAgICAgICAgICBpZiAoc2lnID09IHB0IC0+IEhhbmRsZXIuU2lnbmF0dXJlKSByZXR1cm4gJnB0IC0+SGFuZGxlcjsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi0vLyBBdXhpbGlhciB0byBjb252ZXJ0IFVURi0zMiB0byBVVEYtMTYgaW4gc29tZSBjYXNlcwotc3RhdGljCi1jbXNCb29sIF9jbXNXcml0ZVdDaGFyQXJyYXkoY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyIG4sIGNvbnN0IHdjaGFyX3QqIEFycmF5KQotewotICAgIGNtc1VJbnQzMk51bWJlciBpOwotCi0gICAgX2Ntc0Fzc2VydChpbyAhPSBOVUxMKTsKLSAgICBfY21zQXNzZXJ0KCEoQXJyYXkgPT0gTlVMTCAmJiBuID4gMCkpOwotCi0gICAgZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIChjbXNVSW50MTZOdW1iZXIpIEFycmF5W2ldKSkgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vLyBBdXhpbGlhciB0byByZWFkIGFuIGFycmF5IG9mIHdjaGFyX3QKLXN0YXRpYwotY21zQm9vbCBfY21zUmVhZFdDaGFyQXJyYXkoY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyIG4sIHdjaGFyX3QqIEFycmF5KQotewotICAgIGNtc1VJbnQzMk51bWJlciBpOwotICAgIGNtc1VJbnQxNk51bWJlciB0bXA7Ci0KLSAgICBfY21zQXNzZXJ0KGlvICE9IE5VTEwpOwotCi0gICAgZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKLQotICAgICAgICBpZiAoQXJyYXkgIT0gTlVMTCkgewotCi0gICAgICAgICAgICBpZiAoIV9jbXNSZWFkVUludDE2TnVtYmVyKGlvLCAmdG1wKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgQXJyYXlbaV0gPSAod2NoYXJfdCkgdG1wOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgTlVMTCkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotCi0gICAgfQotICAgIHJldHVybiBUUlVFOwotfQotCi0vLyBUbyBkZWFsIHdpdGggcG9zaXRpb24gdGFibGVzCi10eXBlZGVmIGNtc0Jvb2wgKCogUG9zaXRpb25UYWJsZUVudHJ5Rm4pKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0lPSEFORExFUiogaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBDYXJnbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZyk7Ci0KLS8vIEhlbHBlciBmdW5jdGlvbiB0byBkZWFsIHdpdGggcG9zaXRpb24gdGFibGVzIGFzIGRlY3JpYmVkIGluIElDQyBzcGVjIDQuMwotLy8gQSB0YWJsZSBvZiBuIGVsZW1lbnRzIGlzIHJlYWRlZCwgd2hlcmUgZmlyc3QgY29tZXMgbiByZWNvcmRzIGNvbnRhaW5pbmcgb2Zmc2V0cyBhbmQgc2l6ZXMgYW5kCi0vLyB0aGVuIGEgYmxvY2sgY29udGFpbmluZyB0aGUgZGF0YSBpdHNlbGYuIFRoaXMgYWxsb3dzIHRvIHJldXNlIHNhbWUgZGF0YSBpbiBtb3JlIHRoYW4gb25lIGVudHJ5Ci1zdGF0aWMKLWNtc0Jvb2wgUmVhZFBvc2l0aW9uVGFibGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSU9IQU5ETEVSKiBpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBCYXNlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqQ2FyZ28sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NpdGlvblRhYmxlRW50cnlGbiBFbGVtZW50Rm4pCi17Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0gICAgY21zVUludDMyTnVtYmVyICpFbGVtZW50T2Zmc2V0cyA9IE5VTEwsICpFbGVtZW50U2l6ZXMgPSBOVUxMOwotCi0gICAgLy8gTGV0J3MgdGFrZSB0aGUgb2Zmc2V0cyB0byBlYWNoIGVsZW1lbnQKLSAgICBFbGVtZW50T2Zmc2V0cyA9IChjbXNVSW50MzJOdW1iZXIgKikgX2Ntc0NhbGxvYyhpbyAtPkNvbnRleHRJRCwgQ291bnQsIHNpemVvZihjbXNVSW50MzJOdW1iZXIpKTsKLSAgICBpZiAoRWxlbWVudE9mZnNldHMgPT0gTlVMTCkgZ290byBFcnJvcjsKLQotICAgIEVsZW1lbnRTaXplcyA9IChjbXNVSW50MzJOdW1iZXIgKikgX2Ntc0NhbGxvYyhpbyAtPkNvbnRleHRJRCwgQ291bnQsIHNpemVvZihjbXNVSW50MzJOdW1iZXIpKTsKLSAgICBpZiAoRWxlbWVudFNpemVzID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IENvdW50OyBpKyspIHsKLQotICAgICAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmRWxlbWVudE9mZnNldHNbaV0pKSBnb3RvIEVycm9yOwotICAgICAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmRWxlbWVudFNpemVzW2ldKSkgZ290byBFcnJvcjsKLQotICAgICAgICBFbGVtZW50T2Zmc2V0c1tpXSArPSBCYXNlT2Zmc2V0OwotICAgIH0KLQotICAgIC8vIFNlZWsgdG8gZWFjaCBlbGVtZW50IGFuZCByZWFkIGl0Ci0gICAgZm9yIChpPTA7IGkgPCBDb3VudDsgaSsrKSB7Ci0KLSAgICAgICAgaWYgKCFpbyAtPiBTZWVrKGlvLCBFbGVtZW50T2Zmc2V0c1tpXSkpIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAgLy8gVGhpcyBpcyB0aGUgcmVhZGVyIGNhbGxiYWNrCi0gICAgICAgIGlmICghRWxlbWVudEZuKHNlbGYsIGlvLCBDYXJnbywgaSwgRWxlbWVudFNpemVzW2ldKSkgZ290byBFcnJvcjsKLSAgICB9Ci0KLSAgICAvLyBTdWNjZXNzCi0gICAgaWYgKEVsZW1lbnRPZmZzZXRzICE9IE5VTEwpIF9jbXNGcmVlKGlvIC0+Q29udGV4dElELCBFbGVtZW50T2Zmc2V0cyk7Ci0gICAgaWYgKEVsZW1lbnRTaXplcyAhPSBOVUxMKSBfY21zRnJlZShpbyAtPkNvbnRleHRJRCwgRWxlbWVudFNpemVzKTsKLSAgICByZXR1cm4gVFJVRTsKLQotRXJyb3I6Ci0gICAgaWYgKEVsZW1lbnRPZmZzZXRzICE9IE5VTEwpIF9jbXNGcmVlKGlvIC0+Q29udGV4dElELCBFbGVtZW50T2Zmc2V0cyk7Ci0gICAgaWYgKEVsZW1lbnRTaXplcyAhPSBOVUxMKSBfY21zRnJlZShpbyAtPkNvbnRleHRJRCwgRWxlbWVudFNpemVzKTsKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLS8vIFNhbWUgYXMgYW50ZXJpb3IsIGJ1dCBmb3Igd3JpdGUgcG9zaXRpb24gdGFibGVzCi1zdGF0aWMKLWNtc0Jvb2wgV3JpdGVQb3NpdGlvblRhYmxlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNJT0hBTkRMRVIqIGlvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBCYXNlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNhcmdvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc2l0aW9uVGFibGVFbnRyeUZuIEVsZW1lbnRGbikKLXsKLSAgICBjbXNVSW50MzJOdW1iZXIgaTsKLSAgICBjbXNVSW50MzJOdW1iZXIgRGlyZWN0b3J5UG9zLCBDdXJyZW50UG9zLCBCZWZvcmU7Ci0gICAgY21zVUludDMyTnVtYmVyICpFbGVtZW50T2Zmc2V0cyA9IE5VTEwsICpFbGVtZW50U2l6ZXMgPSBOVUxMOwotCi0gICAgIC8vIENyZWF0ZSB0YWJsZQotICAgIEVsZW1lbnRPZmZzZXRzID0gKGNtc1VJbnQzMk51bWJlciAqKSBfY21zQ2FsbG9jKGlvIC0+Q29udGV4dElELCBDb3VudCwgc2l6ZW9mKGNtc1VJbnQzMk51bWJlcikpOwotICAgIGlmIChFbGVtZW50T2Zmc2V0cyA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgRWxlbWVudFNpemVzID0gKGNtc1VJbnQzMk51bWJlciAqKSBfY21zQ2FsbG9jKGlvIC0+Q29udGV4dElELCBDb3VudCwgc2l6ZW9mKGNtc1VJbnQzMk51bWJlcikpOwotICAgIGlmIChFbGVtZW50U2l6ZXMgPT0gTlVMTCkgZ290byBFcnJvcjsKLQotICAgIC8vIEtlZXAgc3RhcnRpbmcgcG9zaXRpb24gb2YgY3VydmUgb2Zmc2V0cwotICAgIERpcmVjdG9yeVBvcyA9IGlvIC0+VGVsbChpbyk7Ci0KLSAgICAvLyBXcml0ZSBhIGZha2UgZGlyZWN0b3J5IHRvIGJlIGZpbGxlZCBsYXR0ZXIgb24KLSAgICBmb3IgKGk9MDsgaSA8IENvdW50OyBpKyspIHsKLQotICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgMCkpIGdvdG8gRXJyb3I7ICAvLyBPZmZzZXQKLSAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIDApKSBnb3RvIEVycm9yOyAgLy8gc2l6ZQotICAgIH0KLQotICAgIC8vIFdyaXRlIGVhY2ggZWxlbWVudC4gS2VlcCB0cmFjayBvZiB0aGUgc2l6ZSBhcyB3ZWxsLgotICAgIGZvciAoaT0wOyBpIDwgQ291bnQ7IGkrKykgewotCi0gICAgICAgIEJlZm9yZSA9IGlvIC0+VGVsbChpbyk7Ci0gICAgICAgIEVsZW1lbnRPZmZzZXRzW2ldID0gQmVmb3JlIC0gQmFzZU9mZnNldDsKLQotICAgICAgICAvLyBDYWxsYmFjayB0byB3cml0ZS4uLgotICAgICAgICBpZiAoIUVsZW1lbnRGbihzZWxmLCBpbywgQ2FyZ28sIGksIFNpemVPZlRhZykpIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAgLy8gTm93IHRoZSBzaXplCi0gICAgICAgIEVsZW1lbnRTaXplc1tpXSA9IGlvIC0+VGVsbChpbykgLSBCZWZvcmU7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdGhlIGRpcmVjdG9yeQotICAgIEN1cnJlbnRQb3MgPSBpbyAtPlRlbGwoaW8pOwotICAgIGlmICghaW8gLT5TZWVrKGlvLCBEaXJlY3RvcnlQb3MpKSBnb3RvIEVycm9yOwotCi0gICAgZm9yIChpPTA7IGkgPCAgQ291bnQ7IGkrKykgewotICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgRWxlbWVudE9mZnNldHNbaV0pKSBnb3RvIEVycm9yOwotICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgRWxlbWVudFNpemVzW2ldKSkgZ290byBFcnJvcjsKLSAgICB9Ci0KLSAgICBpZiAoIWlvIC0+U2VlayhpbywgQ3VycmVudFBvcykpIGdvdG8gRXJyb3I7Ci0KLSAgICBpZiAoRWxlbWVudE9mZnNldHMgIT0gTlVMTCkgX2Ntc0ZyZWUoaW8gLT5Db250ZXh0SUQsIEVsZW1lbnRPZmZzZXRzKTsKLSAgICBpZiAoRWxlbWVudFNpemVzICE9IE5VTEwpIF9jbXNGcmVlKGlvIC0+Q29udGV4dElELCBFbGVtZW50U2l6ZXMpOwotICAgIHJldHVybiBUUlVFOwotCi1FcnJvcjoKLSAgICBpZiAoRWxlbWVudE9mZnNldHMgIT0gTlVMTCkgX2Ntc0ZyZWUoaW8gLT5Db250ZXh0SUQsIEVsZW1lbnRPZmZzZXRzKTsKLSAgICBpZiAoRWxlbWVudFNpemVzICE9IE5VTEwpIF9jbXNGcmVlKGlvIC0+Q29udGV4dElELCBFbGVtZW50U2l6ZXMpOwotICAgIHJldHVybiBGQUxTRTsKLX0KLQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gVHlwZSBYWVouIE9ubHkgb25lIHZhbHVlIGlzIGFsbG93ZWQKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLS8vVGhlIFhZWlR5cGUgY29udGFpbnMgYW4gYXJyYXkgb2YgdGhyZWUgZW5jb2RlZCB2YWx1ZXMgZm9yIHRoZSBYWVogdHJpc3RpbXVsdXMKLS8vdmFsdWVzLiBUcmlzdGltdWx1cyB2YWx1ZXMgbXVzdCBiZSBub24tbmVnYXRpdmUuIFRoZSBzaWduZWQgZW5jb2RpbmcgYWxsb3dzIGZvcgotLy9pbXBsZW1lbnRhdGlvbiBvcHRpbWl6YXRpb25zIGJ5IG1pbmltaXppbmcgdGhlIG51bWJlciBvZiBmaXhlZCBmb3JtYXRzLgotCi0KLXN0YXRpYwotdm9pZCAqVHlwZV9YWVpfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQotewotICAgIGNtc0NJRVhZWiogeHl6OwotCi0gICAgKm5JdGVtcyA9IDA7Ci0gICAgeHl6ID0gKGNtc0NJRVhZWiopIF9jbXNNYWxsb2NaZXJvKHNlbGYgLT5Db250ZXh0SUQsIHNpemVvZihjbXNDSUVYWVopKTsKLSAgICBpZiAoeHl6ID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgaWYgKCFfY21zUmVhZFhZWk51bWJlcihpbywgeHl6KSkgewotICAgICAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCB4eXopOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAqbkl0ZW1zID0gMTsKLSAgICByZXR1cm4gKHZvaWQqKSB4eXo7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFNpemVPZlRhZyk7Ci19Ci0KLXN0YXRpYwotY21zQm9vbCAgVHlwZV9YWVpfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCi17Ci0gICAgcmV0dXJuIF9jbXNXcml0ZVhZWk51bWJlcihpbywgKGNtc0NJRVhZWiopIFB0cik7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKLX0KLQotc3RhdGljCi12b2lkKiBUeXBlX1hZWl9EdXAoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjb25zdCB2b2lkICpQdHIsIGNtc1VJbnQzMk51bWJlciBuKQotewotICAgIHJldHVybiBfY21zRHVwTWVtKHNlbGYgLT5Db250ZXh0SUQsIFB0ciwgc2l6ZW9mKGNtc0NJRVhZWikpOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKLX0KLQotc3RhdGljCi12b2lkIFR5cGVfWFlaX0ZyZWUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCB2b2lkICpQdHIpCi17Ci0gICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgUHRyKTsKLX0KLQotCi1zdGF0aWMKLWNtc1RhZ1R5cGVTaWduYXR1cmUgRGVjaWRlWFladHlwZShjbXNGbG9hdDY0TnVtYmVyIElDQ1ZlcnNpb24sIGNvbnN0IHZvaWQgKkRhdGEpCi17Ci0gICAgcmV0dXJuIGNtc1NpZ1hZWlR5cGU7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKElDQ1ZlcnNpb24pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoRGF0YSk7Ci19Ci0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIFR5cGUgY2hyb21hdGljaXR5LiBPbmx5IG9uZSB2YWx1ZSBpcyBhbGxvd2VkCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gVGhlIGNocm9tYXRpY2l0eSB0YWcgdHlwZSBwcm92aWRlcyBiYXNpYyBjaHJvbWF0aWNpdHkgZGF0YSBhbmQgdHlwZSBvZgotLy8gcGhvc3Bob3JzIG9yIGNvbG9yYW50cyBvZiBhIG1vbml0b3IgdG8gYXBwbGljYXRpb25zIGFuZCB1dGlsaXRpZXMuCi0KLXN0YXRpYwotdm9pZCAqVHlwZV9DaHJvbWF0aWNpdHlfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQotewotICAgIGNtc0NJRXh5WVRSSVBMRSogY2hybTsKLSAgICBjbXNVSW50MTZOdW1iZXIgbkNoYW5zLCBUYWJsZTsKLQotICAgICpuSXRlbXMgPSAwOwotICAgIGNocm0gPSAgKGNtc0NJRXh5WVRSSVBMRSopIF9jbXNNYWxsb2NaZXJvKHNlbGYgLT5Db250ZXh0SUQsIHNpemVvZihjbXNDSUV4eVlUUklQTEUpKTsKLSAgICBpZiAoY2hybSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sICZuQ2hhbnMpKSBnb3RvIEVycm9yOwotCi0gICAgLy8gTGV0J3MgcmVjb3ZlciBmcm9tIGEgYnVnIGludHJvZHVjZWQgaW4gZWFybHkgdmVyc2lvbnMgb2YgbGNtczEKLSAgICBpZiAobkNoYW5zID09IDAgJiYgU2l6ZU9mVGFnID09IDMyKSB7Ci0KLSAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgTlVMTCkpIGdvdG8gRXJyb3I7Ci0gICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sICZuQ2hhbnMpKSBnb3RvIEVycm9yOwotICAgIH0KLQotICAgIGlmIChuQ2hhbnMgIT0gMykgZ290byBFcnJvcjsKLQotICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sICZUYWJsZSkpIGdvdG8gRXJyb3I7Ci0KLSAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAmY2hybSAtPlJlZC54KSkgZ290byBFcnJvcjsKLSAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAmY2hybSAtPlJlZC55KSkgZ290byBFcnJvcjsKLQotICAgIGNocm0gLT5SZWQuWSA9IDEuMDsKLQotICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICZjaHJtIC0+R3JlZW4ueCkpIGdvdG8gRXJyb3I7Ci0gICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgJmNocm0gLT5HcmVlbi55KSkgZ290byBFcnJvcjsKLQotICAgIGNocm0gLT5HcmVlbi5ZID0gMS4wOwotCi0gICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgJmNocm0gLT5CbHVlLngpKSBnb3RvIEVycm9yOwotICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICZjaHJtIC0+Qmx1ZS55KSkgZ290byBFcnJvcjsKLQotICAgIGNocm0gLT5CbHVlLlkgPSAxLjA7Ci0KLSAgICAqbkl0ZW1zID0gMTsKLSAgICByZXR1cm4gKHZvaWQqKSBjaHJtOwotCi1FcnJvcjoKLSAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCAodm9pZCopIGNocm0pOwotICAgIHJldHVybiBOVUxMOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTaXplT2ZUYWcpOwotfQotCi1zdGF0aWMKLWNtc0Jvb2wgIFNhdmVPbmVDaHJvbWF0aWNpdHkoY21zRmxvYXQ2NE51bWJlciB4LCBjbXNGbG9hdDY0TnVtYmVyIHksIGNtc0lPSEFORExFUiogaW8pCi17Ci0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIF9jbXNEb3VibGVUbzE1Rml4ZWQxNih4KSkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgX2Ntc0RvdWJsZVRvMTVGaXhlZDE2KHkpKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLXN0YXRpYwotY21zQm9vbCAgVHlwZV9DaHJvbWF0aWNpdHlfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCi17Ci0gICAgY21zQ0lFeHlZVFJJUExFKiBjaHJtID0gKGNtc0NJRXh5WVRSSVBMRSopIFB0cjsKLQotICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCAzKSkgcmV0dXJuIEZBTFNFOyAgICAgICAgLy8gbkNoYW5uZWxzCi0gICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7ICAgICAgICAvLyBUYWJsZQotCi0gICAgaWYgKCFTYXZlT25lQ2hyb21hdGljaXR5KGNocm0gLT4gUmVkLngsICAgY2hybSAtPiBSZWQueSwgaW8pKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFTYXZlT25lQ2hyb21hdGljaXR5KGNocm0gLT4gR3JlZW4ueCwgY2hybSAtPiBHcmVlbi55LCBpbykpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIVNhdmVPbmVDaHJvbWF0aWNpdHkoY2hybSAtPiBCbHVlLngsICBjaHJtIC0+IEJsdWUueSwgaW8pKSByZXR1cm4gRkFMU0U7Ci0KLSAgICByZXR1cm4gVFJVRTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobkl0ZW1zKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOwotfQotCi1zdGF0aWMKLXZvaWQqIFR5cGVfQ2hyb21hdGljaXR5X0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQgKlB0ciwgY21zVUludDMyTnVtYmVyIG4pCi17Ci0gICAgcmV0dXJuIF9jbXNEdXBNZW0oc2VsZiAtPkNvbnRleHRJRCwgUHRyLCBzaXplb2YoY21zQ0lFeHlZVFJJUExFKSk7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOwotfQotCi1zdGF0aWMKLXZvaWQgVHlwZV9DaHJvbWF0aWNpdHlfRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQqIFB0cikKLXsKLSAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBQdHIpOwotfQotCi0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBUeXBlIGNtc1NpZ0NvbG9yYW50T3JkZXJUeXBlCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0vLyBUaGlzIGlzIGFuIG9wdGlvbmFsIHRhZyB3aGljaCBzcGVjaWZpZXMgdGhlIGxheWRvd24gb3JkZXIgaW4gd2hpY2ggY29sb3JhbnRzIHdpbGwKLS8vIGJlIHByaW50ZWQgb24gYW4gbi1jb2xvcmFudCBkZXZpY2UuIFRoZSBsYXlkb3duIG9yZGVyIG1heSBiZSB0aGUgc2FtZSBhcyB0aGUKLS8vIGNoYW5uZWwgZ2VuZXJhdGlvbiBvcmRlciBsaXN0ZWQgaW4gdGhlIGNvbG9yYW50VGFibGVUYWcgb3IgdGhlIGNoYW5uZWwgb3JkZXIgb2YgYQotLy8gY29sb3VyIHNwYWNlIHN1Y2ggYXMgQ01ZSywgaW4gd2hpY2ggY2FzZSB0aGlzIHRhZyBpcyBub3QgbmVlZGVkLiBXaGVuIHRoaXMgaXMgbm90Ci0vLyB0aGUgY2FzZSAoZm9yIGV4YW1wbGUsIGluay10b3dlcnMgc29tZXRpbWVzIHVzZSB0aGUgb3JkZXIgS0NNWSksIHRoaXMgdGFnIG1heSBiZQotLy8gdXNlZCB0byBzcGVjaWZ5IHRoZSBsYXlkb3duIG9yZGVyIG9mIHRoZSBjb2xvcmFudHMuCi0KLQotc3RhdGljCi12b2lkICpUeXBlX0NvbG9yYW50T3JkZXJUeXBlX1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG5JdGVtcywgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKLXsKLSAgICBjbXNVSW50OE51bWJlciogQ29sb3JhbnRPcmRlcjsKLSAgICBjbXNVSW50MzJOdW1iZXIgQ291bnQ7Ci0KLSAgICAqbkl0ZW1zID0gMDsKLSAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmQ291bnQpKSByZXR1cm4gTlVMTDsKLSAgICBpZiAoQ291bnQgPiBjbXNNQVhDSEFOTkVMUykgcmV0dXJuIE5VTEw7Ci0KLSAgICBDb2xvcmFudE9yZGVyID0gKGNtc1VJbnQ4TnVtYmVyKikgX2Ntc0NhbGxvYyhzZWxmIC0+Q29udGV4dElELCBjbXNNQVhDSEFOTkVMUywgc2l6ZW9mKGNtc1VJbnQ4TnVtYmVyKSk7Ci0gICAgaWYgKENvbG9yYW50T3JkZXIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICAvLyBXZSB1c2UgRkYgYXMgZW5kIG1hcmtlcgotICAgIG1lbXNldChDb2xvcmFudE9yZGVyLCAweEZGLCBjbXNNQVhDSEFOTkVMUyAqIHNpemVvZihjbXNVSW50OE51bWJlcikpOwotCi0gICAgaWYgKGlvIC0+UmVhZChpbywgQ29sb3JhbnRPcmRlciwgc2l6ZW9mKGNtc1VJbnQ4TnVtYmVyKSwgQ291bnQpICE9IENvdW50KSB7Ci0KLSAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgKHZvaWQqKSBDb2xvcmFudE9yZGVyKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgKm5JdGVtcyA9IDE7Ci0gICAgcmV0dXJuICh2b2lkKikgQ29sb3JhbnRPcmRlcjsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU2l6ZU9mVGFnKTsKLX0KLQotc3RhdGljCi1jbXNCb29sIFR5cGVfQ29sb3JhbnRPcmRlclR5cGVfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCi17Ci0gICAgY21zVUludDhOdW1iZXIqICBDb2xvcmFudE9yZGVyID0gKGNtc1VJbnQ4TnVtYmVyKikgUHRyOwotICAgIGNtc1VJbnQzMk51bWJlciBpLCBzeiwgQ291bnQ7Ci0KLSAgICAvLyBHZXQgdGhlIGxlbmd0aAotICAgIGZvciAoQ291bnQ9aT0wOyBpIDwgY21zTUFYQ0hBTk5FTFM7IGkrKykgewotICAgICAgICBpZiAoQ29sb3JhbnRPcmRlcltpXSAhPSAweEZGKSBDb3VudCsrOwotICAgIH0KLQotICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBDb3VudCkpIHJldHVybiBGQUxTRTsKLQotICAgIHN6ID0gQ291bnQgKiBzaXplb2YoY21zVUludDhOdW1iZXIpOwotICAgIGlmICghaW8gLT4gV3JpdGUoaW8sIHN6LCBDb2xvcmFudE9yZGVyKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgcmV0dXJuIFRSVUU7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKLX0KLQotc3RhdGljCi12b2lkKiBUeXBlX0NvbG9yYW50T3JkZXJUeXBlX0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQgKlB0ciwgY21zVUludDMyTnVtYmVyIG4pCi17Ci0gICAgcmV0dXJuIF9jbXNEdXBNZW0oc2VsZiAtPkNvbnRleHRJRCwgUHRyLCBjbXNNQVhDSEFOTkVMUyAqIHNpemVvZihjbXNVSW50OE51bWJlcikpOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKLX0KLQotCi1zdGF0aWMKLXZvaWQgVHlwZV9Db2xvcmFudE9yZGVyVHlwZV9GcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCogUHRyKQotewotICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFB0cik7Ci19Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBUeXBlIGNtc1NpZ1MxNUZpeGVkMTZBcnJheVR5cGUKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBUaGlzIHR5cGUgcmVwcmVzZW50cyBhbiBhcnJheSBvZiBnZW5lcmljIDQtYnl0ZS8zMi1iaXQgZml4ZWQgcG9pbnQgcXVhbnRpdHkuCi0vLyBUaGUgbnVtYmVyIG9mIHZhbHVlcyBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIHNpemUgb2YgdGhlIHRhZy4KLQotc3RhdGljCi12b2lkICpUeXBlX1MxNUZpeGVkMTZfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQotewotICAgIGNtc0Zsb2F0NjROdW1iZXIqICBhcnJheV9kb3VibGU7Ci0gICAgY21zVUludDMyTnVtYmVyIGksIG47Ci0KLSAgICAqbkl0ZW1zID0gMDsKLSAgICBuID0gU2l6ZU9mVGFnIC8gc2l6ZW9mKGNtc1VJbnQzMk51bWJlcik7Ci0gICAgYXJyYXlfZG91YmxlID0gKGNtc0Zsb2F0NjROdW1iZXIqKSBfY21zQ2FsbG9jKHNlbGYgLT5Db250ZXh0SUQsIG4sIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKSk7Ci0gICAgaWYgKGFycmF5X2RvdWJsZSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7Ci0KLSAgICAgICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgJmFycmF5X2RvdWJsZVtpXSkpIHsKLQotICAgICAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgYXJyYXlfZG91YmxlKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgKm5JdGVtcyA9IG47Ci0gICAgcmV0dXJuICh2b2lkKikgYXJyYXlfZG91YmxlOwotfQotCi1zdGF0aWMKLWNtc0Jvb2wgVHlwZV9TMTVGaXhlZDE2X1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQotewotICAgIGNtc0Zsb2F0NjROdW1iZXIqIFZhbHVlID0gKGNtc0Zsb2F0NjROdW1iZXIqKSBQdHI7Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG5JdGVtczsgaSsrKSB7Ci0KLSAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIFZhbHVlW2ldKSkgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKLX0KLQotc3RhdGljCi12b2lkKiBUeXBlX1MxNUZpeGVkMTZfRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKLXsKLSAgICByZXR1cm4gX2Ntc0R1cE1lbShzZWxmIC0+Q29udGV4dElELCBQdHIsIG4gKiBzaXplb2YoY21zRmxvYXQ2NE51bWJlcikpOwotfQotCi0KLXN0YXRpYwotdm9pZCBUeXBlX1MxNUZpeGVkMTZfRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQqIFB0cikKLXsKLSAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBQdHIpOwotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gVHlwZSBjbXNTaWdVMTZGaXhlZDE2QXJyYXlUeXBlCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gVGhpcyB0eXBlIHJlcHJlc2VudHMgYW4gYXJyYXkgb2YgZ2VuZXJpYyA0LWJ5dGUvMzItYml0IHF1YW50aXR5LgotLy8gVGhlIG51bWJlciBvZiB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBmcm9tIHRoZSBzaXplIG9mIHRoZSB0YWcuCi0KLQotc3RhdGljCi12b2lkICpUeXBlX1UxNkZpeGVkMTZfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQotewotICAgIGNtc0Zsb2F0NjROdW1iZXIqICBhcnJheV9kb3VibGU7Ci0gICAgY21zVUludDMyTnVtYmVyIHY7Ci0gICAgY21zVUludDMyTnVtYmVyIGksIG47Ci0KLSAgICAqbkl0ZW1zID0gMDsKLSAgICBuID0gU2l6ZU9mVGFnIC8gc2l6ZW9mKGNtc1VJbnQzMk51bWJlcik7Ci0gICAgYXJyYXlfZG91YmxlID0gKGNtc0Zsb2F0NjROdW1iZXIqKSBfY21zQ2FsbG9jKHNlbGYgLT5Db250ZXh0SUQsIG4sIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKSk7Ci0gICAgaWYgKGFycmF5X2RvdWJsZSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7Ci0KLSAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJnYpKSB7Ci0gICAgICAgICAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCAodm9pZCopIGFycmF5X2RvdWJsZSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvbnZlcnQgdG8gY21zRmxvYXQ2NE51bWJlcgotICAgICAgICBhcnJheV9kb3VibGVbaV0gPSAgKGNtc0Zsb2F0NjROdW1iZXIpICh2IC8gNjU1MzYuMCk7Ci0gICAgfQotCi0gICAgKm5JdGVtcyA9IG47Ci0gICAgcmV0dXJuICh2b2lkKikgYXJyYXlfZG91YmxlOwotfQotCi1zdGF0aWMKLWNtc0Jvb2wgVHlwZV9VMTZGaXhlZDE2X1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQotewotICAgIGNtc0Zsb2F0NjROdW1iZXIqIFZhbHVlID0gKGNtc0Zsb2F0NjROdW1iZXIqKSBQdHI7Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG5JdGVtczsgaSsrKSB7Ci0KLSAgICAgICAgY21zVUludDMyTnVtYmVyIHYgPSAoY21zVUludDMyTnVtYmVyKSBmbG9vcihWYWx1ZVtpXSo2NTUzNi4wICsgMC41KTsKLQotICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgdikpIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Ci19Ci0KLQotc3RhdGljCi12b2lkKiBUeXBlX1UxNkZpeGVkMTZfRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKLXsKLSAgICByZXR1cm4gX2Ntc0R1cE1lbShzZWxmIC0+Q29udGV4dElELCBQdHIsIG4gKiBzaXplb2YoY21zRmxvYXQ2NE51bWJlcikpOwotfQotCi1zdGF0aWMKLXZvaWQgVHlwZV9VMTZGaXhlZDE2X0ZyZWUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCB2b2lkKiBQdHIpCi17Ci0gICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgUHRyKTsKLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIFR5cGUgY21zU2lnU2lnbmF0dXJlVHlwZQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vCi0vLyBUaGUgc2lnbmF0dXJlVHlwZSBjb250YWlucyBhIGZvdXItYnl0ZSBzZXF1ZW5jZSwgU2VxdWVuY2VzIG9mIGxlc3MgdGhhbiBmb3VyCi0vLyBjaGFyYWN0ZXJzIGFyZSBwYWRkZWQgYXQgdGhlIGVuZCB3aXRoIHNwYWNlcywgMjBoLgotLy8gVHlwaWNhbGx5IHRoaXMgdHlwZSBpcyB1c2VkIGZvciByZWdpc3RlcmVkIHRhZ3MgdGhhdCBjYW4gYmUgZGlzcGxheWVkIG9uIG1hbnkKLS8vIGRldmVsb3BtZW50IHN5c3RlbXMgYXMgYSBzZXF1ZW5jZSBvZiBmb3VyIGNoYXJhY3RlcnMuCi0KLXN0YXRpYwotdm9pZCAqVHlwZV9TaWduYXR1cmVfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQotewotICAgIGNtc1NpZ25hdHVyZSogU2lnUHRyID0gKGNtc1NpZ25hdHVyZSopIF9jbXNNYWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgc2l6ZW9mKGNtc1NpZ25hdHVyZSkpOwotICAgIGlmIChTaWdQdHIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgU2lnUHRyKSkgcmV0dXJuIE5VTEw7Ci0gICAgICpuSXRlbXMgPSAxOwotCi0gICAgIHJldHVybiBTaWdQdHI7Ci0KLSAgICAgY21zVU5VU0VEX1BBUkFNRVRFUihTaXplT2ZUYWcpOwotfQotCi1zdGF0aWMKLWNtc0Jvb2wgIFR5cGVfU2lnbmF0dXJlX1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQotewotICAgIGNtc1NpZ25hdHVyZSogU2lnUHRyID0gKGNtc1NpZ25hdHVyZSopIFB0cjsKLQotICAgIHJldHVybiBfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sICpTaWdQdHIpOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuSXRlbXMpOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Ci19Ci0KLXN0YXRpYwotdm9pZCogVHlwZV9TaWduYXR1cmVfRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKLXsKLSAgICByZXR1cm4gX2Ntc0R1cE1lbShzZWxmIC0+Q29udGV4dElELCBQdHIsIG4gKiBzaXplb2YoY21zU2lnbmF0dXJlKSk7Ci19Ci0KLXN0YXRpYwotdm9pZCBUeXBlX1NpZ25hdHVyZV9GcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCogUHRyKQotewotICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFB0cik7Ci19Ci0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIFR5cGUgY21zU2lnVGV4dFR5cGUKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLwotLy8gVGhlIHRleHRUeXBlIGlzIGEgc2ltcGxlIHRleHQgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgYSA3LWJpdCBBU0NJSSB0ZXh0IHN0cmluZy4KLS8vIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBpcyBvYnRhaW5lZCBieSBzdWJ0cmFjdGluZyA4IGZyb20gdGhlIGVsZW1lbnQgc2l6ZSBwb3J0aW9uCi0vLyBvZiB0aGUgdGFnIGl0c2VsZi4gVGhpcyBzdHJpbmcgbXVzdCBiZSB0ZXJtaW5hdGVkIHdpdGggYSAwMGggYnl0ZS4KLQotc3RhdGljCi12b2lkICpUeXBlX1RleHRfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQotewotICAgIGNoYXIqIFRleHQgPSBOVUxMOwotICAgIGNtc01MVSogbWx1ID0gTlVMTDsKLQotICAgIC8vIENyZWF0ZSBhIGNvbnRhaW5lcgotICAgIG1sdSA9IGNtc01MVWFsbG9jKHNlbGYgLT5Db250ZXh0SUQsIDEpOwotICAgIGlmIChtbHUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICAqbkl0ZW1zID0gMDsKLQotICAgIC8vIFdlIG5lZWQgdG8gc3RvcmUgdGhlICJcMCIgYXQgdGhlIGVuZCwgc28gKzEKLSAgICBpZiAoU2l6ZU9mVGFnID09IFVJTlRfTUFYKSBnb3RvIEVycm9yOwotCi0gICAgVGV4dCA9IChjaGFyKikgX2Ntc01hbGxvYyhzZWxmIC0+Q29udGV4dElELCBTaXplT2ZUYWcgKyAxKTsKLSAgICBpZiAoVGV4dCA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgaWYgKGlvIC0+IFJlYWQoaW8sIFRleHQsIHNpemVvZihjaGFyKSwgU2l6ZU9mVGFnKSAhPSBTaXplT2ZUYWcpIGdvdG8gRXJyb3I7Ci0KLSAgICAvLyBNYWtlIHN1cmUgdGV4dCBpcyBwcm9wZXJseSBlbmRlZAotICAgIFRleHRbU2l6ZU9mVGFnXSA9IDA7Ci0gICAgKm5JdGVtcyA9IDE7Ci0KLSAgICAvLyBLZWVwIHRoZSByZXN1bHQKLSAgICBpZiAoIWNtc01MVXNldEFTQ0lJKG1sdSwgY21zTm9MYW5ndWFnZSwgY21zTm9Db3VudHJ5LCBUZXh0KSkgZ290byBFcnJvcjsKLQotICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFRleHQpOwotICAgIHJldHVybiAodm9pZCopIG1sdTsKLQotRXJyb3I6Ci0gICAgaWYgKG1sdSAhPSBOVUxMKQotICAgICAgICBjbXNNTFVmcmVlKG1sdSk7Ci0gICAgaWYgKFRleHQgIT0gTlVMTCkKLSAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgVGV4dCk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLy8gVGhlIGNvbnZlcnNpb24gaW1wbGllcyB0byBjaG9vc2UgYSBsYW5ndWFnZS4gU28sIHdlIGNob29zZSB0aGUgYWN0dWFsIGxhbmd1YWdlLgotc3RhdGljCi1jbXNCb29sIFR5cGVfVGV4dF9Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKLXsKLSAgICBjbXNNTFUqIG1sdSA9IChjbXNNTFUqKSBQdHI7Ci0gICAgY21zVUludDMyTnVtYmVyIHNpemU7Ci0gICAgY21zQm9vbCAgcmM7Ci0gICAgY2hhciogVGV4dDsKLQotICAgIC8vIEdldCB0aGUgc2l6ZSBvZiB0aGUgc3RyaW5nLiBOb3RlIHRoZXJlIGlzIGFuIGV4dHJhICJcMCIgYXQgdGhlIGVuZAotICAgIHNpemUgPSBjbXNNTFVnZXRBU0NJSShtbHUsIGNtc05vTGFuZ3VhZ2UsIGNtc05vQ291bnRyeSwgTlVMTCwgMCk7Ci0gICAgaWYgKHNpemUgPT0gMCkgcmV0dXJuIEZBTFNFOyAgICAgICAvLyBDYW5ub3QgYmUgemVybyEKLQotICAgIC8vIENyZWF0ZSBtZW1vcnkKLSAgICBUZXh0ID0gKGNoYXIqKSBfY21zTWFsbG9jKHNlbGYgLT5Db250ZXh0SUQsIHNpemUpOwotICAgIGlmIChUZXh0ID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQotICAgIGNtc01MVWdldEFTQ0lJKG1sdSwgY21zTm9MYW5ndWFnZSwgY21zTm9Db3VudHJ5LCBUZXh0LCBzaXplKTsKLQotICAgIC8vIFdyaXRlIGl0LCBpbmNsdWRpbmcgc2VwYXJhdG9yCi0gICAgcmMgPSBpbyAtPldyaXRlKGlvLCBzaXplLCBUZXh0KTsKLQotICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFRleHQpOwotICAgIHJldHVybiByYzsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobkl0ZW1zKTsKLX0KLQotc3RhdGljCi12b2lkKiBUeXBlX1RleHRfRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKLXsKLSAgICByZXR1cm4gKHZvaWQqKSBjbXNNTFVkdXAoKGNtc01MVSopIFB0cik7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Ci19Ci0KLQotc3RhdGljCi12b2lkIFR5cGVfVGV4dF9GcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCogUHRyKQotewotICAgIGNtc01MVSogbWx1ID0gKGNtc01MVSopIFB0cjsKLSAgICBjbXNNTFVmcmVlKG1sdSk7Ci0gICAgcmV0dXJuOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKLX0KLQotc3RhdGljCi1jbXNUYWdUeXBlU2lnbmF0dXJlIERlY2lkZVRleHRUeXBlKGNtc0Zsb2F0NjROdW1iZXIgSUNDVmVyc2lvbiwgY29uc3Qgdm9pZCAqRGF0YSkKLXsKLSAgICBpZiAoSUNDVmVyc2lvbiA+PSA0LjApCi0gICAgICAgIHJldHVybiBjbXNTaWdNdWx0aUxvY2FsaXplZFVuaWNvZGVUeXBlOwotCi0gICAgcmV0dXJuIGNtc1NpZ1RleHRUeXBlOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihEYXRhKTsKLX0KLQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gVHlwZSBjbXNTaWdEYXRhVHlwZQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotLy8gR2VuZXJhbCBwdXJwb3NlIGRhdGEgdHlwZQotc3RhdGljCi12b2lkICpUeXBlX0RhdGFfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQotewotICAgIGNtc0lDQ0RhdGEqIEJpbkRhdGE7Ci0gICAgY21zVUludDMyTnVtYmVyIExlbk9mRGF0YTsKLQotICAgICpuSXRlbXMgPSAwOwotCi0gICAgaWYgKFNpemVPZlRhZyA8IHNpemVvZihjbXNVSW50MzJOdW1iZXIpKSByZXR1cm4gTlVMTDsKLQotICAgIExlbk9mRGF0YSA9IFNpemVPZlRhZyAtIHNpemVvZihjbXNVSW50MzJOdW1iZXIpOwotICAgIGlmIChMZW5PZkRhdGEgPiBJTlRfTUFYKSByZXR1cm4gTlVMTDsKLQotICAgIEJpbkRhdGEgPSAoY21zSUNDRGF0YSopIF9jbXNNYWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgc2l6ZW9mKGNtc0lDQ0RhdGEpICsgTGVuT2ZEYXRhIC0gMSk7Ci0gICAgaWYgKEJpbkRhdGEgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBCaW5EYXRhIC0+bGVuID0gTGVuT2ZEYXRhOwotICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZCaW5EYXRhLT5mbGFnKSkgewotICAgICAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBCaW5EYXRhKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKGlvIC0+IFJlYWQoaW8sIEJpbkRhdGEgLT5kYXRhLCBzaXplb2YoY21zVUludDhOdW1iZXIpLCBMZW5PZkRhdGEpICE9IExlbk9mRGF0YSkgewotCi0gICAgICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIEJpbkRhdGEpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAqbkl0ZW1zID0gMTsKLQotICAgIHJldHVybiAodm9pZCopIEJpbkRhdGE7Ci19Ci0KLQotc3RhdGljCi1jbXNCb29sIFR5cGVfRGF0YV9Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKLXsKLSAgIGNtc0lDQ0RhdGEqIEJpbkRhdGEgPSAoY21zSUNDRGF0YSopIFB0cjsKLQotICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIEJpbkRhdGEgLT5mbGFnKSkgcmV0dXJuIEZBTFNFOwotCi0gICByZXR1cm4gaW8gLT5Xcml0ZShpbywgQmluRGF0YSAtPmxlbiwgQmluRGF0YSAtPmRhdGEpOwotCi0gICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7Ci0gICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOwotfQotCi0KLXN0YXRpYwotdm9pZCogVHlwZV9EYXRhX0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQgKlB0ciwgY21zVUludDMyTnVtYmVyIG4pCi17Ci0gICAgY21zSUNDRGF0YSogQmluRGF0YSA9IChjbXNJQ0NEYXRhKikgUHRyOwotCi0gICAgcmV0dXJuIF9jbXNEdXBNZW0oc2VsZiAtPkNvbnRleHRJRCwgUHRyLCBzaXplb2YoY21zSUNDRGF0YSkgKyBCaW5EYXRhIC0+bGVuIC0gMSk7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOwotfQotCi1zdGF0aWMKLXZvaWQgVHlwZV9EYXRhX0ZyZWUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCB2b2lkKiBQdHIpCi17Ci0gICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgUHRyKTsKLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIFR5cGUgY21zU2lnVGV4dERlc2NyaXB0aW9uVHlwZQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotc3RhdGljCi12b2lkICpUeXBlX1RleHRfRGVzY3JpcHRpb25fUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQotewotICAgIGNoYXIqIFRleHQgPSBOVUxMOwotICAgIGNtc01MVSogbWx1ID0gTlVMTDsKLSAgICBjbXNVSW50MzJOdW1iZXIgIEFzY2lpQ291bnQ7Ci0gICAgY21zVUludDMyTnVtYmVyICBpLCBVbmljb2RlQ29kZSwgVW5pY29kZUNvdW50OwotICAgIGNtc1VJbnQxNk51bWJlciAgU2NyaXB0Q29kZUNvZGUsIER1bW15OwotICAgIGNtc1VJbnQ4TnVtYmVyICAgU2NyaXB0Q29kZUNvdW50OwotCi0gICAgKm5JdGVtcyA9IDA7Ci0KLSAgICAvLyAgT25lIGR3b3JkIHNob3VsZCBiZSB0aGVyZQotICAgIGlmIChTaXplT2ZUYWcgPCBzaXplb2YoY21zVUludDMyTnVtYmVyKSkgcmV0dXJuIE5VTEw7Ci0KLSAgICAvLyBSZWFkIGxlbiBvZiBBU0NJSQotICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZBc2NpaUNvdW50KSkgcmV0dXJuIE5VTEw7Ci0gICAgU2l6ZU9mVGFnIC09IHNpemVvZihjbXNVSW50MzJOdW1iZXIpOwotCi0gICAgLy8gQ2hlY2sgZm9yIHNpemUKLSAgICBpZiAoU2l6ZU9mVGFnIDwgQXNjaWlDb3VudCkgcmV0dXJuIE5VTEw7Ci0KLSAgICAvLyBBbGwgc2VlbXMgT2ssIGFsbG9jYXRlIHRoZSBjb250YWluZXIKLSAgICBtbHUgPSBjbXNNTFVhbGxvYyhzZWxmIC0+Q29udGV4dElELCAxKTsKLSAgICBpZiAobWx1ID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgLy8gQXMgbWFueSBtZW1vcnkgYXMgc2l6ZSBvZiB0YWcKLSAgICBUZXh0ID0gKGNoYXIqKSBfY21zTWFsbG9jKHNlbGYgLT5Db250ZXh0SUQsIEFzY2lpQ291bnQgKyAxKTsKLSAgICBpZiAoVGV4dCA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgLy8gUmVhZCBpdAotICAgIGlmIChpbyAtPlJlYWQoaW8sIFRleHQsIHNpemVvZihjaGFyKSwgQXNjaWlDb3VudCkgIT0gQXNjaWlDb3VudCkgZ290byBFcnJvcjsKLSAgICBTaXplT2ZUYWcgLT0gQXNjaWlDb3VudDsKLQotICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBhIHRlcm1pbmF0b3IKLSAgICBUZXh0W0FzY2lpQ291bnRdID0gMDsKLQotICAgIC8vIFNldCB0aGUgTUxVIGVudHJ5LiBGcm9tIGhlcmUgd2UgY2FuIGJlIHRvbGVyYW50IHRvIHdyb25nIHR5cGVzCi0gICAgaWYgKCFjbXNNTFVzZXRBU0NJSShtbHUsIGNtc05vTGFuZ3VhZ2UsIGNtc05vQ291bnRyeSwgVGV4dCkpIGdvdG8gRXJyb3I7Ci0gICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgKHZvaWQqKSBUZXh0KTsKLSAgICBUZXh0ID0gTlVMTDsKLQotICAgIC8vIFNraXAgVW5pY29kZSBjb2RlCi0gICAgaWYgKFNpemVPZlRhZyA8IDIqIHNpemVvZihjbXNVSW50MzJOdW1iZXIpKSBnb3RvIERvbmU7Ci0gICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJlVuaWNvZGVDb2RlKSkgZ290byBEb25lOwotICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZVbmljb2RlQ291bnQpKSBnb3RvIERvbmU7Ci0gICAgU2l6ZU9mVGFnIC09IDIqIHNpemVvZihjbXNVSW50MzJOdW1iZXIpOwotCi0gICAgaWYgKFNpemVPZlRhZyA8IFVuaWNvZGVDb3VudCpzaXplb2YoY21zVUludDE2TnVtYmVyKSkgZ290byBEb25lOwotCi0gICAgZm9yIChpPTA7IGkgPCBVbmljb2RlQ291bnQ7IGkrKykgewotICAgICAgICBpZiAoIWlvIC0+UmVhZChpbywgJkR1bW15LCBzaXplb2YoY21zVUludDE2TnVtYmVyKSwgMSkpIGdvdG8gRG9uZTsKLSAgICB9Ci0gICAgU2l6ZU9mVGFnIC09IFVuaWNvZGVDb3VudCpzaXplb2YoY21zVUludDE2TnVtYmVyKTsKLQotICAgIC8vIFNraXAgU2NyaXB0Q29kZSBjb2RlIGlmIHByZXNlbnQuIFNvbWUgYnVnZ3kgcHJvZmlsZXMgZG9lcyBoYXZlIGxlc3MKLSAgICAvLyBkYXRhIHRoYXQgc3RyaWN0dGx5IHJlcXVpcmVkLiBXZSBuZWVkIHRvIHNraXAgaXQgYXMgdGhpcyB0eXBlIG1heSBjb21lCi0gICAgLy8gZW1iZWRkZWQgaW4gb3RoZXIgdHlwZXMuCi0KLSAgICBpZiAoU2l6ZU9mVGFnID49IHNpemVvZihjbXNVSW50MTZOdW1iZXIpICsgc2l6ZW9mKGNtc1VJbnQ4TnVtYmVyKSArIDY3KSB7Ci0KLSAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgJlNjcmlwdENvZGVDb2RlKSkgZ290byBEb25lOwotICAgICAgICBpZiAoIV9jbXNSZWFkVUludDhOdW1iZXIoaW8sICAmU2NyaXB0Q29kZUNvdW50KSkgZ290byBEb25lOwotCi0gICAgICAgIC8vIFNraXAgcmVzdCBvZiB0YWcKLSAgICAgICAgZm9yIChpPTA7IGkgPCA2NzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIWlvIC0+UmVhZChpbywgJkR1bW15LCBzaXplb2YoY21zVUludDhOdW1iZXIpLCAxKSkgZ290byBFcnJvcjsKLSAgICAgICAgfQotICAgIH0KLQotRG9uZToKLQotICAgICpuSXRlbXMgPSAxOwotICAgIHJldHVybiBtbHU7Ci0KLUVycm9yOgotICAgIGlmIChUZXh0KSBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCAodm9pZCopIFRleHQpOwotICAgIGlmIChtbHUpIGNtc01MVWZyZWUobWx1KTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi0vLyBUaGlzIHRhZyBjYW4gY29tZSBJTiBVTkFMSUdORUQgU0laRS4gSW4gb3JkZXIgdG8gcHJldmVudCBpc3N1ZXMsIHdlIGZvcmNlIHplcm9zIG9uIGRlc2NyaXB0aW9uIHRvIGFsaWduIGl0Ci1zdGF0aWMKLWNtc0Jvb2wgIFR5cGVfVGV4dF9EZXNjcmlwdGlvbl9Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKLXsKLSAgICBjbXNNTFUqIG1sdSA9IChjbXNNTFUqKSBQdHI7Ci0gICAgY2hhciAqVGV4dCA9IE5VTEw7Ci0gICAgd2NoYXJfdCAqV2lkZSA9IE5VTEw7Ci0gICAgY21zVUludDMyTnVtYmVyIGxlbiwgbGVuX2FsaWduZWQsIGxlbl9maWxsZXJfYWxpZ25tZW50OwotICAgIGNtc0Jvb2wgIHJjID0gRkFMU0U7Ci0gICAgY2hhciBGaWxsZXJbNjhdOwotCi0gICAgLy8gVXNlZCBiZWxvdyBmb3Igd3JpdHRpbmcgemVyb2VzCi0gICAgbWVtc2V0KEZpbGxlciwgMCwgc2l6ZW9mKEZpbGxlcikpOwotCi0gICAgLy8gR2V0IHRoZSBsZW4gb2Ygc3RyaW5nCi0gICAgbGVuID0gY21zTUxVZ2V0QVNDSUkobWx1LCBjbXNOb0xhbmd1YWdlLCBjbXNOb0NvdW50cnksIE5VTEwsIDApOwotCi0gICAgLy8gRnJvbSBJQ0MzLjQ6IEl0IGhhcyBiZWVuIGZvdW5kIHRoYXQgdGV4dERlc2NyaXB0aW9uVHlwZSBjYW4gY29udGFpbiBtaXNhbGlnbmVkIGRhdGEKLSAgICAvLyhzZWUgY2xhdXNlIDQuMSBmb3IgdGhlIGRlZmluaXRpb24gb2YgJ2FsaWduZWQnLiBCZWNhdXNlIHRoZSBVbmljb2RlIGxhbmd1YWdlCi0gICAgLy8gY29kZSBhbmQgVW5pY29kZSBjb3VudCBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIEFTQ0lJIGRlc2NyaXB0aW9uLCB0aGVpcgotICAgIC8vIGFsaWdubWVudCBpcyBub3QgY29ycmVjdCBpZiB0aGUgQVNDSUkgY291bnQgaXMgbm90IGEgbXVsdGlwbGUgb2YgZm91ci4gVGhlCi0gICAgLy8gU2NyaXB0Q29kZSBjb2RlIGlzIG1pc2FsaWduZWQgd2hlbiB0aGUgQVNDSUkgY291bnQgaXMgb2RkLiBQcm9maWxlIHJlYWRpbmcgYW5kCi0gICAgLy8gd3JpdGluZyBzb2Z0d2FyZSBtdXN0IGJlIHdyaXR0ZW4gY2FyZWZ1bGx5IGluIG9yZGVyIHRvIGhhbmRsZSB0aGVzZSBhbGlnbm1lbnQKLSAgICAvLyBwcm9ibGVtcy4KLQotICAgIC8vIENvbXB1dGUgYW4gYWxpZ25lZCBzaXplCi0gICAgbGVuX2FsaWduZWQgPSBfY21zQUxJR05MT05HKGxlbik7Ci0gICAgbGVuX2ZpbGxlcl9hbGlnbm1lbnQgPSBsZW5fYWxpZ25lZCAtIGxlbjsKLQotICAgIC8vIE51bGwgc3RyaW5ncwotICAgIGlmIChsZW4gPD0gMCkgewotCi0gICAgICAgIFRleHQgPSAoY2hhciopICAgIF9jbXNEdXBNZW0oc2VsZiAtPkNvbnRleHRJRCwgIiIsIHNpemVvZihjaGFyKSk7Ci0gICAgICAgIFdpZGUgPSAod2NoYXJfdCopIF9jbXNEdXBNZW0oc2VsZiAtPkNvbnRleHRJRCwgTCIiLCBzaXplb2Yod2NoYXJfdCkpOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLy8gQ3JlYXRlIGluZGVwZW5kZW50IGJ1ZmZlcnMKLSAgICAgICAgVGV4dCA9IChjaGFyKikgX2Ntc0NhbGxvYyhzZWxmIC0+Q29udGV4dElELCBsZW4sIHNpemVvZihjaGFyKSk7Ci0gICAgICAgIGlmIChUZXh0ID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAgV2lkZSA9ICh3Y2hhcl90KikgX2Ntc0NhbGxvYyhzZWxmIC0+Q29udGV4dElELCBsZW4sIHNpemVvZih3Y2hhcl90KSk7Ci0gICAgICAgIGlmIChXaWRlID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAgLy8gR2V0IGJvdGggcmVwcmVzZW50YXRpb25zLgotICAgICAgICBjbXNNTFVnZXRBU0NJSShtbHUsIGNtc05vTGFuZ3VhZ2UsIGNtc05vQ291bnRyeSwgIFRleHQsIGxlbiAqIHNpemVvZihjaGFyKSk7Ci0gICAgICAgIGNtc01MVWdldFdpZGUobWx1LCAgY21zTm9MYW5ndWFnZSwgY21zTm9Db3VudHJ5LCAgV2lkZSwgbGVuICogc2l6ZW9mKHdjaGFyX3QpKTsKLSAgICB9Ci0KLSAgLy8gKiBjbXNVSW50MzJOdW1iZXIgICAgICAgY291bnQ7ICAgICAgICAgICogRGVzY3JpcHRpb24gbGVuZ3RoCi0gIC8vICogY21zSW50OE51bWJlciAgICAgICAgIGRlc2NbY291bnRdICAgICAqIE5VTEwgdGVybWluYXRlZCBhc2NpaSBzdHJpbmcKLSAgLy8gKiBjbXNVSW50MzJOdW1iZXIgICAgICAgdWNMYW5nQ29kZTsgICAgICogVW5pQ29kZSBsYW5ndWFnZSBjb2RlCi0gIC8vICogY21zVUludDMyTnVtYmVyICAgICAgIHVjQ291bnQ7ICAgICAgICAqIFVuaUNvZGUgZGVzY3JpcHRpb24gbGVuZ3RoCi0gIC8vICogY21zSW50MTZOdW1iZXIgICAgICAgIHVjRGVzY1t1Y0NvdW50XTsqIFRoZSBVbmlDb2RlIGRlc2NyaXB0aW9uCi0gIC8vICogY21zVUludDE2TnVtYmVyICAgICAgIHNjQ29kZTsgICAgICAgICAqIFNjcmlwdENvZGUgY29kZQotICAvLyAqIGNtc1VJbnQ4TnVtYmVyICAgICAgICBzY0NvdW50OyAgICAgICAgKiBTY3JpcHRDb2RlIGNvdW50Ci0gIC8vICogY21zSW50OE51bWJlciAgICAgICAgIHNjRGVzY1s2N107ICAgICAqIFNjcmlwdENvZGUgRGVzY3JpcHRpb24KLQotICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBsZW5fYWxpZ25lZCkpIGdvdG8gRXJyb3I7Ci0gICAgaWYgKCFpbyAtPldyaXRlKGlvLCBsZW4sIFRleHQpKSBnb3RvIEVycm9yOwotICAgIGlmICghaW8gLT5Xcml0ZShpbywgbGVuX2ZpbGxlcl9hbGlnbm1lbnQsIEZpbGxlcikpIGdvdG8gRXJyb3I7Ci0KLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgMCkpIGdvdG8gRXJyb3I7ICAvLyB1Y0xhbmd1YWdlQ29kZQotCi0gICAgLy8gVGhpcyBwYXJ0IGlzIHRyaWNreTogd2UgbmVlZCBhbiBhbGlnbmVkIHRhZyBzaXplLCBhbmQgdGhlIFNjcmlwdENvZGUgcGFydAotICAgIC8vIHRha2VzIDcwIGJ5dGVzLCBzbyB3ZSBuZWVkIDIgZXh0cmEgYnl0ZXMgdG8gZG8gdGhlIGFsaWdubWVudAotCi0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIGxlbl9hbGlnbmVkKzEpKSBnb3RvIEVycm9yOwotCi0gICAgLy8gTm90ZSB0aGF0IGluIHNvbWUgY29tcGlsZXJzIHNpemVvZihjbXNVSW50MTZOdW1iZXIpICE9IHNpemVvZih3Y2hhcl90KQotICAgIGlmICghX2Ntc1dyaXRlV0NoYXJBcnJheShpbywgbGVuLCBXaWRlKSkgZ290byBFcnJvcjsKLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNkFycmF5KGlvLCBsZW5fZmlsbGVyX2FsaWdubWVudCsxLCAoY21zVUludDE2TnVtYmVyKikgRmlsbGVyKSkgZ290byBFcnJvcjsKLQotICAgIC8vIFNjcmlwdENvZGUgQ29kZSAmIGNvdW50ICh1bnVzZWQpCi0gICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIDApKSBnb3RvIEVycm9yOwotICAgIGlmICghX2Ntc1dyaXRlVUludDhOdW1iZXIoaW8sIDApKSBnb3RvIEVycm9yOwotCi0gICAgaWYgKCFpbyAtPldyaXRlKGlvLCA2NywgRmlsbGVyKSkgZ290byBFcnJvcjsKLQotICAgIHJjID0gVFJVRTsKLQotRXJyb3I6Ci0gICAgaWYgKFRleHQpIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFRleHQpOwotICAgIGlmIChXaWRlKSBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBXaWRlKTsKLQotICAgIHJldHVybiByYzsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobkl0ZW1zKTsKLX0KLQotCi1zdGF0aWMKLXZvaWQqIFR5cGVfVGV4dF9EZXNjcmlwdGlvbl9EdXAoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjb25zdCB2b2lkICpQdHIsIGNtc1VJbnQzMk51bWJlciBuKQotewotICAgIHJldHVybiAodm9pZCopIGNtc01MVWR1cCgoY21zTUxVKikgUHRyKTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobik7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKLX0KLQotc3RhdGljCi12b2lkIFR5cGVfVGV4dF9EZXNjcmlwdGlvbl9GcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCogUHRyKQotewotICAgIGNtc01MVSogbWx1ID0gKGNtc01MVSopIFB0cjsKLQotICAgIGNtc01MVWZyZWUobWx1KTsKLSAgICByZXR1cm47Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOwotfQotCi0KLXN0YXRpYwotY21zVGFnVHlwZVNpZ25hdHVyZSBEZWNpZGVUZXh0RGVzY1R5cGUoY21zRmxvYXQ2NE51bWJlciBJQ0NWZXJzaW9uLCBjb25zdCB2b2lkICpEYXRhKQotewotICAgIGlmIChJQ0NWZXJzaW9uID49IDQuMCkKLSAgICAgICAgcmV0dXJuIGNtc1NpZ011bHRpTG9jYWxpemVkVW5pY29kZVR5cGU7Ci0KLSAgICByZXR1cm4gY21zU2lnVGV4dERlc2NyaXB0aW9uVHlwZTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoRGF0YSk7Ci19Ci0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIFR5cGUgY21zU2lnQ3VydmVUeXBlCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi1zdGF0aWMKLXZvaWQgKlR5cGVfQ3VydmVfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQotewotICAgIGNtc1VJbnQzMk51bWJlciBDb3VudDsKLSAgICBjbXNUb25lQ3VydmUqIE5ld0dhbW1hOwotICAgIAotICAgICpuSXRlbXMgPSAwOwotICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZDb3VudCkpIHJldHVybiBOVUxMOwotCi0gICAgc3dpdGNoIChDb3VudCkgewotCi0gICAgICAgICAgIGNhc2UgMDogICAvLyBMaW5lYXIuCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBTaW5nbGVHYW1tYSA9IDEuMDsKLQotICAgICAgICAgICAgICAgICAgIE5ld0dhbW1hID0gY21zQnVpbGRQYXJhbWV0cmljVG9uZUN1cnZlKHNlbGYgLT5Db250ZXh0SUQsIDEsICZTaW5nbGVHYW1tYSk7Ci0gICAgICAgICAgICAgICAgICAgaWYgKCFOZXdHYW1tYSkgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgKm5JdGVtcyA9IDE7Ci0gICAgICAgICAgICAgICAgICAgcmV0dXJuIE5ld0dhbW1hOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgICAgY2FzZSAxOiAgLy8gU3BlY2lmaWVkIGFzIHRoZSBleHBvbmVudCBvZiBnYW1tYSBmdW5jdGlvbgotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgIGNtc1VJbnQxNk51bWJlciBTaW5nbGVHYW1tYUZpeGVkOwotICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgU2luZ2xlR2FtbWE7Ci0KLSAgICAgICAgICAgICAgICAgICBpZiAoIV9jbXNSZWFkVUludDE2TnVtYmVyKGlvLCAmU2luZ2xlR2FtbWFGaXhlZCkpIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgIFNpbmdsZUdhbW1hID0gX2NtczhGaXhlZDh0b0RvdWJsZShTaW5nbGVHYW1tYUZpeGVkKTsKLQotICAgICAgICAgICAgICAgICAgICpuSXRlbXMgPSAxOwotICAgICAgICAgICAgICAgICAgIHJldHVybiBjbXNCdWlsZFBhcmFtZXRyaWNUb25lQ3VydmUoc2VsZiAtPkNvbnRleHRJRCwgMSwgJlNpbmdsZUdhbW1hKTsKLSAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICBkZWZhdWx0OiAgLy8gQ3VydmUKLQotICAgICAgICAgICAgICAgaWYgKENvdW50ID4gMHg3RkZGKQotICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOyAvLyBUaGlzIGlzIHRvIHByZXZlbnQgYmFkIGd1eXMgZm9yIGRvaW5nIGJhZCB0aGluZ3MKLQotICAgICAgICAgICAgICAgTmV3R2FtbWEgPSBjbXNCdWlsZFRhYnVsYXRlZFRvbmVDdXJ2ZTE2KHNlbGYgLT5Db250ZXh0SUQsIENvdW50LCBOVUxMKTsKLSAgICAgICAgICAgICAgIGlmICghTmV3R2FtbWEpIHJldHVybiBOVUxMOwotCi0gICAgICAgICAgICAgICBpZiAoIV9jbXNSZWFkVUludDE2QXJyYXkoaW8sIENvdW50LCBOZXdHYW1tYSAtPiBUYWJsZTE2KSkgewotICAgICAgICAgICAgICAgICBjbXNGcmVlVG9uZUN1cnZlKE5ld0dhbW1hKTsKLSAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICpuSXRlbXMgPSAxOwotICAgICAgICAgICAgICAgcmV0dXJuIE5ld0dhbW1hOwotICAgIH0KLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU2l6ZU9mVGFnKTsKLX0KLQotCi1zdGF0aWMKLWNtc0Jvb2wgIFR5cGVfQ3VydmVfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCi17Ci0gICAgY21zVG9uZUN1cnZlKiBDdXJ2ZSA9IChjbXNUb25lQ3VydmUqKSBQdHI7Ci0KLSAgICBpZiAoQ3VydmUgLT5uU2VnbWVudHMgPT0gMSAmJiBDdXJ2ZSAtPlNlZ21lbnRzWzBdLlR5cGUgPT0gMSkgewotCi0gICAgICAgICAgICAvLyBTaW5nbGUgZ2FtbWEsIHByZXNlcnZlIG51bWJlcgotICAgICAgICAgICAgY21zVUludDE2TnVtYmVyIFNpbmdsZUdhbW1hRml4ZWQgPSBfY21zRG91YmxlVG84Rml4ZWQ4KEN1cnZlIC0+U2VnbWVudHNbMF0uUGFyYW1zWzBdKTsKLQotICAgICAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIDEpKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgU2luZ2xlR2FtbWFGaXhlZCkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotCi0gICAgfQotCi0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIEN1cnZlIC0+bkVudHJpZXMpKSByZXR1cm4gRkFMU0U7Ci0gICAgcmV0dXJuIF9jbXNXcml0ZVVJbnQxNkFycmF5KGlvLCBDdXJ2ZSAtPm5FbnRyaWVzLCBDdXJ2ZSAtPlRhYmxlMTYpOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuSXRlbXMpOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Ci19Ci0KLQotc3RhdGljCi12b2lkKiBUeXBlX0N1cnZlX0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQgKlB0ciwgY21zVUludDMyTnVtYmVyIG4pCi17Ci0gICAgcmV0dXJuICh2b2lkKikgY21zRHVwVG9uZUN1cnZlKChjbXNUb25lQ3VydmUqKSBQdHIpOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOwotfQotCi1zdGF0aWMKLXZvaWQgVHlwZV9DdXJ2ZV9GcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCogUHRyKQotewotICAgIGNtc1RvbmVDdXJ2ZSogZ2FtbWEgPSAoY21zVG9uZUN1cnZlKikgUHRyOwotCi0gICAgY21zRnJlZVRvbmVDdXJ2ZShnYW1tYSk7Ci0gICAgcmV0dXJuOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKLX0KLQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gVHlwZSBjbXNTaWdQYXJhbWV0cmljQ3VydmVUeXBlCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0KLS8vIERlY2lkZSB3aGljaCBjdXJ2ZSB0eXBlIHRvIHVzZSBvbiB3cml0dGluZwotc3RhdGljCi1jbXNUYWdUeXBlU2lnbmF0dXJlIERlY2lkZUN1cnZlVHlwZShjbXNGbG9hdDY0TnVtYmVyIElDQ1ZlcnNpb24sIGNvbnN0IHZvaWQgKkRhdGEpCi17Ci0gICAgY21zVG9uZUN1cnZlKiBDdXJ2ZSA9IChjbXNUb25lQ3VydmUqKSBEYXRhOwotCi0gICAgaWYgKElDQ1ZlcnNpb24gPCA0LjApIHJldHVybiBjbXNTaWdDdXJ2ZVR5cGU7Ci0gICAgaWYgKEN1cnZlIC0+blNlZ21lbnRzICE9IDEpIHJldHVybiBjbXNTaWdDdXJ2ZVR5cGU7ICAgICAgICAgIC8vIE9ubHkgMS1zZWdtZW50IGN1cnZlcyBjYW4gYmUgc2F2ZWQgYXMgcGFyYW1ldHJpYwotICAgIGlmIChDdXJ2ZSAtPlNlZ21lbnRzWzBdLlR5cGUgPCAwKSByZXR1cm4gY21zU2lnQ3VydmVUeXBlOyAgICAvLyBPbmx5IG5vbi1pbnZlcnRlZCBjdXJ2ZXMKLSAgICBpZiAoQ3VydmUgLT5TZWdtZW50c1swXS5UeXBlID4gNSkgcmV0dXJuIGNtc1NpZ0N1cnZlVHlwZTsgICAgLy8gT25seSBJQ0MgcGFyYW1ldHJpYyBjdXJ2ZXMKLQotICAgIHJldHVybiBjbXNTaWdQYXJhbWV0cmljQ3VydmVUeXBlOwotfQotCi1zdGF0aWMKLXZvaWQgKlR5cGVfUGFyYW1ldHJpY0N1cnZlX1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG5JdGVtcywgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKLXsKLSAgICBzdGF0aWMgY29uc3QgaW50IFBhcmFtc0J5VHlwZVtdID0geyAxLCAzLCA0LCA1LCA3IH07Ci0gICAgY21zRmxvYXQ2NE51bWJlciBQYXJhbXNbMTBdOwotICAgIGNtc1VJbnQxNk51bWJlciBUeXBlOwotICAgIGludCBpLCBuOwotICAgIGNtc1RvbmVDdXJ2ZSogTmV3R2FtbWE7Ci0KLSAgICBpZiAoIV9jbXNSZWFkVUludDE2TnVtYmVyKGlvLCAmVHlwZSkpIHJldHVybiBOVUxMOwotICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sIE5VTEwpKSByZXR1cm4gTlVMTDsgICAvLyBSZXNlcnZlZAotCi0gICAgaWYgKFR5cGUgPiA0KSB7Ci0KLSAgICAgICAgY21zU2lnbmFsRXJyb3Ioc2VsZi0+Q29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVua25vd24gcGFyYW1ldHJpYyBjdXJ2ZSB0eXBlICclZCciLCBUeXBlKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgbWVtc2V0KFBhcmFtcywgMCwgc2l6ZW9mKFBhcmFtcykpOwotICAgIG4gPSBQYXJhbXNCeVR5cGVbVHlwZV07Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG47IGkrKykgewotCi0gICAgICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICZQYXJhbXNbaV0pKSByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBOZXdHYW1tYSA9IGNtc0J1aWxkUGFyYW1ldHJpY1RvbmVDdXJ2ZShzZWxmIC0+Q29udGV4dElELCBUeXBlKzEsIFBhcmFtcyk7Ci0KLSAgICAqbkl0ZW1zID0gMTsKLSAgICByZXR1cm4gTmV3R2FtbWE7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFNpemVPZlRhZyk7Ci19Ci0KLQotc3RhdGljCi1jbXNCb29sICBUeXBlX1BhcmFtZXRyaWNDdXJ2ZV9Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKLXsKLSAgICBjbXNUb25lQ3VydmUqIEN1cnZlID0gKGNtc1RvbmVDdXJ2ZSopIFB0cjsKLSAgICBpbnQgaSwgblBhcmFtcywgdHlwZW47Ci0gICAgc3RhdGljIGNvbnN0IGludCBQYXJhbXNCeVR5cGVbXSA9IHsgMCwgMSwgMywgNCwgNSwgNyB9OwotCi0gICAgdHlwZW4gPSBDdXJ2ZSAtPiBTZWdtZW50c1swXS5UeXBlOwotCi0gICAgaWYgKEN1cnZlIC0+blNlZ21lbnRzID4gMSB8fCB0eXBlbiA8IDEpIHsKLQotICAgICAgICBjbXNTaWduYWxFcnJvcihzZWxmLT5Db250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiTXVsdGlzZWdtZW50IG9yIEludmVydGVkIHBhcmFtZXRyaWMgY3VydmVzIGNhbm5vdCBiZSB3cml0dGVuIik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAodHlwZW4gPiA1KSB7Ci0gICAgICAgIGNtc1NpZ25hbEVycm9yKHNlbGYtPkNvbnRleHRJRCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJVbnN1cHBvcnRlZCBwYXJhbWV0cmljIGN1cnZlIik7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBuUGFyYW1zID0gUGFyYW1zQnlUeXBlW3R5cGVuXTsKLQotICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCAoY21zVUludDE2TnVtYmVyKSAoQ3VydmUgLT5TZWdtZW50c1swXS5UeXBlIC0gMSkpKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7ICAgICAgICAvLyBSZXNlcnZlZAotCi0gICAgZm9yIChpPTA7IGkgPCBuUGFyYW1zOyBpKyspIHsKLQotICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgQ3VydmUgLT4gU2VnbWVudHNbMF0uUGFyYW1zW2ldKSkgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuSXRlbXMpOwotfQotCi1zdGF0aWMKLXZvaWQqIFR5cGVfUGFyYW1ldHJpY0N1cnZlX0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQgKlB0ciwgY21zVUludDMyTnVtYmVyIG4pCi17Ci0gICAgcmV0dXJuICh2b2lkKikgY21zRHVwVG9uZUN1cnZlKChjbXNUb25lQ3VydmUqKSBQdHIpOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOwotfQotCi1zdGF0aWMKLXZvaWQgVHlwZV9QYXJhbWV0cmljQ3VydmVfRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQqIFB0cikKLXsKLSAgICBjbXNUb25lQ3VydmUqIGdhbW1hID0gKGNtc1RvbmVDdXJ2ZSopIFB0cjsKLQotICAgIGNtc0ZyZWVUb25lQ3VydmUoZ2FtbWEpOwotICAgIHJldHVybjsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Ci19Ci0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIFR5cGUgY21zU2lnRGF0ZVRpbWVUeXBlCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0vLyBBIDEyLWJ5dGUgdmFsdWUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRpbWUgYW5kIGRhdGUsIHdoZXJlIHRoZSBieXRlIHVzYWdlIGlzIGFzc2lnbmVkCi0vLyBhcyBzcGVjaWZpZWQgaW4gdGFibGUgMS4gVGhlIGFjdHVhbCB2YWx1ZXMgYXJlIGVuY29kZWQgYXMgMTYtYml0IHVuc2lnbmVkIGludGVnZXJzCi0vLyAodUludDE2TnVtYmVyIC0gc2VlIDUuMS42KS4KLS8vCi0vLyBBbGwgdGhlIGRhdGVUaW1lTnVtYmVyIHZhbHVlcyBpbiBhIHByb2ZpbGUgc2hhbGwgYmUgaW4gQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWUKLS8vIChVVEMsIGFsc28ga25vd24gYXMgR01UIG9yIFpVTFUgVGltZSkuIFByb2ZpbGUgd3JpdGVycyBhcmUgcmVxdWlyZWQgdG8gY29udmVydCBsb2NhbAotLy8gdGltZSB0byBVVEMgd2hlbiBzZXR0aW5nIHRoZXNlIHZhbHVlcy4gUHJvZ3JhbW1lcyB0aGF0IGRpc3BsYXkgdGhlc2UgdmFsdWVzIG1heSBzaG93Ci0vLyB0aGUgZGF0ZVRpbWVOdW1iZXIgYXMgVVRDLCBzaG93IHRoZSBlcXVpdmFsZW50IGxvY2FsIHRpbWUgKGF0IGN1cnJlbnQgbG9jYWxlKSwgb3IKLS8vIGRpc3BsYXkgYm90aCBVVEMgYW5kIGxvY2FsIHZlcnNpb25zIG9mIHRoZSBkYXRlVGltZU51bWJlci4KLQotc3RhdGljCi12b2lkICpUeXBlX0RhdGVUaW1lX1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG5JdGVtcywgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKLXsKLSAgICBjbXNEYXRlVGltZU51bWJlciB0aW1lc3RhbXA7Ci0gICAgc3RydWN0IHRtICogTmV3RGF0ZVRpbWU7Ci0KLSAgICAqbkl0ZW1zID0gMDsKLSAgICBOZXdEYXRlVGltZSA9IChzdHJ1Y3QgdG0qKSBfY21zTWFsbG9jKHNlbGYgLT5Db250ZXh0SUQsIHNpemVvZihzdHJ1Y3QgdG0pKTsKLSAgICBpZiAoTmV3RGF0ZVRpbWUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoaW8tPlJlYWQoaW8sICZ0aW1lc3RhbXAsIHNpemVvZihjbXNEYXRlVGltZU51bWJlciksIDEpICE9IDEpIHJldHVybiBOVUxMOwotCi0gICAgIF9jbXNEZWNvZGVEYXRlVGltZU51bWJlcigmdGltZXN0YW1wLCBOZXdEYXRlVGltZSk7Ci0KLSAgICAgKm5JdGVtcyA9IDE7Ci0gICAgIHJldHVybiBOZXdEYXRlVGltZTsKLQotICAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFNpemVPZlRhZyk7Ci19Ci0KLQotc3RhdGljCi1jbXNCb29sICBUeXBlX0RhdGVUaW1lX1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQotewotICAgIHN0cnVjdCB0bSAqIERhdGVUaW1lID0gKHN0cnVjdCB0bSopIFB0cjsKLSAgICBjbXNEYXRlVGltZU51bWJlciB0aW1lc3RhbXA7Ci0KLSAgICBfY21zRW5jb2RlRGF0ZVRpbWVOdW1iZXIoJnRpbWVzdGFtcCwgRGF0ZVRpbWUpOwotICAgIGlmICghaW8gLT5Xcml0ZShpbywgc2l6ZW9mKGNtc0RhdGVUaW1lTnVtYmVyKSwgJnRpbWVzdGFtcCkpIHJldHVybiBGQUxTRTsKLQotICAgIHJldHVybiBUUlVFOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuSXRlbXMpOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Ci19Ci0KLXN0YXRpYwotdm9pZCogVHlwZV9EYXRlVGltZV9EdXAoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjb25zdCB2b2lkICpQdHIsIGNtc1VJbnQzMk51bWJlciBuKQotewotICAgIHJldHVybiBfY21zRHVwTWVtKHNlbGYgLT5Db250ZXh0SUQsIFB0ciwgc2l6ZW9mKHN0cnVjdCB0bSkpOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKLX0KLQotc3RhdGljCi12b2lkIFR5cGVfRGF0ZVRpbWVfRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQqIFB0cikKLXsKLSAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBQdHIpOwotfQotCi0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIFR5cGUgaWNNZWFzdXJlbWVudFR5cGUKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLS8qCi1UaGUgbWVhc3VyZW1lbnRUeXBlIGluZm9ybWF0aW9uIHJlZmVycyBvbmx5IHRvIHRoZSBpbnRlcm5hbCBwcm9maWxlIGRhdGEgYW5kIGlzCi1tZWFudCB0byBwcm92aWRlIHByb2ZpbGUgbWFrZXJzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBkZWZhdWx0IG1lYXN1cmVtZW50Ci1zcGVjaWZpY2F0aW9ucy4KLSovCi0KLXN0YXRpYwotdm9pZCAqVHlwZV9NZWFzdXJlbWVudF9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyKiBuSXRlbXMsIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcpCi17Ci0gICAgY21zSUNDTWVhc3VyZW1lbnRDb25kaXRpb25zIG1jOwotCi0JCi0gICAgbWVtc2V0KCZtYywgMCwgc2l6ZW9mKG1jKSk7Ci0JCi0gICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJm1jLk9ic2VydmVyKSkgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFfY21zUmVhZFhZWk51bWJlcihpbywgICAgJm1jLkJhY2tpbmcpKSByZXR1cm4gTlVMTDsKLSAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmbWMuR2VvbWV0cnkpKSByZXR1cm4gTlVMTDsKLSAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAmbWMuRmxhcmUpKSByZXR1cm4gTlVMTDsKLSAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmbWMuSWxsdW1pbmFudFR5cGUpKSByZXR1cm4gTlVMTDsKLQotICAgICpuSXRlbXMgPSAxOwotICAgIHJldHVybiBfY21zRHVwTWVtKHNlbGYgLT5Db250ZXh0SUQsICZtYywgc2l6ZW9mKGNtc0lDQ01lYXN1cmVtZW50Q29uZGl0aW9ucykpOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTaXplT2ZUYWcpOwotfQotCi0KLXN0YXRpYwotY21zQm9vbCAgVHlwZV9NZWFzdXJlbWVudF9Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKLXsKLSAgICBjbXNJQ0NNZWFzdXJlbWVudENvbmRpdGlvbnMqIG1jID0oY21zSUNDTWVhc3VyZW1lbnRDb25kaXRpb25zKikgUHRyOwotCi0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIG1jLT5PYnNlcnZlcikpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIV9jbXNXcml0ZVhZWk51bWJlcihpbywgICAgJm1jLT5CYWNraW5nKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBtYy0+R2VvbWV0cnkpKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIG1jLT5GbGFyZSkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgbWMtPklsbHVtaW5hbnRUeXBlKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgcmV0dXJuIFRSVUU7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKLX0KLQotc3RhdGljCi12b2lkKiBUeXBlX01lYXN1cmVtZW50X0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQgKlB0ciwgY21zVUludDMyTnVtYmVyIG4pCi17Ci0gICAgIHJldHVybiBfY21zRHVwTWVtKHNlbGYgLT5Db250ZXh0SUQsIFB0ciwgc2l6ZW9mKGNtc0lDQ01lYXN1cmVtZW50Q29uZGl0aW9ucykpOwotCi0gICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobik7Ci19Ci0KLXN0YXRpYwotdm9pZCBUeXBlX01lYXN1cmVtZW50X0ZyZWUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCB2b2lkKiBQdHIpCi17Ci0gICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBQdHIpOwotfQotCi0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBUeXBlIGNtc1NpZ011bHRpTG9jYWxpemVkVW5pY29kZVR5cGUKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLwotLy8gICBEbyBOT1QgdHJ1c3QgU2l6ZU9mVGFnIGFzIHRoZXJlIGlzIGFuIGlzc3VlIG9uIHRoZSBkZWZpbml0aW9uIG9mIHByb2ZpbGVTZXF1ZW5jZURlc2NUYWcuIFNlZSB0aGUgVGVjaE5vdGUgZnJvbQotLy8gICBNYXggRGVyaGFrIGFuZCBSb2hpdCBQYXRpbCBhYm91dCB0aGlzOiBiYXNpY2FsbHkgdGhlIHNpemUgb2YgdGhlIHN0cmluZyB0YWJsZSBzaG91bGQgYmUgZ3Vlc3NlZCBhbmQgY2Fubm90IGJlCi0vLyAgIHRha2VuIGZyb20gdGhlIHNpemUgb2YgdGFnIGlmIHRoaXMgdGFnIGlzIGVtYmVkZGVkIGFzIHBhcnQgb2YgYmlnZ2VyIHN0cnVjdHVyZXMgKHByb2ZpbGVTZXF1ZW5jZURlc2NUYWcsIGZvciBpbnN0YW5jZSkKLS8vCi0KLXN0YXRpYwotdm9pZCAqVHlwZV9NTFVfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQotewotICAgIGNtc01MVSogbWx1OwotICAgIGNtc1VJbnQzMk51bWJlciBDb3VudCwgUmVjTGVuLCBOdW1PZldjaGFyOwotICAgIGNtc1VJbnQzMk51bWJlciBTaXplT2ZIZWFkZXI7Ci0gICAgY21zVUludDMyTnVtYmVyICBMZW4sIE9mZnNldDsKLSAgICBjbXNVSW50MzJOdW1iZXIgIGk7Ci0gICAgd2NoYXJfdCogICAgICAgICBCbG9jazsKLSAgICBjbXNVSW50MzJOdW1iZXIgIEJlZ2luT2ZUaGlzU3RyaW5nLCBFbmRPZlRoaXNTdHJpbmcsIExhcmdlc3RQb3NpdGlvbjsKLQotICAgICpuSXRlbXMgPSAwOwotICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZDb3VudCkpIHJldHVybiBOVUxMOwotICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZSZWNMZW4pKSByZXR1cm4gTlVMTDsKLQotICAgIGlmIChSZWNMZW4gIT0gMTIpIHsKLQotICAgICAgICBjbXNTaWduYWxFcnJvcihzZWxmLT5Db250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAibXVsdGlMb2NhbGl6ZWRVbmljb2RlVHlwZSBvZiBsZW4gIT0gMTIgaXMgbm90IHN1cHBvcnRlZC4iKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgbWx1ID0gY21zTUxVYWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgQ291bnQpOwotICAgIGlmIChtbHUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBtbHUgLT5Vc2VkRW50cmllcyA9IENvdW50OwotCi0gICAgU2l6ZU9mSGVhZGVyID0gMTIgKiBDb3VudCArIHNpemVvZihfY21zVGFnQmFzZSk7Ci0gICAgTGFyZ2VzdFBvc2l0aW9uID0gMDsKLQotICAgIGZvciAoaT0wOyBpIDwgQ291bnQ7IGkrKykgewotCi0gICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sICZtbHUgLT5FbnRyaWVzW2ldLkxhbmd1YWdlKSkgZ290byBFcnJvcjsKLSAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgJm1sdSAtPkVudHJpZXNbaV0uQ291bnRyeSkpICBnb3RvIEVycm9yOwotCi0gICAgICAgIC8vIE5vdyBkZWFsIHdpdGggTGVuIGFuZCBvZmZzZXQuCi0gICAgICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZMZW4pKSBnb3RvIEVycm9yOwotICAgICAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmT2Zmc2V0KSkgZ290byBFcnJvcjsKLQotICAgICAgICAvLyBDaGVjayBmb3Igb3ZlcmZsb3cKLSAgICAgICAgaWYgKE9mZnNldCA8IChTaXplT2ZIZWFkZXIgKyA4KSkgZ290byBFcnJvcjsKLQotICAgICAgICAvLyBUcnVlIGJlZ2luIG9mIHRoZSBzdHJpbmcKLSAgICAgICAgQmVnaW5PZlRoaXNTdHJpbmcgPSBPZmZzZXQgLSBTaXplT2ZIZWFkZXIgLSA4OwotCi0gICAgICAgIC8vIEFqdXN0IHRvIHdjaGFyX3QgZWxlbWVudHMKLSAgICAgICAgbWx1IC0+RW50cmllc1tpXS5MZW4gPSAoTGVuICogc2l6ZW9mKHdjaGFyX3QpKSAvIHNpemVvZihjbXNVSW50MTZOdW1iZXIpOwotICAgICAgICBtbHUgLT5FbnRyaWVzW2ldLlN0clcgPSAoQmVnaW5PZlRoaXNTdHJpbmcgKiBzaXplb2Yod2NoYXJfdCkpIC8gc2l6ZW9mKGNtc1VJbnQxNk51bWJlcik7Ci0KLSAgICAgICAgLy8gVG8gZ3Vlc3MgbWF4aW11bSBzaXplLCBhZGQgb2Zmc2V0ICsgbGVuCi0gICAgICAgIEVuZE9mVGhpc1N0cmluZyA9IEJlZ2luT2ZUaGlzU3RyaW5nICsgTGVuOwotICAgICAgICBpZiAoRW5kT2ZUaGlzU3RyaW5nID4gTGFyZ2VzdFBvc2l0aW9uKQotICAgICAgICAgICAgTGFyZ2VzdFBvc2l0aW9uID0gRW5kT2ZUaGlzU3RyaW5nOwotICAgIH0KLQotICAgIC8vIE5vdyByZWFkIHRoZSByZW1haW5pbmcgb2YgdGFnIGFuZCBmaWxsIGFsbCBzdHJpbmdzLiBTdWJzdHJhY3QgdGhlIGRpcmVjdG9yeQotICAgIFNpemVPZlRhZyAgID0gKExhcmdlc3RQb3NpdGlvbiAqIHNpemVvZih3Y2hhcl90KSkgLyBzaXplb2YoY21zVUludDE2TnVtYmVyKTsKLSAgICBpZiAoU2l6ZU9mVGFnID09IDApCi0gICAgewotICAgICAgICBCbG9jayA9IE5VTEw7Ci0gICAgICAgIE51bU9mV2NoYXIgPSAwOwotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEJsb2NrID0gKHdjaGFyX3QqKSBfY21zTWFsbG9jKHNlbGYgLT5Db250ZXh0SUQsIFNpemVPZlRhZyk7Ci0gICAgICAgIGlmIChCbG9jayA9PSBOVUxMKSBnb3RvIEVycm9yOwotICAgICAgICBOdW1PZldjaGFyID0gU2l6ZU9mVGFnIC8gc2l6ZW9mKHdjaGFyX3QpOwotICAgICAgICBpZiAoIV9jbXNSZWFkV0NoYXJBcnJheShpbywgTnVtT2ZXY2hhciwgQmxvY2spKSBnb3RvIEVycm9yOwotICAgIH0KLQotICAgIG1sdSAtPk1lbVBvb2wgID0gQmxvY2s7Ci0gICAgbWx1IC0+UG9vbFNpemUgPSBTaXplT2ZUYWc7Ci0gICAgbWx1IC0+UG9vbFVzZWQgPSBTaXplT2ZUYWc7Ci0KLSAgICAqbkl0ZW1zID0gMTsKLSAgICByZXR1cm4gKHZvaWQqKSBtbHU7Ci0KLUVycm9yOgotICAgIGlmIChtbHUpIGNtc01MVWZyZWUobWx1KTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljCi1jbXNCb29sICBUeXBlX01MVV9Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKLXsKLSAgICBjbXNNTFUqIG1sdSA9KGNtc01MVSopIFB0cjsKLSAgICBjbXNVSW50MzJOdW1iZXIgSGVhZGVyU2l6ZTsKLSAgICBjbXNVSW50MzJOdW1iZXIgIExlbiwgT2Zmc2V0OwotICAgIGludCBpOwotCi0gICAgaWYgKFB0ciA9PSBOVUxMKSB7Ci0KLSAgICAgICAgICAvLyBFbXB0eSBwbGFjZWhvbGRlcgotICAgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCAwKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCAxMikpIHJldHVybiBGQUxTRTsKLSAgICAgICAgICByZXR1cm4gVFJVRTsKLSAgICB9Ci0KLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgbWx1IC0+VXNlZEVudHJpZXMpKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIDEyKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgSGVhZGVyU2l6ZSA9IDEyICogbWx1IC0+VXNlZEVudHJpZXMgKyBzaXplb2YoX2Ntc1RhZ0Jhc2UpOwotCi0gICAgZm9yIChpPTA7IGkgPCBtbHUgLT5Vc2VkRW50cmllczsgaSsrKSB7Ci0KLSAgICAgICAgTGVuICAgID0gIG1sdSAtPkVudHJpZXNbaV0uTGVuOwotICAgICAgICBPZmZzZXQgPSAgbWx1IC0+RW50cmllc1tpXS5TdHJXOwotCi0gICAgICAgIExlbiAgICA9IChMZW4gKiBzaXplb2YoY21zVUludDE2TnVtYmVyKSkgLyBzaXplb2Yod2NoYXJfdCk7Ci0gICAgICAgIE9mZnNldCA9IChPZmZzZXQgKiBzaXplb2YoY21zVUludDE2TnVtYmVyKSkgLyBzaXplb2Yod2NoYXJfdCkgKyBIZWFkZXJTaXplICsgODsKLQotICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgbWx1IC0+RW50cmllc1tpXS5MYW5ndWFnZSkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIG1sdSAtPkVudHJpZXNbaV0uQ291bnRyeSkpICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBMZW4pKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBPZmZzZXQpKSByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKCFfY21zV3JpdGVXQ2hhckFycmF5KGlvLCBtbHUgLT5Qb29sVXNlZCAvIHNpemVvZih3Y2hhcl90KSwgKHdjaGFyX3QqKSAgbWx1IC0+TWVtUG9vbCkpIHJldHVybiBGQUxTRTsKLQotICAgIHJldHVybiBUUlVFOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuSXRlbXMpOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Ci19Ci0KLQotc3RhdGljCi12b2lkKiBUeXBlX01MVV9EdXAoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjb25zdCB2b2lkICpQdHIsIGNtc1VJbnQzMk51bWJlciBuKQotewotICAgIHJldHVybiAodm9pZCopIGNtc01MVWR1cCgoY21zTUxVKikgUHRyKTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobik7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKLX0KLQotc3RhdGljCi12b2lkIFR5cGVfTUxVX0ZyZWUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCB2b2lkKiBQdHIpCi17Ci0gICAgY21zTUxVZnJlZSgoY21zTUxVKikgUHRyKTsKLSAgICByZXR1cm47Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOwotfQotCi0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBUeXBlIGNtc1NpZ0x1dDhUeXBlCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0vLyBEZWNpZGUgd2hpY2ggTFVUIHR5cGUgdG8gdXNlIG9uIHdyaXR0aW5nCi1zdGF0aWMKLWNtc1RhZ1R5cGVTaWduYXR1cmUgRGVjaWRlTFVUdHlwZUEyQihjbXNGbG9hdDY0TnVtYmVyIElDQ1ZlcnNpb24sIGNvbnN0IHZvaWQgKkRhdGEpCi17Ci0gICAgY21zUGlwZWxpbmUqIEx1dCA9IChjbXNQaXBlbGluZSopIERhdGE7Ci0KLSAgICBpZiAoSUNDVmVyc2lvbiA8IDQuMCkgewotICAgICAgICBpZiAoTHV0IC0+U2F2ZUFzOEJpdHMpIHJldHVybiBjbXNTaWdMdXQ4VHlwZTsKLSAgICAgICAgcmV0dXJuIGNtc1NpZ0x1dDE2VHlwZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgICByZXR1cm4gY21zU2lnTHV0QXRvQlR5cGU7Ci0gICAgfQotfQotCi1zdGF0aWMKLWNtc1RhZ1R5cGVTaWduYXR1cmUgRGVjaWRlTFVUdHlwZUIyQShjbXNGbG9hdDY0TnVtYmVyIElDQ1ZlcnNpb24sIGNvbnN0IHZvaWQgKkRhdGEpCi17Ci0gICAgY21zUGlwZWxpbmUqIEx1dCA9IChjbXNQaXBlbGluZSopIERhdGE7Ci0KLSAgICBpZiAoSUNDVmVyc2lvbiA8IDQuMCkgewotICAgICAgICBpZiAoTHV0IC0+U2F2ZUFzOEJpdHMpIHJldHVybiBjbXNTaWdMdXQ4VHlwZTsKLSAgICAgICAgcmV0dXJuIGNtc1NpZ0x1dDE2VHlwZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgICByZXR1cm4gY21zU2lnTHV0QnRvQVR5cGU7Ci0gICAgfQotfQotCi0vKgotVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50cyBhIGNvbG91ciB0cmFuc2Zvcm0gdXNpbmcgdGFibGVzIG9mIDgtYml0IHByZWNpc2lvbi4KLVRoaXMgdHlwZSBjb250YWlucyBmb3VyIHByb2Nlc3NpbmcgZWxlbWVudHM6IGEgMyBieSAzIG1hdHJpeCAod2hpY2ggc2hhbGwgYmUKLXRoZSBpZGVudGl0eSBtYXRyaXggdW5sZXNzIHRoZSBpbnB1dCBjb2xvdXIgc3BhY2UgaXMgWFlaKSwgYSBzZXQgb2Ygb25lIGRpbWVuc2lvbmFsCi1pbnB1dCB0YWJsZXMsIGEgbXVsdGlkaW1lbnNpb25hbCBsb29rdXAgdGFibGUsIGFuZCBhIHNldCBvZiBvbmUgZGltZW5zaW9uYWwgb3V0cHV0Ci10YWJsZXMuIERhdGEgaXMgcHJvY2Vzc2VkIHVzaW5nIHRoZXNlIGVsZW1lbnRzIHZpYSB0aGUgZm9sbG93aW5nIHNlcXVlbmNlOgotKG1hdHJpeCkgLT4gKDFkIGlucHV0IHRhYmxlcykgIC0+IChtdWx0aWRpbWVuc2lvbmFsIGxvb2t1cCB0YWJsZSAtIENMVVQpIC0+ICgxZCBvdXRwdXQgdGFibGVzKQotCi1CeXRlIFBvc2l0aW9uICAgRmllbGQgTGVuZ3RoIChieXRlcykgIENvbnRlbnQgRW5jb2RlZCBhcy4uLgotOCAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgTnVtYmVyIG9mIElucHV0IENoYW5uZWxzIChpKSAgICB1SW50OE51bWJlcgotOSAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgTnVtYmVyIG9mIE91dHB1dCBDaGFubmVscyAobykgICB1SW50OE51bWJlcgotMTAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgTnVtYmVyIG9mIENMVVQgZ3JpZCBwb2ludHMgKGlkZW50aWNhbCBmb3IgZWFjaCBzaWRlKSAoZykgdUludDhOdW1iZXIKLTExICAgICAgICAgICAgICAgICAxICAgICAgICAgIFJlc2VydmVkIGZvciBwYWRkaW5nIChmaWxsIHdpdGggMDBoKQotCi0xMi4uMTUgICAgICAgICAgICAgNCAgICAgICAgICBFbmNvZGVkIGUwMCBwYXJhbWV0ZXIgICBzMTVGaXhlZDE2TnVtYmVyCi0qLwotCi0KLS8vIFJlYWQgOCBiaXQgdGFibGVzIGFzIGdhbW1hIGZ1bmN0aW9ucwotc3RhdGljCi1jbXNCb29sICBSZWFkOGJpdFRhYmxlcyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zSU9IQU5ETEVSKiBpbywgY21zUGlwZWxpbmUqIGx1dCwgaW50IG5DaGFubmVscykKLXsKLSAgICBjbXNVSW50OE51bWJlciogVGVtcCA9IE5VTEw7Ci0gICAgaW50IGksIGo7Ci0gICAgY21zVG9uZUN1cnZlKiBUYWJsZXNbY21zTUFYQ0hBTk5FTFNdOwotCi0gICAgaWYgKG5DaGFubmVscyA+IGNtc01BWENIQU5ORUxTKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKG5DaGFubmVscyA8PSAwKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBtZW1zZXQoVGFibGVzLCAwLCBzaXplb2YoVGFibGVzKSk7Ci0KLSAgICBUZW1wID0gKGNtc1VJbnQ4TnVtYmVyKikgX2Ntc01hbGxvYyhDb250ZXh0SUQsIDI1Nik7Ci0gICAgaWYgKFRlbXAgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0gICAgZm9yIChpPTA7IGkgPCBuQ2hhbm5lbHM7IGkrKykgewotICAgICAgICBUYWJsZXNbaV0gPSBjbXNCdWlsZFRhYnVsYXRlZFRvbmVDdXJ2ZTE2KENvbnRleHRJRCwgMjU2LCBOVUxMKTsKLSAgICAgICAgaWYgKFRhYmxlc1tpXSA9PSBOVUxMKSBnb3RvIEVycm9yOwotICAgIH0KLQotICAgIGZvciAoaT0wOyBpIDwgbkNoYW5uZWxzOyBpKyspIHsKLQotICAgICAgICBpZiAoaW8gLT5SZWFkKGlvLCBUZW1wLCAyNTYsIDEpICE9IDEpIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAgZm9yIChqPTA7IGogPCAyNTY7IGorKykKLSAgICAgICAgICAgIFRhYmxlc1tpXS0+VGFibGUxNltqXSA9IChjbXNVSW50MTZOdW1iZXIpIEZST01fOF9UT18xNihUZW1wW2pdKTsKLSAgICB9Ci0KLSAgICBfY21zRnJlZShDb250ZXh0SUQsIFRlbXApOwotICAgIFRlbXAgPSBOVUxMOwotCi0gICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKGx1dCwgY21zQVRfRU5ELCBjbXNTdGFnZUFsbG9jVG9uZUN1cnZlcyhDb250ZXh0SUQsIG5DaGFubmVscywgVGFibGVzKSkpCi0gICAgICAgIGdvdG8gRXJyb3I7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG5DaGFubmVsczsgaSsrKQotICAgICAgICBjbXNGcmVlVG9uZUN1cnZlKFRhYmxlc1tpXSk7Ci0KLSAgICByZXR1cm4gVFJVRTsKLQotRXJyb3I6Ci0gICAgZm9yIChpPTA7IGkgPCBuQ2hhbm5lbHM7IGkrKykgewotICAgICAgICBpZiAoVGFibGVzW2ldKSBjbXNGcmVlVG9uZUN1cnZlKFRhYmxlc1tpXSk7Ci0gICAgfQotCi0gICAgaWYgKFRlbXApIF9jbXNGcmVlKENvbnRleHRJRCwgVGVtcCk7Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotCi0KLXN0YXRpYwotY21zQm9vbCBXcml0ZThiaXRUYWJsZXMoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciBuLCBfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSogVGFibGVzKQotewotICAgIGludCBqOwotICAgIGNtc1VJbnQzMk51bWJlciBpOwotICAgIGNtc1VJbnQ4TnVtYmVyIHZhbDsKLQotICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7Ci0KLSAgICAgICAgaWYgKFRhYmxlcykgewotCi0gICAgICAgICAgICAvLyBVc3VhbCBjYXNlIG9mIGlkZW50aXR5IGN1cnZlcwotICAgICAgICAgICAgaWYgKChUYWJsZXMgLT5UaGVDdXJ2ZXNbaV0tPm5FbnRyaWVzID09IDIpICYmIAotICAgICAgICAgICAgICAgIChUYWJsZXMtPlRoZUN1cnZlc1tpXS0+VGFibGUxNlswXSA9PSAwKSAmJiAKLSAgICAgICAgICAgICAgICAoVGFibGVzLT5UaGVDdXJ2ZXNbaV0tPlRhYmxlMTZbMV0gPT0gNjU1MzUpKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7IGogPCAyNTY7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50OE51bWJlcihpbywgKGNtc1VJbnQ4TnVtYmVyKSBqKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgICAgIGlmIChUYWJsZXMgLT5UaGVDdXJ2ZXNbaV0tPm5FbnRyaWVzICE9IDI1NikgewotICAgICAgICAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX1JBTkdFLCAiTFVUOCBuZWVkcyAyNTYgZW50cmllcyBvbiBwcmVsaW5lYXJpemF0aW9uIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7IGogPCAyNTY7IGorKykgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoVGFibGVzICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gKGNtc1VJbnQ4TnVtYmVyKSBGUk9NXzE2X1RPXzgoVGFibGVzLT5UaGVDdXJ2ZXNbaV0tPlRhYmxlMTZbal0pOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IChjbXNVSW50OE51bWJlcikgajsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50OE51bWJlcihpbywgdmFsKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLy8gQ2hlY2sgb3ZlcmZsb3cKLXN0YXRpYwotY21zVUludDMyTnVtYmVyIHVpcG93KGNtc1VJbnQzMk51bWJlciBuLCBjbXNVSW50MzJOdW1iZXIgYSwgY21zVUludDMyTnVtYmVyIGIpCi17Ci0gICAgY21zVUludDMyTnVtYmVyIHJ2ID0gMSwgcmM7Ci0KLSAgICBpZiAoYSA9PSAwKSByZXR1cm4gMDsKLSAgICBpZiAobiA9PSAwKSByZXR1cm4gMDsKLQotICAgIGZvciAoOyBiID4gMDsgYi0tKSB7Ci0KLSAgICAgICAgcnYgKj0gYTsKLQotICAgICAgICAvLyBDaGVjayBmb3Igb3ZlcmZsb3cKLSAgICAgICAgaWYgKHJ2ID4gVUlOVF9NQVggLyBhKSByZXR1cm4gKGNtc1VJbnQzMk51bWJlcikgLTE7Ci0KLSAgICB9Ci0KLSAgICByYyA9IHJ2ICogbjsKLQotICAgIGlmIChydiAhPSByYyAvIG4pIHJldHVybiAoY21zVUludDMyTnVtYmVyKSAtMTsKLSAgICByZXR1cm4gcmM7Ci19Ci0KLQotLy8gVGhhdCB3aWxsIGNyZWF0ZSBhIE1QRSBMVVQgd2l0aCBNYXRyaXgsIHByZSB0YWJsZXMsIENMVVQgYW5kIHBvc3QgdGFibGVzLgotLy8gOCBiaXQgbHV0IG1heSBiZSBzY2FsZWQgZWFzZWx5IHRvIHY0IFBDUywgYnV0IHdlIG5lZWQgYWxzbyB0byBwcm9wZXJseSBhZGp1c3QKLS8vIFBDUyBvbiBCVG9BeHggdGFncyBhbmQgQXRvQiBpZiBhYnN0cmFjdC4gV2UgbmVlZCB0byBmaXggaW5wdXQgZGlyZWN0aW9uLgotCi1zdGF0aWMKLXZvaWQgKlR5cGVfTFVUOF9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyKiBuSXRlbXMsIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcpCi17Ci0gICAgY21zVUludDhOdW1iZXIgSW5wdXRDaGFubmVscywgT3V0cHV0Q2hhbm5lbHMsIENMVVRwb2ludHM7Ci0gICAgY21zVUludDhOdW1iZXIqIFRlbXAgPSBOVUxMOwotICAgIGNtc1BpcGVsaW5lKiBOZXdMVVQgPSBOVUxMOwotICAgIGNtc1VJbnQzMk51bWJlciBuVGFiU2l6ZSwgaTsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIE1hdHJpeFszKjNdOwotCi0gICAgKm5JdGVtcyA9IDA7Ci0KLSAgICBpZiAoIV9jbXNSZWFkVUludDhOdW1iZXIoaW8sICZJbnB1dENoYW5uZWxzKSkgZ290byBFcnJvcjsKLSAgICBpZiAoIV9jbXNSZWFkVUludDhOdW1iZXIoaW8sICZPdXRwdXRDaGFubmVscykpIGdvdG8gRXJyb3I7Ci0gICAgaWYgKCFfY21zUmVhZFVJbnQ4TnVtYmVyKGlvLCAmQ0xVVHBvaW50cykpIGdvdG8gRXJyb3I7Ci0KLSAgICAgaWYgKENMVVRwb2ludHMgPT0gMSkgZ290byBFcnJvcjsgLy8gSW1wb3NzaWJsZSB2YWx1ZSwgMCBmb3Igbm8gQ0xVVCBhbmQgdGhlbiAyIGF0IGxlYXN0Ci0KLSAgICAvLyBQYWRkaW5nCi0gICAgaWYgKCFfY21zUmVhZFVJbnQ4TnVtYmVyKGlvLCBOVUxMKSkgZ290byBFcnJvcjsKLQotICAgIC8vIERvIHNvbWUgY2hlY2tpbmcKLSAgICBpZiAoSW5wdXRDaGFubmVscyA9PSAwIHx8IElucHV0Q2hhbm5lbHMgPiBjbXNNQVhDSEFOTkVMUykgIGdvdG8gRXJyb3I7Ci0gICAgaWYgKE91dHB1dENoYW5uZWxzID09IDAgfHwgT3V0cHV0Q2hhbm5lbHMgPiBjbXNNQVhDSEFOTkVMUykgZ290byBFcnJvcjsKLQotICAgLy8gQWxsb2NhdGVzIGFuIGVtcHR5IFBpcGVsaW5lCi0gICAgTmV3TFVUID0gY21zUGlwZWxpbmVBbGxvYyhzZWxmIC0+Q29udGV4dElELCBJbnB1dENoYW5uZWxzLCBPdXRwdXRDaGFubmVscyk7Ci0gICAgaWYgKE5ld0xVVCA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgLy8gUmVhZCB0aGUgTWF0cml4Ci0gICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgICZNYXRyaXhbMF0pKSBnb3RvIEVycm9yOwotICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICAmTWF0cml4WzFdKSkgZ290byBFcnJvcjsKLSAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAgJk1hdHJpeFsyXSkpIGdvdG8gRXJyb3I7Ci0gICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgICZNYXRyaXhbM10pKSBnb3RvIEVycm9yOwotICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICAmTWF0cml4WzRdKSkgZ290byBFcnJvcjsKLSAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAgJk1hdHJpeFs1XSkpIGdvdG8gRXJyb3I7Ci0gICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgICZNYXRyaXhbNl0pKSBnb3RvIEVycm9yOwotICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICAmTWF0cml4WzddKSkgZ290byBFcnJvcjsKLSAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAgJk1hdHJpeFs4XSkpIGdvdG8gRXJyb3I7Ci0KLQotICAgIC8vIE9ubHkgb3BlcmF0ZXMgaWYgbm90IGlkZW50aXR5Li4uCi0gICAgaWYgKChJbnB1dENoYW5uZWxzID09IDMpICYmICFfY21zTUFUM2lzSWRlbnRpdHkoKGNtc01BVDMqKSBNYXRyaXgpKSB7Ci0KLSAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKE5ld0xVVCwgY21zQVRfQkVHSU4sIGNtc1N0YWdlQWxsb2NNYXRyaXgoc2VsZiAtPkNvbnRleHRJRCwgMywgMywgTWF0cml4LCBOVUxMKSkpCi0gICAgICAgICAgICBnb3RvIEVycm9yOwotICAgIH0KLQotICAgIC8vIEdldCBpbnB1dCB0YWJsZXMKLSAgICBpZiAoIVJlYWQ4Yml0VGFibGVzKHNlbGYgLT5Db250ZXh0SUQsIGlvLCAgTmV3TFVULCBJbnB1dENoYW5uZWxzKSkgZ290byBFcnJvcjsKLQotICAgIC8vIEdldCAzRCBDTFVULiBDaGVjayB0aGUgb3ZlcmZsb3cuLi4uCi0gICAgblRhYlNpemUgPSB1aXBvdyhPdXRwdXRDaGFubmVscywgQ0xVVHBvaW50cywgSW5wdXRDaGFubmVscyk7Ci0gICAgaWYgKG5UYWJTaXplID09IChjbXNVSW50MzJOdW1iZXIpIC0xKSBnb3RvIEVycm9yOwotICAgIGlmIChuVGFiU2l6ZSA+IDApIHsKLQotICAgICAgICBjbXNVSW50MTZOdW1iZXIgKlB0clcsICpUOwotICAgICAgIAotICAgICAgICBQdHJXID0gVCAgPSAoY21zVUludDE2TnVtYmVyKikgX2Ntc0NhbGxvYyhzZWxmIC0+Q29udGV4dElELCBuVGFiU2l6ZSwgc2l6ZW9mKGNtc1VJbnQxNk51bWJlcikpOwotICAgICAgICBpZiAoVCAgPT0gTlVMTCkgZ290byBFcnJvcjsKLQotICAgICAgICBUZW1wID0gKGNtc1VJbnQ4TnVtYmVyKikgX2Ntc01hbGxvYyhzZWxmIC0+Q29udGV4dElELCBuVGFiU2l6ZSk7Ci0gICAgICAgIGlmIChUZW1wID09IE5VTEwpIHsKLSAgICAgICAgICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFQpOwotICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbyAtPlJlYWQoaW8sIFRlbXAsIG5UYWJTaXplLCAxKSAhPSAxKSB7Ci0gICAgICAgICAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBUKTsKLSAgICAgICAgICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFRlbXApOwotICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBuVGFiU2l6ZTsgaSsrKSB7Ci0KLSAgICAgICAgICAgICpQdHJXKysgPSBGUk9NXzhfVE9fMTYoVGVtcFtpXSk7Ci0gICAgICAgIH0KLSAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgVGVtcCk7Ci0gICAgICAgIFRlbXAgPSBOVUxMOwotCi0gICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShOZXdMVVQsIGNtc0FUX0VORCwgY21zU3RhZ2VBbGxvY0NMdXQxNmJpdChzZWxmIC0+Q29udGV4dElELCBDTFVUcG9pbnRzLCBJbnB1dENoYW5uZWxzLCBPdXRwdXRDaGFubmVscywgVCkpKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgVCk7Ci0gICAgfQotCi0KLSAgICAvLyBHZXQgb3V0cHV0IHRhYmxlcwotICAgIGlmICghUmVhZDhiaXRUYWJsZXMoc2VsZiAtPkNvbnRleHRJRCwgaW8sICBOZXdMVVQsIE91dHB1dENoYW5uZWxzKSkgZ290byBFcnJvcjsKLQotICAgICpuSXRlbXMgPSAxOwotICAgIHJldHVybiBOZXdMVVQ7Ci0KLUVycm9yOgotICAgIGlmIChOZXdMVVQgIT0gTlVMTCkgY21zUGlwZWxpbmVGcmVlKE5ld0xVVCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFNpemVPZlRhZyk7Ci19Ci0KLS8vIFdlIG9ubHkgYWxsb3cgYSBzcGVjaWZpYyBNUEUgc3RydWN0dXJlOiBNYXRyaXggcGx1cyBwcmVsaW4sIHBsdXMgY2x1dCwgcGx1cyBwb3N0LWxpbi4KLXN0YXRpYwotY21zQm9vbCAgVHlwZV9MVVQ4X1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQotewotICAgIGNtc1VJbnQzMk51bWJlciBqLCBuVGFiU2l6ZTsKLSAgICBjbXNVSW50OE51bWJlciAgdmFsOwotICAgIGNtc1BpcGVsaW5lKiBOZXdMVVQgPSAoY21zUGlwZWxpbmUqKSBQdHI7Ci0gICAgY21zU3RhZ2UqIG1wZTsKLSAgICBfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSogUHJlTVBFID0gTlVMTCwgKlBvc3RNUEUgPSBOVUxMOwotICAgIF9jbXNTdGFnZU1hdHJpeERhdGEqIE1hdE1QRSA9IE5VTEw7Ci0gICAgX2Ntc1N0YWdlQ0x1dERhdGEqIGNsdXQgPSBOVUxMOwotICAgIGludCBjbHV0UG9pbnRzOwotCi0gICAgLy8gRGlzYXNzZW1ibGUgdGhlIExVVCBpbnRvIGNvbXBvbmVudHMuCi0gICAgbXBlID0gTmV3TFVUIC0+IEVsZW1lbnRzOwotICAgIGlmIChtcGUgLT5UeXBlID09IGNtc1NpZ01hdHJpeEVsZW1UeXBlKSB7Ci0KLSAgICAgICAgTWF0TVBFID0gKF9jbXNTdGFnZU1hdHJpeERhdGEqKSBtcGUgLT5EYXRhOwotICAgICAgICBtcGUgPSBtcGUgLT4gTmV4dDsKLSAgICB9Ci0KLSAgICBpZiAobXBlICE9IE5VTEwgJiYgbXBlIC0+VHlwZSA9PSBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlKSB7Ci0gICAgICAgIFByZU1QRSA9IChfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSopIG1wZSAtPkRhdGE7Ci0gICAgICAgIG1wZSA9IG1wZSAtPiBOZXh0OwotICAgIH0KLQotICAgIGlmIChtcGUgIT0gTlVMTCAmJiBtcGUgLT5UeXBlID09IGNtc1NpZ0NMdXRFbGVtVHlwZSkgewotICAgICAgICBjbHV0ICA9IChfY21zU3RhZ2VDTHV0RGF0YSopIG1wZSAtPiBEYXRhOwotICAgICAgICBtcGUgPSBtcGUgLT5OZXh0OwotICAgIH0KLQotICAgIGlmIChtcGUgIT0gTlVMTCAmJiBtcGUgLT5UeXBlID09IGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUpIHsKLSAgICAgICAgUG9zdE1QRSA9IChfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSopIG1wZSAtPkRhdGE7Ci0gICAgICAgIG1wZSA9IG1wZSAtPiBOZXh0OwotICAgIH0KLQotICAgIC8vIFRoYXQgc2hvdWxkIGJlIGFsbAotICAgIGlmIChtcGUgIT0gTlVMTCkgewotICAgICAgICBjbXNTaWduYWxFcnJvcihtcGUtPkNvbnRleHRJRCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJMVVQgaXMgbm90IHN1aXRhYmxlIHRvIGJlIHNhdmVkIGFzIExVVDgiKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotCi0gICAgaWYgKGNsdXQgPT0gTlVMTCkKLSAgICAgICAgY2x1dFBvaW50cyA9IDA7Ci0gICAgZWxzZQotICAgICAgICBjbHV0UG9pbnRzICAgID0gY2x1dC0+UGFyYW1zLT5uU2FtcGxlc1swXTsKLQotICAgIGlmICghX2Ntc1dyaXRlVUludDhOdW1iZXIoaW8sIChjbXNVSW50OE51bWJlcikgTmV3TFVUIC0+SW5wdXRDaGFubmVscykpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQ4TnVtYmVyKGlvLCAoY21zVUludDhOdW1iZXIpIE5ld0xVVCAtPk91dHB1dENoYW5uZWxzKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghX2Ntc1dyaXRlVUludDhOdW1iZXIoaW8sIChjbXNVSW50OE51bWJlcikgY2x1dFBvaW50cykpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQ4TnVtYmVyKGlvLCAwKSkgcmV0dXJuIEZBTFNFOyAvLyBQYWRkaW5nCi0KLQotICAgIGlmIChNYXRNUEUgIT0gTlVMTCkgewotCi0gICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBNYXRNUEUgLT4gRG91YmxlWzBdKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgTWF0TVBFIC0+IERvdWJsZVsxXSkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIE1hdE1QRSAtPiBEb3VibGVbMl0pKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBNYXRNUEUgLT4gRG91YmxlWzNdKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgTWF0TVBFIC0+IERvdWJsZVs0XSkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIE1hdE1QRSAtPiBEb3VibGVbNV0pKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBNYXRNUEUgLT4gRG91YmxlWzZdKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgTWF0TVBFIC0+IERvdWJsZVs3XSkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIE1hdE1QRSAtPiBEb3VibGVbOF0pKSByZXR1cm4gRkFMU0U7Ci0KLSAgICB9Ci0gICAgZWxzZSB7Ci0KLSAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIDEpKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCAwKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCAxKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCAwKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgMSkpIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICAvLyBUaGUgcHJlbGluZWFyaXphdGlvbiB0YWJsZQotICAgIGlmICghV3JpdGU4Yml0VGFibGVzKHNlbGYgLT5Db250ZXh0SUQsIGlvLCBOZXdMVVQgLT5JbnB1dENoYW5uZWxzLCBQcmVNUEUpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBuVGFiU2l6ZSA9IHVpcG93KE5ld0xVVC0+T3V0cHV0Q2hhbm5lbHMsIGNsdXRQb2ludHMsIE5ld0xVVCAtPklucHV0Q2hhbm5lbHMpOwotICAgIGlmIChuVGFiU2l6ZSA9PSAoY21zVUludDMyTnVtYmVyKSAtMSkgcmV0dXJuIEZBTFNFOwotICAgIGlmIChuVGFiU2l6ZSA+IDApIHsKLQotICAgICAgICAvLyBUaGUgM0QgQ0xVVC4KLSAgICAgICAgaWYgKGNsdXQgIT0gTlVMTCkgewotCi0gICAgICAgICAgICBmb3IgKGo9MDsgaiA8IG5UYWJTaXplOyBqKyspIHsKLQotICAgICAgICAgICAgICAgIHZhbCA9IChjbXNVSW50OE51bWJlcikgRlJPTV8xNl9UT184KGNsdXQgLT5UYWIuVFtqXSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50OE51bWJlcihpbywgdmFsKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhlIHBvc3RsaW5lYXJpemF0aW9uIHRhYmxlCi0gICAgaWYgKCFXcml0ZThiaXRUYWJsZXMoc2VsZiAtPkNvbnRleHRJRCwgaW8sIE5ld0xVVCAtPk91dHB1dENoYW5uZWxzLCBQb3N0TVBFKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgcmV0dXJuIFRSVUU7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7Ci19Ci0KLQotc3RhdGljCi12b2lkKiBUeXBlX0xVVDhfRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKLXsKLSAgICByZXR1cm4gKHZvaWQqKSBjbXNQaXBlbGluZUR1cCgoY21zUGlwZWxpbmUqKSBQdHIpOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOwotfQotCi1zdGF0aWMKLXZvaWQgVHlwZV9MVVQ4X0ZyZWUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCB2b2lkKiBQdHIpCi17Ci0gICAgY21zUGlwZWxpbmVGcmVlKChjbXNQaXBlbGluZSopIFB0cik7Ci0gICAgcmV0dXJuOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIFR5cGUgY21zU2lnTHV0MTZUeXBlCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0vLyBSZWFkIDE2IGJpdCB0YWJsZXMgYXMgZ2FtbWEgZnVuY3Rpb25zCi1zdGF0aWMKLWNtc0Jvb2wgIFJlYWQxNmJpdFRhYmxlcyhjbXNDb250ZXh0IENvbnRleHRJRCwgY21zSU9IQU5ETEVSKiBpbywgY21zUGlwZWxpbmUqIGx1dCwgaW50IG5DaGFubmVscywgaW50IG5FbnRyaWVzKQotewotICAgIGludCBpOwotICAgIGNtc1RvbmVDdXJ2ZSogVGFibGVzW2Ntc01BWENIQU5ORUxTXTsKLQotICAgIC8vIE1heWJlIGFuIGVtcHR5IHRhYmxlPyAodGhpcyBpcyBhIGxjbXMgZXh0ZW5zaW9uKQotICAgIGlmIChuRW50cmllcyA8PSAwKSByZXR1cm4gVFJVRTsKLQotICAgIC8vIENoZWNrIGZvciBtYWxpY2lvdXMgcHJvZmlsZXMKLSAgICBpZiAobkVudHJpZXMgPCAyKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKG5DaGFubmVscyA+IGNtc01BWENIQU5ORUxTKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAvLyBJbml0IHRhYmxlIHRvIHplcm8KLSAgICBtZW1zZXQoVGFibGVzLCAwLCBzaXplb2YoVGFibGVzKSk7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG5DaGFubmVsczsgaSsrKSB7Ci0KLSAgICAgICAgVGFibGVzW2ldID0gY21zQnVpbGRUYWJ1bGF0ZWRUb25lQ3VydmUxNihDb250ZXh0SUQsIG5FbnRyaWVzLCBOVUxMKTsKLSAgICAgICAgaWYgKFRhYmxlc1tpXSA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZBcnJheShpbywgbkVudHJpZXMsIFRhYmxlc1tpXS0+VGFibGUxNikpIGdvdG8gRXJyb3I7Ci0gICAgfQotCi0KLSAgICAvLyBBZGQgdGhlIHRhYmxlICh3aGljaCBtYXkgY2VydGFpbmx5IGJlIGFuIGlkZW50aXR5LCBidXQgdGhpcyBpcyB1cCB0byB0aGUgb3B0aW1pemVyLCBub3QgdGhlIHJlYWRpbmcgY29kZSkKLSAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UobHV0LCBjbXNBVF9FTkQsIGNtc1N0YWdlQWxsb2NUb25lQ3VydmVzKENvbnRleHRJRCwgbkNoYW5uZWxzLCBUYWJsZXMpKSkKLSAgICAgICAgZ290byBFcnJvcjsKLQotICAgIGZvciAoaT0wOyBpIDwgbkNoYW5uZWxzOyBpKyspCi0gICAgICAgIGNtc0ZyZWVUb25lQ3VydmUoVGFibGVzW2ldKTsKLQotICAgIHJldHVybiBUUlVFOwotCi1FcnJvcjoKLSAgICBmb3IgKGk9MDsgaSA8IG5DaGFubmVsczsgaSsrKSB7Ci0gICAgICAgIGlmIChUYWJsZXNbaV0pIGNtc0ZyZWVUb25lQ3VydmUoVGFibGVzW2ldKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLXN0YXRpYwotY21zQm9vbCBXcml0ZTE2Yml0VGFibGVzKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNJT0hBTkRMRVIqIGlvLCBfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSogVGFibGVzKQotewotICAgIGludCBqOwotICAgIGNtc1VJbnQzMk51bWJlciBpOwotICAgIGNtc1VJbnQxNk51bWJlciB2YWw7Ci0gICAgaW50IG5FbnRyaWVzOwotCi0gICAgX2Ntc0Fzc2VydChUYWJsZXMgIT0gTlVMTCk7Ci0KLSAgICBuRW50cmllcyA9IFRhYmxlcy0+VGhlQ3VydmVzWzBdLT5uRW50cmllczsKLQotICAgIGZvciAoaT0wOyBpIDwgVGFibGVzIC0+bkN1cnZlczsgaSsrKSB7Ci0KLSAgICAgICAgZm9yIChqPTA7IGogPCBuRW50cmllczsgaisrKSB7Ci0KLSAgICAgICAgICAgIHZhbCA9IFRhYmxlcy0+VGhlQ3VydmVzW2ldLT5UYWJsZTE2W2pdOyAgICAgICAgCi0gICAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgdmFsKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihDb250ZXh0SUQpOwotfQotCi1zdGF0aWMKLXZvaWQgKlR5cGVfTFVUMTZfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQotewotICAgIGNtc1VJbnQ4TnVtYmVyIElucHV0Q2hhbm5lbHMsIE91dHB1dENoYW5uZWxzLCBDTFVUcG9pbnRzOwotICAgIGNtc1BpcGVsaW5lKiBOZXdMVVQgPSBOVUxMOwotICAgIGNtc1VJbnQzMk51bWJlciBuVGFiU2l6ZTsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIE1hdHJpeFszKjNdOwotICAgIGNtc1VJbnQxNk51bWJlciBJbnB1dEVudHJpZXMsIE91dHB1dEVudHJpZXM7Ci0KLSAgICAqbkl0ZW1zID0gMDsKLQotICAgIGlmICghX2Ntc1JlYWRVSW50OE51bWJlcihpbywgJklucHV0Q2hhbm5lbHMpKSByZXR1cm4gTlVMTDsKLSAgICBpZiAoIV9jbXNSZWFkVUludDhOdW1iZXIoaW8sICZPdXRwdXRDaGFubmVscykpIHJldHVybiBOVUxMOwotICAgIGlmICghX2Ntc1JlYWRVSW50OE51bWJlcihpbywgJkNMVVRwb2ludHMpKSByZXR1cm4gTlVMTDsgICAvLyAyNTUgbWF4aW11bQotCi0gICAgLy8gUGFkZGluZwotICAgIGlmICghX2Ntc1JlYWRVSW50OE51bWJlcihpbywgTlVMTCkpIHJldHVybiBOVUxMOwotCi0gICAgLy8gRG8gc29tZSBjaGVja2luZwotICAgIGlmIChJbnB1dENoYW5uZWxzID09IDAgfHwgSW5wdXRDaGFubmVscyA+IGNtc01BWENIQU5ORUxTKSAgZ290byBFcnJvcjsKLSAgICBpZiAoT3V0cHV0Q2hhbm5lbHMgPT0gMCB8fCBPdXRwdXRDaGFubmVscyA+IGNtc01BWENIQU5ORUxTKSBnb3RvIEVycm9yOwotCi0gICAgLy8gQWxsb2NhdGVzIGFuIGVtcHR5IExVVAotICAgIE5ld0xVVCA9IGNtc1BpcGVsaW5lQWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgSW5wdXRDaGFubmVscywgT3V0cHV0Q2hhbm5lbHMpOwotICAgIGlmIChOZXdMVVQgPT0gTlVMTCkgZ290byBFcnJvcjsKLQotICAgIC8vIFJlYWQgdGhlIE1hdHJpeAotICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICAmTWF0cml4WzBdKSkgZ290byBFcnJvcjsKLSAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAgJk1hdHJpeFsxXSkpIGdvdG8gRXJyb3I7Ci0gICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgICZNYXRyaXhbMl0pKSBnb3RvIEVycm9yOwotICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICAmTWF0cml4WzNdKSkgZ290byBFcnJvcjsKLSAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAgJk1hdHJpeFs0XSkpIGdvdG8gRXJyb3I7Ci0gICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgICZNYXRyaXhbNV0pKSBnb3RvIEVycm9yOwotICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICAmTWF0cml4WzZdKSkgZ290byBFcnJvcjsKLSAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAgJk1hdHJpeFs3XSkpIGdvdG8gRXJyb3I7Ci0gICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgICZNYXRyaXhbOF0pKSBnb3RvIEVycm9yOwotCi0KLSAgICAvLyBPbmx5IG9wZXJhdGVzIG9uIDMgY2hhbm5lbHMKLSAgICBpZiAoKElucHV0Q2hhbm5lbHMgPT0gMykgJiYgIV9jbXNNQVQzaXNJZGVudGl0eSgoY21zTUFUMyopIE1hdHJpeCkpIHsKLQotICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTmV3TFVULCBjbXNBVF9FTkQsIGNtc1N0YWdlQWxsb2NNYXRyaXgoc2VsZiAtPkNvbnRleHRJRCwgMywgMywgTWF0cml4LCBOVUxMKSkpCi0gICAgICAgICAgICBnb3RvIEVycm9yOwotICAgIH0KLQotICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sICZJbnB1dEVudHJpZXMpKSBnb3RvIEVycm9yOwotICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sICZPdXRwdXRFbnRyaWVzKSkgZ290byBFcnJvcjsKLQotICAgIGlmIChJbnB1dEVudHJpZXMgPiAweDdGRkYgfHwgT3V0cHV0RW50cmllcyA+IDB4N0ZGRikgZ290byBFcnJvcjsKLSAgICBpZiAoQ0xVVHBvaW50cyA9PSAxKSBnb3RvIEVycm9yOyAvLyBJbXBvc3NpYmxlIHZhbHVlLCAwIGZvciBubyBDTFVUIGFuZCB0aGVuIDIgYXQgbGVhc3QKLQotICAgIC8vIEdldCBpbnB1dCB0YWJsZXMKLSAgICBpZiAoIVJlYWQxNmJpdFRhYmxlcyhzZWxmIC0+Q29udGV4dElELCBpbywgIE5ld0xVVCwgSW5wdXRDaGFubmVscywgSW5wdXRFbnRyaWVzKSkgZ290byBFcnJvcjsKLQotICAgIC8vIEdldCAzRCBDTFVUCi0gICAgblRhYlNpemUgPSB1aXBvdyhPdXRwdXRDaGFubmVscywgQ0xVVHBvaW50cywgSW5wdXRDaGFubmVscyk7Ci0gICAgaWYgKG5UYWJTaXplID09IChjbXNVSW50MzJOdW1iZXIpIC0xKSBnb3RvIEVycm9yOwotICAgIGlmIChuVGFiU2l6ZSA+IDApIHsKLQotICAgICAgICBjbXNVSW50MTZOdW1iZXIgKlQ7Ci0KLSAgICAgICAgVCAgPSAoY21zVUludDE2TnVtYmVyKikgX2Ntc0NhbGxvYyhzZWxmIC0+Q29udGV4dElELCBuVGFiU2l6ZSwgc2l6ZW9mKGNtc1VJbnQxNk51bWJlcikpOwotICAgICAgICBpZiAoVCAgPT0gTlVMTCkgZ290byBFcnJvcjsKLQotICAgICAgICBpZiAoIV9jbXNSZWFkVUludDE2QXJyYXkoaW8sIG5UYWJTaXplLCBUKSkgewotICAgICAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgVCk7Ci0gICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKE5ld0xVVCwgY21zQVRfRU5ELCBjbXNTdGFnZUFsbG9jQ0x1dDE2Yml0KHNlbGYgLT5Db250ZXh0SUQsIENMVVRwb2ludHMsIElucHV0Q2hhbm5lbHMsIE91dHB1dENoYW5uZWxzLCBUKSkpIHsKLSAgICAgICAgICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFQpOwotICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICAgICAgfQotICAgICAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBUKTsKLSAgICB9Ci0KLQotICAgIC8vIEdldCBvdXRwdXQgdGFibGVzCi0gICAgaWYgKCFSZWFkMTZiaXRUYWJsZXMoc2VsZiAtPkNvbnRleHRJRCwgaW8sICBOZXdMVVQsIE91dHB1dENoYW5uZWxzLCBPdXRwdXRFbnRyaWVzKSkgZ290byBFcnJvcjsKLQotICAgICpuSXRlbXMgPSAxOwotICAgIHJldHVybiBOZXdMVVQ7Ci0KLUVycm9yOgotICAgIGlmIChOZXdMVVQgIT0gTlVMTCkgY21zUGlwZWxpbmVGcmVlKE5ld0xVVCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFNpemVPZlRhZyk7Ci19Ci0KLS8vIFdlIG9ubHkgYWxsb3cgc29tZSBzcGVjaWZpYyBNUEUgc3RydWN0dXJlczogTWF0cml4IHBsdXMgcHJlbGluLCBwbHVzIGNsdXQsIHBsdXMgcG9zdC1saW4uCi0vLyBTb21lIGVtcHR5IGRlZmF1bHRzIGFyZSBjcmVhdGVkIGZvciBtaXNzaW5nIHBhcnRzCi0KLXN0YXRpYwotY21zQm9vbCAgVHlwZV9MVVQxNl9Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKLXsKLSAgICBjbXNVSW50MzJOdW1iZXIgblRhYlNpemU7Ci0gICAgY21zUGlwZWxpbmUqIE5ld0xVVCA9IChjbXNQaXBlbGluZSopIFB0cjsKLSAgICBjbXNTdGFnZSogbXBlOwotICAgIF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKiBQcmVNUEUgPSBOVUxMLCAqUG9zdE1QRSA9IE5VTEw7Ci0gICAgX2Ntc1N0YWdlTWF0cml4RGF0YSogTWF0TVBFID0gTlVMTDsKLSAgICBfY21zU3RhZ2VDTHV0RGF0YSogY2x1dCA9IE5VTEw7Ci0gICAgaW50IGksIElucHV0Q2hhbm5lbHMsIE91dHB1dENoYW5uZWxzLCBjbHV0UG9pbnRzOwotCi0gICAgLy8gRGlzYXNzZW1ibGUgdGhlIExVVCBpbnRvIGNvbXBvbmVudHMuCi0gICAgbXBlID0gTmV3TFVUIC0+IEVsZW1lbnRzOwotICAgIGlmIChtcGUgIT0gTlVMTCAmJiBtcGUgLT5UeXBlID09IGNtc1NpZ01hdHJpeEVsZW1UeXBlKSB7Ci0KLSAgICAgICAgTWF0TVBFID0gKF9jbXNTdGFnZU1hdHJpeERhdGEqKSBtcGUgLT5EYXRhOwotICAgICAgICBtcGUgPSBtcGUgLT4gTmV4dDsKLSAgICB9Ci0KLQotICAgIGlmIChtcGUgIT0gTlVMTCAmJiBtcGUgLT5UeXBlID09IGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUpIHsKLSAgICAgICAgUHJlTVBFID0gKF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKikgbXBlIC0+RGF0YTsKLSAgICAgICAgbXBlID0gbXBlIC0+IE5leHQ7Ci0gICAgfQotCi0gICAgaWYgKG1wZSAhPSBOVUxMICYmIG1wZSAtPlR5cGUgPT0gY21zU2lnQ0x1dEVsZW1UeXBlKSB7Ci0gICAgICAgIGNsdXQgID0gKF9jbXNTdGFnZUNMdXREYXRhKikgbXBlIC0+IERhdGE7Ci0gICAgICAgIG1wZSA9IG1wZSAtPk5leHQ7Ci0gICAgfQotCi0gICAgaWYgKG1wZSAhPSBOVUxMICYmIG1wZSAtPlR5cGUgPT0gY21zU2lnQ3VydmVTZXRFbGVtVHlwZSkgewotICAgICAgICBQb3N0TVBFID0gKF9jbXNTdGFnZVRvbmVDdXJ2ZXNEYXRhKikgbXBlIC0+RGF0YTsKLSAgICAgICAgbXBlID0gbXBlIC0+IE5leHQ7Ci0gICAgfQotCi0gICAgLy8gVGhhdCBzaG91bGQgYmUgYWxsCi0gICAgaWYgKG1wZSAhPSBOVUxMKSB7Ci0gICAgICAgIGNtc1NpZ25hbEVycm9yKG1wZS0+Q29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIkxVVCBpcyBub3Qgc3VpdGFibGUgdG8gYmUgc2F2ZWQgYXMgTFVUMTYiKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIElucHV0Q2hhbm5lbHMgID0gY21zUGlwZWxpbmVJbnB1dENoYW5uZWxzKE5ld0xVVCk7Ci0gICAgT3V0cHV0Q2hhbm5lbHMgPSBjbXNQaXBlbGluZU91dHB1dENoYW5uZWxzKE5ld0xVVCk7Ci0KLSAgICBpZiAoY2x1dCA9PSBOVUxMKQotICAgICAgICBjbHV0UG9pbnRzID0gMDsKLSAgICBlbHNlCi0gICAgICAgIGNsdXRQb2ludHMgICAgPSBjbHV0LT5QYXJhbXMtPm5TYW1wbGVzWzBdOwotCi0gICAgaWYgKCFfY21zV3JpdGVVSW50OE51bWJlcihpbywgKGNtc1VJbnQ4TnVtYmVyKSBJbnB1dENoYW5uZWxzKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghX2Ntc1dyaXRlVUludDhOdW1iZXIoaW8sIChjbXNVSW50OE51bWJlcikgT3V0cHV0Q2hhbm5lbHMpKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGVVSW50OE51bWJlcihpbywgKGNtc1VJbnQ4TnVtYmVyKSBjbHV0UG9pbnRzKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghX2Ntc1dyaXRlVUludDhOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7IC8vIFBhZGRpbmcKLQotCi0gICAgaWYgKE1hdE1QRSAhPSBOVUxMKSB7Ci0KLSAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIE1hdE1QRSAtPiBEb3VibGVbMF0pKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBNYXRNUEUgLT4gRG91YmxlWzFdKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgTWF0TVBFIC0+IERvdWJsZVsyXSkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIE1hdE1QRSAtPiBEb3VibGVbM10pKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBNYXRNUEUgLT4gRG91YmxlWzRdKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgTWF0TVBFIC0+IERvdWJsZVs1XSkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIE1hdE1QRSAtPiBEb3VibGVbNl0pKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBNYXRNUEUgLT4gRG91YmxlWzddKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgTWF0TVBFIC0+IERvdWJsZVs4XSkpIHJldHVybiBGQUxTRTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0KLSAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIDEpKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCAwKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCAxKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCAwKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgMSkpIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLQotICAgIGlmIChQcmVNUEUgIT0gTlVMTCkgewotICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgKGNtc1VJbnQxNk51bWJlcikgUHJlTVBFIC0+VGhlQ3VydmVzWzBdLT5uRW50cmllcykpIHJldHVybiBGQUxTRTsKLSAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIDIpKSByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKFBvc3RNUEUgIT0gTlVMTCkgewotICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgKGNtc1VJbnQxNk51bWJlcikgUG9zdE1QRSAtPlRoZUN1cnZlc1swXS0+bkVudHJpZXMpKSByZXR1cm4gRkFMU0U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIDIpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICB9Ci0KLSAgICAvLyBUaGUgcHJlbGluZWFyaXphdGlvbiB0YWJsZQotCi0gICAgaWYgKFByZU1QRSAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICghV3JpdGUxNmJpdFRhYmxlcyhzZWxmIC0+Q29udGV4dElELCBpbywgUHJlTVBFKSkgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgZm9yIChpPTA7IGkgPCBJbnB1dENoYW5uZWxzOyBpKyspIHsKLQotICAgICAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgMHhmZmZmKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgblRhYlNpemUgPSB1aXBvdyhPdXRwdXRDaGFubmVscywgY2x1dFBvaW50cywgSW5wdXRDaGFubmVscyk7Ci0gICAgaWYgKG5UYWJTaXplID09IChjbXNVSW50MzJOdW1iZXIpIC0xKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKG5UYWJTaXplID4gMCkgewotICAgICAgICAvLyBUaGUgM0QgQ0xVVC4KLSAgICAgICAgaWYgKGNsdXQgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MTZBcnJheShpbywgblRhYlNpemUsIGNsdXQtPlRhYi5UKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhlIHBvc3RsaW5lYXJpemF0aW9uIHRhYmxlCi0gICAgaWYgKFBvc3RNUEUgIT0gTlVMTCkgewotICAgICAgICBpZiAoIVdyaXRlMTZiaXRUYWJsZXMoc2VsZiAtPkNvbnRleHRJRCwgaW8sIFBvc3RNUEUpKSByZXR1cm4gRkFMU0U7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBmb3IgKGk9MDsgaSA8IE91dHB1dENoYW5uZWxzOyBpKyspIHsKLQotICAgICAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgMHhmZmZmKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7Ci19Ci0KLXN0YXRpYwotdm9pZCogVHlwZV9MVVQxNl9EdXAoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjb25zdCB2b2lkICpQdHIsIGNtc1VJbnQzMk51bWJlciBuKQotewotICAgIHJldHVybiAodm9pZCopIGNtc1BpcGVsaW5lRHVwKChjbXNQaXBlbGluZSopIFB0cik7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Ci19Ci0KLXN0YXRpYwotdm9pZCBUeXBlX0xVVDE2X0ZyZWUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCB2b2lkKiBQdHIpCi17Ci0gICAgY21zUGlwZWxpbmVGcmVlKChjbXNQaXBlbGluZSopIFB0cik7Ci0gICAgcmV0dXJuOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKLX0KLQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gVHlwZSBjbXNTaWdMdXRBVG9CVHlwZQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCi0vLyBWNCBzdHVmZi4gUmVhZCBtYXRyaXggZm9yIEx1dEF0b0IgYW5kIEx1dEJ0b0EKLQotc3RhdGljCi1jbXNTdGFnZSogUmVhZE1hdHJpeChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciBPZmZzZXQpCi17Ci0gICAgY21zRmxvYXQ2NE51bWJlciBkTWF0WzMqM107Ci0gICAgY21zRmxvYXQ2NE51bWJlciBkT2ZmWzNdOwotICAgIGNtc1N0YWdlKiBNYXQ7Ci0KLSAgICAvLyBHbyB0byBhZGRyZXNzCi0gICAgaWYgKCFpbyAtPiBTZWVrKGlvLCBPZmZzZXQpKSByZXR1cm4gTlVMTDsKLQotICAgIC8vIFJlYWQgdGhlIE1hdHJpeAotICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICZkTWF0WzBdKSkgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgJmRNYXRbMV0pKSByZXR1cm4gTlVMTDsKLSAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAmZE1hdFsyXSkpIHJldHVybiBOVUxMOwotICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICZkTWF0WzNdKSkgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgJmRNYXRbNF0pKSByZXR1cm4gTlVMTDsKLSAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAmZE1hdFs1XSkpIHJldHVybiBOVUxMOwotICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICZkTWF0WzZdKSkgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgJmRNYXRbN10pKSByZXR1cm4gTlVMTDsKLSAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAmZE1hdFs4XSkpIHJldHVybiBOVUxMOwotCi0gICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgJmRPZmZbMF0pKSByZXR1cm4gTlVMTDsKLSAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAmZE9mZlsxXSkpIHJldHVybiBOVUxMOwotICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICZkT2ZmWzJdKSkgcmV0dXJuIE5VTEw7Ci0KLSAgICBNYXQgPSBjbXNTdGFnZUFsbG9jTWF0cml4KHNlbGYgLT5Db250ZXh0SUQsIDMsIDMsIGRNYXQsIGRPZmYpOwotCi0gICAgIHJldHVybiBNYXQ7Ci19Ci0KLQotCi0KLS8vICBWNCBzdHVmZi4gUmVhZCBDTFVUIHBhcnQgZm9yIEx1dEF0b0IgYW5kIEx1dEJ0b0EKLQotc3RhdGljCi1jbXNTdGFnZSogUmVhZENMVVQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIgT2Zmc2V0LCBpbnQgSW5wdXRDaGFubmVscywgaW50IE91dHB1dENoYW5uZWxzKQotewotICAgIGNtc1VJbnQ4TnVtYmVyICBncmlkUG9pbnRzOFtjbXNNQVhDSEFOTkVMU107IC8vIE51bWJlciBvZiBncmlkIHBvaW50cyBpbiBlYWNoIGRpbWVuc2lvbi4KLSAgICBjbXNVSW50MzJOdW1iZXIgR3JpZFBvaW50c1tjbXNNQVhDSEFOTkVMU10sIGk7Ci0gICAgY21zVUludDhOdW1iZXIgIFByZWNpc2lvbjsKLSAgICBjbXNTdGFnZSogQ0xVVDsKLSAgICBfY21zU3RhZ2VDTHV0RGF0YSogRGF0YTsKLQotICAgIGlmICghaW8gLT4gU2VlayhpbywgT2Zmc2V0KSkgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKGlvIC0+IFJlYWQoaW8sIGdyaWRQb2ludHM4LCBjbXNNQVhDSEFOTkVMUywgMSkgIT0gMSkgcmV0dXJuIE5VTEw7Ci0KLQotICAgIGZvciAoaT0wOyBpIDwgY21zTUFYQ0hBTk5FTFM7IGkrKykgewotCi0gICAgICAgIGlmIChncmlkUG9pbnRzOFtpXSA9PSAxKSByZXR1cm4gTlVMTDsgLy8gSW1wb3NzaWJsZSB2YWx1ZSwgMCBmb3Igbm8gQ0xVVCBhbmQgdGhlbiAyIGF0IGxlYXN0Ci0gICAgICAgIEdyaWRQb2ludHNbaV0gPSBncmlkUG9pbnRzOFtpXTsKLSAgICB9Ci0KLSAgICBpZiAoIV9jbXNSZWFkVUludDhOdW1iZXIoaW8sICZQcmVjaXNpb24pKSByZXR1cm4gTlVMTDsKLQotICAgIGlmICghX2Ntc1JlYWRVSW50OE51bWJlcihpbywgTlVMTCkpIHJldHVybiBOVUxMOwotICAgIGlmICghX2Ntc1JlYWRVSW50OE51bWJlcihpbywgTlVMTCkpIHJldHVybiBOVUxMOwotICAgIGlmICghX2Ntc1JlYWRVSW50OE51bWJlcihpbywgTlVMTCkpIHJldHVybiBOVUxMOwotCi0gICAgQ0xVVCA9IGNtc1N0YWdlQWxsb2NDTHV0MTZiaXRHcmFudWxhcihzZWxmIC0+Q29udGV4dElELCBHcmlkUG9pbnRzLCBJbnB1dENoYW5uZWxzLCBPdXRwdXRDaGFubmVscywgTlVMTCk7Ci0gICAgaWYgKENMVVQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBEYXRhID0gKF9jbXNTdGFnZUNMdXREYXRhKikgQ0xVVCAtPkRhdGE7Ci0KLSAgICAvLyBQcmVjaXNpb24gY2FuIGJlIDEgb3IgMiBieXRlcwotICAgIGlmIChQcmVjaXNpb24gPT0gMSkgewotCi0gICAgICAgIGNtc1VJbnQ4TnVtYmVyICB2OwotCi0gICAgICAgIGZvciAoaT0wOyBpIDwgRGF0YSAtPm5FbnRyaWVzOyBpKyspIHsKLQotICAgICAgICAgICAgaWYgKGlvIC0+UmVhZChpbywgJnYsIHNpemVvZihjbXNVSW50OE51bWJlciksIDEpICE9IDEpIHsKLSAgICAgICAgICAgICAgY21zU3RhZ2VGcmVlKENMVVQpOwotICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERhdGEgLT5UYWIuVFtpXSA9IEZST01fOF9UT18xNih2KTsKLSAgICAgICAgfQotCi0gICAgfQotICAgIGVsc2UKLSAgICAgICAgaWYgKFByZWNpc2lvbiA9PSAyKSB7Ci0KLSAgICAgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZBcnJheShpbywgRGF0YS0+bkVudHJpZXMsIERhdGEgLT5UYWIuVCkpIHsKLSAgICAgICAgICAgICAgICBjbXNTdGFnZUZyZWUoQ0xVVCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjbXNTdGFnZUZyZWUoQ0xVVCk7Ci0gICAgICAgICAgICBjbXNTaWduYWxFcnJvcihzZWxmIC0+Q29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVua25vd24gcHJlY2lzaW9uIG9mICclZCciLCBQcmVjaXNpb24pOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gQ0xVVDsKLX0KLQotc3RhdGljCi1jbXNUb25lQ3VydmUqIFJlYWRFbWJlZGRlZEN1cnZlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbykKLXsKLSAgICBjbXNUYWdUeXBlU2lnbmF0dXJlICBCYXNlVHlwZTsKLSAgICBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zOwotCi0gICAgQmFzZVR5cGUgPSBfY21zUmVhZFR5cGVCYXNlKGlvKTsKLSAgICBzd2l0Y2ggKEJhc2VUeXBlKSB7Ci0KLSAgICAgICAgICAgIGNhc2UgY21zU2lnQ3VydmVUeXBlOgotICAgICAgICAgICAgICAgIHJldHVybiAoY21zVG9uZUN1cnZlKikgVHlwZV9DdXJ2ZV9SZWFkKHNlbGYsIGlvLCAmbkl0ZW1zLCAwKTsKLQotICAgICAgICAgICAgY2FzZSBjbXNTaWdQYXJhbWV0cmljQ3VydmVUeXBlOgotICAgICAgICAgICAgICAgIHJldHVybiAoY21zVG9uZUN1cnZlKikgVHlwZV9QYXJhbWV0cmljQ3VydmVfUmVhZChzZWxmLCBpbywgJm5JdGVtcywgMCk7Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGFyIFN0cmluZ1s1XTsKLQotICAgICAgICAgICAgICAgICAgICBfY21zVGFnU2lnbmF0dXJlMlN0cmluZyhTdHJpbmcsIChjbXNUYWdTaWduYXR1cmUpIEJhc2VUeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3Ioc2VsZiAtPkNvbnRleHRJRCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJVbmtub3duIGN1cnZlIHR5cGUgJyVzJyIsIFN0cmluZyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLX0KLQotCi0vLyBSZWFkIGEgc2V0IG9mIGN1cnZlcyBmcm9tIHNwZWNpZmljIG9mZnNldAotc3RhdGljCi1jbXNTdGFnZSogUmVhZFNldE9mQ3VydmVzKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyIE9mZnNldCwgY21zVUludDMyTnVtYmVyIG5DdXJ2ZXMpCi17Ci0gICAgY21zVG9uZUN1cnZlKiBDdXJ2ZXNbY21zTUFYQ0hBTk5FTFNdOwotICAgIGNtc1VJbnQzMk51bWJlciBpOwotICAgIGNtc1N0YWdlKiBMaW4gPSBOVUxMOwotCi0gICAgaWYgKG5DdXJ2ZXMgPiBjbXNNQVhDSEFOTkVMUykgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKCFpbyAtPiBTZWVrKGlvLCBPZmZzZXQpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG5DdXJ2ZXM7IGkrKykKLSAgICAgICAgQ3VydmVzW2ldID0gTlVMTDsKLQotICAgIGZvciAoaT0wOyBpIDwgbkN1cnZlczsgaSsrKSB7Ci0KLSAgICAgICAgQ3VydmVzW2ldID0gUmVhZEVtYmVkZGVkQ3VydmUoc2VsZiwgaW8pOwotICAgICAgICBpZiAoQ3VydmVzW2ldID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0gICAgICAgIGlmICghX2Ntc1JlYWRBbGlnbm1lbnQoaW8pKSBnb3RvIEVycm9yOwotCi0gICAgfQotCi0gICAgTGluID0gY21zU3RhZ2VBbGxvY1RvbmVDdXJ2ZXMoc2VsZiAtPkNvbnRleHRJRCwgbkN1cnZlcywgQ3VydmVzKTsKLQotRXJyb3I6Ci0gICAgZm9yIChpPTA7IGkgPCBuQ3VydmVzOyBpKyspCi0gICAgICAgIGNtc0ZyZWVUb25lQ3VydmUoQ3VydmVzW2ldKTsKLQotICAgIHJldHVybiBMaW47Ci19Ci0KLQotLy8gTHV0QXRvQiB0eXBlCi0KLS8vIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgYSBjb2xvdXIgdHJhbnNmb3JtLiBUaGUgdHlwZSBjb250YWlucyB1cCB0byBmaXZlIHByb2Nlc3NpbmcKLS8vIGVsZW1lbnRzIHdoaWNoIGFyZSBzdG9yZWQgaW4gdGhlIEF0b0JUYWcgdGFnIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6IGEgc2V0IG9mIG9uZQotLy8gZGltZW5zaW9uYWwgY3VydmVzLCBhIDMgYnkgMyBtYXRyaXggd2l0aCBvZmZzZXQgdGVybXMsIGEgc2V0IG9mIG9uZSBkaW1lbnNpb25hbCBjdXJ2ZXMsCi0vLyBhIG11bHRpZGltZW5zaW9uYWwgbG9va3VwIHRhYmxlLCBhbmQgYSBzZXQgb2Ygb25lIGRpbWVuc2lvbmFsIG91dHB1dCBjdXJ2ZXMuCi0vLyBEYXRhIGFyZSBwcm9jZXNzZWQgdXNpbmcgdGhlc2UgZWxlbWVudHMgdmlhIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2U6Ci0vLwotLy8oIkEiIGN1cnZlcykgLT4gKG11bHRpZGltZW5zaW9uYWwgbG9va3VwIHRhYmxlIC0gQ0xVVCkgLT4gKCJNIiBjdXJ2ZXMpIC0+IChtYXRyaXgpIC0+ICgiQiIgY3VydmVzKS4KLS8vCi0vKgotSXQgaXMgcG9zc2libGUgdG8gdXNlIGFueSBvciBhbGwgb2YgdGhlc2UgcHJvY2Vzc2luZyBlbGVtZW50cy4gQXQgbGVhc3Qgb25lIHByb2Nlc3NpbmcgZWxlbWVudAotbXVzdCBiZSBpbmNsdWRlZC5Pbmx5IHRoZSBmb2xsb3dpbmcgY29tYmluYXRpb25zIGFyZSBhbGxvd2VkOgotCi1CCi1NIC0gTWF0cml4IC0gQgotQSAtIENMVVQgLSBCCi1BIC0gQ0xVVCAtIE0gLSBNYXRyaXggLSBCCi0KLSovCi0KLXN0YXRpYwotdm9pZCogVHlwZV9MVVRBMkJfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQotewotICAgIGNtc1VJbnQzMk51bWJlciAgICAgIEJhc2VPZmZzZXQ7Ci0gICAgY21zVUludDhOdW1iZXIgICAgICAgaW5wdXRDaGFuOyAgICAgIC8vIE51bWJlciBvZiBpbnB1dCBjaGFubmVscwotICAgIGNtc1VJbnQ4TnVtYmVyICAgICAgIG91dHB1dENoYW47ICAgICAvLyBOdW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzCi0gICAgY21zVUludDMyTnVtYmVyICAgICAgb2Zmc2V0QjsgICAgICAgIC8vIE9mZnNldCB0byBmaXJzdCAiQiIgY3VydmUKLSAgICBjbXNVSW50MzJOdW1iZXIgICAgICBvZmZzZXRNYXQ7ICAgICAgLy8gT2Zmc2V0IHRvIG1hdHJpeAotICAgIGNtc1VJbnQzMk51bWJlciAgICAgIG9mZnNldE07ICAgICAgICAvLyBPZmZzZXQgdG8gZmlyc3QgIk0iIGN1cnZlCi0gICAgY21zVUludDMyTnVtYmVyICAgICAgb2Zmc2V0QzsgICAgICAgIC8vIE9mZnNldCB0byBDTFVUCi0gICAgY21zVUludDMyTnVtYmVyICAgICAgb2Zmc2V0QTsgICAgICAgIC8vIE9mZnNldCB0byBmaXJzdCAiQSIgY3VydmUKLSAgICBjbXNQaXBlbGluZSogTmV3TFVUID0gTlVMTDsKLQotCi0gICAgQmFzZU9mZnNldCA9IGlvIC0+VGVsbChpbykgLSBzaXplb2YoX2Ntc1RhZ0Jhc2UpOwotCi0gICAgaWYgKCFfY21zUmVhZFVJbnQ4TnVtYmVyKGlvLCAmaW5wdXRDaGFuKSkgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFfY21zUmVhZFVJbnQ4TnVtYmVyKGlvLCAmb3V0cHV0Q2hhbikpIHJldHVybiBOVUxMOwotCi0gICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgTlVMTCkpIHJldHVybiBOVUxMOwotCi0gICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJm9mZnNldEIpKSByZXR1cm4gTlVMTDsKLSAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmb2Zmc2V0TWF0KSkgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJm9mZnNldE0pKSByZXR1cm4gTlVMTDsKLSAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmb2Zmc2V0QykpIHJldHVybiBOVUxMOwotICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZvZmZzZXRBKSkgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoaW5wdXRDaGFuID09IDAgfHwgaW5wdXRDaGFuID49IGNtc01BWENIQU5ORUxTKSByZXR1cm4gTlVMTDsKLSAgICBpZiAob3V0cHV0Q2hhbiA9PSAwIHx8IG91dHB1dENoYW4gPj0gY21zTUFYQ0hBTk5FTFMpIHJldHVybiBOVUxMOwotCi0gICAgLy8gQWxsb2NhdGVzIGFuIGVtcHR5IExVVAotICAgIE5ld0xVVCA9IGNtc1BpcGVsaW5lQWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgaW5wdXRDaGFuLCBvdXRwdXRDaGFuKTsKLSAgICBpZiAoTmV3TFVUID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgaWYgKG9mZnNldEEhPSAwKSB7Ci0gICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShOZXdMVVQsIGNtc0FUX0VORCwgUmVhZFNldE9mQ3VydmVzKHNlbGYsIGlvLCBCYXNlT2Zmc2V0ICsgb2Zmc2V0QSwgaW5wdXRDaGFuKSkpCi0gICAgICAgICAgICBnb3RvIEVycm9yOwotICAgIH0KLQotICAgIGlmIChvZmZzZXRDICE9IDApIHsKLSAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKE5ld0xVVCwgY21zQVRfRU5ELCBSZWFkQ0xVVChzZWxmLCBpbywgQmFzZU9mZnNldCArIG9mZnNldEMsIGlucHV0Q2hhbiwgb3V0cHV0Q2hhbikpKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0KLSAgICBpZiAob2Zmc2V0TSAhPSAwKSB7Ci0gICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShOZXdMVVQsIGNtc0FUX0VORCwgUmVhZFNldE9mQ3VydmVzKHNlbGYsIGlvLCBCYXNlT2Zmc2V0ICsgb2Zmc2V0TSwgb3V0cHV0Q2hhbikpKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0KLSAgICBpZiAob2Zmc2V0TWF0ICE9IDApIHsKLSAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKE5ld0xVVCwgY21zQVRfRU5ELCBSZWFkTWF0cml4KHNlbGYsIGlvLCBCYXNlT2Zmc2V0ICsgb2Zmc2V0TWF0KSkpCi0gICAgICAgICAgICBnb3RvIEVycm9yOwotICAgIH0KLQotICAgIGlmIChvZmZzZXRCICE9IDApIHsKLSAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKE5ld0xVVCwgY21zQVRfRU5ELCBSZWFkU2V0T2ZDdXJ2ZXMoc2VsZiwgaW8sIEJhc2VPZmZzZXQgKyBvZmZzZXRCLCBvdXRwdXRDaGFuKSkpCi0gICAgICAgICAgICBnb3RvIEVycm9yOwotICAgIH0KLQotICAgICpuSXRlbXMgPSAxOwotICAgIHJldHVybiBOZXdMVVQ7Ci1FcnJvcjoKLSAgICBjbXNQaXBlbGluZUZyZWUoTmV3TFVUKTsKLSAgICByZXR1cm4gTlVMTDsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU2l6ZU9mVGFnKTsKLX0KLQotLy8gV3JpdGUgYSBzZXQgb2YgY3VydmVzCi1zdGF0aWMKLWNtc0Jvb2wgIFdyaXRlTWF0cml4KHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zU3RhZ2UqIG1wZSkKLXsKLSAgICBfY21zU3RhZ2VNYXRyaXhEYXRhKiBtID0gKF9jbXNTdGFnZU1hdHJpeERhdGEqKSBtcGUgLT4gRGF0YTsKLQotICAgIC8vIFdyaXRlIHRoZSBNYXRyaXgKLSAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgbSAtPiBEb3VibGVbMF0pKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIG0gLT4gRG91YmxlWzFdKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBtIC0+IERvdWJsZVsyXSkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgbSAtPiBEb3VibGVbM10pKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIG0gLT4gRG91YmxlWzRdKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBtIC0+IERvdWJsZVs1XSkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgbSAtPiBEb3VibGVbNl0pKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIG0gLT4gRG91YmxlWzddKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBtIC0+IERvdWJsZVs4XSkpIHJldHVybiBGQUxTRTsKLQotICAgIGlmIChtIC0+T2Zmc2V0ICE9IE5VTEwpIHsKLQotICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBtIC0+IE9mZnNldFswXSkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgbSAtPiBPZmZzZXRbMV0pKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIG0gLT4gT2Zmc2V0WzJdKSkgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCAwKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKLQotICAgIH0KLQotCi0gICAgcmV0dXJuIFRSVUU7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOwotfQotCi0KLS8vIFdyaXRlIGEgc2V0IG9mIGN1cnZlcwotc3RhdGljCi1jbXNCb29sIFdyaXRlU2V0T2ZDdXJ2ZXMoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNUYWdUeXBlU2lnbmF0dXJlIFR5cGUsIGNtc1N0YWdlKiBtcGUpCi17Ci0gICAgY21zVUludDMyTnVtYmVyIGksIG47Ci0gICAgY21zVGFnVHlwZVNpZ25hdHVyZSBDdXJyZW50VHlwZTsKLSAgICBjbXNUb25lQ3VydmUqKiBDdXJ2ZXM7Ci0KLQotICAgIG4gICAgICA9IGNtc1N0YWdlT3V0cHV0Q2hhbm5lbHMobXBlKTsKLSAgICBDdXJ2ZXMgPSBfY21zU3RhZ2VHZXRQdHJUb0N1cnZlU2V0KG1wZSk7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG47IGkrKykgewotCi0gICAgICAgIC8vIElmIHRoaXMgaXMgYSB0YWJsZS1iYXNlZCBjdXJ2ZSwgdXNlIGN1cnZlIHR5cGUgZXZlbiBvbiBWNAotICAgICAgICBDdXJyZW50VHlwZSA9IFR5cGU7Ci0KLSAgICAgICAgaWYgKChDdXJ2ZXNbaV0gLT5uU2VnbWVudHMgPT0gMCl8fAotICAgICAgICAgICAgKChDdXJ2ZXNbaV0tPm5TZWdtZW50cyA9PSAyKSAmJiAoQ3VydmVzW2ldIC0+U2VnbWVudHNbMV0uVHlwZSA9PSAwKSkgKQotICAgICAgICAgICAgQ3VycmVudFR5cGUgPSBjbXNTaWdDdXJ2ZVR5cGU7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgaWYgKEN1cnZlc1tpXSAtPlNlZ21lbnRzWzBdLlR5cGUgPCAwKQotICAgICAgICAgICAgQ3VycmVudFR5cGUgPSBjbXNTaWdDdXJ2ZVR5cGU7Ci0KLSAgICAgICAgaWYgKCFfY21zV3JpdGVUeXBlQmFzZShpbywgQ3VycmVudFR5cGUpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgc3dpdGNoIChDdXJyZW50VHlwZSkgewotCi0gICAgICAgICAgICBjYXNlIGNtc1NpZ0N1cnZlVHlwZToKLSAgICAgICAgICAgICAgICBpZiAoIVR5cGVfQ3VydmVfV3JpdGUoc2VsZiwgaW8sIEN1cnZlc1tpXSwgMSkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgY2FzZSBjbXNTaWdQYXJhbWV0cmljQ3VydmVUeXBlOgotICAgICAgICAgICAgICAgIGlmICghVHlwZV9QYXJhbWV0cmljQ3VydmVfV3JpdGUoc2VsZiwgaW8sIEN1cnZlc1tpXSwgMSkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgU3RyaW5nWzVdOwotCi0gICAgICAgICAgICAgICAgICAgIF9jbXNUYWdTaWduYXR1cmUyU3RyaW5nKFN0cmluZywgKGNtc1RhZ1NpZ25hdHVyZSkgVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKHNlbGYgLT5Db250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5rbm93biBjdXJ2ZSB0eXBlICclcyciLCBTdHJpbmcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIV9jbXNXcml0ZUFsaWdubWVudChpbykpIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLQotICAgIHJldHVybiBUUlVFOwotfQotCi0KLXN0YXRpYwotY21zQm9vbCBXcml0ZUNMVVQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50OE51bWJlciAgUHJlY2lzaW9uLCBjbXNTdGFnZSogbXBlKQotewotICAgIGNtc1VJbnQ4TnVtYmVyICBncmlkUG9pbnRzW2Ntc01BWENIQU5ORUxTXTsgLy8gTnVtYmVyIG9mIGdyaWQgcG9pbnRzIGluIGVhY2ggZGltZW5zaW9uLgotICAgIGNtc1VJbnQzMk51bWJlciBpOwotICAgIF9jbXNTdGFnZUNMdXREYXRhKiBDTFVUID0gKCBfY21zU3RhZ2VDTHV0RGF0YSopIG1wZSAtPiBEYXRhOwotCi0gICAgaWYgKENMVVQgLT5IYXNGbG9hdFZhbHVlcykgewotICAgICAgICAgY21zU2lnbmFsRXJyb3Ioc2VsZiAtPkNvbnRleHRJRCwgY21zRVJST1JfTk9UX1NVSVRBQkxFLCAiQ2Fubm90IHNhdmUgZmxvYXRpbmcgcG9pbnQgZGF0YSwgQ0xVVCBhcmUgOCBvciAxNiBiaXQgb25seSIpOwotICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIG1lbXNldChncmlkUG9pbnRzLCAwLCBzaXplb2YoZ3JpZFBvaW50cykpOwotICAgIGZvciAoaT0wOyBpIDwgKGNtc1VJbnQzMk51bWJlcikgQ0xVVCAtPlBhcmFtcyAtPm5JbnB1dHM7IGkrKykKLSAgICAgICAgZ3JpZFBvaW50c1tpXSA9IChjbXNVSW50OE51bWJlcikgQ0xVVCAtPlBhcmFtcyAtPm5TYW1wbGVzW2ldOwotCi0gICAgaWYgKCFpbyAtPiBXcml0ZShpbywgY21zTUFYQ0hBTk5FTFMqc2l6ZW9mKGNtc1VJbnQ4TnVtYmVyKSwgZ3JpZFBvaW50cykpIHJldHVybiBGQUxTRTsKLQotICAgIGlmICghX2Ntc1dyaXRlVUludDhOdW1iZXIoaW8sIChjbXNVSW50OE51bWJlcikgUHJlY2lzaW9uKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghX2Ntc1dyaXRlVUludDhOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGVVSW50OE51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQ4TnVtYmVyKGlvLCAwKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgLy8gUHJlY2lzaW9uIGNhbiBiZSAxIG9yIDIgYnl0ZXMKLSAgICBpZiAoUHJlY2lzaW9uID09IDEpIHsKLQotICAgICAgICBmb3IgKGk9MDsgaSA8IENMVVQtPm5FbnRyaWVzOyBpKyspIHsKLQotICAgICAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50OE51bWJlcihpbywgRlJPTV8xNl9UT184KENMVVQtPlRhYi5UW2ldKSkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIGlmIChQcmVjaXNpb24gPT0gMikgewotCi0gICAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNkFycmF5KGlvLCBDTFVULT5uRW50cmllcywgQ0xVVCAtPlRhYi5UKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKHNlbGYgLT5Db250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5rbm93biBwcmVjaXNpb24gb2YgJyVkJyIsIFByZWNpc2lvbik7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIV9jbXNXcml0ZUFsaWdubWVudChpbykpIHJldHVybiBGQUxTRTsKLQotICAgICAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0KLQotc3RhdGljCi1jbXNCb29sIFR5cGVfTFVUQTJCX1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQotewotICAgIGNtc1BpcGVsaW5lKiBMdXQgPSAoY21zUGlwZWxpbmUqKSBQdHI7Ci0gICAgaW50IGlucHV0Q2hhbiwgb3V0cHV0Q2hhbjsKLSAgICBjbXNTdGFnZSAqQSA9IE5VTEwsICpCID0gTlVMTCwgKk0gPSBOVUxMOwotICAgIGNtc1N0YWdlICogTWF0cml4ID0gTlVMTDsKLSAgICBjbXNTdGFnZSAqIENMVVQgPSBOVUxMOwotICAgIGNtc1VJbnQzMk51bWJlciBvZmZzZXRCID0gMCwgb2Zmc2V0TWF0ID0gMCwgb2Zmc2V0TSA9IDAsIG9mZnNldEMgPSAwLCBvZmZzZXRBID0gMDsKLSAgICBjbXNVSW50MzJOdW1iZXIgQmFzZU9mZnNldCwgRGlyZWN0b3J5UG9zLCBDdXJyZW50UG9zOwotCi0gICAgLy8gR2V0IHRoZSBiYXNlIGZvciBhbGwgb2Zmc2V0cwotICAgIEJhc2VPZmZzZXQgPSBpbyAtPlRlbGwoaW8pIC0gc2l6ZW9mKF9jbXNUYWdCYXNlKTsKLQotICAgIGlmIChMdXQgLT5FbGVtZW50cyAhPSBOVUxMKQotICAgICAgICBpZiAoIWNtc1BpcGVsaW5lQ2hlY2tBbmRSZXRyZWl2ZVN0YWdlcyhMdXQsIDEsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsICZCKSkKLSAgICAgICAgICAgIGlmICghY21zUGlwZWxpbmVDaGVja0FuZFJldHJlaXZlU3RhZ2VzKEx1dCwgMywgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgY21zU2lnTWF0cml4RWxlbVR5cGUsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsICZNLCAmTWF0cml4LCAmQikpCi0gICAgICAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUNoZWNrQW5kUmV0cmVpdmVTdGFnZXMoTHV0LCAzLCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLCBjbXNTaWdDTHV0RWxlbVR5cGUsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsICZBLCAmQ0xVVCwgJkIpKQotICAgICAgICAgICAgICAgICAgICBpZiAoIWNtc1BpcGVsaW5lQ2hlY2tBbmRSZXRyZWl2ZVN0YWdlcyhMdXQsIDUsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsIGNtc1NpZ0NMdXRFbGVtVHlwZSwgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNtc1NpZ01hdHJpeEVsZW1UeXBlLCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLCAmQSwgJkNMVVQsICZNLCAmTWF0cml4LCAmQikpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKHNlbGYtPkNvbnRleHRJRCwgY21zRVJST1JfTk9UX1NVSVRBQkxFLCAiTFVUIGlzIG5vdCBzdWl0YWJsZSB0byBiZSBzYXZlZCBhcyBMdXRBVG9CIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAvLyBHZXQgaW5wdXQsIG91dHB1dCBjaGFubmVscwotICAgIGlucHV0Q2hhbiAgPSBjbXNQaXBlbGluZUlucHV0Q2hhbm5lbHMoTHV0KTsKLSAgICBvdXRwdXRDaGFuID0gY21zUGlwZWxpbmVPdXRwdXRDaGFubmVscyhMdXQpOwotCi0gICAgLy8gV3JpdGUgY2hhbm5lbCBjb3VudAotICAgIGlmICghX2Ntc1dyaXRlVUludDhOdW1iZXIoaW8sIChjbXNVSW50OE51bWJlcikgaW5wdXRDaGFuKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghX2Ntc1dyaXRlVUludDhOdW1iZXIoaW8sIChjbXNVSW50OE51bWJlcikgb3V0cHV0Q2hhbikpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKLQotICAgIC8vIEtlZXAgZGlyZWN0b3J5IHRvIGJlIGZpbGxlZCBsYXR0ZXIKLSAgICBEaXJlY3RvcnlQb3MgPSBpbyAtPlRlbGwoaW8pOwotCi0gICAgLy8gV3JpdGUgdGhlIGRpcmVjdG9yeQotICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCAwKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCAwKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCAwKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCAwKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCAwKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKEEgIT0gTlVMTCkgewotCi0gICAgICAgIG9mZnNldEEgPSBpbyAtPlRlbGwoaW8pIC0gQmFzZU9mZnNldDsKLSAgICAgICAgaWYgKCFXcml0ZVNldE9mQ3VydmVzKHNlbGYsIGlvLCBjbXNTaWdQYXJhbWV0cmljQ3VydmVUeXBlLCBBKSkgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIGlmIChDTFVUICE9IE5VTEwpIHsKLSAgICAgICAgb2Zmc2V0QyA9IGlvIC0+VGVsbChpbykgLSBCYXNlT2Zmc2V0OwotICAgICAgICBpZiAoIVdyaXRlQ0xVVChzZWxmLCBpbywgTHV0IC0+U2F2ZUFzOEJpdHMgPyAxIDogMiwgQ0xVVCkpIHJldHVybiBGQUxTRTsKLQotICAgIH0KLSAgICBpZiAoTSAhPSBOVUxMKSB7Ci0KLSAgICAgICAgb2Zmc2V0TSA9IGlvIC0+VGVsbChpbykgLSBCYXNlT2Zmc2V0OwotICAgICAgICBpZiAoIVdyaXRlU2V0T2ZDdXJ2ZXMoc2VsZiwgaW8sIGNtc1NpZ1BhcmFtZXRyaWNDdXJ2ZVR5cGUsIE0pKSByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKE1hdHJpeCAhPSBOVUxMKSB7Ci0gICAgICAgIG9mZnNldE1hdCA9IGlvIC0+VGVsbChpbykgLSBCYXNlT2Zmc2V0OwotICAgICAgICBpZiAoIVdyaXRlTWF0cml4KHNlbGYsIGlvLCBNYXRyaXgpKSByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKEIgIT0gTlVMTCkgewotCi0gICAgICAgIG9mZnNldEIgPSBpbyAtPlRlbGwoaW8pIC0gQmFzZU9mZnNldDsKLSAgICAgICAgaWYgKCFXcml0ZVNldE9mQ3VydmVzKHNlbGYsIGlvLCBjbXNTaWdQYXJhbWV0cmljQ3VydmVUeXBlLCBCKSkgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIEN1cnJlbnRQb3MgPSBpbyAtPlRlbGwoaW8pOwotCi0gICAgaWYgKCFpbyAtPlNlZWsoaW8sIERpcmVjdG9yeVBvcykpIHJldHVybiBGQUxTRTsKLQotICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBvZmZzZXRCKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBvZmZzZXRNYXQpKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIG9mZnNldE0pKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIG9mZnNldEMpKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIG9mZnNldEEpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBpZiAoIWlvIC0+U2VlayhpbywgQ3VycmVudFBvcykpIHJldHVybiBGQUxTRTsKLQotICAgIHJldHVybiBUUlVFOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuSXRlbXMpOwotfQotCi0KLXN0YXRpYwotdm9pZCogVHlwZV9MVVRBMkJfRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKLXsKLSAgICByZXR1cm4gKHZvaWQqKSBjbXNQaXBlbGluZUR1cCgoY21zUGlwZWxpbmUqKSBQdHIpOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOwotfQotCi1zdGF0aWMKLXZvaWQgVHlwZV9MVVRBMkJfRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQqIFB0cikKLXsKLSAgICBjbXNQaXBlbGluZUZyZWUoKGNtc1BpcGVsaW5lKikgUHRyKTsKLSAgICByZXR1cm47Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOwotfQotCi0KLS8vIEx1dEJUb0EgdHlwZQotCi1zdGF0aWMKLXZvaWQqIFR5cGVfTFVUQjJBX1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG5JdGVtcywgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKLXsKLSAgICBjbXNVSW50OE51bWJlciAgICAgICBpbnB1dENoYW47ICAgICAgLy8gTnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzCi0gICAgY21zVUludDhOdW1iZXIgICAgICAgb3V0cHV0Q2hhbjsgICAgIC8vIE51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMKLSAgICBjbXNVSW50MzJOdW1iZXIgICAgICBCYXNlT2Zmc2V0OyAgICAgLy8gQWN0dWFsIHBvc2l0aW9uIGluIGZpbGUKLSAgICBjbXNVSW50MzJOdW1iZXIgICAgICBvZmZzZXRCOyAgICAgICAgLy8gT2Zmc2V0IHRvIGZpcnN0ICJCIiBjdXJ2ZQotICAgIGNtc1VJbnQzMk51bWJlciAgICAgIG9mZnNldE1hdDsgICAgICAvLyBPZmZzZXQgdG8gbWF0cml4Ci0gICAgY21zVUludDMyTnVtYmVyICAgICAgb2Zmc2V0TTsgICAgICAgIC8vIE9mZnNldCB0byBmaXJzdCAiTSIgY3VydmUKLSAgICBjbXNVSW50MzJOdW1iZXIgICAgICBvZmZzZXRDOyAgICAgICAgLy8gT2Zmc2V0IHRvIENMVVQKLSAgICBjbXNVSW50MzJOdW1iZXIgICAgICBvZmZzZXRBOyAgICAgICAgLy8gT2Zmc2V0IHRvIGZpcnN0ICJBIiBjdXJ2ZQotICAgIGNtc1BpcGVsaW5lKiBOZXdMVVQgPSBOVUxMOwotCi0KLSAgICBCYXNlT2Zmc2V0ID0gaW8gLT5UZWxsKGlvKSAtIHNpemVvZihfY21zVGFnQmFzZSk7Ci0KLSAgICBpZiAoIV9jbXNSZWFkVUludDhOdW1iZXIoaW8sICZpbnB1dENoYW4pKSByZXR1cm4gTlVMTDsKLSAgICBpZiAoIV9jbXNSZWFkVUludDhOdW1iZXIoaW8sICZvdXRwdXRDaGFuKSkgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoaW5wdXRDaGFuID09IDAgfHwgaW5wdXRDaGFuID49IGNtc01BWENIQU5ORUxTKSByZXR1cm4gTlVMTDsKLSAgICBpZiAob3V0cHV0Q2hhbiA9PSAwIHx8IG91dHB1dENoYW4gPj0gY21zTUFYQ0hBTk5FTFMpIHJldHVybiBOVUxMOwotCi0gICAgLy8gUGFkZGluZwotICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sIE5VTEwpKSByZXR1cm4gTlVMTDsKLQotICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZvZmZzZXRCKSkgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJm9mZnNldE1hdCkpIHJldHVybiBOVUxMOwotICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZvZmZzZXRNKSkgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJm9mZnNldEMpKSByZXR1cm4gTlVMTDsKLSAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmb2Zmc2V0QSkpIHJldHVybiBOVUxMOwotCi0gICAgLy8gQWxsb2NhdGVzIGFuIGVtcHR5IExVVAotICAgIE5ld0xVVCA9IGNtc1BpcGVsaW5lQWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgaW5wdXRDaGFuLCBvdXRwdXRDaGFuKTsKLSAgICBpZiAoTmV3TFVUID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgaWYgKG9mZnNldEIgIT0gMCkgewotICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTmV3TFVULCBjbXNBVF9FTkQsIFJlYWRTZXRPZkN1cnZlcyhzZWxmLCBpbywgQmFzZU9mZnNldCArIG9mZnNldEIsIGlucHV0Q2hhbikpKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0KLSAgICBpZiAob2Zmc2V0TWF0ICE9IDApIHsKLSAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKE5ld0xVVCwgY21zQVRfRU5ELCBSZWFkTWF0cml4KHNlbGYsIGlvLCBCYXNlT2Zmc2V0ICsgb2Zmc2V0TWF0KSkpCi0gICAgICAgICAgICBnb3RvIEVycm9yOwotICAgIH0KLQotICAgIGlmIChvZmZzZXRNICE9IDApIHsKLSAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKE5ld0xVVCwgY21zQVRfRU5ELCBSZWFkU2V0T2ZDdXJ2ZXMoc2VsZiwgaW8sIEJhc2VPZmZzZXQgKyBvZmZzZXRNLCBpbnB1dENoYW4pKSkKLSAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgfQotCi0gICAgaWYgKG9mZnNldEMgIT0gMCkgewotICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTmV3TFVULCBjbXNBVF9FTkQsIFJlYWRDTFVUKHNlbGYsIGlvLCBCYXNlT2Zmc2V0ICsgb2Zmc2V0QywgaW5wdXRDaGFuLCBvdXRwdXRDaGFuKSkpCi0gICAgICAgICAgICBnb3RvIEVycm9yOwotICAgIH0KLQotICAgIGlmIChvZmZzZXRBIT0gMCkgewotICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTmV3TFVULCBjbXNBVF9FTkQsIFJlYWRTZXRPZkN1cnZlcyhzZWxmLCBpbywgQmFzZU9mZnNldCArIG9mZnNldEEsIG91dHB1dENoYW4pKSkKLSAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgfQotCi0gICAgKm5JdGVtcyA9IDE7Ci0gICAgcmV0dXJuIE5ld0xVVDsKLUVycm9yOgotICAgIGNtc1BpcGVsaW5lRnJlZShOZXdMVVQpOwotICAgIHJldHVybiBOVUxMOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTaXplT2ZUYWcpOwotfQotCi0KLS8qCi1CCi1CIC0gTWF0cml4IC0gTQotQiAtIENMVVQgLSBBCi1CIC0gTWF0cml4IC0gTSAtIENMVVQgLSBBCi0qLwotCi1zdGF0aWMKLWNtc0Jvb2wgIFR5cGVfTFVUQjJBX1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQotewotICAgIGNtc1BpcGVsaW5lKiBMdXQgPSAoY21zUGlwZWxpbmUqKSBQdHI7Ci0gICAgaW50IGlucHV0Q2hhbiwgb3V0cHV0Q2hhbjsKLSAgICBjbXNTdGFnZSAqQSA9IE5VTEwsICpCID0gTlVMTCwgKk0gPSBOVUxMOwotICAgIGNtc1N0YWdlICpNYXRyaXggPSBOVUxMOwotICAgIGNtc1N0YWdlICpDTFVUID0gTlVMTDsKLSAgICBjbXNVSW50MzJOdW1iZXIgb2Zmc2V0QiA9IDAsIG9mZnNldE1hdCA9IDAsIG9mZnNldE0gPSAwLCBvZmZzZXRDID0gMCwgb2Zmc2V0QSA9IDA7Ci0gICAgY21zVUludDMyTnVtYmVyIEJhc2VPZmZzZXQsIERpcmVjdG9yeVBvcywgQ3VycmVudFBvczsKLQotCi0gICAgQmFzZU9mZnNldCA9IGlvIC0+VGVsbChpbykgLSBzaXplb2YoX2Ntc1RhZ0Jhc2UpOwotCi0gICAgaWYgKCFjbXNQaXBlbGluZUNoZWNrQW5kUmV0cmVpdmVTdGFnZXMoTHV0LCAxLCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLCAmQikpCi0gICAgICAgIGlmICghY21zUGlwZWxpbmVDaGVja0FuZFJldHJlaXZlU3RhZ2VzKEx1dCwgMywgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgY21zU2lnTWF0cml4RWxlbVR5cGUsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsICZCLCAmTWF0cml4LCAmTSkpCi0gICAgICAgICAgICBpZiAoIWNtc1BpcGVsaW5lQ2hlY2tBbmRSZXRyZWl2ZVN0YWdlcyhMdXQsIDMsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsIGNtc1NpZ0NMdXRFbGVtVHlwZSwgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgJkIsICZDTFVULCAmQSkpCi0gICAgICAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUNoZWNrQW5kUmV0cmVpdmVTdGFnZXMoTHV0LCA1LCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLCBjbXNTaWdNYXRyaXhFbGVtVHlwZSwgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgY21zU2lnQ0x1dEVsZW1UeXBlLCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLCAmQiwgJk1hdHJpeCwgJk0sICZDTFVULCAmQSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKHNlbGYtPkNvbnRleHRJRCwgY21zRVJST1JfTk9UX1NVSVRBQkxFLCAiTFVUIGlzIG5vdCBzdWl0YWJsZSB0byBiZSBzYXZlZCBhcyBMdXRCVG9BIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgaW5wdXRDaGFuICA9IGNtc1BpcGVsaW5lSW5wdXRDaGFubmVscyhMdXQpOwotICAgIG91dHB1dENoYW4gPSBjbXNQaXBlbGluZU91dHB1dENoYW5uZWxzKEx1dCk7Ci0KLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQ4TnVtYmVyKGlvLCAoY21zVUludDhOdW1iZXIpIGlucHV0Q2hhbikpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQ4TnVtYmVyKGlvLCAoY21zVUludDhOdW1iZXIpIG91dHB1dENoYW4pKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBEaXJlY3RvcnlQb3MgPSBpbyAtPlRlbGwoaW8pOwotCi0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBpZiAoQSAhPSBOVUxMKSB7Ci0KLSAgICAgICAgb2Zmc2V0QSA9IGlvIC0+VGVsbChpbykgLSBCYXNlT2Zmc2V0OwotICAgICAgICBpZiAoIVdyaXRlU2V0T2ZDdXJ2ZXMoc2VsZiwgaW8sIGNtc1NpZ1BhcmFtZXRyaWNDdXJ2ZVR5cGUsIEEpKSByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgaWYgKENMVVQgIT0gTlVMTCkgewotICAgICAgICBvZmZzZXRDID0gaW8gLT5UZWxsKGlvKSAtIEJhc2VPZmZzZXQ7Ci0gICAgICAgIGlmICghV3JpdGVDTFVUKHNlbGYsIGlvLCBMdXQgLT5TYXZlQXM4Qml0cyA/IDEgOiAyLCBDTFVUKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgfQotICAgIGlmIChNICE9IE5VTEwpIHsKLQotICAgICAgICBvZmZzZXRNID0gaW8gLT5UZWxsKGlvKSAtIEJhc2VPZmZzZXQ7Ci0gICAgICAgIGlmICghV3JpdGVTZXRPZkN1cnZlcyhzZWxmLCBpbywgY21zU2lnUGFyYW1ldHJpY0N1cnZlVHlwZSwgTSkpIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAoTWF0cml4ICE9IE5VTEwpIHsKLSAgICAgICAgb2Zmc2V0TWF0ID0gaW8gLT5UZWxsKGlvKSAtIEJhc2VPZmZzZXQ7Ci0gICAgICAgIGlmICghV3JpdGVNYXRyaXgoc2VsZiwgaW8sIE1hdHJpeCkpIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBpZiAoQiAhPSBOVUxMKSB7Ci0KLSAgICAgICAgb2Zmc2V0QiA9IGlvIC0+VGVsbChpbykgLSBCYXNlT2Zmc2V0OwotICAgICAgICBpZiAoIVdyaXRlU2V0T2ZDdXJ2ZXMoc2VsZiwgaW8sIGNtc1NpZ1BhcmFtZXRyaWNDdXJ2ZVR5cGUsIEIpKSByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgQ3VycmVudFBvcyA9IGlvIC0+VGVsbChpbyk7Ci0KLSAgICBpZiAoIWlvIC0+U2VlayhpbywgRGlyZWN0b3J5UG9zKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIG9mZnNldEIpKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIG9mZnNldE1hdCkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgb2Zmc2V0TSkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgb2Zmc2V0QykpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgb2Zmc2V0QSkpIHJldHVybiBGQUxTRTsKLQotICAgIGlmICghaW8gLT5TZWVrKGlvLCBDdXJyZW50UG9zKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgcmV0dXJuIFRSVUU7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7Ci19Ci0KLQotCi1zdGF0aWMKLXZvaWQqIFR5cGVfTFVUQjJBX0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQgKlB0ciwgY21zVUludDMyTnVtYmVyIG4pCi17Ci0gICAgcmV0dXJuICh2b2lkKikgY21zUGlwZWxpbmVEdXAoKGNtc1BpcGVsaW5lKikgUHRyKTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobik7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKLX0KLQotc3RhdGljCi12b2lkIFR5cGVfTFVUQjJBX0ZyZWUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCB2b2lkKiBQdHIpCi17Ci0gICAgY21zUGlwZWxpbmVGcmVlKChjbXNQaXBlbGluZSopIFB0cik7Ci0gICAgcmV0dXJuOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKLX0KLQotCi0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBUeXBlIGNtc1NpZ0NvbG9yYW50VGFibGVUeXBlCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLyoKLVRoZSBwdXJwb3NlIG9mIHRoaXMgdGFnIGlzIHRvIGlkZW50aWZ5IHRoZSBjb2xvcmFudHMgdXNlZCBpbiB0aGUgcHJvZmlsZSBieSBhCi11bmlxdWUgbmFtZSBhbmQgc2V0IG9mIFhZWiBvciBMKmEqYiogdmFsdWVzIHRvIGdpdmUgdGhlIGNvbG9yYW50IGFuIHVuYW1iaWd1b3VzCi12YWx1ZS4gVGhlIGZpcnN0IGNvbG9yYW50IGxpc3RlZCBpcyB0aGUgY29sb3JhbnQgb2YgdGhlIGZpcnN0IGRldmljZSBjaGFubmVsIG9mCi1hIGx1dCB0YWcuIFRoZSBzZWNvbmQgY29sb3JhbnQgbGlzdGVkIGlzIHRoZSBjb2xvcmFudCBvZiB0aGUgc2Vjb25kIGRldmljZSBjaGFubmVsCi1vZiBhIGx1dCB0YWcsIGFuZCBzbyBvbi4KLSovCi0KLXN0YXRpYwotdm9pZCAqVHlwZV9Db2xvcmFudFRhYmxlX1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG5JdGVtcywgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKLXsKLSAgICBjbXNVSW50MzJOdW1iZXIgaSwgQ291bnQ7Ci0gICAgY21zTkFNRURDT0xPUkxJU1QqIExpc3Q7Ci0gICAgY2hhciBOYW1lWzMzXTsKLSAgICBjbXNVSW50MTZOdW1iZXIgUENTWzNdOwotCi0KLSAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmQ291bnQpKSByZXR1cm4gTlVMTDsKLQotICAgIGlmIChDb3VudCA+IGNtc01BWENIQU5ORUxTKSB7Ci0gICAgICAgIGNtc1NpZ25hbEVycm9yKHNlbGYtPkNvbnRleHRJRCwgY21zRVJST1JfUkFOR0UsICJUb28gbWFueSBjb2xvcmFudHMgJyVkJyIsIENvdW50KTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgTGlzdCA9IGNtc0FsbG9jTmFtZWRDb2xvckxpc3Qoc2VsZiAtPkNvbnRleHRJRCwgQ291bnQsIDAsICIiLCAiIik7Ci0gICAgZm9yIChpPTA7IGkgPCBDb3VudDsgaSsrKSB7Ci0KLSAgICAgICAgaWYgKGlvIC0+UmVhZChpbywgTmFtZSwgMzIsIDEpICE9IDEpIGdvdG8gRXJyb3I7Ci0gICAgICAgIE5hbWVbMzJdID0gMDsKLQotICAgICAgICBpZiAoIV9jbXNSZWFkVUludDE2QXJyYXkoaW8sIDMsIFBDUykpIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAgaWYgKCFjbXNBcHBlbmROYW1lZENvbG9yKExpc3QsIE5hbWUsIFBDUywgTlVMTCkpIGdvdG8gRXJyb3I7Ci0KLSAgICB9Ci0KLSAgICAqbkl0ZW1zID0gMTsKLSAgICByZXR1cm4gTGlzdDsKLQotRXJyb3I6Ci0gICAgKm5JdGVtcyA9IDA7Ci0gICAgY21zRnJlZU5hbWVkQ29sb3JMaXN0KExpc3QpOwotICAgIHJldHVybiBOVUxMOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTaXplT2ZUYWcpOwotfQotCi0KLQotLy8gU2F2ZXMgYSBjb2xvcmFudCB0YWJsZS4gSXQgaXMgdXNpbmcgdGhlIG5hbWVkIGNvbG9yIHN0cnVjdHVyZSBmb3Igc2ltcGxpY2l0eSBzYWtlCi1zdGF0aWMKLWNtc0Jvb2wgIFR5cGVfQ29sb3JhbnRUYWJsZV9Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKLXsKLSAgICBjbXNOQU1FRENPTE9STElTVCogTmFtZWRDb2xvckxpc3QgPSAoY21zTkFNRURDT0xPUkxJU1QqKSBQdHI7Ci0gICAgaW50IGksIG5Db2xvcnM7Ci0KLSAgICBuQ29sb3JzID0gY21zTmFtZWRDb2xvckNvdW50KE5hbWVkQ29sb3JMaXN0KTsKLQotICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBuQ29sb3JzKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgZm9yIChpPTA7IGkgPCBuQ29sb3JzOyBpKyspIHsKLQotICAgICAgICBjaGFyIHJvb3RbMzNdOwotICAgICAgICBjbXNVSW50MTZOdW1iZXIgUENTWzNdOwotCi0gICAgICAgIGlmICghY21zTmFtZWRDb2xvckluZm8oTmFtZWRDb2xvckxpc3QsIGksIHJvb3QsIE5VTEwsIE5VTEwsIFBDUywgTlVMTCkpIHJldHVybiAwOwotICAgICAgICByb290WzMyXSA9IDA7Ci0KLSAgICAgICAgaWYgKCFpbyAtPldyaXRlKGlvLCAzMiwgcm9vdCkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MTZBcnJheShpbywgMywgUENTKSkgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuSXRlbXMpOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Ci19Ci0KLQotc3RhdGljCi12b2lkKiBUeXBlX0NvbG9yYW50VGFibGVfRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKLXsKLSAgICBjbXNOQU1FRENPTE9STElTVCogbmMgPSAoY21zTkFNRURDT0xPUkxJU1QqKSBQdHI7Ci0gICAgcmV0dXJuICh2b2lkKikgY21zRHVwTmFtZWRDb2xvckxpc3QobmMpOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOwotfQotCi0KLXN0YXRpYwotdm9pZCBUeXBlX0NvbG9yYW50VGFibGVfRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQqIFB0cikKLXsKLSAgICBjbXNGcmVlTmFtZWRDb2xvckxpc3QoKGNtc05BTUVEQ09MT1JMSVNUKikgUHRyKTsKLSAgICByZXR1cm47Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOwotfQotCi0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBUeXBlIGNtc1NpZ05hbWVkQ29sb3IyVHlwZQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vCi0vL1RoZSBuYW1lZENvbG9yMlR5cGUgaXMgYSBjb3VudCB2YWx1ZSBhbmQgYXJyYXkgb2Ygc3RydWN0dXJlcyB0aGF0IHByb3ZpZGUgY29sb3IKLS8vY29vcmRpbmF0ZXMgZm9yIDctYml0IEFTQ0lJIGNvbG9yIG5hbWVzLiBGb3IgZWFjaCBuYW1lZCBjb2xvciwgYSBQQ1MgYW5kIG9wdGlvbmFsCi0vL2RldmljZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29sb3IgYXJlIGdpdmVuLiBCb3RoIHJlcHJlc2VudGF0aW9ucyBhcmUgMTYtYml0IHZhbHVlcy4KLS8vVGhlIGRldmljZSByZXByZXNlbnRhdGlvbiBjb3JyZXNwb25kcyB0byB0aGUgaGVhZGVyJ3MgJ2NvbG9yIHNwYWNlIG9mIGRhdGEnIGZpZWxkLgotLy9UaGlzIHJlcHJlc2VudGF0aW9uIHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggdGhlICdudW1iZXIgb2YgZGV2aWNlIGNvbXBvbmVudHMnCi0vL2ZpZWxkIGluIHRoZSBuYW1lZENvbG9yMlR5cGUuIElmIHRoaXMgZmllbGQgaXMgMCwgZGV2aWNlIGNvb3JkaW5hdGVzIGFyZSBub3QgcHJvdmlkZWQuCi0vL1RoZSBQQ1MgcmVwcmVzZW50YXRpb24gY29ycmVzcG9uZHMgdG8gdGhlIGhlYWRlcidzIFBDUyBmaWVsZC4gVGhlIFBDUyByZXByZXNlbnRhdGlvbgotLy9pcyBhbHdheXMgcHJvdmlkZWQuIENvbG9yIG5hbWVzIGFyZSBmaXhlZC1sZW5ndGgsIDMyLWJ5dGUgZmllbGRzIGluY2x1ZGluZyBudWxsCi0vL3Rlcm1pbmF0aW9uLiBJbiBvcmRlciB0byBtYWludGFpbiBtYXhpbXVtIHBvcnRhYmlsaXR5LCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZAotLy90aGF0IHNwZWNpYWwgY2hhcmFjdGVycyBvZiB0aGUgNy1iaXQgQVNDSUkgc2V0IG5vdCBiZSB1c2VkLgotCi1zdGF0aWMKLXZvaWQgKlR5cGVfTmFtZWRDb2xvcl9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyKiBuSXRlbXMsIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcpCi17Ci0KLSAgICBjbXNVSW50MzJOdW1iZXIgICAgICB2ZW5kb3JGbGFnOyAgICAgLy8gQm90dG9tIDE2IGJpdHMgZm9yIElDQyB1c2UKLSAgICBjbXNVSW50MzJOdW1iZXIgICAgICBjb3VudDsgICAgICAgICAgLy8gQ291bnQgb2YgbmFtZWQgY29sb3JzCi0gICAgY21zVUludDMyTnVtYmVyICAgICAgbkRldmljZUNvb3JkczsgIC8vIE51bSBvZiBkZXZpY2UgY29vcmRpbmF0ZXMKLSAgICBjaGFyICAgICAgICAgICAgICAgICBwcmVmaXhbMzJdOyAgICAgLy8gUHJlZml4IGZvciBlYWNoIGNvbG9yIG5hbWUKLSAgICBjaGFyICAgICAgICAgICAgICAgICBzdWZmaXhbMzJdOyAgICAgLy8gU3VmZml4IGZvciBlYWNoIGNvbG9yIG5hbWUKLSAgICBjbXNOQU1FRENPTE9STElTVCogIHY7Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0KLQotICAgICpuSXRlbXMgPSAwOwotICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZ2ZW5kb3JGbGFnKSkgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJmNvdW50KSkgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJm5EZXZpY2VDb29yZHMpKSByZXR1cm4gTlVMTDsKLQotICAgIGlmIChpbyAtPiBSZWFkKGlvLCBwcmVmaXgsIDMyLCAxKSAhPSAxKSByZXR1cm4gTlVMTDsKLSAgICBpZiAoaW8gLT4gUmVhZChpbywgc3VmZml4LCAzMiwgMSkgIT0gMSkgcmV0dXJuIE5VTEw7Ci0KLSAgICBwcmVmaXhbMzFdID0gc3VmZml4WzMxXSA9IDA7Ci0KLSAgICB2ID0gY21zQWxsb2NOYW1lZENvbG9yTGlzdChzZWxmIC0+Q29udGV4dElELCBjb3VudCwgbkRldmljZUNvb3JkcywgcHJlZml4LCBzdWZmaXgpOwotICAgIGlmICh2ID09IE5VTEwpIHsKLSAgICAgICAgY21zU2lnbmFsRXJyb3Ioc2VsZi0+Q29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgIlRvbyBtYW55IG5hbWVkIGNvbG9ycyAnJWQnIiwgY291bnQpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobkRldmljZUNvb3JkcyA+IGNtc01BWENIQU5ORUxTKSB7Ci0gICAgICAgIGNtc1NpZ25hbEVycm9yKHNlbGYtPkNvbnRleHRJRCwgY21zRVJST1JfUkFOR0UsICJUb28gbWFueSBkZXZpY2UgY29vcmRpbmF0ZXMgJyVkJyIsIG5EZXZpY2VDb29yZHMpOwotICAgICAgICBnb3RvIEVycm9yOwotICAgIH0KLSAgICBmb3IgKGk9MDsgaSA8IGNvdW50OyBpKyspIHsKLQotICAgICAgICBjbXNVSW50MTZOdW1iZXIgUENTWzNdOwotICAgICAgICBjbXNVSW50MTZOdW1iZXIgQ29sb3JhbnRbY21zTUFYQ0hBTk5FTFNdOwotICAgICAgICBjaGFyIFJvb3RbMzNdOwotCi0gICAgICAgIG1lbXNldChDb2xvcmFudCwgMCwgc2l6ZW9mKENvbG9yYW50KSk7Ci0gICAgICAgIGlmIChpbyAtPiBSZWFkKGlvLCBSb290LCAzMiwgMSkgIT0gMSkgZ290byBFcnJvcjsKLSAgICAgICAgUm9vdFszMl0gPSAwOwotICAgICAgICBpZiAoIV9jbXNSZWFkVUludDE2QXJyYXkoaW8sIDMsIFBDUykpIGdvdG8gRXJyb3I7Ci0gICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZBcnJheShpbywgbkRldmljZUNvb3JkcywgQ29sb3JhbnQpKSBnb3RvIEVycm9yOwotCi0gICAgICAgIGlmICghY21zQXBwZW5kTmFtZWRDb2xvcih2LCBSb290LCBQQ1MsIENvbG9yYW50KSkgZ290byBFcnJvcjsKLSAgICB9Ci0KLSAgICAqbkl0ZW1zID0gMTsKLSAgICByZXR1cm4gKHZvaWQqKSB2IDsKLQotRXJyb3I6Ci0gICAgY21zRnJlZU5hbWVkQ29sb3JMaXN0KHYpOwotICAgIHJldHVybiBOVUxMOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTaXplT2ZUYWcpOwotfQotCi0KLS8vIFNhdmVzIGEgbmFtZWQgY29sb3IgbGlzdCBpbnRvIGEgbmFtZWQgY29sb3IgcHJvZmlsZQotc3RhdGljCi1jbXNCb29sIFR5cGVfTmFtZWRDb2xvcl9Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKLXsKLSAgICBjbXNOQU1FRENPTE9STElTVCogTmFtZWRDb2xvckxpc3QgPSAoY21zTkFNRURDT0xPUkxJU1QqKSBQdHI7Ci0gICAgY2hhciAgICAgICAgICAgICAgICBwcmVmaXhbMzJdOyAgICAgLy8gUHJlZml4IGZvciBlYWNoIGNvbG9yIG5hbWUKLSAgICBjaGFyICAgICAgICAgICAgICAgIHN1ZmZpeFszMl07ICAgICAvLyBTdWZmaXggZm9yIGVhY2ggY29sb3IgbmFtZQotICAgIGludCBpLCBuQ29sb3JzOwotCi0gICAgbkNvbG9ycyA9IGNtc05hbWVkQ29sb3JDb3VudChOYW1lZENvbG9yTGlzdCk7Ci0KLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgMCkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgbkNvbG9ycykpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgTmFtZWRDb2xvckxpc3QgLT5Db2xvcmFudENvdW50KSkgcmV0dXJuIEZBTFNFOwotCi0gICAgc3RybmNweShwcmVmaXgsIChjb25zdCBjaGFyKikgTmFtZWRDb2xvckxpc3QtPlByZWZpeCwgMzIpOwotICAgIHN0cm5jcHkoc3VmZml4LCAoY29uc3QgY2hhciopIE5hbWVkQ29sb3JMaXN0LT5TdWZmaXgsIDMyKTsKLQotICAgIHN1ZmZpeFszMV0gPSBwcmVmaXhbMzFdID0gMDsKLQotICAgIGlmICghaW8gLT5Xcml0ZShpbywgMzIsIHByZWZpeCkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIWlvIC0+V3JpdGUoaW8sIDMyLCBzdWZmaXgpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG5Db2xvcnM7IGkrKykgewotCi0gICAgICAgY21zVUludDE2TnVtYmVyIFBDU1szXTsKLSAgICAgICBjbXNVSW50MTZOdW1iZXIgQ29sb3JhbnRbY21zTUFYQ0hBTk5FTFNdOwotICAgICAgIGNoYXIgUm9vdFszM107Ci0KLSAgICAgICAgaWYgKCFjbXNOYW1lZENvbG9ySW5mbyhOYW1lZENvbG9yTGlzdCwgaSwgUm9vdCwgTlVMTCwgTlVMTCwgUENTLCBDb2xvcmFudCkpIHJldHVybiAwOwotICAgICAgICBpZiAoIWlvIC0+V3JpdGUoaW8sIDMyICwgUm9vdCkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MTZBcnJheShpbywgMywgUENTKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNkFycmF5KGlvLCBOYW1lZENvbG9yTGlzdCAtPkNvbG9yYW50Q291bnQsIENvbG9yYW50KSkgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuSXRlbXMpOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Ci19Ci0KLXN0YXRpYwotdm9pZCogVHlwZV9OYW1lZENvbG9yX0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG4pCi17Ci0gICAgY21zTkFNRURDT0xPUkxJU1QqIG5jID0gKGNtc05BTUVEQ09MT1JMSVNUKikgUHRyOwotCi0gICAgcmV0dXJuICh2b2lkKikgY21zRHVwTmFtZWRDb2xvckxpc3QobmMpOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOwotfQotCi0KLXN0YXRpYwotdm9pZCBUeXBlX05hbWVkQ29sb3JfRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQqIFB0cikKLXsKLSAgICBjbXNGcmVlTmFtZWRDb2xvckxpc3QoKGNtc05BTUVEQ09MT1JMSVNUKikgUHRyKTsKLSAgICByZXR1cm47Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOwotfQotCi0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBUeXBlIGNtc1NpZ1Byb2ZpbGVTZXF1ZW5jZURlc2NUeXBlCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0vLyBUaGlzIHR5cGUgaXMgYW4gYXJyYXkgb2Ygc3RydWN0dXJlcywgZWFjaCBvZiB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBmcm9tIHRoZQotLy8gaGVhZGVyIGZpZWxkcyBhbmQgdGFncyBmcm9tIHRoZSBvcmlnaW5hbCBwcm9maWxlcyB3aGljaCB3ZXJlIGNvbWJpbmVkIHRvIGNyZWF0ZQotLy8gdGhlIGZpbmFsIHByb2ZpbGUuIFRoZSBvcmRlciBvZiB0aGUgc3RydWN0dXJlcyBpcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHByb2ZpbGVzCi0vLyB3ZXJlIGNvbWJpbmVkIGFuZCBpbmNsdWRlcyBhIHN0cnVjdHVyZSBmb3IgdGhlIGZpbmFsIHByb2ZpbGUuIFRoaXMgcHJvdmlkZXMgYQotLy8gZGVzY3JpcHRpb24gb2YgdGhlIHByb2ZpbGUgc2VxdWVuY2UgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24sCi0vLyB0eXBpY2FsbHkgdXNlZCB3aXRoIHRoZSBEZXZpY2VMaW5rIHByb2ZpbGUuCi0KLXN0YXRpYwotY21zQm9vbCBSZWFkRW1iZWRkZWRUZXh0KHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zTUxVKiogbWx1LCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQotewotICAgIGNtc1RhZ1R5cGVTaWduYXR1cmUgIEJhc2VUeXBlOwotICAgIGNtc1VJbnQzMk51bWJlciBuSXRlbXM7Ci0KLSAgICBCYXNlVHlwZSA9IF9jbXNSZWFkVHlwZUJhc2UoaW8pOwotCi0gICAgc3dpdGNoIChCYXNlVHlwZSkgewotCi0gICAgICAgY2FzZSBjbXNTaWdUZXh0VHlwZToKLSAgICAgICAgICAgaWYgKCptbHUpIGNtc01MVWZyZWUoKm1sdSk7Ci0gICAgICAgICAgICptbHUgPSAoY21zTUxVKilUeXBlX1RleHRfUmVhZChzZWxmLCBpbywgJm5JdGVtcywgU2l6ZU9mVGFnKTsKLSAgICAgICAgICAgcmV0dXJuICgqbWx1ICE9IE5VTEwpOwotCi0gICAgICAgY2FzZSBjbXNTaWdUZXh0RGVzY3JpcHRpb25UeXBlOgotICAgICAgICAgICBpZiAoKm1sdSkgY21zTUxVZnJlZSgqbWx1KTsKLSAgICAgICAgICAgKm1sdSA9ICAoY21zTUxVKikgVHlwZV9UZXh0X0Rlc2NyaXB0aW9uX1JlYWQoc2VsZiwgaW8sICZuSXRlbXMsIFNpemVPZlRhZyk7Ci0gICAgICAgICAgIHJldHVybiAoKm1sdSAhPSBOVUxMKTsKLQotICAgICAgICAgICAvKgotICAgICAgICAgICBUQkQ6IFNpemUgaXMgbmVlZGVkIGZvciBNTFUsIGFuZCB3ZSBoYXZlIG5vIGlkZWEgb24gd2hpY2ggaXMgdGhlIGF2YWlsYWJsZSBzaXplCi0gICAgICAgICAgICovCi0KLSAgICAgICBjYXNlIGNtc1NpZ011bHRpTG9jYWxpemVkVW5pY29kZVR5cGU6Ci0gICAgICAgICAgIGlmICgqbWx1KSBjbXNNTFVmcmVlKCptbHUpOwotICAgICAgICAgICAqbWx1ID0gIChjbXNNTFUqKSBUeXBlX01MVV9SZWFkKHNlbGYsIGlvLCAmbkl0ZW1zLCBTaXplT2ZUYWcpOwotICAgICAgICAgICByZXR1cm4gKCptbHUgIT0gTlVMTCk7Ci0KLSAgICAgICBkZWZhdWx0OiByZXR1cm4gRkFMU0U7Ci0gICAgfQotfQotCi0KLXN0YXRpYwotdm9pZCAqVHlwZV9Qcm9maWxlU2VxdWVuY2VEZXNjX1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG5JdGVtcywgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKLXsKLSAgICBjbXNTRVEqIE91dFNlcTsKLSAgICBjbXNVSW50MzJOdW1iZXIgaSwgQ291bnQ7Ci0KLSAgICAqbkl0ZW1zID0gMDsKLQotICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZDb3VudCkpIHJldHVybiBOVUxMOwotCi0gICAgaWYgKFNpemVPZlRhZyA8IHNpemVvZihjbXNVSW50MzJOdW1iZXIpKSByZXR1cm4gTlVMTDsKLSAgICBTaXplT2ZUYWcgLT0gc2l6ZW9mKGNtc1VJbnQzMk51bWJlcik7Ci0KLQotICAgIE91dFNlcSA9IGNtc0FsbG9jUHJvZmlsZVNlcXVlbmNlRGVzY3JpcHRpb24oc2VsZiAtPkNvbnRleHRJRCwgQ291bnQpOwotICAgIGlmIChPdXRTZXEgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBPdXRTZXEgLT5uID0gQ291bnQ7Ci0KLSAgICAvLyBHZXQgc3RydWN0dXJlcyBhcyB3ZWxsCi0KLSAgICBmb3IgKGk9MDsgaSA8IENvdW50OyBpKyspIHsKLQotICAgICAgICBjbXNQU0VRREVTQyogc2VjID0gJk91dFNlcSAtPiBzZXFbaV07Ci0KLSAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJnNlYyAtPmRldmljZU1mZykpIGdvdG8gRXJyb3I7Ci0gICAgICAgIGlmIChTaXplT2ZUYWcgPCBzaXplb2YoY21zVUludDMyTnVtYmVyKSkgZ290byBFcnJvcjsKLSAgICAgICAgU2l6ZU9mVGFnIC09IHNpemVvZihjbXNVSW50MzJOdW1iZXIpOwotCi0gICAgICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZzZWMgLT5kZXZpY2VNb2RlbCkpIGdvdG8gRXJyb3I7Ci0gICAgICAgIGlmIChTaXplT2ZUYWcgPCBzaXplb2YoY21zVUludDMyTnVtYmVyKSkgZ290byBFcnJvcjsKLSAgICAgICAgU2l6ZU9mVGFnIC09IHNpemVvZihjbXNVSW50MzJOdW1iZXIpOwotCi0gICAgICAgIGlmICghX2Ntc1JlYWRVSW50NjROdW1iZXIoaW8sICZzZWMgLT5hdHRyaWJ1dGVzKSkgZ290byBFcnJvcjsKLSAgICAgICAgaWYgKFNpemVPZlRhZyA8IHNpemVvZihjbXNVSW50NjROdW1iZXIpKSBnb3RvIEVycm9yOwotICAgICAgICBTaXplT2ZUYWcgLT0gc2l6ZW9mKGNtc1VJbnQ2NE51bWJlcik7Ci0KLSAgICAgICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgKGNtc1VJbnQzMk51bWJlciAqKSZzZWMgLT50ZWNobm9sb2d5KSkgZ290byBFcnJvcjsKLSAgICAgICAgaWYgKFNpemVPZlRhZyA8IHNpemVvZihjbXNVSW50MzJOdW1iZXIpKSBnb3RvIEVycm9yOwotICAgICAgICBTaXplT2ZUYWcgLT0gc2l6ZW9mKGNtc1VJbnQzMk51bWJlcik7Ci0KLSAgICAgICAgaWYgKCFSZWFkRW1iZWRkZWRUZXh0KHNlbGYsIGlvLCAmc2VjIC0+TWFudWZhY3R1cmVyLCBTaXplT2ZUYWcpKSBnb3RvIEVycm9yOwotICAgICAgICBpZiAoIVJlYWRFbWJlZGRlZFRleHQoc2VsZiwgaW8sICZzZWMgLT5Nb2RlbCwgU2l6ZU9mVGFnKSkgZ290byBFcnJvcjsKLSAgICB9Ci0KLSAgICAqbkl0ZW1zID0gMTsKLSAgICByZXR1cm4gT3V0U2VxOwotCi1FcnJvcjoKLSAgICBjbXNGcmVlUHJvZmlsZVNlcXVlbmNlRGVzY3JpcHRpb24oT3V0U2VxKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi0vLyBBdXgtLUVtYmVkIGEgdGV4dCBkZXNjcmlwdGlvbiB0eXBlLiBJdCBjYW4gYmUgb2YgdHlwZSB0ZXh0IGRlc2NyaXB0aW9uIG9yIG11bHRpbG9jYWxpemVkIHVuaWNvZGUKLS8vIGFuZCBpdCBkZXBlbmRzIG9mIHRoZSB2ZXJzaW9uIG51bWJlciBwYXNzZWQgb24gY21zVGFnRGVzY3JpcHRvciBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBzdGFjawotc3RhdGljCi1jbXNCb29sICBTYXZlRGVzY3JpcHRpb24oc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNNTFUqIFRleHQpCi17Ci0gICAgaWYgKHNlbGYgLT5JQ0NWZXJzaW9uIDwgMHg0MDAwMDAwKSB7Ci0KLSAgICAgICAgaWYgKCFfY21zV3JpdGVUeXBlQmFzZShpbywgY21zU2lnVGV4dERlc2NyaXB0aW9uVHlwZSkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgcmV0dXJuIFR5cGVfVGV4dF9EZXNjcmlwdGlvbl9Xcml0ZShzZWxmLCBpbywgVGV4dCwgMSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBpZiAoIV9jbXNXcml0ZVR5cGVCYXNlKGlvLCBjbXNTaWdNdWx0aUxvY2FsaXplZFVuaWNvZGVUeXBlKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICByZXR1cm4gVHlwZV9NTFVfV3JpdGUoc2VsZiwgaW8sIFRleHQsIDEpOwotICAgIH0KLX0KLQotCi1zdGF0aWMKLWNtc0Jvb2wgIFR5cGVfUHJvZmlsZVNlcXVlbmNlRGVzY19Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKLXsKLSAgICBjbXNTRVEqIFNlcSA9IChjbXNTRVEqKSBQdHI7Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0KLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgU2VxLT5uKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgZm9yIChpPTA7IGkgPCBTZXEgLT5uOyBpKyspIHsKLQotICAgICAgICBjbXNQU0VRREVTQyogc2VjID0gJlNlcSAtPiBzZXFbaV07Ci0KLSAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIHNlYyAtPmRldmljZU1mZykpIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIHNlYyAtPmRldmljZU1vZGVsKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQ2NE51bWJlcihpbywgJnNlYyAtPmF0dHJpYnV0ZXMpKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBzZWMgLT50ZWNobm9sb2d5KSkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIGlmICghU2F2ZURlc2NyaXB0aW9uKHNlbGYsIGlvLCBzZWMgLT5NYW51ZmFjdHVyZXIpKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghU2F2ZURlc2NyaXB0aW9uKHNlbGYsIGlvLCBzZWMgLT5Nb2RlbCkpIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICAgcmV0dXJuIFRSVUU7Ci0KLSAgICAgY21zVU5VU0VEX1BBUkFNRVRFUihuSXRlbXMpOwotfQotCi0KLXN0YXRpYwotdm9pZCogVHlwZV9Qcm9maWxlU2VxdWVuY2VEZXNjX0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG4pCi17Ci0gICAgcmV0dXJuICh2b2lkKikgY21zRHVwUHJvZmlsZVNlcXVlbmNlRGVzY3JpcHRpb24oKGNtc1NFUSopIFB0cik7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Ci19Ci0KLXN0YXRpYwotdm9pZCBUeXBlX1Byb2ZpbGVTZXF1ZW5jZURlc2NfRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQqIFB0cikKLXsKLSAgICBjbXNGcmVlUHJvZmlsZVNlcXVlbmNlRGVzY3JpcHRpb24oKGNtc1NFUSopIFB0cik7Ci0gICAgcmV0dXJuOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKLX0KLQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gVHlwZSBjbXNTaWdQcm9maWxlU2VxdWVuY2VJZFR5cGUKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vKgotSW4gY2VydGFpbiB3b3JrZmxvd3MgdXNpbmcgSUNDIERldmljZSBMaW5rIFByb2ZpbGVzLCBpdCBpcyBuZWNlc3NhcnkgdG8gaWRlbnRpZnkgdGhlCi1vcmlnaW5hbCBwcm9maWxlcyB0aGF0IHdlcmUgY29tYmluZWQgdG8gY3JlYXRlIHRoZSBEZXZpY2UgTGluayBQcm9maWxlLgotVGhpcyB0eXBlIGlzIGFuIGFycmF5IG9mIHN0cnVjdHVyZXMsIGVhY2ggb2Ygd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gZm9yCi1pZGVudGlmaWNhdGlvbiBvZiBhIHByb2ZpbGUgdXNlZCBpbiBhIHNlcXVlbmNlCi0qLwotCi0KLXN0YXRpYwotY21zQm9vbCBSZWFkU2VxSUQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSU9IQU5ETEVSKiBpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIENhcmdvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQotewotICAgIGNtc1NFUSogT3V0U2VxID0gKGNtc1NFUSopIENhcmdvOwotICAgIGNtc1BTRVFERVNDKiBzZXEgPSAmT3V0U2VxIC0+c2VxW25dOwotCi0gICAgaWYgKGlvIC0+IFJlYWQoaW8sIHNlcSAtPlByb2ZpbGVJRC5JRDgsIDE2LCAxKSAhPSAxKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFSZWFkRW1iZWRkZWRUZXh0KHNlbGYsIGlvLCAmc2VxIC0+RGVzY3JpcHRpb24sIFNpemVPZlRhZykpIHJldHVybiBGQUxTRTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0KLQotc3RhdGljCi12b2lkICpUeXBlX1Byb2ZpbGVTZXF1ZW5jZUlkX1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG5JdGVtcywgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKLXsKLSAgICBjbXNTRVEqIE91dFNlcTsKLSAgICBjbXNVSW50MzJOdW1iZXIgQ291bnQ7Ci0gICAgY21zVUludDMyTnVtYmVyIEJhc2VPZmZzZXQ7Ci0KLSAgICAqbkl0ZW1zID0gMDsKLQotICAgIC8vIEdldCBhY3R1YWwgcG9zaXRpb24gYXMgYSBiYXNpcyBmb3IgZWxlbWVudCBvZmZzZXRzCi0gICAgQmFzZU9mZnNldCA9IGlvIC0+VGVsbChpbykgLSBzaXplb2YoX2Ntc1RhZ0Jhc2UpOwotCi0gICAgLy8gR2V0IHRhYmxlIGNvdW50Ci0gICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJkNvdW50KSkgcmV0dXJuIE5VTEw7Ci0gICAgU2l6ZU9mVGFnIC09IHNpemVvZihjbXNVSW50MzJOdW1iZXIpOwotCi0gICAgLy8gQWxsb2NhdGUgYW4gZW1wdHkgc3RydWN0dXJlCi0gICAgT3V0U2VxID0gY21zQWxsb2NQcm9maWxlU2VxdWVuY2VEZXNjcmlwdGlvbihzZWxmIC0+Q29udGV4dElELCBDb3VudCk7Ci0gICAgaWYgKE91dFNlcSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotCi0gICAgLy8gUmVhZCB0aGUgcG9zaXRpb24gdGFibGUKLSAgICBpZiAoIVJlYWRQb3NpdGlvblRhYmxlKHNlbGYsIGlvLCBDb3VudCwgQmFzZU9mZnNldCwgT3V0U2VxLCBSZWFkU2VxSUQpKSB7Ci0KLSAgICAgICAgY21zRnJlZVByb2ZpbGVTZXF1ZW5jZURlc2NyaXB0aW9uKE91dFNlcSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8vIFN1Y2Nlc3MKLSAgICAqbkl0ZW1zID0gMTsKLSAgICByZXR1cm4gT3V0U2VxOwotCi19Ci0KLQotc3RhdGljCi1jbXNCb29sIFdyaXRlU2VxSUQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSU9IQU5ETEVSKiBpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIENhcmdvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQotewotICAgIGNtc1NFUSogU2VxID0gKGNtc1NFUSopIENhcmdvOwotCi0gICAgaWYgKCFpbyAtPldyaXRlKGlvLCAxNiwgU2VxIC0+c2VxW25dLlByb2ZpbGVJRC5JRDgpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAvLyBTdG9yZSBoZXJlIHRoZSBNTFUKLSAgICBpZiAoIVNhdmVEZXNjcmlwdGlvbihzZWxmLCBpbywgU2VxIC0+c2VxW25dLkRlc2NyaXB0aW9uKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgcmV0dXJuIFRSVUU7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFNpemVPZlRhZyk7Ci19Ci0KLXN0YXRpYwotY21zQm9vbCAgVHlwZV9Qcm9maWxlU2VxdWVuY2VJZF9Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKLXsKLSAgICBjbXNTRVEqIFNlcSA9IChjbXNTRVEqKSBQdHI7Ci0gICAgY21zVUludDMyTnVtYmVyIEJhc2VPZmZzZXQ7Ci0KLSAgICAvLyBLZWVwIHRoZSBiYXNlIG9mZnNldAotICAgIEJhc2VPZmZzZXQgPSBpbyAtPlRlbGwoaW8pIC0gc2l6ZW9mKF9jbXNUYWdCYXNlKTsKLQotICAgIC8vIFRoaXMgaXMgdGhlIHRhYmxlIGNvdW50Ci0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIFNlcSAtPm4pKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAvLyBUaGlzIGlzIHRoZSBwb3NpdGlvbiB0YWJsZSBhbmQgY29udGVudAotICAgIGlmICghV3JpdGVQb3NpdGlvblRhYmxlKHNlbGYsIGlvLCAwLCBTZXEgLT5uLCBCYXNlT2Zmc2V0LCBTZXEsIFdyaXRlU2VxSUQpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICByZXR1cm4gVFJVRTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobkl0ZW1zKTsKLX0KLQotc3RhdGljCi12b2lkKiBUeXBlX1Byb2ZpbGVTZXF1ZW5jZUlkX0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG4pCi17Ci0gICAgcmV0dXJuICh2b2lkKikgY21zRHVwUHJvZmlsZVNlcXVlbmNlRGVzY3JpcHRpb24oKGNtc1NFUSopIFB0cik7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Ci19Ci0KLXN0YXRpYwotdm9pZCBUeXBlX1Byb2ZpbGVTZXF1ZW5jZUlkX0ZyZWUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCB2b2lkKiBQdHIpCi17Ci0gICAgY21zRnJlZVByb2ZpbGVTZXF1ZW5jZURlc2NyaXB0aW9uKChjbXNTRVEqKSBQdHIpOwotICAgIHJldHVybjsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Ci19Ci0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIFR5cGUgY21zU2lnVWNyQmdUeXBlCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLyoKLVRoaXMgdHlwZSBjb250YWlucyBjdXJ2ZXMgcmVwcmVzZW50aW5nIHRoZSB1bmRlciBjb2xvciByZW1vdmFsIGFuZCBibGFjawotZ2VuZXJhdGlvbiBhbmQgYSB0ZXh0IHN0cmluZyB3aGljaCBpcyBhIGdlbmVyYWwgZGVzY3JpcHRpb24gb2YgdGhlIG1ldGhvZCB1c2VkCi1mb3IgdGhlIHVjci9iZy4KLSovCi0KLXN0YXRpYwotdm9pZCAqVHlwZV9VY3JCZ19SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyKiBuSXRlbXMsIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcpCi17Ci0gICAgY21zVWNyQmcqIG4gPSAoY21zVWNyQmcqKSBfY21zTWFsbG9jWmVybyhzZWxmIC0+Q29udGV4dElELCBzaXplb2YoY21zVWNyQmcpKTsKLSAgICBjbXNVSW50MzJOdW1iZXIgQ291bnRVY3IsIENvdW50Qmc7Ci0gICAgY2hhciogQVNDSUlTdHJpbmc7Ci0KLSAgICAqbkl0ZW1zID0gMDsKLSAgICBpZiAobiA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIC8vIEZpcnN0IGN1cnZlIGlzIFVuZGVyIGNvbG9yIHJlbW92YWwKLSAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmQ291bnRVY3IpKSByZXR1cm4gTlVMTDsKLSAgICBpZiAoU2l6ZU9mVGFnIDwgc2l6ZW9mKGNtc1VJbnQzMk51bWJlcikpIHJldHVybiBOVUxMOwotICAgIFNpemVPZlRhZyAtPSBzaXplb2YoY21zVUludDMyTnVtYmVyKTsKLQotICAgIG4gLT5VY3IgPSBjbXNCdWlsZFRhYnVsYXRlZFRvbmVDdXJ2ZTE2KHNlbGYgLT5Db250ZXh0SUQsIENvdW50VWNyLCBOVUxMKTsKLSAgICBpZiAobiAtPlVjciA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIGlmICghX2Ntc1JlYWRVSW50MTZBcnJheShpbywgQ291bnRVY3IsIG4gLT5VY3ItPlRhYmxlMTYpKSByZXR1cm4gTlVMTDsKLSAgICBpZiAoU2l6ZU9mVGFnIDwgc2l6ZW9mKGNtc1VJbnQzMk51bWJlcikpIHJldHVybiBOVUxMOwotICAgIFNpemVPZlRhZyAtPSBDb3VudFVjciAqIHNpemVvZihjbXNVSW50MTZOdW1iZXIpOwotCi0gICAgLy8gU2Vjb25kIGN1cnZlIGlzIEJsYWNrIGdlbmVyYXRpb24KLSAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmQ291bnRCZykpIHJldHVybiBOVUxMOwotICAgIGlmIChTaXplT2ZUYWcgPCBzaXplb2YoY21zVUludDMyTnVtYmVyKSkgcmV0dXJuIE5VTEw7Ci0gICAgU2l6ZU9mVGFnIC09IHNpemVvZihjbXNVSW50MzJOdW1iZXIpOwotCi0gICAgbiAtPkJnID0gY21zQnVpbGRUYWJ1bGF0ZWRUb25lQ3VydmUxNihzZWxmIC0+Q29udGV4dElELCBDb3VudEJnLCBOVUxMKTsKLSAgICBpZiAobiAtPkJnID09IE5VTEwpIHJldHVybiBOVUxMOwotICAgIGlmICghX2Ntc1JlYWRVSW50MTZBcnJheShpbywgQ291bnRCZywgbiAtPkJnLT5UYWJsZTE2KSkgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKFNpemVPZlRhZyA8IENvdW50QmcgKiBzaXplb2YoY21zVUludDE2TnVtYmVyKSkgcmV0dXJuIE5VTEw7Ci0gICAgU2l6ZU9mVGFnIC09IENvdW50QmcgKiBzaXplb2YoY21zVUludDE2TnVtYmVyKTsKLSAgICBpZiAoU2l6ZU9mVGFnID09IFVJTlRfTUFYKSByZXR1cm4gTlVMTDsKLQotICAgIC8vIE5vdyBjb21lcyB0aGUgdGV4dC4gVGhlIGxlbmd0aCBpcyBzcGVjaWZpZWQgYnkgdGhlIHRhZyBzaXplCi0gICAgbiAtPkRlc2MgPSBjbXNNTFVhbGxvYyhzZWxmIC0+Q29udGV4dElELCAxKTsKLSAgICBpZiAobiAtPkRlc2MgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBBU0NJSVN0cmluZyA9IChjaGFyKikgX2Ntc01hbGxvYyhzZWxmIC0+Q29udGV4dElELCBTaXplT2ZUYWcgKyAxKTsKLSAgICBpZiAoaW8gLT5SZWFkKGlvLCBBU0NJSVN0cmluZywgc2l6ZW9mKGNoYXIpLCBTaXplT2ZUYWcpICE9IFNpemVPZlRhZykgcmV0dXJuIE5VTEw7Ci0gICAgQVNDSUlTdHJpbmdbU2l6ZU9mVGFnXSA9IDA7Ci0gICAgY21zTUxVc2V0QVNDSUkobiAtPkRlc2MsIGNtc05vTGFuZ3VhZ2UsIGNtc05vQ291bnRyeSwgQVNDSUlTdHJpbmcpOwotICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIEFTQ0lJU3RyaW5nKTsKLQotICAgICpuSXRlbXMgPSAxOwotICAgIHJldHVybiAodm9pZCopIG47Ci19Ci0KLXN0YXRpYwotY21zQm9vbCAgVHlwZV9VY3JCZ19Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKLXsKLSAgICBjbXNVY3JCZyogVmFsdWUgPSAoY21zVWNyQmcqKSBQdHI7Ci0gICAgY21zVUludDMyTnVtYmVyIFRleHRTaXplOwotICAgIGNoYXIqIFRleHQ7Ci0KLSAgICAvLyBGaXJzdCBjdXJ2ZSBpcyBVbmRlciBjb2xvciByZW1vdmFsCi0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIFZhbHVlIC0+VWNyIC0+bkVudHJpZXMpKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGVVSW50MTZBcnJheShpbywgVmFsdWUgLT5VY3IgLT5uRW50cmllcywgVmFsdWUgLT5VY3IgLT5UYWJsZTE2KSkgcmV0dXJuIEZBTFNFOwotCi0gICAgLy8gVGhlbiBibGFjayBnZW5lcmF0aW9uCi0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIFZhbHVlIC0+QmcgLT5uRW50cmllcykpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNkFycmF5KGlvLCBWYWx1ZSAtPkJnIC0+bkVudHJpZXMsIFZhbHVlIC0+QmcgLT5UYWJsZTE2KSkgcmV0dXJuIEZBTFNFOwotCi0gICAgLy8gTm93IGNvbWVzIHRoZSB0ZXh0LiBUaGUgbGVuZ3RoIGlzIHNwZWNpZmllZCBieSB0aGUgdGFnIHNpemUKLSAgICBUZXh0U2l6ZSA9IGNtc01MVWdldEFTQ0lJKFZhbHVlIC0+RGVzYywgY21zTm9MYW5ndWFnZSwgY21zTm9Db3VudHJ5LCBOVUxMLCAwKTsKLSAgICBUZXh0ICAgICA9IChjaGFyKikgX2Ntc01hbGxvYyhzZWxmIC0+Q29udGV4dElELCBUZXh0U2l6ZSk7Ci0gICAgaWYgKGNtc01MVWdldEFTQ0lJKFZhbHVlIC0+RGVzYywgY21zTm9MYW5ndWFnZSwgY21zTm9Db3VudHJ5LCBUZXh0LCBUZXh0U2l6ZSkgIT0gVGV4dFNpemUpIHJldHVybiBGQUxTRTsKLQotICAgIGlmICghaW8gLT5Xcml0ZShpbywgVGV4dFNpemUsIFRleHQpKSByZXR1cm4gRkFMU0U7Ci0gICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgVGV4dCk7Ci0KLSAgICByZXR1cm4gVFJVRTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobkl0ZW1zKTsKLX0KLQotc3RhdGljCi12b2lkKiBUeXBlX1VjckJnX0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQgKlB0ciwgY21zVUludDMyTnVtYmVyIG4pCi17Ci0gICAgY21zVWNyQmcqIFNyYyA9IChjbXNVY3JCZyopIFB0cjsKLSAgICBjbXNVY3JCZyogTmV3VWNyQmcgPSAoY21zVWNyQmcqKSBfY21zTWFsbG9jWmVybyhzZWxmIC0+Q29udGV4dElELCBzaXplb2YoY21zVWNyQmcpKTsKLQotICAgIGlmIChOZXdVY3JCZyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIE5ld1VjckJnIC0+QmcgICA9IGNtc0R1cFRvbmVDdXJ2ZShTcmMgLT5CZyk7Ci0gICAgTmV3VWNyQmcgLT5VY3IgID0gY21zRHVwVG9uZUN1cnZlKFNyYyAtPlVjcik7Ci0gICAgTmV3VWNyQmcgLT5EZXNjID0gY21zTUxVZHVwKFNyYyAtPkRlc2MpOwotCi0gICAgcmV0dXJuICh2b2lkKikgTmV3VWNyQmc7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOwotfQotCi1zdGF0aWMKLXZvaWQgVHlwZV9VY3JCZ19GcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCAqUHRyKQotewotICAgY21zVWNyQmcqIFNyYyA9IChjbXNVY3JCZyopIFB0cjsKLQotICAgaWYgKFNyYyAtPlVjcikgY21zRnJlZVRvbmVDdXJ2ZShTcmMgLT5VY3IpOwotICAgaWYgKFNyYyAtPkJnKSAgY21zRnJlZVRvbmVDdXJ2ZShTcmMgLT5CZyk7Ci0gICBpZiAoU3JjIC0+RGVzYykgY21zTUxVZnJlZShTcmMgLT5EZXNjKTsKLQotICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgUHRyKTsKLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIFR5cGUgY21zU2lnQ3JkSW5mb1R5cGUKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLS8qCi1UaGlzIHR5cGUgY29udGFpbnMgdGhlIFBvc3RTY3JpcHQgcHJvZHVjdCBuYW1lIHRvIHdoaWNoIHRoaXMgcHJvZmlsZSBjb3JyZXNwb25kcwotYW5kIHRoZSBuYW1lcyBvZiB0aGUgY29tcGFuaW9uIENSRHMuIFJlY2FsbCB0aGF0IGEgc2luZ2xlIHByb2ZpbGUgY2FuIGdlbmVyYXRlCi1tdWx0aXBsZSBDUkRzLiBJdCBpcyBpbXBsZW1lbnRlZCBhcyBhIE1MVSBiZWluZyB0aGUgbGFuZ3VhZ2UgY29kZSAiUFMiIGFuZCB0aGVuCi1jb3VudHJ5IHZhcmllcyBmb3IgZWFjaCBlbGVtZW50OgotCi0gICAgICAgICAgICAgICAgbm06IFBvc3RTY3JpcHQgcHJvZHVjdCBuYW1lCi0gICAgICAgICAgICAgICAgIzA6IFJlbmRlcmluZyBpbnRlbnQgMCBDUkQgbmFtZQotICAgICAgICAgICAgICAgICMxOiBSZW5kZXJpbmcgaW50ZW50IDEgQ1JEIG5hbWUKLSAgICAgICAgICAgICAgICAjMjogUmVuZGVyaW5nIGludGVudCAyIENSRCBuYW1lCi0gICAgICAgICAgICAgICAgIzM6IFJlbmRlcmluZyBpbnRlbnQgMyBDUkQgbmFtZQotKi8KLQotCi0KLS8vIEF1eGlsaWFyLCByZWFkIGFuIHN0cmluZyBzcGVjaWZpZWQgYXMgY291bnQgKyBzdHJpbmcKLXN0YXRpYwotY21zQm9vbCAgUmVhZENvdW50QW5kU3Rpbmcoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNNTFUqIG1sdSwgY21zVUludDMyTnVtYmVyKiBTaXplT2ZUYWcsIGNvbnN0IGNoYXIqIFNlY3Rpb24pCi17Ci0gICAgY21zVUludDMyTnVtYmVyIENvdW50OwotICAgIGNoYXIqIFRleHQ7Ci0KLSAgICBpZiAoKlNpemVPZlRhZyA8IHNpemVvZihjbXNVSW50MzJOdW1iZXIpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmQ291bnQpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBpZiAoQ291bnQgPiBVSU5UX01BWCAtIHNpemVvZihjbXNVSW50MzJOdW1iZXIpKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCpTaXplT2ZUYWcgPCBDb3VudCArIHNpemVvZihjbXNVSW50MzJOdW1iZXIpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBUZXh0ICAgICA9IChjaGFyKikgX2Ntc01hbGxvYyhzZWxmIC0+Q29udGV4dElELCBDb3VudCsxKTsKLSAgICBpZiAoVGV4dCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBpZiAoaW8gLT5SZWFkKGlvLCBUZXh0LCBzaXplb2YoY21zVUludDhOdW1iZXIpLCBDb3VudCkgIT0gQ291bnQpIHsKLSAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgVGV4dCk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBUZXh0W0NvdW50XSA9IDA7Ci0KLSAgICBjbXNNTFVzZXRBU0NJSShtbHUsICJQUyIsIFNlY3Rpb24sIFRleHQpOwotICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIFRleHQpOwotCi0gICAgKlNpemVPZlRhZyAtPSAoQ291bnQgKyBzaXplb2YoY21zVUludDMyTnVtYmVyKSk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLXN0YXRpYwotY21zQm9vbCAgV3JpdGVDb3VudEFuZFN0aW5nKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zTUxVKiBtbHUsIGNvbnN0IGNoYXIqIFNlY3Rpb24pCi17Ci0gY21zVUludDMyTnVtYmVyIFRleHRTaXplOwotIGNoYXIqIFRleHQ7Ci0KLSAgICBUZXh0U2l6ZSA9IGNtc01MVWdldEFTQ0lJKG1sdSwgIlBTIiwgU2VjdGlvbiwgTlVMTCwgMCk7Ci0gICAgVGV4dCAgICAgPSAoY2hhciopIF9jbXNNYWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgVGV4dFNpemUpOwotCi0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIFRleHRTaXplKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKGNtc01MVWdldEFTQ0lJKG1sdSwgIlBTIiwgU2VjdGlvbiwgVGV4dCwgVGV4dFNpemUpID09IDApIHJldHVybiBGQUxTRTsKLQotICAgIGlmICghaW8gLT5Xcml0ZShpbywgVGV4dFNpemUsIFRleHQpKSByZXR1cm4gRkFMU0U7Ci0gICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgVGV4dCk7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotc3RhdGljCi12b2lkICpUeXBlX0NyZEluZm9fUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQotewotICAgIGNtc01MVSogbWx1ID0gY21zTUxVYWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgNSk7Ci0KLSAgICAqbkl0ZW1zID0gMDsKLSAgICBpZiAoIVJlYWRDb3VudEFuZFN0aW5nKHNlbGYsIGlvLCBtbHUsICZTaXplT2ZUYWcsICJubSIpKSBnb3RvIEVycm9yOwotICAgIGlmICghUmVhZENvdW50QW5kU3Rpbmcoc2VsZiwgaW8sIG1sdSwgJlNpemVPZlRhZywgIiMwIikpIGdvdG8gRXJyb3I7Ci0gICAgaWYgKCFSZWFkQ291bnRBbmRTdGluZyhzZWxmLCBpbywgbWx1LCAmU2l6ZU9mVGFnLCAiIzEiKSkgZ290byBFcnJvcjsKLSAgICBpZiAoIVJlYWRDb3VudEFuZFN0aW5nKHNlbGYsIGlvLCBtbHUsICZTaXplT2ZUYWcsICIjMiIpKSBnb3RvIEVycm9yOwotICAgIGlmICghUmVhZENvdW50QW5kU3Rpbmcoc2VsZiwgaW8sIG1sdSwgJlNpemVPZlRhZywgIiMzIikpIGdvdG8gRXJyb3I7Ci0KLSAgICAqbkl0ZW1zID0gMTsKLSAgICByZXR1cm4gKHZvaWQqKSBtbHU7Ci0KLUVycm9yOgotICAgIGNtc01MVWZyZWUobWx1KTsKLSAgICByZXR1cm4gTlVMTDsKLQotfQotCi1zdGF0aWMKLWNtc0Jvb2wgIFR5cGVfQ3JkSW5mb19Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKLXsKLQotICAgIGNtc01MVSogbWx1ID0gKGNtc01MVSopIFB0cjsKLQotICAgIGlmICghV3JpdGVDb3VudEFuZFN0aW5nKHNlbGYsIGlvLCBtbHUsICJubSIpKSBnb3RvIEVycm9yOwotICAgIGlmICghV3JpdGVDb3VudEFuZFN0aW5nKHNlbGYsIGlvLCBtbHUsICIjMCIpKSBnb3RvIEVycm9yOwotICAgIGlmICghV3JpdGVDb3VudEFuZFN0aW5nKHNlbGYsIGlvLCBtbHUsICIjMSIpKSBnb3RvIEVycm9yOwotICAgIGlmICghV3JpdGVDb3VudEFuZFN0aW5nKHNlbGYsIGlvLCBtbHUsICIjMiIpKSBnb3RvIEVycm9yOwotICAgIGlmICghV3JpdGVDb3VudEFuZFN0aW5nKHNlbGYsIGlvLCBtbHUsICIjMyIpKSBnb3RvIEVycm9yOwotCi0gICAgcmV0dXJuIFRSVUU7Ci0KLUVycm9yOgotICAgIHJldHVybiBGQUxTRTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobkl0ZW1zKTsKLX0KLQotCi1zdGF0aWMKLXZvaWQqIFR5cGVfQ3JkSW5mb19EdXAoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjb25zdCB2b2lkICpQdHIsIGNtc1VJbnQzMk51bWJlciBuKQotewotICAgIHJldHVybiAodm9pZCopIGNtc01MVWR1cCgoY21zTUxVKikgUHRyKTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobik7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKLX0KLQotc3RhdGljCi12b2lkIFR5cGVfQ3JkSW5mb19GcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCAqUHRyKQotewotICAgIGNtc01MVWZyZWUoKGNtc01MVSopIFB0cik7Ci0gICAgcmV0dXJuOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihzZWxmKTsKLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIFR5cGUgY21zU2lnU2NyZWVuaW5nVHlwZQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vCi0vL1RoZSBzY3JlZW5pbmdUeXBlIGRlc2NyaWJlcyB2YXJpb3VzIHNjcmVlbmluZyBwYXJhbWV0ZXJzIGluY2x1ZGluZyBzY3JlZW4KLS8vZnJlcXVlbmN5LCBzY3JlZW5pbmcgYW5nbGUsIGFuZCBzcG90IHNoYXBlLgotCi1zdGF0aWMKLXZvaWQgKlR5cGVfU2NyZWVuaW5nX1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG5JdGVtcywgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKLXsKLSAgICBjbXNTY3JlZW5pbmcqIHNjID0gTlVMTDsKLSAgICBjbXNVSW50MzJOdW1iZXIgaTsKLQotICAgIHNjID0gKGNtc1NjcmVlbmluZyopIF9jbXNNYWxsb2NaZXJvKHNlbGYgLT5Db250ZXh0SUQsIHNpemVvZihjbXNTY3JlZW5pbmcpKTsKLSAgICBpZiAoc2MgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICAqbkl0ZW1zID0gMDsKLQotICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZzYyAtPkZsYWcpKSBnb3RvIEVycm9yOwotICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZzYyAtPm5DaGFubmVscykpIGdvdG8gRXJyb3I7Ci0KLSAgICBpZiAoc2MgLT5uQ2hhbm5lbHMgPiBjbXNNQVhDSEFOTkVMUyAtIDEpCi0gICAgICAgIHNjIC0+bkNoYW5uZWxzID0gY21zTUFYQ0hBTk5FTFMgLSAxOwotCi0gICAgZm9yIChpPTA7IGkgPCBzYyAtPm5DaGFubmVsczsgaSsrKSB7Ci0KLSAgICAgICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgJnNjIC0+Q2hhbm5lbHNbaV0uRnJlcXVlbmN5KSkgZ290byBFcnJvcjsKLSAgICAgICAgaWYgKCFfY21zUmVhZDE1Rml4ZWQxNk51bWJlcihpbywgJnNjIC0+Q2hhbm5lbHNbaV0uU2NyZWVuQW5nbGUpKSBnb3RvIEVycm9yOwotICAgICAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmc2MgLT5DaGFubmVsc1tpXS5TcG90U2hhcGUpKSBnb3RvIEVycm9yOwotICAgIH0KLQotCi0gICAgKm5JdGVtcyA9IDE7Ci0KLSAgICByZXR1cm4gKHZvaWQqKSBzYzsKLQotRXJyb3I6Ci0gICAgaWYgKHNjICE9IE5VTEwpCi0gICAgICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIHNjKTsKLQotICAgIHJldHVybiBOVUxMOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTaXplT2ZUYWcpOwotfQotCi0KLXN0YXRpYwotY21zQm9vbCBUeXBlX1NjcmVlbmluZ19Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKLXsKLSAgICBjbXNTY3JlZW5pbmcqIHNjID0gKGNtc1NjcmVlbmluZyogKSBQdHI7Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0KLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgc2MgLT5GbGFnKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBzYyAtPm5DaGFubmVscykpIHJldHVybiBGQUxTRTsKLQotICAgIGZvciAoaT0wOyBpIDwgc2MgLT5uQ2hhbm5lbHM7IGkrKykgewotCi0gICAgICAgIGlmICghX2Ntc1dyaXRlMTVGaXhlZDE2TnVtYmVyKGlvLCBzYyAtPkNoYW5uZWxzW2ldLkZyZXF1ZW5jeSkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIHNjIC0+Q2hhbm5lbHNbaV0uU2NyZWVuQW5nbGUpKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBzYyAtPkNoYW5uZWxzW2ldLlNwb3RTaGFwZSkpIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobkl0ZW1zKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOwotfQotCi0KLXN0YXRpYwotdm9pZCogVHlwZV9TY3JlZW5pbmdfRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKLXsKLSAgIHJldHVybiBfY21zRHVwTWVtKHNlbGYgLT5Db250ZXh0SUQsIFB0ciwgc2l6ZW9mKGNtc1NjcmVlbmluZykpOwotCi0gICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOwotfQotCi0KLXN0YXRpYwotdm9pZCBUeXBlX1NjcmVlbmluZ19GcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCogUHRyKQotewotICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgUHRyKTsKLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIFR5cGUgY21zU2lnVmlld2luZ0NvbmRpdGlvbnNUeXBlCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8KLS8vVGhpcyB0eXBlIHJlcHJlc2VudHMgYSBzZXQgb2Ygdmlld2luZyBjb25kaXRpb24gcGFyYW1ldGVycyBpbmNsdWRpbmc6Ci0vL0NJRSAnYWJzb2x1dGUnaWxsdW1pbmFudCB3aGl0ZSBwb2ludCB0cmlzdGltdWx1cyB2YWx1ZXMgYW5kIENJRSAnYWJzb2x1dGUnCi0vL3N1cnJvdW5kIHRyaXN0aW11bHVzIHZhbHVlcy4KLQotc3RhdGljCi12b2lkICpUeXBlX1ZpZXdpbmdDb25kaXRpb25zX1JlYWQoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCBjbXNVSW50MzJOdW1iZXIqIG5JdGVtcywgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKLXsKLSAgICBjbXNJQ0NWaWV3aW5nQ29uZGl0aW9ucyogdmMgPSBOVUxMOwotCi0gICAgdmMgPSAoY21zSUNDVmlld2luZ0NvbmRpdGlvbnMqKSBfY21zTWFsbG9jWmVybyhzZWxmIC0+Q29udGV4dElELCBzaXplb2YoY21zSUNDVmlld2luZ0NvbmRpdGlvbnMpKTsKLSAgICBpZiAodmMgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICAqbkl0ZW1zID0gMDsKLQotICAgIGlmICghX2Ntc1JlYWRYWVpOdW1iZXIoaW8sICZ2YyAtPklsbHVtaW5hbnRYWVopKSBnb3RvIEVycm9yOwotICAgIGlmICghX2Ntc1JlYWRYWVpOdW1iZXIoaW8sICZ2YyAtPlN1cnJvdW5kWFlaKSkgZ290byBFcnJvcjsKLSAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmdmMgLT5JbGx1bWluYW50VHlwZSkpIGdvdG8gRXJyb3I7Ci0KLSAgICAqbkl0ZW1zID0gMTsKLQotICAgIHJldHVybiAodm9pZCopIHZjOwotCi1FcnJvcjoKLSAgICBpZiAodmMgIT0gTlVMTCkKLSAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgdmMpOwotCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFNpemVPZlRhZyk7Ci19Ci0KLQotc3RhdGljCi1jbXNCb29sIFR5cGVfVmlld2luZ0NvbmRpdGlvbnNfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCi17Ci0gICAgY21zSUNDVmlld2luZ0NvbmRpdGlvbnMqIHNjID0gKGNtc0lDQ1ZpZXdpbmdDb25kaXRpb25zKiApIFB0cjsKLQotICAgIGlmICghX2Ntc1dyaXRlWFlaTnVtYmVyKGlvLCAmc2MgLT5JbGx1bWluYW50WFlaKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghX2Ntc1dyaXRlWFlaTnVtYmVyKGlvLCAmc2MgLT5TdXJyb3VuZFhZWikpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgc2MgLT5JbGx1bWluYW50VHlwZSkpIHJldHVybiBGQUxTRTsKLQotICAgIHJldHVybiBUUlVFOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuSXRlbXMpOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Ci19Ci0KLQotc3RhdGljCi12b2lkKiBUeXBlX1ZpZXdpbmdDb25kaXRpb25zX0R1cChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNvbnN0IHZvaWQgKlB0ciwgY21zVUludDMyTnVtYmVyIG4pCi17Ci0gICByZXR1cm4gX2Ntc0R1cE1lbShzZWxmIC0+Q29udGV4dElELCBQdHIsIHNpemVvZihjbXNTY3JlZW5pbmcpKTsKLQotICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKLX0KLQotCi1zdGF0aWMKLXZvaWQgVHlwZV9WaWV3aW5nQ29uZGl0aW9uc19GcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCogUHRyKQotewotICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgUHRyKTsKLX0KLQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gVHlwZSBjbXNTaWdNdWx0aVByb2Nlc3NFbGVtZW50VHlwZQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotCi1zdGF0aWMKLXZvaWQqIEdlbmVyaWNNUEVkdXAoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjb25zdCB2b2lkICpQdHIsIGNtc1VJbnQzMk51bWJlciBuKQotewotICAgIHJldHVybiAodm9pZCopIGNtc1N0YWdlRHVwKChjbXNTdGFnZSopIFB0cik7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Ci19Ci0KLXN0YXRpYwotdm9pZCBHZW5lcmljTVBFZnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQgKlB0cikKLXsKLSAgICBjbXNTdGFnZUZyZWUoKGNtc1N0YWdlKikgUHRyKTsKLSAgICByZXR1cm47Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOwotfQotCi0vLyBFYWNoIGN1cnZlIGlzIHN0b3JlZCBpbiBvbmUgb3IgbW9yZSBjdXJ2ZSBzZWdtZW50cywgd2l0aCBicmVhay1wb2ludHMgc3BlY2lmaWVkIGJldHdlZW4gY3VydmUgc2VnbWVudHMuCi0vLyBUaGUgZmlyc3QgY3VydmUgc2VnbWVudCBhbHdheXMgc3RhcnRzIGF0IC1JbmZpbml0eSwgYW5kIHRoZSBsYXN0IGN1cnZlIHNlZ21lbnQgYWx3YXlzIGVuZHMgYXQgK0luZmluaXR5LiBUaGUKLS8vIGZpcnN0IGFuZCBsYXN0IGN1cnZlIHNlZ21lbnRzIHNoYWxsIGJlIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBhIGZvcm11bGEsIHdoZXJlYXMgdGhlIG90aGVyIHNlZ21lbnRzIHNoYWxsIGJlCi0vLyBzcGVjaWZpZWQgZWl0aGVyIGluIHRlcm1zIG9mIGEgZm9ybXVsYSwgb3IgYnkgYSBzYW1wbGVkIGN1cnZlLgotCi0KLS8vIFJlYWQgYW4gZW1iZWRkZWQgc2VnbWVudGVkIGN1cnZlCi1zdGF0aWMKLWNtc1RvbmVDdXJ2ZSogUmVhZFNlZ21lbnRlZEN1cnZlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbykKLXsKLSAgICBjbXNDdXJ2ZVNlZ1NpZ25hdHVyZSBFbGVtZW50U2lnOwotICAgIGNtc1VJbnQzMk51bWJlciBpLCBqOwotICAgIGNtc1VJbnQxNk51bWJlciBuU2VnbWVudHM7Ci0gICAgY21zQ3VydmVTZWdtZW50KiAgU2VnbWVudHM7Ci0gICAgY21zVG9uZUN1cnZlKiBDdXJ2ZTsKLSAgICBjbXNGbG9hdDMyTnVtYmVyIFByZXZCcmVhayA9IC0xRTIyRjsgICAgLy8gLSBpbmZpbml0ZQotCi0gICAgLy8gVGFrZSBzaWduYXR1cmUgYW5kIGNoYW5uZWxzIGZvciBlYWNoIGVsZW1lbnQuCi0gICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sIChjbXNVSW50MzJOdW1iZXIqKSAmRWxlbWVudFNpZykpIHJldHVybiBOVUxMOwotCi0gICAgIC8vIFRoYXQgc2hvdWxkIGJlIGEgc2VnbWVudGVkIGN1cnZlCi0gICAgIGlmIChFbGVtZW50U2lnICE9IGNtc1NpZ1NlZ21lbnRlZEN1cnZlKSByZXR1cm4gTlVMTDsKLQotICAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCBOVUxMKSkgcmV0dXJuIE5VTEw7Ci0gICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sICZuU2VnbWVudHMpKSByZXR1cm4gTlVMTDsKLSAgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgTlVMTCkpIHJldHVybiBOVUxMOwotCi0gICAgIGlmIChuU2VnbWVudHMgPCAxKSByZXR1cm4gTlVMTDsKLSAgICAgU2VnbWVudHMgPSAoY21zQ3VydmVTZWdtZW50KikgX2Ntc0NhbGxvYyhzZWxmIC0+Q29udGV4dElELCBuU2VnbWVudHMsIHNpemVvZihjbXNDdXJ2ZVNlZ21lbnQpKTsKLSAgICAgaWYgKFNlZ21lbnRzID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgIC8vIFJlYWQgYnJlYWtwb2ludHMKLSAgICAgZm9yIChpPTA7IGkgPCAoY21zVUludDMyTnVtYmVyKSBuU2VnbWVudHMgLSAxOyBpKyspIHsKLQotICAgICAgICAgU2VnbWVudHNbaV0ueDAgPSBQcmV2QnJlYWs7Ci0gICAgICAgICBpZiAoIV9jbXNSZWFkRmxvYXQzMk51bWJlcihpbywgJlNlZ21lbnRzW2ldLngxKSkgZ290byBFcnJvcjsKLSAgICAgICAgIFByZXZCcmVhayA9IFNlZ21lbnRzW2ldLngxOwotICAgICB9Ci0KLSAgICAgU2VnbWVudHNbblNlZ21lbnRzLTFdLngwID0gUHJldkJyZWFrOwotICAgICBTZWdtZW50c1tuU2VnbWVudHMtMV0ueDEgPSAxRTIyRjsgICAgIC8vIEEgYmlnIGNtc0Zsb2F0MzJOdW1iZXIgbnVtYmVyCi0KLSAgICAgLy8gUmVhZCBzZWdtZW50cwotICAgICBmb3IgKGk9MDsgaSA8IG5TZWdtZW50czsgaSsrKSB7Ci0KLSAgICAgICAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAoY21zVUludDMyTnVtYmVyKikgJkVsZW1lbnRTaWcpKSBnb3RvIEVycm9yOwotICAgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sIE5VTEwpKSBnb3RvIEVycm9yOwotCi0gICAgICAgICAgIHN3aXRjaCAoRWxlbWVudFNpZykgewotCi0gICAgICAgICAgICBjYXNlIGNtc1NpZ0Zvcm11bGFDdXJ2ZVNlZzogewotCi0gICAgICAgICAgICAgICAgY21zVUludDE2TnVtYmVyIFR5cGU7Ci0gICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFBhcmFtc0J5VHlwZVtdID0gezQsIDUsIDUgfTsKLQotICAgICAgICAgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sICZUeXBlKSkgZ290byBFcnJvcjsKLSAgICAgICAgICAgICAgICBpZiAoIV9jbXNSZWFkVUludDE2TnVtYmVyKGlvLCBOVUxMKSkgZ290byBFcnJvcjsKLQotICAgICAgICAgICAgICAgIFNlZ21lbnRzW2ldLlR5cGUgPSBUeXBlICsgNjsKLSAgICAgICAgICAgICAgICBpZiAoVHlwZSA+IDIpIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGo9MDsgaiA8IFBhcmFtc0J5VHlwZVtUeXBlXTsgaisrKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciBmOwotICAgICAgICAgICAgICAgICAgICBpZiAoIV9jbXNSZWFkRmxvYXQzMk51bWJlcihpbywgJmYpKSBnb3RvIEVycm9yOwotICAgICAgICAgICAgICAgICAgICBTZWdtZW50c1tpXS5QYXJhbXNbal0gPSBmOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0KLQotICAgICAgICAgICAgY2FzZSBjbXNTaWdTYW1wbGVkQ3VydmVTZWc6IHsKLSAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgQ291bnQ7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmQ291bnQpKSBnb3RvIEVycm9yOwotCi0gICAgICAgICAgICAgICAgU2VnbWVudHNbaV0ubkdyaWRQb2ludHMgPSBDb3VudDsKLSAgICAgICAgICAgICAgICBTZWdtZW50c1tpXS5TYW1wbGVkUG9pbnRzID0gKGNtc0Zsb2F0MzJOdW1iZXIqKSBfY21zQ2FsbG9jKHNlbGYgLT5Db250ZXh0SUQsIENvdW50LCBzaXplb2YoY21zRmxvYXQzMk51bWJlcikpOwotICAgICAgICAgICAgICAgIGlmIChTZWdtZW50c1tpXS5TYW1wbGVkUG9pbnRzID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGo9MDsgaiA8IENvdW50OyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFfY21zUmVhZEZsb2F0MzJOdW1iZXIoaW8sICZTZWdtZW50c1tpXS5TYW1wbGVkUG9pbnRzW2pdKSkgZ290byBFcnJvcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGFyIFN0cmluZ1s1XTsKLQotICAgICAgICAgICAgICAgIF9jbXNUYWdTaWduYXR1cmUyU3RyaW5nKFN0cmluZywgKGNtc1RhZ1NpZ25hdHVyZSkgRWxlbWVudFNpZyk7Ci0gICAgICAgICAgICAgICAgY21zU2lnbmFsRXJyb3Ioc2VsZi0+Q29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVua25vd24gY3VydmUgZWxlbWVudCB0eXBlICclcycgZm91bmQuIiwgU3RyaW5nKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ290byBFcnJvcjsKLQotICAgICAgICAgfQotICAgICB9Ci0KLSAgICAgQ3VydmUgPSBjbXNCdWlsZFNlZ21lbnRlZFRvbmVDdXJ2ZShzZWxmIC0+Q29udGV4dElELCBuU2VnbWVudHMsIFNlZ21lbnRzKTsKLQotICAgICBmb3IgKGk9MDsgaSA8IG5TZWdtZW50czsgaSsrKSB7Ci0gICAgICAgICBpZiAoU2VnbWVudHNbaV0uU2FtcGxlZFBvaW50cykgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgU2VnbWVudHNbaV0uU2FtcGxlZFBvaW50cyk7Ci0gICAgIH0KLSAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgU2VnbWVudHMpOwotICAgICByZXR1cm4gQ3VydmU7Ci0KLUVycm9yOgotICAgICBpZiAoU2VnbWVudHMpIHsKLSAgICAgICAgIGZvciAoaT0wOyBpIDwgblNlZ21lbnRzOyBpKyspIHsKLSAgICAgICAgICAgICBpZiAoU2VnbWVudHNbaV0uU2FtcGxlZFBvaW50cykgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgU2VnbWVudHNbaV0uU2FtcGxlZFBvaW50cyk7Ci0gICAgICAgICB9Ci0gICAgICAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBTZWdtZW50cyk7Ci0gICAgIH0KLSAgICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotc3RhdGljCi1jbXNCb29sIFJlYWRNUEVDdXJ2ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICBjbXNJT0hBTkRMRVIqIGlvLAotICAgICAgICAgICAgICAgICAgICAgdm9pZCogQ2FyZ28sCi0gICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgbiwKLSAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcpCi17Ci0gICAgICBjbXNUb25lQ3VydmUqKiBHYW1tYVRhYmxlcyA9ICggY21zVG9uZUN1cnZlKiopIENhcmdvOwotCi0gICAgICBHYW1tYVRhYmxlc1tuXSA9IFJlYWRTZWdtZW50ZWRDdXJ2ZShzZWxmLCBpbyk7Ci0gICAgICByZXR1cm4gKEdhbW1hVGFibGVzW25dICE9IE5VTEwpOwotCi0gICAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFNpemVPZlRhZyk7Ci19Ci0KLXN0YXRpYwotdm9pZCAqVHlwZV9NUEVjdXJ2ZV9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyKiBuSXRlbXMsIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcpCi17Ci0gICAgY21zU3RhZ2UqIG1wZSA9IE5VTEw7Ci0gICAgY21zVUludDE2TnVtYmVyIElucHV0Q2hhbnMsIE91dHB1dENoYW5zOwotICAgIGNtc1VJbnQzMk51bWJlciBpLCBCYXNlT2Zmc2V0OwotICAgIGNtc1RvbmVDdXJ2ZSoqIEdhbW1hVGFibGVzOwotCi0gICAgKm5JdGVtcyA9IDA7Ci0KLSAgICAvLyBHZXQgYWN0dWFsIHBvc2l0aW9uIGFzIGEgYmFzaXMgZm9yIGVsZW1lbnQgb2Zmc2V0cwotICAgIEJhc2VPZmZzZXQgPSBpbyAtPlRlbGwoaW8pIC0gc2l6ZW9mKF9jbXNUYWdCYXNlKTsKLQotICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sICZJbnB1dENoYW5zKSkgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgJk91dHB1dENoYW5zKSkgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoSW5wdXRDaGFucyAhPSBPdXRwdXRDaGFucykgcmV0dXJuIE5VTEw7Ci0KLSAgICBHYW1tYVRhYmxlcyA9IChjbXNUb25lQ3VydmUqKikgX2Ntc0NhbGxvYyhzZWxmIC0+Q29udGV4dElELCBJbnB1dENoYW5zLCBzaXplb2YoY21zVG9uZUN1cnZlKikpOwotICAgIGlmIChHYW1tYVRhYmxlcyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIGlmIChSZWFkUG9zaXRpb25UYWJsZShzZWxmLCBpbywgSW5wdXRDaGFucywgQmFzZU9mZnNldCwgR2FtbWFUYWJsZXMsIFJlYWRNUEVDdXJ2ZSkpIHsKLQotICAgICAgICBtcGUgPSBjbXNTdGFnZUFsbG9jVG9uZUN1cnZlcyhzZWxmIC0+Q29udGV4dElELCBJbnB1dENoYW5zLCBHYW1tYVRhYmxlcyk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBtcGUgPSBOVUxMOwotICAgIH0KLQotICAgIGZvciAoaT0wOyBpIDwgSW5wdXRDaGFuczsgaSsrKSB7Ci0gICAgICAgIGlmIChHYW1tYVRhYmxlc1tpXSkgY21zRnJlZVRvbmVDdXJ2ZShHYW1tYVRhYmxlc1tpXSk7Ci0gICAgfQotCi0gICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgR2FtbWFUYWJsZXMpOwotICAgICpuSXRlbXMgPSAobXBlICE9IE5VTEwpID8gMSA6IDA7Ci0gICAgcmV0dXJuIG1wZTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU2l6ZU9mVGFnKTsKLX0KLQotCi0vLyBXcml0ZSBhIHNpbmdsZSBzZWdtZW50ZWQgY3VydmUuIE5PIENIRUNLIElTIFBFUkZPUk1FRCBPTiBWQUxJRElUWQotc3RhdGljCi1jbXNCb29sIFdyaXRlU2VnbWVudGVkQ3VydmUoY21zSU9IQU5ETEVSKiBpbywgY21zVG9uZUN1cnZlKiBnKQotewotICAgIGNtc1VJbnQzMk51bWJlciBpLCBqOwotICAgIGNtc0N1cnZlU2VnbWVudCogU2VnbWVudHMgPSBnIC0+U2VnbWVudHM7Ci0gICAgY21zVUludDMyTnVtYmVyIG5TZWdtZW50cyA9IGcgLT5uU2VnbWVudHM7Ci0KLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgY21zU2lnU2VnbWVudGVkQ3VydmUpKSBnb3RvIEVycm9yOwotICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCAwKSkgZ290byBFcnJvcjsKLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgKGNtc1VJbnQxNk51bWJlcikgblNlZ21lbnRzKSkgZ290byBFcnJvcjsKLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgMCkpIGdvdG8gRXJyb3I7Ci0KLSAgICAvLyBXcml0ZSB0aGUgYnJlYWstcG9pbnRzCi0gICAgZm9yIChpPTA7IGkgPCBuU2VnbWVudHMgLSAxOyBpKyspIHsKLSAgICAgICAgaWYgKCFfY21zV3JpdGVGbG9hdDMyTnVtYmVyKGlvLCBTZWdtZW50c1tpXS54MSkpIGdvdG8gRXJyb3I7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdGhlIHNlZ21lbnRzCi0gICAgZm9yIChpPTA7IGkgPCBnIC0+blNlZ21lbnRzOyBpKyspIHsKLQotICAgICAgICBjbXNDdXJ2ZVNlZ21lbnQqIEFjdHVhbFNlZyA9IFNlZ21lbnRzICsgaTsKLQotICAgICAgICBpZiAoQWN0dWFsU2VnIC0+IFR5cGUgPT0gMCkgewotCi0gICAgICAgICAgICAvLyBUaGlzIGlzIGEgc2FtcGxlZCBjdXJ2ZQotICAgICAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIChjbXNVSW50MzJOdW1iZXIpIGNtc1NpZ1NhbXBsZWRDdXJ2ZVNlZykpIGdvdG8gRXJyb3I7Ci0gICAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgMCkpIGdvdG8gRXJyb3I7Ci0gICAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgQWN0dWFsU2VnIC0+IG5HcmlkUG9pbnRzKSkgZ290byBFcnJvcjsKLQotICAgICAgICAgICAgZm9yIChqPTA7IGogPCBnIC0+U2VnbWVudHNbaV0ubkdyaWRQb2ludHM7IGorKykgewotICAgICAgICAgICAgICAgIGlmICghX2Ntc1dyaXRlRmxvYXQzMk51bWJlcihpbywgQWN0dWFsU2VnIC0+IFNhbXBsZWRQb2ludHNbal0pKSBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBpbnQgVHlwZTsKLSAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBQYXJhbXNCeVR5cGVbXSA9IHsgNCwgNSwgNSB9OwotCi0gICAgICAgICAgICAvLyBUaGlzIGlzIGEgZm9ybXVsYS1iYXNlZAotICAgICAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIChjbXNVSW50MzJOdW1iZXIpIGNtc1NpZ0Zvcm11bGFDdXJ2ZVNlZykpIGdvdG8gRXJyb3I7Ci0gICAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgMCkpIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAgICAgIC8vIFdlIG9ubHkgYWxsb3cgMSwgMiBhbmQgMyBhcyB0eXBlcwotICAgICAgICAgICAgVHlwZSA9IEFjdHVhbFNlZyAtPlR5cGUgLSA2OwotICAgICAgICAgICAgaWYgKFR5cGUgPiAyIHx8IFR5cGUgPCAwKSBnb3RvIEVycm9yOwotCi0gICAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgKGNtc1VJbnQxNk51bWJlcikgVHlwZSkpIGdvdG8gRXJyb3I7Ci0gICAgICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgMCkpIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgUGFyYW1zQnlUeXBlW1R5cGVdOyBqKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoIV9jbXNXcml0ZUZsb2F0MzJOdW1iZXIoaW8sIChjbXNGbG9hdDMyTnVtYmVyKSBBY3R1YWxTZWcgLT5QYXJhbXNbal0pKSBnb3RvIEVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSXQgc2VlbXMgdGhlcmUgaXMgbm8gbmVlZCB0byBhbGlnbi4gQ29kZSBpcyBoZXJlLCBhbmQgZm9yIHNhZmV0eSBjb21tZW50ZWQgb3V0Ci0gICAgICAgIC8vIGlmICghX2Ntc1dyaXRlQWxpZ25tZW50KGlvKSkgZ290byBFcnJvcjsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLQotRXJyb3I6Ci0gICAgcmV0dXJuIEZBTFNFOwotfQotCi0KLXN0YXRpYwotY21zQm9vbCBXcml0ZU1QRUN1cnZlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICBjbXNJT0hBTkRMRVIqIGlvLAotICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIENhcmdvLAotICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuLAotICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcpCi17Ci0gICAgX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqIEN1cnZlcyAgPSAoX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqKSBDYXJnbzsKLQotICAgIHJldHVybiBXcml0ZVNlZ21lbnRlZEN1cnZlKGlvLCBDdXJ2ZXMgLT5UaGVDdXJ2ZXNbbl0pOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTaXplT2ZUYWcpOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Ci19Ci0KLS8vIFdyaXRlIGEgY3VydmUsIGNoZWNraW5nIGZpcnN0IGZvciB2YWxpZGl0eQotc3RhdGljCi1jbXNCb29sICBUeXBlX01QRWN1cnZlX1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQotewotICAgIGNtc1VJbnQzMk51bWJlciBCYXNlT2Zmc2V0OwotICAgIGNtc1N0YWdlKiBtcGUgPSAoY21zU3RhZ2UqKSBQdHI7Ci0gICAgX2Ntc1N0YWdlVG9uZUN1cnZlc0RhdGEqIEN1cnZlcyA9IChfY21zU3RhZ2VUb25lQ3VydmVzRGF0YSopIG1wZSAtPkRhdGE7Ci0KLSAgICBCYXNlT2Zmc2V0ID0gaW8gLT5UZWxsKGlvKSAtIHNpemVvZihfY21zVGFnQmFzZSk7Ci0KLSAgICAvLyBXcml0ZSB0aGUgaGVhZGVyLiBTaW5jZSB0aG9zZSBhcmUgY3VydmVzLCBpbnB1dCBhbmQgb3V0cHV0IGNoYW5uZWxzIGFyZSBzYW1lCi0gICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIChjbXNVSW50MTZOdW1iZXIpIG1wZSAtPklucHV0Q2hhbm5lbHMpKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIChjbXNVSW50MTZOdW1iZXIpIG1wZSAtPklucHV0Q2hhbm5lbHMpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBpZiAoIVdyaXRlUG9zaXRpb25UYWJsZShzZWxmLCBpbywgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXBlIC0+SW5wdXRDaGFubmVscywgQmFzZU9mZnNldCwgQ3VydmVzLCBXcml0ZU1QRUN1cnZlKSkgcmV0dXJuIEZBTFNFOwotCi0KLSAgICByZXR1cm4gVFJVRTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobkl0ZW1zKTsKLX0KLQotCi0KLS8vIFRoZSBtYXRyaXggaXMgb3JnYW5pemVkIGFzIGFuIGFycmF5IG9mIFB4UStRIGVsZW1lbnRzLCB3aGVyZSBQIGlzIHRoZSBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMgdG8gdGhlCi0vLyBtYXRyaXgsIGFuZCBRIGlzIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiBUaGUgbWF0cml4IGVsZW1lbnRzIGFyZSBlYWNoIGZsb2F0MzJOdW1iZXJzLiBUaGUgYXJyYXkKLS8vIGlzIG9yZ2FuaXplZCBhcyBmb2xsb3dzOgotLy8gYXJyYXkgPSBbZTExLCBlMTIsID8gZTFQLCBlMjEsIGUyMiwgPyBlMlAsID8gZVExLCBlUTIsID8gZVFQLCBlMSwgZTIsID8gZVFdCi0KLXN0YXRpYwotdm9pZCAqVHlwZV9NUEVtYXRyaXhfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQotewotICAgIGNtc1N0YWdlKiBtcGU7Ci0gICAgY21zVUludDE2TnVtYmVyICAgSW5wdXRDaGFucywgT3V0cHV0Q2hhbnM7Ci0gICAgY21zVUludDMyTnVtYmVyICAgbkVsZW1zLCBpOwotICAgIGNtc0Zsb2F0NjROdW1iZXIqIE1hdHJpeDsKLSAgICBjbXNGbG9hdDY0TnVtYmVyKiBPZmZzZXRzOwotCi0gICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgJklucHV0Q2hhbnMpKSByZXR1cm4gTlVMTDsKLSAgICBpZiAoIV9jbXNSZWFkVUludDE2TnVtYmVyKGlvLCAmT3V0cHV0Q2hhbnMpKSByZXR1cm4gTlVMTDsKLQotCi0gICAgLy8gSW5wdXQgYW5kIG91dHB1dCBjaGFucyBtYXkgYmUgQU5ZICh1cCB0byAweGZmZmYpLCAKLSAgICAvLyBidXQgd2UgY2hvb3NlIHRvIGxpbWl0IHRvIDE2IGNoYW5uZWxzIGZvciBub3cKLSAgICBpZiAoSW5wdXRDaGFucyA+PSBjbXNNQVhDSEFOTkVMUykgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKE91dHB1dENoYW5zID49IGNtc01BWENIQU5ORUxTKSByZXR1cm4gTlVMTDsKLQotICAgIG5FbGVtcyA9IElucHV0Q2hhbnMgKiBPdXRwdXRDaGFuczsKLQotICAgIE1hdHJpeCA9IChjbXNGbG9hdDY0TnVtYmVyKikgX2Ntc0NhbGxvYyhzZWxmIC0+Q29udGV4dElELCBuRWxlbXMsIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKSk7Ci0gICAgaWYgKE1hdHJpeCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIE9mZnNldHMgPSAoY21zRmxvYXQ2NE51bWJlciopIF9jbXNDYWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgT3V0cHV0Q2hhbnMsIHNpemVvZihjbXNGbG9hdDY0TnVtYmVyKSk7Ci0gICAgaWYgKE9mZnNldHMgPT0gTlVMTCkgewotCi0gICAgICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIE1hdHJpeCk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGZvciAoaT0wOyBpIDwgbkVsZW1zOyBpKyspIHsKLQotICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIHY7Ci0KLSAgICAgICAgaWYgKCFfY21zUmVhZEZsb2F0MzJOdW1iZXIoaW8sICZ2KSkgewotICAgICAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgTWF0cml4KTsKLSAgICAgICAgICAgIF9jbXNGcmVlKHNlbGYgLT5Db250ZXh0SUQsIE9mZnNldHMpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgTWF0cml4W2ldID0gdjsKLSAgICB9Ci0KLQotICAgIGZvciAoaT0wOyBpIDwgT3V0cHV0Q2hhbnM7IGkrKykgewotCi0gICAgICAgIGNtc0Zsb2F0MzJOdW1iZXIgdjsKLQotICAgICAgICBpZiAoIV9jbXNSZWFkRmxvYXQzMk51bWJlcihpbywgJnYpKSB7Ci0gICAgICAgICAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBNYXRyaXgpOwotICAgICAgICAgICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgT2Zmc2V0cyk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBPZmZzZXRzW2ldID0gdjsKLSAgICB9Ci0KLQotICAgIG1wZSA9IGNtc1N0YWdlQWxsb2NNYXRyaXgoc2VsZiAtPkNvbnRleHRJRCwgT3V0cHV0Q2hhbnMsIElucHV0Q2hhbnMsIE1hdHJpeCwgT2Zmc2V0cyk7Ci0gICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgTWF0cml4KTsKLSAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBPZmZzZXRzKTsKLQotICAgICpuSXRlbXMgPSAxOwotCi0gICAgcmV0dXJuIG1wZTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU2l6ZU9mVGFnKTsKLX0KLQotc3RhdGljCi1jbXNCb29sICBUeXBlX01QRW1hdHJpeF9Xcml0ZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIHZvaWQqIFB0ciwgY21zVUludDMyTnVtYmVyIG5JdGVtcykKLXsKLSAgICBjbXNVSW50MzJOdW1iZXIgaSwgbkVsZW1zOwotICAgIGNtc1N0YWdlKiBtcGUgPSAoY21zU3RhZ2UqKSBQdHI7Ci0gICAgX2Ntc1N0YWdlTWF0cml4RGF0YSogTWF0cml4ID0gKF9jbXNTdGFnZU1hdHJpeERhdGEqKSBtcGUgLT5EYXRhOwotCi0gICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIChjbXNVSW50MTZOdW1iZXIpIG1wZSAtPklucHV0Q2hhbm5lbHMpKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIChjbXNVSW50MTZOdW1iZXIpIG1wZSAtPk91dHB1dENoYW5uZWxzKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgbkVsZW1zID0gbXBlIC0+SW5wdXRDaGFubmVscyAqIG1wZSAtPk91dHB1dENoYW5uZWxzOwotCi0gICAgZm9yIChpPTA7IGkgPCBuRWxlbXM7IGkrKykgewotICAgICAgICBpZiAoIV9jbXNXcml0ZUZsb2F0MzJOdW1iZXIoaW8sIChjbXNGbG9hdDMyTnVtYmVyKSBNYXRyaXgtPkRvdWJsZVtpXSkpIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLQotICAgIGZvciAoaT0wOyBpIDwgbXBlIC0+T3V0cHV0Q2hhbm5lbHM7IGkrKykgewotCi0gICAgICAgIGlmIChNYXRyaXggLT5PZmZzZXQgPT0gTlVMTCkgewotCi0gICAgICAgICAgICAgICBpZiAoIV9jbXNXcml0ZUZsb2F0MzJOdW1iZXIoaW8sIDApKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICBpZiAoIV9jbXNXcml0ZUZsb2F0MzJOdW1iZXIoaW8sIChjbXNGbG9hdDMyTnVtYmVyKSBNYXRyaXgtPk9mZnNldFtpXSkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBUUlVFOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuSXRlbXMpOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Ci19Ci0KLQotCi1zdGF0aWMKLXZvaWQgKlR5cGVfTVBFY2x1dF9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyKiBuSXRlbXMsIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcpCi17Ci0gICAgY21zU3RhZ2UqIG1wZSA9IE5VTEw7Ci0gICAgY21zVUludDE2TnVtYmVyIElucHV0Q2hhbnMsIE91dHB1dENoYW5zOwotICAgIGNtc1VJbnQ4TnVtYmVyIERpbWVuc2lvbnM4WzE2XTsKLSAgICBjbXNVSW50MzJOdW1iZXIgaSwgbk1heEdyaWRzLCBHcmlkUG9pbnRzW01BWF9JTlBVVF9ESU1FTlNJT05TXTsKLSAgICBfY21zU3RhZ2VDTHV0RGF0YSogY2x1dDsKLQotICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sICZJbnB1dENoYW5zKSkgcmV0dXJuIE5VTEw7Ci0gICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgJk91dHB1dENoYW5zKSkgcmV0dXJuIE5VTEw7Ci0KLSAgICBpZiAoSW5wdXRDaGFucyA9PSAwKSBnb3RvIEVycm9yOwotICAgIGlmIChPdXRwdXRDaGFucyA9PSAwKSBnb3RvIEVycm9yOwotCi0gICAgaWYgKGlvIC0+UmVhZChpbywgRGltZW5zaW9uczgsIHNpemVvZihjbXNVSW50OE51bWJlciksIDE2KSAhPSAxNikKLSAgICAgICAgZ290byBFcnJvcjsKLQotICAgIC8vIENvcHkgTUFYX0lOUFVUX0RJTUVOU0lPTlMgYXQgbW9zdC4gRXhwYW5kIHRvIGNtc1VJbnQzMk51bWJlcgotICAgIG5NYXhHcmlkcyA9IElucHV0Q2hhbnMgPiBNQVhfSU5QVVRfRElNRU5TSU9OUyA/IE1BWF9JTlBVVF9ESU1FTlNJT05TIDogSW5wdXRDaGFuczsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuTWF4R3JpZHM7IGkrKykgewotICAgICAgICBpZiAoRGltZW5zaW9uczhbaV0gPT0gMSkgZ290byBFcnJvcjsgLy8gSW1wb3NzaWJsZSB2YWx1ZSwgMCBmb3Igbm8gQ0xVVCBhbmQgdGhlbiAyIGF0IGxlYXN0Ci0gICAgICAgIEdyaWRQb2ludHNbaV0gPSAoY21zVUludDMyTnVtYmVyKURpbWVuc2lvbnM4W2ldOwotICAgIH0KLSAgICAKLSAgICAvLyBBbGxvY2F0ZSB0aGUgdHJ1ZSBDTFVUCi0gICAgbXBlID0gY21zU3RhZ2VBbGxvY0NMdXRGbG9hdEdyYW51bGFyKHNlbGYgLT5Db250ZXh0SUQsIEdyaWRQb2ludHMsIElucHV0Q2hhbnMsIE91dHB1dENoYW5zLCBOVUxMKTsKLSAgICBpZiAobXBlID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLSAgICAvLyBSZWFkIHRoZSBkYXRhCi0gICAgY2x1dCA9IChfY21zU3RhZ2VDTHV0RGF0YSopIG1wZSAtPkRhdGE7Ci0gICAgZm9yIChpPTA7IGkgPCBjbHV0IC0+bkVudHJpZXM7IGkrKykgewotCi0gICAgICAgIGlmICghX2Ntc1JlYWRGbG9hdDMyTnVtYmVyKGlvLCAmY2x1dCAtPlRhYi5URmxvYXRbaV0pKSBnb3RvIEVycm9yOwotICAgIH0KLQotICAgICpuSXRlbXMgPSAxOwotICAgIHJldHVybiBtcGU7Ci0KLUVycm9yOgotICAgICpuSXRlbXMgPSAwOwotICAgIGlmIChtcGUgIT0gTlVMTCkgY21zU3RhZ2VGcmVlKG1wZSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFNpemVPZlRhZyk7Ci19Ci0KLS8vIFdyaXRlIGEgQ0xVVCBpbiBmbG9hdGluZyBwb2ludAotc3RhdGljCi1jbXNCb29sICBUeXBlX01QRWNsdXRfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCi17Ci0gICAgY21zVUludDhOdW1iZXIgRGltZW5zaW9uczhbMTZdOwotICAgIGNtc1VJbnQzMk51bWJlciBpOwotICAgIGNtc1N0YWdlKiBtcGUgPSAoY21zU3RhZ2UqKSBQdHI7Ci0gICAgX2Ntc1N0YWdlQ0x1dERhdGEqIGNsdXQgPSAoX2Ntc1N0YWdlQ0x1dERhdGEqKSBtcGUgLT5EYXRhOwotCi0gICAgLy8gQ2hlY2sgZm9yIG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgaWYgKG1wZSAtPiBJbnB1dENoYW5uZWxzID4gMTUpIHJldHVybiBGQUxTRTsKLQotICAgIC8vIE9ubHkgZmxvYXRzIGFyZSBzdXBwb3J0ZWQgaW4gTVBFCi0gICAgaWYgKGNsdXQgLT5IYXNGbG9hdFZhbHVlcyA9PSBGQUxTRSkgcmV0dXJuIEZBTFNFOwotCi0gICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIChjbXNVSW50MTZOdW1iZXIpIG1wZSAtPklucHV0Q2hhbm5lbHMpKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIChjbXNVSW50MTZOdW1iZXIpIG1wZSAtPk91dHB1dENoYW5uZWxzKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgbWVtc2V0KERpbWVuc2lvbnM4LCAwLCBzaXplb2YoRGltZW5zaW9uczgpKTsKLQotICAgIGZvciAoaT0wOyBpIDwgbXBlIC0+SW5wdXRDaGFubmVsczsgaSsrKQotICAgICAgICBEaW1lbnNpb25zOFtpXSA9IChjbXNVSW50OE51bWJlcikgY2x1dCAtPlBhcmFtcyAtPm5TYW1wbGVzW2ldOwotCi0gICAgaWYgKCFpbyAtPldyaXRlKGlvLCAxNiwgRGltZW5zaW9uczgpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IGNsdXQgLT5uRW50cmllczsgaSsrKSB7Ci0KLSAgICAgICAgaWYgKCFfY21zV3JpdGVGbG9hdDMyTnVtYmVyKGlvLCBjbHV0IC0+VGFiLlRGbG9hdFtpXSkpIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobkl0ZW1zKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOwotfQotCi0KLQotLy8gVGhpcyBpcyB0aGUgbGlzdCBvZiBidWlsdC1pbiBNUEUgdHlwZXMKLXN0YXRpYyBfY21zVGFnVHlwZUxpbmtlZExpc3QgU3VwcG9ydGVkTVBFdHlwZXNbXSA9IHsKLQote3sgKGNtc1RhZ1R5cGVTaWduYXR1cmUpIGNtc1NpZ0JBY3NFbGVtVHlwZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAmU3VwcG9ydGVkTVBFdHlwZXNbMV0gfSwgICAvLyBJZ25vcmUgdGhvc2UgZWxlbWVudHMgZm9yIG5vdwote3sgKGNtc1RhZ1R5cGVTaWduYXR1cmUpIGNtc1NpZ0VBY3NFbGVtVHlwZSwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgMCB9LCAmU3VwcG9ydGVkTVBFdHlwZXNbMl0gfSwgICAvLyAoVGhhdCdzIHdoYXQgdGhlIHNwZWMgc2F5cykKLQote1RZUEVfTVBFX0hBTkRMRVIoKGNtc1RhZ1R5cGVTaWduYXR1cmUpIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsICAgICBNUEVjdXJ2ZSksICAgICAgJlN1cHBvcnRlZE1QRXR5cGVzWzNdIH0sCi17VFlQRV9NUEVfSEFORExFUigoY21zVGFnVHlwZVNpZ25hdHVyZSkgY21zU2lnTWF0cml4RWxlbVR5cGUsICAgICAgIE1QRW1hdHJpeCksICAgICAmU3VwcG9ydGVkTVBFdHlwZXNbNF0gfSwKLXtUWVBFX01QRV9IQU5ETEVSKChjbXNUYWdUeXBlU2lnbmF0dXJlKSBjbXNTaWdDTHV0RWxlbVR5cGUsICAgICAgICAgTVBFY2x1dCksICAgICAgICBOVUxMIH0sCi19OwotCi1fY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSBfY21zTVBFVHlwZVBsdWdpbkNodW5rID0geyBOVUxMIH07Ci0KLXN0YXRpYwotY21zQm9vbCBSZWFkTVBFRWxlbShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgIGNtc0lPSEFORExFUiogaW8sCi0gICAgICAgICAgICAgICAgICAgIHZvaWQqIENhcmdvLAotICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgbiwKLSAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFNpemVPZlRhZykKLXsKLSAgICBjbXNTdGFnZVNpZ25hdHVyZSBFbGVtZW50U2lnOwotICAgIGNtc1RhZ1R5cGVIYW5kbGVyKiBUeXBlSGFuZGxlcjsKLSAgICBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zOwotICAgIGNtc1BpcGVsaW5lICpOZXdMVVQgPSAoY21zUGlwZWxpbmUgKikgQ2FyZ287Ci0gICAgX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUqIE1QRVR5cGVQbHVnaW5DaHVuayAgPSAoIF9jbXNUYWdUeXBlUGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhzZWxmLT5Db250ZXh0SUQsIE1QRVBsdWdpbik7Ci0KLQotICAgIC8vIFRha2Ugc2lnbmF0dXJlIGFuZCBjaGFubmVscyBmb3IgZWFjaCBlbGVtZW50LgotICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sIChjbXNVSW50MzJOdW1iZXIqKSAmRWxlbWVudFNpZykpIHJldHVybiBGQUxTRTsKLQotICAgIC8vIFRoZSByZXNlcnZlZCBwbGFjZWhvbGRlcgotICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sIE5VTEwpKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAvLyBSZWFkIGRpdmVyc2UgTVBFIHR5cGVzCi0gICAgVHlwZUhhbmRsZXIgPSBHZXRIYW5kbGVyKChjbXNUYWdUeXBlU2lnbmF0dXJlKSBFbGVtZW50U2lnLCBNUEVUeXBlUGx1Z2luQ2h1bmsgLT5UYWdUeXBlcywgU3VwcG9ydGVkTVBFdHlwZXMpOwotICAgIGlmIChUeXBlSGFuZGxlciA9PSBOVUxMKSAgewotCi0gICAgICAgIGNoYXIgU3RyaW5nWzVdOwotCi0gICAgICAgIF9jbXNUYWdTaWduYXR1cmUyU3RyaW5nKFN0cmluZywgKGNtc1RhZ1NpZ25hdHVyZSkgRWxlbWVudFNpZyk7Ci0KLSAgICAgICAgLy8gQW4gdW5rbm93biBlbGVtZW50IHdhcyBmb3VuZC4KLSAgICAgICAgY21zU2lnbmFsRXJyb3Ioc2VsZiAtPkNvbnRleHRJRCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJVbmtub3duIE1QRSB0eXBlICclcycgZm91bmQuIiwgU3RyaW5nKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIC8vIElmIG5vIHJlYWQgbWV0aG9kLCBqdXN0IGlnbm9yZSB0aGUgZWxlbWVudCAodmFsaWQgZm9yIGNtc1NpZ0JBY3NFbGVtVHlwZSBhbmQgY21zU2lnRUFjc0VsZW1UeXBlKQotICAgIC8vIFJlYWQgdGhlIE1QRS4gTm8gc2l6ZSBpcyBnaXZlbgotICAgIGlmIChUeXBlSGFuZGxlciAtPlJlYWRQdHIgIT0gTlVMTCkgewotCi0gICAgICAgIC8vIFRoaXMgaXMgYSByZWFsIGVsZW1lbnQgd2hpY2ggc2hvdWxkIGJlIHJlYWQgYW5kIHByb2Nlc3NlZAotICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTmV3TFVULCBjbXNBVF9FTkQsIChjbXNTdGFnZSopIFR5cGVIYW5kbGVyIC0+UmVhZFB0cihzZWxmLCBpbywgJm5JdGVtcywgU2l6ZU9mVGFnKSkpCi0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgcmV0dXJuIFRSVUU7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKFNpemVPZlRhZyk7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKLX0KLQotCi0vLyBUaGlzIGlzIHRoZSBtYWluIGRpc3BhdGNoZXIgZm9yIE1QRQotc3RhdGljCi12b2lkICpUeXBlX01QRV9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgY21zVUludDMyTnVtYmVyKiBuSXRlbXMsIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcpCi17Ci0gICAgY21zVUludDE2TnVtYmVyIElucHV0Q2hhbnMsIE91dHB1dENoYW5zOwotICAgIGNtc1VJbnQzMk51bWJlciBFbGVtZW50Q291bnQ7Ci0gICAgY21zUGlwZWxpbmUgKk5ld0xVVCA9IE5VTEw7Ci0gICAgY21zVUludDMyTnVtYmVyIEJhc2VPZmZzZXQ7Ci0KLSAgICAvLyBHZXQgYWN0dWFsIHBvc2l0aW9uIGFzIGEgYmFzaXMgZm9yIGVsZW1lbnQgb2Zmc2V0cwotICAgIEJhc2VPZmZzZXQgPSBpbyAtPlRlbGwoaW8pIC0gc2l6ZW9mKF9jbXNUYWdCYXNlKTsKLQotICAgIC8vIFJlYWQgY2hhbm5lbHMgYW5kIGVsZW1lbnQgY291bnQKLSAgICBpZiAoIV9jbXNSZWFkVUludDE2TnVtYmVyKGlvLCAmSW5wdXRDaGFucykpIHJldHVybiBOVUxMOwotICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sICZPdXRwdXRDaGFucykpIHJldHVybiBOVUxMOwotCi0gICAgaWYgKElucHV0Q2hhbnMgPT0gMCB8fCBJbnB1dENoYW5zID49IGNtc01BWENIQU5ORUxTKSByZXR1cm4gTlVMTDsKLSAgICBpZiAoT3V0cHV0Q2hhbnMgPT0gMCB8fCBPdXRwdXRDaGFucyA+PSBjbXNNQVhDSEFOTkVMUykgcmV0dXJuIE5VTEw7Ci0KLSAgICAvLyBBbGxvY2F0ZXMgYW4gZW1wdHkgTFVUCi0gICAgTmV3TFVUID0gY21zUGlwZWxpbmVBbGxvYyhzZWxmIC0+Q29udGV4dElELCBJbnB1dENoYW5zLCBPdXRwdXRDaGFucyk7Ci0gICAgaWYgKE5ld0xVVCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZFbGVtZW50Q291bnQpKSByZXR1cm4gTlVMTDsKLQotICAgIGlmICghUmVhZFBvc2l0aW9uVGFibGUoc2VsZiwgaW8sIEVsZW1lbnRDb3VudCwgQmFzZU9mZnNldCwgTmV3TFVULCBSZWFkTVBFRWxlbSkpIHsKLSAgICAgICAgaWYgKE5ld0xVVCAhPSBOVUxMKSBjbXNQaXBlbGluZUZyZWUoTmV3TFVUKTsKLSAgICAgICAgKm5JdGVtcyA9IDA7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8vIFN1Y2Nlc3MKLSAgICAqbkl0ZW1zID0gMTsKLSAgICByZXR1cm4gTmV3TFVUOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihTaXplT2ZUYWcpOwotfQotCi0KLQotLy8gVGhpcyBvbmUgaXMgYSBsaWl0bGUgYml0IG1vcmUgY29tcGxleCwgc28gd2UgZG9uJ3QgdXNlIHBvc2l0aW9uIHRhYmxlcyB0aGlzIHRpbWUuCi1zdGF0aWMKLWNtc0Jvb2wgVHlwZV9NUEVfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCi17Ci0gICAgY21zVUludDMyTnVtYmVyIGksIEJhc2VPZmZzZXQsIERpcmVjdG9yeVBvcywgQ3VycmVudFBvczsKLSAgICBpbnQgaW5wdXRDaGFuLCBvdXRwdXRDaGFuOwotICAgIGNtc1VJbnQzMk51bWJlciBFbGVtQ291bnQ7Ci0gICAgY21zVUludDMyTnVtYmVyICpFbGVtZW50T2Zmc2V0cyA9IE5VTEwsICpFbGVtZW50U2l6ZXMgPSBOVUxMLCBCZWZvcmU7Ci0gICAgY21zU3RhZ2VTaWduYXR1cmUgRWxlbWVudFNpZzsKLSAgICBjbXNQaXBlbGluZSogTHV0ID0gKGNtc1BpcGVsaW5lKikgUHRyOwotICAgIGNtc1N0YWdlKiBFbGVtID0gTHV0IC0+RWxlbWVudHM7Ci0gICAgY21zVGFnVHlwZUhhbmRsZXIqIFR5cGVIYW5kbGVyOwotICAgIF9jbXNUYWdUeXBlUGx1Z2luQ2h1bmtUeXBlKiBNUEVUeXBlUGx1Z2luQ2h1bmsgID0gKCBfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoc2VsZi0+Q29udGV4dElELCBNUEVQbHVnaW4pOwotCi0gICAgQmFzZU9mZnNldCA9IGlvIC0+VGVsbChpbykgLSBzaXplb2YoX2Ntc1RhZ0Jhc2UpOwotCi0gICAgaW5wdXRDaGFuICA9IGNtc1BpcGVsaW5lSW5wdXRDaGFubmVscyhMdXQpOwotICAgIG91dHB1dENoYW4gPSBjbXNQaXBlbGluZU91dHB1dENoYW5uZWxzKEx1dCk7Ci0gICAgRWxlbUNvdW50ICA9IGNtc1BpcGVsaW5lU3RhZ2VDb3VudChMdXQpOwotCi0gICAgRWxlbWVudE9mZnNldHMgPSAoY21zVUludDMyTnVtYmVyICopIF9jbXNDYWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgRWxlbUNvdW50LCBzaXplb2YoY21zVUludDMyTnVtYmVyKSk7Ci0gICAgaWYgKEVsZW1lbnRPZmZzZXRzID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLSAgICBFbGVtZW50U2l6ZXMgPSAoY21zVUludDMyTnVtYmVyICopIF9jbXNDYWxsb2Moc2VsZiAtPkNvbnRleHRJRCwgRWxlbUNvdW50LCBzaXplb2YoY21zVUludDMyTnVtYmVyKSk7Ci0gICAgaWYgKEVsZW1lbnRTaXplcyA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgLy8gV3JpdGUgdGhlIGhlYWQKLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgKGNtc1VJbnQxNk51bWJlcikgaW5wdXRDaGFuKSkgZ290byBFcnJvcjsKLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgKGNtc1VJbnQxNk51bWJlcikgb3V0cHV0Q2hhbikpIGdvdG8gRXJyb3I7Ci0gICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIChjbXNVSW50MTZOdW1iZXIpIEVsZW1Db3VudCkpIGdvdG8gRXJyb3I7Ci0KLSAgICBEaXJlY3RvcnlQb3MgPSBpbyAtPlRlbGwoaW8pOwotCi0gICAgLy8gV3JpdGUgYSBmYWtlIGRpcmVjdG9yeSB0byBiZSBmaWxsZWQgbGF0dGVyIG9uCi0gICAgZm9yIChpPTA7IGkgPCBFbGVtQ291bnQ7IGkrKykgewotICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgMCkpIGdvdG8gRXJyb3I7ICAvLyBPZmZzZXQKLSAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIDApKSBnb3RvIEVycm9yOyAgLy8gc2l6ZQotICAgIH0KLQotICAgIC8vIFdyaXRlIGVhY2ggc2luZ2xlIHRhZy4gS2VlcCB0cmFjayBvZiB0aGUgc2l6ZSBhcyB3ZWxsLgotICAgIGZvciAoaT0wOyBpIDwgRWxlbUNvdW50OyBpKyspIHsKLQotICAgICAgICBFbGVtZW50T2Zmc2V0c1tpXSA9IGlvIC0+VGVsbChpbykgLSBCYXNlT2Zmc2V0OwotCi0gICAgICAgIEVsZW1lbnRTaWcgPSBFbGVtIC0+VHlwZTsKLQotICAgICAgICBUeXBlSGFuZGxlciA9IEdldEhhbmRsZXIoKGNtc1RhZ1R5cGVTaWduYXR1cmUpIEVsZW1lbnRTaWcsIE1QRVR5cGVQbHVnaW5DaHVuay0+VGFnVHlwZXMsIFN1cHBvcnRlZE1QRXR5cGVzKTsKLSAgICAgICAgaWYgKFR5cGVIYW5kbGVyID09IE5VTEwpICB7Ci0KLSAgICAgICAgICAgICAgICBjaGFyIFN0cmluZ1s1XTsKLQotICAgICAgICAgICAgICAgIF9jbXNUYWdTaWduYXR1cmUyU3RyaW5nKFN0cmluZywgKGNtc1RhZ1NpZ25hdHVyZSkgRWxlbWVudFNpZyk7Ci0KLSAgICAgICAgICAgICAgICAgLy8gQW4gdW5rbm93IGVsZW1lbnQgd2FzIGZvdW5kLgotICAgICAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihzZWxmLT5Db250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiRm91bmQgdW5rbm93biBNUEUgdHlwZSAnJXMnIiwgU3RyaW5nKTsKLSAgICAgICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBFbGVtZW50U2lnKSkgZ290byBFcnJvcjsKLSAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MzJOdW1iZXIoaW8sIDApKSBnb3RvIEVycm9yOwotICAgICAgICBCZWZvcmUgPSBpbyAtPlRlbGwoaW8pOwotICAgICAgICBpZiAoIVR5cGVIYW5kbGVyIC0+V3JpdGVQdHIoc2VsZiwgaW8sIEVsZW0sIDEpKSBnb3RvIEVycm9yOwotICAgICAgICBpZiAoIV9jbXNXcml0ZUFsaWdubWVudChpbykpIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAgRWxlbWVudFNpemVzW2ldID0gaW8gLT5UZWxsKGlvKSAtIEJlZm9yZTsKLQotICAgICAgICBFbGVtID0gRWxlbSAtPk5leHQ7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdGhlIGRpcmVjdG9yeQotICAgIEN1cnJlbnRQb3MgPSBpbyAtPlRlbGwoaW8pOwotCi0gICAgaWYgKCFpbyAtPlNlZWsoaW8sIERpcmVjdG9yeVBvcykpIGdvdG8gRXJyb3I7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IEVsZW1Db3VudDsgaSsrKSB7Ci0gICAgICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBFbGVtZW50T2Zmc2V0c1tpXSkpIGdvdG8gRXJyb3I7Ci0gICAgICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBFbGVtZW50U2l6ZXNbaV0pKSBnb3RvIEVycm9yOwotICAgIH0KLQotICAgIGlmICghaW8gLT5TZWVrKGlvLCBDdXJyZW50UG9zKSkgZ290byBFcnJvcjsKLQotICAgIGlmIChFbGVtZW50T2Zmc2V0cyAhPSBOVUxMKSBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBFbGVtZW50T2Zmc2V0cyk7Ci0gICAgaWYgKEVsZW1lbnRTaXplcyAhPSBOVUxMKSBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBFbGVtZW50U2l6ZXMpOwotICAgIHJldHVybiBUUlVFOwotCi1FcnJvcjoKLSAgICBpZiAoRWxlbWVudE9mZnNldHMgIT0gTlVMTCkgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgRWxlbWVudE9mZnNldHMpOwotICAgIGlmIChFbGVtZW50U2l6ZXMgIT0gTlVMTCkgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgRWxlbWVudFNpemVzKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7Ci19Ci0KLQotc3RhdGljCi12b2lkKiBUeXBlX01QRV9EdXAoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjb25zdCB2b2lkICpQdHIsIGNtc1VJbnQzMk51bWJlciBuKQotewotICAgIHJldHVybiAodm9pZCopIGNtc1BpcGVsaW5lRHVwKChjbXNQaXBlbGluZSopIFB0cik7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG4pOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Ci19Ci0KLXN0YXRpYwotdm9pZCBUeXBlX01QRV9GcmVlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgdm9pZCAqUHRyKQotewotICAgIGNtc1BpcGVsaW5lRnJlZSgoY21zUGlwZWxpbmUqKSBQdHIpOwotICAgIHJldHVybjsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Ci19Ci0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIFR5cGUgY21zU2lnVmNndFR5cGUKLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLQotI2RlZmluZSBjbXNWaWRlb0NhcmRHYW1tYVRhYmxlVHlwZSAgICAwCi0jZGVmaW5lIGNtc1ZpZGVvQ2FyZEdhbW1hRm9ybXVsYVR5cGUgIDEKLQotLy8gVXNlZCBpbnRlcm5hbGx5Ci10eXBlZGVmIHN0cnVjdCB7Ci0gICAgZG91YmxlIEdhbW1hOwotICAgIGRvdWJsZSBNaW47Ci0gICAgZG91YmxlIE1heDsKLX0gX2Ntc1ZDR1RHQU1NQTsKLQotCi1zdGF0aWMKLXZvaWQgKlR5cGVfdmNndF9SZWFkKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgIGNtc0lPSEFORExFUiogaW8sCi0gICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIqIG5JdGVtcywKLSAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTaXplT2ZUYWcpCi17Ci0gICAgY21zVUludDMyTnVtYmVyIFRhZ1R5cGUsIG4sIGk7Ci0gICAgY21zVG9uZUN1cnZlKiogQ3VydmVzOwotCi0gICAgKm5JdGVtcyA9IDA7Ci0KLSAgICAvLyBSZWFkIHRhZyB0eXBlCi0gICAgaWYgKCFfY21zUmVhZFVJbnQzMk51bWJlcihpbywgJlRhZ1R5cGUpKSByZXR1cm4gTlVMTDsKLQotICAgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciB0aGUgYXJyYXkKLSAgICBDdXJ2ZXMgPSAoIGNtc1RvbmVDdXJ2ZSoqKSBfY21zQ2FsbG9jKHNlbGYgLT5Db250ZXh0SUQsIDMsIHNpemVvZihjbXNUb25lQ3VydmUqKSk7Ci0gICAgaWYgKEN1cnZlcyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIC8vIFRoZXJlIGFyZSB0d28gcG9zc2libGUgZmxhdm9ycwotICAgIHN3aXRjaCAoVGFnVHlwZSkgewotCi0gICAgLy8gR2FtbWEgaXMgc3RvcmVkIGFzIGEgdGFibGUKLSAgICBjYXNlIGNtc1ZpZGVvQ2FyZEdhbW1hVGFibGVUeXBlOgotICAgIHsKLSAgICAgICBjbXNVSW50MTZOdW1iZXIgbkNoYW5uZWxzLCBuRWxlbXMsIG5CeXRlczsKLQotICAgICAgIC8vIENoZWNrIGNoYW5uZWwgY291bnQsIHdoaWNoIHNob3VsZCBiZSAzICh3ZSBkb24ndCBzdXBwb3J0IG1vbm9jaHJvbWUgdGhpcyB0aW1lKQotICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZOdW1iZXIoaW8sICZuQ2hhbm5lbHMpKSBnb3RvIEVycm9yOwotCi0gICAgICAgaWYgKG5DaGFubmVscyAhPSAzKSB7Ci0gICAgICAgICAgIGNtc1NpZ25hbEVycm9yKHNlbGYtPkNvbnRleHRJRCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJVbnN1cHBvcnRlZCBudW1iZXIgb2YgY2hhbm5lbHMgZm9yIFZDR1QgJyVkJyIsIG5DaGFubmVscyk7Ci0gICAgICAgICAgIGdvdG8gRXJyb3I7Ci0gICAgICAgfQotCi0gICAgICAgLy8gR2V0IFRhYmxlIGVsZW1lbnQgY291bnQgYW5kIGJ5dGVzIHBlciBlbGVtZW50Ci0gICAgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgJm5FbGVtcykpIGdvdG8gRXJyb3I7Ci0gICAgICAgaWYgKCFfY21zUmVhZFVJbnQxNk51bWJlcihpbywgJm5CeXRlcykpIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAvLyBBZG9iZSdzIHF1aXJrIGZpeHVwLiBGaXhpbmcgYnJva2VuIHByb2ZpbGVzLi4uCi0gICAgICAgaWYgKG5FbGVtcyA9PSAyNTYgJiYgbkJ5dGVzID09IDEgJiYgU2l6ZU9mVGFnID09IDE1NzYpCi0gICAgICAgICAgIG5CeXRlcyA9IDI7Ci0KLQotICAgICAgIC8vIFBvcHVsYXRlIHRvbmUgY3VydmVzCi0gICAgICAgZm9yIChuPTA7IG4gPCAzOyBuKyspIHsKLQotICAgICAgICAgICBDdXJ2ZXNbbl0gPSBjbXNCdWlsZFRhYnVsYXRlZFRvbmVDdXJ2ZTE2KHNlbGYgLT5Db250ZXh0SUQsIG5FbGVtcywgTlVMTCk7Ci0gICAgICAgICAgIGlmIChDdXJ2ZXNbbl0gPT0gTlVMTCkgZ290byBFcnJvcjsKLQotICAgICAgICAgICAvLyBPbiBkZXBlbmRpbmcgb24gYnl0ZSBkZXB0aAotICAgICAgICAgICBzd2l0Y2ggKG5CeXRlcykgewotCi0gICAgICAgICAgIC8vIE9uZSBieXRlLCAwLi4yNTUKLSAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBuRWxlbXM7IGkrKykgewotCi0gICAgICAgICAgICAgICAgICAgY21zVUludDhOdW1iZXIgdjsKLQotICAgICAgICAgICAgICAgICAgICAgIGlmICghX2Ntc1JlYWRVSW50OE51bWJlcihpbywgJnYpKSBnb3RvIEVycm9yOwotICAgICAgICAgICAgICAgICAgICAgIEN1cnZlc1tuXSAtPlRhYmxlMTZbaV0gPSBGUk9NXzhfVE9fMTYodik7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAvLyBPbmUgd29yZCAwLi42NTUzNQotICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgIGlmICghX2Ntc1JlYWRVSW50MTZBcnJheShpbywgbkVsZW1zLCBDdXJ2ZXNbbl0tPlRhYmxlMTYpKSBnb3RvIEVycm9yOwotICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIC8vIFVuc3VwcG9ydGVkCi0gICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKHNlbGYtPkNvbnRleHRJRCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJVbnN1cHBvcnRlZCBiaXQgZGVwdGggZm9yIFZDR1QgJyVkJyIsIG5CeXRlcyAqIDgpOwotICAgICAgICAgICAgICBnb3RvIEVycm9yOwotICAgICAgICAgICB9Ci0gICAgICAgfSAvLyBGb3IgYWxsIDMgY2hhbm5lbHMKLSAgICB9Ci0gICAgYnJlYWs7Ci0KLSAgIC8vIEluIHRoaXMgY2FzZSwgZ2FtbWEgaXMgc3RvcmVkIGFzIGEgZm9ybXVsYQotICAgY2FzZSBjbXNWaWRlb0NhcmRHYW1tYUZvcm11bGFUeXBlOgotICAgewotICAgICAgIF9jbXNWQ0dUR0FNTUEgQ29sb3JhbnRbM107Ci0KLSAgICAgICAgLy8gUG9wdWxhdGUgdG9uZSBjdXJ2ZXMKLSAgICAgICBmb3IgKG49MDsgbiA8IDM7IG4rKykgewotCi0gICAgICAgICAgIGRvdWJsZSBQYXJhbXNbMTBdOwotCi0gICAgICAgICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICZDb2xvcmFudFtuXS5HYW1tYSkpIGdvdG8gRXJyb3I7Ci0gICAgICAgICAgIGlmICghX2Ntc1JlYWQxNUZpeGVkMTZOdW1iZXIoaW8sICZDb2xvcmFudFtuXS5NaW4pKSBnb3RvIEVycm9yOwotICAgICAgICAgICBpZiAoIV9jbXNSZWFkMTVGaXhlZDE2TnVtYmVyKGlvLCAmQ29sb3JhbnRbbl0uTWF4KSkgZ290byBFcnJvcjsKLQotICAgICAgICAgICAgLy8gUGFyYW1ldHJpYyBjdXJ2ZSB0eXBlIDUgaXM6Ci0gICAgICAgICAgICAvLyBZID0gKGFYICsgYileR2FtbWEgKyBlIHwgWCA+PSBkCi0gICAgICAgICAgICAvLyBZID0gY1ggKyBmICAgICAgICAgICAgIHwgWCA8IGQKLQotICAgICAgICAgICAgLy8gdmNndCBmb3JtdWxhIGlzOgotICAgICAgICAgICAgLy8gWSA9IChNYXggP01pbikgKiAoWCBeIEdhbW1hKSArIE1pbgotCi0gICAgICAgICAgICAvLyBTbywgdGhlIHRyYW5zbGF0aW9uIGlzCi0gICAgICAgICAgICAvLyBhID0gKE1heCA/TWluKSBeICggMSAvIEdhbW1hKQotICAgICAgICAgICAgLy8gZSA9IE1pbgotICAgICAgICAgICAgLy8gYj1jPWQ9Zj0wCi0KLSAgICAgICAgICAgUGFyYW1zWzBdID0gQ29sb3JhbnRbbl0uR2FtbWE7Ci0gICAgICAgICAgIFBhcmFtc1sxXSA9IHBvdygoQ29sb3JhbnRbbl0uTWF4IC0gQ29sb3JhbnRbbl0uTWluKSwgKDEuMCAvIENvbG9yYW50W25dLkdhbW1hKSk7Ci0gICAgICAgICAgIFBhcmFtc1syXSA9IDA7Ci0gICAgICAgICAgIFBhcmFtc1szXSA9IDA7Ci0gICAgICAgICAgIFBhcmFtc1s0XSA9IDA7Ci0gICAgICAgICAgIFBhcmFtc1s1XSA9IENvbG9yYW50W25dLk1pbjsKLSAgICAgICAgICAgUGFyYW1zWzZdID0gMDsKLQotICAgICAgICAgICBDdXJ2ZXNbbl0gPSBjbXNCdWlsZFBhcmFtZXRyaWNUb25lQ3VydmUoc2VsZiAtPkNvbnRleHRJRCwgNSwgUGFyYW1zKTsKLSAgICAgICAgICAgaWYgKEN1cnZlc1tuXSA9PSBOVUxMKSBnb3RvIEVycm9yOwotICAgICAgIH0KLSAgIH0KLSAgIGJyZWFrOwotCi0gICAvLyBVbnN1cHBvcnRlZAotICAgZGVmYXVsdDoKLSAgICAgIGNtc1NpZ25hbEVycm9yKHNlbGYtPkNvbnRleHRJRCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJVbnN1cHBvcnRlZCB0YWcgdHlwZSBmb3IgVkNHVCAnJWQnIiwgVGFnVHlwZSk7Ci0gICAgICBnb3RvIEVycm9yOwotICAgfQotCi0gICAqbkl0ZW1zID0gMTsKLSAgIHJldHVybiAodm9pZCopIEN1cnZlczsKLQotLy8gUmVncmV0LCAgZnJlZSBhbGwgcmVzb3VyY2VzCi1FcnJvcjoKLQotICAgIGNtc0ZyZWVUb25lQ3VydmVUcmlwbGUoQ3VydmVzKTsKLSAgICBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBDdXJ2ZXMpOwotICAgIHJldHVybiBOVUxMOwotCi0gICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoU2l6ZU9mVGFnKTsKLX0KLQotCi0vLyBXZSBkb24ndCBzdXBwb3J0IGFsbCBmbGF2b3JzLCBvbmx5IDE2Yml0cyB0YWJsZXMgYW5kIGZvcm11bGEKLXN0YXRpYwotY21zQm9vbCBUeXBlX3ZjZ3RfV3JpdGUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCB2b2lkKiBQdHIsIGNtc1VJbnQzMk51bWJlciBuSXRlbXMpCi17Ci0gICAgY21zVG9uZUN1cnZlKiogQ3VydmVzID0gIChjbXNUb25lQ3VydmUqKikgUHRyOwotICAgIGNtc1VJbnQzMk51bWJlciBpLCBqOwotCi0gICAgaWYgKGNtc0dldFRvbmVDdXJ2ZVBhcmFtZXRyaWNUeXBlKEN1cnZlc1swXSkgPT0gNSAmJgotICAgICAgICBjbXNHZXRUb25lQ3VydmVQYXJhbWV0cmljVHlwZShDdXJ2ZXNbMV0pID09IDUgJiYKLSAgICAgICAgY21zR2V0VG9uZUN1cnZlUGFyYW1ldHJpY1R5cGUoQ3VydmVzWzJdKSA9PSA1KSB7Ci0KLSAgICAgICAgICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBjbXNWaWRlb0NhcmRHYW1tYUZvcm11bGFUeXBlKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgICAgICAvLyBTYXZlIHBhcmFtZXRlcnMKLSAgICAgICAgICAgIGZvciAoaT0wOyBpIDwgMzsgaSsrKSB7Ci0KLSAgICAgICAgICAgICAgICBfY21zVkNHVEdBTU1BIHY7Ci0KLSAgICAgICAgICAgICAgICB2LkdhbW1hID0gQ3VydmVzW2ldIC0+U2VnbWVudHNbMF0uUGFyYW1zWzBdOwotICAgICAgICAgICAgICAgIHYuTWluICAgPSBDdXJ2ZXNbaV0gLT5TZWdtZW50c1swXS5QYXJhbXNbNV07Ci0gICAgICAgICAgICAgICAgdi5NYXggICA9IHBvdyhDdXJ2ZXNbaV0gLT5TZWdtZW50c1swXS5QYXJhbXNbMV0sIHYuR2FtbWEpICsgdi5NaW47Ci0KLSAgICAgICAgICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgdi5HYW1tYSkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgICAgICAgICBpZiAoIV9jbXNXcml0ZTE1Rml4ZWQxNk51bWJlcihpbywgdi5NaW4pKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICAgICAgaWYgKCFfY21zV3JpdGUxNUZpeGVkMTZOdW1iZXIoaW8sIHYuTWF4KSkgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgfQotICAgIH0KLQotICAgIGVsc2UgewotCi0gICAgICAgIC8vIEFsd2F5cyBzdG9yZSBhcyBhIHRhYmxlIG9mIDI1NiB3b3JkcwotICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgY21zVmlkZW9DYXJkR2FtbWFUYWJsZVR5cGUpKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghX2Ntc1dyaXRlVUludDE2TnVtYmVyKGlvLCAzKSkgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgMjU2KSkgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAoIV9jbXNXcml0ZVVJbnQxNk51bWJlcihpbywgMikpIHJldHVybiBGQUxTRTsKLQotICAgICAgICBmb3IgKGk9MDsgaSA8IDM7IGkrKykgewotICAgICAgICAgICAgZm9yIChqPTA7IGogPCAyNTY7IGorKykgewotCi0gICAgICAgICAgICAgICAgY21zRmxvYXQzMk51bWJlciB2ID0gY21zRXZhbFRvbmVDdXJ2ZUZsb2F0KEN1cnZlc1tpXSwgKGNtc0Zsb2F0MzJOdW1iZXIpIChqIC8gMjU1LjApKTsKLSAgICAgICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIgIG4gPSBfY21zUXVpY2tTYXR1cmF0ZVdvcmQodiAqIDY1NTM1LjApOwotCi0gICAgICAgICAgICAgICAgaWYgKCFfY21zV3JpdGVVSW50MTZOdW1iZXIoaW8sIG4pKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLQotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuSXRlbXMpOwotfQotCi1zdGF0aWMKLXZvaWQqIFR5cGVfdmNndF9EdXAoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjb25zdCB2b2lkICpQdHIsIGNtc1VJbnQzMk51bWJlciBuKQotewotICAgIGNtc1RvbmVDdXJ2ZSoqIE9sZEN1cnZlcyA9ICAoY21zVG9uZUN1cnZlKiopIFB0cjsKLSAgICBjbXNUb25lQ3VydmUqKiBOZXdDdXJ2ZXM7Ci0KLSAgICBOZXdDdXJ2ZXMgPSAoIGNtc1RvbmVDdXJ2ZSoqKSBfY21zQ2FsbG9jKHNlbGYgLT5Db250ZXh0SUQsIDMsIHNpemVvZihjbXNUb25lQ3VydmUqKSk7Ci0gICAgaWYgKE5ld0N1cnZlcyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIE5ld0N1cnZlc1swXSA9IGNtc0R1cFRvbmVDdXJ2ZShPbGRDdXJ2ZXNbMF0pOwotICAgIE5ld0N1cnZlc1sxXSA9IGNtc0R1cFRvbmVDdXJ2ZShPbGRDdXJ2ZXNbMV0pOwotICAgIE5ld0N1cnZlc1syXSA9IGNtc0R1cFRvbmVDdXJ2ZShPbGRDdXJ2ZXNbMl0pOwotCi0gICAgcmV0dXJuICh2b2lkKikgTmV3Q3VydmVzOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKLX0KLQotCi1zdGF0aWMKLXZvaWQgVHlwZV92Y2d0X0ZyZWUoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCB2b2lkKiBQdHIpCi17Ci0gICAgY21zRnJlZVRvbmVDdXJ2ZVRyaXBsZSgoY21zVG9uZUN1cnZlKiopIFB0cik7Ci0gICAgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgUHRyKTsKLX0KLQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gVHlwZSBjbXNTaWdEaWN0VHlwZQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotLy8gU2luZ2xlIGNvbHVtbiBvZiB0aGUgdGFibGUgY2FuIHBvaW50IHRvIHdjaGFyIG9yIE1MVUMgZWxlbWVudHMuIEhvbGRzIGFycmF5cyBvZiBkYXRhCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgY21zQ29udGV4dCBDb250ZXh0SUQ7Ci0gICAgY21zVUludDMyTnVtYmVyICpPZmZzZXRzOwotICAgIGNtc1VJbnQzMk51bWJlciAqU2l6ZXM7Ci19IF9jbXNESUNlbGVtOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgX2Ntc0RJQ2VsZW0gTmFtZSwgVmFsdWUsIERpc3BsYXlOYW1lLCBEaXNwbGF5VmFsdWU7Ci0KLX0gX2Ntc0RJQ2FycmF5OwotCi0vLyBBbGxvY2F0ZSBhbiBlbXB0eSBhcnJheSBlbGVtZW50Ci1zdGF0aWMKLWNtc0Jvb2wgQWxsb2NFbGVtKGNtc0NvbnRleHQgQ29udGV4dElELCBfY21zRElDZWxlbSogZSwgIGNtc1VJbnQzMk51bWJlciBDb3VudCkKLXsKLSAgICBlLT5PZmZzZXRzID0gKGNtc1VJbnQzMk51bWJlciAqKSBfY21zQ2FsbG9jKENvbnRleHRJRCwgQ291bnQsIHNpemVvZihjbXNVSW50MzJOdW1iZXIpKTsKLSAgICBpZiAoZS0+T2Zmc2V0cyA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0KLSAgICBlLT5TaXplcyA9IChjbXNVSW50MzJOdW1iZXIgKikgX2Ntc0NhbGxvYyhDb250ZXh0SUQsIENvdW50LCBzaXplb2YoY21zVUludDMyTnVtYmVyKSk7Ci0gICAgaWYgKGUtPlNpemVzID09IE5VTEwpIHsKLQotICAgICAgICBfY21zRnJlZShDb250ZXh0SUQsIGUgLT4gT2Zmc2V0cyk7Ci0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICBlIC0+Q29udGV4dElEID0gQ29udGV4dElEOwotICAgIHJldHVybiBUUlVFOwotfQotCi0vLyBGcmVlIGFuIGFycmF5IGVsZW1lbnQKLXN0YXRpYwotdm9pZCBGcmVlRWxlbShfY21zRElDZWxlbSogZSkKLXsKLSAgICBpZiAoZSAtPk9mZnNldHMgIT0gTlVMTCkgIF9jbXNGcmVlKGUgLT4gQ29udGV4dElELCBlIC0+IE9mZnNldHMpOwotICAgIGlmIChlIC0+U2l6ZXMgICAhPSBOVUxMKSAgX2Ntc0ZyZWUoZSAtPiBDb250ZXh0SUQsIGUgLT4gU2l6ZXMpOwotICAgIGUtPk9mZnNldHMgPSBlIC0+U2l6ZXMgPSBOVUxMOwotfQotCi0vLyBHZXQgcmlkIG9mIHdob2xlIGFycmF5Ci1zdGF0aWMKLXZvaWQgRnJlZUFycmF5KCBfY21zRElDYXJyYXkqIGEpCi17Ci0gICAgaWYgKGEgLT5OYW1lLk9mZnNldHMgIT0gTlVMTCkgRnJlZUVsZW0oJmEtPk5hbWUpOwotICAgIGlmIChhIC0+VmFsdWUuT2Zmc2V0cyAhPSBOVUxMKSBGcmVlRWxlbSgmYSAtPlZhbHVlKTsKLSAgICBpZiAoYSAtPkRpc3BsYXlOYW1lLk9mZnNldHMgIT0gTlVMTCkgRnJlZUVsZW0oJmEtPkRpc3BsYXlOYW1lKTsKLSAgICBpZiAoYSAtPkRpc3BsYXlWYWx1ZS5PZmZzZXRzICE9IE5VTEwpIEZyZWVFbGVtKCZhIC0+RGlzcGxheVZhbHVlKTsKLX0KLQotCi0vLyBBbGxvY2F0ZSB3aG9sZSBhcnJheQotc3RhdGljCi1jbXNCb29sIEFsbG9jQXJyYXkoY21zQ29udGV4dCBDb250ZXh0SUQsIF9jbXNESUNhcnJheSogYSwgY21zVUludDMyTnVtYmVyIENvdW50LCBjbXNVSW50MzJOdW1iZXIgTGVuZ3RoKQotewotICAgIC8vIEVtcHR5IHZhbHVlcwotICAgIG1lbXNldChhLCAwLCBzaXplb2YoX2Ntc0RJQ2FycmF5KSk7Ci0KLSAgICAvLyBPbiBkZXBlbmRpbmcgb24gcmVjb3JkIHNpemUsIGNyZWF0ZSBjb2x1bW4gYXJyYXlzCi0gICAgaWYgKCFBbGxvY0VsZW0oQ29udGV4dElELCAmYSAtPk5hbWUsIENvdW50KSkgZ290byBFcnJvcjsKLSAgICBpZiAoIUFsbG9jRWxlbShDb250ZXh0SUQsICZhIC0+VmFsdWUsIENvdW50KSkgZ290byBFcnJvcjsKLQotICAgIGlmIChMZW5ndGggPiAxNikgewotICAgICAgICBpZiAoIUFsbG9jRWxlbShDb250ZXh0SUQsICZhIC0+IERpc3BsYXlOYW1lLCBDb3VudCkpIGdvdG8gRXJyb3I7Ci0KLSAgICB9Ci0gICAgaWYgKExlbmd0aCA+IDI0KSB7Ci0gICAgICAgIGlmICghQWxsb2NFbGVtKENvbnRleHRJRCwgJmEgLT5EaXNwbGF5VmFsdWUsIENvdW50KSkgZ290byBFcnJvcjsKLSAgICB9Ci0gICAgcmV0dXJuIFRSVUU7Ci0KLUVycm9yOgotICAgIEZyZWVBcnJheShhKTsKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLS8vIFJlYWQgb25lIGVsZW1lbnQKLXN0YXRpYwotY21zQm9vbCBSZWFkT25lRWxlbShjbXNJT0hBTkRMRVIqIGlvLCAgX2Ntc0RJQ2VsZW0qIGUsIGNtc1VJbnQzMk51bWJlciBpLCBjbXNVSW50MzJOdW1iZXIgQmFzZU9mZnNldCkKLXsKLSAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmZS0+T2Zmc2V0c1tpXSkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmZSAtPlNpemVzW2ldKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgLy8gQW4gb2Zmc2V0IG9mIHplcm8gaGFzIHNwZWNpYWwgbWVhbmluZyBhbmQgc2hhbCBiZSBwcmVzZXJ2ZWQKLSAgICBpZiAoZSAtPk9mZnNldHNbaV0gPiAwKQotICAgICAgICBlIC0+T2Zmc2V0c1tpXSArPSBCYXNlT2Zmc2V0OwotICAgIHJldHVybiBUUlVFOwotfQotCi0KLXN0YXRpYwotY21zQm9vbCBSZWFkT2Zmc2V0QXJyYXkoY21zSU9IQU5ETEVSKiBpbywgIF9jbXNESUNhcnJheSogYSwgY21zVUludDMyTnVtYmVyIENvdW50LCBjbXNVSW50MzJOdW1iZXIgTGVuZ3RoLCBjbXNVSW50MzJOdW1iZXIgQmFzZU9mZnNldCkKLXsKLSAgICBjbXNVSW50MzJOdW1iZXIgaTsKLQotICAgIC8vIFJlYWQgY29sdW1uIGFycmF5cwotICAgIGZvciAoaT0wOyBpIDwgQ291bnQ7IGkrKykgewotCi0gICAgICAgIGlmICghUmVhZE9uZUVsZW0oaW8sICZhIC0+IE5hbWUsIGksIEJhc2VPZmZzZXQpKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghUmVhZE9uZUVsZW0oaW8sICZhIC0+IFZhbHVlLCBpLCBCYXNlT2Zmc2V0KSkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIGlmIChMZW5ndGggPiAxNikgewotCi0gICAgICAgICAgICBpZiAoIVJlYWRPbmVFbGVtKGlvLCAmYSAtPkRpc3BsYXlOYW1lLCBpLCBCYXNlT2Zmc2V0KSkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoTGVuZ3RoID4gMjQpIHsKLQotICAgICAgICAgICAgaWYgKCFSZWFkT25lRWxlbShpbywgJiBhIC0+IERpc3BsYXlWYWx1ZSwgaSwgQmFzZU9mZnNldCkpIHJldHVybiBGQUxTRTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0vLyBXcml0ZSBvbmUgZWxlbWVudAotc3RhdGljCi1jbXNCb29sIFdyaXRlT25lRWxlbShjbXNJT0hBTkRMRVIqIGlvLCAgX2Ntc0RJQ2VsZW0qIGUsIGNtc1VJbnQzMk51bWJlciBpKQotewotICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBlLT5PZmZzZXRzW2ldKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBlIC0+U2l6ZXNbaV0pKSByZXR1cm4gRkFMU0U7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotc3RhdGljCi1jbXNCb29sIFdyaXRlT2Zmc2V0QXJyYXkoY21zSU9IQU5ETEVSKiBpbywgIF9jbXNESUNhcnJheSogYSwgY21zVUludDMyTnVtYmVyIENvdW50LCBjbXNVSW50MzJOdW1iZXIgTGVuZ3RoKQotewotICAgIGNtc1VJbnQzMk51bWJlciBpOwotCi0gICAgZm9yIChpPTA7IGkgPCBDb3VudDsgaSsrKSB7Ci0KLSAgICAgICAgaWYgKCFXcml0ZU9uZUVsZW0oaW8sICZhIC0+IE5hbWUsIGkpKSByZXR1cm4gRkFMU0U7Ci0gICAgICAgIGlmICghV3JpdGVPbmVFbGVtKGlvLCAmYSAtPiBWYWx1ZSwgaSkpICByZXR1cm4gRkFMU0U7Ci0KLSAgICAgICAgaWYgKExlbmd0aCA+IDE2KSB7Ci0KLSAgICAgICAgICAgIGlmICghV3JpdGVPbmVFbGVtKGlvLCAmYSAtPiBEaXNwbGF5TmFtZSwgaSkpICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoTGVuZ3RoID4gMjQpIHsKLQotICAgICAgICAgICAgaWYgKCFXcml0ZU9uZUVsZW0oaW8sICZhIC0+IERpc3BsYXlWYWx1ZSwgaSkpICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotc3RhdGljCi1jbXNCb29sIFJlYWRPbmVXQ2hhcihjbXNJT0hBTkRMRVIqIGlvLCAgX2Ntc0RJQ2VsZW0qIGUsIGNtc1VJbnQzMk51bWJlciBpLCB3Y2hhcl90ICoqIHdjc3RyKQotewotCi0gICAgY21zVUludDMyTnVtYmVyIG5DaGFyczsKLQotICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciB1bmRlZmluZWQgc3RyaW5ncyAoc2VlIElDQyBWb3RhYmxlCi0gICAgICAvLyBQcm9wb3NhbCBTdWJtaXNzaW9uLCBEaWN0aW9uYXJ5IFR5cGUgYW5kIE1ldGFkYXRhIFRBRyBEZWZpbml0aW9uKQotICAgICAgaWYgKGUgLT4gT2Zmc2V0c1tpXSA9PSAwKSB7Ci0KLSAgICAgICAgICAqd2NzdHIgPSBOVUxMOwotICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgfQotCi0gICAgICBpZiAoIWlvIC0+IFNlZWsoaW8sIGUgLT4gT2Zmc2V0c1tpXSkpIHJldHVybiBGQUxTRTsKLQotICAgICAgbkNoYXJzID0gZSAtPlNpemVzW2ldIC8gc2l6ZW9mKGNtc1VJbnQxNk51bWJlcik7Ci0KLQotICAgICAgKndjc3RyID0gKHdjaGFyX3QqKSBfY21zTWFsbG9jWmVybyhlIC0+Q29udGV4dElELCAobkNoYXJzICsgMSkgKiBzaXplb2Yod2NoYXJfdCkpOwotICAgICAgaWYgKCp3Y3N0ciA9PSBOVUxMKSByZXR1cm4gRkFMU0U7Ci0KLSAgICAgIGlmICghX2Ntc1JlYWRXQ2hhckFycmF5KGlvLCBuQ2hhcnMsICp3Y3N0cikpIHsKLSAgICAgICAgICBfY21zRnJlZShlIC0+Q29udGV4dElELCAqd2NzdHIpOwotICAgICAgICAgIHJldHVybiBGQUxTRTsKLSAgICAgIH0KLQotICAgICAgLy8gRW5kIG9mIHN0cmluZyBtYXJrZXIKLSAgICAgICgqd2NzdHIpW25DaGFyc10gPSAwOwotICAgICAgcmV0dXJuIFRSVUU7Ci19Ci0KLXN0YXRpYwotY21zVUludDMyTnVtYmVyIG15d2NzbGVuKGNvbnN0IHdjaGFyX3QgKnMpCi17Ci0gICAgY29uc3Qgd2NoYXJfdCAqcDsKLQotICAgIHAgPSBzOwotICAgIHdoaWxlICgqcCkKLSAgICAgICAgcCsrOwotCi0gICAgcmV0dXJuIChjbXNVSW50MzJOdW1iZXIpKHAgLSBzKTsKLX0KLQotc3RhdGljCi1jbXNCb29sIFdyaXRlT25lV0NoYXIoY21zSU9IQU5ETEVSKiBpbywgIF9jbXNESUNlbGVtKiBlLCBjbXNVSW50MzJOdW1iZXIgaSwgY29uc3Qgd2NoYXJfdCAqIHdjc3RyLCBjbXNVSW50MzJOdW1iZXIgQmFzZU9mZnNldCkKLXsKLSAgICBjbXNVSW50MzJOdW1iZXIgQmVmb3JlID0gaW8gLT5UZWxsKGlvKTsKLSAgICBjbXNVSW50MzJOdW1iZXIgbjsKLQotICAgIGUgLT5PZmZzZXRzW2ldID0gQmVmb3JlIC0gQmFzZU9mZnNldDsKLQotICAgIGlmICh3Y3N0ciA9PSBOVUxMKSB7Ci0gICAgICAgIGUgLT5TaXplc1tpXSA9IDA7Ci0gICAgICAgIGUgLT5PZmZzZXRzW2ldID0gMDsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgbiA9IG15d2NzbGVuKHdjc3RyKTsKLSAgICBpZiAoIV9jbXNXcml0ZVdDaGFyQXJyYXkoaW8sICBuLCB3Y3N0cikpIHJldHVybiBGQUxTRTsKLQotICAgIGUgLT5TaXplc1tpXSA9IGlvIC0+VGVsbChpbykgLSBCZWZvcmU7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLXN0YXRpYwotY21zQm9vbCBSZWFkT25lTUxVQyhzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sICBfY21zRElDZWxlbSogZSwgY21zVUludDMyTnVtYmVyIGksIGNtc01MVSoqIG1sdSkKLXsKLSAgICBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zID0gMDsKLQotICAgIC8vIEEgd2F5IHRvIGdldCBudWxsIE1MVUNzCi0gICAgaWYgKGUgLT4gT2Zmc2V0c1tpXSA9PSAwIHx8IGUgLT5TaXplc1tpXSA9PSAwKSB7Ci0KLSAgICAgICAgKm1sdSA9IE5VTEw7Ci0gICAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLQotICAgIGlmICghaW8gLT4gU2VlayhpbywgZSAtPiBPZmZzZXRzW2ldKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgKm1sdSA9IChjbXNNTFUqKSBUeXBlX01MVV9SZWFkKHNlbGYsIGlvLCAmbkl0ZW1zLCBlIC0+U2l6ZXNbaV0pOwotICAgIHJldHVybiAqbWx1ICE9IE5VTEw7Ci19Ci0KLXN0YXRpYwotY21zQm9vbCBXcml0ZU9uZU1MVUMoc3RydWN0IF9jbXNfdHlwZWhhbmRsZXJfc3RydWN0KiBzZWxmLCBjbXNJT0hBTkRMRVIqIGlvLCAgX2Ntc0RJQ2VsZW0qIGUsIGNtc1VJbnQzMk51bWJlciBpLCBjb25zdCBjbXNNTFUqIG1sdSwgY21zVUludDMyTnVtYmVyIEJhc2VPZmZzZXQpCi17Ci0gICAgY21zVUludDMyTnVtYmVyIEJlZm9yZTsKLQotICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHVuZGVmaW5lZCBzdHJpbmdzIChzZWUgSUNDIFZvdGFibGUKLSAgICAgLy8gUHJvcG9zYWwgU3VibWlzc2lvbiwgRGljdGlvbmFyeSBUeXBlIGFuZCBNZXRhZGF0YSBUQUcgRGVmaW5pdGlvbikKLSAgICAgaWYgKG1sdSA9PSBOVUxMKSB7Ci0gICAgICAgIGUgLT5TaXplc1tpXSA9IDA7Ci0gICAgICAgIGUgLT5PZmZzZXRzW2ldID0gMDsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgQmVmb3JlID0gaW8gLT5UZWxsKGlvKTsKLSAgICBlIC0+T2Zmc2V0c1tpXSA9IEJlZm9yZSAtIEJhc2VPZmZzZXQ7Ci0KLSAgICBpZiAoIVR5cGVfTUxVX1dyaXRlKHNlbGYsIGlvLCAodm9pZCopIG1sdSwgMSkpIHJldHVybiBGQUxTRTsKLQotICAgIGUgLT5TaXplc1tpXSA9IGlvIC0+VGVsbChpbykgLSBCZWZvcmU7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotc3RhdGljCi12b2lkICpUeXBlX0RpY3Rpb25hcnlfUmVhZChzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIGNtc0lPSEFORExFUiogaW8sIGNtc1VJbnQzMk51bWJlciogbkl0ZW1zLCBjbXNVSW50MzJOdW1iZXIgU2l6ZU9mVGFnKQotewotICAgY21zSEFORExFIGhEaWN0OwotICAgY21zVUludDMyTnVtYmVyIGksIENvdW50LCBMZW5ndGg7Ci0gICBjbXNVSW50MzJOdW1iZXIgQmFzZU9mZnNldDsKLSAgIF9jbXNESUNhcnJheSBhOwotICAgd2NoYXJfdCAqTmFtZVdDUyA9IE5VTEwsICpWYWx1ZVdDUyA9IE5VTEw7Ci0gICBjbXNNTFUgKkRpc3BsYXlOYW1lTUxVID0gTlVMTCwgKkRpc3BsYXlWYWx1ZU1MVT1OVUxMOwotICAgY21zQm9vbCByYzsKLQotICAgICpuSXRlbXMgPSAwOwotCi0gICAgLy8gR2V0IGFjdHVhbCBwb3NpdGlvbiBhcyBhIGJhc2lzIGZvciBlbGVtZW50IG9mZnNldHMKLSAgICBCYXNlT2Zmc2V0ID0gaW8gLT5UZWxsKGlvKSAtIHNpemVvZihfY21zVGFnQmFzZSk7Ci0KLSAgICAvLyBHZXQgbmFtZS12YWx1ZSByZWNvcmQgY291bnQKLSAgICBpZiAoIV9jbXNSZWFkVUludDMyTnVtYmVyKGlvLCAmQ291bnQpKSByZXR1cm4gTlVMTDsKLSAgICBTaXplT2ZUYWcgLT0gc2l6ZW9mKGNtc1VJbnQzMk51bWJlcik7Ci0KLSAgICAvLyBHZXQgcmVjIGxlbmd0aAotICAgIGlmICghX2Ntc1JlYWRVSW50MzJOdW1iZXIoaW8sICZMZW5ndGgpKSByZXR1cm4gTlVMTDsKLSAgICBTaXplT2ZUYWcgLT0gc2l6ZW9mKGNtc1VJbnQzMk51bWJlcik7Ci0KLSAgICAvLyBDaGVjayBmb3IgdmFsaWQgbGVuZ3RocwotICAgIGlmIChMZW5ndGggIT0gMTYgJiYgTGVuZ3RoICE9IDI0ICYmIExlbmd0aCAhPSAzMikgewotICAgICAgICAgY21zU2lnbmFsRXJyb3Ioc2VsZi0+Q29udGV4dElELCBjbXNFUlJPUl9VTktOT1dOX0VYVEVOU0lPTiwgIlVua25vd24gcmVjb3JkIGxlbmd0aCBpbiBkaWN0aW9uYXJ5ICclZCciLCBMZW5ndGgpOwotICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlcyBhbiBlbXB0eSBkaWN0aW9uYXJ5Ci0gICAgaERpY3QgPSBjbXNEaWN0QWxsb2Moc2VsZiAtPiBDb250ZXh0SUQpOwotICAgIGlmIChoRGljdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgIC8vIE9uIGRlcGVuZGluZyBvbiByZWNvcmQgc2l6ZSwgY3JlYXRlIGNvbHVtbiBhcnJheXMKLSAgICBpZiAoIUFsbG9jQXJyYXkoc2VsZiAtPiBDb250ZXh0SUQsICZhLCBDb3VudCwgTGVuZ3RoKSkgZ290byBFcnJvcjsKLQotICAgIC8vIFJlYWQgY29sdW1uIGFycmF5cwotICAgIGlmICghUmVhZE9mZnNldEFycmF5KGlvLCAmYSwgQ291bnQsIExlbmd0aCwgQmFzZU9mZnNldCkpIGdvdG8gRXJyb3I7Ci0KLSAgICAvLyBTZWVrIHRvIGVhY2ggZWxlbWVudCBhbmQgcmVhZCBpdAotICAgIGZvciAoaT0wOyBpIDwgQ291bnQ7IGkrKykgewotCi0gICAgICAgIGlmICghUmVhZE9uZVdDaGFyKGlvLCAmYS5OYW1lLCBpLCAmTmFtZVdDUykpIGdvdG8gRXJyb3I7Ci0gICAgICAgIGlmICghUmVhZE9uZVdDaGFyKGlvLCAmYS5WYWx1ZSwgaSwgJlZhbHVlV0NTKSkgZ290byBFcnJvcjsKLQotICAgICAgICBpZiAoTGVuZ3RoID4gMTYpIHsKLSAgICAgICAgICAgIGlmICghUmVhZE9uZU1MVUMoc2VsZiwgaW8sICZhLkRpc3BsYXlOYW1lLCBpLCAmRGlzcGxheU5hbWVNTFUpKSBnb3RvIEVycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKExlbmd0aCA+IDI0KSB7Ci0gICAgICAgICAgICBpZiAoIVJlYWRPbmVNTFVDKHNlbGYsIGlvLCAmYS5EaXNwbGF5VmFsdWUsIGksICZEaXNwbGF5VmFsdWVNTFUpKSBnb3RvIEVycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKE5hbWVXQ1MgPT0gTlVMTCB8fCBWYWx1ZVdDUyA9PSBOVUxMKSB7Ci0gICAgICAgIAotICAgICAgICAgICAgY21zU2lnbmFsRXJyb3Ioc2VsZi0+Q29udGV4dElELCBjbXNFUlJPUl9DT1JSVVBUSU9OX0RFVEVDVEVELCAiQmFkIGRpY3Rpb25hcnkgTmFtZS9WYWx1ZSIpOyAgICAgICAgCi0gICAgICAgICAgICByYyA9IEZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotCi0gICAgICAgICAgICByYyA9IGNtc0RpY3RBZGRFbnRyeShoRGljdCwgTmFtZVdDUywgVmFsdWVXQ1MsIERpc3BsYXlOYW1lTUxVLCBEaXNwbGF5VmFsdWVNTFUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKE5hbWVXQ1MgIT0gTlVMTCkgX2Ntc0ZyZWUoc2VsZiAtPkNvbnRleHRJRCwgTmFtZVdDUyk7Ci0gICAgICAgIGlmIChWYWx1ZVdDUyAhPSBOVUxMKSBfY21zRnJlZShzZWxmIC0+Q29udGV4dElELCBWYWx1ZVdDUyk7Ci0gICAgICAgIGlmIChEaXNwbGF5TmFtZU1MVSAhPSBOVUxMKSBjbXNNTFVmcmVlKERpc3BsYXlOYW1lTUxVKTsKLSAgICAgICAgaWYgKERpc3BsYXlWYWx1ZU1MVSAhPSBOVUxMKSBjbXNNTFVmcmVlKERpc3BsYXlWYWx1ZU1MVSk7Ci0KLSAgICAgICAgaWYgKCFyYykgZ290byBFcnJvcjsKLSAgICB9Ci0KLSAgIEZyZWVBcnJheSgmYSk7Ci0gICAqbkl0ZW1zID0gMTsKLSAgIHJldHVybiAodm9pZCopIGhEaWN0OwotCi1FcnJvcjoKLSAgIEZyZWVBcnJheSgmYSk7Ci0gICBjbXNEaWN0RnJlZShoRGljdCk7Ci0gICByZXR1cm4gTlVMTDsKLX0KLQotCi1zdGF0aWMKLWNtc0Jvb2wgVHlwZV9EaWN0aW9uYXJ5X1dyaXRlKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY21zSU9IQU5ETEVSKiBpbywgdm9pZCogUHRyLCBjbXNVSW50MzJOdW1iZXIgbkl0ZW1zKQotewotICAgIGNtc0hBTkRMRSBoRGljdCA9IChjbXNIQU5ETEUpIFB0cjsKLSAgICBjb25zdCBjbXNESUNUZW50cnkqIHA7Ci0gICAgY21zQm9vbCBBbnlOYW1lLCBBbnlWYWx1ZTsKLSAgICBjbXNVSW50MzJOdW1iZXIgaSwgQ291bnQsIExlbmd0aDsKLSAgICBjbXNVSW50MzJOdW1iZXIgRGlyZWN0b3J5UG9zLCBDdXJyZW50UG9zLCBCYXNlT2Zmc2V0OwotICAgX2Ntc0RJQ2FycmF5IGE7Ci0KLSAgICBpZiAoaERpY3QgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0gICAgQmFzZU9mZnNldCA9IGlvIC0+VGVsbChpbykgLSBzaXplb2YoX2Ntc1RhZ0Jhc2UpOwotCi0gICAgLy8gTGV0J3MgaW5zcGVjdCB0aGUgZGljdGlvbmFyeQotICAgIENvdW50ID0gMDsgQW55TmFtZSA9IEZBTFNFOyBBbnlWYWx1ZSA9IEZBTFNFOwotICAgIGZvciAocCA9IGNtc0RpY3RHZXRFbnRyeUxpc3QoaERpY3QpOyBwICE9IE5VTEw7IHAgPSBjbXNEaWN0TmV4dEVudHJ5KHApKSB7Ci0KLSAgICAgICAgaWYgKHAgLT5EaXNwbGF5TmFtZSAhPSBOVUxMKSBBbnlOYW1lID0gVFJVRTsKLSAgICAgICAgaWYgKHAgLT5EaXNwbGF5VmFsdWUgIT0gTlVMTCkgQW55VmFsdWUgPSBUUlVFOwotICAgICAgICBDb3VudCsrOwotICAgIH0KLQotICAgIExlbmd0aCA9IDE2OwotICAgIGlmIChBbnlOYW1lKSAgTGVuZ3RoICs9IDg7Ci0gICAgaWYgKEFueVZhbHVlKSBMZW5ndGggKz0gODsKLQotICAgIGlmICghX2Ntc1dyaXRlVUludDMyTnVtYmVyKGlvLCBDb3VudCkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoIV9jbXNXcml0ZVVJbnQzMk51bWJlcihpbywgTGVuZ3RoKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgLy8gS2VlcCBzdGFydGluZyBwb3NpdGlvbiBvZiBvZmZzZXRzIHRhYmxlCi0gICAgRGlyZWN0b3J5UG9zID0gaW8gLT5UZWxsKGlvKTsKLQotICAgIC8vIEFsbG9jYXRlIG9mZnNldHMgYXJyYXkKLSAgICBpZiAoIUFsbG9jQXJyYXkoc2VsZiAtPkNvbnRleHRJRCwgJmEsIENvdW50LCBMZW5ndGgpKSBnb3RvIEVycm9yOwotCi0gICAgLy8gV3JpdGUgYSBmYWtlIGRpcmVjdG9yeSB0byBiZSBmaWxsZWQgbGF0dGVyIG9uCi0gICAgaWYgKCFXcml0ZU9mZnNldEFycmF5KGlvLCAmYSwgQ291bnQsIExlbmd0aCkpIGdvdG8gRXJyb3I7Ci0KLSAgICAvLyBXcml0ZSBlYWNoIGVsZW1lbnQuIEtlZXAgdHJhY2sgb2YgdGhlIHNpemUgYXMgd2VsbC4KLSAgICBwID0gY21zRGljdEdldEVudHJ5TGlzdChoRGljdCk7Ci0gICAgZm9yIChpPTA7IGkgPCBDb3VudDsgaSsrKSB7Ci0KLSAgICAgICAgaWYgKCFXcml0ZU9uZVdDaGFyKGlvLCAmYS5OYW1lLCBpLCAgcCAtPk5hbWUsIEJhc2VPZmZzZXQpKSBnb3RvIEVycm9yOwotICAgICAgICBpZiAoIVdyaXRlT25lV0NoYXIoaW8sICZhLlZhbHVlLCBpLCBwIC0+VmFsdWUsIEJhc2VPZmZzZXQpKSBnb3RvIEVycm9yOwotCi0gICAgICAgIGlmIChwIC0+RGlzcGxheU5hbWUgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKCFXcml0ZU9uZU1MVUMoc2VsZiwgaW8sICZhLkRpc3BsYXlOYW1lLCBpLCBwIC0+RGlzcGxheU5hbWUsIEJhc2VPZmZzZXQpKSBnb3RvIEVycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHAgLT5EaXNwbGF5VmFsdWUgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKCFXcml0ZU9uZU1MVUMoc2VsZiwgaW8sICZhLkRpc3BsYXlWYWx1ZSwgaSwgcCAtPkRpc3BsYXlWYWx1ZSwgQmFzZU9mZnNldCkpIGdvdG8gRXJyb3I7Ci0gICAgICAgIH0KLQotICAgICAgIHAgPSBjbXNEaWN0TmV4dEVudHJ5KHApOwotICAgIH0KLQotICAgIC8vIFdyaXRlIHRoZSBkaXJlY3RvcnkKLSAgICBDdXJyZW50UG9zID0gaW8gLT5UZWxsKGlvKTsKLSAgICBpZiAoIWlvIC0+U2VlayhpbywgRGlyZWN0b3J5UG9zKSkgZ290byBFcnJvcjsKLQotICAgIGlmICghV3JpdGVPZmZzZXRBcnJheShpbywgJmEsIENvdW50LCBMZW5ndGgpKSBnb3RvIEVycm9yOwotCi0gICAgaWYgKCFpbyAtPlNlZWsoaW8sIEN1cnJlbnRQb3MpKSBnb3RvIEVycm9yOwotCi0gICAgRnJlZUFycmF5KCZhKTsKLSAgICByZXR1cm4gVFJVRTsKLQotRXJyb3I6Ci0gICAgRnJlZUFycmF5KCZhKTsKLSAgICByZXR1cm4gRkFMU0U7Ci0KLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG5JdGVtcyk7Ci19Ci0KLQotc3RhdGljCi12b2lkKiBUeXBlX0RpY3Rpb25hcnlfRHVwKHN0cnVjdCBfY21zX3R5cGVoYW5kbGVyX3N0cnVjdCogc2VsZiwgY29uc3Qgdm9pZCAqUHRyLCBjbXNVSW50MzJOdW1iZXIgbikKLXsKLSAgICByZXR1cm4gKHZvaWQqKSAgY21zRGljdER1cCgoY21zSEFORExFKSBQdHIpOwotCi0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihuKTsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKHNlbGYpOwotfQotCi0KLXN0YXRpYwotdm9pZCBUeXBlX0RpY3Rpb25hcnlfRnJlZShzdHJ1Y3QgX2Ntc190eXBlaGFuZGxlcl9zdHJ1Y3QqIHNlbGYsIHZvaWQqIFB0cikKLXsKLSAgICBjbXNEaWN0RnJlZSgoY21zSEFORExFKSBQdHIpOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIoc2VsZik7Ci19Ci0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIFR5cGUgc3VwcG9ydCBtYWluIHJvdXRpbmVzCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCi0KLS8vIFRoaXMgaXMgdGhlIGxpc3Qgb2YgYnVpbHQtaW4gdHlwZXMKLXN0YXRpYyBfY21zVGFnVHlwZUxpbmtlZExpc3QgU3VwcG9ydGVkVGFnVHlwZXNbXSA9IHsKLQote1RZUEVfSEFORExFUihjbXNTaWdDaHJvbWF0aWNpdHlUeXBlLCAgICAgICAgICBDaHJvbWF0aWNpdHkpLCAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzFdIH0sCi17VFlQRV9IQU5ETEVSKGNtc1NpZ0NvbG9yYW50T3JkZXJUeXBlLCAgICAgICAgIENvbG9yYW50T3JkZXJUeXBlKSwgICAmU3VwcG9ydGVkVGFnVHlwZXNbMl0gfSwKLXtUWVBFX0hBTkRMRVIoY21zU2lnUzE1Rml4ZWQxNkFycmF5VHlwZSwgICAgICAgUzE1Rml4ZWQxNiksICAgICAgICAgICZTdXBwb3J0ZWRUYWdUeXBlc1szXSB9LAote1RZUEVfSEFORExFUihjbXNTaWdVMTZGaXhlZDE2QXJyYXlUeXBlLCAgICAgICBVMTZGaXhlZDE2KSwgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzRdIH0sCi17VFlQRV9IQU5ETEVSKGNtc1NpZ1RleHRUeXBlLCAgICAgICAgICAgICAgICAgIFRleHQpLCAgICAgICAgICAgICAgICAmU3VwcG9ydGVkVGFnVHlwZXNbNV0gfSwKLXtUWVBFX0hBTkRMRVIoY21zU2lnVGV4dERlc2NyaXB0aW9uVHlwZSwgICAgICAgVGV4dF9EZXNjcmlwdGlvbiksICAgICZTdXBwb3J0ZWRUYWdUeXBlc1s2XSB9LAote1RZUEVfSEFORExFUihjbXNTaWdDdXJ2ZVR5cGUsICAgICAgICAgICAgICAgICBDdXJ2ZSksICAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzddIH0sCi17VFlQRV9IQU5ETEVSKGNtc1NpZ1BhcmFtZXRyaWNDdXJ2ZVR5cGUsICAgICAgIFBhcmFtZXRyaWNDdXJ2ZSksICAgICAmU3VwcG9ydGVkVGFnVHlwZXNbOF0gfSwKLXtUWVBFX0hBTkRMRVIoY21zU2lnRGF0ZVRpbWVUeXBlLCAgICAgICAgICAgICAgRGF0ZVRpbWUpLCAgICAgICAgICAgICZTdXBwb3J0ZWRUYWdUeXBlc1s5XSB9LAote1RZUEVfSEFORExFUihjbXNTaWdMdXQ4VHlwZSwgICAgICAgICAgICAgICAgICBMVVQ4KSwgICAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzEwXSB9LAote1RZUEVfSEFORExFUihjbXNTaWdMdXQxNlR5cGUsICAgICAgICAgICAgICAgICBMVVQxNiksICAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzExXSB9LAote1RZUEVfSEFORExFUihjbXNTaWdDb2xvcmFudFRhYmxlVHlwZSwgICAgICAgICBDb2xvcmFudFRhYmxlKSwgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzEyXSB9LAote1RZUEVfSEFORExFUihjbXNTaWdOYW1lZENvbG9yMlR5cGUsICAgICAgICAgICBOYW1lZENvbG9yKSwgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzEzXSB9LAote1RZUEVfSEFORExFUihjbXNTaWdNdWx0aUxvY2FsaXplZFVuaWNvZGVUeXBlLCBNTFUpLCAgICAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzE0XSB9LAote1RZUEVfSEFORExFUihjbXNTaWdQcm9maWxlU2VxdWVuY2VEZXNjVHlwZSwgICBQcm9maWxlU2VxdWVuY2VEZXNjKSwgJlN1cHBvcnRlZFRhZ1R5cGVzWzE1XSB9LAote1RZUEVfSEFORExFUihjbXNTaWdTaWduYXR1cmVUeXBlLCAgICAgICAgICAgICBTaWduYXR1cmUpLCAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzE2XSB9LAote1RZUEVfSEFORExFUihjbXNTaWdNZWFzdXJlbWVudFR5cGUsICAgICAgICAgICBNZWFzdXJlbWVudCksICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzE3XSB9LAote1RZUEVfSEFORExFUihjbXNTaWdEYXRhVHlwZSwgICAgICAgICAgICAgICAgICBEYXRhKSwgICAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzE4XSB9LAote1RZUEVfSEFORExFUihjbXNTaWdMdXRBdG9CVHlwZSwgICAgICAgICAgICAgICBMVVRBMkIpLCAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzE5XSB9LAote1RZUEVfSEFORExFUihjbXNTaWdMdXRCdG9BVHlwZSwgICAgICAgICAgICAgICBMVVRCMkEpLCAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzIwXSB9LAote1RZUEVfSEFORExFUihjbXNTaWdVY3JCZ1R5cGUsICAgICAgICAgICAgICAgICBVY3JCZyksICAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzIxXSB9LAote1RZUEVfSEFORExFUihjbXNTaWdDcmRJbmZvVHlwZSwgICAgICAgICAgICAgICBDcmRJbmZvKSwgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzIyXSB9LAote1RZUEVfSEFORExFUihjbXNTaWdNdWx0aVByb2Nlc3NFbGVtZW50VHlwZSwgICBNUEUpLCAgICAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzIzXSB9LAote1RZUEVfSEFORExFUihjbXNTaWdTY3JlZW5pbmdUeXBlLCAgICAgICAgICAgICBTY3JlZW5pbmcpLCAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzI0XSB9LAote1RZUEVfSEFORExFUihjbXNTaWdWaWV3aW5nQ29uZGl0aW9uc1R5cGUsICAgICBWaWV3aW5nQ29uZGl0aW9ucyksICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzI1XSB9LAote1RZUEVfSEFORExFUihjbXNTaWdYWVpUeXBlLCAgICAgICAgICAgICAgICAgICBYWVopLCAgICAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzI2XSB9LAote1RZUEVfSEFORExFUihjbXNDb3JiaXNCcm9rZW5YWVp0eXBlLCAgICAgICAgICBYWVopLCAgICAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzI3XSB9LAote1RZUEVfSEFORExFUihjbXNNb25hY29Ccm9rZW5DdXJ2ZVR5cGUsICAgICAgICBDdXJ2ZSksICAgICAgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzI4XSB9LAote1RZUEVfSEFORExFUihjbXNTaWdQcm9maWxlU2VxdWVuY2VJZFR5cGUsICAgICBQcm9maWxlU2VxdWVuY2VJZCksICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzI5XSB9LAote1RZUEVfSEFORExFUihjbXNTaWdEaWN0VHlwZSwgICAgICAgICAgICAgICAgICBEaWN0aW9uYXJ5KSwgICAgICAgICAgJlN1cHBvcnRlZFRhZ1R5cGVzWzMwXSB9LAote1RZUEVfSEFORExFUihjbXNTaWdWY2d0VHlwZSwgICAgICAgICAgICAgICAgICB2Y2d0KSwgICAgICAgICAgICAgICAgTlVMTCB9Ci19OwotCi0KLV9jbXNUYWdUeXBlUGx1Z2luQ2h1bmtUeXBlIF9jbXNUYWdUeXBlUGx1Z2luQ2h1bmsgPSB7IE5VTEwgfTsKLQotCi0KLS8vIER1cGxpY2F0ZXMgdGhlIHpvbmUgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIHBsdWctaW4gaW4gdGhlIG5ldyBjb250ZXh0Ci1zdGF0aWMKLXZvaWQgRHVwVGFnVHlwZUxpc3Qoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjLCAKLSAgICAgICAgICAgICAgICAgICAgaW50IGxvYykKLXsKLSAgIF9jbXNUYWdUeXBlUGx1Z2luQ2h1bmtUeXBlIG5ld0hlYWQgPSB7IE5VTEwgfTsKLSAgIF9jbXNUYWdUeXBlTGlua2VkTGlzdCogIGVudHJ5OwotICAgX2Ntc1RhZ1R5cGVMaW5rZWRMaXN0KiAgQW50ZXJpb3IgPSBOVUxMOwotICAgX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUqIGhlYWQgPSAoX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUqKSBzcmMtPmNodW5rc1tsb2NdOwotCi0gICAvLyBXYWxrIHRoZSBsaXN0IGNvcHlpbmcgYWxsIG5vZGVzCi0gICBmb3IgKGVudHJ5ID0gaGVhZC0+VGFnVHlwZXM7Ci0gICAgICAgZW50cnkgIT0gTlVMTDsKLSAgICAgICBlbnRyeSA9IGVudHJ5IC0+TmV4dCkgewotCi0gICAgICAgICAgIF9jbXNUYWdUeXBlTGlua2VkTGlzdCAqbmV3RW50cnkgPSAoIF9jbXNUYWdUeXBlTGlua2VkTGlzdCAqKSBfY21zU3ViQWxsb2NEdXAoY3R4IC0+TWVtUG9vbCwgZW50cnksIHNpemVvZihfY21zVGFnVHlwZUxpbmtlZExpc3QpKTsKLQotICAgICAgICAgICBpZiAobmV3RW50cnkgPT0gTlVMTCkgCi0gICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgLy8gV2Ugd2FudCB0byBrZWVwIHRoZSBsaW5rZWQgbGlzdCBvcmRlciwgc28gdGhpcyBpcyBhIGxpdHRsZSBiaXQgdHJpY2t5Ci0gICAgICAgICAgIG5ld0VudHJ5IC0+IE5leHQgPSBOVUxMOwotICAgICAgICAgICBpZiAoQW50ZXJpb3IpCi0gICAgICAgICAgICAgICBBbnRlcmlvciAtPiBOZXh0ID0gbmV3RW50cnk7Ci0KLSAgICAgICAgICAgQW50ZXJpb3IgPSBuZXdFbnRyeTsKLQotICAgICAgICAgICBpZiAobmV3SGVhZC5UYWdUeXBlcyA9PSBOVUxMKQotICAgICAgICAgICAgICAgbmV3SGVhZC5UYWdUeXBlcyA9IG5ld0VudHJ5OwotICAgfQotCi0gICBjdHggLT5jaHVua3NbbG9jXSA9IF9jbXNTdWJBbGxvY0R1cChjdHgtPk1lbVBvb2wsICZuZXdIZWFkLCBzaXplb2YoX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUpKTsKLX0KLQotCi12b2lkIF9jbXNBbGxvY1RhZ1R5cGVQbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQotewotICAgIGlmIChzcmMgIT0gTlVMTCkgewotICAgICAgICAKLSAgICAgICAgLy8gRHVwbGljYXRlIHRoZSBMSVNUCi0gICAgICAgIER1cFRhZ1R5cGVMaXN0KGN0eCwgc3JjLCBUYWdUeXBlUGx1Z2luKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHN0YXRpYyBfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSBUYWdUeXBlUGx1Z2luQ2h1bmsgPSB7IE5VTEwgfTsKLSAgICAgICAgY3R4IC0+Y2h1bmtzW1RhZ1R5cGVQbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsICZUYWdUeXBlUGx1Z2luQ2h1bmssIHNpemVvZihfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSkpOwotICAgIH0KLX0KLQotdm9pZCBfY21zQWxsb2NNUEVUeXBlUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCi17Ci0gICAgaWYgKHNyYyAhPSBOVUxMKSB7Ci0gICAgICAgIAotICAgICAgICAvLyBEdXBsaWNhdGUgdGhlIExJU1QKLSAgICAgICAgRHVwVGFnVHlwZUxpc3QoY3R4LCBzcmMsIE1QRVBsdWdpbik7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBzdGF0aWMgX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUgVGFnVHlwZVBsdWdpbkNodW5rID0geyBOVUxMIH07Ci0gICAgICAgIGN0eCAtPmNodW5rc1tNUEVQbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsICZUYWdUeXBlUGx1Z2luQ2h1bmssIHNpemVvZihfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSkpOwotICAgIH0KLQotfQotCi0KLS8vIEJvdGgga2luZCBvZiBwbHVnLWlucyBzaGFyZSBzYW1lIHN0cnVjdHVyZQotY21zQm9vbCAgX2Ntc1JlZ2lzdGVyVGFnVHlwZVBsdWdpbihjbXNDb250ZXh0IGlkLCBjbXNQbHVnaW5CYXNlKiBEYXRhKQotewotICAgIHJldHVybiBSZWdpc3RlclR5cGVzUGx1Z2luKGlkLCBEYXRhLCBUYWdUeXBlUGx1Z2luKTsKLX0KLQotY21zQm9vbCAgX2Ntc1JlZ2lzdGVyTXVsdGlQcm9jZXNzRWxlbWVudFBsdWdpbihjbXNDb250ZXh0IGlkLCBjbXNQbHVnaW5CYXNlKiBEYXRhKQotewotICAgIHJldHVybiBSZWdpc3RlclR5cGVzUGx1Z2luKGlkLCBEYXRhLE1QRVBsdWdpbik7Ci19Ci0KLQotLy8gV3JhcHBlciBmb3IgdGFnIHR5cGVzCi1jbXNUYWdUeXBlSGFuZGxlciogX2Ntc0dldFRhZ1R5cGVIYW5kbGVyKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNUYWdUeXBlU2lnbmF0dXJlIHNpZykKLXsKLSAgICBfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSogY3R4ID0gKCBfY21zVGFnVHlwZVBsdWdpbkNodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsoQ29udGV4dElELCBUYWdUeXBlUGx1Z2luKTsKLQotICAgIHJldHVybiBHZXRIYW5kbGVyKHNpZywgY3R4LT5UYWdUeXBlcywgU3VwcG9ydGVkVGFnVHlwZXMpOwotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotLy8gVGFnIHN1cHBvcnQgbWFpbiByb3V0aW5lcwotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQotdHlwZWRlZiBzdHJ1Y3QgX2Ntc1RhZ0xpbmtlZExpc3Rfc3QgewotCi0gICAgICAgICAgICBjbXNUYWdTaWduYXR1cmUgU2lnbmF0dXJlOwotICAgICAgICAgICAgY21zVGFnRGVzY3JpcHRvciBEZXNjcmlwdG9yOwotICAgICAgICAgICAgc3RydWN0IF9jbXNUYWdMaW5rZWRMaXN0X3N0KiBOZXh0OwotCi19IF9jbXNUYWdMaW5rZWRMaXN0OwotCi0vLyBUaGlzIGlzIHRoZSBsaXN0IG9mIGJ1aWx0LWluIHRhZ3MKLXN0YXRpYyBfY21zVGFnTGlua2VkTGlzdCBTdXBwb3J0ZWRUYWdzW10gPSB7Ci0KLSAgICB7IGNtc1NpZ0FUb0IwVGFnLCAgICAgICAgICAgICAgIHsgMSwgMywgIHsgY21zU2lnTHV0MTZUeXBlLCAgY21zU2lnTHV0QXRvQlR5cGUsIGNtc1NpZ0x1dDhUeXBlfSwgRGVjaWRlTFVUdHlwZUEyQn0sICZTdXBwb3J0ZWRUYWdzWzFdfSwKLSAgICB7IGNtc1NpZ0FUb0IxVGFnLCAgICAgICAgICAgICAgIHsgMSwgMywgIHsgY21zU2lnTHV0MTZUeXBlLCAgY21zU2lnTHV0QXRvQlR5cGUsIGNtc1NpZ0x1dDhUeXBlfSwgRGVjaWRlTFVUdHlwZUEyQn0sICZTdXBwb3J0ZWRUYWdzWzJdfSwKLSAgICB7IGNtc1NpZ0FUb0IyVGFnLCAgICAgICAgICAgICAgIHsgMSwgMywgIHsgY21zU2lnTHV0MTZUeXBlLCAgY21zU2lnTHV0QXRvQlR5cGUsIGNtc1NpZ0x1dDhUeXBlfSwgRGVjaWRlTFVUdHlwZUEyQn0sICZTdXBwb3J0ZWRUYWdzWzNdfSwKLSAgICB7IGNtc1NpZ0JUb0EwVGFnLCAgICAgICAgICAgICAgIHsgMSwgMywgIHsgY21zU2lnTHV0MTZUeXBlLCAgY21zU2lnTHV0QnRvQVR5cGUsIGNtc1NpZ0x1dDhUeXBlfSwgRGVjaWRlTFVUdHlwZUIyQX0sICZTdXBwb3J0ZWRUYWdzWzRdfSwKLSAgICB7IGNtc1NpZ0JUb0ExVGFnLCAgICAgICAgICAgICAgIHsgMSwgMywgIHsgY21zU2lnTHV0MTZUeXBlLCAgY21zU2lnTHV0QnRvQVR5cGUsIGNtc1NpZ0x1dDhUeXBlfSwgRGVjaWRlTFVUdHlwZUIyQX0sICZTdXBwb3J0ZWRUYWdzWzVdfSwKLSAgICB7IGNtc1NpZ0JUb0EyVGFnLCAgICAgICAgICAgICAgIHsgMSwgMywgIHsgY21zU2lnTHV0MTZUeXBlLCAgY21zU2lnTHV0QnRvQVR5cGUsIGNtc1NpZ0x1dDhUeXBlfSwgRGVjaWRlTFVUdHlwZUIyQX0sICZTdXBwb3J0ZWRUYWdzWzZdfSwKLQotICAgIC8vIEFsbG93IGNvcmJpcyAgYW5kIGl0cyBicm9rZW4gWFlaIHR5cGUKLSAgICB7IGNtc1NpZ1JlZENvbG9yYW50VGFnLCAgICAgICAgIHsgMSwgMiwgeyBjbXNTaWdYWVpUeXBlLCBjbXNDb3JiaXNCcm9rZW5YWVp0eXBlIH0sIERlY2lkZVhZWnR5cGV9LCAmU3VwcG9ydGVkVGFnc1s3XX0sCi0gICAgeyBjbXNTaWdHcmVlbkNvbG9yYW50VGFnLCAgICAgICB7IDEsIDIsIHsgY21zU2lnWFlaVHlwZSwgY21zQ29yYmlzQnJva2VuWFladHlwZSB9LCBEZWNpZGVYWVp0eXBlfSwgJlN1cHBvcnRlZFRhZ3NbOF19LAotICAgIHsgY21zU2lnQmx1ZUNvbG9yYW50VGFnLCAgICAgICAgeyAxLCAyLCB7IGNtc1NpZ1hZWlR5cGUsIGNtc0NvcmJpc0Jyb2tlblhZWnR5cGUgfSwgRGVjaWRlWFladHlwZX0sICZTdXBwb3J0ZWRUYWdzWzldfSwKLQotICAgIHsgY21zU2lnUmVkVFJDVGFnLCAgICAgICAgICAgICAgeyAxLCAzLCB7IGNtc1NpZ0N1cnZlVHlwZSwgY21zU2lnUGFyYW1ldHJpY0N1cnZlVHlwZSwgY21zTW9uYWNvQnJva2VuQ3VydmVUeXBlIH0sIERlY2lkZUN1cnZlVHlwZX0sICZTdXBwb3J0ZWRUYWdzWzEwXX0sCi0gICAgeyBjbXNTaWdHcmVlblRSQ1RhZywgICAgICAgICAgICB7IDEsIDMsIHsgY21zU2lnQ3VydmVUeXBlLCBjbXNTaWdQYXJhbWV0cmljQ3VydmVUeXBlLCBjbXNNb25hY29Ccm9rZW5DdXJ2ZVR5cGUgfSwgRGVjaWRlQ3VydmVUeXBlfSwgJlN1cHBvcnRlZFRhZ3NbMTFdfSwKLSAgICB7IGNtc1NpZ0JsdWVUUkNUYWcsICAgICAgICAgICAgIHsgMSwgMywgeyBjbXNTaWdDdXJ2ZVR5cGUsIGNtc1NpZ1BhcmFtZXRyaWNDdXJ2ZVR5cGUsIGNtc01vbmFjb0Jyb2tlbkN1cnZlVHlwZSB9LCBEZWNpZGVDdXJ2ZVR5cGV9LCAmU3VwcG9ydGVkVGFnc1sxMl19LAotCi0gICAgeyBjbXNTaWdDYWxpYnJhdGlvbkRhdGVUaW1lVGFnLCB7IDEsIDEsIHsgY21zU2lnRGF0ZVRpbWVUeXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1sxM119LAotICAgIHsgY21zU2lnQ2hhclRhcmdldFRhZywgICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ1RleHRUeXBlIH0sICAgICBOVUxMfSwgJlN1cHBvcnRlZFRhZ3NbMTRdfSwKLQotICAgIHsgY21zU2lnQ2hyb21hdGljQWRhcHRhdGlvblRhZywgeyA5LCAxLCB7IGNtc1NpZ1MxNUZpeGVkMTZBcnJheVR5cGUgfSwgTlVMTH0sICZTdXBwb3J0ZWRUYWdzWzE1XX0sCi0gICAgeyBjbXNTaWdDaHJvbWF0aWNpdHlUYWcsICAgICAgICB7IDEsIDEsIHsgY21zU2lnQ2hyb21hdGljaXR5VHlwZSAgICB9LCBOVUxMfSwgJlN1cHBvcnRlZFRhZ3NbMTZdfSwKLSAgICB7IGNtc1NpZ0NvbG9yYW50T3JkZXJUYWcsICAgICAgIHsgMSwgMSwgeyBjbXNTaWdDb2xvcmFudE9yZGVyVHlwZSAgIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1sxN119LAotICAgIHsgY21zU2lnQ29sb3JhbnRUYWJsZVRhZywgICAgICAgeyAxLCAxLCB7IGNtc1NpZ0NvbG9yYW50VGFibGVUeXBlICAgfSwgTlVMTH0sICZTdXBwb3J0ZWRUYWdzWzE4XX0sCi0gICAgeyBjbXNTaWdDb2xvcmFudFRhYmxlT3V0VGFnLCAgICB7IDEsIDEsIHsgY21zU2lnQ29sb3JhbnRUYWJsZVR5cGUgICB9LCBOVUxMfSwgJlN1cHBvcnRlZFRhZ3NbMTldfSwKLQotICAgIHsgY21zU2lnQ29weXJpZ2h0VGFnLCAgICAgICAgICAgeyAxLCAzLCB7IGNtc1NpZ1RleHRUeXBlLCAgY21zU2lnTXVsdGlMb2NhbGl6ZWRVbmljb2RlVHlwZSwgY21zU2lnVGV4dERlc2NyaXB0aW9uVHlwZX0sIERlY2lkZVRleHRUeXBlfSwgJlN1cHBvcnRlZFRhZ3NbMjBdfSwKLSAgICB7IGNtc1NpZ0RhdGVUaW1lVGFnLCAgICAgICAgICAgIHsgMSwgMSwgeyBjbXNTaWdEYXRlVGltZVR5cGUgfSwgTlVMTH0sICZTdXBwb3J0ZWRUYWdzWzIxXX0sCi0KLSAgICB7IGNtc1NpZ0RldmljZU1mZ0Rlc2NUYWcsICAgICAgIHsgMSwgMywgeyBjbXNTaWdUZXh0RGVzY3JpcHRpb25UeXBlLCBjbXNTaWdNdWx0aUxvY2FsaXplZFVuaWNvZGVUeXBlLCBjbXNTaWdUZXh0VHlwZX0sIERlY2lkZVRleHREZXNjVHlwZX0sICZTdXBwb3J0ZWRUYWdzWzIyXX0sCi0gICAgeyBjbXNTaWdEZXZpY2VNb2RlbERlc2NUYWcsICAgICB7IDEsIDMsIHsgY21zU2lnVGV4dERlc2NyaXB0aW9uVHlwZSwgY21zU2lnTXVsdGlMb2NhbGl6ZWRVbmljb2RlVHlwZSwgY21zU2lnVGV4dFR5cGV9LCBEZWNpZGVUZXh0RGVzY1R5cGV9LCAmU3VwcG9ydGVkVGFnc1syM119LAotCi0gICAgeyBjbXNTaWdHYW11dFRhZywgICAgICAgICAgICAgICB7IDEsIDMsIHsgY21zU2lnTHV0MTZUeXBlLCBjbXNTaWdMdXRCdG9BVHlwZSwgY21zU2lnTHV0OFR5cGUgfSwgRGVjaWRlTFVUdHlwZUIyQX0sICZTdXBwb3J0ZWRUYWdzWzI0XX0sCi0KLSAgICB7IGNtc1NpZ0dyYXlUUkNUYWcsICAgICAgICAgICAgIHsgMSwgMiwgeyBjbXNTaWdDdXJ2ZVR5cGUsIGNtc1NpZ1BhcmFtZXRyaWNDdXJ2ZVR5cGUgfSwgRGVjaWRlQ3VydmVUeXBlfSwgJlN1cHBvcnRlZFRhZ3NbMjVdfSwKLSAgICB7IGNtc1NpZ0x1bWluYW5jZVRhZywgICAgICAgICAgIHsgMSwgMSwgeyBjbXNTaWdYWVpUeXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1syNl19LAotCi0gICAgeyBjbXNTaWdNZWRpYUJsYWNrUG9pbnRUYWcsICAgICB7IDEsIDIsIHsgY21zU2lnWFlaVHlwZSwgY21zQ29yYmlzQnJva2VuWFladHlwZSB9LCBOVUxMfSwgJlN1cHBvcnRlZFRhZ3NbMjddfSwKLSAgICB7IGNtc1NpZ01lZGlhV2hpdGVQb2ludFRhZywgICAgIHsgMSwgMiwgeyBjbXNTaWdYWVpUeXBlLCBjbXNDb3JiaXNCcm9rZW5YWVp0eXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1syOF19LAotCi0gICAgeyBjbXNTaWdOYW1lZENvbG9yMlRhZywgICAgICAgICB7IDEsIDEsIHsgY21zU2lnTmFtZWRDb2xvcjJUeXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1syOV19LAotCi0gICAgeyBjbXNTaWdQcmV2aWV3MFRhZywgICAgICAgICAgICB7IDEsIDMsICB7IGNtc1NpZ0x1dDE2VHlwZSwgY21zU2lnTHV0QnRvQVR5cGUsIGNtc1NpZ0x1dDhUeXBlIH0sIERlY2lkZUxVVHR5cGVCMkF9LCAmU3VwcG9ydGVkVGFnc1szMF19LAotICAgIHsgY21zU2lnUHJldmlldzFUYWcsICAgICAgICAgICAgeyAxLCAzLCAgeyBjbXNTaWdMdXQxNlR5cGUsIGNtc1NpZ0x1dEJ0b0FUeXBlLCBjbXNTaWdMdXQ4VHlwZSB9LCBEZWNpZGVMVVR0eXBlQjJBfSwgJlN1cHBvcnRlZFRhZ3NbMzFdfSwKLSAgICB7IGNtc1NpZ1ByZXZpZXcyVGFnLCAgICAgICAgICAgIHsgMSwgMywgIHsgY21zU2lnTHV0MTZUeXBlLCBjbXNTaWdMdXRCdG9BVHlwZSwgY21zU2lnTHV0OFR5cGUgfSwgRGVjaWRlTFVUdHlwZUIyQX0sICZTdXBwb3J0ZWRUYWdzWzMyXX0sCi0KLSAgICB7IGNtc1NpZ1Byb2ZpbGVEZXNjcmlwdGlvblRhZywgIHsgMSwgMywgeyBjbXNTaWdUZXh0RGVzY3JpcHRpb25UeXBlLCBjbXNTaWdNdWx0aUxvY2FsaXplZFVuaWNvZGVUeXBlLCBjbXNTaWdUZXh0VHlwZX0sIERlY2lkZVRleHREZXNjVHlwZX0sICZTdXBwb3J0ZWRUYWdzWzMzXX0sCi0gICAgeyBjbXNTaWdQcm9maWxlU2VxdWVuY2VEZXNjVGFnLCB7IDEsIDEsIHsgY21zU2lnUHJvZmlsZVNlcXVlbmNlRGVzY1R5cGUgfSwgTlVMTH0sICZTdXBwb3J0ZWRUYWdzWzM0XX0sCi0gICAgeyBjbXNTaWdUZWNobm9sb2d5VGFnLCAgICAgICAgICB7IDEsIDEsIHsgY21zU2lnU2lnbmF0dXJlVHlwZSB9LCBOVUxMfSwgICZTdXBwb3J0ZWRUYWdzWzM1XX0sCi0KLSAgICB7IGNtc1NpZ0NvbG9yaW1ldHJpY0ludGVudEltYWdlU3RhdGVUYWcsICAgeyAxLCAxLCB7IGNtc1NpZ1NpZ25hdHVyZVR5cGUgfSwgTlVMTH0sICZTdXBwb3J0ZWRUYWdzWzM2XX0sCi0gICAgeyBjbXNTaWdQZXJjZXB0dWFsUmVuZGVyaW5nSW50ZW50R2FtdXRUYWcsIHsgMSwgMSwgeyBjbXNTaWdTaWduYXR1cmVUeXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1szN119LAotICAgIHsgY21zU2lnU2F0dXJhdGlvblJlbmRlcmluZ0ludGVudEdhbXV0VGFnLCB7IDEsIDEsIHsgY21zU2lnU2lnbmF0dXJlVHlwZSB9LCBOVUxMfSwgJlN1cHBvcnRlZFRhZ3NbMzhdfSwKLQotICAgIHsgY21zU2lnTWVhc3VyZW1lbnRUYWcsICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ01lYXN1cmVtZW50VHlwZSB9LCBOVUxMfSwgJlN1cHBvcnRlZFRhZ3NbMzldfSwKLQotICAgIHsgY21zU2lnUHMyQ1JEMFRhZywgICAgICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ0RhdGFUeXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1s0MF19LAotICAgIHsgY21zU2lnUHMyQ1JEMVRhZywgICAgICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ0RhdGFUeXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1s0MV19LAotICAgIHsgY21zU2lnUHMyQ1JEMlRhZywgICAgICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ0RhdGFUeXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1s0Ml19LAotICAgIHsgY21zU2lnUHMyQ1JEM1RhZywgICAgICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ0RhdGFUeXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1s0M119LAotICAgIHsgY21zU2lnUHMyQ1NBVGFnLCAgICAgICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ0RhdGFUeXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1s0NF19LAotICAgIHsgY21zU2lnUHMyUmVuZGVyaW5nSW50ZW50VGFnLCAgeyAxLCAxLCB7IGNtc1NpZ0RhdGFUeXBlIH0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1s0NV19LAotCi0gICAgeyBjbXNTaWdWaWV3aW5nQ29uZERlc2NUYWcsICAgICB7IDEsIDMsIHsgY21zU2lnVGV4dERlc2NyaXB0aW9uVHlwZSwgY21zU2lnTXVsdGlMb2NhbGl6ZWRVbmljb2RlVHlwZSwgY21zU2lnVGV4dFR5cGV9LCBEZWNpZGVUZXh0RGVzY1R5cGV9LCAmU3VwcG9ydGVkVGFnc1s0Nl19LAotCi0gICAgeyBjbXNTaWdVY3JCZ1RhZywgICAgICAgICAgICAgICB7IDEsIDEsIHsgY21zU2lnVWNyQmdUeXBlfSwgTlVMTH0sICAgICZTdXBwb3J0ZWRUYWdzWzQ3XX0sCi0gICAgeyBjbXNTaWdDcmRJbmZvVGFnLCAgICAgICAgICAgICB7IDEsIDEsIHsgY21zU2lnQ3JkSW5mb1R5cGV9LCBOVUxMfSwgICZTdXBwb3J0ZWRUYWdzWzQ4XX0sCi0KLSAgICB7IGNtc1NpZ0RUb0IwVGFnLCAgICAgICAgICAgICAgIHsgMSwgMSwgeyBjbXNTaWdNdWx0aVByb2Nlc3NFbGVtZW50VHlwZX0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1s0OV19LAotICAgIHsgY21zU2lnRFRvQjFUYWcsICAgICAgICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ011bHRpUHJvY2Vzc0VsZW1lbnRUeXBlfSwgTlVMTH0sICZTdXBwb3J0ZWRUYWdzWzUwXX0sCi0gICAgeyBjbXNTaWdEVG9CMlRhZywgICAgICAgICAgICAgICB7IDEsIDEsIHsgY21zU2lnTXVsdGlQcm9jZXNzRWxlbWVudFR5cGV9LCBOVUxMfSwgJlN1cHBvcnRlZFRhZ3NbNTFdfSwKLSAgICB7IGNtc1NpZ0RUb0IzVGFnLCAgICAgICAgICAgICAgIHsgMSwgMSwgeyBjbXNTaWdNdWx0aVByb2Nlc3NFbGVtZW50VHlwZX0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1s1Ml19LAotICAgIHsgY21zU2lnQlRvRDBUYWcsICAgICAgICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ011bHRpUHJvY2Vzc0VsZW1lbnRUeXBlfSwgTlVMTH0sICZTdXBwb3J0ZWRUYWdzWzUzXX0sCi0gICAgeyBjbXNTaWdCVG9EMVRhZywgICAgICAgICAgICAgICB7IDEsIDEsIHsgY21zU2lnTXVsdGlQcm9jZXNzRWxlbWVudFR5cGV9LCBOVUxMfSwgJlN1cHBvcnRlZFRhZ3NbNTRdfSwKLSAgICB7IGNtc1NpZ0JUb0QyVGFnLCAgICAgICAgICAgICAgIHsgMSwgMSwgeyBjbXNTaWdNdWx0aVByb2Nlc3NFbGVtZW50VHlwZX0sIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1s1NV19LAotICAgIHsgY21zU2lnQlRvRDNUYWcsICAgICAgICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ011bHRpUHJvY2Vzc0VsZW1lbnRUeXBlfSwgTlVMTH0sICZTdXBwb3J0ZWRUYWdzWzU2XX0sCi0KLSAgICB7IGNtc1NpZ1NjcmVlbmluZ0Rlc2NUYWcsICAgICAgIHsgMSwgMSwgeyBjbXNTaWdUZXh0RGVzY3JpcHRpb25UeXBlIH0sICAgIE5VTEx9LCAmU3VwcG9ydGVkVGFnc1s1N119LAotICAgIHsgY21zU2lnVmlld2luZ0NvbmRpdGlvbnNUYWcsICAgeyAxLCAxLCB7IGNtc1NpZ1ZpZXdpbmdDb25kaXRpb25zVHlwZSB9LCAgTlVMTH0sICZTdXBwb3J0ZWRUYWdzWzU4XX0sCi0KLSAgICB7IGNtc1NpZ1NjcmVlbmluZ1RhZywgICAgICAgICAgIHsgMSwgMSwgeyBjbXNTaWdTY3JlZW5pbmdUeXBlfSwgICAgICAgICAgTlVMTCB9LCAmU3VwcG9ydGVkVGFnc1s1OV19LAotICAgIHsgY21zU2lnVmNndFRhZywgICAgICAgICAgICAgICAgeyAxLCAxLCB7IGNtc1NpZ1ZjZ3RUeXBlfSwgICAgICAgICAgICAgICBOVUxMIH0sICZTdXBwb3J0ZWRUYWdzWzYwXX0sCi0gICAgeyBjbXNTaWdNZXRhVGFnLCAgICAgICAgICAgICAgICB7IDEsIDEsIHsgY21zU2lnRGljdFR5cGV9LCAgICAgICAgICAgICAgIE5VTEwgfSwgJlN1cHBvcnRlZFRhZ3NbNjFdfSwKLSAgICB7IGNtc1NpZ1Byb2ZpbGVTZXF1ZW5jZUlkVGFnLCAgIHsgMSwgMSwgeyBjbXNTaWdQcm9maWxlU2VxdWVuY2VJZFR5cGV9LCAgTlVMTCB9LCAgJlN1cHBvcnRlZFRhZ3NbNjJdfSwKLSAgICB7IGNtc1NpZ1Byb2ZpbGVEZXNjcmlwdGlvbk1MVGFnLHsgMSwgMSwgeyBjbXNTaWdNdWx0aUxvY2FsaXplZFVuaWNvZGVUeXBlfSwgTlVMTH0sIE5VTEx9Ci0KLQotfTsKLQotLyoKLSAgICBOb3Qgc3VwcG9ydGVkICAgICAgICAgICAgICAgICBXaHkKLSAgICA9PT09PT09PT09PT09PT09PT09PT09PSAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIGNtc1NpZ091dHB1dFJlc3BvbnNlVGFnICAgPT0+IFdBUk5JTkcsIFBPU1NJQkxFIFBBVEVOVCBPTiBUSElTIFNVQkpFQ1QhCi0gICAgY21zU2lnTmFtZWRDb2xvclRhZyAgICAgICA9PT4gRGVwcmVjYXRlZAotICAgIGNtc1NpZ0RhdGFUYWcgICAgICAgICAgICAgPT0+IEFuY2llbnQsIHVudXNlZAotICAgIGNtc1NpZ0RldmljZVNldHRpbmdzVGFnICAgPT0+IERlcHJlY2F0ZWQsIHVzZWxlc3MKLSovCi0KLQotX2Ntc1RhZ1BsdWdpbkNodW5rVHlwZSBfY21zVGFnUGx1Z2luQ2h1bmsgPSB7IE5VTEwgfTsKLQotCi0vLyBEdXBsaWNhdGVzIHRoZSB6b25lIG9mIG1lbW9yeSB1c2VkIGJ5IHRoZSBwbHVnLWluIGluIHRoZSBuZXcgY29udGV4dAotc3RhdGljCi12b2lkIER1cFRhZ0xpc3Qoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKQotewotICAgX2Ntc1RhZ1BsdWdpbkNodW5rVHlwZSBuZXdIZWFkID0geyBOVUxMIH07Ci0gICBfY21zVGFnTGlua2VkTGlzdCogIGVudHJ5OwotICAgX2Ntc1RhZ0xpbmtlZExpc3QqICBBbnRlcmlvciA9IE5VTEw7Ci0gICBfY21zVGFnUGx1Z2luQ2h1bmtUeXBlKiBoZWFkID0gKF9jbXNUYWdQbHVnaW5DaHVua1R5cGUqKSBzcmMtPmNodW5rc1tUYWdQbHVnaW5dOwotCi0gICAvLyBXYWxrIHRoZSBsaXN0IGNvcHlpbmcgYWxsIG5vZGVzCi0gICBmb3IgKGVudHJ5ID0gaGVhZC0+VGFnOwotICAgICAgIGVudHJ5ICE9IE5VTEw7Ci0gICAgICAgZW50cnkgPSBlbnRyeSAtPk5leHQpIHsKLQotICAgICAgICAgICBfY21zVGFnTGlua2VkTGlzdCAqbmV3RW50cnkgPSAoIF9jbXNUYWdMaW5rZWRMaXN0ICopIF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCBlbnRyeSwgc2l6ZW9mKF9jbXNUYWdMaW5rZWRMaXN0KSk7Ci0KLSAgICAgICAgICAgaWYgKG5ld0VudHJ5ID09IE5VTEwpIAotICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgIC8vIFdlIHdhbnQgdG8ga2VlcCB0aGUgbGlua2VkIGxpc3Qgb3JkZXIsIHNvIHRoaXMgaXMgYSBsaXR0bGUgYml0IHRyaWNreQotICAgICAgICAgICBuZXdFbnRyeSAtPiBOZXh0ID0gTlVMTDsKLSAgICAgICAgICAgaWYgKEFudGVyaW9yKQotICAgICAgICAgICAgICAgQW50ZXJpb3IgLT4gTmV4dCA9IG5ld0VudHJ5OwotCi0gICAgICAgICAgIEFudGVyaW9yID0gbmV3RW50cnk7Ci0KLSAgICAgICAgICAgaWYgKG5ld0hlYWQuVGFnID09IE5VTEwpCi0gICAgICAgICAgICAgICBuZXdIZWFkLlRhZyA9IG5ld0VudHJ5OwotICAgfQotCi0gICBjdHggLT5jaHVua3NbVGFnUGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHgtPk1lbVBvb2wsICZuZXdIZWFkLCBzaXplb2YoX2Ntc1RhZ1BsdWdpbkNodW5rVHlwZSkpOwotfQotCi12b2lkIF9jbXNBbGxvY1RhZ1BsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCi17Ci0gICAgaWYgKHNyYyAhPSBOVUxMKSB7Ci0KLSAgICAgICAgRHVwVGFnTGlzdChjdHgsIHNyYyk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBzdGF0aWMgX2Ntc1RhZ1BsdWdpbkNodW5rVHlwZSBUYWdQbHVnaW5DaHVuayA9IHsgTlVMTCB9OwotICAgICAgICBjdHggLT5jaHVua3NbVGFnUGx1Z2luXSA9IF9jbXNTdWJBbGxvY0R1cChjdHggLT5NZW1Qb29sLCAmVGFnUGx1Z2luQ2h1bmssIHNpemVvZihfY21zVGFnUGx1Z2luQ2h1bmtUeXBlKSk7Ci0gICAgfQotCi19Ci0KLWNtc0Jvb2wgIF9jbXNSZWdpc3RlclRhZ1BsdWdpbihjbXNDb250ZXh0IGlkLCBjbXNQbHVnaW5CYXNlKiBEYXRhKQotewotICAgIGNtc1BsdWdpblRhZyogUGx1Z2luID0gKGNtc1BsdWdpblRhZyopIERhdGE7Ci0gICAgX2Ntc1RhZ0xpbmtlZExpc3QgKnB0OwotICAgIF9jbXNUYWdQbHVnaW5DaHVua1R5cGUqIFRhZ1BsdWdpbkNodW5rID0gKCBfY21zVGFnUGx1Z2luQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhpZCwgVGFnUGx1Z2luKTsKLQotICAgIGlmIChEYXRhID09IE5VTEwpIHsKLQotICAgICAgICBUYWdQbHVnaW5DaHVuay0+VGFnID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgcHQgPSAoX2Ntc1RhZ0xpbmtlZExpc3QqKSBfY21zUGx1Z2luTWFsbG9jKGlkLCBzaXplb2YoX2Ntc1RhZ0xpbmtlZExpc3QpKTsKLSAgICBpZiAocHQgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0gICAgcHQgLT5TaWduYXR1cmUgID0gUGx1Z2luIC0+U2lnbmF0dXJlOwotICAgIHB0IC0+RGVzY3JpcHRvciA9IFBsdWdpbiAtPkRlc2NyaXB0b3I7Ci0gICAgcHQgLT5OZXh0ICAgICAgID0gVGFnUGx1Z2luQ2h1bmsgLT5UYWc7Ci0KLSAgICBUYWdQbHVnaW5DaHVuayAtPlRhZyA9IHB0OwotICAgIAotICAgIHJldHVybiBUUlVFOwotfQotCi0vLyBSZXR1cm4gYSBkZXNjcmlwdG9yIGZvciBhIGdpdmVuIHRhZyBvciBOVUxMCi1jbXNUYWdEZXNjcmlwdG9yKiBfY21zR2V0VGFnRGVzY3JpcHRvcihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zVGFnU2lnbmF0dXJlIHNpZykKLXsKLSAgICBfY21zVGFnTGlua2VkTGlzdCogcHQ7Ci0gICAgX2Ntc1RhZ1BsdWdpbkNodW5rVHlwZSogVGFnUGx1Z2luQ2h1bmsgPSAoIF9jbXNUYWdQbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgVGFnUGx1Z2luKTsKLQotICAgIGZvciAocHQgPSBUYWdQbHVnaW5DaHVuay0+VGFnOwotICAgICAgICAgICAgIHB0ICE9IE5VTEw7Ci0gICAgICAgICAgICAgcHQgPSBwdCAtPk5leHQpIHsKLQotICAgICAgICAgICAgICAgIGlmIChzaWcgPT0gcHQgLT4gU2lnbmF0dXJlKSByZXR1cm4gJnB0IC0+RGVzY3JpcHRvcjsKLSAgICB9Ci0KLSAgICBmb3IgKHB0ID0gU3VwcG9ydGVkVGFnczsKLSAgICAgICAgICAgIHB0ICE9IE5VTEw7Ci0gICAgICAgICAgICBwdCA9IHB0IC0+TmV4dCkgewotCi0gICAgICAgICAgICAgICAgaWYgKHNpZyA9PSBwdCAtPiBTaWduYXR1cmUpIHJldHVybiAmcHQgLT5EZXNjcmlwdG9yOwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN2aXJ0LmMgYi90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3ZpcnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE5YWNlMS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9sY21zMi0yLjYvc3JjL2Ntc3ZpcnQuYworKysgL2Rldi9udWxsCkBAIC0xLDExOTQgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTQgTWFydGkgTWFyaWEgU2FndWVyCi0vLwotLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0vLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0vLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0vLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLS8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQotLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLS8vCi0vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0vLwotLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0vLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KLS8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi0vLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCi0vLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0vLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLS8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotCi0jaW5jbHVkZSAibGNtczJfaW50ZXJuYWwuaCIKLQotLy8gVmlydHVhbCAoYnVpbHQtaW4pIHByb2ZpbGVzCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMKLWNtc0Jvb2wgU2V0VGV4dFRhZ3MoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNvbnN0IHdjaGFyX3QqIERlc2NyaXB0aW9uKQotewotICAgIGNtc01MVSAqRGVzY3JpcHRpb25NTFUsICpDb3B5cmlnaHRNTFU7Ci0gICAgY21zQm9vbCAgcmMgPSBGQUxTRTsKLSAgICBjbXNDb250ZXh0IENvbnRleHRJRCA9IGNtc0dldFByb2ZpbGVDb250ZXh0SUQoaFByb2ZpbGUpOwotCi0gICAgRGVzY3JpcHRpb25NTFUgID0gY21zTUxVYWxsb2MoQ29udGV4dElELCAxKTsKLSAgICBDb3B5cmlnaHRNTFUgICAgPSBjbXNNTFVhbGxvYyhDb250ZXh0SUQsIDEpOwotCi0gICAgaWYgKERlc2NyaXB0aW9uTUxVID09IE5VTEwgfHwgQ29weXJpZ2h0TUxVID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLSAgICBpZiAoIWNtc01MVXNldFdpZGUoRGVzY3JpcHRpb25NTFUsICAiZW4iLCAiVVMiLCBEZXNjcmlwdGlvbikpIGdvdG8gRXJyb3I7Ci0gICAgaWYgKCFjbXNNTFVzZXRXaWRlKENvcHlyaWdodE1MVSwgICAgImVuIiwgIlVTIiwgTCJObyBjb3B5cmlnaHQsIHVzZSBmcmVlbHkiKSkgZ290byBFcnJvcjsKLQotICAgIGlmICghY21zV3JpdGVUYWcoaFByb2ZpbGUsIGNtc1NpZ1Byb2ZpbGVEZXNjcmlwdGlvblRhZywgIERlc2NyaXB0aW9uTUxVKSkgZ290byBFcnJvcjsKLSAgICBpZiAoIWNtc1dyaXRlVGFnKGhQcm9maWxlLCBjbXNTaWdDb3B5cmlnaHRUYWcsICAgICAgICAgICBDb3B5cmlnaHRNTFUpKSBnb3RvIEVycm9yOwotCi0gICAgcmMgPSBUUlVFOwotCi1FcnJvcjoKLQotICAgIGlmIChEZXNjcmlwdGlvbk1MVSkKLSAgICAgICAgY21zTUxVZnJlZShEZXNjcmlwdGlvbk1MVSk7Ci0gICAgaWYgKENvcHlyaWdodE1MVSkKLSAgICAgICAgY21zTUxVZnJlZShDb3B5cmlnaHRNTFUpOwotICAgIHJldHVybiByYzsKLX0KLQotCi1zdGF0aWMKLWNtc0Jvb2wgIFNldFNlcURlc2NUYWcoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNvbnN0IGNoYXIqIE1vZGVsKQotewotICAgIGNtc0Jvb2wgIHJjID0gRkFMU0U7Ci0gICAgY21zQ29udGV4dCBDb250ZXh0SUQgPSBjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlKTsKLSAgICBjbXNTRVEqIFNlcSA9IGNtc0FsbG9jUHJvZmlsZVNlcXVlbmNlRGVzY3JpcHRpb24oQ29udGV4dElELCAxKTsKLQotICAgIGlmIChTZXEgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0gICAgU2VxLT5zZXFbMF0uZGV2aWNlTWZnID0gKGNtc1NpZ25hdHVyZSkgMDsKLSAgICBTZXEtPnNlcVswXS5kZXZpY2VNb2RlbCA9IChjbXNTaWduYXR1cmUpIDA7Ci0KLSNpZmRlZiBDTVNfRE9OVF9VU0VfSU5UNjQKLSAgICBTZXEtPnNlcVswXS5hdHRyaWJ1dGVzWzBdID0gMDsKLSAgICBTZXEtPnNlcVswXS5hdHRyaWJ1dGVzWzFdID0gMDsKLSNlbHNlCi0gICAgU2VxLT5zZXFbMF0uYXR0cmlidXRlcyA9IDA7Ci0jZW5kaWYKLQotICAgIFNlcS0+c2VxWzBdLnRlY2hub2xvZ3kgPSAoY21zVGVjaG5vbG9neVNpZ25hdHVyZSkgMDsKLQotICAgIGNtc01MVXNldEFTQ0lJKCBTZXEtPnNlcVswXS5NYW51ZmFjdHVyZXIsIGNtc05vTGFuZ3VhZ2UsIGNtc05vQ291bnRyeSwgIkxpdHRsZSBDTVMiKTsKLSAgICBjbXNNTFVzZXRBU0NJSSggU2VxLT5zZXFbMF0uTW9kZWwsICAgICAgICBjbXNOb0xhbmd1YWdlLCBjbXNOb0NvdW50cnksIE1vZGVsKTsKLQotICAgIGlmICghX2Ntc1dyaXRlUHJvZmlsZVNlcXVlbmNlKGhQcm9maWxlLCBTZXEpKSBnb3RvIEVycm9yOwotCi0gICAgcmMgPSBUUlVFOwotCi1FcnJvcjoKLSAgICBpZiAoU2VxKQotICAgICAgICBjbXNGcmVlUHJvZmlsZVNlcXVlbmNlRGVzY3JpcHRpb24oU2VxKTsKLQotICAgIHJldHVybiByYzsKLX0KLQotCi0KLS8vIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIHByb2ZpbGUgYmFzZWQgb24gV2hpdGUgcG9pbnQsIHByaW1hcmllcyBhbmQKLS8vIHRyYW5zZmVyIGZ1bmN0aW9ucy4KLWNtc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNDcmVhdGVSR0JQcm9maWxlVEhSKGNtc0NvbnRleHQgQ29udGV4dElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zQ0lFeHlZKiBXaGl0ZVBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zQ0lFeHlZVFJJUExFKiBQcmltYXJpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNUb25lQ3VydmUqIGNvbnN0IFRyYW5zZmVyRnVuY3Rpb25bM10pCi17Ci0gICAgY21zSFBST0ZJTEUgaElDQzsKLSAgICBjbXNNQVQzIE1Db2xvcmFudHM7Ci0gICAgY21zQ0lFWFlaVFJJUExFIENvbG9yYW50czsKLSAgICBjbXNDSUV4eVkgTWF4V2hpdGU7Ci0gICAgY21zTUFUMyBDSEFEOwotICAgIGNtc0NJRVhZWiBXaGl0ZVBvaW50WFlaOwotCi0gICAgaElDQyA9IGNtc0NyZWF0ZVByb2ZpbGVQbGFjZWhvbGRlcihDb250ZXh0SUQpOwotICAgIGlmICghaElDQykgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbid0IGFsbG9jYXRlCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgY21zU2V0UHJvZmlsZVZlcnNpb24oaElDQywgNC4zKTsKLQotICAgIGNtc1NldERldmljZUNsYXNzKGhJQ0MsICAgICAgY21zU2lnRGlzcGxheUNsYXNzKTsKLSAgICBjbXNTZXRDb2xvclNwYWNlKGhJQ0MsICAgICAgIGNtc1NpZ1JnYkRhdGEpOwotICAgIGNtc1NldFBDUyhoSUNDLCAgICAgICAgICAgICAgY21zU2lnWFlaRGF0YSk7Ci0KLSAgICBjbXNTZXRIZWFkZXJSZW5kZXJpbmdJbnRlbnQoaElDQywgIElOVEVOVF9QRVJDRVBUVUFMKTsKLQotCi0gICAgLy8gSW1wbGVtZW50IHByb2ZpbGUgdXNpbmcgZm9sbG93aW5nIHRhZ3M6Ci0gICAgLy8KLSAgICAvLyAgMSBjbXNTaWdQcm9maWxlRGVzY3JpcHRpb25UYWcKLSAgICAvLyAgMiBjbXNTaWdNZWRpYVdoaXRlUG9pbnRUYWcKLSAgICAvLyAgMyBjbXNTaWdSZWRDb2xvcmFudFRhZwotICAgIC8vICA0IGNtc1NpZ0dyZWVuQ29sb3JhbnRUYWcKLSAgICAvLyAgNSBjbXNTaWdCbHVlQ29sb3JhbnRUYWcKLSAgICAvLyAgNiBjbXNTaWdSZWRUUkNUYWcKLSAgICAvLyAgNyBjbXNTaWdHcmVlblRSQ1RhZwotICAgIC8vICA4IGNtc1NpZ0JsdWVUUkNUYWcKLSAgICAvLyAgOSBDaHJvbWF0aWMgYWRhcHRhdGlvbiBUYWcKLSAgICAvLyBUaGlzIGNvbmZvcm1zIGEgc3RhbmRhcmQgUkdCIERpc3BsYXlQcm9maWxlIGFzIHNheXMgSUNDLCBhbmQgdGhlbiBJIGFkZCAoQXMgcGVyIGFkZGVuZHVtIElJKQotICAgIC8vIDEwIGNtc1NpZ0Nocm9tYXRpY2l0eVRhZwotCi0KLSAgICBpZiAoIVNldFRleHRUYWdzKGhJQ0MsIEwiUkdCIGJ1aWx0LWluIikpIGdvdG8gRXJyb3I7Ci0KLSAgICBpZiAoV2hpdGVQb2ludCkgewotCi0gICAgICAgIGlmICghY21zV3JpdGVUYWcoaElDQywgY21zU2lnTWVkaWFXaGl0ZVBvaW50VGFnLCBjbXNENTBfWFlaKCkpKSBnb3RvIEVycm9yOwotCi0gICAgICAgIGNtc3h5WTJYWVooJldoaXRlUG9pbnRYWVosIFdoaXRlUG9pbnQpOwotICAgICAgICBfY21zQWRhcHRhdGlvbk1hdHJpeCgmQ0hBRCwgTlVMTCwgJldoaXRlUG9pbnRYWVosIGNtc0Q1MF9YWVooKSk7Ci0KLSAgICAgICAgLy8gVGhpcyBpcyBhIFY0IHRhZywgYnV0IG1hbnkgQ01NIGRvZXMgcmVhZCBhbmQgdW5kZXJzdGFuZCBpdCBubyBtYXR0ZXIgd2hpY2ggdmVyc2lvbgotICAgICAgICBpZiAoIWNtc1dyaXRlVGFnKGhJQ0MsIGNtc1NpZ0Nocm9tYXRpY0FkYXB0YXRpb25UYWcsICh2b2lkKikgJkNIQUQpKSBnb3RvIEVycm9yOwotICAgIH0KLQotICAgIGlmIChXaGl0ZVBvaW50ICYmIFByaW1hcmllcykgewotCi0gICAgICAgIE1heFdoaXRlLnggPSAgV2hpdGVQb2ludCAtPiB4OwotICAgICAgICBNYXhXaGl0ZS55ID0gIFdoaXRlUG9pbnQgLT4geTsKLSAgICAgICAgTWF4V2hpdGUuWSA9ICAxLjA7Ci0KLSAgICAgICAgaWYgKCFfY21zQnVpbGRSR0IyWFladHJhbnNmZXJNYXRyaXgoJk1Db2xvcmFudHMsICZNYXhXaGl0ZSwgUHJpbWFyaWVzKSkgZ290byBFcnJvcjsKLQotICAgICAgICBDb2xvcmFudHMuUmVkLlggICA9IE1Db2xvcmFudHMudlswXS5uWzBdOwotICAgICAgICBDb2xvcmFudHMuUmVkLlkgICA9IE1Db2xvcmFudHMudlsxXS5uWzBdOwotICAgICAgICBDb2xvcmFudHMuUmVkLlogICA9IE1Db2xvcmFudHMudlsyXS5uWzBdOwotCi0gICAgICAgIENvbG9yYW50cy5HcmVlbi5YID0gTUNvbG9yYW50cy52WzBdLm5bMV07Ci0gICAgICAgIENvbG9yYW50cy5HcmVlbi5ZID0gTUNvbG9yYW50cy52WzFdLm5bMV07Ci0gICAgICAgIENvbG9yYW50cy5HcmVlbi5aID0gTUNvbG9yYW50cy52WzJdLm5bMV07Ci0KLSAgICAgICAgQ29sb3JhbnRzLkJsdWUuWCAgPSBNQ29sb3JhbnRzLnZbMF0ublsyXTsKLSAgICAgICAgQ29sb3JhbnRzLkJsdWUuWSAgPSBNQ29sb3JhbnRzLnZbMV0ublsyXTsKLSAgICAgICAgQ29sb3JhbnRzLkJsdWUuWiAgPSBNQ29sb3JhbnRzLnZbMl0ublsyXTsKLQotICAgICAgICBpZiAoIWNtc1dyaXRlVGFnKGhJQ0MsIGNtc1NpZ1JlZENvbG9yYW50VGFnLCAgICh2b2lkKikgJkNvbG9yYW50cy5SZWQpKSBnb3RvIEVycm9yOwotICAgICAgICBpZiAoIWNtc1dyaXRlVGFnKGhJQ0MsIGNtc1NpZ0JsdWVDb2xvcmFudFRhZywgICh2b2lkKikgJkNvbG9yYW50cy5CbHVlKSkgZ290byBFcnJvcjsKLSAgICAgICAgaWYgKCFjbXNXcml0ZVRhZyhoSUNDLCBjbXNTaWdHcmVlbkNvbG9yYW50VGFnLCAodm9pZCopICZDb2xvcmFudHMuR3JlZW4pKSBnb3RvIEVycm9yOwotICAgIH0KLQotCi0gICAgaWYgKFRyYW5zZmVyRnVuY3Rpb24pIHsKLQotICAgICAgICAvLyBUcmllcyB0byBtaW5pbWl6ZSBzcGFjZS4gVGhhbmtzIHRvIFJpY2hhcmQgSHVnaGVzIGZvciB0aGlzIG5pY2UgaWRlYSAgICAgICAgIAotICAgICAgICBpZiAoIWNtc1dyaXRlVGFnKGhJQ0MsIGNtc1NpZ1JlZFRSQ1RhZywgICAodm9pZCopIFRyYW5zZmVyRnVuY3Rpb25bMF0pKSBnb3RvIEVycm9yOwotCi0gICAgICAgIGlmIChUcmFuc2ZlckZ1bmN0aW9uWzFdID09IFRyYW5zZmVyRnVuY3Rpb25bMF0pIHsKLQotICAgICAgICAgICAgaWYgKCFjbXNMaW5rVGFnIChoSUNDLCBjbXNTaWdHcmVlblRSQ1RhZywgY21zU2lnUmVkVFJDVGFnKSkgZ290byBFcnJvcjsKLQotICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICBpZiAoIWNtc1dyaXRlVGFnKGhJQ0MsIGNtc1NpZ0dyZWVuVFJDVGFnLCAodm9pZCopIFRyYW5zZmVyRnVuY3Rpb25bMV0pKSBnb3RvIEVycm9yOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKFRyYW5zZmVyRnVuY3Rpb25bMl0gPT0gVHJhbnNmZXJGdW5jdGlvblswXSkgewotCi0gICAgICAgICAgICBpZiAoIWNtc0xpbmtUYWcgKGhJQ0MsIGNtc1NpZ0JsdWVUUkNUYWcsIGNtc1NpZ1JlZFRSQ1RhZykpIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgaWYgKCFjbXNXcml0ZVRhZyhoSUNDLCBjbXNTaWdCbHVlVFJDVGFnLCAodm9pZCopIFRyYW5zZmVyRnVuY3Rpb25bMl0pKSBnb3RvIEVycm9yOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKFByaW1hcmllcykgewotICAgICAgICBpZiAoIWNtc1dyaXRlVGFnKGhJQ0MsIGNtc1NpZ0Nocm9tYXRpY2l0eVRhZywgKHZvaWQqKSBQcmltYXJpZXMpKSBnb3RvIEVycm9yOwotICAgIH0KLQotCi0gICAgcmV0dXJuIGhJQ0M7Ci0KLUVycm9yOgotICAgIGlmIChoSUNDKQotICAgICAgICBjbXNDbG9zZVByb2ZpbGUoaElDQyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNtc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNDcmVhdGVSR0JQcm9maWxlKGNvbnN0IGNtc0NJRXh5WSogV2hpdGVQb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0NJRXh5WVRSSVBMRSogUHJpbWFyaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVG9uZUN1cnZlKiBjb25zdCBUcmFuc2ZlckZ1bmN0aW9uWzNdKQotewotICAgIHJldHVybiBjbXNDcmVhdGVSR0JQcm9maWxlVEhSKE5VTEwsIFdoaXRlUG9pbnQsIFByaW1hcmllcywgVHJhbnNmZXJGdW5jdGlvbik7Ci19Ci0KLQotCi0vLyBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBwcm9maWxlIGJhc2VkIG9uIFdoaXRlIHBvaW50IGFuZCB0cmFuc2ZlciBmdW5jdGlvbi4KLWNtc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNDcmVhdGVHcmF5UHJvZmlsZVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNDSUV4eVkqIFdoaXRlUG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zVG9uZUN1cnZlKiBUcmFuc2ZlckZ1bmN0aW9uKQotewotICAgIGNtc0hQUk9GSUxFIGhJQ0M7Ci0gICAgY21zQ0lFWFlaIHRtcDsKLQotICAgIGhJQ0MgPSBjbXNDcmVhdGVQcm9maWxlUGxhY2Vob2xkZXIoQ29udGV4dElEKTsKLSAgICBpZiAoIWhJQ0MpICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4ndCBhbGxvY2F0ZQotICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgIGNtc1NldFByb2ZpbGVWZXJzaW9uKGhJQ0MsIDQuMyk7Ci0KLSAgICBjbXNTZXREZXZpY2VDbGFzcyhoSUNDLCAgICAgIGNtc1NpZ0Rpc3BsYXlDbGFzcyk7Ci0gICAgY21zU2V0Q29sb3JTcGFjZShoSUNDLCAgICAgICBjbXNTaWdHcmF5RGF0YSk7Ci0gICAgY21zU2V0UENTKGhJQ0MsICAgICAgICAgICAgICBjbXNTaWdYWVpEYXRhKTsKLSAgICBjbXNTZXRIZWFkZXJSZW5kZXJpbmdJbnRlbnQoaElDQywgIElOVEVOVF9QRVJDRVBUVUFMKTsKLQotCi0gICAgLy8gSW1wbGVtZW50IHByb2ZpbGUgdXNpbmcgZm9sbG93aW5nIHRhZ3M6Ci0gICAgLy8KLSAgICAvLyAgMSBjbXNTaWdQcm9maWxlRGVzY3JpcHRpb25UYWcKLSAgICAvLyAgMiBjbXNTaWdNZWRpYVdoaXRlUG9pbnRUYWcKLSAgICAvLyAgMyBjbXNTaWdHcmF5VFJDVGFnCi0KLSAgICAvLyBUaGlzIGNvbmZvcm1zIGEgc3RhbmRhcmQgR3JheSBEaXNwbGF5UHJvZmlsZQotCi0gICAgLy8gRmlsbC1pbiB0aGUgdGFncwotCi0gICAgaWYgKCFTZXRUZXh0VGFncyhoSUNDLCBMImdyYXkgYnVpbHQtaW4iKSkgZ290byBFcnJvcjsKLQotCi0gICAgaWYgKFdoaXRlUG9pbnQpIHsKLQotICAgICAgICBjbXN4eVkyWFlaKCZ0bXAsIFdoaXRlUG9pbnQpOwotICAgICAgICBpZiAoIWNtc1dyaXRlVGFnKGhJQ0MsIGNtc1NpZ01lZGlhV2hpdGVQb2ludFRhZywgKHZvaWQqKSAmdG1wKSkgZ290byBFcnJvcjsKLSAgICB9Ci0KLSAgICBpZiAoVHJhbnNmZXJGdW5jdGlvbikgewotCi0gICAgICAgIGlmICghY21zV3JpdGVUYWcoaElDQywgY21zU2lnR3JheVRSQ1RhZywgKHZvaWQqKSBUcmFuc2ZlckZ1bmN0aW9uKSkgZ290byBFcnJvcjsKLSAgICB9Ci0KLSAgICByZXR1cm4gaElDQzsKLQotRXJyb3I6Ci0gICAgaWYgKGhJQ0MpCi0gICAgICAgIGNtc0Nsb3NlUHJvZmlsZShoSUNDKTsKLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi0KLWNtc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNDcmVhdGVHcmF5UHJvZmlsZShjb25zdCBjbXNDSUV4eVkqIFdoaXRlUG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zVG9uZUN1cnZlKiBUcmFuc2ZlckZ1bmN0aW9uKQotewotICAgIHJldHVybiBjbXNDcmVhdGVHcmF5UHJvZmlsZVRIUihOVUxMLCBXaGl0ZVBvaW50LCBUcmFuc2ZlckZ1bmN0aW9uKTsKLX0KLQotLy8gVGhpcyBpcyBhIGRldmljZWxpbmsgb3BlcmF0aW5nIGluIHRoZSB0YXJnZXQgY29sb3JzcGFjZSB3aXRoIGFzIG1hbnkgdHJhbnNmZXIgZnVuY3Rpb25zIGFzIGNvbXBvbmVudHMKLQotY21zSFBST0ZJTEUgQ01TRVhQT1JUIGNtc0NyZWF0ZUxpbmVhcml6YXRpb25EZXZpY2VMaW5rVEhSKGNtc0NvbnRleHQgQ29udGV4dElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgQ29sb3JTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNUb25lQ3VydmUqIGNvbnN0IFRyYW5zZmVyRnVuY3Rpb25zW10pCi17Ci0gICAgY21zSFBST0ZJTEUgaElDQzsKLSAgICBjbXNQaXBlbGluZSogUGlwZWxpbmU7Ci0gICAgaW50IG5DaGFubmVsczsKLQotICAgIGhJQ0MgPSBjbXNDcmVhdGVQcm9maWxlUGxhY2Vob2xkZXIoQ29udGV4dElEKTsKLSAgICBpZiAoIWhJQ0MpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgY21zU2V0UHJvZmlsZVZlcnNpb24oaElDQywgNC4zKTsKLQotICAgIGNtc1NldERldmljZUNsYXNzKGhJQ0MsICAgICAgY21zU2lnTGlua0NsYXNzKTsKLSAgICBjbXNTZXRDb2xvclNwYWNlKGhJQ0MsICAgICAgIENvbG9yU3BhY2UpOwotICAgIGNtc1NldFBDUyhoSUNDLCAgICAgICAgICAgICAgQ29sb3JTcGFjZSk7Ci0KLSAgICBjbXNTZXRIZWFkZXJSZW5kZXJpbmdJbnRlbnQoaElDQywgIElOVEVOVF9QRVJDRVBUVUFMKTsKLQotICAgIC8vIFNldCB1cCBjaGFubmVscwotICAgIG5DaGFubmVscyA9IGNtc0NoYW5uZWxzT2YoQ29sb3JTcGFjZSk7Ci0KLSAgICAvLyBDcmVhdGVzIGEgUGlwZWxpbmUgd2l0aCBwcmVsaW5lYXJpemF0aW9uIHN0ZXAgb25seQotICAgIFBpcGVsaW5lID0gY21zUGlwZWxpbmVBbGxvYyhDb250ZXh0SUQsIG5DaGFubmVscywgbkNoYW5uZWxzKTsKLSAgICBpZiAoUGlwZWxpbmUgPT0gTlVMTCkgZ290byBFcnJvcjsKLQotCi0gICAgLy8gQ29weSB0YWJsZXMgdG8gUGlwZWxpbmUKLSAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoUGlwZWxpbmUsIGNtc0FUX0JFR0lOLCBjbXNTdGFnZUFsbG9jVG9uZUN1cnZlcyhDb250ZXh0SUQsIG5DaGFubmVscywgVHJhbnNmZXJGdW5jdGlvbnMpKSkKLSAgICAgICAgZ290byBFcnJvcjsKLQotICAgIC8vIENyZWF0ZSB0YWdzCi0gICAgaWYgKCFTZXRUZXh0VGFncyhoSUNDLCBMIkxpbmVhcml6YXRpb24gYnVpbHQtaW4iKSkgZ290byBFcnJvcjsKLSAgICBpZiAoIWNtc1dyaXRlVGFnKGhJQ0MsIGNtc1NpZ0FUb0IwVGFnLCAodm9pZCopIFBpcGVsaW5lKSkgZ290byBFcnJvcjsKLSAgICBpZiAoIVNldFNlcURlc2NUYWcoaElDQywgIkxpbmVhcml6YXRpb24gYnVpbHQtaW4iKSkgZ290byBFcnJvcjsKLQotICAgIC8vIFBpcGVsaW5lIGlzIGFscmVhZHkgb24gdmlydHVhbCBwcm9maWxlCi0gICAgY21zUGlwZWxpbmVGcmVlKFBpcGVsaW5lKTsKLQotICAgIC8vIE9rLCBkb25lCi0gICAgcmV0dXJuIGhJQ0M7Ci0KLUVycm9yOgotICAgIGNtc1BpcGVsaW5lRnJlZShQaXBlbGluZSk7Ci0gICAgaWYgKGhJQ0MpCi0gICAgICAgIGNtc0Nsb3NlUHJvZmlsZShoSUNDKTsKLQotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNtc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNDcmVhdGVMaW5lYXJpemF0aW9uRGV2aWNlTGluayhjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1RvbmVDdXJ2ZSogY29uc3QgVHJhbnNmZXJGdW5jdGlvbnNbXSkKLXsKLSAgICByZXR1cm4gY21zQ3JlYXRlTGluZWFyaXphdGlvbkRldmljZUxpbmtUSFIoTlVMTCwgQ29sb3JTcGFjZSwgVHJhbnNmZXJGdW5jdGlvbnMpOwotfQotCi0vLyBJbmstbGltaXRpbmcgYWxnb3JpdGhtCi0vLwotLy8gIFN1bSA9IEMgKyBNICsgWSArIEsKLS8vICBJZiBTdW0gPiBJbmtMaW1pdAotLy8gICAgICAgIFJhdGlvPSAxIC0gKFN1bSAtIElua0xpbWl0KSAvIChDICsgTSArIFkpCi0vLyAgICAgICAgaWYgUmF0aW8gPDAKLS8vICAgICAgICAgICAgICBSYXRpbz0wCi0vLyAgICAgICAgZW5kaWYKLS8vICAgICBFbHNlCi0vLyAgICAgICAgIFJhdGlvPTEKLS8vICAgICBlbmRpZgotLy8KLS8vICAgICBDID0gUmF0aW8gKiBDCi0vLyAgICAgTSA9IFJhdGlvICogTQotLy8gICAgIFkgPSBSYXRpbyAqIFkKLS8vICAgICBLOiBEb2VzIG5vdCBjaGFuZ2UKLQotc3RhdGljCi1pbnQgSW5rTGltaXRpbmdTYW1wbGVyKHJlZ2lzdGVyIGNvbnN0IGNtc1VJbnQxNk51bWJlciBJbltdLCByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgT3V0W10sIHJlZ2lzdGVyIHZvaWQqIENhcmdvKQotewotICAgIGNtc0Zsb2F0NjROdW1iZXIgSW5rTGltaXQgPSAqKGNtc0Zsb2F0NjROdW1iZXIgKikgQ2FyZ287Ci0gICAgY21zRmxvYXQ2NE51bWJlciBTdW1DTVksIFN1bUNNWUssIFJhdGlvOwotCi0gICAgSW5rTGltaXQgPSAoSW5rTGltaXQgKiA2NTUuMzUpOwotCi0gICAgU3VtQ01ZICAgPSBJblswXSAgKyBJblsxXSArIEluWzJdOwotICAgIFN1bUNNWUsgID0gU3VtQ01ZICsgSW5bM107Ci0KLSAgICBpZiAoU3VtQ01ZSyA+IElua0xpbWl0KSB7Ci0KLSAgICAgICAgUmF0aW8gPSAxIC0gKChTdW1DTVlLIC0gSW5rTGltaXQpIC8gU3VtQ01ZKTsKLSAgICAgICAgaWYgKFJhdGlvIDwgMCkKLSAgICAgICAgICAgIFJhdGlvID0gMDsKLSAgICB9Ci0gICAgZWxzZSBSYXRpbyA9IDE7Ci0KLSAgICBPdXRbMF0gPSBfY21zUXVpY2tTYXR1cmF0ZVdvcmQoSW5bMF0gKiBSYXRpbyk7ICAgICAvLyBDCi0gICAgT3V0WzFdID0gX2Ntc1F1aWNrU2F0dXJhdGVXb3JkKEluWzFdICogUmF0aW8pOyAgICAgLy8gTQotICAgIE91dFsyXSA9IF9jbXNRdWlja1NhdHVyYXRlV29yZChJblsyXSAqIFJhdGlvKTsgICAgIC8vIFkKLQotICAgIE91dFszXSA9IEluWzNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEsgKHVudG91Y2hlZCkKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vLyBUaGlzIGlzIGEgZGV2aWNlbGluayBvcGVyYXRpbmcgaW4gQ01ZSyBmb3IgaW5rLWxpbWl0aW5nCi0KLWNtc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNDcmVhdGVJbmtMaW1pdGluZ0RldmljZUxpbmtUSFIoY21zQ29udGV4dCBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgQ29sb3JTcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBMaW1pdCkKLXsKLSAgICBjbXNIUFJPRklMRSBoSUNDOwotICAgIGNtc1BpcGVsaW5lKiBMVVQ7Ci0gICAgY21zU3RhZ2UqIENMVVQ7Ci0gICAgaW50IG5DaGFubmVsczsKLQotICAgIGlmIChDb2xvclNwYWNlICE9IGNtc1NpZ0NteWtEYXRhKSB7Ci0gICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfQ09MT1JTUEFDRV9DSEVDSywgIklua0xpbWl0aW5nOiBPbmx5IENNWUsgY3VycmVudGx5IHN1cHBvcnRlZCIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoTGltaXQgPCAwLjAgfHwgTGltaXQgPiA0MDApIHsKLQotICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX1JBTkdFLCAiSW5rTGltaXRpbmc6IExpbWl0IHNob3VsZCBiZSBiZXR3ZWVuIDAuLjQwMCIpOwotICAgICAgICBpZiAoTGltaXQgPCAwKSBMaW1pdCA9IDA7Ci0gICAgICAgIGlmIChMaW1pdCA+IDQwMCkgTGltaXQgPSA0MDA7Ci0KLSAgICB9Ci0KLSAgICBoSUNDID0gY21zQ3JlYXRlUHJvZmlsZVBsYWNlaG9sZGVyKENvbnRleHRJRCk7Ci0gICAgaWYgKCFoSUNDKSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuJ3QgYWxsb2NhdGUKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBjbXNTZXRQcm9maWxlVmVyc2lvbihoSUNDLCA0LjMpOwotCi0gICAgY21zU2V0RGV2aWNlQ2xhc3MoaElDQywgICAgICBjbXNTaWdMaW5rQ2xhc3MpOwotICAgIGNtc1NldENvbG9yU3BhY2UoaElDQywgICAgICAgQ29sb3JTcGFjZSk7Ci0gICAgY21zU2V0UENTKGhJQ0MsICAgICAgICAgICAgICBDb2xvclNwYWNlKTsKLQotICAgIGNtc1NldEhlYWRlclJlbmRlcmluZ0ludGVudChoSUNDLCAgSU5URU5UX1BFUkNFUFRVQUwpOwotCi0KLSAgICAvLyBDcmVhdGVzIGEgUGlwZWxpbmUgd2l0aCAzRCBncmlkIG9ubHkKLSAgICBMVVQgPSBjbXNQaXBlbGluZUFsbG9jKENvbnRleHRJRCwgNCwgNCk7Ci0gICAgaWYgKExVVCA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0KLSAgICBuQ2hhbm5lbHMgPSBjbXNDaGFubmVsc09mKENvbG9yU3BhY2UpOwotCi0gICAgQ0xVVCA9IGNtc1N0YWdlQWxsb2NDTHV0MTZiaXQoQ29udGV4dElELCAxNywgbkNoYW5uZWxzLCBuQ2hhbm5lbHMsIE5VTEwpOwotICAgIGlmIChDTFVUID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLSAgICBpZiAoIWNtc1N0YWdlU2FtcGxlQ0x1dDE2Yml0KENMVVQsIElua0xpbWl0aW5nU2FtcGxlciwgKHZvaWQqKSAmTGltaXQsIDApKSBnb3RvIEVycm9yOwotCi0gICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKExVVCwgY21zQVRfQkVHSU4sIF9jbXNTdGFnZUFsbG9jSWRlbnRpdHlDdXJ2ZXMoQ29udGV4dElELCBuQ2hhbm5lbHMpKSB8fAotICAgICAgICAhY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMVVQsIGNtc0FUX0VORCwgQ0xVVCkgfHwKLSAgICAgICAgIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTFVULCBjbXNBVF9FTkQsIF9jbXNTdGFnZUFsbG9jSWRlbnRpdHlDdXJ2ZXMoQ29udGV4dElELCBuQ2hhbm5lbHMpKSkKLSAgICAgICAgZ290byBFcnJvcjsKLQotICAgIC8vIENyZWF0ZSB0YWdzCi0gICAgaWYgKCFTZXRUZXh0VGFncyhoSUNDLCBMImluay1saW1pdGluZyBidWlsdC1pbiIpKSBnb3RvIEVycm9yOwotCi0gICAgaWYgKCFjbXNXcml0ZVRhZyhoSUNDLCBjbXNTaWdBVG9CMFRhZywgKHZvaWQqKSBMVVQpKSAgZ290byBFcnJvcjsKLSAgICBpZiAoIVNldFNlcURlc2NUYWcoaElDQywgImluay1saW1pdGluZyBidWlsdC1pbiIpKSBnb3RvIEVycm9yOwotCi0gICAgLy8gY21zUGlwZWxpbmUgaXMgYWxyZWFkeSBvbiB2aXJ0dWFsIHByb2ZpbGUKLSAgICBjbXNQaXBlbGluZUZyZWUoTFVUKTsKLQotICAgIC8vIE9rLCBkb25lCi0gICAgcmV0dXJuIGhJQ0M7Ci0KLUVycm9yOgotICAgIGlmIChMVVQgIT0gTlVMTCkKLSAgICAgICAgY21zUGlwZWxpbmVGcmVlKExVVCk7Ci0KLSAgICBpZiAoaElDQyAhPSBOVUxMKQotICAgICAgICBjbXNDbG9zZVByb2ZpbGUoaElDQyk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotY21zSFBST0ZJTEUgQ01TRVhQT1JUIGNtc0NyZWF0ZUlua0xpbWl0aW5nRGV2aWNlTGluayhjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2UsIGNtc0Zsb2F0NjROdW1iZXIgTGltaXQpCi17Ci0gICAgcmV0dXJuIGNtc0NyZWF0ZUlua0xpbWl0aW5nRGV2aWNlTGlua1RIUihOVUxMLCBDb2xvclNwYWNlLCBMaW1pdCk7Ci19Ci0KLQotLy8gQ3JlYXRlcyBhIGZha2UgTGFiIGlkZW50aXR5LgotY21zSFBST0ZJTEUgQ01TRVhQT1JUIGNtc0NyZWF0ZUxhYjJQcm9maWxlVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCBjbXNDSUV4eVkqIFdoaXRlUG9pbnQpCi17Ci0gICAgY21zSFBST0ZJTEUgaFByb2ZpbGU7Ci0gICAgY21zUGlwZWxpbmUqIExVVCA9IE5VTEw7Ci0KLSAgICBoUHJvZmlsZSA9IGNtc0NyZWF0ZVJHQlByb2ZpbGVUSFIoQ29udGV4dElELCBXaGl0ZVBvaW50ID09IE5VTEwgPyBjbXNENTBfeHlZKCkgOiBXaGl0ZVBvaW50LCBOVUxMLCBOVUxMKTsKLSAgICBpZiAoaFByb2ZpbGUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBjbXNTZXRQcm9maWxlVmVyc2lvbihoUHJvZmlsZSwgMi4xKTsKLQotICAgIGNtc1NldERldmljZUNsYXNzKGhQcm9maWxlLCBjbXNTaWdBYnN0cmFjdENsYXNzKTsKLSAgICBjbXNTZXRDb2xvclNwYWNlKGhQcm9maWxlLCAgY21zU2lnTGFiRGF0YSk7Ci0gICAgY21zU2V0UENTKGhQcm9maWxlLCAgICAgICAgIGNtc1NpZ0xhYkRhdGEpOwotCi0gICAgaWYgKCFTZXRUZXh0VGFncyhoUHJvZmlsZSwgTCJMYWIgaWRlbnRpdHkgYnVpbHQtaW4iKSkgcmV0dXJuIE5VTEw7Ci0KLSAgICAvLyBBbiBpZGVudGl0eSBMVVQgaXMgYWxsIHdlIG5lZWQKLSAgICBMVVQgPSBjbXNQaXBlbGluZUFsbG9jKENvbnRleHRJRCwgMywgMyk7Ci0gICAgaWYgKExVVCA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKExVVCwgY21zQVRfQkVHSU4sIF9jbXNTdGFnZUFsbG9jSWRlbnRpdHlDTHV0KENvbnRleHRJRCwgMykpKQotICAgICAgICBnb3RvIEVycm9yOwotCi0gICAgaWYgKCFjbXNXcml0ZVRhZyhoUHJvZmlsZSwgY21zU2lnQVRvQjBUYWcsIExVVCkpIGdvdG8gRXJyb3I7Ci0gICAgY21zUGlwZWxpbmVGcmVlKExVVCk7Ci0KLSAgICByZXR1cm4gaFByb2ZpbGU7Ci0KLUVycm9yOgotCi0gICAgaWYgKExVVCAhPSBOVUxMKQotICAgICAgICBjbXNQaXBlbGluZUZyZWUoTFVUKTsKLQotICAgIGlmIChoUHJvZmlsZSAhPSBOVUxMKQotICAgICAgICBjbXNDbG9zZVByb2ZpbGUoaFByb2ZpbGUpOwotCi0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotY21zSFBST0ZJTEUgQ01TRVhQT1JUIGNtc0NyZWF0ZUxhYjJQcm9maWxlKGNvbnN0IGNtc0NJRXh5WSogV2hpdGVQb2ludCkKLXsKLSAgICByZXR1cm4gY21zQ3JlYXRlTGFiMlByb2ZpbGVUSFIoTlVMTCwgV2hpdGVQb2ludCk7Ci19Ci0KLQotLy8gQ3JlYXRlcyBhIGZha2UgTGFiIFY0IGlkZW50aXR5LgotY21zSFBST0ZJTEUgQ01TRVhQT1JUIGNtc0NyZWF0ZUxhYjRQcm9maWxlVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjb25zdCBjbXNDSUV4eVkqIFdoaXRlUG9pbnQpCi17Ci0gICAgY21zSFBST0ZJTEUgaFByb2ZpbGU7Ci0gICAgY21zUGlwZWxpbmUqIExVVCA9IE5VTEw7Ci0KLSAgICBoUHJvZmlsZSA9IGNtc0NyZWF0ZVJHQlByb2ZpbGVUSFIoQ29udGV4dElELCBXaGl0ZVBvaW50ID09IE5VTEwgPyBjbXNENTBfeHlZKCkgOiBXaGl0ZVBvaW50LCBOVUxMLCBOVUxMKTsKLSAgICBpZiAoaFByb2ZpbGUgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICBjbXNTZXRQcm9maWxlVmVyc2lvbihoUHJvZmlsZSwgNC4zKTsKLQotICAgIGNtc1NldERldmljZUNsYXNzKGhQcm9maWxlLCBjbXNTaWdBYnN0cmFjdENsYXNzKTsKLSAgICBjbXNTZXRDb2xvclNwYWNlKGhQcm9maWxlLCAgY21zU2lnTGFiRGF0YSk7Ci0gICAgY21zU2V0UENTKGhQcm9maWxlLCAgICAgICAgIGNtc1NpZ0xhYkRhdGEpOwotCi0gICAgaWYgKCFTZXRUZXh0VGFncyhoUHJvZmlsZSwgTCJMYWIgaWRlbnRpdHkgYnVpbHQtaW4iKSkgZ290byBFcnJvcjsKLQotICAgIC8vIEFuIGVtcHR5IExVVHMgaXMgYWxsIHdlIG5lZWQKLSAgICBMVVQgPSBjbXNQaXBlbGluZUFsbG9jKENvbnRleHRJRCwgMywgMyk7Ci0gICAgaWYgKExVVCA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKExVVCwgY21zQVRfQkVHSU4sIF9jbXNTdGFnZUFsbG9jSWRlbnRpdHlDdXJ2ZXMoQ29udGV4dElELCAzKSkpCi0gICAgICAgIGdvdG8gRXJyb3I7Ci0KLSAgICBpZiAoIWNtc1dyaXRlVGFnKGhQcm9maWxlLCBjbXNTaWdBVG9CMFRhZywgTFVUKSkgZ290byBFcnJvcjsKLSAgICBjbXNQaXBlbGluZUZyZWUoTFVUKTsKLQotICAgIHJldHVybiBoUHJvZmlsZTsKLQotRXJyb3I6Ci0KLSAgICBpZiAoTFVUICE9IE5VTEwpCi0gICAgICAgIGNtc1BpcGVsaW5lRnJlZShMVVQpOwotCi0gICAgaWYgKGhQcm9maWxlICE9IE5VTEwpCi0gICAgICAgIGNtc0Nsb3NlUHJvZmlsZShoUHJvZmlsZSk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotY21zSFBST0ZJTEUgQ01TRVhQT1JUIGNtc0NyZWF0ZUxhYjRQcm9maWxlKGNvbnN0IGNtc0NJRXh5WSogV2hpdGVQb2ludCkKLXsKLSAgICByZXR1cm4gY21zQ3JlYXRlTGFiNFByb2ZpbGVUSFIoTlVMTCwgV2hpdGVQb2ludCk7Ci19Ci0KLQotLy8gQ3JlYXRlcyBhIGZha2UgWFlaIGlkZW50aXR5Ci1jbXNIUFJPRklMRSBDTVNFWFBPUlQgY21zQ3JlYXRlWFlaUHJvZmlsZVRIUihjbXNDb250ZXh0IENvbnRleHRJRCkKLXsKLSAgICBjbXNIUFJPRklMRSBoUHJvZmlsZTsKLSAgICBjbXNQaXBlbGluZSogTFVUID0gTlVMTDsKLQotICAgIGhQcm9maWxlID0gY21zQ3JlYXRlUkdCUHJvZmlsZVRIUihDb250ZXh0SUQsIGNtc0Q1MF94eVkoKSwgTlVMTCwgTlVMTCk7Ci0gICAgaWYgKGhQcm9maWxlID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgY21zU2V0UHJvZmlsZVZlcnNpb24oaFByb2ZpbGUsIDQuMyk7Ci0KLSAgICBjbXNTZXREZXZpY2VDbGFzcyhoUHJvZmlsZSwgY21zU2lnQWJzdHJhY3RDbGFzcyk7Ci0gICAgY21zU2V0Q29sb3JTcGFjZShoUHJvZmlsZSwgIGNtc1NpZ1hZWkRhdGEpOwotICAgIGNtc1NldFBDUyhoUHJvZmlsZSwgICAgICAgICBjbXNTaWdYWVpEYXRhKTsKLQotICAgIGlmICghU2V0VGV4dFRhZ3MoaFByb2ZpbGUsIEwiWFlaIGlkZW50aXR5IGJ1aWx0LWluIikpIGdvdG8gRXJyb3I7Ci0KLSAgICAvLyBBbiBpZGVudGl0eSBMVVQgaXMgYWxsIHdlIG5lZWQKLSAgICBMVVQgPSBjbXNQaXBlbGluZUFsbG9jKENvbnRleHRJRCwgMywgMyk7Ci0gICAgaWYgKExVVCA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKExVVCwgY21zQVRfQkVHSU4sIF9jbXNTdGFnZUFsbG9jSWRlbnRpdHlDdXJ2ZXMoQ29udGV4dElELCAzKSkpCi0gICAgICAgIGdvdG8gRXJyb3I7Ci0KLSAgICBpZiAoIWNtc1dyaXRlVGFnKGhQcm9maWxlLCBjbXNTaWdBVG9CMFRhZywgTFVUKSkgZ290byBFcnJvcjsKLSAgICBjbXNQaXBlbGluZUZyZWUoTFVUKTsKLQotICAgIHJldHVybiBoUHJvZmlsZTsKLQotRXJyb3I6Ci0KLSAgICBpZiAoTFVUICE9IE5VTEwpCi0gICAgICAgIGNtc1BpcGVsaW5lRnJlZShMVVQpOwotCi0gICAgaWYgKGhQcm9maWxlICE9IE5VTEwpCi0gICAgICAgIGNtc0Nsb3NlUHJvZmlsZShoUHJvZmlsZSk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotCi1jbXNIUFJPRklMRSBDTVNFWFBPUlQgY21zQ3JlYXRlWFlaUHJvZmlsZSh2b2lkKQotewotICAgIHJldHVybiBjbXNDcmVhdGVYWVpQcm9maWxlVEhSKE5VTEwpOwotfQotCi0KLS8vc1JHQiBDdXJ2ZXMgYXJlIGRlZmluZWQgYnk6Ci0vLwotLy9JZiAgUidzUkdCLEcnc1JHQiwgQidzUkdCIDwgMC4wNDA0NQotLy8KLS8vICAgIFIgPSAgUidzUkdCIC8gMTIuOTIKLS8vICAgIEcgPSAgRydzUkdCIC8gMTIuOTIKLS8vICAgIEIgPSAgQidzUkdCIC8gMTIuOTIKLS8vCi0vLwotLy9lbHNlIGlmICBSJ3NSR0IsRydzUkdCLCBCJ3NSR0IgPj0gMC4wNDA0NQotLy8KLS8vICAgIFIgPSAoKFInc1JHQiArIDAuMDU1KSAvIDEuMDU1KV4yLjQKLS8vICAgIEcgPSAoKEcnc1JHQiArIDAuMDU1KSAvIDEuMDU1KV4yLjQKLS8vICAgIEIgPSAoKEInc1JHQiArIDAuMDU1KSAvIDEuMDU1KV4yLjQKLQotc3RhdGljCi1jbXNUb25lQ3VydmUqIEJ1aWxkX3NSR0JHYW1tYShjbXNDb250ZXh0IENvbnRleHRJRCkKLXsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIFBhcmFtZXRlcnNbNV07Ci0KLSAgICBQYXJhbWV0ZXJzWzBdID0gMi40OwotICAgIFBhcmFtZXRlcnNbMV0gPSAxLiAvIDEuMDU1OwotICAgIFBhcmFtZXRlcnNbMl0gPSAwLjA1NSAvIDEuMDU1OwotICAgIFBhcmFtZXRlcnNbM10gPSAxLiAvIDEyLjkyOwotICAgIFBhcmFtZXRlcnNbNF0gPSAwLjA0MDQ1OwotCi0gICAgcmV0dXJuIGNtc0J1aWxkUGFyYW1ldHJpY1RvbmVDdXJ2ZShDb250ZXh0SUQsIDQsIFBhcmFtZXRlcnMpOwotfQotCi0vLyBDcmVhdGUgdGhlIElDQyB2aXJ0dWFsIHByb2ZpbGUgZm9yIHNSR0Igc3BhY2UKLWNtc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNDcmVhdGVfc1JHQlByb2ZpbGVUSFIoY21zQ29udGV4dCBDb250ZXh0SUQpCi17Ci0gICAgICAgY21zQ0lFeHlZICAgICAgIEQ2NTsKLSAgICAgICBjbXNDSUV4eVlUUklQTEUgUmVjNzA5UHJpbWFyaWVzID0gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MC42NDAwLCAwLjMzMDAsIDEuMH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswLjMwMDAsIDAuNjAwMCwgMS4wfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAuMTUwMCwgMC4wNjAwLCAxLjB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgY21zVG9uZUN1cnZlKiBHYW1tYTIyWzNdOwotICAgICAgIGNtc0hQUk9GSUxFICBoc1JHQjsKLQotICAgICAgIGNtc1doaXRlUG9pbnRGcm9tVGVtcCgmRDY1LCA2NTA0KTsKLSAgICAgICBHYW1tYTIyWzBdID0gR2FtbWEyMlsxXSA9IEdhbW1hMjJbMl0gPSBCdWlsZF9zUkdCR2FtbWEoQ29udGV4dElEKTsKLSAgICAgICBpZiAoR2FtbWEyMlswXSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICAgICAgIGhzUkdCID0gY21zQ3JlYXRlUkdCUHJvZmlsZVRIUihDb250ZXh0SUQsICZENjUsICZSZWM3MDlQcmltYXJpZXMsIEdhbW1hMjIpOwotICAgICAgIGNtc0ZyZWVUb25lQ3VydmUoR2FtbWEyMlswXSk7Ci0gICAgICAgaWYgKGhzUkdCID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgICAgaWYgKCFTZXRUZXh0VGFncyhoc1JHQiwgTCJzUkdCIGJ1aWx0LWluIikpIHsKLSAgICAgICAgICAgY21zQ2xvc2VQcm9maWxlKGhzUkdCKTsKLSAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgfQotCi0gICAgICAgcmV0dXJuIGhzUkdCOwotfQotCi1jbXNIUFJPRklMRSBDTVNFWFBPUlQgY21zQ3JlYXRlX3NSR0JQcm9maWxlKHZvaWQpCi17Ci0gICAgcmV0dXJuIGNtc0NyZWF0ZV9zUkdCUHJvZmlsZVRIUihOVUxMKTsKLX0KLQotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEJyaWdodG5lc3M7Ci0gICAgICAgICAgICAgICAgY21zRmxvYXQ2NE51bWJlciBDb250cmFzdDsKLSAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEh1ZTsKLSAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIFNhdHVyYXRpb247Ci0gICAgICAgICAgICAgICAgY21zQ0lFWFlaIFdQc3JjLCBXUGRlc3Q7Ci0KLX0gQkNIU1dBREpVU1RTLCAqTFBCQ0hTV0FESlVTVFM7Ci0KLQotc3RhdGljCi1pbnQgYmNoc3dTYW1wbGVyKHJlZ2lzdGVyIGNvbnN0IGNtc1VJbnQxNk51bWJlciBJbltdLCByZWdpc3RlciBjbXNVSW50MTZOdW1iZXIgT3V0W10sIHJlZ2lzdGVyIHZvaWQqIENhcmdvKQotewotICAgIGNtc0NJRUxhYiBMYWJJbiwgTGFiT3V0OwotICAgIGNtc0NJRUxDaCBMQ2hJbiwgTENoT3V0OwotICAgIGNtc0NJRVhZWiBYWVo7Ci0gICAgTFBCQ0hTV0FESlVTVFMgYmNoc3cgPSAoTFBCQ0hTV0FESlVTVFMpIENhcmdvOwotCi0KLSAgICBjbXNMYWJFbmNvZGVkMkZsb2F0KCZMYWJJbiwgSW4pOwotCi0KLSAgICBjbXNMYWIyTENoKCZMQ2hJbiwgJkxhYkluKTsKLQotICAgIC8vIERvIHNvbWUgYWRqdXN0cyBvbiBMQ2gKLQotICAgIExDaE91dC5MID0gTENoSW4uTCAqIGJjaHN3IC0+Q29udHJhc3QgKyBiY2hzdyAtPkJyaWdodG5lc3M7Ci0gICAgTENoT3V0LkMgPSBMQ2hJbi5DICsgYmNoc3cgLT4gU2F0dXJhdGlvbjsKLSAgICBMQ2hPdXQuaCA9IExDaEluLmggKyBiY2hzdyAtPiBIdWU7Ci0KLQotICAgIGNtc0xDaDJMYWIoJkxhYk91dCwgJkxDaE91dCk7Ci0KLSAgICAvLyBNb3ZlIHdoaXRlIHBvaW50IGluIExhYgotCi0gICAgY21zTGFiMlhZWigmYmNoc3cgLT5XUHNyYywgICZYWVosICZMYWJPdXQpOwotICAgIGNtc1hZWjJMYWIoJmJjaHN3IC0+V1BkZXN0LCAmTGFiT3V0LCAmWFlaKTsKLQotICAgIC8vIEJhY2sgdG8gZW5jb2RlZAotCi0gICAgY21zRmxvYXQyTGFiRW5jb2RlZChPdXQsICZMYWJPdXQpOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLy8gQ3JlYXRlcyBhbiBhYnN0cmFjdCBwcm9maWxlIG9wZXJhdGluZyBpbiBMYWIgc3BhY2UgZm9yIEJyaWdodG5lc3MsCi0vLyBjb250cmFzdCwgU2F0dXJhdGlvbiBhbmQgd2hpdGUgcG9pbnQgZGlzcGxhY2VtZW50Ci0KLWNtc0hQUk9GSUxFIENNU0VYUE9SVCBjbXNDcmVhdGVCQ0hTV2Fic3RyYWN0UHJvZmlsZVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwKLSAgICBpbnQgbkxVVFBvaW50cywKLSAgICBjbXNGbG9hdDY0TnVtYmVyIEJyaWdodCwKLSAgICBjbXNGbG9hdDY0TnVtYmVyIENvbnRyYXN0LAotICAgIGNtc0Zsb2F0NjROdW1iZXIgSHVlLAotICAgIGNtc0Zsb2F0NjROdW1iZXIgU2F0dXJhdGlvbiwKLSAgICBpbnQgVGVtcFNyYywKLSAgICBpbnQgVGVtcERlc3QpCi17Ci0gICAgY21zSFBST0ZJTEUgaElDQzsKLSAgICBjbXNQaXBlbGluZSogUGlwZWxpbmU7Ci0gICAgQkNIU1dBREpVU1RTIGJjaHN3OwotICAgIGNtc0NJRXh5WSBXaGl0ZVBudDsKLSAgICBjbXNTdGFnZSogQ0xVVDsKLSAgICBjbXNVSW50MzJOdW1iZXIgRGltZW5zaW9uc1tNQVhfSU5QVVRfRElNRU5TSU9OU107Ci0gICAgaW50IGk7Ci0KLSAgICBiY2hzdy5CcmlnaHRuZXNzID0gQnJpZ2h0OwotICAgIGJjaHN3LkNvbnRyYXN0ICAgPSBDb250cmFzdDsKLSAgICBiY2hzdy5IdWUgICAgICAgID0gSHVlOwotICAgIGJjaHN3LlNhdHVyYXRpb24gPSBTYXR1cmF0aW9uOwotCi0gICAgY21zV2hpdGVQb2ludEZyb21UZW1wKCZXaGl0ZVBudCwgVGVtcFNyYyApOwotICAgIGNtc3h5WTJYWVooJmJjaHN3LldQc3JjLCAmV2hpdGVQbnQpOwotCi0gICAgY21zV2hpdGVQb2ludEZyb21UZW1wKCZXaGl0ZVBudCwgVGVtcERlc3QpOwotICAgIGNtc3h5WTJYWVooJmJjaHN3LldQZGVzdCwgJldoaXRlUG50KTsKLQotICAgIGhJQ0MgPSBjbXNDcmVhdGVQcm9maWxlUGxhY2Vob2xkZXIoQ29udGV4dElEKTsKLSAgICBpZiAoIWhJQ0MpICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW4ndCBhbGxvY2F0ZQotICAgICAgICByZXR1cm4gTlVMTDsKLQotCi0gICAgY21zU2V0RGV2aWNlQ2xhc3MoaElDQywgICAgICBjbXNTaWdBYnN0cmFjdENsYXNzKTsKLSAgICBjbXNTZXRDb2xvclNwYWNlKGhJQ0MsICAgICAgIGNtc1NpZ0xhYkRhdGEpOwotICAgIGNtc1NldFBDUyhoSUNDLCAgICAgICAgICAgICAgY21zU2lnTGFiRGF0YSk7Ci0KLSAgICBjbXNTZXRIZWFkZXJSZW5kZXJpbmdJbnRlbnQoaElDQywgIElOVEVOVF9QRVJDRVBUVUFMKTsKLQotICAgIC8vIENyZWF0ZXMgYSBQaXBlbGluZSB3aXRoIDNEIGdyaWQgb25seQotICAgIFBpcGVsaW5lID0gY21zUGlwZWxpbmVBbGxvYyhDb250ZXh0SUQsIDMsIDMpOwotICAgIGlmIChQaXBlbGluZSA9PSBOVUxMKSB7Ci0gICAgICAgIGNtc0Nsb3NlUHJvZmlsZShoSUNDKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgZm9yIChpPTA7IGkgPCBNQVhfSU5QVVRfRElNRU5TSU9OUzsgaSsrKSBEaW1lbnNpb25zW2ldID0gbkxVVFBvaW50czsKLSAgICBDTFVUID0gY21zU3RhZ2VBbGxvY0NMdXQxNmJpdEdyYW51bGFyKENvbnRleHRJRCwgRGltZW5zaW9ucywgMywgMywgTlVMTCk7Ci0gICAgaWYgKENMVVQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLQotICAgIGlmICghY21zU3RhZ2VTYW1wbGVDTHV0MTZiaXQoQ0xVVCwgYmNoc3dTYW1wbGVyLCAodm9pZCopICZiY2hzdywgMCkpIHsKLQotICAgICAgICAvLyBTaG91bGRuJ3QgcmVhY2ggaGVyZQotICAgICAgICBnb3RvIEVycm9yOwotICAgIH0KLQotICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShQaXBlbGluZSwgY21zQVRfRU5ELCBDTFVUKSkgewotICAgICAgICBnb3RvIEVycm9yOwotICAgIH0KLQotICAgIC8vIENyZWF0ZSB0YWdzCi0gICAgaWYgKCFTZXRUZXh0VGFncyhoSUNDLCBMIkJDSFMgYnVpbHQtaW4iKSkgcmV0dXJuIE5VTEw7Ci0KLSAgICBjbXNXcml0ZVRhZyhoSUNDLCBjbXNTaWdNZWRpYVdoaXRlUG9pbnRUYWcsICh2b2lkKikgY21zRDUwX1hZWigpKTsKLQotICAgIGNtc1dyaXRlVGFnKGhJQ0MsIGNtc1NpZ0FUb0IwVGFnLCAodm9pZCopIFBpcGVsaW5lKTsKLQotICAgIC8vIFBpcGVsaW5lIGlzIGFscmVhZHkgb24gdmlydHVhbCBwcm9maWxlCi0gICAgY21zUGlwZWxpbmVGcmVlKFBpcGVsaW5lKTsKLQotICAgIC8vIE9rLCBkb25lCi0gICAgcmV0dXJuIGhJQ0M7Ci0KLUVycm9yOgotICAgIGNtc1BpcGVsaW5lRnJlZShQaXBlbGluZSk7Ci0gICAgY21zQ2xvc2VQcm9maWxlKGhJQ0MpOwotICAgIHJldHVybiBOVUxMOwotfQotCi0KLUNNU0FQSSBjbXNIUFJPRklMRSAgIENNU0VYUE9SVCBjbXNDcmVhdGVCQ0hTV2Fic3RyYWN0UHJvZmlsZShpbnQgbkxVVFBvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIEJyaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIENvbnRyYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgSHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgU2F0dXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgVGVtcFNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgVGVtcERlc3QpCi17Ci0gICAgcmV0dXJuIGNtc0NyZWF0ZUJDSFNXYWJzdHJhY3RQcm9maWxlVEhSKE5VTEwsIG5MVVRQb2ludHMsIEJyaWdodCwgQ29udHJhc3QsIEh1ZSwgU2F0dXJhdGlvbiwgVGVtcFNyYywgVGVtcERlc3QpOwotfQotCi0KLS8vIENyZWF0ZXMgYSBmYWtlIE5VTEwgcHJvZmlsZS4gVGhpcyBwcm9maWxlIHJldHVybiAxIGNoYW5uZWwgYXMgYWx3YXlzIDAuCi0vLyBJcyB1c2VmdWwgb25seSBmb3IgZ2FtdXQgY2hlY2tpbmcgdHJpY2tzCi1jbXNIUFJPRklMRSBDTVNFWFBPUlQgY21zQ3JlYXRlTlVMTFByb2ZpbGVUSFIoY21zQ29udGV4dCBDb250ZXh0SUQpCi17Ci0gICAgY21zSFBST0ZJTEUgaFByb2ZpbGU7Ci0gICAgY21zUGlwZWxpbmUqIExVVCA9IE5VTEw7Ci0gICAgY21zU3RhZ2UqIFBvc3RMaW47Ci0gICAgY21zVG9uZUN1cnZlKiBFbXB0eVRhYjsKLSAgICBjbXNVSW50MTZOdW1iZXIgWmVyb1syXSA9IHsgMCwgMCB9OwotCi0gICAgaFByb2ZpbGUgPSBjbXNDcmVhdGVQcm9maWxlUGxhY2Vob2xkZXIoQ29udGV4dElEKTsKLSAgICBpZiAoIWhQcm9maWxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FuJ3QgYWxsb2NhdGUKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBjbXNTZXRQcm9maWxlVmVyc2lvbihoUHJvZmlsZSwgNC4zKTsKLQotICAgIGlmICghU2V0VGV4dFRhZ3MoaFByb2ZpbGUsIEwiTlVMTCBwcm9maWxlIGJ1aWx0LWluIikpIGdvdG8gRXJyb3I7Ci0KLQotCi0gICAgY21zU2V0RGV2aWNlQ2xhc3MoaFByb2ZpbGUsIGNtc1NpZ091dHB1dENsYXNzKTsKLSAgICBjbXNTZXRDb2xvclNwYWNlKGhQcm9maWxlLCAgY21zU2lnR3JheURhdGEpOwotICAgIGNtc1NldFBDUyhoUHJvZmlsZSwgICAgICAgICBjbXNTaWdMYWJEYXRhKTsKLQotICAgIC8vIEFuIGVtcHR5IExVVHMgaXMgYWxsIHdlIG5lZWQKLSAgICBMVVQgPSBjbXNQaXBlbGluZUFsbG9jKENvbnRleHRJRCwgMSwgMSk7Ci0gICAgaWYgKExVVCA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgRW1wdHlUYWIgPSBjbXNCdWlsZFRhYnVsYXRlZFRvbmVDdXJ2ZTE2KENvbnRleHRJRCwgMiwgWmVybyk7Ci0gICAgUG9zdExpbiA9IGNtc1N0YWdlQWxsb2NUb25lQ3VydmVzKENvbnRleHRJRCwgMSwgJkVtcHR5VGFiKTsKLSAgICBjbXNGcmVlVG9uZUN1cnZlKEVtcHR5VGFiKTsKLQotICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMVVQsIGNtc0FUX0VORCwgUG9zdExpbikpCi0gICAgICAgIGdvdG8gRXJyb3I7Ci0KLSAgICBpZiAoIWNtc1dyaXRlVGFnKGhQcm9maWxlLCBjbXNTaWdCVG9BMFRhZywgKHZvaWQqKSBMVVQpKSBnb3RvIEVycm9yOwotICAgIGlmICghY21zV3JpdGVUYWcoaFByb2ZpbGUsIGNtc1NpZ01lZGlhV2hpdGVQb2ludFRhZywgY21zRDUwX1hZWigpKSkgZ290byBFcnJvcjsKLQotICAgIGNtc1BpcGVsaW5lRnJlZShMVVQpOwotICAgIHJldHVybiBoUHJvZmlsZTsKLQotRXJyb3I6Ci0KLSAgICBpZiAoTFVUICE9IE5VTEwpCi0gICAgICAgIGNtc1BpcGVsaW5lRnJlZShMVVQpOwotCi0gICAgaWYgKGhQcm9maWxlICE9IE5VTEwpCi0gICAgICAgIGNtc0Nsb3NlUHJvZmlsZShoUHJvZmlsZSk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotY21zSFBST0ZJTEUgQ01TRVhQT1JUIGNtc0NyZWF0ZU5VTExQcm9maWxlKHZvaWQpCi17Ci0gICAgcmV0dXJuIGNtc0NyZWF0ZU5VTExQcm9maWxlVEhSKE5VTEwpOwotfQotCi0KLXN0YXRpYwotaW50IElzUENTKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgQ29sb3JTcGFjZSkKLXsKLSAgICByZXR1cm4gKENvbG9yU3BhY2UgPT0gY21zU2lnWFlaRGF0YSB8fAotICAgICAgICAgICAgQ29sb3JTcGFjZSA9PSBjbXNTaWdMYWJEYXRhKTsKLX0KLQotCi1zdGF0aWMKLXZvaWQgRml4Q29sb3JTcGFjZXMoY21zSFBST0ZJTEUgaFByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIENvbG9yU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNDb2xvclNwYWNlU2lnbmF0dXJlIFBDUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBkd0ZsYWdzKQotewotICAgIGlmIChkd0ZsYWdzICYgY21zRkxBR1NfR1VFU1NERVZJQ0VDTEFTUykgewotCi0gICAgICAgICAgICBpZiAoSXNQQ1MoQ29sb3JTcGFjZSkgJiYgSXNQQ1MoUENTKSkgewotCi0gICAgICAgICAgICAgICAgICAgIGNtc1NldERldmljZUNsYXNzKGhQcm9maWxlLCAgICAgIGNtc1NpZ0Fic3RyYWN0Q2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBjbXNTZXRDb2xvclNwYWNlKGhQcm9maWxlLCAgICAgICBDb2xvclNwYWNlKTsKLSAgICAgICAgICAgICAgICAgICAgY21zU2V0UENTKGhQcm9maWxlLCAgICAgICAgICAgICAgUENTKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoSXNQQ1MoQ29sb3JTcGFjZSkgJiYgIUlzUENTKFBDUykpIHsKLQotICAgICAgICAgICAgICAgICAgICBjbXNTZXREZXZpY2VDbGFzcyhoUHJvZmlsZSwgY21zU2lnT3V0cHV0Q2xhc3MpOwotICAgICAgICAgICAgICAgICAgICBjbXNTZXRQQ1MoaFByb2ZpbGUsICAgICAgICAgQ29sb3JTcGFjZSk7Ci0gICAgICAgICAgICAgICAgICAgIGNtc1NldENvbG9yU3BhY2UoaFByb2ZpbGUsICBQQ1MpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChJc1BDUyhQQ1MpICYmICFJc1BDUyhDb2xvclNwYWNlKSkgewotCi0gICAgICAgICAgICAgICAgICAgY21zU2V0RGV2aWNlQ2xhc3MoaFByb2ZpbGUsICBjbXNTaWdJbnB1dENsYXNzKTsKLSAgICAgICAgICAgICAgICAgICBjbXNTZXRDb2xvclNwYWNlKGhQcm9maWxlLCAgIENvbG9yU3BhY2UpOwotICAgICAgICAgICAgICAgICAgIGNtc1NldFBDUyhoUHJvZmlsZSwgICAgICAgICAgUENTKTsKLSAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgfQotCi0gICAgY21zU2V0RGV2aWNlQ2xhc3MoaFByb2ZpbGUsICAgICAgY21zU2lnTGlua0NsYXNzKTsKLSAgICBjbXNTZXRDb2xvclNwYWNlKGhQcm9maWxlLCAgICAgICBDb2xvclNwYWNlKTsKLSAgICBjbXNTZXRQQ1MoaFByb2ZpbGUsICAgICAgICAgICAgICBQQ1MpOwotfQotCi0KLQotLy8gVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgbmFtZWQgY29sb3IgcHJvZmlsZSBkdW1waW5nIGFsbCB0aGUgY29udGVudHMgb2YgdHJhbnNmb3JtIHRvIGEgc2luZ2xlIHByb2ZpbGUKLS8vIEluIHRoaXMgd2F5LCBMaXR0bGVDTVMgbWF5IGJlIHVzZWQgdG8gImdyb3VwIiBzZXZlcmFsIG5hbWVkIGNvbG9yIGRhdGFiYXNlcyBpbnRvIGEgc2luZ2xlIHByb2ZpbGUuCi0vLyBJdCBoYXMsIGhvd2V2ZXIsIHNldmVyYWwgbWlub3IgbGltaXRhdGlvbnMuIFBDUyBpcyBhbHdheXMgTGFiLCB3aGljaCBpcyBub3QgdmVyeSBjcml0aWMgc2luY2UgdGhpcwotLy8gaXMgdGhlIG5vcm1hbCBQQ1MgZm9yIG5hbWVkIGNvbG9yIHByb2ZpbGVzLgotc3RhdGljCi1jbXNIUFJPRklMRSBDcmVhdGVOYW1lZENvbG9yRGV2aWNlbGluayhjbXNIVFJBTlNGT1JNIHhmb3JtKQotewotICAgIF9jbXNUUkFOU0ZPUk0qIHYgPSAoX2Ntc1RSQU5TRk9STSopIHhmb3JtOwotICAgIGNtc0hQUk9GSUxFIGhJQ0MgPSBOVUxMOwotICAgIGludCBpLCBuQ29sb3JzOwotICAgIGNtc05BTUVEQ09MT1JMSVNUICpuYzIgPSBOVUxMLCAqT3JpZ2luYWwgPSBOVUxMOwotCi0gICAgLy8gQ3JlYXRlIGFuIGVtcHR5IHBsYWNlaG9sZGVyCi0gICAgaElDQyA9IGNtc0NyZWF0ZVByb2ZpbGVQbGFjZWhvbGRlcih2LT5Db250ZXh0SUQpOwotICAgIGlmIChoSUNDID09IE5VTEwpIHJldHVybiBOVUxMOwotCi0gICAgLy8gQ3JpdGljYWwgaW5mb3JtYXRpb24KLSAgICBjbXNTZXREZXZpY2VDbGFzcyhoSUNDLCBjbXNTaWdOYW1lZENvbG9yQ2xhc3MpOwotICAgIGNtc1NldENvbG9yU3BhY2UoaElDQywgdiAtPkV4aXRDb2xvclNwYWNlKTsKLSAgICBjbXNTZXRQQ1MoaElDQywgY21zU2lnTGFiRGF0YSk7Ci0KLSAgICAvLyBUYWcgcHJvZmlsZSB3aXRoIGluZm9ybWF0aW9uCi0gICAgaWYgKCFTZXRUZXh0VGFncyhoSUNDLCBMIk5hbWVkIGNvbG9yIGRldmljZWxpbmsiKSkgZ290byBFcnJvcjsKLQotICAgIE9yaWdpbmFsID0gY21zR2V0TmFtZWRDb2xvckxpc3QoeGZvcm0pOwotICAgIGlmIChPcmlnaW5hbCA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gICAgbkNvbG9ycyA9IGNtc05hbWVkQ29sb3JDb3VudChPcmlnaW5hbCk7Ci0gICAgbmMyICAgICA9IGNtc0R1cE5hbWVkQ29sb3JMaXN0KE9yaWdpbmFsKTsKLSAgICBpZiAobmMyID09IE5VTEwpIGdvdG8gRXJyb3I7Ci0KLSAgICAvLyBDb2xvcmFudCBjb3VudCBub3cgZGVwZW5kcyBvbiB0aGUgb3V0cHV0IHNwYWNlCi0gICAgbmMyIC0+Q29sb3JhbnRDb3VudCA9IGNtc1BpcGVsaW5lT3V0cHV0Q2hhbm5lbHModiAtPkx1dCk7Ci0KLSAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBwcm9wZXIgZm9ybWF0dGVycwotICAgIGNtc0NoYW5nZUJ1ZmZlcnNGb3JtYXQoeGZvcm0sIFRZUEVfTkFNRURfQ09MT1JfSU5ERVgsCi0gICAgICAgIEZMT0FUX1NIKDApIHwgQ09MT1JTUEFDRV9TSChfY21zTENNU2NvbG9yU3BhY2UodiAtPkV4aXRDb2xvclNwYWNlKSkKLSAgICAgICAgfCBCWVRFU19TSCgyKSB8IENIQU5ORUxTX1NIKGNtc0NoYW5uZWxzT2YodiAtPkV4aXRDb2xvclNwYWNlKSkpOwotCi0gICAgLy8gQXBwbHkgdGhlIHRyYW5zZm9yIHRvIGNvbG9yYW50cy4KLSAgICBmb3IgKGk9MDsgaSA8IG5Db2xvcnM7IGkrKykgewotICAgICAgICBjbXNEb1RyYW5zZm9ybSh4Zm9ybSwgJmksIG5jMiAtPkxpc3RbaV0uRGV2aWNlQ29sb3JhbnQsIDEpOwotICAgIH0KLQotICAgIGlmICghY21zV3JpdGVUYWcoaElDQywgY21zU2lnTmFtZWRDb2xvcjJUYWcsICh2b2lkKikgbmMyKSkgZ290byBFcnJvcjsKLSAgICBjbXNGcmVlTmFtZWRDb2xvckxpc3QobmMyKTsKLQotICAgIHJldHVybiBoSUNDOwotCi1FcnJvcjoKLSAgICBpZiAoaElDQyAhPSBOVUxMKSBjbXNDbG9zZVByb2ZpbGUoaElDQyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLQotLy8gVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggTVBVIGNhbiBiZSBzdG9yZWQgb24gYSBwcm9maWxlIGJhc2VkIG9uIHRoZSB2ZXJzaW9uCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgICBjbXNCb29sICAgICAgICAgICAgICBJc1Y0OyAgICAgICAgICAgICAvLyBJcyBhIFY0IHRhZz8KLSAgICBjbXNUYWdTaWduYXR1cmUgICAgICBSZXF1aXJlZFRhZzsgICAgICAvLyBTZXQgdG8gMCBmb3IgYm90aCB0eXBlcwotICAgIGNtc1RhZ1R5cGVTaWduYXR1cmUgIEx1dFR5cGU7ICAgICAgICAgIC8vIFRoZSBMVVQgdHlwZQotICAgIGludCAgICAgICAgICAgICAgICAgIG5UeXBlczsgICAgICAgICAgIC8vIE51bWJlciBvZiB0eXBlcyAodXAgdG8gNSkKLSAgICBjbXNTdGFnZVNpZ25hdHVyZSAgICBNcGVUeXBlc1s1XTsgICAgICAvLyA1IGlzIHRoZSBtYXhpbXVtIG51bWJlcgotCi19IGNtc0FsbG93ZWRMVVQ7Ci0KLXN0YXRpYyBjb25zdCBjbXNBbGxvd2VkTFVUIEFsbG93ZWRMVVRUeXBlc1tdID0gewotCi0gICAgeyBGQUxTRSwgMCwgICAgICAgICAgICAgIGNtc1NpZ0x1dDE2VHlwZSwgICAgNCwgIHsgY21zU2lnTWF0cml4RWxlbVR5cGUsICAgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgY21zU2lnQ0x1dEVsZW1UeXBlLCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlfX0sCi0gICAgeyBGQUxTRSwgMCwgICAgICAgICAgICAgIGNtc1NpZ0x1dDE2VHlwZSwgICAgMywgIHsgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgY21zU2lnQ0x1dEVsZW1UeXBlLCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlfX0sCi0gICAgeyBGQUxTRSwgMCwgICAgICAgICAgICAgIGNtc1NpZ0x1dDE2VHlwZSwgICAgMiwgIHsgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgY21zU2lnQ0x1dEVsZW1UeXBlfX0sCi0gICAgeyBUUlVFICwgMCwgICAgICAgICAgICAgIGNtc1NpZ0x1dEF0b0JUeXBlLCAgMSwgIHsgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSB9fSwKLSAgICB7IFRSVUUgLCBjbXNTaWdBVG9CMFRhZywgY21zU2lnTHV0QXRvQlR5cGUsICAzLCAgeyBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLCBjbXNTaWdNYXRyaXhFbGVtVHlwZSwgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSB9IH0sCi0gICAgeyBUUlVFICwgY21zU2lnQVRvQjBUYWcsIGNtc1NpZ0x1dEF0b0JUeXBlLCAgMywgIHsgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgY21zU2lnQ0x1dEVsZW1UeXBlLCBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlICAgfSB9LAotICAgIHsgVFJVRSAsIGNtc1NpZ0FUb0IwVGFnLCBjbXNTaWdMdXRBdG9CVHlwZSwgIDUsICB7IGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsIGNtc1NpZ0NMdXRFbGVtVHlwZSwgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgY21zU2lnTWF0cml4RWxlbVR5cGUsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUgfX0sCi0gICAgeyBUUlVFICwgY21zU2lnQlRvQTBUYWcsIGNtc1NpZ0x1dEJ0b0FUeXBlLCAgMSwgIHsgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSB9fSwKLSAgICB7IFRSVUUgLCBjbXNTaWdCVG9BMFRhZywgY21zU2lnTHV0QnRvQVR5cGUsICAzLCAgeyBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLCBjbXNTaWdNYXRyaXhFbGVtVHlwZSwgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSB9fSwKLSAgICB7IFRSVUUgLCBjbXNTaWdCVG9BMFRhZywgY21zU2lnTHV0QnRvQVR5cGUsICAzLCAgeyBjbXNTaWdDdXJ2ZVNldEVsZW1UeXBlLCBjbXNTaWdDTHV0RWxlbVR5cGUsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUgfX0sCi0gICAgeyBUUlVFICwgY21zU2lnQlRvQTBUYWcsIGNtc1NpZ0x1dEJ0b0FUeXBlLCAgNSwgIHsgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSwgY21zU2lnTWF0cml4RWxlbVR5cGUsIGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUsIGNtc1NpZ0NMdXRFbGVtVHlwZSwgY21zU2lnQ3VydmVTZXRFbGVtVHlwZSB9fQotfTsKLQotI2RlZmluZSBTSVpFX09GX0FMTE9XRURfTFVUIChzaXplb2YoQWxsb3dlZExVVFR5cGVzKS9zaXplb2YoY21zQWxsb3dlZExVVCkpCi0KLS8vIENoZWNrIGEgc2luZ2xlIGVudHJ5Ci1zdGF0aWMKLWNtc0Jvb2wgQ2hlY2tPbmUoY29uc3QgY21zQWxsb3dlZExVVCogVGFiLCBjb25zdCBjbXNQaXBlbGluZSogTHV0KQotewotICAgIGNtc1N0YWdlKiBtcGU7Ci0gICAgaW50IG47Ci0KLSAgICBmb3IgKG49MCwgbXBlID0gTHV0IC0+RWxlbWVudHM7IG1wZSAhPSBOVUxMOyBtcGUgPSBtcGUgLT5OZXh0LCBuKyspIHsKLQotICAgICAgICBpZiAobiA+IFRhYiAtPm5UeXBlcykgcmV0dXJuIEZBTFNFOwotICAgICAgICBpZiAoY21zU3RhZ2VUeXBlKG1wZSkgIT0gVGFiIC0+TXBlVHlwZXNbbl0pIHJldHVybiBGQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gKG4gPT0gVGFiIC0+blR5cGVzKTsKLX0KLQotCi1zdGF0aWMKLWNvbnN0IGNtc0FsbG93ZWRMVVQqIEZpbmRDb21iaW5hdGlvbihjb25zdCBjbXNQaXBlbGluZSogTHV0LCBjbXNCb29sIElzVjQsIGNtc1RhZ1NpZ25hdHVyZSBEZXN0aW5hdGlvblRhZykKLXsKLSAgICBjbXNVSW50MzJOdW1iZXIgbjsKLQotICAgIGZvciAobj0wOyBuIDwgU0laRV9PRl9BTExPV0VEX0xVVDsgbisrKSB7Ci0KLSAgICAgICAgY29uc3QgY21zQWxsb3dlZExVVCogVGFiID0gQWxsb3dlZExVVFR5cGVzICsgbjsKLQotICAgICAgICBpZiAoSXNWNCBeIFRhYiAtPiBJc1Y0KSBjb250aW51ZTsKLSAgICAgICAgaWYgKChUYWIgLT5SZXF1aXJlZFRhZyAhPSAwKSAmJiAoVGFiIC0+UmVxdWlyZWRUYWcgIT0gRGVzdGluYXRpb25UYWcpKSBjb250aW51ZTsKLQotICAgICAgICBpZiAoQ2hlY2tPbmUoVGFiLCBMdXQpKSByZXR1cm4gVGFiOwotICAgIH0KLQotICAgIHJldHVybiBOVUxMOwotfQotCi0KLS8vIERvZXMgY29udmVydCBhIHRyYW5zZm9ybSBpbnRvIGEgZGV2aWNlIGxpbmsgcHJvZmlsZQotY21zSFBST0ZJTEUgQ01TRVhQT1JUIGNtc1RyYW5zZm9ybTJEZXZpY2VMaW5rKGNtc0hUUkFOU0ZPUk0gaFRyYW5zZm9ybSwgY21zRmxvYXQ2NE51bWJlciBWZXJzaW9uLCBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKLXsKLSAgICBjbXNIUFJPRklMRSBoUHJvZmlsZSA9IE5VTEw7Ci0gICAgY21zVUludDMyTnVtYmVyIEZybUluLCBGcm1PdXQsIENoYW5zSW4sIENoYW5zT3V0OwotICAgIGNtc1VJbnQzMk51bWJlciBDb2xvclNwYWNlQml0c0luLCBDb2xvclNwYWNlQml0c091dDsKLSAgICBfY21zVFJBTlNGT1JNKiB4Zm9ybSA9IChfY21zVFJBTlNGT1JNKikgaFRyYW5zZm9ybTsKLSAgICBjbXNQaXBlbGluZSogTFVUID0gTlVMTDsKLSAgICBjbXNTdGFnZSogbXBlOwotICAgIGNtc0NvbnRleHQgQ29udGV4dElEID0gY21zR2V0VHJhbnNmb3JtQ29udGV4dElEKGhUcmFuc2Zvcm0pOwotICAgIGNvbnN0IGNtc0FsbG93ZWRMVVQqIEFsbG93ZWRMVVQ7Ci0gICAgY21zVGFnU2lnbmF0dXJlIERlc3RpbmF0aW9uVGFnOwotICAgIGNtc1Byb2ZpbGVDbGFzc1NpZ25hdHVyZSBkZXZpY2VDbGFzczsgCi0KLSAgICBfY21zQXNzZXJ0KGhUcmFuc2Zvcm0gIT0gTlVMTCk7Ci0KLSAgICAvLyBHZXQgdGhlIGZpcnN0IG1wZSB0byBjaGVjayBmb3IgbmFtZWQgY29sb3IKLSAgICBtcGUgPSBjbXNQaXBlbGluZUdldFB0clRvRmlyc3RTdGFnZSh4Zm9ybSAtPkx1dCk7Ci0KLSAgICAvLyBDaGVjayBpZiBpcyBhIG5hbWVkIGNvbG9yIHRyYW5zZm9ybQotICAgIGlmIChtcGUgIT0gTlVMTCkgewotCi0gICAgICAgIGlmIChjbXNTdGFnZVR5cGUobXBlKSA9PSBjbXNTaWdOYW1lZENvbG9yRWxlbVR5cGUpIHsKLSAgICAgICAgICAgIHJldHVybiBDcmVhdGVOYW1lZENvbG9yRGV2aWNlbGluayhoVHJhbnNmb3JtKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEZpcnN0IHRoaW5nIHRvIGRvIGlzIHRvIGdldCBhIGNvcHkgb2YgdGhlIHRyYW5zZm9ybWF0aW9uCi0gICAgTFVUID0gY21zUGlwZWxpbmVEdXAoeGZvcm0gLT5MdXQpOwotICAgIGlmIChMVVQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0KLSAgICAvLyBUaW1lIHRvIGZpeCB0aGUgTGFiMi9MYWI0IGlzc3VlLgotICAgIGlmICgoeGZvcm0gLT5FbnRyeUNvbG9yU3BhY2UgPT0gY21zU2lnTGFiRGF0YSkgJiYgKFZlcnNpb24gPCA0LjApKSB7Ci0KLSAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKExVVCwgY21zQVRfQkVHSU4sIF9jbXNTdGFnZUFsbG9jTGFiVjJUb1Y0Y3VydmVzKENvbnRleHRJRCkpKQotICAgICAgICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0KLSAgICAvLyBPbiB0aGUgb3V0cHV0IHNpZGUgdG9vCi0gICAgaWYgKCh4Zm9ybSAtPkV4aXRDb2xvclNwYWNlKSA9PSBjbXNTaWdMYWJEYXRhICYmIChWZXJzaW9uIDwgNC4wKSkgewotCi0gICAgICAgIGlmICghY21zUGlwZWxpbmVJbnNlcnRTdGFnZShMVVQsIGNtc0FUX0VORCwgX2Ntc1N0YWdlQWxsb2NMYWJWNFRvVjIoQ29udGV4dElEKSkpCi0gICAgICAgICAgICBnb3RvIEVycm9yOwotICAgIH0KLQotCi0gICAgaFByb2ZpbGUgPSBjbXNDcmVhdGVQcm9maWxlUGxhY2Vob2xkZXIoQ29udGV4dElEKTsKLSAgICBpZiAoIWhQcm9maWxlKSBnb3RvIEVycm9yOyAgICAgICAgICAgICAgICAgICAgLy8gY2FuJ3QgYWxsb2NhdGUKLQotICAgIGNtc1NldFByb2ZpbGVWZXJzaW9uKGhQcm9maWxlLCBWZXJzaW9uKTsKLQotICAgIEZpeENvbG9yU3BhY2VzKGhQcm9maWxlLCB4Zm9ybSAtPiBFbnRyeUNvbG9yU3BhY2UsIHhmb3JtIC0+IEV4aXRDb2xvclNwYWNlLCBkd0ZsYWdzKTsKLQotICAgIC8vIE9wdGltaXplIHRoZSBMVVQgYW5kIHByZWNhbGN1bGF0ZSBhIGRldmljZWxpbmsKLQotICAgIENoYW5zSW4gID0gY21zQ2hhbm5lbHNPZih4Zm9ybSAtPiBFbnRyeUNvbG9yU3BhY2UpOwotICAgIENoYW5zT3V0ID0gY21zQ2hhbm5lbHNPZih4Zm9ybSAtPiBFeGl0Q29sb3JTcGFjZSk7Ci0KLSAgICBDb2xvclNwYWNlQml0c0luICA9IF9jbXNMQ01TY29sb3JTcGFjZSh4Zm9ybSAtPiBFbnRyeUNvbG9yU3BhY2UpOwotICAgIENvbG9yU3BhY2VCaXRzT3V0ID0gX2Ntc0xDTVNjb2xvclNwYWNlKHhmb3JtIC0+IEV4aXRDb2xvclNwYWNlKTsKLQotICAgIEZybUluICA9IENPTE9SU1BBQ0VfU0goQ29sb3JTcGFjZUJpdHNJbikgfCBDSEFOTkVMU19TSChDaGFuc0luKXxCWVRFU19TSCgyKTsKLSAgICBGcm1PdXQgPSBDT0xPUlNQQUNFX1NIKENvbG9yU3BhY2VCaXRzT3V0KSB8IENIQU5ORUxTX1NIKENoYW5zT3V0KXxCWVRFU19TSCgyKTsKLQotICAgIGRldmljZUNsYXNzID0gY21zR2V0RGV2aWNlQ2xhc3MoaFByb2ZpbGUpOwotCi0gICAgIGlmIChkZXZpY2VDbGFzcyA9PSBjbXNTaWdPdXRwdXRDbGFzcykKLSAgICAgICAgIERlc3RpbmF0aW9uVGFnID0gY21zU2lnQlRvQTBUYWc7Ci0gICAgIGVsc2UKLSAgICAgICAgIERlc3RpbmF0aW9uVGFnID0gY21zU2lnQVRvQjBUYWc7Ci0KLSAgICAvLyBDaGVjayBpZiB0aGUgcHJvZmlsZS92ZXJzaW9uIGNhbiBzdG9yZSB0aGUgcmVzdWx0Ci0gICAgaWYgKGR3RmxhZ3MgJiBjbXNGTEFHU19GT1JDRV9DTFVUKQotICAgICAgICBBbGxvd2VkTFVUID0gTlVMTDsKLSAgICBlbHNlCi0gICAgICAgIEFsbG93ZWRMVVQgPSBGaW5kQ29tYmluYXRpb24oTFVULCBWZXJzaW9uID49IDQuMCwgRGVzdGluYXRpb25UYWcpOwotCi0gICAgaWYgKEFsbG93ZWRMVVQgPT0gTlVMTCkgewotCi0gICAgICAgIC8vIFRyeSB0byBvcHRpbWl6ZQotICAgICAgICBfY21zT3B0aW1pemVQaXBlbGluZShDb250ZXh0SUQsICZMVVQsIHhmb3JtIC0+UmVuZGVyaW5nSW50ZW50LCAmRnJtSW4sICZGcm1PdXQsICZkd0ZsYWdzKTsKLSAgICAgICAgQWxsb3dlZExVVCA9IEZpbmRDb21iaW5hdGlvbihMVVQsIFZlcnNpb24gPj0gNC4wLCBEZXN0aW5hdGlvblRhZyk7Ci0KLSAgICB9Ci0KLSAgICAvLyBJZiBubyB3YXksIHRoZW4gZm9yY2UgQ0xVVCB0aGF0IGZvciBzdXJlIGNhbiBiZSB3cml0dGVuCi0gICAgaWYgKEFsbG93ZWRMVVQgPT0gTlVMTCkgewotCi0gICAgICAgIGR3RmxhZ3MgfD0gY21zRkxBR1NfRk9SQ0VfQ0xVVDsKLSAgICAgICAgX2Ntc09wdGltaXplUGlwZWxpbmUoQ29udGV4dElELCAmTFVULCB4Zm9ybSAtPlJlbmRlcmluZ0ludGVudCwgJkZybUluLCAmRnJtT3V0LCAmZHdGbGFncyk7Ci0KLSAgICAgICAgLy8gUHV0IGlkZW50aXR5IGN1cnZlcyBpZiBuZWVkZWQKLSAgICAgICAgaWYgKGNtc1BpcGVsaW5lR2V0UHRyVG9GaXJzdFN0YWdlKExVVCkgLT5UeXBlICE9IGNtc1NpZ0N1cnZlU2V0RWxlbVR5cGUpCi0gICAgICAgICAgICAgaWYgKCFjbXNQaXBlbGluZUluc2VydFN0YWdlKExVVCwgY21zQVRfQkVHSU4sIF9jbXNTdGFnZUFsbG9jSWRlbnRpdHlDdXJ2ZXMoQ29udGV4dElELCBDaGFuc0luKSkpCi0gICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAgaWYgKGNtc1BpcGVsaW5lR2V0UHRyVG9MYXN0U3RhZ2UoTFVUKSAtPlR5cGUgIT0gY21zU2lnQ3VydmVTZXRFbGVtVHlwZSkKLSAgICAgICAgICAgICBpZiAoIWNtc1BpcGVsaW5lSW5zZXJ0U3RhZ2UoTFVULCBjbXNBVF9FTkQsICAgX2Ntc1N0YWdlQWxsb2NJZGVudGl0eUN1cnZlcyhDb250ZXh0SUQsIENoYW5zT3V0KSkpCi0gICAgICAgICAgICAgICAgIGdvdG8gRXJyb3I7Ci0KLSAgICAgICAgQWxsb3dlZExVVCA9IEZpbmRDb21iaW5hdGlvbihMVVQsIFZlcnNpb24gPj0gNC4wLCBEZXN0aW5hdGlvblRhZyk7Ci0gICAgfQotCi0gICAgLy8gU29tZXRoaW5ncyBpcyB3cm9uZy4uLgotICAgIGlmIChBbGxvd2VkTFVUID09IE5VTEwpIHsKLSAgICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0KLQotICAgIGlmIChkd0ZsYWdzICYgY21zRkxBR1NfOEJJVFNfREVWSUNFTElOSykKLSAgICAgICAgICAgICAgICAgICAgIGNtc1BpcGVsaW5lU2V0U2F2ZUFzOGJpdHNGbGFnKExVVCwgVFJVRSk7Ci0KLSAgICAvLyBUYWcgcHJvZmlsZSB3aXRoIGluZm9ybWF0aW9uCi0gICAgaWYgKCFTZXRUZXh0VGFncyhoUHJvZmlsZSwgTCJkZXZpY2VsaW5rIikpIGdvdG8gRXJyb3I7Ci0KLSAgICAvLyBTdG9yZSByZXN1bHQKLSAgICBpZiAoIWNtc1dyaXRlVGFnKGhQcm9maWxlLCBEZXN0aW5hdGlvblRhZywgTFVUKSkgZ290byBFcnJvcjsKLQotCi0gICAgaWYgKHhmb3JtIC0+IElucHV0Q29sb3JhbnQgIT0gTlVMTCkgewotICAgICAgICAgICBpZiAoIWNtc1dyaXRlVGFnKGhQcm9maWxlLCBjbXNTaWdDb2xvcmFudFRhYmxlVGFnLCB4Zm9ybS0+SW5wdXRDb2xvcmFudCkpIGdvdG8gRXJyb3I7Ci0gICAgfQotCi0gICAgaWYgKHhmb3JtIC0+IE91dHB1dENvbG9yYW50ICE9IE5VTEwpIHsKLSAgICAgICAgICAgaWYgKCFjbXNXcml0ZVRhZyhoUHJvZmlsZSwgY21zU2lnQ29sb3JhbnRUYWJsZU91dFRhZywgeGZvcm0tPk91dHB1dENvbG9yYW50KSkgZ290byBFcnJvcjsKLSAgICB9Ci0KLSAgICBpZiAoKGRldmljZUNsYXNzID09IGNtc1NpZ0xpbmtDbGFzcykgJiYgKHhmb3JtIC0+U2VxdWVuY2UgIT0gTlVMTCkpIHsKLSAgICAgICAgaWYgKCFfY21zV3JpdGVQcm9maWxlU2VxdWVuY2UoaFByb2ZpbGUsIHhmb3JtIC0+U2VxdWVuY2UpKSBnb3RvIEVycm9yOwotICAgIH0KLQotICAgIC8vIFNldCB0aGUgd2hpdGUgcG9pbnQKLSAgICBpZiAoZGV2aWNlQ2xhc3MgPT0gY21zU2lnSW5wdXRDbGFzcykgewotICAgICAgICBpZiAoIWNtc1dyaXRlVGFnKGhQcm9maWxlLCBjbXNTaWdNZWRpYVdoaXRlUG9pbnRUYWcsICZ4Zm9ybSAtPkVudHJ5V2hpdGVQb2ludCkpIGdvdG8gRXJyb3I7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICAgaWYgKCFjbXNXcml0ZVRhZyhoUHJvZmlsZSwgY21zU2lnTWVkaWFXaGl0ZVBvaW50VGFnLCAmeGZvcm0gLT5FeGl0V2hpdGVQb2ludCkpIGdvdG8gRXJyb3I7Ci0gICAgfQotCi0gIAotICAgIC8vIFBlciA3LjIuMTUgaW4gc3BlYyA0LjMKLSAgICBjbXNTZXRIZWFkZXJSZW5kZXJpbmdJbnRlbnQoaFByb2ZpbGUsIHhmb3JtIC0+UmVuZGVyaW5nSW50ZW50KTsKLQotICAgIGNtc1BpcGVsaW5lRnJlZShMVVQpOwotICAgIHJldHVybiBoUHJvZmlsZTsKLQotRXJyb3I6Ci0gICAgaWYgKExVVCAhPSBOVUxMKSBjbXNQaXBlbGluZUZyZWUoTFVUKTsKLSAgICBjbXNDbG9zZVByb2ZpbGUoaFByb2ZpbGUpOwotICAgIHJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN3dHBudC5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN3dHBudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDNmZGQ3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zd3RwbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vICBMaXR0bGUgQ29sb3IgTWFuYWdlbWVudCBTeXN0ZW0KLS8vICBDb3B5cmlnaHQgKGMpIDE5OTgtMjAxNCBNYXJ0aSBNYXJpYSBTYWd1ZXIKLS8vCi0vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKLS8vIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKLS8vIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLS8vIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAotLy8gYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlCi0vLyBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotLy8KLS8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCi0vLyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLS8vCi0vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLS8vIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTwotLy8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKLS8vIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUKLS8vIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04KLS8vIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgotLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0KLSNpbmNsdWRlICJsY21zMl9pbnRlcm5hbC5oIgotCi0KLS8vIEQ1MCAtIFdpZGVseSB1c2VkCi1jb25zdCBjbXNDSUVYWVoqIENNU0VYUE9SVCBjbXNENTBfWFlaKHZvaWQpCi17Ci0gICAgc3RhdGljIGNtc0NJRVhZWiBENTBYWVogPSB7Y21zRDUwWCwgY21zRDUwWSwgY21zRDUwWn07Ci0KLSAgICByZXR1cm4gJkQ1MFhZWjsKLX0KLQotY29uc3QgY21zQ0lFeHlZKiBDTVNFWFBPUlQgY21zRDUwX3h5WSh2b2lkKQotewotICAgIHN0YXRpYyBjbXNDSUV4eVkgRDUweHlZOwotCi0gICAgY21zWFlaMnh5WSgmRDUweHlZLCBjbXNENTBfWFlaKCkpOwotCi0gICAgcmV0dXJuICZENTB4eVk7Ci19Ci0KLS8vIE9idGFpbnMgV2hpdGVQb2ludCBmcm9tIFRlbXBlcmF0dXJlCi1jbXNCb29sICBDTVNFWFBPUlQgY21zV2hpdGVQb2ludEZyb21UZW1wKGNtc0NJRXh5WSogV2hpdGVQb2ludCwgY21zRmxvYXQ2NE51bWJlciBUZW1wSykKLXsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIHgsIHk7Ci0gICAgY21zRmxvYXQ2NE51bWJlciBULCBUMiwgVDM7Ci0gICAgLy8gY21zRmxvYXQ2NE51bWJlciBNMSwgTTI7Ci0KLSAgICBfY21zQXNzZXJ0KFdoaXRlUG9pbnQgIT0gTlVMTCk7Ci0KLSAgICBUID0gVGVtcEs7Ci0gICAgVDIgPSBUKlQ7ICAgICAgICAgICAgLy8gU3F1YXJlCi0gICAgVDMgPSBUMipUOyAgICAgICAgICAgLy8gQ3ViZQotCi0gICAgLy8gRm9yIGNvcnJlbGF0ZWQgY29sb3IgdGVtcGVyYXR1cmUgKFQpIGJldHdlZW4gNDAwMEsgYW5kIDcwMDBLOgotCi0gICAgaWYgKFQgPj0gNDAwMC4gJiYgVCA8PSA3MDAwLikKLSAgICB7Ci0gICAgICAgIHggPSAtNC42MDcwKigxRTkvVDMpICsgMi45Njc4KigxRTYvVDIpICsgMC4wOTkxMSooMUUzL1QpICsgMC4yNDQwNjM7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgLy8gb3IgZm9yIGNvcnJlbGF0ZWQgY29sb3IgdGVtcGVyYXR1cmUgKFQpIGJldHdlZW4gNzAwMEsgYW5kIDI1MDAwSzoKLQotICAgICAgICBpZiAoVCA+IDcwMDAuMCAmJiBUIDw9IDI1MDAwLjApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHggPSAtMi4wMDY0KigxRTkvVDMpICsgMS45MDE4KigxRTYvVDIpICsgMC4yNDc0OCooMUUzL1QpICsgMC4yMzcwNDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjbXNTaWduYWxFcnJvcigwLCBjbXNFUlJPUl9SQU5HRSwgImNtc1doaXRlUG9pbnRGcm9tVGVtcDogaW52YWxpZCB0ZW1wIik7Ci0gICAgICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBPYnRhaW4geSh4KQotCi0gICAgICAgIHkgPSAtMy4wMDAqKHgqeCkgKyAyLjg3MCp4IC0gMC4yNzU7Ci0KLSAgICAgICAgLy8gd2F2ZSBmYWN0b3JzIChub3QgdXNlZCwgYnV0IGhlcmUgZm9yIGZ1dHVyZXMgZXh0ZW5zaW9ucykKLQotICAgICAgICAvLyBNMSA9ICgtMS4zNTE1IC0gMS43NzAzKnggKyA1LjkxMTQgKnkpLygwLjAyNDEgKyAwLjI1NjIqeCAtIDAuNzM0MSp5KTsKLSAgICAgICAgLy8gTTIgPSAoMC4wMzAwIC0gMzEuNDQyNCp4ICsgMzAuMDcxNyp5KS8oMC4wMjQxICsgMC4yNTYyKnggLSAwLjczNDEqeSk7Ci0KLSAgICAgICAgV2hpdGVQb2ludCAtPiB4ID0geDsKLSAgICAgICAgV2hpdGVQb2ludCAtPiB5ID0geTsKLSAgICAgICAgV2hpdGVQb2ludCAtPiBZID0gMS4wOwotCi0gICAgICAgIHJldHVybiBUUlVFOwotfQotCi0KLQotdHlwZWRlZiBzdHJ1Y3QgewotCi0gICAgY21zRmxvYXQ2NE51bWJlciBtaXJlazsgIC8vIHRlbXAgKGluIG1pY3JvcmVjaXByb2NhbCBrZWx2aW4pCi0gICAgY21zRmxvYXQ2NE51bWJlciB1dDsgICAgIC8vIHUgY29vcmQgb2YgaW50ZXJzZWN0aW9uIHcvIGJsYWNrYm9keSBsb2N1cwotICAgIGNtc0Zsb2F0NjROdW1iZXIgdnQ7ICAgICAvLyB2IGNvb3JkIG9mIGludGVyc2VjdGlvbiB3LyBibGFja2JvZHkgbG9jdXMKLSAgICBjbXNGbG9hdDY0TnVtYmVyIHR0OyAgICAgLy8gc2xvcGUgb2YgSVNPVEVNUEVSQVRVUkUuIGxpbmUKLQotICAgIH0gSVNPVEVNUEVSQVRVUkU7Ci0KLXN0YXRpYyBJU09URU1QRVJBVFVSRSBpc290ZW1wZGF0YVtdID0gewotLy8gIHtNaXJlaywgVXQsICAgICAgIFZ0LCAgICAgIFR0ICAgICAgfQotICAgIHswLCAgICAgMC4xODAwNiwgIDAuMjYzNTIsICAtMC4yNDM0MX0sCi0gICAgezEwLCAgICAwLjE4MDY2LCAgMC4yNjU4OSwgIC0wLjI1NDc5fSwKLSAgICB7MjAsICAgIDAuMTgxMzMsICAwLjI2ODQ2LCAgLTAuMjY4NzZ9LAotICAgIHszMCwgICAgMC4xODIwOCwgIDAuMjcxMTksICAtMC4yODUzOX0sCi0gICAgezQwLCAgICAwLjE4MjkzLCAgMC4yNzQwNywgIC0wLjMwNDcwfSwKLSAgICB7NTAsICAgIDAuMTgzODgsICAwLjI3NzA5LCAgLTAuMzI2NzV9LAotICAgIHs2MCwgICAgMC4xODQ5NCwgIDAuMjgwMjEsICAtMC4zNTE1Nn0sCi0gICAgezcwLCAgICAwLjE4NjExLCAgMC4yODM0MiwgIC0wLjM3OTE1fSwKLSAgICB7ODAsICAgIDAuMTg3NDAsICAwLjI4NjY4LCAgLTAuNDA5NTV9LAotICAgIHs5MCwgICAgMC4xODg4MCwgIDAuMjg5OTcsICAtMC40NDI3OH0sCi0gICAgezEwMCwgICAwLjE5MDMyLCAgMC4yOTMyNiwgIC0wLjQ3ODg4fSwKLSAgICB7MTI1LCAgIDAuMTk0NjIsICAwLjMwMTQxLCAgLTAuNTgyMDR9LAotICAgIHsxNTAsICAgMC4xOTk2MiwgIDAuMzA5MjEsICAtMC43MDQ3MX0sCi0gICAgezE3NSwgICAwLjIwNTI1LCAgMC4zMTY0NywgIC0wLjg0OTAxfSwKLSAgICB7MjAwLCAgIDAuMjExNDIsICAwLjMyMzEyLCAgLTEuMDE4MiB9LAotICAgIHsyMjUsICAgMC4yMTgwNywgIDAuMzI5MDksICAtMS4yMTY4IH0sCi0gICAgezI1MCwgICAwLjIyNTExLCAgMC4zMzQzOSwgIC0xLjQ1MTIgfSwKLSAgICB7Mjc1LCAgIDAuMjMyNDcsICAwLjMzOTA0LCAgLTEuNzI5OCB9LAotICAgIHszMDAsICAgMC4yNDAxMCwgIDAuMzQzMDgsICAtMi4wNjM3IH0sCi0gICAgezMyNSwgICAwLjI0NzAyLCAgMC4zNDY1NSwgIC0yLjQ2ODEgfSwKLSAgICB7MzUwLCAgIDAuMjU1OTEsICAwLjM0OTUxLCAgLTIuOTY0MSB9LAotICAgIHszNzUsICAgMC4yNjQwMCwgIDAuMzUyMDAsICAtMy41ODE0IH0sCi0gICAgezQwMCwgICAwLjI3MjE4LCAgMC4zNTQwNywgIC00LjM2MzMgfSwKLSAgICB7NDI1LCAgIDAuMjgwMzksICAwLjM1NTc3LCAgLTUuMzc2MiB9LAotICAgIHs0NTAsICAgMC4yODg2MywgIDAuMzU3MTQsICAtNi43MjYyIH0sCi0gICAgezQ3NSwgICAwLjI5Njg1LCAgMC4zNTgyMywgIC04LjU5NTUgfSwKLSAgICB7NTAwLCAgIDAuMzA1MDUsICAwLjM1OTA3LCAgLTExLjMyNCB9LAotICAgIHs1MjUsICAgMC4zMTMyMCwgIDAuMzU5NjgsICAtMTUuNjI4IH0sCi0gICAgezU1MCwgICAwLjMyMTI5LCAgMC4zNjAxMSwgIC0yMy4zMjUgfSwKLSAgICB7NTc1LCAgIDAuMzI5MzEsICAwLjM2MDM4LCAgLTQwLjc3MCB9LAotICAgIHs2MDAsICAgMC4zMzcyNCwgIDAuMzYwNTEsICAtMTE2LjQ1ICB9Ci19OwotCi0jZGVmaW5lIE5JU08gc2l6ZW9mKGlzb3RlbXBkYXRhKS9zaXplb2YoSVNPVEVNUEVSQVRVUkUpCi0KLQotLy8gUm9iZXJ0c29uJ3MgbWV0aG9kCi1jbXNCb29sICBDTVNFWFBPUlQgY21zVGVtcEZyb21XaGl0ZVBvaW50KGNtc0Zsb2F0NjROdW1iZXIqIFRlbXBLLCBjb25zdCBjbXNDSUV4eVkqIFdoaXRlUG9pbnQpCi17Ci0gICAgY21zVUludDMyTnVtYmVyIGo7Ci0gICAgY21zRmxvYXQ2NE51bWJlciB1cyx2czsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIHVqLHZqLHRqLGRpLGRqLG1pLG1qOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgeHMsIHlzOwotCi0gICAgX2Ntc0Fzc2VydChXaGl0ZVBvaW50ICE9IE5VTEwpOwotICAgIF9jbXNBc3NlcnQoVGVtcEsgIT0gTlVMTCk7Ci0KLSAgICBkaSA9IG1pID0gMDsKLSAgICB4cyA9IFdoaXRlUG9pbnQgLT4geDsKLSAgICB5cyA9IFdoaXRlUG9pbnQgLT4geTsKLQotICAgIC8vIGNvbnZlcnQgKHgseSkgdG8gQ0lFIDE5NjAgKHUsV2hpdGVQb2ludCkKLQotICAgIHVzID0gKDIqeHMpIC8gKC14cyArIDYqeXMgKyAxLjUpOwotICAgIHZzID0gKDMqeXMpIC8gKC14cyArIDYqeXMgKyAxLjUpOwotCi0KLSAgICBmb3IgKGo9MDsgaiA8IE5JU087IGorKykgewotCi0gICAgICAgIHVqID0gaXNvdGVtcGRhdGFbal0udXQ7Ci0gICAgICAgIHZqID0gaXNvdGVtcGRhdGFbal0udnQ7Ci0gICAgICAgIHRqID0gaXNvdGVtcGRhdGFbal0udHQ7Ci0gICAgICAgIG1qID0gaXNvdGVtcGRhdGFbal0ubWlyZWs7Ci0KLSAgICAgICAgZGogPSAoKHZzIC0gdmopIC0gdGogKiAodXMgLSB1aikpIC8gc3FydCgxLjAgKyB0aiAqIHRqKTsKLQotICAgICAgICBpZiAoKGogIT0gMCkgJiYgKGRpL2RqIDwgMC4wKSkgewotCi0gICAgICAgICAgICAvLyBGb3VuZCBhIG1hdGNoCi0gICAgICAgICAgICAqVGVtcEsgPSAxMDAwMDAwLjAgLyAobWkgKyAoZGkgLyAoZGkgLSBkaikpICogKG1qIC0gbWkpKTsKLSAgICAgICAgICAgIHJldHVybiBUUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgZGkgPSBkajsKLSAgICAgICAgbWkgPSBtajsKLSAgICB9Ci0KLSAgICAvLyBOb3QgZm91bmQKLSAgICByZXR1cm4gRkFMU0U7Ci19Ci0KLQotLy8gQ29tcHV0ZSBjaHJvbWF0aWMgYWRhcHRhdGlvbiBtYXRyaXggdXNpbmcgQ2hhZCBhcyBjb25lIG1hdHJpeAotCi1zdGF0aWMKLWNtc0Jvb2wgQ29tcHV0ZUNocm9tYXRpY0FkYXB0YXRpb24oY21zTUFUMyogQ29udmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zQ0lFWFlaKiBTb3VyY2VXaGl0ZVBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNDSUVYWVoqIERlc3RXaGl0ZVBvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNNQVQzKiBDaGFkKQotCi17Ci0KLSAgICBjbXNNQVQzIENoYWRfSW52OwotICAgIGNtc1ZFQzMgQ29uZVNvdXJjZVhZWiwgQ29uZVNvdXJjZVJHQjsKLSAgICBjbXNWRUMzIENvbmVEZXN0WFlaLCBDb25lRGVzdFJHQjsKLSAgICBjbXNNQVQzIENvbmUsIFRtcDsKLQotCi0gICAgVG1wID0gKkNoYWQ7Ci0gICAgaWYgKCFfY21zTUFUM2ludmVyc2UoJlRtcCwgJkNoYWRfSW52KSkgcmV0dXJuIEZBTFNFOwotCi0gICAgX2Ntc1ZFQzNpbml0KCZDb25lU291cmNlWFlaLCBTb3VyY2VXaGl0ZVBvaW50IC0+IFgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVdoaXRlUG9pbnQgLT4gWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlV2hpdGVQb2ludCAtPiBaKTsKLQotICAgIF9jbXNWRUMzaW5pdCgmQ29uZURlc3RYWVosICAgRGVzdFdoaXRlUG9pbnQgLT4gWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdFdoaXRlUG9pbnQgLT4gWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdFdoaXRlUG9pbnQgLT4gWik7Ci0KLSAgICBfY21zTUFUM2V2YWwoJkNvbmVTb3VyY2VSR0IsIENoYWQsICZDb25lU291cmNlWFlaKTsKLSAgICBfY21zTUFUM2V2YWwoJkNvbmVEZXN0UkdCLCAgIENoYWQsICZDb25lRGVzdFhZWik7Ci0KLSAgICAvLyBCdWlsZCBtYXRyaXgKLSAgICBfY21zVkVDM2luaXQoJkNvbmUudlswXSwgQ29uZURlc3RSR0IublswXS9Db25lU291cmNlUkdCLm5bMF0sICAgIDAuMCwgIDAuMCk7Ci0gICAgX2Ntc1ZFQzNpbml0KCZDb25lLnZbMV0sIDAuMCwgICBDb25lRGVzdFJHQi5uWzFdL0NvbmVTb3VyY2VSR0IublsxXSwgICAwLjApOwotICAgIF9jbXNWRUMzaW5pdCgmQ29uZS52WzJdLCAwLjAsICAgMC4wLCAgIENvbmVEZXN0UkdCLm5bMl0vQ29uZVNvdXJjZVJHQi5uWzJdKTsKLQotCi0gICAgLy8gTm9ybWFsaXplCi0gICAgX2Ntc01BVDNwZXIoJlRtcCwgJkNvbmUsIENoYWQpOwotICAgIF9jbXNNQVQzcGVyKENvbnZlcnNpb24sICZDaGFkX0ludiwgJlRtcCk7Ci0KLSAgICByZXR1cm4gVFJVRTsKLX0KLQotLy8gUmV0dXJucyB0aGUgZmluYWwgY2hybWF0aWMgYWRhcHRhdGlvbiBmcm9tIGlsbHVtaW5hbnQgRnJvbUlsbCB0byBJbGx1bWluYW50IFRvSWxsCi0vLyBUaGUgY29uZSBtYXRyaXggY2FuIGJlIHNwZWNpZmllZCBpbiBDb25lTWF0cml4LiBJZiBOVUxMLCBCcmFkZm9yZCBpcyBhc3N1bWVkCi1jbXNCb29sICBfY21zQWRhcHRhdGlvbk1hdHJpeChjbXNNQVQzKiByLCBjb25zdCBjbXNNQVQzKiBDb25lTWF0cml4LCBjb25zdCBjbXNDSUVYWVoqIEZyb21JbGwsIGNvbnN0IGNtc0NJRVhZWiogVG9JbGwpCi17Ci0gICAgY21zTUFUMyBMYW1SaWdnICAgPSB7eyAvLyBCcmFkZm9yZCBtYXRyaXgKLSAgICAgICAge3sgIDAuODk1MSwgIDAuMjY2NCwgLTAuMTYxNCB9fSwKLSAgICAgICAge3sgLTAuNzUwMiwgIDEuNzEzNSwgIDAuMDM2NyB9fSwKLSAgICAgICAge3sgIDAuMDM4OSwgLTAuMDY4NSwgIDEuMDI5NiB9fQotICAgIH19OwotCi0gICAgaWYgKENvbmVNYXRyaXggPT0gTlVMTCkKLSAgICAgICAgQ29uZU1hdHJpeCA9ICZMYW1SaWdnOwotCi0gICAgcmV0dXJuIENvbXB1dGVDaHJvbWF0aWNBZGFwdGF0aW9uKHIsIEZyb21JbGwsIFRvSWxsLCBDb25lTWF0cml4KTsKLX0KLQotLy8gU2FtZSBhcyBhbnRlcmlvciwgYnV0IGFzc3VtaW5nIEQ1MCBkZXN0aW5hdGlvbi4gV2hpdGUgcG9pbnQgaXMgZ2l2ZW4gaW4geHlZCi1zdGF0aWMKLWNtc0Jvb2wgX2Ntc0FkYXB0TWF0cml4VG9ENTAoY21zTUFUMyogciwgY29uc3QgY21zQ0lFeHlZKiBTb3VyY2VXaGl0ZVB0KQotewotICAgIGNtc0NJRVhZWiBEbjsKLSAgICBjbXNNQVQzIEJyYWRmb3JkOwotICAgIGNtc01BVDMgVG1wOwotCi0gICAgY21zeHlZMlhZWigmRG4sIFNvdXJjZVdoaXRlUHQpOwotCi0gICAgaWYgKCFfY21zQWRhcHRhdGlvbk1hdHJpeCgmQnJhZGZvcmQsIE5VTEwsICZEbiwgY21zRDUwX1hZWigpKSkgcmV0dXJuIEZBTFNFOwotCi0gICAgVG1wID0gKnI7Ci0gICAgX2Ntc01BVDNwZXIociwgJkJyYWRmb3JkLCAmVG1wKTsKLQotICAgIHJldHVybiBUUlVFOwotfQotCi0vLyBCdWlsZCBhIFdoaXRlIHBvaW50LCBwcmltYXJ5IGNocm9tYXMgdHJhbnNmZXIgbWF0cml4IGZyb20gUkdCIHRvIENJRSBYWVoKLS8vIFRoaXMgaXMganVzdCBhbiBhcHByb3hpbWF0aW9uLCBJIGFtIG5vdCBoYW5kbGluZyBhbGwgdGhlIG5vbi1saW5lYXIKLS8vIGFzcGVjdHMgb2YgdGhlIFJHQiB0byBYWVogcHJvY2VzcywgYW5kIGFzc3VtbWluZyB0aGF0IHRoZSBnYW1tYSBjb3JyZWN0aW9uCi0vLyBoYXMgdHJhbnNpdGl2ZSBwcm9wZXJ0eSBpbiB0aGUgdHJhbmZvcm1hdGlvbiBjaGFpbi4KLS8vCi0vLyB0aGUgYWxnaG9yaXRtOgotLy8KLS8vICAgICAgICAgICAgLSBGaXJzdCBJIGJ1aWxkIHRoZSBhYnNvbHV0ZSBjb252ZXJzaW9uIG1hdHJpeCB1c2luZwotLy8gICAgICAgICAgICAgIHByaW1hcmllcyBpbiBYWVouIFRoaXMgbWF0cml4IGlzIG5leHQgaW52ZXJ0ZWQKLS8vICAgICAgICAgICAgLSBUaGVuIEkgZXZhbCB0aGUgc291cmNlIHdoaXRlIHBvaW50IGFjcm9zcyB0aGlzIG1hdHJpeAotLy8gICAgICAgICAgICAgIG9idGFpbmluZyB0aGUgY29lZmljaWVudHMgb2YgdGhlIHRyYW5zZm9ybWF0aW9uCi0vLyAgICAgICAgICAgIC0gVGhlbiwgSSBhcHBseSB0aGVzZSBjb2VmaWNpZW50cyB0byB0aGUgb3JpZ2luYWwgbWF0cml4Ci0vLwotY21zQm9vbCBfY21zQnVpbGRSR0IyWFladHJhbnNmZXJNYXRyaXgoY21zTUFUMyogciwgY29uc3QgY21zQ0lFeHlZKiBXaGl0ZVB0LCBjb25zdCBjbXNDSUV4eVlUUklQTEUqIFByaW1ycykKLXsKLSAgICBjbXNWRUMzIFdoaXRlUG9pbnQsIENvZWY7Ci0gICAgY21zTUFUMyBSZXN1bHQsIFByaW1hcmllczsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIHhuLCB5bjsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIHhyLCB5cjsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIHhnLCB5ZzsKLSAgICBjbXNGbG9hdDY0TnVtYmVyIHhiLCB5YjsKLQotICAgIHhuID0gV2hpdGVQdCAtPiB4OwotICAgIHluID0gV2hpdGVQdCAtPiB5OwotICAgIHhyID0gUHJpbXJzIC0+IFJlZC54OwotICAgIHlyID0gUHJpbXJzIC0+IFJlZC55OwotICAgIHhnID0gUHJpbXJzIC0+IEdyZWVuLng7Ci0gICAgeWcgPSBQcmltcnMgLT4gR3JlZW4ueTsKLSAgICB4YiA9IFByaW1ycyAtPiBCbHVlLng7Ci0gICAgeWIgPSBQcmltcnMgLT4gQmx1ZS55OwotCi0gICAgLy8gQnVpbGQgUHJpbWFyaWVzIG1hdHJpeAotICAgIF9jbXNWRUMzaW5pdCgmUHJpbWFyaWVzLnZbMF0sIHhyLCAgICAgICAgeGcsICAgICAgICAgeGIpOwotICAgIF9jbXNWRUMzaW5pdCgmUHJpbWFyaWVzLnZbMV0sIHlyLCAgICAgICAgeWcsICAgICAgICAgeWIpOwotICAgIF9jbXNWRUMzaW5pdCgmUHJpbWFyaWVzLnZbMl0sICgxLXhyLXlyKSwgKDEteGcteWcpLCAgKDEteGIteWIpKTsKLQotCi0gICAgLy8gUmVzdWx0ID0gUHJpbWFyaWVzIF4gKC0xKSBpbnZlcnNlIG1hdHJpeAotICAgIGlmICghX2Ntc01BVDNpbnZlcnNlKCZQcmltYXJpZXMsICZSZXN1bHQpKQotICAgICAgICByZXR1cm4gRkFMU0U7Ci0KLQotICAgIF9jbXNWRUMzaW5pdCgmV2hpdGVQb2ludCwgeG4veW4sIDEuMCwgKDEuMC14bi15bikveW4pOwotCi0gICAgLy8gQWNyb3NzIGludmVyc2UgcHJpbWFyaWVzIC4uLgotICAgIF9jbXNNQVQzZXZhbCgmQ29lZiwgJlJlc3VsdCwgJldoaXRlUG9pbnQpOwotCi0gICAgLy8gR2l2ZSB1cyB0aGUgQ29lZnMsIHRoZW4gSSBidWlsZCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXgKLSAgICBfY21zVkVDM2luaXQoJnIgLT4gdlswXSwgQ29lZi5uW1ZYXSp4ciwgICAgICAgICAgQ29lZi5uW1ZZXSp4ZywgICAgICAgICAgQ29lZi5uW1ZaXSp4Yik7Ci0gICAgX2Ntc1ZFQzNpbml0KCZyIC0+IHZbMV0sIENvZWYubltWWF0qeXIsICAgICAgICAgIENvZWYubltWWV0qeWcsICAgICAgICAgIENvZWYubltWWl0qeWIpOwotICAgIF9jbXNWRUMzaW5pdCgmciAtPiB2WzJdLCBDb2VmLm5bVlhdKigxLjAteHIteXIpLCBDb2VmLm5bVlldKigxLjAteGcteWcpLCBDb2VmLm5bVlpdKigxLjAteGIteWIpKTsKLQotCi0gICAgcmV0dXJuIF9jbXNBZGFwdE1hdHJpeFRvRDUwKHIsIFdoaXRlUHQpOwotCi19Ci0KLQotLy8gQWRhcHRzIGEgY29sb3IgdG8gYSBnaXZlbiBpbGx1bWluYW50LiBPcmlnaW5hbCBjb2xvciBpcyBleHBlY3RlZCB0byBoYXZlCi0vLyBhIFNvdXJjZVdoaXRlUHQgd2hpdGUgcG9pbnQuCi1jbXNCb29sIENNU0VYUE9SVCBjbXNBZGFwdFRvSWxsdW1pbmFudChjbXNDSUVYWVoqIFJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0NJRVhZWiogU291cmNlV2hpdGVQdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0NJRVhZWiogSWxsdW1pbmFudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0NJRVhZWiogVmFsdWUpCi17Ci0gICAgY21zTUFUMyBCcmFkZm9yZDsKLSAgICBjbXNWRUMzIEluLCBPdXQ7Ci0KLSAgICBfY21zQXNzZXJ0KFJlc3VsdCAhPSBOVUxMKTsKLSAgICBfY21zQXNzZXJ0KFNvdXJjZVdoaXRlUHQgIT0gTlVMTCk7Ci0gICAgX2Ntc0Fzc2VydChJbGx1bWluYW50ICE9IE5VTEwpOwotICAgIF9jbXNBc3NlcnQoVmFsdWUgIT0gTlVMTCk7Ci0KLSAgICBpZiAoIV9jbXNBZGFwdGF0aW9uTWF0cml4KCZCcmFkZm9yZCwgTlVMTCwgU291cmNlV2hpdGVQdCwgSWxsdW1pbmFudCkpIHJldHVybiBGQUxTRTsKLQotICAgIF9jbXNWRUMzaW5pdCgmSW4sIFZhbHVlIC0+IFgsIFZhbHVlIC0+IFksIFZhbHVlIC0+IFopOwotICAgIF9jbXNNQVQzZXZhbCgmT3V0LCAmQnJhZGZvcmQsICZJbik7Ci0KLSAgICBSZXN1bHQgLT4gWCA9IE91dC5uWzBdOwotICAgIFJlc3VsdCAtPiBZID0gT3V0Lm5bMV07Ci0gICAgUmVzdWx0IC0+IFogPSBPdXQublsyXTsKLQotICAgIHJldHVybiBUUlVFOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN4Zm9ybS5jIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9jbXN4Zm9ybS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmZlNmIyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvY21zeGZvcm0uYworKysgL2Rldi9udWxsCkBAIC0xLDExMzcgKzAsMCBAQAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyAgTGl0dGxlIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtCi0vLyAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMTQgTWFydGkgTWFyaWEgU2FndWVyCi0vLwotLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0vLyBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0vLyB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0vLyB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLS8vIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZQotLy8gaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLS8vCi0vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0vLwotLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCi0vLyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8KLS8vIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECi0vLyBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFCi0vLyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0vLyBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KLS8vIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotLy8KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotCi0jaW5jbHVkZSAibGNtczJfaW50ZXJuYWwuaCIKLQotLy8gVHJhbnNmb3JtYXRpb25zIHN0dWZmCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZGVmaW5lIERFRkFVTFRfT0JTRVJWRVJfQURBUFRBVElPTl9TVEFURSAxLjAKLQotLy8gVGhlIENvbnRleHQwIG9ic2VydmVyIGFkYXB0YXRpb24gc3RhdGUuCi1fY21zQWRhcHRhdGlvblN0YXRlQ2h1bmtUeXBlIF9jbXNBZGFwdGF0aW9uU3RhdGVDaHVuayA9IHsgREVGQVVMVF9PQlNFUlZFUl9BREFQVEFUSU9OX1NUQVRFIH07Ci0KLS8vIEluaXQgYW5kIGR1cGxpY2F0ZSBvYnNlcnZlciBhZGFwdGF0aW9uIHN0YXRlCi12b2lkIF9jbXNBbGxvY0FkYXB0YXRpb25TdGF0ZUNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYykKLXsKLSAgICBzdGF0aWMgX2Ntc0FkYXB0YXRpb25TdGF0ZUNodW5rVHlwZSBBZGFwdGF0aW9uU3RhdGVDaHVuayA9IHsgREVGQVVMVF9PQlNFUlZFUl9BREFQVEFUSU9OX1NUQVRFIH07Ci0gICAgdm9pZCogZnJvbTsKLSAgICAgCi0gICAgaWYgKHNyYyAhPSBOVUxMKSB7Ci0gICAgICAgIGZyb20gPSBzcmMgLT5jaHVua3NbQWRhcHRhdGlvblN0YXRlQ29udGV4dF07ICAgICAgIAotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICBmcm9tID0gJkFkYXB0YXRpb25TdGF0ZUNodW5rOwotICAgIH0KLSAgICAKLSAgICBjdHggLT5jaHVua3NbQWRhcHRhdGlvblN0YXRlQ29udGV4dF0gPSBfY21zU3ViQWxsb2NEdXAoY3R4IC0+TWVtUG9vbCwgZnJvbSwgc2l6ZW9mKF9jbXNBZGFwdGF0aW9uU3RhdGVDaHVua1R5cGUpKTsgICAgIAotfQotCi0KLS8vIFNldHMgYWRhcHRhdGlvbiBzdGF0ZSBmb3IgYWJzb2x1dGUgY29sb3JpbWV0cmljIGludGVudCBpbiB0aGUgZ2l2ZW4gY29udGV4dC4gIEFkYXB0YXRpb24gc3RhdGUgYXBwbGllcyBvbiBhbGwgCi0vLyBidXQgY21zQ3JlYXRlRXh0ZW5kZWRUcmFuc2Zvcm1USFIoKS4gIExpdHRsZSBDTVMgY2FuIGhhbmRsZSBpbmNvbXBsZXRlIGFkYXB0YXRpb24gc3RhdGVzLgotY21zRmxvYXQ2NE51bWJlciBDTVNFWFBPUlQgY21zU2V0QWRhcHRhdGlvblN0YXRlVEhSKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNGbG9hdDY0TnVtYmVyIGQpCi17Ci0gICAgY21zRmxvYXQ2NE51bWJlciBwcmV2OwotICAgIF9jbXNBZGFwdGF0aW9uU3RhdGVDaHVua1R5cGUqIHB0ciA9IChfY21zQWRhcHRhdGlvblN0YXRlQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIEFkYXB0YXRpb25TdGF0ZUNvbnRleHQpOwotCi0gICAgLy8gR2V0IHByZXZpb3VzIHZhbHVlIGZvciByZXR1cm4KLSAgICBwcmV2ID0gcHRyIC0+QWRhcHRhdGlvblN0YXRlOwotCi0gICAgLy8gU2V0IHRoZSB2YWx1ZSBpZiBkIGlzIHBvc2l0aXZlIG9yIHplcm8KLSAgICBpZiAoZCA+PSAwLjApIHsKLQotICAgICAgICBwdHIgLT5BZGFwdGF0aW9uU3RhdGUgPSBkOwotICAgIH0KLQotICAgIC8vIEFsd2F5cyByZXR1cm4gcHJldmlvdXMgdmFsdWUKLSAgICByZXR1cm4gcHJldjsKLX0KLQotCi0vLyBUaGUgYWRhcHRhdGlvbiBzdGF0ZSBtYXkgYmUgZGVmYXVsdGVkIGJ5IHRoaXMgZnVuY3Rpb24uIElmIHlvdSBkb24ndCBsaWtlIGl0LCB1c2UgdGhlIGV4dGVuZGVkIHRyYW5zZm9ybSByb3V0aW5lCi1jbXNGbG9hdDY0TnVtYmVyIENNU0VYUE9SVCBjbXNTZXRBZGFwdGF0aW9uU3RhdGUoY21zRmxvYXQ2NE51bWJlciBkKQoteyAgICAKLSAgICByZXR1cm4gY21zU2V0QWRhcHRhdGlvblN0YXRlVEhSKE5VTEwsIGQpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBBbGFybSBjb2RlcyBmb3IgMTYtYml0IHRyYW5zZm9ybWF0aW9ucywgYmVjYXVzZSB0aGUgZml4ZWQgcmFuZ2Ugb2YgY29udGFpbmVycyB0aGVyZSBhcmUKLS8vIG5vIHZhbHVlcyBsZWZ0IHRvIG1hcmsgb3V0IG9mIGdhbXV0LiAKLQotI2RlZmluZSBERUZBVUxUX0FMQVJNX0NPREVTX1ZBTFVFIHsweDdGMDAsIDB4N0YwMCwgMHg3RjAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfQotCi1fY21zQWxhcm1Db2Rlc0NodW5rVHlwZSBfY21zQWxhcm1Db2Rlc0NodW5rID0geyBERUZBVUxUX0FMQVJNX0NPREVTX1ZBTFVFIH07Ci0KLS8vIFNldHMgdGhlIGNvZGVzIHVzZWQgdG8gbWFyayBvdXQtb3V0LWdhbXV0IG9uIFByb29maW5nIHRyYW5zZm9ybXMgZm9yIGEgZ2l2ZW4gY29udGV4dC4gVmFsdWVzIGFyZSBtZWFudCB0byBiZSAKLS8vIGVuY29kZWQgaW4gMTYgYml0cy4KLXZvaWQgQ01TRVhQT1JUIGNtc1NldEFsYXJtQ29kZXNUSFIoY21zQ29udGV4dCBDb250ZXh0SUQsIGNvbnN0IGNtc1VJbnQxNk51bWJlciBBbGFybUNvZGVzUFtjbXNNQVhDSEFOTkVMU10pCi17Ci0gICAgX2Ntc0FsYXJtQ29kZXNDaHVua1R5cGUqIENvbnRleHRBbGFybUNvZGVzID0gKF9jbXNBbGFybUNvZGVzQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIEFsYXJtQ29kZXNDb250ZXh0KTsKLSAgICAgICAKLSAgICBfY21zQXNzZXJ0KENvbnRleHRBbGFybUNvZGVzICE9IE5VTEwpOyAvLyBDYW4ndCBoYXBwZW4KLSAgICAKLSAgICBtZW1jcHkoQ29udGV4dEFsYXJtQ29kZXMtPkFsYXJtQ29kZXMsIEFsYXJtQ29kZXNQLCBzaXplb2YoQ29udGV4dEFsYXJtQ29kZXMtPkFsYXJtQ29kZXMpKTsgICAgCi19Ci0KLS8vIEdldHMgdGhlIGN1cnJlbnQgY29kZXMgdXNlZCB0byBtYXJrIG91dC1vdXQtZ2FtdXQgb24gUHJvb2ZpbmcgdHJhbnNmb3JtcyBmb3IgdGhlIGdpdmVuIGNvbnRleHQuCi0vLyBWYWx1ZXMgYXJlIG1lYW50IHRvIGJlIGVuY29kZWQgaW4gMTYgYml0cy4KLXZvaWQgQ01TRVhQT1JUIGNtc0dldEFsYXJtQ29kZXNUSFIoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQxNk51bWJlciBBbGFybUNvZGVzUFtjbXNNQVhDSEFOTkVMU10pCi17Ci0gICAgX2Ntc0FsYXJtQ29kZXNDaHVua1R5cGUqIENvbnRleHRBbGFybUNvZGVzID0gKF9jbXNBbGFybUNvZGVzQ2h1bmtUeXBlKikgX2Ntc0NvbnRleHRHZXRDbGllbnRDaHVuayhDb250ZXh0SUQsIEFsYXJtQ29kZXNDb250ZXh0KTsKLQotICAgIF9jbXNBc3NlcnQoQ29udGV4dEFsYXJtQ29kZXMgIT0gTlVMTCk7IC8vIENhbid0IGhhcHBlbgotCi0gICAgbWVtY3B5KEFsYXJtQ29kZXNQLCBDb250ZXh0QWxhcm1Db2Rlcy0+QWxhcm1Db2Rlcywgc2l6ZW9mKENvbnRleHRBbGFybUNvZGVzLT5BbGFybUNvZGVzKSk7Ci19Ci0KLXZvaWQgQ01TRVhQT1JUIGNtc1NldEFsYXJtQ29kZXMoY29uc3QgY21zVUludDE2TnVtYmVyIE5ld0FsYXJtW2Ntc01BWENIQU5ORUxTXSkKLXsKLSAgICBfY21zQXNzZXJ0KE5ld0FsYXJtICE9IE5VTEwpOwotCi0gICAgY21zU2V0QWxhcm1Db2Rlc1RIUihOVUxMLCBOZXdBbGFybSk7Ci19Ci0KLXZvaWQgQ01TRVhQT1JUIGNtc0dldEFsYXJtQ29kZXMoY21zVUludDE2TnVtYmVyIE9sZEFsYXJtW2Ntc01BWENIQU5ORUxTXSkKLXsgCi0gICAgX2Ntc0Fzc2VydChPbGRBbGFybSAhPSBOVUxMKTsKLSAgICBjbXNHZXRBbGFybUNvZGVzVEhSKE5VTEwsIE9sZEFsYXJtKTsKLX0KLQotCi0vLyBJbml0IGFuZCBkdXBsaWNhdGUgYWxhcm0gY29kZXMKLXZvaWQgX2Ntc0FsbG9jQWxhcm1Db2Rlc0NodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCi17Ci0gICAgc3RhdGljIF9jbXNBbGFybUNvZGVzQ2h1bmtUeXBlIEFsYXJtQ29kZXNDaHVuayA9IHsgREVGQVVMVF9BTEFSTV9DT0RFU19WQUxVRSB9OwotICAgIHZvaWQqIGZyb207Ci0gICAgIAotICAgIGlmIChzcmMgIT0gTlVMTCkgewotICAgICAgICBmcm9tID0gc3JjIC0+Y2h1bmtzW0FsYXJtQ29kZXNDb250ZXh0XTsgICAgICAgCi0gICAgfQotICAgIGVsc2UgewotICAgICAgIGZyb20gPSAmQWxhcm1Db2Rlc0NodW5rOwotICAgIH0KLSAgICAKLSAgICBjdHggLT5jaHVua3NbQWxhcm1Db2Rlc0NvbnRleHRdID0gX2Ntc1N1YkFsbG9jRHVwKGN0eCAtPk1lbVBvb2wsIGZyb20sIHNpemVvZihfY21zQWxhcm1Db2Rlc0NodW5rVHlwZSkpOyAgICAgCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEdldCByaWQgb2YgdHJhbnNmb3JtIHJlc291cmNlcwotdm9pZCBDTVNFWFBPUlQgY21zRGVsZXRlVHJhbnNmb3JtKGNtc0hUUkFOU0ZPUk0gaFRyYW5zZm9ybSkKLXsKLSAgICBfY21zVFJBTlNGT1JNKiBwID0gKF9jbXNUUkFOU0ZPUk0qKSBoVHJhbnNmb3JtOwotCi0gICAgX2Ntc0Fzc2VydChwICE9IE5VTEwpOwotCi0gICAgaWYgKHAgLT4gR2FtdXRDaGVjaykKLSAgICAgICAgY21zUGlwZWxpbmVGcmVlKHAgLT4gR2FtdXRDaGVjayk7Ci0KLSAgICBpZiAocCAtPiBMdXQpCi0gICAgICAgIGNtc1BpcGVsaW5lRnJlZShwIC0+IEx1dCk7Ci0KLSAgICBpZiAocCAtPklucHV0Q29sb3JhbnQpCi0gICAgICAgIGNtc0ZyZWVOYW1lZENvbG9yTGlzdChwIC0+SW5wdXRDb2xvcmFudCk7Ci0KLSAgICBpZiAocCAtPiBPdXRwdXRDb2xvcmFudCkKLSAgICAgICAgY21zRnJlZU5hbWVkQ29sb3JMaXN0KHAgLT5PdXRwdXRDb2xvcmFudCk7Ci0KLSAgICBpZiAocCAtPlNlcXVlbmNlKQotICAgICAgICBjbXNGcmVlUHJvZmlsZVNlcXVlbmNlRGVzY3JpcHRpb24ocCAtPlNlcXVlbmNlKTsKLQotICAgIGlmIChwIC0+VXNlckRhdGEpCi0gICAgICAgIHAgLT5GcmVlVXNlckRhdGEocCAtPkNvbnRleHRJRCwgcCAtPlVzZXJEYXRhKTsKLQotICAgIF9jbXNGcmVlKHAgLT5Db250ZXh0SUQsICh2b2lkICopIHApOwotfQotCi0vLyBBcHBseSB0cmFuc2Zvcm0uCi12b2lkIENNU0VYUE9SVCBjbXNEb1RyYW5zZm9ybShjbXNIVFJBTlNGT1JNICBUcmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBJbnB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTaXplKQotCi17Ci0gICAgX2Ntc1RSQU5TRk9STSogcCA9IChfY21zVFJBTlNGT1JNKikgVHJhbnNmb3JtOwotCi0gICAgcCAtPiB4Zm9ybShwLCBJbnB1dEJ1ZmZlciwgT3V0cHV0QnVmZmVyLCBTaXplLCBTaXplKTsKLX0KLQotCi0vLyBBcHBseSB0cmFuc2Zvcm0uCi12b2lkIENNU0VYUE9SVCBjbXNEb1RyYW5zZm9ybVN0cmlkZShjbXNIVFJBTlNGT1JNICBUcmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBJbnB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIE91dHB1dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTaXplLCBjbXNVSW50MzJOdW1iZXIgU3RyaWRlKQotCi17Ci0gICAgX2Ntc1RSQU5TRk9STSogcCA9IChfY21zVFJBTlNGT1JNKikgVHJhbnNmb3JtOwotCi0gICAgcCAtPiB4Zm9ybShwLCBJbnB1dEJ1ZmZlciwgT3V0cHV0QnVmZmVyLCBTaXplLCBTdHJpZGUpOwotfQotCi0KLS8vIFRyYW5zZm9ybSByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEZsb2F0IHhmb3JtIGNvbnZlcnRzIGZsb2F0cy4gU2luY2UgdGhlcmUgYXJlIG5vIHBlcmZvcm1hbmNlIGlzc3Vlcywgb25lIHJvdXRpbmUgZG9lcyBhbGwgam9iLCBpbmNsdWRpbmcgZ2FtdXQgY2hlY2suCi0vLyBOb3RlIHRoYXQgYmVjYXVzZSBleHRlbmRlZCByYW5nZSwgd2UgY2FuIHVzZSBhIC0xLjAgdmFsdWUgZm9yIG91dCBvZiBnYW11dCBpbiB0aGlzIGNhc2UuCi1zdGF0aWMKLXZvaWQgRmxvYXRYRk9STShfY21zVFJBTlNGT1JNKiBwLAotICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGluLAotICAgICAgICAgICAgICAgIHZvaWQqIG91dCwgY21zVUludDMyTnVtYmVyIFNpemUsIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgY21zVUludDhOdW1iZXIqIGFjY3VtOwotICAgIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQ7Ci0gICAgY21zRmxvYXQzMk51bWJlciBmSW5bY21zTUFYQ0hBTk5FTFNdLCBmT3V0W2Ntc01BWENIQU5ORUxTXTsKLSAgICBjbXNGbG9hdDMyTnVtYmVyIE91dE9mR2FtdXQ7Ci0gICAgY21zVUludDMyTnVtYmVyIGksIGo7Ci0KLSAgICBhY2N1bSAgPSAoY21zVUludDhOdW1iZXIqKSAgaW47Ci0gICAgb3V0cHV0ID0gKGNtc1VJbnQ4TnVtYmVyKikgIG91dDsKLQotICAgIGZvciAoaT0wOyBpIDwgU2l6ZTsgaSsrKSB7Ci0KLSAgICAgICAgYWNjdW0gPSBwIC0+IEZyb21JbnB1dEZsb2F0KHAsIGZJbiwgYWNjdW0sIFN0cmlkZSk7Ci0KLSAgICAgICAgLy8gQW55IGdhbXV0IGNoYWNrIHRvIGRvPwotICAgICAgICBpZiAocCAtPkdhbXV0Q2hlY2sgIT0gTlVMTCkgewotCi0gICAgICAgICAgICAvLyBFdmFsdWF0ZSBnYW11dCBtYXJrZXIuCi0gICAgICAgICAgICBjbXNQaXBlbGluZUV2YWxGbG9hdCggZkluLCAmT3V0T2ZHYW11dCwgcCAtPkdhbXV0Q2hlY2spOwotCi0gICAgICAgICAgICAvLyBJcyBjdXJyZW50IGNvbG9yIG91dCBvZiBnYW11dD8KLSAgICAgICAgICAgIGlmIChPdXRPZkdhbXV0ID4gMC4wKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBDZXJ0YWlubHksIG91dCBvZiBnYW11dAotICAgICAgICAgICAgICAgIGZvciAoaj0wOyBqIDwgY21zTUFYQ0hBTk5FTFM7IGorKykKLSAgICAgICAgICAgICAgICAgICAgZk91dFtqXSA9IC0xLjA7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIE5vLCBwcm9jZWVkIG5vcm1hbGx5Ci0gICAgICAgICAgICAgICAgY21zUGlwZWxpbmVFdmFsRmxvYXQoZkluLCBmT3V0LCBwIC0+IEx1dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0KLSAgICAgICAgICAgIC8vIE5vIGdhbXV0IGNoZWNrIGF0IGFsbAotICAgICAgICAgICAgY21zUGlwZWxpbmVFdmFsRmxvYXQoZkluLCBmT3V0LCBwIC0+IEx1dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBCYWNrIHRvIGFza2VkIHJlcHJlc2VudGF0aW9uCi0gICAgICAgIG91dHB1dCA9IHAgLT4gVG9PdXRwdXRGbG9hdChwLCBmT3V0LCBvdXRwdXQsIFN0cmlkZSk7Ci0gICAgfQotfQotCi0KLXN0YXRpYwotdm9pZCBOdWxsRmxvYXRYRk9STShfY21zVFJBTlNGT1JNKiBwLAotICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBpbiwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCogb3V0LCAKLSAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFNpemUsCi0gICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgY21zVUludDhOdW1iZXIqIGFjY3VtOwotICAgIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQ7Ci0gICAgY21zRmxvYXQzMk51bWJlciBmSW5bY21zTUFYQ0hBTk5FTFNdOwotICAgIGNtc1VJbnQzMk51bWJlciBpLCBuOwotCi0gICAgYWNjdW0gID0gKGNtc1VJbnQ4TnVtYmVyKikgIGluOwotICAgIG91dHB1dCA9IChjbXNVSW50OE51bWJlciopICBvdXQ7Ci0gICAgbiA9IFNpemU7ICAgICAgICAgICAgICAgICAgIAotCi0gICAgZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKLQotICAgICAgICBhY2N1bSAgPSBwIC0+IEZyb21JbnB1dEZsb2F0KHAsIGZJbiwgYWNjdW0sIFN0cmlkZSk7Ci0gICAgICAgIG91dHB1dCA9IHAgLT4gVG9PdXRwdXRGbG9hdChwLCBmSW4sIG91dHB1dCwgU3RyaWRlKTsKLSAgICB9Ci19Ci0KLS8vIDE2IGJpdCBwcmVjaXNpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gTnVsbCB0cmFuc2Zvcm1hdGlvbiwgb25seSBhcHBsaWVzIGZvcm1hdHRlcnMuIE5vIGNhY2g/c3RhdGljCi12b2lkIE51bGxYRk9STShfY21zVFJBTlNGT1JNKiBwLAotICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogaW4sCi0gICAgICAgICAgICAgICB2b2lkKiBvdXQsIGNtc1VJbnQzMk51bWJlciBTaXplLAotICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICBjbXNVSW50OE51bWJlciogYWNjdW07Ci0gICAgY21zVUludDhOdW1iZXIqIG91dHB1dDsKLSAgICBjbXNVSW50MTZOdW1iZXIgd0luW2Ntc01BWENIQU5ORUxTXTsKLSAgICBjbXNVSW50MzJOdW1iZXIgaSwgbjsKLQotICAgIGFjY3VtICA9IChjbXNVSW50OE51bWJlciopICBpbjsKLSAgICBvdXRwdXQgPSAoY21zVUludDhOdW1iZXIqKSAgb3V0OwotICAgIG4gPSBTaXplOyAgICAgICAgICAgICAgICAgICAgLy8gQnVmZmVyIGxlbgotCi0gICAgZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKLQotICAgICAgICBhY2N1bSAgPSBwIC0+IEZyb21JbnB1dChwLCB3SW4sIGFjY3VtLCBTdHJpZGUpOwotICAgICAgICBvdXRwdXQgPSBwIC0+IFRvT3V0cHV0KHAsIHdJbiwgb3V0cHV0LCBTdHJpZGUpOwotICAgIH0KLX0KLQotCi0vLyBObyBnYW11dCBjaGVjaywgbm8gY2FjaGUsIDE2IGJpdHMKLXN0YXRpYwotdm9pZCBQcmVjYWxjdWxhdGVkWEZPUk0oX2Ntc1RSQU5TRk9STSogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGluLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3V0LCBjbXNVSW50MzJOdW1iZXIgU2l6ZSwgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICByZWdpc3RlciBjbXNVSW50OE51bWJlciogYWNjdW07Ci0gICAgcmVnaXN0ZXIgY21zVUludDhOdW1iZXIqIG91dHB1dDsKLSAgICBjbXNVSW50MTZOdW1iZXIgd0luW2Ntc01BWENIQU5ORUxTXSwgd091dFtjbXNNQVhDSEFOTkVMU107Ci0gICAgY21zVUludDMyTnVtYmVyIGksIG47Ci0KLSAgICBhY2N1bSAgPSAoY21zVUludDhOdW1iZXIqKSAgaW47Ci0gICAgb3V0cHV0ID0gKGNtc1VJbnQ4TnVtYmVyKikgIG91dDsKLSAgICBuID0gU2l6ZTsKLQotICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7Ci0KLSAgICAgICAgYWNjdW0gPSBwIC0+IEZyb21JbnB1dChwLCB3SW4sIGFjY3VtLCBTdHJpZGUpOwotICAgICAgICBwIC0+THV0IC0+RXZhbDE2Rm4od0luLCB3T3V0LCBwIC0+IEx1dC0+RGF0YSk7Ci0gICAgICAgIG91dHB1dCA9IHAgLT4gVG9PdXRwdXQocCwgd091dCwgb3V0cHV0LCBTdHJpZGUpOwotICAgIH0KLX0KLQotCi0vLyBBdXhpbGlhcjogSGFuZGxlIHByZWNhbGN1bGF0ZWQgZ2FtdXQgY2hlY2suIFRoZSByZXRyaWV2YWwgb2YgY29udGV4dCBtYXkgYmUgYWxpdHRsZSBiaXQgc2xvdywgYnV0IHRoaXMgZnVuY3Rpb24gaXMgbm90IGNyaXRpY2FsLgotc3RhdGljCi12b2lkIFRyYW5zZm9ybU9uZVBpeGVsV2l0aEdhbXV0Q2hlY2soX2Ntc1RSQU5TRk9STSogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNVSW50MTZOdW1iZXIgd0luW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDE2TnVtYmVyIHdPdXRbXSkKLXsKLSAgICBjbXNVSW50MTZOdW1iZXIgd091dE9mR2FtdXQ7Ci0KLSAgICBwIC0+R2FtdXRDaGVjayAtPkV2YWwxNkZuKHdJbiwgJndPdXRPZkdhbXV0LCBwIC0+R2FtdXRDaGVjayAtPkRhdGEpOwotICAgIGlmICh3T3V0T2ZHYW11dCA+PSAxKSB7Ci0KLSAgICAgICAgY21zVUludDE2TnVtYmVyIGk7Ci0gICAgICAgIF9jbXNBbGFybUNvZGVzQ2h1bmtUeXBlKiBDb250ZXh0QWxhcm1Db2RlcyA9IChfY21zQWxhcm1Db2Rlc0NodW5rVHlwZSopIF9jbXNDb250ZXh0R2V0Q2xpZW50Q2h1bmsocC0+Q29udGV4dElELCBBbGFybUNvZGVzQ29udGV4dCk7ICAgICAgICAKLQotICAgICAgICBmb3IgKGk9MDsgaSA8IHAgLT5MdXQtPk91dHB1dENoYW5uZWxzOyBpKyspIHsKLQotICAgICAgICAgICAgd091dFtpXSA9IENvbnRleHRBbGFybUNvZGVzIC0+QWxhcm1Db2Rlc1tpXTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgICAgIHAgLT5MdXQgLT5FdmFsMTZGbih3SW4sIHdPdXQsIHAgLT4gTHV0LT5EYXRhKTsKLX0KLQotLy8gR2FtdXQgY2hlY2ssIE5vIGNhY2g/IDE2IGJpdHMuCi1zdGF0aWMKLXZvaWQgUHJlY2FsY3VsYXRlZFhGT1JNR2FtdXRDaGVjayhfY21zVFJBTlNGT1JNKiBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIG91dCwgY21zVUludDMyTnVtYmVyIFNpemUsIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgY21zVUludDhOdW1iZXIqIGFjY3VtOwotICAgIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQ7Ci0gICAgY21zVUludDE2TnVtYmVyIHdJbltjbXNNQVhDSEFOTkVMU10sIHdPdXRbY21zTUFYQ0hBTk5FTFNdOwotICAgIGNtc1VJbnQzMk51bWJlciBpLCBuOwotCi0gICAgYWNjdW0gID0gKGNtc1VJbnQ4TnVtYmVyKikgIGluOwotICAgIG91dHB1dCA9IChjbXNVSW50OE51bWJlciopICBvdXQ7Ci0gICAgbiA9IFNpemU7ICAgICAgICAgICAgICAgICAgICAvLyBCdWZmZXIgbGVuCi0KLSAgICBmb3IgKGk9MDsgaSA8IG47IGkrKykgewotCi0gICAgICAgIGFjY3VtID0gcCAtPiBGcm9tSW5wdXQocCwgd0luLCBhY2N1bSwgU3RyaWRlKTsKLSAgICAgICAgVHJhbnNmb3JtT25lUGl4ZWxXaXRoR2FtdXRDaGVjayhwLCB3SW4sIHdPdXQpOwotICAgICAgICBvdXRwdXQgPSBwIC0+IFRvT3V0cHV0KHAsIHdPdXQsIG91dHB1dCwgU3RyaWRlKTsKLSAgICB9Ci19Ci0KLQotLy8gTm8gZ2FtdXQgY2hlY2ssIENhY2g/IDE2IGJpdHMsCi1zdGF0aWMKLXZvaWQgQ2FjaGVkWEZPUk0oX2Ntc1RSQU5TRk9STSogcCwKLSAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogaW4sCi0gICAgICAgICAgICAgICAgIHZvaWQqIG91dCwgY21zVUludDMyTnVtYmVyIFNpemUsIGNtc1VJbnQzMk51bWJlciBTdHJpZGUpCi17Ci0gICAgY21zVUludDhOdW1iZXIqIGFjY3VtOwotICAgIGNtc1VJbnQ4TnVtYmVyKiBvdXRwdXQ7Ci0gICAgY21zVUludDE2TnVtYmVyIHdJbltjbXNNQVhDSEFOTkVMU10sIHdPdXRbY21zTUFYQ0hBTk5FTFNdOwotICAgIGNtc1VJbnQzMk51bWJlciBpLCBuOwotICAgIF9jbXNDQUNIRSBDYWNoZTsKLQotICAgIGFjY3VtICA9IChjbXNVSW50OE51bWJlciopICBpbjsKLSAgICBvdXRwdXQgPSAoY21zVUludDhOdW1iZXIqKSAgb3V0OwotICAgIG4gPSBTaXplOyAgICAgICAgICAgICAgICAgICAgLy8gQnVmZmVyIGxlbgotCi0gICAgLy8gRW1wdHkgYnVmZmVycyBmb3IgcXVpY2sgbWVtY21wCi0gICAgbWVtc2V0KHdJbiwgIDAsIHNpemVvZih3SW4pKTsKLSAgICBtZW1zZXQod091dCwgMCwgc2l6ZW9mKHdPdXQpKTsKLQotICAgIC8vIEdldCBjb3B5IG9mIHplcm8gY2FjaGUKLSAgICBtZW1jcHkoJkNhY2hlLCAmcCAtPkNhY2hlLCBzaXplb2YoQ2FjaGUpKTsKLQotICAgIGZvciAoaT0wOyBpIDwgbjsgaSsrKSB7Ci0KLSAgICAgICAgYWNjdW0gPSBwIC0+IEZyb21JbnB1dChwLCB3SW4sIGFjY3VtLCBTdHJpZGUpOwotCi0gICAgICAgIGlmIChtZW1jbXAod0luLCBDYWNoZS5DYWNoZUluLCBzaXplb2YoQ2FjaGUuQ2FjaGVJbikpID09IDApIHsKLQotICAgICAgICAgICAgbWVtY3B5KHdPdXQsIENhY2hlLkNhY2hlT3V0LCBzaXplb2YoQ2FjaGUuQ2FjaGVPdXQpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLQotICAgICAgICAgICAgcCAtPkx1dCAtPkV2YWwxNkZuKHdJbiwgd091dCwgcCAtPiBMdXQtPkRhdGEpOwotCi0gICAgICAgICAgICBtZW1jcHkoQ2FjaGUuQ2FjaGVJbiwgIHdJbiwgIHNpemVvZihDYWNoZS5DYWNoZUluKSk7Ci0gICAgICAgICAgICBtZW1jcHkoQ2FjaGUuQ2FjaGVPdXQsIHdPdXQsIHNpemVvZihDYWNoZS5DYWNoZU91dCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0cHV0ID0gcCAtPiBUb091dHB1dChwLCB3T3V0LCBvdXRwdXQsIFN0cmlkZSk7Ci0gICAgfQotCi19Ci0KLQotLy8gQWxsIHRob3NlIG5pY2UgZmVhdHVyZXMgdG9nZXRoZXIKLXN0YXRpYwotdm9pZCBDYWNoZWRYRk9STUdhbXV0Q2hlY2soX2Ntc1RSQU5TRk9STSogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogb3V0LCBjbXNVSW50MzJOdW1iZXIgU2l6ZSwgY21zVUludDMyTnVtYmVyIFN0cmlkZSkKLXsKLSAgICAgICBjbXNVSW50OE51bWJlciogYWNjdW07Ci0gICAgICAgY21zVUludDhOdW1iZXIqIG91dHB1dDsKLSAgICAgICBjbXNVSW50MTZOdW1iZXIgd0luW2Ntc01BWENIQU5ORUxTXSwgd091dFtjbXNNQVhDSEFOTkVMU107Ci0gICAgICAgY21zVUludDMyTnVtYmVyIGksIG47Ci0gICAgICAgX2Ntc0NBQ0hFIENhY2hlOwotCi0gICAgICAgYWNjdW0gID0gKGNtc1VJbnQ4TnVtYmVyKikgIGluOwotICAgICAgIG91dHB1dCA9IChjbXNVSW50OE51bWJlciopICBvdXQ7Ci0gICAgICAgbiA9IFNpemU7ICAgICAgICAgICAgICAgICAgICAvLyBCdWZmZXIgbGVuCi0KLSAgICAgICAvLyBFbXB0eSBidWZmZXJzIGZvciBxdWljayBtZW1jbXAKLSAgICAgICBtZW1zZXQod0luLCAgMCwgc2l6ZW9mKGNtc1VJbnQxNk51bWJlcikgKiBjbXNNQVhDSEFOTkVMUyk7Ci0gICAgICAgbWVtc2V0KHdPdXQsIDAsIHNpemVvZihjbXNVSW50MTZOdW1iZXIpICogY21zTUFYQ0hBTk5FTFMpOwotCi0gICAgICAgLy8gR2V0IGNvcHkgb2YgemVybyBjYWNoZQotICAgICAgIG1lbWNweSgmQ2FjaGUsICZwIC0+Q2FjaGUsIHNpemVvZihDYWNoZSkpOwotCi0gICAgICAgZm9yIChpPTA7IGkgPCBuOyBpKyspIHsKLQotICAgICAgICAgICAgYWNjdW0gPSBwIC0+IEZyb21JbnB1dChwLCB3SW4sIGFjY3VtLCBTdHJpZGUpOwotCi0gICAgICAgICAgICBpZiAobWVtY21wKHdJbiwgQ2FjaGUuQ2FjaGVJbiwgc2l6ZW9mKENhY2hlLkNhY2hlSW4pKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweSh3T3V0LCBDYWNoZS5DYWNoZU91dCwgc2l6ZW9mKENhY2hlLkNhY2hlT3V0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtT25lUGl4ZWxXaXRoR2FtdXRDaGVjayhwLCB3SW4sIHdPdXQpOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoQ2FjaGUuQ2FjaGVJbiwgd0luLCBzaXplb2YoQ2FjaGUuQ2FjaGVJbikpOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoQ2FjaGUuQ2FjaGVPdXQsIHdPdXQsIHNpemVvZihDYWNoZS5DYWNoZU91dCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvdXRwdXQgPSBwIC0+IFRvT3V0cHV0KHAsIHdPdXQsIG91dHB1dCwgU3RyaWRlKTsKLSAgICAgICB9Ci0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBMaXN0IG9mIHVzZWQtZGVmaW5lZCB0cmFuc2Zvcm0gZmFjdG9yaWVzCi10eXBlZGVmIHN0cnVjdCBfY21zVHJhbnNmb3JtQ29sbGVjdGlvbl9zdCB7Ci0KLSAgICBfY21zVHJhbnNmb3JtRmFjdG9yeSAgRmFjdG9yeTsKLSAgICBzdHJ1Y3QgX2Ntc1RyYW5zZm9ybUNvbGxlY3Rpb25fc3QgKk5leHQ7Ci0KLX0gX2Ntc1RyYW5zZm9ybUNvbGxlY3Rpb247Ci0KLS8vIFRoZSBsaW5rZWQgbGlzdCBoZWFkCi1fY21zVHJhbnNmb3JtUGx1Z2luQ2h1bmtUeXBlIF9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVuayA9IHsgTlVMTCB9OwotCi0KLS8vIER1cGxpY2F0ZXMgdGhlIHpvbmUgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIHBsdWctaW4gaW4gdGhlIG5ldyBjb250ZXh0Ci1zdGF0aWMKLXZvaWQgRHVwUGx1Z2luVHJhbnNmb3JtTGlzdChzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCi17Ci0gICBfY21zVHJhbnNmb3JtUGx1Z2luQ2h1bmtUeXBlIG5ld0hlYWQgPSB7IE5VTEwgfTsKLSAgIF9jbXNUcmFuc2Zvcm1Db2xsZWN0aW9uKiAgZW50cnk7Ci0gICBfY21zVHJhbnNmb3JtQ29sbGVjdGlvbiogIEFudGVyaW9yID0gTlVMTDsKLSAgIF9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVua1R5cGUqIGhlYWQgPSAoX2Ntc1RyYW5zZm9ybVBsdWdpbkNodW5rVHlwZSopIHNyYy0+Y2h1bmtzW1RyYW5zZm9ybVBsdWdpbl07Ci0KLSAgICAvLyBXYWxrIHRoZSBsaXN0IGNvcHlpbmcgYWxsIG5vZGVzCi0gICBmb3IgKGVudHJ5ID0gaGVhZC0+VHJhbnNmb3JtQ29sbGVjdGlvbjsKLSAgICAgICAgZW50cnkgIT0gTlVMTDsKLSAgICAgICAgZW50cnkgPSBlbnRyeSAtPk5leHQpIHsKLQotICAgICAgICAgICAgX2Ntc1RyYW5zZm9ybUNvbGxlY3Rpb24gKm5ld0VudHJ5ID0gKCBfY21zVHJhbnNmb3JtQ29sbGVjdGlvbiAqKSBfY21zU3ViQWxsb2NEdXAoY3R4IC0+TWVtUG9vbCwgZW50cnksIHNpemVvZihfY21zVHJhbnNmb3JtQ29sbGVjdGlvbikpOwotICAgCi0gICAgICAgICAgICBpZiAobmV3RW50cnkgPT0gTlVMTCkgCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICAvLyBXZSB3YW50IHRvIGtlZXAgdGhlIGxpbmtlZCBsaXN0IG9yZGVyLCBzbyB0aGlzIGlzIGEgbGl0dGxlIGJpdCB0cmlja3kKLSAgICAgICAgICAgIG5ld0VudHJ5IC0+IE5leHQgPSBOVUxMOwotICAgICAgICAgICAgaWYgKEFudGVyaW9yKQotICAgICAgICAgICAgICAgIEFudGVyaW9yIC0+IE5leHQgPSBuZXdFbnRyeTsKLSAgICAgCi0gICAgICAgICAgICBBbnRlcmlvciA9IG5ld0VudHJ5OwotCi0gICAgICAgICAgICBpZiAobmV3SGVhZC5UcmFuc2Zvcm1Db2xsZWN0aW9uID09IE5VTEwpCi0gICAgICAgICAgICAgICAgbmV3SGVhZC5UcmFuc2Zvcm1Db2xsZWN0aW9uID0gbmV3RW50cnk7Ci0gICAgfQotCi0gIGN0eCAtPmNodW5rc1tUcmFuc2Zvcm1QbHVnaW5dID0gX2Ntc1N1YkFsbG9jRHVwKGN0eC0+TWVtUG9vbCwgJm5ld0hlYWQsIHNpemVvZihfY21zVHJhbnNmb3JtUGx1Z2luQ2h1bmtUeXBlKSk7Ci19Ci0KLXZvaWQgX2Ntc0FsbG9jVHJhbnNmb3JtUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpCi17Ci0gICAgaWYgKHNyYyAhPSBOVUxMKSB7Ci0KLSAgICAgICAgLy8gQ29weSBhbGwgbGlua2VkIGxpc3QKLSAgICAgICAgRHVwUGx1Z2luVHJhbnNmb3JtTGlzdChjdHgsIHNyYyk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBzdGF0aWMgX2Ntc1RyYW5zZm9ybVBsdWdpbkNodW5rVHlwZSBUcmFuc2Zvcm1QbHVnaW5DaHVua1R5cGUgPSB7IE5VTEwgfTsKLSAgICAgICAgY3R4IC0+Y2h1bmtzW1RyYW5zZm9ybVBsdWdpbl0gPSBfY21zU3ViQWxsb2NEdXAoY3R4IC0+TWVtUG9vbCwgJlRyYW5zZm9ybVBsdWdpbkNodW5rVHlwZSwgc2l6ZW9mKF9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVua1R5cGUpKTsKLSAgICB9Ci19Ci0KLQotCi0vLyBSZWdpc3RlciBuZXcgd2F5cyB0byB0cmFuc2Zvcm0KLWNtc0Jvb2wgIF9jbXNSZWdpc3RlclRyYW5zZm9ybVBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogRGF0YSkKLXsKLSAgICBjbXNQbHVnaW5UcmFuc2Zvcm0qIFBsdWdpbiA9IChjbXNQbHVnaW5UcmFuc2Zvcm0qKSBEYXRhOwotICAgIF9jbXNUcmFuc2Zvcm1Db2xsZWN0aW9uKiBmbDsKLSAgICBfY21zVHJhbnNmb3JtUGx1Z2luQ2h1bmtUeXBlKiBjdHggPSAoIF9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCxUcmFuc2Zvcm1QbHVnaW4pOwotCi0gICAgaWYgKERhdGEgPT0gTlVMTCkgewotCi0gICAgICAgIC8vIEZyZWUgdGhlIGNoYWluLiBNZW1vcnkgaXMgc2FmZWx5IGZyZWVkIGF0IGV4aXQKLSAgICAgICAgY3R4LT5UcmFuc2Zvcm1Db2xsZWN0aW9uID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgLy8gRmFjdG9yeSBjYWxsYmFjayBpcyByZXF1aXJlZAotICAgIGlmIChQbHVnaW4gLT5GYWN0b3J5ID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQotCi0gICAgZmwgPSAoX2Ntc1RyYW5zZm9ybUNvbGxlY3Rpb24qKSBfY21zUGx1Z2luTWFsbG9jKENvbnRleHRJRCwgc2l6ZW9mKF9jbXNUcmFuc2Zvcm1Db2xsZWN0aW9uKSk7Ci0gICAgaWYgKGZsID09IE5VTEwpIHJldHVybiBGQUxTRTsKLQotICAgIC8vIENvcHkgdGhlIHBhcmFtZXRlcnMKLSAgICBmbCAtPkZhY3RvcnkgPSBQbHVnaW4gLT5GYWN0b3J5OwotCi0gICAgLy8gS2VlcCBsaW5rZWQgbGlzdAotICAgIGZsIC0+TmV4dCA9IGN0eC0+VHJhbnNmb3JtQ29sbGVjdGlvbjsKLSAgICBjdHgtPlRyYW5zZm9ybUNvbGxlY3Rpb24gPSBmbDsKLQotICAgIC8vIEFsbCBpcyBvawotICAgIHJldHVybiBUUlVFOwotfQotCi0KLXZvaWQgQ01TRVhQT1JUIF9jbXNTZXRUcmFuc2Zvcm1Vc2VyRGF0YShzdHJ1Y3QgX2Ntc3RyYW5zZm9ybV9zdHJ1Y3QgKkNNTWNhcmdvLCB2b2lkKiBwdHIsIF9jbXNGcmVlVXNlckRhdGFGbiBGcmVlUHJpdmF0ZURhdGFGbikKLXsKLSAgICBfY21zQXNzZXJ0KENNTWNhcmdvICE9IE5VTEwpOwotICAgIENNTWNhcmdvIC0+VXNlckRhdGEgPSBwdHI7Ci0gICAgQ01NY2FyZ28gLT5GcmVlVXNlckRhdGEgPSBGcmVlUHJpdmF0ZURhdGFGbjsKLX0KLQotLy8gcmV0dXJucyB0aGUgcG9pbnRlciBkZWZpbmVkIGJ5IHRoZSBwbHVnLWluIHRvIHN0b3JlIHByaXZhdGUgZGF0YQotdm9pZCAqIENNU0VYUE9SVCBfY21zR2V0VHJhbnNmb3JtVXNlckRhdGEoc3RydWN0IF9jbXN0cmFuc2Zvcm1fc3RydWN0ICpDTU1jYXJnbykKLXsKLSAgICBfY21zQXNzZXJ0KENNTWNhcmdvICE9IE5VTEwpOwotICAgIHJldHVybiBDTU1jYXJnbyAtPlVzZXJEYXRhOwotfQotCi0vLyByZXR1cm5zIHRoZSBjdXJyZW50IGZvcm1hdHRlcnMKLXZvaWQgQ01TRVhQT1JUIF9jbXNHZXRUcmFuc2Zvcm1Gb3JtYXR0ZXJzMTYoc3RydWN0IF9jbXN0cmFuc2Zvcm1fc3RydWN0ICpDTU1jYXJnbywgY21zRm9ybWF0dGVyMTYqIEZyb21JbnB1dCwgY21zRm9ybWF0dGVyMTYqIFRvT3V0cHV0KQotewotICAgICBfY21zQXNzZXJ0KENNTWNhcmdvICE9IE5VTEwpOwotICAgICBpZiAoRnJvbUlucHV0KSAqRnJvbUlucHV0ID0gQ01NY2FyZ28gLT5Gcm9tSW5wdXQ7Ci0gICAgIGlmIChUb091dHB1dCkgICpUb091dHB1dCAgPSBDTU1jYXJnbyAtPlRvT3V0cHV0OwotfQotCi12b2lkIENNU0VYUE9SVCBfY21zR2V0VHJhbnNmb3JtRm9ybWF0dGVyc0Zsb2F0KHN0cnVjdCBfY21zdHJhbnNmb3JtX3N0cnVjdCAqQ01NY2FyZ28sIGNtc0Zvcm1hdHRlckZsb2F0KiBGcm9tSW5wdXQsIGNtc0Zvcm1hdHRlckZsb2F0KiBUb091dHB1dCkKLXsKLSAgICAgX2Ntc0Fzc2VydChDTU1jYXJnbyAhPSBOVUxMKTsKLSAgICAgaWYgKEZyb21JbnB1dCkgKkZyb21JbnB1dCA9IENNTWNhcmdvIC0+RnJvbUlucHV0RmxvYXQ7Ci0gICAgIGlmIChUb091dHB1dCkgICpUb091dHB1dCAgPSBDTU1jYXJnbyAtPlRvT3V0cHV0RmxvYXQ7Ci19Ci0KLQotLy8gQWxsb2NhdGUgdHJhbnNmb3JtIHN0cnVjdCBhbmQgc2V0IGl0IHRvIGRlZmF1bHRzLiBBc2sgdGhlIG9wdGltaXphdGlvbiBwbHVnLWluIGFib3V0IGlmIHRob3NlIGZvcm1hdHMgYXJlIHByb3BlcgotLy8gZm9yIHNlcGFyYXRlZCB0cmFuc2Zvcm1zLiBJZiB0aGlzIGlzIHRoZSBjYXNlLAotc3RhdGljCi1fY21zVFJBTlNGT1JNKiBBbGxvY0VtcHR5VHJhbnNmb3JtKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQaXBlbGluZSogbHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW50ZW50LCBjbXNVSW50MzJOdW1iZXIqIElucHV0Rm9ybWF0LCBjbXNVSW50MzJOdW1iZXIqIE91dHB1dEZvcm1hdCwgY21zVUludDMyTnVtYmVyKiBkd0ZsYWdzKQotewotICAgICBfY21zVHJhbnNmb3JtUGx1Z2luQ2h1bmtUeXBlKiBjdHggPSAoIF9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVua1R5cGUqKSBfY21zQ29udGV4dEdldENsaWVudENodW5rKENvbnRleHRJRCwgVHJhbnNmb3JtUGx1Z2luKTsKLSAgICAgX2Ntc1RyYW5zZm9ybUNvbGxlY3Rpb24qIFBsdWdpbjsKLQotICAgIC8vIEFsbG9jYXRlIG5lZWRlZCBtZW1vcnkKLSAgICBfY21zVFJBTlNGT1JNKiBwID0gKF9jbXNUUkFOU0ZPUk0qKSBfY21zTWFsbG9jWmVybyhDb250ZXh0SUQsIHNpemVvZihfY21zVFJBTlNGT1JNKSk7Ci0gICAgaWYgKCFwKSB7Ci0gICAgICBjbXNQaXBlbGluZUZyZWUobHV0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8vIFN0b3JlIHRoZSBwcm9wb3NlZCBwaXBlbGluZQotICAgIHAgLT5MdXQgPSBsdXQ7Ci0KLSAgICAvLyBMZXQncyBzZWUgaWYgYW55IHBsdWctaW4gd2FudCB0byBkbyB0aGUgdHJhbnNmb3JtIGJ5IGl0c2VsZgotICAgIGZvciAoUGx1Z2luID0gY3R4IC0+VHJhbnNmb3JtQ29sbGVjdGlvbjsKLSAgICAgICAgUGx1Z2luICE9IE5VTEw7Ci0gICAgICAgIFBsdWdpbiA9IFBsdWdpbiAtPk5leHQpIHsKLQotICAgICAgICAgICAgaWYgKFBsdWdpbiAtPkZhY3RvcnkoJnAtPnhmb3JtLCAmcC0+VXNlckRhdGEsICZwIC0+RnJlZVVzZXJEYXRhLCAmcCAtPkx1dCwgSW5wdXRGb3JtYXQsIE91dHB1dEZvcm1hdCwgZHdGbGFncykpIHsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBMYXN0IHBsdWdpbiBpbiB0aGUgZGVjbGFyYXRpb24gb3JkZXIgdGFrZXMgY29udHJvbC4gV2UganVzdCBrZWVwCi0gICAgICAgICAgICAgICAgLy8gdGhlIG9yaWdpbmFsIHBhcmFtZXRlcnMgYXMgYSBsb2dnaW5nLiAKLSAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgY21zRkxBR1NfQ0FOX0NIQU5HRV9GT1JNQVRURVIgaXMgbm90IHNldCwgc28gYnkgZGVmYXVsdCAKLSAgICAgICAgICAgICAgICAvLyBhbiBvcHRpbWl6ZWQgdHJhbnNmb3JtIGlzIG5vdCByZXVzYWJsZS4gVGhlIHBsdWctaW4gY2FuLCBob3dldmVyLCBjaGFuZ2UKLSAgICAgICAgICAgICAgICAvLyB0aGUgZmxhZ3MgYW5kIG1ha2UgaXQgc3VpdGFibGUuCi0KLSAgICAgICAgICAgICAgICBwIC0+Q29udGV4dElEICAgICAgID0gQ29udGV4dElEOyAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHAgLT5JbnB1dEZvcm1hdCAgICAgPSAqSW5wdXRGb3JtYXQ7Ci0gICAgICAgICAgICAgICAgcCAtPk91dHB1dEZvcm1hdCAgICA9ICpPdXRwdXRGb3JtYXQ7Ci0gICAgICAgICAgICAgICAgcCAtPmR3T3JpZ2luYWxGbGFncyA9ICpkd0ZsYWdzOwotICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gRmlsbCB0aGUgZm9ybWF0dGVycyBqdXN0IGluIGNhc2UgdGhlIG9wdGltaXplZCByb3V0aW5lIGlzIGludGVyZXN0ZWQuCi0gICAgICAgICAgICAgICAgLy8gTm8gZXJyb3IgaXMgdGhyb3duIGlmIHRoZSBmb3JtYXR0ZXIgZG9lc24ndCBleGlzdC4gSXQgaXMgdXAgdG8gdGhlIG9wdGltaXphdGlvbiAKLSAgICAgICAgICAgICAgICAvLyBmYWN0b3J5IHRvIGRlY2lkZSB3aGF0IHRvIGRvIGluIHRob3NlIGNhc2VzLgotICAgICAgICAgICAgICAgIHAgLT5Gcm9tSW5wdXQgICAgICA9IF9jbXNHZXRGb3JtYXR0ZXIoQ29udGV4dElELCAqSW5wdXRGb3JtYXQsICBjbXNGb3JtYXR0ZXJJbnB1dCwgQ01TX1BBQ0tfRkxBR1NfMTZCSVRTKS5GbXQxNjsKLSAgICAgICAgICAgICAgICBwIC0+VG9PdXRwdXQgICAgICAgPSBfY21zR2V0Rm9ybWF0dGVyKENvbnRleHRJRCwgKk91dHB1dEZvcm1hdCwgY21zRm9ybWF0dGVyT3V0cHV0LCBDTVNfUEFDS19GTEFHU18xNkJJVFMpLkZtdDE2OwotICAgICAgICAgICAgICAgIHAgLT5Gcm9tSW5wdXRGbG9hdCA9IF9jbXNHZXRGb3JtYXR0ZXIoQ29udGV4dElELCAqSW5wdXRGb3JtYXQsICBjbXNGb3JtYXR0ZXJJbnB1dCwgQ01TX1BBQ0tfRkxBR1NfRkxPQVQpLkZtdEZsb2F0OwotICAgICAgICAgICAgICAgIHAgLT5Ub091dHB1dEZsb2F0ICA9IF9jbXNHZXRGb3JtYXR0ZXIoQ29udGV4dElELCAqT3V0cHV0Rm9ybWF0LCBjbXNGb3JtYXR0ZXJPdXRwdXQsIENNU19QQUNLX0ZMQUdTX0ZMT0FUKS5GbXRGbG9hdDsKLQotICAgICAgICAgICAgICAgIHJldHVybiBwOwotICAgICAgICAgICAgfQotICAgIH0KLQotICAgIC8vIE5vdCBzdWl0YWJsZSBmb3IgdGhlIHRyYW5zZm9ybSBwbHVnLWluLCBsZXQncyBjaGVjayAgdGhlIHBpcGVsaW5lIHBsdWctaW4KLSAgICBpZiAocCAtPkx1dCAhPSBOVUxMKQotICAgICAgICBfY21zT3B0aW1pemVQaXBlbGluZShDb250ZXh0SUQsICZwLT5MdXQsIEludGVudCwgSW5wdXRGb3JtYXQsIE91dHB1dEZvcm1hdCwgZHdGbGFncyk7Ci0KLSAgICAvLyBDaGVjayB3aGF0ZXZlciB0aGlzIGlzIGEgdHJ1ZSBmbG9hdGluZyBwb2ludCB0cmFuc2Zvcm0KLSAgICBpZiAoX2Ntc0Zvcm1hdHRlcklzRmxvYXQoKklucHV0Rm9ybWF0KSAmJiBfY21zRm9ybWF0dGVySXNGbG9hdCgqT3V0cHV0Rm9ybWF0KSkgewotCi0gICAgICAgIC8vIEdldCBmb3JtYXR0ZXIgZnVuY3Rpb24gYWx3YXlzIHJldHVybiBhIHZhbGlkIHVuaW9uLCBidXQgdGhlIGNvbnRlbnRzIG9mIHRoaXMgdW5pb24gbWF5IGJlIE5VTEwuCi0gICAgICAgIHAgLT5Gcm9tSW5wdXRGbG9hdCA9IF9jbXNHZXRGb3JtYXR0ZXIoQ29udGV4dElELCAqSW5wdXRGb3JtYXQsICBjbXNGb3JtYXR0ZXJJbnB1dCwgQ01TX1BBQ0tfRkxBR1NfRkxPQVQpLkZtdEZsb2F0OwotICAgICAgICBwIC0+VG9PdXRwdXRGbG9hdCAgPSBfY21zR2V0Rm9ybWF0dGVyKENvbnRleHRJRCwgKk91dHB1dEZvcm1hdCwgY21zRm9ybWF0dGVyT3V0cHV0LCBDTVNfUEFDS19GTEFHU19GTE9BVCkuRm10RmxvYXQ7Ci0gICAgICAgICpkd0ZsYWdzIHw9IGNtc0ZMQUdTX0NBTl9DSEFOR0VfRk9STUFUVEVSOwotCi0gICAgICAgIGlmIChwIC0+RnJvbUlucHV0RmxvYXQgPT0gTlVMTCB8fCBwIC0+VG9PdXRwdXRGbG9hdCA9PSBOVUxMKSB7Ci0KLSAgICAgICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfVU5LTk9XTl9FWFRFTlNJT04sICJVbnN1cHBvcnRlZCByYXN0ZXIgZm9ybWF0Iik7Ci0gICAgICAgICAgICBjbXNEZWxldGVUcmFuc2Zvcm0ocCk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICgqZHdGbGFncyAmIGNtc0ZMQUdTX05VTExUUkFOU0ZPUk0pIHsKLQotICAgICAgICAgICAgcCAtPnhmb3JtID0gTnVsbEZsb2F0WEZPUk07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBGbG9hdCB0cmFuc2Zvcm1zIGRvbid0IHVzZSBjYWNoPyBhbHdheXMgYXJlIG5vbi1OVUxMCi0gICAgICAgICAgICBwIC0+eGZvcm0gPSBGbG9hdFhGT1JNOwotICAgICAgICB9Ci0KLSAgICB9Ci0gICAgZWxzZSB7Ci0KLSAgICAgICAgaWYgKCpJbnB1dEZvcm1hdCA9PSAwICYmICpPdXRwdXRGb3JtYXQgPT0gMCkgewotICAgICAgICAgICAgcCAtPkZyb21JbnB1dCA9IHAgLT5Ub091dHB1dCA9IE5VTEw7Ci0gICAgICAgICAgICAqZHdGbGFncyB8PSBjbXNGTEFHU19DQU5fQ0hBTkdFX0ZPUk1BVFRFUjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLQotICAgICAgICAgICAgaW50IEJ5dGVzUGVyUGl4ZWxJbnB1dDsKLQotICAgICAgICAgICAgcCAtPkZyb21JbnB1dCA9IF9jbXNHZXRGb3JtYXR0ZXIoQ29udGV4dElELCAqSW5wdXRGb3JtYXQsICBjbXNGb3JtYXR0ZXJJbnB1dCwgQ01TX1BBQ0tfRkxBR1NfMTZCSVRTKS5GbXQxNjsKLSAgICAgICAgICAgIHAgLT5Ub091dHB1dCAgPSBfY21zR2V0Rm9ybWF0dGVyKENvbnRleHRJRCwgKk91dHB1dEZvcm1hdCwgY21zRm9ybWF0dGVyT3V0cHV0LCBDTVNfUEFDS19GTEFHU18xNkJJVFMpLkZtdDE2OwotCi0gICAgICAgICAgICBpZiAocCAtPkZyb21JbnB1dCA9PSBOVUxMIHx8IHAgLT5Ub091dHB1dCA9PSBOVUxMKSB7Ci0KLSAgICAgICAgICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5zdXBwb3J0ZWQgcmFzdGVyIGZvcm1hdCIpOwotICAgICAgICAgICAgICAgIGNtc0RlbGV0ZVRyYW5zZm9ybShwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQnl0ZXNQZXJQaXhlbElucHV0ID0gVF9CWVRFUyhwIC0+SW5wdXRGb3JtYXQpOwotICAgICAgICAgICAgaWYgKEJ5dGVzUGVyUGl4ZWxJbnB1dCA9PSAwIHx8IEJ5dGVzUGVyUGl4ZWxJbnB1dCA+PSAyKQotICAgICAgICAgICAgICAgICAgICpkd0ZsYWdzIHw9IGNtc0ZMQUdTX0NBTl9DSEFOR0VfRk9STUFUVEVSOwotCi0gICAgICAgIH0KLQotICAgICAgICBpZiAoKmR3RmxhZ3MgJiBjbXNGTEFHU19OVUxMVFJBTlNGT1JNKSB7Ci0KLSAgICAgICAgICAgIHAgLT54Zm9ybSA9IE51bGxYRk9STTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGlmICgqZHdGbGFncyAmIGNtc0ZMQUdTX05PQ0FDSEUpIHsKLQotICAgICAgICAgICAgICAgIGlmICgqZHdGbGFncyAmIGNtc0ZMQUdTX0dBTVVUQ0hFQ0spCi0gICAgICAgICAgICAgICAgICAgIHAgLT54Zm9ybSA9IFByZWNhbGN1bGF0ZWRYRk9STUdhbXV0Q2hlY2s7ICAvLyBHYW11dCBjaGVjaywgbm8gY2FjaD8KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHAgLT54Zm9ybSA9IFByZWNhbGN1bGF0ZWRYRk9STTsgIC8vIE5vIGNhY2g/IG5vIGdhbXV0IGNoZWNrCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLQotICAgICAgICAgICAgICAgIGlmICgqZHdGbGFncyAmIGNtc0ZMQUdTX0dBTVVUQ0hFQ0spCi0gICAgICAgICAgICAgICAgICAgIHAgLT54Zm9ybSA9IENhY2hlZFhGT1JNR2FtdXRDaGVjazsgICAgLy8gR2FtdXQgY2hlY2ssIGNhY2g/Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBwIC0+eGZvcm0gPSBDYWNoZWRYRk9STTsgIC8vIE5vIGdhbXV0IGNoZWNrLCBjYWNoPwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcCAtPklucHV0Rm9ybWF0ICAgICA9ICpJbnB1dEZvcm1hdDsKLSAgICBwIC0+T3V0cHV0Rm9ybWF0ICAgID0gKk91dHB1dEZvcm1hdDsKLSAgICBwIC0+ZHdPcmlnaW5hbEZsYWdzID0gKmR3RmxhZ3M7Ci0gICAgcCAtPkNvbnRleHRJRCAgICAgICA9IENvbnRleHRJRDsKLSAgICBwIC0+VXNlckRhdGEgICAgICAgID0gTlVMTDsKLSAgICByZXR1cm4gcDsKLX0KLQotc3RhdGljCi1jbXNCb29sIEdldFhGb3JtQ29sb3JTcGFjZXMoaW50IG5Qcm9maWxlcywgY21zSFBST0ZJTEUgaFByb2ZpbGVzW10sIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUqIElucHV0LCBjbXNDb2xvclNwYWNlU2lnbmF0dXJlKiBPdXRwdXQpCi17Ci0gICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBDb2xvclNwYWNlSW4sIENvbG9yU3BhY2VPdXQ7Ci0gICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBQb3N0Q29sb3JTcGFjZTsKLSAgICBpbnQgaTsKLQotICAgIGlmIChuUHJvZmlsZXMgPD0gMCkgcmV0dXJuIEZBTFNFOwotICAgIGlmIChoUHJvZmlsZXNbMF0gPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0gICAgKklucHV0ID0gUG9zdENvbG9yU3BhY2UgPSBjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlc1swXSk7Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG5Qcm9maWxlczsgaSsrKSB7Ci0KLSAgICAgICAgY21zUHJvZmlsZUNsYXNzU2lnbmF0dXJlIGNsczsKLSAgICAgICAgY21zSFBST0ZJTEUgaFByb2ZpbGUgPSBoUHJvZmlsZXNbaV07Ci0KLSAgICAgICAgaW50IGxJc0lucHV0ID0gKFBvc3RDb2xvclNwYWNlICE9IGNtc1NpZ1hZWkRhdGEpICYmCi0gICAgICAgICAgICAgICAgICAgICAgIChQb3N0Q29sb3JTcGFjZSAhPSBjbXNTaWdMYWJEYXRhKTsKLQotICAgICAgICBpZiAoaFByb2ZpbGUgPT0gTlVMTCkgcmV0dXJuIEZBTFNFOwotCi0gICAgICAgIGNscyA9IGNtc0dldERldmljZUNsYXNzKGhQcm9maWxlKTsKLQotICAgICAgICBpZiAoY2xzID09IGNtc1NpZ05hbWVkQ29sb3JDbGFzcykgewotCi0gICAgICAgICAgICBDb2xvclNwYWNlSW4gICAgPSBjbXNTaWcxY29sb3JEYXRhOwotICAgICAgICAgICAgQ29sb3JTcGFjZU91dCAgID0gKG5Qcm9maWxlcyA+IDEpID8gY21zR2V0UENTKGhQcm9maWxlKSA6IGNtc0dldENvbG9yU3BhY2UoaFByb2ZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgaWYgKGxJc0lucHV0IHx8IChjbHMgPT0gY21zU2lnTGlua0NsYXNzKSkgewotCi0gICAgICAgICAgICBDb2xvclNwYWNlSW4gICAgPSBjbXNHZXRDb2xvclNwYWNlKGhQcm9maWxlKTsKLSAgICAgICAgICAgIENvbG9yU3BhY2VPdXQgICA9IGNtc0dldFBDUyhoUHJvZmlsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBDb2xvclNwYWNlSW4gICAgPSBjbXNHZXRQQ1MoaFByb2ZpbGUpOwotICAgICAgICAgICAgQ29sb3JTcGFjZU91dCAgID0gY21zR2V0Q29sb3JTcGFjZShoUHJvZmlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaT09MCkKLSAgICAgICAgICAgICpJbnB1dCA9IENvbG9yU3BhY2VJbjsKLQotICAgICAgICBQb3N0Q29sb3JTcGFjZSA9IENvbG9yU3BhY2VPdXQ7Ci0gICAgfQotCi0gICAgKk91dHB1dCA9IFBvc3RDb2xvclNwYWNlOwotCi0gICAgcmV0dXJuIFRSVUU7Ci19Ci0KLS8vIENoZWNrIGNvbG9yc3BhY2UKLXN0YXRpYwotY21zQm9vbCAgSXNQcm9wZXJDb2xvclNwYWNlKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgQ2hlY2ssIGNtc1VJbnQzMk51bWJlciBkd0Zvcm1hdCkKLXsKLSAgICBpbnQgU3BhY2UxID0gVF9DT0xPUlNQQUNFKGR3Rm9ybWF0KTsKLSAgICBpbnQgU3BhY2UyID0gX2Ntc0xDTVNjb2xvclNwYWNlKENoZWNrKTsKLQotICAgIGlmIChTcGFjZTEgPT0gUFRfQU5ZKSByZXR1cm4gVFJVRTsKLSAgICBpZiAoU3BhY2UxID09IFNwYWNlMikgcmV0dXJuIFRSVUU7Ci0KLSAgICBpZiAoU3BhY2UxID09IFBUX0xhYlYyICYmIFNwYWNlMiA9PSBQVF9MYWIpIHJldHVybiBUUlVFOwotICAgIGlmIChTcGFjZTEgPT0gUFRfTGFiICAgJiYgU3BhY2UyID09IFBUX0xhYlYyKSByZXR1cm4gVFJVRTsKLQotICAgIHJldHVybiBGQUxTRTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMKLXZvaWQgU2V0V2hpdGVQb2ludChjbXNDSUVYWVoqIHd0UHQsIGNvbnN0IGNtc0NJRVhZWiogc3JjKQotewotICAgIGlmIChzcmMgPT0gTlVMTCkgewotICAgICAgICB3dFB0IC0+WCA9IGNtc0Q1MFg7Ci0gICAgICAgIHd0UHQgLT5ZID0gY21zRDUwWTsKLSAgICAgICAgd3RQdCAtPlogPSBjbXNENTBaOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgd3RQdCAtPlggPSBzcmMtPlg7Ci0gICAgICAgIHd0UHQgLT5ZID0gc3JjLT5ZOwotICAgICAgICB3dFB0IC0+WiA9IHNyYy0+WjsKLSAgICB9Ci0KLX0KLQotLy8gTmV3IHRvIGxjbXMgMi4wIC0tIGhhdmUgYWxsIHBhcmFtZXRlcnMgYXZhaWxhYmxlLgotY21zSFRSQU5TRk9STSBDTVNFWFBPUlQgY21zQ3JlYXRlRXh0ZW5kZWRUcmFuc2Zvcm0oY21zQ29udGV4dCBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgblByb2ZpbGVzLCBjbXNIUFJPRklMRSBoUHJvZmlsZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Jvb2wgIEJQQ1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEludGVudHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgQWRhcHRhdGlvblN0YXRlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgaEdhbXV0UHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuR2FtdXRQQ1Nwb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBPdXRwdXRGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKLXsKLSAgICBfY21zVFJBTlNGT1JNKiB4Zm9ybTsgICAgCi0gICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBFbnRyeUNvbG9yU3BhY2U7Ci0gICAgY21zQ29sb3JTcGFjZVNpZ25hdHVyZSBFeGl0Q29sb3JTcGFjZTsKLSAgICBjbXNQaXBlbGluZSogTHV0OwotICAgIGNtc1VJbnQzMk51bWJlciBMYXN0SW50ZW50ID0gSW50ZW50c1tuUHJvZmlsZXMtMV07Ci0KLSAgICAvLyBJZiBpdCBpcyBhIGZha2UgdHJhbnNmb3JtCi0gICAgaWYgKGR3RmxhZ3MgJiBjbXNGTEFHU19OVUxMVFJBTlNGT1JNKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEFsbG9jRW1wdHlUcmFuc2Zvcm0oQ29udGV4dElELCBOVUxMLCBJTlRFTlRfUEVSQ0VQVFVBTCwgJklucHV0Rm9ybWF0LCAmT3V0cHV0Rm9ybWF0LCAmZHdGbGFncyk7Ci0gICAgfQotCi0gICAgLy8gSWYgZ2FtdXQgY2hlY2sgaXMgcmVxdWVzdGVkLCBtYWtlIHN1cmUgd2UgaGF2ZSBhIGdhbXV0IHByb2ZpbGUKLSAgICBpZiAoZHdGbGFncyAmIGNtc0ZMQUdTX0dBTVVUQ0hFQ0spIHsKLSAgICAgICAgaWYgKGhHYW11dFByb2ZpbGUgPT0gTlVMTCkgZHdGbGFncyAmPSB+Y21zRkxBR1NfR0FNVVRDSEVDSzsKLSAgICB9Ci0KLSAgICAvLyBPbiBmbG9hdGluZyBwb2ludCB0cmFuc2Zvcm1zLCBpbmhpYml0IGNhY2hlCi0gICAgaWYgKF9jbXNGb3JtYXR0ZXJJc0Zsb2F0KElucHV0Rm9ybWF0KSB8fCBfY21zRm9ybWF0dGVySXNGbG9hdChPdXRwdXRGb3JtYXQpKQotICAgICAgICBkd0ZsYWdzIHw9IGNtc0ZMQUdTX05PQ0FDSEU7Ci0KLSAgICAvLyBNYXJrIGVudHJ5L2V4aXQgc3BhY2VzCi0gICAgaWYgKCFHZXRYRm9ybUNvbG9yU3BhY2VzKG5Qcm9maWxlcywgaFByb2ZpbGVzLCAmRW50cnlDb2xvclNwYWNlLCAmRXhpdENvbG9yU3BhY2UpKSB7Ci0gICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfTlVMTCwgIk5VTEwgaW5wdXQgcHJvZmlsZXMgb24gdHJhbnNmb3JtIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8vIENoZWNrIGlmIHByb3BlciBjb2xvcnNwYWNlcwotICAgIGlmICghSXNQcm9wZXJDb2xvclNwYWNlKEVudHJ5Q29sb3JTcGFjZSwgSW5wdXRGb3JtYXQpKSB7Ci0gICAgICAgIGNtc1NpZ25hbEVycm9yKENvbnRleHRJRCwgY21zRVJST1JfQ09MT1JTUEFDRV9DSEVDSywgIldyb25nIGlucHV0IGNvbG9yIHNwYWNlIG9uIHRyYW5zZm9ybSIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoIUlzUHJvcGVyQ29sb3JTcGFjZShFeGl0Q29sb3JTcGFjZSwgT3V0cHV0Rm9ybWF0KSkgewotICAgICAgICBjbXNTaWduYWxFcnJvcihDb250ZXh0SUQsIGNtc0VSUk9SX0NPTE9SU1BBQ0VfQ0hFQ0ssICJXcm9uZyBvdXRwdXQgY29sb3Igc3BhY2Ugb24gdHJhbnNmb3JtIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8vIENyZWF0ZSBhIHBpcGVsaW5lIHdpdGggYWxsIHRyYW5zZm9ybWF0aW9ucwotICAgIEx1dCA9IF9jbXNMaW5rUHJvZmlsZXMoQ29udGV4dElELCBuUHJvZmlsZXMsIEludGVudHMsIGhQcm9maWxlcywgQlBDLCBBZGFwdGF0aW9uU3RhdGVzLCBkd0ZsYWdzKTsKLSAgICBpZiAoTHV0ID09IE5VTEwpIHsKLSAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9OT1RfU1VJVEFCTEUsICJDb3VsZG4ndCBsaW5rIHRoZSBwcm9maWxlcyIpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayBjaGFubmVsIGNvdW50Ci0gICAgaWYgKChjbXNDaGFubmVsc09mKEVudHJ5Q29sb3JTcGFjZSkgIT0gY21zUGlwZWxpbmVJbnB1dENoYW5uZWxzKEx1dCkpIHx8Ci0gICAgICAgIChjbXNDaGFubmVsc09mKEV4aXRDb2xvclNwYWNlKSAgIT0gY21zUGlwZWxpbmVPdXRwdXRDaGFubmVscyhMdXQpKSkgewotICAgICAgICBjbXNQaXBlbGluZUZyZWUoTHV0KTsKLSAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9OT1RfU1VJVEFCTEUsICJDaGFubmVsIGNvdW50IGRvZXNuJ3QgbWF0Y2guIFByb2ZpbGUgaXMgY29ycnVwdGVkIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotCi0gICAgLy8gQWxsIHNlZW1zIG9rCi0gICAgeGZvcm0gPSBBbGxvY0VtcHR5VHJhbnNmb3JtKENvbnRleHRJRCwgTHV0LCBMYXN0SW50ZW50LCAmSW5wdXRGb3JtYXQsICZPdXRwdXRGb3JtYXQsICZkd0ZsYWdzKTsKLSAgICBpZiAoeGZvcm0gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvLyBLZWVwIHZhbHVlcwotICAgIHhmb3JtIC0+RW50cnlDb2xvclNwYWNlID0gRW50cnlDb2xvclNwYWNlOwotICAgIHhmb3JtIC0+RXhpdENvbG9yU3BhY2UgID0gRXhpdENvbG9yU3BhY2U7Ci0gICAgeGZvcm0gLT5SZW5kZXJpbmdJbnRlbnQgPSBJbnRlbnRzW25Qcm9maWxlcy0xXTsKLQotICAgIC8vIFRha2Ugd2hpdGUgcG9pbnRzCi0gICAgU2V0V2hpdGVQb2ludCgmeGZvcm0tPkVudHJ5V2hpdGVQb2ludCwgKGNtc0NJRVhZWiopIGNtc1JlYWRUYWcoaFByb2ZpbGVzWzBdLCBjbXNTaWdNZWRpYVdoaXRlUG9pbnRUYWcpKTsKLSAgICBTZXRXaGl0ZVBvaW50KCZ4Zm9ybS0+RXhpdFdoaXRlUG9pbnQsICAoY21zQ0lFWFlaKikgY21zUmVhZFRhZyhoUHJvZmlsZXNbblByb2ZpbGVzLTFdLCBjbXNTaWdNZWRpYVdoaXRlUG9pbnRUYWcpKTsKLSAgIAotCi0gICAgLy8gQ3JlYXRlIGEgZ2FtdXQgY2hlY2sgTFVUIGlmIHJlcXVlc3RlZAotICAgIGlmIChoR2FtdXRQcm9maWxlICE9IE5VTEwgJiYgKGR3RmxhZ3MgJiBjbXNGTEFHU19HQU1VVENIRUNLKSkKLSAgICAgICAgeGZvcm0gLT5HYW11dENoZWNrICA9IF9jbXNDcmVhdGVHYW11dENoZWNrUGlwZWxpbmUoQ29udGV4dElELCBoUHJvZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQQywgSW50ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRhdGlvblN0YXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkdhbXV0UENTcG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhHYW11dFByb2ZpbGUpOwotCi0KLSAgICAvLyBUcnkgdG8gcmVhZCBpbnB1dCBhbmQgb3V0cHV0IGNvbG9yYW50IHRhYmxlCi0gICAgaWYgKGNtc0lzVGFnKGhQcm9maWxlc1swXSwgY21zU2lnQ29sb3JhbnRUYWJsZVRhZykpIHsKLQotICAgICAgICAvLyBJbnB1dCB0YWJsZSBjYW4gb25seSBjb21lIGluIHRoaXMgd2F5LgotICAgICAgICB4Zm9ybSAtPklucHV0Q29sb3JhbnQgPSBjbXNEdXBOYW1lZENvbG9yTGlzdCgoY21zTkFNRURDT0xPUkxJU1QqKSBjbXNSZWFkVGFnKGhQcm9maWxlc1swXSwgY21zU2lnQ29sb3JhbnRUYWJsZVRhZykpOwotICAgIH0KLQotICAgIC8vIE91dHB1dCBpcyBhIGxpdHRsZSBiaXQgbW9yZSBjb21wbGV4LgotICAgIGlmIChjbXNHZXREZXZpY2VDbGFzcyhoUHJvZmlsZXNbblByb2ZpbGVzLTFdKSA9PSBjbXNTaWdMaW5rQ2xhc3MpIHsKLQotICAgICAgICAvLyBUaGlzIHRhZyBtYXkgZXhpc3Qgb25seSBvbiBkZXZpY2VsaW5rIHByb2ZpbGVzLgotICAgICAgICBpZiAoY21zSXNUYWcoaFByb2ZpbGVzW25Qcm9maWxlcy0xXSwgY21zU2lnQ29sb3JhbnRUYWJsZU91dFRhZykpIHsKLQotICAgICAgICAgICAgLy8gSXQgbWF5IGJlIE5VTEwgaWYgZXJyb3IKLSAgICAgICAgICAgIHhmb3JtIC0+T3V0cHV0Q29sb3JhbnQgPSBjbXNEdXBOYW1lZENvbG9yTGlzdCgoY21zTkFNRURDT0xPUkxJU1QqKSBjbXNSZWFkVGFnKGhQcm9maWxlc1tuUHJvZmlsZXMtMV0sIGNtc1NpZ0NvbG9yYW50VGFibGVPdXRUYWcpKTsKLSAgICAgICAgfQotCi0gICAgfSBlbHNlIHsKLQotICAgICAgICBpZiAoY21zSXNUYWcoaFByb2ZpbGVzW25Qcm9maWxlcy0xXSwgY21zU2lnQ29sb3JhbnRUYWJsZVRhZykpIHsKLQotICAgICAgICAgICAgeGZvcm0gLT4gT3V0cHV0Q29sb3JhbnQgPSBjbXNEdXBOYW1lZENvbG9yTGlzdCgoY21zTkFNRURDT0xPUkxJU1QqKSBjbXNSZWFkVGFnKGhQcm9maWxlc1tuUHJvZmlsZXMtMV0sIGNtc1NpZ0NvbG9yYW50VGFibGVUYWcpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFN0b3JlIHRoZSBzZXF1ZW5jZSBvZiBwcm9maWxlcwotICAgIGlmIChkd0ZsYWdzICYgY21zRkxBR1NfS0VFUF9TRVFVRU5DRSkgewotICAgICAgICB4Zm9ybSAtPlNlcXVlbmNlID0gX2Ntc0NvbXBpbGVQcm9maWxlU2VxdWVuY2UoQ29udGV4dElELCBuUHJvZmlsZXMsIGhQcm9maWxlcyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICAgICAgeGZvcm0gLT5TZXF1ZW5jZSA9IE5VTEw7Ci0KLSAgICAvLyBJZiB0aGlzIGlzIGEgY2FjaGVkIHRyYW5zZm9ybSwgaW5pdCBmaXJzdCB2YWx1ZSwgd2hpY2ggaXMgemVybyAoMTYgYml0cyBvbmx5KQotICAgIGlmICghKGR3RmxhZ3MgJiBjbXNGTEFHU19OT0NBQ0hFKSkgewotCi0gICAgICAgIG1lbXNldCgmeGZvcm0gLT5DYWNoZS5DYWNoZUluLCAwLCBzaXplb2YoeGZvcm0gLT5DYWNoZS5DYWNoZUluKSk7Ci0KLSAgICAgICAgaWYgKHhmb3JtIC0+R2FtdXRDaGVjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBUcmFuc2Zvcm1PbmVQaXhlbFdpdGhHYW11dENoZWNrKHhmb3JtLCB4Zm9ybSAtPkNhY2hlLkNhY2hlSW4sIHhmb3JtLT5DYWNoZS5DYWNoZU91dCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0KLSAgICAgICAgICAgIHhmb3JtIC0+THV0IC0+RXZhbDE2Rm4oeGZvcm0gLT5DYWNoZS5DYWNoZUluLCB4Zm9ybS0+Q2FjaGUuQ2FjaGVPdXQsIHhmb3JtIC0+IEx1dC0+RGF0YSk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHJldHVybiAoY21zSFRSQU5TRk9STSkgeGZvcm07Ci19Ci0KLS8vIE11bHRpcHJvZmlsZSB0cmFuc2Zvcm1zOiBHYW11dCBjaGVjayBpcyBub3QgYXZhaWxhYmxlIGhlcmUsIGFzIGl0IGlzIHVuY2xlYXIgZnJvbSB3aGljaCBwcm9maWxlIHRoZSBnYW11dCBjb21lcy4KLWNtc0hUUkFOU0ZPUk0gQ01TRVhQT1JUIGNtc0NyZWF0ZU11bHRpcHJvZmlsZVRyYW5zZm9ybVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSBoUHJvZmlsZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgblByb2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgT3V0cHV0Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpCi17Ci0gICAgY21zVUludDMyTnVtYmVyIGk7Ci0gICAgY21zQm9vbCBCUENbMjU2XTsKLSAgICBjbXNVSW50MzJOdW1iZXIgSW50ZW50c1syNTZdOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgQWRhcHRhdGlvblN0YXRlc1syNTZdOwotCi0gICAgaWYgKG5Qcm9maWxlcyA8PSAwIHx8IG5Qcm9maWxlcyA+IDI1NSkgewotICAgICAgICAgY21zU2lnbmFsRXJyb3IoQ29udGV4dElELCBjbXNFUlJPUl9SQU5HRSwgIldyb25nIG51bWJlciBvZiBwcm9maWxlcy4gMS4uMjU1IGV4cGVjdGVkLCAlZCBmb3VuZC4iLCBuUHJvZmlsZXMpOwotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBmb3IgKGk9MDsgaSA8IG5Qcm9maWxlczsgaSsrKSB7Ci0gICAgICAgIEJQQ1tpXSA9IGR3RmxhZ3MgJiBjbXNGTEFHU19CTEFDS1BPSU5UQ09NUEVOU0FUSU9OID8gVFJVRSA6IEZBTFNFOwotICAgICAgICBJbnRlbnRzW2ldID0gSW50ZW50OwotICAgICAgICBBZGFwdGF0aW9uU3RhdGVzW2ldID0gY21zU2V0QWRhcHRhdGlvblN0YXRlVEhSKENvbnRleHRJRCwgLTEpOwotICAgIH0KLQotCi0gICAgcmV0dXJuIGNtc0NyZWF0ZUV4dGVuZGVkVHJhbnNmb3JtKENvbnRleHRJRCwgblByb2ZpbGVzLCBoUHJvZmlsZXMsIEJQQywgSW50ZW50cywgQWRhcHRhdGlvblN0YXRlcywgTlVMTCwgMCwgSW5wdXRGb3JtYXQsIE91dHB1dEZvcm1hdCwgZHdGbGFncyk7Ci19Ci0KLQotCi1jbXNIVFJBTlNGT1JNIENNU0VYUE9SVCBjbXNDcmVhdGVNdWx0aXByb2ZpbGVUcmFuc2Zvcm0oY21zSFBST0ZJTEUgaFByb2ZpbGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuUHJvZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIE91dHB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEludGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpCi17Ci0KLSAgICBpZiAoblByb2ZpbGVzIDw9IDAgfHwgblByb2ZpbGVzID4gMjU1KSB7Ci0gICAgICAgICBjbXNTaWduYWxFcnJvcihOVUxMLCBjbXNFUlJPUl9SQU5HRSwgIldyb25nIG51bWJlciBvZiBwcm9maWxlcy4gMS4uMjU1IGV4cGVjdGVkLCAlZCBmb3VuZC4iLCBuUHJvZmlsZXMpOwotICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIGNtc0NyZWF0ZU11bHRpcHJvZmlsZVRyYW5zZm9ybVRIUihjbXNHZXRQcm9maWxlQ29udGV4dElEKGhQcm9maWxlc1swXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQcm9maWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblByb2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZ3MpOwotfQotCi1jbXNIVFJBTlNGT1JNIENNU0VYUE9SVCBjbXNDcmVhdGVUcmFuc2Zvcm1USFIoY21zQ29udGV4dCBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIElucHV0Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFIE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgT3V0cHV0Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpCi17Ci0KLSAgICBjbXNIUFJPRklMRSBoQXJyYXlbMl07Ci0KLSAgICBoQXJyYXlbMF0gPSBJbnB1dDsKLSAgICBoQXJyYXlbMV0gPSBPdXRwdXQ7Ci0KLSAgICByZXR1cm4gY21zQ3JlYXRlTXVsdGlwcm9maWxlVHJhbnNmb3JtVEhSKENvbnRleHRJRCwgaEFycmF5LCBPdXRwdXQgPT0gTlVMTCA/IDEgOiAyLCBJbnB1dEZvcm1hdCwgT3V0cHV0Rm9ybWF0LCBJbnRlbnQsIGR3RmxhZ3MpOwotfQotCi1DTVNBUEkgY21zSFRSQU5TRk9STSBDTVNFWFBPUlQgY21zQ3JlYXRlVHJhbnNmb3JtKGNtc0hQUk9GSUxFIElucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW5wdXRGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFIE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIE91dHB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIEludGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpCi17Ci0gICAgcmV0dXJuIGNtc0NyZWF0ZVRyYW5zZm9ybVRIUihjbXNHZXRQcm9maWxlQ29udGV4dElEKElucHV0KSwgSW5wdXQsIElucHV0Rm9ybWF0LCBPdXRwdXQsIE91dHB1dEZvcm1hdCwgSW50ZW50LCBkd0ZsYWdzKTsKLX0KLQotCi1jbXNIVFJBTlNGT1JNIENNU0VYUE9SVCBjbXNDcmVhdGVQcm9vZmluZ1RyYW5zZm9ybVRIUihjbXNDb250ZXh0IENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFIElucHV0UHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBJbnB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFIE91dHB1dFByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgT3V0cHV0Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zSFBST0ZJTEUgUHJvb2ZpbmdQcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIG5JbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgUHJvb2ZpbmdJbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncykKLXsKLSAgICBjbXNIUFJPRklMRSBoQXJyYXlbNF07Ci0gICAgY21zVUludDMyTnVtYmVyIEludGVudHNbNF07Ci0gICAgY21zQm9vbCAgQlBDWzRdOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgQWRhcHRhdGlvbls0XTsKLSAgICBjbXNCb29sICBEb0JQQyA9IChkd0ZsYWdzICYgY21zRkxBR1NfQkxBQ0tQT0lOVENPTVBFTlNBVElPTikgPyBUUlVFIDogRkFMU0U7Ci0KLQotICAgIGhBcnJheVswXSAgPSBJbnB1dFByb2ZpbGU7IGhBcnJheVsxXSA9IFByb29maW5nUHJvZmlsZTsgaEFycmF5WzJdICA9IFByb29maW5nUHJvZmlsZTsgICAgICAgICAgICAgICBoQXJyYXlbM10gPSBPdXRwdXRQcm9maWxlOwotICAgIEludGVudHNbMF0gPSBuSW50ZW50OyAgICAgIEludGVudHNbMV0gPSBuSW50ZW50OyAgICAgICAgSW50ZW50c1syXSA9IElOVEVOVF9SRUxBVElWRV9DT0xPUklNRVRSSUM7ICBJbnRlbnRzWzNdID0gUHJvb2ZpbmdJbnRlbnQ7Ci0gICAgQlBDWzBdICAgICA9IERvQlBDOyAgICAgICAgQlBDWzFdID0gRG9CUEM7ICAgICAgICAgICAgICBCUENbMl0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQQ1szXSA9IDA7Ci0KLSAgICBBZGFwdGF0aW9uWzBdID0gQWRhcHRhdGlvblsxXSA9IEFkYXB0YXRpb25bMl0gPSBBZGFwdGF0aW9uWzNdID0gY21zU2V0QWRhcHRhdGlvblN0YXRlVEhSKENvbnRleHRJRCwgLTEpOwotCi0gICAgaWYgKCEoZHdGbGFncyAmIChjbXNGTEFHU19TT0ZUUFJPT0ZJTkd8Y21zRkxBR1NfR0FNVVRDSEVDSykpKQotICAgICAgICByZXR1cm4gY21zQ3JlYXRlVHJhbnNmb3JtVEhSKENvbnRleHRJRCwgSW5wdXRQcm9maWxlLCBJbnB1dEZvcm1hdCwgT3V0cHV0UHJvZmlsZSwgT3V0cHV0Rm9ybWF0LCBuSW50ZW50LCBkd0ZsYWdzKTsKLQotICAgIHJldHVybiBjbXNDcmVhdGVFeHRlbmRlZFRyYW5zZm9ybShDb250ZXh0SUQsIDQsIGhBcnJheSwgQlBDLCBJbnRlbnRzLCBBZGFwdGF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb29maW5nUHJvZmlsZSwgMSwgSW5wdXRGb3JtYXQsIE91dHB1dEZvcm1hdCwgZHdGbGFncyk7Ci0KLX0KLQotCi1jbXNIVFJBTlNGT1JNIENNU0VYUE9SVCBjbXNDcmVhdGVQcm9vZmluZ1RyYW5zZm9ybShjbXNIUFJPRklMRSBJbnB1dFByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW5wdXRGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSBPdXRwdXRQcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIE91dHB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFIFByb29maW5nUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuSW50ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIFByb29maW5nSW50ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpCi17Ci0gICAgcmV0dXJuIGNtc0NyZWF0ZVByb29maW5nVHJhbnNmb3JtVEhSKGNtc0dldFByb2ZpbGVDb250ZXh0SUQoSW5wdXRQcm9maWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0UHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0UHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb29maW5nUHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5JbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9vZmluZ0ludGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZ3MpOwotfQotCi0KLS8vIEdyYWIgdGhlIENvbnRleHRJRCBmcm9tIGFuIG9wZW4gdHJhbnNmb3JtLiBSZXR1cm5zIE5VTEwgaWYgYSBOVUxMIHRyYW5zZm9ybSBpcyBwYXNzZWQKLWNtc0NvbnRleHQgQ01TRVhQT1JUIGNtc0dldFRyYW5zZm9ybUNvbnRleHRJRChjbXNIVFJBTlNGT1JNIGhUcmFuc2Zvcm0pCi17Ci0gICAgX2Ntc1RSQU5TRk9STSogeGZvcm0gPSAoX2Ntc1RSQU5TRk9STSopIGhUcmFuc2Zvcm07Ci0KLSAgICBpZiAoeGZvcm0gPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIHhmb3JtIC0+IENvbnRleHRJRDsKLX0KLQotLy8gR3JhYiB0aGUgaW5wdXQvb3V0cHV0IGZvcm1hdHMKLWNtc1VJbnQzMk51bWJlciBDTVNFWFBPUlQgY21zR2V0VHJhbnNmb3JtSW5wdXRGb3JtYXQoY21zSFRSQU5TRk9STSBoVHJhbnNmb3JtKQotewotICAgIF9jbXNUUkFOU0ZPUk0qIHhmb3JtID0gKF9jbXNUUkFOU0ZPUk0qKSBoVHJhbnNmb3JtOwotCi0gICAgaWYgKHhmb3JtID09IE5VTEwpIHJldHVybiAwOwotICAgIHJldHVybiB4Zm9ybS0+SW5wdXRGb3JtYXQ7Ci19Ci0KLWNtc1VJbnQzMk51bWJlciBDTVNFWFBPUlQgY21zR2V0VHJhbnNmb3JtT3V0cHV0Rm9ybWF0KGNtc0hUUkFOU0ZPUk0gaFRyYW5zZm9ybSkKLXsKLSAgICBfY21zVFJBTlNGT1JNKiB4Zm9ybSA9IChfY21zVFJBTlNGT1JNKikgaFRyYW5zZm9ybTsKLQotICAgIGlmICh4Zm9ybSA9PSBOVUxMKSByZXR1cm4gMDsKLSAgICByZXR1cm4geGZvcm0tPk91dHB1dEZvcm1hdDsKLX0KLQotLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ci1jbXNCb29sIENNU0VYUE9SVCBjbXNDaGFuZ2VCdWZmZXJzRm9ybWF0KGNtc0hUUkFOU0ZPUk0gaFRyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyIElucHV0Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgT3V0cHV0Rm9ybWF0KQotewotCi0gICAgX2Ntc1RSQU5TRk9STSogeGZvcm0gPSAoX2Ntc1RSQU5TRk9STSopIGhUcmFuc2Zvcm07Ci0gICAgY21zRm9ybWF0dGVyMTYgRnJvbUlucHV0LCBUb091dHB1dDsKLQotCi0gICAgLy8gV2Ugb25seSBjYW4gYWZmb3JkIHRvIGNoYW5nZSBmb3JtYXR0ZXJzIGlmIHByZXZpb3VzIHRyYW5zZm9ybSBpcyBhdCBsZWFzdCAxNiBiaXRzCi0gICAgaWYgKCEoeGZvcm0gLT5kd09yaWdpbmFsRmxhZ3MgJiBjbXNGTEFHU19DQU5fQ0hBTkdFX0ZPUk1BVFRFUikpIHsKLQotICAgICAgICBjbXNTaWduYWxFcnJvcih4Zm9ybSAtPkNvbnRleHRJRCwgY21zRVJST1JfTk9UX1NVSVRBQkxFLCAiY21zQ2hhbmdlQnVmZmVyc0Zvcm1hdCB3b3JrcyBvbmx5IG9uIHRyYW5zZm9ybXMgY3JlYXRlZCBvcmlnaW5hbGx5IHdpdGggYXQgbGVhc3QgMTYgYml0cyBvZiBwcmVjaXNpb24iKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLQotICAgIEZyb21JbnB1dCA9IF9jbXNHZXRGb3JtYXR0ZXIoeGZvcm0tPkNvbnRleHRJRCwgSW5wdXRGb3JtYXQsICBjbXNGb3JtYXR0ZXJJbnB1dCwgQ01TX1BBQ0tfRkxBR1NfMTZCSVRTKS5GbXQxNjsKLSAgICBUb091dHB1dCAgPSBfY21zR2V0Rm9ybWF0dGVyKHhmb3JtLT5Db250ZXh0SUQsIE91dHB1dEZvcm1hdCwgY21zRm9ybWF0dGVyT3V0cHV0LCBDTVNfUEFDS19GTEFHU18xNkJJVFMpLkZtdDE2OwotCi0gICAgaWYgKEZyb21JbnB1dCA9PSBOVUxMIHx8IFRvT3V0cHV0ID09IE5VTEwpIHsKLQotICAgICAgICBjbXNTaWduYWxFcnJvcih4Zm9ybSAtPiBDb250ZXh0SUQsIGNtc0VSUk9SX1VOS05PV05fRVhURU5TSU9OLCAiVW5zdXBwb3J0ZWQgcmFzdGVyIGZvcm1hdCIpOwotICAgICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gICAgeGZvcm0gLT5JbnB1dEZvcm1hdCAgPSBJbnB1dEZvcm1hdDsKLSAgICB4Zm9ybSAtPk91dHB1dEZvcm1hdCA9IE91dHB1dEZvcm1hdDsKLSAgICB4Zm9ybSAtPkZyb21JbnB1dCAgICA9IEZyb21JbnB1dDsKLSAgICB4Zm9ybSAtPlRvT3V0cHV0ICAgICA9IFRvT3V0cHV0OwotICAgIHJldHVybiBUUlVFOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9sY21zMl9pbnRlcm5hbC5oIGIvdGhpcmRfcGFydHkvbGNtczItMi42L3NyYy9sY21zMl9pbnRlcm5hbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzc2ZDQ4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xjbXMyLTIuNi9zcmMvbGNtczJfaW50ZXJuYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMzIgKzAsMCBAQAotLy88PDwrKytPUEVOU09VUkNFCi0vLzw8PCsrK09QRU5TT1VSQ0VfTVVTVF9CRUdJTiBDT01NRU5UPT1UUlVFCi0vLwotLy8gIExpdHRsZSBDb2xvciBNYW5hZ2VtZW50IFN5c3RlbQotLy8gIENvcHlyaWdodCAoYykgMTk5OC0yMDE0IE1hcnRpIE1hcmlhIFNhZ3VlcgotLy8KLS8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZwotLy8gYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAotLy8gdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgotLy8gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCi0vLyBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUKLS8vIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0vLwotLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KLS8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgotLy8KLS8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAotLy8gRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPCi0vLyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORAotLy8gTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQotLy8gTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTgotLy8gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OCi0vLyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLQotI2lmbmRlZiBfbGNtc19pbnRlcm5hbF9ICi0KLS8vIEluY2x1ZGUgcGx1Zy1pbiBmb3VuZGF0aW9uCi0jaWZuZGVmIF9sY21zX3BsdWdpbl9ICi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbGNtczItMi42L2luY2x1ZGUvbGNtczJfcGx1Z2luLmgiCi0jZW5kaWYKLQotLy8gY3R5cGUgaXMgcGFydCBvZiBDOTkgYXMgcGVyIDcuMS4yCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotLy8gYXNzZXJ0IG1hY3JvIGlzIHBhcnQgb2YgQzk5IGFzIHBlciA3LjIKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLQotLy8gU29tZSBuZWVkZWQgY29uc3RhbnRzCi0jaWZuZGVmIE1fUEkKLSMgICAgICAgZGVmaW5lIE1fUEkgICAgICAgIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYKLSNlbmRpZgotCi0jaWZuZGVmIE1fTE9HMTBFCi0jICAgICAgIGRlZmluZSBNX0xPRzEwRSAgICAwLjQzNDI5NDQ4MTkwMzI1MTgyNzY1MQotI2VuZGlmCi0KLS8vIEJvcmxhbmRDIDUuNSwgVkMyMDAzIGFyZSBicm9rZW4gb24gdGhhdAotI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCAoX01TQ19WRVIgPCAxNDAwKSAvLyAxNDAwID09IFZDKysgOC4wCi0jZGVmaW5lIHNpbmYoeCkgKGZsb2F0KXNpbigoZmxvYXQpeCkKLSNkZWZpbmUgc3FydGYoeCkgKGZsb2F0KXNxcnQoKGZsb2F0KXgpCi0jZW5kaWYKLQotCi0vLyBBbGlnbm1lbnQgb2YgSUNDIGZpbGUgZm9ybWF0IHVzZXMgNCBieXRlcyAoY21zVUludDMyTnVtYmVyKQotI2RlZmluZSBfY21zQUxJR05MT05HKHgpICgoKHgpKyhzaXplb2YoY21zVUludDMyTnVtYmVyKS0xKSkgJiB+KHNpemVvZihjbXNVSW50MzJOdW1iZXIpLTEpKQotCi0vLyBBbGlnbm1lbnQgdG8gbWVtb3J5IHBvaW50ZXIKLSNkZWZpbmUgX2Ntc0FMSUdOTUVNKHgpICAoKCh4KSsoc2l6ZW9mKHZvaWQgKikgLSAxKSkgJiB+KHNpemVvZih2b2lkICopIC0gMSkpCi0KLS8vIE1heGltdW0gZW5jb2RlYWJsZSB2YWx1ZXMgaW4gZmxvYXRpbmcgcG9pbnQKLSNkZWZpbmUgTUFYX0VOQ09ERUFCTEVfWFlaICAoMS4wICsgMzI3NjcuMC8zMjc2OC4wKQotI2RlZmluZSBNSU5fRU5DT0RFQUJMRV9hYjIgICgtMTI4LjApCi0jZGVmaW5lIE1BWF9FTkNPREVBQkxFX2FiMiAgKCg2NTUzNS4wLzI1Ni4wKSAtIDEyOC4wKQotI2RlZmluZSBNSU5fRU5DT0RFQUJMRV9hYjQgICgtMTI4LjApCi0jZGVmaW5lIE1BWF9FTkNPREVBQkxFX2FiNCAgKDEyNy4wKQotCi0vLyBNYXhpbXVtIG9mIGNoYW5uZWxzIGZvciBpbnRlcm5hbCBwaXBlbGluZSBldmFsdWF0aW9uCi0jZGVmaW5lIE1BWF9TVEFHRV9DSEFOTkVMUyAgMTI4Ci0KLS8vIFVudXNlZCBwYXJhbWV0ZXIgd2FybmluZyBzdXByZXNzaW9uCi0jZGVmaW5lIGNtc1VOVVNFRF9QQVJBTUVURVIoeCkgKCh2b2lkKXgpCi0KLS8vIFRoZSBzcGVjaWZpY2F0aW9uIGZvciAiaW5saW5lIiBpcyBzZWN0aW9uIDYuNy40IG9mIHRoZSBDOTkgc3RhbmRhcmQgKElTTy9JRUMgOTg5OToxOTk5KS4KLS8vIHVuZm9ydHVuYXRlbHkgVmlzdWFsQysrIGRvZXMgbm90IGNvbmZvcm0gdGhhdAotI2lmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKQotIyAgIGRlZmluZSBjbXNJTkxJTkUgX19pbmxpbmUKLSNlbHNlCi0jICAgZGVmaW5lIGNtc0lOTElORSBzdGF0aWMgaW5saW5lCi0jZW5kaWYKLQotLy8gT3RoZXIgcmVwbGFjZW1lbnQgZnVuY3Rpb25zCi0jaWZkZWYgX01TQ19WRVIKLSMgaWZuZGVmIHNucHJpbnRmCi0jICAgICAgIGRlZmluZSBzbnByaW50ZiAgX3NucHJpbnRmCi0jIGVuZGlmCi0jIGlmbmRlZiB2c25wcmludGYKLSMgICAgICAgZGVmaW5lIHZzbnByaW50ZiAgX3ZzbnByaW50ZgotIyBlbmRpZgotI2VuZGlmCi0KLQotLy8gQSBmYXN0IHdheSB0byBjb252ZXJ0IGZyb20vdG8gMTYgPC0+IDggYml0cwotI2RlZmluZSBGUk9NXzhfVE9fMTYocmdiKSAoY21zVUludDE2TnVtYmVyKSAoKCgoY21zVUludDE2TnVtYmVyKSAocmdiKSkgPDwgOCl8KHJnYikpCi0jZGVmaW5lIEZST01fMTZfVE9fOChyZ2IpIChjbXNVSW50OE51bWJlcikgKCgoKGNtc1VJbnQzMk51bWJlcikocmdiKSAqIDY1MjgxVSArIDgzODg2MDhVKSA+PiAyNCkgJiAweEZGVSkKLQotLy8gQ29kZSBhbmFseXNpcyBpcyBicm9rZW4gb24gYXNzZXJ0cwotI2lmZGVmIF9NU0NfVkVSCi0jICAgIGlmIChfTVNDX1ZFUiA+PSAxNTAwKQotIyAgICAgICAgICAgIGRlZmluZSBfY21zQXNzZXJ0KGEpICB7IGFzc2VydCgoYSkpOyBfX2FuYWx5c2lzX2Fzc3VtZSgoYSkpOyB9Ci0jICAgICBlbHNlCi0jICAgICAgICAgICAgZGVmaW5lIF9jbXNBc3NlcnQoYSkgICBhc3NlcnQoKGEpKQotIyAgICAgZW5kaWYKLSNlbHNlCi0jICAgICAgZGVmaW5lIF9jbXNBc3NlcnQoYSkgICBhc3NlcnQoKGEpKQotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIERldGVybWluYW50IGxvd2VyIHRoYW4gdGhhdCBhcmUgYXNzdW1lZCB6ZXJvICh1c2VkIG9uIG1hdHJpeCBpbnZlcnQpCi0jZGVmaW5lIE1BVFJJWF9ERVRfVE9MRVJBTkNFICAgIDAuMDAwMQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBGaXhlZCBwb2ludAotI2RlZmluZSBGSVhFRF9UT19JTlQoeCkgICAgICAgICAoKHgpPj4xNikKLSNkZWZpbmUgRklYRURfUkVTVF9UT19JTlQoeCkgICAgKCh4KSYweEZGRkZVKQotI2RlZmluZSBST1VORF9GSVhFRF9UT19JTlQoeCkgICAoKCh4KSsweDgwMDApPj4xNikKLQotY21zSU5MSU5FIGNtc1MxNUZpeGVkMTZOdW1iZXIgX2Ntc1RvRml4ZWREb21haW4oaW50IGEpICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGEgKyAoKGEgKyAweDdmZmYpIC8gMHhmZmZmKTsgfQotY21zSU5MSU5FIGludCAgICAgICAgICAgICAgICAgX2Ntc0Zyb21GaXhlZERvbWFpbihjbXNTMTVGaXhlZDE2TnVtYmVyIGEpIHsgcmV0dXJuIGEgLSAoKGEgKyAweDdmZmYpID4+IDE2KTsgfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBGYXN0IGZsb29yIGNvbnZlcnNpb24gbG9naWMuIFRoYW5rcyB0byBTcmVlIEtvdGF5IGFuZCBTdHVhcnQgTml4b24KLS8vIG5vdGUgdGhhbiB0aGlzIG9ubHkgd29ya3MgaW4gdGhlIHJhbmdlIC4uLTMyNzY3Li4uKzMyNzY3IGJlY2F1c2UKLS8vIG1hbnRpc3NhIGlzIGludGVycHJldGVkIGFzIDE1LjE2IGZpeGVkIHBvaW50LgotLy8gVGhlIHVuaW9uIGlzIHRvIGF2b2lkIHBvaW50ZXIgYWxpYXNpbmcgb3Zlcm9wdGltaXphdGlvbi4KLWNtc0lOTElORSBpbnQgX2Ntc1F1aWNrRmxvb3IoY21zRmxvYXQ2NE51bWJlciB2YWwpCi17Ci0jaWZkZWYgQ01TX0RPTlRfVVNFX0ZBU1RfRkxPT1IKLSAgICByZXR1cm4gKGludCkgZmxvb3IodmFsKTsKLSNlbHNlCi0gICAgY29uc3QgY21zRmxvYXQ2NE51bWJlciBfbGNtc19kb3VibGUyZml4bWFnaWMgPSA2ODcxOTQ3NjczNi4wICogMS41OyAgLy8gMl4zNiAqIDEuNSwgKDUyLTE2PTM2KSB1c2VzIGxpbWl0ZWQgcHJlY2lzaW9uIHRvIGZsb29yCi0gICAgdW5pb24gewotICAgICAgICBjbXNGbG9hdDY0TnVtYmVyIHZhbDsKLSAgICAgICAgaW50IGhhbHZlc1syXTsKLSAgICB9IHRlbXA7Ci0KLSAgICB0ZW1wLnZhbCA9IHZhbCArIF9sY21zX2RvdWJsZTJmaXhtYWdpYzsKLQotI2lmZGVmIENNU19VU0VfQklHX0VORElBTgotICAgIHJldHVybiB0ZW1wLmhhbHZlc1sxXSA+PiAxNjsKLSNlbHNlCi0gICAgcmV0dXJuIHRlbXAuaGFsdmVzWzBdID4+IDE2OwotI2VuZGlmCi0jZW5kaWYKLX0KLQotLy8gRmFzdCBmbG9vciByZXN0cmljdGVkIHRvIDAuLjY1NTM1LjAKLWNtc0lOTElORSBjbXNVSW50MTZOdW1iZXIgX2Ntc1F1aWNrRmxvb3JXb3JkKGNtc0Zsb2F0NjROdW1iZXIgZCkKLXsKLSAgICByZXR1cm4gKGNtc1VJbnQxNk51bWJlcikgX2Ntc1F1aWNrRmxvb3IoZCAtIDMyNzY3LjApICsgMzI3NjdVOwotfQotCi0vLyBGbG9vciB0byB3b3JkLCB0YWtpbmcgY2FyZSBvZiBzYXR1cmF0aW9uCi1jbXNJTkxJTkUgY21zVUludDE2TnVtYmVyIF9jbXNRdWlja1NhdHVyYXRlV29yZChjbXNGbG9hdDY0TnVtYmVyIGQpCi17Ci0gICAgZCArPSAwLjU7Ci0gICAgaWYgKGQgPD0gMCkgcmV0dXJuIDA7Ci0gICAgaWYgKGQgPj0gNjU1MzUuMCkgcmV0dXJuIDB4ZmZmZjsKLQotICAgIHJldHVybiBfY21zUXVpY2tGbG9vcldvcmQoZCk7Ci19Ci0KLQotLy8gUHRocmVhZCBzdXBwb3J0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jaWZuZGVmIENNU19OT19QVEhSRUFEUwotCi0vLyBUaGlzIGlzIHRoZSB0aHJlYWRpbmcgc3VwcG9ydC4gVW5mb3J0dW5hdGVseSwgaXQgaGFzIHRvIGJlIHBsYXRmb3JtLWRlcGVuZGVudCBiZWNhdXNlIAotLy8gd2luZG93cyBkb2VzIG5vdCBzdXBwb3J0IHB0aHJlYWRzLiAKLQotI2lmZGVmIENNU19JU19XSU5ET1dTXwotCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gMQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotCi0vLyBGcm9tOiBodHRwOi8vbG9ja2xlc3NpbmMuY29tL2FydGljbGVzL3B0aHJlYWRzX29uX3dpbmRvd3MvCi0vLyBUaGUgcHRocmVhZHMgQVBJIGhhcyBhbiBpbml0aWFsaXphdGlvbiBtYWNybyB0aGF0IGhhcyBubyBjb3JyZXNwb25kZW5jZSB0byBhbnl0aGluZyBpbiAKLS8vIHRoZSB3aW5kb3dzIEFQSS4gQnkgaW52ZXN0aWdhdGluZyB0aGUgaW50ZXJuYWwgZGVmaW5pdGlvbiBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbiB0eXBlLCAKLS8vIG9uZSBtYXkgd29yayBvdXQgaG93IHRvIGluaXRpYWxpemUgb25lIHdpdGhvdXQgY2FsbGluZyBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCkuIAotLy8gVGhlIHRyaWNrIGhlcmUgaXMgdGhhdCBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCkgaXMgbm90IGFsbG93ZWQgdG8gZmFpbC4gSXQgdHJpZXMgCi0vLyB0byBhbGxvY2F0ZSBhIGNyaXRpY2FsIHNlY3Rpb24gZGVidWcgb2JqZWN0LCBidXQgaWYgbm8gbWVtb3J5IGlzIGF2YWlsYWJsZSwgaXQgc2V0cyAKLS8vIHRoZSBwb2ludGVyIHRvIGEgc3BlY2lmaWMgdmFsdWUuIChPbmUgd291bGQgZXhwZWN0IHRoYXQgdmFsdWUgdG8gYmUgTlVMTCwgYnV0IGl0IGlzIAotLy8gYWN0dWFsbHkgKHZvaWQgKiktMSBmb3Igc29tZSByZWFzb24uKSBUaHVzIHdlIGNhbiB1c2UgdGhpcyBzcGVjaWFsIHZhbHVlIGZvciB0aGF0IAotLy8gcG9pbnRlciwgYW5kIHRoZSBjcml0aWNhbCBzZWN0aW9uIGNvZGUgd2lsbCB3b3JrLgotCi0vLyBUaGUgb3RoZXIgaW1wb3J0YW50IHBhcnQgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24gdHlwZSB0byBpbml0aWFsaXplIGlzIHRoZSBudW1iZXIgCi0vLyBvZiB3YWl0ZXJzLiBUaGlzIGNvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSBtdXRleCBpcyBsb2NrZWQuIEZvcnR1bmF0ZWx5LCB0aGlzIAotLy8gcGFydCBvZiB0aGUgY3JpdGljYWwgc2VjdGlvbiBpcyB1bmxpa2VseSB0byBjaGFuZ2UuIEFwcGFyZW50bHksIG1hbnkgcHJvZ3JhbXMgCi0vLyBhbHJlYWR5IHRlc3QgY3JpdGljYWwgc2VjdGlvbnMgdG8gc2VlIGlmIHRoZXkgYXJlIGxvY2tlZCB1c2luZyB0aGlzIHZhbHVlLCBzbyAKLS8vIE1pY3Jvc29mdCBmZWx0IHRoYXQgaXQgd2FzIG5lY2Vzc2FyeSB0byBrZWVwIGl0IHNldCBhdCAtMSBmb3IgYW4gdW5sb2NrZWQgY3JpdGljYWwKLS8vIHNlY3Rpb24sIGV2ZW4gd2hlbiB0aGV5IGNoYW5nZWQgdGhlIHVuZGVybHlpbmcgYWxnb3JpdGhtIHRvIGJlIG1vcmUgc2NhbGFibGUuIAotLy8gVGhlIGZpbmFsIHBhcnRzIG9mIHRoZSBjcml0aWNhbCBzZWN0aW9uIG9iamVjdCBhcmUgdW5pbXBvcnRhbnQsIGFuZCBjYW4gYmUgc2V0IAotLy8gdG8gemVybyBmb3IgdGhlaXIgZGVmYXVsdHMuIFRoaXMgeWllbGRzIGFuIGluaXRpYWxpemF0aW9uIG1hY3JvOgotCi10eXBlZGVmIENSSVRJQ0FMX1NFQ1RJT04gX2Ntc011dGV4OwotCi0jZGVmaW5lIENNU19NVVRFWF9JTklUSUFMSVpFUiB7KHZvaWQqKSAtMSwtMSwwLDAsMCwwfQotCi1jbXNJTkxJTkUgaW50IF9jbXNMb2NrUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKLXsKLQlFbnRlckNyaXRpY2FsU2VjdGlvbihtKTsKLQlyZXR1cm4gMDsKLX0KLQotY21zSU5MSU5FIGludCBfY21zVW5sb2NrUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKLXsKLQlMZWF2ZUNyaXRpY2FsU2VjdGlvbihtKTsKLQlyZXR1cm4gMDsKLX0KLQkKLWNtc0lOTElORSBpbnQgX2Ntc0luaXRNdXRleFByaW1pdGl2ZShfY21zTXV0ZXggKm0pCi17Ci0JSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihtKTsKLQlyZXR1cm4gMDsKLX0KLQotY21zSU5MSU5FIGludCBfY21zRGVzdHJveU11dGV4UHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKLXsKLQlEZWxldGVDcml0aWNhbFNlY3Rpb24obSk7Ci0JcmV0dXJuIDA7Ci19Ci0KLWNtc0lOTElORSBpbnQgX2Ntc0VudGVyQ3JpdGljYWxTZWN0aW9uUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKLXsKLQlFbnRlckNyaXRpY2FsU2VjdGlvbihtKTsKLQlyZXR1cm4gMDsKLX0KLQotY21zSU5MSU5FIGludCBfY21zTGVhdmVDcml0aWNhbFNlY3Rpb25QcmltaXRpdmUoX2Ntc011dGV4ICptKQotewotCUxlYXZlQ3JpdGljYWxTZWN0aW9uKG0pOwotCXJldHVybiAwOwotfQotCi0jZWxzZQotCi0vLyBSZXN0IG9mIHRoZSB3aWRlIHdvcmxkCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotCi0jZGVmaW5lIENNU19NVVRFWF9JTklUSUFMSVpFUiBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSCi10eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCBfY21zTXV0ZXg7Ci0KLQotY21zSU5MSU5FIGludCBfY21zTG9ja1ByaW1pdGl2ZShfY21zTXV0ZXggKm0pCi17Ci0JcmV0dXJuIHB0aHJlYWRfbXV0ZXhfbG9jayhtKTsKLX0KLQotY21zSU5MSU5FIGludCBfY21zVW5sb2NrUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKLXsKLQlyZXR1cm4gcHRocmVhZF9tdXRleF91bmxvY2sobSk7Ci19Ci0JCi1jbXNJTkxJTkUgaW50IF9jbXNJbml0TXV0ZXhQcmltaXRpdmUoX2Ntc011dGV4ICptKQotewotCXJldHVybiBwdGhyZWFkX211dGV4X2luaXQobSwgTlVMTCk7Ci19Ci0KLWNtc0lOTElORSBpbnQgX2Ntc0Rlc3Ryb3lNdXRleFByaW1pdGl2ZShfY21zTXV0ZXggKm0pCi17Ci0JcmV0dXJuIHB0aHJlYWRfbXV0ZXhfZGVzdHJveShtKTsKLX0KLQotY21zSU5MSU5FIGludCBfY21zRW50ZXJDcml0aWNhbFNlY3Rpb25QcmltaXRpdmUoX2Ntc011dGV4ICptKQotewotCXJldHVybiBwdGhyZWFkX211dGV4X2xvY2sobSk7Ci19Ci0KLWNtc0lOTElORSBpbnQgX2Ntc0xlYXZlQ3JpdGljYWxTZWN0aW9uUHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKLXsKLQlyZXR1cm4gcHRocmVhZF9tdXRleF91bmxvY2sobSk7Ci19Ci0KLSNlbmRpZgotI2Vsc2UKLQotI2RlZmluZSBDTVNfTVVURVhfSU5JVElBTElaRVIgMAotdHlwZWRlZiBpbnQgX2Ntc011dGV4OwotCi0KLWNtc0lOTElORSBpbnQgX2Ntc0xvY2tQcmltaXRpdmUoX2Ntc011dGV4ICptKQotewotCXJldHVybiAwOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobSk7Ci19Ci0KLWNtc0lOTElORSBpbnQgX2Ntc1VubG9ja1ByaW1pdGl2ZShfY21zTXV0ZXggKm0pCi17Ci0JcmV0dXJuIDA7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihtKTsKLX0KLQkKLWNtc0lOTElORSBpbnQgX2Ntc0luaXRNdXRleFByaW1pdGl2ZShfY21zTXV0ZXggKm0pCi17Ci0JcmV0dXJuIDA7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihtKTsKLX0KLQotY21zSU5MSU5FIGludCBfY21zRGVzdHJveU11dGV4UHJpbWl0aXZlKF9jbXNNdXRleCAqbSkKLXsKLQlyZXR1cm4gMDsKLSAgICBjbXNVTlVTRURfUEFSQU1FVEVSKG0pOwotfQotCi1jbXNJTkxJTkUgaW50IF9jbXNFbnRlckNyaXRpY2FsU2VjdGlvblByaW1pdGl2ZShfY21zTXV0ZXggKm0pCi17Ci0JcmV0dXJuIDA7Ci0gICAgY21zVU5VU0VEX1BBUkFNRVRFUihtKTsKLX0KLQotY21zSU5MSU5FIGludCBfY21zTGVhdmVDcml0aWNhbFNlY3Rpb25QcmltaXRpdmUoX2Ntc011dGV4ICptKQotewotCXJldHVybiAwOwotICAgIGNtc1VOVVNFRF9QQVJBTUVURVIobSk7Ci19Ci0jZW5kaWYKLQotLy8gUGx1Zy1JbiByZWdpc3RyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFNwZWNpYWxpemVkIGZ1bmN0aW9uIGZvciBwbHVnLWluIG1lbW9yeSBtYW5hZ2VtZW50LiBObyBwYWlyaW5nIGZyZWUoKSBzaW5jZSB3aG9sZSBwb29sIGlzIGZyZWVkIGF0IG9uY2UuCi12b2lkKiBfY21zUGx1Z2luTWFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgc2l6ZSk7Ci0KLS8vIE1lbW9yeSBtYW5hZ2VtZW50Ci1jbXNCb29sICAgX2Ntc1JlZ2lzdGVyTWVtSGFuZGxlclBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKTsKLQotLy8gSW50ZXJwb2xhdGlvbgotY21zQm9vbCAgX2Ntc1JlZ2lzdGVySW50ZXJwUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOwotCi0vLyBQYXJhbWV0cmljIGN1cnZlcwotY21zQm9vbCAgX2Ntc1JlZ2lzdGVyUGFyYW1ldHJpY0N1cnZlc1BsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKTsKLQotLy8gRm9ybWF0dGVycyBtYW5hZ2VtZW50Ci1jbXNCb29sICBfY21zUmVnaXN0ZXJGb3JtYXR0ZXJzUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOwotCi0vLyBUYWcgdHlwZSBtYW5hZ2VtZW50Ci1jbXNCb29sICBfY21zUmVnaXN0ZXJUYWdUeXBlUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOwotCi0vLyBUYWcgbWFuYWdlbWVudAotY21zQm9vbCAgX2Ntc1JlZ2lzdGVyVGFnUGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOwotCi0vLyBJbnRlbnQgbWFuYWdlbWVudAotY21zQm9vbCAgX2Ntc1JlZ2lzdGVyUmVuZGVyaW5nSW50ZW50UGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOwotCi0vLyBNdWx0aSBQcm9jZXNzIGVsZW1lbnRzCi1jbXNCb29sICBfY21zUmVnaXN0ZXJNdWx0aVByb2Nlc3NFbGVtZW50UGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOwotCi0vLyBPcHRpbWl6YXRpb24KLWNtc0Jvb2wgIF9jbXNSZWdpc3Rlck9wdGltaXphdGlvblBsdWdpbihjbXNDb250ZXh0IENvbnRleHRJRCwgY21zUGx1Z2luQmFzZSogUGx1Z2luKTsKLQotLy8gVHJhbnNmb3JtCi1jbXNCb29sICBfY21zUmVnaXN0ZXJUcmFuc2Zvcm1QbHVnaW4oY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1BsdWdpbkJhc2UqIFBsdWdpbik7Ci0KLS8vIE11dGV4Ci1jbXNCb29sIF9jbXNSZWdpc3Rlck11dGV4UGx1Z2luKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNQbHVnaW5CYXNlKiBQbHVnaW4pOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gU3ViYWxsb2NhdG9ycy4gCi10eXBlZGVmIHN0cnVjdCBfY21zU3ViQWxsb2NhdG9yX2NodW5rX3N0IHsKLQotICAgIGNtc1VJbnQ4TnVtYmVyKiBCbG9jazsKLSAgICBjbXNVSW50MzJOdW1iZXIgQmxvY2tTaXplOwotICAgIGNtc1VJbnQzMk51bWJlciBVc2VkOwotCi0gICAgc3RydWN0IF9jbXNTdWJBbGxvY2F0b3JfY2h1bmtfc3QqIG5leHQ7Ci0KLX0gX2Ntc1N1YkFsbG9jYXRvcl9jaHVuazsKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBjbXNDb250ZXh0IENvbnRleHRJRDsKLSAgICBfY21zU3ViQWxsb2NhdG9yX2NodW5rKiBoOwotCi19IF9jbXNTdWJBbGxvY2F0b3I7Ci0KLQotX2Ntc1N1YkFsbG9jYXRvciogX2Ntc0NyZWF0ZVN1YkFsbG9jKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNVSW50MzJOdW1iZXIgSW5pdGlhbCk7Ci12b2lkICAgICAgICAgICAgICBfY21zU3ViQWxsb2NEZXN0cm95KF9jbXNTdWJBbGxvY2F0b3IqIHMpOwotdm9pZCogICAgICAgICAgICAgX2Ntc1N1YkFsbG9jKF9jbXNTdWJBbGxvY2F0b3IqIHMsIGNtc1VJbnQzMk51bWJlciBzaXplKTsKLXZvaWQqICAgICAgICAgICAgIF9jbXNTdWJBbGxvY0R1cChfY21zU3ViQWxsb2NhdG9yKiBzLCBjb25zdCB2b2lkICpwdHIsIGNtc1VJbnQzMk51bWJlciBzaXplKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBUaGUgY29udGV4dCBjbGllbnRzLiAKLXR5cGVkZWYgZW51bSB7Ci0KLSAgICBVc2VyUHRyLCAgICAgICAgICAgIC8vIFVzZXItZGVmaW5lZCBwb2ludGVyCi0gICAgTG9nZ2VyLAotICAgIEFsYXJtQ29kZXNDb250ZXh0LAotICAgIEFkYXB0YXRpb25TdGF0ZUNvbnRleHQsIAotICAgIE1lbVBsdWdpbiwKLSAgICBJbnRlcnBQbHVnaW4sCi0gICAgQ3VydmVzUGx1Z2luLAotICAgIEZvcm1hdHRlcnNQbHVnaW4sCi0gICAgVGFnVHlwZVBsdWdpbiwKLSAgICBUYWdQbHVnaW4sCi0gICAgSW50ZW50UGx1Z2luLAotICAgIE1QRVBsdWdpbiwKLSAgICBPcHRpbWl6YXRpb25QbHVnaW4sCi0gICAgVHJhbnNmb3JtUGx1Z2luLAotICAgIE11dGV4UGx1Z2luLAotCi0gICAgLy8gTGFzdCBpbiBsaXN0Ci0gICAgTWVtb3J5Q2xpZW50TWF4Ci0KLX0gX2Ntc01lbW9yeUNsaWVudDsKLQotCi0vLyBDb250YWluZXIgZm9yIG1lbW9yeSBtYW5hZ2VtZW50IHBsdWctaW4uCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBfY21zTWFsbG9jRm5QdHJUeXBlICAgICBNYWxsb2NQdHI7ICAgIAotICAgIF9jbXNNYWxsb1plcm9jRm5QdHJUeXBlIE1hbGxvY1plcm9QdHI7Ci0gICAgX2Ntc0ZyZWVGblB0clR5cGUgICAgICAgRnJlZVB0cjsKLSAgICBfY21zUmVhbGxvY0ZuUHRyVHlwZSAgICBSZWFsbG9jUHRyOwotICAgIF9jbXNDYWxsb2NGblB0clR5cGUgICAgIENhbGxvY1B0cjsKLSAgICBfY21zRHVwRm5QdHJUeXBlICAgICAgICBEdXBQdHI7Ci0KLX0gX2Ntc01lbVBsdWdpbkNodW5rVHlwZTsKLQotLy8gQ29weSBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbiBwb2ludGVycyBmcm9tIHBsdWctaW4gdG8gY2h1bmssIHRha2luZyBjYXJlIG9mIG1pc3Npbmcgcm91dGluZXMKLXZvaWQgIF9jbXNJbnN0YWxsQWxsb2NGdW5jdGlvbnMoY21zUGx1Z2luTWVtSGFuZGxlciogUGx1Z2luLCBfY21zTWVtUGx1Z2luQ2h1bmtUeXBlKiBwdHIpOwotCi0vLyBJbnRlcm5hbCBzdHJ1Y3R1cmUgZm9yIGNvbnRleHQKLXN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QgewotICAgIAotICAgIHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIE5leHQ7ICAvLyBQb2ludHMgdG8gbmV4dCBjb250ZXh0IGluIHRoZSBuZXcgc3R5bGUKLSAgICBfY21zU3ViQWxsb2NhdG9yKiBNZW1Qb29sOyAgICAgICAgLy8gVGhlIG1lbW9yeSBwb29sIHRoYXQgc3RvcmVzIGNvbnRleHQgZGF0YQotICAgIAotICAgIHZvaWQqIGNodW5rc1tNZW1vcnlDbGllbnRNYXhdOyAgICAvLyBhcnJheSBvZiBwb2ludGVycyB0byBjbGllbnQgY2h1bmtzLiBNZW1vcnkgaXRzZWxmIGlzIGhvbGQgaW4gdGhlIHN1YmFsbG9jYXRvci4gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIE5VTEwsIHRoZW4gaXQgcmV2ZXJ0cyB0byBnbG9iYWwgQ29udGV4dDAKLQotICAgIF9jbXNNZW1QbHVnaW5DaHVua1R5cGUgRGVmYXVsdE1lbW9yeU1hbmFnZXI7ICAvLyBUaGUgYWxsb2NhdG9ycyB1c2VkIGZvciBjcmVhdGluZyB0aGUgY29udGV4dCBpdHNlbGYuIENhbm5vdCBiZSBvdmVycmlkZW4KLX07Ci0KLS8vIFJldHVybnMgYSBwb2ludGVyIHRvIGEgdmFsaWQgY29udGV4dCBzdHJ1Y3R1cmUsIGluY2x1ZGluZyB0aGUgZ2xvYmFsIG9uZSBpZiBpZCBpcyB6ZXJvLiAKLS8vIFZlcmlmaWVzIHRoZSBtYWdpYyBudW1iZXIuCi1zdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBfY21zR2V0Q29udGV4dChjbXNDb250ZXh0IENvbnRleHRJRCk7Ci0KLS8vIFJldHVybnMgdGhlIGJsb2NrIGFzc2lnbmVkIHRvIHRoZSBzcGVjaWZpYyB6b25lLiAKLXZvaWQqICAgICBfY21zQ29udGV4dEdldENsaWVudENodW5rKGNtc0NvbnRleHQgaWQsIF9jbXNNZW1vcnlDbGllbnQgbWMpOwotCi0KLS8vIENodW5rcyBvZiBjb250ZXh0IG1lbW9yeSBieSBwbHVnLWluIGNsaWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFRob3NlIHN0cnVjdHVyZXMgZW5jYXBzdWxhdGVzIGFsbCB2YXJpYWJsZXMgbmVlZGVkIGJ5IHRoZSBzZXZlcmFsIGNvbnRleHQgY2xpZW50cyAobW9zdGx5IHBsdWctaW5zKQotCi0vLyBDb250YWluZXIgZm9yIGVycm9yIGxvZ2dlciAtLSBub3QgYSBwbHVnLWluCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBjbXNMb2dFcnJvckhhbmRsZXJGdW5jdGlvbiBMb2dFcnJvckhhbmRsZXI7ICAvLyBTZXQgdG8gTlVMTCBmb3IgQ29udGV4dDAgZmFsbGJhY2sKLQotfSBfY21zTG9nRXJyb3JDaHVua1R5cGU7Ci0KLS8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgZXJyb3IgbG9nZ2VyCi1leHRlcm4gIF9jbXNMb2dFcnJvckNodW5rVHlwZSAgX2Ntc0xvZ0Vycm9yQ2h1bms7Ci0KLS8vIEFsbG9jYXRlIGFuZCBpbml0IGVycm9yIGxvZ2dlciBjb250YWluZXIuIAotdm9pZCBfY21zQWxsb2NMb2dFcnJvckNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsKLQotLy8gQ29udGFpbmVyIGZvciBhbGFybSBjb2RlcyAtLSBub3QgYSBwbHVnLWluCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAKLSAgICBjbXNVSW50MTZOdW1iZXIgQWxhcm1Db2Rlc1tjbXNNQVhDSEFOTkVMU107Ci0KLX0gX2Ntc0FsYXJtQ29kZXNDaHVua1R5cGU7Ci0KLS8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgYWxhcm0gY29kZXMKLWV4dGVybiAgX2Ntc0FsYXJtQ29kZXNDaHVua1R5cGUgX2Ntc0FsYXJtQ29kZXNDaHVuazsKLQotLy8gQWxsb2NhdGUgYW5kIGluaXQgYWxhcm0gY29kZXMgY29udGFpbmVyLiAKLXZvaWQgX2Ntc0FsbG9jQWxhcm1Db2Rlc0NodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsKLQotLy8gQ29udGFpbmVyIGZvciBhZGFwdGF0aW9uIHN0YXRlIC0tIG5vdCBhIHBsdWctaW4KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAKLSAgICBjbXNGbG9hdDY0TnVtYmVyICBBZGFwdGF0aW9uU3RhdGU7Ci0KLX0gX2Ntc0FkYXB0YXRpb25TdGF0ZUNodW5rVHlwZTsKLQotLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciBhZGFwdGF0aW9uIHN0YXRlCi1leHRlcm4gIF9jbXNBZGFwdGF0aW9uU3RhdGVDaHVua1R5cGUgICAgX2Ntc0FkYXB0YXRpb25TdGF0ZUNodW5rOwotCi0vLyBBbGxvY2F0ZSBhbmQgaW5pdCBhZGFwdGF0aW9uIHN0YXRlIGNvbnRhaW5lci4KLXZvaWQgX2Ntc0FsbG9jQWRhcHRhdGlvblN0YXRlQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsKLQotCi0vLyBUaGUgZ2xvYmFsIENvbnRleHQwIHN0b3JhZ2UgZm9yIG1lbW9yeSBtYW5hZ2VtZW50Ci1leHRlcm4gIF9jbXNNZW1QbHVnaW5DaHVua1R5cGUgX2Ntc01lbVBsdWdpbkNodW5rOwotCi0vLyBBbGxvY2F0ZSBhbmQgaW5pdCBtZW1vcnkgbWFuYWdlbWVudCBjb250YWluZXIuCi12b2lkIF9jbXNBbGxvY01lbVBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7Ci0KLS8vIENvbnRhaW5lciBmb3IgaW50ZXJwb2xhdGlvbiBwbHVnLWluCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBjbXNJbnRlcnBGbkZhY3RvcnkgSW50ZXJwb2xhdG9yczsKLQotfSBfY21zSW50ZXJwUGx1Z2luQ2h1bmtUeXBlOwotCi0vLyBUaGUgZ2xvYmFsIENvbnRleHQwIHN0b3JhZ2UgZm9yIGludGVycG9sYXRpb24gcGx1Zy1pbgotZXh0ZXJuICBfY21zSW50ZXJwUGx1Z2luQ2h1bmtUeXBlIF9jbXNJbnRlcnBQbHVnaW5DaHVuazsKLQotLy8gQWxsb2NhdGUgYW5kIGluaXQgaW50ZXJwb2xhdGlvbiBjb250YWluZXIuCi12b2lkIF9jbXNBbGxvY0ludGVycFBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7Ci0KLS8vIENvbnRhaW5lciBmb3IgcGFyYW1ldHJpYyBjdXJ2ZXMgcGx1Zy1pbgotdHlwZWRlZiBzdHJ1Y3QgewotCi0gICAgc3RydWN0IF9jbXNQYXJhbWV0cmljQ3VydmVzQ29sbGVjdGlvbl9zdCogUGFyYW1ldHJpY0N1cnZlczsKLQotfSBfY21zQ3VydmVzUGx1Z2luQ2h1bmtUeXBlOwotCi0vLyBUaGUgZ2xvYmFsIENvbnRleHQwIHN0b3JhZ2UgZm9yIHRvbmUgY3VydmVzIHBsdWctaW4KLWV4dGVybiAgX2Ntc0N1cnZlc1BsdWdpbkNodW5rVHlwZSBfY21zQ3VydmVzUGx1Z2luQ2h1bms7Ci0KLS8vIEFsbG9jYXRlIGFuZCBpbml0IHBhcmFtZXRyaWMgY3VydmVzIGNvbnRhaW5lci4KLXZvaWQgX2Ntc0FsbG9jQ3VydmVzUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7Ci0KLS8vIENvbnRhaW5lciBmb3IgZm9ybWF0dGVycyBwbHVnLWluCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBzdHJ1Y3QgX2Ntc19mb3JtYXR0ZXJzX2ZhY3RvcnlfbGlzdCogRmFjdG9yeUxpc3Q7Ci0KLX0gX2Ntc0Zvcm1hdHRlcnNQbHVnaW5DaHVua1R5cGU7Ci0KLS8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgZm9ybWF0dGVycyBwbHVnLWluCi1leHRlcm4gIF9jbXNGb3JtYXR0ZXJzUGx1Z2luQ2h1bmtUeXBlIF9jbXNGb3JtYXR0ZXJzUGx1Z2luQ2h1bms7Ci0KLS8vIEFsbG9jYXRlIGFuZCBpbml0IGZvcm1hdHRlcnMgY29udGFpbmVyLgotdm9pZCBfY21zQWxsb2NGb3JtYXR0ZXJzUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOwotCi0vLyBUaGlzIGNodW5rIHR5cGUgaXMgc2hhcmVkIGJ5IFRhZ1R5cGUgcGx1Zy1pbiBhbmQgTVBFIFBsdWctaW4KLXR5cGVkZWYgc3RydWN0IHsKLQotICAgIHN0cnVjdCBfY21zVGFnVHlwZUxpbmtlZExpc3Rfc3QqIFRhZ1R5cGVzOwotCi19IF9jbXNUYWdUeXBlUGx1Z2luQ2h1bmtUeXBlOwotCi0KLS8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgdGFnIHR5cGVzIHBsdWctaW4KLWV4dGVybiAgX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUgICAgICBfY21zVGFnVHlwZVBsdWdpbkNodW5rOwotCi0KLS8vIFRoZSBnbG9iYWwgQ29udGV4dDAgc3RvcmFnZSBmb3IgbXVsdCBwcm9jZXNzIGVsZW1lbnRzIHBsdWctaW4KLWV4dGVybiAgX2Ntc1RhZ1R5cGVQbHVnaW5DaHVua1R5cGUgICAgICBfY21zTVBFVHlwZVBsdWdpbkNodW5rOwotCi0vLyBBbGxvY2F0ZSBhbmQgaW5pdCBUYWcgdHlwZXMgY29udGFpbmVyLgotdm9pZCBfY21zQWxsb2NUYWdUeXBlUGx1Z2luQ2h1bmsoc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogY3R4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsKLS8vIEFsbG9jYXRlIGFuZCBpbml0IE1QRSBjb250YWluZXIuCi12b2lkIF9jbXNBbGxvY01QRVR5cGVQbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOwotLy8gQ29udGFpbmVyIGZvciB0YWcgcGx1Zy1pbgotdHlwZWRlZiBzdHJ1Y3QgewotICAgCi0gICAgc3RydWN0IF9jbXNUYWdMaW5rZWRMaXN0X3N0KiBUYWc7Ci0KLX0gX2Ntc1RhZ1BsdWdpbkNodW5rVHlwZTsKLQotCi0vLyBUaGUgZ2xvYmFsIENvbnRleHQwIHN0b3JhZ2UgZm9yIHRhZyBwbHVnLWluCi1leHRlcm4gIF9jbXNUYWdQbHVnaW5DaHVua1R5cGUgX2Ntc1RhZ1BsdWdpbkNodW5rOwotCi0vLyBBbGxvY2F0ZSBhbmQgaW5pdCBUYWcgY29udGFpbmVyLgotdm9pZCBfY21zQWxsb2NUYWdQbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsgCi0KLS8vIENvbnRhaW5lciBmb3IgaW50ZW50cyBwbHVnLWluCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBzdHJ1Y3QgX2Ntc19pbnRlbnRzX2xpc3QqIEludGVudHM7Ci0KLX0gX2Ntc0ludGVudHNQbHVnaW5DaHVua1R5cGU7Ci0KLQotLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciBpbnRlbnRzIHBsdWctaW4KLWV4dGVybiAgX2Ntc0ludGVudHNQbHVnaW5DaHVua1R5cGUgX2Ntc0ludGVudHNQbHVnaW5DaHVuazsKLQotLy8gQWxsb2NhdGUgYW5kIGluaXQgaW50ZW50cyBjb250YWluZXIuCi12b2lkIF9jbXNBbGxvY0ludGVudHNQbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOyAKLQotLy8gQ29udGFpbmVyIGZvciBvcHRpbWl6YXRpb24gcGx1Zy1pbgotdHlwZWRlZiBzdHJ1Y3QgewotCi0gICAgc3RydWN0IF9jbXNPcHRpbWl6YXRpb25Db2xsZWN0aW9uX3N0KiBPcHRpbWl6YXRpb25Db2xsZWN0aW9uOwotCi19IF9jbXNPcHRpbWl6YXRpb25QbHVnaW5DaHVua1R5cGU7Ci0KLQotLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciBvcHRpbWl6ZXJzIHBsdWctaW4KLWV4dGVybiAgX2Ntc09wdGltaXphdGlvblBsdWdpbkNodW5rVHlwZSBfY21zT3B0aW1pemF0aW9uUGx1Z2luQ2h1bms7Ci0KLS8vIEFsbG9jYXRlIGFuZCBpbml0IG9wdGltaXplcnMgY29udGFpbmVyLgotdm9pZCBfY21zQWxsb2NPcHRpbWl6YXRpb25QbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBzcmMpOwotCi0vLyBDb250YWluZXIgZm9yIHRyYW5zZm9ybSBwbHVnLWluCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBzdHJ1Y3QgX2Ntc1RyYW5zZm9ybUNvbGxlY3Rpb25fc3QqIFRyYW5zZm9ybUNvbGxlY3Rpb247Ci0KLX0gX2Ntc1RyYW5zZm9ybVBsdWdpbkNodW5rVHlwZTsKLQotLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciBmdWxsLXRyYW5zZm9ybSByZXBsYWNlbWVudCBwbHVnLWluCi1leHRlcm4gIF9jbXNUcmFuc2Zvcm1QbHVnaW5DaHVua1R5cGUgX2Ntc1RyYW5zZm9ybVBsdWdpbkNodW5rOwotCi0vLyBBbGxvY2F0ZSBhbmQgaW5pdCB0cmFuc2Zvcm0gY29udGFpbmVyLgotdm9pZCBfY21zQWxsb2NUcmFuc2Zvcm1QbHVnaW5DaHVuayhzdHJ1Y3QgX2Ntc0NvbnRleHRfc3RydWN0KiBjdHgsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIHNyYyk7Ci0KLS8vIENvbnRhaW5lciBmb3IgbXV0ZXggcGx1Zy1pbgotdHlwZWRlZiBzdHJ1Y3QgewotCi0gICAgX2Ntc0NyZWF0ZU11dGV4Rm5QdHJUeXBlICBDcmVhdGVNdXRleFB0cjsKLSAgICBfY21zRGVzdHJveU11dGV4Rm5QdHJUeXBlIERlc3Ryb3lNdXRleFB0cjsKLSAgICBfY21zTG9ja011dGV4Rm5QdHJUeXBlICAgIExvY2tNdXRleFB0cjsKLSAgICBfY21zVW5sb2NrTXV0ZXhGblB0clR5cGUgIFVubG9ja011dGV4UHRyOwotCi19IF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZTsKLQotLy8gVGhlIGdsb2JhbCBDb250ZXh0MCBzdG9yYWdlIGZvciBtdXRleCBwbHVnLWluCi1leHRlcm4gIF9jbXNNdXRleFBsdWdpbkNodW5rVHlwZSBfY21zTXV0ZXhQbHVnaW5DaHVuazsKLQotLy8gQWxsb2NhdGUgYW5kIGluaXQgbXV0ZXggY29udGFpbmVyLgotdm9pZCBfY21zQWxsb2NNdXRleFBsdWdpbkNodW5rKHN0cnVjdCBfY21zQ29udGV4dF9zdHJ1Y3QqIGN0eCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IF9jbXNDb250ZXh0X3N0cnVjdCogc3JjKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTUxVIGludGVybmFsIHJlcHJlc2VudGF0aW9uCi10eXBlZGVmIHN0cnVjdCB7Ci0KLSAgICBjbXNVSW50MTZOdW1iZXIgTGFuZ3VhZ2U7Ci0gICAgY21zVUludDE2TnVtYmVyIENvdW50cnk7Ci0KLSAgICBjbXNVSW50MzJOdW1iZXIgU3RyVzsgICAgICAgLy8gT2Zmc2V0IHRvIGN1cnJlbnQgdW5pY29kZSBzdHJpbmcKLSAgICBjbXNVSW50MzJOdW1iZXIgTGVuOyAgICAgICAgLy8gTGVuZ3RoIGluIGJ5dGVzCi0KLX0gX2Ntc01MVWVudHJ5OwotCi1zdHJ1Y3QgX2Ntc19NTFVfc3RydWN0IHsKLQotICAgIGNtc0NvbnRleHQgQ29udGV4dElEOwotCi0gICAgLy8gVGhlIGRpcmVjdG9yeQotICAgIGludCBBbGxvY2F0ZWRFbnRyaWVzOwotICAgIGludCBVc2VkRW50cmllczsKLSAgICBfY21zTUxVZW50cnkqIEVudHJpZXM7ICAgICAvLyBBcnJheSBvZiBwb2ludGVycyB0byBzdHJpbmdzIGFsbG9jYXRlZCBpbiBNZW1Qb29sCi0KLSAgICAvLyBUaGUgUG9vbAotICAgIGNtc1VJbnQzMk51bWJlciBQb29sU2l6ZTsgIC8vIFRoZSBtYXhpbXVtIGFsbG9jYXRlZCBzaXplCi0gICAgY21zVUludDMyTnVtYmVyIFBvb2xVc2VkOyAgLy8gVGhlIHVzZWQgc2l6ZQotICAgIHZvaWQqICBNZW1Qb29sOyAgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gYmVnaW4gb2YgbWVtb3J5IHBvb2wKLX07Ci0KLS8vIE5hbWVkIGNvbG9yIGxpc3QgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24KLXR5cGVkZWYgc3RydWN0IHsKLQotICAgIGNoYXIgTmFtZVtjbXNNQVhfUEFUSF07Ci0gICAgY21zVUludDE2TnVtYmVyIFBDU1szXTsKLSAgICBjbXNVSW50MTZOdW1iZXIgRGV2aWNlQ29sb3JhbnRbY21zTUFYQ0hBTk5FTFNdOwotCi19IF9jbXNOQU1FRENPTE9SOwotCi1zdHJ1Y3QgX2Ntc19OQU1FRENPTE9STElTVF9zdHJ1Y3QgewotCi0gICAgY21zVUludDMyTnVtYmVyIG5Db2xvcnM7Ci0gICAgY21zVUludDMyTnVtYmVyIEFsbG9jYXRlZDsKLSAgICBjbXNVSW50MzJOdW1iZXIgQ29sb3JhbnRDb3VudDsKLQotICAgIGNoYXIgUHJlZml4WzMzXTsgICAgICAvLyBQcmVmaXggYW5kIHN1ZmZpeCBhcmUgZGVmaW5lZCB0byBiZSAzMiBjaGFyYWN0ZXJzIGF0IG1vc3QKLSAgICBjaGFyIFN1ZmZpeFszM107Ci0KLSAgICBfY21zTkFNRURDT0xPUiogTGlzdDsKLQotICAgIGNtc0NvbnRleHQgQ29udGV4dElEOwotfTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFRoaXMgaXMgdGhlIGludGVybmFsIHN0cnVjdCBob2xkaW5nIHByb2ZpbGUgZGV0YWlscy4KLQotLy8gTWF4aW11bSBzdXBwb3J0ZWQgdGFncyBpbiBhIHByb2ZpbGUKLSNkZWZpbmUgTUFYX1RBQkxFX1RBRyAgICAgICAxMDAKLQotdHlwZWRlZiBzdHJ1Y3QgX2Ntc19pY2Nwcm9maWxlX3N0cnVjdCB7Ci0KLSAgICAvLyBJL08gaGFuZGxlcgotICAgIGNtc0lPSEFORExFUiogICAgICAgICAgICBJT2hhbmRsZXI7Ci0KLSAgICAvLyBUaGUgdGhyZWFkIElECi0gICAgY21zQ29udGV4dCAgICAgICAgICAgICAgIENvbnRleHRJRDsKLQotICAgIC8vIENyZWF0aW9uIHRpbWUKLSAgICBzdHJ1Y3QgdG0gICAgICAgICAgICAgICAgQ3JlYXRlZDsKLQotICAgIC8vIE9ubHkgbW9zdCBpbXBvcnRhbnQgaXRlbXMgZm91bmQgaW4gSUNDIHByb2ZpbGVzCi0gICAgY21zVUludDMyTnVtYmVyICAgICAgICAgIFZlcnNpb247Ci0gICAgY21zUHJvZmlsZUNsYXNzU2lnbmF0dXJlIERldmljZUNsYXNzOwotICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgICBDb2xvclNwYWNlOwotICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgICBQQ1M7Ci0gICAgY21zVUludDMyTnVtYmVyICAgICAgICAgIFJlbmRlcmluZ0ludGVudDsKLQotICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgICBmbGFnczsKLSAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgICAgbWFudWZhY3R1cmVyLCBtb2RlbDsKLSAgICBjbXNVSW50NjROdW1iZXIgICAgICAgICAgYXR0cmlidXRlczsKLSAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgICAgY3JlYXRvcjsKLQotICAgIGNtc1Byb2ZpbGVJRCAgICAgICAgICAgICBQcm9maWxlSUQ7Ci0KLSAgICAvLyBEaWN0aW9uYXJ5Ci0gICAgY21zVUludDMyTnVtYmVyICAgICAgICAgIFRhZ0NvdW50OwotICAgIGNtc1RhZ1NpZ25hdHVyZSAgICAgICAgICBUYWdOYW1lc1tNQVhfVEFCTEVfVEFHXTsKLSAgICBjbXNUYWdTaWduYXR1cmUgICAgICAgICAgVGFnTGlua2VkW01BWF9UQUJMRV9UQUddOyAgICAgICAgICAgLy8gVGhlIHRhZyB0byB3aWNoIGlzIGxpbmtlZCAoMD1ub25lKQotICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgICBUYWdTaXplc1tNQVhfVEFCTEVfVEFHXTsgICAgICAgICAgICAvLyBTaXplIG9uIGRpc2sKLSAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgICAgVGFnT2Zmc2V0c1tNQVhfVEFCTEVfVEFHXTsKLSAgICBjbXNCb29sICAgICAgICAgICAgICAgICAgVGFnU2F2ZUFzUmF3W01BWF9UQUJMRV9UQUddOyAgICAgICAgLy8gVHJ1ZSB0byB3cml0ZSB1bmNvb2tlZAotICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgICBUYWdQdHJzW01BWF9UQUJMRV9UQUddOwotICAgIGNtc1RhZ1R5cGVIYW5kbGVyKiAgICAgICBUYWdUeXBlSGFuZGxlcnNbTUFYX1RBQkxFX1RBR107ICAgICAvLyBTYW1lIHN0cnVjdHVyZSBtYXkgYmUgc2VyaWFsaXplZCBvbiBkaWZmZXJlbnQgdHlwZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVwZW5kaW5nIG9uIHByb2ZpbGUgdmVyc2lvbiwgc28gd2Uga2VlcCB0cmFjayBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZSBoYW5kbGVyIGZvciBlYWNoIHRhZyBpbiB0aGUgbGlzdC4KLSAgICAvLyBTcGVjaWFsCi0gICAgY21zQm9vbCAgICAgICAgICAgICAgICAgIElzV3JpdGU7Ci0KLSAgICAvLyBLZWVwIGEgbXV0ZXggZm9yIGNtc1JlYWRUYWcgLS0gTm90ZSB0aGF0IHRoaXMgb25seSB3b3JrcyBpZiB0aGUgdXNlciBpbmNsdWRlcyBhIG11dGV4IHBsdWdpbgotICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgICBVc3JNdXRleDsKLQotfSBfY21zSUNDUFJPRklMRTsKLQotLy8gSU8gaGVscGVycyBmb3IgcHJvZmlsZXMKLWNtc0Jvb2wgICAgICAgICAgICAgIF9jbXNSZWFkSGVhZGVyKF9jbXNJQ0NQUk9GSUxFKiBJY2MpOwotY21zQm9vbCAgICAgICAgICAgICAgX2Ntc1dyaXRlSGVhZGVyKF9jbXNJQ0NQUk9GSUxFKiBJY2MsIGNtc1VJbnQzMk51bWJlciBVc2VkU3BhY2UpOwotaW50ICAgICAgICAgICAgICAgICAgX2Ntc1NlYXJjaFRhZyhfY21zSUNDUFJPRklMRSogSWNjLCBjbXNUYWdTaWduYXR1cmUgc2lnLCBjbXNCb29sIGxGb2xsb3dMaW5rcyk7Ci0KLS8vIFRhZyB0eXBlcwotY21zVGFnVHlwZUhhbmRsZXIqICAgX2Ntc0dldFRhZ1R5cGVIYW5kbGVyKGNtc0NvbnRleHQgQ29udGV4dElELCBjbXNUYWdUeXBlU2lnbmF0dXJlIHNpZyk7Ci1jbXNUYWdUeXBlU2lnbmF0dXJlICBfY21zR2V0VGFnVHJ1ZVR5cGUoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNtc1RhZ1NpZ25hdHVyZSBzaWcpOwotY21zVGFnRGVzY3JpcHRvciogICAgX2Ntc0dldFRhZ0Rlc2NyaXB0b3IoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1RhZ1NpZ25hdHVyZSBzaWcpOwotCi0vLyBFcnJvciBsb2dnaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkICAgICAgICAgICAgICAgICBfY21zVGFnU2lnbmF0dXJlMlN0cmluZyhjaGFyIFN0cmluZ1s1XSwgY21zVGFnU2lnbmF0dXJlIHNpZyk7Ci0KLS8vIEludGVycG9sYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNtc0ludGVycFBhcmFtcyogICAgIF9jbXNDb21wdXRlSW50ZXJwUGFyYW1zKGNtc0NvbnRleHQgQ29udGV4dElELCBpbnQgblNhbXBsZXMsIGludCBJbnB1dENoYW4sIGludCBPdXRwdXRDaGFuLCBjb25zdCB2b2lkKiBUYWJsZSwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOwotY21zSW50ZXJwUGFyYW1zKiAgICAgX2Ntc0NvbXB1dGVJbnRlcnBQYXJhbXNFeChjbXNDb250ZXh0IENvbnRleHRJRCwgY29uc3QgY21zVUludDMyTnVtYmVyIG5TYW1wbGVzW10sIGludCBJbnB1dENoYW4sIGludCBPdXRwdXRDaGFuLCBjb25zdCB2b2lkKiBUYWJsZSwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOwotdm9pZCAgICAgICAgICAgICAgICAgX2Ntc0ZyZWVJbnRlcnBQYXJhbXMoY21zSW50ZXJwUGFyYW1zKiBwKTsKLWNtc0Jvb2wgICAgICAgICAgICAgIF9jbXNTZXRJbnRlcnBvbGF0aW9uUm91dGluZShjbXNDb250ZXh0IENvbnRleHRJRCwgY21zSW50ZXJwUGFyYW1zKiBwKTsKLQotLy8gQ3VydmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gVGhpcyBzdHJ1Y3QgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgYSBzZWdtZW50LCBwbHVzIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzIHRoZSBldmFsdWF0aW9uLgotLy8gSW4gdGhlIGNhc2Ugb2YgdGFibGUtYmFzZWQsIEV2YWwgcG9pbnRlciBpcyBzZXQgdG8gTlVMTAotCi0vLyBUaGUgZ2FtbWEgZnVuY3Rpb24gbWFpbiBzdHJ1Y3R1cmUKLXN0cnVjdCBfY21zX2N1cnZlX3N0cnVjdCB7Ci0KLSAgICBjbXNJbnRlcnBQYXJhbXMqICBJbnRlcnBQYXJhbXM7ICAvLyBQcml2YXRlIG9wdGltaXphdGlvbnMgZm9yIGludGVycG9sYXRpb24KLQotICAgIGNtc1VJbnQzMk51bWJlciAgIG5TZWdtZW50czsgICAgIC8vIE51bWJlciBvZiBzZWdtZW50cyBpbiB0aGUgY3VydmUuIFplcm8gZm9yIGEgMTYtYml0IGJhc2VkIHRhYmxlcwotICAgIGNtc0N1cnZlU2VnbWVudCogIFNlZ21lbnRzOyAgICAgIC8vIFRoZSBzZWdtZW50cwotICAgIGNtc0ludGVycFBhcmFtcyoqIFNlZ0ludGVycDsgICAgIC8vIEFycmF5IG9mIHByaXZhdGUgb3B0aW1pemF0aW9ucyBmb3IgaW50ZXJwb2xhdGlvbiBpbiB0YWJsZS1iYXNlZCBzZWdtZW50cwotCi0gICAgY21zUGFyYW1ldHJpY0N1cnZlRXZhbHVhdG9yKiBFdmFsczsgIC8vIEV2YWx1YXRvcnMgKG9uZSBwZXIgc2VnbWVudCkKLQotICAgIC8vIDE2IGJpdCBUYWJsZS1iYXNlZCByZXByZXNlbnRhdGlvbiBmb2xsb3dzCi0gICAgY21zVUludDMyTnVtYmVyICAgIG5FbnRyaWVzOyAgICAgIC8vIE51bWJlciBvZiB0YWJsZSBlbGVtZW50cwotICAgIGNtc1VJbnQxNk51bWJlciogICBUYWJsZTE2OyAgICAgICAvLyBUaGUgdGFibGUgaXRzZWxmLgotfTsKLQotCi0vLyAgUGlwZWxpbmVzICYgU3RhZ2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBBIHNpbmdsZSBzdGFnZQotc3RydWN0IF9jbXNTdGFnZV9zdHJ1Y3QgewotCi0gICAgY21zQ29udGV4dCAgICAgICAgICBDb250ZXh0SUQ7Ci0KLSAgICBjbXNTdGFnZVNpZ25hdHVyZSAgIFR5cGU7ICAgICAgICAgICAvLyBJZGVudGlmaWVzIHRoZSBzdGFnZQotICAgIGNtc1N0YWdlU2lnbmF0dXJlICAgSW1wbGVtZW50czsgICAgIC8vIElkZW50aWZpZXMgdGhlICpmdW5jdGlvbiogb2YgdGhlIHN0YWdlIChmb3Igb3B0aW1pemF0aW9ucykKLQotICAgIGNtc1VJbnQzMk51bWJlciAgICAgSW5wdXRDaGFubmVsczsgIC8vIElucHV0IGNoYW5uZWxzIC0tIGZvciBvcHRpbWl6YXRpb24gcHVycG9zZXMKLSAgICBjbXNVSW50MzJOdW1iZXIgICAgIE91dHB1dENoYW5uZWxzOyAvLyBPdXRwdXQgY2hhbm5lbHMgLS0gZm9yIG9wdGltaXphdGlvbiBwdXJwb3NlcwotCi0gICAgX2Ntc1N0YWdlRXZhbEZuICAgICBFdmFsUHRyOyAgICAgICAgLy8gUG9pbnRzIHRvIGZuIHRoYXQgZXZhbHVhdGVzIHRoZSBzdGFnZSAoYWx3YXlzIGluIGZsb2F0aW5nIHBvaW50KQotICAgIF9jbXNTdGFnZUR1cEVsZW1GbiAgRHVwRWxlbVB0cjsgICAgIC8vIFBvaW50cyB0byBhIGZuIHRoYXQgZHVwbGljYXRlcyB0aGUgKmRhdGEqIG9mIHRoZSBzdGFnZQotICAgIF9jbXNTdGFnZUZyZWVFbGVtRm4gRnJlZVB0cjsgICAgICAgIC8vIFBvaW50cyB0byBhIGZuIHRoYXQgc2V0cyB0aGUgKmRhdGEqIG9mIHRoZSBzdGFnZSBmcmVlCi0KLSAgICAvLyBBIGdlbmVyaWMgcG9pbnRlciB0byB3aGF0ZXZlciBtZW1vcnkgbmVlZGVkIGJ5IHRoZSBzdGFnZQotICAgIHZvaWQqICAgICAgICAgICAgICAgRGF0YTsKLQotICAgIC8vIE1haW50YWlucyBsaW5rZWQgbGlzdCAodXNlZCBpbnRlcm5hbGx5KQotICAgIHN0cnVjdCBfY21zU3RhZ2Vfc3RydWN0KiBOZXh0OwotfTsKLQotCi0vLyBTcGVjaWFsIFN0YWdlcyAoY2Fubm90IGJlIHNhdmVkKQotY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VBbGxvY0xhYjJYWVooY21zQ29udGV4dCBDb250ZXh0SUQpOwotY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VBbGxvY1hZWjJMYWIoY21zQ29udGV4dCBDb250ZXh0SUQpOwotY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VBbGxvY0xhYlByZWxpbihjbXNDb250ZXh0IENvbnRleHRJRCk7Ci1jbXNTdGFnZSogICAgICAgIF9jbXNTdGFnZUFsbG9jTGFiVjJUb1Y0KGNtc0NvbnRleHQgQ29udGV4dElEKTsKLWNtc1N0YWdlKiAgICAgICAgX2Ntc1N0YWdlQWxsb2NMYWJWMlRvVjRjdXJ2ZXMoY21zQ29udGV4dCBDb250ZXh0SUQpOwotY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VBbGxvY0xhYlY0VG9WMihjbXNDb250ZXh0IENvbnRleHRJRCk7Ci1jbXNTdGFnZSogICAgICAgIF9jbXNTdGFnZUFsbG9jTmFtZWRDb2xvcihjbXNOQU1FRENPTE9STElTVCogTmFtZWRDb2xvckxpc3QsIGNtc0Jvb2wgVXNlUENTKTsKLWNtc1N0YWdlKiAgICAgICAgX2Ntc1N0YWdlQWxsb2NJZGVudGl0eUN1cnZlcyhjbXNDb250ZXh0IENvbnRleHRJRCwgaW50IG5DaGFubmVscyk7Ci1jbXNTdGFnZSogICAgICAgIF9jbXNTdGFnZUFsbG9jSWRlbnRpdHlDTHV0KGNtc0NvbnRleHQgQ29udGV4dElELCBpbnQgbkNoYW4pOwotY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VOb3JtYWxpemVGcm9tTGFiRmxvYXQoY21zQ29udGV4dCBDb250ZXh0SUQpOwotY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VOb3JtYWxpemVGcm9tWHl6RmxvYXQoY21zQ29udGV4dCBDb250ZXh0SUQpOwotY21zU3RhZ2UqICAgICAgICBfY21zU3RhZ2VOb3JtYWxpemVUb0xhYkZsb2F0KGNtc0NvbnRleHQgQ29udGV4dElEKTsKLWNtc1N0YWdlKiAgICAgICAgX2Ntc1N0YWdlTm9ybWFsaXplVG9YeXpGbG9hdChjbXNDb250ZXh0IENvbnRleHRJRCk7Ci0KLS8vIEZvciBjdXJ2ZSBzZXQgb25seQotY21zVG9uZUN1cnZlKiogICAgIF9jbXNTdGFnZUdldFB0clRvQ3VydmVTZXQoY29uc3QgY21zU3RhZ2UqIG1wZSk7Ci0KLQotLy8gUGlwZWxpbmUgRXZhbHVhdG9yIChpbiBmbG9hdGluZyBwb2ludCkKLXR5cGVkZWYgdm9pZCAoKiBfY21zUGlwZWxpbmVFdmFsRmxvYXRGbikoY29uc3QgY21zRmxvYXQzMk51bWJlciBJbltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNGbG9hdDMyTnVtYmVyIE91dFtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBEYXRhKTsKLQotc3RydWN0IF9jbXNQaXBlbGluZV9zdHJ1Y3QgewotCi0gICAgY21zU3RhZ2UqIEVsZW1lbnRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUG9pbnRzIHRvIGVsZW1lbnRzIGNoYWluCi0gICAgY21zVUludDMyTnVtYmVyIElucHV0Q2hhbm5lbHMsIE91dHB1dENoYW5uZWxzOwotCi0gICAgLy8gRGF0YSAmIGV2YWx1YXRvcnMKLSAgICB2b2lkICpEYXRhOwotCi0gICBfY21zT1BUZXZhbDE2Rm4gICAgICAgICBFdmFsMTZGbjsKLSAgIF9jbXNQaXBlbGluZUV2YWxGbG9hdEZuIEV2YWxGbG9hdEZuOwotICAgX2Ntc0ZyZWVVc2VyRGF0YUZuICAgICAgRnJlZURhdGFGbjsKLSAgIF9jbXNEdXBVc2VyRGF0YUZuICAgICAgIER1cERhdGFGbjsKLQotICAgIGNtc0NvbnRleHQgQ29udGV4dElEOyAgICAgICAgICAgIC8vIEVudmlyb25tZW50Ci0KLSAgICBjbXNCb29sICBTYXZlQXM4Qml0czsgICAgICAgICAgICAvLyBJbXBsZW1lbnRhdGlvbi1zcGVjaWZpYzogc2F2ZSBhcyA4IGJpdHMgaWYgcG9zc2libGUKLX07Ci0KLS8vIExVVCByZWFkaW5nICYgY3JlYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBSZWFkIHRhZ3MgdXNpbmcgbG93LWxldmVsIGZ1bmN0aW9uLCBwcm92aWRlIG5lY2Vzc2FyeSBnbHVlIGNvZGUgdG8gYWRhcHQgdmVyc2lvbnMsIGV0Yy4gQWxsIHRob3NlIHJldHVybiBhIGJyYW5kIG5ldyBjb3B5Ci0vLyBvZiB0aGUgTFVUUywgc2luY2Ugb3duZXJzaGlwIG9mIG9yaWdpbmFsIGlzIHVwIHRvIHRoZSBwcm9maWxlLiBUaGUgdXNlciBzaG91bGQgZnJlZSBhbGxvY2F0ZWQgcmVzb3VyY2VzLgotCi1jbXNQaXBlbGluZSogICAgICBfY21zUmVhZElucHV0TFVUKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBpbnQgSW50ZW50KTsKLWNtc1BpcGVsaW5lKiAgICAgIF9jbXNSZWFkT3V0cHV0TFVUKGNtc0hQUk9GSUxFIGhQcm9maWxlLCBpbnQgSW50ZW50KTsKLWNtc1BpcGVsaW5lKiAgICAgIF9jbXNSZWFkRGV2aWNlbGlua0xVVChjbXNIUFJPRklMRSBoUHJvZmlsZSwgaW50IEludGVudCk7Ci0KLS8vIFNwZWNpYWwgdmFsdWVzCi1jbXNCb29sICAgICAgICAgICBfY21zUmVhZE1lZGlhV2hpdGVQb2ludChjbXNDSUVYWVoqIERlc3QsIGNtc0hQUk9GSUxFIGhQcm9maWxlKTsKLWNtc0Jvb2wgICAgICAgICAgIF9jbXNSZWFkQ0hBRChjbXNNQVQzKiBEZXN0LCBjbXNIUFJPRklMRSBoUHJvZmlsZSk7Ci0KLS8vIFByb2ZpbGUgbGlua2VyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNtc1BpcGVsaW5lKiBfY21zTGlua1Byb2ZpbGVzKGNtc0NvbnRleHQgICAgICAgICBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgICAgblByb2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgIFRoZUludGVudHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0hQUk9GSUxFICAgICAgICBoUHJvZmlsZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Jvb2wgICAgICAgICAgICBCUENbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgICBBZGFwdGF0aW9uU3RhdGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgICAgZHdGbGFncyk7Ci0KLS8vIFNlcXVlbmNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNtc1NFUSogX2Ntc1JlYWRQcm9maWxlU2VxdWVuY2UoY21zSFBST0ZJTEUgaFByb2ZpbGUpOwotY21zQm9vbCBfY21zV3JpdGVQcm9maWxlU2VxdWVuY2UoY21zSFBST0ZJTEUgaFByb2ZpbGUsIGNvbnN0IGNtc1NFUSogc2VxKTsKLWNtc1NFUSogX2Ntc0NvbXBpbGVQcm9maWxlU2VxdWVuY2UoY21zQ29udGV4dCBDb250ZXh0SUQsIGNtc1VJbnQzMk51bWJlciBuUHJvZmlsZXMsIGNtc0hQUk9GSUxFIGhQcm9maWxlc1tdKTsKLQotCi0vLyBMVVQgb3B0aW1pemF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbXNVSW50MTZOdW1iZXIgIF9jbXNRdWFudGl6ZVZhbChjbXNGbG9hdDY0TnVtYmVyIGksIGludCBNYXhTYW1wbGVzKTsKLWludCAgICAgICAgICAgICAgX2Ntc1JlYXNvbmFibGVHcmlkcG9pbnRzQnlDb2xvcnNwYWNlKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgQ29sb3JzcGFjZSwgY21zVUludDMyTnVtYmVyIGR3RmxhZ3MpOwotCi1jbXNCb29sICAgICAgICAgIF9jbXNFbmRQb2ludHNCeVNwYWNlKGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgU3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQxNk51bWJlciAqKldoaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MTZOdW1iZXIgKipCbGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICpuT3V0cHV0cyk7Ci0KLWNtc0Jvb2wgICAgICAgICAgX2Ntc09wdGltaXplUGlwZWxpbmUoY21zQ29udGV4dCBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1BpcGVsaW5lKiogICAgTHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgIEludGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyKiBJbnB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyKiBPdXRwdXRGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciogZHdGbGFncyApOwotCi0KLS8vIEhpIGxldmVsIExVVCBidWlsZGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNtc1BpcGVsaW5lKiAgICAgX2Ntc0NyZWF0ZUdhbXV0Q2hlY2tQaXBlbGluZShjbXNDb250ZXh0IENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSBoUHJvZmlsZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNCb29sICBCUENbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgSW50ZW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zsb2F0NjROdW1iZXIgQWRhcHRhdGlvblN0YXRlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBuR2FtdXRQQ1Nwb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNIUFJPRklMRSBoR2FtdXQpOwotCi0KLS8vIEZvcm1hdHRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNkZWZpbmUgY21zRkxBR1NfQ0FOX0NIQU5HRV9GT1JNQVRURVIgICAgIDB4MDIwMDAwMDAgICAvLyBBbGxvdyBjaGFuZ2UgYnVmZmVyIGZvcm1hdAotCi1jbXNCb29sICAgICAgICAgX2Ntc0Zvcm1hdHRlcklzRmxvYXQoY21zVUludDMyTnVtYmVyIFR5cGUpOwotY21zQm9vbCAgICAgICAgIF9jbXNGb3JtYXR0ZXJJczhiaXQoY21zVUludDMyTnVtYmVyIFR5cGUpOwotCi1jbXNGb3JtYXR0ZXIgICAgX2Ntc0dldEZvcm1hdHRlcihjbXNDb250ZXh0IENvbnRleHRJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciBUeXBlLCAgICAgICAgICAvLyBTcGVjaWZpYyB0eXBlLCBpLmUuIFRZUEVfUkdCXzgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc0Zvcm1hdHRlckRpcmVjdGlvbiBEaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgZHdGbGFncyk7Ci0KLQotI2lmbmRlZiBDTVNfTk9fSEFMRl9TVVBQT1JUIAotCi0vLyBIYWxmIGZsb2F0Ci1jbXNGbG9hdDMyTnVtYmVyIF9jbXNIYWxmMkZsb2F0KGNtc1VJbnQxNk51bWJlciBoKTsKLWNtc1VJbnQxNk51bWJlciAgX2Ntc0Zsb2F0MkhhbGYoY21zRmxvYXQzMk51bWJlciBmbHQpOwotCi0jZW5kaWYKLQotLy8gVHJhbnNmb3JtIGxvZ2ljIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdHJ1Y3QgX2Ntc3RyYW5zZm9ybV9zdHJ1Y3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLQotICAgIC8vIDEtcGl4ZWwgY2FjaGUgKDE2IGJpdHMgb25seSkKLSAgICBjbXNVSW50MTZOdW1iZXIgQ2FjaGVJbltjbXNNQVhDSEFOTkVMU107Ci0gICAgY21zVUludDE2TnVtYmVyIENhY2hlT3V0W2Ntc01BWENIQU5ORUxTXTsKLQotfSBfY21zQ0FDSEU7Ci0KLQotCi0vLyBUcmFuc2Zvcm1hdGlvbgotdHlwZWRlZiBzdHJ1Y3QgX2Ntc3RyYW5zZm9ybV9zdHJ1Y3QgewotCi0gICAgY21zVUludDMyTnVtYmVyIElucHV0Rm9ybWF0LCBPdXRwdXRGb3JtYXQ7IC8vIEtlZXAgZm9ybWF0cyBmb3IgZnVydGhlciByZWZlcmVuY2UKLQotICAgIC8vIFBvaW50cyB0byB0cmFuc2Zvcm0gY29kZQotICAgIF9jbXNUcmFuc2Zvcm1GbiB4Zm9ybTsKLQotICAgIC8vIEZvcm1hdHRlcnMsIGNhbm5vdCBiZSBlbWJlZGRlZCBpbnRvIExVVCBiZWNhdXNlIGNhY2hlCi0gICAgY21zRm9ybWF0dGVyMTYgRnJvbUlucHV0OwotICAgIGNtc0Zvcm1hdHRlcjE2IFRvT3V0cHV0OwotCi0gICAgY21zRm9ybWF0dGVyRmxvYXQgRnJvbUlucHV0RmxvYXQ7Ci0gICAgY21zRm9ybWF0dGVyRmxvYXQgVG9PdXRwdXRGbG9hdDsKLQotICAgIC8vIDEtcGl4ZWwgY2FjaGUgc2VlZCBmb3IgemVybyBhcyBpbnB1dCAoMTYgYml0cywgcmVhZCBvbmx5KQotICAgIF9jbXNDQUNIRSBDYWNoZTsKLQotICAgIC8vIEEgUGlwZWxpbmUgaG9sZGluZyB0aGUgZnVsbCAob3B0aW1pemVkKSB0cmFuc2Zvcm0KLSAgICBjbXNQaXBlbGluZSogTHV0OwotCi0gICAgLy8gQSBQaXBlbGluZSBob2xkaW5nIHRoZSBnYW11dCBjaGVjay4gSXQgZ29lcyBmcm9tIHRoZSBpbnB1dCBzcGFjZSB0byBiaWxldmVsCi0gICAgY21zUGlwZWxpbmUqIEdhbXV0Q2hlY2s7Ci0KLSAgICAvLyBDb2xvcmFudCB0YWJsZXMKLSAgICBjbXNOQU1FRENPTE9STElTVCogSW5wdXRDb2xvcmFudDsgICAgICAgLy8gSW5wdXQgQ29sb3JhbnQgdGFibGUKLSAgICBjbXNOQU1FRENPTE9STElTVCogT3V0cHV0Q29sb3JhbnQ7ICAgICAgLy8gQ29sb3JhbnQgdGFibGUgKGZvciBuIGNoYW5zID4gQ01ZSykKLQotICAgIC8vIEluZm9ybWF0aW9uYWwgb25seQotICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgRW50cnlDb2xvclNwYWNlOwotICAgIGNtc0NvbG9yU3BhY2VTaWduYXR1cmUgRXhpdENvbG9yU3BhY2U7Ci0KLSAgICAvLyBXaGl0ZSBwb2ludHMgKGluZm9ybWF0aXZlIG9ubHkpCi0gICAgY21zQ0lFWFlaIEVudHJ5V2hpdGVQb2ludDsKLSAgICBjbXNDSUVYWVogRXhpdFdoaXRlUG9pbnQ7Ci0KLSAgICAvLyBQcm9maWxlcyB1c2VkIHRvIGNyZWF0ZSB0aGUgdHJhbnNmb3JtCi0gICAgY21zU0VRKiBTZXF1ZW5jZTsKLQotICAgIGNtc1VJbnQzMk51bWJlciAgZHdPcmlnaW5hbEZsYWdzOwotICAgIGNtc0Zsb2F0NjROdW1iZXIgQWRhcHRhdGlvblN0YXRlOwotCi0gICAgLy8gVGhlIGludGVudCBvZiB0aGlzIHRyYW5zZm9ybS4gVGhhdCBpcyB1c3VhbGx5IHRoZSBsYXN0IGludGVudCBpbiB0aGUgcHJvZmlsZWNoYWluLCBidXQgbWF5IGRpZmZlcgotICAgIGNtc1VJbnQzMk51bWJlciBSZW5kZXJpbmdJbnRlbnQ7Ci0KLSAgICAvLyBBbiBpZCB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHJ1bm5pbmcgY29udGV4dC4gTWF5IGJlIG51bGwuCi0gICAgY21zQ29udGV4dCBDb250ZXh0SUQ7Ci0KLSAgICAvLyBBIHVzZXItZGVmaW5lZCBwb2ludGVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgZGF0YSBmb3IgdHJhbnNmb3JtIHBsdWctaW5zCi0gICAgdm9pZCogVXNlckRhdGE7Ci0gICAgX2Ntc0ZyZWVVc2VyRGF0YUZuIEZyZWVVc2VyRGF0YTsKLQotfSBfY21zVFJBTlNGT1JNOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbXNIVFJBTlNGT1JNIF9jbXNDaGFpbjJMYWIoY21zQ29udGV4dCAgICAgICAgICAgICBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgICBuUHJvZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgICBJbnB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgIE91dHB1dEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNVSW50MzJOdW1iZXIgIEludGVudHNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNIUFJPRklMRSAgICAgIGhQcm9maWxlc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0Jvb2wgICAgICAgICAgQlBDW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zRmxvYXQ2NE51bWJlciBBZGFwdGF0aW9uU3RhdGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgICBkd0ZsYWdzKTsKLQotCi1jbXNUb25lQ3VydmUqIF9jbXNCdWlsZEtUb25lQ3VydmUoY21zQ29udGV4dCAgICAgICBDb250ZXh0SUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY21zVUludDMyTnVtYmVyICAgICAgICBuUG9pbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc1VJbnQzMk51bWJlciAgICAgICAgblByb2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc1VJbnQzMk51bWJlciAgSW50ZW50c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNtc0hQUk9GSUxFICAgICAgaFByb2ZpbGVzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY21zQm9vbCAgICAgICAgICBCUENbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbXNGbG9hdDY0TnVtYmVyIEFkYXB0YXRpb25TdGF0ZXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXNVSW50MzJOdW1iZXIgICAgICAgIGR3RmxhZ3MpOwotCi1jbXNCb29sICAgX2Ntc0FkYXB0YXRpb25NYXRyaXgoY21zTUFUMyogciwgY29uc3QgY21zTUFUMyogQ29uZU1hdHJpeCwgY29uc3QgY21zQ0lFWFlaKiBGcm9tSWxsLCBjb25zdCBjbXNDSUVYWVoqIFRvSWxsKTsKLQotY21zQm9vbCAgIF9jbXNCdWlsZFJHQjJYWVp0cmFuc2Zlck1hdHJpeChjbXNNQVQzKiByLCBjb25zdCBjbXNDSUV4eVkqIFdoaXRlUG9pbnQsIGNvbnN0IGNtc0NJRXh5WVRSSVBMRSogUHJpbWFyaWVzKTsKLQotCi0jZGVmaW5lIF9sY21zX2ludGVybmFsX0gKLSNlbmRpZgotLy88PDwrKytPUEVOU09VUkNFX01VU1RfRU5ECmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2NkZXJyb3IuaCBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvY2RlcnJvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDQzNWUxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvY2RlcnJvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qCi0gKiBjZGVycm9yLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBlcnJvciBhbmQgbWVzc2FnZSBjb2RlcyBmb3IgdGhlIGNqcGVnL2RqcGVnCi0gKiBhcHBsaWNhdGlvbnMuICBUaGVzZSBzdHJpbmdzIGFyZSBub3QgbmVlZGVkIGFzIHBhcnQgb2YgdGhlIEpQRUcgbGlicmFyeQotICogcHJvcGVyLgotICogRWRpdCB0aGlzIGZpbGUgdG8gYWRkIG5ldyBjb2Rlcywgb3IgdG8gdHJhbnNsYXRlIHRoZSBtZXNzYWdlIHN0cmluZ3MgdG8KLSAqIHNvbWUgb3RoZXIgbGFuZ3VhZ2UuCi0gKi8KLQotLyoKLSAqIFRvIGRlZmluZSB0aGUgZW51bSBsaXN0IG9mIG1lc3NhZ2UgY29kZXMsIGluY2x1ZGUgdGhpcyBmaWxlIHdpdGhvdXQKLSAqIGRlZmluaW5nIG1hY3JvIEpNRVNTQUdFLiAgVG8gY3JlYXRlIGEgbWVzc2FnZSBzdHJpbmcgdGFibGUsIGluY2x1ZGUgaXQKLSAqIGFnYWluIHdpdGggYSBzdWl0YWJsZSBKTUVTU0FHRSBkZWZpbml0aW9uIChzZWUgamVycm9yLmMgZm9yIGFuIGV4YW1wbGUpLgotICovCi0jaWZuZGVmIEpNRVNTQUdFCi0jaWZuZGVmIENERVJST1JfSAotI2RlZmluZSBDREVSUk9SX0gKLS8qIEZpcnN0IHRpbWUgdGhyb3VnaCwgZGVmaW5lIHRoZSBlbnVtIGxpc3QgKi8KLSNkZWZpbmUgSk1BS0VfRU5VTV9MSVNUCi0jZWxzZQotLyogUmVwZWF0ZWQgaW5jbHVzaW9ucyBvZiB0aGlzIGZpbGUgYXJlIG5vLW9wcyB1bmxlc3MgSk1FU1NBR0UgaXMgZGVmaW5lZCAqLwotI2RlZmluZSBKTUVTU0FHRShjb2RlLHN0cmluZykKLSNlbmRpZiAvKiBDREVSUk9SX0ggKi8KLSNlbmRpZiAvKiBKTUVTU0FHRSAqLwotCi0jaWZkZWYgSk1BS0VfRU5VTV9MSVNUCi0KLXR5cGVkZWYgZW51bSB7Ci0KLSNkZWZpbmUgSk1FU1NBR0UoY29kZSxzdHJpbmcpCWNvZGUgLAotCi0jZW5kaWYgLyogSk1BS0VfRU5VTV9MSVNUICovCi0KLUpNRVNTQUdFKEpNU0dfRklSU1RBRERPTkNPREU9MTAwMCwgTlVMTCkgLyogTXVzdCBiZSBmaXJzdCBlbnRyeSEgKi8KLQotI2lmZGVmIEJNUF9TVVBQT1JURUQKLUpNRVNTQUdFKEpFUlJfQk1QX0JBRENNQVAsICJVbnN1cHBvcnRlZCBCTVAgY29sb3JtYXAgZm9ybWF0IikKLUpNRVNTQUdFKEpFUlJfQk1QX0JBRERFUFRILCAiT25seSA4LSBhbmQgMjQtYml0IEJNUCBmaWxlcyBhcmUgc3VwcG9ydGVkIikKLUpNRVNTQUdFKEpFUlJfQk1QX0JBREhFQURFUiwgIkludmFsaWQgQk1QIGZpbGU6IGJhZCBoZWFkZXIgbGVuZ3RoIikKLUpNRVNTQUdFKEpFUlJfQk1QX0JBRFBMQU5FUywgIkludmFsaWQgQk1QIGZpbGU6IGJpUGxhbmVzIG5vdCBlcXVhbCB0byAxIikKLUpNRVNTQUdFKEpFUlJfQk1QX0NPTE9SU1BBQ0UsICJCTVAgb3V0cHV0IG11c3QgYmUgZ3JheXNjYWxlIG9yIFJHQiIpCi1KTUVTU0FHRShKRVJSX0JNUF9DT01QUkVTU0VELCAiU29ycnksIGNvbXByZXNzZWQgQk1QcyBub3QgeWV0IHN1cHBvcnRlZCIpCi1KTUVTU0FHRShKRVJSX0JNUF9OT1QsICJOb3QgYSBCTVAgZmlsZSAtIGRvZXMgbm90IHN0YXJ0IHdpdGggQk0iKQotSk1FU1NBR0UoSlRSQ19CTVAsICIldXgldSAyNC1iaXQgQk1QIGltYWdlIikKLUpNRVNTQUdFKEpUUkNfQk1QX01BUFBFRCwgIiV1eCV1IDgtYml0IGNvbG9ybWFwcGVkIEJNUCBpbWFnZSIpCi1KTUVTU0FHRShKVFJDX0JNUF9PUzIsICIldXgldSAyNC1iaXQgT1MyIEJNUCBpbWFnZSIpCi1KTUVTU0FHRShKVFJDX0JNUF9PUzJfTUFQUEVELCAiJXV4JXUgOC1iaXQgY29sb3JtYXBwZWQgT1MyIEJNUCBpbWFnZSIpCi0jZW5kaWYgLyogQk1QX1NVUFBPUlRFRCAqLwotCi0jaWZkZWYgR0lGX1NVUFBPUlRFRAotSk1FU1NBR0UoSkVSUl9HSUZfQlVHLCAiR0lGIG91dHB1dCBnb3QgY29uZnVzZWQiKQotSk1FU1NBR0UoSkVSUl9HSUZfQ09ERVNJWkUsICJCb2d1cyBHSUYgY29kZXNpemUgJWQiKQotSk1FU1NBR0UoSkVSUl9HSUZfQ09MT1JTUEFDRSwgIkdJRiBvdXRwdXQgbXVzdCBiZSBncmF5c2NhbGUgb3IgUkdCIikKLUpNRVNTQUdFKEpFUlJfR0lGX0lNQUdFTk9URk9VTkQsICJUb28gZmV3IGltYWdlcyBpbiBHSUYgZmlsZSIpCi1KTUVTU0FHRShKRVJSX0dJRl9OT1QsICJOb3QgYSBHSUYgZmlsZSIpCi1KTUVTU0FHRShKVFJDX0dJRiwgIiV1eCV1eCVkIEdJRiBpbWFnZSIpCi1KTUVTU0FHRShKVFJDX0dJRl9CQURWRVJTSU9OLAotCSAiV2FybmluZzogdW5leHBlY3RlZCBHSUYgdmVyc2lvbiBudW1iZXIgJyVjJWMlYyciKQotSk1FU1NBR0UoSlRSQ19HSUZfRVhURU5TSU9OLCAiSWdub3JpbmcgR0lGIGV4dGVuc2lvbiBibG9jayBvZiB0eXBlIDB4JTAyeCIpCi1KTUVTU0FHRShKVFJDX0dJRl9OT05TUVVBUkUsICJDYXV0aW9uOiBub25zcXVhcmUgcGl4ZWxzIGluIGlucHV0IikKLUpNRVNTQUdFKEpXUk5fR0lGX0JBRERBVEEsICJDb3JydXB0IGRhdGEgaW4gR0lGIGZpbGUiKQotSk1FU1NBR0UoSldSTl9HSUZfQ0hBUiwgIkJvZ3VzIGNoYXIgMHglMDJ4IGluIEdJRiBmaWxlLCBpZ25vcmluZyIpCi1KTUVTU0FHRShKV1JOX0dJRl9FTkRDT0RFLCAiUHJlbWF0dXJlIGVuZCBvZiBHSUYgaW1hZ2UiKQotSk1FU1NBR0UoSldSTl9HSUZfTk9NT1JFREFUQSwgIlJhbiBvdXQgb2YgR0lGIGJpdHMiKQotI2VuZGlmIC8qIEdJRl9TVVBQT1JURUQgKi8KLQotI2lmZGVmIFBQTV9TVVBQT1JURUQKLUpNRVNTQUdFKEpFUlJfUFBNX0NPTE9SU1BBQ0UsICJQUE0gb3V0cHV0IG11c3QgYmUgZ3JheXNjYWxlIG9yIFJHQiIpCi1KTUVTU0FHRShKRVJSX1BQTV9OT05OVU1FUklDLCAiTm9ubnVtZXJpYyBkYXRhIGluIFBQTSBmaWxlIikKLUpNRVNTQUdFKEpFUlJfUFBNX05PVCwgIk5vdCBhIFBQTS9QR00gZmlsZSIpCi1KTUVTU0FHRShKVFJDX1BHTSwgIiV1eCV1IFBHTSBpbWFnZSIpCi1KTUVTU0FHRShKVFJDX1BHTV9URVhULCAiJXV4JXUgdGV4dCBQR00gaW1hZ2UiKQotSk1FU1NBR0UoSlRSQ19QUE0sICIldXgldSBQUE0gaW1hZ2UiKQotSk1FU1NBR0UoSlRSQ19QUE1fVEVYVCwgIiV1eCV1IHRleHQgUFBNIGltYWdlIikKLSNlbmRpZiAvKiBQUE1fU1VQUE9SVEVEICovCi0KLSNpZmRlZiBSTEVfU1VQUE9SVEVECi1KTUVTU0FHRShKRVJSX1JMRV9CQURFUlJPUiwgIkJvZ3VzIGVycm9yIGNvZGUgZnJvbSBSTEUgbGlicmFyeSIpCi1KTUVTU0FHRShKRVJSX1JMRV9DT0xPUlNQQUNFLCAiUkxFIG91dHB1dCBtdXN0IGJlIGdyYXlzY2FsZSBvciBSR0IiKQotSk1FU1NBR0UoSkVSUl9STEVfRElNRU5TSU9OUywgIkltYWdlIGRpbWVuc2lvbnMgKCV1eCV1KSB0b28gbGFyZ2UgZm9yIFJMRSIpCi1KTUVTU0FHRShKRVJSX1JMRV9FTVBUWSwgIkVtcHR5IFJMRSBmaWxlIikKLUpNRVNTQUdFKEpFUlJfUkxFX0VPRiwgIlByZW1hdHVyZSBFT0YgaW4gUkxFIGhlYWRlciIpCi1KTUVTU0FHRShKRVJSX1JMRV9NRU0sICJJbnN1ZmZpY2llbnQgbWVtb3J5IGZvciBSTEUgaGVhZGVyIikKLUpNRVNTQUdFKEpFUlJfUkxFX05PVCwgIk5vdCBhbiBSTEUgZmlsZSIpCi1KTUVTU0FHRShKRVJSX1JMRV9UT09NQU5ZQ0hBTk5FTFMsICJDYW5ub3QgaGFuZGxlICVkIG91dHB1dCBjaGFubmVscyBmb3IgUkxFIikKLUpNRVNTQUdFKEpFUlJfUkxFX1VOU1VQUE9SVEVELCAiQ2Fubm90IGhhbmRsZSB0aGlzIFJMRSBzZXR1cCIpCi1KTUVTU0FHRShKVFJDX1JMRSwgIiV1eCV1IGZ1bGwtY29sb3IgUkxFIGZpbGUiKQotSk1FU1NBR0UoSlRSQ19STEVfRlVMTE1BUCwgIiV1eCV1IGZ1bGwtY29sb3IgUkxFIGZpbGUgd2l0aCBtYXAgb2YgbGVuZ3RoICVkIikKLUpNRVNTQUdFKEpUUkNfUkxFX0dSQVksICIldXgldSBncmF5c2NhbGUgUkxFIGZpbGUiKQotSk1FU1NBR0UoSlRSQ19STEVfTUFQR1JBWSwgIiV1eCV1IGdyYXlzY2FsZSBSTEUgZmlsZSB3aXRoIG1hcCBvZiBsZW5ndGggJWQiKQotSk1FU1NBR0UoSlRSQ19STEVfTUFQUEVELCAiJXV4JXUgY29sb3JtYXBwZWQgUkxFIGZpbGUgd2l0aCBtYXAgb2YgbGVuZ3RoICVkIikKLSNlbmRpZiAvKiBSTEVfU1VQUE9SVEVEICovCi0KLSNpZmRlZiBUQVJHQV9TVVBQT1JURUQKLUpNRVNTQUdFKEpFUlJfVEdBX0JBRENNQVAsICJVbnN1cHBvcnRlZCBUYXJnYSBjb2xvcm1hcCBmb3JtYXQiKQotSk1FU1NBR0UoSkVSUl9UR0FfQkFEUEFSTVMsICJJbnZhbGlkIG9yIHVuc3VwcG9ydGVkIFRhcmdhIGZpbGUiKQotSk1FU1NBR0UoSkVSUl9UR0FfQ09MT1JTUEFDRSwgIlRhcmdhIG91dHB1dCBtdXN0IGJlIGdyYXlzY2FsZSBvciBSR0IiKQotSk1FU1NBR0UoSlRSQ19UR0EsICIldXgldSBSR0IgVGFyZ2EgaW1hZ2UiKQotSk1FU1NBR0UoSlRSQ19UR0FfR1JBWSwgIiV1eCV1IGdyYXlzY2FsZSBUYXJnYSBpbWFnZSIpCi1KTUVTU0FHRShKVFJDX1RHQV9NQVBQRUQsICIldXgldSBjb2xvcm1hcHBlZCBUYXJnYSBpbWFnZSIpCi0jZWxzZQotSk1FU1NBR0UoSkVSUl9UR0FfTk9UQ09NUCwgIlRhcmdhIHN1cHBvcnQgd2FzIG5vdCBjb21waWxlZCIpCi0jZW5kaWYgLyogVEFSR0FfU1VQUE9SVEVEICovCi0KLUpNRVNTQUdFKEpFUlJfQkFEX0NNQVBfRklMRSwKLQkgIkNvbG9yIG1hcCBmaWxlIGlzIGludmFsaWQgb3Igb2YgdW5zdXBwb3J0ZWQgZm9ybWF0IikKLUpNRVNTQUdFKEpFUlJfVE9PX01BTllfQ09MT1JTLAotCSAiT3V0cHV0IGZpbGUgZm9ybWF0IGNhbm5vdCBoYW5kbGUgJWQgY29sb3JtYXAgZW50cmllcyIpCi1KTUVTU0FHRShKRVJSX1VOR0VUQ19GQUlMRUQsICJ1bmdldGMgZmFpbGVkIikKLSNpZmRlZiBUQVJHQV9TVVBQT1JURUQKLUpNRVNTQUdFKEpFUlJfVU5LTk9XTl9GT1JNQVQsCi0JICJVbnJlY29nbml6ZWQgaW5wdXQgZmlsZSBmb3JtYXQgLS0tIHBlcmhhcHMgeW91IG5lZWQgLXRhcmdhIikKLSNlbHNlCi1KTUVTU0FHRShKRVJSX1VOS05PV05fRk9STUFULCAiVW5yZWNvZ25pemVkIGlucHV0IGZpbGUgZm9ybWF0IikKLSNlbmRpZgotSk1FU1NBR0UoSkVSUl9VTlNVUFBPUlRFRF9GT1JNQVQsICJVbnN1cHBvcnRlZCBvdXRwdXQgZmlsZSBmb3JtYXQiKQotCi0jaWZkZWYgSk1BS0VfRU5VTV9MSVNUCi0KLSAgSk1TR19MQVNUQURET05DT0RFCi19IEFERE9OX01FU1NBR0VfQ09ERTsKLQotI3VuZGVmIEpNQUtFX0VOVU1fTElTVAotI2VuZGlmIC8qIEpNQUtFX0VOVU1fTElTVCAqLwotCi0vKiBaYXAgSk1FU1NBR0UgbWFjcm8gc28gdGhhdCBmdXR1cmUgcmUtaW5jbHVzaW9ucyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQgKi8KLSN1bmRlZiBKTUVTU0FHRQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9jZGpwZWcuaCBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvY2RqcGVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNzI4ZWUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9jZGpwZWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKgotICogY2RqcGVnLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBjb21tb24gZGVjbGFyYXRpb25zIGZvciB0aGUgc2FtcGxlIGFwcGxpY2F0aW9ucwotICogY2pwZWcgYW5kIGRqcGVnLiAgSXQgaXMgTk9UIHVzZWQgYnkgdGhlIGNvcmUgSlBFRyBsaWJyYXJ5LgotICovCi0KLSNkZWZpbmUgSlBFR19DSlBFR19ESlBFRwkvKiBkZWZpbmUgcHJvcGVyIG9wdGlvbnMgaW4gamNvbmZpZy5oICovCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxfT1BUSU9OUwkvKiBjanBlZy5jLGRqcGVnLmMgbmVlZCB0byBzZWUgeHh4X1NVUFBPUlRFRCAqLwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImplcnJvci5oIgkJLyogZ2V0IGxpYnJhcnkgZXJyb3IgY29kZXMgdG9vICovCi0jaW5jbHVkZSAiY2RlcnJvci5oIgkJLyogZ2V0IGFwcGxpY2F0aW9uLXNwZWNpZmljIGVycm9yIGNvZGVzICovCi0KLQotLyoKLSAqIE9iamVjdCBpbnRlcmZhY2UgZm9yIGNqcGVnJ3Mgc291cmNlIGZpbGUgZGVjb2RpbmcgbW9kdWxlcwotICovCi0KLXR5cGVkZWYgc3RydWN0IGNqcGVnX3NvdXJjZV9zdHJ1Y3QgKiBjanBlZ19zb3VyY2VfcHRyOwotCi1zdHJ1Y3QgY2pwZWdfc291cmNlX3N0cnVjdCB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfaW5wdXQsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCSAgICAgIGNqcGVnX3NvdXJjZV9wdHIgc2luZm8pKTsKLSAgSk1FVEhPRChKRElNRU5TSU9OLCBnZXRfcGl4ZWxfcm93cywgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSAgICAgICBjanBlZ19zb3VyY2VfcHRyIHNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgZmluaXNoX2lucHV0LCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkgICAgICAgY2pwZWdfc291cmNlX3B0ciBzaW5mbykpOwotCi0gIEZYU1lTX0ZJTEUgKmlucHV0X2ZpbGU7Ci0KLSAgSlNBTVBBUlJBWSBidWZmZXI7Ci0gIEpESU1FTlNJT04gYnVmZmVyX2hlaWdodDsKLX07Ci0KLQotLyoKLSAqIE9iamVjdCBpbnRlcmZhY2UgZm9yIGRqcGVnJ3Mgb3V0cHV0IGZpbGUgZW5jb2RpbmcgbW9kdWxlcwotICovCi0KLXR5cGVkZWYgc3RydWN0IGRqcGVnX2Rlc3Rfc3RydWN0ICogZGpwZWdfZGVzdF9wdHI7Ci0KLXN0cnVjdCBkanBlZ19kZXN0X3N0cnVjdCB7Ci0gIC8qIHN0YXJ0X291dHB1dCBpcyBjYWxsZWQgYWZ0ZXIganBlZ19zdGFydF9kZWNvbXByZXNzIGZpbmlzaGVzLgotICAgKiBUaGUgY29sb3IgbWFwIHdpbGwgYmUgcmVhZHkgYXQgdGhpcyB0aW1lLCBpZiBvbmUgaXMgbmVlZGVkLgotICAgKi8KLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9vdXRwdXQsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJICAgICAgIGRqcGVnX2Rlc3RfcHRyIGRpbmZvKSk7Ci0gIC8qIEVtaXQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgcGl4ZWwgcm93cyBmcm9tIHRoZSBidWZmZXIuICovCi0gIEpNRVRIT0Qodm9pZCwgcHV0X3BpeGVsX3Jvd3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSBkanBlZ19kZXN0X3B0ciBkaW5mbywKLQkJCQkgSkRJTUVOU0lPTiByb3dzX3N1cHBsaWVkKSk7Ci0gIC8qIEZpbmlzaCB1cCBhdCB0aGUgZW5kIG9mIHRoZSBpbWFnZS4gKi8KLSAgSk1FVEhPRCh2b2lkLCBmaW5pc2hfb3V0cHV0LCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQlkanBlZ19kZXN0X3B0ciBkaW5mbykpOwotCi0gIC8qIFRhcmdldCBmaWxlIHNwZWM7IGZpbGxlZCBpbiBieSBkanBlZy5jIGFmdGVyIG9iamVjdCBpcyBjcmVhdGVkLiAqLwotICBGWFNZU19GSUxFICogb3V0cHV0X2ZpbGU7Ci0KLSAgLyogT3V0cHV0IHBpeGVsLXJvdyBidWZmZXIuICBDcmVhdGVkIGJ5IG1vZHVsZSBpbml0IG9yIHN0YXJ0X291dHB1dC4KLSAgICogV2lkdGggaXMgY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRwdXRfY29tcG9uZW50czsKLSAgICogaGVpZ2h0IGlzIGJ1ZmZlcl9oZWlnaHQuCi0gICAqLwotICBKU0FNUEFSUkFZIGJ1ZmZlcjsKLSAgSkRJTUVOU0lPTiBidWZmZXJfaGVpZ2h0OwotfTsKLQotCi0vKgotICogY2pwZWcvZGpwZWcgbWF5IG5lZWQgdG8gcGVyZm9ybSBleHRyYSBwYXNzZXMgdG8gY29udmVydCB0byBvciBmcm9tCi0gKiB0aGUgc291cmNlL2Rlc3RpbmF0aW9uIGZpbGUgZm9ybWF0LiAgVGhlIEpQRUcgbGlicmFyeSBkb2VzIG5vdCBrbm93Ci0gKiBhYm91dCB0aGVzZSBwYXNzZXMsIGJ1dCB3ZSdkIGxpa2UgdGhlbSB0byBiZSBjb3VudGVkIGJ5IHRoZSBwcm9ncmVzcwotICogbW9uaXRvci4gIFdlIHVzZSBhbiBleHBhbmRlZCBwcm9ncmVzcyBtb25pdG9yIG9iamVjdCB0byBob2xkIHRoZQotICogYWRkaXRpb25hbCBwYXNzIGNvdW50LgotICovCi0KLXN0cnVjdCBjZGpwZWdfcHJvZ3Jlc3NfbWdyIHsKLSAgc3RydWN0IGpwZWdfcHJvZ3Jlc3NfbWdyIHB1YjsJLyogZmllbGRzIGtub3duIHRvIEpQRUcgbGlicmFyeSAqLwotICBpbnQgY29tcGxldGVkX2V4dHJhX3Bhc3NlczsJLyogZXh0cmEgcGFzc2VzIGNvbXBsZXRlZCAqLwotICBpbnQgdG90YWxfZXh0cmFfcGFzc2VzOwkvKiB0b3RhbCBleHRyYSAqLwotICAvKiBsYXN0IHByaW50ZWQgcGVyY2VudGFnZSBzdG9yZWQgaGVyZSB0byBhdm9pZCBtdWx0aXBsZSBwcmludG91dHMgKi8KLSAgaW50IHBlcmNlbnRfZG9uZTsKLX07Ci0KLXR5cGVkZWYgc3RydWN0IGNkanBlZ19wcm9ncmVzc19tZ3IgKiBjZF9wcm9ncmVzc19wdHI7Ci0KLQotLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCi0KLSNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jZGVmaW5lIGppbml0X3JlYWRfYm1wCQlqSVJkQk1QCi0jZGVmaW5lIGppbml0X3dyaXRlX2JtcAkJaklXckJNUAotI2RlZmluZSBqaW5pdF9yZWFkX2dpZgkJaklSZEdJRgotI2RlZmluZSBqaW5pdF93cml0ZV9naWYJCWpJV3JHSUYKLSNkZWZpbmUgamluaXRfcmVhZF9wcG0JCWpJUmRQUE0KLSNkZWZpbmUgamluaXRfd3JpdGVfcHBtCQlqSVdyUFBNCi0jZGVmaW5lIGppbml0X3JlYWRfcmxlCQlqSVJkUkxFCi0jZGVmaW5lIGppbml0X3dyaXRlX3JsZQkJaklXclJMRQotI2RlZmluZSBqaW5pdF9yZWFkX3RhcmdhCWpJUmRUYXJnYQotI2RlZmluZSBqaW5pdF93cml0ZV90YXJnYQlqSVdyVGFyZ2EKLSNkZWZpbmUgcmVhZF9xdWFudF90YWJsZXMJUmRRVGFibGVzCi0jZGVmaW5lIHJlYWRfc2Nhbl9zY3JpcHQJUmRTY25TY3JpcHQKLSNkZWZpbmUgc2V0X3F1YW50X3Nsb3RzCQlTZXRRU2xvdHMKLSNkZWZpbmUgc2V0X3NhbXBsZV9mYWN0b3JzCVNldFNGYWN0cwotI2RlZmluZSByZWFkX2NvbG9yX21hcAkJUmRDTWFwCi0jZGVmaW5lIGVuYWJsZV9zaWduYWxfY2F0Y2hlcglFblNpZ0NhdGNoZXIKLSNkZWZpbmUgc3RhcnRfcHJvZ3Jlc3NfbW9uaXRvcglTdFByb2dNb24KLSNkZWZpbmUgZW5kX3Byb2dyZXNzX21vbml0b3IJRW5Qcm9nTW9uCi0jZGVmaW5lIHJlYWRfc3RkaW4JCVJkU3RkaW4KLSNkZWZpbmUgd3JpdGVfc3Rkb3V0CQlXclN0ZG91dAotI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KLQotLyogTW9kdWxlIHNlbGVjdGlvbiByb3V0aW5lcyBmb3IgSS9PIG1vZHVsZXMuICovCi0KLUVYVEVSTihjanBlZ19zb3VyY2VfcHRyKSBqaW5pdF9yZWFkX2JtcCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4oZGpwZWdfZGVzdF9wdHIpIGppbml0X3dyaXRlX2JtcCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICBib29sZWFuIGlzX29zMikpOwotRVhURVJOKGNqcGVnX3NvdXJjZV9wdHIpIGppbml0X3JlYWRfZ2lmIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTihkanBlZ19kZXN0X3B0cikgamluaXRfd3JpdGVfZ2lmIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGNqcGVnX3NvdXJjZV9wdHIpIGppbml0X3JlYWRfcHBtIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTihkanBlZ19kZXN0X3B0cikgamluaXRfd3JpdGVfcHBtIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGNqcGVnX3NvdXJjZV9wdHIpIGppbml0X3JlYWRfcmxlIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTihkanBlZ19kZXN0X3B0cikgamluaXRfd3JpdGVfcmxlIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGNqcGVnX3NvdXJjZV9wdHIpIGppbml0X3JlYWRfdGFyZ2EgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKGRqcGVnX2Rlc3RfcHRyKSBqaW5pdF93cml0ZV90YXJnYSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLQotLyogY2pwZWcgc3VwcG9ydCByb3V0aW5lcyAoaW4gcmRzd2l0Y2guYykgKi8KLQotRVhURVJOKGJvb2xlYW4pIHJlYWRfcXVhbnRfdGFibGVzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKiBmaWxlbmFtZSwKLQkJCQkgICAgaW50IHNjYWxlX2ZhY3RvciwgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkpOwotRVhURVJOKGJvb2xlYW4pIHJlYWRfc2Nhbl9zY3JpcHQgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgY2hhciAqIGZpbGVuYW1lKSk7Ci1FWFRFUk4oYm9vbGVhbikgc2V0X3F1YW50X3Nsb3RzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGNoYXIgKmFyZykpOwotRVhURVJOKGJvb2xlYW4pIHNldF9zYW1wbGVfZmFjdG9ycyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBjaGFyICphcmcpKTsKLQotLyogZGpwZWcgc3VwcG9ydCByb3V0aW5lcyAoaW4gcmRjb2xtYXAuYykgKi8KLQotRVhURVJOKHZvaWQpIHJlYWRfY29sb3JfbWFwIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgRlhTWVNfRklMRSAqIGluZmlsZSkpOwotCi0vKiBjb21tb24gc3VwcG9ydCByb3V0aW5lcyAoaW4gY2RqcGVnLmMpICovCi0KLUVYVEVSTih2b2lkKSBlbmFibGVfc2lnbmFsX2NhdGNoZXIgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBzdGFydF9wcm9ncmVzc19tb25pdG9yIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLAotCQkJCQkgY2RfcHJvZ3Jlc3NfcHRyIHByb2dyZXNzKSk7Ci1FWFRFUk4odm9pZCkgZW5kX3Byb2dyZXNzX21vbml0b3IgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLUVYVEVSTihib29sZWFuKSBrZXltYXRjaCBKUFAoKGNoYXIgKiBhcmcsIGNvbnN0IGNoYXIgKiBrZXl3b3JkLCBpbnQgbWluY2hhcnMpKTsKLUVYVEVSTihGWFNZU19GSUxFICopIHJlYWRfc3RkaW4gSlBQKCh2b2lkKSk7Ci1FWFRFUk4oRlhTWVNfRklMRSAqKSB3cml0ZV9zdGRvdXQgSlBQKCh2b2lkKSk7Ci0KLS8qIG1pc2NlbGxhbmVvdXMgdXNlZnVsIG1hY3JvcyAqLwotCi0jaWZkZWYgRE9OVF9VU0VfQl9NT0RFCQkvKiBkZWZpbmUgbW9kZSBwYXJhbWV0ZXJzIGZvciBmb3BlbigpICovCi0jZGVmaW5lIFJFQURfQklOQVJZCSJyIgotI2RlZmluZSBXUklURV9CSU5BUlkJInciCi0jZWxzZQotI2lmZGVmIFZNUwkJCS8qIFZNUyBpcyB2ZXJ5IG5vbnN0YW5kYXJkICovCi0jZGVmaW5lIFJFQURfQklOQVJZCSJyYiIsICJjdHg9c3RtIgotI2RlZmluZSBXUklURV9CSU5BUlkJIndiIiwgImN0eD1zdG0iCi0jZWxzZQkJCQkvKiBzdGFuZGFyZCBBTlNJLWNvbXBsaWFudCBjYXNlICovCi0jZGVmaW5lIFJFQURfQklOQVJZCSJyYiIKLSNkZWZpbmUgV1JJVEVfQklOQVJZCSJ3YiIKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgRVhJVF9GQUlMVVJFCQkvKiBkZWZpbmUgZXhpdCgpIGNvZGVzIGlmIG5vdCBwcm92aWRlZCAqLwotI2RlZmluZSBFWElUX0ZBSUxVUkUgIDEKLSNlbmRpZgotI2lmbmRlZiBFWElUX1NVQ0NFU1MKLSNpZmRlZiBWTVMKLSNkZWZpbmUgRVhJVF9TVUNDRVNTICAxCQkvKiBWTVMgaXMgdmVyeSBub25zdGFuZGFyZCAqLwotI2Vsc2UKLSNkZWZpbmUgRVhJVF9TVUNDRVNTICAwCi0jZW5kaWYKLSNlbmRpZgotI2lmbmRlZiBFWElUX1dBUk5JTkcKLSNpZmRlZiBWTVMKLSNkZWZpbmUgRVhJVF9XQVJOSU5HICAxCQkvKiBWTVMgaXMgdmVyeSBub25zdGFuZGFyZCAqLwotI2Vsc2UKLSNkZWZpbmUgRVhJVF9XQVJOSU5HICAyCi0jZW5kaWYKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjYXBpbWluLmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNhcGltaW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmYjhjNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNhcGltaW4uYworKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKgotICogamNhcGltaW4uYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGFwcGxpY2F0aW9uIGludGVyZmFjZSBjb2RlIGZvciB0aGUgY29tcHJlc3Npb24gaGFsZgotICogb2YgdGhlIEpQRUcgbGlicmFyeS4gIFRoZXNlIGFyZSB0aGUgIm1pbmltdW0iIEFQSSByb3V0aW5lcyB0aGF0IG1heSBiZQotICogbmVlZGVkIGluIGVpdGhlciB0aGUgbm9ybWFsIGZ1bGwtY29tcHJlc3Npb24gY2FzZSBvciB0aGUgdHJhbnNjb2Rpbmctb25seQotICogY2FzZS4KLSAqCi0gKiBNb3N0IG9mIHRoZSByb3V0aW5lcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgYW4gYXBwbGljYXRpb24KLSAqIGFyZSBpbiB0aGlzIGZpbGUgb3IgaW4gamNhcGlzdGQuYy4gIEJ1dCBhbHNvIHNlZSBqY3BhcmFtLmMgZm9yCi0gKiBwYXJhbWV0ZXItc2V0dXAgaGVscGVyIHJvdXRpbmVzLCBqY29tYXBpLmMgZm9yIHJvdXRpbmVzIHNoYXJlZCBieQotICogY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24sIGFuZCBqY3RyYW5zLmMgZm9yIHRoZSB0cmFuc2NvZGluZyBjYXNlLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKgotICogSW5pdGlhbGl6YXRpb24gb2YgYSBKUEVHIGNvbXByZXNzaW9uIG9iamVjdC4KLSAqIFRoZSBlcnJvciBtYW5hZ2VyIG11c3QgYWxyZWFkeSBiZSBzZXQgdXAgKGluIGNhc2UgbWVtb3J5IG1hbmFnZXIgZmFpbHMpLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19DcmVhdGVDb21wcmVzcyAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2ZXJzaW9uLCBzaXplX3Qgc3RydWN0c2l6ZSkKLXsKLSAgaW50IGk7Ci0KLSAgLyogR3VhcmQgYWdhaW5zdCB2ZXJzaW9uIG1pc21hdGNoZXMgYmV0d2VlbiBsaWJyYXJ5IGFuZCBjYWxsZXIuICovCi0gIGNpbmZvLT5tZW0gPSBOVUxMOwkJLyogc28ganBlZ19kZXN0cm95IGtub3dzIG1lbSBtZ3Igbm90IGNhbGxlZCAqLwotICBpZiAodmVyc2lvbiAhPSBKUEVHX0xJQl9WRVJTSU9OKQotICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0JBRF9MSUJfVkVSU0lPTiwgSlBFR19MSUJfVkVSU0lPTiwgdmVyc2lvbik7Ci0gIGlmIChzdHJ1Y3RzaXplICE9IFNJWkVPRihzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QpKQotICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0JBRF9TVFJVQ1RfU0laRSwgCi0JICAgICAoaW50KSBTSVpFT0Yoc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0KSwgKGludCkgc3RydWN0c2l6ZSk7Ci0KLSAgLyogRm9yIGRlYnVnZ2luZyBwdXJwb3Nlcywgd2UgemVybyB0aGUgd2hvbGUgbWFzdGVyIHN0cnVjdHVyZS4KLSAgICogQnV0IHRoZSBhcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBzZXQgdGhlIGVyciBwb2ludGVyLCBhbmQgbWF5IGhhdmUgc2V0Ci0gICAqIGNsaWVudF9kYXRhLCBzbyB3ZSBoYXZlIHRvIHNhdmUgYW5kIHJlc3RvcmUgdGhvc2UgZmllbGRzLgotICAgKiBOb3RlOiBpZiBhcHBsaWNhdGlvbiBoYXNuJ3Qgc2V0IGNsaWVudF9kYXRhLCB0b29scyBsaWtlIFB1cmlmeSBtYXkKLSAgICogY29tcGxhaW4gaGVyZS4KLSAgICovCi0gIHsKLSAgICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIgPSBjaW5mby0+ZXJyOwotICAgIHZvaWQgKiBjbGllbnRfZGF0YSA9IGNpbmZvLT5jbGllbnRfZGF0YTsgLyogaWdub3JlIFB1cmlmeSBjb21wbGFpbnQgaGVyZSAqLwotICAgIE1FTVpFUk8oY2luZm8sIFNJWkVPRihzdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QpKTsKLSAgICBjaW5mby0+ZXJyID0gZXJyOwotICAgIGNpbmZvLT5jbGllbnRfZGF0YSA9IGNsaWVudF9kYXRhOwotICB9Ci0gIGNpbmZvLT5pc19kZWNvbXByZXNzb3IgPSBGQUxTRTsKLQotICAvKiBJbml0aWFsaXplIGEgbWVtb3J5IG1hbmFnZXIgaW5zdGFuY2UgZm9yIHRoaXMgb2JqZWN0ICovCi0gIGppbml0X21lbW9yeV9tZ3IoKGpfY29tbW9uX3B0cikgY2luZm8pOwotCi0gIC8qIFplcm8gb3V0IHBvaW50ZXJzIHRvIHBlcm1hbmVudCBzdHJ1Y3R1cmVzLiAqLwotICBjaW5mby0+cHJvZ3Jlc3MgPSBOVUxMOwotICBjaW5mby0+ZGVzdCA9IE5VTEw7Ci0KLSAgY2luZm8tPmNvbXBfaW5mbyA9IE5VTEw7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9RVUFOVF9UQkxTOyBpKyspCi0gICAgY2luZm8tPnF1YW50X3RibF9wdHJzW2ldID0gTlVMTDsKLQotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7Ci0gICAgY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbaV0gPSBOVUxMOwotICAgIGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2ldID0gTlVMTDsKLSAgfQotCi0gIGNpbmZvLT5zY3JpcHRfc3BhY2UgPSBOVUxMOwotCi0gIGNpbmZvLT5pbnB1dF9nYW1tYSA9IDEuMDsJLyogaW4gY2FzZSBhcHBsaWNhdGlvbiBmb3JnZXRzICovCi0KLSAgLyogT0ssIEknbSByZWFkeSAqLwotICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gQ1NUQVRFX1NUQVJUOwotfQotCi0KLS8qCi0gKiBEZXN0cnVjdGlvbiBvZiBhIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0Ci0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2Rlc3Ryb3lfY29tcHJlc3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBqcGVnX2Rlc3Ryb3koKGpfY29tbW9uX3B0cikgY2luZm8pOyAvKiB1c2UgY29tbW9uIHJvdXRpbmUgKi8KLX0KLQotCi0vKgotICogQWJvcnQgcHJvY2Vzc2luZyBvZiBhIEpQRUcgY29tcHJlc3Npb24gb3BlcmF0aW9uLAotICogYnV0IGRvbid0IGRlc3Ryb3kgdGhlIG9iamVjdCBpdHNlbGYuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2Fib3J0X2NvbXByZXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAganBlZ19hYm9ydCgoal9jb21tb25fcHRyKSBjaW5mbyk7IC8qIHVzZSBjb21tb24gcm91dGluZSAqLwotfQotCi0KLS8qCi0gKiBGb3JjaWJseSBzdXBwcmVzcyBvciB1bi1zdXBwcmVzcyBhbGwgcXVhbnRpemF0aW9uIGFuZCBIdWZmbWFuIHRhYmxlcy4KLSAqIE1hcmtzIGFsbCBjdXJyZW50bHkgZGVmaW5lZCB0YWJsZXMgYXMgYWxyZWFkeSB3cml0dGVuIChpZiBzdXBwcmVzcykKLSAqIG9yIG5vdCB3cml0dGVuIChpZiAhc3VwcHJlc3MpLiAgVGhpcyB3aWxsIGNvbnRyb2wgd2hldGhlciB0aGV5IGdldCBlbWl0dGVkCi0gKiBieSBhIHN1YnNlcXVlbnQganBlZ19zdGFydF9jb21wcmVzcyBjYWxsLgotICoKLSAqIFRoaXMgcm91dGluZSBpcyBleHBvcnRlZCBmb3IgdXNlIGJ5IGFwcGxpY2F0aW9ucyB0aGF0IHdhbnQgdG8gcHJvZHVjZQotICogYWJicmV2aWF0ZWQgSlBFRyBkYXRhc3RyZWFtcy4gIEl0IGxvZ2ljYWxseSBiZWxvbmdzIGluIGpjcGFyYW0uYywgYnV0Ci0gKiBzaW5jZSBpdCBpcyBjYWxsZWQgYnkganBlZ19zdGFydF9jb21wcmVzcywgd2UgcHV0IGl0IGhlcmUgLS0tIG90aGVyd2lzZQotICogamNwYXJhbS5vIHdvdWxkIGJlIGxpbmtlZCB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbiB1c2VkIGl0IG9yIG5vdC4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfc3VwcHJlc3NfdGFibGVzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBzdXBwcmVzcykKLXsKLSAgaW50IGk7Ci0gIEpRVUFOVF9UQkwgKiBxdGJsOwotICBKSFVGRl9UQkwgKiBodGJsOwotCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fUVVBTlRfVEJMUzsgaSsrKSB7Ci0gICAgaWYgKChxdGJsID0gY2luZm8tPnF1YW50X3RibF9wdHJzW2ldKSAhPSBOVUxMKQotICAgICAgcXRibC0+c2VudF90YWJsZSA9IHN1cHByZXNzOwotICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgewotICAgIGlmICgoaHRibCA9IGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2ldKSAhPSBOVUxMKQotICAgICAgaHRibC0+c2VudF90YWJsZSA9IHN1cHByZXNzOwotICAgIGlmICgoaHRibCA9IGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2ldKSAhPSBOVUxMKQotICAgICAgaHRibC0+c2VudF90YWJsZSA9IHN1cHByZXNzOwotICB9Ci19Ci0KLQotLyoKLSAqIEZpbmlzaCBKUEVHIGNvbXByZXNzaW9uLgotICoKLSAqIElmIGEgbXVsdGlwYXNzIG9wZXJhdGluZyBtb2RlIHdhcyBzZWxlY3RlZCwgdGhpcyBtYXkgZG8gYSBncmVhdCBkZWFsIG9mCi0gKiB3b3JrIGluY2x1ZGluZyBtb3N0IG9mIHRoZSBhY3R1YWwgb3V0cHV0LgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19maW5pc2hfY29tcHJlc3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBKRElNRU5TSU9OIGlNQ1Vfcm93OwotCi0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IENTVEFURV9TQ0FOTklORyB8fAotICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBDU1RBVEVfUkFXX09LKSB7Ci0gICAgLyogVGVybWluYXRlIGZpcnN0IHBhc3MgKi8KLSAgICBpZiAoY2luZm8tPm5leHRfc2NhbmxpbmUgPCBjaW5mby0+aW1hZ2VfaGVpZ2h0KQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9UT09fTElUVExFX0RBVEEpOwotICAgICgqY2luZm8tPm1hc3Rlci0+ZmluaXNoX3Bhc3MpIChjaW5mbyk7Ci0gIH0gZWxzZSBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfV1JDT0VGUykKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotICAvKiBQZXJmb3JtIGFueSByZW1haW5pbmcgcGFzc2VzICovCi0gIHdoaWxlICghIGNpbmZvLT5tYXN0ZXItPmlzX2xhc3RfcGFzcykgewotICAgICgqY2luZm8tPm1hc3Rlci0+cHJlcGFyZV9mb3JfcGFzcykgKGNpbmZvKTsKLSAgICBmb3IgKGlNQ1Vfcm93ID0gMDsgaU1DVV9yb3cgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzOyBpTUNVX3JvdysrKSB7Ci0gICAgICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKLQljaW5mby0+cHJvZ3Jlc3MtPnBhc3NfY291bnRlciA9IChsb25nKSBpTUNVX3JvdzsKLQljaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPnRvdGFsX2lNQ1Vfcm93czsKLQkoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICAgIH0KLSAgICAgIC8qIFdlIGJ5cGFzcyB0aGUgbWFpbiBjb250cm9sbGVyIGFuZCBpbnZva2UgY29lZiBjb250cm9sbGVyIGRpcmVjdGx5OwotICAgICAgICogYWxsIHdvcmsgaXMgYmVpbmcgZG9uZSBmcm9tIHRoZSBjb2VmZmljaWVudCBidWZmZXIuCi0gICAgICAgKi8KLSAgICAgIGlmICghICgqY2luZm8tPmNvZWYtPmNvbXByZXNzX2RhdGEpIChjaW5mbywgKEpTQU1QSU1BR0UpIE5VTEwpKQotCUVSUkVYSVQoY2luZm8sIEpFUlJfQ0FOVF9TVVNQRU5EKTsKLSAgICB9Ci0gICAgKCpjaW5mby0+bWFzdGVyLT5maW5pc2hfcGFzcykgKGNpbmZvKTsKLSAgfQotICAvKiBXcml0ZSBFT0ksIGRvIGZpbmFsIGNsZWFudXAgKi8KLSAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9maWxlX3RyYWlsZXIpIChjaW5mbyk7Ci0gICgqY2luZm8tPmRlc3QtPnRlcm1fZGVzdGluYXRpb24pIChjaW5mbyk7Ci0gIC8qIFdlIGNhbiB1c2UganBlZ19hYm9ydCB0byByZWxlYXNlIG1lbW9yeSBhbmQgcmVzZXQgZ2xvYmFsX3N0YXRlICovCi0gIGpwZWdfYWJvcnQoKGpfY29tbW9uX3B0cikgY2luZm8pOwotfQotCi0KLS8qCi0gKiBXcml0ZSBhIHNwZWNpYWwgbWFya2VyLgotICogVGhpcyBpcyBvbmx5IHJlY29tbWVuZGVkIGZvciB3cml0aW5nIENPTSBvciBBUFBuIG1hcmtlcnMuCi0gKiBNdXN0IGJlIGNhbGxlZCBhZnRlciBqcGVnX3N0YXJ0X2NvbXByZXNzKCkgYW5kIGJlZm9yZQotICogZmlyc3QgY2FsbCB0byBqcGVnX3dyaXRlX3NjYW5saW5lcygpIG9yIGpwZWdfd3JpdGVfcmF3X2RhdGEoKS4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfd3JpdGVfbWFya2VyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwKLQkJICAgY29uc3QgSk9DVEVUICpkYXRhcHRyLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKLXsKLSAgSk1FVEhPRCh2b2lkLCB3cml0ZV9tYXJrZXJfYnl0ZSwgKGpfY29tcHJlc3NfcHRyIGluZm8sIGludCB2YWwpKTsKLQotICBpZiAoY2luZm8tPm5leHRfc2NhbmxpbmUgIT0gMCB8fAotICAgICAgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NDQU5OSU5HICYmCi0gICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfUkFXX09LICYmCi0gICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfV1JDT0VGUykpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLQotICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX21hcmtlcl9oZWFkZXIpIChjaW5mbywgbWFya2VyLCBkYXRhbGVuKTsKLSAgd3JpdGVfbWFya2VyX2J5dGUgPSBjaW5mby0+bWFya2VyLT53cml0ZV9tYXJrZXJfYnl0ZTsJLyogY29weSBmb3Igc3BlZWQgKi8KLSAgd2hpbGUgKGRhdGFsZW4tLSkgewotICAgICgqd3JpdGVfbWFya2VyX2J5dGUpIChjaW5mbywgKmRhdGFwdHIpOwotICAgIGRhdGFwdHIrKzsKLSAgfQotfQotCi0vKiBTYW1lLCBidXQgcGllY2VtZWFsLiAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfd3JpdGVfbV9oZWFkZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikKLXsKLSAgaWYgKGNpbmZvLT5uZXh0X3NjYW5saW5lICE9IDAgfHwKLSAgICAgIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TQ0FOTklORyAmJgotICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1JBV19PSyAmJgotICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1dSQ09FRlMpKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0KLSAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9tYXJrZXJfaGVhZGVyKSAoY2luZm8sIG1hcmtlciwgZGF0YWxlbik7Ci19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ193cml0ZV9tX2J5dGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmFsKQotewotICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX21hcmtlcl9ieXRlKSAoY2luZm8sIHZhbCk7Ci19Ci0KLQotLyoKLSAqIEFsdGVybmF0ZSBjb21wcmVzc2lvbiBmdW5jdGlvbjoganVzdCB3cml0ZSBhbiBhYmJyZXZpYXRlZCB0YWJsZSBmaWxlLgotICogQmVmb3JlIGNhbGxpbmcgdGhpcywgYWxsIHBhcmFtZXRlcnMgYW5kIGEgZGF0YSBkZXN0aW5hdGlvbiBtdXN0IGJlIHNldCB1cC4KLSAqCi0gKiBUbyBwcm9kdWNlIGEgcGFpciBvZiBmaWxlcyBjb250YWluaW5nIGFiYnJldmlhdGVkIHRhYmxlcyBhbmQgYWJicmV2aWF0ZWQKLSAqIGltYWdlIGRhdGEsIG9uZSB3b3VsZCBwcm9jZWVkIGFzIGZvbGxvd3M6Ci0gKgotICoJCWluaXRpYWxpemUgSlBFRyBvYmplY3QKLSAqCQlzZXQgSlBFRyBwYXJhbWV0ZXJzCi0gKgkJc2V0IGRlc3RpbmF0aW9uIHRvIHRhYmxlIGZpbGUKLSAqCQlqcGVnX3dyaXRlX3RhYmxlcyhjaW5mbyk7Ci0gKgkJc2V0IGRlc3RpbmF0aW9uIHRvIGltYWdlIGZpbGUKLSAqCQlqcGVnX3N0YXJ0X2NvbXByZXNzKGNpbmZvLCBGQUxTRSk7Ci0gKgkJd3JpdGUgZGF0YS4uLgotICoJCWpwZWdfZmluaXNoX2NvbXByZXNzKGNpbmZvKTsKLSAqCi0gKiBqcGVnX3dyaXRlX3RhYmxlcyBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIG1hcmtpbmcgYWxsIHRhYmxlcyB3cml0dGVuCi0gKiAoc2FtZSBhcyBqcGVnX3N1cHByZXNzX3RhYmxlcyguLi4sIFRSVUUpKS4gIFRodXMgYSBzdWJzZXF1ZW50IHN0YXJ0X2NvbXByZXNzCi0gKiB3aWxsIG5vdCByZS1lbWl0IHRoZSB0YWJsZXMgdW5sZXNzIGl0IGlzIHBhc3NlZCB3cml0ZV9hbGxfdGFibGVzPVRSVUUuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3dyaXRlX3RhYmxlcyAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotCi0gIC8qIChSZSlpbml0aWFsaXplIGVycm9yIG1nciBhbmQgZGVzdGluYXRpb24gbW9kdWxlcyAqLwotICAoKmNpbmZvLT5lcnItPnJlc2V0X2Vycm9yX21ncikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgKCpjaW5mby0+ZGVzdC0+aW5pdF9kZXN0aW5hdGlvbikgKGNpbmZvKTsKLSAgLyogSW5pdGlhbGl6ZSB0aGUgbWFya2VyIHdyaXRlciAuLi4gYml0IG9mIGEgY3JvY2sgdG8gZG8gaXQgaGVyZS4gKi8KLSAgamluaXRfbWFya2VyX3dyaXRlcihjaW5mbyk7Ci0gIC8qIFdyaXRlIHRoZW0gdGFibGVzISAqLwotICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX3RhYmxlc19vbmx5KSAoY2luZm8pOwotICAvKiBBbmQgY2xlYW4gdXAuICovCi0gICgqY2luZm8tPmRlc3QtPnRlcm1fZGVzdGluYXRpb24pIChjaW5mbyk7Ci0gIC8qCi0gICAqIEluIGxpYnJhcnkgcmVsZWFzZXMgdXAgdGhyb3VnaCB2NmEsIHdlIGNhbGxlZCBqcGVnX2Fib3J0KCkgaGVyZSB0byBmcmVlCi0gICAqIGFueSB3b3JraW5nIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhlIGRlc3RpbmF0aW9uIG1hbmFnZXIgYW5kIG1hcmtlcgotICAgKiB3cml0ZXIuICBTb21lIGFwcGxpY2F0aW9ucyBoYWQgYSBwcm9ibGVtIHdpdGggdGhhdDogdGhleSBhbGxvY2F0ZWQgc3BhY2UKLSAgICogb2YgdGhlaXIgb3duIGZyb20gdGhlIGxpYnJhcnkgbWVtb3J5IG1hbmFnZXIsIGFuZCBkaWRuJ3Qgd2FudCBpdCB0byBnbwotICAgKiBhd2F5IGR1cmluZyB3cml0ZV90YWJsZXMuICBTbyBub3cgd2UgZG8gbm90aGluZy4gIFRoaXMgd2lsbCBjYXVzZSBhCi0gICAqIG1lbW9yeSBsZWFrIGlmIGFuIGFwcCBjYWxscyB3cml0ZV90YWJsZXMgcmVwZWF0ZWRseSB3aXRob3V0IGRvaW5nIGEgZnVsbAotICAgKiBjb21wcmVzc2lvbiBjeWNsZSBvciBvdGhlcndpc2UgcmVzZXR0aW5nIHRoZSBKUEVHIG9iamVjdC4gIEhvd2V2ZXIsIHRoYXQKLSAgICogc2VlbXMgbGVzcyBiYWQgdGhhbiB1bmV4cGVjdGVkbHkgZnJlZWluZyBtZW1vcnkgaW4gdGhlIG5vcm1hbCBjYXNlLgotICAgKiBBbiBhcHAgdGhhdCBwcmVmZXJzIHRoZSBvbGQgYmVoYXZpb3IgY2FuIGNhbGwganBlZ19hYm9ydCBmb3IgaXRzZWxmIGFmdGVyCi0gICAqIGVhY2ggY2FsbCB0byBqcGVnX3dyaXRlX3RhYmxlcygpLgotICAgKi8KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY2FwaXN0ZC5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjYXBpc3RkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMzIwYjEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjYXBpc3RkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoKLSAqIGpjYXBpc3RkLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgY29kZSBmb3IgdGhlIGNvbXByZXNzaW9uIGhhbGYKLSAqIG9mIHRoZSBKUEVHIGxpYnJhcnkuICBUaGVzZSBhcmUgdGhlICJzdGFuZGFyZCIgQVBJIHJvdXRpbmVzIHRoYXQgYXJlCi0gKiB1c2VkIGluIHRoZSBub3JtYWwgZnVsbC1jb21wcmVzc2lvbiBjYXNlLiAgVGhleSBhcmUgbm90IHVzZWQgYnkgYQotICogdHJhbnNjb2Rpbmctb25seSBhcHBsaWNhdGlvbi4gIE5vdGUgdGhhdCBpZiBhbiBhcHBsaWNhdGlvbiBsaW5rcyBpbgotICoganBlZ19zdGFydF9jb21wcmVzcywgaXQgd2lsbCBlbmQgdXAgbGlua2luZyBpbiB0aGUgZW50aXJlIGNvbXByZXNzb3IuCi0gKiBXZSB0aHVzIG11c3Qgc2VwYXJhdGUgdGhpcyBmaWxlIGZyb20gamNhcGltaW4uYyB0byBhdm9pZCBsaW5raW5nIHRoZQotICogd2hvbGUgY29tcHJlc3Npb24gbGlicmFyeSBpbnRvIGEgdHJhbnNjb2Rlci4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyoKLSAqIENvbXByZXNzaW9uIGluaXRpYWxpemF0aW9uLgotICogQmVmb3JlIGNhbGxpbmcgdGhpcywgYWxsIHBhcmFtZXRlcnMgYW5kIGEgZGF0YSBkZXN0aW5hdGlvbiBtdXN0IGJlIHNldCB1cC4KLSAqCi0gKiBXZSByZXF1aXJlIGEgd3JpdGVfYWxsX3RhYmxlcyBwYXJhbWV0ZXIgYXMgYSBmYWlsc2FmZSBjaGVjayB3aGVuIHdyaXRpbmcKLSAqIG11bHRpcGxlIGRhdGFzdHJlYW1zIGZyb20gdGhlIHNhbWUgY29tcHJlc3Npb24gb2JqZWN0LiAgU2luY2UgcHJpb3IgcnVucwotICogd2lsbCBoYXZlIGxlZnQgYWxsIHRoZSB0YWJsZXMgbWFya2VkIHNlbnRfdGFibGU9VFJVRSwgYSBzdWJzZXF1ZW50IHJ1bgotICogd291bGQgZW1pdCBhbiBhYmJyZXZpYXRlZCBzdHJlYW0gKG5vIHRhYmxlcykgYnkgZGVmYXVsdC4gIFRoaXMgbWF5IGJlIHdoYXQKLSAqIGlzIHdhbnRlZCwgYnV0IGZvciBzYWZldHkncyBzYWtlIGl0IHNob3VsZCBub3QgYmUgdGhlIGRlZmF1bHQgYmVoYXZpb3I6Ci0gKiBwcm9ncmFtbWVycyBzaG91bGQgaGF2ZSB0byBtYWtlIGEgZGVsaWJlcmF0ZSBjaG9pY2UgdG8gZW1pdCBhYmJyZXZpYXRlZAotICogaW1hZ2VzLiAgVGhlcmVmb3JlIHRoZSBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcyBzaG91bGQgZW5jb3VyYWdlIHBlb3BsZQotICogdG8gcGFzcyB3cml0ZV9hbGxfdGFibGVzPVRSVUU7IHRoZW4gaXQgd2lsbCB0YWtlIGFjdGl2ZSB0aG91Z2h0IHRvIGRvIHRoZQotICogd3JvbmcgdGhpbmcuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3N0YXJ0X2NvbXByZXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiB3cml0ZV9hbGxfdGFibGVzKQotewotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLQotICBpZiAod3JpdGVfYWxsX3RhYmxlcykKLSAgICBqcGVnX3N1cHByZXNzX3RhYmxlcyhjaW5mbywgRkFMU0UpOwkvKiBtYXJrIGFsbCB0YWJsZXMgdG8gYmUgd3JpdHRlbiAqLwotCi0gIC8qIChSZSlpbml0aWFsaXplIGVycm9yIG1nciBhbmQgZGVzdGluYXRpb24gbW9kdWxlcyAqLwotICAoKmNpbmZvLT5lcnItPnJlc2V0X2Vycm9yX21ncikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgKCpjaW5mby0+ZGVzdC0+aW5pdF9kZXN0aW5hdGlvbikgKGNpbmZvKTsKLSAgLyogUGVyZm9ybSBtYXN0ZXIgc2VsZWN0aW9uIG9mIGFjdGl2ZSBtb2R1bGVzICovCi0gIGppbml0X2NvbXByZXNzX21hc3RlcihjaW5mbyk7Ci0gIC8qIFNldCB1cCBmb3IgdGhlIGZpcnN0IHBhc3MgKi8KLSAgKCpjaW5mby0+bWFzdGVyLT5wcmVwYXJlX2Zvcl9wYXNzKSAoY2luZm8pOwotICAvKiBSZWFkeSBmb3IgYXBwbGljYXRpb24gdG8gZHJpdmUgZmlyc3QgcGFzcyB0aHJvdWdoIGpwZWdfd3JpdGVfc2NhbmxpbmVzCi0gICAqIG9yIGpwZWdfd3JpdGVfcmF3X2RhdGEuCi0gICAqLwotICBjaW5mby0+bmV4dF9zY2FubGluZSA9IDA7Ci0gIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSAoY2luZm8tPnJhd19kYXRhX2luID8gQ1NUQVRFX1JBV19PSyA6IENTVEFURV9TQ0FOTklORyk7Ci19Ci0KLQotLyoKLSAqIFdyaXRlIHNvbWUgc2NhbmxpbmVzIG9mIGRhdGEgdG8gdGhlIEpQRUcgY29tcHJlc3Nvci4KLSAqCi0gKiBUaGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgdGhlIG51bWJlciBvZiBsaW5lcyBhY3R1YWxseSB3cml0dGVuLgotICogVGhpcyBzaG91bGQgYmUgbGVzcyB0aGFuIHRoZSBzdXBwbGllZCBudW1fbGluZXMgb25seSBpbiBjYXNlIHRoYXQKLSAqIHRoZSBkYXRhIGRlc3RpbmF0aW9uIG1vZHVsZSBoYXMgcmVxdWVzdGVkIHN1c3BlbnNpb24gb2YgdGhlIGNvbXByZXNzb3IsCi0gKiBvciBpZiBtb3JlIHRoYW4gaW1hZ2VfaGVpZ2h0IHNjYW5saW5lcyBhcmUgcGFzc2VkIGluLgotICoKLSAqIE5vdGU6IHdlIHdhcm4gYWJvdXQgZXhjZXNzIGNhbGxzIHRvIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCkgc2luY2UKLSAqIHRoaXMgbGlrZWx5IHNpZ25hbHMgYW4gYXBwbGljYXRpb24gcHJvZ3JhbW1lciBlcnJvci4gIEhvd2V2ZXIsCi0gKiBleGNlc3Mgc2NhbmxpbmVzIHBhc3NlZCBpbiB0aGUgbGFzdCB2YWxpZCBjYWxsIGFyZSAqc2lsZW50bHkqIGlnbm9yZWQsCi0gKiBzbyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBuZWVkIG5vdCBhZGp1c3QgbnVtX2xpbmVzIGZvciBlbmQtb2YtaW1hZ2UKLSAqIHdoZW4gdXNpbmcgYSBtdWx0aXBsZS1zY2FubGluZSBidWZmZXIuCi0gKi8KLQotR0xPQkFMKEpESU1FTlNJT04pCi1qcGVnX3dyaXRlX3NjYW5saW5lcyAoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgc2NhbmxpbmVzLAotCQkgICAgICBKRElNRU5TSU9OIG51bV9saW5lcykKLXsKLSAgSkRJTUVOU0lPTiByb3dfY3RyLCByb3dzX2xlZnQ7Ci0KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NDQU5OSU5HKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIGlmIChjaW5mby0+bmV4dF9zY2FubGluZSA+PSBjaW5mby0+aW1hZ2VfaGVpZ2h0KQotICAgIFdBUk5NUyhjaW5mbywgSldSTl9UT09fTVVDSF9EQVRBKTsKLQotICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCi0gIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5uZXh0X3NjYW5saW5lOwotICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCA9IChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0OwotICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICB9Ci0KLSAgLyogR2l2ZSBtYXN0ZXIgY29udHJvbCBtb2R1bGUgYW5vdGhlciBjaGFuY2UgaWYgdGhpcyBpcyBmaXJzdCBjYWxsIHRvCi0gICAqIGpwZWdfd3JpdGVfc2NhbmxpbmVzLiAgVGhpcyBsZXRzIG91dHB1dCBvZiB0aGUgZnJhbWUvc2NhbiBoZWFkZXJzIGJlCi0gICAqIGRlbGF5ZWQgc28gdGhhdCBhcHBsaWNhdGlvbiBjYW4gd3JpdGUgQ09NLCBldGMsIG1hcmtlcnMgYmV0d2VlbgotICAgKiBqcGVnX3N0YXJ0X2NvbXByZXNzIGFuZCBqcGVnX3dyaXRlX3NjYW5saW5lcy4KLSAgICovCi0gIGlmIChjaW5mby0+bWFzdGVyLT5jYWxsX3Bhc3Nfc3RhcnR1cCkKLSAgICAoKmNpbmZvLT5tYXN0ZXItPnBhc3Nfc3RhcnR1cCkgKGNpbmZvKTsKLQotICAvKiBJZ25vcmUgYW55IGV4dHJhIHNjYW5saW5lcyBhdCBib3R0b20gb2YgaW1hZ2UuICovCi0gIHJvd3NfbGVmdCA9IGNpbmZvLT5pbWFnZV9oZWlnaHQgLSBjaW5mby0+bmV4dF9zY2FubGluZTsKLSAgaWYgKG51bV9saW5lcyA+IHJvd3NfbGVmdCkKLSAgICBudW1fbGluZXMgPSByb3dzX2xlZnQ7Ci0KLSAgcm93X2N0ciA9IDA7Ci0gICgqY2luZm8tPm1haW4tPnByb2Nlc3NfZGF0YSkgKGNpbmZvLCBzY2FubGluZXMsICZyb3dfY3RyLCBudW1fbGluZXMpOwotICBjaW5mby0+bmV4dF9zY2FubGluZSArPSByb3dfY3RyOwotICByZXR1cm4gcm93X2N0cjsKLX0KLQotCi0vKgotICogQWx0ZXJuYXRlIGVudHJ5IHBvaW50IHRvIHdyaXRlIHJhdyBkYXRhLgotICogUHJvY2Vzc2VzIGV4YWN0bHkgb25lIGlNQ1Ugcm93IHBlciBjYWxsLCB1bmxlc3Mgc3VzcGVuZGVkLgotICovCi0KLUdMT0JBTChKRElNRU5TSU9OKQotanBlZ193cml0ZV9yYXdfZGF0YSAoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgZGF0YSwKLQkJICAgICBKRElNRU5TSU9OIG51bV9saW5lcykKLXsKLSAgSkRJTUVOU0lPTiBsaW5lc19wZXJfaU1DVV9yb3c7Ci0KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1JBV19PSykKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotICBpZiAoY2luZm8tPm5leHRfc2NhbmxpbmUgPj0gY2luZm8tPmltYWdlX2hlaWdodCkgewotICAgIFdBUk5NUyhjaW5mbywgSldSTl9UT09fTVVDSF9EQVRBKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KLSAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAobG9uZykgY2luZm8tPm5leHRfc2NhbmxpbmU7Ci0gICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQ7Ci0gICAgKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gIH0KLQotICAvKiBHaXZlIG1hc3RlciBjb250cm9sIG1vZHVsZSBhbm90aGVyIGNoYW5jZSBpZiB0aGlzIGlzIGZpcnN0IGNhbGwgdG8KLSAgICoganBlZ193cml0ZV9yYXdfZGF0YS4gIFRoaXMgbGV0cyBvdXRwdXQgb2YgdGhlIGZyYW1lL3NjYW4gaGVhZGVycyBiZQotICAgKiBkZWxheWVkIHNvIHRoYXQgYXBwbGljYXRpb24gY2FuIHdyaXRlIENPTSwgZXRjLCBtYXJrZXJzIGJldHdlZW4KLSAgICoganBlZ19zdGFydF9jb21wcmVzcyBhbmQganBlZ193cml0ZV9yYXdfZGF0YS4KLSAgICovCi0gIGlmIChjaW5mby0+bWFzdGVyLT5jYWxsX3Bhc3Nfc3RhcnR1cCkKLSAgICAoKmNpbmZvLT5tYXN0ZXItPnBhc3Nfc3RhcnR1cCkgKGNpbmZvKTsKLQotICAvKiBWZXJpZnkgdGhhdCBhdCBsZWFzdCBvbmUgaU1DVSByb3cgaGFzIGJlZW4gcGFzc2VkLiAqLwotICBsaW5lc19wZXJfaU1DVV9yb3cgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFOwotICBpZiAobnVtX2xpbmVzIDwgbGluZXNfcGVyX2lNQ1Vfcm93KQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQlVGRkVSX1NJWkUpOwotCi0gIC8qIERpcmVjdGx5IGNvbXByZXNzIHRoZSByb3cuICovCi0gIGlmICghICgqY2luZm8tPmNvZWYtPmNvbXByZXNzX2RhdGEpIChjaW5mbywgZGF0YSkpIHsKLSAgICAvKiBJZiBjb21wcmVzc29yIGRpZCBub3QgY29uc3VtZSB0aGUgd2hvbGUgcm93LCBzdXNwZW5kIHByb2Nlc3NpbmcuICovCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKiBPSywgd2UgcHJvY2Vzc2VkIG9uZSBpTUNVIHJvdy4gKi8KLSAgY2luZm8tPm5leHRfc2NhbmxpbmUgKz0gbGluZXNfcGVyX2lNQ1Vfcm93OwotICByZXR1cm4gbGluZXNfcGVyX2lNQ1Vfcm93OwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjY29lZmN0LmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNjb2VmY3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk2M2RkYi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNjb2VmY3QuYworKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0vKgotICogamNjb2VmY3QuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2VmZmljaWVudCBidWZmZXIgY29udHJvbGxlciBmb3IgY29tcHJlc3Npb24uCi0gKiBUaGlzIGNvbnRyb2xsZXIgaXMgdGhlIHRvcCBsZXZlbCBvZiB0aGUgSlBFRyBjb21wcmVzc29yIHByb3Blci4KLSAqIFRoZSBjb2VmZmljaWVudCBidWZmZXIgbGllcyBiZXR3ZWVuIGZvcndhcmQtRENUIGFuZCBlbnRyb3B5IGVuY29kaW5nIHN0ZXBzLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBXZSB1c2UgYSBmdWxsLWltYWdlIGNvZWZmaWNpZW50IGJ1ZmZlciB3aGVuIGRvaW5nIEh1ZmZtYW4gb3B0aW1pemF0aW9uLAotICogYW5kIGFsc28gZm9yIHdyaXRpbmcgbXVsdGlwbGUtc2NhbiBKUEVHIGZpbGVzLiAgSW4gYWxsIGNhc2VzLCB0aGUgRENUCi0gKiBzdGVwIGlzIHJ1biBkdXJpbmcgdGhlIGZpcnN0IHBhc3MsIGFuZCBzdWJzZXF1ZW50IHBhc3NlcyBuZWVkIG9ubHkgcmVhZAotICogdGhlIGJ1ZmZlcmVkIGNvZWZmaWNpZW50cy4KLSAqLwotI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAotI2RlZmluZSBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRAotI2Vsc2UKLSNpZmRlZiBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLSNkZWZpbmUgRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQKLSNlbmRpZgotI2VuZGlmCi0KLQotLyogUHJpdmF0ZSBidWZmZXIgY29udHJvbGxlciBvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19jX2NvZWZfY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICBKRElNRU5TSU9OIGlNQ1Vfcm93X251bTsJLyogaU1DVSByb3cgIyB3aXRoaW4gaW1hZ2UgKi8KLSAgSkRJTUVOU0lPTiBtY3VfY3RyOwkJLyogY291bnRzIE1DVXMgcHJvY2Vzc2VkIGluIGN1cnJlbnQgcm93ICovCi0gIGludCBNQ1VfdmVydF9vZmZzZXQ7CQkvKiBjb3VudHMgTUNVIHJvd3Mgd2l0aGluIGlNQ1Ugcm93ICovCi0gIGludCBNQ1Vfcm93c19wZXJfaU1DVV9yb3c7CS8qIG51bWJlciBvZiBzdWNoIHJvd3MgbmVlZGVkICovCi0KLSAgLyogRm9yIHNpbmdsZS1wYXNzIGNvbXByZXNzaW9uLCBpdCdzIHN1ZmZpY2llbnQgdG8gYnVmZmVyIGp1c3Qgb25lIE1DVQotICAgKiAoYWx0aG91Z2ggdGhpcyBtYXkgcHJvdmUgYSBiaXQgc2xvdyBpbiBwcmFjdGljZSkuICBXZSBhbGxvY2F0ZSBhCi0gICAqIHdvcmtzcGFjZSBvZiBDX01BWF9CTE9DS1NfSU5fTUNVIGNvZWZmaWNpZW50IGJsb2NrcywgYW5kIHJldXNlIGl0IGZvciBlYWNoCi0gICAqIE1DVSBjb25zdHJ1Y3RlZCBhbmQgc2VudC4gIChPbiA4MHg4NiwgdGhlIHdvcmtzcGFjZSBpcyBGQVIgZXZlbiB0aG91Z2gKLSAgICogaXQncyBub3QgcmVhbGx5IHZlcnkgYmlnOyB0aGlzIGlzIHRvIGtlZXAgdGhlIG1vZHVsZSBpbnRlcmZhY2VzIHVuY2hhbmdlZAotICAgKiB3aGVuIGEgbGFyZ2UgY29lZmZpY2llbnQgYnVmZmVyIGlzIG5lY2Vzc2FyeS4pCi0gICAqIEluIG11bHRpLXBhc3MgbW9kZXMsIHRoaXMgYXJyYXkgcG9pbnRzIHRvIHRoZSBjdXJyZW50IE1DVSdzIGJsb2NrcwotICAgKiB3aXRoaW4gdGhlIHZpcnR1YWwgYXJyYXlzLgotICAgKi8KLSAgSkJMT0NLUk9XIE1DVV9idWZmZXJbQ19NQVhfQkxPQ0tTX0lOX01DVV07Ci0KLSAgLyogSW4gbXVsdGktcGFzcyBtb2Rlcywgd2UgbmVlZCBhIHZpcnR1YWwgYmxvY2sgYXJyYXkgZm9yIGVhY2ggY29tcG9uZW50LiAqLwotICBqdmlydF9iYXJyYXlfcHRyIHdob2xlX2ltYWdlW01BWF9DT01QT05FTlRTXTsKLX0gbXlfY29lZl9jb250cm9sbGVyOwotCi10eXBlZGVmIG15X2NvZWZfY29udHJvbGxlciAqIG15X2NvZWZfcHRyOwotCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi1NRVRIT0RERUYoYm9vbGVhbikgY29tcHJlc3NfZGF0YQotICAgIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0UgaW5wdXRfYnVmKSk7Ci0jaWZkZWYgRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQKLU1FVEhPRERFRihib29sZWFuKSBjb21wcmVzc19maXJzdF9wYXNzCi0gICAgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpKTsKLU1FVEhPRERFRihib29sZWFuKSBjb21wcmVzc19vdXRwdXQKLSAgICBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZikpOwotI2VuZGlmCi0KLQotTE9DQUwodm9pZCkKLXN0YXJ0X2lNQ1Vfcm93IChqX2NvbXByZXNzX3B0ciBjaW5mbykKLS8qIFJlc2V0IHdpdGhpbi1pTUNVLXJvdyBjb3VudGVycyBmb3IgYSBuZXcgcm93ICovCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotCi0gIC8qIEluIGFuIGludGVybGVhdmVkIHNjYW4sIGFuIE1DVSByb3cgaXMgdGhlIHNhbWUgYXMgYW4gaU1DVSByb3cuCi0gICAqIEluIGEgbm9uaW50ZXJsZWF2ZWQgc2NhbiwgYW4gaU1DVSByb3cgaGFzIHZfc2FtcF9mYWN0b3IgTUNVIHJvd3MuCi0gICAqIEJ1dCBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZSwgcHJvY2VzcyBvbmx5IHdoYXQncyBsZWZ0LgotICAgKi8KLSAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuID4gMSkgewotICAgIGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdyA9IDE7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGNvZWYtPmlNQ1Vfcm93X251bSA8IChjaW5mby0+dG90YWxfaU1DVV9yb3dzLTEpKQotICAgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF0tPnZfc2FtcF9mYWN0b3I7Ci0gICAgZWxzZQotICAgICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF0tPmxhc3Rfcm93X2hlaWdodDsKLSAgfQotCi0gIGNvZWYtPm1jdV9jdHIgPSAwOwotICBjb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSAwOwotfQotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhIHByb2Nlc3NpbmcgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfY29lZiAoal9jb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKQotewotICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKLQotICBjb2VmLT5pTUNVX3Jvd19udW0gPSAwOwotICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7Ci0KLSAgc3dpdGNoIChwYXNzX21vZGUpIHsKLSAgY2FzZSBKQlVGX1BBU1NfVEhSVToKLSAgICBpZiAoY29lZi0+d2hvbGVfaW1hZ2VbMF0gIT0gTlVMTCkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLSAgICBjb2VmLT5wdWIuY29tcHJlc3NfZGF0YSA9IGNvbXByZXNzX2RhdGE7Ci0gICAgYnJlYWs7Ci0jaWZkZWYgRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQKLSAgY2FzZSBKQlVGX1NBVkVfQU5EX1BBU1M6Ci0gICAgaWYgKGNvZWYtPndob2xlX2ltYWdlWzBdID09IE5VTEwpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7Ci0gICAgY29lZi0+cHViLmNvbXByZXNzX2RhdGEgPSBjb21wcmVzc19maXJzdF9wYXNzOwotICAgIGJyZWFrOwotICBjYXNlIEpCVUZfQ1JBTktfREVTVDoKLSAgICBpZiAoY29lZi0+d2hvbGVfaW1hZ2VbMF0gPT0gTlVMTCkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLSAgICBjb2VmLT5wdWIuY29tcHJlc3NfZGF0YSA9IGNvbXByZXNzX291dHB1dDsKLSAgICBicmVhazsKLSNlbmRpZgotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLSAgICBicmVhazsKLSAgfQotfQotCi0KLS8qCi0gKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgc2luZ2xlLXBhc3MgY2FzZS4KLSAqIFdlIHByb2Nlc3MgdGhlIGVxdWl2YWxlbnQgb2Ygb25lIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3cgKCJpTUNVIiByb3cpCi0gKiBwZXIgY2FsbCwgaWUsIHZfc2FtcF9mYWN0b3IgYmxvY2sgcm93cyBmb3IgZWFjaCBjb21wb25lbnQgaW4gdGhlIGltYWdlLgotICogUmV0dXJucyBUUlVFIGlmIHRoZSBpTUNVIHJvdyBpcyBjb21wbGV0ZWQsIEZBTFNFIGlmIHN1c3BlbmRlZC4KLSAqCi0gKiBOQjogaW5wdXRfYnVmIGNvbnRhaW5zIGEgcGxhbmUgZm9yIGVhY2ggY29tcG9uZW50IGluIGltYWdlLAotICogd2hpY2ggd2UgaW5kZXggYWNjb3JkaW5nIHRvIHRoZSBjb21wb25lbnQncyBTT0YgcG9zaXRpb24uCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1jb21wcmVzc19kYXRhIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCi0gIEpESU1FTlNJT04gbGFzdF9NQ1VfY29sID0gY2luZm8tPk1DVXNfcGVyX3JvdyAtIDE7Ci0gIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOwotICBpbnQgYmxrbiwgYmksIGNpLCB5aW5kZXgsIHlvZmZzZXQsIGJsb2NrY250OwotICBKRElNRU5TSU9OIHlwb3MsIHhwb3M7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgLyogTG9vcCB0byB3cml0ZSBhcyBtdWNoIGFzIG9uZSB3aG9sZSBpTUNVIHJvdyAqLwotICBmb3IgKHlvZmZzZXQgPSBjb2VmLT5NQ1VfdmVydF9vZmZzZXQ7IHlvZmZzZXQgPCBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3c7Ci0gICAgICAgeW9mZnNldCsrKSB7Ci0gICAgZm9yIChNQ1VfY29sX251bSA9IGNvZWYtPm1jdV9jdHI7IE1DVV9jb2xfbnVtIDw9IGxhc3RfTUNVX2NvbDsKLQkgTUNVX2NvbF9udW0rKykgewotICAgICAgLyogRGV0ZXJtaW5lIHdoZXJlIGRhdGEgY29tZXMgZnJvbSBpbiBpbnB1dF9idWYgYW5kIGRvIHRoZSBEQ1QgdGhpbmcuCi0gICAgICAgKiBFYWNoIGNhbGwgb24gZm9yd2FyZF9EQ1QgcHJvY2Vzc2VzIGEgaG9yaXpvbnRhbCByb3cgb2YgRENUIGJsb2NrcwotICAgICAgICogYXMgd2lkZSBhcyBhbiBNQ1U7IHdlIHJlbHkgb24gaGF2aW5nIGFsbG9jYXRlZCB0aGUgTUNVX2J1ZmZlcltdIGJsb2NrcwotICAgICAgICogc2VxdWVudGlhbGx5LiAgRHVtbXkgYmxvY2tzIGF0IHRoZSByaWdodCBvciBib3R0b20gZWRnZSBhcmUgZmlsbGVkIGluCi0gICAgICAgKiBzcGVjaWFsbHkuICBUaGUgZGF0YSBpbiB0aGVtIGRvZXMgbm90IG1hdHRlciBmb3IgaW1hZ2UgcmVjb25zdHJ1Y3Rpb24sCi0gICAgICAgKiBzbyB3ZSBmaWxsIHRoZW0gd2l0aCB2YWx1ZXMgdGhhdCB3aWxsIGVuY29kZSB0byB0aGUgc21hbGxlc3QgYW1vdW50IG9mCi0gICAgICAgKiBkYXRhLCB2aXo6IGFsbCB6ZXJvZXMgaW4gdGhlIEFDIGVudHJpZXMsIERDIGVudHJpZXMgZXF1YWwgdG8gcHJldmlvdXMKLSAgICAgICAqIGJsb2NrJ3MgREMgdmFsdWUuICAoVGhhbmtzIHRvIFRob21hcyBLaW5zbWFuIGZvciB0aGlzIGlkZWEuKQotICAgICAgICovCi0gICAgICBibGtuID0gMDsKLSAgICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0JY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLQlibG9ja2NudCA9IChNQ1VfY29sX251bSA8IGxhc3RfTUNVX2NvbCkgPyBjb21wcHRyLT5NQ1Vfd2lkdGgKLQkJCQkJCTogY29tcHB0ci0+bGFzdF9jb2xfd2lkdGg7Ci0JeHBvcyA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3NhbXBsZV93aWR0aDsKLQl5cG9zID0geW9mZnNldCAqIERDVFNJWkU7IC8qIHlwb3MgPT0gKHlvZmZzZXQreWluZGV4KSAqIERDVFNJWkUgKi8KLQlmb3IgKHlpbmRleCA9IDA7IHlpbmRleCA8IGNvbXBwdHItPk1DVV9oZWlnaHQ7IHlpbmRleCsrKSB7Ci0JICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgbGFzdF9pTUNVX3JvdyB8fAotCSAgICAgIHlvZmZzZXQreWluZGV4IDwgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0KSB7Ci0JICAgICgqY2luZm8tPmZkY3QtPmZvcndhcmRfRENUKSAoY2luZm8sIGNvbXBwdHIsCi0JCQkJCSBpbnB1dF9idWZbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKLQkJCQkJIGNvZWYtPk1DVV9idWZmZXJbYmxrbl0sCi0JCQkJCSB5cG9zLCB4cG9zLCAoSkRJTUVOU0lPTikgYmxvY2tjbnQpOwotCSAgICBpZiAoYmxvY2tjbnQgPCBjb21wcHRyLT5NQ1Vfd2lkdGgpIHsKLQkgICAgICAvKiBDcmVhdGUgc29tZSBkdW1teSBibG9ja3MgYXQgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGltYWdlLiAqLwotCSAgICAgIGp6ZXJvX2Zhcigodm9pZCBGQVIgKikgY29lZi0+TUNVX2J1ZmZlcltibGtuICsgYmxvY2tjbnRdLAotCQkJKGNvbXBwdHItPk1DVV93aWR0aCAtIGJsb2NrY250KSAqIFNJWkVPRihKQkxPQ0spKTsKLQkgICAgICBmb3IgKGJpID0gYmxvY2tjbnQ7IGJpIDwgY29tcHB0ci0+TUNVX3dpZHRoOyBiaSsrKSB7Ci0JCWNvZWYtPk1DVV9idWZmZXJbYmxrbitiaV1bMF1bMF0gPSBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24rYmktMV1bMF1bMF07Ci0JICAgICAgfQotCSAgICB9Ci0JICB9IGVsc2UgewotCSAgICAvKiBDcmVhdGUgYSByb3cgb2YgZHVtbXkgYmxvY2tzIGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLiAqLwotCSAgICBqemVyb19mYXIoKHZvaWQgRkFSICopIGNvZWYtPk1DVV9idWZmZXJbYmxrbl0sCi0JCSAgICAgIGNvbXBwdHItPk1DVV93aWR0aCAqIFNJWkVPRihKQkxPQ0spKTsKLQkgICAgZm9yIChiaSA9IDA7IGJpIDwgY29tcHB0ci0+TUNVX3dpZHRoOyBiaSsrKSB7Ci0JICAgICAgY29lZi0+TUNVX2J1ZmZlcltibGtuK2JpXVswXVswXSA9IGNvZWYtPk1DVV9idWZmZXJbYmxrbi0xXVswXVswXTsKLQkgICAgfQotCSAgfQotCSAgYmxrbiArPSBjb21wcHRyLT5NQ1Vfd2lkdGg7Ci0JICB5cG9zICs9IERDVFNJWkU7Ci0JfQotICAgICAgfQotICAgICAgLyogVHJ5IHRvIHdyaXRlIHRoZSBNQ1UuICBJbiBldmVudCBvZiBhIHN1c3BlbnNpb24gZmFpbHVyZSwgd2Ugd2lsbAotICAgICAgICogcmUtRENUIHRoZSBNQ1Ugb24gcmVzdGFydCAoYSBiaXQgaW5lZmZpY2llbnQsIGNvdWxkIGJlIGZpeGVkLi4uKQotICAgICAgICovCi0gICAgICBpZiAoISAoKmNpbmZvLT5lbnRyb3B5LT5lbmNvZGVfbWN1KSAoY2luZm8sIGNvZWYtPk1DVV9idWZmZXIpKSB7Ci0JLyogU3VzcGVuc2lvbiBmb3JjZWQ7IHVwZGF0ZSBzdGF0ZSBjb3VudGVycyBhbmQgZXhpdCAqLwotCWNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IHlvZmZzZXQ7Ci0JY29lZi0+bWN1X2N0ciA9IE1DVV9jb2xfbnVtOwotCXJldHVybiBGQUxTRTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogQ29tcGxldGVkIGFuIE1DVSByb3csIGJ1dCBwZXJoYXBzIG5vdCBhbiBpTUNVIHJvdyAqLwotICAgIGNvZWYtPm1jdV9jdHIgPSAwOwotICB9Ci0gIC8qIENvbXBsZXRlZCB0aGUgaU1DVSByb3csIGFkdmFuY2UgY291bnRlcnMgZm9yIG5leHQgb25lICovCi0gIGNvZWYtPmlNQ1Vfcm93X251bSsrOwotICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7Ci0gIHJldHVybiBUUlVFOwotfQotCi0KLSNpZmRlZiBGVUxMX0NPRUZfQlVGRkVSX1NVUFBPUlRFRAotCi0vKgotICogUHJvY2VzcyBzb21lIGRhdGEgaW4gdGhlIGZpcnN0IHBhc3Mgb2YgYSBtdWx0aS1wYXNzIGNhc2UuCi0gKiBXZSBwcm9jZXNzIHRoZSBlcXVpdmFsZW50IG9mIG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KQotICogcGVyIGNhbGwsIGllLCB2X3NhbXBfZmFjdG9yIGJsb2NrIHJvd3MgZm9yIGVhY2ggY29tcG9uZW50IGluIHRoZSBpbWFnZS4KLSAqIFRoaXMgYW1vdW50IG9mIGRhdGEgaXMgcmVhZCBmcm9tIHRoZSBzb3VyY2UgYnVmZmVyLCBEQ1QnZCBhbmQgcXVhbnRpemVkLAotICogYW5kIHNhdmVkIGludG8gdGhlIHZpcnR1YWwgYXJyYXlzLiAgV2UgYWxzbyBnZW5lcmF0ZSBzdWl0YWJsZSBkdW1teSBibG9ja3MKLSAqIGFzIG5lZWRlZCBhdCB0aGUgcmlnaHQgYW5kIGxvd2VyIGVkZ2VzLiAgKFRoZSBkdW1teSBibG9ja3MgYXJlIGNvbnN0cnVjdGVkCi0gKiBpbiB0aGUgdmlydHVhbCBhcnJheXMsIHdoaWNoIGhhdmUgYmVlbiBwYWRkZWQgYXBwcm9wcmlhdGVseS4pICBUaGlzIG1ha2VzCi0gKiBpdCBwb3NzaWJsZSBmb3Igc3Vic2VxdWVudCBwYXNzZXMgbm90IHRvIHdvcnJ5IGFib3V0IHJlYWwgdnMuIGR1bW15IGJsb2Nrcy4KLSAqCi0gKiBXZSBtdXN0IGFsc28gZW1pdCB0aGUgZGF0YSB0byB0aGUgZW50cm9weSBlbmNvZGVyLiAgVGhpcyBpcyBjb252ZW5pZW50bHkKLSAqIGRvbmUgYnkgY2FsbGluZyBjb21wcmVzc19vdXRwdXQoKSBhZnRlciB3ZSd2ZSBsb2FkZWQgdGhlIGN1cnJlbnQgc3RyaXAKLSAqIG9mIHRoZSB2aXJ0dWFsIGFycmF5cy4KLSAqCi0gKiBOQjogaW5wdXRfYnVmIGNvbnRhaW5zIGEgcGxhbmUgZm9yIGVhY2ggY29tcG9uZW50IGluIGltYWdlLiAgQWxsCi0gKiBjb21wb25lbnRzIGFyZSBEQ1QnZCBhbmQgbG9hZGVkIGludG8gdGhlIHZpcnR1YWwgYXJyYXlzIGluIHRoaXMgcGFzcy4KLSAqIEhvd2V2ZXIsIGl0IG1heSBiZSB0aGF0IG9ubHkgYSBzdWJzZXQgb2YgdGhlIGNvbXBvbmVudHMgYXJlIGVtaXR0ZWQgdG8KLSAqIHRoZSBlbnRyb3B5IGVuY29kZXIgZHVyaW5nIHRoaXMgZmlyc3QgcGFzczsgYmUgY2FyZWZ1bCBhYm91dCBsb29raW5nCi0gKiBhdCB0aGUgc2Nhbi1kZXBlbmRlbnQgdmFyaWFibGVzIChNQ1UgZGltZW5zaW9ucywgZXRjKS4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWNvbXByZXNzX2ZpcnN0X3Bhc3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUElNQUdFIGlucHV0X2J1ZikKLXsKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0gIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOwotICBKRElNRU5TSU9OIGJsb2Nrc19hY3Jvc3MsIE1DVXNfYWNyb3NzLCBNQ1VpbmRleDsKLSAgaW50IGJpLCBjaSwgaF9zYW1wX2ZhY3RvciwgYmxvY2tfcm93LCBibG9ja19yb3dzLCBuZHVtbXk7Ci0gIEpDT0VGIGxhc3REQzsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgSkJMT0NLQVJSQVkgYnVmZmVyOwotICBKQkxPQ0tST1cgdGhpc2Jsb2Nrcm93LCBsYXN0YmxvY2tyb3c7Ci0KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXIgZm9yIHRoaXMgY29tcG9uZW50LiAqLwotICAgIGJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBjb2VmLT53aG9sZV9pbWFnZVtjaV0sCi0gICAgICAgY29lZi0+aU1DVV9yb3dfbnVtICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKLSAgICAgICAoSkRJTUVOU0lPTikgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwgVFJVRSk7Ci0gICAgLyogQ291bnQgbm9uLWR1bW15IERDVCBibG9jayByb3dzIGluIHRoaXMgaU1DVSByb3cuICovCi0gICAgaWYgKGNvZWYtPmlNQ1Vfcm93X251bSA8IGxhc3RfaU1DVV9yb3cpCi0gICAgICBibG9ja19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSAgICBlbHNlIHsKLSAgICAgIC8qIE5COiBjYW4ndCB1c2UgbGFzdF9yb3dfaGVpZ2h0IGhlcmUsIHNpbmNlIG1heSBub3QgYmUgc2V0ISAqLwotICAgICAgYmxvY2tfcm93cyA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7Ci0gICAgICBpZiAoYmxvY2tfcm93cyA9PSAwKSBibG9ja19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSAgICB9Ci0gICAgYmxvY2tzX2Fjcm9zcyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrczsKLSAgICBoX3NhbXBfZmFjdG9yID0gY29tcHB0ci0+aF9zYW1wX2ZhY3RvcjsKLSAgICAvKiBDb3VudCBudW1iZXIgb2YgZHVtbXkgYmxvY2tzIHRvIGJlIGFkZGVkIGF0IHRoZSByaWdodCBtYXJnaW4uICovCi0gICAgbmR1bW15ID0gKGludCkgKGJsb2Nrc19hY3Jvc3MgJSBoX3NhbXBfZmFjdG9yKTsKLSAgICBpZiAobmR1bW15ID4gMCkKLSAgICAgIG5kdW1teSA9IGhfc2FtcF9mYWN0b3IgLSBuZHVtbXk7Ci0gICAgLyogUGVyZm9ybSBEQ1QgZm9yIGFsbCBub24tZHVtbXkgYmxvY2tzIGluIHRoaXMgaU1DVSByb3cuICBFYWNoIGNhbGwKLSAgICAgKiBvbiBmb3J3YXJkX0RDVCBwcm9jZXNzZXMgYSBjb21wbGV0ZSBob3Jpem9udGFsIHJvdyBvZiBEQ1QgYmxvY2tzLgotICAgICAqLwotICAgIGZvciAoYmxvY2tfcm93ID0gMDsgYmxvY2tfcm93IDwgYmxvY2tfcm93czsgYmxvY2tfcm93KyspIHsKLSAgICAgIHRoaXNibG9ja3JvdyA9IGJ1ZmZlcltibG9ja19yb3ddOwotICAgICAgKCpjaW5mby0+ZmRjdC0+Zm9yd2FyZF9EQ1QpIChjaW5mbywgY29tcHB0ciwKLQkJCQkgICBpbnB1dF9idWZbY2ldLCB0aGlzYmxvY2tyb3csCi0JCQkJICAgKEpESU1FTlNJT04pIChibG9ja19yb3cgKiBEQ1RTSVpFKSwKLQkJCQkgICAoSkRJTUVOU0lPTikgMCwgYmxvY2tzX2Fjcm9zcyk7Ci0gICAgICBpZiAobmR1bW15ID4gMCkgewotCS8qIENyZWF0ZSBkdW1teSBibG9ja3MgYXQgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIGltYWdlLiAqLwotCXRoaXNibG9ja3JvdyArPSBibG9ja3NfYWNyb3NzOyAvKiA9PiBmaXJzdCBkdW1teSBibG9jayAqLwotCWp6ZXJvX2Zhcigodm9pZCBGQVIgKikgdGhpc2Jsb2Nrcm93LCBuZHVtbXkgKiBTSVpFT0YoSkJMT0NLKSk7Ci0JbGFzdERDID0gdGhpc2Jsb2Nrcm93Wy0xXVswXTsKLQlmb3IgKGJpID0gMDsgYmkgPCBuZHVtbXk7IGJpKyspIHsKLQkgIHRoaXNibG9ja3Jvd1tiaV1bMF0gPSBsYXN0REM7Ci0JfQotICAgICAgfQotICAgIH0KLSAgICAvKiBJZiBhdCBlbmQgb2YgaW1hZ2UsIGNyZWF0ZSBkdW1teSBibG9jayByb3dzIGFzIG5lZWRlZC4KLSAgICAgKiBUaGUgdHJpY2t5IHBhcnQgaGVyZSBpcyB0aGF0IHdpdGhpbiBlYWNoIE1DVSwgd2Ugd2FudCB0aGUgREMgdmFsdWVzCi0gICAgICogb2YgdGhlIGR1bW15IGJsb2NrcyB0byBtYXRjaCB0aGUgbGFzdCByZWFsIGJsb2NrJ3MgREMgdmFsdWUuCi0gICAgICogVGhpcyBzcXVlZXplcyBhIGZldyBtb3JlIGJ5dGVzIG91dCBvZiB0aGUgcmVzdWx0aW5nIGZpbGUuLi4KLSAgICAgKi8KLSAgICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtID09IGxhc3RfaU1DVV9yb3cpIHsKLSAgICAgIGJsb2Nrc19hY3Jvc3MgKz0gbmR1bW15OwkvKiBpbmNsdWRlIGxvd2VyIHJpZ2h0IGNvcm5lciAqLwotICAgICAgTUNVc19hY3Jvc3MgPSBibG9ja3NfYWNyb3NzIC8gaF9zYW1wX2ZhY3RvcjsKLSAgICAgIGZvciAoYmxvY2tfcm93ID0gYmxvY2tfcm93czsgYmxvY2tfcm93IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLQkgICBibG9ja19yb3crKykgewotCXRoaXNibG9ja3JvdyA9IGJ1ZmZlcltibG9ja19yb3ddOwotCWxhc3RibG9ja3JvdyA9IGJ1ZmZlcltibG9ja19yb3ctMV07Ci0Janplcm9fZmFyKCh2b2lkIEZBUiAqKSB0aGlzYmxvY2tyb3csCi0JCSAgKHNpemVfdCkgKGJsb2Nrc19hY3Jvc3MgKiBTSVpFT0YoSkJMT0NLKSkpOwotCWZvciAoTUNVaW5kZXggPSAwOyBNQ1VpbmRleCA8IE1DVXNfYWNyb3NzOyBNQ1VpbmRleCsrKSB7Ci0JICBsYXN0REMgPSBsYXN0YmxvY2tyb3dbaF9zYW1wX2ZhY3Rvci0xXVswXTsKLQkgIGZvciAoYmkgPSAwOyBiaSA8IGhfc2FtcF9mYWN0b3I7IGJpKyspIHsKLQkgICAgdGhpc2Jsb2Nrcm93W2JpXVswXSA9IGxhc3REQzsKLQkgIH0KLQkgIHRoaXNibG9ja3JvdyArPSBoX3NhbXBfZmFjdG9yOyAvKiBhZHZhbmNlIHRvIG5leHQgTUNVIGluIHJvdyAqLwotCSAgbGFzdGJsb2Nrcm93ICs9IGhfc2FtcF9mYWN0b3I7Ci0JfQotICAgICAgfQotICAgIH0KLSAgfQotICAvKiBOQjogY29tcHJlc3Nfb3V0cHV0IHdpbGwgaW5jcmVtZW50IGlNQ1Vfcm93X251bSBpZiBzdWNjZXNzZnVsLgotICAgKiBBIHN1c3BlbnNpb24gcmV0dXJuIHdpbGwgcmVzdWx0IGluIHJlZG9pbmcgYWxsIHRoZSB3b3JrIGFib3ZlIG5leHQgdGltZS4KLSAgICovCi0KLSAgLyogRW1pdCBkYXRhIHRvIHRoZSBlbnRyb3B5IGVuY29kZXIsIHNoYXJpbmcgY29kZSB3aXRoIHN1YnNlcXVlbnQgcGFzc2VzICovCi0gIHJldHVybiBjb21wcmVzc19vdXRwdXQoY2luZm8sIGlucHV0X2J1Zik7Ci19Ci0KLQotLyoKLSAqIFByb2Nlc3Mgc29tZSBkYXRhIGluIHN1YnNlcXVlbnQgcGFzc2VzIG9mIGEgbXVsdGktcGFzcyBjYXNlLgotICogV2UgcHJvY2VzcyB0aGUgZXF1aXZhbGVudCBvZiBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykKLSAqIHBlciBjYWxsLCBpZSwgdl9zYW1wX2ZhY3RvciBibG9jayByb3dzIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgc2Nhbi4KLSAqIFRoZSBkYXRhIGlzIG9idGFpbmVkIGZyb20gdGhlIHZpcnR1YWwgYXJyYXlzIGFuZCBmZWQgdG8gdGhlIGVudHJvcHkgY29kZXIuCi0gKiBSZXR1cm5zIFRSVUUgaWYgdGhlIGlNQ1Ugcm93IGlzIGNvbXBsZXRlZCwgRkFMU0UgaWYgc3VzcGVuZGVkLgotICoKLSAqIE5COiBpbnB1dF9idWYgaXMgaWdub3JlZDsgaXQgaXMgbGlrZWx5IHRvIGJlIGEgTlVMTCBwb2ludGVyLgotICovCi0KLU1FVEhPRERFRihib29sZWFuKQotY29tcHJlc3Nfb3V0cHV0IChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCi0gIGludCBibGtuLCBjaSwgeGluZGV4LCB5aW5kZXgsIHlvZmZzZXQ7Ci0gIEpESU1FTlNJT04gc3RhcnRfY29sOwotICBKQkxPQ0tBUlJBWSBidWZmZXJbTUFYX0NPTVBTX0lOX1NDQU5dOwotICBKQkxPQ0tST1cgYnVmZmVyX3B0cjsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXJzIGZvciB0aGUgY29tcG9uZW50cyB1c2VkIGluIHRoaXMgc2Nhbi4KLSAgICogTkI6IGR1cmluZyBmaXJzdCBwYXNzLCB0aGlzIGlzIHNhZmUgb25seSBiZWNhdXNlIHRoZSBidWZmZXJzIHdpbGwKLSAgICogYWxyZWFkeSBiZSBhbGlnbmVkIHByb3Blcmx5LCBzbyBqbWVtbWdyLmMgd29uJ3QgbmVlZCB0byBkbyBhbnkgSS9PLgotICAgKi8KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIGJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKLSAgICAgICBjb2VmLT5pTUNVX3Jvd19udW0gKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAotICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7Ci0gIH0KLQotICAvKiBMb29wIHRvIHByb2Nlc3Mgb25lIHdob2xlIGlNQ1Ugcm93ICovCi0gIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKLSAgICAgICB5b2Zmc2V0KyspIHsKLSAgICBmb3IgKE1DVV9jb2xfbnVtID0gY29lZi0+bWN1X2N0cjsgTUNVX2NvbF9udW0gPCBjaW5mby0+TUNVc19wZXJfcm93OwotCSBNQ1VfY29sX251bSsrKSB7Ci0gICAgICAvKiBDb25zdHJ1Y3QgbGlzdCBvZiBwb2ludGVycyB0byBEQ1QgYmxvY2tzIGJlbG9uZ2luZyB0byB0aGlzIE1DVSAqLwotICAgICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLwotICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLQljb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotCXN0YXJ0X2NvbCA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3dpZHRoOwotCWZvciAoeWluZGV4ID0gMDsgeWluZGV4IDwgY29tcHB0ci0+TUNVX2hlaWdodDsgeWluZGV4KyspIHsKLQkgIGJ1ZmZlcl9wdHIgPSBidWZmZXJbY2ldW3lpbmRleCt5b2Zmc2V0XSArIHN0YXJ0X2NvbDsKLQkgIGZvciAoeGluZGV4ID0gMDsgeGluZGV4IDwgY29tcHB0ci0+TUNVX3dpZHRoOyB4aW5kZXgrKykgewotCSAgICBjb2VmLT5NQ1VfYnVmZmVyW2Jsa24rK10gPSBidWZmZXJfcHRyKys7Ci0JICB9Ci0JfQotICAgICAgfQotICAgICAgLyogVHJ5IHRvIHdyaXRlIHRoZSBNQ1UuICovCi0gICAgICBpZiAoISAoKmNpbmZvLT5lbnRyb3B5LT5lbmNvZGVfbWN1KSAoY2luZm8sIGNvZWYtPk1DVV9idWZmZXIpKSB7Ci0JLyogU3VzcGVuc2lvbiBmb3JjZWQ7IHVwZGF0ZSBzdGF0ZSBjb3VudGVycyBhbmQgZXhpdCAqLwotCWNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IHlvZmZzZXQ7Ci0JY29lZi0+bWN1X2N0ciA9IE1DVV9jb2xfbnVtOwotCXJldHVybiBGQUxTRTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogQ29tcGxldGVkIGFuIE1DVSByb3csIGJ1dCBwZXJoYXBzIG5vdCBhbiBpTUNVIHJvdyAqLwotICAgIGNvZWYtPm1jdV9jdHIgPSAwOwotICB9Ci0gIC8qIENvbXBsZXRlZCB0aGUgaU1DVSByb3csIGFkdmFuY2UgY291bnRlcnMgZm9yIG5leHQgb25lICovCi0gIGNvZWYtPmlNQ1Vfcm93X251bSsrOwotICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7Ci0gIHJldHVybiBUUlVFOwotfQotCi0jZW5kaWYgLyogRlVMTF9DT0VGX0JVRkZFUl9TVVBQT1JURUQgKi8KLQotCi0vKgotICogSW5pdGlhbGl6ZSBjb2VmZmljaWVudCBidWZmZXIgY29udHJvbGxlci4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2NfY29lZl9jb250cm9sbGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQotewotICBteV9jb2VmX3B0ciBjb2VmOwotCi0gIGNvZWYgPSAobXlfY29lZl9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfY29lZl9jb250cm9sbGVyKSk7Ci0gIGNpbmZvLT5jb2VmID0gKHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyICopIGNvZWY7Ci0gIGNvZWYtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19jb2VmOwotCi0gIC8qIENyZWF0ZSB0aGUgY29lZmZpY2llbnQgYnVmZmVyLiAqLwotICBpZiAobmVlZF9mdWxsX2J1ZmZlcikgewotI2lmZGVmIEZVTExfQ09FRl9CVUZGRVJfU1VQUE9SVEVECi0gICAgLyogQWxsb2NhdGUgYSBmdWxsLWltYWdlIHZpcnR1YWwgYXJyYXkgZm9yIGVhY2ggY29tcG9uZW50LCAqLwotICAgIC8qIHBhZGRlZCB0byBhIG11bHRpcGxlIG9mIHNhbXBfZmFjdG9yIERDVCBibG9ja3MgaW4gZWFjaCBkaXJlY3Rpb24uICovCi0gICAgaW50IGNpOwotICAgIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotCSBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAgIGNvZWYtPndob2xlX2ltYWdlW2NpXSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X2JhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKLQkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzLAotCQkJCShsb25nKSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSwKLQkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcywKLQkJCQkobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciksCi0JIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKLSAgICB9Ci0jZWxzZQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLSNlbmRpZgotICB9IGVsc2UgewotICAgIC8qIFdlIG9ubHkgbmVlZCBhIHNpbmdsZS1NQ1UgYnVmZmVyLiAqLwotICAgIEpCTE9DS1JPVyBidWZmZXI7Ci0gICAgaW50IGk7Ci0KLSAgICBidWZmZXIgPSAoSkJMT0NLUk9XKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIENfTUFYX0JMT0NLU19JTl9NQ1UgKiBTSVpFT0YoSkJMT0NLKSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IENfTUFYX0JMT0NLU19JTl9NQ1U7IGkrKykgewotICAgICAgY29lZi0+TUNVX2J1ZmZlcltpXSA9IGJ1ZmZlciArIGk7Ci0gICAgfQotICAgIGNvZWYtPndob2xlX2ltYWdlWzBdID0gTlVMTDsgLyogZmxhZyBmb3Igbm8gdmlydHVhbCBhcnJheXMgKi8KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjY29sb3IuYyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY2NvbG9yLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOGE0YjUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjY29sb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi0vKgotICogamNjb2xvci5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgaW5wdXQgY29sb3JzcGFjZSBjb252ZXJzaW9uIHJvdXRpbmVzLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBQcml2YXRlIHN1Ym9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2NvbG9yX2NvbnZlcnRlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBQcml2YXRlIHN0YXRlIGZvciBSR0ItPllDQyBjb252ZXJzaW9uICovCi0gIElOVDMyICogcmdiX3ljY190YWI7CQkvKiA9PiB0YWJsZSBmb3IgUkdCIHRvIFlDYkNyIGNvbnZlcnNpb24gKi8KLX0gbXlfY29sb3JfY29udmVydGVyOwotCi10eXBlZGVmIG15X2NvbG9yX2NvbnZlcnRlciAqIG15X2Njb252ZXJ0X3B0cjsKLQotCi0vKioqKioqKioqKioqKioqKiBSR0IgLT4gWUNiQ3IgY29udmVyc2lvbjogbW9zdCBjb21tb24gY2FzZSAqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFlDYkNyIGlzIGRlZmluZWQgcGVyIENDSVIgNjAxLTEsIGV4Y2VwdCB0aGF0IENiIGFuZCBDciBhcmUKLSAqIG5vcm1hbGl6ZWQgdG8gdGhlIHJhbmdlIDAuLk1BWEpTQU1QTEUgcmF0aGVyIHRoYW4gLTAuNSAuLiAwLjUuCi0gKiBUaGUgY29udmVyc2lvbiBlcXVhdGlvbnMgdG8gYmUgaW1wbGVtZW50ZWQgYXJlIHRoZXJlZm9yZQotICoJWSAgPSAgMC4yOTkwMCAqIFIgKyAwLjU4NzAwICogRyArIDAuMTE0MDAgKiBCCi0gKglDYiA9IC0wLjE2ODc0ICogUiAtIDAuMzMxMjYgKiBHICsgMC41MDAwMCAqIEIgICsgQ0VOVEVSSlNBTVBMRQotICoJQ3IgPSAgMC41MDAwMCAqIFIgLSAwLjQxODY5ICogRyAtIDAuMDgxMzEgKiBCICArIENFTlRFUkpTQU1QTEUKLSAqIChUaGVzZSBudW1iZXJzIGFyZSBkZXJpdmVkIGZyb20gVElGRiA2LjAgc2VjdGlvbiAyMSwgZGF0ZWQgMy1KdW5lLTkyLikKLSAqIE5vdGU6IG9sZGVyIHZlcnNpb25zIG9mIHRoZSBJSkcgY29kZSB1c2VkIGEgemVybyBvZmZzZXQgb2YgTUFYSlNBTVBMRS8yLAotICogcmF0aGVyIHRoYW4gQ0VOVEVSSlNBTVBMRSwgZm9yIENiIGFuZCBDci4gIFRoaXMgZ2F2ZSBlcXVhbCBwb3NpdGl2ZSBhbmQKLSAqIG5lZ2F0aXZlIHN3aW5ncyBmb3IgQ2IvQ3IsIGJ1dCBtZWFudCB0aGF0IGdyYXlzY2FsZSB2YWx1ZXMgKENiPUNyPTApCi0gKiB3ZXJlIG5vdCByZXByZXNlbnRlZCBleGFjdGx5LiAgTm93IHdlIHNhY3JpZmljZSBleGFjdCByZXByZXNlbnRhdGlvbiBvZgotICogbWF4aW11bSByZWQgYW5kIG1heGltdW0gYmx1ZSBpbiBvcmRlciB0byBnZXQgZXhhY3QgZ3JheXNjYWxlcy4KLSAqCi0gKiBUbyBhdm9pZCBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljLCB3ZSByZXByZXNlbnQgdGhlIGZyYWN0aW9uYWwgY29uc3RhbnRzCi0gKiBhcyBpbnRlZ2VycyBzY2FsZWQgdXAgYnkgMl4xNiAoYWJvdXQgNCBkaWdpdHMgcHJlY2lzaW9uKTsgd2UgaGF2ZSB0byBkaXZpZGUKLSAqIHRoZSBwcm9kdWN0cyBieSAyXjE2LCB3aXRoIGFwcHJvcHJpYXRlIHJvdW5kaW5nLCB0byBnZXQgdGhlIGNvcnJlY3QgYW5zd2VyLgotICoKLSAqIEZvciBldmVuIG1vcmUgc3BlZWQsIHdlIGF2b2lkIGRvaW5nIGFueSBtdWx0aXBsaWNhdGlvbnMgaW4gdGhlIGlubmVyIGxvb3AKLSAqIGJ5IHByZWNhbGN1bGF0aW5nIHRoZSBjb25zdGFudHMgdGltZXMgUixHLEIgZm9yIGFsbCBwb3NzaWJsZSB2YWx1ZXMuCi0gKiBGb3IgOC1iaXQgSlNBTVBMRXMgdGhpcyBpcyB2ZXJ5IHJlYXNvbmFibGUgKG9ubHkgMjU2IGVudHJpZXMgcGVyIHRhYmxlKTsKLSAqIGZvciAxMi1iaXQgc2FtcGxlcyBpdCBpcyBzdGlsbCBhY2NlcHRhYmxlLiAgSXQncyBub3QgdmVyeSByZWFzb25hYmxlIGZvcgotICogMTYtYml0IHNhbXBsZXMsIGJ1dCBpZiB5b3Ugd2FudCBsb3NzbGVzcyBzdG9yYWdlIHlvdSBzaG91bGRuJ3QgYmUgY2hhbmdpbmcKLSAqIGNvbG9yc3BhY2UgYW55d2F5LgotICogVGhlIENFTlRFUkpTQU1QTEUgb2Zmc2V0cyBhbmQgdGhlIHJvdW5kaW5nIGZ1ZGdlLWZhY3RvciBvZiAwLjUgYXJlIGluY2x1ZGVkCi0gKiBpbiB0aGUgdGFibGVzIHRvIHNhdmUgYWRkaW5nIHRoZW0gc2VwYXJhdGVseSBpbiB0aGUgaW5uZXIgbG9vcC4KLSAqLwotCi0jZGVmaW5lIFNDQUxFQklUUwkxNgkvKiBzcGVlZGllc3QgcmlnaHQtc2hpZnQgb24gc29tZSBtYWNoaW5lcyAqLwotI2RlZmluZSBDQkNSX09GRlNFVAkoKElOVDMyKSBDRU5URVJKU0FNUExFIDw8IFNDQUxFQklUUykKLSNkZWZpbmUgT05FX0hBTEYJKChJTlQzMikgMSA8PCAoU0NBTEVCSVRTLTEpKQotI2RlZmluZSBGSVgoeCkJCSgoSU5UMzIpICgoeCkgKiAoMUw8PFNDQUxFQklUUykgKyAwLjUpKQotCi0vKiBXZSBhbGxvY2F0ZSBvbmUgYmlnIHRhYmxlIGFuZCBkaXZpZGUgaXQgdXAgaW50byBlaWdodCBwYXJ0cywgaW5zdGVhZCBvZgotICogZG9pbmcgZWlnaHQgYWxsb2Nfc21hbGwgcmVxdWVzdHMuICBUaGlzIGxldHMgdXMgdXNlIGEgc2luZ2xlIHRhYmxlIGJhc2UKLSAqIGFkZHJlc3MsIHdoaWNoIGNhbiBiZSBoZWxkIGluIGEgcmVnaXN0ZXIgaW4gdGhlIGlubmVyIGxvb3BzIG9uIG1hbnkKLSAqIG1hY2hpbmVzIChtb3JlIHRoYW4gY2FuIGhvbGQgYWxsIGVpZ2h0IGFkZHJlc3NlcywgYW55d2F5KS4KLSAqLwotCi0jZGVmaW5lIFJfWV9PRkYJCTAJCQkvKiBvZmZzZXQgdG8gUiA9PiBZIHNlY3Rpb24gKi8KLSNkZWZpbmUgR19ZX09GRgkJKDEqKE1BWEpTQU1QTEUrMSkpCS8qIG9mZnNldCB0byBHID0+IFkgc2VjdGlvbiAqLwotI2RlZmluZSBCX1lfT0ZGCQkoMiooTUFYSlNBTVBMRSsxKSkJLyogZXRjLiAqLwotI2RlZmluZSBSX0NCX09GRgkoMyooTUFYSlNBTVBMRSsxKSkKLSNkZWZpbmUgR19DQl9PRkYJKDQqKE1BWEpTQU1QTEUrMSkpCi0jZGVmaW5lIEJfQ0JfT0ZGCSg1KihNQVhKU0FNUExFKzEpKQotI2RlZmluZSBSX0NSX09GRglCX0NCX09GRgkJLyogQj0+Q2IsIFI9PkNyIGFyZSB0aGUgc2FtZSAqLwotI2RlZmluZSBHX0NSX09GRgkoNiooTUFYSlNBTVBMRSsxKSkKLSNkZWZpbmUgQl9DUl9PRkYJKDcqKE1BWEpTQU1QTEUrMSkpCi0jZGVmaW5lIFRBQkxFX1NJWkUJKDgqKE1BWEpTQU1QTEUrMSkpCi0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIFJHQi0+WUNDIGNvbG9yc3BhY2UgY29udmVyc2lvbi4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXJnYl95Y2Nfc3RhcnQgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9jY29udmVydF9wdHIgY2NvbnZlcnQgPSAobXlfY2NvbnZlcnRfcHRyKSBjaW5mby0+Y2NvbnZlcnQ7Ci0gIElOVDMyICogcmdiX3ljY190YWI7Ci0gIElOVDMyIGk7Ci0KLSAgLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gdGhlIGNvbnZlcnNpb24gdGFibGVzLiAqLwotICBjY29udmVydC0+cmdiX3ljY190YWIgPSByZ2JfeWNjX3RhYiA9IChJTlQzMiAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJKFRBQkxFX1NJWkUgKiBTSVpFT0YoSU5UMzIpKSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8PSBNQVhKU0FNUExFOyBpKyspIHsKLSAgICByZ2JfeWNjX3RhYltpK1JfWV9PRkZdID0gRklYKDAuMjk5MDApICogaTsKLSAgICByZ2JfeWNjX3RhYltpK0dfWV9PRkZdID0gRklYKDAuNTg3MDApICogaTsKLSAgICByZ2JfeWNjX3RhYltpK0JfWV9PRkZdID0gRklYKDAuMTE0MDApICogaSAgICAgKyBPTkVfSEFMRjsKLSAgICByZ2JfeWNjX3RhYltpK1JfQ0JfT0ZGXSA9ICgtRklYKDAuMTY4NzQpKSAqIGk7Ci0gICAgcmdiX3ljY190YWJbaStHX0NCX09GRl0gPSAoLUZJWCgwLjMzMTI2KSkgKiBpOwotICAgIC8qIFdlIHVzZSBhIHJvdW5kaW5nIGZ1ZGdlLWZhY3RvciBvZiAwLjUtZXBzaWxvbiBmb3IgQ2IgYW5kIENyLgotICAgICAqIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBtYXhpbXVtIG91dHB1dCB3aWxsIHJvdW5kIHRvIE1BWEpTQU1QTEUKLSAgICAgKiBub3QgTUFYSlNBTVBMRSsxLCBhbmQgdGh1cyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gcmFuZ2UtbGltaXQuCi0gICAgICovCi0gICAgcmdiX3ljY190YWJbaStCX0NCX09GRl0gPSBGSVgoMC41MDAwMCkgKiBpICAgICsgQ0JDUl9PRkZTRVQgKyBPTkVfSEFMRi0xOwotLyogIEI9PkNiIGFuZCBSPT5DciB0YWJsZXMgYXJlIHRoZSBzYW1lCi0gICAgcmdiX3ljY190YWJbaStSX0NSX09GRl0gPSBGSVgoMC41MDAwMCkgKiBpICAgICsgQ0JDUl9PRkZTRVQgKyBPTkVfSEFMRi0xOwotKi8KLSAgICByZ2JfeWNjX3RhYltpK0dfQ1JfT0ZGXSA9ICgtRklYKDAuNDE4NjkpKSAqIGk7Ci0gICAgcmdiX3ljY190YWJbaStCX0NSX09GRl0gPSAoLUZJWCgwLjA4MTMxKSkgKiBpOwotICB9Ci19Ci0KLQotLyoKLSAqIENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIEpQRUcgY29sb3JzcGFjZS4KLSAqCi0gKiBOb3RlIHRoYXQgd2UgY2hhbmdlIGZyb20gdGhlIGFwcGxpY2F0aW9uJ3MgaW50ZXJsZWF2ZWQtcGl4ZWwgZm9ybWF0Ci0gKiB0byBvdXIgaW50ZXJuYWwgbm9uaW50ZXJsZWF2ZWQsIG9uZS1wbGFuZS1wZXItY29tcG9uZW50IGZvcm1hdC4KLSAqIFRoZSBpbnB1dCBidWZmZXIgaXMgdGhlcmVmb3JlIHRocmVlIHRpbWVzIGFzIHdpZGUgYXMgdGhlIG91dHB1dCBidWZmZXIuCi0gKgotICogQSBzdGFydGluZyByb3cgb2Zmc2V0IGlzIHByb3ZpZGVkIG9ubHkgZm9yIHRoZSBvdXRwdXQgYnVmZmVyLiAgVGhlIGNhbGxlcgotICogY2FuIGVhc2lseSBhZGp1c3QgdGhlIHBhc3NlZCBpbnB1dF9idWYgdmFsdWUgdG8gYWNjb21tb2RhdGUgYW55IHJvdwotICogb2Zmc2V0IHJlcXVpcmVkIG9uIHRoYXQgc2lkZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXJnYl95Y2NfY29udmVydCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCSBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAotCQkgSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpCi17Ci0gIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKLSAgcmVnaXN0ZXIgaW50IHIsIGcsIGI7Ci0gIHJlZ2lzdGVyIElOVDMyICogY3RhYiA9IGNjb252ZXJ0LT5yZ2JfeWNjX3RhYjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjAsIG91dHB0cjEsIG91dHB0cjI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPmltYWdlX3dpZHRoOwotCi0gIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKLSAgICBpbnB0ciA9ICppbnB1dF9idWYrKzsKLSAgICBvdXRwdHIwID0gb3V0cHV0X2J1ZlswXVtvdXRwdXRfcm93XTsKLSAgICBvdXRwdHIxID0gb3V0cHV0X2J1ZlsxXVtvdXRwdXRfcm93XTsKLSAgICBvdXRwdHIyID0gb3V0cHV0X2J1ZlsyXVtvdXRwdXRfcm93XTsKLSAgICBvdXRwdXRfcm93Kys7Ci0gICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKLSAgICAgIHIgPSBHRVRKU0FNUExFKGlucHRyW1JHQl9SRURdKTsKLSAgICAgIGcgPSBHRVRKU0FNUExFKGlucHRyW1JHQl9HUkVFTl0pOwotICAgICAgYiA9IEdFVEpTQU1QTEUoaW5wdHJbUkdCX0JMVUVdKTsKLSAgICAgIGlucHRyICs9IFJHQl9QSVhFTFNJWkU7Ci0gICAgICAvKiBJZiB0aGUgaW5wdXRzIGFyZSAwLi5NQVhKU0FNUExFLCB0aGUgb3V0cHV0cyBvZiB0aGVzZSBlcXVhdGlvbnMKLSAgICAgICAqIG11c3QgYmUgdG9vOyB3ZSBkbyBub3QgbmVlZCBhbiBleHBsaWNpdCByYW5nZS1saW1pdGluZyBvcGVyYXRpb24uCi0gICAgICAgKiBIZW5jZSB0aGUgdmFsdWUgYmVpbmcgc2hpZnRlZCBpcyBuZXZlciBuZWdhdGl2ZSwgYW5kIHdlIGRvbid0Ci0gICAgICAgKiBuZWVkIHRoZSBnZW5lcmFsIFJJR0hUX1NISUZUIG1hY3JvLgotICAgICAgICovCi0gICAgICAvKiBZICovCi0gICAgICBvdXRwdHIwW2NvbF0gPSAoSlNBTVBMRSkKLQkJKChjdGFiW3IrUl9ZX09GRl0gKyBjdGFiW2crR19ZX09GRl0gKyBjdGFiW2IrQl9ZX09GRl0pCi0JCSA+PiBTQ0FMRUJJVFMpOwotICAgICAgLyogQ2IgKi8KLSAgICAgIG91dHB0cjFbY29sXSA9IChKU0FNUExFKQotCQkoKGN0YWJbcitSX0NCX09GRl0gKyBjdGFiW2crR19DQl9PRkZdICsgY3RhYltiK0JfQ0JfT0ZGXSkKLQkJID4+IFNDQUxFQklUUyk7Ci0gICAgICAvKiBDciAqLwotICAgICAgb3V0cHRyMltjb2xdID0gKEpTQU1QTEUpCi0JCSgoY3RhYltyK1JfQ1JfT0ZGXSArIGN0YWJbZytHX0NSX09GRl0gKyBjdGFiW2IrQl9DUl9PRkZdKQotCQkgPj4gU0NBTEVCSVRTKTsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKiBDYXNlcyBvdGhlciB0aGFuIFJHQiAtPiBZQ2JDciAqKioqKioqKioqKioqKi8KLQotCi0vKgotICogQ29udmVydCBzb21lIHJvd3Mgb2Ygc2FtcGxlcyB0byB0aGUgSlBFRyBjb2xvcnNwYWNlLgotICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgUkdCLT5ncmF5c2NhbGUgY29udmVyc2lvbiwgd2hpY2ggaXMgdGhlIHNhbWUKLSAqIGFzIHRoZSBSR0ItPlkgcG9ydGlvbiBvZiBSR0ItPllDYkNyLgotICogV2UgYXNzdW1lIHJnYl95Y2Nfc3RhcnQgaGFzIGJlZW4gY2FsbGVkICh3ZSBvbmx5IHVzZSB0aGUgWSB0YWJsZXMpLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcmdiX2dyYXlfY29udmVydCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCSAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKLQkJICBKRElNRU5TSU9OIG91dHB1dF9yb3csIGludCBudW1fcm93cykKLXsKLSAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OwotICByZWdpc3RlciBpbnQgciwgZywgYjsKLSAgcmVnaXN0ZXIgSU5UMzIgKiBjdGFiID0gY2NvbnZlcnQtPnJnYl95Y2NfdGFiOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5pbWFnZV93aWR0aDsKLQotICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7Ci0gICAgaW5wdHIgPSAqaW5wdXRfYnVmKys7Ci0gICAgb3V0cHRyID0gb3V0cHV0X2J1ZlswXVtvdXRwdXRfcm93XTsKLSAgICBvdXRwdXRfcm93Kys7Ci0gICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKLSAgICAgIHIgPSBHRVRKU0FNUExFKGlucHRyW1JHQl9SRURdKTsKLSAgICAgIGcgPSBHRVRKU0FNUExFKGlucHRyW1JHQl9HUkVFTl0pOwotICAgICAgYiA9IEdFVEpTQU1QTEUoaW5wdHJbUkdCX0JMVUVdKTsKLSAgICAgIGlucHRyICs9IFJHQl9QSVhFTFNJWkU7Ci0gICAgICAvKiBZICovCi0gICAgICBvdXRwdHJbY29sXSA9IChKU0FNUExFKQotCQkoKGN0YWJbcitSX1lfT0ZGXSArIGN0YWJbZytHX1lfT0ZGXSArIGN0YWJbYitCX1lfT0ZGXSkKLQkJID4+IFNDQUxFQklUUyk7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIEpQRUcgY29sb3JzcGFjZS4KLSAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIEFkb2JlLXN0eWxlIENNWUstPllDQ0sgY29udmVyc2lvbiwKLSAqIHdoZXJlIHdlIGNvbnZlcnQgUj0xLUMsIEc9MS1NLCBhbmQgQj0xLVkgdG8gWUNiQ3IgdXNpbmcgdGhlIHNhbWUKLSAqIGNvbnZlcnNpb24gYXMgYWJvdmUsIHdoaWxlIHBhc3NpbmcgSyAoYmxhY2spIHVuY2hhbmdlZC4KLSAqIFdlIGFzc3VtZSByZ2JfeWNjX3N0YXJ0IGhhcyBiZWVuIGNhbGxlZC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWNteWtfeWNja19jb252ZXJ0IChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJICAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwKLQkJICAgSkRJTUVOU0lPTiBvdXRwdXRfcm93LCBpbnQgbnVtX3Jvd3MpCi17Ci0gIG15X2Njb252ZXJ0X3B0ciBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpIGNpbmZvLT5jY29udmVydDsKLSAgcmVnaXN0ZXIgaW50IHIsIGcsIGI7Ci0gIHJlZ2lzdGVyIElOVDMyICogY3RhYiA9IGNjb252ZXJ0LT5yZ2JfeWNjX3RhYjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIG91dHB0cjAsIG91dHB0cjEsIG91dHB0cjIsIG91dHB0cjM7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPmltYWdlX3dpZHRoOwotCi0gIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKLSAgICBpbnB0ciA9ICppbnB1dF9idWYrKzsKLSAgICBvdXRwdHIwID0gb3V0cHV0X2J1ZlswXVtvdXRwdXRfcm93XTsKLSAgICBvdXRwdHIxID0gb3V0cHV0X2J1ZlsxXVtvdXRwdXRfcm93XTsKLSAgICBvdXRwdHIyID0gb3V0cHV0X2J1ZlsyXVtvdXRwdXRfcm93XTsKLSAgICBvdXRwdHIzID0gb3V0cHV0X2J1ZlszXVtvdXRwdXRfcm93XTsKLSAgICBvdXRwdXRfcm93Kys7Ci0gICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKLSAgICAgIHIgPSBNQVhKU0FNUExFIC0gR0VUSlNBTVBMRShpbnB0clswXSk7Ci0gICAgICBnID0gTUFYSlNBTVBMRSAtIEdFVEpTQU1QTEUoaW5wdHJbMV0pOwotICAgICAgYiA9IE1BWEpTQU1QTEUgLSBHRVRKU0FNUExFKGlucHRyWzJdKTsKLSAgICAgIC8qIEsgcGFzc2VzIHRocm91Z2ggYXMtaXMgKi8KLSAgICAgIG91dHB0cjNbY29sXSA9IGlucHRyWzNdOwkvKiBkb24ndCBuZWVkIEdFVEpTQU1QTEUgaGVyZSAqLwotICAgICAgaW5wdHIgKz0gNDsKLSAgICAgIC8qIElmIHRoZSBpbnB1dHMgYXJlIDAuLk1BWEpTQU1QTEUsIHRoZSBvdXRwdXRzIG9mIHRoZXNlIGVxdWF0aW9ucwotICAgICAgICogbXVzdCBiZSB0b287IHdlIGRvIG5vdCBuZWVkIGFuIGV4cGxpY2l0IHJhbmdlLWxpbWl0aW5nIG9wZXJhdGlvbi4KLSAgICAgICAqIEhlbmNlIHRoZSB2YWx1ZSBiZWluZyBzaGlmdGVkIGlzIG5ldmVyIG5lZ2F0aXZlLCBhbmQgd2UgZG9uJ3QKLSAgICAgICAqIG5lZWQgdGhlIGdlbmVyYWwgUklHSFRfU0hJRlQgbWFjcm8uCi0gICAgICAgKi8KLSAgICAgIC8qIFkgKi8KLSAgICAgIG91dHB0cjBbY29sXSA9IChKU0FNUExFKQotCQkoKGN0YWJbcitSX1lfT0ZGXSArIGN0YWJbZytHX1lfT0ZGXSArIGN0YWJbYitCX1lfT0ZGXSkKLQkJID4+IFNDQUxFQklUUyk7Ci0gICAgICAvKiBDYiAqLwotICAgICAgb3V0cHRyMVtjb2xdID0gKEpTQU1QTEUpCi0JCSgoY3RhYltyK1JfQ0JfT0ZGXSArIGN0YWJbZytHX0NCX09GRl0gKyBjdGFiW2IrQl9DQl9PRkZdKQotCQkgPj4gU0NBTEVCSVRTKTsKLSAgICAgIC8qIENyICovCi0gICAgICBvdXRwdHIyW2NvbF0gPSAoSlNBTVBMRSkKLQkJKChjdGFiW3IrUl9DUl9PRkZdICsgY3RhYltnK0dfQ1JfT0ZGXSArIGN0YWJbYitCX0NSX09GRl0pCi0JCSA+PiBTQ0FMRUJJVFMpOwotICAgIH0KLSAgfQotfQotCi0KLS8qCi0gKiBDb252ZXJ0IHNvbWUgcm93cyBvZiBzYW1wbGVzIHRvIHRoZSBKUEVHIGNvbG9yc3BhY2UuCi0gKiBUaGlzIHZlcnNpb24gaGFuZGxlcyBncmF5c2NhbGUgb3V0cHV0IHdpdGggbm8gY29udmVyc2lvbi4KLSAqIFRoZSBzb3VyY2UgY2FuIGJlIGVpdGhlciBwbGFpbiBncmF5c2NhbGUgb3IgWUNiQ3IgKHNpbmNlIFkgPT0gZ3JheSkuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1ncmF5c2NhbGVfY29udmVydCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCSAgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUElNQUdFIG91dHB1dF9idWYsCi0JCSAgIEpESU1FTlNJT04gb3V0cHV0X3JvdywgaW50IG51bV9yb3dzKQotewotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5pbWFnZV93aWR0aDsKLSAgaW50IGluc3RyaWRlID0gY2luZm8tPmlucHV0X2NvbXBvbmVudHM7Ci0KLSAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgewotICAgIGlucHRyID0gKmlucHV0X2J1ZisrOwotICAgIG91dHB0ciA9IG91dHB1dF9idWZbMF1bb3V0cHV0X3Jvd107Ci0gICAgb3V0cHV0X3JvdysrOwotICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7Ci0gICAgICBvdXRwdHJbY29sXSA9IGlucHRyWzBdOwkvKiBkb24ndCBuZWVkIEdFVEpTQU1QTEUoKSBoZXJlICovCi0gICAgICBpbnB0ciArPSBpbnN0cmlkZTsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogQ29udmVydCBzb21lIHJvd3Mgb2Ygc2FtcGxlcyB0byB0aGUgSlBFRyBjb2xvcnNwYWNlLgotICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgbXVsdGktY29tcG9uZW50IGNvbG9yc3BhY2VzIHdpdGhvdXQgY29udmVyc2lvbi4KLSAqIFdlIGFzc3VtZSBpbnB1dF9jb21wb25lbnRzID09IG51bV9jb21wb25lbnRzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotbnVsbF9jb252ZXJ0IChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkgICAgICBKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAotCSAgICAgIEpESU1FTlNJT04gb3V0cHV0X3JvdywgaW50IG51bV9yb3dzKQotewotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgcmVnaXN0ZXIgaW50IGNpOwotICBpbnQgbmMgPSBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+aW1hZ2Vfd2lkdGg7Ci0KLSAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgewotICAgIC8qIEl0IHNlZW1zIGZhc3Rlc3QgdG8gbWFrZSBhIHNlcGFyYXRlIHBhc3MgZm9yIGVhY2ggY29tcG9uZW50LiAqLwotICAgIGZvciAoY2kgPSAwOyBjaSA8IG5jOyBjaSsrKSB7Ci0gICAgICBpbnB0ciA9ICppbnB1dF9idWY7Ci0gICAgICBvdXRwdHIgPSBvdXRwdXRfYnVmW2NpXVtvdXRwdXRfcm93XTsKLSAgICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7Ci0Jb3V0cHRyW2NvbF0gPSBpbnB0cltjaV07IC8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KLQlpbnB0ciArPSBuYzsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW5wdXRfYnVmKys7Ci0gICAgb3V0cHV0X3JvdysrOwotICB9Ci19Ci0KLQotLyoKLSAqIEVtcHR5IG1ldGhvZCBmb3Igc3RhcnRfcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLW51bGxfbWV0aG9kIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgLyogbm8gd29yayBuZWVkZWQgKi8KLX0KLQotCi0vKgotICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIGlucHV0IGNvbG9yc3BhY2UgY29udmVyc2lvbi4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2NvbG9yX2NvbnZlcnRlciAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2Njb252ZXJ0X3B0ciBjY29udmVydDsKLQotICBjY29udmVydCA9IChteV9jY29udmVydF9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfY29sb3JfY29udmVydGVyKSk7Ci0gIGNpbmZvLT5jY29udmVydCA9IChzdHJ1Y3QganBlZ19jb2xvcl9jb252ZXJ0ZXIgKikgY2NvbnZlcnQ7Ci0gIC8qIHNldCBzdGFydF9wYXNzIHRvIG51bGwgbWV0aG9kIHVudGlsIHdlIGZpbmQgb3V0IGRpZmZlcmVudGx5ICovCi0gIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IG51bGxfbWV0aG9kOwotCi0gIC8qIE1ha2Ugc3VyZSBpbnB1dF9jb21wb25lbnRzIGFncmVlcyB3aXRoIGluX2NvbG9yX3NwYWNlICovCi0gIHN3aXRjaCAoY2luZm8tPmluX2NvbG9yX3NwYWNlKSB7Ci0gIGNhc2UgSkNTX0dSQVlTQ0FMRToKLSAgICBpZiAoY2luZm8tPmlucHV0X2NvbXBvbmVudHMgIT0gMSkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0lOX0NPTE9SU1BBQ0UpOwotICAgIGJyZWFrOwotCi0gIGNhc2UgSkNTX1JHQjoKLSNpZiBSR0JfUElYRUxTSVpFICE9IDMKLSAgICBpZiAoY2luZm8tPmlucHV0X2NvbXBvbmVudHMgIT0gUkdCX1BJWEVMU0laRSkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0lOX0NPTE9SU1BBQ0UpOwotICAgIGJyZWFrOwotI2VuZGlmIC8qIGVsc2Ugc2hhcmUgY29kZSB3aXRoIFlDYkNyICovCi0KLSAgY2FzZSBKQ1NfWUNiQ3I6Ci0gICAgaWYgKGNpbmZvLT5pbnB1dF9jb21wb25lbnRzICE9IDMpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9JTl9DT0xPUlNQQUNFKTsKLSAgICBicmVhazsKLQotICBjYXNlIEpDU19DTVlLOgotICBjYXNlIEpDU19ZQ0NLOgotICAgIGlmIChjaW5mby0+aW5wdXRfY29tcG9uZW50cyAhPSA0KQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSU5fQ09MT1JTUEFDRSk7Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoJCQkvKiBKQ1NfVU5LTk9XTiBjYW4gYmUgYW55dGhpbmcgKi8KLSAgICBpZiAoY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPCAxKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSU5fQ09MT1JTUEFDRSk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICAvKiBDaGVjayBudW1fY29tcG9uZW50cywgc2V0IGNvbnZlcnNpb24gbWV0aG9kIGJhc2VkIG9uIHJlcXVlc3RlZCBzcGFjZSAqLwotICBzd2l0Y2ggKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKSB7Ci0gIGNhc2UgSkNTX0dSQVlTQ0FMRToKLSAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDEpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOwotICAgIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IGdyYXlzY2FsZV9jb252ZXJ0OwotICAgIGVsc2UgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCKSB7Ci0gICAgICBjY29udmVydC0+cHViLnN0YXJ0X3Bhc3MgPSByZ2JfeWNjX3N0YXJ0OwotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gcmdiX2dyYXlfY29udmVydDsKLSAgICB9IGVsc2UgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpCi0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBncmF5c2NhbGVfY29udmVydDsKLSAgICBlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBKQ1NfUkdCOgotICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMykKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7Ci0gICAgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfUkdCICYmIFJHQl9QSVhFTFNJWkUgPT0gMykKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKLSAgICBlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBKQ1NfWUNiQ3I6Ci0gICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSAzKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKLSAgICBpZiAoY2luZm8tPmluX2NvbG9yX3NwYWNlID09IEpDU19SR0IpIHsKLSAgICAgIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IHJnYl95Y2Nfc3RhcnQ7Ci0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSByZ2JfeWNjX2NvbnZlcnQ7Ci0gICAgfSBlbHNlIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX1lDYkNyKQotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gbnVsbF9jb252ZXJ0OwotICAgIGVsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ09OVkVSU0lPTl9OT1RJTVBMKTsKLSAgICBicmVhazsKLQotICBjYXNlIEpDU19DTVlLOgotICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gNCkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7Ci0gICAgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfQ01ZSykKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKLSAgICBlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBKQ1NfWUNDSzoKLSAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDQpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOwotICAgIGlmIChjaW5mby0+aW5fY29sb3Jfc3BhY2UgPT0gSkNTX0NNWUspIHsKLSAgICAgIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IHJnYl95Y2Nfc3RhcnQ7Ci0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBjbXlrX3ljY2tfY29udmVydDsKLSAgICB9IGVsc2UgaWYgKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9PSBKQ1NfWUNDSykKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKLSAgICBlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoJCQkvKiBhbGxvdyBudWxsIGNvbnZlcnNpb24gb2YgSkNTX1VOS05PV04gKi8KLSAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgIT0gY2luZm8tPmluX2NvbG9yX3NwYWNlIHx8Ci0JY2luZm8tPm51bV9jb21wb25lbnRzICE9IGNpbmZvLT5pbnB1dF9jb21wb25lbnRzKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOwotICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKLSAgICBicmVhazsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjZGN0bWdyLmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNkY3RtZ3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFmYTc5Yi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNkY3RtZ3IuYworKysgL2Rldi9udWxsCkBAIC0xLDM4NyArMCwwIEBACi0vKgotICogamNkY3RtZ3IuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBmb3J3YXJkLURDVCBtYW5hZ2VtZW50IGxvZ2ljLgotICogVGhpcyBjb2RlIHNlbGVjdHMgYSBwYXJ0aWN1bGFyIERDVCBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkLAotICogYW5kIGl0IHBlcmZvcm1zIHJlbGF0ZWQgaG91c2VrZWVwaW5nIGNob3JlcyBpbmNsdWRpbmcgY29lZmZpY2llbnQKLSAqIHF1YW50aXphdGlvbi4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KLQotCi0vKiBQcml2YXRlIHN1Ym9iamVjdCBmb3IgdGhpcyBtb2R1bGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19mb3J3YXJkX2RjdCBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBQb2ludGVyIHRvIHRoZSBEQ1Qgcm91dGluZSBhY3R1YWxseSBpbiB1c2UgKi8KLSAgZm9yd2FyZF9EQ1RfbWV0aG9kX3B0ciBkb19kY3Q7Ci0KLSAgLyogVGhlIGFjdHVhbCBwb3N0LURDVCBkaXZpc29ycyAtLS0gbm90IGlkZW50aWNhbCB0byB0aGUgcXVhbnQgdGFibGUKLSAgICogZW50cmllcywgYmVjYXVzZSBvZiBzY2FsaW5nIChlc3BlY2lhbGx5IGZvciBhbiB1bm5vcm1hbGl6ZWQgRENUKS4KLSAgICogRWFjaCB0YWJsZSBpcyBnaXZlbiBpbiBub3JtYWwgYXJyYXkgb3JkZXIuCi0gICAqLwotICBEQ1RFTEVNICogZGl2aXNvcnNbTlVNX1FVQU5UX1RCTFNdOwotCi0jaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotICAvKiBTYW1lIGFzIGFib3ZlIGZvciB0aGUgZmxvYXRpbmctcG9pbnQgY2FzZS4gKi8KLSAgZmxvYXRfRENUX21ldGhvZF9wdHIgZG9fZmxvYXRfZGN0OwotICBGQVNUX0ZMT0FUICogZmxvYXRfZGl2aXNvcnNbTlVNX1FVQU5UX1RCTFNdOwotI2VuZGlmCi19IG15X2ZkY3RfY29udHJvbGxlcjsKLQotdHlwZWRlZiBteV9mZGN0X2NvbnRyb2xsZXIgKiBteV9mZGN0X3B0cjsKLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCi0gKiBWZXJpZnkgdGhhdCBhbGwgcmVmZXJlbmNlZCBRLXRhYmxlcyBhcmUgcHJlc2VudCwgYW5kIHNldCB1cAotICogdGhlIGRpdmlzb3IgdGFibGUgZm9yIGVhY2ggb25lLgotICogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIERDVCBvZiBhbGwgY29tcG9uZW50cyBpcyBkb25lIGR1cmluZwotICogdGhlIGZpcnN0IHBhc3MsIGV2ZW4gaWYgb25seSBzb21lIGNvbXBvbmVudHMgd2lsbCBiZSBvdXRwdXQgaW4gdGhlCi0gKiBmaXJzdCBzY2FuLiAgSGVuY2UgYWxsIGNvbXBvbmVudHMgc2hvdWxkIGJlIGV4YW1pbmVkIGhlcmUuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9wYXNzX2ZkY3RtZ3IgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9mZGN0X3B0ciBmZGN0ID0gKG15X2ZkY3RfcHRyKSBjaW5mby0+ZmRjdDsKLSAgaW50IGNpLCBxdGJsbm8sIGk7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIEpRVUFOVF9UQkwgKiBxdGJsOwotICBEQ1RFTEVNICogZHRibDsKLQotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIHF0YmxubyA9IGNvbXBwdHItPnF1YW50X3RibF9ubzsKLSAgICAvKiBNYWtlIHN1cmUgc3BlY2lmaWVkIHF1YW50aXphdGlvbiB0YWJsZSBpcyBwcmVzZW50ICovCi0gICAgaWYgKHF0YmxubyA8IDAgfHwgcXRibG5vID49IE5VTV9RVUFOVF9UQkxTIHx8Ci0JY2luZm8tPnF1YW50X3RibF9wdHJzW3F0Ymxub10gPT0gTlVMTCkKLSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX1FVQU5UX1RBQkxFLCBxdGJsbm8pOwotICAgIHF0YmwgPSBjaW5mby0+cXVhbnRfdGJsX3B0cnNbcXRibG5vXTsKLSAgICAvKiBDb21wdXRlIGRpdmlzb3JzIGZvciB0aGlzIHF1YW50IHRhYmxlICovCi0gICAgLyogV2UgbWF5IGRvIHRoaXMgbW9yZSB0aGFuIG9uY2UgZm9yIHNhbWUgdGFibGUsIGJ1dCBpdCdzIG5vdCBhIGJpZyBkZWFsICovCi0gICAgc3dpdGNoIChjaW5mby0+ZGN0X21ldGhvZCkgewotI2lmZGVmIERDVF9JU0xPV19TVVBQT1JURUQKLSAgICBjYXNlIEpEQ1RfSVNMT1c6Ci0gICAgICAvKiBGb3IgTEwmTSBJRENUIG1ldGhvZCwgZGl2aXNvcnMgYXJlIGVxdWFsIHRvIHJhdyBxdWFudGl6YXRpb24KLSAgICAgICAqIGNvZWZmaWNpZW50cyBtdWx0aXBsaWVkIGJ5IDggKHRvIGNvdW50ZXJhY3Qgc2NhbGluZykuCi0gICAgICAgKi8KLSAgICAgIGlmIChmZGN0LT5kaXZpc29yc1txdGJsbm9dID09IE5VTEwpIHsKLQlmZGN0LT5kaXZpc29yc1txdGJsbm9dID0gKERDVEVMRU0gKikKLQkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICAgICAgRENUU0laRTIgKiBTSVpFT0YoRENURUxFTSkpOwotICAgICAgfQotICAgICAgZHRibCA9IGZkY3QtPmRpdmlzb3JzW3F0Ymxub107Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgewotCWR0YmxbaV0gPSAoKERDVEVMRU0pIHF0YmwtPnF1YW50dmFsW2ldKSA8PCAzOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0gICAgY2FzZSBKRENUX0lGQVNUOgotICAgICAgewotCS8qIEZvciBBQSZOIElEQ1QgbWV0aG9kLCBkaXZpc29ycyBhcmUgZXF1YWwgdG8gcXVhbnRpemF0aW9uCi0JICogY29lZmZpY2llbnRzIHNjYWxlZCBieSBzY2FsZWZhY3Rvcltyb3ddKnNjYWxlZmFjdG9yW2NvbF0sIHdoZXJlCi0JICogICBzY2FsZWZhY3RvclswXSA9IDEKLQkgKiAgIHNjYWxlZmFjdG9yW2tdID0gY29zKGsqUEkvMTYpICogc3FydCgyKSAgICBmb3Igaz0xLi43Ci0JICogV2UgYXBwbHkgYSBmdXJ0aGVyIHNjYWxlIGZhY3RvciBvZiA4LgotCSAqLwotI2RlZmluZSBDT05TVF9CSVRTIDE0Ci0Jc3RhdGljIGNvbnN0IElOVDE2IGFhbnNjYWxlc1tEQ1RTSVpFMl0gPSB7Ci0JICAvKiBwcmVjb21wdXRlZCB2YWx1ZXMgc2NhbGVkIHVwIGJ5IDE0IGJpdHMgKi8KLQkgIDE2Mzg0LCAyMjcyNSwgMjE0MDcsIDE5MjY2LCAxNjM4NCwgMTI4NzMsICA4ODY3LCAgNDUyMCwKLQkgIDIyNzI1LCAzMTUyMSwgMjk2OTIsIDI2NzIyLCAyMjcyNSwgMTc4NTUsIDEyMjk5LCAgNjI3MCwKLQkgIDIxNDA3LCAyOTY5MiwgMjc5NjksIDI1MTcyLCAyMTQwNywgMTY4MTksIDExNTg1LCAgNTkwNiwKLQkgIDE5MjY2LCAyNjcyMiwgMjUxNzIsIDIyNjU0LCAxOTI2NiwgMTUxMzcsIDEwNDI2LCAgNTMxNSwKLQkgIDE2Mzg0LCAyMjcyNSwgMjE0MDcsIDE5MjY2LCAxNjM4NCwgMTI4NzMsICA4ODY3LCAgNDUyMCwKLQkgIDEyODczLCAxNzg1NSwgMTY4MTksIDE1MTM3LCAxMjg3MywgMTAxMTQsICA2OTY3LCAgMzU1MiwKLQkgICA4ODY3LCAxMjI5OSwgMTE1ODUsIDEwNDI2LCAgODg2NywgIDY5NjcsICA0Nzk5LCAgMjQ0NiwKLQkgICA0NTIwLCAgNjI3MCwgIDU5MDYsICA1MzE1LCAgNDUyMCwgIDM1NTIsICAyNDQ2LCAgMTI0NwotCX07Ci0JU0hJRlRfVEVNUFMKLQotCWlmIChmZGN0LT5kaXZpc29yc1txdGJsbm9dID09IE5VTEwpIHsKLQkgIGZkY3QtPmRpdmlzb3JzW3F0Ymxub10gPSAoRENURUxFTSAqKQotCSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCQlEQ1RTSVpFMiAqIFNJWkVPRihEQ1RFTEVNKSk7Ci0JfQotCWR0YmwgPSBmZGN0LT5kaXZpc29yc1txdGJsbm9dOwotCWZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7Ci0JICBkdGJsW2ldID0gKERDVEVMRU0pCi0JICAgIERFU0NBTEUoTVVMVElQTFkxNlYxNigoSU5UMzIpIHF0YmwtPnF1YW50dmFsW2ldLAotCQkJCSAgKElOVDMyKSBhYW5zY2FsZXNbaV0pLAotCQkgICAgQ09OU1RfQklUUy0zKTsKLQl9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSNlbmRpZgotI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKLSAgICBjYXNlIEpEQ1RfRkxPQVQ6Ci0gICAgICB7Ci0JLyogRm9yIGZsb2F0IEFBJk4gSURDVCBtZXRob2QsIGRpdmlzb3JzIGFyZSBlcXVhbCB0byBxdWFudGl6YXRpb24KLQkgKiBjb2VmZmljaWVudHMgc2NhbGVkIGJ5IHNjYWxlZmFjdG9yW3Jvd10qc2NhbGVmYWN0b3JbY29sXSwgd2hlcmUKLQkgKiAgIHNjYWxlZmFjdG9yWzBdID0gMQotCSAqICAgc2NhbGVmYWN0b3Jba10gPSBjb3MoaypQSS8xNikgKiBzcXJ0KDIpICAgIGZvciBrPTEuLjcKLQkgKiBXZSBhcHBseSBhIGZ1cnRoZXIgc2NhbGUgZmFjdG9yIG9mIDguCi0JICogV2hhdCdzIGFjdHVhbGx5IHN0b3JlZCBpcyAxL2Rpdmlzb3Igc28gdGhhdCB0aGUgaW5uZXIgbG9vcCBjYW4KLQkgKiB1c2UgYSBtdWx0aXBsaWNhdGlvbiByYXRoZXIgdGhhbiBhIGRpdmlzaW9uLgotCSAqLwotCUZBU1RfRkxPQVQgKiBmZHRibDsKLQlpbnQgcm93LCBjb2w7Ci0Jc3RhdGljIGNvbnN0IGRvdWJsZSBhYW5zY2FsZWZhY3RvcltEQ1RTSVpFXSA9IHsKLQkgIDEuMCwgMS4zODcwMzk4NDUsIDEuMzA2NTYyOTY1LCAxLjE3NTg3NTYwMiwKLQkgIDEuMCwgMC43ODU2OTQ5NTgsIDAuNTQxMTk2MTAwLCAwLjI3NTg5OTM3OQotCX07Ci0KLQlpZiAoZmRjdC0+ZmxvYXRfZGl2aXNvcnNbcXRibG5vXSA9PSBOVUxMKSB7Ci0JICBmZGN0LT5mbG9hdF9kaXZpc29yc1txdGJsbm9dID0gKEZBU1RfRkxPQVQgKikKLQkgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkJRENUU0laRTIgKiBTSVpFT0YoRkFTVF9GTE9BVCkpOwotCX0KLQlmZHRibCA9IGZkY3QtPmZsb2F0X2Rpdmlzb3JzW3F0Ymxub107Ci0JaSA9IDA7Ci0JZm9yIChyb3cgPSAwOyByb3cgPCBEQ1RTSVpFOyByb3crKykgewotCSAgZm9yIChjb2wgPSAwOyBjb2wgPCBEQ1RTSVpFOyBjb2wrKykgewotCSAgICBmZHRibFtpXSA9IChGQVNUX0ZMT0FUKQotCSAgICAgICgxLjAgLyAoKChkb3VibGUpIHF0YmwtPnF1YW50dmFsW2ldICoKLQkJICAgICAgIGFhbnNjYWxlZmFjdG9yW3Jvd10gKiBhYW5zY2FsZWZhY3Rvcltjb2xdICogOC4wKSkpOwotCSAgICBpKys7Ci0JICB9Ci0JfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIFBlcmZvcm0gZm9yd2FyZCBEQ1Qgb24gb25lIG9yIG1vcmUgYmxvY2tzIG9mIGEgY29tcG9uZW50LgotICoKLSAqIFRoZSBpbnB1dCBzYW1wbGVzIGFyZSB0YWtlbiBmcm9tIHRoZSBzYW1wbGVfZGF0YVtdIGFycmF5IHN0YXJ0aW5nIGF0Ci0gKiBwb3NpdGlvbiBzdGFydF9yb3cvc3RhcnRfY29sLCBhbmQgbW92aW5nIHRvIHRoZSByaWdodCBmb3IgYW55IGFkZGl0aW9uYWwKLSAqIGJsb2Nrcy4gVGhlIHF1YW50aXplZCBjb2VmZmljaWVudHMgYXJlIHJldHVybmVkIGluIGNvZWZfYmxvY2tzW10uCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1mb3J3YXJkX0RDVCAoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSAgICAgSlNBTVBBUlJBWSBzYW1wbGVfZGF0YSwgSkJMT0NLUk9XIGNvZWZfYmxvY2tzLAotCSAgICAgSkRJTUVOU0lPTiBzdGFydF9yb3csIEpESU1FTlNJT04gc3RhcnRfY29sLAotCSAgICAgSkRJTUVOU0lPTiBudW1fYmxvY2tzKQotLyogVGhpcyB2ZXJzaW9uIGlzIHVzZWQgZm9yIGludGVnZXIgRENUIGltcGxlbWVudGF0aW9ucy4gKi8KLXsKLSAgLyogVGhpcyByb3V0aW5lIGlzIGhlYXZpbHkgdXNlZCwgc28gaXQncyB3b3J0aCBjb2RpbmcgaXQgdGlnaHRseS4gKi8KLSAgbXlfZmRjdF9wdHIgZmRjdCA9IChteV9mZGN0X3B0cikgY2luZm8tPmZkY3Q7Ci0gIGZvcndhcmRfRENUX21ldGhvZF9wdHIgZG9fZGN0ID0gZmRjdC0+ZG9fZGN0OwotICBEQ1RFTEVNICogZGl2aXNvcnMgPSBmZGN0LT5kaXZpc29yc1tjb21wcHRyLT5xdWFudF90Ymxfbm9dOwotICBEQ1RFTEVNIHdvcmtzcGFjZVtEQ1RTSVpFMl07CS8qIHdvcmsgYXJlYSBmb3IgRkRDVCBzdWJyb3V0aW5lICovCi0gIEpESU1FTlNJT04gYmk7Ci0KLSAgc2FtcGxlX2RhdGEgKz0gc3RhcnRfcm93OwkvKiBmb2xkIGluIHRoZSB2ZXJ0aWNhbCBvZmZzZXQgb25jZSAqLwotCi0gIGZvciAoYmkgPSAwOyBiaSA8IG51bV9ibG9ja3M7IGJpKyssIHN0YXJ0X2NvbCArPSBEQ1RTSVpFKSB7Ci0gICAgLyogTG9hZCBkYXRhIGludG8gd29ya3NwYWNlLCBhcHBseWluZyB1bnNpZ25lZC0+c2lnbmVkIGNvbnZlcnNpb24gKi8KLSAgICB7IHJlZ2lzdGVyIERDVEVMRU0gKndvcmtzcGFjZXB0cjsKLSAgICAgIHJlZ2lzdGVyIEpTQU1QUk9XIGVsZW1wdHI7Ci0gICAgICByZWdpc3RlciBpbnQgZWxlbXI7Ci0KLSAgICAgIHdvcmtzcGFjZXB0ciA9IHdvcmtzcGFjZTsKLSAgICAgIGZvciAoZWxlbXIgPSAwOyBlbGVtciA8IERDVFNJWkU7IGVsZW1yKyspIHsKLQllbGVtcHRyID0gc2FtcGxlX2RhdGFbZWxlbXJdICsgc3RhcnRfY29sOwotI2lmIERDVFNJWkUgPT0gOAkJLyogdW5yb2xsIHRoZSBpbm5lciBsb29wICovCi0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0JKndvcmtzcGFjZXB0cisrID0gR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEU7Ci0jZWxzZQotCXsgcmVnaXN0ZXIgaW50IGVsZW1jOwotCSAgZm9yIChlbGVtYyA9IERDVFNJWkU7IGVsZW1jID4gMDsgZWxlbWMtLSkgewotCSAgICAqd29ya3NwYWNlcHRyKysgPSBHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRTsKLQkgIH0KLQl9Ci0jZW5kaWYKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBQZXJmb3JtIHRoZSBEQ1QgKi8KLSAgICAoKmRvX2RjdCkgKHdvcmtzcGFjZSk7Ci0KLSAgICAvKiBRdWFudGl6ZS9kZXNjYWxlIHRoZSBjb2VmZmljaWVudHMsIGFuZCBzdG9yZSBpbnRvIGNvZWZfYmxvY2tzW10gKi8KLSAgICB7IHJlZ2lzdGVyIERDVEVMRU0gdGVtcCwgcXZhbDsKLSAgICAgIHJlZ2lzdGVyIGludCBpOwotICAgICAgcmVnaXN0ZXIgSkNPRUZQVFIgb3V0cHV0X3B0ciA9IGNvZWZfYmxvY2tzW2JpXTsKLQotICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKLQlxdmFsID0gZGl2aXNvcnNbaV07Ci0JdGVtcCA9IHdvcmtzcGFjZVtpXTsKLQkvKiBEaXZpZGUgdGhlIGNvZWZmaWNpZW50IHZhbHVlIGJ5IHF2YWwsIGVuc3VyaW5nIHByb3BlciByb3VuZGluZy4KLQkgKiBTaW5jZSBDIGRvZXMgbm90IHNwZWNpZnkgdGhlIGRpcmVjdGlvbiBvZiByb3VuZGluZyBmb3IgbmVnYXRpdmUKLQkgKiBxdW90aWVudHMsIHdlIGhhdmUgdG8gZm9yY2UgdGhlIGRpdmlkZW5kIHBvc2l0aXZlIGZvciBwb3J0YWJpbGl0eS4KLQkgKgotCSAqIEluIG1vc3QgZmlsZXMsIGF0IGxlYXN0IGhhbGYgb2YgdGhlIG91dHB1dCB2YWx1ZXMgd2lsbCBiZSB6ZXJvCi0JICogKGF0IGRlZmF1bHQgcXVhbnRpemF0aW9uIHNldHRpbmdzLCBtb3JlIGxpa2UgdGhyZWUtcXVhcnRlcnMuLi4pCi0JICogc28gd2Ugc2hvdWxkIGVuc3VyZSB0aGF0IHRoaXMgY2FzZSBpcyBmYXN0LiAgT24gbWFueSBtYWNoaW5lcywKLQkgKiBhIGNvbXBhcmlzb24gaXMgZW5vdWdoIGNoZWFwZXIgdGhhbiBhIGRpdmlkZSB0byBtYWtlIGEgc3BlY2lhbCB0ZXN0Ci0JICogYSB3aW4uICBTaW5jZSBib3RoIGlucHV0cyB3aWxsIGJlIG5vbm5lZ2F0aXZlLCB3ZSBuZWVkIG9ubHkgdGVzdAotCSAqIGZvciBhIDwgYiB0byBkaXNjb3ZlciB3aGV0aGVyIGEvYiBpcyAwLgotCSAqIElmIHlvdXIgbWFjaGluZSdzIGRpdmlzaW9uIGlzIGZhc3QgZW5vdWdoLCBkZWZpbmUgRkFTVF9ESVZJREUuCi0JICovCi0jaWZkZWYgRkFTVF9ESVZJREUKLSNkZWZpbmUgRElWSURFX0JZKGEsYikJYSAvPSBiCi0jZWxzZQotI2RlZmluZSBESVZJREVfQlkoYSxiKQlpZiAoYSA+PSBiKSBhIC89IGI7IGVsc2UgYSA9IDAKLSNlbmRpZgotCWlmICh0ZW1wIDwgMCkgewotCSAgdGVtcCA9IC10ZW1wOwotCSAgdGVtcCArPSBxdmFsPj4xOwkvKiBmb3Igcm91bmRpbmcgKi8KLQkgIERJVklERV9CWSh0ZW1wLCBxdmFsKTsKLQkgIHRlbXAgPSAtdGVtcDsKLQl9IGVsc2UgewotCSAgdGVtcCArPSBxdmFsPj4xOwkvKiBmb3Igcm91bmRpbmcgKi8KLQkgIERJVklERV9CWSh0ZW1wLCBxdmFsKTsKLQl9Ci0Jb3V0cHV0X3B0cltpXSA9IChKQ09FRikgdGVtcDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi0jaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotCi1NRVRIT0RERUYodm9pZCkKLWZvcndhcmRfRENUX2Zsb2F0IChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JCSAgIEpTQU1QQVJSQVkgc2FtcGxlX2RhdGEsIEpCTE9DS1JPVyBjb2VmX2Jsb2NrcywKLQkJICAgSkRJTUVOU0lPTiBzdGFydF9yb3csIEpESU1FTlNJT04gc3RhcnRfY29sLAotCQkgICBKRElNRU5TSU9OIG51bV9ibG9ja3MpCi0vKiBUaGlzIHZlcnNpb24gaXMgdXNlZCBmb3IgZmxvYXRpbmctcG9pbnQgRENUIGltcGxlbWVudGF0aW9ucy4gKi8KLXsKLSAgLyogVGhpcyByb3V0aW5lIGlzIGhlYXZpbHkgdXNlZCwgc28gaXQncyB3b3J0aCBjb2RpbmcgaXQgdGlnaHRseS4gKi8KLSAgbXlfZmRjdF9wdHIgZmRjdCA9IChteV9mZGN0X3B0cikgY2luZm8tPmZkY3Q7Ci0gIGZsb2F0X0RDVF9tZXRob2RfcHRyIGRvX2RjdCA9IGZkY3QtPmRvX2Zsb2F0X2RjdDsKLSAgRkFTVF9GTE9BVCAqIGRpdmlzb3JzID0gZmRjdC0+ZmxvYXRfZGl2aXNvcnNbY29tcHB0ci0+cXVhbnRfdGJsX25vXTsKLSAgRkFTVF9GTE9BVCB3b3Jrc3BhY2VbRENUU0laRTJdOyAvKiB3b3JrIGFyZWEgZm9yIEZEQ1Qgc3Vicm91dGluZSAqLwotICBKRElNRU5TSU9OIGJpOwotCi0gIHNhbXBsZV9kYXRhICs9IHN0YXJ0X3JvdzsJLyogZm9sZCBpbiB0aGUgdmVydGljYWwgb2Zmc2V0IG9uY2UgKi8KLQotICBmb3IgKGJpID0gMDsgYmkgPCBudW1fYmxvY2tzOyBiaSsrLCBzdGFydF9jb2wgKz0gRENUU0laRSkgewotICAgIC8qIExvYWQgZGF0YSBpbnRvIHdvcmtzcGFjZSwgYXBwbHlpbmcgdW5zaWduZWQtPnNpZ25lZCBjb252ZXJzaW9uICovCi0gICAgeyByZWdpc3RlciBGQVNUX0ZMT0FUICp3b3Jrc3BhY2VwdHI7Ci0gICAgICByZWdpc3RlciBKU0FNUFJPVyBlbGVtcHRyOwotICAgICAgcmVnaXN0ZXIgaW50IGVsZW1yOwotCi0gICAgICB3b3Jrc3BhY2VwdHIgPSB3b3Jrc3BhY2U7Ci0gICAgICBmb3IgKGVsZW1yID0gMDsgZWxlbXIgPCBEQ1RTSVpFOyBlbGVtcisrKSB7Ci0JZWxlbXB0ciA9IHNhbXBsZV9kYXRhW2VsZW1yXSArIHN0YXJ0X2NvbDsKLSNpZiBEQ1RTSVpFID09IDgJCS8qIHVucm9sbCB0aGUgaW5uZXIgbG9vcCAqLwotCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7Ci0JKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKLQkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOwotCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7Ci0JKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKLQkqd29ya3NwYWNlcHRyKysgPSAoRkFTVF9GTE9BVCkoR0VUSlNBTVBMRSgqZWxlbXB0cisrKSAtIENFTlRFUkpTQU1QTEUpOwotCSp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKShHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7Ci0JKndvcmtzcGFjZXB0cisrID0gKEZBU1RfRkxPQVQpKEdFVEpTQU1QTEUoKmVsZW1wdHIrKykgLSBDRU5URVJKU0FNUExFKTsKLSNlbHNlCi0JeyByZWdpc3RlciBpbnQgZWxlbWM7Ci0JICBmb3IgKGVsZW1jID0gRENUU0laRTsgZWxlbWMgPiAwOyBlbGVtYy0tKSB7Ci0JICAgICp3b3Jrc3BhY2VwdHIrKyA9IChGQVNUX0ZMT0FUKQotCSAgICAgIChHRVRKU0FNUExFKCplbGVtcHRyKyspIC0gQ0VOVEVSSlNBTVBMRSk7Ci0JICB9Ci0JfQotI2VuZGlmCi0gICAgICB9Ci0gICAgfQotCi0gICAgLyogUGVyZm9ybSB0aGUgRENUICovCi0gICAgKCpkb19kY3QpICh3b3Jrc3BhY2UpOwotCi0gICAgLyogUXVhbnRpemUvZGVzY2FsZSB0aGUgY29lZmZpY2llbnRzLCBhbmQgc3RvcmUgaW50byBjb2VmX2Jsb2Nrc1tdICovCi0gICAgeyByZWdpc3RlciBGQVNUX0ZMT0FUIHRlbXA7Ci0gICAgICByZWdpc3RlciBpbnQgaTsKLSAgICAgIHJlZ2lzdGVyIEpDT0VGUFRSIG91dHB1dF9wdHIgPSBjb2VmX2Jsb2Nrc1tiaV07Ci0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7Ci0JLyogQXBwbHkgdGhlIHF1YW50aXphdGlvbiBhbmQgc2NhbGluZyBmYWN0b3IgKi8KLQl0ZW1wID0gd29ya3NwYWNlW2ldICogZGl2aXNvcnNbaV07Ci0JLyogUm91bmQgdG8gbmVhcmVzdCBpbnRlZ2VyLgotCSAqIFNpbmNlIEMgZG9lcyBub3Qgc3BlY2lmeSB0aGUgZGlyZWN0aW9uIG9mIHJvdW5kaW5nIGZvciBuZWdhdGl2ZQotCSAqIHF1b3RpZW50cywgd2UgaGF2ZSB0byBmb3JjZSB0aGUgZGl2aWRlbmQgcG9zaXRpdmUgZm9yIHBvcnRhYmlsaXR5LgotCSAqIFRoZSBtYXhpbXVtIGNvZWZmaWNpZW50IHNpemUgaXMgKy0xNksgKGZvciAxMi1iaXQgZGF0YSksIHNvIHRoaXMKLQkgKiBjb2RlIHNob3VsZCB3b3JrIGZvciBlaXRoZXIgMTYtYml0IG9yIDMyLWJpdCBpbnRzLgotCSAqLwotCW91dHB1dF9wdHJbaV0gPSAoSkNPRUYpICgoaW50KSAodGVtcCArIChGQVNUX0ZMT0FUKSAxNjM4NC41KSAtIDE2Mzg0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotI2VuZGlmIC8qIERDVF9GTE9BVF9TVVBQT1JURUQgKi8KLQotCi0vKgotICogSW5pdGlhbGl6ZSBGRENUIG1hbmFnZXIuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9mb3J3YXJkX2RjdCAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2ZkY3RfcHRyIGZkY3Q7Ci0gIGludCBpOwotCi0gIGZkY3QgPSAobXlfZmRjdF9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfZmRjdF9jb250cm9sbGVyKSk7Ci0gIGNpbmZvLT5mZGN0ID0gKHN0cnVjdCBqcGVnX2ZvcndhcmRfZGN0ICopIGZkY3Q7Ci0gIGZkY3QtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19mZGN0bWdyOwotCi0gIHN3aXRjaCAoY2luZm8tPmRjdF9tZXRob2QpIHsKLSNpZmRlZiBEQ1RfSVNMT1dfU1VQUE9SVEVECi0gIGNhc2UgSkRDVF9JU0xPVzoKLSAgICBmZGN0LT5wdWIuZm9yd2FyZF9EQ1QgPSBmb3J3YXJkX0RDVDsKLSAgICBmZGN0LT5kb19kY3QgPSBqcGVnX2ZkY3RfaXNsb3c7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0gIGNhc2UgSkRDVF9JRkFTVDoKLSAgICBmZGN0LT5wdWIuZm9yd2FyZF9EQ1QgPSBmb3J3YXJkX0RDVDsKLSAgICBmZGN0LT5kb19kY3QgPSBqcGVnX2ZkY3RfaWZhc3Q7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0gIGNhc2UgSkRDVF9GTE9BVDoKLSAgICBmZGN0LT5wdWIuZm9yd2FyZF9EQ1QgPSBmb3J3YXJkX0RDVF9mbG9hdDsKLSAgICBmZGN0LT5kb19mbG9hdF9kY3QgPSBqcGVnX2ZkY3RfZmxvYXQ7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICAvKiBNYXJrIGRpdmlzb3IgdGFibGVzIHVuYWxsb2NhdGVkICovCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fUVVBTlRfVEJMUzsgaSsrKSB7Ci0gICAgZmRjdC0+ZGl2aXNvcnNbaV0gPSBOVUxMOwotI2lmZGVmIERDVF9GTE9BVF9TVVBQT1JURUQKLSAgICBmZGN0LT5mbG9hdF9kaXZpc29yc1tpXSA9IE5VTEw7Ci0jZW5kaWYKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjaHVmZi5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjaHVmZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDUyMjBjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY2h1ZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDkwOCArMCwwIEBACi0vKgotICogamNodWZmLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBIdWZmbWFuIGVudHJvcHkgZW5jb2Rpbmcgcm91dGluZXMuCi0gKgotICogTXVjaCBvZiB0aGUgY29tcGxleGl0eSBoZXJlIGhhcyB0byBkbyB3aXRoIHN1cHBvcnRpbmcgb3V0cHV0IHN1c3BlbnNpb24uCi0gKiBJZiB0aGUgZGF0YSBkZXN0aW5hdGlvbiBtb2R1bGUgZGVtYW5kcyBzdXNwZW5zaW9uLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8KLSAqIGJhY2sgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IE1DVS4gIFRvIGRvIHRoaXMsIHdlIGNvcHkgc3RhdGUKLSAqIHZhcmlhYmxlcyBpbnRvIGxvY2FsIHdvcmtpbmcgc3RvcmFnZSwgYW5kIHVwZGF0ZSB0aGVtIGJhY2sgdG8gdGhlCi0gKiBwZXJtYW5lbnQgSlBFRyBvYmplY3RzIG9ubHkgdXBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgYW4gTUNVLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqY2h1ZmYuaCIJCS8qIERlY2xhcmF0aW9ucyBzaGFyZWQgd2l0aCBqY3BodWZmLmMgKi8KLQotLyogRXhwYW5kZWQgZW50cm9weSBlbmNvZGVyIG9iamVjdCBmb3IgSHVmZm1hbiBlbmNvZGluZy4KLSAqCi0gKiBUaGUgc2F2YWJsZV9zdGF0ZSBzdWJyZWNvcmQgY29udGFpbnMgZmllbGRzIHRoYXQgY2hhbmdlIHdpdGhpbiBhbiBNQ1UsCi0gKiBidXQgbXVzdCBub3QgYmUgdXBkYXRlZCBwZXJtYW5lbnRseSB1bnRpbCB3ZSBjb21wbGV0ZSB0aGUgTUNVLgotICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgSU5UMzIgcHV0X2J1ZmZlcjsJCS8qIGN1cnJlbnQgYml0LWFjY3VtdWxhdGlvbiBidWZmZXIgKi8KLSAgaW50IHB1dF9iaXRzOwkJCS8qICMgb2YgYml0cyBub3cgaW4gaXQgKi8KLSAgaW50IGxhc3RfZGNfdmFsW01BWF9DT01QU19JTl9TQ0FOXTsgLyogbGFzdCBEQyBjb2VmIGZvciBlYWNoIGNvbXBvbmVudCAqLwotfSBzYXZhYmxlX3N0YXRlOwotCi0vKiBUaGlzIG1hY3JvIGlzIHRvIHdvcmsgYXJvdW5kIGNvbXBpbGVycyB3aXRoIG1pc3Npbmcgb3IgYnJva2VuCi0gKiBzdHJ1Y3R1cmUgYXNzaWdubWVudC4gIFlvdSdsbCBuZWVkIHRvIGZpeCB0aGlzIGNvZGUgaWYgeW91IGhhdmUKLSAqIHN1Y2ggYSBjb21waWxlciBhbmQgeW91IGNoYW5nZSBNQVhfQ09NUFNfSU5fU0NBTi4KLSAqLwotCi0jaWZuZGVmIE5PX1NUUlVDVF9BU1NJR04KLSNkZWZpbmUgQVNTSUdOX1NUQVRFKGRlc3Qsc3JjKSAgKChkZXN0KSA9IChzcmMpKQotI2Vsc2UKLSNpZiBNQVhfQ09NUFNfSU5fU0NBTiA9PSA0Ci0jZGVmaW5lIEFTU0lHTl9TVEFURShkZXN0LHNyYykgIFwKLQkoKGRlc3QpLnB1dF9idWZmZXIgPSAoc3JjKS5wdXRfYnVmZmVyLCBcCi0JIChkZXN0KS5wdXRfYml0cyA9IChzcmMpLnB1dF9iaXRzLCBcCi0JIChkZXN0KS5sYXN0X2RjX3ZhbFswXSA9IChzcmMpLmxhc3RfZGNfdmFsWzBdLCBcCi0JIChkZXN0KS5sYXN0X2RjX3ZhbFsxXSA9IChzcmMpLmxhc3RfZGNfdmFsWzFdLCBcCi0JIChkZXN0KS5sYXN0X2RjX3ZhbFsyXSA9IChzcmMpLmxhc3RfZGNfdmFsWzJdLCBcCi0JIChkZXN0KS5sYXN0X2RjX3ZhbFszXSA9IChzcmMpLmxhc3RfZGNfdmFsWzNdKQotI2VuZGlmCi0jZW5kaWYKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICBzYXZhYmxlX3N0YXRlIHNhdmVkOwkJLyogQml0IGJ1ZmZlciAmIERDIHN0YXRlIGF0IHN0YXJ0IG9mIE1DVSAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgTk9UIGxvYWRlZCBpbnRvIGxvY2FsIHdvcmtpbmcgc3RhdGUuICovCi0gIHVuc2lnbmVkIGludCByZXN0YXJ0c190b19nbzsJLyogTUNVcyBsZWZ0IGluIHRoaXMgcmVzdGFydCBpbnRlcnZhbCAqLwotICBpbnQgbmV4dF9yZXN0YXJ0X251bTsJCS8qIG5leHQgcmVzdGFydCBudW1iZXIgdG8gd3JpdGUgKDAtNykgKi8KLQotICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyAodGhlc2Ugd29ya3NwYWNlcyBoYXZlIGltYWdlIGxpZmVzcGFuKSAqLwotICBjX2Rlcml2ZWRfdGJsICogZGNfZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOwotICBjX2Rlcml2ZWRfdGJsICogYWNfZGVyaXZlZF90YmxzW05VTV9IVUZGX1RCTFNdOwotCi0jaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECS8qIFN0YXRpc3RpY3MgdGFibGVzIGZvciBvcHRpbWl6YXRpb24gKi8KLSAgbG9uZyAqIGRjX2NvdW50X3B0cnNbTlVNX0hVRkZfVEJMU107Ci0gIGxvbmcgKiBhY19jb3VudF9wdHJzW05VTV9IVUZGX1RCTFNdOwotI2VuZGlmCi19IGh1ZmZfZW50cm9weV9lbmNvZGVyOwotCi10eXBlZGVmIGh1ZmZfZW50cm9weV9lbmNvZGVyICogaHVmZl9lbnRyb3B5X3B0cjsKLQotLyogV29ya2luZyBzdGF0ZSB3aGlsZSB3cml0aW5nIGFuIE1DVS4KLSAqIFRoaXMgc3RydWN0IGNvbnRhaW5zIGFsbCB0aGUgZmllbGRzIHRoYXQgYXJlIG5lZWRlZCBieSBzdWJyb3V0aW5lcy4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIEpPQ1RFVCAqIG5leHRfb3V0cHV0X2J5dGU7CS8qID0+IG5leHQgYnl0ZSB0byB3cml0ZSBpbiBidWZmZXIgKi8KLSAgc2l6ZV90IGZyZWVfaW5fYnVmZmVyOwkvKiAjIG9mIGJ5dGUgc3BhY2VzIHJlbWFpbmluZyBpbiBidWZmZXIgKi8KLSAgc2F2YWJsZV9zdGF0ZSBjdXI7CQkvKiBDdXJyZW50IGJpdCBidWZmZXIgJiBEQyBzdGF0ZSAqLwotICBqX2NvbXByZXNzX3B0ciBjaW5mbzsJCS8qIGR1bXBfYnVmZmVyIG5lZWRzIGFjY2VzcyB0byB0aGlzICovCi19IHdvcmtpbmdfc3RhdGU7Ci0KLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLU1FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X2h1ZmYgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJSkJMT0NLUk9XICpNQ1VfZGF0YSkpOwotTUVUSE9EREVGKHZvaWQpIGZpbmlzaF9wYXNzX2h1ZmYgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotI2lmZGVmIEVOVFJPUFlfT1BUX1NVUFBPUlRFRAotTUVUSE9EREVGKGJvb2xlYW4pIGVuY29kZV9tY3VfZ2F0aGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOwotTUVUSE9EREVGKHZvaWQpIGZpbmlzaF9wYXNzX2dhdGhlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0jZW5kaWYKLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2Nhbi4KLSAqIElmIGdhdGhlcl9zdGF0aXN0aWNzIGlzIFRSVUUsIHdlIGRvIG5vdCBvdXRwdXQgYW55dGhpbmcgZHVyaW5nIHRoZSBzY2FuLAotICoganVzdCBjb3VudCB0aGUgSHVmZm1hbiBzeW1ib2xzIHVzZWQgYW5kIGdlbmVyYXRlIEh1ZmZtYW4gY29kZSB0YWJsZXMuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9wYXNzX2h1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGdhdGhlcl9zdGF0aXN0aWNzKQotewotICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGludCBjaSwgZGN0YmwsIGFjdGJsOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLQotICBpZiAoZ2F0aGVyX3N0YXRpc3RpY3MpIHsKLSNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKLSAgICBlbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfZ2F0aGVyOwotICAgIGVudHJvcHktPnB1Yi5maW5pc2hfcGFzcyA9IGZpbmlzaF9wYXNzX2dhdGhlcjsKLSNlbHNlCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotI2VuZGlmCi0gIH0gZWxzZSB7Ci0gICAgZW50cm9weS0+cHViLmVuY29kZV9tY3UgPSBlbmNvZGVfbWN1X2h1ZmY7Ci0gICAgZW50cm9weS0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3NfaHVmZjsKLSAgfQotCi0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICBkY3RibCA9IGNvbXBwdHItPmRjX3RibF9ubzsKLSAgICBhY3RibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKLSAgICBpZiAoZ2F0aGVyX3N0YXRpc3RpY3MpIHsKLSNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKLSAgICAgIC8qIENoZWNrIGZvciBpbnZhbGlkIHRhYmxlIGluZGV4ZXMgKi8KLSAgICAgIC8qIChtYWtlX2NfZGVyaXZlZF90YmwgZG9lcyB0aGlzIGluIHRoZSBvdGhlciBwYXRoKSAqLwotICAgICAgaWYgKGRjdGJsIDwgMCB8fCBkY3RibCA+PSBOVU1fSFVGRl9UQkxTKQotCUVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIGRjdGJsKTsKLSAgICAgIGlmIChhY3RibCA8IDAgfHwgYWN0YmwgPj0gTlVNX0hVRkZfVEJMUykKLQlFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCBhY3RibCk7Ci0gICAgICAvKiBBbGxvY2F0ZSBhbmQgemVybyB0aGUgc3RhdGlzdGljcyB0YWJsZXMgKi8KLSAgICAgIC8qIE5vdGUgdGhhdCBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlIGV4cGVjdHMgMjU3IGVudHJpZXMgaW4gZWFjaCB0YWJsZSEgKi8KLSAgICAgIGlmIChlbnRyb3B5LT5kY19jb3VudF9wdHJzW2RjdGJsXSA9PSBOVUxMKQotCWVudHJvcHktPmRjX2NvdW50X3B0cnNbZGN0YmxdID0gKGxvbmcgKikKLQkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICAgICAgMjU3ICogU0laRU9GKGxvbmcpKTsKLSAgICAgIE1FTVpFUk8oZW50cm9weS0+ZGNfY291bnRfcHRyc1tkY3RibF0sIDI1NyAqIFNJWkVPRihsb25nKSk7Ci0gICAgICBpZiAoZW50cm9weS0+YWNfY291bnRfcHRyc1thY3RibF0gPT0gTlVMTCkKLQllbnRyb3B5LT5hY19jb3VudF9wdHJzW2FjdGJsXSA9IChsb25nICopCi0JICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgICAgIDI1NyAqIFNJWkVPRihsb25nKSk7Ci0gICAgICBNRU1aRVJPKGVudHJvcHktPmFjX2NvdW50X3B0cnNbYWN0YmxdLCAyNTcgKiBTSVpFT0YobG9uZykpOwotI2VuZGlmCi0gICAgfSBlbHNlIHsKLSAgICAgIC8qIENvbXB1dGUgZGVyaXZlZCB2YWx1ZXMgZm9yIEh1ZmZtYW4gdGFibGVzICovCi0gICAgICAvKiBXZSBtYXkgZG8gdGhpcyBtb3JlIHRoYW4gb25jZSBmb3IgYSB0YWJsZSwgYnV0IGl0J3Mgbm90IGV4cGVuc2l2ZSAqLwotICAgICAganBlZ19tYWtlX2NfZGVyaXZlZF90YmwoY2luZm8sIFRSVUUsIGRjdGJsLAotCQkJICAgICAgJiBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbZGN0YmxdKTsKLSAgICAgIGpwZWdfbWFrZV9jX2Rlcml2ZWRfdGJsKGNpbmZvLCBGQUxTRSwgYWN0YmwsCi0JCQkgICAgICAmIGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsc1thY3RibF0pOwotICAgIH0KLSAgICAvKiBJbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KLSAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOwotICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSBiaXQgYnVmZmVyIHRvIGVtcHR5ICovCi0gIGVudHJvcHktPnNhdmVkLnB1dF9idWZmZXIgPSAwOwotICBlbnRyb3B5LT5zYXZlZC5wdXRfYml0cyA9IDA7Ci0KLSAgLyogSW5pdGlhbGl6ZSByZXN0YXJ0IHN0dWZmICovCi0gIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7Ci0gIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gPSAwOwotfQotCi0KLS8qCi0gKiBDb21wdXRlIHRoZSBkZXJpdmVkIHZhbHVlcyBmb3IgYSBIdWZmbWFuIHRhYmxlLgotICogVGhpcyByb3V0aW5lIGFsc28gcGVyZm9ybXMgc29tZSB2YWxpZGF0aW9uIGNoZWNrcyBvbiB0aGUgdGFibGUuCi0gKgotICogTm90ZSB0aGlzIGlzIGFsc28gdXNlZCBieSBqY3BodWZmLmMuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX21ha2VfY19kZXJpdmVkX3RibCAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNEQywgaW50IHRibG5vLAotCQkJIGNfZGVyaXZlZF90YmwgKiogcGR0YmwpCi17Ci0gIEpIVUZGX1RCTCAqaHRibDsKLSAgY19kZXJpdmVkX3RibCAqZHRibDsKLSAgaW50IHAsIGksIGwsIGxhc3RwLCBfc2ksIG1heHN5bWJvbDsKLSAgY2hhciBodWZmc2l6ZVsyNTddOwotICB1bnNpZ25lZCBpbnQgaHVmZmNvZGVbMjU3XTsKLSAgdW5zaWduZWQgaW50IGNvZGU7Ci0KLSAgLyogTm90ZSB0aGF0IGh1ZmZzaXplW10gYW5kIGh1ZmZjb2RlW10gYXJlIGZpbGxlZCBpbiBjb2RlLWxlbmd0aCBvcmRlciwKLSAgICogcGFyYWxsZWxpbmcgdGhlIG9yZGVyIG9mIHRoZSBzeW1ib2xzIHRoZW1zZWx2ZXMgaW4gaHRibC0+aHVmZnZhbFtdLgotICAgKi8KLQotICAvKiBGaW5kIHRoZSBpbnB1dCBIdWZmbWFuIHRhYmxlICovCi0gIGlmICh0YmxubyA8IDAgfHwgdGJsbm8gPj0gTlVNX0hVRkZfVEJMUykKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9OT19IVUZGX1RBQkxFLCB0Ymxubyk7Ci0gIGh0YmwgPQotICAgIGlzREMgPyBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1t0Ymxub10gOiBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1t0Ymxub107Ci0gIGlmIChodGJsID09IE5VTEwpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgdGJsbm8pOwotCi0gIC8qIEFsbG9jYXRlIGEgd29ya3NwYWNlIGlmIHdlIGhhdmVuJ3QgYWxyZWFkeSBkb25lIHNvLiAqLwotICBpZiAoKnBkdGJsID09IE5VTEwpCi0gICAgKnBkdGJsID0gKGNfZGVyaXZlZF90YmwgKikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBTSVpFT0YoY19kZXJpdmVkX3RibCkpOwotICBkdGJsID0gKnBkdGJsOwotICAKLSAgLyogRmlndXJlIEMuMTogbWFrZSB0YWJsZSBvZiBIdWZmbWFuIGNvZGUgbGVuZ3RoIGZvciBlYWNoIHN5bWJvbCAqLwotCi0gIHAgPSAwOwotICBmb3IgKGwgPSAxOyBsIDw9IDE2OyBsKyspIHsKLSAgICBpID0gKGludCkgaHRibC0+Yml0c1tsXTsKLSAgICBpZiAoaSA8IDAgfHwgcCArIGkgPiAyNTYpCS8qIHByb3RlY3QgYWdhaW5zdCB0YWJsZSBvdmVycnVuICovCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKLSAgICB3aGlsZSAoaS0tKQotICAgICAgaHVmZnNpemVbcCsrXSA9IChjaGFyKSBsOwotICB9Ci0gIGh1ZmZzaXplW3BdID0gMDsKLSAgbGFzdHAgPSBwOwotICAKLSAgLyogRmlndXJlIEMuMjogZ2VuZXJhdGUgdGhlIGNvZGVzIHRoZW1zZWx2ZXMgKi8KLSAgLyogV2UgYWxzbyB2YWxpZGF0ZSB0aGF0IHRoZSBjb3VudHMgcmVwcmVzZW50IGEgbGVnYWwgSHVmZm1hbiBjb2RlIHRyZWUuICovCi0KLSAgY29kZSA9IDA7Ci0gIF9zaSA9IGh1ZmZzaXplWzBdOwotICBwID0gMDsKLSAgd2hpbGUgKGh1ZmZzaXplW3BdKSB7Ci0gICAgd2hpbGUgKCgoaW50KSBodWZmc2l6ZVtwXSkgPT0gX3NpKSB7Ci0gICAgICBodWZmY29kZVtwKytdID0gY29kZTsKLSAgICAgIGNvZGUrKzsKLSAgICB9Ci0gICAgLyogY29kZSBpcyBub3cgMSBtb3JlIHRoYW4gdGhlIGxhc3QgY29kZSB1c2VkIGZvciBjb2RlbGVuZ3RoIHNpOyBidXQKLSAgICAgKiBpdCBtdXN0IHN0aWxsIGZpdCBpbiBzaSBiaXRzLCBzaW5jZSBubyBjb2RlIGlzIGFsbG93ZWQgdG8gYmUgYWxsIG9uZXMuCi0gICAgICovCi0gICAgaWYgKCgoSU5UMzIpIGNvZGUpID49ICgoKElOVDMyKSAxKSA8PCBfc2kpKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSFVGRl9UQUJMRSk7Ci0gICAgY29kZSA8PD0gMTsKLSAgICBfc2krKzsKLSAgfQotICAKLSAgLyogRmlndXJlIEMuMzogZ2VuZXJhdGUgZW5jb2RpbmcgdGFibGVzICovCi0gIC8qIFRoZXNlIGFyZSBjb2RlIGFuZCBzaXplIGluZGV4ZWQgYnkgc3ltYm9sIHZhbHVlICovCi0KLSAgLyogU2V0IGFsbCBjb2RlbGVzcyBzeW1ib2xzIHRvIGhhdmUgY29kZSBsZW5ndGggMDsKLSAgICogdGhpcyBsZXRzIHVzIGRldGVjdCBkdXBsaWNhdGUgVkFMIGVudHJpZXMgaGVyZSwgYW5kIGxhdGVyCi0gICAqIGFsbG93cyBlbWl0X2JpdHMgdG8gZGV0ZWN0IGFueSBhdHRlbXB0IHRvIGVtaXQgc3VjaCBzeW1ib2xzLgotICAgKi8KLSAgTUVNWkVSTyhkdGJsLT5laHVmc2ksIFNJWkVPRihkdGJsLT5laHVmc2kpKTsKLQotICAvKiBUaGlzIGlzIGFsc28gYSBjb252ZW5pZW50IHBsYWNlIHRvIGNoZWNrIGZvciBvdXQtb2YtcmFuZ2UKLSAgICogYW5kIGR1cGxpY2F0ZWQgVkFMIGVudHJpZXMuICBXZSBhbGxvdyAwLi4yNTUgZm9yIEFDIHN5bWJvbHMKLSAgICogYnV0IG9ubHkgMC4uMTUgZm9yIERDLiAgKFdlIGNvdWxkIGNvbnN0cmFpbiB0aGVtIGZ1cnRoZXIKLSAgICogYmFzZWQgb24gZGF0YSBkZXB0aCBhbmQgbW9kZSwgYnV0IHRoaXMgc2VlbXMgZW5vdWdoLikKLSAgICovCi0gIG1heHN5bWJvbCA9IGlzREMgPyAxNSA6IDI1NTsKLQotICBmb3IgKHAgPSAwOyBwIDwgbGFzdHA7IHArKykgewotICAgIGkgPSBodGJsLT5odWZmdmFsW3BdOwotICAgIGlmIChpIDwgMCB8fCBpID4gbWF4c3ltYm9sIHx8IGR0YmwtPmVodWZzaVtpXSkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0hVRkZfVEFCTEUpOwotICAgIGR0YmwtPmVodWZjb1tpXSA9IGh1ZmZjb2RlW3BdOwotICAgIGR0YmwtPmVodWZzaVtpXSA9IGh1ZmZzaXplW3BdOwotICB9Ci19Ci0KLQotLyogT3V0cHV0dGluZyBieXRlcyB0byB0aGUgZmlsZSAqLwotCi0vKiBFbWl0IGEgYnl0ZSwgdGFraW5nICdhY3Rpb24nIGlmIG11c3Qgc3VzcGVuZC4gKi8KLSNkZWZpbmUgZW1pdF9ieXRlKHN0YXRlLHZhbCxhY3Rpb24pICBcCi0JeyAqKHN0YXRlKS0+bmV4dF9vdXRwdXRfYnl0ZSsrID0gKEpPQ1RFVCkgKHZhbCk7ICBcCi0JICBpZiAoLS0oc3RhdGUpLT5mcmVlX2luX2J1ZmZlciA9PSAwKSAgXAotCSAgICBpZiAoISBkdW1wX2J1ZmZlcihzdGF0ZSkpICBcCi0JICAgICAgeyBhY3Rpb247IH0gfQotCi0KLUxPQ0FMKGJvb2xlYW4pCi1kdW1wX2J1ZmZlciAod29ya2luZ19zdGF0ZSAqIHN0YXRlKQotLyogRW1wdHkgdGhlIG91dHB1dCBidWZmZXI7IHJldHVybiBUUlVFIGlmIHN1Y2Nlc3NmdWwsIEZBTFNFIGlmIG11c3Qgc3VzcGVuZCAqLwotewotICBzdHJ1Y3QganBlZ19kZXN0aW5hdGlvbl9tZ3IgKiBkZXN0ID0gc3RhdGUtPmNpbmZvLT5kZXN0OwotCi0gIGlmICghICgqZGVzdC0+ZW1wdHlfb3V0cHV0X2J1ZmZlcikgKHN0YXRlLT5jaW5mbykpCi0gICAgcmV0dXJuIEZBTFNFOwotICAvKiBBZnRlciBhIHN1Y2Nlc3NmdWwgYnVmZmVyIGR1bXAsIG11c3QgcmVzZXQgYnVmZmVyIHBvaW50ZXJzICovCi0gIHN0YXRlLT5uZXh0X291dHB1dF9ieXRlID0gZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKLSAgc3RhdGUtPmZyZWVfaW5fYnVmZmVyID0gZGVzdC0+ZnJlZV9pbl9idWZmZXI7Ci0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qIE91dHB1dHRpbmcgYml0cyB0byB0aGUgZmlsZSAqLwotCi0vKiBPbmx5IHRoZSByaWdodCAyNCBiaXRzIG9mIHB1dF9idWZmZXIgYXJlIHVzZWQ7IHRoZSB2YWxpZCBiaXRzIGFyZQotICogbGVmdC1qdXN0aWZpZWQgaW4gdGhpcyBwYXJ0LiAgQXQgbW9zdCAxNiBiaXRzIGNhbiBiZSBwYXNzZWQgdG8gZW1pdF9iaXRzCi0gKiBpbiBvbmUgY2FsbCwgYW5kIHdlIG5ldmVyIHJldGFpbiBtb3JlIHRoYW4gNyBiaXRzIGluIHB1dF9idWZmZXIKLSAqIGJldHdlZW4gY2FsbHMsIHNvIDI0IGJpdHMgYXJlIHN1ZmZpY2llbnQuCi0gKi8KLQotSU5MSU5FCi1MT0NBTChib29sZWFuKQotZW1pdF9iaXRzICh3b3JraW5nX3N0YXRlICogc3RhdGUsIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgc2l6ZSkKLS8qIEVtaXQgc29tZSBiaXRzOyByZXR1cm4gVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBpZiBtdXN0IHN1c3BlbmQgKi8KLXsKLSAgLyogVGhpcyByb3V0aW5lIGlzIGhlYXZpbHkgdXNlZCwgc28gaXQncyB3b3J0aCBjb2RpbmcgdGlnaHRseS4gKi8KLSAgcmVnaXN0ZXIgSU5UMzIgcHV0X2J1ZmZlciA9IChJTlQzMikgY29kZTsKLSAgcmVnaXN0ZXIgaW50IHB1dF9iaXRzID0gc3RhdGUtPmN1ci5wdXRfYml0czsKLQotICAvKiBpZiBzaXplIGlzIDAsIGNhbGxlciB1c2VkIGFuIGludmFsaWQgSHVmZm1hbiB0YWJsZSBlbnRyeSAqLwotICBpZiAoc2l6ZSA9PSAwKQotICAgIEVSUkVYSVQoc3RhdGUtPmNpbmZvLCBKRVJSX0hVRkZfTUlTU0lOR19DT0RFKTsKLQotICBwdXRfYnVmZmVyICY9ICgoKElOVDMyKSAxKTw8c2l6ZSkgLSAxOyAvKiBtYXNrIG9mZiBhbnkgZXh0cmEgYml0cyBpbiBjb2RlICovCi0gIAotICBwdXRfYml0cyArPSBzaXplOwkJLyogbmV3IG51bWJlciBvZiBiaXRzIGluIGJ1ZmZlciAqLwotICAKLSAgcHV0X2J1ZmZlciA8PD0gMjQgLSBwdXRfYml0czsgLyogYWxpZ24gaW5jb21pbmcgYml0cyAqLwotCi0gIHB1dF9idWZmZXIgfD0gc3RhdGUtPmN1ci5wdXRfYnVmZmVyOyAvKiBhbmQgbWVyZ2Ugd2l0aCBvbGQgYnVmZmVyIGNvbnRlbnRzICovCi0gIAotICB3aGlsZSAocHV0X2JpdHMgPj0gOCkgewotICAgIGludCBjID0gKGludCkgKChwdXRfYnVmZmVyID4+IDE2KSAmIDB4RkYpOwotICAgIAotICAgIGVtaXRfYnl0ZShzdGF0ZSwgYywgcmV0dXJuIEZBTFNFKTsKLSAgICBpZiAoYyA9PSAweEZGKSB7CQkvKiBuZWVkIHRvIHN0dWZmIGEgemVybyBieXRlPyAqLwotICAgICAgZW1pdF9ieXRlKHN0YXRlLCAwLCByZXR1cm4gRkFMU0UpOwotICAgIH0KLSAgICBwdXRfYnVmZmVyIDw8PSA4OwotICAgIHB1dF9iaXRzIC09IDg7Ci0gIH0KLQotICBzdGF0ZS0+Y3VyLnB1dF9idWZmZXIgPSBwdXRfYnVmZmVyOyAvKiB1cGRhdGUgc3RhdGUgdmFyaWFibGVzICovCi0gIHN0YXRlLT5jdXIucHV0X2JpdHMgPSBwdXRfYml0czsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi1MT0NBTChib29sZWFuKQotZmx1c2hfYml0cyAod29ya2luZ19zdGF0ZSAqIHN0YXRlKQotewotICBpZiAoISBlbWl0X2JpdHMoc3RhdGUsIDB4N0YsIDcpKSAvKiBmaWxsIGFueSBwYXJ0aWFsIGJ5dGUgd2l0aCBvbmVzICovCi0gICAgcmV0dXJuIEZBTFNFOwotICBzdGF0ZS0+Y3VyLnB1dF9idWZmZXIgPSAwOwkvKiBhbmQgcmVzZXQgYml0LWJ1ZmZlciB0byBlbXB0eSAqLwotICBzdGF0ZS0+Y3VyLnB1dF9iaXRzID0gMDsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyogRW5jb2RlIGEgc2luZ2xlIGJsb2NrJ3Mgd29ydGggb2YgY29lZmZpY2llbnRzICovCi0KLUxPQ0FMKGJvb2xlYW4pCi1lbmNvZGVfb25lX2Jsb2NrICh3b3JraW5nX3N0YXRlICogc3RhdGUsIEpDT0VGUFRSIGJsb2NrLCBpbnQgbGFzdF9kY192YWwsCi0JCSAgY19kZXJpdmVkX3RibCAqZGN0YmwsIGNfZGVyaXZlZF90YmwgKmFjdGJsKQotewotICByZWdpc3RlciBpbnQgdGVtcCwgdGVtcDI7Ci0gIHJlZ2lzdGVyIGludCBuYml0czsKLSAgcmVnaXN0ZXIgaW50IGssIHIsIGk7Ci0gIAotICAvKiBFbmNvZGUgdGhlIERDIGNvZWZmaWNpZW50IGRpZmZlcmVuY2UgcGVyIHNlY3Rpb24gRi4xLjIuMSAqLwotICAKLSAgdGVtcCA9IHRlbXAyID0gYmxvY2tbMF0gLSBsYXN0X2RjX3ZhbDsKLQotICBpZiAodGVtcCA8IDApIHsKLSAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLwotICAgIC8qIEZvciBhIG5lZ2F0aXZlIGlucHV0LCB3YW50IHRlbXAyID0gYml0d2lzZSBjb21wbGVtZW50IG9mIGFicyhpbnB1dCkgKi8KLSAgICAvKiBUaGlzIGNvZGUgYXNzdW1lcyB3ZSBhcmUgb24gYSB0d28ncyBjb21wbGVtZW50IG1hY2hpbmUgKi8KLSAgICB0ZW1wMi0tOwotICB9Ci0gIAotICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCi0gIG5iaXRzID0gMDsKLSAgd2hpbGUgKHRlbXApIHsKLSAgICBuYml0cysrOwotICAgIHRlbXAgPj49IDE7Ci0gIH0KLSAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBjb2VmZmljaWVudCB2YWx1ZXMuCi0gICAqIFNpbmNlIHdlJ3JlIGVuY29kaW5nIGEgZGlmZmVyZW5jZSwgdGhlIHJhbmdlIGxpbWl0IGlzIHR3aWNlIGFzIG11Y2guCi0gICAqLwotICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKzEpCi0gICAgRVJSRVhJVChzdGF0ZS0+Y2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKLSAgCi0gIC8qIEVtaXQgdGhlIEh1ZmZtYW4tY29kZWQgc3ltYm9sIGZvciB0aGUgbnVtYmVyIG9mIGJpdHMgKi8KLSAgaWYgKCEgZW1pdF9iaXRzKHN0YXRlLCBkY3RibC0+ZWh1ZmNvW25iaXRzXSwgZGN0YmwtPmVodWZzaVtuYml0c10pKQotICAgIHJldHVybiBGQUxTRTsKLQotICAvKiBFbWl0IHRoYXQgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIHZhbHVlLCBpZiBwb3NpdGl2ZSwgKi8KLSAgLyogb3IgdGhlIGNvbXBsZW1lbnQgb2YgaXRzIG1hZ25pdHVkZSwgaWYgbmVnYXRpdmUuICovCi0gIGlmIChuYml0cykJCQkvKiBlbWl0X2JpdHMgcmVqZWN0cyBjYWxscyB3aXRoIHNpemUgMCAqLwotICAgIGlmICghIGVtaXRfYml0cyhzdGF0ZSwgKHVuc2lnbmVkIGludCkgdGVtcDIsIG5iaXRzKSkKLSAgICAgIHJldHVybiBGQUxTRTsKLQotICAvKiBFbmNvZGUgdGhlIEFDIGNvZWZmaWNpZW50cyBwZXIgc2VjdGlvbiBGLjEuMi4yICovCi0gIAotICByID0gMDsJCQkvKiByID0gcnVuIGxlbmd0aCBvZiB6ZXJvcyAqLwotICAKLSAgZm9yIChrID0gMTsgayA8IERDVFNJWkUyOyBrKyspIHsKLSAgICBpZiAoKHRlbXAgPSBibG9ja1tqcGVnX25hdHVyYWxfb3JkZXJba11dKSA9PSAwKSB7Ci0gICAgICByKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIGlmIHJ1biBsZW5ndGggPiAxNSwgbXVzdCBlbWl0IHNwZWNpYWwgcnVuLWxlbmd0aC0xNiBjb2RlcyAoMHhGMCkgKi8KLSAgICAgIHdoaWxlIChyID4gMTUpIHsKLQlpZiAoISBlbWl0X2JpdHMoc3RhdGUsIGFjdGJsLT5laHVmY29bMHhGMF0sIGFjdGJsLT5laHVmc2lbMHhGMF0pKQotCSAgcmV0dXJuIEZBTFNFOwotCXIgLT0gMTY7Ci0gICAgICB9Ci0KLSAgICAgIHRlbXAyID0gdGVtcDsKLSAgICAgIGlmICh0ZW1wIDwgMCkgewotCXRlbXAgPSAtdGVtcDsJCS8qIHRlbXAgaXMgYWJzIHZhbHVlIG9mIGlucHV0ICovCi0JLyogVGhpcyBjb2RlIGFzc3VtZXMgd2UgYXJlIG9uIGEgdHdvJ3MgY29tcGxlbWVudCBtYWNoaW5lICovCi0JdGVtcDItLTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLwotICAgICAgbmJpdHMgPSAxOwkJLyogdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgMSBiaXQgKi8KLSAgICAgIHdoaWxlICgodGVtcCA+Pj0gMSkpCi0JbmJpdHMrKzsKLSAgICAgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzICovCi0gICAgICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKQotCUVSUkVYSVQoc3RhdGUtPmNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7Ci0gICAgICAKLSAgICAgIC8qIEVtaXQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLwotICAgICAgaSA9IChyIDw8IDQpICsgbmJpdHM7Ci0gICAgICBpZiAoISBlbWl0X2JpdHMoc3RhdGUsIGFjdGJsLT5laHVmY29baV0sIGFjdGJsLT5laHVmc2lbaV0pKQotCXJldHVybiBGQUxTRTsKLQotICAgICAgLyogRW1pdCB0aGF0IG51bWJlciBvZiBiaXRzIG9mIHRoZSB2YWx1ZSwgaWYgcG9zaXRpdmUsICovCi0gICAgICAvKiBvciB0aGUgY29tcGxlbWVudCBvZiBpdHMgbWFnbml0dWRlLCBpZiBuZWdhdGl2ZS4gKi8KLSAgICAgIGlmICghIGVtaXRfYml0cyhzdGF0ZSwgKHVuc2lnbmVkIGludCkgdGVtcDIsIG5iaXRzKSkKLQlyZXR1cm4gRkFMU0U7Ci0gICAgICAKLSAgICAgIHIgPSAwOwotICAgIH0KLSAgfQotCi0gIC8qIElmIHRoZSBsYXN0IGNvZWYocykgd2VyZSB6ZXJvLCBlbWl0IGFuIGVuZC1vZi1ibG9jayBjb2RlICovCi0gIGlmIChyID4gMCkKLSAgICBpZiAoISBlbWl0X2JpdHMoc3RhdGUsIGFjdGJsLT5laHVmY29bMF0sIGFjdGJsLT5laHVmc2lbMF0pKQotICAgICAgcmV0dXJuIEZBTFNFOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBFbWl0IGEgcmVzdGFydCBtYXJrZXIgJiByZXN5bmNocm9uaXplIHByZWRpY3Rpb25zLgotICovCi0KLUxPQ0FMKGJvb2xlYW4pCi1lbWl0X3Jlc3RhcnQgKHdvcmtpbmdfc3RhdGUgKiBzdGF0ZSwgaW50IHJlc3RhcnRfbnVtKQotewotICBpbnQgY2k7Ci0KLSAgaWYgKCEgZmx1c2hfYml0cyhzdGF0ZSkpCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIGVtaXRfYnl0ZShzdGF0ZSwgMHhGRiwgcmV0dXJuIEZBTFNFKTsKLSAgZW1pdF9ieXRlKHN0YXRlLCBKUEVHX1JTVDAgKyByZXN0YXJ0X251bSwgcmV0dXJuIEZBTFNFKTsKLQotICAvKiBSZS1pbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KLSAgZm9yIChjaSA9IDA7IGNpIDwgc3RhdGUtPmNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKQotICAgIHN0YXRlLT5jdXIubGFzdF9kY192YWxbY2ldID0gMDsKLQotICAvKiBUaGUgcmVzdGFydCBjb3VudGVyIGlzIG5vdCB1cGRhdGVkIHVudGlsIHdlIHN1Y2Nlc3NmdWxseSB3cml0ZSB0aGUgTUNVLiAqLwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBFbmNvZGUgYW5kIG91dHB1dCBvbmUgTUNVJ3Mgd29ydGggb2YgSHVmZm1hbi1jb21wcmVzc2VkIGNvZWZmaWNpZW50cy4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWVuY29kZV9tY3VfaHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCi17Ci0gIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgd29ya2luZ19zdGF0ZSBzdGF0ZTsKLSAgaW50IGJsa24sIGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLQotICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgKi8KLSAgc3RhdGUubmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOwotICBzdGF0ZS5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKLSAgQVNTSUdOX1NUQVRFKHN0YXRlLmN1ciwgZW50cm9weS0+c2F2ZWQpOwotICBzdGF0ZS5jaW5mbyA9IGNpbmZvOwotCi0gIC8qIEVtaXQgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQotICAgICAgaWYgKCEgZW1pdF9yZXN0YXJ0KCZzdGF0ZSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSkpCi0JcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgLyogRW5jb2RlIHRoZSBNQ1UgZGF0YSBibG9ja3MgKi8KLSAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKLSAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIGlmICghIGVuY29kZV9vbmVfYmxvY2soJnN0YXRlLAotCQkJICAgTUNVX2RhdGFbYmxrbl1bMF0sIHN0YXRlLmN1ci5sYXN0X2RjX3ZhbFtjaV0sCi0JCQkgICBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbY29tcHB0ci0+ZGNfdGJsX25vXSwKLQkJCSAgIGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsc1tjb21wcHRyLT5hY190Ymxfbm9dKSkKLSAgICAgIHJldHVybiBGQUxTRTsKLSAgICAvKiBVcGRhdGUgbGFzdF9kY192YWwgKi8KLSAgICBzdGF0ZS5jdXIubGFzdF9kY192YWxbY2ldID0gTUNVX2RhdGFbYmxrbl1bMF1bMF07Ci0gIH0KLQotICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KLSAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBzdGF0ZS5uZXh0X291dHB1dF9ieXRlOwotICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBzdGF0ZS5mcmVlX2luX2J1ZmZlcjsKLSAgQVNTSUdOX1NUQVRFKGVudHJvcHktPnNhdmVkLCBzdGF0ZS5jdXIpOwotCi0gIC8qIFVwZGF0ZSByZXN0YXJ0LWludGVydmFsIHN0YXRlIHRvbyAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgewotICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLSAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0rKzsKLSAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gJj0gNzsKLSAgICB9Ci0gICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLSAgfQotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiBhIEh1ZmZtYW4tY29tcHJlc3NlZCBzY2FuLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX3Bhc3NfaHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgd29ya2luZ19zdGF0ZSBzdGF0ZTsKLQotICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgLi4uIGZsdXNoX2JpdHMgbmVlZHMgaXQgKi8KLSAgc3RhdGUubmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOwotICBzdGF0ZS5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKLSAgQVNTSUdOX1NUQVRFKHN0YXRlLmN1ciwgZW50cm9weS0+c2F2ZWQpOwotICBzdGF0ZS5jaW5mbyA9IGNpbmZvOwotCi0gIC8qIEZsdXNoIG91dCB0aGUgbGFzdCBkYXRhICovCi0gIGlmICghIGZsdXNoX2JpdHMoJnN0YXRlKSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NBTlRfU1VTUEVORCk7Ci0KLSAgLyogVXBkYXRlIHN0YXRlICovCi0gIGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlID0gc3RhdGUubmV4dF9vdXRwdXRfYnl0ZTsKLSAgY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyID0gc3RhdGUuZnJlZV9pbl9idWZmZXI7Ci0gIEFTU0lHTl9TVEFURShlbnRyb3B5LT5zYXZlZCwgc3RhdGUuY3VyKTsKLX0KLQotCi0vKgotICogSHVmZm1hbiBjb2Rpbmcgb3B0aW1pemF0aW9uLgotICoKLSAqIFdlIGZpcnN0IHNjYW4gdGhlIHN1cHBsaWVkIGRhdGEgYW5kIGNvdW50IHRoZSBudW1iZXIgb2YgdXNlcyBvZiBlYWNoIHN5bWJvbAotICogdGhhdCBpcyB0byBiZSBIdWZmbWFuLWNvZGVkLiAoVGhpcyBwcm9jZXNzIE1VU1QgYWdyZWUgd2l0aCB0aGUgY29kZSBhYm92ZS4pCi0gKiBUaGVuIHdlIGJ1aWxkIGEgSHVmZm1hbiBjb2RpbmcgdHJlZSBmb3IgdGhlIG9ic2VydmVkIGNvdW50cy4KLSAqIFN5bWJvbHMgd2hpY2ggYXJlIG5vdCBuZWVkZWQgYXQgYWxsIGZvciB0aGUgcGFydGljdWxhciBpbWFnZSBhcmUgbm90Ci0gKiBhc3NpZ25lZCBhbnkgY29kZSwgd2hpY2ggc2F2ZXMgc3BhY2UgaW4gdGhlIERIVCBtYXJrZXIgYXMgd2VsbCBhcyBpbgotICogdGhlIGNvbXByZXNzZWQgZGF0YS4KLSAqLwotCi0jaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECi0KLQotLyogUHJvY2VzcyBhIHNpbmdsZSBibG9jaydzIHdvcnRoIG9mIGNvZWZmaWNpZW50cyAqLwotCi1MT0NBTCh2b2lkKQotaHRlc3Rfb25lX2Jsb2NrIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkNPRUZQVFIgYmxvY2ssIGludCBsYXN0X2RjX3ZhbCwKLQkJIGxvbmcgZGNfY291bnRzW10sIGxvbmcgYWNfY291bnRzW10pCi17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICByZWdpc3RlciBpbnQgbmJpdHM7Ci0gIHJlZ2lzdGVyIGludCBrLCByOwotICAKLSAgLyogRW5jb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlIHBlciBzZWN0aW9uIEYuMS4yLjEgKi8KLSAgCi0gIHRlbXAgPSBibG9ja1swXSAtIGxhc3RfZGNfdmFsOwotICBpZiAodGVtcCA8IDApCi0gICAgdGVtcCA9IC10ZW1wOwotICAKLSAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLwotICBuYml0cyA9IDA7Ci0gIHdoaWxlICh0ZW1wKSB7Ci0gICAgbmJpdHMrKzsKLSAgICB0ZW1wID4+PSAxOwotICB9Ci0gIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzLgotICAgKiBTaW5jZSB3ZSdyZSBlbmNvZGluZyBhIGRpZmZlcmVuY2UsIHRoZSByYW5nZSBsaW1pdCBpcyB0d2ljZSBhcyBtdWNoLgotICAgKi8KLSAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUysxKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKLQotICAvKiBDb3VudCB0aGUgSHVmZm1hbiBzeW1ib2wgZm9yIHRoZSBudW1iZXIgb2YgYml0cyAqLwotICBkY19jb3VudHNbbmJpdHNdKys7Ci0gIAotICAvKiBFbmNvZGUgdGhlIEFDIGNvZWZmaWNpZW50cyBwZXIgc2VjdGlvbiBGLjEuMi4yICovCi0gIAotICByID0gMDsJCQkvKiByID0gcnVuIGxlbmd0aCBvZiB6ZXJvcyAqLwotICAKLSAgZm9yIChrID0gMTsgayA8IERDVFNJWkUyOyBrKyspIHsKLSAgICBpZiAoKHRlbXAgPSBibG9ja1tqcGVnX25hdHVyYWxfb3JkZXJba11dKSA9PSAwKSB7Ci0gICAgICByKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIGlmIHJ1biBsZW5ndGggPiAxNSwgbXVzdCBlbWl0IHNwZWNpYWwgcnVuLWxlbmd0aC0xNiBjb2RlcyAoMHhGMCkgKi8KLSAgICAgIHdoaWxlIChyID4gMTUpIHsKLQlhY19jb3VudHNbMHhGMF0rKzsKLQlyIC09IDE2OwotICAgICAgfQotICAgICAgCi0gICAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCi0gICAgICBpZiAodGVtcCA8IDApCi0JdGVtcCA9IC10ZW1wOwotICAgICAgCi0gICAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCi0gICAgICBuYml0cyA9IDE7CQkvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSAxIGJpdCAqLwotICAgICAgd2hpbGUgKCh0ZW1wID4+PSAxKSkKLQluYml0cysrOwotICAgICAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBjb2VmZmljaWVudCB2YWx1ZXMgKi8KLSAgICAgIGlmIChuYml0cyA+IE1BWF9DT0VGX0JJVFMpCi0JRVJSRVhJVChjaW5mbywgSkVSUl9CQURfRENUX0NPRUYpOwotICAgICAgCi0gICAgICAvKiBDb3VudCBIdWZmbWFuIHN5bWJvbCBmb3IgcnVuIGxlbmd0aCAvIG51bWJlciBvZiBiaXRzICovCi0gICAgICBhY19jb3VudHNbKHIgPDwgNCkgKyBuYml0c10rKzsKLSAgICAgIAotICAgICAgciA9IDA7Ci0gICAgfQotICB9Ci0KLSAgLyogSWYgdGhlIGxhc3QgY29lZihzKSB3ZXJlIHplcm8sIGVtaXQgYW4gZW5kLW9mLWJsb2NrIGNvZGUgKi8KLSAgaWYgKHIgPiAwKQotICAgIGFjX2NvdW50c1swXSsrOwotfQotCi0KLS8qCi0gKiBUcmlhbC1lbmNvZGUgb25lIE1DVSdzIHdvcnRoIG9mIEh1ZmZtYW4tY29tcHJlc3NlZCBjb2VmZmljaWVudHMuCi0gKiBObyBkYXRhIGlzIGFjdHVhbGx5IG91dHB1dCwgc28gbm8gc3VzcGVuc2lvbiByZXR1cm4gaXMgcG9zc2libGUuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1lbmNvZGVfbWN1X2dhdGhlciAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCi17Ci0gIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgaW50IGJsa24sIGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLQotICAvKiBUYWtlIGNhcmUgb2YgcmVzdGFydCBpbnRlcnZhbHMgaWYgbmVlZGVkICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKSB7Ci0gICAgICAvKiBSZS1pbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KLSAgICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKQotCWVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7Ci0gICAgICAvKiBVcGRhdGUgcmVzdGFydCBzdGF0ZSAqLwotICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLSAgICB9Ci0gICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLSAgfQotCi0gIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7Ci0gICAgY2kgPSBjaW5mby0+TUNVX21lbWJlcnNoaXBbYmxrbl07Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICBodGVzdF9vbmVfYmxvY2soY2luZm8sIE1DVV9kYXRhW2Jsa25dWzBdLCBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0sCi0JCSAgICBlbnRyb3B5LT5kY19jb3VudF9wdHJzW2NvbXBwdHItPmRjX3RibF9ub10sCi0JCSAgICBlbnRyb3B5LT5hY19jb3VudF9wdHJzW2NvbXBwdHItPmFjX3RibF9ub10pOwotICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IE1DVV9kYXRhW2Jsa25dWzBdWzBdOwotICB9Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIEdlbmVyYXRlIHRoZSBiZXN0IEh1ZmZtYW4gY29kZSB0YWJsZSBmb3IgdGhlIGdpdmVuIGNvdW50cywgZmlsbCBodGJsLgotICogTm90ZSB0aGlzIGlzIGFsc28gdXNlZCBieSBqY3BodWZmLmMuCi0gKgotICogVGhlIEpQRUcgc3RhbmRhcmQgcmVxdWlyZXMgdGhhdCBubyBzeW1ib2wgYmUgYXNzaWduZWQgYSBjb2Rld29yZCBvZiBhbGwKLSAqIG9uZSBiaXRzIChzbyB0aGF0IHBhZGRpbmcgYml0cyBhZGRlZCBhdCB0aGUgZW5kIG9mIGEgY29tcHJlc3NlZCBzZWdtZW50Ci0gKiBjYW4ndCBsb29rIGxpa2UgYSB2YWxpZCBjb2RlKS4gIEJlY2F1c2Ugb2YgdGhlIGNhbm9uaWNhbCBvcmRlcmluZyBvZgotICogY29kZXdvcmRzLCB0aGlzIGp1c3QgbWVhbnMgdGhhdCB0aGVyZSBtdXN0IGJlIGFuIHVudXNlZCBzbG90IGluIHRoZQotICogbG9uZ2VzdCBjb2Rld29yZCBsZW5ndGggY2F0ZWdvcnkuICBTZWN0aW9uIEsuMiBvZiB0aGUgSlBFRyBzcGVjIHN1Z2dlc3RzCi0gKiByZXNlcnZpbmcgc3VjaCBhIHNsb3QgYnkgcHJldGVuZGluZyB0aGF0IHN5bWJvbCAyNTYgaXMgYSB2YWxpZCBzeW1ib2wKLSAqIHdpdGggY291bnQgMS4gIEluIHRoZW9yeSB0aGF0J3Mgbm90IG9wdGltYWw7IGdpdmluZyBpdCBjb3VudCB6ZXJvIGJ1dAotICogaW5jbHVkaW5nIGl0IGluIHRoZSBzeW1ib2wgc2V0IGFueXdheSBzaG91bGQgZ2l2ZSBhIGJldHRlciBIdWZmbWFuIGNvZGUuCi0gKiBCdXQgdGhlIHRoZW9yZXRpY2FsbHkgYmV0dGVyIGNvZGUgYWN0dWFsbHkgc2VlbXMgdG8gY29tZSBvdXQgd29yc2UgaW4KLSAqIHByYWN0aWNlLCBiZWNhdXNlIGl0IHByb2R1Y2VzIG1vcmUgYWxsLW9uZXMgYnl0ZXMgKHdoaWNoIGluY3VyIHN0dWZmZWQKLSAqIHplcm8gYnl0ZXMgaW4gdGhlIGZpbmFsIGZpbGUpLiAgSW4gYW55IGNhc2UgdGhlIGRpZmZlcmVuY2UgaXMgdGlueS4KLSAqCi0gKiBUaGUgSlBFRyBzdGFuZGFyZCByZXF1aXJlcyBIdWZmbWFuIGNvZGVzIHRvIGJlIG5vIG1vcmUgdGhhbiAxNiBiaXRzIGxvbmcuCi0gKiBJZiBzb21lIHN5bWJvbHMgaGF2ZSBhIHZlcnkgc21hbGwgYnV0IG5vbnplcm8gcHJvYmFiaWxpdHksIHRoZSBIdWZmbWFuIHRyZWUKLSAqIG11c3QgYmUgYWRqdXN0ZWQgdG8gbWVldCB0aGUgY29kZSBsZW5ndGggcmVzdHJpY3Rpb24uICBXZSBjdXJyZW50bHkgdXNlCi0gKiB0aGUgYWRqdXN0bWVudCBtZXRob2Qgc3VnZ2VzdGVkIGluIEpQRUcgc2VjdGlvbiBLLjIuICBUaGlzIG1ldGhvZCBpcyAqbm90KgotICogb3B0aW1hbDsgaXQgbWF5IG5vdCBjaG9vc2UgdGhlIGJlc3QgcG9zc2libGUgbGltaXRlZC1sZW5ndGggY29kZS4gIEJ1dAotICogdHlwaWNhbGx5IG9ubHkgdmVyeS1sb3ctZnJlcXVlbmN5IHN5bWJvbHMgd2lsbCBiZSBnaXZlbiBsZXNzLXRoYW4tb3B0aW1hbAotICogbGVuZ3Rocywgc28gdGhlIGNvZGUgaXMgYWxtb3N0IG9wdGltYWwuICBFeHBlcmltZW50YWwgY29tcGFyaXNvbnMgYWdhaW5zdAotICogYW4gb3B0aW1hbCBsaW1pdGVkLWxlbmd0aC1jb2RlIGFsZ29yaXRobSBpbmRpY2F0ZSB0aGF0IHRoZSBkaWZmZXJlbmNlIGlzCi0gKiBtaWNyb3Njb3BpYyAtLS0gdXN1YWxseSBsZXNzIHRoYW4gYSBodW5kcmVkdGggb2YgYSBwZXJjZW50IG9mIHRvdGFsIHNpemUuCi0gKiBTbyB0aGUgZXh0cmEgY29tcGxleGl0eSBvZiBhbiBvcHRpbWFsIGFsZ29yaXRobSBkb2Vzbid0IHNlZW0gd29ydGh3aGlsZS4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfZ2VuX29wdGltYWxfdGFibGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKSFVGRl9UQkwgKiBodGJsLCBsb25nIGZyZXFbXSkKLXsKLSNkZWZpbmUgTUFYX0NMRU4gMzIJCS8qIGFzc3VtZWQgbWF4aW11bSBpbml0aWFsIGNvZGUgbGVuZ3RoICovCi0gIFVJTlQ4IGJpdHNbTUFYX0NMRU4rMV07CS8qIGJpdHNba10gPSAjIG9mIHN5bWJvbHMgd2l0aCBjb2RlIGxlbmd0aCBrICovCi0gIGludCBjb2Rlc2l6ZVsyNTddOwkJLyogY29kZXNpemVba10gPSBjb2RlIGxlbmd0aCBvZiBzeW1ib2wgayAqLwotICBpbnQgb3RoZXJzWzI1N107CQkvKiBuZXh0IHN5bWJvbCBpbiBjdXJyZW50IGJyYW5jaCBvZiB0cmVlICovCi0gIGludCBjMSwgYzI7Ci0gIGludCBwLCBpLCBqOwotICBsb25nIHY7Ci0KLSAgLyogVGhpcyBhbGdvcml0aG0gaXMgZXhwbGFpbmVkIGluIHNlY3Rpb24gSy4yIG9mIHRoZSBKUEVHIHN0YW5kYXJkICovCi0KLSAgTUVNWkVSTyhiaXRzLCBTSVpFT0YoYml0cykpOwotICBNRU1aRVJPKGNvZGVzaXplLCBTSVpFT0YoY29kZXNpemUpKTsKLSAgZm9yIChpID0gMDsgaSA8IDI1NzsgaSsrKQotICAgIG90aGVyc1tpXSA9IC0xOwkJLyogaW5pdCBsaW5rcyB0byBlbXB0eSAqLwotICAKLSAgZnJlcVsyNTZdID0gMTsJCS8qIG1ha2Ugc3VyZSAyNTYgaGFzIGEgbm9uemVybyBjb3VudCAqLwotICAvKiBJbmNsdWRpbmcgdGhlIHBzZXVkby1zeW1ib2wgMjU2IGluIHRoZSBIdWZmbWFuIHByb2NlZHVyZSBndWFyYW50ZWVzCi0gICAqIHRoYXQgbm8gcmVhbCBzeW1ib2wgaXMgZ2l2ZW4gY29kZS12YWx1ZSBvZiBhbGwgb25lcywgYmVjYXVzZSAyNTYKLSAgICogd2lsbCBiZSBwbGFjZWQgbGFzdCBpbiB0aGUgbGFyZ2VzdCBjb2Rld29yZCBjYXRlZ29yeS4KLSAgICovCi0KLSAgLyogSHVmZm1hbidzIGJhc2ljIGFsZ29yaXRobSB0byBhc3NpZ24gb3B0aW1hbCBjb2RlIGxlbmd0aHMgdG8gc3ltYm9scyAqLwotCi0gIGZvciAoOzspIHsKLSAgICAvKiBGaW5kIHRoZSBzbWFsbGVzdCBub256ZXJvIGZyZXF1ZW5jeSwgc2V0IGMxID0gaXRzIHN5bWJvbCAqLwotICAgIC8qIEluIGNhc2Ugb2YgdGllcywgdGFrZSB0aGUgbGFyZ2VyIHN5bWJvbCBudW1iZXIgKi8KLSAgICBjMSA9IC0xOwotICAgIHYgPSAxMDAwMDAwMDAwTDsKLSAgICBmb3IgKGkgPSAwOyBpIDw9IDI1NjsgaSsrKSB7Ci0gICAgICBpZiAoZnJlcVtpXSAmJiBmcmVxW2ldIDw9IHYpIHsKLQl2ID0gZnJlcVtpXTsKLQljMSA9IGk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogRmluZCB0aGUgbmV4dCBzbWFsbGVzdCBub256ZXJvIGZyZXF1ZW5jeSwgc2V0IGMyID0gaXRzIHN5bWJvbCAqLwotICAgIC8qIEluIGNhc2Ugb2YgdGllcywgdGFrZSB0aGUgbGFyZ2VyIHN5bWJvbCBudW1iZXIgKi8KLSAgICBjMiA9IC0xOwotICAgIHYgPSAxMDAwMDAwMDAwTDsKLSAgICBmb3IgKGkgPSAwOyBpIDw9IDI1NjsgaSsrKSB7Ci0gICAgICBpZiAoZnJlcVtpXSAmJiBmcmVxW2ldIDw9IHYgJiYgaSAhPSBjMSkgewotCXYgPSBmcmVxW2ldOwotCWMyID0gaTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBEb25lIGlmIHdlJ3ZlIG1lcmdlZCBldmVyeXRoaW5nIGludG8gb25lIGZyZXF1ZW5jeSAqLwotICAgIGlmIChjMiA8IDApCi0gICAgICBicmVhazsKLSAgICAKLSAgICAvKiBFbHNlIG1lcmdlIHRoZSB0d28gY291bnRzL3RyZWVzICovCi0gICAgZnJlcVtjMV0gKz0gZnJlcVtjMl07Ci0gICAgZnJlcVtjMl0gPSAwOwotCi0gICAgLyogSW5jcmVtZW50IHRoZSBjb2Rlc2l6ZSBvZiBldmVyeXRoaW5nIGluIGMxJ3MgdHJlZSBicmFuY2ggKi8KLSAgICBjb2Rlc2l6ZVtjMV0rKzsKLSAgICB3aGlsZSAob3RoZXJzW2MxXSA+PSAwKSB7Ci0gICAgICBjMSA9IG90aGVyc1tjMV07Ci0gICAgICBjb2Rlc2l6ZVtjMV0rKzsKLSAgICB9Ci0gICAgCi0gICAgb3RoZXJzW2MxXSA9IGMyOwkJLyogY2hhaW4gYzIgb250byBjMSdzIHRyZWUgYnJhbmNoICovCi0gICAgCi0gICAgLyogSW5jcmVtZW50IHRoZSBjb2Rlc2l6ZSBvZiBldmVyeXRoaW5nIGluIGMyJ3MgdHJlZSBicmFuY2ggKi8KLSAgICBjb2Rlc2l6ZVtjMl0rKzsKLSAgICB3aGlsZSAob3RoZXJzW2MyXSA+PSAwKSB7Ci0gICAgICBjMiA9IG90aGVyc1tjMl07Ci0gICAgICBjb2Rlc2l6ZVtjMl0rKzsKLSAgICB9Ci0gIH0KLQotICAvKiBOb3cgY291bnQgdGhlIG51bWJlciBvZiBzeW1ib2xzIG9mIGVhY2ggY29kZSBsZW5ndGggKi8KLSAgZm9yIChpID0gMDsgaSA8PSAyNTY7IGkrKykgewotICAgIGlmIChjb2Rlc2l6ZVtpXSkgewotICAgICAgLyogVGhlIEpQRUcgc3RhbmRhcmQgc2VlbXMgdG8gdGhpbmsgdGhhdCB0aGlzIGNhbid0IGhhcHBlbiwgKi8KLSAgICAgIC8qIGJ1dCBJJ20gcGFyYW5vaWQuLi4gKi8KLSAgICAgIGlmIChjb2Rlc2l6ZVtpXSA+IE1BWF9DTEVOKQotCUVSUkVYSVQoY2luZm8sIEpFUlJfSFVGRl9DTEVOX09WRVJGTE9XKTsKLQotICAgICAgYml0c1tjb2Rlc2l6ZVtpXV0rKzsKLSAgICB9Ci0gIH0KLQotICAvKiBKUEVHIGRvZXNuJ3QgYWxsb3cgc3ltYm9scyB3aXRoIGNvZGUgbGVuZ3RocyBvdmVyIDE2IGJpdHMsIHNvIGlmIHRoZSBwdXJlCi0gICAqIEh1ZmZtYW4gcHJvY2VkdXJlIGFzc2lnbmVkIGFueSBzdWNoIGxlbmd0aHMsIHdlIG11c3QgYWRqdXN0IHRoZSBjb2RpbmcuCi0gICAqIEhlcmUgaXMgd2hhdCB0aGUgSlBFRyBzcGVjIHNheXMgYWJvdXQgaG93IHRoaXMgbmV4dCBiaXQgd29ya3M6Ci0gICAqIFNpbmNlIHN5bWJvbHMgYXJlIHBhaXJlZCBmb3IgdGhlIGxvbmdlc3QgSHVmZm1hbiBjb2RlLCB0aGUgc3ltYm9scyBhcmUKLSAgICogcmVtb3ZlZCBmcm9tIHRoaXMgbGVuZ3RoIGNhdGVnb3J5IHR3byBhdCBhIHRpbWUuICBUaGUgcHJlZml4IGZvciB0aGUgcGFpcgotICAgKiAod2hpY2ggaXMgb25lIGJpdCBzaG9ydGVyKSBpcyBhbGxvY2F0ZWQgdG8gb25lIG9mIHRoZSBwYWlyOyB0aGVuLAotICAgKiBza2lwcGluZyB0aGUgQklUUyBlbnRyeSBmb3IgdGhhdCBwcmVmaXggbGVuZ3RoLCBhIGNvZGUgd29yZCBmcm9tIHRoZSBuZXh0Ci0gICAqIHNob3J0ZXN0IG5vbnplcm8gQklUUyBlbnRyeSBpcyBjb252ZXJ0ZWQgaW50byBhIHByZWZpeCBmb3IgdHdvIGNvZGUgd29yZHMKLSAgICogb25lIGJpdCBsb25nZXIuCi0gICAqLwotICAKLSAgZm9yIChpID0gTUFYX0NMRU47IGkgPiAxNjsgaS0tKSB7Ci0gICAgd2hpbGUgKGJpdHNbaV0gPiAwKSB7Ci0gICAgICBqID0gaSAtIDI7CQkvKiBmaW5kIGxlbmd0aCBvZiBuZXcgcHJlZml4IHRvIGJlIHVzZWQgKi8KLSAgICAgIHdoaWxlIChiaXRzW2pdID09IDApCi0Jai0tOwotICAgICAgCi0gICAgICBiaXRzW2ldIC09IDI7CQkvKiByZW1vdmUgdHdvIHN5bWJvbHMgKi8KLSAgICAgIGJpdHNbaS0xXSsrOwkJLyogb25lIGdvZXMgaW4gdGhpcyBsZW5ndGggKi8KLSAgICAgIGJpdHNbaisxXSArPSAyOwkJLyogdHdvIG5ldyBzeW1ib2xzIGluIHRoaXMgbGVuZ3RoICovCi0gICAgICBiaXRzW2pdLS07CQkvKiBzeW1ib2wgb2YgdGhpcyBsZW5ndGggaXMgbm93IGEgcHJlZml4ICovCi0gICAgfQotICB9Ci0KLSAgLyogUmVtb3ZlIHRoZSBjb3VudCBmb3IgdGhlIHBzZXVkby1zeW1ib2wgMjU2IGZyb20gdGhlIGxhcmdlc3QgY29kZWxlbmd0aCAqLwotICB3aGlsZSAoYml0c1tpXSA9PSAwKQkJLyogZmluZCBsYXJnZXN0IGNvZGVsZW5ndGggc3RpbGwgaW4gdXNlICovCi0gICAgaS0tOwotICBiaXRzW2ldLS07Ci0gIAotICAvKiBSZXR1cm4gZmluYWwgc3ltYm9sIGNvdW50cyAob25seSBmb3IgbGVuZ3RocyAwLi4xNikgKi8KLSAgTUVNQ09QWShodGJsLT5iaXRzLCBiaXRzLCBTSVpFT0YoaHRibC0+Yml0cykpOwotICAKLSAgLyogUmV0dXJuIGEgbGlzdCBvZiB0aGUgc3ltYm9scyBzb3J0ZWQgYnkgY29kZSBsZW5ndGggKi8KLSAgLyogSXQncyBub3QgcmVhbCBjbGVhciB0byBtZSB3aHkgd2UgZG9uJ3QgbmVlZCB0byBjb25zaWRlciB0aGUgY29kZWxlbmd0aAotICAgKiBjaGFuZ2VzIG1hZGUgYWJvdmUsIGJ1dCB0aGUgSlBFRyBzcGVjIHNlZW1zIHRvIHRoaW5rIHRoaXMgd29ya3MuCi0gICAqLwotICBwID0gMDsKLSAgZm9yIChpID0gMTsgaSA8PSBNQVhfQ0xFTjsgaSsrKSB7Ci0gICAgZm9yIChqID0gMDsgaiA8PSAyNTU7IGorKykgewotICAgICAgaWYgKGNvZGVzaXplW2pdID09IGkpIHsKLQlodGJsLT5odWZmdmFsW3BdID0gKFVJTlQ4KSBqOwotCXArKzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBTZXQgc2VudF90YWJsZSBGQUxTRSBzbyB1cGRhdGVkIHRhYmxlIHdpbGwgYmUgd3JpdHRlbiB0byBKUEVHIGZpbGUuICovCi0gIGh0YmwtPnNlbnRfdGFibGUgPSBGQUxTRTsKLX0KLQotCi0vKgotICogRmluaXNoIHVwIGEgc3RhdGlzdGljcy1nYXRoZXJpbmcgcGFzcyBhbmQgY3JlYXRlIHRoZSBuZXcgSHVmZm1hbiB0YWJsZXMuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1maW5pc2hfcGFzc19nYXRoZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGludCBjaSwgZGN0YmwsIGFjdGJsOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLSAgSkhVRkZfVEJMICoqaHRibHB0cjsKLSAgYm9vbGVhbiBkaWRfZGNbTlVNX0hVRkZfVEJMU107Ci0gIGJvb2xlYW4gZGlkX2FjW05VTV9IVUZGX1RCTFNdOwotCi0gIC8qIEl0J3MgaW1wb3J0YW50IG5vdCB0byBhcHBseSBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlIG1vcmUgdGhhbiBvbmNlCi0gICAqIHBlciB0YWJsZSwgYmVjYXVzZSBpdCBjbG9iYmVycyB0aGUgaW5wdXQgZnJlcXVlbmN5IGNvdW50cyEKLSAgICovCi0gIE1FTVpFUk8oZGlkX2RjLCBTSVpFT0YoZGlkX2RjKSk7Ci0gIE1FTVpFUk8oZGlkX2FjLCBTSVpFT0YoZGlkX2FjKSk7Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIGRjdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOwotICAgIGFjdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOwotICAgIGlmICghIGRpZF9kY1tkY3RibF0pIHsKLSAgICAgIGh0YmxwdHIgPSAmIGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2RjdGJsXTsKLSAgICAgIGlmICgqaHRibHB0ciA9PSBOVUxMKQotCSpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICAgIGpwZWdfZ2VuX29wdGltYWxfdGFibGUoY2luZm8sICpodGJscHRyLCBlbnRyb3B5LT5kY19jb3VudF9wdHJzW2RjdGJsXSk7Ci0gICAgICBkaWRfZGNbZGN0YmxdID0gVFJVRTsKLSAgICB9Ci0gICAgaWYgKCEgZGlkX2FjW2FjdGJsXSkgewotICAgICAgaHRibHB0ciA9ICYgY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbYWN0YmxdOwotICAgICAgaWYgKCpodGJscHRyID09IE5VTEwpCi0JKmh0YmxwdHIgPSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAgICAganBlZ19nZW5fb3B0aW1hbF90YWJsZShjaW5mbywgKmh0YmxwdHIsIGVudHJvcHktPmFjX2NvdW50X3B0cnNbYWN0YmxdKTsKLSAgICAgIGRpZF9hY1thY3RibF0gPSBUUlVFOwotICAgIH0KLSAgfQotfQotCi0KLSNlbmRpZiAvKiBFTlRST1BZX09QVF9TVVBQT1JURUQgKi8KLQotCi0vKgotICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIEh1ZmZtYW4gZW50cm9weSBlbmNvZGluZy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2h1ZmZfZW5jb2RlciAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weTsKLSAgaW50IGk7Ci0KLSAgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKGh1ZmZfZW50cm9weV9lbmNvZGVyKSk7Ci0gIGNpbmZvLT5lbnRyb3B5ID0gKHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciAqKSBlbnRyb3B5OwotICBlbnRyb3B5LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfaHVmZjsKLQotICAvKiBNYXJrIHRhYmxlcyB1bmFsbG9jYXRlZCAqLwotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7Ci0gICAgZW50cm9weS0+ZGNfZGVyaXZlZF90YmxzW2ldID0gZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2ldID0gTlVMTDsKLSNpZmRlZiBFTlRST1BZX09QVF9TVVBQT1JURUQKLSAgICBlbnRyb3B5LT5kY19jb3VudF9wdHJzW2ldID0gZW50cm9weS0+YWNfY291bnRfcHRyc1tpXSA9IE5VTEw7Ci0jZW5kaWYKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjaW5pdC5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjaW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWZmZmUzLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY2luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBqY2luaXQuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGluaXRpYWxpemF0aW9uIGxvZ2ljIGZvciB0aGUgSlBFRyBjb21wcmVzc29yLgotICogVGhpcyByb3V0aW5lIGlzIGluIGNoYXJnZSBvZiBzZWxlY3RpbmcgdGhlIG1vZHVsZXMgdG8gYmUgZXhlY3V0ZWQgYW5kCi0gKiBtYWtpbmcgYW4gaW5pdGlhbGl6YXRpb24gY2FsbCB0byBlYWNoIG9uZS4KLSAqCi0gKiBMb2dpY2FsbHksIHRoaXMgY29kZSBiZWxvbmdzIGluIGpjbWFzdGVyLmMuICBJdCdzIHNwbGl0IG91dCBiZWNhdXNlCi0gKiBsaW5raW5nIHRoaXMgcm91dGluZSBpbXBsaWVzIGxpbmtpbmcgdGhlIGVudGlyZSBjb21wcmVzc2lvbiBsaWJyYXJ5LgotICogRm9yIGEgdHJhbnNjb2Rpbmctb25seSBhcHBsaWNhdGlvbiwgd2Ugd2FudCB0byBiZSBhYmxlIHRvIHVzZSBqY21hc3Rlci5jCi0gKiB3aXRob3V0IGxpbmtpbmcgaW4gdGhlIHdob2xlIGxpYnJhcnkuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qCi0gKiBNYXN0ZXIgc2VsZWN0aW9uIG9mIGNvbXByZXNzaW9uIG1vZHVsZXMuCi0gKiBUaGlzIGlzIGRvbmUgb25jZSBhdCB0aGUgc3RhcnQgb2YgcHJvY2Vzc2luZyBhbiBpbWFnZS4gIFdlIGRldGVybWluZQotICogd2hpY2ggbW9kdWxlcyB3aWxsIGJlIHVzZWQgYW5kIGdpdmUgdGhlbSBhcHByb3ByaWF0ZSBpbml0aWFsaXphdGlvbiBjYWxscy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2NvbXByZXNzX21hc3RlciAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIC8qIEluaXRpYWxpemUgbWFzdGVyIGNvbnRyb2wgKGluY2x1ZGVzIHBhcmFtZXRlciBjaGVja2luZy9wcm9jZXNzaW5nKSAqLwotICBqaW5pdF9jX21hc3Rlcl9jb250cm9sKGNpbmZvLCBGQUxTRSAvKiBmdWxsIGNvbXByZXNzaW9uICovKTsKLQotICAvKiBQcmVwcm9jZXNzaW5nICovCi0gIGlmICghIGNpbmZvLT5yYXdfZGF0YV9pbikgewotICAgIGppbml0X2NvbG9yX2NvbnZlcnRlcihjaW5mbyk7Ci0gICAgamluaXRfZG93bnNhbXBsZXIoY2luZm8pOwotICAgIGppbml0X2NfcHJlcF9jb250cm9sbGVyKGNpbmZvLCBGQUxTRSAvKiBuZXZlciBuZWVkIGZ1bGwgYnVmZmVyIGhlcmUgKi8pOwotICB9Ci0gIC8qIEZvcndhcmQgRENUICovCi0gIGppbml0X2ZvcndhcmRfZGN0KGNpbmZvKTsKLSAgLyogRW50cm9weSBlbmNvZGluZzogZWl0aGVyIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYyBjb2RpbmcuICovCi0gIGlmIChjaW5mby0+YXJpdGhfY29kZSkgewotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQVJJVEhfTk9USU1QTCk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7Ci0jaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgICAgIGppbml0X3BodWZmX2VuY29kZXIoY2luZm8pOwotI2Vsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICAgIH0gZWxzZQotICAgICAgamluaXRfaHVmZl9lbmNvZGVyKGNpbmZvKTsKLSAgfQotCi0gIC8qIE5lZWQgYSBmdWxsLWltYWdlIGNvZWZmaWNpZW50IGJ1ZmZlciBpbiBhbnkgbXVsdGktcGFzcyBtb2RlLiAqLwotICBqaW5pdF9jX2NvZWZfY29udHJvbGxlcihjaW5mbywKLQkJKGJvb2xlYW4pIChjaW5mby0+bnVtX3NjYW5zID4gMSB8fCBjaW5mby0+b3B0aW1pemVfY29kaW5nKSk7Ci0gIGppbml0X2NfbWFpbl9jb250cm9sbGVyKGNpbmZvLCBGQUxTRSAvKiBuZXZlciBuZWVkIGZ1bGwgYnVmZmVyIGhlcmUgKi8pOwotCi0gIGppbml0X21hcmtlcl93cml0ZXIoY2luZm8pOwotCi0gIC8qIFdlIGNhbiBub3cgdGVsbCB0aGUgbWVtb3J5IG1hbmFnZXIgdG8gYWxsb2NhdGUgdmlydHVhbCBhcnJheXMuICovCi0gICgqY2luZm8tPm1lbS0+cmVhbGl6ZV92aXJ0X2FycmF5cykgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLQotICAvKiBXcml0ZSB0aGUgZGF0YXN0cmVhbSBoZWFkZXIgKFNPSSkgaW1tZWRpYXRlbHkuCi0gICAqIEZyYW1lIGFuZCBzY2FuIGhlYWRlcnMgYXJlIHBvc3Rwb25lZCB0aWxsIGxhdGVyLgotICAgKiBUaGlzIGxldHMgYXBwbGljYXRpb24gaW5zZXJ0IHNwZWNpYWwgbWFya2VycyBhZnRlciB0aGUgU09JLgotICAgKi8KLSAgKCpjaW5mby0+bWFya2VyLT53cml0ZV9maWxlX2hlYWRlcikgKGNpbmZvKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY21haW5jdC5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjbWFpbmN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMjc5YTcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjbWFpbmN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTMgKzAsMCBAQAotLyoKLSAqIGpjbWFpbmN0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBidWZmZXIgY29udHJvbGxlciBmb3IgY29tcHJlc3Npb24uCi0gKiBUaGUgbWFpbiBidWZmZXIgbGllcyBiZXR3ZWVuIHRoZSBwcmUtcHJvY2Vzc29yIGFuZCB0aGUgSlBFRwotICogY29tcHJlc3NvciBwcm9wZXI7IGl0IGhvbGRzIGRvd25zYW1wbGVkIGRhdGEgaW4gdGhlIEpQRUcgY29sb3JzcGFjZS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyogTm90ZTogY3VycmVudGx5LCB0aGVyZSBpcyBubyBvcGVyYXRpbmcgbW9kZSBpbiB3aGljaCBhIGZ1bGwtaW1hZ2UgYnVmZmVyCi0gKiBpcyBuZWVkZWQgYXQgdGhpcyBzdGVwLiAgSWYgdGhlcmUgd2VyZSwgdGhhdCBtb2RlIGNvdWxkIG5vdCBiZSB1c2VkIHdpdGgKLSAqICJyYXcgZGF0YSIgaW5wdXQsIHNpbmNlIHRoaXMgbW9kdWxlIGlzIGJ5cGFzc2VkIGluIHRoYXQgY2FzZS4gIEhvd2V2ZXIsCi0gKiB3ZSd2ZSBsZWZ0IHRoZSBjb2RlIGhlcmUgZm9yIHBvc3NpYmxlIHVzZSBpbiBzcGVjaWFsIGFwcGxpY2F0aW9ucy4KLSAqLwotI3VuZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECi0KLQotLyogUHJpdmF0ZSBidWZmZXIgY29udHJvbGxlciBvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19jX21haW5fY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICBKRElNRU5TSU9OIGN1cl9pTUNVX3JvdzsJLyogbnVtYmVyIG9mIGN1cnJlbnQgaU1DVSByb3cgKi8KLSAgSkRJTUVOU0lPTiByb3dncm91cF9jdHI7CS8qIGNvdW50cyByb3cgZ3JvdXBzIHJlY2VpdmVkIGluIGlNQ1Ugcm93ICovCi0gIGJvb2xlYW4gc3VzcGVuZGVkOwkJLyogcmVtZW1iZXIgaWYgd2Ugc3VzcGVuZGVkIG91dHB1dCAqLwotICBKX0JVRl9NT0RFIHBhc3NfbW9kZTsJCS8qIGN1cnJlbnQgb3BlcmF0aW5nIG1vZGUgKi8KLQotICAvKiBJZiB1c2luZyBqdXN0IGEgc3RyaXAgYnVmZmVyLCB0aGlzIHBvaW50cyB0byB0aGUgZW50aXJlIHNldCBvZiBidWZmZXJzCi0gICAqICh3ZSBhbGxvY2F0ZSBvbmUgZm9yIGVhY2ggY29tcG9uZW50KS4gIEluIHRoZSBmdWxsLWltYWdlIGNhc2UsIHRoaXMKLSAgICogcG9pbnRzIHRvIHRoZSBjdXJyZW50bHkgYWNjZXNzaWJsZSBzdHJpcHMgb2YgdGhlIHZpcnR1YWwgYXJyYXlzLgotICAgKi8KLSAgSlNBTVBBUlJBWSBidWZmZXJbTUFYX0NPTVBPTkVOVFNdOwotCi0jaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKLSAgLyogSWYgdXNpbmcgZnVsbC1pbWFnZSBzdG9yYWdlLCB0aGlzIGFycmF5IGhvbGRzIHBvaW50ZXJzIHRvIHZpcnR1YWwtYXJyYXkKLSAgICogY29udHJvbCBibG9ja3MgZm9yIGVhY2ggY29tcG9uZW50LiAgVW51c2VkIGlmIG5vdCBmdWxsLWltYWdlIHN0b3JhZ2UuCi0gICAqLwotICBqdmlydF9zYXJyYXlfcHRyIHdob2xlX2ltYWdlW01BWF9DT01QT05FTlRTXTsKLSNlbmRpZgotfSBteV9tYWluX2NvbnRyb2xsZXI7Ci0KLXR5cGVkZWYgbXlfbWFpbl9jb250cm9sbGVyICogbXlfbWFpbl9wdHI7Ci0KLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLU1FVEhPRERFRih2b2lkKSBwcm9jZXNzX2RhdGFfc2ltcGxlX21haW4KLQlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIGlucHV0X2J1ZiwKLQkgICAgIEpESU1FTlNJT04gKmluX3Jvd19jdHIsIEpESU1FTlNJT04gaW5fcm93c19hdmFpbCkpOwotI2lmZGVmIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVECi1NRVRIT0RERUYodm9pZCkgcHJvY2Vzc19kYXRhX2J1ZmZlcl9tYWluCi0JSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBBUlJBWSBpbnB1dF9idWYsCi0JICAgICBKRElNRU5TSU9OICppbl9yb3dfY3RyLCBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwpKTsKLSNlbmRpZgotCi0KLS8qCi0gKiBJbml0aWFsaXplIGZvciBhIHByb2Nlc3NpbmcgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfbWFpbiAoal9jb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKQotewotICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKLQotICAvKiBEbyBub3RoaW5nIGluIHJhdy1kYXRhIG1vZGUuICovCi0gIGlmIChjaW5mby0+cmF3X2RhdGFfaW4pCi0gICAgcmV0dXJuOwotCi0gIG1haW4tPmN1cl9pTUNVX3JvdyA9IDA7CS8qIGluaXRpYWxpemUgY291bnRlcnMgKi8KLSAgbWFpbi0+cm93Z3JvdXBfY3RyID0gMDsKLSAgbWFpbi0+c3VzcGVuZGVkID0gRkFMU0U7Ci0gIG1haW4tPnBhc3NfbW9kZSA9IHBhc3NfbW9kZTsJLyogc2F2ZSBtb2RlIGZvciB1c2UgYnkgcHJvY2Vzc19kYXRhICovCi0KLSAgc3dpdGNoIChwYXNzX21vZGUpIHsKLSAgY2FzZSBKQlVGX1BBU1NfVEhSVToKLSNpZmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAotICAgIGlmIChtYWluLT53aG9sZV9pbWFnZVswXSAhPSBOVUxMKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotI2VuZGlmCi0gICAgbWFpbi0+cHViLnByb2Nlc3NfZGF0YSA9IHByb2Nlc3NfZGF0YV9zaW1wbGVfbWFpbjsKLSAgICBicmVhazsKLSNpZmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAotICBjYXNlIEpCVUZfU0FWRV9TT1VSQ0U6Ci0gIGNhc2UgSkJVRl9DUkFOS19ERVNUOgotICBjYXNlIEpCVUZfU0FWRV9BTkRfUEFTUzoKLSAgICBpZiAobWFpbi0+d2hvbGVfaW1hZ2VbMF0gPT0gTlVMTCkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLSAgICBtYWluLT5wdWIucHJvY2Vzc19kYXRhID0gcHJvY2Vzc19kYXRhX2J1ZmZlcl9tYWluOwotICAgIGJyZWFrOwotI2VuZGlmCi0gIGRlZmF1bHQ6Ci0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotICAgIGJyZWFrOwotICB9Ci19Ci0KLQotLyoKLSAqIFByb2Nlc3Mgc29tZSBkYXRhLgotICogVGhpcyByb3V0aW5lIGhhbmRsZXMgdGhlIHNpbXBsZSBwYXNzLXRocm91Z2ggbW9kZSwKLSAqIHdoZXJlIHdlIGhhdmUgb25seSBhIHN0cmlwIGJ1ZmZlci4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXByb2Nlc3NfZGF0YV9zaW1wbGVfbWFpbiAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfY3RyLAotCQkJICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwpCi17Ci0gIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOwotCi0gIHdoaWxlIChtYWluLT5jdXJfaU1DVV9yb3cgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKSB7Ci0gICAgLyogUmVhZCBpbnB1dCBkYXRhIGlmIHdlIGhhdmVuJ3QgZmlsbGVkIHRoZSBtYWluIGJ1ZmZlciB5ZXQgKi8KLSAgICBpZiAobWFpbi0+cm93Z3JvdXBfY3RyIDwgRENUU0laRSkKLSAgICAgICgqY2luZm8tPnByZXAtPnByZV9wcm9jZXNzX2RhdGEpIChjaW5mbywKLQkJCQkJaW5wdXRfYnVmLCBpbl9yb3dfY3RyLCBpbl9yb3dzX2F2YWlsLAotCQkJCQltYWluLT5idWZmZXIsICZtYWluLT5yb3dncm91cF9jdHIsCi0JCQkJCShKRElNRU5TSU9OKSBEQ1RTSVpFKTsKLQotICAgIC8qIElmIHdlIGRvbid0IGhhdmUgYSBmdWxsIGlNQ1Ugcm93IGJ1ZmZlcmVkLCByZXR1cm4gdG8gYXBwbGljYXRpb24gZm9yCi0gICAgICogbW9yZSBkYXRhLiAgTm90ZSB0aGF0IHByZXByb2Nlc3NvciB3aWxsIGFsd2F5cyBwYWQgdG8gZmlsbCB0aGUgaU1DVSByb3cKLSAgICAgKiBhdCB0aGUgYm90dG9tIG9mIHRoZSBpbWFnZS4KLSAgICAgKi8KLSAgICBpZiAobWFpbi0+cm93Z3JvdXBfY3RyICE9IERDVFNJWkUpCi0gICAgICByZXR1cm47Ci0KLSAgICAvKiBTZW5kIHRoZSBjb21wbGV0ZWQgcm93IHRvIHRoZSBjb21wcmVzc29yICovCi0gICAgaWYgKCEgKCpjaW5mby0+Y29lZi0+Y29tcHJlc3NfZGF0YSkgKGNpbmZvLCBtYWluLT5idWZmZXIpKSB7Ci0gICAgICAvKiBJZiBjb21wcmVzc29yIGRpZCBub3QgY29uc3VtZSB0aGUgd2hvbGUgcm93LCB0aGVuIHdlIG11c3QgbmVlZCB0bwotICAgICAgICogc3VzcGVuZCBwcm9jZXNzaW5nIGFuZCByZXR1cm4gdG8gdGhlIGFwcGxpY2F0aW9uLiAgSW4gdGhpcyBzaXR1YXRpb24KLSAgICAgICAqIHdlIHByZXRlbmQgd2UgZGlkbid0IHlldCBjb25zdW1lIHRoZSBsYXN0IGlucHV0IHJvdzsgb3RoZXJ3aXNlLCBpZgotICAgICAgICogaXQgaGFwcGVuZWQgdG8gYmUgdGhlIGxhc3Qgcm93IG9mIHRoZSBpbWFnZSwgdGhlIGFwcGxpY2F0aW9uIHdvdWxkCi0gICAgICAgKiB0aGluayB3ZSB3ZXJlIGRvbmUuCi0gICAgICAgKi8KLSAgICAgIGlmICghIG1haW4tPnN1c3BlbmRlZCkgewotCSgqaW5fcm93X2N0ciktLTsKLQltYWluLT5zdXNwZW5kZWQgPSBUUlVFOwotICAgICAgfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvKiBXZSBkaWQgZmluaXNoIHRoZSByb3cuICBVbmRvIG91ciBsaXR0bGUgc3VzcGVuc2lvbiBoYWNrIGlmIGEgcHJldmlvdXMKLSAgICAgKiBjYWxsIHN1c3BlbmRlZDsgdGhlbiBtYXJrIHRoZSBtYWluIGJ1ZmZlciBlbXB0eS4KLSAgICAgKi8KLSAgICBpZiAobWFpbi0+c3VzcGVuZGVkKSB7Ci0gICAgICAoKmluX3Jvd19jdHIpKys7Ci0gICAgICBtYWluLT5zdXNwZW5kZWQgPSBGQUxTRTsKLSAgICB9Ci0gICAgbWFpbi0+cm93Z3JvdXBfY3RyID0gMDsKLSAgICBtYWluLT5jdXJfaU1DVV9yb3crKzsKLSAgfQotfQotCi0KLSNpZmRlZiBGVUxMX01BSU5fQlVGRkVSX1NVUFBPUlRFRAotCi0vKgotICogUHJvY2VzcyBzb21lIGRhdGEuCi0gKiBUaGlzIHJvdXRpbmUgaGFuZGxlcyBhbGwgb2YgdGhlIG1vZGVzIHRoYXQgdXNlIGEgZnVsbC1zaXplIGJ1ZmZlci4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXByb2Nlc3NfZGF0YV9idWZmZXJfbWFpbiAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfY3RyLAotCQkJICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwpCi17Ci0gIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOwotICBpbnQgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIGJvb2xlYW4gd3JpdGluZyA9IChtYWluLT5wYXNzX21vZGUgIT0gSkJVRl9DUkFOS19ERVNUKTsKLQotICB3aGlsZSAobWFpbi0+Y3VyX2lNQ1Vfcm93IDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykgewotICAgIC8qIFJlYWxpZ24gdGhlIHZpcnR1YWwgYnVmZmVycyBpZiBhdCB0aGUgc3RhcnQgb2YgYW4gaU1DVSByb3cuICovCi0gICAgaWYgKG1haW4tPnJvd2dyb3VwX2N0ciA9PSAwKSB7Ci0gICAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotCSAgIGNpKyssIGNvbXBwdHIrKykgewotCW1haW4tPmJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLQkgICgoal9jb21tb25fcHRyKSBjaW5mbywgbWFpbi0+d2hvbGVfaW1hZ2VbY2ldLAotCSAgIG1haW4tPmN1cl9pTUNVX3JvdyAqIChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogRENUU0laRSksCi0JICAgKEpESU1FTlNJT04pIChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogRENUU0laRSksIHdyaXRpbmcpOwotICAgICAgfQotICAgICAgLyogSW4gYSByZWFkIHBhc3MsIHByZXRlbmQgd2UganVzdCByZWFkIHNvbWUgc291cmNlIGRhdGEuICovCi0gICAgICBpZiAoISB3cml0aW5nKSB7Ci0JKmluX3Jvd19jdHIgKz0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogRENUU0laRTsKLQltYWluLT5yb3dncm91cF9jdHIgPSBEQ1RTSVpFOwotICAgICAgfQotICAgIH0KLQotICAgIC8qIElmIGEgd3JpdGUgcGFzcywgcmVhZCBpbnB1dCBkYXRhIHVudGlsIHRoZSBjdXJyZW50IGlNQ1Ugcm93IGlzIGZ1bGwuICovCi0gICAgLyogTm90ZTogcHJlcHJvY2Vzc29yIHdpbGwgcGFkIGlmIG5lY2Vzc2FyeSB0byBmaWxsIHRoZSBsYXN0IGlNQ1Ugcm93LiAqLwotICAgIGlmICh3cml0aW5nKSB7Ci0gICAgICAoKmNpbmZvLT5wcmVwLT5wcmVfcHJvY2Vzc19kYXRhKSAoY2luZm8sCi0JCQkJCWlucHV0X2J1ZiwgaW5fcm93X2N0ciwgaW5fcm93c19hdmFpbCwKLQkJCQkJbWFpbi0+YnVmZmVyLCAmbWFpbi0+cm93Z3JvdXBfY3RyLAotCQkJCQkoSkRJTUVOU0lPTikgRENUU0laRSk7Ci0gICAgICAvKiBSZXR1cm4gdG8gYXBwbGljYXRpb24gaWYgd2UgbmVlZCBtb3JlIGRhdGEgdG8gZmlsbCB0aGUgaU1DVSByb3cuICovCi0gICAgICBpZiAobWFpbi0+cm93Z3JvdXBfY3RyIDwgRENUU0laRSkKLQlyZXR1cm47Ci0gICAgfQotCi0gICAgLyogRW1pdCBkYXRhLCB1bmxlc3MgdGhpcyBpcyBhIHNpbmstb25seSBwYXNzLiAqLwotICAgIGlmIChtYWluLT5wYXNzX21vZGUgIT0gSkJVRl9TQVZFX1NPVVJDRSkgewotICAgICAgaWYgKCEgKCpjaW5mby0+Y29lZi0+Y29tcHJlc3NfZGF0YSkgKGNpbmZvLCBtYWluLT5idWZmZXIpKSB7Ci0JLyogSWYgY29tcHJlc3NvciBkaWQgbm90IGNvbnN1bWUgdGhlIHdob2xlIHJvdywgdGhlbiB3ZSBtdXN0IG5lZWQgdG8KLQkgKiBzdXNwZW5kIHByb2Nlc3NpbmcgYW5kIHJldHVybiB0byB0aGUgYXBwbGljYXRpb24uICBJbiB0aGlzIHNpdHVhdGlvbgotCSAqIHdlIHByZXRlbmQgd2UgZGlkbid0IHlldCBjb25zdW1lIHRoZSBsYXN0IGlucHV0IHJvdzsgb3RoZXJ3aXNlLCBpZgotCSAqIGl0IGhhcHBlbmVkIHRvIGJlIHRoZSBsYXN0IHJvdyBvZiB0aGUgaW1hZ2UsIHRoZSBhcHBsaWNhdGlvbiB3b3VsZAotCSAqIHRoaW5rIHdlIHdlcmUgZG9uZS4KLQkgKi8KLQlpZiAoISBtYWluLT5zdXNwZW5kZWQpIHsKLQkgICgqaW5fcm93X2N0ciktLTsKLQkgIG1haW4tPnN1c3BlbmRlZCA9IFRSVUU7Ci0JfQotCXJldHVybjsKLSAgICAgIH0KLSAgICAgIC8qIFdlIGRpZCBmaW5pc2ggdGhlIHJvdy4gIFVuZG8gb3VyIGxpdHRsZSBzdXNwZW5zaW9uIGhhY2sgaWYgYSBwcmV2aW91cwotICAgICAgICogY2FsbCBzdXNwZW5kZWQ7IHRoZW4gbWFyayB0aGUgbWFpbiBidWZmZXIgZW1wdHkuCi0gICAgICAgKi8KLSAgICAgIGlmIChtYWluLT5zdXNwZW5kZWQpIHsKLQkoKmluX3Jvd19jdHIpKys7Ci0JbWFpbi0+c3VzcGVuZGVkID0gRkFMU0U7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyogSWYgZ2V0IGhlcmUsIHdlIGFyZSBkb25lIHdpdGggdGhpcyBpTUNVIHJvdy4gIE1hcmsgYnVmZmVyIGVtcHR5LiAqLwotICAgIG1haW4tPnJvd2dyb3VwX2N0ciA9IDA7Ci0gICAgbWFpbi0+Y3VyX2lNQ1Vfcm93Kys7Ci0gIH0KLX0KLQotI2VuZGlmIC8qIEZVTExfTUFJTl9CVUZGRVJfU1VQUE9SVEVEICovCi0KLQotLyoKLSAqIEluaXRpYWxpemUgbWFpbiBidWZmZXIgY29udHJvbGxlci4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2NfbWFpbl9jb250cm9sbGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQotewotICBteV9tYWluX3B0ciBtYWluOwotICBpbnQgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0KLSAgbWFpbiA9IChteV9tYWluX3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihteV9tYWluX2NvbnRyb2xsZXIpKTsKLSAgY2luZm8tPm1haW4gPSAoc3RydWN0IGpwZWdfY19tYWluX2NvbnRyb2xsZXIgKikgbWFpbjsKLSAgbWFpbi0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX21haW47Ci0KLSAgLyogV2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgYSBidWZmZXIgaW4gcmF3LWRhdGEgbW9kZS4gKi8KLSAgaWYgKGNpbmZvLT5yYXdfZGF0YV9pbikKLSAgICByZXR1cm47Ci0KLSAgLyogQ3JlYXRlIHRoZSBidWZmZXIuICBJdCBob2xkcyBkb3duc2FtcGxlZCBkYXRhLCBzbyBlYWNoIGNvbXBvbmVudAotICAgKiBtYXkgYmUgb2YgYSBkaWZmZXJlbnQgc2l6ZS4KLSAgICovCi0gIGlmIChuZWVkX2Z1bGxfYnVmZmVyKSB7Ci0jaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKLSAgICAvKiBBbGxvY2F0ZSBhIGZ1bGwtaW1hZ2UgdmlydHVhbCBhcnJheSBmb3IgZWFjaCBjb21wb25lbnQgKi8KLSAgICAvKiBOb3RlIHdlIHBhZCB0aGUgYm90dG9tIHRvIGEgbXVsdGlwbGUgb2YgdGhlIGlNQ1UgaGVpZ2h0ICovCi0gICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLQkgY2krKywgY29tcHB0cisrKSB7Ci0gICAgICBtYWluLT53aG9sZV9pbWFnZVtjaV0gPSAoKmNpbmZvLT5tZW0tPnJlcXVlc3RfdmlydF9zYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwgRkFMU0UsCi0JIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUsCi0JIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MsCi0JCQkJKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpICogRENUU0laRSwKLQkgKEpESU1FTlNJT04pIChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogRENUU0laRSkpOwotICAgIH0KLSNlbHNlCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotI2VuZGlmCi0gIH0gZWxzZSB7Ci0jaWZkZWYgRlVMTF9NQUlOX0JVRkZFUl9TVVBQT1JURUQKLSAgICBtYWluLT53aG9sZV9pbWFnZVswXSA9IE5VTEw7IC8qIGZsYWcgZm9yIG5vIHZpcnR1YWwgYXJyYXlzICovCi0jZW5kaWYKLSAgICAvKiBBbGxvY2F0ZSBhIHN0cmlwIGJ1ZmZlciBmb3IgZWFjaCBjb21wb25lbnQgKi8KLSAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotCSBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAgIG1haW4tPmJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFLAotCSAoSkRJTUVOU0lPTikgKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNtYXJrZXIuYyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY21hcmtlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDFlNmM2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY21hcmtlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNjY0ICswLDAgQEAKLS8qCi0gKiBqY21hcmtlci5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gd3JpdGUgSlBFRyBkYXRhc3RyZWFtIG1hcmtlcnMuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLXR5cGVkZWYgZW51bSB7CQkJLyogSlBFRyBtYXJrZXIgY29kZXMgKi8KLSAgTV9TT0YwICA9IDB4YzAsCi0gIE1fU09GMSAgPSAweGMxLAotICBNX1NPRjIgID0gMHhjMiwKLSAgTV9TT0YzICA9IDB4YzMsCi0gIAotICBNX1NPRjUgID0gMHhjNSwKLSAgTV9TT0Y2ICA9IDB4YzYsCi0gIE1fU09GNyAgPSAweGM3LAotICAKLSAgTV9KUEcgICA9IDB4YzgsCi0gIE1fU09GOSAgPSAweGM5LAotICBNX1NPRjEwID0gMHhjYSwKLSAgTV9TT0YxMSA9IDB4Y2IsCi0gIAotICBNX1NPRjEzID0gMHhjZCwKLSAgTV9TT0YxNCA9IDB4Y2UsCi0gIE1fU09GMTUgPSAweGNmLAotICAKLSAgTV9ESFQgICA9IDB4YzQsCi0gIAotICBNX0RBQyAgID0gMHhjYywKLSAgCi0gIE1fUlNUMCAgPSAweGQwLAotICBNX1JTVDEgID0gMHhkMSwKLSAgTV9SU1QyICA9IDB4ZDIsCi0gIE1fUlNUMyAgPSAweGQzLAotICBNX1JTVDQgID0gMHhkNCwKLSAgTV9SU1Q1ICA9IDB4ZDUsCi0gIE1fUlNUNiAgPSAweGQ2LAotICBNX1JTVDcgID0gMHhkNywKLSAgCi0gIE1fU09JICAgPSAweGQ4LAotICBNX0VPSSAgID0gMHhkOSwKLSAgTV9TT1MgICA9IDB4ZGEsCi0gIE1fRFFUICAgPSAweGRiLAotICBNX0ROTCAgID0gMHhkYywKLSAgTV9EUkkgICA9IDB4ZGQsCi0gIE1fREhQICAgPSAweGRlLAotICBNX0VYUCAgID0gMHhkZiwKLSAgCi0gIE1fQVBQMCAgPSAweGUwLAotICBNX0FQUDEgID0gMHhlMSwKLSAgTV9BUFAyICA9IDB4ZTIsCi0gIE1fQVBQMyAgPSAweGUzLAotICBNX0FQUDQgID0gMHhlNCwKLSAgTV9BUFA1ICA9IDB4ZTUsCi0gIE1fQVBQNiAgPSAweGU2LAotICBNX0FQUDcgID0gMHhlNywKLSAgTV9BUFA4ICA9IDB4ZTgsCi0gIE1fQVBQOSAgPSAweGU5LAotICBNX0FQUDEwID0gMHhlYSwKLSAgTV9BUFAxMSA9IDB4ZWIsCi0gIE1fQVBQMTIgPSAweGVjLAotICBNX0FQUDEzID0gMHhlZCwKLSAgTV9BUFAxNCA9IDB4ZWUsCi0gIE1fQVBQMTUgPSAweGVmLAotICAKLSAgTV9KUEcwICA9IDB4ZjAsCi0gIE1fSlBHMTMgPSAweGZkLAotICBNX0NPTSAgID0gMHhmZSwKLSAgCi0gIE1fVEVNICAgPSAweDAxLAotICAKLSAgTV9FUlJPUiA9IDB4MTAwCi19IEpQRUdfTUFSS0VSOwotCi0KLS8qIFByaXZhdGUgc3RhdGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19tYXJrZXJfd3JpdGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIHVuc2lnbmVkIGludCBsYXN0X3Jlc3RhcnRfaW50ZXJ2YWw7IC8qIGxhc3QgRFJJIHZhbHVlIGVtaXR0ZWQ7IDAgYWZ0ZXIgU09JICovCi19IG15X21hcmtlcl93cml0ZXI7Ci0KLXR5cGVkZWYgbXlfbWFya2VyX3dyaXRlciAqIG15X21hcmtlcl9wdHI7Ci0KLQotLyoKLSAqIEJhc2ljIG91dHB1dCByb3V0aW5lcy4KLSAqCi0gKiBOb3RlIHRoYXQgd2UgZG8gbm90IHN1cHBvcnQgc3VzcGVuc2lvbiB3aGlsZSB3cml0aW5nIGEgbWFya2VyLgotICogVGhlcmVmb3JlLCBhbiBhcHBsaWNhdGlvbiB1c2luZyBzdXNwZW5zaW9uIG11c3QgZW5zdXJlIHRoYXQgdGhlcmUgaXMKLSAqIGVub3VnaCBidWZmZXIgc3BhY2UgZm9yIHRoZSBpbml0aWFsIG1hcmtlcnMgKHR5cC4gNjAwLTcwMCBieXRlcykgYmVmb3JlCi0gKiBjYWxsaW5nIGpwZWdfc3RhcnRfY29tcHJlc3MsIGFuZCBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgdGhlIHRyYWlsaW5nIEVPSQotICogKGEgZmV3IGJ5dGVzKSBiZWZvcmUgY2FsbGluZyBqcGVnX2ZpbmlzaF9jb21wcmVzcy4gIE11bHRpcGFzcyBjb21wcmVzc2lvbgotICogbW9kZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYXQgYWxsIHdpdGggc3VzcGVuc2lvbiwgc28gdGhvc2UgdHdvIGFyZSB0aGUgb25seQotICogcG9pbnRzIHdoZXJlIG1hcmtlcnMgd2lsbCBiZSB3cml0dGVuLgotICovCi0KLUxPQ0FMKHZvaWQpCi1lbWl0X2J5dGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmFsKQotLyogRW1pdCBhIGJ5dGUgKi8KLXsKLSAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICogZGVzdCA9IGNpbmZvLT5kZXN0OwotCi0gICooZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSkrKyA9IChKT0NURVQpIHZhbDsKLSAgaWYgKC0tZGVzdC0+ZnJlZV9pbl9idWZmZXIgPT0gMCkgewotICAgIGlmICghICgqZGVzdC0+ZW1wdHlfb3V0cHV0X2J1ZmZlcikgKGNpbmZvKSkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQ0FOVF9TVVNQRU5EKTsKLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1lbWl0X21hcmtlciAoal9jb21wcmVzc19wdHIgY2luZm8sIEpQRUdfTUFSS0VSIG1hcmspCi0vKiBFbWl0IGEgbWFya2VyIGNvZGUgKi8KLXsKLSAgZW1pdF9ieXRlKGNpbmZvLCAweEZGKTsKLSAgZW1pdF9ieXRlKGNpbmZvLCAoaW50KSBtYXJrKTsKLX0KLQotCi1MT0NBTCh2b2lkKQotZW1pdF8yYnl0ZXMgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmFsdWUpCi0vKiBFbWl0IGEgMi1ieXRlIGludGVnZXI7IHRoZXNlIGFyZSBhbHdheXMgTVNCIGZpcnN0IGluIEpQRUcgZmlsZXMgKi8KLXsKLSAgZW1pdF9ieXRlKGNpbmZvLCAodmFsdWUgPj4gOCkgJiAweEZGKTsKLSAgZW1pdF9ieXRlKGNpbmZvLCB2YWx1ZSAmIDB4RkYpOwotfQotCi0KLS8qCi0gKiBSb3V0aW5lcyB0byB3cml0ZSBzcGVjaWZpYyBtYXJrZXIgdHlwZXMuCi0gKi8KLQotTE9DQUwoaW50KQotZW1pdF9kcXQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgaW5kZXgpCi0vKiBFbWl0IGEgRFFUIG1hcmtlciAqLwotLyogUmV0dXJucyB0aGUgcHJlY2lzaW9uIHVzZWQgKDAgPSA4Yml0cywgMSA9IDE2Yml0cykgZm9yIGJhc2VsaW5lIGNoZWNraW5nICovCi17Ci0gIEpRVUFOVF9UQkwgKiBxdGJsID0gY2luZm8tPnF1YW50X3RibF9wdHJzW2luZGV4XTsKLSAgaW50IHByZWM7Ci0gIGludCBpOwotCi0gIGlmIChxdGJsID09IE5VTEwpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fUVVBTlRfVEFCTEUsIGluZGV4KTsKLQotICBwcmVjID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKLSAgICBpZiAocXRibC0+cXVhbnR2YWxbaV0gPiAyNTUpCi0gICAgICBwcmVjID0gMTsKLSAgfQotCi0gIGlmICghIHF0YmwtPnNlbnRfdGFibGUpIHsKLSAgICBlbWl0X21hcmtlcihjaW5mbywgTV9EUVQpOwotCi0gICAgZW1pdF8yYnl0ZXMoY2luZm8sIHByZWMgPyBEQ1RTSVpFMioyICsgMSArIDIgOiBEQ1RTSVpFMiArIDEgKyAyKTsKLQotICAgIGVtaXRfYnl0ZShjaW5mbywgaW5kZXggKyAocHJlYzw8NCkpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKLSAgICAgIC8qIFRoZSB0YWJsZSBlbnRyaWVzIG11c3QgYmUgZW1pdHRlZCBpbiB6aWd6YWcgb3JkZXIuICovCi0gICAgICB1bnNpZ25lZCBpbnQgcXZhbCA9IHF0YmwtPnF1YW50dmFsW2pwZWdfbmF0dXJhbF9vcmRlcltpXV07Ci0gICAgICBpZiAocHJlYykKLQllbWl0X2J5dGUoY2luZm8sIChpbnQpIChxdmFsID4+IDgpKTsKLSAgICAgIGVtaXRfYnl0ZShjaW5mbywgKGludCkgKHF2YWwgJiAweEZGKSk7Ci0gICAgfQotCi0gICAgcXRibC0+c2VudF90YWJsZSA9IFRSVUU7Ci0gIH0KLQotICByZXR1cm4gcHJlYzsKLX0KLQotCi1MT0NBTCh2b2lkKQotZW1pdF9kaHQgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgaW5kZXgsIGJvb2xlYW4gaXNfYWMpCi0vKiBFbWl0IGEgREhUIG1hcmtlciAqLwotewotICBKSFVGRl9UQkwgKiBodGJsOwotICBpbnQgbGVuZ3RoLCBpOwotICAKLSAgaWYgKGlzX2FjKSB7Ci0gICAgaHRibCA9IGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2luZGV4XTsKLSAgICBpbmRleCArPSAweDEwOwkJLyogb3V0cHV0IGluZGV4IGhhcyBBQyBiaXQgc2V0ICovCi0gIH0gZWxzZSB7Ci0gICAgaHRibCA9IGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2luZGV4XTsKLSAgfQotCi0gIGlmIChodGJsID09IE5VTEwpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgaW5kZXgpOwotICAKLSAgaWYgKCEgaHRibC0+c2VudF90YWJsZSkgewotICAgIGVtaXRfbWFya2VyKGNpbmZvLCBNX0RIVCk7Ci0gICAgCi0gICAgbGVuZ3RoID0gMDsKLSAgICBmb3IgKGkgPSAxOyBpIDw9IDE2OyBpKyspCi0gICAgICBsZW5ndGggKz0gaHRibC0+Yml0c1tpXTsKLSAgICAKLSAgICBlbWl0XzJieXRlcyhjaW5mbywgbGVuZ3RoICsgMiArIDEgKyAxNik7Ci0gICAgZW1pdF9ieXRlKGNpbmZvLCBpbmRleCk7Ci0gICAgCi0gICAgZm9yIChpID0gMTsgaSA8PSAxNjsgaSsrKQotICAgICAgZW1pdF9ieXRlKGNpbmZvLCBodGJsLT5iaXRzW2ldKTsKLSAgICAKLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICBlbWl0X2J5dGUoY2luZm8sIGh0YmwtPmh1ZmZ2YWxbaV0pOwotICAgIAotICAgIGh0YmwtPnNlbnRfdGFibGUgPSBUUlVFOwotICB9Ci19Ci0KLQotTE9DQUwodm9pZCkKLWVtaXRfZGFjIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLS8qIEVtaXQgYSBEQUMgbWFya2VyICovCi0vKiBTaW5jZSB0aGUgdXNlZnVsIGluZm8gaXMgc28gc21hbGwsIHdlIHdhbnQgdG8gZW1pdCBhbGwgdGhlIHRhYmxlcyBpbiAqLwotLyogb25lIERBQyBtYXJrZXIuICBUaGVyZWZvcmUgdGhpcyByb3V0aW5lIGRvZXMgaXRzIG93biBzY2FuIG9mIHRoZSB0YWJsZS4gKi8KLXsKLSNpZmRlZiBDX0FSSVRIX0NPRElOR19TVVBQT1JURUQKLSAgY2hhciBkY19pbl91c2VbTlVNX0FSSVRIX1RCTFNdOwotICBjaGFyIGFjX2luX3VzZVtOVU1fQVJJVEhfVEJMU107Ci0gIGludCBsZW5ndGgsIGk7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIAotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0FSSVRIX1RCTFM7IGkrKykKLSAgICBkY19pbl91c2VbaV0gPSBhY19pbl91c2VbaV0gPSAwOwotICAKLSAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9baV07Ci0gICAgZGNfaW5fdXNlW2NvbXBwdHItPmRjX3RibF9ub10gPSAxOwotICAgIGFjX2luX3VzZVtjb21wcHRyLT5hY190Ymxfbm9dID0gMTsKLSAgfQotICAKLSAgbGVuZ3RoID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IE5VTV9BUklUSF9UQkxTOyBpKyspCi0gICAgbGVuZ3RoICs9IGRjX2luX3VzZVtpXSArIGFjX2luX3VzZVtpXTsKLSAgCi0gIGVtaXRfbWFya2VyKGNpbmZvLCBNX0RBQyk7Ci0gIAotICBlbWl0XzJieXRlcyhjaW5mbywgbGVuZ3RoKjIgKyAyKTsKLSAgCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fQVJJVEhfVEJMUzsgaSsrKSB7Ci0gICAgaWYgKGRjX2luX3VzZVtpXSkgewotICAgICAgZW1pdF9ieXRlKGNpbmZvLCBpKTsKLSAgICAgIGVtaXRfYnl0ZShjaW5mbywgY2luZm8tPmFyaXRoX2RjX0xbaV0gKyAoY2luZm8tPmFyaXRoX2RjX1VbaV08PDQpKTsKLSAgICB9Ci0gICAgaWYgKGFjX2luX3VzZVtpXSkgewotICAgICAgZW1pdF9ieXRlKGNpbmZvLCBpICsgMHgxMCk7Ci0gICAgICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5hcml0aF9hY19LW2ldKTsKLSAgICB9Ci0gIH0KLSNlbmRpZiAvKiBDX0FSSVRIX0NPRElOR19TVVBQT1JURUQgKi8KLX0KLQotCi1MT0NBTCh2b2lkKQotZW1pdF9kcmkgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotLyogRW1pdCBhIERSSSBtYXJrZXIgKi8KLXsKLSAgZW1pdF9tYXJrZXIoY2luZm8sIE1fRFJJKTsKLSAgCi0gIGVtaXRfMmJ5dGVzKGNpbmZvLCA0KTsJLyogZml4ZWQgbGVuZ3RoICovCi0KLSAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKTsKLX0KLQotCi1MT0NBTCh2b2lkKQotZW1pdF9zb2YgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKUEVHX01BUktFUiBjb2RlKQotLyogRW1pdCBhIFNPRiBtYXJrZXIgKi8KLXsKLSAgaW50IGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICAKLSAgZW1pdF9tYXJrZXIoY2luZm8sIGNvZGUpOwotICAKLSAgZW1pdF8yYnl0ZXMoY2luZm8sIDMgKiBjaW5mby0+bnVtX2NvbXBvbmVudHMgKyAyICsgNSArIDEpOyAvKiBsZW5ndGggKi8KLQotICAvKiBNYWtlIHN1cmUgaW1hZ2UgaXNuJ3QgYmlnZ2VyIHRoYW4gU09GIGZpZWxkIGNhbiBoYW5kbGUgKi8KLSAgaWYgKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ID4gNjU1MzVMIHx8Ci0gICAgICAobG9uZykgY2luZm8tPmltYWdlX3dpZHRoID4gNjU1MzVMKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0lNQUdFX1RPT19CSUcsICh1bnNpZ25lZCBpbnQpIDY1NTM1KTsKLQotICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5kYXRhX3ByZWNpc2lvbik7Ci0gIGVtaXRfMmJ5dGVzKGNpbmZvLCAoaW50KSBjaW5mby0+aW1hZ2VfaGVpZ2h0KTsKLSAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIGNpbmZvLT5pbWFnZV93aWR0aCk7Ci0KLSAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+bnVtX2NvbXBvbmVudHMpOwotCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgZW1pdF9ieXRlKGNpbmZvLCBjb21wcHRyLT5jb21wb25lbnRfaWQpOwotICAgIGVtaXRfYnl0ZShjaW5mbywgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgPDwgNCkgKyBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKLSAgICBlbWl0X2J5dGUoY2luZm8sIGNvbXBwdHItPnF1YW50X3RibF9ubyk7Ci0gIH0KLX0KLQotCi1MT0NBTCh2b2lkKQotZW1pdF9zb3MgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotLyogRW1pdCBhIFNPUyBtYXJrZXIgKi8KLXsKLSAgaW50IGksIHRkLCB0YTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgCi0gIGVtaXRfbWFya2VyKGNpbmZvLCBNX1NPUyk7Ci0gIAotICBlbWl0XzJieXRlcyhjaW5mbywgMiAqIGNpbmZvLT5jb21wc19pbl9zY2FuICsgMiArIDEgKyAzKTsgLyogbGVuZ3RoICovCi0gIAotICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5jb21wc19pbl9zY2FuKTsKLSAgCi0gIGZvciAoaSA9IDA7IGkgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgaSsrKSB7Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2ldOwotICAgIGVtaXRfYnl0ZShjaW5mbywgY29tcHB0ci0+Y29tcG9uZW50X2lkKTsKLSAgICB0ZCA9IGNvbXBwdHItPmRjX3RibF9ubzsKLSAgICB0YSA9IGNvbXBwdHItPmFjX3RibF9ubzsKLSAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKLSAgICAgIC8qIFByb2dyZXNzaXZlIG1vZGU6IG9ubHkgREMgb3Igb25seSBBQyB0YWJsZXMgYXJlIHVzZWQgaW4gb25lIHNjYW47Ci0gICAgICAgKiBmdXJ0aGVybW9yZSwgSHVmZm1hbiBjb2Rpbmcgb2YgREMgcmVmaW5lbWVudCB1c2VzIG5vIHRhYmxlIGF0IGFsbC4KLSAgICAgICAqIFdlIGVtaXQgMCBmb3IgdW51c2VkIGZpZWxkKHMpOyB0aGlzIGlzIHJlY29tbWVuZGVkIGJ5IHRoZSBQJk0gdGV4dAotICAgICAgICogYnV0IGRvZXMgbm90IHNlZW0gdG8gYmUgc3BlY2lmaWVkIGluIHRoZSBzdGFuZGFyZC4KLSAgICAgICAqLwotICAgICAgaWYgKGNpbmZvLT5TcyA9PSAwKSB7Ci0JdGEgPSAwOwkJCS8qIERDIHNjYW4gKi8KLQlpZiAoY2luZm8tPkFoICE9IDAgJiYgIWNpbmZvLT5hcml0aF9jb2RlKQotCSAgdGQgPSAwOwkJLyogbm8gREMgdGFibGUgZWl0aGVyICovCi0gICAgICB9IGVsc2UgewotCXRkID0gMDsJCQkvKiBBQyBzY2FuICovCi0gICAgICB9Ci0gICAgfQotICAgIGVtaXRfYnl0ZShjaW5mbywgKHRkIDw8IDQpICsgdGEpOwotICB9Ci0KLSAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+U3MpOwotICBlbWl0X2J5dGUoY2luZm8sIGNpbmZvLT5TZSk7Ci0gIGVtaXRfYnl0ZShjaW5mbywgKGNpbmZvLT5BaCA8PCA0KSArIGNpbmZvLT5BbCk7Ci19Ci0KLQotTE9DQUwodm9pZCkKLWVtaXRfamZpZl9hcHAwIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLS8qIEVtaXQgYSBKRklGLWNvbXBsaWFudCBBUFAwIG1hcmtlciAqLwotewotICAvKgotICAgKiBMZW5ndGggb2YgQVBQMCBibG9jawkoMiBieXRlcykKLSAgICogQmxvY2sgSUQJCQkoNCBieXRlcyAtIEFTQ0lJICJKRklGIikKLSAgICogWmVybyBieXRlCQkJKDEgYnl0ZSB0byB0ZXJtaW5hdGUgdGhlIElEIHN0cmluZykKLSAgICogVmVyc2lvbiBNYWpvciwgTWlub3IJKDIgYnl0ZXMgLSBtYWpvciBmaXJzdCkKLSAgICogVW5pdHMJCQkoMSBieXRlIC0gMHgwMCA9IG5vbmUsIDB4MDEgPSBpbmNoLCAweDAyID0gY20pCi0gICAqIFhkcHUJCQkoMiBieXRlcyAtIGRvdHMgcGVyIHVuaXQgaG9yaXpvbnRhbCkKLSAgICogWWRwdQkJCSgyIGJ5dGVzIC0gZG90cyBwZXIgdW5pdCB2ZXJ0aWNhbCkKLSAgICogVGh1bWJuYWlsIFggc2l6ZQkJKDEgYnl0ZSkKLSAgICogVGh1bWJuYWlsIFkgc2l6ZQkJKDEgYnl0ZSkKLSAgICovCi0gIAotICBlbWl0X21hcmtlcihjaW5mbywgTV9BUFAwKTsKLSAgCi0gIGVtaXRfMmJ5dGVzKGNpbmZvLCAyICsgNCArIDEgKyAyICsgMSArIDIgKyAyICsgMSArIDEpOyAvKiBsZW5ndGggKi8KLQotICBlbWl0X2J5dGUoY2luZm8sIDB4NEEpOwkvKiBJZGVudGlmaWVyOiBBU0NJSSAiSkZJRiIgKi8KLSAgZW1pdF9ieXRlKGNpbmZvLCAweDQ2KTsKLSAgZW1pdF9ieXRlKGNpbmZvLCAweDQ5KTsKLSAgZW1pdF9ieXRlKGNpbmZvLCAweDQ2KTsKLSAgZW1pdF9ieXRlKGNpbmZvLCAwKTsKLSAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uKTsgLyogVmVyc2lvbiBmaWVsZHMgKi8KLSAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+SkZJRl9taW5vcl92ZXJzaW9uKTsKLSAgZW1pdF9ieXRlKGNpbmZvLCBjaW5mby0+ZGVuc2l0eV91bml0KTsgLyogUGl4ZWwgc2l6ZSBpbmZvcm1hdGlvbiAqLwotICBlbWl0XzJieXRlcyhjaW5mbywgKGludCkgY2luZm8tPlhfZGVuc2l0eSk7Ci0gIGVtaXRfMmJ5dGVzKGNpbmZvLCAoaW50KSBjaW5mby0+WV9kZW5zaXR5KTsKLSAgZW1pdF9ieXRlKGNpbmZvLCAwKTsJCS8qIE5vIHRodW1ibmFpbCBpbWFnZSAqLwotICBlbWl0X2J5dGUoY2luZm8sIDApOwotfQotCi0KLUxPQ0FMKHZvaWQpCi1lbWl0X2Fkb2JlX2FwcDE0IChqX2NvbXByZXNzX3B0ciBjaW5mbykKLS8qIEVtaXQgYW4gQWRvYmUgQVBQMTQgbWFya2VyICovCi17Ci0gIC8qCi0gICAqIExlbmd0aCBvZiBBUFAxNCBibG9jawkoMiBieXRlcykKLSAgICogQmxvY2sgSUQJCQkoNSBieXRlcyAtIEFTQ0lJICJBZG9iZSIpCi0gICAqIFZlcnNpb24gTnVtYmVyCQkoMiBieXRlcyAtIGN1cnJlbnRseSAxMDApCi0gICAqIEZsYWdzMAkJCSgyIGJ5dGVzIC0gY3VycmVudGx5IDApCi0gICAqIEZsYWdzMQkJCSgyIGJ5dGVzIC0gY3VycmVudGx5IDApCi0gICAqIENvbG9yIHRyYW5zZm9ybQkJKDEgYnl0ZSkKLSAgICoKLSAgICogQWx0aG91Z2ggQWRvYmUgVE4gNTExNiBtZW50aW9ucyBWZXJzaW9uID0gMTAxLCBhbGwgdGhlIEFkb2JlIGZpbGVzCi0gICAqIG5vdyBpbiBjaXJjdWxhdGlvbiBzZWVtIHRvIHVzZSBWZXJzaW9uID0gMTAwLCBzbyB0aGF0J3Mgd2hhdCB3ZSB3cml0ZS4KLSAgICoKLSAgICogV2Ugd3JpdGUgdGhlIGNvbG9yIHRyYW5zZm9ybSBieXRlIGFzIDEgaWYgdGhlIEpQRUcgY29sb3Igc3BhY2UgaXMKLSAgICogWUNiQ3IsIDIgaWYgaXQncyBZQ0NLLCAwIG90aGVyd2lzZS4gIEFkb2JlJ3MgZGVmaW5pdGlvbiBoYXMgdG8gZG8gd2l0aAotICAgKiB3aGV0aGVyIHRoZSBlbmNvZGVyIHBlcmZvcm1lZCBhIHRyYW5zZm9ybWF0aW9uLCB3aGljaCBpcyBwcmV0dHkgdXNlbGVzcy4KLSAgICovCi0gIAotICBlbWl0X21hcmtlcihjaW5mbywgTV9BUFAxNCk7Ci0gIAotICBlbWl0XzJieXRlcyhjaW5mbywgMiArIDUgKyAyICsgMiArIDIgKyAxKTsgLyogbGVuZ3RoICovCi0KLSAgZW1pdF9ieXRlKGNpbmZvLCAweDQxKTsJLyogSWRlbnRpZmllcjogQVNDSUkgIkFkb2JlIiAqLwotICBlbWl0X2J5dGUoY2luZm8sIDB4NjQpOwotICBlbWl0X2J5dGUoY2luZm8sIDB4NkYpOwotICBlbWl0X2J5dGUoY2luZm8sIDB4NjIpOwotICBlbWl0X2J5dGUoY2luZm8sIDB4NjUpOwotICBlbWl0XzJieXRlcyhjaW5mbywgMTAwKTsJLyogVmVyc2lvbiAqLwotICBlbWl0XzJieXRlcyhjaW5mbywgMCk7CS8qIEZsYWdzMCAqLwotICBlbWl0XzJieXRlcyhjaW5mbywgMCk7CS8qIEZsYWdzMSAqLwotICBzd2l0Y2ggKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKSB7Ci0gIGNhc2UgSkNTX1lDYkNyOgotICAgIGVtaXRfYnl0ZShjaW5mbywgMSk7CS8qIENvbG9yIHRyYW5zZm9ybSA9IDEgKi8KLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfWUNDSzoKLSAgICBlbWl0X2J5dGUoY2luZm8sIDIpOwkvKiBDb2xvciB0cmFuc2Zvcm0gPSAyICovCi0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgZW1pdF9ieXRlKGNpbmZvLCAwKTsJLyogQ29sb3IgdHJhbnNmb3JtID0gMCAqLwotICAgIGJyZWFrOwotICB9Ci19Ci0KLQotLyoKLSAqIFRoZXNlIHJvdXRpbmVzIGFsbG93IHdyaXRpbmcgYW4gYXJiaXRyYXJ5IG1hcmtlciB3aXRoIHBhcmFtZXRlcnMuCi0gKiBUaGUgb25seSBpbnRlbmRlZCB1c2UgaXMgdG8gZW1pdCBDT00gb3IgQVBQbiBtYXJrZXJzIGFmdGVyIGNhbGxpbmcKLSAqIHdyaXRlX2ZpbGVfaGVhZGVyIGFuZCBiZWZvcmUgY2FsbGluZyB3cml0ZV9mcmFtZV9oZWFkZXIuCi0gKiBPdGhlciB1c2VzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGRlc2lyYWJsZSByZXN1bHRzLgotICogQ291bnRpbmcgdGhlIHBhcmFtZXRlciBieXRlcyBwcm9wZXJseSBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV9tYXJrZXJfaGVhZGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwgdW5zaWduZWQgaW50IGRhdGFsZW4pCi0vKiBFbWl0IGFuIGFyYml0cmFyeSBtYXJrZXIgaGVhZGVyICovCi17Ci0gIGlmIChkYXRhbGVuID4gKHVuc2lnbmVkIGludCkgNjU1MzMpCQkvKiBzYWZldHkgY2hlY2sgKi8KLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9MRU5HVEgpOwotCi0gIGVtaXRfbWFya2VyKGNpbmZvLCAoSlBFR19NQVJLRVIpIG1hcmtlcik7Ci0KLSAgZW1pdF8yYnl0ZXMoY2luZm8sIChpbnQpIChkYXRhbGVuICsgMikpOwkvKiB0b3RhbCBsZW5ndGggKi8KLX0KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV9tYXJrZXJfYnl0ZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2YWwpCi0vKiBFbWl0IG9uZSBieXRlIG9mIG1hcmtlciBwYXJhbWV0ZXJzIGZvbGxvd2luZyB3cml0ZV9tYXJrZXJfaGVhZGVyICovCi17Ci0gIGVtaXRfYnl0ZShjaW5mbywgdmFsKTsKLX0KLQotCi0vKgotICogV3JpdGUgZGF0YXN0cmVhbSBoZWFkZXIuCi0gKiBUaGlzIGNvbnNpc3RzIG9mIGFuIFNPSSBhbmQgb3B0aW9uYWwgQVBQbiBtYXJrZXJzLgotICogV2UgcmVjb21tZW5kIHVzZSBvZiB0aGUgSkZJRiBtYXJrZXIsIGJ1dCBub3QgdGhlIEFkb2JlIG1hcmtlciwKLSAqIHdoZW4gdXNpbmcgWUNiQ3Igb3IgZ3JheXNjYWxlIGRhdGEuICBUaGUgSkZJRiBtYXJrZXIgc2hvdWxkIE5PVAotICogYmUgdXNlZCBmb3IgYW55IG90aGVyIEpQRUcgY29sb3JzcGFjZS4gIFRoZSBBZG9iZSBtYXJrZXIgaXMgaGVscGZ1bAotICogdG8gZGlzdGluZ3Vpc2ggUkdCLCBDTVlLLCBhbmQgWUNDSyBjb2xvcnNwYWNlcy4KLSAqIE5vdGUgdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gd3JpdGUgYWRkaXRpb25hbCBoZWFkZXIgbWFya2VycyBhZnRlcgotICoganBlZ19zdGFydF9jb21wcmVzcyByZXR1cm5zLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotd3JpdGVfZmlsZV9oZWFkZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9tYXJrZXJfcHRyIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyOwotCi0gIGVtaXRfbWFya2VyKGNpbmZvLCBNX1NPSSk7CS8qIGZpcnN0IHRoZSBTT0kgKi8KLQotICAvKiBTT0kgaXMgZGVmaW5lZCB0byByZXNldCByZXN0YXJ0IGludGVydmFsIHRvIDAgKi8KLSAgbWFya2VyLT5sYXN0X3Jlc3RhcnRfaW50ZXJ2YWwgPSAwOwotCi0gIGlmIChjaW5mby0+d3JpdGVfSkZJRl9oZWFkZXIpCS8qIG5leHQgYW4gb3B0aW9uYWwgSkZJRiBBUFAwICovCi0gICAgZW1pdF9qZmlmX2FwcDAoY2luZm8pOwotICBpZiAoY2luZm8tPndyaXRlX0Fkb2JlX21hcmtlcikgLyogbmV4dCBhbiBvcHRpb25hbCBBZG9iZSBBUFAxNCAqLwotICAgIGVtaXRfYWRvYmVfYXBwMTQoY2luZm8pOwotfQotCi0KLS8qCi0gKiBXcml0ZSBmcmFtZSBoZWFkZXIuCi0gKiBUaGlzIGNvbnNpc3RzIG9mIERRVCBhbmQgU09GbiBtYXJrZXJzLgotICogTm90ZSB0aGF0IHdlIGRvIG5vdCBlbWl0IHRoZSBTT0YgdW50aWwgd2UgaGF2ZSBlbWl0dGVkIHRoZSBEUVQocykuCi0gKiBUaGlzIGF2b2lkcyBjb21wYXRpYmlsaXR5IHByb2JsZW1zIHdpdGggaW5jb3JyZWN0IGltcGxlbWVudGF0aW9ucyB0aGF0Ci0gKiB0cnkgdG8gZXJyb3ItY2hlY2sgdGhlIHF1YW50IHRhYmxlIG51bWJlcnMgYXMgc29vbiBhcyB0aGV5IHNlZSB0aGUgU09GLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotd3JpdGVfZnJhbWVfaGVhZGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaW50IGNpLCBwcmVjOwotICBib29sZWFuIGlzX2Jhc2VsaW5lOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICAKLSAgLyogRW1pdCBEUVQgZm9yIGVhY2ggcXVhbnRpemF0aW9uIHRhYmxlLgotICAgKiBOb3RlIHRoYXQgZW1pdF9kcXQoKSBzdXBwcmVzc2VzIGFueSBkdXBsaWNhdGUgdGFibGVzLgotICAgKi8KLSAgcHJlYyA9IDA7Ci0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgcHJlYyArPSBlbWl0X2RxdChjaW5mbywgY29tcHB0ci0+cXVhbnRfdGJsX25vKTsKLSAgfQotICAvKiBub3cgcHJlYyBpcyBub256ZXJvIGlmZiB0aGVyZSBhcmUgYW55IDE2LWJpdCBxdWFudCB0YWJsZXMuICovCi0KLSAgLyogQ2hlY2sgZm9yIGEgbm9uLWJhc2VsaW5lIHNwZWNpZmljYXRpb24uCi0gICAqIE5vdGUgd2UgYXNzdW1lIHRoYXQgSHVmZm1hbiB0YWJsZSBudW1iZXJzIHdvbid0IGJlIGNoYW5nZWQgbGF0ZXIuCi0gICAqLwotICBpZiAoY2luZm8tPmFyaXRoX2NvZGUgfHwgY2luZm8tPnByb2dyZXNzaXZlX21vZGUgfHwKLSAgICAgIGNpbmZvLT5kYXRhX3ByZWNpc2lvbiAhPSA4KSB7Ci0gICAgaXNfYmFzZWxpbmUgPSBGQUxTRTsKLSAgfSBlbHNlIHsKLSAgICBpc19iYXNlbGluZSA9IFRSVUU7Ci0gICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLQkgY2krKywgY29tcHB0cisrKSB7Ci0gICAgICBpZiAoY29tcHB0ci0+ZGNfdGJsX25vID4gMSB8fCBjb21wcHRyLT5hY190Ymxfbm8gPiAxKQotCWlzX2Jhc2VsaW5lID0gRkFMU0U7Ci0gICAgfQotICAgIGlmIChwcmVjICYmIGlzX2Jhc2VsaW5lKSB7Ci0gICAgICBpc19iYXNlbGluZSA9IEZBTFNFOwotICAgICAgLyogSWYgaXQncyBiYXNlbGluZSBleGNlcHQgZm9yIHF1YW50aXplciBzaXplLCB3YXJuIHRoZSB1c2VyICovCi0gICAgICBUUkFDRU1TKGNpbmZvLCAwLCBKVFJDXzE2QklUX1RBQkxFUyk7Ci0gICAgfQotICB9Ci0KLSAgLyogRW1pdCB0aGUgcHJvcGVyIFNPRiBtYXJrZXIgKi8KLSAgaWYgKGNpbmZvLT5hcml0aF9jb2RlKSB7Ci0gICAgZW1pdF9zb2YoY2luZm8sIE1fU09GOSk7CS8qIFNPRiBjb2RlIGZvciBhcml0aG1ldGljIGNvZGluZyAqLwotICB9IGVsc2UgewotICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkKLSAgICAgIGVtaXRfc29mKGNpbmZvLCBNX1NPRjIpOwkvKiBTT0YgY29kZSBmb3IgcHJvZ3Jlc3NpdmUgSHVmZm1hbiAqLwotICAgIGVsc2UgaWYgKGlzX2Jhc2VsaW5lKQotICAgICAgZW1pdF9zb2YoY2luZm8sIE1fU09GMCk7CS8qIFNPRiBjb2RlIGZvciBiYXNlbGluZSBpbXBsZW1lbnRhdGlvbiAqLwotICAgIGVsc2UKLSAgICAgIGVtaXRfc29mKGNpbmZvLCBNX1NPRjEpOwkvKiBTT0YgY29kZSBmb3Igbm9uLWJhc2VsaW5lIEh1ZmZtYW4gZmlsZSAqLwotICB9Ci19Ci0KLQotLyoKLSAqIFdyaXRlIHNjYW4gaGVhZGVyLgotICogVGhpcyBjb25zaXN0cyBvZiBESFQgb3IgREFDIG1hcmtlcnMsIG9wdGlvbmFsIERSSSwgYW5kIFNPUy4KLSAqIENvbXByZXNzZWQgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gZm9sbG93aW5nIHRoZSBTT1MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV9zY2FuX2hlYWRlciAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X21hcmtlcl9wdHIgbWFya2VyID0gKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXI7Ci0gIGludCBpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotCi0gIGlmIChjaW5mby0+YXJpdGhfY29kZSkgewotICAgIC8qIEVtaXQgYXJpdGggY29uZGl0aW9uaW5nIGluZm8uICBXZSBtYXkgaGF2ZSBzb21lIGR1cGxpY2F0aW9uCi0gICAgICogaWYgdGhlIGZpbGUgaGFzIG11bHRpcGxlIHNjYW5zLCBidXQgaXQncyBzbyBzbWFsbCBpdCdzIGhhcmRseQotICAgICAqIHdvcnRoIHdvcnJ5aW5nIGFib3V0LgotICAgICAqLwotICAgIGVtaXRfZGFjKGNpbmZvKTsKLSAgfSBlbHNlIHsKLSAgICAvKiBFbWl0IEh1ZmZtYW4gdGFibGVzLgotICAgICAqIE5vdGUgdGhhdCBlbWl0X2RodCgpIHN1cHByZXNzZXMgYW55IGR1cGxpY2F0ZSB0YWJsZXMuCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBpKyspIHsKLSAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tpXTsKLSAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgewotCS8qIFByb2dyZXNzaXZlIG1vZGU6IG9ubHkgREMgb3Igb25seSBBQyB0YWJsZXMgYXJlIHVzZWQgaW4gb25lIHNjYW4gKi8KLQlpZiAoY2luZm8tPlNzID09IDApIHsKLQkgIGlmIChjaW5mby0+QWggPT0gMCkJLyogREMgbmVlZHMgbm8gdGFibGUgZm9yIHJlZmluZW1lbnQgc2NhbiAqLwotCSAgICBlbWl0X2RodChjaW5mbywgY29tcHB0ci0+ZGNfdGJsX25vLCBGQUxTRSk7Ci0JfSBlbHNlIHsKLQkgIGVtaXRfZGh0KGNpbmZvLCBjb21wcHRyLT5hY190Ymxfbm8sIFRSVUUpOwotCX0KLSAgICAgIH0gZWxzZSB7Ci0JLyogU2VxdWVudGlhbCBtb2RlOiBuZWVkIGJvdGggREMgYW5kIEFDIHRhYmxlcyAqLwotCWVtaXRfZGh0KGNpbmZvLCBjb21wcHRyLT5kY190Ymxfbm8sIEZBTFNFKTsKLQllbWl0X2RodChjaW5mbywgY29tcHB0ci0+YWNfdGJsX25vLCBUUlVFKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBFbWl0IERSSSBpZiByZXF1aXJlZCAtLS0gbm90ZSB0aGF0IERSSSB2YWx1ZSBjb3VsZCBjaGFuZ2UgZm9yIGVhY2ggc2Nhbi4KLSAgICogV2UgYXZvaWQgd2FzdGluZyBzcGFjZSB3aXRoIHVubmVjZXNzYXJ5IERSSXMsIGhvd2V2ZXIuCi0gICAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgIT0gbWFya2VyLT5sYXN0X3Jlc3RhcnRfaW50ZXJ2YWwpIHsKLSAgICBlbWl0X2RyaShjaW5mbyk7Ci0gICAgbWFya2VyLT5sYXN0X3Jlc3RhcnRfaW50ZXJ2YWwgPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLSAgfQotCi0gIGVtaXRfc29zKGNpbmZvKTsKLX0KLQotCi0vKgotICogV3JpdGUgZGF0YXN0cmVhbSB0cmFpbGVyLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotd3JpdGVfZmlsZV90cmFpbGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgZW1pdF9tYXJrZXIoY2luZm8sIE1fRU9JKTsKLX0KLQotCi0vKgotICogV3JpdGUgYW4gYWJicmV2aWF0ZWQgdGFibGUtc3BlY2lmaWNhdGlvbiBkYXRhc3RyZWFtLgotICogVGhpcyBjb25zaXN0cyBvZiBTT0ksIERRVCBhbmQgREhUIHRhYmxlcywgYW5kIEVPSS4KLSAqIEFueSB0YWJsZSB0aGF0IGlzIGRlZmluZWQgYW5kIG5vdCBtYXJrZWQgc2VudF90YWJsZSA9IFRSVUUgd2lsbCBiZQotICogZW1pdHRlZC4gIE5vdGUgdGhhdCBhbGwgdGFibGVzIHdpbGwgYmUgbWFya2VkIHNlbnRfdGFibGUgPSBUUlVFIGF0IGV4aXQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi13cml0ZV90YWJsZXNfb25seSAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGludCBpOwotCi0gIGVtaXRfbWFya2VyKGNpbmZvLCBNX1NPSSk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9RVUFOVF9UQkxTOyBpKyspIHsKLSAgICBpZiAoY2luZm8tPnF1YW50X3RibF9wdHJzW2ldICE9IE5VTEwpCi0gICAgICAodm9pZCkgZW1pdF9kcXQoY2luZm8sIGkpOwotICB9Ci0KLSAgaWYgKCEgY2luZm8tPmFyaXRoX2NvZGUpIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7Ci0gICAgICBpZiAoY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbaV0gIT0gTlVMTCkKLQllbWl0X2RodChjaW5mbywgaSwgRkFMU0UpOwotICAgICAgaWYgKGNpbmZvLT5hY19odWZmX3RibF9wdHJzW2ldICE9IE5VTEwpCi0JZW1pdF9kaHQoY2luZm8sIGksIFRSVUUpOwotICAgIH0KLSAgfQotCi0gIGVtaXRfbWFya2VyKGNpbmZvLCBNX0VPSSk7Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIG1hcmtlciB3cml0ZXIgbW9kdWxlLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfbWFya2VyX3dyaXRlciAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X21hcmtlcl9wdHIgbWFya2VyOwotCi0gIC8qIENyZWF0ZSB0aGUgc3Vib2JqZWN0ICovCi0gIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKG15X21hcmtlcl93cml0ZXIpKTsKLSAgY2luZm8tPm1hcmtlciA9IChzdHJ1Y3QganBlZ19tYXJrZXJfd3JpdGVyICopIG1hcmtlcjsKLSAgLyogSW5pdGlhbGl6ZSBtZXRob2QgcG9pbnRlcnMgKi8KLSAgbWFya2VyLT5wdWIud3JpdGVfZmlsZV9oZWFkZXIgPSB3cml0ZV9maWxlX2hlYWRlcjsKLSAgbWFya2VyLT5wdWIud3JpdGVfZnJhbWVfaGVhZGVyID0gd3JpdGVfZnJhbWVfaGVhZGVyOwotICBtYXJrZXItPnB1Yi53cml0ZV9zY2FuX2hlYWRlciA9IHdyaXRlX3NjYW5faGVhZGVyOwotICBtYXJrZXItPnB1Yi53cml0ZV9maWxlX3RyYWlsZXIgPSB3cml0ZV9maWxlX3RyYWlsZXI7Ci0gIG1hcmtlci0+cHViLndyaXRlX3RhYmxlc19vbmx5ID0gd3JpdGVfdGFibGVzX29ubHk7Ci0gIG1hcmtlci0+cHViLndyaXRlX21hcmtlcl9oZWFkZXIgPSB3cml0ZV9tYXJrZXJfaGVhZGVyOwotICBtYXJrZXItPnB1Yi53cml0ZV9tYXJrZXJfYnl0ZSA9IHdyaXRlX21hcmtlcl9ieXRlOwotICAvKiBJbml0aWFsaXplIHByaXZhdGUgc3RhdGUgKi8KLSAgbWFya2VyLT5sYXN0X3Jlc3RhcnRfaW50ZXJ2YWwgPSAwOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjbWFzdGVyLmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNtYXN0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiNDAyMC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNtYXN0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDU5MCArMCwwIEBACi0vKgotICogamNtYXN0ZXIuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIG1hc3RlciBjb250cm9sIGxvZ2ljIGZvciB0aGUgSlBFRyBjb21wcmVzc29yLgotICogVGhlc2Ugcm91dGluZXMgYXJlIGNvbmNlcm5lZCB3aXRoIHBhcmFtZXRlciB2YWxpZGF0aW9uLCBpbml0aWFsIHNldHVwLAotICogYW5kIGludGVyLXBhc3MgY29udHJvbCAoZGV0ZXJtaW5pbmcgdGhlIG51bWJlciBvZiBwYXNzZXMgYW5kIHRoZSB3b3JrIAotICogdG8gYmUgZG9uZSBpbiBlYWNoIHBhc3MpLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBQcml2YXRlIHN0YXRlICovCi0KLXR5cGVkZWYgZW51bSB7Ci0JbWFpbl9wYXNzLAkJLyogaW5wdXQgZGF0YSwgYWxzbyBkbyBmaXJzdCBvdXRwdXQgc3RlcCAqLwotCWh1ZmZfb3B0X3Bhc3MsCQkvKiBIdWZmbWFuIGNvZGUgb3B0aW1pemF0aW9uIHBhc3MgKi8KLQlvdXRwdXRfcGFzcwkJLyogZGF0YSBvdXRwdXQgcGFzcyAqLwotfSBjX3Bhc3NfdHlwZTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19jb21wX21hc3RlciBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICBjX3Bhc3NfdHlwZSBwYXNzX3R5cGU7CS8qIHRoZSB0eXBlIG9mIHRoZSBjdXJyZW50IHBhc3MgKi8KLQotICBpbnQgcGFzc19udW1iZXI7CQkvKiAjIG9mIHBhc3NlcyBjb21wbGV0ZWQgKi8KLSAgaW50IHRvdGFsX3Bhc3NlczsJCS8qIHRvdGFsICMgb2YgcGFzc2VzIG5lZWRlZCAqLwotCi0gIGludCBzY2FuX251bWJlcjsJCS8qIGN1cnJlbnQgaW5kZXggaW4gc2Nhbl9pbmZvW10gKi8KLX0gbXlfY29tcF9tYXN0ZXI7Ci0KLXR5cGVkZWYgbXlfY29tcF9tYXN0ZXIgKiBteV9tYXN0ZXJfcHRyOwotCi0KLS8qCi0gKiBTdXBwb3J0IHJvdXRpbmVzIHRoYXQgZG8gdmFyaW91cyBlc3NlbnRpYWwgY2FsY3VsYXRpb25zLgotICovCi0KLUxPQ0FMKHZvaWQpCi1pbml0aWFsX3NldHVwIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLS8qIERvIGNvbXB1dGF0aW9ucyB0aGF0IGFyZSBuZWVkZWQgYmVmb3JlIG1hc3RlciBzZWxlY3Rpb24gcGhhc2UgKi8KLXsKLSAgaW50IGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICBsb25nIHNhbXBsZXNwZXJyb3c7Ci0gIEpESU1FTlNJT04gamRfc2FtcGxlc3BlcnJvdzsKLQotICAvKiBTYW5pdHkgY2hlY2sgb24gaW1hZ2UgZGltZW5zaW9ucyAqLwotICBpZiAoY2luZm8tPmltYWdlX2hlaWdodCA8PSAwIHx8IGNpbmZvLT5pbWFnZV93aWR0aCA8PSAwCi0gICAgICB8fCBjaW5mby0+bnVtX2NvbXBvbmVudHMgPD0gMCB8fCBjaW5mby0+aW5wdXRfY29tcG9uZW50cyA8PSAwKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRU1QVFlfSU1BR0UpOwotCi0gIC8qIE1ha2Ugc3VyZSBpbWFnZSBpc24ndCBiaWdnZXIgdGhhbiBJIGNhbiBoYW5kbGUgKi8KLSAgaWYgKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ID4gKGxvbmcpIEpQRUdfTUFYX0RJTUVOU0lPTiB8fAotICAgICAgKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCA+IChsb25nKSBKUEVHX01BWF9ESU1FTlNJT04pCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfSU1BR0VfVE9PX0JJRywgKHVuc2lnbmVkIGludCkgSlBFR19NQVhfRElNRU5TSU9OKTsKLQotICAvKiBXaWR0aCBvZiBhbiBpbnB1dCBzY2FubGluZSBtdXN0IGJlIHJlcHJlc2VudGFibGUgYXMgSkRJTUVOU0lPTi4gKi8KLSAgc2FtcGxlc3BlcnJvdyA9IChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKiAobG9uZykgY2luZm8tPmlucHV0X2NvbXBvbmVudHM7Ci0gIGpkX3NhbXBsZXNwZXJyb3cgPSAoSkRJTUVOU0lPTikgc2FtcGxlc3BlcnJvdzsKLSAgaWYgKChsb25nKSBqZF9zYW1wbGVzcGVycm93ICE9IHNhbXBsZXNwZXJyb3cpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9XSURUSF9PVkVSRkxPVyk7Ci0KLSAgLyogRm9yIG5vdywgcHJlY2lzaW9uIG11c3QgbWF0Y2ggY29tcGlsZWQtaW4gdmFsdWUuLi4gKi8KLSAgaWYgKGNpbmZvLT5kYXRhX3ByZWNpc2lvbiAhPSBCSVRTX0lOX0pTQU1QTEUpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BSRUNJU0lPTiwgY2luZm8tPmRhdGFfcHJlY2lzaW9uKTsKLQotICAvKiBDaGVjayB0aGF0IG51bWJlciBvZiBjb21wb25lbnRzIHdvbid0IGV4Y2VlZCBpbnRlcm5hbCBhcnJheSBzaXplcyAqLwotICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpCi0gICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQ09NUE9ORU5UX0NPVU5ULCBjaW5mby0+bnVtX2NvbXBvbmVudHMsCi0JICAgICBNQVhfQ09NUE9ORU5UUyk7Ci0KLSAgLyogQ29tcHV0ZSBtYXhpbXVtIHNhbXBsaW5nIGZhY3RvcnM7IGNoZWNrIGZhY3RvciB2YWxpZGl0eSAqLwotICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgPSAxOwotICBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgPSAxOwotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIGlmIChjb21wcHRyLT5oX3NhbXBfZmFjdG9yPD0wIHx8IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I+TUFYX1NBTVBfRkFDVE9SIHx8Ci0JY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjw9MCB8fCBjb21wcHRyLT52X3NhbXBfZmFjdG9yPk1BWF9TQU1QX0ZBQ1RPUikKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1NBTVBMSU5HKTsKLSAgICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgPSBNQVgoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yLAotCQkJCSAgIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpOwotICAgIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciA9IE1BWChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCi0JCQkJICAgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7Ci0gIH0KLQotICAvKiBDb21wdXRlIGRpbWVuc2lvbnMgb2YgY29tcG9uZW50cyAqLwotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIC8qIEZpbGwgaW4gdGhlIGNvcnJlY3QgY29tcG9uZW50X2luZGV4IHZhbHVlOyBkb24ndCByZWx5IG9uIGFwcGxpY2F0aW9uICovCi0gICAgY29tcHB0ci0+Y29tcG9uZW50X2luZGV4ID0gY2k7Ci0gICAgLyogRm9yIGNvbXByZXNzaW9uLCB3ZSBuZXZlciBkbyBEQ1Qgc2NhbGluZy4gKi8KLSAgICBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUgPSBEQ1RTSVpFOwotICAgIC8qIFNpemUgaW4gRENUIGJsb2NrcyAqLwotICAgIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsCi0JCSAgICAobG9uZykgKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKLSAgICBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ICogKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCi0JCSAgICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKLSAgICAvKiBTaXplIGluIHNhbXBsZXMgKi8KLSAgICBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsCi0JCSAgICAobG9uZykgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKTsKLSAgICBjb21wcHRyLT5kb3duc2FtcGxlZF9oZWlnaHQgPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQgKiAobG9uZykgY29tcHB0ci0+dl9zYW1wX2ZhY3RvciwKLQkJICAgIChsb25nKSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpOwotICAgIC8qIE1hcmsgY29tcG9uZW50IG5lZWRlZCAodGhpcyBmbGFnIGlzbid0IGFjdHVhbGx5IHVzZWQgZm9yIGNvbXByZXNzaW9uKSAqLwotICAgIGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQgPSBUUlVFOwotICB9Ci0KLSAgLyogQ29tcHV0ZSBudW1iZXIgb2YgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvd3MgKG51bWJlciBvZiB0aW1lcyB0aGF0Ci0gICAqIG1haW4gY29udHJvbGxlciB3aWxsIGNhbGwgY29lZmZpY2llbnQgY29udHJvbGxlcikuCi0gICAqLwotICBjaW5mby0+dG90YWxfaU1DVV9yb3dzID0gKEpESU1FTlNJT04pCi0gICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwKLQkJICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcipEQ1RTSVpFKSk7Ci19Ci0KLQotI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAotCi1MT0NBTCh2b2lkKQotdmFsaWRhdGVfc2NyaXB0IChqX2NvbXByZXNzX3B0ciBjaW5mbykKLS8qIFZlcmlmeSB0aGF0IHRoZSBzY2FuIHNjcmlwdCBpbiBjaW5mby0+c2Nhbl9pbmZvW10gaXMgdmFsaWQ7IGFsc28KLSAqIGRldGVybWluZSB3aGV0aGVyIGl0IHVzZXMgcHJvZ3Jlc3NpdmUgSlBFRywgYW5kIHNldCBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZS4KLSAqLwotewotICBjb25zdCBqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHI7Ci0gIGludCBzY2Fubm8sIG5jb21wcywgY2ksIGNvZWZpLCB0aGlzaTsKLSAgaW50IFNzLCBTZSwgQWgsIEFsOwotICBib29sZWFuIGNvbXBvbmVudF9zZW50W01BWF9DT01QT05FTlRTXTsKLSNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotICBpbnQgKiBsYXN0X2JpdHBvc19wdHI7Ci0gIGludCBsYXN0X2JpdHBvc1tNQVhfQ09NUE9ORU5UU11bRENUU0laRTJdOwotICAvKiAtMSB1bnRpbCB0aGF0IGNvZWZmaWNpZW50IGhhcyBiZWVuIHNlZW47IHRoZW4gbGFzdCBBbCBmb3IgaXQgKi8KLSNlbmRpZgotCi0gIGlmIChjaW5mby0+bnVtX3NjYW5zIDw9IDApCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NDQU5fU0NSSVBULCAwKTsKLQotICAvKiBGb3Igc2VxdWVudGlhbCBKUEVHLCBhbGwgc2NhbnMgbXVzdCBoYXZlIFNzPTAsIFNlPURDVFNJWkUyLTE7Ci0gICAqIGZvciBwcm9ncmVzc2l2ZSBKUEVHLCBubyBzY2FuIGNhbiBoYXZlIHRoaXMuCi0gICAqLwotICBzY2FucHRyID0gY2luZm8tPnNjYW5faW5mbzsKLSAgaWYgKHNjYW5wdHItPlNzICE9IDAgfHwgc2NhbnB0ci0+U2UgIT0gRENUU0laRTItMSkgewotI2lmZGVmIENfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0gICAgY2luZm8tPnByb2dyZXNzaXZlX21vZGUgPSBUUlVFOwotICAgIGxhc3RfYml0cG9zX3B0ciA9ICYgbGFzdF9iaXRwb3NbMF1bMF07Ci0gICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSAKLSAgICAgIGZvciAoY29lZmkgPSAwOyBjb2VmaSA8IERDVFNJWkUyOyBjb2VmaSsrKQotCSpsYXN0X2JpdHBvc19wdHIrKyA9IC0xOwotI2Vsc2UKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSA9IEZBTFNFOwotICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgCi0gICAgICBjb21wb25lbnRfc2VudFtjaV0gPSBGQUxTRTsKLSAgfQotCi0gIGZvciAoc2Nhbm5vID0gMTsgc2Nhbm5vIDw9IGNpbmZvLT5udW1fc2NhbnM7IHNjYW5wdHIrKywgc2Nhbm5vKyspIHsKLSAgICAvKiBWYWxpZGF0ZSBjb21wb25lbnQgaW5kZXhlcyAqLwotICAgIG5jb21wcyA9IHNjYW5wdHItPmNvbXBzX2luX3NjYW47Ci0gICAgaWYgKG5jb21wcyA8PSAwIHx8IG5jb21wcyA+IE1BWF9DT01QU19JTl9TQ0FOKQotICAgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQ09NUE9ORU5UX0NPVU5ULCBuY29tcHMsIE1BWF9DT01QU19JTl9TQ0FOKTsKLSAgICBmb3IgKGNpID0gMDsgY2kgPCBuY29tcHM7IGNpKyspIHsKLSAgICAgIHRoaXNpID0gc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W2NpXTsKLSAgICAgIGlmICh0aGlzaSA8IDAgfHwgdGhpc2kgPj0gY2luZm8tPm51bV9jb21wb25lbnRzKQotCUVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TQ0FOX1NDUklQVCwgc2Nhbm5vKTsKLSAgICAgIC8qIENvbXBvbmVudHMgbXVzdCBhcHBlYXIgaW4gU09GIG9yZGVyIHdpdGhpbiBlYWNoIHNjYW4gKi8KLSAgICAgIGlmIChjaSA+IDAgJiYgdGhpc2kgPD0gc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W2NpLTFdKQotCUVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TQ0FOX1NDUklQVCwgc2Nhbm5vKTsKLSAgICB9Ci0gICAgLyogVmFsaWRhdGUgcHJvZ3Jlc3Npb24gcGFyYW1ldGVycyAqLwotICAgIFNzID0gc2NhbnB0ci0+U3M7Ci0gICAgU2UgPSBzY2FucHRyLT5TZTsKLSAgICBBaCA9IHNjYW5wdHItPkFoOwotICAgIEFsID0gc2NhbnB0ci0+QWw7Ci0gICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7Ci0jaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgICAgIC8qIFRoZSBKUEVHIHNwZWMgc2ltcGx5IGdpdmVzIHRoZSByYW5nZXMgMC4uMTMgZm9yIEFoIGFuZCBBbCwgYnV0IHRoYXQKLSAgICAgICAqIHNlZW1zIHdyb25nOiB0aGUgdXBwZXIgYm91bmQgb3VnaHQgdG8gZGVwZW5kIG9uIGRhdGEgcHJlY2lzaW9uLgotICAgICAgICogUGVyaGFwcyB0aGV5IHJlYWxseSBtZWFudCAwLi5OKzEgZm9yIE4tYml0IHByZWNpc2lvbi4KLSAgICAgICAqIEhlcmUgd2UgYWxsb3cgMC4uMTAgZm9yIDgtYml0IGRhdGE7IEFsIGxhcmdlciB0aGFuIDEwIHJlc3VsdHMgaW4KLSAgICAgICAqIG91dC1vZi1yYW5nZSByZWNvbnN0cnVjdGVkIERDIHZhbHVlcyBkdXJpbmcgdGhlIGZpcnN0IERDIHNjYW4sCi0gICAgICAgKiB3aGljaCBtaWdodCBjYXVzZSBwcm9ibGVtcyBmb3Igc29tZSBkZWNvZGVycy4KLSAgICAgICAqLwotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0jZGVmaW5lIE1BWF9BSF9BTCAxMAotI2Vsc2UKLSNkZWZpbmUgTUFYX0FIX0FMIDEzCi0jZW5kaWYKLSAgICAgIGlmIChTcyA8IDAgfHwgU3MgPj0gRENUU0laRTIgfHwgU2UgPCBTcyB8fCBTZSA+PSBEQ1RTSVpFMiB8fAotCSAgQWggPCAwIHx8IEFoID4gTUFYX0FIX0FMIHx8IEFsIDwgMCB8fCBBbCA+IE1BWF9BSF9BTCkKLQlFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJPR19TQ1JJUFQsIHNjYW5ubyk7Ci0gICAgICBpZiAoU3MgPT0gMCkgewotCWlmIChTZSAhPSAwKQkJLyogREMgYW5kIEFDIHRvZ2V0aGVyIG5vdCBPSyAqLwotCSAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOwotICAgICAgfSBlbHNlIHsKLQlpZiAobmNvbXBzICE9IDEpCS8qIEFDIHNjYW5zIG11c3QgYmUgZm9yIG9ubHkgb25lIGNvbXBvbmVudCAqLwotCSAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOwotICAgICAgfQotICAgICAgZm9yIChjaSA9IDA7IGNpIDwgbmNvbXBzOyBjaSsrKSB7Ci0JbGFzdF9iaXRwb3NfcHRyID0gJiBsYXN0X2JpdHBvc1tzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbY2ldXVswXTsKLQlpZiAoU3MgIT0gMCAmJiBsYXN0X2JpdHBvc19wdHJbMF0gPCAwKSAvKiBBQyB3aXRob3V0IHByaW9yIERDIHNjYW4gKi8KLQkgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUk9HX1NDUklQVCwgc2Nhbm5vKTsKLQlmb3IgKGNvZWZpID0gU3M7IGNvZWZpIDw9IFNlOyBjb2VmaSsrKSB7Ci0JICBpZiAobGFzdF9iaXRwb3NfcHRyW2NvZWZpXSA8IDApIHsKLQkgICAgLyogZmlyc3Qgc2NhbiBvZiB0aGlzIGNvZWZmaWNpZW50ICovCi0JICAgIGlmIChBaCAhPSAwKQotCSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9QUk9HX1NDUklQVCwgc2Nhbm5vKTsKLQkgIH0gZWxzZSB7Ci0JICAgIC8qIG5vdCBmaXJzdCBzY2FuICovCi0JICAgIGlmIChBaCAhPSBsYXN0X2JpdHBvc19wdHJbY29lZmldIHx8IEFsICE9IEFoLTEpCi0JICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOwotCSAgfQotCSAgbGFzdF9iaXRwb3NfcHRyW2NvZWZpXSA9IEFsOwotCX0KLSAgICAgIH0KLSNlbmRpZgotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBGb3Igc2VxdWVudGlhbCBKUEVHLCBhbGwgcHJvZ3Jlc3Npb24gcGFyYW1ldGVycyBtdXN0IGJlIHRoZXNlOiAqLwotICAgICAgaWYgKFNzICE9IDAgfHwgU2UgIT0gRENUU0laRTItMSB8fCBBaCAhPSAwIHx8IEFsICE9IDApCi0JRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BST0dfU0NSSVBULCBzY2Fubm8pOwotICAgICAgLyogTWFrZSBzdXJlIGNvbXBvbmVudHMgYXJlIG5vdCBzZW50IHR3aWNlICovCi0gICAgICBmb3IgKGNpID0gMDsgY2kgPCBuY29tcHM7IGNpKyspIHsKLQl0aGlzaSA9IHNjYW5wdHItPmNvbXBvbmVudF9pbmRleFtjaV07Ci0JaWYgKGNvbXBvbmVudF9zZW50W3RoaXNpXSkKLQkgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TQ0FOX1NDUklQVCwgc2Nhbm5vKTsKLQljb21wb25lbnRfc2VudFt0aGlzaV0gPSBUUlVFOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIE5vdyB2ZXJpZnkgdGhhdCBldmVyeXRoaW5nIGdvdCBzZW50LiAqLwotICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKLSNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotICAgIC8qIEZvciBwcm9ncmVzc2l2ZSBtb2RlLCB3ZSBvbmx5IGNoZWNrIHRoYXQgYXQgbGVhc3Qgc29tZSBEQyBkYXRhCi0gICAgICogZ290IHNlbnQgZm9yIGVhY2ggY29tcG9uZW50OyB0aGUgc3BlYyBkb2VzIG5vdCByZXF1aXJlIHRoYXQgYWxsIGJpdHMKLSAgICAgKiBvZiBhbGwgY29lZmZpY2llbnRzIGJlIHRyYW5zbWl0dGVkLiAgV291bGQgaXQgYmUgd2lzZXIgdG8gZW5mb3JjZQotICAgICAqIHRyYW5zbWlzc2lvbiBvZiBhbGwgY29lZmZpY2llbnQgYml0cz8/Ci0gICAgICovCi0gICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgICBpZiAobGFzdF9iaXRwb3NbY2ldWzBdIDwgMCkKLQlFUlJFWElUKGNpbmZvLCBKRVJSX01JU1NJTkdfREFUQSk7Ci0gICAgfQotI2VuZGlmCi0gIH0gZWxzZSB7Ci0gICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgICBpZiAoISBjb21wb25lbnRfc2VudFtjaV0pCi0JRVJSRVhJVChjaW5mbywgSkVSUl9NSVNTSU5HX0RBVEEpOwotICAgIH0KLSAgfQotfQotCi0jZW5kaWYgLyogQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCi0KLQotTE9DQUwodm9pZCkKLXNlbGVjdF9zY2FuX3BhcmFtZXRlcnMgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotLyogU2V0IHVwIHRoZSBzY2FuIHBhcmFtZXRlcnMgZm9yIHRoZSBjdXJyZW50IHNjYW4gKi8KLXsKLSAgaW50IGNpOwotCi0jaWZkZWYgQ19NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0gIGlmIChjaW5mby0+c2Nhbl9pbmZvICE9IE5VTEwpIHsKLSAgICAvKiBQcmVwYXJlIGZvciBjdXJyZW50IHNjYW4gLS0tIHRoZSBzY3JpcHQgaXMgYWxyZWFkeSB2YWxpZGF0ZWQgKi8KLSAgICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOwotICAgIGNvbnN0IGpwZWdfc2Nhbl9pbmZvICogc2NhbnB0ciA9IGNpbmZvLT5zY2FuX2luZm8gKyBtYXN0ZXItPnNjYW5fbnVtYmVyOwotCi0gICAgY2luZm8tPmNvbXBzX2luX3NjYW4gPSBzY2FucHRyLT5jb21wc19pbl9zY2FuOwotICAgIGZvciAoY2kgPSAwOyBjaSA8IHNjYW5wdHItPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICAgIGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXSA9Ci0JJmNpbmZvLT5jb21wX2luZm9bc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4W2NpXV07Ci0gICAgfQotICAgIGNpbmZvLT5TcyA9IHNjYW5wdHItPlNzOwotICAgIGNpbmZvLT5TZSA9IHNjYW5wdHItPlNlOwotICAgIGNpbmZvLT5BaCA9IHNjYW5wdHItPkFoOwotICAgIGNpbmZvLT5BbCA9IHNjYW5wdHItPkFsOwotICB9Ci0gIGVsc2UKLSNlbmRpZgotICB7Ci0gICAgLyogUHJlcGFyZSBmb3Igc2luZ2xlIHNlcXVlbnRpYWwtSlBFRyBzY2FuIGNvbnRhaW5pbmcgYWxsIGNvbXBvbmVudHMgKi8KLSAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBTX0lOX1NDQU4pCi0gICAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5udW1fY29tcG9uZW50cywKLQkgICAgICAgTUFYX0NPTVBTX0lOX1NDQU4pOwotICAgIGNpbmZvLT5jb21wc19pbl9zY2FuID0gY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewotICAgICAgY2luZm8tPmN1cl9jb21wX2luZm9bY2ldID0gJmNpbmZvLT5jb21wX2luZm9bY2ldOwotICAgIH0KLSAgICBjaW5mby0+U3MgPSAwOwotICAgIGNpbmZvLT5TZSA9IERDVFNJWkUyLTE7Ci0gICAgY2luZm8tPkFoID0gMDsKLSAgICBjaW5mby0+QWwgPSAwOwotICB9Ci19Ci0KLQotTE9DQUwodm9pZCkKLXBlcl9zY2FuX3NldHVwIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLS8qIERvIGNvbXB1dGF0aW9ucyB0aGF0IGFyZSBuZWVkZWQgYmVmb3JlIHByb2Nlc3NpbmcgYSBKUEVHIHNjYW4gKi8KLS8qIGNpbmZvLT5jb21wc19pbl9zY2FuIGFuZCBjaW5mby0+Y3VyX2NvbXBfaW5mb1tdIGFyZSBhbHJlYWR5IHNldCAqLwotewotICBpbnQgY2ksIG1jdWJsa3MsIHRtcDsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgCi0gIGlmIChjaW5mby0+Y29tcHNfaW5fc2NhbiA9PSAxKSB7Ci0gICAgCi0gICAgLyogTm9uaW50ZXJsZWF2ZWQgKHNpbmdsZS1jb21wb25lbnQpIHNjYW4gKi8KLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bMF07Ci0gICAgCi0gICAgLyogT3ZlcmFsbCBpbWFnZSBzaXplIGluIE1DVXMgKi8KLSAgICBjaW5mby0+TUNVc19wZXJfcm93ID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzOwotICAgIGNpbmZvLT5NQ1Vfcm93c19pbl9zY2FuID0gY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrczsKLSAgICAKLSAgICAvKiBGb3Igbm9uaW50ZXJsZWF2ZWQgc2NhbiwgYWx3YXlzIG9uZSBibG9jayBwZXIgTUNVICovCi0gICAgY29tcHB0ci0+TUNVX3dpZHRoID0gMTsKLSAgICBjb21wcHRyLT5NQ1VfaGVpZ2h0ID0gMTsKLSAgICBjb21wcHRyLT5NQ1VfYmxvY2tzID0gMTsKLSAgICBjb21wcHRyLT5NQ1Vfc2FtcGxlX3dpZHRoID0gRENUU0laRTsKLSAgICBjb21wcHRyLT5sYXN0X2NvbF93aWR0aCA9IDE7Ci0gICAgLyogRm9yIG5vbmludGVybGVhdmVkIHNjYW5zLCBpdCBpcyBjb252ZW5pZW50IHRvIGRlZmluZSBsYXN0X3Jvd19oZWlnaHQKLSAgICAgKiBhcyB0aGUgbnVtYmVyIG9mIGJsb2NrIHJvd3MgcHJlc2VudCBpbiB0aGUgbGFzdCBpTUNVIHJvdy4KLSAgICAgKi8KLSAgICB0bXAgPSAoaW50KSAoY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyAlIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOwotICAgIGlmICh0bXAgPT0gMCkgdG1wID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSAgICBjb21wcHRyLT5sYXN0X3Jvd19oZWlnaHQgPSB0bXA7Ci0gICAgCi0gICAgLyogUHJlcGFyZSBhcnJheSBkZXNjcmliaW5nIE1DVSBjb21wb3NpdGlvbiAqLwotICAgIGNpbmZvLT5ibG9ja3NfaW5fTUNVID0gMTsKLSAgICBjaW5mby0+TUNVX21lbWJlcnNoaXBbMF0gPSAwOwotICAgIAotICB9IGVsc2UgewotICAgIAotICAgIC8qIEludGVybGVhdmVkIChtdWx0aS1jb21wb25lbnQpIHNjYW4gKi8KLSAgICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPD0gMCB8fCBjaW5mby0+Y29tcHNfaW5fc2NhbiA+IE1BWF9DT01QU19JTl9TQ0FOKQotICAgICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQ09NUE9ORU5UX0NPVU5ULCBjaW5mby0+Y29tcHNfaW5fc2NhbiwKLQkgICAgICAgTUFYX0NPTVBTX0lOX1NDQU4pOwotICAgIAotICAgIC8qIE92ZXJhbGwgaW1hZ2Ugc2l6ZSBpbiBNQ1VzICovCi0gICAgY2luZm8tPk1DVXNfcGVyX3JvdyA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoLAotCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IqRENUU0laRSkpOwotICAgIGNpbmZvLT5NQ1Vfcm93c19pbl9zY2FuID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LAotCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IqRENUU0laRSkpOwotICAgIAotICAgIGNpbmZvLT5ibG9ja3NfaW5fTUNVID0gMDsKLSAgICAKLSAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotICAgICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICAgIC8qIFNhbXBsaW5nIGZhY3RvcnMgZ2l2ZSAjIG9mIGJsb2NrcyBvZiBjb21wb25lbnQgaW4gZWFjaCBNQ1UgKi8KLSAgICAgIGNvbXBwdHItPk1DVV93aWR0aCA9IGNvbXBwdHItPmhfc2FtcF9mYWN0b3I7Ci0gICAgICBjb21wcHRyLT5NQ1VfaGVpZ2h0ID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSAgICAgIGNvbXBwdHItPk1DVV9ibG9ja3MgPSBjb21wcHRyLT5NQ1Vfd2lkdGggKiBjb21wcHRyLT5NQ1VfaGVpZ2h0OwotICAgICAgY29tcHB0ci0+TUNVX3NhbXBsZV93aWR0aCA9IGNvbXBwdHItPk1DVV93aWR0aCAqIERDVFNJWkU7Ci0gICAgICAvKiBGaWd1cmUgbnVtYmVyIG9mIG5vbi1kdW1teSBibG9ja3MgaW4gbGFzdCBNQ1UgY29sdW1uICYgcm93ICovCi0gICAgICB0bXAgPSAoaW50KSAoY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICUgY29tcHB0ci0+TUNVX3dpZHRoKTsKLSAgICAgIGlmICh0bXAgPT0gMCkgdG1wID0gY29tcHB0ci0+TUNVX3dpZHRoOwotICAgICAgY29tcHB0ci0+bGFzdF9jb2xfd2lkdGggPSB0bXA7Ci0gICAgICB0bXAgPSAoaW50KSAoY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyAlIGNvbXBwdHItPk1DVV9oZWlnaHQpOwotICAgICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT5NQ1VfaGVpZ2h0OwotICAgICAgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0ID0gdG1wOwotICAgICAgLyogUHJlcGFyZSBhcnJheSBkZXNjcmliaW5nIE1DVSBjb21wb3NpdGlvbiAqLwotICAgICAgbWN1YmxrcyA9IGNvbXBwdHItPk1DVV9ibG9ja3M7Ci0gICAgICBpZiAoY2luZm8tPmJsb2Nrc19pbl9NQ1UgKyBtY3VibGtzID4gQ19NQVhfQkxPQ0tTX0lOX01DVSkKLQlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9NQ1VfU0laRSk7Ci0gICAgICB3aGlsZSAobWN1Ymxrcy0tID4gMCkgewotCWNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtjaW5mby0+YmxvY2tzX2luX01DVSsrXSA9IGNpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgfQotCi0gIC8qIENvbnZlcnQgcmVzdGFydCBzcGVjaWZpZWQgaW4gcm93cyB0byBhY3R1YWwgTUNVIGNvdW50LiAqLwotICAvKiBOb3RlIHRoYXQgY291bnQgbXVzdCBmaXQgaW4gMTYgYml0cywgc28gd2UgcHJvdmlkZSBsaW1pdGluZy4gKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2luX3Jvd3MgPiAwKSB7Ci0gICAgbG9uZyBub21pbmFsID0gKGxvbmcpIGNpbmZvLT5yZXN0YXJ0X2luX3Jvd3MgKiAobG9uZykgY2luZm8tPk1DVXNfcGVyX3JvdzsKLSAgICBjaW5mby0+cmVzdGFydF9pbnRlcnZhbCA9ICh1bnNpZ25lZCBpbnQpIE1JTihub21pbmFsLCA2NTUzNUwpOwotICB9Ci19Ci0KLQotLyoKLSAqIFBlci1wYXNzIHNldHVwLgotICogVGhpcyBpcyBjYWxsZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHBhc3MuICBXZSBkZXRlcm1pbmUgd2hpY2ggbW9kdWxlcwotICogd2lsbCBiZSBhY3RpdmUgZHVyaW5nIHRoaXMgcGFzcyBhbmQgZ2l2ZSB0aGVtIGFwcHJvcHJpYXRlIHN0YXJ0X3Bhc3MgY2FsbHMuCi0gKiBXZSBhbHNvIHNldCBpc19sYXN0X3Bhc3MgdG8gaW5kaWNhdGUgd2hldGhlciBhbnkgbW9yZSBwYXNzZXMgd2lsbCBiZQotICogcmVxdWlyZWQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wcmVwYXJlX2Zvcl9wYXNzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfbWFzdGVyX3B0ciBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikgY2luZm8tPm1hc3RlcjsKLQotICBzd2l0Y2ggKG1hc3Rlci0+cGFzc190eXBlKSB7Ci0gIGNhc2UgbWFpbl9wYXNzOgotICAgIC8qIEluaXRpYWwgcGFzczogd2lsbCBjb2xsZWN0IGlucHV0IGRhdGEsIGFuZCBkbyBlaXRoZXIgSHVmZm1hbgotICAgICAqIG9wdGltaXphdGlvbiBvciBkYXRhIG91dHB1dCBmb3IgdGhlIGZpcnN0IHNjYW4uCi0gICAgICovCi0gICAgc2VsZWN0X3NjYW5fcGFyYW1ldGVycyhjaW5mbyk7Ci0gICAgcGVyX3NjYW5fc2V0dXAoY2luZm8pOwotICAgIGlmICghIGNpbmZvLT5yYXdfZGF0YV9pbikgewotICAgICAgKCpjaW5mby0+Y2NvbnZlcnQtPnN0YXJ0X3Bhc3MpIChjaW5mbyk7Ci0gICAgICAoKmNpbmZvLT5kb3duc2FtcGxlLT5zdGFydF9wYXNzKSAoY2luZm8pOwotICAgICAgKCpjaW5mby0+cHJlcC0+c3RhcnRfcGFzcykgKGNpbmZvLCBKQlVGX1BBU1NfVEhSVSk7Ci0gICAgfQotICAgICgqY2luZm8tPmZkY3QtPnN0YXJ0X3Bhc3MpIChjaW5mbyk7Ci0gICAgKCpjaW5mby0+ZW50cm9weS0+c3RhcnRfcGFzcykgKGNpbmZvLCBjaW5mby0+b3B0aW1pemVfY29kaW5nKTsKLSAgICAoKmNpbmZvLT5jb2VmLT5zdGFydF9wYXNzKSAoY2luZm8sCi0JCQkJKG1hc3Rlci0+dG90YWxfcGFzc2VzID4gMSA/Ci0JCQkJIEpCVUZfU0FWRV9BTkRfUEFTUyA6IEpCVUZfUEFTU19USFJVKSk7Ci0gICAgKCpjaW5mby0+bWFpbi0+c3RhcnRfcGFzcykgKGNpbmZvLCBKQlVGX1BBU1NfVEhSVSk7Ci0gICAgaWYgKGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpIHsKLSAgICAgIC8qIE5vIGltbWVkaWF0ZSBkYXRhIG91dHB1dDsgcG9zdHBvbmUgd3JpdGluZyBmcmFtZS9zY2FuIGhlYWRlcnMgKi8KLSAgICAgIG1hc3Rlci0+cHViLmNhbGxfcGFzc19zdGFydHVwID0gRkFMU0U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIFdpbGwgd3JpdGUgZnJhbWUvc2NhbiBoZWFkZXJzIGF0IGZpcnN0IGpwZWdfd3JpdGVfc2NhbmxpbmVzIGNhbGwgKi8KLSAgICAgIG1hc3Rlci0+cHViLmNhbGxfcGFzc19zdGFydHVwID0gVFJVRTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0jaWZkZWYgRU5UUk9QWV9PUFRfU1VQUE9SVEVECi0gIGNhc2UgaHVmZl9vcHRfcGFzczoKLSAgICAvKiBEbyBIdWZmbWFuIG9wdGltaXphdGlvbiBmb3IgYSBzY2FuIGFmdGVyIHRoZSBmaXJzdCBvbmUuICovCi0gICAgc2VsZWN0X3NjYW5fcGFyYW1ldGVycyhjaW5mbyk7Ci0gICAgcGVyX3NjYW5fc2V0dXAoY2luZm8pOwotICAgIGlmIChjaW5mby0+U3MgIT0gMCB8fCBjaW5mby0+QWggPT0gMCB8fCBjaW5mby0+YXJpdGhfY29kZSkgewotICAgICAgKCpjaW5mby0+ZW50cm9weS0+c3RhcnRfcGFzcykgKGNpbmZvLCBUUlVFKTsKLSAgICAgICgqY2luZm8tPmNvZWYtPnN0YXJ0X3Bhc3MpIChjaW5mbywgSkJVRl9DUkFOS19ERVNUKTsKLSAgICAgIG1hc3Rlci0+cHViLmNhbGxfcGFzc19zdGFydHVwID0gRkFMU0U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgLyogU3BlY2lhbCBjYXNlOiBIdWZmbWFuIERDIHJlZmluZW1lbnQgc2NhbnMgbmVlZCBubyBIdWZmbWFuIHRhYmxlCi0gICAgICogYW5kIHRoZXJlZm9yZSB3ZSBjYW4gc2tpcCB0aGUgb3B0aW1pemF0aW9uIHBhc3MgZm9yIHRoZW0uCi0gICAgICovCi0gICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBvdXRwdXRfcGFzczsKLSAgICBtYXN0ZXItPnBhc3NfbnVtYmVyKys7Ci0gICAgLypGQUxMVEhST1VHSCovCi0jZW5kaWYKLSAgY2FzZSBvdXRwdXRfcGFzczoKLSAgICAvKiBEbyBhIGRhdGEtb3V0cHV0IHBhc3MuICovCi0gICAgLyogV2UgbmVlZCBub3QgcmVwZWF0IHBlci1zY2FuIHNldHVwIGlmIHByaW9yIG9wdGltaXphdGlvbiBwYXNzIGRpZCBpdC4gKi8KLSAgICBpZiAoISBjaW5mby0+b3B0aW1pemVfY29kaW5nKSB7Ci0gICAgICBzZWxlY3Rfc2Nhbl9wYXJhbWV0ZXJzKGNpbmZvKTsKLSAgICAgIHBlcl9zY2FuX3NldHVwKGNpbmZvKTsKLSAgICB9Ci0gICAgKCpjaW5mby0+ZW50cm9weS0+c3RhcnRfcGFzcykgKGNpbmZvLCBGQUxTRSk7Ci0gICAgKCpjaW5mby0+Y29lZi0+c3RhcnRfcGFzcykgKGNpbmZvLCBKQlVGX0NSQU5LX0RFU1QpOwotICAgIC8qIFdlIGVtaXQgZnJhbWUvc2NhbiBoZWFkZXJzIG5vdyAqLwotICAgIGlmIChtYXN0ZXItPnNjYW5fbnVtYmVyID09IDApCi0gICAgICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX2ZyYW1lX2hlYWRlcikgKGNpbmZvKTsKLSAgICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX3NjYW5faGVhZGVyKSAoY2luZm8pOwotICAgIG1hc3Rlci0+cHViLmNhbGxfcGFzc19zdGFydHVwID0gRkFMU0U7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotICB9Ci0KLSAgbWFzdGVyLT5wdWIuaXNfbGFzdF9wYXNzID0gKG1hc3Rlci0+cGFzc19udW1iZXIgPT0gbWFzdGVyLT50b3RhbF9wYXNzZXMtMSk7Ci0KLSAgLyogU2V0IHVwIHByb2dyZXNzIG1vbml0b3IncyBwYXNzIGluZm8gaWYgcHJlc2VudCAqLwotICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPmNvbXBsZXRlZF9wYXNzZXMgPSBtYXN0ZXItPnBhc3NfbnVtYmVyOwotICAgIGNpbmZvLT5wcm9ncmVzcy0+dG90YWxfcGFzc2VzID0gbWFzdGVyLT50b3RhbF9wYXNzZXM7Ci0gIH0KLX0KLQotCi0vKgotICogU3BlY2lhbCBzdGFydC1vZi1wYXNzIGhvb2suCi0gKiBUaGlzIGlzIGNhbGxlZCBieSBqcGVnX3dyaXRlX3NjYW5saW5lcyBpZiBjYWxsX3Bhc3Nfc3RhcnR1cCBpcyBUUlVFLgotICogSW4gc2luZ2xlLXBhc3MgcHJvY2Vzc2luZywgd2UgbmVlZCB0aGlzIGhvb2sgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvCi0gKiB3cml0ZSBmcmFtZS9zY2FuIGhlYWRlcnMgZHVyaW5nIGpwZWdfc3RhcnRfY29tcHJlc3M7IHdlIHdhbnQgdG8gbGV0IHRoZQotICogYXBwbGljYXRpb24gd3JpdGUgQ09NIG1hcmtlcnMgZXRjLiBiZXR3ZWVuIGpwZWdfc3RhcnRfY29tcHJlc3MgYW5kIHRoZQotICoganBlZ193cml0ZV9zY2FubGluZXMgbG9vcC4KLSAqIEluIG11bHRpLXBhc3MgcHJvY2Vzc2luZywgdGhpcyByb3V0aW5lIGlzIG5vdCB1c2VkLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcGFzc19zdGFydHVwIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgY2luZm8tPm1hc3Rlci0+Y2FsbF9wYXNzX3N0YXJ0dXAgPSBGQUxTRTsgLyogcmVzZXQgZmxhZyBzbyBjYWxsIG9ubHkgb25jZSAqLwotCi0gICgqY2luZm8tPm1hcmtlci0+d3JpdGVfZnJhbWVfaGVhZGVyKSAoY2luZm8pOwotICAoKmNpbmZvLT5tYXJrZXItPndyaXRlX3NjYW5faGVhZGVyKSAoY2luZm8pOwotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYXQgZW5kIG9mIHBhc3MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1maW5pc2hfcGFzc19tYXN0ZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOwotCi0gIC8qIFRoZSBlbnRyb3B5IGNvZGVyIGFsd2F5cyBuZWVkcyBhbiBlbmQtb2YtcGFzcyBjYWxsLAotICAgKiBlaXRoZXIgdG8gYW5hbHl6ZSBzdGF0aXN0aWNzIG9yIHRvIGZsdXNoIGl0cyBvdXRwdXQgYnVmZmVyLgotICAgKi8KLSAgKCpjaW5mby0+ZW50cm9weS0+ZmluaXNoX3Bhc3MpIChjaW5mbyk7Ci0KLSAgLyogVXBkYXRlIHN0YXRlIGZvciBuZXh0IHBhc3MgKi8KLSAgc3dpdGNoIChtYXN0ZXItPnBhc3NfdHlwZSkgewotICBjYXNlIG1haW5fcGFzczoKLSAgICAvKiBuZXh0IHBhc3MgaXMgZWl0aGVyIG91dHB1dCBvZiBzY2FuIDAgKGFmdGVyIG9wdGltaXphdGlvbikKLSAgICAgKiBvciBvdXRwdXQgb2Ygc2NhbiAxIChpZiBubyBvcHRpbWl6YXRpb24pLgotICAgICAqLwotICAgIG1hc3Rlci0+cGFzc190eXBlID0gb3V0cHV0X3Bhc3M7Ci0gICAgaWYgKCEgY2luZm8tPm9wdGltaXplX2NvZGluZykKLSAgICAgIG1hc3Rlci0+c2Nhbl9udW1iZXIrKzsKLSAgICBicmVhazsKLSAgY2FzZSBodWZmX29wdF9wYXNzOgotICAgIC8qIG5leHQgcGFzcyBpcyBhbHdheXMgb3V0cHV0IG9mIGN1cnJlbnQgc2NhbiAqLwotICAgIG1hc3Rlci0+cGFzc190eXBlID0gb3V0cHV0X3Bhc3M7Ci0gICAgYnJlYWs7Ci0gIGNhc2Ugb3V0cHV0X3Bhc3M6Ci0gICAgLyogbmV4dCBwYXNzIGlzIGVpdGhlciBvcHRpbWl6YXRpb24gb3Igb3V0cHV0IG9mIG5leHQgc2NhbiAqLwotICAgIGlmIChjaW5mby0+b3B0aW1pemVfY29kaW5nKQotICAgICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBodWZmX29wdF9wYXNzOwotICAgIG1hc3Rlci0+c2Nhbl9udW1iZXIrKzsKLSAgICBicmVhazsKLSAgfQotCi0gIG1hc3Rlci0+cGFzc19udW1iZXIrKzsKLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSBtYXN0ZXIgY29tcHJlc3Npb24gY29udHJvbC4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2NfbWFzdGVyX2NvbnRyb2wgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIHRyYW5zY29kZV9vbmx5KQotewotICBteV9tYXN0ZXJfcHRyIG1hc3RlcjsKLQotICBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBTSVpFT0YobXlfY29tcF9tYXN0ZXIpKTsKLSAgY2luZm8tPm1hc3RlciA9IChzdHJ1Y3QganBlZ19jb21wX21hc3RlciAqKSBtYXN0ZXI7Ci0gIG1hc3Rlci0+cHViLnByZXBhcmVfZm9yX3Bhc3MgPSBwcmVwYXJlX2Zvcl9wYXNzOwotICBtYXN0ZXItPnB1Yi5wYXNzX3N0YXJ0dXAgPSBwYXNzX3N0YXJ0dXA7Ci0gIG1hc3Rlci0+cHViLmZpbmlzaF9wYXNzID0gZmluaXNoX3Bhc3NfbWFzdGVyOwotICBtYXN0ZXItPnB1Yi5pc19sYXN0X3Bhc3MgPSBGQUxTRTsKLQotICAvKiBWYWxpZGF0ZSBwYXJhbWV0ZXJzLCBkZXRlcm1pbmUgZGVyaXZlZCB2YWx1ZXMgKi8KLSAgaW5pdGlhbF9zZXR1cChjaW5mbyk7Ci0KLSAgaWYgKGNpbmZvLT5zY2FuX2luZm8gIT0gTlVMTCkgewotI2lmZGVmIENfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAotICAgIHZhbGlkYXRlX3NjcmlwdChjaW5mbyk7Ci0jZWxzZQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICB9IGVsc2UgewotICAgIGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlID0gRkFMU0U7Ci0gICAgY2luZm8tPm51bV9zY2FucyA9IDE7Ci0gIH0KLQotICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpCS8qICBURU1QT1JBUlkgSEFDSyA/Pz8gKi8KLSAgICBjaW5mby0+b3B0aW1pemVfY29kaW5nID0gVFJVRTsgLyogYXNzdW1lIGRlZmF1bHQgdGFibGVzIG5vIGdvb2QgZm9yIHByb2dyZXNzaXZlIG1vZGUgKi8KLQotICAvKiBJbml0aWFsaXplIG15IHByaXZhdGUgc3RhdGUgKi8KLSAgaWYgKHRyYW5zY29kZV9vbmx5KSB7Ci0gICAgLyogbm8gbWFpbiBwYXNzIGluIHRyYW5zY29kaW5nICovCi0gICAgaWYgKGNpbmZvLT5vcHRpbWl6ZV9jb2RpbmcpCi0gICAgICBtYXN0ZXItPnBhc3NfdHlwZSA9IGh1ZmZfb3B0X3Bhc3M7Ci0gICAgZWxzZQotICAgICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBvdXRwdXRfcGFzczsKLSAgfSBlbHNlIHsKLSAgICAvKiBmb3Igbm9ybWFsIGNvbXByZXNzaW9uLCBmaXJzdCBwYXNzIGlzIGFsd2F5cyB0aGlzIHR5cGU6ICovCi0gICAgbWFzdGVyLT5wYXNzX3R5cGUgPSBtYWluX3Bhc3M7Ci0gIH0KLSAgbWFzdGVyLT5zY2FuX251bWJlciA9IDA7Ci0gIG1hc3Rlci0+cGFzc19udW1iZXIgPSAwOwotICBpZiAoY2luZm8tPm9wdGltaXplX2NvZGluZykKLSAgICBtYXN0ZXItPnRvdGFsX3Bhc3NlcyA9IGNpbmZvLT5udW1fc2NhbnMgKiAyOwotICBlbHNlCi0gICAgbWFzdGVyLT50b3RhbF9wYXNzZXMgPSBjaW5mby0+bnVtX3NjYW5zOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjb21hcGkuYyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY29tYXBpLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMWZhNzUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjb21hcGkuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogamNvbWFwaS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgYXBwbGljYXRpb24gaW50ZXJmYWNlIHJvdXRpbmVzIHRoYXQgYXJlIHVzZWQgZm9yIGJvdGgKLSAqIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKgotICogQWJvcnQgcHJvY2Vzc2luZyBvZiBhIEpQRUcgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiBvcGVyYXRpb24sCi0gKiBidXQgZG9uJ3QgZGVzdHJveSB0aGUgb2JqZWN0IGl0c2VsZi4KLSAqCi0gKiBGb3IgdGhpcywgd2UgbWVyZWx5IGNsZWFuIHVwIGFsbCB0aGUgbm9ucGVybWFuZW50IG1lbW9yeSBwb29scy4KLSAqIE5vdGUgdGhhdCB0ZW1wIGZpbGVzICh2aXJ0dWFsIGFycmF5cykgYXJlIG5vdCBhbGxvd2VkIHRvIGJlbG9uZyB0bwotICogdGhlIHBlcm1hbmVudCBwb29sLCBzbyB3ZSB3aWxsIGJlIGFibGUgdG8gY2xvc2UgYWxsIHRlbXAgZmlsZXMgaGVyZS4KLSAqIENsb3NpbmcgYSBkYXRhIHNvdXJjZSBvciBkZXN0aW5hdGlvbiwgaWYgbmVjZXNzYXJ5LCBpcyB0aGUgYXBwbGljYXRpb24ncwotICogcmVzcG9uc2liaWxpdHkuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2Fib3J0IChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIGludCBwb29sOwotCi0gIC8qIERvIG5vdGhpbmcgaWYgY2FsbGVkIG9uIGEgbm90LWluaXRpYWxpemVkIG9yIGRlc3Ryb3llZCBKUEVHIG9iamVjdC4gKi8KLSAgaWYgKGNpbmZvLT5tZW0gPT0gTlVMTCkKLSAgICByZXR1cm47Ci0KLSAgLyogUmVsZWFzaW5nIHBvb2xzIGluIHJldmVyc2Ugb3JkZXIgbWlnaHQgaGVscCBhdm9pZCBmcmFnbWVudGF0aW9uCi0gICAqIHdpdGggc29tZSAoYnJhaW4tZGFtYWdlZCkgbWFsbG9jIGxpYnJhcmllcy4KLSAgICovCi0gIGZvciAocG9vbCA9IEpQT09MX05VTVBPT0xTLTE7IHBvb2wgPiBKUE9PTF9QRVJNQU5FTlQ7IHBvb2wtLSkgewotICAgICgqY2luZm8tPm1lbS0+ZnJlZV9wb29sKSAoY2luZm8sIHBvb2wpOwotICB9Ci0KLSAgLyogUmVzZXQgb3ZlcmFsbCBzdGF0ZSBmb3IgcG9zc2libGUgcmV1c2Ugb2Ygb2JqZWN0ICovCi0gIGlmIChjaW5mby0+aXNfZGVjb21wcmVzc29yKSB7Ci0gICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9TVEFSVDsKLSAgICAvKiBUcnkgdG8ga2VlcCBhcHBsaWNhdGlvbiBmcm9tIGFjY2Vzc2luZyBub3ctZGVsZXRlZCBtYXJrZXIgbGlzdC4KLSAgICAgKiBBIGJpdCBrbHVkZ3kgdG8gZG8gaXQgaGVyZSwgYnV0IHRoaXMgaXMgdGhlIG1vc3QgY2VudHJhbCBwbGFjZS4KLSAgICAgKi8KLSAgICAoKGpfZGVjb21wcmVzc19wdHIpIGNpbmZvKS0+bWFya2VyX2xpc3QgPSBOVUxMOwotICB9IGVsc2UgewotICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBDU1RBVEVfU1RBUlQ7Ci0gIH0KLX0KLQotCi0vKgotICogRGVzdHJ1Y3Rpb24gb2YgYSBKUEVHIG9iamVjdC4KLSAqCi0gKiBFdmVyeXRoaW5nIGdldHMgZGVhbGxvY2F0ZWQgZXhjZXB0IHRoZSBtYXN0ZXIganBlZ19jb21wcmVzc19zdHJ1Y3QgaXRzZWxmCi0gKiBhbmQgdGhlIGVycm9yIG1hbmFnZXIgc3RydWN0LiAgQm90aCBvZiB0aGVzZSBhcmUgc3VwcGxpZWQgYnkgdGhlIGFwcGxpY2F0aW9uCi0gKiBhbmQgbXVzdCBiZSBmcmVlZCwgaWYgbmVjZXNzYXJ5LCBieSB0aGUgYXBwbGljYXRpb24uICAoT2Z0ZW4gdGhleSBhcmUgb24KLSAqIHRoZSBzdGFjayBhbmQgc28gZG9uJ3QgbmVlZCB0byBiZSBmcmVlZCBhbnl3YXkuKQotICogQ2xvc2luZyBhIGRhdGEgc291cmNlIG9yIGRlc3RpbmF0aW9uLCBpZiBuZWNlc3NhcnksIGlzIHRoZSBhcHBsaWNhdGlvbidzCi0gKiByZXNwb25zaWJpbGl0eS4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfZGVzdHJveSAoal9jb21tb25fcHRyIGNpbmZvKQotewotICAvKiBXZSBuZWVkIG9ubHkgdGVsbCB0aGUgbWVtb3J5IG1hbmFnZXIgdG8gcmVsZWFzZSBldmVyeXRoaW5nLiAqLwotICAvKiBOQjogbWVtIHBvaW50ZXIgaXMgTlVMTCBpZiBtZW1vcnkgbWdyIGZhaWxlZCB0byBpbml0aWFsaXplLiAqLwotICBpZiAoY2luZm8tPm1lbSAhPSBOVUxMKQotICAgICgqY2luZm8tPm1lbS0+c2VsZl9kZXN0cnVjdCkgKGNpbmZvKTsKLSAgY2luZm8tPm1lbSA9IE5VTEw7CQkvKiBiZSBzYWZlIGlmIGpwZWdfZGVzdHJveSBpcyBjYWxsZWQgdHdpY2UgKi8KLSAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IDA7CS8qIG1hcmsgaXQgZGVzdHJveWVkICovCi19Ci0KLQotLyoKLSAqIENvbnZlbmllbmNlIHJvdXRpbmVzIGZvciBhbGxvY2F0aW5nIHF1YW50aXphdGlvbiBhbmQgSHVmZm1hbiB0YWJsZXMuCi0gKiAoV291bGQganV0aWxzLmMgYmUgYSBtb3JlIHJlYXNvbmFibGUgcGxhY2UgdG8gcHV0IHRoZXNlPykKLSAqLwotCi1HTE9CQUwoSlFVQU5UX1RCTCAqKQotanBlZ19hbGxvY19xdWFudF90YWJsZSAoal9jb21tb25fcHRyIGNpbmZvKQotewotICBKUVVBTlRfVEJMICp0Ymw7Ci0KLSAgdGJsID0gKEpRVUFOVF9UQkwgKikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoY2luZm8sIEpQT09MX1BFUk1BTkVOVCwgU0laRU9GKEpRVUFOVF9UQkwpKTsKLSAgdGJsLT5zZW50X3RhYmxlID0gRkFMU0U7CS8qIG1ha2Ugc3VyZSB0aGlzIGlzIGZhbHNlIGluIGFueSBuZXcgdGFibGUgKi8KLSAgcmV0dXJuIHRibDsKLX0KLQotCi1HTE9CQUwoSkhVRkZfVEJMICopCi1qcGVnX2FsbG9jX2h1ZmZfdGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgSkhVRkZfVEJMICp0Ymw7Ci0KLSAgdGJsID0gKEpIVUZGX1RCTCAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpIChjaW5mbywgSlBPT0xfUEVSTUFORU5ULCBTSVpFT0YoSkhVRkZfVEJMKSk7Ci0gIHRibC0+c2VudF90YWJsZSA9IEZBTFNFOwkvKiBtYWtlIHN1cmUgdGhpcyBpcyBmYWxzZSBpbiBhbnkgbmV3IHRhYmxlICovCi0gIHJldHVybiB0Ymw7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNwYXJhbS5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjcGFyYW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZjNDhmNS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNwYXJhbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjEwICswLDAgQEAKLS8qCi0gKiBqY3BhcmFtLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBvcHRpb25hbCBkZWZhdWx0LXNldHRpbmcgY29kZSBmb3IgdGhlIEpQRUcgY29tcHJlc3Nvci4KLSAqIEFwcGxpY2F0aW9ucyBkbyBub3QgaGF2ZSB0byB1c2UgdGhpcyBmaWxlLCBidXQgdGhvc2UgdGhhdCBkb24ndCB1c2UgaXQKLSAqIG11c3Qga25vdyBhIGxvdCBtb3JlIGFib3V0IHRoZSBpbm5hcmRzIG9mIHRoZSBKUEVHIGNvZGUuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qCi0gKiBRdWFudGl6YXRpb24gdGFibGUgc2V0dXAgcm91dGluZXMKLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfYWRkX3F1YW50X3RhYmxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHdoaWNoX3RibCwKLQkJICAgICAgY29uc3QgdW5zaWduZWQgaW50ICpiYXNpY190YWJsZSwKLQkJICAgICAgaW50IHNjYWxlX2ZhY3RvciwgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkKLS8qIERlZmluZSBhIHF1YW50aXphdGlvbiB0YWJsZSBlcXVhbCB0byB0aGUgYmFzaWNfdGFibGUgdGltZXMKLSAqIGEgc2NhbGUgZmFjdG9yIChnaXZlbiBhcyBhIHBlcmNlbnRhZ2UpLgotICogSWYgZm9yY2VfYmFzZWxpbmUgaXMgVFJVRSwgdGhlIGNvbXB1dGVkIHF1YW50aXphdGlvbiB0YWJsZSBlbnRyaWVzCi0gKiBhcmUgbGltaXRlZCB0byAxLi4yNTUgZm9yIEpQRUcgYmFzZWxpbmUgY29tcGF0aWJpbGl0eS4KLSAqLwotewotICBKUVVBTlRfVEJMICoqIHF0YmxwdHI7Ci0gIGludCBpOwotICBsb25nIHRlbXA7Ci0KLSAgLyogU2FmZXR5IGNoZWNrIHRvIGVuc3VyZSBzdGFydF9jb21wcmVzcyBub3QgY2FsbGVkIHlldC4gKi8KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NUQVJUKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0KLSAgaWYgKHdoaWNoX3RibCA8IDAgfHwgd2hpY2hfdGJsID49IE5VTV9RVUFOVF9UQkxTKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0RRVF9JTkRFWCwgd2hpY2hfdGJsKTsKLQotICBxdGJscHRyID0gJiBjaW5mby0+cXVhbnRfdGJsX3B0cnNbd2hpY2hfdGJsXTsKLQotICBpZiAoKnF0YmxwdHIgPT0gTlVMTCkKLSAgICAqcXRibHB0ciA9IGpwZWdfYWxsb2NfcXVhbnRfdGFibGUoKGpfY29tbW9uX3B0cikgY2luZm8pOwotCi0gIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7Ci0gICAgdGVtcCA9ICgobG9uZykgYmFzaWNfdGFibGVbaV0gKiBzY2FsZV9mYWN0b3IgKyA1MEwpIC8gMTAwTDsKLSAgICAvKiBsaW1pdCB0aGUgdmFsdWVzIHRvIHRoZSB2YWxpZCByYW5nZSAqLwotICAgIGlmICh0ZW1wIDw9IDBMKSB0ZW1wID0gMUw7Ci0gICAgaWYgKHRlbXAgPiAzMjc2N0wpIHRlbXAgPSAzMjc2N0w7IC8qIG1heCBxdWFudGl6ZXIgbmVlZGVkIGZvciAxMiBiaXRzICovCi0gICAgaWYgKGZvcmNlX2Jhc2VsaW5lICYmIHRlbXAgPiAyNTVMKQotICAgICAgdGVtcCA9IDI1NUw7CQkvKiBsaW1pdCB0byBiYXNlbGluZSByYW5nZSBpZiByZXF1ZXN0ZWQgKi8KLSAgICAoKnF0YmxwdHIpLT5xdWFudHZhbFtpXSA9IChVSU5UMTYpIHRlbXA7Ci0gIH0KLQotICAvKiBJbml0aWFsaXplIHNlbnRfdGFibGUgRkFMU0Ugc28gdGFibGUgd2lsbCBiZSB3cml0dGVuIHRvIEpQRUcgZmlsZS4gKi8KLSAgKCpxdGJscHRyKS0+c2VudF90YWJsZSA9IEZBTFNFOwotfQotCi0KLUdMT0JBTCh2b2lkKQotanBlZ19zZXRfbGluZWFyX3F1YWxpdHkgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgc2NhbGVfZmFjdG9yLAotCQkJIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpCi0vKiBTZXQgb3IgY2hhbmdlIHRoZSAncXVhbGl0eScgKHF1YW50aXphdGlvbikgc2V0dGluZywgdXNpbmcgZGVmYXVsdCB0YWJsZXMKLSAqIGFuZCBhIHN0cmFpZ2h0IHBlcmNlbnRhZ2Utc2NhbGluZyBxdWFsaXR5IHNjYWxlLiAgSW4gbW9zdCBjYXNlcyBpdCdzIGJldHRlcgotICogdG8gdXNlIGpwZWdfc2V0X3F1YWxpdHkgKGJlbG93KTsgdGhpcyBlbnRyeSBwb2ludCBpcyBwcm92aWRlZCBmb3IKLSAqIGFwcGxpY2F0aW9ucyB0aGF0IGluc2lzdCBvbiBhIGxpbmVhciBwZXJjZW50YWdlIHNjYWxpbmcuCi0gKi8KLXsKLSAgLyogVGhlc2UgYXJlIHRoZSBzYW1wbGUgcXVhbnRpemF0aW9uIHRhYmxlcyBnaXZlbiBpbiBKUEVHIHNwZWMgc2VjdGlvbiBLLjEuCi0gICAqIFRoZSBzcGVjIHNheXMgdGhhdCB0aGUgdmFsdWVzIGdpdmVuIHByb2R1Y2UgImdvb2QiIHF1YWxpdHksIGFuZAotICAgKiB3aGVuIGRpdmlkZWQgYnkgMiwgInZlcnkgZ29vZCIgcXVhbGl0eS4KLSAgICovCi0gIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc3RkX2x1bWluYW5jZV9xdWFudF90YmxbRENUU0laRTJdID0gewotICAgIDE2LCAgMTEsICAxMCwgIDE2LCAgMjQsICA0MCwgIDUxLCAgNjEsCi0gICAgMTIsICAxMiwgIDE0LCAgMTksICAyNiwgIDU4LCAgNjAsICA1NSwKLSAgICAxNCwgIDEzLCAgMTYsICAyNCwgIDQwLCAgNTcsICA2OSwgIDU2LAotICAgIDE0LCAgMTcsICAyMiwgIDI5LCAgNTEsICA4NywgIDgwLCAgNjIsCi0gICAgMTgsICAyMiwgIDM3LCAgNTYsICA2OCwgMTA5LCAxMDMsICA3NywKLSAgICAyNCwgIDM1LCAgNTUsICA2NCwgIDgxLCAxMDQsIDExMywgIDkyLAotICAgIDQ5LCAgNjQsICA3OCwgIDg3LCAxMDMsIDEyMSwgMTIwLCAxMDEsCi0gICAgNzIsICA5MiwgIDk1LCAgOTgsIDExMiwgMTAwLCAxMDMsICA5OQotICB9OwotICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHN0ZF9jaHJvbWluYW5jZV9xdWFudF90YmxbRENUU0laRTJdID0gewotICAgIDE3LCAgMTgsICAyNCwgIDQ3LCAgOTksICA5OSwgIDk5LCAgOTksCi0gICAgMTgsICAyMSwgIDI2LCAgNjYsICA5OSwgIDk5LCAgOTksICA5OSwKLSAgICAyNCwgIDI2LCAgNTYsICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAotICAgIDQ3LCAgNjYsICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCi0gICAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwKLSAgICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LAotICAgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksCi0gICAgOTksICA5OSwgIDk5LCAgOTksICA5OSwgIDk5LCAgOTksICA5OQotICB9OwotCi0gIC8qIFNldCB1cCB0d28gcXVhbnRpemF0aW9uIHRhYmxlcyB1c2luZyB0aGUgc3BlY2lmaWVkIHNjYWxpbmcgKi8KLSAganBlZ19hZGRfcXVhbnRfdGFibGUoY2luZm8sIDAsIHN0ZF9sdW1pbmFuY2VfcXVhbnRfdGJsLAotCQkgICAgICAgc2NhbGVfZmFjdG9yLCBmb3JjZV9iYXNlbGluZSk7Ci0gIGpwZWdfYWRkX3F1YW50X3RhYmxlKGNpbmZvLCAxLCBzdGRfY2hyb21pbmFuY2VfcXVhbnRfdGJsLAotCQkgICAgICAgc2NhbGVfZmFjdG9yLCBmb3JjZV9iYXNlbGluZSk7Ci19Ci0KLQotR0xPQkFMKGludCkKLWpwZWdfcXVhbGl0eV9zY2FsaW5nIChpbnQgcXVhbGl0eSkKLS8qIENvbnZlcnQgYSB1c2VyLXNwZWNpZmllZCBxdWFsaXR5IHJhdGluZyB0byBhIHBlcmNlbnRhZ2Ugc2NhbGluZyBmYWN0b3IKLSAqIGZvciBhbiB1bmRlcmx5aW5nIHF1YW50aXphdGlvbiB0YWJsZSwgdXNpbmcgb3VyIHJlY29tbWVuZGVkIHNjYWxpbmcgY3VydmUuCi0gKiBUaGUgaW5wdXQgJ3F1YWxpdHknIGZhY3RvciBzaG91bGQgYmUgMCAodGVycmlibGUpIHRvIDEwMCAodmVyeSBnb29kKS4KLSAqLwotewotICAvKiBTYWZldHkgbGltaXQgb24gcXVhbGl0eSBmYWN0b3IuICBDb252ZXJ0IDAgdG8gMSB0byBhdm9pZCB6ZXJvIGRpdmlkZS4gKi8KLSAgaWYgKHF1YWxpdHkgPD0gMCkgcXVhbGl0eSA9IDE7Ci0gIGlmIChxdWFsaXR5ID4gMTAwKSBxdWFsaXR5ID0gMTAwOwotCi0gIC8qIFRoZSBiYXNpYyB0YWJsZSBpcyB1c2VkIGFzLWlzIChzY2FsaW5nIDEwMCkgZm9yIGEgcXVhbGl0eSBvZiA1MC4KLSAgICogUXVhbGl0aWVzIDUwLi4xMDAgYXJlIGNvbnZlcnRlZCB0byBzY2FsaW5nIHBlcmNlbnRhZ2UgMjAwIC0gMipROwotICAgKiBub3RlIHRoYXQgYXQgUT0xMDAgdGhlIHNjYWxpbmcgaXMgMCwgd2hpY2ggd2lsbCBjYXVzZSBqcGVnX2FkZF9xdWFudF90YWJsZQotICAgKiB0byBtYWtlIGFsbCB0aGUgdGFibGUgZW50cmllcyAxIChoZW5jZSwgbWluaW11bSBxdWFudGl6YXRpb24gbG9zcykuCi0gICAqIFF1YWxpdGllcyAxLi41MCBhcmUgY29udmVydGVkIHRvIHNjYWxpbmcgcGVyY2VudGFnZSA1MDAwL1EuCi0gICAqLwotICBpZiAocXVhbGl0eSA8IDUwKQotICAgIHF1YWxpdHkgPSA1MDAwIC8gcXVhbGl0eTsKLSAgZWxzZQotICAgIHF1YWxpdHkgPSAyMDAgLSBxdWFsaXR5KjI7Ci0KLSAgcmV0dXJuIHF1YWxpdHk7Ci19Ci0KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3NldF9xdWFsaXR5IChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IHF1YWxpdHksIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpCi0vKiBTZXQgb3IgY2hhbmdlIHRoZSAncXVhbGl0eScgKHF1YW50aXphdGlvbikgc2V0dGluZywgdXNpbmcgZGVmYXVsdCB0YWJsZXMuCi0gKiBUaGlzIGlzIHRoZSBzdGFuZGFyZCBxdWFsaXR5LWFkanVzdGluZyBlbnRyeSBwb2ludCBmb3IgdHlwaWNhbCB1c2VyCi0gKiBpbnRlcmZhY2VzOyBvbmx5IHRob3NlIHdobyB3YW50IGRldGFpbGVkIGNvbnRyb2wgb3ZlciBxdWFudGl6YXRpb24gdGFibGVzCi0gKiB3b3VsZCB1c2UgdGhlIHByZWNlZGluZyB0aHJlZSByb3V0aW5lcyBkaXJlY3RseS4KLSAqLwotewotICAvKiBDb252ZXJ0IHVzZXIgMC0xMDAgcmF0aW5nIHRvIHBlcmNlbnRhZ2Ugc2NhbGluZyAqLwotICBxdWFsaXR5ID0ganBlZ19xdWFsaXR5X3NjYWxpbmcocXVhbGl0eSk7Ci0KLSAgLyogU2V0IHVwIHN0YW5kYXJkIHF1YWxpdHkgdGFibGVzICovCi0gIGpwZWdfc2V0X2xpbmVhcl9xdWFsaXR5KGNpbmZvLCBxdWFsaXR5LCBmb3JjZV9iYXNlbGluZSk7Ci19Ci0KLQotLyoKLSAqIEh1ZmZtYW4gdGFibGUgc2V0dXAgcm91dGluZXMKLSAqLwotCi1MT0NBTCh2b2lkKQotYWRkX2h1ZmZfdGFibGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQlKSFVGRl9UQkwgKipodGJscHRyLCBjb25zdCBVSU5UOCAqYml0cywgY29uc3QgVUlOVDggKnZhbCkKLS8qIERlZmluZSBhIEh1ZmZtYW4gdGFibGUgKi8KLXsKLSAgaW50IG5zeW1ib2xzLCBsZW47Ci0KLSAgaWYgKCpodGJscHRyID09IE5VTEwpCi0gICAgKmh0YmxwdHIgPSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUoKGpfY29tbW9uX3B0cikgY2luZm8pOwotCi0gIC8qIENvcHkgdGhlIG51bWJlci1vZi1zeW1ib2xzLW9mLWVhY2gtY29kZS1sZW5ndGggY291bnRzICovCi0gIE1FTUNPUFkoKCpodGJscHRyKS0+Yml0cywgYml0cywgU0laRU9GKCgqaHRibHB0ciktPmJpdHMpKTsKLQotICAvKiBWYWxpZGF0ZSB0aGUgY291bnRzLiAgV2UgZG8gdGhpcyBoZXJlIG1haW5seSBzbyB3ZSBjYW4gY29weSB0aGUgcmlnaHQKLSAgICogbnVtYmVyIG9mIHN5bWJvbHMgZnJvbSB0aGUgdmFsW10gYXJyYXksIHdpdGhvdXQgcmlza2luZyBtYXJjaGluZyBvZmYKLSAgICogdGhlIGVuZCBvZiBtZW1vcnkuICBqY2h1ZmYuYyB3aWxsIGRvIGEgbW9yZSB0aG9yb3VnaCB0ZXN0IGxhdGVyLgotICAgKi8KLSAgbnN5bWJvbHMgPSAwOwotICBmb3IgKGxlbiA9IDE7IGxlbiA8PSAxNjsgbGVuKyspCi0gICAgbnN5bWJvbHMgKz0gYml0c1tsZW5dOwotICBpZiAobnN5bWJvbHMgPCAxIHx8IG5zeW1ib2xzID4gMjU2KQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0hVRkZfVEFCTEUpOwotCi0gIE1FTUNPUFkoKCpodGJscHRyKS0+aHVmZnZhbCwgdmFsLCBuc3ltYm9scyAqIFNJWkVPRihVSU5UOCkpOwotCi0gIC8qIEluaXRpYWxpemUgc2VudF90YWJsZSBGQUxTRSBzbyB0YWJsZSB3aWxsIGJlIHdyaXR0ZW4gdG8gSlBFRyBmaWxlLiAqLwotICAoKmh0YmxwdHIpLT5zZW50X3RhYmxlID0gRkFMU0U7Ci19Ci0KLQotTE9DQUwodm9pZCkKLXN0ZF9odWZmX3RhYmxlcyAoal9jb21wcmVzc19wdHIgY2luZm8pCi0vKiBTZXQgdXAgdGhlIHN0YW5kYXJkIEh1ZmZtYW4gdGFibGVzIChjZi4gSlBFRyBzdGFuZGFyZCBzZWN0aW9uIEsuMykgKi8KLS8qIElNUE9SVEFOVDogdGhlc2UgYXJlIG9ubHkgdmFsaWQgZm9yIDgtYml0IGRhdGEgcHJlY2lzaW9uISAqLwotewotICBzdGF0aWMgY29uc3QgVUlOVDggYml0c19kY19sdW1pbmFuY2VbMTddID0KLSAgICB7IC8qIDAtYmFzZSAqLyAwLCAwLCAxLCA1LCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07Ci0gIHN0YXRpYyBjb25zdCBVSU5UOCB2YWxfZGNfbHVtaW5hbmNlW10gPQotICAgIHsgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExIH07Ci0gIAotICBzdGF0aWMgY29uc3QgVUlOVDggYml0c19kY19jaHJvbWluYW5jZVsxN10gPQotICAgIHsgLyogMC1iYXNlICovIDAsIDAsIDMsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAgfTsKLSAgc3RhdGljIGNvbnN0IFVJTlQ4IHZhbF9kY19jaHJvbWluYW5jZVtdID0KLSAgICB7IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSB9OwotICAKLSAgc3RhdGljIGNvbnN0IFVJTlQ4IGJpdHNfYWNfbHVtaW5hbmNlWzE3XSA9Ci0gICAgeyAvKiAwLWJhc2UgKi8gMCwgMCwgMiwgMSwgMywgMywgMiwgNCwgMywgNSwgNSwgNCwgNCwgMCwgMCwgMSwgMHg3ZCB9OwotICBzdGF0aWMgY29uc3QgVUlOVDggdmFsX2FjX2x1bWluYW5jZVtdID0KLSAgICB7IDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDQsIDB4MTEsIDB4MDUsIDB4MTIsCi0gICAgICAweDIxLCAweDMxLCAweDQxLCAweDA2LCAweDEzLCAweDUxLCAweDYxLCAweDA3LAotICAgICAgMHgyMiwgMHg3MSwgMHgxNCwgMHgzMiwgMHg4MSwgMHg5MSwgMHhhMSwgMHgwOCwKLSAgICAgIDB4MjMsIDB4NDIsIDB4YjEsIDB4YzEsIDB4MTUsIDB4NTIsIDB4ZDEsIDB4ZjAsCi0gICAgICAweDI0LCAweDMzLCAweDYyLCAweDcyLCAweDgyLCAweDA5LCAweDBhLCAweDE2LAotICAgICAgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwKLSAgICAgIDB4MjksIDB4MmEsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksCi0gICAgICAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LAotICAgICAgMHg0YSwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwKLSAgICAgIDB4NWEsIDB4NjMsIDB4NjQsIDB4NjUsIDB4NjYsIDB4NjcsIDB4NjgsIDB4NjksCi0gICAgICAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LAotICAgICAgMHg3YSwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwKLSAgICAgIDB4OGEsIDB4OTIsIDB4OTMsIDB4OTQsIDB4OTUsIDB4OTYsIDB4OTcsIDB4OTgsCi0gICAgICAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LCAweGE1LCAweGE2LCAweGE3LAotICAgICAgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwKLSAgICAgIDB4YjcsIDB4YjgsIDB4YjksIDB4YmEsIDB4YzIsIDB4YzMsIDB4YzQsIDB4YzUsCi0gICAgICAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLCAweGQyLCAweGQzLCAweGQ0LAotICAgICAgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhlMSwgMHhlMiwKLSAgICAgIDB4ZTMsIDB4ZTQsIDB4ZTUsIDB4ZTYsIDB4ZTcsIDB4ZTgsIDB4ZTksIDB4ZWEsCi0gICAgICAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LAotICAgICAgMHhmOSwgMHhmYSB9OwotICAKLSAgc3RhdGljIGNvbnN0IFVJTlQ4IGJpdHNfYWNfY2hyb21pbmFuY2VbMTddID0KLSAgICB7IC8qIDAtYmFzZSAqLyAwLCAwLCAyLCAxLCAyLCA0LCA0LCAzLCA0LCA3LCA1LCA0LCA0LCAwLCAxLCAyLCAweDc3IH07Ci0gIHN0YXRpYyBjb25zdCBVSU5UOCB2YWxfYWNfY2hyb21pbmFuY2VbXSA9Ci0gICAgeyAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDExLCAweDA0LCAweDA1LCAweDIxLAotICAgICAgMHgzMSwgMHgwNiwgMHgxMiwgMHg0MSwgMHg1MSwgMHgwNywgMHg2MSwgMHg3MSwKLSAgICAgIDB4MTMsIDB4MjIsIDB4MzIsIDB4ODEsIDB4MDgsIDB4MTQsIDB4NDIsIDB4OTEsCi0gICAgICAweGExLCAweGIxLCAweGMxLCAweDA5LCAweDIzLCAweDMzLCAweDUyLCAweGYwLAotICAgICAgMHgxNSwgMHg2MiwgMHg3MiwgMHhkMSwgMHgwYSwgMHgxNiwgMHgyNCwgMHgzNCwKLSAgICAgIDB4ZTEsIDB4MjUsIDB4ZjEsIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MjYsCi0gICAgICAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDM1LCAweDM2LCAweDM3LCAweDM4LAotICAgICAgMHgzOSwgMHgzYSwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwKLSAgICAgIDB4NDksIDB4NGEsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsCi0gICAgICAweDU5LCAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LAotICAgICAgMHg2OSwgMHg2YSwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwKLSAgICAgIDB4NzksIDB4N2EsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsCi0gICAgICAweDg4LCAweDg5LCAweDhhLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LAotICAgICAgMHg5NywgMHg5OCwgMHg5OSwgMHg5YSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwKLSAgICAgIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIDB4YjIsIDB4YjMsIDB4YjQsCi0gICAgICAweGI1LCAweGI2LCAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLAotICAgICAgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgMHhjOCwgMHhjOSwgMHhjYSwgMHhkMiwKLSAgICAgIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsCi0gICAgICAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LAotICAgICAgMHhlYSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwKLSAgICAgIDB4ZjksIDB4ZmEgfTsKLSAgCi0gIGFkZF9odWZmX3RhYmxlKGNpbmZvLCAmY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbMF0sCi0JCSBiaXRzX2RjX2x1bWluYW5jZSwgdmFsX2RjX2x1bWluYW5jZSk7Ci0gIGFkZF9odWZmX3RhYmxlKGNpbmZvLCAmY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbMF0sCi0JCSBiaXRzX2FjX2x1bWluYW5jZSwgdmFsX2FjX2x1bWluYW5jZSk7Ci0gIGFkZF9odWZmX3RhYmxlKGNpbmZvLCAmY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbMV0sCi0JCSBiaXRzX2RjX2Nocm9taW5hbmNlLCB2YWxfZGNfY2hyb21pbmFuY2UpOwotICBhZGRfaHVmZl90YWJsZShjaW5mbywgJmNpbmZvLT5hY19odWZmX3RibF9wdHJzWzFdLAotCQkgYml0c19hY19jaHJvbWluYW5jZSwgdmFsX2FjX2Nocm9taW5hbmNlKTsKLX0KLQotCi0vKgotICogRGVmYXVsdCBwYXJhbWV0ZXIgc2V0dXAgZm9yIGNvbXByZXNzaW9uLgotICoKLSAqIEFwcGxpY2F0aW9ucyB0aGF0IGRvbid0IGNob29zZSB0byB1c2UgdGhpcyByb3V0aW5lIG11c3QgZG8gdGhlaXIKLSAqIG93biBzZXR1cCBvZiBhbGwgdGhlc2UgcGFyYW1ldGVycy4gIEFsdGVybmF0ZWx5LCB5b3UgY2FuIGNhbGwgdGhpcwotICogdG8gZXN0YWJsaXNoIGRlZmF1bHRzIGFuZCB0aGVuIGFsdGVyIHBhcmFtZXRlcnMgc2VsZWN0aXZlbHkuICBUaGlzCi0gKiBpcyB0aGUgcmVjb21tZW5kZWQgYXBwcm9hY2ggc2luY2UsIGlmIHdlIGFkZCBhbnkgbmV3IHBhcmFtZXRlcnMsCi0gKiB5b3VyIGNvZGUgd2lsbCBzdGlsbCB3b3JrICh0aGV5J2xsIGJlIHNldCB0byByZWFzb25hYmxlIGRlZmF1bHRzKS4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfc2V0X2RlZmF1bHRzIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaW50IGk7Ci0KLSAgLyogU2FmZXR5IGNoZWNrIHRvIGVuc3VyZSBzdGFydF9jb21wcmVzcyBub3QgY2FsbGVkIHlldC4gKi8KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NUQVJUKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0KLSAgLyogQWxsb2NhdGUgY29tcF9pbmZvIGFycmF5IGxhcmdlIGVub3VnaCBmb3IgbWF4aW11bSBjb21wb25lbnQgY291bnQuCi0gICAqIEFycmF5IGlzIG1hZGUgcGVybWFuZW50IGluIGNhc2UgYXBwbGljYXRpb24gd2FudHMgdG8gY29tcHJlc3MKLSAgICogbXVsdGlwbGUgaW1hZ2VzIGF0IHNhbWUgcGFyYW0gc2V0dGluZ3MuCi0gICAqLwotICBpZiAoY2luZm8tPmNvbXBfaW5mbyA9PSBOVUxMKQotICAgIGNpbmZvLT5jb21wX2luZm8gPSAoanBlZ19jb21wb25lbnRfaW5mbyAqKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9QRVJNQU5FTlQsCi0JCQkJICBNQVhfQ09NUE9ORU5UUyAqIFNJWkVPRihqcGVnX2NvbXBvbmVudF9pbmZvKSk7Ci0KLSAgLyogSW5pdGlhbGl6ZSBldmVyeXRoaW5nIG5vdCBkZXBlbmRlbnQgb24gdGhlIGNvbG9yIHNwYWNlICovCi0KLSAgY2luZm8tPmRhdGFfcHJlY2lzaW9uID0gQklUU19JTl9KU0FNUExFOwotICAvKiBTZXQgdXAgdHdvIHF1YW50aXphdGlvbiB0YWJsZXMgdXNpbmcgZGVmYXVsdCBxdWFsaXR5IG9mIDc1ICovCi0gIGpwZWdfc2V0X3F1YWxpdHkoY2luZm8sIDc1LCBUUlVFKTsKLSAgLyogU2V0IHVwIHR3byBIdWZmbWFuIHRhYmxlcyAqLwotICBzdGRfaHVmZl90YWJsZXMoY2luZm8pOwotCi0gIC8qIEluaXRpYWxpemUgZGVmYXVsdCBhcml0aG1ldGljIGNvZGluZyBjb25kaXRpb25pbmcgKi8KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9BUklUSF9UQkxTOyBpKyspIHsKLSAgICBjaW5mby0+YXJpdGhfZGNfTFtpXSA9IDA7Ci0gICAgY2luZm8tPmFyaXRoX2RjX1VbaV0gPSAxOwotICAgIGNpbmZvLT5hcml0aF9hY19LW2ldID0gNTsKLSAgfQotCi0gIC8qIERlZmF1bHQgaXMgbm8gbXVsdGlwbGUtc2NhbiBvdXRwdXQgKi8KLSAgY2luZm8tPnNjYW5faW5mbyA9IE5VTEw7Ci0gIGNpbmZvLT5udW1fc2NhbnMgPSAwOwotCi0gIC8qIEV4cGVjdCBub3JtYWwgc291cmNlIGltYWdlLCBub3QgcmF3IGRvd25zYW1wbGVkIGRhdGEgKi8KLSAgY2luZm8tPnJhd19kYXRhX2luID0gRkFMU0U7Ci0KLSAgLyogVXNlIEh1ZmZtYW4gY29kaW5nLCBub3QgYXJpdGhtZXRpYyBjb2RpbmcsIGJ5IGRlZmF1bHQgKi8KLSAgY2luZm8tPmFyaXRoX2NvZGUgPSBGQUxTRTsKLQotICAvKiBCeSBkZWZhdWx0LCBkb24ndCBkbyBleHRyYSBwYXNzZXMgdG8gb3B0aW1pemUgZW50cm9weSBjb2RpbmcgKi8KLSAgY2luZm8tPm9wdGltaXplX2NvZGluZyA9IEZBTFNFOwotICAvKiBUaGUgc3RhbmRhcmQgSHVmZm1hbiB0YWJsZXMgYXJlIG9ubHkgdmFsaWQgZm9yIDgtYml0IGRhdGEgcHJlY2lzaW9uLgotICAgKiBJZiB0aGUgcHJlY2lzaW9uIGlzIGhpZ2hlciwgZm9yY2Ugb3B0aW1pemF0aW9uIG9uIHNvIHRoYXQgdXNhYmxlCi0gICAqIHRhYmxlcyB3aWxsIGJlIGNvbXB1dGVkLiAgVGhpcyB0ZXN0IGNhbiBiZSByZW1vdmVkIGlmIGRlZmF1bHQgdGFibGVzCi0gICAqIGFyZSBzdXBwbGllZCB0aGF0IGFyZSB2YWxpZCBmb3IgdGhlIGRlc2lyZWQgcHJlY2lzaW9uLgotICAgKi8KLSAgaWYgKGNpbmZvLT5kYXRhX3ByZWNpc2lvbiA+IDgpCi0gICAgY2luZm8tPm9wdGltaXplX2NvZGluZyA9IFRSVUU7Ci0KLSAgLyogQnkgZGVmYXVsdCwgdXNlIHRoZSBzaW1wbGVyIG5vbi1jb3NpdGVkIHNhbXBsaW5nIGFsaWdubWVudCAqLwotICBjaW5mby0+Q0NJUjYwMV9zYW1wbGluZyA9IEZBTFNFOwotCi0gIC8qIE5vIGlucHV0IHNtb290aGluZyAqLwotICBjaW5mby0+c21vb3RoaW5nX2ZhY3RvciA9IDA7Ci0KLSAgLyogRENUIGFsZ29yaXRobSBwcmVmZXJlbmNlICovCi0gIGNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9ERUZBVUxUOwotCi0gIC8qIE5vIHJlc3RhcnQgbWFya2VycyAqLwotICBjaW5mby0+cmVzdGFydF9pbnRlcnZhbCA9IDA7Ci0gIGNpbmZvLT5yZXN0YXJ0X2luX3Jvd3MgPSAwOwotCi0gIC8qIEZpbGwgaW4gZGVmYXVsdCBKRklGIG1hcmtlciBwYXJhbWV0ZXJzLiAgTm90ZSB0aGF0IHdoZXRoZXIgdGhlIG1hcmtlcgotICAgKiB3aWxsIGFjdHVhbGx5IGJlIHdyaXR0ZW4gaXMgZGV0ZXJtaW5lZCBieSBqcGVnX3NldF9jb2xvcnNwYWNlLgotICAgKgotICAgKiBCeSBkZWZhdWx0LCB0aGUgbGlicmFyeSBlbWl0cyBKRklGIHZlcnNpb24gY29kZSAxLjAxLgotICAgKiBBbiBhcHBsaWNhdGlvbiB0aGF0IHdhbnRzIHRvIGVtaXQgSkZJRiAxLjAyIGV4dGVuc2lvbiBtYXJrZXJzIHNob3VsZCBzZXQKLSAgICogSkZJRl9taW5vcl92ZXJzaW9uIHRvIDIuICBXZSBjb3VsZCBwcm9iYWJseSBnZXQgYXdheSB3aXRoIGp1c3QgZGVmYXVsdGluZwotICAgKiB0byAxLjAyLCBidXQgdGhlcmUgbWF5IHN0aWxsIGJlIHNvbWUgZGVjb2RlcnMgaW4gdXNlIHRoYXQgd2lsbCBjb21wbGFpbgotICAgKiBhYm91dCB0aGF0OyBzYXlpbmcgMS4wMSBzaG91bGQgbWluaW1pemUgY29tcGF0aWJpbGl0eSBwcm9ibGVtcy4KLSAgICovCi0gIGNpbmZvLT5KRklGX21ham9yX3ZlcnNpb24gPSAxOyAvKiBEZWZhdWx0IEpGSUYgdmVyc2lvbiA9IDEuMDEgKi8KLSAgY2luZm8tPkpGSUZfbWlub3JfdmVyc2lvbiA9IDE7Ci0gIGNpbmZvLT5kZW5zaXR5X3VuaXQgPSAwOwkvKiBQaXhlbCBzaXplIGlzIHVua25vd24gYnkgZGVmYXVsdCAqLwotICBjaW5mby0+WF9kZW5zaXR5ID0gMTsJCS8qIFBpeGVsIGFzcGVjdCByYXRpbyBpcyBzcXVhcmUgYnkgZGVmYXVsdCAqLwotICBjaW5mby0+WV9kZW5zaXR5ID0gMTsKLQotICAvKiBDaG9vc2UgSlBFRyBjb2xvcnNwYWNlIGJhc2VkIG9uIGlucHV0IHNwYWNlLCBzZXQgZGVmYXVsdHMgYWNjb3JkaW5nbHkgKi8KLQotICBqcGVnX2RlZmF1bHRfY29sb3JzcGFjZShjaW5mbyk7Ci19Ci0KLQotLyoKLSAqIFNlbGVjdCBhbiBhcHByb3ByaWF0ZSBKUEVHIGNvbG9yc3BhY2UgZm9yIGluX2NvbG9yX3NwYWNlLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19kZWZhdWx0X2NvbG9yc3BhY2UgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBzd2l0Y2ggKGNpbmZvLT5pbl9jb2xvcl9zcGFjZSkgewotICBjYXNlIEpDU19HUkFZU0NBTEU6Ci0gICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX0dSQVlTQ0FMRSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSkNTX1JHQjoKLSAgICBqcGVnX3NldF9jb2xvcnNwYWNlKGNpbmZvLCBKQ1NfWUNiQ3IpOwotICAgIGJyZWFrOwotICBjYXNlIEpDU19ZQ2JDcjoKLSAgICBqcGVnX3NldF9jb2xvcnNwYWNlKGNpbmZvLCBKQ1NfWUNiQ3IpOwotICAgIGJyZWFrOwotICBjYXNlIEpDU19DTVlLOgotICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoY2luZm8sIEpDU19DTVlLKTsgLyogQnkgZGVmYXVsdCwgbm8gdHJhbnNsYXRpb24gKi8KLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfWUNDSzoKLSAgICBqcGVnX3NldF9jb2xvcnNwYWNlKGNpbmZvLCBKQ1NfWUNDSyk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSkNTX1VOS05PV046Ci0gICAganBlZ19zZXRfY29sb3JzcGFjZShjaW5mbywgSkNTX1VOS05PV04pOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0lOX0NPTE9SU1BBQ0UpOwotICB9Ci19Ci0KLQotLyoKLSAqIFNldCB0aGUgSlBFRyBjb2xvcnNwYWNlLCBhbmQgY2hvb3NlIGNvbG9yc3BhY2UtZGVwZW5kZW50IGRlZmF1bHQgdmFsdWVzLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19zZXRfY29sb3JzcGFjZSAoal9jb21wcmVzc19wdHIgY2luZm8sIEpfQ09MT1JfU1BBQ0UgY29sb3JzcGFjZSkKLXsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0gIGludCBjaTsKLQotI2RlZmluZSBTRVRfQ09NUChpbmRleCxpZCxoc2FtcCx2c2FtcCxxdWFudCxkY3RibCxhY3RibCkgIFwKLSAgKGNvbXBwdHIgPSAmY2luZm8tPmNvbXBfaW5mb1tpbmRleF0sIFwKLSAgIGNvbXBwdHItPmNvbXBvbmVudF9pZCA9IChpZCksIFwKLSAgIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgPSAoaHNhbXApLCBcCi0gICBjb21wcHRyLT52X3NhbXBfZmFjdG9yID0gKHZzYW1wKSwgXAotICAgY29tcHB0ci0+cXVhbnRfdGJsX25vID0gKHF1YW50KSwgXAotICAgY29tcHB0ci0+ZGNfdGJsX25vID0gKGRjdGJsKSwgXAotICAgY29tcHB0ci0+YWNfdGJsX25vID0gKGFjdGJsKSApCi0KLSAgLyogU2FmZXR5IGNoZWNrIHRvIGVuc3VyZSBzdGFydF9jb21wcmVzcyBub3QgY2FsbGVkIHlldC4gKi8KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NUQVJUKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0KLSAgLyogRm9yIGFsbCBjb2xvcnNwYWNlcywgd2UgdXNlIFEgYW5kIEh1ZmYgdGFibGVzIDAgZm9yIGx1bWluYW5jZSBjb21wb25lbnRzLAotICAgKiB0YWJsZXMgMSBmb3IgY2hyb21pbmFuY2UgY29tcG9uZW50cy4KLSAgICovCi0KLSAgY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBjb2xvcnNwYWNlOwotCi0gIGNpbmZvLT53cml0ZV9KRklGX2hlYWRlciA9IEZBTFNFOyAvKiBObyBtYXJrZXIgZm9yIG5vbi1KRklGIGNvbG9yc3BhY2VzICovCi0gIGNpbmZvLT53cml0ZV9BZG9iZV9tYXJrZXIgPSBGQUxTRTsgLyogd3JpdGUgbm8gQWRvYmUgbWFya2VyIGJ5IGRlZmF1bHQgKi8KLQotICBzd2l0Y2ggKGNvbG9yc3BhY2UpIHsKLSAgY2FzZSBKQ1NfR1JBWVNDQUxFOgotICAgIGNpbmZvLT53cml0ZV9KRklGX2hlYWRlciA9IFRSVUU7IC8qIFdyaXRlIGEgSkZJRiBtYXJrZXIgKi8KLSAgICBjaW5mby0+bnVtX2NvbXBvbmVudHMgPSAxOwotICAgIC8qIEpGSUYgc3BlY2lmaWVzIGNvbXBvbmVudCBJRCAxICovCi0gICAgU0VUX0NPTVAoMCwgMSwgMSwxLCAwLCAwLDApOwotICAgIGJyZWFrOwotICBjYXNlIEpDU19SR0I6Ci0gICAgY2luZm8tPndyaXRlX0Fkb2JlX21hcmtlciA9IFRSVUU7IC8qIHdyaXRlIEFkb2JlIG1hcmtlciB0byBmbGFnIFJHQiAqLwotICAgIGNpbmZvLT5udW1fY29tcG9uZW50cyA9IDM7Ci0gICAgU0VUX0NPTVAoMCwgMHg1MiAvKiAnUicgKi8sIDEsMSwgMCwgMCwwKTsKLSAgICBTRVRfQ09NUCgxLCAweDQ3IC8qICdHJyAqLywgMSwxLCAwLCAwLDApOwotICAgIFNFVF9DT01QKDIsIDB4NDIgLyogJ0InICovLCAxLDEsIDAsIDAsMCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSkNTX1lDYkNyOgotICAgIGNpbmZvLT53cml0ZV9KRklGX2hlYWRlciA9IFRSVUU7IC8qIFdyaXRlIGEgSkZJRiBtYXJrZXIgKi8KLSAgICBjaW5mby0+bnVtX2NvbXBvbmVudHMgPSAzOwotICAgIC8qIEpGSUYgc3BlY2lmaWVzIGNvbXBvbmVudCBJRHMgMSwyLDMgKi8KLSAgICAvKiBXZSBkZWZhdWx0IHRvIDJ4MiBzdWJzYW1wbGVzIG9mIGNocm9taW5hbmNlICovCi0gICAgU0VUX0NPTVAoMCwgMSwgMiwyLCAwLCAwLDApOwotICAgIFNFVF9DT01QKDEsIDIsIDEsMSwgMSwgMSwxKTsKLSAgICBTRVRfQ09NUCgyLCAzLCAxLDEsIDEsIDEsMSk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSkNTX0NNWUs6Ci0gICAgY2luZm8tPndyaXRlX0Fkb2JlX21hcmtlciA9IFRSVUU7IC8qIHdyaXRlIEFkb2JlIG1hcmtlciB0byBmbGFnIENNWUsgKi8KLSAgICBjaW5mby0+bnVtX2NvbXBvbmVudHMgPSA0OwotICAgIFNFVF9DT01QKDAsIDB4NDMgLyogJ0MnICovLCAxLDEsIDAsIDAsMCk7Ci0gICAgU0VUX0NPTVAoMSwgMHg0RCAvKiAnTScgKi8sIDEsMSwgMCwgMCwwKTsKLSAgICBTRVRfQ09NUCgyLCAweDU5IC8qICdZJyAqLywgMSwxLCAwLCAwLDApOwotICAgIFNFVF9DT01QKDMsIDB4NEIgLyogJ0snICovLCAxLDEsIDAsIDAsMCk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSkNTX1lDQ0s6Ci0gICAgY2luZm8tPndyaXRlX0Fkb2JlX21hcmtlciA9IFRSVUU7IC8qIHdyaXRlIEFkb2JlIG1hcmtlciB0byBmbGFnIFlDQ0sgKi8KLSAgICBjaW5mby0+bnVtX2NvbXBvbmVudHMgPSA0OwotICAgIFNFVF9DT01QKDAsIDEsIDIsMiwgMCwgMCwwKTsKLSAgICBTRVRfQ09NUCgxLCAyLCAxLDEsIDEsIDEsMSk7Ci0gICAgU0VUX0NPTVAoMiwgMywgMSwxLCAxLCAxLDEpOwotICAgIFNFVF9DT01QKDMsIDQsIDIsMiwgMCwgMCwwKTsKLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfVU5LTk9XTjoKLSAgICBjaW5mby0+bnVtX2NvbXBvbmVudHMgPSBjaW5mby0+aW5wdXRfY29tcG9uZW50czsKLSAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzIDwgMSB8fCBjaW5mby0+bnVtX2NvbXBvbmVudHMgPiBNQVhfQ09NUE9ORU5UUykKLSAgICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0NPTVBPTkVOVF9DT1VOVCwgY2luZm8tPm51bV9jb21wb25lbnRzLAotCSAgICAgICBNQVhfQ09NUE9ORU5UUyk7Ci0gICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0gICAgICBTRVRfQ09NUChjaSwgY2ksIDEsMSwgMCwgMCwwKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKLSAgfQotfQotCi0KLSNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotCi1MT0NBTChqcGVnX3NjYW5faW5mbyAqKQotZmlsbF9hX3NjYW4gKGpwZWdfc2Nhbl9pbmZvICogc2NhbnB0ciwgaW50IGNpLAotCSAgICAgaW50IFNzLCBpbnQgU2UsIGludCBBaCwgaW50IEFsKQotLyogU3VwcG9ydCByb3V0aW5lOiBnZW5lcmF0ZSBvbmUgc2NhbiBmb3Igc3BlY2lmaWVkIGNvbXBvbmVudCAqLwotewotICBzY2FucHRyLT5jb21wc19pbl9zY2FuID0gMTsKLSAgc2NhbnB0ci0+Y29tcG9uZW50X2luZGV4WzBdID0gY2k7Ci0gIHNjYW5wdHItPlNzID0gU3M7Ci0gIHNjYW5wdHItPlNlID0gU2U7Ci0gIHNjYW5wdHItPkFoID0gQWg7Ci0gIHNjYW5wdHItPkFsID0gQWw7Ci0gIHNjYW5wdHIrKzsKLSAgcmV0dXJuIHNjYW5wdHI7Ci19Ci0KLUxPQ0FMKGpwZWdfc2Nhbl9pbmZvICopCi1maWxsX3NjYW5zIChqcGVnX3NjYW5faW5mbyAqIHNjYW5wdHIsIGludCBuY29tcHMsCi0JICAgIGludCBTcywgaW50IFNlLCBpbnQgQWgsIGludCBBbCkKLS8qIFN1cHBvcnQgcm91dGluZTogZ2VuZXJhdGUgb25lIHNjYW4gZm9yIGVhY2ggY29tcG9uZW50ICovCi17Ci0gIGludCBjaTsKLQotICBmb3IgKGNpID0gMDsgY2kgPCBuY29tcHM7IGNpKyspIHsKLSAgICBzY2FucHRyLT5jb21wc19pbl9zY2FuID0gMTsKLSAgICBzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbMF0gPSBjaTsKLSAgICBzY2FucHRyLT5TcyA9IFNzOwotICAgIHNjYW5wdHItPlNlID0gU2U7Ci0gICAgc2NhbnB0ci0+QWggPSBBaDsKLSAgICBzY2FucHRyLT5BbCA9IEFsOwotICAgIHNjYW5wdHIrKzsKLSAgfQotICByZXR1cm4gc2NhbnB0cjsKLX0KLQotTE9DQUwoanBlZ19zY2FuX2luZm8gKikKLWZpbGxfZGNfc2NhbnMgKGpwZWdfc2Nhbl9pbmZvICogc2NhbnB0ciwgaW50IG5jb21wcywgaW50IEFoLCBpbnQgQWwpCi0vKiBTdXBwb3J0IHJvdXRpbmU6IGdlbmVyYXRlIGludGVybGVhdmVkIERDIHNjYW4gaWYgcG9zc2libGUsIGVsc2UgTiBzY2FucyAqLwotewotICBpbnQgY2k7Ci0KLSAgaWYgKG5jb21wcyA8PSBNQVhfQ09NUFNfSU5fU0NBTikgewotICAgIC8qIFNpbmdsZSBpbnRlcmxlYXZlZCBEQyBzY2FuICovCi0gICAgc2NhbnB0ci0+Y29tcHNfaW5fc2NhbiA9IG5jb21wczsKLSAgICBmb3IgKGNpID0gMDsgY2kgPCBuY29tcHM7IGNpKyspCi0gICAgICBzY2FucHRyLT5jb21wb25lbnRfaW5kZXhbY2ldID0gY2k7Ci0gICAgc2NhbnB0ci0+U3MgPSBzY2FucHRyLT5TZSA9IDA7Ci0gICAgc2NhbnB0ci0+QWggPSBBaDsKLSAgICBzY2FucHRyLT5BbCA9IEFsOwotICAgIHNjYW5wdHIrKzsKLSAgfSBlbHNlIHsKLSAgICAvKiBOb25pbnRlcmxlYXZlZCBEQyBzY2FuIGZvciBlYWNoIGNvbXBvbmVudCAqLwotICAgIHNjYW5wdHIgPSBmaWxsX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMCwgMCwgQWgsIEFsKTsKLSAgfQotICByZXR1cm4gc2NhbnB0cjsKLX0KLQotCi0vKgotICogQ3JlYXRlIGEgcmVjb21tZW5kZWQgcHJvZ3Jlc3NpdmUtSlBFRyBzY3JpcHQuCi0gKiBjaW5mby0+bnVtX2NvbXBvbmVudHMgYW5kIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlIG11c3QgYmUgY29ycmVjdC4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfc2ltcGxlX3Byb2dyZXNzaW9uIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaW50IG5jb21wcyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgaW50IG5zY2FuczsKLSAganBlZ19zY2FuX2luZm8gKiBzY2FucHRyOwotCi0gIC8qIFNhZmV0eSBjaGVjayB0byBlbnN1cmUgc3RhcnRfY29tcHJlc3Mgbm90IGNhbGxlZCB5ZXQuICovCi0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IENTVEFURV9TVEFSVCkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotCi0gIC8qIEZpZ3VyZSBzcGFjZSBuZWVkZWQgZm9yIHNjcmlwdC4gIENhbGN1bGF0aW9uIG11c3QgbWF0Y2ggY29kZSBiZWxvdyEgKi8KLSAgaWYgKG5jb21wcyA9PSAzICYmIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDcikgewotICAgIC8qIEN1c3RvbSBzY3JpcHQgZm9yIFlDYkNyIGNvbG9yIGltYWdlcy4gKi8KLSAgICBuc2NhbnMgPSAxMDsKLSAgfSBlbHNlIHsKLSAgICAvKiBBbGwtcHVycG9zZSBzY3JpcHQgZm9yIG90aGVyIGNvbG9yIHNwYWNlcy4gKi8KLSAgICBpZiAobmNvbXBzID4gTUFYX0NPTVBTX0lOX1NDQU4pCi0gICAgICBuc2NhbnMgPSA2ICogbmNvbXBzOwkvKiAyIERDICsgNCBBQyBzY2FucyBwZXIgY29tcG9uZW50ICovCi0gICAgZWxzZQotICAgICAgbnNjYW5zID0gMiArIDQgKiBuY29tcHM7CS8qIDIgREMgc2NhbnM7IDQgQUMgc2NhbnMgcGVyIGNvbXBvbmVudCAqLwotICB9Ci0KLSAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHNjcmlwdC4KLSAgICogV2UgbmVlZCB0byBwdXQgaXQgaW4gdGhlIHBlcm1hbmVudCBwb29sIGluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHBlcmZvcm1zCi0gICAqIG11bHRpcGxlIGNvbXByZXNzaW9ucyB3aXRob3V0IGNoYW5naW5nIHRoZSBzZXR0aW5ncy4gIFRvIGF2b2lkIGEgbWVtb3J5Ci0gICAqIGxlYWsgaWYganBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24gaXMgY2FsbGVkIHJlcGVhdGVkbHkgZm9yIHRoZSBzYW1lIEpQRUcKLSAgICogb2JqZWN0LCB3ZSB0cnkgdG8gcmUtdXNlIHByZXZpb3VzbHkgYWxsb2NhdGVkIHNwYWNlLCBhbmQgd2UgYWxsb2NhdGUKLSAgICogZW5vdWdoIHNwYWNlIHRvIGhhbmRsZSBZQ2JDciBldmVuIGlmIGluaXRpYWxseSBhc2tlZCBmb3IgZ3JheXNjYWxlLgotICAgKi8KLSAgaWYgKGNpbmZvLT5zY3JpcHRfc3BhY2UgPT0gTlVMTCB8fCBjaW5mby0+c2NyaXB0X3NwYWNlX3NpemUgPCBuc2NhbnMpIHsKLSAgICBjaW5mby0+c2NyaXB0X3NwYWNlX3NpemUgPSBNQVgobnNjYW5zLCAxMCk7Ci0gICAgY2luZm8tPnNjcmlwdF9zcGFjZSA9IChqcGVnX3NjYW5faW5mbyAqKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9QRVJNQU5FTlQsCi0JCQljaW5mby0+c2NyaXB0X3NwYWNlX3NpemUgKiBTSVpFT0YoanBlZ19zY2FuX2luZm8pKTsKLSAgfQotICBzY2FucHRyID0gY2luZm8tPnNjcmlwdF9zcGFjZTsKLSAgY2luZm8tPnNjYW5faW5mbyA9IHNjYW5wdHI7Ci0gIGNpbmZvLT5udW1fc2NhbnMgPSBuc2NhbnM7Ci0KLSAgaWYgKG5jb21wcyA9PSAzICYmIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDcikgewotICAgIC8qIEN1c3RvbSBzY3JpcHQgZm9yIFlDYkNyIGNvbG9yIGltYWdlcy4gKi8KLSAgICAvKiBJbml0aWFsIERDIHNjYW4gKi8KLSAgICBzY2FucHRyID0gZmlsbF9kY19zY2FucyhzY2FucHRyLCBuY29tcHMsIDAsIDEpOwotICAgIC8qIEluaXRpYWwgQUMgc2NhbjogZ2V0IHNvbWUgbHVtYSBkYXRhIG91dCBpbiBhIGh1cnJ5ICovCi0gICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDAsIDEsIDUsIDAsIDIpOwotICAgIC8qIENocm9tYSBkYXRhIGlzIHRvbyBzbWFsbCB0byBiZSB3b3J0aCBleHBlbmRpbmcgbWFueSBzY2FucyBvbiAqLwotICAgIHNjYW5wdHIgPSBmaWxsX2Ffc2NhbihzY2FucHRyLCAyLCAxLCA2MywgMCwgMSk7Ci0gICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDEsIDEsIDYzLCAwLCAxKTsKLSAgICAvKiBDb21wbGV0ZSBzcGVjdHJhbCBzZWxlY3Rpb24gZm9yIGx1bWEgQUMgKi8KLSAgICBzY2FucHRyID0gZmlsbF9hX3NjYW4oc2NhbnB0ciwgMCwgNiwgNjMsIDAsIDIpOwotICAgIC8qIFJlZmluZSBuZXh0IGJpdCBvZiBsdW1hIEFDICovCi0gICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDAsIDEsIDYzLCAyLCAxKTsKLSAgICAvKiBGaW5pc2ggREMgc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uICovCi0gICAgc2NhbnB0ciA9IGZpbGxfZGNfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAxLCAwKTsKLSAgICAvKiBGaW5pc2ggQUMgc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uICovCi0gICAgc2NhbnB0ciA9IGZpbGxfYV9zY2FuKHNjYW5wdHIsIDIsIDEsIDYzLCAxLCAwKTsKLSAgICBzY2FucHRyID0gZmlsbF9hX3NjYW4oc2NhbnB0ciwgMSwgMSwgNjMsIDEsIDApOwotICAgIC8qIEx1bWEgYm90dG9tIGJpdCBjb21lcyBsYXN0IHNpbmNlIGl0J3MgdXN1YWxseSBsYXJnZXN0IHNjYW4gKi8KLSAgICBzY2FucHRyID0gZmlsbF9hX3NjYW4oc2NhbnB0ciwgMCwgMSwgNjMsIDEsIDApOwotICB9IGVsc2UgewotICAgIC8qIEFsbC1wdXJwb3NlIHNjcmlwdCBmb3Igb3RoZXIgY29sb3Igc3BhY2VzLiAqLwotICAgIC8qIFN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiBmaXJzdCBwYXNzICovCi0gICAgc2NhbnB0ciA9IGZpbGxfZGNfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAwLCAxKTsKLSAgICBzY2FucHRyID0gZmlsbF9zY2FucyhzY2FucHRyLCBuY29tcHMsIDEsIDUsIDAsIDIpOwotICAgIHNjYW5wdHIgPSBmaWxsX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgNiwgNjMsIDAsIDIpOwotICAgIC8qIFN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiBzZWNvbmQgcGFzcyAqLwotICAgIHNjYW5wdHIgPSBmaWxsX3NjYW5zKHNjYW5wdHIsIG5jb21wcywgMSwgNjMsIDIsIDEpOwotICAgIC8qIFN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiBmaW5hbCBwYXNzICovCi0gICAgc2NhbnB0ciA9IGZpbGxfZGNfc2NhbnMoc2NhbnB0ciwgbmNvbXBzLCAxLCAwKTsKLSAgICBzY2FucHRyID0gZmlsbF9zY2FucyhzY2FucHRyLCBuY29tcHMsIDEsIDYzLCAxLCAwKTsKLSAgfQotfQotCi0jZW5kaWYgLyogQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY3BodWZmLmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamNwaHVmZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2Y5MTc4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY3BodWZmLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MzMgKzAsMCBAQAotLyoKLSAqIGpjcGh1ZmYuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIEh1ZmZtYW4gZW50cm9weSBlbmNvZGluZyByb3V0aW5lcyBmb3IgcHJvZ3Jlc3NpdmUgSlBFRy4KLSAqCi0gKiBXZSBkbyBub3Qgc3VwcG9ydCBvdXRwdXQgc3VzcGVuc2lvbiBpbiB0aGlzIG1vZHVsZSwgc2luY2UgdGhlIGxpYnJhcnkKLSAqIGN1cnJlbnRseSBkb2VzIG5vdCBhbGxvdyBtdWx0aXBsZS1zY2FuIGZpbGVzIHRvIGJlIHdyaXR0ZW4gd2l0aCBvdXRwdXQKLSAqIHN1c3BlbnNpb24uCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImpjaHVmZi5oIgkJLyogRGVjbGFyYXRpb25zIHNoYXJlZCB3aXRoIGpjaHVmZi5jICovCi0KLSNpZmRlZiBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAotCi0vKiBFeHBhbmRlZCBlbnRyb3B5IGVuY29kZXIgb2JqZWN0IGZvciBwcm9ncmVzc2l2ZSBIdWZmbWFuIGVuY29kaW5nLiAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBNb2RlIGZsYWc6IFRSVUUgZm9yIG9wdGltaXphdGlvbiwgRkFMU0UgZm9yIGFjdHVhbCBkYXRhIG91dHB1dCAqLwotICBib29sZWFuIGdhdGhlcl9zdGF0aXN0aWNzOwotCi0gIC8qIEJpdC1sZXZlbCBjb2Rpbmcgc3RhdHVzLgotICAgKiBuZXh0X291dHB1dF9ieXRlL2ZyZWVfaW5fYnVmZmVyIGFyZSBsb2NhbCBjb3BpZXMgb2YgY2luZm8tPmRlc3QgZmllbGRzLgotICAgKi8KLSAgSk9DVEVUICogbmV4dF9vdXRwdXRfYnl0ZTsJLyogPT4gbmV4dCBieXRlIHRvIHdyaXRlIGluIGJ1ZmZlciAqLwotICBzaXplX3QgZnJlZV9pbl9idWZmZXI7CS8qICMgb2YgYnl0ZSBzcGFjZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLwotICBJTlQzMiBwdXRfYnVmZmVyOwkJLyogY3VycmVudCBiaXQtYWNjdW11bGF0aW9uIGJ1ZmZlciAqLwotICBpbnQgcHV0X2JpdHM7CQkJLyogIyBvZiBiaXRzIG5vdyBpbiBpdCAqLwotICBqX2NvbXByZXNzX3B0ciBjaW5mbzsJCS8qIGxpbmsgdG8gY2luZm8gKG5lZWRlZCBmb3IgZHVtcF9idWZmZXIpICovCi0KLSAgLyogQ29kaW5nIHN0YXR1cyBmb3IgREMgY29tcG9uZW50cyAqLwotICBpbnQgbGFzdF9kY192YWxbTUFYX0NPTVBTX0lOX1NDQU5dOyAvKiBsYXN0IERDIGNvZWYgZm9yIGVhY2ggY29tcG9uZW50ICovCi0KLSAgLyogQ29kaW5nIHN0YXR1cyBmb3IgQUMgY29tcG9uZW50cyAqLwotICBpbnQgYWNfdGJsX25vOwkJLyogdGhlIHRhYmxlIG51bWJlciBvZiB0aGUgc2luZ2xlIGNvbXBvbmVudCAqLwotICB1bnNpZ25lZCBpbnQgRU9CUlVOOwkJLyogcnVuIGxlbmd0aCBvZiBFT0JzICovCi0gIHVuc2lnbmVkIGludCBCRTsJCS8qICMgb2YgYnVmZmVyZWQgY29ycmVjdGlvbiBiaXRzIGJlZm9yZSBNQ1UgKi8KLSAgY2hhciAqIGJpdF9idWZmZXI7CQkvKiBidWZmZXIgZm9yIGNvcnJlY3Rpb24gYml0cyAoMSBwZXIgY2hhcikgKi8KLSAgLyogcGFja2luZyBjb3JyZWN0aW9uIGJpdHMgdGlnaHRseSB3b3VsZCBzYXZlIHNvbWUgc3BhY2UgYnV0IGNvc3QgdGltZS4uLiAqLwotCi0gIHVuc2lnbmVkIGludCByZXN0YXJ0c190b19nbzsJLyogTUNVcyBsZWZ0IGluIHRoaXMgcmVzdGFydCBpbnRlcnZhbCAqLwotICBpbnQgbmV4dF9yZXN0YXJ0X251bTsJCS8qIG5leHQgcmVzdGFydCBudW1iZXIgdG8gd3JpdGUgKDAtNykgKi8KLQotICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyAodGhlc2Ugd29ya3NwYWNlcyBoYXZlIGltYWdlIGxpZmVzcGFuKS4KLSAgICogU2luY2UgYW55IG9uZSBzY2FuIGNvZGVzIG9ubHkgREMgb3Igb25seSBBQywgd2Ugb25seSBuZWVkIG9uZSBzZXQKLSAgICogb2YgdGFibGVzLCBub3Qgb25lIGZvciBEQyBhbmQgb25lIGZvciBBQy4KLSAgICovCi0gIGNfZGVyaXZlZF90YmwgKiBkZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107Ci0KLSAgLyogU3RhdGlzdGljcyB0YWJsZXMgZm9yIG9wdGltaXphdGlvbjsgYWdhaW4sIG9uZSBzZXQgaXMgZW5vdWdoICovCi0gIGxvbmcgKiBjb3VudF9wdHJzW05VTV9IVUZGX1RCTFNdOwotfSBwaHVmZl9lbnRyb3B5X2VuY29kZXI7Ci0KLXR5cGVkZWYgcGh1ZmZfZW50cm9weV9lbmNvZGVyICogcGh1ZmZfZW50cm9weV9wdHI7Ci0KLS8qIE1BWF9DT1JSX0JJVFMgaXMgdGhlIG51bWJlciBvZiBiaXRzIHRoZSBBQyByZWZpbmVtZW50IGNvcnJlY3Rpb24tYml0Ci0gKiBidWZmZXIgY2FuIGhvbGQuICBMYXJnZXIgc2l6ZXMgbWF5IHNsaWdodGx5IGltcHJvdmUgY29tcHJlc3Npb24sIGJ1dAotICogMTAwMCBpcyBhbHJlYWR5IHdlbGwgaW50byB0aGUgcmVhbG0gb2Ygb3ZlcmtpbGwuCi0gKiBUaGUgbWluaW11bSBzYWZlIHNpemUgaXMgNjQgYml0cy4KLSAqLwotCi0jZGVmaW5lIE1BWF9DT1JSX0JJVFMgIDEwMDAJLyogTWF4ICMgb2YgY29ycmVjdGlvbiBiaXRzIEkgY2FuIGJ1ZmZlciAqLwotCi0vKiBJUklHSFRfU0hJRlQgaXMgbGlrZSBSSUdIVF9TSElGVCwgYnV0IHdvcmtzIG9uIGludCByYXRoZXIgdGhhbiBJTlQzMi4KLSAqIFdlIGFzc3VtZSB0aGF0IGludCByaWdodCBzaGlmdCBpcyB1bnNpZ25lZCBpZiBJTlQzMiByaWdodCBzaGlmdCBpcywKLSAqIHdoaWNoIHNob3VsZCBiZSBzYWZlLgotICovCi0KLSNpZmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAotI2RlZmluZSBJU0hJRlRfVEVNUFMJaW50IGlzaGlmdF90ZW1wOwotI2RlZmluZSBJUklHSFRfU0hJRlQoeCxzaGZ0KSAgXAotCSgoaXNoaWZ0X3RlbXAgPSAoeCkpIDwgMCA/IFwKLQkgKGlzaGlmdF90ZW1wID4+IChzaGZ0KSkgfCAoKH4wKSA8PCAoMTYtKHNoZnQpKSkgOiBcCi0JIChpc2hpZnRfdGVtcCA+PiAoc2hmdCkpKQotI2Vsc2UKLSNkZWZpbmUgSVNISUZUX1RFTVBTCi0jZGVmaW5lIElSSUdIVF9TSElGVCh4LHNoZnQpCSgoeCkgPj4gKHNoZnQpKQotI2VuZGlmCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi1NRVRIT0RERUYoYm9vbGVhbikgZW5jb2RlX21jdV9EQ19maXJzdCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOwotTUVUSE9EREVGKGJvb2xlYW4pIGVuY29kZV9tY3VfQUNfZmlyc3QgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKLU1FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X0RDX3JlZmluZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKLU1FVEhPRERFRihib29sZWFuKSBlbmNvZGVfbWN1X0FDX3JlZmluZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKLU1FVEhPRERFRih2b2lkKSBmaW5pc2hfcGFzc19waHVmZiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1NRVRIT0RERUYodm9pZCkgZmluaXNoX3Bhc3NfZ2F0aGVyX3BodWZmIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2NhbiB1c2luZyBwcm9ncmVzc2l2ZSBKUEVHLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzc19waHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gZ2F0aGVyX3N0YXRpc3RpY3MpCi17ICAKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGJvb2xlYW4gaXNfRENfYmFuZDsKLSAgaW50IGNpLCB0Ymw7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotCi0gIGVudHJvcHktPmNpbmZvID0gY2luZm87Ci0gIGVudHJvcHktPmdhdGhlcl9zdGF0aXN0aWNzID0gZ2F0aGVyX3N0YXRpc3RpY3M7Ci0KLSAgaXNfRENfYmFuZCA9IChjaW5mby0+U3MgPT0gMCk7Ci0KLSAgLyogV2UgYXNzdW1lIGpjbWFzdGVyLmMgYWxyZWFkeSB2YWxpZGF0ZWQgdGhlIHNjYW4gcGFyYW1ldGVycy4gKi8KLQotICAvKiBTZWxlY3QgZXhlY3V0aW9uIHJvdXRpbmVzICovCi0gIGlmIChjaW5mby0+QWggPT0gMCkgewotICAgIGlmIChpc19EQ19iYW5kKQotICAgICAgZW50cm9weS0+cHViLmVuY29kZV9tY3UgPSBlbmNvZGVfbWN1X0RDX2ZpcnN0OwotICAgIGVsc2UKLSAgICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9BQ19maXJzdDsKLSAgfSBlbHNlIHsKLSAgICBpZiAoaXNfRENfYmFuZCkKLSAgICAgIGVudHJvcHktPnB1Yi5lbmNvZGVfbWN1ID0gZW5jb2RlX21jdV9EQ19yZWZpbmU7Ci0gICAgZWxzZSB7Ci0gICAgICBlbnRyb3B5LT5wdWIuZW5jb2RlX21jdSA9IGVuY29kZV9tY3VfQUNfcmVmaW5lOwotICAgICAgLyogQUMgcmVmaW5lbWVudCBuZWVkcyBhIGNvcnJlY3Rpb24gYml0IGJ1ZmZlciAqLwotICAgICAgaWYgKGVudHJvcHktPmJpdF9idWZmZXIgPT0gTlVMTCkKLQllbnRyb3B5LT5iaXRfYnVmZmVyID0gKGNoYXIgKikKLQkgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICAgICAgTUFYX0NPUlJfQklUUyAqIFNJWkVPRihjaGFyKSk7Ci0gICAgfQotICB9Ci0gIGlmIChnYXRoZXJfc3RhdGlzdGljcykKLSAgICBlbnRyb3B5LT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19nYXRoZXJfcGh1ZmY7Ci0gIGVsc2UKLSAgICBlbnRyb3B5LT5wdWIuZmluaXNoX3Bhc3MgPSBmaW5pc2hfcGFzc19waHVmZjsKLQotICAvKiBPbmx5IERDIGNvZWZmaWNpZW50cyBtYXkgYmUgaW50ZXJsZWF2ZWQsIHNvIGNpbmZvLT5jb21wc19pbl9zY2FuID0gMQotICAgKiBmb3IgQUMgY29lZmZpY2llbnRzLgotICAgKi8KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIC8qIEluaXRpYWxpemUgREMgcHJlZGljdGlvbnMgdG8gMCAqLwotICAgIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXSA9IDA7Ci0gICAgLyogR2V0IHRhYmxlIGluZGV4ICovCi0gICAgaWYgKGlzX0RDX2JhbmQpIHsKLSAgICAgIGlmIChjaW5mby0+QWggIT0gMCkJLyogREMgcmVmaW5lbWVudCBuZWVkcyBubyB0YWJsZSAqLwotCWNvbnRpbnVlOwotICAgICAgdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOwotICAgIH0gZWxzZSB7Ci0gICAgICBlbnRyb3B5LT5hY190Ymxfbm8gPSB0YmwgPSBjb21wcHRyLT5hY190Ymxfbm87Ci0gICAgfQotICAgIGlmIChnYXRoZXJfc3RhdGlzdGljcykgewotICAgICAgLyogQ2hlY2sgZm9yIGludmFsaWQgdGFibGUgaW5kZXggKi8KLSAgICAgIC8qIChtYWtlX2NfZGVyaXZlZF90YmwgZG9lcyB0aGlzIGluIHRoZSBvdGhlciBwYXRoKSAqLwotICAgICAgaWYgKHRibCA8IDAgfHwgdGJsID49IE5VTV9IVUZGX1RCTFMpCi0gICAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIHRibCk7Ci0gICAgICAvKiBBbGxvY2F0ZSBhbmQgemVybyB0aGUgc3RhdGlzdGljcyB0YWJsZXMgKi8KLSAgICAgIC8qIE5vdGUgdGhhdCBqcGVnX2dlbl9vcHRpbWFsX3RhYmxlIGV4cGVjdHMgMjU3IGVudHJpZXMgaW4gZWFjaCB0YWJsZSEgKi8KLSAgICAgIGlmIChlbnRyb3B5LT5jb3VudF9wdHJzW3RibF0gPT0gTlVMTCkKLQllbnRyb3B5LT5jb3VudF9wdHJzW3RibF0gPSAobG9uZyAqKQotCSAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgICAgICAyNTcgKiBTSVpFT0YobG9uZykpOwotICAgICAgTUVNWkVSTyhlbnRyb3B5LT5jb3VudF9wdHJzW3RibF0sIDI1NyAqIFNJWkVPRihsb25nKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIENvbXB1dGUgZGVyaXZlZCB2YWx1ZXMgZm9yIEh1ZmZtYW4gdGFibGUgKi8KLSAgICAgIC8qIFdlIG1heSBkbyB0aGlzIG1vcmUgdGhhbiBvbmNlIGZvciBhIHRhYmxlLCBidXQgaXQncyBub3QgZXhwZW5zaXZlICovCi0gICAgICBqcGVnX21ha2VfY19kZXJpdmVkX3RibChjaW5mbywgaXNfRENfYmFuZCwgdGJsLAotCQkJICAgICAgJiBlbnRyb3B5LT5kZXJpdmVkX3RibHNbdGJsXSk7Ci0gICAgfQotICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSBBQyBzdHVmZiAqLwotICBlbnRyb3B5LT5FT0JSVU4gPSAwOwotICBlbnRyb3B5LT5CRSA9IDA7Ci0KLSAgLyogSW5pdGlhbGl6ZSBiaXQgYnVmZmVyIHRvIGVtcHR5ICovCi0gIGVudHJvcHktPnB1dF9idWZmZXIgPSAwOwotICBlbnRyb3B5LT5wdXRfYml0cyA9IDA7Ci0KLSAgLyogSW5pdGlhbGl6ZSByZXN0YXJ0IHN0dWZmICovCi0gIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7Ci0gIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gPSAwOwotfQotCi0KLS8qIE91dHB1dHRpbmcgYnl0ZXMgdG8gdGhlIGZpbGUuCi0gKiBOQjogdGhlc2UgbXVzdCBiZSBjYWxsZWQgb25seSB3aGVuIGFjdHVhbGx5IG91dHB1dHRpbmcsCi0gKiB0aGF0IGlzLCBlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcyA9PSBGQUxTRS4KLSAqLwotCi0vKiBFbWl0IGEgYnl0ZSAqLwotI2RlZmluZSBlbWl0X2J5dGUoZW50cm9weSx2YWwpICBcCi0JeyAqKGVudHJvcHkpLT5uZXh0X291dHB1dF9ieXRlKysgPSAoSk9DVEVUKSAodmFsKTsgIFwKLQkgIGlmICgtLShlbnRyb3B5KS0+ZnJlZV9pbl9idWZmZXIgPT0gMCkgIFwKLQkgICAgZHVtcF9idWZmZXIoZW50cm9weSk7IH0KLQotCi1MT0NBTCh2b2lkKQotZHVtcF9idWZmZXIgKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkpCi0vKiBFbXB0eSB0aGUgb3V0cHV0IGJ1ZmZlcjsgd2UgZG8gbm90IHN1cHBvcnQgc3VzcGVuc2lvbiBpbiB0aGlzIG1vZHVsZS4gKi8KLXsKLSAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICogZGVzdCA9IGVudHJvcHktPmNpbmZvLT5kZXN0OwotCi0gIGlmICghICgqZGVzdC0+ZW1wdHlfb3V0cHV0X2J1ZmZlcikgKGVudHJvcHktPmNpbmZvKSkKLSAgICBFUlJFWElUKGVudHJvcHktPmNpbmZvLCBKRVJSX0NBTlRfU1VTUEVORCk7Ci0gIC8qIEFmdGVyIGEgc3VjY2Vzc2Z1bCBidWZmZXIgZHVtcCwgbXVzdCByZXNldCBidWZmZXIgcG9pbnRlcnMgKi8KLSAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGRlc3QtPm5leHRfb3V0cHV0X2J5dGU7Ci0gIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gZGVzdC0+ZnJlZV9pbl9idWZmZXI7Ci19Ci0KLQotLyogT3V0cHV0dGluZyBiaXRzIHRvIHRoZSBmaWxlICovCi0KLS8qIE9ubHkgdGhlIHJpZ2h0IDI0IGJpdHMgb2YgcHV0X2J1ZmZlciBhcmUgdXNlZDsgdGhlIHZhbGlkIGJpdHMgYXJlCi0gKiBsZWZ0LWp1c3RpZmllZCBpbiB0aGlzIHBhcnQuICBBdCBtb3N0IDE2IGJpdHMgY2FuIGJlIHBhc3NlZCB0byBlbWl0X2JpdHMKLSAqIGluIG9uZSBjYWxsLCBhbmQgd2UgbmV2ZXIgcmV0YWluIG1vcmUgdGhhbiA3IGJpdHMgaW4gcHV0X2J1ZmZlcgotICogYmV0d2VlbiBjYWxscywgc28gMjQgYml0cyBhcmUgc3VmZmljaWVudC4KLSAqLwotCi1JTkxJTkUKLUxPQ0FMKHZvaWQpCi1lbWl0X2JpdHMgKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHksIHVuc2lnbmVkIGludCBjb2RlLCBpbnQgc2l6ZSkKLS8qIEVtaXQgc29tZSBiaXRzLCB1bmxlc3Mgd2UgYXJlIGluIGdhdGhlciBtb2RlICovCi17Ci0gIC8qIFRoaXMgcm91dGluZSBpcyBoZWF2aWx5IHVzZWQsIHNvIGl0J3Mgd29ydGggY29kaW5nIHRpZ2h0bHkuICovCi0gIHJlZ2lzdGVyIElOVDMyIHB1dF9idWZmZXIgPSAoSU5UMzIpIGNvZGU7Ci0gIHJlZ2lzdGVyIGludCBwdXRfYml0cyA9IGVudHJvcHktPnB1dF9iaXRzOwotCi0gIC8qIGlmIHNpemUgaXMgMCwgY2FsbGVyIHVzZWQgYW4gaW52YWxpZCBIdWZmbWFuIHRhYmxlIGVudHJ5ICovCi0gIGlmIChzaXplID09IDApCi0gICAgRVJSRVhJVChlbnRyb3B5LT5jaW5mbywgSkVSUl9IVUZGX01JU1NJTkdfQ09ERSk7Ci0KLSAgaWYgKGVudHJvcHktPmdhdGhlcl9zdGF0aXN0aWNzKQotICAgIHJldHVybjsJCQkvKiBkbyBub3RoaW5nIGlmIHdlJ3JlIG9ubHkgZ2V0dGluZyBzdGF0cyAqLwotCi0gIHB1dF9idWZmZXIgJj0gKCgoSU5UMzIpIDEpPDxzaXplKSAtIDE7IC8qIG1hc2sgb2ZmIGFueSBleHRyYSBiaXRzIGluIGNvZGUgKi8KLSAgCi0gIHB1dF9iaXRzICs9IHNpemU7CQkvKiBuZXcgbnVtYmVyIG9mIGJpdHMgaW4gYnVmZmVyICovCi0gIAotICBwdXRfYnVmZmVyIDw8PSAyNCAtIHB1dF9iaXRzOyAvKiBhbGlnbiBpbmNvbWluZyBiaXRzICovCi0KLSAgcHV0X2J1ZmZlciB8PSBlbnRyb3B5LT5wdXRfYnVmZmVyOyAvKiBhbmQgbWVyZ2Ugd2l0aCBvbGQgYnVmZmVyIGNvbnRlbnRzICovCi0KLSAgd2hpbGUgKHB1dF9iaXRzID49IDgpIHsKLSAgICBpbnQgYyA9IChpbnQpICgocHV0X2J1ZmZlciA+PiAxNikgJiAweEZGKTsKLSAgICAKLSAgICBlbWl0X2J5dGUoZW50cm9weSwgYyk7Ci0gICAgaWYgKGMgPT0gMHhGRikgewkJLyogbmVlZCB0byBzdHVmZiBhIHplcm8gYnl0ZT8gKi8KLSAgICAgIGVtaXRfYnl0ZShlbnRyb3B5LCAwKTsKLSAgICB9Ci0gICAgcHV0X2J1ZmZlciA8PD0gODsKLSAgICBwdXRfYml0cyAtPSA4OwotICB9Ci0KLSAgZW50cm9weS0+cHV0X2J1ZmZlciA9IHB1dF9idWZmZXI7IC8qIHVwZGF0ZSB2YXJpYWJsZXMgKi8KLSAgZW50cm9weS0+cHV0X2JpdHMgPSBwdXRfYml0czsKLX0KLQotCi1MT0NBTCh2b2lkKQotZmx1c2hfYml0cyAocGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSkKLXsKLSAgZW1pdF9iaXRzKGVudHJvcHksIDB4N0YsIDcpOyAvKiBmaWxsIGFueSBwYXJ0aWFsIGJ5dGUgd2l0aCBvbmVzICovCi0gIGVudHJvcHktPnB1dF9idWZmZXIgPSAwOyAgICAgLyogYW5kIHJlc2V0IGJpdC1idWZmZXIgdG8gZW1wdHkgKi8KLSAgZW50cm9weS0+cHV0X2JpdHMgPSAwOwotfQotCi0KLS8qCi0gKiBFbWl0IChvciBqdXN0IGNvdW50KSBhIEh1ZmZtYW4gc3ltYm9sLgotICovCi0KLUlOTElORQotTE9DQUwodm9pZCkKLWVtaXRfc3ltYm9sIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBpbnQgdGJsX25vLCBpbnQgc3ltYm9sKQotewotICBpZiAoZW50cm9weS0+Z2F0aGVyX3N0YXRpc3RpY3MpCi0gICAgZW50cm9weS0+Y291bnRfcHRyc1t0Ymxfbm9dW3N5bWJvbF0rKzsKLSAgZWxzZSB7Ci0gICAgY19kZXJpdmVkX3RibCAqIHRibCA9IGVudHJvcHktPmRlcml2ZWRfdGJsc1t0Ymxfbm9dOwotICAgIGVtaXRfYml0cyhlbnRyb3B5LCB0YmwtPmVodWZjb1tzeW1ib2xdLCB0YmwtPmVodWZzaVtzeW1ib2xdKTsKLSAgfQotfQotCi0KLS8qCi0gKiBFbWl0IGJpdHMgZnJvbSBhIGNvcnJlY3Rpb24gYml0IGJ1ZmZlci4KLSAqLwotCi1MT0NBTCh2b2lkKQotZW1pdF9idWZmZXJlZF9iaXRzIChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBjaGFyICogYnVmc3RhcnQsCi0JCSAgICB1bnNpZ25lZCBpbnQgbmJpdHMpCi17Ci0gIGlmIChlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcykKLSAgICByZXR1cm47CQkJLyogbm8gcmVhbCB3b3JrICovCi0KLSAgd2hpbGUgKG5iaXRzID4gMCkgewotICAgIGVtaXRfYml0cyhlbnRyb3B5LCAodW5zaWduZWQgaW50KSAoKmJ1ZnN0YXJ0KSwgMSk7Ci0gICAgYnVmc3RhcnQrKzsKLSAgICBuYml0cy0tOwotICB9Ci19Ci0KLQotLyoKLSAqIEVtaXQgYW55IHBlbmRpbmcgRU9CUlVOIHN5bWJvbC4KLSAqLwotCi1MT0NBTCh2b2lkKQotZW1pdF9lb2JydW4gKHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkpCi17Ci0gIHJlZ2lzdGVyIGludCB0ZW1wLCBuYml0czsKLQotICBpZiAoZW50cm9weS0+RU9CUlVOID4gMCkgewkvKiBpZiB0aGVyZSBpcyBhbnkgcGVuZGluZyBFT0JSVU4gKi8KLSAgICB0ZW1wID0gZW50cm9weS0+RU9CUlVOOwotICAgIG5iaXRzID0gMDsKLSAgICB3aGlsZSAoKHRlbXAgPj49IDEpKQotICAgICAgbmJpdHMrKzsKLSAgICAvKiBzYWZldHkgY2hlY2s6IHNob3VsZG4ndCBoYXBwZW4gZ2l2ZW4gbGltaXRlZCBjb3JyZWN0aW9uLWJpdCBidWZmZXIgKi8KLSAgICBpZiAobmJpdHMgPiAxNCkKLSAgICAgIEVSUkVYSVQoZW50cm9weS0+Y2luZm8sIEpFUlJfSFVGRl9NSVNTSU5HX0NPREUpOwotCi0gICAgZW1pdF9zeW1ib2woZW50cm9weSwgZW50cm9weS0+YWNfdGJsX25vLCBuYml0cyA8PCA0KTsKLSAgICBpZiAobmJpdHMpCi0gICAgICBlbWl0X2JpdHMoZW50cm9weSwgZW50cm9weS0+RU9CUlVOLCBuYml0cyk7Ci0KLSAgICBlbnRyb3B5LT5FT0JSVU4gPSAwOwotCi0gICAgLyogRW1pdCBhbnkgYnVmZmVyZWQgY29ycmVjdGlvbiBiaXRzICovCi0gICAgZW1pdF9idWZmZXJlZF9iaXRzKGVudHJvcHksIGVudHJvcHktPmJpdF9idWZmZXIsIGVudHJvcHktPkJFKTsKLSAgICBlbnRyb3B5LT5CRSA9IDA7Ci0gIH0KLX0KLQotCi0vKgotICogRW1pdCBhIHJlc3RhcnQgbWFya2VyICYgcmVzeW5jaHJvbml6ZSBwcmVkaWN0aW9ucy4KLSAqLwotCi1MT0NBTCh2b2lkKQotZW1pdF9yZXN0YXJ0IChwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5LCBpbnQgcmVzdGFydF9udW0pCi17Ci0gIGludCBjaTsKLQotICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKLQotICBpZiAoISBlbnRyb3B5LT5nYXRoZXJfc3RhdGlzdGljcykgewotICAgIGZsdXNoX2JpdHMoZW50cm9weSk7Ci0gICAgZW1pdF9ieXRlKGVudHJvcHksIDB4RkYpOwotICAgIGVtaXRfYnl0ZShlbnRyb3B5LCBKUEVHX1JTVDAgKyByZXN0YXJ0X251bSk7Ci0gIH0KLQotICBpZiAoZW50cm9weS0+Y2luZm8tPlNzID09IDApIHsKLSAgICAvKiBSZS1pbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KLSAgICBmb3IgKGNpID0gMDsgY2kgPCBlbnRyb3B5LT5jaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykKLSAgICAgIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXSA9IDA7Ci0gIH0gZWxzZSB7Ci0gICAgLyogUmUtaW5pdGlhbGl6ZSBhbGwgQUMtcmVsYXRlZCBmaWVsZHMgdG8gMCAqLwotICAgIGVudHJvcHktPkVPQlJVTiA9IDA7Ci0gICAgZW50cm9weS0+QkUgPSAwOwotICB9Ci19Ci0KLQotLyoKLSAqIE1DVSBlbmNvZGluZyBmb3IgREMgaW5pdGlhbCBzY2FuIChlaXRoZXIgc3BlY3RyYWwgc2VsZWN0aW9uLAotICogb3IgZmlyc3QgcGFzcyBvZiBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24pLgotICovCi0KLU1FVEhPRERFRihib29sZWFuKQotZW5jb2RlX21jdV9EQ19maXJzdCAoal9jb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCi17Ci0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICByZWdpc3RlciBpbnQgdGVtcCwgdGVtcDI7Ci0gIHJlZ2lzdGVyIGludCBuYml0czsKLSAgaW50IGJsa24sIGNpOwotICBpbnQgQWwgPSBjaW5mby0+QWw7Ci0gIEpCTE9DS1JPVyBibG9jazsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0gIElTSElGVF9URU1QUwotCi0gIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKLSAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7Ci0KLSAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKQotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQotICAgICAgZW1pdF9yZXN0YXJ0KGVudHJvcHksIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pOwotCi0gIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2tzICovCi0gIGZvciAoYmxrbiA9IDA7IGJsa24gPCBjaW5mby0+YmxvY2tzX2luX01DVTsgYmxrbisrKSB7Ci0gICAgYmxvY2sgPSBNQ1VfZGF0YVtibGtuXTsKLSAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotCi0gICAgLyogQ29tcHV0ZSB0aGUgREMgdmFsdWUgYWZ0ZXIgdGhlIHJlcXVpcmVkIHBvaW50IHRyYW5zZm9ybSBieSBBbC4KLSAgICAgKiBUaGlzIGlzIHNpbXBseSBhbiBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0LgotICAgICAqLwotICAgIHRlbXAyID0gSVJJR0hUX1NISUZUKChpbnQpICgoKmJsb2NrKVswXSksIEFsKTsKLQotICAgIC8qIERDIGRpZmZlcmVuY2VzIGFyZSBmaWd1cmVkIG9uIHRoZSBwb2ludC10cmFuc2Zvcm1lZCB2YWx1ZXMuICovCi0gICAgdGVtcCA9IHRlbXAyIC0gZW50cm9weS0+bGFzdF9kY192YWxbY2ldOwotICAgIGVudHJvcHktPmxhc3RfZGNfdmFsW2NpXSA9IHRlbXAyOwotCi0gICAgLyogRW5jb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlIHBlciBzZWN0aW9uIEcuMS4yLjEgKi8KLSAgICB0ZW1wMiA9IHRlbXA7Ci0gICAgaWYgKHRlbXAgPCAwKSB7Ci0gICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLwotICAgICAgLyogRm9yIGEgbmVnYXRpdmUgaW5wdXQsIHdhbnQgdGVtcDIgPSBiaXR3aXNlIGNvbXBsZW1lbnQgb2YgYWJzKGlucHV0KSAqLwotICAgICAgLyogVGhpcyBjb2RlIGFzc3VtZXMgd2UgYXJlIG9uIGEgdHdvJ3MgY29tcGxlbWVudCBtYWNoaW5lICovCi0gICAgICB0ZW1wMi0tOwotICAgIH0KLSAgICAKLSAgICAvKiBGaW5kIHRoZSBudW1iZXIgb2YgYml0cyBuZWVkZWQgZm9yIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGNvZWZmaWNpZW50ICovCi0gICAgbmJpdHMgPSAwOwotICAgIHdoaWxlICh0ZW1wKSB7Ci0gICAgICBuYml0cysrOwotICAgICAgdGVtcCA+Pj0gMTsKLSAgICB9Ci0gICAgLyogQ2hlY2sgZm9yIG91dC1vZi1yYW5nZSBjb2VmZmljaWVudCB2YWx1ZXMuCi0gICAgICogU2luY2Ugd2UncmUgZW5jb2RpbmcgYSBkaWZmZXJlbmNlLCB0aGUgcmFuZ2UgbGltaXQgaXMgdHdpY2UgYXMgbXVjaC4KLSAgICAgKi8KLSAgICBpZiAobmJpdHMgPiBNQVhfQ09FRl9CSVRTKzEpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9EQ1RfQ09FRik7Ci0gICAgCi0gICAgLyogQ291bnQvZW1pdCB0aGUgSHVmZm1hbi1jb2RlZCBzeW1ib2wgZm9yIHRoZSBudW1iZXIgb2YgYml0cyAqLwotICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGNvbXBwdHItPmRjX3RibF9ubywgbmJpdHMpOwotICAgIAotICAgIC8qIEVtaXQgdGhhdCBudW1iZXIgb2YgYml0cyBvZiB0aGUgdmFsdWUsIGlmIHBvc2l0aXZlLCAqLwotICAgIC8qIG9yIHRoZSBjb21wbGVtZW50IG9mIGl0cyBtYWduaXR1ZGUsIGlmIG5lZ2F0aXZlLiAqLwotICAgIGlmIChuYml0cykJCQkvKiBlbWl0X2JpdHMgcmVqZWN0cyBjYWxscyB3aXRoIHNpemUgMCAqLwotICAgICAgZW1pdF9iaXRzKGVudHJvcHksICh1bnNpZ25lZCBpbnQpIHRlbXAyLCBuYml0cyk7Ci0gIH0KLQotICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7Ci0gIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOwotCi0gIC8qIFVwZGF0ZSByZXN0YXJ0LWludGVydmFsIHN0YXRlIHRvbyAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgewotICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLSAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0rKzsKLSAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gJj0gNzsKLSAgICB9Ci0gICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLSAgfQotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBNQ1UgZW5jb2RpbmcgZm9yIEFDIGluaXRpYWwgc2NhbiAoZWl0aGVyIHNwZWN0cmFsIHNlbGVjdGlvbiwKLSAqIG9yIGZpcnN0IHBhc3Mgb2Ygc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uKS4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWVuY29kZV9tY3VfQUNfZmlyc3QgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQotewotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgcmVnaXN0ZXIgaW50IHRlbXAsIHRlbXAyOwotICByZWdpc3RlciBpbnQgbmJpdHM7Ci0gIHJlZ2lzdGVyIGludCByLCBrOwotICBpbnQgU2UgPSBjaW5mby0+U2U7Ci0gIGludCBBbCA9IGNpbmZvLT5BbDsKLSAgSkJMT0NLUk9XIGJsb2NrOwotCi0gIGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGUgPSBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZTsKLSAgZW50cm9weS0+ZnJlZV9pbl9idWZmZXIgPSBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXI7Ci0KLSAgLyogRW1pdCByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKQotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQotICAgICAgZW1pdF9yZXN0YXJ0KGVudHJvcHksIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0pOwotCi0gIC8qIEVuY29kZSB0aGUgTUNVIGRhdGEgYmxvY2sgKi8KLSAgYmxvY2sgPSBNQ1VfZGF0YVswXTsKLQotICAvKiBFbmNvZGUgdGhlIEFDIGNvZWZmaWNpZW50cyBwZXIgc2VjdGlvbiBHLjEuMi4yLCBmaWcuIEcuMyAqLwotICAKLSAgciA9IDA7CQkJLyogciA9IHJ1biBsZW5ndGggb2YgemVyb3MgKi8KLSAgIAotICBmb3IgKGsgPSBjaW5mby0+U3M7IGsgPD0gU2U7IGsrKykgewotICAgIGlmICgodGVtcCA9ICgqYmxvY2spW2pwZWdfbmF0dXJhbF9vcmRlcltrXV0pID09IDApIHsKLSAgICAgIHIrKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICAvKiBXZSBtdXN0IGFwcGx5IHRoZSBwb2ludCB0cmFuc2Zvcm0gYnkgQWwuICBGb3IgQUMgY29lZmZpY2llbnRzIHRoaXMKLSAgICAgKiBpcyBhbiBpbnRlZ2VyIGRpdmlzaW9uIHdpdGggcm91bmRpbmcgdG93YXJkcyAwLiAgVG8gZG8gdGhpcyBwb3J0YWJseQotICAgICAqIGluIEMsIHdlIHNoaWZ0IGFmdGVyIG9idGFpbmluZyB0aGUgYWJzb2x1dGUgdmFsdWU7IHNvIHRoZSBjb2RlIGlzCi0gICAgICogaW50ZXJ3b3ZlbiB3aXRoIGZpbmRpbmcgdGhlIGFicyB2YWx1ZSAodGVtcCkgYW5kIG91dHB1dCBiaXRzICh0ZW1wMikuCi0gICAgICovCi0gICAgaWYgKHRlbXAgPCAwKSB7Ci0gICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLwotICAgICAgdGVtcCA+Pj0gQWw7CQkvKiBhcHBseSB0aGUgcG9pbnQgdHJhbnNmb3JtICovCi0gICAgICAvKiBGb3IgYSBuZWdhdGl2ZSBjb2VmLCB3YW50IHRlbXAyID0gYml0d2lzZSBjb21wbGVtZW50IG9mIGFicyhjb2VmKSAqLwotICAgICAgdGVtcDIgPSB+dGVtcDsKLSAgICB9IGVsc2UgewotICAgICAgdGVtcCA+Pj0gQWw7CQkvKiBhcHBseSB0aGUgcG9pbnQgdHJhbnNmb3JtICovCi0gICAgICB0ZW1wMiA9IHRlbXA7Ci0gICAgfQotICAgIC8qIFdhdGNoIG91dCBmb3IgY2FzZSB0aGF0IG5vbnplcm8gY29lZiBpcyB6ZXJvIGFmdGVyIHBvaW50IHRyYW5zZm9ybSAqLwotICAgIGlmICh0ZW1wID09IDApIHsKLSAgICAgIHIrKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8qIEVtaXQgYW55IHBlbmRpbmcgRU9CUlVOICovCi0gICAgaWYgKGVudHJvcHktPkVPQlJVTiA+IDApCi0gICAgICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKLSAgICAvKiBpZiBydW4gbGVuZ3RoID4gMTUsIG11c3QgZW1pdCBzcGVjaWFsIHJ1bi1sZW5ndGgtMTYgY29kZXMgKDB4RjApICovCi0gICAgd2hpbGUgKHIgPiAxNSkgewotICAgICAgZW1pdF9zeW1ib2woZW50cm9weSwgZW50cm9weS0+YWNfdGJsX25vLCAweEYwKTsKLSAgICAgIHIgLT0gMTY7Ci0gICAgfQotCi0gICAgLyogRmluZCB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIGZvciB0aGUgbWFnbml0dWRlIG9mIHRoZSBjb2VmZmljaWVudCAqLwotICAgIG5iaXRzID0gMTsJCQkvKiB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSAxIGJpdCAqLwotICAgIHdoaWxlICgodGVtcCA+Pj0gMSkpCi0gICAgICBuYml0cysrOwotICAgIC8qIENoZWNrIGZvciBvdXQtb2YtcmFuZ2UgY29lZmZpY2llbnQgdmFsdWVzICovCi0gICAgaWYgKG5iaXRzID4gTUFYX0NPRUZfQklUUykKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0RDVF9DT0VGKTsKLQotICAgIC8qIENvdW50L2VtaXQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLwotICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgKHIgPDwgNCkgKyBuYml0cyk7Ci0KLSAgICAvKiBFbWl0IHRoYXQgbnVtYmVyIG9mIGJpdHMgb2YgdGhlIHZhbHVlLCBpZiBwb3NpdGl2ZSwgKi8KLSAgICAvKiBvciB0aGUgY29tcGxlbWVudCBvZiBpdHMgbWFnbml0dWRlLCBpZiBuZWdhdGl2ZS4gKi8KLSAgICBlbWl0X2JpdHMoZW50cm9weSwgKHVuc2lnbmVkIGludCkgdGVtcDIsIG5iaXRzKTsKLQotICAgIHIgPSAwOwkJCS8qIHJlc2V0IHplcm8gcnVuIGxlbmd0aCAqLwotICB9Ci0KLSAgaWYgKHIgPiAwKSB7CQkJLyogSWYgdGhlcmUgYXJlIHRyYWlsaW5nIHplcm9lcywgKi8KLSAgICBlbnRyb3B5LT5FT0JSVU4rKzsJCS8qIGNvdW50IGFuIEVPQiAqLwotICAgIGlmIChlbnRyb3B5LT5FT0JSVU4gPT0gMHg3RkZGKQotICAgICAgZW1pdF9lb2JydW4oZW50cm9weSk7CS8qIGZvcmNlIGl0IG91dCB0byBhdm9pZCBvdmVyZmxvdyAqLwotICB9Ci0KLSAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlOwotICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKLQotICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKLSAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7Ci0gICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7Ci0gICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7Ci0gICAgfQotICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07Ci0gIH0KLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogTUNVIGVuY29kaW5nIGZvciBEQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgotICogTm90ZTogd2UgYXNzdW1lIHN1Y2ggc2NhbnMgY2FuIGJlIG11bHRpLWNvbXBvbmVudCwgYWx0aG91Z2ggdGhlIHNwZWMKLSAqIGlzIG5vdCB2ZXJ5IGNsZWFyIG9uIHRoZSBwb2ludC4KLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWVuY29kZV9tY3VfRENfcmVmaW5lIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKLXsKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIHJlZ2lzdGVyIGludCB0ZW1wOwotICBpbnQgYmxrbjsKLSAgaW50IEFsID0gY2luZm8tPkFsOwotICBKQkxPQ0tST1cgYmxvY2s7Ci0KLSAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOwotICBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKLQotICAvKiBFbWl0IHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZCAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpCi0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCi0gICAgICBlbWl0X3Jlc3RhcnQoZW50cm9weSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSk7Ci0KLSAgLyogRW5jb2RlIHRoZSBNQ1UgZGF0YSBibG9ja3MgKi8KLSAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKLSAgICBibG9jayA9IE1DVV9kYXRhW2Jsa25dOwotCi0gICAgLyogV2Ugc2ltcGx5IGVtaXQgdGhlIEFsJ3RoIGJpdCBvZiB0aGUgREMgY29lZmZpY2llbnQgdmFsdWUuICovCi0gICAgdGVtcCA9ICgqYmxvY2spWzBdOwotICAgIGVtaXRfYml0cyhlbnRyb3B5LCAodW5zaWduZWQgaW50KSAodGVtcCA+PiBBbCksIDEpOwotICB9Ci0KLSAgY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGUgPSBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlOwotICBjaW5mby0+ZGVzdC0+ZnJlZV9pbl9idWZmZXIgPSBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlcjsKLQotICAvKiBVcGRhdGUgcmVzdGFydC1pbnRlcnZhbCBzdGF0ZSB0b28gKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApIHsKLSAgICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7Ci0gICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtKys7Ci0gICAgICBlbnRyb3B5LT5uZXh0X3Jlc3RhcnRfbnVtICY9IDc7Ci0gICAgfQotICAgIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07Ci0gIH0KLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogTUNVIGVuY29kaW5nIGZvciBBQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgotICovCi0KLU1FVEhPRERFRihib29sZWFuKQotZW5jb2RlX21jdV9BQ19yZWZpbmUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQotewotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgcmVnaXN0ZXIgaW50IHRlbXA7Ci0gIHJlZ2lzdGVyIGludCByLCBrOwotICBpbnQgRU9COwotICBjaGFyICpCUl9idWZmZXI7Ci0gIHVuc2lnbmVkIGludCBCUjsKLSAgaW50IFNlID0gY2luZm8tPlNlOwotICBpbnQgQWwgPSBjaW5mby0+QWw7Ci0gIEpCTE9DS1JPVyBibG9jazsKLSAgaW50IGFic3ZhbHVlc1tEQ1RTSVpFMl07Ci0KLSAgZW50cm9weS0+bmV4dF9vdXRwdXRfYnl0ZSA9IGNpbmZvLT5kZXN0LT5uZXh0X291dHB1dF9ieXRlOwotICBlbnRyb3B5LT5mcmVlX2luX2J1ZmZlciA9IGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlcjsKLQotICAvKiBFbWl0IHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZCAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpCi0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCi0gICAgICBlbWl0X3Jlc3RhcnQoZW50cm9weSwgZW50cm9weS0+bmV4dF9yZXN0YXJ0X251bSk7Ci0KLSAgLyogRW5jb2RlIHRoZSBNQ1UgZGF0YSBibG9jayAqLwotICBibG9jayA9IE1DVV9kYXRhWzBdOwotCi0gIC8qIEl0IGlzIGNvbnZlbmllbnQgdG8gbWFrZSBhIHByZS1wYXNzIHRvIGRldGVybWluZSB0aGUgdHJhbnNmb3JtZWQKLSAgICogY29lZmZpY2llbnRzJyBhYnNvbHV0ZSB2YWx1ZXMgYW5kIHRoZSBFT0IgcG9zaXRpb24uCi0gICAqLwotICBFT0IgPSAwOwotICBmb3IgKGsgPSBjaW5mby0+U3M7IGsgPD0gU2U7IGsrKykgewotICAgIHRlbXAgPSAoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dOwotICAgIC8qIFdlIG11c3QgYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSBieSBBbC4gIEZvciBBQyBjb2VmZmljaWVudHMgdGhpcwotICAgICAqIGlzIGFuIGludGVnZXIgZGl2aXNpb24gd2l0aCByb3VuZGluZyB0b3dhcmRzIDAuICBUbyBkbyB0aGlzIHBvcnRhYmx5Ci0gICAgICogaW4gQywgd2Ugc2hpZnQgYWZ0ZXIgb2J0YWluaW5nIHRoZSBhYnNvbHV0ZSB2YWx1ZS4KLSAgICAgKi8KLSAgICBpZiAodGVtcCA8IDApCi0gICAgICB0ZW1wID0gLXRlbXA7CQkvKiB0ZW1wIGlzIGFicyB2YWx1ZSBvZiBpbnB1dCAqLwotICAgIHRlbXAgPj49IEFsOwkJLyogYXBwbHkgdGhlIHBvaW50IHRyYW5zZm9ybSAqLwotICAgIGFic3ZhbHVlc1trXSA9IHRlbXA7CS8qIHNhdmUgYWJzIHZhbHVlIGZvciBtYWluIHBhc3MgKi8KLSAgICBpZiAodGVtcCA9PSAxKQotICAgICAgRU9CID0gazsJCQkvKiBFT0IgPSBpbmRleCBvZiBsYXN0IG5ld2x5LW5vbnplcm8gY29lZiAqLwotICB9Ci0KLSAgLyogRW5jb2RlIHRoZSBBQyBjb2VmZmljaWVudHMgcGVyIHNlY3Rpb24gRy4xLjIuMywgZmlnLiBHLjcgKi8KLSAgCi0gIHIgPSAwOwkJCS8qIHIgPSBydW4gbGVuZ3RoIG9mIHplcm9zICovCi0gIEJSID0gMDsJCQkvKiBCUiA9IGNvdW50IG9mIGJ1ZmZlcmVkIGJpdHMgYWRkZWQgbm93ICovCi0gIEJSX2J1ZmZlciA9IGVudHJvcHktPmJpdF9idWZmZXIgKyBlbnRyb3B5LT5CRTsgLyogQXBwZW5kIGJpdHMgdG8gYnVmZmVyICovCi0KLSAgZm9yIChrID0gY2luZm8tPlNzOyBrIDw9IFNlOyBrKyspIHsKLSAgICBpZiAoKHRlbXAgPSBhYnN2YWx1ZXNba10pID09IDApIHsKLSAgICAgIHIrKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8qIEVtaXQgYW55IHJlcXVpcmVkIFpSTHMsIGJ1dCBub3QgaWYgdGhleSBjYW4gYmUgZm9sZGVkIGludG8gRU9CICovCi0gICAgd2hpbGUgKHIgPiAxNSAmJiBrIDw9IEVPQikgewotICAgICAgLyogZW1pdCBhbnkgcGVuZGluZyBFT0JSVU4gYW5kIHRoZSBCRSBjb3JyZWN0aW9uIGJpdHMgKi8KLSAgICAgIGVtaXRfZW9icnVuKGVudHJvcHkpOwotICAgICAgLyogRW1pdCBaUkwgKi8KLSAgICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgMHhGMCk7Ci0gICAgICByIC09IDE2OwotICAgICAgLyogRW1pdCBidWZmZXJlZCBjb3JyZWN0aW9uIGJpdHMgdGhhdCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBaUkwgKi8KLSAgICAgIGVtaXRfYnVmZmVyZWRfYml0cyhlbnRyb3B5LCBCUl9idWZmZXIsIEJSKTsKLSAgICAgIEJSX2J1ZmZlciA9IGVudHJvcHktPmJpdF9idWZmZXI7IC8qIEJFIGJpdHMgYXJlIGdvbmUgbm93ICovCi0gICAgICBCUiA9IDA7Ci0gICAgfQotCi0gICAgLyogSWYgdGhlIGNvZWYgd2FzIHByZXZpb3VzbHkgbm9uemVybywgaXQgb25seSBuZWVkcyBhIGNvcnJlY3Rpb24gYml0LgotICAgICAqIE5PVEU6IGEgc3RyYWlnaHQgdHJhbnNsYXRpb24gb2YgdGhlIHNwZWMncyBmaWd1cmUgRy43IHdvdWxkIHN1Z2dlc3QKLSAgICAgKiB0aGF0IHdlIGFsc28gbmVlZCB0byB0ZXN0IHIgPiAxNS4gIEJ1dCBpZiByID4gMTUsIHdlIGNhbiBvbmx5IGdldCBoZXJlCi0gICAgICogaWYgayA+IEVPQiwgd2hpY2ggaW1wbGllcyB0aGF0IHRoaXMgY29lZmZpY2llbnQgaXMgbm90IDEuCi0gICAgICovCi0gICAgaWYgKHRlbXAgPiAxKSB7Ci0gICAgICAvKiBUaGUgY29ycmVjdGlvbiBiaXQgaXMgdGhlIG5leHQgYml0IG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZS4gKi8KLSAgICAgIEJSX2J1ZmZlcltCUisrXSA9IChjaGFyKSAodGVtcCAmIDEpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgLyogRW1pdCBhbnkgcGVuZGluZyBFT0JSVU4gYW5kIHRoZSBCRSBjb3JyZWN0aW9uIGJpdHMgKi8KLSAgICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKLQotICAgIC8qIENvdW50L2VtaXQgSHVmZm1hbiBzeW1ib2wgZm9yIHJ1biBsZW5ndGggLyBudW1iZXIgb2YgYml0cyAqLwotICAgIGVtaXRfc3ltYm9sKGVudHJvcHksIGVudHJvcHktPmFjX3RibF9ubywgKHIgPDwgNCkgKyAxKTsKLQotICAgIC8qIEVtaXQgb3V0cHV0IGJpdCBmb3IgbmV3bHktbm9uemVybyBjb2VmICovCi0gICAgdGVtcCA9ICgoKmJsb2NrKVtqcGVnX25hdHVyYWxfb3JkZXJba11dIDwgMCkgPyAwIDogMTsKLSAgICBlbWl0X2JpdHMoZW50cm9weSwgKHVuc2lnbmVkIGludCkgdGVtcCwgMSk7Ci0KLSAgICAvKiBFbWl0IGJ1ZmZlcmVkIGNvcnJlY3Rpb24gYml0cyB0aGF0IG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29kZSAqLwotICAgIGVtaXRfYnVmZmVyZWRfYml0cyhlbnRyb3B5LCBCUl9idWZmZXIsIEJSKTsKLSAgICBCUl9idWZmZXIgPSBlbnRyb3B5LT5iaXRfYnVmZmVyOyAvKiBCRSBiaXRzIGFyZSBnb25lIG5vdyAqLwotICAgIEJSID0gMDsKLSAgICByID0gMDsJCQkvKiByZXNldCB6ZXJvIHJ1biBsZW5ndGggKi8KLSAgfQotCi0gIGlmIChyID4gMCB8fCBCUiA+IDApIHsJLyogSWYgdGhlcmUgYXJlIHRyYWlsaW5nIHplcm9lcywgKi8KLSAgICBlbnRyb3B5LT5FT0JSVU4rKzsJCS8qIGNvdW50IGFuIEVPQiAqLwotICAgIGVudHJvcHktPkJFICs9IEJSOwkJLyogY29uY2F0IG15IGNvcnJlY3Rpb24gYml0cyB0byBvbGRlciBvbmVzICovCi0gICAgLyogV2UgZm9yY2Ugb3V0IHRoZSBFT0IgaWYgd2UgcmlzayBlaXRoZXI6Ci0gICAgICogMS4gb3ZlcmZsb3cgb2YgdGhlIEVPQiBjb3VudGVyOwotICAgICAqIDIuIG92ZXJmbG93IG9mIHRoZSBjb3JyZWN0aW9uIGJpdCBidWZmZXIgZHVyaW5nIHRoZSBuZXh0IE1DVS4KLSAgICAgKi8KLSAgICBpZiAoZW50cm9weS0+RU9CUlVOID09IDB4N0ZGRiB8fCBlbnRyb3B5LT5CRSA+IChNQVhfQ09SUl9CSVRTLURDVFNJWkUyKzEpKQotICAgICAgZW1pdF9lb2JydW4oZW50cm9weSk7Ci0gIH0KLQotICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7Ci0gIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOwotCi0gIC8qIFVwZGF0ZSByZXN0YXJ0LWludGVydmFsIHN0YXRlIHRvbyAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkgewotICAgICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLSAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0rKzsKLSAgICAgIGVudHJvcHktPm5leHRfcmVzdGFydF9udW0gJj0gNzsKLSAgICB9Ci0gICAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLSAgfQotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYXQgdGhlIGVuZCBvZiBhIEh1ZmZtYW4tY29tcHJlc3NlZCBwcm9ncmVzc2l2ZSBzY2FuLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX3Bhc3NfcGh1ZmYgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQoteyAgIAotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLQotICBlbnRyb3B5LT5uZXh0X291dHB1dF9ieXRlID0gY2luZm8tPmRlc3QtPm5leHRfb3V0cHV0X2J5dGU7Ci0gIGVudHJvcHktPmZyZWVfaW5fYnVmZmVyID0gY2luZm8tPmRlc3QtPmZyZWVfaW5fYnVmZmVyOwotCi0gIC8qIEZsdXNoIG91dCBhbnkgYnVmZmVyZWQgZGF0YSAqLwotICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKLSAgZmx1c2hfYml0cyhlbnRyb3B5KTsKLQotICBjaW5mby0+ZGVzdC0+bmV4dF9vdXRwdXRfYnl0ZSA9IGVudHJvcHktPm5leHRfb3V0cHV0X2J5dGU7Ci0gIGNpbmZvLT5kZXN0LT5mcmVlX2luX2J1ZmZlciA9IGVudHJvcHktPmZyZWVfaW5fYnVmZmVyOwotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYSBzdGF0aXN0aWNzLWdhdGhlcmluZyBwYXNzIGFuZCBjcmVhdGUgdGhlIG5ldyBIdWZmbWFuIHRhYmxlcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZpbmlzaF9wYXNzX2dhdGhlcl9waHVmZiAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBib29sZWFuIGlzX0RDX2JhbmQ7Ci0gIGludCBjaSwgdGJsOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLSAgSkhVRkZfVEJMICoqaHRibHB0cjsKLSAgYm9vbGVhbiBkaWRbTlVNX0hVRkZfVEJMU107Ci0KLSAgLyogRmx1c2ggb3V0IGJ1ZmZlcmVkIGRhdGEgKGFsbCB3ZSBjYXJlIGFib3V0IGlzIGNvdW50aW5nIHRoZSBFT0Igc3ltYm9sKSAqLwotICBlbWl0X2VvYnJ1bihlbnRyb3B5KTsKLQotICBpc19EQ19iYW5kID0gKGNpbmZvLT5TcyA9PSAwKTsKLQotICAvKiBJdCdzIGltcG9ydGFudCBub3QgdG8gYXBwbHkganBlZ19nZW5fb3B0aW1hbF90YWJsZSBtb3JlIHRoYW4gb25jZQotICAgKiBwZXIgdGFibGUsIGJlY2F1c2UgaXQgY2xvYmJlcnMgdGhlIGlucHV0IGZyZXF1ZW5jeSBjb3VudHMhCi0gICAqLwotICBNRU1aRVJPKGRpZCwgU0laRU9GKGRpZCkpOwotCi0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICBpZiAoaXNfRENfYmFuZCkgewotICAgICAgaWYgKGNpbmZvLT5BaCAhPSAwKQkvKiBEQyByZWZpbmVtZW50IG5lZWRzIG5vIHRhYmxlICovCi0JY29udGludWU7Ci0gICAgICB0YmwgPSBjb21wcHRyLT5kY190Ymxfbm87Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRibCA9IGNvbXBwdHItPmFjX3RibF9ubzsKLSAgICB9Ci0gICAgaWYgKCEgZGlkW3RibF0pIHsKLSAgICAgIGlmIChpc19EQ19iYW5kKQotICAgICAgICBodGJscHRyID0gJiBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1t0YmxdOwotICAgICAgZWxzZQotICAgICAgICBodGJscHRyID0gJiBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1t0YmxdOwotICAgICAgaWYgKCpodGJscHRyID09IE5VTEwpCi0gICAgICAgICpodGJscHRyID0ganBlZ19hbGxvY19odWZmX3RhYmxlKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICAgIGpwZWdfZ2VuX29wdGltYWxfdGFibGUoY2luZm8sICpodGJscHRyLCBlbnRyb3B5LT5jb3VudF9wdHJzW3RibF0pOwotICAgICAgZGlkW3RibF0gPSBUUlVFOwotICAgIH0KLSAgfQotfQotCi0KLS8qCi0gKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgcHJvZ3Jlc3NpdmUgSHVmZm1hbiBlbnRyb3B5IGVuY29kaW5nLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfcGh1ZmZfZW5jb2RlciAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHk7Ci0gIGludCBpOwotCi0gIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YocGh1ZmZfZW50cm9weV9lbmNvZGVyKSk7Ci0gIGNpbmZvLT5lbnRyb3B5ID0gKHN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciAqKSBlbnRyb3B5OwotICBlbnRyb3B5LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfcGh1ZmY7Ci0KLSAgLyogTWFyayB0YWJsZXMgdW5hbGxvY2F0ZWQgKi8KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgewotICAgIGVudHJvcHktPmRlcml2ZWRfdGJsc1tpXSA9IE5VTEw7Ci0gICAgZW50cm9weS0+Y291bnRfcHRyc1tpXSA9IE5VTEw7Ci0gIH0KLSAgZW50cm9weS0+Yml0X2J1ZmZlciA9IE5VTEw7CS8qIG5lZWRlZCBvbmx5IGluIEFDIHJlZmluZW1lbnQgc2NhbiAqLwotfQotCi0jZW5kaWYgLyogQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY3ByZXBjdC5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjcHJlcGN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOTMzMzMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjcHJlcGN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNTQgKzAsMCBAQAotLyoKLSAqIGpjcHJlcGN0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgY29tcHJlc3Npb24gcHJlcHJvY2Vzc2luZyBjb250cm9sbGVyLgotICogVGhpcyBjb250cm9sbGVyIG1hbmFnZXMgdGhlIGNvbG9yIGNvbnZlcnNpb24sIGRvd25zYW1wbGluZywKLSAqIGFuZCBlZGdlIGV4cGFuc2lvbiBzdGVwcy4KLSAqCi0gKiBNb3N0IG9mIHRoZSBjb21wbGV4aXR5IGhlcmUgaXMgYXNzb2NpYXRlZCB3aXRoIGJ1ZmZlcmluZyBpbnB1dCByb3dzCi0gKiBhcyByZXF1aXJlZCBieSB0aGUgZG93bnNhbXBsZXIuICBTZWUgdGhlIGNvbW1lbnRzIGF0IHRoZSBoZWFkIG9mCi0gKiBqY3NhbXBsZS5jIGZvciB0aGUgZG93bnNhbXBsZXIncyBuZWVkcy4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyogQXQgcHJlc2VudCwgamNzYW1wbGUuYyBjYW4gcmVxdWVzdCBjb250ZXh0IHJvd3Mgb25seSBmb3Igc21vb3RoaW5nLgotICogSW4gdGhlIGZ1dHVyZSwgd2UgbWlnaHQgYWxzbyBuZWVkIGNvbnRleHQgcm93cyBmb3IgQ0NJUjYwMSBzYW1wbGluZwotICogb3Igb3RoZXIgbW9yZS1jb21wbGV4IGRvd25zYW1wbGluZyBwcm9jZWR1cmVzLiAgVGhlIGNvZGUgdG8gc3VwcG9ydAotICogY29udGV4dCByb3dzIHNob3VsZCBiZSBjb21waWxlZCBvbmx5IGlmIG5lZWRlZC4KLSAqLwotI2lmZGVmIElOUFVUX1NNT09USElOR19TVVBQT1JURUQKLSNkZWZpbmUgQ09OVEVYVF9ST1dTX1NVUFBPUlRFRAotI2VuZGlmCi0KLQotLyoKLSAqIEZvciB0aGUgc2ltcGxlIChuby1jb250ZXh0LXJvdykgY2FzZSwgd2UganVzdCBuZWVkIHRvIGJ1ZmZlciBvbmUKLSAqIHJvdyBncm91cCdzIHdvcnRoIG9mIHBpeGVscyBmb3IgdGhlIGRvd25zYW1wbGluZyBzdGVwLiAgQXQgdGhlIGJvdHRvbSBvZgotICogdGhlIGltYWdlLCB3ZSBwYWQgdG8gYSBmdWxsIHJvdyBncm91cCBieSByZXBsaWNhdGluZyB0aGUgbGFzdCBwaXhlbCByb3cuCi0gKiBUaGUgZG93bnNhbXBsZXIncyBsYXN0IG91dHB1dCByb3cgaXMgdGhlbiByZXBsaWNhdGVkIGlmIG5lZWRlZCB0byBwYWQKLSAqIG91dCB0byBhIGZ1bGwgaU1DVSByb3cuCi0gKgotICogV2hlbiBwcm92aWRpbmcgY29udGV4dCByb3dzLCB3ZSBtdXN0IGJ1ZmZlciB0aHJlZSByb3cgZ3JvdXBzJyB3b3J0aCBvZgotICogcGl4ZWxzLiAgVGhyZWUgcm93IGdyb3VwcyBhcmUgcGh5c2ljYWxseSBhbGxvY2F0ZWQsIGJ1dCB0aGUgcm93IHBvaW50ZXIKLSAqIGFycmF5cyBhcmUgbWFkZSBmaXZlIHJvdyBncm91cHMgaGlnaCwgd2l0aCB0aGUgZXh0cmEgcG9pbnRlcnMgYWJvdmUgYW5kCi0gKiBiZWxvdyAid3JhcHBpbmcgYXJvdW5kIiB0byBwb2ludCB0byB0aGUgbGFzdCBhbmQgZmlyc3QgcmVhbCByb3cgZ3JvdXBzLgotICogVGhpcyBhbGxvd3MgdGhlIGRvd25zYW1wbGVyIHRvIGFjY2VzcyB0aGUgcHJvcGVyIGNvbnRleHQgcm93cy4KLSAqIEF0IHRoZSB0b3AgYW5kIGJvdHRvbSBvZiB0aGUgaW1hZ2UsIHdlIGNyZWF0ZSBkdW1teSBjb250ZXh0IHJvd3MgYnkKLSAqIGNvcHlpbmcgdGhlIGZpcnN0IG9yIGxhc3QgcmVhbCBwaXhlbCByb3cuICBUaGlzIGNvcHlpbmcgY291bGQgYmUgYXZvaWRlZAotICogYnkgcG9pbnRlciBoYWNraW5nIGFzIGlzIGRvbmUgaW4gamRtYWluY3QuYywgYnV0IGl0IGRvZXNuJ3Qgc2VlbSB3b3J0aCB0aGUKLSAqIHRyb3VibGUgb24gdGhlIGNvbXByZXNzaW9uIHNpZGUuCi0gKi8KLQotCi0vKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2NfcHJlcF9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIERvd25zYW1wbGluZyBpbnB1dCBidWZmZXIuICBUaGlzIGJ1ZmZlciBob2xkcyBjb2xvci1jb252ZXJ0ZWQgZGF0YQotICAgKiB1bnRpbCB3ZSBoYXZlIGVub3VnaCB0byBkbyBhIGRvd25zYW1wbGUgc3RlcC4KLSAgICovCi0gIEpTQU1QQVJSQVkgY29sb3JfYnVmW01BWF9DT01QT05FTlRTXTsKLQotICBKRElNRU5TSU9OIHJvd3NfdG9fZ287CS8qIGNvdW50cyByb3dzIHJlbWFpbmluZyBpbiBzb3VyY2UgaW1hZ2UgKi8KLSAgaW50IG5leHRfYnVmX3JvdzsJCS8qIGluZGV4IG9mIG5leHQgcm93IHRvIHN0b3JlIGluIGNvbG9yX2J1ZiAqLwotCi0jaWZkZWYgQ09OVEVYVF9ST1dTX1NVUFBPUlRFRAkvKiBvbmx5IG5lZWRlZCBmb3IgY29udGV4dCBjYXNlICovCi0gIGludCB0aGlzX3Jvd19ncm91cDsJCS8qIHN0YXJ0aW5nIHJvdyBpbmRleCBvZiBncm91cCB0byBwcm9jZXNzICovCi0gIGludCBuZXh0X2J1Zl9zdG9wOwkJLyogZG93bnNhbXBsZSB3aGVuIHdlIHJlYWNoIHRoaXMgaW5kZXggKi8KLSNlbmRpZgotfSBteV9wcmVwX2NvbnRyb2xsZXI7Ci0KLXR5cGVkZWYgbXlfcHJlcF9jb250cm9sbGVyICogbXlfcHJlcF9wdHI7Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGEgcHJvY2Vzc2luZyBwYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzc19wcmVwIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpCi17Ci0gIG15X3ByZXBfcHRyIHByZXAgPSAobXlfcHJlcF9wdHIpIGNpbmZvLT5wcmVwOwotCi0gIGlmIChwYXNzX21vZGUgIT0gSkJVRl9QQVNTX1RIUlUpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotCi0gIC8qIEluaXRpYWxpemUgdG90YWwtaGVpZ2h0IGNvdW50ZXIgZm9yIGRldGVjdGluZyBib3R0b20gb2YgaW1hZ2UgKi8KLSAgcHJlcC0+cm93c190b19nbyA9IGNpbmZvLT5pbWFnZV9oZWlnaHQ7Ci0gIC8qIE1hcmsgdGhlIGNvbnZlcnNpb24gYnVmZmVyIGVtcHR5ICovCi0gIHByZXAtPm5leHRfYnVmX3JvdyA9IDA7Ci0jaWZkZWYgQ09OVEVYVF9ST1dTX1NVUFBPUlRFRAotICAvKiBQcmVzZXQgYWRkaXRpb25hbCBzdGF0ZSB2YXJpYWJsZXMgZm9yIGNvbnRleHQgbW9kZS4KLSAgICogVGhlc2UgYXJlbid0IHVzZWQgaW4gbm9uLWNvbnRleHQgbW9kZSwgc28gd2UgbmVlZG4ndCB0ZXN0IHdoaWNoIG1vZGUuCi0gICAqLwotICBwcmVwLT50aGlzX3Jvd19ncm91cCA9IDA7Ci0gIC8qIFNldCBuZXh0X2J1Zl9zdG9wIHRvIHN0b3AgYWZ0ZXIgdHdvIHJvdyBncm91cHMgaGF2ZSBiZWVuIHJlYWQgaW4uICovCi0gIHByZXAtPm5leHRfYnVmX3N0b3AgPSAyICogY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOwotI2VuZGlmCi19Ci0KLQotLyoKLSAqIEV4cGFuZCBhbiBpbWFnZSB2ZXJ0aWNhbGx5IGZyb20gaGVpZ2h0IGlucHV0X3Jvd3MgdG8gaGVpZ2h0IG91dHB1dF9yb3dzLAotICogYnkgZHVwbGljYXRpbmcgdGhlIGJvdHRvbSByb3cuCi0gKi8KLQotTE9DQUwodm9pZCkKLWV4cGFuZF9ib3R0b21fZWRnZSAoSlNBTVBBUlJBWSBpbWFnZV9kYXRhLCBKRElNRU5TSU9OIG51bV9jb2xzLAotCQkgICAgaW50IGlucHV0X3Jvd3MsIGludCBvdXRwdXRfcm93cykKLXsKLSAgcmVnaXN0ZXIgaW50IHJvdzsKLQotICBmb3IgKHJvdyA9IGlucHV0X3Jvd3M7IHJvdyA8IG91dHB1dF9yb3dzOyByb3crKykgewotICAgIGpjb3B5X3NhbXBsZV9yb3dzKGltYWdlX2RhdGEsIGlucHV0X3Jvd3MtMSwgaW1hZ2VfZGF0YSwgcm93LAotCQkgICAgICAxLCBudW1fY29scyk7Ci0gIH0KLX0KLQotCi0vKgotICogUHJvY2VzcyBzb21lIGRhdGEgaW4gdGhlIHNpbXBsZSBuby1jb250ZXh0IGNhc2UuCi0gKgotICogUHJlcHJvY2Vzc29yIG91dHB1dCBkYXRhIGlzIGNvdW50ZWQgaW4gInJvdyBncm91cHMiLiAgQSByb3cgZ3JvdXAKLSAqIGlzIGRlZmluZWQgdG8gYmUgdl9zYW1wX2ZhY3RvciBzYW1wbGUgcm93cyBvZiBlYWNoIGNvbXBvbmVudC4KLSAqIERvd25zYW1wbGluZyB3aWxsIHByb2R1Y2UgdGhpcyBtdWNoIGRhdGEgZnJvbSBlYWNoIG1heF92X3NhbXBfZmFjdG9yCi0gKiBpbnB1dCByb3dzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcHJlX3Byb2Nlc3NfZGF0YSAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCSAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19jdHIsCi0JCSAgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsLAotCQkgIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19ncm91cF9jdHIsCi0JCSAgSkRJTUVOU0lPTiBvdXRfcm93X2dyb3Vwc19hdmFpbCkKLXsKLSAgbXlfcHJlcF9wdHIgcHJlcCA9IChteV9wcmVwX3B0cikgY2luZm8tPnByZXA7Ci0gIGludCBudW1yb3dzLCBjaTsKLSAgSkRJTUVOU0lPTiBpbnJvd3M7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotCi0gIHdoaWxlICgqaW5fcm93X2N0ciA8IGluX3Jvd3NfYXZhaWwgJiYKLQkgKm91dF9yb3dfZ3JvdXBfY3RyIDwgb3V0X3Jvd19ncm91cHNfYXZhaWwpIHsKLSAgICAvKiBEbyBjb2xvciBjb252ZXJzaW9uIHRvIGZpbGwgdGhlIGNvbnZlcnNpb24gYnVmZmVyLiAqLwotICAgIGlucm93cyA9IGluX3Jvd3NfYXZhaWwgLSAqaW5fcm93X2N0cjsKLSAgICBudW1yb3dzID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yIC0gcHJlcC0+bmV4dF9idWZfcm93OwotICAgIG51bXJvd3MgPSAoaW50KSBNSU4oKEpESU1FTlNJT04pIG51bXJvd3MsIGlucm93cyk7Ci0gICAgKCpjaW5mby0+Y2NvbnZlcnQtPmNvbG9yX2NvbnZlcnQpIChjaW5mbywgaW5wdXRfYnVmICsgKmluX3Jvd19jdHIsCi0JCQkJICAgICAgIHByZXAtPmNvbG9yX2J1ZiwKLQkJCQkgICAgICAgKEpESU1FTlNJT04pIHByZXAtPm5leHRfYnVmX3JvdywKLQkJCQkgICAgICAgbnVtcm93cyk7Ci0gICAgKmluX3Jvd19jdHIgKz0gbnVtcm93czsKLSAgICBwcmVwLT5uZXh0X2J1Zl9yb3cgKz0gbnVtcm93czsKLSAgICBwcmVwLT5yb3dzX3RvX2dvIC09IG51bXJvd3M7Ci0gICAgLyogSWYgYXQgYm90dG9tIG9mIGltYWdlLCBwYWQgdG8gZmlsbCB0aGUgY29udmVyc2lvbiBidWZmZXIuICovCi0gICAgaWYgKHByZXAtPnJvd3NfdG9fZ28gPT0gMCAmJgotCXByZXAtPm5leHRfYnVmX3JvdyA8IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgewotICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSB7Ci0JZXhwYW5kX2JvdHRvbV9lZGdlKHByZXAtPmNvbG9yX2J1ZltjaV0sIGNpbmZvLT5pbWFnZV93aWR0aCwKLQkJCSAgIHByZXAtPm5leHRfYnVmX3JvdywgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKTsKLSAgICAgIH0KLSAgICAgIHByZXAtPm5leHRfYnVmX3JvdyA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKLSAgICB9Ci0gICAgLyogSWYgd2UndmUgZmlsbGVkIHRoZSBjb252ZXJzaW9uIGJ1ZmZlciwgZW1wdHkgaXQuICovCi0gICAgaWYgKHByZXAtPm5leHRfYnVmX3JvdyA9PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKLSAgICAgICgqY2luZm8tPmRvd25zYW1wbGUtPmRvd25zYW1wbGUpIChjaW5mbywKLQkJCQkJcHJlcC0+Y29sb3JfYnVmLCAoSkRJTUVOU0lPTikgMCwKLQkJCQkJb3V0cHV0X2J1ZiwgKm91dF9yb3dfZ3JvdXBfY3RyKTsKLSAgICAgIHByZXAtPm5leHRfYnVmX3JvdyA9IDA7Ci0gICAgICAoKm91dF9yb3dfZ3JvdXBfY3RyKSsrOwotICAgIH0KLSAgICAvKiBJZiBhdCBib3R0b20gb2YgaW1hZ2UsIHBhZCB0aGUgb3V0cHV0IHRvIGEgZnVsbCBpTUNVIGhlaWdodC4KLSAgICAgKiBOb3RlIHdlIGFzc3VtZSB0aGUgY2FsbGVyIGlzIHByb3ZpZGluZyBhIG9uZS1pTUNVLWhlaWdodCBvdXRwdXQgYnVmZmVyIQotICAgICAqLwotICAgIGlmIChwcmVwLT5yb3dzX3RvX2dvID09IDAgJiYKLQkqb3V0X3Jvd19ncm91cF9jdHIgPCBvdXRfcm93X2dyb3Vwc19hdmFpbCkgewotICAgICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLQkgICBjaSsrLCBjb21wcHRyKyspIHsKLQlleHBhbmRfYm90dG9tX2VkZ2Uob3V0cHV0X2J1ZltjaV0sCi0JCQkgICBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFLAotCQkJICAgKGludCkgKCpvdXRfcm93X2dyb3VwX2N0ciAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpLAotCQkJICAgKGludCkgKG91dF9yb3dfZ3JvdXBzX2F2YWlsICogY29tcHB0ci0+dl9zYW1wX2ZhY3RvcikpOwotICAgICAgfQotICAgICAgKm91dF9yb3dfZ3JvdXBfY3RyID0gb3V0X3Jvd19ncm91cHNfYXZhaWw7Ci0gICAgICBicmVhazsJCQkvKiBjYW4gZXhpdCBvdXRlciBsb29wIHdpdGhvdXQgdGVzdCAqLwotICAgIH0KLSAgfQotfQotCi0KLSNpZmRlZiBDT05URVhUX1JPV1NfU1VQUE9SVEVECi0KLS8qCi0gKiBQcm9jZXNzIHNvbWUgZGF0YSBpbiB0aGUgY29udGV4dCBjYXNlLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcHJlX3Byb2Nlc3NfY29udGV4dCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCSAgICAgSlNBTVBBUlJBWSBpbnB1dF9idWYsIEpESU1FTlNJT04gKmluX3Jvd19jdHIsCi0JCSAgICAgSkRJTUVOU0lPTiBpbl9yb3dzX2F2YWlsLAotCQkgICAgIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19ncm91cF9jdHIsCi0JCSAgICAgSkRJTUVOU0lPTiBvdXRfcm93X2dyb3Vwc19hdmFpbCkKLXsKLSAgbXlfcHJlcF9wdHIgcHJlcCA9IChteV9wcmVwX3B0cikgY2luZm8tPnByZXA7Ci0gIGludCBudW1yb3dzLCBjaTsKLSAgaW50IGJ1Zl9oZWlnaHQgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiAzOwotICBKRElNRU5TSU9OIGlucm93czsKLQotICB3aGlsZSAoKm91dF9yb3dfZ3JvdXBfY3RyIDwgb3V0X3Jvd19ncm91cHNfYXZhaWwpIHsKLSAgICBpZiAoKmluX3Jvd19jdHIgPCBpbl9yb3dzX2F2YWlsKSB7Ci0gICAgICAvKiBEbyBjb2xvciBjb252ZXJzaW9uIHRvIGZpbGwgdGhlIGNvbnZlcnNpb24gYnVmZmVyLiAqLwotICAgICAgaW5yb3dzID0gaW5fcm93c19hdmFpbCAtICppbl9yb3dfY3RyOwotICAgICAgbnVtcm93cyA9IHByZXAtPm5leHRfYnVmX3N0b3AgLSBwcmVwLT5uZXh0X2J1Zl9yb3c7Ci0gICAgICBudW1yb3dzID0gKGludCkgTUlOKChKRElNRU5TSU9OKSBudW1yb3dzLCBpbnJvd3MpOwotICAgICAgKCpjaW5mby0+Y2NvbnZlcnQtPmNvbG9yX2NvbnZlcnQpIChjaW5mbywgaW5wdXRfYnVmICsgKmluX3Jvd19jdHIsCi0JCQkJCSBwcmVwLT5jb2xvcl9idWYsCi0JCQkJCSAoSkRJTUVOU0lPTikgcHJlcC0+bmV4dF9idWZfcm93LAotCQkJCQkgbnVtcm93cyk7Ci0gICAgICAvKiBQYWQgYXQgdG9wIG9mIGltYWdlLCBpZiBmaXJzdCB0aW1lIHRocm91Z2ggKi8KLSAgICAgIGlmIChwcmVwLT5yb3dzX3RvX2dvID09IGNpbmZvLT5pbWFnZV9oZWlnaHQpIHsKLQlmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLQkgIGludCByb3c7Ci0JICBmb3IgKHJvdyA9IDE7IHJvdyA8PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7IHJvdysrKSB7Ci0JICAgIGpjb3B5X3NhbXBsZV9yb3dzKHByZXAtPmNvbG9yX2J1ZltjaV0sIDAsCi0JCQkgICAgICBwcmVwLT5jb2xvcl9idWZbY2ldLCAtcm93LAotCQkJICAgICAgMSwgY2luZm8tPmltYWdlX3dpZHRoKTsKLQkgIH0KLQl9Ci0gICAgICB9Ci0gICAgICAqaW5fcm93X2N0ciArPSBudW1yb3dzOwotICAgICAgcHJlcC0+bmV4dF9idWZfcm93ICs9IG51bXJvd3M7Ci0gICAgICBwcmVwLT5yb3dzX3RvX2dvIC09IG51bXJvd3M7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIFJldHVybiBmb3IgbW9yZSBkYXRhLCB1bmxlc3Mgd2UgYXJlIGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLiAqLwotICAgICAgaWYgKHByZXAtPnJvd3NfdG9fZ28gIT0gMCkKLQlicmVhazsKLSAgICAgIC8qIFdoZW4gYXQgYm90dG9tIG9mIGltYWdlLCBwYWQgdG8gZmlsbCB0aGUgY29udmVyc2lvbiBidWZmZXIuICovCi0gICAgICBpZiAocHJlcC0+bmV4dF9idWZfcm93IDwgcHJlcC0+bmV4dF9idWZfc3RvcCkgewotCWZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsgY2krKykgewotCSAgZXhwYW5kX2JvdHRvbV9lZGdlKHByZXAtPmNvbG9yX2J1ZltjaV0sIGNpbmZvLT5pbWFnZV93aWR0aCwKLQkJCSAgICAgcHJlcC0+bmV4dF9idWZfcm93LCBwcmVwLT5uZXh0X2J1Zl9zdG9wKTsKLQl9Ci0JcHJlcC0+bmV4dF9idWZfcm93ID0gcHJlcC0+bmV4dF9idWZfc3RvcDsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogSWYgd2UndmUgZ290dGVuIGVub3VnaCBkYXRhLCBkb3duc2FtcGxlIGEgcm93IGdyb3VwLiAqLwotICAgIGlmIChwcmVwLT5uZXh0X2J1Zl9yb3cgPT0gcHJlcC0+bmV4dF9idWZfc3RvcCkgewotICAgICAgKCpjaW5mby0+ZG93bnNhbXBsZS0+ZG93bnNhbXBsZSkgKGNpbmZvLAotCQkJCQlwcmVwLT5jb2xvcl9idWYsCi0JCQkJCShKRElNRU5TSU9OKSBwcmVwLT50aGlzX3Jvd19ncm91cCwKLQkJCQkJb3V0cHV0X2J1ZiwgKm91dF9yb3dfZ3JvdXBfY3RyKTsKLSAgICAgICgqb3V0X3Jvd19ncm91cF9jdHIpKys7Ci0gICAgICAvKiBBZHZhbmNlIHBvaW50ZXJzIHdpdGggd3JhcGFyb3VuZCBhcyBuZWNlc3NhcnkuICovCi0gICAgICBwcmVwLT50aGlzX3Jvd19ncm91cCArPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7Ci0gICAgICBpZiAocHJlcC0+dGhpc19yb3dfZ3JvdXAgPj0gYnVmX2hlaWdodCkKLQlwcmVwLT50aGlzX3Jvd19ncm91cCA9IDA7Ci0gICAgICBpZiAocHJlcC0+bmV4dF9idWZfcm93ID49IGJ1Zl9oZWlnaHQpCi0JcHJlcC0+bmV4dF9idWZfcm93ID0gMDsKLSAgICAgIHByZXAtPm5leHRfYnVmX3N0b3AgPSBwcmVwLT5uZXh0X2J1Zl9yb3cgKyBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIENyZWF0ZSB0aGUgd3JhcHBlZC1hcm91bmQgZG93bnNhbXBsaW5nIGlucHV0IGJ1ZmZlciBuZWVkZWQgZm9yIGNvbnRleHQgbW9kZS4KLSAqLwotCi1MT0NBTCh2b2lkKQotY3JlYXRlX2NvbnRleHRfYnVmZmVyIChqX2NvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfcHJlcF9wdHIgcHJlcCA9IChteV9wcmVwX3B0cikgY2luZm8tPnByZXA7Ci0gIGludCByZ3JvdXBfaGVpZ2h0ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOwotICBpbnQgY2ksIGk7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotICBKU0FNUEFSUkFZIHRydWVfYnVmZmVyLCBmYWtlX2J1ZmZlcjsKLQotICAvKiBHcmFiIGVub3VnaCBzcGFjZSBmb3IgZmFrZSByb3cgcG9pbnRlcnMgZm9yIGFsbCB0aGUgY29tcG9uZW50czsKLSAgICogd2UgbmVlZCBmaXZlIHJvdyBncm91cHMnIHdvcnRoIG9mIHBvaW50ZXJzIGZvciBlYWNoIGNvbXBvbmVudC4KLSAgICovCi0gIGZha2VfYnVmZmVyID0gKEpTQU1QQVJSQVkpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkoY2luZm8tPm51bV9jb21wb25lbnRzICogNSAqIHJncm91cF9oZWlnaHQpICoKLQkJCQlTSVpFT0YoSlNBTVBST1cpKTsKLQotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIC8qIEFsbG9jYXRlIHRoZSBhY3R1YWwgYnVmZmVyIHNwYWNlICgzIHJvdyBncm91cHMpIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICAgKiBXZSBtYWtlIHRoZSBidWZmZXIgd2lkZSBlbm91Z2ggdG8gYWxsb3cgdGhlIGRvd25zYW1wbGVyIHRvIGVkZ2UtZXhwYW5kCi0gICAgICogaG9yaXpvbnRhbGx5IHdpdGhpbiB0aGUgYnVmZmVyLCBpZiBpdCBzbyBjaG9vc2VzLgotICAgICAqLwotICAgIHRydWVfYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0gICAgICAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotICAgICAgIChKRElNRU5TSU9OKSAoKChsb25nKSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFICoKLQkJICAgICAgY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKSAvIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpLAotICAgICAgIChKRElNRU5TSU9OKSAoMyAqIHJncm91cF9oZWlnaHQpKTsKLSAgICAvKiBDb3B5IHRydWUgYnVmZmVyIHJvdyBwb2ludGVycyBpbnRvIHRoZSBtaWRkbGUgb2YgdGhlIGZha2Ugcm93IGFycmF5ICovCi0gICAgTUVNQ09QWShmYWtlX2J1ZmZlciArIHJncm91cF9oZWlnaHQsIHRydWVfYnVmZmVyLAotCSAgICAzICogcmdyb3VwX2hlaWdodCAqIFNJWkVPRihKU0FNUFJPVykpOwotICAgIC8qIEZpbGwgaW4gdGhlIGFib3ZlIGFuZCBiZWxvdyB3cmFwYXJvdW5kIHBvaW50ZXJzICovCi0gICAgZm9yIChpID0gMDsgaSA8IHJncm91cF9oZWlnaHQ7IGkrKykgewotICAgICAgZmFrZV9idWZmZXJbaV0gPSB0cnVlX2J1ZmZlclsyICogcmdyb3VwX2hlaWdodCArIGldOwotICAgICAgZmFrZV9idWZmZXJbNCAqIHJncm91cF9oZWlnaHQgKyBpXSA9IHRydWVfYnVmZmVyW2ldOwotICAgIH0KLSAgICBwcmVwLT5jb2xvcl9idWZbY2ldID0gZmFrZV9idWZmZXIgKyByZ3JvdXBfaGVpZ2h0OwotICAgIGZha2VfYnVmZmVyICs9IDUgKiByZ3JvdXBfaGVpZ2h0OyAvKiBwb2ludCB0byBzcGFjZSBmb3IgbmV4dCBjb21wb25lbnQgKi8KLSAgfQotfQotCi0jZW5kaWYgLyogQ09OVEVYVF9ST1dTX1NVUFBPUlRFRCAqLwotCi0KLS8qCi0gKiBJbml0aWFsaXplIHByZXByb2Nlc3NpbmcgY29udHJvbGxlci4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2NfcHJlcF9jb250cm9sbGVyIChqX2NvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQotewotICBteV9wcmVwX3B0ciBwcmVwOwotICBpbnQgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotCi0gIGlmIChuZWVkX2Z1bGxfYnVmZmVyKQkJLyogc2FmZXR5IGNoZWNrICovCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotCi0gIHByZXAgPSAobXlfcHJlcF9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfcHJlcF9jb250cm9sbGVyKSk7Ci0gIGNpbmZvLT5wcmVwID0gKHN0cnVjdCBqcGVnX2NfcHJlcF9jb250cm9sbGVyICopIHByZXA7Ci0gIHByZXAtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19wcmVwOwotCi0gIC8qIEFsbG9jYXRlIHRoZSBjb2xvciBjb252ZXJzaW9uIGJ1ZmZlci4KLSAgICogV2UgbWFrZSB0aGUgYnVmZmVyIHdpZGUgZW5vdWdoIHRvIGFsbG93IHRoZSBkb3duc2FtcGxlciB0byBlZGdlLWV4cGFuZAotICAgKiBob3Jpem9udGFsbHkgd2l0aGluIHRoZSBidWZmZXIsIGlmIGl0IHNvIGNob29zZXMuCi0gICAqLwotICBpZiAoY2luZm8tPmRvd25zYW1wbGUtPm5lZWRfY29udGV4dF9yb3dzKSB7Ci0gICAgLyogU2V0IHVwIHRvIHByb3ZpZGUgY29udGV4dCByb3dzICovCi0jaWZkZWYgQ09OVEVYVF9ST1dTX1NVUFBPUlRFRAotICAgIHByZXAtPnB1Yi5wcmVfcHJvY2Vzc19kYXRhID0gcHJlX3Byb2Nlc3NfY29udGV4dDsKLSAgICBjcmVhdGVfY29udGV4dF9idWZmZXIoY2luZm8pOwotI2Vsc2UKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICAvKiBObyBjb250ZXh0LCBqdXN0IG1ha2UgaXQgdGFsbCBlbm91Z2ggZm9yIG9uZSByb3cgZ3JvdXAgKi8KLSAgICBwcmVwLT5wdWIucHJlX3Byb2Nlc3NfZGF0YSA9IHByZV9wcm9jZXNzX2RhdGE7Ci0gICAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLQkgY2krKywgY29tcHB0cisrKSB7Ci0gICAgICBwcmVwLT5jb2xvcl9idWZbY2ldID0gKCpjaW5mby0+bWVtLT5hbGxvY19zYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkgKEpESU1FTlNJT04pICgoKGxvbmcpIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUgKgotCQkJY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKSAvIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpLAotCSAoSkRJTUVOU0lPTikgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY3NhbXBsZS5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjc2FtcGxlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMmVjODcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pjc2FtcGxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTkgKzAsMCBAQAotLyoKLSAqIGpjc2FtcGxlLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBkb3duc2FtcGxpbmcgcm91dGluZXMuCi0gKgotICogRG93bnNhbXBsaW5nIGlucHV0IGRhdGEgaXMgY291bnRlZCBpbiAicm93IGdyb3VwcyIuICBBIHJvdyBncm91cAotICogaXMgZGVmaW5lZCB0byBiZSBtYXhfdl9zYW1wX2ZhY3RvciBwaXhlbCByb3dzIG9mIGVhY2ggY29tcG9uZW50LAotICogZnJvbSB3aGljaCB0aGUgZG93bnNhbXBsZXIgcHJvZHVjZXMgdl9zYW1wX2ZhY3RvciBzYW1wbGUgcm93cy4KLSAqIEEgc2luZ2xlIHJvdyBncm91cCBpcyBwcm9jZXNzZWQgaW4gZWFjaCBjYWxsIHRvIHRoZSBkb3duc2FtcGxlciBtb2R1bGUuCi0gKgotICogVGhlIGRvd25zYW1wbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlZGdlLWV4cGFuc2lvbiBvZiBpdHMgb3V0cHV0IGRhdGEKLSAqIHRvIGZpbGwgYW4gaW50ZWdyYWwgbnVtYmVyIG9mIERDVCBibG9ja3MgaG9yaXpvbnRhbGx5LiAgVGhlIHNvdXJjZSBidWZmZXIKLSAqIG1heSBiZSBtb2RpZmllZCBpZiBpdCBpcyBoZWxwZnVsIGZvciB0aGlzIHB1cnBvc2UgKHRoZSBzb3VyY2UgYnVmZmVyIGlzCi0gKiBhbGxvY2F0ZWQgd2lkZSBlbm91Z2ggdG8gY29ycmVzcG9uZCB0byB0aGUgZGVzaXJlZCBvdXRwdXQgd2lkdGgpLgotICogVGhlIGNhbGxlciAodGhlIHByZXAgY29udHJvbGxlcikgaXMgcmVzcG9uc2libGUgZm9yIHZlcnRpY2FsIHBhZGRpbmcuCi0gKgotICogVGhlIGRvd25zYW1wbGVyIG1heSByZXF1ZXN0ICJjb250ZXh0IHJvd3MiIGJ5IHNldHRpbmcgbmVlZF9jb250ZXh0X3Jvd3MKLSAqIGR1cmluZyBzdGFydHVwLiAgSW4gdGhpcyBjYXNlLCB0aGUgaW5wdXQgYXJyYXlzIHdpbGwgY29udGFpbiBhdCBsZWFzdAotICogb25lIHJvdyBncm91cCdzIHdvcnRoIG9mIHBpeGVscyBhYm92ZSBhbmQgYmVsb3cgdGhlIHBhc3NlZC1pbiBkYXRhOwotICogdGhlIGNhbGxlciB3aWxsIGNyZWF0ZSBkdW1teSByb3dzIGF0IGltYWdlIHRvcCBhbmQgYm90dG9tIGJ5IHJlcGxpY2F0aW5nCi0gKiB0aGUgZmlyc3Qgb3IgbGFzdCByZWFsIHBpeGVsIHJvdy4KLSAqCi0gKiBBbiBleGNlbGxlbnQgcmVmZXJlbmNlIGZvciBpbWFnZSByZXNhbXBsaW5nIGlzCi0gKiAgIERpZ2l0YWwgSW1hZ2UgV2FycGluZywgR2VvcmdlIFdvbGJlcmcsIDE5OTAuCi0gKiAgIFB1Yi4gYnkgSUVFRSBDb21wdXRlciBTb2NpZXR5IFByZXNzLCBMb3MgQWxhbWl0b3MsIENBLiBJU0JOIDAtODE4Ni04OTQ0LTcuCi0gKgotICogVGhlIGRvd25zYW1wbGluZyBhbGdvcml0aG0gdXNlZCBoZXJlIGlzIGEgc2ltcGxlIGF2ZXJhZ2Ugb2YgdGhlIHNvdXJjZQotICogcGl4ZWxzIGNvdmVyZWQgYnkgdGhlIG91dHB1dCBwaXhlbC4gIFRoZSBoaS1mYWx1dGluIHNhbXBsaW5nIGxpdGVyYXR1cmUKLSAqIHJlZmVycyB0byB0aGlzIGFzIGEgImJveCBmaWx0ZXIiLiAgSW4gZ2VuZXJhbCB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIGEgYm94Ci0gKiBmaWx0ZXIgYXJlIG5vdCB2ZXJ5IGdvb2QsIGJ1dCBmb3IgdGhlIHNwZWNpZmljIGNhc2VzIHdlIG5vcm1hbGx5IHVzZSAoMToxCi0gKiBhbmQgMjoxIHJhdGlvcykgdGhlIGJveCBpcyBlcXVpdmFsZW50IHRvIGEgInRyaWFuZ2xlIGZpbHRlciIgd2hpY2ggaXMgbm90Ci0gKiBuZWFybHkgc28gYmFkLiAgSWYgeW91IGludGVuZCB0byB1c2Ugb3RoZXIgc2FtcGxpbmcgcmF0aW9zLCB5b3UnZCBiZSB3ZWxsCi0gKiBhZHZpc2VkIHRvIGltcHJvdmUgdGhpcyBjb2RlLgotICoKLSAqIEEgc2ltcGxlIGlucHV0LXNtb290aGluZyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkLiAgVGhpcyBpcyBtYWlubHkgaW50ZW5kZWQKLSAqIGZvciBjbGVhbmluZyB1cCBjb2xvci1kaXRoZXJlZCBHSUYgaW5wdXQgZmlsZXMgKGlmIHlvdSBmaW5kIGl0IGluYWRlcXVhdGUsCi0gKiB3ZSBzdWdnZXN0IHVzaW5nIGFuIGV4dGVybmFsIGZpbHRlcmluZyBwcm9ncmFtIHN1Y2ggYXMgcG5tY29udm9sKS4gIFdoZW4KLSAqIGVuYWJsZWQsIGVhY2ggaW5wdXQgcGl4ZWwgUCBpcyByZXBsYWNlZCBieSBhIHdlaWdodGVkIHN1bSBvZiBpdHNlbGYgYW5kIGl0cwotICogZWlnaHQgbmVpZ2hib3JzLiAgUCdzIHdlaWdodCBpcyAxLTgqU0YgYW5kIGVhY2ggbmVpZ2hib3IncyB3ZWlnaHQgaXMgU0YsCi0gKiB3aGVyZSBTRiA9IChzbW9vdGhpbmdfZmFjdG9yIC8gMTAyNCkuCi0gKiBDdXJyZW50bHksIHNtb290aGluZyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgMmgydiBzYW1wbGluZyBmYWN0b3JzLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBQb2ludGVyIHRvIHJvdXRpbmUgdG8gZG93bnNhbXBsZSBhIHNpbmdsZSBjb21wb25lbnQgKi8KLXR5cGVkZWYgSk1FVEhPRCh2b2lkLCBkb3duc2FtcGxlMV9wdHIsCi0JCShqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JCSBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpKTsKLQotLyogUHJpdmF0ZSBzdWJvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19kb3duc2FtcGxlciBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBEb3duc2FtcGxpbmcgbWV0aG9kIHBvaW50ZXJzLCBvbmUgcGVyIGNvbXBvbmVudCAqLwotICBkb3duc2FtcGxlMV9wdHIgbWV0aG9kc1tNQVhfQ09NUE9ORU5UU107Ci19IG15X2Rvd25zYW1wbGVyOwotCi10eXBlZGVmIG15X2Rvd25zYW1wbGVyICogbXlfZG93bnNhbXBsZV9wdHI7Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGEgZG93bnNhbXBsaW5nIHBhc3MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9wYXNzX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotewotICAvKiBubyB3b3JrIGZvciBub3cgKi8KLX0KLQotCi0vKgotICogRXhwYW5kIGEgY29tcG9uZW50IGhvcml6b250YWxseSBmcm9tIHdpZHRoIGlucHV0X2NvbHMgdG8gd2lkdGggb3V0cHV0X2NvbHMsCi0gKiBieSBkdXBsaWNhdGluZyB0aGUgcmlnaHRtb3N0IHNhbXBsZXMuCi0gKi8KLQotTE9DQUwodm9pZCkKLWV4cGFuZF9yaWdodF9lZGdlIChKU0FNUEFSUkFZIGltYWdlX2RhdGEsIGludCBudW1fcm93cywKLQkJICAgSkRJTUVOU0lPTiBpbnB1dF9jb2xzLCBKRElNRU5TSU9OIG91dHB1dF9jb2xzKQotewotICByZWdpc3RlciBKU0FNUFJPVyBwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QTEUgcGl4dmFsOwotICByZWdpc3RlciBpbnQgY291bnQ7Ci0gIGludCByb3c7Ci0gIGludCBudW1jb2xzID0gKGludCkgKG91dHB1dF9jb2xzIC0gaW5wdXRfY29scyk7Ci0KLSAgaWYgKG51bWNvbHMgPiAwKSB7Ci0gICAgZm9yIChyb3cgPSAwOyByb3cgPCBudW1fcm93czsgcm93KyspIHsKLSAgICAgIHB0ciA9IGltYWdlX2RhdGFbcm93XSArIGlucHV0X2NvbHM7Ci0gICAgICBwaXh2YWwgPSBwdHJbLTFdOwkJLyogZG9uJ3QgbmVlZCBHRVRKU0FNUExFKCkgaGVyZSAqLwotICAgICAgZm9yIChjb3VudCA9IG51bWNvbHM7IGNvdW50ID4gMDsgY291bnQtLSkKLQkqcHRyKysgPSBwaXh2YWw7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIERvIGRvd25zYW1wbGluZyBmb3IgYSB3aG9sZSByb3cgZ3JvdXAgKGFsbCBjb21wb25lbnRzKS4KLSAqCi0gKiBJbiB0aGlzIHZlcnNpb24gd2Ugc2ltcGx5IGRvd25zYW1wbGUgZWFjaCBjb21wb25lbnQgaW5kZXBlbmRlbnRseS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXNlcF9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5fcm93X2luZGV4LAotCQlKU0FNUElNQUdFIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0X3Jvd19ncm91cF9pbmRleCkKLXsKLSAgbXlfZG93bnNhbXBsZV9wdHIgZG93bnNhbXBsZSA9IChteV9kb3duc2FtcGxlX3B0cikgY2luZm8tPmRvd25zYW1wbGU7Ci0gIGludCBjaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0gIEpTQU1QQVJSQVkgaW5fcHRyLCBvdXRfcHRyOwotCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgaW5fcHRyID0gaW5wdXRfYnVmW2NpXSArIGluX3Jvd19pbmRleDsKLSAgICBvdXRfcHRyID0gb3V0cHV0X2J1ZltjaV0gKyAob3V0X3Jvd19ncm91cF9pbmRleCAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IpOwotICAgICgqZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0pIChjaW5mbywgY29tcHB0ciwgaW5fcHRyLCBvdXRfcHRyKTsKLSAgfQotfQotCi0KLS8qCi0gKiBEb3duc2FtcGxlIHBpeGVsIHZhbHVlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQuCi0gKiBPbmUgcm93IGdyb3VwIGlzIHByb2Nlc3NlZCBwZXIgY2FsbC4KLSAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIGFyYml0cmFyeSBpbnRlZ3JhbCBzYW1wbGluZyByYXRpb3MsIHdpdGhvdXQgc21vb3RoaW5nLgotICogTm90ZSB0aGF0IHRoaXMgdmVyc2lvbiBpcyBub3QgYWN0dWFsbHkgdXNlZCBmb3IgY3VzdG9tYXJ5IHNhbXBsaW5nIHJhdGlvcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWludF9kb3duc2FtcGxlIChqX2NvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JCUpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkKLXsKLSAgaW50IGlucm93LCBvdXRyb3csIGhfZXhwYW5kLCB2X2V4cGFuZCwgbnVtcGl4LCBudW1waXgyLCBoLCB2OwotICBKRElNRU5TSU9OIG91dGNvbCwgb3V0Y29sX2g7CS8qIG91dGNvbF9oID09IG91dGNvbCpoX2V4cGFuZCAqLwotICBKRElNRU5TSU9OIG91dHB1dF9jb2xzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRTsKLSAgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKLSAgSU5UMzIgb3V0dmFsdWU7Ci0KLSAgaF9leHBhbmQgPSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgLyBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOwotICB2X2V4cGFuZCA9IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAvIGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gIG51bXBpeCA9IGhfZXhwYW5kICogdl9leHBhbmQ7Ci0gIG51bXBpeDIgPSBudW1waXgvMjsKLQotICAvKiBFeHBhbmQgaW5wdXQgZGF0YSBlbm91Z2ggdG8gbGV0IGFsbCB0aGUgb3V0cHV0IHNhbXBsZXMgYmUgZ2VuZXJhdGVkCi0gICAqIGJ5IHRoZSBzdGFuZGFyZCBsb29wLiAgU3BlY2lhbC1jYXNpbmcgcGFkZGVkIG91dHB1dCB3b3VsZCBiZSBtb3JlCi0gICAqIGVmZmljaWVudC4KLSAgICovCi0gIGV4cGFuZF9yaWdodF9lZGdlKGlucHV0X2RhdGEsIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwKLQkJICAgIGNpbmZvLT5pbWFnZV93aWR0aCwgb3V0cHV0X2NvbHMgKiBoX2V4cGFuZCk7Ci0KLSAgaW5yb3cgPSAwOwotICBmb3IgKG91dHJvdyA9IDA7IG91dHJvdyA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG91dHJvdysrKSB7Ci0gICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93XTsKLSAgICBmb3IgKG91dGNvbCA9IDAsIG91dGNvbF9oID0gMDsgb3V0Y29sIDwgb3V0cHV0X2NvbHM7Ci0JIG91dGNvbCsrLCBvdXRjb2xfaCArPSBoX2V4cGFuZCkgewotICAgICAgb3V0dmFsdWUgPSAwOwotICAgICAgZm9yICh2ID0gMDsgdiA8IHZfZXhwYW5kOyB2KyspIHsKLQlpbnB0ciA9IGlucHV0X2RhdGFbaW5yb3crdl0gKyBvdXRjb2xfaDsKLQlmb3IgKGggPSAwOyBoIDwgaF9leHBhbmQ7IGgrKykgewotCSAgb3V0dmFsdWUgKz0gKElOVDMyKSBHRVRKU0FNUExFKCppbnB0cisrKTsKLQl9Ci0gICAgICB9Ci0gICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChvdXR2YWx1ZSArIG51bXBpeDIpIC8gbnVtcGl4KTsKLSAgICB9Ci0gICAgaW5yb3cgKz0gdl9leHBhbmQ7Ci0gIH0KLX0KLQotCi0vKgotICogRG93bnNhbXBsZSBwaXhlbCB2YWx1ZXMgb2YgYSBzaW5nbGUgY29tcG9uZW50LgotICogVGhpcyB2ZXJzaW9uIGhhbmRsZXMgdGhlIHNwZWNpYWwgY2FzZSBvZiBhIGZ1bGwtc2l6ZSBjb21wb25lbnQsCi0gKiB3aXRob3V0IHNtb290aGluZy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZ1bGxzaXplX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEpCi17Ci0gIC8qIENvcHkgdGhlIGRhdGEgKi8KLSAgamNvcHlfc2FtcGxlX3Jvd3MoaW5wdXRfZGF0YSwgMCwgb3V0cHV0X2RhdGEsIDAsCi0JCSAgICBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsIGNpbmZvLT5pbWFnZV93aWR0aCk7Ci0gIC8qIEVkZ2UtZXhwYW5kICovCi0gIGV4cGFuZF9yaWdodF9lZGdlKG91dHB1dF9kYXRhLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IsCi0JCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkUpOwotfQotCi0KLS8qCi0gKiBEb3duc2FtcGxlIHBpeGVsIHZhbHVlcyBvZiBhIHNpbmdsZSBjb21wb25lbnQuCi0gKiBUaGlzIHZlcnNpb24gaGFuZGxlcyB0aGUgY29tbW9uIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDE6MSB2ZXJ0aWNhbCwKLSAqIHdpdGhvdXQgc21vb3RoaW5nLgotICoKLSAqIEEgbm90ZSBhYm91dCB0aGUgImJpYXMiIGNhbGN1bGF0aW9uczogd2hlbiByb3VuZGluZyBmcmFjdGlvbmFsIHZhbHVlcyB0bwotICogaW50ZWdlciwgd2UgZG8gbm90IHdhbnQgdG8gYWx3YXlzIHJvdW5kIDAuNSB1cCB0byB0aGUgbmV4dCBpbnRlZ2VyLgotICogSWYgd2UgZGlkIHRoYXQsIHdlJ2QgaW50cm9kdWNlIGEgbm90aWNlYWJsZSBiaWFzIHRvd2FyZHMgbGFyZ2VyIHZhbHVlcy4KLSAqIEluc3RlYWQsIHRoaXMgY29kZSBpcyBhcnJhbmdlZCBzbyB0aGF0IDAuNSB3aWxsIGJlIHJvdW5kZWQgdXAgb3IgZG93biBhdAotICogYWx0ZXJuYXRlIHBpeGVsIGxvY2F0aW9ucyAoYSBzaW1wbGUgb3JkZXJlZCBkaXRoZXIgcGF0dGVybikuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1oMnYxX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkKLXsKLSAgaW50IG91dHJvdzsKLSAgSkRJTUVOU0lPTiBvdXRjb2w7Ci0gIEpESU1FTlNJT04gb3V0cHV0X2NvbHMgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBpbnQgYmlhczsKLQotICAvKiBFeHBhbmQgaW5wdXQgZGF0YSBlbm91Z2ggdG8gbGV0IGFsbCB0aGUgb3V0cHV0IHNhbXBsZXMgYmUgZ2VuZXJhdGVkCi0gICAqIGJ5IHRoZSBzdGFuZGFyZCBsb29wLiAgU3BlY2lhbC1jYXNpbmcgcGFkZGVkIG91dHB1dCB3b3VsZCBiZSBtb3JlCi0gICAqIGVmZmljaWVudC4KLSAgICovCi0gIGV4cGFuZF9yaWdodF9lZGdlKGlucHV0X2RhdGEsIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwKLQkJICAgIGNpbmZvLT5pbWFnZV93aWR0aCwgb3V0cHV0X2NvbHMgKiAyKTsKLQotICBmb3IgKG91dHJvdyA9IDA7IG91dHJvdyA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG91dHJvdysrKSB7Ci0gICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93XTsKLSAgICBpbnB0ciA9IGlucHV0X2RhdGFbb3V0cm93XTsKLSAgICBiaWFzID0gMDsJCQkvKiBiaWFzID0gMCwxLDAsMSwuLi4gZm9yIHN1Y2Nlc3NpdmUgc2FtcGxlcyAqLwotICAgIGZvciAob3V0Y29sID0gMDsgb3V0Y29sIDwgb3V0cHV0X2NvbHM7IG91dGNvbCsrKSB7Ci0gICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChHRVRKU0FNUExFKCppbnB0cikgKyBHRVRKU0FNUExFKGlucHRyWzFdKQotCQkJICAgICAgKyBiaWFzKSA+PiAxKTsKLSAgICAgIGJpYXMgXj0gMTsJCS8qIDA9PjEsIDE9PjAgKi8KLSAgICAgIGlucHRyICs9IDI7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIERvd25zYW1wbGUgcGl4ZWwgdmFsdWVzIG9mIGEgc2luZ2xlIGNvbXBvbmVudC4KLSAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIHRoZSBzdGFuZGFyZCBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAyOjEgdmVydGljYWwsCi0gKiB3aXRob3V0IHNtb290aGluZy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWgydjJfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKQotewotICBpbnQgaW5yb3csIG91dHJvdzsKLSAgSkRJTUVOU0lPTiBvdXRjb2w7Ci0gIEpESU1FTlNJT04gb3V0cHV0X2NvbHMgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBEQ1RTSVpFOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0cjAsIGlucHRyMSwgb3V0cHRyOwotICByZWdpc3RlciBpbnQgYmlhczsKLQotICAvKiBFeHBhbmQgaW5wdXQgZGF0YSBlbm91Z2ggdG8gbGV0IGFsbCB0aGUgb3V0cHV0IHNhbXBsZXMgYmUgZ2VuZXJhdGVkCi0gICAqIGJ5IHRoZSBzdGFuZGFyZCBsb29wLiAgU3BlY2lhbC1jYXNpbmcgcGFkZGVkIG91dHB1dCB3b3VsZCBiZSBtb3JlCi0gICAqIGVmZmljaWVudC4KLSAgICovCi0gIGV4cGFuZF9yaWdodF9lZGdlKGlucHV0X2RhdGEsIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwKLQkJICAgIGNpbmZvLT5pbWFnZV93aWR0aCwgb3V0cHV0X2NvbHMgKiAyKTsKLQotICBpbnJvdyA9IDA7Ci0gIGZvciAob3V0cm93ID0gMDsgb3V0cm93IDwgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcjsgb3V0cm93KyspIHsKLSAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3ddOwotICAgIGlucHRyMCA9IGlucHV0X2RhdGFbaW5yb3ddOwotICAgIGlucHRyMSA9IGlucHV0X2RhdGFbaW5yb3crMV07Ci0gICAgYmlhcyA9IDE7CQkJLyogYmlhcyA9IDEsMiwxLDIsLi4uIGZvciBzdWNjZXNzaXZlIHNhbXBsZXMgKi8KLSAgICBmb3IgKG91dGNvbCA9IDA7IG91dGNvbCA8IG91dHB1dF9jb2xzOyBvdXRjb2wrKykgewotICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgoR0VUSlNBTVBMRSgqaW5wdHIwKSArIEdFVEpTQU1QTEUoaW5wdHIwWzFdKSArCi0JCQkgICAgICBHRVRKU0FNUExFKCppbnB0cjEpICsgR0VUSlNBTVBMRShpbnB0cjFbMV0pCi0JCQkgICAgICArIGJpYXMpID4+IDIpOwotICAgICAgYmlhcyBePSAzOwkJLyogMT0+MiwgMj0+MSAqLwotICAgICAgaW5wdHIwICs9IDI7IGlucHRyMSArPSAyOwotICAgIH0KLSAgICBpbnJvdyArPSAyOwotICB9Ci19Ci0KLQotI2lmZGVmIElOUFVUX1NNT09USElOR19TVVBQT1JURUQKLQotLyoKLSAqIERvd25zYW1wbGUgcGl4ZWwgdmFsdWVzIG9mIGEgc2luZ2xlIGNvbXBvbmVudC4KLSAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIHRoZSBzdGFuZGFyZCBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAyOjEgdmVydGljYWwsCi0gKiB3aXRoIHNtb290aGluZy4gIE9uZSByb3cgb2YgY29udGV4dCBpcyByZXF1aXJlZC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWgydjJfc21vb3RoX2Rvd25zYW1wbGUgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJCUpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSkKLXsKLSAgaW50IGlucm93LCBvdXRyb3c7Ci0gIEpESU1FTlNJT04gY29sY3RyOwotICBKRElNRU5TSU9OIG91dHB1dF9jb2xzID0gY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICogRENUU0laRTsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIwLCBpbnB0cjEsIGFib3ZlX3B0ciwgYmVsb3dfcHRyLCBvdXRwdHI7Ci0gIElOVDMyIG1lbWJlcnN1bSwgbmVpZ2hzdW0sIG1lbWJlcnNjYWxlLCBuZWlnaHNjYWxlOwotCi0gIC8qIEV4cGFuZCBpbnB1dCBkYXRhIGVub3VnaCB0byBsZXQgYWxsIHRoZSBvdXRwdXQgc2FtcGxlcyBiZSBnZW5lcmF0ZWQKLSAgICogYnkgdGhlIHN0YW5kYXJkIGxvb3AuICBTcGVjaWFsLWNhc2luZyBwYWRkZWQgb3V0cHV0IHdvdWxkIGJlIG1vcmUKLSAgICogZWZmaWNpZW50LgotICAgKi8KLSAgZXhwYW5kX3JpZ2h0X2VkZ2UoaW5wdXRfZGF0YSAtIDEsIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciArIDIsCi0JCSAgICBjaW5mby0+aW1hZ2Vfd2lkdGgsIG91dHB1dF9jb2xzICogMik7Ci0KLSAgLyogV2UgZG9uJ3QgYm90aGVyIHRvIGZvcm0gdGhlIGluZGl2aWR1YWwgInNtb290aGVkIiBpbnB1dCBwaXhlbCB2YWx1ZXM7Ci0gICAqIHdlIGNhbiBkaXJlY3RseSBjb21wdXRlIHRoZSBvdXRwdXQgd2hpY2ggaXMgdGhlIGF2ZXJhZ2Ugb2YgdGhlIGZvdXIKLSAgICogc21vb3RoZWQgdmFsdWVzLiAgRWFjaCBvZiB0aGUgZm91ciBtZW1iZXIgcGl4ZWxzIGNvbnRyaWJ1dGVzIGEgZnJhY3Rpb24KLSAgICogKDEtOCpTRikgdG8gaXRzIG93biBzbW9vdGhlZCBpbWFnZSBhbmQgYSBmcmFjdGlvbiBTRiB0byBlYWNoIG9mIHRoZSB0aHJlZQotICAgKiBvdGhlciBzbW9vdGhlZCBwaXhlbHMsIHRoZXJlZm9yZSBhIHRvdGFsIGZyYWN0aW9uICgxLTUqU0YpLzQgdG8gdGhlIGZpbmFsCi0gICAqIG91dHB1dC4gIFRoZSBmb3VyIGNvcm5lci1hZGphY2VudCBuZWlnaGJvciBwaXhlbHMgY29udHJpYnV0ZSBhIGZyYWN0aW9uCi0gICAqIFNGIHRvIGp1c3Qgb25lIHNtb290aGVkIHBpeGVsLCBvciBTRi80IHRvIHRoZSBmaW5hbCBvdXRwdXQ7IHdoaWxlIHRoZQotICAgKiBlaWdodCBlZGdlLWFkamFjZW50IG5laWdoYm9ycyBjb250cmlidXRlIFNGIHRvIGVhY2ggb2YgdHdvIHNtb290aGVkCi0gICAqIHBpeGVscywgb3IgU0YvMiBvdmVyYWxsLiAgSW4gb3JkZXIgdG8gdXNlIGludGVnZXIgYXJpdGhtZXRpYywgdGhlc2UKLSAgICogZmFjdG9ycyBhcmUgc2NhbGVkIGJ5IDJeMTYgPSA2NTUzNi4KLSAgICogQWxzbyByZWNhbGwgdGhhdCBTRiA9IHNtb290aGluZ19mYWN0b3IgLyAxMDI0LgotICAgKi8KLQotICBtZW1iZXJzY2FsZSA9IDE2Mzg0IC0gY2luZm8tPnNtb290aGluZ19mYWN0b3IgKiA4MDsgLyogc2NhbGVkICgxLTUqU0YpLzQgKi8KLSAgbmVpZ2hzY2FsZSA9IGNpbmZvLT5zbW9vdGhpbmdfZmFjdG9yICogMTY7IC8qIHNjYWxlZCBTRi80ICovCi0KLSAgaW5yb3cgPSAwOwotICBmb3IgKG91dHJvdyA9IDA7IG91dHJvdyA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG91dHJvdysrKSB7Ci0gICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93XTsKLSAgICBpbnB0cjAgPSBpbnB1dF9kYXRhW2lucm93XTsKLSAgICBpbnB0cjEgPSBpbnB1dF9kYXRhW2lucm93KzFdOwotICAgIGFib3ZlX3B0ciA9IGlucHV0X2RhdGFbaW5yb3ctMV07Ci0gICAgYmVsb3dfcHRyID0gaW5wdXRfZGF0YVtpbnJvdysyXTsKLQotICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZmlyc3QgY29sdW1uOiBwcmV0ZW5kIGNvbHVtbiAtMSBpcyBzYW1lIGFzIGNvbHVtbiAwICovCi0gICAgbWVtYmVyc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIwKSArIEdFVEpTQU1QTEUoaW5wdHIwWzFdKSArCi0JCUdFVEpTQU1QTEUoKmlucHRyMSkgKyBHRVRKU0FNUExFKGlucHRyMVsxXSk7Ci0gICAgbmVpZ2hzdW0gPSBHRVRKU0FNUExFKCphYm92ZV9wdHIpICsgR0VUSlNBTVBMRShhYm92ZV9wdHJbMV0pICsKLQkgICAgICAgR0VUSlNBTVBMRSgqYmVsb3dfcHRyKSArIEdFVEpTQU1QTEUoYmVsb3dfcHRyWzFdKSArCi0JICAgICAgIEdFVEpTQU1QTEUoKmlucHRyMCkgKyBHRVRKU0FNUExFKGlucHRyMFsyXSkgKwotCSAgICAgICBHRVRKU0FNUExFKCppbnB0cjEpICsgR0VUSlNBTVBMRShpbnB0cjFbMl0pOwotICAgIG5laWdoc3VtICs9IG5laWdoc3VtOwotICAgIG5laWdoc3VtICs9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cikgKyBHRVRKU0FNUExFKGFib3ZlX3B0clsyXSkgKwotCQlHRVRKU0FNUExFKCpiZWxvd19wdHIpICsgR0VUSlNBTVBMRShiZWxvd19wdHJbMl0pOwotICAgIG1lbWJlcnN1bSA9IG1lbWJlcnN1bSAqIG1lbWJlcnNjYWxlICsgbmVpZ2hzdW0gKiBuZWlnaHNjYWxlOwotICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKG1lbWJlcnN1bSArIDMyNzY4KSA+PiAxNik7Ci0gICAgaW5wdHIwICs9IDI7IGlucHRyMSArPSAyOyBhYm92ZV9wdHIgKz0gMjsgYmVsb3dfcHRyICs9IDI7Ci0KLSAgICBmb3IgKGNvbGN0ciA9IG91dHB1dF9jb2xzIC0gMjsgY29sY3RyID4gMDsgY29sY3RyLS0pIHsKLSAgICAgIC8qIHN1bSBvZiBwaXhlbHMgZGlyZWN0bHkgbWFwcGVkIHRvIHRoaXMgb3V0cHV0IGVsZW1lbnQgKi8KLSAgICAgIG1lbWJlcnN1bSA9IEdFVEpTQU1QTEUoKmlucHRyMCkgKyBHRVRKU0FNUExFKGlucHRyMFsxXSkgKwotCQkgIEdFVEpTQU1QTEUoKmlucHRyMSkgKyBHRVRKU0FNUExFKGlucHRyMVsxXSk7Ci0gICAgICAvKiBzdW0gb2YgZWRnZS1uZWlnaGJvciBwaXhlbHMgKi8KLSAgICAgIG5laWdoc3VtID0gR0VUSlNBTVBMRSgqYWJvdmVfcHRyKSArIEdFVEpTQU1QTEUoYWJvdmVfcHRyWzFdKSArCi0JCSBHRVRKU0FNUExFKCpiZWxvd19wdHIpICsgR0VUSlNBTVBMRShiZWxvd19wdHJbMV0pICsKLQkJIEdFVEpTQU1QTEUoaW5wdHIwWy0xXSkgKyBHRVRKU0FNUExFKGlucHRyMFsyXSkgKwotCQkgR0VUSlNBTVBMRShpbnB0cjFbLTFdKSArIEdFVEpTQU1QTEUoaW5wdHIxWzJdKTsKLSAgICAgIC8qIFRoZSBlZGdlLW5laWdoYm9ycyBjb3VudCB0d2ljZSBhcyBtdWNoIGFzIGNvcm5lci1uZWlnaGJvcnMgKi8KLSAgICAgIG5laWdoc3VtICs9IG5laWdoc3VtOwotICAgICAgLyogQWRkIGluIHRoZSBjb3JuZXItbmVpZ2hib3JzICovCi0gICAgICBuZWlnaHN1bSArPSBHRVRKU0FNUExFKGFib3ZlX3B0clstMV0pICsgR0VUSlNBTVBMRShhYm92ZV9wdHJbMl0pICsKLQkJICBHRVRKU0FNUExFKGJlbG93X3B0clstMV0pICsgR0VUSlNBTVBMRShiZWxvd19wdHJbMl0pOwotICAgICAgLyogZm9ybSBmaW5hbCBvdXRwdXQgc2NhbGVkIHVwIGJ5IDJeMTYgKi8KLSAgICAgIG1lbWJlcnN1bSA9IG1lbWJlcnN1bSAqIG1lbWJlcnNjYWxlICsgbmVpZ2hzdW0gKiBuZWlnaHNjYWxlOwotICAgICAgLyogcm91bmQsIGRlc2NhbGUgYW5kIG91dHB1dCBpdCAqLwotICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgobWVtYmVyc3VtICsgMzI3NjgpID4+IDE2KTsKLSAgICAgIGlucHRyMCArPSAyOyBpbnB0cjEgKz0gMjsgYWJvdmVfcHRyICs9IDI7IGJlbG93X3B0ciArPSAyOwotICAgIH0KLQotICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgbGFzdCBjb2x1bW4gKi8KLSAgICBtZW1iZXJzdW0gPSBHRVRKU0FNUExFKCppbnB0cjApICsgR0VUSlNBTVBMRShpbnB0cjBbMV0pICsKLQkJR0VUSlNBTVBMRSgqaW5wdHIxKSArIEdFVEpTQU1QTEUoaW5wdHIxWzFdKTsKLSAgICBuZWlnaHN1bSA9IEdFVEpTQU1QTEUoKmFib3ZlX3B0cikgKyBHRVRKU0FNUExFKGFib3ZlX3B0clsxXSkgKwotCSAgICAgICBHRVRKU0FNUExFKCpiZWxvd19wdHIpICsgR0VUSlNBTVBMRShiZWxvd19wdHJbMV0pICsKLQkgICAgICAgR0VUSlNBTVBMRShpbnB0cjBbLTFdKSArIEdFVEpTQU1QTEUoaW5wdHIwWzFdKSArCi0JICAgICAgIEdFVEpTQU1QTEUoaW5wdHIxWy0xXSkgKyBHRVRKU0FNUExFKGlucHRyMVsxXSk7Ci0gICAgbmVpZ2hzdW0gKz0gbmVpZ2hzdW07Ci0gICAgbmVpZ2hzdW0gKz0gR0VUSlNBTVBMRShhYm92ZV9wdHJbLTFdKSArIEdFVEpTQU1QTEUoYWJvdmVfcHRyWzFdKSArCi0JCUdFVEpTQU1QTEUoYmVsb3dfcHRyWy0xXSkgKyBHRVRKU0FNUExFKGJlbG93X3B0clsxXSk7Ci0gICAgbWVtYmVyc3VtID0gbWVtYmVyc3VtICogbWVtYmVyc2NhbGUgKyBuZWlnaHN1bSAqIG5laWdoc2NhbGU7Ci0gICAgKm91dHB0ciA9IChKU0FNUExFKSAoKG1lbWJlcnN1bSArIDMyNzY4KSA+PiAxNik7Ci0KLSAgICBpbnJvdyArPSAyOwotICB9Ci19Ci0KLQotLyoKLSAqIERvd25zYW1wbGUgcGl4ZWwgdmFsdWVzIG9mIGEgc2luZ2xlIGNvbXBvbmVudC4KLSAqIFRoaXMgdmVyc2lvbiBoYW5kbGVzIHRoZSBzcGVjaWFsIGNhc2Ugb2YgYSBmdWxsLXNpemUgY29tcG9uZW50LAotICogd2l0aCBzbW9vdGhpbmcuICBPbmUgcm93IG9mIGNvbnRleHQgaXMgcmVxdWlyZWQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1mdWxsc2l6ZV9zbW9vdGhfZG93bnNhbXBsZSAoal9jb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHIsCi0JCQkgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZIG91dHB1dF9kYXRhKQotewotICBpbnQgb3V0cm93OwotICBKRElNRU5TSU9OIGNvbGN0cjsKLSAgSkRJTUVOU0lPTiBvdXRwdXRfY29scyA9IGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyAqIERDVFNJWkU7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBhYm92ZV9wdHIsIGJlbG93X3B0ciwgb3V0cHRyOwotICBJTlQzMiBtZW1iZXJzdW0sIG5laWdoc3VtLCBtZW1iZXJzY2FsZSwgbmVpZ2hzY2FsZTsKLSAgaW50IGNvbHN1bSwgbGFzdGNvbHN1bSwgbmV4dGNvbHN1bTsKLQotICAvKiBFeHBhbmQgaW5wdXQgZGF0YSBlbm91Z2ggdG8gbGV0IGFsbCB0aGUgb3V0cHV0IHNhbXBsZXMgYmUgZ2VuZXJhdGVkCi0gICAqIGJ5IHRoZSBzdGFuZGFyZCBsb29wLiAgU3BlY2lhbC1jYXNpbmcgcGFkZGVkIG91dHB1dCB3b3VsZCBiZSBtb3JlCi0gICAqIGVmZmljaWVudC4KLSAgICovCi0gIGV4cGFuZF9yaWdodF9lZGdlKGlucHV0X2RhdGEgLSAxLCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKyAyLAotCQkgICAgY2luZm8tPmltYWdlX3dpZHRoLCBvdXRwdXRfY29scyk7Ci0KLSAgLyogRWFjaCBvZiB0aGUgZWlnaHQgbmVpZ2hib3IgcGl4ZWxzIGNvbnRyaWJ1dGVzIGEgZnJhY3Rpb24gU0YgdG8gdGhlCi0gICAqIHNtb290aGVkIHBpeGVsLCB3aGlsZSB0aGUgbWFpbiBwaXhlbCBjb250cmlidXRlcyAoMS04KlNGKS4gIEluIG9yZGVyCi0gICAqIHRvIHVzZSBpbnRlZ2VyIGFyaXRobWV0aWMsIHRoZXNlIGZhY3RvcnMgYXJlIG11bHRpcGxpZWQgYnkgMl4xNiA9IDY1NTM2LgotICAgKiBBbHNvIHJlY2FsbCB0aGF0IFNGID0gc21vb3RoaW5nX2ZhY3RvciAvIDEwMjQuCi0gICAqLwotCi0gIG1lbWJlcnNjYWxlID0gNjU1MzZMIC0gY2luZm8tPnNtb290aGluZ19mYWN0b3IgKiA1MTJMOyAvKiBzY2FsZWQgMS04KlNGICovCi0gIG5laWdoc2NhbGUgPSBjaW5mby0+c21vb3RoaW5nX2ZhY3RvciAqIDY0OyAvKiBzY2FsZWQgU0YgKi8KLQotICBmb3IgKG91dHJvdyA9IDA7IG91dHJvdyA8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IG91dHJvdysrKSB7Ci0gICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93XTsKLSAgICBpbnB0ciA9IGlucHV0X2RhdGFbb3V0cm93XTsKLSAgICBhYm92ZV9wdHIgPSBpbnB1dF9kYXRhW291dHJvdy0xXTsKLSAgICBiZWxvd19wdHIgPSBpbnB1dF9kYXRhW291dHJvdysxXTsKLQotICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZmlyc3QgY29sdW1uICovCi0gICAgY29sc3VtID0gR0VUSlNBTVBMRSgqYWJvdmVfcHRyKyspICsgR0VUSlNBTVBMRSgqYmVsb3dfcHRyKyspICsKLQkgICAgIEdFVEpTQU1QTEUoKmlucHRyKTsKLSAgICBtZW1iZXJzdW0gPSBHRVRKU0FNUExFKCppbnB0cisrKTsKLSAgICBuZXh0Y29sc3VtID0gR0VUSlNBTVBMRSgqYWJvdmVfcHRyKSArIEdFVEpTQU1QTEUoKmJlbG93X3B0cikgKwotCQkgR0VUSlNBTVBMRSgqaW5wdHIpOwotICAgIG5laWdoc3VtID0gY29sc3VtICsgKGNvbHN1bSAtIG1lbWJlcnN1bSkgKyBuZXh0Y29sc3VtOwotICAgIG1lbWJlcnN1bSA9IG1lbWJlcnN1bSAqIG1lbWJlcnNjYWxlICsgbmVpZ2hzdW0gKiBuZWlnaHNjYWxlOwotICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKG1lbWJlcnN1bSArIDMyNzY4KSA+PiAxNik7Ci0gICAgbGFzdGNvbHN1bSA9IGNvbHN1bTsgY29sc3VtID0gbmV4dGNvbHN1bTsKLQotICAgIGZvciAoY29sY3RyID0gb3V0cHV0X2NvbHMgLSAyOyBjb2xjdHIgPiAwOyBjb2xjdHItLSkgewotICAgICAgbWVtYmVyc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIrKyk7Ci0gICAgICBhYm92ZV9wdHIrKzsgYmVsb3dfcHRyKys7Ci0gICAgICBuZXh0Y29sc3VtID0gR0VUSlNBTVBMRSgqYWJvdmVfcHRyKSArIEdFVEpTQU1QTEUoKmJlbG93X3B0cikgKwotCQkgICBHRVRKU0FNUExFKCppbnB0cik7Ci0gICAgICBuZWlnaHN1bSA9IGxhc3Rjb2xzdW0gKyAoY29sc3VtIC0gbWVtYmVyc3VtKSArIG5leHRjb2xzdW07Ci0gICAgICBtZW1iZXJzdW0gPSBtZW1iZXJzdW0gKiBtZW1iZXJzY2FsZSArIG5laWdoc3VtICogbmVpZ2hzY2FsZTsKLSAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKG1lbWJlcnN1bSArIDMyNzY4KSA+PiAxNik7Ci0gICAgICBsYXN0Y29sc3VtID0gY29sc3VtOyBjb2xzdW0gPSBuZXh0Y29sc3VtOwotICAgIH0KLQotICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgbGFzdCBjb2x1bW4gKi8KLSAgICBtZW1iZXJzdW0gPSBHRVRKU0FNUExFKCppbnB0cik7Ci0gICAgbmVpZ2hzdW0gPSBsYXN0Y29sc3VtICsgKGNvbHN1bSAtIG1lbWJlcnN1bSkgKyBjb2xzdW07Ci0gICAgbWVtYmVyc3VtID0gbWVtYmVyc3VtICogbWVtYmVyc2NhbGUgKyBuZWlnaHN1bSAqIG5laWdoc2NhbGU7Ci0gICAgKm91dHB0ciA9IChKU0FNUExFKSAoKG1lbWJlcnN1bSArIDMyNzY4KSA+PiAxNik7Ci0KLSAgfQotfQotCi0jZW5kaWYgLyogSU5QVVRfU01PT1RISU5HX1NVUFBPUlRFRCAqLwotCi0KLS8qCi0gKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgZG93bnNhbXBsaW5nLgotICogTm90ZSB0aGF0IHdlIG11c3Qgc2VsZWN0IGEgcm91dGluZSBmb3IgZWFjaCBjb21wb25lbnQuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9kb3duc2FtcGxlciAoal9jb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2Rvd25zYW1wbGVfcHRyIGRvd25zYW1wbGU7Ci0gIGludCBjaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0gIGJvb2xlYW4gc21vb3Rob2sgPSBUUlVFOwotCi0gIGRvd25zYW1wbGUgPSAobXlfZG93bnNhbXBsZV9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfZG93bnNhbXBsZXIpKTsKLSAgY2luZm8tPmRvd25zYW1wbGUgPSAoc3RydWN0IGpwZWdfZG93bnNhbXBsZXIgKikgZG93bnNhbXBsZTsKLSAgZG93bnNhbXBsZS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2Rvd25zYW1wbGU7Ci0gIGRvd25zYW1wbGUtPnB1Yi5kb3duc2FtcGxlID0gc2VwX2Rvd25zYW1wbGU7Ci0gIGRvd25zYW1wbGUtPnB1Yi5uZWVkX2NvbnRleHRfcm93cyA9IEZBTFNFOwotCi0gIGlmIChjaW5mby0+Q0NJUjYwMV9zYW1wbGluZykKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NDSVI2MDFfTk9USU1QTCk7Ci0KLSAgLyogVmVyaWZ5IHdlIGNhbiBoYW5kbGUgdGhlIHNhbXBsaW5nIGZhY3RvcnMsIGFuZCBzZXQgdXAgbWV0aG9kIHBvaW50ZXJzICovCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgaWYgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgPT0gY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICYmCi0JY29tcHB0ci0+dl9zYW1wX2ZhY3RvciA9PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKLSNpZmRlZiBJTlBVVF9TTU9PVEhJTkdfU1VQUE9SVEVECi0gICAgICBpZiAoY2luZm8tPnNtb290aGluZ19mYWN0b3IpIHsKLQlkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGZ1bGxzaXplX3Ntb290aF9kb3duc2FtcGxlOwotCWRvd25zYW1wbGUtPnB1Yi5uZWVkX2NvbnRleHRfcm93cyA9IFRSVUU7Ci0gICAgICB9IGVsc2UKLSNlbmRpZgotCWRvd25zYW1wbGUtPm1ldGhvZHNbY2ldID0gZnVsbHNpemVfZG93bnNhbXBsZTsKLSAgICB9IGVsc2UgaWYgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgKiAyID09IGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAmJgotCSAgICAgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yID09IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgewotICAgICAgc21vb3Rob2sgPSBGQUxTRTsKLSAgICAgIGRvd25zYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2MV9kb3duc2FtcGxlOwotICAgIH0gZWxzZSBpZiAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAqIDIgPT0gY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yICYmCi0JICAgICAgIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiAyID09IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgewotI2lmZGVmIElOUFVUX1NNT09USElOR19TVVBQT1JURUQKLSAgICAgIGlmIChjaW5mby0+c21vb3RoaW5nX2ZhY3RvcikgewotCWRvd25zYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2Ml9zbW9vdGhfZG93bnNhbXBsZTsKLQlkb3duc2FtcGxlLT5wdWIubmVlZF9jb250ZXh0X3Jvd3MgPSBUUlVFOwotICAgICAgfSBlbHNlCi0jZW5kaWYKLQlkb3duc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjJfZG93bnNhbXBsZTsKLSAgICB9IGVsc2UgaWYgKChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgJSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yKSA9PSAwICYmCi0JICAgICAgIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgJSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSA9PSAwKSB7Ci0gICAgICBzbW9vdGhvayA9IEZBTFNFOwotICAgICAgZG93bnNhbXBsZS0+bWV0aG9kc1tjaV0gPSBpbnRfZG93bnNhbXBsZTsKLSAgICB9IGVsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfRlJBQ1RfU0FNUExFX05PVElNUEwpOwotICB9Ci0KLSNpZmRlZiBJTlBVVF9TTU9PVEhJTkdfU1VQUE9SVEVECi0gIGlmIChjaW5mby0+c21vb3RoaW5nX2ZhY3RvciAmJiAhc21vb3Rob2spCi0gICAgVFJBQ0VNUyhjaW5mbywgMCwgSlRSQ19TTU9PVEhfTk9USU1QTCk7Ci0jZW5kaWYKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY3RyYW5zLmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamN0cmFucy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTZkNzA3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qY3RyYW5zLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODggKzAsMCBAQAotLyoKLSAqIGpjdHJhbnMuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGxpYnJhcnkgcm91dGluZXMgZm9yIHRyYW5zY29kaW5nIGNvbXByZXNzaW9uLAotICogdGhhdCBpcywgd3JpdGluZyByYXcgRENUIGNvZWZmaWNpZW50IGFycmF5cyB0byBhbiBvdXRwdXQgSlBFRyBmaWxlLgotICogVGhlIHJvdXRpbmVzIGluIGpjYXBpbWluLmMgd2lsbCBhbHNvIGJlIG5lZWRlZCBieSBhIHRyYW5zY29kZXIuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi1MT0NBTCh2b2lkKSB0cmFuc2VuY29kZV9tYXN0ZXJfc2VsZWN0aW9uCi0JSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywganZpcnRfYmFycmF5X3B0ciAqIGNvZWZfYXJyYXlzKSk7Ci1MT0NBTCh2b2lkKSB0cmFuc2VuY29kZV9jb2VmX2NvbnRyb2xsZXIKLQlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBqdmlydF9iYXJyYXlfcHRyICogY29lZl9hcnJheXMpKTsKLQotCi0vKgotICogQ29tcHJlc3Npb24gaW5pdGlhbGl6YXRpb24gZm9yIHdyaXRpbmcgcmF3LWNvZWZmaWNpZW50IGRhdGEuCi0gKiBCZWZvcmUgY2FsbGluZyB0aGlzLCBhbGwgcGFyYW1ldGVycyBhbmQgYSBkYXRhIGRlc3RpbmF0aW9uIG11c3QgYmUgc2V0IHVwLgotICogQ2FsbCBqcGVnX2ZpbmlzaF9jb21wcmVzcygpIHRvIGFjdHVhbGx5IHdyaXRlIHRoZSBkYXRhLgotICoKLSAqIFRoZSBudW1iZXIgb2YgcGFzc2VkIHZpcnR1YWwgYXJyYXlzIG11c3QgbWF0Y2ggY2luZm8tPm51bV9jb21wb25lbnRzLgotICogTm90ZSB0aGF0IHRoZSB2aXJ0dWFsIGFycmF5cyBuZWVkIG5vdCBiZSBmaWxsZWQgb3IgZXZlbiByZWFsaXplZCBhdAotICogdGhlIHRpbWUgd3JpdGVfY29lZmZpY2llbnRzIGlzIGNhbGxlZDsgaW5kZWVkLCBpZiB0aGUgdmlydHVhbCBhcnJheXMKLSAqIHdlcmUgcmVxdWVzdGVkIGZyb20gdGhpcyBjb21wcmVzc2lvbiBvYmplY3QncyBtZW1vcnkgbWFuYWdlciwgdGhleQotICogdHlwaWNhbGx5IHdpbGwgYmUgcmVhbGl6ZWQgZHVyaW5nIHRoaXMgcm91dGluZSBhbmQgZmlsbGVkIGFmdGVyd2FyZHMuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX3dyaXRlX2NvZWZmaWNpZW50cyAoal9jb21wcmVzc19wdHIgY2luZm8sIGp2aXJ0X2JhcnJheV9wdHIgKiBjb2VmX2FycmF5cykKLXsKLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gQ1NUQVRFX1NUQVJUKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIC8qIE1hcmsgYWxsIHRhYmxlcyB0byBiZSB3cml0dGVuICovCi0gIGpwZWdfc3VwcHJlc3NfdGFibGVzKGNpbmZvLCBGQUxTRSk7Ci0gIC8qIChSZSlpbml0aWFsaXplIGVycm9yIG1nciBhbmQgZGVzdGluYXRpb24gbW9kdWxlcyAqLwotICAoKmNpbmZvLT5lcnItPnJlc2V0X2Vycm9yX21ncikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgKCpjaW5mby0+ZGVzdC0+aW5pdF9kZXN0aW5hdGlvbikgKGNpbmZvKTsKLSAgLyogUGVyZm9ybSBtYXN0ZXIgc2VsZWN0aW9uIG9mIGFjdGl2ZSBtb2R1bGVzICovCi0gIHRyYW5zZW5jb2RlX21hc3Rlcl9zZWxlY3Rpb24oY2luZm8sIGNvZWZfYXJyYXlzKTsKLSAgLyogV2FpdCBmb3IganBlZ19maW5pc2hfY29tcHJlc3MoKSBjYWxsICovCi0gIGNpbmZvLT5uZXh0X3NjYW5saW5lID0gMDsJLyogc28ganBlZ193cml0ZV9tYXJrZXIgd29ya3MgKi8KLSAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IENTVEFURV9XUkNPRUZTOwotfQotCi0KLS8qCi0gKiBJbml0aWFsaXplIHRoZSBjb21wcmVzc2lvbiBvYmplY3Qgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMsCi0gKiB0aGVuIGNvcHkgZnJvbSB0aGUgc291cmNlIG9iamVjdCBhbGwgcGFyYW1ldGVycyBuZWVkZWQgZm9yIGxvc3NsZXNzCi0gKiB0cmFuc2NvZGluZy4gIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgdmFyaWVkIHdpdGhvdXQgbG9zcyAoc3VjaCBhcwotICogc2NhbiBzY3JpcHQgYW5kIEh1ZmZtYW4gb3B0aW1pemF0aW9uKSBhcmUgbGVmdCBpbiB0aGVpciBkZWZhdWx0IHN0YXRlcy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfY29weV9jcml0aWNhbF9wYXJhbWV0ZXJzIChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sCi0JCQkgICAgICAgal9jb21wcmVzc19wdHIgZHN0aW5mbykKLXsKLSAgSlFVQU5UX1RCTCAqKiBxdGJscHRyOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICppbmNvbXAsICpvdXRjb21wOwotICBKUVVBTlRfVEJMICpjX3F1YW50LCAqc2xvdF9xdWFudDsKLSAgaW50IHRibG5vLCBjaSwgY29lZmk7Ci0KLSAgLyogU2FmZXR5IGNoZWNrIHRvIGVuc3VyZSBzdGFydF9jb21wcmVzcyBub3QgY2FsbGVkIHlldC4gKi8KLSAgaWYgKGRzdGluZm8tPmdsb2JhbF9zdGF0ZSAhPSBDU1RBVEVfU1RBUlQpCi0gICAgRVJSRVhJVDEoZHN0aW5mbywgSkVSUl9CQURfU1RBVEUsIGRzdGluZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIC8qIENvcHkgZnVuZGFtZW50YWwgaW1hZ2UgZGltZW5zaW9ucyAqLwotICBkc3RpbmZvLT5pbWFnZV93aWR0aCA9IHNyY2luZm8tPmltYWdlX3dpZHRoOwotICBkc3RpbmZvLT5pbWFnZV9oZWlnaHQgPSBzcmNpbmZvLT5pbWFnZV9oZWlnaHQ7Ci0gIGRzdGluZm8tPmlucHV0X2NvbXBvbmVudHMgPSBzcmNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgZHN0aW5mby0+aW5fY29sb3Jfc3BhY2UgPSBzcmNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlOwotICAvKiBJbml0aWFsaXplIGFsbCBwYXJhbWV0ZXJzIHRvIGRlZmF1bHQgdmFsdWVzICovCi0gIGpwZWdfc2V0X2RlZmF1bHRzKGRzdGluZm8pOwotICAvKiBqcGVnX3NldF9kZWZhdWx0cyBtYXkgY2hvb3NlIHdyb25nIGNvbG9yc3BhY2UsIGVnIFlDYkNyIGlmIGlucHV0IGlzIFJHQi4KLSAgICogRml4IGl0IHRvIGdldCB0aGUgcmlnaHQgaGVhZGVyIG1hcmtlcnMgZm9yIHRoZSBpbWFnZSBjb2xvcnNwYWNlLgotICAgKi8KLSAganBlZ19zZXRfY29sb3JzcGFjZShkc3RpbmZvLCBzcmNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlKTsKLSAgZHN0aW5mby0+ZGF0YV9wcmVjaXNpb24gPSBzcmNpbmZvLT5kYXRhX3ByZWNpc2lvbjsKLSAgZHN0aW5mby0+Q0NJUjYwMV9zYW1wbGluZyA9IHNyY2luZm8tPkNDSVI2MDFfc2FtcGxpbmc7Ci0gIC8qIENvcHkgdGhlIHNvdXJjZSdzIHF1YW50aXphdGlvbiB0YWJsZXMuICovCi0gIGZvciAodGJsbm8gPSAwOyB0YmxubyA8IE5VTV9RVUFOVF9UQkxTOyB0YmxubysrKSB7Ci0gICAgaWYgKHNyY2luZm8tPnF1YW50X3RibF9wdHJzW3RibG5vXSAhPSBOVUxMKSB7Ci0gICAgICBxdGJscHRyID0gJiBkc3RpbmZvLT5xdWFudF90YmxfcHRyc1t0Ymxub107Ci0gICAgICBpZiAoKnF0YmxwdHIgPT0gTlVMTCkKLQkqcXRibHB0ciA9IGpwZWdfYWxsb2NfcXVhbnRfdGFibGUoKGpfY29tbW9uX3B0cikgZHN0aW5mbyk7Ci0gICAgICBNRU1DT1BZKCgqcXRibHB0ciktPnF1YW50dmFsLAotCSAgICAgIHNyY2luZm8tPnF1YW50X3RibF9wdHJzW3RibG5vXS0+cXVhbnR2YWwsCi0JICAgICAgU0laRU9GKCgqcXRibHB0ciktPnF1YW50dmFsKSk7Ci0gICAgICAoKnF0YmxwdHIpLT5zZW50X3RhYmxlID0gRkFMU0U7Ci0gICAgfQotICB9Ci0gIC8qIENvcHkgdGhlIHNvdXJjZSdzIHBlci1jb21wb25lbnQgaW5mby4KLSAgICogTm90ZSB3ZSBhc3N1bWUganBlZ19zZXRfZGVmYXVsdHMgaGFzIGFsbG9jYXRlZCB0aGUgZGVzdCBjb21wX2luZm8gYXJyYXkuCi0gICAqLwotICBkc3RpbmZvLT5udW1fY29tcG9uZW50cyA9IHNyY2luZm8tPm51bV9jb21wb25lbnRzOwotICBpZiAoZHN0aW5mby0+bnVtX2NvbXBvbmVudHMgPCAxIHx8IGRzdGluZm8tPm51bV9jb21wb25lbnRzID4gTUFYX0NPTVBPTkVOVFMpCi0gICAgRVJSRVhJVDIoZHN0aW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGRzdGluZm8tPm51bV9jb21wb25lbnRzLAotCSAgICAgTUFYX0NPTVBPTkVOVFMpOwotICBmb3IgKGNpID0gMCwgaW5jb21wID0gc3JjaW5mby0+Y29tcF9pbmZvLCBvdXRjb21wID0gZHN0aW5mby0+Y29tcF9pbmZvOwotICAgICAgIGNpIDwgZHN0aW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyssIGluY29tcCsrLCBvdXRjb21wKyspIHsKLSAgICBvdXRjb21wLT5jb21wb25lbnRfaWQgPSBpbmNvbXAtPmNvbXBvbmVudF9pZDsKLSAgICBvdXRjb21wLT5oX3NhbXBfZmFjdG9yID0gaW5jb21wLT5oX3NhbXBfZmFjdG9yOwotICAgIG91dGNvbXAtPnZfc2FtcF9mYWN0b3IgPSBpbmNvbXAtPnZfc2FtcF9mYWN0b3I7Ci0gICAgb3V0Y29tcC0+cXVhbnRfdGJsX25vID0gaW5jb21wLT5xdWFudF90Ymxfbm87Ci0gICAgLyogTWFrZSBzdXJlIHNhdmVkIHF1YW50aXphdGlvbiB0YWJsZSBmb3IgY29tcG9uZW50IG1hdGNoZXMgdGhlIHF0YWJsZQotICAgICAqIHNsb3QuICBJZiBub3QsIHRoZSBpbnB1dCBmaWxlIHJlLXVzZWQgdGhpcyBxdGFibGUgc2xvdC4KLSAgICAgKiBJSkcgZW5jb2RlciBjdXJyZW50bHkgY2Fubm90IGR1cGxpY2F0ZSB0aGlzLgotICAgICAqLwotICAgIHRibG5vID0gb3V0Y29tcC0+cXVhbnRfdGJsX25vOwotICAgIGlmICh0YmxubyA8IDAgfHwgdGJsbm8gPj0gTlVNX1FVQU5UX1RCTFMgfHwKLQlzcmNpbmZvLT5xdWFudF90YmxfcHRyc1t0Ymxub10gPT0gTlVMTCkKLSAgICAgIEVSUkVYSVQxKGRzdGluZm8sIEpFUlJfTk9fUVVBTlRfVEFCTEUsIHRibG5vKTsKLSAgICBzbG90X3F1YW50ID0gc3JjaW5mby0+cXVhbnRfdGJsX3B0cnNbdGJsbm9dOwotICAgIGNfcXVhbnQgPSBpbmNvbXAtPnF1YW50X3RhYmxlOwotICAgIGlmIChjX3F1YW50ICE9IE5VTEwpIHsKLSAgICAgIGZvciAoY29lZmkgPSAwOyBjb2VmaSA8IERDVFNJWkUyOyBjb2VmaSsrKSB7Ci0JaWYgKGNfcXVhbnQtPnF1YW50dmFsW2NvZWZpXSAhPSBzbG90X3F1YW50LT5xdWFudHZhbFtjb2VmaV0pCi0JICBFUlJFWElUMShkc3RpbmZvLCBKRVJSX01JU01BVENIRURfUVVBTlRfVEFCTEUsIHRibG5vKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgLyogTm90ZTogd2UgZG8gbm90IGNvcHkgdGhlIHNvdXJjZSdzIEh1ZmZtYW4gdGFibGUgYXNzaWdubWVudHM7Ci0gICAgICogaW5zdGVhZCB3ZSByZWx5IG9uIGpwZWdfc2V0X2NvbG9yc3BhY2UgdG8gaGF2ZSBtYWRlIGEgc3VpdGFibGUgY2hvaWNlLgotICAgICAqLwotICB9Ci0gIC8qIEFsc28gY29weSBKRklGIHZlcnNpb24gYW5kIHJlc29sdXRpb24gaW5mb3JtYXRpb24sIGlmIGF2YWlsYWJsZS4KLSAgICogU3RyaWN0bHkgc3BlYWtpbmcgdGhpcyBpc24ndCAiY3JpdGljYWwiIGluZm8sIGJ1dCBpdCdzIG5lYXJseQotICAgKiBhbHdheXMgYXBwcm9wcmlhdGUgdG8gY29weSBpdCBpZiBhdmFpbGFibGUuICBJbiBwYXJ0aWN1bGFyLAotICAgKiBpZiB0aGUgYXBwbGljYXRpb24gY2hvb3NlcyB0byBjb3B5IEpGSUYgMS4wMiBleHRlbnNpb24gbWFya2VycyBmcm9tCi0gICAqIHRoZSBzb3VyY2UgZmlsZSwgd2UgbmVlZCB0byBjb3B5IHRoZSB2ZXJzaW9uIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndAotICAgKiBlbWl0IGEgZmlsZSB0aGF0IGhhcyAxLjAyIGV4dGVuc2lvbnMgYnV0IGEgY2xhaW1lZCB2ZXJzaW9uIG9mIDEuMDEuCi0gICAqIFdlIHdpbGwgKm5vdCosIGhvd2V2ZXIsIGNvcHkgdmVyc2lvbiBpbmZvIGZyb20gbWlzbGFiZWxlZCAiMi4wMSIgZmlsZXMuCi0gICAqLwotICBpZiAoc3JjaW5mby0+c2F3X0pGSUZfbWFya2VyKSB7Ci0gICAgaWYgKHNyY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiA9PSAxKSB7Ci0gICAgICBkc3RpbmZvLT5KRklGX21ham9yX3ZlcnNpb24gPSBzcmNpbmZvLT5KRklGX21ham9yX3ZlcnNpb247Ci0gICAgICBkc3RpbmZvLT5KRklGX21pbm9yX3ZlcnNpb24gPSBzcmNpbmZvLT5KRklGX21pbm9yX3ZlcnNpb247Ci0gICAgfQotICAgIGRzdGluZm8tPmRlbnNpdHlfdW5pdCA9IHNyY2luZm8tPmRlbnNpdHlfdW5pdDsKLSAgICBkc3RpbmZvLT5YX2RlbnNpdHkgPSBzcmNpbmZvLT5YX2RlbnNpdHk7Ci0gICAgZHN0aW5mby0+WV9kZW5zaXR5ID0gc3JjaW5mby0+WV9kZW5zaXR5OwotICB9Ci19Ci0KLQotLyoKLSAqIE1hc3RlciBzZWxlY3Rpb24gb2YgY29tcHJlc3Npb24gbW9kdWxlcyBmb3IgdHJhbnNjb2RpbmcuCi0gKiBUaGlzIHN1YnN0aXR1dGVzIGZvciBqY2luaXQuYydzIGluaXRpYWxpemF0aW9uIG9mIHRoZSBmdWxsIGNvbXByZXNzb3IuCi0gKi8KLQotTE9DQUwodm9pZCkKLXRyYW5zZW5jb2RlX21hc3Rlcl9zZWxlY3Rpb24gKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJICAgICAganZpcnRfYmFycmF5X3B0ciAqIGNvZWZfYXJyYXlzKQotewotICAvKiBBbHRob3VnaCB3ZSBkb24ndCBhY3R1YWxseSB1c2UgaW5wdXRfY29tcG9uZW50cyBmb3IgdHJhbnNjb2RpbmcsCi0gICAqIGpjbWFzdGVyLmMncyBpbml0aWFsX3NldHVwIHdpbGwgY29tcGxhaW4gaWYgaW5wdXRfY29tcG9uZW50cyBpcyAwLgotICAgKi8KLSAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAxOwotICAvKiBJbml0aWFsaXplIG1hc3RlciBjb250cm9sIChpbmNsdWRlcyBwYXJhbWV0ZXIgY2hlY2tpbmcvcHJvY2Vzc2luZykgKi8KLSAgamluaXRfY19tYXN0ZXJfY29udHJvbChjaW5mbywgVFJVRSAvKiB0cmFuc2NvZGUgb25seSAqLyk7Ci0KLSAgLyogRW50cm9weSBlbmNvZGluZzogZWl0aGVyIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYyBjb2RpbmcuICovCi0gIGlmIChjaW5mby0+YXJpdGhfY29kZSkgewotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQVJJVEhfTk9USU1QTCk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7Ci0jaWZkZWYgQ19QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgICAgIGppbml0X3BodWZmX2VuY29kZXIoY2luZm8pOwotI2Vsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICAgIH0gZWxzZQotICAgICAgamluaXRfaHVmZl9lbmNvZGVyKGNpbmZvKTsKLSAgfQotCi0gIC8qIFdlIG5lZWQgYSBzcGVjaWFsIGNvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sbGVyLiAqLwotICB0cmFuc2VuY29kZV9jb2VmX2NvbnRyb2xsZXIoY2luZm8sIGNvZWZfYXJyYXlzKTsKLQotICBqaW5pdF9tYXJrZXJfd3JpdGVyKGNpbmZvKTsKLQotICAvKiBXZSBjYW4gbm93IHRlbGwgdGhlIG1lbW9yeSBtYW5hZ2VyIHRvIGFsbG9jYXRlIHZpcnR1YWwgYXJyYXlzLiAqLwotICAoKmNpbmZvLT5tZW0tPnJlYWxpemVfdmlydF9hcnJheXMpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0KLSAgLyogV3JpdGUgdGhlIGRhdGFzdHJlYW0gaGVhZGVyIChTT0ksIEpGSUYpIGltbWVkaWF0ZWx5LgotICAgKiBGcmFtZSBhbmQgc2NhbiBoZWFkZXJzIGFyZSBwb3N0cG9uZWQgdGlsbCBsYXRlci4KLSAgICogVGhpcyBsZXRzIGFwcGxpY2F0aW9uIGluc2VydCBzcGVjaWFsIG1hcmtlcnMgYWZ0ZXIgdGhlIFNPSS4KLSAgICovCi0gICgqY2luZm8tPm1hcmtlci0+d3JpdGVfZmlsZV9oZWFkZXIpIChjaW5mbyk7Ci19Ci0KLQotLyoKLSAqIFRoZSByZXN0IG9mIHRoaXMgZmlsZSBpcyBhIHNwZWNpYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvZWZmaWNpZW50Ci0gKiBidWZmZXIgY29udHJvbGxlci4gIFRoaXMgaXMgc2ltaWxhciB0byBqY2NvZWZjdC5jLCBidXQgaXQgaGFuZGxlcyBvbmx5Ci0gKiBvdXRwdXQgZnJvbSBwcmVzdXBwbGllZCB2aXJ0dWFsIGFycmF5cy4gIEZ1cnRoZXJtb3JlLCB3ZSBnZW5lcmF0ZSBhbnkKLSAqIGR1bW15IHBhZGRpbmcgYmxvY2tzIG9uLXRoZS1mbHkgcmF0aGVyIHRoYW4gZXhwZWN0aW5nIHRoZW0gdG8gYmUgcHJlc2VudAotICogaW4gdGhlIGFycmF5cy4KLSAqLwotCi0vKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIEpESU1FTlNJT04gaU1DVV9yb3dfbnVtOwkvKiBpTUNVIHJvdyAjIHdpdGhpbiBpbWFnZSAqLwotICBKRElNRU5TSU9OIG1jdV9jdHI7CQkvKiBjb3VudHMgTUNVcyBwcm9jZXNzZWQgaW4gY3VycmVudCByb3cgKi8KLSAgaW50IE1DVV92ZXJ0X29mZnNldDsJCS8qIGNvdW50cyBNQ1Ugcm93cyB3aXRoaW4gaU1DVSByb3cgKi8KLSAgaW50IE1DVV9yb3dzX3Blcl9pTUNVX3JvdzsJLyogbnVtYmVyIG9mIHN1Y2ggcm93cyBuZWVkZWQgKi8KLQotICAvKiBWaXJ0dWFsIGJsb2NrIGFycmF5IGZvciBlYWNoIGNvbXBvbmVudC4gKi8KLSAganZpcnRfYmFycmF5X3B0ciAqIHdob2xlX2ltYWdlOwotCi0gIC8qIFdvcmtzcGFjZSBmb3IgY29uc3RydWN0aW5nIGR1bW15IGJsb2NrcyBhdCByaWdodC9ib3R0b20gZWRnZXMuICovCi0gIEpCTE9DS1JPVyBkdW1teV9idWZmZXJbQ19NQVhfQkxPQ0tTX0lOX01DVV07Ci19IG15X2NvZWZfY29udHJvbGxlcjsKLQotdHlwZWRlZiBteV9jb2VmX2NvbnRyb2xsZXIgKiBteV9jb2VmX3B0cjsKLQotCi1MT0NBTCh2b2lkKQotc3RhcnRfaU1DVV9yb3cgKGpfY29tcHJlc3NfcHRyIGNpbmZvKQotLyogUmVzZXQgd2l0aGluLWlNQ1Utcm93IGNvdW50ZXJzIGZvciBhIG5ldyByb3cgKi8KLXsKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0KLSAgLyogSW4gYW4gaW50ZXJsZWF2ZWQgc2NhbiwgYW4gTUNVIHJvdyBpcyB0aGUgc2FtZSBhcyBhbiBpTUNVIHJvdy4KLSAgICogSW4gYSBub25pbnRlcmxlYXZlZCBzY2FuLCBhbiBpTUNVIHJvdyBoYXMgdl9zYW1wX2ZhY3RvciBNQ1Ugcm93cy4KLSAgICogQnV0IGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLCBwcm9jZXNzIG9ubHkgd2hhdCdzIGxlZnQuCi0gICAqLwotICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPiAxKSB7Ci0gICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gMTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgKGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MtMSkpCi0gICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+dl9zYW1wX2ZhY3RvcjsKLSAgICBlbHNlCi0gICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+bGFzdF9yb3dfaGVpZ2h0OwotICB9Ci0KLSAgY29lZi0+bWN1X2N0ciA9IDA7Ci0gIGNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IDA7Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGEgcHJvY2Vzc2luZyBwYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzc19jb2VmIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotCi0gIGlmIChwYXNzX21vZGUgIT0gSkJVRl9DUkFOS19ERVNUKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLQotICBjb2VmLT5pTUNVX3Jvd19udW0gPSAwOwotICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7Ci19Ci0KLQotLyoKLSAqIFByb2Nlc3Mgc29tZSBkYXRhLgotICogV2UgcHJvY2VzcyB0aGUgZXF1aXZhbGVudCBvZiBvbmUgZnVsbHkgaW50ZXJsZWF2ZWQgTUNVIHJvdyAoImlNQ1UiIHJvdykKLSAqIHBlciBjYWxsLCBpZSwgdl9zYW1wX2ZhY3RvciBibG9jayByb3dzIGZvciBlYWNoIGNvbXBvbmVudCBpbiB0aGUgc2Nhbi4KLSAqIFRoZSBkYXRhIGlzIG9idGFpbmVkIGZyb20gdGhlIHZpcnR1YWwgYXJyYXlzIGFuZCBmZWQgdG8gdGhlIGVudHJvcHkgY29kZXIuCi0gKiBSZXR1cm5zIFRSVUUgaWYgdGhlIGlNQ1Ugcm93IGlzIGNvbXBsZXRlZCwgRkFMU0UgaWYgc3VzcGVuZGVkLgotICoKLSAqIE5COiBpbnB1dF9idWYgaXMgaWdub3JlZDsgaXQgaXMgbGlrZWx5IHRvIGJlIGEgTlVMTCBwb2ludGVyLgotICovCi0KLU1FVEhPRERFRihib29sZWFuKQotY29tcHJlc3Nfb3V0cHV0IChqX2NvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBpbnB1dF9idWYpCi17Ci0gIG15X2NvZWZfcHRyIGNvZWYgPSAobXlfY29lZl9wdHIpIGNpbmZvLT5jb2VmOwotICBKRElNRU5TSU9OIE1DVV9jb2xfbnVtOwkvKiBpbmRleCBvZiBjdXJyZW50IE1DVSB3aXRoaW4gcm93ICovCi0gIEpESU1FTlNJT04gbGFzdF9NQ1VfY29sID0gY2luZm8tPk1DVXNfcGVyX3JvdyAtIDE7Ci0gIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOwotICBpbnQgYmxrbiwgY2ksIHhpbmRleCwgeWluZGV4LCB5b2Zmc2V0LCBibG9ja2NudDsKLSAgSkRJTUVOU0lPTiBzdGFydF9jb2w7Ci0gIEpCTE9DS0FSUkFZIGJ1ZmZlcltNQVhfQ09NUFNfSU5fU0NBTl07Ci0gIEpCTE9DS1JPVyBNQ1VfYnVmZmVyW0NfTUFYX0JMT0NLU19JTl9NQ1VdOwotICBKQkxPQ0tST1cgYnVmZmVyX3B0cjsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXJzIGZvciB0aGUgY29tcG9uZW50cyB1c2VkIGluIHRoaXMgc2Nhbi4gKi8KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIGJ1ZmZlcltjaV0gPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X2JhcnJheSkKLSAgICAgICgoal9jb21tb25fcHRyKSBjaW5mbywgY29lZi0+d2hvbGVfaW1hZ2VbY29tcHB0ci0+Y29tcG9uZW50X2luZGV4XSwKLSAgICAgICBjb2VmLT5pTUNVX3Jvd19udW0gKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAotICAgICAgIChKRElNRU5TSU9OKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBGQUxTRSk7Ci0gIH0KLQotICAvKiBMb29wIHRvIHByb2Nlc3Mgb25lIHdob2xlIGlNQ1Ugcm93ICovCi0gIGZvciAoeW9mZnNldCA9IGNvZWYtPk1DVV92ZXJ0X29mZnNldDsgeW9mZnNldCA8IGNvZWYtPk1DVV9yb3dzX3Blcl9pTUNVX3JvdzsKLSAgICAgICB5b2Zmc2V0KyspIHsKLSAgICBmb3IgKE1DVV9jb2xfbnVtID0gY29lZi0+bWN1X2N0cjsgTUNVX2NvbF9udW0gPCBjaW5mby0+TUNVc19wZXJfcm93OwotCSBNQ1VfY29sX251bSsrKSB7Ci0gICAgICAvKiBDb25zdHJ1Y3QgbGlzdCBvZiBwb2ludGVycyB0byBEQ1QgYmxvY2tzIGJlbG9uZ2luZyB0byB0aGlzIE1DVSAqLwotICAgICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLwotICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLQljb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotCXN0YXJ0X2NvbCA9IE1DVV9jb2xfbnVtICogY29tcHB0ci0+TUNVX3dpZHRoOwotCWJsb2NrY250ID0gKE1DVV9jb2xfbnVtIDwgbGFzdF9NQ1VfY29sKSA/IGNvbXBwdHItPk1DVV93aWR0aAotCQkJCQkJOiBjb21wcHRyLT5sYXN0X2NvbF93aWR0aDsKLQlmb3IgKHlpbmRleCA9IDA7IHlpbmRleCA8IGNvbXBwdHItPk1DVV9oZWlnaHQ7IHlpbmRleCsrKSB7Ci0JICBpZiAoY29lZi0+aU1DVV9yb3dfbnVtIDwgbGFzdF9pTUNVX3JvdyB8fAotCSAgICAgIHlpbmRleCt5b2Zmc2V0IDwgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0KSB7Ci0JICAgIC8qIEZpbGwgaW4gcG9pbnRlcnMgdG8gcmVhbCBibG9ja3MgaW4gdGhpcyByb3cgKi8KLQkgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcltjaV1beWluZGV4K3lvZmZzZXRdICsgc3RhcnRfY29sOwotCSAgICBmb3IgKHhpbmRleCA9IDA7IHhpbmRleCA8IGJsb2NrY250OyB4aW5kZXgrKykKLQkgICAgICBNQ1VfYnVmZmVyW2Jsa24rK10gPSBidWZmZXJfcHRyKys7Ci0JICB9IGVsc2UgewotCSAgICAvKiBBdCBib3R0b20gb2YgaW1hZ2UsIG5lZWQgYSB3aG9sZSByb3cgb2YgZHVtbXkgYmxvY2tzICovCi0JICAgIHhpbmRleCA9IDA7Ci0JICB9Ci0JICAvKiBGaWxsIGluIGFueSBkdW1teSBibG9ja3MgbmVlZGVkIGluIHRoaXMgcm93LgotCSAgICogRHVtbXkgYmxvY2tzIGFyZSBmaWxsZWQgaW4gdGhlIHNhbWUgd2F5IGFzIGluIGpjY29lZmN0LmM6Ci0JICAgKiBhbGwgemVyb2VzIGluIHRoZSBBQyBlbnRyaWVzLCBEQyBlbnRyaWVzIGVxdWFsIHRvIHByZXZpb3VzCi0JICAgKiBibG9jaydzIERDIHZhbHVlLiAgVGhlIGluaXQgcm91dGluZSBoYXMgYWxyZWFkeSB6ZXJvZWQgdGhlCi0JICAgKiBBQyBlbnRyaWVzLCBzbyB3ZSBuZWVkIG9ubHkgc2V0IHRoZSBEQyBlbnRyaWVzIGNvcnJlY3RseS4KLQkgICAqLwotCSAgZm9yICg7IHhpbmRleCA8IGNvbXBwdHItPk1DVV93aWR0aDsgeGluZGV4KyspIHsKLQkgICAgTUNVX2J1ZmZlcltibGtuXSA9IGNvZWYtPmR1bW15X2J1ZmZlcltibGtuXTsKLQkgICAgTUNVX2J1ZmZlcltibGtuXVswXVswXSA9IE1DVV9idWZmZXJbYmxrbi0xXVswXVswXTsKLQkgICAgYmxrbisrOwotCSAgfQotCX0KLSAgICAgIH0KLSAgICAgIC8qIFRyeSB0byB3cml0ZSB0aGUgTUNVLiAqLwotICAgICAgaWYgKCEgKCpjaW5mby0+ZW50cm9weS0+ZW5jb2RlX21jdSkgKGNpbmZvLCBNQ1VfYnVmZmVyKSkgewotCS8qIFN1c3BlbnNpb24gZm9yY2VkOyB1cGRhdGUgc3RhdGUgY291bnRlcnMgYW5kIGV4aXQgKi8KLQljb2VmLT5NQ1VfdmVydF9vZmZzZXQgPSB5b2Zmc2V0OwotCWNvZWYtPm1jdV9jdHIgPSBNQ1VfY29sX251bTsKLQlyZXR1cm4gRkFMU0U7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIENvbXBsZXRlZCBhbiBNQ1Ugcm93LCBidXQgcGVyaGFwcyBub3QgYW4gaU1DVSByb3cgKi8KLSAgICBjb2VmLT5tY3VfY3RyID0gMDsKLSAgfQotICAvKiBDb21wbGV0ZWQgdGhlIGlNQ1Ugcm93LCBhZHZhbmNlIGNvdW50ZXJzIGZvciBuZXh0IG9uZSAqLwotICBjb2VmLT5pTUNVX3Jvd19udW0rKzsKLSAgc3RhcnRfaU1DVV9yb3coY2luZm8pOwotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSBjb2VmZmljaWVudCBidWZmZXIgY29udHJvbGxlci4KLSAqCi0gKiBFYWNoIHBhc3NlZCBjb2VmZmljaWVudCBhcnJheSBtdXN0IGJlIHRoZSByaWdodCBzaXplIGZvciB0aGF0Ci0gKiBjb2VmZmljaWVudDogd2lkdGhfaW5fYmxvY2tzIHdpZGUgYW5kIGhlaWdodF9pbl9ibG9ja3MgaGlnaCwKLSAqIHdpdGggdW5pdGhlaWdodCBhdCBsZWFzdCB2X3NhbXBfZmFjdG9yLgotICovCi0KLUxPQ0FMKHZvaWQpCi10cmFuc2VuY29kZV9jb2VmX2NvbnRyb2xsZXIgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJICAgICBqdmlydF9iYXJyYXlfcHRyICogY29lZl9hcnJheXMpCi17Ci0gIG15X2NvZWZfcHRyIGNvZWY7Ci0gIEpCTE9DS1JPVyBidWZmZXI7Ci0gIGludCBpOwotCi0gIGNvZWYgPSAobXlfY29lZl9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfY29lZl9jb250cm9sbGVyKSk7Ci0gIGNpbmZvLT5jb2VmID0gKHN0cnVjdCBqcGVnX2NfY29lZl9jb250cm9sbGVyICopIGNvZWY7Ci0gIGNvZWYtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19jb2VmOwotICBjb2VmLT5wdWIuY29tcHJlc3NfZGF0YSA9IGNvbXByZXNzX291dHB1dDsKLQotICAvKiBTYXZlIHBvaW50ZXIgdG8gdmlydHVhbCBhcnJheXMgKi8KLSAgY29lZi0+d2hvbGVfaW1hZ2UgPSBjb2VmX2FycmF5czsKLQotICAvKiBBbGxvY2F0ZSBhbmQgcHJlLXplcm8gc3BhY2UgZm9yIGR1bW15IERDVCBibG9ja3MuICovCi0gIGJ1ZmZlciA9IChKQkxPQ0tST1cpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlDX01BWF9CTE9DS1NfSU5fTUNVICogU0laRU9GKEpCTE9DSykpOwotICBqemVyb19mYXIoKHZvaWQgRkFSICopIGJ1ZmZlciwgQ19NQVhfQkxPQ0tTX0lOX01DVSAqIFNJWkVPRihKQkxPQ0spKTsKLSAgZm9yIChpID0gMDsgaSA8IENfTUFYX0JMT0NLU19JTl9NQ1U7IGkrKykgewotICAgIGNvZWYtPmR1bW15X2J1ZmZlcltpXSA9IGJ1ZmZlciArIGk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZGFwaW1pbi5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkYXBpbWluLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZGI1OWYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkYXBpbWluLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTUgKzAsMCBAQAotLyoKLSAqIGpkYXBpbWluLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgY29kZSBmb3IgdGhlIGRlY29tcHJlc3Npb24gaGFsZgotICogb2YgdGhlIEpQRUcgbGlicmFyeS4gIFRoZXNlIGFyZSB0aGUgIm1pbmltdW0iIEFQSSByb3V0aW5lcyB0aGF0IG1heSBiZQotICogbmVlZGVkIGluIGVpdGhlciB0aGUgbm9ybWFsIGZ1bGwtZGVjb21wcmVzc2lvbiBjYXNlIG9yIHRoZQotICogdHJhbnNjb2Rpbmctb25seSBjYXNlLgotICoKLSAqIE1vc3Qgb2YgdGhlIHJvdXRpbmVzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBkaXJlY3RseSBieSBhbiBhcHBsaWNhdGlvbgotICogYXJlIGluIHRoaXMgZmlsZSBvciBpbiBqZGFwaXN0ZC5jLiAgQnV0IGFsc28gc2VlIGpjb21hcGkuYyBmb3Igcm91dGluZXMKLSAqIHNoYXJlZCBieSBjb21wcmVzc2lvbiBhbmQgZGVjb21wcmVzc2lvbiwgYW5kIGpkdHJhbnMuYyBmb3IgdGhlIHRyYW5zY29kaW5nCi0gKiBjYXNlLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKgotICogSW5pdGlhbGl6YXRpb24gb2YgYSBKUEVHIGRlY29tcHJlc3Npb24gb2JqZWN0LgotICogVGhlIGVycm9yIG1hbmFnZXIgbXVzdCBhbHJlYWR5IGJlIHNldCB1cCAoaW4gY2FzZSBtZW1vcnkgbWFuYWdlciBmYWlscykuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX0NyZWF0ZURlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGludCB2ZXJzaW9uLCBzaXplX3Qgc3RydWN0c2l6ZSkKLXsKLSAgaW50IGk7Ci0KLSAgLyogR3VhcmQgYWdhaW5zdCB2ZXJzaW9uIG1pc21hdGNoZXMgYmV0d2VlbiBsaWJyYXJ5IGFuZCBjYWxsZXIuICovCi0gIGNpbmZvLT5tZW0gPSBOVUxMOwkJLyogc28ganBlZ19kZXN0cm95IGtub3dzIG1lbSBtZ3Igbm90IGNhbGxlZCAqLwotICBpZiAodmVyc2lvbiAhPSBKUEVHX0xJQl9WRVJTSU9OKQotICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0JBRF9MSUJfVkVSU0lPTiwgSlBFR19MSUJfVkVSU0lPTiwgdmVyc2lvbik7Ci0gIGlmIChzdHJ1Y3RzaXplICE9IFNJWkVPRihzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCkpCi0gICAgRVJSRVhJVDIoY2luZm8sIEpFUlJfQkFEX1NUUlVDVF9TSVpFLCAKLQkgICAgIChpbnQpIFNJWkVPRihzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCksIChpbnQpIHN0cnVjdHNpemUpOwotCi0gIC8qIEZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHdlIHplcm8gdGhlIHdob2xlIG1hc3RlciBzdHJ1Y3R1cmUuCi0gICAqIEJ1dCB0aGUgYXBwbGljYXRpb24gaGFzIGFscmVhZHkgc2V0IHRoZSBlcnIgcG9pbnRlciwgYW5kIG1heSBoYXZlIHNldAotICAgKiBjbGllbnRfZGF0YSwgc28gd2UgaGF2ZSB0byBzYXZlIGFuZCByZXN0b3JlIHRob3NlIGZpZWxkcy4KLSAgICogTm90ZTogaWYgYXBwbGljYXRpb24gaGFzbid0IHNldCBjbGllbnRfZGF0YSwgdG9vbHMgbGlrZSBQdXJpZnkgbWF5Ci0gICAqIGNvbXBsYWluIGhlcmUuCi0gICAqLwotICB7Ci0gICAgc3RydWN0IGpwZWdfZXJyb3JfbWdyICogZXJyID0gY2luZm8tPmVycjsKLSAgICB2b2lkICogY2xpZW50X2RhdGEgPSBjaW5mby0+Y2xpZW50X2RhdGE7IC8qIGlnbm9yZSBQdXJpZnkgY29tcGxhaW50IGhlcmUgKi8KLSAgICBNRU1aRVJPKGNpbmZvLCBTSVpFT0Yoc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QpKTsKLSAgICBjaW5mby0+ZXJyID0gZXJyOwotICAgIGNpbmZvLT5jbGllbnRfZGF0YSA9IGNsaWVudF9kYXRhOwotICB9Ci0gIGNpbmZvLT5pc19kZWNvbXByZXNzb3IgPSBUUlVFOwotCi0gIC8qIEluaXRpYWxpemUgYSBtZW1vcnkgbWFuYWdlciBpbnN0YW5jZSBmb3IgdGhpcyBvYmplY3QgKi8KLSAgamluaXRfbWVtb3J5X21ncigoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0KLSAgLyogWmVybyBvdXQgcG9pbnRlcnMgdG8gcGVybWFuZW50IHN0cnVjdHVyZXMuICovCi0gIGNpbmZvLT5wcm9ncmVzcyA9IE5VTEw7Ci0gIGNpbmZvLT5zcmMgPSBOVUxMOwotCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fUVVBTlRfVEJMUzsgaSsrKQotICAgIGNpbmZvLT5xdWFudF90YmxfcHRyc1tpXSA9IE5VTEw7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9IVUZGX1RCTFM7IGkrKykgewotICAgIGNpbmZvLT5kY19odWZmX3RibF9wdHJzW2ldID0gTlVMTDsKLSAgICBjaW5mby0+YWNfaHVmZl90YmxfcHRyc1tpXSA9IE5VTEw7Ci0gIH0KLQotICAvKiBJbml0aWFsaXplIG1hcmtlciBwcm9jZXNzb3Igc28gYXBwbGljYXRpb24gY2FuIG92ZXJyaWRlIG1ldGhvZHMKLSAgICogZm9yIENPTSwgQVBQbiBtYXJrZXJzIGJlZm9yZSBjYWxsaW5nIGpwZWdfcmVhZF9oZWFkZXIuCi0gICAqLwotICBjaW5mby0+bWFya2VyX2xpc3QgPSBOVUxMOwotICBqaW5pdF9tYXJrZXJfcmVhZGVyKGNpbmZvKTsKLQotICAvKiBBbmQgaW5pdGlhbGl6ZSB0aGUgb3ZlcmFsbCBpbnB1dCBjb250cm9sbGVyLiAqLwotICBqaW5pdF9pbnB1dF9jb250cm9sbGVyKGNpbmZvKTsKLQotICAvKiBPSywgSSdtIHJlYWR5ICovCi0gIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfU1RBUlQ7Ci19Ci0KLQotLyoKLSAqIERlc3RydWN0aW9uIG9mIGEgSlBFRyBkZWNvbXByZXNzaW9uIG9iamVjdAotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19kZXN0cm95X2RlY29tcHJlc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGpwZWdfZGVzdHJveSgoal9jb21tb25fcHRyKSBjaW5mbyk7IC8qIHVzZSBjb21tb24gcm91dGluZSAqLwotfQotCi0KLS8qCi0gKiBBYm9ydCBwcm9jZXNzaW5nIG9mIGEgSlBFRyBkZWNvbXByZXNzaW9uIG9wZXJhdGlvbiwKLSAqIGJ1dCBkb24ndCBkZXN0cm95IHRoZSBvYmplY3QgaXRzZWxmLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19hYm9ydF9kZWNvbXByZXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBqcGVnX2Fib3J0KChqX2NvbW1vbl9wdHIpIGNpbmZvKTsgLyogdXNlIGNvbW1vbiByb3V0aW5lICovCi19Ci0KLQotLyoKLSAqIFNldCBkZWZhdWx0IGRlY29tcHJlc3Npb24gcGFyYW1ldGVycy4KLSAqLwotCi1MT0NBTCh2b2lkKQotZGVmYXVsdF9kZWNvbXByZXNzX3Bhcm1zIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICAvKiBHdWVzcyB0aGUgaW5wdXQgY29sb3JzcGFjZSwgYW5kIHNldCBvdXRwdXQgY29sb3JzcGFjZSBhY2NvcmRpbmdseS4gKi8KLSAgLyogKFdpc2ggSlBFRyBjb21taXR0ZWUgaGFkIHByb3ZpZGVkIGEgcmVhbCB3YXkgdG8gc3BlY2lmeSB0aGlzLi4uKSAqLwotICAvKiBOb3RlIGFwcGxpY2F0aW9uIG1heSBvdmVycmlkZSBvdXIgZ3Vlc3Nlcy4gKi8KLSAgc3dpdGNoIChjaW5mby0+bnVtX2NvbXBvbmVudHMpIHsKLSAgY2FzZSAxOgotICAgIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKLSAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKLSAgICBicmVhazsKLSAgICAKLSAgY2FzZSAzOgotICAgIGlmIChjaW5mby0+c2F3X0pGSUZfbWFya2VyKSB7Ci0gICAgICBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ2JDcjsgLyogSkZJRiBpbXBsaWVzIFlDYkNyICovCi0gICAgfSBlbHNlIGlmIChjaW5mby0+c2F3X0Fkb2JlX21hcmtlcikgewotICAgICAgc3dpdGNoIChjaW5mby0+QWRvYmVfdHJhbnNmb3JtKSB7Ci0gICAgICBjYXNlIDA6Ci0JY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOwotCWJyZWFrOwotICAgICAgY2FzZSAxOgotCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlXQVJOTVMxKGNpbmZvLCBKV1JOX0FET0JFX1hGT1JNLCBjaW5mby0+QWRvYmVfdHJhbnNmb3JtKTsKLQljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ2JDcjsgLyogYXNzdW1lIGl0J3MgWUNiQ3IgKi8KLQlicmVhazsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLyogU2F3IG5vIHNwZWNpYWwgbWFya2VycywgdHJ5IHRvIGd1ZXNzIGZyb20gdGhlIGNvbXBvbmVudCBJRHMgKi8KLSAgICAgIGludCBjaWQwID0gY2luZm8tPmNvbXBfaW5mb1swXS5jb21wb25lbnRfaWQ7Ci0gICAgICBpbnQgY2lkMSA9IGNpbmZvLT5jb21wX2luZm9bMV0uY29tcG9uZW50X2lkOwotICAgICAgaW50IGNpZDIgPSBjaW5mby0+Y29tcF9pbmZvWzJdLmNvbXBvbmVudF9pZDsKLQotICAgICAgaWYgKGNpZDAgPT0gMSAmJiBjaWQxID09IDIgJiYgY2lkMiA9PSAzKQotCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOyAvKiBhc3N1bWUgSkZJRiB3L291dCBtYXJrZXIgKi8KLSAgICAgIGVsc2UgaWYgKGNpZDAgPT0gODIgJiYgY2lkMSA9PSA3MSAmJiBjaWQyID09IDY2KQotCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1JHQjsgLyogQVNDSUkgJ1InLCAnRycsICdCJyAqLwotICAgICAgZWxzZSB7Ci0JVFJBQ0VNUzMoY2luZm8sIDEsIEpUUkNfVU5LTk9XTl9JRFMsIGNpZDAsIGNpZDEsIGNpZDIpOwotCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOyAvKiBhc3N1bWUgaXQncyBZQ2JDciAqLwotICAgICAgfQotICAgIH0KLSAgICAvKiBBbHdheXMgZ3Vlc3MgUkdCIGlzIHByb3BlciBvdXRwdXQgY29sb3JzcGFjZS4gKi8KLSAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX1JHQjsKLSAgICBicmVhazsKLSAgICAKLSAgY2FzZSA0OgotICAgIGlmIChjaW5mby0+c2F3X0Fkb2JlX21hcmtlcikgewotICAgICAgc3dpdGNoIChjaW5mby0+QWRvYmVfdHJhbnNmb3JtKSB7Ci0gICAgICBjYXNlIDA6Ci0JY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfQ01ZSzsKLQlicmVhazsKLSAgICAgIGNhc2UgMjoKLQljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ0NLOwotCWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlXQVJOTVMxKGNpbmZvLCBKV1JOX0FET0JFX1hGT1JNLCBjaW5mby0+QWRvYmVfdHJhbnNmb3JtKTsKLQljaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19ZQ0NLOyAvKiBhc3N1bWUgaXQncyBZQ0NLICovCi0JYnJlYWs7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIE5vIHNwZWNpYWwgbWFya2VycywgYXNzdW1lIHN0cmFpZ2h0IENNWUsuICovCi0gICAgICBjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9IEpDU19DTVlLOwotICAgIH0KLSAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX0NNWUs7Ci0gICAgYnJlYWs7Ci0gICAgCi0gIGRlZmF1bHQ6Ci0gICAgY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPSBKQ1NfVU5LTk9XTjsKLSAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX1VOS05PV047Ci0gICAgYnJlYWs7Ci0gIH0KLQotICAvKiBTZXQgZGVmYXVsdHMgZm9yIG90aGVyIGRlY29tcHJlc3Npb24gcGFyYW1ldGVycy4gKi8KLSAgY2luZm8tPnNjYWxlX251bSA9IDE7CQkvKiAxOjEgc2NhbGluZyAqLwotICBjaW5mby0+c2NhbGVfZGVub20gPSAxOwotICBjaW5mby0+b3V0cHV0X2dhbW1hID0gMS4wOwotICBjaW5mby0+YnVmZmVyZWRfaW1hZ2UgPSBGQUxTRTsKLSAgY2luZm8tPnJhd19kYXRhX291dCA9IEZBTFNFOwotICBjaW5mby0+ZGN0X21ldGhvZCA9IEpEQ1RfREVGQVVMVDsKLSAgY2luZm8tPmRvX2ZhbmN5X3Vwc2FtcGxpbmcgPSBUUlVFOwotICBjaW5mby0+ZG9fYmxvY2tfc21vb3RoaW5nID0gVFJVRTsKLSAgY2luZm8tPnF1YW50aXplX2NvbG9ycyA9IEZBTFNFOwotICAvKiBXZSBzZXQgdGhlc2UgaW4gY2FzZSBhcHBsaWNhdGlvbiBvbmx5IHNldHMgcXVhbnRpemVfY29sb3JzLiAqLwotICBjaW5mby0+ZGl0aGVyX21vZGUgPSBKRElUSEVSX0ZTOwotI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAotICBjaW5mby0+dHdvX3Bhc3NfcXVhbnRpemUgPSBUUlVFOwotI2Vsc2UKLSAgY2luZm8tPnR3b19wYXNzX3F1YW50aXplID0gRkFMU0U7Ci0jZW5kaWYKLSAgY2luZm8tPmRlc2lyZWRfbnVtYmVyX29mX2NvbG9ycyA9IDI1NjsKLSAgY2luZm8tPmNvbG9ybWFwID0gTlVMTDsKLSAgLyogSW5pdGlhbGl6ZSBmb3Igbm8gbW9kZSBjaGFuZ2UgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZS4gKi8KLSAgY2luZm8tPmVuYWJsZV8xcGFzc19xdWFudCA9IEZBTFNFOwotICBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50ID0gRkFMU0U7Ci0gIGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQgPSBGQUxTRTsKLX0KLQotCi0vKgotICogRGVjb21wcmVzc2lvbiBzdGFydHVwOiByZWFkIHN0YXJ0IG9mIEpQRUcgZGF0YXN0cmVhbSB0byBzZWUgd2hhdCdzIHRoZXJlLgotICogTmVlZCBvbmx5IGluaXRpYWxpemUgSlBFRyBvYmplY3QgYW5kIHN1cHBseSBhIGRhdGEgc291cmNlIGJlZm9yZSBjYWxsaW5nLgotICoKLSAqIFRoaXMgcm91dGluZSB3aWxsIHJlYWQgYXMgZmFyIGFzIHRoZSBmaXJzdCBTT1MgbWFya2VyIChpZSwgYWN0dWFsIHN0YXJ0IG9mCi0gKiBjb21wcmVzc2VkIGRhdGEpLCBhbmQgd2lsbCBzYXZlIGFsbCB0YWJsZXMgYW5kIHBhcmFtZXRlcnMgaW4gdGhlIEpQRUcKLSAqIG9iamVjdC4gIEl0IHdpbGwgYWxzbyBpbml0aWFsaXplIHRoZSBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMgdG8gZGVmYXVsdAotICogdmFsdWVzLCBhbmQgZmluYWxseSByZXR1cm4gSlBFR19IRUFERVJfT0suICBPbiByZXR1cm4sIHRoZSBhcHBsaWNhdGlvbiBtYXkKLSAqIGFkanVzdCB0aGUgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGFuZCB0aGVuIGNhbGwganBlZ19zdGFydF9kZWNvbXByZXNzLgotICogKE9yLCBpZiB0aGUgYXBwbGljYXRpb24gb25seSB3YW50ZWQgdG8gZGV0ZXJtaW5lIHRoZSBpbWFnZSBwYXJhbWV0ZXJzLAotICogdGhlIGRhdGEgbmVlZCBub3QgYmUgZGVjb21wcmVzc2VkLiAgSW4gdGhhdCBjYXNlLCBjYWxsIGpwZWdfYWJvcnQgb3IKLSAqIGpwZWdfZGVzdHJveSB0byByZWxlYXNlIGFueSB0ZW1wb3Jhcnkgc3BhY2UuKQotICogSWYgYW4gYWJicmV2aWF0ZWQgKHRhYmxlcyBvbmx5KSBkYXRhc3RyZWFtIGlzIHByZXNlbnRlZCwgdGhlIHJvdXRpbmUgd2lsbAotICogcmV0dXJuIEpQRUdfSEVBREVSX1RBQkxFU19PTkxZIHVwb24gcmVhY2hpbmcgRU9JLiAgVGhlIGFwcGxpY2F0aW9uIG1heSB0aGVuCi0gKiByZS11c2UgdGhlIEpQRUcgb2JqZWN0IHRvIHJlYWQgdGhlIGFiYnJldmlhdGVkIGltYWdlIGRhdGFzdHJlYW0ocykuCi0gKiBJdCBpcyB1bm5lY2Vzc2FyeSAoYnV0IE9LKSB0byBjYWxsIGpwZWdfYWJvcnQgaW4gdGhpcyBjYXNlLgotICogVGhlIEpQRUdfU1VTUEVOREVEIHJldHVybiBjb2RlIG9ubHkgb2NjdXJzIGlmIHRoZSBkYXRhIHNvdXJjZSBtb2R1bGUKLSAqIHJlcXVlc3RzIHN1c3BlbnNpb24gb2YgdGhlIGRlY29tcHJlc3Nvci4gIEluIHRoaXMgY2FzZSB0aGUgYXBwbGljYXRpb24KLSAqIHNob3VsZCBsb2FkIG1vcmUgc291cmNlIGRhdGEgYW5kIHRoZW4gcmUtY2FsbCBqcGVnX3JlYWRfaGVhZGVyIHRvIHJlc3VtZQotICogcHJvY2Vzc2luZy4KLSAqIElmIGEgbm9uLXN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgaXMgdXNlZCBhbmQgcmVxdWlyZV9pbWFnZSBpcyBUUlVFLCB0aGVuIHRoZQotICogcmV0dXJuIGNvZGUgbmVlZCBub3QgYmUgaW5zcGVjdGVkIHNpbmNlIG9ubHkgSlBFR19IRUFERVJfT0sgaXMgcG9zc2libGUuCi0gKgotICogVGhpcyByb3V0aW5lIGlzIG5vdyBqdXN0IGEgZnJvbnQgZW5kIHRvIGpwZWdfY29uc3VtZV9pbnB1dCwgd2l0aCBzb21lCi0gKiBleHRyYSBlcnJvciBjaGVja2luZy4KLSAqLwotCi1HTE9CQUwoaW50KQotanBlZ19yZWFkX2hlYWRlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiByZXF1aXJlX2ltYWdlKQotewotICBpbnQgcmV0Y29kZTsKLQotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfU1RBUlQgJiYKLSAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX0lOSEVBREVSKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0KLSAgcmV0Y29kZSA9IGpwZWdfY29uc3VtZV9pbnB1dChjaW5mbyk7Ci0KLSAgc3dpdGNoIChyZXRjb2RlKSB7Ci0gIGNhc2UgSlBFR19SRUFDSEVEX1NPUzoKLSAgICByZXRjb2RlID0gSlBFR19IRUFERVJfT0s7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSlBFR19SRUFDSEVEX0VPSToKLSAgICBpZiAocmVxdWlyZV9pbWFnZSkJCS8qIENvbXBsYWluIGlmIGFwcGxpY2F0aW9uIHdhbnRlZCBhbiBpbWFnZSAqLwotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT19JTUFHRSk7Ci0gICAgLyogUmVzZXQgdG8gc3RhcnQgc3RhdGU7IGl0IHdvdWxkIGJlIHNhZmVyIHRvIHJlcXVpcmUgdGhlIGFwcGxpY2F0aW9uIHRvCi0gICAgICogY2FsbCBqcGVnX2Fib3J0LCBidXQgd2UgY2FuJ3QgY2hhbmdlIGl0IG5vdyBmb3IgY29tcGF0aWJpbGl0eSByZWFzb25zLgotICAgICAqIEEgc2lkZSBlZmZlY3QgaXMgdG8gZnJlZSBhbnkgdGVtcG9yYXJ5IG1lbW9yeSAodGhlcmUgc2hvdWxkbid0IGJlIGFueSkuCi0gICAgICovCi0gICAganBlZ19hYm9ydCgoal9jb21tb25fcHRyKSBjaW5mbyk7IC8qIHNldHMgc3RhdGUgPSBEU1RBVEVfU1RBUlQgKi8KLSAgICByZXRjb2RlID0gSlBFR19IRUFERVJfVEFCTEVTX09OTFk7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSlBFR19TVVNQRU5ERUQ6Ci0gICAgLyogbm8gd29yayAqLwotICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIHJldGNvZGU7Ci19Ci0KLQotLyoKLSAqIENvbnN1bWUgZGF0YSBpbiBhZHZhbmNlIG9mIHdoYXQgdGhlIGRlY29tcHJlc3NvciByZXF1aXJlcy4KLSAqIFRoaXMgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSBvbmNlIHRoZSBkZWNvbXByZXNzb3Igb2JqZWN0IGhhcwotICogYmVlbiBjcmVhdGVkIGFuZCBhIGRhdGEgc291cmNlIGhhcyBiZWVuIHNldCB1cC4KLSAqCi0gKiBUaGlzIHJvdXRpbmUgaXMgZXNzZW50aWFsbHkgYSBzdGF0ZSBtYWNoaW5lIHRoYXQgaGFuZGxlcyBhIGNvdXBsZQotICogb2YgY3JpdGljYWwgc3RhdGUtdHJhbnNpdGlvbiBhY3Rpb25zLCBuYW1lbHkgaW5pdGlhbCBzZXR1cCBhbmQKLSAqIHRyYW5zaXRpb24gZnJvbSBoZWFkZXIgc2Nhbm5pbmcgdG8gcmVhZHktZm9yLXN0YXJ0X2RlY29tcHJlc3MuCi0gKiBBbGwgdGhlIGFjdHVhbCBpbnB1dCBpcyBkb25lIHZpYSB0aGUgaW5wdXQgY29udHJvbGxlcidzIGNvbnN1bWVfaW5wdXQKLSAqIG1ldGhvZC4KLSAqLwotCi1HTE9CQUwoaW50KQotanBlZ19jb25zdW1lX2lucHV0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBpbnQgcmV0Y29kZSA9IEpQRUdfU1VTUEVOREVEOwotCi0gIC8qIE5COiBldmVyeSBwb3NzaWJsZSBEU1RBVEUgdmFsdWUgc2hvdWxkIGJlIGxpc3RlZCBpbiB0aGlzIHN3aXRjaCAqLwotICBzd2l0Y2ggKGNpbmZvLT5nbG9iYWxfc3RhdGUpIHsKLSAgY2FzZSBEU1RBVEVfU1RBUlQ6Ci0gICAgLyogU3RhcnQtb2YtZGF0YXN0cmVhbSBhY3Rpb25zOiByZXNldCBhcHByb3ByaWF0ZSBtb2R1bGVzICovCi0gICAgKCpjaW5mby0+aW5wdXRjdGwtPnJlc2V0X2lucHV0X2NvbnRyb2xsZXIpIChjaW5mbyk7Ci0gICAgLyogSW5pdGlhbGl6ZSBhcHBsaWNhdGlvbidzIGRhdGEgc291cmNlIG1vZHVsZSAqLwotICAgICgqY2luZm8tPnNyYy0+aW5pdF9zb3VyY2UpIChjaW5mbyk7Ci0gICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9JTkhFQURFUjsKLSAgICAvKkZBTExUSFJPVUdIKi8KLSAgY2FzZSBEU1RBVEVfSU5IRUFERVI6Ci0gICAgcmV0Y29kZSA9ICgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KSAoY2luZm8pOwotICAgIGlmIChyZXRjb2RlID09IEpQRUdfUkVBQ0hFRF9TT1MpIHsgLyogRm91bmQgU09TLCBwcmVwYXJlIHRvIGRlY29tcHJlc3MgKi8KLSAgICAgIC8qIFNldCB1cCBkZWZhdWx0IHBhcmFtZXRlcnMgYmFzZWQgb24gaGVhZGVyIGRhdGEgKi8KLSAgICAgIGRlZmF1bHRfZGVjb21wcmVzc19wYXJtcyhjaW5mbyk7Ci0gICAgICAvKiBTZXQgZ2xvYmFsIHN0YXRlOiByZWFkeSBmb3Igc3RhcnRfZGVjb21wcmVzcyAqLwotICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9SRUFEWTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgRFNUQVRFX1JFQURZOgotICAgIC8qIENhbid0IGFkdmFuY2UgcGFzdCBmaXJzdCBTT1MgdW50aWwgc3RhcnRfZGVjb21wcmVzcyBpcyBjYWxsZWQgKi8KLSAgICByZXRjb2RlID0gSlBFR19SRUFDSEVEX1NPUzsKLSAgICBicmVhazsKLSAgY2FzZSBEU1RBVEVfUFJFTE9BRDoKLSAgY2FzZSBEU1RBVEVfUFJFU0NBTjoKLSAgY2FzZSBEU1RBVEVfU0NBTk5JTkc6Ci0gIGNhc2UgRFNUQVRFX1JBV19PSzoKLSAgY2FzZSBEU1RBVEVfQlVGSU1BR0U6Ci0gIGNhc2UgRFNUQVRFX0JVRlBPU1Q6Ci0gIGNhc2UgRFNUQVRFX1NUT1BQSU5HOgotICAgIHJldGNvZGUgPSAoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkgKGNpbmZvKTsKLSAgICBicmVhazsKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotICB9Ci0gIHJldHVybiByZXRjb2RlOwotfQotCi0KLS8qCi0gKiBIYXZlIHdlIGZpbmlzaGVkIHJlYWRpbmcgdGhlIGlucHV0IGZpbGU/Ci0gKi8KLQotR0xPQkFMKGJvb2xlYW4pCi1qcGVnX2lucHV0X2NvbXBsZXRlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICAvKiBDaGVjayBmb3IgdmFsaWQganBlZyBvYmplY3QgKi8KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPCBEU1RBVEVfU1RBUlQgfHwKLSAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPiBEU1RBVEVfU1RPUFBJTkcpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLSAgcmV0dXJuIGNpbmZvLT5pbnB1dGN0bC0+ZW9pX3JlYWNoZWQ7Ci19Ci0KLQotLyoKLSAqIElzIHRoZXJlIG1vcmUgdGhhbiBvbmUgc2Nhbj8KLSAqLwotCi1HTE9CQUwoYm9vbGVhbikKLWpwZWdfaGFzX211bHRpcGxlX3NjYW5zIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICAvKiBPbmx5IHZhbGlkIGFmdGVyIGpwZWdfcmVhZF9oZWFkZXIgY29tcGxldGVzICovCi0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlIDwgRFNUQVRFX1JFQURZIHx8Ci0gICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID4gRFNUQVRFX1NUT1BQSU5HKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIHJldHVybiBjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FuczsKLX0KLQotCi0vKgotICogRmluaXNoIEpQRUcgZGVjb21wcmVzc2lvbi4KLSAqCi0gKiBUaGlzIHdpbGwgbm9ybWFsbHkganVzdCB2ZXJpZnkgdGhlIGZpbGUgdHJhaWxlciBhbmQgcmVsZWFzZSB0ZW1wIHN0b3JhZ2UuCi0gKgotICogUmV0dXJucyBGQUxTRSBpZiBzdXNwZW5kZWQuICBUaGUgcmV0dXJuIHZhbHVlIG5lZWQgYmUgaW5zcGVjdGVkIG9ubHkgaWYKLSAqIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBpcyB1c2VkLgotICovCi0KLUdMT0JBTChib29sZWFuKQotanBlZ19maW5pc2hfZGVjb21wcmVzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaWYgKChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9TQ0FOTklORyB8fAotICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JBV19PSykgJiYgISBjaW5mby0+YnVmZmVyZWRfaW1hZ2UpIHsKLSAgICAvKiBUZXJtaW5hdGUgZmluYWwgcGFzcyBvZiBub24tYnVmZmVyZWQgbW9kZSAqLwotICAgIGlmIChjaW5mby0+b3V0cHV0X3NjYW5saW5lIDwgY2luZm8tPm91dHB1dF9oZWlnaHQpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1RPT19MSVRUTEVfREFUQSk7Ci0gICAgKCpjaW5mby0+bWFzdGVyLT5maW5pc2hfb3V0cHV0X3Bhc3MpIChjaW5mbyk7Ci0gICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9TVE9QUElORzsKLSAgfSBlbHNlIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9CVUZJTUFHRSkgewotICAgIC8qIEZpbmlzaGluZyBhZnRlciBhIGJ1ZmZlcmVkLWltYWdlIG9wZXJhdGlvbiAqLwotICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfU1RPUFBJTkc7Ci0gIH0gZWxzZSBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfU1RPUFBJTkcpIHsKLSAgICAvKiBTVE9QUElORyA9IHJlcGVhdCBjYWxsIGFmdGVyIGEgc3VzcGVuc2lvbiwgYW55dGhpbmcgZWxzZSBpcyBlcnJvciAqLwotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIH0KLSAgLyogUmVhZCB1bnRpbCBFT0kgKi8KLSAgd2hpbGUgKCEgY2luZm8tPmlucHV0Y3RsLT5lb2lfcmVhY2hlZCkgewotICAgIGlmICgoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkgKGNpbmZvKSA9PSBKUEVHX1NVU1BFTkRFRCkKLSAgICAgIHJldHVybiBGQUxTRTsJCS8qIFN1c3BlbmQsIGNvbWUgYmFjayBsYXRlciAqLwotICB9Ci0gIC8qIERvIGZpbmFsIGNsZWFudXAgKi8KLSAgKCpjaW5mby0+c3JjLT50ZXJtX3NvdXJjZSkgKGNpbmZvKTsKLSAgLyogV2UgY2FuIHVzZSBqcGVnX2Fib3J0IHRvIHJlbGVhc2UgbWVtb3J5IGFuZCByZXNldCBnbG9iYWxfc3RhdGUgKi8KLSAganBlZ19hYm9ydCgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gIHJldHVybiBUUlVFOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkYXBpc3RkLmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRhcGlzdGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzliYmI5Ni4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRhcGlzdGQuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vKgotICogamRhcGlzdGQuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGFwcGxpY2F0aW9uIGludGVyZmFjZSBjb2RlIGZvciB0aGUgZGVjb21wcmVzc2lvbiBoYWxmCi0gKiBvZiB0aGUgSlBFRyBsaWJyYXJ5LiAgVGhlc2UgYXJlIHRoZSAic3RhbmRhcmQiIEFQSSByb3V0aW5lcyB0aGF0IGFyZQotICogdXNlZCBpbiB0aGUgbm9ybWFsIGZ1bGwtZGVjb21wcmVzc2lvbiBjYXNlLiAgVGhleSBhcmUgbm90IHVzZWQgYnkgYQotICogdHJhbnNjb2Rpbmctb25seSBhcHBsaWNhdGlvbi4gIE5vdGUgdGhhdCBpZiBhbiBhcHBsaWNhdGlvbiBsaW5rcyBpbgotICoganBlZ19zdGFydF9kZWNvbXByZXNzLCBpdCB3aWxsIGVuZCB1cCBsaW5raW5nIGluIHRoZSBlbnRpcmUgZGVjb21wcmVzc29yLgotICogV2UgdGh1cyBtdXN0IHNlcGFyYXRlIHRoaXMgZmlsZSBmcm9tIGpkYXBpbWluLmMgdG8gYXZvaWQgbGlua2luZyB0aGUKLSAqIHdob2xlIGRlY29tcHJlc3Npb24gbGlicmFyeSBpbnRvIGEgdHJhbnNjb2Rlci4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLUxPQ0FMKGJvb2xlYW4pIG91dHB1dF9wYXNzX3NldHVwIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotCi0KLS8qCi0gKiBEZWNvbXByZXNzaW9uIGluaXRpYWxpemF0aW9uLgotICoganBlZ19yZWFkX2hlYWRlciBtdXN0IGJlIGNvbXBsZXRlZCBiZWZvcmUgY2FsbGluZyB0aGlzLgotICoKLSAqIElmIGEgbXVsdGlwYXNzIG9wZXJhdGluZyBtb2RlIHdhcyBzZWxlY3RlZCwgdGhpcyB3aWxsIGRvIGFsbCBidXQgdGhlCi0gKiBsYXN0IHBhc3MsIGFuZCB0aHVzIG1heSB0YWtlIGEgZ3JlYXQgZGVhbCBvZiB0aW1lLgotICoKLSAqIFJldHVybnMgRkFMU0UgaWYgc3VzcGVuZGVkLiAgVGhlIHJldHVybiB2YWx1ZSBuZWVkIGJlIGluc3BlY3RlZCBvbmx5IGlmCi0gKiBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgaXMgdXNlZC4KLSAqLwotCi1HTE9CQUwoYm9vbGVhbikKLWpwZWdfc3RhcnRfZGVjb21wcmVzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JFQURZKSB7Ci0gICAgLyogRmlyc3QgY2FsbDogaW5pdGlhbGl6ZSBtYXN0ZXIgY29udHJvbCwgc2VsZWN0IGFjdGl2ZSBtb2R1bGVzICovCi0gICAgamluaXRfbWFzdGVyX2RlY29tcHJlc3MoY2luZm8pOwotICAgIGlmIChjaW5mby0+YnVmZmVyZWRfaW1hZ2UpIHsKLSAgICAgIC8qIE5vIG1vcmUgd29yayBoZXJlOyBleHBlY3RpbmcganBlZ19zdGFydF9vdXRwdXQgbmV4dCAqLwotICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9CVUZJTUFHRTsKLSAgICAgIHJldHVybiBUUlVFOwotICAgIH0KLSAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1BSRUxPQUQ7Ci0gIH0KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1BSRUxPQUQpIHsKLSAgICAvKiBJZiBmaWxlIGhhcyBtdWx0aXBsZSBzY2FucywgYWJzb3JiIHRoZW0gYWxsIGludG8gdGhlIGNvZWYgYnVmZmVyICovCi0gICAgaWYgKGNpbmZvLT5pbnB1dGN0bC0+aGFzX211bHRpcGxlX3NjYW5zKSB7Ci0jaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0gICAgICBmb3IgKDs7KSB7Ci0JaW50IHJldGNvZGU7Ci0JLyogQ2FsbCBwcm9ncmVzcyBtb25pdG9yIGhvb2sgaWYgcHJlc2VudCAqLwotCWlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkKLQkgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotCS8qIEFic29yYiBzb21lIG1vcmUgaW5wdXQgKi8KLQlyZXRjb2RlID0gKCpjaW5mby0+aW5wdXRjdGwtPmNvbnN1bWVfaW5wdXQpIChjaW5mbyk7Ci0JaWYgKHJldGNvZGUgPT0gSlBFR19TVVNQRU5ERUQpCi0JICByZXR1cm4gRkFMU0U7Ci0JaWYgKHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX0VPSSkKLQkgIGJyZWFrOwotCS8qIEFkdmFuY2UgcHJvZ3Jlc3MgY291bnRlciBpZiBhcHByb3ByaWF0ZSAqLwotCWlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCAmJgotCSAgICAocmV0Y29kZSA9PSBKUEVHX1JPV19DT01QTEVURUQgfHwgcmV0Y29kZSA9PSBKUEVHX1JFQUNIRURfU09TKSkgewotCSAgaWYgKCsrY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPj0gY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0KSB7Ci0JICAgIC8qIGpkbWFzdGVyIHVuZGVyZXN0aW1hdGVkIG51bWJlciBvZiBzY2FuczsgcmF0Y2hldCB1cCBvbmUgc2NhbiAqLwotCSAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgKz0gKGxvbmcpIGNpbmZvLT50b3RhbF9pTUNVX3Jvd3M7Ci0JICB9Ci0JfQotICAgICAgfQotI2Vsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZiAvKiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQgKi8KLSAgICB9Ci0gICAgY2luZm8tPm91dHB1dF9zY2FuX251bWJlciA9IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcjsKLSAgfSBlbHNlIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9QUkVTQ0FOKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIC8qIFBlcmZvcm0gYW55IGR1bW15IG91dHB1dCBwYXNzZXMsIGFuZCBzZXQgdXAgZm9yIHRoZSBmaW5hbCBwYXNzICovCi0gIHJldHVybiBvdXRwdXRfcGFzc19zZXR1cChjaW5mbyk7Ci19Ci0KLQotLyoKLSAqIFNldCB1cCBmb3IgYW4gb3V0cHV0IHBhc3MsIGFuZCBwZXJmb3JtIGFueSBkdW1teSBwYXNzKGVzKSBuZWVkZWQuCi0gKiBDb21tb24gc3Vicm91dGluZSBmb3IganBlZ19zdGFydF9kZWNvbXByZXNzIGFuZCBqcGVnX3N0YXJ0X291dHB1dC4KLSAqIEVudHJ5OiBnbG9iYWxfc3RhdGUgPSBEU1RBVEVfUFJFU0NBTiBvbmx5IGlmIHByZXZpb3VzbHkgc3VzcGVuZGVkLgotICogRXhpdDogSWYgZG9uZSwgcmV0dXJucyBUUlVFIGFuZCBzZXRzIGdsb2JhbF9zdGF0ZSBmb3IgcHJvcGVyIG91dHB1dCBtb2RlLgotICogICAgICAgSWYgc3VzcGVuZGVkLCByZXR1cm5zIEZBTFNFIGFuZCBzZXRzIGdsb2JhbF9zdGF0ZSA9IERTVEFURV9QUkVTQ0FOLgotICovCi0KLUxPQ0FMKGJvb2xlYW4pCi1vdXRwdXRfcGFzc19zZXR1cCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX1BSRVNDQU4pIHsKLSAgICAvKiBGaXJzdCBjYWxsOiBkbyBwYXNzIHNldHVwICovCi0gICAgKCpjaW5mby0+bWFzdGVyLT5wcmVwYXJlX2Zvcl9vdXRwdXRfcGFzcykgKGNpbmZvKTsKLSAgICBjaW5mby0+b3V0cHV0X3NjYW5saW5lID0gMDsKLSAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1BSRVNDQU47Ci0gIH0KLSAgLyogTG9vcCBvdmVyIGFueSByZXF1aXJlZCBkdW1teSBwYXNzZXMgKi8KLSAgd2hpbGUgKGNpbmZvLT5tYXN0ZXItPmlzX2R1bW15X3Bhc3MpIHsKLSNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKLSAgICAvKiBDcmFuayB0aHJvdWdoIHRoZSBkdW1teSBwYXNzICovCi0gICAgd2hpbGUgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPCBjaW5mby0+b3V0cHV0X2hlaWdodCkgewotICAgICAgSkRJTUVOU0lPTiBsYXN0X3NjYW5saW5lOwotICAgICAgLyogQ2FsbCBwcm9ncmVzcyBtb25pdG9yIGhvb2sgaWYgcHJlc2VudCAqLwotICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7Ci0JY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAobG9uZykgY2luZm8tPm91dHB1dF9zY2FubGluZTsKLQljaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPm91dHB1dF9oZWlnaHQ7Ci0JKCpjaW5mby0+cHJvZ3Jlc3MtPnByb2dyZXNzX21vbml0b3IpICgoal9jb21tb25fcHRyKSBjaW5mbyk7Ci0gICAgICB9Ci0gICAgICAvKiBQcm9jZXNzIHNvbWUgZGF0YSAqLwotICAgICAgbGFzdF9zY2FubGluZSA9IGNpbmZvLT5vdXRwdXRfc2NhbmxpbmU7Ci0gICAgICAoKmNpbmZvLT5tYWluLT5wcm9jZXNzX2RhdGEpIChjaW5mbywgKEpTQU1QQVJSQVkpIE5VTEwsCi0JCQkJICAgICZjaW5mby0+b3V0cHV0X3NjYW5saW5lLCAoSkRJTUVOU0lPTikgMCk7Ci0gICAgICBpZiAoY2luZm8tPm91dHB1dF9zY2FubGluZSA9PSBsYXN0X3NjYW5saW5lKQotCXJldHVybiBGQUxTRTsJCS8qIE5vIHByb2dyZXNzIG1hZGUsIG11c3Qgc3VzcGVuZCAqLwotICAgIH0KLSAgICAvKiBGaW5pc2ggdXAgZHVtbXkgcGFzcywgYW5kIHNldCB1cCBmb3IgYW5vdGhlciBvbmUgKi8KLSAgICAoKmNpbmZvLT5tYXN0ZXItPmZpbmlzaF9vdXRwdXRfcGFzcykgKGNpbmZvKTsKLSAgICAoKmNpbmZvLT5tYXN0ZXItPnByZXBhcmVfZm9yX291dHB1dF9wYXNzKSAoY2luZm8pOwotICAgIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPSAwOwotI2Vsc2UKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCi0gIH0KLSAgLyogUmVhZHkgZm9yIGFwcGxpY2F0aW9uIHRvIGRyaXZlIG91dHB1dCBwYXNzIHRocm91Z2gKLSAgICoganBlZ19yZWFkX3NjYW5saW5lcyBvciBqcGVnX3JlYWRfcmF3X2RhdGEuCi0gICAqLwotICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gY2luZm8tPnJhd19kYXRhX291dCA/IERTVEFURV9SQVdfT0sgOiBEU1RBVEVfU0NBTk5JTkc7Ci0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBSZWFkIHNvbWUgc2NhbmxpbmVzIG9mIGRhdGEgZnJvbSB0aGUgSlBFRyBkZWNvbXByZXNzb3IuCi0gKgotICogVGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHRoZSBudW1iZXIgb2YgbGluZXMgYWN0dWFsbHkgcmVhZC4KLSAqIFRoaXMgbWF5IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIHJlcXVlc3RlZCBpbiBzZXZlcmFsIGNhc2VzLAotICogaW5jbHVkaW5nIGJvdHRvbSBvZiBpbWFnZSwgZGF0YSBzb3VyY2Ugc3VzcGVuc2lvbiwgYW5kIG9wZXJhdGluZwotICogbW9kZXMgdGhhdCBlbWl0IG11bHRpcGxlIHNjYW5saW5lcyBhdCBhIHRpbWUuCi0gKgotICogTm90ZTogd2Ugd2FybiBhYm91dCBleGNlc3MgY2FsbHMgdG8ganBlZ19yZWFkX3NjYW5saW5lcygpIHNpbmNlCi0gKiB0aGlzIGxpa2VseSBzaWduYWxzIGFuIGFwcGxpY2F0aW9uIHByb2dyYW1tZXIgZXJyb3IuICBIb3dldmVyLAotICogYW4gb3ZlcnNpemUgYnVmZmVyIChtYXhfbGluZXMgPiBzY2FubGluZXMgcmVtYWluaW5nKSBpcyBub3QgYW4gZXJyb3IuCi0gKi8KLQotR0xPQkFMKEpESU1FTlNJT04pCi1qcGVnX3JlYWRfc2NhbmxpbmVzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIHNjYW5saW5lcywKLQkJICAgICBKRElNRU5TSU9OIG1heF9saW5lcykKLXsKLSAgSkRJTUVOU0lPTiByb3dfY3RyOwotCi0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9TQ0FOTklORykKLQkgIHJldHVybiAwOyAvKiBYWVEgMjAxMC02LTI3OiBkb24ndCB0aHJvdyBleGNlcHRpb24gaGVyZSAqLwotLyogICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsgKi8KLSAgaWYgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPj0gY2luZm8tPm91dHB1dF9oZWlnaHQpIHsKLSAgICBXQVJOTVMoY2luZm8sIEpXUk5fVE9PX01VQ0hfREFUQSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCi0gIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmU7Ci0gICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0OwotICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICB9Ci0KLSAgLyogUHJvY2VzcyBzb21lIGRhdGEgKi8KLSAgcm93X2N0ciA9IDA7Ci0gICgqY2luZm8tPm1haW4tPnByb2Nlc3NfZGF0YSkgKGNpbmZvLCBzY2FubGluZXMsICZyb3dfY3RyLCBtYXhfbGluZXMpOwotICBjaW5mby0+b3V0cHV0X3NjYW5saW5lICs9IHJvd19jdHI7Ci0gIHJldHVybiByb3dfY3RyOwotfQotCi0KLS8qCi0gKiBBbHRlcm5hdGUgZW50cnkgcG9pbnQgdG8gcmVhZCByYXcgZGF0YS4KLSAqIFByb2Nlc3NlcyBleGFjdGx5IG9uZSBpTUNVIHJvdyBwZXIgY2FsbCwgdW5sZXNzIHN1c3BlbmRlZC4KLSAqLwotCi1HTE9CQUwoSkRJTUVOU0lPTikKLWpwZWdfcmVhZF9yYXdfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBkYXRhLAotCQkgICAgSkRJTUVOU0lPTiBtYXhfbGluZXMpCi17Ci0gIEpESU1FTlNJT04gbGluZXNfcGVyX2lNQ1Vfcm93OwotCi0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9SQVdfT0spCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLSAgaWYgKGNpbmZvLT5vdXRwdXRfc2NhbmxpbmUgPj0gY2luZm8tPm91dHB1dF9oZWlnaHQpIHsKLSAgICBXQVJOTVMoY2luZm8sIEpXUk5fVE9PX01VQ0hfREFUQSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKiBDYWxsIHByb2dyZXNzIG1vbml0b3IgaG9vayBpZiBwcmVzZW50ICovCi0gIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkgewotICAgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfc2NhbmxpbmU7Ci0gICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2xpbWl0ID0gKGxvbmcpIGNpbmZvLT5vdXRwdXRfaGVpZ2h0OwotICAgICgqY2luZm8tPnByb2dyZXNzLT5wcm9ncmVzc19tb25pdG9yKSAoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICB9Ci0KLSAgLyogVmVyaWZ5IHRoYXQgYXQgbGVhc3Qgb25lIGlNQ1Ugcm93IGNhbiBiZSByZXR1cm5lZC4gKi8KLSAgbGluZXNfcGVyX2lNQ1Vfcm93ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yICogY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7Ci0gIGlmIChtYXhfbGluZXMgPCBsaW5lc19wZXJfaU1DVV9yb3cpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CVUZGRVJfU0laRSk7Ci0KLSAgLyogRGVjb21wcmVzcyBkaXJlY3RseSBpbnRvIHVzZXIncyBidWZmZXIuICovCi0gIGlmICghICgqY2luZm8tPmNvZWYtPmRlY29tcHJlc3NfZGF0YSkgKGNpbmZvLCBkYXRhKSkKLSAgICByZXR1cm4gMDsJCQkvKiBzdXNwZW5zaW9uIGZvcmNlZCwgY2FuIGRvIG5vdGhpbmcgbW9yZSAqLwotCi0gIC8qIE9LLCB3ZSBwcm9jZXNzZWQgb25lIGlNQ1Ugcm93LiAqLwotICBjaW5mby0+b3V0cHV0X3NjYW5saW5lICs9IGxpbmVzX3Blcl9pTUNVX3JvdzsKLSAgcmV0dXJuIGxpbmVzX3Blcl9pTUNVX3JvdzsKLX0KLQotCi0vKiBBZGRpdGlvbmFsIGVudHJ5IHBvaW50cyBmb3IgYnVmZmVyZWQtaW1hZ2UgbW9kZS4gKi8KLQotI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYW4gb3V0cHV0IHBhc3MgaW4gYnVmZmVyZWQtaW1hZ2UgbW9kZS4KLSAqLwotCi1HTE9CQUwoYm9vbGVhbikKLWpwZWdfc3RhcnRfb3V0cHV0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgc2Nhbl9udW1iZXIpCi17Ci0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9CVUZJTUFHRSAmJgotICAgICAgY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfUFJFU0NBTikKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotICAvKiBMaW1pdCBzY2FuIG51bWJlciB0byB2YWxpZCByYW5nZSAqLwotICBpZiAoc2Nhbl9udW1iZXIgPD0gMCkKLSAgICBzY2FuX251bWJlciA9IDE7Ci0gIGlmIChjaW5mby0+aW5wdXRjdGwtPmVvaV9yZWFjaGVkICYmCi0gICAgICBzY2FuX251bWJlciA+IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcikKLSAgICBzY2FuX251bWJlciA9IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcjsKLSAgY2luZm8tPm91dHB1dF9zY2FuX251bWJlciA9IHNjYW5fbnVtYmVyOwotICAvKiBQZXJmb3JtIGFueSBkdW1teSBvdXRwdXQgcGFzc2VzLCBhbmQgc2V0IHVwIGZvciB0aGUgcmVhbCBwYXNzICovCi0gIHJldHVybiBvdXRwdXRfcGFzc19zZXR1cChjaW5mbyk7Ci19Ci0KLQotLyoKLSAqIEZpbmlzaCB1cCBhZnRlciBhbiBvdXRwdXQgcGFzcyBpbiBidWZmZXJlZC1pbWFnZSBtb2RlLgotICoKLSAqIFJldHVybnMgRkFMU0UgaWYgc3VzcGVuZGVkLiAgVGhlIHJldHVybiB2YWx1ZSBuZWVkIGJlIGluc3BlY3RlZCBvbmx5IGlmCi0gKiBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UgaXMgdXNlZC4KLSAqLwotCi1HTE9CQUwoYm9vbGVhbikKLWpwZWdfZmluaXNoX291dHB1dCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaWYgKChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9TQ0FOTklORyB8fAotICAgICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPT0gRFNUQVRFX1JBV19PSykgJiYgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7Ci0gICAgLyogVGVybWluYXRlIHRoaXMgcGFzcy4gKi8KLSAgICAvKiBXZSBkbyBub3QgcmVxdWlyZSB0aGUgd2hvbGUgcGFzcyB0byBoYXZlIGJlZW4gY29tcGxldGVkLiAqLwotICAgICgqY2luZm8tPm1hc3Rlci0+ZmluaXNoX291dHB1dF9wYXNzKSAoY2luZm8pOwotICAgIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfQlVGUE9TVDsKLSAgfSBlbHNlIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlICE9IERTVEFURV9CVUZQT1NUKSB7Ci0gICAgLyogQlVGUE9TVCA9IHJlcGVhdCBjYWxsIGFmdGVyIGEgc3VzcGVuc2lvbiwgYW55dGhpbmcgZWxzZSBpcyBlcnJvciAqLwotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0gIH0KLSAgLyogUmVhZCBtYXJrZXJzIGxvb2tpbmcgZm9yIFNPUyBvciBFT0kgKi8KLSAgd2hpbGUgKGNpbmZvLT5pbnB1dF9zY2FuX251bWJlciA8PSBjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyICYmCi0JICEgY2luZm8tPmlucHV0Y3RsLT5lb2lfcmVhY2hlZCkgewotICAgIGlmICgoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkgKGNpbmZvKSA9PSBKUEVHX1NVU1BFTkRFRCkKLSAgICAgIHJldHVybiBGQUxTRTsJCS8qIFN1c3BlbmQsIGNvbWUgYmFjayBsYXRlciAqLwotICB9Ci0gIGNpbmZvLT5nbG9iYWxfc3RhdGUgPSBEU1RBVEVfQlVGSU1BR0U7Ci0gIHJldHVybiBUUlVFOwotfQotCi0jZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRjb2VmY3QuYyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZGNvZWZjdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTM4ZDIwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZGNvZWZjdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzM2ICswLDAgQEAKLS8qCi0gKiBqZGNvZWZjdC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sbGVyIGZvciBkZWNvbXByZXNzaW9uLgotICogVGhpcyBjb250cm9sbGVyIGlzIHRoZSB0b3AgbGV2ZWwgb2YgdGhlIEpQRUcgZGVjb21wcmVzc29yIHByb3Blci4KLSAqIFRoZSBjb2VmZmljaWVudCBidWZmZXIgbGllcyBiZXR3ZWVuIGVudHJvcHkgZGVjb2RpbmcgYW5kIGludmVyc2UtRENUIHN0ZXBzLgotICoKLSAqIEluIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIHRoaXMgY29udHJvbGxlciBpcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4KLSAqIGlucHV0LW9yaWVudGVkIHByb2Nlc3NpbmcgYW5kIG91dHB1dC1vcmllbnRlZCBwcm9jZXNzaW5nLgotICogQWxzbywgdGhlIGlucHV0IHNpZGUgKG9ubHkpIGlzIHVzZWQgd2hlbiByZWFkaW5nIGEgZmlsZSBmb3IgdHJhbnNjb2RpbmcuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0vKiBCbG9jayBzbW9vdGhpbmcgaXMgb25seSBhcHBsaWNhYmxlIGZvciBwcm9ncmVzc2l2ZSBKUEVHLCBzbzogKi8KLSNpZm5kZWYgRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSN1bmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECi0jZW5kaWYKLQotLyogUHJpdmF0ZSBidWZmZXIgY29udHJvbGxlciBvYmplY3QgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19kX2NvZWZfY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBUaGVzZSB2YXJpYWJsZXMga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCBsb2NhdGlvbiBvZiB0aGUgaW5wdXQgc2lkZS4gKi8KLSAgLyogY2luZm8tPmlucHV0X2lNQ1Vfcm93IGlzIGFsc28gdXNlZCBmb3IgdGhpcy4gKi8KLSAgSkRJTUVOU0lPTiBNQ1VfY3RyOwkJLyogY291bnRzIE1DVXMgcHJvY2Vzc2VkIGluIGN1cnJlbnQgcm93ICovCi0gIGludCBNQ1VfdmVydF9vZmZzZXQ7CQkvKiBjb3VudHMgTUNVIHJvd3Mgd2l0aGluIGlNQ1Ugcm93ICovCi0gIGludCBNQ1Vfcm93c19wZXJfaU1DVV9yb3c7CS8qIG51bWJlciBvZiBzdWNoIHJvd3MgbmVlZGVkICovCi0KLSAgLyogVGhlIG91dHB1dCBzaWRlJ3MgbG9jYXRpb24gaXMgcmVwcmVzZW50ZWQgYnkgY2luZm8tPm91dHB1dF9pTUNVX3Jvdy4gKi8KLQotICAvKiBJbiBzaW5nbGUtcGFzcyBtb2RlcywgaXQncyBzdWZmaWNpZW50IHRvIGJ1ZmZlciBqdXN0IG9uZSBNQ1UuCi0gICAqIFdlIGFsbG9jYXRlIGEgd29ya3NwYWNlIG9mIERfTUFYX0JMT0NLU19JTl9NQ1UgY29lZmZpY2llbnQgYmxvY2tzLAotICAgKiBhbmQgbGV0IHRoZSBlbnRyb3B5IGRlY29kZXIgd3JpdGUgaW50byB0aGF0IHdvcmtzcGFjZSBlYWNoIHRpbWUuCi0gICAqIChPbiA4MHg4NiwgdGhlIHdvcmtzcGFjZSBpcyBGQVIgZXZlbiB0aG91Z2ggaXQncyBub3QgcmVhbGx5IHZlcnkgYmlnOwotICAgKiB0aGlzIGlzIHRvIGtlZXAgdGhlIG1vZHVsZSBpbnRlcmZhY2VzIHVuY2hhbmdlZCB3aGVuIGEgbGFyZ2UgY29lZmZpY2llbnQKLSAgICogYnVmZmVyIGlzIG5lY2Vzc2FyeS4pCi0gICAqIEluIG11bHRpLXBhc3MgbW9kZXMsIHRoaXMgYXJyYXkgcG9pbnRzIHRvIHRoZSBjdXJyZW50IE1DVSdzIGJsb2NrcwotICAgKiB3aXRoaW4gdGhlIHZpcnR1YWwgYXJyYXlzOyBpdCBpcyB1c2VkIG9ubHkgYnkgdGhlIGlucHV0IHNpZGUuCi0gICAqLwotICBKQkxPQ0tST1cgTUNVX2J1ZmZlcltEX01BWF9CTE9DS1NfSU5fTUNVXTsKLQotI2lmZGVmIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRAotICAvKiBJbiBtdWx0aS1wYXNzIG1vZGVzLCB3ZSBuZWVkIGEgdmlydHVhbCBibG9jayBhcnJheSBmb3IgZWFjaCBjb21wb25lbnQuICovCi0gIGp2aXJ0X2JhcnJheV9wdHIgd2hvbGVfaW1hZ2VbTUFYX0NPTVBPTkVOVFNdOwotI2VuZGlmCi0KLSNpZmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECi0gIC8qIFdoZW4gZG9pbmcgYmxvY2sgc21vb3RoaW5nLCB3ZSBsYXRjaCBjb2VmZmljaWVudCBBbCB2YWx1ZXMgaGVyZSAqLwotICBpbnQgKiBjb2VmX2JpdHNfbGF0Y2g7Ci0jZGVmaW5lIFNBVkVEX0NPRUZTICA2CQkvKiB3ZSBzYXZlIGNvZWZfYml0c1swLi41XSAqLwotI2VuZGlmCi19IG15X2NvZWZfY29udHJvbGxlcjsKLQotdHlwZWRlZiBteV9jb2VmX2NvbnRyb2xsZXIgKiBteV9jb2VmX3B0cjsKLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLU1FVEhPRERFRihpbnQpIGRlY29tcHJlc3Nfb25lcGFzcwotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBvdXRwdXRfYnVmKSk7Ci0jaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi1NRVRIT0RERUYoaW50KSBkZWNvbXByZXNzX2RhdGEKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikpOwotI2VuZGlmCi0jaWZkZWYgQkxPQ0tfU01PT1RISU5HX1NVUFBPUlRFRAotTE9DQUwoYm9vbGVhbikgc21vb3RoaW5nX29rIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotTUVUSE9EREVGKGludCkgZGVjb21wcmVzc19zbW9vdGhfZGF0YQotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBvdXRwdXRfYnVmKSk7Ci0jZW5kaWYKLQotCi1MT0NBTCh2b2lkKQotc3RhcnRfaU1DVV9yb3cgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBSZXNldCB3aXRoaW4taU1DVS1yb3cgY291bnRlcnMgZm9yIGEgbmV3IHJvdyAoaW5wdXQgc2lkZSkgKi8KLXsKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0KLSAgLyogSW4gYW4gaW50ZXJsZWF2ZWQgc2NhbiwgYW4gTUNVIHJvdyBpcyB0aGUgc2FtZSBhcyBhbiBpTUNVIHJvdy4KLSAgICogSW4gYSBub25pbnRlcmxlYXZlZCBzY2FuLCBhbiBpTUNVIHJvdyBoYXMgdl9zYW1wX2ZhY3RvciBNQ1Ugcm93cy4KLSAgICogQnV0IGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLCBwcm9jZXNzIG9ubHkgd2hhdCdzIGxlZnQuCi0gICAqLwotICBpZiAoY2luZm8tPmNvbXBzX2luX3NjYW4gPiAxKSB7Ci0gICAgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93ID0gMTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoY2luZm8tPmlucHV0X2lNQ1Vfcm93IDwgKGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MtMSkpCi0gICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+dl9zYW1wX2ZhY3RvcjsKLSAgICBlbHNlCi0gICAgICBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3cgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXS0+bGFzdF9yb3dfaGVpZ2h0OwotICB9Ci0KLSAgY29lZi0+TUNVX2N0ciA9IDA7Ci0gIGNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IDA7Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGFuIGlucHV0IHByb2Nlc3NpbmcgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X2lucHV0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA9IDA7Ci0gIHN0YXJ0X2lNQ1Vfcm93KGNpbmZvKTsKLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYW4gb3V0cHV0IHByb2Nlc3NpbmcgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X291dHB1dF9wYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotI2lmZGVmIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0KLSAgLyogSWYgbXVsdGlwYXNzLCBjaGVjayB0byBzZWUgd2hldGhlciB0byB1c2UgYmxvY2sgc21vb3RoaW5nIG9uIHRoaXMgcGFzcyAqLwotICBpZiAoY29lZi0+cHViLmNvZWZfYXJyYXlzICE9IE5VTEwpIHsKLSAgICBpZiAoY2luZm8tPmRvX2Jsb2NrX3Ntb290aGluZyAmJiBzbW9vdGhpbmdfb2soY2luZm8pKQotICAgICAgY29lZi0+cHViLmRlY29tcHJlc3NfZGF0YSA9IGRlY29tcHJlc3Nfc21vb3RoX2RhdGE7Ci0gICAgZWxzZQotICAgICAgY29lZi0+cHViLmRlY29tcHJlc3NfZGF0YSA9IGRlY29tcHJlc3NfZGF0YTsKLSAgfQotI2VuZGlmCi0gIGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cgPSAwOwotfQotCi0KLS8qCi0gKiBEZWNvbXByZXNzIGFuZCByZXR1cm4gc29tZSBkYXRhIGluIHRoZSBzaW5nbGUtcGFzcyBjYXNlLgotICogQWx3YXlzIGF0dGVtcHRzIHRvIGVtaXQgb25lIGZ1bGx5IGludGVybGVhdmVkIE1DVSByb3cgKCJpTUNVIiByb3cpLgotICogSW5wdXQgYW5kIG91dHB1dCBtdXN0IHJ1biBpbiBsb2Nrc3RlcCBzaW5jZSB3ZSBoYXZlIG9ubHkgYSBvbmUtTUNVIGJ1ZmZlci4KLSAqIFJldHVybiB2YWx1ZSBpcyBKUEVHX1JPV19DT01QTEVURUQsIEpQRUdfU0NBTl9DT01QTEVURUQsIG9yIEpQRUdfU1VTUEVOREVELgotICoKLSAqIE5COiBvdXRwdXRfYnVmIGNvbnRhaW5zIGEgcGxhbmUgZm9yIGVhY2ggY29tcG9uZW50IGluIGltYWdlLAotICogd2hpY2ggd2UgaW5kZXggYWNjb3JkaW5nIHRvIHRoZSBjb21wb25lbnQncyBTT0YgcG9zaXRpb24uCi0gKi8KLQotTUVUSE9EREVGKGludCkKLWRlY29tcHJlc3Nfb25lcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSlNBTVBJTUFHRSBvdXRwdXRfYnVmKQotewotICBteV9jb2VmX3B0ciBjb2VmID0gKG15X2NvZWZfcHRyKSBjaW5mby0+Y29lZjsKLSAgSkRJTUVOU0lPTiBNQ1VfY29sX251bTsJLyogaW5kZXggb2YgY3VycmVudCBNQ1Ugd2l0aGluIHJvdyAqLwotICBKRElNRU5TSU9OIGxhc3RfTUNVX2NvbCA9IGNpbmZvLT5NQ1VzX3Blcl9yb3cgLSAxOwotICBKRElNRU5TSU9OIGxhc3RfaU1DVV9yb3cgPSBjaW5mby0+dG90YWxfaU1DVV9yb3dzIC0gMTsKLSAgaW50IGJsa24sIGNpLCB4aW5kZXgsIHlpbmRleCwgeW9mZnNldCwgdXNlZnVsX3dpZHRoOwotICBKU0FNUEFSUkFZIG91dHB1dF9wdHI7Ci0gIEpESU1FTlNJT04gc3RhcnRfY29sLCBvdXRwdXRfY29sOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIGludmVyc2VfRENUOwotCi0gIC8qIExvb3AgdG8gcHJvY2VzcyBhcyBtdWNoIGFzIG9uZSB3aG9sZSBpTUNVIHJvdyAqLwotICBmb3IgKHlvZmZzZXQgPSBjb2VmLT5NQ1VfdmVydF9vZmZzZXQ7IHlvZmZzZXQgPCBjb2VmLT5NQ1Vfcm93c19wZXJfaU1DVV9yb3c7Ci0gICAgICAgeW9mZnNldCsrKSB7Ci0gICAgZm9yIChNQ1VfY29sX251bSA9IGNvZWYtPk1DVV9jdHI7IE1DVV9jb2xfbnVtIDw9IGxhc3RfTUNVX2NvbDsKLQkgTUNVX2NvbF9udW0rKykgewotICAgICAgLyogVHJ5IHRvIGZldGNoIGFuIE1DVS4gIEVudHJvcHkgZGVjb2RlciBleHBlY3RzIGJ1ZmZlciB0byBiZSB6ZXJvZWQuICovCi0gICAgICBqemVyb19mYXIoKHZvaWQgRkFSICopIGNvZWYtPk1DVV9idWZmZXJbMF0sCi0JCShzaXplX3QpIChjaW5mby0+YmxvY2tzX2luX01DVSAqIFNJWkVPRihKQkxPQ0spKSk7Ci0gICAgICBpZiAoISAoKmNpbmZvLT5lbnRyb3B5LT5kZWNvZGVfbWN1KSAoY2luZm8sIGNvZWYtPk1DVV9idWZmZXIpKSB7Ci0JLyogU3VzcGVuc2lvbiBmb3JjZWQ7IHVwZGF0ZSBzdGF0ZSBjb3VudGVycyBhbmQgZXhpdCAqLwotCWNvZWYtPk1DVV92ZXJ0X29mZnNldCA9IHlvZmZzZXQ7Ci0JY29lZi0+TUNVX2N0ciA9IE1DVV9jb2xfbnVtOwotCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIH0KLSAgICAgIC8qIERldGVybWluZSB3aGVyZSBkYXRhIHNob3VsZCBnbyBpbiBvdXRwdXRfYnVmIGFuZCBkbyB0aGUgSURDVCB0aGluZy4KLSAgICAgICAqIFdlIHNraXAgZHVtbXkgYmxvY2tzIGF0IHRoZSByaWdodCBhbmQgYm90dG9tIGVkZ2VzIChidXQgYmxrbiBnZXRzCi0gICAgICAgKiBpbmNyZW1lbnRlZCBwYXN0IHRoZW0hKS4gIE5vdGUgdGhlIGlubmVyIGxvb3AgcmVsaWVzIG9uIGhhdmluZwotICAgICAgICogYWxsb2NhdGVkIHRoZSBNQ1VfYnVmZmVyW10gYmxvY2tzIHNlcXVlbnRpYWxseS4KLSAgICAgICAqLwotICAgICAgYmxrbiA9IDA7CQkJLyogaW5kZXggb2YgY3VycmVudCBEQ1QgYmxvY2sgd2l0aGluIE1DVSAqLwotICAgICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLQljb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotCS8qIERvbid0IGJvdGhlciB0byBJRENUIGFuIHVuaW50ZXJlc3RpbmcgY29tcG9uZW50LiAqLwotCWlmICghIGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQpIHsKLQkgIGJsa24gKz0gY29tcHB0ci0+TUNVX2Jsb2NrczsKLQkgIGNvbnRpbnVlOwotCX0KLQlpbnZlcnNlX0RDVCA9IGNpbmZvLT5pZGN0LT5pbnZlcnNlX0RDVFtjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdOwotCXVzZWZ1bF93aWR0aCA9IChNQ1VfY29sX251bSA8IGxhc3RfTUNVX2NvbCkgPyBjb21wcHRyLT5NQ1Vfd2lkdGgKLQkJCQkJCSAgICA6IGNvbXBwdHItPmxhc3RfY29sX3dpZHRoOwotCW91dHB1dF9wdHIgPSBvdXRwdXRfYnVmW2NvbXBwdHItPmNvbXBvbmVudF9pbmRleF0gKwotCSAgeW9mZnNldCAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKLQlzdGFydF9jb2wgPSBNQ1VfY29sX251bSAqIGNvbXBwdHItPk1DVV9zYW1wbGVfd2lkdGg7Ci0JZm9yICh5aW5kZXggPSAwOyB5aW5kZXggPCBjb21wcHRyLT5NQ1VfaGVpZ2h0OyB5aW5kZXgrKykgewotCSAgaWYgKGNpbmZvLT5pbnB1dF9pTUNVX3JvdyA8IGxhc3RfaU1DVV9yb3cgfHwKLQkgICAgICB5b2Zmc2V0K3lpbmRleCA8IGNvbXBwdHItPmxhc3Rfcm93X2hlaWdodCkgewotCSAgICBvdXRwdXRfY29sID0gc3RhcnRfY29sOwotCSAgICBmb3IgKHhpbmRleCA9IDA7IHhpbmRleCA8IHVzZWZ1bF93aWR0aDsgeGluZGV4KyspIHsKLQkgICAgICAoKmludmVyc2VfRENUKSAoY2luZm8sIGNvbXBwdHIsCi0JCQkgICAgICAoSkNPRUZQVFIpIGNvZWYtPk1DVV9idWZmZXJbYmxrbit4aW5kZXhdLAotCQkJICAgICAgb3V0cHV0X3B0ciwgb3V0cHV0X2NvbCk7Ci0JICAgICAgb3V0cHV0X2NvbCArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0JICAgIH0KLQkgIH0KLQkgIGJsa24gKz0gY29tcHB0ci0+TUNVX3dpZHRoOwotCSAgb3V0cHV0X3B0ciArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0JfQotICAgICAgfQotICAgIH0KLSAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCi0gICAgY29lZi0+TUNVX2N0ciA9IDA7Ci0gIH0KLSAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KLSAgY2luZm8tPm91dHB1dF9pTUNVX3JvdysrOwotICBpZiAoKysoY2luZm8tPmlucHV0X2lNQ1Vfcm93KSA8IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpIHsKLSAgICBzdGFydF9pTUNVX3JvdyhjaW5mbyk7Ci0gICAgcmV0dXJuIEpQRUdfUk9XX0NPTVBMRVRFRDsKLSAgfQotICAvKiBDb21wbGV0ZWQgdGhlIHNjYW4gKi8KLSAgKCpjaW5mby0+aW5wdXRjdGwtPmZpbmlzaF9pbnB1dF9wYXNzKSAoY2luZm8pOwotICByZXR1cm4gSlBFR19TQ0FOX0NPTVBMRVRFRDsKLX0KLQotCi0vKgotICogRHVtbXkgY29uc3VtZS1pbnB1dCByb3V0aW5lIGZvciBzaW5nbGUtcGFzcyBvcGVyYXRpb24uCi0gKi8KLQotTUVUSE9EREVGKGludCkKLWR1bW15X2NvbnN1bWVfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOwkvKiBBbHdheXMgaW5kaWNhdGUgbm90aGluZyB3YXMgZG9uZSAqLwotfQotCi0KLSNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLQotLyoKLSAqIENvbnN1bWUgaW5wdXQgZGF0YSBhbmQgc3RvcmUgaXQgaW4gdGhlIGZ1bGwtaW1hZ2UgY29lZmZpY2llbnQgYnVmZmVyLgotICogV2UgcmVhZCBhcyBtdWNoIGFzIG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KSBwZXIgY2FsbCwKLSAqIGllLCB2X3NhbXBfZmFjdG9yIGJsb2NrIHJvd3MgZm9yIGVhY2ggY29tcG9uZW50IGluIHRoZSBzY2FuLgotICogUmV0dXJuIHZhbHVlIGlzIEpQRUdfUk9XX0NPTVBMRVRFRCwgSlBFR19TQ0FOX0NPTVBMRVRFRCwgb3IgSlBFR19TVVNQRU5ERUQuCi0gKi8KLQotTUVUSE9EREVGKGludCkKLWNvbnN1bWVfZGF0YSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0gIEpESU1FTlNJT04gTUNVX2NvbF9udW07CS8qIGluZGV4IG9mIGN1cnJlbnQgTUNVIHdpdGhpbiByb3cgKi8KLSAgaW50IGJsa24sIGNpLCB4aW5kZXgsIHlpbmRleCwgeW9mZnNldDsKLSAgSkRJTUVOU0lPTiBzdGFydF9jb2w7Ci0gIEpCTE9DS0FSUkFZIGJ1ZmZlcltNQVhfQ09NUFNfSU5fU0NBTl07Ci0gIEpCTE9DS1JPVyBidWZmZXJfcHRyOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotCi0gIC8qIEFsaWduIHRoZSB2aXJ0dWFsIGJ1ZmZlcnMgZm9yIHRoZSBjb21wb25lbnRzIHVzZWQgaW4gdGhpcyBzY2FuLiAqLwotICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgYnVmZmVyW2NpXSA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBjb2VmLT53aG9sZV9pbWFnZVtjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdLAotICAgICAgIGNpbmZvLT5pbnB1dF9pTUNVX3JvdyAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCi0gICAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIFRSVUUpOwotICAgIC8qIE5vdGU6IGVudHJvcHkgZGVjb2RlciBleHBlY3RzIGJ1ZmZlciB0byBiZSB6ZXJvZWQsCi0gICAgICogYnV0IHRoaXMgaXMgaGFuZGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBtZW1vcnkgbWFuYWdlcgotICAgICAqIGJlY2F1c2Ugd2UgcmVxdWVzdGVkIGEgcHJlLXplcm9lZCBhcnJheS4KLSAgICAgKi8KLSAgfQotCi0gIC8qIExvb3AgdG8gcHJvY2VzcyBvbmUgd2hvbGUgaU1DVSByb3cgKi8KLSAgZm9yICh5b2Zmc2V0ID0gY29lZi0+TUNVX3ZlcnRfb2Zmc2V0OyB5b2Zmc2V0IDwgY29lZi0+TUNVX3Jvd3NfcGVyX2lNQ1Vfcm93OwotICAgICAgIHlvZmZzZXQrKykgewotICAgIGZvciAoTUNVX2NvbF9udW0gPSBjb2VmLT5NQ1VfY3RyOyBNQ1VfY29sX251bSA8IGNpbmZvLT5NQ1VzX3Blcl9yb3c7Ci0JIE1DVV9jb2xfbnVtKyspIHsKLSAgICAgIC8qIENvbnN0cnVjdCBsaXN0IG9mIHBvaW50ZXJzIHRvIERDVCBibG9ja3MgYmVsb25naW5nIHRvIHRoaXMgTUNVICovCi0gICAgICBibGtuID0gMDsJCQkvKiBpbmRleCBvZiBjdXJyZW50IERDVCBibG9jayB3aXRoaW4gTUNVICovCi0gICAgICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotCWNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0Jc3RhcnRfY29sID0gTUNVX2NvbF9udW0gKiBjb21wcHRyLT5NQ1Vfd2lkdGg7Ci0JZm9yICh5aW5kZXggPSAwOyB5aW5kZXggPCBjb21wcHRyLT5NQ1VfaGVpZ2h0OyB5aW5kZXgrKykgewotCSAgYnVmZmVyX3B0ciA9IGJ1ZmZlcltjaV1beWluZGV4K3lvZmZzZXRdICsgc3RhcnRfY29sOwotCSAgZm9yICh4aW5kZXggPSAwOyB4aW5kZXggPCBjb21wcHRyLT5NQ1Vfd2lkdGg7IHhpbmRleCsrKSB7Ci0JICAgIGNvZWYtPk1DVV9idWZmZXJbYmxrbisrXSA9IGJ1ZmZlcl9wdHIrKzsKLQkgIH0KLQl9Ci0gICAgICB9Ci0gICAgICAvKiBUcnkgdG8gZmV0Y2ggdGhlIE1DVS4gKi8KLSAgICAgIGlmICghICgqY2luZm8tPmVudHJvcHktPmRlY29kZV9tY3UpIChjaW5mbywgY29lZi0+TUNVX2J1ZmZlcikpIHsKLQkvKiBTdXNwZW5zaW9uIGZvcmNlZDsgdXBkYXRlIHN0YXRlIGNvdW50ZXJzIGFuZCBleGl0ICovCi0JY29lZi0+TUNVX3ZlcnRfb2Zmc2V0ID0geW9mZnNldDsKLQljb2VmLT5NQ1VfY3RyID0gTUNVX2NvbF9udW07Ci0JcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgfQotICAgIH0KLSAgICAvKiBDb21wbGV0ZWQgYW4gTUNVIHJvdywgYnV0IHBlcmhhcHMgbm90IGFuIGlNQ1Ugcm93ICovCi0gICAgY29lZi0+TUNVX2N0ciA9IDA7Ci0gIH0KLSAgLyogQ29tcGxldGVkIHRoZSBpTUNVIHJvdywgYWR2YW5jZSBjb3VudGVycyBmb3IgbmV4dCBvbmUgKi8KLSAgaWYgKCsrKGNpbmZvLT5pbnB1dF9pTUNVX3JvdykgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKSB7Ci0gICAgc3RhcnRfaU1DVV9yb3coY2luZm8pOwotICAgIHJldHVybiBKUEVHX1JPV19DT01QTEVURUQ7Ci0gIH0KLSAgLyogQ29tcGxldGVkIHRoZSBzY2FuICovCi0gICgqY2luZm8tPmlucHV0Y3RsLT5maW5pc2hfaW5wdXRfcGFzcykgKGNpbmZvKTsKLSAgcmV0dXJuIEpQRUdfU0NBTl9DT01QTEVURUQ7Ci19Ci0KLQotLyoKLSAqIERlY29tcHJlc3MgYW5kIHJldHVybiBzb21lIGRhdGEgaW4gdGhlIG11bHRpLXBhc3MgY2FzZS4KLSAqIEFsd2F5cyBhdHRlbXB0cyB0byBlbWl0IG9uZSBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93ICgiaU1DVSIgcm93KS4KLSAqIFJldHVybiB2YWx1ZSBpcyBKUEVHX1JPV19DT01QTEVURUQsIEpQRUdfU0NBTl9DT01QTEVURUQsIG9yIEpQRUdfU1VTUEVOREVELgotICoKLSAqIE5COiBvdXRwdXRfYnVmIGNvbnRhaW5zIGEgcGxhbmUgZm9yIGVhY2ggY29tcG9uZW50IGluIGltYWdlLgotICovCi0KLU1FVEhPRERFRihpbnQpCi1kZWNvbXByZXNzX2RhdGEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikKLXsKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0gIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOwotICBKRElNRU5TSU9OIGJsb2NrX251bTsKLSAgaW50IGNpLCBibG9ja19yb3csIGJsb2NrX3Jvd3M7Ci0gIEpCTE9DS0FSUkFZIGJ1ZmZlcjsKLSAgSkJMT0NLUk9XIGJ1ZmZlcl9wdHI7Ci0gIEpTQU1QQVJSQVkgb3V0cHV0X3B0cjsKLSAgSkRJTUVOU0lPTiBvdXRwdXRfY29sOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIGludmVyc2VfRENUOwotCi0gIC8qIEZvcmNlIHNvbWUgaW5wdXQgdG8gYmUgZG9uZSBpZiB3ZSBhcmUgZ2V0dGluZyBhaGVhZCBvZiB0aGUgaW5wdXQuICovCi0gIHdoaWxlIChjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPCBjaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyIHx8Ci0JIChjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPT0gY2luZm8tPm91dHB1dF9zY2FuX251bWJlciAmJgotCSAgY2luZm8tPmlucHV0X2lNQ1Vfcm93IDw9IGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cpKSB7Ci0gICAgaWYgKCgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KShjaW5mbykgPT0gSlBFR19TVVNQRU5ERUQpCi0gICAgICByZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gIH0KLQotICAvKiBPSywgb3V0cHV0IGZyb20gdGhlIHZpcnR1YWwgYXJyYXlzLiAqLwotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIC8qIERvbid0IGJvdGhlciB0byBJRENUIGFuIHVuaW50ZXJlc3RpbmcgY29tcG9uZW50LiAqLwotICAgIGlmICghIGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQpCi0gICAgICBjb250aW51ZTsKLSAgICAvKiBBbGlnbiB0aGUgdmlydHVhbCBidWZmZXIgZm9yIHRoaXMgY29tcG9uZW50LiAqLwotICAgIGJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWNjZXNzX3ZpcnRfYmFycmF5KQotICAgICAgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBjb2VmLT53aG9sZV9pbWFnZVtjaV0sCi0gICAgICAgY2luZm8tPm91dHB1dF9pTUNVX3JvdyAqIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCi0gICAgICAgKEpESU1FTlNJT04pIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsIEZBTFNFKTsKLSAgICAvKiBDb3VudCBub24tZHVtbXkgRENUIGJsb2NrIHJvd3MgaW4gdGhpcyBpTUNVIHJvdy4gKi8KLSAgICBpZiAoY2luZm8tPm91dHB1dF9pTUNVX3JvdyA8IGxhc3RfaU1DVV9yb3cpCi0gICAgICBibG9ja19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSAgICBlbHNlIHsKLSAgICAgIC8qIE5COiBjYW4ndCB1c2UgbGFzdF9yb3dfaGVpZ2h0IGhlcmU7IGl0IGlzIGlucHV0LXNpZGUtZGVwZW5kZW50ISAqLwotICAgICAgYmxvY2tfcm93cyA9IChpbnQpIChjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzICUgY29tcHB0ci0+dl9zYW1wX2ZhY3Rvcik7Ci0gICAgICBpZiAoYmxvY2tfcm93cyA9PSAwKSBibG9ja19yb3dzID0gY29tcHB0ci0+dl9zYW1wX2ZhY3RvcjsKLSAgICB9Ci0gICAgaW52ZXJzZV9EQ1QgPSBjaW5mby0+aWRjdC0+aW52ZXJzZV9EQ1RbY2ldOwotICAgIG91dHB1dF9wdHIgPSBvdXRwdXRfYnVmW2NpXTsKLSAgICAvKiBMb29wIG92ZXIgYWxsIERDVCBibG9ja3MgdG8gYmUgcHJvY2Vzc2VkLiAqLwotICAgIGZvciAoYmxvY2tfcm93ID0gMDsgYmxvY2tfcm93IDwgYmxvY2tfcm93czsgYmxvY2tfcm93KyspIHsKLSAgICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXJbYmxvY2tfcm93XTsKLSAgICAgIG91dHB1dF9jb2wgPSAwOwotICAgICAgZm9yIChibG9ja19udW0gPSAwOyBibG9ja19udW0gPCBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7IGJsb2NrX251bSsrKSB7Ci0JKCppbnZlcnNlX0RDVCkgKGNpbmZvLCBjb21wcHRyLCAoSkNPRUZQVFIpIGJ1ZmZlcl9wdHIsCi0JCQlvdXRwdXRfcHRyLCBvdXRwdXRfY29sKTsKLQlidWZmZXJfcHRyKys7Ci0Jb3V0cHV0X2NvbCArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0gICAgICB9Ci0gICAgICBvdXRwdXRfcHRyICs9IGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZTsKLSAgICB9Ci0gIH0KLQotICBpZiAoKysoY2luZm8tPm91dHB1dF9pTUNVX3JvdykgPCBjaW5mby0+dG90YWxfaU1DVV9yb3dzKQotICAgIHJldHVybiBKUEVHX1JPV19DT01QTEVURUQ7Ci0gIHJldHVybiBKUEVHX1NDQU5fQ09NUExFVEVEOwotfQotCi0jZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCi0KLQotI2lmZGVmIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQKLQotLyoKLSAqIFRoaXMgY29kZSBhcHBsaWVzIGludGVyYmxvY2sgc21vb3RoaW5nIGFzIGRlc2NyaWJlZCBieSBzZWN0aW9uIEsuOAotICogb2YgdGhlIEpQRUcgc3RhbmRhcmQ6IHRoZSBmaXJzdCA1IEFDIGNvZWZmaWNpZW50cyBhcmUgZXN0aW1hdGVkIGZyb20KLSAqIHRoZSBEQyB2YWx1ZXMgb2YgYSBEQ1QgYmxvY2sgYW5kIGl0cyA4IG5laWdoYm9yaW5nIGJsb2Nrcy4KLSAqIFdlIGFwcGx5IHNtb290aGluZyBvbmx5IGZvciBwcm9ncmVzc2l2ZSBKUEVHIGRlY29kaW5nLCBhbmQgb25seSBpZgotICogdGhlIGNvZWZmaWNpZW50cyBpdCBjYW4gZXN0aW1hdGUgYXJlIG5vdCB5ZXQga25vd24gdG8gZnVsbCBwcmVjaXNpb24uCi0gKi8KLQotLyogTmF0dXJhbC1vcmRlciBhcnJheSBwb3NpdGlvbnMgb2YgdGhlIGZpcnN0IDUgemlnemFnLW9yZGVyIGNvZWZmaWNpZW50cyAqLwotI2RlZmluZSBRMDFfUE9TICAxCi0jZGVmaW5lIFExMF9QT1MgIDgKLSNkZWZpbmUgUTIwX1BPUyAgMTYKLSNkZWZpbmUgUTExX1BPUyAgOQotI2RlZmluZSBRMDJfUE9TICAyCi0KLS8qCi0gKiBEZXRlcm1pbmUgd2hldGhlciBibG9jayBzbW9vdGhpbmcgaXMgYXBwbGljYWJsZSBhbmQgc2FmZS4KLSAqIFdlIGFsc28gbGF0Y2ggdGhlIGN1cnJlbnQgc3RhdGVzIG9mIHRoZSBjb2VmX2JpdHNbXSBlbnRyaWVzIGZvciB0aGUKLSAqIEFDIGNvZWZmaWNpZW50czsgb3RoZXJ3aXNlLCBpZiB0aGUgaW5wdXQgc2lkZSBvZiB0aGUgZGVjb21wcmVzc29yCi0gKiBhZHZhbmNlcyBpbnRvIGEgbmV3IHNjYW4sIHdlIG1pZ2h0IHRoaW5rIHRoZSBjb2VmZmljaWVudHMgYXJlIGtub3duCi0gKiBtb3JlIGFjY3VyYXRlbHkgdGhhbiB0aGV5IHJlYWxseSBhcmUuCi0gKi8KLQotTE9DQUwoYm9vbGVhbikKLXNtb290aGluZ19vayAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0gIGJvb2xlYW4gc21vb3RoaW5nX3VzZWZ1bCA9IEZBTFNFOwotICBpbnQgY2ksIGNvZWZpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICBKUVVBTlRfVEJMICogcXRhYmxlOwotICBpbnQgKiBjb2VmX2JpdHM7Ci0gIGludCAqIGNvZWZfYml0c19sYXRjaDsKLQotICBpZiAoISBjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSB8fCBjaW5mby0+Y29lZl9iaXRzID09IE5VTEwpCi0gICAgcmV0dXJuIEZBTFNFOwotCi0gIC8qIEFsbG9jYXRlIGxhdGNoIGFyZWEgaWYgbm90IGFscmVhZHkgZG9uZSAqLwotICBpZiAoY29lZi0+Y29lZl9iaXRzX2xhdGNoID09IE5VTEwpCi0gICAgY29lZi0+Y29lZl9iaXRzX2xhdGNoID0gKGludCAqKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIGNpbmZvLT5udW1fY29tcG9uZW50cyAqCi0JCQkJICAoU0FWRURfQ09FRlMgKiBTSVpFT0YoaW50KSkpOwotICBjb2VmX2JpdHNfbGF0Y2ggPSBjb2VmLT5jb2VmX2JpdHNfbGF0Y2g7Ci0KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAvKiBBbGwgY29tcG9uZW50cycgcXVhbnRpemF0aW9uIHZhbHVlcyBtdXN0IGFscmVhZHkgYmUgbGF0Y2hlZC4gKi8KLSAgICBpZiAoKHF0YWJsZSA9IGNvbXBwdHItPnF1YW50X3RhYmxlKSA9PSBOVUxMKQotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIC8qIFZlcmlmeSBEQyAmIGZpcnN0IDUgQUMgcXVhbnRpemVycyBhcmUgbm9uemVybyB0byBhdm9pZCB6ZXJvLWRpdmlkZS4gKi8KLSAgICBpZiAocXRhYmxlLT5xdWFudHZhbFswXSA9PSAwIHx8Ci0JcXRhYmxlLT5xdWFudHZhbFtRMDFfUE9TXSA9PSAwIHx8Ci0JcXRhYmxlLT5xdWFudHZhbFtRMTBfUE9TXSA9PSAwIHx8Ci0JcXRhYmxlLT5xdWFudHZhbFtRMjBfUE9TXSA9PSAwIHx8Ci0JcXRhYmxlLT5xdWFudHZhbFtRMTFfUE9TXSA9PSAwIHx8Ci0JcXRhYmxlLT5xdWFudHZhbFtRMDJfUE9TXSA9PSAwKQotICAgICAgcmV0dXJuIEZBTFNFOwotICAgIC8qIERDIHZhbHVlcyBtdXN0IGJlIGF0IGxlYXN0IHBhcnRseSBrbm93biBmb3IgYWxsIGNvbXBvbmVudHMuICovCi0gICAgY29lZl9iaXRzID0gY2luZm8tPmNvZWZfYml0c1tjaV07Ci0gICAgaWYgKGNvZWZfYml0c1swXSA8IDApCi0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgLyogQmxvY2sgc21vb3RoaW5nIGlzIGhlbHBmdWwgaWYgc29tZSBBQyBjb2VmZmljaWVudHMgcmVtYWluIGluYWNjdXJhdGUuICovCi0gICAgZm9yIChjb2VmaSA9IDE7IGNvZWZpIDw9IDU7IGNvZWZpKyspIHsKLSAgICAgIGNvZWZfYml0c19sYXRjaFtjb2VmaV0gPSBjb2VmX2JpdHNbY29lZmldOwotICAgICAgaWYgKGNvZWZfYml0c1tjb2VmaV0gIT0gMCkKLQlzbW9vdGhpbmdfdXNlZnVsID0gVFJVRTsKLSAgICB9Ci0gICAgY29lZl9iaXRzX2xhdGNoICs9IFNBVkVEX0NPRUZTOwotICB9Ci0KLSAgcmV0dXJuIHNtb290aGluZ191c2VmdWw7Ci19Ci0KLQotLyoKLSAqIFZhcmlhbnQgb2YgZGVjb21wcmVzc19kYXRhIGZvciB1c2Ugd2hlbiBkb2luZyBibG9jayBzbW9vdGhpbmcuCi0gKi8KLQotTUVUSE9EREVGKGludCkKLWRlY29tcHJlc3Nfc21vb3RoX2RhdGEgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikKLXsKLSAgbXlfY29lZl9wdHIgY29lZiA9IChteV9jb2VmX3B0cikgY2luZm8tPmNvZWY7Ci0gIEpESU1FTlNJT04gbGFzdF9pTUNVX3JvdyA9IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MgLSAxOwotICBKRElNRU5TSU9OIGJsb2NrX251bSwgbGFzdF9ibG9ja19jb2x1bW47Ci0gIGludCBjaSwgYmxvY2tfcm93LCBibG9ja19yb3dzLCBhY2Nlc3Nfcm93czsKLSAgSkJMT0NLQVJSQVkgYnVmZmVyOwotICBKQkxPQ0tST1cgYnVmZmVyX3B0ciwgcHJldl9ibG9ja19yb3csIG5leHRfYmxvY2tfcm93OwotICBKU0FNUEFSUkFZIG91dHB1dF9wdHI7Ci0gIEpESU1FTlNJT04gb3V0cHV0X2NvbDsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLSAgaW52ZXJzZV9EQ1RfbWV0aG9kX3B0ciBpbnZlcnNlX0RDVDsKLSAgYm9vbGVhbiBmaXJzdF9yb3csIGxhc3Rfcm93OwotICBKQkxPQ0sgd29ya3NwYWNlOwotICBpbnQgKmNvZWZfYml0czsKLSAgSlFVQU5UX1RCTCAqcXVhbnR0Ymw7Ci0gIElOVDMyIFEwMCxRMDEsUTAyLFExMCxRMTEsUTIwLCBudW07Ci0gIGludCBEQzEsREMyLERDMyxEQzQsREM1LERDNixEQzcsREM4LERDOTsKLSAgaW50IEFsLCBwcmVkOwotCi0gIC8qIEZvcmNlIHNvbWUgaW5wdXQgdG8gYmUgZG9uZSBpZiB3ZSBhcmUgZ2V0dGluZyBhaGVhZCBvZiB0aGUgaW5wdXQuICovCi0gIHdoaWxlIChjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPD0gY2luZm8tPm91dHB1dF9zY2FuX251bWJlciAmJgotCSAhIGNpbmZvLT5pbnB1dGN0bC0+ZW9pX3JlYWNoZWQpIHsKLSAgICBpZiAoY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyID09IGNpbmZvLT5vdXRwdXRfc2Nhbl9udW1iZXIpIHsKLSAgICAgIC8qIElmIGlucHV0IGlzIHdvcmtpbmcgb24gY3VycmVudCBzY2FuLCB3ZSBvcmRpbmFyaWx5IHdhbnQgaXQgdG8KLSAgICAgICAqIGhhdmUgY29tcGxldGVkIHRoZSBjdXJyZW50IHJvdy4gIEJ1dCBpZiBpbnB1dCBzY2FuIGlzIERDLAotICAgICAgICogd2Ugd2FudCBpdCB0byBrZWVwIG9uZSByb3cgYWhlYWQgc28gdGhhdCBuZXh0IGJsb2NrIHJvdydzIERDCi0gICAgICAgKiB2YWx1ZXMgYXJlIHVwIHRvIGRhdGUuCi0gICAgICAgKi8KLSAgICAgIEpESU1FTlNJT04gZGVsdGEgPSAoY2luZm8tPlNzID09IDApID8gMSA6IDA7Ci0gICAgICBpZiAoY2luZm8tPmlucHV0X2lNQ1Vfcm93ID4gY2luZm8tPm91dHB1dF9pTUNVX3JvdytkZWx0YSkKLQlicmVhazsKLSAgICB9Ci0gICAgaWYgKCgqY2luZm8tPmlucHV0Y3RsLT5jb25zdW1lX2lucHV0KShjaW5mbykgPT0gSlBFR19TVVNQRU5ERUQpCi0gICAgICByZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gIH0KLQotICAvKiBPSywgb3V0cHV0IGZyb20gdGhlIHZpcnR1YWwgYXJyYXlzLiAqLwotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIC8qIERvbid0IGJvdGhlciB0byBJRENUIGFuIHVuaW50ZXJlc3RpbmcgY29tcG9uZW50LiAqLwotICAgIGlmICghIGNvbXBwdHItPmNvbXBvbmVudF9uZWVkZWQpCi0gICAgICBjb250aW51ZTsKLSAgICAvKiBDb3VudCBub24tZHVtbXkgRENUIGJsb2NrIHJvd3MgaW4gdGhpcyBpTUNVIHJvdy4gKi8KLSAgICBpZiAoY2luZm8tPm91dHB1dF9pTUNVX3JvdyA8IGxhc3RfaU1DVV9yb3cpIHsKLSAgICAgIGJsb2NrX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwotICAgICAgYWNjZXNzX3Jvd3MgPSBibG9ja19yb3dzICogMjsgLyogdGhpcyBhbmQgbmV4dCBpTUNVIHJvdyAqLwotICAgICAgbGFzdF9yb3cgPSBGQUxTRTsKLSAgICB9IGVsc2UgewotICAgICAgLyogTkI6IGNhbid0IHVzZSBsYXN0X3Jvd19oZWlnaHQgaGVyZTsgaXQgaXMgaW5wdXQtc2lkZS1kZXBlbmRlbnQhICovCi0gICAgICBibG9ja19yb3dzID0gKGludCkgKGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgJSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKLSAgICAgIGlmIChibG9ja19yb3dzID09IDApIGJsb2NrX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwotICAgICAgYWNjZXNzX3Jvd3MgPSBibG9ja19yb3dzOyAvKiB0aGlzIGlNQ1Ugcm93IG9ubHkgKi8KLSAgICAgIGxhc3Rfcm93ID0gVFJVRTsKLSAgICB9Ci0gICAgLyogQWxpZ24gdGhlIHZpcnR1YWwgYnVmZmVyIGZvciB0aGlzIGNvbXBvbmVudC4gKi8KLSAgICBpZiAoY2luZm8tPm91dHB1dF9pTUNVX3JvdyA+IDApIHsKLSAgICAgIGFjY2Vzc19yb3dzICs9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7IC8qIHByaW9yIGlNQ1Ugcm93IHRvbyAqLwotICAgICAgYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBjb2VmLT53aG9sZV9pbWFnZVtjaV0sCi0JIChjaW5mby0+b3V0cHV0X2lNQ1Vfcm93IC0gMSkgKiBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAotCSAoSkRJTUVOU0lPTikgYWNjZXNzX3Jvd3MsIEZBTFNFKTsKLSAgICAgIGJ1ZmZlciArPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwkvKiBwb2ludCB0byBjdXJyZW50IGlNQ1Ugcm93ICovCi0gICAgICBmaXJzdF9yb3cgPSBGQUxTRTsKLSAgICB9IGVsc2UgewotICAgICAgYnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9iYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBjb2VmLT53aG9sZV9pbWFnZVtjaV0sCi0JIChKRElNRU5TSU9OKSAwLCAoSkRJTUVOU0lPTikgYWNjZXNzX3Jvd3MsIEZBTFNFKTsKLSAgICAgIGZpcnN0X3JvdyA9IFRSVUU7Ci0gICAgfQotICAgIC8qIEZldGNoIGNvbXBvbmVudC1kZXBlbmRlbnQgaW5mbyAqLwotICAgIGNvZWZfYml0cyA9IGNvZWYtPmNvZWZfYml0c19sYXRjaCArIChjaSAqIFNBVkVEX0NPRUZTKTsKLSAgICBxdWFudHRibCA9IGNvbXBwdHItPnF1YW50X3RhYmxlOwotICAgIFEwMCA9IHF1YW50dGJsLT5xdWFudHZhbFswXTsKLSAgICBRMDEgPSBxdWFudHRibC0+cXVhbnR2YWxbUTAxX1BPU107Ci0gICAgUTEwID0gcXVhbnR0YmwtPnF1YW50dmFsW1ExMF9QT1NdOwotICAgIFEyMCA9IHF1YW50dGJsLT5xdWFudHZhbFtRMjBfUE9TXTsKLSAgICBRMTEgPSBxdWFudHRibC0+cXVhbnR2YWxbUTExX1BPU107Ci0gICAgUTAyID0gcXVhbnR0YmwtPnF1YW50dmFsW1EwMl9QT1NdOwotICAgIGludmVyc2VfRENUID0gY2luZm8tPmlkY3QtPmludmVyc2VfRENUW2NpXTsKLSAgICBvdXRwdXRfcHRyID0gb3V0cHV0X2J1ZltjaV07Ci0gICAgLyogTG9vcCBvdmVyIGFsbCBEQ1QgYmxvY2tzIHRvIGJlIHByb2Nlc3NlZC4gKi8KLSAgICBmb3IgKGJsb2NrX3JvdyA9IDA7IGJsb2NrX3JvdyA8IGJsb2NrX3Jvd3M7IGJsb2NrX3JvdysrKSB7Ci0gICAgICBidWZmZXJfcHRyID0gYnVmZmVyW2Jsb2NrX3Jvd107Ci0gICAgICBpZiAoZmlyc3Rfcm93ICYmIGJsb2NrX3JvdyA9PSAwKQotCXByZXZfYmxvY2tfcm93ID0gYnVmZmVyX3B0cjsKLSAgICAgIGVsc2UKLQlwcmV2X2Jsb2NrX3JvdyA9IGJ1ZmZlcltibG9ja19yb3ctMV07Ci0gICAgICBpZiAobGFzdF9yb3cgJiYgYmxvY2tfcm93ID09IGJsb2NrX3Jvd3MtMSkKLQluZXh0X2Jsb2NrX3JvdyA9IGJ1ZmZlcl9wdHI7Ci0gICAgICBlbHNlCi0JbmV4dF9ibG9ja19yb3cgPSBidWZmZXJbYmxvY2tfcm93KzFdOwotICAgICAgLyogV2UgZmV0Y2ggdGhlIHN1cnJvdW5kaW5nIERDIHZhbHVlcyB1c2luZyBhIHNsaWRpbmctcmVnaXN0ZXIgYXBwcm9hY2guCi0gICAgICAgKiBJbml0aWFsaXplIGFsbCBuaW5lIGhlcmUgc28gYXMgdG8gZG8gdGhlIHJpZ2h0IHRoaW5nIG9uIG5hcnJvdyBwaWNzLgotICAgICAgICovCi0gICAgICBEQzEgPSBEQzIgPSBEQzMgPSAoaW50KSBwcmV2X2Jsb2NrX3Jvd1swXVswXTsKLSAgICAgIERDNCA9IERDNSA9IERDNiA9IChpbnQpIGJ1ZmZlcl9wdHJbMF1bMF07Ci0gICAgICBEQzcgPSBEQzggPSBEQzkgPSAoaW50KSBuZXh0X2Jsb2NrX3Jvd1swXVswXTsKLSAgICAgIG91dHB1dF9jb2wgPSAwOwotICAgICAgbGFzdF9ibG9ja19jb2x1bW4gPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgLSAxOwotICAgICAgZm9yIChibG9ja19udW0gPSAwOyBibG9ja19udW0gPD0gbGFzdF9ibG9ja19jb2x1bW47IGJsb2NrX251bSsrKSB7Ci0JLyogRmV0Y2ggY3VycmVudCBEQ1QgYmxvY2sgaW50byB3b3Jrc3BhY2Ugc28gd2UgY2FuIG1vZGlmeSBpdC4gKi8KLQlqY29weV9ibG9ja19yb3coYnVmZmVyX3B0ciwgKEpCTE9DS1JPVykgd29ya3NwYWNlLCAoSkRJTUVOU0lPTikgMSk7Ci0JLyogVXBkYXRlIERDIHZhbHVlcyAqLwotCWlmIChibG9ja19udW0gPCBsYXN0X2Jsb2NrX2NvbHVtbikgewotCSAgREMzID0gKGludCkgcHJldl9ibG9ja19yb3dbMV1bMF07Ci0JICBEQzYgPSAoaW50KSBidWZmZXJfcHRyWzFdWzBdOwotCSAgREM5ID0gKGludCkgbmV4dF9ibG9ja19yb3dbMV1bMF07Ci0JfQotCS8qIENvbXB1dGUgY29lZmZpY2llbnQgZXN0aW1hdGVzIHBlciBLLjguCi0JICogQW4gZXN0aW1hdGUgaXMgYXBwbGllZCBvbmx5IGlmIGNvZWZmaWNpZW50IGlzIHN0aWxsIHplcm8sCi0JICogYW5kIGlzIG5vdCBrbm93biB0byBiZSBmdWxseSBhY2N1cmF0ZS4KLQkgKi8KLQkvKiBBQzAxICovCi0JaWYgKChBbD1jb2VmX2JpdHNbMV0pICE9IDAgJiYgd29ya3NwYWNlWzFdID09IDApIHsKLQkgIG51bSA9IDM2ICogUTAwICogKERDNCAtIERDNik7Ci0JICBpZiAobnVtID49IDApIHsKLQkgICAgcHJlZCA9IChpbnQpICgoKFEwMTw8NykgKyBudW0pIC8gKFEwMTw8OCkpOwotCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKLQkgICAgICBwcmVkID0gKDE8PEFsKS0xOwotCSAgfSBlbHNlIHsKLQkgICAgcHJlZCA9IChpbnQpICgoKFEwMTw8NykgLSBudW0pIC8gKFEwMTw8OCkpOwotCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKLQkgICAgICBwcmVkID0gKDE8PEFsKS0xOwotCSAgICBwcmVkID0gLXByZWQ7Ci0JICB9Ci0JICB3b3Jrc3BhY2VbMV0gPSAoSkNPRUYpIHByZWQ7Ci0JfQotCS8qIEFDMTAgKi8KLQlpZiAoKEFsPWNvZWZfYml0c1syXSkgIT0gMCAmJiB3b3Jrc3BhY2VbOF0gPT0gMCkgewotCSAgbnVtID0gMzYgKiBRMDAgKiAoREMyIC0gREM4KTsKLQkgIGlmIChudW0gPj0gMCkgewotCSAgICBwcmVkID0gKGludCkgKCgoUTEwPDw3KSArIG51bSkgLyAoUTEwPDw4KSk7Ci0JICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQotCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7Ci0JICB9IGVsc2UgewotCSAgICBwcmVkID0gKGludCkgKCgoUTEwPDw3KSAtIG51bSkgLyAoUTEwPDw4KSk7Ci0JICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQotCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7Ci0JICAgIHByZWQgPSAtcHJlZDsKLQkgIH0KLQkgIHdvcmtzcGFjZVs4XSA9IChKQ09FRikgcHJlZDsKLQl9Ci0JLyogQUMyMCAqLwotCWlmICgoQWw9Y29lZl9iaXRzWzNdKSAhPSAwICYmIHdvcmtzcGFjZVsxNl0gPT0gMCkgewotCSAgbnVtID0gOSAqIFEwMCAqIChEQzIgKyBEQzggLSAyKkRDNSk7Ci0JICBpZiAobnVtID49IDApIHsKLQkgICAgcHJlZCA9IChpbnQpICgoKFEyMDw8NykgKyBudW0pIC8gKFEyMDw8OCkpOwotCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKLQkgICAgICBwcmVkID0gKDE8PEFsKS0xOwotCSAgfSBlbHNlIHsKLQkgICAgcHJlZCA9IChpbnQpICgoKFEyMDw8NykgLSBudW0pIC8gKFEyMDw8OCkpOwotCSAgICBpZiAoQWwgPiAwICYmIHByZWQgPj0gKDE8PEFsKSkKLQkgICAgICBwcmVkID0gKDE8PEFsKS0xOwotCSAgICBwcmVkID0gLXByZWQ7Ci0JICB9Ci0JICB3b3Jrc3BhY2VbMTZdID0gKEpDT0VGKSBwcmVkOwotCX0KLQkvKiBBQzExICovCi0JaWYgKChBbD1jb2VmX2JpdHNbNF0pICE9IDAgJiYgd29ya3NwYWNlWzldID09IDApIHsKLQkgIG51bSA9IDUgKiBRMDAgKiAoREMxIC0gREMzIC0gREM3ICsgREM5KTsKLQkgIGlmIChudW0gPj0gMCkgewotCSAgICBwcmVkID0gKGludCkgKCgoUTExPDw3KSArIG51bSkgLyAoUTExPDw4KSk7Ci0JICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQotCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7Ci0JICB9IGVsc2UgewotCSAgICBwcmVkID0gKGludCkgKCgoUTExPDw3KSAtIG51bSkgLyAoUTExPDw4KSk7Ci0JICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQotCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7Ci0JICAgIHByZWQgPSAtcHJlZDsKLQkgIH0KLQkgIHdvcmtzcGFjZVs5XSA9IChKQ09FRikgcHJlZDsKLQl9Ci0JLyogQUMwMiAqLwotCWlmICgoQWw9Y29lZl9iaXRzWzVdKSAhPSAwICYmIHdvcmtzcGFjZVsyXSA9PSAwKSB7Ci0JICBudW0gPSA5ICogUTAwICogKERDNCArIERDNiAtIDIqREM1KTsKLQkgIGlmIChudW0gPj0gMCkgewotCSAgICBwcmVkID0gKGludCkgKCgoUTAyPDw3KSArIG51bSkgLyAoUTAyPDw4KSk7Ci0JICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQotCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7Ci0JICB9IGVsc2UgewotCSAgICBwcmVkID0gKGludCkgKCgoUTAyPDw3KSAtIG51bSkgLyAoUTAyPDw4KSk7Ci0JICAgIGlmIChBbCA+IDAgJiYgcHJlZCA+PSAoMTw8QWwpKQotCSAgICAgIHByZWQgPSAoMTw8QWwpLTE7Ci0JICAgIHByZWQgPSAtcHJlZDsKLQkgIH0KLQkgIHdvcmtzcGFjZVsyXSA9IChKQ09FRikgcHJlZDsKLQl9Ci0JLyogT0ssIGRvIHRoZSBJRENUICovCi0JKCppbnZlcnNlX0RDVCkgKGNpbmZvLCBjb21wcHRyLCAoSkNPRUZQVFIpIHdvcmtzcGFjZSwKLQkJCW91dHB1dF9wdHIsIG91dHB1dF9jb2wpOwotCS8qIEFkdmFuY2UgZm9yIG5leHQgY29sdW1uICovCi0JREMxID0gREMyOyBEQzIgPSBEQzM7Ci0JREM0ID0gREM1OyBEQzUgPSBEQzY7Ci0JREM3ID0gREM4OyBEQzggPSBEQzk7Ci0JYnVmZmVyX3B0cisrLCBwcmV2X2Jsb2NrX3JvdysrLCBuZXh0X2Jsb2NrX3JvdysrOwotCW91dHB1dF9jb2wgKz0gY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOwotICAgICAgfQotICAgICAgb3V0cHV0X3B0ciArPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCsrKGNpbmZvLT5vdXRwdXRfaU1DVV9yb3cpIDwgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cykKLSAgICByZXR1cm4gSlBFR19ST1dfQ09NUExFVEVEOwotICByZXR1cm4gSlBFR19TQ0FOX0NPTVBMRVRFRDsKLX0KLQotI2VuZGlmIC8qIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQgKi8KLQotCi0vKgotICogSW5pdGlhbGl6ZSBjb2VmZmljaWVudCBidWZmZXIgY29udHJvbGxlci4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X2RfY29lZl9jb250cm9sbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpCi17Ci0gIG15X2NvZWZfcHRyIGNvZWY7Ci0KLSAgY29lZiA9IChteV9jb2VmX3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihteV9jb2VmX2NvbnRyb2xsZXIpKTsKLSAgY2luZm8tPmNvZWYgPSAoc3RydWN0IGpwZWdfZF9jb2VmX2NvbnRyb2xsZXIgKikgY29lZjsKLSAgY29lZi0+cHViLnN0YXJ0X2lucHV0X3Bhc3MgPSBzdGFydF9pbnB1dF9wYXNzOwotICBjb2VmLT5wdWIuc3RhcnRfb3V0cHV0X3Bhc3MgPSBzdGFydF9vdXRwdXRfcGFzczsKLSNpZmRlZiBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVECi0gIGNvZWYtPmNvZWZfYml0c19sYXRjaCA9IE5VTEw7Ci0jZW5kaWYKLQotICAvKiBDcmVhdGUgdGhlIGNvZWZmaWNpZW50IGJ1ZmZlci4gKi8KLSAgaWYgKG5lZWRfZnVsbF9idWZmZXIpIHsKLSNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLSAgICAvKiBBbGxvY2F0ZSBhIGZ1bGwtaW1hZ2UgdmlydHVhbCBhcnJheSBmb3IgZWFjaCBjb21wb25lbnQsICovCi0gICAgLyogcGFkZGVkIHRvIGEgbXVsdGlwbGUgb2Ygc2FtcF9mYWN0b3IgRENUIGJsb2NrcyBpbiBlYWNoIGRpcmVjdGlvbi4gKi8KLSAgICAvKiBOb3RlIHdlIGFzayBmb3IgYSBwcmUtemVyb2VkIGFycmF5LiAqLwotICAgIGludCBjaSwgYWNjZXNzX3Jvd3M7Ci0gICAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0JIGNpKyssIGNvbXBwdHIrKykgewotICAgICAgYWNjZXNzX3Jvd3MgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yOwotI2lmZGVmIEJMT0NLX1NNT09USElOR19TVVBQT1JURUQKLSAgICAgIC8qIElmIGJsb2NrIHNtb290aGluZyBjb3VsZCBiZSB1c2VkLCBuZWVkIGEgYmlnZ2VyIHdpbmRvdyAqLwotICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKQotCWFjY2Vzc19yb3dzICo9IDM7Ci0jZW5kaWYKLSAgICAgIGNvZWYtPndob2xlX2ltYWdlW2NpXSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X2JhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBUUlVFLAotCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MsCi0JCQkJKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IpLAotCSAoSkRJTUVOU0lPTikganJvdW5kX3VwKChsb25nKSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzLAotCQkJCShsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKSwKLQkgKEpESU1FTlNJT04pIGFjY2Vzc19yb3dzKTsKLSAgICB9Ci0gICAgY29lZi0+cHViLmNvbnN1bWVfZGF0YSA9IGNvbnN1bWVfZGF0YTsKLSAgICBjb2VmLT5wdWIuZGVjb21wcmVzc19kYXRhID0gZGVjb21wcmVzc19kYXRhOwotICAgIGNvZWYtPnB1Yi5jb2VmX2FycmF5cyA9IGNvZWYtPndob2xlX2ltYWdlOyAvKiBsaW5rIHRvIHZpcnR1YWwgYXJyYXlzICovCi0jZWxzZQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICB9IGVsc2UgewotICAgIC8qIFdlIG9ubHkgbmVlZCBhIHNpbmdsZS1NQ1UgYnVmZmVyLiAqLwotICAgIEpCTE9DS1JPVyBidWZmZXI7Ci0gICAgaW50IGk7Ci0KLSAgICBidWZmZXIgPSAoSkJMT0NLUk9XKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19sYXJnZSkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIERfTUFYX0JMT0NLU19JTl9NQ1UgKiBTSVpFT0YoSkJMT0NLKSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IERfTUFYX0JMT0NLU19JTl9NQ1U7IGkrKykgewotICAgICAgY29lZi0+TUNVX2J1ZmZlcltpXSA9IGJ1ZmZlciArIGk7Ci0gICAgfQotICAgIGNvZWYtPnB1Yi5jb25zdW1lX2RhdGEgPSBkdW1teV9jb25zdW1lX2RhdGE7Ci0gICAgY29lZi0+cHViLmRlY29tcHJlc3NfZGF0YSA9IGRlY29tcHJlc3Nfb25lcGFzczsKLSAgICBjb2VmLT5wdWIuY29lZl9hcnJheXMgPSBOVUxMOyAvKiBmbGFnIGZvciBubyB2aXJ0dWFsIGFycmF5cyAqLwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRjb2xvci5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkY29sb3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMwNGRmZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRjb2xvci5jCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLS8qCi0gKiBqZGNvbG9yLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBvdXRwdXQgY29sb3JzcGFjZSBjb252ZXJzaW9uIHJvdXRpbmVzLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBQcml2YXRlIHN1Ym9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2NvbG9yX2RlY29udmVydGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIFByaXZhdGUgc3RhdGUgZm9yIFlDQy0+UkdCIGNvbnZlcnNpb24gKi8KLSAgaW50ICogQ3Jfcl90YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ3IgdG8gUiBjb252ZXJzaW9uICovCi0gIGludCAqIENiX2JfdGFiOwkJLyogPT4gdGFibGUgZm9yIENiIHRvIEIgY29udmVyc2lvbiAqLwotICBJTlQzMiAqIENyX2dfdGFiOwkJLyogPT4gdGFibGUgZm9yIENyIHRvIEcgY29udmVyc2lvbiAqLwotICBJTlQzMiAqIENiX2dfdGFiOwkJLyogPT4gdGFibGUgZm9yIENiIHRvIEcgY29udmVyc2lvbiAqLwotfSBteV9jb2xvcl9kZWNvbnZlcnRlcjsKLQotdHlwZWRlZiBteV9jb2xvcl9kZWNvbnZlcnRlciAqIG15X2Njb252ZXJ0X3B0cjsKLQotCi0vKioqKioqKioqKioqKioqKiBZQ2JDciAtPiBSR0IgY29udmVyc2lvbjogbW9zdCBjb21tb24gY2FzZSAqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFlDYkNyIGlzIGRlZmluZWQgcGVyIENDSVIgNjAxLTEsIGV4Y2VwdCB0aGF0IENiIGFuZCBDciBhcmUKLSAqIG5vcm1hbGl6ZWQgdG8gdGhlIHJhbmdlIDAuLk1BWEpTQU1QTEUgcmF0aGVyIHRoYW4gLTAuNSAuLiAwLjUuCi0gKiBUaGUgY29udmVyc2lvbiBlcXVhdGlvbnMgdG8gYmUgaW1wbGVtZW50ZWQgYXJlIHRoZXJlZm9yZQotICoJUiA9IFkgICAgICAgICAgICAgICAgKyAxLjQwMjAwICogQ3IKLSAqCUcgPSBZIC0gMC4zNDQxNCAqIENiIC0gMC43MTQxNCAqIENyCi0gKglCID0gWSArIDEuNzcyMDAgKiBDYgotICogd2hlcmUgQ2IgYW5kIENyIHJlcHJlc2VudCB0aGUgaW5jb21pbmcgdmFsdWVzIGxlc3MgQ0VOVEVSSlNBTVBMRS4KLSAqIChUaGVzZSBudW1iZXJzIGFyZSBkZXJpdmVkIGZyb20gVElGRiA2LjAgc2VjdGlvbiAyMSwgZGF0ZWQgMy1KdW5lLTkyLikKLSAqCi0gKiBUbyBhdm9pZCBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljLCB3ZSByZXByZXNlbnQgdGhlIGZyYWN0aW9uYWwgY29uc3RhbnRzCi0gKiBhcyBpbnRlZ2VycyBzY2FsZWQgdXAgYnkgMl4xNiAoYWJvdXQgNCBkaWdpdHMgcHJlY2lzaW9uKTsgd2UgaGF2ZSB0byBkaXZpZGUKLSAqIHRoZSBwcm9kdWN0cyBieSAyXjE2LCB3aXRoIGFwcHJvcHJpYXRlIHJvdW5kaW5nLCB0byBnZXQgdGhlIGNvcnJlY3QgYW5zd2VyLgotICogTm90aWNlIHRoYXQgWSwgYmVpbmcgYW4gaW50ZWdyYWwgaW5wdXQsIGRvZXMgbm90IGNvbnRyaWJ1dGUgYW55IGZyYWN0aW9uCi0gKiBzbyBpdCBuZWVkIG5vdCBwYXJ0aWNpcGF0ZSBpbiB0aGUgcm91bmRpbmcuCi0gKgotICogRm9yIGV2ZW4gbW9yZSBzcGVlZCwgd2UgYXZvaWQgZG9pbmcgYW55IG11bHRpcGxpY2F0aW9ucyBpbiB0aGUgaW5uZXIgbG9vcAotICogYnkgcHJlY2FsY3VsYXRpbmcgdGhlIGNvbnN0YW50cyB0aW1lcyBDYiBhbmQgQ3IgZm9yIGFsbCBwb3NzaWJsZSB2YWx1ZXMuCi0gKiBGb3IgOC1iaXQgSlNBTVBMRXMgdGhpcyBpcyB2ZXJ5IHJlYXNvbmFibGUgKG9ubHkgMjU2IGVudHJpZXMgcGVyIHRhYmxlKTsKLSAqIGZvciAxMi1iaXQgc2FtcGxlcyBpdCBpcyBzdGlsbCBhY2NlcHRhYmxlLiAgSXQncyBub3QgdmVyeSByZWFzb25hYmxlIGZvcgotICogMTYtYml0IHNhbXBsZXMsIGJ1dCBpZiB5b3Ugd2FudCBsb3NzbGVzcyBzdG9yYWdlIHlvdSBzaG91bGRuJ3QgYmUgY2hhbmdpbmcKLSAqIGNvbG9yc3BhY2UgYW55d2F5LgotICogVGhlIENyPT5SIGFuZCBDYj0+QiB2YWx1ZXMgY2FuIGJlIHJvdW5kZWQgdG8gaW50ZWdlcnMgaW4gYWR2YW5jZTsgdGhlCi0gKiB2YWx1ZXMgZm9yIHRoZSBHIGNhbGN1bGF0aW9uIGFyZSBsZWZ0IHNjYWxlZCB1cCwgc2luY2Ugd2UgbXVzdCBhZGQgdGhlbQotICogdG9nZXRoZXIgYmVmb3JlIHJvdW5kaW5nLgotICovCi0KLSNkZWZpbmUgU0NBTEVCSVRTCTE2CS8qIHNwZWVkaWVzdCByaWdodC1zaGlmdCBvbiBzb21lIG1hY2hpbmVzICovCi0jZGVmaW5lIE9ORV9IQUxGCSgoSU5UMzIpIDEgPDwgKFNDQUxFQklUUy0xKSkKLSNkZWZpbmUgRklYKHgpCQkoKElOVDMyKSAoKHgpICogKDFMPDxTQ0FMRUJJVFMpICsgMC41KSkKLQotCi0vKgotICogSW5pdGlhbGl6ZSB0YWJsZXMgZm9yIFlDQy0+UkdCIGNvbG9yc3BhY2UgY29udmVyc2lvbi4KLSAqLwotCi1MT0NBTCh2b2lkKQotYnVpbGRfeWNjX3JnYl90YWJsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OwotICBpbnQgaTsKLSAgSU5UMzIgeDsKLSAgU0hJRlRfVEVNUFMKLQotICBjY29udmVydC0+Q3Jfcl90YWIgPSAoaW50ICopCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihpbnQpKTsKLSAgY2NvbnZlcnQtPkNiX2JfdGFiID0gKGludCAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoaW50KSk7Ci0gIGNjb252ZXJ0LT5Dcl9nX3RhYiA9IChJTlQzMiAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoSU5UMzIpKTsKLSAgY2NvbnZlcnQtPkNiX2dfdGFiID0gKElOVDMyICopCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihJTlQzMikpOwotCi0gIGZvciAoaSA9IDAsIHggPSAtQ0VOVEVSSlNBTVBMRTsgaSA8PSBNQVhKU0FNUExFOyBpKyssIHgrKykgewotICAgIC8qIGkgaXMgdGhlIGFjdHVhbCBpbnB1dCBwaXhlbCB2YWx1ZSwgaW4gdGhlIHJhbmdlIDAuLk1BWEpTQU1QTEUgKi8KLSAgICAvKiBUaGUgQ2Igb3IgQ3IgdmFsdWUgd2UgYXJlIHRoaW5raW5nIG9mIGlzIHggPSBpIC0gQ0VOVEVSSlNBTVBMRSAqLwotICAgIC8qIENyPT5SIHZhbHVlIGlzIG5lYXJlc3QgaW50IHRvIDEuNDAyMDAgKiB4ICovCi0gICAgY2NvbnZlcnQtPkNyX3JfdGFiW2ldID0gKGludCkKLQkJICAgIFJJR0hUX1NISUZUKEZJWCgxLjQwMjAwKSAqIHggKyBPTkVfSEFMRiwgU0NBTEVCSVRTKTsKLSAgICAvKiBDYj0+QiB2YWx1ZSBpcyBuZWFyZXN0IGludCB0byAxLjc3MjAwICogeCAqLwotICAgIGNjb252ZXJ0LT5DYl9iX3RhYltpXSA9IChpbnQpCi0JCSAgICBSSUdIVF9TSElGVChGSVgoMS43NzIwMCkgKiB4ICsgT05FX0hBTEYsIFNDQUxFQklUUyk7Ci0gICAgLyogQ3I9PkcgdmFsdWUgaXMgc2NhbGVkLXVwIC0wLjcxNDE0ICogeCAqLwotICAgIGNjb252ZXJ0LT5Dcl9nX3RhYltpXSA9ICgtIEZJWCgwLjcxNDE0KSkgKiB4OwotICAgIC8qIENiPT5HIHZhbHVlIGlzIHNjYWxlZC11cCAtMC4zNDQxNCAqIHggKi8KLSAgICAvKiBXZSBhbHNvIGFkZCBpbiBPTkVfSEFMRiBzbyB0aGF0IG5lZWQgbm90IGRvIGl0IGluIGlubmVyIGxvb3AgKi8KLSAgICBjY29udmVydC0+Q2JfZ190YWJbaV0gPSAoLSBGSVgoMC4zNDQxNCkpICogeCArIE9ORV9IQUxGOwotICB9Ci19Ci0KLQotLyoKLSAqIENvbnZlcnQgc29tZSByb3dzIG9mIHNhbXBsZXMgdG8gdGhlIG91dHB1dCBjb2xvcnNwYWNlLgotICoKLSAqIE5vdGUgdGhhdCB3ZSBjaGFuZ2UgZnJvbSBub25pbnRlcmxlYXZlZCwgb25lLXBsYW5lLXBlci1jb21wb25lbnQgZm9ybWF0Ci0gKiB0byBpbnRlcmxlYXZlZC1waXhlbCBmb3JtYXQuICBUaGUgb3V0cHV0IGJ1ZmZlciBpcyB0aGVyZWZvcmUgdGhyZWUgdGltZXMKLSAqIGFzIHdpZGUgYXMgdGhlIGlucHV0IGJ1ZmZlci4KLSAqIEEgc3RhcnRpbmcgcm93IG9mZnNldCBpcyBwcm92aWRlZCBvbmx5IGZvciB0aGUgaW5wdXQgYnVmZmVyLiAgVGhlIGNhbGxlcgotICogY2FuIGVhc2lseSBhZGp1c3QgdGhlIHBhc3NlZCBvdXRwdXRfYnVmIHZhbHVlIHRvIGFjY29tbW9kYXRlIGFueSByb3cKLSAqIG9mZnNldCByZXF1aXJlZCBvbiB0aGF0IHNpZGUuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi15Y2NfcmdiX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCSBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCi0JCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKLXsKLSAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OwotICByZWdpc3RlciBpbnQgeSwgY2IsIGNyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sOwotICBKRElNRU5TSU9OIG51bV9jb2xzID0gY2luZm8tPm91dHB1dF93aWR0aDsKLSAgLyogY29weSB0aGVzZSBwb2ludGVycyBpbnRvIHJlZ2lzdGVycyBpZiBwb3NzaWJsZSAqLwotICByZWdpc3RlciBKU0FNUExFICogcmFuZ2VfbGltaXQgPSBjaW5mby0+c2FtcGxlX3JhbmdlX2xpbWl0OwotICByZWdpc3RlciBpbnQgKiBDcnJ0YWIgPSBjY29udmVydC0+Q3Jfcl90YWI7Ci0gIHJlZ2lzdGVyIGludCAqIENiYnRhYiA9IGNjb252ZXJ0LT5DYl9iX3RhYjsKLSAgcmVnaXN0ZXIgSU5UMzIgKiBDcmd0YWIgPSBjY29udmVydC0+Q3JfZ190YWI7Ci0gIHJlZ2lzdGVyIElOVDMyICogQ2JndGFiID0gY2NvbnZlcnQtPkNiX2dfdGFiOwotICBTSElGVF9URU1QUwotCi0gIHdoaWxlICgtLW51bV9yb3dzID49IDApIHsKLSAgICBpbnB0cjAgPSBpbnB1dF9idWZbMF1baW5wdXRfcm93XTsKLSAgICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5wdXRfcm93XTsKLSAgICBpbnB0cjIgPSBpbnB1dF9idWZbMl1baW5wdXRfcm93XTsKLSAgICBpbnB1dF9yb3crKzsKLSAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOwotICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7Ci0gICAgICB5ICA9IEdFVEpTQU1QTEUoaW5wdHIwW2NvbF0pOwotICAgICAgY2IgPSBHRVRKU0FNUExFKGlucHRyMVtjb2xdKTsKLSAgICAgIGNyID0gR0VUSlNBTVBMRShpbnB0cjJbY29sXSk7Ci0gICAgICAvKiBSYW5nZS1saW1pdGluZyBpcyBlc3NlbnRpYWwgZHVlIHRvIG5vaXNlIGludHJvZHVjZWQgYnkgRENUIGxvc3Nlcy4gKi8KLSAgICAgIG91dHB0cltSR0JfUkVEXSA9ICAgcmFuZ2VfbGltaXRbeSArIENycnRhYltjcl1dOwotICAgICAgb3V0cHRyW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsKLQkJCSAgICAgICgoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwKLQkJCQkJCSBTQ0FMRUJJVFMpKV07Ci0gICAgICBvdXRwdHJbUkdCX0JMVUVdID0gIHJhbmdlX2xpbWl0W3kgKyBDYmJ0YWJbY2JdXTsKLSAgICAgIG91dHB0ciArPSBSR0JfUElYRUxTSVpFOwotICAgIH0KLSAgfQotfQotCi0KLS8qKioqKioqKioqKioqKioqIENhc2VzIG90aGVyIHRoYW4gWUNiQ3IgLT4gUkdCICoqKioqKioqKioqKioqLwotCi0KLS8qCi0gKiBDb2xvciBjb252ZXJzaW9uIGZvciBubyBjb2xvcnNwYWNlIGNoYW5nZToganVzdCBjb3B5IHRoZSBkYXRhLAotICogY29udmVydGluZyBmcm9tIHNlcGFyYXRlLXBsYW5lcyB0byBpbnRlcmxlYXZlZCByZXByZXNlbnRhdGlvbi4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLW51bGxfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiBpbnB1dF9yb3csCi0JICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBpbnQgbnVtX3Jvd3MpCi17Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY291bnQ7Ci0gIHJlZ2lzdGVyIGludCBudW1fY29tcG9uZW50cyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0gIGludCBjaTsKLQotICB3aGlsZSAoLS1udW1fcm93cyA+PSAwKSB7Ci0gICAgZm9yIChjaSA9IDA7IGNpIDwgbnVtX2NvbXBvbmVudHM7IGNpKyspIHsKLSAgICAgIGlucHRyID0gaW5wdXRfYnVmW2NpXVtpbnB1dF9yb3ddOwotICAgICAgb3V0cHRyID0gb3V0cHV0X2J1ZlswXSArIGNpOwotICAgICAgZm9yIChjb3VudCA9IG51bV9jb2xzOyBjb3VudCA+IDA7IGNvdW50LS0pIHsKLQkqb3V0cHRyID0gKmlucHRyKys7CS8qIG5lZWRuJ3QgYm90aGVyIHdpdGggR0VUSlNBTVBMRSgpIGhlcmUgKi8KLQlvdXRwdHIgKz0gbnVtX2NvbXBvbmVudHM7Ci0gICAgICB9Ci0gICAgfQotICAgIGlucHV0X3JvdysrOwotICAgIG91dHB1dF9idWYrKzsKLSAgfQotfQotCi0KLS8qCi0gKiBDb2xvciBjb252ZXJzaW9uIGZvciBncmF5c2NhbGU6IGp1c3QgY29weSB0aGUgZGF0YS4KLSAqIFRoaXMgYWxzbyB3b3JrcyBmb3IgWUNiQ3IgLT4gZ3JheXNjYWxlIGNvbnZlcnNpb24sIGluIHdoaWNoCi0gKiB3ZSBqdXN0IGNvcHkgdGhlIFkgKGx1bWluYW5jZSkgY29tcG9uZW50IGFuZCBpZ25vcmUgY2hyb21pbmFuY2UuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1ncmF5c2NhbGVfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAotCQkgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKLXsKLSAgamNvcHlfc2FtcGxlX3Jvd3MoaW5wdXRfYnVmWzBdLCAoaW50KSBpbnB1dF9yb3csIG91dHB1dF9idWYsIDAsCi0JCSAgICBudW1fcm93cywgY2luZm8tPm91dHB1dF93aWR0aCk7Ci19Ci0KLQotLyoKLSAqIENvbnZlcnQgZ3JheXNjYWxlIHRvIFJHQjoganVzdCBkdXBsaWNhdGUgdGhlIGdyYXlsZXZlbCB0aHJlZSB0aW1lcy4KLSAqIFRoaXMgaXMgcHJvdmlkZWQgdG8gc3VwcG9ydCBhcHBsaWNhdGlvbnMgdGhhdCBkb24ndCB3YW50IHRvIGNvcGUKLSAqIHdpdGggZ3JheXNjYWxlIGFzIGEgc2VwYXJhdGUgY2FzZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWdyYXlfcmdiX2NvbnZlcnQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCSAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAotCQkgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgaW50IG51bV9yb3dzKQotewotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBKRElNRU5TSU9OIGNvbDsKLSAgSkRJTUVOU0lPTiBudW1fY29scyA9IGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0KLSAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgewotICAgIGlucHRyID0gaW5wdXRfYnVmWzBdW2lucHV0X3JvdysrXTsKLSAgICBvdXRwdHIgPSAqb3V0cHV0X2J1ZisrOwotICAgIGZvciAoY29sID0gMDsgY29sIDwgbnVtX2NvbHM7IGNvbCsrKSB7Ci0gICAgICAvKiBXZSBjYW4gZGlzcGVuc2Ugd2l0aCBHRVRKU0FNUExFKCkgaGVyZSAqLwotICAgICAgb3V0cHRyW1JHQl9SRURdID0gb3V0cHRyW1JHQl9HUkVFTl0gPSBvdXRwdHJbUkdCX0JMVUVdID0gaW5wdHJbY29sXTsKLSAgICAgIG91dHB0ciArPSBSR0JfUElYRUxTSVpFOwotICAgIH0KLSAgfQotfQotCi0KLS8qCi0gKiBBZG9iZS1zdHlsZSBZQ0NLLT5DTVlLIGNvbnZlcnNpb24uCi0gKiBXZSBjb252ZXJ0IFlDYkNyIHRvIFI9MS1DLCBHPTEtTSwgYW5kIEI9MS1ZIHVzaW5nIHRoZSBzYW1lCi0gKiBjb252ZXJzaW9uIGFzIGFib3ZlLCB3aGlsZSBwYXNzaW5nIEsgKGJsYWNrKSB1bmNoYW5nZWQuCi0gKiBXZSBhc3N1bWUgYnVpbGRfeWNjX3JnYl90YWJsZSBoYXMgYmVlbiBjYWxsZWQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi15Y2NrX2NteWtfY29udmVydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5wdXRfcm93LAotCQkgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykKLXsKLSAgbXlfY2NvbnZlcnRfcHRyIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikgY2luZm8tPmNjb252ZXJ0OwotICByZWdpc3RlciBpbnQgeSwgY2IsIGNyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjIsIGlucHRyMzsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2w7Ci0gIEpESU1FTlNJT04gbnVtX2NvbHMgPSBjaW5mby0+b3V0cHV0X3dpZHRoOwotICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCi0gIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7Ci0gIHJlZ2lzdGVyIGludCAqIENycnRhYiA9IGNjb252ZXJ0LT5Dcl9yX3RhYjsKLSAgcmVnaXN0ZXIgaW50ICogQ2JidGFiID0gY2NvbnZlcnQtPkNiX2JfdGFiOwotICByZWdpc3RlciBJTlQzMiAqIENyZ3RhYiA9IGNjb252ZXJ0LT5Dcl9nX3RhYjsKLSAgcmVnaXN0ZXIgSU5UMzIgKiBDYmd0YWIgPSBjY29udmVydC0+Q2JfZ190YWI7Ci0gIFNISUZUX1RFTVBTCi0KLSAgd2hpbGUgKC0tbnVtX3Jvd3MgPj0gMCkgewotICAgIGlucHRyMCA9IGlucHV0X2J1ZlswXVtpbnB1dF9yb3ddOwotICAgIGlucHRyMSA9IGlucHV0X2J1ZlsxXVtpbnB1dF9yb3ddOwotICAgIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbnB1dF9yb3ddOwotICAgIGlucHRyMyA9IGlucHV0X2J1ZlszXVtpbnB1dF9yb3ddOwotICAgIGlucHV0X3JvdysrOwotICAgIG91dHB0ciA9ICpvdXRwdXRfYnVmKys7Ci0gICAgZm9yIChjb2wgPSAwOyBjb2wgPCBudW1fY29sczsgY29sKyspIHsKLSAgICAgIHkgID0gR0VUSlNBTVBMRShpbnB0cjBbY29sXSk7Ci0gICAgICBjYiA9IEdFVEpTQU1QTEUoaW5wdHIxW2NvbF0pOwotICAgICAgY3IgPSBHRVRKU0FNUExFKGlucHRyMltjb2xdKTsKLSAgICAgIC8qIFJhbmdlLWxpbWl0aW5nIGlzIGVzc2VudGlhbCBkdWUgdG8gbm9pc2UgaW50cm9kdWNlZCBieSBEQ1QgbG9zc2VzLiAqLwotICAgICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbTUFYSlNBTVBMRSAtICh5ICsgQ3JydGFiW2NyXSldOwkvKiByZWQgKi8KLSAgICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0W01BWEpTQU1QTEUgLSAoeSArCQkJLyogZ3JlZW4gKi8KLQkJCSAgICAgICgoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwKLQkJCQkJCSBTQ0FMRUJJVFMpKSldOwotICAgICAgb3V0cHRyWzJdID0gcmFuZ2VfbGltaXRbTUFYSlNBTVBMRSAtICh5ICsgQ2JidGFiW2NiXSldOwkvKiBibHVlICovCi0gICAgICAvKiBLIHBhc3NlcyB0aHJvdWdoIHVuY2hhbmdlZCAqLwotICAgICAgb3V0cHRyWzNdID0gaW5wdHIzW2NvbF07CS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSBoZXJlICovCi0gICAgICBvdXRwdHIgKz0gNDsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogRW1wdHkgbWV0aG9kIGZvciBzdGFydF9wYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzc19kY29sb3IgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIC8qIG5vIHdvcmsgbmVlZGVkICovCi19Ci0KLQotLyoKLSAqIE1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lIGZvciBvdXRwdXQgY29sb3JzcGFjZSBjb252ZXJzaW9uLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfY29sb3JfZGVjb252ZXJ0ZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2Njb252ZXJ0X3B0ciBjY29udmVydDsKLSAgaW50IGNpOwotCi0gIGNjb252ZXJ0ID0gKG15X2Njb252ZXJ0X3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihteV9jb2xvcl9kZWNvbnZlcnRlcikpOwotICBjaW5mby0+Y2NvbnZlcnQgPSAoc3RydWN0IGpwZWdfY29sb3JfZGVjb252ZXJ0ZXIgKikgY2NvbnZlcnQ7Ci0gIGNjb252ZXJ0LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfZGNvbG9yOwotCi0gIC8qIE1ha2Ugc3VyZSBudW1fY29tcG9uZW50cyBhZ3JlZXMgd2l0aCBqcGVnX2NvbG9yX3NwYWNlICovCi0gIHN3aXRjaCAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UpIHsKLSAgY2FzZSBKQ1NfR1JBWVNDQUxFOgotICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMSkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0pfQ09MT1JTUEFDRSk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBKQ1NfUkdCOgotICBjYXNlIEpDU19ZQ2JDcjoKLSAgICBpZiAoY2luZm8tPm51bV9jb21wb25lbnRzICE9IDMpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9KX0NPTE9SU1BBQ0UpOwotICAgIGJyZWFrOwotCi0gIGNhc2UgSkNTX0NNWUs6Ci0gIGNhc2UgSkNTX1lDQ0s6Ci0gICAgaWYgKGNpbmZvLT5udW1fY29tcG9uZW50cyAhPSA0KQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKLSAgICBicmVhazsKLQotICBkZWZhdWx0OgkJCS8qIEpDU19VTktOT1dOIGNhbiBiZSBhbnl0aGluZyAqLwotICAgIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgPCAxKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSl9DT0xPUlNQQUNFKTsKLSAgICBicmVhazsKLSAgfQotCi0gIC8qIFNldCBvdXRfY29sb3JfY29tcG9uZW50cyBhbmQgY29udmVyc2lvbiBtZXRob2QgYmFzZWQgb24gcmVxdWVzdGVkIHNwYWNlLgotICAgKiBBbHNvIGNsZWFyIHRoZSBjb21wb25lbnRfbmVlZGVkIGZsYWdzIGZvciBhbnkgdW51c2VkIGNvbXBvbmVudHMsCi0gICAqIHNvIHRoYXQgZWFybGllciBwaXBlbGluZSBzdGFnZXMgY2FuIGF2b2lkIHVzZWxlc3MgY29tcHV0YXRpb24uCi0gICAqLwotCi0gIHN3aXRjaCAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSkgewotICBjYXNlIEpDU19HUkFZU0NBTEU6Ci0gICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gMTsKLSAgICBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSB8fAotCWNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19ZQ2JDcikgewotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gZ3JheXNjYWxlX2NvbnZlcnQ7Ci0gICAgICAvKiBGb3IgY29sb3ItPmdyYXlzY2FsZSBjb252ZXJzaW9uLCBvbmx5IHRoZSBZICgwKSBjb21wb25lbnQgaXMgbmVlZGVkICovCi0gICAgICBmb3IgKGNpID0gMTsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7IGNpKyspCi0JY2luZm8tPmNvbXBfaW5mb1tjaV0uY29tcG9uZW50X25lZWRlZCA9IEZBTFNFOwotICAgIH0gZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9DT05WRVJTSU9OX05PVElNUEwpOwotICAgIGJyZWFrOwotCi0gIGNhc2UgSkNTX1JHQjoKLSAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSBSR0JfUElYRUxTSVpFOwotICAgIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNiQ3IpIHsKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IHljY19yZ2JfY29udmVydDsKLSAgICAgIGJ1aWxkX3ljY19yZ2JfdGFibGUoY2luZm8pOwotICAgIH0gZWxzZSBpZiAoY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UgPT0gSkNTX0dSQVlTQ0FMRSkgewotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0gZ3JheV9yZ2JfY29udmVydDsKLSAgICB9IGVsc2UgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19SR0IgJiYgUkdCX1BJWEVMU0laRSA9PSAzKSB7Ci0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBudWxsX2NvbnZlcnQ7Ci0gICAgfSBlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7Ci0gICAgYnJlYWs7Ci0KLSAgY2FzZSBKQ1NfQ01ZSzoKLSAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSA0OwotICAgIGlmIChjaW5mby0+anBlZ19jb2xvcl9zcGFjZSA9PSBKQ1NfWUNDSykgewotICAgICAgY2NvbnZlcnQtPnB1Yi5jb2xvcl9jb252ZXJ0ID0geWNja19jbXlrX2NvbnZlcnQ7Ci0gICAgICBidWlsZF95Y2NfcmdiX3RhYmxlKGNpbmZvKTsKLSAgICB9IGVsc2UgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID09IEpDU19DTVlLKSB7Ci0gICAgICBjY29udmVydC0+cHViLmNvbG9yX2NvbnZlcnQgPSBudWxsX2NvbnZlcnQ7Ci0gICAgfSBlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7Ci0gICAgYnJlYWs7Ci0KLSAgZGVmYXVsdDoKLSAgICAvKiBQZXJtaXQgbnVsbCBjb252ZXJzaW9uIHRvIHNhbWUgb3V0cHV0IHNwYWNlICovCi0gICAgaWYgKGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPT0gY2luZm8tPmpwZWdfY29sb3Jfc3BhY2UpIHsKLSAgICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgIGNjb252ZXJ0LT5wdWIuY29sb3JfY29udmVydCA9IG51bGxfY29udmVydDsKLSAgICB9IGVsc2UJCQkvKiB1bnN1cHBvcnRlZCBub24tbnVsbCBjb252ZXJzaW9uICovCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0NPTlZFUlNJT05fTk9USU1QTCk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykKLSAgICBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMgPSAxOyAvKiBzaW5nbGUgY29sb3JtYXBwZWQgb3V0cHV0IGNvbXBvbmVudCAqLwotICBlbHNlCi0gICAgY2luZm8tPm91dHB1dF9jb21wb25lbnRzID0gY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkZGN0bWdyLmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRkY3RtZ3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJmOGQwZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRkY3RtZ3IuYworKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKgotICogamRkY3RtZ3IuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbnZlcnNlLURDVCBtYW5hZ2VtZW50IGxvZ2ljLgotICogVGhpcyBjb2RlIHNlbGVjdHMgYSBwYXJ0aWN1bGFyIElEQ1QgaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZCwKLSAqIGFuZCBpdCBwZXJmb3JtcyByZWxhdGVkIGhvdXNla2VlcGluZyBjaG9yZXMuICBObyBjb2RlIGluIHRoaXMgZmlsZQotICogaXMgZXhlY3V0ZWQgcGVyIElEQ1Qgc3RlcCwgb25seSBkdXJpbmcgb3V0cHV0IHBhc3Mgc2V0dXAuCi0gKgotICogTm90ZSB0aGF0IHRoZSBJRENUIHJvdXRpbmVzIGFyZSByZXNwb25zaWJsZSBmb3IgcGVyZm9ybWluZyBjb2VmZmljaWVudAotICogZGVxdWFudGl6YXRpb24gYXMgd2VsbCBhcyB0aGUgSURDVCBwcm9wZXIuICBUaGlzIG1vZHVsZSBzZXRzIHVwIHRoZQotICogZGVxdWFudGl6YXRpb24gbXVsdGlwbGllciB0YWJsZSBuZWVkZWQgYnkgdGhlIElEQ1Qgcm91dGluZS4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiamRjdC5oIgkJLyogUHJpdmF0ZSBkZWNsYXJhdGlvbnMgZm9yIERDVCBzdWJzeXN0ZW0gKi8KLQotCi0vKgotICogVGhlIGRlY29tcHJlc3NvciBpbnB1dCBzaWRlIChqZGlucHV0LmMpIHNhdmVzIGF3YXkgdGhlIGFwcHJvcHJpYXRlCi0gKiBxdWFudGl6YXRpb24gdGFibGUgZm9yIGVhY2ggY29tcG9uZW50IGF0IHRoZSBzdGFydCBvZiB0aGUgZmlyc3Qgc2NhbgotICogaW52b2x2aW5nIHRoYXQgY29tcG9uZW50LiAgKFRoaXMgaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGNvcnJlY3RseQotICogZGVjb2RlIGZpbGVzIHRoYXQgcmV1c2UgUS10YWJsZSBzbG90cy4pCi0gKiBXaGVuIHdlIGFyZSByZWFkeSB0byBtYWtlIGFuIG91dHB1dCBwYXNzLCB0aGUgc2F2ZWQgUS10YWJsZSBpcyBjb252ZXJ0ZWQKLSAqIHRvIGEgbXVsdGlwbGllciB0YWJsZSB0aGF0IHdpbGwgYWN0dWFsbHkgYmUgdXNlZCBieSB0aGUgSURDVCByb3V0aW5lLgotICogVGhlIG11bHRpcGxpZXIgdGFibGUgY29udGVudHMgYXJlIElEQ1QtbWV0aG9kLWRlcGVuZGVudC4gIFRvIHN1cHBvcnQKLSAqIGFwcGxpY2F0aW9uIGNoYW5nZXMgaW4gSURDVCBtZXRob2QgYmV0d2VlbiBzY2Fucywgd2UgY2FuIHJlbWFrZSB0aGUKLSAqIG11bHRpcGxpZXIgdGFibGVzIGlmIG5lY2Vzc2FyeS4KLSAqIEluIGJ1ZmZlcmVkLWltYWdlIG1vZGUsIHRoZSBmaXJzdCBvdXRwdXQgcGFzcyBtYXkgb2NjdXIgYmVmb3JlIGFueSBkYXRhCi0gKiBoYXMgYmVlbiBzZWVuIGZvciBzb21lIGNvbXBvbmVudHMsIGFuZCB0aHVzIGJlZm9yZSB0aGVpciBRLXRhYmxlcyBoYXZlCi0gKiBiZWVuIHNhdmVkIGF3YXkuICBUbyBoYW5kbGUgdGhpcyBjYXNlLCBtdWx0aXBsaWVyIHRhYmxlcyBhcmUgcHJlc2V0Ci0gKiB0byB6ZXJvZXM7IHRoZSByZXN1bHQgb2YgdGhlIElEQ1Qgd2lsbCBiZSBhIG5ldXRyYWwgZ3JheSBsZXZlbC4KLSAqLwotCi0KLS8qIFByaXZhdGUgc3Vib2JqZWN0IGZvciB0aGlzIG1vZHVsZSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2ludmVyc2VfZGN0IHB1YjsJLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIFRoaXMgYXJyYXkgY29udGFpbnMgdGhlIElEQ1QgbWV0aG9kIGNvZGUgdGhhdCBlYWNoIG11bHRpcGxpZXIgdGFibGUKLSAgICogaXMgY3VycmVudGx5IHNldCB1cCBmb3IsIG9yIC0xIGlmIGl0J3Mgbm90IHlldCBzZXQgdXAuCi0gICAqIFRoZSBhY3R1YWwgbXVsdGlwbGllciB0YWJsZXMgYXJlIHBvaW50ZWQgdG8gYnkgZGN0X3RhYmxlIGluIHRoZQotICAgKiBwZXItY29tcG9uZW50IGNvbXBfaW5mbyBzdHJ1Y3R1cmVzLgotICAgKi8KLSAgaW50IGN1cl9tZXRob2RbTUFYX0NPTVBPTkVOVFNdOwotfSBteV9pZGN0X2NvbnRyb2xsZXI7Ci0KLXR5cGVkZWYgbXlfaWRjdF9jb250cm9sbGVyICogbXlfaWRjdF9wdHI7Ci0KLQotLyogQWxsb2NhdGVkIG11bHRpcGxpZXIgdGFibGVzOiBiaWcgZW5vdWdoIGZvciBhbnkgc3VwcG9ydGVkIHZhcmlhbnQgKi8KLQotdHlwZWRlZiB1bmlvbiB7Ci0gIElTTE9XX01VTFRfVFlQRSBpc2xvd19hcnJheVtEQ1RTSVpFMl07Ci0jaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAotICBJRkFTVF9NVUxUX1RZUEUgaWZhc3RfYXJyYXlbRENUU0laRTJdOwotI2VuZGlmCi0jaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotICBGTE9BVF9NVUxUX1RZUEUgZmxvYXRfYXJyYXlbRENUU0laRTJdOwotI2VuZGlmCi19IG11bHRpcGxpZXJfdGFibGU7Ci0KLQotLyogVGhlIGN1cnJlbnQgc2NhbGVkLUlEQ1Qgcm91dGluZXMgcmVxdWlyZSBJU0xPVy1zdHlsZSBtdWx0aXBsaWVyIHRhYmxlcywKLSAqIHNvIGJlIHN1cmUgdG8gY29tcGlsZSB0aGF0IGNvZGUgaWYgZWl0aGVyIElTTE9XIG9yIFNDQUxJTkcgaXMgcmVxdWVzdGVkLgotICovCi0jaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAotI2RlZmluZSBQUk9WSURFX0lTTE9XX1RBQkxFUwotI2Vsc2UKLSNpZmRlZiBJRENUX1NDQUxJTkdfU1VQUE9SVEVECi0jZGVmaW5lIFBST1ZJREVfSVNMT1dfVEFCTEVTCi0jZW5kaWYKLSNlbmRpZgotCi0KLS8qCi0gKiBQcmVwYXJlIGZvciBhbiBvdXRwdXQgcGFzcy4KLSAqIEhlcmUgd2Ugc2VsZWN0IHRoZSBwcm9wZXIgSURDVCByb3V0aW5lIGZvciBlYWNoIGNvbXBvbmVudCBhbmQgYnVpbGQKLSAqIGEgbWF0Y2hpbmcgbXVsdGlwbGllciB0YWJsZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2lkY3RfcHRyIGlkY3QgPSAobXlfaWRjdF9wdHIpIGNpbmZvLT5pZGN0OwotICBpbnQgY2ksIGk7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIGludCBtZXRob2QgPSAwOwotICBpbnZlcnNlX0RDVF9tZXRob2RfcHRyIG1ldGhvZF9wdHIgPSBOVUxMOwotICBKUVVBTlRfVEJMICogcXRibDsKLQotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIC8qIFNlbGVjdCB0aGUgcHJvcGVyIElEQ1Qgcm91dGluZSBmb3IgdGhpcyBjb21wb25lbnQncyBzY2FsaW5nICovCi0gICAgc3dpdGNoIChjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIHsKLSNpZmRlZiBJRENUX1NDQUxJTkdfU1VQUE9SVEVECi0gICAgY2FzZSAxOgotICAgICAgbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF8xeDE7Ci0gICAgICBtZXRob2QgPSBKRENUX0lTTE9XOwkvKiBqaWRjdHJlZCB1c2VzIGlzbG93LXN0eWxlIHRhYmxlICovCi0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICBtZXRob2RfcHRyID0ganBlZ19pZGN0XzJ4MjsKLSAgICAgIG1ldGhvZCA9IEpEQ1RfSVNMT1c7CS8qIGppZGN0cmVkIHVzZXMgaXNsb3ctc3R5bGUgdGFibGUgKi8KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIG1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfNHg0OwotICAgICAgbWV0aG9kID0gSkRDVF9JU0xPVzsJLyogamlkY3RyZWQgdXNlcyBpc2xvdy1zdHlsZSB0YWJsZSAqLwotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBjYXNlIERDVFNJWkU6Ci0gICAgICBzd2l0Y2ggKGNpbmZvLT5kY3RfbWV0aG9kKSB7Ci0jaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAotICAgICAgY2FzZSBKRENUX0lTTE9XOgotCW1ldGhvZF9wdHIgPSBqcGVnX2lkY3RfaXNsb3c7Ci0JbWV0aG9kID0gSkRDVF9JU0xPVzsKLQlicmVhazsKLSNlbmRpZgotI2lmZGVmIERDVF9JRkFTVF9TVVBQT1JURUQKLSAgICAgIGNhc2UgSkRDVF9JRkFTVDoKLQltZXRob2RfcHRyID0ganBlZ19pZGN0X2lmYXN0OwotCW1ldGhvZCA9IEpEQ1RfSUZBU1Q7Ci0JYnJlYWs7Ci0jZW5kaWYKLSNpZmRlZiBEQ1RfRkxPQVRfU1VQUE9SVEVECi0gICAgICBjYXNlIEpEQ1RfRkxPQVQ6Ci0JbWV0aG9kX3B0ciA9IGpwZWdfaWRjdF9mbG9hdDsKLQltZXRob2QgPSBKRENUX0ZMT0FUOwotCWJyZWFrOwotI2VuZGlmCi0gICAgICBkZWZhdWx0OgotCUVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLQlicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfRENUU0laRSwgY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZGN0LT5wdWIuaW52ZXJzZV9EQ1RbY2ldID0gbWV0aG9kX3B0cjsKLSAgICAvKiBDcmVhdGUgbXVsdGlwbGllciB0YWJsZSBmcm9tIHF1YW50IHRhYmxlLgotICAgICAqIEhvd2V2ZXIsIHdlIGNhbiBza2lwIHRoaXMgaWYgdGhlIGNvbXBvbmVudCBpcyB1bmludGVyZXN0aW5nCi0gICAgICogb3IgaWYgd2UgYWxyZWFkeSBidWlsdCB0aGUgdGFibGUuICBBbHNvLCBpZiBubyBxdWFudCB0YWJsZQotICAgICAqIGhhcyB5ZXQgYmVlbiBzYXZlZCBmb3IgdGhlIGNvbXBvbmVudCwgd2UgbGVhdmUgdGhlCi0gICAgICogbXVsdGlwbGllciB0YWJsZSBhbGwtemVybzsgd2UnbGwgYmUgcmVhZGluZyB6ZXJvZXMgZnJvbSB0aGUKLSAgICAgKiBjb2VmZmljaWVudCBjb250cm9sbGVyJ3MgYnVmZmVyIGFueXdheS4KLSAgICAgKi8KLSAgICBpZiAoISBjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkIHx8IGlkY3QtPmN1cl9tZXRob2RbY2ldID09IG1ldGhvZCkKLSAgICAgIGNvbnRpbnVlOwotICAgIHF0YmwgPSBjb21wcHRyLT5xdWFudF90YWJsZTsKLSAgICBpZiAocXRibCA9PSBOVUxMKQkJLyogaGFwcGVucyBpZiBubyBkYXRhIHlldCBmb3IgY29tcG9uZW50ICovCi0gICAgICBjb250aW51ZTsKLSAgICBpZGN0LT5jdXJfbWV0aG9kW2NpXSA9IG1ldGhvZDsKLSAgICBzd2l0Y2ggKG1ldGhvZCkgewotI2lmZGVmIFBST1ZJREVfSVNMT1dfVEFCTEVTCi0gICAgY2FzZSBKRENUX0lTTE9XOgotICAgICAgewotCS8qIEZvciBMTCZNIElEQ1QgbWV0aG9kLCBtdWx0aXBsaWVycyBhcmUgZXF1YWwgdG8gcmF3IHF1YW50aXphdGlvbgotCSAqIGNvZWZmaWNpZW50cywgYnV0IGFyZSBzdG9yZWQgYXMgaW50cyB0byBlbnN1cmUgYWNjZXNzIGVmZmljaWVuY3kuCi0JICovCi0JSVNMT1dfTVVMVF9UWVBFICogaXNtdGJsID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7Ci0JZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpKyspIHsKLQkgIGlzbXRibFtpXSA9IChJU0xPV19NVUxUX1RZUEUpIHF0YmwtPnF1YW50dmFsW2ldOwotCX0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgRENUX0lGQVNUX1NVUFBPUlRFRAotICAgIGNhc2UgSkRDVF9JRkFTVDoKLSAgICAgIHsKLQkvKiBGb3IgQUEmTiBJRENUIG1ldGhvZCwgbXVsdGlwbGllcnMgYXJlIGVxdWFsIHRvIHF1YW50aXphdGlvbgotCSAqIGNvZWZmaWNpZW50cyBzY2FsZWQgYnkgc2NhbGVmYWN0b3Jbcm93XSpzY2FsZWZhY3Rvcltjb2xdLCB3aGVyZQotCSAqICAgc2NhbGVmYWN0b3JbMF0gPSAxCi0JICogICBzY2FsZWZhY3RvcltrXSA9IGNvcyhrKlBJLzE2KSAqIHNxcnQoMikgICAgZm9yIGs9MS4uNwotCSAqIEZvciBpbnRlZ2VyIG9wZXJhdGlvbiwgdGhlIG11bHRpcGxpZXIgdGFibGUgaXMgdG8gYmUgc2NhbGVkIGJ5Ci0JICogSUZBU1RfU0NBTEVfQklUUy4KLQkgKi8KLQlJRkFTVF9NVUxUX1RZUEUgKiBpZm10YmwgPSAoSUZBU1RfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKLSNkZWZpbmUgQ09OU1RfQklUUyAxNAotCXN0YXRpYyBjb25zdCBJTlQxNiBhYW5zY2FsZXNbRENUU0laRTJdID0gewotCSAgLyogcHJlY29tcHV0ZWQgdmFsdWVzIHNjYWxlZCB1cCBieSAxNCBiaXRzICovCi0JICAxNjM4NCwgMjI3MjUsIDIxNDA3LCAxOTI2NiwgMTYzODQsIDEyODczLCAgODg2NywgIDQ1MjAsCi0JICAyMjcyNSwgMzE1MjEsIDI5NjkyLCAyNjcyMiwgMjI3MjUsIDE3ODU1LCAxMjI5OSwgIDYyNzAsCi0JICAyMTQwNywgMjk2OTIsIDI3OTY5LCAyNTE3MiwgMjE0MDcsIDE2ODE5LCAxMTU4NSwgIDU5MDYsCi0JICAxOTI2NiwgMjY3MjIsIDI1MTcyLCAyMjY1NCwgMTkyNjYsIDE1MTM3LCAxMDQyNiwgIDUzMTUsCi0JICAxNjM4NCwgMjI3MjUsIDIxNDA3LCAxOTI2NiwgMTYzODQsIDEyODczLCAgODg2NywgIDQ1MjAsCi0JICAxMjg3MywgMTc4NTUsIDE2ODE5LCAxNTEzNywgMTI4NzMsIDEwMTE0LCAgNjk2NywgIDM1NTIsCi0JICAgODg2NywgMTIyOTksIDExNTg1LCAxMDQyNiwgIDg4NjcsICA2OTY3LCAgNDc5OSwgIDI0NDYsCi0JICAgNDUyMCwgIDYyNzAsICA1OTA2LCAgNTMxNSwgIDQ1MjAsICAzNTUyLCAgMjQ0NiwgIDEyNDcKLQl9OwotCVNISUZUX1RFTVBTCi0KLQlmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykgewotCSAgaWZtdGJsW2ldID0gKElGQVNUX01VTFRfVFlQRSkKLQkgICAgREVTQ0FMRShNVUxUSVBMWTE2VjE2KChJTlQzMikgcXRibC0+cXVhbnR2YWxbaV0sCi0JCQkJICAoSU5UMzIpIGFhbnNjYWxlc1tpXSksCi0JCSAgICBDT05TVF9CSVRTLUlGQVNUX1NDQUxFX0JJVFMpOwotCX0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgRENUX0ZMT0FUX1NVUFBPUlRFRAotICAgIGNhc2UgSkRDVF9GTE9BVDoKLSAgICAgIHsKLQkvKiBGb3IgZmxvYXQgQUEmTiBJRENUIG1ldGhvZCwgbXVsdGlwbGllcnMgYXJlIGVxdWFsIHRvIHF1YW50aXphdGlvbgotCSAqIGNvZWZmaWNpZW50cyBzY2FsZWQgYnkgc2NhbGVmYWN0b3Jbcm93XSpzY2FsZWZhY3Rvcltjb2xdLCB3aGVyZQotCSAqICAgc2NhbGVmYWN0b3JbMF0gPSAxCi0JICogICBzY2FsZWZhY3RvcltrXSA9IGNvcyhrKlBJLzE2KSAqIHNxcnQoMikgICAgZm9yIGs9MS4uNwotCSAqLwotCUZMT0FUX01VTFRfVFlQRSAqIGZtdGJsID0gKEZMT0FUX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7Ci0JaW50IHJvdywgY29sOwotCXN0YXRpYyBjb25zdCBkb3VibGUgYWFuc2NhbGVmYWN0b3JbRENUU0laRV0gPSB7Ci0JICAxLjAsIDEuMzg3MDM5ODQ1LCAxLjMwNjU2Mjk2NSwgMS4xNzU4NzU2MDIsCi0JICAxLjAsIDAuNzg1Njk0OTU4LCAwLjU0MTE5NjEwMCwgMC4yNzU4OTkzNzkKLQl9OwotCi0JaSA9IDA7Ci0JZm9yIChyb3cgPSAwOyByb3cgPCBEQ1RTSVpFOyByb3crKykgewotCSAgZm9yIChjb2wgPSAwOyBjb2wgPCBEQ1RTSVpFOyBjb2wrKykgewotCSAgICBmbXRibFtpXSA9IChGTE9BVF9NVUxUX1RZUEUpCi0JICAgICAgKChkb3VibGUpIHF0YmwtPnF1YW50dmFsW2ldICoKLQkgICAgICAgYWFuc2NhbGVmYWN0b3Jbcm93XSAqIGFhbnNjYWxlZmFjdG9yW2NvbF0pOwotCSAgICBpKys7Ci0JICB9Ci0JfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICBkZWZhdWx0OgotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RfQ09NUElMRUQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgSURDVCBtYW5hZ2VyLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfaW52ZXJzZV9kY3QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2lkY3RfcHRyIGlkY3Q7Ci0gIGludCBjaTsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICBpZGN0ID0gKG15X2lkY3RfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKG15X2lkY3RfY29udHJvbGxlcikpOwotICBjaW5mby0+aWRjdCA9IChzdHJ1Y3QganBlZ19pbnZlcnNlX2RjdCAqKSBpZGN0OwotICBpZGN0LT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3M7Ci0KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAvKiBBbGxvY2F0ZSBhbmQgcHJlLXplcm8gYSBtdWx0aXBsaWVyIHRhYmxlIGZvciBlYWNoIGNvbXBvbmVudCAqLwotICAgIGNvbXBwdHItPmRjdF90YWJsZSA9Ci0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgU0laRU9GKG11bHRpcGxpZXJfdGFibGUpKTsKLSAgICBNRU1aRVJPKGNvbXBwdHItPmRjdF90YWJsZSwgU0laRU9GKG11bHRpcGxpZXJfdGFibGUpKTsKLSAgICAvKiBNYXJrIG11bHRpcGxpZXIgdGFibGUgbm90IHlldCBzZXQgdXAgZm9yIGFueSBtZXRob2QgKi8KLSAgICBpZGN0LT5jdXJfbWV0aG9kW2NpXSA9IC0xOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRodWZmLmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRodWZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOTQ5NWMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkaHVmZi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjUwICswLDAgQEAKLS8qCi0gKiBqZGh1ZmYuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIEh1ZmZtYW4gZW50cm9weSBkZWNvZGluZyByb3V0aW5lcy4KLSAqCi0gKiBNdWNoIG9mIHRoZSBjb21wbGV4aXR5IGhlcmUgaGFzIHRvIGRvIHdpdGggc3VwcG9ydGluZyBpbnB1dCBzdXNwZW5zaW9uLgotICogSWYgdGhlIGRhdGEgc291cmNlIG1vZHVsZSBkZW1hbmRzIHN1c3BlbnNpb24sIHdlIHdhbnQgdG8gYmUgYWJsZSB0byBiYWNrCi0gKiB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgTUNVLiAgVG8gZG8gdGhpcywgd2UgY29weSBzdGF0ZSB2YXJpYWJsZXMKLSAqIGludG8gbG9jYWwgd29ya2luZyBzdG9yYWdlLCBhbmQgdXBkYXRlIHRoZW0gYmFjayB0byB0aGUgcGVybWFuZW50Ci0gKiBzdG9yYWdlIG9ubHkgdXBvbiBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgYW4gTUNVLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqZGh1ZmYuaCIJCS8qIERlY2xhcmF0aW9ucyBzaGFyZWQgd2l0aCBqZHBodWZmLmMgKi8KLQotLyoKLSAqIEV4cGFuZGVkIGVudHJvcHkgZGVjb2RlciBvYmplY3QgZm9yIEh1ZmZtYW4gZGVjb2RpbmcuCi0gKgotICogVGhlIHNhdmFibGVfc3RhdGUgc3VicmVjb3JkIGNvbnRhaW5zIGZpZWxkcyB0aGF0IGNoYW5nZSB3aXRoaW4gYW4gTUNVLAotICogYnV0IG11c3Qgbm90IGJlIHVwZGF0ZWQgcGVybWFuZW50bHkgdW50aWwgd2UgY29tcGxldGUgdGhlIE1DVS4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCBsYXN0X2RjX3ZhbFtNQVhfQ09NUFNfSU5fU0NBTl07IC8qIGxhc3QgREMgY29lZiBmb3IgZWFjaCBjb21wb25lbnQgKi8KLX0gc2F2YWJsZV9zdGF0ZTsKLQotLyogVGhpcyBtYWNybyBpcyB0byB3b3JrIGFyb3VuZCBjb21waWxlcnMgd2l0aCBtaXNzaW5nIG9yIGJyb2tlbgotICogc3RydWN0dXJlIGFzc2lnbm1lbnQuICBZb3UnbGwgbmVlZCB0byBmaXggdGhpcyBjb2RlIGlmIHlvdSBoYXZlCi0gKiBzdWNoIGEgY29tcGlsZXIgYW5kIHlvdSBjaGFuZ2UgTUFYX0NPTVBTX0lOX1NDQU4uCi0gKi8KLQotI2lmbmRlZiBOT19TVFJVQ1RfQVNTSUdOCi0jZGVmaW5lIEFTU0lHTl9TVEFURShkZXN0LHNyYykgICgoZGVzdCkgPSAoc3JjKSkKLSNlbHNlCi0jaWYgTUFYX0NPTVBTX0lOX1NDQU4gPT0gNAotI2RlZmluZSBBU1NJR05fU1RBVEUoZGVzdCxzcmMpICBcCi0JKChkZXN0KS5sYXN0X2RjX3ZhbFswXSA9IChzcmMpLmxhc3RfZGNfdmFsWzBdLCBcCi0JIChkZXN0KS5sYXN0X2RjX3ZhbFsxXSA9IChzcmMpLmxhc3RfZGNfdmFsWzFdLCBcCi0JIChkZXN0KS5sYXN0X2RjX3ZhbFsyXSA9IChzcmMpLmxhc3RfZGNfdmFsWzJdLCBcCi0JIChkZXN0KS5sYXN0X2RjX3ZhbFszXSA9IChzcmMpLmxhc3RfZGNfdmFsWzNdKQotI2VuZGlmCi0jZW5kaWYKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2VudHJvcHlfZGVjb2RlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIGxvYWRlZCBpbnRvIGxvY2FsIHZhcmlhYmxlcyBhdCBzdGFydCBvZiBlYWNoIE1DVS4KLSAgICogSW4gY2FzZSBvZiBzdXNwZW5zaW9uLCB3ZSBleGl0IFdJVEhPVVQgdXBkYXRpbmcgdGhlbS4KLSAgICovCi0gIGJpdHJlYWRfcGVybV9zdGF0ZSBiaXRzdGF0ZTsJLyogQml0IGJ1ZmZlciBhdCBzdGFydCBvZiBNQ1UgKi8KLSAgc2F2YWJsZV9zdGF0ZSBzYXZlZDsJCS8qIE90aGVyIHN0YXRlIGF0IHN0YXJ0IG9mIE1DVSAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgTk9UIGxvYWRlZCBpbnRvIGxvY2FsIHdvcmtpbmcgc3RhdGUuICovCi0gIHVuc2lnbmVkIGludCByZXN0YXJ0c190b19nbzsJLyogTUNVcyBsZWZ0IGluIHRoaXMgcmVzdGFydCBpbnRlcnZhbCAqLwotCi0gIC8qIFBvaW50ZXJzIHRvIGRlcml2ZWQgdGFibGVzICh0aGVzZSB3b3Jrc3BhY2VzIGhhdmUgaW1hZ2UgbGlmZXNwYW4pICovCi0gIGRfZGVyaXZlZF90YmwgKiBkY19kZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107Ci0gIGRfZGVyaXZlZF90YmwgKiBhY19kZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107Ci0KLSAgLyogUHJlY2FsY3VsYXRlZCBpbmZvIHNldCB1cCBieSBzdGFydF9wYXNzIGZvciB1c2UgaW4gZGVjb2RlX21jdTogKi8KLQotICAvKiBQb2ludGVycyB0byBkZXJpdmVkIHRhYmxlcyB0byBiZSB1c2VkIGZvciBlYWNoIGJsb2NrIHdpdGhpbiBhbiBNQ1UgKi8KLSAgZF9kZXJpdmVkX3RibCAqIGRjX2N1cl90YmxzW0RfTUFYX0JMT0NLU19JTl9NQ1VdOwotICBkX2Rlcml2ZWRfdGJsICogYWNfY3VyX3RibHNbRF9NQVhfQkxPQ0tTX0lOX01DVV07Ci0gIC8qIFdoZXRoZXIgd2UgY2FyZSBhYm91dCB0aGUgREMgYW5kIEFDIGNvZWZmaWNpZW50IHZhbHVlcyBmb3IgZWFjaCBibG9jayAqLwotICBib29sZWFuIGRjX25lZWRlZFtEX01BWF9CTE9DS1NfSU5fTUNVXTsKLSAgYm9vbGVhbiBhY19uZWVkZWRbRF9NQVhfQkxPQ0tTX0lOX01DVV07Ci19IGh1ZmZfZW50cm9weV9kZWNvZGVyOwotCi10eXBlZGVmIGh1ZmZfZW50cm9weV9kZWNvZGVyICogaHVmZl9lbnRyb3B5X3B0cjsKLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2Nhbi4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfaHVmZl9kZWNvZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGludCBjaSwgYmxrbiwgZGN0YmwsIGFjdGJsOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLQotICAvKiBDaGVjayB0aGF0IHRoZSBzY2FuIHBhcmFtZXRlcnMgU3MsIFNlLCBBaC9BbCBhcmUgT0sgZm9yIHNlcXVlbnRpYWwgSlBFRy4KLSAgICogVGhpcyBvdWdodCB0byBiZSBhbiBlcnJvciBjb25kaXRpb24sIGJ1dCB3ZSBtYWtlIGl0IGEgd2FybmluZyBiZWNhdXNlCi0gICAqIHRoZXJlIGFyZSBzb21lIGJhc2VsaW5lIGZpbGVzIG91dCB0aGVyZSB3aXRoIGFsbCB6ZXJvZXMgaW4gdGhlc2UgYnl0ZXMuCi0gICAqLwotICBpZiAoY2luZm8tPlNzICE9IDAgfHwgY2luZm8tPlNlICE9IERDVFNJWkUyLTEgfHwKLSAgICAgIGNpbmZvLT5BaCAhPSAwIHx8IGNpbmZvLT5BbCAhPSAwKQotICAgIFdBUk5NUyhjaW5mbywgSldSTl9OT1RfU0VRVUVOVElBTCk7Ci0KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIGRjdGJsID0gY29tcHB0ci0+ZGNfdGJsX25vOwotICAgIGFjdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOwotICAgIC8qIENvbXB1dGUgZGVyaXZlZCB2YWx1ZXMgZm9yIEh1ZmZtYW4gdGFibGVzICovCi0gICAgLyogV2UgbWF5IGRvIHRoaXMgbW9yZSB0aGFuIG9uY2UgZm9yIGEgdGFibGUsIGJ1dCBpdCdzIG5vdCBleHBlbnNpdmUgKi8KLSAgICBqcGVnX21ha2VfZF9kZXJpdmVkX3RibChjaW5mbywgVFJVRSwgZGN0YmwsCi0JCQkgICAgJiBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbZGN0YmxdKTsKLSAgICBqcGVnX21ha2VfZF9kZXJpdmVkX3RibChjaW5mbywgRkFMU0UsIGFjdGJsLAotCQkJICAgICYgZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2FjdGJsXSk7Ci0gICAgLyogSW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCi0gICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldID0gMDsKLSAgfQotCi0gIC8qIFByZWNhbGN1bGF0ZSBkZWNvZGluZyBpbmZvIGZvciBlYWNoIGJsb2NrIGluIGFuIE1DVSBvZiB0aGlzIHNjYW4gKi8KLSAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKLSAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKLSAgICBjb21wcHRyID0gY2luZm8tPmN1cl9jb21wX2luZm9bY2ldOwotICAgIC8qIFByZWNhbGN1bGF0ZSB3aGljaCB0YWJsZSB0byB1c2UgZm9yIGVhY2ggYmxvY2sgKi8KLSAgICBlbnRyb3B5LT5kY19jdXJfdGJsc1tibGtuXSA9IGVudHJvcHktPmRjX2Rlcml2ZWRfdGJsc1tjb21wcHRyLT5kY190Ymxfbm9dOwotICAgIGVudHJvcHktPmFjX2N1cl90YmxzW2Jsa25dID0gZW50cm9weS0+YWNfZGVyaXZlZF90YmxzW2NvbXBwdHItPmFjX3RibF9ub107Ci0gICAgLyogRGVjaWRlIHdoZXRoZXIgd2UgcmVhbGx5IGNhcmUgYWJvdXQgdGhlIGNvZWZmaWNpZW50IHZhbHVlcyAqLwotICAgIGlmIChjb21wcHRyLT5jb21wb25lbnRfbmVlZGVkKSB7Ci0gICAgICBlbnRyb3B5LT5kY19uZWVkZWRbYmxrbl0gPSBUUlVFOwotICAgICAgLyogd2UgZG9uJ3QgbmVlZCB0aGUgQUNzIGlmIHByb2R1Y2luZyBhIDEvOHRoLXNpemUgaW1hZ2UgKi8KLSAgICAgIGVudHJvcHktPmFjX25lZWRlZFtibGtuXSA9IChjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUgPiAxKTsKLSAgICB9IGVsc2UgewotICAgICAgZW50cm9weS0+ZGNfbmVlZGVkW2Jsa25dID0gZW50cm9weS0+YWNfbmVlZGVkW2Jsa25dID0gRkFMU0U7Ci0gICAgfQotICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSBiaXRyZWFkIHN0YXRlIHZhcmlhYmxlcyAqLwotICBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgPSAwOwotICBlbnRyb3B5LT5iaXRzdGF0ZS5nZXRfYnVmZmVyID0gMDsgLyogdW5uZWNlc3NhcnksIGJ1dCBrZWVwcyBQdXJpZnkgcXVpZXQgKi8KLSAgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhID0gRkFMU0U7Ci0KLSAgLyogSW5pdGlhbGl6ZSByZXN0YXJ0IGNvdW50ZXIgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLX0KLQotCi0vKgotICogQ29tcHV0ZSB0aGUgZGVyaXZlZCB2YWx1ZXMgZm9yIGEgSHVmZm1hbiB0YWJsZS4KLSAqIFRoaXMgcm91dGluZSBhbHNvIHBlcmZvcm1zIHNvbWUgdmFsaWRhdGlvbiBjaGVja3Mgb24gdGhlIHRhYmxlLgotICoKLSAqIE5vdGUgdGhpcyBpcyBhbHNvIHVzZWQgYnkgamRwaHVmZi5jLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19tYWtlX2RfZGVyaXZlZF90YmwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNEQywgaW50IHRibG5vLAotCQkJIGRfZGVyaXZlZF90YmwgKiogcGR0YmwpCi17Ci0gIEpIVUZGX1RCTCAqaHRibDsKLSAgZF9kZXJpdmVkX3RibCAqZHRibDsKLSAgaW50IHAsIGksIGwsIF9zaSwgbnVtc3ltYm9sczsKLSAgaW50IGxvb2tiaXRzLCBjdHI7Ci0gIGNoYXIgaHVmZnNpemVbMjU3XTsKLSAgdW5zaWduZWQgaW50IGh1ZmZjb2RlWzI1N107Ci0gIHVuc2lnbmVkIGludCBjb2RlOwotCi0gIC8qIE5vdGUgdGhhdCBodWZmc2l6ZVtdIGFuZCBodWZmY29kZVtdIGFyZSBmaWxsZWQgaW4gY29kZS1sZW5ndGggb3JkZXIsCi0gICAqIHBhcmFsbGVsaW5nIHRoZSBvcmRlciBvZiB0aGUgc3ltYm9scyB0aGVtc2VsdmVzIGluIGh0YmwtPmh1ZmZ2YWxbXS4KLSAgICovCi0KLSAgLyogRmluZCB0aGUgaW5wdXQgSHVmZm1hbiB0YWJsZSAqLwotICBpZiAodGJsbm8gPCAwIHx8IHRibG5vID49IE5VTV9IVUZGX1RCTFMpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfTk9fSFVGRl9UQUJMRSwgdGJsbm8pOwotICBodGJsID0KLSAgICBpc0RDID8gY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbdGJsbm9dIDogY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbdGJsbm9dOwotICBpZiAoaHRibCA9PSBOVUxMKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX0hVRkZfVEFCTEUsIHRibG5vKTsKLQotICAvKiBBbGxvY2F0ZSBhIHdvcmtzcGFjZSBpZiB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBzby4gKi8KLSAgaWYgKCpwZHRibCA9PSBOVUxMKQotICAgICpwZHRibCA9IChkX2Rlcml2ZWRfdGJsICopCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgU0laRU9GKGRfZGVyaXZlZF90YmwpKTsKLSAgZHRibCA9ICpwZHRibDsKLSAgZHRibC0+cHViID0gaHRibDsJCS8qIGZpbGwgaW4gYmFjayBsaW5rICovCi0gIAotICAvKiBGaWd1cmUgQy4xOiBtYWtlIHRhYmxlIG9mIEh1ZmZtYW4gY29kZSBsZW5ndGggZm9yIGVhY2ggc3ltYm9sICovCi0KLSAgcCA9IDA7Ci0gIGZvciAobCA9IDE7IGwgPD0gMTY7IGwrKykgewotICAgIGkgPSAoaW50KSBodGJsLT5iaXRzW2xdOwotICAgIGlmIChpIDwgMCB8fCBwICsgaSA+IDI1NikJLyogcHJvdGVjdCBhZ2FpbnN0IHRhYmxlIG92ZXJydW4gKi8KLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0hVRkZfVEFCTEUpOwotICAgIHdoaWxlIChpLS0pCi0gICAgICBodWZmc2l6ZVtwKytdID0gKGNoYXIpIGw7Ci0gIH0KLSAgaHVmZnNpemVbcF0gPSAwOwotICBudW1zeW1ib2xzID0gcDsKLSAgCi0gIC8qIEZpZ3VyZSBDLjI6IGdlbmVyYXRlIHRoZSBjb2RlcyB0aGVtc2VsdmVzICovCi0gIC8qIFdlIGFsc28gdmFsaWRhdGUgdGhhdCB0aGUgY291bnRzIHJlcHJlc2VudCBhIGxlZ2FsIEh1ZmZtYW4gY29kZSB0cmVlLiAqLwotICAKLSAgY29kZSA9IDA7Ci0gIF9zaSA9IGh1ZmZzaXplWzBdOwotICBwID0gMDsKLSAgd2hpbGUgKGh1ZmZzaXplW3BdKSB7Ci0gICAgd2hpbGUgKCgoaW50KSBodWZmc2l6ZVtwXSkgPT0gX3NpKSB7Ci0gICAgICBodWZmY29kZVtwKytdID0gY29kZTsKLSAgICAgIGNvZGUrKzsKLSAgICB9Ci0gICAgLyogY29kZSBpcyBub3cgMSBtb3JlIHRoYW4gdGhlIGxhc3QgY29kZSB1c2VkIGZvciBjb2RlbGVuZ3RoIHNpOyBidXQKLSAgICAgKiBpdCBtdXN0IHN0aWxsIGZpdCBpbiBzaSBiaXRzLCBzaW5jZSBubyBjb2RlIGlzIGFsbG93ZWQgdG8gYmUgYWxsIG9uZXMuCi0gICAgICovCi0gICAgaWYgKCgoSU5UMzIpIGNvZGUpID49ICgoKElOVDMyKSAxKSA8PCBfc2kpKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSFVGRl9UQUJMRSk7Ci0gICAgY29kZSA8PD0gMTsKLSAgICBfc2krKzsKLSAgfQotCi0gIC8qIEZpZ3VyZSBGLjE1OiBnZW5lcmF0ZSBkZWNvZGluZyB0YWJsZXMgZm9yIGJpdC1zZXF1ZW50aWFsIGRlY29kaW5nICovCi0KLSAgcCA9IDA7Ci0gIGZvciAobCA9IDE7IGwgPD0gMTY7IGwrKykgewotICAgIGlmIChodGJsLT5iaXRzW2xdKSB7Ci0gICAgICAvKiB2YWxvZmZzZXRbbF0gPSBodWZmdmFsW10gaW5kZXggb2YgMXN0IHN5bWJvbCBvZiBjb2RlIGxlbmd0aCBsLAotICAgICAgICogbWludXMgdGhlIG1pbmltdW0gY29kZSBvZiBsZW5ndGggbAotICAgICAgICovCi0gICAgICBkdGJsLT52YWxvZmZzZXRbbF0gPSAoSU5UMzIpIHAgLSAoSU5UMzIpIGh1ZmZjb2RlW3BdOwotICAgICAgcCArPSBodGJsLT5iaXRzW2xdOwotICAgICAgZHRibC0+bWF4Y29kZVtsXSA9IGh1ZmZjb2RlW3AtMV07IC8qIG1heGltdW0gY29kZSBvZiBsZW5ndGggbCAqLwotICAgIH0gZWxzZSB7Ci0gICAgICBkdGJsLT5tYXhjb2RlW2xdID0gLTE7CS8qIC0xIGlmIG5vIGNvZGVzIG9mIHRoaXMgbGVuZ3RoICovCi0gICAgfQotICB9Ci0gIGR0YmwtPm1heGNvZGVbMTddID0gMHhGRkZGRkw7IC8qIGVuc3VyZXMganBlZ19odWZmX2RlY29kZSB0ZXJtaW5hdGVzICovCi0KLSAgLyogQ29tcHV0ZSBsb29rYWhlYWQgdGFibGVzIHRvIHNwZWVkIHVwIGRlY29kaW5nLgotICAgKiBGaXJzdCB3ZSBzZXQgYWxsIHRoZSB0YWJsZSBlbnRyaWVzIHRvIDAsIGluZGljYXRpbmcgInRvbyBsb25nIjsKLSAgICogdGhlbiB3ZSBpdGVyYXRlIHRocm91Z2ggdGhlIEh1ZmZtYW4gY29kZXMgdGhhdCBhcmUgc2hvcnQgZW5vdWdoIGFuZAotICAgKiBmaWxsIGluIGFsbCB0aGUgZW50cmllcyB0aGF0IGNvcnJlc3BvbmQgdG8gYml0IHNlcXVlbmNlcyBzdGFydGluZwotICAgKiB3aXRoIHRoYXQgY29kZS4KLSAgICovCi0KLSAgTUVNWkVSTyhkdGJsLT5sb29rX25iaXRzLCBTSVpFT0YoZHRibC0+bG9va19uYml0cykpOwotCi0gIHAgPSAwOwotICBmb3IgKGwgPSAxOyBsIDw9IEhVRkZfTE9PS0FIRUFEOyBsKyspIHsKLSAgICBmb3IgKGkgPSAxOyBpIDw9IChpbnQpIGh0YmwtPmJpdHNbbF07IGkrKywgcCsrKSB7Ci0gICAgICAvKiBsID0gY3VycmVudCBjb2RlJ3MgbGVuZ3RoLCBwID0gaXRzIGluZGV4IGluIGh1ZmZjb2RlW10gJiBodWZmdmFsW10uICovCi0gICAgICAvKiBHZW5lcmF0ZSBsZWZ0LWp1c3RpZmllZCBjb2RlIGZvbGxvd2VkIGJ5IGFsbCBwb3NzaWJsZSBiaXQgc2VxdWVuY2VzICovCi0gICAgICBsb29rYml0cyA9IGh1ZmZjb2RlW3BdIDw8IChIVUZGX0xPT0tBSEVBRC1sKTsKLSAgICAgIGZvciAoY3RyID0gMSA8PCAoSFVGRl9MT09LQUhFQUQtbCk7IGN0ciA+IDA7IGN0ci0tKSB7Ci0JZHRibC0+bG9va19uYml0c1tsb29rYml0c10gPSBsOwotCWR0YmwtPmxvb2tfc3ltW2xvb2tiaXRzXSA9IGh0YmwtPmh1ZmZ2YWxbcF07Ci0JbG9va2JpdHMrKzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiBWYWxpZGF0ZSBzeW1ib2xzIGFzIGJlaW5nIHJlYXNvbmFibGUuCi0gICAqIEZvciBBQyB0YWJsZXMsIHdlIG1ha2Ugbm8gY2hlY2ssIGJ1dCBhY2NlcHQgYWxsIGJ5dGUgdmFsdWVzIDAuLjI1NS4KLSAgICogRm9yIERDIHRhYmxlcywgd2UgcmVxdWlyZSB0aGUgc3ltYm9scyB0byBiZSBpbiByYW5nZSAwLi4xNS4KLSAgICogKFRpZ2h0ZXIgYm91bmRzIGNvdWxkIGJlIGFwcGxpZWQgZGVwZW5kaW5nIG9uIHRoZSBkYXRhIGRlcHRoIGFuZCBtb2RlLAotICAgKiBidXQgdGhpcyBpcyBzdWZmaWNpZW50IHRvIGVuc3VyZSBzYWZlIGRlY29kaW5nLikKLSAgICovCi0gIGlmIChpc0RDKSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IG51bXN5bWJvbHM7IGkrKykgewotICAgICAgaW50IHN5bSA9IGh0YmwtPmh1ZmZ2YWxbaV07Ci0gICAgICBpZiAoc3ltIDwgMCB8fCBzeW0gPiAxNSkKLQlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9IVUZGX1RBQkxFKTsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogT3V0LW9mLWxpbmUgY29kZSBmb3IgYml0IGZldGNoaW5nIChzaGFyZWQgd2l0aCBqZHBodWZmLmMpLgotICogU2VlIGpkaHVmZi5oIGZvciBpbmZvIGFib3V0IHVzYWdlLgotICogTm90ZTogY3VycmVudCB2YWx1ZXMgb2YgZ2V0X2J1ZmZlciBhbmQgYml0c19sZWZ0IGFyZSBwYXNzZWQgYXMgcGFyYW1ldGVycywKLSAqIGJ1dCBhcmUgcmV0dXJuZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzIG9mIHRoZSBzdGF0ZSBzdHJ1Y3QuCi0gKgotICogT24gbW9zdCBtYWNoaW5lcyBNSU5fR0VUX0JJVFMgc2hvdWxkIGJlIDI1IHRvIGFsbG93IHRoZSBmdWxsIDMyLWJpdCB3aWR0aAotICogb2YgZ2V0X2J1ZmZlciB0byBiZSB1c2VkLiAgKE9uIG1hY2hpbmVzIHdpdGggd2lkZXIgd29yZHMsIGFuIGV2ZW4gbGFyZ2VyCi0gKiBidWZmZXIgY291bGQgYmUgdXNlZC4pICBIb3dldmVyLCBvbiBzb21lIG1hY2hpbmVzIDMyLWJpdCBzaGlmdHMgYXJlCi0gKiBxdWl0ZSBzbG93IGFuZCB0YWtlIHRpbWUgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgcGxhY2VzIHNoaWZ0ZWQuCi0gKiAoVGhpcyBpcyB0cnVlIHdpdGggbW9zdCBQQyBjb21waWxlcnMsIGZvciBpbnN0YW5jZS4pICBJbiB0aGlzIGNhc2UgaXQgbWF5Ci0gKiBiZSBhIHdpbiB0byBzZXQgTUlOX0dFVF9CSVRTIHRvIHRoZSBtaW5pbXVtIHZhbHVlIG9mIDE1LiAgVGhpcyByZWR1Y2VzIHRoZQotICogYXZlcmFnZSBzaGlmdCBkaXN0YW5jZSBhdCB0aGUgY29zdCBvZiBtb3JlIGNhbGxzIHRvIGpwZWdfZmlsbF9iaXRfYnVmZmVyLgotICovCi0KLSNpZmRlZiBTTE9XX1NISUZUXzMyCi0jZGVmaW5lIE1JTl9HRVRfQklUUyAgMTUJLyogbWluaW11bSBhbGxvd2FibGUgdmFsdWUgKi8KLSNlbHNlCi0jZGVmaW5lIE1JTl9HRVRfQklUUyAgKEJJVF9CVUZfU0laRS03KQotI2VuZGlmCi0KLQotR0xPQkFMKGJvb2xlYW4pCi1qcGVnX2ZpbGxfYml0X2J1ZmZlciAoYml0cmVhZF93b3JraW5nX3N0YXRlICogc3RhdGUsCi0JCSAgICAgIHJlZ2lzdGVyIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyLCByZWdpc3RlciBpbnQgYml0c19sZWZ0LAotCQkgICAgICBpbnQgbmJpdHMpCi0vKiBMb2FkIHVwIHRoZSBiaXQgYnVmZmVyIHRvIGEgZGVwdGggb2YgYXQgbGVhc3QgbmJpdHMgKi8KLXsKLSAgLyogQ29weSBoZWF2aWx5IHVzZWQgc3RhdGUgZmllbGRzIGludG8gbG9jYWxzIChob3BlZnVsbHkgcmVnaXN0ZXJzKSAqLwotICByZWdpc3RlciBjb25zdCBKT0NURVQgKiBuZXh0X2lucHV0X2J5dGUgPSBzdGF0ZS0+bmV4dF9pbnB1dF9ieXRlOwotICByZWdpc3RlciBzaXplX3QgYnl0ZXNfaW5fYnVmZmVyID0gc3RhdGUtPmJ5dGVzX2luX2J1ZmZlcjsKLSAgal9kZWNvbXByZXNzX3B0ciBjaW5mbyA9IHN0YXRlLT5jaW5mbzsKLQotICAvKiBBdHRlbXB0IHRvIGxvYWQgYXQgbGVhc3QgTUlOX0dFVF9CSVRTIGJpdHMgaW50byBnZXRfYnVmZmVyLiAqLwotICAvKiAoSXQgaXMgYXNzdW1lZCB0aGF0IG5vIHJlcXVlc3Qgd2lsbCBiZSBmb3IgbW9yZSB0aGFuIHRoYXQgbWFueSBiaXRzLikgKi8KLSAgLyogV2UgZmFpbCB0byBkbyBzbyBvbmx5IGlmIHdlIGhpdCBhIG1hcmtlciBvciBhcmUgZm9yY2VkIHRvIHN1c3BlbmQuICovCi0KLSAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IDApIHsJLyogY2Fubm90IGFkdmFuY2UgcGFzdCBhIG1hcmtlciAqLwotICAgIHdoaWxlIChiaXRzX2xlZnQgPCBNSU5fR0VUX0JJVFMpIHsKLSAgICAgIHJlZ2lzdGVyIGludCBjOwotCi0gICAgICAvKiBBdHRlbXB0IHRvIHJlYWQgYSBieXRlICovCi0gICAgICBpZiAoYnl0ZXNfaW5fYnVmZmVyID09IDApIHsKLQlpZiAoISAoKmNpbmZvLT5zcmMtPmZpbGxfaW5wdXRfYnVmZmVyKSAoY2luZm8pKQotCSAgcmV0dXJuIEZBTFNFOwotCW5leHRfaW5wdXRfYnl0ZSA9IGNpbmZvLT5zcmMtPm5leHRfaW5wdXRfYnl0ZTsKLQlieXRlc19pbl9idWZmZXIgPSBjaW5mby0+c3JjLT5ieXRlc19pbl9idWZmZXI7Ci0gICAgICB9Ci0gICAgICBieXRlc19pbl9idWZmZXItLTsKLSAgICAgIGMgPSBHRVRKT0NURVQoKm5leHRfaW5wdXRfYnl0ZSsrKTsKLQotICAgICAgLyogSWYgaXQncyAweEZGLCBjaGVjayBhbmQgZGlzY2FyZCBzdHVmZmVkIHplcm8gYnl0ZSAqLwotICAgICAgaWYgKGMgPT0gMHhGRikgewotCS8qIExvb3AgaGVyZSB0byBkaXNjYXJkIGFueSBwYWRkaW5nIEZGJ3Mgb24gdGVybWluYXRpbmcgbWFya2VyLAotCSAqIHNvIHRoYXQgd2UgY2FuIHNhdmUgYSB2YWxpZCB1bnJlYWRfbWFya2VyIHZhbHVlLiAgTk9URTogd2Ugd2lsbAotCSAqIGFjY2VwdCBtdWx0aXBsZSBGRidzIGZvbGxvd2VkIGJ5IGEgMCBhcyBtZWFuaW5nIGEgc2luZ2xlIEZGIGRhdGEKLQkgKiBieXRlLiAgVGhpcyBkYXRhIHBhdHRlcm4gaXMgbm90IHZhbGlkIGFjY29yZGluZyB0byB0aGUgc3RhbmRhcmQuCi0JICovCi0JZG8gewotCSAgaWYgKGJ5dGVzX2luX2J1ZmZlciA9PSAwKSB7Ci0JICAgIGlmICghICgqY2luZm8tPnNyYy0+ZmlsbF9pbnB1dF9idWZmZXIpIChjaW5mbykpCi0JICAgICAgcmV0dXJuIEZBTFNFOwotCSAgICBuZXh0X2lucHV0X2J5dGUgPSBjaW5mby0+c3JjLT5uZXh0X2lucHV0X2J5dGU7Ci0JICAgIGJ5dGVzX2luX2J1ZmZlciA9IGNpbmZvLT5zcmMtPmJ5dGVzX2luX2J1ZmZlcjsKLQkgIH0KLQkgIGJ5dGVzX2luX2J1ZmZlci0tOwotCSAgYyA9IEdFVEpPQ1RFVCgqbmV4dF9pbnB1dF9ieXRlKyspOwotCX0gd2hpbGUgKGMgPT0gMHhGRik7Ci0KLQlpZiAoYyA9PSAwKSB7Ci0JICAvKiBGb3VuZCBGRi8wMCwgd2hpY2ggcmVwcmVzZW50cyBhbiBGRiBkYXRhIGJ5dGUgKi8KLQkgIGMgPSAweEZGOwotCX0gZWxzZSB7Ci0JICAvKiBPb3BzLCBpdCdzIGFjdHVhbGx5IGEgbWFya2VyIGluZGljYXRpbmcgZW5kIG9mIGNvbXByZXNzZWQgZGF0YS4KLQkgICAqIFNhdmUgdGhlIG1hcmtlciBjb2RlIGZvciBsYXRlciB1c2UuCi0JICAgKiBGaW5lIHBvaW50OiBpdCBtaWdodCBhcHBlYXIgdGhhdCB3ZSBzaG91bGQgc2F2ZSB0aGUgbWFya2VyIGludG8KLQkgICAqIGJpdHJlYWQgd29ya2luZyBzdGF0ZSwgbm90IHN0cmFpZ2h0IGludG8gcGVybWFuZW50IHN0YXRlLiAgQnV0Ci0JICAgKiBvbmNlIHdlIGhhdmUgaGl0IGEgbWFya2VyLCB3ZSBjYW5ub3QgbmVlZCB0byBzdXNwZW5kIHdpdGhpbiB0aGUKLQkgICAqIGN1cnJlbnQgTUNVLCBiZWNhdXNlIHdlIHdpbGwgcmVhZCBubyBtb3JlIGJ5dGVzIGZyb20gdGhlIGRhdGEKLQkgICAqIHNvdXJjZS4gIFNvIGl0IGlzIE9LIHRvIHVwZGF0ZSBwZXJtYW5lbnQgc3RhdGUgcmlnaHQgYXdheS4KLQkgICAqLwotCSAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSBjOwotCSAgLyogU2VlIGlmIHdlIG5lZWQgdG8gaW5zZXJ0IHNvbWUgZmFrZSB6ZXJvIGJpdHMuICovCi0JICBnb3RvIG5vX21vcmVfYnl0ZXM7Ci0JfQotICAgICAgfQotCi0gICAgICAvKiBPSywgbG9hZCBjIGludG8gZ2V0X2J1ZmZlciAqLwotICAgICAgZ2V0X2J1ZmZlciA9IChnZXRfYnVmZmVyIDw8IDgpIHwgYzsKLSAgICAgIGJpdHNfbGVmdCArPSA4OwotICAgIH0gLyogZW5kIHdoaWxlICovCi0gIH0gZWxzZSB7Ci0gIG5vX21vcmVfYnl0ZXM6Ci0gICAgLyogV2UgZ2V0IGhlcmUgaWYgd2UndmUgcmVhZCB0aGUgbWFya2VyIHRoYXQgdGVybWluYXRlcyB0aGUgY29tcHJlc3NlZAotICAgICAqIGRhdGEgc2VnbWVudC4gIFRoZXJlIHNob3VsZCBiZSBlbm91Z2ggYml0cyBpbiB0aGUgYnVmZmVyIHJlZ2lzdGVyCi0gICAgICogdG8gc2F0aXNmeSB0aGUgcmVxdWVzdDsgaWYgc28sIG5vIHByb2JsZW0uCi0gICAgICovCi0gICAgaWYgKG5iaXRzID4gYml0c19sZWZ0KSB7Ci0gICAgICAvKiBVaC1vaC4gIFJlcG9ydCBjb3JydXB0ZWQgZGF0YSB0byB1c2VyIGFuZCBzdHVmZiB6ZXJvZXMgaW50bwotICAgICAgICogdGhlIGRhdGEgc3RyZWFtLCBzbyB0aGF0IHdlIGNhbiBwcm9kdWNlIHNvbWUga2luZCBvZiBpbWFnZS4KLSAgICAgICAqIFdlIHVzZSBhIG5vbnZvbGF0aWxlIGZsYWcgdG8gZW5zdXJlIHRoYXQgb25seSBvbmUgd2FybmluZyBtZXNzYWdlCi0gICAgICAgKiBhcHBlYXJzIHBlciBkYXRhIHNlZ21lbnQuCi0gICAgICAgKi8KLSAgICAgIGlmICghIGNpbmZvLT5lbnRyb3B5LT5pbnN1ZmZpY2llbnRfZGF0YSkgewotCVdBUk5NUyhjaW5mbywgSldSTl9ISVRfTUFSS0VSKTsKLQljaW5mby0+ZW50cm9weS0+aW5zdWZmaWNpZW50X2RhdGEgPSBUUlVFOwotICAgICAgfQotICAgICAgLyogRmlsbCB0aGUgYnVmZmVyIHdpdGggemVybyBiaXRzICovCi0gICAgICBnZXRfYnVmZmVyIDw8PSBNSU5fR0VUX0JJVFMgLSBiaXRzX2xlZnQ7Ci0gICAgICBiaXRzX2xlZnQgPSBNSU5fR0VUX0JJVFM7Ci0gICAgfQotICB9Ci0KLSAgLyogVW5sb2FkIHRoZSBsb2NhbCByZWdpc3RlcnMgKi8KLSAgc3RhdGUtPm5leHRfaW5wdXRfYnl0ZSA9IG5leHRfaW5wdXRfYnl0ZTsKLSAgc3RhdGUtPmJ5dGVzX2luX2J1ZmZlciA9IGJ5dGVzX2luX2J1ZmZlcjsKLSAgc3RhdGUtPmdldF9idWZmZXIgPSBnZXRfYnVmZmVyOwotICBzdGF0ZS0+Yml0c19sZWZ0ID0gYml0c19sZWZ0OwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBPdXQtb2YtbGluZSBjb2RlIGZvciBIdWZmbWFuIGNvZGUgZGVjb2RpbmcuCi0gKiBTZWUgamRodWZmLmggZm9yIGluZm8gYWJvdXQgdXNhZ2UuCi0gKi8KLQotR0xPQkFMKGludCkKLWpwZWdfaHVmZl9kZWNvZGUgKGJpdHJlYWRfd29ya2luZ19zdGF0ZSAqIHN0YXRlLAotCQkgIHJlZ2lzdGVyIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyLCByZWdpc3RlciBpbnQgYml0c19sZWZ0LAotCQkgIGRfZGVyaXZlZF90YmwgKiBodGJsLCBpbnQgbWluX2JpdHMpCi17Ci0gIHJlZ2lzdGVyIGludCBsID0gbWluX2JpdHM7Ci0gIHJlZ2lzdGVyIElOVDMyIGNvZGU7Ci0KLSAgLyogSFVGRl9ERUNPREUgaGFzIGRldGVybWluZWQgdGhhdCB0aGUgY29kZSBpcyBhdCBsZWFzdCBtaW5fYml0cyAqLwotICAvKiBiaXRzIGxvbmcsIHNvIGZldGNoIHRoYXQgbWFueSBiaXRzIGluIG9uZSBzd29vcC4gKi8KLQotICBDSEVDS19CSVRfQlVGRkVSKCpzdGF0ZSwgbCwgcmV0dXJuIC0xKTsKLSAgY29kZSA9IEdFVF9CSVRTKGwpOwotCi0gIC8qIENvbGxlY3QgdGhlIHJlc3Qgb2YgdGhlIEh1ZmZtYW4gY29kZSBvbmUgYml0IGF0IGEgdGltZS4gKi8KLSAgLyogVGhpcyBpcyBwZXIgRmlndXJlIEYuMTYgaW4gdGhlIEpQRUcgc3BlYy4gKi8KLQotICB3aGlsZSAoY29kZSA+IGh0YmwtPm1heGNvZGVbbF0pIHsKLSAgICBjb2RlIDw8PSAxOwotICAgIENIRUNLX0JJVF9CVUZGRVIoKnN0YXRlLCAxLCByZXR1cm4gLTEpOwotICAgIGNvZGUgfD0gR0VUX0JJVFMoMSk7Ci0gICAgbCsrOwotICB9Ci0KLSAgLyogVW5sb2FkIHRoZSBsb2NhbCByZWdpc3RlcnMgKi8KLSAgc3RhdGUtPmdldF9idWZmZXIgPSBnZXRfYnVmZmVyOwotICBzdGF0ZS0+Yml0c19sZWZ0ID0gYml0c19sZWZ0OwotCi0gIC8qIFdpdGggZ2FyYmFnZSBpbnB1dCB3ZSBtYXkgcmVhY2ggdGhlIHNlbnRpbmVsIHZhbHVlIGwgPSAxNy4gKi8KLQotICBpZiAobCA+IDE2KSB7Ci0gICAgV0FSTk1TKHN0YXRlLT5jaW5mbywgSldSTl9IVUZGX0JBRF9DT0RFKTsKLSAgICByZXR1cm4gMDsJCQkvKiBmYWtlIGEgemVybyBhcyB0aGUgc2FmZXN0IHJlc3VsdCAqLwotICB9Ci0KLSAgcmV0dXJuIGh0YmwtPnB1Yi0+aHVmZnZhbFsgKGludCkgKGNvZGUgKyBodGJsLT52YWxvZmZzZXRbbF0pIF07Ci19Ci0KLQotLyoKLSAqIEZpZ3VyZSBGLjEyOiBleHRlbmQgc2lnbiBiaXQuCi0gKiBPbiBzb21lIG1hY2hpbmVzLCBhIHNoaWZ0IGFuZCBhZGQgd2lsbCBiZSBmYXN0ZXIgdGhhbiBhIHRhYmxlIGxvb2t1cC4KLSAqLwotCi0jaWZkZWYgQVZPSURfVEFCTEVTCi0KLSNkZWZpbmUgSFVGRl9FWFRFTkQoeCxzKSAgKCh4KSA8ICgxPDwoKHMpLTEpKSA/ICh4KSArICgoKC0xKTw8KHMpKSArIDEpIDogKHgpKQotCi0jZWxzZQotCi0jZGVmaW5lIEhVRkZfRVhURU5EKHgscykgICgoeCkgPCBleHRlbmRfdGVzdFtzXSA/ICh4KSArIGV4dGVuZF9vZmZzZXRbc10gOiAoeCkpCi0KLXN0YXRpYyBjb25zdCBpbnQgZXh0ZW5kX3Rlc3RbMTZdID0gICAvKiBlbnRyeSBuIGlzIDIqKihuLTEpICovCi0gIHsgMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODAsCi0gICAgMHgwMTAwLCAweDAyMDAsIDB4MDQwMCwgMHgwODAwLCAweDEwMDAsIDB4MjAwMCwgMHg0MDAwIH07Ci0KLXN0YXRpYyBjb25zdCBpbnQgZXh0ZW5kX29mZnNldFsxNl0gPSAvKiBlbnRyeSBuIGlzICgtMSA8PCBuKSArIDEgKi8KLSAgeyAwLCAoKC0xKTw8MSkgKyAxLCAoKC0xKTw8MikgKyAxLCAoKC0xKTw8MykgKyAxLCAoKC0xKTw8NCkgKyAxLAotICAgICgoLTEpPDw1KSArIDEsICgoLTEpPDw2KSArIDEsICgoLTEpPDw3KSArIDEsICgoLTEpPDw4KSArIDEsCi0gICAgKCgtMSk8PDkpICsgMSwgKCgtMSk8PDEwKSArIDEsICgoLTEpPDwxMSkgKyAxLCAoKC0xKTw8MTIpICsgMSwKLSAgICAoKC0xKTw8MTMpICsgMSwgKCgtMSk8PDE0KSArIDEsICgoLTEpPDwxNSkgKyAxIH07Ci0KLSNlbmRpZiAvKiBBVk9JRF9UQUJMRVMgKi8KLQotCi0vKgotICogQ2hlY2sgZm9yIGEgcmVzdGFydCBtYXJrZXIgJiByZXN5bmNocm9uaXplIGRlY29kZXIuCi0gKiBSZXR1cm5zIEZBTFNFIGlmIG11c3Qgc3VzcGVuZC4KLSAqLwotCi1MT0NBTChib29sZWFuKQotcHJvY2Vzc19yZXN0YXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGludCBjaTsKLQotICAvKiBUaHJvdyBhd2F5IGFueSB1bnVzZWQgYml0cyByZW1haW5pbmcgaW4gYml0IGJ1ZmZlcjsgKi8KLSAgLyogaW5jbHVkZSBhbnkgZnVsbCBieXRlcyBpbiBuZXh0X21hcmtlcidzIGNvdW50IG9mIGRpc2NhcmRlZCBieXRlcyAqLwotICBjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMgKz0gZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0IC8gODsKLSAgZW50cm9weS0+Yml0c3RhdGUuYml0c19sZWZ0ID0gMDsKLQotICAvKiBBZHZhbmNlIHBhc3QgdGhlIFJTVG4gbWFya2VyICovCi0gIGlmICghICgqY2luZm8tPm1hcmtlci0+cmVhZF9yZXN0YXJ0X21hcmtlcikgKGNpbmZvKSkKLSAgICByZXR1cm4gRkFMU0U7Ci0KLSAgLyogUmUtaW5pdGlhbGl6ZSBEQyBwcmVkaWN0aW9ucyB0byAwICovCi0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKQotICAgIGVudHJvcHktPnNhdmVkLmxhc3RfZGNfdmFsW2NpXSA9IDA7Ci0KLSAgLyogUmVzZXQgcmVzdGFydCBjb3VudGVyICovCi0gIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7Ci0KLSAgLyogUmVzZXQgb3V0LW9mLWRhdGEgZmxhZywgdW5sZXNzIHJlYWRfcmVzdGFydF9tYXJrZXIgbGVmdCB1cyBzbWFjayB1cAotICAgKiBhZ2FpbnN0IGEgbWFya2VyLiAgSW4gdGhhdCBjYXNlIHdlIHdpbGwgZW5kIHVwIHRyZWF0aW5nIHRoZSBuZXh0IGRhdGEKLSAgICogc2VnbWVudCBhcyBlbXB0eSwgYW5kIHdlIGNhbiBhdm9pZCBwcm9kdWNpbmcgYm9ndXMgb3V0cHV0IHBpeGVscyBieQotICAgKiBsZWF2aW5nIHRoZSBmbGFnIHNldC4KLSAgICovCi0gIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAwKQotICAgIGVudHJvcHktPnB1Yi5pbnN1ZmZpY2llbnRfZGF0YSA9IEZBTFNFOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBEZWNvZGUgYW5kIHJldHVybiBvbmUgTUNVJ3Mgd29ydGggb2YgSHVmZm1hbi1jb21wcmVzc2VkIGNvZWZmaWNpZW50cy4KLSAqIFRoZSBjb2VmZmljaWVudHMgYXJlIHJlb3JkZXJlZCBmcm9tIHppZ3phZyBvcmRlciBpbnRvIG5hdHVyYWwgYXJyYXkgb3JkZXIsCi0gKiBidXQgYXJlIG5vdCBkZXF1YW50aXplZC4KLSAqCi0gKiBUaGUgaSd0aCBibG9jayBvZiB0aGUgTUNVIGlzIHN0b3JlZCBpbnRvIHRoZSBibG9jayBwb2ludGVkIHRvIGJ5Ci0gKiBNQ1VfZGF0YVtpXS4gIFdFIEFTU1VNRSBUSElTIEFSRUEgSEFTIEJFRU4gWkVST0VEIEJZIFRIRSBDQUxMRVIuCi0gKiAoV2hvbGVzYWxlIHplcm9pbmcgaXMgdXN1YWxseSBhIGxpdHRsZSBmYXN0ZXIgdGhhbiByZXRhaWwuLi4pCi0gKgotICogUmV0dXJucyBGQUxTRSBpZiBkYXRhIHNvdXJjZSByZXF1ZXN0ZWQgc3VzcGVuc2lvbi4gIEluIHRoYXQgY2FzZSBubwotICogY2hhbmdlcyBoYXZlIGJlZW4gbWFkZSB0byBwZXJtYW5lbnQgc3RhdGUuICAoRXhjZXB0aW9uOiBzb21lIG91dHB1dAotICogY29lZmZpY2llbnRzIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBhc3NpZ25lZC4gIFRoaXMgaXMgaGFybWxlc3MgZm9yCi0gKiB0aGlzIG1vZHVsZSwgc2luY2Ugd2UnbGwganVzdCByZS1hc3NpZ24gdGhlbSBvbiB0aGUgbmV4dCBjYWxsLikKLSAqLwotCi1NRVRIT0RERUYoYm9vbGVhbikKLWRlY29kZV9tY3UgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCi17Ci0gIGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgaW50IGJsa247Ci0gIEJJVFJFQURfU1RBVEVfVkFSUzsKLSAgc2F2YWJsZV9zdGF0ZSBzdGF0ZTsKLQotICAvKiBQcm9jZXNzIHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZDsgbWF5IGhhdmUgdG8gc3VzcGVuZCAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKLSAgICAgIGlmICghIHByb2Nlc3NfcmVzdGFydChjaW5mbykpCi0JcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgLyogSWYgd2UndmUgcnVuIG91dCBvZiBkYXRhLCBqdXN0IGxlYXZlIHRoZSBNQ1Ugc2V0IHRvIHplcm9lcy4KLSAgICogVGhpcyB3YXksIHdlIHJldHVybiB1bmlmb3JtIGdyYXkgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHNlZ21lbnQuCi0gICAqLwotICBpZiAoISBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEpIHsKLQotICAgIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZSAqLwotICAgIEJJVFJFQURfTE9BRF9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7Ci0gICAgQVNTSUdOX1NUQVRFKHN0YXRlLCBlbnRyb3B5LT5zYXZlZCk7Ci0KLSAgICAvKiBPdXRlciBsb29wIGhhbmRsZXMgZWFjaCBibG9jayBpbiB0aGUgTUNVICovCi0KLSAgICBmb3IgKGJsa24gPSAwOyBibGtuIDwgY2luZm8tPmJsb2Nrc19pbl9NQ1U7IGJsa24rKykgewotICAgICAgSkJMT0NLUk9XIGJsb2NrID0gTUNVX2RhdGFbYmxrbl07Ci0gICAgICBkX2Rlcml2ZWRfdGJsICogZGN0YmwgPSBlbnRyb3B5LT5kY19jdXJfdGJsc1tibGtuXTsKLSAgICAgIGRfZGVyaXZlZF90YmwgKiBhY3RibCA9IGVudHJvcHktPmFjX2N1cl90YmxzW2Jsa25dOwotICAgICAgcmVnaXN0ZXIgaW50IHMsIGssIHI7Ci0KLSAgICAgIC8qIERlY29kZSBhIHNpbmdsZSBibG9jaydzIHdvcnRoIG9mIGNvZWZmaWNpZW50cyAqLwotCi0gICAgICAvKiBTZWN0aW9uIEYuMi4yLjE6IGRlY29kZSB0aGUgREMgY29lZmZpY2llbnQgZGlmZmVyZW5jZSAqLwotICAgICAgSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIGRjdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMSk7Ci0gICAgICBpZiAocykgewotCUNIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7Ci0JciA9IEdFVF9CSVRTKHMpOwotCXMgPSBIVUZGX0VYVEVORChyLCBzKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGVudHJvcHktPmRjX25lZWRlZFtibGtuXSkgewotCS8qIENvbnZlcnQgREMgZGlmZmVyZW5jZSB0byBhY3R1YWwgdmFsdWUsIHVwZGF0ZSBsYXN0X2RjX3ZhbCAqLwotCWludCBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKLQlzICs9IHN0YXRlLmxhc3RfZGNfdmFsW2NpXTsKLQlzdGF0ZS5sYXN0X2RjX3ZhbFtjaV0gPSBzOwotCS8qIE91dHB1dCB0aGUgREMgY29lZmZpY2llbnQgKGFzc3VtZXMganBlZ19uYXR1cmFsX29yZGVyWzBdID0gMCkgKi8KLQkoKmJsb2NrKVswXSA9IChKQ09FRikgczsKLSAgICAgIH0KLQotICAgICAgaWYgKGVudHJvcHktPmFjX25lZWRlZFtibGtuXSkgewotCi0JLyogU2VjdGlvbiBGLjIuMi4yOiBkZWNvZGUgdGhlIEFDIGNvZWZmaWNpZW50cyAqLwotCS8qIFNpbmNlIHplcm9lcyBhcmUgc2tpcHBlZCwgb3V0cHV0IGFyZWEgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZWhhbmQgKi8KLQlmb3IgKGsgPSAxOyBrIDwgRENUU0laRTI7IGsrKykgewotCSAgSFVGRl9ERUNPREUocywgYnJfc3RhdGUsIGFjdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMik7Ci0gICAgICAKLQkgIHIgPSBzID4+IDQ7Ci0JICBzICY9IDE1OwotICAgICAgCi0JICBpZiAocykgewotCSAgICBrICs9IHI7Ci0JICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7Ci0JICAgIHIgPSBHRVRfQklUUyhzKTsKLQkgICAgcyA9IEhVRkZfRVhURU5EKHIsIHMpOwotCSAgICAvKiBPdXRwdXQgY29lZmZpY2llbnQgaW4gbmF0dXJhbCAoZGV6aWd6YWdnZWQpIG9yZGVyLgotCSAgICAgKiBOb3RlOiB0aGUgZXh0cmEgZW50cmllcyBpbiBqcGVnX25hdHVyYWxfb3JkZXJbXSB3aWxsIHNhdmUgdXMKLQkgICAgICogaWYgayA+PSBEQ1RTSVpFMiwgd2hpY2ggY291bGQgaGFwcGVuIGlmIHRoZSBkYXRhIGlzIGNvcnJ1cHRlZC4KLQkgICAgICovCi0JICAgICgqYmxvY2spW2pwZWdfbmF0dXJhbF9vcmRlcltrXV0gPSAoSkNPRUYpIHM7Ci0JICB9IGVsc2UgewotCSAgICBpZiAociAhPSAxNSkKLQkgICAgICBicmVhazsKLQkgICAgayArPSAxNTsKLQkgIH0KLQl9Ci0KLSAgICAgIH0gZWxzZSB7Ci0KLQkvKiBTZWN0aW9uIEYuMi4yLjI6IGRlY29kZSB0aGUgQUMgY29lZmZpY2llbnRzICovCi0JLyogSW4gdGhpcyBwYXRoIHdlIGp1c3QgZGlzY2FyZCB0aGUgdmFsdWVzICovCi0JZm9yIChrID0gMTsgayA8IERDVFNJWkUyOyBrKyspIHsKLQkgIEhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCBhY3RibCwgcmV0dXJuIEZBTFNFLCBsYWJlbDMpOwotICAgICAgCi0JICByID0gcyA+PiA0OwotCSAgcyAmPSAxNTsKLSAgICAgIAotCSAgaWYgKHMpIHsKLQkgICAgayArPSByOwotCSAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCBzLCByZXR1cm4gRkFMU0UpOwotCSAgICBEUk9QX0JJVFMocyk7Ci0JICB9IGVsc2UgewotCSAgICBpZiAociAhPSAxNSkKLQkgICAgICBicmVhazsKLQkgICAgayArPSAxNTsKLQkgIH0KLQl9Ci0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KLSAgICBCSVRSRUFEX1NBVkVfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotICAgIEFTU0lHTl9TVEFURShlbnRyb3B5LT5zYXZlZCwgc3RhdGUpOwotICB9Ci0KLSAgLyogQWNjb3VudCBmb3IgcmVzdGFydCBpbnRlcnZhbCAobm8tb3AgaWYgbm90IHVzaW5nIHJlc3RhcnRzKSAqLwotICBlbnRyb3B5LT5yZXN0YXJ0c190b19nby0tOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgSHVmZm1hbiBlbnRyb3B5IGRlY29kaW5nLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfaHVmZl9kZWNvZGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBodWZmX2VudHJvcHlfcHRyIGVudHJvcHk7Ci0gIGludCBpOwotCi0gIGVudHJvcHkgPSAoaHVmZl9lbnRyb3B5X3B0cikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCVNJWkVPRihodWZmX2VudHJvcHlfZGVjb2RlcikpOwotICBjaW5mby0+ZW50cm9weSA9IChzdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgKikgZW50cm9weTsKLSAgZW50cm9weS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX2h1ZmZfZGVjb2RlcjsKLSAgZW50cm9weS0+cHViLmRlY29kZV9tY3UgPSBkZWNvZGVfbWN1OwotCi0gIC8qIE1hcmsgdGFibGVzIHVuYWxsb2NhdGVkICovCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fSFVGRl9UQkxTOyBpKyspIHsKLSAgICBlbnRyb3B5LT5kY19kZXJpdmVkX3RibHNbaV0gPSBlbnRyb3B5LT5hY19kZXJpdmVkX3RibHNbaV0gPSBOVUxMOwotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRpbnB1dC5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkaW5wdXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMyYWM4Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRpbnB1dC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzgxICswLDAgQEAKLS8qCi0gKiBqZGlucHV0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBpbnB1dCBjb250cm9sIGxvZ2ljIGZvciB0aGUgSlBFRyBkZWNvbXByZXNzb3IuCi0gKiBUaGVzZSByb3V0aW5lcyBhcmUgY29uY2VybmVkIHdpdGggY29udHJvbGxpbmcgdGhlIGRlY29tcHJlc3NvcidzIGlucHV0Ci0gKiBwcm9jZXNzaW5nIChtYXJrZXIgcmVhZGluZyBhbmQgY29lZmZpY2llbnQgZGVjb2RpbmcpLiAgVGhlIGFjdHVhbCBpbnB1dAotICogcmVhZGluZyBpcyBkb25lIGluIGpkbWFya2VyLmMsIGpkaHVmZi5jLCBhbmQgamRwaHVmZi5jLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBQcml2YXRlIHN0YXRlICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfaW5wdXRfY29udHJvbGxlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICBib29sZWFuIGluaGVhZGVyczsJCS8qIFRSVUUgdW50aWwgZmlyc3QgU09TIGlzIHJlYWNoZWQgKi8KLX0gbXlfaW5wdXRfY29udHJvbGxlcjsKLQotdHlwZWRlZiBteV9pbnB1dF9jb250cm9sbGVyICogbXlfaW5wdXRjdGxfcHRyOwotCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi1NRVRIT0RERUYoaW50KSBjb25zdW1lX21hcmtlcnMgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLQotLyoKLSAqIFJvdXRpbmVzIHRvIGNhbGN1bGF0ZSB2YXJpb3VzIHF1YW50aXRpZXMgcmVsYXRlZCB0byB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2UuCi0gKi8KLQotTE9DQUwodm9pZCkKLWluaXRpYWxfc2V0dXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBDYWxsZWQgb25jZSwgd2hlbiBmaXJzdCBTT1MgbWFya2VyIGlzIHJlYWNoZWQgKi8KLXsKLSAgaW50IGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotCi0gIC8qIE1ha2Ugc3VyZSBpbWFnZSBpc24ndCBiaWdnZXIgdGhhbiBJIGNhbiBoYW5kbGUgKi8KLSAgaWYgKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ID4gKGxvbmcpIEpQRUdfTUFYX0RJTUVOU0lPTiB8fAotICAgICAgKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCA+IChsb25nKSBKUEVHX01BWF9ESU1FTlNJT04pCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfSU1BR0VfVE9PX0JJRywgKHVuc2lnbmVkIGludCkgSlBFR19NQVhfRElNRU5TSU9OKTsKLQotICAvKiBGb3Igbm93LCBwcmVjaXNpb24gbXVzdCBtYXRjaCBjb21waWxlZC1pbiB2YWx1ZS4uLiAqLwotICBpZiAoY2luZm8tPmRhdGFfcHJlY2lzaW9uICE9IEJJVFNfSU5fSlNBTVBMRSkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUFJFQ0lTSU9OLCBjaW5mby0+ZGF0YV9wcmVjaXNpb24pOwotCi0gIC8qIENoZWNrIHRoYXQgbnVtYmVyIG9mIGNvbXBvbmVudHMgd29uJ3QgZXhjZWVkIGludGVybmFsIGFycmF5IHNpemVzICovCi0gIGlmIChjaW5mby0+bnVtX2NvbXBvbmVudHMgPiBNQVhfQ09NUE9ORU5UUykKLSAgICBFUlJFWElUMihjaW5mbywgSkVSUl9DT01QT05FTlRfQ09VTlQsIGNpbmZvLT5udW1fY29tcG9uZW50cywKLQkgICAgIE1BWF9DT01QT05FTlRTKTsKLQotICAvKiBDb21wdXRlIG1heGltdW0gc2FtcGxpbmcgZmFjdG9yczsgY2hlY2sgZmFjdG9yIHZhbGlkaXR5ICovCi0gIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciA9IDE7Ci0gIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciA9IDE7Ci0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgaWYgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3I8PTAgfHwgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcj5NQVhfU0FNUF9GQUNUT1IgfHwKLQljb21wcHRyLT52X3NhbXBfZmFjdG9yPD0wIHx8IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I+TUFYX1NBTVBfRkFDVE9SKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfU0FNUExJTkcpOwotICAgIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciA9IE1BWChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IsCi0JCQkJICAgY29tcHB0ci0+aF9zYW1wX2ZhY3Rvcik7Ci0gICAgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yID0gTUFYKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciwKLQkJCQkgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKLSAgfQotCi0gIC8qIFdlIGluaXRpYWxpemUgRENUX3NjYWxlZF9zaXplIGFuZCBtaW5fRENUX3NjYWxlZF9zaXplIHRvIERDVFNJWkUuCi0gICAqIEluIHRoZSBmdWxsIGRlY29tcHJlc3NvciwgdGhpcyB3aWxsIGJlIG92ZXJyaWRkZW4gYnkgamRtYXN0ZXIuYzsKLSAgICogYnV0IGluIHRoZSB0cmFuc2NvZGVyLCBqZG1hc3Rlci5jIGlzIG5vdCB1c2VkLCBzbyB3ZSBtdXN0IGRvIGl0IGhlcmUuCi0gICAqLwotICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA9IERDVFNJWkU7Ci0KLSAgLyogQ29tcHV0ZSBkaW1lbnNpb25zIG9mIGNvbXBvbmVudHMgKi8KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUgPSBEQ1RTSVpFOwotICAgIC8qIFNpemUgaW4gRENUIGJsb2NrcyAqLwotICAgIGNvbXBwdHItPndpZHRoX2luX2Jsb2NrcyA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoICogKGxvbmcpIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsCi0JCSAgICAobG9uZykgKGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKLSAgICBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ICogKGxvbmcpIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IsCi0JCSAgICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKLSAgICAvKiBkb3duc2FtcGxlZF93aWR0aCBhbmQgZG93bnNhbXBsZWRfaGVpZ2h0IHdpbGwgYWxzbyBiZSBvdmVycmlkZGVuIGJ5Ci0gICAgICogamRtYXN0ZXIuYyBpZiB3ZSBhcmUgZG9pbmcgZnVsbCBkZWNvbXByZXNzaW9uLiAgVGhlIHRyYW5zY29kZXIgbGlicmFyeQotICAgICAqIGRvZXNuJ3QgdXNlIHRoZXNlIHZhbHVlcywgYnV0IHRoZSBjYWxsaW5nIGFwcGxpY2F0aW9uIG1pZ2h0LgotICAgICAqLwotICAgIC8qIFNpemUgaW4gc2FtcGxlcyAqLwotICAgIGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGggKiAobG9uZykgY29tcHB0ci0+aF9zYW1wX2ZhY3RvciwKLQkJICAgIChsb25nKSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IpOwotICAgIGNvbXBwdHItPmRvd25zYW1wbGVkX2hlaWdodCA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCAqIChsb25nKSBjb21wcHRyLT52X3NhbXBfZmFjdG9yLAotCQkgICAgKGxvbmcpIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3Rvcik7Ci0gICAgLyogTWFyayBjb21wb25lbnQgbmVlZGVkLCB1bnRpbCBjb2xvciBjb252ZXJzaW9uIHNheXMgb3RoZXJ3aXNlICovCi0gICAgY29tcHB0ci0+Y29tcG9uZW50X25lZWRlZCA9IFRSVUU7Ci0gICAgLyogTWFyayBubyBxdWFudGl6YXRpb24gdGFibGUgeWV0IHNhdmVkIGZvciBjb21wb25lbnQgKi8KLSAgICBjb21wcHRyLT5xdWFudF90YWJsZSA9IE5VTEw7Ci0gIH0KLQotICAvKiBDb21wdXRlIG51bWJlciBvZiBmdWxseSBpbnRlcmxlYXZlZCBNQ1Ugcm93cy4gKi8KLSAgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyA9IChKRElNRU5TSU9OKQotICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsCi0JCSAgKGxvbmcpIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IqRENUU0laRSkpOwotCi0gIC8qIERlY2lkZSB3aGV0aGVyIGZpbGUgY29udGFpbnMgbXVsdGlwbGUgc2NhbnMgKi8KLSAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuIDwgY2luZm8tPm51bV9jb21wb25lbnRzIHx8IGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKQotICAgIGNpbmZvLT5pbnB1dGN0bC0+aGFzX211bHRpcGxlX3NjYW5zID0gVFJVRTsKLSAgZWxzZQotICAgIGNpbmZvLT5pbnB1dGN0bC0+aGFzX211bHRpcGxlX3NjYW5zID0gRkFMU0U7Ci19Ci0KLQotTE9DQUwodm9pZCkKLXBlcl9zY2FuX3NldHVwIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogRG8gY29tcHV0YXRpb25zIHRoYXQgYXJlIG5lZWRlZCBiZWZvcmUgcHJvY2Vzc2luZyBhIEpQRUcgc2NhbiAqLwotLyogY2luZm8tPmNvbXBzX2luX3NjYW4gYW5kIGNpbmZvLT5jdXJfY29tcF9pbmZvW10gd2VyZSBzZXQgZnJvbSBTT1MgbWFya2VyICovCi17Ci0gIGludCBjaSwgbWN1YmxrcywgdG1wOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICAKLSAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuID09IDEpIHsKLSAgICAKLSAgICAvKiBOb25pbnRlcmxlYXZlZCAoc2luZ2xlLWNvbXBvbmVudCkgc2NhbiAqLwotICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1swXTsKLSAgICAKLSAgICAvKiBPdmVyYWxsIGltYWdlIHNpemUgaW4gTUNVcyAqLwotICAgIGNpbmZvLT5NQ1VzX3Blcl9yb3cgPSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3M7Ci0gICAgY2luZm8tPk1DVV9yb3dzX2luX3NjYW4gPSBjb21wcHRyLT5oZWlnaHRfaW5fYmxvY2tzOwotICAgIAotICAgIC8qIEZvciBub25pbnRlcmxlYXZlZCBzY2FuLCBhbHdheXMgb25lIGJsb2NrIHBlciBNQ1UgKi8KLSAgICBjb21wcHRyLT5NQ1Vfd2lkdGggPSAxOwotICAgIGNvbXBwdHItPk1DVV9oZWlnaHQgPSAxOwotICAgIGNvbXBwdHItPk1DVV9ibG9ja3MgPSAxOwotICAgIGNvbXBwdHItPk1DVV9zYW1wbGVfd2lkdGggPSBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0gICAgY29tcHB0ci0+bGFzdF9jb2xfd2lkdGggPSAxOwotICAgIC8qIEZvciBub25pbnRlcmxlYXZlZCBzY2FucywgaXQgaXMgY29udmVuaWVudCB0byBkZWZpbmUgbGFzdF9yb3dfaGVpZ2h0Ci0gICAgICogYXMgdGhlIG51bWJlciBvZiBibG9jayByb3dzIHByZXNlbnQgaW4gdGhlIGxhc3QgaU1DVSByb3cuCi0gICAgICovCi0gICAgdG1wID0gKGludCkgKGNvbXBwdHItPmhlaWdodF9pbl9ibG9ja3MgJSBjb21wcHRyLT52X3NhbXBfZmFjdG9yKTsKLSAgICBpZiAodG1wID09IDApIHRtcCA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gICAgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0ID0gdG1wOwotICAgIAotICAgIC8qIFByZXBhcmUgYXJyYXkgZGVzY3JpYmluZyBNQ1UgY29tcG9zaXRpb24gKi8KLSAgICBjaW5mby0+YmxvY2tzX2luX01DVSA9IDE7Ci0gICAgY2luZm8tPk1DVV9tZW1iZXJzaGlwWzBdID0gMDsKLSAgICAKLSAgfSBlbHNlIHsKLSAgICAKLSAgICAvKiBJbnRlcmxlYXZlZCAobXVsdGktY29tcG9uZW50KSBzY2FuICovCi0gICAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuIDw9IDAgfHwgY2luZm8tPmNvbXBzX2luX3NjYW4gPiBNQVhfQ09NUFNfSU5fU0NBTikKLSAgICAgIEVSUkVYSVQyKGNpbmZvLCBKRVJSX0NPTVBPTkVOVF9DT1VOVCwgY2luZm8tPmNvbXBzX2luX3NjYW4sCi0JICAgICAgIE1BWF9DT01QU19JTl9TQ0FOKTsKLSAgICAKLSAgICAvKiBPdmVyYWxsIGltYWdlIHNpemUgaW4gTUNVcyAqLwotICAgIGNpbmZvLT5NQ1VzX3Blcl9yb3cgPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCwKLQkJICAgIChsb25nKSAoY2luZm8tPm1heF9oX3NhbXBfZmFjdG9yKkRDVFNJWkUpKTsKLSAgICBjaW5mby0+TUNVX3Jvd3NfaW5fc2NhbiA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwKLQkJICAgIChsb25nKSAoY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKkRDVFNJWkUpKTsKLSAgICAKLSAgICBjaW5mby0+YmxvY2tzX2luX01DVSA9IDA7Ci0gICAgCi0gICAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspIHsKLSAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgICAvKiBTYW1wbGluZyBmYWN0b3JzIGdpdmUgIyBvZiBibG9ja3Mgb2YgY29tcG9uZW50IGluIGVhY2ggTUNVICovCi0gICAgICBjb21wcHRyLT5NQ1Vfd2lkdGggPSBjb21wcHRyLT5oX3NhbXBfZmFjdG9yOwotICAgICAgY29tcHB0ci0+TUNVX2hlaWdodCA9IGNvbXBwdHItPnZfc2FtcF9mYWN0b3I7Ci0gICAgICBjb21wcHRyLT5NQ1VfYmxvY2tzID0gY29tcHB0ci0+TUNVX3dpZHRoICogY29tcHB0ci0+TUNVX2hlaWdodDsKLSAgICAgIGNvbXBwdHItPk1DVV9zYW1wbGVfd2lkdGggPSBjb21wcHRyLT5NQ1Vfd2lkdGggKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemU7Ci0gICAgICAvKiBGaWd1cmUgbnVtYmVyIG9mIG5vbi1kdW1teSBibG9ja3MgaW4gbGFzdCBNQ1UgY29sdW1uICYgcm93ICovCi0gICAgICB0bXAgPSAoaW50KSAoY29tcHB0ci0+d2lkdGhfaW5fYmxvY2tzICUgY29tcHB0ci0+TUNVX3dpZHRoKTsKLSAgICAgIGlmICh0bXAgPT0gMCkgdG1wID0gY29tcHB0ci0+TUNVX3dpZHRoOwotICAgICAgY29tcHB0ci0+bGFzdF9jb2xfd2lkdGggPSB0bXA7Ci0gICAgICB0bXAgPSAoaW50KSAoY29tcHB0ci0+aGVpZ2h0X2luX2Jsb2NrcyAlIGNvbXBwdHItPk1DVV9oZWlnaHQpOwotICAgICAgaWYgKHRtcCA9PSAwKSB0bXAgPSBjb21wcHRyLT5NQ1VfaGVpZ2h0OwotICAgICAgY29tcHB0ci0+bGFzdF9yb3dfaGVpZ2h0ID0gdG1wOwotICAgICAgLyogUHJlcGFyZSBhcnJheSBkZXNjcmliaW5nIE1DVSBjb21wb3NpdGlvbiAqLwotICAgICAgbWN1YmxrcyA9IGNvbXBwdHItPk1DVV9ibG9ja3M7Ci0gICAgICBpZiAoY2luZm8tPmJsb2Nrc19pbl9NQ1UgKyBtY3VibGtzID4gRF9NQVhfQkxPQ0tTX0lOX01DVSkKLQlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9NQ1VfU0laRSk7Ci0gICAgICB3aGlsZSAobWN1Ymxrcy0tID4gMCkgewotCWNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtjaW5mby0+YmxvY2tzX2luX01DVSsrXSA9IGNpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgfQotfQotCi0KLS8qCi0gKiBTYXZlIGF3YXkgYSBjb3B5IG9mIHRoZSBRLXRhYmxlIHJlZmVyZW5jZWQgYnkgZWFjaCBjb21wb25lbnQgcHJlc2VudAotICogaW4gdGhlIGN1cnJlbnQgc2NhbiwgdW5sZXNzIGFscmVhZHkgc2F2ZWQgZHVyaW5nIGEgcHJpb3Igc2Nhbi4KLSAqCi0gKiBJbiBhIG11bHRpcGxlLXNjYW4gSlBFRyBmaWxlLCB0aGUgZW5jb2RlciBjb3VsZCBhc3NpZ24gZGlmZmVyZW50IGNvbXBvbmVudHMKLSAqIHRoZSBzYW1lIFEtdGFibGUgc2xvdCBudW1iZXIsIGJ1dCBjaGFuZ2UgdGFibGUgZGVmaW5pdGlvbnMgYmV0d2VlbiBzY2FucwotICogc28gdGhhdCBlYWNoIGNvbXBvbmVudCB1c2VzIGEgZGlmZmVyZW50IFEtdGFibGUuICAoVGhlIElKRyBlbmNvZGVyIGlzIG5vdAotICogY3VycmVudGx5IGNhcGFibGUgb2YgZG9pbmcgdGhpcywgYnV0IG90aGVyIGVuY29kZXJzIG1pZ2h0LikgIFNpbmNlIHdlIHdhbnQKLSAqIHRvIGJlIGFibGUgdG8gZGVxdWFudGl6ZSBhbGwgdGhlIGNvbXBvbmVudHMgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwgdGhpcwotICogbWVhbnMgdGhhdCB3ZSBoYXZlIHRvIHNhdmUgYXdheSB0aGUgdGFibGUgYWN0dWFsbHkgdXNlZCBmb3IgZWFjaCBjb21wb25lbnQuCi0gKiBXZSBkbyB0aGlzIGJ5IGNvcHlpbmcgdGhlIHRhYmxlIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlyc3Qgc2NhbiBjb250YWluaW5nCi0gKiB0aGUgY29tcG9uZW50LgotICogVGhlIEpQRUcgc3BlYyBwcm9oaWJpdHMgdGhlIGVuY29kZXIgZnJvbSBjaGFuZ2luZyB0aGUgY29udGVudHMgb2YgYSBRLXRhYmxlCi0gKiBzbG90IGJldHdlZW4gc2NhbnMgb2YgYSBjb21wb25lbnQgdXNpbmcgdGhhdCBzbG90LiAgSWYgdGhlIGVuY29kZXIgZG9lcyBzbwotICogYW55d2F5LCB0aGlzIGRlY29kZXIgd2lsbCBzaW1wbHkgdXNlIHRoZSBRLXRhYmxlIHZhbHVlcyB0aGF0IHdlcmUgY3VycmVudAotICogYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBzY2FuIGZvciB0aGUgY29tcG9uZW50LgotICoKLSAqIFRoZSBkZWNvbXByZXNzb3Igb3V0cHV0IHNpZGUgbG9va3Mgb25seSBhdCB0aGUgc2F2ZWQgcXVhbnQgdGFibGVzLAotICogbm90IGF0IHRoZSBjdXJyZW50IFEtdGFibGUgc2xvdHMuCi0gKi8KLQotTE9DQUwodm9pZCkKLWxhdGNoX3F1YW50X3RhYmxlcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgaW50IGNpLCBxdGJsbm87Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIEpRVUFOVF9UQkwgKiBxdGJsOwotCi0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICAvKiBObyB3b3JrIGlmIHdlIGFscmVhZHkgc2F2ZWQgUS10YWJsZSBmb3IgdGhpcyBjb21wb25lbnQgKi8KLSAgICBpZiAoY29tcHB0ci0+cXVhbnRfdGFibGUgIT0gTlVMTCkKLSAgICAgIGNvbnRpbnVlOwotICAgIC8qIE1ha2Ugc3VyZSBzcGVjaWZpZWQgcXVhbnRpemF0aW9uIHRhYmxlIGlzIHByZXNlbnQgKi8KLSAgICBxdGJsbm8gPSBjb21wcHRyLT5xdWFudF90Ymxfbm87Ci0gICAgaWYgKHF0YmxubyA8IDAgfHwgcXRibG5vID49IE5VTV9RVUFOVF9UQkxTIHx8Ci0JY2luZm8tPnF1YW50X3RibF9wdHJzW3F0Ymxub10gPT0gTlVMTCkKLSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX05PX1FVQU5UX1RBQkxFLCBxdGJsbm8pOwotICAgIC8qIE9LLCBzYXZlIGF3YXkgdGhlIHF1YW50aXphdGlvbiB0YWJsZSAqLwotICAgIHF0YmwgPSAoSlFVQU5UX1RCTCAqKQotICAgICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkgIFNJWkVPRihKUVVBTlRfVEJMKSk7Ci0gICAgTUVNQ09QWShxdGJsLCBjaW5mby0+cXVhbnRfdGJsX3B0cnNbcXRibG5vXSwgU0laRU9GKEpRVUFOVF9UQkwpKTsKLSAgICBjb21wcHRyLT5xdWFudF90YWJsZSA9IHF0Ymw7Ci0gIH0KLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgaW5wdXQgbW9kdWxlcyB0byByZWFkIGEgc2NhbiBvZiBjb21wcmVzc2VkIGRhdGEuCi0gKiBUaGUgZmlyc3QgY2FsbCB0byB0aGlzIGlzIGRvbmUgYnkgamRtYXN0ZXIuYyBhZnRlciBpbml0aWFsaXppbmcKLSAqIHRoZSBlbnRpcmUgZGVjb21wcmVzc29yIChkdXJpbmcganBlZ19zdGFydF9kZWNvbXByZXNzKS4KLSAqIFN1YnNlcXVlbnQgY2FsbHMgY29tZSBmcm9tIGNvbnN1bWVfbWFya2VycywgYmVsb3cuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9pbnB1dF9wYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBwZXJfc2Nhbl9zZXR1cChjaW5mbyk7Ci0gIGxhdGNoX3F1YW50X3RhYmxlcyhjaW5mbyk7Ci0gICgqY2luZm8tPmVudHJvcHktPnN0YXJ0X3Bhc3MpIChjaW5mbyk7Ci0gICgqY2luZm8tPmNvZWYtPnN0YXJ0X2lucHV0X3Bhc3MpIChjaW5mbyk7Ci0gIGNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCA9IGNpbmZvLT5jb2VmLT5jb25zdW1lX2RhdGE7Ci19Ci0KLQotLyoKLSAqIEZpbmlzaCB1cCBhZnRlciBpbnB1dHRpbmcgYSBjb21wcmVzc2VkLWRhdGEgc2Nhbi4KLSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyIGFmdGVyIGl0J3MgcmVhZCBhbGwKLSAqIHRoZSBleHBlY3RlZCBkYXRhIG9mIHRoZSBzY2FuLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX2lucHV0X3Bhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCA9IGNvbnN1bWVfbWFya2VyczsKLX0KLQotCi0vKgotICogUmVhZCBKUEVHIG1hcmtlcnMgYmVmb3JlLCBiZXR3ZWVuLCBvciBhZnRlciBjb21wcmVzc2VkLWRhdGEgc2NhbnMuCi0gKiBDaGFuZ2Ugc3RhdGUgYXMgbmVjZXNzYXJ5IHdoZW4gYSBuZXcgc2NhbiBpcyByZWFjaGVkLgotICogUmV0dXJuIHZhbHVlIGlzIEpQRUdfU1VTUEVOREVELCBKUEVHX1JFQUNIRURfU09TLCBvciBKUEVHX1JFQUNIRURfRU9JLgotICoKLSAqIFRoZSBjb25zdW1lX2lucHV0IG1ldGhvZCBwb2ludGVyIHBvaW50cyBlaXRoZXIgaGVyZSBvciB0byB0aGUKLSAqIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIncyBjb25zdW1lX2RhdGEgcm91dGluZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIKLSAqIHdlIGFyZSByZWFkaW5nIGEgY29tcHJlc3NlZCBkYXRhIHNlZ21lbnQgb3IgaW50ZXItc2VnbWVudCBtYXJrZXJzLgotICovCi0KLU1FVEhPRERFRihpbnQpCi1jb25zdW1lX21hcmtlcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2lucHV0Y3RsX3B0ciBpbnB1dGN0bCA9IChteV9pbnB1dGN0bF9wdHIpIGNpbmZvLT5pbnB1dGN0bDsKLSAgaW50IHZhbDsKLQotICBpZiAoaW5wdXRjdGwtPnB1Yi5lb2lfcmVhY2hlZCkgLyogQWZ0ZXIgaGl0dGluZyBFT0ksIHJlYWQgbm8gZnVydGhlciAqLwotICAgIHJldHVybiBKUEVHX1JFQUNIRURfRU9JOwotCi0gIHZhbCA9ICgqY2luZm8tPm1hcmtlci0+cmVhZF9tYXJrZXJzKSAoY2luZm8pOwotCi0gIHN3aXRjaCAodmFsKSB7Ci0gIGNhc2UgSlBFR19SRUFDSEVEX1NPUzoJLyogRm91bmQgU09TICovCi0gICAgaWYgKGlucHV0Y3RsLT5pbmhlYWRlcnMpIHsJLyogMXN0IFNPUyAqLwotICAgICAgaW5pdGlhbF9zZXR1cChjaW5mbyk7Ci0gICAgICBpbnB1dGN0bC0+aW5oZWFkZXJzID0gRkFMU0U7Ci0gICAgICAvKiBOb3RlOiBzdGFydF9pbnB1dF9wYXNzIG11c3QgYmUgY2FsbGVkIGJ5IGpkbWFzdGVyLmMKLSAgICAgICAqIGJlZm9yZSBhbnkgbW9yZSBpbnB1dCBjYW4gYmUgY29uc3VtZWQuICBqZGFwaW1pbi5jIGlzCi0gICAgICAgKiByZXNwb25zaWJsZSBmb3IgZW5mb3JjaW5nIHRoaXMgc2VxdWVuY2luZy4KLSAgICAgICAqLwotICAgIH0gZWxzZSB7CQkJLyogMm5kIG9yIGxhdGVyIFNPUyBtYXJrZXIgKi8KLSAgICAgIGlmICghIGlucHV0Y3RsLT5wdWIuaGFzX211bHRpcGxlX3NjYW5zKQotCUVSUkVYSVQoY2luZm8sIEpFUlJfRU9JX0VYUEVDVEVEKTsgLyogT29wcywgSSB3YXNuJ3QgZXhwZWN0aW5nIHRoaXMhICovCi0gICAgICBzdGFydF9pbnB1dF9wYXNzKGNpbmZvKTsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSlBFR19SRUFDSEVEX0VPSToJLyogRm91bmQgRU9JICovCi0gICAgaW5wdXRjdGwtPnB1Yi5lb2lfcmVhY2hlZCA9IFRSVUU7Ci0gICAgaWYgKGlucHV0Y3RsLT5pbmhlYWRlcnMpIHsJLyogVGFibGVzLW9ubHkgZGF0YXN0cmVhbSwgYXBwYXJlbnRseSAqLwotICAgICAgaWYgKGNpbmZvLT5tYXJrZXItPnNhd19TT0YpCi0JRVJSRVhJVChjaW5mbywgSkVSUl9TT0ZfTk9fU09TKTsKLSAgICB9IGVsc2UgewotICAgICAgLyogUHJldmVudCBpbmZpbml0ZSBsb29wIGluIGNvZWYgY3RscidzIGRlY29tcHJlc3NfZGF0YSByb3V0aW5lCi0gICAgICAgKiBpZiB1c2VyIHNldCBvdXRwdXRfc2Nhbl9udW1iZXIgbGFyZ2VyIHRoYW4gbnVtYmVyIG9mIHNjYW5zLgotICAgICAgICovCi0gICAgICBpZiAoY2luZm8tPm91dHB1dF9zY2FuX251bWJlciA+IGNpbmZvLT5pbnB1dF9zY2FuX251bWJlcikKLQljaW5mby0+b3V0cHV0X3NjYW5fbnVtYmVyID0gY2luZm8tPmlucHV0X3NjYW5fbnVtYmVyOwotICAgIH0KLSAgICBicmVhazsKLSAgY2FzZSBKUEVHX1NVU1BFTkRFRDoKLSAgICBicmVhazsKLSAgfQotCi0gIHJldHVybiB2YWw7Ci19Ci0KLQotLyoKLSAqIFJlc2V0IHN0YXRlIHRvIGJlZ2luIGEgZnJlc2ggZGF0YXN0cmVhbS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXJlc2V0X2lucHV0X2NvbnRyb2xsZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X2lucHV0Y3RsX3B0ciBpbnB1dGN0bCA9IChteV9pbnB1dGN0bF9wdHIpIGNpbmZvLT5pbnB1dGN0bDsKLQotICBpbnB1dGN0bC0+cHViLmNvbnN1bWVfaW5wdXQgPSBjb25zdW1lX21hcmtlcnM7Ci0gIGlucHV0Y3RsLT5wdWIuaGFzX211bHRpcGxlX3NjYW5zID0gRkFMU0U7IC8qICJ1bmtub3duIiB3b3VsZCBiZSBiZXR0ZXIgKi8KLSAgaW5wdXRjdGwtPnB1Yi5lb2lfcmVhY2hlZCA9IEZBTFNFOwotICBpbnB1dGN0bC0+aW5oZWFkZXJzID0gVFJVRTsKLSAgLyogUmVzZXQgb3RoZXIgbW9kdWxlcyAqLwotICAoKmNpbmZvLT5lcnItPnJlc2V0X2Vycm9yX21ncikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgKCpjaW5mby0+bWFya2VyLT5yZXNldF9tYXJrZXJfcmVhZGVyKSAoY2luZm8pOwotICAvKiBSZXNldCBwcm9ncmVzc2lvbiBzdGF0ZSAtLSB3b3VsZCBiZSBjbGVhbmVyIGlmIGVudHJvcHkgZGVjb2RlciBkaWQgdGhpcyAqLwotICBjaW5mby0+Y29lZl9iaXRzID0gTlVMTDsKLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgaW5wdXQgY29udHJvbGxlciBtb2R1bGUuCi0gKiBUaGlzIGlzIGNhbGxlZCBvbmx5IG9uY2UsIHdoZW4gdGhlIGRlY29tcHJlc3Npb24gb2JqZWN0IGlzIGNyZWF0ZWQuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9pbnB1dF9jb250cm9sbGVyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9pbnB1dGN0bF9wdHIgaW5wdXRjdGw7Ci0KLSAgLyogQ3JlYXRlIHN1Ym9iamVjdCBpbiBwZXJtYW5lbnQgcG9vbCAqLwotICBpbnB1dGN0bCA9IChteV9pbnB1dGN0bF9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9QRVJNQU5FTlQsCi0JCQkJU0laRU9GKG15X2lucHV0X2NvbnRyb2xsZXIpKTsKLSAgY2luZm8tPmlucHV0Y3RsID0gKHN0cnVjdCBqcGVnX2lucHV0X2NvbnRyb2xsZXIgKikgaW5wdXRjdGw7Ci0gIC8qIEluaXRpYWxpemUgbWV0aG9kIHBvaW50ZXJzICovCi0gIGlucHV0Y3RsLT5wdWIuY29uc3VtZV9pbnB1dCA9IGNvbnN1bWVfbWFya2VyczsKLSAgaW5wdXRjdGwtPnB1Yi5yZXNldF9pbnB1dF9jb250cm9sbGVyID0gcmVzZXRfaW5wdXRfY29udHJvbGxlcjsKLSAgaW5wdXRjdGwtPnB1Yi5zdGFydF9pbnB1dF9wYXNzID0gc3RhcnRfaW5wdXRfcGFzczsKLSAgaW5wdXRjdGwtPnB1Yi5maW5pc2hfaW5wdXRfcGFzcyA9IGZpbmlzaF9pbnB1dF9wYXNzOwotICAvKiBJbml0aWFsaXplIHN0YXRlOiBjYW4ndCB1c2UgcmVzZXRfaW5wdXRfY29udHJvbGxlciBzaW5jZSB3ZSBkb24ndAotICAgKiB3YW50IHRvIHRyeSB0byByZXNldCBvdGhlciBtb2R1bGVzIHlldC4KLSAgICovCi0gIGlucHV0Y3RsLT5wdWIuaGFzX211bHRpcGxlX3NjYW5zID0gRkFMU0U7IC8qICJ1bmtub3duIiB3b3VsZCBiZSBiZXR0ZXIgKi8KLSAgaW5wdXRjdGwtPnB1Yi5lb2lfcmVhY2hlZCA9IEZBTFNFOwotICBpbnB1dGN0bC0+aW5oZWFkZXJzID0gVFJVRTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZG1haW5jdC5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkbWFpbmN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYzk1NmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkbWFpbmN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTIgKzAsMCBAQAotLyoKLSAqIGpkbWFpbmN0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbWFpbiBidWZmZXIgY29udHJvbGxlciBmb3IgZGVjb21wcmVzc2lvbi4KLSAqIFRoZSBtYWluIGJ1ZmZlciBsaWVzIGJldHdlZW4gdGhlIEpQRUcgZGVjb21wcmVzc29yIHByb3BlciBhbmQgdGhlCi0gKiBwb3N0LXByb2Nlc3NvcjsgaXQgaG9sZHMgZG93bnNhbXBsZWQgZGF0YSBpbiB0aGUgSlBFRyBjb2xvcnNwYWNlLgotICoKLSAqIE5vdGUgdGhhdCB0aGlzIGNvZGUgaXMgYnlwYXNzZWQgaW4gcmF3LWRhdGEgbW9kZSwgc2luY2UgdGhlIGFwcGxpY2F0aW9uCi0gKiBzdXBwbGllcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgbWFpbiBidWZmZXIgaW4gdGhhdCBjYXNlLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKgotICogSW4gdGhlIGN1cnJlbnQgc3lzdGVtIGRlc2lnbiwgdGhlIG1haW4gYnVmZmVyIG5lZWQgbmV2ZXIgYmUgYSBmdWxsLWltYWdlCi0gKiBidWZmZXI7IGFueSBmdWxsLWhlaWdodCBidWZmZXJzIHdpbGwgYmUgZm91bmQgaW5zaWRlIHRoZSBjb2VmZmljaWVudCBvcgotICogcG9zdHByb2Nlc3NpbmcgY29udHJvbGxlcnMuICBOb25ldGhlbGVzcywgdGhlIG1haW4gY29udHJvbGxlciBpcyBub3QKLSAqIHRyaXZpYWwuICBJdHMgcmVzcG9uc2liaWxpdHkgaXMgdG8gcHJvdmlkZSBjb250ZXh0IHJvd3MgZm9yIHVwc2FtcGxpbmcvCi0gKiByZXNjYWxpbmcsIGFuZCBkb2luZyB0aGlzIGluIGFuIGVmZmljaWVudCBmYXNoaW9uIGlzIGEgYml0IHRyaWNreS4KLSAqCi0gKiBQb3N0cHJvY2Vzc29yIGlucHV0IGRhdGEgaXMgY291bnRlZCBpbiAicm93IGdyb3VwcyIuICBBIHJvdyBncm91cAotICogaXMgZGVmaW5lZCB0byBiZSAodl9zYW1wX2ZhY3RvciAqIERDVF9zY2FsZWRfc2l6ZSAvIG1pbl9EQ1Rfc2NhbGVkX3NpemUpCi0gKiBzYW1wbGUgcm93cyBvZiBlYWNoIGNvbXBvbmVudC4gIChXZSByZXF1aXJlIERDVF9zY2FsZWRfc2l6ZSB2YWx1ZXMgdG8gYmUKLSAqIGNob3NlbiBzdWNoIHRoYXQgdGhlc2UgbnVtYmVycyBhcmUgaW50ZWdlcnMuICBJbiBwcmFjdGljZSBEQ1Rfc2NhbGVkX3NpemUKLSAqIHZhbHVlcyB3aWxsIGxpa2VseSBiZSBwb3dlcnMgb2YgdHdvLCBzbyB3ZSBhY3R1YWxseSBoYXZlIHRoZSBzdHJvbmdlcgotICogY29uZGl0aW9uIHRoYXQgRENUX3NjYWxlZF9zaXplIC8gbWluX0RDVF9zY2FsZWRfc2l6ZSBpcyBhbiBpbnRlZ2VyLikKLSAqIFVwc2FtcGxpbmcgd2lsbCB0eXBpY2FsbHkgcHJvZHVjZSBtYXhfdl9zYW1wX2ZhY3RvciBwaXhlbCByb3dzIGZyb20gZWFjaAotICogcm93IGdyb3VwICh0aW1lcyBhbnkgYWRkaXRpb25hbCBzY2FsZSBmYWN0b3IgdGhhdCB0aGUgdXBzYW1wbGVyIGlzCi0gKiBhcHBseWluZykuCi0gKgotICogVGhlIGNvZWZmaWNpZW50IGNvbnRyb2xsZXIgd2lsbCBkZWxpdmVyIGRhdGEgdG8gdXMgb25lIGlNQ1Ugcm93IGF0IGEgdGltZTsKLSAqIGVhY2ggaU1DVSByb3cgY29udGFpbnMgdl9zYW1wX2ZhY3RvciAqIERDVF9zY2FsZWRfc2l6ZSBzYW1wbGUgcm93cywgb3IKLSAqIGV4YWN0bHkgbWluX0RDVF9zY2FsZWRfc2l6ZSByb3cgZ3JvdXBzLiAgKFRoaXMgYW1vdW50IG9mIGRhdGEgY29ycmVzcG9uZHMKLSAqIHRvIG9uZSByb3cgb2YgTUNVcyB3aGVuIHRoZSBpbWFnZSBpcyBmdWxseSBpbnRlcmxlYXZlZC4pICBOb3RlIHRoYXQgdGhlCi0gKiBudW1iZXIgb2Ygc2FtcGxlIHJvd3MgdmFyaWVzIGFjcm9zcyBjb21wb25lbnRzLCBidXQgdGhlIG51bWJlciBvZiByb3cKLSAqIGdyb3VwcyBkb2VzIG5vdC4gIFNvbWUgZ2FyYmFnZSBzYW1wbGUgcm93cyBtYXkgYmUgaW5jbHVkZWQgaW4gdGhlIGxhc3QgaU1DVQotICogcm93IGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLgotICoKLSAqIERlcGVuZGluZyBvbiB0aGUgdmVydGljYWwgc2NhbGluZyBhbGdvcml0aG0gdXNlZCwgdGhlIHVwc2FtcGxlciBtYXkgbmVlZAotICogYWNjZXNzIHRvIHRoZSBzYW1wbGUgcm93KHMpIGFib3ZlIGFuZCBiZWxvdyBpdHMgY3VycmVudCBpbnB1dCByb3cgZ3JvdXAuCi0gKiBUaGUgdXBzYW1wbGVyIGlzIHJlcXVpcmVkIHRvIHNldCBuZWVkX2NvbnRleHRfcm93cyBUUlVFIGF0IGdsb2JhbCBzZWxlY3Rpb24KLSAqIHRpbWUgaWYgc28uICBXaGVuIG5lZWRfY29udGV4dF9yb3dzIGlzIEZBTFNFLCB0aGlzIGNvbnRyb2xsZXIgY2FuIHNpbXBseQotICogb2J0YWluIG9uZSBpTUNVIHJvdyBhdCBhIHRpbWUgZnJvbSB0aGUgY29lZmZpY2llbnQgY29udHJvbGxlciBhbmQgZG9sZSBpdAotICogb3V0IGFzIHJvdyBncm91cHMgdG8gdGhlIHBvc3Rwcm9jZXNzb3IuCi0gKgotICogV2hlbiBuZWVkX2NvbnRleHRfcm93cyBpcyBUUlVFLCB0aGlzIGNvbnRyb2xsZXIgZ3VhcmFudGVlcyB0aGF0IHRoZSBidWZmZXIKLSAqIHBhc3NlZCB0byBwb3N0cHJvY2Vzc2luZyBjb250YWlucyBhdCBsZWFzdCBvbmUgcm93IGdyb3VwJ3Mgd29ydGggb2Ygc2FtcGxlcwotICogYWJvdmUgYW5kIGJlbG93IHRoZSByb3cgZ3JvdXAocykgYmVpbmcgcHJvY2Vzc2VkLiAgTm90ZSB0aGF0IHRoZSBjb250ZXh0Ci0gKiByb3dzICJhYm92ZSIgdGhlIGZpcnN0IHBhc3NlZCByb3cgZ3JvdXAgYXBwZWFyIGF0IG5lZ2F0aXZlIHJvdyBvZmZzZXRzIGluCi0gKiB0aGUgcGFzc2VkIGJ1ZmZlci4gIEF0IHRoZSB0b3AgYW5kIGJvdHRvbSBvZiB0aGUgaW1hZ2UsIHRoZSByZXF1aXJlZAotICogY29udGV4dCByb3dzIGFyZSBtYW51ZmFjdHVyZWQgYnkgZHVwbGljYXRpbmcgdGhlIGZpcnN0IG9yIGxhc3QgcmVhbCBzYW1wbGUKLSAqIHJvdzsgdGhpcyBhdm9pZHMgaGF2aW5nIHNwZWNpYWwgY2FzZXMgaW4gdGhlIHVwc2FtcGxpbmcgaW5uZXIgbG9vcHMuCi0gKgotICogVGhlIGFtb3VudCBvZiBjb250ZXh0IGlzIGZpeGVkIGF0IG9uZSByb3cgZ3JvdXAganVzdCBiZWNhdXNlIHRoYXQncyBhCi0gKiBjb252ZW5pZW50IG51bWJlciBmb3IgdGhpcyBjb250cm9sbGVyIHRvIHdvcmsgd2l0aC4gIFRoZSBleGlzdGluZwotICogdXBzYW1wbGVycyByZWFsbHkgb25seSBuZWVkIG9uZSBzYW1wbGUgcm93IG9mIGNvbnRleHQuICBBbiB1cHNhbXBsZXIKLSAqIHN1cHBvcnRpbmcgYXJiaXRyYXJ5IG91dHB1dCByZXNjYWxpbmcgbWlnaHQgd2lzaCBmb3IgbW9yZSB0aGFuIG9uZSByb3cKLSAqIGdyb3VwIG9mIGNvbnRleHQgd2hlbiBzaHJpbmtpbmcgdGhlIGltYWdlOyB0b3VnaCwgd2UgZG9uJ3QgaGFuZGxlIHRoYXQuCi0gKiAoVGhpcyBpcyBqdXN0aWZpZWQgYnkgdGhlIGFzc3VtcHRpb24gdGhhdCBkb3duc2l6aW5nIHdpbGwgYmUgaGFuZGxlZCBtb3N0bHkKLSAqIGJ5IGFkanVzdGluZyB0aGUgRENUX3NjYWxlZF9zaXplIHZhbHVlcywgc28gdGhhdCB0aGUgYWN0dWFsIHNjYWxlIGZhY3RvciBhdAotICogdGhlIHVwc2FtcGxlIHN0ZXAgbmVlZG4ndCBiZSBtdWNoIGxlc3MgdGhhbiBvbmUuKQotICoKLSAqIFRvIHByb3ZpZGUgdGhlIGRlc2lyZWQgY29udGV4dCwgd2UgaGF2ZSB0byByZXRhaW4gdGhlIGxhc3QgdHdvIHJvdyBncm91cHMKLSAqIG9mIG9uZSBpTUNVIHJvdyB3aGlsZSByZWFkaW5nIGluIHRoZSBuZXh0IGlNQ1Ugcm93LiAgKFRoZSBsYXN0IHJvdyBncm91cAotICogY2FuJ3QgYmUgcHJvY2Vzc2VkIHVudGlsIHdlIGhhdmUgYW5vdGhlciByb3cgZ3JvdXAgZm9yIGl0cyBiZWxvdy1jb250ZXh0LAotICogYW5kIHNvIHdlIGhhdmUgdG8gc2F2ZSB0aGUgbmV4dC10by1sYXN0IGdyb3VwIHRvbyBmb3IgaXRzIGFib3ZlLWNvbnRleHQuKQotICogV2UgY291bGQgZG8gdGhpcyBtb3N0IHNpbXBseSBieSBjb3B5aW5nIGRhdGEgYXJvdW5kIGluIG91ciBidWZmZXIsIGJ1dAotICogdGhhdCdkIGJlIHZlcnkgc2xvdy4gIFdlIGNhbiBhdm9pZCBjb3B5aW5nIGFueSBkYXRhIGJ5IGNyZWF0aW5nIGEgcmF0aGVyCi0gKiBzdHJhbmdlIHBvaW50ZXIgc3RydWN0dXJlLiAgSGVyZSdzIGhvdyBpdCB3b3Jrcy4gIFdlIGFsbG9jYXRlIGEgd29ya3NwYWNlCi0gKiBjb25zaXN0aW5nIG9mIE0rMiByb3cgZ3JvdXBzICh3aGVyZSBNID0gbWluX0RDVF9zY2FsZWRfc2l6ZSBpcyB0aGUgbnVtYmVyCi0gKiBvZiByb3cgZ3JvdXBzIHBlciBpTUNVIHJvdykuICBXZSBjcmVhdGUgdHdvIHNldHMgb2YgcmVkdW5kYW50IHBvaW50ZXJzIHRvCi0gKiB0aGUgd29ya3NwYWNlLiAgTGFiZWxpbmcgdGhlIHBoeXNpY2FsIHJvdyBncm91cHMgMCB0byBNKzEsIHRoZSBzeW50aGVzaXplZAotICogcG9pbnRlciBsaXN0cyBsb29rIGxpa2UgdGhpczoKLSAqICAgICAgICAgICAgICAgICAgIE0rMSAgICAgICAgICAgICAgICAgICAgICAgICAgTS0xCi0gKiBtYXN0ZXIgcG9pbnRlciAtLT4gMCAgICAgICAgIG1hc3RlciBwb2ludGVyIC0tPiAwCi0gKiAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCi0gKiAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgotICogICAgICAgICAgICAgICAgICAgTS0zICAgICAgICAgICAgICAgICAgICAgICAgICBNLTMKLSAqICAgICAgICAgICAgICAgICAgIE0tMiAgICAgICAgICAgICAgICAgICAgICAgICAgIE0KLSAqICAgICAgICAgICAgICAgICAgIE0tMSAgICAgICAgICAgICAgICAgICAgICAgICAgTSsxCi0gKiAgICAgICAgICAgICAgICAgICAgTSAgICAgICAgICAgICAgICAgICAgICAgICAgIE0tMgotICogICAgICAgICAgICAgICAgICAgTSsxICAgICAgICAgICAgICAgICAgICAgICAgICBNLTEKLSAqICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKLSAqIFdlIHJlYWQgYWx0ZXJuYXRlIGlNQ1Ugcm93cyB1c2luZyBlYWNoIG1hc3RlciBwb2ludGVyOyB0aHVzIHRoZSBsYXN0IHR3bwotICogcm93IGdyb3VwcyBvZiB0aGUgcHJldmlvdXMgaU1DVSByb3cgcmVtYWluIHVuLW92ZXJ3cml0dGVuIGluIHRoZSB3b3Jrc3BhY2UuCi0gKiBUaGUgcG9pbnRlciBsaXN0cyBhcmUgc2V0IHVwIHNvIHRoYXQgdGhlIHJlcXVpcmVkIGNvbnRleHQgcm93cyBhcHBlYXIgdG8KLSAqIGJlIGFkamFjZW50IHRvIHRoZSBwcm9wZXIgcGxhY2VzIHdoZW4gd2UgcGFzcyB0aGUgcG9pbnRlciBsaXN0cyB0byB0aGUKLSAqIHVwc2FtcGxlci4KLSAqCi0gKiBUaGUgYWJvdmUgcGljdHVyZXMgZGVzY3JpYmUgdGhlIG5vcm1hbCBzdGF0ZSBvZiB0aGUgcG9pbnRlciBsaXN0cy4KLSAqIEF0IHRvcCBhbmQgYm90dG9tIG9mIHRoZSBpbWFnZSwgd2UgZGlkZGxlIHRoZSBwb2ludGVyIGxpc3RzIHRvIGR1cGxpY2F0ZQotICogdGhlIGZpcnN0IG9yIGxhc3Qgc2FtcGxlIHJvdyBhcyBuZWNlc3NhcnkgKHRoaXMgaXMgY2hlYXBlciB0aGFuIGNvcHlpbmcKLSAqIHNhbXBsZSByb3dzIGFyb3VuZCkuCi0gKgotICogVGhpcyBzY2hlbWUgYnJlYWtzIGRvd24gaWYgTSA8IDIsIGllLCBtaW5fRENUX3NjYWxlZF9zaXplIGlzIDEuICBJbiB0aGF0Ci0gKiBzaXR1YXRpb24gZWFjaCBpTUNVIHJvdyBwcm92aWRlcyBvbmx5IG9uZSByb3cgZ3JvdXAgc28gdGhlIGJ1ZmZlcmluZyBsb2dpYwotICogbXVzdCBiZSBkaWZmZXJlbnQgKGVnLCB3ZSBtdXN0IHJlYWQgdHdvIGlNQ1Ugcm93cyBiZWZvcmUgd2UgY2FuIGVtaXQgdGhlCi0gKiBmaXJzdCByb3cgZ3JvdXApLiAgRm9yIG5vdywgd2Ugc2ltcGx5IGRvIG5vdCBzdXBwb3J0IHByb3ZpZGluZyBjb250ZXh0Ci0gKiByb3dzIHdoZW4gbWluX0RDVF9zY2FsZWRfc2l6ZSBpcyAxLiAgVGhhdCBjb21iaW5hdGlvbiBzZWVtcyB1bmxpa2VseSB0bwotICogYmUgd29ydGggcHJvdmlkaW5nIC0tLSBpZiBzb21lb25lIHdhbnRzIGEgMS84dGgtc2l6ZSBwcmV2aWV3LCB0aGV5IHByb2JhYmx5Ci0gKiB3YW50IGl0IHF1aWNrIGFuZCBkaXJ0eSwgc28gYSBjb250ZXh0LWZyZWUgdXBzYW1wbGVyIGlzIHN1ZmZpY2llbnQuCi0gKi8KLQotCi0vKiBQcml2YXRlIGJ1ZmZlciBjb250cm9sbGVyIG9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2RfbWFpbl9jb250cm9sbGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIFBvaW50ZXIgdG8gYWxsb2NhdGVkIHdvcmtzcGFjZSAoTSBvciBNKzIgcm93IGdyb3VwcykuICovCi0gIEpTQU1QQVJSQVkgYnVmZmVyW01BWF9DT01QT05FTlRTXTsKLQotICBib29sZWFuIGJ1ZmZlcl9mdWxsOwkJLyogSGF2ZSB3ZSBnb3R0ZW4gYW4gaU1DVSByb3cgZnJvbSBkZWNvZGVyPyAqLwotICBKRElNRU5TSU9OIHJvd2dyb3VwX2N0cjsJLyogY291bnRzIHJvdyBncm91cHMgb3V0cHV0IHRvIHBvc3Rwcm9jZXNzb3IgKi8KLQotICAvKiBSZW1haW5pbmcgZmllbGRzIGFyZSBvbmx5IHVzZWQgaW4gdGhlIGNvbnRleHQgY2FzZS4gKi8KLQotICAvKiBUaGVzZSBhcmUgdGhlIG1hc3RlciBwb2ludGVycyB0byB0aGUgZnVubnktb3JkZXIgcG9pbnRlciBsaXN0cy4gKi8KLSAgSlNBTVBJTUFHRSB4YnVmZmVyWzJdOwkvKiBwb2ludGVycyB0byB3ZWlyZCBwb2ludGVyIGxpc3RzICovCi0KLSAgaW50IHdoaWNocHRyOwkJCS8qIGluZGljYXRlcyB3aGljaCBwb2ludGVyIHNldCBpcyBub3cgaW4gdXNlICovCi0gIGludCBjb250ZXh0X3N0YXRlOwkJLyogcHJvY2Vzc19kYXRhIHN0YXRlIG1hY2hpbmUgc3RhdHVzICovCi0gIEpESU1FTlNJT04gcm93Z3JvdXBzX2F2YWlsOwkvKiByb3cgZ3JvdXBzIGF2YWlsYWJsZSB0byBwb3N0cHJvY2Vzc29yICovCi0gIEpESU1FTlNJT04gaU1DVV9yb3dfY3RyOwkvKiBjb3VudHMgaU1DVSByb3dzIHRvIGRldGVjdCBpbWFnZSB0b3AvYm90ICovCi19IG15X21haW5fY29udHJvbGxlcjsKLQotdHlwZWRlZiBteV9tYWluX2NvbnRyb2xsZXIgKiBteV9tYWluX3B0cjsKLQotLyogY29udGV4dF9zdGF0ZSB2YWx1ZXM6ICovCi0jZGVmaW5lIENUWF9QUkVQQVJFX0ZPUl9JTUNVCTAJLyogbmVlZCB0byBwcmVwYXJlIGZvciBNQ1Ugcm93ICovCi0jZGVmaW5lIENUWF9QUk9DRVNTX0lNQ1UJMQkvKiBmZWVkaW5nIGlNQ1UgdG8gcG9zdHByb2Nlc3NvciAqLwotI2RlZmluZSBDVFhfUE9TVFBPTkVEX1JPVwkyCS8qIGZlZWRpbmcgcG9zdHBvbmVkIHJvdyBncm91cCAqLwotCi0KLS8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCi1NRVRIT0RERUYodm9pZCkgcHJvY2Vzc19kYXRhX3NpbXBsZV9tYWluCi0JSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsCi0JICAgICBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwgSkRJTUVOU0lPTiBvdXRfcm93c19hdmFpbCkpOwotTUVUSE9EREVGKHZvaWQpIHByb2Nlc3NfZGF0YV9jb250ZXh0X21haW4KLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKLQkgICAgIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLCBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7Ci0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECi1NRVRIT0RERUYodm9pZCkgcHJvY2Vzc19kYXRhX2NyYW5rX3Bvc3QKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwKLQkgICAgIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLCBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7Ci0jZW5kaWYKLQotCi1MT0NBTCh2b2lkKQotYWxsb2NfZnVubnlfcG9pbnRlcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIGZ1bm55IHBvaW50ZXIgbGlzdHMuCi0gKiBUaGlzIGlzIGRvbmUgb25seSBvbmNlLCBub3Qgb25jZSBwZXIgcGFzcy4KLSAqLwotewotICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKLSAgaW50IGNpLCByZ3JvdXA7Ci0gIGludCBNID0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIEpTQU1QQVJSQVkgeGJ1ZjsKLQotICAvKiBHZXQgdG9wLWxldmVsIHNwYWNlIGZvciBjb21wb25lbnQgYXJyYXkgcG9pbnRlcnMuCi0gICAqIFdlIGFsbG9jIGJvdGggYXJyYXlzIHdpdGggb25lIGNhbGwgdG8gc2F2ZSBhIGZldyBjeWNsZXMuCi0gICAqLwotICBtYWluLT54YnVmZmVyWzBdID0gKEpTQU1QSU1BR0UpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQljaW5mby0+bnVtX2NvbXBvbmVudHMgKiAyICogU0laRU9GKEpTQU1QQVJSQVkpKTsKLSAgbWFpbi0+eGJ1ZmZlclsxXSA9IG1haW4tPnhidWZmZXJbMF0gKyBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0KLSAgZm9yIChjaSA9IDAsIGNvbXBwdHIgPSBjaW5mby0+Y29tcF9pbmZvOyBjaSA8IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICAgICBjaSsrLCBjb21wcHRyKyspIHsKLSAgICByZ3JvdXAgPSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSkgLwotICAgICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7IC8qIGhlaWdodCBvZiBhIHJvdyBncm91cCBvZiBjb21wb25lbnQgKi8KLSAgICAvKiBHZXQgc3BhY2UgZm9yIHBvaW50ZXIgbGlzdHMgLS0tIE0rNCByb3cgZ3JvdXBzIGluIGVhY2ggbGlzdC4KLSAgICAgKiBXZSBhbGxvYyBib3RoIHBvaW50ZXIgbGlzdHMgd2l0aCBvbmUgY2FsbCB0byBzYXZlIGEgZmV3IGN5Y2xlcy4KLSAgICAgKi8KLSAgICB4YnVmID0gKEpTQU1QQVJSQVkpCi0gICAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgMiAqIChyZ3JvdXAgKiAoTSArIDQpKSAqIFNJWkVPRihKU0FNUFJPVykpOwotICAgIHhidWYgKz0gcmdyb3VwOwkJLyogd2FudCBvbmUgcm93IGdyb3VwIGF0IG5lZ2F0aXZlIG9mZnNldHMgKi8KLSAgICBtYWluLT54YnVmZmVyWzBdW2NpXSA9IHhidWY7Ci0gICAgeGJ1ZiArPSByZ3JvdXAgKiAoTSArIDQpOwotICAgIG1haW4tPnhidWZmZXJbMV1bY2ldID0geGJ1ZjsKLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1tYWtlX2Z1bm55X3BvaW50ZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogQ3JlYXRlIHRoZSBmdW5ueSBwb2ludGVyIGxpc3RzIGRpc2N1c3NlZCBpbiB0aGUgY29tbWVudHMgYWJvdmUuCi0gKiBUaGUgYWN0dWFsIHdvcmtzcGFjZSBpcyBhbHJlYWR5IGFsbG9jYXRlZCAoaW4gbWFpbi0+YnVmZmVyKSwKLSAqIGFuZCB0aGUgc3BhY2UgZm9yIHRoZSBwb2ludGVyIGxpc3RzIGlzIGFsbG9jYXRlZCB0b28uCi0gKiBUaGlzIHJvdXRpbmUganVzdCBmaWxscyBpbiB0aGUgY3VyaW91c2x5IG9yZGVyZWQgbGlzdHMuCi0gKiBUaGlzIHdpbGwgYmUgcmVwZWF0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHBhc3MuCi0gKi8KLXsKLSAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47Ci0gIGludCBjaSwgaSwgcmdyb3VwOwotICBpbnQgTSA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICBKU0FNUEFSUkFZIGJ1ZiwgeGJ1ZjAsIHhidWYxOwotCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgcmdyb3VwID0gKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIC8KLSAgICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOyAvKiBoZWlnaHQgb2YgYSByb3cgZ3JvdXAgb2YgY29tcG9uZW50ICovCi0gICAgeGJ1ZjAgPSBtYWluLT54YnVmZmVyWzBdW2NpXTsKLSAgICB4YnVmMSA9IG1haW4tPnhidWZmZXJbMV1bY2ldOwotICAgIC8qIEZpcnN0IGNvcHkgdGhlIHdvcmtzcGFjZSBwb2ludGVycyBhcy1pcyAqLwotICAgIGJ1ZiA9IG1haW4tPmJ1ZmZlcltjaV07Ci0gICAgZm9yIChpID0gMDsgaSA8IHJncm91cCAqIChNICsgMik7IGkrKykgewotICAgICAgeGJ1ZjBbaV0gPSB4YnVmMVtpXSA9IGJ1ZltpXTsKLSAgICB9Ci0gICAgLyogSW4gdGhlIHNlY29uZCBsaXN0LCBwdXQgdGhlIGxhc3QgZm91ciByb3cgZ3JvdXBzIGluIHN3YXBwZWQgb3JkZXIgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgcmdyb3VwICogMjsgaSsrKSB7Ci0gICAgICB4YnVmMVtyZ3JvdXAqKE0tMikgKyBpXSA9IGJ1ZltyZ3JvdXAqTSArIGldOwotICAgICAgeGJ1ZjFbcmdyb3VwKk0gKyBpXSA9IGJ1ZltyZ3JvdXAqKE0tMikgKyBpXTsKLSAgICB9Ci0gICAgLyogVGhlIHdyYXBhcm91bmQgcG9pbnRlcnMgYXQgdG9wIGFuZCBib3R0b20gd2lsbCBiZSBmaWxsZWQgbGF0ZXIKLSAgICAgKiAoc2VlIHNldF93cmFwYXJvdW5kX3BvaW50ZXJzLCBiZWxvdykuICBJbml0aWFsbHkgd2Ugd2FudCB0aGUgImFib3ZlIgotICAgICAqIHBvaW50ZXJzIHRvIGR1cGxpY2F0ZSB0aGUgZmlyc3QgYWN0dWFsIGRhdGEgbGluZS4gIFRoaXMgb25seSBuZWVkcwotICAgICAqIHRvIGhhcHBlbiBpbiB4YnVmZmVyWzBdLgotICAgICAqLwotICAgIGZvciAoaSA9IDA7IGkgPCByZ3JvdXA7IGkrKykgewotICAgICAgeGJ1ZjBbaSAtIHJncm91cF0gPSB4YnVmMFswXTsKLSAgICB9Ci0gIH0KLX0KLQotCi1MT0NBTCh2b2lkKQotc2V0X3dyYXBhcm91bmRfcG9pbnRlcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBTZXQgdXAgdGhlICJ3cmFwYXJvdW5kIiBwb2ludGVycyBhdCB0b3AgYW5kIGJvdHRvbSBvZiB0aGUgcG9pbnRlciBsaXN0cy4KLSAqIFRoaXMgY2hhbmdlcyB0aGUgcG9pbnRlciBsaXN0IHN0YXRlIGZyb20gdG9wLW9mLWltYWdlIHRvIHRoZSBub3JtYWwgc3RhdGUuCi0gKi8KLXsKLSAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47Ci0gIGludCBjaSwgaSwgcmdyb3VwOwotICBpbnQgTSA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICpjb21wcHRyOwotICBKU0FNUEFSUkFZIHhidWYwLCB4YnVmMTsKLQotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIHJncm91cCA9IChjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplKSAvCi0gICAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsgLyogaGVpZ2h0IG9mIGEgcm93IGdyb3VwIG9mIGNvbXBvbmVudCAqLwotICAgIHhidWYwID0gbWFpbi0+eGJ1ZmZlclswXVtjaV07Ci0gICAgeGJ1ZjEgPSBtYWluLT54YnVmZmVyWzFdW2NpXTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgcmdyb3VwOyBpKyspIHsKLSAgICAgIHhidWYwW2kgLSByZ3JvdXBdID0geGJ1ZjBbcmdyb3VwKihNKzEpICsgaV07Ci0gICAgICB4YnVmMVtpIC0gcmdyb3VwXSA9IHhidWYxW3Jncm91cCooTSsxKSArIGldOwotICAgICAgeGJ1ZjBbcmdyb3VwKihNKzIpICsgaV0gPSB4YnVmMFtpXTsKLSAgICAgIHhidWYxW3Jncm91cCooTSsyKSArIGldID0geGJ1ZjFbaV07Ci0gICAgfQotICB9Ci19Ci0KLQotTE9DQUwodm9pZCkKLXNldF9ib3R0b21fcG9pbnRlcnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBDaGFuZ2UgdGhlIHBvaW50ZXIgbGlzdHMgdG8gZHVwbGljYXRlIHRoZSBsYXN0IHNhbXBsZSByb3cgYXQgdGhlIGJvdHRvbQotICogb2YgdGhlIGltYWdlLiAgd2hpY2hwdHIgaW5kaWNhdGVzIHdoaWNoIHhidWZmZXIgaG9sZHMgdGhlIGZpbmFsIGlNQ1Ugcm93LgotICogQWxzbyBzZXRzIHJvd2dyb3Vwc19hdmFpbCB0byBpbmRpY2F0ZSBudW1iZXIgb2Ygbm9uZHVtbXkgcm93IGdyb3VwcyBpbiByb3cuCi0gKi8KLXsKLSAgbXlfbWFpbl9wdHIgbWFpbiA9IChteV9tYWluX3B0cikgY2luZm8tPm1haW47Ci0gIGludCBjaSwgaSwgcmdyb3VwLCBpTUNVaGVpZ2h0LCByb3dzX2xlZnQ7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0gIEpTQU1QQVJSQVkgeGJ1ZjsKLQotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIC8qIENvdW50IHNhbXBsZSByb3dzIGluIG9uZSBpTUNVIHJvdyBhbmQgaW4gb25lIHJvdyBncm91cCAqLwotICAgIGlNQ1VoZWlnaHQgPSBjb21wcHRyLT52X3NhbXBfZmFjdG9yICogY29tcHB0ci0+RENUX3NjYWxlZF9zaXplOwotICAgIHJncm91cCA9IGlNQ1VoZWlnaHQgLyBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKLSAgICAvKiBDb3VudCBub25kdW1teSBzYW1wbGUgcm93cyByZW1haW5pbmcgZm9yIHRoaXMgY29tcG9uZW50ICovCi0gICAgcm93c19sZWZ0ID0gKGludCkgKGNvbXBwdHItPmRvd25zYW1wbGVkX2hlaWdodCAlIChKRElNRU5TSU9OKSBpTUNVaGVpZ2h0KTsKLSAgICBpZiAocm93c19sZWZ0ID09IDApIHJvd3NfbGVmdCA9IGlNQ1VoZWlnaHQ7Ci0gICAgLyogQ291bnQgbm9uZHVtbXkgcm93IGdyb3Vwcy4gIFNob3VsZCBnZXQgc2FtZSBhbnN3ZXIgZm9yIGVhY2ggY29tcG9uZW50LAotICAgICAqIHNvIHdlIG5lZWQgb25seSBkbyBpdCBvbmNlLgotICAgICAqLwotICAgIGlmIChjaSA9PSAwKSB7Ci0gICAgICBtYWluLT5yb3dncm91cHNfYXZhaWwgPSAoSkRJTUVOU0lPTikgKChyb3dzX2xlZnQtMSkgLyByZ3JvdXAgKyAxKTsKLSAgICB9Ci0gICAgLyogRHVwbGljYXRlIHRoZSBsYXN0IHJlYWwgc2FtcGxlIHJvdyByZ3JvdXAqMiB0aW1lczsgdGhpcyBwYWRzIG91dCB0aGUKLSAgICAgKiBsYXN0IHBhcnRpYWwgcm93Z3JvdXAgYW5kIGVuc3VyZXMgYXQgbGVhc3Qgb25lIGZ1bGwgcm93Z3JvdXAgb2YgY29udGV4dC4KLSAgICAgKi8KLSAgICB4YnVmID0gbWFpbi0+eGJ1ZmZlclttYWluLT53aGljaHB0cl1bY2ldOwotICAgIGZvciAoaSA9IDA7IGkgPCByZ3JvdXAgKiAyOyBpKyspIHsKLSAgICAgIHhidWZbcm93c19sZWZ0ICsgaV0gPSB4YnVmW3Jvd3NfbGVmdC0xXTsKLSAgICB9Ci0gIH0KLX0KLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9wYXNzX21haW4gKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKQotewotICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKLQotICBzd2l0Y2ggKHBhc3NfbW9kZSkgewotICBjYXNlIEpCVUZfUEFTU19USFJVOgotICAgIGlmIChjaW5mby0+dXBzYW1wbGUtPm5lZWRfY29udGV4dF9yb3dzKSB7Ci0gICAgICBtYWluLT5wdWIucHJvY2Vzc19kYXRhID0gcHJvY2Vzc19kYXRhX2NvbnRleHRfbWFpbjsKLSAgICAgIG1ha2VfZnVubnlfcG9pbnRlcnMoY2luZm8pOyAvKiBDcmVhdGUgdGhlIHhidWZmZXJbXSBsaXN0cyAqLwotICAgICAgbWFpbi0+d2hpY2hwdHIgPSAwOwkvKiBSZWFkIGZpcnN0IGlNQ1Ugcm93IGludG8geGJ1ZmZlclswXSAqLwotICAgICAgbWFpbi0+Y29udGV4dF9zdGF0ZSA9IENUWF9QUkVQQVJFX0ZPUl9JTUNVOwotICAgICAgbWFpbi0+aU1DVV9yb3dfY3RyID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgLyogU2ltcGxlIGNhc2Ugd2l0aCBubyBjb250ZXh0IG5lZWRlZCAqLwotICAgICAgbWFpbi0+cHViLnByb2Nlc3NfZGF0YSA9IHByb2Nlc3NfZGF0YV9zaW1wbGVfbWFpbjsKLSAgICB9Ci0gICAgbWFpbi0+YnVmZmVyX2Z1bGwgPSBGQUxTRTsJLyogTWFyayBidWZmZXIgZW1wdHkgKi8KLSAgICBtYWluLT5yb3dncm91cF9jdHIgPSAwOwotICAgIGJyZWFrOwotI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAotICBjYXNlIEpCVUZfQ1JBTktfREVTVDoKLSAgICAvKiBGb3IgbGFzdCBwYXNzIG9mIDItcGFzcyBxdWFudGl6YXRpb24sIGp1c3QgY3JhbmsgdGhlIHBvc3Rwcm9jZXNzb3IgKi8KLSAgICBtYWluLT5wdWIucHJvY2Vzc19kYXRhID0gcHJvY2Vzc19kYXRhX2NyYW5rX3Bvc3Q7Ci0gICAgYnJlYWs7Ci0jZW5kaWYKLSAgZGVmYXVsdDoKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7Ci0gICAgYnJlYWs7Ci0gIH0KLX0KLQotCi0vKgotICogUHJvY2VzcyBzb21lIGRhdGEuCi0gKiBUaGlzIGhhbmRsZXMgdGhlIHNpbXBsZSBjYXNlIHdoZXJlIG5vIGNvbnRleHQgaXMgcmVxdWlyZWQuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wcm9jZXNzX2RhdGFfc2ltcGxlX21haW4gKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCi0JCQkgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCi17Ci0gIG15X21haW5fcHRyIG1haW4gPSAobXlfbWFpbl9wdHIpIGNpbmZvLT5tYWluOwotICBKRElNRU5TSU9OIHJvd2dyb3Vwc19hdmFpbDsKLQotICAvKiBSZWFkIGlucHV0IGRhdGEgaWYgd2UgaGF2ZW4ndCBmaWxsZWQgdGhlIG1haW4gYnVmZmVyIHlldCAqLwotICBpZiAoISBtYWluLT5idWZmZXJfZnVsbCkgewotICAgIGlmICghICgqY2luZm8tPmNvZWYtPmRlY29tcHJlc3NfZGF0YSkgKGNpbmZvLCBtYWluLT5idWZmZXIpKQotICAgICAgcmV0dXJuOwkJCS8qIHN1c3BlbnNpb24gZm9yY2VkLCBjYW4gZG8gbm90aGluZyBtb3JlICovCi0gICAgbWFpbi0+YnVmZmVyX2Z1bGwgPSBUUlVFOwkvKiBPSywgd2UgaGF2ZSBhbiBpTUNVIHJvdyB0byB3b3JrIHdpdGggKi8KLSAgfQotCi0gIC8qIFRoZXJlIGFyZSBhbHdheXMgbWluX0RDVF9zY2FsZWRfc2l6ZSByb3cgZ3JvdXBzIGluIGFuIGlNQ1Ugcm93LiAqLwotICByb3dncm91cHNfYXZhaWwgPSAoSkRJTUVOU0lPTikgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7Ci0gIC8qIE5vdGU6IGF0IHRoZSBib3R0b20gb2YgdGhlIGltYWdlLCB3ZSBtYXkgcGFzcyBleHRyYSBnYXJiYWdlIHJvdyBncm91cHMKLSAgICogdG8gdGhlIHBvc3Rwcm9jZXNzb3IuICBUaGUgcG9zdHByb2Nlc3NvciBoYXMgdG8gY2hlY2sgZm9yIGJvdHRvbQotICAgKiBvZiBpbWFnZSBhbnl3YXkgKGF0IHJvdyByZXNvbHV0aW9uKSwgc28gbm8gcG9pbnQgaW4gdXMgZG9pbmcgaXQgdG9vLgotICAgKi8KLQotICAvKiBGZWVkIHRoZSBwb3N0cHJvY2Vzc29yICovCi0gICgqY2luZm8tPnBvc3QtPnBvc3RfcHJvY2Vzc19kYXRhKSAoY2luZm8sIG1haW4tPmJ1ZmZlciwKLQkJCQkgICAgICZtYWluLT5yb3dncm91cF9jdHIsIHJvd2dyb3Vwc19hdmFpbCwKLQkJCQkgICAgIG91dHB1dF9idWYsIG91dF9yb3dfY3RyLCBvdXRfcm93c19hdmFpbCk7Ci0KLSAgLyogSGFzIHBvc3Rwcm9jZXNzb3IgY29uc3VtZWQgYWxsIHRoZSBkYXRhIHlldD8gSWYgc28sIG1hcmsgYnVmZmVyIGVtcHR5ICovCi0gIGlmIChtYWluLT5yb3dncm91cF9jdHIgPj0gcm93Z3JvdXBzX2F2YWlsKSB7Ci0gICAgbWFpbi0+YnVmZmVyX2Z1bGwgPSBGQUxTRTsKLSAgICBtYWluLT5yb3dncm91cF9jdHIgPSAwOwotICB9Ci19Ci0KLQotLyoKLSAqIFByb2Nlc3Mgc29tZSBkYXRhLgotICogVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGNvbnRleHQgcm93cyBtdXN0IGJlIHByb3ZpZGVkLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotcHJvY2Vzc19kYXRhX2NvbnRleHRfbWFpbiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCSAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCi0JCQkgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQotewotICBteV9tYWluX3B0ciBtYWluID0gKG15X21haW5fcHRyKSBjaW5mby0+bWFpbjsKLQotICAvKiBSZWFkIGlucHV0IGRhdGEgaWYgd2UgaGF2ZW4ndCBmaWxsZWQgdGhlIG1haW4gYnVmZmVyIHlldCAqLwotICBpZiAoISBtYWluLT5idWZmZXJfZnVsbCkgewotICAgIGlmICghICgqY2luZm8tPmNvZWYtPmRlY29tcHJlc3NfZGF0YSkgKGNpbmZvLAotCQkJCQkgICBtYWluLT54YnVmZmVyW21haW4tPndoaWNocHRyXSkpCi0gICAgICByZXR1cm47CQkJLyogc3VzcGVuc2lvbiBmb3JjZWQsIGNhbiBkbyBub3RoaW5nIG1vcmUgKi8KLSAgICBtYWluLT5idWZmZXJfZnVsbCA9IFRSVUU7CS8qIE9LLCB3ZSBoYXZlIGFuIGlNQ1Ugcm93IHRvIHdvcmsgd2l0aCAqLwotICAgIG1haW4tPmlNQ1Vfcm93X2N0cisrOwkvKiBjb3VudCByb3dzIHJlY2VpdmVkICovCi0gIH0KLQotICAvKiBQb3N0cHJvY2Vzc29yIHR5cGljYWxseSB3aWxsIG5vdCBzd2FsbG93IGFsbCB0aGUgaW5wdXQgZGF0YSBpdCBpcyBoYW5kZWQKLSAgICogaW4gb25lIGNhbGwgKGR1ZSB0byBmaWxsaW5nIHRoZSBvdXRwdXQgYnVmZmVyIGZpcnN0KS4gIE11c3QgYmUgcHJlcGFyZWQKLSAgICogdG8gZXhpdCBhbmQgcmVzdGFydC4gIFRoaXMgc3dpdGNoIGxldHMgdXMga2VlcCB0cmFjayBvZiBob3cgZmFyIHdlIGdvdC4KLSAgICogTm90ZSB0aGF0IGVhY2ggY2FzZSBmYWxscyB0aHJvdWdoIHRvIHRoZSBuZXh0IG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbi4KLSAgICovCi0gIHN3aXRjaCAobWFpbi0+Y29udGV4dF9zdGF0ZSkgewotICBjYXNlIENUWF9QT1NUUE9ORURfUk9XOgotICAgIC8qIENhbGwgcG9zdHByb2Nlc3NvciB1c2luZyBwcmV2aW91c2x5IHNldCBwb2ludGVycyBmb3IgcG9zdHBvbmVkIHJvdyAqLwotICAgICgqY2luZm8tPnBvc3QtPnBvc3RfcHJvY2Vzc19kYXRhKSAoY2luZm8sIG1haW4tPnhidWZmZXJbbWFpbi0+d2hpY2hwdHJdLAotCQkJJm1haW4tPnJvd2dyb3VwX2N0ciwgbWFpbi0+cm93Z3JvdXBzX2F2YWlsLAotCQkJb3V0cHV0X2J1Ziwgb3V0X3Jvd19jdHIsIG91dF9yb3dzX2F2YWlsKTsKLSAgICBpZiAobWFpbi0+cm93Z3JvdXBfY3RyIDwgbWFpbi0+cm93Z3JvdXBzX2F2YWlsKQotICAgICAgcmV0dXJuOwkJCS8qIE5lZWQgdG8gc3VzcGVuZCAqLwotICAgIG1haW4tPmNvbnRleHRfc3RhdGUgPSBDVFhfUFJFUEFSRV9GT1JfSU1DVTsKLSAgICBpZiAoKm91dF9yb3dfY3RyID49IG91dF9yb3dzX2F2YWlsKQotICAgICAgcmV0dXJuOwkJCS8qIFBvc3Rwcm9jZXNzb3IgZXhhY3RseSBmaWxsZWQgb3V0cHV0IGJ1ZiAqLwotICAgIC8qRkFMTFRIUk9VR0gqLwotICBjYXNlIENUWF9QUkVQQVJFX0ZPUl9JTUNVOgotICAgIC8qIFByZXBhcmUgdG8gcHJvY2VzcyBmaXJzdCBNLTEgcm93IGdyb3VwcyBvZiB0aGlzIGlNQ1Ugcm93ICovCi0gICAgbWFpbi0+cm93Z3JvdXBfY3RyID0gMDsKLSAgICBtYWluLT5yb3dncm91cHNfYXZhaWwgPSAoSkRJTUVOU0lPTikgKGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplIC0gMSk7Ci0gICAgLyogQ2hlY2sgZm9yIGJvdHRvbSBvZiBpbWFnZTogaWYgc28sIHR3ZWFrIHBvaW50ZXJzIHRvICJkdXBsaWNhdGUiCi0gICAgICogdGhlIGxhc3Qgc2FtcGxlIHJvdywgYW5kIGFkanVzdCByb3dncm91cHNfYXZhaWwgdG8gaWdub3JlIHBhZGRpbmcgcm93cy4KLSAgICAgKi8KLSAgICBpZiAobWFpbi0+aU1DVV9yb3dfY3RyID09IGNpbmZvLT50b3RhbF9pTUNVX3Jvd3MpCi0gICAgICBzZXRfYm90dG9tX3BvaW50ZXJzKGNpbmZvKTsKLSAgICBtYWluLT5jb250ZXh0X3N0YXRlID0gQ1RYX1BST0NFU1NfSU1DVTsKLSAgICAvKkZBTExUSFJPVUdIKi8KLSAgY2FzZSBDVFhfUFJPQ0VTU19JTUNVOgotICAgIC8qIENhbGwgcG9zdHByb2Nlc3NvciB1c2luZyBwcmV2aW91c2x5IHNldCBwb2ludGVycyAqLwotICAgICgqY2luZm8tPnBvc3QtPnBvc3RfcHJvY2Vzc19kYXRhKSAoY2luZm8sIG1haW4tPnhidWZmZXJbbWFpbi0+d2hpY2hwdHJdLAotCQkJJm1haW4tPnJvd2dyb3VwX2N0ciwgbWFpbi0+cm93Z3JvdXBzX2F2YWlsLAotCQkJb3V0cHV0X2J1Ziwgb3V0X3Jvd19jdHIsIG91dF9yb3dzX2F2YWlsKTsKLSAgICBpZiAobWFpbi0+cm93Z3JvdXBfY3RyIDwgbWFpbi0+cm93Z3JvdXBzX2F2YWlsKQotICAgICAgcmV0dXJuOwkJCS8qIE5lZWQgdG8gc3VzcGVuZCAqLwotICAgIC8qIEFmdGVyIHRoZSBmaXJzdCBpTUNVLCBjaGFuZ2Ugd3JhcGFyb3VuZCBwb2ludGVycyB0byBub3JtYWwgc3RhdGUgKi8KLSAgICBpZiAobWFpbi0+aU1DVV9yb3dfY3RyID09IDEpCi0gICAgICBzZXRfd3JhcGFyb3VuZF9wb2ludGVycyhjaW5mbyk7Ci0gICAgLyogUHJlcGFyZSB0byBsb2FkIG5ldyBpTUNVIHJvdyB1c2luZyBvdGhlciB4YnVmZmVyIGxpc3QgKi8KLSAgICBtYWluLT53aGljaHB0ciBePSAxOwkvKiAwPT4xIG9yIDE9PjAgKi8KLSAgICBtYWluLT5idWZmZXJfZnVsbCA9IEZBTFNFOwotICAgIC8qIFN0aWxsIG5lZWQgdG8gcHJvY2VzcyBsYXN0IHJvdyBncm91cCBvZiB0aGlzIGlNQ1Ugcm93LCAqLwotICAgIC8qIHdoaWNoIGlzIHNhdmVkIGF0IGluZGV4IE0rMSBvZiB0aGUgb3RoZXIgeGJ1ZmZlciAqLwotICAgIG1haW4tPnJvd2dyb3VwX2N0ciA9IChKRElNRU5TSU9OKSAoY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgKyAxKTsKLSAgICBtYWluLT5yb3dncm91cHNfYXZhaWwgPSAoSkRJTUVOU0lPTikgKGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplICsgMik7Ci0gICAgbWFpbi0+Y29udGV4dF9zdGF0ZSA9IENUWF9QT1NUUE9ORURfUk9XOwotICB9Ci19Ci0KLQotLyoKLSAqIFByb2Nlc3Mgc29tZSBkYXRhLgotICogRmluYWwgcGFzcyBvZiB0d28tcGFzcyBxdWFudGl6YXRpb246IGp1c3QgY2FsbCB0aGUgcG9zdHByb2Nlc3Nvci4KLSAqIFNvdXJjZSBkYXRhIHdpbGwgYmUgdGhlIHBvc3Rwcm9jZXNzb3IgY29udHJvbGxlcidzIGludGVybmFsIGJ1ZmZlci4KLSAqLwotCi0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECi0KLU1FVEhPRERFRih2b2lkKQotcHJvY2Vzc19kYXRhX2NyYW5rX3Bvc3QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkJCSBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQotewotICAoKmNpbmZvLT5wb3N0LT5wb3N0X3Byb2Nlc3NfZGF0YSkgKGNpbmZvLCAoSlNBTVBJTUFHRSkgTlVMTCwKLQkJCQkgICAgIChKRElNRU5TSU9OICopIE5VTEwsIChKRElNRU5TSU9OKSAwLAotCQkJCSAgICAgb3V0cHV0X2J1Ziwgb3V0X3Jvd19jdHIsIG91dF9yb3dzX2F2YWlsKTsKLX0KLQotI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLwotCi0KLS8qCi0gKiBJbml0aWFsaXplIG1haW4gYnVmZmVyIGNvbnRyb2xsZXIuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9kX21haW5fY29udHJvbGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQotewotICBteV9tYWluX3B0ciBtYWluOwotICBpbnQgY2ksIHJncm91cCwgbmdyb3VwczsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqY29tcHB0cjsKLQotICBtYWluID0gKG15X21haW5fcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKG15X21haW5fY29udHJvbGxlcikpOwotICBjaW5mby0+bWFpbiA9IChzdHJ1Y3QganBlZ19kX21haW5fY29udHJvbGxlciAqKSBtYWluOwotICBtYWluLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfbWFpbjsKLQotICBpZiAobmVlZF9mdWxsX2J1ZmZlcikJCS8qIHNob3VsZG4ndCBoYXBwZW4gKi8KLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7Ci0KLSAgLyogQWxsb2NhdGUgdGhlIHdvcmtzcGFjZS4KLSAgICogbmdyb3VwcyBpcyB0aGUgbnVtYmVyIG9mIHJvdyBncm91cHMgd2UgbmVlZC4KLSAgICovCi0gIGlmIChjaW5mby0+dXBzYW1wbGUtPm5lZWRfY29udGV4dF9yb3dzKSB7Ci0gICAgaWYgKGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplIDwgMikgLyogdW5zdXBwb3J0ZWQsIHNlZSBjb21tZW50cyBhYm92ZSAqLwotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9OT1RJTVBMKTsKLSAgICBhbGxvY19mdW5ueV9wb2ludGVycyhjaW5mbyk7IC8qIEFsbG9jIHNwYWNlIGZvciB4YnVmZmVyW10gbGlzdHMgKi8KLSAgICBuZ3JvdXBzID0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgKyAyOwotICB9IGVsc2UgewotICAgIG5ncm91cHMgPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZTsKLSAgfQotCi0gIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgICAgY2krKywgY29tcHB0cisrKSB7Ci0gICAgcmdyb3VwID0gKGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIC8KLSAgICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOyAvKiBoZWlnaHQgb2YgYSByb3cgZ3JvdXAgb2YgY29tcG9uZW50ICovCi0gICAgbWFpbi0+YnVmZmVyW2NpXSA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQotCQkJKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCSBjb21wcHRyLT53aWR0aF9pbl9ibG9ja3MgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUsCi0JCQkgKEpESU1FTlNJT04pIChyZ3JvdXAgKiBuZ3JvdXBzKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZG1hcmtlci5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkbWFya2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0OWEzYzAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkbWFya2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkzICswLDAgQEAKLS8qCi0gKiBqZG1hcmtlci5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgcm91dGluZXMgdG8gZGVjb2RlIEpQRUcgZGF0YXN0cmVhbSBtYXJrZXJzLgotICogTW9zdCBvZiB0aGUgY29tcGxleGl0eSBhcmlzZXMgZnJvbSBvdXIgZGVzaXJlIHRvIHN1cHBvcnQgaW5wdXQKLSAqIHN1c3BlbnNpb246IGlmIG5vdCBhbGwgb2YgdGhlIGRhdGEgZm9yIGEgbWFya2VyIGlzIGF2YWlsYWJsZSwKLSAqIHdlIG11c3QgZXhpdCBiYWNrIHRvIHRoZSBhcHBsaWNhdGlvbi4gIE9uIHJlc3VtcHRpb24sIHdlIHJlcHJvY2VzcwotICogdGhlIG1hcmtlci4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotdHlwZWRlZiBlbnVtIHsJCQkvKiBKUEVHIG1hcmtlciBjb2RlcyAqLwotICBNX1NPRjAgID0gMHhjMCwKLSAgTV9TT0YxICA9IDB4YzEsCi0gIE1fU09GMiAgPSAweGMyLAotICBNX1NPRjMgID0gMHhjMywKLSAgCi0gIE1fU09GNSAgPSAweGM1LAotICBNX1NPRjYgID0gMHhjNiwKLSAgTV9TT0Y3ICA9IDB4YzcsCi0gIAotICBNX0pQRyAgID0gMHhjOCwKLSAgTV9TT0Y5ICA9IDB4YzksCi0gIE1fU09GMTAgPSAweGNhLAotICBNX1NPRjExID0gMHhjYiwKLSAgCi0gIE1fU09GMTMgPSAweGNkLAotICBNX1NPRjE0ID0gMHhjZSwKLSAgTV9TT0YxNSA9IDB4Y2YsCi0gIAotICBNX0RIVCAgID0gMHhjNCwKLSAgCi0gIE1fREFDICAgPSAweGNjLAotICAKLSAgTV9SU1QwICA9IDB4ZDAsCi0gIE1fUlNUMSAgPSAweGQxLAotICBNX1JTVDIgID0gMHhkMiwKLSAgTV9SU1QzICA9IDB4ZDMsCi0gIE1fUlNUNCAgPSAweGQ0LAotICBNX1JTVDUgID0gMHhkNSwKLSAgTV9SU1Q2ICA9IDB4ZDYsCi0gIE1fUlNUNyAgPSAweGQ3LAotICAKLSAgTV9TT0kgICA9IDB4ZDgsCi0gIE1fRU9JICAgPSAweGQ5LAotICBNX1NPUyAgID0gMHhkYSwKLSAgTV9EUVQgICA9IDB4ZGIsCi0gIE1fRE5MICAgPSAweGRjLAotICBNX0RSSSAgID0gMHhkZCwKLSAgTV9ESFAgICA9IDB4ZGUsCi0gIE1fRVhQICAgPSAweGRmLAotICAKLSAgTV9BUFAwICA9IDB4ZTAsCi0gIE1fQVBQMSAgPSAweGUxLAotICBNX0FQUDIgID0gMHhlMiwKLSAgTV9BUFAzICA9IDB4ZTMsCi0gIE1fQVBQNCAgPSAweGU0LAotICBNX0FQUDUgID0gMHhlNSwKLSAgTV9BUFA2ICA9IDB4ZTYsCi0gIE1fQVBQNyAgPSAweGU3LAotICBNX0FQUDggID0gMHhlOCwKLSAgTV9BUFA5ICA9IDB4ZTksCi0gIE1fQVBQMTAgPSAweGVhLAotICBNX0FQUDExID0gMHhlYiwKLSAgTV9BUFAxMiA9IDB4ZWMsCi0gIE1fQVBQMTMgPSAweGVkLAotICBNX0FQUDE0ID0gMHhlZSwKLSAgTV9BUFAxNSA9IDB4ZWYsCi0gIAotICBNX0pQRzAgID0gMHhmMCwKLSAgTV9KUEcxMyA9IDB4ZmQsCi0gIE1fQ09NICAgPSAweGZlLAotICAKLSAgTV9URU0gICA9IDB4MDEsCi0gIAotICBNX0VSUk9SID0gMHgxMDAKLX0gSlBFR19NQVJLRVI7Ci0KLQotLyogUHJpdmF0ZSBzdGF0ZSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX21hcmtlcl9yZWFkZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgLyogQXBwbGljYXRpb24tb3ZlcnJpZGFibGUgbWFya2VyIHByb2Nlc3NpbmcgbWV0aG9kcyAqLwotICBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kIHByb2Nlc3NfQ09NOwotICBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kIHByb2Nlc3NfQVBQblsxNl07Ci0KLSAgLyogTGltaXQgb24gbWFya2VyIGRhdGEgbGVuZ3RoIHRvIHNhdmUgZm9yIGVhY2ggbWFya2VyIHR5cGUgKi8KLSAgdW5zaWduZWQgaW50IGxlbmd0aF9saW1pdF9DT007Ci0gIHVuc2lnbmVkIGludCBsZW5ndGhfbGltaXRfQVBQblsxNl07Ci0KLSAgLyogU3RhdHVzIG9mIENPTS9BUFBuIG1hcmtlciBzYXZpbmcgKi8KLSAganBlZ19zYXZlZF9tYXJrZXJfcHRyIGN1cl9tYXJrZXI7CS8qIE5VTEwgaWYgbm90IHByb2Nlc3NpbmcgYSBtYXJrZXIgKi8KLSAgdW5zaWduZWQgaW50IGJ5dGVzX3JlYWQ7CQkvKiBkYXRhIGJ5dGVzIHJlYWQgc28gZmFyIGluIG1hcmtlciAqLwotICAvKiBOb3RlOiBjdXJfbWFya2VyIGlzIG5vdCBsaW5rZWQgaW50byBtYXJrZXJfbGlzdCB1bnRpbCBpdCdzIGFsbCByZWFkLiAqLwotfSBteV9tYXJrZXJfcmVhZGVyOwotCi10eXBlZGVmIG15X21hcmtlcl9yZWFkZXIgKiBteV9tYXJrZXJfcHRyOwotCi0KLS8qCi0gKiBNYWNyb3MgZm9yIGZldGNoaW5nIGRhdGEgZnJvbSB0aGUgZGF0YSBzb3VyY2UgbW9kdWxlLgotICoKLSAqIEF0IGFsbCB0aW1lcywgY2luZm8tPnNyYy0+bmV4dF9pbnB1dF9ieXRlIGFuZCAtPmJ5dGVzX2luX2J1ZmZlciByZWZsZWN0Ci0gKiB0aGUgY3VycmVudCByZXN0YXJ0IHBvaW50OyB3ZSB1cGRhdGUgdGhlbSBvbmx5IHdoZW4gd2UgaGF2ZSByZWFjaGVkIGEKLSAqIHN1aXRhYmxlIHBsYWNlIHRvIHJlc3RhcnQgaWYgYSBzdXNwZW5zaW9uIG9jY3Vycy4KLSAqLwotCi0vKiBEZWNsYXJlIGFuZCBpbml0aWFsaXplIGxvY2FsIGNvcGllcyBvZiBpbnB1dCBwb2ludGVyL2NvdW50ICovCi0jZGVmaW5lIElOUFVUX1ZBUlMoY2luZm8pICBcCi0Jc3RydWN0IGpwZWdfc291cmNlX21nciAqIGRhdGFzcmMgPSAoY2luZm8pLT5zcmM7ICBcCi0JY29uc3QgSk9DVEVUICogbmV4dF9pbnB1dF9ieXRlID0gZGF0YXNyYy0+bmV4dF9pbnB1dF9ieXRlOyAgXAotCXNpemVfdCBieXRlc19pbl9idWZmZXIgPSBkYXRhc3JjLT5ieXRlc19pbl9idWZmZXIKLQotLyogVW5sb2FkIHRoZSBsb2NhbCBjb3BpZXMgLS0tIGRvIHRoaXMgb25seSBhdCBhIHJlc3RhcnQgYm91bmRhcnkgKi8KLSNkZWZpbmUgSU5QVVRfU1lOQyhjaW5mbykgIFwKLQkoIGRhdGFzcmMtPm5leHRfaW5wdXRfYnl0ZSA9IG5leHRfaW5wdXRfYnl0ZSwgIFwKLQkgIGRhdGFzcmMtPmJ5dGVzX2luX2J1ZmZlciA9IGJ5dGVzX2luX2J1ZmZlciApCi0KLS8qIFJlbG9hZCB0aGUgbG9jYWwgY29waWVzIC0tLSB1c2VkIG9ubHkgaW4gTUFLRV9CWVRFX0FWQUlMICovCi0jZGVmaW5lIElOUFVUX1JFTE9BRChjaW5mbykgIFwKLQkoIG5leHRfaW5wdXRfYnl0ZSA9IGRhdGFzcmMtPm5leHRfaW5wdXRfYnl0ZSwgIFwKLQkgIGJ5dGVzX2luX2J1ZmZlciA9IGRhdGFzcmMtPmJ5dGVzX2luX2J1ZmZlciApCi0KLS8qIEludGVybmFsIG1hY3JvIGZvciBJTlBVVF9CWVRFIGFuZCBJTlBVVF8yQllURVM6IG1ha2UgYSBieXRlIGF2YWlsYWJsZS4KLSAqIE5vdGUgd2UgZG8gKm5vdCogZG8gSU5QVVRfU1lOQyBiZWZvcmUgY2FsbGluZyBmaWxsX2lucHV0X2J1ZmZlciwKLSAqIGJ1dCB3ZSBtdXN0IHJlbG9hZCB0aGUgbG9jYWwgY29waWVzIGFmdGVyIGEgc3VjY2Vzc2Z1bCBmaWxsLgotICovCi0jZGVmaW5lIE1BS0VfQllURV9BVkFJTChjaW5mbyxhY3Rpb24pICBcCi0JaWYgKGJ5dGVzX2luX2J1ZmZlciA9PSAwKSB7ICBcCi0JICBpZiAoISAoKmRhdGFzcmMtPmZpbGxfaW5wdXRfYnVmZmVyKSAoY2luZm8pKSAgXAotCSAgICB7IGFjdGlvbjsgfSAgXAotCSAgSU5QVVRfUkVMT0FEKGNpbmZvKTsgIFwKLQl9Ci0KLS8qIFJlYWQgYSBieXRlIGludG8gdmFyaWFibGUgVi4KLSAqIElmIG11c3Qgc3VzcGVuZCwgdGFrZSB0aGUgc3BlY2lmaWVkIGFjdGlvbiAodHlwaWNhbGx5ICJyZXR1cm4gRkFMU0UiKS4KLSAqLwotI2RlZmluZSBJTlBVVF9CWVRFKGNpbmZvLFYsYWN0aW9uKSAgXAotCU1BS0VTVE1UKCBNQUtFX0JZVEVfQVZBSUwoY2luZm8sYWN0aW9uKTsgXAotCQkgIGJ5dGVzX2luX2J1ZmZlci0tOyBcCi0JCSAgViA9IEdFVEpPQ1RFVCgqbmV4dF9pbnB1dF9ieXRlKyspOyApCi0KLS8qIEFzIGFib3ZlLCBidXQgcmVhZCB0d28gYnl0ZXMgaW50ZXJwcmV0ZWQgYXMgYW4gdW5zaWduZWQgMTYtYml0IGludGVnZXIuCi0gKiBWIHNob3VsZCBiZSBkZWNsYXJlZCB1bnNpZ25lZCBpbnQgb3IgcGVyaGFwcyBJTlQzMi4KLSAqLwotI2RlZmluZSBJTlBVVF8yQllURVMoY2luZm8sVixhY3Rpb24pICBcCi0JTUFLRVNUTVQoIE1BS0VfQllURV9BVkFJTChjaW5mbyxhY3Rpb24pOyBcCi0JCSAgYnl0ZXNfaW5fYnVmZmVyLS07IFwKLQkJICBWID0gKCh1bnNpZ25lZCBpbnQpIEdFVEpPQ1RFVCgqbmV4dF9pbnB1dF9ieXRlKyspKSA8PCA4OyBcCi0JCSAgTUFLRV9CWVRFX0FWQUlMKGNpbmZvLGFjdGlvbik7IFwKLQkJICBieXRlc19pbl9idWZmZXItLTsgXAotCQkgIFYgKz0gR0VUSk9DVEVUKCpuZXh0X2lucHV0X2J5dGUrKyk7ICkKLQotCi0vKgotICogUm91dGluZXMgdG8gcHJvY2VzcyBKUEVHIG1hcmtlcnMuCi0gKgotICogRW50cnkgY29uZGl0aW9uOiBKUEVHIG1hcmtlciBpdHNlbGYgaGFzIGJlZW4gcmVhZCBhbmQgaXRzIGNvZGUgc2F2ZWQKLSAqICAgaW4gY2luZm8tPnVucmVhZF9tYXJrZXI7IGlucHV0IHJlc3RhcnQgcG9pbnQgaXMganVzdCBhZnRlciB0aGUgbWFya2VyLgotICoKLSAqIEV4aXQ6IGlmIHJldHVybiBUUlVFLCBoYXZlIHJlYWQgYW5kIHByb2Nlc3NlZCBhbnkgcGFyYW1ldGVycywgYW5kIGhhdmUKLSAqICAgdXBkYXRlZCB0aGUgcmVzdGFydCBwb2ludCB0byBwb2ludCBhZnRlciB0aGUgcGFyYW1ldGVycy4KLSAqICAgSWYgcmV0dXJuIEZBTFNFLCB3YXMgZm9yY2VkIHRvIHN1c3BlbmQgYmVmb3JlIHJlYWNoaW5nIGVuZCBvZgotICogICBtYXJrZXIgcGFyYW1ldGVyczsgcmVzdGFydCBwb2ludCBoYXMgbm90IGJlZW4gbW92ZWQuICBTYW1lIHJvdXRpbmUKLSAqICAgd2lsbCBiZSBjYWxsZWQgYWdhaW4gYWZ0ZXIgYXBwbGljYXRpb24gc3VwcGxpZXMgbW9yZSBpbnB1dCBkYXRhLgotICoKLSAqIFRoaXMgYXBwcm9hY2ggdG8gc3VzcGVuc2lvbiBhc3N1bWVzIHRoYXQgYWxsIG9mIGEgbWFya2VyJ3MgcGFyYW1ldGVycwotICogY2FuIGZpdCBpbnRvIGEgc2luZ2xlIGlucHV0IGJ1ZmZlcmxvYWQuICBUaGlzIHNob3VsZCBob2xkIGZvciAibm9ybWFsIgotICogbWFya2Vycy4gIFNvbWUgQ09NL0FQUG4gbWFya2VycyBtaWdodCBoYXZlIGxhcmdlIHBhcmFtZXRlciBzZWdtZW50cwotICogdGhhdCBtaWdodCBub3QgZml0LiAgSWYgd2UgYXJlIHNpbXBseSBkcm9wcGluZyBzdWNoIGEgbWFya2VyLCB3ZSB1c2UKLSAqIHNraXBfaW5wdXRfZGF0YSB0byBnZXQgcGFzdCBpdCwgYW5kIHRoZXJlYnkgcHV0IHRoZSBwcm9ibGVtIG9uIHRoZQotICogc291cmNlIG1hbmFnZXIncyBzaG91bGRlcnMuICBJZiB3ZSBhcmUgc2F2aW5nIHRoZSBtYXJrZXIncyBjb250ZW50cwotICogaW50byBtZW1vcnksIHdlIHVzZSBhIHNsaWdodGx5IGRpZmZlcmVudCBjb252ZW50aW9uOiB3aGVuIGZvcmNlZCB0bwotICogc3VzcGVuZCwgdGhlIG1hcmtlciBwcm9jZXNzb3IgdXBkYXRlcyB0aGUgcmVzdGFydCBwb2ludCB0byB0aGUgZW5kIG9mCi0gKiB3aGF0IGl0J3MgY29uc3VtZWQgKGllLCB0aGUgZW5kIG9mIHRoZSBidWZmZXIpIGJlZm9yZSByZXR1cm5pbmcgRkFMU0UuCi0gKiBPbiByZXN1bXB0aW9uLCBjaW5mby0+dW5yZWFkX21hcmtlciBzdGlsbCBjb250YWlucyB0aGUgbWFya2VyIGNvZGUsCi0gKiBidXQgdGhlIGRhdGEgc291cmNlIHdpbGwgcG9pbnQgdG8gdGhlIG5leHQgY2h1bmsgb2YgbWFya2VyIGRhdGEuCi0gKiBUaGUgbWFya2VyIHByb2Nlc3NvciBtdXN0IHJldGFpbiBpbnRlcm5hbCBzdGF0ZSB0byBkZWFsIHdpdGggdGhpcy4KLSAqCi0gKiBOb3RlIHRoYXQgd2UgZG9uJ3QgYm90aGVyIHRvIGF2b2lkIGR1cGxpY2F0ZSB0cmFjZSBtZXNzYWdlcyBpZiBhCi0gKiBzdXNwZW5zaW9uIG9jY3VycyB3aXRoaW4gbWFya2VyIHBhcmFtZXRlcnMuICBPdGhlciBzaWRlIGVmZmVjdHMKLSAqIHJlcXVpcmUgbW9yZSBjYXJlLgotICovCi0KLQotTE9DQUwoYm9vbGVhbikKLWdldF9zb2kgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBQcm9jZXNzIGFuIFNPSSBtYXJrZXIgKi8KLXsKLSAgaW50IGk7Ci0gIAotICBUUkFDRU1TKGNpbmZvLCAxLCBKVFJDX1NPSSk7Ci0KLSAgaWYgKGNpbmZvLT5tYXJrZXItPnNhd19TT0kpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9TT0lfRFVQTElDQVRFKTsKLQotICAvKiBSZXNldCBhbGwgcGFyYW1ldGVycyB0aGF0IGFyZSBkZWZpbmVkIHRvIGJlIHJlc2V0IGJ5IFNPSSAqLwotCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fQVJJVEhfVEJMUzsgaSsrKSB7Ci0gICAgY2luZm8tPmFyaXRoX2RjX0xbaV0gPSAwOwotICAgIGNpbmZvLT5hcml0aF9kY19VW2ldID0gMTsKLSAgICBjaW5mby0+YXJpdGhfYWNfS1tpXSA9IDU7Ci0gIH0KLSAgY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgPSAwOwotCi0gIC8qIFNldCBpbml0aWFsIGFzc3VtcHRpb25zIGZvciBjb2xvcnNwYWNlIGV0YyAqLwotCi0gIGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlID0gSkNTX1VOS05PV047Ci0gIGNpbmZvLT5DQ0lSNjAxX3NhbXBsaW5nID0gRkFMU0U7IC8qIEFzc3VtZSBub24tQ0NJUiBzYW1wbGluZz8/PyAqLwotCi0gIGNpbmZvLT5zYXdfSkZJRl9tYXJrZXIgPSBGQUxTRTsKLSAgY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiA9IDE7IC8qIHNldCBkZWZhdWx0IEpGSUYgQVBQMCB2YWx1ZXMgKi8KLSAgY2luZm8tPkpGSUZfbWlub3JfdmVyc2lvbiA9IDE7Ci0gIGNpbmZvLT5kZW5zaXR5X3VuaXQgPSAwOwotICBjaW5mby0+WF9kZW5zaXR5ID0gMTsKLSAgY2luZm8tPllfZGVuc2l0eSA9IDE7Ci0gIGNpbmZvLT5zYXdfQWRvYmVfbWFya2VyID0gRkFMU0U7Ci0gIGNpbmZvLT5BZG9iZV90cmFuc2Zvcm0gPSAwOwotCi0gIGNpbmZvLT5tYXJrZXItPnNhd19TT0kgPSBUUlVFOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLUxPQ0FMKGJvb2xlYW4pCi1nZXRfc29mIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzX3Byb2csIGJvb2xlYW4gaXNfYXJpdGgpCi0vKiBQcm9jZXNzIGEgU09GbiBtYXJrZXIgKi8KLXsKLSAgSU5UMzIgbGVuZ3RoOwotICBpbnQgYywgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotICAvKiBMaXVTdW5saWFuZyBhZGRlZCAyMDExMTIwOSAqLwotICBKRElNRU5TSU9OIGltYWdlX3dpZHRoLCBpbWFnZV9oZWlnaHQ7Ci0gIElOUFVUX1ZBUlMoY2luZm8pOwotCi0gIGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlID0gaXNfcHJvZzsKLSAgY2luZm8tPmFyaXRoX2NvZGUgPSBpc19hcml0aDsKLQotICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKLQotICBJTlBVVF9CWVRFKGNpbmZvLCBjaW5mby0+ZGF0YV9wcmVjaXNpb24sIHJldHVybiBGQUxTRSk7Ci0gIElOUFVUXzJCWVRFUyhjaW5mbywgaW1hZ2VfaGVpZ2h0LCByZXR1cm4gRkFMU0UpOwotICBJTlBVVF8yQllURVMoY2luZm8sIGltYWdlX3dpZHRoLCByZXR1cm4gRkFMU0UpOwotICBJTlBVVF9CWVRFKGNpbmZvLCBjaW5mby0+bnVtX2NvbXBvbmVudHMsIHJldHVybiBGQUxTRSk7Ci0KLSAgaWYgKGltYWdlX3dpZHRoIDw9IEpQRUdfTUFYX0RJTUVOU0lPTikKLQkgIGNpbmZvLT5pbWFnZV93aWR0aCA9IGltYWdlX3dpZHRoOwotIAotICBpZiAoaW1hZ2VfaGVpZ2h0IDw9IEpQRUdfTUFYX0RJTUVOU0lPTikKLQkgIGNpbmZvLT5pbWFnZV9oZWlnaHQgPSBpbWFnZV9oZWlnaHQ7Ci0KLSAgbGVuZ3RoIC09IDg7Ci0KLSAgVFJBQ0VNUzQoY2luZm8sIDEsIEpUUkNfU09GLCBjaW5mby0+dW5yZWFkX21hcmtlciwKLQkgICAoaW50KSBjaW5mby0+aW1hZ2Vfd2lkdGgsIChpbnQpIGNpbmZvLT5pbWFnZV9oZWlnaHQsCi0JICAgY2luZm8tPm51bV9jb21wb25lbnRzKTsKLQotICBpZiAoY2luZm8tPm1hcmtlci0+c2F3X1NPRikKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1NPRl9EVVBMSUNBVEUpOwotCi0gIC8qIFdlIGRvbid0IHN1cHBvcnQgZmlsZXMgaW4gd2hpY2ggdGhlIGltYWdlIGhlaWdodCBpcyBpbml0aWFsbHkgc3BlY2lmaWVkICovCi0gIC8qIGFzIDAgYW5kIGlzIGxhdGVyIHJlZGVmaW5lZCBieSBETkwuICBBcyBsb25nIGFzIHdlIGhhdmUgdG8gY2hlY2sgdGhhdCwgICovCi0gIC8qIG1pZ2h0IGFzIHdlbGwgaGF2ZSBhIGdlbmVyYWwgc2FuaXR5IGNoZWNrLiAqLwotICBpZiAoY2luZm8tPmltYWdlX2hlaWdodCA8PSAwIHx8IGNpbmZvLT5pbWFnZV93aWR0aCA8PSAwCi0gICAgICB8fCBjaW5mby0+bnVtX2NvbXBvbmVudHMgPD0gMCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0VNUFRZX0lNQUdFKTsKLQotICBpZiAobGVuZ3RoICE9IChjaW5mby0+bnVtX2NvbXBvbmVudHMgKiAzKSkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9MRU5HVEgpOwotCi0gIGlmIChjaW5mby0+Y29tcF9pbmZvID09IE5VTEwpCS8qIGRvIG9ubHkgb25jZSwgZXZlbiBpZiBzdXNwZW5kICovCi0gICAgY2luZm8tPmNvbXBfaW5mbyA9IChqcGVnX2NvbXBvbmVudF9pbmZvICopICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpCi0JCQkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJIGNpbmZvLT5udW1fY29tcG9uZW50cyAqIFNJWkVPRihqcGVnX2NvbXBvbmVudF9pbmZvKSk7Ci0gIAotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIGNvbXBwdHItPmNvbXBvbmVudF9pbmRleCA9IGNpOwotICAgIElOUFVUX0JZVEUoY2luZm8sIGNvbXBwdHItPmNvbXBvbmVudF9pZCwgcmV0dXJuIEZBTFNFKTsKLQkvKiBYWVEgMjAwOC0wMy0yNTogQWRvYmUgQ01ZSyBKUEVHIGhhcyBzZXJpb3VzIGZsYXc6IHRoZSBLIGNoYW5uZWwgaGFzIHNhbWUgY29tcG9uZW50IGlkIGFzIEMgY2hhbm5lbCAqLwotCXsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBjaTsgaSArKykKLQkJCWlmIChjb21wcHRyLT5jb21wb25lbnRfaWQgPT0gY2luZm8tPmNvbXBfaW5mb1tpXS5jb21wb25lbnRfaWQpIGJyZWFrOwotCQlpZiAoaSA8IGNpKQotCQkJLyogRm91bmQgdGhlIGVycm9yISBXZSByZXBsYWNlIHRoZSBpZCB3aXRoIHNvbWV0aGluZyB1bmxpa2VseSB1c2VkIGVsc2V3aGVyZSAqLwotCQkJY29tcHB0ci0+Y29tcG9uZW50X2lkICs9IDB4ZjA7Ci0JfQotCS8qIGVuZCBvZiBtb2RpZmljYXRpb24gKi8KLSAgICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOwotICAgIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgPSAoYyA+PiA0KSAmIDE1OwotICAgIGNvbXBwdHItPnZfc2FtcF9mYWN0b3IgPSAoYyAgICAgKSAmIDE1OwotICAgIElOUFVUX0JZVEUoY2luZm8sIGNvbXBwdHItPnF1YW50X3RibF9ubywgcmV0dXJuIEZBTFNFKTsKLQotICAgIFRSQUNFTVM0KGNpbmZvLCAxLCBKVFJDX1NPRl9DT01QT05FTlQsCi0JICAgICBjb21wcHRyLT5jb21wb25lbnRfaWQsIGNvbXBwdHItPmhfc2FtcF9mYWN0b3IsCi0JICAgICBjb21wcHRyLT52X3NhbXBfZmFjdG9yLCBjb21wcHRyLT5xdWFudF90Ymxfbm8pOwotICB9Ci0KLSAgY2luZm8tPm1hcmtlci0+c2F3X1NPRiA9IFRSVUU7Ci0KLSAgSU5QVVRfU1lOQyhjaW5mbyk7Ci0gIHJldHVybiBUUlVFOwotfQotCi0KLUxPQ0FMKGJvb2xlYW4pCi1nZXRfc29zIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogUHJvY2VzcyBhIFNPUyBtYXJrZXIgKi8KLXsKLSAgSU5UMzIgbGVuZ3RoOwotICBpbnQgaSwgY2ksIG4sIGMsIGNjOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLSAgSU5QVVRfVkFSUyhjaW5mbyk7Ci0KLSAgaWYgKCEgY2luZm8tPm1hcmtlci0+c2F3X1NPRikKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1NPU19OT19TT0YpOwotCi0gIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOwotCi0gIElOUFVUX0JZVEUoY2luZm8sIG4sIHJldHVybiBGQUxTRSk7IC8qIE51bWJlciBvZiBjb21wb25lbnRzICovCi0KLSAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfU09TLCBuKTsKLQotICBpZiAobGVuZ3RoICE9IChuICogMiArIDYpIHx8IG4gPCAxIHx8IG4gPiBNQVhfQ09NUFNfSU5fU0NBTikKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9MRU5HVEgpOwotCi0gIGNpbmZvLT5jb21wc19pbl9zY2FuID0gbjsKLQotICAvKiBDb2xsZWN0IHRoZSBjb21wb25lbnQtc3BlYyBwYXJhbWV0ZXJzICovCi0KLSAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotICAgIElOUFVUX0JZVEUoY2luZm8sIGNjLCByZXR1cm4gRkFMU0UpOwotICAgIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7Ci0gICAgCi0JLyogWFlRIDIwMDgtMDMtMjU6IEFkb2JlIENNWUsgSlBFRyBoYXMgc2VyaW91cyBmbGF3OiB0aGUgSyBjaGFubmVsIGhhcyBzYW1lIGNvbXBvbmVudCBpZCBhcyBDIGNoYW5uZWwgKi8KLQl7Ci0JCWludCBqOwotCQlmb3IgKGogPSAwOyBqIDwgaTsgaiArKykKLQkJCWlmIChjYyA9PSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tqXS0+Y29tcG9uZW50X2lkKSBicmVhazsKLQkJaWYgKGogPCBpKQotCQkJLyogZm91bmQgdGhlIGVycm9yISAqLwotCQkJY2MgKz0gMHhmMDsKLQl9Ci0JLyogZW5kIG9mIG1vZGlmaWNhdGlvbiAqLwotICAgIGZvciAoY2kgPSAwLCBjb21wcHRyID0gY2luZm8tPmNvbXBfaW5mbzsgY2kgPCBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0JIGNpKyssIGNvbXBwdHIrKykgewotICAgICAgaWYgKGNjID09IGNvbXBwdHItPmNvbXBvbmVudF9pZCkKLQlnb3RvIGlkX2ZvdW5kOwotICAgIH0KLQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9DT01QT05FTlRfSUQsIGNjKTsKLQotICBpZF9mb3VuZDoKLQotICAgIGNpbmZvLT5jdXJfY29tcF9pbmZvW2ldID0gY29tcHB0cjsKLSAgICBjb21wcHRyLT5kY190Ymxfbm8gPSAoYyA+PiA0KSAmIDE1OwotICAgIGNvbXBwdHItPmFjX3RibF9ubyA9IChjICAgICApICYgMTU7Ci0gICAgCi0gICAgVFJBQ0VNUzMoY2luZm8sIDEsIEpUUkNfU09TX0NPTVBPTkVOVCwgY2MsCi0JICAgICBjb21wcHRyLT5kY190Ymxfbm8sIGNvbXBwdHItPmFjX3RibF9ubyk7Ci0JLyogVGhpcyBDU2kgKGNjKSBzaG91bGQgZGlmZmVyIGZyb20gdGhlIHByZXZpb3VzIENTaSAqLwotICAgIGZvciAoY2kgPSAwOyBjaSA8IGk7IGNpKyspIHsKLSAgICAgIGlmIChjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV0gPT0gY29tcHB0cikKLSAgICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX0NPTVBPTkVOVF9JRCwgY2MpOwotICAgIH0KLSAgfQotCi0gIC8qIENvbGxlY3QgdGhlIGFkZGl0aW9uYWwgc2NhbiBwYXJhbWV0ZXJzIFNzLCBTZSwgQWgvQWwuICovCi0gIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7Ci0gIGNpbmZvLT5TcyA9IGM7Ci0gIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7Ci0gIGNpbmZvLT5TZSA9IGM7Ci0gIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7Ci0gIGNpbmZvLT5BaCA9IChjID4+IDQpICYgMTU7Ci0gIGNpbmZvLT5BbCA9IChjICAgICApICYgMTU7Ci0KLSAgVFJBQ0VNUzQoY2luZm8sIDEsIEpUUkNfU09TX1BBUkFNUywgY2luZm8tPlNzLCBjaW5mby0+U2UsCi0JICAgY2luZm8tPkFoLCBjaW5mby0+QWwpOwotCi0gIC8qIFByZXBhcmUgdG8gc2NhbiBkYXRhICYgcmVzdGFydCBtYXJrZXJzICovCi0gIGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW0gPSAwOwotCi0gIC8qIENvdW50IGFub3RoZXIgU09TIG1hcmtlciAqLwotICBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIrKzsKLQotICBJTlBVVF9TWU5DKGNpbmZvKTsKLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotI2lmZGVmIERfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRAotCi1MT0NBTChib29sZWFuKQotZ2V0X2RhYyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIFByb2Nlc3MgYSBEQUMgbWFya2VyICovCi17Ci0gIElOVDMyIGxlbmd0aDsKLSAgaW50IGluZGV4LCB2YWw7Ci0gIElOUFVUX1ZBUlMoY2luZm8pOwotCi0gIElOUFVUXzJCWVRFUyhjaW5mbywgbGVuZ3RoLCByZXR1cm4gRkFMU0UpOwotICBsZW5ndGggLT0gMjsKLSAgCi0gIHdoaWxlIChsZW5ndGggPiAwKSB7Ci0gICAgSU5QVVRfQllURShjaW5mbywgaW5kZXgsIHJldHVybiBGQUxTRSk7Ci0gICAgSU5QVVRfQllURShjaW5mbywgdmFsLCByZXR1cm4gRkFMU0UpOwotCi0gICAgbGVuZ3RoIC09IDI7Ci0KLSAgICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19EQUMsIGluZGV4LCB2YWwpOwotCi0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSAoMipOVU1fQVJJVEhfVEJMUykpCi0gICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9EQUNfSU5ERVgsIGluZGV4KTsKLQotICAgIGlmIChpbmRleCA+PSBOVU1fQVJJVEhfVEJMUykgeyAvKiBkZWZpbmUgQUMgdGFibGUgKi8KLSAgICAgIGNpbmZvLT5hcml0aF9hY19LW2luZGV4LU5VTV9BUklUSF9UQkxTXSA9IChVSU5UOCkgdmFsOwotICAgIH0gZWxzZSB7CQkJLyogZGVmaW5lIERDIHRhYmxlICovCi0gICAgICBjaW5mby0+YXJpdGhfZGNfTFtpbmRleF0gPSAoVUlOVDgpICh2YWwgJiAweDBGKTsKLSAgICAgIGNpbmZvLT5hcml0aF9kY19VW2luZGV4XSA9IChVSU5UOCkgKHZhbCA+PiA0KTsKLSAgICAgIGlmIChjaW5mby0+YXJpdGhfZGNfTFtpbmRleF0gPiBjaW5mby0+YXJpdGhfZGNfVVtpbmRleF0pCi0JRVJSRVhJVDEoY2luZm8sIEpFUlJfREFDX1ZBTFVFLCB2YWwpOwotICAgIH0KLSAgfQotCi0gIGlmIChsZW5ndGggIT0gMCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9MRU5HVEgpOwotCi0gIElOUFVUX1NZTkMoY2luZm8pOwotICByZXR1cm4gVFJVRTsKLX0KLQotI2Vsc2UgLyogISBEX0FSSVRIX0NPRElOR19TVVBQT1JURUQgKi8KLQotI2RlZmluZSBnZXRfZGFjKGNpbmZvKSAgc2tpcF92YXJpYWJsZShjaW5mbykKLQotI2VuZGlmIC8qIERfQVJJVEhfQ09ESU5HX1NVUFBPUlRFRCAqLwotCi0KLUxPQ0FMKGJvb2xlYW4pCi1nZXRfZGh0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogUHJvY2VzcyBhIERIVCBtYXJrZXIgKi8KLXsKLSAgSU5UMzIgbGVuZ3RoOwotICBVSU5UOCBiaXRzWzE3XTsKLSAgVUlOVDggaHVmZnZhbFsyNTZdOwotICBpbnQgaSwgaW5kZXgsIGNvdW50OwotICBKSFVGRl9UQkwgKipodGJscHRyOwotICBJTlBVVF9WQVJTKGNpbmZvKTsKLQotICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKLSAgbGVuZ3RoIC09IDI7Ci0gIAotICB3aGlsZSAobGVuZ3RoID4gMTYpIHsKLSAgICBJTlBVVF9CWVRFKGNpbmZvLCBpbmRleCwgcmV0dXJuIEZBTFNFKTsKLQotICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX0RIVCwgaW5kZXgpOwotICAgICAgCi0gICAgYml0c1swXSA9IDA7Ci0gICAgY291bnQgPSAwOwotICAgIGZvciAoaSA9IDE7IGkgPD0gMTY7IGkrKykgewotICAgICAgSU5QVVRfQllURShjaW5mbywgYml0c1tpXSwgcmV0dXJuIEZBTFNFKTsKLSAgICAgIGNvdW50ICs9IGJpdHNbaV07Ci0gICAgfQotCi0gICAgbGVuZ3RoIC09IDEgKyAxNjsKLQotICAgIFRSQUNFTVM4KGNpbmZvLCAyLCBKVFJDX0hVRkZCSVRTLAotCSAgICAgYml0c1sxXSwgYml0c1syXSwgYml0c1szXSwgYml0c1s0XSwKLQkgICAgIGJpdHNbNV0sIGJpdHNbNl0sIGJpdHNbN10sIGJpdHNbOF0pOwotICAgIFRSQUNFTVM4KGNpbmZvLCAyLCBKVFJDX0hVRkZCSVRTLAotCSAgICAgYml0c1s5XSwgYml0c1sxMF0sIGJpdHNbMTFdLCBiaXRzWzEyXSwKLQkgICAgIGJpdHNbMTNdLCBiaXRzWzE0XSwgYml0c1sxNV0sIGJpdHNbMTZdKTsKLQotICAgIC8qIEhlcmUgd2UganVzdCBkbyBtaW5pbWFsIHZhbGlkYXRpb24gb2YgdGhlIGNvdW50cyB0byBhdm9pZCB3YWxraW5nCi0gICAgICogb2ZmIHRoZSBlbmQgb2Ygb3VyIHRhYmxlIHNwYWNlLiAgamRodWZmLmMgd2lsbCBjaGVjayBtb3JlIGNhcmVmdWxseS4KLSAgICAgKi8KLSAgICBpZiAoY291bnQgPiAyNTYgfHwgKChJTlQzMikgY291bnQpID4gbGVuZ3RoKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfSFVGRl9UQUJMRSk7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgIElOUFVUX0JZVEUoY2luZm8sIGh1ZmZ2YWxbaV0sIHJldHVybiBGQUxTRSk7Ci0KLSAgICBsZW5ndGggLT0gY291bnQ7Ci0KLSAgICBpZiAoaW5kZXggJiAweDEwKSB7CQkvKiBBQyB0YWJsZSBkZWZpbml0aW9uICovCi0gICAgICBpbmRleCAtPSAweDEwOwotICAgICAgaHRibHB0ciA9ICZjaW5mby0+YWNfaHVmZl90YmxfcHRyc1tpbmRleF07Ci0gICAgfSBlbHNlIHsJCQkvKiBEQyB0YWJsZSBkZWZpbml0aW9uICovCi0gICAgICBodGJscHRyID0gJmNpbmZvLT5kY19odWZmX3RibF9wdHJzW2luZGV4XTsKLSAgICB9Ci0KLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IE5VTV9IVUZGX1RCTFMpCi0gICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9ESFRfSU5ERVgsIGluZGV4KTsKLQotICAgIGlmICgqaHRibHB0ciA9PSBOVUxMKQotICAgICAgKmh0YmxwdHIgPSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAKLSAgICBNRU1DT1BZKCgqaHRibHB0ciktPmJpdHMsIGJpdHMsIFNJWkVPRigoKmh0YmxwdHIpLT5iaXRzKSk7Ci0gICAgTUVNQ09QWSgoKmh0YmxwdHIpLT5odWZmdmFsLCBodWZmdmFsLCBTSVpFT0YoKCpodGJscHRyKS0+aHVmZnZhbCkpOwotICB9Ci0KLSAgaWYgKGxlbmd0aCAhPSAwKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0xFTkdUSCk7Ci0KLSAgSU5QVVRfU1lOQyhjaW5mbyk7Ci0gIHJldHVybiBUUlVFOwotfQotCi0KLUxPQ0FMKGJvb2xlYW4pCi1nZXRfZHF0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogUHJvY2VzcyBhIERRVCBtYXJrZXIgKi8KLXsKLSAgSU5UMzIgbGVuZ3RoOwotICBpbnQgbiwgaSwgcHJlYzsKLSAgdW5zaWduZWQgaW50IHRtcDsKLSAgSlFVQU5UX1RCTCAqcXVhbnRfcHRyOwotICBJTlBVVF9WQVJTKGNpbmZvKTsKLQotICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKLSAgbGVuZ3RoIC09IDI7Ci0KLSAgd2hpbGUgKGxlbmd0aCA+IDApIHsKLSAgICBJTlBVVF9CWVRFKGNpbmZvLCBuLCByZXR1cm4gRkFMU0UpOwotICAgIHByZWMgPSBuID4+IDQ7Ci0gICAgbiAmPSAweDBGOwotCi0gICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfRFFULCBuLCBwcmVjKTsKLQotICAgIGlmIChuID49IE5VTV9RVUFOVF9UQkxTKQotICAgICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfRFFUX0lOREVYLCBuKTsKLSAgICAgIAotICAgIGlmIChjaW5mby0+cXVhbnRfdGJsX3B0cnNbbl0gPT0gTlVMTCkKLSAgICAgIGNpbmZvLT5xdWFudF90YmxfcHRyc1tuXSA9IGpwZWdfYWxsb2NfcXVhbnRfdGFibGUoKGpfY29tbW9uX3B0cikgY2luZm8pOwotICAgIHF1YW50X3B0ciA9IGNpbmZvLT5xdWFudF90YmxfcHRyc1tuXTsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBEQ1RTSVpFMjsgaSsrKSB7Ci0gICAgICBpZiAocHJlYykKLQlJTlBVVF8yQllURVMoY2luZm8sIHRtcCwgcmV0dXJuIEZBTFNFKTsKLSAgICAgIGVsc2UKLQlJTlBVVF9CWVRFKGNpbmZvLCB0bXAsIHJldHVybiBGQUxTRSk7Ci0gICAgICAvKiBXZSBjb252ZXJ0IHRoZSB6aWd6YWctb3JkZXIgdGFibGUgdG8gbmF0dXJhbCBhcnJheSBvcmRlci4gKi8KLSAgICAgIHF1YW50X3B0ci0+cXVhbnR2YWxbanBlZ19uYXR1cmFsX29yZGVyW2ldXSA9IChVSU5UMTYpIHRtcDsKLSAgICB9Ci0KLSAgICBpZiAoY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPj0gMikgewotICAgICAgZm9yIChpID0gMDsgaSA8IERDVFNJWkUyOyBpICs9IDgpIHsKLQlUUkFDRU1TOChjaW5mbywgMiwgSlRSQ19RVUFOVFZBTFMsCi0JCSBxdWFudF9wdHItPnF1YW50dmFsW2ldLCAgIHF1YW50X3B0ci0+cXVhbnR2YWxbaSsxXSwKLQkJIHF1YW50X3B0ci0+cXVhbnR2YWxbaSsyXSwgcXVhbnRfcHRyLT5xdWFudHZhbFtpKzNdLAotCQkgcXVhbnRfcHRyLT5xdWFudHZhbFtpKzRdLCBxdWFudF9wdHItPnF1YW50dmFsW2krNV0sCi0JCSBxdWFudF9wdHItPnF1YW50dmFsW2krNl0sIHF1YW50X3B0ci0+cXVhbnR2YWxbaSs3XSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgbGVuZ3RoIC09IERDVFNJWkUyKzE7Ci0gICAgaWYgKHByZWMpIGxlbmd0aCAtPSBEQ1RTSVpFMjsKLSAgfQotCi0gIGlmIChsZW5ndGggIT0gMCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9MRU5HVEgpOwotCi0gIElOUFVUX1NZTkMoY2luZm8pOwotICByZXR1cm4gVFJVRTsKLX0KLQotCi1MT0NBTChib29sZWFuKQotZ2V0X2RyaSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIFByb2Nlc3MgYSBEUkkgbWFya2VyICovCi17Ci0gIElOVDMyIGxlbmd0aDsKLSAgdW5zaWduZWQgaW50IHRtcDsKLSAgSU5QVVRfVkFSUyhjaW5mbyk7Ci0KLSAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7Ci0gIAotICBpZiAobGVuZ3RoICE9IDQpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfTEVOR1RIKTsKLQotICBJTlBVVF8yQllURVMoY2luZm8sIHRtcCwgcmV0dXJuIEZBTFNFKTsKLQotICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19EUkksIHRtcCk7Ci0KLSAgY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwgPSB0bXA7Ci0KLSAgSU5QVVRfU1lOQyhjaW5mbyk7Ci0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBSb3V0aW5lcyBmb3IgcHJvY2Vzc2luZyBBUFBuIGFuZCBDT00gbWFya2Vycy4KLSAqIFRoZXNlIGFyZSBlaXRoZXIgc2F2ZWQgaW4gbWVtb3J5IG9yIGRpc2NhcmRlZCwgcGVyIGFwcGxpY2F0aW9uIHJlcXVlc3QuCi0gKiBBUFAwIGFuZCBBUFAxNCBhcmUgc3BlY2lhbGx5IGNoZWNrZWQgdG8gc2VlIGlmIHRoZXkgYXJlCi0gKiBKRklGIGFuZCBBZG9iZSBtYXJrZXJzLCByZXNwZWN0aXZlbHkuCi0gKi8KLQotI2RlZmluZSBBUFAwX0RBVEFfTEVOCTE0CS8qIExlbmd0aCBvZiBpbnRlcmVzdGluZyBkYXRhIGluIEFQUDAgKi8KLSNkZWZpbmUgQVBQMTRfREFUQV9MRU4JMTIJLyogTGVuZ3RoIG9mIGludGVyZXN0aW5nIGRhdGEgaW4gQVBQMTQgKi8KLSNkZWZpbmUgQVBQTl9EQVRBX0xFTgkxNAkvKiBNdXN0IGJlIHRoZSBsYXJnZXN0IG9mIHRoZSBhYm92ZSEhICovCi0KLQotTE9DQUwodm9pZCkKLWV4YW1pbmVfYXBwMCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSk9DVEVUIEZBUiAqIGRhdGEsCi0JICAgICAgdW5zaWduZWQgaW50IGRhdGFsZW4sIElOVDMyIHJlbWFpbmluZykKLS8qIEV4YW1pbmUgZmlyc3QgZmV3IGJ5dGVzIGZyb20gYW4gQVBQMC4KLSAqIFRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIGlmIGl0IGlzIGEgSkZJRiBtYXJrZXIuCi0gKiBkYXRhbGVuIGlzICMgb2YgYnl0ZXMgYXQgZGF0YVtdLCByZW1haW5pbmcgaXMgbGVuZ3RoIG9mIHJlc3Qgb2YgbWFya2VyIGRhdGEuCi0gKi8KLXsKLSAgSU5UMzIgdG90YWxsZW4gPSAoSU5UMzIpIGRhdGFsZW4gKyByZW1haW5pbmc7Ci0KLSAgaWYgKGRhdGFsZW4gPj0gQVBQMF9EQVRBX0xFTiAmJgotICAgICAgR0VUSk9DVEVUKGRhdGFbMF0pID09IDB4NEEgJiYKLSAgICAgIEdFVEpPQ1RFVChkYXRhWzFdKSA9PSAweDQ2ICYmCi0gICAgICBHRVRKT0NURVQoZGF0YVsyXSkgPT0gMHg0OSAmJgotICAgICAgR0VUSk9DVEVUKGRhdGFbM10pID09IDB4NDYgJiYKLSAgICAgIEdFVEpPQ1RFVChkYXRhWzRdKSA9PSAwKSB7Ci0gICAgLyogRm91bmQgSkZJRiBBUFAwIG1hcmtlcjogc2F2ZSBpbmZvICovCi0gICAgY2luZm8tPnNhd19KRklGX21hcmtlciA9IFRSVUU7Ci0gICAgY2luZm8tPkpGSUZfbWFqb3JfdmVyc2lvbiA9IEdFVEpPQ1RFVChkYXRhWzVdKTsKLSAgICBjaW5mby0+SkZJRl9taW5vcl92ZXJzaW9uID0gR0VUSk9DVEVUKGRhdGFbNl0pOwotICAgIGNpbmZvLT5kZW5zaXR5X3VuaXQgPSBHRVRKT0NURVQoZGF0YVs3XSk7Ci0gICAgY2luZm8tPlhfZGVuc2l0eSA9IChHRVRKT0NURVQoZGF0YVs4XSkgPDwgOCkgKyBHRVRKT0NURVQoZGF0YVs5XSk7Ci0gICAgY2luZm8tPllfZGVuc2l0eSA9IChHRVRKT0NURVQoZGF0YVsxMF0pIDw8IDgpICsgR0VUSk9DVEVUKGRhdGFbMTFdKTsKLSAgICAvKiBDaGVjayB2ZXJzaW9uLgotICAgICAqIE1ham9yIHZlcnNpb24gbXVzdCBiZSAxLCBhbnl0aGluZyBlbHNlIHNpZ25hbHMgYW4gaW5jb21wYXRpYmxlIGNoYW5nZS4KLSAgICAgKiAoV2UgdXNlZCB0byB0cmVhdCB0aGlzIGFzIGFuIGVycm9yLCBidXQgbm93IGl0J3MgYSBub25mYXRhbCB3YXJuaW5nLAotICAgICAqIGJlY2F1c2Ugc29tZSBib3pvIGF0IEhpamFhayBjb3VsZG4ndCByZWFkIHRoZSBzcGVjLikKLSAgICAgKiBNaW5vciB2ZXJzaW9uIHNob3VsZCBiZSAwLi4yLCBidXQgcHJvY2VzcyBhbnl3YXkgaWYgbmV3ZXIuCi0gICAgICovCi0gICAgaWYgKGNpbmZvLT5KRklGX21ham9yX3ZlcnNpb24gIT0gMSkKLSAgICAgIFdBUk5NUzIoY2luZm8sIEpXUk5fSkZJRl9NQUpPUiwKLQkgICAgICBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uLCBjaW5mby0+SkZJRl9taW5vcl92ZXJzaW9uKTsKLSAgICAvKiBHZW5lcmF0ZSB0cmFjZSBtZXNzYWdlcyAqLwotICAgIFRSQUNFTVM1KGNpbmZvLCAxLCBKVFJDX0pGSUYsCi0JICAgICBjaW5mby0+SkZJRl9tYWpvcl92ZXJzaW9uLCBjaW5mby0+SkZJRl9taW5vcl92ZXJzaW9uLAotCSAgICAgY2luZm8tPlhfZGVuc2l0eSwgY2luZm8tPllfZGVuc2l0eSwgY2luZm8tPmRlbnNpdHlfdW5pdCk7Ci0gICAgLyogVmFsaWRhdGUgdGh1bWJuYWlsIGRpbWVuc2lvbnMgYW5kIGlzc3VlIGFwcHJvcHJpYXRlIG1lc3NhZ2VzICovCi0gICAgaWYgKEdFVEpPQ1RFVChkYXRhWzEyXSkgfCBHRVRKT0NURVQoZGF0YVsxM10pKQotICAgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfSkZJRl9USFVNQk5BSUwsCi0JICAgICAgIEdFVEpPQ1RFVChkYXRhWzEyXSksIEdFVEpPQ1RFVChkYXRhWzEzXSkpOwotICAgIHRvdGFsbGVuIC09IEFQUDBfREFUQV9MRU47Ci0gICAgaWYgKHRvdGFsbGVuICE9Ci0JKChJTlQzMilHRVRKT0NURVQoZGF0YVsxMl0pICogKElOVDMyKUdFVEpPQ1RFVChkYXRhWzEzXSkgKiAoSU5UMzIpIDMpKQotICAgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfSkZJRl9CQURUSFVNQk5BSUxTSVpFLCAoaW50KSB0b3RhbGxlbik7Ci0gIH0gZWxzZSBpZiAoZGF0YWxlbiA+PSA2ICYmCi0gICAgICBHRVRKT0NURVQoZGF0YVswXSkgPT0gMHg0QSAmJgotICAgICAgR0VUSk9DVEVUKGRhdGFbMV0pID09IDB4NDYgJiYKLSAgICAgIEdFVEpPQ1RFVChkYXRhWzJdKSA9PSAweDU4ICYmCi0gICAgICBHRVRKT0NURVQoZGF0YVszXSkgPT0gMHg1OCAmJgotICAgICAgR0VUSk9DVEVUKGRhdGFbNF0pID09IDApIHsKLSAgICAvKiBGb3VuZCBKRklGICJKRlhYIiBleHRlbnNpb24gQVBQMCBtYXJrZXIgKi8KLSAgICAvKiBUaGUgbGlicmFyeSBkb2Vzbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nIHdpdGggdGhlc2UsCi0gICAgICogYnV0IHdlIHRyeSB0byBwcm9kdWNlIGEgaGVscGZ1bCB0cmFjZSBtZXNzYWdlLgotICAgICAqLwotICAgIHN3aXRjaCAoR0VUSk9DVEVUKGRhdGFbNV0pKSB7Ci0gICAgY2FzZSAweDEwOgotICAgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfVEhVTUJfSlBFRywgKGludCkgdG90YWxsZW4pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDExOgotICAgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfVEhVTUJfUEFMRVRURSwgKGludCkgdG90YWxsZW4pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAweDEzOgotICAgICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfVEhVTUJfUkdCLCAoaW50KSB0b3RhbGxlbik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfSkZJRl9FWFRFTlNJT04sCi0JICAgICAgIEdFVEpPQ1RFVChkYXRhWzVdKSwgKGludCkgdG90YWxsZW4pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qIFN0YXJ0IG9mIEFQUDAgZG9lcyBub3QgbWF0Y2ggIkpGSUYiIG9yICJKRlhYIiwgb3IgdG9vIHNob3J0ICovCi0gICAgVFJBQ0VNUzEoY2luZm8sIDEsIEpUUkNfQVBQMCwgKGludCkgdG90YWxsZW4pOwotICB9Ci19Ci0KLQotTE9DQUwodm9pZCkKLWV4YW1pbmVfYXBwMTQgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpPQ1RFVCBGQVIgKiBkYXRhLAotCSAgICAgICB1bnNpZ25lZCBpbnQgZGF0YWxlbiwgSU5UMzIgcmVtYWluaW5nKQotLyogRXhhbWluZSBmaXJzdCBmZXcgYnl0ZXMgZnJvbSBhbiBBUFAxNC4KLSAqIFRha2UgYXBwcm9wcmlhdGUgYWN0aW9uIGlmIGl0IGlzIGFuIEFkb2JlIG1hcmtlci4KLSAqIGRhdGFsZW4gaXMgIyBvZiBieXRlcyBhdCBkYXRhW10sIHJlbWFpbmluZyBpcyBsZW5ndGggb2YgcmVzdCBvZiBtYXJrZXIgZGF0YS4KLSAqLwotewotICB1bnNpZ25lZCBpbnQgdmVyc2lvbiwgZmxhZ3MwLCBmbGFnczEsIHRyYW5zZm9ybTsKLQotICBpZiAoZGF0YWxlbiA+PSBBUFAxNF9EQVRBX0xFTiAmJgotICAgICAgR0VUSk9DVEVUKGRhdGFbMF0pID09IDB4NDEgJiYKLSAgICAgIEdFVEpPQ1RFVChkYXRhWzFdKSA9PSAweDY0ICYmCi0gICAgICBHRVRKT0NURVQoZGF0YVsyXSkgPT0gMHg2RiAmJgotICAgICAgR0VUSk9DVEVUKGRhdGFbM10pID09IDB4NjIgJiYKLSAgICAgIEdFVEpPQ1RFVChkYXRhWzRdKSA9PSAweDY1KSB7Ci0gICAgLyogRm91bmQgQWRvYmUgQVBQMTQgbWFya2VyICovCi0gICAgdmVyc2lvbiA9IChHRVRKT0NURVQoZGF0YVs1XSkgPDwgOCkgKyBHRVRKT0NURVQoZGF0YVs2XSk7Ci0gICAgZmxhZ3MwID0gKEdFVEpPQ1RFVChkYXRhWzddKSA8PCA4KSArIEdFVEpPQ1RFVChkYXRhWzhdKTsKLSAgICBmbGFnczEgPSAoR0VUSk9DVEVUKGRhdGFbOV0pIDw8IDgpICsgR0VUSk9DVEVUKGRhdGFbMTBdKTsKLSAgICB0cmFuc2Zvcm0gPSBHRVRKT0NURVQoZGF0YVsxMV0pOwotICAgIFRSQUNFTVM0KGNpbmZvLCAxLCBKVFJDX0FET0JFLCB2ZXJzaW9uLCBmbGFnczAsIGZsYWdzMSwgdHJhbnNmb3JtKTsKLSAgICBjaW5mby0+c2F3X0Fkb2JlX21hcmtlciA9IFRSVUU7Ci0gICAgY2luZm8tPkFkb2JlX3RyYW5zZm9ybSA9IChVSU5UOCkgdHJhbnNmb3JtOwotICB9IGVsc2UgewotICAgIC8qIFN0YXJ0IG9mIEFQUDE0IGRvZXMgbm90IG1hdGNoICJBZG9iZSIsIG9yIHRvbyBzaG9ydCAqLwotICAgIFRSQUNFTVMxKGNpbmZvLCAxLCBKVFJDX0FQUDE0LCAoaW50KSAoZGF0YWxlbiArIHJlbWFpbmluZykpOwotICB9Ci19Ci0KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1nZXRfaW50ZXJlc3RpbmdfYXBwbiAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLS8qIFByb2Nlc3MgYW4gQVBQMCBvciBBUFAxNCBtYXJrZXIgd2l0aG91dCBzYXZpbmcgaXQgKi8KLXsKLSAgSU5UMzIgbGVuZ3RoOwotICBKT0NURVQgYltBUFBOX0RBVEFfTEVOXTsKLSAgdW5zaWduZWQgaW50IGksIG51bXRvcmVhZDsKLSAgSU5QVVRfVkFSUyhjaW5mbyk7Ci0KLSAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7Ci0gIGxlbmd0aCAtPSAyOwotCi0gIC8qIGdldCB0aGUgaW50ZXJlc3RpbmcgcGFydCBvZiB0aGUgbWFya2VyIGRhdGEgKi8KLSAgaWYgKGxlbmd0aCA+PSBBUFBOX0RBVEFfTEVOKQotICAgIG51bXRvcmVhZCA9IEFQUE5fREFUQV9MRU47Ci0gIGVsc2UgaWYgKGxlbmd0aCA+IDApCi0gICAgbnVtdG9yZWFkID0gKHVuc2lnbmVkIGludCkgbGVuZ3RoOwotICBlbHNlCi0gICAgbnVtdG9yZWFkID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IG51bXRvcmVhZDsgaSsrKQotICAgIElOUFVUX0JZVEUoY2luZm8sIGJbaV0sIHJldHVybiBGQUxTRSk7Ci0gIGxlbmd0aCAtPSBudW10b3JlYWQ7Ci0KLSAgLyogcHJvY2VzcyBpdCAqLwotICBzd2l0Y2ggKGNpbmZvLT51bnJlYWRfbWFya2VyKSB7Ci0gIGNhc2UgTV9BUFAwOgotICAgIGV4YW1pbmVfYXBwMChjaW5mbywgKEpPQ1RFVCBGQVIgKikgYiwgbnVtdG9yZWFkLCBsZW5ndGgpOwotICAgIGJyZWFrOwotICBjYXNlIE1fQVBQMTQ6Ci0gICAgZXhhbWluZV9hcHAxNChjaW5mbywgKEpPQ1RFVCBGQVIgKikgYiwgbnVtdG9yZWFkLCBsZW5ndGgpOwotICAgIGJyZWFrOwotICBkZWZhdWx0OgotICAgIC8qIGNhbid0IGdldCBoZXJlIHVubGVzcyBqcGVnX3NhdmVfbWFya2VycyBjaG9vc2VzIHdyb25nIHByb2Nlc3NvciAqLwotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1VOS05PV05fTUFSS0VSLCBjaW5mby0+dW5yZWFkX21hcmtlcik7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICAvKiBza2lwIGFueSByZW1haW5pbmcgZGF0YSAtLSBjb3VsZCBiZSBsb3RzICovCi0gIElOUFVUX1NZTkMoY2luZm8pOwotICBpZiAobGVuZ3RoID4gMCkKLSAgICAoKmNpbmZvLT5zcmMtPnNraXBfaW5wdXRfZGF0YSkgKGNpbmZvLCAobG9uZykgbGVuZ3RoKTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0jaWZkZWYgU0FWRV9NQVJLRVJTX1NVUFBPUlRFRAotCi1NRVRIT0RERUYoYm9vbGVhbikKLXNhdmVfbWFya2VyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogU2F2ZSBhbiBBUFBuIG9yIENPTSBtYXJrZXIgaW50byB0aGUgbWFya2VyIGxpc3QgKi8KLXsKLSAgbXlfbWFya2VyX3B0ciBtYXJrZXIgPSAobXlfbWFya2VyX3B0cikgY2luZm8tPm1hcmtlcjsKLSAganBlZ19zYXZlZF9tYXJrZXJfcHRyIGN1cl9tYXJrZXIgPSBtYXJrZXItPmN1cl9tYXJrZXI7Ci0gIHVuc2lnbmVkIGludCBieXRlc19yZWFkLCBkYXRhX2xlbmd0aDsKLSAgSk9DVEVUIEZBUiAqIGRhdGE7Ci0gIElOVDMyIGxlbmd0aCA9IDA7Ci0gIElOUFVUX1ZBUlMoY2luZm8pOwotCi0gIGlmIChjdXJfbWFya2VyID09IE5VTEwpIHsKLSAgICAvKiBiZWdpbiByZWFkaW5nIGEgbWFya2VyICovCi0gICAgSU5QVVRfMkJZVEVTKGNpbmZvLCBsZW5ndGgsIHJldHVybiBGQUxTRSk7Ci0gICAgbGVuZ3RoIC09IDI7Ci0gICAgaWYgKGxlbmd0aCA+PSAwKSB7CQkvKiB3YXRjaCBvdXQgZm9yIGJvZ3VzIGxlbmd0aCB3b3JkICovCi0gICAgICAvKiBmaWd1cmUgb3V0IGhvdyBtdWNoIHdlIHdhbnQgdG8gc2F2ZSAqLwotICAgICAgdW5zaWduZWQgaW50IGxpbWl0OwotICAgICAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IChpbnQpIE1fQ09NKQotCWxpbWl0ID0gbWFya2VyLT5sZW5ndGhfbGltaXRfQ09NOwotICAgICAgZWxzZQotCWxpbWl0ID0gbWFya2VyLT5sZW5ndGhfbGltaXRfQVBQbltjaW5mby0+dW5yZWFkX21hcmtlciAtIChpbnQpIE1fQVBQMF07Ci0gICAgICBpZiAoKHVuc2lnbmVkIGludCkgbGVuZ3RoIDwgbGltaXQpCi0JbGltaXQgPSAodW5zaWduZWQgaW50KSBsZW5ndGg7Ci0gICAgICAvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgbWFya2VyIGl0ZW0gKi8KLSAgICAgIGN1cl9tYXJrZXIgPSAoanBlZ19zYXZlZF9tYXJrZXJfcHRyKQotCSgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICAgIFNJWkVPRihzdHJ1Y3QganBlZ19tYXJrZXJfc3RydWN0KSArIGxpbWl0KTsKLSAgICAgIGN1cl9tYXJrZXItPm5leHQgPSBOVUxMOwotICAgICAgY3VyX21hcmtlci0+bWFya2VyID0gKFVJTlQ4KSBjaW5mby0+dW5yZWFkX21hcmtlcjsKLSAgICAgIGN1cl9tYXJrZXItPm9yaWdpbmFsX2xlbmd0aCA9ICh1bnNpZ25lZCBpbnQpIGxlbmd0aDsKLSAgICAgIGN1cl9tYXJrZXItPmRhdGFfbGVuZ3RoID0gbGltaXQ7Ci0gICAgICAvKiBkYXRhIGFyZWEgaXMganVzdCBiZXlvbmQgdGhlIGpwZWdfbWFya2VyX3N0cnVjdCAqLwotICAgICAgZGF0YSA9IGN1cl9tYXJrZXItPmRhdGEgPSAoSk9DVEVUIEZBUiAqKSAoY3VyX21hcmtlciArIDEpOwotICAgICAgbWFya2VyLT5jdXJfbWFya2VyID0gY3VyX21hcmtlcjsKLSAgICAgIG1hcmtlci0+Ynl0ZXNfcmVhZCA9IDA7Ci0gICAgICBieXRlc19yZWFkID0gMDsKLSAgICAgIGRhdGFfbGVuZ3RoID0gbGltaXQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIGRlYWwgd2l0aCBib2d1cyBsZW5ndGggd29yZCAqLwotICAgICAgYnl0ZXNfcmVhZCA9IGRhdGFfbGVuZ3RoID0gMDsKLSAgICAgIGRhdGEgPSBOVUxMOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiByZXN1bWUgcmVhZGluZyBhIG1hcmtlciAqLwotICAgIGJ5dGVzX3JlYWQgPSBtYXJrZXItPmJ5dGVzX3JlYWQ7Ci0gICAgZGF0YV9sZW5ndGggPSBjdXJfbWFya2VyLT5kYXRhX2xlbmd0aDsKLSAgICBkYXRhID0gY3VyX21hcmtlci0+ZGF0YSArIGJ5dGVzX3JlYWQ7Ci0gIH0KLQotICB3aGlsZSAoYnl0ZXNfcmVhZCA8IGRhdGFfbGVuZ3RoKSB7Ci0gICAgSU5QVVRfU1lOQyhjaW5mbyk7CQkvKiBtb3ZlIHRoZSByZXN0YXJ0IHBvaW50IHRvIGhlcmUgKi8KLSAgICBtYXJrZXItPmJ5dGVzX3JlYWQgPSBieXRlc19yZWFkOwotICAgIC8qIElmIHRoZXJlJ3Mgbm90IGF0IGxlYXN0IG9uZSBieXRlIGluIGJ1ZmZlciwgc3VzcGVuZCAqLwotICAgIE1BS0VfQllURV9BVkFJTChjaW5mbywgcmV0dXJuIEZBTFNFKTsKLSAgICAvKiBDb3B5IGJ5dGVzIHdpdGggcmVhc29uYWJsZSByYXBpZGl0eSAqLwotICAgIHdoaWxlIChieXRlc19yZWFkIDwgZGF0YV9sZW5ndGggJiYgYnl0ZXNfaW5fYnVmZmVyID4gMCkgewotICAgICAgKmRhdGErKyA9ICpuZXh0X2lucHV0X2J5dGUrKzsKLSAgICAgIGJ5dGVzX2luX2J1ZmZlci0tOwotICAgICAgYnl0ZXNfcmVhZCsrOwotICAgIH0KLSAgfQotCi0gIC8qIERvbmUgcmVhZGluZyB3aGF0IHdlIHdhbnQgdG8gcmVhZCAqLwotICBpZiAoY3VyX21hcmtlciAhPSBOVUxMKSB7CS8qIHdpbGwgYmUgTlVMTCBpZiBib2d1cyBsZW5ndGggd29yZCAqLwotICAgIC8qIEFkZCBuZXcgbWFya2VyIHRvIGVuZCBvZiBsaXN0ICovCi0gICAgaWYgKGNpbmZvLT5tYXJrZXJfbGlzdCA9PSBOVUxMKSB7Ci0gICAgICBjaW5mby0+bWFya2VyX2xpc3QgPSBjdXJfbWFya2VyOwotICAgIH0gZWxzZSB7Ci0gICAgICBqcGVnX3NhdmVkX21hcmtlcl9wdHIgcHJldiA9IGNpbmZvLT5tYXJrZXJfbGlzdDsKLSAgICAgIHdoaWxlIChwcmV2LT5uZXh0ICE9IE5VTEwpCi0JcHJldiA9IHByZXYtPm5leHQ7Ci0gICAgICBwcmV2LT5uZXh0ID0gY3VyX21hcmtlcjsKLSAgICB9Ci0gICAgLyogUmVzZXQgcG9pbnRlciAmIGNhbGMgcmVtYWluaW5nIGRhdGEgbGVuZ3RoICovCi0gICAgZGF0YSA9IGN1cl9tYXJrZXItPmRhdGE7Ci0gICAgbGVuZ3RoID0gY3VyX21hcmtlci0+b3JpZ2luYWxfbGVuZ3RoIC0gZGF0YV9sZW5ndGg7Ci0gIH0KLSAgLyogUmVzZXQgdG8gaW5pdGlhbCBzdGF0ZSBmb3IgbmV4dCBtYXJrZXIgKi8KLSAgbWFya2VyLT5jdXJfbWFya2VyID0gTlVMTDsKLQotICAvKiBQcm9jZXNzIHRoZSBtYXJrZXIgaWYgaW50ZXJlc3Rpbmc7IGVsc2UganVzdCBtYWtlIGEgZ2VuZXJpYyB0cmFjZSBtc2cgKi8KLSAgc3dpdGNoIChjaW5mby0+dW5yZWFkX21hcmtlcikgewotICBjYXNlIE1fQVBQMDoKLSAgICBleGFtaW5lX2FwcDAoY2luZm8sIGRhdGEsIGRhdGFfbGVuZ3RoLCBsZW5ndGgpOwotICAgIGJyZWFrOwotICBjYXNlIE1fQVBQMTQ6Ci0gICAgZXhhbWluZV9hcHAxNChjaW5mbywgZGF0YSwgZGF0YV9sZW5ndGgsIGxlbmd0aCk7Ci0gICAgYnJlYWs7Ci0gIGRlZmF1bHQ6Ci0gICAgVFJBQ0VNUzIoY2luZm8sIDEsIEpUUkNfTUlTQ19NQVJLRVIsIGNpbmZvLT51bnJlYWRfbWFya2VyLAotCSAgICAgKGludCkgKGRhdGFfbGVuZ3RoICsgbGVuZ3RoKSk7Ci0gICAgYnJlYWs7Ci0gIH0KLQotICAvKiBza2lwIGFueSByZW1haW5pbmcgZGF0YSAtLSBjb3VsZCBiZSBsb3RzICovCi0gIElOUFVUX1NZTkMoY2luZm8pOwkJLyogZG8gYmVmb3JlIHNraXBfaW5wdXRfZGF0YSAqLwotICBpZiAobGVuZ3RoID4gMCkKLSAgICAoKmNpbmZvLT5zcmMtPnNraXBfaW5wdXRfZGF0YSkgKGNpbmZvLCAobG9uZykgbGVuZ3RoKTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotI2VuZGlmIC8qIFNBVkVfTUFSS0VSU19TVVBQT1JURUQgKi8KLQotCi1NRVRIT0RERUYoYm9vbGVhbikKLXNraXBfdmFyaWFibGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBTa2lwIG92ZXIgYW4gdW5rbm93biBvciB1bmludGVyZXN0aW5nIHZhcmlhYmxlLWxlbmd0aCBtYXJrZXIgKi8KLXsKLSAgSU5UMzIgbGVuZ3RoOwotICBJTlBVVF9WQVJTKGNpbmZvKTsKLQotICBJTlBVVF8yQllURVMoY2luZm8sIGxlbmd0aCwgcmV0dXJuIEZBTFNFKTsKLSAgbGVuZ3RoIC09IDI7Ci0gIAotICBUUkFDRU1TMihjaW5mbywgMSwgSlRSQ19NSVNDX01BUktFUiwgY2luZm8tPnVucmVhZF9tYXJrZXIsIChpbnQpIGxlbmd0aCk7Ci0KLSAgSU5QVVRfU1lOQyhjaW5mbyk7CQkvKiBkbyBiZWZvcmUgc2tpcF9pbnB1dF9kYXRhICovCi0gIGlmIChsZW5ndGggPiAwKQotICAgICgqY2luZm8tPnNyYy0+c2tpcF9pbnB1dF9kYXRhKSAoY2luZm8sIChsb25nKSBsZW5ndGgpOwotCi0gIHJldHVybiBUUlVFOwotfQotCi0KLS8qCi0gKiBGaW5kIHRoZSBuZXh0IEpQRUcgbWFya2VyLCBzYXZlIGl0IGluIGNpbmZvLT51bnJlYWRfbWFya2VyLgotICogUmV0dXJucyBGQUxTRSBpZiBoYWQgdG8gc3VzcGVuZCBiZWZvcmUgcmVhY2hpbmcgYSBtYXJrZXI7Ci0gKiBpbiB0aGF0IGNhc2UgY2luZm8tPnVucmVhZF9tYXJrZXIgaXMgdW5jaGFuZ2VkLgotICoKLSAqIE5vdGUgdGhhdCB0aGUgcmVzdWx0IG1pZ2h0IG5vdCBiZSBhIHZhbGlkIG1hcmtlciBjb2RlLAotICogYnV0IGl0IHdpbGwgbmV2ZXIgYmUgMCBvciBGRi4KLSAqLwotCi1MT0NBTChib29sZWFuKQotbmV4dF9tYXJrZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIGludCBjOwotICBJTlBVVF9WQVJTKGNpbmZvKTsKLQotICBmb3IgKDs7KSB7Ci0gICAgSU5QVVRfQllURShjaW5mbywgYywgcmV0dXJuIEZBTFNFKTsKLSAgICAvKiBTa2lwIGFueSBub24tRkYgYnl0ZXMuCi0gICAgICogVGhpcyBtYXkgbG9vayBhIGJpdCBpbmVmZmljaWVudCwgYnV0IGl0IHdpbGwgbm90IG9jY3VyIGluIGEgdmFsaWQgZmlsZS4KLSAgICAgKiBXZSBzeW5jIGFmdGVyIGVhY2ggZGlzY2FyZGVkIGJ5dGUgc28gdGhhdCBhIHN1c3BlbmRpbmcgZGF0YSBzb3VyY2UKLSAgICAgKiBjYW4gZGlzY2FyZCB0aGUgYnl0ZSBmcm9tIGl0cyBidWZmZXIuCi0gICAgICovCi0gICAgd2hpbGUgKGMgIT0gMHhGRikgewotICAgICAgY2luZm8tPm1hcmtlci0+ZGlzY2FyZGVkX2J5dGVzKys7Ci0gICAgICBJTlBVVF9TWU5DKGNpbmZvKTsKLSAgICAgIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7Ci0gICAgfQotICAgIC8qIFRoaXMgbG9vcCBzd2FsbG93cyBhbnkgZHVwbGljYXRlIEZGIGJ5dGVzLiAgRXh0cmEgRkZzIGFyZSBsZWdhbCBhcwotICAgICAqIHBhZCBieXRlcywgc28gZG9uJ3QgY291bnQgdGhlbSBpbiBkaXNjYXJkZWRfYnl0ZXMuICBXZSBhc3N1bWUgdGhlcmUKLSAgICAgKiB3aWxsIG5vdCBiZSBzbyBtYW55IGNvbnNlY3V0aXZlIEZGIGJ5dGVzIGFzIHRvIG92ZXJmbG93IGEgc3VzcGVuZGluZwotICAgICAqIGRhdGEgc291cmNlJ3MgaW5wdXQgYnVmZmVyLgotICAgICAqLwotICAgIGRvIHsKLSAgICAgIElOUFVUX0JZVEUoY2luZm8sIGMsIHJldHVybiBGQUxTRSk7Ci0gICAgfSB3aGlsZSAoYyA9PSAweEZGKTsKLSAgICBpZiAoYyAhPSAwKQotICAgICAgYnJlYWs7CQkJLyogZm91bmQgYSB2YWxpZCBtYXJrZXIsIGV4aXQgbG9vcCAqLwotICAgIC8qIFJlYWNoIGhlcmUgaWYgd2UgZm91bmQgYSBzdHVmZmVkLXplcm8gZGF0YSBzZXF1ZW5jZSAoRkYvMDApLgotICAgICAqIERpc2NhcmQgaXQgYW5kIGxvb3AgYmFjayB0byB0cnkgYWdhaW4uCi0gICAgICovCi0gICAgY2luZm8tPm1hcmtlci0+ZGlzY2FyZGVkX2J5dGVzICs9IDI7Ci0gICAgSU5QVVRfU1lOQyhjaW5mbyk7Ci0gIH0KLQotICBpZiAoY2luZm8tPm1hcmtlci0+ZGlzY2FyZGVkX2J5dGVzICE9IDApIHsKLSAgICBXQVJOTVMyKGNpbmZvLCBKV1JOX0VYVFJBTkVPVVNfREFUQSwgY2luZm8tPm1hcmtlci0+ZGlzY2FyZGVkX2J5dGVzLCBjKTsKLSAgICBjaW5mby0+bWFya2VyLT5kaXNjYXJkZWRfYnl0ZXMgPSAwOwotICB9Ci0KLSAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSBjOwotCi0gIElOUFVUX1NZTkMoY2luZm8pOwotICByZXR1cm4gVFJVRTsKLX0KLQotCi1MT0NBTChib29sZWFuKQotZmlyc3RfbWFya2VyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogTGlrZSBuZXh0X21hcmtlciwgYnV0IHVzZWQgdG8gb2J0YWluIHRoZSBpbml0aWFsIFNPSSBtYXJrZXIuICovCi0vKiBGb3IgdGhpcyBtYXJrZXIsIHdlIGRvIG5vdCBhbGxvdyBwcmVjZWRpbmcgZ2FyYmFnZSBvciBmaWxsOyBvdGhlcndpc2UsCi0gKiB3ZSBtaWdodCB3ZWxsIHNjYW4gYW4gZW50aXJlIGlucHV0IGZpbGUgYmVmb3JlIHJlYWxpemluZyBpdCBhaW4ndCBKUEVHLgotICogSWYgYW4gYXBwbGljYXRpb24gd2FudHMgdG8gcHJvY2VzcyBub24tSkZJRiBmaWxlcywgaXQgbXVzdCBzZWVrIHRvIHRoZQotICogU09JIGJlZm9yZSBjYWxsaW5nIHRoZSBKUEVHIGxpYnJhcnkuCi0gKi8KLXsKLSAgaW50IGMsIGMyOwotICBJTlBVVF9WQVJTKGNpbmZvKTsKLQotICBJTlBVVF9CWVRFKGNpbmZvLCBjLCByZXR1cm4gRkFMU0UpOwotICBJTlBVVF9CWVRFKGNpbmZvLCBjMiwgcmV0dXJuIEZBTFNFKTsKLSAgaWYgKGMgIT0gMHhGRiB8fCBjMiAhPSAoaW50KSBNX1NPSSkKLSAgICBFUlJFWElUMihjaW5mbywgSkVSUl9OT19TT0ksIGMsIGMyKTsKLQotICBjaW5mby0+dW5yZWFkX21hcmtlciA9IGMyOwotCi0gIElOUFVUX1NZTkMoY2luZm8pOwotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogUmVhZCBtYXJrZXJzIHVudGlsIFNPUyBvciBFT0kuCi0gKgotICogUmV0dXJucyBzYW1lIGNvZGVzIGFzIGFyZSBkZWZpbmVkIGZvciBqcGVnX2NvbnN1bWVfaW5wdXQ6Ci0gKiBKUEVHX1NVU1BFTkRFRCwgSlBFR19SRUFDSEVEX1NPUywgb3IgSlBFR19SRUFDSEVEX0VPSS4KLSAqLwotCi1NRVRIT0RERUYoaW50KQotcmVhZF9tYXJrZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICAvKiBPdXRlciBsb29wIHJlcGVhdHMgb25jZSBmb3IgZWFjaCBtYXJrZXIuICovCi0gIGZvciAoOzspIHsKLSAgICAvKiBDb2xsZWN0IHRoZSBtYXJrZXIgcHJvcGVyLCB1bmxlc3Mgd2UgYWxyZWFkeSBkaWQuICovCi0gICAgLyogTkI6IGZpcnN0X21hcmtlcigpIGVuZm9yY2VzIHRoZSByZXF1aXJlbWVudCB0aGF0IFNPSSBhcHBlYXIgZmlyc3QuICovCi0gICAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IDApIHsKLSAgICAgIGlmICghIGNpbmZvLT5tYXJrZXItPnNhd19TT0kpIHsKLQlpZiAoISBmaXJzdF9tYXJrZXIoY2luZm8pKQotCSAgcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgfSBlbHNlIHsKLQlpZiAoISBuZXh0X21hcmtlcihjaW5mbykpCi0JICByZXR1cm4gSlBFR19TVVNQRU5ERUQ7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIEF0IHRoaXMgcG9pbnQgY2luZm8tPnVucmVhZF9tYXJrZXIgY29udGFpbnMgdGhlIG1hcmtlciBjb2RlIGFuZCB0aGUKLSAgICAgKiBpbnB1dCBwb2ludCBpcyBqdXN0IHBhc3QgdGhlIG1hcmtlciBwcm9wZXIsIGJ1dCBiZWZvcmUgYW55IHBhcmFtZXRlcnMuCi0gICAgICogQSBzdXNwZW5zaW9uIHdpbGwgY2F1c2UgdXMgdG8gcmV0dXJuIHdpdGggdGhpcyBzdGF0ZSBzdGlsbCB0cnVlLgotICAgICAqLwotICAgIHN3aXRjaCAoY2luZm8tPnVucmVhZF9tYXJrZXIpIHsKLSAgICBjYXNlIE1fU09JOgotICAgICAgaWYgKCEgZ2V0X3NvaShjaW5mbykpCi0JcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU09GMDoJCS8qIEJhc2VsaW5lICovCi0gICAgY2FzZSBNX1NPRjE6CQkvKiBFeHRlbmRlZCBzZXF1ZW50aWFsLCBIdWZmbWFuICovCi0gICAgICBpZiAoISBnZXRfc29mKGNpbmZvLCBGQUxTRSwgRkFMU0UpKQotCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NPRjI6CQkvKiBQcm9ncmVzc2l2ZSwgSHVmZm1hbiAqLwotICAgICAgaWYgKCEgZ2V0X3NvZihjaW5mbywgVFJVRSwgRkFMU0UpKQotCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX1NPRjk6CQkvKiBFeHRlbmRlZCBzZXF1ZW50aWFsLCBhcml0aG1ldGljICovCi0gICAgICBpZiAoISBnZXRfc29mKGNpbmZvLCBGQUxTRSwgVFJVRSkpCi0JcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU09GMTA6CQkvKiBQcm9ncmVzc2l2ZSwgYXJpdGhtZXRpYyAqLwotICAgICAgaWYgKCEgZ2V0X3NvZihjaW5mbywgVFJVRSwgVFJVRSkpCi0JcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgYnJlYWs7Ci0KLSAgICAvKiBDdXJyZW50bHkgdW5zdXBwb3J0ZWQgU09GbiB0eXBlcyAqLwotICAgIGNhc2UgTV9TT0YzOgkJLyogTG9zc2xlc3MsIEh1ZmZtYW4gKi8KLSAgICBjYXNlIE1fU09GNToJCS8qIERpZmZlcmVudGlhbCBzZXF1ZW50aWFsLCBIdWZmbWFuICovCi0gICAgY2FzZSBNX1NPRjY6CQkvKiBEaWZmZXJlbnRpYWwgcHJvZ3Jlc3NpdmUsIEh1ZmZtYW4gKi8KLSAgICBjYXNlIE1fU09GNzoJCS8qIERpZmZlcmVudGlhbCBsb3NzbGVzcywgSHVmZm1hbiAqLwotICAgIGNhc2UgTV9KUEc6CQkJLyogUmVzZXJ2ZWQgZm9yIEpQRUcgZXh0ZW5zaW9ucyAqLwotICAgIGNhc2UgTV9TT0YxMToJCS8qIExvc3NsZXNzLCBhcml0aG1ldGljICovCi0gICAgY2FzZSBNX1NPRjEzOgkJLyogRGlmZmVyZW50aWFsIHNlcXVlbnRpYWwsIGFyaXRobWV0aWMgKi8KLSAgICBjYXNlIE1fU09GMTQ6CQkvKiBEaWZmZXJlbnRpYWwgcHJvZ3Jlc3NpdmUsIGFyaXRobWV0aWMgKi8KLSAgICBjYXNlIE1fU09GMTU6CQkvKiBEaWZmZXJlbnRpYWwgbG9zc2xlc3MsIGFyaXRobWV0aWMgKi8KLSAgICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1NPRl9VTlNVUFBPUlRFRCwgY2luZm8tPnVucmVhZF9tYXJrZXIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fU09TOgotICAgICAgaWYgKCEgZ2V0X3NvcyhjaW5mbykpCi0JcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgY2luZm8tPnVucmVhZF9tYXJrZXIgPSAwOwkvKiBwcm9jZXNzZWQgdGhlIG1hcmtlciAqLwotICAgICAgcmV0dXJuIEpQRUdfUkVBQ0hFRF9TT1M7Ci0gICAgCi0gICAgY2FzZSBNX0VPSToKLSAgICAgIFRSQUNFTVMoY2luZm8sIDEsIEpUUkNfRU9JKTsKLSAgICAgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsJLyogcHJvY2Vzc2VkIHRoZSBtYXJrZXIgKi8KLSAgICAgIHJldHVybiBKUEVHX1JFQUNIRURfRU9JOwotICAgICAgCi0gICAgY2FzZSBNX0RBQzoKLSAgICAgIGlmICghIGdldF9kYWMoY2luZm8pKQotCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBNX0RIVDoKLSAgICAgIGlmICghIGdldF9kaHQoY2luZm8pKQotCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBNX0RRVDoKLSAgICAgIGlmICghIGdldF9kcXQoY2luZm8pKQotCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBNX0RSSToKLSAgICAgIGlmICghIGdldF9kcmkoY2luZm8pKQotCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBNX0FQUDA6Ci0gICAgY2FzZSBNX0FQUDE6Ci0gICAgY2FzZSBNX0FQUDI6Ci0gICAgY2FzZSBNX0FQUDM6Ci0gICAgY2FzZSBNX0FQUDQ6Ci0gICAgY2FzZSBNX0FQUDU6Ci0gICAgY2FzZSBNX0FQUDY6Ci0gICAgY2FzZSBNX0FQUDc6Ci0gICAgY2FzZSBNX0FQUDg6Ci0gICAgY2FzZSBNX0FQUDk6Ci0gICAgY2FzZSBNX0FQUDEwOgotICAgIGNhc2UgTV9BUFAxMToKLSAgICBjYXNlIE1fQVBQMTI6Ci0gICAgY2FzZSBNX0FQUDEzOgotICAgIGNhc2UgTV9BUFAxNDoKLSAgICBjYXNlIE1fQVBQMTU6Ci0gICAgICBpZiAoISAoKigobXlfbWFya2VyX3B0cikgY2luZm8tPm1hcmtlciktPnByb2Nlc3NfQVBQblsKLQkJY2luZm8tPnVucmVhZF9tYXJrZXIgLSAoaW50KSBNX0FQUDBdKSAoY2luZm8pKQotCXJldHVybiBKUEVHX1NVU1BFTkRFRDsKLSAgICAgIGJyZWFrOwotICAgICAgCi0gICAgY2FzZSBNX0NPTToKLSAgICAgIGlmICghICgqKChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyKS0+cHJvY2Vzc19DT00pIChjaW5mbykpCi0JcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIE1fUlNUMDoJCS8qIHRoZXNlIGFyZSBhbGwgcGFyYW1ldGVybGVzcyAqLwotICAgIGNhc2UgTV9SU1QxOgotICAgIGNhc2UgTV9SU1QyOgotICAgIGNhc2UgTV9SU1QzOgotICAgIGNhc2UgTV9SU1Q0OgotICAgIGNhc2UgTV9SU1Q1OgotICAgIGNhc2UgTV9SU1Q2OgotICAgIGNhc2UgTV9SU1Q3OgotICAgIGNhc2UgTV9URU06Ci0gICAgICBUUkFDRU1TMShjaW5mbywgMSwgSlRSQ19QQVJNTEVTU19NQVJLRVIsIGNpbmZvLT51bnJlYWRfbWFya2VyKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNX0ROTDoJCQkvKiBJZ25vcmUgRE5MIC4uLiBwZXJoYXBzIHRoZSB3cm9uZyB0aGluZyAqLwotICAgICAgaWYgKCEgc2tpcF92YXJpYWJsZShjaW5mbykpCi0JcmV0dXJuIEpQRUdfU1VTUEVOREVEOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgkJCS8qIG11c3QgYmUgREhQLCBFWFAsIEpQR24sIG9yIFJFU24gKi8KLSAgICAgIC8qIEZvciBub3csIHdlIHRyZWF0IHRoZSByZXNlcnZlZCBtYXJrZXJzIGFzIGZhdGFsIGVycm9ycyBzaW5jZSB0aGV5IGFyZQotICAgICAgICogbGlrZWx5IHRvIGJlIHVzZWQgdG8gc2lnbmFsIGluY29tcGF0aWJsZSBKUEVHIFBhcnQgMyBleHRlbnNpb25zLgotICAgICAgICogT25jZSB0aGUgSlBFRyAzIHZlcnNpb24tbnVtYmVyIG1hcmtlciBpcyB3ZWxsIGRlZmluZWQsIHRoaXMgY29kZQotICAgICAgICogb3VnaHQgdG8gY2hhbmdlIQotICAgICAgICovCi0gICAgICBFUlJFWElUMShjaW5mbywgSkVSUl9VTktOT1dOX01BUktFUiwgY2luZm8tPnVucmVhZF9tYXJrZXIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIC8qIFN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgbWFya2VyLCBzbyByZXNldCBzdGF0ZSB2YXJpYWJsZSAqLwotICAgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsKLSAgfSAvKiBlbmQgbG9vcCAqLwotfQotCi0KLS8qCi0gKiBSZWFkIGEgcmVzdGFydCBtYXJrZXIsIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGFwcGVhciBuZXh0IGluIHRoZSBkYXRhc3RyZWFtOwotICogaWYgdGhlIG1hcmtlciBpcyBub3QgdGhlcmUsIHRha2UgYXBwcm9wcmlhdGUgcmVjb3ZlcnkgYWN0aW9uLgotICogUmV0dXJucyBGQUxTRSBpZiBzdXNwZW5zaW9uIGlzIHJlcXVpcmVkLgotICoKLSAqIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBlbnRyb3B5IGRlY29kZXIgYWZ0ZXIgaXQgaGFzIHJlYWQgYW4gYXBwcm9wcmlhdGUKLSAqIG51bWJlciBvZiBNQ1VzLiAgY2luZm8tPnVucmVhZF9tYXJrZXIgbWF5IGJlIG5vbnplcm8gaWYgdGhlIGVudHJvcHkgZGVjb2RlcgotICogaGFzIGFscmVhZHkgcmVhZCBhIG1hcmtlciBmcm9tIHRoZSBkYXRhIHNvdXJjZS4gIFVuZGVyIG5vcm1hbCBjb25kaXRpb25zCi0gKiBjaW5mby0+dW5yZWFkX21hcmtlciB3aWxsIGJlIHJlc2V0IHRvIDAgYmVmb3JlIHJldHVybmluZzsgaWYgbm90IHJlc2V0LAotICogaXQgaG9sZHMgYSBtYXJrZXIgd2hpY2ggdGhlIGRlY29kZXIgd2lsbCBiZSB1bmFibGUgdG8gcmVhZCBwYXN0LgotICovCi0KLU1FVEhPRERFRihib29sZWFuKQotcmVhZF9yZXN0YXJ0X21hcmtlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgLyogT2J0YWluIGEgbWFya2VyIHVubGVzcyB3ZSBhbHJlYWR5IGRpZC4gKi8KLSAgLyogTm90ZSB0aGF0IG5leHRfbWFya2VyIHdpbGwgY29tcGxhaW4gaWYgaXQgc2tpcHMgYW55IGRhdGEuICovCi0gIGlmIChjaW5mby0+dW5yZWFkX21hcmtlciA9PSAwKSB7Ci0gICAgaWYgKCEgbmV4dF9tYXJrZXIoY2luZm8pKQotICAgICAgcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09Ci0gICAgICAoKGludCkgTV9SU1QwICsgY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSkpIHsKLSAgICAvKiBOb3JtYWwgY2FzZSAtLS0gc3dhbGxvdyB0aGUgbWFya2VyIGFuZCBsZXQgZW50cm9weSBkZWNvZGVyIGNvbnRpbnVlICovCi0gICAgVFJBQ0VNUzEoY2luZm8sIDMsIEpUUkNfUlNULCBjaW5mby0+bWFya2VyLT5uZXh0X3Jlc3RhcnRfbnVtKTsKLSAgICBjaW5mby0+dW5yZWFkX21hcmtlciA9IDA7Ci0gIH0gZWxzZSB7Ci0gICAgLyogVWgtb2gsIHRoZSByZXN0YXJ0IG1hcmtlcnMgaGF2ZSBiZWVuIG1lc3NlZCB1cC4gKi8KLSAgICAvKiBMZXQgdGhlIGRhdGEgc291cmNlIG1hbmFnZXIgZGV0ZXJtaW5lIGhvdyB0byByZXN5bmMuICovCi0gICAgaWYgKCEgKCpjaW5mby0+c3JjLT5yZXN5bmNfdG9fcmVzdGFydCkgKGNpbmZvLAotCQkJCQkgICAgY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSkpCi0gICAgICByZXR1cm4gRkFMU0U7Ci0gIH0KLQotICAvKiBVcGRhdGUgbmV4dC1yZXN0YXJ0IHN0YXRlICovCi0gIGNpbmZvLT5tYXJrZXItPm5leHRfcmVzdGFydF9udW0gPSAoY2luZm8tPm1hcmtlci0+bmV4dF9yZXN0YXJ0X251bSArIDEpICYgNzsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogVGhpcyBpcyB0aGUgZGVmYXVsdCByZXN5bmNfdG9fcmVzdGFydCBtZXRob2QgZm9yIGRhdGEgc291cmNlIG1hbmFnZXJzCi0gKiB0byB1c2UgaWYgdGhleSBkb24ndCBoYXZlIGFueSBiZXR0ZXIgYXBwcm9hY2guICBTb21lIGRhdGEgc291cmNlIG1hbmFnZXJzCi0gKiBtYXkgYmUgYWJsZSB0byBiYWNrIHVwLCBvciBtYXkgaGF2ZSBhZGRpdGlvbmFsIGtub3dsZWRnZSBhYm91dCB0aGUgZGF0YQotICogd2hpY2ggcGVybWl0cyBhIG1vcmUgaW50ZWxsaWdlbnQgcmVjb3Zlcnkgc3RyYXRlZ3k7IHN1Y2ggbWFuYWdlcnMgd291bGQKLSAqIHByZXN1bWFibHkgc3VwcGx5IHRoZWlyIG93biByZXN5bmMgbWV0aG9kLgotICoKLSAqIHJlYWRfcmVzdGFydF9tYXJrZXIgY2FsbHMgcmVzeW5jX3RvX3Jlc3RhcnQgaWYgaXQgZmluZHMgYSBtYXJrZXIgb3RoZXIgdGhhbgotICogdGhlIHJlc3RhcnQgbWFya2VyIGl0IHdhcyBleHBlY3RpbmcuICAoVGhpcyBjb2RlIGlzICpub3QqIHVzZWQgdW5sZXNzCi0gKiBhIG5vbnplcm8gcmVzdGFydCBpbnRlcnZhbCBoYXMgYmVlbiBkZWNsYXJlZC4pICBjaW5mby0+dW5yZWFkX21hcmtlciBpcwotICogdGhlIG1hcmtlciBjb2RlIGFjdHVhbGx5IGZvdW5kIChtaWdodCBiZSBhbnl0aGluZywgZXhjZXB0IDAgb3IgRkYpLgotICogVGhlIGRlc2lyZWQgcmVzdGFydCBtYXJrZXIgbnVtYmVyICgwLi43KSBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIuCi0gKiBUaGlzIHJvdXRpbmUgaXMgc3VwcG9zZWQgdG8gYXBwbHkgd2hhdGV2ZXIgZXJyb3IgcmVjb3Zlcnkgc3RyYXRlZ3kgc2VlbXMKLSAqIGFwcHJvcHJpYXRlIGluIG9yZGVyIHRvIHBvc2l0aW9uIHRoZSBpbnB1dCBzdHJlYW0gdG8gdGhlIG5leHQgZGF0YSBzZWdtZW50LgotICogTm90ZSB0aGF0IGNpbmZvLT51bnJlYWRfbWFya2VyIGlzIHRyZWF0ZWQgYXMgYSBtYXJrZXIgYXBwZWFyaW5nIGJlZm9yZQotICogdGhlIGN1cnJlbnQgZGF0YS1zb3VyY2UgaW5wdXQgcG9pbnQ7IHVzdWFsbHkgaXQgc2hvdWxkIGJlIHJlc2V0IHRvIHplcm8KLSAqIGJlZm9yZSByZXR1cm5pbmcuCi0gKiBSZXR1cm5zIEZBTFNFIGlmIHN1c3BlbnNpb24gaXMgcmVxdWlyZWQuCi0gKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBzdWJzdGFudGlhbGx5IGNvbnN0cmFpbmVkIGJ5IHdhbnRpbmcgdG8gdHJlYXQgdGhlCi0gKiBpbnB1dCBhcyBhIGRhdGEgc3RyZWFtOyB0aGlzIG1lYW5zIHdlIGNhbid0IGJhY2sgdXAuICBUaGVyZWZvcmUsIHdlIGhhdmUKLSAqIG9ubHkgdGhlIGZvbGxvd2luZyBhY3Rpb25zIHRvIHdvcmsgd2l0aDoKLSAqICAgMS4gU2ltcGx5IGRpc2NhcmQgdGhlIG1hcmtlciBhbmQgbGV0IHRoZSBlbnRyb3B5IGRlY29kZXIgcmVzdW1lIGF0IG5leHQKLSAqICAgICAgYnl0ZSBvZiBmaWxlLgotICogICAyLiBSZWFkIGZvcndhcmQgdW50aWwgd2UgZmluZCBhbm90aGVyIG1hcmtlciwgZGlzY2FyZGluZyBpbnRlcnZlbmluZwotICogICAgICBkYXRhLiAgKEluIHRoZW9yeSB3ZSBjb3VsZCBsb29rIGFoZWFkIHdpdGhpbiB0aGUgY3VycmVudCBidWZmZXJsb2FkLAotICogICAgICB3aXRob3V0IGhhdmluZyB0byBkaXNjYXJkIGRhdGEgaWYgd2UgZG9uJ3QgZmluZCB0aGUgZGVzaXJlZCBtYXJrZXIuCi0gKiAgICAgIFRoaXMgaWRlYSBpcyBub3QgaW1wbGVtZW50ZWQgaGVyZSwgaW4gcGFydCBiZWNhdXNlIGl0IG1ha2VzIGJlaGF2aW9yCi0gKiAgICAgIGRlcGVuZGVudCBvbiBidWZmZXIgc2l6ZSBhbmQgY2hhbmNlIGJ1ZmZlci1ib3VuZGFyeSBwb3NpdGlvbnMuKQotICogICAzLiBMZWF2ZSB0aGUgbWFya2VyIHVucmVhZCAoYnkgZmFpbGluZyB0byB6ZXJvIGNpbmZvLT51bnJlYWRfbWFya2VyKS4KLSAqICAgICAgVGhpcyB3aWxsIGNhdXNlIHRoZSBlbnRyb3B5IGRlY29kZXIgdG8gcHJvY2VzcyBhbiBlbXB0eSBkYXRhIHNlZ21lbnQsCi0gKiAgICAgIGluc2VydGluZyBkdW1teSB6ZXJvZXMsIGFuZCB0aGVuIHdlIHdpbGwgcmVwcm9jZXNzIHRoZSBtYXJrZXIuCi0gKgotICogIzIgaXMgYXBwcm9wcmlhdGUgaWYgd2UgdGhpbmsgdGhlIGRlc2lyZWQgbWFya2VyIGxpZXMgYWhlYWQsIHdoaWxlICMzIGlzCi0gKiBhcHByb3ByaWF0ZSBpZiB0aGUgZm91bmQgbWFya2VyIGlzIGEgZnV0dXJlIHJlc3RhcnQgbWFya2VyIChpbmRpY2F0aW5nCi0gKiB0aGF0IHdlIGhhdmUgbWlzc2VkIHRoZSBkZXNpcmVkIHJlc3RhcnQgbWFya2VyLCBwcm9iYWJseSBiZWNhdXNlIGl0IGdvdAotICogY29ycnVwdGVkKS4KLSAqIFdlIGFwcGx5ICMyIG9yICMzIGlmIHRoZSBmb3VuZCBtYXJrZXIgaXMgYSByZXN0YXJ0IG1hcmtlciBubyBtb3JlIHRoYW4KLSAqIHR3byBjb3VudHMgYmVoaW5kIG9yIGFoZWFkIG9mIHRoZSBleHBlY3RlZCBvbmUuICBXZSBhbHNvIGFwcGx5ICMyIGlmIHRoZQotICogZm91bmQgbWFya2VyIGlzIG5vdCBhIGxlZ2FsIEpQRUcgbWFya2VyIGNvZGUgKGl0J3MgY2VydGFpbmx5IGJvZ3VzIGRhdGEpLgotICogSWYgdGhlIGZvdW5kIG1hcmtlciBpcyBhIHJlc3RhcnQgbWFya2VyIG1vcmUgdGhhbiAyIGNvdW50cyBhd2F5LCB3ZSBkbyAjMQotICogKHRvbyBtdWNoIHJpc2sgdGhhdCB0aGUgbWFya2VyIGlzIGVycm9uZW91czsgd2l0aCBsdWNrIHdlIHdpbGwgYmUgYWJsZSB0bwotICogcmVzeW5jIGF0IHNvbWUgZnV0dXJlIHBvaW50KS4KLSAqIEZvciBhbnkgdmFsaWQgbm9uLXJlc3RhcnQgSlBFRyBtYXJrZXIsIHdlIGFwcGx5ICMzLiAgVGhpcyBrZWVwcyB1cyBmcm9tCi0gKiBvdmVycnVubmluZyB0aGUgZW5kIG9mIGEgc2Nhbi4gIEFuIGltcGxlbWVudGF0aW9uIGxpbWl0ZWQgdG8gc2luZ2xlLXNjYW4KLSAqIGZpbGVzIG1pZ2h0IGZpbmQgaXQgYmV0dGVyIHRvIGFwcGx5ICMyIGZvciBtYXJrZXJzIG90aGVyIHRoYW4gRU9JLCBzaW5jZQotICogYW55IG90aGVyIG1hcmtlciB3b3VsZCBoYXZlIHRvIGJlIGJvZ3VzIGRhdGEgaW4gdGhhdCBjYXNlLgotICovCi0KLUdMT0JBTChib29sZWFuKQotanBlZ19yZXN5bmNfdG9fcmVzdGFydCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IGRlc2lyZWQpCi17Ci0gIGludCBtYXJrZXIgPSBjaW5mby0+dW5yZWFkX21hcmtlcjsKLSAgaW50IGFjdGlvbiA9IDE7Ci0gIAotICAvKiBBbHdheXMgcHV0IHVwIGEgd2FybmluZy4gKi8KLSAgV0FSTk1TMihjaW5mbywgSldSTl9NVVNUX1JFU1lOQywgbWFya2VyLCBkZXNpcmVkKTsKLSAgCi0gIC8qIE91dGVyIGxvb3AgaGFuZGxlcyByZXBlYXRlZCBkZWNpc2lvbiBhZnRlciBzY2FubmluZyBmb3J3YXJkLiAqLwotICBmb3IgKDs7KSB7Ci0gICAgaWYgKG1hcmtlciA8IChpbnQpIE1fU09GMCkKLSAgICAgIGFjdGlvbiA9IDI7CQkvKiBpbnZhbGlkIG1hcmtlciAqLwotICAgIGVsc2UgaWYgKG1hcmtlciA8IChpbnQpIE1fUlNUMCB8fCBtYXJrZXIgPiAoaW50KSBNX1JTVDcpCi0gICAgICBhY3Rpb24gPSAzOwkJLyogdmFsaWQgbm9uLXJlc3RhcnQgbWFya2VyICovCi0gICAgZWxzZSB7Ci0gICAgICBpZiAobWFya2VyID09ICgoaW50KSBNX1JTVDAgKyAoKGRlc2lyZWQrMSkgJiA3KSkgfHwKLQkgIG1hcmtlciA9PSAoKGludCkgTV9SU1QwICsgKChkZXNpcmVkKzIpICYgNykpKQotCWFjdGlvbiA9IDM7CQkvKiBvbmUgb2YgdGhlIG5leHQgdHdvIGV4cGVjdGVkIHJlc3RhcnRzICovCi0gICAgICBlbHNlIGlmIChtYXJrZXIgPT0gKChpbnQpIE1fUlNUMCArICgoZGVzaXJlZC0xKSAmIDcpKSB8fAotCSAgICAgICBtYXJrZXIgPT0gKChpbnQpIE1fUlNUMCArICgoZGVzaXJlZC0yKSAmIDcpKSkKLQlhY3Rpb24gPSAyOwkJLyogYSBwcmlvciByZXN0YXJ0LCBzbyBhZHZhbmNlICovCi0gICAgICBlbHNlCi0JYWN0aW9uID0gMTsJCS8qIGRlc2lyZWQgcmVzdGFydCBvciB0b28gZmFyIGF3YXkgKi8KLSAgICB9Ci0gICAgVFJBQ0VNUzIoY2luZm8sIDQsIEpUUkNfUkVDT1ZFUllfQUNUSU9OLCBtYXJrZXIsIGFjdGlvbik7Ci0gICAgc3dpdGNoIChhY3Rpb24pIHsKLSAgICBjYXNlIDE6Ci0gICAgICAvKiBEaXNjYXJkIG1hcmtlciBhbmQgbGV0IGVudHJvcHkgZGVjb2RlciByZXN1bWUgcHJvY2Vzc2luZy4gKi8KLSAgICAgIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsKLSAgICAgIHJldHVybiBUUlVFOwotICAgIGNhc2UgMjoKLSAgICAgIC8qIFNjYW4gdG8gdGhlIG5leHQgbWFya2VyLCBhbmQgcmVwZWF0IHRoZSBkZWNpc2lvbiBsb29wLiAqLwotICAgICAgaWYgKCEgbmV4dF9tYXJrZXIoY2luZm8pKQotCXJldHVybiBGQUxTRTsKLSAgICAgIG1hcmtlciA9IGNpbmZvLT51bnJlYWRfbWFya2VyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgLyogUmV0dXJuIHdpdGhvdXQgYWR2YW5jaW5nIHBhc3QgdGhpcyBtYXJrZXIuICovCi0gICAgICAvKiBFbnRyb3B5IGRlY29kZXIgd2lsbCBiZSBmb3JjZWQgdG8gcHJvY2VzcyBhbiBlbXB0eSBzZWdtZW50LiAqLwotICAgICAgcmV0dXJuIFRSVUU7Ci0gICAgfQotICB9IC8qIGVuZCBsb29wICovCi19Ci0KLQotLyoKLSAqIFJlc2V0IG1hcmtlciBwcm9jZXNzaW5nIHN0YXRlIHRvIGJlZ2luIGEgZnJlc2ggZGF0YXN0cmVhbS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXJlc2V0X21hcmtlcl9yZWFkZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X21hcmtlcl9wdHIgbWFya2VyID0gKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXI7Ci0KLSAgY2luZm8tPmNvbXBfaW5mbyA9IE5VTEw7CQkvKiB1bnRpbCBhbGxvY2F0ZWQgYnkgZ2V0X3NvZiAqLwotICBjaW5mby0+aW5wdXRfc2Nhbl9udW1iZXIgPSAwOwkJLyogbm8gU09TIHNlZW4geWV0ICovCi0gIGNpbmZvLT51bnJlYWRfbWFya2VyID0gMDsJCS8qIG5vIHBlbmRpbmcgbWFya2VyICovCi0gIG1hcmtlci0+cHViLnNhd19TT0kgPSBGQUxTRTsJCS8qIHNldCBpbnRlcm5hbCBzdGF0ZSB0b28gKi8KLSAgbWFya2VyLT5wdWIuc2F3X1NPRiA9IEZBTFNFOwotICBtYXJrZXItPnB1Yi5kaXNjYXJkZWRfYnl0ZXMgPSAwOwotICBtYXJrZXItPmN1cl9tYXJrZXIgPSBOVUxMOwotfQotCi0KLS8qCi0gKiBJbml0aWFsaXplIHRoZSBtYXJrZXIgcmVhZGVyIG1vZHVsZS4KLSAqIFRoaXMgaXMgY2FsbGVkIG9ubHkgb25jZSwgd2hlbiB0aGUgZGVjb21wcmVzc2lvbiBvYmplY3QgaXMgY3JlYXRlZC4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X21hcmtlcl9yZWFkZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X21hcmtlcl9wdHIgbWFya2VyOwotICBpbnQgaTsKLQotICAvKiBDcmVhdGUgc3Vib2JqZWN0IGluIHBlcm1hbmVudCBwb29sICovCi0gIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfUEVSTUFORU5ULAotCQkJCVNJWkVPRihteV9tYXJrZXJfcmVhZGVyKSk7Ci0gIGNpbmZvLT5tYXJrZXIgPSAoc3RydWN0IGpwZWdfbWFya2VyX3JlYWRlciAqKSBtYXJrZXI7Ci0gIC8qIEluaXRpYWxpemUgcHVibGljIG1ldGhvZCBwb2ludGVycyAqLwotICBtYXJrZXItPnB1Yi5yZXNldF9tYXJrZXJfcmVhZGVyID0gcmVzZXRfbWFya2VyX3JlYWRlcjsKLSAgbWFya2VyLT5wdWIucmVhZF9tYXJrZXJzID0gcmVhZF9tYXJrZXJzOwotICBtYXJrZXItPnB1Yi5yZWFkX3Jlc3RhcnRfbWFya2VyID0gcmVhZF9yZXN0YXJ0X21hcmtlcjsKLSAgLyogSW5pdGlhbGl6ZSBDT00vQVBQbiBwcm9jZXNzaW5nLgotICAgKiBCeSBkZWZhdWx0LCB3ZSBleGFtaW5lIGFuZCB0aGVuIGRpc2NhcmQgQVBQMCBhbmQgQVBQMTQsCi0gICAqIGJ1dCBzaW1wbHkgZGlzY2FyZCBDT00gYW5kIGFsbCBvdGhlciBBUFBuLgotICAgKi8KLSAgbWFya2VyLT5wcm9jZXNzX0NPTSA9IHNraXBfdmFyaWFibGU7Ci0gIG1hcmtlci0+bGVuZ3RoX2xpbWl0X0NPTSA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0gICAgbWFya2VyLT5wcm9jZXNzX0FQUG5baV0gPSBza2lwX3ZhcmlhYmxlOwotICAgIG1hcmtlci0+bGVuZ3RoX2xpbWl0X0FQUG5baV0gPSAwOwotICB9Ci0gIG1hcmtlci0+cHJvY2Vzc19BUFBuWzBdID0gZ2V0X2ludGVyZXN0aW5nX2FwcG47Ci0gIG1hcmtlci0+cHJvY2Vzc19BUFBuWzE0XSA9IGdldF9pbnRlcmVzdGluZ19hcHBuOwotICAvKiBSZXNldCBtYXJrZXIgcHJvY2Vzc2luZyBzdGF0ZSAqLwotICByZXNldF9tYXJrZXJfcmVhZGVyKGNpbmZvKTsKLX0KLQotCi0vKgotICogQ29udHJvbCBzYXZpbmcgb2YgQ09NIGFuZCBBUFBuIG1hcmtlcnMgaW50byBtYXJrZXJfbGlzdC4KLSAqLwotCi0jaWZkZWYgU0FWRV9NQVJLRVJTX1NVUFBPUlRFRAotCi1HTE9CQUwodm9pZCkKLWpwZWdfc2F2ZV9tYXJrZXJzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyX2NvZGUsCi0JCSAgIHVuc2lnbmVkIGludCBsZW5ndGhfbGltaXQpCi17Ci0gIG15X21hcmtlcl9wdHIgbWFya2VyID0gKG15X21hcmtlcl9wdHIpIGNpbmZvLT5tYXJrZXI7Ci0gIGxvbmcgbWF4bGVuZ3RoOwotICBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kIHByb2Nlc3NvcjsKLQotICAvKiBMZW5ndGggbGltaXQgbXVzdG4ndCBiZSBsYXJnZXIgdGhhbiB3aGF0IHdlIGNhbiBhbGxvY2F0ZQotICAgKiAoc2hvdWxkIG9ubHkgYmUgYSBjb25jZXJuIGluIGEgMTYtYml0IGVudmlyb25tZW50KS4KLSAgICovCi0gIG1heGxlbmd0aCA9IGNpbmZvLT5tZW0tPm1heF9hbGxvY19jaHVuayAtIFNJWkVPRihzdHJ1Y3QganBlZ19tYXJrZXJfc3RydWN0KTsKLSAgaWYgKCgobG9uZykgbGVuZ3RoX2xpbWl0KSA+IG1heGxlbmd0aCkKLSAgICBsZW5ndGhfbGltaXQgPSAodW5zaWduZWQgaW50KSBtYXhsZW5ndGg7Ci0KLSAgLyogQ2hvb3NlIHByb2Nlc3NvciByb3V0aW5lIHRvIHVzZS4KLSAgICogQVBQMC9BUFAxNCBoYXZlIHNwZWNpYWwgcmVxdWlyZW1lbnRzLgotICAgKi8KLSAgaWYgKGxlbmd0aF9saW1pdCkgewotICAgIHByb2Nlc3NvciA9IHNhdmVfbWFya2VyOwotICAgIC8qIElmIHNhdmluZyBBUFAwL0FQUDE0LCBzYXZlIGF0IGxlYXN0IGVub3VnaCBmb3Igb3VyIGludGVybmFsIHVzZS4gKi8KLSAgICBpZiAobWFya2VyX2NvZGUgPT0gKGludCkgTV9BUFAwICYmIGxlbmd0aF9saW1pdCA8IEFQUDBfREFUQV9MRU4pCi0gICAgICBsZW5ndGhfbGltaXQgPSBBUFAwX0RBVEFfTEVOOwotICAgIGVsc2UgaWYgKG1hcmtlcl9jb2RlID09IChpbnQpIE1fQVBQMTQgJiYgbGVuZ3RoX2xpbWl0IDwgQVBQMTRfREFUQV9MRU4pCi0gICAgICBsZW5ndGhfbGltaXQgPSBBUFAxNF9EQVRBX0xFTjsKLSAgfSBlbHNlIHsKLSAgICBwcm9jZXNzb3IgPSBza2lwX3ZhcmlhYmxlOwotICAgIC8qIElmIGRpc2NhcmRpbmcgQVBQMC9BUFAxNCwgdXNlIG91ciByZWd1bGFyIG9uLXRoZS1mbHkgcHJvY2Vzc29yLiAqLwotICAgIGlmIChtYXJrZXJfY29kZSA9PSAoaW50KSBNX0FQUDAgfHwgbWFya2VyX2NvZGUgPT0gKGludCkgTV9BUFAxNCkKLSAgICAgIHByb2Nlc3NvciA9IGdldF9pbnRlcmVzdGluZ19hcHBuOwotICB9Ci0KLSAgaWYgKG1hcmtlcl9jb2RlID09IChpbnQpIE1fQ09NKSB7Ci0gICAgbWFya2VyLT5wcm9jZXNzX0NPTSA9IHByb2Nlc3NvcjsKLSAgICBtYXJrZXItPmxlbmd0aF9saW1pdF9DT00gPSBsZW5ndGhfbGltaXQ7Ci0gIH0gZWxzZSBpZiAobWFya2VyX2NvZGUgPj0gKGludCkgTV9BUFAwICYmIG1hcmtlcl9jb2RlIDw9IChpbnQpIE1fQVBQMTUpIHsKLSAgICBtYXJrZXItPnByb2Nlc3NfQVBQblttYXJrZXJfY29kZSAtIChpbnQpIE1fQVBQMF0gPSBwcm9jZXNzb3I7Ci0gICAgbWFya2VyLT5sZW5ndGhfbGltaXRfQVBQblttYXJrZXJfY29kZSAtIChpbnQpIE1fQVBQMF0gPSBsZW5ndGhfbGltaXQ7Ci0gIH0gZWxzZQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1VOS05PV05fTUFSS0VSLCBtYXJrZXJfY29kZSk7Ci19Ci0KLSNlbmRpZiAvKiBTQVZFX01BUktFUlNfU1VQUE9SVEVEICovCi0KLQotLyoKLSAqIEluc3RhbGwgYSBzcGVjaWFsIHByb2Nlc3NpbmcgbWV0aG9kIGZvciBDT00gb3IgQVBQbiBtYXJrZXJzLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlcl9jb2RlLAotCQkJICAganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCByb3V0aW5lKQotewotICBteV9tYXJrZXJfcHRyIG1hcmtlciA9IChteV9tYXJrZXJfcHRyKSBjaW5mby0+bWFya2VyOwotCi0gIGlmIChtYXJrZXJfY29kZSA9PSAoaW50KSBNX0NPTSkKLSAgICBtYXJrZXItPnByb2Nlc3NfQ09NID0gcm91dGluZTsKLSAgZWxzZSBpZiAobWFya2VyX2NvZGUgPj0gKGludCkgTV9BUFAwICYmIG1hcmtlcl9jb2RlIDw9IChpbnQpIE1fQVBQMTUpCi0gICAgbWFya2VyLT5wcm9jZXNzX0FQUG5bbWFya2VyX2NvZGUgLSAoaW50KSBNX0FQUDBdID0gcm91dGluZTsKLSAgZWxzZQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX1VOS05PV05fTUFSS0VSLCBtYXJrZXJfY29kZSk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRtYXN0ZXIuYyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZG1hc3Rlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODAyYzViLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZG1hc3Rlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNTU3ICswLDAgQEAKLS8qCi0gKiBqZG1hc3Rlci5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgbWFzdGVyIGNvbnRyb2wgbG9naWMgZm9yIHRoZSBKUEVHIGRlY29tcHJlc3Nvci4KLSAqIFRoZXNlIHJvdXRpbmVzIGFyZSBjb25jZXJuZWQgd2l0aCBzZWxlY3RpbmcgdGhlIG1vZHVsZXMgdG8gYmUgZXhlY3V0ZWQKLSAqIGFuZCB3aXRoIGRldGVybWluaW5nIHRoZSBudW1iZXIgb2YgcGFzc2VzIGFuZCB0aGUgd29yayB0byBiZSBkb25lIGluIGVhY2gKLSAqIHBhc3MuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qIFByaXZhdGUgc3RhdGUgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19kZWNvbXBfbWFzdGVyIHB1YjsgLyogcHVibGljIGZpZWxkcyAqLwotCi0gIGludCBwYXNzX251bWJlcjsJCS8qICMgb2YgcGFzc2VzIGNvbXBsZXRlZCAqLwotCi0gIGJvb2xlYW4gdXNpbmdfbWVyZ2VkX3Vwc2FtcGxlOyAvKiBUUlVFIGlmIHVzaW5nIG1lcmdlZCB1cHNhbXBsZS9jY29udmVydCAqLwotCi0gIC8qIFNhdmVkIHJlZmVyZW5jZXMgdG8gaW5pdGlhbGl6ZWQgcXVhbnRpemVyIG1vZHVsZXMsCi0gICAqIGluIGNhc2Ugd2UgbmVlZCB0byBzd2l0Y2ggbW9kZXMuCi0gICAqLwotICBzdHJ1Y3QganBlZ19jb2xvcl9xdWFudGl6ZXIgKiBxdWFudGl6ZXJfMXBhc3M7Ci0gIHN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciAqIHF1YW50aXplcl8ycGFzczsKLX0gbXlfZGVjb21wX21hc3RlcjsKLQotdHlwZWRlZiBteV9kZWNvbXBfbWFzdGVyICogbXlfbWFzdGVyX3B0cjsKLQotCi0vKgotICogRGV0ZXJtaW5lIHdoZXRoZXIgbWVyZ2VkIHVwc2FtcGxlL2NvbG9yIGNvbnZlcnNpb24gc2hvdWxkIGJlIHVzZWQuCi0gKiBDUlVDSUFMOiB0aGlzIG11c3QgbWF0Y2ggdGhlIGFjdHVhbCBjYXBhYmlsaXRpZXMgb2YgamRtZXJnZS5jIQotICovCi0KLUxPQ0FMKGJvb2xlYW4pCi11c2VfbWVyZ2VkX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotI2lmZGVmIFVQU0FNUExFX01FUkdJTkdfU1VQUE9SVEVECi0gIC8qIE1lcmdpbmcgaXMgdGhlIGVxdWl2YWxlbnQgb2YgcGxhaW4gYm94LWZpbHRlciB1cHNhbXBsaW5nICovCi0gIGlmIChjaW5mby0+ZG9fZmFuY3lfdXBzYW1wbGluZyB8fCBjaW5mby0+Q0NJUjYwMV9zYW1wbGluZykKLSAgICByZXR1cm4gRkFMU0U7Ci0gIC8qIGpkbWVyZ2UuYyBvbmx5IHN1cHBvcnRzIFlDQz0+UkdCIGNvbG9yIGNvbnZlcnNpb24gKi8KLSAgaWYgKGNpbmZvLT5qcGVnX2NvbG9yX3NwYWNlICE9IEpDU19ZQ2JDciB8fCBjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gMyB8fAotICAgICAgY2luZm8tPm91dF9jb2xvcl9zcGFjZSAhPSBKQ1NfUkdCIHx8Ci0gICAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgIT0gUkdCX1BJWEVMU0laRSkKLSAgICByZXR1cm4gRkFMU0U7Ci0gIC8qIGFuZCBpdCBvbmx5IGhhbmRsZXMgMmgxdiBvciAyaDJ2IHNhbXBsaW5nIHJhdGlvcyAqLwotICBpZiAoY2luZm8tPmNvbXBfaW5mb1swXS5oX3NhbXBfZmFjdG9yICE9IDIgfHwKLSAgICAgIGNpbmZvLT5jb21wX2luZm9bMV0uaF9zYW1wX2ZhY3RvciAhPSAxIHx8Ci0gICAgICBjaW5mby0+Y29tcF9pbmZvWzJdLmhfc2FtcF9mYWN0b3IgIT0gMSB8fAotICAgICAgY2luZm8tPmNvbXBfaW5mb1swXS52X3NhbXBfZmFjdG9yID4gIDIgfHwKLSAgICAgIGNpbmZvLT5jb21wX2luZm9bMV0udl9zYW1wX2ZhY3RvciAhPSAxIHx8Ci0gICAgICBjaW5mby0+Y29tcF9pbmZvWzJdLnZfc2FtcF9mYWN0b3IgIT0gMSkKLSAgICByZXR1cm4gRkFMU0U7Ci0gIC8qIGZ1cnRoZXJtb3JlLCBpdCBkb2Vzbid0IHdvcmsgaWYgd2UndmUgc2NhbGVkIHRoZSBJRENUcyBkaWZmZXJlbnRseSAqLwotICBpZiAoY2luZm8tPmNvbXBfaW5mb1swXS5EQ1Rfc2NhbGVkX3NpemUgIT0gY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgfHwKLSAgICAgIGNpbmZvLT5jb21wX2luZm9bMV0uRENUX3NjYWxlZF9zaXplICE9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplIHx8Ci0gICAgICBjaW5mby0+Y29tcF9pbmZvWzJdLkRDVF9zY2FsZWRfc2l6ZSAhPSBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSkKLSAgICByZXR1cm4gRkFMU0U7Ci0gIC8qID8/PyBhbHNvIG5lZWQgdG8gdGVzdCBmb3IgdXBzYW1wbGUtdGltZSByZXNjYWxpbmcsIHdoZW4gJiBpZiBzdXBwb3J0ZWQgKi8KLSAgcmV0dXJuIFRSVUU7CQkJLyogYnkgZ29sbHksIGl0J2xsIHdvcmsuLi4gKi8KLSNlbHNlCi0gIHJldHVybiBGQUxTRTsKLSNlbmRpZgotfQotCi0KLS8qCi0gKiBDb21wdXRlIG91dHB1dCBpbWFnZSBkaW1lbnNpb25zIGFuZCByZWxhdGVkIHZhbHVlcy4KLSAqIE5PVEU6IHRoaXMgaXMgZXhwb3J0ZWQgZm9yIHBvc3NpYmxlIHVzZSBieSBhcHBsaWNhdGlvbi4KLSAqIEhlbmNlIGl0IG11c3RuJ3QgZG8gYW55dGhpbmcgdGhhdCBjYW4ndCBiZSBkb25lIHR3aWNlLgotICogQWxzbyBub3RlIHRoYXQgaXQgbWF5IGJlIGNhbGxlZCBiZWZvcmUgdGhlIG1hc3RlciBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQhCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi0vKiBEbyBjb21wdXRhdGlvbnMgdGhhdCBhcmUgbmVlZGVkIGJlZm9yZSBtYXN0ZXIgc2VsZWN0aW9uIHBoYXNlICovCi17Ci0jaWZkZWYgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAotICBpbnQgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKmNvbXBwdHI7Ci0jZW5kaWYKLQotICAvKiBQcmV2ZW50IGFwcGxpY2F0aW9uIGZyb20gY2FsbGluZyBtZSBhdCB3cm9uZyB0aW1lcyAqLwotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSAhPSBEU1RBVEVfUkVBRFkpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1NUQVRFLCBjaW5mby0+Z2xvYmFsX3N0YXRlKTsKLQotI2lmZGVmIElEQ1RfU0NBTElOR19TVVBQT1JURUQKLQotICAvKiBDb21wdXRlIGFjdHVhbCBvdXRwdXQgaW1hZ2UgZGltZW5zaW9ucyBhbmQgRENUIHNjYWxpbmcgY2hvaWNlcy4gKi8KLSAgaWYgKGNpbmZvLT5zY2FsZV9udW0gKiA4IDw9IGNpbmZvLT5zY2FsZV9kZW5vbSkgewotICAgIC8qIFByb3ZpZGUgMS84IHNjYWxpbmcgKi8KLSAgICBjaW5mby0+b3V0cHV0X3dpZHRoID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2Vfd2lkdGgsIDhMKTsKLSAgICBjaW5mby0+b3V0cHV0X2hlaWdodCA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX2hlaWdodCwgOEwpOwotICAgIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplID0gMTsKLSAgfSBlbHNlIGlmIChjaW5mby0+c2NhbGVfbnVtICogNCA8PSBjaW5mby0+c2NhbGVfZGVub20pIHsKLSAgICAvKiBQcm92aWRlIDEvNCBzY2FsaW5nICovCi0gICAgY2luZm8tPm91dHB1dF93aWR0aCA9IChKRElNRU5TSU9OKQotICAgICAgamRpdl9yb3VuZF91cCgobG9uZykgY2luZm8tPmltYWdlX3dpZHRoLCA0TCk7Ci0gICAgY2luZm8tPm91dHB1dF9oZWlnaHQgPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV9oZWlnaHQsIDRMKTsKLSAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA9IDI7Ci0gIH0gZWxzZSBpZiAoY2luZm8tPnNjYWxlX251bSAqIDIgPD0gY2luZm8tPnNjYWxlX2Rlbm9tKSB7Ci0gICAgLyogUHJvdmlkZSAxLzIgc2NhbGluZyAqLwotICAgIGNpbmZvLT5vdXRwdXRfd2lkdGggPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCwgMkwpOwotICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0LCAyTCk7Ci0gICAgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemUgPSA0OwotICB9IGVsc2UgewotICAgIC8qIFByb3ZpZGUgMS8xIHNjYWxpbmcgKi8KLSAgICBjaW5mby0+b3V0cHV0X3dpZHRoID0gY2luZm8tPmltYWdlX3dpZHRoOwotICAgIGNpbmZvLT5vdXRwdXRfaGVpZ2h0ID0gY2luZm8tPmltYWdlX2hlaWdodDsKLSAgICBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA9IERDVFNJWkU7Ci0gIH0KLSAgLyogSW4gc2VsZWN0aW5nIHRoZSBhY3R1YWwgRENUIHNjYWxpbmcgZm9yIGVhY2ggY29tcG9uZW50LCB3ZSB0cnkgdG8KLSAgICogc2NhbGUgdXAgdGhlIGNocm9tYSBjb21wb25lbnRzIHZpYSBJRENUIHNjYWxpbmcgcmF0aGVyIHRoYW4gdXBzYW1wbGluZy4KLSAgICogVGhpcyBzYXZlcyB0aW1lIGlmIHRoZSB1cHNhbXBsZXIgZ2V0cyB0byB1c2UgMToxIHNjYWxpbmcuCi0gICAqIE5vdGUgdGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB0aGUgc3VwcG9ydGVkIERDVCBzY2FsaW5ncyBhcmUgcG93ZXJzIG9mIDIuCi0gICAqLwotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIGludCBzc2l6ZSA9IGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOwotICAgIHdoaWxlIChzc2l6ZSA8IERDVFNJWkUgJiYKLQkgICAoY29tcHB0ci0+aF9zYW1wX2ZhY3RvciAqIHNzaXplICogMiA8PQotCSAgICBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSkgJiYKLQkgICAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIHNzaXplICogMiA8PQotCSAgICBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgKiBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSkpIHsKLSAgICAgIHNzaXplID0gc3NpemUgKiAyOwotICAgIH0KLSAgICBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUgPSBzc2l6ZTsKLSAgfQotCi0gIC8qIFJlY29tcHV0ZSBkb3duc2FtcGxlZCBkaW1lbnNpb25zIG9mIGNvbXBvbmVudHM7Ci0gICAqIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGtub3cgdGhlc2UgaWYgdXNpbmcgcmF3IGRvd25zYW1wbGVkIGRhdGEuCi0gICAqLwotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIC8qIFNpemUgaW4gc2FtcGxlcywgYWZ0ZXIgSURDVCBzY2FsaW5nICovCi0gICAgY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggPSAoSkRJTUVOU0lPTikKLSAgICAgIGpkaXZfcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5pbWFnZV93aWR0aCAqCi0JCSAgICAobG9uZykgKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpLAotCQkgICAgKGxvbmcpIChjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3IgKiBEQ1RTSVpFKSk7Ci0gICAgY29tcHB0ci0+ZG93bnNhbXBsZWRfaGVpZ2h0ID0gKEpESU1FTlNJT04pCi0gICAgICBqZGl2X3JvdW5kX3VwKChsb25nKSBjaW5mby0+aW1hZ2VfaGVpZ2h0ICoKLQkJICAgIChsb25nKSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSksCi0JCSAgICAobG9uZykgKGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUpKTsKLSAgfQotCi0jZWxzZSAvKiAhSURDVF9TQ0FMSU5HX1NVUFBPUlRFRCAqLwotCi0gIC8qIEhhcmR3aXJlIGl0IHRvICJubyBzY2FsaW5nIiAqLwotICBjaW5mby0+b3V0cHV0X3dpZHRoID0gY2luZm8tPmltYWdlX3dpZHRoOwotICBjaW5mby0+b3V0cHV0X2hlaWdodCA9IGNpbmZvLT5pbWFnZV9oZWlnaHQ7Ci0gIC8qIGpkaW5wdXQuYyBoYXMgYWxyZWFkeSBpbml0aWFsaXplZCBEQ1Rfc2NhbGVkX3NpemUgdG8gRENUU0laRSwKLSAgICogYW5kIGhhcyBjb21wdXRlZCB1bnNjYWxlZCBkb3duc2FtcGxlZF93aWR0aCBhbmQgZG93bnNhbXBsZWRfaGVpZ2h0LgotICAgKi8KLQotI2VuZGlmIC8qIElEQ1RfU0NBTElOR19TVVBQT1JURUQgKi8KLQotICAvKiBSZXBvcnQgbnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gc2VsZWN0ZWQgY29sb3JzcGFjZS4gKi8KLSAgLyogUHJvYmFibHkgdGhpcyBzaG91bGQgYmUgaW4gdGhlIGNvbG9yIGNvbnZlcnNpb24gbW9kdWxlLi4uICovCi0gIHN3aXRjaCAoY2luZm8tPm91dF9jb2xvcl9zcGFjZSkgewotICBjYXNlIEpDU19HUkFZU0NBTEU6Ci0gICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gMTsKLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfUkdCOgotI2lmIFJHQl9QSVhFTFNJWkUgIT0gMwotICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IFJHQl9QSVhFTFNJWkU7Ci0gICAgYnJlYWs7Ci0jZW5kaWYgLyogZWxzZSBzaGFyZSBjb2RlIHdpdGggWUNiQ3IgKi8KLSAgY2FzZSBKQ1NfWUNiQ3I6Ci0gICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gMzsKLSAgICBicmVhazsKLSAgY2FzZSBKQ1NfQ01ZSzoKLSAgY2FzZSBKQ1NfWUNDSzoKLSAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSA0OwotICAgIGJyZWFrOwotICBkZWZhdWx0OgkJCS8qIGVsc2UgbXVzdCBiZSBzYW1lIGNvbG9yc3BhY2UgYXMgaW4gZmlsZSAqLwotICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICBicmVhazsKLSAgfQotICBjaW5mby0+b3V0cHV0X2NvbXBvbmVudHMgPSAoY2luZm8tPnF1YW50aXplX2NvbG9ycyA/IDEgOgotCQkJICAgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzKTsKLQotICAvKiBTZWUgaWYgdXBzYW1wbGVyIHdpbGwgd2FudCB0byBlbWl0IG1vcmUgdGhhbiBvbmUgcm93IGF0IGEgdGltZSAqLwotICBpZiAodXNlX21lcmdlZF91cHNhbXBsZShjaW5mbykpCi0gICAgY2luZm8tPnJlY19vdXRidWZfaGVpZ2h0ID0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOwotICBlbHNlCi0gICAgY2luZm8tPnJlY19vdXRidWZfaGVpZ2h0ID0gMTsKLX0KLQotCi0vKgotICogU2V2ZXJhbCBkZWNvbXByZXNzaW9uIHByb2Nlc3NlcyBuZWVkIHRvIHJhbmdlLWxpbWl0IHZhbHVlcyB0byB0aGUgcmFuZ2UKLSAqIDAuLk1BWEpTQU1QTEU7IHRoZSBpbnB1dCB2YWx1ZSBtYXkgZmFsbCBzb21ld2hhdCBvdXRzaWRlIHRoaXMgcmFuZ2UKLSAqIGR1ZSB0byBub2lzZSBpbnRyb2R1Y2VkIGJ5IHF1YW50aXphdGlvbiwgcm91bmRvZmYgZXJyb3IsIGV0Yy4gIFRoZXNlCi0gKiBwcm9jZXNzZXMgYXJlIGlubmVyIGxvb3BzIGFuZCBuZWVkIHRvIGJlIGFzIGZhc3QgYXMgcG9zc2libGUuICBPbiBtb3N0Ci0gKiBtYWNoaW5lcywgcGFydGljdWxhcmx5IENQVXMgd2l0aCBwaXBlbGluZXMgb3IgaW5zdHJ1Y3Rpb24gcHJlZmV0Y2gsCi0gKiBhIChzdWJzY3JpcHQtY2hlY2stbGVzcykgQyB0YWJsZSBsb29rdXAKLSAqCQl4ID0gc2FtcGxlX3JhbmdlX2xpbWl0W3hdOwotICogaXMgZmFzdGVyIHRoYW4gZXhwbGljaXQgdGVzdHMKLSAqCQlpZiAoeCA8IDApICB4ID0gMDsKLSAqCQllbHNlIGlmICh4ID4gTUFYSlNBTVBMRSkgIHggPSBNQVhKU0FNUExFOwotICogVGhlc2UgcHJvY2Vzc2VzIGFsbCB1c2UgYSBjb21tb24gdGFibGUgcHJlcGFyZWQgYnkgdGhlIHJvdXRpbmUgYmVsb3cuCi0gKgotICogRm9yIG1vc3Qgc3RlcHMgd2UgY2FuIG1hdGhlbWF0aWNhbGx5IGd1YXJhbnRlZSB0aGF0IHRoZSBpbml0aWFsIHZhbHVlCi0gKiBvZiB4IGlzIHdpdGhpbiBNQVhKU0FNUExFKzEgb2YgdGhlIGxlZ2FsIHJhbmdlLCBzbyBhIHRhYmxlIHJ1bm5pbmcgZnJvbQotICogLShNQVhKU0FNUExFKzEpIHRvIDIqTUFYSlNBTVBMRSsxIGlzIHN1ZmZpY2llbnQuICBCdXQgZm9yIHRoZSBpbml0aWFsCi0gKiBsaW1pdGluZyBzdGVwIChqdXN0IGFmdGVyIHRoZSBJRENUKSwgYSB3aWxkbHkgb3V0LW9mLXJhbmdlIHZhbHVlIGlzIAotICogcG9zc2libGUgaWYgdGhlIGlucHV0IGRhdGEgaXMgY29ycnVwdC4gIFRvIGF2b2lkIGFueSBjaGFuY2Ugb2YgaW5kZXhpbmcKLSAqIG9mZiB0aGUgZW5kIG9mIG1lbW9yeSBhbmQgZ2V0dGluZyBhIGJhZC1wb2ludGVyIHRyYXAsIHdlIHBlcmZvcm0gdGhlCi0gKiBwb3N0LUlEQ1QgbGltaXRpbmcgdGh1czoKLSAqCQl4ID0gcmFuZ2VfbGltaXRbeCAmIE1BU0tdOwotICogd2hlcmUgTUFTSyBpcyAyIGJpdHMgd2lkZXIgdGhhbiBsZWdhbCBzYW1wbGUgZGF0YSwgaWUgMTAgYml0cyBmb3IgOC1iaXQKLSAqIHNhbXBsZXMuICBVbmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcyB0aGlzIGlzIG1vcmUgdGhhbiBlbm91Z2ggcmFuZ2UgYW5kCi0gKiBhIGNvcnJlY3Qgb3V0cHV0IHdpbGwgYmUgZ2VuZXJhdGVkOyB3aXRoIGJvZ3VzIGlucHV0IGRhdGEgdGhlIG1hc2sgd2lsbAotICogY2F1c2Ugd3JhcGFyb3VuZCwgYW5kIHdlIHdpbGwgc2FmZWx5IGdlbmVyYXRlIGEgYm9ndXMtYnV0LWluLXJhbmdlIG91dHB1dC4KLSAqIEZvciB0aGUgcG9zdC1JRENUIHN0ZXAsIHdlIHdhbnQgdG8gY29udmVydCB0aGUgZGF0YSBmcm9tIHNpZ25lZCB0byB1bnNpZ25lZAotICogcmVwcmVzZW50YXRpb24gYnkgYWRkaW5nIENFTlRFUkpTQU1QTEUgYXQgdGhlIHNhbWUgdGltZSB0aGF0IHdlIGxpbWl0IGl0LgotICogU28gdGhlIHBvc3QtSURDVCBsaW1pdGluZyB0YWJsZSBlbmRzIHVwIGxvb2tpbmcgbGlrZSB0aGlzOgotICogICBDRU5URVJKU0FNUExFLENFTlRFUkpTQU1QTEUrMSwuLi4sTUFYSlNBTVBMRSwKLSAqICAgTUFYSlNBTVBMRSAocmVwZWF0IDIqKE1BWEpTQU1QTEUrMSktQ0VOVEVSSlNBTVBMRSB0aW1lcyksCi0gKiAgIDAgICAgICAgICAgKHJlcGVhdCAyKihNQVhKU0FNUExFKzEpLUNFTlRFUkpTQU1QTEUgdGltZXMpLAotICogICAwLDEsLi4uLENFTlRFUkpTQU1QTEUtMQotICogTmVnYXRpdmUgaW5wdXRzIHNlbGVjdCB2YWx1ZXMgZnJvbSB0aGUgdXBwZXIgaGFsZiBvZiB0aGUgdGFibGUgYWZ0ZXIKLSAqIG1hc2tpbmcuCi0gKgotICogV2UgY2FuIHNhdmUgc29tZSBzcGFjZSBieSBvdmVybGFwcGluZyB0aGUgc3RhcnQgb2YgdGhlIHBvc3QtSURDVCB0YWJsZQotICogd2l0aCB0aGUgc2ltcGxlciByYW5nZSBsaW1pdGluZyB0YWJsZS4gIFRoZSBwb3N0LUlEQ1QgdGFibGUgYmVnaW5zIGF0Ci0gKiBzYW1wbGVfcmFuZ2VfbGltaXQgKyBDRU5URVJKU0FNUExFLgotICoKLSAqIE5vdGUgdGhhdCB0aGUgdGFibGUgaXMgYWxsb2NhdGVkIGluIG5lYXIgZGF0YSBzcGFjZSBvbiBQQ3M7IGl0J3Mgc21hbGwKLSAqIGVub3VnaCBhbmQgdXNlZCBvZnRlbiBlbm91Z2ggdG8ganVzdGlmeSB0aGlzLgotICovCi0KLUxPQ0FMKHZvaWQpCi1wcmVwYXJlX3JhbmdlX2xpbWl0X3RhYmxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotLyogQWxsb2NhdGUgYW5kIGZpbGwgaW4gdGhlIHNhbXBsZV9yYW5nZV9saW1pdCB0YWJsZSAqLwotewotICBKU0FNUExFICogdGFibGU7Ci0gIGludCBpOwotCi0gIHRhYmxlID0gKEpTQU1QTEUgKikKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkoNSAqIChNQVhKU0FNUExFKzEpICsgQ0VOVEVSSlNBTVBMRSkgKiBTSVpFT0YoSlNBTVBMRSkpOwotICB0YWJsZSArPSAoTUFYSlNBTVBMRSsxKTsJLyogYWxsb3cgbmVnYXRpdmUgc3Vic2NyaXB0cyBvZiBzaW1wbGUgdGFibGUgKi8KLSAgY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdCA9IHRhYmxlOwotICAvKiBGaXJzdCBzZWdtZW50IG9mICJzaW1wbGUiIHRhYmxlOiBsaW1pdFt4XSA9IDAgZm9yIHggPCAwICovCi0gIE1FTVpFUk8odGFibGUgLSAoTUFYSlNBTVBMRSsxKSwgKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoSlNBTVBMRSkpOwotICAvKiBNYWluIHBhcnQgb2YgInNpbXBsZSIgdGFibGU6IGxpbWl0W3hdID0geCAqLwotICBmb3IgKGkgPSAwOyBpIDw9IE1BWEpTQU1QTEU7IGkrKykKLSAgICB0YWJsZVtpXSA9IChKU0FNUExFKSBpOwotICB0YWJsZSArPSBDRU5URVJKU0FNUExFOwkvKiBQb2ludCB0byB3aGVyZSBwb3N0LUlEQ1QgdGFibGUgc3RhcnRzICovCi0gIC8qIEVuZCBvZiBzaW1wbGUgdGFibGUsIHJlc3Qgb2YgZmlyc3QgaGFsZiBvZiBwb3N0LUlEQ1QgdGFibGUgKi8KLSAgZm9yIChpID0gQ0VOVEVSSlNBTVBMRTsgaSA8IDIqKE1BWEpTQU1QTEUrMSk7IGkrKykKLSAgICB0YWJsZVtpXSA9IE1BWEpTQU1QTEU7Ci0gIC8qIFNlY29uZCBoYWxmIG9mIHBvc3QtSURDVCB0YWJsZSAqLwotICBNRU1aRVJPKHRhYmxlICsgKDIgKiAoTUFYSlNBTVBMRSsxKSksCi0JICAoMiAqIChNQVhKU0FNUExFKzEpIC0gQ0VOVEVSSlNBTVBMRSkgKiBTSVpFT0YoSlNBTVBMRSkpOwotICBNRU1DT1BZKHRhYmxlICsgKDQgKiAoTUFYSlNBTVBMRSsxKSAtIENFTlRFUkpTQU1QTEUpLAotCSAgY2luZm8tPnNhbXBsZV9yYW5nZV9saW1pdCwgQ0VOVEVSSlNBTVBMRSAqIFNJWkVPRihKU0FNUExFKSk7Ci19Ci0KLQotLyoKLSAqIE1hc3RlciBzZWxlY3Rpb24gb2YgZGVjb21wcmVzc2lvbiBtb2R1bGVzLgotICogVGhpcyBpcyBkb25lIG9uY2UgYXQganBlZ19zdGFydF9kZWNvbXByZXNzIHRpbWUuICBXZSBkZXRlcm1pbmUKLSAqIHdoaWNoIG1vZHVsZXMgd2lsbCBiZSB1c2VkIGFuZCBnaXZlIHRoZW0gYXBwcm9wcmlhdGUgaW5pdGlhbGl6YXRpb24gY2FsbHMuCi0gKiBXZSBhbHNvIGluaXRpYWxpemUgdGhlIGRlY29tcHJlc3NvciBpbnB1dCBzaWRlIHRvIGJlZ2luIGNvbnN1bWluZyBkYXRhLgotICoKLSAqIFNpbmNlIGpwZWdfcmVhZF9oZWFkZXIgaGFzIGZpbmlzaGVkLCB3ZSBrbm93IHdoYXQgaXMgaW4gdGhlIFNPRgotICogYW5kIChmaXJzdCkgU09TIG1hcmtlcnMuICBXZSBhbHNvIGhhdmUgYWxsIHRoZSBhcHBsaWNhdGlvbiBwYXJhbWV0ZXIKLSAqIHNldHRpbmdzLgotICovCi0KLUxPQ0FMKHZvaWQpCi1tYXN0ZXJfc2VsZWN0aW9uIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOwotICBib29sZWFuIHVzZV9jX2J1ZmZlcjsKLSAgbG9uZyBzYW1wbGVzcGVycm93OwotICBKRElNRU5TSU9OIGpkX3NhbXBsZXNwZXJyb3c7Ci0KLSAgLyogSW5pdGlhbGl6ZSBkaW1lbnNpb25zIGFuZCBvdGhlciBzdHVmZiAqLwotICBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMoY2luZm8pOwotICBwcmVwYXJlX3JhbmdlX2xpbWl0X3RhYmxlKGNpbmZvKTsKLQotICAvKiBXaWR0aCBvZiBhbiBvdXRwdXQgc2NhbmxpbmUgbXVzdCBiZSByZXByZXNlbnRhYmxlIGFzIEpESU1FTlNJT04uICovCi0gIHNhbXBsZXNwZXJyb3cgPSAobG9uZykgY2luZm8tPm91dHB1dF93aWR0aCAqIChsb25nKSBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHM7Ci0gIGpkX3NhbXBsZXNwZXJyb3cgPSAoSkRJTUVOU0lPTikgc2FtcGxlc3BlcnJvdzsKLSAgaWYgKChsb25nKSBqZF9zYW1wbGVzcGVycm93ICE9IHNhbXBsZXNwZXJyb3cpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9XSURUSF9PVkVSRkxPVyk7Ci0KLSAgLyogSW5pdGlhbGl6ZSBteSBwcml2YXRlIHN0YXRlICovCi0gIG1hc3Rlci0+cGFzc19udW1iZXIgPSAwOwotICBtYXN0ZXItPnVzaW5nX21lcmdlZF91cHNhbXBsZSA9IHVzZV9tZXJnZWRfdXBzYW1wbGUoY2luZm8pOwotCi0gIC8qIENvbG9yIHF1YW50aXplciBzZWxlY3Rpb24gKi8KLSAgbWFzdGVyLT5xdWFudGl6ZXJfMXBhc3MgPSBOVUxMOwotICBtYXN0ZXItPnF1YW50aXplcl8ycGFzcyA9IE5VTEw7Ci0gIC8qIE5vIG1vZGUgY2hhbmdlcyBpZiBub3QgdXNpbmcgYnVmZmVyZWQtaW1hZ2UgbW9kZS4gKi8KLSAgaWYgKCEgY2luZm8tPnF1YW50aXplX2NvbG9ycyB8fCAhIGNpbmZvLT5idWZmZXJlZF9pbWFnZSkgewotICAgIGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQgPSBGQUxTRTsKLSAgICBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50ID0gRkFMU0U7Ci0gICAgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA9IEZBTFNFOwotICB9Ci0gIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKSB7Ci0gICAgaWYgKGNpbmZvLT5yYXdfZGF0YV9vdXQpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVElNUEwpOwotICAgIC8qIDItcGFzcyBxdWFudGl6ZXIgb25seSB3b3JrcyBpbiAzLWNvbXBvbmVudCBjb2xvciBzcGFjZS4gKi8KLSAgICBpZiAoY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzICE9IDMpIHsKLSAgICAgIGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQgPSBUUlVFOwotICAgICAgY2luZm8tPmVuYWJsZV9leHRlcm5hbF9xdWFudCA9IEZBTFNFOwotICAgICAgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA9IEZBTFNFOwotICAgICAgY2luZm8tPmNvbG9ybWFwID0gTlVMTDsKLSAgICB9IGVsc2UgaWYgKGNpbmZvLT5jb2xvcm1hcCAhPSBOVUxMKSB7Ci0gICAgICBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50ID0gVFJVRTsKLSAgICB9IGVsc2UgaWYgKGNpbmZvLT50d29fcGFzc19xdWFudGl6ZSkgewotICAgICAgY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCA9IFRSVUU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQgPSBUUlVFOwotICAgIH0KLQotICAgIGlmIChjaW5mby0+ZW5hYmxlXzFwYXNzX3F1YW50KSB7Ci0jaWZkZWYgUVVBTlRfMVBBU1NfU1VQUE9SVEVECi0gICAgICBqaW5pdF8xcGFzc19xdWFudGl6ZXIoY2luZm8pOwotICAgICAgbWFzdGVyLT5xdWFudGl6ZXJfMXBhc3MgPSBjaW5mby0+Y3F1YW50aXplOwotI2Vsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICAgIH0KLQotICAgIC8qIFdlIHVzZSB0aGUgMi1wYXNzIGNvZGUgdG8gbWFwIHRvIGV4dGVybmFsIGNvbG9ybWFwcy4gKi8KLSAgICBpZiAoY2luZm8tPmVuYWJsZV8ycGFzc19xdWFudCB8fCBjaW5mby0+ZW5hYmxlX2V4dGVybmFsX3F1YW50KSB7Ci0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECi0gICAgICBqaW5pdF8ycGFzc19xdWFudGl6ZXIoY2luZm8pOwotICAgICAgbWFzdGVyLT5xdWFudGl6ZXJfMnBhc3MgPSBjaW5mby0+Y3F1YW50aXplOwotI2Vsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICAgIH0KLSAgICAvKiBJZiBib3RoIHF1YW50aXplcnMgYXJlIGluaXRpYWxpemVkLCB0aGUgMi1wYXNzIG9uZSBpcyBsZWZ0IGFjdGl2ZTsKLSAgICAgKiB0aGlzIGlzIG5lY2Vzc2FyeSBmb3Igc3RhcnRpbmcgd2l0aCBxdWFudGl6YXRpb24gdG8gYW4gZXh0ZXJuYWwgbWFwLgotICAgICAqLwotICB9Ci0KLSAgLyogUG9zdC1wcm9jZXNzaW5nOiBpbiBwYXJ0aWN1bGFyLCBjb2xvciBjb252ZXJzaW9uIGZpcnN0ICovCi0gIGlmICghIGNpbmZvLT5yYXdfZGF0YV9vdXQpIHsKLSAgICBpZiAobWFzdGVyLT51c2luZ19tZXJnZWRfdXBzYW1wbGUpIHsKLSNpZmRlZiBVUFNBTVBMRV9NRVJHSU5HX1NVUFBPUlRFRAotICAgICAgamluaXRfbWVyZ2VkX3Vwc2FtcGxlcihjaW5mbyk7IC8qIGRvZXMgY29sb3IgY29udmVyc2lvbiB0b28gKi8KLSNlbHNlCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX05PVF9DT01QSUxFRCk7Ci0jZW5kaWYKLSAgICB9IGVsc2UgewotICAgICAgamluaXRfY29sb3JfZGVjb252ZXJ0ZXIoY2luZm8pOwotICAgICAgamluaXRfdXBzYW1wbGVyKGNpbmZvKTsKLSAgICB9Ci0gICAgamluaXRfZF9wb3N0X2NvbnRyb2xsZXIoY2luZm8sIGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQpOwotICB9Ci0gIC8qIEludmVyc2UgRENUICovCi0gIGppbml0X2ludmVyc2VfZGN0KGNpbmZvKTsKLSAgLyogRW50cm9weSBkZWNvZGluZzogZWl0aGVyIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYyBjb2RpbmcuICovCi0gIGlmIChjaW5mby0+YXJpdGhfY29kZSkgewotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQVJJVEhfTk9USU1QTCk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7Ci0jaWZkZWYgRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgICAgIGppbml0X3BodWZmX2RlY29kZXIoY2luZm8pOwotI2Vsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICAgIH0gZWxzZQotICAgICAgamluaXRfaHVmZl9kZWNvZGVyKGNpbmZvKTsKLSAgfQotCi0gIC8qIEluaXRpYWxpemUgcHJpbmNpcGFsIGJ1ZmZlciBjb250cm9sbGVycy4gKi8KLSAgdXNlX2NfYnVmZmVyID0gY2luZm8tPmlucHV0Y3RsLT5oYXNfbXVsdGlwbGVfc2NhbnMgfHwgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlOwotICBqaW5pdF9kX2NvZWZfY29udHJvbGxlcihjaW5mbywgdXNlX2NfYnVmZmVyKTsKLQotICBpZiAoISBjaW5mby0+cmF3X2RhdGFfb3V0KQotICAgIGppbml0X2RfbWFpbl9jb250cm9sbGVyKGNpbmZvLCBGQUxTRSAvKiBuZXZlciBuZWVkIGZ1bGwgYnVmZmVyIGhlcmUgKi8pOwotCi0gIC8qIFdlIGNhbiBub3cgdGVsbCB0aGUgbWVtb3J5IG1hbmFnZXIgdG8gYWxsb2NhdGUgdmlydHVhbCBhcnJheXMuICovCi0gICgqY2luZm8tPm1lbS0+cmVhbGl6ZV92aXJ0X2FycmF5cykgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLQotICAvKiBJbml0aWFsaXplIGlucHV0IHNpZGUgb2YgZGVjb21wcmVzc29yIHRvIGNvbnN1bWUgZmlyc3Qgc2Nhbi4gKi8KLSAgKCpjaW5mby0+aW5wdXRjdGwtPnN0YXJ0X2lucHV0X3Bhc3MpIChjaW5mbyk7Ci0KLSNpZmRlZiBEX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQKLSAgLyogSWYganBlZ19zdGFydF9kZWNvbXByZXNzIHdpbGwgcmVhZCB0aGUgd2hvbGUgZmlsZSwgaW5pdGlhbGl6ZQotICAgKiBwcm9ncmVzcyBtb25pdG9yaW5nIGFwcHJvcHJpYXRlbHkuICBUaGUgaW5wdXQgc3RlcCBpcyBjb3VudGVkCi0gICAqIGFzIG9uZSBwYXNzLgotICAgKi8KLSAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMICYmICEgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlICYmCi0gICAgICBjaW5mby0+aW5wdXRjdGwtPmhhc19tdWx0aXBsZV9zY2FucykgewotICAgIGludCBuc2NhbnM7Ci0gICAgLyogRXN0aW1hdGUgbnVtYmVyIG9mIHNjYW5zIHRvIHNldCBwYXNzX2xpbWl0LiAqLwotICAgIGlmIChjaW5mby0+cHJvZ3Jlc3NpdmVfbW9kZSkgewotICAgICAgLyogQXJiaXRyYXJpbHkgZXN0aW1hdGUgMiBpbnRlcmxlYXZlZCBEQyBzY2FucyArIDMgQUMgc2NhbnMvY29tcG9uZW50LiAqLwotICAgICAgbnNjYW5zID0gMiArIDMgKiBjaW5mby0+bnVtX2NvbXBvbmVudHM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIEZvciBhIG5vbnByb2dyZXNzaXZlIG11bHRpc2NhbiBmaWxlLCBlc3RpbWF0ZSAxIHNjYW4gcGVyIGNvbXBvbmVudC4gKi8KLSAgICAgIG5zY2FucyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICB9Ci0gICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAwTDsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAqIG5zY2FuczsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPmNvbXBsZXRlZF9wYXNzZXMgPSAwOwotICAgIGNpbmZvLT5wcm9ncmVzcy0+dG90YWxfcGFzc2VzID0gKGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQgPyAzIDogMik7Ci0gICAgLyogQ291bnQgdGhlIGlucHV0IHBhc3MgYXMgZG9uZSAqLwotICAgIG1hc3Rlci0+cGFzc19udW1iZXIrKzsKLSAgfQotI2VuZGlmIC8qIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAqLwotfQotCi0KLS8qCi0gKiBQZXItcGFzcyBzZXR1cC4KLSAqIFRoaXMgaXMgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBvdXRwdXQgcGFzcy4gIFdlIGRldGVybWluZSB3aGljaAotICogbW9kdWxlcyB3aWxsIGJlIGFjdGl2ZSBkdXJpbmcgdGhpcyBwYXNzIGFuZCBnaXZlIHRoZW0gYXBwcm9wcmlhdGUKLSAqIHN0YXJ0X3Bhc3MgY2FsbHMuICBXZSBhbHNvIHNldCBpc19kdW1teV9wYXNzIHRvIGluZGljYXRlIHdoZXRoZXIgdGhpcwotICogaXMgYSAicmVhbCIgb3V0cHV0IHBhc3Mgb3IgYSBkdW1teSBwYXNzIGZvciBjb2xvciBxdWFudGl6YXRpb24uCi0gKiAoSW4gdGhlIGxhdHRlciBjYXNlLCBqZGFwaXN0ZC5jIHdpbGwgY3JhbmsgdGhlIHBhc3MgdG8gY29tcGxldGlvbi4pCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wcmVwYXJlX2Zvcl9vdXRwdXRfcGFzcyAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfbWFzdGVyX3B0ciBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikgY2luZm8tPm1hc3RlcjsKLQotICBpZiAobWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcykgewotI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAotICAgIC8qIEZpbmFsIHBhc3Mgb2YgMi1wYXNzIHF1YW50aXphdGlvbiAqLwotICAgIG1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MgPSBGQUxTRTsKLSAgICAoKmNpbmZvLT5jcXVhbnRpemUtPnN0YXJ0X3Bhc3MpIChjaW5mbywgRkFMU0UpOwotICAgICgqY2luZm8tPnBvc3QtPnN0YXJ0X3Bhc3MpIChjaW5mbywgSkJVRl9DUkFOS19ERVNUKTsKLSAgICAoKmNpbmZvLT5tYWluLT5zdGFydF9wYXNzKSAoY2luZm8sIEpCVUZfQ1JBTktfREVTVCk7Ci0jZWxzZQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZiAvKiBRVUFOVF8yUEFTU19TVVBQT1JURUQgKi8KLSAgfSBlbHNlIHsKLSAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycyAmJiBjaW5mby0+Y29sb3JtYXAgPT0gTlVMTCkgewotICAgICAgLyogU2VsZWN0IG5ldyBxdWFudGl6YXRpb24gbWV0aG9kICovCi0gICAgICBpZiAoY2luZm8tPnR3b19wYXNzX3F1YW50aXplICYmIGNpbmZvLT5lbmFibGVfMnBhc3NfcXVhbnQpIHsKLQljaW5mby0+Y3F1YW50aXplID0gbWFzdGVyLT5xdWFudGl6ZXJfMnBhc3M7Ci0JbWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyA9IFRSVUU7Ci0gICAgICB9IGVsc2UgaWYgKGNpbmZvLT5lbmFibGVfMXBhc3NfcXVhbnQpIHsKLQljaW5mby0+Y3F1YW50aXplID0gbWFzdGVyLT5xdWFudGl6ZXJfMXBhc3M7Ci0gICAgICB9IGVsc2UgewotCUVSUkVYSVQoY2luZm8sIEpFUlJfTU9ERV9DSEFOR0UpOwotICAgICAgfQotICAgIH0KLSAgICAoKmNpbmZvLT5pZGN0LT5zdGFydF9wYXNzKSAoY2luZm8pOwotICAgICgqY2luZm8tPmNvZWYtPnN0YXJ0X291dHB1dF9wYXNzKSAoY2luZm8pOwotICAgIGlmICghIGNpbmZvLT5yYXdfZGF0YV9vdXQpIHsKLSAgICAgIGlmICghIG1hc3Rlci0+dXNpbmdfbWVyZ2VkX3Vwc2FtcGxlKQotCSgqY2luZm8tPmNjb252ZXJ0LT5zdGFydF9wYXNzKSAoY2luZm8pOwotICAgICAgKCpjaW5mby0+dXBzYW1wbGUtPnN0YXJ0X3Bhc3MpIChjaW5mbyk7Ci0gICAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykKLQkoKmNpbmZvLT5jcXVhbnRpemUtPnN0YXJ0X3Bhc3MpIChjaW5mbywgbWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyk7Ci0gICAgICAoKmNpbmZvLT5wb3N0LT5zdGFydF9wYXNzKSAoY2luZm8sCi0JICAgIChtYXN0ZXItPnB1Yi5pc19kdW1teV9wYXNzID8gSkJVRl9TQVZFX0FORF9QQVNTIDogSkJVRl9QQVNTX1RIUlUpKTsKLSAgICAgICgqY2luZm8tPm1haW4tPnN0YXJ0X3Bhc3MpIChjaW5mbywgSkJVRl9QQVNTX1RIUlUpOwotICAgIH0KLSAgfQotCi0gIC8qIFNldCB1cCBwcm9ncmVzcyBtb25pdG9yJ3MgcGFzcyBpbmZvIGlmIHByZXNlbnQgKi8KLSAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMKSB7Ci0gICAgY2luZm8tPnByb2dyZXNzLT5jb21wbGV0ZWRfcGFzc2VzID0gbWFzdGVyLT5wYXNzX251bWJlcjsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPnRvdGFsX3Bhc3NlcyA9IG1hc3Rlci0+cGFzc19udW1iZXIgKwotCQkJCSAgICAobWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyA/IDIgOiAxKTsKLSAgICAvKiBJbiBidWZmZXJlZC1pbWFnZSBtb2RlLCB3ZSBhc3N1bWUgb25lIG1vcmUgb3V0cHV0IHBhc3MgaWYgRU9JIG5vdAotICAgICAqIHlldCByZWFjaGVkLCBidXQgbm8gbW9yZSBwYXNzZXMgaWYgRU9JIGhhcyBiZWVuIHJlYWNoZWQuCi0gICAgICovCi0gICAgaWYgKGNpbmZvLT5idWZmZXJlZF9pbWFnZSAmJiAhIGNpbmZvLT5pbnB1dGN0bC0+ZW9pX3JlYWNoZWQpIHsKLSAgICAgIGNpbmZvLT5wcm9ncmVzcy0+dG90YWxfcGFzc2VzICs9IChjaW5mby0+ZW5hYmxlXzJwYXNzX3F1YW50ID8gMiA6IDEpOwotICAgIH0KLSAgfQotfQotCi0KLS8qCi0gKiBGaW5pc2ggdXAgYXQgZW5kIG9mIGFuIG91dHB1dCBwYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZmluaXNoX291dHB1dF9wYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9tYXN0ZXJfcHRyIG1hc3RlciA9IChteV9tYXN0ZXJfcHRyKSBjaW5mby0+bWFzdGVyOwotCi0gIGlmIChjaW5mby0+cXVhbnRpemVfY29sb3JzKQotICAgICgqY2luZm8tPmNxdWFudGl6ZS0+ZmluaXNoX3Bhc3MpIChjaW5mbyk7Ci0gIG1hc3Rlci0+cGFzc19udW1iZXIrKzsKLX0KLQotCi0jaWZkZWYgRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVECi0KLS8qCi0gKiBTd2l0Y2ggdG8gYSBuZXcgZXh0ZXJuYWwgY29sb3JtYXAgYmV0d2VlbiBvdXRwdXQgcGFzc2VzLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19uZXdfY29sb3JtYXAgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X21hc3Rlcl9wdHIgbWFzdGVyID0gKG15X21hc3Rlcl9wdHIpIGNpbmZvLT5tYXN0ZXI7Ci0KLSAgLyogUHJldmVudCBhcHBsaWNhdGlvbiBmcm9tIGNhbGxpbmcgbWUgYXQgd3JvbmcgdGltZXMgKi8KLSAgaWYgKGNpbmZvLT5nbG9iYWxfc3RhdGUgIT0gRFNUQVRFX0JVRklNQUdFKQotICAgIEVSUkVYSVQxKGNpbmZvLCBKRVJSX0JBRF9TVEFURSwgY2luZm8tPmdsb2JhbF9zdGF0ZSk7Ci0KLSAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMgJiYgY2luZm8tPmVuYWJsZV9leHRlcm5hbF9xdWFudCAmJgotICAgICAgY2luZm8tPmNvbG9ybWFwICE9IE5VTEwpIHsKLSAgICAvKiBTZWxlY3QgMi1wYXNzIHF1YW50aXplciBmb3IgZXh0ZXJuYWwgY29sb3JtYXAgdXNlICovCi0gICAgY2luZm8tPmNxdWFudGl6ZSA9IG1hc3Rlci0+cXVhbnRpemVyXzJwYXNzOwotICAgIC8qIE5vdGlmeSBxdWFudGl6ZXIgb2YgY29sb3JtYXAgY2hhbmdlICovCi0gICAgKCpjaW5mby0+Y3F1YW50aXplLT5uZXdfY29sb3JfbWFwKSAoY2luZm8pOwotICAgIG1hc3Rlci0+cHViLmlzX2R1bW15X3Bhc3MgPSBGQUxTRTsgLyoganVzdCBpbiBjYXNlICovCi0gIH0gZWxzZQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTU9ERV9DSEFOR0UpOwotfQotCi0jZW5kaWYgLyogRF9NVUxUSVNDQU5fRklMRVNfU1VQUE9SVEVEICovCi0KLQotLyoKLSAqIEluaXRpYWxpemUgbWFzdGVyIGRlY29tcHJlc3Npb24gY29udHJvbCBhbmQgc2VsZWN0IGFjdGl2ZSBtb2R1bGVzLgotICogVGhpcyBpcyBwZXJmb3JtZWQgYXQgdGhlIHN0YXJ0IG9mIGpwZWdfc3RhcnRfZGVjb21wcmVzcy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X21hc3Rlcl9kZWNvbXByZXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV9tYXN0ZXJfcHRyIG1hc3RlcjsKLQotICBtYXN0ZXIgPSAobXlfbWFzdGVyX3B0cikKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJICBTSVpFT0YobXlfZGVjb21wX21hc3RlcikpOwotICBjaW5mby0+bWFzdGVyID0gKHN0cnVjdCBqcGVnX2RlY29tcF9tYXN0ZXIgKikgbWFzdGVyOwotICBtYXN0ZXItPnB1Yi5wcmVwYXJlX2Zvcl9vdXRwdXRfcGFzcyA9IHByZXBhcmVfZm9yX291dHB1dF9wYXNzOwotICBtYXN0ZXItPnB1Yi5maW5pc2hfb3V0cHV0X3Bhc3MgPSBmaW5pc2hfb3V0cHV0X3Bhc3M7Ci0KLSAgbWFzdGVyLT5wdWIuaXNfZHVtbXlfcGFzcyA9IEZBTFNFOwotCi0gIG1hc3Rlcl9zZWxlY3Rpb24oY2luZm8pOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkbWVyZ2UuYyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZG1lcmdlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNzVhNTYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkbWVyZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0vKgotICogamRtZXJnZS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgY29kZSBmb3IgbWVyZ2VkIHVwc2FtcGxpbmcvY29sb3IgY29udmVyc2lvbi4KLSAqCi0gKiBUaGlzIGZpbGUgY29tYmluZXMgZnVuY3Rpb25zIGZyb20gamRzYW1wbGUuYyBhbmQgamRjb2xvci5jOwotICogcmVhZCB0aG9zZSBmaWxlcyBmaXJzdCB0byB1bmRlcnN0YW5kIHdoYXQncyBnb2luZyBvbi4KLSAqCi0gKiBXaGVuIHRoZSBjaHJvbWEgY29tcG9uZW50cyBhcmUgdG8gYmUgdXBzYW1wbGVkIGJ5IHNpbXBsZSByZXBsaWNhdGlvbgotICogKGllLCBib3ggZmlsdGVyaW5nKSwgd2UgY2FuIHNhdmUgc29tZSB3b3JrIGluIGNvbG9yIGNvbnZlcnNpb24gYnkKLSAqIGNhbGN1bGF0aW5nIGFsbCB0aGUgb3V0cHV0IHBpeGVscyBjb3JyZXNwb25kaW5nIHRvIGEgcGFpciBvZiBjaHJvbWEKLSAqIHNhbXBsZXMgYXQgb25lIHRpbWUuICBJbiB0aGUgY29udmVyc2lvbiBlcXVhdGlvbnMKLSAqCVIgPSBZICAgICAgICAgICArIEsxICogQ3IKLSAqCUcgPSBZICsgSzIgKiBDYiArIEszICogQ3IKLSAqCUIgPSBZICsgSzQgKiBDYgotICogb25seSB0aGUgWSB0ZXJtIHZhcmllcyBhbW9uZyB0aGUgZ3JvdXAgb2YgcGl4ZWxzIGNvcnJlc3BvbmRpbmcgdG8gYSBwYWlyCi0gKiBvZiBjaHJvbWEgc2FtcGxlcywgc28gdGhlIHJlc3Qgb2YgdGhlIHRlcm1zIGNhbiBiZSBjYWxjdWxhdGVkIGp1c3Qgb25jZS4KLSAqIEF0IHR5cGljYWwgc2FtcGxpbmcgcmF0aW9zLCB0aGlzIGVsaW1pbmF0ZXMgaGFsZiBvciB0aHJlZS1xdWFydGVycyBvZiB0aGUKLSAqIG11bHRpcGxpY2F0aW9ucyBuZWVkZWQgZm9yIGNvbG9yIGNvbnZlcnNpb24uCi0gKgotICogVGhpcyBmaWxlIGN1cnJlbnRseSBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBmb2xsb3dpbmcgY2FzZXM6Ci0gKglZQ2JDciA9PiBSR0IgY29sb3IgY29udmVyc2lvbiBvbmx5LgotICoJU2FtcGxpbmcgcmF0aW9zIG9mIDJoMXYgb3IgMmgydi4KLSAqCU5vIHNjYWxpbmcgbmVlZGVkIGF0IHVwc2FtcGxlIHRpbWUuCi0gKglDb3JuZXItYWxpZ25lZCAobm9uLUNDSVI2MDEpIHNhbXBsaW5nIGFsaWdubWVudC4KLSAqIE90aGVyIHNwZWNpYWwgY2FzZXMgY291bGQgYmUgYWRkZWQsIGJ1dCBpbiBtb3N0IGFwcGxpY2F0aW9ucyB0aGVzZSBhcmUKLSAqIHRoZSBvbmx5IGNvbW1vbiBjYXNlcy4gIChGb3IgdW5jb21tb24gY2FzZXMgd2UgZmFsbCBiYWNrIG9uIHRoZSBtb3JlCi0gKiBnZW5lcmFsIGNvZGUgaW4gamRzYW1wbGUuYyBhbmQgamRjb2xvci5jLikKLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLSNpZmRlZiBVUFNBTVBMRV9NRVJHSU5HX1NVUFBPUlRFRAotCi0vKiBQcml2YXRlIHN1Ym9iamVjdCAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX3Vwc2FtcGxlciBwdWI7CS8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBQb2ludGVyIHRvIHJvdXRpbmUgdG8gZG8gYWN0dWFsIHVwc2FtcGxpbmcvY29udmVyc2lvbiBvZiBvbmUgcm93IGdyb3VwICovCi0gIEpNRVRIT0Qodm9pZCwgdXBtZXRob2QsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwKLQkJCSAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikpOwotCi0gIC8qIFByaXZhdGUgc3RhdGUgZm9yIFlDQy0+UkdCIGNvbnZlcnNpb24gKi8KLSAgaW50ICogQ3Jfcl90YWI7CQkvKiA9PiB0YWJsZSBmb3IgQ3IgdG8gUiBjb252ZXJzaW9uICovCi0gIGludCAqIENiX2JfdGFiOwkJLyogPT4gdGFibGUgZm9yIENiIHRvIEIgY29udmVyc2lvbiAqLwotICBJTlQzMiAqIENyX2dfdGFiOwkJLyogPT4gdGFibGUgZm9yIENyIHRvIEcgY29udmVyc2lvbiAqLwotICBJTlQzMiAqIENiX2dfdGFiOwkJLyogPT4gdGFibGUgZm9yIENiIHRvIEcgY29udmVyc2lvbiAqLwotCi0gIC8qIEZvciAyOjEgdmVydGljYWwgc2FtcGxpbmcsIHdlIHByb2R1Y2UgdHdvIG91dHB1dCByb3dzIGF0IGEgdGltZS4KLSAgICogV2UgbmVlZCBhICJzcGFyZSIgcm93IGJ1ZmZlciB0byBob2xkIHRoZSBzZWNvbmQgb3V0cHV0IHJvdyBpZiB0aGUKLSAgICogYXBwbGljYXRpb24gcHJvdmlkZXMganVzdCBhIG9uZS1yb3cgYnVmZmVyOyB3ZSBhbHNvIHVzZSB0aGUgc3BhcmUKLSAgICogdG8gZGlzY2FyZCB0aGUgZHVtbXkgbGFzdCByb3cgaWYgdGhlIGltYWdlIGhlaWdodCBpcyBvZGQuCi0gICAqLwotICBKU0FNUFJPVyBzcGFyZV9yb3c7Ci0gIGJvb2xlYW4gc3BhcmVfZnVsbDsJCS8qIFQgaWYgc3BhcmUgYnVmZmVyIGlzIG9jY3VwaWVkICovCi0KLSAgSkRJTUVOU0lPTiBvdXRfcm93X3dpZHRoOwkvKiBzYW1wbGVzIHBlciBvdXRwdXQgcm93ICovCi0gIEpESU1FTlNJT04gcm93c190b19nbzsJLyogY291bnRzIHJvd3MgcmVtYWluaW5nIGluIGltYWdlICovCi19IG15X3Vwc2FtcGxlcjsKLQotdHlwZWRlZiBteV91cHNhbXBsZXIgKiBteV91cHNhbXBsZV9wdHI7Ci0KLSNkZWZpbmUgU0NBTEVCSVRTCTE2CS8qIHNwZWVkaWVzdCByaWdodC1zaGlmdCBvbiBzb21lIG1hY2hpbmVzICovCi0jZGVmaW5lIE9ORV9IQUxGCSgoSU5UMzIpIDEgPDwgKFNDQUxFQklUUy0xKSkKLSNkZWZpbmUgRklYKHgpCQkoKElOVDMyKSAoKHgpICogKDFMPDxTQ0FMRUJJVFMpICsgMC41KSkKLQotCi0vKgotICogSW5pdGlhbGl6ZSB0YWJsZXMgZm9yIFlDQy0+UkdCIGNvbG9yc3BhY2UgY29udmVyc2lvbi4KLSAqIFRoaXMgaXMgdGFrZW4gZGlyZWN0bHkgZnJvbSBqZGNvbG9yLmM7IHNlZSB0aGF0IGZpbGUgZm9yIG1vcmUgaW5mby4KLSAqLwotCi1MT0NBTCh2b2lkKQotYnVpbGRfeWNjX3JnYl90YWJsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOwotICBpbnQgaTsKLSAgSU5UMzIgeDsKLSAgU0hJRlRfVEVNUFMKLQotICB1cHNhbXBsZS0+Q3Jfcl90YWIgPSAoaW50ICopCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihpbnQpKTsKLSAgdXBzYW1wbGUtPkNiX2JfdGFiID0gKGludCAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoaW50KSk7Ci0gIHVwc2FtcGxlLT5Dcl9nX3RhYiA9IChJTlQzMiAqKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJKE1BWEpTQU1QTEUrMSkgKiBTSVpFT0YoSU5UMzIpKTsKLSAgdXBzYW1wbGUtPkNiX2dfdGFiID0gKElOVDMyICopCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQkoTUFYSlNBTVBMRSsxKSAqIFNJWkVPRihJTlQzMikpOwotCi0gIGZvciAoaSA9IDAsIHggPSAtQ0VOVEVSSlNBTVBMRTsgaSA8PSBNQVhKU0FNUExFOyBpKyssIHgrKykgewotICAgIC8qIGkgaXMgdGhlIGFjdHVhbCBpbnB1dCBwaXhlbCB2YWx1ZSwgaW4gdGhlIHJhbmdlIDAuLk1BWEpTQU1QTEUgKi8KLSAgICAvKiBUaGUgQ2Igb3IgQ3IgdmFsdWUgd2UgYXJlIHRoaW5raW5nIG9mIGlzIHggPSBpIC0gQ0VOVEVSSlNBTVBMRSAqLwotICAgIC8qIENyPT5SIHZhbHVlIGlzIG5lYXJlc3QgaW50IHRvIDEuNDAyMDAgKiB4ICovCi0gICAgdXBzYW1wbGUtPkNyX3JfdGFiW2ldID0gKGludCkKLQkJICAgIFJJR0hUX1NISUZUKEZJWCgxLjQwMjAwKSAqIHggKyBPTkVfSEFMRiwgU0NBTEVCSVRTKTsKLSAgICAvKiBDYj0+QiB2YWx1ZSBpcyBuZWFyZXN0IGludCB0byAxLjc3MjAwICogeCAqLwotICAgIHVwc2FtcGxlLT5DYl9iX3RhYltpXSA9IChpbnQpCi0JCSAgICBSSUdIVF9TSElGVChGSVgoMS43NzIwMCkgKiB4ICsgT05FX0hBTEYsIFNDQUxFQklUUyk7Ci0gICAgLyogQ3I9PkcgdmFsdWUgaXMgc2NhbGVkLXVwIC0wLjcxNDE0ICogeCAqLwotICAgIHVwc2FtcGxlLT5Dcl9nX3RhYltpXSA9ICgtIEZJWCgwLjcxNDE0KSkgKiB4OwotICAgIC8qIENiPT5HIHZhbHVlIGlzIHNjYWxlZC11cCAtMC4zNDQxNCAqIHggKi8KLSAgICAvKiBXZSBhbHNvIGFkZCBpbiBPTkVfSEFMRiBzbyB0aGF0IG5lZWQgbm90IGRvIGl0IGluIGlubmVyIGxvb3AgKi8KLSAgICB1cHNhbXBsZS0+Q2JfZ190YWJbaV0gPSAoLSBGSVgoMC4zNDQxNCkpICogeCArIE9ORV9IQUxGOwotICB9Ci19Ci0KLQotLyoKLSAqIEluaXRpYWxpemUgZm9yIGFuIHVwc2FtcGxpbmcgcGFzcy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfbWVyZ2VkX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7Ci0KLSAgLyogTWFyayB0aGUgc3BhcmUgYnVmZmVyIGVtcHR5ICovCi0gIHVwc2FtcGxlLT5zcGFyZV9mdWxsID0gRkFMU0U7Ci0gIC8qIEluaXRpYWxpemUgdG90YWwtaGVpZ2h0IGNvdW50ZXIgZm9yIGRldGVjdGluZyBib3R0b20gb2YgaW1hZ2UgKi8KLSAgdXBzYW1wbGUtPnJvd3NfdG9fZ28gPSBjaW5mby0+b3V0cHV0X2hlaWdodDsKLX0KLQotCi0vKgotICogQ29udHJvbCByb3V0aW5lIHRvIGRvIHVwc2FtcGxpbmcgKGFuZCBjb2xvciBjb252ZXJzaW9uKS4KLSAqCi0gKiBUaGUgY29udHJvbCByb3V0aW5lIGp1c3QgaGFuZGxlcyB0aGUgcm93IGJ1ZmZlcmluZyBjb25zaWRlcmF0aW9ucy4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLW1lcmdlZF8ydl91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAotCQkgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAotCQkgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkJICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCi0vKiAyOjEgdmVydGljYWwgc2FtcGxpbmcgY2FzZTogbWF5IG5lZWQgYSBzcGFyZSByb3cuICovCi17Ci0gIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKLSAgSlNBTVBST1cgd29ya19wdHJzWzJdOwotICBKRElNRU5TSU9OIG51bV9yb3dzOwkJLyogbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWQgdG8gY2FsbGVyICovCi0KLSAgaWYgKHVwc2FtcGxlLT5zcGFyZV9mdWxsKSB7Ci0gICAgLyogSWYgd2UgaGF2ZSBhIHNwYXJlIHJvdyBzYXZlZCBmcm9tIGEgcHJldmlvdXMgY3ljbGUsIGp1c3QgcmV0dXJuIGl0LiAqLwotICAgIGpjb3B5X3NhbXBsZV9yb3dzKCYgdXBzYW1wbGUtPnNwYXJlX3JvdywgMCwgb3V0cHV0X2J1ZiArICpvdXRfcm93X2N0ciwgMCwKLQkJICAgICAgMSwgdXBzYW1wbGUtPm91dF9yb3dfd2lkdGgpOwotICAgIG51bV9yb3dzID0gMTsKLSAgICB1cHNhbXBsZS0+c3BhcmVfZnVsbCA9IEZBTFNFOwotICB9IGVsc2UgewotICAgIC8qIEZpZ3VyZSBudW1iZXIgb2Ygcm93cyB0byByZXR1cm4gdG8gY2FsbGVyLiAqLwotICAgIG51bV9yb3dzID0gMjsKLSAgICAvKiBOb3QgbW9yZSB0aGFuIHRoZSBkaXN0YW5jZSB0byB0aGUgZW5kIG9mIHRoZSBpbWFnZS4gKi8KLSAgICBpZiAobnVtX3Jvd3MgPiB1cHNhbXBsZS0+cm93c190b19nbykKLSAgICAgIG51bV9yb3dzID0gdXBzYW1wbGUtPnJvd3NfdG9fZ287Ci0gICAgLyogQW5kIG5vdCBtb3JlIHRoYW4gd2hhdCB0aGUgY2xpZW50IGNhbiBhY2NlcHQ6ICovCi0gICAgb3V0X3Jvd3NfYXZhaWwgLT0gKm91dF9yb3dfY3RyOwotICAgIGlmIChudW1fcm93cyA+IG91dF9yb3dzX2F2YWlsKQotICAgICAgbnVtX3Jvd3MgPSBvdXRfcm93c19hdmFpbDsKLSAgICAvKiBDcmVhdGUgb3V0cHV0IHBvaW50ZXIgYXJyYXkgZm9yIHVwc2FtcGxlci4gKi8KLSAgICB3b3JrX3B0cnNbMF0gPSBvdXRwdXRfYnVmWypvdXRfcm93X2N0cl07Ci0gICAgaWYgKG51bV9yb3dzID4gMSkgewotICAgICAgd29ya19wdHJzWzFdID0gb3V0cHV0X2J1Zlsqb3V0X3Jvd19jdHIgKyAxXTsKLSAgICB9IGVsc2UgewotICAgICAgd29ya19wdHJzWzFdID0gdXBzYW1wbGUtPnNwYXJlX3JvdzsKLSAgICAgIHVwc2FtcGxlLT5zcGFyZV9mdWxsID0gVFJVRTsKLSAgICB9Ci0gICAgLyogTm93IGRvIHRoZSB1cHNhbXBsaW5nLiAqLwotICAgICgqdXBzYW1wbGUtPnVwbWV0aG9kKSAoY2luZm8sIGlucHV0X2J1ZiwgKmluX3Jvd19ncm91cF9jdHIsIHdvcmtfcHRycyk7Ci0gIH0KLQotICAvKiBBZGp1c3QgY291bnRzICovCi0gICpvdXRfcm93X2N0ciArPSBudW1fcm93czsKLSAgdXBzYW1wbGUtPnJvd3NfdG9fZ28gLT0gbnVtX3Jvd3M7Ci0gIC8qIFdoZW4gdGhlIGJ1ZmZlciBpcyBlbXB0aWVkLCBkZWNsYXJlIHRoaXMgaW5wdXQgcm93IGdyb3VwIGNvbnN1bWVkICovCi0gIGlmICghIHVwc2FtcGxlLT5zcGFyZV9mdWxsKQotICAgICgqaW5fcm93X2dyb3VwX2N0cikrKzsKLX0KLQotCi1NRVRIT0RERUYodm9pZCkKLW1lcmdlZF8xdl91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAotCQkgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAotCQkgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkJICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCi0vKiAxOjEgdmVydGljYWwgc2FtcGxpbmcgY2FzZTogbXVjaCBlYXNpZXIsIG5ldmVyIG5lZWQgYSBzcGFyZSByb3cuICovCi17Ci0gIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKLQotICAvKiBKdXN0IGRvIHRoZSB1cHNhbXBsaW5nLiAqLwotICAoKnVwc2FtcGxlLT51cG1ldGhvZCkgKGNpbmZvLCBpbnB1dF9idWYsICppbl9yb3dfZ3JvdXBfY3RyLAotCQkJIG91dHB1dF9idWYgKyAqb3V0X3Jvd19jdHIpOwotICAvKiBBZGp1c3QgY291bnRzICovCi0gICgqb3V0X3Jvd19jdHIpKys7Ci0gICgqaW5fcm93X2dyb3VwX2N0cikrKzsKLX0KLQotCi0vKgotICogVGhlc2UgYXJlIHRoZSByb3V0aW5lcyBpbnZva2VkIGJ5IHRoZSBjb250cm9sIHJvdXRpbmVzIHRvIGRvCi0gKiB0aGUgYWN0dWFsIHVwc2FtcGxpbmcvY29udmVyc2lvbi4gIE9uZSByb3cgZ3JvdXAgaXMgcHJvY2Vzc2VkIHBlciBjYWxsLgotICoKLSAqIE5vdGU6IHNpbmNlIHdlIG1heSBiZSB3cml0aW5nIGRpcmVjdGx5IGludG8gYXBwbGljYXRpb24tc3VwcGxpZWQgYnVmZmVycywKLSAqIHdlIGhhdmUgdG8gYmUgaG9uZXN0IGFib3V0IHRoZSBvdXRwdXQgd2lkdGg7IHdlIGNhbid0IGFzc3VtZSB0aGUgYnVmZmVyCi0gKiBoYXMgYmVlbiByb3VuZGVkIHVwIHRvIGFuIGV2ZW4gd2lkdGguCi0gKi8KLQotCi0vKgotICogVXBzYW1wbGUgYW5kIGNvbG9yIGNvbnZlcnQgZm9yIHRoZSBjYXNlIG9mIDI6MSBob3Jpem9udGFsIGFuZCAxOjEgdmVydGljYWwuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1oMnYxX21lcmdlZF91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJICAgICAgSlNBTVBJTUFHRSBpbnB1dF9idWYsIEpESU1FTlNJT04gaW5fcm93X2dyb3VwX2N0ciwKLQkJICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmKQotewotICBteV91cHNhbXBsZV9wdHIgdXBzYW1wbGUgPSAobXlfdXBzYW1wbGVfcHRyKSBjaW5mby0+dXBzYW1wbGU7Ci0gIHJlZ2lzdGVyIGludCB5LCBjcmVkLCBjZ3JlZW4sIGNibHVlOwotICBpbnQgY2IsIGNyOwotICByZWdpc3RlciBKU0FNUFJPVyBvdXRwdHI7Ci0gIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBpbnB0cjI7Ci0gIEpESU1FTlNJT04gY29sOwotICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCi0gIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7Ci0gIGludCAqIENycnRhYiA9IHVwc2FtcGxlLT5Dcl9yX3RhYjsKLSAgaW50ICogQ2JidGFiID0gdXBzYW1wbGUtPkNiX2JfdGFiOwotICBJTlQzMiAqIENyZ3RhYiA9IHVwc2FtcGxlLT5Dcl9nX3RhYjsKLSAgSU5UMzIgKiBDYmd0YWIgPSB1cHNhbXBsZS0+Q2JfZ190YWI7Ci0gIFNISUZUX1RFTVBTCi0KLSAgaW5wdHIwID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHJdOwotICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5fcm93X2dyb3VwX2N0cl07Ci0gIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgb3V0cHRyID0gb3V0cHV0X2J1ZlswXTsKLSAgLyogTG9vcCBmb3IgZWFjaCBwYWlyIG9mIG91dHB1dCBwaXhlbHMgKi8KLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoID4+IDE7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgLyogRG8gdGhlIGNocm9tYSBwYXJ0IG9mIHRoZSBjYWxjdWxhdGlvbiAqLwotICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOwotICAgIGNyZWQgPSBDcnJ0YWJbY3JdOwotICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOwotICAgIGNibHVlID0gQ2JidGFiW2NiXTsKLSAgICAvKiBGZXRjaCAyIFkgdmFsdWVzIGFuZCBlbWl0IDIgcGl4ZWxzICovCi0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7Ci0gICAgb3V0cHRyW1JHQl9SRURdID0gICByYW5nZV9saW1pdFt5ICsgY3JlZF07Ci0gICAgb3V0cHRyW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKLSAgICBvdXRwdHJbUkdCX0JMVUVdID0gIHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07Ci0gICAgb3V0cHRyICs9IFJHQl9QSVhFTFNJWkU7Ci0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjArKyk7Ci0gICAgb3V0cHRyW1JHQl9SRURdID0gICByYW5nZV9saW1pdFt5ICsgY3JlZF07Ci0gICAgb3V0cHRyW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKLSAgICBvdXRwdHJbUkdCX0JMVUVdID0gIHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07Ci0gICAgb3V0cHRyICs9IFJHQl9QSVhFTFNJWkU7Ci0gIH0KLSAgLyogSWYgaW1hZ2Ugd2lkdGggaXMgb2RkLCBkbyB0aGUgbGFzdCBvdXRwdXQgY29sdW1uIHNlcGFyYXRlbHkgKi8KLSAgaWYgKGNpbmZvLT5vdXRwdXRfd2lkdGggJiAxKSB7Ci0gICAgY2IgPSBHRVRKU0FNUExFKCppbnB0cjEpOwotICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKTsKLSAgICBjcmVkID0gQ3JydGFiW2NyXTsKLSAgICBjZ3JlZW4gPSAoaW50KSBSSUdIVF9TSElGVChDYmd0YWJbY2JdICsgQ3JndGFiW2NyXSwgU0NBTEVCSVRTKTsKLSAgICBjYmx1ZSA9IENiYnRhYltjYl07Ci0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjApOwotICAgIG91dHB0cltSR0JfUkVEXSA9ICAgcmFuZ2VfbGltaXRbeSArIGNyZWRdOwotICAgIG91dHB0cltSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07Ci0gICAgb3V0cHRyW1JHQl9CTFVFXSA9ICByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotICB9Ci19Ci0KLQotLyoKLSAqIFVwc2FtcGxlIGFuZCBjb2xvciBjb252ZXJ0IGZvciB0aGUgY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotaDJ2Ml9tZXJnZWRfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCSAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19ncm91cF9jdHIsCi0JCSAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZikKLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOwotICByZWdpc3RlciBpbnQgeSwgY3JlZCwgY2dyZWVuLCBjYmx1ZTsKLSAgaW50IGNiLCBjcjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgb3V0cHRyMCwgb3V0cHRyMTsKLSAgSlNBTVBST1cgaW5wdHIwMCwgaW5wdHIwMSwgaW5wdHIxLCBpbnB0cjI7Ci0gIEpESU1FTlNJT04gY29sOwotICAvKiBjb3B5IHRoZXNlIHBvaW50ZXJzIGludG8gcmVnaXN0ZXJzIGlmIHBvc3NpYmxlICovCi0gIHJlZ2lzdGVyIEpTQU1QTEUgKiByYW5nZV9saW1pdCA9IGNpbmZvLT5zYW1wbGVfcmFuZ2VfbGltaXQ7Ci0gIGludCAqIENycnRhYiA9IHVwc2FtcGxlLT5Dcl9yX3RhYjsKLSAgaW50ICogQ2JidGFiID0gdXBzYW1wbGUtPkNiX2JfdGFiOwotICBJTlQzMiAqIENyZ3RhYiA9IHVwc2FtcGxlLT5Dcl9nX3RhYjsKLSAgSU5UMzIgKiBDYmd0YWIgPSB1cHNhbXBsZS0+Q2JfZ190YWI7Ci0gIFNISUZUX1RFTVBTCi0KLSAgaW5wdHIwMCA9IGlucHV0X2J1ZlswXVtpbl9yb3dfZ3JvdXBfY3RyKjJdOwotICBpbnB0cjAxID0gaW5wdXRfYnVmWzBdW2luX3Jvd19ncm91cF9jdHIqMiArIDFdOwotICBpbnB0cjEgPSBpbnB1dF9idWZbMV1baW5fcm93X2dyb3VwX2N0cl07Ci0gIGlucHRyMiA9IGlucHV0X2J1ZlsyXVtpbl9yb3dfZ3JvdXBfY3RyXTsKLSAgb3V0cHRyMCA9IG91dHB1dF9idWZbMF07Ci0gIG91dHB0cjEgPSBvdXRwdXRfYnVmWzFdOwotICAvKiBMb29wIGZvciBlYWNoIGdyb3VwIG9mIG91dHB1dCBwaXhlbHMgKi8KLSAgZm9yIChjb2wgPSBjaW5mby0+b3V0cHV0X3dpZHRoID4+IDE7IGNvbCA+IDA7IGNvbC0tKSB7Ci0gICAgLyogRG8gdGhlIGNocm9tYSBwYXJ0IG9mIHRoZSBjYWxjdWxhdGlvbiAqLwotICAgIGNiID0gR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotICAgIGNyID0gR0VUSlNBTVBMRSgqaW5wdHIyKyspOwotICAgIGNyZWQgPSBDcnJ0YWJbY3JdOwotICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOwotICAgIGNibHVlID0gQ2JidGFiW2NiXTsKLSAgICAvKiBGZXRjaCA0IFkgdmFsdWVzIGFuZCBlbWl0IDQgcGl4ZWxzICovCi0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAwKyspOwotICAgIG91dHB0cjBbUkdCX1JFRF0gPSAgIHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKLSAgICBvdXRwdHIwW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKLSAgICBvdXRwdHIwW1JHQl9CTFVFXSA9ICByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotICAgIG91dHB0cjAgKz0gUkdCX1BJWEVMU0laRTsKLSAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDArKyk7Ci0gICAgb3V0cHRyMFtSR0JfUkVEXSA9ICAgcmFuZ2VfbGltaXRbeSArIGNyZWRdOwotICAgIG91dHB0cjBbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOwotICAgIG91dHB0cjBbUkdCX0JMVUVdID0gIHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07Ci0gICAgb3V0cHRyMCArPSBSR0JfUElYRUxTSVpFOwotICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMSsrKTsKLSAgICBvdXRwdHIxW1JHQl9SRURdID0gICByYW5nZV9saW1pdFt5ICsgY3JlZF07Ci0gICAgb3V0cHRyMVtSR0JfR1JFRU5dID0gcmFuZ2VfbGltaXRbeSArIGNncmVlbl07Ci0gICAgb3V0cHRyMVtSR0JfQkxVRV0gPSAgcmFuZ2VfbGltaXRbeSArIGNibHVlXTsKLSAgICBvdXRwdHIxICs9IFJHQl9QSVhFTFNJWkU7Ci0gICAgeSAgPSBHRVRKU0FNUExFKCppbnB0cjAxKyspOwotICAgIG91dHB0cjFbUkdCX1JFRF0gPSAgIHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKLSAgICBvdXRwdHIxW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKLSAgICBvdXRwdHIxW1JHQl9CTFVFXSA9ICByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotICAgIG91dHB0cjEgKz0gUkdCX1BJWEVMU0laRTsKLSAgfQotICAvKiBJZiBpbWFnZSB3aWR0aCBpcyBvZGQsIGRvIHRoZSBsYXN0IG91dHB1dCBjb2x1bW4gc2VwYXJhdGVseSAqLwotICBpZiAoY2luZm8tPm91dHB1dF93aWR0aCAmIDEpIHsKLSAgICBjYiA9IEdFVEpTQU1QTEUoKmlucHRyMSk7Ci0gICAgY3IgPSBHRVRKU0FNUExFKCppbnB0cjIpOwotICAgIGNyZWQgPSBDcnJ0YWJbY3JdOwotICAgIGNncmVlbiA9IChpbnQpIFJJR0hUX1NISUZUKENiZ3RhYltjYl0gKyBDcmd0YWJbY3JdLCBTQ0FMRUJJVFMpOwotICAgIGNibHVlID0gQ2JidGFiW2NiXTsKLSAgICB5ICA9IEdFVEpTQU1QTEUoKmlucHRyMDApOwotICAgIG91dHB0cjBbUkdCX1JFRF0gPSAgIHJhbmdlX2xpbWl0W3kgKyBjcmVkXTsKLSAgICBvdXRwdHIwW1JHQl9HUkVFTl0gPSByYW5nZV9saW1pdFt5ICsgY2dyZWVuXTsKLSAgICBvdXRwdHIwW1JHQl9CTFVFXSA9ICByYW5nZV9saW1pdFt5ICsgY2JsdWVdOwotICAgIHkgID0gR0VUSlNBTVBMRSgqaW5wdHIwMSk7Ci0gICAgb3V0cHRyMVtSR0JfUkVEXSA9ICAgcmFuZ2VfbGltaXRbeSArIGNyZWRdOwotICAgIG91dHB0cjFbUkdCX0dSRUVOXSA9IHJhbmdlX2xpbWl0W3kgKyBjZ3JlZW5dOwotICAgIG91dHB0cjFbUkdCX0JMVUVdID0gIHJhbmdlX2xpbWl0W3kgKyBjYmx1ZV07Ci0gIH0KLX0KLQotCi0vKgotICogTW9kdWxlIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgZm9yIG1lcmdlZCB1cHNhbXBsaW5nL2NvbG9yIGNvbnZlcnNpb24uCi0gKgotICogTkI6IHRoaXMgaXMgY2FsbGVkIHVuZGVyIHRoZSBjb25kaXRpb25zIGRldGVybWluZWQgYnkgdXNlX21lcmdlZF91cHNhbXBsZSgpCi0gKiBpbiBqZG1hc3Rlci5jLiAgVGhhdCByb3V0aW5lIE1VU1QgY29ycmVzcG9uZCB0byB0aGUgYWN0dWFsIGNhcGFiaWxpdGllcwotICogb2YgdGhpcyBtb2R1bGU7IG5vIHNhZmV0eSBjaGVja3MgYXJlIG1hZGUgaGVyZS4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X21lcmdlZF91cHNhbXBsZXIgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZTsKLQotICB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfdXBzYW1wbGVyKSk7Ci0gIGNpbmZvLT51cHNhbXBsZSA9IChzdHJ1Y3QganBlZ191cHNhbXBsZXIgKikgdXBzYW1wbGU7Ci0gIHVwc2FtcGxlLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfbWVyZ2VkX3Vwc2FtcGxlOwotICB1cHNhbXBsZS0+cHViLm5lZWRfY29udGV4dF9yb3dzID0gRkFMU0U7Ci0KLSAgdXBzYW1wbGUtPm91dF9yb3dfd2lkdGggPSBjaW5mby0+b3V0cHV0X3dpZHRoICogY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzOwotCi0gIGlmIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgPT0gMikgewotICAgIHVwc2FtcGxlLT5wdWIudXBzYW1wbGUgPSBtZXJnZWRfMnZfdXBzYW1wbGU7Ci0gICAgdXBzYW1wbGUtPnVwbWV0aG9kID0gaDJ2Ml9tZXJnZWRfdXBzYW1wbGU7Ci0gICAgLyogQWxsb2NhdGUgYSBzcGFyZSByb3cgYnVmZmVyICovCi0gICAgdXBzYW1wbGUtPnNwYXJlX3JvdyA9IChKU0FNUFJPVykKLSAgICAgICgqY2luZm8tPm1lbS0+YWxsb2NfbGFyZ2UpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCShzaXplX3QpICh1cHNhbXBsZS0+b3V0X3Jvd193aWR0aCAqIFNJWkVPRihKU0FNUExFKSkpOwotICB9IGVsc2UgewotICAgIHVwc2FtcGxlLT5wdWIudXBzYW1wbGUgPSBtZXJnZWRfMXZfdXBzYW1wbGU7Ci0gICAgdXBzYW1wbGUtPnVwbWV0aG9kID0gaDJ2MV9tZXJnZWRfdXBzYW1wbGU7Ci0gICAgLyogTm8gc3BhcmUgcm93IG5lZWRlZCAqLwotICAgIHVwc2FtcGxlLT5zcGFyZV9yb3cgPSBOVUxMOwotICB9Ci0KLSAgYnVpbGRfeWNjX3JnYl90YWJsZShjaW5mbyk7Ci19Ci0KLSNlbmRpZiAvKiBVUFNBTVBMRV9NRVJHSU5HX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkcGh1ZmYuYyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZHBodWZmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNjc4MDkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkcGh1ZmYuYworKysgL2Rldi9udWxsCkBAIC0xLDY2OCArMCwwIEBACi0vKgotICogamRwaHVmZi5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgSHVmZm1hbiBlbnRyb3B5IGRlY29kaW5nIHJvdXRpbmVzIGZvciBwcm9ncmVzc2l2ZSBKUEVHLgotICoKLSAqIE11Y2ggb2YgdGhlIGNvbXBsZXhpdHkgaGVyZSBoYXMgdG8gZG8gd2l0aCBzdXBwb3J0aW5nIGlucHV0IHN1c3BlbnNpb24uCi0gKiBJZiB0aGUgZGF0YSBzb3VyY2UgbW9kdWxlIGRlbWFuZHMgc3VzcGVuc2lvbiwgd2Ugd2FudCB0byBiZSBhYmxlIHRvIGJhY2sKLSAqIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBNQ1UuICBUbyBkbyB0aGlzLCB3ZSBjb3B5IHN0YXRlIHZhcmlhYmxlcwotICogaW50byBsb2NhbCB3b3JraW5nIHN0b3JhZ2UsIGFuZCB1cGRhdGUgdGhlbSBiYWNrIHRvIHRoZSBwZXJtYW5lbnQKLSAqIHN0b3JhZ2Ugb25seSB1cG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbiBvZiBhbiBNQ1UuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImpkaHVmZi5oIgkJLyogRGVjbGFyYXRpb25zIHNoYXJlZCB3aXRoIGpkaHVmZi5jICovCi0KLQotI2lmZGVmIERfUFJPR1JFU1NJVkVfU1VQUE9SVEVECi0KLS8qCi0gKiBFeHBhbmRlZCBlbnRyb3B5IGRlY29kZXIgb2JqZWN0IGZvciBwcm9ncmVzc2l2ZSBIdWZmbWFuIGRlY29kaW5nLgotICoKLSAqIFRoZSBzYXZhYmxlX3N0YXRlIHN1YnJlY29yZCBjb250YWlucyBmaWVsZHMgdGhhdCBjaGFuZ2Ugd2l0aGluIGFuIE1DVSwKLSAqIGJ1dCBtdXN0IG5vdCBiZSB1cGRhdGVkIHBlcm1hbmVudGx5IHVudGlsIHdlIGNvbXBsZXRlIHRoZSBNQ1UuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1bnNpZ25lZCBpbnQgRU9CUlVOOwkJCS8qIHJlbWFpbmluZyBFT0JzIGluIEVPQlJVTiAqLwotICBpbnQgbGFzdF9kY192YWxbTUFYX0NPTVBTX0lOX1NDQU5dOwkvKiBsYXN0IERDIGNvZWYgZm9yIGVhY2ggY29tcG9uZW50ICovCi19IHNhdmFibGVfc3RhdGU7Ci0KLS8qIFRoaXMgbWFjcm8gaXMgdG8gd29yayBhcm91bmQgY29tcGlsZXJzIHdpdGggbWlzc2luZyBvciBicm9rZW4KLSAqIHN0cnVjdHVyZSBhc3NpZ25tZW50LiAgWW91J2xsIG5lZWQgdG8gZml4IHRoaXMgY29kZSBpZiB5b3UgaGF2ZQotICogc3VjaCBhIGNvbXBpbGVyIGFuZCB5b3UgY2hhbmdlIE1BWF9DT01QU19JTl9TQ0FOLgotICovCi0KLSNpZm5kZWYgTk9fU1RSVUNUX0FTU0lHTgotI2RlZmluZSBBU1NJR05fU1RBVEUoZGVzdCxzcmMpICAoKGRlc3QpID0gKHNyYykpCi0jZWxzZQotI2lmIE1BWF9DT01QU19JTl9TQ0FOID09IDQKLSNkZWZpbmUgQVNTSUdOX1NUQVRFKGRlc3Qsc3JjKSAgXAotCSgoZGVzdCkuRU9CUlVOID0gKHNyYykuRU9CUlVOLCBcCi0JIChkZXN0KS5sYXN0X2RjX3ZhbFswXSA9IChzcmMpLmxhc3RfZGNfdmFsWzBdLCBcCi0JIChkZXN0KS5sYXN0X2RjX3ZhbFsxXSA9IChzcmMpLmxhc3RfZGNfdmFsWzFdLCBcCi0JIChkZXN0KS5sYXN0X2RjX3ZhbFsyXSA9IChzcmMpLmxhc3RfZGNfdmFsWzJdLCBcCi0JIChkZXN0KS5sYXN0X2RjX3ZhbFszXSA9IChzcmMpLmxhc3RfZGNfdmFsWzNdKQotI2VuZGlmCi0jZW5kaWYKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHN0cnVjdCBqcGVnX2VudHJvcHlfZGVjb2RlciBwdWI7IC8qIHB1YmxpYyBmaWVsZHMgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgYXJlIGxvYWRlZCBpbnRvIGxvY2FsIHZhcmlhYmxlcyBhdCBzdGFydCBvZiBlYWNoIE1DVS4KLSAgICogSW4gY2FzZSBvZiBzdXNwZW5zaW9uLCB3ZSBleGl0IFdJVEhPVVQgdXBkYXRpbmcgdGhlbS4KLSAgICovCi0gIGJpdHJlYWRfcGVybV9zdGF0ZSBiaXRzdGF0ZTsJLyogQml0IGJ1ZmZlciBhdCBzdGFydCBvZiBNQ1UgKi8KLSAgc2F2YWJsZV9zdGF0ZSBzYXZlZDsJCS8qIE90aGVyIHN0YXRlIGF0IHN0YXJ0IG9mIE1DVSAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBhcmUgTk9UIGxvYWRlZCBpbnRvIGxvY2FsIHdvcmtpbmcgc3RhdGUuICovCi0gIHVuc2lnbmVkIGludCByZXN0YXJ0c190b19nbzsJLyogTUNVcyBsZWZ0IGluIHRoaXMgcmVzdGFydCBpbnRlcnZhbCAqLwotCi0gIC8qIFBvaW50ZXJzIHRvIGRlcml2ZWQgdGFibGVzICh0aGVzZSB3b3Jrc3BhY2VzIGhhdmUgaW1hZ2UgbGlmZXNwYW4pICovCi0gIGRfZGVyaXZlZF90YmwgKiBkZXJpdmVkX3RibHNbTlVNX0hVRkZfVEJMU107Ci0KLSAgZF9kZXJpdmVkX3RibCAqIGFjX2Rlcml2ZWRfdGJsOyAvKiBhY3RpdmUgdGFibGUgZHVyaW5nIGFuIEFDIHNjYW4gKi8KLX0gcGh1ZmZfZW50cm9weV9kZWNvZGVyOwotCi10eXBlZGVmIHBodWZmX2VudHJvcHlfZGVjb2RlciAqIHBodWZmX2VudHJvcHlfcHRyOwotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotTUVUSE9EREVGKGJvb2xlYW4pIGRlY29kZV9tY3VfRENfZmlyc3QgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOwotTUVUSE9EREVGKGJvb2xlYW4pIGRlY29kZV9tY3VfQUNfZmlyc3QgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICAgSkJMT0NLUk9XICpNQ1VfZGF0YSkpOwotTUVUSE9EREVGKGJvb2xlYW4pIGRlY29kZV9tY3VfRENfcmVmaW5lIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICAgICBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci1NRVRIT0RERUYoYm9vbGVhbikgZGVjb2RlX21jdV9BQ19yZWZpbmUgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICAgIEpCTE9DS1JPVyAqTUNVX2RhdGEpKTsKLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYSBIdWZmbWFuLWNvbXByZXNzZWQgc2Nhbi4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXN0YXJ0X3Bhc3NfcGh1ZmZfZGVjb2RlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGJvb2xlYW4gaXNfRENfYmFuZCwgYmFkOwotICBpbnQgY2ksIGNvZWZpLCB0Ymw7Ci0gIGludCAqY29lZl9iaXRfcHRyOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLQotICBpc19EQ19iYW5kID0gKGNpbmZvLT5TcyA9PSAwKTsKLQotICAvKiBWYWxpZGF0ZSBzY2FuIHBhcmFtZXRlcnMgKi8KLSAgYmFkID0gRkFMU0U7Ci0gIGlmIChpc19EQ19iYW5kKSB7Ci0gICAgaWYgKGNpbmZvLT5TZSAhPSAwKQotICAgICAgYmFkID0gVFJVRTsKLSAgfSBlbHNlIHsKLSAgICAvKiBuZWVkIG5vdCBjaGVjayBTcy9TZSA8IDAgc2luY2UgdGhleSBjYW1lIGZyb20gdW5zaWduZWQgYnl0ZXMgKi8KLSAgICBpZiAoY2luZm8tPlNzID4gY2luZm8tPlNlIHx8IGNpbmZvLT5TZSA+PSBEQ1RTSVpFMikKLSAgICAgIGJhZCA9IFRSVUU7Ci0gICAgLyogQUMgc2NhbnMgbWF5IGhhdmUgb25seSBvbmUgY29tcG9uZW50ICovCi0gICAgaWYgKGNpbmZvLT5jb21wc19pbl9zY2FuICE9IDEpCi0gICAgICBiYWQgPSBUUlVFOwotICB9Ci0gIGlmIChjaW5mby0+QWggIT0gMCkgewotICAgIC8qIFN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiByZWZpbmVtZW50IHNjYW46IG11c3QgaGF2ZSBBbCA9IEFoLTEuICovCi0gICAgaWYgKGNpbmZvLT5BbCAhPSBjaW5mby0+QWgtMSkKLSAgICAgIGJhZCA9IFRSVUU7Ci0gIH0KLSAgaWYgKGNpbmZvLT5BbCA+IDEzKQkJLyogbmVlZCBub3QgY2hlY2sgZm9yIDwgMCAqLwotICAgIGJhZCA9IFRSVUU7Ci0gIC8qIEFyZ3VhYmx5IHRoZSBtYXhpbXVtIEFsIHZhbHVlIHNob3VsZCBiZSBsZXNzIHRoYW4gMTMgZm9yIDgtYml0IHByZWNpc2lvbiwKLSAgICogYnV0IHRoZSBzcGVjIGRvZXNuJ3Qgc2F5IHNvLCBhbmQgd2UgdHJ5IHRvIGJlIGxpYmVyYWwgYWJvdXQgd2hhdCB3ZQotICAgKiBhY2NlcHQuICBOb3RlOiBsYXJnZSBBbCB2YWx1ZXMgY291bGQgcmVzdWx0IGluIG91dC1vZi1yYW5nZSBEQwotICAgKiBjb2VmZmljaWVudHMgZHVyaW5nIGVhcmx5IHNjYW5zLCBsZWFkaW5nIHRvIGJpemFycmUgZGlzcGxheXMgZHVlIHRvCi0gICAqIG92ZXJmbG93cyBpbiB0aGUgSURDVCBtYXRoLiAgQnV0IHdlIHdvbid0IGNyYXNoLgotICAgKi8KLSAgaWYgKGJhZCkKLSAgICBFUlJFWElUNChjaW5mbywgSkVSUl9CQURfUFJPR1JFU1NJT04sCi0JICAgICBjaW5mby0+U3MsIGNpbmZvLT5TZSwgY2luZm8tPkFoLCBjaW5mby0+QWwpOwotICAvKiBVcGRhdGUgcHJvZ3Jlc3Npb24gc3RhdHVzLCBhbmQgdmVyaWZ5IHRoYXQgc2NhbiBvcmRlciBpcyBsZWdhbC4KLSAgICogTm90ZSB0aGF0IGludGVyLXNjYW4gaW5jb25zaXN0ZW5jaWVzIGFyZSB0cmVhdGVkIGFzIHdhcm5pbmdzCi0gICAqIG5vdCBmYXRhbCBlcnJvcnMgLi4uIG5vdCBjbGVhciBpZiB0aGlzIGlzIHJpZ2h0IHdheSB0byBiZWhhdmUuCi0gICAqLwotICBmb3IgKGNpID0gMDsgY2kgPCBjaW5mby0+Y29tcHNfaW5fc2NhbjsgY2krKykgewotICAgIGludCBjaW5kZXggPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV0tPmNvbXBvbmVudF9pbmRleDsKLSAgICBjb2VmX2JpdF9wdHIgPSAmIGNpbmZvLT5jb2VmX2JpdHNbY2luZGV4XVswXTsKLSAgICBpZiAoIWlzX0RDX2JhbmQgJiYgY29lZl9iaXRfcHRyWzBdIDwgMCkgLyogQUMgd2l0aG91dCBwcmlvciBEQyBzY2FuICovCi0gICAgICBXQVJOTVMyKGNpbmZvLCBKV1JOX0JPR1VTX1BST0dSRVNTSU9OLCBjaW5kZXgsIDApOwotICAgIGZvciAoY29lZmkgPSBjaW5mby0+U3M7IGNvZWZpIDw9IGNpbmZvLT5TZTsgY29lZmkrKykgewotICAgICAgaW50IGV4cGVjdGVkID0gKGNvZWZfYml0X3B0cltjb2VmaV0gPCAwKSA/IDAgOiBjb2VmX2JpdF9wdHJbY29lZmldOwotICAgICAgaWYgKGNpbmZvLT5BaCAhPSBleHBlY3RlZCkKLQlXQVJOTVMyKGNpbmZvLCBKV1JOX0JPR1VTX1BST0dSRVNTSU9OLCBjaW5kZXgsIGNvZWZpKTsKLSAgICAgIGNvZWZfYml0X3B0cltjb2VmaV0gPSBjaW5mby0+QWw7Ci0gICAgfQotICB9Ci0KLSAgLyogU2VsZWN0IE1DVSBkZWNvZGluZyByb3V0aW5lICovCi0gIGlmIChjaW5mby0+QWggPT0gMCkgewotICAgIGlmIChpc19EQ19iYW5kKQotICAgICAgZW50cm9weS0+cHViLmRlY29kZV9tY3UgPSBkZWNvZGVfbWN1X0RDX2ZpcnN0OwotICAgIGVsc2UKLSAgICAgIGVudHJvcHktPnB1Yi5kZWNvZGVfbWN1ID0gZGVjb2RlX21jdV9BQ19maXJzdDsKLSAgfSBlbHNlIHsKLSAgICBpZiAoaXNfRENfYmFuZCkKLSAgICAgIGVudHJvcHktPnB1Yi5kZWNvZGVfbWN1ID0gZGVjb2RlX21jdV9EQ19yZWZpbmU7Ci0gICAgZWxzZQotICAgICAgZW50cm9weS0+cHViLmRlY29kZV9tY3UgPSBkZWNvZGVfbWN1X0FDX3JlZmluZTsKLSAgfQotCi0gIGZvciAoY2kgPSAwOyBjaSA8IGNpbmZvLT5jb21wc19pbl9zY2FuOyBjaSsrKSB7Ci0gICAgY29tcHB0ciA9IGNpbmZvLT5jdXJfY29tcF9pbmZvW2NpXTsKLSAgICAvKiBNYWtlIHN1cmUgcmVxdWVzdGVkIHRhYmxlcyBhcmUgcHJlc2VudCwgYW5kIGNvbXB1dGUgZGVyaXZlZCB0YWJsZXMuCi0gICAgICogV2UgbWF5IGJ1aWxkIHNhbWUgZGVyaXZlZCB0YWJsZSBtb3JlIHRoYW4gb25jZSwgYnV0IGl0J3Mgbm90IGV4cGVuc2l2ZS4KLSAgICAgKi8KLSAgICBpZiAoaXNfRENfYmFuZCkgewotICAgICAgaWYgKGNpbmZvLT5BaCA9PSAwKSB7CS8qIERDIHJlZmluZW1lbnQgbmVlZHMgbm8gdGFibGUgKi8KLQl0YmwgPSBjb21wcHRyLT5kY190Ymxfbm87Ci0JanBlZ19tYWtlX2RfZGVyaXZlZF90YmwoY2luZm8sIFRSVUUsIHRibCwKLQkJCQkmIGVudHJvcHktPmRlcml2ZWRfdGJsc1t0YmxdKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgdGJsID0gY29tcHB0ci0+YWNfdGJsX25vOwotICAgICAganBlZ19tYWtlX2RfZGVyaXZlZF90YmwoY2luZm8sIEZBTFNFLCB0YmwsCi0JCQkgICAgICAmIGVudHJvcHktPmRlcml2ZWRfdGJsc1t0YmxdKTsKLSAgICAgIC8qIHJlbWVtYmVyIHRoZSBzaW5nbGUgYWN0aXZlIHRhYmxlICovCi0gICAgICBlbnRyb3B5LT5hY19kZXJpdmVkX3RibCA9IGVudHJvcHktPmRlcml2ZWRfdGJsc1t0YmxdOwotICAgIH0KLSAgICAvKiBJbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KLSAgICBlbnRyb3B5LT5zYXZlZC5sYXN0X2RjX3ZhbFtjaV0gPSAwOwotICB9Ci0KLSAgLyogSW5pdGlhbGl6ZSBiaXRyZWFkIHN0YXRlIHZhcmlhYmxlcyAqLwotICBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgPSAwOwotICBlbnRyb3B5LT5iaXRzdGF0ZS5nZXRfYnVmZmVyID0gMDsgLyogdW5uZWNlc3NhcnksIGJ1dCBrZWVwcyBQdXJpZnkgcXVpZXQgKi8KLSAgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhID0gRkFMU0U7Ci0KLSAgLyogSW5pdGlhbGl6ZSBwcml2YXRlIHN0YXRlIHZhcmlhYmxlcyAqLwotICBlbnRyb3B5LT5zYXZlZC5FT0JSVU4gPSAwOwotCi0gIC8qIEluaXRpYWxpemUgcmVzdGFydCBjb3VudGVyICovCi0gIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID0gY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWw7Ci19Ci0KLQotLyoKLSAqIEZpZ3VyZSBGLjEyOiBleHRlbmQgc2lnbiBiaXQuCi0gKiBPbiBzb21lIG1hY2hpbmVzLCBhIHNoaWZ0IGFuZCBhZGQgd2lsbCBiZSBmYXN0ZXIgdGhhbiBhIHRhYmxlIGxvb2t1cC4KLSAqLwotCi0jaWZkZWYgQVZPSURfVEFCTEVTCi0KLSNkZWZpbmUgSFVGRl9FWFRFTkQoeCxzKSAgKCh4KSA8ICgxPDwoKHMpLTEpKSA/ICh4KSArICgoKC0xKTw8KHMpKSArIDEpIDogKHgpKQotCi0jZWxzZQotCi0jZGVmaW5lIEhVRkZfRVhURU5EKHgscykgICgoeCkgPCBleHRlbmRfdGVzdFtzXSA/ICh4KSArIGV4dGVuZF9vZmZzZXRbc10gOiAoeCkpCi0KLXN0YXRpYyBjb25zdCBpbnQgZXh0ZW5kX3Rlc3RbMTZdID0gICAvKiBlbnRyeSBuIGlzIDIqKihuLTEpICovCi0gIHsgMCwgMHgwMDAxLCAweDAwMDIsIDB4MDAwNCwgMHgwMDA4LCAweDAwMTAsIDB4MDAyMCwgMHgwMDQwLCAweDAwODAsCi0gICAgMHgwMTAwLCAweDAyMDAsIDB4MDQwMCwgMHgwODAwLCAweDEwMDAsIDB4MjAwMCwgMHg0MDAwIH07Ci0KLXN0YXRpYyBjb25zdCBpbnQgZXh0ZW5kX29mZnNldFsxNl0gPSAvKiBlbnRyeSBuIGlzICgtMSA8PCBuKSArIDEgKi8KLSAgeyAwLCAoKC0xKTw8MSkgKyAxLCAoKC0xKTw8MikgKyAxLCAoKC0xKTw8MykgKyAxLCAoKC0xKTw8NCkgKyAxLAotICAgICgoLTEpPDw1KSArIDEsICgoLTEpPDw2KSArIDEsICgoLTEpPDw3KSArIDEsICgoLTEpPDw4KSArIDEsCi0gICAgKCgtMSk8PDkpICsgMSwgKCgtMSk8PDEwKSArIDEsICgoLTEpPDwxMSkgKyAxLCAoKC0xKTw8MTIpICsgMSwKLSAgICAoKC0xKTw8MTMpICsgMSwgKCgtMSk8PDE0KSArIDEsICgoLTEpPDwxNSkgKyAxIH07Ci0KLSNlbmRpZiAvKiBBVk9JRF9UQUJMRVMgKi8KLQotCi0vKgotICogQ2hlY2sgZm9yIGEgcmVzdGFydCBtYXJrZXIgJiByZXN5bmNocm9uaXplIGRlY29kZXIuCi0gKiBSZXR1cm5zIEZBTFNFIGlmIG11c3Qgc3VzcGVuZC4KLSAqLwotCi1MT0NBTChib29sZWFuKQotcHJvY2Vzc19yZXN0YXJ0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgaW50IGNpOwotCi0gIC8qIFRocm93IGF3YXkgYW55IHVudXNlZCBiaXRzIHJlbWFpbmluZyBpbiBiaXQgYnVmZmVyOyAqLwotICAvKiBpbmNsdWRlIGFueSBmdWxsIGJ5dGVzIGluIG5leHRfbWFya2VyJ3MgY291bnQgb2YgZGlzY2FyZGVkIGJ5dGVzICovCi0gIGNpbmZvLT5tYXJrZXItPmRpc2NhcmRlZF9ieXRlcyArPSBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgLyA4OwotICBlbnRyb3B5LT5iaXRzdGF0ZS5iaXRzX2xlZnQgPSAwOwotCi0gIC8qIEFkdmFuY2UgcGFzdCB0aGUgUlNUbiBtYXJrZXIgKi8KLSAgaWYgKCEgKCpjaW5mby0+bWFya2VyLT5yZWFkX3Jlc3RhcnRfbWFya2VyKSAoY2luZm8pKQotICAgIHJldHVybiBGQUxTRTsKLQotICAvKiBSZS1pbml0aWFsaXplIERDIHByZWRpY3Rpb25zIHRvIDAgKi8KLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPmNvbXBzX2luX3NjYW47IGNpKyspCi0gICAgZW50cm9weS0+c2F2ZWQubGFzdF9kY192YWxbY2ldID0gMDsKLSAgLyogUmUtaW5pdCBFT0IgcnVuIGNvdW50LCB0b28gKi8KLSAgZW50cm9weS0+c2F2ZWQuRU9CUlVOID0gMDsKLQotICAvKiBSZXNldCByZXN0YXJ0IGNvdW50ZXIgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPSBjaW5mby0+cmVzdGFydF9pbnRlcnZhbDsKLQotICAvKiBSZXNldCBvdXQtb2YtZGF0YSBmbGFnLCB1bmxlc3MgcmVhZF9yZXN0YXJ0X21hcmtlciBsZWZ0IHVzIHNtYWNrIHVwCi0gICAqIGFnYWluc3QgYSBtYXJrZXIuICBJbiB0aGF0IGNhc2Ugd2Ugd2lsbCBlbmQgdXAgdHJlYXRpbmcgdGhlIG5leHQgZGF0YQotICAgKiBzZWdtZW50IGFzIGVtcHR5LCBhbmQgd2UgY2FuIGF2b2lkIHByb2R1Y2luZyBib2d1cyBvdXRwdXQgcGl4ZWxzIGJ5Ci0gICAqIGxlYXZpbmcgdGhlIGZsYWcgc2V0LgotICAgKi8KLSAgaWYgKGNpbmZvLT51bnJlYWRfbWFya2VyID09IDApCi0gICAgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhID0gRkFMU0U7Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIEh1ZmZtYW4gTUNVIGRlY29kaW5nLgotICogRWFjaCBvZiB0aGVzZSByb3V0aW5lcyBkZWNvZGVzIGFuZCByZXR1cm5zIG9uZSBNQ1UncyB3b3J0aCBvZgotICogSHVmZm1hbi1jb21wcmVzc2VkIGNvZWZmaWNpZW50cy4gCi0gKiBUaGUgY29lZmZpY2llbnRzIGFyZSByZW9yZGVyZWQgZnJvbSB6aWd6YWcgb3JkZXIgaW50byBuYXR1cmFsIGFycmF5IG9yZGVyLAotICogYnV0IGFyZSBub3QgZGVxdWFudGl6ZWQuCi0gKgotICogVGhlIGkndGggYmxvY2sgb2YgdGhlIE1DVSBpcyBzdG9yZWQgaW50byB0aGUgYmxvY2sgcG9pbnRlZCB0byBieQotICogTUNVX2RhdGFbaV0uICBXRSBBU1NVTUUgVEhJUyBBUkVBIElTIElOSVRJQUxMWSBaRVJPRUQgQlkgVEhFIENBTExFUi4KLSAqCi0gKiBXZSByZXR1cm4gRkFMU0UgaWYgZGF0YSBzb3VyY2UgcmVxdWVzdGVkIHN1c3BlbnNpb24uICBJbiB0aGF0IGNhc2Ugbm8KLSAqIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gcGVybWFuZW50IHN0YXRlLiAgKEV4Y2VwdGlvbjogc29tZSBvdXRwdXQKLSAqIGNvZWZmaWNpZW50cyBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gYXNzaWduZWQuICBUaGlzIGlzIGhhcm1sZXNzIGZvcgotICogc3BlY3RyYWwgc2VsZWN0aW9uLCBzaW5jZSB3ZSdsbCBqdXN0IHJlLWFzc2lnbiB0aGVtIG9uIHRoZSBuZXh0IGNhbGwuCi0gKiBTdWNjZXNzaXZlIGFwcHJveGltYXRpb24gQUMgcmVmaW5lbWVudCBoYXMgdG8gYmUgbW9yZSBjYXJlZnVsLCBob3dldmVyLikKLSAqLwotCi0vKgotICogTUNVIGRlY29kaW5nIGZvciBEQyBpbml0aWFsIHNjYW4gKGVpdGhlciBzcGVjdHJhbCBzZWxlY3Rpb24sCi0gKiBvciBmaXJzdCBwYXNzIG9mIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbikuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1kZWNvZGVfbWN1X0RDX2ZpcnN0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoteyAgIAotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgaW50IEFsID0gY2luZm8tPkFsOwotICByZWdpc3RlciBpbnQgcywgcjsKLSAgaW50IGJsa24sIGNpOwotICBKQkxPQ0tST1cgYmxvY2s7Ci0gIEJJVFJFQURfU1RBVEVfVkFSUzsKLSAgc2F2YWJsZV9zdGF0ZSBzdGF0ZTsKLSAgZF9kZXJpdmVkX3RibCAqIHRibDsKLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHI7Ci0KLSAgLyogUHJvY2VzcyByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQ7IG1heSBoYXZlIHRvIHN1c3BlbmQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCi0gICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQotCXJldHVybiBGQUxTRTsKLSAgfQotCi0gIC8qIElmIHdlJ3ZlIHJ1biBvdXQgb2YgZGF0YSwganVzdCBsZWF2ZSB0aGUgTUNVIHNldCB0byB6ZXJvZXMuCi0gICAqIFRoaXMgd2F5LCB3ZSByZXR1cm4gdW5pZm9ybSBncmF5IGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSBzZWdtZW50LgotICAgKi8KLSAgaWYgKCEgZW50cm9weS0+cHViLmluc3VmZmljaWVudF9kYXRhKSB7Ci0KLSAgICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgKi8KLSAgICBCSVRSRUFEX0xPQURfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotICAgIEFTU0lHTl9TVEFURShzdGF0ZSwgZW50cm9weS0+c2F2ZWQpOwotCi0gICAgLyogT3V0ZXIgbG9vcCBoYW5kbGVzIGVhY2ggYmxvY2sgaW4gdGhlIE1DVSAqLwotCi0gICAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKLSAgICAgIGJsb2NrID0gTUNVX2RhdGFbYmxrbl07Ci0gICAgICBjaSA9IGNpbmZvLT5NQ1VfbWVtYmVyc2hpcFtibGtuXTsKLSAgICAgIGNvbXBwdHIgPSBjaW5mby0+Y3VyX2NvbXBfaW5mb1tjaV07Ci0gICAgICB0YmwgPSBlbnRyb3B5LT5kZXJpdmVkX3RibHNbY29tcHB0ci0+ZGNfdGJsX25vXTsKLQotICAgICAgLyogRGVjb2RlIGEgc2luZ2xlIGJsb2NrJ3Mgd29ydGggb2YgY29lZmZpY2llbnRzICovCi0KLSAgICAgIC8qIFNlY3Rpb24gRi4yLjIuMTogZGVjb2RlIHRoZSBEQyBjb2VmZmljaWVudCBkaWZmZXJlbmNlICovCi0gICAgICBIVUZGX0RFQ09ERShzLCBicl9zdGF0ZSwgdGJsLCByZXR1cm4gRkFMU0UsIGxhYmVsMSk7Ci0gICAgICBpZiAocykgewotCUNIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7Ci0JciA9IEdFVF9CSVRTKHMpOwotCXMgPSBIVUZGX0VYVEVORChyLCBzKTsKLSAgICAgIH0KLQotICAgICAgLyogQ29udmVydCBEQyBkaWZmZXJlbmNlIHRvIGFjdHVhbCB2YWx1ZSwgdXBkYXRlIGxhc3RfZGNfdmFsICovCi0gICAgICBzICs9IHN0YXRlLmxhc3RfZGNfdmFsW2NpXTsKLSAgICAgIHN0YXRlLmxhc3RfZGNfdmFsW2NpXSA9IHM7Ci0gICAgICAvKiBTY2FsZSBhbmQgb3V0cHV0IHRoZSBjb2VmZmljaWVudCAoYXNzdW1lcyBqcGVnX25hdHVyYWxfb3JkZXJbMF09MCkgKi8KLSAgICAgICgqYmxvY2spWzBdID0gKEpDT0VGKSAocyA8PCBBbCk7Ci0gICAgfQotCi0gICAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCi0gICAgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKLSAgICBBU1NJR05fU1RBVEUoZW50cm9weS0+c2F2ZWQsIHN0YXRlKTsKLSAgfQotCi0gIC8qIEFjY291bnQgZm9yIHJlc3RhcnQgaW50ZXJ2YWwgKG5vLW9wIGlmIG5vdCB1c2luZyByZXN0YXJ0cykgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogTUNVIGRlY29kaW5nIGZvciBBQyBpbml0aWFsIHNjYW4gKGVpdGhlciBzcGVjdHJhbCBzZWxlY3Rpb24sCi0gKiBvciBmaXJzdCBwYXNzIG9mIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbikuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1kZWNvZGVfbWN1X0FDX2ZpcnN0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKQoteyAgIAotICBwaHVmZl9lbnRyb3B5X3B0ciBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKSBjaW5mby0+ZW50cm9weTsKLSAgaW50IFNlID0gY2luZm8tPlNlOwotICBpbnQgQWwgPSBjaW5mby0+QWw7Ci0gIHJlZ2lzdGVyIGludCBzLCBrLCByOwotICB1bnNpZ25lZCBpbnQgRU9CUlVOOwotICBKQkxPQ0tST1cgYmxvY2s7Ci0gIEJJVFJFQURfU1RBVEVfVkFSUzsKLSAgZF9kZXJpdmVkX3RibCAqIHRibDsKLQotICAvKiBQcm9jZXNzIHJlc3RhcnQgbWFya2VyIGlmIG5lZWRlZDsgbWF5IGhhdmUgdG8gc3VzcGVuZCAqLwotICBpZiAoY2luZm8tPnJlc3RhcnRfaW50ZXJ2YWwpIHsKLSAgICBpZiAoZW50cm9weS0+cmVzdGFydHNfdG9fZ28gPT0gMCkKLSAgICAgIGlmICghIHByb2Nlc3NfcmVzdGFydChjaW5mbykpCi0JcmV0dXJuIEZBTFNFOwotICB9Ci0KLSAgLyogSWYgd2UndmUgcnVuIG91dCBvZiBkYXRhLCBqdXN0IGxlYXZlIHRoZSBNQ1Ugc2V0IHRvIHplcm9lcy4KLSAgICogVGhpcyB3YXksIHdlIHJldHVybiB1bmlmb3JtIGdyYXkgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHNlZ21lbnQuCi0gICAqLwotICBpZiAoISBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEpIHsKLQotICAgIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZS4KLSAgICAgKiBXZSBjYW4gYXZvaWQgbG9hZGluZy9zYXZpbmcgYml0cmVhZCBzdGF0ZSBpZiBpbiBhbiBFT0IgcnVuLgotICAgICAqLwotICAgIEVPQlJVTiA9IGVudHJvcHktPnNhdmVkLkVPQlJVTjsJLyogb25seSBwYXJ0IG9mIHNhdmVkIHN0YXRlIHdlIG5lZWQgKi8KLQotICAgIC8qIFRoZXJlIGlzIGFsd2F5cyBvbmx5IG9uZSBibG9jayBwZXIgTUNVICovCi0KLSAgICBpZiAoRU9CUlVOID4gMCkJCS8qIGlmIGl0J3MgYSBiYW5kIG9mIHplcm9lcy4uLiAqLwotICAgICAgRU9CUlVOLS07CQkJLyogLi4ucHJvY2VzcyBpdCBub3cgKHdlIGRvIG5vdGhpbmcpICovCi0gICAgZWxzZSB7Ci0gICAgICBCSVRSRUFEX0xPQURfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotICAgICAgYmxvY2sgPSBNQ1VfZGF0YVswXTsKLSAgICAgIHRibCA9IGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsOwotCi0gICAgICBmb3IgKGsgPSBjaW5mby0+U3M7IGsgPD0gU2U7IGsrKykgewotCUhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCB0YmwsIHJldHVybiBGQUxTRSwgbGFiZWwyKTsKLQlyID0gcyA+PiA0OwotCXMgJj0gMTU7Ci0JaWYgKHMpIHsKLQkgIGsgKz0gcjsKLQkgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHMsIHJldHVybiBGQUxTRSk7Ci0JICByID0gR0VUX0JJVFMocyk7Ci0JICBzID0gSFVGRl9FWFRFTkQociwgcyk7Ci0JICAvKiBTY2FsZSBhbmQgb3V0cHV0IGNvZWZmaWNpZW50IGluIG5hdHVyYWwgKGRlemlnemFnZ2VkKSBvcmRlciAqLwotCSAgKCpibG9jaylbanBlZ19uYXR1cmFsX29yZGVyW2tdXSA9IChKQ09FRikgKHMgPDwgQWwpOwotCX0gZWxzZSB7Ci0JICBpZiAociA9PSAxNSkgewkvKiBaUkwgKi8KLQkgICAgayArPSAxNTsJCS8qIHNraXAgMTUgemVyb2VzIGluIGJhbmQgKi8KLQkgIH0gZWxzZSB7CQkvKiBFT0JyLCBydW4gbGVuZ3RoIGlzIDJeciArIGFwcGVuZGVkIGJpdHMgKi8KLQkgICAgRU9CUlVOID0gMSA8PCByOwotCSAgICBpZiAocikgewkJLyogRU9CciwgciA+IDAgKi8KLQkgICAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCByLCByZXR1cm4gRkFMU0UpOwotCSAgICAgIHIgPSBHRVRfQklUUyhyKTsKLQkgICAgICBFT0JSVU4gKz0gcjsKLQkgICAgfQotCSAgICBFT0JSVU4tLTsJCS8qIHRoaXMgYmFuZCBpcyBwcm9jZXNzZWQgYXQgdGhpcyBtb21lbnQgKi8KLQkgICAgYnJlYWs7CQkvKiBmb3JjZSBlbmQtb2YtYmFuZCAqLwotCSAgfQotCX0KLSAgICAgIH0KLQotICAgICAgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKLSAgICB9Ci0KLSAgICAvKiBDb21wbGV0ZWQgTUNVLCBzbyB1cGRhdGUgc3RhdGUgKi8KLSAgICBlbnRyb3B5LT5zYXZlZC5FT0JSVU4gPSBFT0JSVU47CS8qIG9ubHkgcGFydCBvZiBzYXZlZCBzdGF0ZSB3ZSBuZWVkICovCi0gIH0KLQotICAvKiBBY2NvdW50IGZvciByZXN0YXJ0IGludGVydmFsIChuby1vcCBpZiBub3QgdXNpbmcgcmVzdGFydHMpICovCi0gIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07Ci0KLSAgcmV0dXJuIFRSVUU7Ci19Ci0KLQotLyoKLSAqIE1DVSBkZWNvZGluZyBmb3IgREMgc3VjY2Vzc2l2ZSBhcHByb3hpbWF0aW9uIHJlZmluZW1lbnQgc2Nhbi4KLSAqIE5vdGU6IHdlIGFzc3VtZSBzdWNoIHNjYW5zIGNhbiBiZSBtdWx0aS1jb21wb25lbnQsIGFsdGhvdWdoIHRoZSBzcGVjCi0gKiBpcyBub3QgdmVyeSBjbGVhciBvbiB0aGUgcG9pbnQuCi0gKi8KLQotTUVUSE9EREVGKGJvb2xlYW4pCi1kZWNvZGVfbWN1X0RDX3JlZmluZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgSkJMT0NLUk9XICpNQ1VfZGF0YSkKLXsgICAKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weSA9IChwaHVmZl9lbnRyb3B5X3B0cikgY2luZm8tPmVudHJvcHk7Ci0gIGludCBwMSA9IDEgPDwgY2luZm8tPkFsOwkvKiAxIGluIHRoZSBiaXQgcG9zaXRpb24gYmVpbmcgY29kZWQgKi8KLSAgaW50IGJsa247Ci0gIEpCTE9DS1JPVyBibG9jazsKLSAgQklUUkVBRF9TVEFURV9WQVJTOwotCi0gIC8qIFByb2Nlc3MgcmVzdGFydCBtYXJrZXIgaWYgbmVlZGVkOyBtYXkgaGF2ZSB0byBzdXNwZW5kICovCi0gIGlmIChjaW5mby0+cmVzdGFydF9pbnRlcnZhbCkgewotICAgIGlmIChlbnRyb3B5LT5yZXN0YXJ0c190b19nbyA9PSAwKQotICAgICAgaWYgKCEgcHJvY2Vzc19yZXN0YXJ0KGNpbmZvKSkKLQlyZXR1cm4gRkFMU0U7Ci0gIH0KLQotICAvKiBOb3Qgd29ydGggdGhlIGN5Y2xlcyB0byBjaGVjayBpbnN1ZmZpY2llbnRfZGF0YSBoZXJlLAotICAgKiBzaW5jZSB3ZSB3aWxsIG5vdCBjaGFuZ2UgdGhlIGRhdGEgYW55d2F5IGlmIHdlIHJlYWQgemVyb2VzLgotICAgKi8KLQotICAvKiBMb2FkIHVwIHdvcmtpbmcgc3RhdGUgKi8KLSAgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKLQotICAvKiBPdXRlciBsb29wIGhhbmRsZXMgZWFjaCBibG9jayBpbiB0aGUgTUNVICovCi0KLSAgZm9yIChibGtuID0gMDsgYmxrbiA8IGNpbmZvLT5ibG9ja3NfaW5fTUNVOyBibGtuKyspIHsKLSAgICBibG9jayA9IE1DVV9kYXRhW2Jsa25dOwotCi0gICAgLyogRW5jb2RlZCBkYXRhIGlzIHNpbXBseSB0aGUgbmV4dCBiaXQgb2YgdGhlIHR3bydzLWNvbXBsZW1lbnQgREMgdmFsdWUgKi8KLSAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCAxLCByZXR1cm4gRkFMU0UpOwotICAgIGlmIChHRVRfQklUUygxKSkKLSAgICAgICgqYmxvY2spWzBdIHw9IHAxOwotICAgIC8qIE5vdGU6IHNpbmNlIHdlIHVzZSB8PSwgcmVwZWF0aW5nIHRoZSBhc3NpZ25tZW50IGxhdGVyIGlzIHNhZmUgKi8KLSAgfQotCi0gIC8qIENvbXBsZXRlZCBNQ1UsIHNvIHVwZGF0ZSBzdGF0ZSAqLwotICBCSVRSRUFEX1NBVkVfU1RBVEUoY2luZm8sZW50cm9weS0+Yml0c3RhdGUpOwotCi0gIC8qIEFjY291bnQgZm9yIHJlc3RhcnQgaW50ZXJ2YWwgKG5vLW9wIGlmIG5vdCB1c2luZyByZXN0YXJ0cykgKi8KLSAgZW50cm9weS0+cmVzdGFydHNfdG9fZ28tLTsKLQotICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKgotICogTUNVIGRlY29kaW5nIGZvciBBQyBzdWNjZXNzaXZlIGFwcHJveGltYXRpb24gcmVmaW5lbWVudCBzY2FuLgotICovCi0KLU1FVEhPRERFRihib29sZWFuKQotZGVjb2RlX21jdV9BQ19yZWZpbmUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpCTE9DS1JPVyAqTUNVX2RhdGEpCi17ICAgCi0gIHBodWZmX2VudHJvcHlfcHRyIGVudHJvcHkgPSAocGh1ZmZfZW50cm9weV9wdHIpIGNpbmZvLT5lbnRyb3B5OwotICBpbnQgU2UgPSBjaW5mby0+U2U7Ci0gIGludCBwMSA9IDEgPDwgY2luZm8tPkFsOwkvKiAxIGluIHRoZSBiaXQgcG9zaXRpb24gYmVpbmcgY29kZWQgKi8KLSAgaW50IG0xID0gKC0xKSA8PCBjaW5mby0+QWw7CS8qIC0xIGluIHRoZSBiaXQgcG9zaXRpb24gYmVpbmcgY29kZWQgKi8KLSAgcmVnaXN0ZXIgaW50IHMsIGssIHI7Ci0gIHVuc2lnbmVkIGludCBFT0JSVU47Ci0gIEpCTE9DS1JPVyBibG9jazsKLSAgSkNPRUZQVFIgdGhpc2NvZWY7Ci0gIEJJVFJFQURfU1RBVEVfVkFSUzsKLSAgZF9kZXJpdmVkX3RibCAqIHRibDsKLSAgaW50IG51bV9uZXduejsKLSAgaW50IG5ld256X3Bvc1tEQ1RTSVpFMl07Ci0KLSAgLyogUHJvY2VzcyByZXN0YXJ0IG1hcmtlciBpZiBuZWVkZWQ7IG1heSBoYXZlIHRvIHN1c3BlbmQgKi8KLSAgaWYgKGNpbmZvLT5yZXN0YXJ0X2ludGVydmFsKSB7Ci0gICAgaWYgKGVudHJvcHktPnJlc3RhcnRzX3RvX2dvID09IDApCi0gICAgICBpZiAoISBwcm9jZXNzX3Jlc3RhcnQoY2luZm8pKQotCXJldHVybiBGQUxTRTsKLSAgfQotCi0gIC8qIElmIHdlJ3ZlIHJ1biBvdXQgb2YgZGF0YSwgZG9uJ3QgbW9kaWZ5IHRoZSBNQ1UuCi0gICAqLwotICBpZiAoISBlbnRyb3B5LT5wdWIuaW5zdWZmaWNpZW50X2RhdGEpIHsKLQotICAgIC8qIExvYWQgdXAgd29ya2luZyBzdGF0ZSAqLwotICAgIEJJVFJFQURfTE9BRF9TVEFURShjaW5mbyxlbnRyb3B5LT5iaXRzdGF0ZSk7Ci0gICAgRU9CUlVOID0gZW50cm9weS0+c2F2ZWQuRU9CUlVOOyAvKiBvbmx5IHBhcnQgb2Ygc2F2ZWQgc3RhdGUgd2UgbmVlZCAqLwotCi0gICAgLyogVGhlcmUgaXMgYWx3YXlzIG9ubHkgb25lIGJsb2NrIHBlciBNQ1UgKi8KLSAgICBibG9jayA9IE1DVV9kYXRhWzBdOwotICAgIHRibCA9IGVudHJvcHktPmFjX2Rlcml2ZWRfdGJsOwotCi0gICAgLyogSWYgd2UgYXJlIGZvcmNlZCB0byBzdXNwZW5kLCB3ZSBtdXN0IHVuZG8gdGhlIGFzc2lnbm1lbnRzIHRvIGFueSBuZXdseQotICAgICAqIG5vbnplcm8gY29lZmZpY2llbnRzIGluIHRoZSBibG9jaywgYmVjYXVzZSBvdGhlcndpc2Ugd2UnZCBnZXQgY29uZnVzZWQKLSAgICAgKiBuZXh0IHRpbWUgYWJvdXQgd2hpY2ggY29lZmZpY2llbnRzIHdlcmUgYWxyZWFkeSBub256ZXJvLgotICAgICAqIEJ1dCB3ZSBuZWVkIG5vdCB1bmRvIGFkZGl0aW9uIG9mIGJpdHMgdG8gYWxyZWFkeS1ub256ZXJvIGNvZWZmaWNpZW50czsKLSAgICAgKiBpbnN0ZWFkLCB3ZSBjYW4gdGVzdCB0aGUgY3VycmVudCBiaXQgdG8gc2VlIGlmIHdlIGFscmVhZHkgZGlkIGl0LgotICAgICAqLwotICAgIG51bV9uZXdueiA9IDA7Ci0KLSAgICAvKiBpbml0aWFsaXplIGNvZWZmaWNpZW50IGxvb3AgY291bnRlciB0byBzdGFydCBvZiBiYW5kICovCi0gICAgayA9IGNpbmZvLT5TczsKLQotICAgIGlmIChFT0JSVU4gPT0gMCkgewotICAgICAgZm9yICg7IGsgPD0gU2U7IGsrKykgewotCUhVRkZfREVDT0RFKHMsIGJyX3N0YXRlLCB0YmwsIGdvdG8gdW5kb2l0LCBsYWJlbDMpOwotCXIgPSBzID4+IDQ7Ci0JcyAmPSAxNTsKLQlpZiAocykgewotCSAgaWYgKHMgIT0gMSkJCS8qIHNpemUgb2YgbmV3IGNvZWYgc2hvdWxkIGFsd2F5cyBiZSAxICovCi0JICAgIFdBUk5NUyhjaW5mbywgSldSTl9IVUZGX0JBRF9DT0RFKTsKLQkgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIDEsIGdvdG8gdW5kb2l0KTsKLQkgIGlmIChHRVRfQklUUygxKSkKLQkgICAgcyA9IHAxOwkJLyogbmV3bHkgbm9uemVybyBjb2VmIGlzIHBvc2l0aXZlICovCi0JICBlbHNlCi0JICAgIHMgPSBtMTsJCS8qIG5ld2x5IG5vbnplcm8gY29lZiBpcyBuZWdhdGl2ZSAqLwotCX0gZWxzZSB7Ci0JICBpZiAociAhPSAxNSkgewotCSAgICBFT0JSVU4gPSAxIDw8IHI7CS8qIEVPQnIsIHJ1biBsZW5ndGggaXMgMl5yICsgYXBwZW5kZWQgYml0cyAqLwotCSAgICBpZiAocikgewotCSAgICAgIENIRUNLX0JJVF9CVUZGRVIoYnJfc3RhdGUsIHIsIGdvdG8gdW5kb2l0KTsKLQkgICAgICByID0gR0VUX0JJVFMocik7Ci0JICAgICAgRU9CUlVOICs9IHI7Ci0JICAgIH0KLQkgICAgYnJlYWs7CQkvKiByZXN0IG9mIGJsb2NrIGlzIGhhbmRsZWQgYnkgRU9CIGxvZ2ljICovCi0JICB9Ci0JICAvKiBub3RlIHMgPSAwIGZvciBwcm9jZXNzaW5nIFpSTCAqLwotCX0KLQkvKiBBZHZhbmNlIG92ZXIgYWxyZWFkeS1ub256ZXJvIGNvZWZzIGFuZCByIHN0aWxsLXplcm8gY29lZnMsCi0JICogYXBwZW5kaW5nIGNvcnJlY3Rpb24gYml0cyB0byB0aGUgbm9uemVyb2VzLiAgQSBjb3JyZWN0aW9uIGJpdCBpcyAxCi0JICogaWYgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBjb2VmZmljaWVudCBtdXN0IGJlIGluY3JlYXNlZC4KLQkgKi8KLQlkbyB7Ci0JICB0aGlzY29lZiA9ICpibG9jayArIGpwZWdfbmF0dXJhbF9vcmRlcltrXTsKLQkgIGlmICgqdGhpc2NvZWYgIT0gMCkgewotCSAgICBDSEVDS19CSVRfQlVGRkVSKGJyX3N0YXRlLCAxLCBnb3RvIHVuZG9pdCk7Ci0JICAgIGlmIChHRVRfQklUUygxKSkgewotCSAgICAgIGlmICgoKnRoaXNjb2VmICYgcDEpID09IDApIHsgLyogZG8gbm90aGluZyBpZiBhbHJlYWR5IHNldCBpdCAqLwotCQlpZiAoKnRoaXNjb2VmID49IDApCi0JCSAgKnRoaXNjb2VmICs9IHAxOwotCQllbHNlCi0JCSAgKnRoaXNjb2VmICs9IG0xOwotCSAgICAgIH0KLQkgICAgfQotCSAgfSBlbHNlIHsKLQkgICAgaWYgKC0tciA8IDApCi0JICAgICAgYnJlYWs7CQkvKiByZWFjaGVkIHRhcmdldCB6ZXJvIGNvZWZmaWNpZW50ICovCi0JICB9Ci0JICBrKys7Ci0JfSB3aGlsZSAoayA8PSBTZSk7Ci0JaWYgKHMpIHsKLQkgIGludCBwb3MgPSBqcGVnX25hdHVyYWxfb3JkZXJba107Ci0JICAvKiBPdXRwdXQgbmV3bHkgbm9uemVybyBjb2VmZmljaWVudCAqLwotCSAgKCpibG9jaylbcG9zXSA9IChKQ09FRikgczsKLQkgIC8qIFJlbWVtYmVyIGl0cyBwb3NpdGlvbiBpbiBjYXNlIHdlIGhhdmUgdG8gc3VzcGVuZCAqLwotCSAgbmV3bnpfcG9zW251bV9uZXdueisrXSA9IHBvczsKLQl9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKEVPQlJVTiA+IDApIHsKLSAgICAgIC8qIFNjYW4gYW55IHJlbWFpbmluZyBjb2VmZmljaWVudCBwb3NpdGlvbnMgYWZ0ZXIgdGhlIGVuZC1vZi1iYW5kCi0gICAgICAgKiAodGhlIGxhc3QgbmV3bHkgbm9uemVybyBjb2VmZmljaWVudCwgaWYgYW55KS4gIEFwcGVuZCBhIGNvcnJlY3Rpb24KLSAgICAgICAqIGJpdCB0byBlYWNoIGFscmVhZHktbm9uemVybyBjb2VmZmljaWVudC4gIEEgY29ycmVjdGlvbiBiaXQgaXMgMQotICAgICAgICogaWYgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBjb2VmZmljaWVudCBtdXN0IGJlIGluY3JlYXNlZC4KLSAgICAgICAqLwotICAgICAgZm9yICg7IGsgPD0gU2U7IGsrKykgewotCXRoaXNjb2VmID0gKmJsb2NrICsganBlZ19uYXR1cmFsX29yZGVyW2tdOwotCWlmICgqdGhpc2NvZWYgIT0gMCkgewotCSAgQ0hFQ0tfQklUX0JVRkZFUihicl9zdGF0ZSwgMSwgZ290byB1bmRvaXQpOwotCSAgaWYgKEdFVF9CSVRTKDEpKSB7Ci0JICAgIGlmICgoKnRoaXNjb2VmICYgcDEpID09IDApIHsgLyogZG8gbm90aGluZyBpZiBhbHJlYWR5IGNoYW5nZWQgaXQgKi8KLQkgICAgICBpZiAoKnRoaXNjb2VmID49IDApCi0JCSp0aGlzY29lZiArPSBwMTsKLQkgICAgICBlbHNlCi0JCSp0aGlzY29lZiArPSBtMTsKLQkgICAgfQotCSAgfQotCX0KLSAgICAgIH0KLSAgICAgIC8qIENvdW50IG9uZSBibG9jayBjb21wbGV0ZWQgaW4gRU9CIHJ1biAqLwotICAgICAgRU9CUlVOLS07Ci0gICAgfQotCi0gICAgLyogQ29tcGxldGVkIE1DVSwgc28gdXBkYXRlIHN0YXRlICovCi0gICAgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvLGVudHJvcHktPmJpdHN0YXRlKTsKLSAgICBlbnRyb3B5LT5zYXZlZC5FT0JSVU4gPSBFT0JSVU47IC8qIG9ubHkgcGFydCBvZiBzYXZlZCBzdGF0ZSB3ZSBuZWVkICovCi0gIH0KLQotICAvKiBBY2NvdW50IGZvciByZXN0YXJ0IGludGVydmFsIChuby1vcCBpZiBub3QgdXNpbmcgcmVzdGFydHMpICovCi0gIGVudHJvcHktPnJlc3RhcnRzX3RvX2dvLS07Ci0KLSAgcmV0dXJuIFRSVUU7Ci0KLXVuZG9pdDoKLSAgLyogUmUtemVybyBhbnkgb3V0cHV0IGNvZWZmaWNpZW50cyB0aGF0IHdlIG1hZGUgbmV3bHkgbm9uemVybyAqLwotICB3aGlsZSAobnVtX25ld256ID4gMCkKLSAgICAoKmJsb2NrKVtuZXduel9wb3NbLS1udW1fbmV3bnpdXSA9IDA7Ci0KLSAgcmV0dXJuIEZBTFNFOwotfQotCi0KLS8qCi0gKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgcHJvZ3Jlc3NpdmUgSHVmZm1hbiBlbnRyb3B5IGRlY29kaW5nLgotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfcGh1ZmZfZGVjb2RlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgcGh1ZmZfZW50cm9weV9wdHIgZW50cm9weTsKLSAgaW50ICpjb2VmX2JpdF9wdHI7Ci0gIGludCBjaSwgaTsKLQotICBlbnRyb3B5ID0gKHBodWZmX2VudHJvcHlfcHRyKQotICAgICgqY2luZm8tPm1lbS0+YWxsb2Nfc21hbGwpICgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JCQkJU0laRU9GKHBodWZmX2VudHJvcHlfZGVjb2RlcikpOwotICBjaW5mby0+ZW50cm9weSA9IChzdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgKikgZW50cm9weTsKLSAgZW50cm9weS0+cHViLnN0YXJ0X3Bhc3MgPSBzdGFydF9wYXNzX3BodWZmX2RlY29kZXI7Ci0KLSAgLyogTWFyayBkZXJpdmVkIHRhYmxlcyB1bmFsbG9jYXRlZCAqLwotICBmb3IgKGkgPSAwOyBpIDwgTlVNX0hVRkZfVEJMUzsgaSsrKSB7Ci0gICAgZW50cm9weS0+ZGVyaXZlZF90YmxzW2ldID0gTlVMTDsKLSAgfQotCi0gIC8qIENyZWF0ZSBwcm9ncmVzc2lvbiBzdGF0dXMgdGFibGUgKi8KLSAgY2luZm8tPmNvZWZfYml0cyA9IChpbnQgKCopW0RDVFNJWkUyXSkKLSAgICAoKmNpbmZvLT5tZW0tPmFsbG9jX3NtYWxsKSAoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCWNpbmZvLT5udW1fY29tcG9uZW50cypEQ1RTSVpFMipTSVpFT0YoaW50KSk7Ci0gIGNvZWZfYml0X3B0ciA9ICYgY2luZm8tPmNvZWZfYml0c1swXVswXTsKLSAgZm9yIChjaSA9IDA7IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOyBjaSsrKSAKLSAgICBmb3IgKGkgPSAwOyBpIDwgRENUU0laRTI7IGkrKykKLSAgICAgICpjb2VmX2JpdF9wdHIrKyA9IC0xOwotfQotCi0jZW5kaWYgLyogRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZHBvc3RjdC5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkcG9zdGN0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MTU2M2QuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkcG9zdGN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLyoKLSAqIGpkcG9zdGN0LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjb21wcmVzc2lvbiBwb3N0cHJvY2Vzc2luZyBjb250cm9sbGVyLgotICogVGhpcyBjb250cm9sbGVyIG1hbmFnZXMgdGhlIHVwc2FtcGxpbmcsIGNvbG9yIGNvbnZlcnNpb24sIGFuZCBjb2xvcgotICogcXVhbnRpemF0aW9uL3JlZHVjdGlvbiBzdGVwczsgc3BlY2lmaWNhbGx5LCBpdCBjb250cm9scyB0aGUgYnVmZmVyaW5nCi0gKiBiZXR3ZWVuIHVwc2FtcGxlL2NvbG9yIGNvbnZlcnNpb24gYW5kIGNvbG9yIHF1YW50aXphdGlvbi9yZWR1Y3Rpb24uCi0gKgotICogSWYgbm8gY29sb3IgcXVhbnRpemF0aW9uL3JlZHVjdGlvbiBpcyByZXF1aXJlZCwgdGhlbiB0aGlzIG1vZHVsZSBoYXMgbm8KLSAqIHdvcmsgdG8gZG8sIGFuZCBpdCBqdXN0IGhhbmRzIG9mZiB0byB0aGUgdXBzYW1wbGUvY29sb3IgY29udmVyc2lvbiBjb2RlLgotICogQW4gaW50ZWdyYXRlZCB1cHNhbXBsZS9jb252ZXJ0L3F1YW50aXplIHByb2Nlc3Mgd291bGQgcmVwbGFjZSB0aGlzIG1vZHVsZQotICogZW50aXJlbHkuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotCi0KLS8qIFByaXZhdGUgYnVmZmVyIGNvbnRyb2xsZXIgb2JqZWN0ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfZF9wb3N0X2NvbnRyb2xsZXIgcHViOyAvKiBwdWJsaWMgZmllbGRzICovCi0KLSAgLyogQ29sb3IgcXVhbnRpemF0aW9uIHNvdXJjZSBidWZmZXI6IHRoaXMgaG9sZHMgb3V0cHV0IGRhdGEgZnJvbQotICAgKiB0aGUgdXBzYW1wbGUvY29sb3IgY29udmVyc2lvbiBzdGVwIHRvIGJlIHBhc3NlZCB0byB0aGUgcXVhbnRpemVyLgotICAgKiBGb3IgdHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uLCB3ZSBuZWVkIGEgZnVsbC1pbWFnZSBidWZmZXI7Ci0gICAqIGZvciBvbmUtcGFzcyBvcGVyYXRpb24sIGEgc3RyaXAgYnVmZmVyIGlzIHN1ZmZpY2llbnQuCi0gICAqLwotICBqdmlydF9zYXJyYXlfcHRyIHdob2xlX2ltYWdlOwkvKiB2aXJ0dWFsIGFycmF5LCBvciBOVUxMIGlmIG9uZS1wYXNzICovCi0gIEpTQU1QQVJSQVkgYnVmZmVyOwkJLyogc3RyaXAgYnVmZmVyLCBvciBjdXJyZW50IHN0cmlwIG9mIHZpcnR1YWwgKi8KLSAgSkRJTUVOU0lPTiBzdHJpcF9oZWlnaHQ7CS8qIGJ1ZmZlciBzaXplIGluIHJvd3MgKi8KLSAgLyogZm9yIHR3by1wYXNzIG1vZGUgb25seTogKi8KLSAgSkRJTUVOU0lPTiBzdGFydGluZ19yb3c7CS8qIHJvdyAjIG9mIGZpcnN0IHJvdyBpbiBjdXJyZW50IHN0cmlwICovCi0gIEpESU1FTlNJT04gbmV4dF9yb3c7CQkvKiBpbmRleCBvZiBuZXh0IHJvdyB0byBmaWxsL2VtcHR5IGluIHN0cmlwICovCi19IG15X3Bvc3RfY29udHJvbGxlcjsKLQotdHlwZWRlZiBteV9wb3N0X2NvbnRyb2xsZXIgKiBteV9wb3N0X3B0cjsKLQotCi0vKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLwotTUVUSE9EREVGKHZvaWQpIHBvc3RfcHJvY2Vzc18xcGFzcwotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAotCSAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAotCSAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkgICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKLSNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKLU1FVEhPRERFRih2b2lkKSBwb3N0X3Byb2Nlc3NfcHJlcGFzcwotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAotCSAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAotCSAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkgICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKLU1FVEhPRERFRih2b2lkKSBwb3N0X3Byb2Nlc3NfMnBhc3MKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKLQkgICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKLQkgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCi0JICAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7Ci0jZW5kaWYKLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYSBwcm9jZXNzaW5nIHBhc3MuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zdGFydF9wYXNzX2Rwb3N0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkKLXsKLSAgbXlfcG9zdF9wdHIgcG9zdCA9IChteV9wb3N0X3B0cikgY2luZm8tPnBvc3Q7Ci0KLSAgc3dpdGNoIChwYXNzX21vZGUpIHsKLSAgY2FzZSBKQlVGX1BBU1NfVEhSVToKLSAgICBpZiAoY2luZm8tPnF1YW50aXplX2NvbG9ycykgewotICAgICAgLyogU2luZ2xlLXBhc3MgcHJvY2Vzc2luZyB3aXRoIGNvbG9yIHF1YW50aXphdGlvbi4gKi8KLSAgICAgIHBvc3QtPnB1Yi5wb3N0X3Byb2Nlc3NfZGF0YSA9IHBvc3RfcHJvY2Vzc18xcGFzczsKLSAgICAgIC8qIFdlIGNvdWxkIGJlIGRvaW5nIGJ1ZmZlcmVkLWltYWdlIG91dHB1dCBiZWZvcmUgc3RhcnRpbmcgYSAyLXBhc3MKLSAgICAgICAqIGNvbG9yIHF1YW50aXphdGlvbjsgaW4gdGhhdCBjYXNlLCBqaW5pdF9kX3Bvc3RfY29udHJvbGxlciBkaWQgbm90Ci0gICAgICAgKiBhbGxvY2F0ZSBhIHN0cmlwIGJ1ZmZlci4gIFVzZSB0aGUgdmlydHVhbC1hcnJheSBidWZmZXIgYXMgd29ya3NwYWNlLgotICAgICAgICovCi0gICAgICBpZiAocG9zdC0+YnVmZmVyID09IE5VTEwpIHsKLQlwb3N0LT5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLQkgICgoal9jb21tb25fcHRyKSBjaW5mbywgcG9zdC0+d2hvbGVfaW1hZ2UsCi0JICAgKEpESU1FTlNJT04pIDAsIHBvc3QtPnN0cmlwX2hlaWdodCwgVFJVRSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIEZvciBzaW5nbGUtcGFzcyBwcm9jZXNzaW5nIHdpdGhvdXQgY29sb3IgcXVhbnRpemF0aW9uLAotICAgICAgICogSSBoYXZlIG5vIHdvcmsgdG8gZG87IGp1c3QgY2FsbCB0aGUgdXBzYW1wbGVyIGRpcmVjdGx5LgotICAgICAgICovCi0gICAgICBwb3N0LT5wdWIucG9zdF9wcm9jZXNzX2RhdGEgPSBjaW5mby0+dXBzYW1wbGUtPnVwc2FtcGxlOwotICAgIH0KLSAgICBicmVhazsKLSNpZmRlZiBRVUFOVF8yUEFTU19TVVBQT1JURUQKLSAgY2FzZSBKQlVGX1NBVkVfQU5EX1BBU1M6Ci0gICAgLyogRmlyc3QgcGFzcyBvZiAyLXBhc3MgcXVhbnRpemF0aW9uICovCi0gICAgaWYgKHBvc3QtPndob2xlX2ltYWdlID09IE5VTEwpCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9CVUZGRVJfTU9ERSk7Ci0gICAgcG9zdC0+cHViLnBvc3RfcHJvY2Vzc19kYXRhID0gcG9zdF9wcm9jZXNzX3ByZXBhc3M7Ci0gICAgYnJlYWs7Ci0gIGNhc2UgSkJVRl9DUkFOS19ERVNUOgotICAgIC8qIFNlY29uZCBwYXNzIG9mIDItcGFzcyBxdWFudGl6YXRpb24gKi8KLSAgICBpZiAocG9zdC0+d2hvbGVfaW1hZ2UgPT0gTlVMTCkKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX0JVRkZFUl9NT0RFKTsKLSAgICBwb3N0LT5wdWIucG9zdF9wcm9jZXNzX2RhdGEgPSBwb3N0X3Byb2Nlc3NfMnBhc3M7Ci0gICAgYnJlYWs7Ci0jZW5kaWYgLyogUVVBTlRfMlBBU1NfU1VQUE9SVEVEICovCi0gIGRlZmF1bHQ6Ci0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotICAgIGJyZWFrOwotICB9Ci0gIHBvc3QtPnN0YXJ0aW5nX3JvdyA9IHBvc3QtPm5leHRfcm93ID0gMDsKLX0KLQotCi0vKgotICogUHJvY2VzcyBzb21lIGRhdGEgaW4gdGhlIG9uZS1wYXNzIChzdHJpcCBidWZmZXIpIGNhc2UuCi0gKiBUaGlzIGlzIHVzZWQgZm9yIGNvbG9yIHByZWNpc2lvbiByZWR1Y3Rpb24gYXMgd2VsbCBhcyBvbmUtcGFzcyBxdWFudGl6YXRpb24uCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wb3N0X3Byb2Nlc3NfMXBhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCSAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKLQkJICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKLQkJICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCi0JCSAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQotewotICBteV9wb3N0X3B0ciBwb3N0ID0gKG15X3Bvc3RfcHRyKSBjaW5mby0+cG9zdDsKLSAgSkRJTUVOU0lPTiBudW1fcm93cywgbWF4X3Jvd3M7Ci0KLSAgLyogRmlsbCB0aGUgYnVmZmVyLCBidXQgbm90IG1vcmUgdGhhbiB3aGF0IHdlIGNhbiBkdW1wIG91dCBpbiBvbmUgZ28uICovCi0gIC8qIE5vdGUgd2UgcmVseSBvbiB0aGUgdXBzYW1wbGVyIHRvIGRldGVjdCBib3R0b20gb2YgaW1hZ2UuICovCi0gIG1heF9yb3dzID0gb3V0X3Jvd3NfYXZhaWwgLSAqb3V0X3Jvd19jdHI7Ci0gIGlmIChtYXhfcm93cyA+IHBvc3QtPnN0cmlwX2hlaWdodCkKLSAgICBtYXhfcm93cyA9IHBvc3QtPnN0cmlwX2hlaWdodDsKLSAgbnVtX3Jvd3MgPSAwOwotICAoKmNpbmZvLT51cHNhbXBsZS0+dXBzYW1wbGUpIChjaW5mbywKLQkJaW5wdXRfYnVmLCBpbl9yb3dfZ3JvdXBfY3RyLCBpbl9yb3dfZ3JvdXBzX2F2YWlsLAotCQlwb3N0LT5idWZmZXIsICZudW1fcm93cywgbWF4X3Jvd3MpOwotICAvKiBRdWFudGl6ZSBhbmQgZW1pdCBkYXRhLiAqLwotICAoKmNpbmZvLT5jcXVhbnRpemUtPmNvbG9yX3F1YW50aXplKSAoY2luZm8sCi0JCXBvc3QtPmJ1ZmZlciwgb3V0cHV0X2J1ZiArICpvdXRfcm93X2N0ciwgKGludCkgbnVtX3Jvd3MpOwotICAqb3V0X3Jvd19jdHIgKz0gbnVtX3Jvd3M7Ci19Ci0KLQotI2lmZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAotCi0vKgotICogUHJvY2VzcyBzb21lIGRhdGEgaW4gdGhlIGZpcnN0IHBhc3Mgb2YgMi1wYXNzIHF1YW50aXphdGlvbi4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXBvc3RfcHJvY2Vzc19wcmVwYXNzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkgICAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKLQkJICAgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAotCQkgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAotCQkgICAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQotewotICBteV9wb3N0X3B0ciBwb3N0ID0gKG15X3Bvc3RfcHRyKSBjaW5mby0+cG9zdDsKLSAgSkRJTUVOU0lPTiBvbGRfbmV4dF9yb3csIG51bV9yb3dzOwotCi0gIC8qIFJlcG9zaXRpb24gdmlydHVhbCBidWZmZXIgaWYgYXQgc3RhcnQgb2Ygc3RyaXAuICovCi0gIGlmIChwb3N0LT5uZXh0X3JvdyA9PSAwKSB7Ci0gICAgcG9zdC0+YnVmZmVyID0gKCpjaW5mby0+bWVtLT5hY2Nlc3NfdmlydF9zYXJyYXkpCi0JKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBwb3N0LT53aG9sZV9pbWFnZSwKLQkgcG9zdC0+c3RhcnRpbmdfcm93LCBwb3N0LT5zdHJpcF9oZWlnaHQsIFRSVUUpOwotICB9Ci0KLSAgLyogVXBzYW1wbGUgc29tZSBkYXRhICh1cCB0byBhIHN0cmlwIGhlaWdodCdzIHdvcnRoKS4gKi8KLSAgb2xkX25leHRfcm93ID0gcG9zdC0+bmV4dF9yb3c7Ci0gICgqY2luZm8tPnVwc2FtcGxlLT51cHNhbXBsZSkgKGNpbmZvLAotCQlpbnB1dF9idWYsIGluX3Jvd19ncm91cF9jdHIsIGluX3Jvd19ncm91cHNfYXZhaWwsCi0JCXBvc3QtPmJ1ZmZlciwgJnBvc3QtPm5leHRfcm93LCBwb3N0LT5zdHJpcF9oZWlnaHQpOwotCi0gIC8qIEFsbG93IHF1YW50aXplciB0byBzY2FuIG5ldyBkYXRhLiAgTm8gZGF0YSBpcyBlbWl0dGVkLCAqLwotICAvKiBidXQgd2UgYWR2YW5jZSBvdXRfcm93X2N0ciBzbyBvdXRlciBsb29wIGNhbiB0ZWxsIHdoZW4gd2UncmUgZG9uZS4gKi8KLSAgaWYgKHBvc3QtPm5leHRfcm93ID4gb2xkX25leHRfcm93KSB7Ci0gICAgbnVtX3Jvd3MgPSBwb3N0LT5uZXh0X3JvdyAtIG9sZF9uZXh0X3JvdzsKLSAgICAoKmNpbmZvLT5jcXVhbnRpemUtPmNvbG9yX3F1YW50aXplKSAoY2luZm8sIHBvc3QtPmJ1ZmZlciArIG9sZF9uZXh0X3JvdywKLQkJCQkJIChKU0FNUEFSUkFZKSBOVUxMLCAoaW50KSBudW1fcm93cyk7Ci0gICAgKm91dF9yb3dfY3RyICs9IG51bV9yb3dzOwotICB9Ci0KLSAgLyogQWR2YW5jZSBpZiB3ZSBmaWxsZWQgdGhlIHN0cmlwLiAqLwotICBpZiAocG9zdC0+bmV4dF9yb3cgPj0gcG9zdC0+c3RyaXBfaGVpZ2h0KSB7Ci0gICAgcG9zdC0+c3RhcnRpbmdfcm93ICs9IHBvc3QtPnN0cmlwX2hlaWdodDsKLSAgICBwb3N0LT5uZXh0X3JvdyA9IDA7Ci0gIH0KLX0KLQotCi0vKgotICogUHJvY2VzcyBzb21lIGRhdGEgaW4gdGhlIHNlY29uZCBwYXNzIG9mIDItcGFzcyBxdWFudGl6YXRpb24uCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1wb3N0X3Byb2Nlc3NfMnBhc3MgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCSAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKLQkJICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKLQkJICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiAqb3V0X3Jvd19jdHIsCi0JCSAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKQotewotICBteV9wb3N0X3B0ciBwb3N0ID0gKG15X3Bvc3RfcHRyKSBjaW5mby0+cG9zdDsKLSAgSkRJTUVOU0lPTiBudW1fcm93cywgbWF4X3Jvd3M7Ci0KLSAgLyogUmVwb3NpdGlvbiB2aXJ0dWFsIGJ1ZmZlciBpZiBhdCBzdGFydCBvZiBzdHJpcC4gKi8KLSAgaWYgKHBvc3QtPm5leHRfcm93ID09IDApIHsKLSAgICBwb3N0LT5idWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFjY2Vzc192aXJ0X3NhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgY2luZm8sIHBvc3QtPndob2xlX2ltYWdlLAotCSBwb3N0LT5zdGFydGluZ19yb3csIHBvc3QtPnN0cmlwX2hlaWdodCwgRkFMU0UpOwotICB9Ci0KLSAgLyogRGV0ZXJtaW5lIG51bWJlciBvZiByb3dzIHRvIGVtaXQuICovCi0gIG51bV9yb3dzID0gcG9zdC0+c3RyaXBfaGVpZ2h0IC0gcG9zdC0+bmV4dF9yb3c7IC8qIGF2YWlsYWJsZSBpbiBzdHJpcCAqLwotICBtYXhfcm93cyA9IG91dF9yb3dzX2F2YWlsIC0gKm91dF9yb3dfY3RyOyAvKiBhdmFpbGFibGUgaW4gb3V0cHV0IGFyZWEgKi8KLSAgaWYgKG51bV9yb3dzID4gbWF4X3Jvd3MpCi0gICAgbnVtX3Jvd3MgPSBtYXhfcm93czsKLSAgLyogV2UgaGF2ZSB0byBjaGVjayBib3R0b20gb2YgaW1hZ2UgaGVyZSwgY2FuJ3QgZGVwZW5kIG9uIHVwc2FtcGxlci4gKi8KLSAgbWF4X3Jvd3MgPSBjaW5mby0+b3V0cHV0X2hlaWdodCAtIHBvc3QtPnN0YXJ0aW5nX3JvdzsKLSAgaWYgKG51bV9yb3dzID4gbWF4X3Jvd3MpCi0gICAgbnVtX3Jvd3MgPSBtYXhfcm93czsKLQotICAvKiBRdWFudGl6ZSBhbmQgZW1pdCBkYXRhLiAqLwotICAoKmNpbmZvLT5jcXVhbnRpemUtPmNvbG9yX3F1YW50aXplKSAoY2luZm8sCi0JCXBvc3QtPmJ1ZmZlciArIHBvc3QtPm5leHRfcm93LCBvdXRwdXRfYnVmICsgKm91dF9yb3dfY3RyLAotCQkoaW50KSBudW1fcm93cyk7Ci0gICpvdXRfcm93X2N0ciArPSBudW1fcm93czsKLQotICAvKiBBZHZhbmNlIGlmIHdlIGZpbGxlZCB0aGUgc3RyaXAuICovCi0gIHBvc3QtPm5leHRfcm93ICs9IG51bV9yb3dzOwotICBpZiAocG9zdC0+bmV4dF9yb3cgPj0gcG9zdC0+c3RyaXBfaGVpZ2h0KSB7Ci0gICAgcG9zdC0+c3RhcnRpbmdfcm93ICs9IHBvc3QtPnN0cmlwX2hlaWdodDsKLSAgICBwb3N0LT5uZXh0X3JvdyA9IDA7Ci0gIH0KLX0KLQotI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLwotCi0KLS8qCi0gKiBJbml0aWFsaXplIHBvc3Rwcm9jZXNzaW5nIGNvbnRyb2xsZXIuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qaW5pdF9kX3Bvc3RfY29udHJvbGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKQotewotICBteV9wb3N0X3B0ciBwb3N0OwotCi0gIHBvc3QgPSAobXlfcG9zdF9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfcG9zdF9jb250cm9sbGVyKSk7Ci0gIGNpbmZvLT5wb3N0ID0gKHN0cnVjdCBqcGVnX2RfcG9zdF9jb250cm9sbGVyICopIHBvc3Q7Ci0gIHBvc3QtPnB1Yi5zdGFydF9wYXNzID0gc3RhcnRfcGFzc19kcG9zdDsKLSAgcG9zdC0+d2hvbGVfaW1hZ2UgPSBOVUxMOwkvKiBmbGFnIGZvciBubyB2aXJ0dWFsIGFycmF5cyAqLwotICBwb3N0LT5idWZmZXIgPSBOVUxMOwkJLyogZmxhZyBmb3Igbm8gc3RyaXAgYnVmZmVyICovCi0KLSAgLyogQ3JlYXRlIHRoZSBxdWFudGl6YXRpb24gYnVmZmVyLCBpZiBuZWVkZWQgKi8KLSAgaWYgKGNpbmZvLT5xdWFudGl6ZV9jb2xvcnMpIHsKLSAgICAvKiBUaGUgYnVmZmVyIHN0cmlwIGhlaWdodCBpcyBtYXhfdl9zYW1wX2ZhY3Rvciwgd2hpY2ggaXMgdHlwaWNhbGx5Ci0gICAgICogYW4gZWZmaWNpZW50IG51bWJlciBvZiByb3dzIGZvciB1cHNhbXBsaW5nIHRvIHJldHVybi4KLSAgICAgKiAoSW4gdGhlIHByZXNlbmNlIG9mIG91dHB1dCByZXNjYWxpbmcsIHdlIG1pZ2h0IHdhbnQgdG8gYmUgc21hcnRlcj8pCi0gICAgICovCi0gICAgcG9zdC0+c3RyaXBfaGVpZ2h0ID0gKEpESU1FTlNJT04pIGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcjsKLSAgICBpZiAobmVlZF9mdWxsX2J1ZmZlcikgewotICAgICAgLyogVHdvLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uOiBuZWVkIGZ1bGwtaW1hZ2Ugc3RvcmFnZS4gKi8KLSAgICAgIC8qIFdlIHJvdW5kIHVwIHRoZSBudW1iZXIgb2Ygcm93cyB0byBhIG11bHRpcGxlIG9mIHRoZSBzdHJpcCBoZWlnaHQuICovCi0jaWZkZWYgUVVBTlRfMlBBU1NfU1VQUE9SVEVECi0gICAgICBwb3N0LT53aG9sZV9pbWFnZSA9ICgqY2luZm8tPm1lbS0+cmVxdWVzdF92aXJ0X3NhcnJheSkKLQkoKGpfY29tbW9uX3B0cikgY2luZm8sIEpQT09MX0lNQUdFLCBGQUxTRSwKLQkgY2luZm8tPm91dHB1dF93aWR0aCAqIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cywKLQkgKEpESU1FTlNJT04pIGpyb3VuZF91cCgobG9uZykgY2luZm8tPm91dHB1dF9oZWlnaHQsCi0JCQkJKGxvbmcpIHBvc3QtPnN0cmlwX2hlaWdodCksCi0JIHBvc3QtPnN0cmlwX2hlaWdodCk7Ci0jZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQlVGRkVSX01PREUpOwotI2VuZGlmIC8qIFFVQU5UXzJQQVNTX1NVUFBPUlRFRCAqLwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBPbmUtcGFzcyBjb2xvciBxdWFudGl6YXRpb246IGp1c3QgbWFrZSBhIHN0cmlwIGJ1ZmZlci4gKi8KLSAgICAgIHBvc3QtPmJ1ZmZlciA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQotCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JIGNpbmZvLT5vdXRwdXRfd2lkdGggKiBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMsCi0JIHBvc3QtPnN0cmlwX2hlaWdodCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamRzYW1wbGUuYyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZHNhbXBsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGZmZWZiLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZHNhbXBsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNDc4ICswLDAgQEAKLS8qCi0gKiBqZHNhbXBsZS5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdXBzYW1wbGluZyByb3V0aW5lcy4KLSAqCi0gKiBVcHNhbXBsaW5nIGlucHV0IGRhdGEgaXMgY291bnRlZCBpbiAicm93IGdyb3VwcyIuICBBIHJvdyBncm91cAotICogaXMgZGVmaW5lZCB0byBiZSAodl9zYW1wX2ZhY3RvciAqIERDVF9zY2FsZWRfc2l6ZSAvIG1pbl9EQ1Rfc2NhbGVkX3NpemUpCi0gKiBzYW1wbGUgcm93cyBvZiBlYWNoIGNvbXBvbmVudC4gIFVwc2FtcGxpbmcgd2lsbCBub3JtYWxseSBwcm9kdWNlCi0gKiBtYXhfdl9zYW1wX2ZhY3RvciBwaXhlbCByb3dzIGZyb20gZWFjaCByb3cgZ3JvdXAgKGJ1dCB0aGlzIGNvdWxkIHZhcnkKLSAqIGlmIHRoZSB1cHNhbXBsZXIgaXMgYXBwbHlpbmcgYSBzY2FsZSBmYWN0b3Igb2YgaXRzIG93bikuCi0gKgotICogQW4gZXhjZWxsZW50IHJlZmVyZW5jZSBmb3IgaW1hZ2UgcmVzYW1wbGluZyBpcwotICogICBEaWdpdGFsIEltYWdlIFdhcnBpbmcsIEdlb3JnZSBXb2xiZXJnLCAxOTkwLgotICogICBQdWIuIGJ5IElFRUUgQ29tcHV0ZXIgU29jaWV0eSBQcmVzcywgTG9zIEFsYW1pdG9zLCBDQS4gSVNCTiAwLTgxODYtODk0NC03LgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKiBQb2ludGVyIHRvIHJvdXRpbmUgdG8gdXBzYW1wbGUgYSBzaW5nbGUgY29tcG9uZW50ICovCi10eXBlZGVmIEpNRVRIT0Qodm9pZCwgdXBzYW1wbGUxX3B0ciwKLQkJKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKSk7Ci0KLS8qIFByaXZhdGUgc3Vib2JqZWN0ICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc3RydWN0IGpwZWdfdXBzYW1wbGVyIHB1YjsJLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIENvbG9yIGNvbnZlcnNpb24gYnVmZmVyLiAgV2hlbiB1c2luZyBzZXBhcmF0ZSB1cHNhbXBsaW5nIGFuZCBjb2xvcgotICAgKiBjb252ZXJzaW9uIHN0ZXBzLCB0aGlzIGJ1ZmZlciBob2xkcyBvbmUgdXBzYW1wbGVkIHJvdyBncm91cCB1bnRpbCBpdAotICAgKiBoYXMgYmVlbiBjb2xvciBjb252ZXJ0ZWQgYW5kIG91dHB1dC4KLSAgICogTm90ZTogd2UgZG8gbm90IGFsbG9jYXRlIGFueSBzdG9yYWdlIGZvciBjb21wb25lbnQocykgd2hpY2ggYXJlIGZ1bGwtc2l6ZSwKLSAgICogaWUgZG8gbm90IG5lZWQgcmVzY2FsaW5nLiAgVGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgb2YgY29sb3JfYnVmW10gaXMKLSAgICogc2ltcGx5IHNldCB0byBwb2ludCB0byB0aGUgaW5wdXQgZGF0YSBhcnJheSwgdGhlcmVieSBhdm9pZGluZyBjb3B5aW5nLgotICAgKi8KLSAgSlNBTVBBUlJBWSBjb2xvcl9idWZbTUFYX0NPTVBPTkVOVFNdOwotCi0gIC8qIFBlci1jb21wb25lbnQgdXBzYW1wbGluZyBtZXRob2QgcG9pbnRlcnMgKi8KLSAgdXBzYW1wbGUxX3B0ciBtZXRob2RzW01BWF9DT01QT05FTlRTXTsKLQotICBpbnQgbmV4dF9yb3dfb3V0OwkJLyogY291bnRzIHJvd3MgZW1pdHRlZCBmcm9tIGNvbG9yX2J1ZiAqLwotICBKRElNRU5TSU9OIHJvd3NfdG9fZ287CS8qIGNvdW50cyByb3dzIHJlbWFpbmluZyBpbiBpbWFnZSAqLwotCi0gIC8qIEhlaWdodCBvZiBhbiBpbnB1dCByb3cgZ3JvdXAgZm9yIGVhY2ggY29tcG9uZW50LiAqLwotICBpbnQgcm93Z3JvdXBfaGVpZ2h0W01BWF9DT01QT05FTlRTXTsKLQotICAvKiBUaGVzZSBhcnJheXMgc2F2ZSBwaXhlbCBleHBhbnNpb24gZmFjdG9ycyBzbyB0aGF0IGludF9leHBhbmQgbmVlZCBub3QKLSAgICogcmVjb21wdXRlIHRoZW0gZWFjaCB0aW1lLiAgVGhleSBhcmUgdW51c2VkIGZvciBvdGhlciB1cHNhbXBsaW5nIG1ldGhvZHMuCi0gICAqLwotICBVSU5UOCBoX2V4cGFuZFtNQVhfQ09NUE9ORU5UU107Ci0gIFVJTlQ4IHZfZXhwYW5kW01BWF9DT01QT05FTlRTXTsKLX0gbXlfdXBzYW1wbGVyOwotCi10eXBlZGVmIG15X3Vwc2FtcGxlciAqIG15X3Vwc2FtcGxlX3B0cjsKLQotCi0vKgotICogSW5pdGlhbGl6ZSBmb3IgYW4gdXBzYW1wbGluZyBwYXNzLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc3RhcnRfcGFzc191cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOwotCi0gIC8qIE1hcmsgdGhlIGNvbnZlcnNpb24gYnVmZmVyIGVtcHR5ICovCi0gIHVwc2FtcGxlLT5uZXh0X3Jvd19vdXQgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7Ci0gIC8qIEluaXRpYWxpemUgdG90YWwtaGVpZ2h0IGNvdW50ZXIgZm9yIGRldGVjdGluZyBib3R0b20gb2YgaW1hZ2UgKi8KLSAgdXBzYW1wbGUtPnJvd3NfdG9fZ28gPSBjaW5mby0+b3V0cHV0X2hlaWdodDsKLX0KLQotCi0vKgotICogQ29udHJvbCByb3V0aW5lIHRvIGRvIHVwc2FtcGxpbmcgKGFuZCBjb2xvciBjb252ZXJzaW9uKS4KLSAqCi0gKiBJbiB0aGlzIHZlcnNpb24gd2UgdXBzYW1wbGUgZWFjaCBjb21wb25lbnQgaW5kZXBlbmRlbnRseS4KLSAqIFdlIHVwc2FtcGxlIG9uZSByb3cgZ3JvdXAgaW50byB0aGUgY29udmVyc2lvbiBidWZmZXIsIHRoZW4gYXBwbHkKLSAqIGNvbG9yIGNvbnZlcnNpb24gYSByb3cgYXQgYSB0aW1lLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotc2VwX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCSAgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfZ3JvdXBfY3RyLAotCSAgICAgIEpESU1FTlNJT04gaW5fcm93X2dyb3Vwc19hdmFpbCwKLQkgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAotCSAgICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpCi17Ci0gIG15X3Vwc2FtcGxlX3B0ciB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpIGNpbmZvLT51cHNhbXBsZTsKLSAgaW50IGNpOwotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0cjsKLSAgSkRJTUVOU0lPTiBudW1fcm93czsKLQotICAvKiBGaWxsIHRoZSBjb252ZXJzaW9uIGJ1ZmZlciwgaWYgaXQncyBlbXB0eSAqLwotICBpZiAodXBzYW1wbGUtPm5leHRfcm93X291dCA+PSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKLSAgICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotCSBjaSsrLCBjb21wcHRyKyspIHsKLSAgICAgIC8qIEludm9rZSBwZXItY29tcG9uZW50IHVwc2FtcGxlIG1ldGhvZC4gIE5vdGljZSB3ZSBwYXNzIGEgUE9JTlRFUgotICAgICAgICogdG8gY29sb3JfYnVmW2NpXSwgc28gdGhhdCBmdWxsc2l6ZV91cHNhbXBsZSBjYW4gY2hhbmdlIGl0LgotICAgICAgICovCi0gICAgICAoKnVwc2FtcGxlLT5tZXRob2RzW2NpXSkgKGNpbmZvLCBjb21wcHRyLAotCWlucHV0X2J1ZltjaV0gKyAoKmluX3Jvd19ncm91cF9jdHIgKiB1cHNhbXBsZS0+cm93Z3JvdXBfaGVpZ2h0W2NpXSksCi0JdXBzYW1wbGUtPmNvbG9yX2J1ZiArIGNpKTsKLSAgICB9Ci0gICAgdXBzYW1wbGUtPm5leHRfcm93X291dCA9IDA7Ci0gIH0KLQotICAvKiBDb2xvci1jb252ZXJ0IGFuZCBlbWl0IHJvd3MgKi8KLQotICAvKiBIb3cgbWFueSB3ZSBoYXZlIGluIHRoZSBidWZmZXI6ICovCi0gIG51bV9yb3dzID0gKEpESU1FTlNJT04pIChjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IgLSB1cHNhbXBsZS0+bmV4dF9yb3dfb3V0KTsKLSAgLyogTm90IG1vcmUgdGhhbiB0aGUgZGlzdGFuY2UgdG8gdGhlIGVuZCBvZiB0aGUgaW1hZ2UuICBOZWVkIHRoaXMgdGVzdAotICAgKiBpbiBjYXNlIHRoZSBpbWFnZSBoZWlnaHQgaXMgbm90IGEgbXVsdGlwbGUgb2YgbWF4X3Zfc2FtcF9mYWN0b3I6Ci0gICAqLwotICBpZiAobnVtX3Jvd3MgPiB1cHNhbXBsZS0+cm93c190b19nbykgCi0gICAgbnVtX3Jvd3MgPSB1cHNhbXBsZS0+cm93c190b19nbzsKLSAgLyogQW5kIG5vdCBtb3JlIHRoYW4gd2hhdCB0aGUgY2xpZW50IGNhbiBhY2NlcHQ6ICovCi0gIG91dF9yb3dzX2F2YWlsIC09ICpvdXRfcm93X2N0cjsKLSAgaWYgKG51bV9yb3dzID4gb3V0X3Jvd3NfYXZhaWwpCi0gICAgbnVtX3Jvd3MgPSBvdXRfcm93c19hdmFpbDsKLQotICAoKmNpbmZvLT5jY29udmVydC0+Y29sb3JfY29udmVydCkgKGNpbmZvLCB1cHNhbXBsZS0+Y29sb3JfYnVmLAotCQkJCSAgICAgKEpESU1FTlNJT04pIHVwc2FtcGxlLT5uZXh0X3Jvd19vdXQsCi0JCQkJICAgICBvdXRwdXRfYnVmICsgKm91dF9yb3dfY3RyLAotCQkJCSAgICAgKGludCkgbnVtX3Jvd3MpOwotCi0gIC8qIEFkanVzdCBjb3VudHMgKi8KLSAgKm91dF9yb3dfY3RyICs9IG51bV9yb3dzOwotICB1cHNhbXBsZS0+cm93c190b19nbyAtPSBudW1fcm93czsKLSAgdXBzYW1wbGUtPm5leHRfcm93X291dCArPSBudW1fcm93czsKLSAgLyogV2hlbiB0aGUgYnVmZmVyIGlzIGVtcHRpZWQsIGRlY2xhcmUgdGhpcyBpbnB1dCByb3cgZ3JvdXAgY29uc3VtZWQgKi8KLSAgaWYgKHVwc2FtcGxlLT5uZXh0X3Jvd19vdXQgPj0gY2luZm8tPm1heF92X3NhbXBfZmFjdG9yKQotICAgICgqaW5fcm93X2dyb3VwX2N0cikrKzsKLX0KLQotCi0vKgotICogVGhlc2UgYXJlIHRoZSByb3V0aW5lcyBpbnZva2VkIGJ5IHNlcF91cHNhbXBsZSB0byB1cHNhbXBsZSBwaXhlbCB2YWx1ZXMKLSAqIG9mIGEgc2luZ2xlIGNvbXBvbmVudC4gIE9uZSByb3cgZ3JvdXAgaXMgcHJvY2Vzc2VkIHBlciBjYWxsLgotICovCi0KLQotLyoKLSAqIEZvciBmdWxsLXNpemUgY29tcG9uZW50cywgd2UganVzdCBtYWtlIGNvbG9yX2J1ZltjaV0gcG9pbnQgYXQgdGhlCi0gKiBpbnB1dCBidWZmZXIsIGFuZCB0aHVzIGF2b2lkIGNvcHlpbmcgYW55IGRhdGEuICBOb3RlIHRoYXQgdGhpcyBpcwotICogc2FmZSBvbmx5IGJlY2F1c2Ugc2VwX3Vwc2FtcGxlIGRvZXNuJ3QgZGVjbGFyZSB0aGUgaW5wdXQgcm93IGdyb3VwCi0gKiAiY29uc3VtZWQiIHVudGlsIHdlIGFyZSBkb25lIGNvbG9yIGNvbnZlcnRpbmcgYW5kIGVtaXR0aW5nIGl0LgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZnVsbHNpemVfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCi17Ci0gICpvdXRwdXRfZGF0YV9wdHIgPSBpbnB1dF9kYXRhOwotfQotCi0KLS8qCi0gKiBUaGlzIGlzIGEgbm8tb3AgdmVyc2lvbiB1c2VkIGZvciAidW5pbnRlcmVzdGluZyIgY29tcG9uZW50cy4KLSAqIFRoZXNlIGNvbXBvbmVudHMgd2lsbCBub3QgYmUgcmVmZXJlbmNlZCBieSBjb2xvciBjb252ZXJzaW9uLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotbm9vcF91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JICAgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikKLXsKLSAgKm91dHB1dF9kYXRhX3B0ciA9IE5VTEw7CS8qIHNhZmV0eSBjaGVjayAqLwotfQotCi0KLS8qCi0gKiBUaGlzIHZlcnNpb24gaGFuZGxlcyBhbnkgaW50ZWdyYWwgc2FtcGxpbmcgcmF0aW9zLgotICogVGhpcyBpcyBub3QgdXNlZCBmb3IgdHlwaWNhbCBKUEVHIGZpbGVzLCBzbyBpdCBuZWVkIG5vdCBiZSBmYXN0LgotICogTm9yLCBmb3IgdGhhdCBtYXR0ZXIsIGlzIGl0IHBhcnRpY3VsYXJseSBhY2N1cmF0ZTogdGhlIGFsZ29yaXRobSBpcwotICogc2ltcGxlIHJlcGxpY2F0aW9uIG9mIHRoZSBpbnB1dCBwaXhlbCBvbnRvIHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dAotICogcGl4ZWxzLiAgVGhlIGhpLWZhbHV0aW4gc2FtcGxpbmcgbGl0ZXJhdHVyZSByZWZlcnMgdG8gdGhpcyBhcyBhCi0gKiAiYm94IGZpbHRlciIuICBBIGJveCBmaWx0ZXIgdGVuZHMgdG8gaW50cm9kdWNlIHZpc2libGUgYXJ0aWZhY3RzLAotICogc28gaWYgeW91IGFyZSBhY3R1YWxseSBnb2luZyB0byB1c2UgMzoxIG9yIDQ6MSBzYW1wbGluZyByYXRpb3MKLSAqIHlvdSB3b3VsZCBiZSB3ZWxsIGFkdmlzZWQgdG8gaW1wcm92ZSB0aGlzIGNvZGUuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1pbnRfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSAgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikKLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlID0gKG15X3Vwc2FtcGxlX3B0cikgY2luZm8tPnVwc2FtcGxlOwotICBKU0FNUEFSUkFZIG91dHB1dF9kYXRhID0gKm91dHB1dF9kYXRhX3B0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBMRSBpbnZhbHVlOwotICByZWdpc3RlciBpbnQgaDsKLSAgSlNBTVBST1cgb3V0ZW5kOwotICBpbnQgaF9leHBhbmQsIHZfZXhwYW5kOwotICBpbnQgaW5yb3csIG91dHJvdzsKLQotICBoX2V4cGFuZCA9IHVwc2FtcGxlLT5oX2V4cGFuZFtjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdOwotICB2X2V4cGFuZCA9IHVwc2FtcGxlLT52X2V4cGFuZFtjb21wcHRyLT5jb21wb25lbnRfaW5kZXhdOwotCi0gIGlucm93ID0gb3V0cm93ID0gMDsKLSAgd2hpbGUgKG91dHJvdyA8IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgewotICAgIC8qIEdlbmVyYXRlIG9uZSBvdXRwdXQgcm93IHdpdGggcHJvcGVyIGhvcml6b250YWwgZXhwYW5zaW9uICovCi0gICAgaW5wdHIgPSBpbnB1dF9kYXRhW2lucm93XTsKLSAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3ddOwotICAgIG91dGVuZCA9IG91dHB0ciArIGNpbmZvLT5vdXRwdXRfd2lkdGg7Ci0gICAgd2hpbGUgKG91dHB0ciA8IG91dGVuZCkgewotICAgICAgaW52YWx1ZSA9ICppbnB0cisrOwkvKiBkb24ndCBuZWVkIEdFVEpTQU1QTEUoKSBoZXJlICovCi0gICAgICBmb3IgKGggPSBoX2V4cGFuZDsgaCA+IDA7IGgtLSkgewotCSpvdXRwdHIrKyA9IGludmFsdWU7Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIEdlbmVyYXRlIGFueSBhZGRpdGlvbmFsIG91dHB1dCByb3dzIGJ5IGR1cGxpY2F0aW5nIHRoZSBmaXJzdCBvbmUgKi8KLSAgICBpZiAodl9leHBhbmQgPiAxKSB7Ci0gICAgICBqY29weV9zYW1wbGVfcm93cyhvdXRwdXRfZGF0YSwgb3V0cm93LCBvdXRwdXRfZGF0YSwgb3V0cm93KzEsCi0JCQl2X2V4cGFuZC0xLCBjaW5mby0+b3V0cHV0X3dpZHRoKTsKLSAgICB9Ci0gICAgaW5yb3crKzsKLSAgICBvdXRyb3cgKz0gdl9leHBhbmQ7Ci0gIH0KLX0KLQotCi0vKgotICogRmFzdCBwcm9jZXNzaW5nIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDE6MSB2ZXJ0aWNhbC4KLSAqIEl0J3Mgc3RpbGwgYSBib3ggZmlsdGVyLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotaDJ2MV91cHNhbXBsZSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JICAgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikKLXsKLSAgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSA9ICpvdXRwdXRfZGF0YV9wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QTEUgaW52YWx1ZTsKLSAgSlNBTVBST1cgb3V0ZW5kOwotICBpbnQgaW5yb3c7Ci0KLSAgZm9yIChpbnJvdyA9IDA7IGlucm93IDwgY2luZm8tPm1heF92X3NhbXBfZmFjdG9yOyBpbnJvdysrKSB7Ci0gICAgaW5wdHIgPSBpbnB1dF9kYXRhW2lucm93XTsKLSAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtpbnJvd107Ci0gICAgb3V0ZW5kID0gb3V0cHRyICsgY2luZm8tPm91dHB1dF93aWR0aDsKLSAgICB3aGlsZSAob3V0cHRyIDwgb3V0ZW5kKSB7Ci0gICAgICBpbnZhbHVlID0gKmlucHRyKys7CS8qIGRvbid0IG5lZWQgR0VUSlNBTVBMRSgpIGhlcmUgKi8KLSAgICAgICpvdXRwdHIrKyA9IGludmFsdWU7Ci0gICAgICAqb3V0cHRyKysgPSBpbnZhbHVlOwotICAgIH0KLSAgfQotfQotCi0KLS8qCi0gKiBGYXN0IHByb2Nlc3NpbmcgZm9yIHRoZSBjb21tb24gY2FzZSBvZiAyOjEgaG9yaXpvbnRhbCBhbmQgMjoxIHZlcnRpY2FsLgotICogSXQncyBzdGlsbCBhIGJveCBmaWx0ZXIuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1oMnYyX3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgICAgICAgSlNBTVBBUlJBWSBpbnB1dF9kYXRhLCBKU0FNUEFSUkFZICogb3V0cHV0X2RhdGFfcHRyKQotewotICBKU0FNUEFSUkFZIG91dHB1dF9kYXRhID0gKm91dHB1dF9kYXRhX3B0cjsKLSAgcmVnaXN0ZXIgSlNBTVBST1cgaW5wdHIsIG91dHB0cjsKLSAgcmVnaXN0ZXIgSlNBTVBMRSBpbnZhbHVlOwotICBKU0FNUFJPVyBvdXRlbmQ7Ci0gIGludCBpbnJvdywgb3V0cm93OwotCi0gIGlucm93ID0gb3V0cm93ID0gMDsKLSAgd2hpbGUgKG91dHJvdyA8IGNpbmZvLT5tYXhfdl9zYW1wX2ZhY3RvcikgewotICAgIGlucHRyID0gaW5wdXRfZGF0YVtpbnJvd107Ci0gICAgb3V0cHRyID0gb3V0cHV0X2RhdGFbb3V0cm93XTsKLSAgICBvdXRlbmQgPSBvdXRwdHIgKyBjaW5mby0+b3V0cHV0X3dpZHRoOwotICAgIHdoaWxlIChvdXRwdHIgPCBvdXRlbmQpIHsKLSAgICAgIGludmFsdWUgPSAqaW5wdHIrKzsJLyogZG9uJ3QgbmVlZCBHRVRKU0FNUExFKCkgaGVyZSAqLwotICAgICAgKm91dHB0cisrID0gaW52YWx1ZTsKLSAgICAgICpvdXRwdHIrKyA9IGludmFsdWU7Ci0gICAgfQotICAgIGpjb3B5X3NhbXBsZV9yb3dzKG91dHB1dF9kYXRhLCBvdXRyb3csIG91dHB1dF9kYXRhLCBvdXRyb3crMSwKLQkJICAgICAgMSwgY2luZm8tPm91dHB1dF93aWR0aCk7Ci0gICAgaW5yb3crKzsKLSAgICBvdXRyb3cgKz0gMjsKLSAgfQotfQotCi0KLS8qCi0gKiBGYW5jeSBwcm9jZXNzaW5nIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDE6MSB2ZXJ0aWNhbC4KLSAqCi0gKiBUaGUgdXBzYW1wbGluZyBhbGdvcml0aG0gaXMgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiBwaXhlbCBjZW50ZXJzLAotICogYWxzbyBrbm93biBhcyBhICJ0cmlhbmdsZSBmaWx0ZXIiLiAgVGhpcyBpcyBhIGdvb2QgY29tcHJvbWlzZSBiZXR3ZWVuCi0gKiBzcGVlZCBhbmQgdmlzdWFsIHF1YWxpdHkuICBUaGUgY2VudGVycyBvZiB0aGUgb3V0cHV0IHBpeGVscyBhcmUgMS80IGFuZCAzLzQKLSAqIG9mIHRoZSB3YXkgYmV0d2VlbiBpbnB1dCBwaXhlbCBjZW50ZXJzLgotICoKLSAqIEEgbm90ZSBhYm91dCB0aGUgImJpYXMiIGNhbGN1bGF0aW9uczogd2hlbiByb3VuZGluZyBmcmFjdGlvbmFsIHZhbHVlcyB0bwotICogaW50ZWdlciwgd2UgZG8gbm90IHdhbnQgdG8gYWx3YXlzIHJvdW5kIDAuNSB1cCB0byB0aGUgbmV4dCBpbnRlZ2VyLgotICogSWYgd2UgZGlkIHRoYXQsIHdlJ2QgaW50cm9kdWNlIGEgbm90aWNlYWJsZSBiaWFzIHRvd2FyZHMgbGFyZ2VyIHZhbHVlcy4KLSAqIEluc3RlYWQsIHRoaXMgY29kZSBpcyBhcnJhbmdlZCBzbyB0aGF0IDAuNSB3aWxsIGJlIHJvdW5kZWQgdXAgb3IgZG93biBhdAotICogYWx0ZXJuYXRlIHBpeGVsIGxvY2F0aW9ucyAoYSBzaW1wbGUgb3JkZXJlZCBkaXRoZXIgcGF0dGVybikuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1oMnYxX2ZhbmN5X3Vwc2FtcGxlIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJICAgICBKU0FNUEFSUkFZIGlucHV0X2RhdGEsIEpTQU1QQVJSQVkgKiBvdXRwdXRfZGF0YV9wdHIpCi17Ci0gIEpTQU1QQVJSQVkgb3V0cHV0X2RhdGEgPSAqb3V0cHV0X2RhdGFfcHRyOwotICByZWdpc3RlciBKU0FNUFJPVyBpbnB0ciwgb3V0cHRyOwotICByZWdpc3RlciBpbnQgaW52YWx1ZTsKLSAgcmVnaXN0ZXIgSkRJTUVOU0lPTiBjb2xjdHI7Ci0gIGludCBpbnJvdzsKLQotICBmb3IgKGlucm93ID0gMDsgaW5yb3cgPCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7IGlucm93KyspIHsKLSAgICBpbnB0ciA9IGlucHV0X2RhdGFbaW5yb3ddOwotICAgIG91dHB0ciA9IG91dHB1dF9kYXRhW2lucm93XTsKLSAgICAvKiBTcGVjaWFsIGNhc2UgZm9yIGZpcnN0IGNvbHVtbiAqLwotICAgIGludmFsdWUgPSBHRVRKU0FNUExFKCppbnB0cisrKTsKLSAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgaW52YWx1ZTsKLSAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChpbnZhbHVlICogMyArIEdFVEpTQU1QTEUoKmlucHRyKSArIDIpID4+IDIpOwotCi0gICAgZm9yIChjb2xjdHIgPSBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCAtIDI7IGNvbGN0ciA+IDA7IGNvbGN0ci0tKSB7Ci0gICAgICAvKiBHZW5lcmFsIGNhc2U6IDMvNCAqIG5lYXJlciBwaXhlbCArIDEvNCAqIGZ1cnRoZXIgcGl4ZWwgKi8KLSAgICAgIGludmFsdWUgPSBHRVRKU0FNUExFKCppbnB0cisrKSAqIDM7Ci0gICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChpbnZhbHVlICsgR0VUSlNBTVBMRShpbnB0clstMl0pICsgMSkgPj4gMik7Ci0gICAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgKChpbnZhbHVlICsgR0VUSlNBTVBMRSgqaW5wdHIpICsgMikgPj4gMik7Ci0gICAgfQotCi0gICAgLyogU3BlY2lhbCBjYXNlIGZvciBsYXN0IGNvbHVtbiAqLwotICAgIGludmFsdWUgPSBHRVRKU0FNUExFKCppbnB0cik7Ci0gICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgoaW52YWx1ZSAqIDMgKyBHRVRKU0FNUExFKGlucHRyWy0xXSkgKyAxKSA+PiAyKTsKLSAgICAqb3V0cHRyKysgPSAoSlNBTVBMRSkgaW52YWx1ZTsKLSAgfQotfQotCi0KLS8qCi0gKiBGYW5jeSBwcm9jZXNzaW5nIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YgMjoxIGhvcml6b250YWwgYW5kIDI6MSB2ZXJ0aWNhbC4KLSAqIEFnYWluIGEgdHJpYW5nbGUgZmlsdGVyOyBzZWUgY29tbWVudHMgZm9yIGgydjEgY2FzZSwgYWJvdmUuCi0gKgotICogSXQgaXMgT0sgZm9yIHVzIHRvIHJlZmVyZW5jZSB0aGUgYWRqYWNlbnQgaW5wdXQgcm93cyBiZWNhdXNlIHdlIGRlbWFuZGVkCi0gKiBjb250ZXh0IGZyb20gdGhlIG1haW4gYnVmZmVyIGNvbnRyb2xsZXIgKHNlZSBpbml0aWFsaXphdGlvbiBjb2RlKS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWgydjJfZmFuY3lfdXBzYW1wbGUgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkgICAgIEpTQU1QQVJSQVkgaW5wdXRfZGF0YSwgSlNBTVBBUlJBWSAqIG91dHB1dF9kYXRhX3B0cikKLXsKLSAgSlNBTVBBUlJBWSBvdXRwdXRfZGF0YSA9ICpvdXRwdXRfZGF0YV9wdHI7Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyMCwgaW5wdHIxLCBvdXRwdHI7Ci0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLSAgcmVnaXN0ZXIgaW50IHRoaXNjb2xzdW0sIGxhc3Rjb2xzdW0sIG5leHRjb2xzdW07Ci0jZWxzZQotICByZWdpc3RlciBJTlQzMiB0aGlzY29sc3VtLCBsYXN0Y29sc3VtLCBuZXh0Y29sc3VtOwotI2VuZGlmCi0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY29sY3RyOwotICBpbnQgaW5yb3csIG91dHJvdywgdjsKLQotICBpbnJvdyA9IG91dHJvdyA9IDA7Ci0gIHdoaWxlIChvdXRyb3cgPCBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpIHsKLSAgICBmb3IgKHYgPSAwOyB2IDwgMjsgdisrKSB7Ci0gICAgICAvKiBpbnB0cjAgcG9pbnRzIHRvIG5lYXJlc3QgaW5wdXQgcm93LCBpbnB0cjEgcG9pbnRzIHRvIG5leHQgbmVhcmVzdCAqLwotICAgICAgaW5wdHIwID0gaW5wdXRfZGF0YVtpbnJvd107Ci0gICAgICBpZiAodiA9PSAwKQkJLyogbmV4dCBuZWFyZXN0IGlzIHJvdyBhYm92ZSAqLwotCWlucHRyMSA9IGlucHV0X2RhdGFbaW5yb3ctMV07Ci0gICAgICBlbHNlCQkJLyogbmV4dCBuZWFyZXN0IGlzIHJvdyBiZWxvdyAqLwotCWlucHRyMSA9IGlucHV0X2RhdGFbaW5yb3crMV07Ci0gICAgICBvdXRwdHIgPSBvdXRwdXRfZGF0YVtvdXRyb3crK107Ci0KLSAgICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgZmlyc3QgY29sdW1uICovCi0gICAgICB0aGlzY29sc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspICogMyArIEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKLSAgICAgIG5leHRjb2xzdW0gPSBHRVRKU0FNUExFKCppbnB0cjArKykgKiAzICsgR0VUSlNBTVBMRSgqaW5wdHIxKyspOwotICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgodGhpc2NvbHN1bSAqIDQgKyA4KSA+PiA0KTsKLSAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKHRoaXNjb2xzdW0gKiAzICsgbmV4dGNvbHN1bSArIDcpID4+IDQpOwotICAgICAgbGFzdGNvbHN1bSA9IHRoaXNjb2xzdW07IHRoaXNjb2xzdW0gPSBuZXh0Y29sc3VtOwotCi0gICAgICBmb3IgKGNvbGN0ciA9IGNvbXBwdHItPmRvd25zYW1wbGVkX3dpZHRoIC0gMjsgY29sY3RyID4gMDsgY29sY3RyLS0pIHsKLQkvKiBHZW5lcmFsIGNhc2U6IDMvNCAqIG5lYXJlciBwaXhlbCArIDEvNCAqIGZ1cnRoZXIgcGl4ZWwgaW4gZWFjaCAqLwotCS8qIGRpbWVuc2lvbiwgdGh1cyA5LzE2LCAzLzE2LCAzLzE2LCAxLzE2IG92ZXJhbGwgKi8KLQluZXh0Y29sc3VtID0gR0VUSlNBTVBMRSgqaW5wdHIwKyspICogMyArIEdFVEpTQU1QTEUoKmlucHRyMSsrKTsKLQkqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCh0aGlzY29sc3VtICogMyArIGxhc3Rjb2xzdW0gKyA4KSA+PiA0KTsKLQkqb3V0cHRyKysgPSAoSlNBTVBMRSkgKCh0aGlzY29sc3VtICogMyArIG5leHRjb2xzdW0gKyA3KSA+PiA0KTsKLQlsYXN0Y29sc3VtID0gdGhpc2NvbHN1bTsgdGhpc2NvbHN1bSA9IG5leHRjb2xzdW07Ci0gICAgICB9Ci0KLSAgICAgIC8qIFNwZWNpYWwgY2FzZSBmb3IgbGFzdCBjb2x1bW4gKi8KLSAgICAgICpvdXRwdHIrKyA9IChKU0FNUExFKSAoKHRoaXNjb2xzdW0gKiAzICsgbGFzdGNvbHN1bSArIDgpID4+IDQpOwotICAgICAgKm91dHB0cisrID0gKEpTQU1QTEUpICgodGhpc2NvbHN1bSAqIDQgKyA3KSA+PiA0KTsKLSAgICB9Ci0gICAgaW5yb3crKzsKLSAgfQotfQotCi0KLS8qCi0gKiBNb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZSBmb3IgdXBzYW1wbGluZy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWppbml0X3Vwc2FtcGxlciAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykKLXsKLSAgbXlfdXBzYW1wbGVfcHRyIHVwc2FtcGxlOwotICBpbnQgY2k7Ci0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyOwotICBib29sZWFuIG5lZWRfYnVmZmVyLCBkb19mYW5jeTsKLSAgaW50IGhfaW5fZ3JvdXAsIHZfaW5fZ3JvdXAsIGhfb3V0X2dyb3VwLCB2X291dF9ncm91cDsKLQotICB1cHNhbXBsZSA9IChteV91cHNhbXBsZV9wdHIpCi0gICAgKCpjaW5mby0+bWVtLT5hbGxvY19zbWFsbCkgKChqX2NvbW1vbl9wdHIpIGNpbmZvLCBKUE9PTF9JTUFHRSwKLQkJCQlTSVpFT0YobXlfdXBzYW1wbGVyKSk7Ci0gIGNpbmZvLT51cHNhbXBsZSA9IChzdHJ1Y3QganBlZ191cHNhbXBsZXIgKikgdXBzYW1wbGU7Ci0gIHVwc2FtcGxlLT5wdWIuc3RhcnRfcGFzcyA9IHN0YXJ0X3Bhc3NfdXBzYW1wbGU7Ci0gIHVwc2FtcGxlLT5wdWIudXBzYW1wbGUgPSBzZXBfdXBzYW1wbGU7Ci0gIHVwc2FtcGxlLT5wdWIubmVlZF9jb250ZXh0X3Jvd3MgPSBGQUxTRTsgLyogdW50aWwgd2UgZmluZCBvdXQgZGlmZmVyZW50bHkgKi8KLQotICBpZiAoY2luZm8tPkNDSVI2MDFfc2FtcGxpbmcpCS8qIHRoaXMgaXNuJ3Qgc3VwcG9ydGVkICovCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9DQ0lSNjAxX05PVElNUEwpOwotCi0gIC8qIGpkbWFpbmN0LmMgZG9lc24ndCBzdXBwb3J0IGNvbnRleHQgcm93cyB3aGVuIG1pbl9EQ1Rfc2NhbGVkX3NpemUgPSAxLAotICAgKiBzbyBkb24ndCBhc2sgZm9yIGl0LgotICAgKi8KLSAgZG9fZmFuY3kgPSBjaW5mby0+ZG9fZmFuY3lfdXBzYW1wbGluZyAmJiBjaW5mby0+bWluX0RDVF9zY2FsZWRfc2l6ZSA+IDE7Ci0KLSAgLyogVmVyaWZ5IHdlIGNhbiBoYW5kbGUgdGhlIHNhbXBsaW5nIGZhY3RvcnMsIHNlbGVjdCBwZXItY29tcG9uZW50IG1ldGhvZHMsCi0gICAqIGFuZCBjcmVhdGUgc3RvcmFnZSBhcyBuZWVkZWQuCi0gICAqLwotICBmb3IgKGNpID0gMCwgY29tcHB0ciA9IGNpbmZvLT5jb21wX2luZm87IGNpIDwgY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgICAgIGNpKyssIGNvbXBwdHIrKykgewotICAgIC8qIENvbXB1dGUgc2l6ZSBvZiBhbiAiaW5wdXQgZ3JvdXAiIGFmdGVyIElEQ1Qgc2NhbGluZy4gIFRoaXMgbWFueSBzYW1wbGVzCi0gICAgICogYXJlIHRvIGJlIGNvbnZlcnRlZCB0byBtYXhfaF9zYW1wX2ZhY3RvciAqIG1heF92X3NhbXBfZmFjdG9yIHBpeGVscy4KLSAgICAgKi8KLSAgICBoX2luX2dyb3VwID0gKGNvbXBwdHItPmhfc2FtcF9mYWN0b3IgKiBjb21wcHRyLT5EQ1Rfc2NhbGVkX3NpemUpIC8KLQkJIGNpbmZvLT5taW5fRENUX3NjYWxlZF9zaXplOwotICAgIHZfaW5fZ3JvdXAgPSAoY29tcHB0ci0+dl9zYW1wX2ZhY3RvciAqIGNvbXBwdHItPkRDVF9zY2FsZWRfc2l6ZSkgLwotCQkgY2luZm8tPm1pbl9EQ1Rfc2NhbGVkX3NpemU7Ci0gICAgaF9vdXRfZ3JvdXAgPSBjaW5mby0+bWF4X2hfc2FtcF9mYWN0b3I7Ci0gICAgdl9vdXRfZ3JvdXAgPSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3I7Ci0gICAgdXBzYW1wbGUtPnJvd2dyb3VwX2hlaWdodFtjaV0gPSB2X2luX2dyb3VwOyAvKiBzYXZlIGZvciB1c2UgbGF0ZXIgKi8KLSAgICBuZWVkX2J1ZmZlciA9IFRSVUU7Ci0gICAgaWYgKCEgY29tcHB0ci0+Y29tcG9uZW50X25lZWRlZCkgewotICAgICAgLyogRG9uJ3QgYm90aGVyIHRvIHVwc2FtcGxlIGFuIHVuaW50ZXJlc3RpbmcgY29tcG9uZW50LiAqLwotICAgICAgdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gbm9vcF91cHNhbXBsZTsKLSAgICAgIG5lZWRfYnVmZmVyID0gRkFMU0U7Ci0gICAgfSBlbHNlIGlmIChoX2luX2dyb3VwID09IGhfb3V0X2dyb3VwICYmIHZfaW5fZ3JvdXAgPT0gdl9vdXRfZ3JvdXApIHsKLSAgICAgIC8qIEZ1bGxzaXplIGNvbXBvbmVudHMgY2FuIGJlIHByb2Nlc3NlZCB3aXRob3V0IGFueSB3b3JrLiAqLwotICAgICAgdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gZnVsbHNpemVfdXBzYW1wbGU7Ci0gICAgICBuZWVkX2J1ZmZlciA9IEZBTFNFOwotICAgIH0gZWxzZSBpZiAoaF9pbl9ncm91cCAqIDIgPT0gaF9vdXRfZ3JvdXAgJiYKLQkgICAgICAgdl9pbl9ncm91cCA9PSB2X291dF9ncm91cCkgewotICAgICAgLyogU3BlY2lhbCBjYXNlcyBmb3IgMmgxdiB1cHNhbXBsaW5nICovCi0gICAgICBpZiAoZG9fZmFuY3kgJiYgY29tcHB0ci0+ZG93bnNhbXBsZWRfd2lkdGggPiAyKQotCXVwc2FtcGxlLT5tZXRob2RzW2NpXSA9IGgydjFfZmFuY3lfdXBzYW1wbGU7Ci0gICAgICBlbHNlCi0JdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2MV91cHNhbXBsZTsKLSAgICB9IGVsc2UgaWYgKGhfaW5fZ3JvdXAgKiAyID09IGhfb3V0X2dyb3VwICYmCi0JICAgICAgIHZfaW5fZ3JvdXAgKiAyID09IHZfb3V0X2dyb3VwKSB7Ci0gICAgICAvKiBTcGVjaWFsIGNhc2VzIGZvciAyaDJ2IHVwc2FtcGxpbmcgKi8KLSAgICAgIGlmIChkb19mYW5jeSAmJiBjb21wcHRyLT5kb3duc2FtcGxlZF93aWR0aCA+IDIpIHsKLQl1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBoMnYyX2ZhbmN5X3Vwc2FtcGxlOwotCXVwc2FtcGxlLT5wdWIubmVlZF9jb250ZXh0X3Jvd3MgPSBUUlVFOwotICAgICAgfSBlbHNlCi0JdXBzYW1wbGUtPm1ldGhvZHNbY2ldID0gaDJ2Ml91cHNhbXBsZTsKLSAgICB9IGVsc2UgaWYgKChoX291dF9ncm91cCAlIGhfaW5fZ3JvdXApID09IDAgJiYKLQkgICAgICAgKHZfb3V0X2dyb3VwICUgdl9pbl9ncm91cCkgPT0gMCkgewotICAgICAgLyogR2VuZXJpYyBpbnRlZ3JhbC1mYWN0b3JzIHVwc2FtcGxpbmcgbWV0aG9kICovCi0gICAgICB1cHNhbXBsZS0+bWV0aG9kc1tjaV0gPSBpbnRfdXBzYW1wbGU7Ci0gICAgICB1cHNhbXBsZS0+aF9leHBhbmRbY2ldID0gKFVJTlQ4KSAoaF9vdXRfZ3JvdXAgLyBoX2luX2dyb3VwKTsKLSAgICAgIHVwc2FtcGxlLT52X2V4cGFuZFtjaV0gPSAoVUlOVDgpICh2X291dF9ncm91cCAvIHZfaW5fZ3JvdXApOwotICAgIH0gZWxzZQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9GUkFDVF9TQU1QTEVfTk9USU1QTCk7Ci0gICAgaWYgKG5lZWRfYnVmZmVyKSB7Ci0gICAgICB1cHNhbXBsZS0+Y29sb3JfYnVmW2NpXSA9ICgqY2luZm8tPm1lbS0+YWxsb2Nfc2FycmF5KQotCSgoal9jb21tb25fcHRyKSBjaW5mbywgSlBPT0xfSU1BR0UsCi0JIChKRElNRU5TSU9OKSBqcm91bmRfdXAoKGxvbmcpIGNpbmZvLT5vdXRwdXRfd2lkdGgsCi0JCQkJKGxvbmcpIGNpbmZvLT5tYXhfaF9zYW1wX2ZhY3RvciksCi0JIChKRElNRU5TSU9OKSBjaW5mby0+bWF4X3Zfc2FtcF9mYWN0b3IpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkdHJhbnMuYyBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZHRyYW5zLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMGFiNzEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pkdHJhbnMuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogamR0cmFucy5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgbGlicmFyeSByb3V0aW5lcyBmb3IgdHJhbnNjb2RpbmcgZGVjb21wcmVzc2lvbiwKLSAqIHRoYXQgaXMsIHJlYWRpbmcgcmF3IERDVCBjb2VmZmljaWVudCBhcnJheXMgZnJvbSBhbiBpbnB1dCBKUEVHIGZpbGUuCi0gKiBUaGUgcm91dGluZXMgaW4gamRhcGltaW4uYyB3aWxsIGFsc28gYmUgbmVlZGVkIGJ5IGEgdHJhbnNjb2Rlci4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0KLQotLyogRm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KLUxPQ0FMKHZvaWQpIHRyYW5zZGVjb2RlX21hc3Rlcl9zZWxlY3Rpb24gSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLQotLyoKLSAqIFJlYWQgdGhlIGNvZWZmaWNpZW50IGFycmF5cyBmcm9tIGEgSlBFRyBmaWxlLgotICoganBlZ19yZWFkX2hlYWRlciBtdXN0IGJlIGNvbXBsZXRlZCBiZWZvcmUgY2FsbGluZyB0aGlzLgotICoKLSAqIFRoZSBlbnRpcmUgaW1hZ2UgaXMgcmVhZCBpbnRvIGEgc2V0IG9mIHZpcnR1YWwgY29lZmZpY2llbnQtYmxvY2sgYXJyYXlzLAotICogb25lIHBlciBjb21wb25lbnQuICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YKLSAqIHZpcnR1YWwtYXJyYXkgZGVzY3JpcHRvcnMuICBUaGVzZSBjYW4gYmUgbWFuaXB1bGF0ZWQgZGlyZWN0bHkgdmlhIHRoZQotICogSlBFRyBtZW1vcnkgbWFuYWdlciwgb3IgaGFuZGVkIG9mZiB0byBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cygpLgotICogVG8gcmVsZWFzZSB0aGUgbWVtb3J5IG9jY3VwaWVkIGJ5IHRoZSB2aXJ0dWFsIGFycmF5cywgY2FsbAotICoganBlZ19maW5pc2hfZGVjb21wcmVzcygpIHdoZW4gZG9uZSB3aXRoIHRoZSBkYXRhLgotICoKLSAqIEFuIGFsdGVybmF0aXZlIHVzYWdlIGlzIHRvIHNpbXBseSBvYnRhaW4gYWNjZXNzIHRvIHRoZSBjb2VmZmljaWVudCBhcnJheXMKLSAqIGR1cmluZyBhIGJ1ZmZlcmVkLWltYWdlLW1vZGUgZGVjb21wcmVzc2lvbiBvcGVyYXRpb24uICBUaGlzIGlzIGFsbG93ZWQKLSAqIGFmdGVyIGFueSBqcGVnX2ZpbmlzaF9vdXRwdXQoKSBjYWxsLiAgVGhlIGFycmF5cyBjYW4gYmUgYWNjZXNzZWQgdW50aWwKLSAqIGpwZWdfZmluaXNoX2RlY29tcHJlc3MoKSBpcyBjYWxsZWQuICAoTm90ZSB0aGF0IGFueSBjYWxsIHRvIHRoZSBsaWJyYXJ5Ci0gKiBtYXkgcmVwb3NpdGlvbiB0aGUgYXJyYXlzLCBzbyBkb24ndCByZWx5IG9uIGFjY2Vzc192aXJ0X2JhcnJheSgpIHJlc3VsdHMKLSAqIHRvIHN0YXkgdmFsaWQgYWNyb3NzIGxpYnJhcnkgY2FsbHMuKQotICoKLSAqIFJldHVybnMgTlVMTCBpZiBzdXNwZW5kZWQuICBUaGlzIGNhc2UgbmVlZCBiZSBjaGVja2VkIG9ubHkgaWYKLSAqIGEgc3VzcGVuZGluZyBkYXRhIHNvdXJjZSBpcyB1c2VkLgotICovCi0KLUdMT0JBTChqdmlydF9iYXJyYXlfcHRyICopCi1qcGVnX3JlYWRfY29lZmZpY2llbnRzIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKQotewotICBpZiAoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfUkVBRFkpIHsKLSAgICAvKiBGaXJzdCBjYWxsOiBpbml0aWFsaXplIGFjdGl2ZSBtb2R1bGVzICovCi0gICAgdHJhbnNkZWNvZGVfbWFzdGVyX3NlbGVjdGlvbihjaW5mbyk7Ci0gICAgY2luZm8tPmdsb2JhbF9zdGF0ZSA9IERTVEFURV9SRENPRUZTOwotICB9Ci0gIGlmIChjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9SRENPRUZTKSB7Ci0gICAgLyogQWJzb3JiIHdob2xlIGZpbGUgaW50byB0aGUgY29lZiBidWZmZXIgKi8KLSAgICBmb3IgKDs7KSB7Ci0gICAgICBpbnQgcmV0Y29kZTsKLSAgICAgIC8qIENhbGwgcHJvZ3Jlc3MgbW9uaXRvciBob29rIGlmIHByZXNlbnQgKi8KLSAgICAgIGlmIChjaW5mby0+cHJvZ3Jlc3MgIT0gTlVMTCkKLQkoKmNpbmZvLT5wcm9ncmVzcy0+cHJvZ3Jlc3NfbW9uaXRvcikgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLSAgICAgIC8qIEFic29yYiBzb21lIG1vcmUgaW5wdXQgKi8KLSAgICAgIHJldGNvZGUgPSAoKmNpbmZvLT5pbnB1dGN0bC0+Y29uc3VtZV9pbnB1dCkgKGNpbmZvKTsKLSAgICAgIGlmIChyZXRjb2RlID09IEpQRUdfU1VTUEVOREVEKQotCXJldHVybiBOVUxMOwotICAgICAgaWYgKHJldGNvZGUgPT0gSlBFR19SRUFDSEVEX0VPSSkKLQlicmVhazsKLSAgICAgIC8qIEFkdmFuY2UgcHJvZ3Jlc3MgY291bnRlciBpZiBhcHByb3ByaWF0ZSAqLwotICAgICAgaWYgKGNpbmZvLT5wcm9ncmVzcyAhPSBOVUxMICYmCi0JICAocmV0Y29kZSA9PSBKUEVHX1JPV19DT01QTEVURUQgfHwgcmV0Y29kZSA9PSBKUEVHX1JFQUNIRURfU09TKSkgewotCWlmICgrK2NpbmZvLT5wcm9ncmVzcy0+cGFzc19jb3VudGVyID49IGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCkgewotCSAgLyogc3RhcnR1cCB1bmRlcmVzdGltYXRlZCBudW1iZXIgb2Ygc2NhbnM7IHJhdGNoZXQgdXAgb25lIHNjYW4gKi8KLQkgIGNpbmZvLT5wcm9ncmVzcy0+cGFzc19saW1pdCArPSAobG9uZykgY2luZm8tPnRvdGFsX2lNQ1Vfcm93czsKLQl9Ci0gICAgICB9Ci0gICAgfQotICAgIC8qIFNldCBzdGF0ZSBzbyB0aGF0IGpwZWdfZmluaXNoX2RlY29tcHJlc3MgZG9lcyB0aGUgcmlnaHQgdGhpbmcgKi8KLSAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID0gRFNUQVRFX1NUT1BQSU5HOwotICB9Ci0gIC8qIEF0IHRoaXMgcG9pbnQgd2Ugc2hvdWxkIGJlIGluIHN0YXRlIERTVEFURV9TVE9QUElORyBpZiBiZWluZyB1c2VkCi0gICAqIHN0YW5kYWxvbmUsIG9yIGluIHN0YXRlIERTVEFURV9CVUZJTUFHRSBpZiBiZWluZyBpbnZva2VkIHRvIGdldCBhY2Nlc3MKLSAgICogdG8gdGhlIGNvZWZmaWNpZW50cyBkdXJpbmcgYSBmdWxsIGJ1ZmZlcmVkLWltYWdlLW1vZGUgZGVjb21wcmVzc2lvbi4KLSAgICovCi0gIGlmICgoY2luZm8tPmdsb2JhbF9zdGF0ZSA9PSBEU1RBVEVfU1RPUFBJTkcgfHwKLSAgICAgICBjaW5mby0+Z2xvYmFsX3N0YXRlID09IERTVEFURV9CVUZJTUFHRSkgJiYgY2luZm8tPmJ1ZmZlcmVkX2ltYWdlKSB7Ci0gICAgcmV0dXJuIGNpbmZvLT5jb2VmLT5jb2VmX2FycmF5czsKLSAgfQotICAvKiBPb3BzLCBpbXByb3BlciB1c2FnZSAqLwotICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfU1RBVEUsIGNpbmZvLT5nbG9iYWxfc3RhdGUpOwotICByZXR1cm4gTlVMTDsJCQkvKiBrZWVwIGNvbXBpbGVyIGhhcHB5ICovCi19Ci0KLQotLyoKLSAqIE1hc3RlciBzZWxlY3Rpb24gb2YgZGVjb21wcmVzc2lvbiBtb2R1bGVzIGZvciB0cmFuc2NvZGluZy4KLSAqIFRoaXMgc3Vic3RpdHV0ZXMgZm9yIGpkbWFzdGVyLmMncyBpbml0aWFsaXphdGlvbiBvZiB0aGUgZnVsbCBkZWNvbXByZXNzb3IuCi0gKi8KLQotTE9DQUwodm9pZCkKLXRyYW5zZGVjb2RlX21hc3Rlcl9zZWxlY3Rpb24gKGpfZGVjb21wcmVzc19wdHIgY2luZm8pCi17Ci0gIC8qIFRoaXMgaXMgZWZmZWN0aXZlbHkgYSBidWZmZXJlZC1pbWFnZSBvcGVyYXRpb24uICovCi0gIGNpbmZvLT5idWZmZXJlZF9pbWFnZSA9IFRSVUU7Ci0KLSAgLyogRW50cm9weSBkZWNvZGluZzogZWl0aGVyIEh1ZmZtYW4gb3IgYXJpdGhtZXRpYyBjb2RpbmcuICovCi0gIGlmIChjaW5mby0+YXJpdGhfY29kZSkgewotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQVJJVEhfTk9USU1QTCk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGNpbmZvLT5wcm9ncmVzc2l2ZV9tb2RlKSB7Ci0jaWZkZWYgRF9QUk9HUkVTU0lWRV9TVVBQT1JURUQKLSAgICAgIGppbml0X3BodWZmX2RlY29kZXIoY2luZm8pOwotI2Vsc2UKLSAgICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfTk9UX0NPTVBJTEVEKTsKLSNlbmRpZgotICAgIH0gZWxzZQotICAgICAgamluaXRfaHVmZl9kZWNvZGVyKGNpbmZvKTsKLSAgfQotCi0gIC8qIEFsd2F5cyBnZXQgYSBmdWxsLWltYWdlIGNvZWZmaWNpZW50IGJ1ZmZlci4gKi8KLSAgamluaXRfZF9jb2VmX2NvbnRyb2xsZXIoY2luZm8sIFRSVUUpOwotCi0gIC8qIFdlIGNhbiBub3cgdGVsbCB0aGUgbWVtb3J5IG1hbmFnZXIgdG8gYWxsb2NhdGUgdmlydHVhbCBhcnJheXMuICovCi0gICgqY2luZm8tPm1lbS0+cmVhbGl6ZV92aXJ0X2FycmF5cykgKChqX2NvbW1vbl9wdHIpIGNpbmZvKTsKLQotICAvKiBJbml0aWFsaXplIGlucHV0IHNpZGUgb2YgZGVjb21wcmVzc29yIHRvIGNvbnN1bWUgZmlyc3Qgc2Nhbi4gKi8KLSAgKCpjaW5mby0+aW5wdXRjdGwtPnN0YXJ0X2lucHV0X3Bhc3MpIChjaW5mbyk7Ci0KLSAgLyogSW5pdGlhbGl6ZSBwcm9ncmVzcyBtb25pdG9yaW5nLiAqLwotICBpZiAoY2luZm8tPnByb2dyZXNzICE9IE5VTEwpIHsKLSAgICBpbnQgbnNjYW5zOwotICAgIC8qIEVzdGltYXRlIG51bWJlciBvZiBzY2FucyB0byBzZXQgcGFzc19saW1pdC4gKi8KLSAgICBpZiAoY2luZm8tPnByb2dyZXNzaXZlX21vZGUpIHsKLSAgICAgIC8qIEFyYml0cmFyaWx5IGVzdGltYXRlIDIgaW50ZXJsZWF2ZWQgREMgc2NhbnMgKyAzIEFDIHNjYW5zL2NvbXBvbmVudC4gKi8KLSAgICAgIG5zY2FucyA9IDIgKyAzICogY2luZm8tPm51bV9jb21wb25lbnRzOwotICAgIH0gZWxzZSBpZiAoY2luZm8tPmlucHV0Y3RsLT5oYXNfbXVsdGlwbGVfc2NhbnMpIHsKLSAgICAgIC8qIEZvciBhIG5vbnByb2dyZXNzaXZlIG11bHRpc2NhbiBmaWxlLCBlc3RpbWF0ZSAxIHNjYW4gcGVyIGNvbXBvbmVudC4gKi8KLSAgICAgIG5zY2FucyA9IGNpbmZvLT5udW1fY29tcG9uZW50czsKLSAgICB9IGVsc2UgewotICAgICAgbnNjYW5zID0gMTsKLSAgICB9Ci0gICAgY2luZm8tPnByb2dyZXNzLT5wYXNzX2NvdW50ZXIgPSAwTDsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPnBhc3NfbGltaXQgPSAobG9uZykgY2luZm8tPnRvdGFsX2lNQ1Vfcm93cyAqIG5zY2FuczsKLSAgICBjaW5mby0+cHJvZ3Jlc3MtPmNvbXBsZXRlZF9wYXNzZXMgPSAwOwotICAgIGNpbmZvLT5wcm9ncmVzcy0+dG90YWxfcGFzc2VzID0gMTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2plcnJvci5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2plcnJvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGZiOWZlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZXJyb3IuYworKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKgotICogamVycm9yLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBzaW1wbGUgZXJyb3ItcmVwb3J0aW5nIGFuZCB0cmFjZS1tZXNzYWdlIHJvdXRpbmVzLgotICogVGhlc2UgYXJlIHN1aXRhYmxlIGZvciBVbml4LWxpa2Ugc3lzdGVtcyBhbmQgb3RoZXJzIHdoZXJlIHdyaXRpbmcgdG8KLSAqIHN0ZGVyciBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8uICBNYW55IGFwcGxpY2F0aW9ucyB3aWxsIHdhbnQgdG8gcmVwbGFjZQotICogc29tZSBvciBhbGwgb2YgdGhlc2Ugcm91dGluZXMuCi0gKgotICogVGhlc2Ugcm91dGluZXMgYXJlIHVzZWQgYnkgYm90aCB0aGUgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gY29kZS4KLSAqLwotCi0vKiB0aGlzIGlzIG5vdCBhIGNvcmUgbGlicmFyeSBtb2R1bGUsIHNvIGl0IGRvZXNuJ3QgZGVmaW5lIEpQRUdfSU5URVJOQUxTICovCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAianZlcnNpb24uaCIKLSNpbmNsdWRlICJqZXJyb3IuaCIKLQotI2lmbmRlZiBFWElUX0ZBSUxVUkUJCS8qIGRlZmluZSBleGl0KCkgY29kZXMgaWYgbm90IHByb3ZpZGVkICovCi0jZGVmaW5lIEVYSVRfRkFJTFVSRSAgMQotI2VuZGlmCi0KLQotLyoKLSAqIENyZWF0ZSB0aGUgbWVzc2FnZSBzdHJpbmcgdGFibGUuCi0gKiBXZSBkbyB0aGlzIGZyb20gdGhlIG1hc3RlciBtZXNzYWdlIGxpc3QgaW4gamVycm9yLmggYnkgcmUtcmVhZGluZwotICogamVycm9yLmggd2l0aCBhIHN1aXRhYmxlIGRlZmluaXRpb24gZm9yIG1hY3JvIEpNRVNTQUdFLgotICogVGhlIG1lc3NhZ2UgdGFibGUgaXMgbWFkZSBhbiBleHRlcm5hbCBzeW1ib2wganVzdCBpbiBjYXNlIGFueSBhcHBsaWNhdGlvbnMKLSAqIHdhbnQgdG8gcmVmZXIgdG8gaXQgZGlyZWN0bHkuCi0gKi8KLQotI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSNkZWZpbmUganBlZ19zdGRfbWVzc2FnZV90YWJsZQlqTXNnVGFibGUKLSNlbmRpZgotCi0jZGVmaW5lIEpNRVNTQUdFKGNvZGUsc3RyaW5nKQlzdHJpbmcgLAotCi1jb25zdCBjaGFyICogY29uc3QganBlZ19zdGRfbWVzc2FnZV90YWJsZVtdID0gewotI2luY2x1ZGUgImplcnJvci5oIgotICBOVUxMCi19OwotCi0KLS8qCi0gKiBFcnJvciBleGl0IGhhbmRsZXI6IG11c3Qgbm90IHJldHVybiB0byBjYWxsZXIuCi0gKgotICogQXBwbGljYXRpb25zIG1heSBvdmVycmlkZSB0aGlzIGlmIHRoZXkgd2FudCB0byBnZXQgY29udHJvbCBiYWNrIGFmdGVyCi0gKiBhbiBlcnJvci4gIFR5cGljYWxseSBvbmUgd291bGQgbG9uZ2ptcCBzb21ld2hlcmUgaW5zdGVhZCBvZiBleGl0aW5nLgotICogVGhlIHNldGptcCBidWZmZXIgY2FuIGJlIG1hZGUgYSBwcml2YXRlIGZpZWxkIHdpdGhpbiBhbiBleHBhbmRlZCBlcnJvcgotICogaGFuZGxlciBvYmplY3QuICBOb3RlIHRoYXQgdGhlIGluZm8gbmVlZGVkIHRvIGdlbmVyYXRlIGFuIGVycm9yIG1lc3NhZ2UKLSAqIGlzIHN0b3JlZCBpbiB0aGUgZXJyb3Igb2JqZWN0LCBzbyB5b3UgY2FuIGdlbmVyYXRlIHRoZSBtZXNzYWdlIG5vdyBvcgotICogbGF0ZXIsIGF0IHlvdXIgY29udmVuaWVuY2UuCi0gKiBZb3Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGF0IHRoZSBKUEVHIG9iamVjdCBpcyBjbGVhbmVkIHVwICh3aXRoIGpwZWdfYWJvcnQKLSAqIG9yIGpwZWdfZGVzdHJveSkgYXQgc29tZSBwb2ludC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWVycm9yX2V4aXQgKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgLyogQWx3YXlzIGRpc3BsYXkgdGhlIG1lc3NhZ2UgKi8KLSAgKCpjaW5mby0+ZXJyLT5vdXRwdXRfbWVzc2FnZSkgKGNpbmZvKTsKLQotICAvKiBMZXQgdGhlIG1lbW9yeSBtYW5hZ2VyIGRlbGV0ZSBhbnkgdGVtcCBmaWxlcyBiZWZvcmUgd2UgZGllICovCi0gIGpwZWdfZGVzdHJveShjaW5mbyk7Ci0KLS8vICBleGl0KEVYSVRfRkFJTFVSRSk7Ci19Ci0KLQotLyoKLSAqIEFjdHVhbCBvdXRwdXQgb2YgYW4gZXJyb3Igb3IgdHJhY2UgbWVzc2FnZS4KLSAqIEFwcGxpY2F0aW9ucyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gc2VuZCBKUEVHIG1lc3NhZ2VzIHNvbWV3aGVyZQotICogb3RoZXIgdGhhbiBzdGRlcnIuCi0gKgotICogT24gV2luZG93cywgcHJpbnRpbmcgdG8gc3RkZXJyIGlzIGdlbmVyYWxseSBjb21wbGV0ZWx5IHVzZWxlc3MsCi0gKiBzbyB3ZSBwcm92aWRlIG9wdGlvbmFsIGNvZGUgdG8gcHJvZHVjZSBhbiBlcnJvci1kaWFsb2cgcG9wdXAuCi0gKiBNb3N0IFdpbmRvd3MgYXBwbGljYXRpb25zIHdpbGwgc3RpbGwgcHJlZmVyIHRvIG92ZXJyaWRlIHRoaXMgcm91dGluZSwKLSAqIGJ1dCBpZiB0aGV5IGRvbid0LCBpdCdsbCBkbyBzb21ldGhpbmcgYXQgbGVhc3QgbWFyZ2luYWxseSB1c2VmdWwuCi0gKgotICogTk9URTogdG8gdXNlIHRoZSBsaWJyYXJ5IGluIGFuIGVudmlyb25tZW50IHRoYXQgZG9lc24ndCBzdXBwb3J0IHRoZQotICogQyBzdGRpbyBsaWJyYXJ5LCB5b3UgbWF5IGhhdmUgdG8gZGVsZXRlIHRoZSBjYWxsIHRvIGZwcmludGYoKSBlbnRpcmVseSwKLSAqIG5vdCBqdXN0IG5vdCB1c2UgdGhpcyByb3V0aW5lLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotb3V0cHV0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbykKLXsKLSAgY2hhciBidWZmZXJbSk1TR19MRU5HVEhfTUFYXTsKLQotICAvKiBDcmVhdGUgdGhlIG1lc3NhZ2UgKi8KLSAgKCpjaW5mby0+ZXJyLT5mb3JtYXRfbWVzc2FnZSkgKGNpbmZvLCBidWZmZXIpOwotCi0gIC8qIFNlbmQgaXQgdG8gc3RkZXJyLCBhZGRpbmcgYSBuZXdsaW5lICovCi0gIEZYU1lTX2ZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGJ1ZmZlcik7Ci19Ci0KLQotLyoKLSAqIERlY2lkZSB3aGV0aGVyIHRvIGVtaXQgYSB0cmFjZSBvciB3YXJuaW5nIG1lc3NhZ2UuCi0gKiBtc2dfbGV2ZWwgaXMgb25lIG9mOgotICogICAtMTogcmVjb3ZlcmFibGUgY29ycnVwdC1kYXRhIHdhcm5pbmcsIG1heSB3YW50IHRvIGFib3J0LgotICogICAgMDogaW1wb3J0YW50IGFkdmlzb3J5IG1lc3NhZ2VzIChhbHdheXMgZGlzcGxheSB0byB1c2VyKS4KLSAqICAgIDE6IGZpcnN0IGxldmVsIG9mIHRyYWNpbmcgZGV0YWlsLgotICogICAgMiwzLC4uLjogc3VjY2Vzc2l2ZWx5IG1vcmUgZGV0YWlsZWQgdHJhY2luZyBtZXNzYWdlcy4KLSAqIEFuIGFwcGxpY2F0aW9uIG1pZ2h0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIGl0IHdhbnRlZCB0byBhYm9ydCBvbiB3YXJuaW5ncwotICogb3IgY2hhbmdlIHRoZSBwb2xpY3kgYWJvdXQgd2hpY2ggbWVzc2FnZXMgdG8gZGlzcGxheS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWVtaXRfbWVzc2FnZSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgbXNnX2xldmVsKQotewotICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIgPSBjaW5mby0+ZXJyOwotCi0gIGlmIChtc2dfbGV2ZWwgPCAwKSB7Ci0gICAgLyogSXQncyBhIHdhcm5pbmcgbWVzc2FnZS4gIFNpbmNlIGNvcnJ1cHQgZmlsZXMgbWF5IGdlbmVyYXRlIG1hbnkgd2FybmluZ3MsCi0gICAgICogdGhlIHBvbGljeSBpbXBsZW1lbnRlZCBoZXJlIGlzIHRvIHNob3cgb25seSB0aGUgZmlyc3Qgd2FybmluZywKLSAgICAgKiB1bmxlc3MgdHJhY2VfbGV2ZWwgPj0gMy4KLSAgICAgKi8KLSAgICBpZiAoZXJyLT5udW1fd2FybmluZ3MgPT0gMCB8fCBlcnItPnRyYWNlX2xldmVsID49IDMpCi0gICAgICAoKmVyci0+b3V0cHV0X21lc3NhZ2UpIChjaW5mbyk7Ci0gICAgLyogQWx3YXlzIGNvdW50IHdhcm5pbmdzIGluIG51bV93YXJuaW5ncy4gKi8KLSAgICBlcnItPm51bV93YXJuaW5ncysrOwotICB9IGVsc2UgewotICAgIC8qIEl0J3MgYSB0cmFjZSBtZXNzYWdlLiAgU2hvdyBpdCBpZiB0cmFjZV9sZXZlbCA+PSBtc2dfbGV2ZWwuICovCi0gICAgaWYgKGVyci0+dHJhY2VfbGV2ZWwgPj0gbXNnX2xldmVsKQotICAgICAgKCplcnItPm91dHB1dF9tZXNzYWdlKSAoY2luZm8pOwotICB9Ci19Ci0KLQotLyoKLSAqIEZvcm1hdCBhIG1lc3NhZ2Ugc3RyaW5nIGZvciB0aGUgbW9zdCByZWNlbnQgSlBFRyBlcnJvciBvciBtZXNzYWdlLgotICogVGhlIG1lc3NhZ2UgaXMgc3RvcmVkIGludG8gYnVmZmVyLCB3aGljaCBzaG91bGQgYmUgYXQgbGVhc3QgSk1TR19MRU5HVEhfTUFYCi0gKiBjaGFyYWN0ZXJzLiAgTm90ZSB0aGF0IG5vICdcbicgY2hhcmFjdGVyIGlzIGFkZGVkIHRvIHRoZSBzdHJpbmcuCi0gKiBGZXcgYXBwbGljYXRpb25zIHNob3VsZCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgotICovCi0KLU1FVEhPRERFRih2b2lkKQotZm9ybWF0X21lc3NhZ2UgKGpfY29tbW9uX3B0ciBjaW5mbywgY2hhciAqIGJ1ZmZlcikKLXsKLSNpZiAwCS8qIFhZUSAqLwotICBzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIgPSBjaW5mby0+ZXJyOwotICBpbnQgbXNnX2NvZGUgPSBlcnItPm1zZ19jb2RlOwotICBjb25zdCBjaGFyICogbXNndGV4dCA9IE5VTEw7Ci0gIGNvbnN0IGNoYXIgKiBtc2dwdHI7Ci0gIGNoYXIgY2g7Ci0gIGJvb2xlYW4gaXNzdHJpbmc7Ci0KLSAgLyogTG9vayB1cCBtZXNzYWdlIHN0cmluZyBpbiBwcm9wZXIgdGFibGUgKi8KLSAgaWYgKG1zZ19jb2RlID4gMCAmJiBtc2dfY29kZSA8PSBlcnItPmxhc3RfanBlZ19tZXNzYWdlKSB7Ci0gICAgbXNndGV4dCA9IGVyci0+anBlZ19tZXNzYWdlX3RhYmxlW21zZ19jb2RlXTsKLSAgfSBlbHNlIGlmIChlcnItPmFkZG9uX21lc3NhZ2VfdGFibGUgIT0gTlVMTCAmJgotCSAgICAgbXNnX2NvZGUgPj0gZXJyLT5maXJzdF9hZGRvbl9tZXNzYWdlICYmCi0JICAgICBtc2dfY29kZSA8PSBlcnItPmxhc3RfYWRkb25fbWVzc2FnZSkgewotICAgIG1zZ3RleHQgPSBlcnItPmFkZG9uX21lc3NhZ2VfdGFibGVbbXNnX2NvZGUgLSBlcnItPmZpcnN0X2FkZG9uX21lc3NhZ2VdOwotICB9Ci0KLSAgLyogRGVmZW5kIGFnYWluc3QgYm9ndXMgbWVzc2FnZSBudW1iZXIgKi8KLSAgaWYgKG1zZ3RleHQgPT0gTlVMTCkgewotICAgIGVyci0+bXNnX3Bhcm0uaVswXSA9IG1zZ19jb2RlOwotICAgIG1zZ3RleHQgPSBlcnItPmpwZWdfbWVzc2FnZV90YWJsZVswXTsKLSAgfQotCi0gIC8qIENoZWNrIGZvciBzdHJpbmcgcGFyYW1ldGVyLCBhcyBpbmRpY2F0ZWQgYnkgJXMgaW4gdGhlIG1lc3NhZ2UgdGV4dCAqLwotICBpc3N0cmluZyA9IEZBTFNFOwotICBtc2dwdHIgPSBtc2d0ZXh0OwotICB3aGlsZSAoKGNoID0gKm1zZ3B0cisrKSAhPSAnXDAnKSB7Ci0gICAgaWYgKGNoID09ICclJykgewotICAgICAgaWYgKCptc2dwdHIgPT0gJ3MnKSBpc3N0cmluZyA9IFRSVUU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvKiBGb3JtYXQgdGhlIG1lc3NhZ2UgaW50byB0aGUgcGFzc2VkIGJ1ZmZlciAqLwotICBpZiAoaXNzdHJpbmcpCi0gICAgc3ByaW50ZihidWZmZXIsIG1zZ3RleHQsIGVyci0+bXNnX3Bhcm0ucyk7Ci0gIGVsc2UKLSAgICBzcHJpbnRmKGJ1ZmZlciwgbXNndGV4dCwKLQkgICAgZXJyLT5tc2dfcGFybS5pWzBdLCBlcnItPm1zZ19wYXJtLmlbMV0sCi0JICAgIGVyci0+bXNnX3Bhcm0uaVsyXSwgZXJyLT5tc2dfcGFybS5pWzNdLAotCSAgICBlcnItPm1zZ19wYXJtLmlbNF0sIGVyci0+bXNnX3Bhcm0uaVs1XSwKLQkgICAgZXJyLT5tc2dfcGFybS5pWzZdLCBlcnItPm1zZ19wYXJtLmlbN10pOwotI2VuZGlmCi19Ci0KLQotLyoKLSAqIFJlc2V0IGVycm9yIHN0YXRlIHZhcmlhYmxlcyBhdCBzdGFydCBvZiBhIG5ldyBpbWFnZS4KLSAqIFRoaXMgaXMgY2FsbGVkIGR1cmluZyBjb21wcmVzc2lvbiBzdGFydHVwIHRvIHJlc2V0IHRyYWNlL2Vycm9yCi0gKiBwcm9jZXNzaW5nIHRvIGRlZmF1bHQgc3RhdGUsIHdpdGhvdXQgbG9zaW5nIGFueSBhcHBsaWNhdGlvbi1zcGVjaWZpYwotICogbWV0aG9kIHBvaW50ZXJzLiAgQW4gYXBwbGljYXRpb24gbWlnaHQgcG9zc2libHkgd2FudCB0byBvdmVycmlkZQotICogdGhpcyBtZXRob2QgaWYgaXQgaGFzIGFkZGl0aW9uYWwgZXJyb3IgcHJvY2Vzc2luZyBzdGF0ZS4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLXJlc2V0X2Vycm9yX21nciAoal9jb21tb25fcHRyIGNpbmZvKQotewotICBjaW5mby0+ZXJyLT5udW1fd2FybmluZ3MgPSAwOwotICAvKiB0cmFjZV9sZXZlbCBpcyBub3QgcmVzZXQgc2luY2UgaXQgaXMgYW4gYXBwbGljYXRpb24tc3VwcGxpZWQgcGFyYW1ldGVyICovCi0gIGNpbmZvLT5lcnItPm1zZ19jb2RlID0gMDsJLyogbWF5IGJlIHVzZWZ1bCBhcyBhIGZsYWcgZm9yICJubyBlcnJvciIgKi8KLX0KLQotCi0vKgotICogRmlsbCBpbiB0aGUgc3RhbmRhcmQgZXJyb3ItaGFuZGxpbmcgbWV0aG9kcyBpbiBhIGpwZWdfZXJyb3JfbWdyIG9iamVjdC4KLSAqIFR5cGljYWwgY2FsbCBpczoKLSAqCXN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbzsKLSAqCXN0cnVjdCBqcGVnX2Vycm9yX21nciBlcnI7Ci0gKgotICoJY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmVycik7Ci0gKiBhZnRlciB3aGljaCB0aGUgYXBwbGljYXRpb24gbWF5IG92ZXJyaWRlIHNvbWUgb2YgdGhlIG1ldGhvZHMuCi0gKi8KLQotR0xPQkFMKHN0cnVjdCBqcGVnX2Vycm9yX21nciAqKQotanBlZ19zdGRfZXJyb3IgKHN0cnVjdCBqcGVnX2Vycm9yX21nciAqIGVycikKLXsKLSAgZXJyLT5lcnJvcl9leGl0ID0gZXJyb3JfZXhpdDsKLSAgZXJyLT5lbWl0X21lc3NhZ2UgPSBlbWl0X21lc3NhZ2U7Ci0gIGVyci0+b3V0cHV0X21lc3NhZ2UgPSBvdXRwdXRfbWVzc2FnZTsKLSAgZXJyLT5mb3JtYXRfbWVzc2FnZSA9IGZvcm1hdF9tZXNzYWdlOwotICBlcnItPnJlc2V0X2Vycm9yX21nciA9IHJlc2V0X2Vycm9yX21ncjsKLQotICBlcnItPnRyYWNlX2xldmVsID0gMDsJCS8qIGRlZmF1bHQgPSBubyB0cmFjaW5nICovCi0gIGVyci0+bnVtX3dhcm5pbmdzID0gMDsJLyogbm8gd2FybmluZ3MgZW1pdHRlZCB5ZXQgKi8KLSAgZXJyLT5tc2dfY29kZSA9IDA7CQkvKiBtYXkgYmUgdXNlZnVsIGFzIGEgZmxhZyBmb3IgIm5vIGVycm9yIiAqLwotCi0gIC8qIEluaXRpYWxpemUgbWVzc2FnZSB0YWJsZSBwb2ludGVycyAqLwotICBlcnItPmpwZWdfbWVzc2FnZV90YWJsZSA9IGpwZWdfc3RkX21lc3NhZ2VfdGFibGU7Ci0gIGVyci0+bGFzdF9qcGVnX21lc3NhZ2UgPSAoaW50KSBKTVNHX0xBU1RNU0dDT0RFIC0gMTsKLQotICBlcnItPmFkZG9uX21lc3NhZ2VfdGFibGUgPSBOVUxMOwotICBlcnItPmZpcnN0X2FkZG9uX21lc3NhZ2UgPSAwOwkvKiBmb3Igc2FmZXR5ICovCi0gIGVyci0+bGFzdF9hZGRvbl9tZXNzYWdlID0gMDsKLQotICByZXR1cm4gZXJyOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pmZGN0ZnN0LmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamZkY3Rmc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiMzc4YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamZkY3Rmc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKgotICogamZkY3Rmc3QuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgZmFzdCwgbm90IHNvIGFjY3VyYXRlIGludGVnZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gKiBmb3J3YXJkIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuCi0gKgotICogQSAyLUQgRENUIGNhbiBiZSBkb25lIGJ5IDEtRCBEQ1Qgb24gZWFjaCByb3cgZm9sbG93ZWQgYnkgMS1EIERDVAotICogb24gZWFjaCBjb2x1bW4uICBEaXJlY3QgYWxnb3JpdGhtcyBhcmUgYWxzbyBhdmFpbGFibGUsIGJ1dCB0aGV5IGFyZQotICogbXVjaCBtb3JlIGNvbXBsZXggYW5kIHNlZW0gbm90IHRvIGJlIGFueSBmYXN0ZXIgd2hlbiByZWR1Y2VkIHRvIGNvZGUuCi0gKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBBcmFpLCBBZ3VpLCBhbmQgTmFrYWppbWEncyBhbGdvcml0aG0gZm9yCi0gKiBzY2FsZWQgRENULiAgVGhlaXIgb3JpZ2luYWwgcGFwZXIgKFRyYW5zLiBJRUlDRSBFLTcxKDExKToxMDk1KSBpcyBpbgotICogSmFwYW5lc2UsIGJ1dCB0aGUgYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiB0aGUgUGVubmViYWtlciAmIE1pdGNoZWxsCi0gKiBKUEVHIHRleHRib29rIChzZWUgUkVGRVJFTkNFUyBzZWN0aW9uIGluIGZpbGUgUkVBRE1FKS4gIFRoZSBmb2xsb3dpbmcgY29kZQotICogaXMgYmFzZWQgZGlyZWN0bHkgb24gZmlndXJlIDQtOCBpbiBQJk0uCi0gKiBXaGlsZSBhbiA4LXBvaW50IERDVCBjYW5ub3QgYmUgZG9uZSBpbiBsZXNzIHRoYW4gMTEgbXVsdGlwbGllcywgaXQgaXMKLSAqIHBvc3NpYmxlIHRvIGFycmFuZ2UgdGhlIGNvbXB1dGF0aW9uIHNvIHRoYXQgbWFueSBvZiB0aGUgbXVsdGlwbGllcyBhcmUKLSAqIHNpbXBsZSBzY2FsaW5ncyBvZiB0aGUgZmluYWwgb3V0cHV0cy4gIFRoZXNlIG11bHRpcGxpZXMgY2FuIHRoZW4gYmUKLSAqIGZvbGRlZCBpbnRvIHRoZSBtdWx0aXBsaWNhdGlvbnMgb3IgZGl2aXNpb25zIGJ5IHRoZSBKUEVHIHF1YW50aXphdGlvbgotICogdGFibGUgZW50cmllcy4gIFRoZSBBQSZOIG1ldGhvZCBsZWF2ZXMgb25seSA1IG11bHRpcGxpZXMgYW5kIDI5IGFkZHMKLSAqIHRvIGJlIGRvbmUgaW4gdGhlIERDVCBpdHNlbGYuCi0gKiBUaGUgcHJpbWFyeSBkaXNhZHZhbnRhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgdGhhdCB3aXRoIGZpeGVkLXBvaW50IG1hdGgsCi0gKiBhY2N1cmFjeSBpcyBsb3N0IGR1ZSB0byBpbXByZWNpc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjYWxlZAotICogcXVhbnRpemF0aW9uIHZhbHVlcy4gIFRoZSBzbWFsbGVyIHRoZSBxdWFudGl6YXRpb24gdGFibGUgZW50cnksIHRoZSBsZXNzCi0gKiBwcmVjaXNlIHRoZSBzY2FsZWQgdmFsdWUsIHNvIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyB3b3JzZSB3aXRoIGhpZ2gtCi0gKiBxdWFsaXR5LXNldHRpbmcgZmlsZXMgdGhhbiB3aXRoIGxvdy1xdWFsaXR5IG9uZXMuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCi0KLSNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0KLQotLyoKLSAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotICovCi0KLSNpZiBEQ1RTSVpFICE9IDgKLSAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLwotI2VuZGlmCi0KLQotLyogU2NhbGluZyBkZWNpc2lvbnMgYXJlIGdlbmVyYWxseSB0aGUgc2FtZSBhcyBpbiB0aGUgTEwmTSBhbGdvcml0aG07Ci0gKiBzZWUgamZkY3RpbnQuYyBmb3IgbW9yZSBkZXRhaWxzLiAgSG93ZXZlciwgd2UgY2hvb3NlIHRvIGRlc2NhbGUKLSAqIChyaWdodCBzaGlmdCkgbXVsdGlwbGljYXRpb24gcHJvZHVjdHMgYXMgc29vbiBhcyB0aGV5IGFyZSBmb3JtZWQsCi0gKiByYXRoZXIgdGhhbiBjYXJyeWluZyBhZGRpdGlvbmFsIGZyYWN0aW9uYWwgYml0cyBpbnRvIHN1YnNlcXVlbnQgYWRkaXRpb25zLgotICogVGhpcyBjb21wcm9taXNlcyBhY2N1cmFjeSBzbGlnaHRseSwgYnV0IGl0IGxldHMgdXMgc2F2ZSBhIGZldyBzaGlmdHMuCi0gKiBNb3JlIGltcG9ydGFudGx5LCAxNi1iaXQgYXJpdGhtZXRpYyBpcyB0aGVuIGFkZXF1YXRlIChmb3IgOC1iaXQgc2FtcGxlcykKLSAqIGV2ZXJ5d2hlcmUgZXhjZXB0IGluIHRoZSBtdWx0aXBsaWNhdGlvbnMgcHJvcGVyOyB0aGlzIHNhdmVzIGEgZ29vZCBkZWFsCi0gKiBvZiB3b3JrIG9uIDE2LWJpdC1pbnQgbWFjaGluZXMuCi0gKgotICogQWdhaW4gdG8gc2F2ZSBhIGZldyBzaGlmdHMsIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBiZXR3ZWVuIHBhc3MgMSBhbmQKLSAqIHBhc3MgMiBhcmUgbm90IHVwc2NhbGVkLCBidXQgYXJlIHJlcHJlc2VudGVkIG9ubHkgdG8gaW50ZWdyYWwgcHJlY2lzaW9uLgotICoKLSAqIEEgZmluYWwgY29tcHJvbWlzZSBpcyB0byByZXByZXNlbnQgdGhlIG11bHRpcGxpY2F0aXZlIGNvbnN0YW50cyB0byBvbmx5Ci0gKiA4IGZyYWN0aW9uYWwgYml0cywgcmF0aGVyIHRoYW4gMTMuICBUaGlzIHNhdmVzIHNvbWUgc2hpZnRpbmcgd29yayBvbiBzb21lCi0gKiBtYWNoaW5lcywgYW5kIG1heSBhbHNvIHJlZHVjZSB0aGUgY29zdCBvZiBtdWx0aXBsaWNhdGlvbiAoc2luY2UgdGhlcmUKLSAqIGFyZSBmZXdlciBvbmUtYml0cyBpbiB0aGUgY29uc3RhbnRzKS4KLSAqLwotCi0jZGVmaW5lIENPTlNUX0JJVFMgIDgKLQotCi0vKiBTb21lIEMgY29tcGlsZXJzIGZhaWwgdG8gcmVkdWNlICJGSVgoY29uc3RhbnQpIiBhdCBjb21waWxlIHRpbWUsIHRodXMKLSAqIGNhdXNpbmcgYSBsb3Qgb2YgdXNlbGVzcyBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIGF0IHJ1biB0aW1lLgotICogVG8gZ2V0IGFyb3VuZCB0aGlzIHdlIHVzZSB0aGUgZm9sbG93aW5nIHByZS1jYWxjdWxhdGVkIGNvbnN0YW50cy4KLSAqIElmIHlvdSBjaGFuZ2UgQ09OU1RfQklUUyB5b3UgbWF5IHdhbnQgdG8gYWRkIGFwcHJvcHJpYXRlIHZhbHVlcy4KLSAqIChXaXRoIGEgcmVhc29uYWJsZSBDIGNvbXBpbGVyLCB5b3UgY2FuIGp1c3QgcmVseSBvbiB0aGUgRklYKCkgbWFjcm8uLi4pCi0gKi8KLQotI2lmIENPTlNUX0JJVFMgPT0gOAotI2RlZmluZSBGSVhfMF8zODI2ODM0MzMgICgoSU5UMzIpICAgOTgpCQkvKiBGSVgoMC4zODI2ODM0MzMpICovCi0jZGVmaW5lIEZJWF8wXzU0MTE5NjEwMCAgKChJTlQzMikgIDEzOSkJCS8qIEZJWCgwLjU0MTE5NjEwMCkgKi8KLSNkZWZpbmUgRklYXzBfNzA3MTA2NzgxICAoKElOVDMyKSAgMTgxKQkJLyogRklYKDAuNzA3MTA2NzgxKSAqLwotI2RlZmluZSBGSVhfMV8zMDY1NjI5NjUgICgoSU5UMzIpICAzMzQpCQkvKiBGSVgoMS4zMDY1NjI5NjUpICovCi0jZWxzZQotI2RlZmluZSBGSVhfMF8zODI2ODM0MzMgIEZJWCgwLjM4MjY4MzQzMykKLSNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICBGSVgoMC41NDExOTYxMDApCi0jZGVmaW5lIEZJWF8wXzcwNzEwNjc4MSAgRklYKDAuNzA3MTA2NzgxKQotI2RlZmluZSBGSVhfMV8zMDY1NjI5NjUgIEZJWCgxLjMwNjU2Mjk2NSkKLSNlbmRpZgotCi0KLS8qIFdlIGNhbiBnYWluIGEgbGl0dGxlIG1vcmUgc3BlZWQsIHdpdGggYSBmdXJ0aGVyIGNvbXByb21pc2UgaW4gYWNjdXJhY3ksCi0gKiBieSBvbWl0dGluZyB0aGUgYWRkaXRpb24gaW4gYSBkZXNjYWxpbmcgc2hpZnQuICBUaGlzIHlpZWxkcyBhbiBpbmNvcnJlY3RseQotICogcm91bmRlZCByZXN1bHQgaGFsZiB0aGUgdGltZS4uLgotICovCi0KLSNpZm5kZWYgVVNFX0FDQ1VSQVRFX1JPVU5ESU5HCi0jdW5kZWYgREVTQ0FMRQotI2RlZmluZSBERVNDQUxFKHgsbikgIFJJR0hUX1NISUZUKHgsIG4pCi0jZW5kaWYKLQotCi0vKiBNdWx0aXBseSBhIERDVEVMRU0gdmFyaWFibGUgYnkgYW4gSU5UMzIgY29uc3RhbnQsIGFuZCBpbW1lZGlhdGVseQotICogZGVzY2FsZSB0byB5aWVsZCBhIERDVEVMRU0gcmVzdWx0LgotICovCi0KLSNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgKChEQ1RFTEVNKSBERVNDQUxFKCh2YXIpICogKGNvbnN0KSwgQ09OU1RfQklUUykpCi0KLQotLyoKLSAqIFBlcmZvcm0gdGhlIGZvcndhcmQgRENUIG9uIG9uZSBibG9jayBvZiBzYW1wbGVzLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19mZGN0X2lmYXN0IChEQ1RFTEVNICogZGF0YSkKLXsKLSAgRENURUxFTSB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OwotICBEQ1RFTEVNIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOwotICBEQ1RFTEVNIHoxLCB6MiwgejMsIHo0LCB6NSwgejExLCB6MTM7Ci0gIERDVEVMRU0gKmRhdGFwdHI7Ci0gIGludCBjdHI7Ci0gIFNISUZUX1RFTVBTCi0KLSAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCi0KLSAgZGF0YXB0ciA9IGRhdGE7Ci0gIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKLSAgICB0bXAwID0gZGF0YXB0clswXSArIGRhdGFwdHJbN107Ci0gICAgdG1wNyA9IGRhdGFwdHJbMF0gLSBkYXRhcHRyWzddOwotICAgIHRtcDEgPSBkYXRhcHRyWzFdICsgZGF0YXB0cls2XTsKLSAgICB0bXA2ID0gZGF0YXB0clsxXSAtIGRhdGFwdHJbNl07Ci0gICAgdG1wMiA9IGRhdGFwdHJbMl0gKyBkYXRhcHRyWzVdOwotICAgIHRtcDUgPSBkYXRhcHRyWzJdIC0gZGF0YXB0cls1XTsKLSAgICB0bXAzID0gZGF0YXB0clszXSArIGRhdGFwdHJbNF07Ci0gICAgdG1wNCA9IGRhdGFwdHJbM10gLSBkYXRhcHRyWzRdOwotICAgIAotICAgIC8qIEV2ZW4gcGFydCAqLwotICAgIAotICAgIHRtcDEwID0gdG1wMCArIHRtcDM7CS8qIHBoYXNlIDIgKi8KLSAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOwotICAgIHRtcDExID0gdG1wMSArIHRtcDI7Ci0gICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKLSAgICAKLSAgICBkYXRhcHRyWzBdID0gdG1wMTAgKyB0bXAxMTsgLyogcGhhc2UgMyAqLwotICAgIGRhdGFwdHJbNF0gPSB0bXAxMCAtIHRtcDExOwotICAgIAotICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNzA3MTA2NzgxKTsgLyogYzQgKi8KLSAgICBkYXRhcHRyWzJdID0gdG1wMTMgKyB6MTsJLyogcGhhc2UgNSAqLwotICAgIGRhdGFwdHJbNl0gPSB0bXAxMyAtIHoxOwotICAgIAotICAgIC8qIE9kZCBwYXJ0ICovCi0KLSAgICB0bXAxMCA9IHRtcDQgKyB0bXA1OwkvKiBwaGFzZSAyICovCi0gICAgdG1wMTEgPSB0bXA1ICsgdG1wNjsKLSAgICB0bXAxMiA9IHRtcDYgKyB0bXA3OwotCi0gICAgLyogVGhlIHJvdGF0b3IgaXMgbW9kaWZpZWQgZnJvbSBmaWcgNC04IHRvIGF2b2lkIGV4dHJhIG5lZ2F0aW9ucy4gKi8KLSAgICB6NSA9IE1VTFRJUExZKHRtcDEwIC0gdG1wMTIsIEZJWF8wXzM4MjY4MzQzMyk7IC8qIGM2ICovCi0gICAgejIgPSBNVUxUSVBMWSh0bXAxMCwgRklYXzBfNTQxMTk2MTAwKSArIHo1OyAvKiBjMi1jNiAqLwotICAgIHo0ID0gTVVMVElQTFkodG1wMTIsIEZJWF8xXzMwNjU2Mjk2NSkgKyB6NTsgLyogYzIrYzYgKi8KLSAgICB6MyA9IE1VTFRJUExZKHRtcDExLCBGSVhfMF83MDcxMDY3ODEpOyAvKiBjNCAqLwotCi0gICAgejExID0gdG1wNyArIHozOwkJLyogcGhhc2UgNSAqLwotICAgIHoxMyA9IHRtcDcgLSB6MzsKLQotICAgIGRhdGFwdHJbNV0gPSB6MTMgKyB6MjsJLyogcGhhc2UgNiAqLwotICAgIGRhdGFwdHJbM10gPSB6MTMgLSB6MjsKLSAgICBkYXRhcHRyWzFdID0gejExICsgejQ7Ci0gICAgZGF0YXB0cls3XSA9IHoxMSAtIHo0OwotCi0gICAgZGF0YXB0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCi0gIH0KLQotICAvKiBQYXNzIDI6IHByb2Nlc3MgY29sdW1ucy4gKi8KLQotICBkYXRhcHRyID0gZGF0YTsKLSAgZm9yIChjdHIgPSBEQ1RTSVpFLTE7IGN0ciA+PSAwOyBjdHItLSkgewotICAgIHRtcDAgPSBkYXRhcHRyW0RDVFNJWkUqMF0gKyBkYXRhcHRyW0RDVFNJWkUqN107Ci0gICAgdG1wNyA9IGRhdGFwdHJbRENUU0laRSowXSAtIGRhdGFwdHJbRENUU0laRSo3XTsKLSAgICB0bXAxID0gZGF0YXB0cltEQ1RTSVpFKjFdICsgZGF0YXB0cltEQ1RTSVpFKjZdOwotICAgIHRtcDYgPSBkYXRhcHRyW0RDVFNJWkUqMV0gLSBkYXRhcHRyW0RDVFNJWkUqNl07Ci0gICAgdG1wMiA9IGRhdGFwdHJbRENUU0laRSoyXSArIGRhdGFwdHJbRENUU0laRSo1XTsKLSAgICB0bXA1ID0gZGF0YXB0cltEQ1RTSVpFKjJdIC0gZGF0YXB0cltEQ1RTSVpFKjVdOwotICAgIHRtcDMgPSBkYXRhcHRyW0RDVFNJWkUqM10gKyBkYXRhcHRyW0RDVFNJWkUqNF07Ci0gICAgdG1wNCA9IGRhdGFwdHJbRENUU0laRSozXSAtIGRhdGFwdHJbRENUU0laRSo0XTsKLSAgICAKLSAgICAvKiBFdmVuIHBhcnQgKi8KLSAgICAKLSAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOwkvKiBwaGFzZSAyICovCi0gICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKLSAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOwotICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7Ci0gICAgCi0gICAgZGF0YXB0cltEQ1RTSVpFKjBdID0gdG1wMTAgKyB0bXAxMTsgLyogcGhhc2UgMyAqLwotICAgIGRhdGFwdHJbRENUU0laRSo0XSA9IHRtcDEwIC0gdG1wMTE7Ci0gICAgCi0gICAgejEgPSBNVUxUSVBMWSh0bXAxMiArIHRtcDEzLCBGSVhfMF83MDcxMDY3ODEpOyAvKiBjNCAqLwotICAgIGRhdGFwdHJbRENUU0laRSoyXSA9IHRtcDEzICsgejE7IC8qIHBoYXNlIDUgKi8KLSAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSB0bXAxMyAtIHoxOwotICAgIAotICAgIC8qIE9kZCBwYXJ0ICovCi0KLSAgICB0bXAxMCA9IHRtcDQgKyB0bXA1OwkvKiBwaGFzZSAyICovCi0gICAgdG1wMTEgPSB0bXA1ICsgdG1wNjsKLSAgICB0bXAxMiA9IHRtcDYgKyB0bXA3OwotCi0gICAgLyogVGhlIHJvdGF0b3IgaXMgbW9kaWZpZWQgZnJvbSBmaWcgNC04IHRvIGF2b2lkIGV4dHJhIG5lZ2F0aW9ucy4gKi8KLSAgICB6NSA9IE1VTFRJUExZKHRtcDEwIC0gdG1wMTIsIEZJWF8wXzM4MjY4MzQzMyk7IC8qIGM2ICovCi0gICAgejIgPSBNVUxUSVBMWSh0bXAxMCwgRklYXzBfNTQxMTk2MTAwKSArIHo1OyAvKiBjMi1jNiAqLwotICAgIHo0ID0gTVVMVElQTFkodG1wMTIsIEZJWF8xXzMwNjU2Mjk2NSkgKyB6NTsgLyogYzIrYzYgKi8KLSAgICB6MyA9IE1VTFRJUExZKHRtcDExLCBGSVhfMF83MDcxMDY3ODEpOyAvKiBjNCAqLwotCi0gICAgejExID0gdG1wNyArIHozOwkJLyogcGhhc2UgNSAqLwotICAgIHoxMyA9IHRtcDcgLSB6MzsKLQotICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IHoxMyArIHoyOyAvKiBwaGFzZSA2ICovCi0gICAgZGF0YXB0cltEQ1RTSVpFKjNdID0gejEzIC0gejI7Ci0gICAgZGF0YXB0cltEQ1RTSVpFKjFdID0gejExICsgejQ7Ci0gICAgZGF0YXB0cltEQ1RTSVpFKjddID0gejExIC0gejQ7Ci0KLSAgICBkYXRhcHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgY29sdW1uICovCi0gIH0KLX0KLQotI2VuZGlmIC8qIERDVF9JRkFTVF9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qZmRjdGludC5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pmZGN0aW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNzhiNjQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2pmZGN0aW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoKLSAqIGpmZGN0aW50LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhIHNsb3ctYnV0LWFjY3VyYXRlIGludGVnZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gKiBmb3J3YXJkIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuCi0gKgotICogQSAyLUQgRENUIGNhbiBiZSBkb25lIGJ5IDEtRCBEQ1Qgb24gZWFjaCByb3cgZm9sbG93ZWQgYnkgMS1EIERDVAotICogb24gZWFjaCBjb2x1bW4uICBEaXJlY3QgYWxnb3JpdGhtcyBhcmUgYWxzbyBhdmFpbGFibGUsIGJ1dCB0aGV5IGFyZQotICogbXVjaCBtb3JlIGNvbXBsZXggYW5kIHNlZW0gbm90IHRvIGJlIGFueSBmYXN0ZXIgd2hlbiByZWR1Y2VkIHRvIGNvZGUuCi0gKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBhbiBhbGdvcml0aG0gZGVzY3JpYmVkIGluCi0gKiAgIEMuIExvZWZmbGVyLCBBLiBMaWd0ZW5iZXJnIGFuZCBHLiBNb3NjaHl0eiwgIlByYWN0aWNhbCBGYXN0IDEtRCBEQ1QKLSAqICAgQWxnb3JpdGhtcyB3aXRoIDExIE11bHRpcGxpY2F0aW9ucyIsIFByb2MuIEludCdsLiBDb25mLiBvbiBBY291c3RpY3MsCi0gKiAgIFNwZWVjaCwgYW5kIFNpZ25hbCBQcm9jZXNzaW5nIDE5ODkgKElDQVNTUCAnODkpLCBwcC4gOTg4LTk5MS4KLSAqIFRoZSBwcmltYXJ5IGFsZ29yaXRobSBkZXNjcmliZWQgdGhlcmUgdXNlcyAxMSBtdWx0aXBsaWVzIGFuZCAyOSBhZGRzLgotICogV2UgdXNlIHRoZWlyIGFsdGVybmF0ZSBtZXRob2Qgd2l0aCAxMiBtdWx0aXBsaWVzIGFuZCAzMiBhZGRzLgotICogVGhlIGFkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IG5vIGRhdGEgcGF0aCBjb250YWlucyBtb3JlIHRoYW4gb25lCi0gKiBtdWx0aXBsaWNhdGlvbjsgdGhpcyBhbGxvd3MgYSB2ZXJ5IHNpbXBsZSBhbmQgYWNjdXJhdGUgaW1wbGVtZW50YXRpb24gaW4KLSAqIHNjYWxlZCBmaXhlZC1wb2ludCBhcml0aG1ldGljLCB3aXRoIGEgbWluaW1hbCBudW1iZXIgb2Ygc2hpZnRzLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLwotCi0jaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAotCi0KLS8qCi0gKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KLSAqLwotCi0jaWYgRENUU0laRSAhPSA4Ci0gIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KLSNlbmRpZgotCi0KLS8qCi0gKiBUaGUgcG9vcCBvbiB0aGlzIHNjYWxpbmcgc3R1ZmYgaXMgYXMgZm9sbG93czoKLSAqCi0gKiBFYWNoIDEtRCBEQ1Qgc3RlcCBwcm9kdWNlcyBvdXRwdXRzIHdoaWNoIGFyZSBhIGZhY3RvciBvZiBzcXJ0KE4pCi0gKiBsYXJnZXIgdGhhbiB0aGUgdHJ1ZSBEQ1Qgb3V0cHV0cy4gIFRoZSBmaW5hbCBvdXRwdXRzIGFyZSB0aGVyZWZvcmUKLSAqIGEgZmFjdG9yIG9mIE4gbGFyZ2VyIHRoYW4gZGVzaXJlZDsgc2luY2UgTj04IHRoaXMgY2FuIGJlIGN1cmVkIGJ5Ci0gKiBhIHNpbXBsZSByaWdodCBzaGlmdCBhdCB0aGUgZW5kIG9mIHRoZSBhbGdvcml0aG0uICBUaGUgYWR2YW50YWdlIG9mCi0gKiB0aGlzIGFycmFuZ2VtZW50IGlzIHRoYXQgd2Ugc2F2ZSB0d28gbXVsdGlwbGljYXRpb25zIHBlciAxLUQgRENULAotICogYmVjYXVzZSB0aGUgeTAgYW5kIHk0IG91dHB1dHMgbmVlZCBub3QgYmUgZGl2aWRlZCBieSBzcXJ0KE4pLgotICogSW4gdGhlIElKRyBjb2RlLCB0aGlzIGZhY3RvciBvZiA4IGlzIHJlbW92ZWQgYnkgdGhlIHF1YW50aXphdGlvbiBzdGVwCi0gKiAoaW4gamNkY3RtZ3IuYyksIE5PVCBpbiB0aGlzIG1vZHVsZS4KLSAqCi0gKiBXZSBoYXZlIHRvIGRvIGFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiBvZiB0aGUgaW50ZWdlciBpbnB1dHMsIHdoaWNoCi0gKiBpcyBubyBwcm9ibGVtLCBhbmQgbXVsdGlwbGljYXRpb24gYnkgZnJhY3Rpb25hbCBjb25zdGFudHMsIHdoaWNoIGlzCi0gKiBhIHByb2JsZW0gdG8gZG8gaW4gaW50ZWdlciBhcml0aG1ldGljLiAgV2UgbXVsdGlwbHkgYWxsIHRoZSBjb25zdGFudHMKLSAqIGJ5IENPTlNUX1NDQUxFIGFuZCBjb252ZXJ0IHRoZW0gdG8gaW50ZWdlciBjb25zdGFudHMgKHRodXMgcmV0YWluaW5nCi0gKiBDT05TVF9CSVRTIGJpdHMgb2YgcHJlY2lzaW9uIGluIHRoZSBjb25zdGFudHMpLiAgQWZ0ZXIgZG9pbmcgYQotICogbXVsdGlwbGljYXRpb24gd2UgaGF2ZSB0byBkaXZpZGUgdGhlIHByb2R1Y3QgYnkgQ09OU1RfU0NBTEUsIHdpdGggcHJvcGVyCi0gKiByb3VuZGluZywgdG8gcHJvZHVjZSB0aGUgY29ycmVjdCBvdXRwdXQuICBUaGlzIGRpdmlzaW9uIGNhbiBiZSBkb25lCi0gKiBjaGVhcGx5IGFzIGEgcmlnaHQgc2hpZnQgb2YgQ09OU1RfQklUUyBiaXRzLiAgV2UgcG9zdHBvbmUgc2hpZnRpbmcKLSAqIGFzIGxvbmcgYXMgcG9zc2libGUgc28gdGhhdCBwYXJ0aWFsIHN1bXMgY2FuIGJlIGFkZGVkIHRvZ2V0aGVyIHdpdGgKLSAqIGZ1bGwgZnJhY3Rpb25hbCBwcmVjaXNpb24uCi0gKgotICogVGhlIG91dHB1dHMgb2YgdGhlIGZpcnN0IHBhc3MgYXJlIHNjYWxlZCB1cCBieSBQQVNTMV9CSVRTIGJpdHMgc28gdGhhdAotICogdGhleSBhcmUgcmVwcmVzZW50ZWQgdG8gYmV0dGVyLXRoYW4taW50ZWdyYWwgcHJlY2lzaW9uLiAgVGhlc2Ugb3V0cHV0cwotICogcmVxdWlyZSBCSVRTX0lOX0pTQU1QTEUgKyBQQVNTMV9CSVRTICsgMyBiaXRzOyB0aGlzIGZpdHMgaW4gYSAxNi1iaXQgd29yZAotICogd2l0aCB0aGUgcmVjb21tZW5kZWQgc2NhbGluZy4gIChGb3IgMTItYml0IHNhbXBsZSBkYXRhLCB0aGUgaW50ZXJtZWRpYXRlCi0gKiBhcnJheSBpcyBJTlQzMiBhbnl3YXkuKQotICoKLSAqIFRvIGF2b2lkIG92ZXJmbG93IG9mIHRoZSAzMi1iaXQgaW50ZXJtZWRpYXRlIHJlc3VsdHMgaW4gcGFzcyAyLCB3ZSBtdXN0Ci0gKiBoYXZlIEJJVFNfSU5fSlNBTVBMRSArIENPTlNUX0JJVFMgKyBQQVNTMV9CSVRTIDw9IDI2LiAgRXJyb3IgYW5hbHlzaXMKLSAqIHNob3dzIHRoYXQgdGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBhcmUgdGhlIG1vc3QgZWZmZWN0aXZlLgotICovCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAotI2RlZmluZSBDT05TVF9CSVRTICAxMwotI2RlZmluZSBQQVNTMV9CSVRTICAyCi0jZWxzZQotI2RlZmluZSBDT05TVF9CSVRTICAxMwotI2RlZmluZSBQQVNTMV9CSVRTICAxCQkvKiBsb3NlIGEgbGl0dGxlIHByZWNpc2lvbiB0byBhdm9pZCBvdmVyZmxvdyAqLwotI2VuZGlmCi0KLS8qIFNvbWUgQyBjb21waWxlcnMgZmFpbCB0byByZWR1Y2UgIkZJWChjb25zdGFudCkiIGF0IGNvbXBpbGUgdGltZSwgdGh1cwotICogY2F1c2luZyBhIGxvdCBvZiB1c2VsZXNzIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXQgcnVuIHRpbWUuCi0gKiBUbyBnZXQgYXJvdW5kIHRoaXMgd2UgdXNlIHRoZSBmb2xsb3dpbmcgcHJlLWNhbGN1bGF0ZWQgY29uc3RhbnRzLgotICogSWYgeW91IGNoYW5nZSBDT05TVF9CSVRTIHlvdSBtYXkgd2FudCB0byBhZGQgYXBwcm9wcmlhdGUgdmFsdWVzLgotICogKFdpdGggYSByZWFzb25hYmxlIEMgY29tcGlsZXIsIHlvdSBjYW4ganVzdCByZWx5IG9uIHRoZSBGSVgoKSBtYWNyby4uLikKLSAqLwotCi0jaWYgQ09OU1RfQklUUyA9PSAxMwotI2RlZmluZSBGSVhfMF8yOTg2MzEzMzYgICgoSU5UMzIpICAyNDQ2KQkvKiBGSVgoMC4yOTg2MzEzMzYpICovCi0jZGVmaW5lIEZJWF8wXzM5MDE4MDY0NCAgKChJTlQzMikgIDMxOTYpCS8qIEZJWCgwLjM5MDE4MDY0NCkgKi8KLSNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICAoKElOVDMyKSAgNDQzMykJLyogRklYKDAuNTQxMTk2MTAwKSAqLwotI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgICgoSU5UMzIpICA2MjcwKQkvKiBGSVgoMC43NjUzNjY4NjUpICovCi0jZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgKChJTlQzMikgIDczNzMpCS8qIEZJWCgwLjg5OTk3NjIyMykgKi8KLSNkZWZpbmUgRklYXzFfMTc1ODc1NjAyICAoKElOVDMyKSAgOTYzMykJLyogRklYKDEuMTc1ODc1NjAyKSAqLwotI2RlZmluZSBGSVhfMV81MDEzMjExMTAgICgoSU5UMzIpICAxMjI5OSkJLyogRklYKDEuNTAxMzIxMTEwKSAqLwotI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgICgoSU5UMzIpICAxNTEzNykJLyogRklYKDEuODQ3NzU5MDY1KSAqLwotI2RlZmluZSBGSVhfMV85NjE1NzA1NjAgICgoSU5UMzIpICAxNjA2OSkJLyogRklYKDEuOTYxNTcwNTYwKSAqLwotI2RlZmluZSBGSVhfMl8wNTMxMTk4NjkgICgoSU5UMzIpICAxNjgxOSkJLyogRklYKDIuMDUzMTE5ODY5KSAqLwotI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgICgoSU5UMzIpICAyMDk5NSkJLyogRklYKDIuNTYyOTE1NDQ3KSAqLwotI2RlZmluZSBGSVhfM18wNzI3MTEwMjYgICgoSU5UMzIpICAyNTE3MikJLyogRklYKDMuMDcyNzExMDI2KSAqLwotI2Vsc2UKLSNkZWZpbmUgRklYXzBfMjk4NjMxMzM2ICBGSVgoMC4yOTg2MzEzMzYpCi0jZGVmaW5lIEZJWF8wXzM5MDE4MDY0NCAgRklYKDAuMzkwMTgwNjQ0KQotI2RlZmluZSBGSVhfMF81NDExOTYxMDAgIEZJWCgwLjU0MTE5NjEwMCkKLSNkZWZpbmUgRklYXzBfNzY1MzY2ODY1ICBGSVgoMC43NjUzNjY4NjUpCi0jZGVmaW5lIEZJWF8wXzg5OTk3NjIyMyAgRklYKDAuODk5OTc2MjIzKQotI2RlZmluZSBGSVhfMV8xNzU4NzU2MDIgIEZJWCgxLjE3NTg3NTYwMikKLSNkZWZpbmUgRklYXzFfNTAxMzIxMTEwICBGSVgoMS41MDEzMjExMTApCi0jZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgRklYKDEuODQ3NzU5MDY1KQotI2RlZmluZSBGSVhfMV85NjE1NzA1NjAgIEZJWCgxLjk2MTU3MDU2MCkKLSNkZWZpbmUgRklYXzJfMDUzMTE5ODY5ICBGSVgoMi4wNTMxMTk4NjkpCi0jZGVmaW5lIEZJWF8yXzU2MjkxNTQ0NyAgRklYKDIuNTYyOTE1NDQ3KQotI2RlZmluZSBGSVhfM18wNzI3MTEwMjYgIEZJWCgzLjA3MjcxMTAyNikKLSNlbmRpZgotCi0KLS8qIE11bHRpcGx5IGFuIElOVDMyIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50IHRvIHlpZWxkIGFuIElOVDMyIHJlc3VsdC4KLSAqIEZvciA4LWJpdCBzYW1wbGVzIHdpdGggdGhlIHJlY29tbWVuZGVkIHNjYWxpbmcsIGFsbCB0aGUgdmFyaWFibGUKLSAqIGFuZCBjb25zdGFudCB2YWx1ZXMgaW52b2x2ZWQgYXJlIG5vIG1vcmUgdGhhbiAxNiBiaXRzIHdpZGUsIHNvIGEKLSAqIDE2eDE2LT4zMiBiaXQgbXVsdGlwbHkgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBhIGZ1bGwgMzJ4MzIgbXVsdGlwbHkuCi0gKiBGb3IgMTItYml0IHNhbXBsZXMsIGEgZnVsbCAzMi1iaXQgbXVsdGlwbGljYXRpb24gd2lsbCBiZSBuZWVkZWQuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0jZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgIE1VTFRJUExZMTZDMTYodmFyLGNvbnN0KQotI2Vsc2UKLSNkZWZpbmUgTVVMVElQTFkodmFyLGNvbnN0KSAgKCh2YXIpICogKGNvbnN0KSkKLSNlbmRpZgotCi0KLS8qCi0gKiBQZXJmb3JtIHRoZSBmb3J3YXJkIERDVCBvbiBvbmUgYmxvY2sgb2Ygc2FtcGxlcy4KLSAqLwotCi1HTE9CQUwodm9pZCkKLWpwZWdfZmRjdF9pc2xvdyAoRENURUxFTSAqIGRhdGEpCi17Ci0gIElOVDMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7Ci0gIElOVDMyIHRtcDEwLCB0bXAxMSwgdG1wMTIsIHRtcDEzOwotICBJTlQzMiB6MSwgejIsIHozLCB6NCwgejU7Ci0gIERDVEVMRU0gKmRhdGFwdHI7Ci0gIGludCBjdHI7Ci0gIFNISUZUX1RFTVBTCi0KLSAgLyogUGFzcyAxOiBwcm9jZXNzIHJvd3MuICovCi0gIC8qIE5vdGUgcmVzdWx0cyBhcmUgc2NhbGVkIHVwIGJ5IHNxcnQoOCkgY29tcGFyZWQgdG8gYSB0cnVlIERDVDsgKi8KLSAgLyogZnVydGhlcm1vcmUsIHdlIHNjYWxlIHRoZSByZXN1bHRzIGJ5IDIqKlBBU1MxX0JJVFMuICovCi0KLSAgZGF0YXB0ciA9IGRhdGE7Ci0gIGZvciAoY3RyID0gRENUU0laRS0xOyBjdHIgPj0gMDsgY3RyLS0pIHsKLSAgICB0bXAwID0gZGF0YXB0clswXSArIGRhdGFwdHJbN107Ci0gICAgdG1wNyA9IGRhdGFwdHJbMF0gLSBkYXRhcHRyWzddOwotICAgIHRtcDEgPSBkYXRhcHRyWzFdICsgZGF0YXB0cls2XTsKLSAgICB0bXA2ID0gZGF0YXB0clsxXSAtIGRhdGFwdHJbNl07Ci0gICAgdG1wMiA9IGRhdGFwdHJbMl0gKyBkYXRhcHRyWzVdOwotICAgIHRtcDUgPSBkYXRhcHRyWzJdIC0gZGF0YXB0cls1XTsKLSAgICB0bXAzID0gZGF0YXB0clszXSArIGRhdGFwdHJbNF07Ci0gICAgdG1wNCA9IGRhdGFwdHJbM10gLSBkYXRhcHRyWzRdOwotICAgIAotICAgIC8qIEV2ZW4gcGFydCBwZXIgTEwmTSBmaWd1cmUgMSAtLS0gbm90ZSB0aGF0IHB1Ymxpc2hlZCBmaWd1cmUgaXMgZmF1bHR5OwotICAgICAqIHJvdGF0b3IgInNxcnQoMikqYzEiIHNob3VsZCBiZSAic3FydCgyKSpjNiIuCi0gICAgICovCi0gICAgCi0gICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKLSAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOwotICAgIHRtcDExID0gdG1wMSArIHRtcDI7Ci0gICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKLSAgICAKLSAgICBkYXRhcHRyWzBdID0gKERDVEVMRU0pICgodG1wMTAgKyB0bXAxMSkgPDwgUEFTUzFfQklUUyk7Ci0gICAgZGF0YXB0cls0XSA9IChEQ1RFTEVNKSAoKHRtcDEwIC0gdG1wMTEpIDw8IFBBU1MxX0JJVFMpOwotICAgIAotICAgIHoxID0gTVVMVElQTFkodG1wMTIgKyB0bXAxMywgRklYXzBfNTQxMTk2MTAwKTsKLSAgICBkYXRhcHRyWzJdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyBNVUxUSVBMWSh0bXAxMywgRklYXzBfNzY1MzY2ODY1KSwKLQkJCQkgICBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIGRhdGFwdHJbNl0gPSAoRENURUxFTSkgREVTQ0FMRSh6MSArIE1VTFRJUExZKHRtcDEyLCAtIEZJWF8xXzg0Nzc1OTA2NSksCi0JCQkJICAgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICAKLSAgICAvKiBPZGQgcGFydCBwZXIgZmlndXJlIDggLS0tIG5vdGUgcGFwZXIgb21pdHMgZmFjdG9yIG9mIHNxcnQoMikuCi0gICAgICogY0sgcmVwcmVzZW50cyBjb3MoSypwaS8xNikuCi0gICAgICogaTAuLmkzIGluIHRoZSBwYXBlciBhcmUgdG1wNC4udG1wNyBoZXJlLgotICAgICAqLwotICAgIAotICAgIHoxID0gdG1wNCArIHRtcDc7Ci0gICAgejIgPSB0bXA1ICsgdG1wNjsKLSAgICB6MyA9IHRtcDQgKyB0bXA2OwotICAgIHo0ID0gdG1wNSArIHRtcDc7Ci0gICAgejUgPSBNVUxUSVBMWSh6MyArIHo0LCBGSVhfMV8xNzU4NzU2MDIpOyAvKiBzcXJ0KDIpICogYzMgKi8KLSAgICAKLSAgICB0bXA0ID0gTVVMVElQTFkodG1wNCwgRklYXzBfMjk4NjMxMzM2KTsgLyogc3FydCgyKSAqICgtYzErYzMrYzUtYzcpICovCi0gICAgdG1wNSA9IE1VTFRJUExZKHRtcDUsIEZJWF8yXzA1MzExOTg2OSk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1K2M3KSAqLwotICAgIHRtcDYgPSBNVUxUSVBMWSh0bXA2LCBGSVhfM18wNzI3MTEwMjYpOyAvKiBzcXJ0KDIpICogKCBjMStjMytjNS1jNykgKi8KLSAgICB0bXA3ID0gTVVMVElQTFkodG1wNywgRklYXzFfNTAxMzIxMTEwKTsgLyogc3FydCgyKSAqICggYzErYzMtYzUtYzcpICovCi0gICAgejEgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF84OTk5NzYyMjMpOyAvKiBzcXJ0KDIpICogKGM3LWMzKSAqLwotICAgIHoyID0gTVVMVElQTFkoejIsIC0gRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqICgtYzEtYzMpICovCi0gICAgejMgPSBNVUxUSVBMWSh6MywgLSBGSVhfMV85NjE1NzA1NjApOyAvKiBzcXJ0KDIpICogKC1jMy1jNSkgKi8KLSAgICB6NCA9IE1VTFRJUExZKHo0LCAtIEZJWF8wXzM5MDE4MDY0NCk7IC8qIHNxcnQoMikgKiAoYzUtYzMpICovCi0gICAgCi0gICAgejMgKz0gejU7Ci0gICAgejQgKz0gejU7Ci0gICAgCi0gICAgZGF0YXB0cls3XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDQgKyB6MSArIHozLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIGRhdGFwdHJbNV0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXA1ICsgejIgKyB6NCwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICBkYXRhcHRyWzNdID0gKERDVEVMRU0pIERFU0NBTEUodG1wNiArIHoyICsgejMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgZGF0YXB0clsxXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDcgKyB6MSArIHo0LCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIAotICAgIGRhdGFwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLwotICB9Ci0KLSAgLyogUGFzcyAyOiBwcm9jZXNzIGNvbHVtbnMuCi0gICAqIFdlIHJlbW92ZSB0aGUgUEFTUzFfQklUUyBzY2FsaW5nLCBidXQgbGVhdmUgdGhlIHJlc3VsdHMgc2NhbGVkIHVwCi0gICAqIGJ5IGFuIG92ZXJhbGwgZmFjdG9yIG9mIDguCi0gICAqLwotCi0gIGRhdGFwdHIgPSBkYXRhOwotICBmb3IgKGN0ciA9IERDVFNJWkUtMTsgY3RyID49IDA7IGN0ci0tKSB7Ci0gICAgdG1wMCA9IGRhdGFwdHJbRENUU0laRSowXSArIGRhdGFwdHJbRENUU0laRSo3XTsKLSAgICB0bXA3ID0gZGF0YXB0cltEQ1RTSVpFKjBdIC0gZGF0YXB0cltEQ1RTSVpFKjddOwotICAgIHRtcDEgPSBkYXRhcHRyW0RDVFNJWkUqMV0gKyBkYXRhcHRyW0RDVFNJWkUqNl07Ci0gICAgdG1wNiA9IGRhdGFwdHJbRENUU0laRSoxXSAtIGRhdGFwdHJbRENUU0laRSo2XTsKLSAgICB0bXAyID0gZGF0YXB0cltEQ1RTSVpFKjJdICsgZGF0YXB0cltEQ1RTSVpFKjVdOwotICAgIHRtcDUgPSBkYXRhcHRyW0RDVFNJWkUqMl0gLSBkYXRhcHRyW0RDVFNJWkUqNV07Ci0gICAgdG1wMyA9IGRhdGFwdHJbRENUU0laRSozXSArIGRhdGFwdHJbRENUU0laRSo0XTsKLSAgICB0bXA0ID0gZGF0YXB0cltEQ1RTSVpFKjNdIC0gZGF0YXB0cltEQ1RTSVpFKjRdOwotICAgIAotICAgIC8qIEV2ZW4gcGFydCBwZXIgTEwmTSBmaWd1cmUgMSAtLS0gbm90ZSB0aGF0IHB1Ymxpc2hlZCBmaWd1cmUgaXMgZmF1bHR5OwotICAgICAqIHJvdGF0b3IgInNxcnQoMikqYzEiIHNob3VsZCBiZSAic3FydCgyKSpjNiIuCi0gICAgICovCi0gICAgCi0gICAgdG1wMTAgPSB0bXAwICsgdG1wMzsKLSAgICB0bXAxMyA9IHRtcDAgLSB0bXAzOwotICAgIHRtcDExID0gdG1wMSArIHRtcDI7Ci0gICAgdG1wMTIgPSB0bXAxIC0gdG1wMjsKLSAgICAKLSAgICBkYXRhcHRyW0RDVFNJWkUqMF0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxMCArIHRtcDExLCBQQVNTMV9CSVRTKTsKLSAgICBkYXRhcHRyW0RDVFNJWkUqNF0gPSAoRENURUxFTSkgREVTQ0FMRSh0bXAxMCAtIHRtcDExLCBQQVNTMV9CSVRTKTsKLSAgICAKLSAgICB6MSA9IE1VTFRJUExZKHRtcDEyICsgdG1wMTMsIEZJWF8wXzU0MTE5NjEwMCk7Ci0gICAgZGF0YXB0cltEQ1RTSVpFKjJdID0gKERDVEVMRU0pIERFU0NBTEUoejEgKyBNVUxUSVBMWSh0bXAxMywgRklYXzBfNzY1MzY2ODY1KSwKLQkJCQkJICAgQ09OU1RfQklUUytQQVNTMV9CSVRTKTsKLSAgICBkYXRhcHRyW0RDVFNJWkUqNl0gPSAoRENURUxFTSkgREVTQ0FMRSh6MSArIE1VTFRJUExZKHRtcDEyLCAtIEZJWF8xXzg0Nzc1OTA2NSksCi0JCQkJCSAgIENPTlNUX0JJVFMrUEFTUzFfQklUUyk7Ci0gICAgCi0gICAgLyogT2RkIHBhcnQgcGVyIGZpZ3VyZSA4IC0tLSBub3RlIHBhcGVyIG9taXRzIGZhY3RvciBvZiBzcXJ0KDIpLgotICAgICAqIGNLIHJlcHJlc2VudHMgY29zKEsqcGkvMTYpLgotICAgICAqIGkwLi5pMyBpbiB0aGUgcGFwZXIgYXJlIHRtcDQuLnRtcDcgaGVyZS4KLSAgICAgKi8KLSAgICAKLSAgICB6MSA9IHRtcDQgKyB0bXA3OwotICAgIHoyID0gdG1wNSArIHRtcDY7Ci0gICAgejMgPSB0bXA0ICsgdG1wNjsKLSAgICB6NCA9IHRtcDUgKyB0bXA3OwotICAgIHo1ID0gTVVMVElQTFkoejMgKyB6NCwgRklYXzFfMTc1ODc1NjAyKTsgLyogc3FydCgyKSAqIGMzICovCi0gICAgCi0gICAgdG1wNCA9IE1VTFRJUExZKHRtcDQsIEZJWF8wXzI5ODYzMTMzNik7IC8qIHNxcnQoMikgKiAoLWMxK2MzK2M1LWM3KSAqLwotICAgIHRtcDUgPSBNVUxUSVBMWSh0bXA1LCBGSVhfMl8wNTMxMTk4NjkpOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNStjNykgKi8KLSAgICB0bXA2ID0gTVVMVElQTFkodG1wNiwgRklYXzNfMDcyNzExMDI2KTsgLyogc3FydCgyKSAqICggYzErYzMrYzUtYzcpICovCi0gICAgdG1wNyA9IE1VTFRJUExZKHRtcDcsIEZJWF8xXzUwMTMyMTExMCk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1LWM3KSAqLwotICAgIHoxID0gTVVMVElQTFkoejEsIC0gRklYXzBfODk5OTc2MjIzKTsgLyogc3FydCgyKSAqIChjNy1jMykgKi8KLSAgICB6MiA9IE1VTFRJUExZKHoyLCAtIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoLWMxLWMzKSAqLwotICAgIHozID0gTVVMVElQTFkoejMsIC0gRklYXzFfOTYxNTcwNTYwKTsgLyogc3FydCgyKSAqICgtYzMtYzUpICovCi0gICAgejQgPSBNVUxUSVBMWSh6NCwgLSBGSVhfMF8zOTAxODA2NDQpOyAvKiBzcXJ0KDIpICogKGM1LWMzKSAqLwotICAgIAotICAgIHozICs9IHo1OwotICAgIHo0ICs9IHo1OwotICAgIAotICAgIGRhdGFwdHJbRENUU0laRSo3XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDQgKyB6MSArIHozLAotCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOwotICAgIGRhdGFwdHJbRENUU0laRSo1XSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDUgKyB6MiArIHo0LAotCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOwotICAgIGRhdGFwdHJbRENUU0laRSozXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDYgKyB6MiArIHozLAotCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOwotICAgIGRhdGFwdHJbRENUU0laRSoxXSA9IChEQ1RFTEVNKSBERVNDQUxFKHRtcDcgKyB6MSArIHo0LAotCQkJCQkgICBDT05TVF9CSVRTK1BBU1MxX0JJVFMpOwotICAgIAotICAgIGRhdGFwdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCBjb2x1bW4gKi8KLSAgfQotfQotCi0jZW5kaWYgLyogRENUX0lTTE9XX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2ppZGN0ZnN0LmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamlkY3Rmc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJhNDIxNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamlkY3Rmc3QuYworKysgL2Rldi9udWxsCkBAIC0xLDM2OCArMCwwIEBACi0vKgotICogamlkY3Rmc3QuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGEgZmFzdCwgbm90IHNvIGFjY3VyYXRlIGludGVnZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gKiBpbnZlcnNlIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuICBJbiB0aGUgSUpHIGNvZGUsIHRoaXMgcm91dGluZQotICogbXVzdCBhbHNvIHBlcmZvcm0gZGVxdWFudGl6YXRpb24gb2YgdGhlIGlucHV0IGNvZWZmaWNpZW50cy4KLSAqCi0gKiBBIDItRCBJRENUIGNhbiBiZSBkb25lIGJ5IDEtRCBJRENUIG9uIGVhY2ggY29sdW1uIGZvbGxvd2VkIGJ5IDEtRCBJRENUCi0gKiBvbiBlYWNoIHJvdyAob3IgdmljZSB2ZXJzYSwgYnV0IGl0J3MgbW9yZSBjb252ZW5pZW50IHRvIGVtaXQgYSByb3cgYXQKLSAqIGEgdGltZSkuICBEaXJlY3QgYWxnb3JpdGhtcyBhcmUgYWxzbyBhdmFpbGFibGUsIGJ1dCB0aGV5IGFyZSBtdWNoIG1vcmUKLSAqIGNvbXBsZXggYW5kIHNlZW0gbm90IHRvIGJlIGFueSBmYXN0ZXIgd2hlbiByZWR1Y2VkIHRvIGNvZGUuCi0gKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBBcmFpLCBBZ3VpLCBhbmQgTmFrYWppbWEncyBhbGdvcml0aG0gZm9yCi0gKiBzY2FsZWQgRENULiAgVGhlaXIgb3JpZ2luYWwgcGFwZXIgKFRyYW5zLiBJRUlDRSBFLTcxKDExKToxMDk1KSBpcyBpbgotICogSmFwYW5lc2UsIGJ1dCB0aGUgYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiB0aGUgUGVubmViYWtlciAmIE1pdGNoZWxsCi0gKiBKUEVHIHRleHRib29rIChzZWUgUkVGRVJFTkNFUyBzZWN0aW9uIGluIGZpbGUgUkVBRE1FKS4gIFRoZSBmb2xsb3dpbmcgY29kZQotICogaXMgYmFzZWQgZGlyZWN0bHkgb24gZmlndXJlIDQtOCBpbiBQJk0uCi0gKiBXaGlsZSBhbiA4LXBvaW50IERDVCBjYW5ub3QgYmUgZG9uZSBpbiBsZXNzIHRoYW4gMTEgbXVsdGlwbGllcywgaXQgaXMKLSAqIHBvc3NpYmxlIHRvIGFycmFuZ2UgdGhlIGNvbXB1dGF0aW9uIHNvIHRoYXQgbWFueSBvZiB0aGUgbXVsdGlwbGllcyBhcmUKLSAqIHNpbXBsZSBzY2FsaW5ncyBvZiB0aGUgZmluYWwgb3V0cHV0cy4gIFRoZXNlIG11bHRpcGxpZXMgY2FuIHRoZW4gYmUKLSAqIGZvbGRlZCBpbnRvIHRoZSBtdWx0aXBsaWNhdGlvbnMgb3IgZGl2aXNpb25zIGJ5IHRoZSBKUEVHIHF1YW50aXphdGlvbgotICogdGFibGUgZW50cmllcy4gIFRoZSBBQSZOIG1ldGhvZCBsZWF2ZXMgb25seSA1IG11bHRpcGxpZXMgYW5kIDI5IGFkZHMKLSAqIHRvIGJlIGRvbmUgaW4gdGhlIERDVCBpdHNlbGYuCi0gKiBUaGUgcHJpbWFyeSBkaXNhZHZhbnRhZ2Ugb2YgdGhpcyBtZXRob2QgaXMgdGhhdCB3aXRoIGZpeGVkLXBvaW50IG1hdGgsCi0gKiBhY2N1cmFjeSBpcyBsb3N0IGR1ZSB0byBpbXByZWNpc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNjYWxlZAotICogcXVhbnRpemF0aW9uIHZhbHVlcy4gIFRoZSBzbWFsbGVyIHRoZSBxdWFudGl6YXRpb24gdGFibGUgZW50cnksIHRoZSBsZXNzCi0gKiBwcmVjaXNlIHRoZSBzY2FsZWQgdmFsdWUsIHNvIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyB3b3JzZSB3aXRoIGhpZ2gtCi0gKiBxdWFsaXR5LXNldHRpbmcgZmlsZXMgdGhhbiB3aXRoIGxvdy1xdWFsaXR5IG9uZXMuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCi0KLSNpZmRlZiBEQ1RfSUZBU1RfU1VQUE9SVEVECi0KLQotLyoKLSAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotICovCi0KLSNpZiBEQ1RTSVpFICE9IDgKLSAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLwotI2VuZGlmCi0KLQotLyogU2NhbGluZyBkZWNpc2lvbnMgYXJlIGdlbmVyYWxseSB0aGUgc2FtZSBhcyBpbiB0aGUgTEwmTSBhbGdvcml0aG07Ci0gKiBzZWUgamlkY3RpbnQuYyBmb3IgbW9yZSBkZXRhaWxzLiAgSG93ZXZlciwgd2UgY2hvb3NlIHRvIGRlc2NhbGUKLSAqIChyaWdodCBzaGlmdCkgbXVsdGlwbGljYXRpb24gcHJvZHVjdHMgYXMgc29vbiBhcyB0aGV5IGFyZSBmb3JtZWQsCi0gKiByYXRoZXIgdGhhbiBjYXJyeWluZyBhZGRpdGlvbmFsIGZyYWN0aW9uYWwgYml0cyBpbnRvIHN1YnNlcXVlbnQgYWRkaXRpb25zLgotICogVGhpcyBjb21wcm9taXNlcyBhY2N1cmFjeSBzbGlnaHRseSwgYnV0IGl0IGxldHMgdXMgc2F2ZSBhIGZldyBzaGlmdHMuCi0gKiBNb3JlIGltcG9ydGFudGx5LCAxNi1iaXQgYXJpdGhtZXRpYyBpcyB0aGVuIGFkZXF1YXRlIChmb3IgOC1iaXQgc2FtcGxlcykKLSAqIGV2ZXJ5d2hlcmUgZXhjZXB0IGluIHRoZSBtdWx0aXBsaWNhdGlvbnMgcHJvcGVyOyB0aGlzIHNhdmVzIGEgZ29vZCBkZWFsCi0gKiBvZiB3b3JrIG9uIDE2LWJpdC1pbnQgbWFjaGluZXMuCi0gKgotICogVGhlIGRlcXVhbnRpemVkIGNvZWZmaWNpZW50cyBhcmUgbm90IGludGVnZXJzIGJlY2F1c2UgdGhlIEFBJk4gc2NhbGluZwotICogZmFjdG9ycyBoYXZlIGJlZW4gaW5jb3Jwb3JhdGVkLiAgV2UgcmVwcmVzZW50IHRoZW0gc2NhbGVkIHVwIGJ5IFBBU1MxX0JJVFMsCi0gKiBzbyB0aGF0IHRoZSBmaXJzdCBhbmQgc2Vjb25kIElEQ1Qgcm91bmRzIGhhdmUgdGhlIHNhbWUgaW5wdXQgc2NhbGluZy4KLSAqIEZvciA4LWJpdCBKU0FNUExFcywgd2UgY2hvb3NlIElGQVNUX1NDQUxFX0JJVFMgPSBQQVNTMV9CSVRTIHNvIGFzIHRvCi0gKiBhdm9pZCBhIGRlc2NhbGluZyBzaGlmdDsgdGhpcyBjb21wcm9taXNlcyBhY2N1cmFjeSByYXRoZXIgZHJhc3RpY2FsbHkKLSAqIGZvciBzbWFsbCBxdWFudGl6YXRpb24gdGFibGUgZW50cmllcywgYnV0IGl0IHNhdmVzIGEgbG90IG9mIHNoaWZ0cy4KLSAqIEZvciAxMi1iaXQgSlNBTVBMRXMsIHRoZXJlJ3Mgbm8gaG9wZSBvZiB1c2luZyAxNngxNiBtdWx0aXBsaWVzIGFueXdheSwKLSAqIHNvIHdlIHVzZSBhIG11Y2ggbGFyZ2VyIHNjYWxpbmcgZmFjdG9yIHRvIHByZXNlcnZlIGFjY3VyYWN5LgotICoKLSAqIEEgZmluYWwgY29tcHJvbWlzZSBpcyB0byByZXByZXNlbnQgdGhlIG11bHRpcGxpY2F0aXZlIGNvbnN0YW50cyB0byBvbmx5Ci0gKiA4IGZyYWN0aW9uYWwgYml0cywgcmF0aGVyIHRoYW4gMTMuICBUaGlzIHNhdmVzIHNvbWUgc2hpZnRpbmcgd29yayBvbiBzb21lCi0gKiBtYWNoaW5lcywgYW5kIG1heSBhbHNvIHJlZHVjZSB0aGUgY29zdCBvZiBtdWx0aXBsaWNhdGlvbiAoc2luY2UgdGhlcmUKLSAqIGFyZSBmZXdlciBvbmUtYml0cyBpbiB0aGUgY29uc3RhbnRzKS4KLSAqLwotCi0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLSNkZWZpbmUgQ09OU1RfQklUUyAgOAotI2RlZmluZSBQQVNTMV9CSVRTICAyCi0jZWxzZQotI2RlZmluZSBDT05TVF9CSVRTICA4Ci0jZGVmaW5lIFBBU1MxX0JJVFMgIDEJCS8qIGxvc2UgYSBsaXR0bGUgcHJlY2lzaW9uIHRvIGF2b2lkIG92ZXJmbG93ICovCi0jZW5kaWYKLQotLyogU29tZSBDIGNvbXBpbGVycyBmYWlsIHRvIHJlZHVjZSAiRklYKGNvbnN0YW50KSIgYXQgY29tcGlsZSB0aW1lLCB0aHVzCi0gKiBjYXVzaW5nIGEgbG90IG9mIHVzZWxlc3MgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBhdCBydW4gdGltZS4KLSAqIFRvIGdldCBhcm91bmQgdGhpcyB3ZSB1c2UgdGhlIGZvbGxvd2luZyBwcmUtY2FsY3VsYXRlZCBjb25zdGFudHMuCi0gKiBJZiB5b3UgY2hhbmdlIENPTlNUX0JJVFMgeW91IG1heSB3YW50IHRvIGFkZCBhcHByb3ByaWF0ZSB2YWx1ZXMuCi0gKiAoV2l0aCBhIHJlYXNvbmFibGUgQyBjb21waWxlciwgeW91IGNhbiBqdXN0IHJlbHkgb24gdGhlIEZJWCgpIG1hY3JvLi4uKQotICovCi0KLSNpZiBDT05TVF9CSVRTID09IDgKLSNkZWZpbmUgRklYXzFfMDgyMzkyMjAwICAoKElOVDMyKSAgMjc3KQkJLyogRklYKDEuMDgyMzkyMjAwKSAqLwotI2RlZmluZSBGSVhfMV80MTQyMTM1NjIgICgoSU5UMzIpICAzNjIpCQkvKiBGSVgoMS40MTQyMTM1NjIpICovCi0jZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgKChJTlQzMikgIDQ3MykJCS8qIEZJWCgxLjg0Nzc1OTA2NSkgKi8KLSNkZWZpbmUgRklYXzJfNjEzMTI1OTMwICAoKElOVDMyKSAgNjY5KQkJLyogRklYKDIuNjEzMTI1OTMwKSAqLwotI2Vsc2UKLSNkZWZpbmUgRklYXzFfMDgyMzkyMjAwICBGSVgoMS4wODIzOTIyMDApCi0jZGVmaW5lIEZJWF8xXzQxNDIxMzU2MiAgRklYKDEuNDE0MjEzNTYyKQotI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgIEZJWCgxLjg0Nzc1OTA2NSkKLSNkZWZpbmUgRklYXzJfNjEzMTI1OTMwICBGSVgoMi42MTMxMjU5MzApCi0jZW5kaWYKLQotCi0vKiBXZSBjYW4gZ2FpbiBhIGxpdHRsZSBtb3JlIHNwZWVkLCB3aXRoIGEgZnVydGhlciBjb21wcm9taXNlIGluIGFjY3VyYWN5LAotICogYnkgb21pdHRpbmcgdGhlIGFkZGl0aW9uIGluIGEgZGVzY2FsaW5nIHNoaWZ0LiAgVGhpcyB5aWVsZHMgYW4gaW5jb3JyZWN0bHkKLSAqIHJvdW5kZWQgcmVzdWx0IGhhbGYgdGhlIHRpbWUuLi4KLSAqLwotCi0jaWZuZGVmIFVTRV9BQ0NVUkFURV9ST1VORElORwotI3VuZGVmIERFU0NBTEUKLSNkZWZpbmUgREVTQ0FMRSh4LG4pICBSSUdIVF9TSElGVCh4LCBuKQotI2VuZGlmCi0KLQotLyogTXVsdGlwbHkgYSBEQ1RFTEVNIHZhcmlhYmxlIGJ5IGFuIElOVDMyIGNvbnN0YW50LCBhbmQgaW1tZWRpYXRlbHkKLSAqIGRlc2NhbGUgdG8geWllbGQgYSBEQ1RFTEVNIHJlc3VsdC4KLSAqLwotCi0jZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgICgoRENURUxFTSkgREVTQ0FMRSgodmFyKSAqIChjb25zdCksIENPTlNUX0JJVFMpKQotCi0KLS8qIERlcXVhbnRpemUgYSBjb2VmZmljaWVudCBieSBtdWx0aXBseWluZyBpdCBieSB0aGUgbXVsdGlwbGllci10YWJsZQotICogZW50cnk7IHByb2R1Y2UgYSBEQ1RFTEVNIHJlc3VsdC4gIEZvciA4LWJpdCBkYXRhIGEgMTZ4MTYtPjE2Ci0gKiBtdWx0aXBsaWNhdGlvbiB3aWxsIGRvLiAgRm9yIDEyLWJpdCBkYXRhLCB0aGUgbXVsdGlwbGllciB0YWJsZSBpcwotICogZGVjbGFyZWQgSU5UMzIsIHNvIGEgMzItYml0IG11bHRpcGx5IHdpbGwgYmUgdXNlZC4KLSAqLwotCi0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLSNkZWZpbmUgREVRVUFOVElaRShjb2VmLHF1YW50dmFsKSAgKCgoSUZBU1RfTVVMVF9UWVBFKSAoY29lZikpICogKHF1YW50dmFsKSkKLSNlbHNlCi0jZGVmaW5lIERFUVVBTlRJWkUoY29lZixxdWFudHZhbCkgIFwKLQlERVNDQUxFKChjb2VmKSoocXVhbnR2YWwpLCBJRkFTVF9TQ0FMRV9CSVRTLVBBU1MxX0JJVFMpCi0jZW5kaWYKLQotCi0vKiBMaWtlIERFU0NBTEUsIGJ1dCBhcHBsaWVzIHRvIGEgRENURUxFTSBhbmQgcHJvZHVjZXMgYW4gaW50LgotICogV2UgYXNzdW1lIHRoYXQgaW50IHJpZ2h0IHNoaWZ0IGlzIHVuc2lnbmVkIGlmIElOVDMyIHJpZ2h0IHNoaWZ0IGlzLgotICovCi0KLSNpZmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAotI2RlZmluZSBJU0hJRlRfVEVNUFMJRENURUxFTSBpc2hpZnRfdGVtcDsKLSNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAotI2RlZmluZSBEQ1RFTEVNQklUUyAgMTYJCS8qIERDVEVMRU0gbWF5IGJlIDE2IG9yIDMyIGJpdHMgKi8KLSNlbHNlCi0jZGVmaW5lIERDVEVMRU1CSVRTICAzMgkJLyogRENURUxFTSBtdXN0IGJlIDMyIGJpdHMgKi8KLSNlbmRpZgotI2RlZmluZSBJUklHSFRfU0hJRlQoeCxzaGZ0KSAgXAotICAgICgoaXNoaWZ0X3RlbXAgPSAoeCkpIDwgMCA/IFwKLSAgICAgKGlzaGlmdF90ZW1wID4+IChzaGZ0KSkgfCAoKH4oKERDVEVMRU0pIDApKSA8PCAoRENURUxFTUJJVFMtKHNoZnQpKSkgOiBcCi0gICAgIChpc2hpZnRfdGVtcCA+PiAoc2hmdCkpKQotI2Vsc2UKLSNkZWZpbmUgSVNISUZUX1RFTVBTCi0jZGVmaW5lIElSSUdIVF9TSElGVCh4LHNoZnQpCSgoeCkgPj4gKHNoZnQpKQotI2VuZGlmCi0KLSNpZmRlZiBVU0VfQUNDVVJBVEVfUk9VTkRJTkcKLSNkZWZpbmUgSURFU0NBTEUoeCxuKSAgKChpbnQpIElSSUdIVF9TSElGVCgoeCkgKyAoMSA8PCAoKG4pLTEpKSwgbikpCi0jZWxzZQotI2RlZmluZSBJREVTQ0FMRSh4LG4pICAoKGludCkgSVJJR0hUX1NISUZUKHgsIG4pKQotI2VuZGlmCi0KLQotLyoKLSAqIFBlcmZvcm0gZGVxdWFudGl6YXRpb24gYW5kIGludmVyc2UgRENUIG9uIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2lkY3RfaWZhc3QgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCQkgSkNPRUZQVFIgY29lZl9ibG9jaywKLQkJIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQotewotICBEQ1RFTEVNIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7Ci0gIERDVEVMRU0gdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTM7Ci0gIERDVEVMRU0gejUsIHoxMCwgejExLCB6MTIsIHoxMzsKLSAgSkNPRUZQVFIgaW5wdHI7Ci0gIElGQVNUX01VTFRfVFlQRSAqIHF1YW50cHRyOwotICBpbnQgKiB3c3B0cjsKLSAgSlNBTVBST1cgb3V0cHRyOwotICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOwotICBpbnQgY3RyOwotICBpbnQgd29ya3NwYWNlW0RDVFNJWkUyXTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCi0gIFNISUZUX1RFTVBTCQkJLyogZm9yIERFU0NBTEUgKi8KLSAgSVNISUZUX1RFTVBTCQkJLyogZm9yIElERVNDQUxFICovCi0KLSAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiAqLwotCi0gIGlucHRyID0gY29lZl9ibG9jazsKLSAgcXVhbnRwdHIgPSAoSUZBU1RfTVVMVF9UWVBFICopIGNvbXBwdHItPmRjdF90YWJsZTsKLSAgd3NwdHIgPSB3b3Jrc3BhY2U7Ci0gIGZvciAoY3RyID0gRENUU0laRTsgY3RyID4gMDsgY3RyLS0pIHsKLSAgICAvKiBEdWUgdG8gcXVhbnRpemF0aW9uLCB3ZSB3aWxsIHVzdWFsbHkgZmluZCB0aGF0IG1hbnkgb2YgdGhlIGlucHV0Ci0gICAgICogY29lZmZpY2llbnRzIGFyZSB6ZXJvLCBlc3BlY2lhbGx5IHRoZSBBQyB0ZXJtcy4gIFdlIGNhbiBleHBsb2l0IHRoaXMKLSAgICAgKiBieSBzaG9ydC1jaXJjdWl0aW5nIHRoZSBJRENUIGNhbGN1bGF0aW9uIGZvciBhbnkgY29sdW1uIGluIHdoaWNoIGFsbAotICAgICAqIHRoZSBBQyB0ZXJtcyBhcmUgemVyby4gIEluIHRoYXQgY2FzZSBlYWNoIG91dHB1dCBpcyBlcXVhbCB0byB0aGUKLSAgICAgKiBEQyBjb2VmZmljaWVudCAod2l0aCBzY2FsZSBmYWN0b3IgYXMgbmVlZGVkKS4KLSAgICAgKiBXaXRoIHR5cGljYWwgaW1hZ2VzIGFuZCBxdWFudGl6YXRpb24gdGFibGVzLCBoYWxmIG9yIG1vcmUgb2YgdGhlCi0gICAgICogY29sdW1uIERDVCBjYWxjdWxhdGlvbnMgY2FuIGJlIHNpbXBsaWZpZWQgdGhpcyB3YXkuCi0gICAgICovCi0gICAgCi0gICAgaWYgKGlucHRyW0RDVFNJWkUqMV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjJdID09IDAgJiYKLQlpbnB0cltEQ1RTSVpFKjNdID09IDAgJiYgaW5wdHJbRENUU0laRSo0XSA9PSAwICYmCi0JaW5wdHJbRENUU0laRSo1XSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNl0gPT0gMCAmJgotCWlucHRyW0RDVFNJWkUqN10gPT0gMCkgewotICAgICAgLyogQUMgdGVybXMgYWxsIHplcm8gKi8KLSAgICAgIGludCBkY3ZhbCA9IChpbnQpIERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSk7Ci0KLSAgICAgIHdzcHRyW0RDVFNJWkUqMF0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqMV0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqMl0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqM10gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqNF0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqNV0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqNl0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqN10gPSBkY3ZhbDsKLSAgICAgIAotICAgICAgaW5wdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCi0gICAgICBxdWFudHB0cisrOwotICAgICAgd3NwdHIrKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICAKLSAgICAvKiBFdmVuIHBhcnQgKi8KLQotICAgIHRtcDAgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOwotICAgIHRtcDEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMl0sIHF1YW50cHRyW0RDVFNJWkUqMl0pOwotICAgIHRtcDIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNF0sIHF1YW50cHRyW0RDVFNJWkUqNF0pOwotICAgIHRtcDMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNl0sIHF1YW50cHRyW0RDVFNJWkUqNl0pOwotCi0gICAgdG1wMTAgPSB0bXAwICsgdG1wMjsJLyogcGhhc2UgMyAqLwotICAgIHRtcDExID0gdG1wMCAtIHRtcDI7Ci0KLSAgICB0bXAxMyA9IHRtcDEgKyB0bXAzOwkvKiBwaGFzZXMgNS0zICovCi0gICAgdG1wMTIgPSBNVUxUSVBMWSh0bXAxIC0gdG1wMywgRklYXzFfNDE0MjEzNTYyKSAtIHRtcDEzOyAvKiAyKmM0ICovCi0KLSAgICB0bXAwID0gdG1wMTAgKyB0bXAxMzsJLyogcGhhc2UgMiAqLwotICAgIHRtcDMgPSB0bXAxMCAtIHRtcDEzOwotICAgIHRtcDEgPSB0bXAxMSArIHRtcDEyOwotICAgIHRtcDIgPSB0bXAxMSAtIHRtcDEyOwotICAgIAotICAgIC8qIE9kZCBwYXJ0ICovCi0KLSAgICB0bXA0ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKLSAgICB0bXA1ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjNdLCBxdWFudHB0cltEQ1RTSVpFKjNdKTsKLSAgICB0bXA2ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjVdLCBxdWFudHB0cltEQ1RTSVpFKjVdKTsKLSAgICB0bXA3ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjddLCBxdWFudHB0cltEQ1RTSVpFKjddKTsKLQotICAgIHoxMyA9IHRtcDYgKyB0bXA1OwkJLyogcGhhc2UgNiAqLwotICAgIHoxMCA9IHRtcDYgLSB0bXA1OwotICAgIHoxMSA9IHRtcDQgKyB0bXA3OwotICAgIHoxMiA9IHRtcDQgLSB0bXA3OwotCi0gICAgdG1wNyA9IHoxMSArIHoxMzsJCS8qIHBoYXNlIDUgKi8KLSAgICB0bXAxMSA9IE1VTFRJUExZKHoxMSAtIHoxMywgRklYXzFfNDE0MjEzNTYyKTsgLyogMipjNCAqLwotCi0gICAgejUgPSBNVUxUSVBMWSh6MTAgKyB6MTIsIEZJWF8xXzg0Nzc1OTA2NSk7IC8qIDIqYzIgKi8KLSAgICB0bXAxMCA9IE1VTFRJUExZKHoxMiwgRklYXzFfMDgyMzkyMjAwKSAtIHo1OyAvKiAyKihjMi1jNikgKi8KLSAgICB0bXAxMiA9IE1VTFRJUExZKHoxMCwgLSBGSVhfMl82MTMxMjU5MzApICsgejU7IC8qIC0yKihjMitjNikgKi8KLQotICAgIHRtcDYgPSB0bXAxMiAtIHRtcDc7CS8qIHBoYXNlIDIgKi8KLSAgICB0bXA1ID0gdG1wMTEgLSB0bXA2OwotICAgIHRtcDQgPSB0bXAxMCArIHRtcDU7Ci0KLSAgICB3c3B0cltEQ1RTSVpFKjBdID0gKGludCkgKHRtcDAgKyB0bXA3KTsKLSAgICB3c3B0cltEQ1RTSVpFKjddID0gKGludCkgKHRtcDAgLSB0bXA3KTsKLSAgICB3c3B0cltEQ1RTSVpFKjFdID0gKGludCkgKHRtcDEgKyB0bXA2KTsKLSAgICB3c3B0cltEQ1RTSVpFKjZdID0gKGludCkgKHRtcDEgLSB0bXA2KTsKLSAgICB3c3B0cltEQ1RTSVpFKjJdID0gKGludCkgKHRtcDIgKyB0bXA1KTsKLSAgICB3c3B0cltEQ1RTSVpFKjVdID0gKGludCkgKHRtcDIgLSB0bXA1KTsKLSAgICB3c3B0cltEQ1RTSVpFKjRdID0gKGludCkgKHRtcDMgKyB0bXA0KTsKLSAgICB3c3B0cltEQ1RTSVpFKjNdID0gKGludCkgKHRtcDMgLSB0bXA0KTsKLQotICAgIGlucHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLwotICAgIHF1YW50cHRyKys7Ci0gICAgd3NwdHIrKzsKLSAgfQotICAKLSAgLyogUGFzcyAyOiBwcm9jZXNzIHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4gKi8KLSAgLyogTm90ZSB0aGF0IHdlIG11c3QgZGVzY2FsZSB0aGUgcmVzdWx0cyBieSBhIGZhY3RvciBvZiA4ID09IDIqKjMsICovCi0gIC8qIGFuZCBhbHNvIHVuZG8gdGhlIFBBU1MxX0JJVFMgc2NhbGluZy4gKi8KLQotICB3c3B0ciA9IHdvcmtzcGFjZTsKLSAgZm9yIChjdHIgPSAwOyBjdHIgPCBEQ1RTSVpFOyBjdHIrKykgewotICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7Ci0gICAgLyogUm93cyBvZiB6ZXJvZXMgY2FuIGJlIGV4cGxvaXRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgd2UgZGlkIHdpdGggY29sdW1ucy4KLSAgICAgKiBIb3dldmVyLCB0aGUgY29sdW1uIGNhbGN1bGF0aW9uIGhhcyBjcmVhdGVkIG1hbnkgbm9uemVybyBBQyB0ZXJtcywgc28KLSAgICAgKiB0aGUgc2ltcGxpZmljYXRpb24gYXBwbGllcyBsZXNzIG9mdGVuICh0eXBpY2FsbHkgNSUgdG8gMTAlIG9mIHRoZSB0aW1lKS4KLSAgICAgKiBPbiBtYWNoaW5lcyB3aXRoIHZlcnkgZmFzdCBtdWx0aXBsaWNhdGlvbiwgaXQncyBwb3NzaWJsZSB0aGF0IHRoZQotICAgICAqIHRlc3QgdGFrZXMgbW9yZSB0aW1lIHRoYW4gaXQncyB3b3J0aC4gIEluIHRoYXQgY2FzZSB0aGlzIHNlY3Rpb24KLSAgICAgKiBtYXkgYmUgY29tbWVudGVkIG91dC4KLSAgICAgKi8KLSAgICAKLSNpZm5kZWYgTk9fWkVST19ST1dfVEVTVAotICAgIGlmICh3c3B0clsxXSA9PSAwICYmIHdzcHRyWzJdID09IDAgJiYgd3NwdHJbM10gPT0gMCAmJiB3c3B0cls0XSA9PSAwICYmCi0Jd3NwdHJbNV0gPT0gMCAmJiB3c3B0cls2XSA9PSAwICYmIHdzcHRyWzddID09IDApIHsKLSAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCi0gICAgICBKU0FNUExFIGRjdmFsID0gcmFuZ2VfbGltaXRbSURFU0NBTEUod3NwdHJbMF0sIFBBU1MxX0JJVFMrMykKLQkJCQkgICYgUkFOR0VfTUFTS107Ci0gICAgICAKLSAgICAgIG91dHB0clswXSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzFdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbMl0gPSBkY3ZhbDsKLSAgICAgIG91dHB0clszXSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzRdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbNV0gPSBkY3ZhbDsKLSAgICAgIG91dHB0cls2XSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzddID0gZGN2YWw7Ci0KLSAgICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSNlbmRpZgotICAgIAotICAgIC8qIEV2ZW4gcGFydCAqLwotCi0gICAgdG1wMTAgPSAoKERDVEVMRU0pIHdzcHRyWzBdICsgKERDVEVMRU0pIHdzcHRyWzRdKTsKLSAgICB0bXAxMSA9ICgoRENURUxFTSkgd3NwdHJbMF0gLSAoRENURUxFTSkgd3NwdHJbNF0pOwotCi0gICAgdG1wMTMgPSAoKERDVEVMRU0pIHdzcHRyWzJdICsgKERDVEVMRU0pIHdzcHRyWzZdKTsKLSAgICB0bXAxMiA9IE1VTFRJUExZKChEQ1RFTEVNKSB3c3B0clsyXSAtIChEQ1RFTEVNKSB3c3B0cls2XSwgRklYXzFfNDE0MjEzNTYyKQotCSAgICAtIHRtcDEzOwotCi0gICAgdG1wMCA9IHRtcDEwICsgdG1wMTM7Ci0gICAgdG1wMyA9IHRtcDEwIC0gdG1wMTM7Ci0gICAgdG1wMSA9IHRtcDExICsgdG1wMTI7Ci0gICAgdG1wMiA9IHRtcDExIC0gdG1wMTI7Ci0KLSAgICAvKiBPZGQgcGFydCAqLwotCi0gICAgejEzID0gKERDVEVMRU0pIHdzcHRyWzVdICsgKERDVEVMRU0pIHdzcHRyWzNdOwotICAgIHoxMCA9IChEQ1RFTEVNKSB3c3B0cls1XSAtIChEQ1RFTEVNKSB3c3B0clszXTsKLSAgICB6MTEgPSAoRENURUxFTSkgd3NwdHJbMV0gKyAoRENURUxFTSkgd3NwdHJbN107Ci0gICAgejEyID0gKERDVEVMRU0pIHdzcHRyWzFdIC0gKERDVEVMRU0pIHdzcHRyWzddOwotCi0gICAgdG1wNyA9IHoxMSArIHoxMzsJCS8qIHBoYXNlIDUgKi8KLSAgICB0bXAxMSA9IE1VTFRJUExZKHoxMSAtIHoxMywgRklYXzFfNDE0MjEzNTYyKTsgLyogMipjNCAqLwotCi0gICAgejUgPSBNVUxUSVBMWSh6MTAgKyB6MTIsIEZJWF8xXzg0Nzc1OTA2NSk7IC8qIDIqYzIgKi8KLSAgICB0bXAxMCA9IE1VTFRJUExZKHoxMiwgRklYXzFfMDgyMzkyMjAwKSAtIHo1OyAvKiAyKihjMi1jNikgKi8KLSAgICB0bXAxMiA9IE1VTFRJUExZKHoxMCwgLSBGSVhfMl82MTMxMjU5MzApICsgejU7IC8qIC0yKihjMitjNikgKi8KLQotICAgIHRtcDYgPSB0bXAxMiAtIHRtcDc7CS8qIHBoYXNlIDIgKi8KLSAgICB0bXA1ID0gdG1wMTEgLSB0bXA2OwotICAgIHRtcDQgPSB0bXAxMCArIHRtcDU7Ci0KLSAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2U6IHNjYWxlIGRvd24gYnkgYSBmYWN0b3Igb2YgOCBhbmQgcmFuZ2UtbGltaXQgKi8KLQotICAgIG91dHB0clswXSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDAgKyB0bXA3LCBQQVNTMV9CSVRTKzMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbN10gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAwIC0gdG1wNywgUEFTUzFfQklUUyszKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzFdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMSArIHRtcDYsIFBBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0cls2XSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDEgLSB0bXA2LCBQQVNTMV9CSVRTKzMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAyICsgdG1wNSwgUEFTUzFfQklUUyszKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzVdID0gcmFuZ2VfbGltaXRbSURFU0NBTEUodG1wMiAtIHRtcDUsIFBBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0cls0XSA9IHJhbmdlX2xpbWl0W0lERVNDQUxFKHRtcDMgKyB0bXA0LCBQQVNTMV9CSVRTKzMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbM10gPSByYW5nZV9saW1pdFtJREVTQ0FMRSh0bXAzIC0gdG1wNCwgUEFTUzFfQklUUyszKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0KLSAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCi0gIH0KLX0KLQotI2VuZGlmIC8qIERDVF9JRkFTVF9TVVBQT1JURUQgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qaWRjdGludC5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2ppZGN0aW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MmIzMjAuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2ppZGN0aW50LmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODkgKzAsMCBAQAotLyoKLSAqIGppZGN0aW50LmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhIHNsb3ctYnV0LWFjY3VyYXRlIGludGVnZXIgaW1wbGVtZW50YXRpb24gb2YgdGhlCi0gKiBpbnZlcnNlIERDVCAoRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSkuICBJbiB0aGUgSUpHIGNvZGUsIHRoaXMgcm91dGluZQotICogbXVzdCBhbHNvIHBlcmZvcm0gZGVxdWFudGl6YXRpb24gb2YgdGhlIGlucHV0IGNvZWZmaWNpZW50cy4KLSAqCi0gKiBBIDItRCBJRENUIGNhbiBiZSBkb25lIGJ5IDEtRCBJRENUIG9uIGVhY2ggY29sdW1uIGZvbGxvd2VkIGJ5IDEtRCBJRENUCi0gKiBvbiBlYWNoIHJvdyAob3IgdmljZSB2ZXJzYSwgYnV0IGl0J3MgbW9yZSBjb252ZW5pZW50IHRvIGVtaXQgYSByb3cgYXQKLSAqIGEgdGltZSkuICBEaXJlY3QgYWxnb3JpdGhtcyBhcmUgYWxzbyBhdmFpbGFibGUsIGJ1dCB0aGV5IGFyZSBtdWNoIG1vcmUKLSAqIGNvbXBsZXggYW5kIHNlZW0gbm90IHRvIGJlIGFueSBmYXN0ZXIgd2hlbiByZWR1Y2VkIHRvIGNvZGUuCi0gKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBhbiBhbGdvcml0aG0gZGVzY3JpYmVkIGluCi0gKiAgIEMuIExvZWZmbGVyLCBBLiBMaWd0ZW5iZXJnIGFuZCBHLiBNb3NjaHl0eiwgIlByYWN0aWNhbCBGYXN0IDEtRCBEQ1QKLSAqICAgQWxnb3JpdGhtcyB3aXRoIDExIE11bHRpcGxpY2F0aW9ucyIsIFByb2MuIEludCdsLiBDb25mLiBvbiBBY291c3RpY3MsCi0gKiAgIFNwZWVjaCwgYW5kIFNpZ25hbCBQcm9jZXNzaW5nIDE5ODkgKElDQVNTUCAnODkpLCBwcC4gOTg4LTk5MS4KLSAqIFRoZSBwcmltYXJ5IGFsZ29yaXRobSBkZXNjcmliZWQgdGhlcmUgdXNlcyAxMSBtdWx0aXBsaWVzIGFuZCAyOSBhZGRzLgotICogV2UgdXNlIHRoZWlyIGFsdGVybmF0ZSBtZXRob2Qgd2l0aCAxMiBtdWx0aXBsaWVzIGFuZCAzMiBhZGRzLgotICogVGhlIGFkdmFudGFnZSBvZiB0aGlzIG1ldGhvZCBpcyB0aGF0IG5vIGRhdGEgcGF0aCBjb250YWlucyBtb3JlIHRoYW4gb25lCi0gKiBtdWx0aXBsaWNhdGlvbjsgdGhpcyBhbGxvd3MgYSB2ZXJ5IHNpbXBsZSBhbmQgYWNjdXJhdGUgaW1wbGVtZW50YXRpb24gaW4KLSAqIHNjYWxlZCBmaXhlZC1wb2ludCBhcml0aG1ldGljLCB3aXRoIGEgbWluaW1hbCBudW1iZXIgb2Ygc2hpZnRzLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLSNpbmNsdWRlICJqZGN0LmgiCQkvKiBQcml2YXRlIGRlY2xhcmF0aW9ucyBmb3IgRENUIHN1YnN5c3RlbSAqLwotCi0jaWZkZWYgRENUX0lTTE9XX1NVUFBPUlRFRAotCi0KLS8qCi0gKiBUaGlzIG1vZHVsZSBpcyBzcGVjaWFsaXplZCB0byB0aGUgY2FzZSBEQ1RTSVpFID0gOC4KLSAqLwotCi0jaWYgRENUU0laRSAhPSA4Ci0gIFNvcnJ5LCB0aGlzIGNvZGUgb25seSBjb3BlcyB3aXRoIDh4OCBEQ1RzLiAvKiBkZWxpYmVyYXRlIHN5bnRheCBlcnIgKi8KLSNlbmRpZgotCi0KLS8qCi0gKiBUaGUgcG9vcCBvbiB0aGlzIHNjYWxpbmcgc3R1ZmYgaXMgYXMgZm9sbG93czoKLSAqCi0gKiBFYWNoIDEtRCBJRENUIHN0ZXAgcHJvZHVjZXMgb3V0cHV0cyB3aGljaCBhcmUgYSBmYWN0b3Igb2Ygc3FydChOKQotICogbGFyZ2VyIHRoYW4gdGhlIHRydWUgSURDVCBvdXRwdXRzLiAgVGhlIGZpbmFsIG91dHB1dHMgYXJlIHRoZXJlZm9yZQotICogYSBmYWN0b3Igb2YgTiBsYXJnZXIgdGhhbiBkZXNpcmVkOyBzaW5jZSBOPTggdGhpcyBjYW4gYmUgY3VyZWQgYnkKLSAqIGEgc2ltcGxlIHJpZ2h0IHNoaWZ0IGF0IHRoZSBlbmQgb2YgdGhlIGFsZ29yaXRobS4gIFRoZSBhZHZhbnRhZ2Ugb2YKLSAqIHRoaXMgYXJyYW5nZW1lbnQgaXMgdGhhdCB3ZSBzYXZlIHR3byBtdWx0aXBsaWNhdGlvbnMgcGVyIDEtRCBJRENULAotICogYmVjYXVzZSB0aGUgeTAgYW5kIHk0IGlucHV0cyBuZWVkIG5vdCBiZSBkaXZpZGVkIGJ5IHNxcnQoTikuCi0gKgotICogV2UgaGF2ZSB0byBkbyBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24gb2YgdGhlIGludGVnZXIgaW5wdXRzLCB3aGljaAotICogaXMgbm8gcHJvYmxlbSwgYW5kIG11bHRpcGxpY2F0aW9uIGJ5IGZyYWN0aW9uYWwgY29uc3RhbnRzLCB3aGljaCBpcwotICogYSBwcm9ibGVtIHRvIGRvIGluIGludGVnZXIgYXJpdGhtZXRpYy4gIFdlIG11bHRpcGx5IGFsbCB0aGUgY29uc3RhbnRzCi0gKiBieSBDT05TVF9TQ0FMRSBhbmQgY29udmVydCB0aGVtIHRvIGludGVnZXIgY29uc3RhbnRzICh0aHVzIHJldGFpbmluZwotICogQ09OU1RfQklUUyBiaXRzIG9mIHByZWNpc2lvbiBpbiB0aGUgY29uc3RhbnRzKS4gIEFmdGVyIGRvaW5nIGEKLSAqIG11bHRpcGxpY2F0aW9uIHdlIGhhdmUgdG8gZGl2aWRlIHRoZSBwcm9kdWN0IGJ5IENPTlNUX1NDQUxFLCB3aXRoIHByb3BlcgotICogcm91bmRpbmcsIHRvIHByb2R1Y2UgdGhlIGNvcnJlY3Qgb3V0cHV0LiAgVGhpcyBkaXZpc2lvbiBjYW4gYmUgZG9uZQotICogY2hlYXBseSBhcyBhIHJpZ2h0IHNoaWZ0IG9mIENPTlNUX0JJVFMgYml0cy4gIFdlIHBvc3Rwb25lIHNoaWZ0aW5nCi0gKiBhcyBsb25nIGFzIHBvc3NpYmxlIHNvIHRoYXQgcGFydGlhbCBzdW1zIGNhbiBiZSBhZGRlZCB0b2dldGhlciB3aXRoCi0gKiBmdWxsIGZyYWN0aW9uYWwgcHJlY2lzaW9uLgotICoKLSAqIFRoZSBvdXRwdXRzIG9mIHRoZSBmaXJzdCBwYXNzIGFyZSBzY2FsZWQgdXAgYnkgUEFTUzFfQklUUyBiaXRzIHNvIHRoYXQKLSAqIHRoZXkgYXJlIHJlcHJlc2VudGVkIHRvIGJldHRlci10aGFuLWludGVncmFsIHByZWNpc2lvbi4gIFRoZXNlIG91dHB1dHMKLSAqIHJlcXVpcmUgQklUU19JTl9KU0FNUExFICsgUEFTUzFfQklUUyArIDMgYml0czsgdGhpcyBmaXRzIGluIGEgMTYtYml0IHdvcmQKLSAqIHdpdGggdGhlIHJlY29tbWVuZGVkIHNjYWxpbmcuICAoVG8gc2NhbGUgdXAgMTItYml0IHNhbXBsZSBkYXRhIGZ1cnRoZXIsIGFuCi0gKiBpbnRlcm1lZGlhdGUgSU5UMzIgYXJyYXkgd291bGQgYmUgbmVlZGVkLikKLSAqCi0gKiBUbyBhdm9pZCBvdmVyZmxvdyBvZiB0aGUgMzItYml0IGludGVybWVkaWF0ZSByZXN1bHRzIGluIHBhc3MgMiwgd2UgbXVzdAotICogaGF2ZSBCSVRTX0lOX0pTQU1QTEUgKyBDT05TVF9CSVRTICsgUEFTUzFfQklUUyA8PSAyNi4gIEVycm9yIGFuYWx5c2lzCi0gKiBzaG93cyB0aGF0IHRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgYXJlIHRoZSBtb3N0IGVmZmVjdGl2ZS4KLSAqLwotCi0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLSNkZWZpbmUgQ09OU1RfQklUUyAgMTMKLSNkZWZpbmUgUEFTUzFfQklUUyAgMgotI2Vsc2UKLSNkZWZpbmUgQ09OU1RfQklUUyAgMTMKLSNkZWZpbmUgUEFTUzFfQklUUyAgMQkJLyogbG9zZSBhIGxpdHRsZSBwcmVjaXNpb24gdG8gYXZvaWQgb3ZlcmZsb3cgKi8KLSNlbmRpZgotCi0vKiBTb21lIEMgY29tcGlsZXJzIGZhaWwgdG8gcmVkdWNlICJGSVgoY29uc3RhbnQpIiBhdCBjb21waWxlIHRpbWUsIHRodXMKLSAqIGNhdXNpbmcgYSBsb3Qgb2YgdXNlbGVzcyBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIGF0IHJ1biB0aW1lLgotICogVG8gZ2V0IGFyb3VuZCB0aGlzIHdlIHVzZSB0aGUgZm9sbG93aW5nIHByZS1jYWxjdWxhdGVkIGNvbnN0YW50cy4KLSAqIElmIHlvdSBjaGFuZ2UgQ09OU1RfQklUUyB5b3UgbWF5IHdhbnQgdG8gYWRkIGFwcHJvcHJpYXRlIHZhbHVlcy4KLSAqIChXaXRoIGEgcmVhc29uYWJsZSBDIGNvbXBpbGVyLCB5b3UgY2FuIGp1c3QgcmVseSBvbiB0aGUgRklYKCkgbWFjcm8uLi4pCi0gKi8KLQotI2lmIENPTlNUX0JJVFMgPT0gMTMKLSNkZWZpbmUgRklYXzBfMjk4NjMxMzM2ICAoKElOVDMyKSAgMjQ0NikJLyogRklYKDAuMjk4NjMxMzM2KSAqLwotI2RlZmluZSBGSVhfMF8zOTAxODA2NDQgICgoSU5UMzIpICAzMTk2KQkvKiBGSVgoMC4zOTAxODA2NDQpICovCi0jZGVmaW5lIEZJWF8wXzU0MTE5NjEwMCAgKChJTlQzMikgIDQ0MzMpCS8qIEZJWCgwLjU0MTE5NjEwMCkgKi8KLSNkZWZpbmUgRklYXzBfNzY1MzY2ODY1ICAoKElOVDMyKSAgNjI3MCkJLyogRklYKDAuNzY1MzY2ODY1KSAqLwotI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgICgoSU5UMzIpICA3MzczKQkvKiBGSVgoMC44OTk5NzYyMjMpICovCi0jZGVmaW5lIEZJWF8xXzE3NTg3NTYwMiAgKChJTlQzMikgIDk2MzMpCS8qIEZJWCgxLjE3NTg3NTYwMikgKi8KLSNkZWZpbmUgRklYXzFfNTAxMzIxMTEwICAoKElOVDMyKSAgMTIyOTkpCS8qIEZJWCgxLjUwMTMyMTExMCkgKi8KLSNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICAoKElOVDMyKSAgMTUxMzcpCS8qIEZJWCgxLjg0Nzc1OTA2NSkgKi8KLSNkZWZpbmUgRklYXzFfOTYxNTcwNTYwICAoKElOVDMyKSAgMTYwNjkpCS8qIEZJWCgxLjk2MTU3MDU2MCkgKi8KLSNkZWZpbmUgRklYXzJfMDUzMTE5ODY5ICAoKElOVDMyKSAgMTY4MTkpCS8qIEZJWCgyLjA1MzExOTg2OSkgKi8KLSNkZWZpbmUgRklYXzJfNTYyOTE1NDQ3ICAoKElOVDMyKSAgMjA5OTUpCS8qIEZJWCgyLjU2MjkxNTQ0NykgKi8KLSNkZWZpbmUgRklYXzNfMDcyNzExMDI2ICAoKElOVDMyKSAgMjUxNzIpCS8qIEZJWCgzLjA3MjcxMTAyNikgKi8KLSNlbHNlCi0jZGVmaW5lIEZJWF8wXzI5ODYzMTMzNiAgRklYKDAuMjk4NjMxMzM2KQotI2RlZmluZSBGSVhfMF8zOTAxODA2NDQgIEZJWCgwLjM5MDE4MDY0NCkKLSNkZWZpbmUgRklYXzBfNTQxMTk2MTAwICBGSVgoMC41NDExOTYxMDApCi0jZGVmaW5lIEZJWF8wXzc2NTM2Njg2NSAgRklYKDAuNzY1MzY2ODY1KQotI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgIEZJWCgwLjg5OTk3NjIyMykKLSNkZWZpbmUgRklYXzFfMTc1ODc1NjAyICBGSVgoMS4xNzU4NzU2MDIpCi0jZGVmaW5lIEZJWF8xXzUwMTMyMTExMCAgRklYKDEuNTAxMzIxMTEwKQotI2RlZmluZSBGSVhfMV84NDc3NTkwNjUgIEZJWCgxLjg0Nzc1OTA2NSkKLSNkZWZpbmUgRklYXzFfOTYxNTcwNTYwICBGSVgoMS45NjE1NzA1NjApCi0jZGVmaW5lIEZJWF8yXzA1MzExOTg2OSAgRklYKDIuMDUzMTE5ODY5KQotI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgIEZJWCgyLjU2MjkxNTQ0NykKLSNkZWZpbmUgRklYXzNfMDcyNzExMDI2ICBGSVgoMy4wNzI3MTEwMjYpCi0jZW5kaWYKLQotCi0vKiBNdWx0aXBseSBhbiBJTlQzMiB2YXJpYWJsZSBieSBhbiBJTlQzMiBjb25zdGFudCB0byB5aWVsZCBhbiBJTlQzMiByZXN1bHQuCi0gKiBGb3IgOC1iaXQgc2FtcGxlcyB3aXRoIHRoZSByZWNvbW1lbmRlZCBzY2FsaW5nLCBhbGwgdGhlIHZhcmlhYmxlCi0gKiBhbmQgY29uc3RhbnQgdmFsdWVzIGludm9sdmVkIGFyZSBubyBtb3JlIHRoYW4gMTYgYml0cyB3aWRlLCBzbyBhCi0gKiAxNngxNi0+MzIgYml0IG11bHRpcGx5IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYSBmdWxsIDMyeDMyIG11bHRpcGx5LgotICogRm9yIDEyLWJpdCBzYW1wbGVzLCBhIGZ1bGwgMzItYml0IG11bHRpcGxpY2F0aW9uIHdpbGwgYmUgbmVlZGVkLgotICovCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAotI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICBNVUxUSVBMWTE2QzE2KHZhcixjb25zdCkKLSNlbHNlCi0jZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgICgodmFyKSAqIChjb25zdCkpCi0jZW5kaWYKLQotCi0vKiBEZXF1YW50aXplIGEgY29lZmZpY2llbnQgYnkgbXVsdGlwbHlpbmcgaXQgYnkgdGhlIG11bHRpcGxpZXItdGFibGUKLSAqIGVudHJ5OyBwcm9kdWNlIGFuIGludCByZXN1bHQuICBJbiB0aGlzIG1vZHVsZSwgYm90aCBpbnB1dHMgYW5kIHJlc3VsdAotICogYXJlIDE2IGJpdHMgb3IgbGVzcywgc28gZWl0aGVyIGludCBvciBzaG9ydCBtdWx0aXBseSB3aWxsIHdvcmsuCi0gKi8KLQotI2RlZmluZSBERVFVQU5USVpFKGNvZWYscXVhbnR2YWwpICAoKChJU0xPV19NVUxUX1RZUEUpIChjb2VmKSkgKiAocXVhbnR2YWwpKQotCi0KLS8qCi0gKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19pZGN0X2lzbG93IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJIEpDT0VGUFRSIGNvZWZfYmxvY2ssCi0JCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkKLXsKLSAgSU5UMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKLSAgSU5UMzIgdG1wMTAsIHRtcDExLCB0bXAxMiwgdG1wMTM7Ci0gIElOVDMyIHoxLCB6MiwgejMsIHo0LCB6NTsKLSAgSkNPRUZQVFIgaW5wdHI7Ci0gIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOwotICBpbnQgKiB3c3B0cjsKLSAgSlNBTVBST1cgb3V0cHRyOwotICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOwotICBpbnQgY3RyOwotICBpbnQgd29ya3NwYWNlW0RDVFNJWkUyXTsJLyogYnVmZmVycyBkYXRhIGJldHdlZW4gcGFzc2VzICovCi0gIFNISUZUX1RFTVBTCi0KLSAgLyogUGFzcyAxOiBwcm9jZXNzIGNvbHVtbnMgZnJvbSBpbnB1dCwgc3RvcmUgaW50byB3b3JrIGFycmF5LiAqLwotICAvKiBOb3RlIHJlc3VsdHMgYXJlIHNjYWxlZCB1cCBieSBzcXJ0KDgpIGNvbXBhcmVkIHRvIGEgdHJ1ZSBJRENUOyAqLwotICAvKiBmdXJ0aGVybW9yZSwgd2Ugc2NhbGUgdGhlIHJlc3VsdHMgYnkgMioqUEFTUzFfQklUUy4gKi8KLQotICBpbnB0ciA9IGNvZWZfYmxvY2s7Ci0gIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7Ci0gIHdzcHRyID0gd29ya3NwYWNlOwotICBmb3IgKGN0ciA9IERDVFNJWkU7IGN0ciA+IDA7IGN0ci0tKSB7Ci0gICAgLyogRHVlIHRvIHF1YW50aXphdGlvbiwgd2Ugd2lsbCB1c3VhbGx5IGZpbmQgdGhhdCBtYW55IG9mIHRoZSBpbnB1dAotICAgICAqIGNvZWZmaWNpZW50cyBhcmUgemVybywgZXNwZWNpYWxseSB0aGUgQUMgdGVybXMuICBXZSBjYW4gZXhwbG9pdCB0aGlzCi0gICAgICogYnkgc2hvcnQtY2lyY3VpdGluZyB0aGUgSURDVCBjYWxjdWxhdGlvbiBmb3IgYW55IGNvbHVtbiBpbiB3aGljaCBhbGwKLSAgICAgKiB0aGUgQUMgdGVybXMgYXJlIHplcm8uICBJbiB0aGF0IGNhc2UgZWFjaCBvdXRwdXQgaXMgZXF1YWwgdG8gdGhlCi0gICAgICogREMgY29lZmZpY2llbnQgKHdpdGggc2NhbGUgZmFjdG9yIGFzIG5lZWRlZCkuCi0gICAgICogV2l0aCB0eXBpY2FsIGltYWdlcyBhbmQgcXVhbnRpemF0aW9uIHRhYmxlcywgaGFsZiBvciBtb3JlIG9mIHRoZQotICAgICAqIGNvbHVtbiBEQ1QgY2FsY3VsYXRpb25zIGNhbiBiZSBzaW1wbGlmaWVkIHRoaXMgd2F5LgotICAgICAqLwotICAgIAotICAgIGlmIChpbnB0cltEQ1RTSVpFKjFdID09IDAgJiYgaW5wdHJbRENUU0laRSoyXSA9PSAwICYmCi0JaW5wdHJbRENUU0laRSozXSA9PSAwICYmIGlucHRyW0RDVFNJWkUqNF0gPT0gMCAmJgotCWlucHRyW0RDVFNJWkUqNV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjZdID09IDAgJiYKLQlpbnB0cltEQ1RTSVpFKjddID09IDApIHsKLSAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCi0gICAgICBpbnQgZGN2YWwgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pIDw8IFBBU1MxX0JJVFM7Ci0gICAgICAKLSAgICAgIHdzcHRyW0RDVFNJWkUqMF0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqMV0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqMl0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqM10gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqNF0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqNV0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqNl0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqN10gPSBkY3ZhbDsKLSAgICAgIAotICAgICAgaW5wdHIrKzsJCQkvKiBhZHZhbmNlIHBvaW50ZXJzIHRvIG5leHQgY29sdW1uICovCi0gICAgICBxdWFudHB0cisrOwotICAgICAgd3NwdHIrKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICAKLSAgICAvKiBFdmVuIHBhcnQ6IHJldmVyc2UgdGhlIGV2ZW4gcGFydCBvZiB0aGUgZm9yd2FyZCBEQ1QuICovCi0gICAgLyogVGhlIHJvdGF0b3IgaXMgc3FydCgyKSpjKC02KS4gKi8KLSAgICAKLSAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSoyXSwgcXVhbnRwdHJbRENUU0laRSoyXSk7Ci0gICAgejMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNl0sIHF1YW50cHRyW0RDVFNJWkUqNl0pOwotICAgIAotICAgIHoxID0gTVVMVElQTFkoejIgKyB6MywgRklYXzBfNTQxMTk2MTAwKTsKLSAgICB0bXAyID0gejEgKyBNVUxUSVBMWSh6MywgLSBGSVhfMV84NDc3NTkwNjUpOwotICAgIHRtcDMgPSB6MSArIE1VTFRJUExZKHoyLCBGSVhfMF83NjUzNjY4NjUpOwotICAgIAotICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjBdLCBxdWFudHB0cltEQ1RTSVpFKjBdKTsKLSAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo0XSwgcXVhbnRwdHJbRENUU0laRSo0XSk7Ci0KLSAgICB0bXAwID0gKHoyICsgejMpIDw8IENPTlNUX0JJVFM7Ci0gICAgdG1wMSA9ICh6MiAtIHozKSA8PCBDT05TVF9CSVRTOwotICAgIAotICAgIHRtcDEwID0gdG1wMCArIHRtcDM7Ci0gICAgdG1wMTMgPSB0bXAwIC0gdG1wMzsKLSAgICB0bXAxMSA9IHRtcDEgKyB0bXAyOwotICAgIHRtcDEyID0gdG1wMSAtIHRtcDI7Ci0gICAgCi0gICAgLyogT2RkIHBhcnQgcGVyIGZpZ3VyZSA4OyB0aGUgbWF0cml4IGlzIHVuaXRhcnkgYW5kIGhlbmNlIGl0cwotICAgICAqIHRyYW5zcG9zZSBpcyBpdHMgaW52ZXJzZS4gIGkwLi5pMyBhcmUgeTcseTUseTMseTEgcmVzcGVjdGl2ZWx5LgotICAgICAqLwotICAgIAotICAgIHRtcDAgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqN10sIHF1YW50cHRyW0RDVFNJWkUqN10pOwotICAgIHRtcDEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqNV0sIHF1YW50cHRyW0RDVFNJWkUqNV0pOwotICAgIHRtcDIgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOwotICAgIHRtcDMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOwotICAgIAotICAgIHoxID0gdG1wMCArIHRtcDM7Ci0gICAgejIgPSB0bXAxICsgdG1wMjsKLSAgICB6MyA9IHRtcDAgKyB0bXAyOwotICAgIHo0ID0gdG1wMSArIHRtcDM7Ci0gICAgejUgPSBNVUxUSVBMWSh6MyArIHo0LCBGSVhfMV8xNzU4NzU2MDIpOyAvKiBzcXJ0KDIpICogYzMgKi8KLSAgICAKLSAgICB0bXAwID0gTVVMVElQTFkodG1wMCwgRklYXzBfMjk4NjMxMzM2KTsgLyogc3FydCgyKSAqICgtYzErYzMrYzUtYzcpICovCi0gICAgdG1wMSA9IE1VTFRJUExZKHRtcDEsIEZJWF8yXzA1MzExOTg2OSk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1K2M3KSAqLwotICAgIHRtcDIgPSBNVUxUSVBMWSh0bXAyLCBGSVhfM18wNzI3MTEwMjYpOyAvKiBzcXJ0KDIpICogKCBjMStjMytjNS1jNykgKi8KLSAgICB0bXAzID0gTVVMVElQTFkodG1wMywgRklYXzFfNTAxMzIxMTEwKTsgLyogc3FydCgyKSAqICggYzErYzMtYzUtYzcpICovCi0gICAgejEgPSBNVUxUSVBMWSh6MSwgLSBGSVhfMF84OTk5NzYyMjMpOyAvKiBzcXJ0KDIpICogKGM3LWMzKSAqLwotICAgIHoyID0gTVVMVElQTFkoejIsIC0gRklYXzJfNTYyOTE1NDQ3KTsgLyogc3FydCgyKSAqICgtYzEtYzMpICovCi0gICAgejMgPSBNVUxUSVBMWSh6MywgLSBGSVhfMV85NjE1NzA1NjApOyAvKiBzcXJ0KDIpICogKC1jMy1jNSkgKi8KLSAgICB6NCA9IE1VTFRJUExZKHo0LCAtIEZJWF8wXzM5MDE4MDY0NCk7IC8qIHNxcnQoMikgKiAoYzUtYzMpICovCi0gICAgCi0gICAgejMgKz0gejU7Ci0gICAgejQgKz0gejU7Ci0gICAgCi0gICAgdG1wMCArPSB6MSArIHozOwotICAgIHRtcDEgKz0gejIgKyB6NDsKLSAgICB0bXAyICs9IHoyICsgejM7Ci0gICAgdG1wMyArPSB6MSArIHo0OwotICAgIAotICAgIC8qIEZpbmFsIG91dHB1dCBzdGFnZTogaW5wdXRzIGFyZSB0bXAxMC4udG1wMTMsIHRtcDAuLnRtcDMgKi8KLSAgICAKLSAgICB3c3B0cltEQ1RTSVpFKjBdID0gKGludCkgREVTQ0FMRSh0bXAxMCArIHRtcDMsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgd3NwdHJbRENUU0laRSo3XSA9IChpbnQpIERFU0NBTEUodG1wMTAgLSB0bXAzLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIHdzcHRyW0RDVFNJWkUqMV0gPSAoaW50KSBERVNDQUxFKHRtcDExICsgdG1wMiwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICB3c3B0cltEQ1RTSVpFKjZdID0gKGludCkgREVTQ0FMRSh0bXAxMSAtIHRtcDIsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgd3NwdHJbRENUU0laRSoyXSA9IChpbnQpIERFU0NBTEUodG1wMTIgKyB0bXAxLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIHdzcHRyW0RDVFNJWkUqNV0gPSAoaW50KSBERVNDQUxFKHRtcDEyIC0gdG1wMSwgQ09OU1RfQklUUy1QQVNTMV9CSVRTKTsKLSAgICB3c3B0cltEQ1RTSVpFKjNdID0gKGludCkgREVTQ0FMRSh0bXAxMyArIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUyk7Ci0gICAgd3NwdHJbRENUU0laRSo0XSA9IChpbnQpIERFU0NBTEUodG1wMTMgLSB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMpOwotICAgIAotICAgIGlucHRyKys7CQkJLyogYWR2YW5jZSBwb2ludGVycyB0byBuZXh0IGNvbHVtbiAqLwotICAgIHF1YW50cHRyKys7Ci0gICAgd3NwdHIrKzsKLSAgfQotICAKLSAgLyogUGFzcyAyOiBwcm9jZXNzIHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4gKi8KLSAgLyogTm90ZSB0aGF0IHdlIG11c3QgZGVzY2FsZSB0aGUgcmVzdWx0cyBieSBhIGZhY3RvciBvZiA4ID09IDIqKjMsICovCi0gIC8qIGFuZCBhbHNvIHVuZG8gdGhlIFBBU1MxX0JJVFMgc2NhbGluZy4gKi8KLQotICB3c3B0ciA9IHdvcmtzcGFjZTsKLSAgZm9yIChjdHIgPSAwOyBjdHIgPCBEQ1RTSVpFOyBjdHIrKykgewotICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7Ci0gICAgLyogUm93cyBvZiB6ZXJvZXMgY2FuIGJlIGV4cGxvaXRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgd2UgZGlkIHdpdGggY29sdW1ucy4KLSAgICAgKiBIb3dldmVyLCB0aGUgY29sdW1uIGNhbGN1bGF0aW9uIGhhcyBjcmVhdGVkIG1hbnkgbm9uemVybyBBQyB0ZXJtcywgc28KLSAgICAgKiB0aGUgc2ltcGxpZmljYXRpb24gYXBwbGllcyBsZXNzIG9mdGVuICh0eXBpY2FsbHkgNSUgdG8gMTAlIG9mIHRoZSB0aW1lKS4KLSAgICAgKiBPbiBtYWNoaW5lcyB3aXRoIHZlcnkgZmFzdCBtdWx0aXBsaWNhdGlvbiwgaXQncyBwb3NzaWJsZSB0aGF0IHRoZQotICAgICAqIHRlc3QgdGFrZXMgbW9yZSB0aW1lIHRoYW4gaXQncyB3b3J0aC4gIEluIHRoYXQgY2FzZSB0aGlzIHNlY3Rpb24KLSAgICAgKiBtYXkgYmUgY29tbWVudGVkIG91dC4KLSAgICAgKi8KLSAgICAKLSNpZm5kZWYgTk9fWkVST19ST1dfVEVTVAotICAgIGlmICh3c3B0clsxXSA9PSAwICYmIHdzcHRyWzJdID09IDAgJiYgd3NwdHJbM10gPT0gMCAmJiB3c3B0cls0XSA9PSAwICYmCi0Jd3NwdHJbNV0gPT0gMCAmJiB3c3B0cls2XSA9PSAwICYmIHdzcHRyWzddID09IDApIHsKLSAgICAgIC8qIEFDIHRlcm1zIGFsbCB6ZXJvICovCi0gICAgICBKU0FNUExFIGRjdmFsID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSgoSU5UMzIpIHdzcHRyWzBdLCBQQVNTMV9CSVRTKzMpCi0JCQkJICAmIFJBTkdFX01BU0tdOwotICAgICAgCi0gICAgICBvdXRwdHJbMF0gPSBkY3ZhbDsKLSAgICAgIG91dHB0clsxXSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzJdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbM10gPSBkY3ZhbDsKLSAgICAgIG91dHB0cls0XSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzVdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbNl0gPSBkY3ZhbDsKLSAgICAgIG91dHB0cls3XSA9IGRjdmFsOwotCi0gICAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCi0gICAgICBjb250aW51ZTsKLSAgICB9Ci0jZW5kaWYKLSAgICAKLSAgICAvKiBFdmVuIHBhcnQ6IHJldmVyc2UgdGhlIGV2ZW4gcGFydCBvZiB0aGUgZm9yd2FyZCBEQ1QuICovCi0gICAgLyogVGhlIHJvdGF0b3IgaXMgc3FydCgyKSpjKC02KS4gKi8KLSAgICAKLSAgICB6MiA9IChJTlQzMikgd3NwdHJbMl07Ci0gICAgejMgPSAoSU5UMzIpIHdzcHRyWzZdOwotICAgIAotICAgIHoxID0gTVVMVElQTFkoejIgKyB6MywgRklYXzBfNTQxMTk2MTAwKTsKLSAgICB0bXAyID0gejEgKyBNVUxUSVBMWSh6MywgLSBGSVhfMV84NDc3NTkwNjUpOwotICAgIHRtcDMgPSB6MSArIE1VTFRJUExZKHoyLCBGSVhfMF83NjUzNjY4NjUpOwotICAgIAotICAgIHRtcDAgPSAoKElOVDMyKSB3c3B0clswXSArIChJTlQzMikgd3NwdHJbNF0pIDw8IENPTlNUX0JJVFM7Ci0gICAgdG1wMSA9ICgoSU5UMzIpIHdzcHRyWzBdIC0gKElOVDMyKSB3c3B0cls0XSkgPDwgQ09OU1RfQklUUzsKLSAgICAKLSAgICB0bXAxMCA9IHRtcDAgKyB0bXAzOwotICAgIHRtcDEzID0gdG1wMCAtIHRtcDM7Ci0gICAgdG1wMTEgPSB0bXAxICsgdG1wMjsKLSAgICB0bXAxMiA9IHRtcDEgLSB0bXAyOwotICAgIAotICAgIC8qIE9kZCBwYXJ0IHBlciBmaWd1cmUgODsgdGhlIG1hdHJpeCBpcyB1bml0YXJ5IGFuZCBoZW5jZSBpdHMKLSAgICAgKiB0cmFuc3Bvc2UgaXMgaXRzIGludmVyc2UuICBpMC4uaTMgYXJlIHk3LHk1LHkzLHkxIHJlc3BlY3RpdmVseS4KLSAgICAgKi8KLSAgICAKLSAgICB0bXAwID0gKElOVDMyKSB3c3B0cls3XTsKLSAgICB0bXAxID0gKElOVDMyKSB3c3B0cls1XTsKLSAgICB0bXAyID0gKElOVDMyKSB3c3B0clszXTsKLSAgICB0bXAzID0gKElOVDMyKSB3c3B0clsxXTsKLSAgICAKLSAgICB6MSA9IHRtcDAgKyB0bXAzOwotICAgIHoyID0gdG1wMSArIHRtcDI7Ci0gICAgejMgPSB0bXAwICsgdG1wMjsKLSAgICB6NCA9IHRtcDEgKyB0bXAzOwotICAgIHo1ID0gTVVMVElQTFkoejMgKyB6NCwgRklYXzFfMTc1ODc1NjAyKTsgLyogc3FydCgyKSAqIGMzICovCi0gICAgCi0gICAgdG1wMCA9IE1VTFRJUExZKHRtcDAsIEZJWF8wXzI5ODYzMTMzNik7IC8qIHNxcnQoMikgKiAoLWMxK2MzK2M1LWM3KSAqLwotICAgIHRtcDEgPSBNVUxUSVBMWSh0bXAxLCBGSVhfMl8wNTMxMTk4NjkpOyAvKiBzcXJ0KDIpICogKCBjMStjMy1jNStjNykgKi8KLSAgICB0bXAyID0gTVVMVElQTFkodG1wMiwgRklYXzNfMDcyNzExMDI2KTsgLyogc3FydCgyKSAqICggYzErYzMrYzUtYzcpICovCi0gICAgdG1wMyA9IE1VTFRJUExZKHRtcDMsIEZJWF8xXzUwMTMyMTExMCk7IC8qIHNxcnQoMikgKiAoIGMxK2MzLWM1LWM3KSAqLwotICAgIHoxID0gTVVMVElQTFkoejEsIC0gRklYXzBfODk5OTc2MjIzKTsgLyogc3FydCgyKSAqIChjNy1jMykgKi8KLSAgICB6MiA9IE1VTFRJUExZKHoyLCAtIEZJWF8yXzU2MjkxNTQ0Nyk7IC8qIHNxcnQoMikgKiAoLWMxLWMzKSAqLwotICAgIHozID0gTVVMVElQTFkoejMsIC0gRklYXzFfOTYxNTcwNTYwKTsgLyogc3FydCgyKSAqICgtYzMtYzUpICovCi0gICAgejQgPSBNVUxUSVBMWSh6NCwgLSBGSVhfMF8zOTAxODA2NDQpOyAvKiBzcXJ0KDIpICogKGM1LWMzKSAqLwotICAgIAotICAgIHozICs9IHo1OwotICAgIHo0ICs9IHo1OwotICAgIAotICAgIHRtcDAgKz0gejEgKyB6MzsKLSAgICB0bXAxICs9IHoyICsgejQ7Ci0gICAgdG1wMiArPSB6MiArIHozOwotICAgIHRtcDMgKz0gejEgKyB6NDsKLSAgICAKLSAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2U6IGlucHV0cyBhcmUgdG1wMTAuLnRtcDEzLCB0bXAwLi50bXAzICovCi0gICAgCi0gICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMCArIHRtcDMsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbN10gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEwIC0gdG1wMywKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTEgKyB0bXAyLAotCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzZdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMSAtIHRtcDIsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbMl0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEyICsgdG1wMSwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0cls1XSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTIgLSB0bXAxLAotCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzNdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMyArIHRtcDAsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbNF0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEzIC0gdG1wMCwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMykKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIAotICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KLSAgfQotfQotCi0jZW5kaWYgLyogRENUX0lTTE9XX1NVUFBPUlRFRCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2ppZGN0cmVkLmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamlkY3RyZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxZjNjNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfamlkY3RyZWQuYworKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi0vKgotICogamlkY3RyZWQuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk4LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIGludmVyc2UtRENUIHJvdXRpbmVzIHRoYXQgcHJvZHVjZSByZWR1Y2VkLXNpemUgb3V0cHV0OgotICogZWl0aGVyIDR4NCwgMngyLCBvciAxeDEgcGl4ZWxzIGZyb20gYW4gOHg4IERDVCBibG9jay4KLSAqCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gdGhlIExvZWZmbGVyLCBMaWd0ZW5iZXJnIGFuZCBNb3NjaHl0eiAoTEwmTSkKLSAqIGFsZ29yaXRobSB1c2VkIGluIGppZGN0aW50LmMuICBXZSBzaW1wbHkgcmVwbGFjZSBlYWNoIDgtdG8tOCAxLUQgSURDVCBzdGVwCi0gKiB3aXRoIGFuIDgtdG8tNCBzdGVwIHRoYXQgcHJvZHVjZXMgdGhlIGZvdXIgYXZlcmFnZXMgb2YgdHdvIGFkamFjZW50IG91dHB1dHMKLSAqIChvciBhbiA4LXRvLTIgc3RlcCBwcm9kdWNpbmcgdHdvIGF2ZXJhZ2VzIG9mIGZvdXIgb3V0cHV0cywgZm9yIDJ4MiBvdXRwdXQpLgotICogVGhlc2Ugc3RlcHMgd2VyZSBkZXJpdmVkIGJ5IGNvbXB1dGluZyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMgYXQgdGhlIGVuZAotICogb2YgdGhlIG5vcm1hbCBMTCZNIGNvZGUsIHRoZW4gc2ltcGxpZnlpbmcgYXMgbXVjaCBhcyBwb3NzaWJsZS4KLSAqCi0gKiAxeDEgaXMgdHJpdmlhbDoganVzdCB0YWtlIHRoZSBEQyBjb2VmZmljaWVudCBkaXZpZGVkIGJ5IDguCi0gKgotICogU2VlIGppZGN0aW50LmMgZm9yIGFkZGl0aW9uYWwgY29tbWVudHMuCi0gKi8KLQotI2RlZmluZSBKUEVHX0lOVEVSTkFMUwotI2luY2x1ZGUgImppbmNsdWRlLmgiCi0jaW5jbHVkZSAianBlZ2xpYi5oIgotI2luY2x1ZGUgImpkY3QuaCIJCS8qIFByaXZhdGUgZGVjbGFyYXRpb25zIGZvciBEQ1Qgc3Vic3lzdGVtICovCi0KLSNpZmRlZiBJRENUX1NDQUxJTkdfU1VQUE9SVEVECi0KLQotLyoKLSAqIFRoaXMgbW9kdWxlIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBjYXNlIERDVFNJWkUgPSA4LgotICovCi0KLSNpZiBEQ1RTSVpFICE9IDgKLSAgU29ycnksIHRoaXMgY29kZSBvbmx5IGNvcGVzIHdpdGggOHg4IERDVHMuIC8qIGRlbGliZXJhdGUgc3ludGF4IGVyciAqLwotI2VuZGlmCi0KLQotLyogU2NhbGluZyBpcyB0aGUgc2FtZSBhcyBpbiBqaWRjdGludC5jLiAqLwotCi0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLSNkZWZpbmUgQ09OU1RfQklUUyAgMTMKLSNkZWZpbmUgUEFTUzFfQklUUyAgMgotI2Vsc2UKLSNkZWZpbmUgQ09OU1RfQklUUyAgMTMKLSNkZWZpbmUgUEFTUzFfQklUUyAgMQkJLyogbG9zZSBhIGxpdHRsZSBwcmVjaXNpb24gdG8gYXZvaWQgb3ZlcmZsb3cgKi8KLSNlbmRpZgotCi0vKiBTb21lIEMgY29tcGlsZXJzIGZhaWwgdG8gcmVkdWNlICJGSVgoY29uc3RhbnQpIiBhdCBjb21waWxlIHRpbWUsIHRodXMKLSAqIGNhdXNpbmcgYSBsb3Qgb2YgdXNlbGVzcyBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIGF0IHJ1biB0aW1lLgotICogVG8gZ2V0IGFyb3VuZCB0aGlzIHdlIHVzZSB0aGUgZm9sbG93aW5nIHByZS1jYWxjdWxhdGVkIGNvbnN0YW50cy4KLSAqIElmIHlvdSBjaGFuZ2UgQ09OU1RfQklUUyB5b3UgbWF5IHdhbnQgdG8gYWRkIGFwcHJvcHJpYXRlIHZhbHVlcy4KLSAqIChXaXRoIGEgcmVhc29uYWJsZSBDIGNvbXBpbGVyLCB5b3UgY2FuIGp1c3QgcmVseSBvbiB0aGUgRklYKCkgbWFjcm8uLi4pCi0gKi8KLQotI2lmIENPTlNUX0JJVFMgPT0gMTMKLSNkZWZpbmUgRklYXzBfMjExMTY0MjQzICAoKElOVDMyKSAgMTczMCkJLyogRklYKDAuMjExMTY0MjQzKSAqLwotI2RlZmluZSBGSVhfMF81MDk3OTU1NzkgICgoSU5UMzIpICA0MTc2KQkvKiBGSVgoMC41MDk3OTU1NzkpICovCi0jZGVmaW5lIEZJWF8wXzYwMTM0NDg4NyAgKChJTlQzMikgIDQ5MjYpCS8qIEZJWCgwLjYwMTM0NDg4NykgKi8KLSNkZWZpbmUgRklYXzBfNzIwOTU5ODIyICAoKElOVDMyKSAgNTkwNikJLyogRklYKDAuNzIwOTU5ODIyKSAqLwotI2RlZmluZSBGSVhfMF83NjUzNjY4NjUgICgoSU5UMzIpICA2MjcwKQkvKiBGSVgoMC43NjUzNjY4NjUpICovCi0jZGVmaW5lIEZJWF8wXzg1MDQzMDA5NSAgKChJTlQzMikgIDY5NjcpCS8qIEZJWCgwLjg1MDQzMDA5NSkgKi8KLSNkZWZpbmUgRklYXzBfODk5OTc2MjIzICAoKElOVDMyKSAgNzM3MykJLyogRklYKDAuODk5OTc2MjIzKSAqLwotI2RlZmluZSBGSVhfMV8wNjE1OTQzMzcgICgoSU5UMzIpICA4Njk3KQkvKiBGSVgoMS4wNjE1OTQzMzcpICovCi0jZGVmaW5lIEZJWF8xXzI3Mjc1ODU4MCAgKChJTlQzMikgIDEwNDI2KQkvKiBGSVgoMS4yNzI3NTg1ODApICovCi0jZGVmaW5lIEZJWF8xXzQ1MTc3NDk4MSAgKChJTlQzMikgIDExODkzKQkvKiBGSVgoMS40NTE3NzQ5ODEpICovCi0jZGVmaW5lIEZJWF8xXzg0Nzc1OTA2NSAgKChJTlQzMikgIDE1MTM3KQkvKiBGSVgoMS44NDc3NTkwNjUpICovCi0jZGVmaW5lIEZJWF8yXzE3MjczNDgwMyAgKChJTlQzMikgIDE3Nzk5KQkvKiBGSVgoMi4xNzI3MzQ4MDMpICovCi0jZGVmaW5lIEZJWF8yXzU2MjkxNTQ0NyAgKChJTlQzMikgIDIwOTk1KQkvKiBGSVgoMi41NjI5MTU0NDcpICovCi0jZGVmaW5lIEZJWF8zXzYyNDUwOTc4NSAgKChJTlQzMikgIDI5NjkyKQkvKiBGSVgoMy42MjQ1MDk3ODUpICovCi0jZWxzZQotI2RlZmluZSBGSVhfMF8yMTExNjQyNDMgIEZJWCgwLjIxMTE2NDI0MykKLSNkZWZpbmUgRklYXzBfNTA5Nzk1NTc5ICBGSVgoMC41MDk3OTU1NzkpCi0jZGVmaW5lIEZJWF8wXzYwMTM0NDg4NyAgRklYKDAuNjAxMzQ0ODg3KQotI2RlZmluZSBGSVhfMF83MjA5NTk4MjIgIEZJWCgwLjcyMDk1OTgyMikKLSNkZWZpbmUgRklYXzBfNzY1MzY2ODY1ICBGSVgoMC43NjUzNjY4NjUpCi0jZGVmaW5lIEZJWF8wXzg1MDQzMDA5NSAgRklYKDAuODUwNDMwMDk1KQotI2RlZmluZSBGSVhfMF84OTk5NzYyMjMgIEZJWCgwLjg5OTk3NjIyMykKLSNkZWZpbmUgRklYXzFfMDYxNTk0MzM3ICBGSVgoMS4wNjE1OTQzMzcpCi0jZGVmaW5lIEZJWF8xXzI3Mjc1ODU4MCAgRklYKDEuMjcyNzU4NTgwKQotI2RlZmluZSBGSVhfMV80NTE3NzQ5ODEgIEZJWCgxLjQ1MTc3NDk4MSkKLSNkZWZpbmUgRklYXzFfODQ3NzU5MDY1ICBGSVgoMS44NDc3NTkwNjUpCi0jZGVmaW5lIEZJWF8yXzE3MjczNDgwMyAgRklYKDIuMTcyNzM0ODAzKQotI2RlZmluZSBGSVhfMl81NjI5MTU0NDcgIEZJWCgyLjU2MjkxNTQ0NykKLSNkZWZpbmUgRklYXzNfNjI0NTA5Nzg1ICBGSVgoMy42MjQ1MDk3ODUpCi0jZW5kaWYKLQotCi0vKiBNdWx0aXBseSBhbiBJTlQzMiB2YXJpYWJsZSBieSBhbiBJTlQzMiBjb25zdGFudCB0byB5aWVsZCBhbiBJTlQzMiByZXN1bHQuCi0gKiBGb3IgOC1iaXQgc2FtcGxlcyB3aXRoIHRoZSByZWNvbW1lbmRlZCBzY2FsaW5nLCBhbGwgdGhlIHZhcmlhYmxlCi0gKiBhbmQgY29uc3RhbnQgdmFsdWVzIGludm9sdmVkIGFyZSBubyBtb3JlIHRoYW4gMTYgYml0cyB3aWRlLCBzbyBhCi0gKiAxNngxNi0+MzIgYml0IG11bHRpcGx5IGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgYSBmdWxsIDMyeDMyIG11bHRpcGx5LgotICogRm9yIDEyLWJpdCBzYW1wbGVzLCBhIGZ1bGwgMzItYml0IG11bHRpcGxpY2F0aW9uIHdpbGwgYmUgbmVlZGVkLgotICovCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAotI2RlZmluZSBNVUxUSVBMWSh2YXIsY29uc3QpICBNVUxUSVBMWTE2QzE2KHZhcixjb25zdCkKLSNlbHNlCi0jZGVmaW5lIE1VTFRJUExZKHZhcixjb25zdCkgICgodmFyKSAqIChjb25zdCkpCi0jZW5kaWYKLQotCi0vKiBEZXF1YW50aXplIGEgY29lZmZpY2llbnQgYnkgbXVsdGlwbHlpbmcgaXQgYnkgdGhlIG11bHRpcGxpZXItdGFibGUKLSAqIGVudHJ5OyBwcm9kdWNlIGFuIGludCByZXN1bHQuICBJbiB0aGlzIG1vZHVsZSwgYm90aCBpbnB1dHMgYW5kIHJlc3VsdAotICogYXJlIDE2IGJpdHMgb3IgbGVzcywgc28gZWl0aGVyIGludCBvciBzaG9ydCBtdWx0aXBseSB3aWxsIHdvcmsuCi0gKi8KLQotI2RlZmluZSBERVFVQU5USVpFKGNvZWYscXVhbnR2YWwpICAoKChJU0xPV19NVUxUX1RZUEUpIChjb2VmKSkgKiAocXVhbnR2YWwpKQotCi0KLS8qCi0gKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAotICogcHJvZHVjaW5nIGEgcmVkdWNlZC1zaXplIDR4NCBvdXRwdXQgYmxvY2suCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2lkY3RfNHg0IChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKLQkgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCi17Ci0gIElOVDMyIHRtcDAsIHRtcDIsIHRtcDEwLCB0bXAxMjsKLSAgSU5UMzIgejEsIHoyLCB6MywgejQ7Ci0gIEpDT0VGUFRSIGlucHRyOwotICBJU0xPV19NVUxUX1RZUEUgKiBxdWFudHB0cjsKLSAgaW50ICogd3NwdHI7Ci0gIEpTQU1QUk9XIG91dHB0cjsKLSAgSlNBTVBMRSAqcmFuZ2VfbGltaXQgPSBJRENUX3JhbmdlX2xpbWl0KGNpbmZvKTsKLSAgaW50IGN0cjsKLSAgaW50IHdvcmtzcGFjZVtEQ1RTSVpFKjRdOwkvKiBidWZmZXJzIGRhdGEgYmV0d2VlbiBwYXNzZXMgKi8KLSAgU0hJRlRfVEVNUFMKLQotICAvKiBQYXNzIDE6IHByb2Nlc3MgY29sdW1ucyBmcm9tIGlucHV0LCBzdG9yZSBpbnRvIHdvcmsgYXJyYXkuICovCi0KLSAgaW5wdHIgPSBjb2VmX2Jsb2NrOwotICBxdWFudHB0ciA9IChJU0xPV19NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOwotICB3c3B0ciA9IHdvcmtzcGFjZTsKLSAgZm9yIChjdHIgPSBEQ1RTSVpFOyBjdHIgPiAwOyBpbnB0cisrLCBxdWFudHB0cisrLCB3c3B0cisrLCBjdHItLSkgewotICAgIC8qIERvbid0IGJvdGhlciB0byBwcm9jZXNzIGNvbHVtbiA0LCBiZWNhdXNlIHNlY29uZCBwYXNzIHdvbid0IHVzZSBpdCAqLwotICAgIGlmIChjdHIgPT0gRENUU0laRS00KQotICAgICAgY29udGludWU7Ci0gICAgaWYgKGlucHRyW0RDVFNJWkUqMV0gPT0gMCAmJiBpbnB0cltEQ1RTSVpFKjJdID09IDAgJiYKLQlpbnB0cltEQ1RTSVpFKjNdID09IDAgJiYgaW5wdHJbRENUU0laRSo1XSA9PSAwICYmCi0JaW5wdHJbRENUU0laRSo2XSA9PSAwICYmIGlucHRyW0RDVFNJWkUqN10gPT0gMCkgewotICAgICAgLyogQUMgdGVybXMgYWxsIHplcm87IHdlIG5lZWQgbm90IGV4YW1pbmUgdGVybSA0IGZvciA0eDQgb3V0cHV0ICovCi0gICAgICBpbnQgZGN2YWwgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pIDw8IFBBU1MxX0JJVFM7Ci0gICAgICAKLSAgICAgIHdzcHRyW0RDVFNJWkUqMF0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqMV0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqMl0gPSBkY3ZhbDsKLSAgICAgIHdzcHRyW0RDVFNJWkUqM10gPSBkY3ZhbDsKLSAgICAgIAotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIAotICAgIC8qIEV2ZW4gcGFydCAqLwotICAgIAotICAgIHRtcDAgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOwotICAgIHRtcDAgPDw9IChDT05TVF9CSVRTKzEpOwotICAgIAotICAgIHoyID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjJdLCBxdWFudHB0cltEQ1RTSVpFKjJdKTsKLSAgICB6MyA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo2XSwgcXVhbnRwdHJbRENUU0laRSo2XSk7Ci0KLSAgICB0bXAyID0gTVVMVElQTFkoejIsIEZJWF8xXzg0Nzc1OTA2NSkgKyBNVUxUSVBMWSh6MywgLSBGSVhfMF83NjUzNjY4NjUpOwotICAgIAotICAgIHRtcDEwID0gdG1wMCArIHRtcDI7Ci0gICAgdG1wMTIgPSB0bXAwIC0gdG1wMjsKLSAgICAKLSAgICAvKiBPZGQgcGFydCAqLwotICAgIAotICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjddLCBxdWFudHB0cltEQ1RTSVpFKjddKTsKLSAgICB6MiA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo1XSwgcXVhbnRwdHJbRENUU0laRSo1XSk7Ci0gICAgejMgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOwotICAgIHo0ID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjFdLCBxdWFudHB0cltEQ1RTSVpFKjFdKTsKLSAgICAKLSAgICB0bXAwID0gTVVMVElQTFkoejEsIC0gRklYXzBfMjExMTY0MjQzKSAvKiBzcXJ0KDIpICogKGMzLWMxKSAqLwotCSArIE1VTFRJUExZKHoyLCBGSVhfMV80NTE3NzQ5ODEpIC8qIHNxcnQoMikgKiAoYzMrYzcpICovCi0JICsgTVVMVElQTFkoejMsIC0gRklYXzJfMTcyNzM0ODAzKSAvKiBzcXJ0KDIpICogKC1jMS1jNSkgKi8KLQkgKyBNVUxUSVBMWSh6NCwgRklYXzFfMDYxNTk0MzM3KTsgLyogc3FydCgyKSAqIChjNStjNykgKi8KLSAgICAKLSAgICB0bXAyID0gTVVMVElQTFkoejEsIC0gRklYXzBfNTA5Nzk1NTc5KSAvKiBzcXJ0KDIpICogKGM3LWM1KSAqLwotCSArIE1VTFRJUExZKHoyLCAtIEZJWF8wXzYwMTM0NDg4NykgLyogc3FydCgyKSAqIChjNS1jMSkgKi8KLQkgKyBNVUxUSVBMWSh6MywgRklYXzBfODk5OTc2MjIzKSAvKiBzcXJ0KDIpICogKGMzLWM3KSAqLwotCSArIE1VTFRJUExZKHo0LCBGSVhfMl81NjI5MTU0NDcpOyAvKiBzcXJ0KDIpICogKGMxK2MzKSAqLwotCi0gICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCi0gICAgCi0gICAgd3NwdHJbRENUU0laRSowXSA9IChpbnQpIERFU0NBTEUodG1wMTAgKyB0bXAyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMrMSk7Ci0gICAgd3NwdHJbRENUU0laRSozXSA9IChpbnQpIERFU0NBTEUodG1wMTAgLSB0bXAyLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMrMSk7Ci0gICAgd3NwdHJbRENUU0laRSoxXSA9IChpbnQpIERFU0NBTEUodG1wMTIgKyB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMrMSk7Ci0gICAgd3NwdHJbRENUU0laRSoyXSA9IChpbnQpIERFU0NBTEUodG1wMTIgLSB0bXAwLCBDT05TVF9CSVRTLVBBU1MxX0JJVFMrMSk7Ci0gIH0KLSAgCi0gIC8qIFBhc3MgMjogcHJvY2VzcyA0IHJvd3MgZnJvbSB3b3JrIGFycmF5LCBzdG9yZSBpbnRvIG91dHB1dCBhcnJheS4gKi8KLQotICB3c3B0ciA9IHdvcmtzcGFjZTsKLSAgZm9yIChjdHIgPSAwOyBjdHIgPCA0OyBjdHIrKykgewotICAgIG91dHB0ciA9IG91dHB1dF9idWZbY3RyXSArIG91dHB1dF9jb2w7Ci0gICAgLyogSXQncyBub3QgY2xlYXIgd2hldGhlciBhIHplcm8gcm93IHRlc3QgaXMgd29ydGh3aGlsZSBoZXJlIC4uLiAqLwotCi0jaWZuZGVmIE5PX1pFUk9fUk9XX1RFU1QKLSAgICBpZiAod3NwdHJbMV0gPT0gMCAmJiB3c3B0clsyXSA9PSAwICYmIHdzcHRyWzNdID09IDAgJiYKLQl3c3B0cls1XSA9PSAwICYmIHdzcHRyWzZdID09IDAgJiYgd3NwdHJbN10gPT0gMCkgewotICAgICAgLyogQUMgdGVybXMgYWxsIHplcm8gKi8KLSAgICAgIEpTQU1QTEUgZGN2YWwgPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKChJTlQzMikgd3NwdHJbMF0sIFBBU1MxX0JJVFMrMykKLQkJCQkgICYgUkFOR0VfTUFTS107Ci0gICAgICAKLSAgICAgIG91dHB0clswXSA9IGRjdmFsOwotICAgICAgb3V0cHRyWzFdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbMl0gPSBkY3ZhbDsKLSAgICAgIG91dHB0clszXSA9IGRjdmFsOwotICAgICAgCi0gICAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCi0gICAgICBjb250aW51ZTsKLSAgICB9Ci0jZW5kaWYKLSAgICAKLSAgICAvKiBFdmVuIHBhcnQgKi8KLSAgICAKLSAgICB0bXAwID0gKChJTlQzMikgd3NwdHJbMF0pIDw8IChDT05TVF9CSVRTKzEpOwotICAgIAotICAgIHRtcDIgPSBNVUxUSVBMWSgoSU5UMzIpIHdzcHRyWzJdLCBGSVhfMV84NDc3NTkwNjUpCi0JICsgTVVMVElQTFkoKElOVDMyKSB3c3B0cls2XSwgLSBGSVhfMF83NjUzNjY4NjUpOwotICAgIAotICAgIHRtcDEwID0gdG1wMCArIHRtcDI7Ci0gICAgdG1wMTIgPSB0bXAwIC0gdG1wMjsKLSAgICAKLSAgICAvKiBPZGQgcGFydCAqLwotICAgIAotICAgIHoxID0gKElOVDMyKSB3c3B0cls3XTsKLSAgICB6MiA9IChJTlQzMikgd3NwdHJbNV07Ci0gICAgejMgPSAoSU5UMzIpIHdzcHRyWzNdOwotICAgIHo0ID0gKElOVDMyKSB3c3B0clsxXTsKLSAgICAKLSAgICB0bXAwID0gTVVMVElQTFkoejEsIC0gRklYXzBfMjExMTY0MjQzKSAvKiBzcXJ0KDIpICogKGMzLWMxKSAqLwotCSArIE1VTFRJUExZKHoyLCBGSVhfMV80NTE3NzQ5ODEpIC8qIHNxcnQoMikgKiAoYzMrYzcpICovCi0JICsgTVVMVElQTFkoejMsIC0gRklYXzJfMTcyNzM0ODAzKSAvKiBzcXJ0KDIpICogKC1jMS1jNSkgKi8KLQkgKyBNVUxUSVBMWSh6NCwgRklYXzFfMDYxNTk0MzM3KTsgLyogc3FydCgyKSAqIChjNStjNykgKi8KLSAgICAKLSAgICB0bXAyID0gTVVMVElQTFkoejEsIC0gRklYXzBfNTA5Nzk1NTc5KSAvKiBzcXJ0KDIpICogKGM3LWM1KSAqLwotCSArIE1VTFRJUExZKHoyLCAtIEZJWF8wXzYwMTM0NDg4NykgLyogc3FydCgyKSAqIChjNS1jMSkgKi8KLQkgKyBNVUxUSVBMWSh6MywgRklYXzBfODk5OTc2MjIzKSAvKiBzcXJ0KDIpICogKGMzLWM3KSAqLwotCSArIE1VTFRJUExZKHo0LCBGSVhfMl81NjI5MTU0NDcpOyAvKiBzcXJ0KDIpICogKGMxK2MzKSAqLwotCi0gICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCi0gICAgCi0gICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMCArIHRtcDIsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMrMSkKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0clszXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTAgLSB0bXAyLAotCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKzEpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICBvdXRwdHJbMV0gPSByYW5nZV9saW1pdFsoaW50KSBERVNDQUxFKHRtcDEyICsgdG1wMCwKLQkJCQkJICBDT05TVF9CSVRTK1BBU1MxX0JJVFMrMysxKQotCQkJICAgICYgUkFOR0VfTUFTS107Ci0gICAgb3V0cHRyWzJdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMiAtIHRtcDAsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMrMSkKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIAotICAgIHdzcHRyICs9IERDVFNJWkU7CQkvKiBhZHZhbmNlIHBvaW50ZXIgdG8gbmV4dCByb3cgKi8KLSAgfQotfQotCi0KLS8qCi0gKiBQZXJmb3JtIGRlcXVhbnRpemF0aW9uIGFuZCBpbnZlcnNlIERDVCBvbiBvbmUgYmxvY2sgb2YgY29lZmZpY2llbnRzLAotICogcHJvZHVjaW5nIGEgcmVkdWNlZC1zaXplIDJ4MiBvdXRwdXQgYmxvY2suCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX2lkY3RfMngyIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgICAgICAgSkNPRUZQVFIgY29lZl9ibG9jaywKLQkgICAgICAgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpCi17Ci0gIElOVDMyIHRtcDAsIHRtcDEwLCB6MTsKLSAgSkNPRUZQVFIgaW5wdHI7Ci0gIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOwotICBpbnQgKiB3c3B0cjsKLSAgSlNBTVBST1cgb3V0cHRyOwotICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOwotICBpbnQgY3RyOwotICBpbnQgd29ya3NwYWNlW0RDVFNJWkUqMl07CS8qIGJ1ZmZlcnMgZGF0YSBiZXR3ZWVuIHBhc3NlcyAqLwotICBTSElGVF9URU1QUwotCi0gIC8qIFBhc3MgMTogcHJvY2VzcyBjb2x1bW5zIGZyb20gaW5wdXQsIHN0b3JlIGludG8gd29yayBhcnJheS4gKi8KLQotICBpbnB0ciA9IGNvZWZfYmxvY2s7Ci0gIHF1YW50cHRyID0gKElTTE9XX01VTFRfVFlQRSAqKSBjb21wcHRyLT5kY3RfdGFibGU7Ci0gIHdzcHRyID0gd29ya3NwYWNlOwotICBmb3IgKGN0ciA9IERDVFNJWkU7IGN0ciA+IDA7IGlucHRyKyssIHF1YW50cHRyKyssIHdzcHRyKyssIGN0ci0tKSB7Ci0gICAgLyogRG9uJ3QgYm90aGVyIHRvIHByb2Nlc3MgY29sdW1ucyAyLDQsNiAqLwotICAgIGlmIChjdHIgPT0gRENUU0laRS0yIHx8IGN0ciA9PSBEQ1RTSVpFLTQgfHwgY3RyID09IERDVFNJWkUtNikKLSAgICAgIGNvbnRpbnVlOwotICAgIGlmIChpbnB0cltEQ1RTSVpFKjFdID09IDAgJiYgaW5wdHJbRENUU0laRSozXSA9PSAwICYmCi0JaW5wdHJbRENUU0laRSo1XSA9PSAwICYmIGlucHRyW0RDVFNJWkUqN10gPT0gMCkgewotICAgICAgLyogQUMgdGVybXMgYWxsIHplcm87IHdlIG5lZWQgbm90IGV4YW1pbmUgdGVybXMgMiw0LDYgZm9yIDJ4MiBvdXRwdXQgKi8KLSAgICAgIGludCBkY3ZhbCA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSowXSwgcXVhbnRwdHJbRENUU0laRSowXSkgPDwgUEFTUzFfQklUUzsKLSAgICAgIAotICAgICAgd3NwdHJbRENUU0laRSowXSA9IGRjdmFsOwotICAgICAgd3NwdHJbRENUU0laRSoxXSA9IGRjdmFsOwotICAgICAgCi0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgCi0gICAgLyogRXZlbiBwYXJ0ICovCi0gICAgCi0gICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMF0sIHF1YW50cHRyW0RDVFNJWkUqMF0pOwotICAgIHRtcDEwID0gejEgPDwgKENPTlNUX0JJVFMrMik7Ci0gICAgCi0gICAgLyogT2RkIHBhcnQgKi8KLQotICAgIHoxID0gREVRVUFOVElaRShpbnB0cltEQ1RTSVpFKjddLCBxdWFudHB0cltEQ1RTSVpFKjddKTsKLSAgICB0bXAwID0gTVVMVElQTFkoejEsIC0gRklYXzBfNzIwOTU5ODIyKTsgLyogc3FydCgyKSAqIChjNy1jNStjMy1jMSkgKi8KLSAgICB6MSA9IERFUVVBTlRJWkUoaW5wdHJbRENUU0laRSo1XSwgcXVhbnRwdHJbRENUU0laRSo1XSk7Ci0gICAgdG1wMCArPSBNVUxUSVBMWSh6MSwgRklYXzBfODUwNDMwMDk1KTsgLyogc3FydCgyKSAqICgtYzErYzMrYzUrYzcpICovCi0gICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqM10sIHF1YW50cHRyW0RDVFNJWkUqM10pOwotICAgIHRtcDAgKz0gTVVMVElQTFkoejEsIC0gRklYXzFfMjcyNzU4NTgwKTsgLyogc3FydCgyKSAqICgtYzErYzMtYzUtYzcpICovCi0gICAgejEgPSBERVFVQU5USVpFKGlucHRyW0RDVFNJWkUqMV0sIHF1YW50cHRyW0RDVFNJWkUqMV0pOwotICAgIHRtcDAgKz0gTVVMVElQTFkoejEsIEZJWF8zXzYyNDUwOTc4NSk7IC8qIHNxcnQoMikgKiAoYzErYzMrYzUrYzcpICovCi0KLSAgICAvKiBGaW5hbCBvdXRwdXQgc3RhZ2UgKi8KLSAgICAKLSAgICB3c3B0cltEQ1RTSVpFKjBdID0gKGludCkgREVTQ0FMRSh0bXAxMCArIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUysyKTsKLSAgICB3c3B0cltEQ1RTSVpFKjFdID0gKGludCkgREVTQ0FMRSh0bXAxMCAtIHRtcDAsIENPTlNUX0JJVFMtUEFTUzFfQklUUysyKTsKLSAgfQotICAKLSAgLyogUGFzcyAyOiBwcm9jZXNzIDIgcm93cyBmcm9tIHdvcmsgYXJyYXksIHN0b3JlIGludG8gb3V0cHV0IGFycmF5LiAqLwotCi0gIHdzcHRyID0gd29ya3NwYWNlOwotICBmb3IgKGN0ciA9IDA7IGN0ciA8IDI7IGN0cisrKSB7Ci0gICAgb3V0cHRyID0gb3V0cHV0X2J1ZltjdHJdICsgb3V0cHV0X2NvbDsKLSAgICAvKiBJdCdzIG5vdCBjbGVhciB3aGV0aGVyIGEgemVybyByb3cgdGVzdCBpcyB3b3J0aHdoaWxlIGhlcmUgLi4uICovCi0KLSNpZm5kZWYgTk9fWkVST19ST1dfVEVTVAotICAgIGlmICh3c3B0clsxXSA9PSAwICYmIHdzcHRyWzNdID09IDAgJiYgd3NwdHJbNV0gPT0gMCAmJiB3c3B0cls3XSA9PSAwKSB7Ci0gICAgICAvKiBBQyB0ZXJtcyBhbGwgemVybyAqLwotICAgICAgSlNBTVBMRSBkY3ZhbCA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUoKElOVDMyKSB3c3B0clswXSwgUEFTUzFfQklUUyszKQotCQkJCSAgJiBSQU5HRV9NQVNLXTsKLSAgICAgIAotICAgICAgb3V0cHRyWzBdID0gZGN2YWw7Ci0gICAgICBvdXRwdHJbMV0gPSBkY3ZhbDsKLSAgICAgIAotICAgICAgd3NwdHIgKz0gRENUU0laRTsJCS8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXh0IHJvdyAqLwotICAgICAgY29udGludWU7Ci0gICAgfQotI2VuZGlmCi0gICAgCi0gICAgLyogRXZlbiBwYXJ0ICovCi0gICAgCi0gICAgdG1wMTAgPSAoKElOVDMyKSB3c3B0clswXSkgPDwgKENPTlNUX0JJVFMrMik7Ci0gICAgCi0gICAgLyogT2RkIHBhcnQgKi8KLQotICAgIHRtcDAgPSBNVUxUSVBMWSgoSU5UMzIpIHdzcHRyWzddLCAtIEZJWF8wXzcyMDk1OTgyMikgLyogc3FydCgyKSAqIChjNy1jNStjMy1jMSkgKi8KLQkgKyBNVUxUSVBMWSgoSU5UMzIpIHdzcHRyWzVdLCBGSVhfMF84NTA0MzAwOTUpIC8qIHNxcnQoMikgKiAoLWMxK2MzK2M1K2M3KSAqLwotCSArIE1VTFRJUExZKChJTlQzMikgd3NwdHJbM10sIC0gRklYXzFfMjcyNzU4NTgwKSAvKiBzcXJ0KDIpICogKC1jMStjMy1jNS1jNykgKi8KLQkgKyBNVUxUSVBMWSgoSU5UMzIpIHdzcHRyWzFdLCBGSVhfM182MjQ1MDk3ODUpOyAvKiBzcXJ0KDIpICogKGMxK2MzK2M1K2M3KSAqLwotCi0gICAgLyogRmluYWwgb3V0cHV0IHN0YWdlICovCi0gICAgCi0gICAgb3V0cHRyWzBdID0gcmFuZ2VfbGltaXRbKGludCkgREVTQ0FMRSh0bXAxMCArIHRtcDAsCi0JCQkJCSAgQ09OU1RfQklUUytQQVNTMV9CSVRTKzMrMikKLQkJCSAgICAmIFJBTkdFX01BU0tdOwotICAgIG91dHB0clsxXSA9IHJhbmdlX2xpbWl0WyhpbnQpIERFU0NBTEUodG1wMTAgLSB0bXAwLAotCQkJCQkgIENPTlNUX0JJVFMrUEFTUzFfQklUUyszKzIpCi0JCQkgICAgJiBSQU5HRV9NQVNLXTsKLSAgICAKLSAgICB3c3B0ciArPSBEQ1RTSVpFOwkJLyogYWR2YW5jZSBwb2ludGVyIHRvIG5leHQgcm93ICovCi0gIH0KLX0KLQotCi0vKgotICogUGVyZm9ybSBkZXF1YW50aXphdGlvbiBhbmQgaW52ZXJzZSBEQ1Qgb24gb25lIGJsb2NrIG9mIGNvZWZmaWNpZW50cywKLSAqIHByb2R1Y2luZyBhIHJlZHVjZWQtc2l6ZSAxeDEgb3V0cHV0IGJsb2NrLgotICovCi0KLUdMT0JBTCh2b2lkKQotanBlZ19pZGN0XzF4MSAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JICAgICAgIEpDT0VGUFRSIGNvZWZfYmxvY2ssCi0JICAgICAgIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKQotewotICBpbnQgZGN2YWw7Ci0gIElTTE9XX01VTFRfVFlQRSAqIHF1YW50cHRyOwotICBKU0FNUExFICpyYW5nZV9saW1pdCA9IElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pOwotICBTSElGVF9URU1QUwotCi0gIC8qIFdlIGhhcmRseSBuZWVkIGFuIGludmVyc2UgRENUIHJvdXRpbmUgZm9yIHRoaXM6IGp1c3QgdGFrZSB0aGUKLSAgICogYXZlcmFnZSBwaXhlbCB2YWx1ZSwgd2hpY2ggaXMgb25lLWVpZ2h0aCBvZiB0aGUgREMgY29lZmZpY2llbnQuCi0gICAqLwotICBxdWFudHB0ciA9IChJU0xPV19NVUxUX1RZUEUgKikgY29tcHB0ci0+ZGN0X3RhYmxlOwotICBkY3ZhbCA9IERFUVVBTlRJWkUoY29lZl9ibG9ja1swXSwgcXVhbnRwdHJbMF0pOwotICBkY3ZhbCA9IChpbnQpIERFU0NBTEUoKElOVDMyKSBkY3ZhbCwgMyk7Ci0KLSAgb3V0cHV0X2J1ZlswXVtvdXRwdXRfY29sXSA9IHJhbmdlX2xpbWl0W2RjdmFsICYgUkFOR0VfTUFTS107Ci19Ci0KLSNlbmRpZiAvKiBJRENUX1NDQUxJTkdfU1VQUE9SVEVEICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfam1lbW1nci5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2ptZW1tZ3IuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdlYWQ0OC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfam1lbW1nci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEyMCArMCwwIEBACi0vKgotICogam1lbW1nci5jCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIEpQRUcgc3lzdGVtLWluZGVwZW5kZW50IG1lbW9yeSBtYW5hZ2VtZW50Ci0gKiByb3V0aW5lcy4gIFRoaXMgY29kZSBpcyB1c2FibGUgYWNyb3NzIGEgd2lkZSB2YXJpZXR5IG9mIG1hY2hpbmVzOyBtb3N0Ci0gKiBvZiB0aGUgc3lzdGVtIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gaXNvbGF0ZWQgaW4gYSBzZXBhcmF0ZSBmaWxlLgotICogVGhlIG1ham9yIGZ1bmN0aW9ucyBwcm92aWRlZCBoZXJlIGFyZToKLSAqICAgKiBwb29sLWJhc2VkIGFsbG9jYXRpb24gYW5kIGZyZWVpbmcgb2YgbWVtb3J5OwotICogICAqIHBvbGljeSBkZWNpc2lvbnMgYWJvdXQgaG93IHRvIGRpdmlkZSBhdmFpbGFibGUgbWVtb3J5IGFtb25nIHRoZQotICogICAgIHZpcnR1YWwgYXJyYXlzOwotICogICAqIGNvbnRyb2wgbG9naWMgZm9yIHN3YXBwaW5nIHZpcnR1YWwgYXJyYXlzIGJldHdlZW4gbWFpbiBtZW1vcnkgYW5kCi0gKiAgICAgYmFja2luZyBzdG9yYWdlLgotICogVGhlIHNlcGFyYXRlIHN5c3RlbS1kZXBlbmRlbnQgZmlsZSBwcm92aWRlcyB0aGUgYWN0dWFsIGJhY2tpbmctc3RvcmFnZQotICogYWNjZXNzIGNvZGUsIGFuZCBpdCBjb250YWlucyB0aGUgcG9saWN5IGRlY2lzaW9uIGFib3V0IGhvdyBtdWNoIHRvdGFsCi0gKiBtYWluIG1lbW9yeSB0byB1c2UuCi0gKiBUaGlzIGZpbGUgaXMgc3lzdGVtLWRlcGVuZGVudCBpbiB0aGUgc2Vuc2UgdGhhdCBzb21lIG9mIGl0cyBmdW5jdGlvbnMKLSAqIGFyZSB1bm5lY2Vzc2FyeSBpbiBzb21lIHN5c3RlbXMuICBGb3IgZXhhbXBsZSwgaWYgdGhlcmUgaXMgZW5vdWdoIHZpcnR1YWwKLSAqIG1lbW9yeSBzbyB0aGF0IGJhY2tpbmcgc3RvcmFnZSB3aWxsIG5ldmVyIGJlIHVzZWQsIG11Y2ggb2YgdGhlIHZpcnR1YWwKLSAqIGFycmF5IGNvbnRyb2wgbG9naWMgY291bGQgYmUgcmVtb3ZlZC4gIChPZiBjb3Vyc2UsIGlmIHlvdSBoYXZlIHRoYXQgbXVjaAotICogbWVtb3J5IHRoZW4geW91IHNob3VsZG4ndCBjYXJlIGFib3V0IGEgbGl0dGxlIGJpdCBvZiB1bnVzZWQgY29kZS4uLikKLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jZGVmaW5lIEFNX01FTU9SWV9NQU5BR0VSCS8qIHdlIGRlZmluZSBqdmlydF9YYXJyYXlfY29udHJvbCBzdHJ1Y3RzICovCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiam1lbXN5cy5oIgkJLyogaW1wb3J0IHRoZSBzeXN0ZW0tZGVwZW5kZW50IGRlY2xhcmF0aW9ucyAqLwotCi0jZGVmaW5lIE5PX0dFVEVOVgkvKiBYWVE6IDIwMDctNS0yMiBEb24ndCB1c2UgaXQgKi8KLQotI2lmbmRlZiBOT19HRVRFTlYKLSNpZm5kZWYgSEFWRV9TVERMSUJfSAkJLyogPHN0ZGxpYi5oPiBzaG91bGQgZGVjbGFyZSBnZXRlbnYoKSAqLwotZXh0ZXJuIGNoYXIgKiBnZXRlbnYgSlBQKChjb25zdCBjaGFyICogbmFtZSkpOwotI2VuZGlmCi0jZW5kaWYKLQotCi0vKgotICogU29tZSBpbXBvcnRhbnQgbm90ZXM6Ci0gKiAgIFRoZSBhbGxvY2F0aW9uIHJvdXRpbmVzIHByb3ZpZGVkIGhlcmUgbXVzdCBuZXZlciByZXR1cm4gTlVMTC4KLSAqICAgVGhleSBzaG91bGQgZXhpdCB0byBlcnJvcl9leGl0IGlmIHVuc3VjY2Vzc2Z1bC4KLSAqCi0gKiAgIEl0J3Mgbm90IGEgZ29vZCBpZGVhIHRvIHRyeSB0byBtZXJnZSB0aGUgc2FycmF5IGFuZCBiYXJyYXkgcm91dGluZXMsCi0gKiAgIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHRleHR1YWxseSBhbG1vc3QgdGhlIHNhbWUsIGJlY2F1c2Ugc2FtcGxlcyBhcmUKLSAqICAgdXN1YWxseSBzdG9yZWQgYXMgYnl0ZXMgd2hpbGUgY29lZmZpY2llbnRzIGFyZSBzaG9ydHMgb3IgaW50cy4gIFRodXMsCi0gKiAgIGluIG1hY2hpbmVzIHdoZXJlIGJ5dGUgcG9pbnRlcnMgaGF2ZSBhIGRpZmZlcmVudCByZXByZXNlbnRhdGlvbiBmcm9tCi0gKiAgIHdvcmQgcG9pbnRlcnMsIHRoZSByZXN1bHRpbmcgbWFjaGluZSBjb2RlIGNvdWxkIG5vdCBiZSB0aGUgc2FtZS4KLSAqLwotCi0KLS8qCi0gKiBNYW55IG1hY2hpbmVzIHJlcXVpcmUgc3RvcmFnZSBhbGlnbm1lbnQ6IGxvbmdzIG11c3Qgc3RhcnQgb24gNC1ieXRlCi0gKiBib3VuZGFyaWVzLCBkb3VibGVzIG9uIDgtYnl0ZSBib3VuZGFyaWVzLCBldGMuICBPbiBzdWNoIG1hY2hpbmVzLCBtYWxsb2MoKQotICogYWx3YXlzIHJldHVybnMgcG9pbnRlcnMgdGhhdCBhcmUgbXVsdGlwbGVzIG9mIHRoZSB3b3JzdC1jYXNlIGFsaWdubWVudAotICogcmVxdWlyZW1lbnQsIGFuZCB3ZSBoYWQgYmV0dGVyIGRvIHNvIHRvby4KLSAqIFRoZXJlIGlzbid0IGFueSByZWFsbHkgcG9ydGFibGUgd2F5IHRvIGRldGVybWluZSB0aGUgd29yc3QtY2FzZSBhbGlnbm1lbnQKLSAqIHJlcXVpcmVtZW50LiAgVGhpcyBtb2R1bGUgYXNzdW1lcyB0aGF0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgaXMKLSAqIG11bHRpcGxlcyBvZiBzaXplb2YoQUxJR05fVFlQRSkuCi0gKiBCeSBkZWZhdWx0LCB3ZSBkZWZpbmUgQUxJR05fVFlQRSBhcyBkb3VibGUuICBUaGlzIGlzIG5lY2Vzc2FyeSBvbiBzb21lCi0gKiB3b3Jrc3RhdGlvbnMgKHdoZXJlIGRvdWJsZXMgcmVhbGx5IGRvIG5lZWQgOC1ieXRlIGFsaWdubWVudCkgYW5kIHdpbGwgd29yawotICogZmluZSBvbiBuZWFybHkgZXZlcnl0aGluZy4gIElmIHlvdXIgbWFjaGluZSBoYXMgbGVzc2VyIGFsaWdubWVudCBuZWVkcywKLSAqIHlvdSBjYW4gc2F2ZSBhIGZldyBieXRlcyBieSBtYWtpbmcgQUxJR05fVFlQRSBzbWFsbGVyLgotICogVGhlIG9ubHkgcGxhY2UgSSBrbm93IG9mIHdoZXJlIHRoaXMgd2lsbCBOT1Qgd29yayBpcyBjZXJ0YWluIE1hY2ludG9zaAotICogNjgweDAgY29tcGlsZXJzIHRoYXQgZGVmaW5lIGRvdWJsZSBhcyBhIDEwLWJ5dGUgSUVFRSBleHRlbmRlZCBmbG9hdC4KLSAqIERvaW5nIDEwLWJ5dGUgYWxpZ25tZW50IGlzIGNvdW50ZXJwcm9kdWN0aXZlIGJlY2F1c2UgbG9uZ3dvcmRzIHdvbid0IGJlCi0gKiBhbGlnbmVkIHdlbGwuICBQdXQgIiNkZWZpbmUgQUxJR05fVFlQRSBsb25nIiBpbiBqY29uZmlnLmggaWYgeW91IGhhdmUKLSAqIHN1Y2ggYSBjb21waWxlci4KLSAqLwotCi0jaWZuZGVmIEFMSUdOX1RZUEUJCS8qIHNvIGNhbiBvdmVycmlkZSBmcm9tIGpjb25maWcuaCAqLwotI2RlZmluZSBBTElHTl9UWVBFICBkb3VibGUKLSNlbmRpZgotCi0KLS8qCi0gKiBXZSBhbGxvY2F0ZSBvYmplY3RzIGZyb20gInBvb2xzIiwgd2hlcmUgZWFjaCBwb29sIGlzIGdvdHRlbiB3aXRoIGEgc2luZ2xlCi0gKiByZXF1ZXN0IHRvIGpwZWdfZ2V0X3NtYWxsKCkgb3IganBlZ19nZXRfbGFyZ2UoKS4gIFRoZXJlIGlzIG5vIHBlci1vYmplY3QKLSAqIG92ZXJoZWFkIHdpdGhpbiBhIHBvb2wsIGV4Y2VwdCBmb3IgYWxpZ25tZW50IHBhZGRpbmcuICBFYWNoIHBvb2wgaGFzIGEKLSAqIGhlYWRlciB3aXRoIGEgbGluayB0byB0aGUgbmV4dCBwb29sIG9mIHRoZSBzYW1lIGNsYXNzLgotICogU21hbGwgYW5kIGxhcmdlIHBvb2wgaGVhZGVycyBhcmUgaWRlbnRpY2FsIGV4Y2VwdCB0aGF0IHRoZSBsYXR0ZXIncwotICogbGluayBwb2ludGVyIG11c3QgYmUgRkFSIG9uIDgweDg2IG1hY2hpbmVzLgotICogTm90aWNlIHRoYXQgdGhlICJyZWFsIiBoZWFkZXIgZmllbGRzIGFyZSB1bmlvbidlZCB3aXRoIGEgZHVtbXkgQUxJR05fVFlQRQotICogZmllbGQuICBUaGlzIGZvcmNlcyB0aGUgY29tcGlsZXIgdG8gbWFrZSBTSVpFT0Yoc21hbGxfcG9vbF9oZHIpIGEgbXVsdGlwbGUKLSAqIG9mIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgb2YgQUxJR05fVFlQRS4KLSAqLwotCi10eXBlZGVmIHVuaW9uIHNtYWxsX3Bvb2xfc3RydWN0ICogc21hbGxfcG9vbF9wdHI7Ci0KLXR5cGVkZWYgdW5pb24gc21hbGxfcG9vbF9zdHJ1Y3QgewotICBzdHJ1Y3QgewotICAgIHNtYWxsX3Bvb2xfcHRyIG5leHQ7CS8qIG5leHQgaW4gbGlzdCBvZiBwb29scyAqLwotICAgIHNpemVfdCBieXRlc191c2VkOwkJLyogaG93IG1hbnkgYnl0ZXMgYWxyZWFkeSB1c2VkIHdpdGhpbiBwb29sICovCi0gICAgc2l6ZV90IGJ5dGVzX2xlZnQ7CQkvKiBieXRlcyBzdGlsbCBhdmFpbGFibGUgaW4gdGhpcyBwb29sICovCi0gIH0gaGRyOwotICBBTElHTl9UWVBFIGR1bW15OwkJLyogaW5jbHVkZWQgaW4gdW5pb24gdG8gZW5zdXJlIGFsaWdubWVudCAqLwotfSBzbWFsbF9wb29sX2hkcjsKLQotdHlwZWRlZiB1bmlvbiBsYXJnZV9wb29sX3N0cnVjdCBGQVIgKiBsYXJnZV9wb29sX3B0cjsKLQotdHlwZWRlZiB1bmlvbiBsYXJnZV9wb29sX3N0cnVjdCB7Ci0gIHN0cnVjdCB7Ci0gICAgbGFyZ2VfcG9vbF9wdHIgbmV4dDsJLyogbmV4dCBpbiBsaXN0IG9mIHBvb2xzICovCi0gICAgc2l6ZV90IGJ5dGVzX3VzZWQ7CQkvKiBob3cgbWFueSBieXRlcyBhbHJlYWR5IHVzZWQgd2l0aGluIHBvb2wgKi8KLSAgICBzaXplX3QgYnl0ZXNfbGVmdDsJCS8qIGJ5dGVzIHN0aWxsIGF2YWlsYWJsZSBpbiB0aGlzIHBvb2wgKi8KLSAgfSBoZHI7Ci0gIEFMSUdOX1RZUEUgZHVtbXk7CQkvKiBpbmNsdWRlZCBpbiB1bmlvbiB0byBlbnN1cmUgYWxpZ25tZW50ICovCi19IGxhcmdlX3Bvb2xfaGRyOwotCi0KLS8qCi0gKiBIZXJlIGlzIHRoZSBmdWxsIGRlZmluaXRpb24gb2YgYSBtZW1vcnkgbWFuYWdlciBvYmplY3QuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzdHJ1Y3QganBlZ19tZW1vcnlfbWdyIHB1YjsJLyogcHVibGljIGZpZWxkcyAqLwotCi0gIC8qIEVhY2ggcG9vbCBpZGVudGlmaWVyIChsaWZldGltZSBjbGFzcykgbmFtZXMgYSBsaW5rZWQgbGlzdCBvZiBwb29scy4gKi8KLSAgc21hbGxfcG9vbF9wdHIgc21hbGxfbGlzdFtKUE9PTF9OVU1QT09MU107Ci0gIGxhcmdlX3Bvb2xfcHRyIGxhcmdlX2xpc3RbSlBPT0xfTlVNUE9PTFNdOwotCi0gIC8qIFNpbmNlIHdlIG9ubHkgaGF2ZSBvbmUgbGlmZXRpbWUgY2xhc3Mgb2YgdmlydHVhbCBhcnJheXMsIG9ubHkgb25lCi0gICAqIGxpbmtlZCBsaXN0IGlzIG5lY2Vzc2FyeSAoZm9yIGVhY2ggZGF0YXR5cGUpLiAgTm90ZSB0aGF0IHRoZSB2aXJ0dWFsCi0gICAqIGFycmF5IGNvbnRyb2wgYmxvY2tzIGJlaW5nIGxpbmtlZCB0b2dldGhlciBhcmUgYWN0dWFsbHkgc3RvcmVkIHNvbWV3aGVyZQotICAgKiBpbiB0aGUgc21hbGwtcG9vbCBsaXN0LgotICAgKi8KLSAganZpcnRfc2FycmF5X3B0ciB2aXJ0X3NhcnJheV9saXN0OwotICBqdmlydF9iYXJyYXlfcHRyIHZpcnRfYmFycmF5X2xpc3Q7Ci0KLSAgLyogVGhpcyBjb3VudHMgdG90YWwgc3BhY2Ugb2J0YWluZWQgZnJvbSBqcGVnX2dldF9zbWFsbC9sYXJnZSAqLwotICBsb25nIHRvdGFsX3NwYWNlX2FsbG9jYXRlZDsKLQotICAvKiBhbGxvY19zYXJyYXkgYW5kIGFsbG9jX2JhcnJheSBzZXQgdGhpcyB2YWx1ZSBmb3IgdXNlIGJ5IHZpcnR1YWwKLSAgICogYXJyYXkgcm91dGluZXMuCi0gICAqLwotICBKRElNRU5TSU9OIGxhc3Rfcm93c3BlcmNodW5rOwkvKiBmcm9tIG1vc3QgcmVjZW50IGFsbG9jX3NhcnJheS9iYXJyYXkgKi8KLX0gbXlfbWVtb3J5X21ncjsKLQotdHlwZWRlZiBteV9tZW1vcnlfbWdyICogbXlfbWVtX3B0cjsKLQotCi0vKgotICogVGhlIGNvbnRyb2wgYmxvY2tzIGZvciB2aXJ0dWFsIGFycmF5cy4KLSAqIE5vdGUgdGhhdCB0aGVzZSBibG9ja3MgYXJlIGFsbG9jYXRlZCBpbiB0aGUgInNtYWxsIiBwb29sIGFyZWEuCi0gKiBTeXN0ZW0tZGVwZW5kZW50IGluZm8gZm9yIHRoZSBhc3NvY2lhdGVkIGJhY2tpbmcgc3RvcmUgKGlmIGFueSkgaXMgaGlkZGVuCi0gKiBpbnNpZGUgdGhlIGJhY2tpbmdfc3RvcmVfaW5mbyBzdHJ1Y3QuCi0gKi8KLQotc3RydWN0IGp2aXJ0X3NhcnJheV9jb250cm9sIHsKLSAgSlNBTVBBUlJBWSBtZW1fYnVmZmVyOwkvKiA9PiB0aGUgaW4tbWVtb3J5IGJ1ZmZlciAqLwotICBKRElNRU5TSU9OIHJvd3NfaW5fYXJyYXk7CS8qIHRvdGFsIHZpcnR1YWwgYXJyYXkgaGVpZ2h0ICovCi0gIEpESU1FTlNJT04gc2FtcGxlc3BlcnJvdzsJLyogd2lkdGggb2YgYXJyYXkgKGFuZCBvZiBtZW1vcnkgYnVmZmVyKSAqLwotICBKRElNRU5TSU9OIG1heGFjY2VzczsJCS8qIG1heCByb3dzIGFjY2Vzc2VkIGJ5IGFjY2Vzc192aXJ0X3NhcnJheSAqLwotICBKRElNRU5TSU9OIHJvd3NfaW5fbWVtOwkvKiBoZWlnaHQgb2YgbWVtb3J5IGJ1ZmZlciAqLwotICBKRElNRU5TSU9OIHJvd3NwZXJjaHVuazsJLyogYWxsb2NhdGlvbiBjaHVuayBzaXplIGluIG1lbV9idWZmZXIgKi8KLSAgSkRJTUVOU0lPTiBjdXJfc3RhcnRfcm93OwkvKiBmaXJzdCBsb2dpY2FsIHJvdyAjIGluIHRoZSBidWZmZXIgKi8KLSAgSkRJTUVOU0lPTiBmaXJzdF91bmRlZl9yb3c7CS8qIHJvdyAjIG9mIGZpcnN0IHVuaW5pdGlhbGl6ZWQgcm93ICovCi0gIGJvb2xlYW4gcHJlX3plcm87CQkvKiBwcmUtemVybyBtb2RlIHJlcXVlc3RlZD8gKi8KLSAgYm9vbGVhbiBkaXJ0eTsJCS8qIGRvIGN1cnJlbnQgYnVmZmVyIGNvbnRlbnRzIG5lZWQgd3JpdHRlbj8gKi8KLSAgYm9vbGVhbiBiX3Nfb3BlbjsJCS8qIGlzIGJhY2tpbmctc3RvcmUgZGF0YSB2YWxpZD8gKi8KLSAganZpcnRfc2FycmF5X3B0ciBuZXh0OwkvKiBsaW5rIHRvIG5leHQgdmlydHVhbCBzYXJyYXkgY29udHJvbCBibG9jayAqLwotICBiYWNraW5nX3N0b3JlX2luZm8gYl9zX2luZm87CS8qIFN5c3RlbS1kZXBlbmRlbnQgY29udHJvbCBpbmZvICovCi19OwotCi1zdHJ1Y3QganZpcnRfYmFycmF5X2NvbnRyb2wgewotICBKQkxPQ0tBUlJBWSBtZW1fYnVmZmVyOwkvKiA9PiB0aGUgaW4tbWVtb3J5IGJ1ZmZlciAqLwotICBKRElNRU5TSU9OIHJvd3NfaW5fYXJyYXk7CS8qIHRvdGFsIHZpcnR1YWwgYXJyYXkgaGVpZ2h0ICovCi0gIEpESU1FTlNJT04gYmxvY2tzcGVycm93OwkvKiB3aWR0aCBvZiBhcnJheSAoYW5kIG9mIG1lbW9yeSBidWZmZXIpICovCi0gIEpESU1FTlNJT04gbWF4YWNjZXNzOwkJLyogbWF4IHJvd3MgYWNjZXNzZWQgYnkgYWNjZXNzX3ZpcnRfYmFycmF5ICovCi0gIEpESU1FTlNJT04gcm93c19pbl9tZW07CS8qIGhlaWdodCBvZiBtZW1vcnkgYnVmZmVyICovCi0gIEpESU1FTlNJT04gcm93c3BlcmNodW5rOwkvKiBhbGxvY2F0aW9uIGNodW5rIHNpemUgaW4gbWVtX2J1ZmZlciAqLwotICBKRElNRU5TSU9OIGN1cl9zdGFydF9yb3c7CS8qIGZpcnN0IGxvZ2ljYWwgcm93ICMgaW4gdGhlIGJ1ZmZlciAqLwotICBKRElNRU5TSU9OIGZpcnN0X3VuZGVmX3JvdzsJLyogcm93ICMgb2YgZmlyc3QgdW5pbml0aWFsaXplZCByb3cgKi8KLSAgYm9vbGVhbiBwcmVfemVybzsJCS8qIHByZS16ZXJvIG1vZGUgcmVxdWVzdGVkPyAqLwotICBib29sZWFuIGRpcnR5OwkJLyogZG8gY3VycmVudCBidWZmZXIgY29udGVudHMgbmVlZCB3cml0dGVuPyAqLwotICBib29sZWFuIGJfc19vcGVuOwkJLyogaXMgYmFja2luZy1zdG9yZSBkYXRhIHZhbGlkPyAqLwotICBqdmlydF9iYXJyYXlfcHRyIG5leHQ7CS8qIGxpbmsgdG8gbmV4dCB2aXJ0dWFsIGJhcnJheSBjb250cm9sIGJsb2NrICovCi0gIGJhY2tpbmdfc3RvcmVfaW5mbyBiX3NfaW5mbzsJLyogU3lzdGVtLWRlcGVuZGVudCBjb250cm9sIGluZm8gKi8KLX07Ci0KLQotI2lmZGVmIE1FTV9TVEFUUwkJLyogb3B0aW9uYWwgZXh0cmEgc3R1ZmYgZm9yIHN0YXRpc3RpY3MgKi8KLQotTE9DQUwodm9pZCkKLXByaW50X21lbV9zdGF0cyAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCkKLXsKLSAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKLSAgc21hbGxfcG9vbF9wdHIgc2hkcl9wdHI7Ci0gIGxhcmdlX3Bvb2xfcHRyIGxoZHJfcHRyOwotCi0gIC8qIFNpbmNlIHRoaXMgaXMgb25seSBhIGRlYnVnZ2luZyBzdHViLCB3ZSBjYW4gY2hlYXQgYSBsaXR0bGUgYnkgdXNpbmcKLSAgICogZnByaW50ZiBkaXJlY3RseSByYXRoZXIgdGhhbiBnb2luZyB0aHJvdWdoIHRoZSB0cmFjZSBtZXNzYWdlIGNvZGUuCi0gICAqIFRoaXMgaXMgaGVscGZ1bCBiZWNhdXNlIG1lc3NhZ2UgcGFybSBhcnJheSBjYW4ndCBoYW5kbGUgbG9uZ3MuCi0gICAqLwotICBGWFNZU19mcHJpbnRmKHN0ZGVyciwgIkZyZWVpbmcgcG9vbCAlZCwgdG90YWwgc3BhY2UgPSAlbGRcbiIsCi0JICBwb29sX2lkLCBtZW0tPnRvdGFsX3NwYWNlX2FsbG9jYXRlZCk7Ci0KLSAgZm9yIChsaGRyX3B0ciA9IG1lbS0+bGFyZ2VfbGlzdFtwb29sX2lkXTsgbGhkcl9wdHIgIT0gTlVMTDsKLSAgICAgICBsaGRyX3B0ciA9IGxoZHJfcHRyLT5oZHIubmV4dCkgewotICAgIEZYU1lTX2ZwcmludGYoc3RkZXJyLCAiICBMYXJnZSBjaHVuayB1c2VkICVsZFxuIiwKLQkgICAgKGxvbmcpIGxoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCk7Ci0gIH0KLQotICBmb3IgKHNoZHJfcHRyID0gbWVtLT5zbWFsbF9saXN0W3Bvb2xfaWRdOyBzaGRyX3B0ciAhPSBOVUxMOwotICAgICAgIHNoZHJfcHRyID0gc2hkcl9wdHItPmhkci5uZXh0KSB7Ci0gICAgRlhTWVNfZnByaW50ZihzdGRlcnIsICIgIFNtYWxsIGNodW5rIHVzZWQgJWxkIGZyZWUgJWxkXG4iLAotCSAgICAobG9uZykgc2hkcl9wdHItPmhkci5ieXRlc191c2VkLAotCSAgICAobG9uZykgc2hkcl9wdHItPmhkci5ieXRlc19sZWZ0KTsKLSAgfQotfQotCi0jZW5kaWYgLyogTUVNX1NUQVRTICovCi0KLQotTE9DQUwodm9pZCkKLW91dF9vZl9tZW1vcnkgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHdoaWNoKQotLyogUmVwb3J0IGFuIG91dC1vZi1tZW1vcnkgZXJyb3IgYW5kIHN0b3AgZXhlY3V0aW9uICovCi0vKiBJZiB3ZSBjb21waWxlZCBNRU1fU1RBVFMgc3VwcG9ydCwgcmVwb3J0IGFsbG9jIHJlcXVlc3RzIGJlZm9yZSBkeWluZyAqLwotewotI2lmZGVmIE1FTV9TVEFUUwotICBjaW5mby0+ZXJyLT50cmFjZV9sZXZlbCA9IDI7CS8qIGZvcmNlIHNlbGZfZGVzdHJ1Y3QgdG8gcmVwb3J0IHN0YXRzICovCi0jZW5kaWYKLSAgRVJSRVhJVDEoY2luZm8sIEpFUlJfT1VUX09GX01FTU9SWSwgd2hpY2gpOwotfQotCi0KLS8qCi0gKiBBbGxvY2F0aW9uIG9mICJzbWFsbCIgb2JqZWN0cy4KLSAqCi0gKiBGb3IgdGhlc2UsIHdlIHVzZSBwb29sZWQgc3RvcmFnZS4gIFdoZW4gYSBuZXcgcG9vbCBtdXN0IGJlIGNyZWF0ZWQsCi0gKiB3ZSB0cnkgdG8gZ2V0IGVub3VnaCBzcGFjZSBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdCBwbHVzIGEgInNsb3AiIGZhY3RvciwKLSAqIHdoZXJlIHRoZSBzbG9wIHdpbGwgYmUgdGhlIGFtb3VudCBvZiBsZWZ0b3ZlciBzcGFjZSBpbiB0aGUgbmV3IHBvb2wuCi0gKiBUaGUgc3BlZWQgdnMuIHNwYWNlIHRyYWRlb2ZmIGlzIGxhcmdlbHkgZGV0ZXJtaW5lZCBieSB0aGUgc2xvcCB2YWx1ZXMuCi0gKiBBIGRpZmZlcmVudCBzbG9wIHZhbHVlIGlzIHByb3ZpZGVkIGZvciBlYWNoIHBvb2wgY2xhc3MgKGxpZmV0aW1lKSwKLSAqIGFuZCB3ZSBhbHNvIGRpc3Rpbmd1aXNoIHRoZSBmaXJzdCBwb29sIG9mIGEgY2xhc3MgZnJvbSBsYXRlciBvbmVzLgotICogTk9URTogdGhlIHZhbHVlcyBnaXZlbiB3b3JrIGZhaXJseSB3ZWxsIG9uIGJvdGggMTYtIGFuZCAzMi1iaXQtaW50Ci0gKiBtYWNoaW5lcywgYnV0IG1heSBiZSB0b28gc21hbGwgaWYgbG9uZ3MgYXJlIDY0IGJpdHMgb3IgbW9yZS4KLSAqLwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGZpcnN0X3Bvb2xfc2xvcFtKUE9PTF9OVU1QT09MU10gPSAKLXsKLQkxNjAwLAkJCS8qIGZpcnN0IFBFUk1BTkVOVCBwb29sICovCi0JMTYwMDAJCQkvKiBmaXJzdCBJTUFHRSBwb29sICovCi19OwotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGV4dHJhX3Bvb2xfc2xvcFtKUE9PTF9OVU1QT09MU10gPSAKLXsKLQkwLAkJCS8qIGFkZGl0aW9uYWwgUEVSTUFORU5UIHBvb2xzICovCi0JNTAwMAkJCS8qIGFkZGl0aW9uYWwgSU1BR0UgcG9vbHMgKi8KLX07Ci0KLSNkZWZpbmUgTUlOX1NMT1AgIDUwCQkvKiBncmVhdGVyIHRoYW4gMCB0byBhdm9pZCBmdXRpbGUgbG9vcGluZyAqLwotCi0KLU1FVEhPRERFRih2b2lkICopCi1hbGxvY19zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwgc2l6ZV90IHNpemVvZm9iamVjdCkKLS8qIEFsbG9jYXRlIGEgInNtYWxsIiBvYmplY3QgKi8KLXsKLSAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKLSAgc21hbGxfcG9vbF9wdHIgaGRyX3B0ciwgcHJldl9oZHJfcHRyOwotICBjaGFyICogZGF0YV9wdHI7Ci0gIHNpemVfdCBvZGRfYnl0ZXMsIG1pbl9yZXF1ZXN0LCBzbG9wOwotCi0gIC8qIENoZWNrIGZvciB1bnNhdGlzZmlhYmxlIHJlcXVlc3QgKGRvIG5vdyB0byBlbnN1cmUgbm8gb3ZlcmZsb3cgYmVsb3cpICovCi0gIGlmIChzaXplb2ZvYmplY3QgPiAoc2l6ZV90KSAoTUFYX0FMTE9DX0NIVU5LLVNJWkVPRihzbWFsbF9wb29sX2hkcikpKQotICAgIG91dF9vZl9tZW1vcnkoY2luZm8sIDEpOwkvKiByZXF1ZXN0IGV4Y2VlZHMgbWFsbG9jJ3MgYWJpbGl0eSAqLwotCi0gIC8qIFJvdW5kIHVwIHRoZSByZXF1ZXN0ZWQgc2l6ZSB0byBhIG11bHRpcGxlIG9mIFNJWkVPRihBTElHTl9UWVBFKSAqLwotICBvZGRfYnl0ZXMgPSBzaXplb2ZvYmplY3QgJSBTSVpFT0YoQUxJR05fVFlQRSk7Ci0gIGlmIChvZGRfYnl0ZXMgPiAwKQotICAgIHNpemVvZm9iamVjdCArPSBTSVpFT0YoQUxJR05fVFlQRSkgLSBvZGRfYnl0ZXM7Ci0KLSAgLyogU2VlIGlmIHNwYWNlIGlzIGF2YWlsYWJsZSBpbiBhbnkgZXhpc3RpbmcgcG9vbCAqLwotICBpZiAocG9vbF9pZCA8IDAgfHwgcG9vbF9pZCA+PSBKUE9PTF9OVU1QT09MUykKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUE9PTF9JRCwgcG9vbF9pZCk7CS8qIHNhZmV0eSBjaGVjayAqLwotICBwcmV2X2hkcl9wdHIgPSBOVUxMOwotICBoZHJfcHRyID0gbWVtLT5zbWFsbF9saXN0W3Bvb2xfaWRdOwotICB3aGlsZSAoaGRyX3B0ciAhPSBOVUxMKSB7Ci0gICAgaWYgKGhkcl9wdHItPmhkci5ieXRlc19sZWZ0ID49IHNpemVvZm9iamVjdCkKLSAgICAgIGJyZWFrOwkJCS8qIGZvdW5kIHBvb2wgd2l0aCBlbm91Z2ggc3BhY2UgKi8KLSAgICBwcmV2X2hkcl9wdHIgPSBoZHJfcHRyOwotICAgIGhkcl9wdHIgPSBoZHJfcHRyLT5oZHIubmV4dDsKLSAgfQotCi0gIC8qIFRpbWUgdG8gbWFrZSBhIG5ldyBwb29sPyAqLwotICBpZiAoaGRyX3B0ciA9PSBOVUxMKSB7Ci0gICAgLyogbWluX3JlcXVlc3QgaXMgd2hhdCB3ZSBuZWVkIG5vdywgc2xvcCBpcyB3aGF0IHdpbGwgYmUgbGVmdG92ZXIgKi8KLSAgICBtaW5fcmVxdWVzdCA9IHNpemVvZm9iamVjdCArIFNJWkVPRihzbWFsbF9wb29sX2hkcik7Ci0gICAgaWYgKHByZXZfaGRyX3B0ciA9PSBOVUxMKQkvKiBmaXJzdCBwb29sIGluIGNsYXNzPyAqLwotICAgICAgc2xvcCA9IGZpcnN0X3Bvb2xfc2xvcFtwb29sX2lkXTsKLSAgICBlbHNlCi0gICAgICBzbG9wID0gZXh0cmFfcG9vbF9zbG9wW3Bvb2xfaWRdOwotICAgIC8qIERvbid0IGFzayBmb3IgbW9yZSB0aGFuIE1BWF9BTExPQ19DSFVOSyAqLwotICAgIGlmIChzbG9wID4gKHNpemVfdCkgKE1BWF9BTExPQ19DSFVOSy1taW5fcmVxdWVzdCkpCi0gICAgICBzbG9wID0gKHNpemVfdCkgKE1BWF9BTExPQ19DSFVOSy1taW5fcmVxdWVzdCk7Ci0gICAgLyogVHJ5IHRvIGdldCBzcGFjZSwgaWYgZmFpbCByZWR1Y2Ugc2xvcCBhbmQgdHJ5IGFnYWluICovCi0gICAgZm9yICg7OykgewotICAgICAgaGRyX3B0ciA9IChzbWFsbF9wb29sX3B0cikganBlZ19nZXRfc21hbGwoY2luZm8sIG1pbl9yZXF1ZXN0ICsgc2xvcCk7Ci0gICAgICBpZiAoaGRyX3B0ciAhPSBOVUxMKQotCWJyZWFrOwotICAgICAgc2xvcCAvPSAyOwotICAgICAgaWYgKHNsb3AgPCBNSU5fU0xPUCkJLyogZ2l2ZSB1cCB3aGVuIGl0IGdldHMgcmVhbCBzbWFsbCAqLwotCW91dF9vZl9tZW1vcnkoY2luZm8sIDIpOyAvKiBqcGVnX2dldF9zbWFsbCBmYWlsZWQgKi8KLSAgICB9Ci0gICAgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQgKz0gbWluX3JlcXVlc3QgKyBzbG9wOwotICAgIC8qIFN1Y2Nlc3MsIGluaXRpYWxpemUgdGhlIG5ldyBwb29sIGhlYWRlciBhbmQgYWRkIHRvIGVuZCBvZiBsaXN0ICovCi0gICAgaGRyX3B0ci0+aGRyLm5leHQgPSBOVUxMOwotICAgIGhkcl9wdHItPmhkci5ieXRlc191c2VkID0gMDsKLSAgICBoZHJfcHRyLT5oZHIuYnl0ZXNfbGVmdCA9IHNpemVvZm9iamVjdCArIHNsb3A7Ci0gICAgaWYgKHByZXZfaGRyX3B0ciA9PSBOVUxMKQkvKiBmaXJzdCBwb29sIGluIGNsYXNzPyAqLwotICAgICAgbWVtLT5zbWFsbF9saXN0W3Bvb2xfaWRdID0gaGRyX3B0cjsKLSAgICBlbHNlCi0gICAgICBwcmV2X2hkcl9wdHItPmhkci5uZXh0ID0gaGRyX3B0cjsKLSAgfQotCi0gIC8qIE9LLCBhbGxvY2F0ZSB0aGUgb2JqZWN0IGZyb20gdGhlIGN1cnJlbnQgcG9vbCAqLwotICBkYXRhX3B0ciA9IChjaGFyICopIChoZHJfcHRyICsgMSk7IC8qIHBvaW50IHRvIGZpcnN0IGRhdGEgYnl0ZSBpbiBwb29sICovCi0gIGRhdGFfcHRyICs9IGhkcl9wdHItPmhkci5ieXRlc191c2VkOyAvKiBwb2ludCB0byBwbGFjZSBmb3Igb2JqZWN0ICovCi0gIGhkcl9wdHItPmhkci5ieXRlc191c2VkICs9IHNpemVvZm9iamVjdDsKLSAgaGRyX3B0ci0+aGRyLmJ5dGVzX2xlZnQgLT0gc2l6ZW9mb2JqZWN0OwotCi0gIHJldHVybiAodm9pZCAqKSBkYXRhX3B0cjsKLX0KLQotCi0vKgotICogQWxsb2NhdGlvbiBvZiAibGFyZ2UiIG9iamVjdHMuCi0gKgotICogVGhlIGV4dGVybmFsIHNlbWFudGljcyBvZiB0aGVzZSBhcmUgdGhlIHNhbWUgYXMgInNtYWxsIiBvYmplY3RzLAotICogZXhjZXB0IHRoYXQgRkFSIHBvaW50ZXJzIGFyZSB1c2VkIG9uIDgweDg2LiAgSG93ZXZlciB0aGUgcG9vbAotICogbWFuYWdlbWVudCBoZXVyaXN0aWNzIGFyZSBxdWl0ZSBkaWZmZXJlbnQuICBXZSBhc3N1bWUgdGhhdCBlYWNoCi0gKiByZXF1ZXN0IGlzIGxhcmdlIGVub3VnaCB0aGF0IGl0IG1heSBhcyB3ZWxsIGJlIHBhc3NlZCBkaXJlY3RseSB0bwotICoganBlZ19nZXRfbGFyZ2U7IHRoZSBwb29sIG1hbmFnZW1lbnQganVzdCBsaW5rcyBldmVyeXRoaW5nIHRvZ2V0aGVyCi0gKiBzbyB0aGF0IHdlIGNhbiBmcmVlIGl0IGFsbCBvbiBkZW1hbmQuCi0gKiBOb3RlOiB0aGUgbWFqb3IgdXNlIG9mICJsYXJnZSIgb2JqZWN0cyBpcyBpbiBKU0FNUEFSUkFZIGFuZCBKQkxPQ0tBUlJBWQotICogc3RydWN0dXJlcy4gIFRoZSByb3V0aW5lcyB0aGF0IGNyZWF0ZSB0aGVzZSBzdHJ1Y3R1cmVzIChzZWUgYmVsb3cpCi0gKiBkZWxpYmVyYXRlbHkgYnVuY2ggcm93cyB0b2dldGhlciB0byBlbnN1cmUgYSBsYXJnZSByZXF1ZXN0IHNpemUuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQgRkFSICopCi1hbGxvY19sYXJnZSAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwgc2l6ZV90IHNpemVvZm9iamVjdCkKLS8qIEFsbG9jYXRlIGEgImxhcmdlIiBvYmplY3QgKi8KLXsKLSAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKLSAgbGFyZ2VfcG9vbF9wdHIgaGRyX3B0cjsKLSAgc2l6ZV90IG9kZF9ieXRlczsKLQotICAvKiBDaGVjayBmb3IgdW5zYXRpc2ZpYWJsZSByZXF1ZXN0IChkbyBub3cgdG8gZW5zdXJlIG5vIG92ZXJmbG93IGJlbG93KSAqLwotICBpZiAoc2l6ZW9mb2JqZWN0ID4gKHNpemVfdCkgKE1BWF9BTExPQ19DSFVOSy1TSVpFT0YobGFyZ2VfcG9vbF9oZHIpKSkKLSAgICBvdXRfb2ZfbWVtb3J5KGNpbmZvLCAzKTsJLyogcmVxdWVzdCBleGNlZWRzIG1hbGxvYydzIGFiaWxpdHkgKi8KLQotICAvKiBSb3VuZCB1cCB0aGUgcmVxdWVzdGVkIHNpemUgdG8gYSBtdWx0aXBsZSBvZiBTSVpFT0YoQUxJR05fVFlQRSkgKi8KLSAgb2RkX2J5dGVzID0gc2l6ZW9mb2JqZWN0ICUgU0laRU9GKEFMSUdOX1RZUEUpOwotICBpZiAob2RkX2J5dGVzID4gMCkKLSAgICBzaXplb2ZvYmplY3QgKz0gU0laRU9GKEFMSUdOX1RZUEUpIC0gb2RkX2J5dGVzOwotCi0gIC8qIEFsd2F5cyBtYWtlIGEgbmV3IHBvb2wgKi8KLSAgaWYgKHBvb2xfaWQgPCAwIHx8IHBvb2xfaWQgPj0gSlBPT0xfTlVNUE9PTFMpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BPT0xfSUQsIHBvb2xfaWQpOwkvKiBzYWZldHkgY2hlY2sgKi8KLQotICBoZHJfcHRyID0gKGxhcmdlX3Bvb2xfcHRyKSBqcGVnX2dldF9sYXJnZShjaW5mbywgc2l6ZW9mb2JqZWN0ICsKLQkJCQkJICAgIFNJWkVPRihsYXJnZV9wb29sX2hkcikpOwotICBpZiAoaGRyX3B0ciA9PSBOVUxMKQotICAgIG91dF9vZl9tZW1vcnkoY2luZm8sIDQpOwkvKiBqcGVnX2dldF9sYXJnZSBmYWlsZWQgKi8KLSAgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQgKz0gc2l6ZW9mb2JqZWN0ICsgU0laRU9GKGxhcmdlX3Bvb2xfaGRyKTsKLQotICAvKiBTdWNjZXNzLCBpbml0aWFsaXplIHRoZSBuZXcgcG9vbCBoZWFkZXIgYW5kIGFkZCB0byBsaXN0ICovCi0gIGhkcl9wdHItPmhkci5uZXh0ID0gbWVtLT5sYXJnZV9saXN0W3Bvb2xfaWRdOwotICAvKiBXZSBtYWludGFpbiBzcGFjZSBjb3VudHMgaW4gZWFjaCBwb29sIGhlYWRlciBmb3Igc3RhdGlzdGljYWwgcHVycG9zZXMsCi0gICAqIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIG5vdCBuZWVkZWQgZm9yIGFsbG9jYXRpb24uCi0gICAqLwotICBoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCA9IHNpemVvZm9iamVjdDsKLSAgaGRyX3B0ci0+aGRyLmJ5dGVzX2xlZnQgPSAwOwotICBtZW0tPmxhcmdlX2xpc3RbcG9vbF9pZF0gPSBoZHJfcHRyOwotCi0gIHJldHVybiAodm9pZCBGQVIgKikgKGhkcl9wdHIgKyAxKTsgLyogcG9pbnQgdG8gZmlyc3QgZGF0YSBieXRlIGluIHBvb2wgKi8KLX0KLQotCi0vKgotICogQ3JlYXRpb24gb2YgMi1EIHNhbXBsZSBhcnJheXMuCi0gKiBUaGUgcG9pbnRlcnMgYXJlIGluIG5lYXIgaGVhcCwgdGhlIHNhbXBsZXMgdGhlbXNlbHZlcyBpbiBGQVIgaGVhcC4KLSAqCi0gKiBUbyBtaW5pbWl6ZSBhbGxvY2F0aW9uIG92ZXJoZWFkIGFuZCB0byBhbGxvdyBJL08gb2YgbGFyZ2UgY29udGlndW91cwotICogYmxvY2tzLCB3ZSBhbGxvY2F0ZSB0aGUgc2FtcGxlIHJvd3MgaW4gZ3JvdXBzIG9mIGFzIG1hbnkgcm93cyBhcyBwb3NzaWJsZQotICogd2l0aG91dCBleGNlZWRpbmcgTUFYX0FMTE9DX0NIVU5LIHRvdGFsIGJ5dGVzIHBlciBhbGxvY2F0aW9uIHJlcXVlc3QuCi0gKiBOQjogdGhlIHZpcnR1YWwgYXJyYXkgY29udHJvbCByb3V0aW5lcywgbGF0ZXIgaW4gdGhpcyBmaWxlLCBrbm93IGFib3V0Ci0gKiB0aGlzIGNodW5raW5nIG9mIHJvd3MuICBUaGUgcm93c3BlcmNodW5rIHZhbHVlIGlzIGxlZnQgaW4gdGhlIG1lbSBtYW5hZ2VyCi0gKiBvYmplY3Qgc28gdGhhdCBpdCBjYW4gYmUgc2F2ZWQgYXdheSBpZiB0aGlzIHNhcnJheSBpcyB0aGUgd29ya3NwYWNlIGZvcgotICogYSB2aXJ0dWFsIGFycmF5LgotICovCi0KLU1FVEhPRERFRihKU0FNUEFSUkFZKQotYWxsb2Nfc2FycmF5IChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAotCSAgICAgIEpESU1FTlNJT04gc2FtcGxlc3BlcnJvdywgSkRJTUVOU0lPTiBudW1yb3dzKQotLyogQWxsb2NhdGUgYSAyLUQgc2FtcGxlIGFycmF5ICovCi17Ci0gIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07Ci0gIEpTQU1QQVJSQVkgcmVzdWx0OwotICBKU0FNUFJPVyB3b3Jrc3BhY2U7Ci0gIEpESU1FTlNJT04gcm93c3BlcmNodW5rLCBjdXJyb3csIGk7Ci0gIGxvbmcgbHRlbXA7Ci0KLSAgLyogQ2FsY3VsYXRlIG1heCAjIG9mIHJvd3MgYWxsb3dlZCBpbiBvbmUgYWxsb2NhdGlvbiBjaHVuayAqLwotICBsdGVtcCA9IChNQVhfQUxMT0NfQ0hVTkstU0laRU9GKGxhcmdlX3Bvb2xfaGRyKSkgLwotCSAgKChsb25nKSBzYW1wbGVzcGVycm93ICogU0laRU9GKEpTQU1QTEUpKTsKLSAgaWYgKGx0ZW1wIDw9IDApCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9XSURUSF9PVkVSRkxPVyk7Ci0gIGlmIChsdGVtcCA8IChsb25nKSBudW1yb3dzKQotICAgIHJvd3NwZXJjaHVuayA9IChKRElNRU5TSU9OKSBsdGVtcDsKLSAgZWxzZQotICAgIHJvd3NwZXJjaHVuayA9IG51bXJvd3M7Ci0gIG1lbS0+bGFzdF9yb3dzcGVyY2h1bmsgPSByb3dzcGVyY2h1bms7Ci0KLSAgLyogR2V0IHNwYWNlIGZvciByb3cgcG9pbnRlcnMgKHNtYWxsIG9iamVjdCkgKi8KLSAgcmVzdWx0ID0gKEpTQU1QQVJSQVkpIGFsbG9jX3NtYWxsKGNpbmZvLCBwb29sX2lkLAotCQkJCSAgICAoc2l6ZV90KSAobnVtcm93cyAqIFNJWkVPRihKU0FNUFJPVykpKTsKLQotICAvKiBHZXQgdGhlIHJvd3MgdGhlbXNlbHZlcyAobGFyZ2Ugb2JqZWN0cykgKi8KLSAgY3Vycm93ID0gMDsKLSAgd2hpbGUgKGN1cnJvdyA8IG51bXJvd3MpIHsKLSAgICByb3dzcGVyY2h1bmsgPSBNSU4ocm93c3BlcmNodW5rLCBudW1yb3dzIC0gY3Vycm93KTsKLSAgICB3b3Jrc3BhY2UgPSAoSlNBTVBST1cpIGFsbG9jX2xhcmdlKGNpbmZvLCBwb29sX2lkLAotCShzaXplX3QpICgoc2l6ZV90KSByb3dzcGVyY2h1bmsgKiAoc2l6ZV90KSBzYW1wbGVzcGVycm93Ci0JCSAgKiBTSVpFT0YoSlNBTVBMRSkpKTsKLSAgICBmb3IgKGkgPSByb3dzcGVyY2h1bms7IGkgPiAwOyBpLS0pIHsKLSAgICAgIHJlc3VsdFtjdXJyb3crK10gPSB3b3Jrc3BhY2U7Ci0gICAgICB3b3Jrc3BhY2UgKz0gc2FtcGxlc3BlcnJvdzsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qCi0gKiBDcmVhdGlvbiBvZiAyLUQgY29lZmZpY2llbnQtYmxvY2sgYXJyYXlzLgotICogVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyB0aGUgY29kZSBmb3Igc2FtcGxlIGFycmF5cywgYWJvdmUuCi0gKi8KLQotTUVUSE9EREVGKEpCTE9DS0FSUkFZKQotYWxsb2NfYmFycmF5IChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAotCSAgICAgIEpESU1FTlNJT04gYmxvY2tzcGVycm93LCBKRElNRU5TSU9OIG51bXJvd3MpCi0vKiBBbGxvY2F0ZSBhIDItRCBjb2VmZmljaWVudC1ibG9jayBhcnJheSAqLwotewotICBteV9tZW1fcHRyIG1lbSA9IChteV9tZW1fcHRyKSBjaW5mby0+bWVtOwotICBKQkxPQ0tBUlJBWSByZXN1bHQ7Ci0gIEpCTE9DS1JPVyB3b3Jrc3BhY2U7Ci0gIEpESU1FTlNJT04gcm93c3BlcmNodW5rLCBjdXJyb3csIGk7Ci0gIGxvbmcgbHRlbXA7Ci0KLSAgLyogQ2FsY3VsYXRlIG1heCAjIG9mIHJvd3MgYWxsb3dlZCBpbiBvbmUgYWxsb2NhdGlvbiBjaHVuayAqLwotICBsdGVtcCA9IChNQVhfQUxMT0NfQ0hVTkstU0laRU9GKGxhcmdlX3Bvb2xfaGRyKSkgLwotCSAgKChsb25nKSBibG9ja3NwZXJyb3cgKiBTSVpFT0YoSkJMT0NLKSk7Ci0gIGlmIChsdGVtcCA8PSAwKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfV0lEVEhfT1ZFUkZMT1cpOwotICBpZiAobHRlbXAgPCAobG9uZykgbnVtcm93cykKLSAgICByb3dzcGVyY2h1bmsgPSAoSkRJTUVOU0lPTikgbHRlbXA7Ci0gIGVsc2UKLSAgICByb3dzcGVyY2h1bmsgPSBudW1yb3dzOwotICBtZW0tPmxhc3Rfcm93c3BlcmNodW5rID0gcm93c3BlcmNodW5rOwotCi0gIC8qIEdldCBzcGFjZSBmb3Igcm93IHBvaW50ZXJzIChzbWFsbCBvYmplY3QpICovCi0gIHJlc3VsdCA9IChKQkxPQ0tBUlJBWSkgYWxsb2Nfc21hbGwoY2luZm8sIHBvb2xfaWQsCi0JCQkJICAgICAoc2l6ZV90KSAobnVtcm93cyAqIFNJWkVPRihKQkxPQ0tST1cpKSk7Ci0KLSAgLyogR2V0IHRoZSByb3dzIHRoZW1zZWx2ZXMgKGxhcmdlIG9iamVjdHMpICovCi0gIGN1cnJvdyA9IDA7Ci0gIHdoaWxlIChjdXJyb3cgPCBudW1yb3dzKSB7Ci0gICAgcm93c3BlcmNodW5rID0gTUlOKHJvd3NwZXJjaHVuaywgbnVtcm93cyAtIGN1cnJvdyk7Ci0gICAgd29ya3NwYWNlID0gKEpCTE9DS1JPVykgYWxsb2NfbGFyZ2UoY2luZm8sIHBvb2xfaWQsCi0JKHNpemVfdCkgKChzaXplX3QpIHJvd3NwZXJjaHVuayAqIChzaXplX3QpIGJsb2Nrc3BlcnJvdwotCQkgICogU0laRU9GKEpCTE9DSykpKTsKLSAgICBmb3IgKGkgPSByb3dzcGVyY2h1bms7IGkgPiAwOyBpLS0pIHsKLSAgICAgIHJlc3VsdFtjdXJyb3crK10gPSB3b3Jrc3BhY2U7Ci0gICAgICB3b3Jrc3BhY2UgKz0gYmxvY2tzcGVycm93OwotICAgIH0KLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotLyoKLSAqIEFib3V0IHZpcnR1YWwgYXJyYXkgbWFuYWdlbWVudDoKLSAqCi0gKiBUaGUgYWJvdmUgIm5vcm1hbCIgYXJyYXkgcm91dGluZXMgYXJlIG9ubHkgdXNlZCB0byBhbGxvY2F0ZSBzdHJpcCBidWZmZXJzCi0gKiAoYXMgd2lkZSBhcyB0aGUgaW1hZ2UsIGJ1dCBqdXN0IGEgZmV3IHJvd3MgaGlnaCkuICBGdWxsLWltYWdlLXNpemVkIGJ1ZmZlcnMKLSAqIGFyZSBoYW5kbGVkIGFzICJ2aXJ0dWFsIiBhcnJheXMuICBUaGUgYXJyYXkgaXMgc3RpbGwgYWNjZXNzZWQgYSBzdHJpcCBhdCBhCi0gKiB0aW1lLCBidXQgdGhlIG1lbW9yeSBtYW5hZ2VyIG11c3Qgc2F2ZSB0aGUgd2hvbGUgYXJyYXkgZm9yIHJlcGVhdGVkCi0gKiBhY2Nlc3Nlcy4gIFRoZSBpbnRlbmRlZCBpbXBsZW1lbnRhdGlvbiBpcyB0aGF0IHRoZXJlIGlzIGEgc3RyaXAgYnVmZmVyIGluCi0gKiBtZW1vcnkgKGFzIGhpZ2ggYXMgaXMgcG9zc2libGUgZ2l2ZW4gdGhlIGRlc2lyZWQgbWVtb3J5IGxpbWl0KSwgcGx1cyBhCi0gKiBiYWNraW5nIGZpbGUgdGhhdCBob2xkcyB0aGUgcmVzdCBvZiB0aGUgYXJyYXkuCi0gKgotICogVGhlIHJlcXVlc3RfdmlydF9hcnJheSByb3V0aW5lcyBhcmUgdG9sZCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgaW1hZ2UgYW5kCi0gKiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0aGF0IHdpbGwgYmUgYWNjZXNzZWQgYXQgb25jZS4gIFRoZSBpbi1tZW1vcnkKLSAqIGJ1ZmZlciBtdXN0IGJlIGF0IGxlYXN0IGFzIGxhcmdlIGFzIHRoZSBtYXhhY2Nlc3MgdmFsdWUuCi0gKgotICogVGhlIHJlcXVlc3Qgcm91dGluZXMgY3JlYXRlIGNvbnRyb2wgYmxvY2tzIGJ1dCBub3QgdGhlIGluLW1lbW9yeSBidWZmZXJzLgotICogVGhhdCBpcyBwb3N0cG9uZWQgdW50aWwgcmVhbGl6ZV92aXJ0X2FycmF5cyBpcyBjYWxsZWQuICBBdCB0aGF0IHRpbWUgdGhlCi0gKiB0b3RhbCBhbW91bnQgb2Ygc3BhY2UgbmVlZGVkIGlzIGtub3duIChhcHByb3hpbWF0ZWx5LCBhbnl3YXkpLCBzbyBmcmVlCi0gKiBtZW1vcnkgY2FuIGJlIGRpdmlkZWQgdXAgZmFpcmx5LgotICoKLSAqIFRoZSBhY2Nlc3NfdmlydF9hcnJheSByb3V0aW5lcyBhcmUgcmVzcG9uc2libGUgZm9yIG1ha2luZyBhIHNwZWNpZmljIHN0cmlwCi0gKiBhcmVhIGFjY2Vzc2libGUgKGFmdGVyIHJlYWRpbmcgb3Igd3JpdGluZyB0aGUgYmFja2luZyBmaWxlLCBpZiBuZWNlc3NhcnkpLgotICogTm90ZSB0aGF0IHRoZSBhY2Nlc3Mgcm91dGluZXMgYXJlIHRvbGQgd2hldGhlciB0aGUgY2FsbGVyIGludGVuZHMgdG8gbW9kaWZ5Ci0gKiB0aGUgYWNjZXNzZWQgc3RyaXA7IGR1cmluZyBhIHJlYWQtb25seSBwYXNzIHRoaXMgc2F2ZXMgaGF2aW5nIHRvIHJld3JpdGUKLSAqIGRhdGEgdG8gZGlzay4gIFRoZSBhY2Nlc3Mgcm91dGluZXMgYXJlIGFsc28gcmVzcG9uc2libGUgZm9yIHByZS16ZXJvaW5nCi0gKiBhbnkgbmV3bHkgYWNjZXNzZWQgcm93cywgaWYgcHJlLXplcm9pbmcgd2FzIHJlcXVlc3RlZC4KLSAqCi0gKiBJbiBjdXJyZW50IHVzYWdlLCB0aGUgYWNjZXNzIHJlcXVlc3RzIGFyZSB1c3VhbGx5IGZvciBub25vdmVybGFwcGluZwotICogc3RyaXBzOyB0aGF0IGlzLCBzdWNjZXNzaXZlIGFjY2VzcyBzdGFydF9yb3cgbnVtYmVycyBkaWZmZXIgYnkgZXhhY3RseQotICogbnVtX3Jvd3MgPSBtYXhhY2Nlc3MuICBUaGlzIG1lYW5zIHdlIGNhbiBnZXQgZ29vZCBwZXJmb3JtYW5jZSB3aXRoIHNpbXBsZQotICogYnVmZmVyIGR1bXAvcmVsb2FkIGxvZ2ljLCBieSBtYWtpbmcgdGhlIGluLW1lbW9yeSBidWZmZXIgYmUgYSBtdWx0aXBsZQotICogb2YgdGhlIGFjY2VzcyBoZWlnaHQ7IHRoZW4gdGhlcmUgd2lsbCBuZXZlciBiZSBhY2Nlc3NlcyBhY3Jvc3MgYnVmZmVybG9hZAotICogYm91bmRhcmllcy4gIFRoZSBjb2RlIHdpbGwgc3RpbGwgd29yayB3aXRoIG92ZXJsYXBwaW5nIGFjY2VzcyByZXF1ZXN0cywKLSAqIGJ1dCBpdCBkb2Vzbid0IGhhbmRsZSBidWZmZXJsb2FkIG92ZXJsYXBzIHZlcnkgZWZmaWNpZW50bHkuCi0gKi8KLQotCi1NRVRIT0RERUYoanZpcnRfc2FycmF5X3B0cikKLXJlcXVlc3RfdmlydF9zYXJyYXkgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsIGJvb2xlYW4gcHJlX3plcm8sCi0JCSAgICAgSkRJTUVOU0lPTiBzYW1wbGVzcGVycm93LCBKRElNRU5TSU9OIG51bXJvd3MsCi0JCSAgICAgSkRJTUVOU0lPTiBtYXhhY2Nlc3MpCi0vKiBSZXF1ZXN0IGEgdmlydHVhbCAyLUQgc2FtcGxlIGFycmF5ICovCi17Ci0gIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07Ci0gIGp2aXJ0X3NhcnJheV9wdHIgcmVzdWx0OwotCi0gIC8qIE9ubHkgSU1BR0UtbGlmZXRpbWUgdmlydHVhbCBhcnJheXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQgKi8KLSAgaWYgKHBvb2xfaWQgIT0gSlBPT0xfSU1BR0UpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BPT0xfSUQsIHBvb2xfaWQpOwkvKiBzYWZldHkgY2hlY2sgKi8KLQotICAvKiBnZXQgY29udHJvbCBibG9jayAqLwotICByZXN1bHQgPSAoanZpcnRfc2FycmF5X3B0cikgYWxsb2Nfc21hbGwoY2luZm8sIHBvb2xfaWQsCi0JCQkJCSAgU0laRU9GKHN0cnVjdCBqdmlydF9zYXJyYXlfY29udHJvbCkpOwotCi0gIHJlc3VsdC0+bWVtX2J1ZmZlciA9IE5VTEw7CS8qIG1hcmtzIGFycmF5IG5vdCB5ZXQgcmVhbGl6ZWQgKi8KLSAgcmVzdWx0LT5yb3dzX2luX2FycmF5ID0gbnVtcm93czsKLSAgcmVzdWx0LT5zYW1wbGVzcGVycm93ID0gc2FtcGxlc3BlcnJvdzsKLSAgcmVzdWx0LT5tYXhhY2Nlc3MgPSBtYXhhY2Nlc3M7Ci0gIHJlc3VsdC0+cHJlX3plcm8gPSBwcmVfemVybzsKLSAgcmVzdWx0LT5iX3Nfb3BlbiA9IEZBTFNFOwkvKiBubyBhc3NvY2lhdGVkIGJhY2tpbmctc3RvcmUgb2JqZWN0ICovCi0gIHJlc3VsdC0+bmV4dCA9IG1lbS0+dmlydF9zYXJyYXlfbGlzdDsgLyogYWRkIHRvIGxpc3Qgb2YgdmlydHVhbCBhcnJheXMgKi8KLSAgbWVtLT52aXJ0X3NhcnJheV9saXN0ID0gcmVzdWx0OwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotTUVUSE9EREVGKGp2aXJ0X2JhcnJheV9wdHIpCi1yZXF1ZXN0X3ZpcnRfYmFycmF5IChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLCBib29sZWFuIHByZV96ZXJvLAotCQkgICAgIEpESU1FTlNJT04gYmxvY2tzcGVycm93LCBKRElNRU5TSU9OIG51bXJvd3MsCi0JCSAgICAgSkRJTUVOU0lPTiBtYXhhY2Nlc3MpCi0vKiBSZXF1ZXN0IGEgdmlydHVhbCAyLUQgY29lZmZpY2llbnQtYmxvY2sgYXJyYXkgKi8KLXsKLSAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKLSAganZpcnRfYmFycmF5X3B0ciByZXN1bHQ7Ci0KLSAgLyogT25seSBJTUFHRS1saWZldGltZSB2aXJ0dWFsIGFycmF5cyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZCAqLwotICBpZiAocG9vbF9pZCAhPSBKUE9PTF9JTUFHRSkKLSAgICBFUlJFWElUMShjaW5mbywgSkVSUl9CQURfUE9PTF9JRCwgcG9vbF9pZCk7CS8qIHNhZmV0eSBjaGVjayAqLwotCi0gIC8qIGdldCBjb250cm9sIGJsb2NrICovCi0gIHJlc3VsdCA9IChqdmlydF9iYXJyYXlfcHRyKSBhbGxvY19zbWFsbChjaW5mbywgcG9vbF9pZCwKLQkJCQkJICBTSVpFT0Yoc3RydWN0IGp2aXJ0X2JhcnJheV9jb250cm9sKSk7Ci0KLSAgcmVzdWx0LT5tZW1fYnVmZmVyID0gTlVMTDsJLyogbWFya3MgYXJyYXkgbm90IHlldCByZWFsaXplZCAqLwotICByZXN1bHQtPnJvd3NfaW5fYXJyYXkgPSBudW1yb3dzOwotICByZXN1bHQtPmJsb2Nrc3BlcnJvdyA9IGJsb2Nrc3BlcnJvdzsKLSAgcmVzdWx0LT5tYXhhY2Nlc3MgPSBtYXhhY2Nlc3M7Ci0gIHJlc3VsdC0+cHJlX3plcm8gPSBwcmVfemVybzsKLSAgcmVzdWx0LT5iX3Nfb3BlbiA9IEZBTFNFOwkvKiBubyBhc3NvY2lhdGVkIGJhY2tpbmctc3RvcmUgb2JqZWN0ICovCi0gIHJlc3VsdC0+bmV4dCA9IG1lbS0+dmlydF9iYXJyYXlfbGlzdDsgLyogYWRkIHRvIGxpc3Qgb2YgdmlydHVhbCBhcnJheXMgKi8KLSAgbWVtLT52aXJ0X2JhcnJheV9saXN0ID0gcmVzdWx0OwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLQotTUVUSE9EREVGKHZvaWQpCi1yZWFsaXplX3ZpcnRfYXJyYXlzIChqX2NvbW1vbl9wdHIgY2luZm8pCi0vKiBBbGxvY2F0ZSB0aGUgaW4tbWVtb3J5IGJ1ZmZlcnMgZm9yIGFueSB1bnJlYWxpemVkIHZpcnR1YWwgYXJyYXlzICovCi17Ci0gIG15X21lbV9wdHIgbWVtID0gKG15X21lbV9wdHIpIGNpbmZvLT5tZW07Ci0gIGxvbmcgc3BhY2VfcGVyX21pbmhlaWdodCwgbWF4aW11bV9zcGFjZSwgYXZhaWxfbWVtOwotICBsb25nIG1pbmhlaWdodHMsIG1heF9taW5oZWlnaHRzOwotICBqdmlydF9zYXJyYXlfcHRyIHNwdHI7Ci0gIGp2aXJ0X2JhcnJheV9wdHIgYnB0cjsKLQotICAvKiBDb21wdXRlIHRoZSBtaW5pbXVtIHNwYWNlIG5lZWRlZCAobWF4YWNjZXNzIHJvd3MgaW4gZWFjaCBidWZmZXIpCi0gICAqIGFuZCB0aGUgbWF4aW11bSBzcGFjZSBuZWVkZWQgKGZ1bGwgaW1hZ2UgaGVpZ2h0IGluIGVhY2ggYnVmZmVyKS4KLSAgICogVGhlc2UgbWF5IGJlIG9mIHVzZSB0byB0aGUgc3lzdGVtLWRlcGVuZGVudCBqcGVnX21lbV9hdmFpbGFibGUgcm91dGluZS4KLSAgICovCi0gIHNwYWNlX3Blcl9taW5oZWlnaHQgPSAwOwotICBtYXhpbXVtX3NwYWNlID0gMDsKLSAgZm9yIChzcHRyID0gbWVtLT52aXJ0X3NhcnJheV9saXN0OyBzcHRyICE9IE5VTEw7IHNwdHIgPSBzcHRyLT5uZXh0KSB7Ci0gICAgaWYgKHNwdHItPm1lbV9idWZmZXIgPT0gTlVMTCkgeyAvKiBpZiBub3QgcmVhbGl6ZWQgeWV0ICovCi0gICAgICBzcGFjZV9wZXJfbWluaGVpZ2h0ICs9IChsb25nKSBzcHRyLT5tYXhhY2Nlc3MgKgotCQkJICAgICAobG9uZykgc3B0ci0+c2FtcGxlc3BlcnJvdyAqIFNJWkVPRihKU0FNUExFKTsKLSAgICAgIG1heGltdW1fc3BhY2UgKz0gKGxvbmcpIHNwdHItPnJvd3NfaW5fYXJyYXkgKgotCQkgICAgICAgKGxvbmcpIHNwdHItPnNhbXBsZXNwZXJyb3cgKiBTSVpFT0YoSlNBTVBMRSk7Ci0gICAgfQotICB9Ci0gIGZvciAoYnB0ciA9IG1lbS0+dmlydF9iYXJyYXlfbGlzdDsgYnB0ciAhPSBOVUxMOyBicHRyID0gYnB0ci0+bmV4dCkgewotICAgIGlmIChicHRyLT5tZW1fYnVmZmVyID09IE5VTEwpIHsgLyogaWYgbm90IHJlYWxpemVkIHlldCAqLwotICAgICAgc3BhY2VfcGVyX21pbmhlaWdodCArPSAobG9uZykgYnB0ci0+bWF4YWNjZXNzICoKLQkJCSAgICAgKGxvbmcpIGJwdHItPmJsb2Nrc3BlcnJvdyAqIFNJWkVPRihKQkxPQ0spOwotICAgICAgbWF4aW11bV9zcGFjZSArPSAobG9uZykgYnB0ci0+cm93c19pbl9hcnJheSAqCi0JCSAgICAgICAobG9uZykgYnB0ci0+YmxvY2tzcGVycm93ICogU0laRU9GKEpCTE9DSyk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHNwYWNlX3Blcl9taW5oZWlnaHQgPD0gMCkKLSAgICByZXR1cm47CQkJLyogbm8gdW5yZWFsaXplZCBhcnJheXMsIG5vIHdvcmsgKi8KLQotICAvKiBEZXRlcm1pbmUgYW1vdW50IG9mIG1lbW9yeSB0byBhY3R1YWxseSB1c2U7IHRoaXMgaXMgc3lzdGVtLWRlcGVuZGVudC4gKi8KLSAgYXZhaWxfbWVtID0ganBlZ19tZW1fYXZhaWxhYmxlKGNpbmZvLCBzcGFjZV9wZXJfbWluaGVpZ2h0LCBtYXhpbXVtX3NwYWNlLAotCQkJCSBtZW0tPnRvdGFsX3NwYWNlX2FsbG9jYXRlZCk7Ci0KLSAgLyogSWYgdGhlIG1heGltdW0gc3BhY2UgbmVlZGVkIGlzIGF2YWlsYWJsZSwgbWFrZSBhbGwgdGhlIGJ1ZmZlcnMgZnVsbAotICAgKiBoZWlnaHQ7IG90aGVyd2lzZSBwYXJjZWwgaXQgb3V0IHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIG1pbmhlaWdodHMKLSAgICogaW4gZWFjaCBidWZmZXIuCi0gICAqLwotICBpZiAoYXZhaWxfbWVtID49IG1heGltdW1fc3BhY2UpCi0gICAgbWF4X21pbmhlaWdodHMgPSAxMDAwMDAwMDAwTDsKLSAgZWxzZSB7Ci0gICAgbWF4X21pbmhlaWdodHMgPSBhdmFpbF9tZW0gLyBzcGFjZV9wZXJfbWluaGVpZ2h0OwotICAgIC8qIElmIHRoZXJlIGRvZXNuJ3Qgc2VlbSB0byBiZSBlbm91Z2ggc3BhY2UsIHRyeSB0byBnZXQgdGhlIG1pbmltdW0KLSAgICAgKiBhbnl3YXkuICBUaGlzIGFsbG93cyBhICJzdHViIiBpbXBsZW1lbnRhdGlvbiBvZiBqcGVnX21lbV9hdmFpbGFibGUoKS4KLSAgICAgKi8KLSAgICBpZiAobWF4X21pbmhlaWdodHMgPD0gMCkKLSAgICAgIG1heF9taW5oZWlnaHRzID0gMTsKLSAgfQotCi0gIC8qIEFsbG9jYXRlIHRoZSBpbi1tZW1vcnkgYnVmZmVycyBhbmQgaW5pdGlhbGl6ZSBiYWNraW5nIHN0b3JlIGFzIG5lZWRlZC4gKi8KLQotICBmb3IgKHNwdHIgPSBtZW0tPnZpcnRfc2FycmF5X2xpc3Q7IHNwdHIgIT0gTlVMTDsgc3B0ciA9IHNwdHItPm5leHQpIHsKLSAgICBpZiAoc3B0ci0+bWVtX2J1ZmZlciA9PSBOVUxMKSB7IC8qIGlmIG5vdCByZWFsaXplZCB5ZXQgKi8KLSAgICAgIG1pbmhlaWdodHMgPSAoKGxvbmcpIHNwdHItPnJvd3NfaW5fYXJyYXkgLSAxTCkgLyBzcHRyLT5tYXhhY2Nlc3MgKyAxTDsKLSAgICAgIGlmIChtaW5oZWlnaHRzIDw9IG1heF9taW5oZWlnaHRzKSB7Ci0JLyogVGhpcyBidWZmZXIgZml0cyBpbiBtZW1vcnkgKi8KLQlzcHRyLT5yb3dzX2luX21lbSA9IHNwdHItPnJvd3NfaW5fYXJyYXk7Ci0gICAgICB9IGVsc2UgewotCS8qIEl0IGRvZXNuJ3QgZml0IGluIG1lbW9yeSwgY3JlYXRlIGJhY2tpbmcgc3RvcmUuICovCi0Jc3B0ci0+cm93c19pbl9tZW0gPSAoSkRJTUVOU0lPTikgKG1heF9taW5oZWlnaHRzICogc3B0ci0+bWF4YWNjZXNzKTsKLQlqcGVnX29wZW5fYmFja2luZ19zdG9yZShjaW5mbywgJiBzcHRyLT5iX3NfaW5mbywKLQkJCQkobG9uZykgc3B0ci0+cm93c19pbl9hcnJheSAqCi0JCQkJKGxvbmcpIHNwdHItPnNhbXBsZXNwZXJyb3cgKgotCQkJCShsb25nKSBTSVpFT0YoSlNBTVBMRSkpOwotCXNwdHItPmJfc19vcGVuID0gVFJVRTsKLSAgICAgIH0KLSAgICAgIHNwdHItPm1lbV9idWZmZXIgPSBhbGxvY19zYXJyYXkoY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgICAgIHNwdHItPnNhbXBsZXNwZXJyb3csIHNwdHItPnJvd3NfaW5fbWVtKTsKLSAgICAgIHNwdHItPnJvd3NwZXJjaHVuayA9IG1lbS0+bGFzdF9yb3dzcGVyY2h1bms7Ci0gICAgICBzcHRyLT5jdXJfc3RhcnRfcm93ID0gMDsKLSAgICAgIHNwdHItPmZpcnN0X3VuZGVmX3JvdyA9IDA7Ci0gICAgICBzcHRyLT5kaXJ0eSA9IEZBTFNFOwotICAgIH0KLSAgfQotCi0gIGZvciAoYnB0ciA9IG1lbS0+dmlydF9iYXJyYXlfbGlzdDsgYnB0ciAhPSBOVUxMOyBicHRyID0gYnB0ci0+bmV4dCkgewotICAgIGlmIChicHRyLT5tZW1fYnVmZmVyID09IE5VTEwpIHsgLyogaWYgbm90IHJlYWxpemVkIHlldCAqLwotICAgICAgbWluaGVpZ2h0cyA9ICgobG9uZykgYnB0ci0+cm93c19pbl9hcnJheSAtIDFMKSAvIGJwdHItPm1heGFjY2VzcyArIDFMOwotICAgICAgaWYgKG1pbmhlaWdodHMgPD0gbWF4X21pbmhlaWdodHMpIHsKLQkvKiBUaGlzIGJ1ZmZlciBmaXRzIGluIG1lbW9yeSAqLwotCWJwdHItPnJvd3NfaW5fbWVtID0gYnB0ci0+cm93c19pbl9hcnJheTsKLSAgICAgIH0gZWxzZSB7Ci0JLyogSXQgZG9lc24ndCBmaXQgaW4gbWVtb3J5LCBjcmVhdGUgYmFja2luZyBzdG9yZS4gKi8KLQlicHRyLT5yb3dzX2luX21lbSA9IChKRElNRU5TSU9OKSAobWF4X21pbmhlaWdodHMgKiBicHRyLT5tYXhhY2Nlc3MpOwotCWpwZWdfb3Blbl9iYWNraW5nX3N0b3JlKGNpbmZvLCAmIGJwdHItPmJfc19pbmZvLAotCQkJCShsb25nKSBicHRyLT5yb3dzX2luX2FycmF5ICoKLQkJCQkobG9uZykgYnB0ci0+YmxvY2tzcGVycm93ICoKLQkJCQkobG9uZykgU0laRU9GKEpCTE9DSykpOwotCWJwdHItPmJfc19vcGVuID0gVFJVRTsKLSAgICAgIH0KLSAgICAgIGJwdHItPm1lbV9idWZmZXIgPSBhbGxvY19iYXJyYXkoY2luZm8sIEpQT09MX0lNQUdFLAotCQkJCSAgICAgIGJwdHItPmJsb2Nrc3BlcnJvdywgYnB0ci0+cm93c19pbl9tZW0pOwotICAgICAgYnB0ci0+cm93c3BlcmNodW5rID0gbWVtLT5sYXN0X3Jvd3NwZXJjaHVuazsKLSAgICAgIGJwdHItPmN1cl9zdGFydF9yb3cgPSAwOwotICAgICAgYnB0ci0+Zmlyc3RfdW5kZWZfcm93ID0gMDsKLSAgICAgIGJwdHItPmRpcnR5ID0gRkFMU0U7Ci0gICAgfQotICB9Ci19Ci0KLQotTE9DQUwodm9pZCkKLWRvX3NhcnJheV9pbyAoal9jb21tb25fcHRyIGNpbmZvLCBqdmlydF9zYXJyYXlfcHRyIHB0ciwgYm9vbGVhbiB3cml0aW5nKQotLyogRG8gYmFja2luZyBzdG9yZSByZWFkIG9yIHdyaXRlIG9mIGEgdmlydHVhbCBzYW1wbGUgYXJyYXkgKi8KLXsKLSAgbG9uZyBieXRlc3BlcnJvdywgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQsIHJvd3MsIHRoaXNyb3csIGk7Ci0KLSAgYnl0ZXNwZXJyb3cgPSAobG9uZykgcHRyLT5zYW1wbGVzcGVycm93ICogU0laRU9GKEpTQU1QTEUpOwotICBmaWxlX29mZnNldCA9IHB0ci0+Y3VyX3N0YXJ0X3JvdyAqIGJ5dGVzcGVycm93OwotICAvKiBMb29wIHRvIHJlYWQgb3Igd3JpdGUgZWFjaCBhbGxvY2F0aW9uIGNodW5rIGluIG1lbV9idWZmZXIgKi8KLSAgZm9yIChpID0gMDsgaSA8IChsb25nKSBwdHItPnJvd3NfaW5fbWVtOyBpICs9IHB0ci0+cm93c3BlcmNodW5rKSB7Ci0gICAgLyogT25lIGNodW5rLCBidXQgY2hlY2sgZm9yIHNob3J0IGNodW5rIGF0IGVuZCBvZiBidWZmZXIgKi8KLSAgICByb3dzID0gTUlOKChsb25nKSBwdHItPnJvd3NwZXJjaHVuaywgKGxvbmcpIHB0ci0+cm93c19pbl9tZW0gLSBpKTsKLSAgICAvKiBUcmFuc2ZlciBubyBtb3JlIHRoYW4gaXMgY3VycmVudGx5IGRlZmluZWQgKi8KLSAgICB0aGlzcm93ID0gKGxvbmcpIHB0ci0+Y3VyX3N0YXJ0X3JvdyArIGk7Ci0gICAgcm93cyA9IE1JTihyb3dzLCAobG9uZykgcHRyLT5maXJzdF91bmRlZl9yb3cgLSB0aGlzcm93KTsKLSAgICAvKiBUcmFuc2ZlciBubyBtb3JlIHRoYW4gZml0cyBpbiBmaWxlICovCi0gICAgcm93cyA9IE1JTihyb3dzLCAobG9uZykgcHRyLT5yb3dzX2luX2FycmF5IC0gdGhpc3Jvdyk7Ci0gICAgaWYgKHJvd3MgPD0gMCkJCS8qIHRoaXMgY2h1bmsgbWlnaHQgYmUgcGFzdCBlbmQgb2YgZmlsZSEgKi8KLSAgICAgIGJyZWFrOwotICAgIGJ5dGVfY291bnQgPSByb3dzICogYnl0ZXNwZXJyb3c7Ci0gICAgaWYgKHdyaXRpbmcpCi0gICAgICAoKnB0ci0+Yl9zX2luZm8ud3JpdGVfYmFja2luZ19zdG9yZSkgKGNpbmZvLCAmIHB0ci0+Yl9zX2luZm8sCi0JCQkJCSAgICAodm9pZCBGQVIgKikgcHRyLT5tZW1fYnVmZmVyW2ldLAotCQkJCQkgICAgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQpOwotICAgIGVsc2UKLSAgICAgICgqcHRyLT5iX3NfaW5mby5yZWFkX2JhY2tpbmdfc3RvcmUpIChjaW5mbywgJiBwdHItPmJfc19pbmZvLAotCQkJCQkgICAodm9pZCBGQVIgKikgcHRyLT5tZW1fYnVmZmVyW2ldLAotCQkJCQkgICBmaWxlX29mZnNldCwgYnl0ZV9jb3VudCk7Ci0gICAgZmlsZV9vZmZzZXQgKz0gYnl0ZV9jb3VudDsKLSAgfQotfQotCi0KLUxPQ0FMKHZvaWQpCi1kb19iYXJyYXlfaW8gKGpfY29tbW9uX3B0ciBjaW5mbywganZpcnRfYmFycmF5X3B0ciBwdHIsIGJvb2xlYW4gd3JpdGluZykKLS8qIERvIGJhY2tpbmcgc3RvcmUgcmVhZCBvciB3cml0ZSBvZiBhIHZpcnR1YWwgY29lZmZpY2llbnQtYmxvY2sgYXJyYXkgKi8KLXsKLSAgbG9uZyBieXRlc3BlcnJvdywgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQsIHJvd3MsIHRoaXNyb3csIGk7Ci0KLSAgYnl0ZXNwZXJyb3cgPSAobG9uZykgcHRyLT5ibG9ja3NwZXJyb3cgKiBTSVpFT0YoSkJMT0NLKTsKLSAgZmlsZV9vZmZzZXQgPSBwdHItPmN1cl9zdGFydF9yb3cgKiBieXRlc3BlcnJvdzsKLSAgLyogTG9vcCB0byByZWFkIG9yIHdyaXRlIGVhY2ggYWxsb2NhdGlvbiBjaHVuayBpbiBtZW1fYnVmZmVyICovCi0gIGZvciAoaSA9IDA7IGkgPCAobG9uZykgcHRyLT5yb3dzX2luX21lbTsgaSArPSBwdHItPnJvd3NwZXJjaHVuaykgewotICAgIC8qIE9uZSBjaHVuaywgYnV0IGNoZWNrIGZvciBzaG9ydCBjaHVuayBhdCBlbmQgb2YgYnVmZmVyICovCi0gICAgcm93cyA9IE1JTigobG9uZykgcHRyLT5yb3dzcGVyY2h1bmssIChsb25nKSBwdHItPnJvd3NfaW5fbWVtIC0gaSk7Ci0gICAgLyogVHJhbnNmZXIgbm8gbW9yZSB0aGFuIGlzIGN1cnJlbnRseSBkZWZpbmVkICovCi0gICAgdGhpc3JvdyA9IChsb25nKSBwdHItPmN1cl9zdGFydF9yb3cgKyBpOwotICAgIHJvd3MgPSBNSU4ocm93cywgKGxvbmcpIHB0ci0+Zmlyc3RfdW5kZWZfcm93IC0gdGhpc3Jvdyk7Ci0gICAgLyogVHJhbnNmZXIgbm8gbW9yZSB0aGFuIGZpdHMgaW4gZmlsZSAqLwotICAgIHJvd3MgPSBNSU4ocm93cywgKGxvbmcpIHB0ci0+cm93c19pbl9hcnJheSAtIHRoaXNyb3cpOwotICAgIGlmIChyb3dzIDw9IDApCQkvKiB0aGlzIGNodW5rIG1pZ2h0IGJlIHBhc3QgZW5kIG9mIGZpbGUhICovCi0gICAgICBicmVhazsKLSAgICBieXRlX2NvdW50ID0gcm93cyAqIGJ5dGVzcGVycm93OwotICAgIGlmICh3cml0aW5nKQotICAgICAgKCpwdHItPmJfc19pbmZvLndyaXRlX2JhY2tpbmdfc3RvcmUpIChjaW5mbywgJiBwdHItPmJfc19pbmZvLAotCQkJCQkgICAgKHZvaWQgRkFSICopIHB0ci0+bWVtX2J1ZmZlcltpXSwKLQkJCQkJICAgIGZpbGVfb2Zmc2V0LCBieXRlX2NvdW50KTsKLSAgICBlbHNlCi0gICAgICAoKnB0ci0+Yl9zX2luZm8ucmVhZF9iYWNraW5nX3N0b3JlKSAoY2luZm8sICYgcHRyLT5iX3NfaW5mbywKLQkJCQkJICAgKHZvaWQgRkFSICopIHB0ci0+bWVtX2J1ZmZlcltpXSwKLQkJCQkJICAgZmlsZV9vZmZzZXQsIGJ5dGVfY291bnQpOwotICAgIGZpbGVfb2Zmc2V0ICs9IGJ5dGVfY291bnQ7Ci0gIH0KLX0KLQotCi1NRVRIT0RERUYoSlNBTVBBUlJBWSkKLWFjY2Vzc192aXJ0X3NhcnJheSAoal9jb21tb25fcHRyIGNpbmZvLCBqdmlydF9zYXJyYXlfcHRyIHB0ciwKLQkJICAgIEpESU1FTlNJT04gc3RhcnRfcm93LCBKRElNRU5TSU9OIG51bV9yb3dzLAotCQkgICAgYm9vbGVhbiB3cml0YWJsZSkKLS8qIEFjY2VzcyB0aGUgcGFydCBvZiBhIHZpcnR1YWwgc2FtcGxlIGFycmF5IHN0YXJ0aW5nIGF0IHN0YXJ0X3JvdyAqLwotLyogYW5kIGV4dGVuZGluZyBmb3IgbnVtX3Jvd3Mgcm93cy4gIHdyaXRhYmxlIGlzIHRydWUgaWYgICovCi0vKiBjYWxsZXIgaW50ZW5kcyB0byBtb2RpZnkgdGhlIGFjY2Vzc2VkIGFyZWEuICovCi17Ci0gIEpESU1FTlNJT04gZW5kX3JvdyA9IHN0YXJ0X3JvdyArIG51bV9yb3dzOwotICBKRElNRU5TSU9OIHVuZGVmX3JvdzsKLQotICAvKiBkZWJ1Z2dpbmcgY2hlY2sgKi8KLSAgaWYgKGVuZF9yb3cgPiBwdHItPnJvd3NfaW5fYXJyYXkgfHwgbnVtX3Jvd3MgPiBwdHItPm1heGFjY2VzcyB8fAotICAgICAgcHRyLT5tZW1fYnVmZmVyID09IE5VTEwpCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfVklSVFVBTF9BQ0NFU1MpOwotCi0gIC8qIE1ha2UgdGhlIGRlc2lyZWQgcGFydCBvZiB0aGUgdmlydHVhbCBhcnJheSBhY2Nlc3NpYmxlICovCi0gIGlmIChzdGFydF9yb3cgPCBwdHItPmN1cl9zdGFydF9yb3cgfHwKLSAgICAgIGVuZF9yb3cgPiBwdHItPmN1cl9zdGFydF9yb3crcHRyLT5yb3dzX2luX21lbSkgewotICAgIGlmICghIHB0ci0+Yl9zX29wZW4pCi0gICAgICBFUlJFWElUKGNpbmZvLCBKRVJSX1ZJUlRVQUxfQlVHKTsKLSAgICAvKiBGbHVzaCBvbGQgYnVmZmVyIGNvbnRlbnRzIGlmIG5lY2Vzc2FyeSAqLwotICAgIGlmIChwdHItPmRpcnR5KSB7Ci0gICAgICBkb19zYXJyYXlfaW8oY2luZm8sIHB0ciwgVFJVRSk7Ci0gICAgICBwdHItPmRpcnR5ID0gRkFMU0U7Ci0gICAgfQotICAgIC8qIERlY2lkZSB3aGF0IHBhcnQgb2YgdmlydHVhbCBhcnJheSB0byBhY2Nlc3MuCi0gICAgICogQWxnb3JpdGhtOiBpZiB0YXJnZXQgYWRkcmVzcyA+IGN1cnJlbnQgd2luZG93LCBhc3N1bWUgZm9yd2FyZCBzY2FuLAotICAgICAqIGxvYWQgc3RhcnRpbmcgYXQgdGFyZ2V0IGFkZHJlc3MuICBJZiB0YXJnZXQgYWRkcmVzcyA8IGN1cnJlbnQgd2luZG93LAotICAgICAqIGFzc3VtZSBiYWNrd2FyZCBzY2FuLCBsb2FkIHNvIHRoYXQgdGFyZ2V0IGFyZWEgaXMgdG9wIG9mIHdpbmRvdy4KLSAgICAgKiBOb3RlIHRoYXQgd2hlbiBzd2l0Y2hpbmcgZnJvbSBmb3J3YXJkIHdyaXRlIHRvIGZvcndhcmQgcmVhZCwgd2lsbCBoYXZlCi0gICAgICogc3RhcnRfcm93ID0gMCwgc28gdGhlIGxpbWl0aW5nIGNhc2UgYXBwbGllcyBhbmQgd2UgbG9hZCBmcm9tIDAgYW55d2F5LgotICAgICAqLwotICAgIGlmIChzdGFydF9yb3cgPiBwdHItPmN1cl9zdGFydF9yb3cpIHsKLSAgICAgIHB0ci0+Y3VyX3N0YXJ0X3JvdyA9IHN0YXJ0X3JvdzsKLSAgICB9IGVsc2UgewotICAgICAgLyogdXNlIGxvbmcgYXJpdGhtZXRpYyBoZXJlIHRvIGF2b2lkIG92ZXJmbG93ICYgdW5zaWduZWQgcHJvYmxlbXMgKi8KLSAgICAgIGxvbmcgbHRlbXA7Ci0KLSAgICAgIGx0ZW1wID0gKGxvbmcpIGVuZF9yb3cgLSAobG9uZykgcHRyLT5yb3dzX2luX21lbTsKLSAgICAgIGlmIChsdGVtcCA8IDApCi0JbHRlbXAgPSAwOwkJLyogZG9uJ3QgZmFsbCBvZmYgZnJvbnQgZW5kIG9mIGZpbGUgKi8KLSAgICAgIHB0ci0+Y3VyX3N0YXJ0X3JvdyA9IChKRElNRU5TSU9OKSBsdGVtcDsKLSAgICB9Ci0gICAgLyogUmVhZCBpbiB0aGUgc2VsZWN0ZWQgcGFydCBvZiB0aGUgYXJyYXkuCi0gICAgICogRHVyaW5nIHRoZSBpbml0aWFsIHdyaXRlIHBhc3MsIHdlIHdpbGwgZG8gbm8gYWN0dWFsIHJlYWQKLSAgICAgKiBiZWNhdXNlIHRoZSBzZWxlY3RlZCBwYXJ0IGlzIGFsbCB1bmRlZmluZWQuCi0gICAgICovCi0gICAgZG9fc2FycmF5X2lvKGNpbmZvLCBwdHIsIEZBTFNFKTsKLSAgfQotICAvKiBFbnN1cmUgdGhlIGFjY2Vzc2VkIHBhcnQgb2YgdGhlIGFycmF5IGlzIGRlZmluZWQ7IHByZXplcm8gaWYgbmVlZGVkLgotICAgKiBUbyBpbXByb3ZlIGxvY2FsaXR5IG9mIGFjY2Vzcywgd2Ugb25seSBwcmV6ZXJvIHRoZSBwYXJ0IG9mIHRoZSBhcnJheQotICAgKiB0aGF0IHRoZSBjYWxsZXIgaXMgYWJvdXQgdG8gYWNjZXNzLCBub3QgdGhlIGVudGlyZSBpbi1tZW1vcnkgYXJyYXkuCi0gICAqLwotICBpZiAocHRyLT5maXJzdF91bmRlZl9yb3cgPCBlbmRfcm93KSB7Ci0gICAgaWYgKHB0ci0+Zmlyc3RfdW5kZWZfcm93IDwgc3RhcnRfcm93KSB7Ci0gICAgICBpZiAod3JpdGFibGUpCQkvKiB3cml0ZXIgc2tpcHBlZCBvdmVyIGEgc2VjdGlvbiBvZiBhcnJheSAqLwotCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTKTsKLSAgICAgIHVuZGVmX3JvdyA9IHN0YXJ0X3JvdzsJLyogYnV0IHJlYWRlciBpcyBhbGxvd2VkIHRvIHJlYWQgYWhlYWQgKi8KLSAgICB9IGVsc2UgewotICAgICAgdW5kZWZfcm93ID0gcHRyLT5maXJzdF91bmRlZl9yb3c7Ci0gICAgfQotICAgIGlmICh3cml0YWJsZSkKLSAgICAgIHB0ci0+Zmlyc3RfdW5kZWZfcm93ID0gZW5kX3JvdzsKLSAgICBpZiAocHRyLT5wcmVfemVybykgewotICAgICAgc2l6ZV90IGJ5dGVzcGVycm93ID0gKHNpemVfdCkgcHRyLT5zYW1wbGVzcGVycm93ICogU0laRU9GKEpTQU1QTEUpOwotICAgICAgdW5kZWZfcm93IC09IHB0ci0+Y3VyX3N0YXJ0X3JvdzsgLyogbWFrZSBpbmRleGVzIHJlbGF0aXZlIHRvIGJ1ZmZlciAqLwotICAgICAgZW5kX3JvdyAtPSBwdHItPmN1cl9zdGFydF9yb3c7Ci0gICAgICB3aGlsZSAodW5kZWZfcm93IDwgZW5kX3JvdykgewotCWp6ZXJvX2Zhcigodm9pZCBGQVIgKikgcHRyLT5tZW1fYnVmZmVyW3VuZGVmX3Jvd10sIGJ5dGVzcGVycm93KTsKLQl1bmRlZl9yb3crKzsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKCEgd3JpdGFibGUpCQkvKiByZWFkZXIgbG9va2luZyBhdCB1bmRlZmluZWQgZGF0YSAqLwotCUVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTKTsKLSAgICB9Ci0gIH0KLSAgLyogRmxhZyB0aGUgYnVmZmVyIGRpcnR5IGlmIGNhbGxlciB3aWxsIHdyaXRlIGluIGl0ICovCi0gIGlmICh3cml0YWJsZSkKLSAgICBwdHItPmRpcnR5ID0gVFJVRTsKLSAgLyogUmV0dXJuIGFkZHJlc3Mgb2YgcHJvcGVyIHBhcnQgb2YgdGhlIGJ1ZmZlciAqLwotICByZXR1cm4gcHRyLT5tZW1fYnVmZmVyICsgKHN0YXJ0X3JvdyAtIHB0ci0+Y3VyX3N0YXJ0X3Jvdyk7Ci19Ci0KLQotTUVUSE9EREVGKEpCTE9DS0FSUkFZKQotYWNjZXNzX3ZpcnRfYmFycmF5IChqX2NvbW1vbl9wdHIgY2luZm8sIGp2aXJ0X2JhcnJheV9wdHIgcHRyLAotCQkgICAgSkRJTUVOU0lPTiBzdGFydF9yb3csIEpESU1FTlNJT04gbnVtX3Jvd3MsCi0JCSAgICBib29sZWFuIHdyaXRhYmxlKQotLyogQWNjZXNzIHRoZSBwYXJ0IG9mIGEgdmlydHVhbCBibG9jayBhcnJheSBzdGFydGluZyBhdCBzdGFydF9yb3cgKi8KLS8qIGFuZCBleHRlbmRpbmcgZm9yIG51bV9yb3dzIHJvd3MuICB3cml0YWJsZSBpcyB0cnVlIGlmICAqLwotLyogY2FsbGVyIGludGVuZHMgdG8gbW9kaWZ5IHRoZSBhY2Nlc3NlZCBhcmVhLiAqLwotewotICBKRElNRU5TSU9OIGVuZF9yb3cgPSBzdGFydF9yb3cgKyBudW1fcm93czsKLSAgSkRJTUVOU0lPTiB1bmRlZl9yb3c7Ci0KLSAgLyogZGVidWdnaW5nIGNoZWNrICovCi0gIGlmIChlbmRfcm93ID4gcHRyLT5yb3dzX2luX2FycmF5IHx8IG51bV9yb3dzID4gcHRyLT5tYXhhY2Nlc3MgfHwKLSAgICAgIHB0ci0+bWVtX2J1ZmZlciA9PSBOVUxMKQotICAgIEVSUkVYSVQoY2luZm8sIEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTKTsKLQotICAvKiBNYWtlIHRoZSBkZXNpcmVkIHBhcnQgb2YgdGhlIHZpcnR1YWwgYXJyYXkgYWNjZXNzaWJsZSAqLwotICBpZiAoc3RhcnRfcm93IDwgcHRyLT5jdXJfc3RhcnRfcm93IHx8Ci0gICAgICBlbmRfcm93ID4gcHRyLT5jdXJfc3RhcnRfcm93K3B0ci0+cm93c19pbl9tZW0pIHsKLSAgICBpZiAoISBwdHItPmJfc19vcGVuKQotICAgICAgRVJSRVhJVChjaW5mbywgSkVSUl9WSVJUVUFMX0JVRyk7Ci0gICAgLyogRmx1c2ggb2xkIGJ1ZmZlciBjb250ZW50cyBpZiBuZWNlc3NhcnkgKi8KLSAgICBpZiAocHRyLT5kaXJ0eSkgewotICAgICAgZG9fYmFycmF5X2lvKGNpbmZvLCBwdHIsIFRSVUUpOwotICAgICAgcHRyLT5kaXJ0eSA9IEZBTFNFOwotICAgIH0KLSAgICAvKiBEZWNpZGUgd2hhdCBwYXJ0IG9mIHZpcnR1YWwgYXJyYXkgdG8gYWNjZXNzLgotICAgICAqIEFsZ29yaXRobTogaWYgdGFyZ2V0IGFkZHJlc3MgPiBjdXJyZW50IHdpbmRvdywgYXNzdW1lIGZvcndhcmQgc2NhbiwKLSAgICAgKiBsb2FkIHN0YXJ0aW5nIGF0IHRhcmdldCBhZGRyZXNzLiAgSWYgdGFyZ2V0IGFkZHJlc3MgPCBjdXJyZW50IHdpbmRvdywKLSAgICAgKiBhc3N1bWUgYmFja3dhcmQgc2NhbiwgbG9hZCBzbyB0aGF0IHRhcmdldCBhcmVhIGlzIHRvcCBvZiB3aW5kb3cuCi0gICAgICogTm90ZSB0aGF0IHdoZW4gc3dpdGNoaW5nIGZyb20gZm9yd2FyZCB3cml0ZSB0byBmb3J3YXJkIHJlYWQsIHdpbGwgaGF2ZQotICAgICAqIHN0YXJ0X3JvdyA9IDAsIHNvIHRoZSBsaW1pdGluZyBjYXNlIGFwcGxpZXMgYW5kIHdlIGxvYWQgZnJvbSAwIGFueXdheS4KLSAgICAgKi8KLSAgICBpZiAoc3RhcnRfcm93ID4gcHRyLT5jdXJfc3RhcnRfcm93KSB7Ci0gICAgICBwdHItPmN1cl9zdGFydF9yb3cgPSBzdGFydF9yb3c7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIHVzZSBsb25nIGFyaXRobWV0aWMgaGVyZSB0byBhdm9pZCBvdmVyZmxvdyAmIHVuc2lnbmVkIHByb2JsZW1zICovCi0gICAgICBsb25nIGx0ZW1wOwotCi0gICAgICBsdGVtcCA9IChsb25nKSBlbmRfcm93IC0gKGxvbmcpIHB0ci0+cm93c19pbl9tZW07Ci0gICAgICBpZiAobHRlbXAgPCAwKQotCWx0ZW1wID0gMDsJCS8qIGRvbid0IGZhbGwgb2ZmIGZyb250IGVuZCBvZiBmaWxlICovCi0gICAgICBwdHItPmN1cl9zdGFydF9yb3cgPSAoSkRJTUVOU0lPTikgbHRlbXA7Ci0gICAgfQotICAgIC8qIFJlYWQgaW4gdGhlIHNlbGVjdGVkIHBhcnQgb2YgdGhlIGFycmF5LgotICAgICAqIER1cmluZyB0aGUgaW5pdGlhbCB3cml0ZSBwYXNzLCB3ZSB3aWxsIGRvIG5vIGFjdHVhbCByZWFkCi0gICAgICogYmVjYXVzZSB0aGUgc2VsZWN0ZWQgcGFydCBpcyBhbGwgdW5kZWZpbmVkLgotICAgICAqLwotICAgIGRvX2JhcnJheV9pbyhjaW5mbywgcHRyLCBGQUxTRSk7Ci0gIH0KLSAgLyogRW5zdXJlIHRoZSBhY2Nlc3NlZCBwYXJ0IG9mIHRoZSBhcnJheSBpcyBkZWZpbmVkOyBwcmV6ZXJvIGlmIG5lZWRlZC4KLSAgICogVG8gaW1wcm92ZSBsb2NhbGl0eSBvZiBhY2Nlc3MsIHdlIG9ubHkgcHJlemVybyB0aGUgcGFydCBvZiB0aGUgYXJyYXkKLSAgICogdGhhdCB0aGUgY2FsbGVyIGlzIGFib3V0IHRvIGFjY2Vzcywgbm90IHRoZSBlbnRpcmUgaW4tbWVtb3J5IGFycmF5LgotICAgKi8KLSAgaWYgKHB0ci0+Zmlyc3RfdW5kZWZfcm93IDwgZW5kX3JvdykgewotICAgIGlmIChwdHItPmZpcnN0X3VuZGVmX3JvdyA8IHN0YXJ0X3JvdykgewotICAgICAgaWYgKHdyaXRhYmxlKQkJLyogd3JpdGVyIHNraXBwZWQgb3ZlciBhIHNlY3Rpb24gb2YgYXJyYXkgKi8KLQlFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9WSVJUVUFMX0FDQ0VTUyk7Ci0gICAgICB1bmRlZl9yb3cgPSBzdGFydF9yb3c7CS8qIGJ1dCByZWFkZXIgaXMgYWxsb3dlZCB0byByZWFkIGFoZWFkICovCi0gICAgfSBlbHNlIHsKLSAgICAgIHVuZGVmX3JvdyA9IHB0ci0+Zmlyc3RfdW5kZWZfcm93OwotICAgIH0KLSAgICBpZiAod3JpdGFibGUpCi0gICAgICBwdHItPmZpcnN0X3VuZGVmX3JvdyA9IGVuZF9yb3c7Ci0gICAgaWYgKHB0ci0+cHJlX3plcm8pIHsKLSAgICAgIHNpemVfdCBieXRlc3BlcnJvdyA9IChzaXplX3QpIHB0ci0+YmxvY2tzcGVycm93ICogU0laRU9GKEpCTE9DSyk7Ci0gICAgICB1bmRlZl9yb3cgLT0gcHRyLT5jdXJfc3RhcnRfcm93OyAvKiBtYWtlIGluZGV4ZXMgcmVsYXRpdmUgdG8gYnVmZmVyICovCi0gICAgICBlbmRfcm93IC09IHB0ci0+Y3VyX3N0YXJ0X3JvdzsKLSAgICAgIHdoaWxlICh1bmRlZl9yb3cgPCBlbmRfcm93KSB7Ci0Janplcm9fZmFyKCh2b2lkIEZBUiAqKSBwdHItPm1lbV9idWZmZXJbdW5kZWZfcm93XSwgYnl0ZXNwZXJyb3cpOwotCXVuZGVmX3JvdysrOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoISB3cml0YWJsZSkJCS8qIHJlYWRlciBsb29raW5nIGF0IHVuZGVmaW5lZCBkYXRhICovCi0JRVJSRVhJVChjaW5mbywgSkVSUl9CQURfVklSVFVBTF9BQ0NFU1MpOwotICAgIH0KLSAgfQotICAvKiBGbGFnIHRoZSBidWZmZXIgZGlydHkgaWYgY2FsbGVyIHdpbGwgd3JpdGUgaW4gaXQgKi8KLSAgaWYgKHdyaXRhYmxlKQotICAgIHB0ci0+ZGlydHkgPSBUUlVFOwotICAvKiBSZXR1cm4gYWRkcmVzcyBvZiBwcm9wZXIgcGFydCBvZiB0aGUgYnVmZmVyICovCi0gIHJldHVybiBwdHItPm1lbV9idWZmZXIgKyAoc3RhcnRfcm93IC0gcHRyLT5jdXJfc3RhcnRfcm93KTsKLX0KLQotCi0vKgotICogUmVsZWFzZSBhbGwgb2JqZWN0cyBiZWxvbmdpbmcgdG8gYSBzcGVjaWZpZWQgcG9vbC4KLSAqLwotCi1NRVRIT0RERUYodm9pZCkKLWZyZWVfcG9vbCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCkKLXsKLSAgbXlfbWVtX3B0ciBtZW0gPSAobXlfbWVtX3B0cikgY2luZm8tPm1lbTsKLSAgc21hbGxfcG9vbF9wdHIgc2hkcl9wdHI7Ci0gIGxhcmdlX3Bvb2xfcHRyIGxoZHJfcHRyOwotICBzaXplX3Qgc3BhY2VfZnJlZWQ7Ci0KLSAgaWYgKHBvb2xfaWQgPCAwIHx8IHBvb2xfaWQgPj0gSlBPT0xfTlVNUE9PTFMpCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfQkFEX1BPT0xfSUQsIHBvb2xfaWQpOwkvKiBzYWZldHkgY2hlY2sgKi8KLQotI2lmZGVmIE1FTV9TVEFUUwotICBpZiAoY2luZm8tPmVyci0+dHJhY2VfbGV2ZWwgPiAxKQotICAgIHByaW50X21lbV9zdGF0cyhjaW5mbywgcG9vbF9pZCk7IC8qIHByaW50IHBvb2wncyBtZW1vcnkgdXNhZ2Ugc3RhdGlzdGljcyAqLwotI2VuZGlmCi0KLSAgLyogSWYgZnJlZWluZyBJTUFHRSBwb29sLCBjbG9zZSBhbnkgdmlydHVhbCBhcnJheXMgZmlyc3QgKi8KLSAgaWYgKHBvb2xfaWQgPT0gSlBPT0xfSU1BR0UpIHsKLSAgICBqdmlydF9zYXJyYXlfcHRyIHNwdHI7Ci0gICAganZpcnRfYmFycmF5X3B0ciBicHRyOwotCi0gICAgZm9yIChzcHRyID0gbWVtLT52aXJ0X3NhcnJheV9saXN0OyBzcHRyICE9IE5VTEw7IHNwdHIgPSBzcHRyLT5uZXh0KSB7Ci0gICAgICBpZiAoc3B0ci0+Yl9zX29wZW4pIHsJLyogdGhlcmUgbWF5IGJlIG5vIGJhY2tpbmcgc3RvcmUgKi8KLQlzcHRyLT5iX3Nfb3BlbiA9IEZBTFNFOwkvKiBwcmV2ZW50IHJlY3Vyc2l2ZSBjbG9zZSBpZiBlcnJvciAqLwotCSgqc3B0ci0+Yl9zX2luZm8uY2xvc2VfYmFja2luZ19zdG9yZSkgKGNpbmZvLCAmIHNwdHItPmJfc19pbmZvKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgbWVtLT52aXJ0X3NhcnJheV9saXN0ID0gTlVMTDsKLSAgICBmb3IgKGJwdHIgPSBtZW0tPnZpcnRfYmFycmF5X2xpc3Q7IGJwdHIgIT0gTlVMTDsgYnB0ciA9IGJwdHItPm5leHQpIHsKLSAgICAgIGlmIChicHRyLT5iX3Nfb3BlbikgewkvKiB0aGVyZSBtYXkgYmUgbm8gYmFja2luZyBzdG9yZSAqLwotCWJwdHItPmJfc19vcGVuID0gRkFMU0U7CS8qIHByZXZlbnQgcmVjdXJzaXZlIGNsb3NlIGlmIGVycm9yICovCi0JKCpicHRyLT5iX3NfaW5mby5jbG9zZV9iYWNraW5nX3N0b3JlKSAoY2luZm8sICYgYnB0ci0+Yl9zX2luZm8pOwotICAgICAgfQotICAgIH0KLSAgICBtZW0tPnZpcnRfYmFycmF5X2xpc3QgPSBOVUxMOwotICB9Ci0KLSAgLyogUmVsZWFzZSBsYXJnZSBvYmplY3RzICovCi0gIGxoZHJfcHRyID0gbWVtLT5sYXJnZV9saXN0W3Bvb2xfaWRdOwotICBtZW0tPmxhcmdlX2xpc3RbcG9vbF9pZF0gPSBOVUxMOwotCi0gIHdoaWxlIChsaGRyX3B0ciAhPSBOVUxMKSB7Ci0gICAgbGFyZ2VfcG9vbF9wdHIgbmV4dF9saGRyX3B0ciA9IGxoZHJfcHRyLT5oZHIubmV4dDsKLSAgICBzcGFjZV9mcmVlZCA9IGxoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCArCi0JCSAgbGhkcl9wdHItPmhkci5ieXRlc19sZWZ0ICsKLQkJICBTSVpFT0YobGFyZ2VfcG9vbF9oZHIpOwotICAgIGpwZWdfZnJlZV9sYXJnZShjaW5mbywgKHZvaWQgRkFSICopIGxoZHJfcHRyLCBzcGFjZV9mcmVlZCk7Ci0gICAgbWVtLT50b3RhbF9zcGFjZV9hbGxvY2F0ZWQgLT0gc3BhY2VfZnJlZWQ7Ci0gICAgbGhkcl9wdHIgPSBuZXh0X2xoZHJfcHRyOwotICB9Ci0KLSAgLyogUmVsZWFzZSBzbWFsbCBvYmplY3RzICovCi0gIHNoZHJfcHRyID0gbWVtLT5zbWFsbF9saXN0W3Bvb2xfaWRdOwotICBtZW0tPnNtYWxsX2xpc3RbcG9vbF9pZF0gPSBOVUxMOwotCi0gIHdoaWxlIChzaGRyX3B0ciAhPSBOVUxMKSB7Ci0gICAgc21hbGxfcG9vbF9wdHIgbmV4dF9zaGRyX3B0ciA9IHNoZHJfcHRyLT5oZHIubmV4dDsKLSAgICBzcGFjZV9mcmVlZCA9IHNoZHJfcHRyLT5oZHIuYnl0ZXNfdXNlZCArCi0JCSAgc2hkcl9wdHItPmhkci5ieXRlc19sZWZ0ICsKLQkJICBTSVpFT0Yoc21hbGxfcG9vbF9oZHIpOwotICAgIGpwZWdfZnJlZV9zbWFsbChjaW5mbywgKHZvaWQgKikgc2hkcl9wdHIsIHNwYWNlX2ZyZWVkKTsKLSAgICBtZW0tPnRvdGFsX3NwYWNlX2FsbG9jYXRlZCAtPSBzcGFjZV9mcmVlZDsKLSAgICBzaGRyX3B0ciA9IG5leHRfc2hkcl9wdHI7Ci0gIH0KLX0KLQotCi0vKgotICogQ2xvc2UgdXAgc2hvcCBlbnRpcmVseS4KLSAqIE5vdGUgdGhhdCB0aGlzIGNhbm5vdCBiZSBjYWxsZWQgdW5sZXNzIGNpbmZvLT5tZW0gaXMgbm9uLU5VTEwuCi0gKi8KLQotTUVUSE9EREVGKHZvaWQpCi1zZWxmX2Rlc3RydWN0IChqX2NvbW1vbl9wdHIgY2luZm8pCi17Ci0gIGludCBwb29sOwotCi0gIC8qIENsb3NlIGFsbCBiYWNraW5nIHN0b3JlLCByZWxlYXNlIGFsbCBtZW1vcnkuCi0gICAqIFJlbGVhc2luZyBwb29scyBpbiByZXZlcnNlIG9yZGVyIG1pZ2h0IGhlbHAgYXZvaWQgZnJhZ21lbnRhdGlvbgotICAgKiB3aXRoIHNvbWUgKGJyYWluLWRhbWFnZWQpIG1hbGxvYyBsaWJyYXJpZXMuCi0gICAqLwotICBmb3IgKHBvb2wgPSBKUE9PTF9OVU1QT09MUy0xOyBwb29sID49IEpQT09MX1BFUk1BTkVOVDsgcG9vbC0tKSB7Ci0gICAgZnJlZV9wb29sKGNpbmZvLCBwb29sKTsKLSAgfQotCi0gIC8qIFJlbGVhc2UgdGhlIG1lbW9yeSBtYW5hZ2VyIGNvbnRyb2wgYmxvY2sgdG9vLiAqLwotICBqcGVnX2ZyZWVfc21hbGwoY2luZm8sICh2b2lkICopIGNpbmZvLT5tZW0sIFNJWkVPRihteV9tZW1vcnlfbWdyKSk7Ci0gIGNpbmZvLT5tZW0gPSBOVUxMOwkJLyogZW5zdXJlcyBJIHdpbGwgYmUgY2FsbGVkIG9ubHkgb25jZSAqLwotCi0gIGpwZWdfbWVtX3Rlcm0oY2luZm8pOwkJLyogc3lzdGVtLWRlcGVuZGVudCBjbGVhbnVwICovCi19Ci0KLQotLyoKLSAqIE1lbW9yeSBtYW5hZ2VyIGluaXRpYWxpemF0aW9uLgotICogV2hlbiB0aGlzIGlzIGNhbGxlZCwgb25seSB0aGUgZXJyb3IgbWFuYWdlciBwb2ludGVyIGlzIHZhbGlkIGluIGNpbmZvIQotICovCi0KLUdMT0JBTCh2b2lkKQotamluaXRfbWVtb3J5X21nciAoal9jb21tb25fcHRyIGNpbmZvKQotewotICBteV9tZW1fcHRyIG1lbTsKLSAgbG9uZyBtYXhfdG9fdXNlOwotICBpbnQgcG9vbDsKLSAgc2l6ZV90IHRlc3RfbWFjOwotCi0gIGNpbmZvLT5tZW0gPSBOVUxMOwkJLyogZm9yIHNhZmV0eSBpZiBpbml0IGZhaWxzICovCi0KLSAgLyogQ2hlY2sgZm9yIGNvbmZpZ3VyYXRpb24gZXJyb3JzLgotICAgKiBTSVpFT0YoQUxJR05fVFlQRSkgc2hvdWxkIGJlIGEgcG93ZXIgb2YgMjsgb3RoZXJ3aXNlLCBpdCBwcm9iYWJseQotICAgKiBkb2Vzbid0IHJlZmxlY3QgYW55IHJlYWwgaGFyZHdhcmUgYWxpZ25tZW50IHJlcXVpcmVtZW50LgotICAgKiBUaGUgdGVzdCBpcyBhIGxpdHRsZSB0cmlja3k6IGZvciBYPjAsIFggYW5kIFgtMSBoYXZlIG5vIG9uZS1iaXRzCi0gICAqIGluIGNvbW1vbiBpZiBhbmQgb25seSBpZiBYIGlzIGEgcG93ZXIgb2YgMiwgaWUgaGFzIG9ubHkgb25lIG9uZS1iaXQuCi0gICAqIFNvbWUgY29tcGlsZXJzIG1heSBnaXZlIGFuICJ1bnJlYWNoYWJsZSBjb2RlIiB3YXJuaW5nIGhlcmU7IGlnbm9yZSBpdC4KLSAgICovCi0gIGlmICgoU0laRU9GKEFMSUdOX1RZUEUpICYgKFNJWkVPRihBTElHTl9UWVBFKS0xKSkgIT0gMCkKLSAgICBFUlJFWElUKGNpbmZvLCBKRVJSX0JBRF9BTElHTl9UWVBFKTsKLSAgLyogTUFYX0FMTE9DX0NIVU5LIG11c3QgYmUgcmVwcmVzZW50YWJsZSBhcyB0eXBlIHNpemVfdCwgYW5kIG11c3QgYmUKLSAgICogYSBtdWx0aXBsZSBvZiBTSVpFT0YoQUxJR05fVFlQRSkuCi0gICAqIEFnYWluLCBhbiAidW5yZWFjaGFibGUgY29kZSIgd2FybmluZyBtYXkgYmUgaWdub3JlZCBoZXJlLgotICAgKiBCdXQgYSAiY29uc3RhbnQgdG9vIGxhcmdlIiB3YXJuaW5nIG1lYW5zIHlvdSBuZWVkIHRvIGZpeCBNQVhfQUxMT0NfQ0hVTksuCi0gICAqLwotICB0ZXN0X21hYyA9IChzaXplX3QpIE1BWF9BTExPQ19DSFVOSzsKLSAgaWYgKChsb25nKSB0ZXN0X21hYyAhPSBNQVhfQUxMT0NfQ0hVTksgfHwKLSAgICAgIChNQVhfQUxMT0NfQ0hVTksgJSBTSVpFT0YoQUxJR05fVFlQRSkpICE9IDApCi0gICAgRVJSRVhJVChjaW5mbywgSkVSUl9CQURfQUxMT0NfQ0hVTkspOwotCi0gIG1heF90b191c2UgPSBqcGVnX21lbV9pbml0KGNpbmZvKTsgLyogc3lzdGVtLWRlcGVuZGVudCBpbml0aWFsaXphdGlvbiAqLwotCi0gIC8qIEF0dGVtcHQgdG8gYWxsb2NhdGUgbWVtb3J5IG1hbmFnZXIncyBjb250cm9sIGJsb2NrICovCi0gIG1lbSA9IChteV9tZW1fcHRyKSBqcGVnX2dldF9zbWFsbChjaW5mbywgU0laRU9GKG15X21lbW9yeV9tZ3IpKTsKLQotICBpZiAobWVtID09IE5VTEwpIHsKLSAgICBqcGVnX21lbV90ZXJtKGNpbmZvKTsJLyogc3lzdGVtLWRlcGVuZGVudCBjbGVhbnVwICovCi0gICAgRVJSRVhJVDEoY2luZm8sIEpFUlJfT1VUX09GX01FTU9SWSwgMCk7Ci0gIH0KLQotICAvKiBPSywgZmlsbCBpbiB0aGUgbWV0aG9kIHBvaW50ZXJzICovCi0gIG1lbS0+cHViLmFsbG9jX3NtYWxsID0gYWxsb2Nfc21hbGw7Ci0gIG1lbS0+cHViLmFsbG9jX2xhcmdlID0gYWxsb2NfbGFyZ2U7Ci0gIG1lbS0+cHViLmFsbG9jX3NhcnJheSA9IGFsbG9jX3NhcnJheTsKLSAgbWVtLT5wdWIuYWxsb2NfYmFycmF5ID0gYWxsb2NfYmFycmF5OwotICBtZW0tPnB1Yi5yZXF1ZXN0X3ZpcnRfc2FycmF5ID0gcmVxdWVzdF92aXJ0X3NhcnJheTsKLSAgbWVtLT5wdWIucmVxdWVzdF92aXJ0X2JhcnJheSA9IHJlcXVlc3RfdmlydF9iYXJyYXk7Ci0gIG1lbS0+cHViLnJlYWxpemVfdmlydF9hcnJheXMgPSByZWFsaXplX3ZpcnRfYXJyYXlzOwotICBtZW0tPnB1Yi5hY2Nlc3NfdmlydF9zYXJyYXkgPSBhY2Nlc3NfdmlydF9zYXJyYXk7Ci0gIG1lbS0+cHViLmFjY2Vzc192aXJ0X2JhcnJheSA9IGFjY2Vzc192aXJ0X2JhcnJheTsKLSAgbWVtLT5wdWIuZnJlZV9wb29sID0gZnJlZV9wb29sOwotICBtZW0tPnB1Yi5zZWxmX2Rlc3RydWN0ID0gc2VsZl9kZXN0cnVjdDsKLQotICAvKiBNYWtlIE1BWF9BTExPQ19DSFVOSyBhY2Nlc3NpYmxlIHRvIG90aGVyIG1vZHVsZXMgKi8KLSAgbWVtLT5wdWIubWF4X2FsbG9jX2NodW5rID0gTUFYX0FMTE9DX0NIVU5LOwotCi0gIC8qIEluaXRpYWxpemUgd29ya2luZyBzdGF0ZSAqLwotICBtZW0tPnB1Yi5tYXhfbWVtb3J5X3RvX3VzZSA9IG1heF90b191c2U7Ci0KLSAgZm9yIChwb29sID0gSlBPT0xfTlVNUE9PTFMtMTsgcG9vbCA+PSBKUE9PTF9QRVJNQU5FTlQ7IHBvb2wtLSkgewotICAgIG1lbS0+c21hbGxfbGlzdFtwb29sXSA9IE5VTEw7Ci0gICAgbWVtLT5sYXJnZV9saXN0W3Bvb2xdID0gTlVMTDsKLSAgfQotICBtZW0tPnZpcnRfc2FycmF5X2xpc3QgPSBOVUxMOwotICBtZW0tPnZpcnRfYmFycmF5X2xpc3QgPSBOVUxMOwotCi0gIG1lbS0+dG90YWxfc3BhY2VfYWxsb2NhdGVkID0gU0laRU9GKG15X21lbW9yeV9tZ3IpOwotCi0gIC8qIERlY2xhcmUgb3Vyc2VsdmVzIG9wZW4gZm9yIGJ1c2luZXNzICovCi0gIGNpbmZvLT5tZW0gPSAmIG1lbS0+cHViOwotCi0gIC8qIENoZWNrIGZvciBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBKUEVHTUVNOyBpZiBmb3VuZCwgb3ZlcnJpZGUgdGhlCi0gICAqIGRlZmF1bHQgbWF4X21lbW9yeSBzZXR0aW5nIGZyb20ganBlZ19tZW1faW5pdC4gIE5vdGUgdGhhdCB0aGUKLSAgICogc3Vycm91bmRpbmcgYXBwbGljYXRpb24gbWF5IGFnYWluIG92ZXJyaWRlIHRoaXMgdmFsdWUuCi0gICAqIElmIHlvdXIgc3lzdGVtIGRvZXNuJ3Qgc3VwcG9ydCBnZXRlbnYoKSwgZGVmaW5lIE5PX0dFVEVOViB0byBkaXNhYmxlCi0gICAqIHRoaXMgZmVhdHVyZS4KLSAgICovCi0jaWZuZGVmIE5PX0dFVEVOVgotICB7IGNoYXIgKiBtZW1lbnY7Ci0KLSAgICBpZiAoKG1lbWVudiA9IGdldGVudigiSlBFR01FTSIpKSAhPSBOVUxMKSB7Ci0gICAgICBjaGFyIGNoID0gJ3gnOwotCi0gICAgICBpZiAoc3NjYW5mKG1lbWVudiwgIiVsZCVjIiwgJm1heF90b191c2UsICZjaCkgPiAwKSB7Ci0JaWYgKGNoID09ICdtJyB8fCBjaCA9PSAnTScpCi0JICBtYXhfdG9fdXNlICo9IDEwMDBMOwotCW1lbS0+cHViLm1heF9tZW1vcnlfdG9fdXNlID0gbWF4X3RvX3VzZSAqIDEwMDBMOwotICAgICAgfQotICAgIH0KLSAgfQotI2VuZGlmCi0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvZnBkZmFwaV9qbWVtbm9icy5jIGIvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2ptZW1ub2JzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNDRmNmYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2ptZW1ub2JzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoKLSAqIGptZW1ub2JzLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5NiwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBwcm92aWRlcyBhIHJlYWxseSBzaW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN5c3RlbS0KLSAqIGRlcGVuZGVudCBwb3J0aW9uIG9mIHRoZSBKUEVHIG1lbW9yeSBtYW5hZ2VyLiAgVGhpcyBpbXBsZW1lbnRhdGlvbgotICogYXNzdW1lcyB0aGF0IG5vIGJhY2tpbmctc3RvcmUgZmlsZXMgYXJlIG5lZWRlZDogYWxsIHJlcXVpcmVkIHNwYWNlCi0gKiBjYW4gYmUgb2J0YWluZWQgZnJvbSBtYWxsb2MoKS4KLSAqIFRoaXMgaXMgdmVyeSBwb3J0YWJsZSBpbiB0aGUgc2Vuc2UgdGhhdCBpdCdsbCBjb21waWxlIG9uIGFsbW9zdCBhbnl0aGluZywKLSAqIGJ1dCB5b3UnZCBiZXR0ZXIgaGF2ZSBsb3RzIG9mIG1haW4gbWVtb3J5IChvciB2aXJ0dWFsIG1lbW9yeSkgaWYgeW91IHdhbnQKLSAqIHRvIHByb2Nlc3MgYmlnIGltYWdlcy4KLSAqIE5vdGUgdGhhdCB0aGUgbWF4X21lbW9yeV90b191c2Ugb3B0aW9uIGlzIGlnbm9yZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbi4KLSAqLwotCi0jZGVmaW5lIEpQRUdfSU5URVJOQUxTCi0jaW5jbHVkZSAiamluY2x1ZGUuaCIKLSNpbmNsdWRlICJqcGVnbGliLmgiCi0jaW5jbHVkZSAiam1lbXN5cy5oIgkJLyogaW1wb3J0IHRoZSBzeXN0ZW0tZGVwZW5kZW50IGRlY2xhcmF0aW9ucyAqLwotCi0jaWZuZGVmIEhBVkVfU1RETElCX0gJCS8qIDxzdGRsaWIuaD4gc2hvdWxkIGRlY2xhcmUgbWFsbG9jKCksZnJlZSgpICovCi1leHRlcm4gdm9pZCAqIG1hbGxvYyBKUFAoKHNpemVfdCBzaXplKSk7Ci1leHRlcm4gdm9pZCBmcmVlIEpQUCgodm9pZCAqcHRyKSk7Ci0jZW5kaWYKLQotdm9pZCoJRlhNRU1fRGVmYXVsdEFsbG9jKGludCBieXRlX3NpemUsIGludCk7Ci12b2lkCUZYTUVNX0RlZmF1bHRGcmVlKHZvaWQqIHBvaW50ZXIsIGludCk7Ci0KLS8qCi0gKiBNZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZWluZyBhcmUgY29udHJvbGxlZCBieSB0aGUgcmVndWxhciBsaWJyYXJ5Ci0gKiByb3V0aW5lcyBtYWxsb2MoKSBhbmQgZnJlZSgpLgotICovCi0KLUdMT0JBTCh2b2lkICopCi1qcGVnX2dldF9zbWFsbCAoal9jb21tb25fcHRyIGNpbmZvLCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotLy8gIHJldHVybiAodm9pZCAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKLQlyZXR1cm4gRlhNRU1fRGVmYXVsdEFsbG9jKHNpemVvZm9iamVjdCwgMCk7Ci19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19mcmVlX3NtYWxsIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgKiBvYmplY3QsIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0vLyAgZnJlZShvYmplY3QpOwotCUZYTUVNX0RlZmF1bHRGcmVlKG9iamVjdCwgMCk7Ci19Ci0KLQotLyoKLSAqICJMYXJnZSIgb2JqZWN0cyBhcmUgdHJlYXRlZCB0aGUgc2FtZSBhcyAic21hbGwiIG9uZXMuCi0gKiBOQjogYWx0aG91Z2ggd2UgaW5jbHVkZSBGQVIga2V5d29yZHMgaW4gdGhlIHJvdXRpbmUgZGVjbGFyYXRpb25zLAotICogdGhpcyBmaWxlIHdvbid0IGFjdHVhbGx5IHdvcmsgaW4gODB4ODYgc21hbGwvbWVkaXVtIG1vZGVsOyBhdCBsZWFzdCwKLSAqIHlvdSBwcm9iYWJseSB3b24ndCBiZSBhYmxlIHRvIHByb2Nlc3MgdXNlZnVsLXNpemUgaW1hZ2VzIGluIG9ubHkgNjRLQi4KLSAqLwotCi1HTE9CQUwodm9pZCBGQVIgKikKLWpwZWdfZ2V0X2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpCi17Ci0vLyAgcmV0dXJuICh2b2lkIEZBUiAqKSBtYWxsb2Moc2l6ZW9mb2JqZWN0KTsKLQlyZXR1cm4gRlhNRU1fRGVmYXVsdEFsbG9jKHNpemVvZm9iamVjdCwgMCk7Ci19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19mcmVlX2xhcmdlIChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgRkFSICogb2JqZWN0LCBzaXplX3Qgc2l6ZW9mb2JqZWN0KQotewotLy8gIGZyZWUob2JqZWN0KTsKLQlGWE1FTV9EZWZhdWx0RnJlZShvYmplY3QsIDApOwotfQotCi0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIHRvdGFsIG1lbW9yeSBzcGFjZSBhdmFpbGFibGUgZm9yIGFsbG9jYXRpb24uCi0gKiBIZXJlIHdlIGFsd2F5cyBzYXksICJ3ZSBnb3QgYWxsIHlvdSB3YW50IGJ1ZCEiCi0gKi8KLQotR0xPQkFMKGxvbmcpCi1qcGVnX21lbV9hdmFpbGFibGUgKGpfY29tbW9uX3B0ciBjaW5mbywgbG9uZyBtaW5fYnl0ZXNfbmVlZGVkLAotCQkgICAgbG9uZyBtYXhfYnl0ZXNfbmVlZGVkLCBsb25nIGFscmVhZHlfYWxsb2NhdGVkKQotewotICByZXR1cm4gbWF4X2J5dGVzX25lZWRlZDsKLX0KLQotCi0vKgotICogQmFja2luZyBzdG9yZSAodGVtcG9yYXJ5IGZpbGUpIG1hbmFnZW1lbnQuCi0gKiBTaW5jZSBqcGVnX21lbV9hdmFpbGFibGUgYWx3YXlzIHByb21pc2VkIHRoZSBtb29uLAotICogdGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGFuZCB3ZSBjYW4ganVzdCBlcnJvciBvdXQuCi0gKi8KLQotR0xPQkFMKHZvaWQpCi1qcGVnX29wZW5fYmFja2luZ19zdG9yZSAoal9jb21tb25fcHRyIGNpbmZvLCBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkJIGxvbmcgdG90YWxfYnl0ZXNfbmVlZGVkKQotewotICBFUlJFWElUKGNpbmZvLCBKRVJSX05PX0JBQ0tJTkdfU1RPUkUpOwotfQotCi0KLS8qCi0gKiBUaGVzZSByb3V0aW5lcyB0YWtlIGNhcmUgb2YgYW55IHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gYW5kCi0gKiBjbGVhbnVwIHJlcXVpcmVkLiAgSGVyZSwgdGhlcmUgaXNuJ3QgYW55LgotICovCi0KLUdMT0JBTChsb25nKQotanBlZ19tZW1faW5pdCAoal9jb21tb25fcHRyIGNpbmZvKQotewotICByZXR1cm4gMDsJCQkvKiBqdXN0IHNldCBtYXhfbWVtb3J5X3RvX3VzZSB0byAwICovCi19Ci0KLUdMT0JBTCh2b2lkKQotanBlZ19tZW1fdGVybSAoal9jb21tb25fcHRyIGNpbmZvKQotewotICAvKiBubyB3b3JrICovCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfanV0aWxzLmMgYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ZwZGZhcGlfanV0aWxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOGE5NTUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9mcGRmYXBpX2p1dGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qCi0gKiBqdXRpbHMuYwotICoKLSAqIENvcHlyaWdodCAoQykgMTk5MS0xOTk2LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRhYmxlcyBhbmQgbWlzY2VsbGFuZW91cyB1dGlsaXR5IHJvdXRpbmVzIG5lZWRlZAotICogZm9yIGJvdGggY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24uCi0gKiBOb3RlIHdlIHByZWZpeCBhbGwgZ2xvYmFsIG5hbWVzIHdpdGggImoiIHRvIG1pbmltaXplIGNvbmZsaWN0cyB3aXRoCi0gKiBhIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uLgotICovCi0KLSNkZWZpbmUgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqaW5jbHVkZS5oIgotI2luY2x1ZGUgImpwZWdsaWIuaCIKLQotCi0vKgotICoganBlZ196aWd6YWdfb3JkZXJbaV0gaXMgdGhlIHppZ3phZy1vcmRlciBwb3NpdGlvbiBvZiB0aGUgaSd0aCBlbGVtZW50Ci0gKiBvZiBhIERDVCBibG9jayByZWFkIGluIG5hdHVyYWwgb3JkZXIgKGxlZnQgdG8gcmlnaHQsIHRvcCB0byBib3R0b20pLgotICovCi0KLSNpZiAwCQkJCS8qIFRoaXMgdGFibGUgaXMgbm90IGFjdHVhbGx5IG5lZWRlZCBpbiB2NmEgKi8KLQotY29uc3QgaW50IGpwZWdfemlnemFnX29yZGVyW0RDVFNJWkUyXSA9IHsKLSAgIDAsICAxLCAgNSwgIDYsIDE0LCAxNSwgMjcsIDI4LAotICAgMiwgIDQsICA3LCAxMywgMTYsIDI2LCAyOSwgNDIsCi0gICAzLCAgOCwgMTIsIDE3LCAyNSwgMzAsIDQxLCA0MywKLSAgIDksIDExLCAxOCwgMjQsIDMxLCA0MCwgNDQsIDUzLAotICAxMCwgMTksIDIzLCAzMiwgMzksIDQ1LCA1MiwgNTQsCi0gIDIwLCAyMiwgMzMsIDM4LCA0NiwgNTEsIDU1LCA2MCwKLSAgMjEsIDM0LCAzNywgNDcsIDUwLCA1NiwgNTksIDYxLAotICAzNSwgMzYsIDQ4LCA0OSwgNTcsIDU4LCA2MiwgNjMKLX07Ci0KLSNlbmRpZgotCi0vKgotICoganBlZ19uYXR1cmFsX29yZGVyW2ldIGlzIHRoZSBuYXR1cmFsLW9yZGVyIHBvc2l0aW9uIG9mIHRoZSBpJ3RoIGVsZW1lbnQKLSAqIG9mIHppZ3phZyBvcmRlci4KLSAqCi0gKiBXaGVuIHJlYWRpbmcgY29ycnVwdGVkIGRhdGEsIHRoZSBIdWZmbWFuIGRlY29kZXJzIGNvdWxkIGF0dGVtcHQKLSAqIHRvIHJlZmVyZW5jZSBhbiBlbnRyeSBiZXlvbmQgdGhlIGVuZCBvZiB0aGlzIGFycmF5IChpZiB0aGUgZGVjb2RlZAotICogemVybyBydW4gbGVuZ3RoIHJlYWNoZXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBibG9jaykuICBUbyBwcmV2ZW50Ci0gKiB3aWxkIHN0b3JlcyB3aXRob3V0IGFkZGluZyBhbiBpbm5lci1sb29wIHRlc3QsIHdlIHB1dCBzb21lIGV4dHJhCi0gKiAiNjMicyBhZnRlciB0aGUgcmVhbCBlbnRyaWVzLiAgVGhpcyB3aWxsIGNhdXNlIHRoZSBleHRyYSBjb2VmZmljaWVudAotICogdG8gYmUgc3RvcmVkIGluIGxvY2F0aW9uIDYzIG9mIHRoZSBibG9jaywgbm90IHNvbWV3aGVyZSByYW5kb20uCi0gKiBUaGUgd29yc3QgY2FzZSB3b3VsZCBiZSBhIHJ1bi1sZW5ndGggb2YgMTUsIHdoaWNoIG1lYW5zIHdlIG5lZWQgMTYKLSAqIGZha2UgZW50cmllcy4KLSAqLwotCi1jb25zdCBpbnQganBlZ19uYXR1cmFsX29yZGVyW0RDVFNJWkUyKzE2XSA9IHsKLSAgMCwgIDEsICA4LCAxNiwgIDksICAyLCAgMywgMTAsCi0gMTcsIDI0LCAzMiwgMjUsIDE4LCAxMSwgIDQsICA1LAotIDEyLCAxOSwgMjYsIDMzLCA0MCwgNDgsIDQxLCAzNCwKLSAyNywgMjAsIDEzLCAgNiwgIDcsIDE0LCAyMSwgMjgsCi0gMzUsIDQyLCA0OSwgNTYsIDU3LCA1MCwgNDMsIDM2LAotIDI5LCAyMiwgMTUsIDIzLCAzMCwgMzcsIDQ0LCA1MSwKLSA1OCwgNTksIDUyLCA0NSwgMzgsIDMxLCAzOSwgNDYsCi0gNTMsIDYwLCA2MSwgNTQsIDQ3LCA1NSwgNjIsIDYzLAotIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgLyogZXh0cmEgZW50cmllcyBmb3Igc2FmZXR5IGluIGRlY29kZXIgKi8KLSA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMKLX07Ci0KLQotLyoKLSAqIEFyaXRobWV0aWMgdXRpbGl0aWVzCi0gKi8KLQotR0xPQkFMKGxvbmcpCi1qZGl2X3JvdW5kX3VwIChsb25nIGEsIGxvbmcgYikKLS8qIENvbXB1dGUgYS9iIHJvdW5kZWQgdXAgdG8gbmV4dCBpbnRlZ2VyLCBpZSwgY2VpbChhL2IpICovCi0vKiBBc3N1bWVzIGEgPj0gMCwgYiA+IDAgKi8KLXsKLSAgcmV0dXJuIChhICsgYiAtIDFMKSAvIGI7Ci19Ci0KLQotR0xPQkFMKGxvbmcpCi1qcm91bmRfdXAgKGxvbmcgYSwgbG9uZyBiKQotLyogQ29tcHV0ZSBhIHJvdW5kZWQgdXAgdG8gbmV4dCBtdWx0aXBsZSBvZiBiLCBpZSwgY2VpbChhL2IpKmIgKi8KLS8qIEFzc3VtZXMgYSA+PSAwLCBiID4gMCAqLwotewotICBhICs9IGIgLSAxTDsKLSAgcmV0dXJuIGEgLSAoYSAlIGIpOwotfQotCi0KLS8qIE9uIG5vcm1hbCBtYWNoaW5lcyB3ZSBjYW4gYXBwbHkgTUVNQ09QWSgpIGFuZCBNRU1aRVJPKCkgdG8gc2FtcGxlIGFycmF5cwotICogYW5kIGNvZWZmaWNpZW50LWJsb2NrIGFycmF5cy4gIFRoaXMgd29uJ3Qgd29yayBvbiA4MHg4NiBiZWNhdXNlIHRoZSBhcnJheXMKLSAqIGFyZSBGQVIgYW5kIHdlJ3JlIGFzc3VtaW5nIGEgc21hbGwtcG9pbnRlciBtZW1vcnkgbW9kZWwuICBIb3dldmVyLCBzb21lCi0gKiBET1MgY29tcGlsZXJzIHByb3ZpZGUgZmFyLXBvaW50ZXIgdmVyc2lvbnMgb2YgbWVtY3B5KCkgYW5kIG1lbXNldCgpIGV2ZW4KLSAqIGluIHRoZSBzbWFsbC1tb2RlbCBsaWJyYXJpZXMuICBUaGVzZSB3aWxsIGJlIHVzZWQgaWYgVVNFX0ZNRU0gaXMgZGVmaW5lZC4KLSAqIE90aGVyd2lzZSwgdGhlIHJvdXRpbmVzIGJlbG93IGRvIGl0IHRoZSBoYXJkIHdheS4gIChUaGUgcGVyZm9ybWFuY2UgY29zdAotICogaXMgbm90IGFsbCB0aGF0IGdyZWF0LCBiZWNhdXNlIHRoZXNlIHJvdXRpbmVzIGFyZW4ndCB2ZXJ5IGhlYXZpbHkgdXNlZC4pCi0gKi8KLQotI2lmbmRlZiBORUVEX0ZBUl9QT0lOVEVSUwkvKiBub3JtYWwgY2FzZSwgc2FtZSBhcyByZWd1bGFyIG1hY3JvcyAqLwotI2RlZmluZSBGTUVNQ09QWShkZXN0LHNyYyxzaXplKQlNRU1DT1BZKGRlc3Qsc3JjLHNpemUpCi0jZGVmaW5lIEZNRU1aRVJPKHRhcmdldCxzaXplKQlNRU1aRVJPKHRhcmdldCxzaXplKQotI2Vsc2UJCQkJLyogODB4ODYgY2FzZSwgZGVmaW5lIGlmIHdlIGNhbiAqLwotI2lmZGVmIFVTRV9GTUVNCi0jZGVmaW5lIEZNRU1DT1BZKGRlc3Qsc3JjLHNpemUpCV9mbWVtY3B5KCh2b2lkIEZBUiAqKShkZXN0KSwgKGNvbnN0IHZvaWQgRkFSICopKHNyYyksIChzaXplX3QpKHNpemUpKQotI2RlZmluZSBGTUVNWkVSTyh0YXJnZXQsc2l6ZSkJX2ZtZW1zZXQoKHZvaWQgRkFSICopKHRhcmdldCksIDAsIChzaXplX3QpKHNpemUpKQotI2VuZGlmCi0jZW5kaWYKLQotCi1HTE9CQUwodm9pZCkKLWpjb3B5X3NhbXBsZV9yb3dzIChKU0FNUEFSUkFZIGlucHV0X2FycmF5LCBpbnQgc291cmNlX3JvdywKLQkJICAgSlNBTVBBUlJBWSBvdXRwdXRfYXJyYXksIGludCBkZXN0X3JvdywKLQkJICAgaW50IG51bV9yb3dzLCBKRElNRU5TSU9OIG51bV9jb2xzKQotLyogQ29weSBzb21lIHJvd3Mgb2Ygc2FtcGxlcyBmcm9tIG9uZSBwbGFjZSB0byBhbm90aGVyLgotICogbnVtX3Jvd3Mgcm93cyBhcmUgY29waWVkIGZyb20gaW5wdXRfYXJyYXlbc291cmNlX3JvdysrXQotICogdG8gb3V0cHV0X2FycmF5W2Rlc3Rfcm93KytdOyB0aGVzZSBhcmVhcyBtYXkgb3ZlcmxhcCBmb3IgZHVwbGljYXRpb24uCi0gKiBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcnJheXMgbXVzdCBiZSBhdCBsZWFzdCBhcyB3aWRlIGFzIG51bV9jb2xzLgotICovCi17Ci0gIHJlZ2lzdGVyIEpTQU1QUk9XIGlucHRyLCBvdXRwdHI7Ci0jaWZkZWYgRk1FTUNPUFkKLSAgcmVnaXN0ZXIgc2l6ZV90IGNvdW50ID0gKHNpemVfdCkgKG51bV9jb2xzICogU0laRU9GKEpTQU1QTEUpKTsKLSNlbHNlCi0gIHJlZ2lzdGVyIEpESU1FTlNJT04gY291bnQ7Ci0jZW5kaWYKLSAgcmVnaXN0ZXIgaW50IHJvdzsKLQotICBpbnB1dF9hcnJheSArPSBzb3VyY2Vfcm93OwotICBvdXRwdXRfYXJyYXkgKz0gZGVzdF9yb3c7Ci0KLSAgZm9yIChyb3cgPSBudW1fcm93czsgcm93ID4gMDsgcm93LS0pIHsKLSAgICBpbnB0ciA9ICppbnB1dF9hcnJheSsrOwotICAgIG91dHB0ciA9ICpvdXRwdXRfYXJyYXkrKzsKLSNpZmRlZiBGTUVNQ09QWQotICAgIEZNRU1DT1BZKG91dHB0ciwgaW5wdHIsIGNvdW50KTsKLSNlbHNlCi0gICAgZm9yIChjb3VudCA9IG51bV9jb2xzOyBjb3VudCA+IDA7IGNvdW50LS0pCi0gICAgICAqb3V0cHRyKysgPSAqaW5wdHIrKzsJLyogbmVlZG4ndCBib3RoZXIgd2l0aCBHRVRKU0FNUExFKCkgaGVyZSAqLwotI2VuZGlmCi0gIH0KLX0KLQotCi1HTE9CQUwodm9pZCkKLWpjb3B5X2Jsb2NrX3JvdyAoSkJMT0NLUk9XIGlucHV0X3JvdywgSkJMT0NLUk9XIG91dHB1dF9yb3csCi0JCSBKRElNRU5TSU9OIG51bV9ibG9ja3MpCi0vKiBDb3B5IGEgcm93IG9mIGNvZWZmaWNpZW50IGJsb2NrcyBmcm9tIG9uZSBwbGFjZSB0byBhbm90aGVyLiAqLwotewotI2lmZGVmIEZNRU1DT1BZCi0gIEZNRU1DT1BZKG91dHB1dF9yb3csIGlucHV0X3JvdywgbnVtX2Jsb2NrcyAqIChEQ1RTSVpFMiAqIFNJWkVPRihKQ09FRikpKTsKLSNlbHNlCi0gIHJlZ2lzdGVyIEpDT0VGUFRSIGlucHRyLCBvdXRwdHI7Ci0gIHJlZ2lzdGVyIGxvbmcgY291bnQ7Ci0KLSAgaW5wdHIgPSAoSkNPRUZQVFIpIGlucHV0X3JvdzsKLSAgb3V0cHRyID0gKEpDT0VGUFRSKSBvdXRwdXRfcm93OwotICBmb3IgKGNvdW50ID0gKGxvbmcpIG51bV9ibG9ja3MgKiBEQ1RTSVpFMjsgY291bnQgPiAwOyBjb3VudC0tKSB7Ci0gICAgKm91dHB0cisrID0gKmlucHRyKys7Ci0gIH0KLSNlbmRpZgotfQotCi0KLUdMT0JBTCh2b2lkKQotanplcm9fZmFyICh2b2lkIEZBUiAqIHRhcmdldCwgc2l6ZV90IGJ5dGVzdG96ZXJvKQotLyogWmVybyBvdXQgYSBjaHVuayBvZiBGQVIgbWVtb3J5LiAqLwotLyogVGhpcyBtaWdodCBiZSBzYW1wbGUtYXJyYXkgZGF0YSwgYmxvY2stYXJyYXkgZGF0YSwgb3IgYWxsb2NfbGFyZ2UgZGF0YS4gKi8KLXsKLSNpZmRlZiBGTUVNWkVSTwotICBGTUVNWkVSTyh0YXJnZXQsIGJ5dGVzdG96ZXJvKTsKLSNlbHNlCi0gIHJlZ2lzdGVyIGNoYXIgRkFSICogcHRyID0gKGNoYXIgRkFSICopIHRhcmdldDsKLSAgcmVnaXN0ZXIgc2l6ZV90IGNvdW50OwotCi0gIGZvciAoY291bnQgPSBieXRlc3RvemVybzsgY291bnQgPiAwOyBjb3VudC0tKSB7Ci0gICAgKnB0cisrID0gMDsKLSAgfQotI2VuZGlmCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2pjaHVmZi5oIGIvdGhpcmRfcGFydHkvbGlianBlZy9qY2h1ZmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk1OTlmYy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJqcGVnL2pjaHVmZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIGpjaHVmZi5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgZGVjbGFyYXRpb25zIGZvciBIdWZmbWFuIGVudHJvcHkgZW5jb2Rpbmcgcm91dGluZXMKLSAqIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZSBzZXF1ZW50aWFsIGVuY29kZXIgKGpjaHVmZi5jKSBhbmQgdGhlCi0gKiBwcm9ncmVzc2l2ZSBlbmNvZGVyIChqY3BodWZmLmMpLiAgTm8gb3RoZXIgbW9kdWxlcyBuZWVkIHRvIHNlZSB0aGVzZS4KLSAqLwotCi0vKiBUaGUgbGVnYWwgcmFuZ2Ugb2YgYSBEQ1QgY29lZmZpY2llbnQgaXMKLSAqICAtMTAyNCAuLiArMTAyMyAgZm9yIDgtYml0IGRhdGE7Ci0gKiAtMTYzODQgLi4gKzE2MzgzIGZvciAxMi1iaXQgZGF0YS4KLSAqIEhlbmNlIHRoZSBtYWduaXR1ZGUgc2hvdWxkIGFsd2F5cyBmaXQgaW4gMTAgb3IgMTQgYml0cyByZXNwZWN0aXZlbHkuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0jZGVmaW5lIE1BWF9DT0VGX0JJVFMgMTAKLSNlbHNlCi0jZGVmaW5lIE1BWF9DT0VGX0JJVFMgMTQKLSNlbmRpZgotCi0vKiBEZXJpdmVkIGRhdGEgY29uc3RydWN0ZWQgZm9yIGVhY2ggSHVmZm1hbiB0YWJsZSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVuc2lnbmVkIGludCBlaHVmY29bMjU2XTsJLyogY29kZSBmb3IgZWFjaCBzeW1ib2wgKi8KLSAgY2hhciBlaHVmc2lbMjU2XTsJCS8qIGxlbmd0aCBvZiBjb2RlIGZvciBlYWNoIHN5bWJvbCAqLwotICAvKiBJZiBubyBjb2RlIGhhcyBiZWVuIGFsbG9jYXRlZCBmb3IgYSBzeW1ib2wgUywgZWh1ZnNpW1NdIGNvbnRhaW5zIDAgKi8KLX0gY19kZXJpdmVkX3RibDsKLQotLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCi0KLSNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jZGVmaW5lIGpwZWdfbWFrZV9jX2Rlcml2ZWRfdGJsCWpNa0NEZXJpdmVkCi0jZGVmaW5lIGpwZWdfZ2VuX29wdGltYWxfdGFibGUJakdlbk9wdFRibAotI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KLQotLyogRXhwYW5kIGEgSHVmZm1hbiB0YWJsZSBkZWZpbml0aW9uIGludG8gdGhlIGRlcml2ZWQgZm9ybWF0ICovCi1FWFRFUk4odm9pZCkganBlZ19tYWtlX2NfZGVyaXZlZF90YmwKLQlKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzREMsIGludCB0YmxubywKLQkgICAgIGNfZGVyaXZlZF90YmwgKiogcGR0YmwpKTsKLQotLyogR2VuZXJhdGUgYW4gb3B0aW1hbCB0YWJsZSBkZWZpbml0aW9uIGdpdmVuIHRoZSBzcGVjaWZpZWQgY291bnRzICovCi1FWFRFUk4odm9pZCkganBlZ19nZW5fb3B0aW1hbF90YWJsZQotCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIEpIVUZGX1RCTCAqIGh0YmwsIGxvbmcgZnJlcVtdKSk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2pjb25maWcuaCBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvamNvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTNjMzk3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvamNvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0vKiBqY29uZmlnLnZjIC0tLSBqY29uZmlnLmggZm9yIE1pY3Jvc29mdCBWaXN1YWwgQysrIG9uIFdpbmRvd3MgOTUgb3IgTlQuICovCi0vKiBzZWUgamNvbmZpZy5kb2MgZm9yIGV4cGxhbmF0aW9ucyAqLwotCi0jZGVmaW5lIEhBVkVfUFJPVE9UWVBFUwotI2RlZmluZSBIQVZFX1VOU0lHTkVEX0NIQVIKLSNkZWZpbmUgSEFWRV9VTlNJR05FRF9TSE9SVAotLyogI2RlZmluZSB2b2lkIGNoYXIgKi8KLS8qICNkZWZpbmUgY29uc3QgKi8KLSN1bmRlZiBDSEFSX0lTX1VOU0lHTkVECi0jZGVmaW5lIEhBVkVfU1REREVGX0gKLSNkZWZpbmUgSEFWRV9TVERMSUJfSAotI3VuZGVmIE5FRURfQlNEX1NUUklOR1MKLSN1bmRlZiBORUVEX1NZU19UWVBFU19ICi0jdW5kZWYgTkVFRF9GQVJfUE9JTlRFUlMJLyogd2UgcHJlc3VtZSBhIDMyLWJpdCBmbGF0IG1lbW9yeSBtb2RlbCAqLwotI3VuZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSN1bmRlZiBJTkNPTVBMRVRFX1RZUEVTX0JST0tFTgotCi0vKiBEZWZpbmUgImJvb2xlYW4iIGFzIHVuc2lnbmVkIGNoYXIsIG5vdCBpbnQsIHBlciBXaW5kb3dzIGN1c3RvbSAqLwotI2lmbmRlZiBfX1JQQ05EUl9IX18JCS8qIGRvbid0IGNvbmZsaWN0IGlmIHJwY25kci5oIGFscmVhZHkgcmVhZCAqLwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIGJvb2xlYW47Ci0jZW5kaWYKLSNkZWZpbmUgSEFWRV9CT09MRUFOCQkvKiBwcmV2ZW50IGptb3JlY2ZnLmggZnJvbSByZWRlZmluaW5nIGl0ICovCi0KLQotI2lmZGVmIEpQRUdfSU5URVJOQUxTCi0KLSN1bmRlZiBSSUdIVF9TSElGVF9JU19VTlNJR05FRAotCi0jZW5kaWYgLyogSlBFR19JTlRFUk5BTFMgKi8KLQotI2lmZGVmIEpQRUdfQ0pQRUdfREpQRUcKLQotI2RlZmluZSBCTVBfU1VQUE9SVEVECQkvKiBCTVAgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLSNkZWZpbmUgR0lGX1NVUFBPUlRFRAkJLyogR0lGIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFBQTV9TVVBQT1JURUQJCS8qIFBCTVBMVVMgUFBNL1BHTSBpbWFnZSBmaWxlIGZvcm1hdCAqLwotI3VuZGVmIFJMRV9TVVBQT1JURUQJCS8qIFV0YWggUkxFIGltYWdlIGZpbGUgZm9ybWF0ICovCi0jZGVmaW5lIFRBUkdBX1NVUFBPUlRFRAkJLyogVGFyZ2EgaW1hZ2UgZmlsZSBmb3JtYXQgKi8KLQotI2RlZmluZSBUV09fRklMRV9DT01NQU5ETElORQkvKiBvcHRpb25hbCAqLwotI2RlZmluZSBVU0VfU0VUTU9ERQkJLyogTWljcm9zb2Z0IGhhcyBzZXRtb2RlKCkgKi8KLSN1bmRlZiBORUVEX1NJR05BTF9DQVRDSEVSCi0jdW5kZWYgRE9OVF9VU0VfQl9NT0RFCi0jdW5kZWYgUFJPR1JFU1NfUkVQT1JUCQkvKiBvcHRpb25hbCAqLwotCi0jZW5kaWYgLyogSlBFR19DSlBFR19ESlBFRyAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9qZGN0LmggYi90aGlyZF9wYXJ0eS9saWJqcGVnL2pkY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQxOTJhMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJqcGVnL2pkY3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKgotICogamRjdC5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTk0LTE5OTYsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGluY2x1ZGUgZmlsZSBjb250YWlucyBjb21tb24gZGVjbGFyYXRpb25zIGZvciB0aGUgZm9yd2FyZCBhbmQKLSAqIGludmVyc2UgRENUIG1vZHVsZXMuICBUaGVzZSBkZWNsYXJhdGlvbnMgYXJlIHByaXZhdGUgdG8gdGhlIERDVCBtYW5hZ2VycwotICogKGpjZGN0bWdyLmMsIGpkZGN0bWdyLmMpIGFuZCB0aGUgaW5kaXZpZHVhbCBEQ1QgYWxnb3JpdGhtcy4KLSAqIFRoZSBpbmRpdmlkdWFsIERDVCBhbGdvcml0aG1zIGFyZSBrZXB0IGluIHNlcGFyYXRlIGZpbGVzIHRvIGVhc2UgCi0gKiBtYWNoaW5lLWRlcGVuZGVudCB0dW5pbmcgKGUuZy4sIGFzc2VtYmx5IGNvZGluZykuCi0gKi8KLQotCi0vKgotICogQSBmb3J3YXJkIERDVCByb3V0aW5lIGlzIGdpdmVuIGEgcG9pbnRlciB0byBhIHdvcmsgYXJlYSBvZiB0eXBlIERDVEVMRU1bXTsKLSAqIHRoZSBEQ1QgaXMgdG8gYmUgcGVyZm9ybWVkIGluLXBsYWNlIGluIHRoYXQgYnVmZmVyLiAgVHlwZSBEQ1RFTEVNIGlzIGludAotICogZm9yIDgtYml0IHNhbXBsZXMsIElOVDMyIGZvciAxMi1iaXQgc2FtcGxlcy4gIChOT1RFOiBGbG9hdGluZy1wb2ludCBEQ1QKLSAqIGltcGxlbWVudGF0aW9ucyB1c2UgYW4gYXJyYXkgb2YgdHlwZSBGQVNUX0ZMT0FULCBpbnN0ZWFkLikKLSAqIFRoZSBEQ1QgaW5wdXRzIGFyZSBleHBlY3RlZCB0byBiZSBzaWduZWQgKHJhbmdlICstQ0VOVEVSSlNBTVBMRSkuCi0gKiBUaGUgRENUIG91dHB1dHMgYXJlIHJldHVybmVkIHNjYWxlZCB1cCBieSBhIGZhY3RvciBvZiA4OyB0aGV5IHRoZXJlZm9yZQotICogaGF2ZSBhIHJhbmdlIG9mICstOEsgZm9yIDgtYml0IGRhdGEsICstMTI4SyBmb3IgMTItYml0IGRhdGEuICBUaGlzCi0gKiBjb252ZW50aW9uIGltcHJvdmVzIGFjY3VyYWN5IGluIGludGVnZXIgaW1wbGVtZW50YXRpb25zIGFuZCBzYXZlcyBzb21lCi0gKiB3b3JrIGluIGZsb2F0aW5nLXBvaW50IG9uZXMuCi0gKiBRdWFudGl6YXRpb24gb2YgdGhlIG91dHB1dCBjb2VmZmljaWVudHMgaXMgZG9uZSBieSBqY2RjdG1nci5jLgotICovCi0KLSNpZiBCSVRTX0lOX0pTQU1QTEUgPT0gOAotdHlwZWRlZiBpbnQgRENURUxFTTsJCS8qIDE2IG9yIDMyIGJpdHMgaXMgZmluZSAqLwotI2Vsc2UKLXR5cGVkZWYgSU5UMzIgRENURUxFTTsJCS8qIG11c3QgaGF2ZSAzMiBiaXRzICovCi0jZW5kaWYKLQotdHlwZWRlZiBKTUVUSE9EKHZvaWQsIGZvcndhcmRfRENUX21ldGhvZF9wdHIsIChEQ1RFTEVNICogZGF0YSkpOwotdHlwZWRlZiBKTUVUSE9EKHZvaWQsIGZsb2F0X0RDVF9tZXRob2RfcHRyLCAoRkFTVF9GTE9BVCAqIGRhdGEpKTsKLQotCi0vKgotICogQW4gaW52ZXJzZSBEQ1Qgcm91dGluZSBpcyBnaXZlbiBhIHBvaW50ZXIgdG8gdGhlIGlucHV0IEpCTE9DSyBhbmQgYSBwb2ludGVyCi0gKiB0byBhbiBvdXRwdXQgc2FtcGxlIGFycmF5LiAgVGhlIHJvdXRpbmUgbXVzdCBkZXF1YW50aXplIHRoZSBpbnB1dCBkYXRhIGFzCi0gKiB3ZWxsIGFzIHBlcmZvcm0gdGhlIElEQ1Q7IGZvciBkZXF1YW50aXphdGlvbiwgaXQgdXNlcyB0aGUgbXVsdGlwbGllciB0YWJsZQotICogcG9pbnRlZCB0byBieSBjb21wcHRyLT5kY3RfdGFibGUuICBUaGUgb3V0cHV0IGRhdGEgaXMgdG8gYmUgcGxhY2VkIGludG8gdGhlCi0gKiBzYW1wbGUgYXJyYXkgc3RhcnRpbmcgYXQgYSBzcGVjaWZpZWQgY29sdW1uLiAgKEFueSByb3cgb2Zmc2V0IG5lZWRlZCB3aWxsCi0gKiBiZSBhcHBsaWVkIHRvIHRoZSBhcnJheSBwb2ludGVyIGJlZm9yZSBpdCBpcyBwYXNzZWQgdG8gdGhlIElEQ1QgY29kZS4pCi0gKiBOb3RlIHRoYXQgdGhlIG51bWJlciBvZiBzYW1wbGVzIGVtaXR0ZWQgYnkgdGhlIElEQ1Qgcm91dGluZSBpcwotICogRENUX3NjYWxlZF9zaXplICogRENUX3NjYWxlZF9zaXplLgotICovCi0KLS8qIHR5cGVkZWYgaW52ZXJzZV9EQ1RfbWV0aG9kX3B0ciBpcyBkZWNsYXJlZCBpbiBqcGVnaW50LmggKi8KLQotLyoKLSAqIEVhY2ggSURDVCByb3V0aW5lIGhhcyBpdHMgb3duIGlkZWFzIGFib3V0IHRoZSBiZXN0IGRjdF90YWJsZSBlbGVtZW50IHR5cGUuCi0gKi8KLQotdHlwZWRlZiBNVUxUSVBMSUVSIElTTE9XX01VTFRfVFlQRTsgLyogc2hvcnQgb3IgaW50LCB3aGljaGV2ZXIgaXMgZmFzdGVyICovCi0jaWYgQklUU19JTl9KU0FNUExFID09IDgKLXR5cGVkZWYgTVVMVElQTElFUiBJRkFTVF9NVUxUX1RZUEU7IC8qIDE2IGJpdHMgaXMgT0ssIHVzZSBzaG9ydCBpZiBmYXN0ZXIgKi8KLSNkZWZpbmUgSUZBU1RfU0NBTEVfQklUUyAgMgkvKiBmcmFjdGlvbmFsIGJpdHMgaW4gc2NhbGUgZmFjdG9ycyAqLwotI2Vsc2UKLXR5cGVkZWYgSU5UMzIgSUZBU1RfTVVMVF9UWVBFOwkvKiBuZWVkIDMyIGJpdHMgZm9yIHNjYWxlZCBxdWFudGl6ZXJzICovCi0jZGVmaW5lIElGQVNUX1NDQUxFX0JJVFMgIDEzCS8qIGZyYWN0aW9uYWwgYml0cyBpbiBzY2FsZSBmYWN0b3JzICovCi0jZW5kaWYKLXR5cGVkZWYgRkFTVF9GTE9BVCBGTE9BVF9NVUxUX1RZUEU7IC8qIHByZWZlcnJlZCBmbG9hdGluZyB0eXBlICovCi0KLQotLyoKLSAqIEVhY2ggSURDVCByb3V0aW5lIGlzIHJlc3BvbnNpYmxlIGZvciByYW5nZS1saW1pdGluZyBpdHMgcmVzdWx0cyBhbmQKLSAqIGNvbnZlcnRpbmcgdGhlbSB0byB1bnNpZ25lZCBmb3JtICgwLi5NQVhKU0FNUExFKS4gIFRoZSByYXcgb3V0cHV0cyBjb3VsZAotICogYmUgcXVpdGUgZmFyIG91dCBvZiByYW5nZSBpZiB0aGUgaW5wdXQgZGF0YSBpcyBjb3JydXB0LCBzbyBhIGJ1bGxldHByb29mCi0gKiByYW5nZS1saW1pdGluZyBzdGVwIGlzIHJlcXVpcmVkLiAgV2UgdXNlIGEgbWFzay1hbmQtdGFibGUtbG9va3VwIG1ldGhvZAotICogdG8gZG8gdGhlIGNvbWJpbmVkIG9wZXJhdGlvbnMgcXVpY2tseS4gIFNlZSB0aGUgY29tbWVudHMgd2l0aAotICogcHJlcGFyZV9yYW5nZV9saW1pdF90YWJsZSAoaW4gamRtYXN0ZXIuYykgZm9yIG1vcmUgaW5mby4KLSAqLwotCi0jZGVmaW5lIElEQ1RfcmFuZ2VfbGltaXQoY2luZm8pICAoKGNpbmZvKS0+c2FtcGxlX3JhbmdlX2xpbWl0ICsgQ0VOVEVSSlNBTVBMRSkKLQotI2RlZmluZSBSQU5HRV9NQVNLICAoTUFYSlNBTVBMRSAqIDQgKyAzKSAvKiAyIGJpdHMgd2lkZXIgdGhhbiBsZWdhbCBzYW1wbGVzICovCi0KLQotLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCi0KLSNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jZGVmaW5lIGpwZWdfZmRjdF9pc2xvdwkJakZEaXNsb3cKLSNkZWZpbmUganBlZ19mZGN0X2lmYXN0CQlqRkRpZmFzdAotI2RlZmluZSBqcGVnX2ZkY3RfZmxvYXQJCWpGRGZsb2F0Ci0jZGVmaW5lIGpwZWdfaWRjdF9pc2xvdwkJalJEaXNsb3cKLSNkZWZpbmUganBlZ19pZGN0X2lmYXN0CQlqUkRpZmFzdAotI2RlZmluZSBqcGVnX2lkY3RfZmxvYXQJCWpSRGZsb2F0Ci0jZGVmaW5lIGpwZWdfaWRjdF80eDQJCWpSRDR4NAotI2RlZmluZSBqcGVnX2lkY3RfMngyCQlqUkQyeDIKLSNkZWZpbmUganBlZ19pZGN0XzF4MQkJalJEMXgxCi0jZW5kaWYgLyogTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAqLwotCi0vKiBFeHRlcm4gZGVjbGFyYXRpb25zIGZvciB0aGUgZm9yd2FyZCBhbmQgaW52ZXJzZSBEQ1Qgcm91dGluZXMuICovCi0KLUVYVEVSTih2b2lkKSBqcGVnX2ZkY3RfaXNsb3cgSlBQKChEQ1RFTEVNICogZGF0YSkpOwotRVhURVJOKHZvaWQpIGpwZWdfZmRjdF9pZmFzdCBKUFAoKERDVEVMRU0gKiBkYXRhKSk7Ci1FWFRFUk4odm9pZCkganBlZ19mZGN0X2Zsb2F0IEpQUCgoRkFTVF9GTE9BVCAqIGRhdGEpKTsKLQotRVhURVJOKHZvaWQpIGpwZWdfaWRjdF9pc2xvdwotICAgIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JIEpDT0VGUFRSIGNvZWZfYmxvY2ssIEpTQU1QQVJSQVkgb3V0cHV0X2J1ZiwgSkRJTUVOU0lPTiBvdXRwdXRfY29sKSk7Ci1FWFRFUk4odm9pZCkganBlZ19pZGN0X2lmYXN0Ci0gICAgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkgSkNPRUZQVFIgY29lZl9ibG9jaywgSlNBTVBBUlJBWSBvdXRwdXRfYnVmLCBKRElNRU5TSU9OIG91dHB1dF9jb2wpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2lkY3RfZmxvYXQKLSAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOwotRVhURVJOKHZvaWQpIGpwZWdfaWRjdF80eDQKLSAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOwotRVhURVJOKHZvaWQpIGpwZWdfaWRjdF8yeDIKLSAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOwotRVhURVJOKHZvaWQpIGpwZWdfaWRjdF8xeDEKLSAgICBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wcHRyLAotCSBKQ09FRlBUUiBjb2VmX2Jsb2NrLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOwotCi0KLS8qCi0gKiBNYWNyb3MgZm9yIGhhbmRsaW5nIGZpeGVkLXBvaW50IGFyaXRobWV0aWM7IHRoZXNlIGFyZSB1c2VkIGJ5IG1hbnkKLSAqIGJ1dCBub3QgYWxsIG9mIHRoZSBEQ1QvSURDVCBtb2R1bGVzLgotICoKLSAqIEFsbCB2YWx1ZXMgYXJlIGV4cGVjdGVkIHRvIGJlIG9mIHR5cGUgSU5UMzIuCi0gKiBGcmFjdGlvbmFsIGNvbnN0YW50cyBhcmUgc2NhbGVkIGxlZnQgYnkgQ09OU1RfQklUUyBiaXRzLgotICogQ09OU1RfQklUUyBpcyBkZWZpbmVkIHdpdGhpbiBlYWNoIG1vZHVsZSB1c2luZyB0aGVzZSBtYWNyb3MsCi0gKiBhbmQgbWF5IGRpZmZlciBmcm9tIG9uZSBtb2R1bGUgdG8gdGhlIG5leHQuCi0gKi8KLQotI2RlZmluZSBPTkUJKChJTlQzMikgMSkKLSNkZWZpbmUgQ09OU1RfU0NBTEUgKE9ORSA8PCBDT05TVF9CSVRTKQotCi0vKiBDb252ZXJ0IGEgcG9zaXRpdmUgcmVhbCBjb25zdGFudCB0byBhbiBpbnRlZ2VyIHNjYWxlZCBieSBDT05TVF9TQ0FMRS4KLSAqIENhdXRpb246IHNvbWUgQyBjb21waWxlcnMgZmFpbCB0byByZWR1Y2UgIkZJWChjb25zdGFudCkiIGF0IGNvbXBpbGUgdGltZSwKLSAqIHRodXMgY2F1c2luZyBhIGxvdCBvZiB1c2VsZXNzIGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbnMgYXQgcnVuIHRpbWUuCi0gKi8KLQotI2RlZmluZSBGSVgoeCkJKChJTlQzMikgKCh4KSAqIENPTlNUX1NDQUxFICsgMC41KSkKLQotLyogRGVzY2FsZSBhbmQgY29ycmVjdGx5IHJvdW5kIGFuIElOVDMyIHZhbHVlIHRoYXQncyBzY2FsZWQgYnkgTiBiaXRzLgotICogV2UgYXNzdW1lIFJJR0hUX1NISUZUIHJvdW5kcyB0b3dhcmRzIG1pbnVzIGluZmluaXR5LCBzbyBhZGRpbmcKLSAqIHRoZSBmdWRnZSBmYWN0b3IgaXMgY29ycmVjdCBmb3IgZWl0aGVyIHNpZ24gb2YgWC4KLSAqLwotCi0jZGVmaW5lIERFU0NBTEUoeCxuKSAgUklHSFRfU0hJRlQoKHgpICsgKE9ORSA8PCAoKG4pLTEpKSwgbikKLQotLyogTXVsdGlwbHkgYW4gSU5UMzIgdmFyaWFibGUgYnkgYW4gSU5UMzIgY29uc3RhbnQgdG8geWllbGQgYW4gSU5UMzIgcmVzdWx0LgotICogVGhpcyBtYWNybyBpcyB1c2VkIG9ubHkgd2hlbiB0aGUgdHdvIGlucHV0cyB3aWxsIGFjdHVhbGx5IGJlIG5vIG1vcmUgdGhhbgotICogMTYgYml0cyB3aWRlLCBzbyB0aGF0IGEgMTZ4MTYtPjMyIGJpdCBtdWx0aXBseSBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIGEKLSAqIGZ1bGwgMzJ4MzIgbXVsdGlwbHkuICBUaGlzIHByb3ZpZGVzIGEgdXNlZnVsIHNwZWVkdXAgb24gbWFueSBtYWNoaW5lcy4KLSAqIFVuZm9ydHVuYXRlbHkgdGhlcmUgaXMgbm8gd2F5IHRvIHNwZWNpZnkgYSAxNngxNi0+MzIgbXVsdGlwbHkgcG9ydGFibHkKLSAqIGluIEMsIGJ1dCBzb21lIEMgY29tcGlsZXJzIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nIGlmIHlvdSBwcm92aWRlIHRoZQotICogY29ycmVjdCBjb21iaW5hdGlvbiBvZiBjYXN0cy4KLSAqLwotCi0jaWZkZWYgU0hPUlR4U0hPUlRfMzIJCS8qIG1heSB3b3JrIGlmICdpbnQnIGlzIDMyIGJpdHMgKi8KLSNkZWZpbmUgTVVMVElQTFkxNkMxNih2YXIsY29uc3QpICAoKChJTlQxNikgKHZhcikpICogKChJTlQxNikgKGNvbnN0KSkpCi0jZW5kaWYKLSNpZmRlZiBTSE9SVHhMQ09OU1RfMzIJCS8qIGtub3duIHRvIHdvcmsgd2l0aCBNaWNyb3NvZnQgQyA2LjAgKi8KLSNkZWZpbmUgTVVMVElQTFkxNkMxNih2YXIsY29uc3QpICAoKChJTlQxNikgKHZhcikpICogKChJTlQzMikgKGNvbnN0KSkpCi0jZW5kaWYKLQotI2lmbmRlZiBNVUxUSVBMWTE2QzE2CQkvKiBkZWZhdWx0IGRlZmluaXRpb24gKi8KLSNkZWZpbmUgTVVMVElQTFkxNkMxNih2YXIsY29uc3QpICAoKHZhcikgKiAoY29uc3QpKQotI2VuZGlmCi0KLS8qIFNhbWUgZXhjZXB0IGJvdGggaW5wdXRzIGFyZSB2YXJpYWJsZXMuICovCi0KLSNpZmRlZiBTSE9SVHhTSE9SVF8zMgkJLyogbWF5IHdvcmsgaWYgJ2ludCcgaXMgMzIgYml0cyAqLwotI2RlZmluZSBNVUxUSVBMWTE2VjE2KHZhcjEsdmFyMikgICgoKElOVDE2KSAodmFyMSkpICogKChJTlQxNikgKHZhcjIpKSkKLSNlbmRpZgotCi0jaWZuZGVmIE1VTFRJUExZMTZWMTYJCS8qIGRlZmF1bHQgZGVmaW5pdGlvbiAqLwotI2RlZmluZSBNVUxUSVBMWTE2VjE2KHZhcjEsdmFyMikgICgodmFyMSkgKiAodmFyMikpCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvamRodWZmLmggYi90aGlyZF9wYXJ0eS9saWJqcGVnL2pkaHVmZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTE5YjZjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvamRodWZmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoKLSAqIGpkaHVmZi5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTcsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgZGVjbGFyYXRpb25zIGZvciBIdWZmbWFuIGVudHJvcHkgZGVjb2Rpbmcgcm91dGluZXMKLSAqIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZSBzZXF1ZW50aWFsIGRlY29kZXIgKGpkaHVmZi5jKSBhbmQgdGhlCi0gKiBwcm9ncmVzc2l2ZSBkZWNvZGVyIChqZHBodWZmLmMpLiAgTm8gb3RoZXIgbW9kdWxlcyBuZWVkIHRvIHNlZSB0aGVzZS4KLSAqLwotCi0vKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4gKi8KLQotI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSNkZWZpbmUganBlZ19tYWtlX2RfZGVyaXZlZF90YmwJak1rRERlcml2ZWQKLSNkZWZpbmUganBlZ19maWxsX2JpdF9idWZmZXIJakZpbEJpdEJ1ZgotI2RlZmluZSBqcGVnX2h1ZmZfZGVjb2RlCWpIdWZEZWNvZGUKLSNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCi0KLQotLyogRGVyaXZlZCBkYXRhIGNvbnN0cnVjdGVkIGZvciBlYWNoIEh1ZmZtYW4gdGFibGUgKi8KLQotI2RlZmluZSBIVUZGX0xPT0tBSEVBRAk4CS8qICMgb2YgYml0cyBvZiBsb29rYWhlYWQgKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBCYXNpYyB0YWJsZXM6IChlbGVtZW50IFswXSBvZiBlYWNoIGFycmF5IGlzIHVudXNlZCkgKi8KLSAgSU5UMzIgbWF4Y29kZVsxOF07CQkvKiBsYXJnZXN0IGNvZGUgb2YgbGVuZ3RoIGsgKC0xIGlmIG5vbmUpICovCi0gIC8qIChtYXhjb2RlWzE3XSBpcyBhIHNlbnRpbmVsIHRvIGVuc3VyZSBqcGVnX2h1ZmZfZGVjb2RlIHRlcm1pbmF0ZXMpICovCi0gIElOVDMyIHZhbG9mZnNldFsxN107CQkvKiBodWZmdmFsW10gb2Zmc2V0IGZvciBjb2RlcyBvZiBsZW5ndGggayAqLwotICAvKiB2YWxvZmZzZXRba10gPSBodWZmdmFsW10gaW5kZXggb2YgMXN0IHN5bWJvbCBvZiBjb2RlIGxlbmd0aCBrLCBsZXNzCi0gICAqIHRoZSBzbWFsbGVzdCBjb2RlIG9mIGxlbmd0aCBrOyBzbyBnaXZlbiBhIGNvZGUgb2YgbGVuZ3RoIGssIHRoZQotICAgKiBjb3JyZXNwb25kaW5nIHN5bWJvbCBpcyBodWZmdmFsW2NvZGUgKyB2YWxvZmZzZXRba11dCi0gICAqLwotCi0gIC8qIExpbmsgdG8gcHVibGljIEh1ZmZtYW4gdGFibGUgKG5lZWRlZCBvbmx5IGluIGpwZWdfaHVmZl9kZWNvZGUpICovCi0gIEpIVUZGX1RCTCAqcHViOwotCi0gIC8qIExvb2thaGVhZCB0YWJsZXM6IGluZGV4ZWQgYnkgdGhlIG5leHQgSFVGRl9MT09LQUhFQUQgYml0cyBvZgotICAgKiB0aGUgaW5wdXQgZGF0YSBzdHJlYW0uICBJZiB0aGUgbmV4dCBIdWZmbWFuIGNvZGUgaXMgbm8gbW9yZQotICAgKiB0aGFuIEhVRkZfTE9PS0FIRUFEIGJpdHMgbG9uZywgd2UgY2FuIG9idGFpbiBpdHMgbGVuZ3RoIGFuZAotICAgKiB0aGUgY29ycmVzcG9uZGluZyBzeW1ib2wgZGlyZWN0bHkgZnJvbSB0aGVzZSB0YWJsZXMuCi0gICAqLwotICBpbnQgbG9va19uYml0c1sxPDxIVUZGX0xPT0tBSEVBRF07IC8qICMgYml0cywgb3IgMCBpZiB0b28gbG9uZyAqLwotICBVSU5UOCBsb29rX3N5bVsxPDxIVUZGX0xPT0tBSEVBRF07IC8qIHN5bWJvbCwgb3IgdW51c2VkICovCi19IGRfZGVyaXZlZF90Ymw7Ci0KLS8qIEV4cGFuZCBhIEh1ZmZtYW4gdGFibGUgZGVmaW5pdGlvbiBpbnRvIHRoZSBkZXJpdmVkIGZvcm1hdCAqLwotRVhURVJOKHZvaWQpIGpwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsCi0JSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGlzREMsIGludCB0YmxubywKLQkgICAgIGRfZGVyaXZlZF90YmwgKiogcGR0YmwpKTsKLQotCi0vKgotICogRmV0Y2hpbmcgdGhlIG5leHQgTiBiaXRzIGZyb20gdGhlIGlucHV0IHN0cmVhbSBpcyBhIHRpbWUtY3JpdGljYWwgb3BlcmF0aW9uCi0gKiBmb3IgdGhlIEh1ZmZtYW4gZGVjb2RlcnMuICBXZSBpbXBsZW1lbnQgaXQgd2l0aCBhIGNvbWJpbmF0aW9uIG9mIGlubGluZQotICogbWFjcm9zIGFuZCBvdXQtb2YtbGluZSBzdWJyb3V0aW5lcy4gIE5vdGUgdGhhdCBOICh0aGUgbnVtYmVyIG9mIGJpdHMKLSAqIGRlbWFuZGVkIGF0IG9uZSB0aW1lKSBuZXZlciBleGNlZWRzIDE1IGZvciBKUEVHIHVzZS4KLSAqCi0gKiBXZSByZWFkIHNvdXJjZSBieXRlcyBpbnRvIGdldF9idWZmZXIgYW5kIGRvbGUgb3V0IGJpdHMgYXMgbmVlZGVkLgotICogSWYgZ2V0X2J1ZmZlciBhbHJlYWR5IGNvbnRhaW5zIGVub3VnaCBiaXRzLCB0aGV5IGFyZSBmZXRjaGVkIGluLWxpbmUKLSAqIGJ5IHRoZSBtYWNyb3MgQ0hFQ0tfQklUX0JVRkZFUiBhbmQgR0VUX0JJVFMuICBXaGVuIHRoZXJlIGFyZW4ndCBlbm91Z2gKLSAqIGJpdHMsIGpwZWdfZmlsbF9iaXRfYnVmZmVyIGlzIGNhbGxlZDsgaXQgd2lsbCBhdHRlbXB0IHRvIGZpbGwgZ2V0X2J1ZmZlcgotICogYXMgZnVsbCBhcyBwb3NzaWJsZSAobm90IGp1c3QgdG8gdGhlIG51bWJlciBvZiBiaXRzIG5lZWRlZDsgdGhpcwotICogcHJlZmV0Y2hpbmcgcmVkdWNlcyB0aGUgb3ZlcmhlYWQgY29zdCBvZiBjYWxsaW5nIGpwZWdfZmlsbF9iaXRfYnVmZmVyKS4KLSAqIE5vdGUgdGhhdCBqcGVnX2ZpbGxfYml0X2J1ZmZlciBtYXkgcmV0dXJuIEZBTFNFIHRvIGluZGljYXRlIHN1c3BlbnNpb24uCi0gKiBPbiBUUlVFIHJldHVybiwganBlZ19maWxsX2JpdF9idWZmZXIgZ3VhcmFudGVlcyB0aGF0IGdldF9idWZmZXIgY29udGFpbnMKLSAqIGF0IGxlYXN0IHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJpdHMgLS0tIGR1bW15IHplcm9lcyBhcmUgaW5zZXJ0ZWQgaWYKLSAqIG5lY2Vzc2FyeS4KLSAqLwotCi10eXBlZGVmIElOVDMyIGJpdF9idWZfdHlwZTsJLyogdHlwZSBvZiBiaXQtZXh0cmFjdGlvbiBidWZmZXIgKi8KLSNkZWZpbmUgQklUX0JVRl9TSVpFICAzMgkvKiBzaXplIG9mIGJ1ZmZlciBpbiBiaXRzICovCi0KLS8qIElmIGxvbmcgaXMgPiAzMiBiaXRzIG9uIHlvdXIgbWFjaGluZSwgYW5kIHNoaWZ0aW5nL21hc2tpbmcgbG9uZ3MgaXMKLSAqIHJlYXNvbmFibHkgZmFzdCwgbWFraW5nIGJpdF9idWZfdHlwZSBiZSBsb25nIGFuZCBzZXR0aW5nIEJJVF9CVUZfU0laRQotICogYXBwcm9wcmlhdGVseSBzaG91bGQgYmUgYSB3aW4uICBVbmZvcnR1bmF0ZWx5IHdlIGNhbid0IGRlZmluZSB0aGUgc2l6ZQotICogd2l0aCBzb21ldGhpbmcgbGlrZSAgI2RlZmluZSBCSVRfQlVGX1NJWkUgKHNpemVvZihiaXRfYnVmX3R5cGUpKjgpCi0gKiBiZWNhdXNlIG5vdCBhbGwgbWFjaGluZXMgbWVhc3VyZSBzaXplb2YgaW4gOC1iaXQgYnl0ZXMuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewkJLyogQml0cmVhZGluZyBzdGF0ZSBzYXZlZCBhY3Jvc3MgTUNVcyAqLwotICBiaXRfYnVmX3R5cGUgZ2V0X2J1ZmZlcjsJLyogY3VycmVudCBiaXQtZXh0cmFjdGlvbiBidWZmZXIgKi8KLSAgaW50IGJpdHNfbGVmdDsJCS8qICMgb2YgdW51c2VkIGJpdHMgaW4gaXQgKi8KLX0gYml0cmVhZF9wZXJtX3N0YXRlOwotCi10eXBlZGVmIHN0cnVjdCB7CQkvKiBCaXRyZWFkaW5nIHdvcmtpbmcgc3RhdGUgd2l0aGluIGFuIE1DVSAqLwotICAvKiBDdXJyZW50IGRhdGEgc291cmNlIGxvY2F0aW9uICovCi0gIC8qIFdlIG5lZWQgYSBjb3B5LCByYXRoZXIgdGhhbiBtdW5naW5nIHRoZSBvcmlnaW5hbCwgaW4gY2FzZSBvZiBzdXNwZW5zaW9uICovCi0gIGNvbnN0IEpPQ1RFVCAqIG5leHRfaW5wdXRfYnl0ZTsgLyogPT4gbmV4dCBieXRlIHRvIHJlYWQgZnJvbSBzb3VyY2UgKi8KLSAgc2l6ZV90IGJ5dGVzX2luX2J1ZmZlcjsJLyogIyBvZiBieXRlcyByZW1haW5pbmcgaW4gc291cmNlIGJ1ZmZlciAqLwotICAvKiBCaXQgaW5wdXQgYnVmZmVyIC0tLSBub3RlIHRoZXNlIHZhbHVlcyBhcmUga2VwdCBpbiByZWdpc3RlciB2YXJpYWJsZXMsCi0gICAqIG5vdCBpbiB0aGlzIHN0cnVjdCwgaW5zaWRlIHRoZSBpbm5lciBsb29wcy4KLSAgICovCi0gIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyOwkvKiBjdXJyZW50IGJpdC1leHRyYWN0aW9uIGJ1ZmZlciAqLwotICBpbnQgYml0c19sZWZ0OwkJLyogIyBvZiB1bnVzZWQgYml0cyBpbiBpdCAqLwotICAvKiBQb2ludGVyIG5lZWRlZCBieSBqcGVnX2ZpbGxfYml0X2J1ZmZlci4gKi8KLSAgal9kZWNvbXByZXNzX3B0ciBjaW5mbzsJLyogYmFjayBsaW5rIHRvIGRlY29tcHJlc3MgbWFzdGVyIHJlY29yZCAqLwotfSBiaXRyZWFkX3dvcmtpbmdfc3RhdGU7Ci0KLS8qIE1hY3JvcyB0byBkZWNsYXJlIGFuZCBsb2FkL3NhdmUgYml0cmVhZCBsb2NhbCB2YXJpYWJsZXMuICovCi0jZGVmaW5lIEJJVFJFQURfU1RBVEVfVkFSUyAgXAotCXJlZ2lzdGVyIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyOyAgXAotCXJlZ2lzdGVyIGludCBiaXRzX2xlZnQ7ICBcCi0JYml0cmVhZF93b3JraW5nX3N0YXRlIGJyX3N0YXRlCi0KLSNkZWZpbmUgQklUUkVBRF9MT0FEX1NUQVRFKGNpbmZvcCxwZXJtc3RhdGUpICBcCi0JYnJfc3RhdGUuY2luZm8gPSBjaW5mb3A7IFwKLQlicl9zdGF0ZS5uZXh0X2lucHV0X2J5dGUgPSBjaW5mb3AtPnNyYy0+bmV4dF9pbnB1dF9ieXRlOyBcCi0JYnJfc3RhdGUuYnl0ZXNfaW5fYnVmZmVyID0gY2luZm9wLT5zcmMtPmJ5dGVzX2luX2J1ZmZlcjsgXAotCWdldF9idWZmZXIgPSBwZXJtc3RhdGUuZ2V0X2J1ZmZlcjsgXAotCWJpdHNfbGVmdCA9IHBlcm1zdGF0ZS5iaXRzX2xlZnQ7Ci0KLSNkZWZpbmUgQklUUkVBRF9TQVZFX1NUQVRFKGNpbmZvcCxwZXJtc3RhdGUpICBcCi0JY2luZm9wLT5zcmMtPm5leHRfaW5wdXRfYnl0ZSA9IGJyX3N0YXRlLm5leHRfaW5wdXRfYnl0ZTsgXAotCWNpbmZvcC0+c3JjLT5ieXRlc19pbl9idWZmZXIgPSBicl9zdGF0ZS5ieXRlc19pbl9idWZmZXI7IFwKLQlwZXJtc3RhdGUuZ2V0X2J1ZmZlciA9IGdldF9idWZmZXI7IFwKLQlwZXJtc3RhdGUuYml0c19sZWZ0ID0gYml0c19sZWZ0Ci0KLS8qCi0gKiBUaGVzZSBtYWNyb3MgcHJvdmlkZSB0aGUgaW4tbGluZSBwb3J0aW9uIG9mIGJpdCBmZXRjaGluZy4KLSAqIFVzZSBDSEVDS19CSVRfQlVGRkVSIHRvIGVuc3VyZSB0aGVyZSBhcmUgTiBiaXRzIGluIGdldF9idWZmZXIKLSAqIGJlZm9yZSB1c2luZyBHRVRfQklUUywgUEVFS19CSVRTLCBvciBEUk9QX0JJVFMuCi0gKiBUaGUgdmFyaWFibGVzIGdldF9idWZmZXIgYW5kIGJpdHNfbGVmdCBhcmUgYXNzdW1lZCB0byBiZSBsb2NhbHMsCi0gKiBidXQgdGhlIHN0YXRlIHN0cnVjdCBtaWdodCBub3QgYmUgKGpwZWdfaHVmZl9kZWNvZGUgbmVlZHMgdGhpcykuCi0gKglDSEVDS19CSVRfQlVGRkVSKHN0YXRlLG4sYWN0aW9uKTsKLSAqCQlFbnN1cmUgdGhlcmUgYXJlIE4gYml0cyBpbiBnZXRfYnVmZmVyOyBpZiBzdXNwZW5kLCB0YWtlIGFjdGlvbi4KLSAqICAgICAgdmFsID0gR0VUX0JJVFMobik7Ci0gKgkJRmV0Y2ggbmV4dCBOIGJpdHMuCi0gKiAgICAgIHZhbCA9IFBFRUtfQklUUyhuKTsKLSAqCQlGZXRjaCBuZXh0IE4gYml0cyB3aXRob3V0IHJlbW92aW5nIHRoZW0gZnJvbSB0aGUgYnVmZmVyLgotICoJRFJPUF9CSVRTKG4pOwotICoJCURpc2NhcmQgbmV4dCBOIGJpdHMuCi0gKiBUaGUgdmFsdWUgTiBzaG91bGQgYmUgYSBzaW1wbGUgdmFyaWFibGUsIG5vdCBhbiBleHByZXNzaW9uLCBiZWNhdXNlIGl0Ci0gKiBpcyBldmFsdWF0ZWQgbXVsdGlwbGUgdGltZXMuCi0gKi8KLQotI2RlZmluZSBDSEVDS19CSVRfQlVGRkVSKHN0YXRlLG5iaXRzLGFjdGlvbikgXAotCXsgaWYgKGJpdHNfbGVmdCA8IChuYml0cykpIHsgIFwKLQkgICAgaWYgKCEganBlZ19maWxsX2JpdF9idWZmZXIoJihzdGF0ZSksZ2V0X2J1ZmZlcixiaXRzX2xlZnQsbmJpdHMpKSAgXAotCSAgICAgIHsgYWN0aW9uOyB9ICBcCi0JICAgIGdldF9idWZmZXIgPSAoc3RhdGUpLmdldF9idWZmZXI7IGJpdHNfbGVmdCA9IChzdGF0ZSkuYml0c19sZWZ0OyB9IH0KLQotI2RlZmluZSBHRVRfQklUUyhuYml0cykgXAotCSgoKGludCkgKGdldF9idWZmZXIgPj4gKGJpdHNfbGVmdCAtPSAobmJpdHMpKSkpICYgKCgxPDwobmJpdHMpKS0xKSkKLQotI2RlZmluZSBQRUVLX0JJVFMobmJpdHMpIFwKLQkoKChpbnQpIChnZXRfYnVmZmVyID4+IChiaXRzX2xlZnQgLSAgKG5iaXRzKSkpKSAmICgoMTw8KG5iaXRzKSktMSkpCi0KLSNkZWZpbmUgRFJPUF9CSVRTKG5iaXRzKSBcCi0JKGJpdHNfbGVmdCAtPSAobmJpdHMpKQotCi0vKiBMb2FkIHVwIHRoZSBiaXQgYnVmZmVyIHRvIGEgZGVwdGggb2YgYXQgbGVhc3QgbmJpdHMgKi8KLUVYVEVSTihib29sZWFuKSBqcGVnX2ZpbGxfYml0X2J1ZmZlcgotCUpQUCgoYml0cmVhZF93b3JraW5nX3N0YXRlICogc3RhdGUsIHJlZ2lzdGVyIGJpdF9idWZfdHlwZSBnZXRfYnVmZmVyLAotCSAgICAgcmVnaXN0ZXIgaW50IGJpdHNfbGVmdCwgaW50IG5iaXRzKSk7Ci0KLQotLyoKLSAqIENvZGUgZm9yIGV4dHJhY3RpbmcgbmV4dCBIdWZmbWFuLWNvZGVkIHN5bWJvbCBmcm9tIGlucHV0IGJpdCBzdHJlYW0uCi0gKiBBZ2FpbiwgdGhpcyBpcyB0aW1lLWNyaXRpY2FsIGFuZCB3ZSBtYWtlIHRoZSBtYWluIHBhdGhzIGJlIG1hY3Jvcy4KLSAqCi0gKiBXZSB1c2UgYSBsb29rYWhlYWQgdGFibGUgdG8gcHJvY2VzcyBjb2RlcyBvZiB1cCB0byBIVUZGX0xPT0tBSEVBRCBiaXRzCi0gKiB3aXRob3V0IGxvb3BpbmcuICBVc3VhbGx5LCBtb3JlIHRoYW4gOTUlIG9mIHRoZSBIdWZmbWFuIGNvZGVzIHdpbGwgYmUgOAotICogb3IgZmV3ZXIgYml0cyBsb25nLiAgVGhlIGZldyBvdmVybGVuZ3RoIGNvZGVzIGFyZSBoYW5kbGVkIHdpdGggYSBsb29wLAotICogd2hpY2ggbmVlZCBub3QgYmUgaW5saW5lIGNvZGUuCi0gKgotICogTm90ZXMgYWJvdXQgdGhlIEhVRkZfREVDT0RFIG1hY3JvOgotICogMS4gTmVhciB0aGUgZW5kIG9mIHRoZSBkYXRhIHNlZ21lbnQsIHdlIG1heSBmYWlsIHRvIGdldCBlbm91Z2ggYml0cwotICogICAgZm9yIGEgbG9va2FoZWFkLiAgSW4gdGhhdCBjYXNlLCB3ZSBkbyBpdCB0aGUgaGFyZCB3YXkuCi0gKiAyLiBJZiB0aGUgbG9va2FoZWFkIHRhYmxlIGNvbnRhaW5zIG5vIGVudHJ5LCB0aGUgbmV4dCBjb2RlIG11c3QgYmUKLSAqICAgIG1vcmUgdGhhbiBIVUZGX0xPT0tBSEVBRCBiaXRzIGxvbmcuCi0gKiAzLiBqcGVnX2h1ZmZfZGVjb2RlIHJldHVybnMgLTEgaWYgZm9yY2VkIHRvIHN1c3BlbmQuCi0gKi8KLQotI2RlZmluZSBIVUZGX0RFQ09ERShyZXN1bHQsc3RhdGUsaHRibCxmYWlsYWN0aW9uLHNsb3dsYWJlbCkgXAoteyByZWdpc3RlciBpbnQgbmIsIGxvb2s7IFwKLSAgaWYgKGJpdHNfbGVmdCA8IEhVRkZfTE9PS0FIRUFEKSB7IFwKLSAgICBpZiAoISBqcGVnX2ZpbGxfYml0X2J1ZmZlcigmc3RhdGUsZ2V0X2J1ZmZlcixiaXRzX2xlZnQsIDApKSB7ZmFpbGFjdGlvbjt9IFwKLSAgICBnZXRfYnVmZmVyID0gc3RhdGUuZ2V0X2J1ZmZlcjsgYml0c19sZWZ0ID0gc3RhdGUuYml0c19sZWZ0OyBcCi0gICAgaWYgKGJpdHNfbGVmdCA8IEhVRkZfTE9PS0FIRUFEKSB7IFwKLSAgICAgIG5iID0gMTsgZ290byBzbG93bGFiZWw7IFwKLSAgICB9IFwKLSAgfSBcCi0gIGxvb2sgPSBQRUVLX0JJVFMoSFVGRl9MT09LQUhFQUQpOyBcCi0gIGlmICgobmIgPSBodGJsLT5sb29rX25iaXRzW2xvb2tdKSAhPSAwKSB7IFwKLSAgICBEUk9QX0JJVFMobmIpOyBcCi0gICAgcmVzdWx0ID0gaHRibC0+bG9va19zeW1bbG9va107IFwKLSAgfSBlbHNlIHsgXAotICAgIG5iID0gSFVGRl9MT09LQUhFQUQrMTsgXAotc2xvd2xhYmVsOiBcCi0gICAgaWYgKChyZXN1bHQ9anBlZ19odWZmX2RlY29kZSgmc3RhdGUsZ2V0X2J1ZmZlcixiaXRzX2xlZnQsaHRibCxuYikpIDwgMCkgXAotCXsgZmFpbGFjdGlvbjsgfSBcCi0gICAgZ2V0X2J1ZmZlciA9IHN0YXRlLmdldF9idWZmZXI7IGJpdHNfbGVmdCA9IHN0YXRlLmJpdHNfbGVmdDsgXAotICB9IFwKLX0KLQotLyogT3V0LW9mLWxpbmUgY2FzZSBmb3IgSHVmZm1hbiBjb2RlIGZldGNoaW5nICovCi1FWFRFUk4oaW50KSBqcGVnX2h1ZmZfZGVjb2RlCi0JSlBQKChiaXRyZWFkX3dvcmtpbmdfc3RhdGUgKiBzdGF0ZSwgcmVnaXN0ZXIgYml0X2J1Zl90eXBlIGdldF9idWZmZXIsCi0JICAgICByZWdpc3RlciBpbnQgYml0c19sZWZ0LCBkX2Rlcml2ZWRfdGJsICogaHRibCwgaW50IG1pbl9iaXRzKSk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2plcnJvci5oIGIvdGhpcmRfcGFydHkvbGlianBlZy9qZXJyb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZkMzQ0MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJqcGVnL2plcnJvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qCi0gKiBqZXJyb3IuaAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBmaWxlIGRlZmluZXMgdGhlIGVycm9yIGFuZCBtZXNzYWdlIGNvZGVzIGZvciB0aGUgSlBFRyBsaWJyYXJ5LgotICogRWRpdCB0aGlzIGZpbGUgdG8gYWRkIG5ldyBjb2Rlcywgb3IgdG8gdHJhbnNsYXRlIHRoZSBtZXNzYWdlIHN0cmluZ3MgdG8KLSAqIHNvbWUgb3RoZXIgbGFuZ3VhZ2UuCi0gKiBBIHNldCBvZiBlcnJvci1yZXBvcnRpbmcgbWFjcm9zIGFyZSBkZWZpbmVkIHRvby4gIFNvbWUgYXBwbGljYXRpb25zIHVzaW5nCi0gKiB0aGUgSlBFRyBsaWJyYXJ5IG1heSB3aXNoIHRvIGluY2x1ZGUgdGhpcyBmaWxlIHRvIGdldCB0aGUgZXJyb3IgY29kZXMKLSAqIGFuZC9vciB0aGUgbWFjcm9zLgotICovCi0KLS8qCi0gKiBUbyBkZWZpbmUgdGhlIGVudW0gbGlzdCBvZiBtZXNzYWdlIGNvZGVzLCBpbmNsdWRlIHRoaXMgZmlsZSB3aXRob3V0Ci0gKiBkZWZpbmluZyBtYWNybyBKTUVTU0FHRS4gIFRvIGNyZWF0ZSBhIG1lc3NhZ2Ugc3RyaW5nIHRhYmxlLCBpbmNsdWRlIGl0Ci0gKiBhZ2FpbiB3aXRoIGEgc3VpdGFibGUgSk1FU1NBR0UgZGVmaW5pdGlvbiAoc2VlIGplcnJvci5jIGZvciBhbiBleGFtcGxlKS4KLSAqLwotI2lmbmRlZiBKTUVTU0FHRQotI2lmbmRlZiBKRVJST1JfSAotLyogRmlyc3QgdGltZSB0aHJvdWdoLCBkZWZpbmUgdGhlIGVudW0gbGlzdCAqLwotI2RlZmluZSBKTUFLRV9FTlVNX0xJU1QKLSNlbHNlCi0vKiBSZXBlYXRlZCBpbmNsdXNpb25zIG9mIHRoaXMgZmlsZSBhcmUgbm8tb3BzIHVubGVzcyBKTUVTU0FHRSBpcyBkZWZpbmVkICovCi0jZGVmaW5lIEpNRVNTQUdFKGNvZGUsc3RyaW5nKQotI2VuZGlmIC8qIEpFUlJPUl9IICovCi0jZW5kaWYgLyogSk1FU1NBR0UgKi8KLQotI2lmZGVmIEpNQUtFX0VOVU1fTElTVAotCi10eXBlZGVmIGVudW0gewotCi0jZGVmaW5lIEpNRVNTQUdFKGNvZGUsc3RyaW5nKQljb2RlICwKLQotI2VuZGlmIC8qIEpNQUtFX0VOVU1fTElTVCAqLwotCi1KTUVTU0FHRShKTVNHX05PTUVTU0FHRSwgIkJvZ3VzIG1lc3NhZ2UgY29kZSAlZCIpIC8qIE11c3QgYmUgZmlyc3QgZW50cnkhICovCi0KLS8qIEZvciBtYWludGVuYW5jZSBjb252ZW5pZW5jZSwgbGlzdCBpcyBhbHBoYWJldGljYWwgYnkgbWVzc2FnZSBjb2RlIG5hbWUgKi8KLUpNRVNTQUdFKEpFUlJfQVJJVEhfTk9USU1QTCwKLQkgIlNvcnJ5LCB0aGVyZSBhcmUgbGVnYWwgcmVzdHJpY3Rpb25zIG9uIGFyaXRobWV0aWMgY29kaW5nIikKLUpNRVNTQUdFKEpFUlJfQkFEX0FMSUdOX1RZUEUsICJBTElHTl9UWVBFIGlzIHdyb25nLCBwbGVhc2UgZml4IikKLUpNRVNTQUdFKEpFUlJfQkFEX0FMTE9DX0NIVU5LLCAiTUFYX0FMTE9DX0NIVU5LIGlzIHdyb25nLCBwbGVhc2UgZml4IikKLUpNRVNTQUdFKEpFUlJfQkFEX0JVRkZFUl9NT0RFLCAiQm9ndXMgYnVmZmVyIGNvbnRyb2wgbW9kZSIpCi1KTUVTU0FHRShKRVJSX0JBRF9DT01QT05FTlRfSUQsICJJbnZhbGlkIGNvbXBvbmVudCBJRCAlZCBpbiBTT1MiKQotSk1FU1NBR0UoSkVSUl9CQURfRENUX0NPRUYsICJEQ1QgY29lZmZpY2llbnQgb3V0IG9mIHJhbmdlIikKLUpNRVNTQUdFKEpFUlJfQkFEX0RDVFNJWkUsICJJRENUIG91dHB1dCBibG9jayBzaXplICVkIG5vdCBzdXBwb3J0ZWQiKQotSk1FU1NBR0UoSkVSUl9CQURfSFVGRl9UQUJMRSwgIkJvZ3VzIEh1ZmZtYW4gdGFibGUgZGVmaW5pdGlvbiIpCi1KTUVTU0FHRShKRVJSX0JBRF9JTl9DT0xPUlNQQUNFLCAiQm9ndXMgaW5wdXQgY29sb3JzcGFjZSIpCi1KTUVTU0FHRShKRVJSX0JBRF9KX0NPTE9SU1BBQ0UsICJCb2d1cyBKUEVHIGNvbG9yc3BhY2UiKQotSk1FU1NBR0UoSkVSUl9CQURfTEVOR1RILCAiQm9ndXMgbWFya2VyIGxlbmd0aCIpCi1KTUVTU0FHRShKRVJSX0JBRF9MSUJfVkVSU0lPTiwKLQkgIldyb25nIEpQRUcgbGlicmFyeSB2ZXJzaW9uOiBsaWJyYXJ5IGlzICVkLCBjYWxsZXIgZXhwZWN0cyAlZCIpCi1KTUVTU0FHRShKRVJSX0JBRF9NQ1VfU0laRSwgIlNhbXBsaW5nIGZhY3RvcnMgdG9vIGxhcmdlIGZvciBpbnRlcmxlYXZlZCBzY2FuIikKLUpNRVNTQUdFKEpFUlJfQkFEX1BPT0xfSUQsICJJbnZhbGlkIG1lbW9yeSBwb29sIGNvZGUgJWQiKQotSk1FU1NBR0UoSkVSUl9CQURfUFJFQ0lTSU9OLCAiVW5zdXBwb3J0ZWQgSlBFRyBkYXRhIHByZWNpc2lvbiAlZCIpCi1KTUVTU0FHRShKRVJSX0JBRF9QUk9HUkVTU0lPTiwKLQkgIkludmFsaWQgcHJvZ3Jlc3NpdmUgcGFyYW1ldGVycyBTcz0lZCBTZT0lZCBBaD0lZCBBbD0lZCIpCi1KTUVTU0FHRShKRVJSX0JBRF9QUk9HX1NDUklQVCwKLQkgIkludmFsaWQgcHJvZ3Jlc3NpdmUgcGFyYW1ldGVycyBhdCBzY2FuIHNjcmlwdCBlbnRyeSAlZCIpCi1KTUVTU0FHRShKRVJSX0JBRF9TQU1QTElORywgIkJvZ3VzIHNhbXBsaW5nIGZhY3RvcnMiKQotSk1FU1NBR0UoSkVSUl9CQURfU0NBTl9TQ1JJUFQsICJJbnZhbGlkIHNjYW4gc2NyaXB0IGF0IGVudHJ5ICVkIikKLUpNRVNTQUdFKEpFUlJfQkFEX1NUQVRFLCAiSW1wcm9wZXIgY2FsbCB0byBKUEVHIGxpYnJhcnkgaW4gc3RhdGUgJWQiKQotSk1FU1NBR0UoSkVSUl9CQURfU1RSVUNUX1NJWkUsCi0JICJKUEVHIHBhcmFtZXRlciBzdHJ1Y3QgbWlzbWF0Y2g6IGxpYnJhcnkgdGhpbmtzIHNpemUgaXMgJXUsIGNhbGxlciBleHBlY3RzICV1IikKLUpNRVNTQUdFKEpFUlJfQkFEX1ZJUlRVQUxfQUNDRVNTLCAiQm9ndXMgdmlydHVhbCBhcnJheSBhY2Nlc3MiKQotSk1FU1NBR0UoSkVSUl9CVUZGRVJfU0laRSwgIkJ1ZmZlciBwYXNzZWQgdG8gSlBFRyBsaWJyYXJ5IGlzIHRvbyBzbWFsbCIpCi1KTUVTU0FHRShKRVJSX0NBTlRfU1VTUEVORCwgIlN1c3BlbnNpb24gbm90IGFsbG93ZWQgaGVyZSIpCi1KTUVTU0FHRShKRVJSX0NDSVI2MDFfTk9USU1QTCwgIkNDSVI2MDEgc2FtcGxpbmcgbm90IGltcGxlbWVudGVkIHlldCIpCi1KTUVTU0FHRShKRVJSX0NPTVBPTkVOVF9DT1VOVCwgIlRvbyBtYW55IGNvbG9yIGNvbXBvbmVudHM6ICVkLCBtYXggJWQiKQotSk1FU1NBR0UoSkVSUl9DT05WRVJTSU9OX05PVElNUEwsICJVbnN1cHBvcnRlZCBjb2xvciBjb252ZXJzaW9uIHJlcXVlc3QiKQotSk1FU1NBR0UoSkVSUl9EQUNfSU5ERVgsICJCb2d1cyBEQUMgaW5kZXggJWQiKQotSk1FU1NBR0UoSkVSUl9EQUNfVkFMVUUsICJCb2d1cyBEQUMgdmFsdWUgMHgleCIpCi1KTUVTU0FHRShKRVJSX0RIVF9JTkRFWCwgIkJvZ3VzIERIVCBpbmRleCAlZCIpCi1KTUVTU0FHRShKRVJSX0RRVF9JTkRFWCwgIkJvZ3VzIERRVCBpbmRleCAlZCIpCi1KTUVTU0FHRShKRVJSX0VNUFRZX0lNQUdFLCAiRW1wdHkgSlBFRyBpbWFnZSAoRE5MIG5vdCBzdXBwb3J0ZWQpIikKLUpNRVNTQUdFKEpFUlJfRU1TX1JFQUQsICJSZWFkIGZyb20gRU1TIGZhaWxlZCIpCi1KTUVTU0FHRShKRVJSX0VNU19XUklURSwgIldyaXRlIHRvIEVNUyBmYWlsZWQiKQotSk1FU1NBR0UoSkVSUl9FT0lfRVhQRUNURUQsICJEaWRuJ3QgZXhwZWN0IG1vcmUgdGhhbiBvbmUgc2NhbiIpCi1KTUVTU0FHRShKRVJSX0ZJTEVfUkVBRCwgIklucHV0IGZpbGUgcmVhZCBlcnJvciIpCi1KTUVTU0FHRShKRVJSX0ZJTEVfV1JJVEUsICJPdXRwdXQgZmlsZSB3cml0ZSBlcnJvciAtLS0gb3V0IG9mIGRpc2sgc3BhY2U/IikKLUpNRVNTQUdFKEpFUlJfRlJBQ1RfU0FNUExFX05PVElNUEwsICJGcmFjdGlvbmFsIHNhbXBsaW5nIG5vdCBpbXBsZW1lbnRlZCB5ZXQiKQotSk1FU1NBR0UoSkVSUl9IVUZGX0NMRU5fT1ZFUkZMT1csICJIdWZmbWFuIGNvZGUgc2l6ZSB0YWJsZSBvdmVyZmxvdyIpCi1KTUVTU0FHRShKRVJSX0hVRkZfTUlTU0lOR19DT0RFLCAiTWlzc2luZyBIdWZmbWFuIGNvZGUgdGFibGUgZW50cnkiKQotSk1FU1NBR0UoSkVSUl9JTUFHRV9UT09fQklHLCAiTWF4aW11bSBzdXBwb3J0ZWQgaW1hZ2UgZGltZW5zaW9uIGlzICV1IHBpeGVscyIpCi1KTUVTU0FHRShKRVJSX0lOUFVUX0VNUFRZLCAiRW1wdHkgaW5wdXQgZmlsZSIpCi1KTUVTU0FHRShKRVJSX0lOUFVUX0VPRiwgIlByZW1hdHVyZSBlbmQgb2YgaW5wdXQgZmlsZSIpCi1KTUVTU0FHRShKRVJSX01JU01BVENIRURfUVVBTlRfVEFCTEUsCi0JICJDYW5ub3QgdHJhbnNjb2RlIGR1ZSB0byBtdWx0aXBsZSB1c2Ugb2YgcXVhbnRpemF0aW9uIHRhYmxlICVkIikKLUpNRVNTQUdFKEpFUlJfTUlTU0lOR19EQVRBLCAiU2NhbiBzY3JpcHQgZG9lcyBub3QgdHJhbnNtaXQgYWxsIGRhdGEiKQotSk1FU1NBR0UoSkVSUl9NT0RFX0NIQU5HRSwgIkludmFsaWQgY29sb3IgcXVhbnRpemF0aW9uIG1vZGUgY2hhbmdlIikKLUpNRVNTQUdFKEpFUlJfTk9USU1QTCwgIk5vdCBpbXBsZW1lbnRlZCB5ZXQiKQotSk1FU1NBR0UoSkVSUl9OT1RfQ09NUElMRUQsICJSZXF1ZXN0ZWQgZmVhdHVyZSB3YXMgb21pdHRlZCBhdCBjb21waWxlIHRpbWUiKQotSk1FU1NBR0UoSkVSUl9OT19CQUNLSU5HX1NUT1JFLCAiQmFja2luZyBzdG9yZSBub3Qgc3VwcG9ydGVkIikKLUpNRVNTQUdFKEpFUlJfTk9fSFVGRl9UQUJMRSwgIkh1ZmZtYW4gdGFibGUgMHglMDJ4IHdhcyBub3QgZGVmaW5lZCIpCi1KTUVTU0FHRShKRVJSX05PX0lNQUdFLCAiSlBFRyBkYXRhc3RyZWFtIGNvbnRhaW5zIG5vIGltYWdlIikKLUpNRVNTQUdFKEpFUlJfTk9fUVVBTlRfVEFCTEUsICJRdWFudGl6YXRpb24gdGFibGUgMHglMDJ4IHdhcyBub3QgZGVmaW5lZCIpCi1KTUVTU0FHRShKRVJSX05PX1NPSSwgIk5vdCBhIEpQRUcgZmlsZTogc3RhcnRzIHdpdGggMHglMDJ4IDB4JTAyeCIpCi1KTUVTU0FHRShKRVJSX09VVF9PRl9NRU1PUlksICJJbnN1ZmZpY2llbnQgbWVtb3J5IChjYXNlICVkKSIpCi1KTUVTU0FHRShKRVJSX1FVQU5UX0NPTVBPTkVOVFMsCi0JICJDYW5ub3QgcXVhbnRpemUgbW9yZSB0aGFuICVkIGNvbG9yIGNvbXBvbmVudHMiKQotSk1FU1NBR0UoSkVSUl9RVUFOVF9GRVdfQ09MT1JTLCAiQ2Fubm90IHF1YW50aXplIHRvIGZld2VyIHRoYW4gJWQgY29sb3JzIikKLUpNRVNTQUdFKEpFUlJfUVVBTlRfTUFOWV9DT0xPUlMsICJDYW5ub3QgcXVhbnRpemUgdG8gbW9yZSB0aGFuICVkIGNvbG9ycyIpCi1KTUVTU0FHRShKRVJSX1NPRl9EVVBMSUNBVEUsICJJbnZhbGlkIEpQRUcgZmlsZSBzdHJ1Y3R1cmU6IHR3byBTT0YgbWFya2VycyIpCi1KTUVTU0FHRShKRVJSX1NPRl9OT19TT1MsICJJbnZhbGlkIEpQRUcgZmlsZSBzdHJ1Y3R1cmU6IG1pc3NpbmcgU09TIG1hcmtlciIpCi1KTUVTU0FHRShKRVJSX1NPRl9VTlNVUFBPUlRFRCwgIlVuc3VwcG9ydGVkIEpQRUcgcHJvY2VzczogU09GIHR5cGUgMHglMDJ4IikKLUpNRVNTQUdFKEpFUlJfU09JX0RVUExJQ0FURSwgIkludmFsaWQgSlBFRyBmaWxlIHN0cnVjdHVyZTogdHdvIFNPSSBtYXJrZXJzIikKLUpNRVNTQUdFKEpFUlJfU09TX05PX1NPRiwgIkludmFsaWQgSlBFRyBmaWxlIHN0cnVjdHVyZTogU09TIGJlZm9yZSBTT0YiKQotSk1FU1NBR0UoSkVSUl9URklMRV9DUkVBVEUsICJGYWlsZWQgdG8gY3JlYXRlIHRlbXBvcmFyeSBmaWxlICVzIikKLUpNRVNTQUdFKEpFUlJfVEZJTEVfUkVBRCwgIlJlYWQgZmFpbGVkIG9uIHRlbXBvcmFyeSBmaWxlIikKLUpNRVNTQUdFKEpFUlJfVEZJTEVfU0VFSywgIlNlZWsgZmFpbGVkIG9uIHRlbXBvcmFyeSBmaWxlIikKLUpNRVNTQUdFKEpFUlJfVEZJTEVfV1JJVEUsCi0JICJXcml0ZSBmYWlsZWQgb24gdGVtcG9yYXJ5IGZpbGUgLS0tIG91dCBvZiBkaXNrIHNwYWNlPyIpCi1KTUVTU0FHRShKRVJSX1RPT19MSVRUTEVfREFUQSwgIkFwcGxpY2F0aW9uIHRyYW5zZmVycmVkIHRvbyBmZXcgc2NhbmxpbmVzIikKLUpNRVNTQUdFKEpFUlJfVU5LTk9XTl9NQVJLRVIsICJVbnN1cHBvcnRlZCBtYXJrZXIgdHlwZSAweCUwMngiKQotSk1FU1NBR0UoSkVSUl9WSVJUVUFMX0JVRywgIlZpcnR1YWwgYXJyYXkgY29udHJvbGxlciBtZXNzZWQgdXAiKQotSk1FU1NBR0UoSkVSUl9XSURUSF9PVkVSRkxPVywgIkltYWdlIHRvbyB3aWRlIGZvciB0aGlzIGltcGxlbWVudGF0aW9uIikKLUpNRVNTQUdFKEpFUlJfWE1TX1JFQUQsICJSZWFkIGZyb20gWE1TIGZhaWxlZCIpCi1KTUVTU0FHRShKRVJSX1hNU19XUklURSwgIldyaXRlIHRvIFhNUyBmYWlsZWQiKQotSk1FU1NBR0UoSk1TR19DT1BZUklHSFQsIEpDT1BZUklHSFQpCi1KTUVTU0FHRShKTVNHX1ZFUlNJT04sIEpWRVJTSU9OKQotSk1FU1NBR0UoSlRSQ18xNkJJVF9UQUJMRVMsCi0JICJDYXV0aW9uOiBxdWFudGl6YXRpb24gdGFibGVzIGFyZSB0b28gY29hcnNlIGZvciBiYXNlbGluZSBKUEVHIikKLUpNRVNTQUdFKEpUUkNfQURPQkUsCi0JICJBZG9iZSBBUFAxNCBtYXJrZXI6IHZlcnNpb24gJWQsIGZsYWdzIDB4JTA0eCAweCUwNHgsIHRyYW5zZm9ybSAlZCIpCi1KTUVTU0FHRShKVFJDX0FQUDAsICJVbmtub3duIEFQUDAgbWFya2VyIChub3QgSkZJRiksIGxlbmd0aCAldSIpCi1KTUVTU0FHRShKVFJDX0FQUDE0LCAiVW5rbm93biBBUFAxNCBtYXJrZXIgKG5vdCBBZG9iZSksIGxlbmd0aCAldSIpCi1KTUVTU0FHRShKVFJDX0RBQywgIkRlZmluZSBBcml0aG1ldGljIFRhYmxlIDB4JTAyeDogMHglMDJ4IikKLUpNRVNTQUdFKEpUUkNfREhULCAiRGVmaW5lIEh1ZmZtYW4gVGFibGUgMHglMDJ4IikKLUpNRVNTQUdFKEpUUkNfRFFULCAiRGVmaW5lIFF1YW50aXphdGlvbiBUYWJsZSAlZCAgcHJlY2lzaW9uICVkIikKLUpNRVNTQUdFKEpUUkNfRFJJLCAiRGVmaW5lIFJlc3RhcnQgSW50ZXJ2YWwgJXUiKQotSk1FU1NBR0UoSlRSQ19FTVNfQ0xPU0UsICJGcmVlZCBFTVMgaGFuZGxlICV1IikKLUpNRVNTQUdFKEpUUkNfRU1TX09QRU4sICJPYnRhaW5lZCBFTVMgaGFuZGxlICV1IikKLUpNRVNTQUdFKEpUUkNfRU9JLCAiRW5kIE9mIEltYWdlIikKLUpNRVNTQUdFKEpUUkNfSFVGRkJJVFMsICIgICAgICAgICUzZCAlM2QgJTNkICUzZCAlM2QgJTNkICUzZCAlM2QiKQotSk1FU1NBR0UoSlRSQ19KRklGLCAiSkZJRiBBUFAwIG1hcmtlcjogdmVyc2lvbiAlZC4lMDJkLCBkZW5zaXR5ICVkeCVkICAlZCIpCi1KTUVTU0FHRShKVFJDX0pGSUZfQkFEVEhVTUJOQUlMU0laRSwKLQkgIldhcm5pbmc6IHRodW1ibmFpbCBpbWFnZSBzaXplIGRvZXMgbm90IG1hdGNoIGRhdGEgbGVuZ3RoICV1IikKLUpNRVNTQUdFKEpUUkNfSkZJRl9FWFRFTlNJT04sCi0JICJKRklGIGV4dGVuc2lvbiBtYXJrZXI6IHR5cGUgMHglMDJ4LCBsZW5ndGggJXUiKQotSk1FU1NBR0UoSlRSQ19KRklGX1RIVU1CTkFJTCwgIiAgICB3aXRoICVkIHggJWQgdGh1bWJuYWlsIGltYWdlIikKLUpNRVNTQUdFKEpUUkNfTUlTQ19NQVJLRVIsICJNaXNjZWxsYW5lb3VzIG1hcmtlciAweCUwMngsIGxlbmd0aCAldSIpCi1KTUVTU0FHRShKVFJDX1BBUk1MRVNTX01BUktFUiwgIlVuZXhwZWN0ZWQgbWFya2VyIDB4JTAyeCIpCi1KTUVTU0FHRShKVFJDX1FVQU5UVkFMUywgIiAgICAgICAgJTR1ICU0dSAlNHUgJTR1ICU0dSAlNHUgJTR1ICU0dSIpCi1KTUVTU0FHRShKVFJDX1FVQU5UXzNfTkNPTE9SUywgIlF1YW50aXppbmcgdG8gJWQgPSAlZColZColZCBjb2xvcnMiKQotSk1FU1NBR0UoSlRSQ19RVUFOVF9OQ09MT1JTLCAiUXVhbnRpemluZyB0byAlZCBjb2xvcnMiKQotSk1FU1NBR0UoSlRSQ19RVUFOVF9TRUxFQ1RFRCwgIlNlbGVjdGVkICVkIGNvbG9ycyBmb3IgcXVhbnRpemF0aW9uIikKLUpNRVNTQUdFKEpUUkNfUkVDT1ZFUllfQUNUSU9OLCAiQXQgbWFya2VyIDB4JTAyeCwgcmVjb3ZlcnkgYWN0aW9uICVkIikKLUpNRVNTQUdFKEpUUkNfUlNULCAiUlNUJWQiKQotSk1FU1NBR0UoSlRSQ19TTU9PVEhfTk9USU1QTCwKLQkgIlNtb290aGluZyBub3Qgc3VwcG9ydGVkIHdpdGggbm9uc3RhbmRhcmQgc2FtcGxpbmcgcmF0aW9zIikKLUpNRVNTQUdFKEpUUkNfU09GLCAiU3RhcnQgT2YgRnJhbWUgMHglMDJ4OiB3aWR0aD0ldSwgaGVpZ2h0PSV1LCBjb21wb25lbnRzPSVkIikKLUpNRVNTQUdFKEpUUkNfU09GX0NPTVBPTkVOVCwgIiAgICBDb21wb25lbnQgJWQ6ICVkaHglZHYgcT0lZCIpCi1KTUVTU0FHRShKVFJDX1NPSSwgIlN0YXJ0IG9mIEltYWdlIikKLUpNRVNTQUdFKEpUUkNfU09TLCAiU3RhcnQgT2YgU2NhbjogJWQgY29tcG9uZW50cyIpCi1KTUVTU0FHRShKVFJDX1NPU19DT01QT05FTlQsICIgICAgQ29tcG9uZW50ICVkOiBkYz0lZCBhYz0lZCIpCi1KTUVTU0FHRShKVFJDX1NPU19QQVJBTVMsICIgIFNzPSVkLCBTZT0lZCwgQWg9JWQsIEFsPSVkIikKLUpNRVNTQUdFKEpUUkNfVEZJTEVfQ0xPU0UsICJDbG9zZWQgdGVtcG9yYXJ5IGZpbGUgJXMiKQotSk1FU1NBR0UoSlRSQ19URklMRV9PUEVOLCAiT3BlbmVkIHRlbXBvcmFyeSBmaWxlICVzIikKLUpNRVNTQUdFKEpUUkNfVEhVTUJfSlBFRywKLQkgIkpGSUYgZXh0ZW5zaW9uIG1hcmtlcjogSlBFRy1jb21wcmVzc2VkIHRodW1ibmFpbCBpbWFnZSwgbGVuZ3RoICV1IikKLUpNRVNTQUdFKEpUUkNfVEhVTUJfUEFMRVRURSwKLQkgIkpGSUYgZXh0ZW5zaW9uIG1hcmtlcjogcGFsZXR0ZSB0aHVtYm5haWwgaW1hZ2UsIGxlbmd0aCAldSIpCi1KTUVTU0FHRShKVFJDX1RIVU1CX1JHQiwKLQkgIkpGSUYgZXh0ZW5zaW9uIG1hcmtlcjogUkdCIHRodW1ibmFpbCBpbWFnZSwgbGVuZ3RoICV1IikKLUpNRVNTQUdFKEpUUkNfVU5LTk9XTl9JRFMsCi0JICJVbnJlY29nbml6ZWQgY29tcG9uZW50IElEcyAlZCAlZCAlZCwgYXNzdW1pbmcgWUNiQ3IiKQotSk1FU1NBR0UoSlRSQ19YTVNfQ0xPU0UsICJGcmVlZCBYTVMgaGFuZGxlICV1IikKLUpNRVNTQUdFKEpUUkNfWE1TX09QRU4sICJPYnRhaW5lZCBYTVMgaGFuZGxlICV1IikKLUpNRVNTQUdFKEpXUk5fQURPQkVfWEZPUk0sICJVbmtub3duIEFkb2JlIGNvbG9yIHRyYW5zZm9ybSBjb2RlICVkIikKLUpNRVNTQUdFKEpXUk5fQk9HVVNfUFJPR1JFU1NJT04sCi0JICJJbmNvbnNpc3RlbnQgcHJvZ3Jlc3Npb24gc2VxdWVuY2UgZm9yIGNvbXBvbmVudCAlZCBjb2VmZmljaWVudCAlZCIpCi1KTUVTU0FHRShKV1JOX0VYVFJBTkVPVVNfREFUQSwKLQkgIkNvcnJ1cHQgSlBFRyBkYXRhOiAldSBleHRyYW5lb3VzIGJ5dGVzIGJlZm9yZSBtYXJrZXIgMHglMDJ4IikKLUpNRVNTQUdFKEpXUk5fSElUX01BUktFUiwgIkNvcnJ1cHQgSlBFRyBkYXRhOiBwcmVtYXR1cmUgZW5kIG9mIGRhdGEgc2VnbWVudCIpCi1KTUVTU0FHRShKV1JOX0hVRkZfQkFEX0NPREUsICJDb3JydXB0IEpQRUcgZGF0YTogYmFkIEh1ZmZtYW4gY29kZSIpCi1KTUVTU0FHRShKV1JOX0pGSUZfTUFKT1IsICJXYXJuaW5nOiB1bmtub3duIEpGSUYgcmV2aXNpb24gbnVtYmVyICVkLiUwMmQiKQotSk1FU1NBR0UoSldSTl9KUEVHX0VPRiwgIlByZW1hdHVyZSBlbmQgb2YgSlBFRyBmaWxlIikKLUpNRVNTQUdFKEpXUk5fTVVTVF9SRVNZTkMsCi0JICJDb3JydXB0IEpQRUcgZGF0YTogZm91bmQgbWFya2VyIDB4JTAyeCBpbnN0ZWFkIG9mIFJTVCVkIikKLUpNRVNTQUdFKEpXUk5fTk9UX1NFUVVFTlRJQUwsICJJbnZhbGlkIFNPUyBwYXJhbWV0ZXJzIGZvciBzZXF1ZW50aWFsIEpQRUciKQotSk1FU1NBR0UoSldSTl9UT09fTVVDSF9EQVRBLCAiQXBwbGljYXRpb24gdHJhbnNmZXJyZWQgdG9vIG1hbnkgc2NhbmxpbmVzIikKLQotI2lmZGVmIEpNQUtFX0VOVU1fTElTVAotCi0gIEpNU0dfTEFTVE1TR0NPREUKLX0gSl9NRVNTQUdFX0NPREU7Ci0KLSN1bmRlZiBKTUFLRV9FTlVNX0xJU1QKLSNlbmRpZiAvKiBKTUFLRV9FTlVNX0xJU1QgKi8KLQotLyogWmFwIEpNRVNTQUdFIG1hY3JvIHNvIHRoYXQgZnV0dXJlIHJlLWluY2x1c2lvbnMgZG8gbm90aGluZyBieSBkZWZhdWx0ICovCi0jdW5kZWYgSk1FU1NBR0UKLQotCi0jaWZuZGVmIEpFUlJPUl9ICi0jZGVmaW5lIEpFUlJPUl9ICi0KLS8qIE1hY3JvcyB0byBzaW1wbGlmeSB1c2luZyB0aGUgZXJyb3IgYW5kIHRyYWNlIG1lc3NhZ2Ugc3R1ZmYgKi8KLS8qIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgZWl0aGVyIHR5cGUgb2YgY2luZm8gcG9pbnRlciAqLwotCi0vKiBGYXRhbCBlcnJvcnMgKHByaW50IG1lc3NhZ2UgYW5kIGV4aXQpICovCi0jZGVmaW5lIEVSUkVYSVQoY2luZm8sY29kZSkgIFwKLSAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKLSAgICgqKGNpbmZvKS0+ZXJyLT5lcnJvcl9leGl0KSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSkpCi0jZGVmaW5lIEVSUkVYSVQxKGNpbmZvLGNvZGUscDEpICBcCi0gICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCi0gICAoKihjaW5mbyktPmVyci0+ZXJyb3JfZXhpdCkgKChqX2NvbW1vbl9wdHIpIChjaW5mbykpKQotI2RlZmluZSBFUlJFWElUMihjaW5mbyxjb2RlLHAxLHAyKSAgXAotICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAotICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzBdID0gKHAxKSwgXAotICAgKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pWzFdID0gKHAyKSwgXAotICAgKCooY2luZm8pLT5lcnItPmVycm9yX2V4aXQpICgoal9jb21tb25fcHRyKSAoY2luZm8pKSkKLSNkZWZpbmUgRVJSRVhJVDMoY2luZm8sY29kZSxwMSxwMixwMykgIFwKLSAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKLSAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVswXSA9IChwMSksIFwKLSAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsxXSA9IChwMiksIFwKLSAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsyXSA9IChwMyksIFwKLSAgICgqKGNpbmZvKS0+ZXJyLT5lcnJvcl9leGl0KSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSkpCi0jZGVmaW5lIEVSUkVYSVQ0KGNpbmZvLGNvZGUscDEscDIscDMscDQpICBcCi0gICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMV0gPSAocDIpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMl0gPSAocDMpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbM10gPSAocDQpLCBcCi0gICAoKihjaW5mbyktPmVyci0+ZXJyb3JfZXhpdCkgKChqX2NvbW1vbl9wdHIpIChjaW5mbykpKQotI2RlZmluZSBFUlJFWElUUyhjaW5mbyxjb2RlLHN0cikgIFwKLSAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKLSAgIEZYU1lTX3N0cm5jcHkoKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5zLCAoc3RyKSwgSk1TR19TVFJfUEFSTV9NQVgpLCBcCi0gICAoKihjaW5mbyktPmVyci0+ZXJyb3JfZXhpdCkgKChqX2NvbW1vbl9wdHIpIChjaW5mbykpKQotCi0jZGVmaW5lIE1BS0VTVE1UKHN0dWZmKQkJZG8geyBzdHVmZiB9IHdoaWxlICgwKQotCi0vKiBOb25mYXRhbCBlcnJvcnMgKHdlIGNhbiBrZWVwIGdvaW5nLCBidXQgdGhlIGRhdGEgaXMgcHJvYmFibHkgY29ycnVwdCkgKi8KLSNkZWZpbmUgV0FSTk1TKGNpbmZvLGNvZGUpICBcCi0gICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCi0gICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgLTEpKQotI2RlZmluZSBXQVJOTVMxKGNpbmZvLGNvZGUscDEpICBcCi0gICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCi0gICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgLTEpKQotI2RlZmluZSBXQVJOTVMyKGNpbmZvLGNvZGUscDEscDIpICBcCi0gICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMV0gPSAocDIpLCBcCi0gICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgLTEpKQotCi0vKiBJbmZvcm1hdGlvbmFsL2RlYnVnZ2luZyBtZXNzYWdlcyAqLwotI2RlZmluZSBUUkFDRU1TKGNpbmZvLGx2bCxjb2RlKSAgXAotICAoKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKSwgXAotICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKSkKLSNkZWZpbmUgVFJBQ0VNUzEoY2luZm8sbHZsLGNvZGUscDEpICBcCi0gICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCi0gICAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmlbMF0gPSAocDEpLCBcCi0gICAoKihjaW5mbyktPmVyci0+ZW1pdF9tZXNzYWdlKSAoKGpfY29tbW9uX3B0cikgKGNpbmZvKSwgKGx2bCkpKQotI2RlZmluZSBUUkFDRU1TMihjaW5mbyxsdmwsY29kZSxwMSxwMikgIFwKLSAgKChjaW5mbyktPmVyci0+bXNnX2NvZGUgPSAoY29kZSksIFwKLSAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVswXSA9IChwMSksIFwKLSAgIChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaVsxXSA9IChwMiksIFwKLSAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAobHZsKSkpCi0jZGVmaW5lIFRSQUNFTVMzKGNpbmZvLGx2bCxjb2RlLHAxLHAyLHAzKSAgXAotICBNQUtFU1RNVChpbnQgKiBfbXAgPSAoY2luZm8pLT5lcnItPm1zZ19wYXJtLmk7IFwKLQkgICBfbXBbMF0gPSAocDEpOyBfbXBbMV0gPSAocDIpOyBfbXBbMl0gPSAocDMpOyBcCi0JICAgKGNpbmZvKS0+ZXJyLT5tc2dfY29kZSA9IChjb2RlKTsgXAotCSAgICgqKGNpbmZvKS0+ZXJyLT5lbWl0X21lc3NhZ2UpICgoal9jb21tb25fcHRyKSAoY2luZm8pLCAobHZsKSk7ICkKLSNkZWZpbmUgVFJBQ0VNUzQoY2luZm8sbHZsLGNvZGUscDEscDIscDMscDQpICBcCi0gIE1BS0VTVE1UKGludCAqIF9tcCA9IChjaW5mbyktPmVyci0+bXNnX3Bhcm0uaTsgXAotCSAgIF9tcFswXSA9IChwMSk7IF9tcFsxXSA9IChwMik7IF9tcFsyXSA9IChwMyk7IF9tcFszXSA9IChwNCk7IFwKLQkgICAoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpOyBcCi0JICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKTsgKQotI2RlZmluZSBUUkFDRU1TNShjaW5mbyxsdmwsY29kZSxwMSxwMixwMyxwNCxwNSkgIFwKLSAgTUFLRVNUTVQoaW50ICogX21wID0gKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pOyBcCi0JICAgX21wWzBdID0gKHAxKTsgX21wWzFdID0gKHAyKTsgX21wWzJdID0gKHAzKTsgX21wWzNdID0gKHA0KTsgXAotCSAgIF9tcFs0XSA9IChwNSk7IFwKLQkgICAoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpOyBcCi0JICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKTsgKQotI2RlZmluZSBUUkFDRU1TOChjaW5mbyxsdmwsY29kZSxwMSxwMixwMyxwNCxwNSxwNixwNyxwOCkgIFwKLSAgTUFLRVNUTVQoaW50ICogX21wID0gKGNpbmZvKS0+ZXJyLT5tc2dfcGFybS5pOyBcCi0JICAgX21wWzBdID0gKHAxKTsgX21wWzFdID0gKHAyKTsgX21wWzJdID0gKHAzKTsgX21wWzNdID0gKHA0KTsgXAotCSAgIF9tcFs0XSA9IChwNSk7IF9tcFs1XSA9IChwNik7IF9tcFs2XSA9IChwNyk7IF9tcFs3XSA9IChwOCk7IFwKLQkgICAoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpOyBcCi0JICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKTsgKQotI2RlZmluZSBUUkFDRU1TUyhjaW5mbyxsdmwsY29kZSxzdHIpICBcCi0gICgoY2luZm8pLT5lcnItPm1zZ19jb2RlID0gKGNvZGUpLCBcCi0gICBGWFNZU19zdHJuY3B5KChjaW5mbyktPmVyci0+bXNnX3Bhcm0ucywgKHN0ciksIEpNU0dfU1RSX1BBUk1fTUFYKSwgXAotICAgKCooY2luZm8pLT5lcnItPmVtaXRfbWVzc2FnZSkgKChqX2NvbW1vbl9wdHIpIChjaW5mbyksIChsdmwpKSkKLQotI2VuZGlmIC8qIEpFUlJPUl9IICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ppbmNsdWRlLmggYi90aGlyZF9wYXJ0eS9saWJqcGVnL2ppbmNsdWRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmE4N2MuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9qaW5jbHVkZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLS8qCi0gKiBqaW5jbHVkZS5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTQsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgZXhpc3RzIHRvIHByb3ZpZGUgYSBzaW5nbGUgcGxhY2UgdG8gZml4IGFueSBwcm9ibGVtcyB3aXRoCi0gKiBpbmNsdWRpbmcgdGhlIHdyb25nIHN5c3RlbSBpbmNsdWRlIGZpbGVzLiAgKENvbW1vbiBwcm9ibGVtcyBhcmUgdGFrZW4KLSAqIGNhcmUgb2YgYnkgdGhlIHN0YW5kYXJkIGpjb25maWcgc3ltYm9scywgYnV0IG9uIHJlYWxseSB3ZWlyZCBzeXN0ZW1zCi0gKiB5b3UgbWF5IGhhdmUgdG8gZWRpdCB0aGlzIGZpbGUuKQotICoKLSAqIE5PVEU6IHRoaXMgZmlsZSBpcyBOT1QgaW50ZW5kZWQgdG8gYmUgaW5jbHVkZWQgYnkgYXBwbGljYXRpb25zIHVzaW5nIHRoZQotICogSlBFRyBsaWJyYXJ5LiAgTW9zdCBhcHBsaWNhdGlvbnMgbmVlZCBvbmx5IGluY2x1ZGUganBlZ2xpYi5oLgotICovCi0KLQotLyogSW5jbHVkZSBhdXRvLWNvbmZpZyBmaWxlIHRvIGZpbmQgb3V0IHdoaWNoIHN5c3RlbSBpbmNsdWRlIGZpbGVzIHdlIG5lZWQuICovCi0KLSNpbmNsdWRlICJqY29uZmlnLmgiCQkvKiBhdXRvIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLwotI2RlZmluZSBKQ09ORklHX0lOQ0xVREVECS8qIHNvIHRoYXQganBlZ2xpYi5oIGRvZXNuJ3QgZG8gaXQgYWdhaW4gKi8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0KLS8qCi0gKiBXZSBuZWVkIHRoZSBOVUxMIG1hY3JvIGFuZCBzaXplX3QgdHlwZWRlZi4KLSAqIE9uIGFuIEFOU0ktY29uZm9ybWluZyBzeXN0ZW0gaXQgaXMgc3VmZmljaWVudCB0byBpbmNsdWRlIDxzdGRkZWYuaD4uCi0gKiBPdGhlcndpc2UsIHdlIGdldCB0aGVtIGZyb20gPHN0ZGxpYi5oPiBvciA8c3RkaW8uaD47IHdlIG1heSBoYXZlIHRvCi0gKiBwdWxsIGluIDxzeXMvdHlwZXMuaD4gYXMgd2VsbC4KLSAqIE5vdGUgdGhhdCB0aGUgY29yZSBKUEVHIGxpYnJhcnkgZG9lcyBub3QgcmVxdWlyZSA8c3RkaW8uaD47Ci0gKiBvbmx5IHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXIgYW5kIGRhdGEgc291cmNlL2Rlc3RpbmF0aW9uIG1vZHVsZXMgZG8uCi0gKiBCdXQgd2UgbXVzdCBwdWxsIGl0IGluIGJlY2F1c2Ugb2YgdGhlIHJlZmVyZW5jZXMgdG8gRklMRSBpbiBqcGVnbGliLmguCi0gKiBZb3UgY2FuIHJlbW92ZSB0aG9zZSByZWZlcmVuY2VzIGlmIHlvdSB3YW50IHRvIGNvbXBpbGUgd2l0aG91dCA8c3RkaW8uaD4uCi0gKi8KLQotI2lmZGVmIF9ERUJVRwotI2RlZmluZSBDUlREQkdfTUFQX0FMTE9DCi0vLyNpbmNsdWRlIDxzdGRsaWIuaD4KLS8vI2luY2x1ZGUgPGNydGRiZy5oPgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX1NURERFRl9ICi0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jZW5kaWYKLQotI2lmZGVmIEhBVkVfU1RETElCX0gKLS8vI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpZmRlZiBORUVEX1NZU19UWVBFU19ICi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jZW5kaWYKLQotI2lmbmRlZiBGQVIKLSNkZWZpbmUgRkFSCi0jZW5kaWYKLQotLy8jaW5jbHVkZSA8c3RkaW8uaD4KLQotLyoKLSAqIFdlIG5lZWQgbWVtb3J5IGNvcHlpbmcgYW5kIHplcm9pbmcgZnVuY3Rpb25zLCBwbHVzIHN0cm5jcHkoKS4KLSAqIEFOU0kgYW5kIFN5c3RlbSBWIGltcGxlbWVudGF0aW9ucyBkZWNsYXJlIHRoZXNlIGluIDxzdHJpbmcuaD4uCi0gKiBCU0QgZG9lc24ndCBoYXZlIHRoZSBtZW0oKSBmdW5jdGlvbnMsIGJ1dCBpdCBkb2VzIGhhdmUgYmNvcHkoKS9iemVybygpLgotICogU29tZSBzeXN0ZW1zIG1heSBkZWNsYXJlIG1lbXNldCBhbmQgbWVtY3B5IGluIDxtZW1vcnkuaD4uCi0gKgotICogTk9URTogd2UgYXNzdW1lIHRoZSBzaXplIHBhcmFtZXRlcnMgdG8gdGhlc2UgZnVuY3Rpb25zIGFyZSBvZiB0eXBlIHNpemVfdC4KLSAqIENoYW5nZSB0aGUgY2FzdHMgaW4gdGhlc2UgbWFjcm9zIGlmIG5vdCEKLSAqLwotCi0jaWZkZWYgTkVFRF9CU0RfU1RSSU5HUwotCi0vLyNpbmNsdWRlIDxzdHJpbmdzLmg+Ci0jZGVmaW5lIE1FTVpFUk8odGFyZ2V0LHNpemUpCWJ6ZXJvKCh2b2lkICopKHRhcmdldCksIChzaXplX3QpKHNpemUpKQotI2RlZmluZSBNRU1DT1BZKGRlc3Qsc3JjLHNpemUpCWJjb3B5KChjb25zdCB2b2lkICopKHNyYyksICh2b2lkICopKGRlc3QpLCAoc2l6ZV90KShzaXplKSkKLQotI2Vsc2UgLyogbm90IEJTRCwgYXNzdW1lIEFOU0kvU3lzViBzdHJpbmcgbGliICovCi0KLS8vI2luY2x1ZGUgPHN0cmluZy5oPgotI2RlZmluZSBNRU1aRVJPKHRhcmdldCxzaXplKQlGWFNZU19tZW1zZXQoKHZvaWQgKikodGFyZ2V0KSwgMCwgKHNpemVfdCkoc2l6ZSkpCi0jZGVmaW5lIE1FTUNPUFkoZGVzdCxzcmMsc2l6ZSkJRlhTWVNfbWVtY3B5KCh2b2lkICopKGRlc3QpLCAoY29uc3Qgdm9pZCAqKShzcmMpLCAoc2l6ZV90KShzaXplKSkKLQotI2VuZGlmCi0KLS8qCi0gKiBJbiBBTlNJIEMsIGFuZCBpbmRlZWQgYW55IHJhdGlvbmFsIGltcGxlbWVudGF0aW9uLCBzaXplX3QgaXMgYWxzbyB0aGUKLSAqIHR5cGUgcmV0dXJuZWQgYnkgc2l6ZW9mKCkuICBIb3dldmVyLCBpdCBzZWVtcyB0aGVyZSBhcmUgc29tZSBpcnJhdGlvbmFsCi0gKiBpbXBsZW1lbnRhdGlvbnMgb3V0IHRoZXJlLCBpbiB3aGljaCBzaXplb2YoKSByZXR1cm5zIGFuIGludCBldmVuIHRob3VnaAotICogc2l6ZV90IGlzIGRlZmluZWQgYXMgbG9uZyBvciB1bnNpZ25lZCBsb25nLiAgVG8gZW5zdXJlIGNvbnNpc3RlbnQgcmVzdWx0cwotICogd2UgYWx3YXlzIHVzZSB0aGlzIFNJWkVPRigpIG1hY3JvIGluIHBsYWNlIG9mIHVzaW5nIHNpemVvZigpIGRpcmVjdGx5LgotICovCi0KLSNkZWZpbmUgU0laRU9GKG9iamVjdCkJKChzaXplX3QpIHNpemVvZihvYmplY3QpKQotCi0vKgotICogVGhlIG1vZHVsZXMgdGhhdCB1c2UgZnJlYWQoKSBhbmQgZndyaXRlKCkgYWx3YXlzIGludm9rZSB0aGVtIHRocm91Z2gKLSAqIHRoZXNlIG1hY3Jvcy4gIE9uIHNvbWUgc3lzdGVtcyB5b3UgbWF5IG5lZWQgdG8gdHdpZGRsZSB0aGUgYXJndW1lbnQgY2FzdHMuCi0gKiBDQVVUSU9OOiBhcmd1bWVudCBvcmRlciBpcyBkaWZmZXJlbnQgZnJvbSB1bmRlcmx5aW5nIGZ1bmN0aW9ucyEKLSAqLwotCi0jZGVmaW5lIEpGUkVBRChmaWxlLGJ1ZixzaXplb2ZidWYpICBcCi0gICgoc2l6ZV90KSBGWFNZU19mcmVhZCgodm9pZCAqKSAoYnVmKSwgKHNpemVfdCkgMSwgKHNpemVfdCkgKHNpemVvZmJ1ZiksIChmaWxlKSkpCi0jZGVmaW5lIEpGV1JJVEUoZmlsZSxidWYsc2l6ZW9mYnVmKSAgXAotICAoKHNpemVfdCkgRlhTWVNfZndyaXRlKChjb25zdCB2b2lkICopIChidWYpLCAoc2l6ZV90KSAxLCAoc2l6ZV90KSAoc2l6ZW9mYnVmKSwgKGZpbGUpKSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvam1lbXN5cy5oIGIvdGhpcmRfcGFydHkvbGlianBlZy9qbWVtc3lzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NjY4ODEuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9qbWVtc3lzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoKLSAqIGptZW1zeXMuaAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5Mi0xOTk3LCBUaG9tYXMgRy4gTGFuZS4KLSAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FIGZpbGUuCi0gKgotICogVGhpcyBpbmNsdWRlIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIHN5c3RlbS1pbmRlcGVuZGVudAotICogYW5kIHN5c3RlbS1kZXBlbmRlbnQgcG9ydGlvbnMgb2YgdGhlIEpQRUcgbWVtb3J5IG1hbmFnZXIuICBObyBvdGhlcgotICogbW9kdWxlcyBuZWVkIGluY2x1ZGUgaXQuICAoVGhlIHN5c3RlbS1pbmRlcGVuZGVudCBwb3J0aW9uIGlzIGptZW1tZ3IuYzsKLSAqIHRoZXJlIGFyZSBzZXZlcmFsIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgc3lzdGVtLWRlcGVuZGVudCBwb3J0aW9uLikKLSAqCi0gKiBUaGlzIGZpbGUgd29ya3MgYXMtaXMgZm9yIHRoZSBzeXN0ZW0tZGVwZW5kZW50IG1lbW9yeSBtYW5hZ2VycyBzdXBwbGllZAotICogaW4gdGhlIElKRyBkaXN0cmlidXRpb24uICBZb3UgbWF5IG5lZWQgdG8gbW9kaWZ5IGl0IGlmIHlvdSB3cml0ZSBhCi0gKiBjdXN0b20gbWVtb3J5IG1hbmFnZXIuCi0gKi8KLQotCi0vKiBTaG9ydCBmb3JtcyBvZiBleHRlcm5hbCBuYW1lcyBmb3Igc3lzdGVtcyB3aXRoIGJyYWluLWRhbWFnZWQgbGlua2Vycy4gKi8KLQotI2lmZGVmIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMKLSNkZWZpbmUganBlZ19nZXRfc21hbGwJCWpHZXRTbWFsbAotI2RlZmluZSBqcGVnX2ZyZWVfc21hbGwJCWpGcmVlU21hbGwKLSNkZWZpbmUganBlZ19nZXRfbGFyZ2UJCWpHZXRMYXJnZQotI2RlZmluZSBqcGVnX2ZyZWVfbGFyZ2UJCWpGcmVlTGFyZ2UKLSNkZWZpbmUganBlZ19tZW1fYXZhaWxhYmxlCWpNZW1BdmFpbAotI2RlZmluZSBqcGVnX29wZW5fYmFja2luZ19zdG9yZQlqT3BlbkJhY2tTdG9yZQotI2RlZmluZSBqcGVnX21lbV9pbml0CQlqTWVtSW5pdAotI2RlZmluZSBqcGVnX21lbV90ZXJtCQlqTWVtVGVybQotI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KLQotCi0vKgotICogVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgdXNlZCB0byBhbGxvY2F0ZSBhbmQgcmVsZWFzZSBzbWFsbCBjaHVua3Mgb2YKLSAqIG1lbW9yeS4gIChUeXBpY2FsbHkgdGhlIHRvdGFsIGFtb3VudCByZXF1ZXN0ZWQgdGhyb3VnaCBqcGVnX2dldF9zbWFsbCBpcwotICogbm8gbW9yZSB0aGFuIDIwSyBvciBzbzsgdGhpcyB3aWxsIGJlIHJlcXVlc3RlZCBpbiBjaHVua3Mgb2YgYSBmZXcgSyBlYWNoLikKLSAqIEJlaGF2aW9yIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBmb3IgdGhlIHN0YW5kYXJkIGxpYnJhcnkgZnVuY3Rpb25zIG1hbGxvYwotICogYW5kIGZyZWU7IGluIHBhcnRpY3VsYXIsIGpwZWdfZ2V0X3NtYWxsIG11c3QgcmV0dXJuIE5VTEwgb24gZmFpbHVyZS4KLSAqIE9uIG1vc3Qgc3lzdGVtcywgdGhlc2UgQVJFIG1hbGxvYyBhbmQgZnJlZS4gIGpwZWdfZnJlZV9zbWFsbCBpcyBwYXNzZWQgdGhlCi0gKiBzaXplIG9mIHRoZSBvYmplY3QgYmVpbmcgZnJlZWQsIGp1c3QgaW4gY2FzZSBpdCdzIG5lZWRlZC4KLSAqIE9uIGFuIDgweDg2IG1hY2hpbmUgdXNpbmcgc21hbGwtZGF0YSBtZW1vcnkgbW9kZWwsIHRoZXNlIG1hbmFnZSBuZWFyIGhlYXAuCi0gKi8KLQotRVhURVJOKHZvaWQgKikganBlZ19nZXRfc21hbGwgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8sIHNpemVfdCBzaXplb2ZvYmplY3QpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2ZyZWVfc21hbGwgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8sIHZvaWQgKiBvYmplY3QsCi0JCQkJICBzaXplX3Qgc2l6ZW9mb2JqZWN0KSk7Ci0KLS8qCi0gKiBUaGVzZSB0d28gZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGFsbG9jYXRlIGFuZCByZWxlYXNlIGxhcmdlIGNodW5rcyBvZgotICogbWVtb3J5ICh1cCB0byB0aGUgdG90YWwgZnJlZSBzcGFjZSBkZXNpZ25hdGVkIGJ5IGpwZWdfbWVtX2F2YWlsYWJsZSkuCi0gKiBUaGUgaW50ZXJmYWNlIGlzIHRoZSBzYW1lIGFzIGFib3ZlLCBleGNlcHQgdGhhdCBvbiBhbiA4MHg4NiBtYWNoaW5lLAotICogZmFyIHBvaW50ZXJzIGFyZSB1c2VkLiAgT24gbW9zdCBvdGhlciBtYWNoaW5lcyB0aGVzZSBhcmUgaWRlbnRpY2FsIHRvCi0gKiB0aGUganBlZ19nZXQvZnJlZV9zbWFsbCByb3V0aW5lczsgYnV0IHdlIGtlZXAgdGhlbSBzZXBhcmF0ZSBhbnl3YXksCi0gKiBpbiBjYXNlIGEgZGlmZmVyZW50IGFsbG9jYXRpb24gc3RyYXRlZ3kgaXMgZGVzaXJhYmxlIGZvciBsYXJnZSBjaHVua3MuCi0gKi8KLQotRVhURVJOKHZvaWQgRkFSICopIGpwZWdfZ2V0X2xhcmdlIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLAotCQkJCSAgICAgICBzaXplX3Qgc2l6ZW9mb2JqZWN0KSk7Ci1FWFRFUk4odm9pZCkganBlZ19mcmVlX2xhcmdlIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLCB2b2lkIEZBUiAqIG9iamVjdCwKLQkJCQkgIHNpemVfdCBzaXplb2ZvYmplY3QpKTsKLQotLyoKLSAqIFRoZSBtYWNybyBNQVhfQUxMT0NfQ0hVTksgZGVzaWduYXRlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtYXkKLSAqIGJlIHJlcXVlc3RlZCBpbiBhIHNpbmdsZSBjYWxsIHRvIGpwZWdfZ2V0X2xhcmdlIChhbmQganBlZ19nZXRfc21hbGwgZm9yIHRoYXQKLSAqIG1hdHRlciwgYnV0IHRoYXQgY2FzZSBzaG91bGQgbmV2ZXIgY29tZSBpbnRvIHBsYXkpLiAgVGhpcyBtYWNybyBpcyBuZWVkZWQKLSAqIHRvIG1vZGVsIHRoZSA2NEtiLXNlZ21lbnQtc2l6ZSBsaW1pdCBvZiBmYXIgYWRkcmVzc2luZyBvbiA4MHg4NiBtYWNoaW5lcy4KLSAqIE9uIHRob3NlIG1hY2hpbmVzLCB3ZSBleHBlY3QgdGhhdCBqY29uZmlnLmggd2lsbCBwcm92aWRlIGEgcHJvcGVyIHZhbHVlLgotICogT24gbWFjaGluZXMgd2l0aCAzMi1iaXQgZmxhdCBhZGRyZXNzIHNwYWNlcywgYW55IGxhcmdlIGNvbnN0YW50IG1heSBiZSB1c2VkLgotICoKLSAqIE5COiBqbWVtbWdyLmMgZXhwZWN0cyB0aGF0IE1BWF9BTExPQ19DSFVOSyB3aWxsIGJlIHJlcHJlc2VudGFibGUgYXMgdHlwZQotICogc2l6ZV90IGFuZCB3aWxsIGJlIGEgbXVsdGlwbGUgb2Ygc2l6ZW9mKGFsaWduX3R5cGUpLgotICovCi0KLSNpZm5kZWYgTUFYX0FMTE9DX0NIVU5LCQkvKiBtYXkgYmUgb3ZlcnJpZGRlbiBpbiBqY29uZmlnLmggKi8KLSNkZWZpbmUgTUFYX0FMTE9DX0NIVU5LICAxMDAwMDAwMDAwTAotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIHJvdXRpbmUgY29tcHV0ZXMgdGhlIHRvdGFsIHNwYWNlIHN0aWxsIGF2YWlsYWJsZSBmb3IgYWxsb2NhdGlvbiBieQotICoganBlZ19nZXRfbGFyZ2UuICBJZiBtb3JlIHNwYWNlIHRoYW4gdGhpcyBpcyBuZWVkZWQsIGJhY2tpbmcgc3RvcmUgd2lsbCBiZQotICogdXNlZC4gIE5PVEU6IGFueSBtZW1vcnkgYWxyZWFkeSBhbGxvY2F0ZWQgbXVzdCBub3QgYmUgY291bnRlZC4KLSAqCi0gKiBUaGVyZSBpcyBhIG1pbmltdW0gc3BhY2UgcmVxdWlyZW1lbnQsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1pbmltdW0KLSAqIGZlYXNpYmxlIGJ1ZmZlciBzaXplczsgam1lbW1nci5jIHdpbGwgcmVxdWVzdCB0aGF0IG11Y2ggc3BhY2UgZXZlbiBpZgotICoganBlZ19tZW1fYXZhaWxhYmxlIHJldHVybnMgemVyby4gIFRoZSBtYXhpbXVtIHNwYWNlIG5lZWRlZCwgZW5vdWdoIHRvIGhvbGQKLSAqIGFsbCB3b3JraW5nIHN0b3JhZ2UgaW4gbWVtb3J5LCBpcyBhbHNvIHBhc3NlZCBpbiBjYXNlIGl0IGlzIHVzZWZ1bC4KLSAqIEZpbmFsbHksIHRoZSB0b3RhbCBzcGFjZSBhbHJlYWR5IGFsbG9jYXRlZCBpcyBwYXNzZWQuICBJZiBubyBiZXR0ZXIKLSAqIG1ldGhvZCBpcyBhdmFpbGFibGUsIGNpbmZvLT5tZW0tPm1heF9tZW1vcnlfdG9fdXNlIC0gYWxyZWFkeV9hbGxvY2F0ZWQKLSAqIGlzIG9mdGVuIGEgc3VpdGFibGUgY2FsY3VsYXRpb24uCi0gKgotICogSXQgaXMgT0sgZm9yIGpwZWdfbWVtX2F2YWlsYWJsZSB0byB1bmRlcmVzdGltYXRlIHRoZSBzcGFjZSBhdmFpbGFibGUKLSAqICh0aGF0J2xsIGp1c3QgbGVhZCB0byBtb3JlIGJhY2tpbmctc3RvcmUgYWNjZXNzIHRoYW4gaXMgcmVhbGx5IG5lY2Vzc2FyeSkuCi0gKiBIb3dldmVyLCBhbiBvdmVyZXN0aW1hdGUgd2lsbCBsZWFkIHRvIGZhaWx1cmUuICBIZW5jZSBpdCdzIHdpc2UgdG8gc3VidHJhY3QKLSAqIGEgc2xvcCBmYWN0b3IgZnJvbSB0aGUgdHJ1ZSBhdmFpbGFibGUgc3BhY2UuICA1JSBzaG91bGQgYmUgZW5vdWdoLgotICoKLSAqIE9uIG1hY2hpbmVzIHdpdGggbG90cyBvZiB2aXJ0dWFsIG1lbW9yeSwgYW55IGxhcmdlIGNvbnN0YW50IG1heSBiZSByZXR1cm5lZC4KLSAqIENvbnZlcnNlbHksIHplcm8gbWF5IGJlIHJldHVybmVkIHRvIGFsd2F5cyB1c2UgdGhlIG1pbmltdW0gYW1vdW50IG9mIG1lbW9yeS4KLSAqLwotCi1FWFRFUk4obG9uZykganBlZ19tZW1fYXZhaWxhYmxlIEpQUCgoal9jb21tb25fcHRyIGNpbmZvLAotCQkJCSAgICAgbG9uZyBtaW5fYnl0ZXNfbmVlZGVkLAotCQkJCSAgICAgbG9uZyBtYXhfYnl0ZXNfbmVlZGVkLAotCQkJCSAgICAgbG9uZyBhbHJlYWR5X2FsbG9jYXRlZCkpOwotCi0KLS8qCi0gKiBUaGlzIHN0cnVjdHVyZSBob2xkcyB3aGF0ZXZlciBzdGF0ZSBpcyBuZWVkZWQgdG8gYWNjZXNzIGEgc2luZ2xlCi0gKiBiYWNraW5nLXN0b3JlIG9iamVjdC4gIFRoZSByZWFkL3dyaXRlL2Nsb3NlIG1ldGhvZCBwb2ludGVycyBhcmUgY2FsbGVkCi0gKiBieSBqbWVtbWdyLmMgdG8gbWFuaXB1bGF0ZSB0aGUgYmFja2luZy1zdG9yZSBvYmplY3Q7IGFsbCBvdGhlciBmaWVsZHMKLSAqIGFyZSBwcml2YXRlIHRvIHRoZSBzeXN0ZW0tZGVwZW5kZW50IGJhY2tpbmcgc3RvcmUgcm91dGluZXMuCi0gKi8KLQotI2RlZmluZSBURU1QX05BTUVfTEVOR1RIICAgNjQJLyogbWF4IGxlbmd0aCBvZiBhIHRlbXBvcmFyeSBmaWxlJ3MgbmFtZSAqLwotCi10eXBlZGVmIHN0cnVjdCBiYWNraW5nX3N0b3JlX3N0cnVjdCAqIGJhY2tpbmdfc3RvcmVfcHRyOwotCi10eXBlZGVmIHN0cnVjdCBiYWNraW5nX3N0b3JlX3N0cnVjdCB7Ci0gIC8qIE1ldGhvZHMgZm9yIHJlYWRpbmcvd3JpdGluZy9jbG9zaW5nIHRoaXMgYmFja2luZy1zdG9yZSBvYmplY3QgKi8KLSAgSk1FVEhPRCh2b2lkLCByZWFkX2JhY2tpbmdfc3RvcmUsIChqX2NvbW1vbl9wdHIgY2luZm8sCi0JCQkJICAgICBiYWNraW5nX3N0b3JlX3B0ciBpbmZvLAotCQkJCSAgICAgdm9pZCBGQVIgKiBidWZmZXJfYWRkcmVzcywKLQkJCQkgICAgIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkpOwotICBKTUVUSE9EKHZvaWQsIHdyaXRlX2JhY2tpbmdfc3RvcmUsIChqX2NvbW1vbl9wdHIgY2luZm8sCi0JCQkJICAgICAgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJCQkgICAgICB2b2lkIEZBUiAqIGJ1ZmZlcl9hZGRyZXNzLAotCQkJCSAgICAgIGxvbmcgZmlsZV9vZmZzZXQsIGxvbmcgYnl0ZV9jb3VudCkpOwotICBKTUVUSE9EKHZvaWQsIGNsb3NlX2JhY2tpbmdfc3RvcmUsIChqX2NvbW1vbl9wdHIgY2luZm8sCi0JCQkJICAgICAgYmFja2luZ19zdG9yZV9wdHIgaW5mbykpOwotCi0gIC8qIFByaXZhdGUgZmllbGRzIGZvciBzeXN0ZW0tZGVwZW5kZW50IGJhY2tpbmctc3RvcmUgbWFuYWdlbWVudCAqLwotICAvKiBGb3IgYSB0eXBpY2FsIGltcGxlbWVudGF0aW9uIHdpdGggdGVtcCBmaWxlcywgd2UgbmVlZDogKi8KLSAgRlhTWVNfRklMRSAqIHRlbXBfZmlsZTsJCS8qIHN0ZGlvIHJlZmVyZW5jZSB0byB0ZW1wIGZpbGUgKi8KLSAgY2hhciB0ZW1wX25hbWVbVEVNUF9OQU1FX0xFTkdUSF07IC8qIG5hbWUgb2YgdGVtcCBmaWxlICovCi19IGJhY2tpbmdfc3RvcmVfaW5mbzsKLQotCi0vKgotICogSW5pdGlhbCBvcGVuaW5nIG9mIGEgYmFja2luZy1zdG9yZSBvYmplY3QuICBUaGlzIG11c3QgZmlsbCBpbiB0aGUKLSAqIHJlYWQvd3JpdGUvY2xvc2UgcG9pbnRlcnMgaW4gdGhlIG9iamVjdC4gIFRoZSByZWFkL3dyaXRlIHJvdXRpbmVzCi0gKiBtYXkgdGFrZSBhbiBlcnJvciBleGl0IGlmIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBmaWxlIHNpemUgaXMgZXhjZWVkZWQuCi0gKiAoSWYganBlZ19tZW1fYXZhaWxhYmxlIGFsd2F5cyByZXR1cm5zIGEgbGFyZ2UgdmFsdWUsIHRoaXMgcm91dGluZSBjYW4KLSAqIGp1c3QgdGFrZSBhbiBlcnJvciBleGl0LikKLSAqLwotCi1FWFRFUk4odm9pZCkganBlZ19vcGVuX2JhY2tpbmdfc3RvcmUgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8sCi0JCQkJCSAgYmFja2luZ19zdG9yZV9wdHIgaW5mbywKLQkJCQkJICBsb25nIHRvdGFsX2J5dGVzX25lZWRlZCkpOwotCi0KLS8qCi0gKiBUaGVzZSByb3V0aW5lcyB0YWtlIGNhcmUgb2YgYW55IHN5c3RlbS1kZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24gYW5kCi0gKiBjbGVhbnVwIHJlcXVpcmVkLiAganBlZ19tZW1faW5pdCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgaXMKLSAqIGFsbG9jYXRlZCAoYW5kLCB0aGVyZWZvcmUsIG5vdGhpbmcgaW4gY2luZm8gaXMgb2YgdXNlIGV4Y2VwdCB0aGUgZXJyb3IKLSAqIG1hbmFnZXIgcG9pbnRlcikuICBJdCBzaG91bGQgcmV0dXJuIGEgc3VpdGFibGUgZGVmYXVsdCB2YWx1ZSBmb3IKLSAqIG1heF9tZW1vcnlfdG9fdXNlOyB0aGlzIG1heSBzdWJzZXF1ZW50bHkgYmUgb3ZlcnJpZGRlbiBieSB0aGUgc3Vycm91bmRpbmcKLSAqIGFwcGxpY2F0aW9uLiAgKE5vdGUgdGhhdCBtYXhfbWVtb3J5X3RvX3VzZSBpcyBvbmx5IGltcG9ydGFudCBpZgotICoganBlZ19tZW1fYXZhaWxhYmxlIGNob29zZXMgdG8gY29uc3VsdCBpdCAuLi4gbm8gb25lIGVsc2Ugd2lsbC4pCi0gKiBqcGVnX21lbV90ZXJtIG1heSBhc3N1bWUgdGhhdCBhbGwgcmVxdWVzdGVkIG1lbW9yeSBoYXMgYmVlbiBmcmVlZCBhbmQgdGhhdAotICogYWxsIG9wZW5lZCBiYWNraW5nLXN0b3JlIG9iamVjdHMgaGF2ZSBiZWVuIGNsb3NlZC4KLSAqLwotCi1FWFRFUk4obG9uZykganBlZ19tZW1faW5pdCBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGpwZWdfbWVtX3Rlcm0gSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvam1vcmVjZmcuaCBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvam1vcmVjZmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwZDkwNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJqcGVnL2ptb3JlY2ZnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNzIgKzAsMCBAQAotLyoKLSAqIGptb3JlY2ZnLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGN1c3RvbWl6ZSB0aGUKLSAqIEpQRUcgc29mdHdhcmUgZm9yIHNwZWNpYWwgYXBwbGljYXRpb25zIG9yIHN1cHBvcnQgbWFjaGluZS1kZXBlbmRlbnQKLSAqIG9wdGltaXphdGlvbnMuICBNb3N0IHVzZXJzIHdpbGwgbm90IG5lZWQgdG8gdG91Y2ggdGhpcyBmaWxlLgotICovCi0KLSNpZmRlZiBfTVNDX1ZFUgotI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlIDogNDE0MikKLSNlbmRpZgotCi0vKgotICogRGVmaW5lIEJJVFNfSU5fSlNBTVBMRSBhcyBlaXRoZXIKLSAqICAgOCAgIGZvciA4LWJpdCBzYW1wbGUgdmFsdWVzICh0aGUgdXN1YWwgc2V0dGluZykKLSAqICAgMTIgIGZvciAxMi1iaXQgc2FtcGxlIHZhbHVlcwotICogT25seSA4IGFuZCAxMiBhcmUgbGVnYWwgZGF0YSBwcmVjaXNpb25zIGZvciBsb3NzeSBKUEVHIGFjY29yZGluZyB0byB0aGUKLSAqIEpQRUcgc3RhbmRhcmQsIGFuZCB0aGUgSUpHIGNvZGUgZG9lcyBub3Qgc3VwcG9ydCBhbnl0aGluZyBlbHNlIQotICogV2UgZG8gbm90IHN1cHBvcnQgcnVuLXRpbWUgc2VsZWN0aW9uIG9mIGRhdGEgcHJlY2lzaW9uLCBzb3JyeS4KLSAqLwotCi0jZGVmaW5lIEJJVFNfSU5fSlNBTVBMRSAgOAkvKiB1c2UgOCBvciAxMiAqLwotCi0KLS8qCi0gKiBNYXhpbXVtIG51bWJlciBvZiBjb21wb25lbnRzIChjb2xvciBjaGFubmVscykgYWxsb3dlZCBpbiBKUEVHIGltYWdlLgotICogVG8gbWVldCB0aGUgbGV0dGVyIG9mIHRoZSBKUEVHIHNwZWMsIHNldCB0aGlzIHRvIDI1NS4gIEhvd2V2ZXIsIGRhcm4KLSAqIGZldyBhcHBsaWNhdGlvbnMgbmVlZCBtb3JlIHRoYW4gNCBjaGFubmVscyAobWF5YmUgNSBmb3IgQ01ZSyArIGFscGhhCi0gKiBtYXNrKS4gIFdlIHJlY29tbWVuZCAxMCBhcyBhIHJlYXNvbmFibGUgY29tcHJvbWlzZTsgdXNlIDQgaWYgeW91IGFyZQotICogcmVhbGx5IHNob3J0IG9uIG1lbW9yeS4gIChFYWNoIGFsbG93ZWQgY29tcG9uZW50IGNvc3RzIGEgaHVuZHJlZCBvciBzbwotICogYnl0ZXMgb2Ygc3RvcmFnZSwgd2hldGhlciBhY3R1YWxseSB1c2VkIGluIGFuIGltYWdlIG9yIG5vdC4pCi0gKi8KLQotI2RlZmluZSBNQVhfQ09NUE9ORU5UUyAgMTAJLyogbWF4aW11bSBudW1iZXIgb2YgaW1hZ2UgY29tcG9uZW50cyAqLwotCi0KLS8qCi0gKiBCYXNpYyBkYXRhIHR5cGVzLgotICogWW91IG1heSBuZWVkIHRvIGNoYW5nZSB0aGVzZSBpZiB5b3UgaGF2ZSBhIG1hY2hpbmUgd2l0aCB1bnVzdWFsIGRhdGEKLSAqIHR5cGUgc2l6ZXM7IGZvciBleGFtcGxlLCAiY2hhciIgbm90IDggYml0cywgInNob3J0IiBub3QgMTYgYml0cywKLSAqIG9yICJsb25nIiBub3QgMzIgYml0cy4gIFdlIGRvbid0IGNhcmUgd2hldGhlciAiaW50IiBpcyAxNiBvciAzMiBiaXRzLAotICogYnV0IGl0IGhhZCBiZXR0ZXIgYmUgYXQgbGVhc3QgMTYuCi0gKi8KLQotLyogUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgc2FtcGxlIChwaXhlbCBlbGVtZW50IHZhbHVlKS4KLSAqIFdlIGZyZXF1ZW50bHkgYWxsb2NhdGUgbGFyZ2UgYXJyYXlzIG9mIHRoZXNlLCBzbyBpdCdzIGltcG9ydGFudCB0byBrZWVwCi0gKiB0aGVtIHNtYWxsLiAgQnV0IGlmIHlvdSBoYXZlIG1lbW9yeSB0byBidXJuIGFuZCBhY2Nlc3MgdG8gY2hhciBvciBzaG9ydAotICogYXJyYXlzIGlzIHZlcnkgc2xvdyBvbiB5b3VyIGhhcmR3YXJlLCB5b3UgbWlnaHQgd2FudCB0byBjaGFuZ2UgdGhlc2UuCi0gKi8KLQotI2lmIEJJVFNfSU5fSlNBTVBMRSA9PSA4Ci0vKiBKU0FNUExFIHNob3VsZCBiZSB0aGUgc21hbGxlc3QgdHlwZSB0aGF0IHdpbGwgaG9sZCB0aGUgdmFsdWVzIDAuLjI1NS4KLSAqIFlvdSBjYW4gdXNlIGEgc2lnbmVkIGNoYXIgYnkgaGF2aW5nIEdFVEpTQU1QTEUgbWFzayBpdCB3aXRoIDB4RkYuCi0gKi8KLQotI2lmZGVmIEhBVkVfVU5TSUdORURfQ0hBUgotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgSlNBTVBMRTsKLSNkZWZpbmUgR0VUSlNBTVBMRSh2YWx1ZSkgICgoaW50KSAodmFsdWUpKQotCi0jZWxzZSAvKiBub3QgSEFWRV9VTlNJR05FRF9DSEFSICovCi0KLXR5cGVkZWYgY2hhciBKU0FNUExFOwotI2lmZGVmIENIQVJfSVNfVU5TSUdORUQKLSNkZWZpbmUgR0VUSlNBTVBMRSh2YWx1ZSkgICgoaW50KSAodmFsdWUpKQotI2Vsc2UKLSNkZWZpbmUgR0VUSlNBTVBMRSh2YWx1ZSkgICgoaW50KSAodmFsdWUpICYgMHhGRikKLSNlbmRpZiAvKiBDSEFSX0lTX1VOU0lHTkVEICovCi0KLSNlbmRpZiAvKiBIQVZFX1VOU0lHTkVEX0NIQVIgKi8KLQotI2RlZmluZSBNQVhKU0FNUExFCTI1NQotI2RlZmluZSBDRU5URVJKU0FNUExFCTEyOAotCi0jZW5kaWYgLyogQklUU19JTl9KU0FNUExFID09IDggKi8KLQotCi0jaWYgQklUU19JTl9KU0FNUExFID09IDEyCi0vKiBKU0FNUExFIHNob3VsZCBiZSB0aGUgc21hbGxlc3QgdHlwZSB0aGF0IHdpbGwgaG9sZCB0aGUgdmFsdWVzIDAuLjQwOTUuCi0gKiBPbiBuZWFybHkgYWxsIG1hY2hpbmVzICJzaG9ydCIgd2lsbCBkbyBuaWNlbHkuCi0gKi8KLQotdHlwZWRlZiBzaG9ydCBKU0FNUExFOwotI2RlZmluZSBHRVRKU0FNUExFKHZhbHVlKSAgKChpbnQpICh2YWx1ZSkpCi0KLSNkZWZpbmUgTUFYSlNBTVBMRQk0MDk1Ci0jZGVmaW5lIENFTlRFUkpTQU1QTEUJMjA0OAotCi0jZW5kaWYgLyogQklUU19JTl9KU0FNUExFID09IDEyICovCi0KLQotLyogUmVwcmVzZW50YXRpb24gb2YgYSBEQ1QgZnJlcXVlbmN5IGNvZWZmaWNpZW50LgotICogVGhpcyBzaG91bGQgYmUgYSBzaWduZWQgdmFsdWUgb2YgYXQgbGVhc3QgMTYgYml0czsgInNob3J0IiBpcyB1c3VhbGx5IE9LLgotICogQWdhaW4sIHdlIGFsbG9jYXRlIGxhcmdlIGFycmF5cyBvZiB0aGVzZSwgYnV0IHlvdSBjYW4gY2hhbmdlIHRvIGludAotICogaWYgeW91IGhhdmUgbWVtb3J5IHRvIGJ1cm4gYW5kICJzaG9ydCIgaXMgcmVhbGx5IHNsb3cuCi0gKi8KLQotdHlwZWRlZiBzaG9ydCBKQ09FRjsKLQotCi0vKiBDb21wcmVzc2VkIGRhdGFzdHJlYW1zIGFyZSByZXByZXNlbnRlZCBhcyBhcnJheXMgb2YgSk9DVEVULgotICogVGhlc2UgbXVzdCBiZSBFWEFDVExZIDggYml0cyB3aWRlLCBhdCBsZWFzdCBvbmNlIHRoZXkgYXJlIHdyaXR0ZW4gdG8KLSAqIGV4dGVybmFsIHN0b3JhZ2UuICBOb3RlIHRoYXQgd2hlbiB1c2luZyB0aGUgc3RkaW8gZGF0YSBzb3VyY2UvZGVzdGluYXRpb24KLSAqIG1hbmFnZXJzLCB0aGlzIGlzIGFsc28gdGhlIGRhdGEgdHlwZSBwYXNzZWQgdG8gZnJlYWQvZndyaXRlLgotICovCi0KLSNpZmRlZiBIQVZFX1VOU0lHTkVEX0NIQVIKLQotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIEpPQ1RFVDsKLSNkZWZpbmUgR0VUSk9DVEVUKHZhbHVlKSAgKHZhbHVlKQotCi0jZWxzZSAvKiBub3QgSEFWRV9VTlNJR05FRF9DSEFSICovCi0KLXR5cGVkZWYgY2hhciBKT0NURVQ7Ci0jaWZkZWYgQ0hBUl9JU19VTlNJR05FRAotI2RlZmluZSBHRVRKT0NURVQodmFsdWUpICAodmFsdWUpCi0jZWxzZQotI2RlZmluZSBHRVRKT0NURVQodmFsdWUpICAoKHZhbHVlKSAmIDB4RkYpCi0jZW5kaWYgLyogQ0hBUl9JU19VTlNJR05FRCAqLwotCi0jZW5kaWYgLyogSEFWRV9VTlNJR05FRF9DSEFSICovCi0KLQotLyogVGhlc2UgdHlwZWRlZnMgYXJlIHVzZWQgZm9yIHZhcmlvdXMgdGFibGUgZW50cmllcyBhbmQgc28gZm9ydGguCi0gKiBUaGV5IG11c3QgYmUgYXQgbGVhc3QgYXMgd2lkZSBhcyBzcGVjaWZpZWQ7IGJ1dCBtYWtpbmcgdGhlbSB0b28gYmlnCi0gKiB3b24ndCBjb3N0IGEgaHVnZSBhbW91bnQgb2YgbWVtb3J5LCBzbyB3ZSBkb24ndCBwcm92aWRlIHNwZWNpYWwKLSAqIGV4dHJhY3Rpb24gY29kZSBsaWtlIHdlIGRpZCBmb3IgSlNBTVBMRS4gIChJbiBvdGhlciB3b3JkcywgdGhlc2UKLSAqIHR5cGVkZWZzIGxpdmUgYXQgYSBkaWZmZXJlbnQgcG9pbnQgb24gdGhlIHNwZWVkL3NwYWNlIHRyYWRlb2ZmIGN1cnZlLikKLSAqLwotCi0jaWYgX0ZYX09TXyAhPSBfRlhfVlhXT1JLU18KLQotLyogVUlOVDggbXVzdCBob2xkIGF0IGxlYXN0IHRoZSB2YWx1ZXMgMC4uMjU1LiAqLwotCi0jaWZkZWYgSEFWRV9VTlNJR05FRF9DSEFSCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUlOVDg7Ci0jZWxzZSAvKiBub3QgSEFWRV9VTlNJR05FRF9DSEFSICovCi0jaWZkZWYgQ0hBUl9JU19VTlNJR05FRAotdHlwZWRlZiBjaGFyIFVJTlQ4OwotI2Vsc2UgLyogbm90IENIQVJfSVNfVU5TSUdORUQgKi8KLXR5cGVkZWYgc2hvcnQgVUlOVDg7Ci0jZW5kaWYgLyogQ0hBUl9JU19VTlNJR05FRCAqLwotI2VuZGlmIC8qIEhBVkVfVU5TSUdORURfQ0hBUiAqLwotCi0KLS8qIFVJTlQxNiBtdXN0IGhvbGQgYXQgbGVhc3QgdGhlIHZhbHVlcyAwLi42NTUzNS4gKi8KLQotI2lmZGVmIEhBVkVfVU5TSUdORURfU0hPUlQKLXR5cGVkZWYgdW5zaWduZWQgc2hvcnQgVUlOVDE2OwotI2Vsc2UgLyogbm90IEhBVkVfVU5TSUdORURfU0hPUlQgKi8KLXR5cGVkZWYgdW5zaWduZWQgaW50IFVJTlQxNjsKLSNlbmRpZiAvKiBIQVZFX1VOU0lHTkVEX1NIT1JUICovCi0KLS8qIElOVDE2IG11c3QgaG9sZCBhdCBsZWFzdCB0aGUgdmFsdWVzIC0zMjc2OC4uMzI3NjcuICovCi0KLSNpZm5kZWYgWE1EX0gJCQkvKiBYMTEveG1kLmggY29ycmVjdGx5IGRlZmluZXMgSU5UMTYgKi8KLXR5cGVkZWYgc2hvcnQgSU5UMTY7Ci0jZW5kaWYKLQotLyogSU5UMzIgbXVzdCBob2xkIGF0IGxlYXN0IHNpZ25lZCAzMi1iaXQgdmFsdWVzLiAqLwotCi0jaWZuZGVmIFhNRF9ICQkJLyogWDExL3htZC5oIGNvcnJlY3RseSBkZWZpbmVzIElOVDMyICovCi10eXBlZGVmIGludCBJTlQzMjsKLSNlbmRpZgotCi0jZW5kaWYgCi0KLS8qIERhdGF0eXBlIHVzZWQgZm9yIGltYWdlIGRpbWVuc2lvbnMuICBUaGUgSlBFRyBzdGFuZGFyZCBvbmx5IHN1cHBvcnRzCi0gKiBpbWFnZXMgdXAgdG8gNjRLKjY0SyBkdWUgdG8gMTYtYml0IGZpZWxkcyBpbiBTT0YgbWFya2Vycy4gIFRoZXJlZm9yZQotICogInVuc2lnbmVkIGludCIgaXMgc3VmZmljaWVudCBvbiBhbGwgbWFjaGluZXMuICBIb3dldmVyLCBpZiB5b3UgbmVlZCB0bwotICogaGFuZGxlIGxhcmdlciBpbWFnZXMgYW5kIHlvdSBkb24ndCBtaW5kIGRldmlhdGluZyBmcm9tIHRoZSBzcGVjLCB5b3UKLSAqIGNhbiBjaGFuZ2UgdGhpcyBkYXRhdHlwZS4KLSAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGludCBKRElNRU5TSU9OOwotCi0jZGVmaW5lIEpQRUdfTUFYX0RJTUVOU0lPTiAgNjU1MDBMICAvKiBhIHRhZCB1bmRlciA2NEsgdG8gcHJldmVudCBvdmVyZmxvd3MgKi8KLQotCi0vKiBUaGVzZSBtYWNyb3MgYXJlIHVzZWQgaW4gYWxsIGZ1bmN0aW9uIGRlZmluaXRpb25zIGFuZCBleHRlcm4gZGVjbGFyYXRpb25zLgotICogWW91IGNvdWxkIG1vZGlmeSB0aGVtIGlmIHlvdSBuZWVkIHRvIGNoYW5nZSBmdW5jdGlvbiBsaW5rYWdlIGNvbnZlbnRpb25zOwotICogaW4gcGFydGljdWxhciwgeW91J2xsIG5lZWQgdG8gZG8gdGhhdCB0byBtYWtlIHRoZSBsaWJyYXJ5IGEgV2luZG93cyBETEwuCi0gKiBBbm90aGVyIGFwcGxpY2F0aW9uIGlzIHRvIG1ha2UgYWxsIGZ1bmN0aW9ucyBnbG9iYWwgZm9yIHVzZSB3aXRoIGRlYnVnZ2VycwotICogb3IgY29kZSBwcm9maWxlcnMgdGhhdCByZXF1aXJlIGl0LgotICovCi0KLS8qIGEgZnVuY3Rpb24gY2FsbGVkIHRocm91Z2ggbWV0aG9kIHBvaW50ZXJzOiAqLwotI2RlZmluZSBNRVRIT0RERUYodHlwZSkJCXN0YXRpYyB0eXBlCi0vKiBhIGZ1bmN0aW9uIHVzZWQgb25seSBpbiBpdHMgbW9kdWxlOiAqLwotI2RlZmluZSBMT0NBTCh0eXBlKQkJc3RhdGljIHR5cGUKLS8qIGEgZnVuY3Rpb24gcmVmZXJlbmNlZCB0aHJ1IEVYVEVSTnM6ICovCi0jZGVmaW5lIEdMT0JBTCh0eXBlKQkJdHlwZQotCi0vKiBhIHJlZmVyZW5jZSB0byBhIEdMT0JBTCBmdW5jdGlvbjogKi8KLSNkZWZpbmUgRVhURVJOKHR5cGUpCQlleHRlcm4gdHlwZQotCi0KLS8qIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBkZWNsYXJlIGEgIm1ldGhvZCIsIHRoYXQgaXMsIGEgZnVuY3Rpb24gcG9pbnRlci4KLSAqIFdlIHdhbnQgdG8gc3VwcGx5IHByb3RvdHlwZSBwYXJhbWV0ZXJzIGlmIHRoZSBjb21waWxlciBjYW4gY29wZS4KLSAqIE5vdGUgdGhhdCB0aGUgYXJnbGlzdCBwYXJhbWV0ZXIgbXVzdCBiZSBwYXJlbnRoZXNpemVkIQotICogQWdhaW4sIHlvdSBjYW4gY3VzdG9taXplIHRoaXMgaWYgeW91IG5lZWQgc3BlY2lhbCBsaW5rYWdlIGtleXdvcmRzLgotICovCi0KLSNpZmRlZiBIQVZFX1BST1RPVFlQRVMKLSNkZWZpbmUgSk1FVEhPRCh0eXBlLG1ldGhvZG5hbWUsYXJnbGlzdCkgIHR5cGUgKCptZXRob2RuYW1lKSBhcmdsaXN0Ci0jZWxzZQotI2RlZmluZSBKTUVUSE9EKHR5cGUsbWV0aG9kbmFtZSxhcmdsaXN0KSAgdHlwZSAoKm1ldGhvZG5hbWUpICgpCi0jZW5kaWYKLQotCi0vKiBIZXJlIGlzIHRoZSBwc2V1ZG8ta2V5d29yZCBmb3IgZGVjbGFyaW5nIHBvaW50ZXJzIHRoYXQgbXVzdCBiZSAiZmFyIgotICogb24gODB4ODYgbWFjaGluZXMuICBNb3N0IG9mIHRoZSBzcGVjaWFsaXplZCBjb2RpbmcgZm9yIDgweDg2IGlzIGhhbmRsZWQKLSAqIGJ5IGp1c3Qgc2F5aW5nICJGQVIgKiIgd2hlcmUgc3VjaCBhIHBvaW50ZXIgaXMgbmVlZGVkLiAgSW4gYSBmZXcgcGxhY2VzCi0gKiBleHBsaWNpdCBjb2RpbmcgaXMgbmVlZGVkOyBzZWUgdXNlcyBvZiB0aGUgTkVFRF9GQVJfUE9JTlRFUlMgc3ltYm9sLgotICovCi0KLSNpZmRlZiBORUVEX0ZBUl9QT0lOVEVSUwotI2RlZmluZSBGQVIgIGZhcgotI2Vsc2UKLS8vI2RlZmluZSBGQVIKLSNlbmRpZgotCi0KLS8qCi0gKiBPbiBhIGZldyBzeXN0ZW1zLCB0eXBlIGJvb2xlYW4gYW5kL29yIGl0cyB2YWx1ZXMgRkFMU0UsIFRSVUUgbWF5IGFwcGVhcgotICogaW4gc3RhbmRhcmQgaGVhZGVyIGZpbGVzLiAgT3IgeW91IG1heSBoYXZlIGNvbmZsaWN0cyB3aXRoIGFwcGxpY2F0aW9uLQotICogc3BlY2lmaWMgaGVhZGVyIGZpbGVzIHRoYXQgeW91IHdhbnQgdG8gaW5jbHVkZSB0b2dldGhlciB3aXRoIHRoZXNlIGZpbGVzLgotICogRGVmaW5pbmcgSEFWRV9CT09MRUFOIGJlZm9yZSBpbmNsdWRpbmcganBlZ2xpYi5oIHNob3VsZCBtYWtlIGl0IHdvcmsuCi0gKi8KLQotI2lmbmRlZiBIQVZFX0JPT0xFQU4KLXR5cGVkZWYgaW50IGJvb2xlYW47Ci0jZW5kaWYKLSNpZm5kZWYgRkFMU0UJCQkvKiBpbiBjYXNlIHRoZXNlIG1hY3JvcyBhbHJlYWR5IGV4aXN0ICovCi0jZGVmaW5lIEZBTFNFCTAJCS8qIHZhbHVlcyBvZiBib29sZWFuICovCi0jZW5kaWYKLSNpZm5kZWYgVFJVRQotI2RlZmluZSBUUlVFCTEKLSNlbmRpZgotCi0KLS8qCi0gKiBUaGUgcmVtYWluaW5nIG9wdGlvbnMgYWZmZWN0IGNvZGUgc2VsZWN0aW9uIHdpdGhpbiB0aGUgSlBFRyBsaWJyYXJ5LAotICogYnV0IHRoZXkgZG9uJ3QgbmVlZCB0byBiZSB2aXNpYmxlIHRvIG1vc3QgYXBwbGljYXRpb25zIHVzaW5nIHRoZSBsaWJyYXJ5LgotICogVG8gbWluaW1pemUgYXBwbGljYXRpb24gbmFtZXNwYWNlIHBvbGx1dGlvbiwgdGhlIHN5bWJvbHMgd29uJ3QgYmUKLSAqIGRlZmluZWQgdW5sZXNzIEpQRUdfSU5URVJOQUxTIG9yIEpQRUdfSU5URVJOQUxfT1BUSU9OUyBoYXMgYmVlbiBkZWZpbmVkLgotICovCi0KLSNpZmRlZiBKUEVHX0lOVEVSTkFMUwotI2RlZmluZSBKUEVHX0lOVEVSTkFMX09QVElPTlMKLSNlbmRpZgotCi0jaWZkZWYgSlBFR19JTlRFUk5BTF9PUFRJT05TCi0KLQotLyoKLSAqIFRoZXNlIGRlZmluZXMgaW5kaWNhdGUgd2hldGhlciB0byBpbmNsdWRlIHZhcmlvdXMgb3B0aW9uYWwgZnVuY3Rpb25zLgotICogVW5kZWZpbmluZyBzb21lIG9mIHRoZXNlIHN5bWJvbHMgd2lsbCBwcm9kdWNlIGEgc21hbGxlciBidXQgbGVzcyBjYXBhYmxlCi0gKiBsaWJyYXJ5LiAgTm90ZSB0aGF0IHlvdSBjYW4gbGVhdmUgY2VydGFpbiBzb3VyY2UgZmlsZXMgb3V0IG9mIHRoZQotICogY29tcGlsYXRpb24vbGlua2luZyBwcm9jZXNzIGlmIHlvdSd2ZSAjdW5kZWYnZCB0aGUgY29ycmVzcG9uZGluZyBzeW1ib2xzLgotICogKFlvdSBtYXkgSEFWRSB0byBkbyB0aGF0IGlmIHlvdXIgY29tcGlsZXIgZG9lc24ndCBsaWtlIG51bGwgc291cmNlIGZpbGVzLikKLSAqLwotCi0vKiBBcml0aG1ldGljIGNvZGluZyBpcyB1bnN1cHBvcnRlZCBmb3IgbGVnYWwgcmVhc29ucy4gIENvbXBsYWludHMgdG8gSUJNLiAqLwotCi0vKiBDYXBhYmlsaXR5IG9wdGlvbnMgY29tbW9uIHRvIGVuY29kZXIgYW5kIGRlY29kZXI6ICovCi0KLSNkZWZpbmUgRENUX0lTTE9XX1NVUFBPUlRFRAkvKiBzbG93IGJ1dCBhY2N1cmF0ZSBpbnRlZ2VyIGFsZ29yaXRobSAqLwotI2RlZmluZSBEQ1RfSUZBU1RfU1VQUE9SVEVECS8qIGZhc3RlciwgbGVzcyBhY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZCAqLwotI3VuZGVmIERDVF9GTE9BVF9TVVBQT1JURUQJLyogZmxvYXRpbmctcG9pbnQ6IGFjY3VyYXRlLCBmYXN0IG9uIGZhc3QgSFcgKi8KLQotLyogRW5jb2RlciBjYXBhYmlsaXR5IG9wdGlvbnM6ICovCi0KLSN1bmRlZiAgQ19BUklUSF9DT0RJTkdfU1VQUE9SVEVEICAgIC8qIEFyaXRobWV0aWMgY29kaW5nIGJhY2sgZW5kPyAqLwotI2RlZmluZSBDX01VTFRJU0NBTl9GSUxFU19TVVBQT1JURUQgLyogTXVsdGlwbGUtc2NhbiBKUEVHIGZpbGVzPyAqLwotI2RlZmluZSBDX1BST0dSRVNTSVZFX1NVUFBPUlRFRAkgICAgLyogUHJvZ3Jlc3NpdmUgSlBFRz8gKFJlcXVpcmVzIE1VTFRJU0NBTikqLwotI2RlZmluZSBFTlRST1BZX09QVF9TVVBQT1JURUQJICAgIC8qIE9wdGltaXphdGlvbiBvZiBlbnRyb3B5IGNvZGluZyBwYXJtcz8gKi8KLS8qIE5vdGU6IGlmIHlvdSBzZWxlY3RlZCAxMi1iaXQgZGF0YSBwcmVjaXNpb24sIGl0IGlzIGRhbmdlcm91cyB0byB0dXJuIG9mZgotICogRU5UUk9QWV9PUFRfU1VQUE9SVEVELiAgVGhlIHN0YW5kYXJkIEh1ZmZtYW4gdGFibGVzIGFyZSBvbmx5IGdvb2QgZm9yIDgtYml0Ci0gKiBwcmVjaXNpb24sIHNvIGpjaHVmZi5jIG5vcm1hbGx5IHVzZXMgZW50cm9weSBvcHRpbWl6YXRpb24gdG8gY29tcHV0ZQotICogdXNhYmxlIHRhYmxlcyBmb3IgaGlnaGVyIHByZWNpc2lvbi4gIElmIHlvdSBkb24ndCB3YW50IHRvIGRvIG9wdGltaXphdGlvbiwKLSAqIHlvdSdsbCBoYXZlIHRvIHN1cHBseSBkaWZmZXJlbnQgZGVmYXVsdCBIdWZmbWFuIHRhYmxlcy4KLSAqIFRoZSBleGFjdCBzYW1lIHN0YXRlbWVudHMgYXBwbHkgZm9yIHByb2dyZXNzaXZlIEpQRUc6IHRoZSBkZWZhdWx0IHRhYmxlcwotICogZG9uJ3Qgd29yayBmb3IgcHJvZ3Jlc3NpdmUgbW9kZS4gIChUaGlzIG1heSBnZXQgZml4ZWQsIGhvd2V2ZXIuKQotICovCi0jZGVmaW5lIElOUFVUX1NNT09USElOR19TVVBQT1JURUQgICAvKiBJbnB1dCBpbWFnZSBzbW9vdGhpbmcgb3B0aW9uPyAqLwotCi0vKiBEZWNvZGVyIGNhcGFiaWxpdHkgb3B0aW9uczogKi8KLQotI3VuZGVmICBEX0FSSVRIX0NPRElOR19TVVBQT1JURUQgICAgLyogQXJpdGhtZXRpYyBjb2RpbmcgYmFjayBlbmQ/ICovCi0jZGVmaW5lIERfTVVMVElTQ0FOX0ZJTEVTX1NVUFBPUlRFRCAvKiBNdWx0aXBsZS1zY2FuIEpQRUcgZmlsZXM/ICovCi0jZGVmaW5lIERfUFJPR1JFU1NJVkVfU1VQUE9SVEVECSAgICAvKiBQcm9ncmVzc2l2ZSBKUEVHPyAoUmVxdWlyZXMgTVVMVElTQ0FOKSovCi0jZGVmaW5lIFNBVkVfTUFSS0VSU19TVVBQT1JURUQJICAgIC8qIGpwZWdfc2F2ZV9tYXJrZXJzKCkgbmVlZGVkPyAqLwotI2RlZmluZSBCTE9DS19TTU9PVEhJTkdfU1VQUE9SVEVEICAgLyogQmxvY2sgc21vb3RoaW5nPyAoUHJvZ3Jlc3NpdmUgb25seSkgKi8KLSNkZWZpbmUgSURDVF9TQ0FMSU5HX1NVUFBPUlRFRAkgICAgLyogT3V0cHV0IHJlc2NhbGluZyB2aWEgSURDVD8gKi8KLSN1bmRlZiBVUFNBTVBMRV9TQ0FMSU5HX1NVUFBPUlRFRCAgLyogT3V0cHV0IHJlc2NhbGluZyBhdCB1cHNhbXBsZSBzdGFnZT8gKi8KLSNkZWZpbmUgVVBTQU1QTEVfTUVSR0lOR19TVVBQT1JURUQgIC8qIEZhc3QgcGF0aCBmb3Igc2xvcHB5IHVwc2FtcGxpbmc/ICovCi0jdW5kZWYgUVVBTlRfMVBBU1NfU1VQUE9SVEVECSAgICAvKiAxLXBhc3MgY29sb3IgcXVhbnRpemF0aW9uPyAqLwotI3VuZGVmIFFVQU5UXzJQQVNTX1NVUFBPUlRFRAkgICAgLyogMi1wYXNzIGNvbG9yIHF1YW50aXphdGlvbj8gKi8KLQotLyogbW9yZSBjYXBhYmlsaXR5IG9wdGlvbnMgbGF0ZXIsIG5vIGRvdWJ0ICovCi0KLQotLyoKLSAqIE9yZGVyaW5nIG9mIFJHQiBkYXRhIGluIHNjYW5saW5lcyBwYXNzZWQgdG8gb3IgZnJvbSB0aGUgYXBwbGljYXRpb24uCi0gKiBJZiB5b3VyIGFwcGxpY2F0aW9uIHdhbnRzIHRvIGRlYWwgd2l0aCBkYXRhIGluIHRoZSBvcmRlciBCLEcsUiwganVzdAotICogY2hhbmdlIHRoZXNlIG1hY3Jvcy4gIFlvdSBjYW4gYWxzbyBkZWFsIHdpdGggZm9ybWF0cyBzdWNoIGFzIFIsRyxCLFgKLSAqIChvbmUgZXh0cmEgYnl0ZSBwZXIgcGl4ZWwpIGJ5IGNoYW5naW5nIFJHQl9QSVhFTFNJWkUuICBOb3RlIHRoYXQgY2hhbmdpbmcKLSAqIHRoZSBvZmZzZXRzIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIG9yZGVyIGluIHdoaWNoIGNvbG9ybWFwIGRhdGEgaXMgb3JnYW5pemVkLgotICogUkVTVFJJQ1RJT05TOgotICogMS4gVGhlIHNhbXBsZSBhcHBsaWNhdGlvbnMgY2pwZWcsZGpwZWcgZG8gTk9UIHN1cHBvcnQgbW9kaWZpZWQgUkdCIGZvcm1hdHMuCi0gKiAyLiBUaGVzZSBtYWNyb3Mgb25seSBhZmZlY3QgUkdCPD0+WUNiQ3IgY29sb3IgY29udmVyc2lvbiwgc28gdGhleSBhcmUgbm90Ci0gKiAgICB1c2VmdWwgaWYgeW91IGFyZSB1c2luZyBKUEVHIGNvbG9yIHNwYWNlcyBvdGhlciB0aGFuIFlDYkNyIG9yIGdyYXlzY2FsZS4KLSAqIDMuIFRoZSBjb2xvciBxdWFudGl6ZXIgbW9kdWxlcyB3aWxsIG5vdCBiZWhhdmUgZGVzaXJhYmx5IGlmIFJHQl9QSVhFTFNJWkUKLSAqICAgIGlzIG5vdCAzICh0aGV5IGRvbid0IHVuZGVyc3RhbmQgYWJvdXQgZHVtbXkgY29sb3IgY29tcG9uZW50cyEpLiAgU28geW91Ci0gKiAgICBjYW4ndCB1c2UgY29sb3IgcXVhbnRpemF0aW9uIGlmIHlvdSBjaGFuZ2UgdGhhdCB2YWx1ZS4KLSAqLwotCi0jZGVmaW5lIFJHQl9SRUQJCTAJLyogT2Zmc2V0IG9mIFJlZCBpbiBhbiBSR0Igc2NhbmxpbmUgZWxlbWVudCAqLwotI2RlZmluZSBSR0JfR1JFRU4JMQkvKiBPZmZzZXQgb2YgR3JlZW4gKi8KLSNkZWZpbmUgUkdCX0JMVUUJMgkvKiBPZmZzZXQgb2YgQmx1ZSAqLwotI2RlZmluZSBSR0JfUElYRUxTSVpFCTMJLyogSlNBTVBMRXMgcGVyIFJHQiBzY2FubGluZSBlbGVtZW50ICovCi0KLQotLyogRGVmaW5pdGlvbnMgZm9yIHNwZWVkLXJlbGF0ZWQgb3B0aW1pemF0aW9ucy4gKi8KLQotCi0vKiBJZiB5b3VyIGNvbXBpbGVyIHN1cHBvcnRzIGlubGluZSBmdW5jdGlvbnMsIGRlZmluZSBJTkxJTkUKLSAqIGFzIHRoZSBpbmxpbmUga2V5d29yZDsgb3RoZXJ3aXNlIGRlZmluZSBpdCBhcyBlbXB0eS4KLSAqLwotCi0jaWZuZGVmIElOTElORQotI2lmZGVmIF9fR05VQ19fCQkJLyogZm9yIGluc3RhbmNlLCBHTlUgQyBrbm93cyBhYm91dCBpbmxpbmUgKi8KLSNkZWZpbmUgSU5MSU5FIF9faW5saW5lX18KLSNlbmRpZgotI2lmbmRlZiBJTkxJTkUKLSNkZWZpbmUgSU5MSU5FCQkJLyogZGVmYXVsdCBpcyB0byBkZWZpbmUgaXQgYXMgZW1wdHkgKi8KLSNlbmRpZgotI2VuZGlmCi0KLQotLyogT24gc29tZSBtYWNoaW5lcyAobm90YWJseSA2ODAwMCBzZXJpZXMpICJpbnQiIGlzIDMyIGJpdHMsIGJ1dCBtdWx0aXBseWluZwotICogdHdvIDE2LWJpdCBzaG9ydHMgaXMgZmFzdGVyIHRoYW4gbXVsdGlwbHlpbmcgdHdvIGludHMuICBEZWZpbmUgTVVMVElQTElFUgotICogYXMgc2hvcnQgb24gc3VjaCBhIG1hY2hpbmUuICBNVUxUSVBMSUVSIG11c3QgYmUgYXQgbGVhc3QgMTYgYml0cyB3aWRlLgotICovCi0KLSNpZm5kZWYgTVVMVElQTElFUgotI2RlZmluZSBNVUxUSVBMSUVSICBpbnQJCS8qIHR5cGUgZm9yIGZhc3Rlc3QgaW50ZWdlciBtdWx0aXBseSAqLwotI2VuZGlmCi0KLQotLyogRkFTVF9GTE9BVCBzaG91bGQgYmUgZWl0aGVyIGZsb2F0IG9yIGRvdWJsZSwgd2hpY2hldmVyIGlzIGRvbmUgZmFzdGVyCi0gKiBieSB5b3VyIGNvbXBpbGVyLiAgKE5vdGUgdGhhdCB0aGlzIHR5cGUgaXMgb25seSB1c2VkIGluIHRoZSBmbG9hdGluZyBwb2ludAotICogRENUIHJvdXRpbmVzLCBzbyBpdCBvbmx5IG1hdHRlcnMgaWYgeW91J3ZlIGRlZmluZWQgRENUX0ZMT0FUX1NVUFBPUlRFRC4pCi0gKiBUeXBpY2FsbHksIGZsb2F0IGlzIGZhc3RlciBpbiBBTlNJIEMgY29tcGlsZXJzLCB3aGlsZSBkb3VibGUgaXMgZmFzdGVyIGluCi0gKiBwcmUtQU5TSSBjb21waWxlcnMgKGJlY2F1c2UgdGhleSBpbnNpc3Qgb24gY29udmVydGluZyB0byBkb3VibGUgYW55d2F5KS4KLSAqIFRoZSBjb2RlIGJlbG93IHRoZXJlZm9yZSBjaG9vc2VzIGZsb2F0IGlmIHdlIGhhdmUgQU5TSS1zdHlsZSBwcm90b3R5cGVzLgotICovCi0KLSNpZm5kZWYgRkFTVF9GTE9BVAotI2lmZGVmIEhBVkVfUFJPVE9UWVBFUwotI2RlZmluZSBGQVNUX0ZMT0FUICBmbG9hdAotI2Vsc2UKLSNkZWZpbmUgRkFTVF9GTE9BVCAgZG91YmxlCi0jZW5kaWYKLSNlbmRpZgotCi0jZW5kaWYgLyogSlBFR19JTlRFUk5BTF9PUFRJT05TICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJqcGVnL2pwZWdpbnQuaCBiL3RoaXJkX3BhcnR5L2xpYmpwZWcvanBlZ2ludC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWIwMGQ0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvanBlZ2ludC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qCi0gKiBqcGVnaW50LmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBwcm92aWRlcyBjb21tb24gZGVjbGFyYXRpb25zIGZvciB0aGUgdmFyaW91cyBKUEVHIG1vZHVsZXMuCi0gKiBUaGVzZSBkZWNsYXJhdGlvbnMgYXJlIGNvbnNpZGVyZWQgaW50ZXJuYWwgdG8gdGhlIEpQRUcgbGlicmFyeTsgbW9zdAotICogYXBwbGljYXRpb25zIHVzaW5nIHRoZSBsaWJyYXJ5IHNob3VsZG4ndCBuZWVkIHRvIGluY2x1ZGUgdGhpcyBmaWxlLgotICovCi0KLQotLyogRGVjbGFyYXRpb25zIGZvciBib3RoIGNvbXByZXNzaW9uICYgZGVjb21wcmVzc2lvbiAqLwotCi10eXBlZGVmIGVudW0gewkJCS8qIE9wZXJhdGluZyBtb2RlcyBmb3IgYnVmZmVyIGNvbnRyb2xsZXJzICovCi0JSkJVRl9QQVNTX1RIUlUsCQkvKiBQbGFpbiBzdHJpcHdpc2Ugb3BlcmF0aW9uICovCi0JLyogUmVtYWluaW5nIG1vZGVzIHJlcXVpcmUgYSBmdWxsLWltYWdlIGJ1ZmZlciB0byBoYXZlIGJlZW4gY3JlYXRlZCAqLwotCUpCVUZfU0FWRV9TT1VSQ0UsCS8qIFJ1biBzb3VyY2Ugc3Vib2JqZWN0IG9ubHksIHNhdmUgb3V0cHV0ICovCi0JSkJVRl9DUkFOS19ERVNULAkvKiBSdW4gZGVzdCBzdWJvYmplY3Qgb25seSwgdXNpbmcgc2F2ZWQgZGF0YSAqLwotCUpCVUZfU0FWRV9BTkRfUEFTUwkvKiBSdW4gYm90aCBzdWJvYmplY3RzLCBzYXZlIG91dHB1dCAqLwotfSBKX0JVRl9NT0RFOwotCi0vKiBWYWx1ZXMgb2YgZ2xvYmFsX3N0YXRlIGZpZWxkIChqZGFwaS5jIGhhcyBzb21lIGRlcGVuZGVuY2llcyBvbiBvcmRlcmluZyEpICovCi0jZGVmaW5lIENTVEFURV9TVEFSVAkxMDAJLyogYWZ0ZXIgY3JlYXRlX2NvbXByZXNzICovCi0jZGVmaW5lIENTVEFURV9TQ0FOTklORwkxMDEJLyogc3RhcnRfY29tcHJlc3MgZG9uZSwgd3JpdGVfc2NhbmxpbmVzIE9LICovCi0jZGVmaW5lIENTVEFURV9SQVdfT0sJMTAyCS8qIHN0YXJ0X2NvbXByZXNzIGRvbmUsIHdyaXRlX3Jhd19kYXRhIE9LICovCi0jZGVmaW5lIENTVEFURV9XUkNPRUZTCTEwMwkvKiBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cyBkb25lICovCi0jZGVmaW5lIERTVEFURV9TVEFSVAkyMDAJLyogYWZ0ZXIgY3JlYXRlX2RlY29tcHJlc3MgKi8KLSNkZWZpbmUgRFNUQVRFX0lOSEVBREVSCTIwMQkvKiByZWFkaW5nIGhlYWRlciBtYXJrZXJzLCBubyBTT1MgeWV0ICovCi0jZGVmaW5lIERTVEFURV9SRUFEWQkyMDIJLyogZm91bmQgU09TLCByZWFkeSBmb3Igc3RhcnRfZGVjb21wcmVzcyAqLwotI2RlZmluZSBEU1RBVEVfUFJFTE9BRAkyMDMJLyogcmVhZGluZyBtdWx0aXNjYW4gZmlsZSBpbiBzdGFydF9kZWNvbXByZXNzKi8KLSNkZWZpbmUgRFNUQVRFX1BSRVNDQU4JMjA0CS8qIHBlcmZvcm1pbmcgZHVtbXkgcGFzcyBmb3IgMi1wYXNzIHF1YW50ICovCi0jZGVmaW5lIERTVEFURV9TQ0FOTklORwkyMDUJLyogc3RhcnRfZGVjb21wcmVzcyBkb25lLCByZWFkX3NjYW5saW5lcyBPSyAqLwotI2RlZmluZSBEU1RBVEVfUkFXX09LCTIwNgkvKiBzdGFydF9kZWNvbXByZXNzIGRvbmUsIHJlYWRfcmF3X2RhdGEgT0sgKi8KLSNkZWZpbmUgRFNUQVRFX0JVRklNQUdFCTIwNwkvKiBleHBlY3RpbmcganBlZ19zdGFydF9vdXRwdXQgKi8KLSNkZWZpbmUgRFNUQVRFX0JVRlBPU1QJMjA4CS8qIGxvb2tpbmcgZm9yIFNPUy9FT0kgaW4ganBlZ19maW5pc2hfb3V0cHV0ICovCi0jZGVmaW5lIERTVEFURV9SRENPRUZTCTIwOQkvKiByZWFkaW5nIGZpbGUgaW4ganBlZ19yZWFkX2NvZWZmaWNpZW50cyAqLwotI2RlZmluZSBEU1RBVEVfU1RPUFBJTkcJMjEwCS8qIGxvb2tpbmcgZm9yIEVPSSBpbiBqcGVnX2ZpbmlzaF9kZWNvbXByZXNzICovCi0KLQotLyogRGVjbGFyYXRpb25zIGZvciBjb21wcmVzc2lvbiBtb2R1bGVzICovCi0KLS8qIE1hc3RlciBjb250cm9sIG1vZHVsZSAqLwotc3RydWN0IGpwZWdfY29tcF9tYXN0ZXIgewotICBKTUVUSE9EKHZvaWQsIHByZXBhcmVfZm9yX3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIHBhc3Nfc3RhcnR1cCwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgZmluaXNoX3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotCi0gIC8qIFN0YXRlIHZhcmlhYmxlcyBtYWRlIHZpc2libGUgdG8gb3RoZXIgbW9kdWxlcyAqLwotICBib29sZWFuIGNhbGxfcGFzc19zdGFydHVwOwkvKiBUcnVlIGlmIHBhc3Nfc3RhcnR1cCBtdXN0IGJlIGNhbGxlZCAqLwotICBib29sZWFuIGlzX2xhc3RfcGFzczsJCS8qIFRydWUgZHVyaW5nIGxhc3QgcGFzcyAqLwotfTsKLQotLyogTWFpbiBidWZmZXIgY29udHJvbCAoZG93bnNhbXBsZWQtZGF0YSBidWZmZXIpICovCi1zdHJ1Y3QganBlZ19jX21haW5fY29udHJvbGxlciB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkpOwotICBKTUVUSE9EKHZvaWQsIHByb2Nlc3NfZGF0YSwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJICAgICAgIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKRElNRU5TSU9OICppbl9yb3dfY3RyLAotCQkJICAgICAgIEpESU1FTlNJT04gaW5fcm93c19hdmFpbCkpOwotfTsKLQotLyogQ29tcHJlc3Npb24gcHJlcHJvY2Vzc2luZyAoZG93bnNhbXBsaW5nIGlucHV0IGJ1ZmZlciBjb250cm9sKSAqLwotc3RydWN0IGpwZWdfY19wcmVwX2NvbnRyb2xsZXIgewotICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbywgSl9CVUZfTU9ERSBwYXNzX21vZGUpKTsKLSAgSk1FVEhPRCh2b2lkLCBwcmVfcHJvY2Vzc19kYXRhLCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJICAgSlNBTVBBUlJBWSBpbnB1dF9idWYsCi0JCQkJICAgSkRJTUVOU0lPTiAqaW5fcm93X2N0ciwKLQkJCQkgICBKRElNRU5TSU9OIGluX3Jvd3NfYXZhaWwsCi0JCQkJICAgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAotCQkJCSAgIEpESU1FTlNJT04gKm91dF9yb3dfZ3JvdXBfY3RyLAotCQkJCSAgIEpESU1FTlNJT04gb3V0X3Jvd19ncm91cHNfYXZhaWwpKTsKLX07Ci0KLS8qIENvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sICovCi1zdHJ1Y3QganBlZ19jX2NvZWZfY29udHJvbGxlciB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKX0JVRl9NT0RFIHBhc3NfbW9kZSkpOwotICBKTUVUSE9EKGJvb2xlYW4sIGNvbXByZXNzX2RhdGEsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkgICBKU0FNUElNQUdFIGlucHV0X2J1ZikpOwotfTsKLQotLyogQ29sb3JzcGFjZSBjb252ZXJzaW9uICovCi1zdHJ1Y3QganBlZ19jb2xvcl9jb252ZXJ0ZXIgewotICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIGNvbG9yX2NvbnZlcnQsIChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQlKU0FNUEFSUkFZIGlucHV0X2J1ZiwgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAotCQkJCUpESU1FTlNJT04gb3V0cHV0X3JvdywgaW50IG51bV9yb3dzKSk7Ci19OwotCi0vKiBEb3duc2FtcGxpbmcgKi8KLXN0cnVjdCBqcGVnX2Rvd25zYW1wbGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCBkb3duc2FtcGxlLCAoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkgICAgIEpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGluX3Jvd19pbmRleCwKLQkJCSAgICAgSlNBTVBJTUFHRSBvdXRwdXRfYnVmLAotCQkJICAgICBKRElNRU5TSU9OIG91dF9yb3dfZ3JvdXBfaW5kZXgpKTsKLQotICBib29sZWFuIG5lZWRfY29udGV4dF9yb3dzOwkvKiBUUlVFIGlmIG5lZWQgcm93cyBhYm92ZSAmIGJlbG93ICovCi19OwotCi0vKiBGb3J3YXJkIERDVCAoYWxzbyBjb250cm9scyBjb2VmZmljaWVudCBxdWFudGl6YXRpb24pICovCi1zdHJ1Y3QganBlZ19mb3J3YXJkX2RjdCB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIC8qIHBlcmhhcHMgdGhpcyBzaG91bGQgYmUgYW4gYXJyYXk/Pz8gKi8KLSAgSk1FVEhPRCh2b2lkLCBmb3J3YXJkX0RDVCwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJICAgICAganBlZ19jb21wb25lbnRfaW5mbyAqIGNvbXBwdHIsCi0JCQkgICAgICBKU0FNUEFSUkFZIHNhbXBsZV9kYXRhLCBKQkxPQ0tST1cgY29lZl9ibG9ja3MsCi0JCQkgICAgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywgSkRJTUVOU0lPTiBzdGFydF9jb2wsCi0JCQkgICAgICBKRElNRU5TSU9OIG51bV9ibG9ja3MpKTsKLX07Ci0KLS8qIEVudHJvcHkgZW5jb2RpbmcgKi8KLXN0cnVjdCBqcGVnX2VudHJvcHlfZW5jb2RlciB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBib29sZWFuIGdhdGhlcl9zdGF0aXN0aWNzKSk7Ci0gIEpNRVRIT0QoYm9vbGVhbiwgZW5jb2RlX21jdSwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBKQkxPQ0tST1cgKk1DVV9kYXRhKSk7Ci0gIEpNRVRIT0Qodm9pZCwgZmluaXNoX3Bhc3MsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotfTsKLQotLyogTWFya2VyIHdyaXRpbmcgKi8KLXN0cnVjdCBqcGVnX21hcmtlcl93cml0ZXIgewotICBKTUVUSE9EKHZvaWQsIHdyaXRlX2ZpbGVfaGVhZGVyLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCB3cml0ZV9mcmFtZV9oZWFkZXIsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIHdyaXRlX3NjYW5faGVhZGVyLCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCB3cml0ZV9maWxlX3RyYWlsZXIsIChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIHdyaXRlX3RhYmxlc19vbmx5LCAoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLSAgLyogVGhlc2Ugcm91dGluZXMgYXJlIGV4cG9ydGVkIHRvIGFsbG93IGluc2VydGlvbiBvZiBleHRyYSBtYXJrZXJzICovCi0gIC8qIFByb2JhYmx5IG9ubHkgQ09NIGFuZCBBUFBuIG1hcmtlcnMgc2hvdWxkIGJlIHdyaXR0ZW4gdGhpcyB3YXkgKi8KLSAgSk1FVEhPRCh2b2lkLCB3cml0ZV9tYXJrZXJfaGVhZGVyLCAoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXIsCi0JCQkJICAgICAgdW5zaWduZWQgaW50IGRhdGFsZW4pKTsKLSAgSk1FVEhPRCh2b2lkLCB3cml0ZV9tYXJrZXJfYnl0ZSwgKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgdmFsKSk7Ci19OwotCi0KLS8qIERlY2xhcmF0aW9ucyBmb3IgZGVjb21wcmVzc2lvbiBtb2R1bGVzICovCi0KLS8qIE1hc3RlciBjb250cm9sIG1vZHVsZSAqLwotc3RydWN0IGpwZWdfZGVjb21wX21hc3RlciB7Ci0gIEpNRVRIT0Qodm9pZCwgcHJlcGFyZV9mb3Jfb3V0cHV0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgZmluaXNoX291dHB1dF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotCi0gIC8qIFN0YXRlIHZhcmlhYmxlcyBtYWRlIHZpc2libGUgdG8gb3RoZXIgbW9kdWxlcyAqLwotICBib29sZWFuIGlzX2R1bW15X3Bhc3M7CS8qIFRydWUgZHVyaW5nIDFzdCBwYXNzIGZvciAyLXBhc3MgcXVhbnQgKi8KLX07Ci0KLS8qIElucHV0IGNvbnRyb2wgbW9kdWxlICovCi1zdHJ1Y3QganBlZ19pbnB1dF9jb250cm9sbGVyIHsKLSAgSk1FVEhPRChpbnQsIGNvbnN1bWVfaW5wdXQsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgcmVzZXRfaW5wdXRfY29udHJvbGxlciwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9pbnB1dF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIGZpbmlzaF9pbnB1dF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotCi0gIC8qIFN0YXRlIHZhcmlhYmxlcyBtYWRlIHZpc2libGUgdG8gb3RoZXIgbW9kdWxlcyAqLwotICBib29sZWFuIGhhc19tdWx0aXBsZV9zY2FuczsJLyogVHJ1ZSBpZiBmaWxlIGhhcyBtdWx0aXBsZSBzY2FucyAqLwotICBib29sZWFuIGVvaV9yZWFjaGVkOwkJLyogVHJ1ZSB3aGVuIEVPSSBoYXMgYmVlbiBjb25zdW1lZCAqLwotfTsKLQotLyogTWFpbiBidWZmZXIgY29udHJvbCAoZG93bnNhbXBsZWQtZGF0YSBidWZmZXIpICovCi1zdHJ1Y3QganBlZ19kX21haW5fY29udHJvbGxlciB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKSk7Ci0gIEpNRVRIT0Qodm9pZCwgcHJvY2Vzc19kYXRhLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCSAgICAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAotCQkJICAgICAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKLX07Ci0KLS8qIENvZWZmaWNpZW50IGJ1ZmZlciBjb250cm9sICovCi1zdHJ1Y3QganBlZ19kX2NvZWZfY29udHJvbGxlciB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfaW5wdXRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRChpbnQsIGNvbnN1bWVfZGF0YSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9vdXRwdXRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRChpbnQsIGRlY29tcHJlc3NfZGF0YSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJIEpTQU1QSU1BR0Ugb3V0cHV0X2J1ZikpOwotICAvKiBQb2ludGVyIHRvIGFycmF5IG9mIGNvZWZmaWNpZW50IHZpcnR1YWwgYXJyYXlzLCBvciBOVUxMIGlmIG5vbmUgKi8KLSAganZpcnRfYmFycmF5X3B0ciAqY29lZl9hcnJheXM7Ci19OwotCi0vKiBEZWNvbXByZXNzaW9uIHBvc3Rwcm9jZXNzaW5nIChjb2xvciBxdWFudGl6YXRpb24gYnVmZmVyIGNvbnRyb2wpICovCi1zdHJ1Y3QganBlZ19kX3Bvc3RfY29udHJvbGxlciB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIEpfQlVGX01PREUgcGFzc19tb2RlKSk7Ci0gIEpNRVRIT0Qodm9pZCwgcG9zdF9wcm9jZXNzX2RhdGEsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSAgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwKLQkJCQkgICAgSkRJTUVOU0lPTiAqaW5fcm93X2dyb3VwX2N0ciwKLQkJCQkgICAgSkRJTUVOU0lPTiBpbl9yb3dfZ3JvdXBzX2F2YWlsLAotCQkJCSAgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsCi0JCQkJICAgIEpESU1FTlNJT04gKm91dF9yb3dfY3RyLAotCQkJCSAgICBKRElNRU5TSU9OIG91dF9yb3dzX2F2YWlsKSk7Ci19OwotCi0vKiBNYXJrZXIgcmVhZGluZyAmIHBhcnNpbmcgKi8KLXN0cnVjdCBqcGVnX21hcmtlcl9yZWFkZXIgewotICBKTUVUSE9EKHZvaWQsIHJlc2V0X21hcmtlcl9yZWFkZXIsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIC8qIFJlYWQgbWFya2VycyB1bnRpbCBTT1Mgb3IgRU9JLgotICAgKiBSZXR1cm5zIHNhbWUgY29kZXMgYXMgYXJlIGRlZmluZWQgZm9yIGpwZWdfY29uc3VtZV9pbnB1dDoKLSAgICogSlBFR19TVVNQRU5ERUQsIEpQRUdfUkVBQ0hFRF9TT1MsIG9yIEpQRUdfUkVBQ0hFRF9FT0kuCi0gICAqLwotICBKTUVUSE9EKGludCwgcmVhZF9tYXJrZXJzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICAvKiBSZWFkIGEgcmVzdGFydCBtYXJrZXIgLS0tIGV4cG9ydGVkIGZvciB1c2UgYnkgZW50cm9weSBkZWNvZGVyIG9ubHkgKi8KLSAganBlZ19tYXJrZXJfcGFyc2VyX21ldGhvZCByZWFkX3Jlc3RhcnRfbWFya2VyOwotCi0gIC8qIFN0YXRlIG9mIG1hcmtlciByZWFkZXIgLS0tIG5vbWluYWxseSBpbnRlcm5hbCwgYnV0IGFwcGxpY2F0aW9ucwotICAgKiBzdXBwbHlpbmcgQ09NIG9yIEFQUG4gaGFuZGxlcnMgbWlnaHQgbGlrZSB0byBrbm93IHRoZSBzdGF0ZS4KLSAgICovCi0gIGJvb2xlYW4gc2F3X1NPSTsJCS8qIGZvdW5kIFNPST8gKi8KLSAgYm9vbGVhbiBzYXdfU09GOwkJLyogZm91bmQgU09GPyAqLwotICBpbnQgbmV4dF9yZXN0YXJ0X251bTsJCS8qIG5leHQgcmVzdGFydCBudW1iZXIgZXhwZWN0ZWQgKDAtNykgKi8KLSAgdW5zaWduZWQgaW50IGRpc2NhcmRlZF9ieXRlczsJLyogIyBvZiBieXRlcyBza2lwcGVkIGxvb2tpbmcgZm9yIGEgbWFya2VyICovCi19OwotCi0vKiBFbnRyb3B5IGRlY29kaW5nICovCi1zdHJ1Y3QganBlZ19lbnRyb3B5X2RlY29kZXIgewotICBKTUVUSE9EKHZvaWQsIHN0YXJ0X3Bhc3MsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0QoYm9vbGVhbiwgZGVjb2RlX21jdSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJSkJMT0NLUk9XICpNQ1VfZGF0YSkpOwotCi0gIC8qIFRoaXMgaXMgaGVyZSB0byBzaGFyZSBjb2RlIGJldHdlZW4gYmFzZWxpbmUgYW5kIHByb2dyZXNzaXZlIGRlY29kZXJzOyAqLwotICAvKiBvdGhlciBtb2R1bGVzIHByb2JhYmx5IHNob3VsZCBub3QgdXNlIGl0ICovCi0gIGJvb2xlYW4gaW5zdWZmaWNpZW50X2RhdGE7CS8qIHNldCBUUlVFIGFmdGVyIGVtaXR0aW5nIHdhcm5pbmcgKi8KLX07Ci0KLS8qIEludmVyc2UgRENUIChhbHNvIHBlcmZvcm1zIGRlcXVhbnRpemF0aW9uKSAqLwotdHlwZWRlZiBKTUVUSE9EKHZvaWQsIGludmVyc2VfRENUX21ldGhvZF9wdHIsCi0JCShqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcHB0ciwKLQkJIEpDT0VGUFRSIGNvZWZfYmxvY2ssCi0JCSBKU0FNUEFSUkFZIG91dHB1dF9idWYsIEpESU1FTlNJT04gb3V0cHV0X2NvbCkpOwotCi1zdHJ1Y3QganBlZ19pbnZlcnNlX2RjdCB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgLyogSXQgaXMgdXNlZnVsIHRvIGFsbG93IGVhY2ggY29tcG9uZW50IHRvIGhhdmUgYSBzZXBhcmF0ZSBJRENUIG1ldGhvZC4gKi8KLSAgaW52ZXJzZV9EQ1RfbWV0aG9kX3B0ciBpbnZlcnNlX0RDVFtNQVhfQ09NUE9ORU5UU107Ci19OwotCi0vKiBVcHNhbXBsaW5nIChub3RlIHRoYXQgdXBzYW1wbGVyIG11c3QgYWxzbyBjYWxsIGNvbG9yIGNvbnZlcnRlcikgKi8KLXN0cnVjdCBqcGVnX3Vwc2FtcGxlciB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLSAgSk1FVEhPRCh2b2lkLCB1cHNhbXBsZSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkgICBKU0FNUElNQUdFIGlucHV0X2J1ZiwKLQkJCSAgIEpESU1FTlNJT04gKmluX3Jvd19ncm91cF9jdHIsCi0JCQkgICBKRElNRU5TSU9OIGluX3Jvd19ncm91cHNfYXZhaWwsCi0JCQkgICBKU0FNUEFSUkFZIG91dHB1dF9idWYsCi0JCQkgICBKRElNRU5TSU9OICpvdXRfcm93X2N0ciwKLQkJCSAgIEpESU1FTlNJT04gb3V0X3Jvd3NfYXZhaWwpKTsKLQotICBib29sZWFuIG5lZWRfY29udGV4dF9yb3dzOwkvKiBUUlVFIGlmIG5lZWQgcm93cyBhYm92ZSAmIGJlbG93ICovCi19OwotCi0vKiBDb2xvcnNwYWNlIGNvbnZlcnNpb24gKi8KLXN0cnVjdCBqcGVnX2NvbG9yX2RlY29udmVydGVyIHsKLSAgSk1FVEhPRCh2b2lkLCBzdGFydF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIGNvbG9yX2NvbnZlcnQsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCUpTQU1QSU1BR0UgaW5wdXRfYnVmLCBKRElNRU5TSU9OIGlucHV0X3JvdywKLQkJCQlKU0FNUEFSUkFZIG91dHB1dF9idWYsIGludCBudW1fcm93cykpOwotfTsKLQotLyogQ29sb3IgcXVhbnRpemF0aW9uIG9yIGNvbG9yIHByZWNpc2lvbiByZWR1Y3Rpb24gKi8KLXN0cnVjdCBqcGVnX2NvbG9yX3F1YW50aXplciB7Ci0gIEpNRVRIT0Qodm9pZCwgc3RhcnRfcGFzcywgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGJvb2xlYW4gaXNfcHJlX3NjYW4pKTsKLSAgSk1FVEhPRCh2b2lkLCBjb2xvcl9xdWFudGl6ZSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJIEpTQU1QQVJSQVkgaW5wdXRfYnVmLCBKU0FNUEFSUkFZIG91dHB1dF9idWYsCi0JCQkJIGludCBudW1fcm93cykpOwotICBKTUVUSE9EKHZvaWQsIGZpbmlzaF9wYXNzLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIG5ld19jb2xvcl9tYXAsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci19OwotCi0KLS8qIE1pc2NlbGxhbmVvdXMgdXNlZnVsIG1hY3JvcyAqLwotCi0jdW5kZWYgTUFYCi0jZGVmaW5lIE1BWChhLGIpCSgoYSkgPiAoYikgPyAoYSkgOiAoYikpCi0jdW5kZWYgTUlOCi0jZGVmaW5lIE1JTihhLGIpCSgoYSkgPCAoYikgPyAoYSkgOiAoYikpCi0KLQotLyogV2UgYXNzdW1lIHRoYXQgcmlnaHQgc2hpZnQgY29ycmVzcG9uZHMgdG8gc2lnbmVkIGRpdmlzaW9uIGJ5IDIgd2l0aAotICogcm91bmRpbmcgdG93YXJkcyBtaW51cyBpbmZpbml0eS4gIFRoaXMgaXMgY29ycmVjdCBmb3IgdHlwaWNhbCAiYXJpdGhtZXRpYwotICogc2hpZnQiIGluc3RydWN0aW9ucyB0aGF0IHNoaWZ0IGluIGNvcGllcyBvZiB0aGUgc2lnbiBiaXQuICBCdXQgc29tZQotICogQyBjb21waWxlcnMgaW1wbGVtZW50ID4+IHdpdGggYW4gdW5zaWduZWQgc2hpZnQuICBGb3IgdGhlc2UgbWFjaGluZXMgeW91Ci0gKiBtdXN0IGRlZmluZSBSSUdIVF9TSElGVF9JU19VTlNJR05FRC4KLSAqIFJJR0hUX1NISUZUIHByb3ZpZGVzIGEgcHJvcGVyIHNpZ25lZCByaWdodCBzaGlmdCBvZiBhbiBJTlQzMiBxdWFudGl0eS4KLSAqIEl0IGlzIG9ubHkgYXBwbGllZCB3aXRoIGNvbnN0YW50IHNoaWZ0IGNvdW50cy4gIFNISUZUX1RFTVBTIG11c3QgYmUKLSAqIGluY2x1ZGVkIGluIHRoZSB2YXJpYWJsZXMgb2YgYW55IHJvdXRpbmUgdXNpbmcgUklHSFRfU0hJRlQuCi0gKi8KLQotI2lmZGVmIFJJR0hUX1NISUZUX0lTX1VOU0lHTkVECi0jZGVmaW5lIFNISUZUX1RFTVBTCUlOVDMyIHNoaWZ0X3RlbXA7Ci0jZGVmaW5lIFJJR0hUX1NISUZUKHgsc2hmdCkgIFwKLQkoKHNoaWZ0X3RlbXAgPSAoeCkpIDwgMCA/IFwKLQkgKHNoaWZ0X3RlbXAgPj4gKHNoZnQpKSB8ICgofigoSU5UMzIpIDApKSA8PCAoMzItKHNoZnQpKSkgOiBcCi0JIChzaGlmdF90ZW1wID4+IChzaGZ0KSkpCi0jZWxzZQotI2RlZmluZSBTSElGVF9URU1QUwotI2RlZmluZSBSSUdIVF9TSElGVCh4LHNoZnQpCSgoeCkgPj4gKHNoZnQpKQotI2VuZGlmCi0KLQotLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCi0KLSNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jZGVmaW5lIGppbml0X2NvbXByZXNzX21hc3RlcglqSUNvbXByZXNzCi0jZGVmaW5lIGppbml0X2NfbWFzdGVyX2NvbnRyb2wJaklDTWFzdGVyCi0jZGVmaW5lIGppbml0X2NfbWFpbl9jb250cm9sbGVyCWpJQ01haW5DCi0jZGVmaW5lIGppbml0X2NfcHJlcF9jb250cm9sbGVyCWpJQ1ByZXBDCi0jZGVmaW5lIGppbml0X2NfY29lZl9jb250cm9sbGVyCWpJQ0NvZWZDCi0jZGVmaW5lIGppbml0X2NvbG9yX2NvbnZlcnRlcglqSUNDb2xvcgotI2RlZmluZSBqaW5pdF9kb3duc2FtcGxlcglqSURvd25zYW1wbGVyCi0jZGVmaW5lIGppbml0X2ZvcndhcmRfZGN0CWpJRkRDVAotI2RlZmluZSBqaW5pdF9odWZmX2VuY29kZXIJaklIRW5jb2RlcgotI2RlZmluZSBqaW5pdF9waHVmZl9lbmNvZGVyCWpJUEhFbmNvZGVyCi0jZGVmaW5lIGppbml0X21hcmtlcl93cml0ZXIJaklNV3JpdGVyCi0jZGVmaW5lIGppbml0X21hc3Rlcl9kZWNvbXByZXNzCWpJRE1hc3RlcgotI2RlZmluZSBqaW5pdF9kX21haW5fY29udHJvbGxlcglqSURNYWluQwotI2RlZmluZSBqaW5pdF9kX2NvZWZfY29udHJvbGxlcglqSURDb2VmQwotI2RlZmluZSBqaW5pdF9kX3Bvc3RfY29udHJvbGxlcglqSURQb3N0QwotI2RlZmluZSBqaW5pdF9pbnB1dF9jb250cm9sbGVyCWpJSW5DdGxyCi0jZGVmaW5lIGppbml0X21hcmtlcl9yZWFkZXIJaklNUmVhZGVyCi0jZGVmaW5lIGppbml0X2h1ZmZfZGVjb2RlcglqSUhEZWNvZGVyCi0jZGVmaW5lIGppbml0X3BodWZmX2RlY29kZXIJaklQSERlY29kZXIKLSNkZWZpbmUgamluaXRfaW52ZXJzZV9kY3QJaklJRENUCi0jZGVmaW5lIGppbml0X3Vwc2FtcGxlcgkJaklVcHNhbXBsZXIKLSNkZWZpbmUgamluaXRfY29sb3JfZGVjb252ZXJ0ZXIJaklEQ29sb3IKLSNkZWZpbmUgamluaXRfMXBhc3NfcXVhbnRpemVyCWpJMVF1YW50Ci0jZGVmaW5lIGppbml0XzJwYXNzX3F1YW50aXplcglqSTJRdWFudAotI2RlZmluZSBqaW5pdF9tZXJnZWRfdXBzYW1wbGVyCWpJTVVwc2FtcGxlcgotI2RlZmluZSBqaW5pdF9tZW1vcnlfbWdyCWpJTWVtTWdyCi0jZGVmaW5lIGpkaXZfcm91bmRfdXAJCWpEaXZSb3VuZAotI2RlZmluZSBqcm91bmRfdXAJCWpSb3VuZAotI2RlZmluZSBqY29weV9zYW1wbGVfcm93cwlqQ29weVNhbXBsZXMKLSNkZWZpbmUgamNvcHlfYmxvY2tfcm93CQlqQ29weUJsb2NrcwotI2RlZmluZSBqemVyb19mYXIJCWpaZXJvRmFyCi0jZGVmaW5lIGpwZWdfemlnemFnX29yZGVyCWpaSUdUYWJsZQotI2RlZmluZSBqcGVnX25hdHVyYWxfb3JkZXIJalpBR1RhYmxlCi0jZW5kaWYgLyogTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUyAqLwotCi0KLS8qIENvbXByZXNzaW9uIG1vZHVsZSBpbml0aWFsaXphdGlvbiByb3V0aW5lcyAqLwotRVhURVJOKHZvaWQpIGppbml0X2NvbXByZXNzX21hc3RlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfY19tYXN0ZXJfY29udHJvbCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgYm9vbGVhbiB0cmFuc2NvZGVfb25seSkpOwotRVhURVJOKHZvaWQpIGppbml0X2NfbWFpbl9jb250cm9sbGVyIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfY19wcmVwX2NvbnRyb2xsZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9jX2NvZWZfY29udHJvbGxlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikpOwotRVhURVJOKHZvaWQpIGppbml0X2NvbG9yX2NvbnZlcnRlciBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfZG93bnNhbXBsZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0X2ZvcndhcmRfZGN0IEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9odWZmX2VuY29kZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0X3BodWZmX2VuY29kZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0X21hcmtlcl93cml0ZXIgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbykpOwotLyogRGVjb21wcmVzc2lvbiBtb2R1bGUgaW5pdGlhbGl6YXRpb24gcm91dGluZXMgKi8KLUVYVEVSTih2b2lkKSBqaW5pdF9tYXN0ZXJfZGVjb21wcmVzcyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9kX21haW5fY29udHJvbGxlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgYm9vbGVhbiBuZWVkX2Z1bGxfYnVmZmVyKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfZF9jb2VmX2NvbnRyb2xsZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgIGJvb2xlYW4gbmVlZF9mdWxsX2J1ZmZlcikpOwotRVhURVJOKHZvaWQpIGppbml0X2RfcG9zdF9jb250cm9sbGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICBib29sZWFuIG5lZWRfZnVsbF9idWZmZXIpKTsKLUVYVEVSTih2b2lkKSBqaW5pdF9pbnB1dF9jb250cm9sbGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0X21hcmtlcl9yZWFkZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfaHVmZl9kZWNvZGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0X3BodWZmX2RlY29kZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfaW52ZXJzZV9kY3QgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfdXBzYW1wbGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0X2NvbG9yX2RlY29udmVydGVyIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGppbml0XzFwYXNzX3F1YW50aXplciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqaW5pdF8ycGFzc19xdWFudGl6ZXIgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkgamluaXRfbWVyZ2VkX3Vwc2FtcGxlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLS8qIE1lbW9yeSBtYW5hZ2VyIGluaXRpYWxpemF0aW9uICovCi1FWFRFUk4odm9pZCkgamluaXRfbWVtb3J5X21nciBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOwotCi0vKiBVdGlsaXR5IHJvdXRpbmVzIGluIGp1dGlscy5jICovCi1FWFRFUk4obG9uZykgamRpdl9yb3VuZF91cCBKUFAoKGxvbmcgYSwgbG9uZyBiKSk7Ci1FWFRFUk4obG9uZykganJvdW5kX3VwIEpQUCgobG9uZyBhLCBsb25nIGIpKTsKLUVYVEVSTih2b2lkKSBqY29weV9zYW1wbGVfcm93cyBKUFAoKEpTQU1QQVJSQVkgaW5wdXRfYXJyYXksIGludCBzb3VyY2Vfcm93LAotCQkJCSAgICBKU0FNUEFSUkFZIG91dHB1dF9hcnJheSwgaW50IGRlc3Rfcm93LAotCQkJCSAgICBpbnQgbnVtX3Jvd3MsIEpESU1FTlNJT04gbnVtX2NvbHMpKTsKLUVYVEVSTih2b2lkKSBqY29weV9ibG9ja19yb3cgSlBQKChKQkxPQ0tST1cgaW5wdXRfcm93LCBKQkxPQ0tST1cgb3V0cHV0X3JvdywKLQkJCQkgIEpESU1FTlNJT04gbnVtX2Jsb2NrcykpOwotRVhURVJOKHZvaWQpIGp6ZXJvX2ZhciBKUFAoKHZvaWQgRkFSICogdGFyZ2V0LCBzaXplX3QgYnl0ZXN0b3plcm8pKTsKLS8qIENvbnN0YW50IHRhYmxlcyBpbiBqdXRpbHMuYyAqLwotI2lmIDAJCQkJLyogVGhpcyB0YWJsZSBpcyBub3QgYWN0dWFsbHkgbmVlZGVkIGluIHY2YSAqLwotZXh0ZXJuIGNvbnN0IGludCBqcGVnX3ppZ3phZ19vcmRlcltdOyAvKiBuYXR1cmFsIGNvZWYgb3JkZXIgdG8gemlnemFnIG9yZGVyICovCi0jZW5kaWYKLWV4dGVybiBjb25zdCBpbnQganBlZ19uYXR1cmFsX29yZGVyW107IC8qIHppZ3phZyBjb2VmIG9yZGVyIHRvIG5hdHVyYWwgb3JkZXIgKi8KLQotLyogU3VwcHJlc3MgdW5kZWZpbmVkLXN0cnVjdHVyZSBjb21wbGFpbnRzIGlmIG5lY2Vzc2FyeS4gKi8KLQotI2lmZGVmIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOCi0jaWZuZGVmIEFNX01FTU9SWV9NQU5BR0VSCS8qIG9ubHkgam1lbW1nci5jIGRlZmluZXMgdGhlc2UgKi8KLXN0cnVjdCBqdmlydF9zYXJyYXlfY29udHJvbCB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganZpcnRfYmFycmF5X2NvbnRyb2wgeyBsb25nIGR1bW15OyB9OwotI2VuZGlmCi0jZW5kaWYgLyogSU5DT01QTEVURV9UWVBFU19CUk9LRU4gKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvanBlZ2xpYi5oIGIvdGhpcmRfcGFydHkvbGlianBlZy9qcGVnbGliLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YWY0ZjIuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlianBlZy9qcGVnbGliLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAwICswLDAgQEAKLS8qCi0gKiBqcGVnbGliLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTEtMTk5OCwgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgZm9yIHRoZSBKUEVHIGxpYnJhcnkuCi0gKiBNb3N0IGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgbGlicmFyeSBuZWVkIG9ubHkgaW5jbHVkZSB0aGlzIGZpbGUsCi0gKiBhbmQgcGVyaGFwcyBqZXJyb3IuaCBpZiB0aGV5IHdhbnQgdG8ga25vdyB0aGUgZXhhY3QgZXJyb3IgY29kZXMuCi0gKi8KLQotI2lmbmRlZiBKUEVHTElCX0gKLSNkZWZpbmUgSlBFR0xJQl9ICi0KLSNkZWZpbmUgRk9YSVRfUFJFRklYKG9yaWdOYW1lKSAgRlBERkFQSUpQRUdfIyNvcmlnTmFtZQotCi0jZGVmaW5lIGpjb3B5X2Jsb2NrX3JvdyBGT1hJVF9QUkVGSVgoamNvcHlfYmxvY2tfcm93KQotI2RlZmluZSBqY29weV9zYW1wbGVfcm93cyBGT1hJVF9QUkVGSVgoamNvcHlfc2FtcGxlX3Jvd3MpCi0jZGVmaW5lIGpkaXZfcm91bmRfdXAgRk9YSVRfUFJFRklYKGpkaXZfcm91bmRfdXApCi0jZGVmaW5lIGppbml0XzFwYXNzX3F1YW50aXplciBGT1hJVF9QUkVGSVgoamluaXRfMXBhc3NfcXVhbnRpemVyKQotI2RlZmluZSBqaW5pdF8ycGFzc19xdWFudGl6ZXIgRk9YSVRfUFJFRklYKGppbml0XzJwYXNzX3F1YW50aXplcikKLSNkZWZpbmUgamluaXRfY19jb2VmX2NvbnRyb2xsZXIgRk9YSVRfUFJFRklYKGppbml0X2NfY29lZl9jb250cm9sbGVyKQotI2RlZmluZSBqaW5pdF9jX21haW5fY29udHJvbGxlciBGT1hJVF9QUkVGSVgoamluaXRfY19tYWluX2NvbnRyb2xsZXIpCi0jZGVmaW5lIGppbml0X2NfbWFzdGVyX2NvbnRyb2wgRk9YSVRfUFJFRklYKGppbml0X2NfbWFzdGVyX2NvbnRyb2wpCi0jZGVmaW5lIGppbml0X2NfcHJlcF9jb250cm9sbGVyIEZPWElUX1BSRUZJWChqaW5pdF9jX3ByZXBfY29udHJvbGxlcikKLSNkZWZpbmUgamluaXRfY29sb3JfY29udmVydGVyIEZPWElUX1BSRUZJWChqaW5pdF9jb2xvcl9jb252ZXJ0ZXIpCi0jZGVmaW5lIGppbml0X2NvbG9yX2RlY29udmVydGVyIEZPWElUX1BSRUZJWChqaW5pdF9jb2xvcl9kZWNvbnZlcnRlcikKLSNkZWZpbmUgamluaXRfY29tcHJlc3NfbWFzdGVyIEZPWElUX1BSRUZJWChqaW5pdF9jb21wcmVzc19tYXN0ZXIpCi0jZGVmaW5lIGppbml0X2RfY29lZl9jb250cm9sbGVyIEZPWElUX1BSRUZJWChqaW5pdF9kX2NvZWZfY29udHJvbGxlcikKLSNkZWZpbmUgamluaXRfZF9tYWluX2NvbnRyb2xsZXIgRk9YSVRfUFJFRklYKGppbml0X2RfbWFpbl9jb250cm9sbGVyKQotI2RlZmluZSBqaW5pdF9kX3Bvc3RfY29udHJvbGxlciBGT1hJVF9QUkVGSVgoamluaXRfZF9wb3N0X2NvbnRyb2xsZXIpCi0jZGVmaW5lIGppbml0X2Rvd25zYW1wbGVyIEZPWElUX1BSRUZJWChqaW5pdF9kb3duc2FtcGxlcikKLSNkZWZpbmUgamluaXRfZm9yd2FyZF9kY3QgRk9YSVRfUFJFRklYKGppbml0X2ZvcndhcmRfZGN0KQotI2RlZmluZSBqaW5pdF9odWZmX2RlY29kZXIgRk9YSVRfUFJFRklYKGppbml0X2h1ZmZfZGVjb2RlcikKLSNkZWZpbmUgamluaXRfaHVmZl9lbmNvZGVyIEZPWElUX1BSRUZJWChqaW5pdF9odWZmX2VuY29kZXIpCi0jZGVmaW5lIGppbml0X2lucHV0X2NvbnRyb2xsZXIgRk9YSVRfUFJFRklYKGppbml0X2lucHV0X2NvbnRyb2xsZXIpCi0jZGVmaW5lIGppbml0X2ludmVyc2VfZGN0IEZPWElUX1BSRUZJWChqaW5pdF9pbnZlcnNlX2RjdCkKLSNkZWZpbmUgamluaXRfbWFya2VyX3JlYWRlciBGT1hJVF9QUkVGSVgoamluaXRfbWFya2VyX3JlYWRlcikKLSNkZWZpbmUgamluaXRfbWFya2VyX3dyaXRlciBGT1hJVF9QUkVGSVgoamluaXRfbWFya2VyX3dyaXRlcikKLSNkZWZpbmUgamluaXRfbWFzdGVyX2RlY29tcHJlc3MgRk9YSVRfUFJFRklYKGppbml0X21hc3Rlcl9kZWNvbXByZXNzKQotI2RlZmluZSBqaW5pdF9tZW1vcnlfbWdyIEZPWElUX1BSRUZJWChqaW5pdF9tZW1vcnlfbWdyKQotI2RlZmluZSBqaW5pdF9tZXJnZWRfdXBzYW1wbGVyIEZPWElUX1BSRUZJWChqaW5pdF9tZXJnZWRfdXBzYW1wbGVyKQotI2RlZmluZSBqaW5pdF9waHVmZl9kZWNvZGVyIEZPWElUX1BSRUZJWChqaW5pdF9waHVmZl9kZWNvZGVyKQotI2RlZmluZSBqaW5pdF9waHVmZl9lbmNvZGVyIEZPWElUX1BSRUZJWChqaW5pdF9waHVmZl9lbmNvZGVyKQotI2RlZmluZSBqaW5pdF91cHNhbXBsZXIgRk9YSVRfUFJFRklYKGppbml0X3Vwc2FtcGxlcikKLSNkZWZpbmUganBlZ19DcmVhdGVDb21wcmVzcyBGT1hJVF9QUkVGSVgoanBlZ19DcmVhdGVDb21wcmVzcykKLSNkZWZpbmUganBlZ19DcmVhdGVEZWNvbXByZXNzIEZPWElUX1BSRUZJWChqcGVnX0NyZWF0ZURlY29tcHJlc3MpCi0jZGVmaW5lIGpwZWdfYWJvcnQgRk9YSVRfUFJFRklYKGpwZWdfYWJvcnQpCi0jZGVmaW5lIGpwZWdfYWJvcnRfY29tcHJlc3MgRk9YSVRfUFJFRklYKGpwZWdfYWJvcnRfY29tcHJlc3MpCi0jZGVmaW5lIGpwZWdfYWJvcnRfZGVjb21wcmVzcyBGT1hJVF9QUkVGSVgoanBlZ19hYm9ydF9kZWNvbXByZXNzKQotI2RlZmluZSBqcGVnX2FkZF9xdWFudF90YWJsZSBGT1hJVF9QUkVGSVgoanBlZ19hZGRfcXVhbnRfdGFibGUpCi0jZGVmaW5lIGpwZWdfYWxsb2NfaHVmZl90YWJsZSBGT1hJVF9QUkVGSVgoanBlZ19hbGxvY19odWZmX3RhYmxlKQotI2RlZmluZSBqcGVnX2FsbG9jX3F1YW50X3RhYmxlIEZPWElUX1BSRUZJWChqcGVnX2FsbG9jX3F1YW50X3RhYmxlKQotI2RlZmluZSBqcGVnX2NhbGNfb3V0cHV0X2RpbWVuc2lvbnMgRk9YSVRfUFJFRklYKGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucykKLSNkZWZpbmUganBlZ19jb25zdW1lX2lucHV0IEZPWElUX1BSRUZJWChqcGVnX2NvbnN1bWVfaW5wdXQpCi0jZGVmaW5lIGpwZWdfZGVmYXVsdF9jb2xvcnNwYWNlIEZPWElUX1BSRUZJWChqcGVnX2RlZmF1bHRfY29sb3JzcGFjZSkKLSNkZWZpbmUganBlZ19kZXN0cm95IEZPWElUX1BSRUZJWChqcGVnX2Rlc3Ryb3kpCi0jZGVmaW5lIGpwZWdfZGVzdHJveV9jb21wcmVzcyBGT1hJVF9QUkVGSVgoanBlZ19kZXN0cm95X2NvbXByZXNzKQotI2RlZmluZSBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcyBGT1hJVF9QUkVGSVgoanBlZ19kZXN0cm95X2RlY29tcHJlc3MpCi0jZGVmaW5lIGpwZWdfZmRjdF9pZmFzdCBGT1hJVF9QUkVGSVgoanBlZ19mZGN0X2lmYXN0KQotI2RlZmluZSBqcGVnX2ZkY3RfaXNsb3cgRk9YSVRfUFJFRklYKGpwZWdfZmRjdF9pc2xvdykKLSNkZWZpbmUganBlZ19maWxsX2JpdF9idWZmZXIgRk9YSVRfUFJFRklYKGpwZWdfZmlsbF9iaXRfYnVmZmVyKQotI2RlZmluZSBqcGVnX2ZpbmlzaF9jb21wcmVzcyBGT1hJVF9QUkVGSVgoanBlZ19maW5pc2hfY29tcHJlc3MpCi0jZGVmaW5lIGpwZWdfZmluaXNoX2RlY29tcHJlc3MgRk9YSVRfUFJFRklYKGpwZWdfZmluaXNoX2RlY29tcHJlc3MpCi0jZGVmaW5lIGpwZWdfZmluaXNoX291dHB1dCBGT1hJVF9QUkVGSVgoanBlZ19maW5pc2hfb3V0cHV0KQotI2RlZmluZSBqcGVnX2ZyZWVfbGFyZ2UgRk9YSVRfUFJFRklYKGpwZWdfZnJlZV9sYXJnZSkKLSNkZWZpbmUganBlZ19mcmVlX3NtYWxsIEZPWElUX1BSRUZJWChqcGVnX2ZyZWVfc21hbGwpCi0jZGVmaW5lIGpwZWdfZ2VuX29wdGltYWxfdGFibGUgRk9YSVRfUFJFRklYKGpwZWdfZ2VuX29wdGltYWxfdGFibGUpCi0jZGVmaW5lIGpwZWdfZ2V0X2xhcmdlIEZPWElUX1BSRUZJWChqcGVnX2dldF9sYXJnZSkKLSNkZWZpbmUganBlZ19nZXRfc21hbGwgRk9YSVRfUFJFRklYKGpwZWdfZ2V0X3NtYWxsKQotI2RlZmluZSBqcGVnX2hhc19tdWx0aXBsZV9zY2FucyBGT1hJVF9QUkVGSVgoanBlZ19oYXNfbXVsdGlwbGVfc2NhbnMpCi0jZGVmaW5lIGpwZWdfaHVmZl9kZWNvZGUgRk9YSVRfUFJFRklYKGpwZWdfaHVmZl9kZWNvZGUpCi0jZGVmaW5lIGpwZWdfaWRjdF8xeDEgRk9YSVRfUFJFRklYKGpwZWdfaWRjdF8xeDEpCi0jZGVmaW5lIGpwZWdfaWRjdF8yeDIgRk9YSVRfUFJFRklYKGpwZWdfaWRjdF8yeDIpCi0jZGVmaW5lIGpwZWdfaWRjdF80eDQgRk9YSVRfUFJFRklYKGpwZWdfaWRjdF80eDQpCi0jZGVmaW5lIGpwZWdfaWRjdF9mbG9hdCBGT1hJVF9QUkVGSVgoanBlZ19pZGN0X2Zsb2F0KQotI2RlZmluZSBqcGVnX2lkY3RfaWZhc3QgRk9YSVRfUFJFRklYKGpwZWdfaWRjdF9pZmFzdCkKLSNkZWZpbmUganBlZ19pZGN0X2lzbG93IEZPWElUX1BSRUZJWChqcGVnX2lkY3RfaXNsb3cpCi0jZGVmaW5lIGpwZWdfaW5wdXRfY29tcGxldGUgRk9YSVRfUFJFRklYKGpwZWdfaW5wdXRfY29tcGxldGUpCi0jZGVmaW5lIGpwZWdfbWFrZV9jX2Rlcml2ZWRfdGJsIEZPWElUX1BSRUZJWChqcGVnX21ha2VfY19kZXJpdmVkX3RibCkKLSNkZWZpbmUganBlZ19tYWtlX2RfZGVyaXZlZF90YmwgRk9YSVRfUFJFRklYKGpwZWdfbWFrZV9kX2Rlcml2ZWRfdGJsKQotI2RlZmluZSBqcGVnX21lbV9hdmFpbGFibGUgRk9YSVRfUFJFRklYKGpwZWdfbWVtX2F2YWlsYWJsZSkKLSNkZWZpbmUganBlZ19tZW1faW5pdCBGT1hJVF9QUkVGSVgoanBlZ19tZW1faW5pdCkKLSNkZWZpbmUganBlZ19tZW1fdGVybSBGT1hJVF9QUkVGSVgoanBlZ19tZW1fdGVybSkKLSNkZWZpbmUganBlZ19uYXR1cmFsX29yZGVyIEZPWElUX1BSRUZJWChqcGVnX25hdHVyYWxfb3JkZXIpCi0jZGVmaW5lIGpwZWdfbmV3X2NvbG9ybWFwIEZPWElUX1BSRUZJWChqcGVnX25ld19jb2xvcm1hcCkKLSNkZWZpbmUganBlZ19vcGVuX2JhY2tpbmdfc3RvcmUgRk9YSVRfUFJFRklYKGpwZWdfb3Blbl9iYWNraW5nX3N0b3JlKQotI2RlZmluZSBqcGVnX3F1YWxpdHlfc2NhbGluZyBGT1hJVF9QUkVGSVgoanBlZ19xdWFsaXR5X3NjYWxpbmcpCi0jZGVmaW5lIGpwZWdfcmVhZF9jb2VmZmljaWVudHMgRk9YSVRfUFJFRklYKGpwZWdfcmVhZF9jb2VmZmljaWVudHMpCi0jZGVmaW5lIGpwZWdfcmVhZF9oZWFkZXIgRk9YSVRfUFJFRklYKGpwZWdfcmVhZF9oZWFkZXIpCi0jZGVmaW5lIGpwZWdfcmVhZF9yYXdfZGF0YSBGT1hJVF9QUkVGSVgoanBlZ19yZWFkX3Jhd19kYXRhKQotI2RlZmluZSBqcGVnX3JlYWRfc2NhbmxpbmVzIEZPWElUX1BSRUZJWChqcGVnX3JlYWRfc2NhbmxpbmVzKQotI2RlZmluZSBqcGVnX3Jlc3luY190b19yZXN0YXJ0IEZPWElUX1BSRUZJWChqcGVnX3Jlc3luY190b19yZXN0YXJ0KQotI2RlZmluZSBqcGVnX3NhdmVfbWFya2VycyBGT1hJVF9QUkVGSVgoanBlZ19zYXZlX21hcmtlcnMpCi0jZGVmaW5lIGpwZWdfc2V0X2NvbG9yc3BhY2UgRk9YSVRfUFJFRklYKGpwZWdfc2V0X2NvbG9yc3BhY2UpCi0jZGVmaW5lIGpwZWdfc2V0X2RlZmF1bHRzIEZPWElUX1BSRUZJWChqcGVnX3NldF9kZWZhdWx0cykKLSNkZWZpbmUganBlZ19zZXRfbGluZWFyX3F1YWxpdHkgRk9YSVRfUFJFRklYKGpwZWdfc2V0X2xpbmVhcl9xdWFsaXR5KQotI2RlZmluZSBqcGVnX3NldF9tYXJrZXJfcHJvY2Vzc29yIEZPWElUX1BSRUZJWChqcGVnX3NldF9tYXJrZXJfcHJvY2Vzc29yKQotI2RlZmluZSBqcGVnX3NldF9xdWFsaXR5IEZPWElUX1BSRUZJWChqcGVnX3NldF9xdWFsaXR5KQotI2RlZmluZSBqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbiBGT1hJVF9QUkVGSVgoanBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24pCi0jZGVmaW5lIGpwZWdfc3RhcnRfY29tcHJlc3MgRk9YSVRfUFJFRklYKGpwZWdfc3RhcnRfY29tcHJlc3MpCi0jZGVmaW5lIGpwZWdfc3RhcnRfZGVjb21wcmVzcyBGT1hJVF9QUkVGSVgoanBlZ19zdGFydF9kZWNvbXByZXNzKQotI2RlZmluZSBqcGVnX3N0YXJ0X291dHB1dCBGT1hJVF9QUkVGSVgoanBlZ19zdGFydF9vdXRwdXQpCi0jZGVmaW5lIGpwZWdfc3RkX2Vycm9yIEZPWElUX1BSRUZJWChqcGVnX3N0ZF9lcnJvcikKLSNkZWZpbmUganBlZ19zdGRfbWVzc2FnZV90YWJsZSBGT1hJVF9QUkVGSVgoanBlZ19zdGRfbWVzc2FnZV90YWJsZSkKLSNkZWZpbmUganBlZ19zdGRpb19zcmMgRk9YSVRfUFJFRklYKGpwZWdfc3RkaW9fc3JjKQotI2RlZmluZSBqcGVnX3N1cHByZXNzX3RhYmxlcyBGT1hJVF9QUkVGSVgoanBlZ19zdXBwcmVzc190YWJsZXMpCi0jZGVmaW5lIGpwZWdfd3JpdGVfbV9ieXRlIEZPWElUX1BSRUZJWChqcGVnX3dyaXRlX21fYnl0ZSkKLSNkZWZpbmUganBlZ193cml0ZV9tX2hlYWRlciBGT1hJVF9QUkVGSVgoanBlZ193cml0ZV9tX2hlYWRlcikKLSNkZWZpbmUganBlZ193cml0ZV9tYXJrZXIgRk9YSVRfUFJFRklYKGpwZWdfd3JpdGVfbWFya2VyKQotI2RlZmluZSBqcGVnX3dyaXRlX3Jhd19kYXRhIEZPWElUX1BSRUZJWChqcGVnX3dyaXRlX3Jhd19kYXRhKQotI2RlZmluZSBqcGVnX3dyaXRlX3NjYW5saW5lcyBGT1hJVF9QUkVGSVgoanBlZ193cml0ZV9zY2FubGluZXMpCi0jZGVmaW5lIGpwZWdfd3JpdGVfdGFibGVzIEZPWElUX1BSRUZJWChqcGVnX3dyaXRlX3RhYmxlcykKLSNkZWZpbmUganJvdW5kX3VwIEZPWElUX1BSRUZJWChqcm91bmRfdXApCi0jZGVmaW5lIGp6ZXJvX2ZhciBGT1hJVF9QUkVGSVgoanplcm9fZmFyKQotCi0gLyoKLSAqIEZpcnN0IHdlIGluY2x1ZGUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgdGhhdCByZWNvcmQgaG93IHRoaXMKLSAqIGluc3RhbGxhdGlvbiBvZiB0aGUgSlBFRyBsaWJyYXJ5IGlzIHNldCB1cC4gIGpjb25maWcuaCBjYW4gYmUKLSAqIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZvciBtYW55IHN5c3RlbXMuICBqbW9yZWNmZy5oIGNvbnRhaW5zCi0gKiBtYW51YWwgY29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgbW9zdCBwZW9wbGUgbmVlZCBub3Qgd29ycnkgYWJvdXQuCi0gKi8KLQotI2lmbmRlZiBKQ09ORklHX0lOQ0xVREVECS8qIGluIGNhc2UgamluY2x1ZGUuaCBhbHJlYWR5IGRpZCAqLwotI2luY2x1ZGUgImpjb25maWcuaCIJCS8qIHdpZGVseSB1c2VkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAqLwotI2VuZGlmCi0jaW5jbHVkZSAiam1vcmVjZmcuaCIJCS8qIHNlbGRvbSBjaGFuZ2VkIG9wdGlvbnMgKi8KLQotCi0vKiBWZXJzaW9uIElEIGZvciB0aGUgSlBFRyBsaWJyYXJ5LgotICogTWlnaHQgYmUgdXNlZnVsIGZvciB0ZXN0cyBsaWtlICIjaWYgSlBFR19MSUJfVkVSU0lPTiA+PSA2MCIuCi0gKi8KLQotI2RlZmluZSBKUEVHX0xJQl9WRVJTSU9OICA2MgkvKiBWZXJzaW9uIDZiICovCi0KLQotLyogVmFyaW91cyBjb25zdGFudHMgZGV0ZXJtaW5pbmcgdGhlIHNpemVzIG9mIHRoaW5ncy4KLSAqIEFsbCBvZiB0aGVzZSBhcmUgc3BlY2lmaWVkIGJ5IHRoZSBKUEVHIHN0YW5kYXJkLCBzbyBkb24ndCBjaGFuZ2UgdGhlbQotICogaWYgeW91IHdhbnQgdG8gYmUgY29tcGF0aWJsZS4KLSAqLwotCi0jZGVmaW5lIERDVFNJWkUJCSAgICA4CS8qIFRoZSBiYXNpYyBEQ1QgYmxvY2sgaXMgOHg4IHNhbXBsZXMgKi8KLSNkZWZpbmUgRENUU0laRTIJICAgIDY0CS8qIERDVFNJWkUgc3F1YXJlZDsgIyBvZiBlbGVtZW50cyBpbiBhIGJsb2NrICovCi0jZGVmaW5lIE5VTV9RVUFOVF9UQkxTICAgICAgNAkvKiBRdWFudGl6YXRpb24gdGFibGVzIGFyZSBudW1iZXJlZCAwLi4zICovCi0jZGVmaW5lIE5VTV9IVUZGX1RCTFMgICAgICAgNAkvKiBIdWZmbWFuIHRhYmxlcyBhcmUgbnVtYmVyZWQgMC4uMyAqLwotI2RlZmluZSBOVU1fQVJJVEhfVEJMUyAgICAgIDE2CS8qIEFyaXRoLWNvZGluZyB0YWJsZXMgYXJlIG51bWJlcmVkIDAuLjE1ICovCi0jZGVmaW5lIE1BWF9DT01QU19JTl9TQ0FOICAgNAkvKiBKUEVHIGxpbWl0IG9uICMgb2YgY29tcG9uZW50cyBpbiBvbmUgc2NhbiAqLwotI2RlZmluZSBNQVhfU0FNUF9GQUNUT1IgICAgIDQJLyogSlBFRyBsaW1pdCBvbiBzYW1wbGluZyBmYWN0b3JzICovCi0vKiBVbmZvcnR1bmF0ZWx5LCBzb21lIGJvem8gYXQgQWRvYmUgc2F3IG5vIHJlYXNvbiB0byBiZSBib3VuZCBieSB0aGUgc3RhbmRhcmQ7Ci0gKiB0aGUgUG9zdFNjcmlwdCBEQ1QgZmlsdGVyIGNhbiBlbWl0IGZpbGVzIHdpdGggbWFueSBtb3JlIHRoYW4gMTAgYmxvY2tzL01DVS4KLSAqIElmIHlvdSBoYXBwZW4gdG8gcnVuIGFjcm9zcyBzdWNoIGEgZmlsZSwgeW91IGNhbiB1cCBEX01BWF9CTE9DS1NfSU5fTUNVCi0gKiB0byBoYW5kbGUgaXQuICBXZSBldmVuIGxldCB5b3UgZG8gdGhpcyBmcm9tIHRoZSBqY29uZmlnLmggZmlsZS4gIEhvd2V2ZXIsCi0gKiB3ZSBzdHJvbmdseSBkaXNjb3VyYWdlIGNoYW5naW5nIENfTUFYX0JMT0NLU19JTl9NQ1U7IGp1c3QgYmVjYXVzZSBBZG9iZQotICogc29tZXRpbWVzIGVtaXRzIG5vbmNvbXBsaWFudCBmaWxlcyBkb2Vzbid0IG1lYW4geW91IHNob3VsZCB0b28uCi0gKi8KLSNkZWZpbmUgQ19NQVhfQkxPQ0tTX0lOX01DVSAgIDEwIC8qIGNvbXByZXNzb3IncyBsaW1pdCBvbiBibG9ja3MgcGVyIE1DVSAqLwotI2lmbmRlZiBEX01BWF9CTE9DS1NfSU5fTUNVCi0jZGVmaW5lIERfTUFYX0JMT0NLU19JTl9NQ1UgICAxMCAvKiBkZWNvbXByZXNzb3IncyBsaW1pdCBvbiBibG9ja3MgcGVyIE1DVSAqLwotI2VuZGlmCi0KLQotLyogRGF0YSBzdHJ1Y3R1cmVzIGZvciBpbWFnZXMgKGFycmF5cyBvZiBzYW1wbGVzIGFuZCBvZiBEQ1QgY29lZmZpY2llbnRzKS4KLSAqIE9uIDgweDg2IG1hY2hpbmVzLCB0aGUgaW1hZ2UgYXJyYXlzIGFyZSB0b28gYmlnIGZvciBuZWFyIHBvaW50ZXJzLAotICogYnV0IHRoZSBwb2ludGVyIGFycmF5cyBjYW4gZml0IGluIG5lYXIgbWVtb3J5LgotICovCi0KLXR5cGVkZWYgSlNBTVBMRSAgKkpTQU1QUk9XOwkvKiBwdHIgdG8gb25lIGltYWdlIHJvdyBvZiBwaXhlbCBzYW1wbGVzLiAqLwotdHlwZWRlZiBKU0FNUFJPVyAqSlNBTVBBUlJBWTsJLyogcHRyIHRvIHNvbWUgcm93cyAoYSAyLUQgc2FtcGxlIGFycmF5KSAqLwotdHlwZWRlZiBKU0FNUEFSUkFZICpKU0FNUElNQUdFOwkvKiBhIDMtRCBzYW1wbGUgYXJyYXk6IHRvcCBpbmRleCBpcyBjb2xvciAqLwotCi10eXBlZGVmIEpDT0VGIEpCTE9DS1tEQ1RTSVpFMl07CS8qIG9uZSBibG9jayBvZiBjb2VmZmljaWVudHMgKi8KLXR5cGVkZWYgSkJMT0NLICAqSkJMT0NLUk9XOwkvKiBwb2ludGVyIHRvIG9uZSByb3cgb2YgY29lZmZpY2llbnQgYmxvY2tzICovCi10eXBlZGVmIEpCTE9DS1JPVyAqSkJMT0NLQVJSQVk7CQkvKiBhIDItRCBhcnJheSBvZiBjb2VmZmljaWVudCBibG9ja3MgKi8KLXR5cGVkZWYgSkJMT0NLQVJSQVkgKkpCTE9DS0lNQUdFOwkvKiBhIDMtRCBhcnJheSBvZiBjb2VmZmljaWVudCBibG9ja3MgKi8KLQotdHlwZWRlZiBKQ09FRiAgKkpDT0VGUFRSOwkvKiB1c2VmdWwgaW4gYSBjb3VwbGUgb2YgcGxhY2VzICovCi0KLQotLyogVHlwZXMgZm9yIEpQRUcgY29tcHJlc3Npb24gcGFyYW1ldGVycyBhbmQgd29ya2luZyB0YWJsZXMuICovCi0KLQotLyogRENUIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbiB0YWJsZXMuICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogVGhpcyBhcnJheSBnaXZlcyB0aGUgY29lZmZpY2llbnQgcXVhbnRpemVycyBpbiBuYXR1cmFsIGFycmF5IG9yZGVyCi0gICAqIChub3QgdGhlIHppZ3phZyBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBzdG9yZWQgaW4gYSBKUEVHIERRVCBtYXJrZXIpLgotICAgKiBDQVVUSU9OOiBJSkcgdmVyc2lvbnMgcHJpb3IgdG8gdjZhIGtlcHQgdGhpcyBhcnJheSBpbiB6aWd6YWcgb3JkZXIuCi0gICAqLwotICBVSU5UMTYgcXVhbnR2YWxbRENUU0laRTJdOwkvKiBxdWFudGl6YXRpb24gc3RlcCBmb3IgZWFjaCBjb2VmZmljaWVudCAqLwotICAvKiBUaGlzIGZpZWxkIGlzIHVzZWQgb25seSBkdXJpbmcgY29tcHJlc3Npb24uICBJdCdzIGluaXRpYWxpemVkIEZBTFNFIHdoZW4KLSAgICogdGhlIHRhYmxlIGlzIGNyZWF0ZWQsIGFuZCBzZXQgVFJVRSB3aGVuIGl0J3MgYmVlbiBvdXRwdXQgdG8gdGhlIGZpbGUuCi0gICAqIFlvdSBjb3VsZCBzdXBwcmVzcyBvdXRwdXQgb2YgYSB0YWJsZSBieSBzZXR0aW5nIHRoaXMgdG8gVFJVRS4KLSAgICogKFNlZSBqcGVnX3N1cHByZXNzX3RhYmxlcyBmb3IgYW4gZXhhbXBsZS4pCi0gICAqLwotICBib29sZWFuIHNlbnRfdGFibGU7CQkvKiBUUlVFIHdoZW4gdGFibGUgaGFzIGJlZW4gb3V0cHV0ICovCi19IEpRVUFOVF9UQkw7Ci0KLQotLyogSHVmZm1hbiBjb2RpbmcgdGFibGVzLiAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8qIFRoZXNlIHR3byBmaWVsZHMgZGlyZWN0bHkgcmVwcmVzZW50IHRoZSBjb250ZW50cyBvZiBhIEpQRUcgREhUIG1hcmtlciAqLwotICBVSU5UOCBiaXRzWzE3XTsJCS8qIGJpdHNba10gPSAjIG9mIHN5bWJvbHMgd2l0aCBjb2RlcyBvZiAqLwotCQkJCS8qIGxlbmd0aCBrIGJpdHM7IGJpdHNbMF0gaXMgdW51c2VkICovCi0gIFVJTlQ4IGh1ZmZ2YWxbMjU2XTsJCS8qIFRoZSBzeW1ib2xzLCBpbiBvcmRlciBvZiBpbmNyIGNvZGUgbGVuZ3RoICovCi0gIC8qIFRoaXMgZmllbGQgaXMgdXNlZCBvbmx5IGR1cmluZyBjb21wcmVzc2lvbi4gIEl0J3MgaW5pdGlhbGl6ZWQgRkFMU0Ugd2hlbgotICAgKiB0aGUgdGFibGUgaXMgY3JlYXRlZCwgYW5kIHNldCBUUlVFIHdoZW4gaXQncyBiZWVuIG91dHB1dCB0byB0aGUgZmlsZS4KLSAgICogWW91IGNvdWxkIHN1cHByZXNzIG91dHB1dCBvZiBhIHRhYmxlIGJ5IHNldHRpbmcgdGhpcyB0byBUUlVFLgotICAgKiAoU2VlIGpwZWdfc3VwcHJlc3NfdGFibGVzIGZvciBhbiBleGFtcGxlLikKLSAgICovCi0gIGJvb2xlYW4gc2VudF90YWJsZTsJCS8qIFRSVUUgd2hlbiB0YWJsZSBoYXMgYmVlbiBvdXRwdXQgKi8KLX0gSkhVRkZfVEJMOwotCi0KLS8qIEJhc2ljIGluZm8gYWJvdXQgb25lIGNvbXBvbmVudCAoY29sb3IgY2hhbm5lbCkuICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogVGhlc2UgdmFsdWVzIGFyZSBmaXhlZCBvdmVyIHRoZSB3aG9sZSBpbWFnZS4gKi8KLSAgLyogRm9yIGNvbXByZXNzaW9uLCB0aGV5IG11c3QgYmUgc3VwcGxpZWQgYnkgcGFyYW1ldGVyIHNldHVwOyAqLwotICAvKiBmb3IgZGVjb21wcmVzc2lvbiwgdGhleSBhcmUgcmVhZCBmcm9tIHRoZSBTT0YgbWFya2VyLiAqLwotICBpbnQgY29tcG9uZW50X2lkOwkJLyogaWRlbnRpZmllciBmb3IgdGhpcyBjb21wb25lbnQgKDAuLjI1NSkgKi8KLSAgaW50IGNvbXBvbmVudF9pbmRleDsJCS8qIGl0cyBpbmRleCBpbiBTT0Ygb3IgY2luZm8tPmNvbXBfaW5mb1tdICovCi0gIGludCBoX3NhbXBfZmFjdG9yOwkJLyogaG9yaXpvbnRhbCBzYW1wbGluZyBmYWN0b3IgKDEuLjQpICovCi0gIGludCB2X3NhbXBfZmFjdG9yOwkJLyogdmVydGljYWwgc2FtcGxpbmcgZmFjdG9yICgxLi40KSAqLwotICBpbnQgcXVhbnRfdGJsX25vOwkJLyogcXVhbnRpemF0aW9uIHRhYmxlIHNlbGVjdG9yICgwLi4zKSAqLwotICAvKiBUaGVzZSB2YWx1ZXMgbWF5IHZhcnkgYmV0d2VlbiBzY2Fucy4gKi8KLSAgLyogRm9yIGNvbXByZXNzaW9uLCB0aGV5IG11c3QgYmUgc3VwcGxpZWQgYnkgcGFyYW1ldGVyIHNldHVwOyAqLwotICAvKiBmb3IgZGVjb21wcmVzc2lvbiwgdGhleSBhcmUgcmVhZCBmcm9tIHRoZSBTT1MgbWFya2VyLiAqLwotICAvKiBUaGUgZGVjb21wcmVzc29yIG91dHB1dCBzaWRlIG1heSBub3QgdXNlIHRoZXNlIHZhcmlhYmxlcy4gKi8KLSAgaW50IGRjX3RibF9ubzsJCS8qIERDIGVudHJvcHkgdGFibGUgc2VsZWN0b3IgKDAuLjMpICovCi0gIGludCBhY190Ymxfbm87CQkvKiBBQyBlbnRyb3B5IHRhYmxlIHNlbGVjdG9yICgwLi4zKSAqLwotICAKLSAgLyogUmVtYWluaW5nIGZpZWxkcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBwcml2YXRlIGJ5IGFwcGxpY2F0aW9ucy4gKi8KLSAgCi0gIC8qIFRoZXNlIHZhbHVlcyBhcmUgY29tcHV0ZWQgZHVyaW5nIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gc3RhcnR1cDogKi8KLSAgLyogQ29tcG9uZW50J3Mgc2l6ZSBpbiBEQ1QgYmxvY2tzLgotICAgKiBBbnkgZHVtbXkgYmxvY2tzIGFkZGVkIHRvIGNvbXBsZXRlIGFuIE1DVSBhcmUgbm90IGNvdW50ZWQ7IHRoZXJlZm9yZQotICAgKiB0aGVzZSB2YWx1ZXMgZG8gbm90IGRlcGVuZCBvbiB3aGV0aGVyIGEgc2NhbiBpcyBpbnRlcmxlYXZlZCBvciBub3QuCi0gICAqLwotICBKRElNRU5TSU9OIHdpZHRoX2luX2Jsb2NrczsKLSAgSkRJTUVOU0lPTiBoZWlnaHRfaW5fYmxvY2tzOwotICAvKiBTaXplIG9mIGEgRENUIGJsb2NrIGluIHNhbXBsZXMuICBBbHdheXMgRENUU0laRSBmb3IgY29tcHJlc3Npb24uCi0gICAqIEZvciBkZWNvbXByZXNzaW9uIHRoaXMgaXMgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBmcm9tIG9uZSBEQ1QgYmxvY2ssCi0gICAqIHJlZmxlY3RpbmcgYW55IHNjYWxpbmcgd2UgY2hvb3NlIHRvIGFwcGx5IGR1cmluZyB0aGUgSURDVCBzdGVwLgotICAgKiBWYWx1ZXMgb2YgMSwyLDQsOCBhcmUgbGlrZWx5IHRvIGJlIHN1cHBvcnRlZC4gIE5vdGUgdGhhdCBkaWZmZXJlbnQKLSAgICogY29tcG9uZW50cyBtYXkgcmVjZWl2ZSBkaWZmZXJlbnQgSURDVCBzY2FsaW5ncy4KLSAgICovCi0gIGludCBEQ1Rfc2NhbGVkX3NpemU7Ci0gIC8qIFRoZSBkb3duc2FtcGxlZCBkaW1lbnNpb25zIGFyZSB0aGUgY29tcG9uZW50J3MgYWN0dWFsLCB1bnBhZGRlZCBudW1iZXIKLSAgICogb2Ygc2FtcGxlcyBhdCB0aGUgbWFpbiBidWZmZXIgKHByZXByb2Nlc3NpbmcvY29tcHJlc3Npb24gaW50ZXJmYWNlKSwgdGh1cwotICAgKiBkb3duc2FtcGxlZF93aWR0aCA9IGNlaWwoaW1hZ2Vfd2lkdGggKiBIaS9IbWF4KQotICAgKiBhbmQgc2ltaWxhcmx5IGZvciBoZWlnaHQuICBGb3IgZGVjb21wcmVzc2lvbiwgSURDVCBzY2FsaW5nIGlzIGluY2x1ZGVkLCBzbwotICAgKiBkb3duc2FtcGxlZF93aWR0aCA9IGNlaWwoaW1hZ2Vfd2lkdGggKiBIaS9IbWF4ICogRENUX3NjYWxlZF9zaXplL0RDVFNJWkUpCi0gICAqLwotICBKRElNRU5TSU9OIGRvd25zYW1wbGVkX3dpZHRoOwkgLyogYWN0dWFsIHdpZHRoIGluIHNhbXBsZXMgKi8KLSAgSkRJTUVOU0lPTiBkb3duc2FtcGxlZF9oZWlnaHQ7IC8qIGFjdHVhbCBoZWlnaHQgaW4gc2FtcGxlcyAqLwotICAvKiBUaGlzIGZsYWcgaXMgdXNlZCBvbmx5IGZvciBkZWNvbXByZXNzaW9uLiAgSW4gY2FzZXMgd2hlcmUgc29tZSBvZiB0aGUKLSAgICogY29tcG9uZW50cyB3aWxsIGJlIGlnbm9yZWQgKGVnIGdyYXlzY2FsZSBvdXRwdXQgZnJvbSBZQ2JDciBpbWFnZSksCi0gICAqIHdlIGNhbiBza2lwIG1vc3QgY29tcHV0YXRpb25zIGZvciB0aGUgdW51c2VkIGNvbXBvbmVudHMuCi0gICAqLwotICBib29sZWFuIGNvbXBvbmVudF9uZWVkZWQ7CS8qIGRvIHdlIG5lZWQgdGhlIHZhbHVlIG9mIHRoaXMgY29tcG9uZW50PyAqLwotCi0gIC8qIFRoZXNlIHZhbHVlcyBhcmUgY29tcHV0ZWQgYmVmb3JlIHN0YXJ0aW5nIGEgc2NhbiBvZiB0aGUgY29tcG9uZW50LiAqLwotICAvKiBUaGUgZGVjb21wcmVzc29yIG91dHB1dCBzaWRlIG1heSBub3QgdXNlIHRoZXNlIHZhcmlhYmxlcy4gKi8KLSAgaW50IE1DVV93aWR0aDsJCS8qIG51bWJlciBvZiBibG9ja3MgcGVyIE1DVSwgaG9yaXpvbnRhbGx5ICovCi0gIGludCBNQ1VfaGVpZ2h0OwkJLyogbnVtYmVyIG9mIGJsb2NrcyBwZXIgTUNVLCB2ZXJ0aWNhbGx5ICovCi0gIGludCBNQ1VfYmxvY2tzOwkJLyogTUNVX3dpZHRoICogTUNVX2hlaWdodCAqLwotICBpbnQgTUNVX3NhbXBsZV93aWR0aDsJCS8qIE1DVSB3aWR0aCBpbiBzYW1wbGVzLCBNQ1Vfd2lkdGgqRENUX3NjYWxlZF9zaXplICovCi0gIGludCBsYXN0X2NvbF93aWR0aDsJCS8qICMgb2Ygbm9uLWR1bW15IGJsb2NrcyBhY3Jvc3MgaW4gbGFzdCBNQ1UgKi8KLSAgaW50IGxhc3Rfcm93X2hlaWdodDsJCS8qICMgb2Ygbm9uLWR1bW15IGJsb2NrcyBkb3duIGluIGxhc3QgTUNVICovCi0KLSAgLyogU2F2ZWQgcXVhbnRpemF0aW9uIHRhYmxlIGZvciBjb21wb25lbnQ7IE5VTEwgaWYgbm9uZSB5ZXQgc2F2ZWQuCi0gICAqIFNlZSBqZGlucHV0LmMgY29tbWVudHMgYWJvdXQgdGhlIG5lZWQgZm9yIHRoaXMgaW5mb3JtYXRpb24uCi0gICAqIFRoaXMgZmllbGQgaXMgY3VycmVudGx5IHVzZWQgb25seSBmb3IgZGVjb21wcmVzc2lvbi4KLSAgICovCi0gIEpRVUFOVF9UQkwgKiBxdWFudF90YWJsZTsKLQotICAvKiBQcml2YXRlIHBlci1jb21wb25lbnQgc3RvcmFnZSBmb3IgRENUIG9yIElEQ1Qgc3Vic3lzdGVtLiAqLwotICB2b2lkICogZGN0X3RhYmxlOwotfSBqcGVnX2NvbXBvbmVudF9pbmZvOwotCi0KLS8qIFRoZSBzY3JpcHQgZm9yIGVuY29kaW5nIGEgbXVsdGlwbGUtc2NhbiBmaWxlIGlzIGFuIGFycmF5IG9mIHRoZXNlOiAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCBjb21wc19pbl9zY2FuOwkJLyogbnVtYmVyIG9mIGNvbXBvbmVudHMgZW5jb2RlZCBpbiB0aGlzIHNjYW4gKi8KLSAgaW50IGNvbXBvbmVudF9pbmRleFtNQVhfQ09NUFNfSU5fU0NBTl07IC8qIHRoZWlyIFNPRi9jb21wX2luZm9bXSBpbmRleGVzICovCi0gIGludCBTcywgU2U7CQkJLyogcHJvZ3Jlc3NpdmUgSlBFRyBzcGVjdHJhbCBzZWxlY3Rpb24gcGFybXMgKi8KLSAgaW50IEFoLCBBbDsJCQkvKiBwcm9ncmVzc2l2ZSBKUEVHIHN1Y2Nlc3NpdmUgYXBwcm94LiBwYXJtcyAqLwotfSBqcGVnX3NjYW5faW5mbzsKLQotLyogVGhlIGRlY29tcHJlc3NvciBjYW4gc2F2ZSBBUFBuIGFuZCBDT00gbWFya2VycyBpbiBhIGxpc3Qgb2YgdGhlc2U6ICovCi0KLXR5cGVkZWYgc3RydWN0IGpwZWdfbWFya2VyX3N0cnVjdCAgKiBqcGVnX3NhdmVkX21hcmtlcl9wdHI7Ci0KLXN0cnVjdCBqcGVnX21hcmtlcl9zdHJ1Y3QgewotICBqcGVnX3NhdmVkX21hcmtlcl9wdHIgbmV4dDsJLyogbmV4dCBpbiBsaXN0LCBvciBOVUxMICovCi0gIFVJTlQ4IG1hcmtlcjsJCQkvKiBtYXJrZXIgY29kZTogSlBFR19DT00sIG9yIEpQRUdfQVBQMCtuICovCi0gIHVuc2lnbmVkIGludCBvcmlnaW5hbF9sZW5ndGg7CS8qICMgYnl0ZXMgb2YgZGF0YSBpbiB0aGUgZmlsZSAqLwotICB1bnNpZ25lZCBpbnQgZGF0YV9sZW5ndGg7CS8qICMgYnl0ZXMgb2YgZGF0YSBzYXZlZCBhdCBkYXRhW10gKi8KLSAgSk9DVEVUICAqIGRhdGE7CQkvKiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIG1hcmtlciAqLwotICAvKiB0aGUgbWFya2VyIGxlbmd0aCB3b3JkIGlzIG5vdCBjb3VudGVkIGluIGRhdGFfbGVuZ3RoIG9yIG9yaWdpbmFsX2xlbmd0aCAqLwotfTsKLQotLyogS25vd24gY29sb3Igc3BhY2VzLiAqLwotCi10eXBlZGVmIGVudW0gewotCUpDU19VTktOT1dOLAkJLyogZXJyb3IvdW5zcGVjaWZpZWQgKi8KLQlKQ1NfR1JBWVNDQUxFLAkJLyogbW9ub2Nocm9tZSAqLwotCUpDU19SR0IsCQkvKiByZWQvZ3JlZW4vYmx1ZSAqLwotCUpDU19ZQ2JDciwJCS8qIFkvQ2IvQ3IgKGFsc28ga25vd24gYXMgWVVWKSAqLwotCUpDU19DTVlLLAkJLyogQy9NL1kvSyAqLwotCUpDU19ZQ0NLCQkvKiBZL0NiL0NyL0sgKi8KLX0gSl9DT0xPUl9TUEFDRTsKLQotLyogRENUL0lEQ1QgYWxnb3JpdGhtIG9wdGlvbnMuICovCi0KLXR5cGVkZWYgZW51bSB7Ci0JSkRDVF9JU0xPVywJCS8qIHNsb3cgYnV0IGFjY3VyYXRlIGludGVnZXIgYWxnb3JpdGhtICovCi0JSkRDVF9JRkFTVCwJCS8qIGZhc3RlciwgbGVzcyBhY2N1cmF0ZSBpbnRlZ2VyIG1ldGhvZCAqLwotCUpEQ1RfRkxPQVQJCS8qIGZsb2F0aW5nLXBvaW50OiBhY2N1cmF0ZSwgZmFzdCBvbiBmYXN0IEhXICovCi19IEpfRENUX01FVEhPRDsKLQotI2lmbmRlZiBKRENUX0RFRkFVTFQJCS8qIG1heSBiZSBvdmVycmlkZGVuIGluIGpjb25maWcuaCAqLwotI2RlZmluZSBKRENUX0RFRkFVTFQgIEpEQ1RfSVNMT1cKLSNlbmRpZgotI2lmbmRlZiBKRENUX0ZBU1RFU1QJCS8qIG1heSBiZSBvdmVycmlkZGVuIGluIGpjb25maWcuaCAqLwotI2RlZmluZSBKRENUX0ZBU1RFU1QgIEpEQ1RfSUZBU1QKLSNlbmRpZgotCi0vKiBEaXRoZXJpbmcgb3B0aW9ucyBmb3IgZGVjb21wcmVzc2lvbi4gKi8KLQotdHlwZWRlZiBlbnVtIHsKLQlKRElUSEVSX05PTkUsCQkvKiBubyBkaXRoZXJpbmcgKi8KLQlKRElUSEVSX09SREVSRUQsCS8qIHNpbXBsZSBvcmRlcmVkIGRpdGhlciAqLwotCUpESVRIRVJfRlMJCS8qIEZsb3lkLVN0ZWluYmVyZyBlcnJvciBkaWZmdXNpb24gZGl0aGVyICovCi19IEpfRElUSEVSX01PREU7Ci0KLQotLyogQ29tbW9uIGZpZWxkcyBiZXR3ZWVuIEpQRUcgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24gbWFzdGVyIHN0cnVjdHMuICovCi0KLSNkZWZpbmUganBlZ19jb21tb25fZmllbGRzIFwKLSAgc3RydWN0IGpwZWdfZXJyb3JfbWdyICogZXJyOwkvKiBFcnJvciBoYW5kbGVyIG1vZHVsZSAqL1wKLSAgc3RydWN0IGpwZWdfbWVtb3J5X21nciAqIG1lbTsJLyogTWVtb3J5IG1hbmFnZXIgbW9kdWxlICovXAotICBzdHJ1Y3QganBlZ19wcm9ncmVzc19tZ3IgKiBwcm9ncmVzczsgLyogUHJvZ3Jlc3MgbW9uaXRvciwgb3IgTlVMTCBpZiBub25lICovXAotICB2b2lkICogY2xpZW50X2RhdGE7CQkvKiBBdmFpbGFibGUgZm9yIHVzZSBieSBhcHBsaWNhdGlvbiAqL1wKLSAgYm9vbGVhbiBpc19kZWNvbXByZXNzb3I7CS8qIFNvIGNvbW1vbiBjb2RlIGNhbiB0ZWxsIHdoaWNoIGlzIHdoaWNoICovXAotICBpbnQgZ2xvYmFsX3N0YXRlCQkvKiBGb3IgY2hlY2tpbmcgY2FsbCBzZXF1ZW5jZSB2YWxpZGl0eSAqLwotCi0vKiBSb3V0aW5lcyB0aGF0IGFyZSB0byBiZSB1c2VkIGJ5IGJvdGggaGFsdmVzIG9mIHRoZSBsaWJyYXJ5IGFyZSBkZWNsYXJlZAotICogdG8gcmVjZWl2ZSBhIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3R1cmUuICBUaGVyZSBhcmUgbm8gYWN0dWFsIGluc3RhbmNlcyBvZgotICoganBlZ19jb21tb25fc3RydWN0LCBvbmx5IG9mIGpwZWdfY29tcHJlc3Nfc3RydWN0IGFuZCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0LgotICovCi1zdHJ1Y3QganBlZ19jb21tb25fc3RydWN0IHsKLSAganBlZ19jb21tb25fZmllbGRzOwkJLyogRmllbGRzIGNvbW1vbiB0byBib3RoIG1hc3RlciBzdHJ1Y3QgdHlwZXMgKi8KLSAgLyogQWRkaXRpb25hbCBmaWVsZHMgZm9sbG93IGluIGFuIGFjdHVhbCBqcGVnX2NvbXByZXNzX3N0cnVjdCBvcgotICAgKiBqcGVnX2RlY29tcHJlc3Nfc3RydWN0LiAgQWxsIHRocmVlIHN0cnVjdHMgbXVzdCBhZ3JlZSBvbiB0aGVzZQotICAgKiBpbml0aWFsIGZpZWxkcyEgIChUaGlzIHdvdWxkIGJlIGEgbG90IGNsZWFuZXIgaW4gQysrLikKLSAgICovCi19OwotCi10eXBlZGVmIHN0cnVjdCBqcGVnX2NvbW1vbl9zdHJ1Y3QgKiBqX2NvbW1vbl9wdHI7Ci10eXBlZGVmIHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCAqIGpfY29tcHJlc3NfcHRyOwotdHlwZWRlZiBzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCAqIGpfZGVjb21wcmVzc19wdHI7Ci0KLQotLyogTWFzdGVyIHJlY29yZCBmb3IgYSBjb21wcmVzc2lvbiBpbnN0YW5jZSAqLwotCi1zdHJ1Y3QganBlZ19jb21wcmVzc19zdHJ1Y3QgewotICBqcGVnX2NvbW1vbl9maWVsZHM7CQkvKiBGaWVsZHMgc2hhcmVkIHdpdGgganBlZ19kZWNvbXByZXNzX3N0cnVjdCAqLwotCi0gIC8qIERlc3RpbmF0aW9uIGZvciBjb21wcmVzc2VkIGRhdGEgKi8KLSAgc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyICogZGVzdDsKLQotICAvKiBEZXNjcmlwdGlvbiBvZiBzb3VyY2UgaW1hZ2UgLS0tIHRoZXNlIGZpZWxkcyBtdXN0IGJlIGZpbGxlZCBpbiBieQotICAgKiBvdXRlciBhcHBsaWNhdGlvbiBiZWZvcmUgc3RhcnRpbmcgY29tcHJlc3Npb24uICBpbl9jb2xvcl9zcGFjZSBtdXN0Ci0gICAqIGJlIGNvcnJlY3QgYmVmb3JlIHlvdSBjYW4gZXZlbiBjYWxsIGpwZWdfc2V0X2RlZmF1bHRzKCkuCi0gICAqLwotCi0gIEpESU1FTlNJT04gaW1hZ2Vfd2lkdGg7CS8qIGlucHV0IGltYWdlIHdpZHRoICovCi0gIEpESU1FTlNJT04gaW1hZ2VfaGVpZ2h0OwkvKiBpbnB1dCBpbWFnZSBoZWlnaHQgKi8KLSAgaW50IGlucHV0X2NvbXBvbmVudHM7CQkvKiAjIG9mIGNvbG9yIGNvbXBvbmVudHMgaW4gaW5wdXQgaW1hZ2UgKi8KLSAgSl9DT0xPUl9TUEFDRSBpbl9jb2xvcl9zcGFjZTsJLyogY29sb3JzcGFjZSBvZiBpbnB1dCBpbWFnZSAqLwotCi0gIGRvdWJsZSBpbnB1dF9nYW1tYTsJCS8qIGltYWdlIGdhbW1hIG9mIGlucHV0IGltYWdlICovCi0KLSAgLyogQ29tcHJlc3Npb24gcGFyYW1ldGVycyAtLS0gdGhlc2UgZmllbGRzIG11c3QgYmUgc2V0IGJlZm9yZSBjYWxsaW5nCi0gICAqIGpwZWdfc3RhcnRfY29tcHJlc3MoKS4gIFdlIHJlY29tbWVuZCBjYWxsaW5nIGpwZWdfc2V0X2RlZmF1bHRzKCkgdG8KLSAgICogaW5pdGlhbGl6ZSBldmVyeXRoaW5nIHRvIHJlYXNvbmFibGUgZGVmYXVsdHMsIHRoZW4gY2hhbmdpbmcgYW55dGhpbmcKLSAgICogdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmljYWxseSB3YW50cyB0byBjaGFuZ2UuICBUaGF0IHdheSB5b3Ugd29uJ3QgZ2V0Ci0gICAqIGJ1cm50IHdoZW4gbmV3IHBhcmFtZXRlcnMgYXJlIGFkZGVkLiAgQWxzbyBub3RlIHRoYXQgdGhlcmUgYXJlIHNldmVyYWwKLSAgICogaGVscGVyIHJvdXRpbmVzIHRvIHNpbXBsaWZ5IGNoYW5naW5nIHBhcmFtZXRlcnMuCi0gICAqLwotCi0gIGludCBkYXRhX3ByZWNpc2lvbjsJCS8qIGJpdHMgb2YgcHJlY2lzaW9uIGluIGltYWdlIGRhdGEgKi8KLQotICBpbnQgbnVtX2NvbXBvbmVudHM7CQkvKiAjIG9mIGNvbG9yIGNvbXBvbmVudHMgaW4gSlBFRyBpbWFnZSAqLwotICBKX0NPTE9SX1NQQUNFIGpwZWdfY29sb3Jfc3BhY2U7IC8qIGNvbG9yc3BhY2Ugb2YgSlBFRyBpbWFnZSAqLwotCi0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjb21wX2luZm87Ci0gIC8qIGNvbXBfaW5mb1tpXSBkZXNjcmliZXMgY29tcG9uZW50IHRoYXQgYXBwZWFycyBpJ3RoIGluIFNPRiAqLwotICAKLSAgSlFVQU5UX1RCTCAqIHF1YW50X3RibF9wdHJzW05VTV9RVUFOVF9UQkxTXTsKLSAgLyogcHRycyB0byBjb2VmZmljaWVudCBxdWFudGl6YXRpb24gdGFibGVzLCBvciBOVUxMIGlmIG5vdCBkZWZpbmVkICovCi0gIAotICBKSFVGRl9UQkwgKiBkY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdOwotICBKSFVGRl9UQkwgKiBhY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdOwotICAvKiBwdHJzIHRvIEh1ZmZtYW4gY29kaW5nIHRhYmxlcywgb3IgTlVMTCBpZiBub3QgZGVmaW5lZCAqLwotICAKLSAgVUlOVDggYXJpdGhfZGNfTFtOVU1fQVJJVEhfVEJMU107IC8qIEwgdmFsdWVzIGZvciBEQyBhcml0aC1jb2RpbmcgdGFibGVzICovCi0gIFVJTlQ4IGFyaXRoX2RjX1VbTlVNX0FSSVRIX1RCTFNdOyAvKiBVIHZhbHVlcyBmb3IgREMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLwotICBVSU5UOCBhcml0aF9hY19LW05VTV9BUklUSF9UQkxTXTsgLyogS3ggdmFsdWVzIGZvciBBQyBhcml0aC1jb2RpbmcgdGFibGVzICovCi0KLSAgaW50IG51bV9zY2FuczsJCS8qICMgb2YgZW50cmllcyBpbiBzY2FuX2luZm8gYXJyYXkgKi8KLSAgY29uc3QganBlZ19zY2FuX2luZm8gKiBzY2FuX2luZm87IC8qIHNjcmlwdCBmb3IgbXVsdGktc2NhbiBmaWxlLCBvciBOVUxMICovCi0gIC8qIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHNjYW5faW5mbyBpcyBOVUxMLCB3aGljaCBjYXVzZXMgYSBzaW5nbGUtc2NhbgotICAgKiBzZXF1ZW50aWFsIEpQRUcgZmlsZSB0byBiZSBlbWl0dGVkLiAgVG8gY3JlYXRlIGEgbXVsdGktc2NhbiBmaWxlLAotICAgKiBzZXQgbnVtX3NjYW5zIGFuZCBzY2FuX2luZm8gdG8gcG9pbnQgdG8gYW4gYXJyYXkgb2Ygc2NhbiBkZWZpbml0aW9ucy4KLSAgICovCi0KLSAgYm9vbGVhbiByYXdfZGF0YV9pbjsJCS8qIFRSVUU9Y2FsbGVyIHN1cHBsaWVzIGRvd25zYW1wbGVkIGRhdGEgKi8KLSAgYm9vbGVhbiBhcml0aF9jb2RlOwkJLyogVFJVRT1hcml0aG1ldGljIGNvZGluZywgRkFMU0U9SHVmZm1hbiAqLwotICBib29sZWFuIG9wdGltaXplX2NvZGluZzsJLyogVFJVRT1vcHRpbWl6ZSBlbnRyb3B5IGVuY29kaW5nIHBhcm1zICovCi0gIGJvb2xlYW4gQ0NJUjYwMV9zYW1wbGluZzsJLyogVFJVRT1maXJzdCBzYW1wbGVzIGFyZSBjb3NpdGVkICovCi0gIGludCBzbW9vdGhpbmdfZmFjdG9yOwkJLyogMS4uMTAwLCBvciAwIGZvciBubyBpbnB1dCBzbW9vdGhpbmcgKi8KLSAgSl9EQ1RfTUVUSE9EIGRjdF9tZXRob2Q7CS8qIERDVCBhbGdvcml0aG0gc2VsZWN0b3IgKi8KLQotICAvKiBUaGUgcmVzdGFydCBpbnRlcnZhbCBjYW4gYmUgc3BlY2lmaWVkIGluIGFic29sdXRlIE1DVXMgYnkgc2V0dGluZwotICAgKiByZXN0YXJ0X2ludGVydmFsLCBvciBpbiBNQ1Ugcm93cyBieSBzZXR0aW5nIHJlc3RhcnRfaW5fcm93cwotICAgKiAoaW4gd2hpY2ggY2FzZSB0aGUgY29ycmVjdCByZXN0YXJ0X2ludGVydmFsIHdpbGwgYmUgZmlndXJlZAotICAgKiBmb3IgZWFjaCBzY2FuKS4KLSAgICovCi0gIHVuc2lnbmVkIGludCByZXN0YXJ0X2ludGVydmFsOyAvKiBNQ1VzIHBlciByZXN0YXJ0LCBvciAwIGZvciBubyByZXN0YXJ0ICovCi0gIGludCByZXN0YXJ0X2luX3Jvd3M7CQkvKiBpZiA+IDAsIE1DVSByb3dzIHBlciByZXN0YXJ0IGludGVydmFsICovCi0KLSAgLyogUGFyYW1ldGVycyBjb250cm9sbGluZyBlbWlzc2lvbiBvZiBzcGVjaWFsIG1hcmtlcnMuICovCi0KLSAgYm9vbGVhbiB3cml0ZV9KRklGX2hlYWRlcjsJLyogc2hvdWxkIGEgSkZJRiBtYXJrZXIgYmUgd3JpdHRlbj8gKi8KLSAgVUlOVDggSkZJRl9tYWpvcl92ZXJzaW9uOwkvKiBXaGF0IHRvIHdyaXRlIGZvciB0aGUgSkZJRiB2ZXJzaW9uIG51bWJlciAqLwotICBVSU5UOCBKRklGX21pbm9yX3ZlcnNpb247Ci0gIC8qIFRoZXNlIHRocmVlIHZhbHVlcyBhcmUgbm90IHVzZWQgYnkgdGhlIEpQRUcgY29kZSwgbWVyZWx5IGNvcGllZCAqLwotICAvKiBpbnRvIHRoZSBKRklGIEFQUDAgbWFya2VyLiAgZGVuc2l0eV91bml0IGNhbiBiZSAwIGZvciB1bmtub3duLCAqLwotICAvKiAxIGZvciBkb3RzL2luY2gsIG9yIDIgZm9yIGRvdHMvY20uICBOb3RlIHRoYXQgdGhlIHBpeGVsIGFzcGVjdCAqLwotICAvKiByYXRpbyBpcyBkZWZpbmVkIGJ5IFhfZGVuc2l0eS9ZX2RlbnNpdHkgZXZlbiB3aGVuIGRlbnNpdHlfdW5pdD0wLiAqLwotICBVSU5UOCBkZW5zaXR5X3VuaXQ7CQkvKiBKRklGIGNvZGUgZm9yIHBpeGVsIHNpemUgdW5pdHMgKi8KLSAgVUlOVDE2IFhfZGVuc2l0eTsJCS8qIEhvcml6b250YWwgcGl4ZWwgZGVuc2l0eSAqLwotICBVSU5UMTYgWV9kZW5zaXR5OwkJLyogVmVydGljYWwgcGl4ZWwgZGVuc2l0eSAqLwotICBib29sZWFuIHdyaXRlX0Fkb2JlX21hcmtlcjsJLyogc2hvdWxkIGFuIEFkb2JlIG1hcmtlciBiZSB3cml0dGVuPyAqLwotICAKLSAgLyogU3RhdGUgdmFyaWFibGU6IGluZGV4IG9mIG5leHQgc2NhbmxpbmUgdG8gYmUgd3JpdHRlbiB0bwotICAgKiBqcGVnX3dyaXRlX3NjYW5saW5lcygpLiAgQXBwbGljYXRpb24gbWF5IHVzZSB0aGlzIHRvIGNvbnRyb2wgaXRzCi0gICAqIHByb2Nlc3NpbmcgbG9vcCwgZS5nLiwgIndoaWxlIChuZXh0X3NjYW5saW5lIDwgaW1hZ2VfaGVpZ2h0KSIuCi0gICAqLwotCi0gIEpESU1FTlNJT04gbmV4dF9zY2FubGluZTsJLyogMCAuLiBpbWFnZV9oZWlnaHQtMSAgKi8KLQotICAvKiBSZW1haW5pbmcgZmllbGRzIGFyZSBrbm93biB0aHJvdWdob3V0IGNvbXByZXNzb3IsIGJ1dCBnZW5lcmFsbHkKLSAgICogc2hvdWxkIG5vdCBiZSB0b3VjaGVkIGJ5IGEgc3Vycm91bmRpbmcgYXBwbGljYXRpb24uCi0gICAqLwotCi0gIC8qCi0gICAqIFRoZXNlIGZpZWxkcyBhcmUgY29tcHV0ZWQgZHVyaW5nIGNvbXByZXNzaW9uIHN0YXJ0dXAKLSAgICovCi0gIGJvb2xlYW4gcHJvZ3Jlc3NpdmVfbW9kZTsJLyogVFJVRSBpZiBzY2FuIHNjcmlwdCB1c2VzIHByb2dyZXNzaXZlIG1vZGUgKi8KLSAgaW50IG1heF9oX3NhbXBfZmFjdG9yOwkvKiBsYXJnZXN0IGhfc2FtcF9mYWN0b3IgKi8KLSAgaW50IG1heF92X3NhbXBfZmFjdG9yOwkvKiBsYXJnZXN0IHZfc2FtcF9mYWN0b3IgKi8KLQotICBKRElNRU5TSU9OIHRvdGFsX2lNQ1Vfcm93czsJLyogIyBvZiBpTUNVIHJvd3MgdG8gYmUgaW5wdXQgdG8gY29lZiBjdGxyICovCi0gIC8qIFRoZSBjb2VmZmljaWVudCBjb250cm9sbGVyIHJlY2VpdmVzIGRhdGEgaW4gdW5pdHMgb2YgTUNVIHJvd3MgYXMgZGVmaW5lZAotICAgKiBmb3IgZnVsbHkgaW50ZXJsZWF2ZWQgc2NhbnMgKHdoZXRoZXIgdGhlIEpQRUcgZmlsZSBpcyBpbnRlcmxlYXZlZCBvciBub3QpLgotICAgKiBUaGVyZSBhcmUgdl9zYW1wX2ZhY3RvciAqIERDVFNJWkUgc2FtcGxlIHJvd3Mgb2YgZWFjaCBjb21wb25lbnQgaW4gYW4KLSAgICogImlNQ1UiIChpbnRlcmxlYXZlZCBNQ1UpIHJvdy4KLSAgICovCi0gIAotICAvKgotICAgKiBUaGVzZSBmaWVsZHMgYXJlIHZhbGlkIGR1cmluZyBhbnkgb25lIHNjYW4uCi0gICAqIFRoZXkgZGVzY3JpYmUgdGhlIGNvbXBvbmVudHMgYW5kIE1DVXMgYWN0dWFsbHkgYXBwZWFyaW5nIGluIHRoZSBzY2FuLgotICAgKi8KLSAgaW50IGNvbXBzX2luX3NjYW47CQkvKiAjIG9mIEpQRUcgY29tcG9uZW50cyBpbiB0aGlzIHNjYW4gKi8KLSAganBlZ19jb21wb25lbnRfaW5mbyAqIGN1cl9jb21wX2luZm9bTUFYX0NPTVBTX0lOX1NDQU5dOwotICAvKiAqY3VyX2NvbXBfaW5mb1tpXSBkZXNjcmliZXMgY29tcG9uZW50IHRoYXQgYXBwZWFycyBpJ3RoIGluIFNPUyAqLwotICAKLSAgSkRJTUVOU0lPTiBNQ1VzX3Blcl9yb3c7CS8qICMgb2YgTUNVcyBhY3Jvc3MgdGhlIGltYWdlICovCi0gIEpESU1FTlNJT04gTUNVX3Jvd3NfaW5fc2NhbjsJLyogIyBvZiBNQ1Ugcm93cyBpbiB0aGUgaW1hZ2UgKi8KLSAgCi0gIGludCBibG9ja3NfaW5fTUNVOwkJLyogIyBvZiBEQ1QgYmxvY2tzIHBlciBNQ1UgKi8KLSAgaW50IE1DVV9tZW1iZXJzaGlwW0NfTUFYX0JMT0NLU19JTl9NQ1VdOwotICAvKiBNQ1VfbWVtYmVyc2hpcFtpXSBpcyBpbmRleCBpbiBjdXJfY29tcF9pbmZvIG9mIGNvbXBvbmVudCBvd25pbmcgKi8KLSAgLyogaSd0aCBibG9jayBpbiBhbiBNQ1UgKi8KLQotICBpbnQgU3MsIFNlLCBBaCwgQWw7CQkvKiBwcm9ncmVzc2l2ZSBKUEVHIHBhcmFtZXRlcnMgZm9yIHNjYW4gKi8KLQotICAvKgotICAgKiBMaW5rcyB0byBjb21wcmVzc2lvbiBzdWJvYmplY3RzIChtZXRob2RzIGFuZCBwcml2YXRlIHZhcmlhYmxlcyBvZiBtb2R1bGVzKQotICAgKi8KLSAgc3RydWN0IGpwZWdfY29tcF9tYXN0ZXIgKiBtYXN0ZXI7Ci0gIHN0cnVjdCBqcGVnX2NfbWFpbl9jb250cm9sbGVyICogbWFpbjsKLSAgc3RydWN0IGpwZWdfY19wcmVwX2NvbnRyb2xsZXIgKiBwcmVwOwotICBzdHJ1Y3QganBlZ19jX2NvZWZfY29udHJvbGxlciAqIGNvZWY7Ci0gIHN0cnVjdCBqcGVnX21hcmtlcl93cml0ZXIgKiBtYXJrZXI7Ci0gIHN0cnVjdCBqcGVnX2NvbG9yX2NvbnZlcnRlciAqIGNjb252ZXJ0OwotICBzdHJ1Y3QganBlZ19kb3duc2FtcGxlciAqIGRvd25zYW1wbGU7Ci0gIHN0cnVjdCBqcGVnX2ZvcndhcmRfZGN0ICogZmRjdDsKLSAgc3RydWN0IGpwZWdfZW50cm9weV9lbmNvZGVyICogZW50cm9weTsKLSAganBlZ19zY2FuX2luZm8gKiBzY3JpcHRfc3BhY2U7IC8qIHdvcmtzcGFjZSBmb3IganBlZ19zaW1wbGVfcHJvZ3Jlc3Npb24gKi8KLSAgaW50IHNjcmlwdF9zcGFjZV9zaXplOwotfTsKLQotCi0vKiBNYXN0ZXIgcmVjb3JkIGZvciBhIGRlY29tcHJlc3Npb24gaW5zdGFuY2UgKi8KLQotc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QgewotICBqcGVnX2NvbW1vbl9maWVsZHM7CQkvKiBGaWVsZHMgc2hhcmVkIHdpdGgganBlZ19jb21wcmVzc19zdHJ1Y3QgKi8KLQotICAvKiBTb3VyY2Ugb2YgY29tcHJlc3NlZCBkYXRhICovCi0gIHN0cnVjdCBqcGVnX3NvdXJjZV9tZ3IgKiBzcmM7Ci0KLSAgLyogQmFzaWMgZGVzY3JpcHRpb24gb2YgaW1hZ2UgLS0tIGZpbGxlZCBpbiBieSBqcGVnX3JlYWRfaGVhZGVyKCkuICovCi0gIC8qIEFwcGxpY2F0aW9uIG1heSBpbnNwZWN0IHRoZXNlIHZhbHVlcyB0byBkZWNpZGUgaG93IHRvIHByb2Nlc3MgaW1hZ2UuICovCi0KLSAgSkRJTUVOU0lPTiBpbWFnZV93aWR0aDsJLyogbm9taW5hbCBpbWFnZSB3aWR0aCAoZnJvbSBTT0YgbWFya2VyKSAqLwotICBKRElNRU5TSU9OIGltYWdlX2hlaWdodDsJLyogbm9taW5hbCBpbWFnZSBoZWlnaHQgKi8KLSAgaW50IG51bV9jb21wb25lbnRzOwkJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIGluIEpQRUcgaW1hZ2UgKi8KLSAgSl9DT0xPUl9TUEFDRSBqcGVnX2NvbG9yX3NwYWNlOyAvKiBjb2xvcnNwYWNlIG9mIEpQRUcgaW1hZ2UgKi8KLQotICAvKiBEZWNvbXByZXNzaW9uIHByb2Nlc3NpbmcgcGFyYW1ldGVycyAtLS0gdGhlc2UgZmllbGRzIG11c3QgYmUgc2V0IGJlZm9yZQotICAgKiBjYWxsaW5nIGpwZWdfc3RhcnRfZGVjb21wcmVzcygpLiAgTm90ZSB0aGF0IGpwZWdfcmVhZF9oZWFkZXIoKSBpbml0aWFsaXplcwotICAgKiB0aGVtIHRvIGRlZmF1bHQgdmFsdWVzLgotICAgKi8KLQotICBKX0NPTE9SX1NQQUNFIG91dF9jb2xvcl9zcGFjZTsgLyogY29sb3JzcGFjZSBmb3Igb3V0cHV0ICovCi0KLSAgdW5zaWduZWQgaW50IHNjYWxlX251bSwgc2NhbGVfZGVub207IC8qIGZyYWN0aW9uIGJ5IHdoaWNoIHRvIHNjYWxlIGltYWdlICovCi0KLSAgZG91YmxlIG91dHB1dF9nYW1tYTsJCS8qIGltYWdlIGdhbW1hIHdhbnRlZCBpbiBvdXRwdXQgKi8KLQotICBib29sZWFuIGJ1ZmZlcmVkX2ltYWdlOwkvKiBUUlVFPW11bHRpcGxlIG91dHB1dCBwYXNzZXMgKi8KLSAgYm9vbGVhbiByYXdfZGF0YV9vdXQ7CQkvKiBUUlVFPWRvd25zYW1wbGVkIGRhdGEgd2FudGVkICovCi0KLSAgSl9EQ1RfTUVUSE9EIGRjdF9tZXRob2Q7CS8qIElEQ1QgYWxnb3JpdGhtIHNlbGVjdG9yICovCi0gIGJvb2xlYW4gZG9fZmFuY3lfdXBzYW1wbGluZzsJLyogVFJVRT1hcHBseSBmYW5jeSB1cHNhbXBsaW5nICovCi0gIGJvb2xlYW4gZG9fYmxvY2tfc21vb3RoaW5nOwkvKiBUUlVFPWFwcGx5IGludGVyYmxvY2sgc21vb3RoaW5nICovCi0KLSAgYm9vbGVhbiBxdWFudGl6ZV9jb2xvcnM7CS8qIFRSVUU9Y29sb3JtYXBwZWQgb3V0cHV0IHdhbnRlZCAqLwotICAvKiB0aGUgZm9sbG93aW5nIGFyZSBpZ25vcmVkIGlmIG5vdCBxdWFudGl6ZV9jb2xvcnM6ICovCi0gIEpfRElUSEVSX01PREUgZGl0aGVyX21vZGU7CS8qIHR5cGUgb2YgY29sb3IgZGl0aGVyaW5nIHRvIHVzZSAqLwotICBib29sZWFuIHR3b19wYXNzX3F1YW50aXplOwkvKiBUUlVFPXVzZSB0d28tcGFzcyBjb2xvciBxdWFudGl6YXRpb24gKi8KLSAgaW50IGRlc2lyZWRfbnVtYmVyX29mX2NvbG9yczsJLyogbWF4ICMgY29sb3JzIHRvIHVzZSBpbiBjcmVhdGVkIGNvbG9ybWFwICovCi0gIC8qIHRoZXNlIGFyZSBzaWduaWZpY2FudCBvbmx5IGluIGJ1ZmZlcmVkLWltYWdlIG1vZGU6ICovCi0gIGJvb2xlYW4gZW5hYmxlXzFwYXNzX3F1YW50OwkvKiBlbmFibGUgZnV0dXJlIHVzZSBvZiAxLXBhc3MgcXVhbnRpemVyICovCi0gIGJvb2xlYW4gZW5hYmxlX2V4dGVybmFsX3F1YW50Oy8qIGVuYWJsZSBmdXR1cmUgdXNlIG9mIGV4dGVybmFsIGNvbG9ybWFwICovCi0gIGJvb2xlYW4gZW5hYmxlXzJwYXNzX3F1YW50OwkvKiBlbmFibGUgZnV0dXJlIHVzZSBvZiAyLXBhc3MgcXVhbnRpemVyICovCi0KLSAgLyogRGVzY3JpcHRpb24gb2YgYWN0dWFsIG91dHB1dCBpbWFnZSB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgdG8gYXBwbGljYXRpb24uCi0gICAqIFRoZXNlIGZpZWxkcyBhcmUgY29tcHV0ZWQgYnkganBlZ19zdGFydF9kZWNvbXByZXNzKCkuCi0gICAqIFlvdSBjYW4gYWxzbyB1c2UganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zKCkgdG8gZGV0ZXJtaW5lIHRoZXNlIHZhbHVlcwotICAgKiBpbiBhZHZhbmNlIG9mIGNhbGxpbmcganBlZ19zdGFydF9kZWNvbXByZXNzKCkuCi0gICAqLwotCi0gIEpESU1FTlNJT04gb3V0cHV0X3dpZHRoOwkvKiBzY2FsZWQgaW1hZ2Ugd2lkdGggKi8KLSAgSkRJTUVOU0lPTiBvdXRwdXRfaGVpZ2h0OwkvKiBzY2FsZWQgaW1hZ2UgaGVpZ2h0ICovCi0gIGludCBvdXRfY29sb3JfY29tcG9uZW50czsJLyogIyBvZiBjb2xvciBjb21wb25lbnRzIGluIG91dF9jb2xvcl9zcGFjZSAqLwotICBpbnQgb3V0cHV0X2NvbXBvbmVudHM7CS8qICMgb2YgY29sb3IgY29tcG9uZW50cyByZXR1cm5lZCAqLwotICAvKiBvdXRwdXRfY29tcG9uZW50cyBpcyAxIChhIGNvbG9ybWFwIGluZGV4KSB3aGVuIHF1YW50aXppbmcgY29sb3JzOwotICAgKiBvdGhlcndpc2UgaXQgZXF1YWxzIG91dF9jb2xvcl9jb21wb25lbnRzLgotICAgKi8KLSAgaW50IHJlY19vdXRidWZfaGVpZ2h0OwkvKiBtaW4gcmVjb21tZW5kZWQgaGVpZ2h0IG9mIHNjYW5saW5lIGJ1ZmZlciAqLwotICAvKiBJZiB0aGUgYnVmZmVyIHBhc3NlZCB0byBqcGVnX3JlYWRfc2NhbmxpbmVzKCkgaXMgbGVzcyB0aGFuIHRoaXMgbWFueSByb3dzCi0gICAqIGhpZ2gsIHNwYWNlIGFuZCB0aW1lIHdpbGwgYmUgd2FzdGVkIGR1ZSB0byB1bm5lY2Vzc2FyeSBkYXRhIGNvcHlpbmcuCi0gICAqIFVzdWFsbHkgcmVjX291dGJ1Zl9oZWlnaHQgd2lsbCBiZSAxIG9yIDIsIGF0IG1vc3QgNC4KLSAgICovCi0KLSAgLyogV2hlbiBxdWFudGl6aW5nIGNvbG9ycywgdGhlIG91dHB1dCBjb2xvcm1hcCBpcyBkZXNjcmliZWQgYnkgdGhlc2UgZmllbGRzLgotICAgKiBUaGUgYXBwbGljYXRpb24gY2FuIHN1cHBseSBhIGNvbG9ybWFwIGJ5IHNldHRpbmcgY29sb3JtYXAgbm9uLU5VTEwgYmVmb3JlCi0gICAqIGNhbGxpbmcganBlZ19zdGFydF9kZWNvbXByZXNzOyBvdGhlcndpc2UgYSBjb2xvcm1hcCBpcyBjcmVhdGVkIGR1cmluZwotICAgKiBqcGVnX3N0YXJ0X2RlY29tcHJlc3Mgb3IganBlZ19zdGFydF9vdXRwdXQuCi0gICAqIFRoZSBtYXAgaGFzIG91dF9jb2xvcl9jb21wb25lbnRzIHJvd3MgYW5kIGFjdHVhbF9udW1iZXJfb2ZfY29sb3JzIGNvbHVtbnMuCi0gICAqLwotICBpbnQgYWN0dWFsX251bWJlcl9vZl9jb2xvcnM7CS8qIG51bWJlciBvZiBlbnRyaWVzIGluIHVzZSAqLwotICBKU0FNUEFSUkFZIGNvbG9ybWFwOwkJLyogVGhlIGNvbG9yIG1hcCBhcyBhIDItRCBwaXhlbCBhcnJheSAqLwotCi0gIC8qIFN0YXRlIHZhcmlhYmxlczogdGhlc2UgdmFyaWFibGVzIGluZGljYXRlIHRoZSBwcm9ncmVzcyBvZiBkZWNvbXByZXNzaW9uLgotICAgKiBUaGUgYXBwbGljYXRpb24gbWF5IGV4YW1pbmUgdGhlc2UgYnV0IG11c3Qgbm90IG1vZGlmeSB0aGVtLgotICAgKi8KLQotICAvKiBSb3cgaW5kZXggb2YgbmV4dCBzY2FubGluZSB0byBiZSByZWFkIGZyb20ganBlZ19yZWFkX3NjYW5saW5lcygpLgotICAgKiBBcHBsaWNhdGlvbiBtYXkgdXNlIHRoaXMgdG8gY29udHJvbCBpdHMgcHJvY2Vzc2luZyBsb29wLCBlLmcuLAotICAgKiAid2hpbGUgKG91dHB1dF9zY2FubGluZSA8IG91dHB1dF9oZWlnaHQpIi4KLSAgICovCi0gIEpESU1FTlNJT04gb3V0cHV0X3NjYW5saW5lOwkvKiAwIC4uIG91dHB1dF9oZWlnaHQtMSAgKi8KLQotICAvKiBDdXJyZW50IGlucHV0IHNjYW4gbnVtYmVyIGFuZCBudW1iZXIgb2YgaU1DVSByb3dzIGNvbXBsZXRlZCBpbiBzY2FuLgotICAgKiBUaGVzZSBpbmRpY2F0ZSB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIGRlY29tcHJlc3NvciBpbnB1dCBzaWRlLgotICAgKi8KLSAgaW50IGlucHV0X3NjYW5fbnVtYmVyOwkvKiBOdW1iZXIgb2YgU09TIG1hcmtlcnMgc2VlbiBzbyBmYXIgKi8KLSAgSkRJTUVOU0lPTiBpbnB1dF9pTUNVX3JvdzsJLyogTnVtYmVyIG9mIGlNQ1Ugcm93cyBjb21wbGV0ZWQgKi8KLQotICAvKiBUaGUgIm91dHB1dCBzY2FuIG51bWJlciIgaXMgdGhlIG5vdGlvbmFsIHNjYW4gYmVpbmcgZGlzcGxheWVkIGJ5IHRoZQotICAgKiBvdXRwdXQgc2lkZS4gIFRoZSBkZWNvbXByZXNzb3Igd2lsbCBub3QgYWxsb3cgb3V0cHV0IHNjYW4vcm93IG51bWJlcgotICAgKiB0byBnZXQgYWhlYWQgb2YgaW5wdXQgc2Nhbi9yb3csIGJ1dCBpdCBjYW4gZmFsbCBhcmJpdHJhcmlseSBmYXIgYmVoaW5kLgotICAgKi8KLSAgaW50IG91dHB1dF9zY2FuX251bWJlcjsJLyogTm9taW5hbCBzY2FuIG51bWJlciBiZWluZyBkaXNwbGF5ZWQgKi8KLSAgSkRJTUVOU0lPTiBvdXRwdXRfaU1DVV9yb3c7CS8qIE51bWJlciBvZiBpTUNVIHJvd3MgcmVhZCAqLwotCi0gIC8qIEN1cnJlbnQgcHJvZ3Jlc3Npb24gc3RhdHVzLiAgY29lZl9iaXRzW2NdW2ldIGluZGljYXRlcyB0aGUgcHJlY2lzaW9uCi0gICAqIHdpdGggd2hpY2ggY29tcG9uZW50IGMncyBEQ1QgY29lZmZpY2llbnQgaSAoaW4gemlnemFnIG9yZGVyKSBpcyBrbm93bi4KLSAgICogSXQgaXMgLTEgd2hlbiBubyBkYXRhIGhhcyB5ZXQgYmVlbiByZWNlaXZlZCwgb3RoZXJ3aXNlIGl0IGlzIHRoZSBwb2ludAotICAgKiB0cmFuc2Zvcm0gKHNoaWZ0KSB2YWx1ZSBmb3IgdGhlIG1vc3QgcmVjZW50IHNjYW4gb2YgdGhlIGNvZWZmaWNpZW50Ci0gICAqICh0aHVzLCAwIGF0IGNvbXBsZXRpb24gb2YgdGhlIHByb2dyZXNzaW9uKS4KLSAgICogVGhpcyBwb2ludGVyIGlzIE5VTEwgd2hlbiByZWFkaW5nIGEgbm9uLXByb2dyZXNzaXZlIGZpbGUuCi0gICAqLwotICBpbnQgKCpjb2VmX2JpdHMpW0RDVFNJWkUyXTsJLyogLTEgb3IgY3VycmVudCBBbCB2YWx1ZSBmb3IgZWFjaCBjb2VmICovCi0KLSAgLyogSW50ZXJuYWwgSlBFRyBwYXJhbWV0ZXJzIC0tLSB0aGUgYXBwbGljYXRpb24gdXN1YWxseSBuZWVkIG5vdCBsb29rIGF0Ci0gICAqIHRoZXNlIGZpZWxkcy4gIE5vdGUgdGhhdCB0aGUgZGVjb21wcmVzc29yIG91dHB1dCBzaWRlIG1heSBub3QgdXNlCi0gICAqIGFueSBwYXJhbWV0ZXJzIHRoYXQgY2FuIGNoYW5nZSBiZXR3ZWVuIHNjYW5zLgotICAgKi8KLQotICAvKiBRdWFudGl6YXRpb24gYW5kIEh1ZmZtYW4gdGFibGVzIGFyZSBjYXJyaWVkIGZvcndhcmQgYWNyb3NzIGlucHV0Ci0gICAqIGRhdGFzdHJlYW1zIHdoZW4gcHJvY2Vzc2luZyBhYmJyZXZpYXRlZCBKUEVHIGRhdGFzdHJlYW1zLgotICAgKi8KLQotICBKUVVBTlRfVEJMICogcXVhbnRfdGJsX3B0cnNbTlVNX1FVQU5UX1RCTFNdOwotICAvKiBwdHJzIHRvIGNvZWZmaWNpZW50IHF1YW50aXphdGlvbiB0YWJsZXMsIG9yIE5VTEwgaWYgbm90IGRlZmluZWQgKi8KLQotICBKSFVGRl9UQkwgKiBkY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdOwotICBKSFVGRl9UQkwgKiBhY19odWZmX3RibF9wdHJzW05VTV9IVUZGX1RCTFNdOwotICAvKiBwdHJzIHRvIEh1ZmZtYW4gY29kaW5nIHRhYmxlcywgb3IgTlVMTCBpZiBub3QgZGVmaW5lZCAqLwotCi0gIC8qIFRoZXNlIHBhcmFtZXRlcnMgYXJlIG5ldmVyIGNhcnJpZWQgYWNyb3NzIGRhdGFzdHJlYW1zLCBzaW5jZSB0aGV5Ci0gICAqIGFyZSBnaXZlbiBpbiBTT0YvU09TIG1hcmtlcnMgb3IgZGVmaW5lZCB0byBiZSByZXNldCBieSBTT0kuCi0gICAqLwotCi0gIGludCBkYXRhX3ByZWNpc2lvbjsJCS8qIGJpdHMgb2YgcHJlY2lzaW9uIGluIGltYWdlIGRhdGEgKi8KLQotICBqcGVnX2NvbXBvbmVudF9pbmZvICogY29tcF9pbmZvOwotICAvKiBjb21wX2luZm9baV0gZGVzY3JpYmVzIGNvbXBvbmVudCB0aGF0IGFwcGVhcnMgaSd0aCBpbiBTT0YgKi8KLQotICBib29sZWFuIHByb2dyZXNzaXZlX21vZGU7CS8qIFRSVUUgaWYgU09GbiBzcGVjaWZpZXMgcHJvZ3Jlc3NpdmUgbW9kZSAqLwotICBib29sZWFuIGFyaXRoX2NvZGU7CQkvKiBUUlVFPWFyaXRobWV0aWMgY29kaW5nLCBGQUxTRT1IdWZmbWFuICovCi0KLSAgVUlOVDggYXJpdGhfZGNfTFtOVU1fQVJJVEhfVEJMU107IC8qIEwgdmFsdWVzIGZvciBEQyBhcml0aC1jb2RpbmcgdGFibGVzICovCi0gIFVJTlQ4IGFyaXRoX2RjX1VbTlVNX0FSSVRIX1RCTFNdOyAvKiBVIHZhbHVlcyBmb3IgREMgYXJpdGgtY29kaW5nIHRhYmxlcyAqLwotICBVSU5UOCBhcml0aF9hY19LW05VTV9BUklUSF9UQkxTXTsgLyogS3ggdmFsdWVzIGZvciBBQyBhcml0aC1jb2RpbmcgdGFibGVzICovCi0KLSAgdW5zaWduZWQgaW50IHJlc3RhcnRfaW50ZXJ2YWw7IC8qIE1DVXMgcGVyIHJlc3RhcnQgaW50ZXJ2YWwsIG9yIDAgZm9yIG5vIHJlc3RhcnQgKi8KLQotICAvKiBUaGVzZSBmaWVsZHMgcmVjb3JkIGRhdGEgb2J0YWluZWQgZnJvbSBvcHRpb25hbCBtYXJrZXJzIHJlY29nbml6ZWQgYnkKLSAgICogdGhlIEpQRUcgbGlicmFyeS4KLSAgICovCi0gIGJvb2xlYW4gc2F3X0pGSUZfbWFya2VyOwkvKiBUUlVFIGlmZiBhIEpGSUYgQVBQMCBtYXJrZXIgd2FzIGZvdW5kICovCi0gIC8qIERhdGEgY29waWVkIGZyb20gSkZJRiBtYXJrZXI7IG9ubHkgdmFsaWQgaWYgc2F3X0pGSUZfbWFya2VyIGlzIFRSVUU6ICovCi0gIFVJTlQ4IEpGSUZfbWFqb3JfdmVyc2lvbjsJLyogSkZJRiB2ZXJzaW9uIG51bWJlciAqLwotICBVSU5UOCBKRklGX21pbm9yX3ZlcnNpb247Ci0gIFVJTlQ4IGRlbnNpdHlfdW5pdDsJCS8qIEpGSUYgY29kZSBmb3IgcGl4ZWwgc2l6ZSB1bml0cyAqLwotICBVSU5UMTYgWF9kZW5zaXR5OwkJLyogSG9yaXpvbnRhbCBwaXhlbCBkZW5zaXR5ICovCi0gIFVJTlQxNiBZX2RlbnNpdHk7CQkvKiBWZXJ0aWNhbCBwaXhlbCBkZW5zaXR5ICovCi0gIGJvb2xlYW4gc2F3X0Fkb2JlX21hcmtlcjsJLyogVFJVRSBpZmYgYW4gQWRvYmUgQVBQMTQgbWFya2VyIHdhcyBmb3VuZCAqLwotICBVSU5UOCBBZG9iZV90cmFuc2Zvcm07CS8qIENvbG9yIHRyYW5zZm9ybSBjb2RlIGZyb20gQWRvYmUgbWFya2VyICovCi0KLSAgYm9vbGVhbiBDQ0lSNjAxX3NhbXBsaW5nOwkvKiBUUlVFPWZpcnN0IHNhbXBsZXMgYXJlIGNvc2l0ZWQgKi8KLQotICAvKiBBc2lkZSBmcm9tIHRoZSBzcGVjaWZpYyBkYXRhIHJldGFpbmVkIGZyb20gQVBQbiBtYXJrZXJzIGtub3duIHRvIHRoZQotICAgKiBsaWJyYXJ5LCB0aGUgdW5pbnRlcnByZXRlZCBjb250ZW50cyBvZiBhbnkgb3IgYWxsIEFQUG4gYW5kIENPTSBtYXJrZXJzCi0gICAqIGNhbiBiZSBzYXZlZCBpbiBhIGxpc3QgZm9yIGV4YW1pbmF0aW9uIGJ5IHRoZSBhcHBsaWNhdGlvbi4KLSAgICovCi0gIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBtYXJrZXJfbGlzdDsgLyogSGVhZCBvZiBsaXN0IG9mIHNhdmVkIG1hcmtlcnMgKi8KLQotICAvKiBSZW1haW5pbmcgZmllbGRzIGFyZSBrbm93biB0aHJvdWdob3V0IGRlY29tcHJlc3NvciwgYnV0IGdlbmVyYWxseQotICAgKiBzaG91bGQgbm90IGJlIHRvdWNoZWQgYnkgYSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbi4KLSAgICovCi0KLSAgLyoKLSAgICogVGhlc2UgZmllbGRzIGFyZSBjb21wdXRlZCBkdXJpbmcgZGVjb21wcmVzc2lvbiBzdGFydHVwCi0gICAqLwotICBpbnQgbWF4X2hfc2FtcF9mYWN0b3I7CS8qIGxhcmdlc3QgaF9zYW1wX2ZhY3RvciAqLwotICBpbnQgbWF4X3Zfc2FtcF9mYWN0b3I7CS8qIGxhcmdlc3Qgdl9zYW1wX2ZhY3RvciAqLwotCi0gIGludCBtaW5fRENUX3NjYWxlZF9zaXplOwkvKiBzbWFsbGVzdCBEQ1Rfc2NhbGVkX3NpemUgb2YgYW55IGNvbXBvbmVudCAqLwotCi0gIEpESU1FTlNJT04gdG90YWxfaU1DVV9yb3dzOwkvKiAjIG9mIGlNQ1Ugcm93cyBpbiBpbWFnZSAqLwotICAvKiBUaGUgY29lZmZpY2llbnQgY29udHJvbGxlcidzIGlucHV0IGFuZCBvdXRwdXQgcHJvZ3Jlc3MgaXMgbWVhc3VyZWQgaW4KLSAgICogdW5pdHMgb2YgImlNQ1UiIChpbnRlcmxlYXZlZCBNQ1UpIHJvd3MuICBUaGVzZSBhcmUgdGhlIHNhbWUgYXMgTUNVIHJvd3MKLSAgICogaW4gZnVsbHkgaW50ZXJsZWF2ZWQgSlBFRyBzY2FucywgYnV0IGFyZSB1c2VkIHdoZXRoZXIgdGhlIHNjYW4gaXMKLSAgICogaW50ZXJsZWF2ZWQgb3Igbm90LiAgV2UgZGVmaW5lIGFuIGlNQ1Ugcm93IGFzIHZfc2FtcF9mYWN0b3IgRENUIGJsb2NrCi0gICAqIHJvd3Mgb2YgZWFjaCBjb21wb25lbnQuICBUaGVyZWZvcmUsIHRoZSBJRENUIG91dHB1dCBjb250YWlucwotICAgKiB2X3NhbXBfZmFjdG9yKkRDVF9zY2FsZWRfc2l6ZSBzYW1wbGUgcm93cyBvZiBhIGNvbXBvbmVudCBwZXIgaU1DVSByb3cuCi0gICAqLwotCi0gIEpTQU1QTEUgKiBzYW1wbGVfcmFuZ2VfbGltaXQ7IC8qIHRhYmxlIGZvciBmYXN0IHJhbmdlLWxpbWl0aW5nICovCi0KLSAgLyoKLSAgICogVGhlc2UgZmllbGRzIGFyZSB2YWxpZCBkdXJpbmcgYW55IG9uZSBzY2FuLgotICAgKiBUaGV5IGRlc2NyaWJlIHRoZSBjb21wb25lbnRzIGFuZCBNQ1VzIGFjdHVhbGx5IGFwcGVhcmluZyBpbiB0aGUgc2Nhbi4KLSAgICogTm90ZSB0aGF0IHRoZSBkZWNvbXByZXNzb3Igb3V0cHV0IHNpZGUgbXVzdCBub3QgdXNlIHRoZXNlIGZpZWxkcy4KLSAgICovCi0gIGludCBjb21wc19pbl9zY2FuOwkJLyogIyBvZiBKUEVHIGNvbXBvbmVudHMgaW4gdGhpcyBzY2FuICovCi0gIGpwZWdfY29tcG9uZW50X2luZm8gKiBjdXJfY29tcF9pbmZvW01BWF9DT01QU19JTl9TQ0FOXTsKLSAgLyogKmN1cl9jb21wX2luZm9baV0gZGVzY3JpYmVzIGNvbXBvbmVudCB0aGF0IGFwcGVhcnMgaSd0aCBpbiBTT1MgKi8KLQotICBKRElNRU5TSU9OIE1DVXNfcGVyX3JvdzsJLyogIyBvZiBNQ1VzIGFjcm9zcyB0aGUgaW1hZ2UgKi8KLSAgSkRJTUVOU0lPTiBNQ1Vfcm93c19pbl9zY2FuOwkvKiAjIG9mIE1DVSByb3dzIGluIHRoZSBpbWFnZSAqLwotCi0gIGludCBibG9ja3NfaW5fTUNVOwkJLyogIyBvZiBEQ1QgYmxvY2tzIHBlciBNQ1UgKi8KLSAgaW50IE1DVV9tZW1iZXJzaGlwW0RfTUFYX0JMT0NLU19JTl9NQ1VdOwotICAvKiBNQ1VfbWVtYmVyc2hpcFtpXSBpcyBpbmRleCBpbiBjdXJfY29tcF9pbmZvIG9mIGNvbXBvbmVudCBvd25pbmcgKi8KLSAgLyogaSd0aCBibG9jayBpbiBhbiBNQ1UgKi8KLQotICBpbnQgU3MsIFNlLCBBaCwgQWw7CQkvKiBwcm9ncmVzc2l2ZSBKUEVHIHBhcmFtZXRlcnMgZm9yIHNjYW4gKi8KLQotICAvKiBUaGlzIGZpZWxkIGlzIHNoYXJlZCBiZXR3ZWVuIGVudHJvcHkgZGVjb2RlciBhbmQgbWFya2VyIHBhcnNlci4KLSAgICogSXQgaXMgZWl0aGVyIHplcm8gb3IgdGhlIGNvZGUgb2YgYSBKUEVHIG1hcmtlciB0aGF0IGhhcyBiZWVuCi0gICAqIHJlYWQgZnJvbSB0aGUgZGF0YSBzb3VyY2UsIGJ1dCBoYXMgbm90IHlldCBiZWVuIHByb2Nlc3NlZC4KLSAgICovCi0gIGludCB1bnJlYWRfbWFya2VyOwotCi0gIC8qCi0gICAqIExpbmtzIHRvIGRlY29tcHJlc3Npb24gc3Vib2JqZWN0cyAobWV0aG9kcywgcHJpdmF0ZSB2YXJpYWJsZXMgb2YgbW9kdWxlcykKLSAgICovCi0gIHN0cnVjdCBqcGVnX2RlY29tcF9tYXN0ZXIgKiBtYXN0ZXI7Ci0gIHN0cnVjdCBqcGVnX2RfbWFpbl9jb250cm9sbGVyICogbWFpbjsKLSAgc3RydWN0IGpwZWdfZF9jb2VmX2NvbnRyb2xsZXIgKiBjb2VmOwotICBzdHJ1Y3QganBlZ19kX3Bvc3RfY29udHJvbGxlciAqIHBvc3Q7Ci0gIHN0cnVjdCBqcGVnX2lucHV0X2NvbnRyb2xsZXIgKiBpbnB1dGN0bDsKLSAgc3RydWN0IGpwZWdfbWFya2VyX3JlYWRlciAqIG1hcmtlcjsKLSAgc3RydWN0IGpwZWdfZW50cm9weV9kZWNvZGVyICogZW50cm9weTsKLSAgc3RydWN0IGpwZWdfaW52ZXJzZV9kY3QgKiBpZGN0OwotICBzdHJ1Y3QganBlZ191cHNhbXBsZXIgKiB1cHNhbXBsZTsKLSAgc3RydWN0IGpwZWdfY29sb3JfZGVjb252ZXJ0ZXIgKiBjY29udmVydDsKLSAgc3RydWN0IGpwZWdfY29sb3JfcXVhbnRpemVyICogY3F1YW50aXplOwotfTsKLQotCi0vKiAiT2JqZWN0IiBkZWNsYXJhdGlvbnMgZm9yIEpQRUcgbW9kdWxlcyB0aGF0IG1heSBiZSBzdXBwbGllZCBvciBjYWxsZWQKLSAqIGRpcmVjdGx5IGJ5IHRoZSBzdXJyb3VuZGluZyBhcHBsaWNhdGlvbi4KLSAqIEFzIHdpdGggYWxsIG9iamVjdHMgaW4gdGhlIEpQRUcgbGlicmFyeSwgdGhlc2Ugc3RydWN0cyBvbmx5IGRlZmluZSB0aGUKLSAqIHB1YmxpY2x5IHZpc2libGUgbWV0aG9kcyBhbmQgc3RhdGUgdmFyaWFibGVzIG9mIGEgbW9kdWxlLiAgQWRkaXRpb25hbAotICogcHJpdmF0ZSBmaWVsZHMgbWF5IGV4aXN0IGFmdGVyIHRoZSBwdWJsaWMgb25lcy4KLSAqLwotCi0KLS8qIEVycm9yIGhhbmRsZXIgb2JqZWN0ICovCi0KLXN0cnVjdCBqcGVnX2Vycm9yX21nciB7Ci0gIC8qIEVycm9yIGV4aXQgaGFuZGxlcjogZG9lcyBub3QgcmV0dXJuIHRvIGNhbGxlciAqLwotICBKTUVUSE9EKHZvaWQsIGVycm9yX2V4aXQsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLSAgLyogQ29uZGl0aW9uYWxseSBlbWl0IGEgdHJhY2Ugb3Igd2FybmluZyBtZXNzYWdlICovCi0gIEpNRVRIT0Qodm9pZCwgZW1pdF9tZXNzYWdlLCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgbXNnX2xldmVsKSk7Ci0gIC8qIFJvdXRpbmUgdGhhdCBhY3R1YWxseSBvdXRwdXRzIGEgdHJhY2Ugb3IgZXJyb3IgbWVzc2FnZSAqLwotICBKTUVUSE9EKHZvaWQsIG91dHB1dF9tZXNzYWdlLCAoal9jb21tb25fcHRyIGNpbmZvKSk7Ci0gIC8qIEZvcm1hdCBhIG1lc3NhZ2Ugc3RyaW5nIGZvciB0aGUgbW9zdCByZWNlbnQgSlBFRyBlcnJvciBvciBtZXNzYWdlICovCi0gIEpNRVRIT0Qodm9pZCwgZm9ybWF0X21lc3NhZ2UsIChqX2NvbW1vbl9wdHIgY2luZm8sIGNoYXIgKiBidWZmZXIpKTsKLSNkZWZpbmUgSk1TR19MRU5HVEhfTUFYICAyMDAJLyogcmVjb21tZW5kZWQgc2l6ZSBvZiBmb3JtYXRfbWVzc2FnZSBidWZmZXIgKi8KLSAgLyogUmVzZXQgZXJyb3Igc3RhdGUgdmFyaWFibGVzIGF0IHN0YXJ0IG9mIGEgbmV3IGltYWdlICovCi0gIEpNRVRIT0Qodm9pZCwgcmVzZXRfZXJyb3JfbWdyLCAoal9jb21tb25fcHRyIGNpbmZvKSk7Ci0gIAotICAvKiBUaGUgbWVzc2FnZSBJRCBjb2RlIGFuZCBhbnkgcGFyYW1ldGVycyBhcmUgc2F2ZWQgaGVyZS4KLSAgICogQSBtZXNzYWdlIGNhbiBoYXZlIG9uZSBzdHJpbmcgcGFyYW1ldGVyIG9yIHVwIHRvIDggaW50IHBhcmFtZXRlcnMuCi0gICAqLwotICBpbnQgbXNnX2NvZGU7Ci0jZGVmaW5lIEpNU0dfU1RSX1BBUk1fTUFYICA4MAotICB1bmlvbiB7Ci0gICAgaW50IGlbOF07Ci0gICAgY2hhciBzW0pNU0dfU1RSX1BBUk1fTUFYXTsKLSAgfSBtc2dfcGFybTsKLSAgCi0gIC8qIFN0YW5kYXJkIHN0YXRlIHZhcmlhYmxlcyBmb3IgZXJyb3IgZmFjaWxpdHkgKi8KLSAgCi0gIGludCB0cmFjZV9sZXZlbDsJCS8qIG1heCBtc2dfbGV2ZWwgdGhhdCB3aWxsIGJlIGRpc3BsYXllZCAqLwotICAKLSAgLyogRm9yIHJlY292ZXJhYmxlIGNvcnJ1cHQtZGF0YSBlcnJvcnMsIHdlIGVtaXQgYSB3YXJuaW5nIG1lc3NhZ2UsCi0gICAqIGJ1dCBrZWVwIGdvaW5nIHVubGVzcyBlbWl0X21lc3NhZ2UgY2hvb3NlcyB0byBhYm9ydC4gIGVtaXRfbWVzc2FnZQotICAgKiBzaG91bGQgY291bnQgd2FybmluZ3MgaW4gbnVtX3dhcm5pbmdzLiAgVGhlIHN1cnJvdW5kaW5nIGFwcGxpY2F0aW9uCi0gICAqIGNhbiBjaGVjayBmb3IgYmFkIGRhdGEgYnkgc2VlaW5nIGlmIG51bV93YXJuaW5ncyBpcyBub256ZXJvIGF0IHRoZQotICAgKiBlbmQgb2YgcHJvY2Vzc2luZy4KLSAgICovCi0gIGxvbmcgbnVtX3dhcm5pbmdzOwkJLyogbnVtYmVyIG9mIGNvcnJ1cHQtZGF0YSB3YXJuaW5ncyAqLwotCi0gIC8qIFRoZXNlIGZpZWxkcyBwb2ludCB0byB0aGUgdGFibGUocykgb2YgZXJyb3IgbWVzc2FnZSBzdHJpbmdzLgotICAgKiBBbiBhcHBsaWNhdGlvbiBjYW4gY2hhbmdlIHRoZSB0YWJsZSBwb2ludGVyIHRvIHN3aXRjaCB0byBhIGRpZmZlcmVudAotICAgKiBtZXNzYWdlIGxpc3QgKHR5cGljYWxseSwgdG8gY2hhbmdlIHRoZSBsYW5ndWFnZSBpbiB3aGljaCBlcnJvcnMgYXJlCi0gICAqIHJlcG9ydGVkKS4gIFNvbWUgYXBwbGljYXRpb25zIG1heSB3aXNoIHRvIGFkZCBhZGRpdGlvbmFsIGVycm9yIGNvZGVzCi0gICAqIHRoYXQgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBKUEVHIGxpYnJhcnkgZXJyb3IgbWVjaGFuaXNtOyB0aGUgc2Vjb25kCi0gICAqIHRhYmxlIHBvaW50ZXIgaXMgdXNlZCBmb3IgdGhpcyBwdXJwb3NlLgotICAgKgotICAgKiBGaXJzdCB0YWJsZSBpbmNsdWRlcyBhbGwgZXJyb3JzIGdlbmVyYXRlZCBieSBKUEVHIGxpYnJhcnkgaXRzZWxmLgotICAgKiBFcnJvciBjb2RlIDAgaXMgcmVzZXJ2ZWQgZm9yIGEgIm5vIHN1Y2ggZXJyb3Igc3RyaW5nIiBtZXNzYWdlLgotICAgKi8KLSAgY29uc3QgY2hhciAqIGNvbnN0ICoganBlZ19tZXNzYWdlX3RhYmxlOyAvKiBMaWJyYXJ5IGVycm9ycyAqLwotICBpbnQgbGFzdF9qcGVnX21lc3NhZ2U7ICAgIC8qIFRhYmxlIGNvbnRhaW5zIHN0cmluZ3MgMC4ubGFzdF9qcGVnX21lc3NhZ2UgKi8KLSAgLyogU2Vjb25kIHRhYmxlIGNhbiBiZSBhZGRlZCBieSBhcHBsaWNhdGlvbiAoc2VlIGNqcGVnL2RqcGVnIGZvciBleGFtcGxlKS4KLSAgICogSXQgY29udGFpbnMgc3RyaW5ncyBudW1iZXJlZCBmaXJzdF9hZGRvbl9tZXNzYWdlLi5sYXN0X2FkZG9uX21lc3NhZ2UuCi0gICAqLwotICBjb25zdCBjaGFyICogY29uc3QgKiBhZGRvbl9tZXNzYWdlX3RhYmxlOyAvKiBOb24tbGlicmFyeSBlcnJvcnMgKi8KLSAgaW50IGZpcnN0X2FkZG9uX21lc3NhZ2U7CS8qIGNvZGUgZm9yIGZpcnN0IHN0cmluZyBpbiBhZGRvbiB0YWJsZSAqLwotICBpbnQgbGFzdF9hZGRvbl9tZXNzYWdlOwkvKiBjb2RlIGZvciBsYXN0IHN0cmluZyBpbiBhZGRvbiB0YWJsZSAqLwotfTsKLQotCi0vKiBQcm9ncmVzcyBtb25pdG9yIG9iamVjdCAqLwotCi1zdHJ1Y3QganBlZ19wcm9ncmVzc19tZ3IgewotICBKTUVUSE9EKHZvaWQsIHByb2dyZXNzX21vbml0b3IsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLQotICBsb25nIHBhc3NfY291bnRlcjsJCS8qIHdvcmsgdW5pdHMgY29tcGxldGVkIGluIHRoaXMgcGFzcyAqLwotICBsb25nIHBhc3NfbGltaXQ7CQkvKiB0b3RhbCBudW1iZXIgb2Ygd29yayB1bml0cyBpbiB0aGlzIHBhc3MgKi8KLSAgaW50IGNvbXBsZXRlZF9wYXNzZXM7CQkvKiBwYXNzZXMgY29tcGxldGVkIHNvIGZhciAqLwotICBpbnQgdG90YWxfcGFzc2VzOwkJLyogdG90YWwgbnVtYmVyIG9mIHBhc3NlcyBleHBlY3RlZCAqLwotfTsKLQotCi0vKiBEYXRhIGRlc3RpbmF0aW9uIG9iamVjdCBmb3IgY29tcHJlc3Npb24gKi8KLQotc3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyIHsKLSAgSk9DVEVUICogbmV4dF9vdXRwdXRfYnl0ZTsJLyogPT4gbmV4dCBieXRlIHRvIHdyaXRlIGluIGJ1ZmZlciAqLwotICBzaXplX3QgZnJlZV9pbl9idWZmZXI7CS8qICMgb2YgYnl0ZSBzcGFjZXMgcmVtYWluaW5nIGluIGJ1ZmZlciAqLwotCi0gIEpNRVRIT0Qodm9pZCwgaW5pdF9kZXN0aW5hdGlvbiwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0QoYm9vbGVhbiwgZW1wdHlfb3V0cHV0X2J1ZmZlciwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0gIEpNRVRIT0Qodm9pZCwgdGVybV9kZXN0aW5hdGlvbiwgKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci19OwotCi0KLS8qIERhdGEgc291cmNlIG9iamVjdCBmb3IgZGVjb21wcmVzc2lvbiAqLwotCi1zdHJ1Y3QganBlZ19zb3VyY2VfbWdyIHsKLSAgY29uc3QgSk9DVEVUICogbmV4dF9pbnB1dF9ieXRlOyAvKiA9PiBuZXh0IGJ5dGUgdG8gcmVhZCBmcm9tIGJ1ZmZlciAqLwotICBzaXplX3QgYnl0ZXNfaW5fYnVmZmVyOwkvKiAjIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiBidWZmZXIgKi8KLQotICBKTUVUSE9EKHZvaWQsIGluaXRfc291cmNlLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKGJvb2xlYW4sIGZpbGxfaW5wdXRfYnVmZmVyLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotICBKTUVUSE9EKHZvaWQsIHNraXBfaW5wdXRfZGF0YSwgKGpfZGVjb21wcmVzc19wdHIgY2luZm8sIGxvbmcgbnVtX2J5dGVzKSk7Ci0gIEpNRVRIT0QoYm9vbGVhbiwgcmVzeW5jX3RvX3Jlc3RhcnQsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgZGVzaXJlZCkpOwotICBKTUVUSE9EKHZvaWQsIHRlcm1fc291cmNlLCAoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotfTsKLQotCi0vKiBNZW1vcnkgbWFuYWdlciBvYmplY3QuCi0gKiBBbGxvY2F0ZXMgInNtYWxsIiBvYmplY3RzIChhIGZldyBLIHRvdGFsKSwgImxhcmdlIiBvYmplY3RzICh0ZW5zIG9mIEspLAotICogYW5kICJyZWFsbHkgYmlnIiBvYmplY3RzICh2aXJ0dWFsIGFycmF5cyB3aXRoIGJhY2tpbmcgc3RvcmUgaWYgbmVlZGVkKS4KLSAqIFRoZSBtZW1vcnkgbWFuYWdlciBkb2VzIG5vdCBhbGxvdyBpbmRpdmlkdWFsIG9iamVjdHMgdG8gYmUgZnJlZWQ7IHJhdGhlciwKLSAqIGVhY2ggY3JlYXRlZCBvYmplY3QgaXMgYXNzaWduZWQgdG8gYSBwb29sLCBhbmQgd2hvbGUgcG9vbHMgY2FuIGJlIGZyZWVkCi0gKiBhdCBvbmNlLiAgVGhpcyBpcyBmYXN0ZXIgYW5kIG1vcmUgY29udmVuaWVudCB0aGFuIHJlbWVtYmVyaW5nIGV4YWN0bHkgd2hhdAotICogdG8gZnJlZSwgZXNwZWNpYWxseSB3aGVyZSBtYWxsb2MoKS9mcmVlKCkgYXJlIG5vdCB0b28gc3BlZWR5LgotICogTkI6IGFsbG9jIHJvdXRpbmVzIG5ldmVyIHJldHVybiBOVUxMLiAgVGhleSBleGl0IHRvIGVycm9yX2V4aXQgaWYgbm90Ci0gKiBzdWNjZXNzZnVsLgotICovCi0KLSNkZWZpbmUgSlBPT0xfUEVSTUFORU5UCTAJLyogbGFzdHMgdW50aWwgbWFzdGVyIHJlY29yZCBpcyBkZXN0cm95ZWQgKi8KLSNkZWZpbmUgSlBPT0xfSU1BR0UJMQkvKiBsYXN0cyB1bnRpbCBkb25lIHdpdGggaW1hZ2UvZGF0YXN0cmVhbSAqLwotI2RlZmluZSBKUE9PTF9OVU1QT09MUwkyCi0KLXR5cGVkZWYgc3RydWN0IGp2aXJ0X3NhcnJheV9jb250cm9sICoganZpcnRfc2FycmF5X3B0cjsKLXR5cGVkZWYgc3RydWN0IGp2aXJ0X2JhcnJheV9jb250cm9sICoganZpcnRfYmFycmF5X3B0cjsKLQotCi1zdHJ1Y3QganBlZ19tZW1vcnlfbWdyIHsKLSAgLyogTWV0aG9kIHBvaW50ZXJzICovCi0gIEpNRVRIT0Qodm9pZCAqLCBhbGxvY19zbWFsbCwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsCi0JCQkJc2l6ZV90IHNpemVvZm9iamVjdCkpOwotICBKTUVUSE9EKHZvaWQgICosIGFsbG9jX2xhcmdlLCAoal9jb21tb25fcHRyIGNpbmZvLCBpbnQgcG9vbF9pZCwKLQkJCQkgICAgIHNpemVfdCBzaXplb2ZvYmplY3QpKTsKLSAgSk1FVEhPRChKU0FNUEFSUkFZLCBhbGxvY19zYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkLAotCQkJCSAgICAgSkRJTUVOU0lPTiBzYW1wbGVzcGVycm93LAotCQkJCSAgICAgSkRJTUVOU0lPTiBudW1yb3dzKSk7Ci0gIEpNRVRIT0QoSkJMT0NLQVJSQVksIGFsbG9jX2JhcnJheSwgKGpfY29tbW9uX3B0ciBjaW5mbywgaW50IHBvb2xfaWQsCi0JCQkJICAgICAgSkRJTUVOU0lPTiBibG9ja3NwZXJyb3csCi0JCQkJICAgICAgSkRJTUVOU0lPTiBudW1yb3dzKSk7Ci0gIEpNRVRIT0QoanZpcnRfc2FycmF5X3B0ciwgcmVxdWVzdF92aXJ0X3NhcnJheSwgKGpfY29tbW9uX3B0ciBjaW5mbywKLQkJCQkJCSAgaW50IHBvb2xfaWQsCi0JCQkJCQkgIGJvb2xlYW4gcHJlX3plcm8sCi0JCQkJCQkgIEpESU1FTlNJT04gc2FtcGxlc3BlcnJvdywKLQkJCQkJCSAgSkRJTUVOU0lPTiBudW1yb3dzLAotCQkJCQkJICBKRElNRU5TSU9OIG1heGFjY2VzcykpOwotICBKTUVUSE9EKGp2aXJ0X2JhcnJheV9wdHIsIHJlcXVlc3RfdmlydF9iYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sCi0JCQkJCQkgIGludCBwb29sX2lkLAotCQkJCQkJICBib29sZWFuIHByZV96ZXJvLAotCQkJCQkJICBKRElNRU5TSU9OIGJsb2Nrc3BlcnJvdywKLQkJCQkJCSAgSkRJTUVOU0lPTiBudW1yb3dzLAotCQkJCQkJICBKRElNRU5TSU9OIG1heGFjY2VzcykpOwotICBKTUVUSE9EKHZvaWQsIHJlYWxpemVfdmlydF9hcnJheXMsIChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLSAgSk1FVEhPRChKU0FNUEFSUkFZLCBhY2Nlc3NfdmlydF9zYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sCi0JCQkJCSAgIGp2aXJ0X3NhcnJheV9wdHIgcHRyLAotCQkJCQkgICBKRElNRU5TSU9OIHN0YXJ0X3JvdywKLQkJCQkJICAgSkRJTUVOU0lPTiBudW1fcm93cywKLQkJCQkJICAgYm9vbGVhbiB3cml0YWJsZSkpOwotICBKTUVUSE9EKEpCTE9DS0FSUkFZLCBhY2Nlc3NfdmlydF9iYXJyYXksIChqX2NvbW1vbl9wdHIgY2luZm8sCi0JCQkJCSAgICBqdmlydF9iYXJyYXlfcHRyIHB0ciwKLQkJCQkJICAgIEpESU1FTlNJT04gc3RhcnRfcm93LAotCQkJCQkgICAgSkRJTUVOU0lPTiBudW1fcm93cywKLQkJCQkJICAgIGJvb2xlYW4gd3JpdGFibGUpKTsKLSAgSk1FVEhPRCh2b2lkLCBmcmVlX3Bvb2wsIChqX2NvbW1vbl9wdHIgY2luZm8sIGludCBwb29sX2lkKSk7Ci0gIEpNRVRIT0Qodm9pZCwgc2VsZl9kZXN0cnVjdCwgKGpfY29tbW9uX3B0ciBjaW5mbykpOwotCi0gIC8qIExpbWl0IG9uIG1lbW9yeSBhbGxvY2F0aW9uIGZvciB0aGlzIEpQRUcgb2JqZWN0LiAgKE5vdGUgdGhhdCB0aGlzIGlzCi0gICAqIG1lcmVseSBhZHZpc29yeSwgbm90IGEgZ3VhcmFudGVlZCBtYXhpbXVtOyBpdCBvbmx5IGFmZmVjdHMgdGhlIHNwYWNlCi0gICAqIHVzZWQgZm9yIHZpcnR1YWwtYXJyYXkgYnVmZmVycy4pICBNYXkgYmUgY2hhbmdlZCBieSBvdXRlciBhcHBsaWNhdGlvbgotICAgKiBhZnRlciBjcmVhdGluZyB0aGUgSlBFRyBvYmplY3QuCi0gICAqLwotICBsb25nIG1heF9tZW1vcnlfdG9fdXNlOwotCi0gIC8qIE1heGltdW0gYWxsb2NhdGlvbiByZXF1ZXN0IGFjY2VwdGVkIGJ5IGFsbG9jX2xhcmdlLiAqLwotICBsb25nIG1heF9hbGxvY19jaHVuazsKLX07Ci0KLQotLyogUm91dGluZSBzaWduYXR1cmUgZm9yIGFwcGxpY2F0aW9uLXN1cHBsaWVkIG1hcmtlciBwcm9jZXNzaW5nIG1ldGhvZHMuCi0gKiBOZWVkIG5vdCBwYXNzIG1hcmtlciBjb2RlIHNpbmNlIGl0IGlzIHN0b3JlZCBpbiBjaW5mby0+dW5yZWFkX21hcmtlci4KLSAqLwotdHlwZWRlZiBKTUVUSE9EKGJvb2xlYW4sIGpwZWdfbWFya2VyX3BhcnNlcl9tZXRob2QsIChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLQotLyogRGVjbGFyYXRpb25zIGZvciByb3V0aW5lcyBjYWxsZWQgYnkgYXBwbGljYXRpb24uCi0gKiBUaGUgSlBQIG1hY3JvIGhpZGVzIHByb3RvdHlwZSBwYXJhbWV0ZXJzIGZyb20gY29tcGlsZXJzIHRoYXQgY2FuJ3QgY29wZS4KLSAqIE5vdGUgSlBQIHJlcXVpcmVzIGRvdWJsZSBwYXJlbnRoZXNlcy4KLSAqLwotCi0jaWZkZWYgSEFWRV9QUk9UT1RZUEVTCi0jZGVmaW5lIEpQUChhcmdsaXN0KQlhcmdsaXN0Ci0jZWxzZQotI2RlZmluZSBKUFAoYXJnbGlzdCkJKCkKLSNlbmRpZgotCi0KLS8qIFNob3J0IGZvcm1zIG9mIGV4dGVybmFsIG5hbWVzIGZvciBzeXN0ZW1zIHdpdGggYnJhaW4tZGFtYWdlZCBsaW5rZXJzLgotICogV2Ugc2hvcnRlbiBleHRlcm5hbCBuYW1lcyB0byBiZSB1bmlxdWUgaW4gdGhlIGZpcnN0IHNpeCBsZXR0ZXJzLCB3aGljaAotICogaXMgZ29vZCBlbm91Z2ggZm9yIGFsbCBrbm93biBzeXN0ZW1zLgotICogKElmIHlvdXIgY29tcGlsZXIgaXRzZWxmIG5lZWRzIG5hbWVzIHRvIGJlIHVuaXF1ZSBpbiBsZXNzIHRoYW4gMTUgCi0gKiBjaGFyYWN0ZXJzLCB5b3UgYXJlIG91dCBvZiBsdWNrLiAgR2V0IGEgYmV0dGVyIGNvbXBpbGVyLikKLSAqLwotCi0jaWZkZWYgTkVFRF9TSE9SVF9FWFRFUk5BTF9OQU1FUwotI2RlZmluZSBqcGVnX3N0ZF9lcnJvcgkJalN0ZEVycm9yCi0jZGVmaW5lIGpwZWdfQ3JlYXRlQ29tcHJlc3MJakNyZWFDb21wcmVzcwotI2RlZmluZSBqcGVnX0NyZWF0ZURlY29tcHJlc3MJakNyZWFEZWNvbXByZXNzCi0jZGVmaW5lIGpwZWdfZGVzdHJveV9jb21wcmVzcwlqRGVzdENvbXByZXNzCi0jZGVmaW5lIGpwZWdfZGVzdHJveV9kZWNvbXByZXNzCWpEZXN0RGVjb21wcmVzcwotI2RlZmluZSBqcGVnX3N0ZGlvX2Rlc3QJCWpTdGREZXN0Ci0jZGVmaW5lIGpwZWdfc3RkaW9fc3JjCQlqU3RkU3JjCi0jZGVmaW5lIGpwZWdfc2V0X2RlZmF1bHRzCWpTZXREZWZhdWx0cwotI2RlZmluZSBqcGVnX3NldF9jb2xvcnNwYWNlCWpTZXRDb2xvcnNwYWNlCi0jZGVmaW5lIGpwZWdfZGVmYXVsdF9jb2xvcnNwYWNlCWpEZWZDb2xvcnNwYWNlCi0jZGVmaW5lIGpwZWdfc2V0X3F1YWxpdHkJalNldFF1YWxpdHkKLSNkZWZpbmUganBlZ19zZXRfbGluZWFyX3F1YWxpdHkJalNldExRdWFsaXR5Ci0jZGVmaW5lIGpwZWdfYWRkX3F1YW50X3RhYmxlCWpBZGRRdWFudFRhYmxlCi0jZGVmaW5lIGpwZWdfcXVhbGl0eV9zY2FsaW5nCWpRdWFsaXR5U2NhbGluZwotI2RlZmluZSBqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbglqU2ltUHJvZ3Jlc3MKLSNkZWZpbmUganBlZ19zdXBwcmVzc190YWJsZXMJalN1cHByZXNzVGFibGVzCi0jZGVmaW5lIGpwZWdfYWxsb2NfcXVhbnRfdGFibGUJakFsY1FUYWJsZQotI2RlZmluZSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUJakFsY0hUYWJsZQotI2RlZmluZSBqcGVnX3N0YXJ0X2NvbXByZXNzCWpTdHJ0Q29tcHJlc3MKLSNkZWZpbmUganBlZ193cml0ZV9zY2FubGluZXMJaldydFNjYW5saW5lcwotI2RlZmluZSBqcGVnX2ZpbmlzaF9jb21wcmVzcwlqRmluQ29tcHJlc3MKLSNkZWZpbmUganBlZ193cml0ZV9yYXdfZGF0YQlqV3J0UmF3RGF0YQotI2RlZmluZSBqcGVnX3dyaXRlX21hcmtlcglqV3J0TWFya2VyCi0jZGVmaW5lIGpwZWdfd3JpdGVfbV9oZWFkZXIJaldydE1IZWFkZXIKLSNkZWZpbmUganBlZ193cml0ZV9tX2J5dGUJaldydE1CeXRlCi0jZGVmaW5lIGpwZWdfd3JpdGVfdGFibGVzCWpXcnRUYWJsZXMKLSNkZWZpbmUganBlZ19yZWFkX2hlYWRlcglqUmVhZEhlYWRlcgotI2RlZmluZSBqcGVnX3N0YXJ0X2RlY29tcHJlc3MJalN0cnREZWNvbXByZXNzCi0jZGVmaW5lIGpwZWdfcmVhZF9zY2FubGluZXMJalJlYWRTY2FubGluZXMKLSNkZWZpbmUganBlZ19maW5pc2hfZGVjb21wcmVzcwlqRmluRGVjb21wcmVzcwotI2RlZmluZSBqcGVnX3JlYWRfcmF3X2RhdGEJalJlYWRSYXdEYXRhCi0jZGVmaW5lIGpwZWdfaGFzX211bHRpcGxlX3NjYW5zCWpIYXNNdWx0U2NuCi0jZGVmaW5lIGpwZWdfc3RhcnRfb3V0cHV0CWpTdHJ0T3V0cHV0Ci0jZGVmaW5lIGpwZWdfZmluaXNoX291dHB1dAlqRmluT3V0cHV0Ci0jZGVmaW5lIGpwZWdfaW5wdXRfY29tcGxldGUJakluQ29tcGxldGUKLSNkZWZpbmUganBlZ19uZXdfY29sb3JtYXAJak5ld0NNYXAKLSNkZWZpbmUganBlZ19jb25zdW1lX2lucHV0CWpDb25zdW1lSW5wdXQKLSNkZWZpbmUganBlZ19jYWxjX291dHB1dF9kaW1lbnNpb25zCWpDYWxjRGltZW5zaW9ucwotI2RlZmluZSBqcGVnX3NhdmVfbWFya2VycwlqU2F2ZU1hcmtlcnMKLSNkZWZpbmUganBlZ19zZXRfbWFya2VyX3Byb2Nlc3NvcglqU2V0TWFya2VyCi0jZGVmaW5lIGpwZWdfcmVhZF9jb2VmZmljaWVudHMJalJlYWRDb2VmcwotI2RlZmluZSBqcGVnX3dyaXRlX2NvZWZmaWNpZW50cwlqV3J0Q29lZnMKLSNkZWZpbmUganBlZ19jb3B5X2NyaXRpY2FsX3BhcmFtZXRlcnMJakNvcHlDcml0Ci0jZGVmaW5lIGpwZWdfYWJvcnRfY29tcHJlc3MJakFicnRDb21wcmVzcwotI2RlZmluZSBqcGVnX2Fib3J0X2RlY29tcHJlc3MJakFicnREZWNvbXByZXNzCi0jZGVmaW5lIGpwZWdfYWJvcnQJCWpBYm9ydAotI2RlZmluZSBqcGVnX2Rlc3Ryb3kJCWpEZXN0cm95Ci0jZGVmaW5lIGpwZWdfcmVzeW5jX3RvX3Jlc3RhcnQJalJlc3luY1Jlc3RhcnQKLSNlbmRpZiAvKiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTICovCi0KLQotLyogRGVmYXVsdCBlcnJvci1tYW5hZ2VtZW50IHNldHVwICovCi1FWFRFUk4oc3RydWN0IGpwZWdfZXJyb3JfbWdyICopIGpwZWdfc3RkX2Vycm9yCi0JSlBQKChzdHJ1Y3QganBlZ19lcnJvcl9tZ3IgKiBlcnIpKTsKLQotLyogSW5pdGlhbGl6YXRpb24gb2YgSlBFRyBjb21wcmVzc2lvbiBvYmplY3RzLgotICoganBlZ19jcmVhdGVfY29tcHJlc3MoKSBhbmQganBlZ19jcmVhdGVfZGVjb21wcmVzcygpIGFyZSB0aGUgZXhwb3J0ZWQKLSAqIG5hbWVzIHRoYXQgYXBwbGljYXRpb25zIHNob3VsZCBjYWxsLiAgVGhlc2UgZXhwYW5kIHRvIGNhbGxzIG9uCi0gKiBqcGVnX0NyZWF0ZUNvbXByZXNzIGFuZCBqcGVnX0NyZWF0ZURlY29tcHJlc3Mgd2l0aCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiBwYXNzZWQgZm9yIHZlcnNpb24gbWlzbWF0Y2ggY2hlY2tpbmcuCi0gKiBOQjogeW91IG11c3Qgc2V0IHVwIHRoZSBlcnJvci1tYW5hZ2VyIEJFRk9SRSBjYWxsaW5nIGpwZWdfY3JlYXRlX3h4eC4KLSAqLwotI2RlZmluZSBqcGVnX2NyZWF0ZV9jb21wcmVzcyhjaW5mbykgXAotICAgIGpwZWdfQ3JlYXRlQ29tcHJlc3MoKGNpbmZvKSwgSlBFR19MSUJfVkVSU0lPTiwgXAotCQkJKHNpemVfdCkgc2l6ZW9mKHN0cnVjdCBqcGVnX2NvbXByZXNzX3N0cnVjdCkpCi0jZGVmaW5lIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoY2luZm8pIFwKLSAgICBqcGVnX0NyZWF0ZURlY29tcHJlc3MoKGNpbmZvKSwgSlBFR19MSUJfVkVSU0lPTiwgXAotCQkJICAoc2l6ZV90KSBzaXplb2Yoc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QpKQotRVhURVJOKHZvaWQpIGpwZWdfQ3JlYXRlQ29tcHJlc3MgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkgICAgICBpbnQgdmVyc2lvbiwgc2l6ZV90IHN0cnVjdHNpemUpKTsKLUVYVEVSTih2b2lkKSBqcGVnX0NyZWF0ZURlY29tcHJlc3MgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQlpbnQgdmVyc2lvbiwgc2l6ZV90IHN0cnVjdHNpemUpKTsKLS8qIERlc3RydWN0aW9uIG9mIEpQRUcgY29tcHJlc3Npb24gb2JqZWN0cyAqLwotRVhURVJOKHZvaWQpIGpwZWdfZGVzdHJveV9jb21wcmVzcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkganBlZ19kZXN0cm95X2RlY29tcHJlc3MgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLSNpZiAwCi0vKiBTdGFuZGFyZCBkYXRhIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gbWFuYWdlcnM6IHN0ZGlvIHN0cmVhbXMuICovCi0vKiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIG9wZW5pbmcgdGhlIGZpbGUgYmVmb3JlIGFuZCBjbG9zaW5nIGFmdGVyLiAqLwotRVhURVJOKHZvaWQpIGpwZWdfc3RkaW9fZGVzdCBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLCBGWFNZU19GSUxFICogb3V0ZmlsZSkpOwotRVhURVJOKHZvaWQpIGpwZWdfc3RkaW9fc3JjIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgRlhTWVNfRklMRSAqIGluZmlsZSkpOwotI2VuZGlmCi0KLS8qIERlZmF1bHQgcGFyYW1ldGVyIHNldHVwIGZvciBjb21wcmVzc2lvbiAqLwotRVhURVJOKHZvaWQpIGpwZWdfc2V0X2RlZmF1bHRzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLS8qIENvbXByZXNzaW9uIHBhcmFtZXRlciBzZXR1cCBhaWRzICovCi1FWFRFUk4odm9pZCkganBlZ19zZXRfY29sb3JzcGFjZSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSAgICAgIEpfQ09MT1JfU1BBQ0UgY29sb3JzcGFjZSkpOwotRVhURVJOKHZvaWQpIGpwZWdfZGVmYXVsdF9jb2xvcnNwYWNlIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqcGVnX3NldF9xdWFsaXR5IEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBxdWFsaXR5LAotCQkJCSAgIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpKTsKLUVYVEVSTih2b2lkKSBqcGVnX3NldF9saW5lYXJfcXVhbGl0eSBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgIGludCBzY2FsZV9mYWN0b3IsCi0JCQkJCSAgYm9vbGVhbiBmb3JjZV9iYXNlbGluZSkpOwotRVhURVJOKHZvaWQpIGpwZWdfYWRkX3F1YW50X3RhYmxlIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB3aGljaF90YmwsCi0JCQkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAqYmFzaWNfdGFibGUsCi0JCQkJICAgICAgIGludCBzY2FsZV9mYWN0b3IsCi0JCQkJICAgICAgIGJvb2xlYW4gZm9yY2VfYmFzZWxpbmUpKTsKLUVYVEVSTihpbnQpIGpwZWdfcXVhbGl0eV9zY2FsaW5nIEpQUCgoaW50IHF1YWxpdHkpKTsKLUVYVEVSTih2b2lkKSBqcGVnX3NpbXBsZV9wcm9ncmVzc2lvbiBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkganBlZ19zdXBwcmVzc190YWJsZXMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkgICAgICAgYm9vbGVhbiBzdXBwcmVzcykpOwotRVhURVJOKEpRVUFOVF9UQkwgKikganBlZ19hbGxvY19xdWFudF90YWJsZSBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOwotRVhURVJOKEpIVUZGX1RCTCAqKSBqcGVnX2FsbG9jX2h1ZmZfdGFibGUgSlBQKChqX2NvbW1vbl9wdHIgY2luZm8pKTsKLQotLyogTWFpbiBlbnRyeSBwb2ludHMgZm9yIGNvbXByZXNzaW9uICovCi1FWFRFUk4odm9pZCkganBlZ19zdGFydF9jb21wcmVzcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSAgICAgIGJvb2xlYW4gd3JpdGVfYWxsX3RhYmxlcykpOwotRVhURVJOKEpESU1FTlNJT04pIGpwZWdfd3JpdGVfc2NhbmxpbmVzIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICAgSlNBTVBBUlJBWSBzY2FubGluZXMsCi0JCQkJCSAgICAgSkRJTUVOU0lPTiBudW1fbGluZXMpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2ZpbmlzaF9jb21wcmVzcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLS8qIFJlcGxhY2VzIGpwZWdfd3JpdGVfc2NhbmxpbmVzIHdoZW4gd3JpdGluZyByYXcgZG93bnNhbXBsZWQgZGF0YS4gKi8KLUVYVEVSTihKRElNRU5TSU9OKSBqcGVnX3dyaXRlX3Jhd19kYXRhIEpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICBKU0FNUElNQUdFIGRhdGEsCi0JCQkJCSAgICBKRElNRU5TSU9OIG51bV9saW5lcykpOwotCi0vKiBXcml0ZSBhIHNwZWNpYWwgbWFya2VyLiAgU2VlIGxpYmpwZWcuZG9jIGNvbmNlcm5pbmcgc2FmZSB1c2FnZS4gKi8KLUVYVEVSTih2b2lkKSBqcGVnX3dyaXRlX21hcmtlcgotCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGludCBtYXJrZXIsCi0JICAgICBjb25zdCBKT0NURVQgKiBkYXRhcHRyLCB1bnNpZ25lZCBpbnQgZGF0YWxlbikpOwotLyogU2FtZSwgYnV0IHBpZWNlbWVhbC4gKi8KLUVYVEVSTih2b2lkKSBqcGVnX3dyaXRlX21faGVhZGVyCi0JSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlciwgdW5zaWduZWQgaW50IGRhdGFsZW4pKTsKLUVYVEVSTih2b2lkKSBqcGVnX3dyaXRlX21fYnl0ZQotCUpQUCgoal9jb21wcmVzc19wdHIgY2luZm8sIGludCB2YWwpKTsKLQotLyogQWx0ZXJuYXRlIGNvbXByZXNzaW9uIGZ1bmN0aW9uOiBqdXN0IHdyaXRlIGFuIGFiYnJldmlhdGVkIHRhYmxlIGZpbGUgKi8KLUVYVEVSTih2b2lkKSBqcGVnX3dyaXRlX3RhYmxlcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLS8qIERlY29tcHJlc3Npb24gc3RhcnR1cDogcmVhZCBzdGFydCBvZiBKUEVHIGRhdGFzdHJlYW0gdG8gc2VlIHdoYXQncyB0aGVyZSAqLwotRVhURVJOKGludCkganBlZ19yZWFkX2hlYWRlciBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJICBib29sZWFuIHJlcXVpcmVfaW1hZ2UpKTsKLS8qIFJldHVybiB2YWx1ZSBpcyBvbmUgb2Y6ICovCi0jZGVmaW5lIEpQRUdfU1VTUEVOREVECQkwIC8qIFN1c3BlbmRlZCBkdWUgdG8gbGFjayBvZiBpbnB1dCBkYXRhICovCi0jZGVmaW5lIEpQRUdfSEVBREVSX09LCQkxIC8qIEZvdW5kIHZhbGlkIGltYWdlIGRhdGFzdHJlYW0gKi8KLSNkZWZpbmUgSlBFR19IRUFERVJfVEFCTEVTX09OTFkJMiAvKiBGb3VuZCB2YWxpZCB0YWJsZS1zcGVjcy1vbmx5IGRhdGFzdHJlYW0gKi8KLS8qIElmIHlvdSBwYXNzIHJlcXVpcmVfaW1hZ2UgPSBUUlVFIChub3JtYWwgY2FzZSksIHlvdSBuZWVkIG5vdCBjaGVjayBmb3IKLSAqIGEgVEFCTEVTX09OTFkgcmV0dXJuIGNvZGU7IGFuIGFiYnJldmlhdGVkIGZpbGUgd2lsbCBjYXVzZSBhbiBlcnJvciBleGl0LgotICogSlBFR19TVVNQRU5ERUQgaXMgb25seSBwb3NzaWJsZSBpZiB5b3UgdXNlIGEgZGF0YSBzb3VyY2UgbW9kdWxlIHRoYXQgY2FuCi0gKiBnaXZlIGEgc3VzcGVuc2lvbiByZXR1cm4gKHRoZSBzdGRpbyBzb3VyY2UgbW9kdWxlIGRvZXNuJ3QpLgotICovCi0KLS8qIE1haW4gZW50cnkgcG9pbnRzIGZvciBkZWNvbXByZXNzaW9uICovCi1FWFRFUk4oYm9vbGVhbikganBlZ19zdGFydF9kZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotRVhURVJOKEpESU1FTlNJT04pIGpwZWdfcmVhZF9zY2FubGluZXMgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCQkgICAgSlNBTVBBUlJBWSBzY2FubGluZXMsCi0JCQkJCSAgICBKRElNRU5TSU9OIG1heF9saW5lcykpOwotRVhURVJOKGJvb2xlYW4pIGpwZWdfZmluaXNoX2RlY29tcHJlc3MgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci0KLS8qIFJlcGxhY2VzIGpwZWdfcmVhZF9zY2FubGluZXMgd2hlbiByZWFkaW5nIHJhdyBkb3duc2FtcGxlZCBkYXRhLiAqLwotRVhURVJOKEpESU1FTlNJT04pIGpwZWdfcmVhZF9yYXdfZGF0YSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgIEpTQU1QSU1BR0UgZGF0YSwKLQkJCQkJICAgSkRJTUVOU0lPTiBtYXhfbGluZXMpKTsKLQotLyogQWRkaXRpb25hbCBlbnRyeSBwb2ludHMgZm9yIGJ1ZmZlcmVkLWltYWdlIG1vZGUuICovCi1FWFRFUk4oYm9vbGVhbikganBlZ19oYXNfbXVsdGlwbGVfc2NhbnMgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4oYm9vbGVhbikganBlZ19zdGFydF9vdXRwdXQgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLAotCQkJCSAgICAgICBpbnQgc2Nhbl9udW1iZXIpKTsKLUVYVEVSTihib29sZWFuKSBqcGVnX2ZpbmlzaF9vdXRwdXQgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4oYm9vbGVhbikganBlZ19pbnB1dF9jb21wbGV0ZSBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTih2b2lkKSBqcGVnX25ld19jb2xvcm1hcCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLUVYVEVSTihpbnQpIGpwZWdfY29uc3VtZV9pbnB1dCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLS8qIFJldHVybiB2YWx1ZSBpcyBvbmUgb2Y6ICovCi0vKiAjZGVmaW5lIEpQRUdfU1VTUEVOREVECTAgICAgU3VzcGVuZGVkIGR1ZSB0byBsYWNrIG9mIGlucHV0IGRhdGEgKi8KLSNkZWZpbmUgSlBFR19SRUFDSEVEX1NPUwkxIC8qIFJlYWNoZWQgc3RhcnQgb2YgbmV3IHNjYW4gKi8KLSNkZWZpbmUgSlBFR19SRUFDSEVEX0VPSQkyIC8qIFJlYWNoZWQgZW5kIG9mIGltYWdlICovCi0jZGVmaW5lIEpQRUdfUk9XX0NPTVBMRVRFRAkzIC8qIENvbXBsZXRlZCBvbmUgaU1DVSByb3cgKi8KLSNkZWZpbmUgSlBFR19TQ0FOX0NPTVBMRVRFRAk0IC8qIENvbXBsZXRlZCBsYXN0IGlNQ1Ugcm93IG9mIGEgc2NhbiAqLwotCi0vKiBQcmVjYWxjdWxhdGUgb3V0cHV0IGRpbWVuc2lvbnMgZm9yIGN1cnJlbnQgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzLiAqLwotRVhURVJOKHZvaWQpIGpwZWdfY2FsY19vdXRwdXRfZGltZW5zaW9ucyBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8pKTsKLQotLyogQ29udHJvbCBzYXZpbmcgb2YgQ09NIGFuZCBBUFBuIG1hcmtlcnMgaW50byBtYXJrZXJfbGlzdC4gKi8KLUVYVEVSTih2b2lkKSBqcGVnX3NhdmVfbWFya2VycwotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbywgaW50IG1hcmtlcl9jb2RlLAotCSAgICAgdW5zaWduZWQgaW50IGxlbmd0aF9saW1pdCkpOwotCi0vKiBJbnN0YWxsIGEgc3BlY2lhbCBwcm9jZXNzaW5nIG1ldGhvZCBmb3IgQ09NIG9yIEFQUG4gbWFya2Vycy4gKi8KLUVYVEVSTih2b2lkKSBqcGVnX3NldF9tYXJrZXJfcHJvY2Vzc29yCi0JSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBpbnQgbWFya2VyX2NvZGUsCi0JICAgICBqcGVnX21hcmtlcl9wYXJzZXJfbWV0aG9kIHJvdXRpbmUpKTsKLQotLyogUmVhZCBvciB3cml0ZSByYXcgRENUIGNvZWZmaWNpZW50cyAtLS0gdXNlZnVsIGZvciBsb3NzbGVzcyB0cmFuc2NvZGluZy4gKi8KLUVYVEVSTihqdmlydF9iYXJyYXlfcHRyICopIGpwZWdfcmVhZF9jb2VmZmljaWVudHMgSlBQKChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkganBlZ193cml0ZV9jb2VmZmljaWVudHMgSlBQKChqX2NvbXByZXNzX3B0ciBjaW5mbywKLQkJCQkJICBqdmlydF9iYXJyYXlfcHRyICogY29lZl9hcnJheXMpKTsKLUVYVEVSTih2b2lkKSBqcGVnX2NvcHlfY3JpdGljYWxfcGFyYW1ldGVycyBKUFAoKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywKLQkJCQkJCWpfY29tcHJlc3NfcHRyIGRzdGluZm8pKTsKLQotLyogSWYgeW91IGNob29zZSB0byBhYm9ydCBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uIGJlZm9yZSBjb21wbGV0aW5nCi0gKiBqcGVnX2ZpbmlzaF8oZGUpY29tcHJlc3MsIHRoZW4geW91IG5lZWQgdG8gY2xlYW4gdXAgdG8gcmVsZWFzZSBtZW1vcnksCi0gKiB0ZW1wb3JhcnkgZmlsZXMsIGV0Yy4gIFlvdSBjYW4ganVzdCBjYWxsIGpwZWdfZGVzdHJveV8oZGUpY29tcHJlc3MKLSAqIGlmIHlvdSdyZSBkb25lIHdpdGggdGhlIEpQRUcgb2JqZWN0LCBidXQgaWYgeW91IHdhbnQgdG8gY2xlYW4gaXQgdXAgYW5kCi0gKiByZXVzZSBpdCwgY2FsbCB0aGlzOgotICovCi1FWFRFUk4odm9pZCkganBlZ19hYm9ydF9jb21wcmVzcyBKUFAoKGpfY29tcHJlc3NfcHRyIGNpbmZvKSk7Ci1FWFRFUk4odm9pZCkganBlZ19hYm9ydF9kZWNvbXByZXNzIEpQUCgoal9kZWNvbXByZXNzX3B0ciBjaW5mbykpOwotCi0vKiBHZW5lcmljIHZlcnNpb25zIG9mIGpwZWdfYWJvcnQgYW5kIGpwZWdfZGVzdHJveSB0aGF0IHdvcmsgb24gZWl0aGVyCi0gKiBmbGF2b3Igb2YgSlBFRyBvYmplY3QuICBUaGVzZSBtYXkgYmUgbW9yZSBjb252ZW5pZW50IGluIHNvbWUgcGxhY2VzLgotICovCi1FWFRFUk4odm9pZCkganBlZ19hYm9ydCBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOwotRVhURVJOKHZvaWQpIGpwZWdfZGVzdHJveSBKUFAoKGpfY29tbW9uX3B0ciBjaW5mbykpOwotCi0vKiBEZWZhdWx0IHJlc3RhcnQtbWFya2VyLXJlc3luYyBwcm9jZWR1cmUgZm9yIHVzZSBieSBkYXRhIHNvdXJjZSBtb2R1bGVzICovCi1FWFRFUk4oYm9vbGVhbikganBlZ19yZXN5bmNfdG9fcmVzdGFydCBKUFAoKGpfZGVjb21wcmVzc19wdHIgY2luZm8sCi0JCQkJCSAgICBpbnQgZGVzaXJlZCkpOwotCi0KLS8qIFRoZXNlIG1hcmtlciBjb2RlcyBhcmUgZXhwb3J0ZWQgc2luY2UgYXBwbGljYXRpb25zIGFuZCBkYXRhIHNvdXJjZSBtb2R1bGVzCi0gKiBhcmUgbGlrZWx5IHRvIHdhbnQgdG8gdXNlIHRoZW0uCi0gKi8KLQotI2RlZmluZSBKUEVHX1JTVDAJMHhEMAkvKiBSU1QwIG1hcmtlciBjb2RlICovCi0jZGVmaW5lIEpQRUdfRU9JCTB4RDkJLyogRU9JIG1hcmtlciBjb2RlICovCi0jZGVmaW5lIEpQRUdfQVBQMAkweEUwCS8qIEFQUDAgbWFya2VyIGNvZGUgKi8KLSNkZWZpbmUgSlBFR19DT00JMHhGRQkvKiBDT00gbWFya2VyIGNvZGUgKi8KLQotCi0vKiBJZiB3ZSBoYXZlIGEgYnJhaW4tZGFtYWdlZCBjb21waWxlciB0aGF0IGVtaXRzIHdhcm5pbmdzIChvciB3b3JzZSwgZXJyb3JzKQotICogZm9yIHN0cnVjdHVyZSBkZWZpbml0aW9ucyB0aGF0IGFyZSBuZXZlciBmaWxsZWQgaW4sIGtlZXAgaXQgcXVpZXQgYnkKLSAqIHN1cHBseWluZyBkdW1teSBkZWZpbml0aW9ucyBmb3IgdGhlIHZhcmlvdXMgc3Vic3RydWN0dXJlcy4KLSAqLwotCi0jaWZkZWYgSU5DT01QTEVURV9UWVBFU19CUk9LRU4KLSNpZm5kZWYgSlBFR19JTlRFUk5BTFMJCS8qIHdpbGwgYmUgZGVmaW5lZCBpbiBqcGVnaW50LmggKi8KLXN0cnVjdCBqdmlydF9zYXJyYXlfY29udHJvbCB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganZpcnRfYmFycmF5X2NvbnRyb2wgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfY29tcF9tYXN0ZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfY19tYWluX2NvbnRyb2xsZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfY19wcmVwX2NvbnRyb2xsZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfY19jb2VmX2NvbnRyb2xsZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfbWFya2VyX3dyaXRlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19jb2xvcl9jb252ZXJ0ZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfZG93bnNhbXBsZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfZm9yd2FyZF9kY3QgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfZW50cm9weV9lbmNvZGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2RlY29tcF9tYXN0ZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfZF9tYWluX2NvbnRyb2xsZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfZF9jb2VmX2NvbnRyb2xsZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfZF9wb3N0X2NvbnRyb2xsZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfaW5wdXRfY29udHJvbGxlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19tYXJrZXJfcmVhZGVyIHsgbG9uZyBkdW1teTsgfTsKLXN0cnVjdCBqcGVnX2VudHJvcHlfZGVjb2RlciB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ19pbnZlcnNlX2RjdCB7IGxvbmcgZHVtbXk7IH07Ci1zdHJ1Y3QganBlZ191cHNhbXBsZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfY29sb3JfZGVjb252ZXJ0ZXIgeyBsb25nIGR1bW15OyB9Owotc3RydWN0IGpwZWdfY29sb3JfcXVhbnRpemVyIHsgbG9uZyBkdW1teTsgfTsKLSNlbmRpZiAvKiBKUEVHX0lOVEVSTkFMUyAqLwotI2VuZGlmIC8qIElOQ09NUExFVEVfVFlQRVNfQlJPS0VOICovCi0KLQotLyoKLSAqIFRoZSBKUEVHIGxpYnJhcnkgbW9kdWxlcyBkZWZpbmUgSlBFR19JTlRFUk5BTFMgYmVmb3JlIGluY2x1ZGluZyB0aGlzIGZpbGUuCi0gKiBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGRlY2xhcmF0aW9ucyBhcmUgcmVhZCBvbmx5IHdoZW4gdGhhdCBpcyB0cnVlLgotICogQXBwbGljYXRpb25zIHVzaW5nIHRoZSBsaWJyYXJ5IHNob3VsZCBub3QgaW5jbHVkZSBqcGVnaW50LmgsIGJ1dCBtYXkgd2lzaAotICogdG8gaW5jbHVkZSBqZXJyb3IuaC4KLSAqLwotCi0jaWZkZWYgSlBFR19JTlRFUk5BTFMKLSNpbmNsdWRlICJqcGVnaW50LmgiCQkvKiBmZXRjaCBwcml2YXRlIGRlY2xhcmF0aW9ucyAqLwotI2luY2x1ZGUgImplcnJvci5oIgkJLyogZmV0Y2ggZXJyb3IgY29kZXMgdG9vICovCi0jZW5kaWYKLQotI2VuZGlmIC8qIEpQRUdMSUJfSCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy9qdmVyc2lvbi5oIGIvdGhpcmRfcGFydHkvbGlianBlZy9qdmVyc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDcyYzU4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvanZlcnNpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qCi0gKiBqdmVyc2lvbi5oCi0gKgotICogQ29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAncyBzb2Z0d2FyZS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgdGhlIGFjY29tcGFueWluZyBSRUFETUUgZmlsZS4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgc29mdHdhcmUgdmVyc2lvbiBpZGVudGlmaWNhdGlvbi4KLSAqLwotCi0KLSNkZWZpbmUgSlZFUlNJT04JIjZiICAyNy1NYXItMTk5OCIKLQotI2RlZmluZSBKQ09QWVJJR0hUCSJDb3B5cmlnaHQgKEMpIDE5OTgsIFRob21hcyBHLiBMYW5lIgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlianBlZy90cmFuc3VwcC5oIGIvdGhpcmRfcGFydHkvbGlianBlZy90cmFuc3VwcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzJkMzJhLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYmpwZWcvdHJhbnN1cHAuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKgotICogdHJhbnN1cHAuaAotICoKLSAqIENvcHlyaWdodCAoQykgMTk5NywgVGhvbWFzIEcuIExhbmUuCi0gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlLgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSB0aGUgYWNjb21wYW55aW5nIFJFQURNRSBmaWxlLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBkZWNsYXJhdGlvbnMgZm9yIGltYWdlIHRyYW5zZm9ybWF0aW9uIHJvdXRpbmVzIGFuZAotICogb3RoZXIgdXRpbGl0eSBjb2RlIHVzZWQgYnkgdGhlIGpwZWd0cmFuIHNhbXBsZSBhcHBsaWNhdGlvbi4gIFRoZXNlIGFyZQotICogTk9UIHBhcnQgb2YgdGhlIGNvcmUgSlBFRyBsaWJyYXJ5LiAgQnV0IHdlIGtlZXAgdGhlc2Ugcm91dGluZXMgc2VwYXJhdGUKLSAqIGZyb20ganBlZ3RyYW4uYyB0byBlYXNlIHRoZSB0YXNrIG9mIG1haW50YWluaW5nIGpwZWd0cmFuLWxpa2UgcHJvZ3JhbXMKLSAqIHRoYXQgaGF2ZSBvdGhlciB1c2VyIGludGVyZmFjZXMuCi0gKgotICogTk9URTogYWxsIHRoZSByb3V0aW5lcyBkZWNsYXJlZCBoZXJlIGhhdmUgdmVyeSBzcGVjaWZpYyByZXF1aXJlbWVudHMKLSAqIGFib3V0IHdoZW4gdGhleSBhcmUgdG8gYmUgZXhlY3V0ZWQgZHVyaW5nIHRoZSByZWFkaW5nIGFuZCB3cml0aW5nIG9mIHRoZQotICogc291cmNlIGFuZCBkZXN0aW5hdGlvbiBmaWxlcy4gIFNlZSB0aGUgY29tbWVudHMgaW4gdHJhbnN1cHAuYywgb3Igc2VlCi0gKiBqcGVndHJhbi5jIGZvciBhbiBleGFtcGxlIG9mIGNvcnJlY3QgdXNhZ2UuCi0gKi8KLQotLyogSWYgeW91IGhhcHBlbiBub3QgdG8gd2FudCB0aGUgaW1hZ2UgdHJhbnNmb3JtIHN1cHBvcnQsIGRpc2FibGUgaXQgaGVyZSAqLwotI2lmbmRlZiBUUkFOU0ZPUk1TX1NVUFBPUlRFRAotI2RlZmluZSBUUkFOU0ZPUk1TX1NVUFBPUlRFRCAxCQkvKiAwIGRpc2FibGVzIHRyYW5zZm9ybSBjb2RlICovCi0jZW5kaWYKLQotLyogU2hvcnQgZm9ybXMgb2YgZXh0ZXJuYWwgbmFtZXMgZm9yIHN5c3RlbXMgd2l0aCBicmFpbi1kYW1hZ2VkIGxpbmtlcnMuICovCi0KLSNpZmRlZiBORUVEX1NIT1JUX0VYVEVSTkFMX05BTUVTCi0jZGVmaW5lIGp0cmFuc2Zvcm1fcmVxdWVzdF93b3Jrc3BhY2UJCWpUclJlcXVlc3QKLSNkZWZpbmUganRyYW5zZm9ybV9hZGp1c3RfcGFyYW1ldGVycwkJalRyQWRqdXN0Ci0jZGVmaW5lIGp0cmFuc2Zvcm1fZXhlY3V0ZV90cmFuc2Zvcm1hdGlvbglqVHJFeGVjCi0jZGVmaW5lIGpjb3B5X21hcmtlcnNfc2V0dXAJCQlqQ01ya1NldHVwCi0jZGVmaW5lIGpjb3B5X21hcmtlcnNfZXhlY3V0ZQkJCWpDTXJrRXhlYwotI2VuZGlmIC8qIE5FRURfU0hPUlRfRVhURVJOQUxfTkFNRVMgKi8KLQotCi0vKgotICogQ29kZXMgZm9yIHN1cHBvcnRlZCB0eXBlcyBvZiBpbWFnZSB0cmFuc2Zvcm1hdGlvbnMuCi0gKi8KLQotdHlwZWRlZiBlbnVtIHsKLQlKWEZPUk1fTk9ORSwJCS8qIG5vIHRyYW5zZm9ybWF0aW9uICovCi0JSlhGT1JNX0ZMSVBfSCwJCS8qIGhvcml6b250YWwgZmxpcCAqLwotCUpYRk9STV9GTElQX1YsCQkvKiB2ZXJ0aWNhbCBmbGlwICovCi0JSlhGT1JNX1RSQU5TUE9TRSwJLyogdHJhbnNwb3NlIGFjcm9zcyBVTC10by1MUiBheGlzICovCi0JSlhGT1JNX1RSQU5TVkVSU0UsCS8qIHRyYW5zcG9zZSBhY3Jvc3MgVVItdG8tTEwgYXhpcyAqLwotCUpYRk9STV9ST1RfOTAsCQkvKiA5MC1kZWdyZWUgY2xvY2t3aXNlIHJvdGF0aW9uICovCi0JSlhGT1JNX1JPVF8xODAsCQkvKiAxODAtZGVncmVlIHJvdGF0aW9uICovCi0JSlhGT1JNX1JPVF8yNzAJCS8qIDI3MC1kZWdyZWUgY2xvY2t3aXNlIChvciA5MCBjY3cpICovCi19IEpYRk9STV9DT0RFOwotCi0vKgotICogQWx0aG91Z2ggcm90YXRpbmcgYW5kIGZsaXBwaW5nIGRhdGEgZXhwcmVzc2VkIGFzIERDVCBjb2VmZmljaWVudHMgaXMgbm90Ci0gKiBoYXJkLCB0aGVyZSBpcyBhbiBhc3ltbWV0cnkgaW4gdGhlIEpQRUcgZm9ybWF0IHNwZWNpZmljYXRpb24gZm9yIGltYWdlcwotICogd2hvc2UgZGltZW5zaW9ucyBhcmVuJ3QgbXVsdGlwbGVzIG9mIHRoZSBpTUNVIHNpemUuICBUaGUgcmlnaHQgYW5kIGJvdHRvbQotICogaW1hZ2UgZWRnZXMgYXJlIHBhZGRlZCBvdXQgdG8gdGhlIG5leHQgaU1DVSBib3VuZGFyeSB3aXRoIGp1bmsgZGF0YTsgYnV0Ci0gKiBubyBwYWRkaW5nIGlzIHBvc3NpYmxlIGF0IHRoZSB0b3AgYW5kIGxlZnQgZWRnZXMuICBJZiB3ZSB3ZXJlIHRvIGZsaXAKLSAqIHRoZSB3aG9sZSBpbWFnZSBpbmNsdWRpbmcgdGhlIHBhZCBkYXRhLCB0aGVuIHBhZCBnYXJiYWdlIHdvdWxkIGJlY29tZQotICogdmlzaWJsZSBhdCB0aGUgdG9wIGFuZC9vciBsZWZ0LCBhbmQgcmVhbCBwaXhlbHMgd291bGQgZGlzYXBwZWFyIGludG8gdGhlCi0gKiBwYWQgbWFyZ2lucyAtLS0gcGVyaGFwcyBwZXJtYW5lbnRseSwgc2luY2UgZW5jb2RlcnMgJiBkZWNvZGVycyBtYXkgbm90Ci0gKiBib3RoZXIgdG8gcHJlc2VydmUgRENUIGJsb2NrcyB0aGF0IGFwcGVhciB0byBiZSBjb21wbGV0ZWx5IG91dHNpZGUgdGhlCi0gKiBub21pbmFsIGltYWdlIGFyZWEuICBTbywgd2UgaGF2ZSB0byBleGNsdWRlIGFueSBwYXJ0aWFsIGlNQ1VzIGZyb20gdGhlCi0gKiBiYXNpYyB0cmFuc2Zvcm1hdGlvbi4KLSAqCi0gKiBUcmFuc3Bvc2UgaXMgdGhlIG9ubHkgdHJhbnNmb3JtYXRpb24gdGhhdCBjYW4gaGFuZGxlIHBhcnRpYWwgaU1DVXMgYXQgdGhlCi0gKiByaWdodCBhbmQgYm90dG9tIGVkZ2VzIGNvbXBsZXRlbHkgY2xlYW5seS4gIGZsaXBfaCBjYW4gZmxpcCBwYXJ0aWFsIGlNQ1VzCi0gKiBhdCB0aGUgYm90dG9tLCBidXQgbGVhdmVzIGFueSBwYXJ0aWFsIGlNQ1VzIGF0IHRoZSByaWdodCBlZGdlIHVudG91Y2hlZC4KLSAqIFNpbWlsYXJseSBmbGlwX3YgbGVhdmVzIGFueSBwYXJ0aWFsIGlNQ1VzIGF0IHRoZSBib3R0b20gZWRnZSB1bnRvdWNoZWQuCi0gKiBUaGUgb3RoZXIgdHJhbnNmb3JtcyBhcmUgZGVmaW5lZCBhcyBjb21iaW5hdGlvbnMgb2YgdGhlc2UgYmFzaWMgdHJhbnNmb3JtcwotICogYW5kIHByb2Nlc3MgZWRnZSBibG9ja3MgaW4gYSB3YXkgdGhhdCBwcmVzZXJ2ZXMgdGhlIGVxdWl2YWxlbmNlLgotICoKLSAqIFRoZSAidHJpbSIgb3B0aW9uIGNhdXNlcyB1bnRyYW5zZm9ybWFibGUgcGFydGlhbCBpTUNVcyB0byBiZSBkcm9wcGVkOwotICogdGhpcyBpcyBub3Qgc3RyaWN0bHkgbG9zc2xlc3MsIGJ1dCBpdCB1c3VhbGx5IGdpdmVzIHRoZSBiZXN0LWxvb2tpbmcKLSAqIHJlc3VsdCBmb3Igb2RkLXNpemUgaW1hZ2VzLiAgTm90ZSB0aGF0IHdoZW4gdGhpcyBvcHRpb24gaXMgYWN0aXZlLAotICogdGhlIGV4cGVjdGVkIG1hdGhlbWF0aWNhbCBlcXVpdmFsZW5jZXMgYmV0d2VlbiB0aGUgdHJhbnNmb3JtcyBtYXkgbm90IGhvbGQuCi0gKiAoRm9yIGV4YW1wbGUsIC1yb3QgMjcwIC10cmltIHRyaW1zIG9ubHkgdGhlIGJvdHRvbSBlZGdlLCBidXQgLXJvdCA5MCAtdHJpbQotICogZm9sbG93ZWQgYnkgLXJvdCAxODAgLXRyaW0gdHJpbXMgYm90aCBlZGdlcy4pCi0gKgotICogV2UgYWxzbyBvZmZlciBhICJmb3JjZSB0byBncmF5c2NhbGUiIG9wdGlvbiwgd2hpY2ggc2ltcGx5IGRpc2NhcmRzIHRoZQotICogY2hyb21pbmFuY2UgY2hhbm5lbHMgb2YgYSBZQ2JDciBpbWFnZS4gIFRoaXMgaXMgbG9zc2xlc3MgaW4gdGhlIHNlbnNlIHRoYXQKLSAqIHRoZSBsdW1pbmFuY2UgY2hhbm5lbCBpcyBwcmVzZXJ2ZWQgZXhhY3RseS4gIEl0J3Mgbm90IHRoZSBzYW1lIGtpbmQgb2YKLSAqIHRoaW5nIGFzIHRoZSByb3RhdGUvZmxpcCB0cmFuc2Zvcm1hdGlvbnMsIGJ1dCBpdCdzIGNvbnZlbmllbnQgdG8gaGFuZGxlIGl0Ci0gKiBhcyBwYXJ0IG9mIHRoaXMgcGFja2FnZSwgbWFpbmx5IGJlY2F1c2UgdGhlIHRyYW5zZm9ybWF0aW9uIHJvdXRpbmVzIGhhdmUgdG8KLSAqIGJlIGF3YXJlIG9mIHRoZSBvcHRpb24gdG8ga25vdyBob3cgbWFueSBjb21wb25lbnRzIHRvIHdvcmsgb24uCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBPcHRpb25zOiBzZXQgYnkgY2FsbGVyICovCi0gIEpYRk9STV9DT0RFIHRyYW5zZm9ybTsJLyogaW1hZ2UgdHJhbnNmb3JtIG9wZXJhdG9yICovCi0gIGJvb2xlYW4gdHJpbTsJCQkvKiBpZiBUUlVFLCB0cmltIHBhcnRpYWwgTUNVcyBhcyBuZWVkZWQgKi8KLSAgYm9vbGVhbiBmb3JjZV9ncmF5c2NhbGU7CS8qIGlmIFRSVUUsIGNvbnZlcnQgY29sb3IgaW1hZ2UgdG8gZ3JheXNjYWxlICovCi0KLSAgLyogSW50ZXJuYWwgd29ya3NwYWNlOiBjYWxsZXIgc2hvdWxkIG5vdCB0b3VjaCB0aGVzZSAqLwotICBpbnQgbnVtX2NvbXBvbmVudHM7CQkvKiAjIG9mIGNvbXBvbmVudHMgaW4gd29ya3NwYWNlICovCi0gIGp2aXJ0X2JhcnJheV9wdHIgKiB3b3Jrc3BhY2VfY29lZl9hcnJheXM7IC8qIHdvcmtzcGFjZSBmb3IgdHJhbnNmb3JtYXRpb25zICovCi19IGpwZWdfdHJhbnNmb3JtX2luZm87Ci0KLQotI2lmIFRSQU5TRk9STVNfU1VQUE9SVEVECi0KLS8qIFJlcXVlc3QgYW55IHJlcXVpcmVkIHdvcmtzcGFjZSAqLwotRVhURVJOKHZvaWQpIGp0cmFuc2Zvcm1fcmVxdWVzdF93b3Jrc3BhY2UKLQlKUFAoKGpfZGVjb21wcmVzc19wdHIgc3JjaW5mbywganBlZ190cmFuc2Zvcm1faW5mbyAqaW5mbykpOwotLyogQWRqdXN0IG91dHB1dCBpbWFnZSBwYXJhbWV0ZXJzICovCi1FWFRFUk4oanZpcnRfYmFycmF5X3B0ciAqKSBqdHJhbnNmb3JtX2FkanVzdF9wYXJhbWV0ZXJzCi0JSlBQKChqX2RlY29tcHJlc3NfcHRyIHNyY2luZm8sIGpfY29tcHJlc3NfcHRyIGRzdGluZm8sCi0JICAgICBqdmlydF9iYXJyYXlfcHRyICpzcmNfY29lZl9hcnJheXMsCi0JICAgICBqcGVnX3RyYW5zZm9ybV9pbmZvICppbmZvKSk7Ci0vKiBFeGVjdXRlIHRoZSBhY3R1YWwgdHJhbnNmb3JtYXRpb24sIGlmIGFueSAqLwotRVhURVJOKHZvaWQpIGp0cmFuc2Zvcm1fZXhlY3V0ZV90cmFuc2Zvcm1hdGlvbgotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAotCSAgICAganZpcnRfYmFycmF5X3B0ciAqc3JjX2NvZWZfYXJyYXlzLAotCSAgICAganBlZ190cmFuc2Zvcm1faW5mbyAqaW5mbykpOwotCi0jZW5kaWYgLyogVFJBTlNGT1JNU19TVVBQT1JURUQgKi8KLQotCi0vKgotICogU3VwcG9ydCBmb3IgY29weWluZyBvcHRpb25hbCBtYXJrZXJzIGZyb20gc291cmNlIHRvIGRlc3RpbmF0aW9uIGZpbGUuCi0gKi8KLQotdHlwZWRlZiBlbnVtIHsKLQlKQ09QWU9QVF9OT05FLAkJLyogY29weSBubyBvcHRpb25hbCBtYXJrZXJzICovCi0JSkNPUFlPUFRfQ09NTUVOVFMsCS8qIGNvcHkgb25seSBjb21tZW50IChDT00pIG1hcmtlcnMgKi8KLQlKQ09QWU9QVF9BTEwJCS8qIGNvcHkgYWxsIG9wdGlvbmFsIG1hcmtlcnMgKi8KLX0gSkNPUFlfT1BUSU9OOwotCi0jZGVmaW5lIEpDT1BZT1BUX0RFRkFVTFQgIEpDT1BZT1BUX0NPTU1FTlRTCS8qIHJlY29tbWVuZGVkIGRlZmF1bHQgKi8KLQotLyogU2V0dXAgZGVjb21wcmVzc2lvbiBvYmplY3QgdG8gc2F2ZSBkZXNpcmVkIG1hcmtlcnMgaW4gbWVtb3J5ICovCi1FWFRFUk4odm9pZCkgamNvcHlfbWFya2Vyc19zZXR1cAotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBKQ09QWV9PUFRJT04gb3B0aW9uKSk7Ci0vKiBDb3B5IG1hcmtlcnMgc2F2ZWQgaW4gdGhlIGdpdmVuIHNvdXJjZSBvYmplY3QgdG8gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCAqLwotRVhURVJOKHZvaWQpIGpjb3B5X21hcmtlcnNfZXhlY3V0ZQotCUpQUCgoal9kZWNvbXByZXNzX3B0ciBzcmNpbmZvLCBqX2NvbXByZXNzX3B0ciBkc3RpbmZvLAotCSAgICAgSkNPUFlfT1BUSU9OIG9wdGlvbikpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDAwLXVzZS1jb2xvcnNwYWNlLnBhdGNoIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDAwLXVzZS1jb2xvcnNwYWNlLnBhdGNoCmluZGV4IGI0MDY5MmMuLjRkODllZmYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAwMC11c2UtY29sb3JzcGFjZS5wYXRjaAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMDAtdXNlLWNvbG9yc3BhY2UucGF0Y2gKQEAgLTEsMjcgKzEsMjggQEAKIGRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2pwMi5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYwotaW5kZXggOGJmNjBmNi4uNDdmODNhMSAxMDA2NDQKK2luZGV4IGYzY2NiOTk3NC4uODgyZjFiNjQ5IDEwMDY0NAogLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYwogKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYwotQEAgLTE1MDgsNyArMTUwOCw3IEBAIE9QSl9CT09MIG9wal9qcDJfZGVjb2RlKG9wal9qcDJfdCAqanAyLAotIAkJCS8qIFBhcnQgMSwgSS41LjMuNDogRWl0aGVyIGJvdGggb3Igbm9uZSA6ICovCi0gCQkJaWYoICFqcDItPmNvbG9yLmpwMl9wY2xyLT5jbWFwKQotIAkJCQlvcGpfanAyX2ZyZWVfcGNscigmKGpwMi0+Y29sb3IpKTsKLS0JCQllbHNlCi0rCQkJZWxzZSBpZiAocF9pbWFnZS0+cGRmaXVtX3VzZV9jb2xvcnNwYWNlKQotIAkJCQlvcGpfanAyX2FwcGx5X3BjbHIocF9pbWFnZSwgJihqcDItPmNvbG9yKSk7Ci0gCQl9Ci0gCitAQCAtMTYyNCw3ICsxNjI0LDcgQEAgT1BKX0JPT0wgb3BqX2pwMl9kZWNvZGUob3BqX2pwMl90ICpqcDIsCisgICAgICAgICAgICAgLyogUGFydCAxLCBJLjUuMy40OiBFaXRoZXIgYm90aCBvciBub25lIDogKi8KKyAgICAgICAgICAgICBpZiAoIWpwMi0+Y29sb3IuanAyX3BjbHItPmNtYXApIHsKKyAgICAgICAgICAgICAgICAgb3BqX2pwMl9mcmVlX3BjbHIoJihqcDItPmNvbG9yKSk7CistICAgICAgICAgICAgfSBlbHNlIHsKKysgICAgICAgICAgICB9IGVsc2UgaWYgKHBfaW1hZ2UtPnBkZml1bV91c2VfY29sb3JzcGFjZSkgeworICAgICAgICAgICAgICAgICBpZiAoIW9wal9qcDJfYXBwbHlfcGNscihwX2ltYWdlLCAmKGpwMi0+Y29sb3IpLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICB9CiBkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGVuanBlZy5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGVuanBlZy5oCi1pbmRleCBjMDdlOWM4Li5lNTcxNjcyIDEwMDY0NAoraW5kZXggZDU3MWM1MTZlLi5lOGRiZTRmZjcgMTAwNjQ0CiAtLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wZW5qcGVnLmgKICsrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BlbmpwZWcuaAotQEAgLTY3Nyw2ICs2NzcsOSBAQCB0eXBlZGVmIHN0cnVjdCBvcGpfaW1hZ2UgewotIAlPUEpfQllURSAqaWNjX3Byb2ZpbGVfYnVmOwotIAkvKiogc2l6ZSBvZiBJQ0MgcHJvZmlsZSAqLwotIAlPUEpfVUlOVDMyIGljY19wcm9maWxlX2xlbjsKK0BAIC02ODIsNiArNjgyLDEwIEBAIHR5cGVkZWYgc3RydWN0IG9wal9pbWFnZSB7CisgICAgIE9QSl9CWVRFICppY2NfcHJvZmlsZV9idWY7CisgICAgIC8qKiBzaXplIG9mIElDQyBwcm9maWxlICovCisgICAgIE9QSl9VSU5UMzIgaWNjX3Byb2ZpbGVfbGVuOwogKwotKwkvKiogV2hldGhlciB0byBhcHBseSBQQ0xSIG9yIG5vdCAqLwotKwlPUEpfQk9PTCBwZGZpdW1fdXNlX2NvbG9yc3BhY2U7CisrCisrICAgIC8qKiBXaGV0aGVyIHRvIGFwcGx5IFBDTFIgb3Igbm90ICovCisrICAgIE9QSl9CT09MIHBkZml1bV91c2VfY29sb3JzcGFjZTsKICB9IG9wal9pbWFnZV90OwogIAogIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDAxLWltYWdlLWRhdGEucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMDEtaW1hZ2UtZGF0YS5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFlMDE0OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMDEtaW1hZ2UtZGF0YS5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2oyay5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYwotaW5kZXggZTYxMmQwNi4uZDUxNTc5OCAxMDA2NDQKLS0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmMKLSsrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmMKLUBAIC04MTQ4LDExICs4MTQ4LDE2IEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3VwZGF0ZV9pbWFnZV9kYXRhIChvcGpfdGNkX3QgKiBwX3RjZCwgT1BKX0JZVEUgKiBwX2RhdGEsCi0gCi0gICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIG91dHB1dCBjb21wb25lbnQgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLwotICAgICAgICAgICAgICAgICBpZiAoIWxfaW1nX2NvbXBfZGVzdC0+ZGF0YSkgewotLQotLSAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1nX2NvbXBfZGVzdC0+ZGF0YSA9IChPUEpfSU5UMzIqKSBvcGpfY2FsbG9jKChPUEpfU0laRV9UKWxfaW1nX2NvbXBfZGVzdC0+dyAqIChPUEpfU0laRV9UKWxfaW1nX2NvbXBfZGVzdC0+aCwgc2l6ZW9mKE9QSl9JTlQzMikpOwotLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIGxfaW1nX2NvbXBfZGVzdC0+ZGF0YSkgewotLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLS0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0rICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHdpZHRoID0gbF9pbWdfY29tcF9kZXN0LT53OwotKyAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBoZWlnaHQgPSBsX2ltZ19jb21wX2Rlc3QtPmg7Ci0rICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfVUlOVDMyIE1BWF9TSVpFID0gVUlOVDMyX01BWCAvIHNpemVvZihPUEpfSU5UMzIpOwotKyAgICAgICAgICAgICAgICAgICAgaWYgKGhlaWdodCA9PSAwIHx8IHdpZHRoID4gTUFYX1NJWkUgLyBoZWlnaHQpIHsKLSsgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotKyAgICAgICAgICAgICAgICAgICAgfQotKyAgICAgICAgICAgICAgICAgICAgbF9pbWdfY29tcF9kZXN0LT5kYXRhID0gKE9QSl9JTlQzMiopb3BqX2NhbGxvYyh3aWR0aCAqIGhlaWdodCwgc2l6ZW9mKE9QSl9JTlQzMikpOwotKyAgICAgICAgICAgICAgICAgICAgaWYgKCFsX2ltZ19jb21wX2Rlc3QtPmRhdGEpIHsKLSsgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotKyAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICB9Ci0gCi0gICAgICAgICAgICAgICAgIC8qIENvcHkgaW5mbyBmcm9tIGRlY29kZWQgY29tcCBpbWFnZSB0byBvdXRwdXQgaW1hZ2UgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAwMi1wYWNrZXQtaXRlcmF0b3IucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMDItcGFja2V0LWl0ZXJhdG9yLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzc1NWVkLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAwMi1wYWNrZXQtaXRlcmF0b3IucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1kaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9waS5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9waS5jCi1pbmRleCAxNjk3YmNiLi4wNmYxZTQxIDEwMDY0NAotLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9waS5jCi0rKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3BpLmMKLUBAIC0zNiw2ICszNiw3IEBACi0gICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gICovCi0gCi0rI2luY2x1ZGUgPGxpbWl0cy5oPgotICNpbmNsdWRlICJvcGpfaW5jbHVkZXMuaCIKLSAKLSAvKiogQGRlZmdyb3VwIFBJIFBJIC0gSW1wbGVtZW50YXRpb24gb2YgYSBwYWNrZXQgaXRlcmF0b3IgKi8KLUBAIC0xMjM2LDcgKzEyMzcsMTMgQEAgb3BqX3BpX2l0ZXJhdG9yX3QgKm9wal9waV9jcmVhdGVfZGVjb2RlKG9wal9pbWFnZV90ICpwX2ltYWdlLAotIAlsX2N1cnJlbnRfcGkgPSBsX3BpOwotIAotIAkvKiBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgaW5jbHVkZSAqLwotLQlsX2N1cnJlbnRfcGktPmluY2x1ZGUgPSAoT1BKX0lOVDE2Kikgb3BqX2NhbGxvYygobF90Y3AtPm51bWxheWVycyArMSkgKiBsX3N0ZXBfbCwgc2l6ZW9mKE9QSl9JTlQxNikpOwotKwlsX2N1cnJlbnRfcGktPmluY2x1ZGUgPSAwMDsKLSsJaWYKLSsJCShsX3N0ZXBfbCAmJiBsX3RjcC0+bnVtbGF5ZXJzIDwgVUlOVF9NQVggLyBsX3N0ZXBfbCAtIDEpCi0rCXsKLSsJCWxfY3VycmVudF9waS0+aW5jbHVkZSA9IChPUEpfSU5UMTYqKW9wal9jYWxsb2MoKGxfdGNwLT5udW1sYXllcnMgKyAxKSAqIGxfc3RlcF9sLCBzaXplb2YoT1BKX0lOVDE2KSk7Ci0rCX0KLSsKLSAJaWYKLSAJCSghbF9jdXJyZW50X3BpLT5pbmNsdWRlKQotIAl7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMDMtZHd0LWRlY29kZS5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAwMy1kd3QtZGVjb2RlLnBhdGNoCmluZGV4IGM1MDBmMGMuLjYzMTIxOWEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAwMy1kd3QtZGVjb2RlLnBhdGNoCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAwMy1kd3QtZGVjb2RlLnBhdGNoCkBAIC0xLDU4ICsxLDYyIEBACiBkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9kd3QuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvZHd0LmMKLWluZGV4IDRhZDk5ZWQuLjk3NWE5N2UgMTAwNjQ0CitpbmRleCA4M2MxNDgwMDIuLjE0NTVlZTg0YSAxMDA2NDQKIC0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvZHd0LmMKICsrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvZHd0LmMKLUBAIC00NiwxNCArNDYsMTIgQEAKK0BAIC02Miw4ICs2Miw2IEBACisgCiAgLyoqIEBkZWZncm91cCBEV1QgRFdUIC0gSW1wbGVtZW50YXRpb24gb2YgYSBkaXNjcmV0ZSB3YXZlbGV0IHRyYW5zZm9ybSAqLwogIC8qQHsqLwotIAogLSNkZWZpbmUgT1BKX1dTKGkpIHYtPm1lbVsoaSkqMl0KIC0jZGVmaW5lIE9QSl9XRChpKSB2LT5tZW1bKDErKGkpKjIpXQotLQotIC8qKiBAbmFtZSBMb2NhbCBkYXRhIHN0cnVjdHVyZXMgKi8KLSAvKkB7Ki8KKyAKKyAjaWZkZWYgX19BVlgyX18KKyAvKiogTnVtYmVyIG9mIGludDMyIHZhbHVlcyBpbiBhIEFWWDIgcmVnaXN0ZXIgKi8KK0BAIC04MSw2ICs3OSw3IEBACiAgCiAgdHlwZWRlZiBzdHJ1Y3QgZHd0X2xvY2FsIHsKLSAJT1BKX0lOVDMyKiBtZW07Ci0rCU9QSl9TSVpFX1QgbWVtX2NvdW50OwotIAlPUEpfSU5UMzIgZG47Ci0gCU9QSl9JTlQzMiBzbjsKLSAJT1BKX0lOVDMyIGNhczsKLUBAIC0xMDcsMTYgKzEwNSwxNiBAQCBzdGF0aWMgdm9pZCBvcGpfZHd0X2ludGVybGVhdmVfdihvcGpfZHd0X3QqIHYsIE9QSl9JTlQzMiAqYSwgT1BKX0lOVDMyIHgpOworICAgICBPUEpfSU5UMzIqIG1lbTsKKysgICAgT1BKX1NJWkVfVCBtZW1fY291bnQ7CisgICAgIE9QSl9JTlQzMiBkbjsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gaGlnaCBwYXNzIGJhbmQgKi8KKyAgICAgT1BKX0lOVDMyIHNuOyAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBsb3cgcGFzcyBiYW5kICovCisgICAgIE9QSl9JTlQzMiBjYXM7ICAvKiAwID0gc3RhcnQgb24gZXZlbiBjb29yZCwgMSA9IHN0YXJ0IG9uIG9kZCBjb29yZCAqLworQEAgLTEzMiwxMyArMTMxLDE0IEBAIHN0YXRpYyB2b2lkIG9wal9kd3RfZGVpbnRlcmxlYXZlX3YoT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgKmIsIE9QSl9JTlQzMiBkbiwKICAvKioKICBGb3J3YXJkIDUtMyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAxLUQKICAqLwotLXN0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlXzEoT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwgT1BKX0lOVDMyIGNhcyk7Ci0rc3RhdGljIHZvaWQgb3BqX2R3dF9lbmNvZGVfMShPUEpfSU5UMzIgKmEsIE9QSl9TSVpFX1QgYV9jb3VudCwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpOwotIC8qKgotIEludmVyc2UgNS0zIHdhdmVsZXQgdHJhbnNmb3JtIGluIDEtRAotICovCi0gc3RhdGljIHZvaWQgb3BqX2R3dF9kZWNvZGVfMShvcGpfZHd0X3QgKnYpOwotLXN0YXRpYyB2b2lkIG9wal9kd3RfZGVjb2RlXzFfKE9QSl9JTlQzMiAqYSwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpOwotK3N0YXRpYyB2b2lkIG9wal9kd3RfZGVjb2RlXzFfKE9QSl9JTlQzMiAqYSwgT1BKX1NJWkVfVCBhX2NvdW50LCBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwgT1BKX0lOVDMyIGNhcyk7Cistc3RhdGljIHZvaWQgb3BqX2R3dF9lbmNvZGVfMShPUEpfSU5UMzIgKmEsIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLAorLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIGNhcyk7Cisrc3RhdGljIHZvaWQgb3BqX2R3dF9lbmNvZGVfMShPUEpfSU5UMzIgKmEsIE9QSl9TSVpFX1QgYV9jb3VudCwgT1BKX0lOVDMyIGRuLAorKyAgICBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpOwogIC8qKgogIEZvcndhcmQgOS03IHdhdmVsZXQgdHJhbnNmb3JtIGluIDEtRAogICovCi0tc3RhdGljIHZvaWQgb3BqX2R3dF9lbmNvZGVfMV9yZWFsKE9QSl9JTlQzMiAqYSwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpOwotK3N0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlXzFfcmVhbChPUEpfSU5UMzIgKmEsIE9QSl9TSVpFX1QgYV9jb3VudCwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpOworLXN0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlXzFfcmVhbChPUEpfSU5UMzIgKmEsIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLAorLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgY2FzKTsKKytzdGF0aWMgdm9pZCBvcGpfZHd0X2VuY29kZV8xX3JlYWwoT1BKX0lOVDMyICphLCBPUEpfU0laRV9UIGFfY291bnQsCisrICAgIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLCBPUEpfSU5UMzIgY2FzKTsKKysKKyAKICAvKioKLSBFeHBsaWNpdCBjYWxjdWxhdGlvbiBvZiB0aGUgUXVhbnRpemF0aW9uIFN0ZXBzaXplcyAKLSAqLwotQEAgLTEyNCwxMCArMTIyLDEwIEBAIHN0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlX3N0ZXBzaXplKE9QSl9JTlQzMiBzdGVwc2l6ZSwgT1BKX0lOVDMyIG51bWJwcywgb3BqX3N0Ci0gLyoqCisgRXhwbGljaXQgY2FsY3VsYXRpb24gb2YgdGhlIFF1YW50aXphdGlvbiBTdGVwc2l6ZXMKK0BAIC0xNDksMTQgKzE0OSwxNCBAQCBzdGF0aWMgdm9pZCBvcGpfZHd0X2VuY29kZV9zdGVwc2l6ZShPUEpfSU5UMzIgc3RlcHNpemUsIE9QSl9JTlQzMiBudW1icHMsCiAgSW52ZXJzZSB3YXZlbGV0IHRyYW5zZm9ybSBpbiAyLUQuCiAgKi8KLS1zdGF0aWMgT1BKX0JPT0wgb3BqX2R3dF9kZWNvZGVfdGlsZShvcGpfdGNkX3RpbGVjb21wX3QqIHRpbGVjLCBPUEpfVUlOVDMyIGksIERXVDFERk4gZm4pOwotK3N0YXRpYyBPUEpfQk9PTCBvcGpfZHd0X2RlY29kZV90aWxlKGNvbnN0IG9wal90Y2RfdGlsZWNvbXBfdCogdGlsZWMsIE9QSl9VSU5UMzIgaSwgRFdUMURGTiBmbik7Cisgc3RhdGljIE9QSl9CT09MIG9wal9kd3RfZGVjb2RlX3RpbGUob3BqX3RocmVhZF9wb29sX3QqIHRwLAorLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCogdGlsZWMsIE9QSl9VSU5UMzIgaSk7CisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BqX3RjZF90aWxlY29tcF90KiB0aWxlYywgT1BKX1VJTlQzMiBpKTsKICAKLS1zdGF0aWMgT1BKX0JPT0wgb3BqX2R3dF9lbmNvZGVfcHJvY2VkdXJlKAlvcGpfdGNkX3RpbGVjb21wX3QgKiB0aWxlYywKLS0JCQkJCQkJCQkJICAgIHZvaWQgKCpwX2Z1bmN0aW9uKShPUEpfSU5UMzIgKiwgT1BKX0lOVDMyLE9QSl9JTlQzMixPUEpfSU5UMzIpICk7Cisgc3RhdGljIE9QSl9CT09MIG9wal9kd3RfZGVjb2RlX3BhcnRpYWxfdGlsZSgKKyAgICAgb3BqX3RjZF90aWxlY29tcF90KiB0aWxlYywKKyAgICAgT1BKX1VJTlQzMiBudW1yZXMpOworIAorLXN0YXRpYyBPUEpfQk9PTCBvcGpfZHd0X2VuY29kZV9wcm9jZWR1cmUob3BqX3RjZF90aWxlY29tcF90ICogdGlsZWMsCistICAgICAgICB2b2lkICgqcF9mdW5jdGlvbikoT1BKX0lOVDMyICosIE9QSl9JTlQzMiwgT1BKX0lOVDMyLCBPUEpfSU5UMzIpKTsKICtzdGF0aWMgT1BKX0JPT0wgb3BqX2R3dF9lbmNvZGVfcHJvY2VkdXJlKGNvbnN0IG9wal90Y2RfdGlsZWNvbXBfdCAqIHRpbGVjLAotKwkJCQkJCQkJCQkgICAgdm9pZCgqcF9mdW5jdGlvbikoT1BKX0lOVDMyICosIE9QSl9TSVpFX1QsIE9QSl9JTlQzMiwgT1BKX0lOVDMyLCBPUEpfSU5UMzIpKTsKKysgICAgICAgIHZvaWQoKnBfZnVuY3Rpb24pKE9QSl9JTlQzMiAqLCBPUEpfU0laRV9ULCBPUEpfSU5UMzIsIE9QSl9JTlQzMiwgT1BKX0lOVDMyKSk7CiAgCi0gc3RhdGljIE9QSl9VSU5UMzIgb3BqX2R3dF9tYXhfcmVzb2x1dGlvbihvcGpfdGNkX3Jlc29sdXRpb25fdCogcmVzdHJpY3QgciwgT1BKX1VJTlQzMiBpKTsKLSAKLUBAIC0xNTYsMTMgKzE1NCwyMCBAQCBzdGF0aWMgdm9pZCBvcGpfdjRkd3RfZGVjb2RlX3N0ZXAyKG9wal92NF90KiBsLCBvcGpfdjRfdCogdywgT1BKX0lOVDMyIGssIE9QSl9JTgorIHN0YXRpYyBPUEpfVUlOVDMyIG9wal9kd3RfbWF4X3Jlc29sdXRpb24ob3BqX3RjZF9yZXNvbHV0aW9uX3QqIE9QSl9SRVNUUklDVCByLAorICAgICAgICAgT1BKX1VJTlQzMiBpKTsKK0BAIC0yMDUsMTMgKzIwNSwyMCBAQCBzdGF0aWMgdm9pZCBvcGpfdjRkd3RfZGVjb2RlX3N0ZXAyKG9wal92NF90KiBsLCBvcGpfdjRfdCogdywKICAKICAvKkB9Ki8KICAKQEAgLTYwLDkgKzY0LDYgQEAKIC0jZGVmaW5lIE9QSl9EKGkpIGFbKDErKGkpKjIpXQogLSNkZWZpbmUgT1BKX1NfKGkpICgoaSk8MD9PUEpfUygwKTooKGkpPj1zbj9PUEpfUyhzbi0xKTpPUEpfUyhpKSkpCiAtI2RlZmluZSBPUEpfRF8oaSkgKChpKTwwP09QSl9EKDApOigoaSk+PWRuP09QSl9EKGRuLTEpOk9QSl9EKGkpKSkKLS0vKiBuZXcgKi8KLS0jZGVmaW5lIE9QSl9TU18oaSkgKChpKTwwP09QSl9TKDApOigoaSk+PWRuP09QSl9TKGRuLTEpOk9QSl9TKGkpKSkKLS0jZGVmaW5lIE9QSl9ERF8oaSkgKChpKTwwP09QSl9EKDApOigoaSk+PXNuP09QSl9EKHNuLTEpOk9QSl9EKGkpKSkKICsjZGVmaW5lIElEWF9TKGkpIChpKSoyCiArI2RlZmluZSBJRFhfRChpKSAxICsgKGkpKiAyCiArI2RlZmluZSBVTkRFUkZMT1dfU04oaSkgKChpKSA+PSBzbiYmc24+MCkKQEAgLTc0LDExOCArNzUsMTkwIEBACiArI2RlZmluZSBPUEpfRChpKSBhW0lEWF9EKGkpXQogKyNkZWZpbmUgT1BKX1NfKGkpICgoaSk8MCA/IE9QSl9TKDApIDogKFVOREVSRkxPV19TTihpKSA/IE9QSl9TKHNuIC0gMSkgOiBPVkVSRkxPV19TKGkpID8gT1BKX1MoaSAtIDEpIDogT1BKX1MoaSkpKQogKyNkZWZpbmUgT1BKX0RfKGkpICgoaSk8MCA/IE9QSl9EKDApIDogKFVOREVSRkxPV19ETihpKSA/IE9QSl9EKGRuIC0gMSkgOiBPVkVSRkxPV19EKGkpID8gT1BKX0QoaSAtIDEpIDogT1BKX0QoaSkpKQotKy8qIG5ldyAqLworIC8qIG5ldyAqLworLSNkZWZpbmUgT1BKX1NTXyhpKSAoKGkpPDA/T1BKX1MoMCk6KChpKT49ZG4/T1BKX1MoZG4tMSk6T1BKX1MoaSkpKQorLSNkZWZpbmUgT1BKX0REXyhpKSAoKGkpPDA/T1BKX0QoMCk6KChpKT49c24/T1BKX0Qoc24tMSk6T1BKX0QoaSkpKQogKyNkZWZpbmUgT1BKX1NTXyhpKSAoKGkpPDAgPyBPUEpfUygwKSA6IChVTkRFUkZMT1dfRE4oaSkgPyBPUEpfUyhkbiAtIDEpIDogT1ZFUkZMT1dfUyhpKSA/IE9QSl9TKGkgLSAxKSA6IE9QSl9TKGkpKSkKICsjZGVmaW5lIE9QSl9ERF8oaSkgKChpKTwwID8gT1BKX0QoMCkgOiAoVU5ERVJGTE9XX1NOKGkpID8gT1BKX0Qoc24gLSAxKSA6IE9WRVJGTE9XX0QoaSkgPyBPUEpfRChpIC0gMSkgOiBPUEpfRChpKSkpCiAgCiAgLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIG5vcm1zIG9mIHRoZSA1LTMgd2F2ZWxldHMgZm9yIGRpZmZlcmVudCBiYW5kcy4gKi8KLUBAIC0yODMsNyArMjg4LDcgQEAgc3RhdGljIHZvaWQgb3BqX2R3dF9pbnRlcmxlYXZlX3Yob3BqX2R3dF90KiB2LCBPUEpfSU5UMzIgKmEsIE9QSl9JTlQzMiB4KSB7CitAQCAtMzQ0LDggKzM1MSw4IEBAIHN0YXRpYyB2b2lkIG9wal9kd3RfaW50ZXJsZWF2ZV92KGNvbnN0IG9wal9kd3RfdCogdiwgT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgeCkKICAvKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBGb3J3YXJkIDUtMyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAxLUQuICovCiAgLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0tc3RhdGljIHZvaWQgb3BqX2R3dF9lbmNvZGVfMShPUEpfSU5UMzIgKmEsIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLCBPUEpfSU5UMzIgY2FzKSB7Ci0rc3RhdGljIHZvaWQgb3BqX2R3dF9lbmNvZGVfMShPUEpfSU5UMzIgKmEsIE9QSl9TSVpFX1QgYV9jb3VudCwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpIHsKLSAJT1BKX0lOVDMyIGk7Ci0gCQotIAlpZiAoIWNhcykgewotQEAgLTMwNCw3ICszMDksNyBAQCBzdGF0aWMgdm9pZCBvcGpfZHd0X2VuY29kZV8xKE9QSl9JTlQzMiAqYSwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMgorLXN0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlXzEoT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwKKy0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBjYXMpCisrc3RhdGljIHZvaWQgb3BqX2R3dF9lbmNvZGVfMShPUEpfSU5UMzIgKmEsIE9QSl9TSVpFX1QgYV9jb3VudCwgT1BKX0lOVDMyIGRuLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHNuLCBPUEpfSU5UMzIgY2FzKQorIHsKKyAgICAgT1BKX0lOVDMyIGk7CisgCitAQCAtMzc2LDggKzM4Myw4IEBAIHN0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlXzEoT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwKICAvKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBJbnZlcnNlIDUtMyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAxLUQuICovCi0gLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICovIAotLXN0YXRpYyB2b2lkIG9wal9kd3RfZGVjb2RlXzFfKE9QSl9JTlQzMiAqYSwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpIHsKLStzdGF0aWMgdm9pZCBvcGpfZHd0X2RlY29kZV8xXyhPUEpfSU5UMzIgKmEsIE9QSl9TSVpFX1QgYV9jb3VudCwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpIHsKLSAJT1BKX0lOVDMyIGk7Ci0gCQotIAlpZiAoIWNhcykgewotQEAgLTMyNiwxMyArMzMxLDEzIEBAIHN0YXRpYyB2b2lkIG9wal9kd3RfZGVjb2RlXzFfKE9QSl9JTlQzMiAqYSwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzCi0gLyogSW52ZXJzZSA1LTMgd2F2ZWxldCB0cmFuc2Zvcm0gaW4gMS1ELiAqLwotIC8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAKLSBzdGF0aWMgdm9pZCBvcGpfZHd0X2RlY29kZV8xKG9wal9kd3RfdCAqdikgewotLQlvcGpfZHd0X2RlY29kZV8xXyh2LT5tZW0sIHYtPmRuLCB2LT5zbiwgdi0+Y2FzKTsKLSsJb3BqX2R3dF9kZWNvZGVfMV8odi0+bWVtLCB2LT5tZW1fY291bnQsIHYtPmRuLCB2LT5zbiwgdi0+Y2FzKTsKKyAvKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy1zdGF0aWMgdm9pZCBvcGpfZHd0X2RlY29kZV8xXyhPUEpfSU5UMzIgKmEsIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLAorLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBjYXMpCisrc3RhdGljIHZvaWQgb3BqX2R3dF9kZWNvZGVfMV8oT1BKX0lOVDMyICphLCBPUEpfU0laRV9UIGFfY291bnQsIE9QSl9JTlQzMiBkbiwKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpCisgeworICAgICBPUEpfSU5UMzIgaTsKKyAKK0BAIC00MDYsNyArNDEzLDcgQEAgc3RhdGljIHZvaWQgb3BqX2R3dF9kZWNvZGVfMV8oT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwKKyAKKyBzdGF0aWMgdm9pZCBvcGpfZHd0X2RlY29kZV8xKGNvbnN0IG9wal9kd3RfdCAqdikKKyB7CistICAgIG9wal9kd3RfZGVjb2RlXzFfKHYtPm1lbSwgdi0+ZG4sIHYtPnNuLCB2LT5jYXMpOworKyAgICBvcGpfZHd0X2RlY29kZV8xXyh2LT5tZW0sIHYtPm1lbV9jb3VudCwgdi0+ZG4sIHYtPnNuLCB2LT5jYXMpOwogIH0KICAKKyAjZW5kaWYgLyogU1RBTkRBUkRfU0xPV19WRVJTSU9OICovCitAQCAtMTAzNyw4ICsxMDQ0LDggQEAgc3RhdGljIHZvaWQgb3BqX2lkd3Q1M192KGNvbnN0IG9wal9kd3RfdCAqZHd0LAogIC8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBGb3J3YXJkIDktNyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAxLUQuICovCiAgLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLXN0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlXzFfcmVhbChPUEpfSU5UMzIgKmEsIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLCBPUEpfSU5UMzIgY2FzKSB7Ci0rc3RhdGljIHZvaWQgb3BqX2R3dF9lbmNvZGVfMV9yZWFsKE9QSl9JTlQzMiAqYSwgT1BKX1NJWkVfVCBhX2NvdW50LCBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwgT1BKX0lOVDMyIGNhcykgewotIAlPUEpfSU5UMzIgaTsKLSAJaWYgKCFjYXMpIHsKLSAJCWlmICgoZG4gPiAwKSB8fCAoc24gPiAxKSkgewkvKiBORVcgOiAgQ0FTRSBPTkUgRUxFTUVOVCAqLwotQEAgLTM4NSw3ICszOTAsNyBAQCBzdGF0aWMgdm9pZCBvcGpfZHd0X2VuY29kZV9zdGVwc2l6ZShPUEpfSU5UMzIgc3RlcHNpemUsIE9QSl9JTlQzMiBudW1icHMsIG9wal9zdAorLXN0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlXzFfcmVhbChPUEpfSU5UMzIgKmEsIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLAorLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgY2FzKQorK3N0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlXzFfcmVhbChPUEpfSU5UMzIgKmEsIE9QSl9TSVpFX1QgYV9jb3VudCwKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpCisgeworICAgICBPUEpfSU5UMzIgaTsKKyAgICAgaWYgKCFjYXMpIHsKK0BAIC0xMTA2LDggKzExMTMsOCBAQCBzdGF0aWMgdm9pZCBvcGpfZHd0X2VuY29kZV9zdGVwc2l6ZShPUEpfSU5UMzIgc3RlcHNpemUsIE9QSl9JTlQzMiBudW1icHMsCiAgLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogRm9yd2FyZCA1LTMgd2F2ZWxldCB0cmFuc2Zvcm0gaW4gMi1ELiAqLwogIC8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLXN0YXRpYyBJTkxJTkUgT1BKX0JPT0wgb3BqX2R3dF9lbmNvZGVfcHJvY2VkdXJlKG9wal90Y2RfdGlsZWNvbXBfdCAqIHRpbGVjLHZvaWQgKCpwX2Z1bmN0aW9uKShPUEpfSU5UMzIgKiwgT1BKX0lOVDMyLE9QSl9JTlQzMixPUEpfSU5UMzIpICkKLStzdGF0aWMgSU5MSU5FIE9QSl9CT09MIG9wal9kd3RfZW5jb2RlX3Byb2NlZHVyZShjb25zdCBvcGpfdGNkX3RpbGVjb21wX3QgKiB0aWxlYywgdm9pZCgqcF9mdW5jdGlvbikoT1BKX0lOVDMyICosIE9QSl9TSVpFX1QsIE9QSl9JTlQzMiwgT1BKX0lOVDMyLCBPUEpfSU5UMzIpKQorLXN0YXRpYyBJTkxJTkUgT1BKX0JPT0wgb3BqX2R3dF9lbmNvZGVfcHJvY2VkdXJlKG9wal90Y2RfdGlsZWNvbXBfdCAqIHRpbGVjLAorLSAgICAgICAgdm9pZCAoKnBfZnVuY3Rpb24pKE9QSl9JTlQzMiAqLCBPUEpfSU5UMzIsIE9QSl9JTlQzMiwgT1BKX0lOVDMyKSkKKytzdGF0aWMgSU5MSU5FIE9QSl9CT09MIG9wal9kd3RfZW5jb2RlX3Byb2NlZHVyZShjb25zdCBvcGpfdGNkX3RpbGVjb21wX3QgKiB0aWxlYywKKysgICAgICAgIHZvaWQoKnBfZnVuY3Rpb24pKE9QSl9JTlQzMiAqLCBPUEpfU0laRV9ULCBPUEpfSU5UMzIsIE9QSl9JTlQzMiwgT1BKX0lOVDMyKSkKICB7Ci0gCU9QSl9JTlQzMiBpLCBqLCBrOwotIAlPUEpfSU5UMzIgKmEgPSAwMDsKLUBAIC0zOTUsNyArNDAwLDggQEAgc3RhdGljIElOTElORSBPUEpfQk9PTCBvcGpfZHd0X2VuY29kZV9wcm9jZWR1cmUob3BqX3RjZF90aWxlY29tcF90ICogdGlsZWMsdm9pZAorICAgICBPUEpfSU5UMzIgaSwgaiwgazsKKyAgICAgT1BKX0lOVDMyICphID0gMDA7CitAQCAtMTExNyw2ICsxMTI0LDcgQEAgc3RhdGljIElOTElORSBPUEpfQk9PTCBvcGpfZHd0X2VuY29kZV9wcm9jZWR1cmUob3BqX3RjZF90aWxlY29tcF90ICogdGlsZWMsCiAgCi0gCU9QSl9JTlQzMiBydzsJCQkvKiB3aWR0aCBvZiB0aGUgcmVzb2x1dGlvbiBsZXZlbCBjb21wdXRlZCAgICovCi0gCU9QSl9JTlQzMiByaDsJCQkvKiBoZWlnaHQgb2YgdGhlIHJlc29sdXRpb24gbGV2ZWwgY29tcHV0ZWQgICovCi0tCU9QSl9VSU5UMzIgbF9kYXRhX3NpemU7Ci0rCU9QSl9TSVpFX1QgbF9kYXRhX2NvdW50OwotKwlPUEpfU0laRV9UIGxfZGF0YV9zaXplOworICAgICBPUEpfSU5UMzIgcnc7ICAgICAgICAgICAvKiB3aWR0aCBvZiB0aGUgcmVzb2x1dGlvbiBsZXZlbCBjb21wdXRlZCAgICovCisgICAgIE9QSl9JTlQzMiByaDsgICAgICAgICAgIC8qIGhlaWdodCBvZiB0aGUgcmVzb2x1dGlvbiBsZXZlbCBjb21wdXRlZCAgKi8KKysgICAgT1BKX1NJWkVfVCBsX2RhdGFfY291bnQ7CisgICAgIE9QSl9TSVpFX1QgbF9kYXRhX3NpemU7CiAgCi0gCW9wal90Y2RfcmVzb2x1dGlvbl90ICogbF9jdXJfcmVzID0gMDsKLSAJb3BqX3RjZF9yZXNvbHV0aW9uX3QgKiBsX2xhc3RfcmVzID0gMDsKLUBAIC00MDcsOCArNDEzLDkgQEAgc3RhdGljIElOTElORSBPUEpfQk9PTCBvcGpfZHd0X2VuY29kZV9wcm9jZWR1cmUob3BqX3RjZF90aWxlY29tcF90ICogdGlsZWMsdm9pZAotIAlsX2N1cl9yZXMgPSB0aWxlYy0+cmVzb2x1dGlvbnMgKyBsOwotIAlsX2xhc3RfcmVzID0gbF9jdXJfcmVzIC0gMTsKKyAgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QgKiBsX2N1cl9yZXMgPSAwOworQEAgLTExMjksMTMgKzExMzcsMTMgQEAgc3RhdGljIElOTElORSBPUEpfQk9PTCBvcGpfZHd0X2VuY29kZV9wcm9jZWR1cmUob3BqX3RjZF90aWxlY29tcF90ICogdGlsZWMsCisgICAgIGxfY3VyX3JlcyA9IHRpbGVjLT5yZXNvbHV0aW9ucyArIGw7CisgICAgIGxfbGFzdF9yZXMgPSBsX2N1cl9yZXMgLSAxOwogIAotLQlsX2RhdGFfc2l6ZSA9IG9wal9kd3RfbWF4X3Jlc29sdXRpb24oIHRpbGVjLT5yZXNvbHV0aW9ucyx0aWxlYy0+bnVtcmVzb2x1dGlvbnMpICogKE9QSl9VSU5UMzIpc2l6ZW9mKE9QSl9JTlQzMik7Ci0tCWJqID0gKE9QSl9JTlQzMiopb3BqX21hbGxvYygoc2l6ZV90KWxfZGF0YV9zaXplKTsKLSsJbF9kYXRhX2NvdW50ID0gb3BqX2R3dF9tYXhfcmVzb2x1dGlvbih0aWxlYy0+cmVzb2x1dGlvbnMsIHRpbGVjLT5udW1yZXNvbHV0aW9ucykgKiAoT1BKX1VJTlQzMilzaXplb2YoT1BKX0lOVDMyKTsKLSsJbF9kYXRhX3NpemUgPSBsX2RhdGFfY291bnQgKiAoT1BKX1VJTlQzMilzaXplb2YoT1BKX0lOVDMyKTsKLSsJYmogPSAoT1BKX0lOVDMyKilvcGpfbWFsbG9jKGxfZGF0YV9zaXplKTsKLSAJaWYgKCEgYmopIHsKLSAJCXJldHVybiBPUEpfRkFMU0U7Ci0gCX0KLUBAIC00MzcsNyArNDQ0LDcgQEAgc3RhdGljIElOTElORSBPUEpfQk9PTCBvcGpfZHd0X2VuY29kZV9wcm9jZWR1cmUob3BqX3RjZF90aWxlY29tcF90ICogdGlsZWMsdm9pZAotIAkJCQlialtrXSA9IGFqW2sqd107Ci0gCQkJfQorLSAgICBsX2RhdGFfc2l6ZSA9IG9wal9kd3RfbWF4X3Jlc29sdXRpb24odGlsZWMtPnJlc29sdXRpb25zLCB0aWxlYy0+bnVtcmVzb2x1dGlvbnMpOworKyAgICBsX2RhdGFfY291bnQgPSBvcGpfZHd0X21heF9yZXNvbHV0aW9uKHRpbGVjLT5yZXNvbHV0aW9ucywgdGlsZWMtPm51bXJlc29sdXRpb25zKTsKKyAgICAgLyogb3ZlcmZsb3cgY2hlY2sgKi8KKy0gICAgaWYgKGxfZGF0YV9zaXplID4gKFNJWkVfTUFYIC8gc2l6ZW9mKE9QSl9JTlQzMikpKSB7CisrICAgIGlmIChsX2RhdGFfY291bnQgPiAoU0laRV9NQVggLyBzaXplb2YoT1BKX0lOVDMyKSkpIHsKKyAgICAgICAgIC8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgIH0KKy0gICAgbF9kYXRhX3NpemUgKj0gc2l6ZW9mKE9QSl9JTlQzMik7CisrICAgIGxfZGF0YV9zaXplID0gbF9kYXRhX2NvdW50ICogc2l6ZW9mKE9QSl9JTlQzMik7CisgICAgIGJqID0gKE9QSl9JTlQzMiopb3BqX21hbGxvYyhsX2RhdGFfc2l6ZSk7CisgICAgIC8qIGxfZGF0YV9zaXplIGlzIGVxdWFsIHRvIDAgd2hlbiBudW1yZXNvbHV0aW9ucyA9PSAxIGJ1dCBiaiBpcyBub3QgdXNlZCAqLworICAgICAvKiBpbiB0aGF0IGNhc2UsIHNvIGRvIG5vdCBlcnJvciBvdXQgKi8KK0BAIC0xMTY3LDcgKzExNzUsNyBAQCBzdGF0aWMgSU5MSU5FIE9QSl9CT09MIG9wal9kd3RfZW5jb2RlX3Byb2NlZHVyZShvcGpfdGNkX3RpbGVjb21wX3QgKiB0aWxlYywKKyAgICAgICAgICAgICAgICAgYmpba10gPSBhaltrICogd107CisgICAgICAgICAgICAgfQogIAotLQkJCSgqcF9mdW5jdGlvbikgKGJqLCBkbiwgc24sIGNhc19jb2wpOwotKwkJCSgqcF9mdW5jdGlvbikgKGJqLCBsX2RhdGFfY291bnQsIGRuLCBzbiwgY2FzX2NvbCk7CistICAgICAgICAgICAgKCpwX2Z1bmN0aW9uKShiaiwgZG4sIHNuLCBjYXNfY29sKTsKKysgICAgICAgICAgICAoKnBfZnVuY3Rpb24pIChiaiwgbF9kYXRhX2NvdW50LCBkbiwgc24sIGNhc19jb2wpOwogIAotIAkJCW9wal9kd3RfZGVpbnRlcmxlYXZlX3YoYmosIGFqLCBkbiwgc24sIHcsIGNhc19jb2wpOwotIAkJfQotQEAgLTQ0OCw3ICs0NTUsNyBAQCBzdGF0aWMgSU5MSU5FIE9QSl9CT09MIG9wal9kd3RfZW5jb2RlX3Byb2NlZHVyZShvcGpfdGNkX3RpbGVjb21wX3QgKiB0aWxlYyx2b2lkCi0gCQlmb3IgKGogPSAwOyBqIDwgcmg7IGorKykgewotIAkJCWFqID0gYSArIGogKiB3OwotIAkJCWZvciAoayA9IDA7IGsgPCBydzsgaysrKSAgYmpba10gPSBhaltrXTsKLS0JCQkoKnBfZnVuY3Rpb24pIChiaiwgZG4sIHNuLCBjYXNfcm93KTsKLSsJCQkoKnBfZnVuY3Rpb24pIChiaiwgbF9kYXRhX2NvdW50LCBkbiwgc24sIGNhc19yb3cpOwotIAkJCW9wal9kd3RfZGVpbnRlcmxlYXZlX2goYmosIGFqLCBkbiwgc24sIGNhc19yb3cpOwotIAkJfQorICAgICAgICAgICAgIG9wal9kd3RfZGVpbnRlcmxlYXZlX3YoYmosIGFqLCBkbiwgc24sIHcsIGNhc19jb2wpOworICAgICAgICAgfQorQEAgLTExODAsNyArMTE4OCw3IEBAIHN0YXRpYyBJTkxJTkUgT1BKX0JPT0wgb3BqX2R3dF9lbmNvZGVfcHJvY2VkdXJlKG9wal90Y2RfdGlsZWNvbXBfdCAqIHRpbGVjLAorICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBydzsgaysrKSB7CisgICAgICAgICAgICAgICAgIGJqW2tdID0gYWpba107CisgICAgICAgICAgICAgfQorLSAgICAgICAgICAgICgqcF9mdW5jdGlvbikoYmosIGRuLCBzbiwgY2FzX3Jvdyk7CisrICAgICAgICAgICAgKCpwX2Z1bmN0aW9uKSAoYmosIGxfZGF0YV9jb3VudCwgZG4sIHNuLCBjYXNfcm93KTsKKyAgICAgICAgICAgICBvcGpfZHd0X2RlaW50ZXJsZWF2ZV9oKGJqLCBhaiwgZG4sIHNuLCBjYXNfcm93KTsKKyAgICAgICAgIH0KICAKLUBAIC01NTcsNyArNTY0LDcgQEAgc3RhdGljIE9QSl9VSU5UMzIgb3BqX2R3dF9tYXhfcmVzb2x1dGlvbihvcGpfdGNkX3Jlc29sdXRpb25fdCogcmVzdHJpY3QgciwgT1BKX1UKLSAvKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAvKiBJbnZlcnNlIHdhdmVsZXQgdHJhbnNmb3JtIGluIDItRC4gICAgICovCitAQCAtMTM3OSw3ICsxMzg3LDcgQEAgc3RhdGljIHZvaWQgb3BqX2R3dF9kZWNvZGVfdl9mdW5jKHZvaWQqIHVzZXJfZGF0YSwgb3BqX3Rsc190KiB0bHMpCisgLyogSW52ZXJzZSB3YXZlbGV0IHRyYW5zZm9ybSBpbiAyLUQuICAgICovCiAgLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0tc3RhdGljIE9QSl9CT09MIG9wal9kd3RfZGVjb2RlX3RpbGUob3BqX3RjZF90aWxlY29tcF90KiB0aWxlYywgT1BKX1VJTlQzMiBudW1yZXMsIERXVDFERk4gZHd0XzFEKSB7Ci0rc3RhdGljIE9QSl9CT09MIG9wal9kd3RfZGVjb2RlX3RpbGUoY29uc3Qgb3BqX3RjZF90aWxlY29tcF90KiB0aWxlYywgT1BKX1VJTlQzMiBudW1yZXMsIERXVDFERk4gZHd0XzFEKSB7Ci0gCW9wal9kd3RfdCBoOwotIAlvcGpfZHd0X3QgdjsKKyBzdGF0aWMgT1BKX0JPT0wgb3BqX2R3dF9kZWNvZGVfdGlsZShvcGpfdGhyZWFkX3Bvb2xfdCogdHAsCistICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlY29tcF90KiB0aWxlYywgT1BKX1VJTlQzMiBudW1yZXMpCisrICAgICAgICBjb25zdCBvcGpfdGNkX3RpbGVjb21wX3QqIHRpbGVjLCBPUEpfVUlOVDMyIG51bXJlcykKKyB7CisgICAgIG9wal9kd3RfdCBoOworICAgICBvcGpfZHd0X3QgdjsKK0BAIC0xNDAxLDIyICsxNDA5LDIzIEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfZHd0X2RlY29kZV90aWxlKG9wal90aHJlYWRfcG9vbF90KiB0cCwKKyAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAgfQorICAgICBudW1fdGhyZWFkcyA9IG9wal90aHJlYWRfcG9vbF9nZXRfdGhyZWFkX2NvdW50KHRwKTsKKy0gICAgaF9tZW1fc2l6ZSA9IG9wal9kd3RfbWF4X3Jlc29sdXRpb24odHIsIG51bXJlcyk7CisrICAgIGgubWVtX2NvdW50ID0gb3BqX2R3dF9tYXhfcmVzb2x1dGlvbih0ciwgbnVtcmVzKTsKKyAgICAgLyogb3ZlcmZsb3cgY2hlY2sgKi8KKy0gICAgaWYgKGhfbWVtX3NpemUgPiAoU0laRV9NQVggLyBQQVJBTExFTF9DT0xTXzUzIC8gc2l6ZW9mKE9QSl9JTlQzMikpKSB7CisrICAgIGlmIChoLm1lbV9jb3VudCA+IChTSVpFX01BWCAvIFBBUkFMTEVMX0NPTFNfNTMgLyBzaXplb2YoT1BKX0lOVDMyKSkpIHsKKyAgICAgICAgIC8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgIH0KKyAgICAgLyogV2UgbmVlZCBQQVJBTExFTF9DT0xTXzUzIHRpbWVzIHRoZSBoZWlnaHQgb2YgdGhlIGFycmF5LCAqLworICAgICAvKiBzaW5jZSBmb3IgdGhlIHZlcnRpY2FsIHBhc3MgKi8KKyAgICAgLyogd2UgcHJvY2VzcyBQQVJBTExFTF9DT0xTXzUzIGNvbHVtbnMgYXQgYSB0aW1lICovCistICAgIGhfbWVtX3NpemUgKj0gUEFSQUxMRUxfQ09MU181MyAqIHNpemVvZihPUEpfSU5UMzIpOworKyAgICBoX21lbV9zaXplID0gaC5tZW1fY291bnQgKiBQQVJBTExFTF9DT0xTXzUzICogc2l6ZW9mKE9QSl9JTlQzMik7CisgICAgIGgubWVtID0gKE9QSl9JTlQzMiopb3BqX2FsaWduZWRfMzJfbWFsbG9jKGhfbWVtX3NpemUpOworICAgICBpZiAoISBoLm1lbSkgeworICAgICAgICAgLyogRklYTUUgZXZlbnQgbWFuYWdlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgfQogIAotQEAgLTU2OCwxMyArNTc1LDE0IEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfZHd0X2RlY29kZV90aWxlKG9wal90Y2RfdGlsZWNvbXBfdCogdGlsZWMsIE9QSl9VSU5UMzIgbnVtcmVzCisrICAgIHYubWVtX2NvdW50ID0gaC5tZW1fY291bnQ7CisgICAgIHYubWVtID0gaC5tZW07CiAgCi0gCU9QSl9VSU5UMzIgdyA9IChPUEpfVUlOVDMyKSh0aWxlYy0+eDEgLSB0aWxlYy0+eDApOworICAgICB3aGlsZSAoLS1udW1yZXMpIHsKK0BAIC0xNTk0LDcgKzE2MDMsOCBAQCBzdGF0aWMgdm9pZCBvcGpfZHd0X2ludGVybGVhdmVfcGFydGlhbF92KE9QSl9JTlQzMiAqZGVzdCwKKyAgICAgT1BKX1VOVVNFRChyZXQpOworIH0KICAKLS0JaC5tZW0gPSAoT1BKX0lOVDMyKikKLS0Jb3BqX2FsaWduZWRfbWFsbG9jKG9wal9kd3RfbWF4X3Jlc29sdXRpb24odHIsIG51bXJlcykgKiBzaXplb2YoT1BKX0lOVDMyKSk7Ci0rCWgubWVtX2NvdW50ID0gb3BqX2R3dF9tYXhfcmVzb2x1dGlvbih0ciwgbnVtcmVzKTsKLSsJaC5tZW0gPSAoT1BKX0lOVDMyKilvcGpfYWxpZ25lZF9tYWxsb2MoaC5tZW1fY291bnQgKiBzaXplb2YoT1BKX0lOVDMyKSk7Ci0gCWlmICghIGgubWVtKXsKLSAJCS8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KLSAJCXJldHVybiBPUEpfRkFMU0U7Ci0gCX0KKy1zdGF0aWMgdm9pZCBvcGpfZHd0X2RlY29kZV9wYXJ0aWFsXzEoT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwKKytzdGF0aWMgdm9pZCBvcGpfZHd0X2RlY29kZV9wYXJ0aWFsXzEoT1BKX0lOVDMyICphLCBPUEpfU0laRV9UIGFfY291bnQsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgY2FzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgd2luX2xfeDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB3aW5fbF94MSwKK0BAIC0xOTc0LDE2ICsxOTg0LDE2IEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfZHd0X2RlY29kZV9wYXJ0aWFsX3RpbGUoCisgICAgICAgICBvcGpfc3BhcnNlX2FycmF5X2ludDMyX2ZyZWUoc2EpOworICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICB9CistICAgIGhfbWVtX3NpemUgPSBvcGpfZHd0X21heF9yZXNvbHV0aW9uKHRyLCBudW1yZXMpOworKyAgICBoLm1lbV9jb3VudCA9IG9wal9kd3RfbWF4X3Jlc29sdXRpb24odHIsIG51bXJlcyk7CisgICAgIC8qIG92ZXJmbG93IGNoZWNrICovCisgICAgIC8qIGluIHZlcnRpY2FsIHBhc3MsIHdlIHByb2Nlc3MgNCBjb2x1bW5zIGF0IGEgdGltZSAqLworLSAgICBpZiAoaF9tZW1fc2l6ZSA+IChTSVpFX01BWCAvICg0ICogc2l6ZW9mKE9QSl9JTlQzMikpKSkgeworKyAgICBpZiAoaC5tZW1fY291bnQgPiAoU0laRV9NQVggLyAoNCAqIHNpemVvZihPUEpfSU5UMzIpKSkpIHsKKyAgICAgICAgIC8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgIG9wal9zcGFyc2VfYXJyYXlfaW50MzJfZnJlZShzYSk7CisgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICB9CiAgCi0rCXYubWVtX2NvdW50ID0gaC5tZW1fY291bnQ7Ci0gCXYubWVtID0gaC5tZW07CistICAgIGhfbWVtX3NpemUgKj0gNCAqIHNpemVvZihPUEpfSU5UMzIpOworKyAgICBoX21lbV9zaXplID0gaC5tZW1fY291bnQgKiA0ICogc2l6ZW9mKE9QSl9JTlQzMik7CisgICAgIGgubWVtID0gKE9QSl9JTlQzMiopb3BqX2FsaWduZWRfMzJfbWFsbG9jKGhfbWVtX3NpemUpOworICAgICBpZiAoISBoLm1lbSkgeworICAgICAgICAgLyogRklYTUUgZXZlbnQgbWFuYWdlciBlcnJvciBjYWxsYmFjayAqLworQEAgLTE5OTEsNiArMjAwMSw3IEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfZHd0X2RlY29kZV9wYXJ0aWFsX3RpbGUoCisgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICB9CiAgCi0gCXdoaWxlKCAtLW51bXJlcykgeworKyAgICB2Lm1lbV9jb3VudCA9IGgubWVtX2NvdW50OworICAgICB2Lm1lbSA9IGgubWVtOworIAorICAgICBmb3IgKHJlc25vID0gMTsgcmVzbm8gPCBudW1yZXM7IHJlc25vICsrKSB7CitAQCAtMjEwMSw3ICsyMTEyLDcgQEAgc3RhdGljIE9QSl9CT09MIG9wal9kd3RfZGVjb2RlX3BhcnRpYWxfdGlsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5fbGxfeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luX2hsX3gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbl9obF94MSk7CistICAgICAgICAgICAgICAgIG9wal9kd3RfZGVjb2RlX3BhcnRpYWxfMShoLm1lbSwgaC5kbiwgaC5zbiwgaC5jYXMsCisrICAgICAgICAgICAgICAgIG9wal9kd3RfZGVjb2RlX3BhcnRpYWxfMShoLm1lbSwgaC5tZW1fY291bnQsIGguZG4sIGguc24sIGguY2FzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMil3aW5fbGxfeDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKXdpbl9sbF94MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfSU5UMzIpd2luX2hsX3gwLApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDA0LWoya19yZWFkX21jYy5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAwNC1qMmtfcmVhZF9tY2MucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5Yzg0N2QuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDA0LWoya19yZWFkX21jYy5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2oyay5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYwotaW5kZXggODQ5ZDBiNC4uYjIwZjIxOSAxMDA2NDQKLS0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmMKLSsrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmMKLUBAIC01MzQxLDYgKzUzNDEsNyBAQCBzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX21jYyAoICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgT1BKX1VJTlQzMiBsX25iX2NvbGxlY3Rpb25zOwotICAgICAgICAgT1BKX1VJTlQzMiBsX25iX2NvbXBzOwotICAgICAgICAgT1BKX1VJTlQzMiBsX25iX2J5dGVzX2J5X2NvbXA7Ci0rICAgICAgICBPUEpfQk9PTCBuZXdfbWNjID0gT1BKX0ZBTFNFOwotIAotICAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOwotQEAgLTU0MDIsNiArNTQwMyw3IEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfbWNjICggICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGxfbWNjX3JlY29yZCwwLChsX3RjcC0+bV9uYl9tYXhfbWNjX3JlY29yZHMtbF90Y3AtPm1fbmJfbWNjX3JlY29yZHMpICogc2l6ZW9mKG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90KSk7Ci0gICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgbF9tY2NfcmVjb3JkID0gbF90Y3AtPm1fbWNjX3JlY29yZHMgKyBsX3RjcC0+bV9uYl9tY2NfcmVjb3JkczsKLSsgICAgICAgICAgICAgICAgbmV3X21jYyA9IE9QSl9UUlVFOwotICAgICAgICAgfQotICAgICAgICAgbF9tY2NfcmVjb3JkLT5tX2luZGV4ID0gbF9pbmRpeDsKLSAKLUBAIC01NTM3LDcgKzU1MzksOSBAQCBzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX21jYyAoICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgfQotIAotLSAgICAgICAgKytsX3RjcC0+bV9uYl9tY2NfcmVjb3JkczsKLSsgICAgICAgIGlmIChuZXdfbWNjKSB7Ci0rICAgICAgICAgICAgICAgICsrbF90Y3AtPm1fbmJfbWNjX3JlY29yZHM7Ci0rICAgICAgICB9Ci0gCi0gICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDA1LWpwMl9hcHBseV9wY2xyLnBhdGNoIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDA1LWpwMl9hcHBseV9wY2xyLnBhdGNoCmluZGV4IGZkM2NhNjMuLmM4Y2FlYTggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAwNS1qcDJfYXBwbHlfcGNsci5wYXRjaAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMDUtanAyX2FwcGx5X3BjbHIucGF0Y2gKQEAgLTEsNDkgKzEsMzkgQEAKIGRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2pwMi5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYwotaW5kZXggNDdmODNhMS4uNmU5MTBhOSAxMDA2NDQKK2luZGV4IGRhNGUwNWY4Mi4uYzk1NjJmNzA1IDEwMDY0NAogLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYwogKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYwotQEAgLTkwMiw3ICs5MDIsNyBAQCBzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9jaGVja19jb2xvcihvcGpfaW1hZ2VfdCAqaW1hZ2UsIG9wal9qcDJfY29sb3JfdCAqY29sb3IsCi0gCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbnZhbGlkIGNvbXBvbmVudC9wYWxldHRlIGluZGV4IGZvciBkaXJlY3QgbWFwcGluZyAlZC5cbiIsIHBjb2wpOwotIAkJCQlpc19zYW5lID0gT1BKX0ZBTFNFOwotIAkJCX0KLS0JCQllbHNlIGlmIChwY29sX3VzYWdlW3Bjb2xdICYmIGNtYXBbaV0ubXR5cCA9PSAxKSB7Ci0rCQkJZWxzZSBpZiAocGNvbF91c2FnZVtwY29sXSAmJiBjbWFwW2ldLm10eXAgIT0gMCkgewotIAkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ29tcG9uZW50ICVkIGlzIG1hcHBlZCB0d2ljZS5cbiIsIHBjb2wpOwotIAkJCQlpc19zYW5lID0gT1BKX0ZBTFNFOwotIAkJCX0KLUBAIC05ODIsOCArOTgyLDggQEAgc3RhdGljIHZvaWQgb3BqX2pwMl9hcHBseV9wY2xyKG9wal9pbWFnZV90ICppbWFnZSwgb3BqX2pwMl9jb2xvcl90ICpjb2xvcikKLSAgICAgICBhc3NlcnQoIHBjb2wgPT0gMCApOwotICAgICAgIG5ld19jb21wc1tpXSA9IG9sZF9jb21wc1tjbXBdOwotICAgICB9IGVsc2UgewotLSAgICAgIGFzc2VydCggaSA9PSBwY29sICk7Ci0tICAgICAgbmV3X2NvbXBzW3Bjb2xdID0gb2xkX2NvbXBzW2NtcF07Ci0rICAgICAgYXNzZXJ0KCBpID09IHBjb2wgKTsgLy8gcHJvYmFibHkgd3Jvbmc/Ci0rICAgICAgbmV3X2NvbXBzW2ldID0gb2xkX2NvbXBzW2NtcF07Ci0gICAgIH0KK0BAIC0xMDczLDggKzEwNzMsOCBAQCBzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9hcHBseV9wY2xyKG9wal9pbWFnZV90ICppbWFnZSwKKyAgICAgICAgICAgICBhc3NlcnQocGNvbCA9PSAwKTsKKyAgICAgICAgICAgICBuZXdfY29tcHNbaV0gPSBvbGRfY29tcHNbY21wXTsKKyAgICAgICAgIH0gZWxzZSB7CistICAgICAgICAgICAgYXNzZXJ0KGkgPT0gcGNvbCk7CistICAgICAgICAgICAgbmV3X2NvbXBzW3Bjb2xdID0gb2xkX2NvbXBzW2NtcF07CisrICAgICAgICAgICAgYXNzZXJ0KCBpID09IHBjb2wgKTsgLy8gcHJvYmFibHkgd3Jvbmc/CisrICAgICAgICAgICAgbmV3X2NvbXBzW2ldID0gb2xkX2NvbXBzW2NtcF07CisgICAgICAgICB9CiAgCi0gCQkvKiBQYWxldHRlIG1hcHBpbmc6ICovCi1AQCAtMTAwNywxMSArMTAwNywxMSBAQCBzdGF0aWMgdm9pZCBvcGpfanAyX2FwcGx5X3BjbHIob3BqX2ltYWdlX3QgKmltYWdlLCBvcGpfanAyX2NvbG9yX3QgKmNvbG9yKQotIAkJY21wID0gY21hcFtpXS5jbXA7IHBjb2wgPSBjbWFwW2ldLnBjb2w7Ci0gCQlzcmMgPSBvbGRfY29tcHNbY21wXS5kYXRhOwotICAgICBhc3NlcnQoIHNyYyApOwotLQkJbWF4ID0gbmV3X2NvbXBzW3Bjb2xdLncgKiBuZXdfY29tcHNbcGNvbF0uaDsKLSsJCW1heCA9IG5ld19jb21wc1tpXS53ICogbmV3X2NvbXBzW2ldLmg7CisgICAgICAgICAvKiBQYWxldHRlIG1hcHBpbmc6ICovCitAQCAtMTEwMiwxOSArMTEwMiwxOSBAQCBzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9hcHBseV9wY2xyKG9wal9pbWFnZV90ICppbWFnZSwKKyAgICAgICAgIHBjb2wgPSBjbWFwW2ldLnBjb2w7CisgICAgICAgICBzcmMgPSBvbGRfY29tcHNbY21wXS5kYXRhOworICAgICAgICAgYXNzZXJ0KHNyYyk7IC8qIHZlcmlmaWVkIGFib3ZlICovCistICAgICAgICBtYXggPSBuZXdfY29tcHNbcGNvbF0udyAqIG5ld19jb21wc1twY29sXS5oOworKyAgICAgICAgbWF4ID0gbmV3X2NvbXBzW2ldLncgKiBuZXdfY29tcHNbaV0uaDsKICAKLSAJCS8qIERpcmVjdCB1c2U6ICovCi0gICAgIGlmKGNtYXBbaV0ubXR5cCA9PSAwKSB7Ci0tICAgICAgYXNzZXJ0KCBjbXAgPT0gMCApOwotKyAgICAgIGFzc2VydCggY21wID09IDAgKTsgLy8gcHJvYmFibHkgd3JvbmcuCi0gICAgICAgZHN0ID0gbmV3X2NvbXBzW2ldLmRhdGE7Ci0gICAgICAgYXNzZXJ0KCBkc3QgKTsKLSAgICAgICBmb3IoaiA9IDA7IGogPCBtYXg7ICsraikgewotQEAgLTEwMTksOCArMTAxOSw4IEBAIHN0YXRpYyB2b2lkIG9wal9qcDJfYXBwbHlfcGNscihvcGpfaW1hZ2VfdCAqaW1hZ2UsIG9wal9qcDJfY29sb3JfdCAqY29sb3IpCi0gICAgICAgfQotICAgICB9Ci0gICAgIGVsc2UgewotLSAgICAgIGFzc2VydCggaSA9PSBwY29sICk7Ci0tICAgICAgZHN0ID0gbmV3X2NvbXBzW3Bjb2xdLmRhdGE7Ci0rICAgICAgYXNzZXJ0KCBpID09IHBjb2wgKTsgLy8gcHJvYmFibHkgd3Jvbmc/Ci0rICAgICAgZHN0ID0gbmV3X2NvbXBzW2ldLmRhdGE7Ci0gICAgICAgYXNzZXJ0KCBkc3QgKTsKLSAgICAgICBmb3IoaiA9IDA7IGogPCBtYXg7ICsraikgewotICAgICAgICAgLyogVGhlIGluZGV4ICovCisgICAgICAgICAvKiBEaXJlY3QgdXNlOiAqLworICAgICAgICAgaWYgKGNtYXBbaV0ubXR5cCA9PSAwKSB7CistICAgICAgICAgICAgYXNzZXJ0KGNtcCA9PSAwKTsKKysgICAgICAgICAgICBhc3NlcnQoIGNtcCA9PSAwICk7IC8vIHByb2JhYmx5IHdyb25nLgorICAgICAgICAgICAgIGRzdCA9IG5ld19jb21wc1tpXS5kYXRhOworICAgICAgICAgICAgIGFzc2VydChkc3QpOworICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBtYXg7ICsraikgeworICAgICAgICAgICAgICAgICBkc3Rbal0gPSBzcmNbal07CisgICAgICAgICAgICAgfQorICAgICAgICAgfSBlbHNlIHsKKy0gICAgICAgICAgICBhc3NlcnQoaSA9PSBwY29sKTsKKy0gICAgICAgICAgICBkc3QgPSBuZXdfY29tcHNbcGNvbF0uZGF0YTsKKysgICAgICAgICAgICBhc3NlcnQoIGkgPT0gcGNvbCApOyAvLyBwcm9iYWJseSB3cm9uZz8KKysgICAgICAgICAgICBkc3QgPSBuZXdfY29tcHNbaV0uZGF0YTsKKyAgICAgICAgICAgICBhc3NlcnQoZHN0KTsKKyAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbWF4OyArK2opIHsKKyAgICAgICAgICAgICAgICAgLyogVGhlIGluZGV4ICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMDYtdGNkX2luaXRfdGlsZS5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAwNi10Y2RfaW5pdF90aWxlLnBhdGNoCmluZGV4IDZjMDBmNDAuLjhjMzdmYzIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAwNi10Y2RfaW5pdF90aWxlLnBhdGNoCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAwNi10Y2RfaW5pdF90aWxlLnBhdGNoCkBAIC0xLDE2ICsxLDE2IEBACiBkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Y2QuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGNkLmMKLWluZGV4IDJmY2NmZjEuLmFlYmU5YmUgMTAwNjQ0CitpbmRleCAxZGQxNTQwNWQuLmFjYzI4ZGQ1NSAxMDA2NDQKIC0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGNkLmMKICsrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGNkLmMKLUBAIC03MjcsNyArNzI3LDEwIEBAIHN0YXRpYyBJTkxJTkUgT1BKX0JPT0wgb3BqX3RjZF9pbml0X3RpbGUob3BqX3RjZF90ICpwX3RjZCwgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCi0gCQlsX3RpbGVjLT54MSA9IG9wal9pbnRfY2VpbGRpdihsX3RpbGUtPngxLCAoT1BKX0lOVDMyKWxfaW1hZ2VfY29tcC0+ZHgpOwotIAkJbF90aWxlYy0+eTEgPSBvcGpfaW50X2NlaWxkaXYobF90aWxlLT55MSwgKE9QSl9JTlQzMilsX2ltYWdlX2NvbXAtPmR5KTsKLSAJCS8qZnByaW50ZihzdGRlcnIsICJcdFRpbGUgY29tcG8gYm9yZGVyID0gJWQsJWQsJWQsJWRcbiIsIGxfdGlsZWMtPngwLCBsX3RpbGVjLT55MCxsX3RpbGVjLT54MSxsX3RpbGVjLT55MSk7Ki8KLS0JCQotKwkJaWYgKGxfdGlsZWMtPngwID49IGxfdGlsZWMtPngxIHx8IGxfdGlsZWMtPnkwID49IGxfdGlsZWMtPnkxKSB7Ci0rCQkJb3BqX2V2ZW50X21zZyhtYW5hZ2VyLCBFVlRfRVJST1IsICJJbnZhbGlkIHRpbGUgZGF0YVxuIik7Ci0rCQkJcmV0dXJuIE9QSl9GQUxTRTsKLSsJCX0KLSAJCS8qIGNvbXB1dGUgbF9kYXRhX3NpemUgd2l0aCBvdmVyZmxvdyBjaGVjayAqLwotIAkJbF9kYXRhX3NpemUgPSAoT1BKX1VJTlQzMikobF90aWxlYy0+eDEgLSBsX3RpbGVjLT54MCk7Ci0gCQlpZiAoKCgoT1BKX1VJTlQzMiktMSkgLyBsX2RhdGFfc2l6ZSkgPCAoT1BKX1VJTlQzMikobF90aWxlYy0+eTEgLSBsX3RpbGVjLT55MCkpIHsKK0BAIC04MTgsNiArODE4LDExIEBAIHN0YXRpYyBJTkxJTkUgT1BKX0JPT0wgb3BqX3RjZF9pbml0X3RpbGUob3BqX3RjZF90ICpwX3RjZCwgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCisgICAgICAgICBpZiAoaXNFbmNvZGVyKSB7CisgICAgICAgICAgICAgT1BKX1NJWkVfVCBsX3RpbGVfZGF0YV9zaXplOworIAorKyAgICAgICAgICAgIGlmIChsX3RpbGVjLT54MCA+PSBsX3RpbGVjLT54MSB8fCBsX3RpbGVjLT55MCA+PSBsX3RpbGVjLT55MSkgeworKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKG1hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgdGlsZSBkYXRhXG4iKTsKKysgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKysgICAgICAgICAgICB9CisrCisgICAgICAgICAgICAgLyogY29tcHV0ZSBsX2RhdGFfc2l6ZSB3aXRoIG92ZXJmbG93IGNoZWNrICovCisgICAgICAgICAgICAgT1BKX1NJWkVfVCB3ID0gKE9QSl9TSVpFX1QpKGxfdGlsZWMtPngxIC0gbF90aWxlYy0+eDApOworICAgICAgICAgICAgIE9QSl9TSVpFX1QgaCA9IChPUEpfU0laRV9UKShsX3RpbGVjLT55MSAtIGxfdGlsZWMtPnkwKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAwNy1qcDJfcmVhZF9jbWFwLnBhdGNoIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDA3LWpwMl9yZWFkX2NtYXAucGF0Y2gKaW5kZXggMzBmOWU0Yi4uNGNjNDM0MCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDA3LWpwMl9yZWFkX2NtYXAucGF0Y2gKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDA3LWpwMl9yZWFkX2NtYXAucGF0Y2gKQEAgLTEsMTMgKzEsMTMgQEAKIGRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2pwMi5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYwotaW5kZXggNmU5MTBhOS4uZjNiYWNhNSAxMDA2NDQKK2luZGV4IDNhY2UwOTY1NC4uN2VmN2M5MTM5IDEwMDY0NAogLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYwogKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYwotQEAgLTExOTQsNyArMTE5NCw3IEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfY21hcCgJb3BqX2pwMl90ICoganAyLAorQEAgLTEyOTYsNyArMTI5Niw3IEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfY21hcChvcGpfanAyX3QgKiBqcDIsCiAgCiAgCi0gCWZvcihpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyArK2kpIHsKLS0JCW9wal9yZWFkX2J5dGVzKHBfY21hcF9oZWFkZXJfZGF0YSwgJmxfdmFsdWUsIDIpOwkJCS8qIENNUF5pICovCi0rCQlvcGpfcmVhZF9ieXRlc19CRShwX2NtYXBfaGVhZGVyX2RhdGEsICZsX3ZhbHVlLCAyKTsJCQkvKiBDTVBeaSAqLwotIAkJcF9jbWFwX2hlYWRlcl9kYXRhICs9MjsKLSAJCWNtYXBbaV0uY21wID0gKE9QSl9VSU5UMTYpIGxfdmFsdWU7CisgICAgIGZvciAoaSA9IDA7IGkgPCBucl9jaGFubmVsczsgKytpKSB7CistICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2NtYXBfaGVhZGVyX2RhdGEsICZsX3ZhbHVlLCAyKTsgICAgICAgICAgICAvKiBDTVBeaSAqLworKyAgICAgICAgb3BqX3JlYWRfYnl0ZXNfQkUocF9jbWFwX2hlYWRlcl9kYXRhLCAmbF92YWx1ZSwgMik7ICAgICAvKiBDTVBeaSAqLworICAgICAgICAgcF9jbWFwX2hlYWRlcl9kYXRhICs9IDI7CisgICAgICAgICBjbWFwW2ldLmNtcCA9IChPUEpfVUlOVDE2KSBsX3ZhbHVlOwogIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDA4LWpwMl9jaGVja19jb2xvci5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAwOC1qcDJfY2hlY2tfY29sb3IucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MTBjODYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDA4LWpwMl9jaGVja19jb2xvci5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2pwMi5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYwotaW5kZXggZjNiYWNhNS4uM2JjYjQyZSAxMDA2NDQKLS0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvanAyLmMKLSsrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvanAyLmMKLUBAIC04OTYsOCArODk2LDEyIEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX2NoZWNrX2NvbG9yKG9wal9pbWFnZV90ICppbWFnZSwgb3BqX2pwMl9jb2xvcl90ICpjb2xvciwKLSAJCX0KLSAJCS8qIHZlcmlmeSB0aGF0IG5vIGNvbXBvbmVudCBpcyB0YXJnZXRlZCBtb3JlIHRoYW4gb25jZSAqLwotIAkJZm9yIChpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyBpKyspIHsKLS0gICAgICBPUEpfVUlOVDE2IHBjb2wgPSBjbWFwW2ldLnBjb2w7Ci0tICAgICAgYXNzZXJ0KGNtYXBbaV0ubXR5cCA9PSAwIHx8IGNtYXBbaV0ubXR5cCA9PSAxKTsKLSsJCQlpZiAoY21hcFtpXS5tdHlwICE9IDAgJiYgY21hcFtpXS5tdHlwICE9IDEpIHsKLSsJCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlVuZXhwZWN0ZWQgTVRZUCB2YWx1ZS5cbiIpOwotKwkJCQlvcGpfZnJlZShwY29sX3VzYWdlKTsKLSsJCQkJcmV0dXJuIE9QSl9GQUxTRTsKLSsJCQl9Ci0rCQkJT1BKX1VJTlQxNiBwY29sID0gY21hcFtpXS5wY29sOwotIAkJCWlmIChwY29sID49IG5yX2NoYW5uZWxzKSB7Ci0gCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbnZhbGlkIGNvbXBvbmVudC9wYWxldHRlIGluZGV4IGZvciBkaXJlY3QgbWFwcGluZyAlZC5cbiIsIHBjb2wpOwotIAkJCQlpc19zYW5lID0gT1BKX0ZBTFNFOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDA5LW9wal9waV9uZXh0LnBhdGNoIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDA5LW9wal9waV9uZXh0LnBhdGNoCmluZGV4IGE3NzAxZjAuLjk5ZjE3ZDMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAwOS1vcGpfcGlfbmV4dC5wYXRjaAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMDktb3BqX3BpX25leHQucGF0Y2gKQEAgLTEsMzQgKzEsMzQgQEAKIGRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3BpLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3BpLmMKLWluZGV4IDA2ZjFlNDEuLjQ2MmUwN2MgMTAwNjQ0CitpbmRleCA5MTY0MmVlNGUuLjI1NmZlMzdhMSAxMDA2NDQKIC0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvcGkuYwogKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9waS5jCi1AQCAtMzc3LDYgKzM3Nyw5IEBAIGlmICghcGktPnRwX29uKXsKLSAJCQkJCXByY2ogPSBvcGpfaW50X2Zsb29yZGl2cG93MihvcGpfaW50X2NlaWxkaXYocGktPnksIChPUEpfSU5UMzIpKGNvbXAtPmR5IDw8IGxldmVsbm8pKSwgKE9QSl9JTlQzMilyZXMtPnBkeSkKLSAJCQkJCQkgLSBvcGpfaW50X2Zsb29yZGl2cG93Mih0cnkwLCAoT1BKX0lOVDMyKXJlcy0+cGR5KTsKLSAJCQkJCXBpLT5wcmVjbm8gPSAoT1BKX1VJTlQzMikocHJjaSArIHByY2ogKiAoT1BKX0lOVDMyKXJlcy0+cHcpOwotKwkJCQkJaWYgKHBpLT5wcmVjbm8gPj0gcmVzLT5wdyAqIHJlcy0+cGgpIHsKLSsJCQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotKwkJCQkJfQotIAkJCQkJZm9yIChwaS0+bGF5bm8gPSBwaS0+cG9jLmxheW5vMDsgcGktPmxheW5vIDwgcGktPnBvYy5sYXlubzE7IHBpLT5sYXlubysrKSB7Ci0gCQkJCQkJaW5kZXggPSBwaS0+bGF5bm8gKiBwaS0+c3RlcF9sICsgcGktPnJlc25vICogcGktPnN0ZXBfciArIHBpLT5jb21wbm8gKiBwaS0+c3RlcF9jICsgcGktPnByZWNubyAqIHBpLT5zdGVwX3A7Ci0gCQkJCQkJaWYgKCFwaS0+aW5jbHVkZVtpbmRleF0pIHsKLUBAIC00NTgsNiArNDYxLDkgQEAgc3RhdGljIE9QSl9CT09MIG9wal9waV9uZXh0X3Bjcmwob3BqX3BpX2l0ZXJhdG9yX3QgKiBwaSkgewotIAkJCQkJcHJjaiA9IG9wal9pbnRfZmxvb3JkaXZwb3cyKG9wal9pbnRfY2VpbGRpdihwaS0+eSwgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgbGV2ZWxubykpLCAoT1BKX0lOVDMyKXJlcy0+cGR5KQotIAkJCQkJCSAtIG9wal9pbnRfZmxvb3JkaXZwb3cyKHRyeTAsIChPUEpfSU5UMzIpcmVzLT5wZHkpOwotIAkJCQkJcGktPnByZWNubyA9IChPUEpfVUlOVDMyKShwcmNpICsgcHJjaiAqIChPUEpfSU5UMzIpcmVzLT5wdyk7Ci0rCQkJCQlpZiAocGktPnByZWNubyA+PSByZXMtPnB3ICogcmVzLT5waCkgewotKwkJCQkJCXJldHVybiBPUEpfRkFMU0U7Ci0rCQkJCQl9Ci0gCQkJCQlmb3IgKHBpLT5sYXlubyA9IHBpLT5wb2MubGF5bm8wOyBwaS0+bGF5bm8gPCBwaS0+cG9jLmxheW5vMTsgcGktPmxheW5vKyspIHsKLSAJCQkJCQlpbmRleCA9IHBpLT5sYXlubyAqIHBpLT5zdGVwX2wgKyBwaS0+cmVzbm8gKiBwaS0+c3RlcF9yICsgcGktPmNvbXBubyAqIHBpLT5zdGVwX2MgKyBwaS0+cHJlY25vICogcGktPnN0ZXBfcDsKLSAJCQkJCQlpZiAoIXBpLT5pbmNsdWRlW2luZGV4XSkgewotQEAgLTUzNyw2ICs1NDMsOSBAQCBzdGF0aWMgT1BKX0JPT0wgb3BqX3BpX25leHRfY3BybChvcGpfcGlfaXRlcmF0b3JfdCAqIHBpKSB7Ci0gCQkJCQlwcmNqID0gb3BqX2ludF9mbG9vcmRpdnBvdzIob3BqX2ludF9jZWlsZGl2KHBpLT55LCAoT1BKX0lOVDMyKShjb21wLT5keSA8PCBsZXZlbG5vKSksIChPUEpfSU5UMzIpcmVzLT5wZHkpCi0gCQkJCQkJIC0gb3BqX2ludF9mbG9vcmRpdnBvdzIodHJ5MCwgKE9QSl9JTlQzMilyZXMtPnBkeSk7Ci0gCQkJCQlwaS0+cHJlY25vID0gKE9QSl9VSU5UMzIpKHByY2kgKyBwcmNqICogKE9QSl9JTlQzMilyZXMtPnB3KTsKLSsJCQkJCWlmIChwaS0+cHJlY25vID49IHJlcy0+cHcgKiByZXMtPnBoKSB7Ci0rCQkJCQkJcmV0dXJuIE9QSl9GQUxTRTsKLSsJCQkJCX0KLSAJCQkJCWZvciAocGktPmxheW5vID0gcGktPnBvYy5sYXlubzA7IHBpLT5sYXlubyA8IHBpLT5wb2MubGF5bm8xOyBwaS0+bGF5bm8rKykgewotIAkJCQkJCWluZGV4ID0gcGktPmxheW5vICogcGktPnN0ZXBfbCArIHBpLT5yZXNubyAqIHBpLT5zdGVwX3IgKyBwaS0+Y29tcG5vICogcGktPnN0ZXBfYyArIHBpLT5wcmVjbm8gKiBwaS0+c3RlcF9wOwotIAkJCQkJCWlmICghcGktPmluY2x1ZGVbaW5kZXhdKSB7CitAQCAtNDQ1LDYgKzQ0NSw5IEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfcGlfbmV4dF9ycGNsKG9wal9waV9pdGVyYXRvcl90ICogcGkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgbGV2ZWxubykpLCAoT1BKX0lOVDMyKXJlcy0+cGR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gb3BqX2ludF9mbG9vcmRpdnBvdzIodHJ5MCwgKE9QSl9JTlQzMilyZXMtPnBkeSk7CisgICAgICAgICAgICAgICAgICAgICBwaS0+cHJlY25vID0gKE9QSl9VSU5UMzIpKHByY2kgKyBwcmNqICogKE9QSl9JTlQzMilyZXMtPnB3KTsKKysgICAgICAgICAgICAgICAgICAgIGlmIChwaS0+cHJlY25vID49IHJlcy0+cHcgKiByZXMtPnBoKSB7CisrICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisrICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBmb3IgKHBpLT5sYXlubyA9IHBpLT5wb2MubGF5bm8wOyBwaS0+bGF5bm8gPCBwaS0+cG9jLmxheW5vMTsgcGktPmxheW5vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHBpLT5sYXlubyAqIHBpLT5zdGVwX2wgKyBwaS0+cmVzbm8gKiBwaS0+c3RlcF9yICsgcGktPmNvbXBubyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaS0+c3RlcF9jICsgcGktPnByZWNubyAqIHBpLT5zdGVwX3A7CitAQCAtNTc2LDYgKzU3OSw5IEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfcGlfbmV4dF9wY3JsKG9wal9waV9pdGVyYXRvcl90ICogcGkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgbGV2ZWxubykpLCAoT1BKX0lOVDMyKXJlcy0+cGR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gb3BqX2ludF9mbG9vcmRpdnBvdzIodHJ5MCwgKE9QSl9JTlQzMilyZXMtPnBkeSk7CisgICAgICAgICAgICAgICAgICAgICBwaS0+cHJlY25vID0gKE9QSl9VSU5UMzIpKHByY2kgKyBwcmNqICogKE9QSl9JTlQzMilyZXMtPnB3KTsKKysgICAgICAgICAgICAgICAgICAgIGlmIChwaS0+cHJlY25vID49IHJlcy0+cHcgKiByZXMtPnBoKSB7CisrICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisrICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBmb3IgKHBpLT5sYXlubyA9IHBpLT5wb2MubGF5bm8wOyBwaS0+bGF5bm8gPCBwaS0+cG9jLmxheW5vMTsgcGktPmxheW5vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHBpLT5sYXlubyAqIHBpLT5zdGVwX2wgKyBwaS0+cmVzbm8gKiBwaS0+c3RlcF9yICsgcGktPmNvbXBubyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaS0+c3RlcF9jICsgcGktPnByZWNubyAqIHBpLT5zdGVwX3A7CitAQCAtNzA0LDYgKzcxMCw5IEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfcGlfbmV4dF9jcHJsKG9wal9waV9pdGVyYXRvcl90ICogcGkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgbGV2ZWxubykpLCAoT1BKX0lOVDMyKXJlcy0+cGR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gb3BqX2ludF9mbG9vcmRpdnBvdzIodHJ5MCwgKE9QSl9JTlQzMilyZXMtPnBkeSk7CisgICAgICAgICAgICAgICAgICAgICBwaS0+cHJlY25vID0gKE9QSl9VSU5UMzIpKHByY2kgKyBwcmNqICogKE9QSl9JTlQzMilyZXMtPnB3KTsKKysgICAgICAgICAgICAgICAgICAgIGlmIChwaS0+cHJlY25vID49IHJlcy0+cHcgKiByZXMtPnBoKSB7CisrICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisrICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBmb3IgKHBpLT5sYXlubyA9IHBpLT5wb2MubGF5bm8wOyBwaS0+bGF5bm8gPCBwaS0+cG9jLmxheW5vMTsgcGktPmxheW5vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHBpLT5sYXlubyAqIHBpLT5zdGVwX2wgKyBwaS0+cmVzbm8gKiBwaS0+c3RlcF9yICsgcGktPmNvbXBubyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaS0+c3RlcF9jICsgcGktPnByZWNubyAqIHBpLT5zdGVwX3A7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMTAtcGlfdXBkYXRlX2RlY29kZV9wb2MucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMTAtcGlfdXBkYXRlX2RlY29kZV9wb2MucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OTZiNzYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDEwLXBpX3VwZGF0ZV9kZWNvZGVfcG9jLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvcGkuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvcGkuYwotaW5kZXggNDYyZTA3Yy4uOTA5N2UzMSAxMDA2NDQKLS0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvcGkuYwotKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9waS5jCi1AQCAtMTAyOCw3ICsxMDI4LDcgQEAgc3RhdGljIHZvaWQgb3BqX3BpX3VwZGF0ZV9kZWNvZGVfcG9jIChvcGpfcGlfaXRlcmF0b3JfdCAqIHBfcGksCi0gCQlsX2N1cnJlbnRfcGktPnBvYy5wcmVjbm8wID0gMDsKLSAJCWxfY3VycmVudF9waS0+cG9jLnJlc25vMSA9IGxfY3VycmVudF9wb2MtPnJlc25vMTsgLyogUmVzb2x1dGlvbiBMZXZlbCBJbmRleCAjMCAoRW5kKSAqLwotIAkJbF9jdXJyZW50X3BpLT5wb2MuY29tcG5vMSA9IGxfY3VycmVudF9wb2MtPmNvbXBubzE7IC8qIENvbXBvbmVudCBJbmRleCAjMCAoRW5kKSAqLwotLQkJbF9jdXJyZW50X3BpLT5wb2MubGF5bm8xID0gbF9jdXJyZW50X3BvYy0+bGF5bm8xOyAvKiBMYXllciBJbmRleCAjMCAoRW5kKSAqLwotKwkJbF9jdXJyZW50X3BpLT5wb2MubGF5bm8xID0gb3BqX3VpbnRfbWluKGxfY3VycmVudF9wb2MtPmxheW5vMSwgcF90Y3AtPm51bWxheWVycyk7IC8qIExheWVyIEluZGV4ICMwIChFbmQpICovCi0gCQlsX2N1cnJlbnRfcGktPnBvYy5wcmVjbm8xID0gcF9tYXhfcHJlY2lzaW9uOwotIAkJKytsX2N1cnJlbnRfcGk7Ci0gCQkrK2xfY3VycmVudF9wb2M7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMTEtajJrX3VwZGF0ZV9pbWFnZV9kYXRhLnBhdGNoIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDExLWoya191cGRhdGVfaW1hZ2VfZGF0YS5wYXRjaAppbmRleCA2OTdjNDhmLi5iNjEzMjRhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMTEtajJrX3VwZGF0ZV9pbWFnZV9kYXRhLnBhdGNoCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAxMS1qMmtfdXBkYXRlX2ltYWdlX2RhdGEucGF0Y2gKQEAgLTEsMTcgKzEsMTcgQEAKIGRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2oyay5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYwotaW5kZXggYjIwZjIxOS4uOTA1NmZlYiAxMDA2NDQKK2luZGV4IGFkNmUxYjg2Zi4uYmYxY2I0ZjM2IDEwMDY0NAogLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYwogKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYwotQEAgLTgyMTEsNiArODIxMSwxMiBAQCBzdGF0aWMgT1BKX0JPT0wgb3BqX2oya191cGRhdGVfaW1hZ2VfZGF0YSAob3BqX3RjZF90ICogcF90Y2QsIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgKiAqLwotICAgICAgICAgICAgICAgICBhc3NlcnQoIGxfcmVzLT54MCA+PSAwKTsKLSAgICAgICAgICAgICAgICAgYXNzZXJ0KCBsX3Jlcy0+eDEgPj0gMCk7CitAQCAtOTA4Niw2ICs5MDg2LDEyIEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3VwZGF0ZV9pbWFnZV9kYXRhKG9wal90Y2RfdCAqIHBfdGNkLAorICAgICAgICAgICogKi8KKyAgICAgICAgIGFzc2VydChyZXNfeDAgPj0gMCk7CisgICAgICAgICBhc3NlcnQocmVzX3gxID49IDApOwogKwotKyAgICAgICAgICAgICAgICAvKiBQcmV2ZW50IGJhZCBjYXN0aW5nIHRvIHVuc2lnbmVkIHZhbHVlcyBpbiB0aGUgc3Vic2VxdWVudCBsaW5lcy4gKi8KLSsgICAgICAgICAgICAgICAgaWYgKCBsX3Jlcy0+eDAgPCAwIHx8IGxfcmVzLT54MSA8IDAgfHwgbF9yZXMtPnkwIDwgMCB8fCBsX3Jlcy0+eTEgPCAwICkgewotKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0rICAgICAgICAgICAgICAgIH0KKysgICAgICAgIC8qIFByZXZlbnQgYmFkIGNhc3RpbmcgdG8gdW5zaWduZWQgdmFsdWVzIGluIHRoZSBzdWJzZXF1ZW50IGxpbmVzLiAqLworKyAgICAgICAgaWYgKCByZXNfeDAgPCAwIHx8IHJlc194MSA8IDAgfHwgcmVzX3kwIDwgMCB8fCByZXNfeTEgPCAwICkgeworKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisrICAgICAgICB9CiArCi0gICAgICAgICAgICAgICAgIGlmICggbF94MF9kZXN0IDwgKE9QSl9VSU5UMzIpbF9yZXMtPngwICkgewotICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3RhcnRfeF9kZXN0ID0gKE9QSl9VSU5UMzIpbF9yZXMtPngwIC0gbF94MF9kZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgIGxfb2Zmc2V0X3gwX3NyYyA9IDA7CisgICAgICAgICBpZiAobF94MF9kZXN0IDwgKE9QSl9VSU5UMzIpcmVzX3gwKSB7CisgICAgICAgICAgICAgbF9zdGFydF94X2Rlc3QgPSAoT1BKX1VJTlQzMilyZXNfeDAgLSBsX3gwX2Rlc3Q7CisgICAgICAgICAgICAgbF9vZmZzZXRfeDBfc3JjID0gMDsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAxMi1tY3Rfc3NlLnBhdGNoIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDEyLW1jdF9zc2UucGF0Y2gKaW5kZXggYmYwODI3Ni4uOWJjMmU2ZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDEyLW1jdF9zc2UucGF0Y2gKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDEyLW1jdF9zc2UucGF0Y2gKQEAgLTEsNSArMSw1IEBACiBkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9tY3QuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvbWN0LmMKLWluZGV4IDhiMDI3NmYuLjc3MzFjMTUgMTAwNjQ0CitpbmRleCBiNzlkNGI4N2MuLjgxZWMyMjNkOCAxMDA2NDQKIC0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvbWN0LmMKICsrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvbWN0LmMKIEBAIC0zNywxMyArMzcsMTYgQEAKQEAgLTIyLDM5ICsyMiwzOSBAQAogICNpbmNsdWRlIDxzbW1pbnRyaW4uaD4KICAjZW5kaWYKICAKLUBAIC03Miw3ICs3NSw3IEBAIGNvbnN0IE9QSl9GTE9BVDY0ICogb3BqX21jdF9nZXRfbWN0X25vcm1zX3JlYWwgKCkKK0BAIC03Miw3ICs3NSw3IEBAIGNvbnN0IE9QSl9GTE9BVDY0ICogb3BqX21jdF9nZXRfbWN0X25vcm1zX3JlYWwoKQogIC8qIDxzdW1tYXJ5PiAqLwogIC8qIEZvcndhcmQgcmV2ZXJzaWJsZSBNQ1QuICovCiAgLyogPC9zdW1tYXJ5PiAqLwogLSNpZmRlZiBfX1NTRTJfXwogKyNpZmRlZiBVU0VfU1NFMgogIHZvaWQgb3BqX21jdF9lbmNvZGUoCi0gCQlPUEpfSU5UMzIqIHJlc3RyaWN0IGMwLAotIAkJT1BKX0lOVDMyKiByZXN0cmljdCBjMSwKLUBAIC0xMzcsNyArMTQwLDcgQEAgdm9pZCBvcGpfbWN0X2VuY29kZSgKKyAgICAgT1BKX0lOVDMyKiBPUEpfUkVTVFJJQ1QgYzAsCisgICAgIE9QSl9JTlQzMiogT1BKX1JFU1RSSUNUIGMxLAorQEAgLTE0MSw3ICsxNDQsNyBAQCB2b2lkIG9wal9tY3RfZW5jb2RlKAogIC8qIDxzdW1tYXJ5PiAqLwogIC8qIEludmVyc2UgcmV2ZXJzaWJsZSBNQ1QuICovCiAgLyogPC9zdW1tYXJ5PiAqLwogLSNpZmRlZiBfX1NTRTJfXwogKyNpZmRlZiBVU0VfU1NFMgogIHZvaWQgb3BqX21jdF9kZWNvZGUoCi0gCQlPUEpfSU5UMzIqIHJlc3RyaWN0IGMwLAotIAkJT1BKX0lOVDMyKiByZXN0cmljdCBjMSwKLUBAIC0yMDQsNyArMjA3LDcgQEAgT1BKX0ZMT0FUNjQgb3BqX21jdF9nZXRub3JtKE9QSl9VSU5UMzIgY29tcG5vKSB7CisgICAgIE9QSl9JTlQzMiogT1BKX1JFU1RSSUNUIGMwLAorICAgICBPUEpfSU5UMzIqIE9QSl9SRVNUUklDVCBjMSwKK0BAIC0yMDksNyArMjEyLDcgQEAgT1BKX0ZMT0FUNjQgb3BqX21jdF9nZXRub3JtKE9QSl9VSU5UMzIgY29tcG5vKQogIC8qIDxzdW1tYXJ5PiAqLwogIC8qIEZvcndhcmQgaXJyZXZlcnNpYmxlIE1DVC4gKi8KICAvKiA8L3N1bW1hcnk+ICovCiAtI2lmZGVmIF9fU1NFNF8xX18KICsjaWZkZWYgVVNFX1NTRTQKICB2b2lkIG9wal9tY3RfZW5jb2RlX3JlYWwoCi0gCQkJCQkJCQkJCQkJIE9QSl9JTlQzMiogcmVzdHJpY3QgYzAsCi0gCQkJCQkJCQkJCQkJIE9QSl9JTlQzMiogcmVzdHJpY3QgYzEsCi1AQCAtMzc3LDcgKzM4MCw3IEBAIHZvaWQgb3BqX21jdF9kZWNvZGVfcmVhbCgKLSAJCU9QSl9VSU5UMzIgbikKKyAgICAgT1BKX0lOVDMyKiBPUEpfUkVTVFJJQ1QgYzAsCisgICAgIE9QSl9JTlQzMiogT1BKX1JFU1RSSUNUIGMxLAorQEAgLTM4OSw3ICszOTIsNyBAQCB2b2lkIG9wal9tY3RfZGVjb2RlX3JlYWwoCisgICAgIE9QSl9TSVpFX1QgbikKICB7Ci0gCU9QSl9VSU5UMzIgaTsKKyAgICAgT1BKX1VJTlQzMiBpOwogLSNpZmRlZiBfX1NTRV9fCiArI2lmZGVmIFVTRV9TU0UKLSAJX19tMTI4IHZydiwgdmd1LCB2Z3YsIHZidTsKLSAJdnJ2ID0gX21tX3NldDFfcHMoMS40MDJmKTsKLSAJdmd1ID0gX21tX3NldDFfcHMoMC4zNDQxM2YpOworICAgICBfX20xMjggdnJ2LCB2Z3UsIHZndiwgdmJ1OworICAgICB2cnYgPSBfbW1fc2V0MV9wcygxLjQwMmYpOworICAgICB2Z3UgPSBfbW1fc2V0MV9wcygwLjM0NDEzZik7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMTMtYXR0cmliX2ZpeC5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAxMy1hdHRyaWJfZml4LnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzEzMzA0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAxMy1hdHRyaWJfZml4LnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2luY2x1ZGVzLmggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9pbmNsdWRlcy5oDQotaW5kZXggZjg1NWI3Yy4uNWFkZDA5MSAxMDA2NDQNCi0tLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9pbmNsdWRlcy5oDQotKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfaW5jbHVkZXMuaA0KLUBAIC0xMDIsMTIgKzEwMiw2IEBADQotICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotICovDQotDQotLS8qIElnbm9yZSBHQ0MgYXR0cmlidXRlcyBpZiB0aGlzIGlzIG5vdCBHQ0MgKi8NCi0tI2lmbmRlZiBfX0dOVUNfXw0KLS0gICAgICAgI2RlZmluZSBfX2F0dHJpYnV0ZV9fKHgpIC8qIF9fYXR0cmlidXRlX18oeCkgKi8NCi0tI2VuZGlmDQotLQ0KLS0NCi0gLyogQXJlIHJlc3RyaWN0ZWQgcG9pbnRlcnMgYXZhaWxhYmxlPyAoQzk5KSAqLw0KLSAjaWYgKF9fU1REQ19WRVJTSU9OX18gIT0gMTk5OTAxTCkNCi0gICAgICAgIC8qIE5vdCBhIEM5OSBjb21waWxlciAqLw0KLQ0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAxNC1vcGpfanAyX3JlYWRfaWhkcl9sZWFrLnBhdGNoIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDE0LW9wal9qcDJfcmVhZF9paGRyX2xlYWsucGF0Y2gKaW5kZXggZjU2NDUzMy4uMGFlMGNmYyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDE0LW9wal9qcDJfcmVhZF9paGRyX2xlYWsucGF0Y2gKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDE0LW9wal9qcDJfcmVhZF9paGRyX2xlYWsucGF0Y2gKQEAgLTEsMjggKzEsMjAgQEAKIGRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2pwMi5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYwotaW5kZXggM2JjYjQyZS4uYTY2NDhmNiAxMDA2NDQKK2luZGV4IDdlZjdjOTEzOS4uMWZhNjA3ZDY2IDEwMDY0NAogLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYwogKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYwotQEAgLTU2MSw2ICs1NjEsNyBAQCBzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2loZHIoIG9wal9qcDJfdCAqanAyLAotIAlwX2ltYWdlX2hlYWRlcl9kYXRhICs9IDI7CitAQCAtNTkzLDYgKzU5Myw3IEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfaWhkcihvcGpfanAyX3QgKmpwMiwKKyAgICAgfQogIAotIAkvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbXBvbmVudHMgKi8KLSsJb3BqX2ZyZWUoanAyLT5jb21wcyk7Ci0gCWpwMi0+Y29tcHMgPSAob3BqX2pwMl9jb21wc190Kikgb3BqX2NhbGxvYyhqcDItPm51bWNvbXBzLCBzaXplb2Yob3BqX2pwMl9jb21wc190KSk7Ci0gCWlmIChqcDItPmNvbXBzID09IDApIHsKLSAJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBoYW5kbGUgaW1hZ2UgaGVhZGVyIChpaGRyKVxuIik7Ci1AQCAtMTc1OCw2ICsxNzU5LDcgQEAgdm9pZCBvcGpfanAyX3NldHVwX2RlY29kZXIob3BqX2pwMl90ICpqcDIsIG9wal9kcGFyYW1ldGVyc190ICpwYXJhbWV0ZXJzKQorICAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbXBvbmVudHMgKi8KKysgICAgb3BqX2ZyZWUoanAyLT5jb21wcyk7CisgICAgIGpwMi0+Y29tcHMgPSAob3BqX2pwMl9jb21wc190Kikgb3BqX2NhbGxvYyhqcDItPm51bWNvbXBzLAorICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9wal9qcDJfY29tcHNfdCkpOworICAgICBpZiAoanAyLT5jb21wcyA9PSAwKSB7CitAQCAtMTg4Miw2ICsxODgzLDcgQEAgdm9pZCBvcGpfanAyX3NldHVwX2RlY29kZXIob3BqX2pwMl90ICpqcDIsIG9wal9kcGFyYW1ldGVyc190ICpwYXJhbWV0ZXJzKQogIAotIAkvKiBmdXJ0aGVyIEpQMiBpbml0aWFsaXphdGlvbnMgZ28gaGVyZSAqLwotIAlqcDItPmNvbG9yLmpwMl9oYXNfY29sciA9IDA7Ci0rCWpwMi0+Y29tcHMgPSBOVUxMOwotICAgICBqcDItPmlnbm9yZV9wY2xyX2NtYXBfY2RlZiA9IHBhcmFtZXRlcnMtPmZsYWdzICYgT1BKX0RQQVJBTUVURVJTX0lHTk9SRV9QQ0xSX0NNQVBfQ0RFRl9GTEFHOworICAgICAvKiBmdXJ0aGVyIEpQMiBpbml0aWFsaXphdGlvbnMgZ28gaGVyZSAqLworICAgICBqcDItPmNvbG9yLmpwMl9oYXNfY29sciA9IDA7CisrICAgIGpwMi0+Y29tcHMgPSBOVUxMOworICAgICBqcDItPmlnbm9yZV9wY2xyX2NtYXBfY2RlZiA9IHBhcmFtZXRlcnMtPmZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRFBBUkFNRVRFUlNfSUdOT1JFX1BDTFJfQ01BUF9DREVGX0ZMQUc7CiAgfQotIAotQEAgLTE4MTUsNyArMTgxNyw2IEBAIE9QSl9CT09MIG9wal9qcDJfc2V0dXBfZW5jb2RlcigJb3BqX2pwMl90ICpqcDIsCi0gCWpwMi0+bnVtY29tcHMgPSBpbWFnZS0+bnVtY29tcHM7CS8qIE5DICovCi0gCWpwMi0+Y29tcHMgPSAob3BqX2pwMl9jb21wc190Kikgb3BqX21hbGxvYyhqcDItPm51bWNvbXBzICogc2l6ZW9mKG9wal9qcDJfY29tcHNfdCkpOwotIAlpZiAoIWpwMi0+Y29tcHMpIHsKLS0JCWpwMi0+Y29tcHMgPSBOVUxMOwotIAkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHdoZW4gc2V0dXAgdGhlIEpQMiBlbmNvZGVyXG4iKTsKLSAJCS8qIE1lbW9yeSBvZiBqcDItPmNsIHdpbGwgYmUgZnJlZWQgYnkgb3BqX2pwMl9kZXN0cm95ICovCi0gCQlyZXR1cm4gT1BKX0ZBTFNFOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDE1LXJlYWRfU1BDb2RfU1BDb2Nfb3ZlcmZsb3cucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMTUtcmVhZF9TUENvZF9TUENvY19vdmVyZmxvdy5wYXRjaAppbmRleCA1NmYwY2YwLi43NjBlZDc0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMTUtcmVhZF9TUENvZF9TUENvY19vdmVyZmxvdy5wYXRjaAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMTUtcmVhZF9TUENvZF9TUENvY19vdmVyZmxvdy5wYXRjaApAQCAtMSwxNSArMSwxNSBAQAogZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2oyay5jCi1pbmRleCA5MDU2ZmViLi5jN2FhOGRiIDEwMDY0NAoraW5kZXggOGUzNWIzM2VlLi5kOTU5NjNhNWMgMTAwNjQ0CiAtLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2oyay5jCiArKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2oyay5jCi1AQCAtODc0NCw3ICs4NzQ0LDkgQEAgc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9TUENvZF9TUENvYyggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcDsKK0BAIC05NTI3LDYgKzk1MjcsMTAgQEAgc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9TUENvZF9TUENvYyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOwogIAotICAgICAgICAgLyogcHJlY29uZGl0aW9uIGFnYWluICovCi0tICAgICAgICBhc3NlcnQoY29tcG5vIDwgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMpOwotKyAgICAgICAgaWYgKGNvbXBubyA+PSBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcykgewotKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotKyAgICAgICAgfQorICAgICAvKiBwcmVjb25kaXRpb24gYWdhaW4gKi8KKysgICAgaWYgKGNvbXBubyA+PSBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcykgeworKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKysgICAgfQorKworICAgICBhc3NlcnQoY29tcG5vIDwgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMpOwogIAotICAgICAgICAgbF90Y2NwID0gJmxfdGNwLT50Y2Nwc1tjb21wbm9dOwotICAgICAgICAgbF9jdXJyZW50X3B0ciA9IHBfaGVhZGVyX2RhdGE7CisgICAgIGxfdGNjcCA9ICZsX3RjcC0+dGNjcHNbY29tcG5vXTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAxNi1yZWFkX1NRY2RfU1FjY19vdmVyZmxvdy5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAxNi1yZWFkX1NRY2RfU1FjY19vdmVyZmxvdy5wYXRjaAppbmRleCA3YjhiZmNhLi5kN2UwNmVhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMTYtcmVhZF9TUWNkX1NRY2Nfb3ZlcmZsb3cucGF0Y2gKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDE2LXJlYWRfU1FjZF9TUWNjX292ZXJmbG93LnBhdGNoCkBAIC0xLDE1ICsxLDE1IEBACiBkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmMKLWluZGV4IGM3YWE4ZGIuLmI1ZjZmZTkgMTAwNjQ0CitpbmRleCBkOTU5NjNhNWMuLmVkNDQ5Njg0ZiAxMDA2NDQKIC0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmMKICsrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmMKLUBAIC05MDEwLDcgKzkwMTAsOSBAQCBzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX1NRY2RfU1FjYyhvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3A7CitAQCAtOTg2NCw3ICs5ODY0LDkgQEAgc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9TUWNkX1NRY2Mob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcDsKICAKLSAgICAgICAgIC8qIHByZWNvbmRpdGlvbiBhZ2FpbiovCi0tICAgICAgICBhc3NlcnQocF9jb21wX25vIDwgIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzKTsKLSsgICAgICAgIGlmIChwX2NvbXBfbm8gPj0gIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzKSB7Ci0rICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSsgICAgICAgIH0KKyAgICAgLyogcHJlY29uZGl0aW9uIGFnYWluKi8KKy0gICAgYXNzZXJ0KHBfY29tcF9ubyA8ICBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcyk7CisrICAgIGlmIChwX2NvbXBfbm8gPj0gIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzKSB7CisrICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworKyAgICB9CiAgCi0gICAgICAgICBsX3RjY3AgPSAmbF90Y3AtPnRjY3BzW3BfY29tcF9ub107Ci0gICAgICAgICBsX2N1cnJlbnRfcHRyID0gcF9oZWFkZXJfZGF0YTsKKyAgICAgbF90Y2NwID0gJmxfdGNwLT50Y2Nwc1twX2NvbXBfbm9dOworICAgICBsX2N1cnJlbnRfcHRyID0gcF9oZWFkZXJfZGF0YTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAxNy10Y2RfaW5pdF90aWxlLnBhdGNoIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDE3LXRjZF9pbml0X3RpbGUucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNGFjOWYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDE3LXRjZF9pbml0X3RpbGUucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1kaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDE3LXRjZF9pbml0X3RpbGUucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMTctdGNkX2luaXRfdGlsZS5wYXRjaAotbmV3IGZpbGUgbW9kZSAxMDA2NDQKLWluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL1JFQURNRS5wZGZpdW0gYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL1JFQURNRS5wZGZpdW0KLWluZGV4IDQ4NTJhNDIuLjk3ZTZlOGMgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL1JFQURNRS5wZGZpdW0KLSsrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvUkVBRE1FLnBkZml1bQotQEAgLTI2LDQgKzI2LDUgQEAgTG9jYWwgTW9kaWZpY2F0aW9uczoKLSAwMDE0LW9wal9qcDJfcmVhZF9paGRyX2xlYWsucGF0Y2g6IE1lbW9yeSBsZWFrIGluIG9wal9qcDJfcmVhZF9paGRyKCkuCi0gMDAxNS1yZWFkX1NQQ29kX1NQQ29jX292ZXJmbG93LnBhdGNoOiBQcmV2ZW50IGEgYnVmZmVyIG92ZXJmbG93IGluIG9wal9qMmtfcmVhZF9TUENvZF9TUENvYy4KLSAwMDE2LXJlYWRfU1FjZF9TUWNjX292ZXJmbG93LnBhdGNoOiBQcmV2ZW50IGEgYnVmZmVyIG92ZXJmbG93IGluIG9wal9qMmtfcmVhZF9TUWNkX1NRY2MuCi0rMDAxNy10Y2RfaW5pdF90aWxlLnBhdGNoOiBQcmV2ZW50IGludGVnZXIgb3ZlcmZsb3dzIGR1cmluZyBjYWxjdWxhdGlvbiBvZiB8bF9uYl9wcmVjaW5jdF9zaXplfC4KLSBUT0RPKHRoZXN0aWcpOiBMaXN0IGFsbCB0aGUgb3RoZXIgcGF0Y2hlcy4KLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3RjZC5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Y2QuYwotaW5kZXggYWViZTliZS4uNjczNjMzYyAxMDA2NDQKLS0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGNkLmMKLSsrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGNkLmMKLUBAIC04MjIsNyArODIyLDE0IEBAIHN0YXRpYyBJTkxJTkUgT1BKX0JPT0wgb3BqX3RjZF9pbml0X3RpbGUob3BqX3RjZF90ICpwX3RjZCwgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCi0gCQkJbF9yZXMtPnBoID0gKGxfcmVzLT55MCA9PSBsX3Jlcy0+eTEpID8gMCA6IChPUEpfVUlOVDMyKSgobF9icl9wcmNfeV9lbmQgLSBsX3RsX3ByY195X3N0YXJ0KSA+PiBsX3BkeSk7Ci0gCQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0XHRcdHJlc19wdz0lZCwgcmVzX3BoPSVkXG4iLCBsX3Jlcy0+cHcsIGxfcmVzLT5waCApOyovCi0gCQkJCi0rCQkJaWYgKGxfcmVzLT5wdyAmJiAoKE9QSl9VSU5UMzIpLTEpIC8gbF9yZXMtPnB3IDwgbF9yZXMtPnBoKSB7Ci0rCQkJCXJldHVybiBPUEpfRkFMU0U7Ci0rCQkJfQotIAkJCWxfbmJfcHJlY2luY3RzID0gbF9yZXMtPnB3ICogbF9yZXMtPnBoOwotKwotKwkJCWlmICgoKE9QSl9VSU5UMzIpLTEpIC8gKE9QSl9VSU5UMzIpc2l6ZW9mKG9wal90Y2RfcHJlY2luY3RfdCkgPCBsX25iX3ByZWNpbmN0cykgewotKwkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotKwkJCX0KLSAJCQlsX25iX3ByZWNpbmN0X3NpemUgPSBsX25iX3ByZWNpbmN0cyAqIChPUEpfVUlOVDMyKXNpemVvZihvcGpfdGNkX3ByZWNpbmN0X3QpOwotIAkJCWlmIChyZXNubyA9PSAwKSB7Ci0gCQkJCXRsY2JneHN0YXJ0ID0gbF90bF9wcmNfeF9zdGFydDsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAxOC10Y2RfZ2V0X2RlY29kZWRfdGlsZV9zaXplLnBhdGNoIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDE4LXRjZF9nZXRfZGVjb2RlZF90aWxlX3NpemUucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYWY2ODcuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDE4LXRjZF9nZXRfZGVjb2RlZF90aWxlX3NpemUucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi1kaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDE4LXRjZF9nZXRfZGVjb2RlZF90aWxlX3NpemUucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMTgtdGNkX2dldF9kZWNvZGVkX3RpbGVfc2l6ZS5wYXRjaAotbmV3IGZpbGUgbW9kZSAxMDA2NDQKLWluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL1JFQURNRS5wZGZpdW0gYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL1JFQURNRS5wZGZpdW0KLWluZGV4IDk3ZTZlOGMuLmE5ZTI4OWQgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL1JFQURNRS5wZGZpdW0KLSsrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvUkVBRE1FLnBkZml1bQotQEAgLTI3LDQgKzI3LDUgQEAgTG9jYWwgTW9kaWZpY2F0aW9uczoKLSAwMDE1LXJlYWRfU1BDb2RfU1BDb2Nfb3ZlcmZsb3cucGF0Y2g6IFByZXZlbnQgYSBidWZmZXIgb3ZlcmZsb3cgaW4gb3BqX2oya19yZWFkX1NQQ29kX1NQQ29jLgotIDAwMTYtcmVhZF9TUWNkX1NRY2Nfb3ZlcmZsb3cucGF0Y2g6IFByZXZlbnQgYSBidWZmZXIgb3ZlcmZsb3cgaW4gb3BqX2oya19yZWFkX1NRY2RfU1FjYy4KLSAwMDE3LXRjZF9pbml0X3RpbGUucGF0Y2g6IFByZXZlbnQgaW50ZWdlciBvdmVyZmxvd3MgZHVyaW5nIGNhbGN1bGF0aW9uIG9mIHxsX25iX3ByZWNpbmN0X3NpemV8LgotKzAwMTgtdGNkX2dldF9kZWNvZGVkX3RpbGVfc2l6ZS5wYXRjaDogRml4IGFuIGludGVnZXIgb3ZlcmZsb3cgaW4gb3BqX3RjZF9nZXRfZGVjb2RlZF90aWxlX3NpemUuCi0gVE9ETyh0aGVzdGlnKTogTGlzdCBhbGwgdGhlIG90aGVyIHBhdGNoZXMuCi1kaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmMKLWluZGV4IGI1ZjZmZTkuLjYzNDZjMjEgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2oyay5jCi0rKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2oyay5jCi1AQCAtODAyOCw2ICs4MDI4LDEwIEBAIE9QSl9CT09MIG9wal9qMmtfcmVhZF90aWxlX2hlYWRlciggICAgICBvcGpfajJrX3QgKiBwX2oyaywKLSAgICAgICAgICpwX3RpbGVfaW5kZXggPSBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyOwotICAgICAgICAgKnBfZ29fb24gPSBPUEpfVFJVRTsKLSAgICAgICAgICpwX2RhdGFfc2l6ZSA9IG9wal90Y2RfZ2V0X2RlY29kZWRfdGlsZV9zaXplKHBfajJrLT5tX3RjZCk7Ci0rICAgICAgICBpZiAoKnBfZGF0YV9zaXplID09IChPUEpfVUlOVDMyKS0xKSB7Ci0rICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0rICAgICAgICB9Ci0rCi0gICAgICAgICAqcF90aWxlX3gwID0gcF9qMmstPm1fdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT54MDsKLSAgICAgICAgICpwX3RpbGVfeTAgPSBwX2oyay0+bV90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPnkwOwotICAgICAgICAgKnBfdGlsZV94MSA9IHBfajJrLT5tX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+eDE7Ci1kaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Y2QuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGNkLmMKLWluZGV4IDY3MzYzM2MuLmNkMWM0MzkgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3RjZC5jCi0rKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3RjZC5jCi1AQCAtMTE1MCw2ICsxMTUwLDcgQEAgT1BKX1VJTlQzMiBvcGpfdGNkX2dldF9kZWNvZGVkX3RpbGVfc2l6ZSAoIG9wal90Y2RfdCAqcF90Y2QgKQotICAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICogbF90aWxlX2NvbXAgPSAwMDsKLSAgICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90ICogbF9yZXMgPSAwMDsKLSAgICAgICAgIE9QSl9VSU5UMzIgbF9zaXplX2NvbXAsIGxfcmVtYWluaW5nOwotKyAgICAgICAgT1BKX1VJTlQzMiBsX3RlbXA7Ci0gCi0gICAgICAgICBsX3RpbGVfY29tcCA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5jb21wczsKLSAgICAgICAgIGxfaW1nX2NvbXAgPSBwX3RjZC0+aW1hZ2UtPmNvbXBzOwotQEAgLTExNjcsNyArMTE2OCwxOCBAQCBPUEpfVUlOVDMyIG9wal90Y2RfZ2V0X2RlY29kZWRfdGlsZV9zaXplICggb3BqX3RjZF90ICpwX3RjZCApCi0gICAgICAgICAgICAgICAgIH0KLSAKLSAgICAgICAgICAgICAgICAgbF9yZXMgPSBsX3RpbGVfY29tcC0+cmVzb2x1dGlvbnMgKyBsX3RpbGVfY29tcC0+bWluaW11bV9udW1fcmVzb2x1dGlvbnMgLSAxOwotLSAgICAgICAgICAgICAgICBsX2RhdGFfc2l6ZSArPSBsX3NpemVfY29tcCAqIChPUEpfVUlOVDMyKSgobF9yZXMtPngxIC0gbF9yZXMtPngwKSAqIChsX3Jlcy0+eTEgLSBsX3Jlcy0+eTApKTsKLSsgICAgICAgICAgICAgICAgbF90ZW1wID0gKE9QSl9VSU5UMzIpKChsX3Jlcy0+eDEgLSBsX3Jlcy0+eDApICogKGxfcmVzLT55MSAtIGxfcmVzLT55MCkpOyAvKiB4MSp5MSBjYW4ndCBvdmVyZmxvdyAqLwotKwotKyAgICAgICAgICAgICAgICBpZiAobF9zaXplX2NvbXAgJiYgKChPUEpfVUlOVDMyKS0xKSAvIGxfc2l6ZV9jb21wIDwgbF90ZW1wKSB7Ci0rICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChPUEpfVUlOVDMyKS0xOwotKyAgICAgICAgICAgICAgICB9Ci0rICAgICAgICAgICAgICAgIGxfdGVtcCAqPSBsX3NpemVfY29tcDsKLSsKLSsgICAgICAgICAgICAgICAgaWYgKGxfdGVtcCA+ICgoT1BKX1VJTlQzMiktMSkgLSBsX2RhdGFfc2l6ZSkgewotKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoT1BKX1VJTlQzMiktMTsKLSsgICAgICAgICAgICAgICAgfQotKyAgICAgICAgICAgICAgICBsX2RhdGFfc2l6ZSArPSBsX3RlbXA7Ci0rCi0gICAgICAgICAgICAgICAgICsrbF9pbWdfY29tcDsKLSAgICAgICAgICAgICAgICAgKytsX3RpbGVfY29tcDsKLSAgICAgICAgIH0KLUBAIC0xMzYyLDcgKzEzNzQsNyBAQCBPUEpfQk9PTCBvcGpfdGNkX3VwZGF0ZV90aWxlX2RhdGEgKCBvcGpfdGNkX3QgKnBfdGNkLAotICAgICAgICAgT1BKX1VJTlQzMiBsX3N0cmlkZSwgbF93aWR0aCxsX2hlaWdodDsKLSAKLSAgICAgICAgIGxfZGF0YV9zaXplID0gb3BqX3RjZF9nZXRfZGVjb2RlZF90aWxlX3NpemUocF90Y2QpOwotLSAgICAgICAgaWYgKGxfZGF0YV9zaXplID4gcF9kZXN0X2xlbmd0aCkgewotKyAgICAgICAgaWYgKGxfZGF0YV9zaXplID09IChPUEpfVUlOVDMyKS0xIHx8IGxfZGF0YV9zaXplID4gcF9kZXN0X2xlbmd0aCkgewotICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgfQotIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDE5LXRjZF9pbml0X3RpbGUucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMTktdGNkX2luaXRfdGlsZS5wYXRjaAppbmRleCBkOGUxOGZhLi5mYzVhM2FhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMTktdGNkX2luaXRfdGlsZS5wYXRjaAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMTktdGNkX2luaXRfdGlsZS5wYXRjaApAQCAtMSwzMCArMSwyMSBAQAotZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvUkVBRE1FLnBkZml1bSBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvUkVBRE1FLnBkZml1bQotaW5kZXggYTllMjg5ZC4uYjEwMTJhZiAxMDA2NDQKLS0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvUkVBRE1FLnBkZml1bQotKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9SRUFETUUucGRmaXVtCi1AQCAtMjgsNCArMjgsNSBAQCBMb2NhbCBNb2RpZmljYXRpb25zOgotIDAwMTYtcmVhZF9TUWNkX1NRY2Nfb3ZlcmZsb3cucGF0Y2g6IFByZXZlbnQgYSBidWZmZXIgb3ZlcmZsb3cgaW4gb3BqX2oya19yZWFkX1NRY2RfU1FjYy4KLSAwMDE3LXRjZF9pbml0X3RpbGUucGF0Y2g6IFByZXZlbnQgaW50ZWdlciBvdmVyZmxvd3MgZHVyaW5nIGNhbGN1bGF0aW9uIG9mIHxsX25iX3ByZWNpbmN0X3NpemV8LgotIDAwMTgtdGNkX2dldF9kZWNvZGVkX3RpbGVfc2l6ZS5wYXRjaDogRml4IGFuIGludGVnZXIgb3ZlcmZsb3cgaW4gb3BqX3RjZF9nZXRfZGVjb2RlZF90aWxlX3NpemUuCi0rMDAxOS10Y2RfaW5pdF90aWxlLnBhdGNoOiBQcmV2ZW50IGludGVnZXIgb3ZlcmZsb3dzIGR1cmluZyBjYWxjdWxhdGlvbiBvZiB8bF9uYl9jb2RlX2Jsb2Nrc19zaXplfC4KLSBUT0RPKHRoZXN0aWcpOiBMaXN0IGFsbCB0aGUgb3RoZXIgcGF0Y2hlcy4KIGRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3RjZC5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Y2QuYwotaW5kZXggY2QxYzQzOS4uOTI3MGVmZSAxMDA2NDQKK2luZGV4IGYwNzEwY2QxNC4uMzVkMTVlM2QxIDEwMDY0NAogLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Y2QuYwogKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Y2QuYwotQEAgLTkzOSw4ICs5MzksMTUgQEAgc3RhdGljIElOTElORSBPUEpfQk9PTCBvcGpfdGNkX2luaXRfdGlsZShvcGpfdGNkX3QgKnBfdGNkLCBPUEpfVUlOVDMyIHBfdGlsZV9ubywKLSAJCQkJCWxfY3VycmVudF9wcmVjaW5jdC0+Y3cgPSAoT1BKX1VJTlQzMikoKGJyY2Jsa3hlbmQgLSB0bGNibGt4c3RhcnQpID4+IGNibGt3aWR0aGV4cG4pOwotIAkJCQkJbF9jdXJyZW50X3ByZWNpbmN0LT5jaCA9IChPUEpfVUlOVDMyKSgoYnJjYmxreWVuZCAtIHRsY2Jsa3lzdGFydCkgPj4gY2Jsa2hlaWdodGV4cG4pOwotIAkJCQkJCi0rCQkJCQlpZiAobF9jdXJyZW50X3ByZWNpbmN0LT5jdyAmJiAoKE9QSl9VSU5UMzIpLTEpIC8gbF9jdXJyZW50X3ByZWNpbmN0LT5jdyA8IGxfY3VycmVudF9wcmVjaW5jdC0+Y2gpIHsKLSsJCQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotKwkJCQkJfQotIAkJCQkJbF9uYl9jb2RlX2Jsb2NrcyA9IGxfY3VycmVudF9wcmVjaW5jdC0+Y3cgKiBsX2N1cnJlbnRfcHJlY2luY3QtPmNoOwotIAkJCQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0XHRcdFx0IHByZWNpbmN0X2N3ID0gJWQgeCByZWNpbmN0X2NoID0gJWRcbiIsbF9jdXJyZW50X3ByZWNpbmN0LT5jdywgbF9jdXJyZW50X3ByZWNpbmN0LT5jaCk7ICAgICAgKi8KLSsJCQkJCQotKwkJCQkJaWYgKCgoT1BKX1VJTlQzMiktMSkgLyAoT1BKX1VJTlQzMilzaXplb2ZfYmxvY2sgPCBsX25iX2NvZGVfYmxvY2tzKSB7Ci0rCQkJCQkJcmV0dXJuIE9QSl9GQUxTRTsKLSsJCQkJCX0KLSAJCQkJCWxfbmJfY29kZV9ibG9ja3Nfc2l6ZSA9IGxfbmJfY29kZV9ibG9ja3MgKiAoT1BKX1VJTlQzMilzaXplb2ZfYmxvY2s7Ci0gCQkJCQkKLSAJCQkJCWlmICghIGxfY3VycmVudF9wcmVjaW5jdC0+Y2Jsa3MuYmxvY2tzKSB7CitAQCAtMTA0MCw5ICsxMDQwLDE1IEBAIHN0YXRpYyBJTkxJTkUgT1BKX0JPT0wgb3BqX3RjZF9pbml0X3RpbGUob3BqX3RjZF90ICpwX3RjZCwgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGt3aWR0aGV4cG4pOworICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3ByZWNpbmN0LT5jaCA9IChPUEpfVUlOVDMyKSgoYnJjYmxreWVuZCAtIHRsY2Jsa3lzdGFydCkgPj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jsa2hlaWdodGV4cG4pOworLQorKyAgICAgICAgICAgICAgICAgICAgaWYgKGxfY3VycmVudF9wcmVjaW5jdC0+Y3cgJiYgKChPUEpfVUlOVDMyKS0xKSAvIGxfY3VycmVudF9wcmVjaW5jdC0+Y3cgPCBsX2N1cnJlbnRfcHJlY2luY3QtPmNoKSB7CisrICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKysgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGxfbmJfY29kZV9ibG9ja3MgPSBsX2N1cnJlbnRfcHJlY2luY3QtPmN3ICogbF9jdXJyZW50X3ByZWNpbmN0LT5jaDsKKyAgICAgICAgICAgICAgICAgICAgIC8qZnByaW50ZihzdGRlcnIsICJcdFx0XHRcdCBwcmVjaW5jdF9jdyA9ICVkIHggcmVjaW5jdF9jaCA9ICVkXG4iLGxfY3VycmVudF9wcmVjaW5jdC0+Y3csIGxfY3VycmVudF9wcmVjaW5jdC0+Y2gpOyAgICAgICovCisrCisrICAgICAgICAgICAgICAgICAgICBpZiAoKChPUEpfVUlOVDMyKS0xKSAvIChPUEpfVUlOVDMyKXNpemVvZl9ibG9jayA8IGxfbmJfY29kZV9ibG9ja3MpIHsKKysgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgbF9uYl9jb2RlX2Jsb2Nrc19zaXplID0gbF9uYl9jb2RlX2Jsb2NrcyAqIChPUEpfVUlOVDMyKXNpemVvZl9ibG9jazsKKyAKKyAgICAgICAgICAgICAgICAgICAgIGlmICghbF9jdXJyZW50X3ByZWNpbmN0LT5jYmxrcy5ibG9ja3MgJiYgKGxfbmJfY29kZV9ibG9ja3MgPiAwVSkpIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAyMC1vcGpfYWxpZ25lZF9tYWxsb2MucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMjAtb3BqX2FsaWduZWRfbWFsbG9jLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGU2ZTk2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAyMC1vcGpfYWxpZ25lZF9tYWxsb2MucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi1kaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9SRUFETUUucGRmaXVtIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9SRUFETUUucGRmaXVtCi1pbmRleCBiMTAxMmFmLi5hNDBlZDdiIDEwMDY0NAotLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9SRUFETUUucGRmaXVtCi0rKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL1JFQURNRS5wZGZpdW0KLUBAIC0yOSw0ICsyOSw1IEBAIExvY2FsIE1vZGlmaWNhdGlvbnM6Ci0gMDAxNy10Y2RfaW5pdF90aWxlLnBhdGNoOiBQcmV2ZW50IGludGVnZXIgb3ZlcmZsb3dzIGR1cmluZyBjYWxjdWxhdGlvbiBvZiB8bF9uYl9wcmVjaW5jdF9zaXplfC4KLSAwMDE4LXRjZF9nZXRfZGVjb2RlZF90aWxlX3NpemUucGF0Y2g6IEZpeCBhbiBpbnRlZ2VyIG92ZXJmbG93IGluIG9wal90Y2RfZ2V0X2RlY29kZWRfdGlsZV9zaXplLgotIDAwMTktdGNkX2luaXRfdGlsZS5wYXRjaDogUHJldmVudCBpbnRlZ2VyIG92ZXJmbG93cyBkdXJpbmcgY2FsY3VsYXRpb24gb2YgfGxfbmJfY29kZV9ibG9ja3Nfc2l6ZXwuCi0rMDAyMC1vcGpfYWxpZ25lZF9tYWxsb2MucGF0Y2g6IFByZXZlbnQgb3ZlcmZsb3dzIHdoZW4gdXNpbmcgb3BqX2FsaWduZWRfbWFsbG9jKCkuCi0gVE9ETyh0aGVzdGlnKTogTGlzdCBhbGwgdGhlIG90aGVyIHBhdGNoZXMuCi1kaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9kd3QuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvZHd0LmMKLWluZGV4IDNiOTJiZGYuLmE2NjZkMWMgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2R3dC5jCi0rKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2R3dC5jCi1AQCAtNTc2LDYgKzU3Niw5IEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfZHd0X2RlY29kZV90aWxlKGNvbnN0IG9wal90Y2RfdGlsZWNvbXBfdCogdGlsZWMsIE9QSl9VSU5UMzIKLSAJT1BKX1VJTlQzMiB3ID0gKE9QSl9VSU5UMzIpKHRpbGVjLT54MSAtIHRpbGVjLT54MCk7Ci0gCi0gCWgubWVtX2NvdW50ID0gb3BqX2R3dF9tYXhfcmVzb2x1dGlvbih0ciwgbnVtcmVzKTsKLSsJaWYgKCgoT1BKX1VJTlQzMiktMSkgLyAoT1BKX1VJTlQzMilzaXplb2YoT1BKX0lOVDMyKSA8IChPUEpfVUlOVDMyKWgubWVtX2NvdW50KSB7Ci0rCQlyZXR1cm4gT1BKX0ZBTFNFOwotKwl9Ci0gCWgubWVtID0gKE9QSl9JTlQzMiopb3BqX2FsaWduZWRfbWFsbG9jKGgubWVtX2NvdW50ICogc2l6ZW9mKE9QSl9JTlQzMikpOwotIAlpZiAoISBoLm1lbSl7Ci0gCQkvKiBGSVhNRSBldmVudCBtYW5hZ2VyIGVycm9yIGNhbGxiYWNrICovCi1AQCAtODUwLDcgKzg1MywxNyBAQCBPUEpfQk9PTCBvcGpfZHd0X2RlY29kZV9yZWFsKG9wal90Y2RfdGlsZWNvbXBfdCogcmVzdHJpY3QgdGlsZWMsIE9QSl9VSU5UMzIgbnVtcgotIAotIAlPUEpfVUlOVDMyIHcgPSAoT1BKX1VJTlQzMikodGlsZWMtPngxIC0gdGlsZWMtPngwKTsKLSAKLS0JaC53YXZlbGV0ID0gKG9wal92NF90Kikgb3BqX2FsaWduZWRfbWFsbG9jKChvcGpfZHd0X21heF9yZXNvbHV0aW9uKHJlcywgbnVtcmVzKSs1KSAqIHNpemVvZihvcGpfdjRfdCkpOwotKwlPUEpfVUlOVDMyIG1yID0gb3BqX2R3dF9tYXhfcmVzb2x1dGlvbihyZXMsIG51bXJlcyk7Ci0rCi0rCWlmIChtciA+PSAoKE9QSl9VSU5UMzIpLTUpKSB7Ci0rCQlyZXR1cm4gT1BKX0ZBTFNFOwotKwl9Ci0rCW1yICs9IDU7Ci0rCi0rCWlmICgoKE9QSl9VSU5UMzIpLTEpIC8gKE9QSl9VSU5UMzIpc2l6ZW9mKG9wal92NF90KSA8IG1yKSB7Ci0rCQlyZXR1cm4gT1BKX0ZBTFNFOwotKwl9Ci0rCWgud2F2ZWxldCA9IChvcGpfdjRfdCopIG9wal9hbGlnbmVkX21hbGxvYyhtciAqIHNpemVvZihvcGpfdjRfdCkpOwotIAlpZiAoIWgud2F2ZWxldCkgewotIAkJLyogRklYTUUgZXZlbnQgbWFuYWdlciBlcnJvciBjYWxsYmFjayAqLwotIAkJcmV0dXJuIE9QSl9GQUxTRTsKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3QxLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3QxLmMKLWluZGV4IDEwOGNlNzguLmExMTlkYjEgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3QxLmMKLSsrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdDEuYwotQEAgLTExNzMsNiArMTE3Myw5IEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfdDFfYWxsb2NhdGVfYnVmZmVycygKLSAJaWYgKCF0MS0+ZW5jb2RlcikgewotIAkJaWYoZGF0YXNpemUgPiB0MS0+ZGF0YXNpemUpewotIAkJCW9wal9hbGlnbmVkX2ZyZWUodDEtPmRhdGEpOwotKwkJCWlmICgoKE9QSl9VSU5UMzIpLTEpIC8gKE9QSl9VSU5UMzIpc2l6ZW9mKE9QSl9JTlQzMikgPCBkYXRhc2l6ZSkgewotKwkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotKwkJCX0KLSAJCQl0MS0+ZGF0YSA9IChPUEpfSU5UMzIqKSBvcGpfYWxpZ25lZF9tYWxsb2MoZGF0YXNpemUgKiBzaXplb2YoT1BKX0lOVDMyKSk7Ci0gCQkJaWYoIXQxLT5kYXRhKXsKLSAJCQkJLyogRklYTUUgZXZlbnQgbWFuYWdlciBlcnJvciBjYWxsYmFjayAqLwotQEAgLTExODcsNiArMTE5MCw5IEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfdDFfYWxsb2NhdGVfYnVmZmVycygKLSAKLSAJaWYoZmxhZ3NzaXplID4gdDEtPmZsYWdzc2l6ZSl7Ci0gCQlvcGpfYWxpZ25lZF9mcmVlKHQxLT5mbGFncyk7Ci0rCQlpZiAoKChPUEpfVUlOVDMyKS0xKSAvIChPUEpfVUlOVDMyKXNpemVvZihvcGpfZmxhZ190KSA8IGZsYWdzc2l6ZSkgewotKwkJCXJldHVybiBPUEpfRkFMU0U7Ci0rCQl9Ci0gCQl0MS0+ZmxhZ3MgPSAob3BqX2ZsYWdfdCopIG9wal9hbGlnbmVkX21hbGxvYyhmbGFnc3NpemUgKiBzaXplb2Yob3BqX2ZsYWdfdCkpOwotIAkJaWYoIXQxLT5mbGFncyl7Ci0gCQkJLyogRklYTUUgZXZlbnQgbWFuYWdlciBlcnJvciBjYWxsYmFjayAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDIxLXRjZF9pbml0X3RpbGVfbmVnYXRpdmUucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMjEtdGNkX2luaXRfdGlsZV9uZWdhdGl2ZS5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2OTRmOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMjEtdGNkX2luaXRfdGlsZV9uZWdhdGl2ZS5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3RjZC5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Y2QuYwotaW5kZXggOTI3MGVmZS4uMDZlZWU0ZSAxMDA2NDQKLS0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGNkLmMKLSsrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGNkLmMKLUBAIC03MDYsOSArNzA2LDE2IEBAIHN0YXRpYyBJTkxJTkUgT1BKX0JPT0wgb3BqX3RjZF9pbml0X3RpbGUob3BqX3RjZF90ICpwX3RjZCwgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCi0gCWxfdHgwID0gbF9jcC0+dHgwICsgcCAqIGxfY3AtPnRkeDsgLyogY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIGxfaW1hZ2UtPngxIHNvIHdvbid0IG92ZXJmbG93ICovCi0gCWxfdGlsZS0+eDAgPSAoT1BKX0lOVDMyKW9wal91aW50X21heChsX3R4MCwgbF9pbWFnZS0+eDApOwotIAlsX3RpbGUtPngxID0gKE9QSl9JTlQzMilvcGpfdWludF9taW4ob3BqX3VpbnRfYWRkcyhsX3R4MCwgbF9jcC0+dGR4KSwgbF9pbWFnZS0+eDEpOwotKwlpZiAobF90aWxlLT54MCA8IDAgfHwgbF90aWxlLT54MSA8IDApIHsKLSsJCXJldHVybiBPUEpfRkFMU0U7Ci0rCX0KLSsKLSAJbF90eTAgPSBsX2NwLT50eTAgKyBxICogbF9jcC0+dGR5OyAvKiBjYW4ndCBiZSBncmVhdGVyIHRoYW4gbF9pbWFnZS0+eTEgc28gd29uJ3Qgb3ZlcmZsb3cgKi8KLSAJbF90aWxlLT55MCA9IChPUEpfSU5UMzIpb3BqX3VpbnRfbWF4KGxfdHkwLCBsX2ltYWdlLT55MCk7Ci0gCWxfdGlsZS0+eTEgPSAoT1BKX0lOVDMyKW9wal91aW50X21pbihvcGpfdWludF9hZGRzKGxfdHkwLCBsX2NwLT50ZHkpLCBsX2ltYWdlLT55MSk7Ci0rCWlmIChsX3RpbGUtPnkwIDwgMCB8fCBsX3RpbGUtPnkxIDwgMCkgewotKwkJcmV0dXJuIE9QSl9GQUxTRTsKLSsJfQotIAotIAkvKiB0ZXN0Y2FzZSAxODg4LnBkZi5hc2FuLjM1Ljk4OCAqLwotIAlpZiAobF90Y2NwLT5udW1yZXNvbHV0aW9ucyA9PSAwKSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMjItanAyX2FwcGx5X3BjbHJfb3ZlcmZsb3cucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMjItanAyX2FwcGx5X3BjbHJfb3ZlcmZsb3cucGF0Y2gKaW5kZXggNzIxMDVmZS4uZjRmMmVmNSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDIyLWpwMl9hcHBseV9wY2xyX292ZXJmbG93LnBhdGNoCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAyMi1qcDJfYXBwbHlfcGNscl9vdmVyZmxvdy5wYXRjaApAQCAtMSw1MyArMSw1MiBAQAogZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvanAyLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2pwMi5jCi1pbmRleCBhNjY0OGY2Li44MTI4ZDk4IDEwMDY0NAoraW5kZXggMWZhNjA3ZDY2Li43OGEyZDIyZmYgMTAwNjQ0CiAtLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2pwMi5jCiArKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2pwMi5jCi1AQCAtOTcyLDYgKzk3MiwxNCBAQCBzdGF0aWMgdm9pZCBvcGpfanAyX2FwcGx5X3BjbHIob3BqX2ltYWdlX3QgKmltYWdlLCBvcGpfanAyX2NvbG9yX3QgKmNvbG9yKQotIAlucl9jaGFubmVscyA9IGNvbG9yLT5qcDJfcGNsci0+bnJfY2hhbm5lbHM7Ci0gCi0gCW9sZF9jb21wcyA9IGltYWdlLT5jb21wczsKLSsJLyogT3ZlcmZsb3cgY2hlY2s6IHByZXZlbnQgaW50ZWdlciBvdmVyZmxvdyAqLwotKwlmb3IgKGkgPSAwOyBpIDwgbnJfY2hhbm5lbHM7ICsraSkgewotKwkJY21wID0gY21hcFtpXS5jbXA7Ci0rCQlpZiAob2xkX2NvbXBzW2NtcF0uaCA9PSAwIHx8IG9sZF9jb21wc1tjbXBdLncgPiAoKE9QSl9VSU5UMzIpLTEpIC8gc2l6ZW9mKE9QSl9JTlQzMikgLyBvbGRfY29tcHNbY21wXS5oKSB7Ci0rCQkJcmV0dXJuOwotKwkJfQotKwl9Ci0rCi0gCW5ld19jb21wcyA9IChvcGpfaW1hZ2VfY29tcF90KikKLSAJCQlvcGpfbWFsbG9jKG5yX2NoYW5uZWxzICogc2l6ZW9mKG9wal9pbWFnZV9jb21wX3QpKTsKLSAJaWYgKCFuZXdfY29tcHMpIHsKLUBAIC0xMDExLDIyICsxMDE5LDI4IEBAIHN0YXRpYyB2b2lkIG9wal9qcDJfYXBwbHlfcGNscihvcGpfaW1hZ2VfdCAqaW1hZ2UsIG9wal9qcDJfY29sb3JfdCAqY29sb3IpCi0gCQkvKiBQYWxldHRlIG1hcHBpbmc6ICovCi0gCQljbXAgPSBjbWFwW2ldLmNtcDsgcGNvbCA9IGNtYXBbaV0ucGNvbDsKLSAJCXNyYyA9IG9sZF9jb21wc1tjbXBdLmRhdGE7Ci0tICAgIGFzc2VydCggc3JjICk7Ci0rCQlkc3QgPSBuZXdfY29tcHNbaV0uZGF0YTsKLSAJCW1heCA9IG5ld19jb21wc1tpXS53ICogbmV3X2NvbXBzW2ldLmg7Ci0gCi0rCQkvKiBQcmV2ZW50IG51bGwgcG9pbnRlciBhY2Nlc3MgKi8KLSsJCWlmICghc3JjIHx8ICFkc3QpIHsKLSsJCQlmb3IgKGogPSAwOyBqIDwgbnJfY2hhbm5lbHM7ICsraikgewotKwkJCQlvcGpfZnJlZShuZXdfY29tcHNbal0uZGF0YSk7Ci0rCQkJfQotKwkJCW9wal9mcmVlKG5ld19jb21wcyk7Ci0rCQkJbmV3X2NvbXBzID0gTlVMTDsKLSsJCQlyZXR1cm47Ci0rCQl9Ci0rCi0gCQkvKiBEaXJlY3QgdXNlOiAqLwotICAgICBpZihjbWFwW2ldLm10eXAgPT0gMCkgewotICAgICAgIGFzc2VydCggY21wID09IDAgKTsgLy8gcHJvYmFibHkgd3JvbmcuCi0tICAgICAgZHN0ID0gbmV3X2NvbXBzW2ldLmRhdGE7Ci0tICAgICAgYXNzZXJ0KCBkc3QgKTsKLSAgICAgICBmb3IoaiA9IDA7IGogPCBtYXg7ICsraikgewotICAgICAgICAgZHN0W2pdID0gc3JjW2pdOwotICAgICAgIH0KK0BAIC0xMDQ5LDYgKzEwNDksMTQgQEAgc3RhdGljIE9QSl9CT09MIG9wal9qcDJfYXBwbHlfcGNscihvcGpfaW1hZ2VfdCAqaW1hZ2UsCiAgICAgIH0KLSAgICAgZWxzZSB7Ci0gICAgICAgYXNzZXJ0KCBpID09IHBjb2wgKTsgLy8gcHJvYmFibHkgd3Jvbmc/Ci0tICAgICAgZHN0ID0gbmV3X2NvbXBzW2ldLmRhdGE7Ci0tICAgICAgYXNzZXJ0KCBkc3QgKTsKLSAgICAgICBmb3IoaiA9IDA7IGogPCBtYXg7ICsraikgewotICAgICAgICAgLyogVGhlIGluZGV4ICovCi0gICAgICAgICBpZigoayA9IHNyY1tqXSkgPCAwKSBrID0gMDsgZWxzZSBpZihrID4gdG9wX2spIGsgPSB0b3BfazsKKyAKKyAgICAgb2xkX2NvbXBzID0gaW1hZ2UtPmNvbXBzOworKyAgICAvKiBPdmVyZmxvdyBjaGVjazogcHJldmVudCBpbnRlZ2VyIG92ZXJmbG93ICovCisrICAgIGZvciAoaSA9IDA7IGkgPCBucl9jaGFubmVsczsgKytpKSB7CisrICAgICAgY21wID0gY21hcFtpXS5jbXA7CisrICAgICAgaWYgKG9sZF9jb21wc1tjbXBdLmggPT0gMCB8fCBvbGRfY29tcHNbY21wXS53ID4gKChPUEpfVUlOVDMyKS0xKSAvIHNpemVvZihPUEpfSU5UMzIpIC8gb2xkX2NvbXBzW2NtcF0uaCkgeworKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKysgICAgICB9CisrICAgIH0KKysKKyAgICAgbmV3X2NvbXBzID0gKG9wal9pbWFnZV9jb21wX3QqKQorICAgICAgICAgICAgICAgICBvcGpfbWFsbG9jKG5yX2NoYW5uZWxzICogc2l6ZW9mKG9wal9pbWFnZV9jb21wX3QpKTsKKyAgICAgaWYgKCFuZXdfY29tcHMpIHsKK0BAIC0xMDkzLDIxICsxMTAxLDI3IEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX2FwcGx5X3BjbHIob3BqX2ltYWdlX3QgKmltYWdlLAorICAgICAgICAgY21wID0gY21hcFtpXS5jbXA7CisgICAgICAgICBwY29sID0gY21hcFtpXS5wY29sOworICAgICAgICAgc3JjID0gb2xkX2NvbXBzW2NtcF0uZGF0YTsKKy0gICAgICAgIGFzc2VydChzcmMpOyAvKiB2ZXJpZmllZCBhYm92ZSAqLworKyAgICAgICAgZHN0ID0gbmV3X2NvbXBzW2ldLmRhdGE7CisgICAgICAgICBtYXggPSBuZXdfY29tcHNbaV0udyAqIG5ld19jb21wc1tpXS5oOworIAorKyAgICAgICAgLyogUHJldmVudCBudWxsIHBvaW50ZXIgYWNjZXNzICovCisrICAgICAgICBpZiAoIXNyYyB8fCAhZHN0KSB7CisrICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBucl9jaGFubmVsczsgKytqKSB7CisrICAgICAgICAgICAgb3BqX2ZyZWUobmV3X2NvbXBzW2pdLmRhdGEpOworKyAgICAgICAgICB9CisrICAgICAgICAgIG9wal9mcmVlKG5ld19jb21wcyk7CisrICAgICAgICAgIG5ld19jb21wcyA9IE5VTEw7CisrICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisrICAgICAgICB9CisrCisgICAgICAgICAvKiBEaXJlY3QgdXNlOiAqLworICAgICAgICAgaWYgKGNtYXBbaV0ubXR5cCA9PSAwKSB7CisgICAgICAgICAgICAgYXNzZXJ0KCBjbXAgPT0gMCApOyAvLyBwcm9iYWJseSB3cm9uZy4KKy0gICAgICAgICAgICBkc3QgPSBuZXdfY29tcHNbaV0uZGF0YTsKKy0gICAgICAgICAgICBhc3NlcnQoZHN0KTsKKyAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbWF4OyArK2opIHsKKyAgICAgICAgICAgICAgICAgZHN0W2pdID0gc3JjW2pdOworICAgICAgICAgICAgIH0KKyAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgYXNzZXJ0KCBpID09IHBjb2wgKTsgLy8gcHJvYmFibHkgd3Jvbmc/CistICAgICAgICAgICAgZHN0ID0gbmV3X2NvbXBzW2ldLmRhdGE7CistICAgICAgICAgICAgYXNzZXJ0KGRzdCk7CisgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG1heDsgKytqKSB7CisgICAgICAgICAgICAgICAgIC8qIFRoZSBpbmRleCAqLworICAgICAgICAgICAgICAgICBpZiAoKGsgPSBzcmNbal0pIDwgMCkgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDIzLW9wal9qMmtfcmVhZF9tY3RfcmVjb3Jkcy5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAyMy1vcGpfajJrX3JlYWRfbWN0X3JlY29yZHMucGF0Y2gKaW5kZXggNjc3NWY0Zi4uYzg0MTVhZSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDIzLW9wal9qMmtfcmVhZF9tY3RfcmVjb3Jkcy5wYXRjaAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMjMtb3BqX2oya19yZWFkX21jdF9yZWNvcmRzLnBhdGNoCkBAIC0xLDMwICsxLDMxIEBACiBkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmMKLWluZGV4IDYzNDZjMjE5MC4uNDUxODdlOGU2IDEwMDY0NAoraW5kZXggZWQ0NDk2ODRmLi5jNWY5ZGQ1M2UgMTAwNjQ0CiAtLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2oyay5jCiArKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2oyay5jCi1AQCAtNTEyOSw2ICs1MTI5LDcgQEAgc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9tY3QgKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICBPUEpfVUlOVDMyIGxfdG1wOwotICAgICAgICAgT1BKX1VJTlQzMiBsX2luZGl4OwotICAgICAgICAgb3BqX21jdF9kYXRhX3QgKiBsX21jdF9kYXRhOwotKyAgICAgICAgT1BKX0JPT0wgbmV3X21jdCA9IE9QSl9GQUxTRTsKK0BAIC01NTUzLDYgKzU1NTMsNyBAQCBzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX21jdChvcGpfajJrX3QgKnBfajJrLAorICAgICBPUEpfVUlOVDMyIGxfdG1wOworICAgICBPUEpfVUlOVDMyIGxfaW5kaXg7CisgICAgIG9wal9tY3RfZGF0YV90ICogbF9tY3RfZGF0YTsKKysgICAgT1BKX0JPT0wgbmV3X21jdCA9IE9QSl9GQUxTRTsKICAKLSAgICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKLUBAIC01MTkxLDcgKzUxOTIsNyBAQCBzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX21jdCAoICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgfQotIAotICAgICAgICAgICAgICAgICBsX21jdF9kYXRhID0gbF90Y3AtPm1fbWN0X3JlY29yZHMgKyBsX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsKLS0gICAgICAgICAgICAgICAgKytsX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsKLSsgICAgICAgICAgICAgICAgbmV3X21jdCA9IE9QSl9UUlVFOworICAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKK0BAIC01NjQwLDcgKzU2NDEsNyBAQCBzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX21jdChvcGpfajJrX3QgKnBfajJrLAogICAgICAgICAgfQogIAotICAgICAgICAgaWYgKGxfbWN0X2RhdGEtPm1fZGF0YSkgewotQEAgLTUyMjEsNiArNTIyMiw5IEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfbWN0ICggICAgICBvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgbF9tY3RfZGF0YSA9IGxfdGNwLT5tX21jdF9yZWNvcmRzICsgbF90Y3AtPm1fbmJfbWN0X3JlY29yZHM7CistICAgICAgICArK2xfdGNwLT5tX25iX21jdF9yZWNvcmRzOworKyAgICAgICAgbmV3X21jdCA9IE9QSl9UUlVFOworICAgICB9CiAgCi0gICAgICAgICBsX21jdF9kYXRhLT5tX2RhdGFfc2l6ZSA9IHBfaGVhZGVyX3NpemU7CisgICAgIGlmIChsX21jdF9kYXRhLT5tX2RhdGEpIHsKK0BAIC01NjcyLDYgKzU2NzMsOSBAQCBzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX21jdChvcGpfajJrX3QgKnBfajJrLAogIAotKyAgICAgICAgaWYgKG5ld19tY3QpIHsKLSsgICAgICAgICAgICAgICAgKytsX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsKLSsgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAgbF9tY3RfZGF0YS0+bV9kYXRhX3NpemUgPSBwX2hlYWRlcl9zaXplOworIAorKyAgICBpZiAobmV3X21jdCkgeworKyAgICAgICAgICAgICsrbF90Y3AtPm1fbmJfbWN0X3JlY29yZHM7CisrICAgIH0KKyAgICAgcmV0dXJuIE9QSl9UUlVFOwogIH0KKyAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAyNC1sX21hcmtlcl9zaXplX2NoZWNrLnBhdGNoIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDI0LWxfbWFya2VyX3NpemVfY2hlY2sucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMDIwYzkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDI0LWxfbWFya2VyX3NpemVfY2hlY2sucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1kaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmMKLWluZGV4IDQ1MTg3ZThlNi4uNWRlODljZjBlIDEwMDY0NAotLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYwotKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYwotQEAgLTcxOTUsNiArNzE5NSwxMCBAQCBzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2hlYWRlcl9wcm9jZWR1cmUoIG9wal9qMmtfdCAqcF9qMmssCi0gCi0gICAgICAgICAgICAgICAgIC8qIHJlYWQgMiBieXRlcyBhcyB0aGUgbWFya2VyIHNpemUgKi8KLSAgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsJmxfbWFya2VyX3NpemUsMik7Ci0rICAgICAgICAgICAgICAgIGlmIChsX21hcmtlcl9zaXplIDwgMikgewotKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbnZhbGlkIG1hcmtlciBzaXplXG4iKTsKLSsgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotKyAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgIGxfbWFya2VyX3NpemUgLT0gMjsgLyogU3VidHJhY3QgdGhlIHNpemUgb2YgdGhlIG1hcmtlciBJRCBhbHJlYWR5IHJlYWQgKi8KLSAKLSAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIG1hcmtlciBzaXplIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgaGVhZGVyIGRhdGEgc2l6ZSAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDI1LW9wal9qMmtfYWRkX21jdF9udWxsX2RhdGEucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMjUtb3BqX2oya19hZGRfbWN0X251bGxfZGF0YS5wYXRjaAppbmRleCA0YTM3MWU1Li5iMmU3Y2RjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMjUtb3BqX2oya19hZGRfbWN0X251bGxfZGF0YS5wYXRjaAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMjUtb3BqX2oya19hZGRfbWN0X251bGxfZGF0YS5wYXRjaApAQCAtMSwyMiArMSwyMiBAQAogZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2oyay5jCi1pbmRleCA1ZGU4OWNmMGUuLjQwMGNhODA5OCAxMDA2NDQKK2luZGV4IGM1ZjlkZDUzZS4uZDMxZWIyOWE3IDEwMDY0NAogLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYwogKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYwotQEAgLTU3MTUsNyArNTcxNSw3IEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2FkZF9tY3Qob3BqX3RjcF90ICogcF90Y3AsIG9wal9pbWFnZV90ICogcF9pbWFnZSwgT1BKX1VJCitAQCAtNjIwMSw3ICs2MjAxLDcgQEAgc3RhdGljIE9QSl9CT09MIG9wal9qMmtfYWRkX21jdChvcGpfdGNwX3QgKiBwX3RjcCwgb3BqX2ltYWdlX3QgKiBwX2ltYWdlLAorICAgICBpZiAobF9kZWNvX2FycmF5KSB7CisgICAgICAgICBsX2RhdGFfc2l6ZSA9IE1DVF9FTEVNRU5UX1NJWkVbbF9kZWNvX2FycmF5LT5tX2VsZW1lbnRfdHlwZV0gKiBwX2ltYWdlLT5udW1jb21wcworICAgICAgICAgICAgICAgICAgICAgICAqIHBfaW1hZ2UtPm51bWNvbXBzOworLSAgICAgICAgaWYgKGxfZGVjb19hcnJheS0+bV9kYXRhX3NpemUgIT0gbF9kYXRhX3NpemUpIHsKKysgICAgICAgIGlmIChsX2RlY29fYXJyYXktPm1fZGF0YV9zaXplICE9IGxfZGF0YV9zaXplIHx8ICEgbF9kZWNvX2FycmF5LT5tX2RhdGEpIHsKKyAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgfQogIAotICAgICAgICAgaWYgKGxfZGVjb19hcnJheSkgewotICAgICAgICAgICAgICAgICBsX2RhdGFfc2l6ZSA9IE1DVF9FTEVNRU5UX1NJWkVbbF9kZWNvX2FycmF5LT5tX2VsZW1lbnRfdHlwZV0gKiBwX2ltYWdlLT5udW1jb21wcyAqIHBfaW1hZ2UtPm51bWNvbXBzOwotLSAgICAgICAgICAgICAgICBpZiAobF9kZWNvX2FycmF5LT5tX2RhdGFfc2l6ZSAhPSBsX2RhdGFfc2l6ZSkgewotKyAgICAgICAgICAgICAgICBpZiAobF9kZWNvX2FycmF5LT5tX2RhdGFfc2l6ZSAhPSBsX2RhdGFfc2l6ZSB8fCAhIGxfZGVjb19hcnJheS0+bV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgfQotIAotQEAgLTU3MzQsNyArNTczNCw3IEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2FkZF9tY3Qob3BqX3RjcF90ICogcF90Y3AsIG9wal9pbWFnZV90ICogcF9pbWFnZSwgT1BKX1VJCi0gCi0gICAgICAgICBpZiAobF9vZmZzZXRfYXJyYXkpIHsKLSAgICAgICAgICAgICAgICAgbF9kYXRhX3NpemUgPSBNQ1RfRUxFTUVOVF9TSVpFW2xfb2Zmc2V0X2FycmF5LT5tX2VsZW1lbnRfdHlwZV0gKiBwX2ltYWdlLT5udW1jb21wczsKLS0gICAgICAgICAgICAgICAgaWYgKGxfb2Zmc2V0X2FycmF5LT5tX2RhdGFfc2l6ZSAhPSBsX2RhdGFfc2l6ZSkgewotKyAgICAgICAgICAgICAgICBpZiAobF9vZmZzZXRfYXJyYXktPm1fZGF0YV9zaXplICE9IGxfZGF0YV9zaXplIHx8ICEgbF9vZmZzZXRfYXJyYXktPm1fZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgIH0KK0BAIC02MjIyLDcgKzYyMjIsNyBAQCBzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19hZGRfbWN0KG9wal90Y3BfdCAqIHBfdGNwLCBvcGpfaW1hZ2VfdCAqIHBfaW1hZ2UsCisgICAgIGlmIChsX29mZnNldF9hcnJheSkgeworICAgICAgICAgbF9kYXRhX3NpemUgPSBNQ1RfRUxFTUVOVF9TSVpFW2xfb2Zmc2V0X2FycmF5LT5tX2VsZW1lbnRfdHlwZV0gKgorICAgICAgICAgICAgICAgICAgICAgICBwX2ltYWdlLT5udW1jb21wczsKKy0gICAgICAgIGlmIChsX29mZnNldF9hcnJheS0+bV9kYXRhX3NpemUgIT0gbF9kYXRhX3NpemUpIHsKKysgICAgICAgIGlmIChsX29mZnNldF9hcnJheS0+bV9kYXRhX3NpemUgIT0gbF9kYXRhX3NpemUgfHwgISBsX29mZnNldF9hcnJheS0+bV9kYXRhKSB7CisgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgIH0KICAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAyNi11c2Vfb3BqX3VpbnRfY2VpbGRpdi5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAyNi11c2Vfb3BqX3VpbnRfY2VpbGRpdi5wYXRjaAppbmRleCBhMTk2YTQ0Li4wMzhmYjkwIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMjYtdXNlX29wal91aW50X2NlaWxkaXYucGF0Y2gKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDI2LXVzZV9vcGpfdWludF9jZWlsZGl2LnBhdGNoCkBAIC0xLDcwICsxLDg2IEBACiBkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmMKLWluZGV4IDQwMGNhODA5OC4uZTc3ZWRkMjJiIDEwMDY0NAoraW5kZXggYzVmOWRkNTNlLi4xODY5ODMzZjcgMTAwNjQ0CiAtLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2oyay5jCiArKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2oyay5jCi1AQCAtMjE1NSw4ICsyMTU1LDggQEAgc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9zaXoob3BqX2oya190ICpwX2oyaywKLSAgICAgICAgIH0KK0BAIC0yMzExLDEwICsyMzExLDggQEAgc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9zaXoob3BqX2oya190ICpwX2oyaywKKyAgICAgfQogIAotICAgICAgICAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHRpbGVzICovCi0tICAgICAgICBsX2NwLT50dyA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKShsX2ltYWdlLT54MSAtIGxfY3AtPnR4MCksIChPUEpfSU5UMzIpbF9jcC0+dGR4KTsKLS0gICAgICAgIGxfY3AtPnRoID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpKGxfaW1hZ2UtPnkxIC0gbF9jcC0+dHkwKSwgKE9QSl9JTlQzMilsX2NwLT50ZHkpOwotKyAgICAgICAgbF9jcC0+dHcgPSBvcGpfdWludF9jZWlsZGl2KGxfaW1hZ2UtPngxIC0gbF9jcC0+dHgwLCBsX2NwLT50ZHgpOwotKyAgICAgICAgbF9jcC0+dGggPSBvcGpfdWludF9jZWlsZGl2KGxfaW1hZ2UtPnkxIC0gbF9jcC0+dHkwLCBsX2NwLT50ZHkpOworICAgICAvKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgdGlsZXMgKi8KKy0gICAgbF9jcC0+dHcgPSAoT1BKX1VJTlQzMilvcGpfaW50X2NlaWxkaXYoKE9QSl9JTlQzMikobF9pbWFnZS0+eDEgLSBsX2NwLT50eDApLAorLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKWxfY3AtPnRkeCk7CistICAgIGxfY3AtPnRoID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpKGxfaW1hZ2UtPnkxIC0gbF9jcC0+dHkwKSwKKy0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMilsX2NwLT50ZHkpOworKyAgICBsX2NwLT50dyA9IG9wal91aW50X2NlaWxkaXYobF9pbWFnZS0+eDEgLSBsX2NwLT50eDAsIGxfY3AtPnRkeCk7CisrICAgIGxfY3AtPnRoID0gb3BqX3VpbnRfY2VpbGRpdihsX2ltYWdlLT55MSAtIGxfY3AtPnR5MCwgbF9jcC0+dGR5KTsKICAKLSAgICAgICAgIC8qIENoZWNrIHRoYXQgdGhlIG51bWJlciBvZiB0aWxlcyBpcyB2YWxpZCAqLwotICAgICAgICAgaWYgKGxfY3AtPnR3ID09IDAgfHwgbF9jcC0+dGggPT0gMCB8fCBsX2NwLT50dyA+IDY1NTM1IC8gbF9jcC0+dGgpIHsKLUBAIC0yMTcxLDggKzIxNzEsOCBAQCBzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3NpeihvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2Rpc2NhcmRfdGlsZXMpIHsKLSAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhcnRfdGlsZV94ID0gKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXJ0X3RpbGVfeCAtIGxfY3AtPnR4MCkgLyBsX2NwLT50ZHg7Ci0gICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXJ0X3RpbGVfeSA9IChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3kgLSBsX2NwLT50eTApIC8gbF9jcC0+dGR5OwotLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV94ID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3ggLSBsX2NwLT50eDApLCAoT1BKX0lOVDMyKWxfY3AtPnRkeCk7Ci0tICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3kgPSAoT1BKX1VJTlQzMilvcGpfaW50X2NlaWxkaXYoKE9QSl9JTlQzMikocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeSAtIGxfY3AtPnR5MCksIChPUEpfSU5UMzIpbF9jcC0+dGR5KTsKLSsgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeCA9IG9wal91aW50X2NlaWxkaXYocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeCAtIGxfY3AtPnR4MCwgbF9jcC0+dGR4KTsKLSsgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeSA9IG9wal91aW50X2NlaWxkaXYocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeSAtIGxfY3AtPnR5MCwgbF9jcC0+dGR5KTsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3ggPSAwOwotQEAgLTYzNTQsOCArNjM1NCw4IEBAIE9QSl9CT09MIG9wal9qMmtfc2V0dXBfZW5jb2RlciggICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAqLworICAgICAvKiBDaGVjayB0aGF0IHRoZSBudW1iZXIgb2YgdGlsZXMgaXMgdmFsaWQgKi8KKyAgICAgaWYgKGxfY3AtPnR3ID09IDAgfHwgbF9jcC0+dGggPT0gMCB8fCBsX2NwLT50dyA+IDY1NTM1IC8gbF9jcC0+dGgpIHsKK0BAIC0yMzMxLDEyICsyMzI5LDEwIEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfc2l6KG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXJ0X3RpbGVfeCAtIGxfY3AtPnR4MCkgLyBsX2NwLT50ZHg7CisgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3kgPQorICAgICAgICAgICAgIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3kgLSBsX2NwLT50eTApIC8gbF9jcC0+dGR5OworLSAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoCistICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIpKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3ggLSBsX2NwLT50eDApLAorLSAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKWxfY3AtPnRkeCk7CistICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV95ID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KCgKKy0gICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMikocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeSAtIGxfY3AtPnR5MCksCistICAgICAgICAgICAgICAgIChPUEpfSU5UMzIpbF9jcC0+dGR5KTsKKysgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3ggPSBvcGpfdWludF9jZWlsZGl2KAorKyAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3ggLSBsX2NwLT50eDAsIGxfY3AtPnRkeCk7CisrICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV95ID0gb3BqX3VpbnRfY2VpbGRpdigKKysgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV95IC0gbF9jcC0+dHkwLCBsX2NwLT50ZHkpOworICAgICB9IGVsc2UgeworICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhcnRfdGlsZV94ID0gMDsKKyAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXJ0X3RpbGVfeSA9IDA7CitAQCAtNjkyMiwxMCArNjkxOCw4IEBAIE9QSl9CT09MIG9wal9qMmtfc2V0dXBfZW5jb2RlcihvcGpfajJrX3QgKnBfajJrLAorICAgICAqLwogIAotICAgICAgICAgaWYgKHBhcmFtZXRlcnMtPnRpbGVfc2l6ZV9vbikgewotLSAgICAgICAgICAgICAgICBjcC0+dHcgPSAoT1BKX1VJTlQzMilvcGpfaW50X2NlaWxkaXYoKE9QSl9JTlQzMikoaW1hZ2UtPngxIC0gY3AtPnR4MCksIChPUEpfSU5UMzIpY3AtPnRkeCk7Ci0tICAgICAgICAgICAgICAgIGNwLT50aCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKShpbWFnZS0+eTEgLSBjcC0+dHkwKSwgKE9QSl9JTlQzMiljcC0+dGR5KTsKLSsgICAgICAgICAgICAgICAgY3AtPnR3ID0gb3BqX3VpbnRfY2VpbGRpdihpbWFnZS0+eDEgLSBjcC0+dHgwLCBjcC0+dGR4KTsKLSsgICAgICAgICAgICAgICAgY3AtPnRoID0gb3BqX3VpbnRfY2VpbGRpdihpbWFnZS0+eTEgLSBjcC0+dHkwLCBjcC0+dGR5KTsKLSAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgIGNwLT50ZHggPSBpbWFnZS0+eDEgLSBjcC0+dHgwOwotICAgICAgICAgICAgICAgICBjcC0+dGR5ID0gaW1hZ2UtPnkxIC0gY3AtPnR5MDsKLUBAIC04NTI5LDggKzg1MjksOCBAQCBPUEpfQk9PTCBvcGpfajJrX3NldF9kZWNvZGVfYXJlYSggICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIGxfaCxsX3c7CisgICAgIGlmIChwYXJhbWV0ZXJzLT50aWxlX3NpemVfb24pIHsKKy0gICAgICAgIGNwLT50dyA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKShpbWFnZS0+eDEgLSBjcC0+dHgwKSwKKy0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKWNwLT50ZHgpOworLSAgICAgICAgY3AtPnRoID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpKGltYWdlLT55MSAtIGNwLT50eTApLAorLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfSU5UMzIpY3AtPnRkeSk7CisrICAgICAgICBjcC0+dHcgPSBvcGpfdWludF9jZWlsZGl2KGltYWdlLT54MSAtIGNwLT50eDAsIGNwLT50ZHgpOworKyAgICAgICAgY3AtPnRoID0gb3BqX3VpbnRfY2VpbGRpdihpbWFnZS0+eTEgLSBjcC0+dHkwLCBjcC0+dGR5KTsKKyAgICAgfSBlbHNlIHsKKyAgICAgICAgIGNwLT50ZHggPSBpbWFnZS0+eDEgLSBjcC0+dHgwOworICAgICAgICAgY3AtPnRkeSA9IGltYWdlLT55MSAtIGNwLT50eTA7CitAQCAtOTIzNywxMCArOTIzMSw4IEBAIE9QSl9CT09MIG9wal9qMmtfc2V0X2RlY29kZV9hcmVhKG9wal9qMmtfdCAqcF9qMmssCisgICAgIGZvciAoaXRfY29tcCA9IDA7IGl0X2NvbXAgPCBwX2ltYWdlLT5udW1jb21wczsgKytpdF9jb21wKSB7CisgICAgICAgICBPUEpfSU5UMzIgbF9oLCBsX3c7CiAgCi0tICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPngwID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpcF9pbWFnZS0+eDAsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHgpOwotLSAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT55MCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKXBfaW1hZ2UtPnkwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR5KTsKLSsgICAgICAgICAgICAgICAgbF9pbWdfY29tcC0+eDAgPSBvcGpfdWludF9jZWlsZGl2KHBfaW1hZ2UtPngwLCBsX2ltZ19jb21wLT5keCk7Ci0rICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPnkwID0gb3BqX3VpbnRfY2VpbGRpdihwX2ltYWdlLT55MCwgbF9pbWdfY29tcC0+ZHkpOwotICAgICAgICAgICAgICAgICBsX2NvbXBfeDEgPSBvcGpfaW50X2NlaWxkaXYoKE9QSl9JTlQzMilwX2ltYWdlLT54MSwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keCk7Ci0gICAgICAgICAgICAgICAgIGxfY29tcF95MSA9IG9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKXBfaW1hZ2UtPnkxLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR5KTsKKy0gICAgICAgIGxfaW1nX2NvbXAtPngwID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpcF9pbWFnZS0+eDAsCistICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHgpOworLSAgICAgICAgbF9pbWdfY29tcC0+eTAgPSAoT1BKX1VJTlQzMilvcGpfaW50X2NlaWxkaXYoKE9QSl9JTlQzMilwX2ltYWdlLT55MCwKKy0gICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keSk7CisrICAgICAgICBsX2ltZ19jb21wLT54MCA9IG9wal91aW50X2NlaWxkaXYocF9pbWFnZS0+eDAsIGxfaW1nX2NvbXAtPmR4KTsKKysgICAgICAgIGxfaW1nX2NvbXAtPnkwID0gb3BqX3VpbnRfY2VpbGRpdihwX2ltYWdlLT55MCwgbF9pbWdfY29tcC0+ZHkpOworICAgICAgICAgbF9jb21wX3gxID0gb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpcF9pbWFnZS0+eDEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHgpOworICAgICAgICAgbF9jb21wX3kxID0gb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpcF9pbWFnZS0+eTEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHkpOwogIAotQEAgLTk4ODcsOCArOTg4Nyw4IEBAIE9QSl9CT09MIG9wal9qMmtfZ2V0X3RpbGUoICAgICAgb3BqX2oya190ICpwX2oyaywKK0BAIC0xMDg0OCwxMCArMTA4NDAsOCBAQCBPUEpfQk9PTCBvcGpfajJrX2dldF90aWxlKG9wal9qMmtfdCAqcF9qMmssCiAgCi0gICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPmZhY3RvciA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPmNvbXBzW2NvbXBub10uZmFjdG9yOworICAgICAgICAgbF9pbWdfY29tcC0+ZmFjdG9yID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+Y29tcHNbY29tcG5vXS5mYWN0b3I7CiAgCi0tICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPngwID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpcF9pbWFnZS0+eDAsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHgpOwotLSAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT55MCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKXBfaW1hZ2UtPnkwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR5KTsKLSsgICAgICAgICAgICAgICAgbF9pbWdfY29tcC0+eDAgPSBvcGpfdWludF9jZWlsZGl2KHBfaW1hZ2UtPngwLCBsX2ltZ19jb21wLT5keCk7Ci0rICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPnkwID0gb3BqX3VpbnRfY2VpbGRpdihwX2ltYWdlLT55MCwgbF9pbWdfY29tcC0+ZHkpOwotICAgICAgICAgICAgICAgICBsX2NvbXBfeDEgPSBvcGpfaW50X2NlaWxkaXYoKE9QSl9JTlQzMilwX2ltYWdlLT54MSwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keCk7Ci0gICAgICAgICAgICAgICAgIGxfY29tcF95MSA9IG9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKXBfaW1hZ2UtPnkxLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR5KTsKKy0gICAgICAgIGxfaW1nX2NvbXAtPngwID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpcF9pbWFnZS0+eDAsCistICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHgpOworLSAgICAgICAgbF9pbWdfY29tcC0+eTAgPSAoT1BKX1VJTlQzMilvcGpfaW50X2NlaWxkaXYoKE9QSl9JTlQzMilwX2ltYWdlLT55MCwKKy0gICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keSk7CisrICAgICAgICBsX2ltZ19jb21wLT54MCA9IG9wal91aW50X2NlaWxkaXYocF9pbWFnZS0+eDAsIGxfaW1nX2NvbXAtPmR4KTsKKysgICAgICAgIGxfaW1nX2NvbXAtPnkwID0gb3BqX3VpbnRfY2VpbGRpdihwX2ltYWdlLT55MCwgbF9pbWdfY29tcC0+ZHkpOworICAgICAgICAgbF9jb21wX3gxID0gb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpcF9pbWFnZS0+eDEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHgpOworICAgICAgICAgbF9jb21wX3kxID0gb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpcF9pbWFnZS0+eTEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHkpOwogIAotQEAgLTEwMTY5LDggKzEwMTY5LDggQEAgc3RhdGljIHZvaWQgb3BqX2dldF90aWxlX2RpbWVuc2lvbnMob3BqX2ltYWdlX3QgKiBsX2ltYWdlLAorQEAgLTExMTYxLDEwICsxMTE1MSw4IEBAIHN0YXRpYyB2b2lkIG9wal9nZXRfdGlsZV9kaW1lbnNpb25zKG9wal9pbWFnZV90ICogbF9pbWFnZSwKICAKLSAgICAgICAgKmxfd2lkdGggID0gKE9QSl9VSU5UMzIpKGxfdGlsZWMtPngxIC0gbF90aWxlYy0+eDApOwotICAgICAgICAqbF9oZWlnaHQgPSAoT1BKX1VJTlQzMikobF90aWxlYy0+eTEgLSBsX3RpbGVjLT55MCk7Ci0tICAgICAgICpsX29mZnNldF94ID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpbF9pbWFnZS0+eDAsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHgpOwotLSAgICAgICAqbF9vZmZzZXRfeSA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKWxfaW1hZ2UtPnkwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR5KTsKLSsgICAgICAgKmxfb2Zmc2V0X3ggPSBvcGpfdWludF9jZWlsZGl2KGxfaW1hZ2UtPngwLCBsX2ltZ19jb21wLT5keCk7Ci0rICAgICAgICpsX29mZnNldF95ID0gb3BqX3VpbnRfY2VpbGRpdihsX2ltYWdlLT55MCwgbF9pbWdfY29tcC0+ZHkpOwotICAgICAgICAqbF9pbWFnZV93aWR0aCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKWxfaW1hZ2UtPngxIC0gKE9QSl9JTlQzMilsX2ltYWdlLT54MCwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keCk7Ci0gICAgICAgICpsX3N0cmlkZSA9ICpsX2ltYWdlX3dpZHRoIC0gKmxfd2lkdGg7Ci0gICAgICAgICpsX3RpbGVfb2Zmc2V0ID0gKChPUEpfVUlOVDMyKWxfdGlsZWMtPngwIC0gKmxfb2Zmc2V0X3gpICsgKChPUEpfVUlOVDMyKWxfdGlsZWMtPnkwIC0gKmxfb2Zmc2V0X3kpICogKmxfaW1hZ2Vfd2lkdGg7CisgICAgICpsX3dpZHRoICA9IChPUEpfVUlOVDMyKShsX3RpbGVjLT54MSAtIGxfdGlsZWMtPngwKTsKKyAgICAgKmxfaGVpZ2h0ID0gKE9QSl9VSU5UMzIpKGxfdGlsZWMtPnkxIC0gbF90aWxlYy0+eTApOworLSAgICAqbF9vZmZzZXRfeCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKWxfaW1hZ2UtPngwLAorLSAgICAgICAgICAgICAgICAgIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHgpOworLSAgICAqbF9vZmZzZXRfeSA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKWxfaW1hZ2UtPnkwLAorLSAgICAgICAgICAgICAgICAgIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHkpOworKyAgICAqbF9vZmZzZXRfeCA9IG9wal91aW50X2NlaWxkaXYobF9pbWFnZS0+eDAsIGxfaW1nX2NvbXAtPmR4KTsKKysgICAgKmxfb2Zmc2V0X3kgPSBvcGpfdWludF9jZWlsZGl2KGxfaW1hZ2UtPnkwLCBsX2ltZ19jb21wLT5keSk7CisgICAgICpsX2ltYWdlX3dpZHRoID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpbF9pbWFnZS0+eDEgLQorICAgICAgICAgICAgICAgICAgICAgIChPUEpfSU5UMzIpbF9pbWFnZS0+eDAsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHgpOworICAgICAqbF9zdHJpZGUgPSAqbF9pbWFnZV93aWR0aCAtICpsX3dpZHRoOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDI3LXVuZGVmaW5lZC1zaGlmdC1vcGpfdDFfZGVjb2RlX2NibGsucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMjctdW5kZWZpbmVkLXNoaWZ0LW9wal90MV9kZWNvZGVfY2Jsay5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhODc3YS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMjctdW5kZWZpbmVkLXNoaWZ0LW9wal90MV9kZWNvZGVfY2Jsay5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3QxLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3QxLmMKLWluZGV4IGExMTlkYjFmNy4uMWFkODUwYzc3IDEwMDY0NAotLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90MS5jCi0rKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3QxLmMKLUBAIC0xNDExLDcgKzE0MTEsNyBAQCBzdGF0aWMgT1BKX0JPT0wgb3BqX3QxX2RlY29kZV9jYmxrKG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotIAotLSAgICAgICAgICAgICAgIGZvciAocGFzc25vID0gMDsgcGFzc25vIDwgc2VnLT5yZWFsX251bV9wYXNzZXM7ICsrcGFzc25vKSB7Ci0rICAgICAgICAgICAgICAgZm9yIChwYXNzbm8gPSAwOyAocGFzc25vIDwgc2VnLT5yZWFsX251bV9wYXNzZXMpICYmIChicG5vX3BsdXNfb25lID49IDEpOyArK3Bhc3NubykgewotICAgICAgICAgICAgIHN3aXRjaCAocGFzc3R5cGUpIHsKLSAgICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gVDFfVFlQRV9SQVcpIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAyOC11cHN0cmVhbS1jaGVjay1zaXplLWluLW9wal9qMmtfcmVhZF9zaXoucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMjgtdXBzdHJlYW0tY2hlY2stc2l6ZS1pbi1vcGpfajJrX3JlYWRfc2l6LnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmQ1NTYyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvMDAyOC11cHN0cmVhbS1jaGVjay1zaXplLWluLW9wal9qMmtfcmVhZF9zaXoucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1kaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmMKLWluZGV4IGU3N2VkZDIyYi4uY2I1YTI4MzczIDEwMDY0NAotLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYwotKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYwotQEAgLTIxMTcsMTAgKzIxMTcsMTYgQEAgc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9zaXoob3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgaWYoIGxfaW1nX2NvbXAtPmR4IDwgMSB8fCBsX2ltZ19jb21wLT5keCA+IDI1NSB8fAotICAgICAgICAgICAgICAgICAgICAgbF9pbWdfY29tcC0+ZHkgPCAxIHx8IGxfaW1nX2NvbXAtPmR5ID4gMjU1ICkgewotICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdmFsdWVzIGZvciBjb21wID0gJWQgOiBkeD0ldSBkeT0ldVxuIChzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAyNTUgYWNjb3JkaW5nIHRoZSBKUEVHMjAwMCBub3JtKSIsCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlcyBmb3IgY29tcCA9ICVkIDogZHg9JXUgZHk9JXUgKHNob3VsZCBiZSBiZXR3ZWVuIDEgYW5kIDI1NSBhY2NvcmRpbmcgdG8gdGhlIEpQRUcyMDAwIG5vcm0pXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBsX2ltZ19jb21wLT5keCwgbF9pbWdfY29tcC0+ZHkpOwotICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgfQotKyAgICAgICAgICAgICAgICBpZiggbF9pbWdfY29tcC0+cHJlYyA+IDM4KSB7IC8qIFRPRE8gb3BlbmpwZWcgd29uJ3QgaGFuZGxlIG1vcmUgdGhhbiA/ICovCi0rICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB2YWx1ZXMgZm9yIGNvbXAgPSAlZCA6IHByZWM9JXUgKHNob3VsZCBiZSBiZXR3ZWVuIDEgYW5kIDM4IGFjY29yZGluZyB0byB0aGUgSlBFRzIwMDAgbm9ybSlcbiIsCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGxfaW1nX2NvbXAtPnByZWMpOwotKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSsgICAgICAgICAgICAgICAgfQotIAotICNpZmRlZiBVU0VfSlBXTAotICAgICAgICAgICAgICAgICBpZiAobF9jcC0+Y29ycmVjdCkgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDM0LW9wal9tYWxsb2MucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMzQtb3BqX21hbGxvYy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmJjOTljCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDM0LW9wal9tYWxsb2MucGF0Y2gKQEAgLTAsMCArMSwxNzAgQEAKK2RpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9tYWxsb2MuaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX21hbGxvYy5oCitpbmRleCBjYmM0MTA2YzcuLjc5YjNhNjQxMCAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX21hbGxvYy5oCisrKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9tYWxsb2MuaAorQEAgLTMxLDggKzMxLDYgQEAKKyAgKi8KKyAjaWZuZGVmIE9QSl9NQUxMT0NfSAorICNkZWZpbmUgT1BKX01BTExPQ19ICistCistI2luY2x1ZGUgPHN0ZGRlZi5oPgorIC8qKgorIEBmaWxlIG9wal9tYWxsb2MuaAorIEBicmllZiBJbnRlcm5hbCBmdW5jdGlvbnMKK0BAIC01Miw3ICs1MCwxNiBAQCBBbGxvY2F0ZSBhbiB1bmluaXRpYWxpemVkIG1lbW9yeSBibG9jaworIEBwYXJhbSBzaXplIEJ5dGVzIHRvIGFsbG9jYXRlCisgQHJldHVybiBSZXR1cm5zIGEgdm9pZCBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgc3BhY2UsIG9yIE5VTEwgaWYgdGhlcmUgaXMgaW5zdWZmaWNpZW50IG1lbW9yeSBhdmFpbGFibGUKKyAqLworLXZvaWQgKiBvcGpfbWFsbG9jKHNpemVfdCBzaXplKTsKKysjaWZkZWYgQUxMT0NfUEVSRl9PUFQKKyt2b2lkICogT1BKX0NBTExDT05WIG9wal9tYWxsb2Moc2l6ZV90IHNpemUpOworKyNlbHNlCisrLyogcHJldmVudCBhc3NlcnRpb24gb24gb3ZlcmZsb3cgZm9yIE1TVkMgKi8KKysjaWZkZWYgX01TQ19WRVIKKysjZGVmaW5lIG9wal9tYWxsb2Moc2l6ZSkgKChzaXplX3QpKHNpemUpID49IChzaXplX3QpLTB4MTAwID8gTlVMTCA6IG1hbGxvYyhzaXplKSkKKysjZWxzZQorKyNkZWZpbmUgb3BqX21hbGxvYyhzaXplKSBtYWxsb2Moc2l6ZSkKKysjZW5kaWYKKysjZW5kaWYKKyAKKyAvKioKKyBBbGxvY2F0ZSBhIG1lbW9yeSBibG9jayB3aXRoIGVsZW1lbnRzIGluaXRpYWxpemVkIHRvIDAKK0BAIC02MCwyNCArNjcsOTggQEAgQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgd2l0aCBlbGVtZW50cyBpbml0aWFsaXplZCB0byAwCisgQHBhcmFtIHNpemVPZkVsZW1lbnRzIEJ5dGVzIHBlciBibG9jayB0byBhbGxvY2F0ZQorIEByZXR1cm4gUmV0dXJucyBhIHZvaWQgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIHNwYWNlLCBvciBOVUxMIGlmIHRoZXJlIGlzIGluc3VmZmljaWVudCBtZW1vcnkgYXZhaWxhYmxlCisgKi8KKy12b2lkICogb3BqX2NhbGxvYyhzaXplX3QgbnVtT2ZFbGVtZW50cywgc2l6ZV90IHNpemVPZkVsZW1lbnRzKTsKKysjaWZkZWYgQUxMT0NfUEVSRl9PUFQKKyt2b2lkICogT1BKX0NBTExDT05WIG9wal9jYWxsb2Moc2l6ZV90IF9OdW1PZkVsZW1lbnRzLCBzaXplX3QgX1NpemVPZkVsZW1lbnRzKTsKKysjZWxzZQorKy8qIHByZXZlbnQgYXNzZXJ0aW9uIG9uIG92ZXJmbG93IGZvciBNU1ZDICovCisrI2lmZGVmIF9NU0NfVkVSCisrI2RlZmluZSBvcGpfY2FsbG9jKG51bSwgc2l6ZSkgKChzaXplX3QpKG51bSkgIT0gMCAmJiAoc2l6ZV90KShudW0pID49IChzaXplX3QpLTB4MTAwIC8gKHNpemVfdCkoc2l6ZSkgPyBOVUxMIDogY2FsbG9jKG51bSwgc2l6ZSkpCisrI2Vsc2UKKysjZGVmaW5lIG9wal9jYWxsb2MobnVtLCBzaXplKSBjYWxsb2MobnVtLCBzaXplKQorKyNlbmRpZgorKyNlbmRpZgorIAorIC8qKgorIEFsbG9jYXRlIG1lbW9yeSBhbGlnbmVkIHRvIGEgMTYgYnl0ZSBib3VuZGFyeQorIEBwYXJhbSBzaXplIEJ5dGVzIHRvIGFsbG9jYXRlCisgQHJldHVybiBSZXR1cm5zIGEgdm9pZCBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgc3BhY2UsIG9yIE5VTEwgaWYgdGhlcmUgaXMgaW5zdWZmaWNpZW50IG1lbW9yeSBhdmFpbGFibGUKKyAqLworLXZvaWQgKiBvcGpfYWxpZ25lZF9tYWxsb2Moc2l6ZV90IHNpemUpOworLXZvaWQgKiBvcGpfYWxpZ25lZF9yZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpOworLXZvaWQgb3BqX2FsaWduZWRfZnJlZSh2b2lkKiBwdHIpOworKy8qIEZJWE1FOiBUaGVzZSBzaG91bGQgYmUgc2V0IHdpdGggY21ha2UgdGVzdHMsIGJ1dCB3ZSdyZSBjdXJyZW50bHkgbm90IHJlcXVpcmluZyB1c2Ugb2YgY21ha2UgKi8KKysjaWZkZWYgX1dJTjMyCisrICAvKiBTb21lb25lIHNob3VsZCB0ZWxsIHRoZSBtaW5ndyBwZW9wbGUgdGhhdCB0aGVpciBtYWxsb2MuaCBvdWdodCB0byBwcm92aWRlIF9tbV9tYWxsb2MoKSAqLworKyAgI2lmZGVmIF9fR05VQ19fCisrICAgICNpbmNsdWRlIDxtbV9tYWxsb2MuaD4KKysgICAgI2RlZmluZSBIQVZFX01NX01BTExPQworKyAgI2Vsc2UgLyogTVNWQywgSW50ZWwgQysrICovCisrICAgICNpbmNsdWRlIDxtYWxsb2MuaD4KKysgICAgI2lmZGVmIF9tbV9tYWxsb2MKKysgICAgICAjZGVmaW5lIEhBVkVfTU1fTUFMTE9DCisrICAgICNlbmRpZgorKyAgI2VuZGlmCisrI2Vsc2UgLyogTm90IF9XSU4zMiAqLworKyAgI2lmIGRlZmluZWQoX19zdW4pCisrICAgICNkZWZpbmUgSEFWRV9NRU1BTElHTgorKyAgI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykKKysgICAgI2RlZmluZSBIQVZFX1BPU0lYX01FTUFMSUdOCisrICAvKiBMaW51eCB4ODZfNjQgYW5kIE9TWCBhbHdheXMgYWxpZ24gYWxsb2NhdGlvbnMgdG8gMTYgYnl0ZXMgKi8KKysgICNlbGlmICFkZWZpbmVkKF9fYW1kNjRfXykgJiYgIWRlZmluZWQoX19BUFBMRV9fKSAmJiAhZGVmaW5lZChfQUlYKQorKyAgICAjZGVmaW5lIEhBVkVfTUVNQUxJR04KKysgICAgI2luY2x1ZGUgPG1hbGxvYy5oPgorKyAgI2VuZGlmCisrI2VuZGlmCisgCistLyoqCistQWxsb2NhdGUgbWVtb3J5IGFsaWduZWQgdG8gYSAzMiBieXRlIGJvdW5kYXJ5CistQHBhcmFtIHNpemUgQnl0ZXMgdG8gYWxsb2NhdGUKKy1AcmV0dXJuIFJldHVybnMgYSB2b2lkIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBzcGFjZSwgb3IgTlVMTCBpZiB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgbWVtb3J5IGF2YWlsYWJsZQorLSovCistdm9pZCAqIG9wal9hbGlnbmVkXzMyX21hbGxvYyhzaXplX3Qgc2l6ZSk7Cistdm9pZCAqIG9wal9hbGlnbmVkXzMyX3JlYWxsb2Modm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSk7CisrI2RlZmluZSBvcGpfYWxpZ25lZF9tYWxsb2Moc2l6ZSkgbWFsbG9jKHNpemUpCisrI2RlZmluZSBvcGpfYWxpZ25lZF8zMl9tYWxsb2Moc2l6ZSkgbWFsbG9jKHNpemUpCisrI2RlZmluZSBvcGpfYWxpZ25lZF9mcmVlKG0pIGZyZWUobSkKKysKKysjaWZkZWYgSEFWRV9NTV9NQUxMT0MKKysgICN1bmRlZiBvcGpfYWxpZ25lZF9tYWxsb2MKKysgICNkZWZpbmUgb3BqX2FsaWduZWRfbWFsbG9jKHNpemUpIF9tbV9tYWxsb2MoKHNpemUpLCAxNikKKysgICN1bmRlZiBvcGpfYWxpZ25lZF8zMl9tYWxsb2MKKysgICNkZWZpbmUgb3BqX2FsaWduZWRfMzJfbWFsbG9jKHNpemUpIF9tbV9tYWxsb2MoKHNpemUpLCAzMikKKysgICN1bmRlZiBvcGpfYWxpZ25lZF9mcmVlCisrICAjZGVmaW5lIG9wal9hbGlnbmVkX2ZyZWUobSkgX21tX2ZyZWUobSkKKysjZW5kaWYKKysKKysjaWZkZWYgSEFWRV9NRU1BTElHTgorKyAgZXh0ZXJuIHZvaWQqIG1lbWFsaWduKHNpemVfdCwgc2l6ZV90KTsKKysgICN1bmRlZiBvcGpfYWxpZ25lZF9tYWxsb2MKKysgICNkZWZpbmUgb3BqX2FsaWduZWRfbWFsbG9jKHNpemUpIG1lbWFsaWduKDE2LCAoc2l6ZSkpCisrICAjdW5kZWYgb3BqX2FsaWduZWRfMzJfbWFsbG9jCisrICAjZGVmaW5lIG9wal9hbGlnbmVkXzMyX21hbGxvYyhzaXplKSBtZW1hbGlnbigzMiwgKHNpemUpKQorKyAgI3VuZGVmIG9wal9hbGlnbmVkX2ZyZWUKKysgICNkZWZpbmUgb3BqX2FsaWduZWRfZnJlZShtKSBmcmVlKG0pCisrI2VuZGlmCisrCisrI2lmZGVmIEhBVkVfUE9TSVhfTUVNQUxJR04KKysgICN1bmRlZiBvcGpfYWxpZ25lZF9tYWxsb2MKKysgIGV4dGVybiBpbnQgcG9zaXhfbWVtYWxpZ24odm9pZCoqLCBzaXplX3QsIHNpemVfdCk7CisrCisrICBzdGF0aWMgSU5MSU5FIHZvaWQqIF9fYXR0cmlidXRlX18gKChtYWxsb2MpKSBvcGpfYWxpZ25lZF9tYWxsb2Moc2l6ZV90IHNpemUpeworKyAgICB2b2lkKiBtZW0gPSBOVUxMOworKyAgICBwb3NpeF9tZW1hbGlnbigmbWVtLCAxNiwgc2l6ZSk7CisrICAgIHJldHVybiBtZW07CisrICB9CisrCisrICAjdW5kZWYgb3BqX2FsaWduZWRfMzJfbWFsbG9jCisrICBzdGF0aWMgSU5MSU5FIHZvaWQqIF9fYXR0cmlidXRlX18gKChtYWxsb2MpKSBvcGpfYWxpZ25lZF8zMl9tYWxsb2Moc2l6ZV90IHNpemUpeworKyAgICB2b2lkKiBtZW0gPSBOVUxMOworKyAgICBwb3NpeF9tZW1hbGlnbigmbWVtLCAzMiwgc2l6ZSk7CisrICAgIHJldHVybiBtZW07CisrICB9CisrCisrICAjdW5kZWYgb3BqX2FsaWduZWRfZnJlZQorKyAgI2RlZmluZSBvcGpfYWxpZ25lZF9mcmVlKG0pIGZyZWUobSkKKysjZW5kaWYKKysKKysjaWZkZWYgQUxMT0NfUEVSRl9PUFQKKysgICN1bmRlZiBvcGpfYWxpZ25lZF9tYWxsb2MKKysgICNkZWZpbmUgb3BqX2FsaWduZWRfbWFsbG9jKHNpemUpIG9wal9tYWxsb2Moc2l6ZSkKKysgICN1bmRlZiBvcGpfYWxpZ25lZF8zMl9tYWxsb2MKKysgICNkZWZpbmUgb3BqX2FsaWduZWRfMzJfbWFsbG9jKHNpemUpIG9wal9tYWxsb2Moc2l6ZSkKKysgICN1bmRlZiBvcGpfYWxpZ25lZF9mcmVlCisrICAjZGVmaW5lIG9wal9hbGlnbmVkX2ZyZWUobSkgb3BqX2ZyZWUobSkKKysjZW5kaWYKKyAKKyAvKioKKyBSZWFsbG9jYXRlIG1lbW9yeSBibG9ja3MuCitAQCAtODUsMTMgKzE2NiwyNiBAQCBSZWFsbG9jYXRlIG1lbW9yeSBibG9ja3MuCisgQHBhcmFtIHMgTmV3IHNpemUgaW4gYnl0ZXMKKyBAcmV0dXJuIFJldHVybnMgYSB2b2lkIHBvaW50ZXIgdG8gdGhlIHJlYWxsb2NhdGVkIChhbmQgcG9zc2libHkgbW92ZWQpIG1lbW9yeSBibG9jaworICovCistdm9pZCAqIG9wal9yZWFsbG9jKHZvaWQgKiBtLCBzaXplX3Qgcyk7CisrI2lmZGVmIEFMTE9DX1BFUkZfT1BUCisrdm9pZCAqIE9QSl9DQUxMQ09OViBvcGpfcmVhbGxvYyh2b2lkICogbSwgc2l6ZV90IHMpOworKyNlbHNlCisrLyogcHJldmVudCBhc3NlcnRpb24gb24gb3ZlcmZsb3cgZm9yIE1TVkMgKi8KKysjaWZkZWYgX01TQ19WRVIKKysjZGVmaW5lIG9wal9yZWFsbG9jKG0sIHMpICgoc2l6ZV90KShzKSA+PSAoc2l6ZV90KS0weDEwMCA/IE5VTEwgOiByZWFsbG9jKG0sIHMpKQorKyNlbHNlCisrI2RlZmluZSBvcGpfcmVhbGxvYyhtLCBzKSByZWFsbG9jKG0sIHMpCisrI2VuZGlmCisrI2VuZGlmCisgCisgLyoqCisgRGVhbGxvY2F0ZXMgb3IgZnJlZXMgYSBtZW1vcnkgYmxvY2suCisgQHBhcmFtIG0gUHJldmlvdXNseSBhbGxvY2F0ZWQgbWVtb3J5IGJsb2NrIHRvIGJlIGZyZWVkCisgKi8KKy12b2lkIG9wal9mcmVlKHZvaWQgKiBtKTsKKysjaWZkZWYgQUxMT0NfUEVSRl9PUFQKKyt2b2lkIE9QSl9DQUxMQ09OViBvcGpfZnJlZSh2b2lkICogbSk7CisrI2Vsc2UKKysjZGVmaW5lIG9wal9mcmVlKG0pIGZyZWUobSkKKysjZW5kaWYKKyAKKyAjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoT1BKX1NLSVBfUE9JU09OKQorICNwcmFnbWEgR0NDIHBvaXNvbiBtYWxsb2MgY2FsbG9jIHJlYWxsb2MgZnJlZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDM1LW9wal9pbWFnZV9kYXRhX2ZyZWUucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMzUtb3BqX2ltYWdlX2RhdGFfZnJlZS5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzY3NGRhCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDM1LW9wal9pbWFnZV9kYXRhX2ZyZWUucGF0Y2gKQEAgLTAsMCArMSwxMyBAQAorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvanAyLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2pwMi5jCitpbmRleCAyOTg2NDhhNzcuLjIzNzRkNDU5ZiAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvanAyLmMKKysrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvanAyLmMKK0BAIC0xMTE2LDcgKzExMTYsNyBAQCBzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9hcHBseV9wY2xyKG9wal9pbWFnZV90ICppbWFnZSwKKyAgICAgICAgIC8qIFByZXZlbnQgbnVsbCBwb2ludGVyIGFjY2VzcyAqLworICAgICAgICAgaWYgKCFzcmMgfHwgIWRzdCkgeworICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnJfY2hhbm5lbHM7ICsraikgeworLSAgICAgICAgICAgIG9wal9mcmVlKG5ld19jb21wc1tqXS5kYXRhKTsKKysgICAgICAgICAgICBvcGpfaW1hZ2VfZGF0YV9mcmVlKG5ld19jb21wc1tqXS5kYXRhKTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBvcGpfZnJlZShuZXdfY29tcHMpOworICAgICAgICAgICBuZXdfY29tcHMgPSBOVUxMOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDM1LW9wal9qMmtfdXBkYXRlX2ltYWdlX2RpbWVuc2lvbnMucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwLzAwMzUtb3BqX2oya191cGRhdGVfaW1hZ2VfZGltZW5zaW9ucy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTE4YzA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC8wMDM1LW9wal9qMmtfdXBkYXRlX2ltYWdlX2RpbWVuc2lvbnMucGF0Y2gKQEAgLTAsMCArMSw0OSBAQAorZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2oyay5jCitpbmRleCA3ODRhMDYyMGEuLmNlYTYxNDcwOSAxMDA2NDQKKy0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmMKKysrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmMKK0BAIC05MjIzLDMyICs5MjIzLDMwIEBAIHN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3VwZGF0ZV9pbWFnZV9kaW1lbnNpb25zKG9wal9pbWFnZV90KiBwX2ltYWdlLAorIAorICAgICBsX2ltZ19jb21wID0gcF9pbWFnZS0+Y29tcHM7CisgICAgIGZvciAoaXRfY29tcCA9IDA7IGl0X2NvbXAgPCBwX2ltYWdlLT5udW1jb21wczsgKytpdF9jb21wKSB7CistICAgICAgICBPUEpfSU5UMzIgbF9oLCBsX3c7CistCisgICAgICAgICBsX2ltZ19jb21wLT54MCA9IG9wal91aW50X2NlaWxkaXYocF9pbWFnZS0+eDAsIGxfaW1nX2NvbXAtPmR4KTsKKyAgICAgICAgIGxfaW1nX2NvbXAtPnkwID0gb3BqX3VpbnRfY2VpbGRpdihwX2ltYWdlLT55MCwgbF9pbWdfY29tcC0+ZHkpOworICAgICAgICAgbF9jb21wX3gxID0gb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpcF9pbWFnZS0+eDEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHgpOworICAgICAgICAgbF9jb21wX3kxID0gb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpcF9pbWFnZS0+eTEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHkpOworIAorLSAgICAgICAgbF93ID0gb3BqX2ludF9jZWlsZGl2cG93MihsX2NvbXBfeDEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZmFjdG9yKQorLSAgICAgICAgICAgICAgLSBvcGpfaW50X2NlaWxkaXZwb3cyKChPUEpfSU5UMzIpbF9pbWdfY29tcC0+eDAsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZmFjdG9yKTsKKy0gICAgICAgIGlmIChsX3cgPCAwKSB7CisrICAgICAgICBPUEpfSU5UMzIgbF8xID0gb3BqX2ludF9jZWlsZGl2cG93MihsX2NvbXBfeDEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZmFjdG9yKTsKKysgICAgICAgIE9QSl9JTlQzMiBsXzIgPSBvcGpfaW50X2NlaWxkaXZwb3cyKChPUEpfSU5UMzIpbF9pbWdfY29tcC0+eDAsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZmFjdG9yKTsKKysgICAgICAgIGlmIChsXzEgPCBsXzIpIHsKKyAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorLSAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpemUgeCBvZiB0aGUgZGVjb2RlZCBjb21wb25lbnQgaW1hZ2UgaXMgaW5jb3JyZWN0IChjb21wWyVkXS53PSVkKS5cbiIsCistICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jb21wLCBsX3cpOworKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpemUgeCBvZiB0aGUgZGVjb2RlZCBjb21wb25lbnQgaW1hZ2UgaXMgaW5jb3JyZWN0IChjb21wWyVkXS53PDApLlxuIiwKKysgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NvbXApOworICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICB9CistICAgICAgICBsX2ltZ19jb21wLT53ID0gKE9QSl9VSU5UMzIpbF93OworKyAgICAgICAgbF9pbWdfY29tcC0+dyA9IChPUEpfVUlOVDMyKShsXzEtbF8yKTsKKyAKKy0gICAgICAgIGxfaCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF9jb21wX3kxLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmZhY3RvcikKKy0gICAgICAgICAgICAgIC0gb3BqX2ludF9jZWlsZGl2cG93MigoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPnkwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmZhY3Rvcik7CistICAgICAgICBpZiAobF9oIDwgMCkgeworKyAgICAgICAgbF8xID0gb3BqX2ludF9jZWlsZGl2cG93MihsX2NvbXBfeTEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZmFjdG9yKTsKKysgICAgICAgIGxfMiA9IG9wal9pbnRfY2VpbGRpdnBvdzIoKE9QSl9JTlQzMilsX2ltZ19jb21wLT55MCwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5mYWN0b3IpOworKyAgICAgICAgaWYgKGxfMSA8IGxfMikgeworICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCistICAgICAgICAgICAgICAgICAgICAgICAgICAiU2l6ZSB5IG9mIHRoZSBkZWNvZGVkIGNvbXBvbmVudCBpbWFnZSBpcyBpbmNvcnJlY3QgKGNvbXBbJWRdLmg9JWQpLlxuIiwKKy0gICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NvbXAsIGxfaCk7CisrICAgICAgICAgICAgICAgICAgICAgICAgICAiU2l6ZSB5IG9mIHRoZSBkZWNvZGVkIGNvbXBvbmVudCBpbWFnZSBpcyBpbmNvcnJlY3QgKGNvbXBbJWRdLmg8MCkuXG4iLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfY29tcCk7CisgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgIH0KKy0gICAgICAgIGxfaW1nX2NvbXAtPmggPSAoT1BKX1VJTlQzMilsX2g7CisrICAgICAgICBsX2ltZ19jb21wLT5oID0gKE9QSl9VSU5UMzIpKGxfMS1sXzIpOworIAorICAgICAgICAgbF9pbWdfY29tcCsrOworICAgICB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL0NNYWtlTGlzdHMudHh0IGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9DTWFrZUxpc3RzLnR4dAppbmRleCA3ZjE2ODM0Li44MDBkYzlhIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL0NNYWtlTGlzdHMudHh0CisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvQ01ha2VMaXN0cy50eHQKQEAgLTEzLDYgKzEzLDcgQEAKICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2Npby5jCiAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9kd3QuYwogICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZXZlbnQuYworICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZnVuY3Rpb25fbGlzdC5jCiAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9pbWFnZS5jCiAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9pbnZlcnQuYwogICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vajJrLmMKQEAgLTIzLDExICsyNCwxMSBAQAogICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vb3BqX2Nsb2NrLmMKICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3BpLmMKICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3Jhdy5jCisgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcGFyc2VfYXJyYXkuYwogICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdDEuYwogICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdDIuYwogICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vdGNkLmMKICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3RndC5jCi0gICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9mdW5jdGlvbl9saXN0LmMKICkKIGlmKEJVSUxEX0pQSVApCiAgIGFkZF9kZWZpbml0aW9ucygtRFVTRV9KUElQKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9SRUFETUUucGRmaXVtIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9SRUFETUUucGRmaXVtCmluZGV4IDZjMmEzYzcuLjE4MDUwMDAgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvUkVBRE1FLnBkZml1bQorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL1JFQURNRS5wZGZpdW0KQEAgLTEsNiArMSw2IEBACiBOYW1lOiBPcGVuSlBFRwogVVJMOiBodHRwOi8vd3d3Lm9wZW5qcGVnLm9yZy8KLVZlcnNpb246IDBmYTVhMTdjOThjNGI4ZjllZTIyODZmNGYwYTUwY2Y1MmE1ZmNjYjAKK1ZlcnNpb246IDIuMy4wIChhbHNvIHVwZGF0ZSBpbiBvcGpfY29uZmlnKikKIFNlY3VyaXR5IENyaXRpY2FsOiB5ZXMKIExpY2Vuc2U6IDItY2xhdXNlIEJTRAogCkBAIC0xMCwzMiArMTAsMjEgQEAKIExvY2FsIE1vZGlmaWNhdGlvbnM6CiAKIDAwMDAtdXNlLWNvbG9yc3BhY2UucGF0Y2g6IE1ha2VzIGl0IHBvc3NpYmxlIHRvIG5vdCBjYWxsIG9wal9qcDJfYXBwbHlfcGNscigpLgotMDAwMS1pbWFnZS1kYXRhLnBhdGNoOiBGaXggYSBjcmFzaGVyIGluIG9wal9qMmtfdXBkYXRlX2ltYWdlX2RhdGEoKS4KLTAwMDItcGFja2V0LWl0ZXJhdG9yLnBhdGNoOiBGaXggaW50ZWdlciBvdmVyZmxvdyBpbiBvcGpfcGlfY3JlYXRlX2RlY29kZSgpLgogMDAwMy1kd3QtZGVjb2RlLnBhdGNoOiBDaGVjayBhcnJheSBib3VuZHMgZm9yIG9wal9kd3RfZGVjb2RlXzEoKSBhbmQgZnJpZW5kcy4KLTAwMDQtajJrX3JlYWRfbWNjLnBhdGNoOiBNb3ZlIGluY3JlbWVudGluZyBvZiBsX3RjcC0+bV9uYl9tY2NfcmVjb3JkcyB0byB0aGUgcmlnaHQgcGxhY2UuCiAwMDA1LWpwMl9hcHBseV9wY2xyLnBhdGNoOiBGaXggb3V0IG9mIGJvdW5kcyBhY2Nlc3MuCiAwMDA2LXRjZF9pbml0X3RpbGUucGF0Y2g6IEZpeCBhIGRpdmlkZSBieSB6ZXJvIGJ1ZyBpbiBvcGpfdGNkX2luaXRfdGlsZSgpLgogMDAwNy1qcDJfcmVhZF9jbWFwLnBhdGNoOiBGaXggd3JvbmcgcmVuZGVyaW5nIG9uIGdyZXlzY2FsZSBpbWFnZXMgd2l0aCBpbmRleCBjb2xvcnNwYWNlLgotMDAwOC1qcDJfY2hlY2tfY29sb3IucGF0Y2g6IFJlcGxhY2UgYW4gYXNzZXJ0aW9uIHdpdGggcmV0dXJuaW5nIGZhbHNlLgogMDAwOS1vcGpfcGlfbmV4dC5wYXRjaDogRml4IHBvdGVudGlhbCBiYWQgcHJlY25vIHZhbHVlIGluIG9wal9waV9uZXh0KiBmdW5jdGlvbnMuCi0wMDEwLXBpX3VwZGF0ZV9kZWNvZGVfcG9jLnBhdGNoOiBTZXQgcHJvcGVyIHVwcGVyIGJvdW5kIGZvciBhbiBhcnJheSBpbiBvcGpfcGlfdXBkYXRlX2RlY29kZV9wb2MoKS4KIDAwMTEtajJrX3VwZGF0ZV9pbWFnZV9kYXRhLnBhdGNoOiBQcmV2ZW50IGJhZCBzaWduZWQgLT4gdW5zaWduZWQgY2FzdGluZy4KIDAwMTItbWN0X3NzZS5wYXRjaDogRG9uJ3QgdXNlIFNTRSBpbnRyaW5zaWNzIGluIDMyLWJpdCBidWlsZHMuCi0wMDEzLWF0dHJpYl9maXgucGF0Y2g6IERvbid0IG5lZWRsZXNzbHkgcmVkZWZpbmUgX19hdHRyaWJ1dGVfXywgaHR0cHM6Ly9naXRodWIuY29tL3VjbG91dmFpbi9vcGVuanBlZy9pc3N1ZXMvNzI3CiAwMDE0LW9wal9qcDJfcmVhZF9paGRyX2xlYWsucGF0Y2g6IE1lbW9yeSBsZWFrIGluIG9wal9qcDJfcmVhZF9paGRyKCkuCiAwMDE1LXJlYWRfU1BDb2RfU1BDb2Nfb3ZlcmZsb3cucGF0Y2g6IFByZXZlbnQgYSBidWZmZXIgb3ZlcmZsb3cgaW4gb3BqX2oya19yZWFkX1NQQ29kX1NQQ29jLgogMDAxNi1yZWFkX1NRY2RfU1FjY19vdmVyZmxvdy5wYXRjaDogUHJldmVudCBhIGJ1ZmZlciBvdmVyZmxvdyBpbiBvcGpfajJrX3JlYWRfU1FjZF9TUWNjLgotMDAxNy10Y2RfaW5pdF90aWxlLnBhdGNoOiBQcmV2ZW50IGludGVnZXIgb3ZlcmZsb3dzIGR1cmluZyBjYWxjdWxhdGlvbiBvZiB8bF9uYl9wcmVjaW5jdF9zaXplfC4KLTAwMTgtdGNkX2dldF9kZWNvZGVkX3RpbGVfc2l6ZS5wYXRjaDogRml4IGFuIGludGVnZXIgb3ZlcmZsb3cgaW4gb3BqX3RjZF9nZXRfZGVjb2RlZF90aWxlX3NpemUuCiAwMDE5LXRjZF9pbml0X3RpbGUucGF0Y2g6IFByZXZlbnQgaW50ZWdlciBvdmVyZmxvd3MgZHVyaW5nIGNhbGN1bGF0aW9uIG9mIHxsX25iX2NvZGVfYmxvY2tzX3NpemV8LgotMDAyMC1vcGpfYWxpZ25lZF9tYWxsb2MucGF0Y2g6IFByZXZlbnQgb3ZlcmZsb3dzIHdoZW4gdXNpbmcgb3BqX2FsaWduZWRfbWFsbG9jKCkuCi0wMDIxLXRjZF9pbml0X3RpbGVfbmVnYXRpdmUucGF0Y2g6IFByZXZlbnQgbmVnYXRpdmUgeCwgeSB2YWx1ZXMgaW4gb3BqX3RjZF9pbml0X3RpbGUuCiAwMDIyLWpwMl9hcHBseV9wY2xyX292ZXJmbG93LnBhdGNoOiBQcmV2ZW50IGludGVnZXIgb3ZlcmZsb3cgaW4gb3BqX2pwMl9hcHBseV9wY2xyLgogMDAyMy1vcGpfajJrX3JlYWRfbWN0X3JlY29yZHMucGF0Y2g6IEZpeCBvcGpfajJrX3JlYWQgdG8gcHJldmVudCBoZWFwLXVzZS1hZnRlci1mcmVlLgotMDAyNC1sX21hcmtlcl9zaXplX2NoZWNrLnBhdGNoOiBSZXR1cm4gZXJyb3IgYmVmb3JlIG92ZXJmbG93IGluIG9wal9qMmtfcmVhZF9oZWFkZXJfcHJvY2VkdXJlLgogMDAyNS1vcGpfajJrX2FkZF9tY3RfbnVsbF9kYXRhLnBhdGNoOiBDaGVjayBtX2RhdGEgIT0gbnVsbCBiZWZvcmUgdHJ5aW5nIHRvIHJlYWQgZnJvbSBpdC4KIDAwMjYtdXNlX29wal91aW50X2NlaWxkaXYucGF0Y2g6IFJlbW92ZSAoT1BKX1VJTlQzMilvcGpfaW50X2NlaWxkaXYoKE9QSl9JTlQzMilhLCAoT1BKX0lOVDMyKSBiKS4KLTAwMjctdW5kZWZpbmVkLXNoaWZ0LW9wal90MV9kZWNvZGVfY2Jsay5wYXRjaDogdXBzdHJlYW0gZml4IGZvciBhIHVic2FuIGJ1Zy4KLTAwMjgtdXBzdHJlYW0tY2hlY2stc2l6ZS1pbi1vcGpfajJrX3JlYWRfc2l6LnBhdGNoOiB1cHN0cmVhbSBwYXRjaCBpbiBqMmsuYy4KLVRPRE8odGhlc3RpZyk6IExpc3QgYWxsIHRoZSBvdGhlciBwYXRjaGVzLgorMDAzMy11bmRlZmluZWQtc2hpZnQtb3BqX3QxX2RlY19jbG5wYXNzLnBhdGNoOiBmaXggdW5kZWZpbmVkIHNoaWZ0cyBvcmlnaW5hdGVkIGZyb20gb3BqX3QxX2RlY29kZV9jYmxrLgorMDAzNC1vcGpfbWFsbG9jLnBhdGNoOiBQREZpdW0gY2hhbmdlcyBpbiBvcGpfbWFsbG9jLgorMDAzNS1vcGpfajJrX3VwZGF0ZV9pbWFnZV9kaW1lbnNpb25zLnBhdGNoOiBmaXggaW50ZWdlciBvdmVyZmxvdy4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvYmlvLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2Jpby5jCmluZGV4IGU0ZWRiMzcuLjA5ZGNkN2YgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvYmlvLmMKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9iaW8uYwpAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKLSAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQKICAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKICAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KICAqCkBAIC04LDcgKzgsNyBAQAogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQogICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMsIERhdmlkIEphbnNzZW5zCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgWWFubmljayBWZXJzY2h1ZXJlbgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4IAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQogICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgpAQCAtNzIsMTIwICs3MiwxNDYgQEAKIAogLypAfSovCiAKLS8qIAorLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIGxvY2FsIGZ1bmN0aW9ucwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogKi8KIAotc3RhdGljIE9QSl9CT09MIG9wal9iaW9fYnl0ZW91dChvcGpfYmlvX3QgKmJpbykgewotCWJpby0+YnVmID0gKGJpby0+YnVmIDw8IDgpICYgMHhmZmZmOwotCWJpby0+Y3QgPSBiaW8tPmJ1ZiA9PSAweGZmMDAgPyA3IDogODsKLQlpZiAoKE9QSl9TSVpFX1QpYmlvLT5icCA+PSAoT1BKX1NJWkVfVCliaW8tPmVuZCkgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQkqYmlvLT5icCsrID0gKE9QSl9CWVRFKShiaW8tPmJ1ZiA+PiA4KTsKLQlyZXR1cm4gT1BKX1RSVUU7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2Jpb19ieXRlb3V0KG9wal9iaW9fdCAqYmlvKQoreworICAgIGJpby0+YnVmID0gKGJpby0+YnVmIDw8IDgpICYgMHhmZmZmOworICAgIGJpby0+Y3QgPSBiaW8tPmJ1ZiA9PSAweGZmMDAgPyA3IDogODsKKyAgICBpZiAoKE9QSl9TSVpFX1QpYmlvLT5icCA+PSAoT1BKX1NJWkVfVCliaW8tPmVuZCkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICAqYmlvLT5icCsrID0gKE9QSl9CWVRFKShiaW8tPmJ1ZiA+PiA4KTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfYmlvX2J5dGVpbihvcGpfYmlvX3QgKmJpbykgewotCWJpby0+YnVmID0gKGJpby0+YnVmIDw8IDgpICYgMHhmZmZmOwotCWJpby0+Y3QgPSBiaW8tPmJ1ZiA9PSAweGZmMDAgPyA3IDogODsKLQlpZiAoKE9QSl9TSVpFX1QpYmlvLT5icCA+PSAoT1BKX1NJWkVfVCliaW8tPmVuZCkgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQliaW8tPmJ1ZiB8PSAqYmlvLT5icCsrOwotCXJldHVybiBPUEpfVFJVRTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfYmlvX2J5dGVpbihvcGpfYmlvX3QgKmJpbykKK3sKKyAgICBiaW8tPmJ1ZiA9IChiaW8tPmJ1ZiA8PCA4KSAmIDB4ZmZmZjsKKyAgICBiaW8tPmN0ID0gYmlvLT5idWYgPT0gMHhmZjAwID8gNyA6IDg7CisgICAgaWYgKChPUEpfU0laRV9UKWJpby0+YnAgPj0gKE9QSl9TSVpFX1QpYmlvLT5lbmQpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgYmlvLT5idWYgfD0gKmJpby0+YnArKzsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyB2b2lkIG9wal9iaW9fcHV0Yml0KG9wal9iaW9fdCAqYmlvLCBPUEpfVUlOVDMyIGIpIHsKLQlpZiAoYmlvLT5jdCA9PSAwKSB7Ci0JCW9wal9iaW9fYnl0ZW91dChiaW8pOyAvKiBNU0Q6IHdoeSBub3QgY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIGZ1bmN0aW9uID8gKi8KLQl9Ci0JYmlvLT5jdC0tOwotCWJpby0+YnVmIHw9IGIgPDwgYmlvLT5jdDsKK3N0YXRpYyB2b2lkIG9wal9iaW9fcHV0Yml0KG9wal9iaW9fdCAqYmlvLCBPUEpfVUlOVDMyIGIpCit7CisgICAgaWYgKGJpby0+Y3QgPT0gMCkgeworICAgICAgICBvcGpfYmlvX2J5dGVvdXQoCisgICAgICAgICAgICBiaW8pOyAvKiBNU0Q6IHdoeSBub3QgY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIGZ1bmN0aW9uID8gKi8KKyAgICB9CisgICAgYmlvLT5jdC0tOworICAgIGJpby0+YnVmIHw9IGIgPDwgYmlvLT5jdDsKIH0KIAotc3RhdGljIE9QSl9VSU5UMzIgb3BqX2Jpb19nZXRiaXQob3BqX2Jpb190ICpiaW8pIHsKLQlpZiAoYmlvLT5jdCA9PSAwKSB7Ci0JCW9wal9iaW9fYnl0ZWluKGJpbyk7IC8qIE1TRDogd2h5IG5vdCBjaGVjayB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMgZnVuY3Rpb24gPyAqLwotCX0KLQliaW8tPmN0LS07Ci0JcmV0dXJuIChiaW8tPmJ1ZiA+PiBiaW8tPmN0KSAmIDE7CitzdGF0aWMgT1BKX1VJTlQzMiBvcGpfYmlvX2dldGJpdChvcGpfYmlvX3QgKmJpbykKK3sKKyAgICBpZiAoYmlvLT5jdCA9PSAwKSB7CisgICAgICAgIG9wal9iaW9fYnl0ZWluKAorICAgICAgICAgICAgYmlvKTsgLyogTVNEOiB3aHkgbm90IGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBmdW5jdGlvbiA/ICovCisgICAgfQorICAgIGJpby0+Y3QtLTsKKyAgICByZXR1cm4gKGJpby0+YnVmID4+IGJpby0+Y3QpICYgMTsKIH0KIAotLyogCisvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgQml0IElucHV0L091dHB1dCBpbnRlcmZhY2UKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCiAKLW9wal9iaW9fdCogb3BqX2Jpb19jcmVhdGUodm9pZCkgewotCW9wal9iaW9fdCAqYmlvID0gKG9wal9iaW9fdCopb3BqX21hbGxvYyhzaXplb2Yob3BqX2Jpb190KSk7Ci0JcmV0dXJuIGJpbzsKK29wal9iaW9fdCogb3BqX2Jpb19jcmVhdGUodm9pZCkKK3sKKyAgICBvcGpfYmlvX3QgKmJpbyA9IChvcGpfYmlvX3QqKW9wal9tYWxsb2Moc2l6ZW9mKG9wal9iaW9fdCkpOworICAgIHJldHVybiBiaW87CiB9CiAKLXZvaWQgb3BqX2Jpb19kZXN0cm95KG9wal9iaW9fdCAqYmlvKSB7Ci0JaWYoYmlvKSB7Ci0JCW9wal9mcmVlKGJpbyk7Ci0JfQordm9pZCBvcGpfYmlvX2Rlc3Ryb3kob3BqX2Jpb190ICpiaW8pCit7CisgICAgaWYgKGJpbykgeworICAgICAgICBvcGpfZnJlZShiaW8pOworICAgIH0KIH0KIAotcHRyZGlmZl90IG9wal9iaW9fbnVtYnl0ZXMob3BqX2Jpb190ICpiaW8pIHsKLQlyZXR1cm4gKGJpby0+YnAgLSBiaW8tPnN0YXJ0KTsKK3B0cmRpZmZfdCBvcGpfYmlvX251bWJ5dGVzKG9wal9iaW9fdCAqYmlvKQoreworICAgIHJldHVybiAoYmlvLT5icCAtIGJpby0+c3RhcnQpOwogfQogCi12b2lkIG9wal9iaW9faW5pdF9lbmMob3BqX2Jpb190ICpiaW8sIE9QSl9CWVRFICpicCwgT1BKX1VJTlQzMiBsZW4pIHsKLQliaW8tPnN0YXJ0ID0gYnA7Ci0JYmlvLT5lbmQgPSBicCArIGxlbjsKLQliaW8tPmJwID0gYnA7Ci0JYmlvLT5idWYgPSAwOwotCWJpby0+Y3QgPSA4Owordm9pZCBvcGpfYmlvX2luaXRfZW5jKG9wal9iaW9fdCAqYmlvLCBPUEpfQllURSAqYnAsIE9QSl9VSU5UMzIgbGVuKQoreworICAgIGJpby0+c3RhcnQgPSBicDsKKyAgICBiaW8tPmVuZCA9IGJwICsgbGVuOworICAgIGJpby0+YnAgPSBicDsKKyAgICBiaW8tPmJ1ZiA9IDA7CisgICAgYmlvLT5jdCA9IDg7CiB9CiAKLXZvaWQgb3BqX2Jpb19pbml0X2RlYyhvcGpfYmlvX3QgKmJpbywgT1BKX0JZVEUgKmJwLCBPUEpfVUlOVDMyIGxlbikgewotCWJpby0+c3RhcnQgPSBicDsKLQliaW8tPmVuZCA9IGJwICsgbGVuOwotCWJpby0+YnAgPSBicDsKLQliaW8tPmJ1ZiA9IDA7Ci0JYmlvLT5jdCA9IDA7Cit2b2lkIG9wal9iaW9faW5pdF9kZWMob3BqX2Jpb190ICpiaW8sIE9QSl9CWVRFICpicCwgT1BKX1VJTlQzMiBsZW4pCit7CisgICAgYmlvLT5zdGFydCA9IGJwOworICAgIGJpby0+ZW5kID0gYnAgKyBsZW47CisgICAgYmlvLT5icCA9IGJwOworICAgIGJpby0+YnVmID0gMDsKKyAgICBiaW8tPmN0ID0gMDsKIH0KIAotdm9pZCBvcGpfYmlvX3dyaXRlKG9wal9iaW9fdCAqYmlvLCBPUEpfVUlOVDMyIHYsIE9QSl9VSU5UMzIgbikgewotCU9QSl9VSU5UMzIgaTsKLQlmb3IgKGkgPSBuIC0gMTsgaSA8IG47IGktLSkgewotCQlvcGpfYmlvX3B1dGJpdChiaW8sICh2ID4+IGkpICYgMSk7Ci0JfQordm9pZCBvcGpfYmlvX3dyaXRlKG9wal9iaW9fdCAqYmlvLCBPUEpfVUlOVDMyIHYsIE9QSl9VSU5UMzIgbikKK3sKKyAgICBPUEpfSU5UMzIgaTsKKworICAgIGFzc2VydCgobiA+IDBVKSAmJiAobiA8PSAzMlUpKTsKKyAgICBmb3IgKGkgPSAoT1BKX0lOVDMyKW4gLSAxOyBpID49IDA7IGktLSkgeworICAgICAgICBvcGpfYmlvX3B1dGJpdChiaW8sICh2ID4+IGkpICYgMSk7CisgICAgfQogfQogCi1PUEpfVUlOVDMyIG9wal9iaW9fcmVhZChvcGpfYmlvX3QgKmJpbywgT1BKX1VJTlQzMiBuKSB7Ci0JT1BKX1VJTlQzMiBpOworT1BKX1VJTlQzMiBvcGpfYmlvX3JlYWQob3BqX2Jpb190ICpiaW8sIE9QSl9VSU5UMzIgbikKK3sKKyAgICBPUEpfSU5UMzIgaTsKICAgICBPUEpfVUlOVDMyIHY7Ci0JdiA9IDA7Ci0JZm9yIChpID0gbiAtIDE7IGkgPCBuOyBpLS0pIHsKLQkJdiArPSBvcGpfYmlvX2dldGJpdChiaW8pIDw8IGk7Ci0JfQotCXJldHVybiB2OworCisgICAgYXNzZXJ0KChuID4gMFUpIC8qICYmIChuIDw9IDMyVSkqLyk7CisjaWZkZWYgT1BKX1VCU0FOX0JVSUxECisgICAgLyogVGhpcyBhc3NlcnQgZmFpbHMgZm9yIHNvbWUgY29ycnVwdGVkIGltYWdlcyB3aGljaCBhcmUgZ3JhY2VmdWxseSByZWplY3RlZCAqLworICAgIC8qIEFkZCB0aGlzIGFzc2VydCBvbmx5IGZvciB1YnNhbiBidWlsZC4gKi8KKyAgICAvKiBUaGlzIGlzIHRoZSBjb25kaXRpb24gZm9yIG92ZXJmbG93IG5vdCB0byBvY2N1ciBiZWxvdyB3aGljaCBpcyBuZWVkZWQgYmVjYXVzZSBvZiBPUEpfTk9TQU5JVElaRSAqLworICAgIGFzc2VydChuIDw9IDMyVSk7CisjZW5kaWYKKyAgICB2ID0gMFU7CisgICAgZm9yIChpID0gKE9QSl9JTlQzMiluIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgdiB8PSBvcGpfYmlvX2dldGJpdChiaW8pIDw8CisgICAgICAgICAgICAgaTsgLyogY2FuJ3Qgb3ZlcmZsb3csIG9wal9iaW9fZ2V0Yml0IHJldHVybnMgMCBvciAxICovCisgICAgfQorICAgIHJldHVybiB2OwogfQogCi1PUEpfQk9PTCBvcGpfYmlvX2ZsdXNoKG9wal9iaW9fdCAqYmlvKSB7Ci0JaWYgKCEgb3BqX2Jpb19ieXRlb3V0KGJpbykpIHsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0JaWYgKGJpby0+Y3QgPT0gNykgewotCQlpZiAoISBvcGpfYmlvX2J5dGVvdXQoYmlvKSkgewotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCX0KLQlyZXR1cm4gT1BKX1RSVUU7CitPUEpfQk9PTCBvcGpfYmlvX2ZsdXNoKG9wal9iaW9fdCAqYmlvKQoreworICAgIGlmICghIG9wal9iaW9fYnl0ZW91dChiaW8pKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGlmIChiaW8tPmN0ID09IDcpIHsKKyAgICAgICAgaWYgKCEgb3BqX2Jpb19ieXRlb3V0KGJpbykpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1PUEpfQk9PTCBvcGpfYmlvX2luYWxpZ24ob3BqX2Jpb190ICpiaW8pIHsKLQlpZiAoKGJpby0+YnVmICYgMHhmZikgPT0gMHhmZikgewotCQlpZiAoISBvcGpfYmlvX2J5dGVpbihiaW8pKSB7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0JfQotCWJpby0+Y3QgPSAwOwotCXJldHVybiBPUEpfVFJVRTsKK09QSl9CT09MIG9wal9iaW9faW5hbGlnbihvcGpfYmlvX3QgKmJpbykKK3sKKyAgICBpZiAoKGJpby0+YnVmICYgMHhmZikgPT0gMHhmZikgeworICAgICAgICBpZiAoISBvcGpfYmlvX2J5dGVpbihiaW8pKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgfQorICAgIGJpby0+Y3QgPSAwOworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvYmlvLmggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2Jpby5oCmluZGV4IGZiYTI0MjguLjQ0OGZkZGEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvYmlvLmgKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9iaW8uaApAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKLSAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQKICAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKICAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KICAqCkBAIC04LDcgKzgsNyBAQAogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQogICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMsIERhdmlkIEphbnNzZW5zCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgWWFubmljayBWZXJzY2h1ZXJlbgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4IAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQogICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgpAQCAtMzUsMTIgKzM1LDEyIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCi0jaWZuZGVmIF9fQklPX0gKLSNkZWZpbmUgX19CSU9fSAorI2lmbmRlZiBPUEpfQklPX0gKKyNkZWZpbmUgT1BKX0JJT19ICiAKICNpbmNsdWRlIDxzdGRkZWYuaD4gLyogcHRyZGlmZl90ICovCiAKLS8qKiAKKy8qKgogQGZpbGUgYmlvLmgKIEBicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBhbiBpbmRpdmlkdWFsIGJpdCBpbnB1dC1vdXRwdXQgKEJJTykKIApAQCAtNTQsMjMgKzU0LDIzIEBACiBJbmRpdmlkdWFsIGJpdCBpbnB1dC1vdXRwdXQgc3RyZWFtIChCSU8pCiAqLwogdHlwZWRlZiBzdHJ1Y3Qgb3BqX2JpbyB7Ci0JLyoqIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIgKi8KLQlPUEpfQllURSAqc3RhcnQ7Ci0JLyoqIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovCi0JT1BKX0JZVEUgKmVuZDsKLQkvKiogcG9pbnRlciB0byB0aGUgcHJlc2VudCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JT1BKX0JZVEUgKmJwOwotCS8qKiB0ZW1wb3JhcnkgcGxhY2Ugd2hlcmUgZWFjaCBieXRlIGlzIHJlYWQgb3Igd3JpdHRlbiAqLwotCU9QSl9VSU5UMzIgYnVmOwotCS8qKiBjb2RlciA6IG51bWJlciBvZiBiaXRzIGZyZWUgdG8gd3JpdGUuIGRlY29kZXIgOiBudW1iZXIgb2YgYml0cyByZWFkICovCi0JT1BKX1VJTlQzMiBjdDsKKyAgICAvKiogcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciAqLworICAgIE9QSl9CWVRFICpzdGFydDsKKyAgICAvKiogcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIgKi8KKyAgICBPUEpfQllURSAqZW5kOworICAgIC8qKiBwb2ludGVyIHRvIHRoZSBwcmVzZW50IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KKyAgICBPUEpfQllURSAqYnA7CisgICAgLyoqIHRlbXBvcmFyeSBwbGFjZSB3aGVyZSBlYWNoIGJ5dGUgaXMgcmVhZCBvciB3cml0dGVuICovCisgICAgT1BKX1VJTlQzMiBidWY7CisgICAgLyoqIGNvZGVyIDogbnVtYmVyIG9mIGJpdHMgZnJlZSB0byB3cml0ZS4gZGVjb2RlciA6IG51bWJlciBvZiBiaXRzIHJlYWQgKi8KKyAgICBPUEpfVUlOVDMyIGN0OwogfSBvcGpfYmlvX3Q7CiAKIC8qKiBAbmFtZSBFeHBvcnRlZCBmdW5jdGlvbnMgKi8KIC8qQHsqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qKgotQ3JlYXRlIGEgbmV3IEJJTyBoYW5kbGUgCitDcmVhdGUgYSBuZXcgQklPIGhhbmRsZQogQHJldHVybiBSZXR1cm5zIGEgbmV3IEJJTyBoYW5kbGUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQogKi8KIG9wal9iaW9fdCogb3BqX2Jpb19jcmVhdGUodm9pZCk7CkBAIC04OSwxNCArODksMTQgQEAKIEluaXQgZW5jb2RlcgogQHBhcmFtIGJpbyBCSU8gaGFuZGxlCiBAcGFyYW0gYnAgT3V0cHV0IGJ1ZmZlcgotQHBhcmFtIGxlbiBPdXRwdXQgYnVmZmVyIGxlbmd0aCAKK0BwYXJhbSBsZW4gT3V0cHV0IGJ1ZmZlciBsZW5ndGgKICovCiB2b2lkIG9wal9iaW9faW5pdF9lbmMob3BqX2Jpb190ICpiaW8sIE9QSl9CWVRFICpicCwgT1BKX1VJTlQzMiBsZW4pOwogLyoqCiBJbml0IGRlY29kZXIKIEBwYXJhbSBiaW8gQklPIGhhbmRsZQogQHBhcmFtIGJwIElucHV0IGJ1ZmZlcgotQHBhcmFtIGxlbiBJbnB1dCBidWZmZXIgbGVuZ3RoIAorQHBhcmFtIGxlbiBJbnB1dCBidWZmZXIgbGVuZ3RoCiAqLwogdm9pZCBvcGpfYmlvX2luaXRfZGVjKG9wal9iaW9fdCAqYmlvLCBPUEpfQllURSAqYnAsIE9QSl9VSU5UMzIgbGVuKTsKIC8qKgpAQCAtMTA5LDcgKzEwOSw3IEBACiAvKioKIFJlYWQgYml0cwogQHBhcmFtIGJpbyBCSU8gaGFuZGxlCi1AcGFyYW0gbiBOdW1iZXIgb2YgYml0cyB0byByZWFkIAorQHBhcmFtIG4gTnVtYmVyIG9mIGJpdHMgdG8gcmVhZAogQHJldHVybiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJlYWQgbnVtYmVyCiAqLwogT1BKX1VJTlQzMiBvcGpfYmlvX3JlYWQob3BqX2Jpb190ICpiaW8sIE9QSl9VSU5UMzIgbik7CkBAIC0xMzAsNSArMTMwLDUgQEAKIAogLypAfSovCiAKLSNlbmRpZiAvKiBfX0JJT19IICovCisjZW5kaWYgLyogT1BKX0JJT19IICovCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvY2lvLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2Npby5jCmluZGV4IGIyZjY0MDUuLjRmZGU5ZmUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvY2lvLmMKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9jaW8uYwpAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKLSAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQKICAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKICAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KICAqCkBAIC04LDEwICs4LDEwIEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXgKICAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0LCBBbnRvbmluIERlc2NhbXBlCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRlIgCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZSCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCkBAIC00NCw2MDEgKzQ0LDY0MCBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi12b2lkIG9wal93cml0ZV9ieXRlc19CRSAoT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX1VJTlQzMiBwX3ZhbHVlLCBPUEpfVUlOVDMyIHBfbmJfYnl0ZXMpCit2b2lkIG9wal93cml0ZV9ieXRlc19CRShPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfVUlOVDMyIHBfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbmJfYnl0ZXMpCiB7Ci0JY29uc3QgT1BKX0JZVEUgKiBsX2RhdGFfcHRyID0gKChjb25zdCBPUEpfQllURSAqKSAmcF92YWx1ZSkrc2l6ZW9mKE9QSl9VSU5UMzIpLXBfbmJfYnl0ZXM7CisgICAgY29uc3QgT1BKX0JZVEUgKiBsX2RhdGFfcHRyID0gKChjb25zdCBPUEpfQllURSAqKSAmcF92YWx1ZSkgKyBzaXplb2YoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIpIC0gcF9uYl9ieXRlczsKIAotCWFzc2VydChwX25iX2J5dGVzID4gMCAmJiBwX25iX2J5dGVzIDw9ICBzaXplb2YoT1BKX1VJTlQzMikpOworICAgIGFzc2VydChwX25iX2J5dGVzID4gMCAmJiBwX25iX2J5dGVzIDw9ICBzaXplb2YoT1BKX1VJTlQzMikpOwogCi0JbWVtY3B5KHBfYnVmZmVyLGxfZGF0YV9wdHIscF9uYl9ieXRlcyk7CisgICAgbWVtY3B5KHBfYnVmZmVyLCBsX2RhdGFfcHRyLCBwX25iX2J5dGVzKTsKIH0KIAotdm9pZCBvcGpfd3JpdGVfYnl0ZXNfTEUgKE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9VSU5UMzIgcF92YWx1ZSwgT1BKX1VJTlQzMiBwX25iX2J5dGVzKQordm9pZCBvcGpfd3JpdGVfYnl0ZXNfTEUoT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX1VJTlQzMiBwX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX25iX2J5dGVzKQogewotCWNvbnN0IE9QSl9CWVRFICogbF9kYXRhX3B0ciA9ICgoY29uc3QgT1BKX0JZVEUgKikgJnBfdmFsdWUpICsgcF9uYl9ieXRlcyAtIDE7Ci0JT1BKX1VJTlQzMiBpOworICAgIGNvbnN0IE9QSl9CWVRFICogbF9kYXRhX3B0ciA9ICgoY29uc3QgT1BKX0JZVEUgKikgJnBfdmFsdWUpICsgcF9uYl9ieXRlcyAtIDE7CisgICAgT1BKX1VJTlQzMiBpOwogCi0JYXNzZXJ0KHBfbmJfYnl0ZXMgPiAwICYmIHBfbmJfYnl0ZXMgPD0gc2l6ZW9mKE9QSl9VSU5UMzIpKTsKKyAgICBhc3NlcnQocF9uYl9ieXRlcyA+IDAgJiYgcF9uYl9ieXRlcyA8PSBzaXplb2YoT1BKX1VJTlQzMikpOwogCi0JZm9yCShpPTA7aTxwX25iX2J5dGVzOysraSkgewotCQkqKHBfYnVmZmVyKyspID0gKihsX2RhdGFfcHRyLS0pOwotCX0KKyAgICBmb3IgKGkgPSAwOyBpIDwgcF9uYl9ieXRlczsgKytpKSB7CisgICAgICAgICoocF9idWZmZXIrKykgPSAqKGxfZGF0YV9wdHItLSk7CisgICAgfQogfQogCi12b2lkIG9wal9yZWFkX2J5dGVzX0JFKGNvbnN0IE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9VSU5UMzIgKiBwX3ZhbHVlLCBPUEpfVUlOVDMyIHBfbmJfYnl0ZXMpCit2b2lkIG9wal9yZWFkX2J5dGVzX0JFKGNvbnN0IE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9VSU5UMzIgKiBwX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbmJfYnl0ZXMpCiB7Ci0JT1BKX0JZVEUgKiBsX2RhdGFfcHRyID0gKChPUEpfQllURSAqKSBwX3ZhbHVlKTsKKyAgICBPUEpfQllURSAqIGxfZGF0YV9wdHIgPSAoKE9QSl9CWVRFICopIHBfdmFsdWUpOwogCi0JYXNzZXJ0KHBfbmJfYnl0ZXMgPiAwICYmIHBfbmJfYnl0ZXMgPD0gc2l6ZW9mKE9QSl9VSU5UMzIpKTsKKyAgICBhc3NlcnQocF9uYl9ieXRlcyA+IDAgJiYgcF9uYl9ieXRlcyA8PSBzaXplb2YoT1BKX1VJTlQzMikpOwogCi0JKnBfdmFsdWUgPSAwOwotCW1lbWNweShsX2RhdGFfcHRyK3NpemVvZihPUEpfVUlOVDMyKS1wX25iX2J5dGVzLHBfYnVmZmVyLHBfbmJfYnl0ZXMpOworICAgICpwX3ZhbHVlID0gMDsKKyAgICBtZW1jcHkobF9kYXRhX3B0ciArIHNpemVvZihPUEpfVUlOVDMyKSAtIHBfbmJfYnl0ZXMsIHBfYnVmZmVyLCBwX25iX2J5dGVzKTsKIH0KIAotdm9pZCBvcGpfcmVhZF9ieXRlc19MRShjb25zdCBPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfVUlOVDMyICogcF92YWx1ZSwgT1BKX1VJTlQzMiBwX25iX2J5dGVzKQordm9pZCBvcGpfcmVhZF9ieXRlc19MRShjb25zdCBPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfVUlOVDMyICogcF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX25iX2J5dGVzKQogewotCU9QSl9CWVRFICogbF9kYXRhX3B0ciA9ICgoT1BKX0JZVEUgKikgcF92YWx1ZSkgKyBwX25iX2J5dGVzLTE7Ci0JT1BKX1VJTlQzMiBpOworICAgIE9QSl9CWVRFICogbF9kYXRhX3B0ciA9ICgoT1BKX0JZVEUgKikgcF92YWx1ZSkgKyBwX25iX2J5dGVzIC0gMTsKKyAgICBPUEpfVUlOVDMyIGk7CiAKLQlhc3NlcnQocF9uYl9ieXRlcyA+IDAgJiYgcF9uYl9ieXRlcyA8PSBzaXplb2YoT1BKX1VJTlQzMikpOworICAgIGFzc2VydChwX25iX2J5dGVzID4gMCAmJiBwX25iX2J5dGVzIDw9IHNpemVvZihPUEpfVUlOVDMyKSk7CiAKLQkqcF92YWx1ZSA9IDA7Ci0JZm9yIChpPTA7aTxwX25iX2J5dGVzOysraSkgewotCQkqKGxfZGF0YV9wdHItLSkgPSAqKHBfYnVmZmVyKyspOwotCX0KKyAgICAqcF92YWx1ZSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHBfbmJfYnl0ZXM7ICsraSkgeworICAgICAgICAqKGxfZGF0YV9wdHItLSkgPSAqKHBfYnVmZmVyKyspOworICAgIH0KIH0KIAogdm9pZCBvcGpfd3JpdGVfZG91YmxlX0JFKE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9GTE9BVDY0IHBfdmFsdWUpCiB7Ci0JY29uc3QgT1BKX0JZVEUgKiBsX2RhdGFfcHRyID0gKChjb25zdCBPUEpfQllURSAqKSAmcF92YWx1ZSk7Ci0JbWVtY3B5KHBfYnVmZmVyLGxfZGF0YV9wdHIsc2l6ZW9mKE9QSl9GTE9BVDY0KSk7CisgICAgY29uc3QgT1BKX0JZVEUgKiBsX2RhdGFfcHRyID0gKChjb25zdCBPUEpfQllURSAqKSAmcF92YWx1ZSk7CisgICAgbWVtY3B5KHBfYnVmZmVyLCBsX2RhdGFfcHRyLCBzaXplb2YoT1BKX0ZMT0FUNjQpKTsKIH0KIAogdm9pZCBvcGpfd3JpdGVfZG91YmxlX0xFKE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9GTE9BVDY0IHBfdmFsdWUpCiB7Ci0JY29uc3QgT1BKX0JZVEUgKiBsX2RhdGFfcHRyID0gKChjb25zdCBPUEpfQllURSAqKSAmcF92YWx1ZSkgKyBzaXplb2YoT1BKX0ZMT0FUNjQpIC0gMTsKLQlPUEpfVUlOVDMyIGk7Ci0JZm9yCShpPTA7aTxzaXplb2YoT1BKX0ZMT0FUNjQpOysraSkgewotCQkqKHBfYnVmZmVyKyspID0gKihsX2RhdGFfcHRyLS0pOwotCX0KKyAgICBjb25zdCBPUEpfQllURSAqIGxfZGF0YV9wdHIgPSAoKGNvbnN0IE9QSl9CWVRFICopICZwX3ZhbHVlKSArIHNpemVvZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUNjQpIC0gMTsKKyAgICBPUEpfVUlOVDMyIGk7CisgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihPUEpfRkxPQVQ2NCk7ICsraSkgeworICAgICAgICAqKHBfYnVmZmVyKyspID0gKihsX2RhdGFfcHRyLS0pOworICAgIH0KIH0KIAogdm9pZCBvcGpfcmVhZF9kb3VibGVfQkUoY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX0ZMT0FUNjQgKiBwX3ZhbHVlKQogewotCU9QSl9CWVRFICogbF9kYXRhX3B0ciA9ICgoT1BKX0JZVEUgKikgcF92YWx1ZSk7Ci0JbWVtY3B5KGxfZGF0YV9wdHIscF9idWZmZXIsc2l6ZW9mKE9QSl9GTE9BVDY0KSk7CisgICAgT1BKX0JZVEUgKiBsX2RhdGFfcHRyID0gKChPUEpfQllURSAqKSBwX3ZhbHVlKTsKKyAgICBtZW1jcHkobF9kYXRhX3B0ciwgcF9idWZmZXIsIHNpemVvZihPUEpfRkxPQVQ2NCkpOwogfQogCiB2b2lkIG9wal9yZWFkX2RvdWJsZV9MRShjb25zdCBPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfRkxPQVQ2NCAqIHBfdmFsdWUpCiB7Ci0JT1BKX0JZVEUgKiBsX2RhdGFfcHRyID0gKChPUEpfQllURSAqKSBwX3ZhbHVlKSArIHNpemVvZihPUEpfRkxPQVQ2NCktMTsKLQlPUEpfVUlOVDMyIGk7Ci0JZm9yIChpPTA7aTxzaXplb2YoT1BKX0ZMT0FUNjQpOysraSkgewotCQkqKGxfZGF0YV9wdHItLSkgPSAqKHBfYnVmZmVyKyspOwotCX0KKyAgICBPUEpfQllURSAqIGxfZGF0YV9wdHIgPSAoKE9QSl9CWVRFICopIHBfdmFsdWUpICsgc2l6ZW9mKE9QSl9GTE9BVDY0KSAtIDE7CisgICAgT1BKX1VJTlQzMiBpOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoT1BKX0ZMT0FUNjQpOyArK2kpIHsKKyAgICAgICAgKihsX2RhdGFfcHRyLS0pID0gKihwX2J1ZmZlcisrKTsKKyAgICB9CiB9CiAKIHZvaWQgb3BqX3dyaXRlX2Zsb2F0X0JFKE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9GTE9BVDMyIHBfdmFsdWUpCiB7Ci0JY29uc3QgT1BKX0JZVEUgKiBsX2RhdGFfcHRyID0gKChjb25zdCBPUEpfQllURSAqKSAmcF92YWx1ZSk7Ci0JbWVtY3B5KHBfYnVmZmVyLGxfZGF0YV9wdHIsc2l6ZW9mKE9QSl9GTE9BVDMyKSk7CisgICAgY29uc3QgT1BKX0JZVEUgKiBsX2RhdGFfcHRyID0gKChjb25zdCBPUEpfQllURSAqKSAmcF92YWx1ZSk7CisgICAgbWVtY3B5KHBfYnVmZmVyLCBsX2RhdGFfcHRyLCBzaXplb2YoT1BKX0ZMT0FUMzIpKTsKIH0KIAogdm9pZCBvcGpfd3JpdGVfZmxvYXRfTEUoT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX0ZMT0FUMzIgcF92YWx1ZSkKIHsKLQljb25zdCBPUEpfQllURSAqIGxfZGF0YV9wdHIgPSAoKGNvbnN0IE9QSl9CWVRFICopICZwX3ZhbHVlKSArIHNpemVvZihPUEpfRkxPQVQzMikgLSAxOwotCU9QSl9VSU5UMzIgaTsKLQlmb3IJKGk9MDtpPHNpemVvZihPUEpfRkxPQVQzMik7KytpKSB7Ci0JCSoocF9idWZmZXIrKykgPSAqKGxfZGF0YV9wdHItLSk7Ci0JfQorICAgIGNvbnN0IE9QSl9CWVRFICogbF9kYXRhX3B0ciA9ICgoY29uc3QgT1BKX0JZVEUgKikgJnBfdmFsdWUpICsgc2l6ZW9mKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMikgLSAxOworICAgIE9QSl9VSU5UMzIgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKE9QSl9GTE9BVDMyKTsgKytpKSB7CisgICAgICAgICoocF9idWZmZXIrKykgPSAqKGxfZGF0YV9wdHItLSk7CisgICAgfQogfQogCiB2b2lkIG9wal9yZWFkX2Zsb2F0X0JFKGNvbnN0IE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9GTE9BVDMyICogcF92YWx1ZSkKIHsKLQlPUEpfQllURSAqIGxfZGF0YV9wdHIgPSAoKE9QSl9CWVRFICopIHBfdmFsdWUpOwotCW1lbWNweShsX2RhdGFfcHRyLHBfYnVmZmVyLHNpemVvZihPUEpfRkxPQVQzMikpOworICAgIE9QSl9CWVRFICogbF9kYXRhX3B0ciA9ICgoT1BKX0JZVEUgKikgcF92YWx1ZSk7CisgICAgbWVtY3B5KGxfZGF0YV9wdHIsIHBfYnVmZmVyLCBzaXplb2YoT1BKX0ZMT0FUMzIpKTsKIH0KIAogdm9pZCBvcGpfcmVhZF9mbG9hdF9MRShjb25zdCBPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfRkxPQVQzMiAqIHBfdmFsdWUpCiB7Ci0JT1BKX0JZVEUgKiBsX2RhdGFfcHRyID0gKChPUEpfQllURSAqKSBwX3ZhbHVlKSArIHNpemVvZihPUEpfRkxPQVQzMiktMTsKLQlPUEpfVUlOVDMyIGk7Ci0JZm9yCShpPTA7aTxzaXplb2YoT1BKX0ZMT0FUMzIpOysraSkgewotCQkqKGxfZGF0YV9wdHItLSkgPSAqKHBfYnVmZmVyKyspOwotCX0KKyAgICBPUEpfQllURSAqIGxfZGF0YV9wdHIgPSAoKE9QSl9CWVRFICopIHBfdmFsdWUpICsgc2l6ZW9mKE9QSl9GTE9BVDMyKSAtIDE7CisgICAgT1BKX1VJTlQzMiBpOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoT1BKX0ZMT0FUMzIpOyArK2kpIHsKKyAgICAgICAgKihsX2RhdGFfcHRyLS0pID0gKihwX2J1ZmZlcisrKTsKKyAgICB9CiB9CiAKLW9wal9zdHJlYW1fdCogT1BKX0NBTExDT05WIG9wal9zdHJlYW1fY3JlYXRlKE9QSl9TSVpFX1QgcF9idWZmZXJfc2l6ZSxPUEpfQk9PTCBsX2lzX2lucHV0KQorb3BqX3N0cmVhbV90KiBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9jcmVhdGUoT1BKX1NJWkVfVCBwX2J1ZmZlcl9zaXplLAorICAgICAgICBPUEpfQk9PTCBsX2lzX2lucHV0KQogewotCW9wal9zdHJlYW1fcHJpdmF0ZV90ICogbF9zdHJlYW0gPSAwMDsKLQlsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCopIG9wal9jYWxsb2MoMSxzaXplb2Yob3BqX3N0cmVhbV9wcml2YXRlX3QpKTsKLQlpZiAoISBsX3N0cmVhbSkgewotCQlyZXR1cm4gMDA7Ci0JfQorICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICogbF9zdHJlYW0gPSAwMDsKKyAgICBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCopIG9wal9jYWxsb2MoMSwgc2l6ZW9mKG9wal9zdHJlYW1fcHJpdmF0ZV90KSk7CisgICAgaWYgKCEgbF9zdHJlYW0pIHsKKyAgICAgICAgcmV0dXJuIDAwOworICAgIH0KIAotCWxfc3RyZWFtLT5tX2J1ZmZlcl9zaXplID0gcF9idWZmZXJfc2l6ZTsKLQlsX3N0cmVhbS0+bV9zdG9yZWRfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfbWFsbG9jKHBfYnVmZmVyX3NpemUpOwotCWlmICghIGxfc3RyZWFtLT5tX3N0b3JlZF9kYXRhKSB7Ci0JCW9wal9mcmVlKGxfc3RyZWFtKTsKLQkJcmV0dXJuIDAwOwotCX0KKyAgICBsX3N0cmVhbS0+bV9idWZmZXJfc2l6ZSA9IHBfYnVmZmVyX3NpemU7CisgICAgbF9zdHJlYW0tPm1fc3RvcmVkX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX21hbGxvYyhwX2J1ZmZlcl9zaXplKTsKKyAgICBpZiAoISBsX3N0cmVhbS0+bV9zdG9yZWRfZGF0YSkgeworICAgICAgICBvcGpfZnJlZShsX3N0cmVhbSk7CisgICAgICAgIHJldHVybiAwMDsKKyAgICB9CiAKLQlsX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgPSBsX3N0cmVhbS0+bV9zdG9yZWRfZGF0YTsKKyAgICBsX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgPSBsX3N0cmVhbS0+bV9zdG9yZWRfZGF0YTsKIAotCWlmIChsX2lzX2lucHV0KSB7Ci0JCWxfc3RyZWFtLT5tX3N0YXR1cyB8PSBvcGpfc3RyZWFtX2VfaW5wdXQ7Ci0JCWxfc3RyZWFtLT5tX29wal9za2lwID0gb3BqX3N0cmVhbV9yZWFkX3NraXA7Ci0JCWxfc3RyZWFtLT5tX29wal9zZWVrID0gb3BqX3N0cmVhbV9yZWFkX3NlZWs7Ci0JfQotCWVsc2UgewotCQlsX3N0cmVhbS0+bV9zdGF0dXMgfD0gb3BqX3N0cmVhbV9lX291dHB1dDsKLQkJbF9zdHJlYW0tPm1fb3BqX3NraXAgPSBvcGpfc3RyZWFtX3dyaXRlX3NraXA7Ci0JCWxfc3RyZWFtLT5tX29wal9zZWVrID0gb3BqX3N0cmVhbV93cml0ZV9zZWVrOwotCX0KKyAgICBpZiAobF9pc19pbnB1dCkgeworICAgICAgICBsX3N0cmVhbS0+bV9zdGF0dXMgfD0gT1BKX1NUUkVBTV9TVEFUVVNfSU5QVVQ7CisgICAgICAgIGxfc3RyZWFtLT5tX29wal9za2lwID0gb3BqX3N0cmVhbV9yZWFkX3NraXA7CisgICAgICAgIGxfc3RyZWFtLT5tX29wal9zZWVrID0gb3BqX3N0cmVhbV9yZWFkX3NlZWs7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbF9zdHJlYW0tPm1fc3RhdHVzIHw9IE9QSl9TVFJFQU1fU1RBVFVTX09VVFBVVDsKKyAgICAgICAgbF9zdHJlYW0tPm1fb3BqX3NraXAgPSBvcGpfc3RyZWFtX3dyaXRlX3NraXA7CisgICAgICAgIGxfc3RyZWFtLT5tX29wal9zZWVrID0gb3BqX3N0cmVhbV93cml0ZV9zZWVrOworICAgIH0KIAotCWxfc3RyZWFtLT5tX3JlYWRfZm4gPSBvcGpfc3RyZWFtX2RlZmF1bHRfcmVhZDsKLQlsX3N0cmVhbS0+bV93cml0ZV9mbiA9IG9wal9zdHJlYW1fZGVmYXVsdF93cml0ZTsKLQlsX3N0cmVhbS0+bV9za2lwX2ZuID0gb3BqX3N0cmVhbV9kZWZhdWx0X3NraXA7Ci0JbF9zdHJlYW0tPm1fc2Vla19mbiA9IG9wal9zdHJlYW1fZGVmYXVsdF9zZWVrOworICAgIGxfc3RyZWFtLT5tX3JlYWRfZm4gPSBvcGpfc3RyZWFtX2RlZmF1bHRfcmVhZDsKKyAgICBsX3N0cmVhbS0+bV93cml0ZV9mbiA9IG9wal9zdHJlYW1fZGVmYXVsdF93cml0ZTsKKyAgICBsX3N0cmVhbS0+bV9za2lwX2ZuID0gb3BqX3N0cmVhbV9kZWZhdWx0X3NraXA7CisgICAgbF9zdHJlYW0tPm1fc2Vla19mbiA9IG9wal9zdHJlYW1fZGVmYXVsdF9zZWVrOwogCi0JcmV0dXJuIChvcGpfc3RyZWFtX3QgKikgbF9zdHJlYW07CisgICAgcmV0dXJuIChvcGpfc3RyZWFtX3QgKikgbF9zdHJlYW07CiB9CiAKIG9wal9zdHJlYW1fdCogT1BKX0NBTExDT05WIG9wal9zdHJlYW1fZGVmYXVsdF9jcmVhdGUoT1BKX0JPT0wgbF9pc19pbnB1dCkKIHsKLQlyZXR1cm4gb3BqX3N0cmVhbV9jcmVhdGUoT1BKX0oyS19TVFJFQU1fQ0hVTktfU0laRSxsX2lzX2lucHV0KTsKKyAgICByZXR1cm4gb3BqX3N0cmVhbV9jcmVhdGUoT1BKX0oyS19TVFJFQU1fQ0hVTktfU0laRSwgbF9pc19pbnB1dCk7CiB9CiAKIHZvaWQgT1BKX0NBTExDT05WIG9wal9zdHJlYW1fZGVzdHJveShvcGpfc3RyZWFtX3QqIHBfc3RyZWFtKQogewotCW9wal9zdHJlYW1fcHJpdmF0ZV90KiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCopIHBfc3RyZWFtOwotCQotCWlmIChsX3N0cmVhbSkgewotCQlpZiAobF9zdHJlYW0tPm1fZnJlZV91c2VyX2RhdGFfZm4pIHsKLQkJCWxfc3RyZWFtLT5tX2ZyZWVfdXNlcl9kYXRhX2ZuKGxfc3RyZWFtLT5tX3VzZXJfZGF0YSk7Ci0JCX0KLQkJb3BqX2ZyZWUobF9zdHJlYW0tPm1fc3RvcmVkX2RhdGEpOwotCQlsX3N0cmVhbS0+bV9zdG9yZWRfZGF0YSA9IDAwOwotCQlvcGpfZnJlZShsX3N0cmVhbSk7Ci0JfQorICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90KiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCopIHBfc3RyZWFtOworCisgICAgaWYgKGxfc3RyZWFtKSB7CisgICAgICAgIGlmIChsX3N0cmVhbS0+bV9mcmVlX3VzZXJfZGF0YV9mbikgeworICAgICAgICAgICAgbF9zdHJlYW0tPm1fZnJlZV91c2VyX2RhdGFfZm4obF9zdHJlYW0tPm1fdXNlcl9kYXRhKTsKKyAgICAgICAgfQorICAgICAgICBvcGpfZnJlZShsX3N0cmVhbS0+bV9zdG9yZWRfZGF0YSk7CisgICAgICAgIGxfc3RyZWFtLT5tX3N0b3JlZF9kYXRhID0gMDA7CisgICAgICAgIG9wal9mcmVlKGxfc3RyZWFtKTsKKyAgICB9CiB9CiAKLXZvaWQgT1BKX0NBTExDT05WIG9wal9zdHJlYW1fc2V0X3JlYWRfZnVuY3Rpb24ob3BqX3N0cmVhbV90KiBwX3N0cmVhbSwgb3BqX3N0cmVhbV9yZWFkX2ZuIHBfZnVuY3Rpb24pCit2b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX3NldF9yZWFkX2Z1bmN0aW9uKG9wal9zdHJlYW1fdCogcF9zdHJlYW0sCisgICAgICAgIG9wal9zdHJlYW1fcmVhZF9mbiBwX2Z1bmN0aW9uKQogewotCW9wal9zdHJlYW1fcHJpdmF0ZV90KiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCopIHBfc3RyZWFtOworICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90KiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCopIHBfc3RyZWFtOwogCi0JaWYgKCghbF9zdHJlYW0pIHx8ICghIChsX3N0cmVhbS0+bV9zdGF0dXMgJiBvcGpfc3RyZWFtX2VfaW5wdXQpKSkgewotCQlyZXR1cm47Ci0JfQorICAgIGlmICgoIWxfc3RyZWFtKSB8fCAoIShsX3N0cmVhbS0+bV9zdGF0dXMgJiBPUEpfU1RSRUFNX1NUQVRVU19JTlBVVCkpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLQlsX3N0cmVhbS0+bV9yZWFkX2ZuID0gcF9mdW5jdGlvbjsKKyAgICBsX3N0cmVhbS0+bV9yZWFkX2ZuID0gcF9mdW5jdGlvbjsKIH0KIAotdm9pZCBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9zZXRfc2Vla19mdW5jdGlvbihvcGpfc3RyZWFtX3QqIHBfc3RyZWFtLCBvcGpfc3RyZWFtX3NlZWtfZm4gcF9mdW5jdGlvbikKK3ZvaWQgT1BKX0NBTExDT05WIG9wal9zdHJlYW1fc2V0X3NlZWtfZnVuY3Rpb24ob3BqX3N0cmVhbV90KiBwX3N0cmVhbSwKKyAgICAgICAgb3BqX3N0cmVhbV9zZWVrX2ZuIHBfZnVuY3Rpb24pCiB7Ci0Jb3BqX3N0cmVhbV9wcml2YXRlX3QqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90KikgcF9zdHJlYW07Ci0JCi0JaWYgKCFsX3N0cmVhbSkgewotCQlyZXR1cm47Ci0JfQotCWxfc3RyZWFtLT5tX3NlZWtfZm4gPSBwX2Z1bmN0aW9uOworICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90KiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCopIHBfc3RyZWFtOworCisgICAgaWYgKCFsX3N0cmVhbSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGxfc3RyZWFtLT5tX3NlZWtfZm4gPSBwX2Z1bmN0aW9uOwogfQogCi12b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX3NldF93cml0ZV9mdW5jdGlvbihvcGpfc3RyZWFtX3QqIHBfc3RyZWFtLCBvcGpfc3RyZWFtX3dyaXRlX2ZuIHBfZnVuY3Rpb24pCit2b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX3NldF93cml0ZV9mdW5jdGlvbihvcGpfc3RyZWFtX3QqIHBfc3RyZWFtLAorICAgICAgICBvcGpfc3RyZWFtX3dyaXRlX2ZuIHBfZnVuY3Rpb24pCiB7Ci0Jb3BqX3N0cmVhbV9wcml2YXRlX3QqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90KikgcF9zdHJlYW07Ci0JCi0JaWYgKCghbF9zdHJlYW0gKXx8ICghIChsX3N0cmVhbS0+bV9zdGF0dXMgJiBvcGpfc3RyZWFtX2Vfb3V0cHV0KSkpIHsKLQkJcmV0dXJuOwotCX0KKyAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCogbF9zdHJlYW0gPSAob3BqX3N0cmVhbV9wcml2YXRlX3QqKSBwX3N0cmVhbTsKIAotCWxfc3RyZWFtLT5tX3dyaXRlX2ZuID0gcF9mdW5jdGlvbjsKKyAgICBpZiAoKCFsX3N0cmVhbSkgfHwgKCEobF9zdHJlYW0tPm1fc3RhdHVzICYgT1BKX1NUUkVBTV9TVEFUVVNfT1VUUFVUKSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGxfc3RyZWFtLT5tX3dyaXRlX2ZuID0gcF9mdW5jdGlvbjsKIH0KIAotdm9pZCBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9zZXRfc2tpcF9mdW5jdGlvbihvcGpfc3RyZWFtX3QqIHBfc3RyZWFtLCBvcGpfc3RyZWFtX3NraXBfZm4gcF9mdW5jdGlvbikKK3ZvaWQgT1BKX0NBTExDT05WIG9wal9zdHJlYW1fc2V0X3NraXBfZnVuY3Rpb24ob3BqX3N0cmVhbV90KiBwX3N0cmVhbSwKKyAgICAgICAgb3BqX3N0cmVhbV9za2lwX2ZuIHBfZnVuY3Rpb24pCiB7Ci0Jb3BqX3N0cmVhbV9wcml2YXRlX3QqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90KikgcF9zdHJlYW07Ci0JCi0JaWYgKCEgbF9zdHJlYW0pIHsKLQkJcmV0dXJuOwotCX0KKyAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCogbF9zdHJlYW0gPSAob3BqX3N0cmVhbV9wcml2YXRlX3QqKSBwX3N0cmVhbTsKIAotCWxfc3RyZWFtLT5tX3NraXBfZm4gPSBwX2Z1bmN0aW9uOworICAgIGlmICghIGxfc3RyZWFtKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBsX3N0cmVhbS0+bV9za2lwX2ZuID0gcF9mdW5jdGlvbjsKIH0KIAotdm9pZCBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9zZXRfdXNlcl9kYXRhKG9wal9zdHJlYW1fdCogcF9zdHJlYW0sIHZvaWQgKiBwX2RhdGEsIG9wal9zdHJlYW1fZnJlZV91c2VyX2RhdGFfZm4gcF9mdW5jdGlvbikKK3ZvaWQgT1BKX0NBTExDT05WIG9wal9zdHJlYW1fc2V0X3VzZXJfZGF0YShvcGpfc3RyZWFtX3QqIHBfc3RyZWFtLAorICAgICAgICB2b2lkICogcF9kYXRhLCBvcGpfc3RyZWFtX2ZyZWVfdXNlcl9kYXRhX2ZuIHBfZnVuY3Rpb24pCiB7Ci0Jb3BqX3N0cmVhbV9wcml2YXRlX3QqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90KikgcF9zdHJlYW07Ci0JaWYgKCFsX3N0cmVhbSkKLQkJcmV0dXJuOwotCWxfc3RyZWFtLT5tX3VzZXJfZGF0YSA9IHBfZGF0YTsKLSAgbF9zdHJlYW0tPm1fZnJlZV91c2VyX2RhdGFfZm4gPSBwX2Z1bmN0aW9uOworICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90KiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCopIHBfc3RyZWFtOworICAgIGlmICghbF9zdHJlYW0pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsX3N0cmVhbS0+bV91c2VyX2RhdGEgPSBwX2RhdGE7CisgICAgbF9zdHJlYW0tPm1fZnJlZV91c2VyX2RhdGFfZm4gPSBwX2Z1bmN0aW9uOwogfQogCi12b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX3NldF91c2VyX2RhdGFfbGVuZ3RoKG9wal9zdHJlYW1fdCogcF9zdHJlYW0sIE9QSl9VSU5UNjQgZGF0YV9sZW5ndGgpCit2b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX3NldF91c2VyX2RhdGFfbGVuZ3RoKG9wal9zdHJlYW1fdCogcF9zdHJlYW0sCisgICAgICAgIE9QSl9VSU5UNjQgZGF0YV9sZW5ndGgpCiB7Ci0Jb3BqX3N0cmVhbV9wcml2YXRlX3QqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90KikgcF9zdHJlYW07Ci0JaWYgKCFsX3N0cmVhbSkKLQkJcmV0dXJuOwotCWxfc3RyZWFtLT5tX3VzZXJfZGF0YV9sZW5ndGggPSBkYXRhX2xlbmd0aDsKKyAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCogbF9zdHJlYW0gPSAob3BqX3N0cmVhbV9wcml2YXRlX3QqKSBwX3N0cmVhbTsKKyAgICBpZiAoIWxfc3RyZWFtKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbF9zdHJlYW0tPm1fdXNlcl9kYXRhX2xlbmd0aCA9IGRhdGFfbGVuZ3RoOwogfQogCi1PUEpfU0laRV9UIG9wal9zdHJlYW1fcmVhZF9kYXRhIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9TSVpFX1QgcF9zaXplLCBvcGpfZXZlbnRfbWdyX3QgKiBwX2V2ZW50X21ncikKK09QSl9TSVpFX1Qgb3BqX3N0cmVhbV9yZWFkX2RhdGEob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX1NJWkVfVCBwX3NpemUsIG9wal9ldmVudF9tZ3JfdCAqIHBfZXZlbnRfbWdyKQogewotCU9QSl9TSVpFX1QgbF9yZWFkX25iX2J5dGVzID0gMDsKLQlpZiAocF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyID49IHBfc2l6ZSkgewotCQltZW1jcHkocF9idWZmZXIscF9zdHJlYW0tPm1fY3VycmVudF9kYXRhLHBfc2l6ZSk7Ci0JCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSArPSBwX3NpemU7Ci0JCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciAtPSBwX3NpemU7Ci0JCWxfcmVhZF9uYl9ieXRlcyArPSBwX3NpemU7Ci0JCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IChPUEpfT0ZGX1QpcF9zaXplOwotCQlyZXR1cm4gbF9yZWFkX25iX2J5dGVzOwotCX0KKyAgICBPUEpfU0laRV9UIGxfcmVhZF9uYl9ieXRlcyA9IDA7CisgICAgaWYgKHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA+PSBwX3NpemUpIHsKKyAgICAgICAgbWVtY3B5KHBfYnVmZmVyLCBwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEsIHBfc2l6ZSk7CisgICAgICAgIHBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSArPSBwX3NpemU7CisgICAgICAgIHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciAtPSBwX3NpemU7CisgICAgICAgIGxfcmVhZF9uYl9ieXRlcyArPSBwX3NpemU7CisgICAgICAgIHBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IChPUEpfT0ZGX1QpcF9zaXplOworICAgICAgICByZXR1cm4gbF9yZWFkX25iX2J5dGVzOworICAgIH0KIAotCS8qIHdlIGFyZSBub3cgaW4gdGhlIGNhc2Ugd2hlbiB0aGUgcmVtYWluaW5nIGRhdGEgaWYgbm90IHN1ZmZpY2llbnQgKi8KLQlpZiAocF9zdHJlYW0tPm1fc3RhdHVzICYgb3BqX3N0cmVhbV9lX2VuZCkgewotCQlsX3JlYWRfbmJfYnl0ZXMgKz0gcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOwotCQltZW1jcHkocF9idWZmZXIscF9zdHJlYW0tPm1fY3VycmVudF9kYXRhLHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcik7Ci0JCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSArPSBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7Ci0JCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IChPUEpfT0ZGX1QpcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOwotCQlwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSAwOwotCQlyZXR1cm4gbF9yZWFkX25iX2J5dGVzID8gbF9yZWFkX25iX2J5dGVzIDogKE9QSl9TSVpFX1QpLTE7Ci0JfQorICAgIC8qIHdlIGFyZSBub3cgaW4gdGhlIGNhc2Ugd2hlbiB0aGUgcmVtYWluaW5nIGRhdGEgaWYgbm90IHN1ZmZpY2llbnQgKi8KKyAgICBpZiAocF9zdHJlYW0tPm1fc3RhdHVzICYgT1BKX1NUUkVBTV9TVEFUVVNfRU5EKSB7CisgICAgICAgIGxfcmVhZF9uYl9ieXRlcyArPSBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7CisgICAgICAgIG1lbWNweShwX2J1ZmZlciwgcF9zdHJlYW0tPm1fY3VycmVudF9kYXRhLCBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIpOworICAgICAgICBwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgKz0gcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOworICAgICAgICBwX3N0cmVhbS0+bV9ieXRlX29mZnNldCArPSAoT1BKX09GRl9UKXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKKyAgICAgICAgcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyID0gMDsKKyAgICAgICAgcmV0dXJuIGxfcmVhZF9uYl9ieXRlcyA/IGxfcmVhZF9uYl9ieXRlcyA6IChPUEpfU0laRV9UKSAtIDE7CisgICAgfQogCi0JLyogdGhlIGZsYWcgaXMgbm90IHNldCwgd2UgY29weSBkYXRhIGFuZCB0aGVuIGRvIGFuIGFjdHVhbCByZWFkIG9uIHRoZSBzdHJlYW0gKi8KLQlpZiAocF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyKSB7Ci0JCWxfcmVhZF9uYl9ieXRlcyArPSBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7Ci0JCW1lbWNweShwX2J1ZmZlcixwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEscF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyKTsKLQkJcF9zdHJlYW0tPm1fY3VycmVudF9kYXRhID0gcF9zdHJlYW0tPm1fc3RvcmVkX2RhdGE7Ci0JCXBfYnVmZmVyICs9IHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKLQkJcF9zaXplIC09IHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKLQkJcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQgKz0gKE9QSl9PRkZfVClwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7Ci0JCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7Ci0JfQotCWVsc2UgewotICAgIC8qIGNhc2Ugd2hlcmUgd2UgYXJlIGFscmVhZHkgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyCi0gICAgICAgc28gcmVzZXQgdGhlIG1fY3VycmVudF9kYXRhIHRvIHBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGUKLSAgICAgICBzdG9yZWQgYnVmZmVyIHRvIGdldCByZWFkeSB0byByZWFkIGZyb20gZGlzayovCi0JCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOwotCX0KKyAgICAvKiB0aGUgZmxhZyBpcyBub3Qgc2V0LCB3ZSBjb3B5IGRhdGEgYW5kIHRoZW4gZG8gYW4gYWN0dWFsIHJlYWQgb24gdGhlIHN0cmVhbSAqLworICAgIGlmIChwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIpIHsKKyAgICAgICAgbF9yZWFkX25iX2J5dGVzICs9IHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKKyAgICAgICAgbWVtY3B5KHBfYnVmZmVyLCBwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEsIHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcik7CisgICAgICAgIHBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOworICAgICAgICBwX2J1ZmZlciArPSBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7CisgICAgICAgIHBfc2l6ZSAtPSBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7CisgICAgICAgIHBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IChPUEpfT0ZGX1QpcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOworICAgICAgICBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGNhc2Ugd2hlcmUgd2UgYXJlIGFscmVhZHkgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyCisgICAgICAgICAgIHNvIHJlc2V0IHRoZSBtX2N1cnJlbnRfZGF0YSB0byBwb2ludCB0byB0aGUgc3RhcnQgb2YgdGhlCisgICAgICAgICAgIHN0b3JlZCBidWZmZXIgdG8gZ2V0IHJlYWR5IHRvIHJlYWQgZnJvbSBkaXNrKi8KKyAgICAgICAgcF9zdHJlYW0tPm1fY3VycmVudF9kYXRhID0gcF9zdHJlYW0tPm1fc3RvcmVkX2RhdGE7CisgICAgfQogCi0JZm9yICg7OykgewotCQkvKiB3ZSBzaG91bGQgcmVhZCBsZXNzIHRoYW4gYSBjaHVuayAtPiByZWFkIGEgY2h1bmsgKi8KLQkJaWYgKHBfc2l6ZSA8IHBfc3RyZWFtLT5tX2J1ZmZlcl9zaXplKSB7Ci0JCQkvKiB3ZSBzaG91bGQgZG8gYW4gYWN0dWFsIHJlYWQgb24gdGhlIG1lZGlhICovCi0JCQlwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSBwX3N0cmVhbS0+bV9yZWFkX2ZuKHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhLHBfc3RyZWFtLT5tX2J1ZmZlcl9zaXplLHBfc3RyZWFtLT5tX3VzZXJfZGF0YSk7CisgICAgZm9yICg7OykgeworICAgICAgICAvKiB3ZSBzaG91bGQgcmVhZCBsZXNzIHRoYW4gYSBjaHVuayAtPiByZWFkIGEgY2h1bmsgKi8KKyAgICAgICAgaWYgKHBfc2l6ZSA8IHBfc3RyZWFtLT5tX2J1ZmZlcl9zaXplKSB7CisgICAgICAgICAgICAvKiB3ZSBzaG91bGQgZG8gYW4gYWN0dWFsIHJlYWQgb24gdGhlIG1lZGlhICovCisgICAgICAgICAgICBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSBwX3N0cmVhbS0+bV9yZWFkX2ZuKHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zdHJlYW0tPm1fYnVmZmVyX3NpemUsIHBfc3RyZWFtLT5tX3VzZXJfZGF0YSk7CiAKLQkJCWlmIChwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPT0gKE9QSl9TSVpFX1QpLTEpIHsKLQkJCQkvKiBlbmQgb2Ygc3RyZWFtICovCi0JCQkJb3BqX2V2ZW50X21zZyhwX2V2ZW50X21nciwgRVZUX0lORk8sICJTdHJlYW0gcmVhY2hlZCBpdHMgZW5kICFcbiIpOworICAgICAgICAgICAgaWYgKHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9PSAoT1BKX1NJWkVfVCkgLSAxKSB7CisgICAgICAgICAgICAgICAgLyogZW5kIG9mIHN0cmVhbSAqLworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9ldmVudF9tZ3IsIEVWVF9JTkZPLCAiU3RyZWFtIHJlYWNoZWQgaXRzIGVuZCAhXG4iKTsKIAotCQkJCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7Ci0JCQkJcF9zdHJlYW0tPm1fc3RhdHVzIHw9IG9wal9zdHJlYW1fZV9lbmQ7Ci0JCQkJLyogZW5kIG9mIHN0cmVhbSAqLwotCQkJCXJldHVybiBsX3JlYWRfbmJfYnl0ZXMgPyBsX3JlYWRfbmJfYnl0ZXMgOiAoT1BKX1NJWkVfVCktMTsKLQkJCX0KLQkJCWVsc2UgaWYJKHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA8IHBfc2l6ZSkgewotCQkJCS8qIG5vdCBlbm91Z2ggZGF0YSAqLwotCQkJCWxfcmVhZF9uYl9ieXRlcyArPSBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7Ci0JCQkJbWVtY3B5KHBfYnVmZmVyLHBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSxwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIpOwotCQkJCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOwotCQkJCXBfYnVmZmVyICs9IHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKLQkJCQlwX3NpemUgLT0gcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOwotCQkJCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IChPUEpfT0ZGX1QpcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOwotCQkJCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlsX3JlYWRfbmJfYnl0ZXMgKz0gcF9zaXplOwotCQkJCW1lbWNweShwX2J1ZmZlcixwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEscF9zaXplKTsKLQkJCQlwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgKz0gcF9zaXplOwotCQkJCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciAtPSBwX3NpemU7Ci0JCQkJcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQgKz0gKE9QSl9PRkZfVClwX3NpemU7Ci0JCQkJcmV0dXJuIGxfcmVhZF9uYl9ieXRlczsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8qIGRpcmVjdCByZWFkIG9uIHRoZSBkZXN0IGJ1ZmZlciAqLwotCQkJcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyID0gcF9zdHJlYW0tPm1fcmVhZF9mbihwX2J1ZmZlcixwX3NpemUscF9zdHJlYW0tPm1fdXNlcl9kYXRhKTsKKyAgICAgICAgICAgICAgICBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSAwOworICAgICAgICAgICAgICAgIHBfc3RyZWFtLT5tX3N0YXR1cyB8PSBPUEpfU1RSRUFNX1NUQVRVU19FTkQ7CisgICAgICAgICAgICAgICAgLyogZW5kIG9mIHN0cmVhbSAqLworICAgICAgICAgICAgICAgIHJldHVybiBsX3JlYWRfbmJfYnl0ZXMgPyBsX3JlYWRfbmJfYnl0ZXMgOiAoT1BKX1NJWkVfVCkgLSAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPCBwX3NpemUpIHsKKyAgICAgICAgICAgICAgICAvKiBub3QgZW5vdWdoIGRhdGEgKi8KKyAgICAgICAgICAgICAgICBsX3JlYWRfbmJfYnl0ZXMgKz0gcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOworICAgICAgICAgICAgICAgIG1lbWNweShwX2J1ZmZlciwgcF9zdHJlYW0tPm1fY3VycmVudF9kYXRhLCBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIpOworICAgICAgICAgICAgICAgIHBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOworICAgICAgICAgICAgICAgIHBfYnVmZmVyICs9IHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKKyAgICAgICAgICAgICAgICBwX3NpemUgLT0gcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOworICAgICAgICAgICAgICAgIHBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IChPUEpfT0ZGX1QpcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOworICAgICAgICAgICAgICAgIHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxfcmVhZF9uYl9ieXRlcyArPSBwX3NpemU7CisgICAgICAgICAgICAgICAgbWVtY3B5KHBfYnVmZmVyLCBwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEsIHBfc2l6ZSk7CisgICAgICAgICAgICAgICAgcF9zdHJlYW0tPm1fY3VycmVudF9kYXRhICs9IHBfc2l6ZTsKKyAgICAgICAgICAgICAgICBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgLT0gcF9zaXplOworICAgICAgICAgICAgICAgIHBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IChPUEpfT0ZGX1QpcF9zaXplOworICAgICAgICAgICAgICAgIHJldHVybiBsX3JlYWRfbmJfYnl0ZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBkaXJlY3QgcmVhZCBvbiB0aGUgZGVzdCBidWZmZXIgKi8KKyAgICAgICAgICAgIHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IHBfc3RyZWFtLT5tX3JlYWRfZm4ocF9idWZmZXIsIHBfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc3RyZWFtLT5tX3VzZXJfZGF0YSk7CiAKLQkJCWlmIChwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPT0gKE9QSl9TSVpFX1QpLTEpIHsKLQkJCQkvKiAgZW5kIG9mIHN0cmVhbSAqLwotCQkJCW9wal9ldmVudF9tc2cocF9ldmVudF9tZ3IsIEVWVF9JTkZPLCAiU3RyZWFtIHJlYWNoZWQgaXRzIGVuZCAhXG4iKTsKKyAgICAgICAgICAgIGlmIChwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPT0gKE9QSl9TSVpFX1QpIC0gMSkgeworICAgICAgICAgICAgICAgIC8qICBlbmQgb2Ygc3RyZWFtICovCisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX2V2ZW50X21nciwgRVZUX0lORk8sICJTdHJlYW0gcmVhY2hlZCBpdHMgZW5kICFcbiIpOwogCi0JCQkJcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyID0gMDsKLQkJCQlwX3N0cmVhbS0+bV9zdGF0dXMgfD0gb3BqX3N0cmVhbV9lX2VuZDsKLQkJCQkvKiBlbmQgb2Ygc3RyZWFtICovCi0JCQkJcmV0dXJuIGxfcmVhZF9uYl9ieXRlcyA/IGxfcmVhZF9uYl9ieXRlcyA6IChPUEpfU0laRV9UKS0xOwotCQkJfQotCQkJZWxzZSBpZiAocF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyIDwgcF9zaXplKSB7Ci0JCQkJLyogbm90IGVub3VnaCBkYXRhICovCi0JCQkJbF9yZWFkX25iX2J5dGVzICs9IHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKLQkJCQlwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgPSBwX3N0cmVhbS0+bV9zdG9yZWRfZGF0YTsKLQkJCQlwX2J1ZmZlciArPSBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7Ci0JCQkJcF9zaXplIC09IHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKLQkJCQlwX3N0cmVhbS0+bV9ieXRlX29mZnNldCArPSAoT1BKX09GRl9UKXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKLQkJCQlwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSAwOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogd2UgaGF2ZSByZWFkIHRoZSBleGFjdCBzaXplICovCi0JCQkJbF9yZWFkX25iX2J5dGVzICs9IHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKLQkJCQlwX3N0cmVhbS0+bV9ieXRlX29mZnNldCArPSAoT1BKX09GRl9UKXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKLQkJCQlwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgPSBwX3N0cmVhbS0+bV9zdG9yZWRfZGF0YTsKLQkJCQlwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSAwOwotCQkJCXJldHVybiBsX3JlYWRfbmJfYnl0ZXM7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgICAgICAgcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyID0gMDsKKyAgICAgICAgICAgICAgICBwX3N0cmVhbS0+bV9zdGF0dXMgfD0gT1BKX1NUUkVBTV9TVEFUVVNfRU5EOworICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBzdHJlYW0gKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gbF9yZWFkX25iX2J5dGVzID8gbF9yZWFkX25iX2J5dGVzIDogKE9QSl9TSVpFX1QpIC0gMTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyIDwgcF9zaXplKSB7CisgICAgICAgICAgICAgICAgLyogbm90IGVub3VnaCBkYXRhICovCisgICAgICAgICAgICAgICAgbF9yZWFkX25iX2J5dGVzICs9IHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKKyAgICAgICAgICAgICAgICBwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgPSBwX3N0cmVhbS0+bV9zdG9yZWRfZGF0YTsKKyAgICAgICAgICAgICAgICBwX2J1ZmZlciArPSBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7CisgICAgICAgICAgICAgICAgcF9zaXplIC09IHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKKyAgICAgICAgICAgICAgICBwX3N0cmVhbS0+bV9ieXRlX29mZnNldCArPSAoT1BKX09GRl9UKXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKKyAgICAgICAgICAgICAgICBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiB3ZSBoYXZlIHJlYWQgdGhlIGV4YWN0IHNpemUgKi8KKyAgICAgICAgICAgICAgICBsX3JlYWRfbmJfYnl0ZXMgKz0gcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOworICAgICAgICAgICAgICAgIHBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IChPUEpfT0ZGX1QpcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOworICAgICAgICAgICAgICAgIHBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOworICAgICAgICAgICAgICAgIHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxfcmVhZF9uYl9ieXRlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KIAotT1BKX1NJWkVfVCBvcGpfc3RyZWFtX3dyaXRlX2RhdGEgKG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0sCi0JCQkJCQkJCSAgY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwKLQkJCQkJCQkJICBPUEpfU0laRV9UIHBfc2l6ZSwgCi0JCQkJCQkJCSAgb3BqX2V2ZW50X21ncl90ICogcF9ldmVudF9tZ3IpCitPUEpfU0laRV9UIG9wal9zdHJlYW1fd3JpdGVfZGF0YShvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9TSVpFX1QgcF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9ldmVudF9tZ3IpCiB7Ci0JT1BKX1NJWkVfVCBsX3JlbWFpbmluZ19ieXRlcyA9IDA7Ci0JT1BKX1NJWkVfVCBsX3dyaXRlX25iX2J5dGVzID0gMDsKKyAgICBPUEpfU0laRV9UIGxfcmVtYWluaW5nX2J5dGVzID0gMDsKKyAgICBPUEpfU0laRV9UIGxfd3JpdGVfbmJfYnl0ZXMgPSAwOwogCi0JaWYgKHBfc3RyZWFtLT5tX3N0YXR1cyAmIG9wal9zdHJlYW1fZV9lcnJvcikgewotCQlyZXR1cm4gKE9QSl9TSVpFX1QpLTE7Ci0JfQorICAgIGlmIChwX3N0cmVhbS0+bV9zdGF0dXMgJiBPUEpfU1RSRUFNX1NUQVRVU19FUlJPUikgeworICAgICAgICByZXR1cm4gKE9QSl9TSVpFX1QpIC0gMTsKKyAgICB9CiAKLQlmb3IgKDs7KSB7Ci0JCWxfcmVtYWluaW5nX2J5dGVzID0gcF9zdHJlYW0tPm1fYnVmZmVyX3NpemUgLSBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7Ci0JCQotCQkvKiB3ZSBoYXZlIG1vcmUgbWVtb3J5IHRoYW4gcmVxdWlyZWQgKi8KLQkJaWYgKGxfcmVtYWluaW5nX2J5dGVzID49IHBfc2l6ZSkgewotCQkJbWVtY3B5KHBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSwgcF9idWZmZXIsIHBfc2l6ZSk7Ci0JCQkKLQkJCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSArPSBwX3NpemU7Ci0JCQlwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgKz0gcF9zaXplOwotCQkJbF93cml0ZV9uYl9ieXRlcyArPSBwX3NpemU7Ci0JCQlwX3N0cmVhbS0+bV9ieXRlX29mZnNldCArPSAoT1BKX09GRl9UKXBfc2l6ZTsKLQkJCQotCQkJcmV0dXJuIGxfd3JpdGVfbmJfYnl0ZXM7Ci0JCX0KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGxfcmVtYWluaW5nX2J5dGVzID0gcF9zdHJlYW0tPm1fYnVmZmVyX3NpemUgLSBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7CiAKLQkJLyogd2UgY29weSBkYXRhIGFuZCB0aGVuIGRvIGFuIGFjdHVhbCByZWFkIG9uIHRoZSBzdHJlYW0gKi8KLQkJaWYgKGxfcmVtYWluaW5nX2J5dGVzKSB7Ci0JCQlsX3dyaXRlX25iX2J5dGVzICs9IGxfcmVtYWluaW5nX2J5dGVzOwotCQkJCi0JCQltZW1jcHkocF9zdHJlYW0tPm1fY3VycmVudF9kYXRhLHBfYnVmZmVyLGxfcmVtYWluaW5nX2J5dGVzKTsKLQkJCQotCQkJcF9zdHJlYW0tPm1fY3VycmVudF9kYXRhID0gcF9zdHJlYW0tPm1fc3RvcmVkX2RhdGE7Ci0JCQkKLQkJCXBfYnVmZmVyICs9IGxfcmVtYWluaW5nX2J5dGVzOwotCQkJcF9zaXplIC09IGxfcmVtYWluaW5nX2J5dGVzOwotCQkJcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyICs9IGxfcmVtYWluaW5nX2J5dGVzOwotCQkJcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQgKz0gKE9QSl9PRkZfVClsX3JlbWFpbmluZ19ieXRlczsKLQkJfQorICAgICAgICAvKiB3ZSBoYXZlIG1vcmUgbWVtb3J5IHRoYW4gcmVxdWlyZWQgKi8KKyAgICAgICAgaWYgKGxfcmVtYWluaW5nX2J5dGVzID49IHBfc2l6ZSkgeworICAgICAgICAgICAgbWVtY3B5KHBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSwgcF9idWZmZXIsIHBfc2l6ZSk7CiAKLQkJaWYgKCEgb3BqX3N0cmVhbV9mbHVzaChwX3N0cmVhbSwgcF9ldmVudF9tZ3IpKSB7Ci0JCQlyZXR1cm4gKE9QSl9TSVpFX1QpLTE7Ci0JCX0KLQl9CisgICAgICAgICAgICBwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgKz0gcF9zaXplOworICAgICAgICAgICAgcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyICs9IHBfc2l6ZTsKKyAgICAgICAgICAgIGxfd3JpdGVfbmJfYnl0ZXMgKz0gcF9zaXplOworICAgICAgICAgICAgcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQgKz0gKE9QSl9PRkZfVClwX3NpemU7CisKKyAgICAgICAgICAgIHJldHVybiBsX3dyaXRlX25iX2J5dGVzOworICAgICAgICB9CisKKyAgICAgICAgLyogd2UgY29weSBkYXRhIGFuZCB0aGVuIGRvIGFuIGFjdHVhbCByZWFkIG9uIHRoZSBzdHJlYW0gKi8KKyAgICAgICAgaWYgKGxfcmVtYWluaW5nX2J5dGVzKSB7CisgICAgICAgICAgICBsX3dyaXRlX25iX2J5dGVzICs9IGxfcmVtYWluaW5nX2J5dGVzOworCisgICAgICAgICAgICBtZW1jcHkocF9zdHJlYW0tPm1fY3VycmVudF9kYXRhLCBwX2J1ZmZlciwgbF9yZW1haW5pbmdfYnl0ZXMpOworCisgICAgICAgICAgICBwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgPSBwX3N0cmVhbS0+bV9zdG9yZWRfZGF0YTsKKworICAgICAgICAgICAgcF9idWZmZXIgKz0gbF9yZW1haW5pbmdfYnl0ZXM7CisgICAgICAgICAgICBwX3NpemUgLT0gbF9yZW1haW5pbmdfYnl0ZXM7CisgICAgICAgICAgICBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgKz0gbF9yZW1haW5pbmdfYnl0ZXM7CisgICAgICAgICAgICBwX3N0cmVhbS0+bV9ieXRlX29mZnNldCArPSAoT1BKX09GRl9UKWxfcmVtYWluaW5nX2J5dGVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEgb3BqX3N0cmVhbV9mbHVzaChwX3N0cmVhbSwgcF9ldmVudF9tZ3IpKSB7CisgICAgICAgICAgICByZXR1cm4gKE9QSl9TSVpFX1QpIC0gMTsKKyAgICAgICAgfQorICAgIH0KIAogfQogCi1PUEpfQk9PTCBvcGpfc3RyZWFtX2ZsdXNoIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLCBvcGpfZXZlbnRfbWdyX3QgKiBwX2V2ZW50X21ncikKK09QSl9CT09MIG9wal9zdHJlYW1fZmx1c2gob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9ldmVudF9tZ3IpCiB7Ci0JLyogdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9uIHRoZSBtZWRpYS4gKi8KLQlPUEpfU0laRV9UIGxfY3VycmVudF93cml0ZV9uYl9ieXRlcyA9IDA7CisgICAgLyogdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9uIHRoZSBtZWRpYS4gKi8KKyAgICBPUEpfU0laRV9UIGxfY3VycmVudF93cml0ZV9uYl9ieXRlcyA9IDA7CiAKLQlwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgPSBwX3N0cmVhbS0+bV9zdG9yZWRfZGF0YTsKKyAgICBwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgPSBwX3N0cmVhbS0+bV9zdG9yZWRfZGF0YTsKIAotCXdoaWxlIChwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIpIHsKLQkJLyogd2Ugc2hvdWxkIGRvIGFuIGFjdHVhbCB3cml0ZSBvbiB0aGUgbWVkaWEgKi8KLQkJbF9jdXJyZW50X3dyaXRlX25iX2J5dGVzID0gcF9zdHJlYW0tPm1fd3JpdGVfZm4ocF9zdHJlYW0tPm1fY3VycmVudF9kYXRhLAotCQkJCQkJCQkJCQkJCQlwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIsCi0JCQkJCQkJCQkJCQkJCXBfc3RyZWFtLT5tX3VzZXJfZGF0YSk7Ci0JCQotCQlpZiAobF9jdXJyZW50X3dyaXRlX25iX2J5dGVzID09IChPUEpfU0laRV9UKS0xKSB7Ci0JCQlwX3N0cmVhbS0+bV9zdGF0dXMgfD0gb3BqX3N0cmVhbV9lX2Vycm9yOwotCQkJb3BqX2V2ZW50X21zZyhwX2V2ZW50X21nciwgRVZUX0lORk8sICJFcnJvciBvbiB3cml0aW5nIHN0cmVhbSFcbiIpOworICAgIHdoaWxlIChwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIpIHsKKyAgICAgICAgLyogd2Ugc2hvdWxkIGRvIGFuIGFjdHVhbCB3cml0ZSBvbiB0aGUgbWVkaWEgKi8KKyAgICAgICAgbF9jdXJyZW50X3dyaXRlX25iX2J5dGVzID0gcF9zdHJlYW0tPm1fd3JpdGVfZm4ocF9zdHJlYW0tPm1fY3VycmVudF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc3RyZWFtLT5tX3VzZXJfZGF0YSk7CiAKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KKyAgICAgICAgaWYgKGxfY3VycmVudF93cml0ZV9uYl9ieXRlcyA9PSAoT1BKX1NJWkVfVCkgLSAxKSB7CisgICAgICAgICAgICBwX3N0cmVhbS0+bV9zdGF0dXMgfD0gT1BKX1NUUkVBTV9TVEFUVVNfRVJST1I7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfZXZlbnRfbWdyLCBFVlRfSU5GTywgIkVycm9yIG9uIHdyaXRpbmcgc3RyZWFtIVxuIik7CiAKLQkJcF9zdHJlYW0tPm1fY3VycmVudF9kYXRhICs9IGxfY3VycmVudF93cml0ZV9uYl9ieXRlczsKLQkJcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyIC09IGxfY3VycmVudF93cml0ZV9uYl9ieXRlczsKLQl9CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CiAKLQlwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgPSBwX3N0cmVhbS0+bV9zdG9yZWRfZGF0YTsKLQkKLQlyZXR1cm4gT1BKX1RSVUU7CisgICAgICAgIHBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSArPSBsX2N1cnJlbnRfd3JpdGVfbmJfYnl0ZXM7CisgICAgICAgIHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciAtPSBsX2N1cnJlbnRfd3JpdGVfbmJfYnl0ZXM7CisgICAgfQorCisgICAgcF9zdHJlYW0tPm1fY3VycmVudF9kYXRhID0gcF9zdHJlYW0tPm1fc3RvcmVkX2RhdGE7CisKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLU9QSl9PRkZfVCBvcGpfc3RyZWFtX3JlYWRfc2tpcCAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwgT1BKX09GRl9UIHBfc2l6ZSwgb3BqX2V2ZW50X21ncl90ICogcF9ldmVudF9tZ3IpCitPUEpfT0ZGX1Qgb3BqX3N0cmVhbV9yZWFkX3NraXAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfT0ZGX1QgcF9zaXplLCBvcGpfZXZlbnRfbWdyX3QgKiBwX2V2ZW50X21ncikKIHsKLQlPUEpfT0ZGX1QgbF9za2lwX25iX2J5dGVzID0gMDsKLQlPUEpfT0ZGX1QgbF9jdXJyZW50X3NraXBfbmJfYnl0ZXMgPSAwOwotCQotCWFzc2VydCggcF9zaXplID49IDAgKTsKLQkKLQlpZiAocF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyID49IChPUEpfU0laRV9UKXBfc2l6ZSkgewotCQlwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgKz0gcF9zaXplOwotCQkvKiBpdCBpcyBzYWZlIHRvIGNhc3QgcF9zaXplIHRvIE9QSl9TSVpFX1Qgc2luY2UgaXQgaXMgPD0gbV9ieXRlc19pbl9idWZmZXIKLQkJd2hpY2ggaXMgb2YgdHlwZSBPUEpfU0laRV9UICovCi0JCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciAtPSAoT1BKX1NJWkVfVClwX3NpemU7Ci0JCWxfc2tpcF9uYl9ieXRlcyArPSBwX3NpemU7Ci0JCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IGxfc2tpcF9uYl9ieXRlczsKLQkJcmV0dXJuIGxfc2tpcF9uYl9ieXRlczsKLQl9CisgICAgT1BKX09GRl9UIGxfc2tpcF9uYl9ieXRlcyA9IDA7CisgICAgT1BKX09GRl9UIGxfY3VycmVudF9za2lwX25iX2J5dGVzID0gMDsKIAotCS8qIHdlIGFyZSBub3cgaW4gdGhlIGNhc2Ugd2hlbiB0aGUgcmVtYWluaW5nIGRhdGEgaWYgbm90IHN1ZmZpY2llbnQgKi8KLQlpZiAocF9zdHJlYW0tPm1fc3RhdHVzICYgb3BqX3N0cmVhbV9lX2VuZCkgewotCQlsX3NraXBfbmJfYnl0ZXMgKz0gKE9QSl9PRkZfVClwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7Ci0JCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSArPSBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7Ci0JCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7Ci0JCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IGxfc2tpcF9uYl9ieXRlczsKLQkJcmV0dXJuIGxfc2tpcF9uYl9ieXRlcyA/IGxfc2tpcF9uYl9ieXRlcyA6IChPUEpfT0ZGX1QpIC0xOwotCX0KKyAgICBhc3NlcnQocF9zaXplID49IDApOwogCi0JLyogdGhlIGZsYWcgaXMgbm90IHNldCwgd2UgY29weSBkYXRhIGFuZCB0aGVuIGRvIGFuIGFjdHVhbCBza2lwIG9uIHRoZSBzdHJlYW0gKi8KLQlpZiAocF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyKSB7Ci0JCWxfc2tpcF9uYl9ieXRlcyArPSAoT1BKX09GRl9UKXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKLQkJcF9zdHJlYW0tPm1fY3VycmVudF9kYXRhID0gcF9zdHJlYW0tPm1fc3RvcmVkX2RhdGE7Ci0JCXBfc2l6ZSAtPSAoT1BKX09GRl9UKXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlcjsKLQkJcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyID0gMDsKLQl9CisgICAgaWYgKHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA+PSAoT1BKX1NJWkVfVClwX3NpemUpIHsKKyAgICAgICAgcF9zdHJlYW0tPm1fY3VycmVudF9kYXRhICs9IHBfc2l6ZTsKKyAgICAgICAgLyogaXQgaXMgc2FmZSB0byBjYXN0IHBfc2l6ZSB0byBPUEpfU0laRV9UIHNpbmNlIGl0IGlzIDw9IG1fYnl0ZXNfaW5fYnVmZmVyCisgICAgICAgIHdoaWNoIGlzIG9mIHR5cGUgT1BKX1NJWkVfVCAqLworICAgICAgICBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgLT0gKE9QSl9TSVpFX1QpcF9zaXplOworICAgICAgICBsX3NraXBfbmJfYnl0ZXMgKz0gcF9zaXplOworICAgICAgICBwX3N0cmVhbS0+bV9ieXRlX29mZnNldCArPSBsX3NraXBfbmJfYnl0ZXM7CisgICAgICAgIHJldHVybiBsX3NraXBfbmJfYnl0ZXM7CisgICAgfQogCi0Jd2hpbGUgKHBfc2l6ZSA+IDApIHsKLQkJLyogd2Ugc2hvdWxkIGRvIGFuIGFjdHVhbCBza2lwIG9uIHRoZSBtZWRpYSAqLwotCQlsX2N1cnJlbnRfc2tpcF9uYl9ieXRlcyA9IHBfc3RyZWFtLT5tX3NraXBfZm4ocF9zaXplLCBwX3N0cmVhbS0+bV91c2VyX2RhdGEpOwotCQlpZiAobF9jdXJyZW50X3NraXBfbmJfYnl0ZXMgPT0gKE9QSl9PRkZfVCkgLTEpIHsKLQkJCW9wal9ldmVudF9tc2cocF9ldmVudF9tZ3IsIEVWVF9JTkZPLCAiU3RyZWFtIHJlYWNoZWQgaXRzIGVuZCAhXG4iKTsKKyAgICAvKiB3ZSBhcmUgbm93IGluIHRoZSBjYXNlIHdoZW4gdGhlIHJlbWFpbmluZyBkYXRhIGlmIG5vdCBzdWZmaWNpZW50ICovCisgICAgaWYgKHBfc3RyZWFtLT5tX3N0YXR1cyAmIE9QSl9TVFJFQU1fU1RBVFVTX0VORCkgeworICAgICAgICBsX3NraXBfbmJfYnl0ZXMgKz0gKE9QSl9PRkZfVClwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7CisgICAgICAgIHBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSArPSBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXI7CisgICAgICAgIHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7CisgICAgICAgIHBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IGxfc2tpcF9uYl9ieXRlczsKKyAgICAgICAgcmV0dXJuIGxfc2tpcF9uYl9ieXRlcyA/IGxfc2tpcF9uYl9ieXRlcyA6IChPUEpfT0ZGX1QpIC0gMTsKKyAgICB9CiAKLQkJCXBfc3RyZWFtLT5tX3N0YXR1cyB8PSBvcGpfc3RyZWFtX2VfZW5kOwotCQkJcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQgKz0gbF9za2lwX25iX2J5dGVzOwotCQkJLyogZW5kIGlmIHN0cmVhbSAqLwotCQkJcmV0dXJuIGxfc2tpcF9uYl9ieXRlcyA/IGxfc2tpcF9uYl9ieXRlcyA6IChPUEpfT0ZGX1QpIC0xOwotCQl9Ci0JCXBfc2l6ZSAtPSBsX2N1cnJlbnRfc2tpcF9uYl9ieXRlczsKLQkJbF9za2lwX25iX2J5dGVzICs9IGxfY3VycmVudF9za2lwX25iX2J5dGVzOwotCX0KKyAgICAvKiB0aGUgZmxhZyBpcyBub3Qgc2V0LCB3ZSBjb3B5IGRhdGEgYW5kIHRoZW4gZG8gYW4gYWN0dWFsIHNraXAgb24gdGhlIHN0cmVhbSAqLworICAgIGlmIChwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIpIHsKKyAgICAgICAgbF9za2lwX25iX2J5dGVzICs9IChPUEpfT0ZGX1QpcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOworICAgICAgICBwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgPSBwX3N0cmVhbS0+bV9zdG9yZWRfZGF0YTsKKyAgICAgICAgcF9zaXplIC09IChPUEpfT0ZGX1QpcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyOworICAgICAgICBwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSAwOworICAgIH0KIAotCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IGxfc2tpcF9uYl9ieXRlczsKLQkKLQlyZXR1cm4gbF9za2lwX25iX2J5dGVzOworICAgIHdoaWxlIChwX3NpemUgPiAwKSB7CisgICAgICAgIC8qIENoZWNrIGlmIHdlIGFyZSBnb2luZyBiZXlvbmQgdGhlIGVuZCBvZiBmaWxlLiBNb3N0IHNraXBfZm4gZG8gbm90ICovCisgICAgICAgIC8qIGNoZWNrIHRoYXQsIGJ1dCB3ZSBtdXN0IGJlIGNhcmVmdWwgbm90IHRvIGFkdmFuY2UgbV9ieXRlX29mZnNldCAqLworICAgICAgICAvKiBiZXlvbmQgbV91c2VyX2RhdGFfbGVuZ3RoLCBvdGhlcndpc2UgKi8KKyAgICAgICAgLyogb3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdCgpIHdpbGwgYXNzZXJ0LiAqLworICAgICAgICBpZiAoKE9QSl9VSU5UNjQpKHBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICsgbF9za2lwX25iX2J5dGVzICsgcF9zaXplKSA+CisgICAgICAgICAgICAgICAgcF9zdHJlYW0tPm1fdXNlcl9kYXRhX2xlbmd0aCkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX2V2ZW50X21nciwgRVZUX0lORk8sICJTdHJlYW0gcmVhY2hlZCBpdHMgZW5kICFcbiIpOworCisgICAgICAgICAgICBwX3N0cmVhbS0+bV9ieXRlX29mZnNldCArPSBsX3NraXBfbmJfYnl0ZXM7CisgICAgICAgICAgICBsX3NraXBfbmJfYnl0ZXMgPSAoT1BKX09GRl9UKShwX3N0cmVhbS0+bV91c2VyX2RhdGFfbGVuZ3RoIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfVUlOVDY0KXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0KTsKKworICAgICAgICAgICAgb3BqX3N0cmVhbV9yZWFkX3NlZWsocF9zdHJlYW0sIChPUEpfT0ZGX1QpcF9zdHJlYW0tPm1fdXNlcl9kYXRhX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZXZlbnRfbWdyKTsKKyAgICAgICAgICAgIHBfc3RyZWFtLT5tX3N0YXR1cyB8PSBPUEpfU1RSRUFNX1NUQVRVU19FTkQ7CisKKyAgICAgICAgICAgIC8qIGVuZCBpZiBzdHJlYW0gKi8KKyAgICAgICAgICAgIHJldHVybiBsX3NraXBfbmJfYnl0ZXMgPyBsX3NraXBfbmJfYnl0ZXMgOiAoT1BKX09GRl9UKSAtIDE7CisgICAgICAgIH0KKworICAgICAgICAvKiB3ZSBzaG91bGQgZG8gYW4gYWN0dWFsIHNraXAgb24gdGhlIG1lZGlhICovCisgICAgICAgIGxfY3VycmVudF9za2lwX25iX2J5dGVzID0gcF9zdHJlYW0tPm1fc2tpcF9mbihwX3NpemUsIHBfc3RyZWFtLT5tX3VzZXJfZGF0YSk7CisgICAgICAgIGlmIChsX2N1cnJlbnRfc2tpcF9uYl9ieXRlcyA9PSAoT1BKX09GRl9UKSAtIDEpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9ldmVudF9tZ3IsIEVWVF9JTkZPLCAiU3RyZWFtIHJlYWNoZWQgaXRzIGVuZCAhXG4iKTsKKworICAgICAgICAgICAgcF9zdHJlYW0tPm1fc3RhdHVzIHw9IE9QSl9TVFJFQU1fU1RBVFVTX0VORDsKKyAgICAgICAgICAgIHBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IGxfc2tpcF9uYl9ieXRlczsKKyAgICAgICAgICAgIC8qIGVuZCBpZiBzdHJlYW0gKi8KKyAgICAgICAgICAgIHJldHVybiBsX3NraXBfbmJfYnl0ZXMgPyBsX3NraXBfbmJfYnl0ZXMgOiAoT1BKX09GRl9UKSAtIDE7CisgICAgICAgIH0KKyAgICAgICAgcF9zaXplIC09IGxfY3VycmVudF9za2lwX25iX2J5dGVzOworICAgICAgICBsX3NraXBfbmJfYnl0ZXMgKz0gbF9jdXJyZW50X3NraXBfbmJfYnl0ZXM7CisgICAgfQorCisgICAgcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQgKz0gbF9za2lwX25iX2J5dGVzOworCisgICAgcmV0dXJuIGxfc2tpcF9uYl9ieXRlczsKIH0KIAotT1BKX09GRl9UIG9wal9zdHJlYW1fd3JpdGVfc2tpcCAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwgT1BKX09GRl9UIHBfc2l6ZSwgb3BqX2V2ZW50X21ncl90ICogcF9ldmVudF9tZ3IpCitPUEpfT0ZGX1Qgb3BqX3N0cmVhbV93cml0ZV9za2lwKG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9PRkZfVCBwX3NpemUsIG9wal9ldmVudF9tZ3JfdCAqIHBfZXZlbnRfbWdyKQogewotCU9QSl9CT09MIGxfaXNfd3JpdHRlbiA9IDA7Ci0JT1BKX09GRl9UIGxfY3VycmVudF9za2lwX25iX2J5dGVzID0gMDsKLQlPUEpfT0ZGX1QgbF9za2lwX25iX2J5dGVzID0gMDsKKyAgICBPUEpfQk9PTCBsX2lzX3dyaXR0ZW4gPSAwOworICAgIE9QSl9PRkZfVCBsX2N1cnJlbnRfc2tpcF9uYl9ieXRlcyA9IDA7CisgICAgT1BKX09GRl9UIGxfc2tpcF9uYl9ieXRlcyA9IDA7CiAKLQlpZiAocF9zdHJlYW0tPm1fc3RhdHVzICYgb3BqX3N0cmVhbV9lX2Vycm9yKSB7Ci0JCXJldHVybiAoT1BKX09GRl9UKSAtMTsKLQl9CisgICAgaWYgKHBfc3RyZWFtLT5tX3N0YXR1cyAmIE9QSl9TVFJFQU1fU1RBVFVTX0VSUk9SKSB7CisgICAgICAgIHJldHVybiAoT1BKX09GRl9UKSAtIDE7CisgICAgfQogCi0JLyogd2Ugc2hvdWxkIGZsdXNoIGRhdGEgKi8KLQlsX2lzX3dyaXR0ZW4gPSBvcGpfc3RyZWFtX2ZsdXNoIChwX3N0cmVhbSwgcF9ldmVudF9tZ3IpOwotCWlmICghIGxfaXNfd3JpdHRlbikgewotCQlwX3N0cmVhbS0+bV9zdGF0dXMgfD0gb3BqX3N0cmVhbV9lX2Vycm9yOwotCQlwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSAwOwotCQlyZXR1cm4gKE9QSl9PRkZfVCkgLTE7Ci0JfQotCS8qIHRoZW4gc2tpcCAqLworICAgIC8qIHdlIHNob3VsZCBmbHVzaCBkYXRhICovCisgICAgbF9pc193cml0dGVuID0gb3BqX3N0cmVhbV9mbHVzaChwX3N0cmVhbSwgcF9ldmVudF9tZ3IpOworICAgIGlmICghIGxfaXNfd3JpdHRlbikgeworICAgICAgICBwX3N0cmVhbS0+bV9zdGF0dXMgfD0gT1BKX1NUUkVBTV9TVEFUVVNfRVJST1I7CisgICAgICAgIHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7CisgICAgICAgIHJldHVybiAoT1BKX09GRl9UKSAtIDE7CisgICAgfQorICAgIC8qIHRoZW4gc2tpcCAqLwogCi0Jd2hpbGUgKHBfc2l6ZSA+IDApIHsKLQkJLyogd2Ugc2hvdWxkIGRvIGFuIGFjdHVhbCBza2lwIG9uIHRoZSBtZWRpYSAqLwotCQlsX2N1cnJlbnRfc2tpcF9uYl9ieXRlcyA9IHBfc3RyZWFtLT5tX3NraXBfZm4ocF9zaXplLCBwX3N0cmVhbS0+bV91c2VyX2RhdGEpOwotCQkKLQkJaWYgKGxfY3VycmVudF9za2lwX25iX2J5dGVzID09IChPUEpfT0ZGX1QpLTEpIHsKLQkJCW9wal9ldmVudF9tc2cocF9ldmVudF9tZ3IsIEVWVF9JTkZPLCAiU3RyZWFtIGVycm9yIVxuIik7CisgICAgd2hpbGUgKHBfc2l6ZSA+IDApIHsKKyAgICAgICAgLyogd2Ugc2hvdWxkIGRvIGFuIGFjdHVhbCBza2lwIG9uIHRoZSBtZWRpYSAqLworICAgICAgICBsX2N1cnJlbnRfc2tpcF9uYl9ieXRlcyA9IHBfc3RyZWFtLT5tX3NraXBfZm4ocF9zaXplLCBwX3N0cmVhbS0+bV91c2VyX2RhdGEpOwogCi0JCQlwX3N0cmVhbS0+bV9zdGF0dXMgfD0gb3BqX3N0cmVhbV9lX2Vycm9yOwotCQkJcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQgKz0gbF9za2lwX25iX2J5dGVzOwotCQkJLyogZW5kIGlmIHN0cmVhbSAqLwotCQkJcmV0dXJuIGxfc2tpcF9uYl9ieXRlcyA/IGxfc2tpcF9uYl9ieXRlcyA6IChPUEpfT0ZGX1QpLTE7Ci0JCX0KLQkJcF9zaXplIC09IGxfY3VycmVudF9za2lwX25iX2J5dGVzOwotCQlsX3NraXBfbmJfYnl0ZXMgKz0gbF9jdXJyZW50X3NraXBfbmJfYnl0ZXM7Ci0JfQorICAgICAgICBpZiAobF9jdXJyZW50X3NraXBfbmJfYnl0ZXMgPT0gKE9QSl9PRkZfVCkgLSAxKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfZXZlbnRfbWdyLCBFVlRfSU5GTywgIlN0cmVhbSBlcnJvciFcbiIpOwogCi0JcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQgKz0gbF9za2lwX25iX2J5dGVzOwotCQotCXJldHVybiBsX3NraXBfbmJfYnl0ZXM7CisgICAgICAgICAgICBwX3N0cmVhbS0+bV9zdGF0dXMgfD0gT1BKX1NUUkVBTV9TVEFUVVNfRVJST1I7CisgICAgICAgICAgICBwX3N0cmVhbS0+bV9ieXRlX29mZnNldCArPSBsX3NraXBfbmJfYnl0ZXM7CisgICAgICAgICAgICAvKiBlbmQgaWYgc3RyZWFtICovCisgICAgICAgICAgICByZXR1cm4gbF9za2lwX25iX2J5dGVzID8gbF9za2lwX25iX2J5dGVzIDogKE9QSl9PRkZfVCkgLSAxOworICAgICAgICB9CisgICAgICAgIHBfc2l6ZSAtPSBsX2N1cnJlbnRfc2tpcF9uYl9ieXRlczsKKyAgICAgICAgbF9za2lwX25iX2J5dGVzICs9IGxfY3VycmVudF9za2lwX25iX2J5dGVzOworICAgIH0KKworICAgIHBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ICs9IGxfc2tpcF9uYl9ieXRlczsKKworICAgIHJldHVybiBsX3NraXBfbmJfYnl0ZXM7CiB9CiAKLU9QSl9PRkZfVCBvcGpfc3RyZWFtX3RlbGwgKGNvbnN0IG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0pCitPUEpfT0ZGX1Qgb3BqX3N0cmVhbV90ZWxsKGNvbnN0IG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0pCiB7Ci0JcmV0dXJuIHBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0OworICAgIHJldHVybiBwX3N0cmVhbS0+bV9ieXRlX29mZnNldDsKIH0KIAotT1BKX09GRl9UIG9wal9zdHJlYW1fZ2V0X251bWJlcl9ieXRlX2xlZnQgKGNvbnN0IG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0pCitPUEpfT0ZGX1Qgb3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChjb25zdCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtKQogewotICBhc3NlcnQoIHBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ID49IDAgKTsKLSAgYXNzZXJ0KCBwX3N0cmVhbS0+bV91c2VyX2RhdGFfbGVuZ3RoID49IChPUEpfVUlOVDY0KXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0KTsKLSAgcmV0dXJuIHBfc3RyZWFtLT5tX3VzZXJfZGF0YV9sZW5ndGggPwotCQkJCShPUEpfT0ZGX1QpKHBfc3RyZWFtLT5tX3VzZXJfZGF0YV9sZW5ndGgpIC0gcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQgOgotCQkJCTA7CisgICAgYXNzZXJ0KHBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ID49IDApOworICAgIGFzc2VydChwX3N0cmVhbS0+bV91c2VyX2RhdGFfbGVuZ3RoID49IChPUEpfVUlOVDY0KXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0KTsKKyAgICByZXR1cm4gcF9zdHJlYW0tPm1fdXNlcl9kYXRhX2xlbmd0aCA/CisgICAgICAgICAgIChPUEpfT0ZGX1QpKHBfc3RyZWFtLT5tX3VzZXJfZGF0YV9sZW5ndGgpIC0gcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQgOgorICAgICAgICAgICAwOwogfQogCi1PUEpfT0ZGX1Qgb3BqX3N0cmVhbV9za2lwIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLCBPUEpfT0ZGX1QgcF9zaXplLCBvcGpfZXZlbnRfbWdyX3QgKiBwX2V2ZW50X21ncikKK09QSl9PRkZfVCBvcGpfc3RyZWFtX3NraXAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwgT1BKX09GRl9UIHBfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9ldmVudF9tZ3IpCiB7Ci0JYXNzZXJ0KHBfc2l6ZSA+PSAwKTsKLQlyZXR1cm4gcF9zdHJlYW0tPm1fb3BqX3NraXAocF9zdHJlYW0scF9zaXplLHBfZXZlbnRfbWdyKTsKKyAgICBhc3NlcnQocF9zaXplID49IDApOworICAgIHJldHVybiBwX3N0cmVhbS0+bV9vcGpfc2tpcChwX3N0cmVhbSwgcF9zaXplLCBwX2V2ZW50X21ncik7CiB9CiAKLU9QSl9CT09MIG9wal9zdHJlYW1fcmVhZF9zZWVrIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLCBPUEpfT0ZGX1QgcF9zaXplLCBvcGpfZXZlbnRfbWdyX3QgKiBwX2V2ZW50X21ncikKK09QSl9CT09MIG9wal9zdHJlYW1fcmVhZF9zZWVrKG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0sIE9QSl9PRkZfVCBwX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX2V2ZW50X21ncikKIHsKLQlPUEpfQVJHX05PVF9VU0VEKHBfZXZlbnRfbWdyKTsKLQlwX3N0cmVhbS0+bV9jdXJyZW50X2RhdGEgPSBwX3N0cmVhbS0+bV9zdG9yZWRfZGF0YTsKLQlwX3N0cmVhbS0+bV9ieXRlc19pbl9idWZmZXIgPSAwOworICAgIE9QSl9BUkdfTk9UX1VTRUQocF9ldmVudF9tZ3IpOworICAgIHBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOworICAgIHBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7CiAKLQlpZiggIShwX3N0cmVhbS0+bV9zZWVrX2ZuKHBfc2l6ZSxwX3N0cmVhbS0+bV91c2VyX2RhdGEpKSApIHsKLQkJcF9zdHJlYW0tPm1fc3RhdHVzIHw9IG9wal9zdHJlYW1fZV9lbmQ7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCWVsc2UgewotCQkvKiByZXNldCBzdHJlYW0gc3RhdHVzICovCi0JCXBfc3RyZWFtLT5tX3N0YXR1cyAmPSAofm9wal9zdHJlYW1fZV9lbmQpOwotCQlwX3N0cmVhbS0+bV9ieXRlX29mZnNldCA9IHBfc2l6ZTsKKyAgICBpZiAoIShwX3N0cmVhbS0+bV9zZWVrX2ZuKHBfc2l6ZSwgcF9zdHJlYW0tPm1fdXNlcl9kYXRhKSkpIHsKKyAgICAgICAgcF9zdHJlYW0tPm1fc3RhdHVzIHw9IE9QSl9TVFJFQU1fU1RBVFVTX0VORDsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiByZXNldCBzdHJlYW0gc3RhdHVzICovCisgICAgICAgIHBfc3RyZWFtLT5tX3N0YXR1cyAmPSAofk9QSl9TVFJFQU1fU1RBVFVTX0VORCk7CisgICAgICAgIHBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ID0gcF9zaXplOwogCi0JfQorICAgIH0KIAotCXJldHVybiBPUEpfVFJVRTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLU9QSl9CT09MIG9wal9zdHJlYW1fd3JpdGVfc2VlayAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwgT1BKX09GRl9UIHBfc2l6ZSwgb3BqX2V2ZW50X21ncl90ICogcF9ldmVudF9tZ3IpCitPUEpfQk9PTCBvcGpfc3RyZWFtX3dyaXRlX3NlZWsob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfT0ZGX1QgcF9zaXplLCBvcGpfZXZlbnRfbWdyX3QgKiBwX2V2ZW50X21ncikKIHsKLQlpZiAoISBvcGpfc3RyZWFtX2ZsdXNoKHBfc3RyZWFtLHBfZXZlbnRfbWdyKSkgewotCQlwX3N0cmVhbS0+bV9zdGF0dXMgfD0gb3BqX3N0cmVhbV9lX2Vycm9yOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KKyAgICBpZiAoISBvcGpfc3RyZWFtX2ZsdXNoKHBfc3RyZWFtLCBwX2V2ZW50X21ncikpIHsKKyAgICAgICAgcF9zdHJlYW0tPm1fc3RhdHVzIHw9IE9QSl9TVFJFQU1fU1RBVFVTX0VSUk9SOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotCXBfc3RyZWFtLT5tX2N1cnJlbnRfZGF0YSA9IHBfc3RyZWFtLT5tX3N0b3JlZF9kYXRhOwotCXBfc3RyZWFtLT5tX2J5dGVzX2luX2J1ZmZlciA9IDA7CisgICAgcF9zdHJlYW0tPm1fY3VycmVudF9kYXRhID0gcF9zdHJlYW0tPm1fc3RvcmVkX2RhdGE7CisgICAgcF9zdHJlYW0tPm1fYnl0ZXNfaW5fYnVmZmVyID0gMDsKIAotCWlmICghIHBfc3RyZWFtLT5tX3NlZWtfZm4ocF9zaXplLHBfc3RyZWFtLT5tX3VzZXJfZGF0YSkpIHsKLQkJcF9zdHJlYW0tPm1fc3RhdHVzIHw9IG9wal9zdHJlYW1fZV9lcnJvcjsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0JZWxzZSB7Ci0JCXBfc3RyZWFtLT5tX2J5dGVfb2Zmc2V0ID0gcF9zaXplOwotCX0KKyAgICBpZiAoISBwX3N0cmVhbS0+bV9zZWVrX2ZuKHBfc2l6ZSwgcF9zdHJlYW0tPm1fdXNlcl9kYXRhKSkgeworICAgICAgICBwX3N0cmVhbS0+bV9zdGF0dXMgfD0gT1BKX1NUUkVBTV9TVEFUVVNfRVJST1I7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcF9zdHJlYW0tPm1fYnl0ZV9vZmZzZXQgPSBwX3NpemU7CisgICAgfQogCi0JcmV0dXJuIE9QSl9UUlVFOworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAotT1BKX0JPT0wgb3BqX3N0cmVhbV9zZWVrIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLCBPUEpfT0ZGX1QgcF9zaXplLCBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfZXZlbnRfbWdyKQorT1BKX0JPT0wgb3BqX3N0cmVhbV9zZWVrKG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0sIE9QSl9PRkZfVCBwX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX2V2ZW50X21ncikKIHsKLQlhc3NlcnQocF9zaXplID49IDApOwotCXJldHVybiBwX3N0cmVhbS0+bV9vcGpfc2VlayhwX3N0cmVhbSxwX3NpemUscF9ldmVudF9tZ3IpOworICAgIGFzc2VydChwX3NpemUgPj0gMCk7CisgICAgcmV0dXJuIHBfc3RyZWFtLT5tX29wal9zZWVrKHBfc3RyZWFtLCBwX3NpemUsIHBfZXZlbnRfbWdyKTsKIH0KIAotT1BKX0JPT0wgb3BqX3N0cmVhbV9oYXNfc2VlayAoY29uc3Qgb3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSkKK09QSl9CT09MIG9wal9zdHJlYW1faGFzX3NlZWsoY29uc3Qgb3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSkKIHsKLQlyZXR1cm4gcF9zdHJlYW0tPm1fc2Vla19mbiAhPSBvcGpfc3RyZWFtX2RlZmF1bHRfc2VlazsKKyAgICByZXR1cm4gcF9zdHJlYW0tPm1fc2Vla19mbiAhPSBvcGpfc3RyZWFtX2RlZmF1bHRfc2VlazsKIH0KIAotT1BKX1NJWkVfVCBvcGpfc3RyZWFtX2RlZmF1bHRfcmVhZCAodm9pZCAqIHBfYnVmZmVyLCBPUEpfU0laRV9UIHBfbmJfYnl0ZXMsIHZvaWQgKiBwX3VzZXJfZGF0YSkKK09QSl9TSVpFX1Qgb3BqX3N0cmVhbV9kZWZhdWx0X3JlYWQodm9pZCAqIHBfYnVmZmVyLCBPUEpfU0laRV9UIHBfbmJfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBwX3VzZXJfZGF0YSkKIHsKLQlPUEpfQVJHX05PVF9VU0VEKHBfYnVmZmVyKTsKLQlPUEpfQVJHX05PVF9VU0VEKHBfbmJfYnl0ZXMpOwotCU9QSl9BUkdfTk9UX1VTRUQocF91c2VyX2RhdGEpOwotCXJldHVybiAoT1BKX1NJWkVfVCkgLTE7CisgICAgT1BKX0FSR19OT1RfVVNFRChwX2J1ZmZlcik7CisgICAgT1BKX0FSR19OT1RfVVNFRChwX25iX2J5dGVzKTsKKyAgICBPUEpfQVJHX05PVF9VU0VEKHBfdXNlcl9kYXRhKTsKKyAgICByZXR1cm4gKE9QSl9TSVpFX1QpIC0gMTsKIH0KIAotT1BKX1NJWkVfVCBvcGpfc3RyZWFtX2RlZmF1bHRfd3JpdGUgKHZvaWQgKiBwX2J1ZmZlciwgT1BKX1NJWkVfVCBwX25iX2J5dGVzLCB2b2lkICogcF91c2VyX2RhdGEpCitPUEpfU0laRV9UIG9wal9zdHJlYW1fZGVmYXVsdF93cml0ZSh2b2lkICogcF9idWZmZXIsIE9QSl9TSVpFX1QgcF9uYl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBwX3VzZXJfZGF0YSkKIHsKLQlPUEpfQVJHX05PVF9VU0VEKHBfYnVmZmVyKTsKLQlPUEpfQVJHX05PVF9VU0VEKHBfbmJfYnl0ZXMpOwotCU9QSl9BUkdfTk9UX1VTRUQocF91c2VyX2RhdGEpOwotCXJldHVybiAoT1BKX1NJWkVfVCkgLTE7CisgICAgT1BKX0FSR19OT1RfVVNFRChwX2J1ZmZlcik7CisgICAgT1BKX0FSR19OT1RfVVNFRChwX25iX2J5dGVzKTsKKyAgICBPUEpfQVJHX05PVF9VU0VEKHBfdXNlcl9kYXRhKTsKKyAgICByZXR1cm4gKE9QSl9TSVpFX1QpIC0gMTsKIH0KIAotT1BKX09GRl9UIG9wal9zdHJlYW1fZGVmYXVsdF9za2lwIChPUEpfT0ZGX1QgcF9uYl9ieXRlcywgdm9pZCAqIHBfdXNlcl9kYXRhKQorT1BKX09GRl9UIG9wal9zdHJlYW1fZGVmYXVsdF9za2lwKE9QSl9PRkZfVCBwX25iX2J5dGVzLCB2b2lkICogcF91c2VyX2RhdGEpCiB7Ci0JT1BKX0FSR19OT1RfVVNFRChwX25iX2J5dGVzKTsKLQlPUEpfQVJHX05PVF9VU0VEKHBfdXNlcl9kYXRhKTsKLQlyZXR1cm4gKE9QSl9PRkZfVCkgLTE7CisgICAgT1BKX0FSR19OT1RfVVNFRChwX25iX2J5dGVzKTsKKyAgICBPUEpfQVJHX05PVF9VU0VEKHBfdXNlcl9kYXRhKTsKKyAgICByZXR1cm4gKE9QSl9PRkZfVCkgLSAxOwogfQogCi1PUEpfQk9PTCBvcGpfc3RyZWFtX2RlZmF1bHRfc2VlayAoT1BKX09GRl9UIHBfbmJfYnl0ZXMsIHZvaWQgKiBwX3VzZXJfZGF0YSkKK09QSl9CT09MIG9wal9zdHJlYW1fZGVmYXVsdF9zZWVrKE9QSl9PRkZfVCBwX25iX2J5dGVzLCB2b2lkICogcF91c2VyX2RhdGEpCiB7Ci0JT1BKX0FSR19OT1RfVVNFRChwX25iX2J5dGVzKTsKLQlPUEpfQVJHX05PVF9VU0VEKHBfdXNlcl9kYXRhKTsKLQlyZXR1cm4gT1BKX0ZBTFNFOworICAgIE9QSl9BUkdfTk9UX1VTRUQocF9uYl9ieXRlcyk7CisgICAgT1BKX0FSR19OT1RfVVNFRChwX3VzZXJfZGF0YSk7CisgICAgcmV0dXJuIE9QSl9GQUxTRTsKIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvY2lvLmggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2Npby5oCmluZGV4IDFiNjg0ZWYuLjY5OTZhOWEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvY2lvLmgKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9jaW8uaApAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKLSAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQKICAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKICAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KICAqCkBAIC04LDEwICs4LDEwIEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXgKICAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0LCBBbnRvbmluIERlc2NhbXBlCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRlIgCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZSCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCkBAIC0zNyw4ICszNyw4IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCi0jaWZuZGVmIF9fQ0lPX0gKLSNkZWZpbmUgX19DSU9fSAorI2lmbmRlZiBPUEpfQ0lPX0gKKyNkZWZpbmUgT1BKX0NJT19ICiAvKioKIEBmaWxlIGNpby5oCiBAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSBieXRlIGlucHV0LW91dHB1dCBwcm9jZXNzIChDSU8pCkBAIC01NCwxMTYgKzU0LDExMiBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogI2lmIGRlZmluZWQoT1BKX0JJR19FTkRJQU4pCi0JI2RlZmluZSBvcGpfd3JpdGVfYnl0ZXMJCW9wal93cml0ZV9ieXRlc19CRQotCSNkZWZpbmUgb3BqX3JlYWRfYnl0ZXMJCW9wal9yZWFkX2J5dGVzX0JFCi0JI2RlZmluZSBvcGpfd3JpdGVfZG91YmxlCW9wal93cml0ZV9kb3VibGVfQkUKLQkjZGVmaW5lIG9wal9yZWFkX2RvdWJsZQkJb3BqX3JlYWRfZG91YmxlX0JFCi0JI2RlZmluZSBvcGpfd3JpdGVfZmxvYXQJCW9wal93cml0ZV9mbG9hdF9CRQotCSNkZWZpbmUgb3BqX3JlYWRfZmxvYXQJCW9wal9yZWFkX2Zsb2F0X0JFCisjZGVmaW5lIG9wal93cml0ZV9ieXRlcyAgICAgb3BqX3dyaXRlX2J5dGVzX0JFCisjZGVmaW5lIG9wal9yZWFkX2J5dGVzICAgICAgb3BqX3JlYWRfYnl0ZXNfQkUKKyNkZWZpbmUgb3BqX3dyaXRlX2RvdWJsZSAgICBvcGpfd3JpdGVfZG91YmxlX0JFCisjZGVmaW5lIG9wal9yZWFkX2RvdWJsZSAgICAgb3BqX3JlYWRfZG91YmxlX0JFCisjZGVmaW5lIG9wal93cml0ZV9mbG9hdCAgICAgb3BqX3dyaXRlX2Zsb2F0X0JFCisjZGVmaW5lIG9wal9yZWFkX2Zsb2F0ICAgICAgb3BqX3JlYWRfZmxvYXRfQkUKICNlbHNlCi0JI2RlZmluZSBvcGpfd3JpdGVfYnl0ZXMJCW9wal93cml0ZV9ieXRlc19MRQotCSNkZWZpbmUgb3BqX3JlYWRfYnl0ZXMJCW9wal9yZWFkX2J5dGVzX0xFCi0JI2RlZmluZSBvcGpfd3JpdGVfZG91YmxlCW9wal93cml0ZV9kb3VibGVfTEUKLQkjZGVmaW5lIG9wal9yZWFkX2RvdWJsZQkJb3BqX3JlYWRfZG91YmxlX0xFCi0JI2RlZmluZSBvcGpfd3JpdGVfZmxvYXQJCW9wal93cml0ZV9mbG9hdF9MRQotCSNkZWZpbmUgb3BqX3JlYWRfZmxvYXQJCW9wal9yZWFkX2Zsb2F0X0xFCisjZGVmaW5lIG9wal93cml0ZV9ieXRlcyAgICAgb3BqX3dyaXRlX2J5dGVzX0xFCisjZGVmaW5lIG9wal9yZWFkX2J5dGVzICAgICAgb3BqX3JlYWRfYnl0ZXNfTEUKKyNkZWZpbmUgb3BqX3dyaXRlX2RvdWJsZSAgICBvcGpfd3JpdGVfZG91YmxlX0xFCisjZGVmaW5lIG9wal9yZWFkX2RvdWJsZSAgICAgb3BqX3JlYWRfZG91YmxlX0xFCisjZGVmaW5lIG9wal93cml0ZV9mbG9hdCAgICAgb3BqX3dyaXRlX2Zsb2F0X0xFCisjZGVmaW5lIG9wal9yZWFkX2Zsb2F0ICAgICAgb3BqX3JlYWRfZmxvYXRfTEUKICNlbmRpZgogCiAKLQotdHlwZWRlZiBlbnVtCi17Ci0Jb3BqX3NpZ25lZF9zZW50aW5lbAkJPSAtMSwgLyogZG8gbm90IHVzZSBpbiBjb2RlICovCi0Jb3BqX3N0cmVhbV9lX291dHB1dAkJPSAweDEsCi0Jb3BqX3N0cmVhbV9lX2lucHV0CQk9IDB4MiwKLQlvcGpfc3RyZWFtX2VfZW5kCQk9IDB4NCwKLQlvcGpfc3RyZWFtX2VfZXJyb3IJCT0gMHg4Ci19Ci1vcGpfc3RyZWFtX2ZsYWcgOworI2RlZmluZSBPUEpfU1RSRUFNX1NUQVRVU19PVVRQVVQgIDB4MVUKKyNkZWZpbmUgT1BKX1NUUkVBTV9TVEFUVVNfSU5QVVQgICAweDJVCisjZGVmaW5lIE9QSl9TVFJFQU1fU1RBVFVTX0VORCAgICAgMHg0VQorI2RlZmluZSBPUEpfU1RSRUFNX1NUQVRVU19FUlJPUiAgIDB4OFUKIAogLyoqCiBCeXRlIGlucHV0LW91dHB1dCBzdHJlYW0uCiAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlCi17Ci0JLyoqCi0JICogVXNlciBkYXRhLCBiZSBpdCBmaWxlcywgLi4uIFRoZSBhY3R1YWwgZGF0YSBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHRoZSBzdHJlYW0uCi0JICovCi0Jdm9pZCAqCQkJCQltX3VzZXJfZGF0YTsKK3R5cGVkZWYgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSB7CisgICAgLyoqCisgICAgICogVXNlciBkYXRhLCBiZSBpdCBmaWxlcywgLi4uIFRoZSBhY3R1YWwgZGF0YSBkZXBlbmRzIG9uIHRoZSB0eXBlIG9mIHRoZSBzdHJlYW0uCisgICAgICovCisgICAgdm9pZCAqICAgICAgICAgICAgICAgICAgbV91c2VyX2RhdGE7CiAKLQkvKioKLQkgKiBQb2ludGVyIHRvIGZ1bmN0aW9uIHRvIGZyZWUgbV91c2VyX2RhdGEgKE5VTEwgYXQgaW5pdGlhbGl6YXRpb24pCi0JICogd2hlbiBkZXN0cm95aW5nIHRoZSBzdHJlYW0uIElmIHBvaW50ZXIgaXMgTlVMTCB0aGUgZnVuY3Rpb24gaXMgbm90Ci0JICogY2FsbGVkIGFuZCB0aGUgbV91c2VyX2RhdGEgaXMgbm90IGZyZWVkIChldmVuIGlmIG5vbi1OVUxMKS4KLQkgKi8KLQlvcGpfc3RyZWFtX2ZyZWVfdXNlcl9kYXRhX2ZuCQltX2ZyZWVfdXNlcl9kYXRhX2ZuOworICAgIC8qKgorICAgICAqIFBvaW50ZXIgdG8gZnVuY3Rpb24gdG8gZnJlZSBtX3VzZXJfZGF0YSAoTlVMTCBhdCBpbml0aWFsaXphdGlvbikKKyAgICAgKiB3aGVuIGRlc3Ryb3lpbmcgdGhlIHN0cmVhbS4gSWYgcG9pbnRlciBpcyBOVUxMIHRoZSBmdW5jdGlvbiBpcyBub3QKKyAgICAgKiBjYWxsZWQgYW5kIHRoZSBtX3VzZXJfZGF0YSBpcyBub3QgZnJlZWQgKGV2ZW4gaWYgbm9uLU5VTEwpLgorICAgICAqLworICAgIG9wal9zdHJlYW1fZnJlZV91c2VyX2RhdGFfZm4gICAgICAgIG1fZnJlZV91c2VyX2RhdGFfZm47CiAKLQkvKioKLQkgKiBVc2VyIGRhdGEgbGVuZ3RoCi0JICovCi0JT1BKX1VJTlQ2NCAJCQkJbV91c2VyX2RhdGFfbGVuZ3RoOworICAgIC8qKgorICAgICAqIFVzZXIgZGF0YSBsZW5ndGgKKyAgICAgKi8KKyAgICBPUEpfVUlOVDY0ICAgICAgICAgICAgICBtX3VzZXJfZGF0YV9sZW5ndGg7CiAKLQkvKioKLQkgKiBQb2ludGVyIHRvIGFjdHVhbCByZWFkIGZ1bmN0aW9uIChOVUxMIGF0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2lvLgotCSAqLwotCW9wal9zdHJlYW1fcmVhZF9mbgkJbV9yZWFkX2ZuOworICAgIC8qKgorICAgICAqIFBvaW50ZXIgdG8gYWN0dWFsIHJlYWQgZnVuY3Rpb24gKE5VTEwgYXQgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBjaW8uCisgICAgICovCisgICAgb3BqX3N0cmVhbV9yZWFkX2ZuICAgICAgbV9yZWFkX2ZuOwogCi0JLyoqCi0JICogUG9pbnRlciB0byBhY3R1YWwgd3JpdGUgZnVuY3Rpb24gKE5VTEwgYXQgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBjaW8uCi0JICovCi0Jb3BqX3N0cmVhbV93cml0ZV9mbgkJbV93cml0ZV9mbjsKKyAgICAvKioKKyAgICAgKiBQb2ludGVyIHRvIGFjdHVhbCB3cml0ZSBmdW5jdGlvbiAoTlVMTCBhdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNpby4KKyAgICAgKi8KKyAgICBvcGpfc3RyZWFtX3dyaXRlX2ZuICAgICBtX3dyaXRlX2ZuOwogCi0JLyoqCi0JICogUG9pbnRlciB0byBhY3R1YWwgc2tpcCBmdW5jdGlvbiAoTlVMTCBhdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNpby4KLQkgKiBUaGVyZSBpcyBubyBzZWVrIGZ1bmN0aW9uIHRvIHByZXZlbnQgZnJvbSBiYWNrIGFuZCBmb3J0aCBzbG93IHByb2NlZHVyZXMuCi0JICovCi0Jb3BqX3N0cmVhbV9za2lwX2ZuCQltX3NraXBfZm47CisgICAgLyoqCisgICAgICogUG9pbnRlciB0byBhY3R1YWwgc2tpcCBmdW5jdGlvbiAoTlVMTCBhdCB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGNpby4KKyAgICAgKiBUaGVyZSBpcyBubyBzZWVrIGZ1bmN0aW9uIHRvIHByZXZlbnQgZnJvbSBiYWNrIGFuZCBmb3J0aCBzbG93IHByb2NlZHVyZXMuCisgICAgICovCisgICAgb3BqX3N0cmVhbV9za2lwX2ZuICAgICAgbV9za2lwX2ZuOwogCi0JLyoqCi0JICogUG9pbnRlciB0byBhY3R1YWwgc2VlayBmdW5jdGlvbiAoaWYgYXZhaWxhYmxlKS4KLQkgKi8KLQlvcGpfc3RyZWFtX3NlZWtfZm4JCW1fc2Vla19mbjsKKyAgICAvKioKKyAgICAgKiBQb2ludGVyIHRvIGFjdHVhbCBzZWVrIGZ1bmN0aW9uIChpZiBhdmFpbGFibGUpLgorICAgICAqLworICAgIG9wal9zdHJlYW1fc2Vla19mbiAgICAgIG1fc2Vla19mbjsKIAotCS8qKgotCSAqIEFjdHVhbCBkYXRhIHN0b3JlZCBpbnRvIHRoZSBzdHJlYW0gaWYgcmVhZGVkIGZyb20uIERhdGEgaXMgcmVhZCBieSBjaHVuayBvZiBmaXhlZCBzaXplLgotCSAqIHlvdSBzaG91bGQgbmV2ZXIgYWNjZXNzIHRoaXMgZGF0YSBkaXJlY3RseS4KLQkgKi8KLQlPUEpfQllURSAqCQkJCQltX3N0b3JlZF9kYXRhOworICAgIC8qKgorICAgICAqIEFjdHVhbCBkYXRhIHN0b3JlZCBpbnRvIHRoZSBzdHJlYW0gaWYgcmVhZGVkIGZyb20uIERhdGEgaXMgcmVhZCBieSBjaHVuayBvZiBmaXhlZCBzaXplLgorICAgICAqIHlvdSBzaG91bGQgbmV2ZXIgYWNjZXNzIHRoaXMgZGF0YSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICBPUEpfQllURSAqICAgICAgICAgICAgICAgICAgbV9zdG9yZWRfZGF0YTsKIAotCS8qKgotCSAqIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcmVhZCBkYXRhLgotCSAqLwotCU9QSl9CWVRFICoJCQkJCW1fY3VycmVudF9kYXRhOworICAgIC8qKgorICAgICAqIFBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgcmVhZCBkYXRhLgorICAgICAqLworICAgIE9QSl9CWVRFICogICAgICAgICAgICAgICAgICBtX2N1cnJlbnRfZGF0YTsKIAogICAgIC8qKgogICAgICogRklYTUUgRE9DLgogICAgICovCi0JT1BKX09GRl9UICgqIG1fb3BqX3NraXApKHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiAsT1BKX09GRl9UICwgc3RydWN0IG9wal9ldmVudF9tZ3IgKik7CisgICAgT1BKX09GRl9UKCogbV9vcGpfc2tpcCkoc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLCBPUEpfT0ZGX1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKik7CiAKICAgICAvKioKICAgICAqIEZJWE1FIERPQy4KICAgICAqLwotCU9QSl9CT09MICgqIG1fb3BqX3NlZWspIChzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICogLCBPUEpfT0ZGX1QgLCBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKTsKKyAgICBPUEpfQk9PTCgqIG1fb3BqX3NlZWspKHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwgT1BKX09GRl9ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKik7CiAKLQkvKioKLQkgKiBudW1iZXIgb2YgYnl0ZXMgY29udGFpbmluZyBpbiB0aGUgYnVmZmVyLgotCSAqLwotCU9QSl9TSVpFX1QJCQltX2J5dGVzX2luX2J1ZmZlcjsKKyAgICAvKioKKyAgICAgKiBudW1iZXIgb2YgYnl0ZXMgY29udGFpbmluZyBpbiB0aGUgYnVmZmVyLgorICAgICAqLworICAgIE9QSl9TSVpFX1QgICAgICAgICAgbV9ieXRlc19pbl9idWZmZXI7CiAKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQvd3JpdHRlbiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbQotCSAqLwotCU9QSl9PRkZfVAkJCW1fYnl0ZV9vZmZzZXQ7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBieXRlcyByZWFkL3dyaXR0ZW4gZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0KKyAgICAgKi8KKyAgICBPUEpfT0ZGX1QgICAgICAgICAgIG1fYnl0ZV9vZmZzZXQ7CiAKLQkvKioKLQkgKiBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyLgotCSAqLwotCU9QSl9TSVpFX1QJCQltX2J1ZmZlcl9zaXplOworICAgIC8qKgorICAgICAqIFRoZSBzaXplIG9mIHRoZSBidWZmZXIuCisgICAgICovCisgICAgT1BKX1NJWkVfVCAgICAgICAgICBtX2J1ZmZlcl9zaXplOwogCi0JLyoqCi0JICogRmxhZ3MgdG8gdGVsbCB0aGUgc3RhdHVzIG9mIHRoZSBzdHJlYW0uCi0JICovCi0Jb3BqX3N0cmVhbV9mbGFnIG1fc3RhdHVzOworICAgIC8qKgorICAgICAqIEZsYWdzIHRvIHRlbGwgdGhlIHN0YXR1cyBvZiB0aGUgc3RyZWFtLgorICAgICAqIFVzZWQgd2l0aCBPUEpfU1RSRUFNX1NUQVRVU18qIGRlZmluZXMuCisgICAgICovCisgICAgT1BKX1VJTlQzMiBtX3N0YXR1czsKIAogfQogb3BqX3N0cmVhbV9wcml2YXRlX3Q7CkBAIC0xNzMsMjIxICsxNjksMjM4IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyoqCiAgKiBXcml0ZSBzb21lIGJ5dGVzIHRvIHRoZSBnaXZlbiBkYXRhIGJ1ZmZlciwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIEJpZyBFbmRpYW4gY3B1cy4KLSAqIEBwYXJhbSBwX2J1ZmZlcgkJcG9pbnRlciB0aGUgZGF0YSBidWZmZXIgdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbSBwX3ZhbHVlCQl0aGUgdmFsdWUgdG8gd3JpdGUKLSAqIEBwYXJhbSBwX25iX2J5dGVzCXRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKKyAqIEBwYXJhbSBwX2J1ZmZlciAgICAgIHBvaW50ZXIgdGhlIGRhdGEgYnVmZmVyIHRvIHdyaXRlIGRhdGEgdG8uCisgKiBAcGFyYW0gcF92YWx1ZSAgICAgICB0aGUgdmFsdWUgdG8gd3JpdGUKKyAqIEBwYXJhbSBwX25iX2J5dGVzICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gd3JpdGUKICovCi12b2lkIG9wal93cml0ZV9ieXRlc19CRSAoT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX1VJTlQzMiBwX3ZhbHVlLCBPUEpfVUlOVDMyIHBfbmJfYnl0ZXMpOwordm9pZCBvcGpfd3JpdGVfYnl0ZXNfQkUoT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX1VJTlQzMiBwX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX25iX2J5dGVzKTsKIAogLyoqCiAgKiBSZWFkcyBzb21lIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGRhdGEgYnVmZmVyLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gQmlnIEVuZGlhbiBjcHVzLgotICogQHBhcmFtIHBfYnVmZmVyCQlwb2ludGVyIHRoZSBkYXRhIGJ1ZmZlciB0byByZWFkIGRhdGEgZnJvbS4KLSAqIEBwYXJhbSBwX3ZhbHVlCQlwb2ludGVyIHRvIHRoZSB2YWx1ZSB0aGF0IHdpbGwgc3RvcmUgdGhlIGRhdGEuCi0gKiBAcGFyYW0gcF9uYl9ieXRlcwl0aGUgbmIgYnl0ZXMgdG8gcmVhZC4KLSAqIEByZXR1cm4JCQkJdGhlIG51bWJlciBvZiBieXRlcyByZWFkIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICogQHBhcmFtIHBfYnVmZmVyICAgICAgcG9pbnRlciB0aGUgZGF0YSBidWZmZXIgdG8gcmVhZCBkYXRhIGZyb20uCisgKiBAcGFyYW0gcF92YWx1ZSAgICAgICBwb2ludGVyIHRvIHRoZSB2YWx1ZSB0aGF0IHdpbGwgc3RvcmUgdGhlIGRhdGEuCisgKiBAcGFyYW0gcF9uYl9ieXRlcyAgICB0aGUgbmIgYnl0ZXMgdG8gcmVhZC4KKyAqIEByZXR1cm4gICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KICAqLwotdm9pZCBvcGpfcmVhZF9ieXRlc19CRShjb25zdCBPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfVUlOVDMyICogcF92YWx1ZSwgT1BKX1VJTlQzMiBwX25iX2J5dGVzKTsKK3ZvaWQgb3BqX3JlYWRfYnl0ZXNfQkUoY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX1VJTlQzMiAqIHBfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9uYl9ieXRlcyk7CiAKIC8qKgogICogV3JpdGUgc29tZSBieXRlcyB0byB0aGUgZ2l2ZW4gZGF0YSBidWZmZXIsIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBMaXR0bGUgRW5kaWFuIGNwdXMuCi0gKiBAcGFyYW0gcF9idWZmZXIJCXBvaW50ZXIgdGhlIGRhdGEgYnVmZmVyIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0gcF92YWx1ZQkJdGhlIHZhbHVlIHRvIHdyaXRlCi0gKiBAcGFyYW0gcF9uYl9ieXRlcwl0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlCi0gKiBAcmV0dXJuCQkJCXRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnJlZAorICogQHBhcmFtIHBfYnVmZmVyICAgICAgcG9pbnRlciB0aGUgZGF0YSBidWZmZXIgdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbSBwX3ZhbHVlICAgICAgIHRoZSB2YWx1ZSB0byB3cml0ZQorICogQHBhcmFtIHBfbmJfYnl0ZXMgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZQorICogQHJldHVybiAgICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycmVkCiAqLwotdm9pZCBvcGpfd3JpdGVfYnl0ZXNfTEUgKE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9VSU5UMzIgcF92YWx1ZSwgT1BKX1VJTlQzMiBwX25iX2J5dGVzKTsKK3ZvaWQgb3BqX3dyaXRlX2J5dGVzX0xFKE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9VSU5UMzIgcF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9uYl9ieXRlcyk7CiAKIC8qKgogICogUmVhZHMgc29tZSBieXRlcyBmcm9tIHRoZSBnaXZlbiBkYXRhIGJ1ZmZlciwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIExpdHRsZSBFbmRpYW4gY3B1cy4KLSAqIEBwYXJhbSBwX2J1ZmZlcgkJcG9pbnRlciB0aGUgZGF0YSBidWZmZXIgdG8gcmVhZCBkYXRhIGZyb20uCi0gKiBAcGFyYW0gcF92YWx1ZQkJcG9pbnRlciB0byB0aGUgdmFsdWUgdGhhdCB3aWxsIHN0b3JlIHRoZSBkYXRhLgotICogQHBhcmFtIHBfbmJfYnl0ZXMJdGhlIG5iIGJ5dGVzIHRvIHJlYWQuCi0gKiBAcmV0dXJuCQkJCXRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqIEBwYXJhbSBwX2J1ZmZlciAgICAgIHBvaW50ZXIgdGhlIGRhdGEgYnVmZmVyIHRvIHJlYWQgZGF0YSBmcm9tLgorICogQHBhcmFtIHBfdmFsdWUgICAgICAgcG9pbnRlciB0byB0aGUgdmFsdWUgdGhhdCB3aWxsIHN0b3JlIHRoZSBkYXRhLgorICogQHBhcmFtIHBfbmJfYnl0ZXMgICAgdGhlIG5iIGJ5dGVzIHRvIHJlYWQuCisgKiBAcmV0dXJuICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCiAgKi8KLXZvaWQgb3BqX3JlYWRfYnl0ZXNfTEUoY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX1VJTlQzMiAqIHBfdmFsdWUsIE9QSl9VSU5UMzIgcF9uYl9ieXRlcyk7Cit2b2lkIG9wal9yZWFkX2J5dGVzX0xFKGNvbnN0IE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9VSU5UMzIgKiBwX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbmJfYnl0ZXMpOwogCiAKIC8qKgogICogV3JpdGUgc29tZSBieXRlcyB0byB0aGUgZ2l2ZW4gZGF0YSBidWZmZXIsIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBMaXR0bGUgRW5kaWFuIGNwdXMuCi0gKiBAcGFyYW0gcF9idWZmZXIJCXBvaW50ZXIgdGhlIGRhdGEgYnVmZmVyIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0gcF92YWx1ZQkJdGhlIHZhbHVlIHRvIHdyaXRlCisgKiBAcGFyYW0gcF9idWZmZXIgICAgICBwb2ludGVyIHRoZSBkYXRhIGJ1ZmZlciB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtIHBfdmFsdWUgICAgICAgdGhlIHZhbHVlIHRvIHdyaXRlCiAgKi8KIHZvaWQgb3BqX3dyaXRlX2RvdWJsZV9MRShPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfRkxPQVQ2NCBwX3ZhbHVlKTsKIAogLyoqKgogICogV3JpdGUgc29tZSBieXRlcyB0byB0aGUgZ2l2ZW4gZGF0YSBidWZmZXIsIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBCaWcgRW5kaWFuIGNwdXMuCi0gKiBAcGFyYW0gcF9idWZmZXIJCXBvaW50ZXIgdGhlIGRhdGEgYnVmZmVyIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0gcF92YWx1ZQkJdGhlIHZhbHVlIHRvIHdyaXRlCisgKiBAcGFyYW0gcF9idWZmZXIgICAgICBwb2ludGVyIHRoZSBkYXRhIGJ1ZmZlciB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtIHBfdmFsdWUgICAgICAgdGhlIHZhbHVlIHRvIHdyaXRlCiAgKi8KIHZvaWQgb3BqX3dyaXRlX2RvdWJsZV9CRShPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfRkxPQVQ2NCBwX3ZhbHVlKTsKIAogLyoqCiAgKiBSZWFkcyBzb21lIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGRhdGEgYnVmZmVyLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gTGl0dGxlIEVuZGlhbiBjcHVzLgotICogQHBhcmFtIHBfYnVmZmVyCQlwb2ludGVyIHRoZSBkYXRhIGJ1ZmZlciB0byByZWFkIGRhdGEgZnJvbS4KLSAqIEBwYXJhbSBwX3ZhbHVlCQlwb2ludGVyIHRvIHRoZSB2YWx1ZSB0aGF0IHdpbGwgc3RvcmUgdGhlIGRhdGEuCisgKiBAcGFyYW0gcF9idWZmZXIgICAgICBwb2ludGVyIHRoZSBkYXRhIGJ1ZmZlciB0byByZWFkIGRhdGEgZnJvbS4KKyAqIEBwYXJhbSBwX3ZhbHVlICAgICAgIHBvaW50ZXIgdG8gdGhlIHZhbHVlIHRoYXQgd2lsbCBzdG9yZSB0aGUgZGF0YS4KICAqLwogdm9pZCBvcGpfcmVhZF9kb3VibGVfTEUoY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX0ZMT0FUNjQgKiBwX3ZhbHVlKTsKIAogLyoqCiAgKiBSZWFkcyBzb21lIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGRhdGEgYnVmZmVyLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gQmlnIEVuZGlhbiBjcHVzLgotICogQHBhcmFtIHBfYnVmZmVyCQlwb2ludGVyIHRoZSBkYXRhIGJ1ZmZlciB0byByZWFkIGRhdGEgZnJvbS4KLSAqIEBwYXJhbSBwX3ZhbHVlCQlwb2ludGVyIHRvIHRoZSB2YWx1ZSB0aGF0IHdpbGwgc3RvcmUgdGhlIGRhdGEuCisgKiBAcGFyYW0gcF9idWZmZXIgICAgICBwb2ludGVyIHRoZSBkYXRhIGJ1ZmZlciB0byByZWFkIGRhdGEgZnJvbS4KKyAqIEBwYXJhbSBwX3ZhbHVlICAgICAgIHBvaW50ZXIgdG8gdGhlIHZhbHVlIHRoYXQgd2lsbCBzdG9yZSB0aGUgZGF0YS4KICAqLwogdm9pZCBvcGpfcmVhZF9kb3VibGVfQkUoY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX0ZMT0FUNjQgKiBwX3ZhbHVlKTsKIAogLyoqCiAgKiBSZWFkcyBzb21lIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGRhdGEgYnVmZmVyLCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gTGl0dGxlIEVuZGlhbiBjcHVzLgotICogQHBhcmFtIHBfYnVmZmVyCQlwb2ludGVyIHRoZSBkYXRhIGJ1ZmZlciB0byByZWFkIGRhdGEgZnJvbS4KLSAqIEBwYXJhbSBwX3ZhbHVlCQlwb2ludGVyIHRvIHRoZSB2YWx1ZSB0aGF0IHdpbGwgc3RvcmUgdGhlIGRhdGEuCisgKiBAcGFyYW0gcF9idWZmZXIgICAgICBwb2ludGVyIHRoZSBkYXRhIGJ1ZmZlciB0byByZWFkIGRhdGEgZnJvbS4KKyAqIEBwYXJhbSBwX3ZhbHVlICAgICAgIHBvaW50ZXIgdG8gdGhlIHZhbHVlIHRoYXQgd2lsbCBzdG9yZSB0aGUgZGF0YS4KICAqLwogdm9pZCBvcGpfcmVhZF9mbG9hdF9MRShjb25zdCBPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfRkxPQVQzMiAqIHBfdmFsdWUpOwogCiAvKioKICAqIFJlYWRzIHNvbWUgYnl0ZXMgZnJvbSB0aGUgZ2l2ZW4gZGF0YSBidWZmZXIsIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBCaWcgRW5kaWFuIGNwdXMuCi0gKiBAcGFyYW0gcF9idWZmZXIJCXBvaW50ZXIgdGhlIGRhdGEgYnVmZmVyIHRvIHJlYWQgZGF0YSBmcm9tLgotICogQHBhcmFtIHBfdmFsdWUJCXBvaW50ZXIgdG8gdGhlIHZhbHVlIHRoYXQgd2lsbCBzdG9yZSB0aGUgZGF0YS4KKyAqIEBwYXJhbSBwX2J1ZmZlciAgICAgIHBvaW50ZXIgdGhlIGRhdGEgYnVmZmVyIHRvIHJlYWQgZGF0YSBmcm9tLgorICogQHBhcmFtIHBfdmFsdWUgICAgICAgcG9pbnRlciB0byB0aGUgdmFsdWUgdGhhdCB3aWxsIHN0b3JlIHRoZSBkYXRhLgogICovCiB2b2lkIG9wal9yZWFkX2Zsb2F0X0JFKGNvbnN0IE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9GTE9BVDMyICogcF92YWx1ZSk7CiAKIC8qKgogICogV3JpdGUgc29tZSBieXRlcyB0byB0aGUgZ2l2ZW4gZGF0YSBidWZmZXIsIHRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBMaXR0bGUgRW5kaWFuIGNwdXMuCi0gKiBAcGFyYW0gcF9idWZmZXIJCXBvaW50ZXIgdGhlIGRhdGEgYnVmZmVyIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0gcF92YWx1ZQkJdGhlIHZhbHVlIHRvIHdyaXRlCisgKiBAcGFyYW0gcF9idWZmZXIgICAgICBwb2ludGVyIHRoZSBkYXRhIGJ1ZmZlciB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtIHBfdmFsdWUgICAgICAgdGhlIHZhbHVlIHRvIHdyaXRlCiAgKi8KIHZvaWQgb3BqX3dyaXRlX2Zsb2F0X0xFKE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9GTE9BVDMyIHBfdmFsdWUpOwogCiAvKioqCiAgKiBXcml0ZSBzb21lIGJ5dGVzIHRvIHRoZSBnaXZlbiBkYXRhIGJ1ZmZlciwgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIEJpZyBFbmRpYW4gY3B1cy4KLSAqIEBwYXJhbSBwX2J1ZmZlcgkJcG9pbnRlciB0aGUgZGF0YSBidWZmZXIgdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbSBwX3ZhbHVlCQl0aGUgdmFsdWUgdG8gd3JpdGUKKyAqIEBwYXJhbSBwX2J1ZmZlciAgICAgIHBvaW50ZXIgdGhlIGRhdGEgYnVmZmVyIHRvIHdyaXRlIGRhdGEgdG8uCisgKiBAcGFyYW0gcF92YWx1ZSAgICAgICB0aGUgdmFsdWUgdG8gd3JpdGUKICAqLwogdm9pZCBvcGpfd3JpdGVfZmxvYXRfQkUoT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX0ZMT0FUMzIgcF92YWx1ZSk7CiAKIC8qKgogICogUmVhZHMgc29tZSBieXRlcyBmcm9tIHRoZSBzdHJlYW0uCi0gKiBAcGFyYW0JCXBfc3RyZWFtCXRoZSBzdHJlYW0gdG8gcmVhZCBkYXRhIGZyb20uCi0gKiBAcGFyYW0JCXBfYnVmZmVyCXBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyIHRoYXQgd2lsbCByZWNlaXZlIHRoZSBkYXRhLgotICogQHBhcmFtCQlwX3NpemUJCW51bWJlciBvZiBieXRlcyB0byByZWFkLgotICogQHBhcmFtCQlwX2V2ZW50X21ncgl0aGUgdXNlciBldmVudCBtYW5hZ2VyIHRvIGJlIG5vdGlmaWVkIG9mIHNwZWNpYWwgZXZlbnRzLgotICogQHJldHVybgkJdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnJlZCBvciBpZiB0aGUgc3RyZWFtIGlzIGF0IHRoZSBlbmQuCisgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgdGhlIHN0cmVhbSB0byByZWFkIGRhdGEgZnJvbS4KKyAqIEBwYXJhbSAgICAgICBwX2J1ZmZlciAgICBwb2ludGVyIHRvIHRoZSBkYXRhIGJ1ZmZlciB0aGF0IHdpbGwgcmVjZWl2ZSB0aGUgZGF0YS4KKyAqIEBwYXJhbSAgICAgICBwX3NpemUgICAgICBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAqIEBwYXJhbSAgICAgICBwX2V2ZW50X21nciB0aGUgdXNlciBldmVudCBtYW5hZ2VyIHRvIGJlIG5vdGlmaWVkIG9mIHNwZWNpYWwgZXZlbnRzLgorICogQHJldHVybiAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQgb3IgaWYgdGhlIHN0cmVhbSBpcyBhdCB0aGUgZW5kLgogICovCi1PUEpfU0laRV9UIG9wal9zdHJlYW1fcmVhZF9kYXRhIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLE9QSl9CWVRFICogcF9idWZmZXIsIE9QSl9TSVpFX1QgcF9zaXplLCBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfZXZlbnRfbWdyKTsKK09QSl9TSVpFX1Qgb3BqX3N0cmVhbV9yZWFkX2RhdGEob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX1NJWkVfVCBwX3NpemUsIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9ldmVudF9tZ3IpOwogCiAvKioKICAqIFdyaXRlcyBzb21lIGJ5dGVzIHRvIHRoZSBzdHJlYW0uCi0gKiBAcGFyYW0JCXBfc3RyZWFtCXRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbQkJcF9idWZmZXIJcG9pbnRlciB0byB0aGUgZGF0YSBidWZmZXIgaG9sZHMgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbnQuCi0gKiBAcGFyYW0JCXBfc2l6ZQkJbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlLgotICogQHBhcmFtCQlwX2V2ZW50X21ncgl0aGUgdXNlciBldmVudCBtYW5hZ2VyIHRvIGJlIG5vdGlmaWVkIG9mIHNwZWNpYWwgZXZlbnRzLgotICogQHJldHVybgkJdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVudCwgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtICAgICAgIHBfYnVmZmVyICAgIHBvaW50ZXIgdG8gdGhlIGRhdGEgYnVmZmVyIGhvbGRzIHRoZSBkYXRhIHRvIGJlIHdyaXR0ZW50LgorICogQHBhcmFtICAgICAgIHBfc2l6ZSAgICAgIG51bWJlciBvZiBieXRlcyB0byB3cml0ZS4KKyAqIEBwYXJhbSAgICAgICBwX2V2ZW50X21nciB0aGUgdXNlciBldmVudCBtYW5hZ2VyIHRvIGJlIG5vdGlmaWVkIG9mIHNwZWNpYWwgZXZlbnRzLgorICogQHJldHVybiAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbnQsIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycmVkLgogICovCi1PUEpfU0laRV9UIG9wal9zdHJlYW1fd3JpdGVfZGF0YSAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSxjb25zdCBPUEpfQllURSAqIHBfYnVmZmVyLCBPUEpfU0laRV9UIHBfc2l6ZSwgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX2V2ZW50X21ncik7CitPUEpfU0laRV9UIG9wal9zdHJlYW1fd3JpdGVfZGF0YShvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1BKX0JZVEUgKiBwX2J1ZmZlciwgT1BKX1NJWkVfVCBwX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfZXZlbnRfbWdyKTsKIAogLyoqCiAgKiBXcml0ZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHN0cmVhbSBidWZmZXIgdG8gdGhlIHN0cmVhbS4KLSAqIEBwYXJhbQkJcF9zdHJlYW0JdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgotICogQHBhcmFtCQlwX2V2ZW50X21ncgl0aGUgdXNlciBldmVudCBtYW5hZ2VyIHRvIGJlIG5vdGlmaWVkIG9mIHNwZWNpYWwgZXZlbnRzLgotICogQHJldHVybgkJdHJ1ZSBpZiB0aGUgZGF0YSBjb3VsZCBiZSBmbHVzaGVkLCBmYWxzZSBlbHNlLgorICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBwYXJhbSAgICAgICBwX2V2ZW50X21nciB0aGUgdXNlciBldmVudCBtYW5hZ2VyIHRvIGJlIG5vdGlmaWVkIG9mIHNwZWNpYWwgZXZlbnRzLgorICogQHJldHVybiAgICAgIHRydWUgaWYgdGhlIGRhdGEgY291bGQgYmUgZmx1c2hlZCwgZmFsc2UgZWxzZS4KICAqLwotT1BKX0JPT0wgb3BqX3N0cmVhbV9mbHVzaCAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX2V2ZW50X21ncik7CitPUEpfQk9PTCBvcGpfc3RyZWFtX2ZsdXNoKG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9ldmVudF9tZ3IpOwogCiAvKioKICAqIFNraXBzIGEgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbS4KLSAqIEBwYXJhbQkJcF9zdHJlYW0JdGhlIHN0cmVhbSB0byBza2lwIGRhdGEgZnJvbS4KLSAqIEBwYXJhbQkJcF9zaXplCQl0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuCi0gKiBAcGFyYW0JCXBfZXZlbnRfbWdyCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIgdG8gYmUgbm90aWZpZWQgb2Ygc3BlY2lhbCBldmVudHMuCi0gKiBAcmV0dXJuCQl0aGUgbnVtYmVyIG9mIGJ5dGVzIHNraXBwZWQsIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgIHRoZSBzdHJlYW0gdG8gc2tpcCBkYXRhIGZyb20uCisgKiBAcGFyYW0gICAgICAgcF9zaXplICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLgorICogQHBhcmFtICAgICAgIHBfZXZlbnRfbWdyIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIgdG8gYmUgbm90aWZpZWQgb2Ygc3BlY2lhbCBldmVudHMuCisgKiBAcmV0dXJuICAgICAgdGhlIG51bWJlciBvZiBieXRlcyBza2lwcGVkLCBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KICAqLwotT1BKX09GRl9UIG9wal9zdHJlYW1fc2tpcCAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSxPUEpfT0ZGX1QgcF9zaXplLCBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfZXZlbnRfbWdyKTsKK09QSl9PRkZfVCBvcGpfc3RyZWFtX3NraXAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwgT1BKX09GRl9UIHBfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX2V2ZW50X21ncik7CiAKIC8qKgogICogVGVsbHMgdGhlIGJ5dGUgb2Zmc2V0IG9uIHRoZSBzdHJlYW0gKHNpbWlsYXIgdG8gZnRlbGwpLgogICoKLSAqIEBwYXJhbQkJcF9zdHJlYW0JdGhlIHN0cmVhbSB0byBnZXQgdGhlIGluZm9ybWF0aW9uIGZyb20uCisgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgdGhlIHN0cmVhbSB0byBnZXQgdGhlIGluZm9ybWF0aW9uIGZyb20uCiAgKgotICogQHJldHVybgkJdGhlIGN1cnJlbnQgcG9zaXRpb24gbyBmdGhlIHN0cmVhbS4KKyAqIEByZXR1cm4gICAgICB0aGUgY3VycmVudCBwb3NpdGlvbiBvIGZ0aGUgc3RyZWFtLgogICovCi1PUEpfT0ZGX1Qgb3BqX3N0cmVhbV90ZWxsIChjb25zdCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtKTsKK09QSl9PRkZfVCBvcGpfc3RyZWFtX3RlbGwoY29uc3Qgb3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSk7CiAKIAogLyoqCiAgKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0IGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gKHNpbWlsYXIgdG8gY2lvX251bWJ5dGVzbGVmdCkuCiAgKgotICogQHBhcmFtCQlwX3N0cmVhbQl0aGUgc3RyZWFtIHRvIGdldCB0aGUgaW5mb3JtYXRpb24gZnJvbS4KKyAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICB0aGUgc3RyZWFtIHRvIGdldCB0aGUgaW5mb3JtYXRpb24gZnJvbS4KICAqCi0gKiBAcmV0dXJuCQlOdW1iZXIgb2YgYnl0ZXMgbGVmdCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLgorICogQHJldHVybiAgICAgIE51bWJlciBvZiBieXRlcyBsZWZ0IGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uCiAgKi8KLU9QSl9PRkZfVCBvcGpfc3RyZWFtX2dldF9udW1iZXJfYnl0ZV9sZWZ0IChjb25zdCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtKTsKK09QSl9PRkZfVCBvcGpfc3RyZWFtX2dldF9udW1iZXJfYnl0ZV9sZWZ0KGNvbnN0IG9wal9zdHJlYW1fcHJpdmF0ZV90ICoKKyAgICAgICAgcF9zdHJlYW0pOwogCiAvKioKICAqIFNraXBzIGEgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbS4KLSAqIEBwYXJhbQkJcF9zdHJlYW0JdGhlIHN0cmVhbSB0byBza2lwIGRhdGEgZnJvbS4KLSAqIEBwYXJhbQkJcF9zaXplCQl0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuCi0gKiBAcGFyYW0JCXBfZXZlbnRfbWdyCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIgdG8gYmUgbm90aWZpZWQgb2Ygc3BlY2lhbCBldmVudHMuCi0gKiBAcmV0dXJuCQl0aGUgbnVtYmVyIG9mIGJ5dGVzIHNraXBwZWQsIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgIHRoZSBzdHJlYW0gdG8gc2tpcCBkYXRhIGZyb20uCisgKiBAcGFyYW0gICAgICAgcF9zaXplICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLgorICogQHBhcmFtICAgICAgIHBfZXZlbnRfbWdyIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIgdG8gYmUgbm90aWZpZWQgb2Ygc3BlY2lhbCBldmVudHMuCisgKiBAcmV0dXJuICAgICAgdGhlIG51bWJlciBvZiBieXRlcyBza2lwcGVkLCBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KICAqLwotT1BKX09GRl9UIG9wal9zdHJlYW1fd3JpdGVfc2tpcCAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwgT1BKX09GRl9UIHBfc2l6ZSwgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX2V2ZW50X21ncik7CitPUEpfT0ZGX1Qgb3BqX3N0cmVhbV93cml0ZV9za2lwKG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9PRkZfVCBwX3NpemUsIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9ldmVudF9tZ3IpOwogCiAvKioKICAqIFNraXBzIGEgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbS4KLSAqIEBwYXJhbQkJcF9zdHJlYW0JdGhlIHN0cmVhbSB0byBza2lwIGRhdGEgZnJvbS4KLSAqIEBwYXJhbQkJcF9zaXplCQl0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuCi0gKiBAcGFyYW0JCXBfZXZlbnRfbWdyCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIgdG8gYmUgbm90aWZpZWQgb2Ygc3BlY2lhbCBldmVudHMuCi0gKiBAcmV0dXJuCQl0aGUgbnVtYmVyIG9mIGJ5dGVzIHNraXBwZWQsIG9yIC0xIGlmIGFuIGVycm9yIG9jY3VycmVkLgorICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgIHRoZSBzdHJlYW0gdG8gc2tpcCBkYXRhIGZyb20uCisgKiBAcGFyYW0gICAgICAgcF9zaXplICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLgorICogQHBhcmFtICAgICAgIHBfZXZlbnRfbWdyIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIgdG8gYmUgbm90aWZpZWQgb2Ygc3BlY2lhbCBldmVudHMuCisgKiBAcmV0dXJuICAgICAgdGhlIG51bWJlciBvZiBieXRlcyBza2lwcGVkLCBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KICAqLwotT1BKX09GRl9UIG9wal9zdHJlYW1fcmVhZF9za2lwIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLCBPUEpfT0ZGX1QgcF9zaXplLCBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfZXZlbnRfbWdyKTsKK09QSl9PRkZfVCBvcGpfc3RyZWFtX3JlYWRfc2tpcChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9PRkZfVCBwX3NpemUsIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9ldmVudF9tZ3IpOwogCiAvKioKICAqIFNraXBzIGEgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIHN0cmVhbS4KLSAqIEBwYXJhbQkJcF9zdHJlYW0JdGhlIHN0cmVhbSB0byBza2lwIGRhdGEgZnJvbS4KLSAqIEBwYXJhbQkJcF9zaXplCQl0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuCi0gKiBAcGFyYW0JCXBfZXZlbnRfbWdyCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIgdG8gYmUgbm90aWZpZWQgb2Ygc3BlY2lhbCBldmVudHMuCi0gKiBAcmV0dXJuCQlPUEpfVFJVRSBpZiBzdWNjZXNzLCBvciBPUEpfRkFMU0UgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgdGhlIHN0cmVhbSB0byBza2lwIGRhdGEgZnJvbS4KKyAqIEBwYXJhbSAgICAgICBwX3NpemUgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAuCisgKiBAcGFyYW0gICAgICAgcF9ldmVudF9tZ3IgdGhlIHVzZXIgZXZlbnQgbWFuYWdlciB0byBiZSBub3RpZmllZCBvZiBzcGVjaWFsIGV2ZW50cy4KKyAqIEByZXR1cm4gICAgICBPUEpfVFJVRSBpZiBzdWNjZXNzLCBvciBPUEpfRkFMU0UgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCiAgKi8KLU9QSl9CT09MIG9wal9zdHJlYW1fcmVhZF9zZWVrIChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfc3RyZWFtLCBPUEpfT0ZGX1QgcF9zaXplLCBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfZXZlbnRfbWdyKTsKK09QSl9CT09MIG9wal9zdHJlYW1fcmVhZF9zZWVrKG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0sIE9QSl9PRkZfVCBwX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfZXZlbnRfbWdyKTsKIAogLyoqCiAgKiBTa2lwcyBhIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzdHJlYW0uCi0gKiBAcGFyYW0JCXBfc3RyZWFtCXRoZSBzdHJlYW0gdG8gc2tpcCBkYXRhIGZyb20uCi0gKiBAcGFyYW0JCXBfc2l6ZQkJdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLgotICogQHBhcmFtCQlwX2V2ZW50X21ncgl0aGUgdXNlciBldmVudCBtYW5hZ2VyIHRvIGJlIG5vdGlmaWVkIG9mIHNwZWNpYWwgZXZlbnRzLgotICogQHJldHVybgkJdGhlIG51bWJlciBvZiBieXRlcyBza2lwcGVkLCBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICB0aGUgc3RyZWFtIHRvIHNraXAgZGF0YSBmcm9tLgorICogQHBhcmFtICAgICAgIHBfc2l6ZSAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC4KKyAqIEBwYXJhbSAgICAgICBwX2V2ZW50X21nciB0aGUgdXNlciBldmVudCBtYW5hZ2VyIHRvIGJlIG5vdGlmaWVkIG9mIHNwZWNpYWwgZXZlbnRzLgorICogQHJldHVybiAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgc2tpcHBlZCwgb3IgLTEgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCiAgKi8KLU9QSl9CT09MIG9wal9zdHJlYW1fd3JpdGVfc2VlayAob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwgT1BKX09GRl9UIHBfc2l6ZSwgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX2V2ZW50X21ncik7CitPUEpfQk9PTCBvcGpfc3RyZWFtX3dyaXRlX3NlZWsob3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfT0ZGX1QgcF9zaXplLCBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfZXZlbnRfbWdyKTsKIAogLyoqCiAgKiBTZWVrcyBhIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzdHJlYW0uCi0gKiBAcGFyYW0JCXBfc3RyZWFtCXRoZSBzdHJlYW0gdG8gc2tpcCBkYXRhIGZyb20uCi0gKiBAcGFyYW0JCXBfc2l6ZQkJdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLgotICogQHBhcmFtCQlwX2V2ZW50X21ncgl0aGUgdXNlciBldmVudCBtYW5hZ2VyIHRvIGJlIG5vdGlmaWVkIG9mIHNwZWNpYWwgZXZlbnRzLgotICogQHJldHVybgkJdHJ1ZSBpZiB0aGUgc3RyZWFtIGlzIHNlZWthYmxlLgorICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgIHRoZSBzdHJlYW0gdG8gc2tpcCBkYXRhIGZyb20uCisgKiBAcGFyYW0gICAgICAgcF9zaXplICAgICAgdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLgorICogQHBhcmFtICAgICAgIHBfZXZlbnRfbWdyIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIgdG8gYmUgbm90aWZpZWQgb2Ygc3BlY2lhbCBldmVudHMuCisgKiBAcmV0dXJuICAgICAgdHJ1ZSBpZiB0aGUgc3RyZWFtIGlzIHNlZWthYmxlLgogICovCi1PUEpfQk9PTCBvcGpfc3RyZWFtX3NlZWsgKG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0sIE9QSl9PRkZfVCBwX3NpemUsIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9ldmVudF9tZ3IpOworT1BKX0JPT0wgb3BqX3N0cmVhbV9zZWVrKG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0sIE9QSl9PRkZfVCBwX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX2V2ZW50X21ncik7CiAKIC8qKgogICogVGVsbHMgaWYgdGhlIGdpdmVuIHN0cmVhbSBpcyBzZWVrYWJsZS4KICAqLwotT1BKX0JPT0wgb3BqX3N0cmVhbV9oYXNfc2VlayAoY29uc3Qgb3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSk7CitPUEpfQk9PTCBvcGpfc3RyZWFtX2hhc19zZWVrKGNvbnN0IG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0pOwogCiAvKioKICAqIEZJWE1FIERPQy4KICAqLwotT1BKX1NJWkVfVCBvcGpfc3RyZWFtX2RlZmF1bHRfcmVhZCAodm9pZCAqIHBfYnVmZmVyLCBPUEpfU0laRV9UIHBfbmJfYnl0ZXMsIHZvaWQgKiBwX3VzZXJfZGF0YSk7CitPUEpfU0laRV9UIG9wal9zdHJlYW1fZGVmYXVsdF9yZWFkKHZvaWQgKiBwX2J1ZmZlciwgT1BKX1NJWkVfVCBwX25iX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogcF91c2VyX2RhdGEpOwogCiAvKioKICAqIEZJWE1FIERPQy4KICAqLwotT1BKX1NJWkVfVCBvcGpfc3RyZWFtX2RlZmF1bHRfd3JpdGUgKHZvaWQgKiBwX2J1ZmZlciwgT1BKX1NJWkVfVCBwX25iX2J5dGVzLCB2b2lkICogcF91c2VyX2RhdGEpOworT1BKX1NJWkVfVCBvcGpfc3RyZWFtX2RlZmF1bHRfd3JpdGUodm9pZCAqIHBfYnVmZmVyLCBPUEpfU0laRV9UIHBfbmJfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogcF91c2VyX2RhdGEpOwogCiAvKioKICAqIEZJWE1FIERPQy4KICAqLwotT1BKX09GRl9UIG9wal9zdHJlYW1fZGVmYXVsdF9za2lwIChPUEpfT0ZGX1QgcF9uYl9ieXRlcywgdm9pZCAqIHBfdXNlcl9kYXRhKTsKK09QSl9PRkZfVCBvcGpfc3RyZWFtX2RlZmF1bHRfc2tpcChPUEpfT0ZGX1QgcF9uYl9ieXRlcywgdm9pZCAqIHBfdXNlcl9kYXRhKTsKIAogLyoqCiAgKiBGSVhNRSBET0MuCiAgKi8KLU9QSl9CT09MIG9wal9zdHJlYW1fZGVmYXVsdF9zZWVrIChPUEpfT0ZGX1QgcF9uYl9ieXRlcywgdm9pZCAqIHBfdXNlcl9kYXRhKTsKK09QSl9CT09MIG9wal9zdHJlYW1fZGVmYXVsdF9zZWVrKE9QSl9PRkZfVCBwX25iX2J5dGVzLCB2b2lkICogcF91c2VyX2RhdGEpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLypAfSovCkBAIC0zOTUsNSArNDA4LDUgQEAKIC8qQH0qLwogCiAKLSNlbmRpZiAvKiBfX0NJT19IICovCisjZW5kaWYgLyogT1BKX0NJT19IICovCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvZHd0LmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2R3dC5jCmluZGV4IDFiY2IxMDguLjE0NTVlZTggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvZHd0LmMKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9kd3QuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKLSAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQKICAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKICAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KICAqCkBAIC04LDExICs4LDEyIEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXgKICAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0LCBBbnRvbmluIERlc2NhbXBlCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KICAqIENvcHlyaWdodCAoYykgMjAwNywgSm9uYXRoYW4gQmFsbGFyZCA8ZHpvbmF0YXNAZHpvbnV4Lm5ldD4KICAqIENvcHlyaWdodCAoYykgMjAwNywgQ2FsbHVtIExlcndpY2sgPHNlZ0BoYXh4ZWQuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDE3LCBJbnRvUElYIFNBIDxzdXBwb3J0QGludG9waXguY29tPgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTM3LDM1ICszOCw2NiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KIAorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjZGVmaW5lIE9QSl9TS0lQX1BPSVNPTgorI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgorCiAjaWZkZWYgX19TU0VfXwogI2luY2x1ZGUgPHhtbWludHJpbi5oPgogI2VuZGlmCisjaWZkZWYgX19TU0UyX18KKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKyNlbmRpZgorI2lmZGVmIF9fU1NTRTNfXworI2luY2x1ZGUgPHRtbWludHJpbi5oPgorI2VuZGlmCisjaWZkZWYgX19BVlgyX18KKyNpbmNsdWRlIDxpbW1pbnRyaW4uaD4KKyNlbmRpZgogCi0jaW5jbHVkZSAib3BqX2luY2x1ZGVzLmgiCisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyNwcmFnbWEgR0NDIHBvaXNvbiBtYWxsb2MgY2FsbG9jIHJlYWxsb2MgZnJlZQorI2VuZGlmCiAKIC8qKiBAZGVmZ3JvdXAgRFdUIERXVCAtIEltcGxlbWVudGF0aW9uIG9mIGEgZGlzY3JldGUgd2F2ZWxldCB0cmFuc2Zvcm0gKi8KIC8qQHsqLwogCisjaWZkZWYgX19BVlgyX18KKy8qKiBOdW1iZXIgb2YgaW50MzIgdmFsdWVzIGluIGEgQVZYMiByZWdpc3RlciAqLworI2RlZmluZSBWUkVHX0lOVF9DT1VOVCAgICAgICA4CisjZWxzZQorLyoqIE51bWJlciBvZiBpbnQzMiB2YWx1ZXMgaW4gYSBTU0UyIHJlZ2lzdGVyICovCisjZGVmaW5lIFZSRUdfSU5UX0NPVU5UICAgICAgIDQKKyNlbmRpZgorCisvKiogTnVtYmVyIG9mIGNvbHVtbnMgdGhhdCB3ZSBjYW4gcHJvY2VzcyBpbiBwYXJhbGxlbCBpbiB0aGUgdmVydGljYWwgcGFzcyAqLworI2RlZmluZSBQQVJBTExFTF9DT0xTXzUzICAgICAoMipWUkVHX0lOVF9DT1VOVCkKKwogLyoqIEBuYW1lIExvY2FsIGRhdGEgc3RydWN0dXJlcyAqLwogLypAeyovCiAKIHR5cGVkZWYgc3RydWN0IGR3dF9sb2NhbCB7Ci0JT1BKX0lOVDMyKiBtZW07Ci0JT1BKX1NJWkVfVCBtZW1fY291bnQ7Ci0JT1BKX0lOVDMyIGRuOwotCU9QSl9JTlQzMiBzbjsKLQlPUEpfSU5UMzIgY2FzOworICAgIE9QSl9JTlQzMiogbWVtOworICAgIE9QSl9TSVpFX1QgbWVtX2NvdW50OworICAgIE9QSl9JTlQzMiBkbjsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gaGlnaCBwYXNzIGJhbmQgKi8KKyAgICBPUEpfSU5UMzIgc247ICAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGxvdyBwYXNzIGJhbmQgKi8KKyAgICBPUEpfSU5UMzIgY2FzOyAgLyogMCA9IHN0YXJ0IG9uIGV2ZW4gY29vcmQsIDEgPSBzdGFydCBvbiBvZGQgY29vcmQgKi8KIH0gb3BqX2R3dF90OwogCiB0eXBlZGVmIHVuaW9uIHsKLQlPUEpfRkxPQVQzMglmWzRdOworICAgIE9QSl9GTE9BVDMyIGZbNF07CiB9IG9wal92NF90OwogCiB0eXBlZGVmIHN0cnVjdCB2NGR3dF9sb2NhbCB7Ci0Jb3BqX3Y0X3QqCXdhdmVsZXQgOwotCU9QSl9JTlQzMgkJZG4gOwotCU9QSl9JTlQzMgkJc24gOwotCU9QSl9JTlQzMgkJY2FzIDsKKyAgICBvcGpfdjRfdCogICB3YXZlbGV0IDsKKyAgICBPUEpfSU5UMzIgICAgICAgZG4gOyAgLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGhpZ2ggcGFzcyBiYW5kICovCisgICAgT1BKX0lOVDMyICAgICAgIHNuIDsgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiBsb3cgcGFzcyBiYW5kICovCisgICAgT1BKX0lOVDMyICAgICAgIGNhcyA7IC8qIDAgPSBzdGFydCBvbiBldmVuIGNvb3JkLCAxID0gc3RhcnQgb24gb2RkIGNvb3JkICovCisgICAgT1BKX1VJTlQzMiAgICAgIHdpbl9sX3gwOyAvKiBzdGFydCBjb29yZCBpbiBsb3cgcGFzcyBiYW5kICovCisgICAgT1BKX1VJTlQzMiAgICAgIHdpbl9sX3gxOyAvKiBlbmQgY29vcmQgaW4gbG93IHBhc3MgYmFuZCAqLworICAgIE9QSl9VSU5UMzIgICAgICB3aW5faF94MDsgLyogc3RhcnQgY29vcmQgaW4gaGlnaCBwYXNzIGJhbmQgKi8KKyAgICBPUEpfVUlOVDMyICAgICAgd2luX2hfeDE7IC8qIGVuZCBjb29yZCBpbiBoaWdoIHBhc3MgYmFuZCAqLwogfSBvcGpfdjRkd3RfdCA7CiAKIHN0YXRpYyBjb25zdCBPUEpfRkxPQVQzMiBvcGpfZHd0X2FscGhhID0gIDEuNTg2MTM0MzQyZjsgLyogIDEyOTk0ICovCkBAIC03OSw5ICsxMTEsOSBAQAogLypAfSovCiAKIC8qKgotVmlydHVhbCBmdW5jdGlvbiB0eXBlIGZvciB3YXZlbGV0IHRyYW5zZm9ybSBpbiAxLUQgCitWaXJ0dWFsIGZ1bmN0aW9uIHR5cGUgZm9yIHdhdmVsZXQgdHJhbnNmb3JtIGluIDEtRAogKi8KLXR5cGVkZWYgdm9pZCAoKkRXVDFERk4pKG9wal9kd3RfdCogdik7Cit0eXBlZGVmIHZvaWQgKCpEV1QxREZOKShjb25zdCBvcGpfZHd0X3QqIHYpOwogCiAvKiogQG5hbWUgTG9jYWwgc3RhdGljIGZ1bmN0aW9ucyAqLwogLypAeyovCkBAIC04OSw2NCArMTIxLDgzIEBACiAvKioKIEZvcndhcmQgbGF6eSB0cmFuc2Zvcm0gKGhvcml6b250YWwpCiAqLwotc3RhdGljIHZvaWQgb3BqX2R3dF9kZWludGVybGVhdmVfaChPUEpfSU5UMzIgKmEsIE9QSl9JTlQzMiAqYiwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpOworc3RhdGljIHZvaWQgb3BqX2R3dF9kZWludGVybGVhdmVfaChPUEpfSU5UMzIgKmEsIE9QSl9JTlQzMiAqYiwgT1BKX0lOVDMyIGRuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpOwogLyoqCiBGb3J3YXJkIGxhenkgdHJhbnNmb3JtICh2ZXJ0aWNhbCkKICovCi1zdGF0aWMgdm9pZCBvcGpfZHd0X2RlaW50ZXJsZWF2ZV92KE9QSl9JTlQzMiAqYSwgT1BKX0lOVDMyICpiLCBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwgT1BKX0lOVDMyIHgsIE9QSl9JTlQzMiBjYXMpOwotLyoqCi1JbnZlcnNlIGxhenkgdHJhbnNmb3JtIChob3Jpem9udGFsKQotKi8KLXN0YXRpYyB2b2lkIG9wal9kd3RfaW50ZXJsZWF2ZV9oKG9wal9kd3RfdCogaCwgT1BKX0lOVDMyICphKTsKLS8qKgotSW52ZXJzZSBsYXp5IHRyYW5zZm9ybSAodmVydGljYWwpCi0qLwotc3RhdGljIHZvaWQgb3BqX2R3dF9pbnRlcmxlYXZlX3Yob3BqX2R3dF90KiB2LCBPUEpfSU5UMzIgKmEsIE9QSl9JTlQzMiB4KTsKK3N0YXRpYyB2b2lkIG9wal9kd3RfZGVpbnRlcmxlYXZlX3YoT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgKmIsIE9QSl9JTlQzMiBkbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHNuLCBPUEpfSU5UMzIgeCwgT1BKX0lOVDMyIGNhcyk7CiAvKioKIEZvcndhcmQgNS0zIHdhdmVsZXQgdHJhbnNmb3JtIGluIDEtRAogKi8KLXN0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlXzEoT1BKX0lOVDMyICphLCBPUEpfU0laRV9UIGFfY291bnQsIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLCBPUEpfSU5UMzIgY2FzKTsKLS8qKgotSW52ZXJzZSA1LTMgd2F2ZWxldCB0cmFuc2Zvcm0gaW4gMS1ECi0qLwotc3RhdGljIHZvaWQgb3BqX2R3dF9kZWNvZGVfMShvcGpfZHd0X3QgKnYpOwotc3RhdGljIHZvaWQgb3BqX2R3dF9kZWNvZGVfMV8oT1BKX0lOVDMyICphLCBPUEpfU0laRV9UIGFfY291bnQsIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLCBPUEpfSU5UMzIgY2FzKTsKK3N0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlXzEoT1BKX0lOVDMyICphLCBPUEpfU0laRV9UIGFfY291bnQsIE9QSl9JTlQzMiBkbiwKKyAgICBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpOwogLyoqCiBGb3J3YXJkIDktNyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAxLUQKICovCi1zdGF0aWMgdm9pZCBvcGpfZHd0X2VuY29kZV8xX3JlYWwoT1BKX0lOVDMyICphLCBPUEpfU0laRV9UIGFfY291bnQsIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLCBPUEpfSU5UMzIgY2FzKTsKK3N0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlXzFfcmVhbChPUEpfSU5UMzIgKmEsIE9QSl9TSVpFX1QgYV9jb3VudCwKKyAgICBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwgT1BKX0lOVDMyIGNhcyk7CisKKwogLyoqCi1FeHBsaWNpdCBjYWxjdWxhdGlvbiBvZiB0aGUgUXVhbnRpemF0aW9uIFN0ZXBzaXplcyAKK0V4cGxpY2l0IGNhbGN1bGF0aW9uIG9mIHRoZSBRdWFudGl6YXRpb24gU3RlcHNpemVzCiAqLwotc3RhdGljIHZvaWQgb3BqX2R3dF9lbmNvZGVfc3RlcHNpemUoT1BKX0lOVDMyIHN0ZXBzaXplLCBPUEpfSU5UMzIgbnVtYnBzLCBvcGpfc3RlcHNpemVfdCAqYmFuZG5vX3N0ZXBzaXplKTsKK3N0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlX3N0ZXBzaXplKE9QSl9JTlQzMiBzdGVwc2l6ZSwgT1BKX0lOVDMyIG51bWJwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdGVwc2l6ZV90ICpiYW5kbm9fc3RlcHNpemUpOwogLyoqCiBJbnZlcnNlIHdhdmVsZXQgdHJhbnNmb3JtIGluIDItRC4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2R3dF9kZWNvZGVfdGlsZShjb25zdCBvcGpfdGNkX3RpbGVjb21wX3QqIHRpbGVjLCBPUEpfVUlOVDMyIGksIERXVDFERk4gZm4pOworc3RhdGljIE9QSl9CT09MIG9wal9kd3RfZGVjb2RlX3RpbGUob3BqX3RocmVhZF9wb29sX3QqIHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BqX3RjZF90aWxlY29tcF90KiB0aWxlYywgT1BKX1VJTlQzMiBpKTsKKworc3RhdGljIE9QSl9CT09MIG9wal9kd3RfZGVjb2RlX3BhcnRpYWxfdGlsZSgKKyAgICBvcGpfdGNkX3RpbGVjb21wX3QqIHRpbGVjLAorICAgIE9QSl9VSU5UMzIgbnVtcmVzKTsKIAogc3RhdGljIE9QSl9CT09MIG9wal9kd3RfZW5jb2RlX3Byb2NlZHVyZShjb25zdCBvcGpfdGNkX3RpbGVjb21wX3QgKiB0aWxlYywKLQkJCQkJCQkJCQkgICAgdm9pZCgqcF9mdW5jdGlvbikoT1BKX0lOVDMyICosIE9QSl9TSVpFX1QsIE9QSl9JTlQzMiwgT1BKX0lOVDMyLCBPUEpfSU5UMzIpKTsKKyAgICAgICAgdm9pZCgqcF9mdW5jdGlvbikoT1BKX0lOVDMyICosIE9QSl9TSVpFX1QsIE9QSl9JTlQzMiwgT1BKX0lOVDMyLCBPUEpfSU5UMzIpKTsKIAotc3RhdGljIE9QSl9VSU5UMzIgb3BqX2R3dF9tYXhfcmVzb2x1dGlvbihvcGpfdGNkX3Jlc29sdXRpb25fdCogcmVzdHJpY3QgciwgT1BKX1VJTlQzMiBpKTsKK3N0YXRpYyBPUEpfVUlOVDMyIG9wal9kd3RfbWF4X3Jlc29sdXRpb24ob3BqX3RjZF9yZXNvbHV0aW9uX3QqIE9QSl9SRVNUUklDVCByLAorICAgICAgICBPUEpfVUlOVDMyIGkpOwogCiAvKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBJbnZlcnNlIDktNyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAxLUQuICovCiAvKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1zdGF0aWMgdm9pZCBvcGpfdjRkd3RfZGVjb2RlKG9wal92NGR3dF90KiByZXN0cmljdCBkd3QpOworc3RhdGljIHZvaWQgb3BqX3Y0ZHd0X2RlY29kZShvcGpfdjRkd3RfdCogT1BKX1JFU1RSSUNUIGR3dCk7CiAKLXN0YXRpYyB2b2lkIG9wal92NGR3dF9pbnRlcmxlYXZlX2gob3BqX3Y0ZHd0X3QqIHJlc3RyaWN0IHcsIE9QSl9GTE9BVDMyKiByZXN0cmljdCBhLCBPUEpfSU5UMzIgeCwgT1BKX0lOVDMyIHNpemUpOworc3RhdGljIHZvaWQgb3BqX3Y0ZHd0X2ludGVybGVhdmVfaChvcGpfdjRkd3RfdCogT1BKX1JFU1RSSUNUIGR3dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIqIE9QSl9SRVNUUklDVCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHJlbWFpbmluZ19oZWlnaHQpOwogCi1zdGF0aWMgdm9pZCBvcGpfdjRkd3RfaW50ZXJsZWF2ZV92KG9wal92NGR3dF90KiByZXN0cmljdCB2ICwgT1BKX0ZMT0FUMzIqIHJlc3RyaWN0IGEgLCBPUEpfSU5UMzIgeCwgT1BKX0lOVDMyIG5iX2VsdHNfcmVhZCk7CitzdGF0aWMgdm9pZCBvcGpfdjRkd3RfaW50ZXJsZWF2ZV92KG9wal92NGR3dF90KiBPUEpfUkVTVFJJQ1QgZHd0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiogT1BKX1JFU1RSSUNUIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbmJfZWx0c19yZWFkKTsKIAogI2lmZGVmIF9fU1NFX18KLXN0YXRpYyB2b2lkIG9wal92NGR3dF9kZWNvZGVfc3RlcDFfc3NlKG9wal92NF90KiB3LCBPUEpfSU5UMzIgY291bnQsIGNvbnN0IF9fbTEyOCBjKTsKK3N0YXRpYyB2b2lkIG9wal92NGR3dF9kZWNvZGVfc3RlcDFfc3NlKG9wal92NF90KiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4IGMpOwogCi1zdGF0aWMgdm9pZCBvcGpfdjRkd3RfZGVjb2RlX3N0ZXAyX3NzZShvcGpfdjRfdCogbCwgb3BqX3Y0X3QqIHcsIE9QSl9JTlQzMiBrLCBPUEpfSU5UMzIgbSwgX19tMTI4IGMpOworc3RhdGljIHZvaWQgb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMl9zc2Uob3BqX3Y0X3QqIGwsIG9wal92NF90KiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBtLCBfX20xMjggYyk7CiAKICNlbHNlCi1zdGF0aWMgdm9pZCBvcGpfdjRkd3RfZGVjb2RlX3N0ZXAxKG9wal92NF90KiB3LCBPUEpfSU5UMzIgY291bnQsIGNvbnN0IE9QSl9GTE9BVDMyIGMpOworc3RhdGljIHZvaWQgb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMShvcGpfdjRfdCogdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9QSl9GTE9BVDMyIGMpOwogCi1zdGF0aWMgdm9pZCBvcGpfdjRkd3RfZGVjb2RlX3N0ZXAyKG9wal92NF90KiBsLCBvcGpfdjRfdCogdywgT1BKX0lOVDMyIGssIE9QSl9JTlQzMiBtLCBPUEpfRkxPQVQzMiBjKTsKK3N0YXRpYyB2b2lkIG9wal92NGR3dF9kZWNvZGVfc3RlcDIob3BqX3Y0X3QqIGwsIG9wal92NF90KiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiBjKTsKIAogI2VuZGlmCiAKQEAgLTE3MiwyMTUgKzIyMyw4ODcgQEAKIC8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFRoaXMgdGFibGUgY29udGFpbnMgdGhlIG5vcm1zIG9mIHRoZSA1LTMgd2F2ZWxldHMgZm9yIGRpZmZlcmVudCBiYW5kcy4gKi8KIC8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZJWE1FISB0aGUgYXJyYXkgc2hvdWxkIHJlYWxseSBiZSBleHRlbmRlZCB1cCB0byAzMyByZXNvbHV0aW9uIGxldmVscyAqLworLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91Y2xvdXZhaW4vb3BlbmpwZWcvaXNzdWVzLzQ5MyAqLwogc3RhdGljIGNvbnN0IE9QSl9GTE9BVDY0IG9wal9kd3Rfbm9ybXNbNF1bMTBdID0gewotCXsxLjAwMCwgMS41MDAsIDIuNzUwLCA1LjM3NSwgMTAuNjgsIDIxLjM0LCA0Mi42NywgODUuMzMsIDE3MC43LCAzNDEuM30sCi0JezEuMDM4LCAxLjU5MiwgMi45MTksIDUuNzAzLCAxMS4zMywgMjIuNjQsIDQ1LjI1LCA5MC40OCwgMTgwLjl9LAotCXsxLjAzOCwgMS41OTIsIDIuOTE5LCA1LjcwMywgMTEuMzMsIDIyLjY0LCA0NS4yNSwgOTAuNDgsIDE4MC45fSwKLQl7LjcxODYsIC45MjE4LCAxLjU4NiwgMy4wNDMsIDYuMDE5LCAxMi4wMSwgMjQuMDAsIDQ3Ljk3LCA5NS45M30KKyAgICB7MS4wMDAsIDEuNTAwLCAyLjc1MCwgNS4zNzUsIDEwLjY4LCAyMS4zNCwgNDIuNjcsIDg1LjMzLCAxNzAuNywgMzQxLjN9LAorICAgIHsxLjAzOCwgMS41OTIsIDIuOTE5LCA1LjcwMywgMTEuMzMsIDIyLjY0LCA0NS4yNSwgOTAuNDgsIDE4MC45fSwKKyAgICB7MS4wMzgsIDEuNTkyLCAyLjkxOSwgNS43MDMsIDExLjMzLCAyMi42NCwgNDUuMjUsIDkwLjQ4LCAxODAuOX0sCisgICAgey43MTg2LCAuOTIxOCwgMS41ODYsIDMuMDQzLCA2LjAxOSwgMTIuMDEsIDI0LjAwLCA0Ny45NywgOTUuOTN9CiB9OwogCiAvKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBUaGlzIHRhYmxlIGNvbnRhaW5zIHRoZSBub3JtcyBvZiB0aGUgOS03IHdhdmVsZXRzIGZvciBkaWZmZXJlbnQgYmFuZHMuICovCiAvKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGSVhNRSEgdGhlIGFycmF5IHNob3VsZCByZWFsbHkgYmUgZXh0ZW5kZWQgdXAgdG8gMzMgcmVzb2x1dGlvbiBsZXZlbHMgKi8KKy8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdWNsb3V2YWluL29wZW5qcGVnL2lzc3Vlcy80OTMgKi8KIHN0YXRpYyBjb25zdCBPUEpfRkxPQVQ2NCBvcGpfZHd0X25vcm1zX3JlYWxbNF1bMTBdID0gewotCXsxLjAwMCwgMS45NjUsIDQuMTc3LCA4LjQwMywgMTYuOTAsIDMzLjg0LCA2Ny42OSwgMTM1LjMsIDI3MC42LCA1NDAuOX0sCi0JezIuMDIyLCAzLjk4OSwgOC4zNTUsIDE3LjA0LCAzNC4yNywgNjguNjMsIDEzNy4zLCAyNzQuNiwgNTQ5LjB9LAotCXsyLjAyMiwgMy45ODksIDguMzU1LCAxNy4wNCwgMzQuMjcsIDY4LjYzLCAxMzcuMywgMjc0LjYsIDU0OS4wfSwKLQl7Mi4wODAsIDMuODY1LCA4LjMwNywgMTcuMTgsIDM0LjcxLCA2OS41OSwgMTM5LjMsIDI3OC42LCA1NTcuMn0KKyAgICB7MS4wMDAsIDEuOTY1LCA0LjE3NywgOC40MDMsIDE2LjkwLCAzMy44NCwgNjcuNjksIDEzNS4zLCAyNzAuNiwgNTQwLjl9LAorICAgIHsyLjAyMiwgMy45ODksIDguMzU1LCAxNy4wNCwgMzQuMjcsIDY4LjYzLCAxMzcuMywgMjc0LjYsIDU0OS4wfSwKKyAgICB7Mi4wMjIsIDMuOTg5LCA4LjM1NSwgMTcuMDQsIDM0LjI3LCA2OC42MywgMTM3LjMsIDI3NC42LCA1NDkuMH0sCisgICAgezIuMDgwLCAzLjg2NSwgOC4zMDcsIDE3LjE4LCAzNC43MSwgNjkuNTksIDEzOS4zLCAyNzguNiwgNTU3LjJ9CiB9OwogCi0vKiAKKy8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBsb2NhbCBmdW5jdGlvbnMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCiAKLS8qIDxzdW1tYXJ5PgkJCSAgICAgICAgICAgICAgICAgKi8KKy8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZvcndhcmQgbGF6eSB0cmFuc2Zvcm0gKGhvcml6b250YWwpLiAgKi8KLS8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gCi1zdGF0aWMgdm9pZCBvcGpfZHd0X2RlaW50ZXJsZWF2ZV9oKE9QSl9JTlQzMiAqYSwgT1BKX0lOVDMyICpiLCBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwgT1BKX0lOVDMyIGNhcykgewotCU9QSl9JTlQzMiBpOwotCU9QSl9JTlQzMiAqIGxfZGVzdCA9IGI7Ci0JT1BKX0lOVDMyICogbF9zcmMgPSBhK2NhczsKKy8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0YXRpYyB2b2lkIG9wal9kd3RfZGVpbnRlcmxlYXZlX2goT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgKmIsIE9QSl9JTlQzMiBkbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHNuLCBPUEpfSU5UMzIgY2FzKQoreworICAgIE9QSl9JTlQzMiBpOworICAgIE9QSl9JTlQzMiAqIGxfZGVzdCA9IGI7CisgICAgT1BKX0lOVDMyICogbF9zcmMgPSBhICsgY2FzOwogCi0gICAgZm9yIChpPTA7IGk8c247ICsraSkgewotCQkqbF9kZXN0KysgPSAqbF9zcmM7Ci0JCWxfc3JjICs9IDI7Ci0JfQotCQorICAgIGZvciAoaSA9IDA7IGkgPCBzbjsgKytpKSB7CisgICAgICAgICpsX2Rlc3QrKyA9ICpsX3NyYzsKKyAgICAgICAgbF9zcmMgKz0gMjsKKyAgICB9CisKICAgICBsX2Rlc3QgPSBiICsgc247Ci0JbF9zcmMgPSBhICsgMSAtIGNhczsKKyAgICBsX3NyYyA9IGEgKyAxIC0gY2FzOwogCi0gICAgZm9yCShpPTA7IGk8ZG47ICsraSkgIHsKLQkJKmxfZGVzdCsrPSpsX3NyYzsKLQkJbF9zcmMgKz0gMjsKLQl9Ci19Ci0KLS8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIAotLyogRm9yd2FyZCBsYXp5IHRyYW5zZm9ybSAodmVydGljYWwpLiAgICAqLwotLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAKLXN0YXRpYyB2b2lkIG9wal9kd3RfZGVpbnRlcmxlYXZlX3YoT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgKmIsIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLCBPUEpfSU5UMzIgeCwgT1BKX0lOVDMyIGNhcykgewotICAgIE9QSl9JTlQzMiBpID0gc247Ci0JT1BKX0lOVDMyICogbF9kZXN0ID0gYjsKLQlPUEpfSU5UMzIgKiBsX3NyYyA9IGErY2FzOwotCi0gICAgd2hpbGUgKGktLSkgewotCQkqbF9kZXN0ID0gKmxfc3JjOwotCQlsX2Rlc3QgKz0geDsKLQkJbF9zcmMgKz0gMjsKLQkJfSAvKiBiW2kqeF09YVsyKmkrY2FzXTsgKi8KLQotCWxfZGVzdCA9IGIgKyBzbiAqIHg7Ci0JbF9zcmMgPSBhICsgMSAtIGNhczsKLQkKLQlpID0gZG47Ci0gICAgd2hpbGUgKGktLSkgewotCQkqbF9kZXN0ID0gKmxfc3JjOwotCQlsX2Rlc3QgKz0geDsKLQkJbF9zcmMgKz0gMjsKLSAgICAgICAgfSAvKmJbKHNuK2kpKnhdPWFbKDIqaSsxLWNhcyldOyovCisgICAgZm9yIChpID0gMDsgaSA8IGRuOyArK2kpICB7CisgICAgICAgICpsX2Rlc3QrKyA9ICpsX3NyYzsKKyAgICAgICAgbF9zcmMgKz0gMjsKKyAgICB9CiB9CiAKIC8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZvcndhcmQgbGF6eSB0cmFuc2Zvcm0gKHZlcnRpY2FsKS4gICAgKi8KKy8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0YXRpYyB2b2lkIG9wal9kd3RfZGVpbnRlcmxlYXZlX3YoT1BKX0lOVDMyICphLCBPUEpfSU5UMzIgKmIsIE9QSl9JTlQzMiBkbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHNuLCBPUEpfSU5UMzIgeCwgT1BKX0lOVDMyIGNhcykKK3sKKyAgICBPUEpfSU5UMzIgaSA9IHNuOworICAgIE9QSl9JTlQzMiAqIGxfZGVzdCA9IGI7CisgICAgT1BKX0lOVDMyICogbF9zcmMgPSBhICsgY2FzOworCisgICAgd2hpbGUgKGktLSkgeworICAgICAgICAqbF9kZXN0ID0gKmxfc3JjOworICAgICAgICBsX2Rlc3QgKz0geDsKKyAgICAgICAgbF9zcmMgKz0gMjsKKyAgICB9IC8qIGJbaSp4XT1hWzIqaStjYXNdOyAqLworCisgICAgbF9kZXN0ID0gYiArIChPUEpfU0laRV9UKXNuICogKE9QSl9TSVpFX1QpeDsKKyAgICBsX3NyYyA9IGEgKyAxIC0gY2FzOworCisgICAgaSA9IGRuOworICAgIHdoaWxlIChpLS0pIHsKKyAgICAgICAgKmxfZGVzdCA9ICpsX3NyYzsKKyAgICAgICAgbF9kZXN0ICs9IHg7CisgICAgICAgIGxfc3JjICs9IDI7CisgICAgfSAvKmJbKHNuK2kpKnhdPWFbKDIqaSsxLWNhcyldOyovCit9CisKKyNpZmRlZiBTVEFOREFSRF9TTE9XX1ZFUlNJT04KKy8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEludmVyc2UgbGF6eSB0cmFuc2Zvcm0gKGhvcml6b250YWwpLiAgKi8KIC8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXN0YXRpYyB2b2lkIG9wal9kd3RfaW50ZXJsZWF2ZV9oKG9wal9kd3RfdCogaCwgT1BKX0lOVDMyICphKSB7CitzdGF0aWMgdm9pZCBvcGpfZHd0X2ludGVybGVhdmVfaChjb25zdCBvcGpfZHd0X3QqIGgsIE9QSl9JTlQzMiAqYSkKK3sKICAgICBPUEpfSU5UMzIgKmFpID0gYTsKICAgICBPUEpfSU5UMzIgKmJpID0gaC0+bWVtICsgaC0+Y2FzOwotICAgIE9QSl9JTlQzMiAgaQk9IGgtPnNuOwotICAgIHdoaWxlKCBpLS0gKSB7Ci0gICAgICAqYmkgPSAqKGFpKyspOwotCSAgYmkgKz0gMjsKKyAgICBPUEpfSU5UMzIgIGkgICAgPSBoLT5zbjsKKyAgICB3aGlsZSAoaS0tKSB7CisgICAgICAgICpiaSA9ICooYWkrKyk7CisgICAgICAgIGJpICs9IDI7CiAgICAgfQotICAgIGFpCT0gYSArIGgtPnNuOwotICAgIGJpCT0gaC0+bWVtICsgMSAtIGgtPmNhczsKLSAgICBpCT0gaC0+ZG4gOwotICAgIHdoaWxlKCBpLS0gKSB7Ci0gICAgICAqYmkgPSAqKGFpKyspOwotCSAgYmkgKz0gMjsKKyAgICBhaSAgPSBhICsgaC0+c247CisgICAgYmkgID0gaC0+bWVtICsgMSAtIGgtPmNhczsKKyAgICBpICAgPSBoLT5kbiA7CisgICAgd2hpbGUgKGktLSkgeworICAgICAgICAqYmkgPSAqKGFpKyspOworICAgICAgICBiaSArPSAyOwogICAgIH0KIH0KIAotLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAgCisvKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBJbnZlcnNlIGxhenkgdHJhbnNmb3JtICh2ZXJ0aWNhbCkuICAgICovCi0vKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIAotc3RhdGljIHZvaWQgb3BqX2R3dF9pbnRlcmxlYXZlX3Yob3BqX2R3dF90KiB2LCBPUEpfSU5UMzIgKmEsIE9QSl9JTlQzMiB4KSB7CisvKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitzdGF0aWMgdm9pZCBvcGpfZHd0X2ludGVybGVhdmVfdihjb25zdCBvcGpfZHd0X3QqIHYsIE9QSl9JTlQzMiAqYSwgT1BKX0lOVDMyIHgpCit7CiAgICAgT1BKX0lOVDMyICphaSA9IGE7CiAgICAgT1BKX0lOVDMyICpiaSA9IHYtPm1lbSArIHYtPmNhczsKICAgICBPUEpfSU5UMzIgIGkgPSB2LT5zbjsKLSAgICB3aGlsZSggaS0tICkgewotICAgICAgKmJpID0gKmFpOwotCSAgYmkgKz0gMjsKLQkgIGFpICs9IHg7CisgICAgd2hpbGUgKGktLSkgeworICAgICAgICAqYmkgPSAqYWk7CisgICAgICAgIGJpICs9IDI7CisgICAgICAgIGFpICs9IHg7CiAgICAgfQotICAgIGFpID0gYSArICh2LT5zbiAqIHgpOworICAgIGFpID0gYSArICh2LT5zbiAqIChPUEpfU0laRV9UKXgpOwogICAgIGJpID0gdi0+bWVtICsgMSAtIHYtPmNhczsKICAgICBpID0gdi0+ZG4gOwotICAgIHdoaWxlKCBpLS0gKSB7Ci0gICAgICAqYmkgPSAqYWk7Ci0JICBiaSArPSAyOyAgCi0JICBhaSArPSB4OworICAgIHdoaWxlIChpLS0pIHsKKyAgICAgICAgKmJpID0gKmFpOworICAgICAgICBiaSArPSAyOworICAgICAgICBhaSArPSB4OwogICAgIH0KIH0KIAorI2VuZGlmIC8qIFNUQU5EQVJEX1NMT1dfVkVSU0lPTiAqLwogCiAvKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZvcndhcmQgNS0zIHdhdmVsZXQgdHJhbnNmb3JtIGluIDEtRC4gKi8KIC8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotc3RhdGljIHZvaWQgb3BqX2R3dF9lbmNvZGVfMShPUEpfSU5UMzIgKmEsIE9QSl9TSVpFX1QgYV9jb3VudCwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpIHsKLQlPUEpfSU5UMzIgaTsKLQkKLQlpZiAoIWNhcykgewotCQlpZiAoKGRuID4gMCkgfHwgKHNuID4gMSkpIHsJLyogTkVXIDogIENBU0UgT05FIEVMRU1FTlQgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBkbjsgaSsrKSBPUEpfRChpKSAtPSAoT1BKX1NfKGkpICsgT1BKX1NfKGkgKyAxKSkgPj4gMTsKLQkJCWZvciAoaSA9IDA7IGkgPCBzbjsgaSsrKSBPUEpfUyhpKSArPSAoT1BKX0RfKGkgLSAxKSArIE9QSl9EXyhpKSArIDIpID4+IDI7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoIXNuICYmIGRuID09IDEpCQkgICAgLyogTkVXIDogIENBU0UgT05FIEVMRU1FTlQgKi8KLQkJCU9QSl9TKDApICo9IDI7Ci0JCWVsc2UgewotCQkJZm9yIChpID0gMDsgaSA8IGRuOyBpKyspIE9QSl9TKGkpIC09IChPUEpfRERfKGkpICsgT1BKX0REXyhpIC0gMSkpID4+IDE7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgc247IGkrKykgT1BKX0QoaSkgKz0gKE9QSl9TU18oaSkgKyBPUEpfU1NfKGkgKyAxKSArIDIpID4+IDI7Ci0JCX0KLQl9CitzdGF0aWMgdm9pZCBvcGpfZHd0X2VuY29kZV8xKE9QSl9JTlQzMiAqYSwgT1BKX1NJWkVfVCBhX2NvdW50LCBPUEpfSU5UMzIgZG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBzbiwgT1BKX0lOVDMyIGNhcykKK3sKKyAgICBPUEpfSU5UMzIgaTsKKworICAgIGlmICghY2FzKSB7CisgICAgICAgIGlmICgoZG4gPiAwKSB8fCAoc24gPiAxKSkgeyAvKiBORVcgOiAgQ0FTRSBPTkUgRUxFTUVOVCAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBPUEpfRChpKSAtPSAoT1BKX1NfKGkpICsgT1BKX1NfKGkgKyAxKSkgPj4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgT1BKX1MoaSkgKz0gKE9QSl9EXyhpIC0gMSkgKyBPUEpfRF8oaSkgKyAyKSA+PiAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFzbiAmJiBkbiA9PSAxKSB7ICAgICAgIC8qIE5FVyA6ICBDQVNFIE9ORSBFTEVNRU5UICovCisgICAgICAgICAgICBPUEpfUygwKSAqPSAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBPUEpfUyhpKSAtPSAoT1BKX0REXyhpKSArIE9QSl9ERF8oaSAtIDEpKSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBPUEpfRChpKSArPSAoT1BKX1NTXyhpKSArIE9QSl9TU18oaSArIDEpICsgMikgPj4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KIAorI2lmZGVmIFNUQU5EQVJEX1NMT1dfVkVSU0lPTgogLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBJbnZlcnNlIDUtMyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAxLUQuICovCi0vKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gCi1zdGF0aWMgdm9pZCBvcGpfZHd0X2RlY29kZV8xXyhPUEpfSU5UMzIgKmEsIE9QSl9TSVpFX1QgYV9jb3VudCwgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sIE9QSl9JTlQzMiBjYXMpIHsKLQlPUEpfSU5UMzIgaTsKLQkKLQlpZiAoIWNhcykgewotCQlpZiAoKGRuID4gMCkgfHwgKHNuID4gMSkpIHsgLyogTkVXIDogIENBU0UgT05FIEVMRU1FTlQgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCBzbjsgaSsrKSBPUEpfUyhpKSAtPSAoT1BKX0RfKGkgLSAxKSArIE9QSl9EXyhpKSArIDIpID4+IDI7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgZG47IGkrKykgT1BKX0QoaSkgKz0gKE9QSl9TXyhpKSArIE9QSl9TXyhpICsgMSkpID4+IDE7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoIXNuICAmJiBkbiA9PSAxKSAgICAgICAgICAvKiBORVcgOiAgQ0FTRSBPTkUgRUxFTUVOVCAqLwotCQkJT1BKX1MoMCkgLz0gMjsKLQkJZWxzZSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgc247IGkrKykgT1BKX0QoaSkgLT0gKE9QSl9TU18oaSkgKyBPUEpfU1NfKGkgKyAxKSArIDIpID4+IDI7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgZG47IGkrKykgT1BKX1MoaSkgKz0gKE9QSl9ERF8oaSkgKyBPUEpfRERfKGkgLSAxKSkgPj4gMTsKLQkJfQotCX0KKy8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIHZvaWQgb3BqX2R3dF9kZWNvZGVfMV8oT1BKX0lOVDMyICphLCBPUEpfU0laRV9UIGFfY291bnQsIE9QSl9JTlQzMiBkbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBzbiwgT1BKX0lOVDMyIGNhcykKK3sKKyAgICBPUEpfSU5UMzIgaTsKKworICAgIGlmICghY2FzKSB7CisgICAgICAgIGlmICgoZG4gPiAwKSB8fCAoc24gPiAxKSkgeyAvKiBORVcgOiAgQ0FTRSBPTkUgRUxFTUVOVCAqLworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBPUEpfUyhpKSAtPSAoT1BKX0RfKGkgLSAxKSArIE9QSl9EXyhpKSArIDIpID4+IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZG47IGkrKykgeworICAgICAgICAgICAgICAgIE9QSl9EKGkpICs9IChPUEpfU18oaSkgKyBPUEpfU18oaSArIDEpKSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFzbiAgJiYgZG4gPT0gMSkgeyAgICAgICAgLyogTkVXIDogIENBU0UgT05FIEVMRU1FTlQgKi8KKyAgICAgICAgICAgIE9QSl9TKDApIC89IDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc247IGkrKykgeworICAgICAgICAgICAgICAgIE9QSl9EKGkpIC09IChPUEpfU1NfKGkpICsgT1BKX1NTXyhpICsgMSkgKyAyKSA+PiAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBPUEpfUyhpKSArPSAoT1BKX0REXyhpKSArIE9QSl9ERF8oaSAtIDEpKSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQogCi0vKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEludmVyc2UgNS0zIHdhdmVsZXQgdHJhbnNmb3JtIGluIDEtRC4gKi8KLS8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAKLXN0YXRpYyB2b2lkIG9wal9kd3RfZGVjb2RlXzEob3BqX2R3dF90ICp2KSB7Ci0Jb3BqX2R3dF9kZWNvZGVfMV8odi0+bWVtLCB2LT5tZW1fY291bnQsIHYtPmRuLCB2LT5zbiwgdi0+Y2FzKTsKK3N0YXRpYyB2b2lkIG9wal9kd3RfZGVjb2RlXzEoY29uc3Qgb3BqX2R3dF90ICp2KQoreworICAgIG9wal9kd3RfZGVjb2RlXzFfKHYtPm1lbSwgdi0+bWVtX2NvdW50LCB2LT5kbiwgdi0+c24sIHYtPmNhcyk7CiB9CiAKKyNlbmRpZiAvKiBTVEFOREFSRF9TTE9XX1ZFUlNJT04gKi8KKworI2lmICFkZWZpbmVkKFNUQU5EQVJEX1NMT1dfVkVSU0lPTikKK3N0YXRpYyB2b2lkICBvcGpfaWR3dDUzX2hfY2FzMChPUEpfSU5UMzIqIHRtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfSU5UMzIgc24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1BKX0lOVDMyIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIqIHRpbGVkcCkKK3sKKyAgICBPUEpfSU5UMzIgaSwgajsKKyAgICBjb25zdCBPUEpfSU5UMzIqIGluX2V2ZW4gPSAmdGlsZWRwWzBdOworICAgIGNvbnN0IE9QSl9JTlQzMiogaW5fb2RkID0gJnRpbGVkcFtzbl07CisKKyNpZmRlZiBUV09fUEFTU19WRVJTSU9OCisgICAgLyogRm9yIGRvY3VtZW50YXRpb24gcHVycG9zZTogcGVyZm9ybXMgbGlmdGluZyBpbiB0d28gaXRlcmF0aW9ucywgKi8KKyAgICAvKiBidXQgd2l0aG91dCBleHBsaWNpdCBpbnRlcmxlYXZpbmcgKi8KKworICAgIGFzc2VydChsZW4gPiAxKTsKKworICAgIC8qIEV2ZW4gKi8KKyAgICB0bXBbMF0gPSBpbl9ldmVuWzBdIC0gKChpbl9vZGRbMF0gKyAxKSA+PiAxKTsKKyAgICBmb3IgKGkgPSAyLCBqID0gMDsgaSA8PSBsZW4gLSAyOyBpICs9IDIsIGorKykgeworICAgICAgICB0bXBbaV0gPSBpbl9ldmVuW2ogKyAxXSAtICgoaW5fb2RkW2pdICsgaW5fb2RkW2ogKyAxXSArIDIpID4+IDIpOworICAgIH0KKyAgICBpZiAobGVuICYgMSkgeyAvKiBpZiBsZW4gaXMgb2RkICovCisgICAgICAgIHRtcFtsZW4gLSAxXSA9IGluX2V2ZW5bKGxlbiAtIDEpIC8gMl0gLSAoKGluX29kZFsobGVuIC0gMikgLyAyXSArIDEpID4+IDEpOworICAgIH0KKworICAgIC8qIE9kZCAqLworICAgIGZvciAoaSA9IDEsIGogPSAwOyBpIDwgbGVuIC0gMTsgaSArPSAyLCBqKyspIHsKKyAgICAgICAgdG1wW2ldID0gaW5fb2RkW2pdICsgKCh0bXBbaSAtIDFdICsgdG1wW2kgKyAxXSkgPj4gMSk7CisgICAgfQorICAgIGlmICghKGxlbiAmIDEpKSB7IC8qIGlmIGxlbiBpcyBldmVuICovCisgICAgICAgIHRtcFtsZW4gLSAxXSA9IGluX29kZFsobGVuIC0gMSkgLyAyXSArIHRtcFtsZW4gLSAyXTsKKyAgICB9CisjZWxzZQorICAgIE9QSl9JTlQzMiBkMWMsIGQxbiwgczFuLCBzMGMsIHMwbjsKKworICAgIGFzc2VydChsZW4gPiAxKTsKKworICAgIC8qIEltcHJvdmVkIHZlcnNpb24gb2YgdGhlIFRXT19QQVNTX1ZFUlNJT046ICovCisgICAgLyogUGVyZm9ybXMgbGlmdGluZyBpbiBvbmUgc2luZ2xlIGl0ZXJhdGlvbi4gU2F2ZXMgbWVtb3J5ICovCisgICAgLyogYWNjZXNzZXMgYW5kIGV4cGxpY2l0IGludGVybGVhdmluZy4gKi8KKyAgICBzMW4gPSBpbl9ldmVuWzBdOworICAgIGQxbiA9IGluX29kZFswXTsKKyAgICBzMG4gPSBzMW4gLSAoKGQxbiArIDEpID4+IDEpOworCisgICAgZm9yIChpID0gMCwgaiA9IDE7IGkgPCAobGVuIC0gMyk7IGkgKz0gMiwgaisrKSB7CisgICAgICAgIGQxYyA9IGQxbjsKKyAgICAgICAgczBjID0gczBuOworCisgICAgICAgIHMxbiA9IGluX2V2ZW5bal07CisgICAgICAgIGQxbiA9IGluX29kZFtqXTsKKworICAgICAgICBzMG4gPSBzMW4gLSAoKGQxYyArIGQxbiArIDIpID4+IDIpOworCisgICAgICAgIHRtcFtpICBdID0gczBjOworICAgICAgICB0bXBbaSArIDFdID0gZDFjICsgKChzMGMgKyBzMG4pID4+IDEpOworICAgIH0KKworICAgIHRtcFtpXSA9IHMwbjsKKworICAgIGlmIChsZW4gJiAxKSB7CisgICAgICAgIHRtcFtsZW4gLSAxXSA9IGluX2V2ZW5bKGxlbiAtIDEpIC8gMl0gLSAoKGQxbiArIDEpID4+IDEpOworICAgICAgICB0bXBbbGVuIC0gMl0gPSBkMW4gKyAoKHMwbiArIHRtcFtsZW4gLSAxXSkgPj4gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdG1wW2xlbiAtIDFdID0gZDFuICsgczBuOworICAgIH0KKyNlbmRpZgorICAgIG1lbWNweSh0aWxlZHAsIHRtcCwgKE9QSl9VSU5UMzIpbGVuICogc2l6ZW9mKE9QSl9JTlQzMikpOworfQorCitzdGF0aWMgdm9pZCAgb3BqX2lkd3Q1M19oX2NhczEoT1BKX0lOVDMyKiB0bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1BKX0lOVDMyIHNuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9QSl9JTlQzMiBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyKiB0aWxlZHApCit7CisgICAgT1BKX0lOVDMyIGksIGo7CisgICAgY29uc3QgT1BKX0lOVDMyKiBpbl9ldmVuID0gJnRpbGVkcFtzbl07CisgICAgY29uc3QgT1BKX0lOVDMyKiBpbl9vZGQgPSAmdGlsZWRwWzBdOworCisjaWZkZWYgVFdPX1BBU1NfVkVSU0lPTgorICAgIC8qIEZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2U6IHBlcmZvcm1zIGxpZnRpbmcgaW4gdHdvIGl0ZXJhdGlvbnMsICovCisgICAgLyogYnV0IHdpdGhvdXQgZXhwbGljaXQgaW50ZXJsZWF2aW5nICovCisKKyAgICBhc3NlcnQobGVuID4gMik7CisKKyAgICAvKiBPZGQgKi8KKyAgICBmb3IgKGkgPSAxLCBqID0gMDsgaSA8IGxlbiAtIDE7IGkgKz0gMiwgaisrKSB7CisgICAgICAgIHRtcFtpXSA9IGluX29kZFtqXSAtICgoaW5fZXZlbltqXSArIGluX2V2ZW5baiArIDFdICsgMikgPj4gMik7CisgICAgfQorICAgIGlmICghKGxlbiAmIDEpKSB7CisgICAgICAgIHRtcFtsZW4gLSAxXSA9IGluX29kZFtsZW4gLyAyIC0gMV0gLSAoKGluX2V2ZW5bbGVuIC8gMiAtIDFdICsgMSkgPj4gMSk7CisgICAgfQorCisgICAgLyogRXZlbiAqLworICAgIHRtcFswXSA9IGluX2V2ZW5bMF0gKyB0bXBbMV07CisgICAgZm9yIChpID0gMiwgaiA9IDE7IGkgPCBsZW4gLSAxOyBpICs9IDIsIGorKykgeworICAgICAgICB0bXBbaV0gPSBpbl9ldmVuW2pdICsgKCh0bXBbaSArIDFdICsgdG1wW2kgLSAxXSkgPj4gMSk7CisgICAgfQorICAgIGlmIChsZW4gJiAxKSB7CisgICAgICAgIHRtcFtsZW4gLSAxXSA9IGluX2V2ZW5bbGVuIC8gMl0gKyB0bXBbbGVuIC0gMl07CisgICAgfQorI2Vsc2UKKyAgICBPUEpfSU5UMzIgczEsIHMyLCBkYywgZG47CisKKyAgICBhc3NlcnQobGVuID4gMik7CisKKyAgICAvKiBJbXByb3ZlZCB2ZXJzaW9uIG9mIHRoZSBUV09fUEFTU19WRVJTSU9OOiAqLworICAgIC8qIFBlcmZvcm1zIGxpZnRpbmcgaW4gb25lIHNpbmdsZSBpdGVyYXRpb24uIFNhdmVzIG1lbW9yeSAqLworICAgIC8qIGFjY2Vzc2VzIGFuZCBleHBsaWNpdCBpbnRlcmxlYXZpbmcuICovCisKKyAgICBzMSA9IGluX2V2ZW5bMV07CisgICAgZGMgPSBpbl9vZGRbMF0gLSAoKGluX2V2ZW5bMF0gKyBzMSArIDIpID4+IDIpOworICAgIHRtcFswXSA9IGluX2V2ZW5bMF0gKyBkYzsKKworICAgIGZvciAoaSA9IDEsIGogPSAxOyBpIDwgKGxlbiAtIDIgLSAhKGxlbiAmIDEpKTsgaSArPSAyLCBqKyspIHsKKworICAgICAgICBzMiA9IGluX2V2ZW5baiArIDFdOworCisgICAgICAgIGRuID0gaW5fb2RkW2pdIC0gKChzMSArIHMyICsgMikgPj4gMik7CisgICAgICAgIHRtcFtpICBdID0gZGM7CisgICAgICAgIHRtcFtpICsgMV0gPSBzMSArICgoZG4gKyBkYykgPj4gMSk7CisKKyAgICAgICAgZGMgPSBkbjsKKyAgICAgICAgczEgPSBzMjsKKyAgICB9CisKKyAgICB0bXBbaV0gPSBkYzsKKworICAgIGlmICghKGxlbiAmIDEpKSB7CisgICAgICAgIGRuID0gaW5fb2RkW2xlbiAvIDIgLSAxXSAtICgoczEgKyAxKSA+PiAxKTsKKyAgICAgICAgdG1wW2xlbiAtIDJdID0gczEgKyAoKGRuICsgZGMpID4+IDEpOworICAgICAgICB0bXBbbGVuIC0gMV0gPSBkbjsKKyAgICB9IGVsc2UgeworICAgICAgICB0bXBbbGVuIC0gMV0gPSBzMSArIGRjOworICAgIH0KKyNlbmRpZgorICAgIG1lbWNweSh0aWxlZHAsIHRtcCwgKE9QSl9VSU5UMzIpbGVuICogc2l6ZW9mKE9QSl9JTlQzMikpOworfQorCisKKyNlbmRpZiAvKiAhZGVmaW5lZChTVEFOREFSRF9TTE9XX1ZFUlNJT04pICovCisKKy8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSW52ZXJzZSA1LTMgd2F2ZWxldCB0cmFuc2Zvcm0gaW4gMS1EIGZvciBvbmUgcm93LiAqLworLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQZXJmb3JtcyBpbnRlcmxlYXZlLCBpbnZlcnNlIHdhdmVsZXQgdHJhbnNmb3JtIGFuZCBjb3B5IGJhY2sgdG8gYnVmZmVyICovCitzdGF0aWMgdm9pZCBvcGpfaWR3dDUzX2goY29uc3Qgb3BqX2R3dF90ICpkd3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyKiB0aWxlZHApCit7CisjaWZkZWYgU1RBTkRBUkRfU0xPV19WRVJTSU9OCisgICAgLyogRm9yIGRvY3VtZW50YXRpb24gcHVycG9zZSAqLworICAgIG9wal9kd3RfaW50ZXJsZWF2ZV9oKGR3dCwgdGlsZWRwKTsKKyAgICBvcGpfZHd0X2RlY29kZV8xKGR3dCk7CisgICAgbWVtY3B5KHRpbGVkcCwgZHd0LT5tZW0sIChPUEpfVUlOVDMyKShkd3QtPnNuICsgZHd0LT5kbikgKiBzaXplb2YoT1BKX0lOVDMyKSk7CisjZWxzZQorICAgIGNvbnN0IE9QSl9JTlQzMiBzbiA9IGR3dC0+c247CisgICAgY29uc3QgT1BKX0lOVDMyIGxlbiA9IHNuICsgZHd0LT5kbjsKKyAgICBpZiAoZHd0LT5jYXMgPT0gMCkgeyAvKiBMZWZ0LW1vc3Qgc2FtcGxlIGlzIG9uIGV2ZW4gY29vcmRpbmF0ZSAqLworICAgICAgICBpZiAobGVuID4gMSkgeworICAgICAgICAgICAgb3BqX2lkd3Q1M19oX2NhczAoZHd0LT5tZW0sIHNuLCBsZW4sIHRpbGVkcCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBVbm1vZGlmaWVkIHZhbHVlICovCisgICAgICAgIH0KKyAgICB9IGVsc2UgeyAvKiBMZWZ0LW1vc3Qgc2FtcGxlIGlzIG9uIG9kZCBjb29yZGluYXRlICovCisgICAgICAgIGlmIChsZW4gPT0gMSkgeworICAgICAgICAgICAgdGlsZWRwWzBdIC89IDI7CisgICAgICAgIH0gZWxzZSBpZiAobGVuID09IDIpIHsKKyAgICAgICAgICAgIE9QSl9JTlQzMiogb3V0ID0gZHd0LT5tZW07CisgICAgICAgICAgICBjb25zdCBPUEpfSU5UMzIqIGluX2V2ZW4gPSAmdGlsZWRwW3NuXTsKKyAgICAgICAgICAgIGNvbnN0IE9QSl9JTlQzMiogaW5fb2RkID0gJnRpbGVkcFswXTsKKyAgICAgICAgICAgIG91dFsxXSA9IGluX29kZFswXSAtICgoaW5fZXZlblswXSArIDEpID4+IDEpOworICAgICAgICAgICAgb3V0WzBdID0gaW5fZXZlblswXSArIG91dFsxXTsKKyAgICAgICAgICAgIG1lbWNweSh0aWxlZHAsIGR3dC0+bWVtLCAoT1BKX1VJTlQzMilsZW4gKiBzaXplb2YoT1BKX0lOVDMyKSk7CisgICAgICAgIH0gZWxzZSBpZiAobGVuID4gMikgeworICAgICAgICAgICAgb3BqX2lkd3Q1M19oX2NhczEoZHd0LT5tZW0sIHNuLCBsZW4sIHRpbGVkcCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKK30KKworI2lmIChkZWZpbmVkKF9fU1NFMl9fKSB8fCBkZWZpbmVkKF9fQVZYMl9fKSkgJiYgIWRlZmluZWQoU1RBTkRBUkRfU0xPV19WRVJTSU9OKQorCisvKiBDb252ZW5pZW5jeSBtYWNyb3MgdG8gaW1wcm92ZSB0aGUgcmVhZGFiaWx0eSBvZiB0aGUgZm9ybXVsYXMgKi8KKyNpZiBfX0FWWDJfXworI2RlZmluZSBWUkVHICAgICAgICBfX20yNTZpCisjZGVmaW5lIExPQURfQ1NUKHgpIF9tbTI1Nl9zZXQxX2VwaTMyKHgpCisjZGVmaW5lIExPQUQoeCkgICAgIF9tbTI1Nl9sb2FkX3NpMjU2KChjb25zdCBWUkVHKikoeCkpCisjZGVmaW5lIExPQURVKHgpICAgIF9tbTI1Nl9sb2FkdV9zaTI1NigoY29uc3QgVlJFRyopKHgpKQorI2RlZmluZSBTVE9SRSh4LHkpICBfbW0yNTZfc3RvcmVfc2kyNTYoKFZSRUcqKSh4KSwoeSkpCisjZGVmaW5lIFNUT1JFVSh4LHkpIF9tbTI1Nl9zdG9yZXVfc2kyNTYoKFZSRUcqKSh4KSwoeSkpCisjZGVmaW5lIEFERCh4LHkpICAgIF9tbTI1Nl9hZGRfZXBpMzIoKHgpLCh5KSkKKyNkZWZpbmUgU1VCKHgseSkgICAgX21tMjU2X3N1Yl9lcGkzMigoeCksKHkpKQorI2RlZmluZSBTQVIoeCx5KSAgICBfbW0yNTZfc3JhaV9lcGkzMigoeCksKHkpKQorI2Vsc2UKKyNkZWZpbmUgVlJFRyAgICAgICAgX19tMTI4aQorI2RlZmluZSBMT0FEX0NTVCh4KSBfbW1fc2V0MV9lcGkzMih4KQorI2RlZmluZSBMT0FEKHgpICAgICBfbW1fbG9hZF9zaTEyOCgoY29uc3QgVlJFRyopKHgpKQorI2RlZmluZSBMT0FEVSh4KSAgICBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IFZSRUcqKSh4KSkKKyNkZWZpbmUgU1RPUkUoeCx5KSAgX21tX3N0b3JlX3NpMTI4KChWUkVHKikoeCksKHkpKQorI2RlZmluZSBTVE9SRVUoeCx5KSBfbW1fc3RvcmV1X3NpMTI4KChWUkVHKikoeCksKHkpKQorI2RlZmluZSBBREQoeCx5KSAgICBfbW1fYWRkX2VwaTMyKCh4KSwoeSkpCisjZGVmaW5lIFNVQih4LHkpICAgIF9tbV9zdWJfZXBpMzIoKHgpLCh5KSkKKyNkZWZpbmUgU0FSKHgseSkgICAgX21tX3NyYWlfZXBpMzIoKHgpLCh5KSkKKyNlbmRpZgorI2RlZmluZSBBREQzKHgseSx6KSBBREQoQUREKHgseSkseikKKworc3RhdGljCit2b2lkIG9wal9pZHd0NTNfdl9maW5hbF9tZW1jcHkoT1BKX0lOVDMyKiB0aWxlZHBfY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9QSl9JTlQzMiogdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1NJWkVfVCBzdHJpZGUpCit7CisgICAgT1BKX0lOVDMyIGk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgIC8qIEEgbWVtY3B5KCZ0aWxlZHBfY29sW2kgKiBzdHJpZGUgKyAwXSwKKyAgICAgICAgICAgICAgICAgICAgJnRtcFtQQVJBTExFTF9DT0xTXzUzICogaSArIDBdLAorICAgICAgICAgICAgICAgICAgICBQQVJBTExFTF9DT0xTXzUzICogc2l6ZW9mKE9QSl9JTlQzMikpCisgICAgICAgICAgIHdvdWxkIGRvIGJ1dCB3b3VsZCBiZSBhIHRpbnkgYml0IHNsb3dlci4KKyAgICAgICAgICAgV2UgY2FuIHRha2UgaGVyZSBhZHZhbnRhZ2Ugb2Ygb3VyIGtub3dsZWRnZSBvZiBhbGlnbm1lbnQgKi8KKyAgICAgICAgU1RPUkVVKCZ0aWxlZHBfY29sWyhPUEpfU0laRV9UKWkgKiBzdHJpZGUgKyAwXSwKKyAgICAgICAgICAgICAgIExPQUQoJnRtcFtQQVJBTExFTF9DT0xTXzUzICogaSArIDBdKSk7CisgICAgICAgIFNUT1JFVSgmdGlsZWRwX2NvbFsoT1BKX1NJWkVfVClpICogc3RyaWRlICsgVlJFR19JTlRfQ09VTlRdLAorICAgICAgICAgICAgICAgTE9BRCgmdG1wW1BBUkFMTEVMX0NPTFNfNTMgKiBpICsgVlJFR19JTlRfQ09VTlRdKSk7CisgICAgfQorfQorCisvKiogVmVydGljYWwgaW52ZXJzZSA1eDMgd2F2ZWxldCB0cmFuc2Zvcm0gZm9yIDggY29sdW1ucyBpbiBTU0UyLCBvcgorICogMTYgaW4gQVZYMiwgd2hlbiB0b3AtbW9zdCBwaXhlbCBpcyBvbiBldmVuIGNvb3JkaW5hdGUgKi8KK3N0YXRpYyB2b2lkIG9wal9pZHd0NTNfdl9jYXMwX21jb2xzX1NTRTJfT1JfQVZYMigKKyAgICBPUEpfSU5UMzIqIHRtcCwKKyAgICBjb25zdCBPUEpfSU5UMzIgc24sCisgICAgY29uc3QgT1BKX0lOVDMyIGxlbiwKKyAgICBPUEpfSU5UMzIqIHRpbGVkcF9jb2wsCisgICAgY29uc3QgT1BKX1NJWkVfVCBzdHJpZGUpCit7CisgICAgY29uc3QgT1BKX0lOVDMyKiBpbl9ldmVuID0gJnRpbGVkcF9jb2xbMF07CisgICAgY29uc3QgT1BKX0lOVDMyKiBpbl9vZGQgPSAmdGlsZWRwX2NvbFsoT1BKX1NJWkVfVClzbiAqIHN0cmlkZV07CisKKyAgICBPUEpfSU5UMzIgaTsKKyAgICBPUEpfU0laRV9UIGo7CisgICAgVlJFRyBkMWNfMCwgZDFuXzAsIHMxbl8wLCBzMGNfMCwgczBuXzA7CisgICAgVlJFRyBkMWNfMSwgZDFuXzEsIHMxbl8xLCBzMGNfMSwgczBuXzE7CisgICAgY29uc3QgVlJFRyB0d28gPSBMT0FEX0NTVCgyKTsKKworICAgIGFzc2VydChsZW4gPiAxKTsKKyNpZiBfX0FWWDJfXworICAgIGFzc2VydChQQVJBTExFTF9DT0xTXzUzID09IDE2KTsKKyAgICBhc3NlcnQoVlJFR19JTlRfQ09VTlQgPT0gOCk7CisjZWxzZQorICAgIGFzc2VydChQQVJBTExFTF9DT0xTXzUzID09IDgpOworICAgIGFzc2VydChWUkVHX0lOVF9DT1VOVCA9PSA0KTsKKyNlbmRpZgorCisgICAgLyogTm90ZTogbG9hZHMgb2YgaW5wdXQgZXZlbi9vZGQgdmFsdWVzIG11c3QgYmUgZG9uZSBpbiBhIHVuYWxpZ25lZCAqLworICAgIC8qIGZhc2hpb24uIEJ1dCBzdG9yZXMgaW4gdG1wIGNhbiBiZSBkb25lIHdpdGggYWxpZ25lZCBzdG9yZSwgc2luY2UgKi8KKyAgICAvKiB0aGUgdGVtcG9yYXJ5IGJ1ZmZlciBpcyBwcm9wZXJseSBhbGlnbmVkICovCisgICAgYXNzZXJ0KChPUEpfU0laRV9UKXRtcCAlIChzaXplb2YoT1BKX0lOVDMyKSAqIFZSRUdfSU5UX0NPVU5UKSA9PSAwKTsKKworICAgIHMxbl8wID0gTE9BRFUoaW5fZXZlbiArIDApOworICAgIHMxbl8xID0gTE9BRFUoaW5fZXZlbiArIFZSRUdfSU5UX0NPVU5UKTsKKyAgICBkMW5fMCA9IExPQURVKGluX29kZCk7CisgICAgZDFuXzEgPSBMT0FEVShpbl9vZGQgKyBWUkVHX0lOVF9DT1VOVCk7CisKKyAgICAvKiBzMG4gPSBzMW4gLSAoKGQxbiArIDEpID4+IDEpOyA8PT0+ICovCisgICAgLyogczBuID0gczFuIC0gKChkMW4gKyBkMW4gKyAyKSA+PiAyKTsgKi8KKyAgICBzMG5fMCA9IFNVQihzMW5fMCwgU0FSKEFERDMoZDFuXzAsIGQxbl8wLCB0d28pLCAyKSk7CisgICAgczBuXzEgPSBTVUIoczFuXzEsIFNBUihBREQzKGQxbl8xLCBkMW5fMSwgdHdvKSwgMikpOworCisgICAgZm9yIChpID0gMCwgaiA9IDE7IGkgPCAobGVuIC0gMyk7IGkgKz0gMiwgaisrKSB7CisgICAgICAgIGQxY18wID0gZDFuXzA7CisgICAgICAgIHMwY18wID0gczBuXzA7CisgICAgICAgIGQxY18xID0gZDFuXzE7CisgICAgICAgIHMwY18xID0gczBuXzE7CisKKyAgICAgICAgczFuXzAgPSBMT0FEVShpbl9ldmVuICsgaiAqIHN0cmlkZSk7CisgICAgICAgIHMxbl8xID0gTE9BRFUoaW5fZXZlbiArIGogKiBzdHJpZGUgKyBWUkVHX0lOVF9DT1VOVCk7CisgICAgICAgIGQxbl8wID0gTE9BRFUoaW5fb2RkICsgaiAqIHN0cmlkZSk7CisgICAgICAgIGQxbl8xID0gTE9BRFUoaW5fb2RkICsgaiAqIHN0cmlkZSArIFZSRUdfSU5UX0NPVU5UKTsKKworICAgICAgICAvKnMwbiA9IHMxbiAtICgoZDFjICsgZDFuICsgMikgPj4gMik7Ki8KKyAgICAgICAgczBuXzAgPSBTVUIoczFuXzAsIFNBUihBREQzKGQxY18wLCBkMW5fMCwgdHdvKSwgMikpOworICAgICAgICBzMG5fMSA9IFNVQihzMW5fMSwgU0FSKEFERDMoZDFjXzEsIGQxbl8xLCB0d28pLCAyKSk7CisKKyAgICAgICAgU1RPUkUodG1wICsgUEFSQUxMRUxfQ09MU181MyAqIChpICsgMCksIHMwY18wKTsKKyAgICAgICAgU1RPUkUodG1wICsgUEFSQUxMRUxfQ09MU181MyAqIChpICsgMCkgKyBWUkVHX0lOVF9DT1VOVCwgczBjXzEpOworCisgICAgICAgIC8qIGQxYyArICgoczBjICsgczBuKSA+PiAxKSAqLworICAgICAgICBTVE9SRSh0bXAgKyBQQVJBTExFTF9DT0xTXzUzICogKGkgKyAxKSArIDAsCisgICAgICAgICAgICAgIEFERChkMWNfMCwgU0FSKEFERChzMGNfMCwgczBuXzApLCAxKSkpOworICAgICAgICBTVE9SRSh0bXAgKyBQQVJBTExFTF9DT0xTXzUzICogKGkgKyAxKSArIFZSRUdfSU5UX0NPVU5ULAorICAgICAgICAgICAgICBBREQoZDFjXzEsIFNBUihBREQoczBjXzEsIHMwbl8xKSwgMSkpKTsKKyAgICB9CisKKyAgICBTVE9SRSh0bXAgKyBQQVJBTExFTF9DT0xTXzUzICogKGkgKyAwKSArIDAsIHMwbl8wKTsKKyAgICBTVE9SRSh0bXAgKyBQQVJBTExFTF9DT0xTXzUzICogKGkgKyAwKSArIFZSRUdfSU5UX0NPVU5ULCBzMG5fMSk7CisKKyAgICBpZiAobGVuICYgMSkgeworICAgICAgICBWUkVHIHRtcF9sZW5fbWludXNfMTsKKyAgICAgICAgczFuXzAgPSBMT0FEVShpbl9ldmVuICsgKE9QSl9TSVpFX1QpKChsZW4gLSAxKSAvIDIpICogc3RyaWRlKTsKKyAgICAgICAgLyogdG1wX2xlbl9taW51c18xID0gczFuIC0gKChkMW4gKyAxKSA+PiAxKTsgKi8KKyAgICAgICAgdG1wX2xlbl9taW51c18xID0gU1VCKHMxbl8wLCBTQVIoQUREMyhkMW5fMCwgZDFuXzAsIHR3byksIDIpKTsKKyAgICAgICAgU1RPUkUodG1wICsgUEFSQUxMRUxfQ09MU181MyAqIChsZW4gLSAxKSwgdG1wX2xlbl9taW51c18xKTsKKyAgICAgICAgLyogZDFuICsgKChzMG4gKyB0bXBfbGVuX21pbnVzXzEpID4+IDEpICovCisgICAgICAgIFNUT1JFKHRtcCArIFBBUkFMTEVMX0NPTFNfNTMgKiAobGVuIC0gMiksCisgICAgICAgICAgICAgIEFERChkMW5fMCwgU0FSKEFERChzMG5fMCwgdG1wX2xlbl9taW51c18xKSwgMSkpKTsKKworICAgICAgICBzMW5fMSA9IExPQURVKGluX2V2ZW4gKyAoT1BKX1NJWkVfVCkoKGxlbiAtIDEpIC8gMikgKiBzdHJpZGUgKyBWUkVHX0lOVF9DT1VOVCk7CisgICAgICAgIC8qIHRtcF9sZW5fbWludXNfMSA9IHMxbiAtICgoZDFuICsgMSkgPj4gMSk7ICovCisgICAgICAgIHRtcF9sZW5fbWludXNfMSA9IFNVQihzMW5fMSwgU0FSKEFERDMoZDFuXzEsIGQxbl8xLCB0d28pLCAyKSk7CisgICAgICAgIFNUT1JFKHRtcCArIFBBUkFMTEVMX0NPTFNfNTMgKiAobGVuIC0gMSkgKyBWUkVHX0lOVF9DT1VOVCwKKyAgICAgICAgICAgICAgdG1wX2xlbl9taW51c18xKTsKKyAgICAgICAgLyogZDFuICsgKChzMG4gKyB0bXBfbGVuX21pbnVzXzEpID4+IDEpICovCisgICAgICAgIFNUT1JFKHRtcCArIFBBUkFMTEVMX0NPTFNfNTMgKiAobGVuIC0gMikgKyBWUkVHX0lOVF9DT1VOVCwKKyAgICAgICAgICAgICAgQUREKGQxbl8xLCBTQVIoQUREKHMwbl8xLCB0bXBfbGVuX21pbnVzXzEpLCAxKSkpOworCisKKyAgICB9IGVsc2UgeworICAgICAgICBTVE9SRSh0bXAgKyBQQVJBTExFTF9DT0xTXzUzICogKGxlbiAtIDEpICsgMCwKKyAgICAgICAgICAgICAgQUREKGQxbl8wLCBzMG5fMCkpOworICAgICAgICBTVE9SRSh0bXAgKyBQQVJBTExFTF9DT0xTXzUzICogKGxlbiAtIDEpICsgVlJFR19JTlRfQ09VTlQsCisgICAgICAgICAgICAgIEFERChkMW5fMSwgczBuXzEpKTsKKyAgICB9CisKKyAgICBvcGpfaWR3dDUzX3ZfZmluYWxfbWVtY3B5KHRpbGVkcF9jb2wsIHRtcCwgbGVuLCBzdHJpZGUpOworfQorCisKKy8qKiBWZXJ0aWNhbCBpbnZlcnNlIDV4MyB3YXZlbGV0IHRyYW5zZm9ybSBmb3IgOCBjb2x1bW5zIGluIFNTRTIsIG9yCisgKiAxNiBpbiBBVlgyLCB3aGVuIHRvcC1tb3N0IHBpeGVsIGlzIG9uIG9kZCBjb29yZGluYXRlICovCitzdGF0aWMgdm9pZCBvcGpfaWR3dDUzX3ZfY2FzMV9tY29sc19TU0UyX09SX0FWWDIoCisgICAgT1BKX0lOVDMyKiB0bXAsCisgICAgY29uc3QgT1BKX0lOVDMyIHNuLAorICAgIGNvbnN0IE9QSl9JTlQzMiBsZW4sCisgICAgT1BKX0lOVDMyKiB0aWxlZHBfY29sLAorICAgIGNvbnN0IE9QSl9TSVpFX1Qgc3RyaWRlKQoreworICAgIE9QSl9JTlQzMiBpOworICAgIE9QSl9TSVpFX1QgajsKKworICAgIFZSRUcgczFfMCwgczJfMCwgZGNfMCwgZG5fMDsKKyAgICBWUkVHIHMxXzEsIHMyXzEsIGRjXzEsIGRuXzE7CisgICAgY29uc3QgVlJFRyB0d28gPSBMT0FEX0NTVCgyKTsKKworICAgIGNvbnN0IE9QSl9JTlQzMiogaW5fZXZlbiA9ICZ0aWxlZHBfY29sWyhPUEpfU0laRV9UKXNuICogc3RyaWRlXTsKKyAgICBjb25zdCBPUEpfSU5UMzIqIGluX29kZCA9ICZ0aWxlZHBfY29sWzBdOworCisgICAgYXNzZXJ0KGxlbiA+IDIpOworI2lmIF9fQVZYMl9fCisgICAgYXNzZXJ0KFBBUkFMTEVMX0NPTFNfNTMgPT0gMTYpOworICAgIGFzc2VydChWUkVHX0lOVF9DT1VOVCA9PSA4KTsKKyNlbHNlCisgICAgYXNzZXJ0KFBBUkFMTEVMX0NPTFNfNTMgPT0gOCk7CisgICAgYXNzZXJ0KFZSRUdfSU5UX0NPVU5UID09IDQpOworI2VuZGlmCisKKyAgICAvKiBOb3RlOiBsb2FkcyBvZiBpbnB1dCBldmVuL29kZCB2YWx1ZXMgbXVzdCBiZSBkb25lIGluIGEgdW5hbGlnbmVkICovCisgICAgLyogZmFzaGlvbi4gQnV0IHN0b3JlcyBpbiB0bXAgY2FuIGJlIGRvbmUgd2l0aCBhbGlnbmVkIHN0b3JlLCBzaW5jZSAqLworICAgIC8qIHRoZSB0ZW1wb3JhcnkgYnVmZmVyIGlzIHByb3Blcmx5IGFsaWduZWQgKi8KKyAgICBhc3NlcnQoKE9QSl9TSVpFX1QpdG1wICUgKHNpemVvZihPUEpfSU5UMzIpICogVlJFR19JTlRfQ09VTlQpID09IDApOworCisgICAgczFfMCA9IExPQURVKGluX2V2ZW4gKyBzdHJpZGUpOworICAgIC8qIGluX29kZFswXSAtICgoaW5fZXZlblswXSArIHMxICsgMikgPj4gMik7ICovCisgICAgZGNfMCA9IFNVQihMT0FEVShpbl9vZGQgKyAwKSwKKyAgICAgICAgICAgICAgIFNBUihBREQzKExPQURVKGluX2V2ZW4gKyAwKSwgczFfMCwgdHdvKSwgMikpOworICAgIFNUT1JFKHRtcCArIFBBUkFMTEVMX0NPTFNfNTMgKiAwLCBBREQoTE9BRFUoaW5fZXZlbiArIDApLCBkY18wKSk7CisKKyAgICBzMV8xID0gTE9BRFUoaW5fZXZlbiArIHN0cmlkZSArIFZSRUdfSU5UX0NPVU5UKTsKKyAgICAvKiBpbl9vZGRbMF0gLSAoKGluX2V2ZW5bMF0gKyBzMSArIDIpID4+IDIpOyAqLworICAgIGRjXzEgPSBTVUIoTE9BRFUoaW5fb2RkICsgVlJFR19JTlRfQ09VTlQpLAorICAgICAgICAgICAgICAgU0FSKEFERDMoTE9BRFUoaW5fZXZlbiArIFZSRUdfSU5UX0NPVU5UKSwgczFfMSwgdHdvKSwgMikpOworICAgIFNUT1JFKHRtcCArIFBBUkFMTEVMX0NPTFNfNTMgKiAwICsgVlJFR19JTlRfQ09VTlQsCisgICAgICAgICAgQUREKExPQURVKGluX2V2ZW4gKyBWUkVHX0lOVF9DT1VOVCksIGRjXzEpKTsKKworICAgIGZvciAoaSA9IDEsIGogPSAxOyBpIDwgKGxlbiAtIDIgLSAhKGxlbiAmIDEpKTsgaSArPSAyLCBqKyspIHsKKworICAgICAgICBzMl8wID0gTE9BRFUoaW5fZXZlbiArIChqICsgMSkgKiBzdHJpZGUpOworICAgICAgICBzMl8xID0gTE9BRFUoaW5fZXZlbiArIChqICsgMSkgKiBzdHJpZGUgKyBWUkVHX0lOVF9DT1VOVCk7CisKKyAgICAgICAgLyogZG4gPSBpbl9vZGRbaiAqIHN0cmlkZV0gLSAoKHMxICsgczIgKyAyKSA+PiAyKTsgKi8KKyAgICAgICAgZG5fMCA9IFNVQihMT0FEVShpbl9vZGQgKyBqICogc3RyaWRlKSwKKyAgICAgICAgICAgICAgICAgICBTQVIoQUREMyhzMV8wLCBzMl8wLCB0d28pLCAyKSk7CisgICAgICAgIGRuXzEgPSBTVUIoTE9BRFUoaW5fb2RkICsgaiAqIHN0cmlkZSArIFZSRUdfSU5UX0NPVU5UKSwKKyAgICAgICAgICAgICAgICAgICBTQVIoQUREMyhzMV8xLCBzMl8xLCB0d28pLCAyKSk7CisKKyAgICAgICAgU1RPUkUodG1wICsgUEFSQUxMRUxfQ09MU181MyAqIGksIGRjXzApOworICAgICAgICBTVE9SRSh0bXAgKyBQQVJBTExFTF9DT0xTXzUzICogaSArIFZSRUdfSU5UX0NPVU5ULCBkY18xKTsKKworICAgICAgICAvKiB0bXBbaSArIDFdID0gczEgKyAoKGRuICsgZGMpID4+IDEpOyAqLworICAgICAgICBTVE9SRSh0bXAgKyBQQVJBTExFTF9DT0xTXzUzICogKGkgKyAxKSArIDAsCisgICAgICAgICAgICAgIEFERChzMV8wLCBTQVIoQUREKGRuXzAsIGRjXzApLCAxKSkpOworICAgICAgICBTVE9SRSh0bXAgKyBQQVJBTExFTF9DT0xTXzUzICogKGkgKyAxKSArIFZSRUdfSU5UX0NPVU5ULAorICAgICAgICAgICAgICBBREQoczFfMSwgU0FSKEFERChkbl8xLCBkY18xKSwgMSkpKTsKKworICAgICAgICBkY18wID0gZG5fMDsKKyAgICAgICAgczFfMCA9IHMyXzA7CisgICAgICAgIGRjXzEgPSBkbl8xOworICAgICAgICBzMV8xID0gczJfMTsKKyAgICB9CisgICAgU1RPUkUodG1wICsgUEFSQUxMRUxfQ09MU181MyAqIGksIGRjXzApOworICAgIFNUT1JFKHRtcCArIFBBUkFMTEVMX0NPTFNfNTMgKiBpICsgVlJFR19JTlRfQ09VTlQsIGRjXzEpOworCisgICAgaWYgKCEobGVuICYgMSkpIHsKKyAgICAgICAgLypkbiA9IGluX29kZFsobGVuIC8gMiAtIDEpICogc3RyaWRlXSAtICgoczEgKyAxKSA+PiAxKTsgKi8KKyAgICAgICAgZG5fMCA9IFNVQihMT0FEVShpbl9vZGQgKyAoT1BKX1NJWkVfVCkobGVuIC8gMiAtIDEpICogc3RyaWRlKSwKKyAgICAgICAgICAgICAgICAgICBTQVIoQUREMyhzMV8wLCBzMV8wLCB0d28pLCAyKSk7CisgICAgICAgIGRuXzEgPSBTVUIoTE9BRFUoaW5fb2RkICsgKE9QSl9TSVpFX1QpKGxlbiAvIDIgLSAxKSAqIHN0cmlkZSArIFZSRUdfSU5UX0NPVU5UKSwKKyAgICAgICAgICAgICAgICAgICBTQVIoQUREMyhzMV8xLCBzMV8xLCB0d28pLCAyKSk7CisKKyAgICAgICAgLyogdG1wW2xlbiAtIDJdID0gczEgKyAoKGRuICsgZGMpID4+IDEpOyAqLworICAgICAgICBTVE9SRSh0bXAgKyBQQVJBTExFTF9DT0xTXzUzICogKGxlbiAtIDIpICsgMCwKKyAgICAgICAgICAgICAgQUREKHMxXzAsIFNBUihBREQoZG5fMCwgZGNfMCksIDEpKSk7CisgICAgICAgIFNUT1JFKHRtcCArIFBBUkFMTEVMX0NPTFNfNTMgKiAobGVuIC0gMikgKyBWUkVHX0lOVF9DT1VOVCwKKyAgICAgICAgICAgICAgQUREKHMxXzEsIFNBUihBREQoZG5fMSwgZGNfMSksIDEpKSk7CisKKyAgICAgICAgU1RPUkUodG1wICsgUEFSQUxMRUxfQ09MU181MyAqIChsZW4gLSAxKSArIDAsIGRuXzApOworICAgICAgICBTVE9SRSh0bXAgKyBQQVJBTExFTF9DT0xTXzUzICogKGxlbiAtIDEpICsgVlJFR19JTlRfQ09VTlQsIGRuXzEpOworICAgIH0gZWxzZSB7CisgICAgICAgIFNUT1JFKHRtcCArIFBBUkFMTEVMX0NPTFNfNTMgKiAobGVuIC0gMSkgKyAwLCBBREQoczFfMCwgZGNfMCkpOworICAgICAgICBTVE9SRSh0bXAgKyBQQVJBTExFTF9DT0xTXzUzICogKGxlbiAtIDEpICsgVlJFR19JTlRfQ09VTlQsCisgICAgICAgICAgICAgIEFERChzMV8xLCBkY18xKSk7CisgICAgfQorCisgICAgb3BqX2lkd3Q1M192X2ZpbmFsX21lbWNweSh0aWxlZHBfY29sLCB0bXAsIGxlbiwgc3RyaWRlKTsKK30KKworI3VuZGVmIFZSRUcKKyN1bmRlZiBMT0FEX0NTVAorI3VuZGVmIExPQURVCisjdW5kZWYgTE9BRAorI3VuZGVmIFNUT1JFCisjdW5kZWYgU1RPUkVVCisjdW5kZWYgQURECisjdW5kZWYgQUREMworI3VuZGVmIFNVQgorI3VuZGVmIFNBUgorCisjZW5kaWYgLyogKGRlZmluZWQoX19TU0UyX18pIHx8IGRlZmluZWQoX19BVlgyX18pKSAmJiAhZGVmaW5lZChTVEFOREFSRF9TTE9XX1ZFUlNJT04pICovCisKKyNpZiAhZGVmaW5lZChTVEFOREFSRF9TTE9XX1ZFUlNJT04pCisvKiogVmVydGljYWwgaW52ZXJzZSA1eDMgd2F2ZWxldCB0cmFuc2Zvcm0gZm9yIG9uZSBjb2x1bW4sIHdoZW4gdG9wLW1vc3QKKyAqIHBpeGVsIGlzIG9uIGV2ZW4gY29vcmRpbmF0ZSAqLworc3RhdGljIHZvaWQgb3BqX2lkd3QzX3ZfY2FzMChPUEpfSU5UMzIqIHRtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1BKX0lOVDMyIHNuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfSU5UMzIgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIqIHRpbGVkcF9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9QSl9TSVpFX1Qgc3RyaWRlKQoreworICAgIE9QSl9JTlQzMiBpLCBqOworICAgIE9QSl9JTlQzMiBkMWMsIGQxbiwgczFuLCBzMGMsIHMwbjsKKworICAgIGFzc2VydChsZW4gPiAxKTsKKworICAgIC8qIFBlcmZvcm1zIGxpZnRpbmcgaW4gb25lIHNpbmdsZSBpdGVyYXRpb24uIFNhdmVzIG1lbW9yeSAqLworICAgIC8qIGFjY2Vzc2VzIGFuZCBleHBsaWNpdCBpbnRlcmxlYXZpbmcuICovCisKKyAgICBzMW4gPSB0aWxlZHBfY29sWzBdOworICAgIGQxbiA9IHRpbGVkcF9jb2xbKE9QSl9TSVpFX1Qpc24gKiBzdHJpZGVdOworICAgIHMwbiA9IHMxbiAtICgoZDFuICsgMSkgPj4gMSk7CisKKyAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IChsZW4gLSAzKTsgaSArPSAyLCBqKyspIHsKKyAgICAgICAgZDFjID0gZDFuOworICAgICAgICBzMGMgPSBzMG47CisKKyAgICAgICAgczFuID0gdGlsZWRwX2NvbFsoT1BKX1NJWkVfVCkoaiArIDEpICogc3RyaWRlXTsKKyAgICAgICAgZDFuID0gdGlsZWRwX2NvbFsoT1BKX1NJWkVfVCkoc24gKyBqICsgMSkgKiBzdHJpZGVdOworCisgICAgICAgIHMwbiA9IHMxbiAtICgoZDFjICsgZDFuICsgMikgPj4gMik7CisKKyAgICAgICAgdG1wW2kgIF0gPSBzMGM7CisgICAgICAgIHRtcFtpICsgMV0gPSBkMWMgKyAoKHMwYyArIHMwbikgPj4gMSk7CisgICAgfQorCisgICAgdG1wW2ldID0gczBuOworCisgICAgaWYgKGxlbiAmIDEpIHsKKyAgICAgICAgdG1wW2xlbiAtIDFdID0KKyAgICAgICAgICAgIHRpbGVkcF9jb2xbKE9QSl9TSVpFX1QpKChsZW4gLSAxKSAvIDIpICogc3RyaWRlXSAtCisgICAgICAgICAgICAoKGQxbiArIDEpID4+IDEpOworICAgICAgICB0bXBbbGVuIC0gMl0gPSBkMW4gKyAoKHMwbiArIHRtcFtsZW4gLSAxXSkgPj4gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdG1wW2xlbiAtIDFdID0gZDFuICsgczBuOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICB0aWxlZHBfY29sWyhPUEpfU0laRV9UKWkgKiBzdHJpZGVdID0gdG1wW2ldOworICAgIH0KK30KKworCisvKiogVmVydGljYWwgaW52ZXJzZSA1eDMgd2F2ZWxldCB0cmFuc2Zvcm0gZm9yIG9uZSBjb2x1bW4sIHdoZW4gdG9wLW1vc3QKKyAqIHBpeGVsIGlzIG9uIG9kZCBjb29yZGluYXRlICovCitzdGF0aWMgdm9pZCBvcGpfaWR3dDNfdl9jYXMxKE9QSl9JTlQzMiogdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfSU5UMzIgc24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9QSl9JTlQzMiBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiogdGlsZWRwX2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1BKX1NJWkVfVCBzdHJpZGUpCit7CisgICAgT1BKX0lOVDMyIGksIGo7CisgICAgT1BKX0lOVDMyIHMxLCBzMiwgZGMsIGRuOworICAgIGNvbnN0IE9QSl9JTlQzMiogaW5fZXZlbiA9ICZ0aWxlZHBfY29sWyhPUEpfU0laRV9UKXNuICogc3RyaWRlXTsKKyAgICBjb25zdCBPUEpfSU5UMzIqIGluX29kZCA9ICZ0aWxlZHBfY29sWzBdOworCisgICAgYXNzZXJ0KGxlbiA+IDIpOworCisgICAgLyogUGVyZm9ybXMgbGlmdGluZyBpbiBvbmUgc2luZ2xlIGl0ZXJhdGlvbi4gU2F2ZXMgbWVtb3J5ICovCisgICAgLyogYWNjZXNzZXMgYW5kIGV4cGxpY2l0IGludGVybGVhdmluZy4gKi8KKworICAgIHMxID0gaW5fZXZlbltzdHJpZGVdOworICAgIGRjID0gaW5fb2RkWzBdIC0gKChpbl9ldmVuWzBdICsgczEgKyAyKSA+PiAyKTsKKyAgICB0bXBbMF0gPSBpbl9ldmVuWzBdICsgZGM7CisgICAgZm9yIChpID0gMSwgaiA9IDE7IGkgPCAobGVuIC0gMiAtICEobGVuICYgMSkpOyBpICs9IDIsIGorKykgeworCisgICAgICAgIHMyID0gaW5fZXZlblsoT1BKX1NJWkVfVCkoaiArIDEpICogc3RyaWRlXTsKKworICAgICAgICBkbiA9IGluX29kZFsoT1BKX1NJWkVfVClqICogc3RyaWRlXSAtICgoczEgKyBzMiArIDIpID4+IDIpOworICAgICAgICB0bXBbaSAgXSA9IGRjOworICAgICAgICB0bXBbaSArIDFdID0gczEgKyAoKGRuICsgZGMpID4+IDEpOworCisgICAgICAgIGRjID0gZG47CisgICAgICAgIHMxID0gczI7CisgICAgfQorICAgIHRtcFtpXSA9IGRjOworICAgIGlmICghKGxlbiAmIDEpKSB7CisgICAgICAgIGRuID0gaW5fb2RkWyhPUEpfU0laRV9UKShsZW4gLyAyIC0gMSkgKiBzdHJpZGVdIC0gKChzMSArIDEpID4+IDEpOworICAgICAgICB0bXBbbGVuIC0gMl0gPSBzMSArICgoZG4gKyBkYykgPj4gMSk7CisgICAgICAgIHRtcFtsZW4gLSAxXSA9IGRuOworICAgIH0gZWxzZSB7CisgICAgICAgIHRtcFtsZW4gLSAxXSA9IHMxICsgZGM7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgIHRpbGVkcF9jb2xbKE9QSl9TSVpFX1QpaSAqIHN0cmlkZV0gPSB0bXBbaV07CisgICAgfQorfQorI2VuZGlmIC8qICFkZWZpbmVkKFNUQU5EQVJEX1NMT1dfVkVSU0lPTikgKi8KKworLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBJbnZlcnNlIHZlcnRpY2FsIDUtMyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAxLUQgZm9yIHNldmVyYWwgY29sdW1ucy4gKi8KKy8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUGVyZm9ybXMgaW50ZXJsZWF2ZSwgaW52ZXJzZSB3YXZlbGV0IHRyYW5zZm9ybSBhbmQgY29weSBiYWNrIHRvIGJ1ZmZlciAqLworc3RhdGljIHZvaWQgb3BqX2lkd3Q1M192KGNvbnN0IG9wal9kd3RfdCAqZHd0LAorICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiogdGlsZWRwX2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfU0laRV9UIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgbmJfY29scykKK3sKKyNpZmRlZiBTVEFOREFSRF9TTE9XX1ZFUlNJT04KKyAgICAvKiBGb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3NlICovCisgICAgT1BKX0lOVDMyIGssIGM7CisgICAgZm9yIChjID0gMDsgYyA8IG5iX2NvbHM7IGMgKyspIHsKKyAgICAgICAgb3BqX2R3dF9pbnRlcmxlYXZlX3YoZHd0LCB0aWxlZHBfY29sICsgYywgc3RyaWRlKTsKKyAgICAgICAgb3BqX2R3dF9kZWNvZGVfMShkd3QpOworICAgICAgICBmb3IgKGsgPSAwOyBrIDwgZHd0LT5zbiArIGR3dC0+ZG47ICsraykgeworICAgICAgICAgICAgdGlsZWRwX2NvbFtjICsgayAqIHN0cmlkZV0gPSBkd3QtPm1lbVtrXTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgY29uc3QgT1BKX0lOVDMyIHNuID0gZHd0LT5zbjsKKyAgICBjb25zdCBPUEpfSU5UMzIgbGVuID0gc24gKyBkd3QtPmRuOworICAgIGlmIChkd3QtPmNhcyA9PSAwKSB7CisgICAgICAgIC8qIElmIGxlbiA9PSAxLCB1bm1vZGlmaWVkIHZhbHVlICovCisKKyNpZiAoZGVmaW5lZChfX1NTRTJfXykgfHwgZGVmaW5lZChfX0FWWDJfXykpCisgICAgICAgIGlmIChsZW4gPiAxICYmIG5iX2NvbHMgPT0gUEFSQUxMRUxfQ09MU181MykgeworICAgICAgICAgICAgLyogU2FtZSBhcyBiZWxvdyBnZW5lcmFsIGNhc2UsIGV4Y2VwdCB0aGF0IHRoYW5rcyB0byBTU0UyL0FWWDIgKi8KKyAgICAgICAgICAgIC8qIHdlIGNhbiBlZmZpY2VudGx5IHByb2Nlc3MgOC8xNiBjb2x1bW5zIGluIHBhcmFsbGVsICovCisgICAgICAgICAgICBvcGpfaWR3dDUzX3ZfY2FzMF9tY29sc19TU0UyX09SX0FWWDIoZHd0LT5tZW0sIHNuLCBsZW4sIHRpbGVkcF9jb2wsIHN0cmlkZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAobGVuID4gMSkgeworICAgICAgICAgICAgT1BKX0lOVDMyIGM7CisgICAgICAgICAgICBmb3IgKGMgPSAwOyBjIDwgbmJfY29sczsgYysrLCB0aWxlZHBfY29sKyspIHsKKyAgICAgICAgICAgICAgICBvcGpfaWR3dDNfdl9jYXMwKGR3dC0+bWVtLCBzbiwgbGVuLCB0aWxlZHBfY29sLCBzdHJpZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGxlbiA9PSAxKSB7CisgICAgICAgICAgICBPUEpfSU5UMzIgYzsKKyAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCBuYl9jb2xzOyBjKyssIHRpbGVkcF9jb2wrKykgeworICAgICAgICAgICAgICAgIHRpbGVkcF9jb2xbMF0gLz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsZW4gPT0gMikgeworICAgICAgICAgICAgT1BKX0lOVDMyIGM7CisgICAgICAgICAgICBPUEpfSU5UMzIqIG91dCA9IGR3dC0+bWVtOworICAgICAgICAgICAgZm9yIChjID0gMDsgYyA8IG5iX2NvbHM7IGMrKywgdGlsZWRwX2NvbCsrKSB7CisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIGk7CisgICAgICAgICAgICAgICAgY29uc3QgT1BKX0lOVDMyKiBpbl9ldmVuID0gJnRpbGVkcF9jb2xbKE9QSl9TSVpFX1Qpc24gKiBzdHJpZGVdOworICAgICAgICAgICAgICAgIGNvbnN0IE9QSl9JTlQzMiogaW5fb2RkID0gJnRpbGVkcF9jb2xbMF07CisKKyAgICAgICAgICAgICAgICBvdXRbMV0gPSBpbl9vZGRbMF0gLSAoKGluX2V2ZW5bMF0gKyAxKSA+PiAxKTsKKyAgICAgICAgICAgICAgICBvdXRbMF0gPSBpbl9ldmVuWzBdICsgb3V0WzFdOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkcF9jb2xbKE9QSl9TSVpFX1QpaSAqIHN0cmlkZV0gPSBvdXRbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworI2lmIChkZWZpbmVkKF9fU1NFMl9fKSB8fCBkZWZpbmVkKF9fQVZYMl9fKSkKKyAgICAgICAgaWYgKGxlbiA+IDIgJiYgbmJfY29scyA9PSBQQVJBTExFTF9DT0xTXzUzKSB7CisgICAgICAgICAgICAvKiBTYW1lIGFzIGJlbG93IGdlbmVyYWwgY2FzZSwgZXhjZXB0IHRoYXQgdGhhbmtzIHRvIFNTRTIvQVZYMiAqLworICAgICAgICAgICAgLyogd2UgY2FuIGVmZmljZW50bHkgcHJvY2VzcyA4LzE2IGNvbHVtbnMgaW4gcGFyYWxsZWwgKi8KKyAgICAgICAgICAgIG9wal9pZHd0NTNfdl9jYXMxX21jb2xzX1NTRTJfT1JfQVZYMihkd3QtPm1lbSwgc24sIGxlbiwgdGlsZWRwX2NvbCwgc3RyaWRlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmIChsZW4gPiAyKSB7CisgICAgICAgICAgICBPUEpfSU5UMzIgYzsKKyAgICAgICAgICAgIGZvciAoYyA9IDA7IGMgPCBuYl9jb2xzOyBjKyssIHRpbGVkcF9jb2wrKykgeworICAgICAgICAgICAgICAgIG9wal9pZHd0M192X2NhczEoZHd0LT5tZW0sIHNuLCBsZW4sIHRpbGVkcF9jb2wsIHN0cmlkZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKK30KKworCiAvKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGb3J3YXJkIDktNyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAxLUQuICovCiAvKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1zdGF0aWMgdm9pZCBvcGpfZHd0X2VuY29kZV8xX3JlYWwoT1BKX0lOVDMyICphLCBPUEpfU0laRV9UIGFfY291bnQsIE9QSl9JTlQzMiBkbiwgT1BKX0lOVDMyIHNuLCBPUEpfSU5UMzIgY2FzKSB7Ci0JT1BKX0lOVDMyIGk7Ci0JaWYgKCFjYXMpIHsKLQkJaWYgKChkbiA+IDApIHx8IChzbiA+IDEpKSB7CS8qIE5FVyA6ICBDQVNFIE9ORSBFTEVNRU5UICovCi0JCQlmb3IgKGkgPSAwOyBpIDwgZG47IGkrKykKLQkJCQlPUEpfRChpKSAtPSBvcGpfaW50X2ZpeF9tdWwoT1BKX1NfKGkpICsgT1BKX1NfKGkgKyAxKSwgMTI5OTMpOwotCQkJZm9yIChpID0gMDsgaSA8IHNuOyBpKyspCi0JCQkJT1BKX1MoaSkgLT0gb3BqX2ludF9maXhfbXVsKE9QSl9EXyhpIC0gMSkgKyBPUEpfRF8oaSksIDQzNCk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgZG47IGkrKykKLQkJCQlPUEpfRChpKSArPSBvcGpfaW50X2ZpeF9tdWwoT1BKX1NfKGkpICsgT1BKX1NfKGkgKyAxKSwgNzIzMyk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgc247IGkrKykKLQkJCQlPUEpfUyhpKSArPSBvcGpfaW50X2ZpeF9tdWwoT1BKX0RfKGkgLSAxKSArIE9QSl9EXyhpKSwgMzYzMyk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgZG47IGkrKykKLQkJCQlPUEpfRChpKSA9IG9wal9pbnRfZml4X211bChPUEpfRChpKSwgNTAzOCk7CS8qNTAzOCAqLwotCQkJZm9yIChpID0gMDsgaSA8IHNuOyBpKyspCi0JCQkJT1BKX1MoaSkgPSBvcGpfaW50X2ZpeF9tdWwoT1BKX1MoaSksIDY2NTkpOwkvKjY2NjAgKi8KLQkJfQotCX0gZWxzZSB7Ci0JCWlmICgoc24gPiAwKSB8fCAoZG4gPiAxKSkgewkvKiBORVcgOiAgQ0FTRSBPTkUgRUxFTUVOVCAqLwotCQkJZm9yIChpID0gMDsgaSA8IGRuOyBpKyspCi0JCQkJT1BKX1MoaSkgLT0gb3BqX2ludF9maXhfbXVsKE9QSl9ERF8oaSkgKyBPUEpfRERfKGkgLSAxKSwgMTI5OTMpOwotCQkJZm9yIChpID0gMDsgaSA8IHNuOyBpKyspCi0JCQkJT1BKX0QoaSkgLT0gb3BqX2ludF9maXhfbXVsKE9QSl9TU18oaSkgKyBPUEpfU1NfKGkgKyAxKSwgNDM0KTsKLQkJCWZvciAoaSA9IDA7IGkgPCBkbjsgaSsrKQotCQkJCU9QSl9TKGkpICs9IG9wal9pbnRfZml4X211bChPUEpfRERfKGkpICsgT1BKX0REXyhpIC0gMSksIDcyMzMpOwotCQkJZm9yIChpID0gMDsgaSA8IHNuOyBpKyspCi0JCQkJT1BKX0QoaSkgKz0gb3BqX2ludF9maXhfbXVsKE9QSl9TU18oaSkgKyBPUEpfU1NfKGkgKyAxKSwgMzYzMyk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgZG47IGkrKykKLQkJCQlPUEpfUyhpKSA9IG9wal9pbnRfZml4X211bChPUEpfUyhpKSwgNTAzOCk7CS8qNTAzOCAqLwotCQkJZm9yIChpID0gMDsgaSA8IHNuOyBpKyspCi0JCQkJT1BKX0QoaSkgPSBvcGpfaW50X2ZpeF9tdWwoT1BKX0QoaSksIDY2NTkpOwkvKjY2NjAgKi8KLQkJfQotCX0KK3N0YXRpYyB2b2lkIG9wal9kd3RfZW5jb2RlXzFfcmVhbChPUEpfSU5UMzIgKmEsIE9QSl9TSVpFX1QgYV9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwgT1BKX0lOVDMyIGNhcykKK3sKKyAgICBPUEpfSU5UMzIgaTsKKyAgICBpZiAoIWNhcykgeworICAgICAgICBpZiAoKGRuID4gMCkgfHwgKHNuID4gMSkpIHsgLyogTkVXIDogIENBU0UgT05FIEVMRU1FTlQgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgT1BKX0QoaSkgLT0gb3BqX2ludF9maXhfbXVsKE9QSl9TXyhpKSArIE9QSl9TXyhpICsgMSksIDEyOTkzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgT1BKX1MoaSkgLT0gb3BqX2ludF9maXhfbXVsKE9QSl9EXyhpIC0gMSkgKyBPUEpfRF8oaSksIDQzNCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZG47IGkrKykgeworICAgICAgICAgICAgICAgIE9QSl9EKGkpICs9IG9wal9pbnRfZml4X211bChPUEpfU18oaSkgKyBPUEpfU18oaSArIDEpLCA3MjMzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgT1BKX1MoaSkgKz0gb3BqX2ludF9maXhfbXVsKE9QSl9EXyhpIC0gMSkgKyBPUEpfRF8oaSksIDM2MzMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBPUEpfRChpKSA9IG9wal9pbnRfZml4X211bChPUEpfRChpKSwgNTAzOCk7ICAgIC8qNTAzOCAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBPUEpfUyhpKSA9IG9wal9pbnRfZml4X211bChPUEpfUyhpKSwgNjY1OSk7ICAgIC8qNjY2MCAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChzbiA+IDApIHx8IChkbiA+IDEpKSB7IC8qIE5FVyA6ICBDQVNFIE9ORSBFTEVNRU5UICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZG47IGkrKykgeworICAgICAgICAgICAgICAgIE9QSl9TKGkpIC09IG9wal9pbnRfZml4X211bChPUEpfRERfKGkpICsgT1BKX0REXyhpIC0gMSksIDEyOTkzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgT1BKX0QoaSkgLT0gb3BqX2ludF9maXhfbXVsKE9QSl9TU18oaSkgKyBPUEpfU1NfKGkgKyAxKSwgNDM0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgT1BKX1MoaSkgKz0gb3BqX2ludF9maXhfbXVsKE9QSl9ERF8oaSkgKyBPUEpfRERfKGkgLSAxKSwgNzIzMyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc247IGkrKykgeworICAgICAgICAgICAgICAgIE9QSl9EKGkpICs9IG9wal9pbnRfZml4X211bChPUEpfU1NfKGkpICsgT1BKX1NTXyhpICsgMSksIDM2MzMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGRuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBPUEpfUyhpKSA9IG9wal9pbnRfZml4X211bChPUEpfUyhpKSwgNTAzOCk7ICAgIC8qNTAzOCAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBPUEpfRChpKSA9IG9wal9pbnRfZml4X211bChPUEpfRChpKSwgNjY1OSk7ICAgIC8qNjY2MCAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQogCi1zdGF0aWMgdm9pZCBvcGpfZHd0X2VuY29kZV9zdGVwc2l6ZShPUEpfSU5UMzIgc3RlcHNpemUsIE9QSl9JTlQzMiBudW1icHMsIG9wal9zdGVwc2l6ZV90ICpiYW5kbm9fc3RlcHNpemUpIHsKLQlPUEpfSU5UMzIgcCwgbjsKLQlwID0gb3BqX2ludF9mbG9vcmxvZzIoc3RlcHNpemUpIC0gMTM7Ci0JbiA9IDExIC0gb3BqX2ludF9mbG9vcmxvZzIoc3RlcHNpemUpOwotCWJhbmRub19zdGVwc2l6ZS0+bWFudCA9IChuIDwgMCA/IHN0ZXBzaXplID4+IC1uIDogc3RlcHNpemUgPDwgbikgJiAweDdmZjsKLQliYW5kbm9fc3RlcHNpemUtPmV4cG4gPSBudW1icHMgLSBwOworc3RhdGljIHZvaWQgb3BqX2R3dF9lbmNvZGVfc3RlcHNpemUoT1BKX0lOVDMyIHN0ZXBzaXplLCBPUEpfSU5UMzIgbnVtYnBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0ZXBzaXplX3QgKmJhbmRub19zdGVwc2l6ZSkKK3sKKyAgICBPUEpfSU5UMzIgcCwgbjsKKyAgICBwID0gb3BqX2ludF9mbG9vcmxvZzIoc3RlcHNpemUpIC0gMTM7CisgICAgbiA9IDExIC0gb3BqX2ludF9mbG9vcmxvZzIoc3RlcHNpemUpOworICAgIGJhbmRub19zdGVwc2l6ZS0+bWFudCA9IChuIDwgMCA/IHN0ZXBzaXplID4+IC1uIDogc3RlcHNpemUgPDwgbikgJiAweDdmZjsKKyAgICBiYW5kbm9fc3RlcHNpemUtPmV4cG4gPSBudW1icHMgLSBwOwogfQogCi0vKiAKKy8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBEV1QgaW50ZXJmYWNlCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0zOTAsMTE1ICsxMTEzLDE0MyBAQAogLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGb3J3YXJkIDUtMyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAyLUQuICovCiAvKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXN0YXRpYyBJTkxJTkUgT1BKX0JPT0wgb3BqX2R3dF9lbmNvZGVfcHJvY2VkdXJlKGNvbnN0IG9wal90Y2RfdGlsZWNvbXBfdCAqIHRpbGVjLCB2b2lkKCpwX2Z1bmN0aW9uKShPUEpfSU5UMzIgKiwgT1BKX1NJWkVfVCwgT1BKX0lOVDMyLCBPUEpfSU5UMzIsIE9QSl9JTlQzMikpCitzdGF0aWMgSU5MSU5FIE9QSl9CT09MIG9wal9kd3RfZW5jb2RlX3Byb2NlZHVyZShjb25zdCBvcGpfdGNkX3RpbGVjb21wX3QgKiB0aWxlYywKKyAgICAgICAgdm9pZCgqcF9mdW5jdGlvbikoT1BKX0lOVDMyICosIE9QSl9TSVpFX1QsIE9QSl9JTlQzMiwgT1BKX0lOVDMyLCBPUEpfSU5UMzIpKQogewotCU9QSl9JTlQzMiBpLCBqLCBrOwotCU9QSl9JTlQzMiAqYSA9IDAwOwotCU9QSl9JTlQzMiAqYWogPSAwMDsKLQlPUEpfSU5UMzIgKmJqID0gMDA7Ci0JT1BKX0lOVDMyIHcsIGw7CisgICAgT1BKX0lOVDMyIGksIGosIGs7CisgICAgT1BKX0lOVDMyICphID0gMDA7CisgICAgT1BKX0lOVDMyICphaiA9IDAwOworICAgIE9QSl9JTlQzMiAqYmogPSAwMDsKKyAgICBPUEpfSU5UMzIgdywgbDsKIAotCU9QSl9JTlQzMiBydzsJCQkvKiB3aWR0aCBvZiB0aGUgcmVzb2x1dGlvbiBsZXZlbCBjb21wdXRlZCAgICovCi0JT1BKX0lOVDMyIHJoOwkJCS8qIGhlaWdodCBvZiB0aGUgcmVzb2x1dGlvbiBsZXZlbCBjb21wdXRlZCAgKi8KLQlPUEpfU0laRV9UIGxfZGF0YV9jb3VudDsKLQlPUEpfU0laRV9UIGxfZGF0YV9zaXplOworICAgIE9QSl9JTlQzMiBydzsgICAgICAgICAgIC8qIHdpZHRoIG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIGNvbXB1dGVkICAgKi8KKyAgICBPUEpfSU5UMzIgcmg7ICAgICAgICAgICAvKiBoZWlnaHQgb2YgdGhlIHJlc29sdXRpb24gbGV2ZWwgY29tcHV0ZWQgICovCisgICAgT1BKX1NJWkVfVCBsX2RhdGFfY291bnQ7CisgICAgT1BKX1NJWkVfVCBsX2RhdGFfc2l6ZTsKIAotCW9wal90Y2RfcmVzb2x1dGlvbl90ICogbF9jdXJfcmVzID0gMDsKLQlvcGpfdGNkX3Jlc29sdXRpb25fdCAqIGxfbGFzdF9yZXMgPSAwOworICAgIG9wal90Y2RfcmVzb2x1dGlvbl90ICogbF9jdXJfcmVzID0gMDsKKyAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCAqIGxfbGFzdF9yZXMgPSAwOwogCi0JdyA9IHRpbGVjLT54MS10aWxlYy0+eDA7Ci0JbCA9IChPUEpfSU5UMzIpdGlsZWMtPm51bXJlc29sdXRpb25zLTE7Ci0JYSA9IHRpbGVjLT5kYXRhOworICAgIHcgPSB0aWxlYy0+eDEgLSB0aWxlYy0+eDA7CisgICAgbCA9IChPUEpfSU5UMzIpdGlsZWMtPm51bXJlc29sdXRpb25zIC0gMTsKKyAgICBhID0gdGlsZWMtPmRhdGE7CiAKLQlsX2N1cl9yZXMgPSB0aWxlYy0+cmVzb2x1dGlvbnMgKyBsOwotCWxfbGFzdF9yZXMgPSBsX2N1cl9yZXMgLSAxOworICAgIGxfY3VyX3JlcyA9IHRpbGVjLT5yZXNvbHV0aW9ucyArIGw7CisgICAgbF9sYXN0X3JlcyA9IGxfY3VyX3JlcyAtIDE7CiAKLQlsX2RhdGFfY291bnQgPSBvcGpfZHd0X21heF9yZXNvbHV0aW9uKHRpbGVjLT5yZXNvbHV0aW9ucywgdGlsZWMtPm51bXJlc29sdXRpb25zKSAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfSU5UMzIpOwotCWxfZGF0YV9zaXplID0gbF9kYXRhX2NvdW50ICogKE9QSl9VSU5UMzIpc2l6ZW9mKE9QSl9JTlQzMik7Ci0JYmogPSAoT1BKX0lOVDMyKilvcGpfbWFsbG9jKGxfZGF0YV9zaXplKTsKLQlpZiAoISBiaikgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQlpID0gbDsKKyAgICBsX2RhdGFfY291bnQgPSBvcGpfZHd0X21heF9yZXNvbHV0aW9uKHRpbGVjLT5yZXNvbHV0aW9ucywgdGlsZWMtPm51bXJlc29sdXRpb25zKTsKKyAgICAvKiBvdmVyZmxvdyBjaGVjayAqLworICAgIGlmIChsX2RhdGFfY291bnQgPiAoU0laRV9NQVggLyBzaXplb2YoT1BKX0lOVDMyKSkpIHsKKyAgICAgICAgLyogRklYTUUgZXZlbnQgbWFuYWdlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICBsX2RhdGFfc2l6ZSA9IGxfZGF0YV9jb3VudCAqIHNpemVvZihPUEpfSU5UMzIpOworICAgIGJqID0gKE9QSl9JTlQzMiopb3BqX21hbGxvYyhsX2RhdGFfc2l6ZSk7CisgICAgLyogbF9kYXRhX3NpemUgaXMgZXF1YWwgdG8gMCB3aGVuIG51bXJlc29sdXRpb25zID09IDEgYnV0IGJqIGlzIG5vdCB1c2VkICovCisgICAgLyogaW4gdGhhdCBjYXNlLCBzbyBkbyBub3QgZXJyb3Igb3V0ICovCisgICAgaWYgKGxfZGF0YV9zaXplICE9IDAgJiYgISBiaikgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICBpID0gbDsKIAotCXdoaWxlIChpLS0pIHsKLQkJT1BKX0lOVDMyIHJ3MTsJCS8qIHdpZHRoIG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIG9uY2UgbG93ZXIgdGhhbiBjb21wdXRlZCBvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCQlPUEpfSU5UMzIgcmgxOwkJLyogaGVpZ2h0IG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIG9uY2UgbG93ZXIgdGhhbiBjb21wdXRlZCBvbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0JCU9QSl9JTlQzMiBjYXNfY29sOwkvKiAwID0gbm9uIGludmVyc2lvbiBvbiBob3Jpem9udGFsIGZpbHRlcmluZyAxID0gaW52ZXJzaW9uIGJldHdlZW4gbG93LXBhc3MgYW5kIGhpZ2gtcGFzcyBmaWx0ZXJpbmcgKi8KLQkJT1BKX0lOVDMyIGNhc19yb3c7CS8qIDAgPSBub24gaW52ZXJzaW9uIG9uIHZlcnRpY2FsIGZpbHRlcmluZyAxID0gaW52ZXJzaW9uIGJldHdlZW4gbG93LXBhc3MgYW5kIGhpZ2gtcGFzcyBmaWx0ZXJpbmcgICAqLwotCQlPUEpfSU5UMzIgZG4sIHNuOworICAgIHdoaWxlIChpLS0pIHsKKyAgICAgICAgT1BKX0lOVDMyIHJ3MTsgICAgICAvKiB3aWR0aCBvZiB0aGUgcmVzb2x1dGlvbiBsZXZlbCBvbmNlIGxvd2VyIHRoYW4gY29tcHV0ZWQgb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgT1BKX0lOVDMyIHJoMTsgICAgICAvKiBoZWlnaHQgb2YgdGhlIHJlc29sdXRpb24gbGV2ZWwgb25jZSBsb3dlciB0aGFuIGNvbXB1dGVkIG9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgT1BKX0lOVDMyIGNhc19jb2w7ICAvKiAwID0gbm9uIGludmVyc2lvbiBvbiBob3Jpem9udGFsIGZpbHRlcmluZyAxID0gaW52ZXJzaW9uIGJldHdlZW4gbG93LXBhc3MgYW5kIGhpZ2gtcGFzcyBmaWx0ZXJpbmcgKi8KKyAgICAgICAgT1BKX0lOVDMyIGNhc19yb3c7ICAvKiAwID0gbm9uIGludmVyc2lvbiBvbiB2ZXJ0aWNhbCBmaWx0ZXJpbmcgMSA9IGludmVyc2lvbiBiZXR3ZWVuIGxvdy1wYXNzIGFuZCBoaWdoLXBhc3MgZmlsdGVyaW5nICAgKi8KKyAgICAgICAgT1BKX0lOVDMyIGRuLCBzbjsKIAotCQlydyAgPSBsX2N1cl9yZXMtPngxIC0gbF9jdXJfcmVzLT54MDsKLQkJcmggID0gbF9jdXJfcmVzLT55MSAtIGxfY3VyX3Jlcy0+eTA7Ci0JCXJ3MSA9IGxfbGFzdF9yZXMtPngxIC0gbF9sYXN0X3Jlcy0+eDA7Ci0JCXJoMSA9IGxfbGFzdF9yZXMtPnkxIC0gbF9sYXN0X3Jlcy0+eTA7CisgICAgICAgIHJ3ICA9IGxfY3VyX3Jlcy0+eDEgLSBsX2N1cl9yZXMtPngwOworICAgICAgICByaCAgPSBsX2N1cl9yZXMtPnkxIC0gbF9jdXJfcmVzLT55MDsKKyAgICAgICAgcncxID0gbF9sYXN0X3Jlcy0+eDEgLSBsX2xhc3RfcmVzLT54MDsKKyAgICAgICAgcmgxID0gbF9sYXN0X3Jlcy0+eTEgLSBsX2xhc3RfcmVzLT55MDsKIAotCQljYXNfcm93ID0gbF9jdXJfcmVzLT54MCAmIDE7Ci0JCWNhc19jb2wgPSBsX2N1cl9yZXMtPnkwICYgMTsKKyAgICAgICAgY2FzX3JvdyA9IGxfY3VyX3Jlcy0+eDAgJiAxOworICAgICAgICBjYXNfY29sID0gbF9jdXJfcmVzLT55MCAmIDE7CiAKLQkJc24gPSByaDE7Ci0JCWRuID0gcmggLSByaDE7Ci0JCWZvciAoaiA9IDA7IGogPCBydzsgKytqKSB7Ci0JCQlhaiA9IGEgKyBqOwotCQkJZm9yIChrID0gMDsgayA8IHJoOyArK2spIHsKLQkJCQlialtrXSA9IGFqW2sqd107Ci0JCQl9CisgICAgICAgIHNuID0gcmgxOworICAgICAgICBkbiA9IHJoIC0gcmgxOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcnc7ICsraikgeworICAgICAgICAgICAgYWogPSBhICsgajsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCByaDsgKytrKSB7CisgICAgICAgICAgICAgICAgYmpba10gPSBhaltrICogd107CisgICAgICAgICAgICB9CiAKLQkJCSgqcF9mdW5jdGlvbikgKGJqLCBsX2RhdGFfY291bnQsIGRuLCBzbiwgY2FzX2NvbCk7CisgICAgICAgICAgICAoKnBfZnVuY3Rpb24pIChiaiwgbF9kYXRhX2NvdW50LCBkbiwgc24sIGNhc19jb2wpOwogCi0JCQlvcGpfZHd0X2RlaW50ZXJsZWF2ZV92KGJqLCBhaiwgZG4sIHNuLCB3LCBjYXNfY29sKTsKLQkJfQorICAgICAgICAgICAgb3BqX2R3dF9kZWludGVybGVhdmVfdihiaiwgYWosIGRuLCBzbiwgdywgY2FzX2NvbCk7CisgICAgICAgIH0KIAotCQlzbiA9IHJ3MTsKLQkJZG4gPSBydyAtIHJ3MTsKKyAgICAgICAgc24gPSBydzE7CisgICAgICAgIGRuID0gcncgLSBydzE7CiAKLQkJZm9yIChqID0gMDsgaiA8IHJoOyBqKyspIHsKLQkJCWFqID0gYSArIGogKiB3OwotCQkJZm9yIChrID0gMDsgayA8IHJ3OyBrKyspICBialtrXSA9IGFqW2tdOwotCQkJKCpwX2Z1bmN0aW9uKSAoYmosIGxfZGF0YV9jb3VudCwgZG4sIHNuLCBjYXNfcm93KTsKLQkJCW9wal9kd3RfZGVpbnRlcmxlYXZlX2goYmosIGFqLCBkbiwgc24sIGNhc19yb3cpOwotCQl9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCByaDsgaisrKSB7CisgICAgICAgICAgICBhaiA9IGEgKyBqICogdzsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBydzsgaysrKSB7CisgICAgICAgICAgICAgICAgYmpba10gPSBhaltrXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqcF9mdW5jdGlvbikgKGJqLCBsX2RhdGFfY291bnQsIGRuLCBzbiwgY2FzX3Jvdyk7CisgICAgICAgICAgICBvcGpfZHd0X2RlaW50ZXJsZWF2ZV9oKGJqLCBhaiwgZG4sIHNuLCBjYXNfcm93KTsKKyAgICAgICAgfQogCi0JCWxfY3VyX3JlcyA9IGxfbGFzdF9yZXM7CisgICAgICAgIGxfY3VyX3JlcyA9IGxfbGFzdF9yZXM7CiAKLQkJLS1sX2xhc3RfcmVzOwotCX0KKyAgICAgICAgLS1sX2xhc3RfcmVzOworICAgIH0KIAotCW9wal9mcmVlKGJqKTsKLQlyZXR1cm4gT1BKX1RSVUU7CisgICAgb3BqX2ZyZWUoYmopOworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAogLyogRm9yd2FyZCA1LTMgd2F2ZWxldCB0cmFuc2Zvcm0gaW4gMi1ELiAqLwogLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiBPUEpfQk9PTCBvcGpfZHd0X2VuY29kZShvcGpfdGNkX3RpbGVjb21wX3QgKiB0aWxlYykKIHsKLQlyZXR1cm4gb3BqX2R3dF9lbmNvZGVfcHJvY2VkdXJlKHRpbGVjLG9wal9kd3RfZW5jb2RlXzEpOworICAgIHJldHVybiBvcGpfZHd0X2VuY29kZV9wcm9jZWR1cmUodGlsZWMsIG9wal9kd3RfZW5jb2RlXzEpOwogfQogCiAvKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEludmVyc2UgNS0zIHdhdmVsZXQgdHJhbnNmb3JtIGluIDItRC4gKi8KIC8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotT1BKX0JPT0wgb3BqX2R3dF9kZWNvZGUob3BqX3RjZF90aWxlY29tcF90KiB0aWxlYywgT1BKX1VJTlQzMiBudW1yZXMpIHsKLQlyZXR1cm4gb3BqX2R3dF9kZWNvZGVfdGlsZSh0aWxlYywgbnVtcmVzLCAmb3BqX2R3dF9kZWNvZGVfMSk7CitPUEpfQk9PTCBvcGpfZHd0X2RlY29kZShvcGpfdGNkX3QgKnBfdGNkLCBvcGpfdGNkX3RpbGVjb21wX3QqIHRpbGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBudW1yZXMpCit7CisgICAgaWYgKHBfdGNkLT53aG9sZV90aWxlX2RlY29kaW5nKSB7CisgICAgICAgIHJldHVybiBvcGpfZHd0X2RlY29kZV90aWxlKHBfdGNkLT50aHJlYWRfcG9vbCwgdGlsZWMsIG51bXJlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG9wal9kd3RfZGVjb2RlX3BhcnRpYWxfdGlsZSh0aWxlYywgbnVtcmVzKTsKKyAgICB9CiB9CiAKIAogLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogR2V0IGdhaW4gb2YgNS0zIHdhdmVsZXQgdHJhbnNmb3JtLiAqLwogLyogPC9zdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotT1BKX1VJTlQzMiBvcGpfZHd0X2dldGdhaW4oT1BKX1VJTlQzMiBvcmllbnQpIHsKLQlpZiAob3JpZW50ID09IDApCi0JCXJldHVybiAwOwotCWlmIChvcmllbnQgPT0gMSB8fCBvcmllbnQgPT0gMikKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDI7CitPUEpfVUlOVDMyIG9wal9kd3RfZ2V0Z2FpbihPUEpfVUlOVDMyIG9yaWVudCkKK3sKKyAgICBpZiAob3JpZW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChvcmllbnQgPT0gMSB8fCBvcmllbnQgPT0gMikgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDI7CiB9CiAKIC8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAqLwogLyogR2V0IG5vcm0gb2YgNS0zIHdhdmVsZXQuICovCiAvKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgKi8KLU9QSl9GTE9BVDY0IG9wal9kd3RfZ2V0bm9ybShPUEpfVUlOVDMyIGxldmVsLCBPUEpfVUlOVDMyIG9yaWVudCkgewotCXJldHVybiBvcGpfZHd0X25vcm1zW29yaWVudF1bbGV2ZWxdOworT1BKX0ZMT0FUNjQgb3BqX2R3dF9nZXRub3JtKE9QSl9VSU5UMzIgbGV2ZWwsIE9QSl9VSU5UMzIgb3JpZW50KQoreworICAgIC8qIEZJWE1FICEgVGhpcyBpcyBqdXN0IGEgYmFuZC1haWQgdG8gYXZvaWQgYSBidWZmZXIgb3ZlcmZsb3cgKi8KKyAgICAvKiBidXQgdGhlIGFycmF5IHNob3VsZCByZWFsbHkgYmUgZXh0ZW5kZWQgdXAgdG8gMzMgcmVzb2x1dGlvbiBsZXZlbHMgKi8KKyAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3VjbG91dmFpbi9vcGVuanBlZy9pc3N1ZXMvNDkzICovCisgICAgaWYgKG9yaWVudCA9PSAwICYmIGxldmVsID49IDEwKSB7CisgICAgICAgIGxldmVsID0gOTsKKyAgICB9IGVsc2UgaWYgKG9yaWVudCA+IDAgJiYgbGV2ZWwgPj0gOSkgeworICAgICAgICBsZXZlbCA9IDg7CisgICAgfQorICAgIHJldHVybiBvcGpfZHd0X25vcm1zW29yaWVudF1bbGV2ZWxdOwogfQogCiAvKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01MDYsMjk3ICsxMjU3LDExOTQgQEAKIC8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIE9QSl9CT09MIG9wal9kd3RfZW5jb2RlX3JlYWwob3BqX3RjZF90aWxlY29tcF90ICogdGlsZWMpCiB7Ci0JcmV0dXJuIG9wal9kd3RfZW5jb2RlX3Byb2NlZHVyZSh0aWxlYyxvcGpfZHd0X2VuY29kZV8xX3JlYWwpOworICAgIHJldHVybiBvcGpfZHd0X2VuY29kZV9wcm9jZWR1cmUodGlsZWMsIG9wal9kd3RfZW5jb2RlXzFfcmVhbCk7CiB9CiAKIC8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEdldCBnYWluIG9mIDktNyB3YXZlbGV0IHRyYW5zZm9ybS4gKi8KIC8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLU9QSl9VSU5UMzIgb3BqX2R3dF9nZXRnYWluX3JlYWwoT1BKX1VJTlQzMiBvcmllbnQpIHsKLQkodm9pZClvcmllbnQ7Ci0JcmV0dXJuIDA7CitPUEpfVUlOVDMyIG9wal9kd3RfZ2V0Z2Fpbl9yZWFsKE9QSl9VSU5UMzIgb3JpZW50KQoreworICAgICh2b2lkKW9yaWVudDsKKyAgICByZXR1cm4gMDsKIH0KIAogLyogPHN1bW1hcnk+ICAgICAgICAgICAgICAgICovCiAvKiBHZXQgbm9ybSBvZiA5LTcgd2F2ZWxldC4gKi8KIC8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAqLwotT1BKX0ZMT0FUNjQgb3BqX2R3dF9nZXRub3JtX3JlYWwoT1BKX1VJTlQzMiBsZXZlbCwgT1BKX1VJTlQzMiBvcmllbnQpIHsKLQlyZXR1cm4gb3BqX2R3dF9ub3Jtc19yZWFsW29yaWVudF1bbGV2ZWxdOworT1BKX0ZMT0FUNjQgb3BqX2R3dF9nZXRub3JtX3JlYWwoT1BKX1VJTlQzMiBsZXZlbCwgT1BKX1VJTlQzMiBvcmllbnQpCit7CisgICAgLyogRklYTUUgISBUaGlzIGlzIGp1c3QgYSBiYW5kLWFpZCB0byBhdm9pZCBhIGJ1ZmZlciBvdmVyZmxvdyAqLworICAgIC8qIGJ1dCB0aGUgYXJyYXkgc2hvdWxkIHJlYWxseSBiZSBleHRlbmRlZCB1cCB0byAzMyByZXNvbHV0aW9uIGxldmVscyAqLworICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdWNsb3V2YWluL29wZW5qcGVnL2lzc3Vlcy80OTMgKi8KKyAgICBpZiAob3JpZW50ID09IDAgJiYgbGV2ZWwgPj0gMTApIHsKKyAgICAgICAgbGV2ZWwgPSA5OworICAgIH0gZWxzZSBpZiAob3JpZW50ID4gMCAmJiBsZXZlbCA+PSA5KSB7CisgICAgICAgIGxldmVsID0gODsKKyAgICB9CisgICAgcmV0dXJuIG9wal9kd3Rfbm9ybXNfcmVhbFtvcmllbnRdW2xldmVsXTsKIH0KIAotdm9pZCBvcGpfZHd0X2NhbGNfZXhwbGljaXRfc3RlcHNpemVzKG9wal90Y2NwX3QgKiB0Y2NwLCBPUEpfVUlOVDMyIHByZWMpIHsKLQlPUEpfVUlOVDMyIG51bWJhbmRzLCBiYW5kbm87Ci0JbnVtYmFuZHMgPSAzICogdGNjcC0+bnVtcmVzb2x1dGlvbnMgLSAyOwotCWZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgbnVtYmFuZHM7IGJhbmRubysrKSB7Ci0JCU9QSl9GTE9BVDY0IHN0ZXBzaXplOwotCQlPUEpfVUlOVDMyIHJlc25vLCBsZXZlbCwgb3JpZW50LCBnYWluOwordm9pZCBvcGpfZHd0X2NhbGNfZXhwbGljaXRfc3RlcHNpemVzKG9wal90Y2NwX3QgKiB0Y2NwLCBPUEpfVUlOVDMyIHByZWMpCit7CisgICAgT1BKX1VJTlQzMiBudW1iYW5kcywgYmFuZG5vOworICAgIG51bWJhbmRzID0gMyAqIHRjY3AtPm51bXJlc29sdXRpb25zIC0gMjsKKyAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IG51bWJhbmRzOyBiYW5kbm8rKykgeworICAgICAgICBPUEpfRkxPQVQ2NCBzdGVwc2l6ZTsKKyAgICAgICAgT1BKX1VJTlQzMiByZXNubywgbGV2ZWwsIG9yaWVudCwgZ2FpbjsKIAotCQlyZXNubyA9IChiYW5kbm8gPT0gMCkgPyAwIDogKChiYW5kbm8gLSAxKSAvIDMgKyAxKTsKLQkJb3JpZW50ID0gKGJhbmRubyA9PSAwKSA/IDAgOiAoKGJhbmRubyAtIDEpICUgMyArIDEpOwotCQlsZXZlbCA9IHRjY3AtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vOwotCQlnYWluID0gKHRjY3AtPnFtZmJpZCA9PSAwKSA/IDAgOiAoKG9yaWVudCA9PSAwKSA/IDAgOiAoKChvcmllbnQgPT0gMSkgfHwgKG9yaWVudCA9PSAyKSkgPyAxIDogMikpOwotCQlpZiAodGNjcC0+cW50c3R5ID09IEoyS19DQ1BfUU5UU1RZX05PUU5UKSB7Ci0JCQlzdGVwc2l6ZSA9IDEuMDsKLQkJfSBlbHNlIHsKLQkJCU9QSl9GTE9BVDY0IG5vcm0gPSBvcGpfZHd0X25vcm1zX3JlYWxbb3JpZW50XVtsZXZlbF07Ci0JCQlzdGVwc2l6ZSA9ICgxIDw8IChnYWluKSkgLyBub3JtOwotCQl9Ci0JCW9wal9kd3RfZW5jb2RlX3N0ZXBzaXplKChPUEpfSU5UMzIpIGZsb29yKHN0ZXBzaXplICogODE5Mi4wKSwgKE9QSl9JTlQzMikocHJlYyArIGdhaW4pLCAmdGNjcC0+c3RlcHNpemVzW2JhbmRub10pOwotCX0KKyAgICAgICAgcmVzbm8gPSAoYmFuZG5vID09IDApID8gMCA6ICgoYmFuZG5vIC0gMSkgLyAzICsgMSk7CisgICAgICAgIG9yaWVudCA9IChiYW5kbm8gPT0gMCkgPyAwIDogKChiYW5kbm8gLSAxKSAlIDMgKyAxKTsKKyAgICAgICAgbGV2ZWwgPSB0Y2NwLT5udW1yZXNvbHV0aW9ucyAtIDEgLSByZXNubzsKKyAgICAgICAgZ2FpbiA9ICh0Y2NwLT5xbWZiaWQgPT0gMCkgPyAwIDogKChvcmllbnQgPT0gMCkgPyAwIDogKCgob3JpZW50ID09IDEpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3JpZW50ID09IDIpKSA/IDEgOiAyKSk7CisgICAgICAgIGlmICh0Y2NwLT5xbnRzdHkgPT0gSjJLX0NDUF9RTlRTVFlfTk9RTlQpIHsKKyAgICAgICAgICAgIHN0ZXBzaXplID0gMS4wOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT1BKX0ZMT0FUNjQgbm9ybSA9IG9wal9kd3Rfbm9ybXNfcmVhbFtvcmllbnRdW2xldmVsXTsKKyAgICAgICAgICAgIHN0ZXBzaXplID0gKDEgPDwgKGdhaW4pKSAvIG5vcm07CisgICAgICAgIH0KKyAgICAgICAgb3BqX2R3dF9lbmNvZGVfc3RlcHNpemUoKE9QSl9JTlQzMikgZmxvb3Ioc3RlcHNpemUgKiA4MTkyLjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKShwcmVjICsgZ2FpbiksICZ0Y2NwLT5zdGVwc2l6ZXNbYmFuZG5vXSk7CisgICAgfQogfQogCiAvKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBEZXRlcm1pbmUgbWF4aW11bSBjb21wdXRlZCByZXNvbHV0aW9uIGxldmVsIGZvciBpbnZlcnNlIHdhdmVsZXQgdHJhbnNmb3JtICovCiAvKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi1zdGF0aWMgT1BKX1VJTlQzMiBvcGpfZHd0X21heF9yZXNvbHV0aW9uKG9wal90Y2RfcmVzb2x1dGlvbl90KiByZXN0cmljdCByLCBPUEpfVUlOVDMyIGkpIHsKLQlPUEpfVUlOVDMyIG1yCT0gMDsKLQlPUEpfVUlOVDMyIHc7Ci0Jd2hpbGUoIC0taSApIHsKLQkJKytyOwotCQlpZiggbXIgPCAoIHcgPSAoT1BKX1VJTlQzMikoci0+eDEgLSByLT54MCkgKSApCi0JCQltciA9IHcgOwotCQlpZiggbXIgPCAoIHcgPSAoT1BKX1VJTlQzMikoci0+eTEgLSByLT55MCkgKSApCi0JCQltciA9IHcgOwotCX0KLQlyZXR1cm4gbXIgOworc3RhdGljIE9QSl9VSU5UMzIgb3BqX2R3dF9tYXhfcmVzb2x1dGlvbihvcGpfdGNkX3Jlc29sdXRpb25fdCogT1BKX1JFU1RSSUNUIHIsCisgICAgICAgIE9QSl9VSU5UMzIgaSkKK3sKKyAgICBPUEpfVUlOVDMyIG1yICAgPSAwOworICAgIE9QSl9VSU5UMzIgdzsKKyAgICB3aGlsZSAoLS1pKSB7CisgICAgICAgICsrcjsKKyAgICAgICAgaWYgKG1yIDwgKHcgPSAoT1BKX1VJTlQzMikoci0+eDEgLSByLT54MCkpKSB7CisgICAgICAgICAgICBtciA9IHcgOworICAgICAgICB9CisgICAgICAgIGlmIChtciA8ICh3ID0gKE9QSl9VSU5UMzIpKHItPnkxIC0gci0+eTApKSkgeworICAgICAgICAgICAgbXIgPSB3IDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbXIgOwogfQogCit0eXBlZGVmIHN0cnVjdCB7CisgICAgb3BqX2R3dF90IGg7CisgICAgT1BKX1VJTlQzMiBydzsKKyAgICBPUEpfVUlOVDMyIHc7CisgICAgT1BKX0lOVDMyICogT1BKX1JFU1RSSUNUIHRpbGVkcDsKKyAgICBPUEpfVUlOVDMyIG1pbl9qOworICAgIE9QSl9VSU5UMzIgbWF4X2o7Cit9IG9wal9kd2RfZGVjb2RlX2hfam9iX3Q7CisKK3N0YXRpYyB2b2lkIG9wal9kd3RfZGVjb2RlX2hfZnVuYyh2b2lkKiB1c2VyX2RhdGEsIG9wal90bHNfdCogdGxzKQoreworICAgIE9QSl9VSU5UMzIgajsKKyAgICBvcGpfZHdkX2RlY29kZV9oX2pvYl90KiBqb2I7CisgICAgKHZvaWQpdGxzOworCisgICAgam9iID0gKG9wal9kd2RfZGVjb2RlX2hfam9iX3QqKXVzZXJfZGF0YTsKKyAgICBmb3IgKGogPSBqb2ItPm1pbl9qOyBqIDwgam9iLT5tYXhfajsgaisrKSB7CisgICAgICAgIG9wal9pZHd0NTNfaCgmam9iLT5oLCAmam9iLT50aWxlZHBbaiAqIGpvYi0+d10pOworICAgIH0KKworICAgIG9wal9hbGlnbmVkX2ZyZWUoam9iLT5oLm1lbSk7CisgICAgb3BqX2ZyZWUoam9iKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG9wal9kd3RfdCB2OworICAgIE9QSl9VSU5UMzIgcmg7CisgICAgT1BKX1VJTlQzMiB3OworICAgIE9QSl9JTlQzMiAqIE9QSl9SRVNUUklDVCB0aWxlZHA7CisgICAgT1BKX1VJTlQzMiBtaW5fajsKKyAgICBPUEpfVUlOVDMyIG1heF9qOworfSBvcGpfZHdkX2RlY29kZV92X2pvYl90OworCitzdGF0aWMgdm9pZCBvcGpfZHd0X2RlY29kZV92X2Z1bmModm9pZCogdXNlcl9kYXRhLCBvcGpfdGxzX3QqIHRscykKK3sKKyAgICBPUEpfVUlOVDMyIGo7CisgICAgb3BqX2R3ZF9kZWNvZGVfdl9qb2JfdCogam9iOworICAgICh2b2lkKXRsczsKKworICAgIGpvYiA9IChvcGpfZHdkX2RlY29kZV92X2pvYl90Kil1c2VyX2RhdGE7CisgICAgZm9yIChqID0gam9iLT5taW5fajsgaiArIFBBUkFMTEVMX0NPTFNfNTMgPD0gam9iLT5tYXhfajsKKyAgICAgICAgICAgIGogKz0gUEFSQUxMRUxfQ09MU181MykgeworICAgICAgICBvcGpfaWR3dDUzX3YoJmpvYi0+diwgJmpvYi0+dGlsZWRwW2pdLCAoT1BKX1NJWkVfVClqb2ItPncsCisgICAgICAgICAgICAgICAgICAgICBQQVJBTExFTF9DT0xTXzUzKTsKKyAgICB9CisgICAgaWYgKGogPCBqb2ItPm1heF9qKQorICAgICAgICBvcGpfaWR3dDUzX3YoJmpvYi0+diwgJmpvYi0+dGlsZWRwW2pdLCAoT1BKX1NJWkVfVClqb2ItPncsCisgICAgICAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKShqb2ItPm1heF9qIC0gaikpOworCisgICAgb3BqX2FsaWduZWRfZnJlZShqb2ItPnYubWVtKTsKKyAgICBvcGpfZnJlZShqb2IpOworfQorCisKIC8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSW52ZXJzZSB3YXZlbGV0IHRyYW5zZm9ybSBpbiAyLUQuICAgICAqLworLyogSW52ZXJzZSB3YXZlbGV0IHRyYW5zZm9ybSBpbiAyLUQuICAgICovCiAvKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfZHd0X2RlY29kZV90aWxlKGNvbnN0IG9wal90Y2RfdGlsZWNvbXBfdCogdGlsZWMsIE9QSl9VSU5UMzIgbnVtcmVzLCBEV1QxREZOIGR3dF8xRCkgewotCW9wal9kd3RfdCBoOwotCW9wal9kd3RfdCB2Oworc3RhdGljIE9QSl9CT09MIG9wal9kd3RfZGVjb2RlX3RpbGUob3BqX3RocmVhZF9wb29sX3QqIHRwLAorICAgICAgICBjb25zdCBvcGpfdGNkX3RpbGVjb21wX3QqIHRpbGVjLCBPUEpfVUlOVDMyIG51bXJlcykKK3sKKyAgICBvcGpfZHd0X3QgaDsKKyAgICBvcGpfZHd0X3QgdjsKIAotCW9wal90Y2RfcmVzb2x1dGlvbl90KiB0ciA9IHRpbGVjLT5yZXNvbHV0aW9uczsKKyAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCogdHIgPSB0aWxlYy0+cmVzb2x1dGlvbnM7CiAKLQlPUEpfVUlOVDMyIHJ3ID0gKE9QSl9VSU5UMzIpKHRyLT54MSAtIHRyLT54MCk7CS8qIHdpZHRoIG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIGNvbXB1dGVkICovCi0JT1BKX1VJTlQzMiByaCA9IChPUEpfVUlOVDMyKSh0ci0+eTEgLSB0ci0+eTApOwkvKiBoZWlnaHQgb2YgdGhlIHJlc29sdXRpb24gbGV2ZWwgY29tcHV0ZWQgKi8KKyAgICBPUEpfVUlOVDMyIHJ3ID0gKE9QSl9VSU5UMzIpKHRyLT54MSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ci0+eDApOyAgLyogd2lkdGggb2YgdGhlIHJlc29sdXRpb24gbGV2ZWwgY29tcHV0ZWQgKi8KKyAgICBPUEpfVUlOVDMyIHJoID0gKE9QSl9VSU5UMzIpKHRyLT55MSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ci0+eTApOyAgLyogaGVpZ2h0IG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIGNvbXB1dGVkICovCiAKLQlPUEpfVUlOVDMyIHcgPSAoT1BKX1VJTlQzMikodGlsZWMtPngxIC0gdGlsZWMtPngwKTsKKyAgICBPUEpfVUlOVDMyIHcgPSAoT1BKX1VJTlQzMikodGlsZWMtPnJlc29sdXRpb25zW3RpbGVjLT5taW5pbXVtX251bV9yZXNvbHV0aW9ucyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxXS54MSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVjLT5yZXNvbHV0aW9uc1t0aWxlYy0+bWluaW11bV9udW1fcmVzb2x1dGlvbnMgLSAxXS54MCk7CisgICAgT1BKX1NJWkVfVCBoX21lbV9zaXplOworICAgIGludCBudW1fdGhyZWFkczsKIAotCWgubWVtX2NvdW50ID0gb3BqX2R3dF9tYXhfcmVzb2x1dGlvbih0ciwgbnVtcmVzKTsKLQlpZiAoKChPUEpfVUlOVDMyKS0xKSAvIChPUEpfVUlOVDMyKXNpemVvZihPUEpfSU5UMzIpIDwgKE9QSl9VSU5UMzIpaC5tZW1fY291bnQpIHsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0JaC5tZW0gPSAoT1BKX0lOVDMyKilvcGpfYWxpZ25lZF9tYWxsb2MoaC5tZW1fY291bnQgKiBzaXplb2YoT1BKX0lOVDMyKSk7Ci0JaWYgKCEgaC5tZW0pewotCQkvKiBGSVhNRSBldmVudCBtYW5hZ2VyIGVycm9yIGNhbGxiYWNrICovCi0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgIGlmIChudW1yZXMgPT0gMVUpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIH0KKyAgICBudW1fdGhyZWFkcyA9IG9wal90aHJlYWRfcG9vbF9nZXRfdGhyZWFkX2NvdW50KHRwKTsKKyAgICBoLm1lbV9jb3VudCA9IG9wal9kd3RfbWF4X3Jlc29sdXRpb24odHIsIG51bXJlcyk7CisgICAgLyogb3ZlcmZsb3cgY2hlY2sgKi8KKyAgICBpZiAoaC5tZW1fY291bnQgPiAoU0laRV9NQVggLyBQQVJBTExFTF9DT0xTXzUzIC8gc2l6ZW9mKE9QSl9JTlQzMikpKSB7CisgICAgICAgIC8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgLyogV2UgbmVlZCBQQVJBTExFTF9DT0xTXzUzIHRpbWVzIHRoZSBoZWlnaHQgb2YgdGhlIGFycmF5LCAqLworICAgIC8qIHNpbmNlIGZvciB0aGUgdmVydGljYWwgcGFzcyAqLworICAgIC8qIHdlIHByb2Nlc3MgUEFSQUxMRUxfQ09MU181MyBjb2x1bW5zIGF0IGEgdGltZSAqLworICAgIGhfbWVtX3NpemUgPSBoLm1lbV9jb3VudCAqIFBBUkFMTEVMX0NPTFNfNTMgKiBzaXplb2YoT1BKX0lOVDMyKTsKKyAgICBoLm1lbSA9IChPUEpfSU5UMzIqKW9wal9hbGlnbmVkXzMyX21hbGxvYyhoX21lbV9zaXplKTsKKyAgICBpZiAoISBoLm1lbSkgeworICAgICAgICAvKiBGSVhNRSBldmVudCBtYW5hZ2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0Jdi5tZW1fY291bnQgPSBoLm1lbV9jb3VudDsKLQl2Lm1lbSA9IGgubWVtOworICAgIHYubWVtX2NvdW50ID0gaC5tZW1fY291bnQ7CisgICAgdi5tZW0gPSBoLm1lbTsKIAotCXdoaWxlKCAtLW51bXJlcykgewotCQlPUEpfSU5UMzIgKiByZXN0cmljdCB0aWxlZHAgPSB0aWxlYy0+ZGF0YTsKLQkJT1BKX1VJTlQzMiBqOworICAgIHdoaWxlICgtLW51bXJlcykgeworICAgICAgICBPUEpfSU5UMzIgKiBPUEpfUkVTVFJJQ1QgdGlsZWRwID0gdGlsZWMtPmRhdGE7CisgICAgICAgIE9QSl9VSU5UMzIgajsKIAotCQkrK3RyOwotCQloLnNuID0gKE9QSl9JTlQzMilydzsKLQkJdi5zbiA9IChPUEpfSU5UMzIpcmg7CisgICAgICAgICsrdHI7CisgICAgICAgIGguc24gPSAoT1BKX0lOVDMyKXJ3OworICAgICAgICB2LnNuID0gKE9QSl9JTlQzMilyaDsKIAotCQlydyA9IChPUEpfVUlOVDMyKSh0ci0+eDEgLSB0ci0+eDApOwotCQlyaCA9IChPUEpfVUlOVDMyKSh0ci0+eTEgLSB0ci0+eTApOworICAgICAgICBydyA9IChPUEpfVUlOVDMyKSh0ci0+eDEgLSB0ci0+eDApOworICAgICAgICByaCA9IChPUEpfVUlOVDMyKSh0ci0+eTEgLSB0ci0+eTApOwogCi0JCWguZG4gPSAoT1BKX0lOVDMyKShydyAtIChPUEpfVUlOVDMyKWguc24pOwotCQloLmNhcyA9IHRyLT54MCAlIDI7CisgICAgICAgIGguZG4gPSAoT1BKX0lOVDMyKShydyAtIChPUEpfVUlOVDMyKWguc24pOworICAgICAgICBoLmNhcyA9IHRyLT54MCAlIDI7CiAKLQkJZm9yKGogPSAwOyBqIDwgcmg7ICsraikgewotCQkJb3BqX2R3dF9pbnRlcmxlYXZlX2goJmgsICZ0aWxlZHBbaip3XSk7Ci0JCQkoZHd0XzFEKSgmaCk7Ci0JCQltZW1jcHkoJnRpbGVkcFtqKnddLCBoLm1lbSwgcncgKiBzaXplb2YoT1BKX0lOVDMyKSk7Ci0JCX0KKyAgICAgICAgaWYgKG51bV90aHJlYWRzIDw9IDEgfHwgcmggPD0gMSkgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHJoOyArK2opIHsKKyAgICAgICAgICAgICAgICBvcGpfaWR3dDUzX2goJmgsICZ0aWxlZHBbKE9QSl9TSVpFX1QpaiAqIHddKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9QSl9VSU5UMzIgbnVtX2pvYnMgPSAoT1BKX1VJTlQzMiludW1fdGhyZWFkczsKKyAgICAgICAgICAgIE9QSl9VSU5UMzIgc3RlcF9qOwogCi0JCXYuZG4gPSAoT1BKX0lOVDMyKShyaCAtIChPUEpfVUlOVDMyKXYuc24pOwotCQl2LmNhcyA9IHRyLT55MCAlIDI7CisgICAgICAgICAgICBpZiAocmggPCBudW1fam9icykgeworICAgICAgICAgICAgICAgIG51bV9qb2JzID0gcmg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGVwX2ogPSAocmggLyBudW1fam9icyk7CiAKLQkJZm9yKGogPSAwOyBqIDwgcnc7ICsrail7Ci0JCQlPUEpfVUlOVDMyIGs7Ci0JCQlvcGpfZHd0X2ludGVybGVhdmVfdigmdiwgJnRpbGVkcFtqXSwgKE9QSl9JTlQzMil3KTsKLQkJCShkd3RfMUQpKCZ2KTsKLQkJCWZvcihrID0gMDsgayA8IHJoOyArK2spIHsKLQkJCQl0aWxlZHBbayAqIHcgKyBqXSA9IHYubWVtW2tdOwotCQkJfQotCQl9Ci0JfQotCW9wal9hbGlnbmVkX2ZyZWUoaC5tZW0pOwotCXJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fam9iczsgaisrKSB7CisgICAgICAgICAgICAgICAgb3BqX2R3ZF9kZWNvZGVfaF9qb2JfdCogam9iOworCisgICAgICAgICAgICAgICAgam9iID0gKG9wal9kd2RfZGVjb2RlX2hfam9iX3QqKSBvcGpfbWFsbG9jKHNpemVvZihvcGpfZHdkX2RlY29kZV9oX2pvYl90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFqb2IpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogSXQgd291bGQgYmUgbmljZSB0byBmYWxsYmFjayB0byBzaW5nbGUgdGhyZWFkIGNhc2UsIGJ1dCAqLworICAgICAgICAgICAgICAgICAgICAvKiB1bmZvcnR1bmF0ZWx5IHNvbWUgam9icyBtYXkgYmUgbGF1bmNoZWQgYW5kIGhhdmUgbW9kaWZpZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogdGlsZWRwLCBzbyBpdCBpcyBub3QgcHJhY3RpY2FsIHRvIHJlY292ZXIgZnJvbSB0aGF0IGVycm9yICovCisgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgICAgICAgICAgICAgb3BqX3RocmVhZF9wb29sX3dhaXRfY29tcGxldGlvbih0cCwgMCk7CisgICAgICAgICAgICAgICAgICAgIG9wal9hbGlnbmVkX2ZyZWUoaC5tZW0pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBqb2ItPmggPSBoOworICAgICAgICAgICAgICAgIGpvYi0+cncgPSBydzsKKyAgICAgICAgICAgICAgICBqb2ItPncgPSB3OworICAgICAgICAgICAgICAgIGpvYi0+dGlsZWRwID0gdGlsZWRwOworICAgICAgICAgICAgICAgIGpvYi0+bWluX2ogPSBqICogc3RlcF9qOworICAgICAgICAgICAgICAgIGpvYi0+bWF4X2ogPSAoaiArIDFVKSAqIHN0ZXBfajsgLyogdGhpcyBjYW4gb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgICAgICBpZiAoaiA9PSAobnVtX2pvYnMgLSAxVSkpIHsgIC8qIHRoaXMgd2lsbCB0YWtlIGNhcmUgb2YgdGhlIG92ZXJmbG93ICovCisgICAgICAgICAgICAgICAgICAgIGpvYi0+bWF4X2ogPSByaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgam9iLT5oLm1lbSA9IChPUEpfSU5UMzIqKW9wal9hbGlnbmVkXzMyX21hbGxvYyhoX21lbV9zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoIWpvYi0+aC5tZW0pIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRklYTUUgZXZlbnQgbWFuYWdlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgICAgICAgICAgICBvcGpfdGhyZWFkX3Bvb2xfd2FpdF9jb21wbGV0aW9uKHRwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUoam9iKTsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2FsaWduZWRfZnJlZShoLm1lbSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9wal90aHJlYWRfcG9vbF9zdWJtaXRfam9iKHRwLCBvcGpfZHd0X2RlY29kZV9oX2Z1bmMsIGpvYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcGpfdGhyZWFkX3Bvb2xfd2FpdF9jb21wbGV0aW9uKHRwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIHYuZG4gPSAoT1BKX0lOVDMyKShyaCAtIChPUEpfVUlOVDMyKXYuc24pOworICAgICAgICB2LmNhcyA9IHRyLT55MCAlIDI7CisKKyAgICAgICAgaWYgKG51bV90aHJlYWRzIDw9IDEgfHwgcncgPD0gMSkgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiArIFBBUkFMTEVMX0NPTFNfNTMgPD0gcnc7CisgICAgICAgICAgICAgICAgICAgIGogKz0gUEFSQUxMRUxfQ09MU181MykgeworICAgICAgICAgICAgICAgIG9wal9pZHd0NTNfdigmdiwgJnRpbGVkcFtqXSwgKE9QSl9TSVpFX1QpdywgUEFSQUxMRUxfQ09MU181Myk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaiA8IHJ3KSB7CisgICAgICAgICAgICAgICAgb3BqX2lkd3Q1M192KCZ2LCAmdGlsZWRwW2pdLCAoT1BKX1NJWkVfVCl3LCAoT1BKX0lOVDMyKShydyAtIGopKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9QSl9VSU5UMzIgbnVtX2pvYnMgPSAoT1BKX1VJTlQzMiludW1fdGhyZWFkczsKKyAgICAgICAgICAgIE9QSl9VSU5UMzIgc3RlcF9qOworCisgICAgICAgICAgICBpZiAocncgPCBudW1fam9icykgeworICAgICAgICAgICAgICAgIG51bV9qb2JzID0gcnc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGVwX2ogPSAocncgLyBudW1fam9icyk7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fam9iczsgaisrKSB7CisgICAgICAgICAgICAgICAgb3BqX2R3ZF9kZWNvZGVfdl9qb2JfdCogam9iOworCisgICAgICAgICAgICAgICAgam9iID0gKG9wal9kd2RfZGVjb2RlX3Zfam9iX3QqKSBvcGpfbWFsbG9jKHNpemVvZihvcGpfZHdkX2RlY29kZV92X2pvYl90KSk7CisgICAgICAgICAgICAgICAgaWYgKCFqb2IpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogSXQgd291bGQgYmUgbmljZSB0byBmYWxsYmFjayB0byBzaW5nbGUgdGhyZWFkIGNhc2UsIGJ1dCAqLworICAgICAgICAgICAgICAgICAgICAvKiB1bmZvcnR1bmF0ZWx5IHNvbWUgam9icyBtYXkgYmUgbGF1bmNoZWQgYW5kIGhhdmUgbW9kaWZpZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogdGlsZWRwLCBzbyBpdCBpcyBub3QgcHJhY3RpY2FsIHRvIHJlY292ZXIgZnJvbSB0aGF0IGVycm9yICovCisgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgICAgICAgICAgICAgb3BqX3RocmVhZF9wb29sX3dhaXRfY29tcGxldGlvbih0cCwgMCk7CisgICAgICAgICAgICAgICAgICAgIG9wal9hbGlnbmVkX2ZyZWUodi5tZW0pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBqb2ItPnYgPSB2OworICAgICAgICAgICAgICAgIGpvYi0+cmggPSByaDsKKyAgICAgICAgICAgICAgICBqb2ItPncgPSB3OworICAgICAgICAgICAgICAgIGpvYi0+dGlsZWRwID0gdGlsZWRwOworICAgICAgICAgICAgICAgIGpvYi0+bWluX2ogPSBqICogc3RlcF9qOworICAgICAgICAgICAgICAgIGpvYi0+bWF4X2ogPSAoaiArIDFVKSAqIHN0ZXBfajsgLyogdGhpcyBjYW4gb3ZlcmZsb3cgKi8KKyAgICAgICAgICAgICAgICBpZiAoaiA9PSAobnVtX2pvYnMgLSAxVSkpIHsgIC8qIHRoaXMgd2lsbCB0YWtlIGNhcmUgb2YgdGhlIG92ZXJmbG93ICovCisgICAgICAgICAgICAgICAgICAgIGpvYi0+bWF4X2ogPSBydzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgam9iLT52Lm1lbSA9IChPUEpfSU5UMzIqKW9wal9hbGlnbmVkXzMyX21hbGxvYyhoX21lbV9zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoIWpvYi0+di5tZW0pIHsKKyAgICAgICAgICAgICAgICAgICAgLyogRklYTUUgZXZlbnQgbWFuYWdlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICAgICAgICAgICAgICBvcGpfdGhyZWFkX3Bvb2xfd2FpdF9jb21wbGV0aW9uKHRwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUoam9iKTsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2FsaWduZWRfZnJlZSh2Lm1lbSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG9wal90aHJlYWRfcG9vbF9zdWJtaXRfam9iKHRwLCBvcGpfZHd0X2RlY29kZV92X2Z1bmMsIGpvYik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcGpfdGhyZWFkX3Bvb2xfd2FpdF9jb21wbGV0aW9uKHRwLCAwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBvcGpfYWxpZ25lZF9mcmVlKGgubWVtKTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyB2b2lkIG9wal92NGR3dF9pbnRlcmxlYXZlX2gob3BqX3Y0ZHd0X3QqIHJlc3RyaWN0IHcsIE9QSl9GTE9BVDMyKiByZXN0cmljdCBhLCBPUEpfSU5UMzIgeCwgT1BKX0lOVDMyIHNpemUpewotCU9QSl9GTE9BVDMyKiByZXN0cmljdCBiaSA9IChPUEpfRkxPQVQzMiopICh3LT53YXZlbGV0ICsgdy0+Y2FzKTsKLQlPUEpfSU5UMzIgY291bnQgPSB3LT5zbjsKLQlPUEpfSU5UMzIgaSwgazsKLQotCWZvcihrID0gMDsgayA8IDI7ICsrayl7Ci0JCWlmICggY291bnQgKyAzICogeCA8IHNpemUgJiYgKChzaXplX3QpIGEgJiAweDBmKSA9PSAwICYmICgoc2l6ZV90KSBiaSAmIDB4MGYpID09IDAgJiYgKHggJiAweDBmKSA9PSAwICkgewotCQkJLyogRmFzdCBjb2RlIHBhdGggKi8KLQkJCWZvcihpID0gMDsgaSA8IGNvdW50OyArK2kpewotCQkJCU9QSl9JTlQzMiBqID0gaTsKLQkJCQliaVtpKjggICAgXSA9IGFbal07Ci0JCQkJaiArPSB4OwotCQkJCWJpW2kqOCArIDFdID0gYVtqXTsKLQkJCQlqICs9IHg7Ci0JCQkJYmlbaSo4ICsgMl0gPSBhW2pdOwotCQkJCWogKz0geDsKLQkJCQliaVtpKjggKyAzXSA9IGFbal07Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBTbG93IGNvZGUgcGF0aCAqLwotCQkJZm9yKGkgPSAwOyBpIDwgY291bnQ7ICsraSl7Ci0JCQkJT1BKX0lOVDMyIGogPSBpOwotCQkJCWJpW2kqOCAgICBdID0gYVtqXTsKLQkJCQlqICs9IHg7Ci0JCQkJaWYoaiA+PSBzaXplKSBjb250aW51ZTsKLQkJCQliaVtpKjggKyAxXSA9IGFbal07Ci0JCQkJaiArPSB4OwotCQkJCWlmKGogPj0gc2l6ZSkgY29udGludWU7Ci0JCQkJYmlbaSo4ICsgMl0gPSBhW2pdOwotCQkJCWogKz0geDsKLQkJCQlpZihqID49IHNpemUpIGNvbnRpbnVlOwotCQkJCWJpW2kqOCArIDNdID0gYVtqXTsgLyogVGhpcyBvbmUqLwotCQkJfQotCQl9Ci0KLQkJYmkgPSAoT1BKX0ZMT0FUMzIqKSAody0+d2F2ZWxldCArIDEgLSB3LT5jYXMpOwotCQlhICs9IHctPnNuOwotCQlzaXplIC09IHctPnNuOwotCQljb3VudCA9IHctPmRuOwotCX0KK3N0YXRpYyB2b2lkIG9wal9kd3RfaW50ZXJsZWF2ZV9wYXJ0aWFsX2goT1BKX0lOVDMyICpkZXN0LAorICAgICAgICBPUEpfSU5UMzIgY2FzLAorICAgICAgICBvcGpfc3BhcnNlX2FycmF5X2ludDMyX3QqIHNhLAorICAgICAgICBPUEpfVUlOVDMyIHNhX2xpbmUsCisgICAgICAgIE9QSl9VSU5UMzIgc24sCisgICAgICAgIE9QSl9VSU5UMzIgd2luX2xfeDAsCisgICAgICAgIE9QSl9VSU5UMzIgd2luX2xfeDEsCisgICAgICAgIE9QSl9VSU5UMzIgd2luX2hfeDAsCisgICAgICAgIE9QSl9VSU5UMzIgd2luX2hfeDEpCit7CisgICAgT1BKX0JPT0wgcmV0OworICAgIHJldCA9IG9wal9zcGFyc2VfYXJyYXlfaW50MzJfcmVhZChzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luX2xfeDAsIHNhX2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbl9sX3gxLCBzYV9saW5lICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdCArIGNhcyArIDIgKiB3aW5fbF94MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMCwgT1BKX1RSVUUpOworICAgIGFzc2VydChyZXQpOworICAgIHJldCA9IG9wal9zcGFyc2VfYXJyYXlfaW50MzJfcmVhZChzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc24gKyB3aW5faF94MCwgc2FfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc24gKyB3aW5faF94MSwgc2FfbGluZSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QgKyAxIC0gY2FzICsgMiAqIHdpbl9oX3gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAwLCBPUEpfVFJVRSk7CisgICAgYXNzZXJ0KHJldCk7CisgICAgT1BKX1VOVVNFRChyZXQpOwogfQogCi1zdGF0aWMgdm9pZCBvcGpfdjRkd3RfaW50ZXJsZWF2ZV92KG9wal92NGR3dF90KiByZXN0cmljdCB2ICwgT1BKX0ZMT0FUMzIqIHJlc3RyaWN0IGEgLCBPUEpfSU5UMzIgeCwgT1BKX0lOVDMyIG5iX2VsdHNfcmVhZCl7Ci0Jb3BqX3Y0X3QqIHJlc3RyaWN0IGJpID0gdi0+d2F2ZWxldCArIHYtPmNhczsKLQlPUEpfSU5UMzIgaTsKIAotCWZvcihpID0gMDsgaSA8IHYtPnNuOyArK2kpewotCQltZW1jcHkoJmJpW2kqMl0sICZhW2kqeF0sIChzaXplX3QpbmJfZWx0c19yZWFkICogc2l6ZW9mKE9QSl9GTE9BVDMyKSk7Ci0JfQorc3RhdGljIHZvaWQgb3BqX2R3dF9pbnRlcmxlYXZlX3BhcnRpYWxfdihPUEpfSU5UMzIgKmRlc3QsCisgICAgICAgIE9QSl9JTlQzMiBjYXMsCisgICAgICAgIG9wal9zcGFyc2VfYXJyYXlfaW50MzJfdCogc2EsCisgICAgICAgIE9QSl9VSU5UMzIgc2FfY29sLAorICAgICAgICBPUEpfVUlOVDMyIG5iX2NvbHMsCisgICAgICAgIE9QSl9VSU5UMzIgc24sCisgICAgICAgIE9QSl9VSU5UMzIgd2luX2xfeTAsCisgICAgICAgIE9QSl9VSU5UMzIgd2luX2xfeTEsCisgICAgICAgIE9QSl9VSU5UMzIgd2luX2hfeTAsCisgICAgICAgIE9QSl9VSU5UMzIgd2luX2hfeTEpCit7CisgICAgT1BKX0JPT0wgcmV0OworICAgIHJldCAgPSBvcGpfc3BhcnNlX2FycmF5X2ludDMyX3JlYWQoc2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYV9jb2wsIHdpbl9sX3kwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FfY29sICsgbmJfY29scywgd2luX2xfeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ICsgY2FzICogNCArIDIgKiA0ICogd2luX2xfeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAyICogNCwgT1BKX1RSVUUpOworICAgIGFzc2VydChyZXQpOworICAgIHJldCA9IG9wal9zcGFyc2VfYXJyYXlfaW50MzJfcmVhZChzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FfY29sLCBzbiArIHdpbl9oX3kwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYV9jb2wgKyBuYl9jb2xzLCBzbiArIHdpbl9oX3kxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0ICsgKDEgLSBjYXMpICogNCArIDIgKiA0ICogd2luX2hfeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDIgKiA0LCBPUEpfVFJVRSk7CisgICAgYXNzZXJ0KHJldCk7CisgICAgT1BKX1VOVVNFRChyZXQpOworfQogCi0JYSArPSB2LT5zbiAqIHg7Ci0JYmkgPSB2LT53YXZlbGV0ICsgMSAtIHYtPmNhczsKK3N0YXRpYyB2b2lkIG9wal9kd3RfZGVjb2RlX3BhcnRpYWxfMShPUEpfSU5UMzIgKmEsIE9QSl9TSVpFX1QgYV9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgZG4sIE9QSl9JTlQzMiBzbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgY2FzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB3aW5fbF94MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgd2luX2xfeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHdpbl9oX3gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB3aW5faF94MSkKK3sKKyAgICBPUEpfSU5UMzIgaTsKIAotCWZvcihpID0gMDsgaSA8IHYtPmRuOyArK2kpewotCQltZW1jcHkoJmJpW2kqMl0sICZhW2kqeF0sIChzaXplX3QpbmJfZWx0c19yZWFkICogc2l6ZW9mKE9QSl9GTE9BVDMyKSk7Ci0JfQorICAgIGlmICghY2FzKSB7CisgICAgICAgIGlmICgoZG4gPiAwKSB8fCAoc24gPiAxKSkgeyAvKiBORVcgOiAgQ0FTRSBPTkUgRUxFTUVOVCAqLworCisgICAgICAgICAgICAvKiBOYWl2ZSB2ZXJzaW9uIGlzIDoKKyAgICAgICAgICAgIGZvciAoaSA9IHdpbl9sX3gwOyBpIDwgaV9tYXg7IGkrKykgeworICAgICAgICAgICAgICAgIE9QSl9TKGkpIC09IChPUEpfRF8oaSAtIDEpICsgT1BKX0RfKGkpICsgMikgPj4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IHdpbl9oX3gwOyBpIDwgd2luX2hfeDE7IGkrKykgeworICAgICAgICAgICAgICAgIE9QSl9EKGkpICs9IChPUEpfU18oaSkgKyBPUEpfU18oaSArIDEpKSA+PiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnV0IHRoZSBjb21waWxlciBkb2Vzbid0IG1hbmFnZSB0byB1bnJvbGwgaXQgdG8gYXZvaWQgYm91bmQKKyAgICAgICAgICAgIGNoZWNraW5nIGluIE9QSl9TXyBhbmQgT1BKX0RfIG1hY3JvcworICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgaSA9IHdpbl9sX3gwOworICAgICAgICAgICAgaWYgKGkgPCB3aW5fbF94MSkgeworICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBpX21heDsKKworICAgICAgICAgICAgICAgIC8qIExlZnQtbW9zdCBjYXNlICovCisgICAgICAgICAgICAgICAgT1BKX1MoaSkgLT0gKE9QSl9EXyhpIC0gMSkgKyBPUEpfRF8oaSkgKyAyKSA+PiAyOworICAgICAgICAgICAgICAgIGkgKys7CisKKyAgICAgICAgICAgICAgICBpX21heCA9IHdpbl9sX3gxOworICAgICAgICAgICAgICAgIGlmIChpX21heCA+IGRuKSB7CisgICAgICAgICAgICAgICAgICAgIGlfbWF4ID0gZG47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgaV9tYXg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAvKiBObyBib3VuZCBjaGVja2luZyAqLworICAgICAgICAgICAgICAgICAgICBPUEpfUyhpKSAtPSAoT1BKX0QoaSAtIDEpICsgT1BKX0QoaSkgKyAyKSA+PiAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IHdpbl9sX3gxOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLyogUmlnaHQtbW9zdCBjYXNlICovCisgICAgICAgICAgICAgICAgICAgIE9QSl9TKGkpIC09IChPUEpfRF8oaSAtIDEpICsgT1BKX0RfKGkpICsgMikgPj4gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGkgPSB3aW5faF94MDsKKyAgICAgICAgICAgIGlmIChpIDwgd2luX2hfeDEpIHsKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgaV9tYXggPSB3aW5faF94MTsKKyAgICAgICAgICAgICAgICBpZiAoaV9tYXggPj0gc24pIHsKKyAgICAgICAgICAgICAgICAgICAgaV9tYXggPSBzbiAtIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgaV9tYXg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAvKiBObyBib3VuZCBjaGVja2luZyAqLworICAgICAgICAgICAgICAgICAgICBPUEpfRChpKSArPSAoT1BKX1MoaSkgKyBPUEpfUyhpICsgMSkpID4+IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgd2luX2hfeDE7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAvKiBSaWdodC1tb3N0IGNhc2UgKi8KKyAgICAgICAgICAgICAgICAgICAgT1BKX0QoaSkgKz0gKE9QSl9TXyhpKSArIE9QSl9TXyhpICsgMSkpID4+IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFzbiAgJiYgZG4gPT0gMSkgeyAgICAgICAgLyogTkVXIDogIENBU0UgT05FIEVMRU1FTlQgKi8KKyAgICAgICAgICAgIE9QSl9TKDApIC89IDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGkgPSB3aW5fbF94MDsgaSA8IHdpbl9sX3gxOyBpKyspIHsKKyAgICAgICAgICAgICAgICBPUEpfRChpKSAtPSAoT1BKX1NTXyhpKSArIE9QSl9TU18oaSArIDEpICsgMikgPj4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaSA9IHdpbl9oX3gwOyBpIDwgd2luX2hfeDE7IGkrKykgeworICAgICAgICAgICAgICAgIE9QSl9TKGkpICs9IChPUEpfRERfKGkpICsgT1BKX0REXyhpIC0gMSkpID4+IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNkZWZpbmUgT1BKX1Nfb2ZmKGksb2ZmKSBhWyhPUEpfVUlOVDMyKShpKSoyKjQrb2ZmXQorI2RlZmluZSBPUEpfRF9vZmYoaSxvZmYpIGFbKDErKE9QSl9VSU5UMzIpKGkpKjIpKjQrb2ZmXQorI2RlZmluZSBPUEpfU19fb2ZmKGksb2ZmKSAoKGkpPDA/T1BKX1Nfb2ZmKDAsb2ZmKTooKGkpPj1zbj9PUEpfU19vZmYoc24tMSxvZmYpOk9QSl9TX29mZihpLG9mZikpKQorI2RlZmluZSBPUEpfRF9fb2ZmKGksb2ZmKSAoKGkpPDA/T1BKX0Rfb2ZmKDAsb2ZmKTooKGkpPj1kbj9PUEpfRF9vZmYoZG4tMSxvZmYpOk9QSl9EX29mZihpLG9mZikpKQorI2RlZmluZSBPUEpfU1NfX29mZihpLG9mZikgKChpKTwwP09QSl9TX29mZigwLG9mZik6KChpKT49ZG4/T1BKX1Nfb2ZmKGRuLTEsb2ZmKTpPUEpfU19vZmYoaSxvZmYpKSkKKyNkZWZpbmUgT1BKX0REX19vZmYoaSxvZmYpICgoaSk8MD9PUEpfRF9vZmYoMCxvZmYpOigoaSk+PXNuP09QSl9EX29mZihzbi0xLG9mZik6T1BKX0Rfb2ZmKGksb2ZmKSkpCisKK3N0YXRpYyB2b2lkIG9wal9kd3RfZGVjb2RlX3BhcnRpYWxfMV9wYXJhbGxlbChPUEpfSU5UMzIgKmEsCisgICAgICAgIE9QSl9VSU5UMzIgbmJfY29scywKKyAgICAgICAgT1BKX0lOVDMyIGRuLCBPUEpfSU5UMzIgc24sCisgICAgICAgIE9QSl9JTlQzMiBjYXMsCisgICAgICAgIE9QSl9JTlQzMiB3aW5fbF94MCwKKyAgICAgICAgT1BKX0lOVDMyIHdpbl9sX3gxLAorICAgICAgICBPUEpfSU5UMzIgd2luX2hfeDAsCisgICAgICAgIE9QSl9JTlQzMiB3aW5faF94MSkKK3sKKyAgICBPUEpfSU5UMzIgaTsKKyAgICBPUEpfVUlOVDMyIG9mZjsKKworICAgICh2b2lkKW5iX2NvbHM7CisKKyAgICBpZiAoIWNhcykgeworICAgICAgICBpZiAoKGRuID4gMCkgfHwgKHNuID4gMSkpIHsgLyogTkVXIDogIENBU0UgT05FIEVMRU1FTlQgKi8KKworICAgICAgICAgICAgLyogTmFpdmUgdmVyc2lvbiBpcyA6CisgICAgICAgICAgICBmb3IgKGkgPSB3aW5fbF94MDsgaSA8IGlfbWF4OyBpKyspIHsKKyAgICAgICAgICAgICAgICBPUEpfUyhpKSAtPSAoT1BKX0RfKGkgLSAxKSArIE9QSl9EXyhpKSArIDIpID4+IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSB3aW5faF94MDsgaSA8IHdpbl9oX3gxOyBpKyspIHsKKyAgICAgICAgICAgICAgICBPUEpfRChpKSArPSAoT1BKX1NfKGkpICsgT1BKX1NfKGkgKyAxKSkgPj4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1dCB0aGUgY29tcGlsZXIgZG9lc24ndCBtYW5hZ2UgdG8gdW5yb2xsIGl0IHRvIGF2b2lkIGJvdW5kCisgICAgICAgICAgICBjaGVja2luZyBpbiBPUEpfU18gYW5kIE9QSl9EXyBtYWNyb3MKKyAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIGkgPSB3aW5fbF94MDsKKyAgICAgICAgICAgIGlmIChpIDwgd2luX2xfeDEpIHsKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgaV9tYXg7CisKKyAgICAgICAgICAgICAgICAvKiBMZWZ0LW1vc3QgY2FzZSAqLworICAgICAgICAgICAgICAgIGZvciAob2ZmID0gMDsgb2ZmIDwgNDsgb2ZmKyspIHsKKyAgICAgICAgICAgICAgICAgICAgT1BKX1Nfb2ZmKGksIG9mZikgLT0gKE9QSl9EX19vZmYoaSAtIDEsIG9mZikgKyBPUEpfRF9fb2ZmKGksIG9mZikgKyAyKSA+PiAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpICsrOworCisgICAgICAgICAgICAgICAgaV9tYXggPSB3aW5fbF94MTsKKyAgICAgICAgICAgICAgICBpZiAoaV9tYXggPiBkbikgeworICAgICAgICAgICAgICAgICAgICBpX21heCA9IGRuOworICAgICAgICAgICAgICAgIH0KKworI2lmZGVmIF9fU1NFMl9fCisgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgaV9tYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSB0d28gPSBfbW1fc2V0MV9lcGkzMigyKTsKKyAgICAgICAgICAgICAgICAgICAgX19tMTI4aSBEbTEgPSBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSAqIGNvbnN0KShhICsgNCArIChpIC0gMSkgKiA4KSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoOyBpICsgMSA8IGlfbWF4OyBpICs9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5vIGJvdW5kIGNoZWNraW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpIFMgPSBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSAqIGNvbnN0KShhICsgaSAqIDgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkgRCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpICogY29uc3QpKGEgKyA0ICsgaSAqIDgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkgUzEgPSBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSAqIGNvbnN0KShhICsgKGkgKyAxKSAqIDgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkgRDEgPSBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSAqIGNvbnN0KShhICsgNCArIChpICsgMSkgKiA4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTID0gX21tX3N1Yl9lcGkzMihTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX3NyYWlfZXBpMzIoX21tX2FkZF9lcGkzMihfbW1fYWRkX2VwaTMyKERtMSwgRCksIHR3byksIDIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFMxID0gX21tX3N1Yl9lcGkzMihTMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1fc3JhaV9lcGkzMihfbW1fYWRkX2VwaTMyKF9tbV9hZGRfZXBpMzIoRCwgRDEpLCB0d28pLCAyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKShhICsgaSAqIDgpLCBTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopKGEgKyAoaSArIDEpICogOCksIFMxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERtMSA9IEQxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IGlfbWF4OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLyogTm8gYm91bmQgY2hlY2tpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yIChvZmYgPSAwOyBvZmYgPCA0OyBvZmYrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1Nfb2ZmKGksIG9mZikgLT0gKE9QSl9EX29mZihpIC0gMSwgb2ZmKSArIE9QSl9EX29mZihpLCBvZmYpICsgMikgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IHdpbl9sX3gxOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgLyogUmlnaHQtbW9zdCBjYXNlICovCisgICAgICAgICAgICAgICAgICAgIGZvciAob2ZmID0gMDsgb2ZmIDwgNDsgb2ZmKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9TX29mZihpLCBvZmYpIC09IChPUEpfRF9fb2ZmKGkgLSAxLCBvZmYpICsgT1BKX0RfX29mZihpLCBvZmYpICsgMikgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaSA9IHdpbl9oX3gwOworICAgICAgICAgICAgaWYgKGkgPCB3aW5faF94MSkgeworICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBpX21heCA9IHdpbl9oX3gxOworICAgICAgICAgICAgICAgIGlmIChpX21heCA+PSBzbikgeworICAgICAgICAgICAgICAgICAgICBpX21heCA9IHNuIC0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyNpZmRlZiBfX1NTRTJfXworICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGlfbWF4KSB7CisgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkgUyA9ICBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSAqIGNvbnN0KShhICsgaSAqIDgpKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yICg7IGkgKyAxIDwgaV9tYXg7IGkgKz0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gYm91bmQgY2hlY2tpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkgRCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpICogY29uc3QpKGEgKyA0ICsgaSAqIDgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkgUzEgPSBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSAqIGNvbnN0KShhICsgKGkgKyAxKSAqIDgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkgRDEgPSBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSAqIGNvbnN0KShhICsgNCArIChpICsgMSkgKiA4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpIFMyID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkgKiBjb25zdCkoYSArIChpICsgMikgKiA4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBEID0gX21tX2FkZF9lcGkzMihELCBfbW1fc3JhaV9lcGkzMihfbW1fYWRkX2VwaTMyKFMsIFMxKSwgMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgRDEgPSBfbW1fYWRkX2VwaTMyKEQxLCBfbW1fc3JhaV9lcGkzMihfbW1fYWRkX2VwaTMyKFMxLCBTMiksIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopKGEgKyA0ICsgaSAqIDgpLCBEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopKGEgKyA0ICsgKGkgKyAxKSAqIDgpLCBEMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTID0gUzI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgaV9tYXg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAvKiBObyBib3VuZCBjaGVja2luZyAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKG9mZiA9IDA7IG9mZiA8IDQ7IG9mZisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRF9vZmYoaSwgb2ZmKSArPSAoT1BKX1Nfb2ZmKGksIG9mZikgKyBPUEpfU19vZmYoaSArIDEsIG9mZikpID4+IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yICg7IGkgPCB3aW5faF94MTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIFJpZ2h0LW1vc3QgY2FzZSAqLworICAgICAgICAgICAgICAgICAgICBmb3IgKG9mZiA9IDA7IG9mZiA8IDQ7IG9mZisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRF9vZmYoaSwgb2ZmKSArPSAoT1BKX1NfX29mZihpLCBvZmYpICsgT1BKX1NfX29mZihpICsgMSwgb2ZmKSkgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghc24gICYmIGRuID09IDEpIHsgICAgICAgIC8qIE5FVyA6ICBDQVNFIE9ORSBFTEVNRU5UICovCisgICAgICAgICAgICBmb3IgKG9mZiA9IDA7IG9mZiA8IDQ7IG9mZisrKSB7CisgICAgICAgICAgICAgICAgT1BKX1Nfb2ZmKDAsIG9mZikgLz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IHdpbl9sX3gwOyBpIDwgd2luX2xfeDE7IGkrKykgeworICAgICAgICAgICAgICAgIGZvciAob2ZmID0gMDsgb2ZmIDwgNDsgb2ZmKyspIHsKKyAgICAgICAgICAgICAgICAgICAgT1BKX0Rfb2ZmKGksIG9mZikgLT0gKE9QSl9TU19fb2ZmKGksIG9mZikgKyBPUEpfU1NfX29mZihpICsgMSwgb2ZmKSArIDIpID4+IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gd2luX2hfeDA7IGkgPCB3aW5faF94MTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZm9yIChvZmYgPSAwOyBvZmYgPCA0OyBvZmYrKykgeworICAgICAgICAgICAgICAgICAgICBPUEpfU19vZmYoaSwgb2ZmKSArPSAoT1BKX0REX19vZmYoaSwgb2ZmKSArIE9QSl9ERF9fb2ZmKGkgLSAxLCBvZmYpKSA+PiAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgb3BqX2R3dF9nZXRfYmFuZF9jb29yZGluYXRlcyhvcGpfdGNkX3RpbGVjb21wX3QqIHRpbGVjLAorICAgICAgICBPUEpfVUlOVDMyIHJlc25vLAorICAgICAgICBPUEpfVUlOVDMyIGJhbmRubywKKyAgICAgICAgT1BKX1VJTlQzMiB0Y3gwLAorICAgICAgICBPUEpfVUlOVDMyIHRjeTAsCisgICAgICAgIE9QSl9VSU5UMzIgdGN4MSwKKyAgICAgICAgT1BKX1VJTlQzMiB0Y3kxLAorICAgICAgICBPUEpfVUlOVDMyKiB0YngwLAorICAgICAgICBPUEpfVUlOVDMyKiB0YnkwLAorICAgICAgICBPUEpfVUlOVDMyKiB0YngxLAorICAgICAgICBPUEpfVUlOVDMyKiB0YnkxKQoreworICAgIC8qIENvbXB1dGUgbnVtYmVyIG9mIGRlY29tcG9zaXRpb24gZm9yIHRoaXMgYmFuZC4gU2VlIHRhYmxlIEYtMSAqLworICAgIE9QSl9VSU5UMzIgbmIgPSAocmVzbm8gPT0gMCkgPworICAgICAgICAgICAgICAgICAgICB0aWxlYy0+bnVtcmVzb2x1dGlvbnMgLSAxIDoKKyAgICAgICAgICAgICAgICAgICAgdGlsZWMtPm51bXJlc29sdXRpb25zIC0gcmVzbm87CisgICAgLyogTWFwIGFib3ZlIHRpbGUtYmFzZWQgY29vcmRpbmF0ZXMgdG8gc3ViLWJhbmQtYmFzZWQgY29vcmRpbmF0ZXMgcGVyICovCisgICAgLyogZXF1YXRpb24gQi0xNSBvZiB0aGUgc3RhbmRhcmQgKi8KKyAgICBPUEpfVUlOVDMyIHgwYiA9IGJhbmRubyAmIDE7CisgICAgT1BKX1VJTlQzMiB5MGIgPSBiYW5kbm8gPj4gMTsKKyAgICBpZiAodGJ4MCkgeworICAgICAgICAqdGJ4MCA9IChuYiA9PSAwKSA/IHRjeDAgOgorICAgICAgICAgICAgICAgICh0Y3gwIDw9ICgxVSA8PCAobmIgLSAxKSkgKiB4MGIpID8gMCA6CisgICAgICAgICAgICAgICAgb3BqX3VpbnRfY2VpbGRpdnBvdzIodGN4MCAtICgxVSA8PCAobmIgLSAxKSkgKiB4MGIsIG5iKTsKKyAgICB9CisgICAgaWYgKHRieTApIHsKKyAgICAgICAgKnRieTAgPSAobmIgPT0gMCkgPyB0Y3kwIDoKKyAgICAgICAgICAgICAgICAodGN5MCA8PSAoMVUgPDwgKG5iIC0gMSkpICogeTBiKSA/IDAgOgorICAgICAgICAgICAgICAgIG9wal91aW50X2NlaWxkaXZwb3cyKHRjeTAgLSAoMVUgPDwgKG5iIC0gMSkpICogeTBiLCBuYik7CisgICAgfQorICAgIGlmICh0YngxKSB7CisgICAgICAgICp0YngxID0gKG5iID09IDApID8gdGN4MSA6CisgICAgICAgICAgICAgICAgKHRjeDEgPD0gKDFVIDw8IChuYiAtIDEpKSAqIHgwYikgPyAwIDoKKyAgICAgICAgICAgICAgICBvcGpfdWludF9jZWlsZGl2cG93Mih0Y3gxIC0gKDFVIDw8IChuYiAtIDEpKSAqIHgwYiwgbmIpOworICAgIH0KKyAgICBpZiAodGJ5MSkgeworICAgICAgICAqdGJ5MSA9IChuYiA9PSAwKSA/IHRjeTEgOgorICAgICAgICAgICAgICAgICh0Y3kxIDw9ICgxVSA8PCAobmIgLSAxKSkgKiB5MGIpID8gMCA6CisgICAgICAgICAgICAgICAgb3BqX3VpbnRfY2VpbGRpdnBvdzIodGN5MSAtICgxVSA8PCAobmIgLSAxKSkgKiB5MGIsIG5iKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG9wal9kd3Rfc2VnbWVudF9ncm93KE9QSl9VSU5UMzIgZmlsdGVyX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBtYXhfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiogZW5kKQoreworICAgICpzdGFydCA9IG9wal91aW50X3N1YnMoKnN0YXJ0LCBmaWx0ZXJfd2lkdGgpOworICAgICplbmQgPSBvcGpfdWludF9hZGRzKCplbmQsIGZpbHRlcl93aWR0aCk7CisgICAgKmVuZCA9IG9wal91aW50X21pbigqZW5kLCBtYXhfc2l6ZSk7Cit9CisKKworc3RhdGljIG9wal9zcGFyc2VfYXJyYXlfaW50MzJfdCogb3BqX2R3dF9pbml0X3NwYXJzZV9hcnJheSgKKyAgICBvcGpfdGNkX3RpbGVjb21wX3QqIHRpbGVjLAorICAgIE9QSl9VSU5UMzIgbnVtcmVzKQoreworICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiB0cl9tYXggPSAmKHRpbGVjLT5yZXNvbHV0aW9uc1tudW1yZXMgLSAxXSk7CisgICAgT1BKX1VJTlQzMiB3ID0gKE9QSl9VSU5UMzIpKHRyX21heC0+eDEgLSB0cl9tYXgtPngwKTsKKyAgICBPUEpfVUlOVDMyIGggPSAoT1BKX1VJTlQzMikodHJfbWF4LT55MSAtIHRyX21heC0+eTApOworICAgIE9QSl9VSU5UMzIgcmVzbm8sIGJhbmRubywgcHJlY25vLCBjYmxrbm87CisgICAgb3BqX3NwYXJzZV9hcnJheV9pbnQzMl90KiBzYSA9IG9wal9zcGFyc2VfYXJyYXlfaW50MzJfY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywgaCwgb3BqX3VpbnRfbWluKHcsIDY0KSwgb3BqX3VpbnRfbWluKGgsIDY0KSk7CisgICAgaWYgKHNhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgZm9yIChyZXNubyA9IDA7IHJlc25vIDwgbnVtcmVzOyArK3Jlc25vKSB7CisgICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiByZXMgPSAmdGlsZWMtPnJlc29sdXRpb25zW3Jlc25vXTsKKworICAgICAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IHJlcy0+bnVtYmFuZHM7ICsrYmFuZG5vKSB7CisgICAgICAgICAgICBvcGpfdGNkX2JhbmRfdCogYmFuZCA9ICZyZXMtPmJhbmRzW2JhbmRub107CisKKyAgICAgICAgICAgIGZvciAocHJlY25vID0gMDsgcHJlY25vIDwgcmVzLT5wdyAqIHJlcy0+cGg7ICsrcHJlY25vKSB7CisgICAgICAgICAgICAgICAgb3BqX3RjZF9wcmVjaW5jdF90KiBwcmVjaW5jdCA9ICZiYW5kLT5wcmVjaW5jdHNbcHJlY25vXTsKKyAgICAgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IHByZWNpbmN0LT5jdyAqIHByZWNpbmN0LT5jaDsgKytjYmxrbm8pIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9jYmxrX2RlY190KiBjYmxrID0gJnByZWNpbmN0LT5jYmxrcy5kZWNbY2Jsa25vXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNibGstPmRlY29kZWRfZGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHggPSAoT1BKX1VJTlQzMikoY2Jsay0+eDAgLSBiYW5kLT54MCk7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHkgPSAoT1BKX1VJTlQzMikoY2Jsay0+eTAgLSBiYW5kLT55MCk7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNibGtfdyA9IChPUEpfVUlOVDMyKShjYmxrLT54MSAtIGNibGstPngwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY2Jsa19oID0gKE9QSl9VSU5UMzIpKGNibGstPnkxIC0gY2Jsay0+eTApOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFuZC0+YmFuZG5vICYgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiBwcmVzID0gJnRpbGVjLT5yZXNvbHV0aW9uc1tyZXNubyAtIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggKz0gKE9QSl9VSU5UMzIpKHByZXMtPngxIC0gcHJlcy0+eDApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhbmQtPmJhbmRubyAmIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCogcHJlcyA9ICZ0aWxlYy0+cmVzb2x1dGlvbnNbcmVzbm8gLSAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ICs9IChPUEpfVUlOVDMyKShwcmVzLT55MSAtIHByZXMtPnkwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcGpfc3BhcnNlX2FycmF5X2ludDMyX3dyaXRlKHNhLCB4LCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggKyBjYmxrX3csIHkgKyBjYmxrX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+ZGVjb2RlZF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIGNibGtfdywgT1BKX1RSVUUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3NwYXJzZV9hcnJheV9pbnQzMl9mcmVlKHNhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzYTsKK30KKworCitzdGF0aWMgT1BKX0JPT0wgb3BqX2R3dF9kZWNvZGVfcGFydGlhbF90aWxlKAorICAgIG9wal90Y2RfdGlsZWNvbXBfdCogdGlsZWMsCisgICAgT1BKX1VJTlQzMiBudW1yZXMpCit7CisgICAgb3BqX3NwYXJzZV9hcnJheV9pbnQzMl90KiBzYTsKKyAgICBvcGpfZHd0X3QgaDsKKyAgICBvcGpfZHd0X3QgdjsKKyAgICBPUEpfVUlOVDMyIHJlc25vOworICAgIC8qIFRoaXMgdmFsdWUgbWF0Y2hlcyB0aGUgbWF4aW11bSBsZWZ0L3JpZ2h0IGV4dGVuc2lvbiBnaXZlbiBpbiB0YWJsZXMgKi8KKyAgICAvKiBGLjIgYW5kIEYuMyBvZiB0aGUgc3RhbmRhcmQuICovCisgICAgY29uc3QgT1BKX1VJTlQzMiBmaWx0ZXJfd2lkdGggPSAyVTsKKworICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiB0ciA9IHRpbGVjLT5yZXNvbHV0aW9uczsKKyAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCogdHJfbWF4ID0gJih0aWxlYy0+cmVzb2x1dGlvbnNbbnVtcmVzIC0gMV0pOworCisgICAgT1BKX1VJTlQzMiBydyA9IChPUEpfVUlOVDMyKSh0ci0+eDEgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHItPngwKTsgIC8qIHdpZHRoIG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIGNvbXB1dGVkICovCisgICAgT1BKX1VJTlQzMiByaCA9IChPUEpfVUlOVDMyKSh0ci0+eTEgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHItPnkwKTsgIC8qIGhlaWdodCBvZiB0aGUgcmVzb2x1dGlvbiBsZXZlbCBjb21wdXRlZCAqLworCisgICAgT1BKX1NJWkVfVCBoX21lbV9zaXplOworCisgICAgLyogQ29tcHV0ZSB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBhcmVhIG9mIGludGVyZXN0LCBleHByZXNzZWQgaW4gdGlsZSBjb29yZGluYXRlcyAqLworICAgIC8qIHdpdGggdGhlIHRpbGUgY29vcmRpbmF0ZXMgKi8KKyAgICBPUEpfVUlOVDMyIHdpbl90Y3gwID0gdGlsZWMtPndpbl94MDsKKyAgICBPUEpfVUlOVDMyIHdpbl90Y3kwID0gdGlsZWMtPndpbl95MDsKKyAgICBPUEpfVUlOVDMyIHdpbl90Y3gxID0gdGlsZWMtPndpbl94MTsKKyAgICBPUEpfVUlOVDMyIHdpbl90Y3kxID0gdGlsZWMtPndpbl95MTsKKworICAgIGlmICh0cl9tYXgtPngwID09IHRyX21heC0+eDEgfHwgdHJfbWF4LT55MCA9PSB0cl9tYXgtPnkxKSB7CisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICB9CisKKyAgICBzYSA9IG9wal9kd3RfaW5pdF9zcGFyc2VfYXJyYXkodGlsZWMsIG51bXJlcyk7CisgICAgaWYgKHNhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICBpZiAobnVtcmVzID09IDFVKSB7CisgICAgICAgIE9QSl9CT09MIHJldCA9IG9wal9zcGFyc2VfYXJyYXlfaW50MzJfcmVhZChzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJfbWF4LT53aW5feDAgLSAoT1BKX1VJTlQzMil0cl9tYXgtPngwLAorICAgICAgICAgICAgICAgICAgICAgICB0cl9tYXgtPndpbl95MCAtIChPUEpfVUlOVDMyKXRyX21heC0+eTAsCisgICAgICAgICAgICAgICAgICAgICAgIHRyX21heC0+d2luX3gxIC0gKE9QSl9VSU5UMzIpdHJfbWF4LT54MCwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJfbWF4LT53aW5feTEgLSAoT1BKX1VJTlQzMil0cl9tYXgtPnkwLAorICAgICAgICAgICAgICAgICAgICAgICB0aWxlYy0+ZGF0YV93aW4sCisgICAgICAgICAgICAgICAgICAgICAgIDEsIHRyX21heC0+d2luX3gxIC0gdHJfbWF4LT53aW5feDAsCisgICAgICAgICAgICAgICAgICAgICAgIE9QSl9UUlVFKTsKKyAgICAgICAgYXNzZXJ0KHJldCk7CisgICAgICAgIE9QSl9VTlVTRUQocmV0KTsKKyAgICAgICAgb3BqX3NwYXJzZV9hcnJheV9pbnQzMl9mcmVlKHNhKTsKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIH0KKyAgICBoLm1lbV9jb3VudCA9IG9wal9kd3RfbWF4X3Jlc29sdXRpb24odHIsIG51bXJlcyk7CisgICAgLyogb3ZlcmZsb3cgY2hlY2sgKi8KKyAgICAvKiBpbiB2ZXJ0aWNhbCBwYXNzLCB3ZSBwcm9jZXNzIDQgY29sdW1ucyBhdCBhIHRpbWUgKi8KKyAgICBpZiAoaC5tZW1fY291bnQgPiAoU0laRV9NQVggLyAoNCAqIHNpemVvZihPUEpfSU5UMzIpKSkpIHsKKyAgICAgICAgLyogRklYTUUgZXZlbnQgbWFuYWdlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICBvcGpfc3BhcnNlX2FycmF5X2ludDMyX2ZyZWUoc2EpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIGhfbWVtX3NpemUgPSBoLm1lbV9jb3VudCAqIDQgKiBzaXplb2YoT1BKX0lOVDMyKTsKKyAgICBoLm1lbSA9IChPUEpfSU5UMzIqKW9wal9hbGlnbmVkXzMyX21hbGxvYyhoX21lbV9zaXplKTsKKyAgICBpZiAoISBoLm1lbSkgeworICAgICAgICAvKiBGSVhNRSBldmVudCBtYW5hZ2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgIG9wal9zcGFyc2VfYXJyYXlfaW50MzJfZnJlZShzYSk7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgdi5tZW1fY291bnQgPSBoLm1lbV9jb3VudDsKKyAgICB2Lm1lbSA9IGgubWVtOworCisgICAgZm9yIChyZXNubyA9IDE7IHJlc25vIDwgbnVtcmVzOyByZXNubyArKykgeworICAgICAgICBPUEpfVUlOVDMyIGksIGo7CisgICAgICAgIC8qIFdpbmRvdyBvZiBpbnRlcmVzdCBzdWJiYW5kLWJhc2VkIGNvb3JkaW5hdGVzICovCisgICAgICAgIE9QSl9VSU5UMzIgd2luX2xsX3gwLCB3aW5fbGxfeTAsIHdpbl9sbF94MSwgd2luX2xsX3kxOworICAgICAgICBPUEpfVUlOVDMyIHdpbl9obF94MCwgd2luX2hsX3gxOworICAgICAgICBPUEpfVUlOVDMyIHdpbl9saF95MCwgd2luX2xoX3kxOworICAgICAgICAvKiBXaW5kb3cgb2YgaW50ZXJlc3QgdGlsZS1yZXNvbHV0aW9uLWJhc2VkIGNvb3JkaW5hdGVzICovCisgICAgICAgIE9QSl9VSU5UMzIgd2luX3RyX3gwLCB3aW5fdHJfeDEsIHdpbl90cl95MCwgd2luX3RyX3kxOworICAgICAgICAvKiBUaWxlLXJlc29sdXRpb24gc3ViYmFuZC1iYXNlZCBjb29yZGluYXRlcyAqLworICAgICAgICBPUEpfVUlOVDMyIHRyX2xsX3gwLCB0cl9sbF95MCwgdHJfaGxfeDAsIHRyX2xoX3kwOworCisgICAgICAgICsrdHI7CisKKyAgICAgICAgaC5zbiA9IChPUEpfSU5UMzIpcnc7CisgICAgICAgIHYuc24gPSAoT1BKX0lOVDMyKXJoOworCisgICAgICAgIHJ3ID0gKE9QSl9VSU5UMzIpKHRyLT54MSAtIHRyLT54MCk7CisgICAgICAgIHJoID0gKE9QSl9VSU5UMzIpKHRyLT55MSAtIHRyLT55MCk7CisKKyAgICAgICAgaC5kbiA9IChPUEpfSU5UMzIpKHJ3IC0gKE9QSl9VSU5UMzIpaC5zbik7CisgICAgICAgIGguY2FzID0gdHItPngwICUgMjsKKworICAgICAgICB2LmRuID0gKE9QSl9JTlQzMikocmggLSAoT1BKX1VJTlQzMil2LnNuKTsKKyAgICAgICAgdi5jYXMgPSB0ci0+eTAgJSAyOworCisgICAgICAgIC8qIEdldCB0aGUgc3ViYmFuZCBjb29yZGluYXRlcyBmb3IgdGhlIHdpbmRvdyBvZiBpbnRlcmVzdCAqLworICAgICAgICAvKiBMTCBiYW5kICovCisgICAgICAgIG9wal9kd3RfZ2V0X2JhbmRfY29vcmRpbmF0ZXModGlsZWMsIHJlc25vLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbl90Y3gwLCB3aW5fdGN5MCwgd2luX3RjeDEsIHdpbl90Y3kxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aW5fbGxfeDAsICZ3aW5fbGxfeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndpbl9sbF94MSwgJndpbl9sbF95MSk7CisKKyAgICAgICAgLyogSEwgYmFuZCAqLworICAgICAgICBvcGpfZHd0X2dldF9iYW5kX2Nvb3JkaW5hdGVzKHRpbGVjLCByZXNubywgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5fdGN4MCwgd2luX3RjeTAsIHdpbl90Y3gxLCB3aW5fdGN5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2luX2hsX3gwLCBOVUxMLCAmd2luX2hsX3gxLCBOVUxMKTsKKworICAgICAgICAvKiBMSCBiYW5kICovCisgICAgICAgIG9wal9kd3RfZ2V0X2JhbmRfY29vcmRpbmF0ZXModGlsZWMsIHJlc25vLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbl90Y3gwLCB3aW5fdGN5MCwgd2luX3RjeDEsIHdpbl90Y3kxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICZ3aW5fbGhfeTAsIE5VTEwsICZ3aW5fbGhfeTEpOworCisgICAgICAgIC8qIEJld2FyZTogYmFuZCBpbmRleCBmb3Igbm9uLUxMMCByZXNvbHV0aW9uIGFyZSAwPUhMLCAxPUxIIGFuZCAyPUhIICovCisgICAgICAgIHRyX2xsX3gwID0gKE9QSl9VSU5UMzIpdHItPmJhbmRzWzFdLngwOworICAgICAgICB0cl9sbF95MCA9IChPUEpfVUlOVDMyKXRyLT5iYW5kc1swXS55MDsKKyAgICAgICAgdHJfaGxfeDAgPSAoT1BKX1VJTlQzMil0ci0+YmFuZHNbMF0ueDA7CisgICAgICAgIHRyX2xoX3kwID0gKE9QSl9VSU5UMzIpdHItPmJhbmRzWzFdLnkwOworCisgICAgICAgIC8qIFN1YnN0cmFjdCB0aGUgb3JpZ2luIG9mIHRoZSBiYW5kcyBmb3IgdGhpcyB0aWxlLCB0byB0aGUgc3Vid2luZG93ICovCisgICAgICAgIC8qIG9mIGludGVyZXN0IGJhbmQgY29vcmRpbmF0ZXMsIHNvIGFzIHRvIGdldCB0aGVtIHJlbGF0aXZlIHRvIHRoZSAqLworICAgICAgICAvKiB0aWxlICovCisgICAgICAgIHdpbl9sbF94MCA9IG9wal91aW50X3N1YnMod2luX2xsX3gwLCB0cl9sbF94MCk7CisgICAgICAgIHdpbl9sbF95MCA9IG9wal91aW50X3N1YnMod2luX2xsX3kwLCB0cl9sbF95MCk7CisgICAgICAgIHdpbl9sbF94MSA9IG9wal91aW50X3N1YnMod2luX2xsX3gxLCB0cl9sbF94MCk7CisgICAgICAgIHdpbl9sbF95MSA9IG9wal91aW50X3N1YnMod2luX2xsX3kxLCB0cl9sbF95MCk7CisgICAgICAgIHdpbl9obF94MCA9IG9wal91aW50X3N1YnMod2luX2hsX3gwLCB0cl9obF94MCk7CisgICAgICAgIHdpbl9obF94MSA9IG9wal91aW50X3N1YnMod2luX2hsX3gxLCB0cl9obF94MCk7CisgICAgICAgIHdpbl9saF95MCA9IG9wal91aW50X3N1YnMod2luX2xoX3kwLCB0cl9saF95MCk7CisgICAgICAgIHdpbl9saF95MSA9IG9wal91aW50X3N1YnMod2luX2xoX3kxLCB0cl9saF95MCk7CisKKyAgICAgICAgb3BqX2R3dF9zZWdtZW50X2dyb3coZmlsdGVyX3dpZHRoLCAoT1BKX1VJTlQzMiloLnNuLCAmd2luX2xsX3gwLCAmd2luX2xsX3gxKTsKKyAgICAgICAgb3BqX2R3dF9zZWdtZW50X2dyb3coZmlsdGVyX3dpZHRoLCAoT1BKX1VJTlQzMiloLmRuLCAmd2luX2hsX3gwLCAmd2luX2hsX3gxKTsKKworICAgICAgICBvcGpfZHd0X3NlZ21lbnRfZ3JvdyhmaWx0ZXJfd2lkdGgsIChPUEpfVUlOVDMyKXYuc24sICZ3aW5fbGxfeTAsICZ3aW5fbGxfeTEpOworICAgICAgICBvcGpfZHd0X3NlZ21lbnRfZ3JvdyhmaWx0ZXJfd2lkdGgsIChPUEpfVUlOVDMyKXYuZG4sICZ3aW5fbGhfeTAsICZ3aW5fbGhfeTEpOworCisgICAgICAgIC8qIENvbXB1dGUgdGhlIHRpbGUtcmVzb2x1dGlvbi1iYXNlZCBjb29yZGluYXRlcyBmb3IgdGhlIHdpbmRvdyBvZiBpbnRlcmVzdCAqLworICAgICAgICBpZiAoaC5jYXMgPT0gMCkgeworICAgICAgICAgICAgd2luX3RyX3gwID0gb3BqX3VpbnRfbWluKDIgKiB3aW5fbGxfeDAsIDIgKiB3aW5faGxfeDAgKyAxKTsKKyAgICAgICAgICAgIHdpbl90cl94MSA9IG9wal91aW50X21pbihvcGpfdWludF9tYXgoMiAqIHdpbl9sbF94MSwgMiAqIHdpbl9obF94MSArIDEpLCBydyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3aW5fdHJfeDAgPSBvcGpfdWludF9taW4oMiAqIHdpbl9obF94MCwgMiAqIHdpbl9sbF94MCArIDEpOworICAgICAgICAgICAgd2luX3RyX3gxID0gb3BqX3VpbnRfbWluKG9wal91aW50X21heCgyICogd2luX2hsX3gxLCAyICogd2luX2xsX3gxICsgMSksIHJ3KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2LmNhcyA9PSAwKSB7CisgICAgICAgICAgICB3aW5fdHJfeTAgPSBvcGpfdWludF9taW4oMiAqIHdpbl9sbF95MCwgMiAqIHdpbl9saF95MCArIDEpOworICAgICAgICAgICAgd2luX3RyX3kxID0gb3BqX3VpbnRfbWluKG9wal91aW50X21heCgyICogd2luX2xsX3kxLCAyICogd2luX2xoX3kxICsgMSksIHJoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdpbl90cl95MCA9IG9wal91aW50X21pbigyICogd2luX2xoX3kwLCAyICogd2luX2xsX3kwICsgMSk7CisgICAgICAgICAgICB3aW5fdHJfeTEgPSBvcGpfdWludF9taW4ob3BqX3VpbnRfbWF4KDIgKiB3aW5fbGhfeTEsIDIgKiB3aW5fbGxfeTEgKyAxKSwgcmgpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHJoOyArK2opIHsKKyAgICAgICAgICAgIGlmICgoaiA+PSB3aW5fbGxfeTAgJiYgaiA8IHdpbl9sbF95MSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGogPj0gd2luX2xoX3kwICsgKE9QSl9VSU5UMzIpdi5zbiAmJiBqIDwgd2luX2xoX3kxICsgKE9QSl9VSU5UMzIpdi5zbikpIHsKKworICAgICAgICAgICAgICAgIC8qIEF2b2lkcyBkd3QuYzoxNTg0OjQ0IChpbiBvcGpfZHd0X2RlY29kZV9wYXJ0aWFsXzEpOiBydW50aW1lIGVycm9yOiAqLworICAgICAgICAgICAgICAgIC8qIHNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93OiAtMTA5NDc5NTU4NiArIC0xMDk0Nzk1NTg2IGNhbm5vdCBiZSByZXByZXNlbnRlZCBpbiB0eXBlICdpbnQnICovCisgICAgICAgICAgICAgICAgLyogb24gb3BqX2RlY29tcHJlc3MgLWkgIC4uLy4uL29wZW5qcGVnL01BUEEuanAyIC1vIG91dC50aWYgLWQgMCwwLDI1NiwyNTYgKi8KKyAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIGxlc3MgZXh0cmVtZSB0aGFuIG1lbXNldHRpbmcgdGhlIHdob2xlIGJ1ZmZlciB0byAwICovCisgICAgICAgICAgICAgICAgLyogYWx0aG91Z2ggd2UgY291bGQgcG90ZW50aWFsbHkgZG8gYmV0dGVyIHdpdGggYmV0dGVyIGhhbmRsaW5nIG9mIGVkZ2UgY29uZGl0aW9ucyAqLworICAgICAgICAgICAgICAgIGlmICh3aW5fdHJfeDEgPj0gMSAmJiB3aW5fdHJfeDEgPCBydykgeworICAgICAgICAgICAgICAgICAgICBoLm1lbVt3aW5fdHJfeDEgLSAxXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh3aW5fdHJfeDEgPCBydykgeworICAgICAgICAgICAgICAgICAgICBoLm1lbVt3aW5fdHJfeDFdID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvcGpfZHd0X2ludGVybGVhdmVfcGFydGlhbF9oKGgubWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaC5jYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMiloLnNuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luX2xsX3gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luX2xsX3gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luX2hsX3gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luX2hsX3gxKTsKKyAgICAgICAgICAgICAgICBvcGpfZHd0X2RlY29kZV9wYXJ0aWFsXzEoaC5tZW0sIGgubWVtX2NvdW50LCBoLmRuLCBoLnNuLCBoLmNhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMil3aW5fbGxfeDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfSU5UMzIpd2luX2xsX3gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKXdpbl9obF94MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMil3aW5faGxfeDEpOworICAgICAgICAgICAgICAgIGlmICghb3BqX3NwYXJzZV9hcnJheV9pbnQzMl93cml0ZShzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luX3RyX3gwLCBqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5fdHJfeDEsIGogKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLm1lbSArIHdpbl90cl94MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgT1BKX1RSVUUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgICAgICAgICAgICAgb3BqX3NwYXJzZV9hcnJheV9pbnQzMl9mcmVlKHNhKTsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2FsaWduZWRfZnJlZShoLm1lbSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gd2luX3RyX3gwOyBpIDwgd2luX3RyX3gxOykgeworICAgICAgICAgICAgT1BKX1VJTlQzMiBuYl9jb2xzID0gb3BqX3VpbnRfbWluKDRVLCB3aW5fdHJfeDEgLSBpKTsKKyAgICAgICAgICAgIG9wal9kd3RfaW50ZXJsZWF2ZV9wYXJ0aWFsX3Yodi5tZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYuY2FzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJfY29scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9VSU5UMzIpdi5zbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luX2xsX3kwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5fbGxfeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbl9saF95MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luX2xoX3kxKTsKKyAgICAgICAgICAgIG9wal9kd3RfZGVjb2RlX3BhcnRpYWxfMV9wYXJhbGxlbCh2Lm1lbSwgbmJfY29scywgdi5kbiwgdi5zbiwgdi5jYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMil3aW5fbGxfeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMil3aW5fbGxfeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMil3aW5fbGhfeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMil3aW5fbGhfeTEpOworICAgICAgICAgICAgaWYgKCFvcGpfc3BhcnNlX2FycmF5X2ludDMyX3dyaXRlKHNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHdpbl90cl95MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICsgbmJfY29scywgd2luX3RyX3kxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYubWVtICsgNCAqIHdpbl90cl95MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCA0LCBPUEpfVFJVRSkpIHsKKyAgICAgICAgICAgICAgICAvKiBGSVhNRSBldmVudCBtYW5hZ2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgICAgICAgb3BqX3NwYXJzZV9hcnJheV9pbnQzMl9mcmVlKHNhKTsKKyAgICAgICAgICAgICAgICBvcGpfYWxpZ25lZF9mcmVlKGgubWVtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpICs9IG5iX2NvbHM7CisgICAgICAgIH0KKyAgICB9CisgICAgb3BqX2FsaWduZWRfZnJlZShoLm1lbSk7CisKKyAgICB7CisgICAgICAgIE9QSl9CT09MIHJldCA9IG9wal9zcGFyc2VfYXJyYXlfaW50MzJfcmVhZChzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJfbWF4LT53aW5feDAgLSAoT1BKX1VJTlQzMil0cl9tYXgtPngwLAorICAgICAgICAgICAgICAgICAgICAgICB0cl9tYXgtPndpbl95MCAtIChPUEpfVUlOVDMyKXRyX21heC0+eTAsCisgICAgICAgICAgICAgICAgICAgICAgIHRyX21heC0+d2luX3gxIC0gKE9QSl9VSU5UMzIpdHJfbWF4LT54MCwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJfbWF4LT53aW5feTEgLSAoT1BKX1VJTlQzMil0cl9tYXgtPnkwLAorICAgICAgICAgICAgICAgICAgICAgICB0aWxlYy0+ZGF0YV93aW4sCisgICAgICAgICAgICAgICAgICAgICAgIDEsIHRyX21heC0+d2luX3gxIC0gdHJfbWF4LT53aW5feDAsCisgICAgICAgICAgICAgICAgICAgICAgIE9QSl9UUlVFKTsKKyAgICAgICAgYXNzZXJ0KHJldCk7CisgICAgICAgIE9QSl9VTlVTRUQocmV0KTsKKyAgICB9CisgICAgb3BqX3NwYXJzZV9hcnJheV9pbnQzMl9mcmVlKHNhKTsKKyAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyB2b2lkIG9wal92NGR3dF9pbnRlcmxlYXZlX2gob3BqX3Y0ZHd0X3QqIE9QSl9SRVNUUklDVCBkd3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyKiBPUEpfUkVTVFJJQ1QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiByZW1haW5pbmdfaGVpZ2h0KQoreworICAgIE9QSl9GTE9BVDMyKiBPUEpfUkVTVFJJQ1QgYmkgPSAoT1BKX0ZMT0FUMzIqKShkd3QtPndhdmVsZXQgKyBkd3QtPmNhcyk7CisgICAgT1BKX1VJTlQzMiBpLCBrOworICAgIE9QSl9VSU5UMzIgeDAgPSBkd3QtPndpbl9sX3gwOworICAgIE9QSl9VSU5UMzIgeDEgPSBkd3QtPndpbl9sX3gxOworCisgICAgZm9yIChrID0gMDsgayA8IDI7ICsraykgeworICAgICAgICBpZiAocmVtYWluaW5nX2hlaWdodCA+PSA0ICYmICgoT1BKX1NJWkVfVCkgYSAmIDB4MGYpID09IDAgJiYKKyAgICAgICAgICAgICAgICAoKE9QSl9TSVpFX1QpIGJpICYgMHgwZikgPT0gMCAmJiAod2lkdGggJiAweDBmKSA9PSAwKSB7CisgICAgICAgICAgICAvKiBGYXN0IGNvZGUgcGF0aCAqLworICAgICAgICAgICAgZm9yIChpID0geDA7IGkgPCB4MTsgKytpKSB7CisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBqID0gaTsKKyAgICAgICAgICAgICAgICBiaVtpICogOCAgICBdID0gYVtqXTsKKyAgICAgICAgICAgICAgICBqICs9IHdpZHRoOworICAgICAgICAgICAgICAgIGJpW2kgKiA4ICsgMV0gPSBhW2pdOworICAgICAgICAgICAgICAgIGogKz0gd2lkdGg7CisgICAgICAgICAgICAgICAgYmlbaSAqIDggKyAyXSA9IGFbal07CisgICAgICAgICAgICAgICAgaiArPSB3aWR0aDsKKyAgICAgICAgICAgICAgICBiaVtpICogOCArIDNdID0gYVtqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFNsb3cgY29kZSBwYXRoICovCisgICAgICAgICAgICBmb3IgKGkgPSB4MDsgaSA8IHgxOyArK2kpIHsKKyAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGogPSBpOworICAgICAgICAgICAgICAgIGJpW2kgKiA4ICAgIF0gPSBhW2pdOworICAgICAgICAgICAgICAgIGogKz0gd2lkdGg7CisgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZ19oZWlnaHQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYmlbaSAqIDggKyAxXSA9IGFbal07CisgICAgICAgICAgICAgICAgaiArPSB3aWR0aDsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nX2hlaWdodCA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBiaVtpICogOCArIDJdID0gYVtqXTsKKyAgICAgICAgICAgICAgICBqICs9IHdpZHRoOworICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmdfaGVpZ2h0ID09IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJpW2kgKiA4ICsgM10gPSBhW2pdOyAvKiBUaGlzIG9uZSovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBiaSA9IChPUEpfRkxPQVQzMiopKGR3dC0+d2F2ZWxldCArIDEgLSBkd3QtPmNhcyk7CisgICAgICAgIGEgKz0gZHd0LT5zbjsKKyAgICAgICAgeDAgPSBkd3QtPndpbl9oX3gwOworICAgICAgICB4MSA9IGR3dC0+d2luX2hfeDE7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBvcGpfdjRkd3RfaW50ZXJsZWF2ZV9wYXJ0aWFsX2gob3BqX3Y0ZHd0X3QqIGR3dCwKKyAgICAgICAgb3BqX3NwYXJzZV9hcnJheV9pbnQzMl90KiBzYSwKKyAgICAgICAgT1BKX1VJTlQzMiBzYV9saW5lLAorICAgICAgICBPUEpfVUlOVDMyIHJlbWFpbmluZ19oZWlnaHQpCit7CisgICAgT1BKX1VJTlQzMiBpOworICAgIGZvciAoaSA9IDA7IGkgPCByZW1haW5pbmdfaGVpZ2h0OyBpKyspIHsKKyAgICAgICAgT1BKX0JPT0wgcmV0OworICAgICAgICByZXQgPSBvcGpfc3BhcnNlX2FycmF5X2ludDMyX3JlYWQoc2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd3QtPndpbl9sX3gwLCBzYV9saW5lICsgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3dC0+d2luX2xfeDEsIHNhX2xpbmUgKyBpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5hc3R5IGNhc3QgZnJvbSBmbG9hdCogdG8gaW50MzIqICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKikoZHd0LT53YXZlbGV0ICsgZHd0LT5jYXMgKyAyICogZHd0LT53aW5fbF94MCkgKyBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgMCwgT1BKX1RSVUUpOworICAgICAgICBhc3NlcnQocmV0KTsKKyAgICAgICAgcmV0ID0gb3BqX3NwYXJzZV9hcnJheV9pbnQzMl9yZWFkKHNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9VSU5UMzIpZHd0LT5zbiArIGR3dC0+d2luX2hfeDAsIHNhX2xpbmUgKyBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9VSU5UMzIpZHd0LT5zbiArIGR3dC0+d2luX2hfeDEsIHNhX2xpbmUgKyBpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5hc3R5IGNhc3QgZnJvbSBmbG9hdCogdG8gaW50MzIqICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKikoZHd0LT53YXZlbGV0ICsgMSAtIGR3dC0+Y2FzICsgMiAqIGR3dC0+d2luX2hfeDApICsgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgsIDAsIE9QSl9UUlVFKTsKKyAgICAgICAgYXNzZXJ0KHJldCk7CisgICAgICAgIE9QSl9VTlVTRUQocmV0KTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG9wal92NGR3dF9pbnRlcmxlYXZlX3Yob3BqX3Y0ZHd0X3QqIE9QSl9SRVNUUklDVCBkd3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyKiBPUEpfUkVTVFJJQ1QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBuYl9lbHRzX3JlYWQpCit7CisgICAgb3BqX3Y0X3QqIE9QSl9SRVNUUklDVCBiaSA9IGR3dC0+d2F2ZWxldCArIGR3dC0+Y2FzOworICAgIE9QSl9VSU5UMzIgaTsKKworICAgIGZvciAoaSA9IGR3dC0+d2luX2xfeDA7IGkgPCBkd3QtPndpbl9sX3gxOyArK2kpIHsKKyAgICAgICAgbWVtY3B5KCZiaVtpICogMl0sICZhW2kgKiAoT1BKX1NJWkVfVCl3aWR0aF0sCisgICAgICAgICAgICAgICAoT1BKX1NJWkVfVCluYl9lbHRzX3JlYWQgKiBzaXplb2YoT1BKX0ZMT0FUMzIpKTsKKyAgICB9CisKKyAgICBhICs9IChPUEpfVUlOVDMyKWR3dC0+c24gKiAoT1BKX1NJWkVfVCl3aWR0aDsKKyAgICBiaSA9IGR3dC0+d2F2ZWxldCArIDEgLSBkd3QtPmNhczsKKworICAgIGZvciAoaSA9IGR3dC0+d2luX2hfeDA7IGkgPCBkd3QtPndpbl9oX3gxOyArK2kpIHsKKyAgICAgICAgbWVtY3B5KCZiaVtpICogMl0sICZhW2kgKiAoT1BKX1NJWkVfVCl3aWR0aF0sCisgICAgICAgICAgICAgICAoT1BKX1NJWkVfVCluYl9lbHRzX3JlYWQgKiBzaXplb2YoT1BKX0ZMT0FUMzIpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIG9wal92NGR3dF9pbnRlcmxlYXZlX3BhcnRpYWxfdihvcGpfdjRkd3RfdCogT1BKX1JFU1RSSUNUIGR3dCwKKyAgICAgICAgb3BqX3NwYXJzZV9hcnJheV9pbnQzMl90KiBzYSwKKyAgICAgICAgT1BKX1VJTlQzMiBzYV9jb2wsCisgICAgICAgIE9QSl9VSU5UMzIgbmJfZWx0c19yZWFkKQoreworICAgIE9QSl9CT09MIHJldDsKKyAgICByZXQgPSBvcGpfc3BhcnNlX2FycmF5X2ludDMyX3JlYWQoc2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhX2NvbCwgZHd0LT53aW5fbF94MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FfY29sICsgbmJfZWx0c19yZWFkLCBkd3QtPndpbl9sX3gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKikoZHd0LT53YXZlbGV0ICsgZHd0LT5jYXMgKyAyICogZHd0LT53aW5fbF94MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDgsIE9QSl9UUlVFKTsKKyAgICBhc3NlcnQocmV0KTsKKyAgICByZXQgPSBvcGpfc3BhcnNlX2FycmF5X2ludDMyX3JlYWQoc2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhX2NvbCwgKE9QSl9VSU5UMzIpZHd0LT5zbiArIGR3dC0+d2luX2hfeDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhX2NvbCArIG5iX2VsdHNfcmVhZCwgKE9QSl9VSU5UMzIpZHd0LT5zbiArIGR3dC0+d2luX2hfeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfSU5UMzIqKShkd3QtPndhdmVsZXQgKyAxIC0gZHd0LT5jYXMgKyAyICogZHd0LT53aW5faF94MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDgsIE9QSl9UUlVFKTsKKyAgICBhc3NlcnQocmV0KTsKKyAgICBPUEpfVU5VU0VEKHJldCk7CiB9CiAKICNpZmRlZiBfX1NTRV9fCiAKLXN0YXRpYyB2b2lkIG9wal92NGR3dF9kZWNvZGVfc3RlcDFfc3NlKG9wal92NF90KiB3LCBPUEpfSU5UMzIgY291bnQsIGNvbnN0IF9fbTEyOCBjKXsKLQlfX20xMjgqIHJlc3RyaWN0IHZ3ID0gKF9fbTEyOCopIHc7Ci0JT1BKX0lOVDMyIGk7Ci0JLyogNHggdW5yb2xsZWQgbG9vcCAqLwotCWZvcihpID0gMDsgaSA8IGNvdW50ID4+IDI7ICsraSl7Ci0JCSp2dyA9IF9tbV9tdWxfcHMoKnZ3LCBjKTsKLQkJdncgKz0gMjsKLQkJKnZ3ID0gX21tX211bF9wcygqdncsIGMpOwotCQl2dyArPSAyOwotCQkqdncgPSBfbW1fbXVsX3BzKCp2dywgYyk7Ci0JCXZ3ICs9IDI7Ci0JCSp2dyA9IF9tbV9tdWxfcHMoKnZ3LCBjKTsKLQkJdncgKz0gMjsKLQl9Ci0JY291bnQgJj0gMzsKLQlmb3IoaSA9IDA7IGkgPCBjb3VudDsgKytpKXsKLQkJKnZ3ID0gX21tX211bF9wcygqdncsIGMpOwotCQl2dyArPSAyOwotCX0KK3N0YXRpYyB2b2lkIG9wal92NGR3dF9kZWNvZGVfc3RlcDFfc3NlKG9wal92NF90KiB3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4IGMpCit7CisgICAgX19tMTI4KiBPUEpfUkVTVFJJQ1QgdncgPSAoX19tMTI4KikgdzsKKyAgICBPUEpfVUlOVDMyIGk7CisgICAgLyogNHggdW5yb2xsZWQgbG9vcCAqLworICAgIHZ3ICs9IDIgKiBzdGFydDsKKyAgICBmb3IgKGkgPSBzdGFydDsgaSArIDMgPCBlbmQ7IGkgKz0gNCwgdncgKz0gOCkgeworICAgICAgICBfX20xMjggeG1tMCA9IF9tbV9tdWxfcHModndbMF0sIGMpOworICAgICAgICBfX20xMjggeG1tMiA9IF9tbV9tdWxfcHModndbMl0sIGMpOworICAgICAgICBfX20xMjggeG1tNCA9IF9tbV9tdWxfcHModndbNF0sIGMpOworICAgICAgICBfX20xMjggeG1tNiA9IF9tbV9tdWxfcHModndbNl0sIGMpOworICAgICAgICB2d1swXSA9IHhtbTA7CisgICAgICAgIHZ3WzJdID0geG1tMjsKKyAgICAgICAgdndbNF0gPSB4bW00OworICAgICAgICB2d1s2XSA9IHhtbTY7CisgICAgfQorICAgIGZvciAoOyBpIDwgZW5kOyArK2ksIHZ3ICs9IDIpIHsKKyAgICAgICAgdndbMF0gPSBfbW1fbXVsX3BzKHZ3WzBdLCBjKTsKKyAgICB9CiB9CiAKLXZvaWQgb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMl9zc2Uob3BqX3Y0X3QqIGwsIG9wal92NF90KiB3LCBPUEpfSU5UMzIgaywgT1BKX0lOVDMyIG0sIF9fbTEyOCBjKXsKLQlfX20xMjgqIHJlc3RyaWN0IHZsID0gKF9fbTEyOCopIGw7Ci0JX19tMTI4KiByZXN0cmljdCB2dyA9IChfX20xMjgqKSB3OwotCU9QSl9JTlQzMiBpOwotCV9fbTEyOCB0bXAxLCB0bXAyLCB0bXAzOwotCXRtcDEgPSB2bFswXTsKLQlmb3IoaSA9IDA7IGkgPCBtOyArK2kpewotCQl0bXAyID0gdndbLTFdOwotCQl0bXAzID0gdndbIDBdOwotCQl2d1stMV0gPSBfbW1fYWRkX3BzKHRtcDIsIF9tbV9tdWxfcHMoX21tX2FkZF9wcyh0bXAxLCB0bXAzKSwgYykpOwotCQl0bXAxID0gdG1wMzsKLQkJdncgKz0gMjsKLQl9Ci0JdmwgPSB2dyAtIDI7Ci0JaWYobSA+PSBrKXsKLQkJcmV0dXJuOwotCX0KLQljID0gX21tX2FkZF9wcyhjLCBjKTsKLQljID0gX21tX211bF9wcyhjLCB2bFswXSk7Ci0JZm9yKDsgbSA8IGs7ICsrbSl7Ci0JCV9fbTEyOCB0bXAgPSB2d1stMV07Ci0JCXZ3Wy0xXSA9IF9tbV9hZGRfcHModG1wLCBjKTsKLQkJdncgKz0gMjsKLQl9CitzdGF0aWMgdm9pZCBvcGpfdjRkd3RfZGVjb2RlX3N0ZXAyX3NzZShvcGpfdjRfdCogbCwgb3BqX3Y0X3QqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjggYykKK3sKKyAgICBfX20xMjgqIE9QSl9SRVNUUklDVCB2bCA9IChfX20xMjgqKSBsOworICAgIF9fbTEyOCogT1BKX1JFU1RSSUNUIHZ3ID0gKF9fbTEyOCopIHc7CisgICAgT1BKX1VJTlQzMiBpOworICAgIE9QSl9VSU5UMzIgaW1heCA9IG9wal91aW50X21pbihlbmQsIG0pOworICAgIF9fbTEyOCB0bXAxLCB0bXAyLCB0bXAzOworICAgIGlmIChzdGFydCA9PSAwKSB7CisgICAgICAgIHRtcDEgPSB2bFswXTsKKyAgICB9IGVsc2UgeworICAgICAgICB2dyArPSBzdGFydCAqIDI7CisgICAgICAgIHRtcDEgPSB2d1stM107CisgICAgfQorCisgICAgaSA9IHN0YXJ0OworCisgICAgLyogNHggbG9vcCB1bnJvbGxpbmcgKi8KKyAgICBmb3IgKDsgaSArIDMgPCBpbWF4OyBpICs9IDQpIHsKKyAgICAgICAgX19tMTI4IHRtcDQsIHRtcDUsIHRtcDYsIHRtcDcsIHRtcDgsIHRtcDk7CisgICAgICAgIHRtcDIgPSB2d1stMV07CisgICAgICAgIHRtcDMgPSB2d1sgMF07CisgICAgICAgIHRtcDQgPSB2d1sgMV07CisgICAgICAgIHRtcDUgPSB2d1sgMl07CisgICAgICAgIHRtcDYgPSB2d1sgM107CisgICAgICAgIHRtcDcgPSB2d1sgNF07CisgICAgICAgIHRtcDggPSB2d1sgNV07CisgICAgICAgIHRtcDkgPSB2d1sgNl07CisgICAgICAgIHZ3Wy0xXSA9IF9tbV9hZGRfcHModG1wMiwgX21tX211bF9wcyhfbW1fYWRkX3BzKHRtcDEsIHRtcDMpLCBjKSk7CisgICAgICAgIHZ3WyAxXSA9IF9tbV9hZGRfcHModG1wNCwgX21tX211bF9wcyhfbW1fYWRkX3BzKHRtcDMsIHRtcDUpLCBjKSk7CisgICAgICAgIHZ3WyAzXSA9IF9tbV9hZGRfcHModG1wNiwgX21tX211bF9wcyhfbW1fYWRkX3BzKHRtcDUsIHRtcDcpLCBjKSk7CisgICAgICAgIHZ3WyA1XSA9IF9tbV9hZGRfcHModG1wOCwgX21tX211bF9wcyhfbW1fYWRkX3BzKHRtcDcsIHRtcDkpLCBjKSk7CisgICAgICAgIHRtcDEgPSB0bXA5OworICAgICAgICB2dyArPSA4OworICAgIH0KKworICAgIGZvciAoOyBpIDwgaW1heDsgKytpKSB7CisgICAgICAgIHRtcDIgPSB2d1stMV07CisgICAgICAgIHRtcDMgPSB2d1sgMF07CisgICAgICAgIHZ3Wy0xXSA9IF9tbV9hZGRfcHModG1wMiwgX21tX211bF9wcyhfbW1fYWRkX3BzKHRtcDEsIHRtcDMpLCBjKSk7CisgICAgICAgIHRtcDEgPSB0bXAzOworICAgICAgICB2dyArPSAyOworICAgIH0KKyAgICBpZiAobSA8IGVuZCkgeworICAgICAgICBhc3NlcnQobSArIDEgPT0gZW5kKTsKKyAgICAgICAgYyA9IF9tbV9hZGRfcHMoYywgYyk7CisgICAgICAgIGMgPSBfbW1fbXVsX3BzKGMsIHZ3Wy0yXSk7CisgICAgICAgIHZ3Wy0xXSA9IF9tbV9hZGRfcHModndbLTFdLCBjKTsKKyAgICB9CiB9CiAKICNlbHNlCiAKLXN0YXRpYyB2b2lkIG9wal92NGR3dF9kZWNvZGVfc3RlcDEob3BqX3Y0X3QqIHcsIE9QSl9JTlQzMiBjb3VudCwgY29uc3QgT1BKX0ZMT0FUMzIgYykKK3N0YXRpYyB2b2lkIG9wal92NGR3dF9kZWNvZGVfc3RlcDEob3BqX3Y0X3QqIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfRkxPQVQzMiBjKQogewotCU9QSl9GTE9BVDMyKiByZXN0cmljdCBmdyA9IChPUEpfRkxPQVQzMiopIHc7Ci0JT1BKX0lOVDMyIGk7Ci0JZm9yKGkgPSAwOyBpIDwgY291bnQ7ICsraSl7Ci0JCU9QSl9GTE9BVDMyIHRtcDEgPSBmd1tpKjggICAgXTsKLQkJT1BKX0ZMT0FUMzIgdG1wMiA9IGZ3W2kqOCArIDFdOwotCQlPUEpfRkxPQVQzMiB0bXAzID0gZndbaSo4ICsgMl07Ci0JCU9QSl9GTE9BVDMyIHRtcDQgPSBmd1tpKjggKyAzXTsKLQkJZndbaSo4ICAgIF0gPSB0bXAxICogYzsKLQkJZndbaSo4ICsgMV0gPSB0bXAyICogYzsKLQkJZndbaSo4ICsgMl0gPSB0bXAzICogYzsKLQkJZndbaSo4ICsgM10gPSB0bXA0ICogYzsKLQl9CisgICAgT1BKX0ZMT0FUMzIqIE9QSl9SRVNUUklDVCBmdyA9IChPUEpfRkxPQVQzMiopIHc7CisgICAgT1BKX1VJTlQzMiBpOworICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHsKKyAgICAgICAgT1BKX0ZMT0FUMzIgdG1wMSA9IGZ3W2kgKiA4ICAgIF07CisgICAgICAgIE9QSl9GTE9BVDMyIHRtcDIgPSBmd1tpICogOCArIDFdOworICAgICAgICBPUEpfRkxPQVQzMiB0bXAzID0gZndbaSAqIDggKyAyXTsKKyAgICAgICAgT1BKX0ZMT0FUMzIgdG1wNCA9IGZ3W2kgKiA4ICsgM107CisgICAgICAgIGZ3W2kgKiA4ICAgIF0gPSB0bXAxICogYzsKKyAgICAgICAgZndbaSAqIDggKyAxXSA9IHRtcDIgKiBjOworICAgICAgICBmd1tpICogOCArIDJdID0gdG1wMyAqIGM7CisgICAgICAgIGZ3W2kgKiA4ICsgM10gPSB0bXA0ICogYzsKKyAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIG9wal92NGR3dF9kZWNvZGVfc3RlcDIob3BqX3Y0X3QqIGwsIG9wal92NF90KiB3LCBPUEpfSU5UMzIgaywgT1BKX0lOVDMyIG0sIE9QSl9GTE9BVDMyIGMpCitzdGF0aWMgdm9pZCBvcGpfdjRkd3RfZGVjb2RlX3N0ZXAyKG9wal92NF90KiBsLCBvcGpfdjRfdCogdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgYykKIHsKLQlPUEpfRkxPQVQzMiogcmVzdHJpY3QgZmwgPSAoT1BKX0ZMT0FUMzIqKSBsOwotCU9QSl9GTE9BVDMyKiByZXN0cmljdCBmdyA9IChPUEpfRkxPQVQzMiopIHc7Ci0JT1BKX0lOVDMyIGk7Ci0JZm9yKGkgPSAwOyBpIDwgbTsgKytpKXsKLQkJT1BKX0ZMT0FUMzIgdG1wMV8xID0gZmxbMF07Ci0JCU9QSl9GTE9BVDMyIHRtcDFfMiA9IGZsWzFdOwotCQlPUEpfRkxPQVQzMiB0bXAxXzMgPSBmbFsyXTsKLQkJT1BKX0ZMT0FUMzIgdG1wMV80ID0gZmxbM107Ci0JCU9QSl9GTE9BVDMyIHRtcDJfMSA9IGZ3Wy00XTsKLQkJT1BKX0ZMT0FUMzIgdG1wMl8yID0gZndbLTNdOwotCQlPUEpfRkxPQVQzMiB0bXAyXzMgPSBmd1stMl07Ci0JCU9QSl9GTE9BVDMyIHRtcDJfNCA9IGZ3Wy0xXTsKLQkJT1BKX0ZMT0FUMzIgdG1wM18xID0gZndbMF07Ci0JCU9QSl9GTE9BVDMyIHRtcDNfMiA9IGZ3WzFdOwotCQlPUEpfRkxPQVQzMiB0bXAzXzMgPSBmd1syXTsKLQkJT1BKX0ZMT0FUMzIgdG1wM180ID0gZndbM107Ci0JCWZ3Wy00XSA9IHRtcDJfMSArICgodG1wMV8xICsgdG1wM18xKSAqIGMpOwotCQlmd1stM10gPSB0bXAyXzIgKyAoKHRtcDFfMiArIHRtcDNfMikgKiBjKTsKLQkJZndbLTJdID0gdG1wMl8zICsgKCh0bXAxXzMgKyB0bXAzXzMpICogYyk7Ci0JCWZ3Wy0xXSA9IHRtcDJfNCArICgodG1wMV80ICsgdG1wM180KSAqIGMpOwotCQlmbCA9IGZ3OwotCQlmdyArPSA4OwotCX0KLQlpZihtIDwgayl7Ci0JCU9QSl9GTE9BVDMyIGMxOwotCQlPUEpfRkxPQVQzMiBjMjsKLQkJT1BKX0ZMT0FUMzIgYzM7Ci0JCU9QSl9GTE9BVDMyIGM0OwotCQljICs9IGM7Ci0JCWMxID0gZmxbMF0gKiBjOwotCQljMiA9IGZsWzFdICogYzsKLQkJYzMgPSBmbFsyXSAqIGM7Ci0JCWM0ID0gZmxbM10gKiBjOwotCQlmb3IoOyBtIDwgazsgKyttKXsKLQkJCU9QSl9GTE9BVDMyIHRtcDEgPSBmd1stNF07Ci0JCQlPUEpfRkxPQVQzMiB0bXAyID0gZndbLTNdOwotCQkJT1BKX0ZMT0FUMzIgdG1wMyA9IGZ3Wy0yXTsKLQkJCU9QSl9GTE9BVDMyIHRtcDQgPSBmd1stMV07Ci0JCQlmd1stNF0gPSB0bXAxICsgYzE7Ci0JCQlmd1stM10gPSB0bXAyICsgYzI7Ci0JCQlmd1stMl0gPSB0bXAzICsgYzM7Ci0JCQlmd1stMV0gPSB0bXA0ICsgYzQ7Ci0JCQlmdyArPSA4OwotCQl9Ci0JfQorICAgIE9QSl9GTE9BVDMyKiBmbCA9IChPUEpfRkxPQVQzMiopIGw7CisgICAgT1BKX0ZMT0FUMzIqIGZ3ID0gKE9QSl9GTE9BVDMyKikgdzsKKyAgICBPUEpfVUlOVDMyIGk7CisgICAgT1BKX1VJTlQzMiBpbWF4ID0gb3BqX3VpbnRfbWluKGVuZCwgbSk7CisgICAgaWYgKHN0YXJ0ID4gMCkgeworICAgICAgICBmdyArPSA4ICogc3RhcnQ7CisgICAgICAgIGZsID0gZncgLSA4OworICAgIH0KKyAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGltYXg7ICsraSkgeworICAgICAgICBPUEpfRkxPQVQzMiB0bXAxXzEgPSBmbFswXTsKKyAgICAgICAgT1BKX0ZMT0FUMzIgdG1wMV8yID0gZmxbMV07CisgICAgICAgIE9QSl9GTE9BVDMyIHRtcDFfMyA9IGZsWzJdOworICAgICAgICBPUEpfRkxPQVQzMiB0bXAxXzQgPSBmbFszXTsKKyAgICAgICAgT1BKX0ZMT0FUMzIgdG1wMl8xID0gZndbLTRdOworICAgICAgICBPUEpfRkxPQVQzMiB0bXAyXzIgPSBmd1stM107CisgICAgICAgIE9QSl9GTE9BVDMyIHRtcDJfMyA9IGZ3Wy0yXTsKKyAgICAgICAgT1BKX0ZMT0FUMzIgdG1wMl80ID0gZndbLTFdOworICAgICAgICBPUEpfRkxPQVQzMiB0bXAzXzEgPSBmd1swXTsKKyAgICAgICAgT1BKX0ZMT0FUMzIgdG1wM18yID0gZndbMV07CisgICAgICAgIE9QSl9GTE9BVDMyIHRtcDNfMyA9IGZ3WzJdOworICAgICAgICBPUEpfRkxPQVQzMiB0bXAzXzQgPSBmd1szXTsKKyAgICAgICAgZndbLTRdID0gdG1wMl8xICsgKCh0bXAxXzEgKyB0bXAzXzEpICogYyk7CisgICAgICAgIGZ3Wy0zXSA9IHRtcDJfMiArICgodG1wMV8yICsgdG1wM18yKSAqIGMpOworICAgICAgICBmd1stMl0gPSB0bXAyXzMgKyAoKHRtcDFfMyArIHRtcDNfMykgKiBjKTsKKyAgICAgICAgZndbLTFdID0gdG1wMl80ICsgKCh0bXAxXzQgKyB0bXAzXzQpICogYyk7CisgICAgICAgIGZsID0gZnc7CisgICAgICAgIGZ3ICs9IDg7CisgICAgfQorICAgIGlmIChtIDwgZW5kKSB7CisgICAgICAgIGFzc2VydChtICsgMSA9PSBlbmQpOworICAgICAgICBjICs9IGM7CisgICAgICAgIGZ3Wy00XSA9IGZ3Wy00XSArIGZsWzBdICogYzsKKyAgICAgICAgZndbLTNdID0gZndbLTNdICsgZmxbMV0gKiBjOworICAgICAgICBmd1stMl0gPSBmd1stMl0gKyBmbFsyXSAqIGM7CisgICAgICAgIGZ3Wy0xXSA9IGZ3Wy0xXSArIGZsWzNdICogYzsKKyAgICB9CiB9CiAKICNlbmRpZgpAQCAtODA0LDM2ICsyNDUyLDY0IEBACiAvKiA8c3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBJbnZlcnNlIDktNyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAxLUQuICovCiAvKiA8L3N1bW1hcnk+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi12b2lkIG9wal92NGR3dF9kZWNvZGUob3BqX3Y0ZHd0X3QqIHJlc3RyaWN0IGR3dCkKK3N0YXRpYyB2b2lkIG9wal92NGR3dF9kZWNvZGUob3BqX3Y0ZHd0X3QqIE9QSl9SRVNUUklDVCBkd3QpCiB7Ci0JT1BKX0lOVDMyIGEsIGI7Ci0JaWYoZHd0LT5jYXMgPT0gMCkgewotCQlpZighKChkd3QtPmRuID4gMCkgfHwgKGR3dC0+c24gPiAxKSkpewotCQkJcmV0dXJuOwotCQl9Ci0JCWEgPSAwOwotCQliID0gMTsKLQl9ZWxzZXsKLQkJaWYoISgoZHd0LT5zbiA+IDApIHx8IChkd3QtPmRuID4gMSkpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYSA9IDE7Ci0JCWIgPSAwOwotCX0KKyAgICBPUEpfSU5UMzIgYSwgYjsKKyAgICBpZiAoZHd0LT5jYXMgPT0gMCkgeworICAgICAgICBpZiAoISgoZHd0LT5kbiA+IDApIHx8IChkd3QtPnNuID4gMSkpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYSA9IDA7CisgICAgICAgIGIgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghKChkd3QtPnNuID4gMCkgfHwgKGR3dC0+ZG4gPiAxKSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBhID0gMTsKKyAgICAgICAgYiA9IDA7CisgICAgfQogI2lmZGVmIF9fU1NFX18KLQlvcGpfdjRkd3RfZGVjb2RlX3N0ZXAxX3NzZShkd3QtPndhdmVsZXQrYSwgZHd0LT5zbiwgX21tX3NldDFfcHMob3BqX0spKTsKLQlvcGpfdjRkd3RfZGVjb2RlX3N0ZXAxX3NzZShkd3QtPndhdmVsZXQrYiwgZHd0LT5kbiwgX21tX3NldDFfcHMob3BqX2MxMzMxOCkpOwotCW9wal92NGR3dF9kZWNvZGVfc3RlcDJfc3NlKGR3dC0+d2F2ZWxldCtiLCBkd3QtPndhdmVsZXQrYSsxLCBkd3QtPnNuLCBvcGpfaW50X21pbihkd3QtPnNuLCBkd3QtPmRuLWEpLCBfbW1fc2V0MV9wcyhvcGpfZHd0X2RlbHRhKSk7Ci0Jb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMl9zc2UoZHd0LT53YXZlbGV0K2EsIGR3dC0+d2F2ZWxldCtiKzEsIGR3dC0+ZG4sIG9wal9pbnRfbWluKGR3dC0+ZG4sIGR3dC0+c24tYiksIF9tbV9zZXQxX3BzKG9wal9kd3RfZ2FtbWEpKTsKLQlvcGpfdjRkd3RfZGVjb2RlX3N0ZXAyX3NzZShkd3QtPndhdmVsZXQrYiwgZHd0LT53YXZlbGV0K2ErMSwgZHd0LT5zbiwgb3BqX2ludF9taW4oZHd0LT5zbiwgZHd0LT5kbi1hKSwgX21tX3NldDFfcHMob3BqX2R3dF9iZXRhKSk7Ci0Jb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMl9zc2UoZHd0LT53YXZlbGV0K2EsIGR3dC0+d2F2ZWxldCtiKzEsIGR3dC0+ZG4sIG9wal9pbnRfbWluKGR3dC0+ZG4sIGR3dC0+c24tYiksIF9tbV9zZXQxX3BzKG9wal9kd3RfYWxwaGEpKTsKKyAgICBvcGpfdjRkd3RfZGVjb2RlX3N0ZXAxX3NzZShkd3QtPndhdmVsZXQgKyBhLCBkd3QtPndpbl9sX3gwLCBkd3QtPndpbl9sX3gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9zZXQxX3BzKG9wal9LKSk7CisgICAgb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMV9zc2UoZHd0LT53YXZlbGV0ICsgYiwgZHd0LT53aW5faF94MCwgZHd0LT53aW5faF94MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1fc2V0MV9wcyhvcGpfYzEzMzE4KSk7CisgICAgb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMl9zc2UoZHd0LT53YXZlbGV0ICsgYiwgZHd0LT53YXZlbGV0ICsgYSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHd0LT53aW5fbF94MCwgZHd0LT53aW5fbF94MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMilvcGpfaW50X21pbihkd3QtPnNuLCBkd3QtPmRuIC0gYSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX3NldDFfcHMob3BqX2R3dF9kZWx0YSkpOworICAgIG9wal92NGR3dF9kZWNvZGVfc3RlcDJfc3NlKGR3dC0+d2F2ZWxldCArIGEsIGR3dC0+d2F2ZWxldCArIGIgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3dC0+d2luX2hfeDAsIGR3dC0+d2luX2hfeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9VSU5UMzIpb3BqX2ludF9taW4oZHd0LT5kbiwgZHd0LT5zbiAtIGIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9zZXQxX3BzKG9wal9kd3RfZ2FtbWEpKTsKKyAgICBvcGpfdjRkd3RfZGVjb2RlX3N0ZXAyX3NzZShkd3QtPndhdmVsZXQgKyBiLCBkd3QtPndhdmVsZXQgKyBhICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd3QtPndpbl9sX3gwLCBkd3QtPndpbl9sX3gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfVUlOVDMyKW9wal9pbnRfbWluKGR3dC0+c24sIGR3dC0+ZG4gLSBhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1fc2V0MV9wcyhvcGpfZHd0X2JldGEpKTsKKyAgICBvcGpfdjRkd3RfZGVjb2RlX3N0ZXAyX3NzZShkd3QtPndhdmVsZXQgKyBhLCBkd3QtPndhdmVsZXQgKyBiICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd3QtPndpbl9oX3gwLCBkd3QtPndpbl9oX3gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfVUlOVDMyKW9wal9pbnRfbWluKGR3dC0+ZG4sIGR3dC0+c24gLSBiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1fc2V0MV9wcyhvcGpfZHd0X2FscGhhKSk7CiAjZWxzZQotCW9wal92NGR3dF9kZWNvZGVfc3RlcDEoZHd0LT53YXZlbGV0K2EsIGR3dC0+c24sIG9wal9LKTsKLQlvcGpfdjRkd3RfZGVjb2RlX3N0ZXAxKGR3dC0+d2F2ZWxldCtiLCBkd3QtPmRuLCBvcGpfYzEzMzE4KTsKLQlvcGpfdjRkd3RfZGVjb2RlX3N0ZXAyKGR3dC0+d2F2ZWxldCtiLCBkd3QtPndhdmVsZXQrYSsxLCBkd3QtPnNuLCBvcGpfaW50X21pbihkd3QtPnNuLCBkd3QtPmRuLWEpLCBvcGpfZHd0X2RlbHRhKTsKLQlvcGpfdjRkd3RfZGVjb2RlX3N0ZXAyKGR3dC0+d2F2ZWxldCthLCBkd3QtPndhdmVsZXQrYisxLCBkd3QtPmRuLCBvcGpfaW50X21pbihkd3QtPmRuLCBkd3QtPnNuLWIpLCBvcGpfZHd0X2dhbW1hKTsKLQlvcGpfdjRkd3RfZGVjb2RlX3N0ZXAyKGR3dC0+d2F2ZWxldCtiLCBkd3QtPndhdmVsZXQrYSsxLCBkd3QtPnNuLCBvcGpfaW50X21pbihkd3QtPnNuLCBkd3QtPmRuLWEpLCBvcGpfZHd0X2JldGEpOwotCW9wal92NGR3dF9kZWNvZGVfc3RlcDIoZHd0LT53YXZlbGV0K2EsIGR3dC0+d2F2ZWxldCtiKzEsIGR3dC0+ZG4sIG9wal9pbnRfbWluKGR3dC0+ZG4sIGR3dC0+c24tYiksIG9wal9kd3RfYWxwaGEpOworICAgIG9wal92NGR3dF9kZWNvZGVfc3RlcDEoZHd0LT53YXZlbGV0ICsgYSwgZHd0LT53aW5fbF94MCwgZHd0LT53aW5fbF94MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9LKTsKKyAgICBvcGpfdjRkd3RfZGVjb2RlX3N0ZXAxKGR3dC0+d2F2ZWxldCArIGIsIGR3dC0+d2luX2hfeDAsIGR3dC0+d2luX2hfeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfYzEzMzE4KTsKKyAgICBvcGpfdjRkd3RfZGVjb2RlX3N0ZXAyKGR3dC0+d2F2ZWxldCArIGIsIGR3dC0+d2F2ZWxldCArIGEgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHd0LT53aW5fbF94MCwgZHd0LT53aW5fbF94MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfVUlOVDMyKW9wal9pbnRfbWluKGR3dC0+c24sIGR3dC0+ZG4gLSBhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9kd3RfZGVsdGEpOworICAgIG9wal92NGR3dF9kZWNvZGVfc3RlcDIoZHd0LT53YXZlbGV0ICsgYSwgZHd0LT53YXZlbGV0ICsgYiArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkd3QtPndpbl9oX3gwLCBkd3QtPndpbl9oX3gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9VSU5UMzIpb3BqX2ludF9taW4oZHd0LT5kbiwgZHd0LT5zbiAtIGIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2R3dF9nYW1tYSk7CisgICAgb3BqX3Y0ZHd0X2RlY29kZV9zdGVwMihkd3QtPndhdmVsZXQgKyBiLCBkd3QtPndhdmVsZXQgKyBhICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3dC0+d2luX2xfeDAsIGR3dC0+d2luX2xfeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMilvcGpfaW50X21pbihkd3QtPnNuLCBkd3QtPmRuIC0gYSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZHd0X2JldGEpOworICAgIG9wal92NGR3dF9kZWNvZGVfc3RlcDIoZHd0LT53YXZlbGV0ICsgYSwgZHd0LT53YXZlbGV0ICsgYiArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkd3QtPndpbl9oX3gwLCBkd3QtPndpbl9oX3gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9VSU5UMzIpb3BqX2ludF9taW4oZHd0LT5kbiwgZHd0LT5zbiAtIGIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2R3dF9hbHBoYSk7CiAjZW5kaWYKIH0KIApAQCAtODQxLDExMSArMjUxNywzODQgQEAKIC8qIDxzdW1tYXJ5PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEludmVyc2UgOS03IHdhdmVsZXQgdHJhbnNmb3JtIGluIDItRC4gKi8KIC8qIDwvc3VtbWFyeT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLU9QSl9CT09MIG9wal9kd3RfZGVjb2RlX3JlYWwob3BqX3RjZF90aWxlY29tcF90KiByZXN0cmljdCB0aWxlYywgT1BKX1VJTlQzMiBudW1yZXMpCitzdGF0aWMKK09QSl9CT09MIG9wal9kd3RfZGVjb2RlX3RpbGVfOTcob3BqX3RjZF90aWxlY29tcF90KiBPUEpfUkVTVFJJQ1QgdGlsZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbnVtcmVzKQogewotCW9wal92NGR3dF90IGg7Ci0Jb3BqX3Y0ZHd0X3QgdjsKKyAgICBvcGpfdjRkd3RfdCBoOworICAgIG9wal92NGR3dF90IHY7CiAKLQlvcGpfdGNkX3Jlc29sdXRpb25fdCogcmVzID0gdGlsZWMtPnJlc29sdXRpb25zOworICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiByZXMgPSB0aWxlYy0+cmVzb2x1dGlvbnM7CiAKLQlPUEpfVUlOVDMyIHJ3ID0gKE9QSl9VSU5UMzIpKHJlcy0+eDEgLSByZXMtPngwKTsJLyogd2lkdGggb2YgdGhlIHJlc29sdXRpb24gbGV2ZWwgY29tcHV0ZWQgKi8KLQlPUEpfVUlOVDMyIHJoID0gKE9QSl9VSU5UMzIpKHJlcy0+eTEgLSByZXMtPnkwKTsJLyogaGVpZ2h0IG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIGNvbXB1dGVkICovCisgICAgT1BKX1VJTlQzMiBydyA9IChPUEpfVUlOVDMyKShyZXMtPngxIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy0+eDApOyAgICAvKiB3aWR0aCBvZiB0aGUgcmVzb2x1dGlvbiBsZXZlbCBjb21wdXRlZCAqLworICAgIE9QSl9VSU5UMzIgcmggPSAoT1BKX1VJTlQzMikocmVzLT55MSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMtPnkwKTsgICAgLyogaGVpZ2h0IG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIGNvbXB1dGVkICovCiAKLQlPUEpfVUlOVDMyIHcgPSAoT1BKX1VJTlQzMikodGlsZWMtPngxIC0gdGlsZWMtPngwKTsKKyAgICBPUEpfVUlOVDMyIHcgPSAoT1BKX1VJTlQzMikodGlsZWMtPnJlc29sdXRpb25zW3RpbGVjLT5taW5pbXVtX251bV9yZXNvbHV0aW9ucyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxXS54MSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVjLT5yZXNvbHV0aW9uc1t0aWxlYy0+bWluaW11bV9udW1fcmVzb2x1dGlvbnMgLSAxXS54MCk7CiAKLQlPUEpfVUlOVDMyIG1yID0gb3BqX2R3dF9tYXhfcmVzb2x1dGlvbihyZXMsIG51bXJlcyk7CisgICAgT1BKX1NJWkVfVCBsX2RhdGFfc2l6ZTsKIAotCWlmIChtciA+PSAoKE9QSl9VSU5UMzIpLTUpKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCW1yICs9IDU7CisgICAgbF9kYXRhX3NpemUgPSBvcGpfZHd0X21heF9yZXNvbHV0aW9uKHJlcywgbnVtcmVzKTsKKyAgICAvKiBvdmVyZmxvdyBjaGVjayAqLworICAgIGlmIChsX2RhdGFfc2l6ZSA+IChTSVpFX01BWCAtIDVVKSkgeworICAgICAgICAvKiBGSVhNRSBldmVudCBtYW5hZ2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGxfZGF0YV9zaXplICs9IDVVOworICAgIC8qIG92ZXJmbG93IGNoZWNrICovCisgICAgaWYgKGxfZGF0YV9zaXplID4gKFNJWkVfTUFYIC8gc2l6ZW9mKG9wal92NF90KSkpIHsKKyAgICAgICAgLyogRklYTUUgZXZlbnQgbWFuYWdlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICBoLndhdmVsZXQgPSAob3BqX3Y0X3QqKSBvcGpfYWxpZ25lZF9tYWxsb2MobF9kYXRhX3NpemUgKiBzaXplb2Yob3BqX3Y0X3QpKTsKKyAgICBpZiAoIWgud2F2ZWxldCkgeworICAgICAgICAvKiBGSVhNRSBldmVudCBtYW5hZ2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIHYud2F2ZWxldCA9IGgud2F2ZWxldDsKIAotCWlmICgoKE9QSl9VSU5UMzIpLTEpIC8gKE9QSl9VSU5UMzIpc2l6ZW9mKG9wal92NF90KSA8IG1yKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCWgud2F2ZWxldCA9IChvcGpfdjRfdCopIG9wal9hbGlnbmVkX21hbGxvYyhtciAqIHNpemVvZihvcGpfdjRfdCkpOwotCWlmICghaC53YXZlbGV0KSB7Ci0JCS8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0Jdi53YXZlbGV0ID0gaC53YXZlbGV0OworICAgIHdoaWxlICgtLW51bXJlcykgeworICAgICAgICBPUEpfRkxPQVQzMiAqIE9QSl9SRVNUUklDVCBhaiA9IChPUEpfRkxPQVQzMiopIHRpbGVjLT5kYXRhOworICAgICAgICBPUEpfVUlOVDMyIGo7CiAKLQl3aGlsZSggLS1udW1yZXMpIHsKLQkJT1BKX0ZMT0FUMzIgKiByZXN0cmljdCBhaiA9IChPUEpfRkxPQVQzMiopIHRpbGVjLT5kYXRhOwotCQlPUEpfVUlOVDMyIGJ1ZnNpemUgPSAoT1BKX1VJTlQzMikoKHRpbGVjLT54MSAtIHRpbGVjLT54MCkgKiAodGlsZWMtPnkxIC0gdGlsZWMtPnkwKSk7Ci0JCU9QSl9JTlQzMiBqOworICAgICAgICBoLnNuID0gKE9QSl9JTlQzMilydzsKKyAgICAgICAgdi5zbiA9IChPUEpfSU5UMzIpcmg7CiAKLQkJaC5zbiA9IChPUEpfSU5UMzIpcnc7Ci0JCXYuc24gPSAoT1BKX0lOVDMyKXJoOworICAgICAgICArK3JlczsKIAotCQkrK3JlczsKKyAgICAgICAgcncgPSAoT1BKX1VJTlQzMikocmVzLT54MSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy0+eDApOyAgIC8qIHdpZHRoIG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIGNvbXB1dGVkICovCisgICAgICAgIHJoID0gKE9QSl9VSU5UMzIpKHJlcy0+eTEgLQorICAgICAgICAgICAgICAgICAgICAgICAgICByZXMtPnkwKTsgICAvKiBoZWlnaHQgb2YgdGhlIHJlc29sdXRpb24gbGV2ZWwgY29tcHV0ZWQgKi8KIAotCQlydyA9IChPUEpfVUlOVDMyKShyZXMtPngxIC0gcmVzLT54MCk7CS8qIHdpZHRoIG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIGNvbXB1dGVkICovCi0JCXJoID0gKE9QSl9VSU5UMzIpKHJlcy0+eTEgLSByZXMtPnkwKTsJLyogaGVpZ2h0IG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIGNvbXB1dGVkICovCisgICAgICAgIGguZG4gPSAoT1BKX0lOVDMyKShydyAtIChPUEpfVUlOVDMyKWguc24pOworICAgICAgICBoLmNhcyA9IHJlcy0+eDAgJSAyOwogCi0JCWguZG4gPSAoT1BKX0lOVDMyKShydyAtIChPUEpfVUlOVDMyKWguc24pOwotCQloLmNhcyA9IHJlcy0+eDAgJSAyOworICAgICAgICBoLndpbl9sX3gwID0gMDsKKyAgICAgICAgaC53aW5fbF94MSA9IChPUEpfVUlOVDMyKWguc247CisgICAgICAgIGgud2luX2hfeDAgPSAwOworICAgICAgICBoLndpbl9oX3gxID0gKE9QSl9VSU5UMzIpaC5kbjsKKyAgICAgICAgZm9yIChqID0gMDsgaiArIDMgPCByaDsgaiArPSA0KSB7CisgICAgICAgICAgICBPUEpfVUlOVDMyIGs7CisgICAgICAgICAgICBvcGpfdjRkd3RfaW50ZXJsZWF2ZV9oKCZoLCBhaiwgdywgcmggLSBqKTsKKyAgICAgICAgICAgIG9wal92NGR3dF9kZWNvZGUoJmgpOwogCi0JCWZvcihqID0gKE9QSl9JTlQzMilyaDsgaiA+IDM7IGogLT0gNCkgewotCQkJT1BKX0lOVDMyIGs7Ci0JCQlvcGpfdjRkd3RfaW50ZXJsZWF2ZV9oKCZoLCBhaiwgKE9QSl9JTlQzMil3LCAoT1BKX0lOVDMyKWJ1ZnNpemUpOwotCQkJb3BqX3Y0ZHd0X2RlY29kZSgmaCk7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcnc7IGsrKykgeworICAgICAgICAgICAgICAgIGFqW2sgICAgICBdID0gaC53YXZlbGV0W2tdLmZbMF07CisgICAgICAgICAgICAgICAgYWpbayArIChPUEpfU0laRV9UKXcgIF0gPSBoLndhdmVsZXRba10uZlsxXTsKKyAgICAgICAgICAgICAgICBhaltrICsgKE9QSl9TSVpFX1QpdyAqIDJdID0gaC53YXZlbGV0W2tdLmZbMl07CisgICAgICAgICAgICAgICAgYWpbayArIChPUEpfU0laRV9UKXcgKiAzXSA9IGgud2F2ZWxldFtrXS5mWzNdOworICAgICAgICAgICAgfQogCi0JCQlmb3IoayA9IChPUEpfSU5UMzIpcnc7IC0tayA+PSAwOyl7Ci0JCQkJYWpbayAgICAgICAgICAgICAgIF0gPSBoLndhdmVsZXRba10uZlswXTsKLQkJCQlhaltrKyhPUEpfSU5UMzIpdyAgXSA9IGgud2F2ZWxldFtrXS5mWzFdOwotCQkJCWFqW2srKE9QSl9JTlQzMil3KjJdID0gaC53YXZlbGV0W2tdLmZbMl07Ci0JCQkJYWpbaysoT1BKX0lOVDMyKXcqM10gPSBoLndhdmVsZXRba10uZlszXTsKLQkJCX0KKyAgICAgICAgICAgIGFqICs9IHcgKiA0OworICAgICAgICB9CiAKLQkJCWFqICs9IHcqNDsKLQkJCWJ1ZnNpemUgLT0gdyo0OwotCQl9CisgICAgICAgIGlmIChqIDwgcmgpIHsKKyAgICAgICAgICAgIE9QSl9VSU5UMzIgazsKKyAgICAgICAgICAgIG9wal92NGR3dF9pbnRlcmxlYXZlX2goJmgsIGFqLCB3LCByaCAtIGopOworICAgICAgICAgICAgb3BqX3Y0ZHd0X2RlY29kZSgmaCk7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcnc7IGsrKykgeworICAgICAgICAgICAgICAgIHN3aXRjaCAocmggLSBqKSB7CisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICBhaltrICsgKE9QSl9TSVpFX1QpdyAqIDJdID0gaC53YXZlbGV0W2tdLmZbMl07CisgICAgICAgICAgICAgICAgLyogRkFMTFRIUlUgKi8KKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIGFqW2sgKyAoT1BKX1NJWkVfVCl3ICBdID0gaC53YXZlbGV0W2tdLmZbMV07CisgICAgICAgICAgICAgICAgLyogRkFMTFRIUlUgKi8KKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIGFqW2tdID0gaC53YXZlbGV0W2tdLmZbMF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJaWYgKHJoICYgMHgwMykgewotCQkJT1BKX0lOVDMyIGs7Ci0JCQlqID0gcmggJiAweDAzOwotCQkJb3BqX3Y0ZHd0X2ludGVybGVhdmVfaCgmaCwgYWosIChPUEpfSU5UMzIpdywgKE9QSl9JTlQzMilidWZzaXplKTsKLQkJCW9wal92NGR3dF9kZWNvZGUoJmgpOwotCQkJZm9yKGsgPSAoT1BKX0lOVDMyKXJ3OyAtLWsgPj0gMDspewotCQkJCXN3aXRjaChqKSB7Ci0JCQkJCWNhc2UgMzogYWpbaysoT1BKX0lOVDMyKXcqMl0gPSBoLndhdmVsZXRba10uZlsyXTsKLQkJCQkJY2FzZSAyOiBhaltrKyhPUEpfSU5UMzIpdyAgXSA9IGgud2F2ZWxldFtrXS5mWzFdOwotCQkJCQljYXNlIDE6IGFqW2sgICAgICAgICAgICAgICBdID0gaC53YXZlbGV0W2tdLmZbMF07Ci0JCQkJfQotCQkJfQotCQl9CisgICAgICAgIHYuZG4gPSAoT1BKX0lOVDMyKShyaCAtIChPUEpfVUlOVDMyKXYuc24pOworICAgICAgICB2LmNhcyA9IHJlcy0+eTAgJSAyOworICAgICAgICB2Lndpbl9sX3gwID0gMDsKKyAgICAgICAgdi53aW5fbF94MSA9IChPUEpfVUlOVDMyKXYuc247CisgICAgICAgIHYud2luX2hfeDAgPSAwOworICAgICAgICB2Lndpbl9oX3gxID0gKE9QSl9VSU5UMzIpdi5kbjsKIAotCQl2LmRuID0gKE9QSl9JTlQzMikocmggLSAoT1BKX1VJTlQzMil2LnNuKTsKLQkJdi5jYXMgPSByZXMtPnkwICUgMjsKKyAgICAgICAgYWogPSAoT1BKX0ZMT0FUMzIqKSB0aWxlYy0+ZGF0YTsKKyAgICAgICAgZm9yIChqID0gcnc7IGogPiAzOyBqIC09IDQpIHsKKyAgICAgICAgICAgIE9QSl9VSU5UMzIgazsKIAotCQlhaiA9IChPUEpfRkxPQVQzMiopIHRpbGVjLT5kYXRhOwotCQlmb3IoaiA9IChPUEpfSU5UMzIpcnc7IGogPiAzOyBqIC09IDQpewotCQkJT1BKX1VJTlQzMiBrOworICAgICAgICAgICAgb3BqX3Y0ZHd0X2ludGVybGVhdmVfdigmdiwgYWosIHcsIDQpOworICAgICAgICAgICAgb3BqX3Y0ZHd0X2RlY29kZSgmdik7CiAKLQkJCW9wal92NGR3dF9pbnRlcmxlYXZlX3YoJnYsIGFqLCAoT1BKX0lOVDMyKXcsIDQpOwotCQkJb3BqX3Y0ZHd0X2RlY29kZSgmdik7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcmg7ICsraykgeworICAgICAgICAgICAgICAgIG1lbWNweSgmYWpbayAqIChPUEpfU0laRV9UKXddLCAmdi53YXZlbGV0W2tdLCA0ICogc2l6ZW9mKE9QSl9GTE9BVDMyKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhaiArPSA0OworICAgICAgICB9CiAKLQkJCWZvcihrID0gMDsgayA8IHJoOyArK2spewotCQkJCW1lbWNweSgmYWpbayp3XSwgJnYud2F2ZWxldFtrXSwgNCAqIHNpemVvZihPUEpfRkxPQVQzMikpOwotCQkJfQotCQkJYWogKz0gNDsKLQkJfQorICAgICAgICBpZiAocncgJiAweDAzKSB7CisgICAgICAgICAgICBPUEpfVUlOVDMyIGs7CiAKLQkJaWYgKHJ3ICYgMHgwMyl7Ci0JCQlPUEpfVUlOVDMyIGs7CisgICAgICAgICAgICBqID0gcncgJiAweDAzOwogCi0JCQlqID0gcncgJiAweDAzOworICAgICAgICAgICAgb3BqX3Y0ZHd0X2ludGVybGVhdmVfdigmdiwgYWosIHcsIGopOworICAgICAgICAgICAgb3BqX3Y0ZHd0X2RlY29kZSgmdik7CiAKLQkJCW9wal92NGR3dF9pbnRlcmxlYXZlX3YoJnYsIGFqLCAoT1BKX0lOVDMyKXcsIGopOwotCQkJb3BqX3Y0ZHd0X2RlY29kZSgmdik7CisgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcmg7ICsraykgeworICAgICAgICAgICAgICAgIG1lbWNweSgmYWpbayAqIChPUEpfU0laRV9UKXddLCAmdi53YXZlbGV0W2tdLAorICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1NJWkVfVClqICogc2l6ZW9mKE9QSl9GTE9BVDMyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLQkJCWZvcihrID0gMDsgayA8IHJoOyArK2spewotCQkJCW1lbWNweSgmYWpbayp3XSwgJnYud2F2ZWxldFtrXSwgKHNpemVfdClqICogc2l6ZW9mKE9QSl9GTE9BVDMyKSk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgb3BqX2FsaWduZWRfZnJlZShoLndhdmVsZXQpOworICAgIHJldHVybiBPUEpfVFJVRTsKK30KIAotCW9wal9hbGlnbmVkX2ZyZWUoaC53YXZlbGV0KTsKLQlyZXR1cm4gT1BKX1RSVUU7CitzdGF0aWMKK09QSl9CT09MIG9wal9kd3RfZGVjb2RlX3BhcnRpYWxfOTcob3BqX3RjZF90aWxlY29tcF90KiBPUEpfUkVTVFJJQ1QgdGlsZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbnVtcmVzKQoreworICAgIG9wal9zcGFyc2VfYXJyYXlfaW50MzJfdCogc2E7CisgICAgb3BqX3Y0ZHd0X3QgaDsKKyAgICBvcGpfdjRkd3RfdCB2OworICAgIE9QSl9VSU5UMzIgcmVzbm87CisgICAgLyogVGhpcyB2YWx1ZSBtYXRjaGVzIHRoZSBtYXhpbXVtIGxlZnQvcmlnaHQgZXh0ZW5zaW9uIGdpdmVuIGluIHRhYmxlcyAqLworICAgIC8qIEYuMiBhbmQgRi4zIG9mIHRoZSBzdGFuZGFyZC4gTm90ZTogaW4gb3BqX3RjZF9pc19zdWJiYW5kX2FyZWFfb2ZfaW50ZXJlc3QoKSAqLworICAgIC8qIHdlIGN1cnJlbnRseSB1c2UgMy4gKi8KKyAgICBjb25zdCBPUEpfVUlOVDMyIGZpbHRlcl93aWR0aCA9IDRVOworCisgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QqIHRyID0gdGlsZWMtPnJlc29sdXRpb25zOworICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiB0cl9tYXggPSAmKHRpbGVjLT5yZXNvbHV0aW9uc1tudW1yZXMgLSAxXSk7CisKKyAgICBPUEpfVUlOVDMyIHJ3ID0gKE9QSl9VSU5UMzIpKHRyLT54MSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ci0+eDApOyAgICAvKiB3aWR0aCBvZiB0aGUgcmVzb2x1dGlvbiBsZXZlbCBjb21wdXRlZCAqLworICAgIE9QSl9VSU5UMzIgcmggPSAoT1BKX1VJTlQzMikodHItPnkxIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyLT55MCk7ICAgIC8qIGhlaWdodCBvZiB0aGUgcmVzb2x1dGlvbiBsZXZlbCBjb21wdXRlZCAqLworCisgICAgT1BKX1NJWkVfVCBsX2RhdGFfc2l6ZTsKKworICAgIC8qIENvbXB1dGUgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgYXJlYSBvZiBpbnRlcmVzdCwgZXhwcmVzc2VkIGluIHRpbGUgY29vcmRpbmF0ZXMgKi8KKyAgICAvKiB3aXRoIHRoZSB0aWxlIGNvb3JkaW5hdGVzICovCisgICAgT1BKX1VJTlQzMiB3aW5fdGN4MCA9IHRpbGVjLT53aW5feDA7CisgICAgT1BKX1VJTlQzMiB3aW5fdGN5MCA9IHRpbGVjLT53aW5feTA7CisgICAgT1BKX1VJTlQzMiB3aW5fdGN4MSA9IHRpbGVjLT53aW5feDE7CisgICAgT1BKX1VJTlQzMiB3aW5fdGN5MSA9IHRpbGVjLT53aW5feTE7CisKKyAgICBpZiAodHJfbWF4LT54MCA9PSB0cl9tYXgtPngxIHx8IHRyX21heC0+eTAgPT0gdHJfbWF4LT55MSkgeworICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgfQorCisgICAgc2EgPSBvcGpfZHd0X2luaXRfc3BhcnNlX2FycmF5KHRpbGVjLCBudW1yZXMpOworICAgIGlmIChzYSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgaWYgKG51bXJlcyA9PSAxVSkgeworICAgICAgICBPUEpfQk9PTCByZXQgPSBvcGpfc3BhcnNlX2FycmF5X2ludDMyX3JlYWQoc2EsCisgICAgICAgICAgICAgICAgICAgICAgIHRyX21heC0+d2luX3gwIC0gKE9QSl9VSU5UMzIpdHJfbWF4LT54MCwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJfbWF4LT53aW5feTAgLSAoT1BKX1VJTlQzMil0cl9tYXgtPnkwLAorICAgICAgICAgICAgICAgICAgICAgICB0cl9tYXgtPndpbl94MSAtIChPUEpfVUlOVDMyKXRyX21heC0+eDAsCisgICAgICAgICAgICAgICAgICAgICAgIHRyX21heC0+d2luX3kxIC0gKE9QSl9VSU5UMzIpdHJfbWF4LT55MCwKKyAgICAgICAgICAgICAgICAgICAgICAgdGlsZWMtPmRhdGFfd2luLAorICAgICAgICAgICAgICAgICAgICAgICAxLCB0cl9tYXgtPndpbl94MSAtIHRyX21heC0+d2luX3gwLAorICAgICAgICAgICAgICAgICAgICAgICBPUEpfVFJVRSk7CisgICAgICAgIGFzc2VydChyZXQpOworICAgICAgICBPUEpfVU5VU0VEKHJldCk7CisgICAgICAgIG9wal9zcGFyc2VfYXJyYXlfaW50MzJfZnJlZShzYSk7CisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICB9CisKKyAgICBsX2RhdGFfc2l6ZSA9IG9wal9kd3RfbWF4X3Jlc29sdXRpb24odHIsIG51bXJlcyk7CisgICAgLyogb3ZlcmZsb3cgY2hlY2sgKi8KKyAgICBpZiAobF9kYXRhX3NpemUgPiAoU0laRV9NQVggLSA1VSkpIHsKKyAgICAgICAgLyogRklYTUUgZXZlbnQgbWFuYWdlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICBsX2RhdGFfc2l6ZSArPSA1VTsKKyAgICAvKiBvdmVyZmxvdyBjaGVjayAqLworICAgIGlmIChsX2RhdGFfc2l6ZSA+IChTSVpFX01BWCAvIHNpemVvZihvcGpfdjRfdCkpKSB7CisgICAgICAgIC8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgaC53YXZlbGV0ID0gKG9wal92NF90Kikgb3BqX2FsaWduZWRfbWFsbG9jKGxfZGF0YV9zaXplICogc2l6ZW9mKG9wal92NF90KSk7CisgICAgaWYgKCFoLndhdmVsZXQpIHsKKyAgICAgICAgLyogRklYTUUgZXZlbnQgbWFuYWdlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICB2LndhdmVsZXQgPSBoLndhdmVsZXQ7CisKKyAgICBmb3IgKHJlc25vID0gMTsgcmVzbm8gPCBudW1yZXM7IHJlc25vICsrKSB7CisgICAgICAgIE9QSl9VSU5UMzIgajsKKyAgICAgICAgLyogV2luZG93IG9mIGludGVyZXN0IHN1YmJhbmQtYmFzZWQgY29vcmRpbmF0ZXMgKi8KKyAgICAgICAgT1BKX1VJTlQzMiB3aW5fbGxfeDAsIHdpbl9sbF95MCwgd2luX2xsX3gxLCB3aW5fbGxfeTE7CisgICAgICAgIE9QSl9VSU5UMzIgd2luX2hsX3gwLCB3aW5faGxfeDE7CisgICAgICAgIE9QSl9VSU5UMzIgd2luX2xoX3kwLCB3aW5fbGhfeTE7CisgICAgICAgIC8qIFdpbmRvdyBvZiBpbnRlcmVzdCB0aWxlLXJlc29sdXRpb24tYmFzZWQgY29vcmRpbmF0ZXMgKi8KKyAgICAgICAgT1BKX1VJTlQzMiB3aW5fdHJfeDAsIHdpbl90cl94MSwgd2luX3RyX3kwLCB3aW5fdHJfeTE7CisgICAgICAgIC8qIFRpbGUtcmVzb2x1dGlvbiBzdWJiYW5kLWJhc2VkIGNvb3JkaW5hdGVzICovCisgICAgICAgIE9QSl9VSU5UMzIgdHJfbGxfeDAsIHRyX2xsX3kwLCB0cl9obF94MCwgdHJfbGhfeTA7CisKKyAgICAgICAgKyt0cjsKKworICAgICAgICBoLnNuID0gKE9QSl9JTlQzMilydzsKKyAgICAgICAgdi5zbiA9IChPUEpfSU5UMzIpcmg7CisKKyAgICAgICAgcncgPSAoT1BKX1VJTlQzMikodHItPngxIC0gdHItPngwKTsKKyAgICAgICAgcmggPSAoT1BKX1VJTlQzMikodHItPnkxIC0gdHItPnkwKTsKKworICAgICAgICBoLmRuID0gKE9QSl9JTlQzMikocncgLSAoT1BKX1VJTlQzMiloLnNuKTsKKyAgICAgICAgaC5jYXMgPSB0ci0+eDAgJSAyOworCisgICAgICAgIHYuZG4gPSAoT1BKX0lOVDMyKShyaCAtIChPUEpfVUlOVDMyKXYuc24pOworICAgICAgICB2LmNhcyA9IHRyLT55MCAlIDI7CisKKyAgICAgICAgLyogR2V0IHRoZSBzdWJiYW5kIGNvb3JkaW5hdGVzIGZvciB0aGUgd2luZG93IG9mIGludGVyZXN0ICovCisgICAgICAgIC8qIExMIGJhbmQgKi8KKyAgICAgICAgb3BqX2R3dF9nZXRfYmFuZF9jb29yZGluYXRlcyh0aWxlYywgcmVzbm8sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luX3RjeDAsIHdpbl90Y3kwLCB3aW5fdGN4MSwgd2luX3RjeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndpbl9sbF94MCwgJndpbl9sbF95MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd2luX2xsX3gxLCAmd2luX2xsX3kxKTsKKworICAgICAgICAvKiBITCBiYW5kICovCisgICAgICAgIG9wal9kd3RfZ2V0X2JhbmRfY29vcmRpbmF0ZXModGlsZWMsIHJlc25vLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbl90Y3gwLCB3aW5fdGN5MCwgd2luX3RjeDEsIHdpbl90Y3kxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aW5faGxfeDAsIE5VTEwsICZ3aW5faGxfeDEsIE5VTEwpOworCisgICAgICAgIC8qIExIIGJhbmQgKi8KKyAgICAgICAgb3BqX2R3dF9nZXRfYmFuZF9jb29yZGluYXRlcyh0aWxlYywgcmVzbm8sIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luX3RjeDAsIHdpbl90Y3kwLCB3aW5fdGN4MSwgd2luX3RjeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJndpbl9saF95MCwgTlVMTCwgJndpbl9saF95MSk7CisKKyAgICAgICAgLyogQmV3YXJlOiBiYW5kIGluZGV4IGZvciBub24tTEwwIHJlc29sdXRpb24gYXJlIDA9SEwsIDE9TEggYW5kIDI9SEggKi8KKyAgICAgICAgdHJfbGxfeDAgPSAoT1BKX1VJTlQzMil0ci0+YmFuZHNbMV0ueDA7CisgICAgICAgIHRyX2xsX3kwID0gKE9QSl9VSU5UMzIpdHItPmJhbmRzWzBdLnkwOworICAgICAgICB0cl9obF94MCA9IChPUEpfVUlOVDMyKXRyLT5iYW5kc1swXS54MDsKKyAgICAgICAgdHJfbGhfeTAgPSAoT1BKX1VJTlQzMil0ci0+YmFuZHNbMV0ueTA7CisKKyAgICAgICAgLyogU3Vic3RyYWN0IHRoZSBvcmlnaW4gb2YgdGhlIGJhbmRzIGZvciB0aGlzIHRpbGUsIHRvIHRoZSBzdWJ3aW5kb3cgKi8KKyAgICAgICAgLyogb2YgaW50ZXJlc3QgYmFuZCBjb29yZGluYXRlcywgc28gYXMgdG8gZ2V0IHRoZW0gcmVsYXRpdmUgdG8gdGhlICovCisgICAgICAgIC8qIHRpbGUgKi8KKyAgICAgICAgd2luX2xsX3gwID0gb3BqX3VpbnRfc3Vicyh3aW5fbGxfeDAsIHRyX2xsX3gwKTsKKyAgICAgICAgd2luX2xsX3kwID0gb3BqX3VpbnRfc3Vicyh3aW5fbGxfeTAsIHRyX2xsX3kwKTsKKyAgICAgICAgd2luX2xsX3gxID0gb3BqX3VpbnRfc3Vicyh3aW5fbGxfeDEsIHRyX2xsX3gwKTsKKyAgICAgICAgd2luX2xsX3kxID0gb3BqX3VpbnRfc3Vicyh3aW5fbGxfeTEsIHRyX2xsX3kwKTsKKyAgICAgICAgd2luX2hsX3gwID0gb3BqX3VpbnRfc3Vicyh3aW5faGxfeDAsIHRyX2hsX3gwKTsKKyAgICAgICAgd2luX2hsX3gxID0gb3BqX3VpbnRfc3Vicyh3aW5faGxfeDEsIHRyX2hsX3gwKTsKKyAgICAgICAgd2luX2xoX3kwID0gb3BqX3VpbnRfc3Vicyh3aW5fbGhfeTAsIHRyX2xoX3kwKTsKKyAgICAgICAgd2luX2xoX3kxID0gb3BqX3VpbnRfc3Vicyh3aW5fbGhfeTEsIHRyX2xoX3kwKTsKKworICAgICAgICBvcGpfZHd0X3NlZ21lbnRfZ3JvdyhmaWx0ZXJfd2lkdGgsIChPUEpfVUlOVDMyKWguc24sICZ3aW5fbGxfeDAsICZ3aW5fbGxfeDEpOworICAgICAgICBvcGpfZHd0X3NlZ21lbnRfZ3JvdyhmaWx0ZXJfd2lkdGgsIChPUEpfVUlOVDMyKWguZG4sICZ3aW5faGxfeDAsICZ3aW5faGxfeDEpOworCisgICAgICAgIG9wal9kd3Rfc2VnbWVudF9ncm93KGZpbHRlcl93aWR0aCwgKE9QSl9VSU5UMzIpdi5zbiwgJndpbl9sbF95MCwgJndpbl9sbF95MSk7CisgICAgICAgIG9wal9kd3Rfc2VnbWVudF9ncm93KGZpbHRlcl93aWR0aCwgKE9QSl9VSU5UMzIpdi5kbiwgJndpbl9saF95MCwgJndpbl9saF95MSk7CisKKyAgICAgICAgLyogQ29tcHV0ZSB0aGUgdGlsZS1yZXNvbHV0aW9uLWJhc2VkIGNvb3JkaW5hdGVzIGZvciB0aGUgd2luZG93IG9mIGludGVyZXN0ICovCisgICAgICAgIGlmIChoLmNhcyA9PSAwKSB7CisgICAgICAgICAgICB3aW5fdHJfeDAgPSBvcGpfdWludF9taW4oMiAqIHdpbl9sbF94MCwgMiAqIHdpbl9obF94MCArIDEpOworICAgICAgICAgICAgd2luX3RyX3gxID0gb3BqX3VpbnRfbWluKG9wal91aW50X21heCgyICogd2luX2xsX3gxLCAyICogd2luX2hsX3gxICsgMSksIHJ3KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdpbl90cl94MCA9IG9wal91aW50X21pbigyICogd2luX2hsX3gwLCAyICogd2luX2xsX3gwICsgMSk7CisgICAgICAgICAgICB3aW5fdHJfeDEgPSBvcGpfdWludF9taW4ob3BqX3VpbnRfbWF4KDIgKiB3aW5faGxfeDEsIDIgKiB3aW5fbGxfeDEgKyAxKSwgcncpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHYuY2FzID09IDApIHsKKyAgICAgICAgICAgIHdpbl90cl95MCA9IG9wal91aW50X21pbigyICogd2luX2xsX3kwLCAyICogd2luX2xoX3kwICsgMSk7CisgICAgICAgICAgICB3aW5fdHJfeTEgPSBvcGpfdWludF9taW4ob3BqX3VpbnRfbWF4KDIgKiB3aW5fbGxfeTEsIDIgKiB3aW5fbGhfeTEgKyAxKSwgcmgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd2luX3RyX3kwID0gb3BqX3VpbnRfbWluKDIgKiB3aW5fbGhfeTAsIDIgKiB3aW5fbGxfeTAgKyAxKTsKKyAgICAgICAgICAgIHdpbl90cl95MSA9IG9wal91aW50X21pbihvcGpfdWludF9tYXgoMiAqIHdpbl9saF95MSwgMiAqIHdpbl9sbF95MSArIDEpLCByaCk7CisgICAgICAgIH0KKworICAgICAgICBoLndpbl9sX3gwID0gd2luX2xsX3gwOworICAgICAgICBoLndpbl9sX3gxID0gd2luX2xsX3gxOworICAgICAgICBoLndpbl9oX3gwID0gd2luX2hsX3gwOworICAgICAgICBoLndpbl9oX3gxID0gd2luX2hsX3gxOworICAgICAgICBmb3IgKGogPSAwOyBqICsgMyA8IHJoOyBqICs9IDQpIHsKKyAgICAgICAgICAgIGlmICgoaiArIDMgPj0gd2luX2xsX3kwICYmIGogPCB3aW5fbGxfeTEpIHx8CisgICAgICAgICAgICAgICAgICAgIChqICsgMyA+PSB3aW5fbGhfeTAgKyAoT1BKX1VJTlQzMil2LnNuICYmCisgICAgICAgICAgICAgICAgICAgICBqIDwgd2luX2xoX3kxICsgKE9QSl9VSU5UMzIpdi5zbikpIHsKKyAgICAgICAgICAgICAgICBvcGpfdjRkd3RfaW50ZXJsZWF2ZV9wYXJ0aWFsX2goJmgsIHNhLCBqLCBvcGpfdWludF9taW4oNFUsIHJoIC0gaikpOworICAgICAgICAgICAgICAgIG9wal92NGR3dF9kZWNvZGUoJmgpOworICAgICAgICAgICAgICAgIGlmICghb3BqX3NwYXJzZV9hcnJheV9pbnQzMl93cml0ZShzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luX3RyX3gwLCBqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5fdHJfeDEsIGogKyA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKikmaC53YXZlbGV0W3dpbl90cl94MF0uZlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgMSwgT1BKX1RSVUUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgICAgICAgICAgICAgb3BqX3NwYXJzZV9hcnJheV9pbnQzMl9mcmVlKHNhKTsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2FsaWduZWRfZnJlZShoLndhdmVsZXQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChqIDwgcmggJiYKKyAgICAgICAgICAgICAgICAoKGogKyAzID49IHdpbl9sbF95MCAmJiBqIDwgd2luX2xsX3kxKSB8fAorICAgICAgICAgICAgICAgICAoaiArIDMgPj0gd2luX2xoX3kwICsgKE9QSl9VSU5UMzIpdi5zbiAmJgorICAgICAgICAgICAgICAgICAgaiA8IHdpbl9saF95MSArIChPUEpfVUlOVDMyKXYuc24pKSkgeworICAgICAgICAgICAgb3BqX3Y0ZHd0X2ludGVybGVhdmVfcGFydGlhbF9oKCZoLCBzYSwgaiwgcmggLSBqKTsKKyAgICAgICAgICAgIG9wal92NGR3dF9kZWNvZGUoJmgpOworICAgICAgICAgICAgaWYgKCFvcGpfc3BhcnNlX2FycmF5X2ludDMyX3dyaXRlKHNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbl90cl94MCwgaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5fdHJfeDEsIHJoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfSU5UMzIqKSZoLndhdmVsZXRbd2luX3RyX3gwXS5mWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIDEsIE9QSl9UUlVFKSkgeworICAgICAgICAgICAgICAgIC8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgICAgICAgICBvcGpfc3BhcnNlX2FycmF5X2ludDMyX2ZyZWUoc2EpOworICAgICAgICAgICAgICAgIG9wal9hbGlnbmVkX2ZyZWUoaC53YXZlbGV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdi53aW5fbF94MCA9IHdpbl9sbF95MDsKKyAgICAgICAgdi53aW5fbF94MSA9IHdpbl9sbF95MTsKKyAgICAgICAgdi53aW5faF94MCA9IHdpbl9saF95MDsKKyAgICAgICAgdi53aW5faF94MSA9IHdpbl9saF95MTsKKyAgICAgICAgZm9yIChqID0gd2luX3RyX3gwOyBqIDwgd2luX3RyX3gxOyBqICs9IDQpIHsKKyAgICAgICAgICAgIE9QSl9VSU5UMzIgbmJfZWx0cyA9IG9wal91aW50X21pbig0VSwgd2luX3RyX3gxIC0gaik7CisKKyAgICAgICAgICAgIG9wal92NGR3dF9pbnRlcmxlYXZlX3BhcnRpYWxfdigmdiwgc2EsIGosIG5iX2VsdHMpOworICAgICAgICAgICAgb3BqX3Y0ZHd0X2RlY29kZSgmdik7CisKKyAgICAgICAgICAgIGlmICghb3BqX3NwYXJzZV9hcnJheV9pbnQzMl93cml0ZShzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLCB3aW5fdHJfeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiArIG5iX2VsdHMsIHdpbl90cl95MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKikmaC53YXZlbGV0W3dpbl90cl95MF0uZlswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCA0LCBPUEpfVFJVRSkpIHsKKyAgICAgICAgICAgICAgICAvKiBGSVhNRSBldmVudCBtYW5hZ2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgICAgICAgb3BqX3NwYXJzZV9hcnJheV9pbnQzMl9mcmVlKHNhKTsKKyAgICAgICAgICAgICAgICBvcGpfYWxpZ25lZF9mcmVlKGgud2F2ZWxldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgT1BKX0JPT0wgcmV0ID0gb3BqX3NwYXJzZV9hcnJheV9pbnQzMl9yZWFkKHNhLAorICAgICAgICAgICAgICAgICAgICAgICB0cl9tYXgtPndpbl94MCAtIChPUEpfVUlOVDMyKXRyX21heC0+eDAsCisgICAgICAgICAgICAgICAgICAgICAgIHRyX21heC0+d2luX3kwIC0gKE9QSl9VSU5UMzIpdHJfbWF4LT55MCwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJfbWF4LT53aW5feDEgLSAoT1BKX1VJTlQzMil0cl9tYXgtPngwLAorICAgICAgICAgICAgICAgICAgICAgICB0cl9tYXgtPndpbl95MSAtIChPUEpfVUlOVDMyKXRyX21heC0+eTAsCisgICAgICAgICAgICAgICAgICAgICAgIHRpbGVjLT5kYXRhX3dpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgMSwgdHJfbWF4LT53aW5feDEgLSB0cl9tYXgtPndpbl94MCwKKyAgICAgICAgICAgICAgICAgICAgICAgT1BKX1RSVUUpOworICAgICAgICBhc3NlcnQocmV0KTsKKyAgICAgICAgT1BKX1VOVVNFRChyZXQpOworICAgIH0KKyAgICBvcGpfc3BhcnNlX2FycmF5X2ludDMyX2ZyZWUoc2EpOworCisgICAgb3BqX2FsaWduZWRfZnJlZShoLndhdmVsZXQpOworICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworCitPUEpfQk9PTCBvcGpfZHd0X2RlY29kZV9yZWFsKG9wal90Y2RfdCAqcF90Y2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCogT1BKX1JFU1RSSUNUIHRpbGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG51bXJlcykKK3sKKyAgICBpZiAocF90Y2QtPndob2xlX3RpbGVfZGVjb2RpbmcpIHsKKyAgICAgICAgcmV0dXJuIG9wal9kd3RfZGVjb2RlX3RpbGVfOTcodGlsZWMsIG51bXJlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG9wal9kd3RfZGVjb2RlX3BhcnRpYWxfOTcodGlsZWMsIG51bXJlcyk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9kd3QuaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvZHd0LmgKaW5kZXggMjFmZTk0Mi4uNGY2M2U1MiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9kd3QuaAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2R3dC5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAotICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZAogICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cwogICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgogICoKQEAgLTgsNyArOCw3IEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXgKICAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0LCBBbnRvbmluIERlc2NhbXBlCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkBAIC0zNSw4ICszNSw4IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCi0jaWZuZGVmIF9fRFdUX0gKLSNkZWZpbmUgX19EV1RfSAorI2lmbmRlZiBPUEpfRFdUX0gKKyNkZWZpbmUgT1BKX0RXVF9ICiAvKioKIEBmaWxlIGR3dC5oCiBAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSBkaXNjcmV0ZSB3YXZlbGV0IHRyYW5zZm9ybSAoRFdUKQpAQCAtNjMsMTAgKzYzLDEzIEBACiAvKioKIEludmVyc2UgNS0zIHdhdmVsZXQgdHJhbnNmb3JtIGluIDItRC4KIEFwcGx5IGEgcmV2ZXJzaWJsZSBpbnZlcnNlIERXVCB0cmFuc2Zvcm0gdG8gYSBjb21wb25lbnQgb2YgYW4gaW1hZ2UuCitAcGFyYW0gcF90Y2QgVENEIGhhbmRsZQogQHBhcmFtIHRpbGVjIFRpbGUgY29tcG9uZW50IGluZm9ybWF0aW9uIChjdXJyZW50IHRpbGUpCiBAcGFyYW0gbnVtcmVzIE51bWJlciBvZiByZXNvbHV0aW9uIGxldmVscyB0byBkZWNvZGUKICovCi1PUEpfQk9PTCBvcGpfZHd0X2RlY29kZShvcGpfdGNkX3RpbGVjb21wX3QqIHRpbGVjLCBPUEpfVUlOVDMyIG51bXJlcyk7CitPUEpfQk9PTCBvcGpfZHd0X2RlY29kZShvcGpfdGNkX3QgKnBfdGNkLAorICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlY29tcF90KiB0aWxlYywKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbnVtcmVzKTsKIAogLyoqCiBHZXQgdGhlIGdhaW4gb2YgYSBzdWJiYW5kIGZvciB0aGUgcmV2ZXJzaWJsZSA1LTMgRFdULgpAQCAtODIsMTggKzg1LDIxIEBACiAqLwogT1BKX0ZMT0FUNjQgb3BqX2R3dF9nZXRub3JtKE9QSl9VSU5UMzIgbGV2ZWwsIE9QSl9VSU5UMzIgb3JpZW50KTsKIC8qKgotRm9yd2FyZCA5LTcgd2F2ZWxldCB0cmFuc2Zvcm0gaW4gMi1ELiAKK0ZvcndhcmQgOS03IHdhdmVsZXQgdHJhbnNmb3JtIGluIDItRC4KIEFwcGx5IGFuIGlycmV2ZXJzaWJsZSBEV1QgdHJhbnNmb3JtIHRvIGEgY29tcG9uZW50IG9mIGFuIGltYWdlLgogQHBhcmFtIHRpbGVjIFRpbGUgY29tcG9uZW50IGluZm9ybWF0aW9uIChjdXJyZW50IHRpbGUpCiAqLwogT1BKX0JPT0wgb3BqX2R3dF9lbmNvZGVfcmVhbChvcGpfdGNkX3RpbGVjb21wX3QgKiB0aWxlYyk7CiAvKioKLUludmVyc2UgOS03IHdhdmVsZXQgdHJhbnNmb3JtIGluIDItRC4gCitJbnZlcnNlIDktNyB3YXZlbGV0IHRyYW5zZm9ybSBpbiAyLUQuCiBBcHBseSBhbiBpcnJldmVyc2libGUgaW52ZXJzZSBEV1QgdHJhbnNmb3JtIHRvIGEgY29tcG9uZW50IG9mIGFuIGltYWdlLgorQHBhcmFtIHBfdGNkIFRDRCBoYW5kbGUKIEBwYXJhbSB0aWxlYyBUaWxlIGNvbXBvbmVudCBpbmZvcm1hdGlvbiAoY3VycmVudCB0aWxlKQogQHBhcmFtIG51bXJlcyBOdW1iZXIgb2YgcmVzb2x1dGlvbiBsZXZlbHMgdG8gZGVjb2RlCiAqLwotT1BKX0JPT0wgb3BqX2R3dF9kZWNvZGVfcmVhbChvcGpfdGNkX3RpbGVjb21wX3QqIHJlc3RyaWN0IHRpbGVjLCBPUEpfVUlOVDMyIG51bXJlcyk7CitPUEpfQk9PTCBvcGpfZHd0X2RlY29kZV9yZWFsKG9wal90Y2RfdCAqcF90Y2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCogT1BKX1JFU1RSSUNUIHRpbGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG51bXJlcyk7CiAKIC8qKgogR2V0IHRoZSBnYWluIG9mIGEgc3ViYmFuZCBmb3IgdGhlIGlycmV2ZXJzaWJsZSA5LTcgRFdULgpAQCAtMTA5LDcgKzExNSw3IEBACiAqLwogT1BKX0ZMT0FUNjQgb3BqX2R3dF9nZXRub3JtX3JlYWwoT1BKX1VJTlQzMiBsZXZlbCwgT1BKX1VJTlQzMiBvcmllbnQpOwogLyoqCi1FeHBsaWNpdCBjYWxjdWxhdGlvbiBvZiB0aGUgUXVhbnRpemF0aW9uIFN0ZXBzaXplcyAKK0V4cGxpY2l0IGNhbGN1bGF0aW9uIG9mIHRoZSBRdWFudGl6YXRpb24gU3RlcHNpemVzCiBAcGFyYW0gdGNjcCBUaWxlLWNvbXBvbmVudCBjb2RpbmcgcGFyYW1ldGVycwogQHBhcmFtIHByZWMgUHJlY2ludCBhbmFseXplZAogKi8KQEAgLTExOSw0ICsxMjUsNCBAQAogCiAvKkB9Ki8KIAotI2VuZGlmIC8qIF9fRFdUX0ggKi8KKyNlbmRpZiAvKiBPUEpfRFdUX0ggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvZXZlbnQuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvZXZlbnQuYwppbmRleCBiNjAzNGI0Li5hYWQ5ZDc2IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2V2ZW50LmMKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9ldmVudC5jCkBAIC0xLDExICsxLDExIEBACiAvKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCiAgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCiAgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZSIAorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGUgogICogQ29weXJpZ2h0IChjKSAyMDEyLCBDUyBTeXN0ZW1lcyBkJ0luZm9ybWF0aW9uLCBGcmFuY2UKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpAQCAtNDAsMTQgKzQwLDE3IEBACiAjaWZkZWYgT1BKX0NPREVfTk9UX1VTRUQKICNpZm5kZWYgX1dJTjMyCiBzdGF0aWMgY2hhcioKLWkyYSh1bnNpZ25lZCBpLCBjaGFyICphLCB1bnNpZ25lZCByKSB7Ci0JaWYgKGkvciA+IDApIGEgPSBpMmEoaS9yLGEscik7Ci0JKmEgPSAiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIltpJXJdOwotCXJldHVybiBhKzE7CitpMmEodW5zaWduZWQgaSwgY2hhciAqYSwgdW5zaWduZWQgcikKK3sKKyAgICBpZiAoaSAvIHIgPiAwKSB7CisgICAgICAgIGEgPSBpMmEoaSAvIHIsIGEsIHIpOworICAgIH0KKyAgICAqYSA9ICIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiW2kgJSByXTsKKyAgICByZXR1cm4gYSArIDE7CiB9CiAKLS8qKiAKLSBUcmFuc2Zvcm1zIGludGVnZXIgaSBpbnRvIGFuIGFzY2lpIHN0cmluZyBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gYTsgCisvKioKKyBUcmFuc2Zvcm1zIGludGVnZXIgaSBpbnRvIGFuIGFzY2lpIHN0cmluZyBhbmQgc3RvcmVzIHRoZSByZXN1bHQgaW4gYTsKICBzdHJpbmcgaXMgZW5jb2RlZCBpbiB0aGUgYmFzZSBpbmRpY2F0ZWQgYnkgci4KICBAcGFyYW0gaSBOdW1iZXIgdG8gYmUgY29udmVydGVkCiAgQHBhcmFtIGEgU3RyaW5nIHJlc3VsdApAQCAtNTUsMTQgKzU4LDE2IEBACiAgQHJldHVybiBSZXR1cm5zIGEKICovCiBzdGF0aWMgY2hhciAqCi1faXRvYShpbnQgaSwgY2hhciAqYSwgaW50IHIpIHsKLQlyID0gKChyIDwgMikgfHwgKHIgPiAzNikpID8gMTAgOiByOwotCWlmKGkgPCAwKSB7Ci0JCSphID0gJy0nOwotCQkqaTJhKC1pLCBhKzEsIHIpID0gMDsKLQl9Ci0JZWxzZSAqaTJhKGksIGEsIHIpID0gMDsKLQlyZXR1cm4gYTsKK19pdG9hKGludCBpLCBjaGFyICphLCBpbnQgcikKK3sKKyAgICByID0gKChyIDwgMikgfHwgKHIgPiAzNikpID8gMTAgOiByOworICAgIGlmIChpIDwgMCkgeworICAgICAgICAqYSA9ICctJzsKKyAgICAgICAgKmkyYSgtaSwgYSArIDEsIHIpID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICAqaTJhKGksIGEsIHIpID0gMDsKKyAgICB9CisgICAgcmV0dXJuIGE7CiB9CiAKICNlbmRpZiAvKiAhX1dJTjMyICovCkBAIC03Myw3ICs3OCw3IEBACiAgKiBEZWZhdWx0IGNhbGxiYWNrIGZ1bmN0aW9uLgogICogRG8gbm90aGluZy4KICAqLwotc3RhdGljIHZvaWQgb3BqX2RlZmF1bHRfY2FsbGJhY2sgKGNvbnN0IGNoYXIgKm1zZywgdm9pZCAqY2xpZW50X2RhdGEpCitzdGF0aWMgdm9pZCBvcGpfZGVmYXVsdF9jYWxsYmFjayhjb25zdCBjaGFyICptc2csIHZvaWQgKmNsaWVudF9kYXRhKQogewogICAgIE9QSl9BUkdfTk9UX1VTRUQobXNnKTsKICAgICBPUEpfQVJHX05PVF9VU0VEKGNsaWVudF9kYXRhKTsKQEAgLTgzLDY0ICs4OCw2NCBAQAogCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi1PUEpfQk9PTCBvcGpfZXZlbnRfbXNnKG9wal9ldmVudF9tZ3JfdCogcF9ldmVudF9tZ3IsIE9QSl9JTlQzMiBldmVudF90eXBlLCBjb25zdCBjaGFyICpmbXQsIC4uLikgeworT1BKX0JPT0wgb3BqX2V2ZW50X21zZyhvcGpfZXZlbnRfbWdyX3QqIHBfZXZlbnRfbWdyLCBPUEpfSU5UMzIgZXZlbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CiAjZGVmaW5lIE9QSl9NU0dfU0laRSA1MTIgLyogNTEyIGJ5dGVzIHNob3VsZCBiZSBtb3JlIHRoYW4gZW5vdWdoIGZvciBhIHNob3J0IG1lc3NhZ2UgKi8KLQlvcGpfbXNnX2NhbGxiYWNrIG1zZ19oYW5kbGVyID0gMDA7Ci0Jdm9pZCAqIGxfZGF0YSA9IDAwOworICAgIG9wal9tc2dfY2FsbGJhY2sgbXNnX2hhbmRsZXIgPSAwMDsKKyAgICB2b2lkICogbF9kYXRhID0gMDA7CiAKLQlpZihwX2V2ZW50X21nciAhPSAwMCkgewotCQlzd2l0Y2goZXZlbnRfdHlwZSkgewotCQkJY2FzZSBFVlRfRVJST1I6Ci0JCQkJbXNnX2hhbmRsZXIgPSBwX2V2ZW50X21nci0+ZXJyb3JfaGFuZGxlcjsKLQkJCQlsX2RhdGEgPSBwX2V2ZW50X21nci0+bV9lcnJvcl9kYXRhOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFVlRfV0FSTklORzoKLQkJCQltc2dfaGFuZGxlciA9IHBfZXZlbnRfbWdyLT53YXJuaW5nX2hhbmRsZXI7Ci0JCQkJbF9kYXRhID0gcF9ldmVudF9tZ3ItPm1fd2FybmluZ19kYXRhOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFVlRfSU5GTzoKLQkJCQltc2dfaGFuZGxlciA9IHBfZXZlbnRfbWdyLT5pbmZvX2hhbmRsZXI7Ci0JCQkJbF9kYXRhID0gcF9ldmVudF9tZ3ItPm1faW5mb19kYXRhOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJfQotCQlpZihtc2dfaGFuZGxlciA9PSAwMCkgewotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCX0gZWxzZSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgIGlmIChwX2V2ZW50X21nciAhPSAwMCkgeworICAgICAgICBzd2l0Y2ggKGV2ZW50X3R5cGUpIHsKKyAgICAgICAgY2FzZSBFVlRfRVJST1I6CisgICAgICAgICAgICBtc2dfaGFuZGxlciA9IHBfZXZlbnRfbWdyLT5lcnJvcl9oYW5kbGVyOworICAgICAgICAgICAgbF9kYXRhID0gcF9ldmVudF9tZ3ItPm1fZXJyb3JfZGF0YTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVWVF9XQVJOSU5HOgorICAgICAgICAgICAgbXNnX2hhbmRsZXIgPSBwX2V2ZW50X21nci0+d2FybmluZ19oYW5kbGVyOworICAgICAgICAgICAgbF9kYXRhID0gcF9ldmVudF9tZ3ItPm1fd2FybmluZ19kYXRhOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRVZUX0lORk86CisgICAgICAgICAgICBtc2dfaGFuZGxlciA9IHBfZXZlbnRfbWdyLT5pbmZvX2hhbmRsZXI7CisgICAgICAgICAgICBsX2RhdGEgPSBwX2V2ZW50X21nci0+bV9pbmZvX2RhdGE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChtc2dfaGFuZGxlciA9PSAwMCkgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0JaWYgKChmbXQgIT0gMDApICYmIChwX2V2ZW50X21nciAhPSAwMCkpIHsKLQkJdmFfbGlzdCBhcmc7Ci0JCXNpemVfdCBzdHJfbGVuZ3RoLyosIGksIGoqLzsgLyogVW5pUEcgKi8KLQkJY2hhciBtZXNzYWdlW09QSl9NU0dfU0laRV07Ci0JCW1lbXNldChtZXNzYWdlLCAwLCBPUEpfTVNHX1NJWkUpOwotCQkvKiBpbml0aWFsaXplIHRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgbGlzdCAqLwotCQl2YV9zdGFydChhcmcsIGZtdCk7Ci0JCS8qIGNoZWNrIHRoZSBsZW5ndGggb2YgdGhlIGZvcm1hdCBzdHJpbmcgKi8KLQkJc3RyX2xlbmd0aCA9IChzdHJsZW4oZm10KSA+IE9QSl9NU0dfU0laRSkgPyBPUEpfTVNHX1NJWkUgOiBzdHJsZW4oZm10KTsKLSAgICAgICAgKHZvaWQpc3RyX2xlbmd0aDsKLQkJLyogcGFyc2UgdGhlIGZvcm1hdCBzdHJpbmcgYW5kIHB1dCB0aGUgcmVzdWx0IGluICdtZXNzYWdlJyAqLwotCQl2c25wcmludGYobWVzc2FnZSwgT1BKX01TR19TSVpFLCBmbXQsIGFyZyk7IC8qIFVuaVBHICovCi0JCS8qIGRlaW5pdGlhbGl6ZSB0aGUgb3B0aW9uYWwgcGFyYW1ldGVyIGxpc3QgKi8KLQkJdmFfZW5kKGFyZyk7CisgICAgaWYgKChmbXQgIT0gMDApICYmIChwX2V2ZW50X21nciAhPSAwMCkpIHsKKyAgICAgICAgdmFfbGlzdCBhcmc7CisgICAgICAgIGNoYXIgbWVzc2FnZVtPUEpfTVNHX1NJWkVdOworICAgICAgICBtZW1zZXQobWVzc2FnZSwgMCwgT1BKX01TR19TSVpFKTsKKyAgICAgICAgLyogaW5pdGlhbGl6ZSB0aGUgb3B0aW9uYWwgcGFyYW1ldGVyIGxpc3QgKi8KKyAgICAgICAgdmFfc3RhcnQoYXJnLCBmbXQpOworICAgICAgICAvKiBwYXJzZSB0aGUgZm9ybWF0IHN0cmluZyBhbmQgcHV0IHRoZSByZXN1bHQgaW4gJ21lc3NhZ2UnICovCisgICAgICAgIHZzbnByaW50ZihtZXNzYWdlLCBPUEpfTVNHX1NJWkUsIGZtdCwgYXJnKTsKKyAgICAgICAgLyogZm9yY2UgemVybyB0ZXJtaW5hdGlvbiBmb3IgV2luZG93cyBfdnNucHJpbnRmKCkgb2Ygb2xkIE1TVkMgKi8KKyAgICAgICAgbWVzc2FnZVtPUEpfTVNHX1NJWkUgLSAxXSA9ICdcMCc7CisgICAgICAgIC8qIGRlaW5pdGlhbGl6ZSB0aGUgb3B0aW9uYWwgcGFyYW1ldGVyIGxpc3QgKi8KKyAgICAgICAgdmFfZW5kKGFyZyk7CiAKLQkJLyogb3V0cHV0IHRoZSBtZXNzYWdlIHRvIHRoZSB1c2VyIHByb2dyYW0gKi8KLQkJbXNnX2hhbmRsZXIobWVzc2FnZSwgbF9kYXRhKTsKLQl9CisgICAgICAgIC8qIG91dHB1dCB0aGUgbWVzc2FnZSB0byB0aGUgdXNlciBwcm9ncmFtICovCisgICAgICAgIG1zZ19oYW5kbGVyKG1lc3NhZ2UsIGxfZGF0YSk7CisgICAgfQogCi0JcmV0dXJuIE9QSl9UUlVFOworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAogdm9pZCBvcGpfc2V0X2RlZmF1bHRfZXZlbnRfaGFuZGxlcihvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCiB7Ci0JcF9tYW5hZ2VyLT5tX2Vycm9yX2RhdGEgPSAwMDsKLQlwX21hbmFnZXItPm1fd2FybmluZ19kYXRhID0gMDA7Ci0JcF9tYW5hZ2VyLT5tX2luZm9fZGF0YSA9IDAwOwotCXBfbWFuYWdlci0+ZXJyb3JfaGFuZGxlciA9IG9wal9kZWZhdWx0X2NhbGxiYWNrOwotCXBfbWFuYWdlci0+aW5mb19oYW5kbGVyID0gb3BqX2RlZmF1bHRfY2FsbGJhY2s7Ci0JcF9tYW5hZ2VyLT53YXJuaW5nX2hhbmRsZXIgPSBvcGpfZGVmYXVsdF9jYWxsYmFjazsKKyAgICBwX21hbmFnZXItPm1fZXJyb3JfZGF0YSA9IDAwOworICAgIHBfbWFuYWdlci0+bV93YXJuaW5nX2RhdGEgPSAwMDsKKyAgICBwX21hbmFnZXItPm1faW5mb19kYXRhID0gMDA7CisgICAgcF9tYW5hZ2VyLT5lcnJvcl9oYW5kbGVyID0gb3BqX2RlZmF1bHRfY2FsbGJhY2s7CisgICAgcF9tYW5hZ2VyLT5pbmZvX2hhbmRsZXIgPSBvcGpfZGVmYXVsdF9jYWxsYmFjazsKKyAgICBwX21hbmFnZXItPndhcm5pbmdfaGFuZGxlciA9IG9wal9kZWZhdWx0X2NhbGxiYWNrOwogfQogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2V2ZW50LmggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2V2ZW50LmgKaW5kZXggZmE4NjA0ZS4uZDg4MDM4OCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9ldmVudC5oCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvZXZlbnQuaApAQCAtMSwxMSArMSwxMSBAQAogLyoKLSAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAotICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZAogICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cwogICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgogICoKICAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGUiAKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRlIKICAqIENvcHlyaWdodCAoYykgMjAxMiwgQ1MgU3lzdGVtZXMgZCdJbmZvcm1hdGlvbiwgRnJhbmNlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKQEAgLTMwLDggKzMwLDggQEAKICAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwotI2lmbmRlZiBfX0VWRU5UX0gKLSNkZWZpbmUgX19FVkVOVF9ICisjaWZuZGVmIE9QSl9FVkVOVF9ICisjZGVmaW5lIE9QSl9FVkVOVF9ICiAvKioKIEBmaWxlIGV2ZW50LmgKIEBicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBhIGV2ZW50IGNhbGxiYWNrIHN5c3RlbQpAQCAtNDAsMzMgKzQwLDMyIEBACiAqLwogLyoqCiBNZXNzYWdlIGhhbmRsZXIgb2JqZWN0Ci11c2VkIGZvciAKK3VzZWQgZm9yCiA8dWw+CiA8bGk+RXJyb3IgbWVzc2FnZXMKIDxsaT5XYXJuaW5nIG1lc3NhZ2VzCiA8bGk+RGVidWdnaW5nIG1lc3NhZ2VzCiA8L3VsPgogKi8KLXR5cGVkZWYgc3RydWN0IG9wal9ldmVudF9tZ3IgCi17Ci0JLyoqIERhdGEgdG8gY2FsbCB0aGUgZXZlbnQgbWFuYWdlciB1cG9uICovCi0Jdm9pZCAqCQkJbV9lcnJvcl9kYXRhOwotCS8qKiBEYXRhIHRvIGNhbGwgdGhlIGV2ZW50IG1hbmFnZXIgdXBvbiAqLwotCXZvaWQgKgkJCW1fd2FybmluZ19kYXRhOwotCS8qKiBEYXRhIHRvIGNhbGwgdGhlIGV2ZW50IG1hbmFnZXIgdXBvbiAqLwotCXZvaWQgKgkJCW1faW5mb19kYXRhOwotCS8qKiBFcnJvciBtZXNzYWdlIGNhbGxiYWNrIGlmIGF2YWlsYWJsZSwgTlVMTCBvdGhlcndpc2UgKi8KLQlvcGpfbXNnX2NhbGxiYWNrIGVycm9yX2hhbmRsZXI7Ci0JLyoqIFdhcm5pbmcgbWVzc2FnZSBjYWxsYmFjayBpZiBhdmFpbGFibGUsIE5VTEwgb3RoZXJ3aXNlICovCi0Jb3BqX21zZ19jYWxsYmFjayB3YXJuaW5nX2hhbmRsZXI7Ci0JLyoqIERlYnVnIG1lc3NhZ2UgY2FsbGJhY2sgaWYgYXZhaWxhYmxlLCBOVUxMIG90aGVyd2lzZSAqLwotCW9wal9tc2dfY2FsbGJhY2sgaW5mb19oYW5kbGVyOwordHlwZWRlZiBzdHJ1Y3Qgb3BqX2V2ZW50X21nciB7CisgICAgLyoqIERhdGEgdG8gY2FsbCB0aGUgZXZlbnQgbWFuYWdlciB1cG9uICovCisgICAgdm9pZCAqICAgICAgICAgIG1fZXJyb3JfZGF0YTsKKyAgICAvKiogRGF0YSB0byBjYWxsIHRoZSBldmVudCBtYW5hZ2VyIHVwb24gKi8KKyAgICB2b2lkICogICAgICAgICAgbV93YXJuaW5nX2RhdGE7CisgICAgLyoqIERhdGEgdG8gY2FsbCB0aGUgZXZlbnQgbWFuYWdlciB1cG9uICovCisgICAgdm9pZCAqICAgICAgICAgIG1faW5mb19kYXRhOworICAgIC8qKiBFcnJvciBtZXNzYWdlIGNhbGxiYWNrIGlmIGF2YWlsYWJsZSwgTlVMTCBvdGhlcndpc2UgKi8KKyAgICBvcGpfbXNnX2NhbGxiYWNrIGVycm9yX2hhbmRsZXI7CisgICAgLyoqIFdhcm5pbmcgbWVzc2FnZSBjYWxsYmFjayBpZiBhdmFpbGFibGUsIE5VTEwgb3RoZXJ3aXNlICovCisgICAgb3BqX21zZ19jYWxsYmFjayB3YXJuaW5nX2hhbmRsZXI7CisgICAgLyoqIERlYnVnIG1lc3NhZ2UgY2FsbGJhY2sgaWYgYXZhaWxhYmxlLCBOVUxMIG90aGVyd2lzZSAqLworICAgIG9wal9tc2dfY2FsbGJhY2sgaW5mb19oYW5kbGVyOwogfSBvcGpfZXZlbnRfbWdyX3Q7CiAKIAotI2RlZmluZSBFVlRfRVJST1IJMQkvKio8IEVycm9yIGV2ZW50IHR5cGUgKi8KLSNkZWZpbmUgRVZUX1dBUk5JTkcJMgkvKio8IFdhcm5pbmcgZXZlbnQgdHlwZSAqLwotI2RlZmluZSBFVlRfSU5GTwk0CS8qKjwgRGVidWcgZXZlbnQgdHlwZSAqLworI2RlZmluZSBFVlRfRVJST1IgICAxICAgLyoqPCBFcnJvciBldmVudCB0eXBlICovCisjZGVmaW5lIEVWVF9XQVJOSU5HIDIgICAvKio8IFdhcm5pbmcgZXZlbnQgdHlwZSAqLworI2RlZmluZSBFVlRfSU5GTyAgICA0ICAgLyoqPCBEZWJ1ZyBldmVudCB0eXBlICovCiAKIC8qKiBAZGVmZ3JvdXAgRVZFTlQgRVZFTlQgLSBJbXBsZW1lbnRhdGlvbiBvZiBhIGV2ZW50IGNhbGxiYWNrIHN5c3RlbSAqLwogLypAeyovCkBAIC04MSwxMyArODAsMTQgQEAKIC8qKgogICogV3JpdGUgZm9ybWF0dGVkIGRhdGEgdG8gYSBzdHJpbmcgYW5kIHNlbmQgdGhlIHN0cmluZyB0byBhIHVzZXIgY2FsbGJhY2suCiAgKgotICogQHBhcmFtIGV2ZW50X21ncgkJCUV2ZW50IGhhbmRsZXIKLSAqIEBwYXJhbSBldmVudF90eXBlIAkJRXZlbnQgdHlwZSBvciBjYWxsYmFjayB0byB1c2UgdG8gc2VuZCB0aGUgbWVzc2FnZQotICogQHBhcmFtIGZtdCAJCQkJRm9ybWF0LWNvbnRyb2wgc3RyaW5nIChwbHVzIG9wdGlvbmFsIGFyZ3VtZW50cykKKyAqIEBwYXJhbSBldmVudF9tZ3IgICAgICAgICBFdmVudCBoYW5kbGVyCisgKiBAcGFyYW0gZXZlbnRfdHlwZSAgICAgICAgRXZlbnQgdHlwZSBvciBjYWxsYmFjayB0byB1c2UgdG8gc2VuZCB0aGUgbWVzc2FnZQorICogQHBhcmFtIGZtdCAgICAgICAgICAgICAgIEZvcm1hdC1jb250cm9sIHN0cmluZyAocGx1cyBvcHRpb25hbCBhcmd1bWVudHMpCiAgKgogICogQHJldHVybiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBmYWxzZSBvdGhlcndpc2UKICAqLwotT1BKX0JPT0wgb3BqX2V2ZW50X21zZyhvcGpfZXZlbnRfbWdyX3QqIGV2ZW50X21nciwgT1BKX0lOVDMyIGV2ZW50X3R5cGUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK09QSl9CT09MIG9wal9ldmVudF9tc2cob3BqX2V2ZW50X21ncl90KiBldmVudF9tZ3IsIE9QSl9JTlQzMiBldmVudF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiAvKioKQEAgLTEwNSw0ICsxMDUsNCBAQAogCiAvKkB9Ki8KIAotI2VuZGlmIC8qIF9fRVZFTlRfSCAqLworI2VuZGlmIC8qIE9QSl9FVkVOVF9IICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2Z1bmN0aW9uX2xpc3QuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvZnVuY3Rpb25fbGlzdC5jCmluZGV4IGE3ZWExMWQuLmUxYzFhZjMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvZnVuY3Rpb25fbGlzdC5jCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvZnVuY3Rpb25fbGlzdC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAotICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZAogICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cwogICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgogICoKQEAgLTM4LDgwICszOCw4MCBAQAogCiBvcGpfcHJvY2VkdXJlX2xpc3RfdCAqICBvcGpfcHJvY2VkdXJlX2xpc3RfY3JlYXRlKCkKIHsKLSAgICAgICAgLyogbWVtb3J5IGFsbG9jYXRpb24gKi8KLSAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X3QgKiBsX3ZhbGlkYXRpb24gPSAob3BqX3Byb2NlZHVyZV9saXN0X3QgKikgb3BqX2NhbGxvYygxLHNpemVvZihvcGpfcHJvY2VkdXJlX2xpc3RfdCkpOwotICAgICAgICBpZiAoISBsX3ZhbGlkYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDA7Ci0gICAgICAgIH0KLSAgICAgICAgLyogaW5pdGlhbGl6YXRpb24gKi8KLSAgICAgICAgbF92YWxpZGF0aW9uLT5tX25iX21heF9wcm9jZWR1cmVzID0gT1BKX1ZBTElEQVRJT05fU0laRTsKLSAgICAgICAgbF92YWxpZGF0aW9uLT5tX3Byb2NlZHVyZXMgPSAob3BqX3Byb2NlZHVyZSopb3BqX2NhbGxvYyhPUEpfVkFMSURBVElPTl9TSVpFLCBzaXplb2Yob3BqX3Byb2NlZHVyZSkpOwotICAgICAgICBpZiAoISBsX3ZhbGlkYXRpb24tPm1fcHJvY2VkdXJlcykKLSAgICAgICAgewotICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfdmFsaWRhdGlvbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsX3ZhbGlkYXRpb247CisgICAgLyogbWVtb3J5IGFsbG9jYXRpb24gKi8KKyAgICBvcGpfcHJvY2VkdXJlX2xpc3RfdCAqIGxfdmFsaWRhdGlvbiA9IChvcGpfcHJvY2VkdXJlX2xpc3RfdCAqKSBvcGpfY2FsbG9jKDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob3BqX3Byb2NlZHVyZV9saXN0X3QpKTsKKyAgICBpZiAoISBsX3ZhbGlkYXRpb24pIHsKKyAgICAgICAgcmV0dXJuIDAwOworICAgIH0KKyAgICAvKiBpbml0aWFsaXphdGlvbiAqLworICAgIGxfdmFsaWRhdGlvbi0+bV9uYl9tYXhfcHJvY2VkdXJlcyA9IE9QSl9WQUxJREFUSU9OX1NJWkU7CisgICAgbF92YWxpZGF0aW9uLT5tX3Byb2NlZHVyZXMgPSAob3BqX3Byb2NlZHVyZSopb3BqX2NhbGxvYyhPUEpfVkFMSURBVElPTl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9wal9wcm9jZWR1cmUpKTsKKyAgICBpZiAoISBsX3ZhbGlkYXRpb24tPm1fcHJvY2VkdXJlcykgeworICAgICAgICBvcGpfZnJlZShsX3ZhbGlkYXRpb24pOworICAgICAgICByZXR1cm4gMDA7CisgICAgfQorICAgIHJldHVybiBsX3ZhbGlkYXRpb247CiB9CiAKIHZvaWQgIG9wal9wcm9jZWR1cmVfbGlzdF9kZXN0cm95KG9wal9wcm9jZWR1cmVfbGlzdF90ICogcF9saXN0KQogewotICAgICAgICBpZiAoISBwX2xpc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgaWYgKCEgcF9saXN0KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLyogaW5pdGlhbGl6YXRpb24gKi8KKyAgICBpZiAocF9saXN0LT5tX3Byb2NlZHVyZXMpIHsKKyAgICAgICAgb3BqX2ZyZWUocF9saXN0LT5tX3Byb2NlZHVyZXMpOworICAgIH0KKyAgICBvcGpfZnJlZShwX2xpc3QpOworfQorCitPUEpfQk9PTCBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShvcGpfcHJvY2VkdXJlX2xpc3RfdCAqCisgICAgICAgIHBfdmFsaWRhdGlvbl9saXN0LCBvcGpfcHJvY2VkdXJlIHBfcHJvY2VkdXJlLCBvcGpfZXZlbnRfbWdyX3QqIHBfbWFuYWdlcikKK3sKKworICAgIGFzc2VydChwX21hbmFnZXIgIT0gTlVMTCk7CisKKyAgICBpZiAocF92YWxpZGF0aW9uX2xpc3QtPm1fbmJfbWF4X3Byb2NlZHVyZXMgPT0KKyAgICAgICAgICAgIHBfdmFsaWRhdGlvbl9saXN0LT5tX25iX3Byb2NlZHVyZXMpIHsKKyAgICAgICAgb3BqX3Byb2NlZHVyZSAqIG5ld19wcm9jZWR1cmVzOworCisgICAgICAgIHBfdmFsaWRhdGlvbl9saXN0LT5tX25iX21heF9wcm9jZWR1cmVzICs9IE9QSl9WQUxJREFUSU9OX1NJWkU7CisgICAgICAgIG5ld19wcm9jZWR1cmVzID0gKG9wal9wcm9jZWR1cmUqKW9wal9yZWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3ZhbGlkYXRpb25fbGlzdC0+bV9wcm9jZWR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3ZhbGlkYXRpb25fbGlzdC0+bV9uYl9tYXhfcHJvY2VkdXJlcyAqIHNpemVvZihvcGpfcHJvY2VkdXJlKSk7CisgICAgICAgIGlmICghIG5ld19wcm9jZWR1cmVzKSB7CisgICAgICAgICAgICBvcGpfZnJlZShwX3ZhbGlkYXRpb25fbGlzdC0+bV9wcm9jZWR1cmVzKTsKKyAgICAgICAgICAgIHBfdmFsaWRhdGlvbl9saXN0LT5tX25iX21heF9wcm9jZWR1cmVzID0gMDsKKyAgICAgICAgICAgIHBfdmFsaWRhdGlvbl9saXN0LT5tX25iX3Byb2NlZHVyZXMgPSAwOworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCBhIG5ldyB2YWxpZGF0aW9uIHByb2NlZHVyZVxuIik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcF92YWxpZGF0aW9uX2xpc3QtPm1fcHJvY2VkdXJlcyA9IG5ld19wcm9jZWR1cmVzOwogICAgICAgICB9Ci0gICAgICAgIC8qIGluaXRpYWxpemF0aW9uICovCi0gICAgICAgIGlmIChwX2xpc3QtPm1fcHJvY2VkdXJlcykKLSAgICAgICAgewotICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfbGlzdC0+bV9wcm9jZWR1cmVzKTsKLSAgICAgICAgfQotICAgICAgICBvcGpfZnJlZShwX2xpc3QpOworICAgIH0KKyAgICBwX3ZhbGlkYXRpb25fbGlzdC0+bV9wcm9jZWR1cmVzW3BfdmFsaWRhdGlvbl9saXN0LT5tX25iX3Byb2NlZHVyZXNdID0KKyAgICAgICAgcF9wcm9jZWR1cmU7CisgICAgKytwX3ZhbGlkYXRpb25fbGlzdC0+bV9uYl9wcm9jZWR1cmVzOworCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1PUEpfQk9PTCBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZSAob3BqX3Byb2NlZHVyZV9saXN0X3QgKiBwX3ZhbGlkYXRpb25fbGlzdCwgb3BqX3Byb2NlZHVyZSBwX3Byb2NlZHVyZSwgb3BqX2V2ZW50X21ncl90KiBwX21hbmFnZXIgKQorT1BKX1VJTlQzMiBvcGpfcHJvY2VkdXJlX2xpc3RfZ2V0X25iX3Byb2NlZHVyZXMob3BqX3Byb2NlZHVyZV9saXN0X3QgKgorICAgICAgICBwX3ZhbGlkYXRpb25fbGlzdCkKIHsKLQkKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSBOVUxMKTsKLQkKLSAgICAgICAgaWYgKHBfdmFsaWRhdGlvbl9saXN0LT5tX25iX21heF9wcm9jZWR1cmVzID09IHBfdmFsaWRhdGlvbl9saXN0LT5tX25iX3Byb2NlZHVyZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcGpfcHJvY2VkdXJlICogbmV3X3Byb2NlZHVyZXM7Ci0KLSAgICAgICAgICAgICAgICBwX3ZhbGlkYXRpb25fbGlzdC0+bV9uYl9tYXhfcHJvY2VkdXJlcyArPSBPUEpfVkFMSURBVElPTl9TSVpFOwotICAgICAgICAgICAgICAgIG5ld19wcm9jZWR1cmVzID0gKG9wal9wcm9jZWR1cmUqKW9wal9yZWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgcF92YWxpZGF0aW9uX2xpc3QtPm1fcHJvY2VkdXJlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfdmFsaWRhdGlvbl9saXN0LT5tX25iX21heF9wcm9jZWR1cmVzICogc2l6ZW9mKG9wal9wcm9jZWR1cmUpKTsKLSAgICAgICAgICAgICAgICBpZiAoISBuZXdfcHJvY2VkdXJlcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX3ZhbGlkYXRpb25fbGlzdC0+bV9wcm9jZWR1cmVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfdmFsaWRhdGlvbl9saXN0LT5tX25iX21heF9wcm9jZWR1cmVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfdmFsaWRhdGlvbl9saXN0LT5tX25iX3Byb2NlZHVyZXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCBhIG5ldyB2YWxpZGF0aW9uIHByb2NlZHVyZVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcF92YWxpZGF0aW9uX2xpc3QtPm1fcHJvY2VkdXJlcyA9IG5ld19wcm9jZWR1cmVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwX3ZhbGlkYXRpb25fbGlzdC0+bV9wcm9jZWR1cmVzW3BfdmFsaWRhdGlvbl9saXN0LT5tX25iX3Byb2NlZHVyZXNdID0gcF9wcm9jZWR1cmU7Ci0gICAgICAgICsrcF92YWxpZGF0aW9uX2xpc3QtPm1fbmJfcHJvY2VkdXJlczsKLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIHBfdmFsaWRhdGlvbl9saXN0LT5tX25iX3Byb2NlZHVyZXM7CiB9CiAKLU9QSl9VSU5UMzIgb3BqX3Byb2NlZHVyZV9saXN0X2dldF9uYl9wcm9jZWR1cmVzIChvcGpfcHJvY2VkdXJlX2xpc3RfdCAqIHBfdmFsaWRhdGlvbl9saXN0KQorb3BqX3Byb2NlZHVyZSogb3BqX3Byb2NlZHVyZV9saXN0X2dldF9maXJzdF9wcm9jZWR1cmUob3BqX3Byb2NlZHVyZV9saXN0X3QgKgorICAgICAgICBwX3ZhbGlkYXRpb25fbGlzdCkKIHsKLSAgICAgICAgcmV0dXJuIHBfdmFsaWRhdGlvbl9saXN0LT5tX25iX3Byb2NlZHVyZXM7CisgICAgcmV0dXJuIHBfdmFsaWRhdGlvbl9saXN0LT5tX3Byb2NlZHVyZXM7CiB9CiAKLW9wal9wcm9jZWR1cmUqIG9wal9wcm9jZWR1cmVfbGlzdF9nZXRfZmlyc3RfcHJvY2VkdXJlIChvcGpfcHJvY2VkdXJlX2xpc3RfdCAqIHBfdmFsaWRhdGlvbl9saXN0KQordm9pZCBvcGpfcHJvY2VkdXJlX2xpc3RfY2xlYXIob3BqX3Byb2NlZHVyZV9saXN0X3QgKiBwX3ZhbGlkYXRpb25fbGlzdCkKIHsKLSAgICAgICAgcmV0dXJuIHBfdmFsaWRhdGlvbl9saXN0LT5tX3Byb2NlZHVyZXM7Ci19Ci0KLXZvaWQgb3BqX3Byb2NlZHVyZV9saXN0X2NsZWFyIChvcGpfcHJvY2VkdXJlX2xpc3RfdCAqIHBfdmFsaWRhdGlvbl9saXN0KQotewotICAgICAgICBwX3ZhbGlkYXRpb25fbGlzdC0+bV9uYl9wcm9jZWR1cmVzID0gMDsKKyAgICBwX3ZhbGlkYXRpb25fbGlzdC0+bV9uYl9wcm9jZWR1cmVzID0gMDsKIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvZnVuY3Rpb25fbGlzdC5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9mdW5jdGlvbl9saXN0LmgKaW5kZXggYWIwOTFiNy4uODFhMzk1NCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9mdW5jdGlvbl9saXN0LmgKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9mdW5jdGlvbl9saXN0LmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCiAgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCiAgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCiAgKgpAQCAtMjksMTAgKzI5LDEwIEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCi0jaWZuZGVmIF9fRlVOQ1RJT05fTElTVF9ICi0jZGVmaW5lIF9fRlVOQ1RJT05fTElTVF9ICisjaWZuZGVmIE9QSl9GVU5DVElPTl9MSVNUX0gKKyNkZWZpbmUgT1BKX0ZVTkNUSU9OX0xJU1RfSAogCi0vKiogCisvKioKICAqIEBmaWxlIGZ1bmN0aW9uX2xpc3QuaAogICogQGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIGEgbGlzdCBvZiBwcm9jZWR1cmVzLgogCkBAIC01NCwyMCArNTQsMTkgQEAKIC8qKgogICogQSBsaXN0IG9mIHByb2NlZHVyZXMuCiAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3Byb2NlZHVyZV9saXN0IAotewotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgdmFsaWRhdGlvbiBwcm9jZWR1cmVzLgotCSAqLwotCU9QSl9VSU5UMzIgbV9uYl9wcm9jZWR1cmVzOwotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgdGhlIGFycmF5IG9mIHZhbGlkYXRpb24gcHJvY2VkdXJlcy4KLQkgKi8KLQlPUEpfVUlOVDMyIG1fbmJfbWF4X3Byb2NlZHVyZXM7Ci0JLyoqCi0JICogVGhlIGFycmF5IG9mIHByb2NlZHVyZXMuCi0JICovCi0Jb3BqX3Byb2NlZHVyZSAqIG1fcHJvY2VkdXJlczsKK3R5cGVkZWYgc3RydWN0IG9wal9wcm9jZWR1cmVfbGlzdCB7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiB2YWxpZGF0aW9uIHByb2NlZHVyZXMuCisgICAgICovCisgICAgT1BKX1VJTlQzMiBtX25iX3Byb2NlZHVyZXM7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiB0aGUgYXJyYXkgb2YgdmFsaWRhdGlvbiBwcm9jZWR1cmVzLgorICAgICAqLworICAgIE9QSl9VSU5UMzIgbV9uYl9tYXhfcHJvY2VkdXJlczsKKyAgICAvKioKKyAgICAgKiBUaGUgYXJyYXkgb2YgcHJvY2VkdXJlcy4KKyAgICAgKi8KKyAgICBvcGpfcHJvY2VkdXJlICogbV9wcm9jZWR1cmVzOwogCiB9IG9wal9wcm9jZWR1cmVfbGlzdF90OwogCkBAIC03Niw3ICs3NSw3IEBACiAvKioKICAqIENyZWF0ZXMgYSB2YWxpZGF0aW9uIGxpc3QuCiAgKgotICogQHJldHVybgl0aGUgbmV3bHkgY3JlYXRlZCB2YWxpZGF0aW9uIGxpc3QuCisgKiBAcmV0dXJuICB0aGUgbmV3bHkgY3JlYXRlZCB2YWxpZGF0aW9uIGxpc3QuCiAgKi8KIG9wal9wcm9jZWR1cmVfbGlzdF90ICogIG9wal9wcm9jZWR1cmVfbGlzdF9jcmVhdGUodm9pZCk7CiAKQEAgLTkwLDQyICs4OSw0NiBAQAogLyoqCiAgKiBBZGRzIGEgbmV3IHZhbGlkYXRpb24gcHJvY2VkdXJlLgogICoKLSAqIEBwYXJhbQlwX3ZhbGlkYXRpb25fbGlzdCB0aGUgbGlzdCBvZiBwcm9jZWR1cmUgdG8gbW9kaWZ5LgotICogQHBhcmFtCXBfcHJvY2VkdXJlCQl0aGUgcHJvY2VkdXJlIHRvIGFkZC4KKyAqIEBwYXJhbSAgIHBfdmFsaWRhdGlvbl9saXN0IHRoZSBsaXN0IG9mIHByb2NlZHVyZSB0byBtb2RpZnkuCisgKiBAcGFyYW0gICBwX3Byb2NlZHVyZSAgICAgdGhlIHByb2NlZHVyZSB0byBhZGQuCisgKiBAcGFyYW0gICBwX21hbmFnZXIgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICAqCi0gKiBAcmV0dXJuCU9QSl9UUlVFIGlmIHRoZSBwcm9jZWR1cmUgY291bGQgYmUgYWRkZWQuCisgKiBAcmV0dXJuICBPUEpfVFJVRSBpZiB0aGUgcHJvY2VkdXJlIGNvdWxkIGJlIGFkZGVkLgogICovCi1PUEpfQk9PTCBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZSAob3BqX3Byb2NlZHVyZV9saXN0X3QgKiBwX3ZhbGlkYXRpb25fbGlzdCwgb3BqX3Byb2NlZHVyZSBwX3Byb2NlZHVyZSwgb3BqX2V2ZW50X21ncl90KiBwX21hbmFnZXIpOworT1BKX0JPT0wgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUob3BqX3Byb2NlZHVyZV9saXN0X3QgKgorICAgICAgICBwX3ZhbGlkYXRpb25fbGlzdCwgb3BqX3Byb2NlZHVyZSBwX3Byb2NlZHVyZSwgb3BqX2V2ZW50X21ncl90KiBwX21hbmFnZXIpOwogCiAvKioKICAqIEdldHMgdGhlIG51bWJlciBvZiB2YWxpZGF0aW9uIHByb2NlZHVyZXMuCiAgKgotICogQHBhcmFtCXBfdmFsaWRhdGlvbl9saXN0IHRoZSBsaXN0IG9mIHByb2NlZHVyZSB0byBtb2RpZnkuCisgKiBAcGFyYW0gICBwX3ZhbGlkYXRpb25fbGlzdCB0aGUgbGlzdCBvZiBwcm9jZWR1cmUgdG8gbW9kaWZ5LgogICoKICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiB2YWxpZGF0aW9uIHByb2NlZHVyZXMuCiAgKi8KLU9QSl9VSU5UMzIgb3BqX3Byb2NlZHVyZV9saXN0X2dldF9uYl9wcm9jZWR1cmVzIChvcGpfcHJvY2VkdXJlX2xpc3RfdCAqIHBfdmFsaWRhdGlvbl9saXN0KTsKK09QSl9VSU5UMzIgb3BqX3Byb2NlZHVyZV9saXN0X2dldF9uYl9wcm9jZWR1cmVzKG9wal9wcm9jZWR1cmVfbGlzdF90ICoKKyAgICAgICAgcF92YWxpZGF0aW9uX2xpc3QpOwogCiAvKioKICAqIEdldHMgdGhlIHBvaW50ZXIgb24gdGhlIGZpcnN0IHZhbGlkYXRpb24gcHJvY2VkdXJlLiBUaGlzIGZ1bmN0aW9uIGlzIHNpbWlsYXIgdG8gdGhlIEMrKwogICogaXRlcmF0b3IgY2xhc3MgdG8gaXRlcmF0ZSB0aHJvdWdoIGFsbCB0aGUgcHJvY2VkdXJlcyBpbnNpZGUgdGhlIHZhbGlkYXRpb24gbGlzdC4KICAqIHRoZSBjYWxsZXIgZG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIHBvaW50ZXIuCiAgKgotICogQHBhcmFtCXBfdmFsaWRhdGlvbl9saXN0IHRoZSBsaXN0IG9mIHByb2NlZHVyZSB0byBnZXQgdGhlIGZpcnN0IHByb2NlZHVyZSBmcm9tLgorICogQHBhcmFtICAgcF92YWxpZGF0aW9uX2xpc3QgdGhlIGxpc3Qgb2YgcHJvY2VkdXJlIHRvIGdldCB0aGUgZmlyc3QgcHJvY2VkdXJlIGZyb20uCiAgKgotICogQHJldHVybglhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHByb2NlZHVyZS4KKyAqIEByZXR1cm4gIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgcHJvY2VkdXJlLgogICovCi1vcGpfcHJvY2VkdXJlKiBvcGpfcHJvY2VkdXJlX2xpc3RfZ2V0X2ZpcnN0X3Byb2NlZHVyZSAob3BqX3Byb2NlZHVyZV9saXN0X3QgKiBwX3ZhbGlkYXRpb25fbGlzdCk7CitvcGpfcHJvY2VkdXJlKiBvcGpfcHJvY2VkdXJlX2xpc3RfZ2V0X2ZpcnN0X3Byb2NlZHVyZShvcGpfcHJvY2VkdXJlX2xpc3RfdCAqCisgICAgICAgIHBfdmFsaWRhdGlvbl9saXN0KTsKIAogCiAvKioKICAqIENsZWFycyB0aGUgbGlzdCBvZiB2YWxpZGF0aW9uIHByb2NlZHVyZXMuCiAgKgotICogQHBhcmFtCXBfdmFsaWRhdGlvbl9saXN0IHRoZSBsaXN0IG9mIHByb2NlZHVyZSB0byBjbGVhci4KKyAqIEBwYXJhbSAgIHBfdmFsaWRhdGlvbl9saXN0IHRoZSBsaXN0IG9mIHByb2NlZHVyZSB0byBjbGVhci4KICAqCiAgKi8KLXZvaWQgb3BqX3Byb2NlZHVyZV9saXN0X2NsZWFyIChvcGpfcHJvY2VkdXJlX2xpc3RfdCAqIHBfdmFsaWRhdGlvbl9saXN0KTsKK3ZvaWQgb3BqX3Byb2NlZHVyZV9saXN0X2NsZWFyKG9wal9wcm9jZWR1cmVfbGlzdF90ICogcF92YWxpZGF0aW9uX2xpc3QpOwogLypAfSovCiAKLSNlbmRpZiAvKiBfX0ZVTkNUSU9OX0xJU1RfSCAqLworI2VuZGlmIC8qIE9QSl9GVU5DVElPTl9MSVNUX0ggKi8KIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9pbWFnZS5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9pbWFnZS5jCmluZGV4IDIzNDYyZjAuLjEzYmNiOGUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvaW1hZ2UuYworKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2ltYWdlLmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCiAgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCiAgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCiAgKgpAQCAtMzEsMTA5ICszMSwxMjYgQEAKIAogI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgogCi1vcGpfaW1hZ2VfdCogb3BqX2ltYWdlX2NyZWF0ZTAodm9pZCkgewotCW9wal9pbWFnZV90ICppbWFnZSA9IChvcGpfaW1hZ2VfdCopb3BqX2NhbGxvYygxLCBzaXplb2Yob3BqX2ltYWdlX3QpKTsKLQlyZXR1cm4gaW1hZ2U7CitvcGpfaW1hZ2VfdCogb3BqX2ltYWdlX2NyZWF0ZTAodm9pZCkKK3sKKyAgICBvcGpfaW1hZ2VfdCAqaW1hZ2UgPSAob3BqX2ltYWdlX3QqKW9wal9jYWxsb2MoMSwgc2l6ZW9mKG9wal9pbWFnZV90KSk7CisgICAgcmV0dXJuIGltYWdlOwogfQogCi1vcGpfaW1hZ2VfdCogT1BKX0NBTExDT05WIG9wal9pbWFnZV9jcmVhdGUoT1BKX1VJTlQzMiBudW1jbXB0cywgb3BqX2ltYWdlX2NtcHRwYXJtX3QgKmNtcHRwYXJtcywgT1BKX0NPTE9SX1NQQUNFIGNscnNwYykgewotCU9QSl9VSU5UMzIgY29tcG5vOwotCW9wal9pbWFnZV90ICppbWFnZSA9IE5VTEw7CitvcGpfaW1hZ2VfdCogT1BKX0NBTExDT05WIG9wal9pbWFnZV9jcmVhdGUoT1BKX1VJTlQzMiBudW1jbXB0cywKKyAgICAgICAgb3BqX2ltYWdlX2NtcHRwYXJtX3QgKmNtcHRwYXJtcywgT1BKX0NPTE9SX1NQQUNFIGNscnNwYykKK3sKKyAgICBPUEpfVUlOVDMyIGNvbXBubzsKKyAgICBvcGpfaW1hZ2VfdCAqaW1hZ2UgPSBOVUxMOwogCi0JaW1hZ2UgPSAob3BqX2ltYWdlX3QqKSBvcGpfY2FsbG9jKDEsIHNpemVvZihvcGpfaW1hZ2VfdCkpOwotCWlmKGltYWdlKSB7Ci0JCWltYWdlLT5jb2xvcl9zcGFjZSA9IGNscnNwYzsKLQkJaW1hZ2UtPm51bWNvbXBzID0gbnVtY21wdHM7Ci0JCS8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHBlci1jb21wb25lbnQgaW5mb3JtYXRpb24gKi8KLQkJaW1hZ2UtPmNvbXBzID0gKG9wal9pbWFnZV9jb21wX3QqKW9wal9jYWxsb2MoMSxpbWFnZS0+bnVtY29tcHMgKiBzaXplb2Yob3BqX2ltYWdlX2NvbXBfdCkpOwotCQlpZighaW1hZ2UtPmNvbXBzKSB7Ci0JCQkvKiBUT0RPIHJlcGxhY2Ugd2l0aCBldmVudCBtYW5hZ2VyLCBicmVha3MgQVBJICovCi0JCQkvKiBmcHJpbnRmKHN0ZGVyciwiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgaW1hZ2UuXG4iKTsgKi8KLQkJCW9wal9pbWFnZV9kZXN0cm95KGltYWdlKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0JCS8qIGNyZWF0ZSB0aGUgaW5kaXZpZHVhbCBpbWFnZSBjb21wb25lbnRzICovCi0JCWZvcihjb21wbm8gPSAwOyBjb21wbm8gPCBudW1jbXB0czsgY29tcG5vKyspIHsKLQkJCW9wal9pbWFnZV9jb21wX3QgKmNvbXAgPSAmaW1hZ2UtPmNvbXBzW2NvbXBub107Ci0JCQljb21wLT5keCA9IGNtcHRwYXJtc1tjb21wbm9dLmR4OwotCQkJY29tcC0+ZHkgPSBjbXB0cGFybXNbY29tcG5vXS5keTsKLQkJCWNvbXAtPncgPSBjbXB0cGFybXNbY29tcG5vXS53OwotCQkJY29tcC0+aCA9IGNtcHRwYXJtc1tjb21wbm9dLmg7Ci0JCQljb21wLT54MCA9IGNtcHRwYXJtc1tjb21wbm9dLngwOwotCQkJY29tcC0+eTAgPSBjbXB0cGFybXNbY29tcG5vXS55MDsKLQkJCWNvbXAtPnByZWMgPSBjbXB0cGFybXNbY29tcG5vXS5wcmVjOwotCQkJY29tcC0+YnBwID0gY21wdHBhcm1zW2NvbXBub10uYnBwOwotCQkJY29tcC0+c2duZCA9IGNtcHRwYXJtc1tjb21wbm9dLnNnbmQ7Ci0JCQljb21wLT5kYXRhID0gKE9QSl9JTlQzMiopIG9wal9jYWxsb2MoY29tcC0+dyAqIGNvbXAtPmgsIHNpemVvZihPUEpfSU5UMzIpKTsKLQkJCWlmKCFjb21wLT5kYXRhKSB7Ci0JCQkJLyogVE9ETyByZXBsYWNlIHdpdGggZXZlbnQgbWFuYWdlciwgYnJlYWtzIEFQSSAqLwotCQkJCS8qIGZwcmludGYoc3RkZXJyLCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBpbWFnZS5cbiIpOyAqLwotCQkJCW9wal9pbWFnZV9kZXN0cm95KGltYWdlKTsKLQkJCQlyZXR1cm4gTlVMTDsKLQkJCX0KLQkJfQotCX0KKyAgICBpbWFnZSA9IChvcGpfaW1hZ2VfdCopIG9wal9jYWxsb2MoMSwgc2l6ZW9mKG9wal9pbWFnZV90KSk7CisgICAgaWYgKGltYWdlKSB7CisgICAgICAgIGltYWdlLT5jb2xvcl9zcGFjZSA9IGNscnNwYzsKKyAgICAgICAgaW1hZ2UtPm51bWNvbXBzID0gbnVtY21wdHM7CisgICAgICAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIHBlci1jb21wb25lbnQgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgaW1hZ2UtPmNvbXBzID0gKG9wal9pbWFnZV9jb21wX3QqKW9wal9jYWxsb2MoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPm51bWNvbXBzICogc2l6ZW9mKG9wal9pbWFnZV9jb21wX3QpKTsKKyAgICAgICAgaWYgKCFpbWFnZS0+Y29tcHMpIHsKKyAgICAgICAgICAgIC8qIFRPRE8gcmVwbGFjZSB3aXRoIGV2ZW50IG1hbmFnZXIsIGJyZWFrcyBBUEkgKi8KKyAgICAgICAgICAgIC8qIGZwcmludGYoc3RkZXJyLCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBpbWFnZS5cbiIpOyAqLworICAgICAgICAgICAgb3BqX2ltYWdlX2Rlc3Ryb3koaW1hZ2UpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgLyogY3JlYXRlIHRoZSBpbmRpdmlkdWFsIGltYWdlIGNvbXBvbmVudHMgKi8KKyAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBudW1jbXB0czsgY29tcG5vKyspIHsKKyAgICAgICAgICAgIG9wal9pbWFnZV9jb21wX3QgKmNvbXAgPSAmaW1hZ2UtPmNvbXBzW2NvbXBub107CisgICAgICAgICAgICBjb21wLT5keCA9IGNtcHRwYXJtc1tjb21wbm9dLmR4OworICAgICAgICAgICAgY29tcC0+ZHkgPSBjbXB0cGFybXNbY29tcG5vXS5keTsKKyAgICAgICAgICAgIGNvbXAtPncgPSBjbXB0cGFybXNbY29tcG5vXS53OworICAgICAgICAgICAgY29tcC0+aCA9IGNtcHRwYXJtc1tjb21wbm9dLmg7CisgICAgICAgICAgICBjb21wLT54MCA9IGNtcHRwYXJtc1tjb21wbm9dLngwOworICAgICAgICAgICAgY29tcC0+eTAgPSBjbXB0cGFybXNbY29tcG5vXS55MDsKKyAgICAgICAgICAgIGNvbXAtPnByZWMgPSBjbXB0cGFybXNbY29tcG5vXS5wcmVjOworICAgICAgICAgICAgY29tcC0+YnBwID0gY21wdHBhcm1zW2NvbXBub10uYnBwOworICAgICAgICAgICAgY29tcC0+c2duZCA9IGNtcHRwYXJtc1tjb21wbm9dLnNnbmQ7CisgICAgICAgICAgICBpZiAoY29tcC0+aCAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgIChPUEpfU0laRV9UKWNvbXAtPncgPiBTSVpFX01BWCAvIGNvbXAtPmggLyBzaXplb2YoT1BKX0lOVDMyKSkgeworICAgICAgICAgICAgICAgIC8qIFRPRE8gZXZlbnQgbWFuYWdlciAqLworICAgICAgICAgICAgICAgIG9wal9pbWFnZV9kZXN0cm95KGltYWdlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbXAtPmRhdGEgPSAoT1BKX0lOVDMyKikgb3BqX2ltYWdlX2RhdGFfYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpY29tcC0+dyAqIGNvbXAtPmggKiBzaXplb2YoT1BKX0lOVDMyKSk7CisgICAgICAgICAgICBpZiAoIWNvbXAtPmRhdGEpIHsKKyAgICAgICAgICAgICAgICAvKiBUT0RPIHJlcGxhY2Ugd2l0aCBldmVudCBtYW5hZ2VyLCBicmVha3MgQVBJICovCisgICAgICAgICAgICAgICAgLyogZnByaW50ZihzdGRlcnIsIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGltYWdlLlxuIik7ICovCisgICAgICAgICAgICAgICAgb3BqX2ltYWdlX2Rlc3Ryb3koaW1hZ2UpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtc2V0KGNvbXAtPmRhdGEsIDAsIChzaXplX3QpY29tcC0+dyAqIGNvbXAtPmggKiBzaXplb2YoT1BKX0lOVDMyKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gaW1hZ2U7CisgICAgcmV0dXJuIGltYWdlOwogfQogCi12b2lkIE9QSl9DQUxMQ09OViBvcGpfaW1hZ2VfZGVzdHJveShvcGpfaW1hZ2VfdCAqaW1hZ2UpIHsKLQlpZihpbWFnZSkgewotCQlpZihpbWFnZS0+Y29tcHMpIHsKLQkJCU9QSl9VSU5UMzIgY29tcG5vOwordm9pZCBPUEpfQ0FMTENPTlYgb3BqX2ltYWdlX2Rlc3Ryb3kob3BqX2ltYWdlX3QgKmltYWdlKQoreworICAgIGlmIChpbWFnZSkgeworICAgICAgICBpZiAoaW1hZ2UtPmNvbXBzKSB7CisgICAgICAgICAgICBPUEpfVUlOVDMyIGNvbXBubzsKIAotCQkJLyogaW1hZ2UgY29tcG9uZW50cyAqLwotCQkJZm9yKGNvbXBubyA9IDA7IGNvbXBubyA8IGltYWdlLT5udW1jb21wczsgY29tcG5vKyspIHsKLQkJCQlvcGpfaW1hZ2VfY29tcF90ICppbWFnZV9jb21wID0gJihpbWFnZS0+Y29tcHNbY29tcG5vXSk7Ci0JCQkJaWYoaW1hZ2VfY29tcC0+ZGF0YSkgewotCQkJCQlvcGpfZnJlZShpbWFnZV9jb21wLT5kYXRhKTsKLQkJCQl9Ci0JCQl9Ci0JCQlvcGpfZnJlZShpbWFnZS0+Y29tcHMpOwotCQl9CisgICAgICAgICAgICAvKiBpbWFnZSBjb21wb25lbnRzICovCisgICAgICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IGltYWdlLT5udW1jb21wczsgY29tcG5vKyspIHsKKyAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfY29tcF90ICppbWFnZV9jb21wID0gJihpbWFnZS0+Y29tcHNbY29tcG5vXSk7CisgICAgICAgICAgICAgICAgaWYgKGltYWdlX2NvbXAtPmRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX2RhdGFfZnJlZShpbWFnZV9jb21wLT5kYXRhKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcGpfZnJlZShpbWFnZS0+Y29tcHMpOworICAgICAgICB9CiAKLQkJaWYoaW1hZ2UtPmljY19wcm9maWxlX2J1ZikgewotCQkJb3BqX2ZyZWUoaW1hZ2UtPmljY19wcm9maWxlX2J1Zik7Ci0JCX0KKyAgICAgICAgaWYgKGltYWdlLT5pY2NfcHJvZmlsZV9idWYpIHsKKyAgICAgICAgICAgIG9wal9mcmVlKGltYWdlLT5pY2NfcHJvZmlsZV9idWYpOworICAgICAgICB9CiAKLQkJb3BqX2ZyZWUoaW1hZ2UpOwotCX0KKyAgICAgICAgb3BqX2ZyZWUoaW1hZ2UpOworICAgIH0KIH0KIAogLyoqCiAgKiBVcGRhdGVzIHRoZSBjb21wb25lbnRzIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgaW1hZ2UgZnJvbSB0aGUgY29kaW5nIHBhcmFtZXRlcnMuCiAgKgotICogQHBhcmFtIHBfaW1hZ2VfaGVhZGVyCXRoZSBpbWFnZSBoZWFkZXIgdG8gdXBkYXRlLgotICogQHBhcmFtIHBfY3AJCQkJdGhlIGNvZGluZyBwYXJhbWV0ZXJzIGZyb20gd2hpY2ggdG8gdXBkYXRlIHRoZSBpbWFnZS4KKyAqIEBwYXJhbSBwX2ltYWdlX2hlYWRlciAgICB0aGUgaW1hZ2UgaGVhZGVyIHRvIHVwZGF0ZS4KKyAqIEBwYXJhbSBwX2NwICAgICAgICAgICAgICB0aGUgY29kaW5nIHBhcmFtZXRlcnMgZnJvbSB3aGljaCB0byB1cGRhdGUgdGhlIGltYWdlLgogICovCi12b2lkIG9wal9pbWFnZV9jb21wX2hlYWRlcl91cGRhdGUob3BqX2ltYWdlX3QgKiBwX2ltYWdlX2hlYWRlciwgY29uc3Qgc3RydWN0IG9wal9jcCAqIHBfY3ApCit2b2lkIG9wal9pbWFnZV9jb21wX2hlYWRlcl91cGRhdGUob3BqX2ltYWdlX3QgKiBwX2ltYWdlX2hlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgb3BqX2NwICogcF9jcCkKIHsKLQlPUEpfVUlOVDMyIGksIGxfd2lkdGgsIGxfaGVpZ2h0OwotCU9QSl9VSU5UMzIgbF94MCwgbF95MCwgbF94MSwgbF95MTsKLQlPUEpfVUlOVDMyIGxfY29tcF94MCwgbF9jb21wX3kwLCBsX2NvbXBfeDEsIGxfY29tcF95MTsKLQlvcGpfaW1hZ2VfY29tcF90KiBsX2ltZ19jb21wID0gTlVMTDsKKyAgICBPUEpfVUlOVDMyIGksIGxfd2lkdGgsIGxfaGVpZ2h0OworICAgIE9QSl9VSU5UMzIgbF94MCwgbF95MCwgbF94MSwgbF95MTsKKyAgICBPUEpfVUlOVDMyIGxfY29tcF94MCwgbF9jb21wX3kwLCBsX2NvbXBfeDEsIGxfY29tcF95MTsKKyAgICBvcGpfaW1hZ2VfY29tcF90KiBsX2ltZ19jb21wID0gTlVMTDsKIAotCWxfeDAgPSBvcGpfdWludF9tYXgocF9jcC0+dHgwICwgcF9pbWFnZV9oZWFkZXItPngwKTsKLQlsX3kwID0gb3BqX3VpbnRfbWF4KHBfY3AtPnR5MCAsIHBfaW1hZ2VfaGVhZGVyLT55MCk7Ci0JbF94MSA9IHBfY3AtPnR4MCArIChwX2NwLT50dyAtIDFVKSAqIHBfY3AtPnRkeDsgLyogdmFsaWRpdHkgb2YgcF9jcCBtZW1iZXJzIHVzZWQgaGVyZSBjaGVja2VkIGluIG9wal9qMmtfcmVhZF9zaXouIENhbid0IG92ZXJmbG93LiAqLwotCWxfeTEgPSBwX2NwLT50eTAgKyAocF9jcC0+dGggLSAxVSkgKiBwX2NwLT50ZHk7IC8qIGNhbid0IG92ZXJmbG93ICovCi0JbF94MSA9IG9wal91aW50X21pbihvcGpfdWludF9hZGRzKGxfeDEsIHBfY3AtPnRkeCksIHBfaW1hZ2VfaGVhZGVyLT54MSk7IC8qIHVzZSBhZGQgc2F0dXJhdGVkIHRvIHByZXZlbnQgb3ZlcmZsb3cgKi8KLQlsX3kxID0gb3BqX3VpbnRfbWluKG9wal91aW50X2FkZHMobF95MSwgcF9jcC0+dGR5KSwgcF9pbWFnZV9oZWFkZXItPnkxKTsgLyogdXNlIGFkZCBzYXR1cmF0ZWQgdG8gcHJldmVudCBvdmVyZmxvdyAqLworICAgIGxfeDAgPSBvcGpfdWludF9tYXgocF9jcC0+dHgwLCBwX2ltYWdlX2hlYWRlci0+eDApOworICAgIGxfeTAgPSBvcGpfdWludF9tYXgocF9jcC0+dHkwLCBwX2ltYWdlX2hlYWRlci0+eTApOworICAgIGxfeDEgPSBwX2NwLT50eDAgKyAocF9jcC0+dHcgLSAxVSkgKgorICAgICAgICAgICBwX2NwLT50ZHg7IC8qIHZhbGlkaXR5IG9mIHBfY3AgbWVtYmVycyB1c2VkIGhlcmUgY2hlY2tlZCBpbiBvcGpfajJrX3JlYWRfc2l6LiBDYW4ndCBvdmVyZmxvdy4gKi8KKyAgICBsX3kxID0gcF9jcC0+dHkwICsgKHBfY3AtPnRoIC0gMVUpICogcF9jcC0+dGR5OyAvKiBjYW4ndCBvdmVyZmxvdyAqLworICAgIGxfeDEgPSBvcGpfdWludF9taW4ob3BqX3VpbnRfYWRkcyhsX3gxLCBwX2NwLT50ZHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcF9pbWFnZV9oZWFkZXItPngxKTsgLyogdXNlIGFkZCBzYXR1cmF0ZWQgdG8gcHJldmVudCBvdmVyZmxvdyAqLworICAgIGxfeTEgPSBvcGpfdWludF9taW4ob3BqX3VpbnRfYWRkcyhsX3kxLCBwX2NwLT50ZHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgcF9pbWFnZV9oZWFkZXItPnkxKTsgLyogdXNlIGFkZCBzYXR1cmF0ZWQgdG8gcHJldmVudCBvdmVyZmxvdyAqLwogCi0JbF9pbWdfY29tcCA9IHBfaW1hZ2VfaGVhZGVyLT5jb21wczsKLQlmb3IJKGkgPSAwOyBpIDwgcF9pbWFnZV9oZWFkZXItPm51bWNvbXBzOyArK2kpIHsKLQkJbF9jb21wX3gwID0gb3BqX3VpbnRfY2VpbGRpdihsX3gwLCBsX2ltZ19jb21wLT5keCk7Ci0JCWxfY29tcF95MCA9IG9wal91aW50X2NlaWxkaXYobF95MCwgbF9pbWdfY29tcC0+ZHkpOwotCQlsX2NvbXBfeDEgPSBvcGpfdWludF9jZWlsZGl2KGxfeDEsIGxfaW1nX2NvbXAtPmR4KTsKLQkJbF9jb21wX3kxID0gb3BqX3VpbnRfY2VpbGRpdihsX3kxLCBsX2ltZ19jb21wLT5keSk7Ci0JCWxfd2lkdGggICA9IG9wal91aW50X2NlaWxkaXZwb3cyKGxfY29tcF94MSAtIGxfY29tcF94MCwgbF9pbWdfY29tcC0+ZmFjdG9yKTsKLQkJbF9oZWlnaHQgID0gb3BqX3VpbnRfY2VpbGRpdnBvdzIobF9jb21wX3kxIC0gbF9jb21wX3kwLCBsX2ltZ19jb21wLT5mYWN0b3IpOwotCQlsX2ltZ19jb21wLT53ID0gbF93aWR0aDsKLQkJbF9pbWdfY29tcC0+aCA9IGxfaGVpZ2h0OwotCQlsX2ltZ19jb21wLT54MCA9IGxfY29tcF94MDsKLQkJbF9pbWdfY29tcC0+eTAgPSBsX2NvbXBfeTA7Ci0JCSsrbF9pbWdfY29tcDsKLQl9CisgICAgbF9pbWdfY29tcCA9IHBfaW1hZ2VfaGVhZGVyLT5jb21wczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcF9pbWFnZV9oZWFkZXItPm51bWNvbXBzOyArK2kpIHsKKyAgICAgICAgbF9jb21wX3gwID0gb3BqX3VpbnRfY2VpbGRpdihsX3gwLCBsX2ltZ19jb21wLT5keCk7CisgICAgICAgIGxfY29tcF95MCA9IG9wal91aW50X2NlaWxkaXYobF95MCwgbF9pbWdfY29tcC0+ZHkpOworICAgICAgICBsX2NvbXBfeDEgPSBvcGpfdWludF9jZWlsZGl2KGxfeDEsIGxfaW1nX2NvbXAtPmR4KTsKKyAgICAgICAgbF9jb21wX3kxID0gb3BqX3VpbnRfY2VpbGRpdihsX3kxLCBsX2ltZ19jb21wLT5keSk7CisgICAgICAgIGxfd2lkdGggICA9IG9wal91aW50X2NlaWxkaXZwb3cyKGxfY29tcF94MSAtIGxfY29tcF94MCwgbF9pbWdfY29tcC0+ZmFjdG9yKTsKKyAgICAgICAgbF9oZWlnaHQgID0gb3BqX3VpbnRfY2VpbGRpdnBvdzIobF9jb21wX3kxIC0gbF9jb21wX3kwLCBsX2ltZ19jb21wLT5mYWN0b3IpOworICAgICAgICBsX2ltZ19jb21wLT53ID0gbF93aWR0aDsKKyAgICAgICAgbF9pbWdfY29tcC0+aCA9IGxfaGVpZ2h0OworICAgICAgICBsX2ltZ19jb21wLT54MCA9IGxfY29tcF94MDsKKyAgICAgICAgbF9pbWdfY29tcC0+eTAgPSBsX2NvbXBfeTA7CisgICAgICAgICsrbF9pbWdfY29tcDsKKyAgICB9CiB9CiAKIApAQCAtMTQxLDEwMiArMTU4LDEwNyBAQAogICogQ29weSBvbmx5IGhlYWRlciBvZiBpbWFnZSBhbmQgaXRzIGNvbXBvbmVudCBoZWFkZXIgKG5vIGRhdGEgYXJlIGNvcGllZCkKICAqIGlmIGRlc3QgaW1hZ2UgaGF2ZSBkYXRhLCB0aGV5IHdpbGwgYmUgZnJlZWQKICAqCi0gKiBAcGFyYW0JcF9pbWFnZV9zcmMJCXRoZSBzcmMgaW1hZ2UKLSAqIEBwYXJhbQlwX2ltYWdlX2Rlc3QJdGhlIGRlc3QgaW1hZ2UKKyAqIEBwYXJhbSAgIHBfaW1hZ2Vfc3JjICAgICB0aGUgc3JjIGltYWdlCisgKiBAcGFyYW0gICBwX2ltYWdlX2Rlc3QgICAgdGhlIGRlc3QgaW1hZ2UKICAqCiAgKi8KLXZvaWQgb3BqX2NvcHlfaW1hZ2VfaGVhZGVyKGNvbnN0IG9wal9pbWFnZV90KiBwX2ltYWdlX3NyYywgb3BqX2ltYWdlX3QqIHBfaW1hZ2VfZGVzdCkKK3ZvaWQgb3BqX2NvcHlfaW1hZ2VfaGVhZGVyKGNvbnN0IG9wal9pbWFnZV90KiBwX2ltYWdlX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90KiBwX2ltYWdlX2Rlc3QpCiB7Ci0JT1BKX1VJTlQzMiBjb21wbm87CisgICAgT1BKX1VJTlQzMiBjb21wbm87CiAKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KHBfaW1hZ2Vfc3JjICE9IDAwKTsKLQlhc3NlcnQocF9pbWFnZV9kZXN0ICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfaW1hZ2Vfc3JjICE9IDAwKTsKKyAgICBhc3NlcnQocF9pbWFnZV9kZXN0ICE9IDAwKTsKIAotCXBfaW1hZ2VfZGVzdC0+eDAgPSBwX2ltYWdlX3NyYy0+eDA7Ci0JcF9pbWFnZV9kZXN0LT55MCA9IHBfaW1hZ2Vfc3JjLT55MDsKLQlwX2ltYWdlX2Rlc3QtPngxID0gcF9pbWFnZV9zcmMtPngxOwotCXBfaW1hZ2VfZGVzdC0+eTEgPSBwX2ltYWdlX3NyYy0+eTE7CisgICAgcF9pbWFnZV9kZXN0LT54MCA9IHBfaW1hZ2Vfc3JjLT54MDsKKyAgICBwX2ltYWdlX2Rlc3QtPnkwID0gcF9pbWFnZV9zcmMtPnkwOworICAgIHBfaW1hZ2VfZGVzdC0+eDEgPSBwX2ltYWdlX3NyYy0+eDE7CisgICAgcF9pbWFnZV9kZXN0LT55MSA9IHBfaW1hZ2Vfc3JjLT55MTsKIAotCWlmIChwX2ltYWdlX2Rlc3QtPmNvbXBzKXsKLQkJZm9yKGNvbXBubyA9IDA7IGNvbXBubyA8IHBfaW1hZ2VfZGVzdC0+bnVtY29tcHM7IGNvbXBubysrKSB7Ci0JCQlvcGpfaW1hZ2VfY29tcF90ICppbWFnZV9jb21wID0gJihwX2ltYWdlX2Rlc3QtPmNvbXBzW2NvbXBub10pOwotCQkJaWYoaW1hZ2VfY29tcC0+ZGF0YSkgewotCQkJCW9wal9mcmVlKGltYWdlX2NvbXAtPmRhdGEpOwotCQkJfQotCQl9Ci0JCW9wal9mcmVlKHBfaW1hZ2VfZGVzdC0+Y29tcHMpOwotCQlwX2ltYWdlX2Rlc3QtPmNvbXBzID0gTlVMTDsKLQl9CisgICAgaWYgKHBfaW1hZ2VfZGVzdC0+Y29tcHMpIHsKKyAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBwX2ltYWdlX2Rlc3QtPm51bWNvbXBzOyBjb21wbm8rKykgeworICAgICAgICAgICAgb3BqX2ltYWdlX2NvbXBfdCAqaW1hZ2VfY29tcCA9ICYocF9pbWFnZV9kZXN0LT5jb21wc1tjb21wbm9dKTsKKyAgICAgICAgICAgIGlmIChpbWFnZV9jb21wLT5kYXRhKSB7CisgICAgICAgICAgICAgICAgb3BqX2ltYWdlX2RhdGFfZnJlZShpbWFnZV9jb21wLT5kYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvcGpfZnJlZShwX2ltYWdlX2Rlc3QtPmNvbXBzKTsKKyAgICAgICAgcF9pbWFnZV9kZXN0LT5jb21wcyA9IE5VTEw7CisgICAgfQogCi0JcF9pbWFnZV9kZXN0LT5udW1jb21wcyA9IHBfaW1hZ2Vfc3JjLT5udW1jb21wczsKKyAgICBwX2ltYWdlX2Rlc3QtPm51bWNvbXBzID0gcF9pbWFnZV9zcmMtPm51bWNvbXBzOwogCi0JcF9pbWFnZV9kZXN0LT5jb21wcyA9IChvcGpfaW1hZ2VfY29tcF90Kikgb3BqX21hbGxvYyhwX2ltYWdlX2Rlc3QtPm51bWNvbXBzICogc2l6ZW9mKG9wal9pbWFnZV9jb21wX3QpKTsKLQlpZiAoIXBfaW1hZ2VfZGVzdC0+Y29tcHMpewotCQlwX2ltYWdlX2Rlc3QtPmNvbXBzID0gTlVMTDsKLQkJcF9pbWFnZV9kZXN0LT5udW1jb21wcyA9IDA7Ci0JCXJldHVybjsKLQl9CisgICAgcF9pbWFnZV9kZXN0LT5jb21wcyA9IChvcGpfaW1hZ2VfY29tcF90Kikgb3BqX21hbGxvYyhwX2ltYWdlX2Rlc3QtPm51bWNvbXBzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9wal9pbWFnZV9jb21wX3QpKTsKKyAgICBpZiAoIXBfaW1hZ2VfZGVzdC0+Y29tcHMpIHsKKyAgICAgICAgcF9pbWFnZV9kZXN0LT5jb21wcyA9IE5VTEw7CisgICAgICAgIHBfaW1hZ2VfZGVzdC0+bnVtY29tcHMgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQogCi0JZm9yIChjb21wbm89MDsgY29tcG5vIDwgcF9pbWFnZV9kZXN0LT5udW1jb21wczsgY29tcG5vKyspewotCQltZW1jcHkoICYocF9pbWFnZV9kZXN0LT5jb21wc1tjb21wbm9dKSwKLQkJCQkmKHBfaW1hZ2Vfc3JjLT5jb21wc1tjb21wbm9dKSwKLQkJCQlzaXplb2Yob3BqX2ltYWdlX2NvbXBfdCkpOwotCQlwX2ltYWdlX2Rlc3QtPmNvbXBzW2NvbXBub10uZGF0YSA9IE5VTEw7Ci0JfQorICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgcF9pbWFnZV9kZXN0LT5udW1jb21wczsgY29tcG5vKyspIHsKKyAgICAgICAgbWVtY3B5KCYocF9pbWFnZV9kZXN0LT5jb21wc1tjb21wbm9dKSwKKyAgICAgICAgICAgICAgICYocF9pbWFnZV9zcmMtPmNvbXBzW2NvbXBub10pLAorICAgICAgICAgICAgICAgc2l6ZW9mKG9wal9pbWFnZV9jb21wX3QpKTsKKyAgICAgICAgcF9pbWFnZV9kZXN0LT5jb21wc1tjb21wbm9dLmRhdGEgPSBOVUxMOworICAgIH0KIAotCXBfaW1hZ2VfZGVzdC0+Y29sb3Jfc3BhY2UgPSBwX2ltYWdlX3NyYy0+Y29sb3Jfc3BhY2U7Ci0JcF9pbWFnZV9kZXN0LT5pY2NfcHJvZmlsZV9sZW4gPSBwX2ltYWdlX3NyYy0+aWNjX3Byb2ZpbGVfbGVuOworICAgIHBfaW1hZ2VfZGVzdC0+Y29sb3Jfc3BhY2UgPSBwX2ltYWdlX3NyYy0+Y29sb3Jfc3BhY2U7CisgICAgcF9pbWFnZV9kZXN0LT5pY2NfcHJvZmlsZV9sZW4gPSBwX2ltYWdlX3NyYy0+aWNjX3Byb2ZpbGVfbGVuOwogCi0JaWYgKHBfaW1hZ2VfZGVzdC0+aWNjX3Byb2ZpbGVfbGVuKSB7Ci0JCXBfaW1hZ2VfZGVzdC0+aWNjX3Byb2ZpbGVfYnVmID0gKE9QSl9CWVRFKilvcGpfbWFsbG9jKHBfaW1hZ2VfZGVzdC0+aWNjX3Byb2ZpbGVfbGVuKTsKLQkJaWYgKCFwX2ltYWdlX2Rlc3QtPmljY19wcm9maWxlX2J1Zil7Ci0JCQlwX2ltYWdlX2Rlc3QtPmljY19wcm9maWxlX2J1ZiA9IE5VTEw7Ci0JCQlwX2ltYWdlX2Rlc3QtPmljY19wcm9maWxlX2xlbiA9IDA7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJbWVtY3B5KCBwX2ltYWdlX2Rlc3QtPmljY19wcm9maWxlX2J1ZiwKLQkJCQlwX2ltYWdlX3NyYy0+aWNjX3Byb2ZpbGVfYnVmLAotCQkJCXBfaW1hZ2Vfc3JjLT5pY2NfcHJvZmlsZV9sZW4pOwotCQl9Ci0JCWVsc2UKLQkJCXBfaW1hZ2VfZGVzdC0+aWNjX3Byb2ZpbGVfYnVmID0gTlVMTDsKKyAgICBpZiAocF9pbWFnZV9kZXN0LT5pY2NfcHJvZmlsZV9sZW4pIHsKKyAgICAgICAgcF9pbWFnZV9kZXN0LT5pY2NfcHJvZmlsZV9idWYgPSAoT1BKX0JZVEUqKW9wal9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfaW1hZ2VfZGVzdC0+aWNjX3Byb2ZpbGVfbGVuKTsKKyAgICAgICAgaWYgKCFwX2ltYWdlX2Rlc3QtPmljY19wcm9maWxlX2J1ZikgeworICAgICAgICAgICAgcF9pbWFnZV9kZXN0LT5pY2NfcHJvZmlsZV9idWYgPSBOVUxMOworICAgICAgICAgICAgcF9pbWFnZV9kZXN0LT5pY2NfcHJvZmlsZV9sZW4gPSAwOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1lbWNweShwX2ltYWdlX2Rlc3QtPmljY19wcm9maWxlX2J1ZiwKKyAgICAgICAgICAgICAgIHBfaW1hZ2Vfc3JjLT5pY2NfcHJvZmlsZV9idWYsCisgICAgICAgICAgICAgICBwX2ltYWdlX3NyYy0+aWNjX3Byb2ZpbGVfbGVuKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwX2ltYWdlX2Rlc3QtPmljY19wcm9maWxlX2J1ZiA9IE5VTEw7CisgICAgfQogCi0JcmV0dXJuOworICAgIHJldHVybjsKIH0KIAotb3BqX2ltYWdlX3QqIE9QSl9DQUxMQ09OViBvcGpfaW1hZ2VfdGlsZV9jcmVhdGUoT1BKX1VJTlQzMiBudW1jbXB0cywgb3BqX2ltYWdlX2NtcHRwYXJtX3QgKmNtcHRwYXJtcywgT1BKX0NPTE9SX1NQQUNFIGNscnNwYykgewotCU9QSl9VSU5UMzIgY29tcG5vOwotCW9wal9pbWFnZV90ICppbWFnZSA9IDAwOworb3BqX2ltYWdlX3QqIE9QSl9DQUxMQ09OViBvcGpfaW1hZ2VfdGlsZV9jcmVhdGUoT1BKX1VJTlQzMiBudW1jbXB0cywKKyAgICAgICAgb3BqX2ltYWdlX2NtcHRwYXJtX3QgKmNtcHRwYXJtcywgT1BKX0NPTE9SX1NQQUNFIGNscnNwYykKK3sKKyAgICBPUEpfVUlOVDMyIGNvbXBubzsKKyAgICBvcGpfaW1hZ2VfdCAqaW1hZ2UgPSAwMDsKIAotCWltYWdlID0gKG9wal9pbWFnZV90Kikgb3BqX2NhbGxvYygxLHNpemVvZihvcGpfaW1hZ2VfdCkpOwotCWlmIChpbWFnZSkKLQl7Ci0JCQotCQlpbWFnZS0+Y29sb3Jfc3BhY2UgPSBjbHJzcGM7Ci0JCWltYWdlLT5udW1jb21wcyA9IG51bWNtcHRzOwotCQkKLQkJLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcGVyLWNvbXBvbmVudCBpbmZvcm1hdGlvbiAqLwotCQlpbWFnZS0+Y29tcHMgPSAob3BqX2ltYWdlX2NvbXBfdCopb3BqX2NhbGxvYyhpbWFnZS0+bnVtY29tcHMsIHNpemVvZihvcGpfaW1hZ2VfY29tcF90KSk7Ci0JCWlmICghaW1hZ2UtPmNvbXBzKSB7Ci0JCQlvcGpfaW1hZ2VfZGVzdHJveShpbWFnZSk7Ci0JCQlyZXR1cm4gMDA7Ci0JCX0KLQkJCi0JCS8qIGNyZWF0ZSB0aGUgaW5kaXZpZHVhbCBpbWFnZSBjb21wb25lbnRzICovCi0JCWZvcihjb21wbm8gPSAwOyBjb21wbm8gPCBudW1jbXB0czsgY29tcG5vKyspIHsKLQkJCW9wal9pbWFnZV9jb21wX3QgKmNvbXAgPSAmaW1hZ2UtPmNvbXBzW2NvbXBub107Ci0JCQljb21wLT5keCA9IGNtcHRwYXJtc1tjb21wbm9dLmR4OwotCQkJY29tcC0+ZHkgPSBjbXB0cGFybXNbY29tcG5vXS5keTsKLQkJCWNvbXAtPncgPSBjbXB0cGFybXNbY29tcG5vXS53OwotCQkJY29tcC0+aCA9IGNtcHRwYXJtc1tjb21wbm9dLmg7Ci0JCQljb21wLT54MCA9IGNtcHRwYXJtc1tjb21wbm9dLngwOwotCQkJY29tcC0+eTAgPSBjbXB0cGFybXNbY29tcG5vXS55MDsKLQkJCWNvbXAtPnByZWMgPSBjbXB0cGFybXNbY29tcG5vXS5wcmVjOwotCQkJY29tcC0+c2duZCA9IGNtcHRwYXJtc1tjb21wbm9dLnNnbmQ7Ci0JCQljb21wLT5kYXRhID0gMDsKLQkJfQotCX0KKyAgICBpbWFnZSA9IChvcGpfaW1hZ2VfdCopIG9wal9jYWxsb2MoMSwgc2l6ZW9mKG9wal9pbWFnZV90KSk7CisgICAgaWYgKGltYWdlKSB7CiAKLQlyZXR1cm4gaW1hZ2U7CisgICAgICAgIGltYWdlLT5jb2xvcl9zcGFjZSA9IGNscnNwYzsKKyAgICAgICAgaW1hZ2UtPm51bWNvbXBzID0gbnVtY21wdHM7CisKKyAgICAgICAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgcGVyLWNvbXBvbmVudCBpbmZvcm1hdGlvbiAqLworICAgICAgICBpbWFnZS0+Y29tcHMgPSAob3BqX2ltYWdlX2NvbXBfdCopb3BqX2NhbGxvYyhpbWFnZS0+bnVtY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvcGpfaW1hZ2VfY29tcF90KSk7CisgICAgICAgIGlmICghaW1hZ2UtPmNvbXBzKSB7CisgICAgICAgICAgICBvcGpfaW1hZ2VfZGVzdHJveShpbWFnZSk7CisgICAgICAgICAgICByZXR1cm4gMDA7CisgICAgICAgIH0KKworICAgICAgICAvKiBjcmVhdGUgdGhlIGluZGl2aWR1YWwgaW1hZ2UgY29tcG9uZW50cyAqLworICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IG51bWNtcHRzOyBjb21wbm8rKykgeworICAgICAgICAgICAgb3BqX2ltYWdlX2NvbXBfdCAqY29tcCA9ICZpbWFnZS0+Y29tcHNbY29tcG5vXTsKKyAgICAgICAgICAgIGNvbXAtPmR4ID0gY21wdHBhcm1zW2NvbXBub10uZHg7CisgICAgICAgICAgICBjb21wLT5keSA9IGNtcHRwYXJtc1tjb21wbm9dLmR5OworICAgICAgICAgICAgY29tcC0+dyA9IGNtcHRwYXJtc1tjb21wbm9dLnc7CisgICAgICAgICAgICBjb21wLT5oID0gY21wdHBhcm1zW2NvbXBub10uaDsKKyAgICAgICAgICAgIGNvbXAtPngwID0gY21wdHBhcm1zW2NvbXBub10ueDA7CisgICAgICAgICAgICBjb21wLT55MCA9IGNtcHRwYXJtc1tjb21wbm9dLnkwOworICAgICAgICAgICAgY29tcC0+cHJlYyA9IGNtcHRwYXJtc1tjb21wbm9dLnByZWM7CisgICAgICAgICAgICBjb21wLT5zZ25kID0gY21wdHBhcm1zW2NvbXBub10uc2duZDsKKyAgICAgICAgICAgIGNvbXAtPmRhdGEgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGltYWdlOwogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9pbWFnZS5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9pbWFnZS5oCmluZGV4IGUwZTI3NzIuLmJhZDgzYzYgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvaW1hZ2UuaAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2ltYWdlLmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCiAgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCiAgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCiAgKgpAQCAtMjgsOCArMjgsOCBAQAogICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCi0jaWZuZGVmIF9fSU1BR0VfSAotI2RlZmluZSBfX0lNQUdFX0gKKyNpZm5kZWYgT1BKX0lNQUdFX0gKKyNkZWZpbmUgT1BKX0lNQUdFX0gKIC8qKgogQGZpbGUgaW1hZ2UuaAogQGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIG9wZXJhdGlvbnMgb24gaW1hZ2VzIChJTUFHRSkKQEAgLTU1LDE0ICs1NSwxNiBAQAogLyoqCiAgKiBVcGRhdGVzIHRoZSBjb21wb25lbnRzIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgaW1hZ2UgZnJvbSB0aGUgY29kaW5nIHBhcmFtZXRlcnMuCiAgKgotICogQHBhcmFtIHBfaW1hZ2VfaGVhZGVyCQl0aGUgaW1hZ2UgaGVhZGVyIHRvIHVwZGF0ZS4KLSAqIEBwYXJhbSBwX2NwCQkJCQl0aGUgY29kaW5nIHBhcmFtZXRlcnMgZnJvbSB3aGljaCB0byB1cGRhdGUgdGhlIGltYWdlLgorICogQHBhcmFtIHBfaW1hZ2VfaGVhZGVyICAgICAgICB0aGUgaW1hZ2UgaGVhZGVyIHRvIHVwZGF0ZS4KKyAqIEBwYXJhbSBwX2NwICAgICAgICAgICAgICAgICAgdGhlIGNvZGluZyBwYXJhbWV0ZXJzIGZyb20gd2hpY2ggdG8gdXBkYXRlIHRoZSBpbWFnZS4KICAqLwotdm9pZCBvcGpfaW1hZ2VfY29tcF9oZWFkZXJfdXBkYXRlKG9wal9pbWFnZV90ICogcF9pbWFnZSwgY29uc3Qgc3RydWN0IG9wal9jcCogcF9jcCk7Cit2b2lkIG9wal9pbWFnZV9jb21wX2hlYWRlcl91cGRhdGUob3BqX2ltYWdlX3QgKiBwX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvcGpfY3AqIHBfY3ApOwogCi12b2lkIG9wal9jb3B5X2ltYWdlX2hlYWRlcihjb25zdCBvcGpfaW1hZ2VfdCogcF9pbWFnZV9zcmMsIG9wal9pbWFnZV90KiBwX2ltYWdlX2Rlc3QpOwordm9pZCBvcGpfY29weV9pbWFnZV9oZWFkZXIoY29uc3Qgb3BqX2ltYWdlX3QqIHBfaW1hZ2Vfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QqIHBfaW1hZ2VfZGVzdCk7CiAKIC8qQH0qLwogCi0jZW5kaWYgLyogX19JTUFHRV9IICovCisjZW5kaWYgLyogT1BKX0lNQUdFX0ggKi8KIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9pbmRleGJveF9tYW5hZ2VyLmggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2luZGV4Ym94X21hbmFnZXIuaAppbmRleCBlYmNkZThmLi4yMzgxMTRiIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2luZGV4Ym94X21hbmFnZXIuaAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2luZGV4Ym94X21hbmFnZXIuaApAQCAtNTYsNyArNTYsNyBAQAogI2RlZmluZSBKUElQX1BITEQgMHg3MDY4NmM2NCAgIC8qIFBsYWNlIGhvbGRlciAgICAgICAgICAgICAgICAgICAgKi8KIAogCi0vKiAKKy8qCiAgKiBXcml0ZSB0aWxlLXBhcnQgSW5kZXggdGFibGUgYm94IChzdXBlcmJveCkKICAqCiAgKiBAcGFyYW1baW5dIGNvZmYgICAgICBvZmZzZXQgb2YgajJrIGNvZGVzdHJlYW0KQEAgLTY1LDExICs2NSwxMiBAQAogICogQHBhcmFtW2luXSBjaW8gICAgICAgZmlsZSBvdXRwdXQgaGFuZGxlCiAgKiBAcmV0dXJuICAgICAgICAgICAgICBsZW5ndGggb2YgdHBpeCBib3gKICAqLwotaW50IG9wal93cml0ZV90cGl4KCBpbnQgY29mZiwgb3BqX2NvZGVzdHJlYW1faW5mb190IGNzdHJfaW5mbywgaW50IGoya2xlbiwgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKLSAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitpbnQgb3BqX3dyaXRlX3RwaXgoaW50IGNvZmYsIG9wal9jb2Rlc3RyZWFtX2luZm9fdCBjc3RyX2luZm8sIGludCBqMmtsZW4sCisgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKyAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAKLS8qIAorLyoKICAqIFdyaXRlIHRpbGUgaGVhZGVyIGluZGV4IHRhYmxlIGJveCAoc3VwZXJib3gpCiAgKgogICogQHBhcmFtW2luXSBjb2ZmICAgICAgb2Zmc2V0IG9mIGoyayBjb2Rlc3RyZWFtCkBAIC03NywxMCArNzgsMTEgQEAKICAqIEBwYXJhbVtpbl0gY2lvICAgICAgIGZpbGUgb3V0cHV0IGhhbmRsZQogICogQHJldHVybiAgICAgICAgICAgICAgbGVuZ3RoIG9mIHRoaXggYm94CiAgKi8KLWludCBvcGpfd3JpdGVfdGhpeCggaW50IGNvZmYsIG9wal9jb2Rlc3RyZWFtX2luZm9fdCBjc3RyX2luZm8sIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworaW50IG9wal93cml0ZV90aGl4KGludCBjb2ZmLCBvcGpfY29kZXN0cmVhbV9pbmZvX3QgY3N0cl9pbmZvLAorICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIAotLyogCisvKgogICogV3JpdGUgcHJlY2luY3QgcGFja2V0IGluZGV4IHRhYmxlIGJveCAoc3VwZXJib3gpCiAgKgogICogQHBhcmFtW2luXSBjb2ZmICAgICAgb2Zmc2V0IG9mIGoyayBjb2Rlc3RyZWFtCkBAIC05MCwxMSArOTIsMTIgQEAKICAqIEBwYXJhbVtpbl0gY2lvICAgICAgIGZpbGUgb3V0cHV0IGhhbmRsZQogICogQHJldHVybiAgICAgICAgICAgICAgbGVuZ3RoIG9mIHBwaXggYm94CiAgKi8KLWludCBvcGpfd3JpdGVfcHBpeCggaW50IGNvZmYsIG9wal9jb2Rlc3RyZWFtX2luZm9fdCBjc3RyX2luZm8sIE9QSl9CT09MIEVQSHVzZWQsIGludCBqMmtsZW4sIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0gICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworaW50IG9wal93cml0ZV9wcGl4KGludCBjb2ZmLCBvcGpfY29kZXN0cmVhbV9pbmZvX3QgY3N0cl9pbmZvLCBPUEpfQk9PTCBFUEh1c2VkLAorICAgICAgICAgICAgICAgICAgIGludCBqMmtsZW4sIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCisgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogCi0vKiAKKy8qCiAgKiBXcml0ZSBwYWNrZXQgaGVhZGVyIGluZGV4IHRhYmxlIGJveCAoc3VwZXJib3gpCiAgKgogICogQHBhcmFtW2luXSBjb2ZmICAgICAgb2Zmc2V0IG9mIGoyayBjb2Rlc3RyZWFtCkBAIC0xMDQsMTAgKzEwNywxMSBAQAogICogQHBhcmFtW2luXSBjaW8gICAgICAgZmlsZSBvdXRwdXQgaGFuZGxlCiAgKiBAcmV0dXJuICAgICAgICAgICAgICBsZW5ndGggb2YgcHBpeCBib3gKICAqLwotaW50IG9wal93cml0ZV9waGl4KCBpbnQgY29mZiwgb3BqX2NvZGVzdHJlYW1faW5mb190IGNzdHJfaW5mbywgT1BKX0JPT0wgRVBIdXNlZCwgaW50IGoya2xlbiwgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKLSAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitpbnQgb3BqX3dyaXRlX3BoaXgoaW50IGNvZmYsIG9wal9jb2Rlc3RyZWFtX2luZm9fdCBjc3RyX2luZm8sIE9QSl9CT09MIEVQSHVzZWQsCisgICAgICAgICAgICAgICAgICAgaW50IGoya2xlbiwgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKyAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCi0vKiAKKy8qCiAgKiBXcml0ZSBtYW5pZmVzdCBib3ggKGJveCkKICAqCiAgKiBAcGFyYW1baW5dIHNlY29uZCBudW1iZXIgdG8gYmUgdmlzaXRlZApAQCAtMTE2LDEzICsxMjAsMTMgQEAKICAqIEBwYXJhbVtpbl0gY2lvICAgIGZpbGUgb3V0cHV0IGhhbmRsZQogICovCiAKLXZvaWQgb3BqX3dyaXRlX21hbmYoaW50IHNlY29uZCwgCi0gICAgICAgICAgICAgICAgICAgIGludCB2LCAKLSAgICAgICAgICAgICAgICAgICAgb3BqX2pwMl9ib3hfdCAqYm94LCAKK3ZvaWQgb3BqX3dyaXRlX21hbmYoaW50IHNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgaW50IHYsCisgICAgICAgICAgICAgICAgICAgIG9wal9qcDJfYm94X3QgKmJveCwKICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKLSAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKLS8qIAorLyoKICAqIFdyaXRlIG1haW4gaGVhZGVyIGluZGV4IHRhYmxlIChib3gpCiAgKgogICogQHBhcmFtW2luXSBjb2ZmIG9mZnNldCBvZiBqMmsgY29kZXN0cmVhbQpAQCAtMTMwLDE5ICsxMzQsMjQgQEAKICAqIEBwYXJhbVtpbl0gY2lvICBmaWxlIG91dHB1dCBoYW5kbGUKICAqIEByZXR1cm4gICAgICAgICBsZW5ndGggb2YgbWFpbm1oaXggYm94CiAgKi8KLWludCBvcGpfd3JpdGVfbWFpbm1oaXgoIGludCBjb2ZmLCBvcGpfY29kZXN0cmVhbV9pbmZvX3QgY3N0cl9pbmZvLCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK2ludCBvcGpfd3JpdGVfbWFpbm1oaXgoaW50IGNvZmYsIG9wal9jb2Rlc3RyZWFtX2luZm9fdCBjc3RyX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCisgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKLWludCBvcGpfd3JpdGVfcGhpeGZhaXgoIGludCBjb2ZmLCBpbnQgY29tcG5vLCBvcGpfY29kZXN0cmVhbV9pbmZvX3QgY3N0cl9pbmZvLCBPUEpfQk9PTCBFUEh1c2VkLCBpbnQgajJrbGVuLCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK2ludCBvcGpfd3JpdGVfcGhpeGZhaXgoaW50IGNvZmYsIGludCBjb21wbm8sIG9wal9jb2Rlc3RyZWFtX2luZm9fdCBjc3RyX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CT09MIEVQSHVzZWQsIGludCBqMmtsZW4sIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCisgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKLWludCBvcGpfd3JpdGVfcHBpeGZhaXgoIGludCBjb2ZmLCBpbnQgY29tcG5vLCBvcGpfY29kZXN0cmVhbV9pbmZvX3QgY3N0cl9pbmZvLCBPUEpfQk9PTCBFUEh1c2VkLCBpbnQgajJrbGVuLCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK2ludCBvcGpfd3JpdGVfcHBpeGZhaXgoaW50IGNvZmYsIGludCBjb21wbm8sIG9wal9jb2Rlc3RyZWFtX2luZm9fdCBjc3RyX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CT09MIEVQSHVzZWQsIGludCBqMmtsZW4sIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCisgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKLWludCBvcGpfd3JpdGVfdGlsZW1oaXgoIGludCBjb2ZmLCBvcGpfY29kZXN0cmVhbV9pbmZvX3QgY3N0cl9pbmZvLCBpbnQgdGlsZW5vLCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK2ludCBvcGpfd3JpdGVfdGlsZW1oaXgoaW50IGNvZmYsIG9wal9jb2Rlc3RyZWFtX2luZm9fdCBjc3RyX2luZm8sIGludCB0aWxlbm8sCisgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCisgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKLWludCBvcGpfd3JpdGVfdHBpeGZhaXgoIGludCBjb2ZmLCBpbnQgY29tcG5vLCBvcGpfY29kZXN0cmVhbV9pbmZvX3QgY3N0cl9pbmZvLCBpbnQgajJrbGVuLCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK2ludCBvcGpfd3JpdGVfdHBpeGZhaXgoaW50IGNvZmYsIGludCBjb21wbm8sIG9wal9jb2Rlc3RyZWFtX2luZm9fdCBjc3RyX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgIGludCBqMmtsZW4sIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCisgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKICNlbmRpZiAgICAgIC8qICFJTkRFWEJPWF9NQU5BR0VSX0hfICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2ludmVydC5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9pbnZlcnQuYwppbmRleCA3ZWZhZjZlLi44OWY2MDcxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2ludmVydC5jCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvaW52ZXJ0LmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCiAgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCiAgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCiAgKgpAQCAtMzEsMzMgKzMxLDMzIEBACiAKICNpbmNsdWRlICJvcGpfaW5jbHVkZXMuaCIKIAotLyoqIAorLyoqCiAgKiBMVVAgZGVjb21wb3NpdGlvbgogICovCiBzdGF0aWMgT1BKX0JPT0wgb3BqX2x1cERlY29tcG9zZShPUEpfRkxPQVQzMiAqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwZXJtdXRhdGlvbnMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBlcm11dGF0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcF9zd2FwX2FyZWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG5iX2NvbXBvKTsKLS8qKiAKKy8qKgogICogTFVQIHNvbHZpbmcKICAqLwotc3RhdGljIHZvaWQgb3BqX2x1cFNvbHZlKE9QSl9GTE9BVDMyICogcFJlc3VsdCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIqIHBNYXRyaXgsIAotICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyKiBwVmVjdG9yLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiBwUGVybXV0YXRpb25zLCAKK3N0YXRpYyB2b2lkIG9wal9sdXBTb2x2ZShPUEpfRkxPQVQzMiAqIHBSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIqIHBWZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiogcFBlcm11dGF0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG5iX2NvbXBvLAogICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcF9pbnRlcm1lZGlhdGVfZGF0YSk7CiAKLS8qKiAKKy8qKgogICpMVVAgaW52ZXJzaW9uIChjYWxsIHdpdGggdGhlIHJlc3VsdCBvZiBsdXBEZWNvbXBvc2UpCiAgKi8KLXN0YXRpYyB2b2lkIG9wal9sdXBJbnZlcnQgKCBPUEpfRkxPQVQzMiAqIHBTcmNNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgKiBwRGVzdE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG5iX2NvbXBvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwUGVybXV0YXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcF9zcmNfdGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIHBfZGVzdF90ZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcF9zd2FwX2FyZWEpOworc3RhdGljIHZvaWQgb3BqX2x1cEludmVydChPUEpfRkxPQVQzMiAqIHBTcmNNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcERlc3RNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbmJfY29tcG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwUGVybXV0YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIHBfc3JjX3RlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcF9kZXN0X3RlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcF9zd2FwX2FyZWEpOwogCiAvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNjgsMzIgKzY4LDMzIEBACiAgKiBNYXRyaXggaW52ZXJzaW9uLgogICovCiBPUEpfQk9PTCBvcGpfbWF0cml4X2ludmVyc2lvbl9mKE9QSl9GTE9BVDMyICogcFNyY01hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgKiBwRGVzdE1hdHJpeCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcERlc3RNYXRyaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbmJfY29tcG8pCiB7Ci0JT1BKX0JZVEUgKiBsX2RhdGEgPSAwMDsKLQlPUEpfVUlOVDMyIGxfcGVybXV0YXRpb25fc2l6ZSA9IG5iX2NvbXBvICogKE9QSl9VSU5UMzIpc2l6ZW9mKE9QSl9VSU5UMzIpOwotCU9QSl9VSU5UMzIgbF9zd2FwX3NpemUgPSBuYl9jb21wbyAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfRkxPQVQzMik7Ci0JT1BKX1VJTlQzMiBsX3RvdGFsX3NpemUgPSBsX3Blcm11dGF0aW9uX3NpemUgKyAzICogbF9zd2FwX3NpemU7Ci0JT1BKX1VJTlQzMiAqIGxQZXJtdXRhdGlvbnMgPSAwMDsKLQlPUEpfRkxPQVQzMiAqIGxfZG91YmxlX2RhdGEgPSAwMDsKKyAgICBPUEpfQllURSAqIGxfZGF0YSA9IDAwOworICAgIE9QSl9VSU5UMzIgbF9wZXJtdXRhdGlvbl9zaXplID0gbmJfY29tcG8gKiAoT1BKX1VJTlQzMilzaXplb2YoT1BKX1VJTlQzMik7CisgICAgT1BKX1VJTlQzMiBsX3N3YXBfc2l6ZSA9IG5iX2NvbXBvICogKE9QSl9VSU5UMzIpc2l6ZW9mKE9QSl9GTE9BVDMyKTsKKyAgICBPUEpfVUlOVDMyIGxfdG90YWxfc2l6ZSA9IGxfcGVybXV0YXRpb25fc2l6ZSArIDMgKiBsX3N3YXBfc2l6ZTsKKyAgICBPUEpfVUlOVDMyICogbFBlcm11dGF0aW9ucyA9IDAwOworICAgIE9QSl9GTE9BVDMyICogbF9kb3VibGVfZGF0YSA9IDAwOwogCi0JbF9kYXRhID0gKE9QSl9CWVRFICopIG9wal9tYWxsb2MobF90b3RhbF9zaXplKTsKLQlpZiAobF9kYXRhID09IDApIHsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0JbFBlcm11dGF0aW9ucyA9IChPUEpfVUlOVDMyICopIGxfZGF0YTsKLQlsX2RvdWJsZV9kYXRhID0gKE9QSl9GTE9BVDMyICopIChsX2RhdGEgKyBsX3Blcm11dGF0aW9uX3NpemUpOwotCW1lbXNldChsUGVybXV0YXRpb25zLDAsbF9wZXJtdXRhdGlvbl9zaXplKTsKKyAgICBsX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX21hbGxvYyhsX3RvdGFsX3NpemUpOworICAgIGlmIChsX2RhdGEgPT0gMCkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICBsUGVybXV0YXRpb25zID0gKE9QSl9VSU5UMzIgKikgbF9kYXRhOworICAgIGxfZG91YmxlX2RhdGEgPSAoT1BKX0ZMT0FUMzIgKikobF9kYXRhICsgbF9wZXJtdXRhdGlvbl9zaXplKTsKKyAgICBtZW1zZXQobFBlcm11dGF0aW9ucywgMCwgbF9wZXJtdXRhdGlvbl9zaXplKTsKIAotCWlmKCEgb3BqX2x1cERlY29tcG9zZShwU3JjTWF0cml4LGxQZXJtdXRhdGlvbnMsbF9kb3VibGVfZGF0YSxuYl9jb21wbykpIHsKLQkJb3BqX2ZyZWUobF9kYXRhKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0JCi0gICAgb3BqX2x1cEludmVydChwU3JjTWF0cml4LHBEZXN0TWF0cml4LG5iX2NvbXBvLGxQZXJtdXRhdGlvbnMsbF9kb3VibGVfZGF0YSxsX2RvdWJsZV9kYXRhICsgbmJfY29tcG8sbF9kb3VibGVfZGF0YSArIDIqbmJfY29tcG8pOwotCW9wal9mcmVlKGxfZGF0YSk7Ci0JCisgICAgaWYgKCEgb3BqX2x1cERlY29tcG9zZShwU3JjTWF0cml4LCBsUGVybXV0YXRpb25zLCBsX2RvdWJsZV9kYXRhLCBuYl9jb21wbykpIHsKKyAgICAgICAgb3BqX2ZyZWUobF9kYXRhKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICBvcGpfbHVwSW52ZXJ0KHBTcmNNYXRyaXgsIHBEZXN0TWF0cml4LCBuYl9jb21wbywgbFBlcm11dGF0aW9ucywgbF9kb3VibGVfZGF0YSwKKyAgICAgICAgICAgICAgICAgIGxfZG91YmxlX2RhdGEgKyBuYl9jb21wbywgbF9kb3VibGVfZGF0YSArIDIgKiBuYl9jb21wbyk7CisgICAgb3BqX2ZyZWUobF9kYXRhKTsKKwogICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIApAQCAtMTAzLDE5MiArMTA0LDE5MiBAQAogICAgTG9jYWwgZnVuY3Rpb25zCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9sdXBEZWNvbXBvc2UoT1BKX0ZMT0FUMzIgKiBtYXRyaXgsT1BKX1VJTlQzMiAqIHBlcm11dGF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgKiBwX3N3YXBfYXJlYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBuYl9jb21wbykgCitzdGF0aWMgT1BKX0JPT0wgb3BqX2x1cERlY29tcG9zZShPUEpfRkxPQVQzMiAqIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwZXJtdXRhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIHBfc3dhcF9hcmVhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBuYl9jb21wbykKIHsKLQlPUEpfVUlOVDMyICogdG1wUGVybXV0YXRpb25zID0gcGVybXV0YXRpb25zOwotCU9QSl9VSU5UMzIgKiBkc3RQZXJtdXRhdGlvbnM7Ci0JT1BKX1VJTlQzMiBrMj0wLHQ7Ci0JT1BKX0ZMT0FUMzIgdGVtcDsKLQlPUEpfVUlOVDMyIGksaixrOwotCU9QSl9GTE9BVDMyIHA7Ci0JT1BKX1VJTlQzMiBsTGFzdENvbHVtID0gbmJfY29tcG8gLSAxOwotCU9QSl9VSU5UMzIgbFN3YXBTaXplID0gbmJfY29tcG8gKiAoT1BKX1VJTlQzMilzaXplb2YoT1BKX0ZMT0FUMzIpOwotCU9QSl9GTE9BVDMyICogbFRtcE1hdHJpeCA9IG1hdHJpeDsKLQlPUEpfRkxPQVQzMiAqIGxDb2x1bW5NYXRyaXgsKiBsRGVzdE1hdHJpeDsKLQlPUEpfVUlOVDMyIG9mZnNldCA9IDE7Ci0JT1BKX1VJTlQzMiBsU3RyaWRlID0gbmJfY29tcG8tMTsKKyAgICBPUEpfVUlOVDMyICogdG1wUGVybXV0YXRpb25zID0gcGVybXV0YXRpb25zOworICAgIE9QSl9VSU5UMzIgKiBkc3RQZXJtdXRhdGlvbnM7CisgICAgT1BKX1VJTlQzMiBrMiA9IDAsIHQ7CisgICAgT1BKX0ZMT0FUMzIgdGVtcDsKKyAgICBPUEpfVUlOVDMyIGksIGosIGs7CisgICAgT1BKX0ZMT0FUMzIgcDsKKyAgICBPUEpfVUlOVDMyIGxMYXN0Q29sdW0gPSBuYl9jb21wbyAtIDE7CisgICAgT1BKX1VJTlQzMiBsU3dhcFNpemUgPSBuYl9jb21wbyAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfRkxPQVQzMik7CisgICAgT1BKX0ZMT0FUMzIgKiBsVG1wTWF0cml4ID0gbWF0cml4OworICAgIE9QSl9GTE9BVDMyICogbENvbHVtbk1hdHJpeCwgKiBsRGVzdE1hdHJpeDsKKyAgICBPUEpfVUlOVDMyIG9mZnNldCA9IDE7CisgICAgT1BKX1VJTlQzMiBsU3RyaWRlID0gbmJfY29tcG8gLSAxOwogCi0JLyppbml0aWFsaXplIHBlcm11dGF0aW9ucyAqLwotCWZvciAoaSA9IDA7IGkgPCBuYl9jb21wbzsgKytpKSAKLQl7Ci0gICAgCSp0bXBQZXJtdXRhdGlvbnMrKyA9IGk7Ci0JfQotCS8qIG5vdyBtYWtlIGEgcGl2b3Qgd2l0aCBjb2x1bW4gc3dpdGNoICovCi0JdG1wUGVybXV0YXRpb25zID0gcGVybXV0YXRpb25zOwotCWZvciAoayA9IDA7IGsgPCBsTGFzdENvbHVtOyArK2spIHsKLQkJcCA9IDAuMDsKKyAgICAvKmluaXRpYWxpemUgcGVybXV0YXRpb25zICovCisgICAgZm9yIChpID0gMDsgaSA8IG5iX2NvbXBvOyArK2kpIHsKKyAgICAgICAgKnRtcFBlcm11dGF0aW9ucysrID0gaTsKKyAgICB9CisgICAgLyogbm93IG1ha2UgYSBwaXZvdCB3aXRoIGNvbHVtbiBzd2l0Y2ggKi8KKyAgICB0bXBQZXJtdXRhdGlvbnMgPSBwZXJtdXRhdGlvbnM7CisgICAgZm9yIChrID0gMDsgayA8IGxMYXN0Q29sdW07ICsraykgeworICAgICAgICBwID0gMC4wOwogCi0JCS8qIHRha2UgdGhlIG1pZGRsZSBlbGVtZW50ICovCi0JCWxDb2x1bW5NYXRyaXggPSBsVG1wTWF0cml4ICsgazsKLQkJCi0JCS8qIG1ha2UgcGVybXV0YXRpb24gd2l0aCB0aGUgYmlnZ2VzdCB2YWx1ZSBpbiB0aGUgY29sdW1uICovCisgICAgICAgIC8qIHRha2UgdGhlIG1pZGRsZSBlbGVtZW50ICovCisgICAgICAgIGxDb2x1bW5NYXRyaXggPSBsVG1wTWF0cml4ICsgazsKKworICAgICAgICAvKiBtYWtlIHBlcm11dGF0aW9uIHdpdGggdGhlIGJpZ2dlc3QgdmFsdWUgaW4gdGhlIGNvbHVtbiAqLwogICAgICAgICBmb3IgKGkgPSBrOyBpIDwgbmJfY29tcG87ICsraSkgewotCQkJdGVtcCA9ICgoKmxDb2x1bW5NYXRyaXggPiAwKSA/ICpsQ29sdW1uTWF0cml4IDogLSgqbENvbHVtbk1hdHJpeCkpOwotICAgICAJCWlmICh0ZW1wID4gcCkgewotICAgICAJCQlwID0gdGVtcDsKLSAgICAgCQkJazIgPSBpOwotICAgICAJCX0KLQkJCS8qIG5leHQgbGluZSAqLwotCQkJbENvbHVtbk1hdHJpeCArPSBuYl9jb21wbzsKLSAgICAgCX0KKyAgICAgICAgICAgIHRlbXAgPSAoKCpsQ29sdW1uTWF0cml4ID4gMCkgPyAqbENvbHVtbk1hdHJpeCA6IC0oKmxDb2x1bW5NYXRyaXgpKTsKKyAgICAgICAgICAgIGlmICh0ZW1wID4gcCkgeworICAgICAgICAgICAgICAgIHAgPSB0ZW1wOworICAgICAgICAgICAgICAgIGsyID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIG5leHQgbGluZSAqLworICAgICAgICAgICAgbENvbHVtbk1hdHJpeCArPSBuYl9jb21wbzsKKyAgICAgICAgfQogCi0gICAgIAkvKiBhIHdob2xlIHJlc3Qgb2YgMCAtPiBub24gc2luZ3VsYXIgKi8KLSAgICAgCWlmIChwID09IDAuMCkgewotICAgIAkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQorICAgICAgICAvKiBhIHdob2xlIHJlc3Qgb2YgMCAtPiBub24gc2luZ3VsYXIgKi8KKyAgICAgICAgaWYgKHAgPT0gMC4wKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CiAKLQkJLyogc2hvdWxkIHdlIHBlcm11dGUgPyAqLwotCQlpZiAoazIgIT0gaykgewotCQkJLypleGNoYW5nZSBvZiBsaW5lICovCi0gICAgIAkJLyogazIgPiBrICovCi0JCQlkc3RQZXJtdXRhdGlvbnMgPSB0bXBQZXJtdXRhdGlvbnMgKyBrMiAtIGs7Ci0JCQkvKiBzd2FwIGluZGljZXMgKi8KLQkJCXQgPSAqdG1wUGVybXV0YXRpb25zOwotICAgICAJCSp0bXBQZXJtdXRhdGlvbnMgPSAqZHN0UGVybXV0YXRpb25zOwotICAgICAJCSpkc3RQZXJtdXRhdGlvbnMgPSB0OworICAgICAgICAvKiBzaG91bGQgd2UgcGVybXV0ZSA/ICovCisgICAgICAgIGlmIChrMiAhPSBrKSB7CisgICAgICAgICAgICAvKmV4Y2hhbmdlIG9mIGxpbmUgKi8KKyAgICAgICAgICAgIC8qIGsyID4gayAqLworICAgICAgICAgICAgZHN0UGVybXV0YXRpb25zID0gdG1wUGVybXV0YXRpb25zICsgazIgLSBrOworICAgICAgICAgICAgLyogc3dhcCBpbmRpY2VzICovCisgICAgICAgICAgICB0ID0gKnRtcFBlcm11dGF0aW9uczsKKyAgICAgICAgICAgICp0bXBQZXJtdXRhdGlvbnMgPSAqZHN0UGVybXV0YXRpb25zOworICAgICAgICAgICAgKmRzdFBlcm11dGF0aW9ucyA9IHQ7CiAKLQkJCS8qIGFuZCBzd2FwIGVudGlyZSBsaW5lLiAqLwotCQkJbENvbHVtbk1hdHJpeCA9IGxUbXBNYXRyaXggKyAoazIgLSBrKSAqIG5iX2NvbXBvOwotCQkJbWVtY3B5KHBfc3dhcF9hcmVhLGxDb2x1bW5NYXRyaXgsbFN3YXBTaXplKTsKLQkJCW1lbWNweShsQ29sdW1uTWF0cml4LGxUbXBNYXRyaXgsbFN3YXBTaXplKTsKLQkJCW1lbWNweShsVG1wTWF0cml4LHBfc3dhcF9hcmVhLGxTd2FwU2l6ZSk7Ci0JCX0KKyAgICAgICAgICAgIC8qIGFuZCBzd2FwIGVudGlyZSBsaW5lLiAqLworICAgICAgICAgICAgbENvbHVtbk1hdHJpeCA9IGxUbXBNYXRyaXggKyAoazIgLSBrKSAqIG5iX2NvbXBvOworICAgICAgICAgICAgbWVtY3B5KHBfc3dhcF9hcmVhLCBsQ29sdW1uTWF0cml4LCBsU3dhcFNpemUpOworICAgICAgICAgICAgbWVtY3B5KGxDb2x1bW5NYXRyaXgsIGxUbXBNYXRyaXgsIGxTd2FwU2l6ZSk7CisgICAgICAgICAgICBtZW1jcHkobFRtcE1hdHJpeCwgcF9zd2FwX2FyZWEsIGxTd2FwU2l6ZSk7CisgICAgICAgIH0KIAotCQkvKiBub3cgdXBkYXRlIGRhdGEgaW4gdGhlIHJlc3Qgb2YgdGhlIGxpbmUgYW5kIGxpbmUgYWZ0ZXIgKi8KLQkJbERlc3RNYXRyaXggPSBsVG1wTWF0cml4ICsgazsKLQkJbENvbHVtbk1hdHJpeCA9IGxEZXN0TWF0cml4ICsgbmJfY29tcG87Ci0JCS8qIHRha2UgdGhlIG1pZGRsZSBlbGVtZW50ICovCi0JCXRlbXAgPSAqKGxEZXN0TWF0cml4KyspOworICAgICAgICAvKiBub3cgdXBkYXRlIGRhdGEgaW4gdGhlIHJlc3Qgb2YgdGhlIGxpbmUgYW5kIGxpbmUgYWZ0ZXIgKi8KKyAgICAgICAgbERlc3RNYXRyaXggPSBsVG1wTWF0cml4ICsgazsKKyAgICAgICAgbENvbHVtbk1hdHJpeCA9IGxEZXN0TWF0cml4ICsgbmJfY29tcG87CisgICAgICAgIC8qIHRha2UgdGhlIG1pZGRsZSBlbGVtZW50ICovCisgICAgICAgIHRlbXAgPSAqKGxEZXN0TWF0cml4KyspOwogCi0JCS8qIG5vdyBjb21wdXRlIHVwIGRhdGEgKGkuZS4gY29lZmYgdXAgb2YgdGhlIGRpYWdvbmFsKS4gKi8KLSAgICAgCWZvciAoaSA9IG9mZnNldDsgaSA8IG5iX2NvbXBvOyArK2kpICB7Ci0JCQkvKmxDb2x1bW5NYXRyaXg7ICovCi0JCQkvKiBkaXZpZGUgdGhlIGxvd2VyIGNvbHVtbiBlbGVtZW50cyBieSB0aGUgZGlhZ29uYWwgdmFsdWUgKi8KKyAgICAgICAgLyogbm93IGNvbXB1dGUgdXAgZGF0YSAoaS5lLiBjb2VmZiB1cCBvZiB0aGUgZGlhZ29uYWwpLiAqLworICAgICAgICBmb3IgKGkgPSBvZmZzZXQ7IGkgPCBuYl9jb21wbzsgKytpKSAgeworICAgICAgICAgICAgLypsQ29sdW1uTWF0cml4OyAqLworICAgICAgICAgICAgLyogZGl2aWRlIHRoZSBsb3dlciBjb2x1bW4gZWxlbWVudHMgYnkgdGhlIGRpYWdvbmFsIHZhbHVlICovCiAKLQkJCS8qIG1hdHJpeFtpXVtrXSAvPSBtYXRyaXhba11ba107ICovCi0gICAgIAkJLyogcCA9IG1hdHJpeFtpXVtrXSAqLwotCQkJcCA9ICpsQ29sdW1uTWF0cml4IC8gdGVtcDsKLQkJCSoobENvbHVtbk1hdHJpeCsrKSA9IHA7Ci0gICAgIAkJCisgICAgICAgICAgICAvKiBtYXRyaXhbaV1ba10gLz0gbWF0cml4W2tdW2tdOyAqLworICAgICAgICAgICAgLyogcCA9IG1hdHJpeFtpXVtrXSAqLworICAgICAgICAgICAgcCA9ICpsQ29sdW1uTWF0cml4IC8gdGVtcDsKKyAgICAgICAgICAgICoobENvbHVtbk1hdHJpeCsrKSA9IHA7CisKICAgICAgICAgICAgIGZvciAoaiA9IC8qIGsgKyAxICovIG9mZnNldDsgaiA8IG5iX2NvbXBvOyArK2opIHsKLQkJCQkvKiBtYXRyaXhbaV1bal0gLT0gbWF0cml4W2ldW2tdICogbWF0cml4W2tdW2pdOyAqLwotICAgICAJCQkqKGxDb2x1bW5NYXRyaXgrKykgLT0gcCAqICgqKGxEZXN0TWF0cml4KyspKTsKLQkJCX0KLQkJCS8qIGNvbWUgYmFjayB0byB0aGUgaysxdGggZWxlbWVudCAqLwotCQkJbERlc3RNYXRyaXggLT0gbFN0cmlkZTsKLQkJCS8qIGdvIHRvIGt0aCBlbGVtZW50IG9mIHRoZSBuZXh0IGxpbmUgKi8KLQkJCWxDb2x1bW5NYXRyaXggKz0gazsKLSAgICAgCX0KKyAgICAgICAgICAgICAgICAvKiBtYXRyaXhbaV1bal0gLT0gbWF0cml4W2ldW2tdICogbWF0cml4W2tdW2pdOyAqLworICAgICAgICAgICAgICAgICoobENvbHVtbk1hdHJpeCsrKSAtPSBwICogKCoobERlc3RNYXRyaXgrKykpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogY29tZSBiYWNrIHRvIHRoZSBrKzF0aCBlbGVtZW50ICovCisgICAgICAgICAgICBsRGVzdE1hdHJpeCAtPSBsU3RyaWRlOworICAgICAgICAgICAgLyogZ28gdG8ga3RoIGVsZW1lbnQgb2YgdGhlIG5leHQgbGluZSAqLworICAgICAgICAgICAgbENvbHVtbk1hdHJpeCArPSBrOworICAgICAgICB9CiAKLQkJLyogb2Zmc2V0IGlzIG5vdyBrKzIgKi8KLQkJKytvZmZzZXQ7Ci0JCS8qIDEgZWxlbWVudCBsZXNzIGZvciBzdHJpZGUgKi8KLQkJLS1sU3RyaWRlOwotCQkvKiBuZXh0IGxpbmUgKi8KLQkJbFRtcE1hdHJpeCs9bmJfY29tcG87Ci0JCS8qIG5leHQgcGVybXV0YXRpb24gZWxlbWVudCAqLwotCQkrK3RtcFBlcm11dGF0aW9uczsKLQl9CisgICAgICAgIC8qIG9mZnNldCBpcyBub3cgaysyICovCisgICAgICAgICsrb2Zmc2V0OworICAgICAgICAvKiAxIGVsZW1lbnQgbGVzcyBmb3Igc3RyaWRlICovCisgICAgICAgIC0tbFN0cmlkZTsKKyAgICAgICAgLyogbmV4dCBsaW5lICovCisgICAgICAgIGxUbXBNYXRyaXggKz0gbmJfY29tcG87CisgICAgICAgIC8qIG5leHQgcGVybXV0YXRpb24gZWxlbWVudCAqLworICAgICAgICArK3RtcFBlcm11dGF0aW9uczsKKyAgICB9CiAgICAgcmV0dXJuIE9QSl9UUlVFOwogfQotICAgCQkKLXN0YXRpYyB2b2lkIG9wal9sdXBTb2x2ZSAoT1BKX0ZMT0FUMzIgKiBwUmVzdWx0LAotICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcE1hdHJpeCwgCi0gICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgKiBwVmVjdG9yLCAKLSAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiBwUGVybXV0YXRpb25zLCAKLSAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG5iX2NvbXBvLE9QSl9GTE9BVDMyICogcF9pbnRlcm1lZGlhdGVfZGF0YSkgCisKK3N0YXRpYyB2b2lkIG9wal9sdXBTb2x2ZShPUEpfRkxPQVQzMiAqIHBSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgKiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcFZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiBwUGVybXV0YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbmJfY29tcG8sIE9QSl9GTE9BVDMyICogcF9pbnRlcm1lZGlhdGVfZGF0YSkKIHsKLQlPUEpfSU5UMzIgazsKLSAgICBPUEpfVUlOVDMyIGksajsKLQlPUEpfRkxPQVQzMiBzdW07Ci0JT1BKX0ZMT0FUMzIgdTsKLSAgICBPUEpfVUlOVDMyIGxTdHJpZGUgPSBuYl9jb21wbysxOwotCU9QSl9GTE9BVDMyICogbEN1cnJlbnRQdHI7Ci0JT1BKX0ZMT0FUMzIgKiBsSW50ZXJtZWRpYXRlUHRyOwotCU9QSl9GTE9BVDMyICogbERlc3RQdHI7Ci0JT1BKX0ZMT0FUMzIgKiBsVG1wTWF0cml4OwotCU9QSl9GTE9BVDMyICogbExpbmVNYXRyaXggPSBwTWF0cml4OwotCU9QSl9GTE9BVDMyICogbEJlZ2luUHRyID0gcFJlc3VsdCArIG5iX2NvbXBvIC0gMTsKLQlPUEpfRkxPQVQzMiAqIGxHZW5lcmF0ZWREYXRhOwotCU9QSl9VSU5UMzIgKiBsQ3VycmVudFBlcm11dGF0aW9uUHRyID0gcFBlcm11dGF0aW9uczsKKyAgICBPUEpfSU5UMzIgazsKKyAgICBPUEpfVUlOVDMyIGksIGo7CisgICAgT1BKX0ZMT0FUMzIgc3VtOworICAgIE9QSl9GTE9BVDMyIHU7CisgICAgT1BKX1VJTlQzMiBsU3RyaWRlID0gbmJfY29tcG8gKyAxOworICAgIE9QSl9GTE9BVDMyICogbEN1cnJlbnRQdHI7CisgICAgT1BKX0ZMT0FUMzIgKiBsSW50ZXJtZWRpYXRlUHRyOworICAgIE9QSl9GTE9BVDMyICogbERlc3RQdHI7CisgICAgT1BKX0ZMT0FUMzIgKiBsVG1wTWF0cml4OworICAgIE9QSl9GTE9BVDMyICogbExpbmVNYXRyaXggPSBwTWF0cml4OworICAgIE9QSl9GTE9BVDMyICogbEJlZ2luUHRyID0gcFJlc3VsdCArIG5iX2NvbXBvIC0gMTsKKyAgICBPUEpfRkxPQVQzMiAqIGxHZW5lcmF0ZWREYXRhOworICAgIE9QSl9VSU5UMzIgKiBsQ3VycmVudFBlcm11dGF0aW9uUHRyID0gcFBlcm11dGF0aW9uczsKIAotCQotCWxJbnRlcm1lZGlhdGVQdHIgPSBwX2ludGVybWVkaWF0ZV9kYXRhOwotCWxHZW5lcmF0ZWREYXRhID0gcF9pbnRlcm1lZGlhdGVfZGF0YSArIG5iX2NvbXBvIC0gMTsKLQkKKworICAgIGxJbnRlcm1lZGlhdGVQdHIgPSBwX2ludGVybWVkaWF0ZV9kYXRhOworICAgIGxHZW5lcmF0ZWREYXRhID0gcF9pbnRlcm1lZGlhdGVfZGF0YSArIG5iX2NvbXBvIC0gMTsKKwogICAgIGZvciAoaSA9IDA7IGkgPCBuYl9jb21wbzsgKytpKSB7Ci0gICAgICAgCXN1bSA9IDAuMDsKLQkJbEN1cnJlbnRQdHIgPSBwX2ludGVybWVkaWF0ZV9kYXRhOwotCQlsVG1wTWF0cml4ID0gbExpbmVNYXRyaXg7Ci0gICAgICAgIGZvciAoaiA9IDE7IGogPD0gaTsgKytqKSAKLQkJewotCQkJLyogc3VtICs9IG1hdHJpeFtpXVtqLTFdICogeVtqLTFdOyAqLwotICAgICAgICAJc3VtICs9ICgqKGxUbXBNYXRyaXgrKykpICogKCoobEN1cnJlbnRQdHIrKykpOworICAgICAgICBzdW0gPSAwLjA7CisgICAgICAgIGxDdXJyZW50UHRyID0gcF9pbnRlcm1lZGlhdGVfZGF0YTsKKyAgICAgICAgbFRtcE1hdHJpeCA9IGxMaW5lTWF0cml4OworICAgICAgICBmb3IgKGogPSAxOyBqIDw9IGk7ICsraikgeworICAgICAgICAgICAgLyogc3VtICs9IG1hdHJpeFtpXVtqLTFdICogeVtqLTFdOyAqLworICAgICAgICAgICAgc3VtICs9ICgqKGxUbXBNYXRyaXgrKykpICogKCoobEN1cnJlbnRQdHIrKykpOwogICAgICAgICB9Ci0JCS8qeVtpXSA9IHBWZWN0b3JbcFBlcm11dGF0aW9uc1tpXV0gLSBzdW07ICovCisgICAgICAgIC8qeVtpXSA9IHBWZWN0b3JbcFBlcm11dGF0aW9uc1tpXV0gLSBzdW07ICovCiAgICAgICAgICoobEludGVybWVkaWF0ZVB0cisrKSA9IHBWZWN0b3JbKihsQ3VycmVudFBlcm11dGF0aW9uUHRyKyspXSAtIHN1bTsKLQkJbExpbmVNYXRyaXggKz0gbmJfY29tcG87Ci0JfQorICAgICAgICBsTGluZU1hdHJpeCArPSBuYl9jb21wbzsKKyAgICB9CiAKLQkvKiB3ZSB0YWtlIHRoZSBsYXN0IHBvaW50IG9mIHRoZSBtYXRyaXggKi8KLQlsTGluZU1hdHJpeCA9IHBNYXRyaXggKyBuYl9jb21wbypuYl9jb21wbyAtIDE7CisgICAgLyogd2UgdGFrZSB0aGUgbGFzdCBwb2ludCBvZiB0aGUgbWF0cml4ICovCisgICAgbExpbmVNYXRyaXggPSBwTWF0cml4ICsgbmJfY29tcG8gKiBuYl9jb21wbyAtIDE7CiAKLQkvKiBhbmQgd2UgdGFrZSBhZnRlciB0aGUgbGFzdCBwb2ludCBvZiB0aGUgZGVzdGluYXRpb24gdmVjdG9yICovCi0JbERlc3RQdHIgPSBwUmVzdWx0ICsgbmJfY29tcG87CisgICAgLyogYW5kIHdlIHRha2UgYWZ0ZXIgdGhlIGxhc3QgcG9pbnQgb2YgdGhlIGRlc3RpbmF0aW9uIHZlY3RvciAqLworICAgIGxEZXN0UHRyID0gcFJlc3VsdCArIG5iX2NvbXBvOwogCiAKICAgICBhc3NlcnQobmJfY29tcG8gIT0gMCk7Ci0JZm9yIChrID0gKE9QSl9JTlQzMiluYl9jb21wbyAtIDE7IGsgIT0gLTEgOyAtLWspIHsKLQkJc3VtID0gMC4wOwotCQlsVG1wTWF0cml4ID0gbExpbmVNYXRyaXg7CisgICAgZm9yIChrID0gKE9QSl9JTlQzMiluYl9jb21wbyAtIDE7IGsgIT0gLTEgOyAtLWspIHsKKyAgICAgICAgc3VtID0gMC4wOworICAgICAgICBsVG1wTWF0cml4ID0gbExpbmVNYXRyaXg7CiAgICAgICAgIHUgPSAqKGxUbXBNYXRyaXgrKyk7Ci0JCWxDdXJyZW50UHRyID0gbERlc3RQdHItLTsKKyAgICAgICAgbEN1cnJlbnRQdHIgPSBsRGVzdFB0ci0tOwogICAgICAgICBmb3IgKGogPSAoT1BKX1VJTlQzMikoayArIDEpOyBqIDwgbmJfY29tcG87ICsraikgewotCQkJLyogc3VtICs9IG1hdHJpeFtrXVtqXSAqIHhbal0gKi8KLSAgICAgICAgCXN1bSArPSAoKihsVG1wTWF0cml4KyspKSAqICgqKGxDdXJyZW50UHRyKyspKTsKLQkJfQotCQkvKnhba10gPSAoeVtrXSAtIHN1bSkgLyB1OyAqLworICAgICAgICAgICAgLyogc3VtICs9IG1hdHJpeFtrXVtqXSAqIHhbal0gKi8KKyAgICAgICAgICAgIHN1bSArPSAoKihsVG1wTWF0cml4KyspKSAqICgqKGxDdXJyZW50UHRyKyspKTsKKyAgICAgICAgfQorICAgICAgICAvKnhba10gPSAoeVtrXSAtIHN1bSkgLyB1OyAqLwogICAgICAgICAqKGxCZWdpblB0ci0tKSA9ICgqKGxHZW5lcmF0ZWREYXRhLS0pIC0gc3VtKSAvIHU7Ci0JCWxMaW5lTWF0cml4IC09IGxTdHJpZGU7Ci0JfQorICAgICAgICBsTGluZU1hdHJpeCAtPSBsU3RyaWRlOworICAgIH0KIH0KLSAgICAKIAotc3RhdGljIHZvaWQgb3BqX2x1cEludmVydCAoT1BKX0ZMT0FUMzIgKiBwU3JjTWF0cml4LAotICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIHBEZXN0TWF0cml4LAotICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG5iX2NvbXBvLAotICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcFBlcm11dGF0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgKiBwX3NyY190ZW1wLAotICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIHBfZGVzdF90ZW1wLAotICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIHBfc3dhcF9hcmVhICkKKworc3RhdGljIHZvaWQgb3BqX2x1cEludmVydChPUEpfRkxPQVQzMiAqIHBTcmNNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcERlc3RNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbmJfY29tcG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwUGVybXV0YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIHBfc3JjX3RlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcF9kZXN0X3RlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcF9zd2FwX2FyZWEpCiB7Ci0JT1BKX1VJTlQzMiBqLGk7Ci0JT1BKX0ZMT0FUMzIgKiBsQ3VycmVudFB0cjsKLQlPUEpfRkxPQVQzMiAqIGxMaW5lTWF0cml4ID0gcERlc3RNYXRyaXg7Ci0JT1BKX1VJTlQzMiBsU3dhcFNpemUgPSBuYl9jb21wbyAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfRkxPQVQzMik7CisgICAgT1BKX1VJTlQzMiBqLCBpOworICAgIE9QSl9GTE9BVDMyICogbEN1cnJlbnRQdHI7CisgICAgT1BKX0ZMT0FUMzIgKiBsTGluZU1hdHJpeCA9IHBEZXN0TWF0cml4OworICAgIE9QSl9VSU5UMzIgbFN3YXBTaXplID0gbmJfY29tcG8gKiAoT1BKX1VJTlQzMilzaXplb2YoT1BKX0ZMT0FUMzIpOwogCi0JZm9yIChqID0gMDsgaiA8IG5iX2NvbXBvOyArK2opIHsKLQkJbEN1cnJlbnRQdHIgPSBsTGluZU1hdHJpeCsrOwotICAgICAgICBtZW1zZXQocF9zcmNfdGVtcCwwLGxTd2FwU2l6ZSk7Ci0gICAgCXBfc3JjX3RlbXBbal0gPSAxLjA7Ci0JCW9wal9sdXBTb2x2ZShwX2Rlc3RfdGVtcCxwU3JjTWF0cml4LHBfc3JjX3RlbXAsIHBQZXJtdXRhdGlvbnMsIG5iX2NvbXBvICwgcF9zd2FwX2FyZWEpOworICAgIGZvciAoaiA9IDA7IGogPCBuYl9jb21wbzsgKytqKSB7CisgICAgICAgIGxDdXJyZW50UHRyID0gbExpbmVNYXRyaXgrKzsKKyAgICAgICAgbWVtc2V0KHBfc3JjX3RlbXAsIDAsIGxTd2FwU2l6ZSk7CisgICAgICAgIHBfc3JjX3RlbXBbal0gPSAxLjA7CisgICAgICAgIG9wal9sdXBTb2x2ZShwX2Rlc3RfdGVtcCwgcFNyY01hdHJpeCwgcF9zcmNfdGVtcCwgcFBlcm11dGF0aW9ucywgbmJfY29tcG8sCisgICAgICAgICAgICAgICAgICAgICBwX3N3YXBfYXJlYSk7CiAKLQkJZm9yIChpID0gMDsgaSA8IG5iX2NvbXBvOyArK2kpIHsKLSAgICAJCSoobEN1cnJlbnRQdHIpID0gcF9kZXN0X3RlbXBbaV07Ci0JCQlsQ3VycmVudFB0cis9bmJfY29tcG87Ci0gICAgCX0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5iX2NvbXBvOyArK2kpIHsKKyAgICAgICAgICAgICoobEN1cnJlbnRQdHIpID0gcF9kZXN0X3RlbXBbaV07CisgICAgICAgICAgICBsQ3VycmVudFB0ciArPSBuYl9jb21wbzsKKyAgICAgICAgfQogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9pbnZlcnQuaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvaW52ZXJ0LmgKaW5kZXggMmZhZThlNS4uNzA0MDIxMyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9pbnZlcnQuaAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2ludmVydC5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAotICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZAogICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cwogICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgogICoKQEAgLTI5LDggKzI5LDggQEAKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKLSNpZm5kZWYgX19JTlZFUlRfSAotI2RlZmluZSBfX0lOVkVSVF9ICisjaWZuZGVmIE9QSl9JTlZFUlRfSAorI2RlZmluZSBPUEpfSU5WRVJUX0gKIC8qKgogQGZpbGUgaW52ZXJ0LmgKIEBicmllZiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWF0cml4IGludmVyc2lvbgpAQCAtNDgsMTcgKzQ4LDE3IEBACiAgKiBDYWxjdWxhdGVzIGEgbiB4IG4gZG91YmxlIG1hdHJpeCBpbnZlcnNpb24gd2l0aCBhIExVUCBtZXRob2QuIERhdGEgaXMgYWxpZ25lZCwgcm93cyBhZnRlciByb3dzIChvciBjb2x1bW5zIGFmdGVyIGNvbHVtbnMpLgogICogVGhlIGZ1bmN0aW9uIGRvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIGFueSBtZW1vcnkgYmxvY2ssIGRhdGEgbXVzdCBiZSBmcmVkIGJ5IHRoZSB1c2VyLgogICoKLSAqIEBwYXJhbSBwU3JjTWF0cml4CXRoZSBtYXRyaXggdG8gaW52ZXJ0LgotICogQHBhcmFtIHBEZXN0TWF0cml4CWRhdGEgdG8gc3RvcmUgdGhlIGludmVydGVkIG1hdHJpeC4gCi0gKiBAcGFyYW0gbiBzaXplIG9mIHRoZSBtYXRyaXgKKyAqIEBwYXJhbSBwU3JjTWF0cml4ICAgIHRoZSBtYXRyaXggdG8gaW52ZXJ0LgorICogQHBhcmFtIHBEZXN0TWF0cml4ICAgZGF0YSB0byBzdG9yZSB0aGUgaW52ZXJ0ZWQgbWF0cml4LgorICogQHBhcmFtIG5iX2NvbXBvICAgICAgc2l6ZSBvZiB0aGUgbWF0cml4CiAgKiBAcmV0dXJuIE9QSl9UUlVFIGlmIHRoZSBpbnZlcnNpb24gaXMgc3VjY2Vzc2Z1bCwgT1BKX0ZBTFNFIGlmIHRoZSBtYXRyaXggaXMgc2luZ3VsYXIuCiAgKi8KIE9QSl9CT09MIG9wal9tYXRyaXhfaW52ZXJzaW9uX2YoT1BKX0ZMT0FUMzIgKiBwU3JjTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIHBEZXN0TWF0cml4LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgKiBwRGVzdE1hdHJpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBuYl9jb21wbyk7CiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLypAfSovCiAKIC8qQH0qLwogCi0jZW5kaWYgLyogX19JTlZFUlRfSCAqLyAKKyNlbmRpZiAvKiBPUEpfSU5WRVJUX0ggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2oyay5jCmluZGV4IGNiNWEyODMuLmNlYTYxNDcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmMKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKLSAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQKICAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKICAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KICAqCkBAIC04LDE0ICs4LDE1IEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXgKICAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0LCBBbnRvbmluIERlc2NhbXBlCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KICAqIENvcHlyaWdodCAoYykgMjAwOCwgSmVyb21lIEZpbWVzLCBDb21tdW5pY2F0aW9ucyAmIFN5c3RlbWVzIDxqZXJvbWUuZmltZXNAYy1zLmZyPgogICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcsIFBhcnZhdGhhIEVsYW5nb3ZhbgogICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIEthb3JpIEhhZ2loYXJhCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZyYW5jZSAKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRnJhbmNlCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQorICogQ29weXJpZ2h0IChjKSAyMDE3LCBJbnRvUElYIFNBIDxzdXBwb3J0QGludG9waXguY29tPgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTUxLDE0ICs1MiwxNSBAQAogLyoqCiAgKiBTZXRzIHVwIHRoZSBwcm9jZWR1cmVzIHRvIGRvIG9uIHJlYWRpbmcgaGVhZGVyLiBEZXZlbG9wcGVycyB3YW50aW5nIHRvIGV4dGVuZCB0aGUgbGlicmFyeSBjYW4gYWRkIHRoZWlyIG93biByZWFkaW5nIHByb2NlZHVyZXMuCiAgKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3NldHVwX2hlYWRlcl9yZWFkaW5nIChvcGpfajJrX3QgKnBfajJrLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfc2V0dXBfaGVhZGVyX3JlYWRpbmcob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBUaGUgcmVhZCBoZWFkZXIgcHJvY2VkdXJlLgogICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2hlYWRlcl9wcm9jZWR1cmUoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfaGVhZGVyX3Byb2NlZHVyZShvcGpfajJrX3QgKnBfajJrLAorICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogVGhlIGRlZmF1bHQgZW5jb2RpbmcgdmFsaWRhdGlvbiBwcm9jZWR1cmUgd2l0aG91dCBhbnkgZXh0ZW5zaW9uLgpAQCAtNjksOSArNzEsOSBAQAogICoKICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFyYW1ldGVycyBhcmUgY29ycmVjdC4KICAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZW5jb2RpbmdfdmFsaWRhdGlvbiAoICAgb3BqX2oya190ICogcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2VuY29kaW5nX3ZhbGlkYXRpb24ob3BqX2oya190ICogcF9qMmssCisgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBUaGUgZGVmYXVsdCBkZWNvZGluZyB2YWxpZGF0aW9uIHByb2NlZHVyZSB3aXRob3V0IGFueSBleHRlbnNpb24uCkBAIC04MiwyNyArODQsMzAgQEAKICAqCiAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhcmFtZXRlcnMgYXJlIGNvcnJlY3QuCiAgKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2RlY29kaW5nX3ZhbGlkYXRpb24gKCAgIG9wal9qMmtfdCAqIHBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19kZWNvZGluZ192YWxpZGF0aW9uKG9wal9qMmtfdCAqIHBfajJrLAorICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogU2V0cyB1cCB0aGUgdmFsaWRhdGlvbiAsaS5lLiBhZGRzIHRoZSBwcm9jZWR1cmVzIHRvIGxhdWNoIHRvIG1ha2Ugc3VyZSB0aGUgY29kZWMgcGFyYW1ldGVycwogICogYXJlIHZhbGlkLiBEZXZlbG9wcGVycyB3YW50aW5nIHRvIGV4dGVuZCB0aGUgbGlicmFyeSBjYW4gYWRkIHRoZWlyIG93biB2YWxpZGF0aW9uIHByb2NlZHVyZXMuCiAgKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3NldHVwX2VuY29kaW5nX3ZhbGlkYXRpb24gKG9wal9qMmtfdCAqcF9qMmssIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19zZXR1cF9lbmNvZGluZ192YWxpZGF0aW9uKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogU2V0cyB1cCB0aGUgdmFsaWRhdGlvbiAsaS5lLiBhZGRzIHRoZSBwcm9jZWR1cmVzIHRvIGxhdWNoIHRvIG1ha2Ugc3VyZSB0aGUgY29kZWMgcGFyYW1ldGVycwogICogYXJlIHZhbGlkLiBEZXZlbG9wcGVycyB3YW50aW5nIHRvIGV4dGVuZCB0aGUgbGlicmFyeSBjYW4gYWRkIHRoZWlyIG93biB2YWxpZGF0aW9uIHByb2NlZHVyZXMuCiAgKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3NldHVwX2RlY29kaW5nX3ZhbGlkYXRpb24gKG9wal9qMmtfdCAqcF9qMmssIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19zZXR1cF9kZWNvZGluZ192YWxpZGF0aW9uKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogU2V0cyB1cCB0aGUgdmFsaWRhdGlvbiAsaS5lLiBhZGRzIHRoZSBwcm9jZWR1cmVzIHRvIGxhdWNoIHRvIG1ha2Ugc3VyZSB0aGUgY29kZWMgcGFyYW1ldGVycwogICogYXJlIHZhbGlkLiBEZXZlbG9wcGVycyB3YW50aW5nIHRvIGV4dGVuZCB0aGUgbGlicmFyeSBjYW4gYWRkIHRoZWlyIG93biB2YWxpZGF0aW9uIHByb2NlZHVyZXMuCiAgKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3NldHVwX2VuZF9jb21wcmVzcyAob3BqX2oya190ICpwX2oyaywgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3NldHVwX2VuZF9jb21wcmVzcyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIFRoZSBtY3QgZW5jb2RpbmcgdmFsaWRhdGlvbiBwcm9jZWR1cmUuCkBAIC0xMTMsMzMgKzExOCwzMyBAQAogICoKICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFyYW1ldGVycyBhcmUgY29ycmVjdC4KICAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfbWN0X3ZhbGlkYXRpb24gKG9wal9qMmtfdCAqIHBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX21jdF92YWxpZGF0aW9uKG9wal9qMmtfdCAqIHBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBCdWlsZHMgdGhlIHRjZCBkZWNvZGVyIHRvIHVzZSB0byBkZWNvZGUgdGlsZS4KICAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfYnVpbGRfZGVjb2RlciAoIG9wal9qMmtfdCAqIHBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2J1aWxkX2RlY29kZXIob3BqX2oya190ICogcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIC8qKgogICogQnVpbGRzIHRoZSB0Y2QgZW5jb2RlciB0byB1c2UgdG8gZW5jb2RlIHRpbGUuCiAgKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2J1aWxkX2VuY29kZXIgKCBvcGpfajJrX3QgKiBwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19idWlsZF9lbmNvZGVyKG9wal9qMmtfdCAqIHBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgotICogQ3JlYXRlcyBhIHRpbGUtY29kZXIgZGVjb2Rlci4KKyAqIENyZWF0ZXMgYSB0aWxlLWNvZGVyIGVuY29kZXIuCiAgKgogICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgogICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2NyZWF0ZV90Y2QoICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfY3JlYXRlX3RjZChvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogRXhjdXRlcyB0aGUgZ2l2ZW4gcHJvY2VkdXJlcyBvbiB0aGUgZ2l2ZW4gY29kZWMuCkBAIC0xNTEsMTAgKzE1NiwxMCBAQAogICoKICAqIEByZXR1cm4gICAgICB0cnVlICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGFsbCB0aGUgcHJvY2VkdXJlcyB3ZXJlIHN1Y2Nlc3NmdWxseSBleGVjdXRlZC4KICAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZXhlYyAoICBvcGpfajJrX3QgKiBwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcHJvY2VkdXJlX2xpc3RfdCAqIHBfcHJvY2VkdXJlX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19leGVjKG9wal9qMmtfdCAqIHBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcHJvY2VkdXJlX2xpc3RfdCAqIHBfcHJvY2VkdXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBVcGRhdGVzIHRoZSByYXRlcyBvZiB0aGUgdGNwLgpAQCAtMTYzLDI0ICsxNjgsMjQgQEAKICAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICAgICAgICAgIEoySyBjb2RlYy4KICAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3VwZGF0ZV9yYXRlcyggICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3VwZGF0ZV9yYXRlcyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIENvcGllcyB0aGUgZGVjb2RpbmcgdGlsZSBwYXJhbWV0ZXJzIG9udG8gYWxsIHRoZSB0aWxlIHBhcmFtZXRlcnMuCiAgKiBDcmVhdGVzIGFsc28gdGhlIHRpbGUgZGVjb2Rlci4KICAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfY29weV9kZWZhdWx0X3RjcF9hbmRfY3JlYXRlX3RjZCAoICAgICAgIG9wal9qMmtfdCAqIHBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19jb3B5X2RlZmF1bHRfdGNwX2FuZF9jcmVhdGVfdGNkKG9wal9qMmtfdCAqIHBfajJrLAorICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogRGVzdHJveXMgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIGRlY29kaW5nIG9mIGhlYWRlcnMuCiAgKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2Rlc3Ryb3lfaGVhZGVyX21lbW9yeSAoIG9wal9qMmtfdCAqIHBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19kZXN0cm95X2hlYWRlcl9tZW1vcnkob3BqX2oya190ICogcF9qMmssCisgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBSZWFkcyB0aGUgbG9va3VwIHRhYmxlIGNvbnRhaW5pbmcgYWxsIHRoZSBtYXJrZXIsIHN0YXR1cyBhbmQgYWN0aW9uLCBhbmQgcmV0dXJucyB0aGUgaGFuZGxlciBhc3NvY2lhdGVkCkBAIC0xODksMjggKzE5NCw0MiBAQAogICoKICAqIEByZXR1cm4gICAgICB0aGUgaGFuZGxlciBhc3NvY2lhdGVkIHdpdGggdGhlIGlkLgogKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3BqX2RlY19tZW1vcnlfbWFya2VyX2hhbmRsZXIgKiBvcGpfajJrX2dldF9tYXJrZXJfaGFuZGxlciAoT1BKX1VJTlQzMiBwX2lkKTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3BqX2RlY19tZW1vcnlfbWFya2VyX2hhbmRsZXIgKiBvcGpfajJrX2dldF9tYXJrZXJfaGFuZGxlcigKKyAgICBPUEpfVUlOVDMyIHBfaWQpOwogCiAvKioKICAqIERlc3Ryb3lzIGEgdGlsZSBjb2RpbmcgcGFyYW1ldGVyIHN0cnVjdHVyZS4KICAqCiAgKiBAcGFyYW0gICAgICAgcF90Y3AgICAgICAgICAgIHRoZSB0aWxlIGNvZGluZyBwYXJhbWV0ZXIgdG8gZGVzdHJveS4KICAqLwotc3RhdGljIHZvaWQgb3BqX2oya190Y3BfZGVzdHJveSAob3BqX3RjcF90ICpwX3RjcCk7CitzdGF0aWMgdm9pZCBvcGpfajJrX3RjcF9kZXN0cm95KG9wal90Y3BfdCAqcF90Y3ApOwogCiAvKioKICAqIERlc3Ryb3lzIHRoZSBkYXRhIGluc2lkZSBhIHRpbGUgY29kaW5nIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCiAgKgogICogQHBhcmFtICAgICAgIHBfdGNwICAgICAgICAgICB0aGUgdGlsZSBjb2RpbmcgcGFyYW1ldGVyIHdoaWNoIGNvbnRhaW4gZGF0YSB0byBkZXN0cm95LgogICovCi1zdGF0aWMgdm9pZCBvcGpfajJrX3RjcF9kYXRhX2Rlc3Ryb3kgKG9wal90Y3BfdCAqcF90Y3ApOworc3RhdGljIHZvaWQgb3BqX2oya190Y3BfZGF0YV9kZXN0cm95KG9wal90Y3BfdCAqcF90Y3ApOwogCiAvKioKICAqIERlc3Ryb3lzIGEgY29kaW5nIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCiAgKgogICogQHBhcmFtICAgICAgIHBfY3AgICAgICAgICAgICB0aGUgY29kaW5nIHBhcmFtZXRlciB0byBkZXN0cm95LgogICovCi1zdGF0aWMgdm9pZCBvcGpfajJrX2NwX2Rlc3Ryb3kgKG9wal9jcF90ICpwX2NwKTsKK3N0YXRpYyB2b2lkIG9wal9qMmtfY3BfZGVzdHJveShvcGpfY3BfdCAqcF9jcCk7CisKKy8qKgorICogQ29tcGFyZSAyIGEgU1BDb2QvIFNQQ29jIGVsZW1lbnRzLCBpLmUuIHRoZSBjb2Rpbmcgc3R5bGUgb2YgYSBnaXZlbiBjb21wb25lbnQgb2YgYSB0aWxlLgorICoKKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgIEoySyBjb2RlYy4KKyAqIEBwYXJhbSAgICAgICBwX3RpbGVfbm8gICAgICAgIFRpbGUgbnVtYmVyCisgKiBAcGFyYW0gICAgICAgcF9maXJzdF9jb21wX25vICBUaGUgMXN0IGNvbXBvbmVudCBudW1iZXIgdG8gY29tcGFyZS4KKyAqIEBwYXJhbSAgICAgICBwX3NlY29uZF9jb21wX25vIFRoZSAxc3QgY29tcG9uZW50IG51bWJlciB0byBjb21wYXJlLgorICoKKyAqIEByZXR1cm4gT1BKX1RSVUUgaWYgU1BDZG9kIGFyZSBlcXVhbHMuCisgKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2NvbXBhcmVfU1BDb2RfU1BDb2Mob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sIE9QSl9VSU5UMzIgcF9maXJzdF9jb21wX25vLCBPUEpfVUlOVDMyIHBfc2Vjb25kX2NvbXBfbm8pOwogCiAvKioKICAqIFdyaXRlcyBhIFNQQ29kIG9yIFNQQ29jIGVsZW1lbnQsIGkuZS4gdGhlIGNvZGluZyBzdHlsZSBvZiBhIGdpdmVuIGNvbXBvbmVudCBvZiBhIHRpbGUuCkBAIC0yMjQsMTIgKzI0MywxMiBAQAogICoKICAqIEByZXR1cm4gRklYTUUgRE9DCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfU1BDb2RfU1BDb2MoICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9TUENvZF9TUENvYyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9ubywKKyAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCisgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAorICAgICAgICBPUEpfVUlOVDMyICogcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBHZXRzIHRoZSBzaXplIHRha2VuIGJ5IHdyaXRpbmcgYSBTUENvZCBvciBTUENvYyBmb3IgdGhlIGdpdmVuIHRpbGUgYW5kIGNvbXBvbmVudC4KQEAgLTI0MCw5ICsyNTksOSBAQAogICoKICAqIEByZXR1cm4gICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRha2VuIGJ5IHRoZSBTUENvZCBlbGVtZW50LgogICovCi1zdGF0aWMgT1BKX1VJTlQzMiBvcGpfajJrX2dldF9TUENvZF9TUENvY19zaXplIChvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8gKTsKK3N0YXRpYyBPUEpfVUlOVDMyIG9wal9qMmtfZ2V0X1NQQ29kX1NQQ29jX3NpemUob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCisgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vKTsKIAogLyoqCiAgKiBSZWFkcyBhIFNQQ29kIG9yIFNQQ29jIGVsZW1lbnQsIGkuZS4gdGhlIGNvZGluZyBzdHlsZSBvZiBhIGdpdmVuIGNvbXBvbmVudCBvZiBhIHRpbGUuCkBAIC0yNTIsMTEgKzI3MSwxMSBAQAogICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPTSBtYXJrZXIuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9TUENvZF9TUENvYyggICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNvbXBubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX1NQQ29kX1NQQ29jKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgIE9QSl9VSU5UMzIgY29tcG5vLAorICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgIE9QSl9VSU5UMzIgKiBwX2hlYWRlcl9zaXplLAorICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIEdldHMgdGhlIHNpemUgdGFrZW4gYnkgd3JpdGluZyBTUWNkIG9yIFNRY2MgZWxlbWVudCwgaS5lLiB0aGUgcXVhbnRpemF0aW9uIHZhbHVlcyBvZiBhIGJhbmQgaW4gdGhlIFFDRCBvciBRQ0MuCkBAIC0yNjcsOSArMjg2LDIzIEBACiAgKgogICogQHJldHVybiAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGFrZW4gYnkgdGhlIFNQQ29kIGVsZW1lbnQuCiAgKi8KLXN0YXRpYyBPUEpfVUlOVDMyIG9wal9qMmtfZ2V0X1NRY2RfU1FjY19zaXplICggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vICk7CitzdGF0aWMgT1BKX1VJTlQzMiBvcGpfajJrX2dldF9TUWNkX1NRY2Nfc2l6ZShvcGpfajJrX3QgKnBfajJrLAorICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9ubywKKyAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8pOworCisvKioKKyAqIENvbXBhcmVzIDIgU1FjZCBvciBTUWNjIGVsZW1lbnQsIGkuZS4gdGhlIHF1YW50aXphdGlvbiB2YWx1ZXMgb2YgYSBiYW5kIGluIHRoZSBRQ0Qgb3IgUUNDLgorICoKKyAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF90aWxlX25vICAgICAgICAgICAgICAgdGhlIHRpbGUgdG8gb3V0cHV0LgorICogQHBhcmFtICAgICAgIHBfZmlyc3RfY29tcF9ubyAgICAgICAgIHRoZSBmaXJzdCBjb21wb25lbnQgbnVtYmVyIHRvIGNvbXBhcmUuCisgKiBAcGFyYW0gICAgICAgcF9zZWNvbmRfY29tcF9ubyAgICAgICAgdGhlIHNlY29uZCBjb21wb25lbnQgbnVtYmVyIHRvIGNvbXBhcmUuCisgKgorICogQHJldHVybiBPUEpfVFJVRSBpZiBlcXVhbHMuCisgKi8KK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2NvbXBhcmVfU1FjZF9TUWNjKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLCBPUEpfVUlOVDMyIHBfZmlyc3RfY29tcF9ubywgT1BKX1VJTlQzMiBwX3NlY29uZF9jb21wX25vKTsKKwogCiAvKioKICAqIFdyaXRlcyBhIFNRY2Qgb3IgU1FjYyBlbGVtZW50LCBpLmUuIHRoZSBxdWFudGl6YXRpb24gdmFsdWVzIG9mIGEgYmFuZCBpbiB0aGUgUUNEIG9yIFFDQy4KQEAgLTI4MywxNiArMzE2LDE2IEBACiAgKgogKi8KIHN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX1NRY2RfU1FjYyhvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBVcGRhdGVzIHRoZSBUaWxlIExlbmd0aCBNYXJrZXIuCiAgKi8KLXN0YXRpYyB2b2lkIG9wal9qMmtfdXBkYXRlX3RsbSAoIG9wal9qMmtfdCAqIHBfajJrLCBPUEpfVUlOVDMyIHBfdGlsZV9wYXJ0X3NpemUpOworc3RhdGljIHZvaWQgb3BqX2oya191cGRhdGVfdGxtKG9wal9qMmtfdCAqIHBfajJrLCBPUEpfVUlOVDMyIHBfdGlsZV9wYXJ0X3NpemUpOwogCiAvKioKICAqIFJlYWRzIGEgU1FjZCBvciBTUWNjIGVsZW1lbnQsIGkuZS4gdGhlIHF1YW50aXphdGlvbiB2YWx1ZXMgb2YgYSBiYW5kIGluIHRoZSBRQ0Qgb3IgUUNDLgpAQCAtMzA0LDc3ICszMzcsNzkgQEAKICAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICAqCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9TUWNkX1NRY2MoIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjb21wbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9TUWNkX1NRY2Mob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY29tcG5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIENvcGllcyB0aGUgdGlsZSBjb21wb25lbnQgcGFyYW1ldGVycyBvZiBhbGwgdGhlIGNvbXBvbmVudCBmcm9tIHRoZSBmaXJzdCB0aWxlIGNvbXBvbmVudC4KICAqCiAgKiBAcGFyYW0gICAgICAgICAgICAgICBwX2oyayAgICAgICAgICAgdGhlIEoyayBjb2RlYy4KICAqLwotc3RhdGljIHZvaWQgb3BqX2oya19jb3B5X3RpbGVfY29tcG9uZW50X3BhcmFtZXRlcnMoIG9wal9qMmtfdCAqcF9qMmsgKTsKK3N0YXRpYyB2b2lkIG9wal9qMmtfY29weV90aWxlX2NvbXBvbmVudF9wYXJhbWV0ZXJzKG9wal9qMmtfdCAqcF9qMmspOwogCiAvKioKICAqIENvcGllcyB0aGUgdGlsZSBxdWFudGl6YXRpb24gcGFyYW1ldGVycyBvZiBhbGwgdGhlIGNvbXBvbmVudCBmcm9tIHRoZSBmaXJzdCB0aWxlIGNvbXBvbmVudC4KICAqCiAgKiBAcGFyYW0gICAgICAgICAgICAgICBwX2oyayAgICAgICAgICAgdGhlIEoyayBjb2RlYy4KICAqLwotc3RhdGljIHZvaWQgb3BqX2oya19jb3B5X3RpbGVfcXVhbnRpemF0aW9uX3BhcmFtZXRlcnMoIG9wal9qMmtfdCAqcF9qMmsgKTsKK3N0YXRpYyB2b2lkIG9wal9qMmtfY29weV90aWxlX3F1YW50aXphdGlvbl9wYXJhbWV0ZXJzKG9wal9qMmtfdCAqcF9qMmspOwogCiAvKioKICAqIFJlYWRzIHRoZSB0aWxlcy4KICAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZGVjb2RlX3RpbGVzICggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19kZWNvZGVfdGlsZXMob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcHJlX3dyaXRlX3RpbGUgKCBvcGpfajJrX3QgKiBwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19wcmVfd3JpdGVfdGlsZShvcGpfajJrX3QgKiBwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfdXBkYXRlX2ltYWdlX2RhdGEgKG9wal90Y2RfdCAqIHBfdGNkLCBPUEpfQllURSAqIHBfZGF0YSwgb3BqX2ltYWdlX3QqIHBfb3V0cHV0X2ltYWdlKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3VwZGF0ZV9pbWFnZV9kYXRhKG9wal90Y2RfdCAqIHBfdGNkLAorICAgICAgICBvcGpfaW1hZ2VfdCogcF9vdXRwdXRfaW1hZ2UpOwogCiBzdGF0aWMgdm9pZCBvcGpfZ2V0X3RpbGVfZGltZW5zaW9ucyhvcGpfaW1hZ2VfdCAqIGxfaW1hZ2UsCi0JCQkJCQkJCQkJCQkJCQkJCQlvcGpfdGNkX3RpbGVjb21wX3QgKiBsX3RpbGVjLAotCQkJCQkJCQkJCQkJCQkJCQkJb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1nX2NvbXAsCi0JCQkJCQkJCQkJCQkJCQkJCQlPUEpfVUlOVDMyKiBsX3NpemVfY29tcCwKLQkJCQkJCQkJCQkJCQkJCQkJCU9QSl9VSU5UMzIqIGxfd2lkdGgsCi0JCQkJCQkJCQkJCQkJCQkJCQlPUEpfVUlOVDMyKiBsX2hlaWdodCwKLQkJCQkJCQkJCQkJCQkJCQkJCU9QSl9VSU5UMzIqIGxfb2Zmc2V0X3gsCi0JCQkJCQkJCQkJCQkJCQkJCQlPUEpfVUlOVDMyKiBsX29mZnNldF95LAotCQkJCQkJCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiogbF9pbWFnZV93aWR0aCwKLQkJCQkJCQkJCQkJCQkJCQkJCU9QSl9VSU5UMzIqIGxfc3RyaWRlLAotCQkJCQkJCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiogbF90aWxlX29mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKiBsX3RpbGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1nX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiBsX3NpemVfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqIGxfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiBsX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqIGxfb2Zmc2V0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiBsX29mZnNldF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiogbF9pbWFnZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqIGxfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiogbF90aWxlX29mZnNldCk7CiAKLXN0YXRpYyB2b2lkIG9wal9qMmtfZ2V0X3RpbGVfZGF0YSAob3BqX3RjZF90ICogcF90Y2QsIE9QSl9CWVRFICogcF9kYXRhKTsKK3N0YXRpYyB2b2lkIG9wal9qMmtfZ2V0X3RpbGVfZGF0YShvcGpfdGNkX3QgKiBwX3RjZCwgT1BKX0JZVEUgKiBwX2RhdGEpOwogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19wb3N0X3dyaXRlX3RpbGUgKG9wal9qMmtfdCAqIHBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcG9zdF93cml0ZV90aWxlKG9wal9qMmtfdCAqIHBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIFNldHMgdXAgdGhlIHByb2NlZHVyZXMgdG8gZG8gb24gd3JpdGluZyBoZWFkZXIuCiAgKiBEZXZlbG9wZXJzIHdhbnRpbmcgdG8gZXh0ZW5kIHRoZSBsaWJyYXJ5IGNhbiBhZGQgdGhlaXIgb3duIHdyaXRpbmcgcHJvY2VkdXJlcy4KICAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfc2V0dXBfaGVhZGVyX3dyaXRpbmcgKG9wal9qMmtfdCAqcF9qMmssIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19zZXR1cF9oZWFkZXJfd3JpdGluZyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9maXJzdF90aWxlX3BhcnQoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdG90YWxfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9maXJzdF90aWxlX3BhcnQob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKKyAgICAgICAgT1BKX1VJTlQzMiBwX3RvdGFsX2RhdGFfc2l6ZSwKKyAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlcik7CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2FsbF90aWxlX3BhcnRzKCAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90b3RhbF9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIgKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2FsbF90aWxlX3BhcnRzKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAorICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCisgICAgICAgIE9QSl9VSU5UMzIgcF90b3RhbF9kYXRhX3NpemUsCisgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIEdldHMgdGhlIG9mZnNldCBvZiB0aGUgaGVhZGVyLgpAQCAtMzgzLDkgKzQxOCw5IEBACiAgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZ2V0X2VuZF9oZWFkZXIoIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZ2V0X2VuZF9oZWFkZXIob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIHN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2FsbG9jYXRlX3RpbGVfZWxlbWVudF9jc3RyX2luZGV4KG9wal9qMmtfdCAqcF9qMmspOwogCkBAIC00MDIsOSArNDM3LDkgQEAKICAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfc29jKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfc29jKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogUmVhZHMgYSBTT0MgbWFya2VyIChTdGFydCBvZiBDb2Rlc3RyZWFtKQpAQCAtNDEyLDkgKzQ0Nyw5IEBACiAgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgIFhYWCBuZWVkcyBkYXRhCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9zb2MoICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9zb2Mob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogV3JpdGVzIHRoZSBTSVogbWFya2VyIChpbWFnZSBhbmQgdGlsZSBzaXplKQpAQCAtNDIzLDkgKzQ1OCw5IEBACiAgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KICAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9zaXooICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9zaXoob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBSZWFkcyBhIFNJWiBtYXJrZXIgKGltYWdlIGFuZCB0aWxlIHNpemUpCkBAIC00NDYsOSArNDgxLDkgQEAKICAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfY29tKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2NvbShvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIFJlYWRzIGEgQ09NIG1hcmtlciAoY29tbWVudHMpCkBAIC00NTcsMTAgKzQ5MiwxMCBAQAogICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPTSBtYXJrZXIuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9jb20gKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9jb20ob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAvKioKICAqIFdyaXRlcyB0aGUgQ09EIG1hcmtlciAoQ29kaW5nIHN0eWxlIGRlZmF1bHQpCiAgKgpAQCAtNDY4LDkgKzUwMyw5IEBACiAgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2NvZCggICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9jb2Qob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBSZWFkcyBhIENPRCBtYXJrZXIgKENvZGluZyBTdHlrZSBkZWZhdWx0cykKQEAgLTQ3OSwxMiArNTE0LDIzIEBACiAgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgQ09EIG1hcmtlci4KICAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfY29kICggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9jb2Qob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKLSNpZiAwCisvKioKKyAqIENvbXBhcmVzIDIgQ09DIG1hcmtlcnMgKENvZGluZyBzdHlsZSBjb21wb25lbnQpCisgKgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgSjJLIGNvZGVjLgorICogQHBhcmFtICAgICAgIHBfZmlyc3RfY29tcF9ubyAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBjb21wb25lbnQgdG8gY29tcGFyZS4KKyAqIEBwYXJhbSAgICAgICBwX3NlY29uZF9jb21wX25vIHRoZSBpbmRleCBvZiB0aGUgc2Vjb25kIGNvbXBvbmVudCB0byBjb21wYXJlLgorICoKKyAqIEByZXR1cm4gICAgICBPUEpfVFJVRSBpZiBlcXVhbHMKKyAqLworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfY29tcGFyZV9jb2Mob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9maXJzdF9jb21wX25vLCBPUEpfVUlOVDMyIHBfc2Vjb25kX2NvbXBfbm8pOworCiAvKioKICAqIFdyaXRlcyB0aGUgQ09DIG1hcmtlciAoQ29kaW5nIHN0eWxlIGNvbXBvbmVudCkKICAqCkBAIC00OTMsMTMgKzUzOSwxMSBAQAogICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KICAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2NvYyggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotI2VuZGlmCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9jb2Mob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAotI2lmIDAKIC8qKgogICogV3JpdGVzIHRoZSBDT0MgbWFya2VyIChDb2Rpbmcgc3R5bGUgY29tcG9uZW50KQogICoKQEAgLTUxMCwxMSArNTU0LDEwIEBACiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICovCiBzdGF0aWMgdm9pZCBvcGpfajJrX3dyaXRlX2NvY19pbl9tZW1vcnkob3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0jZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBHZXRzIHRoZSBtYXhpbXVtIHNpemUgdGFrZW4gYnkgYSBjb2MuCkBAIC01MzAsMTAgKzU3MywxMCBAQAogICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPQyBtYXJrZXIuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2NvYyAoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2NvYyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBXcml0ZXMgdGhlIFFDRCBtYXJrZXIgKHF1YW50aXphdGlvbiBkZWZhdWx0KQpAQCAtNTQyLDkgKzU4NSw5IEBACiAgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfcWNkKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3FjZChvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIFJlYWRzIGEgUUNEIG1hcmtlciAoUXVhbnRpemF0aW9uIGRlZmF1bHRzKQpAQCAtNTUzLDExICs1OTYsMjMgQEAKICAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBRQ0QgbWFya2VyLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9xY2QgKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotI2lmIDAKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcWNkKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworCisvKioKKyAqIENvbXBhcmUgUUNDIG1hcmtlcnMgKHF1YW50aXphdGlvbiBjb21wb25lbnQpCisgKgorICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICBKMksgY29kZWMuCisgKiBAcGFyYW0gICAgICAgcF9maXJzdF9jb21wX25vICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY29tcG9uZW50IHRvIGNvbXBhcmUuCisgKiBAcGFyYW0gICAgICAgcF9zZWNvbmRfY29tcF9ubyAgICAgIHRoZSBpbmRleCBvZiB0aGUgc2Vjb25kIGNvbXBvbmVudCB0byBjb21wYXJlLgorICoKKyAqIEByZXR1cm4gT1BKX1RSVUUgaWYgZXF1YWxzLgorICovCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19jb21wYXJlX3FjYyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2ZpcnN0X2NvbXBfbm8sIE9QSl9VSU5UMzIgcF9zZWNvbmRfY29tcF9ubyk7CisKIC8qKgogICogV3JpdGVzIHRoZSBRQ0MgbWFya2VyIChxdWFudGl6YXRpb24gY29tcG9uZW50KQogICoKQEAgLTU2NiwxMyArNjIxLDExIEBACiAgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfcWNjKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotI2VuZGlmCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9xY2Mob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAotI2lmIDAKIC8qKgogICogV3JpdGVzIHRoZSBRQ0MgbWFya2VyIChxdWFudGl6YXRpb24gY29tcG9uZW50KQogICoKQEAgLTU4MywxNiArNjM2LDE1IEBACiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwogc3RhdGljIHZvaWQgb3BqX2oya193cml0ZV9xY2NfaW5fbWVtb3J5KG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogR2V0cyB0aGUgbWF4aW11bSBzaXplIHRha2VuIGJ5IGEgcWNjLgogICovCi1zdGF0aWMgT1BKX1VJTlQzMiBvcGpfajJrX2dldF9tYXhfcWNjX3NpemUgKG9wal9qMmtfdCAqcF9qMmspOworc3RhdGljIE9QSl9VSU5UMzIgb3BqX2oya19nZXRfbWF4X3FjY19zaXplKG9wal9qMmtfdCAqcF9qMmspOwogCiAvKioKICAqIFJlYWRzIGEgUUNDIG1hcmtlciAoUXVhbnRpemF0aW9uIGNvbXBvbmVudCkKQEAgLTYwMSwxMCArNjUzLDEwIEBACiAgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUUNDIG1hcmtlci4KICAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcWNjKCAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9xY2Mob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAvKioKICAqIFdyaXRlcyB0aGUgUE9DIG1hcmtlciAoUHJvZ3Jlc3Npb24gT3JkZXIgQ2hhbmdlKQogICoKQEAgLTYxMiw5ICs2NjQsOSBAQAogICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfcG9jKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3BvYyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogLyoqCiAgKiBXcml0ZXMgdGhlIFBPQyBtYXJrZXIgKFByb2dyZXNzaW9uIE9yZGVyIENoYW5nZSkKICAqCkBAIC02MjQsOSArNjc2LDkgQEAKICAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogICovCiBzdGF0aWMgdm9pZCBvcGpfajJrX3dyaXRlX3BvY19pbl9tZW1vcnkob3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAvKioKICAqIEdldHMgdGhlIG1heGltdW0gc2l6ZSB0YWtlbiBieSB0aGUgd3JpdGluZyBvZiBhIFBPQy4KICAqLwpAQCAtNjQwLDE1ICs2OTIsMTUgQEAKICAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBQT0MgbWFya2VyLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9wb2MgKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9wb2Mob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogR2V0cyB0aGUgbWF4aW11bSBzaXplIHRha2VuIGJ5IHRoZSB0b2MgaGVhZGVycyBvZiBhbGwgdGhlIHRpbGUgcGFydHMgb2YgYW55IGdpdmVuIHRpbGUuCiAgKi8KLXN0YXRpYyBPUEpfVUlOVDMyIG9wal9qMmtfZ2V0X21heF90b2Nfc2l6ZSAob3BqX2oya190ICpwX2oyayk7CitzdGF0aWMgT1BKX1VJTlQzMiBvcGpfajJrX2dldF9tYXhfdG9jX3NpemUob3BqX2oya190ICpwX2oyayk7CiAKIC8qKgogICogR2V0cyB0aGUgbWF4aW11bSBzaXplIHRha2VuIGJ5IHRoZSBoZWFkZXJzIG9mIHRoZSBTT1QuCkBAIC02NjUsMTAgKzcxNywxMCBAQAogICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFRMTSBtYXJrZXIuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2NyZyAoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2NyZyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIC8qKgogICogUmVhZHMgYSBUTE0gbWFya2VyIChUaWxlIExlbmd0aCBNYXJrZXIpCiAgKgpAQCAtNjc3LDEwICs3MjksMTAgQEAKICAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBUTE0gbWFya2VyLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF90bG0gKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3RsbShvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBXcml0ZXMgdGhlIHVwZGF0ZWQgdGxtLgpAQCAtNjg5LDkgKzc0MSw5IEBACiAgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfdXBkYXRlZF90bG0oICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3VwZGF0ZWRfdGxtKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBSZWFkcyBhIFBMTSBtYXJrZXIgKFBhY2tldCBsZW5ndGgsIG1haW4gaGVhZGVyIG1hcmtlcikKQEAgLTcwMSwxMCArNzUzLDEwIEBACiAgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgVExNIG1hcmtlci4KICAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcGxtICggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9wbG0ob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAvKioKICAqIFJlYWRzIGEgUExUIG1hcmtlciAoUGFja2V0IGxlbmd0aCwgdGlsZS1wYXJ0IGhlYWRlcikKICAqCkBAIC03MTMsMTAgKzc2NSwxMCBAQAogICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFBMVCBtYXJrZXIuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3BsdCAoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3BsdChvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBSZWFkcyBhIFBQTSBtYXJrZXIgKFBhY2tlZCBoZWFkZXJzLCBtYWluIGhlYWRlcikKQEAgLTcyNywxMSArNzc5LDExIEBACiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICAqLwogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3BwbSAoCi0JCQkJCQkJCQkJCQkJCQkJCQkgb3BqX2oya190ICpwX2oyaywKLQkJCQkJCQkJCQkJCQkJCQkJCSBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0JCQkJCQkJCQkJCQkJCQkJCQkgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotCQkJCQkJCQkJCQkJCQkJCQkJIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9wcG0oCisgICAgb3BqX2oya190ICpwX2oyaywKKyAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogTWVyZ2VzIGFsbCBQUE0gbWFya2VycyByZWFkIChQYWNrZWQgaGVhZGVycywgbWFpbiBoZWFkZXIpCkBAIC03MzksNyArNzkxLDcgQEAKICAqIEBwYXJhbSAgICAgICBwX2NwICAgICAgbWFpbiBjb2RpbmcgcGFyYW1ldGVycy4KICAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfbWVyZ2VfcHBtICggb3BqX2NwX3QgKnBfY3AsIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfbWVyZ2VfcHBtKG9wal9jcF90ICpwX2NwLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIFJlYWRzIGEgUFBUIG1hcmtlciAoUGFja2VkIHBhY2tldCBoZWFkZXJzLCB0aWxlLXBhcnQgaGVhZGVyKQpAQCAtNzQ5LDEwICs4MDEsMTAgQEAKICAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBQUFQgbWFya2VyLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9wcHQgKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9wcHQob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogTWVyZ2VzIGFsbCBQUFQgbWFya2VycyByZWFkIChQYWNrZWQgaGVhZGVycywgdGlsZS1wYXJ0IGhlYWRlcikKQEAgLTc2MCw4ICs4MTIsOCBAQAogICogQHBhcmFtICAgICAgIHBfdGNwICAgdGhlIHRpbGUuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfbWVyZ2VfcHB0ICggIG9wal90Y3BfdCAqcF90Y3AsCi0JCQkJCQkJCQkJCQkJCQkJCSAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfbWVyZ2VfcHB0KG9wal90Y3BfdCAqcF90Y3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogCiAvKioKQEAgLTc3MSwyNCArODIzLDI2IEBACiAgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV90bG0oICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfdGxtKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogV3JpdGVzIHRoZSBTT1QgbWFya2VyIChTdGFydCBvZiB0aWxlLXBhcnQpCiAgKgogICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgSjJLIGNvZGVjLgotICogQHBhcmFtICAgICAgIHBfZGF0YSAgICAgICAgICAgRklYTUUgRE9DCi0gKiBAcGFyYW0gICAgICAgcF9kYXRhX3dyaXR0ZW4gICBGSVhNRSBET0MKKyAqIEBwYXJhbSAgICAgICBwX2RhdGEgICAgICAgICAgIE91dHB1dCBidWZmZXIKKyAqIEBwYXJhbSAgICAgICBwX3RvdGFsX2RhdGFfc2l6ZSBPdXRwdXQgYnVmZmVyIHNpemUKKyAqIEBwYXJhbSAgICAgICBwX2RhdGFfd3JpdHRlbiAgIE51bWJlciBvZiBieXRlcyB3cml0dGVuIGludG8gc3RyZWFtCiAgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3NvdCggICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3NvdChvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90b3RhbF9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIFJlYWRzIHZhbHVlcyBmcm9tIGEgU09UIG1hcmtlciAoU3RhcnQgb2YgdGlsZS1wYXJ0KQpAQCAtODA0LDEyICs4NTgsMTIgQEAKICAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICAqLwogc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZ2V0X3NvdF92YWx1ZXMoT1BKX0JZVEUgKiAgcF9oZWFkZXJfZGF0YSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkgT1BKX1VJTlQzMiAgcF9oZWFkZXJfc2l6ZSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkgT1BKX1VJTlQzMiogcF90aWxlX25vLAotCQkJCQkJCQkJCQkJCQkJCQkJCSBPUEpfVUlOVDMyKiBwX3RvdF9sZW4sCi0JCQkJCQkJCQkJCQkJCQkJCQkJIE9QSl9VSU5UMzIqIHBfY3VycmVudF9wYXJ0LAotCQkJCQkJCQkJCQkJCQkJCQkJCSBPUEpfVUlOVDMyKiBwX251bV9wYXJ0cywKLQkJCQkJCQkJCQkJCQkJCQkJCQkgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiogcF90aWxlX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiogcF90b3RfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiogcF9jdXJyZW50X3BhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiBwX251bV9wYXJ0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAvKioKICAqIFJlYWRzIGEgU09UIG1hcmtlciAoU3RhcnQgb2YgdGlsZS1wYXJ0KQogICoKQEAgLTgxOCwxMCArODcyLDEwIEBACiAgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUFBUIG1hcmtlci4KICAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3NvdCAoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3NvdChvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIC8qKgogICogV3JpdGVzIHRoZSBTT0QgbWFya2VyIChTdGFydCBvZiBkYXRhKQogICoKQEAgLTgzMywxMyArODg3LDEzIEBACiAgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3NvZCggICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90ICogcF90aWxlX2NvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdG90YWxfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9zb2Qob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3QgKiBwX3RpbGVfY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90b3RhbF9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogUmVhZHMgYSBTT0QgbWFya2VyIChTdGFydCBPZiBEYXRhKQpAQCAtODQ4LDE3ICs5MDIsMTkgQEAKICAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICBGSVhNRSBET0MKICAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfc29kKCAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfc29kKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCi1zdGF0aWMgdm9pZCBvcGpfajJrX3VwZGF0ZV90bG0gKG9wal9qMmtfdCAqIHBfajJrLCBPUEpfVUlOVDMyIHBfdGlsZV9wYXJ0X3NpemUgKQorc3RhdGljIHZvaWQgb3BqX2oya191cGRhdGVfdGxtKG9wal9qMmtfdCAqIHBfajJrLCBPUEpfVUlOVDMyIHBfdGlsZV9wYXJ0X3NpemUpCiB7Ci0gICAgICAgIG9wal93cml0ZV9ieXRlcyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfY3VycmVudCxwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLDEpOyAgICAgICAgICAgIC8qIFBTT1QgKi8KLSAgICAgICAgKytwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfY3VycmVudDsKKyAgICBvcGpfd3JpdGVfYnl0ZXMocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2N1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIsIDEpOyAgICAgICAgICAgLyogUFNPVCAqLworICAgICsrcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2N1cnJlbnQ7CiAKLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19jdXJyZW50LHBfdGlsZV9wYXJ0X3NpemUsNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBTT1QgKi8KLSAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2N1cnJlbnQgKz0gNDsKKyAgICBvcGpfd3JpdGVfYnl0ZXMocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2N1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgIHBfdGlsZV9wYXJ0X3NpemUsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBTT1QgKi8KKyAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfY3VycmVudCArPSA0OwogfQogCiAvKioKQEAgLTg3MSwxMiArOTI3LDEyIEBACiAgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfcmduKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG5iX2NvbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9yZ24ob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9ubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG5iX2NvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIFJlYWRzIGEgUkdOIG1hcmtlciAoUmVnaW9uIE9mIEludGVyZXN0KQpAQCAtODg2LDEwICs5NDIsMTAgQEAKICAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBQT0MgbWFya2VyLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9yZ24gKG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcmduKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIFdyaXRlcyB0aGUgRU9DIG1hcmtlciAoRW5kIG9mIENvZGVzdHJlYW0pCkBAIC04OTgsOSArOTU0LDkgQEAKICAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9lb2MoICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfZW9jKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKICNpZiAwCiAvKioKQEAgLTkxMCw5ICs5NjYsOSBAQAogICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgIEZJWE1FIERPQwogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9lb2MgKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9lb2Mob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAjZW5kaWYKIAogLyoqCkBAIC05MjIsOSArOTc4LDkgQEAKICAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfbWN0X2RhdGFfZ3JvdXAoICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfbWN0X2RhdGFfZ3JvdXAob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIEluaXRzIHRoZSBJbmZvCkBAIC05MzMsOSArOTg5LDkgQEAKICAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19pbml0X2luZm8oICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfaW5pdF9pbmZvKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogQWRkIG1haW4gaGVhZGVyIG1hcmtlciBpbmZvcm1hdGlvbgpAQCAtOTQ0LDcgKzEwMDAsOCBAQAogQHBhcmFtIHBvcyAgICAgICAgICBieXRlIG9mZnNldCBvZiBtYXJrZXIgc2VnbWVudAogQHBhcmFtIGxlbiAgICAgICAgICBsZW5ndGggb2YgbWFya2VyIHNlZ21lbnQKICAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfYWRkX21obWFya2VyKG9wal9jb2Rlc3RyZWFtX2luZGV4X3QgKmNzdHJfaW5kZXgsIE9QSl9VSU5UMzIgdHlwZSwgT1BKX09GRl9UIHBvcywgT1BKX1VJTlQzMiBsZW4pIDsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2FkZF9taG1hcmtlcihvcGpfY29kZXN0cmVhbV9pbmRleF90ICpjc3RyX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdHlwZSwgT1BKX09GRl9UIHBvcywgT1BKX1VJTlQzMiBsZW4pIDsKIC8qKgogQWRkIHRpbGUgaGVhZGVyIG1hcmtlciBpbmZvcm1hdGlvbgogQHBhcmFtIHRpbGVubyAgICAgICB0aWxlIGluZGV4IG51bWJlcgpAQCAtOTUzLDcgKzEwMTAsOSBAQAogQHBhcmFtIHBvcyAgICAgICAgICBieXRlIG9mZnNldCBvZiBtYXJrZXIgc2VnbWVudAogQHBhcmFtIGxlbiAgICAgICAgICBsZW5ndGggb2YgbWFya2VyIHNlZ21lbnQKICAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfYWRkX3RsbWFya2VyKE9QSl9VSU5UMzIgdGlsZW5vLCBvcGpfY29kZXN0cmVhbV9pbmRleF90ICpjc3RyX2luZGV4LCBPUEpfVUlOVDMyIHR5cGUsIE9QSl9PRkZfVCBwb3MsIE9QSl9VSU5UMzIgbGVuKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2FkZF90bG1hcmtlcihPUEpfVUlOVDMyIHRpbGVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmRleF90ICpjc3RyX2luZGV4LCBPUEpfVUlOVDMyIHR5cGUsIE9QSl9PRkZfVCBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsZW4pOwogCiAvKioKICAqIFJlYWRzIGFuIHVua25vd24gbWFya2VyCkBAIC05NjUsMTAgKzEwMjQsMTAgQEAKICAqCiAgKiBAcmV0dXJuICAgICAgdHJ1ZSAgICAgICAgICAgICAgICAgICAgaWYgdGhlIG1hcmtlciBjb3VsZCBiZSBkZWR1Y2VkLgogKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfdW5rKCBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICpvdXRwdXRfbWFya2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF91bmsob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKm91dHB1dF9tYXJrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIFdyaXRlcyB0aGUgTUNUIG1hcmtlciAoTXVsdGlwbGUgQ29tcG9uZW50IFRyYW5zZm9ybSkKQEAgLTk3OCwxMCArMTAzNywxMCBAQAogICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfbWN0X3JlY29yZCggICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9tY3RfZGF0YV90ICogcF9tY3RfcmVjb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfbWN0X3JlY29yZChvcGpfajJrX3QgKnBfajJrLAorICAgICAgICBvcGpfbWN0X2RhdGFfdCAqIHBfbWN0X3JlY29yZCwKKyAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIFJlYWRzIGEgTUNUIG1hcmtlciAoTXVsdGlwbGUgQ29tcG9uZW50IFRyYW5zZm9ybSkKQEAgLTk5MSwxMCArMTA1MCwxMCBAQAogICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIE1DVCBtYXJrZXIuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX21jdCAoICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9tY3Qob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogV3JpdGVzIHRoZSBNQ0MgbWFya2VyIChNdWx0aXBsZSBDb21wb25lbnQgQ29sbGVjdGlvbikKQEAgLTEwMDQsMTAgKzEwNjMsMTAgQEAKICAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICAgICAgICAgICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9tY2NfcmVjb3JkKCAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90ICogcF9tY2NfcmVjb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfbWNjX3JlY29yZChvcGpfajJrX3QgKnBfajJrLAorICAgICAgICBvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCAqIHBfbWNjX3JlY29yZCwKKyAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIFJlYWRzIGEgTUNDIG1hcmtlciAoTXVsdGlwbGUgQ29tcG9uZW50IENvbGxlY3Rpb24pCkBAIC0xMDE3LDEwICsxMDc2LDEwIEBACiAgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgTUNDIG1hcmtlci4KICAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfbWNjICggICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX21jYyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBXcml0ZXMgdGhlIE1DTyBtYXJrZXIgKE11bHRpcGxlIGNvbXBvbmVudCB0cmFuc2Zvcm1hdGlvbiBvcmRlcmluZykKQEAgLTEwMjksOSArMTA4OCw5IEBACiAgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9tY28oICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfbWNvKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogUmVhZHMgYSBNQ08gbWFya2VyIChNdWx0aXBsZSBDb21wb25lbnQgVHJhbnNmb3JtIE9yZGVyaW5nKQpAQCAtMTA0MSwyNyArMTEwMCw0MCBAQAogICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIE1DTyBtYXJrZXIuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX21jbyAoICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9tY28ob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2FkZF9tY3Qob3BqX3RjcF90ICogcF90Y3AsIG9wal9pbWFnZV90ICogcF9pbWFnZSwgT1BKX1VJTlQzMiBwX2luZGV4KTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2FkZF9tY3Qob3BqX3RjcF90ICogcF90Y3AsIG9wal9pbWFnZV90ICogcF9pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2luZGV4KTsKIAotc3RhdGljIHZvaWQgIG9wal9qMmtfcmVhZF9pbnQxNl90b19mbG9hdCAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pOwotc3RhdGljIHZvaWQgIG9wal9qMmtfcmVhZF9pbnQzMl90b19mbG9hdCAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pOwotc3RhdGljIHZvaWQgIG9wal9qMmtfcmVhZF9mbG9hdDMyX3RvX2Zsb2F0IChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSk7Ci1zdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2Zsb2F0NjRfdG9fZmxvYXQgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKTsKK3N0YXRpYyB2b2lkICBvcGpfajJrX3JlYWRfaW50MTZfdG9fZmxvYXQoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsCisgICAgICAgIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pOworc3RhdGljIHZvaWQgIG9wal9qMmtfcmVhZF9pbnQzMl90b19mbG9hdChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwKKyAgICAgICAgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSk7CitzdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2Zsb2F0MzJfdG9fZmxvYXQoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsCisgICAgICAgIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pOworc3RhdGljIHZvaWQgIG9wal9qMmtfcmVhZF9mbG9hdDY0X3RvX2Zsb2F0KGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLAorICAgICAgICB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKTsKIAotc3RhdGljIHZvaWQgIG9wal9qMmtfcmVhZF9pbnQxNl90b19pbnQzMiAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pOwotc3RhdGljIHZvaWQgIG9wal9qMmtfcmVhZF9pbnQzMl90b19pbnQzMiAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pOwotc3RhdGljIHZvaWQgIG9wal9qMmtfcmVhZF9mbG9hdDMyX3RvX2ludDMyIChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSk7Ci1zdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2Zsb2F0NjRfdG9faW50MzIgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKTsKK3N0YXRpYyB2b2lkICBvcGpfajJrX3JlYWRfaW50MTZfdG9faW50MzIoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsCisgICAgICAgIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pOworc3RhdGljIHZvaWQgIG9wal9qMmtfcmVhZF9pbnQzMl90b19pbnQzMihjb25zdCB2b2lkICogcF9zcmNfZGF0YSwKKyAgICAgICAgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSk7CitzdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2Zsb2F0MzJfdG9faW50MzIoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsCisgICAgICAgIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pOworc3RhdGljIHZvaWQgIG9wal9qMmtfcmVhZF9mbG9hdDY0X3RvX2ludDMyKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLAorICAgICAgICB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKTsKIAotc3RhdGljIHZvaWQgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9faW50MTYgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKTsKLXN0YXRpYyB2b2lkICBvcGpfajJrX3dyaXRlX2Zsb2F0X3RvX2ludDMyIChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSk7Ci1zdGF0aWMgdm9pZCAgb3BqX2oya193cml0ZV9mbG9hdF90b19mbG9hdCAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pOwotc3RhdGljIHZvaWQgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9fZmxvYXQ2NCAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pOworc3RhdGljIHZvaWQgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9faW50MTYoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsCisgICAgICAgIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pOworc3RhdGljIHZvaWQgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9faW50MzIoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsCisgICAgICAgIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pOworc3RhdGljIHZvaWQgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9fZmxvYXQoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsCisgICAgICAgIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pOworc3RhdGljIHZvaWQgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9fZmxvYXQ2NChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwKKyAgICAgICAgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSk7CiAKIC8qKgogICogRW5kcyB0aGUgZW5jb2RpbmcsIGkuZS4gZnJlZXMgbWVtb3J5LgpAQCAtMTA3MCw5ICsxMTQyLDkgQEAKICAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19lbmRfZW5jb2RpbmcoICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19lbmRfZW5jb2Rpbmcob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBXcml0ZXMgdGhlIENCRCBtYXJrZXIgKENvbXBvbmVudCBiaXQgZGVwdGggZGVmaW5pdGlvbikKQEAgLTEwODEsOSArMTE1Myw5IEBACiAgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9jYmQoICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9jYmQob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBSZWFkcyBhIENCRCBtYXJrZXIgKENvbXBvbmVudCBiaXQgZGVwdGggZGVmaW5pdGlvbikKQEAgLTEwOTIsMTIgKzExNjQsMTIgQEAKICAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBDQkQgbWFya2VyLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9jYmQgKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9jYmQob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKLSNpZiAwCisKIC8qKgogICogV3JpdGVzIENPQyBtYXJrZXIgZm9yIGVhY2ggY29tcG9uZW50LgogICoKQEAgLTExMDUsMTIgKzExNzcsMTAgQEAKICAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9hbGxfY29jKCBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7Ci0jZW5kaWYKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2FsbF9jb2Mob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCi0jaWYgMAogLyoqCiAgKiBXcml0ZXMgUUNDIG1hcmtlciBmb3IgZWFjaCBjb21wb25lbnQuCiAgKgpAQCAtMTExOCwxMCArMTE4OCw5IEBACiAgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfYWxsX3FjYyggb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwotI2VuZGlmCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9hbGxfcWNjKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBXcml0ZXMgcmVnaW9ucyBvZiBpbnRlcmVzdHMuCkBAIC0xMTMwLDkgKzExOTksOSBAQAogICogQHBhcmFtICAgICAgIHBfajJrICAgICAgICAgICAgICAgICAgIEoySyBjb2RlYy4KICAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3JlZ2lvbnMoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9yZWdpb25zKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBXcml0ZXMgRVBDID8/Pz8KQEAgLTExNDEsOSArMTIxMCw5IEBACiAgKiBAcGFyYW0gICAgICAgcF9qMmsgICAgICAgICAgICAgICAgICAgSjJLIGNvZGVjLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfZXBjKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9lcGMob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBDaGVja3MgdGhlIHByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZXMgdmFsdWVzLiBUZWxscyBvZiB0aGUgcG9jIGdpdmVuIGFzIGlucHV0IGFyZSB2YWxpZC4KQEAgLTExNTgsMTIgKzEyMjcsMTIgQEAKICAqCiAgKiBAcmV0dXJuICAgICAgdHJ1ZSBpZiB0aGUgcG9jcyBhcmUgdmFsaWQuCiAgKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2NoZWNrX3BvY192YWwoICBjb25zdCBvcGpfcG9jX3QgKnBfcG9jcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbmJfcG9jcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbmJfcmVzb2x1dGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBudW1jb21wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG51bWxheWVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfY2hlY2tfcG9jX3ZhbChjb25zdCBvcGpfcG9jX3QgKnBfcG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX25iX3BvY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9uYl9yZXNvbHV0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBudW1jb21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBudW1sYXllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogR2V0cyB0aGUgbnVtYmVyIG9mIHRpbGUgcGFydHMgdXNlZCBmb3IgdGhlIGdpdmVuIGNoYW5nZSBvZiBwcm9ncmVzc2lvbiAoaWYgYW55KSBhbmQgdGhlIGdpdmVuIHRpbGUuCkBAIC0xMTc0LDcgKzEyNDMsOCBAQAogICoKICAqIEByZXR1cm4gICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgdGlsZSBwYXJ0cy4KICAqLwotc3RhdGljIE9QSl9VSU5UMzIgb3BqX2oya19nZXRfbnVtX3RwKCBvcGpfY3BfdCAqY3AsIE9QSl9VSU5UMzIgcGlubywgT1BKX1VJTlQzMiB0aWxlbm8pOworc3RhdGljIE9QSl9VSU5UMzIgb3BqX2oya19nZXRfbnVtX3RwKG9wal9jcF90ICpjcCwgT1BKX1VJTlQzMiBwaW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdGlsZW5vKTsKIAogLyoqCiAgKiBDYWxjdWxhdGVzIHRoZSB0b3RhbCBudW1iZXIgb2YgdGlsZSBwYXJ0cyBuZWVkZWQgYnkgdGhlIGVuY29kZXIgdG8KQEAgLTExODgsMTEgKzEyNTgsMTEgQEAKICAqCiAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZ1bmN0aW9uIHdhcyBzdWNjZXNzZnVsLCBmYWxzZSBlbHNlLgogICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19jYWxjdWxhdGVfdHAoICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY3BfdCAqY3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbmJfdGlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKmltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19jYWxjdWxhdGVfdHAob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY3BfdCAqY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbmJfdGlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKmltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIHN0YXRpYyB2b2lkIG9wal9qMmtfZHVtcF9NSF9pbmZvKG9wal9qMmtfdCogcF9qMmssIEZJTEUqIG91dF9zdHJlYW0pOwogCkBAIC0xMjAwLDE1ICsxMjcwLDE3IEBACiAKIHN0YXRpYyBvcGpfY29kZXN0cmVhbV9pbmRleF90KiBvcGpfajJrX2NyZWF0ZV9jc3RyX2luZGV4KHZvaWQpOwogCi1zdGF0aWMgT1BKX0ZMT0FUMzIgb3BqX2oya19nZXRfdHBfc3RyaWRlIChvcGpfdGNwX3QgKiBwX3RjcCk7CitzdGF0aWMgT1BKX0ZMT0FUMzIgb3BqX2oya19nZXRfdHBfc3RyaWRlKG9wal90Y3BfdCAqIHBfdGNwKTsKIAotc3RhdGljIE9QSl9GTE9BVDMyIG9wal9qMmtfZ2V0X2RlZmF1bHRfc3RyaWRlIChvcGpfdGNwX3QgKiBwX3RjcCk7CitzdGF0aWMgT1BKX0ZMT0FUMzIgb3BqX2oya19nZXRfZGVmYXVsdF9zdHJpZGUob3BqX3RjcF90ICogcF90Y3ApOwogCiBzdGF0aWMgaW50IG9wal9qMmtfaW5pdGlhbGlzZV80S19wb2Mob3BqX3BvY190ICpQT0MsIGludCBudW1yZXMpOwogCi1zdGF0aWMgdm9pZCBvcGpfajJrX3NldF9jaW5lbWFfcGFyYW1ldGVycyhvcGpfY3BhcmFtZXRlcnNfdCAqcGFyYW1ldGVycywgb3BqX2ltYWdlX3QgKmltYWdlLCBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcik7CitzdGF0aWMgdm9pZCBvcGpfajJrX3NldF9jaW5lbWFfcGFyYW1ldGVycyhvcGpfY3BhcmFtZXRlcnNfdCAqcGFyYW1ldGVycywKKyAgICAgICAgb3BqX2ltYWdlX3QgKmltYWdlLCBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcik7CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2lzX2NpbmVtYV9jb21wbGlhbnQob3BqX2ltYWdlX3QgKmltYWdlLCBPUEpfVUlOVDE2IHJzaXosIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2lzX2NpbmVtYV9jb21wbGlhbnQob3BqX2ltYWdlX3QgKmltYWdlLCBPUEpfVUlOVDE2IHJzaXosCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBDaGVja3MgZm9yIGludmFsaWQgbnVtYmVyIG9mIHRpbGUtcGFydHMgaW4gU09UIG1hcmtlciAoVFBzb3Q9PVROc290KS4gU2VlIGlzc3VlIDI1NC4KQEAgLTEyMjAsNTg5ICsxMjkyLDYwMyBAQAogICoKICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gd2FzIHN1Y2Nlc3NmdWwsIGZhbHNlIGVsc2UuCiAgKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX25lZWRfbmJfdGlsZV9wYXJ0c19jb3JyZWN0aW9uKG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwgT1BKX1VJTlQzMiB0aWxlX25vLCBPUEpfQk9PTCogcF9jb3JyZWN0aW9uX25lZWRlZCwgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19uZWVkX25iX3RpbGVfcGFydHNfY29ycmVjdGlvbihvcGpfc3RyZWFtX3ByaXZhdGVfdAorICAgICAgICAqcF9zdHJlYW0sIE9QSl9VSU5UMzIgdGlsZV9ubywgT1BKX0JPT0wqIHBfY29ycmVjdGlvbl9uZWVkZWQsCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qQH0qLwogCiAvKkB9Ki8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXR5cGVkZWYgc3RydWN0IGoya19wcm9nX29yZGVyewotICAgICAgICBPUEpfUFJPR19PUkRFUiBlbnVtX3Byb2c7Ci0gICAgICAgIGNoYXIgc3RyX3Byb2dbNV07Ci19ajJrX3Byb2dfb3JkZXJfdDsKK3R5cGVkZWYgc3RydWN0IGoya19wcm9nX29yZGVyIHsKKyAgICBPUEpfUFJPR19PUkRFUiBlbnVtX3Byb2c7CisgICAgY2hhciBzdHJfcHJvZ1s1XTsKK30gajJrX3Byb2dfb3JkZXJfdDsKIAotc3RhdGljIGoya19wcm9nX29yZGVyX3QgajJrX3Byb2dfb3JkZXJfbGlzdFtdID0gewotICAgICAgICB7T1BKX0NQUkwsICJDUFJMIn0sCi0gICAgICAgIHtPUEpfTFJDUCwgIkxSQ1AifSwKLSAgICAgICAge09QSl9QQ1JMLCAiUENSTCJ9LAotICAgICAgICB7T1BKX1JMQ1AsICJSTENQIn0sCi0gICAgICAgIHtPUEpfUlBDTCwgIlJQQ0wifSwKLSAgICAgICAgeyhPUEpfUFJPR19PUkRFUiktMSwgIiJ9CitzdGF0aWMgY29uc3QgajJrX3Byb2dfb3JkZXJfdCBqMmtfcHJvZ19vcmRlcl9saXN0W10gPSB7CisgICAge09QSl9DUFJMLCAiQ1BSTCJ9LAorICAgIHtPUEpfTFJDUCwgIkxSQ1AifSwKKyAgICB7T1BKX1BDUkwsICJQQ1JMIn0sCisgICAge09QSl9STENQLCAiUkxDUCJ9LAorICAgIHtPUEpfUlBDTCwgIlJQQ0wifSwKKyAgICB7KE9QSl9QUk9HX09SREVSKSAtIDEsICIifQogfTsKIAogLyoqCiAgKiBGSVhNRSBET0MKICAqLwotc3RhdGljIGNvbnN0IE9QSl9VSU5UMzIgTUNUX0VMRU1FTlRfU0laRSBbXSA9Ci17Ci0gICAgICAgIDIsCi0gICAgICAgIDQsCi0gICAgICAgIDQsCi0gICAgICAgIDgKK3N0YXRpYyBjb25zdCBPUEpfVUlOVDMyIE1DVF9FTEVNRU5UX1NJWkUgW10gPSB7CisgICAgMiwKKyAgICA0LAorICAgIDQsCisgICAgOAogfTsKIAotdHlwZWRlZiB2b2lkICgqIG9wal9qMmtfbWN0X2Z1bmN0aW9uKSAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pOwordHlwZWRlZiB2b2lkICgqIG9wal9qMmtfbWN0X2Z1bmN0aW9uKShjb25zdCB2b2lkICogcF9zcmNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSk7CiAKLXN0YXRpYyBjb25zdCBvcGpfajJrX21jdF9mdW5jdGlvbiBqMmtfbWN0X3JlYWRfZnVuY3Rpb25zX3RvX2Zsb2F0IFtdID0KLXsKLSAgICAgICAgb3BqX2oya19yZWFkX2ludDE2X3RvX2Zsb2F0LAotICAgICAgICBvcGpfajJrX3JlYWRfaW50MzJfdG9fZmxvYXQsCi0gICAgICAgIG9wal9qMmtfcmVhZF9mbG9hdDMyX3RvX2Zsb2F0LAotICAgICAgICBvcGpfajJrX3JlYWRfZmxvYXQ2NF90b19mbG9hdAorc3RhdGljIGNvbnN0IG9wal9qMmtfbWN0X2Z1bmN0aW9uIGoya19tY3RfcmVhZF9mdW5jdGlvbnNfdG9fZmxvYXQgW10gPSB7CisgICAgb3BqX2oya19yZWFkX2ludDE2X3RvX2Zsb2F0LAorICAgIG9wal9qMmtfcmVhZF9pbnQzMl90b19mbG9hdCwKKyAgICBvcGpfajJrX3JlYWRfZmxvYXQzMl90b19mbG9hdCwKKyAgICBvcGpfajJrX3JlYWRfZmxvYXQ2NF90b19mbG9hdAogfTsKIAotc3RhdGljIGNvbnN0IG9wal9qMmtfbWN0X2Z1bmN0aW9uIGoya19tY3RfcmVhZF9mdW5jdGlvbnNfdG9faW50MzIgW10gPQotewotICAgICAgICBvcGpfajJrX3JlYWRfaW50MTZfdG9faW50MzIsCi0gICAgICAgIG9wal9qMmtfcmVhZF9pbnQzMl90b19pbnQzMiwKLSAgICAgICAgb3BqX2oya19yZWFkX2Zsb2F0MzJfdG9faW50MzIsCi0gICAgICAgIG9wal9qMmtfcmVhZF9mbG9hdDY0X3RvX2ludDMyCitzdGF0aWMgY29uc3Qgb3BqX2oya19tY3RfZnVuY3Rpb24gajJrX21jdF9yZWFkX2Z1bmN0aW9uc190b19pbnQzMiBbXSA9IHsKKyAgICBvcGpfajJrX3JlYWRfaW50MTZfdG9faW50MzIsCisgICAgb3BqX2oya19yZWFkX2ludDMyX3RvX2ludDMyLAorICAgIG9wal9qMmtfcmVhZF9mbG9hdDMyX3RvX2ludDMyLAorICAgIG9wal9qMmtfcmVhZF9mbG9hdDY0X3RvX2ludDMyCiB9OwogCi1zdGF0aWMgY29uc3Qgb3BqX2oya19tY3RfZnVuY3Rpb24gajJrX21jdF93cml0ZV9mdW5jdGlvbnNfZnJvbV9mbG9hdCBbXSA9Ci17Ci0gICAgICAgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9faW50MTYsCi0gICAgICAgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9faW50MzIsCi0gICAgICAgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9fZmxvYXQsCi0gICAgICAgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9fZmxvYXQ2NAorc3RhdGljIGNvbnN0IG9wal9qMmtfbWN0X2Z1bmN0aW9uIGoya19tY3Rfd3JpdGVfZnVuY3Rpb25zX2Zyb21fZmxvYXQgW10gPSB7CisgICAgb3BqX2oya193cml0ZV9mbG9hdF90b19pbnQxNiwKKyAgICBvcGpfajJrX3dyaXRlX2Zsb2F0X3RvX2ludDMyLAorICAgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9fZmxvYXQsCisgICAgb3BqX2oya193cml0ZV9mbG9hdF90b19mbG9hdDY0CiB9OwogCi10eXBlZGVmIHN0cnVjdCBvcGpfZGVjX21lbW9yeV9tYXJrZXJfaGFuZGxlcgotewotICAgICAgICAvKiogbWFya2VyIHZhbHVlICovCi0gICAgICAgIE9QSl9VSU5UMzIgaWQ7Ci0gICAgICAgIC8qKiB2YWx1ZSBvZiB0aGUgc3RhdGUgd2hlbiB0aGUgbWFya2VyIGNhbiBhcHBlYXIgKi8KLSAgICAgICAgT1BKX1VJTlQzMiBzdGF0ZXM7Ci0gICAgICAgIC8qKiBhY3Rpb24gbGlua2VkIHRvIHRoZSBtYXJrZXIgKi8KLSAgICAgICAgT1BKX0JPT0wgKCpoYW5kbGVyKSAoICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOwordHlwZWRlZiBzdHJ1Y3Qgb3BqX2RlY19tZW1vcnlfbWFya2VyX2hhbmRsZXIgeworICAgIC8qKiBtYXJrZXIgdmFsdWUgKi8KKyAgICBPUEpfVUlOVDMyIGlkOworICAgIC8qKiB2YWx1ZSBvZiB0aGUgc3RhdGUgd2hlbiB0aGUgbWFya2VyIGNhbiBhcHBlYXIgKi8KKyAgICBPUEpfVUlOVDMyIHN0YXRlczsKKyAgICAvKiogYWN0aW9uIGxpbmtlZCB0byB0aGUgbWFya2VyICovCisgICAgT1BKX0JPT0woKmhhbmRsZXIpKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogfQogb3BqX2RlY19tZW1vcnlfbWFya2VyX2hhbmRsZXJfdDsKIAogc3RhdGljIGNvbnN0IG9wal9kZWNfbWVtb3J5X21hcmtlcl9oYW5kbGVyX3QgajJrX21lbW9yeV9tYXJrZXJfaGFuZGxlcl90YWIgW10gPQogewotICB7SjJLX01TX1NPVCwgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSFNPVCwgb3BqX2oya19yZWFkX3NvdH0sCi0gIHtKMktfTVNfQ09ELCBKMktfU1RBVEVfTUggfCBKMktfU1RBVEVfVFBILCBvcGpfajJrX3JlYWRfY29kfSwKLSAge0oyS19NU19DT0MsIEoyS19TVEFURV9NSCB8IEoyS19TVEFURV9UUEgsIG9wal9qMmtfcmVhZF9jb2N9LAotICB7SjJLX01TX1JHTiwgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgb3BqX2oya19yZWFkX3Jnbn0sCi0gIHtKMktfTVNfUUNELCBKMktfU1RBVEVfTUggfCBKMktfU1RBVEVfVFBILCBvcGpfajJrX3JlYWRfcWNkfSwKLSAge0oyS19NU19RQ0MsIEoyS19TVEFURV9NSCB8IEoyS19TVEFURV9UUEgsIG9wal9qMmtfcmVhZF9xY2N9LAotICB7SjJLX01TX1BPQywgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgb3BqX2oya19yZWFkX3BvY30sCi0gIHtKMktfTVNfU0laLCBKMktfU1RBVEVfTUhTSVosIG9wal9qMmtfcmVhZF9zaXp9LAotICB7SjJLX01TX1RMTSwgSjJLX1NUQVRFX01ILCBvcGpfajJrX3JlYWRfdGxtfSwKLSAge0oyS19NU19QTE0sIEoyS19TVEFURV9NSCwgb3BqX2oya19yZWFkX3BsbX0sCi0gIHtKMktfTVNfUExULCBKMktfU1RBVEVfVFBILCBvcGpfajJrX3JlYWRfcGx0fSwKLSAge0oyS19NU19QUE0sIEoyS19TVEFURV9NSCwgb3BqX2oya19yZWFkX3BwbX0sCi0gIHtKMktfTVNfUFBULCBKMktfU1RBVEVfVFBILCBvcGpfajJrX3JlYWRfcHB0fSwKLSAge0oyS19NU19TT1AsIDAsIDB9LAotICB7SjJLX01TX0NSRywgSjJLX1NUQVRFX01ILCBvcGpfajJrX3JlYWRfY3JnfSwKLSAge0oyS19NU19DT00sIEoyS19TVEFURV9NSCB8IEoyS19TVEFURV9UUEgsIG9wal9qMmtfcmVhZF9jb219LAotICB7SjJLX01TX01DVCwgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgb3BqX2oya19yZWFkX21jdH0sCi0gIHtKMktfTVNfQ0JELCBKMktfU1RBVEVfTUggLCBvcGpfajJrX3JlYWRfY2JkfSwKLSAge0oyS19NU19NQ0MsIEoyS19TVEFURV9NSCB8IEoyS19TVEFURV9UUEgsIG9wal9qMmtfcmVhZF9tY2N9LAotICB7SjJLX01TX01DTywgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgb3BqX2oya19yZWFkX21jb30sCisgICAge0oyS19NU19TT1QsIEoyS19TVEFURV9NSCB8IEoyS19TVEFURV9UUEhTT1QsIG9wal9qMmtfcmVhZF9zb3R9LAorICAgIHtKMktfTVNfQ09ELCBKMktfU1RBVEVfTUggfCBKMktfU1RBVEVfVFBILCBvcGpfajJrX3JlYWRfY29kfSwKKyAgICB7SjJLX01TX0NPQywgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgb3BqX2oya19yZWFkX2NvY30sCisgICAge0oyS19NU19SR04sIEoyS19TVEFURV9NSCB8IEoyS19TVEFURV9UUEgsIG9wal9qMmtfcmVhZF9yZ259LAorICAgIHtKMktfTVNfUUNELCBKMktfU1RBVEVfTUggfCBKMktfU1RBVEVfVFBILCBvcGpfajJrX3JlYWRfcWNkfSwKKyAgICB7SjJLX01TX1FDQywgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgb3BqX2oya19yZWFkX3FjY30sCisgICAge0oyS19NU19QT0MsIEoyS19TVEFURV9NSCB8IEoyS19TVEFURV9UUEgsIG9wal9qMmtfcmVhZF9wb2N9LAorICAgIHtKMktfTVNfU0laLCBKMktfU1RBVEVfTUhTSVosIG9wal9qMmtfcmVhZF9zaXp9LAorICAgIHtKMktfTVNfVExNLCBKMktfU1RBVEVfTUgsIG9wal9qMmtfcmVhZF90bG19LAorICAgIHtKMktfTVNfUExNLCBKMktfU1RBVEVfTUgsIG9wal9qMmtfcmVhZF9wbG19LAorICAgIHtKMktfTVNfUExULCBKMktfU1RBVEVfVFBILCBvcGpfajJrX3JlYWRfcGx0fSwKKyAgICB7SjJLX01TX1BQTSwgSjJLX1NUQVRFX01ILCBvcGpfajJrX3JlYWRfcHBtfSwKKyAgICB7SjJLX01TX1BQVCwgSjJLX1NUQVRFX1RQSCwgb3BqX2oya19yZWFkX3BwdH0sCisgICAge0oyS19NU19TT1AsIDAsIDB9LAorICAgIHtKMktfTVNfQ1JHLCBKMktfU1RBVEVfTUgsIG9wal9qMmtfcmVhZF9jcmd9LAorICAgIHtKMktfTVNfQ09NLCBKMktfU1RBVEVfTUggfCBKMktfU1RBVEVfVFBILCBvcGpfajJrX3JlYWRfY29tfSwKKyAgICB7SjJLX01TX01DVCwgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgb3BqX2oya19yZWFkX21jdH0sCisgICAge0oyS19NU19DQkQsIEoyS19TVEFURV9NSCwgb3BqX2oya19yZWFkX2NiZH0sCisgICAge0oyS19NU19NQ0MsIEoyS19TVEFURV9NSCB8IEoyS19TVEFURV9UUEgsIG9wal9qMmtfcmVhZF9tY2N9LAorICAgIHtKMktfTVNfTUNPLCBKMktfU1RBVEVfTUggfCBKMktfU1RBVEVfVFBILCBvcGpfajJrX3JlYWRfbWNvfSwKICNpZmRlZiBVU0VfSlBXTAogI2lmZGVmIFRPRE9fTVMgLyogcmVtb3ZlIHRoZXNlIGZ1bmN0aW9ucyB3aGljaCBhcmUgbm90IGNvbW1wYXRpYmxlIHdpdGggdGhlIHYyIEFQSSAqLwotICB7SjJLX01TX0VQQywgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgajJrX3JlYWRfZXBjfSwKLSAge0oyS19NU19FUEIsIEoyS19TVEFURV9NSCB8IEoyS19TVEFURV9UUEgsIGoya19yZWFkX2VwYn0sCi0gIHtKMktfTVNfRVNELCBKMktfU1RBVEVfTUggfCBKMktfU1RBVEVfVFBILCBqMmtfcmVhZF9lc2R9LAotICB7SjJLX01TX1JFRCwgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgajJrX3JlYWRfcmVkfSwKKyAgICB7SjJLX01TX0VQQywgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgajJrX3JlYWRfZXBjfSwKKyAgICB7SjJLX01TX0VQQiwgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgajJrX3JlYWRfZXBifSwKKyAgICB7SjJLX01TX0VTRCwgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgajJrX3JlYWRfZXNkfSwKKyAgICB7SjJLX01TX1JFRCwgSjJLX1NUQVRFX01IIHwgSjJLX1NUQVRFX1RQSCwgajJrX3JlYWRfcmVkfSwKICNlbmRpZgogI2VuZGlmIC8qIFVTRV9KUFdMICovCiAjaWZkZWYgVVNFX0pQU0VDCi0gIHtKMktfTVNfU0VDLCBKMktfREVDX1NUQVRFX01ILCBqMmtfcmVhZF9zZWN9LAotICB7SjJLX01TX0lOU0VDLCAwLCBqMmtfcmVhZF9pbnNlY30KKyAgICB7SjJLX01TX1NFQywgSjJLX0RFQ19TVEFURV9NSCwgajJrX3JlYWRfc2VjfSwKKyAgICB7SjJLX01TX0lOU0VDLCAwLCBqMmtfcmVhZF9pbnNlY30KICNlbmRpZiAvKiBVU0VfSlBTRUMgKi8KLSAge0oyS19NU19VTkssIEoyS19TVEFURV9NSCB8IEoyS19TVEFURV9UUEgsIDB9LypvcGpfajJrX3JlYWRfdW5rIGlzIGRpcmVjdGx5IHVzZWQqLworICAgIHtKMktfTVNfVU5LLCBKMktfU1RBVEVfTUggfCBKMktfU1RBVEVfVFBILCAwfS8qb3BqX2oya19yZWFkX3VuayBpcyBkaXJlY3RseSB1c2VkKi8KIH07CiAKLXN0YXRpYyB2b2lkICBvcGpfajJrX3JlYWRfaW50MTZfdG9fZmxvYXQgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKQorc3RhdGljIHZvaWQgIG9wal9qMmtfcmVhZF9pbnQxNl90b19mbG9hdChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwKKyAgICAgICAgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSkKIHsKLSAgICAgICAgT1BKX0JZVEUgKiBsX3NyY19kYXRhID0gKE9QSl9CWVRFICopIHBfc3JjX2RhdGE7Ci0gICAgICAgIE9QSl9GTE9BVDMyICogbF9kZXN0X2RhdGEgPSAoT1BKX0ZMT0FUMzIgKikgcF9kZXN0X2RhdGE7Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3RlbXA7CisgICAgT1BKX0JZVEUgKiBsX3NyY19kYXRhID0gKE9QSl9CWVRFICopIHBfc3JjX2RhdGE7CisgICAgT1BKX0ZMT0FUMzIgKiBsX2Rlc3RfZGF0YSA9IChPUEpfRkxPQVQzMiAqKSBwX2Rlc3RfZGF0YTsKKyAgICBPUEpfVUlOVDMyIGk7CisgICAgT1BKX1VJTlQzMiBsX3RlbXA7CiAKLSAgICAgICAgZm9yIChpPTA7aTxwX25iX2VsZW07KytpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMobF9zcmNfZGF0YSwmbF90ZW1wLDIpOworICAgIGZvciAoaSA9IDA7IGkgPCBwX25iX2VsZW07ICsraSkgeworICAgICAgICBvcGpfcmVhZF9ieXRlcyhsX3NyY19kYXRhLCAmbF90ZW1wLCAyKTsKIAotICAgICAgICAgICAgICAgIGxfc3JjX2RhdGErPXNpemVvZihPUEpfSU5UMTYpOworICAgICAgICBsX3NyY19kYXRhICs9IHNpemVvZihPUEpfSU5UMTYpOwogCi0gICAgICAgICAgICAgICAgKihsX2Rlc3RfZGF0YSsrKSA9IChPUEpfRkxPQVQzMikgbF90ZW1wOwotICAgICAgICB9CisgICAgICAgICoobF9kZXN0X2RhdGErKykgPSAoT1BKX0ZMT0FUMzIpIGxfdGVtcDsKKyAgICB9CiB9CiAKLXN0YXRpYyB2b2lkICBvcGpfajJrX3JlYWRfaW50MzJfdG9fZmxvYXQgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKQorc3RhdGljIHZvaWQgIG9wal9qMmtfcmVhZF9pbnQzMl90b19mbG9hdChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwKKyAgICAgICAgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSkKIHsKLSAgICAgICAgT1BKX0JZVEUgKiBsX3NyY19kYXRhID0gKE9QSl9CWVRFICopIHBfc3JjX2RhdGE7Ci0gICAgICAgIE9QSl9GTE9BVDMyICogbF9kZXN0X2RhdGEgPSAoT1BKX0ZMT0FUMzIgKikgcF9kZXN0X2RhdGE7Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3RlbXA7CisgICAgT1BKX0JZVEUgKiBsX3NyY19kYXRhID0gKE9QSl9CWVRFICopIHBfc3JjX2RhdGE7CisgICAgT1BKX0ZMT0FUMzIgKiBsX2Rlc3RfZGF0YSA9IChPUEpfRkxPQVQzMiAqKSBwX2Rlc3RfZGF0YTsKKyAgICBPUEpfVUlOVDMyIGk7CisgICAgT1BKX1VJTlQzMiBsX3RlbXA7CiAKLSAgICAgICAgZm9yIChpPTA7aTxwX25iX2VsZW07KytpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMobF9zcmNfZGF0YSwmbF90ZW1wLDQpOworICAgIGZvciAoaSA9IDA7IGkgPCBwX25iX2VsZW07ICsraSkgeworICAgICAgICBvcGpfcmVhZF9ieXRlcyhsX3NyY19kYXRhLCAmbF90ZW1wLCA0KTsKIAotICAgICAgICAgICAgICAgIGxfc3JjX2RhdGErPXNpemVvZihPUEpfSU5UMzIpOworICAgICAgICBsX3NyY19kYXRhICs9IHNpemVvZihPUEpfSU5UMzIpOwogCi0gICAgICAgICAgICAgICAgKihsX2Rlc3RfZGF0YSsrKSA9IChPUEpfRkxPQVQzMikgbF90ZW1wOwotICAgICAgICB9CisgICAgICAgICoobF9kZXN0X2RhdGErKykgPSAoT1BKX0ZMT0FUMzIpIGxfdGVtcDsKKyAgICB9CiB9CiAKLXN0YXRpYyB2b2lkICBvcGpfajJrX3JlYWRfZmxvYXQzMl90b19mbG9hdCAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pCitzdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2Zsb2F0MzJfdG9fZmxvYXQoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsCisgICAgICAgIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pCiB7Ci0gICAgICAgIE9QSl9CWVRFICogbF9zcmNfZGF0YSA9IChPUEpfQllURSAqKSBwX3NyY19kYXRhOwotICAgICAgICBPUEpfRkxPQVQzMiAqIGxfZGVzdF9kYXRhID0gKE9QSl9GTE9BVDMyICopIHBfZGVzdF9kYXRhOwotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIE9QSl9GTE9BVDMyIGxfdGVtcDsKKyAgICBPUEpfQllURSAqIGxfc3JjX2RhdGEgPSAoT1BKX0JZVEUgKikgcF9zcmNfZGF0YTsKKyAgICBPUEpfRkxPQVQzMiAqIGxfZGVzdF9kYXRhID0gKE9QSl9GTE9BVDMyICopIHBfZGVzdF9kYXRhOworICAgIE9QSl9VSU5UMzIgaTsKKyAgICBPUEpfRkxPQVQzMiBsX3RlbXA7CiAKLSAgICAgICAgZm9yIChpPTA7aTxwX25iX2VsZW07KytpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3JlYWRfZmxvYXQobF9zcmNfZGF0YSwmbF90ZW1wKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcF9uYl9lbGVtOyArK2kpIHsKKyAgICAgICAgb3BqX3JlYWRfZmxvYXQobF9zcmNfZGF0YSwgJmxfdGVtcCk7CiAKLSAgICAgICAgICAgICAgICBsX3NyY19kYXRhKz1zaXplb2YoT1BKX0ZMT0FUMzIpOworICAgICAgICBsX3NyY19kYXRhICs9IHNpemVvZihPUEpfRkxPQVQzMik7CiAKLSAgICAgICAgICAgICAgICAqKGxfZGVzdF9kYXRhKyspID0gbF90ZW1wOwotICAgICAgICB9CisgICAgICAgICoobF9kZXN0X2RhdGErKykgPSBsX3RlbXA7CisgICAgfQogfQogCi1zdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2Zsb2F0NjRfdG9fZmxvYXQgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKQorc3RhdGljIHZvaWQgIG9wal9qMmtfcmVhZF9mbG9hdDY0X3RvX2Zsb2F0KGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLAorICAgICAgICB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKQogewotICAgICAgICBPUEpfQllURSAqIGxfc3JjX2RhdGEgPSAoT1BKX0JZVEUgKikgcF9zcmNfZGF0YTsKLSAgICAgICAgT1BKX0ZMT0FUMzIgKiBsX2Rlc3RfZGF0YSA9IChPUEpfRkxPQVQzMiAqKSBwX2Rlc3RfZGF0YTsKLSAgICAgICAgT1BKX1VJTlQzMiBpOwotICAgICAgICBPUEpfRkxPQVQ2NCBsX3RlbXA7CisgICAgT1BKX0JZVEUgKiBsX3NyY19kYXRhID0gKE9QSl9CWVRFICopIHBfc3JjX2RhdGE7CisgICAgT1BKX0ZMT0FUMzIgKiBsX2Rlc3RfZGF0YSA9IChPUEpfRkxPQVQzMiAqKSBwX2Rlc3RfZGF0YTsKKyAgICBPUEpfVUlOVDMyIGk7CisgICAgT1BKX0ZMT0FUNjQgbF90ZW1wOwogCi0gICAgICAgIGZvciAoaT0wO2k8cF9uYl9lbGVtOysraSkgewotICAgICAgICAgICAgICAgIG9wal9yZWFkX2RvdWJsZShsX3NyY19kYXRhLCZsX3RlbXApOworICAgIGZvciAoaSA9IDA7IGkgPCBwX25iX2VsZW07ICsraSkgeworICAgICAgICBvcGpfcmVhZF9kb3VibGUobF9zcmNfZGF0YSwgJmxfdGVtcCk7CiAKLSAgICAgICAgICAgICAgICBsX3NyY19kYXRhKz1zaXplb2YoT1BKX0ZMT0FUNjQpOworICAgICAgICBsX3NyY19kYXRhICs9IHNpemVvZihPUEpfRkxPQVQ2NCk7CiAKLSAgICAgICAgICAgICAgICAqKGxfZGVzdF9kYXRhKyspID0gKE9QSl9GTE9BVDMyKSBsX3RlbXA7Ci0gICAgICAgIH0KKyAgICAgICAgKihsX2Rlc3RfZGF0YSsrKSA9IChPUEpfRkxPQVQzMikgbF90ZW1wOworICAgIH0KIH0KIAotc3RhdGljIHZvaWQgIG9wal9qMmtfcmVhZF9pbnQxNl90b19pbnQzMiAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pCitzdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2ludDE2X3RvX2ludDMyKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLAorICAgICAgICB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKQogewotICAgICAgICBPUEpfQllURSAqIGxfc3JjX2RhdGEgPSAoT1BKX0JZVEUgKikgcF9zcmNfZGF0YTsKLSAgICAgICAgT1BKX0lOVDMyICogbF9kZXN0X2RhdGEgPSAoT1BKX0lOVDMyICopIHBfZGVzdF9kYXRhOwotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF90ZW1wOworICAgIE9QSl9CWVRFICogbF9zcmNfZGF0YSA9IChPUEpfQllURSAqKSBwX3NyY19kYXRhOworICAgIE9QSl9JTlQzMiAqIGxfZGVzdF9kYXRhID0gKE9QSl9JTlQzMiAqKSBwX2Rlc3RfZGF0YTsKKyAgICBPUEpfVUlOVDMyIGk7CisgICAgT1BKX1VJTlQzMiBsX3RlbXA7CiAKLSAgICAgICAgZm9yIChpPTA7aTxwX25iX2VsZW07KytpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMobF9zcmNfZGF0YSwmbF90ZW1wLDIpOworICAgIGZvciAoaSA9IDA7IGkgPCBwX25iX2VsZW07ICsraSkgeworICAgICAgICBvcGpfcmVhZF9ieXRlcyhsX3NyY19kYXRhLCAmbF90ZW1wLCAyKTsKIAotICAgICAgICAgICAgICAgIGxfc3JjX2RhdGErPXNpemVvZihPUEpfSU5UMTYpOworICAgICAgICBsX3NyY19kYXRhICs9IHNpemVvZihPUEpfSU5UMTYpOwogCi0gICAgICAgICAgICAgICAgKihsX2Rlc3RfZGF0YSsrKSA9IChPUEpfSU5UMzIpIGxfdGVtcDsKLSAgICAgICAgfQorICAgICAgICAqKGxfZGVzdF9kYXRhKyspID0gKE9QSl9JTlQzMikgbF90ZW1wOworICAgIH0KIH0KIAotc3RhdGljIHZvaWQgIG9wal9qMmtfcmVhZF9pbnQzMl90b19pbnQzMiAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pCitzdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2ludDMyX3RvX2ludDMyKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLAorICAgICAgICB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKQogewotICAgICAgICBPUEpfQllURSAqIGxfc3JjX2RhdGEgPSAoT1BKX0JZVEUgKikgcF9zcmNfZGF0YTsKLSAgICAgICAgT1BKX0lOVDMyICogbF9kZXN0X2RhdGEgPSAoT1BKX0lOVDMyICopIHBfZGVzdF9kYXRhOwotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF90ZW1wOworICAgIE9QSl9CWVRFICogbF9zcmNfZGF0YSA9IChPUEpfQllURSAqKSBwX3NyY19kYXRhOworICAgIE9QSl9JTlQzMiAqIGxfZGVzdF9kYXRhID0gKE9QSl9JTlQzMiAqKSBwX2Rlc3RfZGF0YTsKKyAgICBPUEpfVUlOVDMyIGk7CisgICAgT1BKX1VJTlQzMiBsX3RlbXA7CiAKLSAgICAgICAgZm9yIChpPTA7aTxwX25iX2VsZW07KytpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMobF9zcmNfZGF0YSwmbF90ZW1wLDQpOworICAgIGZvciAoaSA9IDA7IGkgPCBwX25iX2VsZW07ICsraSkgeworICAgICAgICBvcGpfcmVhZF9ieXRlcyhsX3NyY19kYXRhLCAmbF90ZW1wLCA0KTsKIAotICAgICAgICAgICAgICAgIGxfc3JjX2RhdGErPXNpemVvZihPUEpfSU5UMzIpOworICAgICAgICBsX3NyY19kYXRhICs9IHNpemVvZihPUEpfSU5UMzIpOwogCi0gICAgICAgICAgICAgICAgKihsX2Rlc3RfZGF0YSsrKSA9IChPUEpfSU5UMzIpIGxfdGVtcDsKLSAgICAgICAgfQorICAgICAgICAqKGxfZGVzdF9kYXRhKyspID0gKE9QSl9JTlQzMikgbF90ZW1wOworICAgIH0KIH0KIAotc3RhdGljIHZvaWQgIG9wal9qMmtfcmVhZF9mbG9hdDMyX3RvX2ludDMyIChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSkKK3N0YXRpYyB2b2lkICBvcGpfajJrX3JlYWRfZmxvYXQzMl90b19pbnQzMihjb25zdCB2b2lkICogcF9zcmNfZGF0YSwKKyAgICAgICAgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSkKIHsKLSAgICAgICAgT1BKX0JZVEUgKiBsX3NyY19kYXRhID0gKE9QSl9CWVRFICopIHBfc3JjX2RhdGE7Ci0gICAgICAgIE9QSl9JTlQzMiAqIGxfZGVzdF9kYXRhID0gKE9QSl9JTlQzMiAqKSBwX2Rlc3RfZGF0YTsKLSAgICAgICAgT1BKX1VJTlQzMiBpOwotICAgICAgICBPUEpfRkxPQVQzMiBsX3RlbXA7CisgICAgT1BKX0JZVEUgKiBsX3NyY19kYXRhID0gKE9QSl9CWVRFICopIHBfc3JjX2RhdGE7CisgICAgT1BKX0lOVDMyICogbF9kZXN0X2RhdGEgPSAoT1BKX0lOVDMyICopIHBfZGVzdF9kYXRhOworICAgIE9QSl9VSU5UMzIgaTsKKyAgICBPUEpfRkxPQVQzMiBsX3RlbXA7CiAKLSAgICAgICAgZm9yIChpPTA7aTxwX25iX2VsZW07KytpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3JlYWRfZmxvYXQobF9zcmNfZGF0YSwmbF90ZW1wKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcF9uYl9lbGVtOyArK2kpIHsKKyAgICAgICAgb3BqX3JlYWRfZmxvYXQobF9zcmNfZGF0YSwgJmxfdGVtcCk7CiAKLSAgICAgICAgICAgICAgICBsX3NyY19kYXRhKz1zaXplb2YoT1BKX0ZMT0FUMzIpOworICAgICAgICBsX3NyY19kYXRhICs9IHNpemVvZihPUEpfRkxPQVQzMik7CiAKLSAgICAgICAgICAgICAgICAqKGxfZGVzdF9kYXRhKyspID0gKE9QSl9JTlQzMikgbF90ZW1wOwotICAgICAgICB9CisgICAgICAgICoobF9kZXN0X2RhdGErKykgPSAoT1BKX0lOVDMyKSBsX3RlbXA7CisgICAgfQogfQogCi1zdGF0aWMgdm9pZCAgb3BqX2oya19yZWFkX2Zsb2F0NjRfdG9faW50MzIgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKQorc3RhdGljIHZvaWQgIG9wal9qMmtfcmVhZF9mbG9hdDY0X3RvX2ludDMyKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLAorICAgICAgICB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKQogewotICAgICAgICBPUEpfQllURSAqIGxfc3JjX2RhdGEgPSAoT1BKX0JZVEUgKikgcF9zcmNfZGF0YTsKLSAgICAgICAgT1BKX0lOVDMyICogbF9kZXN0X2RhdGEgPSAoT1BKX0lOVDMyICopIHBfZGVzdF9kYXRhOwotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIE9QSl9GTE9BVDY0IGxfdGVtcDsKKyAgICBPUEpfQllURSAqIGxfc3JjX2RhdGEgPSAoT1BKX0JZVEUgKikgcF9zcmNfZGF0YTsKKyAgICBPUEpfSU5UMzIgKiBsX2Rlc3RfZGF0YSA9IChPUEpfSU5UMzIgKikgcF9kZXN0X2RhdGE7CisgICAgT1BKX1VJTlQzMiBpOworICAgIE9QSl9GTE9BVDY0IGxfdGVtcDsKIAotICAgICAgICBmb3IgKGk9MDtpPHBfbmJfZWxlbTsrK2kpIHsKLSAgICAgICAgICAgICAgICBvcGpfcmVhZF9kb3VibGUobF9zcmNfZGF0YSwmbF90ZW1wKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcF9uYl9lbGVtOyArK2kpIHsKKyAgICAgICAgb3BqX3JlYWRfZG91YmxlKGxfc3JjX2RhdGEsICZsX3RlbXApOwogCi0gICAgICAgICAgICAgICAgbF9zcmNfZGF0YSs9c2l6ZW9mKE9QSl9GTE9BVDY0KTsKKyAgICAgICAgbF9zcmNfZGF0YSArPSBzaXplb2YoT1BKX0ZMT0FUNjQpOwogCi0gICAgICAgICAgICAgICAgKihsX2Rlc3RfZGF0YSsrKSA9IChPUEpfSU5UMzIpIGxfdGVtcDsKLSAgICAgICAgfQorICAgICAgICAqKGxfZGVzdF9kYXRhKyspID0gKE9QSl9JTlQzMikgbF90ZW1wOworICAgIH0KIH0KIAotc3RhdGljIHZvaWQgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9faW50MTYgKGNvbnN0IHZvaWQgKiBwX3NyY19kYXRhLCB2b2lkICogcF9kZXN0X2RhdGEsIE9QSl9VSU5UMzIgcF9uYl9lbGVtKQorc3RhdGljIHZvaWQgIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9faW50MTYoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsCisgICAgICAgIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pCiB7Ci0gICAgICAgIE9QSl9CWVRFICogbF9kZXN0X2RhdGEgPSAoT1BKX0JZVEUgKikgcF9kZXN0X2RhdGE7Ci0gICAgICAgIE9QSl9GTE9BVDMyICogbF9zcmNfZGF0YSA9IChPUEpfRkxPQVQzMiAqKSBwX3NyY19kYXRhOwotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF90ZW1wOworICAgIE9QSl9CWVRFICogbF9kZXN0X2RhdGEgPSAoT1BKX0JZVEUgKikgcF9kZXN0X2RhdGE7CisgICAgT1BKX0ZMT0FUMzIgKiBsX3NyY19kYXRhID0gKE9QSl9GTE9BVDMyICopIHBfc3JjX2RhdGE7CisgICAgT1BKX1VJTlQzMiBpOworICAgIE9QSl9VSU5UMzIgbF90ZW1wOwogCi0gICAgICAgIGZvciAoaT0wO2k8cF9uYl9lbGVtOysraSkgewotICAgICAgICAgICAgICAgIGxfdGVtcCA9IChPUEpfVUlOVDMyKSAqKGxfc3JjX2RhdGErKyk7CisgICAgZm9yIChpID0gMDsgaSA8IHBfbmJfZWxlbTsgKytpKSB7CisgICAgICAgIGxfdGVtcCA9IChPUEpfVUlOVDMyKSAqIChsX3NyY19kYXRhKyspOwogCi0gICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfZGVzdF9kYXRhLGxfdGVtcCxzaXplb2YoT1BKX0lOVDE2KSk7CisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2Rlc3RfZGF0YSwgbF90ZW1wLCBzaXplb2YoT1BKX0lOVDE2KSk7CiAKLSAgICAgICAgICAgICAgICBsX2Rlc3RfZGF0YSs9c2l6ZW9mKE9QSl9JTlQxNik7Ci0gICAgICAgIH0KKyAgICAgICAgbF9kZXN0X2RhdGEgKz0gc2l6ZW9mKE9QSl9JTlQxNik7CisgICAgfQogfQogCi1zdGF0aWMgdm9pZCBvcGpfajJrX3dyaXRlX2Zsb2F0X3RvX2ludDMyIChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSkKK3N0YXRpYyB2b2lkIG9wal9qMmtfd3JpdGVfZmxvYXRfdG9faW50MzIoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsCisgICAgICAgIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pCiB7Ci0gICAgICAgIE9QSl9CWVRFICogbF9kZXN0X2RhdGEgPSAoT1BKX0JZVEUgKikgcF9kZXN0X2RhdGE7Ci0gICAgICAgIE9QSl9GTE9BVDMyICogbF9zcmNfZGF0YSA9IChPUEpfRkxPQVQzMiAqKSBwX3NyY19kYXRhOwotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF90ZW1wOworICAgIE9QSl9CWVRFICogbF9kZXN0X2RhdGEgPSAoT1BKX0JZVEUgKikgcF9kZXN0X2RhdGE7CisgICAgT1BKX0ZMT0FUMzIgKiBsX3NyY19kYXRhID0gKE9QSl9GTE9BVDMyICopIHBfc3JjX2RhdGE7CisgICAgT1BKX1VJTlQzMiBpOworICAgIE9QSl9VSU5UMzIgbF90ZW1wOwogCi0gICAgICAgIGZvciAoaT0wO2k8cF9uYl9lbGVtOysraSkgewotICAgICAgICAgICAgICAgIGxfdGVtcCA9IChPUEpfVUlOVDMyKSAqKGxfc3JjX2RhdGErKyk7CisgICAgZm9yIChpID0gMDsgaSA8IHBfbmJfZWxlbTsgKytpKSB7CisgICAgICAgIGxfdGVtcCA9IChPUEpfVUlOVDMyKSAqIChsX3NyY19kYXRhKyspOwogCi0gICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfZGVzdF9kYXRhLGxfdGVtcCxzaXplb2YoT1BKX0lOVDMyKSk7CisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2Rlc3RfZGF0YSwgbF90ZW1wLCBzaXplb2YoT1BKX0lOVDMyKSk7CiAKLSAgICAgICAgICAgICAgICBsX2Rlc3RfZGF0YSs9c2l6ZW9mKE9QSl9JTlQzMik7Ci0gICAgICAgIH0KKyAgICAgICAgbF9kZXN0X2RhdGEgKz0gc2l6ZW9mKE9QSl9JTlQzMik7CisgICAgfQogfQogCi1zdGF0aWMgdm9pZCAgb3BqX2oya193cml0ZV9mbG9hdF90b19mbG9hdCAoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pCitzdGF0aWMgdm9pZCAgb3BqX2oya193cml0ZV9mbG9hdF90b19mbG9hdChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwKKyAgICAgICAgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSkKIHsKLSAgICAgICAgT1BKX0JZVEUgKiBsX2Rlc3RfZGF0YSA9IChPUEpfQllURSAqKSBwX2Rlc3RfZGF0YTsKLSAgICAgICAgT1BKX0ZMT0FUMzIgKiBsX3NyY19kYXRhID0gKE9QSl9GTE9BVDMyICopIHBfc3JjX2RhdGE7Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgT1BKX0ZMT0FUMzIgbF90ZW1wOworICAgIE9QSl9CWVRFICogbF9kZXN0X2RhdGEgPSAoT1BKX0JZVEUgKikgcF9kZXN0X2RhdGE7CisgICAgT1BKX0ZMT0FUMzIgKiBsX3NyY19kYXRhID0gKE9QSl9GTE9BVDMyICopIHBfc3JjX2RhdGE7CisgICAgT1BKX1VJTlQzMiBpOworICAgIE9QSl9GTE9BVDMyIGxfdGVtcDsKIAotICAgICAgICBmb3IgKGk9MDtpPHBfbmJfZWxlbTsrK2kpIHsKLSAgICAgICAgICAgICAgICBsX3RlbXAgPSAoT1BKX0ZMT0FUMzIpICoobF9zcmNfZGF0YSsrKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcF9uYl9lbGVtOyArK2kpIHsKKyAgICAgICAgbF90ZW1wID0gKE9QSl9GTE9BVDMyKSAqIChsX3NyY19kYXRhKyspOwogCi0gICAgICAgICAgICAgICAgb3BqX3dyaXRlX2Zsb2F0KGxfZGVzdF9kYXRhLGxfdGVtcCk7CisgICAgICAgIG9wal93cml0ZV9mbG9hdChsX2Rlc3RfZGF0YSwgbF90ZW1wKTsKIAotICAgICAgICAgICAgICAgIGxfZGVzdF9kYXRhKz1zaXplb2YoT1BKX0ZMT0FUMzIpOwotICAgICAgICB9CisgICAgICAgIGxfZGVzdF9kYXRhICs9IHNpemVvZihPUEpfRkxPQVQzMik7CisgICAgfQogfQogCi1zdGF0aWMgdm9pZCAgb3BqX2oya193cml0ZV9mbG9hdF90b19mbG9hdDY0IChjb25zdCB2b2lkICogcF9zcmNfZGF0YSwgdm9pZCAqIHBfZGVzdF9kYXRhLCBPUEpfVUlOVDMyIHBfbmJfZWxlbSkKK3N0YXRpYyB2b2lkICBvcGpfajJrX3dyaXRlX2Zsb2F0X3RvX2Zsb2F0NjQoY29uc3Qgdm9pZCAqIHBfc3JjX2RhdGEsCisgICAgICAgIHZvaWQgKiBwX2Rlc3RfZGF0YSwgT1BKX1VJTlQzMiBwX25iX2VsZW0pCiB7Ci0gICAgICAgIE9QSl9CWVRFICogbF9kZXN0X2RhdGEgPSAoT1BKX0JZVEUgKikgcF9kZXN0X2RhdGE7Ci0gICAgICAgIE9QSl9GTE9BVDMyICogbF9zcmNfZGF0YSA9IChPUEpfRkxPQVQzMiAqKSBwX3NyY19kYXRhOwotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIE9QSl9GTE9BVDY0IGxfdGVtcDsKKyAgICBPUEpfQllURSAqIGxfZGVzdF9kYXRhID0gKE9QSl9CWVRFICopIHBfZGVzdF9kYXRhOworICAgIE9QSl9GTE9BVDMyICogbF9zcmNfZGF0YSA9IChPUEpfRkxPQVQzMiAqKSBwX3NyY19kYXRhOworICAgIE9QSl9VSU5UMzIgaTsKKyAgICBPUEpfRkxPQVQ2NCBsX3RlbXA7CiAKLSAgICAgICAgZm9yIChpPTA7aTxwX25iX2VsZW07KytpKSB7Ci0gICAgICAgICAgICAgICAgbF90ZW1wID0gKE9QSl9GTE9BVDY0KSAqKGxfc3JjX2RhdGErKyk7CisgICAgZm9yIChpID0gMDsgaSA8IHBfbmJfZWxlbTsgKytpKSB7CisgICAgICAgIGxfdGVtcCA9IChPUEpfRkxPQVQ2NCkgKiAobF9zcmNfZGF0YSsrKTsKIAotICAgICAgICAgICAgICAgIG9wal93cml0ZV9kb3VibGUobF9kZXN0X2RhdGEsbF90ZW1wKTsKKyAgICAgICAgb3BqX3dyaXRlX2RvdWJsZShsX2Rlc3RfZGF0YSwgbF90ZW1wKTsKIAotICAgICAgICAgICAgICAgIGxfZGVzdF9kYXRhKz1zaXplb2YoT1BKX0ZMT0FUNjQpOwotICAgICAgICB9CisgICAgICAgIGxfZGVzdF9kYXRhICs9IHNpemVvZihPUEpfRkxPQVQ2NCk7CisgICAgfQogfQogCi1jaGFyICpvcGpfajJrX2NvbnZlcnRfcHJvZ3Jlc3Npb25fb3JkZXIoT1BKX1BST0dfT1JERVIgcHJnX29yZGVyKXsKLSAgICAgICAgajJrX3Byb2dfb3JkZXJfdCAqcG87Ci0gICAgICAgIGZvcihwbyA9IGoya19wcm9nX29yZGVyX2xpc3Q7IHBvLT5lbnVtX3Byb2cgIT0gLTE7IHBvKysgKXsKLSAgICAgICAgICAgICAgICBpZihwby0+ZW51bV9wcm9nID09IHByZ19vcmRlcil7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG8tPnN0cl9wcm9nOwotICAgICAgICAgICAgICAgIH0KK2NvbnN0IGNoYXIgKm9wal9qMmtfY29udmVydF9wcm9ncmVzc2lvbl9vcmRlcihPUEpfUFJPR19PUkRFUiBwcmdfb3JkZXIpCit7CisgICAgY29uc3QgajJrX3Byb2dfb3JkZXJfdCAqcG87CisgICAgZm9yIChwbyA9IGoya19wcm9nX29yZGVyX2xpc3Q7IHBvLT5lbnVtX3Byb2cgIT0gLTE7IHBvKyspIHsKKyAgICAgICAgaWYgKHBvLT5lbnVtX3Byb2cgPT0gcHJnX29yZGVyKSB7CisgICAgICAgICAgICByZXR1cm4gcG8tPnN0cl9wcm9nOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwby0+c3RyX3Byb2c7CisgICAgfQorICAgIHJldHVybiBwby0+c3RyX3Byb2c7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2NoZWNrX3BvY192YWwoIGNvbnN0IG9wal9wb2NfdCAqcF9wb2NzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbmJfcG9jcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX25iX3Jlc29sdXRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbnVtX2NvbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbnVtX2xheWVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfY2hlY2tfcG9jX3ZhbChjb25zdCBvcGpfcG9jX3QgKnBfcG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX25iX3BvY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9uYl9yZXNvbHV0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX251bV9jb21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX251bV9sYXllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKIHsKLSAgICAgICAgT1BKX1VJTlQzMiogcGFja2V0X2FycmF5OwotICAgICAgICBPUEpfVUlOVDMyIGluZGV4ICwgcmVzbm8sIGNvbXBubywgbGF5bm87Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgT1BKX1VJTlQzMiBzdGVwX2MgPSAxOwotICAgICAgICBPUEpfVUlOVDMyIHN0ZXBfciA9IHBfbnVtX2NvbXBzICogc3RlcF9jOwotICAgICAgICBPUEpfVUlOVDMyIHN0ZXBfbCA9IHBfbmJfcmVzb2x1dGlvbnMgKiBzdGVwX3I7Ci0gICAgICAgIE9QSl9CT09MIGxvc3MgPSBPUEpfRkFMU0U7Ci0gICAgICAgIE9QSl9VSU5UMzIgbGF5bm8wID0gMDsKKyAgICBPUEpfVUlOVDMyKiBwYWNrZXRfYXJyYXk7CisgICAgT1BKX1VJTlQzMiBpbmRleCwgcmVzbm8sIGNvbXBubywgbGF5bm87CisgICAgT1BKX1VJTlQzMiBpOworICAgIE9QSl9VSU5UMzIgc3RlcF9jID0gMTsKKyAgICBPUEpfVUlOVDMyIHN0ZXBfciA9IHBfbnVtX2NvbXBzICogc3RlcF9jOworICAgIE9QSl9VSU5UMzIgc3RlcF9sID0gcF9uYl9yZXNvbHV0aW9ucyAqIHN0ZXBfcjsKKyAgICBPUEpfQk9PTCBsb3NzID0gT1BKX0ZBTFNFOworICAgIE9QSl9VSU5UMzIgbGF5bm8wID0gMDsKIAotICAgICAgICBwYWNrZXRfYXJyYXkgPSAoT1BKX1VJTlQzMiopIG9wal9jYWxsb2Moc3RlcF9sICogcF9udW1fbGF5ZXJzLCBzaXplb2YoT1BKX1VJTlQzMikpOwotICAgICAgICBpZiAocGFja2V0X2FycmF5ID09IDAwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIgLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgY2hlY2tpbmcgdGhlIHBvYyB2YWx1ZXMuXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgcGFja2V0X2FycmF5ID0gKE9QSl9VSU5UMzIqKSBvcGpfY2FsbG9jKHN0ZXBfbCAqIHBfbnVtX2xheWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKE9QSl9VSU5UMzIpKTsKKyAgICBpZiAocGFja2V0X2FycmF5ID09IDAwKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBjaGVja2luZyB0aGUgcG9jIHZhbHVlcy5cbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICBpZiAocF9uYl9wb2NzID09IDApIHsKKyAgICBpZiAocF9uYl9wb2NzID09IDApIHsKICAgICAgICAgb3BqX2ZyZWUocGFja2V0X2FycmF5KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICB9CisKKyAgICBpbmRleCA9IHN0ZXBfciAqIHBfcG9jcy0+cmVzbm8wOworICAgIC8qIHRha2UgZWFjaCByZXNvbHV0aW9uIGZvciBlYWNoIHBvYyAqLworICAgIGZvciAocmVzbm8gPSBwX3BvY3MtPnJlc25vMCA7IHJlc25vIDwgcF9wb2NzLT5yZXNubzEgOyArK3Jlc25vKSB7CisgICAgICAgIE9QSl9VSU5UMzIgcmVzX2luZGV4ID0gaW5kZXggKyBwX3BvY3MtPmNvbXBubzAgKiBzdGVwX2M7CisKKyAgICAgICAgLyogdGFrZSBlYWNoIGNvbXAgb2YgZWFjaCByZXNvbHV0aW9uIGZvciBlYWNoIHBvYyAqLworICAgICAgICBmb3IgKGNvbXBubyA9IHBfcG9jcy0+Y29tcG5vMCA7IGNvbXBubyA8IHBfcG9jcy0+Y29tcG5vMSA7ICsrY29tcG5vKSB7CisgICAgICAgICAgICBPUEpfVUlOVDMyIGNvbXBfaW5kZXggPSByZXNfaW5kZXggKyBsYXlubzAgKiBzdGVwX2w7CisKKyAgICAgICAgICAgIC8qIGFuZCBmaW5hbGx5IHRha2UgZWFjaCBsYXllciBvZiBlYWNoIHJlcyBvZiAuLi4gKi8KKyAgICAgICAgICAgIGZvciAobGF5bm8gPSBsYXlubzA7IGxheW5vIDwgcF9wb2NzLT5sYXlubzEgOyArK2xheW5vKSB7CisgICAgICAgICAgICAgICAgLyppbmRleCA9IHN0ZXBfciAqIHJlc25vICsgc3RlcF9jICogY29tcG5vICsgc3RlcF9sICogbGF5bm87Ki8KKyAgICAgICAgICAgICAgICBwYWNrZXRfYXJyYXlbY29tcF9pbmRleF0gPSAxOworICAgICAgICAgICAgICAgIGNvbXBfaW5kZXggKz0gc3RlcF9sOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXNfaW5kZXggKz0gc3RlcF9jOwogICAgICAgICB9CiAKKyAgICAgICAgaW5kZXggKz0gc3RlcF9yOworICAgIH0KKyAgICArK3BfcG9jczsKKworICAgIC8qIGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIHBvY3MgKi8KKyAgICBmb3IgKGkgPSAxOyBpIDwgcF9uYl9wb2NzIDsgKytpKSB7CisgICAgICAgIE9QSl9VSU5UMzIgbF9sYXN0X2xheW5vMSA9IChwX3BvY3MgLSAxKS0+bGF5bm8xIDsKKworICAgICAgICBsYXlubzAgPSAocF9wb2NzLT5sYXlubzEgPiBsX2xhc3RfbGF5bm8xKSA/IGxfbGFzdF9sYXlubzEgOiAwOwogICAgICAgICBpbmRleCA9IHN0ZXBfciAqIHBfcG9jcy0+cmVzbm8wOworCiAgICAgICAgIC8qIHRha2UgZWFjaCByZXNvbHV0aW9uIGZvciBlYWNoIHBvYyAqLwotICAgICAgICBmb3IgKHJlc25vID0gcF9wb2NzLT5yZXNubzAgOyByZXNubyA8IHBfcG9jcy0+cmVzbm8xIDsgKytyZXNubykKLSAgICAgICAgewotICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcmVzX2luZGV4ID0gaW5kZXggKyBwX3BvY3MtPmNvbXBubzAgKiBzdGVwX2M7CisgICAgICAgIGZvciAocmVzbm8gPSBwX3BvY3MtPnJlc25vMCA7IHJlc25vIDwgcF9wb2NzLT5yZXNubzEgOyArK3Jlc25vKSB7CisgICAgICAgICAgICBPUEpfVUlOVDMyIHJlc19pbmRleCA9IGluZGV4ICsgcF9wb2NzLT5jb21wbm8wICogc3RlcF9jOwogCi0gICAgICAgICAgICAgICAgLyogdGFrZSBlYWNoIGNvbXAgb2YgZWFjaCByZXNvbHV0aW9uIGZvciBlYWNoIHBvYyAqLwotICAgICAgICAgICAgICAgIGZvciAoY29tcG5vID0gcF9wb2NzLT5jb21wbm8wIDsgY29tcG5vIDwgcF9wb2NzLT5jb21wbm8xIDsgKytjb21wbm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY29tcF9pbmRleCA9IHJlc19pbmRleCArIGxheW5vMCAqIHN0ZXBfbDsKKyAgICAgICAgICAgIC8qIHRha2UgZWFjaCBjb21wIG9mIGVhY2ggcmVzb2x1dGlvbiBmb3IgZWFjaCBwb2MgKi8KKyAgICAgICAgICAgIGZvciAoY29tcG5vID0gcF9wb2NzLT5jb21wbm8wIDsgY29tcG5vIDwgcF9wb2NzLT5jb21wbm8xIDsgKytjb21wbm8pIHsKKyAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNvbXBfaW5kZXggPSByZXNfaW5kZXggKyBsYXlubzAgKiBzdGVwX2w7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCBmaW5hbGx5IHRha2UgZWFjaCBsYXllciBvZiBlYWNoIHJlcyBvZiAuLi4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGF5bm8gPSBsYXlubzA7IGxheW5vIDwgcF9wb2NzLT5sYXlubzEgOyArK2xheW5vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qaW5kZXggPSBzdGVwX3IgKiByZXNubyArIHN0ZXBfYyAqIGNvbXBubyArIHN0ZXBfbCAqIGxheW5vOyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldF9hcnJheVtjb21wX2luZGV4XSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBfaW5kZXggKz0gc3RlcF9sOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICByZXNfaW5kZXggKz0gc3RlcF9jOworICAgICAgICAgICAgICAgIC8qIGFuZCBmaW5hbGx5IHRha2UgZWFjaCBsYXllciBvZiBlYWNoIHJlcyBvZiAuLi4gKi8KKyAgICAgICAgICAgICAgICBmb3IgKGxheW5vID0gbGF5bm8wOyBsYXlubyA8IHBfcG9jcy0+bGF5bm8xIDsgKytsYXlubykgeworICAgICAgICAgICAgICAgICAgICAvKmluZGV4ID0gc3RlcF9yICogcmVzbm8gKyBzdGVwX2MgKiBjb21wbm8gKyBzdGVwX2wgKiBsYXlubzsqLworICAgICAgICAgICAgICAgICAgICBwYWNrZXRfYXJyYXlbY29tcF9pbmRleF0gPSAxOworICAgICAgICAgICAgICAgICAgICBjb21wX2luZGV4ICs9IHN0ZXBfbDsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpbmRleCArPSBzdGVwX3I7CisgICAgICAgICAgICAgICAgcmVzX2luZGV4ICs9IHN0ZXBfYzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW5kZXggKz0gc3RlcF9yOwogICAgICAgICB9CisKICAgICAgICAgKytwX3BvY3M7CisgICAgfQogCi0gICAgICAgIC8qIGl0ZXJhdGUgdGhyb3VnaCBhbGwgdGhlIHBvY3MgKi8KLSAgICAgICAgZm9yIChpID0gMTsgaSA8IHBfbmJfcG9jcyA7ICsraSkgewotICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbF9sYXN0X2xheW5vMSA9IChwX3BvY3MtMSktPmxheW5vMSA7Ci0KLSAgICAgICAgICAgICAgICBsYXlubzAgPSAocF9wb2NzLT5sYXlubzEgPiBsX2xhc3RfbGF5bm8xKT8gbF9sYXN0X2xheW5vMSA6IDA7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBzdGVwX3IgKiBwX3BvY3MtPnJlc25vMDsKLQotICAgICAgICAgICAgICAgIC8qIHRha2UgZWFjaCByZXNvbHV0aW9uIGZvciBlYWNoIHBvYyAqLwotICAgICAgICAgICAgICAgIGZvciAocmVzbm8gPSBwX3BvY3MtPnJlc25vMCA7IHJlc25vIDwgcF9wb2NzLT5yZXNubzEgOyArK3Jlc25vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHJlc19pbmRleCA9IGluZGV4ICsgcF9wb2NzLT5jb21wbm8wICogc3RlcF9jOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiB0YWtlIGVhY2ggY29tcCBvZiBlYWNoIHJlc29sdXRpb24gZm9yIGVhY2ggcG9jICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbXBubyA9IHBfcG9jcy0+Y29tcG5vMCA7IGNvbXBubyA8IHBfcG9jcy0+Y29tcG5vMSA7ICsrY29tcG5vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY29tcF9pbmRleCA9IHJlc19pbmRleCArIGxheW5vMCAqIHN0ZXBfbDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmQgZmluYWxseSB0YWtlIGVhY2ggbGF5ZXIgb2YgZWFjaCByZXMgb2YgLi4uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGF5bm8gPSBsYXlubzA7IGxheW5vIDwgcF9wb2NzLT5sYXlubzEgOyArK2xheW5vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppbmRleCA9IHN0ZXBfciAqIHJlc25vICsgc3RlcF9jICogY29tcG5vICsgc3RlcF9sICogbGF5bm87Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZXRfYXJyYXlbY29tcF9pbmRleF0gPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBfaW5kZXggKz0gc3RlcF9sOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzX2luZGV4ICs9IHN0ZXBfYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gc3RlcF9yOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICsrcF9wb2NzOworICAgIGluZGV4ID0gMDsKKyAgICBmb3IgKGxheW5vID0gMDsgbGF5bm8gPCBwX251bV9sYXllcnMgOyArK2xheW5vKSB7CisgICAgICAgIGZvciAocmVzbm8gPSAwOyByZXNubyA8IHBfbmJfcmVzb2x1dGlvbnM7ICsrcmVzbm8pIHsKKyAgICAgICAgICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgcF9udW1fY29tcHM7ICsrY29tcG5vKSB7CisgICAgICAgICAgICAgICAgbG9zcyB8PSAocGFja2V0X2FycmF5W2luZGV4XSAhPSAxKTsKKyAgICAgICAgICAgICAgICAvKmluZGV4ID0gc3RlcF9yICogcmVzbm8gKyBzdGVwX2MgKiBjb21wbm8gKyBzdGVwX2wgKiBsYXlubzsqLworICAgICAgICAgICAgICAgIGluZGV4ICs9IHN0ZXBfYzsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgIH0KIAotICAgICAgICBpbmRleCA9IDA7Ci0gICAgICAgIGZvciAobGF5bm8gPSAwOyBsYXlubyA8IHBfbnVtX2xheWVycyA7ICsrbGF5bm8pIHsKLSAgICAgICAgICAgICAgICBmb3IgKHJlc25vID0gMDsgcmVzbm8gPCBwX25iX3Jlc29sdXRpb25zOyArK3Jlc25vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHBfbnVtX2NvbXBzOyArK2NvbXBubykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3NzIHw9IChwYWNrZXRfYXJyYXlbaW5kZXhdIT0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppbmRleCA9IHN0ZXBfciAqIHJlc25vICsgc3RlcF9jICogY29tcG5vICsgc3RlcF9sICogbGF5bm87Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gc3RlcF9jOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIGlmIChsb3NzKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJNaXNzaW5nIHBhY2tldHMgcG9zc2libGUgbG9zcyBvZiBkYXRhXG4iKTsKKyAgICB9CiAKLSAgICAgICAgaWYgKGxvc3MpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciAsIEVWVF9FUlJPUiwgIk1pc3NpbmcgcGFja2V0cyBwb3NzaWJsZSBsb3NzIG9mIGRhdGFcbiIpOwotICAgICAgICB9CisgICAgb3BqX2ZyZWUocGFja2V0X2FycmF5KTsKIAotICAgICAgICBvcGpfZnJlZShwYWNrZXRfYXJyYXkpOwotCi0gICAgICAgIHJldHVybiAhbG9zczsKKyAgICByZXR1cm4gIWxvc3M7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBPUEpfVUlOVDMyIG9wal9qMmtfZ2V0X251bV90cChvcGpfY3BfdCAqY3AsIE9QSl9VSU5UMzIgcGlubywgT1BKX1VJTlQzMiB0aWxlbm8pCitzdGF0aWMgT1BKX1VJTlQzMiBvcGpfajJrX2dldF9udW1fdHAob3BqX2NwX3QgKmNwLCBPUEpfVUlOVDMyIHBpbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlbm8pCiB7Ci0gICAgICAgIGNvbnN0IE9QSl9DSEFSICpwcm9nID0gMDA7Ci0gICAgICAgIE9QSl9JTlQzMiBpOwotICAgICAgICBPUEpfVUlOVDMyIHRwbnVtID0gMTsKLSAgICAgICAgb3BqX3RjcF90ICp0Y3AgPSAwMDsKLSAgICAgICAgb3BqX3BvY190ICogbF9jdXJyZW50X3BvYyA9IDAwOworICAgIGNvbnN0IE9QSl9DSEFSICpwcm9nID0gMDA7CisgICAgT1BKX0lOVDMyIGk7CisgICAgT1BKX1VJTlQzMiB0cG51bSA9IDE7CisgICAgb3BqX3RjcF90ICp0Y3AgPSAwMDsKKyAgICBvcGpfcG9jX3QgKiBsX2N1cnJlbnRfcG9jID0gMDA7CiAKLSAgICAgICAgLyogIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHRpbGVubyA8IChjcC0+dHcgKiBjcC0+dGgpKTsKLSAgICAgICAgYXNzZXJ0KHBpbm8gPCAoY3AtPnRjcHNbdGlsZW5vXS5udW1wb2NzICsgMSkpOworICAgIC8qICBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHRpbGVubyA8IChjcC0+dHcgKiBjcC0+dGgpKTsKKyAgICBhc3NlcnQocGlubyA8IChjcC0+dGNwc1t0aWxlbm9dLm51bXBvY3MgKyAxKSk7CiAKLSAgICAgICAgLyogZ2V0IHRoZSBnaXZlbiB0aWxlIGNvZGluZyBwYXJhbWV0ZXIgKi8KLSAgICAgICAgdGNwID0gJmNwLT50Y3BzW3RpbGVub107Ci0gICAgICAgIGFzc2VydCh0Y3AgIT0gMDApOworICAgIC8qIGdldCB0aGUgZ2l2ZW4gdGlsZSBjb2RpbmcgcGFyYW1ldGVyICovCisgICAgdGNwID0gJmNwLT50Y3BzW3RpbGVub107CisgICAgYXNzZXJ0KHRjcCAhPSAwMCk7CiAKLSAgICAgICAgbF9jdXJyZW50X3BvYyA9ICYodGNwLT5wb2NzW3Bpbm9dKTsKLSAgICAgICAgYXNzZXJ0KGxfY3VycmVudF9wb2MgIT0gMCk7CisgICAgbF9jdXJyZW50X3BvYyA9ICYodGNwLT5wb2NzW3Bpbm9dKTsKKyAgICBhc3NlcnQobF9jdXJyZW50X3BvYyAhPSAwKTsKIAotICAgICAgICAvKiBnZXQgdGhlIHByb2dyZXNzaW9uIG9yZGVyIGFzIGEgY2hhcmFjdGVyIHN0cmluZyAqLwotICAgICAgICBwcm9nID0gb3BqX2oya19jb252ZXJ0X3Byb2dyZXNzaW9uX29yZGVyKHRjcC0+cHJnKTsKLSAgICAgICAgYXNzZXJ0KHN0cmxlbihwcm9nKSA+IDApOworICAgIC8qIGdldCB0aGUgcHJvZ3Jlc3Npb24gb3JkZXIgYXMgYSBjaGFyYWN0ZXIgc3RyaW5nICovCisgICAgcHJvZyA9IG9wal9qMmtfY29udmVydF9wcm9ncmVzc2lvbl9vcmRlcih0Y3AtPnByZyk7CisgICAgYXNzZXJ0KHN0cmxlbihwcm9nKSA+IDApOwogCi0gICAgICAgIGlmIChjcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX3RwX29uID09IDEpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGk9MDtpPDQ7KytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHByb2dbaV0pCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXBvbmVudCB3aXNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0MnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwbnVtICo9IGxfY3VycmVudF9wb2MtPmNvbXBFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXNvbHV0aW9uIHdpc2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnUic6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBudW0gKj0gbF9jdXJyZW50X3BvYy0+cmVzRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcHJlY2luY3Qgd2lzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdQJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cG51bSAqPSBsX2N1cnJlbnRfcG9jLT5wcmNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsYXllciB3aXNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0wnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwbnVtICo9IGxfY3VycmVudF9wb2MtPmxheUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3aG91bGQgd2Ugc3BsaXQgaGVyZSA/ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fdHBfZmxhZyA9PSBwcm9nW2ldICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX3RwX3Bvcz1pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisgICAgaWYgKGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fdHBfb24gPT0gMSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHByb2dbaV0pIHsKKyAgICAgICAgICAgIC8qIGNvbXBvbmVudCB3aXNlICovCisgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgICAgICB0cG51bSAqPSBsX2N1cnJlbnRfcG9jLT5jb21wRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8qIHJlc29sdXRpb24gd2lzZSAqLworICAgICAgICAgICAgY2FzZSAnUic6CisgICAgICAgICAgICAgICAgdHBudW0gKj0gbF9jdXJyZW50X3BvYy0+cmVzRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8qIHByZWNpbmN0IHdpc2UgKi8KKyAgICAgICAgICAgIGNhc2UgJ1AnOgorICAgICAgICAgICAgICAgIHRwbnVtICo9IGxfY3VycmVudF9wb2MtPnByY0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvKiBsYXllciB3aXNlICovCisgICAgICAgICAgICBjYXNlICdMJzoKKyAgICAgICAgICAgICAgICB0cG51bSAqPSBsX2N1cnJlbnRfcG9jLT5sYXlFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogd2hvdWxkIHdlIHNwbGl0IGhlcmUgPyAqLworICAgICAgICAgICAgaWYgKGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fdHBfZmxhZyA9PSBwcm9nW2ldKSB7CisgICAgICAgICAgICAgICAgY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV90cF9wb3MgPSBpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHRwbnVtPTE7Ci0gICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB0cG51bSA9IDE7CisgICAgfQogCi0gICAgICAgIHJldHVybiB0cG51bTsKKyAgICByZXR1cm4gdHBudW07CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2NhbGN1bGF0ZV90cCggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jcF90ICpjcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbmJfdGlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90ICppbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2NhbGN1bGF0ZV90cChvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jcF90ICpjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9uYl90aWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0gICAgICAgIE9QSl9VSU5UMzIgcGlubyx0aWxlbm87Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl90aWxlczsKLSAgICAgICAgb3BqX3RjcF90ICp0Y3A7CisgICAgT1BKX1VJTlQzMiBwaW5vLCB0aWxlbm87CisgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzOworICAgIG9wal90Y3BfdCAqdGNwOwogCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfbmJfdGlsZXMgIT0gMDApOwotICAgICAgICBhc3NlcnQoY3AgIT0gMDApOwotICAgICAgICBhc3NlcnQoaW1hZ2UgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfbmJfdGlsZXMgIT0gMDApOworICAgIGFzc2VydChjcCAhPSAwMCk7CisgICAgYXNzZXJ0KGltYWdlICE9IDAwKTsKKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0gICAgICAgIGxfbmJfdGlsZXMgPSBjcC0+dHcgKiBjcC0+dGg7Ci0gICAgICAgICogcF9uYl90aWxlcyA9IDA7Ci0gICAgICAgIHRjcCA9IGNwLT50Y3BzOworICAgIE9QSl9VTlVTRUQocF9qMmspOworICAgIE9QSl9VTlVTRUQocF9tYW5hZ2VyKTsKIAotICAgICAgICAvKiBJTkRFWCA+PiAqLwotICAgICAgICAvKiBUT0RPIG1lcmdlVjI6IGNoZWNrIHRoaXMgcGFydCB3aGljaCB1c2UgY3N0cl9pbmZvICovCi0gICAgICAgIC8qaWYgKHBfajJrLT5jc3RyX2luZm8pIHsKLSAgICAgICAgICAgICAgICBvcGpfdGlsZV9pbmZvX3QgKiBsX2luZm9fdGlsZV9wdHIgPSBwX2oyay0+Y3N0cl9pbmZvLT50aWxlOworICAgIGxfbmJfdGlsZXMgPSBjcC0+dHcgKiBjcC0+dGg7CisgICAgKiBwX25iX3RpbGVzID0gMDsKKyAgICB0Y3AgPSBjcC0+dGNwczsKIAotICAgICAgICAgICAgICAgIGZvciAodGlsZW5vID0gMDsgdGlsZW5vIDwgbF9uYl90aWxlczsgKyt0aWxlbm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY3VyX3RvdG51bV90cCA9IDA7CisgICAgLyogSU5ERVggPj4gKi8KKyAgICAvKiBUT0RPIG1lcmdlVjI6IGNoZWNrIHRoaXMgcGFydCB3aGljaCB1c2UgY3N0cl9pbmZvICovCisgICAgLyppZiAocF9qMmstPmNzdHJfaW5mbykgeworICAgICAgICAgICAgb3BqX3RpbGVfaW5mb190ICogbF9pbmZvX3RpbGVfcHRyID0gcF9qMmstPmNzdHJfaW5mby0+dGlsZTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX3VwZGF0ZV9lbmNvZGluZ19wYXJhbWV0ZXJzKGltYWdlLGNwLHRpbGVubyk7CisgICAgICAgICAgICBmb3IgKHRpbGVubyA9IDA7IHRpbGVubyA8IGxfbmJfdGlsZXM7ICsrdGlsZW5vKSB7CisgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY3VyX3RvdG51bV90cCA9IDA7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocGlubyA9IDA7IHBpbm8gPD0gdGNwLT5udW1wb2NzOyArK3Bpbm8pCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdHBfbnVtID0gb3BqX2oya19nZXRfbnVtX3RwKGNwLHBpbm8sdGlsZW5vKTsKKyAgICAgICAgICAgICAgICAgICAgb3BqX3BpX3VwZGF0ZV9lbmNvZGluZ19wYXJhbWV0ZXJzKGltYWdlLGNwLHRpbGVubyk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbmJfdGlsZXMgPSAqcF9uYl90aWxlcyArIHRwX251bTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChwaW5vID0gMDsgcGlubyA8PSB0Y3AtPm51bXBvY3M7ICsrcGlubykKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdHBfbnVtID0gb3BqX2oya19nZXRfbnVtX3RwKGNwLHBpbm8sdGlsZW5vKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfdG90bnVtX3RwICs9IHRwX251bTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9uYl90aWxlcyA9ICpwX25iX3RpbGVzICsgdHBfbnVtOwogCi0gICAgICAgICAgICAgICAgICAgICAgICB0Y3AtPm1fbmJfdGlsZV9wYXJ0cyA9IGN1cl90b3RudW1fdHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3RvdG51bV90cCArPSB0cF9udW07CisgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgbF9pbmZvX3RpbGVfcHRyLT50cCA9IChvcGpfdHBfaW5mb190ICopIG9wal9tYWxsb2MoY3VyX3RvdG51bV90cCAqIHNpemVvZihvcGpfdHBfaW5mb190KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9pbmZvX3RpbGVfcHRyLT50cCA9PSAwMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0Y3AtPm1fbmJfdGlsZV9wYXJ0cyA9IGN1cl90b3RudW1fdHA7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChsX2luZm9fdGlsZV9wdHItPnRwLDAsY3VyX3RvdG51bV90cCAqIHNpemVvZihvcGpfdHBfaW5mb190KSk7CisgICAgICAgICAgICAgICAgICAgIGxfaW5mb190aWxlX3B0ci0+dHAgPSAob3BqX3RwX2luZm9fdCAqKSBvcGpfbWFsbG9jKGN1cl90b3RudW1fdHAgKiBzaXplb2Yob3BqX3RwX2luZm9fdCkpOworICAgICAgICAgICAgICAgICAgICBpZiAobF9pbmZvX3RpbGVfcHRyLT50cCA9PSAwMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgbF9pbmZvX3RpbGVfcHRyLT5udW1fdHBzID0gY3VyX3RvdG51bV90cDsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGxfaW5mb190aWxlX3B0ci0+dHAsMCxjdXJfdG90bnVtX3RwICogc2l6ZW9mKG9wal90cF9pbmZvX3QpKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgKytsX2luZm9fdGlsZV9wdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICArK3RjcDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxfaW5mb190aWxlX3B0ci0+bnVtX3RwcyA9IGN1cl90b3RudW1fdHA7CisKKyAgICAgICAgICAgICAgICAgICAgKytsX2luZm9fdGlsZV9wdHI7CisgICAgICAgICAgICAgICAgICAgICsrdGNwOworICAgICAgICAgICAgfQorICAgIH0KKyAgICBlbHNlICoveworICAgICAgICBmb3IgKHRpbGVubyA9IDA7IHRpbGVubyA8IGxfbmJfdGlsZXM7ICsrdGlsZW5vKSB7CisgICAgICAgICAgICBPUEpfVUlOVDMyIGN1cl90b3RudW1fdHAgPSAwOworCisgICAgICAgICAgICBvcGpfcGlfdXBkYXRlX2VuY29kaW5nX3BhcmFtZXRlcnMoaW1hZ2UsIGNwLCB0aWxlbm8pOworCisgICAgICAgICAgICBmb3IgKHBpbm8gPSAwOyBwaW5vIDw9IHRjcC0+bnVtcG9jczsgKytwaW5vKSB7CisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0cF9udW0gPSBvcGpfajJrX2dldF9udW1fdHAoY3AsIHBpbm8sIHRpbGVubyk7CisKKyAgICAgICAgICAgICAgICAqcF9uYl90aWxlcyA9ICpwX25iX3RpbGVzICsgdHBfbnVtOworCisgICAgICAgICAgICAgICAgY3VyX3RvdG51bV90cCArPSB0cF9udW07CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0Y3AtPm1fbmJfdGlsZV9wYXJ0cyA9IGN1cl90b3RudW1fdHA7CisKKyAgICAgICAgICAgICsrdGNwOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UgKi97Ci0gICAgICAgICAgICAgICAgZm9yICh0aWxlbm8gPSAwOyB0aWxlbm8gPCBsX25iX3RpbGVzOyArK3RpbGVubykgewotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjdXJfdG90bnVtX3RwID0gMDsKKyAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9waV91cGRhdGVfZW5jb2RpbmdfcGFyYW1ldGVycyhpbWFnZSxjcCx0aWxlbm8pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHBpbm8gPSAwOyBwaW5vIDw9IHRjcC0+bnVtcG9jczsgKytwaW5vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdHBfbnVtID0gb3BqX2oya19nZXRfbnVtX3RwKGNwLHBpbm8sdGlsZW5vKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9uYl90aWxlcyA9ICpwX25iX3RpbGVzICsgdHBfbnVtOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cl90b3RudW1fdHAgKz0gdHBfbnVtOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5tX25iX3RpbGVfcGFydHMgPSBjdXJfdG90bnVtX3RwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICArK3RjcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9zb2MoICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9zb2Mob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQogewotICAgICAgICAvKiAyIGJ5dGVzIHdpbGwgYmUgd3JpdHRlbiAqLwotICAgICAgICBPUEpfQllURSAqIGxfc3RhcnRfc3RyZWFtID0gMDA7CisgICAgLyogMiBieXRlcyB3aWxsIGJlIHdyaXR0ZW4gKi8KKyAgICBPUEpfQllURSAqIGxfc3RhcnRfc3RyZWFtID0gMDA7CiAKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0gICAgICAgIGxfc3RhcnRfc3RyZWFtID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YTsKKyAgICBsX3N0YXJ0X3N0cmVhbSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGE7CiAKLSAgICAgICAgLyogd3JpdGUgU09DIGlkZW50aWZpZXIgKi8KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfc3RhcnRfc3RyZWFtLEoyS19NU19TT0MsMik7CisgICAgLyogd3JpdGUgU09DIGlkZW50aWZpZXIgKi8KKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9zdGFydF9zdHJlYW0sIEoyS19NU19TT0MsIDIpOwogCi0gICAgICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0sbF9zdGFydF9zdHJlYW0sMixwX21hbmFnZXIpICE9IDIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSwgbF9zdGFydF9zdHJlYW0sIDIsIHBfbWFuYWdlcikgIT0gMikgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotLyogVW5pUEc+PiAqLworICAgIC8qIFVuaVBHPj4gKi8KICNpZmRlZiBVU0VfSlBXTAotICAgICAgICAvKiB1cGRhdGUgbWFya2VycyBzdHJ1Y3QgKi8KLS8qCi0gICAgICAgIE9QSl9CT09MIHJlcyA9IGoya19hZGRfbWFya2VyKHBfajJrLT5jc3RyX2luZm8sIEoyS19NU19TT0MsIHBfc3RyZWFtX3RlbGwocF9zdHJlYW0pIC0gMiwgMik7Ci0qLwotICBhc3NlcnQoIDAgJiYgIlRPRE8iICk7CisgICAgLyogdXBkYXRlIG1hcmtlcnMgc3RydWN0ICovCisgICAgLyoKKyAgICAgICAgICAgIE9QSl9CT09MIHJlcyA9IGoya19hZGRfbWFya2VyKHBfajJrLT5jc3RyX2luZm8sIEoyS19NU19TT0MsIHBfc3RyZWFtX3RlbGwocF9zdHJlYW0pIC0gMiwgMik7CisgICAgKi8KKyAgICBhc3NlcnQoMCAmJiAiVE9ETyIpOwogI2VuZGlmIC8qIFVTRV9KUFdMICovCi0vKiA8PFVuaVBHICovCisgICAgLyogPDxVbmlQRyAqLwogCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKIC8qKgpAQCAtMTgxMSwxMzcgKzE4OTcsMTQzIEBACiAgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgICAgIEZJWE1FIERPQwogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfc29jKCAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfc29jKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewotICAgICAgICBPUEpfQllURSBsX2RhdGEgWzJdOwotICAgICAgICBPUEpfVUlOVDMyIGxfbWFya2VyOworICAgIE9QSl9CWVRFIGxfZGF0YSBbMl07CisgICAgT1BKX1VJTlQzMiBsX21hcmtlcjsKIAotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CiAKLSAgICAgICAgaWYgKG9wal9zdHJlYW1fcmVhZF9kYXRhKHBfc3RyZWFtLGxfZGF0YSwyLHBfbWFuYWdlcikgIT0gMikgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICBpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0sIGxfZGF0YSwgMiwgcF9tYW5hZ2VyKSAhPSAyKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKGxfZGF0YSwmbF9tYXJrZXIsMik7Ci0gICAgICAgIGlmIChsX21hcmtlciAhPSBKMktfTVNfU09DKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIG9wal9yZWFkX2J5dGVzKGxfZGF0YSwgJmxfbWFya2VyLCAyKTsKKyAgICBpZiAobF9tYXJrZXIgIT0gSjJLX01TX1NPQykgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICAvKiBOZXh0IG1hcmtlciBzaG91bGQgYmUgYSBTSVogbWFya2VyIGluIHRoZSBtYWluIGhlYWRlciAqLwotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9IEoyS19TVEFURV9NSFNJWjsKKyAgICAvKiBOZXh0IG1hcmtlciBzaG91bGQgYmUgYSBTSVogbWFya2VyIGluIHRoZSBtYWluIGhlYWRlciAqLworICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID0gSjJLX1NUQVRFX01IU0laOwogCi0gICAgICAgIC8qIEZJWE1FIG1vdmUgaXQgaW4gYSBpbmRleCBzdHJ1Y3R1cmUgaW5jbHVkZWQgaW4gcF9qMmsqLwotICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+bWFpbl9oZWFkX3N0YXJ0ID0gb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSAtIDI7CisgICAgLyogRklYTUUgbW92ZSBpdCBpbiBhIGluZGV4IHN0cnVjdHVyZSBpbmNsdWRlZCBpbiBwX2oyayovCisgICAgcF9qMmstPmNzdHJfaW5kZXgtPm1haW5faGVhZF9zdGFydCA9IG9wal9zdHJlYW1fdGVsbChwX3N0cmVhbSkgLSAyOwogCi0gICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfSU5GTywgIlN0YXJ0IHRvIHJlYWQgajJrIG1haW4gaGVhZGVyICglZCkuXG4iLCBwX2oyay0+Y3N0cl9pbmRleC0+bWFpbl9oZWFkX3N0YXJ0KTsKKyAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0lORk8sICJTdGFydCB0byByZWFkIGoyayBtYWluIGhlYWRlciAoJWQpLlxuIiwKKyAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT5tYWluX2hlYWRfc3RhcnQpOwogCi0gICAgICAgIC8qIEFkZCB0aGUgbWFya2VyIHRvIHRoZSBjb2Rlc3RyZWFtIGluZGV4Ki8KLSAgICAgICAgaWYgKE9QSl9GQUxTRSA9PSBvcGpfajJrX2FkZF9taG1hcmtlcihwX2oyay0+Y3N0cl9pbmRleCwgSjJLX01TX1NPQywgcF9qMmstPmNzdHJfaW5kZXgtPm1haW5faGVhZF9zdGFydCwgMikpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWRkIG1oIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgLyogQWRkIHRoZSBtYXJrZXIgdG8gdGhlIGNvZGVzdHJlYW0gaW5kZXgqLworICAgIGlmIChPUEpfRkFMU0UgPT0gb3BqX2oya19hZGRfbWhtYXJrZXIocF9qMmstPmNzdHJfaW5kZXgsIEoyS19NU19TT0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+bWFpbl9oZWFkX3N0YXJ0LCAyKSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWRkIG1oIG1hcmtlclxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfc2l6KCAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfc2l6KG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKIHsKLSAgICAgICAgT1BKX1VJTlQzMiBpOwotICAgICAgICBPUEpfVUlOVDMyIGxfc2l6ZV9sZW47Ci0gICAgICAgIE9QSl9CWVRFICogbF9jdXJyZW50X3B0cjsKLSAgICAgICAgb3BqX2ltYWdlX3QgKiBsX2ltYWdlID0gMDA7Ci0gICAgICAgIG9wal9jcF90ICpjcCA9IDAwOwotICAgICAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IDAwOworICAgIE9QSl9VSU5UMzIgaTsKKyAgICBPUEpfVUlOVDMyIGxfc2l6ZV9sZW47CisgICAgT1BKX0JZVEUgKiBsX2N1cnJlbnRfcHRyOworICAgIG9wal9pbWFnZV90ICogbF9pbWFnZSA9IDAwOworICAgIG9wal9jcF90ICpjcCA9IDAwOworICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gMDA7CiAKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0gICAgICAgIGxfaW1hZ2UgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlOwotICAgICAgICBjcCA9ICYocF9qMmstPm1fY3ApOwotICAgICAgICBsX3NpemVfbGVuID0gNDAgKyAzICogbF9pbWFnZS0+bnVtY29tcHM7Ci0gICAgICAgIGxfaW1nX2NvbXAgPSBsX2ltYWdlLT5jb21wczsKKyAgICBsX2ltYWdlID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZTsKKyAgICBjcCA9ICYocF9qMmstPm1fY3ApOworICAgIGxfc2l6ZV9sZW4gPSA0MCArIDMgKiBsX2ltYWdlLT5udW1jb21wczsKKyAgICBsX2ltZ19jb21wID0gbF9pbWFnZS0+Y29tcHM7CiAKLSAgICAgICAgaWYgKGxfc2l6ZV9sZW4gPiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUpIHsKKyAgICBpZiAobF9zaXplX2xlbiA+IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSkgewogCi0gICAgICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfdGlsZV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsIGxfc2l6ZV9sZW4pOwotICAgICAgICAgICAgICAgIGlmICghIG5ld19oZWFkZXJfdGlsZV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIFNJWiBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IG5ld19oZWFkZXJfdGlsZV9kYXRhOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IGxfc2l6ZV9sZW47CisgICAgICAgIE9QSl9CWVRFICpuZXdfaGVhZGVyX3RpbGVfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfcmVhbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsIGxfc2l6ZV9sZW4pOworICAgICAgICBpZiAoISBuZXdfaGVhZGVyX3RpbGVfZGF0YSkgeworICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSk7CisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gTlVMTDsKKyAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgZm9yIHRoZSBTSVogbWFya2VyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgICAgIH0KKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IG5ld19oZWFkZXJfdGlsZV9kYXRhOworICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSBsX3NpemVfbGVuOworICAgIH0KIAotICAgICAgICBsX2N1cnJlbnRfcHRyID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YTsKKyAgICBsX2N1cnJlbnRfcHRyID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YTsKIAotICAgICAgICAvKiB3cml0ZSBTT0MgaWRlbnRpZmllciAqLwotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X3B0cixKMktfTVNfU0laLDIpOyAgICAvKiBTSVogKi8KLSAgICAgICAgbF9jdXJyZW50X3B0cis9MjsKKyAgICAvKiB3cml0ZSBTT0MgaWRlbnRpZmllciAqLworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLCBKMktfTVNfU0laLCAyKTsgIC8qIFNJWiAqLworICAgIGxfY3VycmVudF9wdHIgKz0gMjsKIAotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X3B0cixsX3NpemVfbGVuLTIsMik7IC8qIExfU0laICovCi0gICAgICAgIGxfY3VycmVudF9wdHIrPTI7CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsIGxfc2l6ZV9sZW4gLSAyLCAyKTsgLyogTF9TSVogKi8KKyAgICBsX2N1cnJlbnRfcHRyICs9IDI7CiAKLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsIGNwLT5yc2l6LCAyKTsgICAgLyogUnNpeiAoY2FwYWJpbGl0aWVzKSAqLwotICAgICAgICBsX2N1cnJlbnRfcHRyKz0yOworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLCBjcC0+cnNpeiwgMik7ICAgIC8qIFJzaXogKGNhcGFiaWxpdGllcykgKi8KKyAgICBsX2N1cnJlbnRfcHRyICs9IDI7CiAKLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsIGxfaW1hZ2UtPngxLCA0KTsgLyogWHNpeiAqLwotICAgICAgICBsX2N1cnJlbnRfcHRyKz00OworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLCBsX2ltYWdlLT54MSwgNCk7IC8qIFhzaXogKi8KKyAgICBsX2N1cnJlbnRfcHRyICs9IDQ7CiAKLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsIGxfaW1hZ2UtPnkxLCA0KTsgLyogWXNpeiAqLwotICAgICAgICBsX2N1cnJlbnRfcHRyKz00OworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLCBsX2ltYWdlLT55MSwgNCk7IC8qIFlzaXogKi8KKyAgICBsX2N1cnJlbnRfcHRyICs9IDQ7CiAKLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsIGxfaW1hZ2UtPngwLCA0KTsgLyogWDBzaXogKi8KLSAgICAgICAgbF9jdXJyZW50X3B0cis9NDsKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X3B0ciwgbF9pbWFnZS0+eDAsIDQpOyAvKiBYMHNpeiAqLworICAgIGxfY3VycmVudF9wdHIgKz0gNDsKIAotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X3B0ciwgbF9pbWFnZS0+eTAsIDQpOyAvKiBZMHNpeiAqLwotICAgICAgICBsX2N1cnJlbnRfcHRyKz00OworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLCBsX2ltYWdlLT55MCwgNCk7IC8qIFkwc2l6ICovCisgICAgbF9jdXJyZW50X3B0ciArPSA0OwogCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLCBjcC0+dGR4LCA0KTsgICAgICAgICAgICAgLyogWFRzaXogKi8KLSAgICAgICAgbF9jdXJyZW50X3B0cis9NDsKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X3B0ciwgY3AtPnRkeCwgNCk7ICAgICAgICAgICAgIC8qIFhUc2l6ICovCisgICAgbF9jdXJyZW50X3B0ciArPSA0OwogCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLCBjcC0+dGR5LCA0KTsgICAgICAgICAgICAgLyogWVRzaXogKi8KLSAgICAgICAgbF9jdXJyZW50X3B0cis9NDsKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X3B0ciwgY3AtPnRkeSwgNCk7ICAgICAgICAgICAgIC8qIFlUc2l6ICovCisgICAgbF9jdXJyZW50X3B0ciArPSA0OwogCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLCBjcC0+dHgwLCA0KTsgICAgICAgICAgICAgLyogWFQwc2l6ICovCi0gICAgICAgIGxfY3VycmVudF9wdHIrPTQ7CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsIGNwLT50eDAsIDQpOyAgICAgICAgICAgICAvKiBYVDBzaXogKi8KKyAgICBsX2N1cnJlbnRfcHRyICs9IDQ7CiAKLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsIGNwLT50eTAsIDQpOyAgICAgICAgICAgICAvKiBZVDBzaXogKi8KLSAgICAgICAgbF9jdXJyZW50X3B0cis9NDsKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X3B0ciwgY3AtPnR5MCwgNCk7ICAgICAgICAgICAgIC8qIFlUMHNpeiAqLworICAgIGxfY3VycmVudF9wdHIgKz0gNDsKIAotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X3B0ciwgbF9pbWFnZS0+bnVtY29tcHMsIDIpOyAgIC8qIENzaXogKi8KLSAgICAgICAgbF9jdXJyZW50X3B0cis9MjsKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X3B0ciwgbF9pbWFnZS0+bnVtY29tcHMsIDIpOyAgIC8qIENzaXogKi8KKyAgICBsX2N1cnJlbnRfcHRyICs9IDI7CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IGxfaW1hZ2UtPm51bWNvbXBzOyArK2kpIHsKLSAgICAgICAgICAgICAgICAvKiBUT0RPIGhlcmUgd2l0aCBNQ1QgPyAqLwotICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLCBsX2ltZ19jb21wLT5wcmVjIC0gMSArIChsX2ltZ19jb21wLT5zZ25kIDw8IDcpLCAxKTsgICAgICAvKiBTc2l6X2kgKi8KLSAgICAgICAgICAgICAgICArK2xfY3VycmVudF9wdHI7CisgICAgZm9yIChpID0gMDsgaSA8IGxfaW1hZ2UtPm51bWNvbXBzOyArK2kpIHsKKyAgICAgICAgLyogVE9ETyBoZXJlIHdpdGggTUNUID8gKi8KKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsIGxfaW1nX2NvbXAtPnByZWMgLSAxICsgKGxfaW1nX2NvbXAtPnNnbmQgPDwgNyksCisgICAgICAgICAgICAgICAgICAgICAgICAxKTsgICAgICAvKiBTc2l6X2kgKi8KKyAgICAgICAgKytsX2N1cnJlbnRfcHRyOwogCi0gICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsIGxfaW1nX2NvbXAtPmR4LCAxKTsgICAgICAvKiBYUnNpel9pICovCi0gICAgICAgICAgICAgICAgKytsX2N1cnJlbnRfcHRyOworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X3B0ciwgbF9pbWdfY29tcC0+ZHgsIDEpOyAgICAgIC8qIFhSc2l6X2kgKi8KKyAgICAgICAgKytsX2N1cnJlbnRfcHRyOwogCi0gICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsIGxfaW1nX2NvbXAtPmR5LCAxKTsgICAgICAvKiBZUnNpel9pICovCi0gICAgICAgICAgICAgICAgKytsX2N1cnJlbnRfcHRyOworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X3B0ciwgbF9pbWdfY29tcC0+ZHksIDEpOyAgICAgIC8qIFlSc2l6X2kgKi8KKyAgICAgICAgKytsX2N1cnJlbnRfcHRyOwogCi0gICAgICAgICAgICAgICAgKytsX2ltZ19jb21wOwotICAgICAgICB9CisgICAgICAgICsrbF9pbWdfY29tcDsKKyAgICB9CiAKLSAgICAgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLGxfc2l6ZV9sZW4scF9tYW5hZ2VyKSAhPSBsX3NpemVfbGVuKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCBsX3NpemVfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSAhPSBsX3NpemVfbGVuKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKIC8qKgpAQCAtMTk1NSwxMTMgKzIwNDcsMTM3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9jb21wOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfY29tcF9yZW1haW47Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9yZW1haW5pbmdfc2l6ZTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzOwotICAgICAgICBPUEpfVUlOVDMyIGxfdG1wLCBsX3R4MSwgbF90eTE7Ci0gICAgICAgIG9wal9pbWFnZV90ICpsX2ltYWdlID0gMDA7Ci0gICAgICAgIG9wal9jcF90ICpsX2NwID0gMDA7Ci0gICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gMDA7Ci0gICAgICAgIG9wal90Y3BfdCAqIGxfY3VycmVudF90aWxlX3BhcmFtID0gMDA7CisgICAgT1BKX1VJTlQzMiBpOworICAgIE9QSl9VSU5UMzIgbF9uYl9jb21wOworICAgIE9QSl9VSU5UMzIgbF9uYl9jb21wX3JlbWFpbjsKKyAgICBPUEpfVUlOVDMyIGxfcmVtYWluaW5nX3NpemU7CisgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzOworICAgIE9QSl9VSU5UMzIgbF90bXAsIGxfdHgxLCBsX3R5MTsKKyAgICBPUEpfVUlOVDMyIGxfcHJlYzAsIGxfc2duZDA7CisgICAgb3BqX2ltYWdlX3QgKmxfaW1hZ2UgPSAwMDsKKyAgICBvcGpfY3BfdCAqbF9jcCA9IDAwOworICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gMDA7CisgICAgb3BqX3RjcF90ICogbF9jdXJyZW50X3RpbGVfcGFyYW0gPSAwMDsKIAotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOwogCi0gICAgICAgIGxfaW1hZ2UgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlOwotICAgICAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7CisgICAgbF9pbWFnZSA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2U7CisgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOwogCi0gICAgICAgIC8qIG1pbmltdW0gc2l6ZSA9PSAzOSAtIDMgKD0gbWluaW11bSBjb21wb25lbnQgcGFyYW1ldGVyKSAqLwotICAgICAgICBpZiAocF9oZWFkZXJfc2l6ZSA8IDM2KSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdpdGggU0laIG1hcmtlciBzaXplXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIC8qIG1pbmltdW0gc2l6ZSA9PSAzOSAtIDMgKD0gbWluaW11bSBjb21wb25lbnQgcGFyYW1ldGVyKSAqLworICAgIGlmIChwX2hlYWRlcl9zaXplIDwgMzYpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdpdGggU0laIG1hcmtlciBzaXplXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICBsX3JlbWFpbmluZ19zaXplID0gcF9oZWFkZXJfc2l6ZSAtIDM2OworICAgIGxfbmJfY29tcCA9IGxfcmVtYWluaW5nX3NpemUgLyAzOworICAgIGxfbmJfY29tcF9yZW1haW4gPSBsX3JlbWFpbmluZ19zaXplICUgMzsKKyAgICBpZiAobF9uYl9jb21wX3JlbWFpbiAhPSAwKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3aXRoIFNJWiBtYXJrZXIgc2l6ZVxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgJmxfdG1wLAorICAgICAgICAgICAgICAgICAgIDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJzaXogKGNhcGFiaWxpdGllcykgKi8KKyAgICBwX2hlYWRlcl9kYXRhICs9IDI7CisgICAgbF9jcC0+cnNpeiA9IChPUEpfVUlOVDE2KSBsX3RtcDsKKyAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAoT1BKX1VJTlQzMiopICZsX2ltYWdlLT54MSwgNCk7ICAgLyogWHNpeiAqLworICAgIHBfaGVhZGVyX2RhdGEgKz0gNDsKKyAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAoT1BKX1VJTlQzMiopICZsX2ltYWdlLT55MSwgNCk7ICAgLyogWXNpeiAqLworICAgIHBfaGVhZGVyX2RhdGEgKz0gNDsKKyAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAoT1BKX1VJTlQzMiopICZsX2ltYWdlLT54MCwgNCk7ICAgLyogWDBzaXogKi8KKyAgICBwX2hlYWRlcl9kYXRhICs9IDQ7CisgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgKE9QSl9VSU5UMzIqKSAmbF9pbWFnZS0+eTAsIDQpOyAgIC8qIFkwc2l6ICovCisgICAgcF9oZWFkZXJfZGF0YSArPSA0OworICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsIChPUEpfVUlOVDMyKikgJmxfY3AtPnRkeCwKKyAgICAgICAgICAgICAgICAgICA0KTsgICAgICAgICAgICAgLyogWFRzaXogKi8KKyAgICBwX2hlYWRlcl9kYXRhICs9IDQ7CisgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgKE9QSl9VSU5UMzIqKSAmbF9jcC0+dGR5LAorICAgICAgICAgICAgICAgICAgIDQpOyAgICAgICAgICAgICAvKiBZVHNpeiAqLworICAgIHBfaGVhZGVyX2RhdGEgKz0gNDsKKyAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAoT1BKX1VJTlQzMiopICZsX2NwLT50eDAsCisgICAgICAgICAgICAgICAgICAgNCk7ICAgICAgICAgICAgIC8qIFhUMHNpeiAqLworICAgIHBfaGVhZGVyX2RhdGEgKz0gNDsKKyAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAoT1BKX1VJTlQzMiopICZsX2NwLT50eTAsCisgICAgICAgICAgICAgICAgICAgNCk7ICAgICAgICAgICAgIC8qIFlUMHNpeiAqLworICAgIHBfaGVhZGVyX2RhdGEgKz0gNDsKKyAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAoT1BKX1VJTlQzMiopICZsX3RtcCwKKyAgICAgICAgICAgICAgICAgICAyKTsgICAgICAgICAgICAgICAgIC8qIENzaXogKi8KKyAgICBwX2hlYWRlcl9kYXRhICs9IDI7CisgICAgaWYgKGxfdG1wIDwgMTYzODUpIHsKKyAgICAgICAgbF9pbWFnZS0+bnVtY29tcHMgPSAoT1BKX1VJTlQxNikgbF90bXA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2l0aCBTSVogbWFya2VyOiBudW1iZXIgb2YgY29tcG9uZW50IGlzIGlsbGVnYWwgLT4gJWRcbiIsIGxfdG1wKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICBpZiAobF9pbWFnZS0+bnVtY29tcHMgIT0gbF9uYl9jb21wKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdpdGggU0laIG1hcmtlcjogbnVtYmVyIG9mIGNvbXBvbmVudCBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSByZW1haW5pbmcgbnVtYmVyIG9mIHBhcmFtZXRlcnMgKCAlZCB2cyAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbF9pbWFnZS0+bnVtY29tcHMsIGxfbmJfY29tcCk7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgLyogdGVzdGNhc2UgNDAzNS5wZGYuU0lHU0VHVi5kOGIuMzM3NSAqLworICAgIC8qIHRlc3RjYXNlIGlzc3VlNDI3LW51bGwtaW1hZ2Utc2l6ZS5qcDIgKi8KKyAgICBpZiAoKGxfaW1hZ2UtPngwID49IGxfaW1hZ2UtPngxKSB8fCAobF9pbWFnZS0+eTAgPj0gbF9pbWFnZS0+eTEpKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdpdGggU0laIG1hcmtlcjogbmVnYXRpdmUgb3IgemVybyBpbWFnZSBzaXplICglIiBQUklkNjQgIiB4ICUiIFBSSWQ2NAorICAgICAgICAgICAgICAgICAgICAgICIpXG4iLCAoT1BKX0lOVDY0KWxfaW1hZ2UtPngxIC0gbF9pbWFnZS0+eDAsCisgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQ2NClsX2ltYWdlLT55MSAtIGxfaW1hZ2UtPnkwKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgLyogdGVzdGNhc2UgMjUzOS5wZGYuU0lHRlBFLjcwNi4xNzEyIChhbHNvIDM2MjIucGRmLlNJR0ZQRS43MDYuMjkxNiBhbmQgNDAwOC5wZGYuU0lHRlBFLjcwNi4zMzQ1IGFuZCBtYXliZSBtb3JlKSAqLworICAgIGlmICgobF9jcC0+dGR4ID09IDBVKSB8fCAobF9jcC0+dGR5ID09IDBVKSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aXRoIFNJWiBtYXJrZXI6IGludmFsaWQgdGlsZSBzaXplICh0ZHg6ICVkLCB0ZHk6ICVkKVxuIiwgbF9jcC0+dGR4LAorICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnRkeSk7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgLyogdGVzdGNhc2UgaXNzdWU0MjctaWxsZWdhbC10aWxlLW9mZnNldC5qcDIgKi8KKyAgICBsX3R4MSA9IG9wal91aW50X2FkZHMobF9jcC0+dHgwLCBsX2NwLT50ZHgpOyAvKiBtYW5hZ2Ugb3ZlcmZsb3cgKi8KKyAgICBsX3R5MSA9IG9wal91aW50X2FkZHMobF9jcC0+dHkwLCBsX2NwLT50ZHkpOyAvKiBtYW5hZ2Ugb3ZlcmZsb3cgKi8KKyAgICBpZiAoKGxfY3AtPnR4MCA+IGxfaW1hZ2UtPngwKSB8fCAobF9jcC0+dHkwID4gbF9pbWFnZS0+eTApIHx8CisgICAgICAgICAgICAobF90eDEgPD0gbF9pbWFnZS0+eDApIHx8IChsX3R5MSA8PSBsX2ltYWdlLT55MCkpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2l0aCBTSVogbWFya2VyOiBpbGxlZ2FsIHRpbGUgb2Zmc2V0XG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgaWYgKCFwX2oyay0+ZHVtcF9zdGF0ZSkgeworICAgICAgICBPUEpfVUlOVDMyIHNpel93LCBzaXpfaDsKKworICAgICAgICBzaXpfdyA9IGxfaW1hZ2UtPngxIC0gbF9pbWFnZS0+eDA7CisgICAgICAgIHNpel9oID0gbF9pbWFnZS0+eTEgLSBsX2ltYWdlLT55MDsKKworICAgICAgICBpZiAocF9qMmstPmloZHJfdyA+IDAgJiYgcF9qMmstPmloZHJfaCA+IDAKKyAgICAgICAgICAgICAgICAmJiAocF9qMmstPmloZHJfdyAhPSBzaXpfdyB8fCBwX2oyay0+aWhkcl9oICE9IHNpel9oKSkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdpdGggU0laIG1hcmtlcjogSUhEUiB3KCV1KSBoKCV1KSB2cy4gU0laIHcoJXUpIGgoJXUpXG4iLCBwX2oyay0+aWhkcl93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+aWhkcl9oLCBzaXpfdywgc2l6X2gpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQotCi0gICAgICAgIGxfcmVtYWluaW5nX3NpemUgPSBwX2hlYWRlcl9zaXplIC0gMzY7Ci0gICAgICAgIGxfbmJfY29tcCA9IGxfcmVtYWluaW5nX3NpemUgLyAzOwotICAgICAgICBsX25iX2NvbXBfcmVtYWluID0gbF9yZW1haW5pbmdfc2l6ZSAlIDM7Ci0gICAgICAgIGlmIChsX25iX2NvbXBfcmVtYWluICE9IDApewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3aXRoIFNJWiBtYXJrZXIgc2l6ZVxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdG1wICwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSc2l6IChjYXBhYmlsaXRpZXMpICovCi0gICAgICAgIHBfaGVhZGVyX2RhdGErPTI7Ci0gICAgICAgIGxfY3AtPnJzaXogPSAoT1BKX1VJTlQxNikgbF90bXA7Ci0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsIChPUEpfVUlOVDMyKikgJmxfaW1hZ2UtPngxLCA0KTsgICAvKiBYc2l6ICovCi0gICAgICAgIHBfaGVhZGVyX2RhdGErPTQ7Ci0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsIChPUEpfVUlOVDMyKikgJmxfaW1hZ2UtPnkxLCA0KTsgICAvKiBZc2l6ICovCi0gICAgICAgIHBfaGVhZGVyX2RhdGErPTQ7Ci0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsIChPUEpfVUlOVDMyKikgJmxfaW1hZ2UtPngwLCA0KTsgICAvKiBYMHNpeiAqLwotICAgICAgICBwX2hlYWRlcl9kYXRhKz00OwotICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAoT1BKX1VJTlQzMiopICZsX2ltYWdlLT55MCwgNCk7ICAgLyogWTBzaXogKi8KLSAgICAgICAgcF9oZWFkZXJfZGF0YSs9NDsKLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgKE9QSl9VSU5UMzIqKSAmbF9jcC0+dGR4LCA0KTsgICAgICAgICAgICAgLyogWFRzaXogKi8KLSAgICAgICAgcF9oZWFkZXJfZGF0YSs9NDsKLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgKE9QSl9VSU5UMzIqKSAmbF9jcC0+dGR5LCA0KTsgICAgICAgICAgICAgLyogWVRzaXogKi8KLSAgICAgICAgcF9oZWFkZXJfZGF0YSs9NDsKLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgKE9QSl9VSU5UMzIqKSAmbF9jcC0+dHgwLCA0KTsgICAgICAgICAgICAgLyogWFQwc2l6ICovCi0gICAgICAgIHBfaGVhZGVyX2RhdGErPTQ7Ci0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsIChPUEpfVUlOVDMyKikgJmxfY3AtPnR5MCwgNCk7ICAgICAgICAgICAgIC8qIFlUMHNpeiAqLwotICAgICAgICBwX2hlYWRlcl9kYXRhKz00OwotICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAoT1BKX1VJTlQzMiopICZsX3RtcCwgMik7ICAgICAgICAgICAgICAgICAvKiBDc2l6ICovCi0gICAgICAgIHBfaGVhZGVyX2RhdGErPTI7Ci0gICAgICAgIGlmIChsX3RtcCA8IDE2Mzg1KQotICAgICAgICAgICAgICAgIGxfaW1hZ2UtPm51bWNvbXBzID0gKE9QSl9VSU5UMTYpIGxfdG1wOwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd2l0aCBTSVogbWFya2VyOiBudW1iZXIgb2YgY29tcG9uZW50IGlzIGlsbGVnYWwgLT4gJWRcbiIsIGxfdG1wKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxfaW1hZ2UtPm51bWNvbXBzICE9IGxfbmJfY29tcCkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3aXRoIFNJWiBtYXJrZXI6IG51bWJlciBvZiBjb21wb25lbnQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgcmVtYWluaW5nIG51bWJlciBvZiBwYXJhbWV0ZXJzICggJWQgdnMgJWQpXG4iLCBsX2ltYWdlLT5udW1jb21wcywgbF9uYl9jb21wKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogdGVzdGNhc2UgNDAzNS5wZGYuU0lHU0VHVi5kOGIuMzM3NSAqLwotICAgICAgICAvKiB0ZXN0Y2FzZSBpc3N1ZTQyNy1udWxsLWltYWdlLXNpemUuanAyICovCi0gICAgICAgIGlmICgobF9pbWFnZS0+eDAgPj0gbF9pbWFnZS0+eDEpIHx8IChsX2ltYWdlLT55MCA+PSBsX2ltYWdlLT55MSkpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd2l0aCBTSVogbWFya2VyOiBuZWdhdGl2ZSBvciB6ZXJvIGltYWdlIHNpemUgKCVkIHggJWQpXG4iLCBsX2ltYWdlLT54MSAtIGxfaW1hZ2UtPngwLCBsX2ltYWdlLT55MSAtIGxfaW1hZ2UtPnkwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIC8qIHRlc3RjYXNlIDI1MzkucGRmLlNJR0ZQRS43MDYuMTcxMiAoYWxzbyAzNjIyLnBkZi5TSUdGUEUuNzA2LjI5MTYgYW5kIDQwMDgucGRmLlNJR0ZQRS43MDYuMzM0NSBhbmQgbWF5YmUgbW9yZSkgKi8KLSAgICAgICAgaWYgKCEobF9jcC0+dGR4ICogbF9jcC0+dGR5KSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3aXRoIFNJWiBtYXJrZXI6IGludmFsaWQgdGlsZSBzaXplICh0ZHg6ICVkLCB0ZHk6ICVkKVxuIiwgbF9jcC0+dGR4LCBsX2NwLT50ZHkpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB0ZXN0Y2FzZSAxNjEwLnBkZi5TSUdTRUdWLjU5Yy42ODEgKi8KLSAgICAgICAgaWYgKCgoT1BKX1VJTlQ2NClsX2ltYWdlLT54MSkgKiAoKE9QSl9VSU5UNjQpbF9pbWFnZS0+eTEpICE9IChsX2ltYWdlLT54MSAqIGxfaW1hZ2UtPnkxKSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJQcmV2ZW50IGJ1ZmZlciBvdmVyZmxvdyAoeDE6ICVkLCB5MTogJWQpXG4iLCBsX2ltYWdlLT54MSwgbF9pbWFnZS0+eTEpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB0ZXN0Y2FzZSBpc3N1ZTQyNy1pbGxlZ2FsLXRpbGUtb2Zmc2V0LmpwMiAqLwotICAgICAgICBsX3R4MSA9IG9wal91aW50X2FkZHMobF9jcC0+dHgwLCBsX2NwLT50ZHgpOyAvKiBtYW5hZ2Ugb3ZlcmZsb3cgKi8KLSAgICAgICAgbF90eTEgPSBvcGpfdWludF9hZGRzKGxfY3AtPnR5MCwgbF9jcC0+dGR5KTsgLyogbWFuYWdlIG92ZXJmbG93ICovCi0gICAgICAgIGlmICgobF9jcC0+dHgwID4gbF9pbWFnZS0+eDApIHx8IChsX2NwLT50eTAgPiBsX2ltYWdlLT55MCkgfHwgKGxfdHgxIDw9IGxfaW1hZ2UtPngwKSB8fCAobF90eTEgPD0gbF9pbWFnZS0+eTApICkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3aXRoIFNJWiBtYXJrZXI6IGlsbGVnYWwgdGlsZSBvZmZzZXRcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQorICAgIH0KICNpZmRlZiBVU0VfSlBXTAotICAgICAgICBpZiAobF9jcC0+Y29ycmVjdCkgewotICAgICAgICAgICAgICAgIC8qIGlmIEpQV0wgaXMgb24sIHdlIGNoZWNrIHdoZXRoZXIgVFggZXJyb3JzIGhhdmUgZGFtYWdlZAotICAgICAgICAgICAgICAgICAgdG9vIG11Y2ggdGhlIFNJWiBwYXJhbWV0ZXJzICovCi0gICAgICAgICAgICAgICAgaWYgKCEobF9pbWFnZS0+eDEgKiBsX2ltYWdlLT55MSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKUFdMOiBiYWQgaW1hZ2Ugc2l6ZSAoJWQgeCAlZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1hZ2UtPngxLCBsX2ltYWdlLT55MSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUpQV0xfQVNTVU1FIHx8IEpQV0xfQVNTVU1FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJKUFdMOiBnaXZpbmcgdXBcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKyAgICBpZiAobF9jcC0+Y29ycmVjdCkgeworICAgICAgICAvKiBpZiBKUFdMIGlzIG9uLCB3ZSBjaGVjayB3aGV0aGVyIFRYIGVycm9ycyBoYXZlIGRhbWFnZWQKKyAgICAgICAgICB0b28gbXVjaCB0aGUgU0laIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgaWYgKCEobF9pbWFnZS0+eDEgKiBsX2ltYWdlLT55MSkpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJKUFdMOiBiYWQgaW1hZ2Ugc2l6ZSAoJWQgeCAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1hZ2UtPngxLCBsX2ltYWdlLT55MSk7CisgICAgICAgICAgICBpZiAoIUpQV0xfQVNTVU1FKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkpQV0w6IGdpdmluZyB1cFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIC8qIEZJWE1FIGNoZWNrIHByZXZpb3VzbHkgaW4gdGhlIGZ1bmN0aW9uIHNvIHdoeSBrZWVwIHRoaXMgcGllY2Ugb2YgY29kZSA/IE5lZWQgYnkgdGhlIG5vcm0gPwogICAgICAgICAgICAgICAgIGlmIChsX2ltYWdlLT5udW1jb21wcyAhPSAoKGxlbiAtIDM4KSAvIDMpKSB7CkBAIC0yMDg2LDI2NyArMjIwMiwzMjAgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICovCiAKLSAgICAgICAgICAgICAgICAvKiB1cGRhdGUgY29tcG9uZW50cyBudW1iZXIgaW4gdGhlIGpwd2xfZXhwX2NvbXBzIGZpbGVkICovCi0gICAgICAgICAgICAgICAgbF9jcC0+ZXhwX2NvbXBzID0gbF9pbWFnZS0+bnVtY29tcHM7Ci0gICAgICAgIH0KKyAgICAgICAgLyogdXBkYXRlIGNvbXBvbmVudHMgbnVtYmVyIGluIHRoZSBqcHdsX2V4cF9jb21wcyBmaWxlZCAqLworICAgICAgICBsX2NwLT5leHBfY29tcHMgPSBsX2ltYWdlLT5udW1jb21wczsKKyAgICB9CiAjZW5kaWYgLyogVVNFX0pQV0wgKi8KIAotICAgICAgICAvKiBBbGxvY2F0ZSB0aGUgcmVzdWx0aW5nIGltYWdlIGNvbXBvbmVudHMgKi8KLSAgICAgICAgbF9pbWFnZS0+Y29tcHMgPSAob3BqX2ltYWdlX2NvbXBfdCopIG9wal9jYWxsb2MobF9pbWFnZS0+bnVtY29tcHMsIHNpemVvZihvcGpfaW1hZ2VfY29tcF90KSk7Ci0gICAgICAgIGlmIChsX2ltYWdlLT5jb21wcyA9PSAwMCl7Ci0gICAgICAgICAgICAgICAgbF9pbWFnZS0+bnVtY29tcHMgPSAwOwotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB0YWtlIGluIGNoYXJnZSBTSVogbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIC8qIEFsbG9jYXRlIHRoZSByZXN1bHRpbmcgaW1hZ2UgY29tcG9uZW50cyAqLworICAgIGxfaW1hZ2UtPmNvbXBzID0gKG9wal9pbWFnZV9jb21wX3QqKSBvcGpfY2FsbG9jKGxfaW1hZ2UtPm51bWNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9wal9pbWFnZV9jb21wX3QpKTsKKyAgICBpZiAobF9pbWFnZS0+Y29tcHMgPT0gMDApIHsKKyAgICAgICAgbF9pbWFnZS0+bnVtY29tcHMgPSAwOworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIG1lbW9yeSB0byB0YWtlIGluIGNoYXJnZSBTSVogbWFya2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICBsX2ltZ19jb21wID0gbF9pbWFnZS0+Y29tcHM7CisKKyAgICBsX3ByZWMwID0gMDsKKyAgICBsX3NnbmQwID0gMDsKKyAgICAvKiBSZWFkIHRoZSBjb21wb25lbnQgaW5mb3JtYXRpb24gKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbF9pbWFnZS0+bnVtY29tcHM7ICsraSkgeworICAgICAgICBPUEpfVUlOVDMyIHRtcDsKKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgJnRtcCwgMSk7IC8qIFNzaXpfaSAqLworICAgICAgICArK3BfaGVhZGVyX2RhdGE7CisgICAgICAgIGxfaW1nX2NvbXAtPnByZWMgPSAodG1wICYgMHg3ZikgKyAxOworICAgICAgICBsX2ltZ19jb21wLT5zZ25kID0gdG1wID4+IDc7CisKKyAgICAgICAgaWYgKHBfajJrLT5kdW1wX3N0YXRlID09IDApIHsKKyAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICBsX3ByZWMwID0gbF9pbWdfY29tcC0+cHJlYzsKKyAgICAgICAgICAgICAgICBsX3NnbmQwID0gbF9pbWdfY29tcC0+c2duZDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWxfY3AtPmFsbG93X2RpZmZlcmVudF9iaXRfZGVwdGhfc2lnbgorICAgICAgICAgICAgICAgICAgICAgICAmJiAobF9pbWdfY29tcC0+cHJlYyAhPSBsX3ByZWMwIHx8IGxfaW1nX2NvbXAtPnNnbmQgIT0gbF9zZ25kMCkpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVzcGl0ZSBKUDIgQlBDIT0yNTUsIHByZWNpc2lvbiBhbmQvb3Igc2duZCB2YWx1ZXMgZm9yIGNvbXBbJWRdIGlzIGRpZmZlcmVudCB0aGFuIGNvbXBbMF06XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICBbMF0gcHJlYyglZCkgc2duZCglZCkgWyVkXSBwcmVjKCVkKSBzZ25kKCVkKVxuIiwgaSwgbF9wcmVjMCwgbF9zZ25kMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGxfaW1nX2NvbXAtPnByZWMsIGxfaW1nX2NvbXAtPnNnbmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogVE9ETzogd2Ugc2hvdWxkIHBlcmhhcHMgYWxzbyBjaGVjayBhZ2FpbnN0IEpQMiBCUENDIHZhbHVlcyAqLwogICAgICAgICB9Ci0KLSAgICAgICAgbF9pbWdfY29tcCA9IGxfaW1hZ2UtPmNvbXBzOwotCi0gICAgICAgIC8qIFJlYWQgdGhlIGNvbXBvbmVudCBpbmZvcm1hdGlvbiAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF9pbWFnZS0+bnVtY29tcHM7ICsraSl7Ci0gICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0bXA7Ci0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmdG1wLDEpOyAgIC8qIFNzaXpfaSAqLwotICAgICAgICAgICAgICAgICsrcF9oZWFkZXJfZGF0YTsKLSAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT5wcmVjID0gKHRtcCAmIDB4N2YpICsgMTsKLSAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT5zZ25kID0gdG1wID4+IDc7Ci0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmdG1wLDEpOyAgIC8qIFhSc2l6X2kgKi8KLSAgICAgICAgICAgICAgICArK3BfaGVhZGVyX2RhdGE7Ci0gICAgICAgICAgICAgICAgbF9pbWdfY29tcC0+ZHggPSAoT1BKX1VJTlQzMil0bXA7IC8qIHNob3VsZCBiZSBiZXR3ZWVuIDEgYW5kIDI1NSAqLwotICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJnRtcCwxKTsgICAvKiBZUnNpel9pICovCi0gICAgICAgICAgICAgICAgKytwX2hlYWRlcl9kYXRhOwotICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPmR5ID0gKE9QSl9VSU5UMzIpdG1wOyAvKiBzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAyNTUgKi8KLSAgICAgICAgICAgICAgICBpZiggbF9pbWdfY29tcC0+ZHggPCAxIHx8IGxfaW1nX2NvbXAtPmR4ID4gMjU1IHx8Ci0gICAgICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPmR5IDwgMSB8fCBsX2ltZ19jb21wLT5keSA+IDI1NSApIHsKLSAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB2YWx1ZXMgZm9yIGNvbXAgPSAlZCA6IGR4PSV1IGR5PSV1IChzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAyNTUgYWNjb3JkaW5nIHRvIHRoZSBKUEVHMjAwMCBub3JtKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBsX2ltZ19jb21wLT5keCwgbF9pbWdfY29tcC0+ZHkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiggbF9pbWdfY29tcC0+cHJlYyA+IDM4KSB7IC8qIFRPRE8gb3BlbmpwZWcgd29uJ3QgaGFuZGxlIG1vcmUgdGhhbiA/ICovCi0gICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdmFsdWVzIGZvciBjb21wID0gJWQgOiBwcmVjPSV1IChzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAzOCBhY2NvcmRpbmcgdG8gdGhlIEpQRUcyMDAwIG5vcm0pXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGxfaW1nX2NvbXAtPnByZWMpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotI2lmZGVmIFVTRV9KUFdMCi0gICAgICAgICAgICAgICAgaWYgKGxfY3AtPmNvcnJlY3QpIHsKLSAgICAgICAgICAgICAgICAvKiBpZiBKUFdMIGlzIG9uLCB3ZSBjaGVjayB3aGV0aGVyIFRYIGVycm9ycyBoYXZlIGRhbWFnZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvbyBtdWNoIHRoZSBTSVogcGFyYW1ldGVycywgYWdhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGxfaW1hZ2UtPmNvbXBzW2ldLmR4ICogbF9pbWFnZS0+Y29tcHNbaV0uZHkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBKUFdMX0FTU1VNRSA/IEVWVF9XQVJOSU5HIDogRVZUX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKUFdMOiBiYWQgWFJzaXpfJWQvWVJzaXpfJWQgKCVkIHggJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGksIGxfaW1hZ2UtPmNvbXBzW2ldLmR4LCBsX2ltYWdlLT5jb21wc1tpXS5keSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSlBXTF9BU1NVTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSlBXTDogZ2l2aW5nIHVwXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIHRyeSB0byBjb3JyZWN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIi0gdHJ5aW5nIHRvIGFkanVzdCB0aGVtXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsX2ltYWdlLT5jb21wc1tpXS5keCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1hZ2UtPmNvbXBzW2ldLmR4ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICItIHNldHRpbmcgWFJzaXpfJWQgdG8gJWQgPT4gSFlQT1RIRVNJUyEhIVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGxfaW1hZ2UtPmNvbXBzW2ldLmR4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxfaW1hZ2UtPmNvbXBzW2ldLmR5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9pbWFnZS0+Y29tcHNbaV0uZHkgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIi0gc2V0dGluZyBZUnNpel8lZCB0byAlZCA9PiBIWVBPVEhFU0lTISEhXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgbF9pbWFnZS0+Y29tcHNbaV0uZHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotI2VuZGlmIC8qIFVTRV9KUFdMICovCi0gICAgICAgICAgICAgICAgbF9pbWdfY29tcC0+cmVzbm9fZGVjb2RlZCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiByZXNvbHV0aW9uIGRlY29kZWQgKi8KLSAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT5mYWN0b3IgPSBsX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjLm1fcmVkdWNlOyAvKiByZWR1Y2luZyBmYWN0b3IgcGVyIGNvbXBvbmVudCAqLwotICAgICAgICAgICAgICAgICsrbF9pbWdfY29tcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIENvbXB1dGUgdGhlIG51bWJlciBvZiB0aWxlcyAqLwotICAgICAgICBsX2NwLT50dyA9IG9wal91aW50X2NlaWxkaXYobF9pbWFnZS0+eDEgLSBsX2NwLT50eDAsIGxfY3AtPnRkeCk7Ci0gICAgICAgIGxfY3AtPnRoID0gb3BqX3VpbnRfY2VpbGRpdihsX2ltYWdlLT55MSAtIGxfY3AtPnR5MCwgbF9jcC0+dGR5KTsKLQotICAgICAgICAvKiBDaGVjayB0aGF0IHRoZSBudW1iZXIgb2YgdGlsZXMgaXMgdmFsaWQgKi8KLSAgICAgICAgaWYgKGxfY3AtPnR3ID09IDAgfHwgbF9jcC0+dGggPT0gMCB8fCBsX2NwLT50dyA+IDY1NTM1IC8gbF9jcC0+dGgpIHsKLSAgICAgICAgICAgIG9wal9ldmVudF9tc2coICBwX21hbmFnZXIsIEVWVF9FUlJPUiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgbnVtYmVyIG9mIHRpbGVzIDogJXUgeCAldSAobWF4aW11bSBmaXhlZCBieSBqcGVnMjAwMCBub3JtIGlzIDY1NTM1IHRpbGVzKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NwLT50dywgbF9jcC0+dGgpOworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAmdG1wLCAxKTsgLyogWFJzaXpfaSAqLworICAgICAgICArK3BfaGVhZGVyX2RhdGE7CisgICAgICAgIGxfaW1nX2NvbXAtPmR4ID0gKE9QSl9VSU5UMzIpdG1wOyAvKiBzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAyNTUgKi8KKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgJnRtcCwgMSk7IC8qIFlSc2l6X2kgKi8KKyAgICAgICAgKytwX2hlYWRlcl9kYXRhOworICAgICAgICBsX2ltZ19jb21wLT5keSA9IChPUEpfVUlOVDMyKXRtcDsgLyogc2hvdWxkIGJlIGJldHdlZW4gMSBhbmQgMjU1ICovCisgICAgICAgIGlmIChsX2ltZ19jb21wLT5keCA8IDEgfHwgbF9pbWdfY29tcC0+ZHggPiAyNTUgfHwKKyAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT5keSA8IDEgfHwgbF9pbWdfY29tcC0+ZHkgPiAyNTUpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlcyBmb3IgY29tcCA9ICVkIDogZHg9JXUgZHk9JXUgKHNob3VsZCBiZSBiZXR3ZWVuIDEgYW5kIDI1NSBhY2NvcmRpbmcgdG8gdGhlIEpQRUcyMDAwIG5vcm0pXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBsX2ltZ19jb21wLT5keCwgbF9pbWdfY29tcC0+ZHkpOwogICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQotICAgICAgICBsX25iX3RpbGVzID0gbF9jcC0+dHcgKiBsX2NwLT50aDsKLQotICAgICAgICAvKiBEZWZpbmUgdGhlIHRpbGVzIHdoaWNoIHdpbGwgYmUgZGVjb2RlZCAqLwotICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGlzY2FyZF90aWxlcykgewotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXJ0X3RpbGVfeCA9IChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3ggLSBsX2NwLT50eDApIC8gbF9jcC0+dGR4OwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXJ0X3RpbGVfeSA9IChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3kgLSBsX2NwLT50eTApIC8gbF9jcC0+dGR5OwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3ggPSBvcGpfdWludF9jZWlsZGl2KHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3ggLSBsX2NwLT50eDAsIGxfY3AtPnRkeCk7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeSA9IG9wal91aW50X2NlaWxkaXYocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeSAtIGxfY3AtPnR5MCwgbF9jcC0+dGR5KTsKKyAgICAgICAgLyogQXZvaWRzIGxhdGVyIHVuZGVmaW5lZCBzaGlmdCBpbiBjb21wdXRhdGlvbiBvZiAqLworICAgICAgICAvKiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcC0+dGNjcHNbaV0ubV9kY19sZXZlbF9zaGlmdCA9IDEKKyAgICAgICAgICAgICAgICAgICAgPDwgKGxfaW1hZ2UtPmNvbXBzW2ldLnByZWMgLSAxKTsgKi8KKyAgICAgICAgaWYgKGxfaW1nX2NvbXAtPnByZWMgPiAzMSkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdmFsdWVzIGZvciBjb21wID0gJWQgOiBwcmVjPSV1IChzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAzOCBhY2NvcmRpbmcgdG8gdGhlIEpQRUcyMDAwIG5vcm0uIE9wZW5KcGVnIG9ubHkgc3VwcG9ydHMgdXAgdG8gMzEpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBsX2ltZ19jb21wLT5wcmVjKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhcnRfdGlsZV94ID0gMDsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3kgPSAwOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3ggPSBsX2NwLT50dzsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV95ID0gbF9jcC0+dGg7Ci0gICAgICAgIH0KLQogI2lmZGVmIFVTRV9KUFdMCiAgICAgICAgIGlmIChsX2NwLT5jb3JyZWN0KSB7Ci0gICAgICAgICAgICAgICAgLyogaWYgSlBXTCBpcyBvbiwgd2UgY2hlY2sgd2hldGhlciBUWCBlcnJvcnMgaGF2ZSBkYW1hZ2VkCi0gICAgICAgICAgICAgICAgICB0b28gbXVjaCB0aGUgU0laIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgICAgICAgICBpZiAoKGxfY3AtPnR3IDwgMSkgfHwgKGxfY3AtPnRoIDwgMSkgfHwgKGxfY3AtPnR3ID4gbF9jcC0+bWF4X3RpbGVzKSB8fCAobF9jcC0+dGggPiBsX2NwLT5tYXhfdGlsZXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgSlBXTF9BU1NVTUUgPyBFVlRfV0FSTklORyA6IEVWVF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQV0w6IGJhZCBudW1iZXIgb2YgdGlsZXMgKCVkIHggJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NwLT50dywgbF9jcC0+dGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFKUFdMX0FTU1VNRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSlBXTDogZ2l2aW5nIHVwXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIHRyeSB0byBjb3JyZWN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICItIHRyeWluZyB0byBhZGp1c3QgdGhlbVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jcC0+dHcgPCAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnR3PSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICItIHNldHRpbmcgJWQgdGlsZXMgaW4geCA9PiBIWVBPVEhFU0lTISEhXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+dHcpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY3AtPnR3ID4gbF9jcC0+bWF4X3RpbGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnR3PSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICItIHRvbyBsYXJnZSB4LCBpbmNyZWFzZSBleHBlY3RhbmNlIG9mICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0gc2V0dGluZyAlZCB0aWxlcyBpbiB4ID0+IEhZUE9USEVTSVMhISFcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+bWF4X3RpbGVzLCBsX2NwLT50dyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jcC0+dGggPCAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnRoPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICItIHNldHRpbmcgJWQgdGlsZXMgaW4geSA9PiBIWVBPVEhFU0lTISEhXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+dGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY3AtPnRoID4gbF9jcC0+bWF4X3RpbGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnRoPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICItIHRvbyBsYXJnZSB5LCBpbmNyZWFzZSBleHBlY3RhbmNlIG9mICVkIHRvIGNvbnRpbnVlXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItIHNldHRpbmcgJWQgdGlsZXMgaW4geSA9PiBIWVBPVEhFU0lTISEhXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPm1heF90aWxlcywgbF9jcC0+dGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogaWYgSlBXTCBpcyBvbiwgd2UgY2hlY2sgd2hldGhlciBUWCBlcnJvcnMgaGF2ZSBkYW1hZ2VkCisgICAgICAgICAgICAgICAgICAgIHRvbyBtdWNoIHRoZSBTSVogcGFyYW1ldGVycywgYWdhaW4gKi8KKyAgICAgICAgICAgIGlmICghKGxfaW1hZ2UtPmNvbXBzW2ldLmR4ICogbF9pbWFnZS0+Y29tcHNbaV0uZHkpKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEpQV0xfQVNTVU1FID8gRVZUX1dBUk5JTkcgOiBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSlBXTDogYmFkIFhSc2l6XyVkL1lSc2l6XyVkICglZCB4ICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGksIGxfaW1hZ2UtPmNvbXBzW2ldLmR4LCBsX2ltYWdlLT5jb21wc1tpXS5keSk7CisgICAgICAgICAgICAgICAgaWYgKCFKUFdMX0FTU1VNRSkgeworICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSlBXTDogZ2l2aW5nIHVwXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogd2UgdHJ5IHRvIGNvcnJlY3QgKi8KKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICItIHRyeWluZyB0byBhZGp1c3QgdGhlbVxuIik7CisgICAgICAgICAgICAgICAgaWYgKCFsX2ltYWdlLT5jb21wc1tpXS5keCkgeworICAgICAgICAgICAgICAgICAgICBsX2ltYWdlLT5jb21wc1tpXS5keCA9IDE7CisgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLSBzZXR0aW5nIFhSc2l6XyVkIHRvICVkID0+IEhZUE9USEVTSVMhISFcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgbF9pbWFnZS0+Y29tcHNbaV0uZHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWxfaW1hZ2UtPmNvbXBzW2ldLmR5KSB7CisgICAgICAgICAgICAgICAgICAgIGxfaW1hZ2UtPmNvbXBzW2ldLmR5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItIHNldHRpbmcgWVJzaXpfJWQgdG8gJWQgPT4gSFlQT1RIRVNJUyEhIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBsX2ltYWdlLT5jb21wc1tpXS5keSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAjZW5kaWYgLyogVVNFX0pQV0wgKi8KKyAgICAgICAgbF9pbWdfY29tcC0+cmVzbm9fZGVjb2RlZCA9CisgICAgICAgICAgICAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcmVzb2x1dGlvbiBkZWNvZGVkICovCisgICAgICAgIGxfaW1nX2NvbXAtPmZhY3RvciA9CisgICAgICAgICAgICBsX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjLm1fcmVkdWNlOyAvKiByZWR1Y2luZyBmYWN0b3IgcGVyIGNvbXBvbmVudCAqLworICAgICAgICArK2xfaW1nX2NvbXA7CisgICAgfQogCi0gICAgICAgIC8qIG1lbW9yeSBhbGxvY2F0aW9ucyAqLwotICAgICAgICBsX2NwLT50Y3BzID0gKG9wal90Y3BfdCopIG9wal9jYWxsb2MobF9uYl90aWxlcywgc2l6ZW9mKG9wal90Y3BfdCkpOwotICAgICAgICBpZiAobF9jcC0+dGNwcyA9PSAwMCkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB0YWtlIGluIGNoYXJnZSBTSVogbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgaWYgKGxfY3AtPnRkeCA9PSAwIHx8IGxfY3AtPnRkeSA9PSAwKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgLyogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHRpbGVzICovCisgICAgbF9jcC0+dHcgPSBvcGpfdWludF9jZWlsZGl2KGxfaW1hZ2UtPngxIC0gbF9jcC0+dHgwLCBsX2NwLT50ZHgpOworICAgIGxfY3AtPnRoID0gb3BqX3VpbnRfY2VpbGRpdihsX2ltYWdlLT55MSAtIGxfY3AtPnR5MCwgbF9jcC0+dGR5KTsKKworICAgIC8qIENoZWNrIHRoYXQgdGhlIG51bWJlciBvZiB0aWxlcyBpcyB2YWxpZCAqLworICAgIGlmIChsX2NwLT50dyA9PSAwIHx8IGxfY3AtPnRoID09IDAgfHwgbF9jcC0+dHcgPiA2NTUzNSAvIGxfY3AtPnRoKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgbnVtYmVyIG9mIHRpbGVzIDogJXUgeCAldSAobWF4aW11bSBmaXhlZCBieSBqcGVnMjAwMCBub3JtIGlzIDY1NTM1IHRpbGVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBsX2NwLT50dywgbF9jcC0+dGgpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICBsX25iX3RpbGVzID0gbF9jcC0+dHcgKiBsX2NwLT50aDsKKworICAgIC8qIERlZmluZSB0aGUgdGlsZXMgd2hpY2ggd2lsbCBiZSBkZWNvZGVkICovCisgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2Rpc2NhcmRfdGlsZXMpIHsKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhcnRfdGlsZV94ID0KKyAgICAgICAgICAgIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3ggLSBsX2NwLT50eDApIC8gbF9jcC0+dGR4OworICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3kgPQorICAgICAgICAgICAgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXJ0X3RpbGVfeSAtIGxfY3AtPnR5MCkgLyBsX2NwLT50ZHk7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3ggPSBvcGpfdWludF9jZWlsZGl2KAorICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeCAtIGxfY3AtPnR4MCwgbF9jcC0+dGR4KTsKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeSA9IG9wal91aW50X2NlaWxkaXYoCisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV95IC0gbF9jcC0+dHkwLCBsX2NwLT50ZHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXJ0X3RpbGVfeCA9IDA7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXJ0X3RpbGVfeSA9IDA7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3ggPSBsX2NwLT50dzsKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeSA9IGxfY3AtPnRoOworICAgIH0KIAogI2lmZGVmIFVTRV9KUFdMCi0gICAgICAgIGlmIChsX2NwLT5jb3JyZWN0KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFsX2NwLT50Y3BzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgSlBXTF9BU1NVTUUgPyBFVlRfV0FSTklORyA6IEVWVF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQV0w6IGNvdWxkIG5vdCBhbGxvYyB0Y3BzIGZpZWxkIG9mIGNwXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSlBXTF9BU1NVTUUgfHwgSlBXTF9BU1NVTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkpQV0w6IGdpdmluZyB1cFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQorICAgIGlmIChsX2NwLT5jb3JyZWN0KSB7CisgICAgICAgIC8qIGlmIEpQV0wgaXMgb24sIHdlIGNoZWNrIHdoZXRoZXIgVFggZXJyb3JzIGhhdmUgZGFtYWdlZAorICAgICAgICAgIHRvbyBtdWNoIHRoZSBTSVogcGFyYW1ldGVycyAqLworICAgICAgICBpZiAoKGxfY3AtPnR3IDwgMSkgfHwgKGxfY3AtPnRoIDwgMSkgfHwgKGxfY3AtPnR3ID4gbF9jcC0+bWF4X3RpbGVzKSB8fAorICAgICAgICAgICAgICAgIChsX2NwLT50aCA+IGxfY3AtPm1heF90aWxlcykpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBKUFdMX0FTU1VNRSA/IEVWVF9XQVJOSU5HIDogRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSlBXTDogYmFkIG51bWJlciBvZiB0aWxlcyAoJWQgeCAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnR3LCBsX2NwLT50aCk7CisgICAgICAgICAgICBpZiAoIUpQV0xfQVNTVU1FKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkpQV0w6IGdpdmluZyB1cFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHdlIHRyeSB0byBjb3JyZWN0ICovCisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICItIHRyeWluZyB0byBhZGp1c3QgdGhlbVxuIik7CisgICAgICAgICAgICBpZiAobF9jcC0+dHcgPCAxKSB7CisgICAgICAgICAgICAgICAgbF9jcC0+dHcgPSAxOworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItIHNldHRpbmcgJWQgdGlsZXMgaW4geCA9PiBIWVBPVEhFU0lTISEhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+dHcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxfY3AtPnR3ID4gbF9jcC0+bWF4X3RpbGVzKSB7CisgICAgICAgICAgICAgICAgbF9jcC0+dHcgPSAxOworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItIHRvbyBsYXJnZSB4LCBpbmNyZWFzZSBleHBlY3RhbmNlIG9mICVkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLSBzZXR0aW5nICVkIHRpbGVzIGluIHggPT4gSFlQT1RIRVNJUyEhIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPm1heF90aWxlcywgbF9jcC0+dHcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxfY3AtPnRoIDwgMSkgeworICAgICAgICAgICAgICAgIGxfY3AtPnRoID0gMTsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLSBzZXR0aW5nICVkIHRpbGVzIGluIHkgPT4gSFlQT1RIRVNJUyEhIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsX2NwLT50aCA+IGxfY3AtPm1heF90aWxlcykgeworICAgICAgICAgICAgICAgIGxfY3AtPnRoID0gMTsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLSB0b28gbGFyZ2UgeSwgaW5jcmVhc2UgZXhwZWN0YW5jZSBvZiAlZCB0byBjb250aW51ZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItIHNldHRpbmcgJWQgdGlsZXMgaW4geSA9PiBIWVBPVEhFU0lTISEhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+bWF4X3RpbGVzLCBsX2NwLT50aCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICB9CiAjZW5kaWYgLyogVVNFX0pQV0wgKi8KIAotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcC0+dGNjcHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgKG9wal90Y2NwX3QqKSBvcGpfY2FsbG9jKGxfaW1hZ2UtPm51bWNvbXBzLCBzaXplb2Yob3BqX3RjY3BfdCkpOwotICAgICAgICBpZihwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcC0+dGNjcHMgID09IDAwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHRha2UgaW4gY2hhcmdlIFNJWiBtYXJrZXJcbiIpOworICAgIC8qIG1lbW9yeSBhbGxvY2F0aW9ucyAqLworICAgIGxfY3AtPnRjcHMgPSAob3BqX3RjcF90Kikgb3BqX2NhbGxvYyhsX25iX3RpbGVzLCBzaXplb2Yob3BqX3RjcF90KSk7CisgICAgaWYgKGxfY3AtPnRjcHMgPT0gMDApIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiTm90IGVub3VnaCBtZW1vcnkgdG8gdGFrZSBpbiBjaGFyZ2UgU0laIG1hcmtlclxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisjaWZkZWYgVVNFX0pQV0wKKyAgICBpZiAobF9jcC0+Y29ycmVjdCkgeworICAgICAgICBpZiAoIWxfY3AtPnRjcHMpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBKUFdMX0FTU1VNRSA/IEVWVF9XQVJOSU5HIDogRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSlBXTDogY291bGQgbm90IGFsbG9jIHRjcHMgZmllbGQgb2YgY3BcbiIpOworICAgICAgICAgICAgaWYgKCFKUFdMX0FTU1VNRSkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJKUFdMOiBnaXZpbmcgdXBcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogVVNFX0pQV0wgKi8KKworICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwLT50Y2NwcyA9CisgICAgICAgIChvcGpfdGNjcF90Kikgb3BqX2NhbGxvYyhsX2ltYWdlLT5udW1jb21wcywgc2l6ZW9mKG9wal90Y2NwX3QpKTsKKyAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3AtPnRjY3BzICA9PSAwMCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIG1lbW9yeSB0byB0YWtlIGluIGNoYXJnZSBTSVogbWFya2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcC0+bV9tY3RfcmVjb3JkcyA9CisgICAgICAgIChvcGpfbWN0X2RhdGFfdCopb3BqX2NhbGxvYyhPUEpfSjJLX01DVF9ERUZBVUxUX05CX1JFQ09SRFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob3BqX21jdF9kYXRhX3QpKTsKKworICAgIGlmICghIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwLT5tX21jdF9yZWNvcmRzKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHRha2UgaW4gY2hhcmdlIFNJWiBtYXJrZXJcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgPQorICAgICAgICBPUEpfSjJLX01DVF9ERUZBVUxUX05CX1JFQ09SRFM7CisKKyAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcC0+bV9tY2NfcmVjb3JkcyA9CisgICAgICAgIChvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCopCisgICAgICAgIG9wal9jYWxsb2MoT1BKX0oyS19NQ0NfREVGQVVMVF9OQl9SRUNPUkRTLAorICAgICAgICAgICAgICAgICAgIHNpemVvZihvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCkpOworCisgICAgaWYgKCEgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3AtPm1fbWNjX3JlY29yZHMpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiTm90IGVub3VnaCBtZW1vcnkgdG8gdGFrZSBpbiBjaGFyZ2UgU0laIG1hcmtlclxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkcyA9CisgICAgICAgIE9QSl9KMktfTUNDX0RFRkFVTFRfTkJfUkVDT1JEUzsKKworICAgIC8qIHNldCB1cCBkZWZhdWx0IGRjIGxldmVsIHNoaWZ0ICovCisgICAgZm9yIChpID0gMDsgaSA8IGxfaW1hZ2UtPm51bWNvbXBzOyArK2kpIHsKKyAgICAgICAgaWYgKCEgbF9pbWFnZS0+Y29tcHNbaV0uc2duZCkgeworICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3AtPnRjY3BzW2ldLm1fZGNfbGV2ZWxfc2hpZnQgPSAxCisgICAgICAgICAgICAgICAgICAgIDw8IChsX2ltYWdlLT5jb21wc1tpXS5wcmVjIC0gMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsX2N1cnJlbnRfdGlsZV9wYXJhbSA9IGxfY3AtPnRjcHM7CisgICAgZm9yIChpID0gMDsgaSA8IGxfbmJfdGlsZXM7ICsraSkgeworICAgICAgICBsX2N1cnJlbnRfdGlsZV9wYXJhbS0+dGNjcHMgPSAob3BqX3RjY3BfdCopIG9wal9jYWxsb2MobF9pbWFnZS0+bnVtY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvcGpfdGNjcF90KSk7CisgICAgICAgIGlmIChsX2N1cnJlbnRfdGlsZV9wYXJhbS0+dGNjcHMgPT0gMDApIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIG1lbW9yeSB0byB0YWtlIGluIGNoYXJnZSBTSVogbWFya2VyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgICAgIH0KIAotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcC0+bV9tY3RfcmVjb3JkcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAob3BqX21jdF9kYXRhX3QqKW9wal9jYWxsb2MoT1BKX0oyS19NQ1RfREVGQVVMVF9OQl9SRUNPUkRTICxzaXplb2Yob3BqX21jdF9kYXRhX3QpKTsKKyAgICAgICAgKytsX2N1cnJlbnRfdGlsZV9wYXJhbTsKKyAgICB9CiAKLSAgICAgICAgaWYgKCEgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3AtPm1fbWN0X3JlY29yZHMpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gdGFrZSBpbiBjaGFyZ2UgU0laIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgPSBPUEpfSjJLX01DVF9ERUZBVUxUX05CX1JFQ09SRFM7CisgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPSBKMktfU1RBVEVfTUg7CisgICAgb3BqX2ltYWdlX2NvbXBfaGVhZGVyX3VwZGF0ZShsX2ltYWdlLCBsX2NwKTsKIAotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcC0+bV9tY2NfcmVjb3JkcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAob3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QqKQotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NhbGxvYyhPUEpfSjJLX01DQ19ERUZBVUxUX05CX1JFQ09SRFMsIHNpemVvZihvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCkpOwotCi0gICAgICAgIGlmICghIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwLT5tX21jY19yZWNvcmRzKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHRha2UgaW4gY2hhcmdlIFNJWiBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzID0gT1BKX0oyS19NQ0NfREVGQVVMVF9OQl9SRUNPUkRTOwotCi0gICAgICAgIC8qIHNldCB1cCBkZWZhdWx0IGRjIGxldmVsIHNoaWZ0ICovCi0gICAgICAgIGZvciAoaT0wO2k8bF9pbWFnZS0+bnVtY29tcHM7KytpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEgbF9pbWFnZS0+Y29tcHNbaV0uc2duZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3AtPnRjY3BzW2ldLm1fZGNfbGV2ZWxfc2hpZnQgPSAxIDw8IChsX2ltYWdlLT5jb21wc1tpXS5wcmVjIC0gMSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbF9jdXJyZW50X3RpbGVfcGFyYW0gPSBsX2NwLT50Y3BzOwotICAgICAgICBmb3IgICAgIChpID0gMDsgaSA8IGxfbmJfdGlsZXM7ICsraSkgewotICAgICAgICAgICAgICAgIGxfY3VycmVudF90aWxlX3BhcmFtLT50Y2NwcyA9IChvcGpfdGNjcF90Kikgb3BqX2NhbGxvYyhsX2ltYWdlLT5udW1jb21wcywgc2l6ZW9mKG9wal90Y2NwX3QpKTsKLSAgICAgICAgICAgICAgICBpZiAobF9jdXJyZW50X3RpbGVfcGFyYW0tPnRjY3BzID09IDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gdGFrZSBpbiBjaGFyZ2UgU0laIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X3RpbGVfcGFyYW07Ci0gICAgICAgIH0KLQotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9ICBKMktfU1RBVEVfTUg7IC8qIEZJWE1FIEoyS19ERUNfU1RBVEVfTUg7ICovCi0gICAgICAgIG9wal9pbWFnZV9jb21wX2hlYWRlcl91cGRhdGUobF9pbWFnZSxsX2NwKTsKLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9jb20oICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2NvbShvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2NvbW1lbnRfc2l6ZTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3RvdGFsX2NvbV9zaXplOwotICAgICAgICBjb25zdCBPUEpfQ0hBUiAqbF9jb21tZW50OwotICAgICAgICBPUEpfQllURSAqIGxfY3VycmVudF9wdHIgPSAwMDsKKyAgICBPUEpfVUlOVDMyIGxfY29tbWVudF9zaXplOworICAgIE9QSl9VSU5UMzIgbF90b3RhbF9jb21fc2l6ZTsKKyAgICBjb25zdCBPUEpfQ0hBUiAqbF9jb21tZW50OworICAgIE9QSl9CWVRFICogbF9jdXJyZW50X3B0ciA9IDAwOwogCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKIAotICAgICAgICBsX2NvbW1lbnQgPSBwX2oyay0+bV9jcC5jb21tZW50OwotICAgICAgICBsX2NvbW1lbnRfc2l6ZSA9IChPUEpfVUlOVDMyKXN0cmxlbihsX2NvbW1lbnQpOwotICAgICAgICBsX3RvdGFsX2NvbV9zaXplID0gbF9jb21tZW50X3NpemUgKyA2OworICAgIGxfY29tbWVudCA9IHBfajJrLT5tX2NwLmNvbW1lbnQ7CisgICAgbF9jb21tZW50X3NpemUgPSAoT1BKX1VJTlQzMilzdHJsZW4obF9jb21tZW50KTsKKyAgICBsX3RvdGFsX2NvbV9zaXplID0gbF9jb21tZW50X3NpemUgKyA2OwogCi0gICAgICAgIGlmIChsX3RvdGFsX2NvbV9zaXplID4gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfdGlsZV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsIGxfdG90YWxfY29tX3NpemUpOwotICAgICAgICAgICAgICAgIGlmICghIG5ld19oZWFkZXJfdGlsZV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB3cml0ZSB0aGUgQ09NIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gbmV3X2hlYWRlcl90aWxlX2RhdGE7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gbF90b3RhbF9jb21fc2l6ZTsKKyAgICBpZiAobF90b3RhbF9jb21fc2l6ZSA+CisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUpIHsKKyAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfdGlsZV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwgbF90b3RhbF9jb21fc2l6ZSk7CisgICAgICAgIGlmICghIG5ld19oZWFkZXJfdGlsZV9kYXRhKSB7CisgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKTsKKyAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBOVUxMOworICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIG1lbW9yeSB0byB3cml0ZSB0aGUgQ09NIG1hcmtlclxuIik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICB9CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBuZXdfaGVhZGVyX3RpbGVfZGF0YTsKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gbF90b3RhbF9jb21fc2l6ZTsKKyAgICB9CiAKLSAgICAgICAgbF9jdXJyZW50X3B0ciA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGE7CisgICAgbF9jdXJyZW50X3B0ciA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGE7CiAKLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsSjJLX01TX0NPTSAsIDIpOyAgLyogQ09NICovCi0gICAgICAgIGxfY3VycmVudF9wdHIrPTI7CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9wdHIsIEoyS19NU19DT00sIDIpOyAgLyogQ09NICovCisgICAgbF9jdXJyZW50X3B0ciArPSAyOwogCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLGxfdG90YWxfY29tX3NpemUgLSAyICwgMik7ICAgICAgICAvKiBMX0NPTSAqLwotICAgICAgICBsX2N1cnJlbnRfcHRyKz0yOworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfcHRyLCBsX3RvdGFsX2NvbV9zaXplIC0gMiwgMik7ICAgICAgICAvKiBMX0NPTSAqLworICAgIGxfY3VycmVudF9wdHIgKz0gMjsKIAotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X3B0ciwxICwgMik7ICAgLyogR2VuZXJhbCB1c2UgKElTIDg4NTktMTU6MTk5OSAoTGF0aW4pIHZhbHVlcykgKi8KLSAgICAgICAgbF9jdXJyZW50X3B0cis9MjsKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X3B0ciwgMSwKKyAgICAgICAgICAgICAgICAgICAgMik7ICAgLyogR2VuZXJhbCB1c2UgKElTIDg4NTktMTU6MTk5OSAoTGF0aW4pIHZhbHVlcykgKi8KKyAgICBsX2N1cnJlbnRfcHRyICs9IDI7CiAKLSAgICAgICAgbWVtY3B5KCBsX2N1cnJlbnRfcHRyLGxfY29tbWVudCxsX2NvbW1lbnRfc2l6ZSk7CisgICAgbWVtY3B5KGxfY3VycmVudF9wdHIsIGxfY29tbWVudCwgbF9jb21tZW50X3NpemUpOwogCi0gICAgICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSxsX3RvdGFsX2NvbV9zaXplLHBfbWFuYWdlcikgIT0gbF90b3RhbF9jb21fc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwgbF90b3RhbF9jb21fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWFuYWdlcikgIT0gbF90b3RhbF9jb21fc2l6ZSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiAvKioKQEAgLTIzNTYsOTAgKzI1MjUsOTkgQEAKICAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBDT00gbWFya2VyLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9jb20gKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9jb20ob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKLSAgKHZvaWQpcF9oZWFkZXJfc2l6ZTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7CiAKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIE9QSl9VTlVTRUQocF9qMmspOworICAgIE9QSl9VTlVTRUQocF9oZWFkZXJfZGF0YSk7CisgICAgT1BKX1VOVVNFRChwX2hlYWRlcl9zaXplKTsKKyAgICBPUEpfVU5VU0VEKHBfbWFuYWdlcik7CisKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2NvZCggICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2NvZChvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCiB7Ci0gICAgICAgIG9wal9jcF90ICpsX2NwID0gMDA7Ci0gICAgICAgIG9wal90Y3BfdCAqbF90Y3AgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2NvZGVfc2l6ZSxsX3JlbWFpbmluZ19zaXplOwotICAgICAgICBPUEpfQllURSAqIGxfY3VycmVudF9kYXRhID0gMDA7CisgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKKyAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7CisgICAgT1BKX1VJTlQzMiBsX2NvZGVfc2l6ZSwgbF9yZW1haW5pbmdfc2l6ZTsKKyAgICBPUEpfQllURSAqIGxfY3VycmVudF9kYXRhID0gMDA7CiAKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwogCi0gICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKLSAgICAgICAgbF90Y3AgPSAmbF9jcC0+dGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXTsKLSAgICAgICAgbF9jb2RlX3NpemUgPSA5ICsgb3BqX2oya19nZXRfU1BDb2RfU1BDb2Nfc2l6ZShwX2oyayxwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLDApOwotICAgICAgICBsX3JlbWFpbmluZ19zaXplID0gbF9jb2RlX3NpemU7CisgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOworICAgIGxfdGNwID0gJmxfY3AtPnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl07CisgICAgbF9jb2RlX3NpemUgPSA5ICsgb3BqX2oya19nZXRfU1BDb2RfU1BDb2Nfc2l6ZShwX2oyaywKKyAgICAgICAgICAgICAgICAgIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIsIDApOworICAgIGxfcmVtYWluaW5nX3NpemUgPSBsX2NvZGVfc2l6ZTsKIAotICAgICAgICBpZiAobF9jb2RlX3NpemUgPiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUpIHsKLSAgICAgICAgICAgICAgICBPUEpfQllURSAqbmV3X2hlYWRlcl90aWxlX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwgbF9jb2RlX3NpemUpOwotICAgICAgICAgICAgICAgIGlmICghIG5ld19oZWFkZXJfdGlsZV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB3cml0ZSBDT0QgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBuZXdfaGVhZGVyX3RpbGVfZGF0YTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSBsX2NvZGVfc2l6ZTsKKyAgICBpZiAobF9jb2RlX3NpemUgPiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUpIHsKKyAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfdGlsZV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwgbF9jb2RlX3NpemUpOworICAgICAgICBpZiAoISBuZXdfaGVhZGVyX3RpbGVfZGF0YSkgeworICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSk7CisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gTlVMTDsKKyAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gd3JpdGUgQ09EIG1hcmtlclxuIik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICB9CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBuZXdfaGVhZGVyX3RpbGVfZGF0YTsKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gbF9jb2RlX3NpemU7CisgICAgfQogCi0gICAgICAgIGxfY3VycmVudF9kYXRhID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YTsKKyAgICBsX2N1cnJlbnRfZGF0YSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGE7CiAKLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLEoyS19NU19DT0QsMik7ICAgICAgICAgICAvKiBDT0QgKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIEoyS19NU19DT0QsIDIpOyAgICAgICAgICAgLyogQ09EICovCisgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKIAotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF9jb2RlX3NpemUtMiwyKTsgICAgICAgIC8qIExfQ09EICovCi0gICAgICAgIGxfY3VycmVudF9kYXRhICs9IDI7CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLCBsX2NvZGVfc2l6ZSAtIDIsIDIpOyAgICAgIC8qIExfQ09EICovCisgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKIAotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF90Y3AtPmNzdHksMSk7ICAgICAgICAgIC8qIFNjb2QgKi8KLSAgICAgICAgKytsX2N1cnJlbnRfZGF0YTsKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIGxfdGNwLT5jc3R5LCAxKTsgICAgICAgICAgLyogU2NvZCAqLworICAgICsrbF9jdXJyZW50X2RhdGE7CiAKLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfdGNwLT5wcmcsMSk7ICAgICAgICAgICAvKiBTR2NvZCAoQSkgKi8KLSAgICAgICAgKytsX2N1cnJlbnRfZGF0YTsKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIChPUEpfVUlOVDMyKWxfdGNwLT5wcmcsIDEpOyAvKiBTR2NvZCAoQSkgKi8KKyAgICArK2xfY3VycmVudF9kYXRhOwogCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX3RjcC0+bnVtbGF5ZXJzLDIpOyAgICAgLyogU0djb2QgKEIpICovCi0gICAgICAgIGxfY3VycmVudF9kYXRhKz0yOworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgbF90Y3AtPm51bWxheWVycywgMik7ICAgICAvKiBTR2NvZCAoQikgKi8KKyAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwogCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX3RjcC0+bWN0LDEpOyAgICAgICAgICAgLyogU0djb2QgKEMpICovCi0gICAgICAgICsrbF9jdXJyZW50X2RhdGE7CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLCBsX3RjcC0+bWN0LCAxKTsgICAgICAgICAgIC8qIFNHY29kIChDKSAqLworICAgICsrbF9jdXJyZW50X2RhdGE7CiAKLSAgICAgICAgbF9yZW1haW5pbmdfc2l6ZSAtPSA5OworICAgIGxfcmVtYWluaW5nX3NpemUgLT0gOTsKIAotICAgICAgICBpZiAoISBvcGpfajJrX3dyaXRlX1NQQ29kX1NQQ29jKHBfajJrLHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIsMCxsX2N1cnJlbnRfZGF0YSwmbF9yZW1haW5pbmdfc2l6ZSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdyaXRpbmcgQ09EIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIGlmICghIG9wal9qMmtfd3JpdGVfU1BDb2RfU1BDb2MocF9qMmssIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfZGF0YSwgJmxfcmVtYWluaW5nX3NpemUsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdyaXRpbmcgQ09EIG1hcmtlclxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIGlmIChsX3JlbWFpbmluZ19zaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd3JpdGluZyBDT0QgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgaWYgKGxfcmVtYWluaW5nX3NpemUgIT0gMCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd3JpdGluZyBDT0QgbWFya2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLGxfY29kZV9zaXplLHBfbWFuYWdlcikgIT0gbF9jb2RlX3NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsIGxfY29kZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSAhPSBsX2NvZGVfc2l6ZSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiAvKioKQEAgLTI0NDksMjI2ICsyNjI3LDI2MyBAQAogICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPRCBtYXJrZXIuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2NvZCAoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2NvZChvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLSAgICAgICAgLyogbG9vcCAqLwotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF90bXA7Ci0gICAgICAgIG9wal9jcF90ICpsX2NwID0gMDA7Ci0gICAgICAgIG9wal90Y3BfdCAqbF90Y3AgPSAwMDsKLSAgICAgICAgb3BqX2ltYWdlX3QgKmxfaW1hZ2UgPSAwMDsKKyAgICAvKiBsb29wICovCisgICAgT1BKX1VJTlQzMiBpOworICAgIE9QSl9VSU5UMzIgbF90bXA7CisgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKKyAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7CisgICAgb3BqX2ltYWdlX3QgKmxfaW1hZ2UgPSAwMDsKIAotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0gICAgICAgIGxfaW1hZ2UgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlOwotICAgICAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7CisgICAgbF9pbWFnZSA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2U7CisgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOwogCi0gICAgICAgIC8qIElmIHdlIGFyZSBpbiB0aGUgZmlyc3QgdGlsZS1wYXJ0IGhlYWRlciBvZiB0aGUgY3VycmVudCB0aWxlICovCi0gICAgICAgIGxfdGNwID0gKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9UUEgpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfY3AtPnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0gOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcDsKLQkKLSAgICAgICAgLyogT25seSBvbmUgQ09EIHBlciB0aWxlICovCi0gICAgICAgIGlmIChsX3RjcC0+Y29kKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkNPRCBtYXJrZXIgYWxyZWFkeSByZWFkLiBObyBtb3JlIHRoYW4gb25lIENPRCBtYXJrZXIgcGVyIHRpbGUuXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGxfdGNwLT5jb2QgPSAxOwotCQotICAgICAgICAvKiBNYWtlIHN1cmUgcm9vbSBpcyBzdWZmaWNpZW50ICovCi0gICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgNSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIENPRCBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICAvKiBJZiB3ZSBhcmUgaW4gdGhlIGZpcnN0IHRpbGUtcGFydCBoZWFkZXIgb2YgdGhlIGN1cnJlbnQgdGlsZSAqLworICAgIGxfdGNwID0gKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9UUEgpID8KKyAgICAgICAgICAgICZsX2NwLT50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdIDoKKyAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOwogCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdGNwLT5jc3R5LDEpOyAgICAgICAgICAgLyogU2NvZCAqLwotICAgICAgICArK3BfaGVhZGVyX2RhdGE7Ci0gICAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBrbm93IGhvdyB0byBkZWNvZGUgdGhpcyAqLwotICAgICAgICBpZiAoKGxfdGNwLT5jc3R5ICYgfihPUEpfVUlOVDMyKShKMktfQ1BfQ1NUWV9QUlQgfCBKMktfQ1BfQ1NUWV9TT1AgfCBKMktfQ1BfQ1NUWV9FUEgpKSAhPSAwVSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJVbmtub3duIFNjb2QgdmFsdWUgaW4gQ09EIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX3RtcCwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogU0djb2QgKEEpICovCi0gICAgICAgICsrcF9oZWFkZXJfZGF0YTsKLSAgICAgICAgbF90Y3AtPnByZyA9IChPUEpfUFJPR19PUkRFUikgbF90bXA7Ci0gICAgICAgIC8qIE1ha2Ugc3VyZSBwcm9ncmVzc2lvbiBvcmRlciBpcyB2YWxpZCAqLwotICAgICAgICBpZiAobF90Y3AtPnByZyA+IE9QSl9DUFJMICkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJVbmtub3duIHByb2dyZXNzaW9uIG9yZGVyIGluIENPRCBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIGxfdGNwLT5wcmcgPSBPUEpfUFJPR19VTktOT1dOOwotICAgICAgICB9Ci0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdGNwLT5udW1sYXllcnMsMik7ICAgICAgLyogU0djb2QgKEIpICovCi0gICAgICAgIHBfaGVhZGVyX2RhdGErPTI7Ci0JCi0gICAgICAgIGlmICgobF90Y3AtPm51bWxheWVycyA8IDFVKSB8fCAobF90Y3AtPm51bWxheWVycyA+IDY1NTM1VSkpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSW52YWxpZCBudW1iZXIgb2YgbGF5ZXJzIGluIENPRCBtYXJrZXIgOiAlZCBub3QgaW4gcmFuZ2UgWzEtNjU1MzVdXG4iLCBsX3RjcC0+bnVtbGF5ZXJzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgLyogT25seSBvbmUgQ09EIHBlciB0aWxlICovCisgICAgaWYgKGxfdGNwLT5jb2QpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiQ09EIG1hcmtlciBhbHJlYWR5IHJlYWQuIE5vIG1vcmUgdGhhbiBvbmUgQ09EIG1hcmtlciBwZXIgdGlsZS5cbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICBsX3RjcC0+Y29kID0gMTsKIAotICAgICAgICAvKiBJZiB1c2VyIGRpZG4ndCBzZXQgYSBudW1iZXIgbGF5ZXIgdG8gZGVjb2RlIHRha2UgdGhlIG1heCBzcGVjaWZ5IGluIHRoZSBjb2Rlc3RyZWFtLiAqLwotICAgICAgICBpZiAgICAgIChsX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjLm1fbGF5ZXIpIHsKLSAgICAgICAgICAgICAgICBsX3RjcC0+bnVtX2xheWVyc190b19kZWNvZGUgPSBsX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjLm1fbGF5ZXI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbF90Y3AtPm51bV9sYXllcnNfdG9fZGVjb2RlID0gbF90Y3AtPm51bWxheWVyczsKLSAgICAgICAgfQorICAgIC8qIE1ha2Ugc3VyZSByb29tIGlzIHN1ZmZpY2llbnQgKi8KKyAgICBpZiAocF9oZWFkZXJfc2l6ZSA8IDUpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgQ09EIG1hcmtlclxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdGNwLT5tY3QsMSk7ICAgICAgICAgICAgLyogU0djb2QgKEMpICovCi0gICAgICAgICsrcF9oZWFkZXJfZGF0YTsKKyAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAmbF90Y3AtPmNzdHksIDEpOyAgICAgICAgIC8qIFNjb2QgKi8KKyAgICArK3BfaGVhZGVyX2RhdGE7CisgICAgLyogTWFrZSBzdXJlIHdlIGtub3cgaG93IHRvIGRlY29kZSB0aGlzICovCisgICAgaWYgKChsX3RjcC0+Y3N0eSAmIH4oT1BKX1VJTlQzMikoSjJLX0NQX0NTVFlfUFJUIHwgSjJLX0NQX0NTVFlfU09QIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKMktfQ1BfQ1NUWV9FUEgpKSAhPSAwVSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiVW5rbm93biBTY29kIHZhbHVlIGluIENPRCBtYXJrZXJcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAmbF90bXAsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgLyogU0djb2QgKEEpICovCisgICAgKytwX2hlYWRlcl9kYXRhOworICAgIGxfdGNwLT5wcmcgPSAoT1BKX1BST0dfT1JERVIpIGxfdG1wOworICAgIC8qIE1ha2Ugc3VyZSBwcm9ncmVzc2lvbiBvcmRlciBpcyB2YWxpZCAqLworICAgIGlmIChsX3RjcC0+cHJnID4gT1BKX0NQUkwpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiVW5rbm93biBwcm9ncmVzc2lvbiBvcmRlciBpbiBDT0QgbWFya2VyXG4iKTsKKyAgICAgICAgbF90Y3AtPnByZyA9IE9QSl9QUk9HX1VOS05PV047CisgICAgfQorICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsICZsX3RjcC0+bnVtbGF5ZXJzLCAyKTsgICAgLyogU0djb2QgKEIpICovCisgICAgcF9oZWFkZXJfZGF0YSArPSAyOwogCi0gICAgICAgIHBfaGVhZGVyX3NpemUgLT0gNTsKLSAgICAgICAgZm9yICAgICAoaSA9IDA7IGkgPCBsX2ltYWdlLT5udW1jb21wczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgbF90Y3AtPnRjY3BzW2ldLmNzdHkgPSBsX3RjcC0+Y3N0eSAmIEoyS19DQ1BfQ1NUWV9QUlQ7Ci0gICAgICAgIH0KKyAgICBpZiAoKGxfdGNwLT5udW1sYXllcnMgPCAxVSkgfHwgKGxfdGNwLT5udW1sYXllcnMgPiA2NTUzNVUpKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgbnVtYmVyIG9mIGxheWVycyBpbiBDT0QgbWFya2VyIDogJWQgbm90IGluIHJhbmdlIFsxLTY1NTM1XVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBsX3RjcC0+bnVtbGF5ZXJzKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgaWYgKCEgb3BqX2oya19yZWFkX1NQQ29kX1NQQ29jKHBfajJrLDAscF9oZWFkZXJfZGF0YSwmcF9oZWFkZXJfc2l6ZSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgQ09EIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIC8qIElmIHVzZXIgZGlkbid0IHNldCBhIG51bWJlciBsYXllciB0byBkZWNvZGUgdGFrZSB0aGUgbWF4IHNwZWNpZnkgaW4gdGhlIGNvZGVzdHJlYW0uICovCisgICAgaWYgKGxfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWMubV9sYXllcikgeworICAgICAgICBsX3RjcC0+bnVtX2xheWVyc190b19kZWNvZGUgPSBsX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjLm1fbGF5ZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbF90Y3AtPm51bV9sYXllcnNfdG9fZGVjb2RlID0gbF90Y3AtPm51bWxheWVyczsKKyAgICB9CiAKLSAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgIT0gMCkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIENPRCBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAmbF90Y3AtPm1jdCwgMSk7ICAgICAgICAgIC8qIFNHY29kIChDKSAqLworICAgICsrcF9oZWFkZXJfZGF0YTsKIAotICAgICAgICAvKiBBcHBseSB0aGUgY29kaW5nIHN0eWxlIHRvIG90aGVyIGNvbXBvbmVudHMgb2YgdGhlIGN1cnJlbnQgdGlsZSBvciB0aGUgbV9kZWZhdWx0X3RjcCovCi0gICAgICAgIG9wal9qMmtfY29weV90aWxlX2NvbXBvbmVudF9wYXJhbWV0ZXJzKHBfajJrKTsKKyAgICBwX2hlYWRlcl9zaXplIC09IDU7CisgICAgZm9yIChpID0gMDsgaSA8IGxfaW1hZ2UtPm51bWNvbXBzOyArK2kpIHsKKyAgICAgICAgbF90Y3AtPnRjY3BzW2ldLmNzdHkgPSBsX3RjcC0+Y3N0eSAmIEoyS19DQ1BfQ1NUWV9QUlQ7CisgICAgfQogCi0gICAgICAgIC8qIEluZGV4ICovCisgICAgaWYgKCEgb3BqX2oya19yZWFkX1NQQ29kX1NQQ29jKHBfajJrLCAwLCBwX2hlYWRlcl9kYXRhLCAmcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBDT0QgbWFya2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICBpZiAocF9oZWFkZXJfc2l6ZSAhPSAwKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIENPRCBtYXJrZXJcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIC8qIEFwcGx5IHRoZSBjb2Rpbmcgc3R5bGUgdG8gb3RoZXIgY29tcG9uZW50cyBvZiB0aGUgY3VycmVudCB0aWxlIG9yIHRoZSBtX2RlZmF1bHRfdGNwKi8KKyAgICBvcGpfajJrX2NvcHlfdGlsZV9jb21wb25lbnRfcGFyYW1ldGVycyhwX2oyayk7CisKKyAgICAvKiBJbmRleCAqLwogI2lmZGVmIFdJUF9SRU1PVkVfTVNECi0gICAgICAgIGlmIChwX2oyay0+Y3N0cl9pbmZvKSB7Ci0gICAgICAgICAgICAgICAgLypvcGpfY29kZXN0cmVhbV9pbmZvX3QgKmxfY3N0cl9pbmZvID0gcF9qMmstPmNzdHJfaW5mbzsqLwotICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnByb2cgPSBsX3RjcC0+cHJnOwotICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPm51bWxheWVycyA9IGxfdGNwLT5udW1sYXllcnM7Ci0gICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+bnVtZGVjb21wb3MgPSAoT1BKX0lOVDMyKikgb3BqX21hbGxvYyhsX2ltYWdlLT5udW1jb21wcyAqIHNpemVvZihPUEpfVUlOVDMyKSk7Ci0gICAgICAgICAgICAgICAgZm9yICAgICAoaSA9IDA7IGkgPCBsX2ltYWdlLT5udW1jb21wczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT5udW1kZWNvbXBvc1tpXSA9IGxfdGNwLT50Y2Nwc1tpXS5udW1yZXNvbHV0aW9ucyAtIDE7Ci0gICAgICAgICAgICAgICAgfQorICAgIGlmIChwX2oyay0+Y3N0cl9pbmZvKSB7CisgICAgICAgIC8qb3BqX2NvZGVzdHJlYW1faW5mb190ICpsX2NzdHJfaW5mbyA9IHBfajJrLT5jc3RyX2luZm87Ki8KKyAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+cHJvZyA9IGxfdGNwLT5wcmc7CisgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPm51bWxheWVycyA9IGxfdGNwLT5udW1sYXllcnM7CisgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPm51bWRlY29tcG9zID0gKE9QSl9JTlQzMiopIG9wal9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1hZ2UtPm51bWNvbXBzICogc2l6ZW9mKE9QSl9VSU5UMzIpKTsKKyAgICAgICAgaWYgKCFwX2oyay0+Y3N0cl9pbmZvLT5udW1kZWNvbXBvcykgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF9pbWFnZS0+bnVtY29tcHM7ICsraSkgeworICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+bnVtZGVjb21wb3NbaV0gPSBsX3RjcC0+dGNjcHNbaV0ubnVtcmVzb2x1dGlvbnMgLSAxOworICAgICAgICB9CisgICAgfQogI2VuZGlmCiAKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAotI2lmIDAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2NvYyggb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2NvYyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCiB7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9jb2Nfc2l6ZSxsX3JlbWFpbmluZ19zaXplOwotICAgICAgICBPUEpfVUlOVDMyIGxfY29tcF9yb29tOworICAgIE9QSl9VSU5UMzIgbF9jb2Nfc2l6ZSwgbF9yZW1haW5pbmdfc2l6ZTsKKyAgICBPUEpfVUlOVDMyIGxfY29tcF9yb29tOwogCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKIAotICAgICAgICBsX2NvbXBfcm9vbSA9IChwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcyA8PSAyNTYpID8gMSA6IDI7CisgICAgbF9jb21wX3Jvb20gPSAocF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMgPD0gMjU2KSA/IDEgOiAyOwogCi0gICAgICAgIGxfY29jX3NpemUgPSA1ICsgbF9jb21wX3Jvb20gKyBvcGpfajJrX2dldF9TUENvZF9TUENvY19zaXplKHBfajJrLHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIscF9jb21wX25vKTsKKyAgICBsX2NvY19zaXplID0gNSArIGxfY29tcF9yb29tICsgb3BqX2oya19nZXRfU1BDb2RfU1BDb2Nfc2l6ZShwX2oyaywKKyAgICAgICAgICAgICAgICAgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwgcF9jb21wX25vKTsKIAotICAgICAgICBpZiAobF9jb2Nfc2l6ZSA+IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSkgewotICAgICAgICAgICAgICAgIE9QSl9CWVRFICpuZXdfaGVhZGVyX3RpbGVfZGF0YTsKLSAgICAgICAgICAgICAgICAvKnBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgID0gKE9QSl9CWVRFKilvcGpfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jb2Nfc2l6ZSk7Ki8KKyAgICBpZiAobF9jb2Nfc2l6ZSA+IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSkgeworICAgICAgICBPUEpfQllURSAqbmV3X2hlYWRlcl90aWxlX2RhdGE7CisgICAgICAgIC8qcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YQorICAgICAgICAgICAgICAgID0gKE9QSl9CWVRFKilvcGpfcmVhbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBsX2NvY19zaXplKTsqLwogCi0gICAgICAgICAgICAgICAgbmV3X2hlYWRlcl90aWxlX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwgbF9jb2Nfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKCEgbmV3X2hlYWRlcl90aWxlX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHdyaXRlIENPQyBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IG5ld19oZWFkZXJfdGlsZV9kYXRhOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IGxfY29jX3NpemU7CisgICAgICAgIG5ld19oZWFkZXJfdGlsZV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCBsX2NvY19zaXplKTsKKyAgICAgICAgaWYgKCEgbmV3X2hlYWRlcl90aWxlX2RhdGEpIHsKKyAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEpOworICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSAwOworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHdyaXRlIENPQyBtYXJrZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQorICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gbmV3X2hlYWRlcl90aWxlX2RhdGE7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IGxfY29jX3NpemU7CisgICAgfQogCi0gICAgICAgIG9wal9qMmtfd3JpdGVfY29jX2luX21lbW9yeShwX2oyayxwX2NvbXBfbm8scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwmbF9yZW1haW5pbmdfc2l6ZSxwX21hbmFnZXIpOworICAgIG9wal9qMmtfd3JpdGVfY29jX2luX21lbW9yeShwX2oyaywgcF9jb21wX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCAmbF9yZW1haW5pbmdfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKTsKIAotICAgICAgICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHBfc3RyZWFtLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsbF9jb2Nfc2l6ZSxwX21hbmFnZXIpICE9IGxfY29jX3NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsIGxfY29jX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpICE9IGxfY29jX3NpemUpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KLSNlbmRpZgogCi0jaWYgMAotc3RhdGljIHZvaWQgb3BqX2oya193cml0ZV9jb2NfaW5fbWVtb3J5KCAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19jb21wYXJlX2NvYyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2ZpcnN0X2NvbXBfbm8sIE9QSl9VSU5UMzIgcF9zZWNvbmRfY29tcF9ubykKIHsKLSAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKLSAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfY29jX3NpemUsbF9yZW1haW5pbmdfc2l6ZTsKLSAgICAgICAgT1BKX0JZVEUgKiBsX2N1cnJlbnRfZGF0YSA9IDAwOwotICAgICAgICBvcGpfaW1hZ2VfdCAqbF9pbWFnZSA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfY29tcF9yb29tOworICAgIG9wal9jcF90ICpsX2NwID0gTlVMTDsKKyAgICBvcGpfdGNwX3QgKmxfdGNwID0gTlVMTDsKIAotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOwogCi0gICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKLSAgICAgICAgbF90Y3AgPSAmbF9jcC0+dGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXTsKLSAgICAgICAgbF9pbWFnZSA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2U7Ci0gICAgICAgIGxfY29tcF9yb29tID0gKGxfaW1hZ2UtPm51bWNvbXBzIDw9IDI1NikgPyAxIDogMjsKKyAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7CisgICAgbF90Y3AgPSAmbF9jcC0+dGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXTsKIAotICAgICAgICBsX2NvY19zaXplID0gNSArIGxfY29tcF9yb29tICsgb3BqX2oya19nZXRfU1BDb2RfU1BDb2Nfc2l6ZShwX2oyayxwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLHBfY29tcF9ubyk7Ci0gICAgICAgIGxfcmVtYWluaW5nX3NpemUgPSBsX2NvY19zaXplOworICAgIGlmIChsX3RjcC0+dGNjcHNbcF9maXJzdF9jb21wX25vXS5jc3R5ICE9IGxfdGNwLT50Y2Nwc1twX3NlY29uZF9jb21wX25vXS5jc3R5KSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIGxfY3VycmVudF9kYXRhID0gcF9kYXRhOwogCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxKMktfTVNfQ09DLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENPQyAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX2NvY19zaXplLTIsMik7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExfQ09DICovCi0gICAgICAgIGxfY3VycmVudF9kYXRhICs9IDI7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLHBfY29tcF9ubywgbF9jb21wX3Jvb20pOyAgICAgICAgIC8qIENjb2MgKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGErPWxfY29tcF9yb29tOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgbF90Y3AtPnRjY3BzW3BfY29tcF9ub10uY3N0eSwgMSk7ICAgICAgICAgICAgICAgLyogU2NvYyAqLwotICAgICAgICArK2xfY3VycmVudF9kYXRhOwotCi0gICAgICAgIGxfcmVtYWluaW5nX3NpemUgLT0gKDUgKyBsX2NvbXBfcm9vbSk7Ci0gICAgICAgIG9wal9qMmtfd3JpdGVfU1BDb2RfU1BDb2MocF9qMmsscF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwwLGxfY3VycmVudF9kYXRhLCZsX3JlbWFpbmluZ19zaXplLHBfbWFuYWdlcik7Ci0gICAgICAgICogcF9kYXRhX3dyaXR0ZW4gPSBsX2NvY19zaXplOworICAgIHJldHVybiBvcGpfajJrX2NvbXBhcmVfU1BDb2RfU1BDb2MocF9qMmssIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2ZpcnN0X2NvbXBfbm8sIHBfc2Vjb25kX2NvbXBfbm8pOwogfQotI2VuZGlmCisKK3N0YXRpYyB2b2lkIG9wal9qMmtfd3JpdGVfY29jX2luX21lbW9yeShvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICBvcGpfY3BfdCAqbF9jcCA9IDAwOworICAgIG9wal90Y3BfdCAqbF90Y3AgPSAwMDsKKyAgICBPUEpfVUlOVDMyIGxfY29jX3NpemUsIGxfcmVtYWluaW5nX3NpemU7CisgICAgT1BKX0JZVEUgKiBsX2N1cnJlbnRfZGF0YSA9IDAwOworICAgIG9wal9pbWFnZV90ICpsX2ltYWdlID0gMDA7CisgICAgT1BKX1VJTlQzMiBsX2NvbXBfcm9vbTsKKworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOworICAgIGxfdGNwID0gJmxfY3AtPnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl07CisgICAgbF9pbWFnZSA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2U7CisgICAgbF9jb21wX3Jvb20gPSAobF9pbWFnZS0+bnVtY29tcHMgPD0gMjU2KSA/IDEgOiAyOworCisgICAgbF9jb2Nfc2l6ZSA9IDUgKyBsX2NvbXBfcm9vbSArIG9wal9qMmtfZ2V0X1NQQ29kX1NQQ29jX3NpemUocF9qMmssCisgICAgICAgICAgICAgICAgIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIsIHBfY29tcF9ubyk7CisgICAgbF9yZW1haW5pbmdfc2l6ZSA9IGxfY29jX3NpemU7CisKKyAgICBsX2N1cnJlbnRfZGF0YSA9IHBfZGF0YTsKKworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgSjJLX01TX0NPQywKKyAgICAgICAgICAgICAgICAgICAgMik7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENPQyAqLworICAgIGxfY3VycmVudF9kYXRhICs9IDI7CisKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIGxfY29jX3NpemUgLSAyLAorICAgICAgICAgICAgICAgICAgICAyKTsgICAgICAgICAgICAgICAgICAgICAvKiBMX0NPQyAqLworICAgIGxfY3VycmVudF9kYXRhICs9IDI7CisKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIHBfY29tcF9ubywgbF9jb21wX3Jvb20pOyAgICAgICAgLyogQ2NvYyAqLworICAgIGxfY3VycmVudF9kYXRhICs9IGxfY29tcF9yb29tOworCisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLCBsX3RjcC0+dGNjcHNbcF9jb21wX25vXS5jc3R5LAorICAgICAgICAgICAgICAgICAgICAxKTsgICAgICAgICAgICAgICAvKiBTY29jICovCisgICAgKytsX2N1cnJlbnRfZGF0YTsKKworICAgIGxfcmVtYWluaW5nX3NpemUgLT0gKDUgKyBsX2NvbXBfcm9vbSk7CisgICAgb3BqX2oya193cml0ZV9TUENvZF9TUENvYyhwX2oyaywgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9kYXRhLCAmbF9yZW1haW5pbmdfc2l6ZSwgcF9tYW5hZ2VyKTsKKyAgICAqIHBfZGF0YV93cml0dGVuID0gbF9jb2Nfc2l6ZTsKK30KIAogc3RhdGljIE9QSl9VSU5UMzIgb3BqX2oya19nZXRfbWF4X2NvY19zaXplKG9wal9qMmtfdCAqcF9qMmspCiB7Ci0gICAgICAgIE9QSl9VSU5UMzIgaSxqOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfY29tcDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzOwotICAgICAgICBPUEpfVUlOVDMyIGxfbWF4ID0gMDsKKyAgICBPUEpfVUlOVDMyIGksIGo7CisgICAgT1BKX1VJTlQzMiBsX25iX2NvbXA7CisgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzOworICAgIE9QSl9VSU5UMzIgbF9tYXggPSAwOwogCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICAvKiBwcmVjb25kaXRpb25zICovCiAKLSAgICAgICAgbF9uYl90aWxlcyA9IHBfajJrLT5tX2NwLnR3ICogcF9qMmstPm1fY3AudGggOwotICAgICAgICBsX25iX2NvbXAgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wczsKKyAgICBsX25iX3RpbGVzID0gcF9qMmstPm1fY3AudHcgKiBwX2oyay0+bV9jcC50aCA7CisgICAgbF9uYl9jb21wID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHM7CiAKLSAgICAgICAgZm9yIChpPTA7aTxsX25iX3RpbGVzOysraSkgewotICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9uYl9jb21wOysraikgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9tYXggPSBvcGpfdWludF9tYXgobF9tYXgsb3BqX2oya19nZXRfU1BDb2RfU1BDb2Nfc2l6ZShwX2oyayxpLGopKTsKLSAgICAgICAgICAgICAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGxfbmJfdGlsZXM7ICsraSkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbF9uYl9jb21wOyArK2opIHsKKyAgICAgICAgICAgIGxfbWF4ID0gb3BqX3VpbnRfbWF4KGxfbWF4LCBvcGpfajJrX2dldF9TUENvZF9TUENvY19zaXplKHBfajJrLCBpLCBqKSk7CiAgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgcmV0dXJuIDYgKyBsX21heDsKKyAgICByZXR1cm4gNiArIGxfbWF4OwogfQogCiAvKioKQEAgLTI2NzgsMTE0ICsyODkzLDEyNCBAQAogICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIENPQyBtYXJrZXIuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2NvYyAoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2NvYyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLSAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSBOVUxMOwotICAgICAgICBvcGpfdGNwX3QgKmxfdGNwID0gTlVMTDsKLSAgICAgICAgb3BqX2ltYWdlX3QgKmxfaW1hZ2UgPSBOVUxMOwotICAgICAgICBPUEpfVUlOVDMyIGxfY29tcF9yb29tOwotICAgICAgICBPUEpfVUlOVDMyIGxfY29tcF9ubzsKKyAgICBvcGpfY3BfdCAqbF9jcCA9IE5VTEw7CisgICAgb3BqX3RjcF90ICpsX3RjcCA9IE5VTEw7CisgICAgb3BqX2ltYWdlX3QgKmxfaW1hZ2UgPSBOVUxMOworICAgIE9QSl9VSU5UMzIgbF9jb21wX3Jvb207CisgICAgT1BKX1VJTlQzMiBsX2NvbXBfbm87CiAKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7CisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKIAotICAgICAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7Ci0gICAgICAgIGxfdGNwID0gKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9UUEggKSA/IC8qRklYTUUgSjJLX0RFQ19TVEFURV9UUEgqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9jcC0+dGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOwotICAgICAgICBsX2ltYWdlID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZTsKKyAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7CisgICAgbF90Y3AgPSAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX1RQSCkKKyAgICAgICAgICAgID8KKyAgICAgICAgICAgICZsX2NwLT50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdIDoKKyAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOworICAgIGxfaW1hZ2UgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlOwogCi0gICAgICAgIGxfY29tcF9yb29tID0gbF9pbWFnZS0+bnVtY29tcHMgPD0gMjU2ID8gMSA6IDI7CisgICAgbF9jb21wX3Jvb20gPSBsX2ltYWdlLT5udW1jb21wcyA8PSAyNTYgPyAxIDogMjsKIAotICAgICAgICAvKiBtYWtlIHN1cmUgcm9vbSBpcyBzdWZmaWNpZW50Ki8KLSAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCBsX2NvbXBfcm9vbSArIDEpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBDT0MgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIHBfaGVhZGVyX3NpemUgLT0gbF9jb21wX3Jvb20gKyAxOworICAgIC8qIG1ha2Ugc3VyZSByb29tIGlzIHN1ZmZpY2llbnQqLworICAgIGlmIChwX2hlYWRlcl9zaXplIDwgbF9jb21wX3Jvb20gKyAxKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIENPQyBtYXJrZXJcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICBwX2hlYWRlcl9zaXplIC09IGxfY29tcF9yb29tICsgMTsKIAotICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX2NvbXBfbm8sbF9jb21wX3Jvb20pOyAgICAgICAgICAgICAgICAgICAvKiBDY29jICovCi0gICAgICAgIHBfaGVhZGVyX2RhdGEgKz0gbF9jb21wX3Jvb207Ci0gICAgICAgIGlmIChsX2NvbXBfbm8gPj0gbF9pbWFnZS0+bnVtY29tcHMpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBDT0MgbWFya2VyIChiYWQgbnVtYmVyIG9mIGNvbXBvbmVudHMpXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgJmxfY29tcF9ubywKKyAgICAgICAgICAgICAgICAgICBsX2NvbXBfcm9vbSk7ICAgICAgICAgICAgICAgICAvKiBDY29jICovCisgICAgcF9oZWFkZXJfZGF0YSArPSBsX2NvbXBfcm9vbTsKKyAgICBpZiAobF9jb21wX25vID49IGxfaW1hZ2UtPm51bWNvbXBzKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHJlYWRpbmcgQ09DIG1hcmtlciAoYmFkIG51bWJlciBvZiBjb21wb25lbnRzKVxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdGNwLT50Y2Nwc1tsX2NvbXBfbm9dLmNzdHksMSk7ICAgICAgICAgICAgICAgICAgLyogU2NvYyAqLwotICAgICAgICArK3BfaGVhZGVyX2RhdGEgOworICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsICZsX3RjcC0+dGNjcHNbbF9jb21wX25vXS5jc3R5LAorICAgICAgICAgICAgICAgICAgIDEpOyAgICAgICAgICAgICAgICAgIC8qIFNjb2MgKi8KKyAgICArK3BfaGVhZGVyX2RhdGEgOwogCi0gICAgICAgIGlmICghIG9wal9qMmtfcmVhZF9TUENvZF9TUENvYyhwX2oyayxsX2NvbXBfbm8scF9oZWFkZXJfZGF0YSwmcF9oZWFkZXJfc2l6ZSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgQ09DIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIGlmICghIG9wal9qMmtfcmVhZF9TUENvZF9TUENvYyhwX2oyaywgbF9jb21wX25vLCBwX2hlYWRlcl9kYXRhLCAmcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBDT0MgbWFya2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgIT0gMCkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIENPQyBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIGlmIChwX2hlYWRlcl9zaXplICE9IDApIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgQ09DIG1hcmtlclxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfcWNkKCAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9xY2Qob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9xY2Rfc2l6ZSxsX3JlbWFpbmluZ19zaXplOwotICAgICAgICBPUEpfQllURSAqIGxfY3VycmVudF9kYXRhID0gMDA7CisgICAgT1BKX1VJTlQzMiBsX3FjZF9zaXplLCBsX3JlbWFpbmluZ19zaXplOworICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKIAotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CiAKLSAgICAgICAgbF9xY2Rfc2l6ZSA9IDQgKyBvcGpfajJrX2dldF9TUWNkX1NRY2Nfc2l6ZShwX2oyayxwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLDApOwotICAgICAgICBsX3JlbWFpbmluZ19zaXplID0gbF9xY2Rfc2l6ZTsKKyAgICBsX3FjZF9zaXplID0gNCArIG9wal9qMmtfZ2V0X1NRY2RfU1FjY19zaXplKHBfajJrLCBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLAorICAgICAgICAgICAgICAgICAwKTsKKyAgICBsX3JlbWFpbmluZ19zaXplID0gbF9xY2Rfc2l6ZTsKIAotICAgICAgICBpZiAobF9xY2Rfc2l6ZSA+IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSkgewotICAgICAgICAgICAgICAgIE9QSl9CWVRFICpuZXdfaGVhZGVyX3RpbGVfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfcmVhbGxvYyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCBsX3FjZF9zaXplKTsKLSAgICAgICAgICAgICAgICBpZiAoISBuZXdfaGVhZGVyX3RpbGVfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gd3JpdGUgUUNEIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gbmV3X2hlYWRlcl90aWxlX2RhdGE7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gbF9xY2Rfc2l6ZTsKKyAgICBpZiAobF9xY2Rfc2l6ZSA+IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSkgeworICAgICAgICBPUEpfQllURSAqbmV3X2hlYWRlcl90aWxlX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCBsX3FjZF9zaXplKTsKKyAgICAgICAgaWYgKCEgbmV3X2hlYWRlcl90aWxlX2RhdGEpIHsKKyAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEpOworICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSAwOworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHdyaXRlIFFDRCBtYXJrZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQorICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gbmV3X2hlYWRlcl90aWxlX2RhdGE7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IGxfcWNkX3NpemU7CisgICAgfQogCi0gICAgICAgIGxfY3VycmVudF9kYXRhID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YTsKKyAgICBsX2N1cnJlbnRfZGF0YSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGE7CiAKLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLEoyS19NU19RQ0QsMik7ICAgICAgICAgICAvKiBRQ0QgKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIEoyS19NU19RQ0QsIDIpOyAgICAgICAgIC8qIFFDRCAqLworICAgIGxfY3VycmVudF9kYXRhICs9IDI7CiAKLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfcWNkX3NpemUtMiwyKTsgICAgICAgICAvKiBMX1FDRCAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgbF9xY2Rfc2l6ZSAtIDIsIDIpOyAgICAgLyogTF9RQ0QgKi8KKyAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwogCi0gICAgICAgIGxfcmVtYWluaW5nX3NpemUgLT0gNDsKKyAgICBsX3JlbWFpbmluZ19zaXplIC09IDQ7CiAKLSAgICAgICAgaWYgKCEgb3BqX2oya193cml0ZV9TUWNkX1NRY2MocF9qMmsscF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwwLGxfY3VycmVudF9kYXRhLCZsX3JlbWFpbmluZ19zaXplLHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd3JpdGluZyBRQ0QgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgaWYgKCEgb3BqX2oya193cml0ZV9TUWNkX1NRY2MocF9qMmssIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGEsICZsX3JlbWFpbmluZ19zaXplLCBwX21hbmFnZXIpKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3cml0aW5nIFFDRCBtYXJrZXJcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICBpZiAobF9yZW1haW5pbmdfc2l6ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdyaXRpbmcgUUNEIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIGlmIChsX3JlbWFpbmluZ19zaXplICE9IDApIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdyaXRpbmcgUUNEIG1hcmtlclxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0sIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsbF9xY2Rfc2l6ZSxwX21hbmFnZXIpICE9IGxfcWNkX3NpemUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsIGxfcWNkX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpICE9IGxfcWNkX3NpemUpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAogLyoqCkBAIC0yNzk1LDEyOCArMzAyMCwxMzkgQEAKICAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBRQ0QgbWFya2VyLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9xY2QgKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9xY2Qob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CiAKLSAgICAgICAgaWYgKCEgb3BqX2oya19yZWFkX1NRY2RfU1FjYyhwX2oyaywwLHBfaGVhZGVyX2RhdGEsJnBfaGVhZGVyX3NpemUscF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFFDRCBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICBpZiAoISBvcGpfajJrX3JlYWRfU1FjZF9TUWNjKHBfajJrLCAwLCBwX2hlYWRlcl9kYXRhLCAmcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWFuYWdlcikpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUUNEIG1hcmtlclxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIGlmIChwX2hlYWRlcl9zaXplICE9IDApIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBRQ0QgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgaWYgKHBfaGVhZGVyX3NpemUgIT0gMCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBRQ0QgbWFya2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgLyogQXBwbHkgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXJzIHRvIG90aGVyIGNvbXBvbmVudHMgb2YgdGhlIGN1cnJlbnQgdGlsZSBvciB0aGUgbV9kZWZhdWx0X3RjcCAqLwotICAgICAgICBvcGpfajJrX2NvcHlfdGlsZV9xdWFudGl6YXRpb25fcGFyYW1ldGVycyhwX2oyayk7CisgICAgLyogQXBwbHkgdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXJzIHRvIG90aGVyIGNvbXBvbmVudHMgb2YgdGhlIGN1cnJlbnQgdGlsZSBvciB0aGUgbV9kZWZhdWx0X3RjcCAqLworICAgIG9wal9qMmtfY29weV90aWxlX3F1YW50aXphdGlvbl9wYXJhbWV0ZXJzKHBfajJrKTsKIAotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi0jaWYgMAotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfcWNjKCAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfcWNjKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewotICAgICAgICBPUEpfVUlOVDMyIGxfcWNjX3NpemUsbF9yZW1haW5pbmdfc2l6ZTsKKyAgICBPUEpfVUlOVDMyIGxfcWNjX3NpemUsIGxfcmVtYWluaW5nX3NpemU7CiAKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwogCi0gICAgICAgIGxfcWNjX3NpemUgPSA1ICsgb3BqX2oya19nZXRfU1FjZF9TUWNjX3NpemUocF9qMmsscF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcixwX2NvbXBfbm8pOwotICAgICAgICBsX3FjY19zaXplICs9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzIDw9IDI1NiA/IDA6MTsKLSAgICAgICAgbF9yZW1haW5pbmdfc2l6ZSA9IGxfcWNjX3NpemU7CisgICAgbF9xY2Nfc2l6ZSA9IDUgKyBvcGpfajJrX2dldF9TUWNkX1NRY2Nfc2l6ZShwX2oyaywgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwKKyAgICAgICAgICAgICAgICAgcF9jb21wX25vKTsKKyAgICBsX3FjY19zaXplICs9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzIDw9IDI1NiA/IDAgOiAxOworICAgIGxfcmVtYWluaW5nX3NpemUgPSBsX3FjY19zaXplOwogCi0gICAgICAgIGlmIChsX3FjY19zaXplID4gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfdGlsZV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsIGxfcWNjX3NpemUpOwotICAgICAgICAgICAgICAgIGlmICghIG5ld19oZWFkZXJfdGlsZV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB3cml0ZSBRQ0MgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBuZXdfaGVhZGVyX3RpbGVfZGF0YTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSBsX3FjY19zaXplOworICAgIGlmIChsX3FjY19zaXplID4gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplKSB7CisgICAgICAgIE9QSl9CWVRFICpuZXdfaGVhZGVyX3RpbGVfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfcmVhbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsIGxfcWNjX3NpemUpOworICAgICAgICBpZiAoISBuZXdfaGVhZGVyX3RpbGVfZGF0YSkgeworICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSk7CisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gTlVMTDsKKyAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gd3JpdGUgUUNDIG1hcmtlclxuIik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICB9CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBuZXdfaGVhZGVyX3RpbGVfZGF0YTsKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gbF9xY2Nfc2l6ZTsKKyAgICB9CiAKLSAgICAgICAgb3BqX2oya193cml0ZV9xY2NfaW5fbWVtb3J5KHBfajJrLHBfY29tcF9ubyxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCZsX3JlbWFpbmluZ19zaXplLHBfbWFuYWdlcik7CisgICAgb3BqX2oya193cml0ZV9xY2NfaW5fbWVtb3J5KHBfajJrLCBwX2NvbXBfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsICZsX3JlbWFpbmluZ19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpOwogCi0gICAgICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSxsX3FjY19zaXplLHBfbWFuYWdlcikgIT0gbF9xY2Nfc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwgbF9xY2Nfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWFuYWdlcikgIT0gbF9xY2Nfc2l6ZSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQotI2VuZGlmCiAKLSNpZiAwCi1zdGF0aWMgdm9pZCBvcGpfajJrX3dyaXRlX3FjY19pbl9tZW1vcnkoICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19jb21wYXJlX3FjYyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2ZpcnN0X2NvbXBfbm8sIE9QSl9VSU5UMzIgcF9zZWNvbmRfY29tcF9ubykKIHsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3FjY19zaXplLGxfcmVtYWluaW5nX3NpemU7Ci0gICAgICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKKyAgICByZXR1cm4gb3BqX2oya19jb21wYXJlX1NRY2RfU1FjYyhwX2oyaywgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2ZpcnN0X2NvbXBfbm8sIHBfc2Vjb25kX2NvbXBfbm8pOworfQogCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CitzdGF0aWMgdm9pZCBvcGpfajJrX3dyaXRlX3FjY19pbl9tZW1vcnkob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgT1BKX1VJTlQzMiBsX3FjY19zaXplLCBsX3JlbWFpbmluZ19zaXplOworICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKIAotICAgICAgICBsX3FjY19zaXplID0gNiArIG9wal9qMmtfZ2V0X1NRY2RfU1FjY19zaXplKHBfajJrLHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIscF9jb21wX25vKTsKLSAgICAgICAgbF9yZW1haW5pbmdfc2l6ZSA9IGxfcWNjX3NpemU7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CiAKLSAgICAgICAgbF9jdXJyZW50X2RhdGEgPSBwX2RhdGE7CisgICAgbF9xY2Nfc2l6ZSA9IDYgKyBvcGpfajJrX2dldF9TUWNkX1NRY2Nfc2l6ZShwX2oyaywgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwKKyAgICAgICAgICAgICAgICAgcF9jb21wX25vKTsKKyAgICBsX3JlbWFpbmluZ19zaXplID0gbF9xY2Nfc2l6ZTsKIAotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsSjJLX01TX1FDQywyKTsgICAgICAgICAgIC8qIFFDQyAqLworICAgIGxfY3VycmVudF9kYXRhID0gcF9kYXRhOworCisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLCBKMktfTVNfUUNDLCAyKTsgICAgICAgICAvKiBRQ0MgKi8KKyAgICBsX2N1cnJlbnRfZGF0YSArPSAyOworCisgICAgaWYgKHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzIDw9IDI1NikgeworICAgICAgICAtLWxfcWNjX3NpemU7CisKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLCBsX3FjY19zaXplIC0gMiwgMik7ICAgICAvKiBMX1FDQyAqLwogICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwogCi0gICAgICAgIGlmIChwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcyA8PSAyNTYpIHsKLSAgICAgICAgICAgICAgICAtLWxfcWNjX3NpemU7CisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgcF9jb21wX25vLCAxKTsgIC8qIENxY2MgKi8KKyAgICAgICAgKytsX2N1cnJlbnRfZGF0YTsKIAotICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX3FjY19zaXplLTIsMik7ICAgICAgICAgLyogTF9RQ0MgKi8KLSAgICAgICAgICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOworICAgICAgICAvKiBpbiB0aGUgY2FzZSBvbmx5IG9uZSBieXRlIGlzIHN1ZmZpY2llbnQgdGhlIGxhc3QgYnl0ZSBhbGxvY2F0ZWQgaXMgdXNlbGVzcyAtPiBzdGlsbCBkbyAtNiBmb3IgYXZhaWxhYmxlICovCisgICAgICAgIGxfcmVtYWluaW5nX3NpemUgLT0gNjsKKyAgICB9IGVsc2UgeworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIGxfcWNjX3NpemUgLSAyLCAyKTsgICAgIC8qIExfUUNDICovCisgICAgICAgIGxfY3VycmVudF9kYXRhICs9IDI7CiAKLSAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIHBfY29tcF9ubywgMSk7ICAvKiBDcWNjICovCi0gICAgICAgICAgICAgICAgKytsX2N1cnJlbnRfZGF0YTsKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLCBwX2NvbXBfbm8sIDIpOyAgLyogQ3FjYyAqLworICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwogCi0gICAgICAgICAgICAgICAgLyogaW4gdGhlIGNhc2Ugb25seSBvbmUgYnl0ZSBpcyBzdWZmaWNpZW50IHRoZSBsYXN0IGJ5dGUgYWxsb2NhdGVkIGlzIHVzZWxlc3MgLT4gc3RpbGwgZG8gLTYgZm9yIGF2YWlsYWJsZSAqLwotICAgICAgICAgICAgICAgIGxfcmVtYWluaW5nX3NpemUgLT0gNjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF9xY2Nfc2l6ZS0yLDIpOyAgICAgICAgIC8qIExfUUNDICovCi0gICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKKyAgICAgICAgbF9yZW1haW5pbmdfc2l6ZSAtPSA2OworICAgIH0KIAotICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgcF9jb21wX25vLCAyKTsgIC8qIENxY2MgKi8KLSAgICAgICAgICAgICAgICBsX2N1cnJlbnRfZGF0YSs9MjsKKyAgICBvcGpfajJrX3dyaXRlX1NRY2RfU1FjYyhwX2oyaywgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwgcF9jb21wX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9kYXRhLCAmbF9yZW1haW5pbmdfc2l6ZSwgcF9tYW5hZ2VyKTsKIAotICAgICAgICAgICAgICAgIGxfcmVtYWluaW5nX3NpemUgLT0gNjsKLSAgICAgICAgfQotCi0gICAgICAgIG9wal9qMmtfd3JpdGVfU1FjZF9TUWNjKHBfajJrLHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIscF9jb21wX25vLGxfY3VycmVudF9kYXRhLCZsX3JlbWFpbmluZ19zaXplLHBfbWFuYWdlcik7Ci0KLSAgICAgICAgKnBfZGF0YV93cml0dGVuID0gbF9xY2Nfc2l6ZTsKKyAgICAqcF9kYXRhX3dyaXR0ZW4gPSBsX3FjY19zaXplOwogfQotI2VuZGlmCiAKLXN0YXRpYyBPUEpfVUlOVDMyIG9wal9qMmtfZ2V0X21heF9xY2Nfc2l6ZSAob3BqX2oya190ICpwX2oyaykKK3N0YXRpYyBPUEpfVUlOVDMyIG9wal9qMmtfZ2V0X21heF9xY2Nfc2l6ZShvcGpfajJrX3QgKnBfajJrKQogewotICAgICAgICByZXR1cm4gb3BqX2oya19nZXRfbWF4X2NvY19zaXplKHBfajJrKTsKKyAgICByZXR1cm4gb3BqX2oya19nZXRfbWF4X2NvY19zaXplKHBfajJrKTsKIH0KIAogLyoqCkBAIC0yOTI2LDI3MyArMzE2MiwyODkgQEAKICAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBRQ0MgbWFya2VyLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9xY2MoICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9xY2Mob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9udW1fY29tcCxsX2NvbXBfbm87CisgICAgT1BKX1VJTlQzMiBsX251bV9jb21wLCBsX2NvbXBfbm87CiAKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7CisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKIAotICAgICAgICBsX251bV9jb21wID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHM7CisgICAgbF9udW1fY29tcCA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOwogCi0gICAgICAgIGlmIChsX251bV9jb21wIDw9IDI1NikgewotICAgICAgICAgICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUUNDIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX2NvbXBfbm8sMSk7Ci0gICAgICAgICAgICAgICAgKytwX2hlYWRlcl9kYXRhOwotICAgICAgICAgICAgICAgIC0tcF9oZWFkZXJfc2l6ZTsKKyAgICBpZiAobF9udW1fY29tcCA8PSAyNTYpIHsKKyAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAxKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBRQ0MgbWFya2VyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBRQ0MgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfY29tcF9ubywyKTsKLSAgICAgICAgICAgICAgICBwX2hlYWRlcl9kYXRhKz0yOwotICAgICAgICAgICAgICAgIHBfaGVhZGVyX3NpemUtPTI7CisgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsICZsX2NvbXBfbm8sIDEpOworICAgICAgICArK3BfaGVhZGVyX2RhdGE7CisgICAgICAgIC0tcF9oZWFkZXJfc2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAocF9oZWFkZXJfc2l6ZSA8IDIpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFFDQyBtYXJrZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQorICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAmbF9jb21wX25vLCAyKTsKKyAgICAgICAgcF9oZWFkZXJfZGF0YSArPSAyOworICAgICAgICBwX2hlYWRlcl9zaXplIC09IDI7CisgICAgfQogCiAjaWZkZWYgVVNFX0pQV0wKLSAgICAgICAgaWYgKHBfajJrLT5tX2NwLmNvcnJlY3QpIHsKKyAgICBpZiAocF9qMmstPm1fY3AuY29ycmVjdCkgewogCi0gICAgICAgICAgICAgICAgc3RhdGljIE9QSl9VSU5UMzIgYmFja3VwX2NvbXBubyA9IDA7CisgICAgICAgIHN0YXRpYyBPUEpfVUlOVDMyIGJhY2t1cF9jb21wbm8gPSAwOwogCi0gICAgICAgICAgICAgICAgLyogY29tcG5vIGlzIG5lZ2F0aXZlIG9yIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyEhISAqLwotICAgICAgICAgICAgICAgIGlmICgvKihsX2NvbXBfbm8gPCAwKSB8fCovIChsX2NvbXBfbm8gPj0gbF9udW1fY29tcCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKUFdMOiBiYWQgY29tcG9uZW50IG51bWJlciBpbiBRQ0MgKCVkIG91dCBvZiBhIG1heGltdW0gb2YgJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NvbXBfbm8sIGxfbnVtX2NvbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFKUFdMX0FTU1VNRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSlBXTDogZ2l2aW5nIHVwXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIHRyeSB0byBjb3JyZWN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBsX2NvbXBfbm8gPSBiYWNrdXBfY29tcG5vICUgbF9udW1fY29tcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIi0gdHJ5aW5nIHRvIGFkanVzdCB0aGlzXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItIHNldHRpbmcgY29tcG9uZW50IG51bWJlciB0byAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jb21wX25vKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIC8qIGNvbXBubyBpcyBuZWdhdGl2ZSBvciBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMhISEgKi8KKyAgICAgICAgaWYgKC8qKGxfY29tcF9ubyA8IDApIHx8Ki8gKGxfY29tcF9ubyA+PSBsX251bV9jb21wKSkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQV0w6IGJhZCBjb21wb25lbnQgbnVtYmVyIGluIFFDQyAoJWQgb3V0IG9mIGEgbWF4aW11bSBvZiAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY29tcF9ubywgbF9udW1fY29tcCk7CisgICAgICAgICAgICBpZiAoIUpQV0xfQVNTVU1FKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkpQV0w6IGdpdmluZyB1cFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHdlIHRyeSB0byBjb3JyZWN0ICovCisgICAgICAgICAgICBsX2NvbXBfbm8gPSBiYWNrdXBfY29tcG5vICUgbF9udW1fY29tcDsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIi0gdHJ5aW5nIHRvIGFkanVzdCB0aGlzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICItIHNldHRpbmcgY29tcG9uZW50IG51bWJlciB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jb21wX25vKTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgLyoga2VlcCB5b3VyIHByaXZhdGUgY291bnQgb2YgdGlsZXMgKi8KLSAgICAgICAgICAgICAgICBiYWNrdXBfY29tcG5vKys7Ci0gICAgICAgIH07CisgICAgICAgIC8qIGtlZXAgeW91ciBwcml2YXRlIGNvdW50IG9mIHRpbGVzICovCisgICAgICAgIGJhY2t1cF9jb21wbm8rKzsKKyAgICB9OwogI2VuZGlmIC8qIFVTRV9KUFdMICovCiAKLSAgICAgICAgaWYgKGxfY29tcF9ubyA+PSBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcykgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBjb21wb25lbnQgbnVtYmVyOiAlZCwgcmVnYXJkaW5nIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY29tcF9ubywgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICBpZiAobF9jb21wX25vID49IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgY29tcG9uZW50IG51bWJlcjogJWQsIHJlZ2FyZGluZyB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbF9jb21wX25vLCBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcyk7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIGlmICghIG9wal9qMmtfcmVhZF9TUWNkX1NRY2MocF9qMmssbF9jb21wX25vLHBfaGVhZGVyX2RhdGEsJnBfaGVhZGVyX3NpemUscF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFFDQyBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICBpZiAoISBvcGpfajJrX3JlYWRfU1FjZF9TUWNjKHBfajJrLCBsX2NvbXBfbm8sIHBfaGVhZGVyX2RhdGEsICZwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBRQ0MgbWFya2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgIT0gMCkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFFDQyBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICBpZiAocF9oZWFkZXJfc2l6ZSAhPSAwKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFFDQyBtYXJrZXJcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9wb2MoICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3BvYyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX2NvbXA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9wb2M7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9wb2Nfc2l6ZTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3dyaXR0ZW5fc2l6ZSA9IDA7Ci0gICAgICAgIG9wal90Y3BfdCAqbF90Y3AgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3BvY19yb29tOworICAgIE9QSl9VSU5UMzIgbF9uYl9jb21wOworICAgIE9QSl9VSU5UMzIgbF9uYl9wb2M7CisgICAgT1BKX1VJTlQzMiBsX3BvY19zaXplOworICAgIE9QSl9VSU5UMzIgbF93cml0dGVuX3NpemUgPSAwOworICAgIG9wal90Y3BfdCAqbF90Y3AgPSAwMDsKKyAgICBPUEpfVUlOVDMyIGxfcG9jX3Jvb207CiAKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwogCi0gICAgICAgIGxfdGNwID0gJnBfajJrLT5tX2NwLnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl07Ci0gICAgICAgIGxfbmJfY29tcCA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOwotICAgICAgICBsX25iX3BvYyA9IDEgKyBsX3RjcC0+bnVtcG9jczsKKyAgICBsX3RjcCA9ICZwX2oyay0+bV9jcC50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdOworICAgIGxfbmJfY29tcCA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOworICAgIGxfbmJfcG9jID0gMSArIGxfdGNwLT5udW1wb2NzOwogCi0gICAgICAgIGlmIChsX25iX2NvbXAgPD0gMjU2KSB7Ci0gICAgICAgICAgICAgICAgbF9wb2Nfcm9vbSA9IDE7CisgICAgaWYgKGxfbmJfY29tcCA8PSAyNTYpIHsKKyAgICAgICAgbF9wb2Nfcm9vbSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbF9wb2Nfcm9vbSA9IDI7CisgICAgfQorICAgIGxfcG9jX3NpemUgPSA0ICsgKDUgKyAyICogbF9wb2Nfcm9vbSkgKiBsX25iX3BvYzsKKworICAgIGlmIChsX3BvY19zaXplID4gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplKSB7CisgICAgICAgIE9QSl9CWVRFICpuZXdfaGVhZGVyX3RpbGVfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfcmVhbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsIGxfcG9jX3NpemUpOworICAgICAgICBpZiAoISBuZXdfaGVhZGVyX3RpbGVfZGF0YSkgeworICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSk7CisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gTlVMTDsKKyAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gd3JpdGUgUE9DIG1hcmtlclxuIik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGxfcG9jX3Jvb20gPSAyOwotICAgICAgICB9Ci0gICAgICAgIGxfcG9jX3NpemUgPSA0ICsgKDUgKyAyICogbF9wb2Nfcm9vbSkgKiBsX25iX3BvYzsKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IG5ld19oZWFkZXJfdGlsZV9kYXRhOworICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSBsX3BvY19zaXplOworICAgIH0KIAotICAgICAgICBpZiAobF9wb2Nfc2l6ZSA+IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSkgewotICAgICAgICAgICAgICAgIE9QSl9CWVRFICpuZXdfaGVhZGVyX3RpbGVfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfcmVhbGxvYyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCBsX3BvY19zaXplKTsKLSAgICAgICAgICAgICAgICBpZiAoISBuZXdfaGVhZGVyX3RpbGVfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gd3JpdGUgUE9DIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gbmV3X2hlYWRlcl90aWxlX2RhdGE7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gbF9wb2Nfc2l6ZTsKLSAgICAgICAgfQorICAgIG9wal9qMmtfd3JpdGVfcG9jX2luX21lbW9yeShwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwgJmxfd3JpdHRlbl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpOwogCi0gICAgICAgIG9wal9qMmtfd3JpdGVfcG9jX2luX21lbW9yeShwX2oyayxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCZsX3dyaXR0ZW5fc2l6ZSxwX21hbmFnZXIpOworICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCBsX3BvY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSAhPSBsX3BvY19zaXplKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSxsX3BvY19zaXplLHBfbWFuYWdlcikgIT0gbF9wb2Nfc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgdm9pZCBvcGpfajJrX3dyaXRlX3BvY19pbl9tZW1vcnkoICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCitzdGF0aWMgdm9pZCBvcGpfajJrX3dyaXRlX3BvY19pbl9tZW1vcnkob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgT1BKX0JZVEUgKiBsX2N1cnJlbnRfZGF0YSA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfY29tcDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX3BvYzsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3BvY19zaXplOwotICAgICAgICBvcGpfaW1hZ2VfdCAqbF9pbWFnZSA9IDAwOwotICAgICAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7Ci0gICAgICAgIG9wal90Y2NwX3QgKmxfdGNjcCA9IDAwOwotICAgICAgICBvcGpfcG9jX3QgKmxfY3VycmVudF9wb2MgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3BvY19yb29tOworICAgIE9QSl9VSU5UMzIgaTsKKyAgICBPUEpfQllURSAqIGxfY3VycmVudF9kYXRhID0gMDA7CisgICAgT1BKX1VJTlQzMiBsX25iX2NvbXA7CisgICAgT1BKX1VJTlQzMiBsX25iX3BvYzsKKyAgICBPUEpfVUlOVDMyIGxfcG9jX3NpemU7CisgICAgb3BqX2ltYWdlX3QgKmxfaW1hZ2UgPSAwMDsKKyAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7CisgICAgb3BqX3RjY3BfdCAqbF90Y2NwID0gMDA7CisgICAgb3BqX3BvY190ICpsX2N1cnJlbnRfcG9jID0gMDA7CisgICAgT1BKX1VJTlQzMiBsX3BvY19yb29tOwogCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CiAKLSAgICAgICAgbF90Y3AgPSAmcF9qMmstPm1fY3AudGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXTsKLSAgICAgICAgbF90Y2NwID0gJmxfdGNwLT50Y2Nwc1swXTsKLSAgICAgICAgbF9pbWFnZSA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2U7Ci0gICAgICAgIGxfbmJfY29tcCA9IGxfaW1hZ2UtPm51bWNvbXBzOwotICAgICAgICBsX25iX3BvYyA9IDEgKyBsX3RjcC0+bnVtcG9jczsKKyAgICBPUEpfVU5VU0VEKHBfbWFuYWdlcik7CiAKLSAgICAgICAgaWYgKGxfbmJfY29tcCA8PSAyNTYpIHsKLSAgICAgICAgICAgICAgICBsX3BvY19yb29tID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBsX3BvY19yb29tID0gMjsKLSAgICAgICAgfQorICAgIGxfdGNwID0gJnBfajJrLT5tX2NwLnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl07CisgICAgbF90Y2NwID0gJmxfdGNwLT50Y2Nwc1swXTsKKyAgICBsX2ltYWdlID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZTsKKyAgICBsX25iX2NvbXAgPSBsX2ltYWdlLT5udW1jb21wczsKKyAgICBsX25iX3BvYyA9IDEgKyBsX3RjcC0+bnVtcG9jczsKIAotICAgICAgICBsX3BvY19zaXplID0gNCArICg1ICsgMiAqIGxfcG9jX3Jvb20pICogbF9uYl9wb2M7CisgICAgaWYgKGxfbmJfY29tcCA8PSAyNTYpIHsKKyAgICAgICAgbF9wb2Nfcm9vbSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbF9wb2Nfcm9vbSA9IDI7CisgICAgfQogCi0gICAgICAgIGxfY3VycmVudF9kYXRhID0gcF9kYXRhOworICAgIGxfcG9jX3NpemUgPSA0ICsgKDUgKyAyICogbF9wb2Nfcm9vbSkgKiBsX25iX3BvYzsKIAotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsSjJLX01TX1BPQywyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBPQyAgKi8KKyAgICBsX2N1cnJlbnRfZGF0YSA9IHBfZGF0YTsKKworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgSjJLX01TX1BPQywKKyAgICAgICAgICAgICAgICAgICAgMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQT0MgICovCisgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKKworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgbF9wb2Nfc2l6ZSAtIDIsCisgICAgICAgICAgICAgICAgICAgIDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExwb2MgKi8KKyAgICBsX2N1cnJlbnRfZGF0YSArPSAyOworCisgICAgbF9jdXJyZW50X3BvYyA9ICBsX3RjcC0+cG9jczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbF9uYl9wb2M7ICsraSkgeworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIGxfY3VycmVudF9wb2MtPnJlc25vMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUlNwb2NfaSAqLworICAgICAgICArK2xfY3VycmVudF9kYXRhOworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgbF9jdXJyZW50X3BvYy0+Y29tcG5vMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfcG9jX3Jvb20pOyAgICAgICAgICAgICAgLyogQ1Nwb2NfaSAqLworICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSBsX3BvY19yb29tOworCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgbF9jdXJyZW50X3BvYy0+bGF5bm8xLAorICAgICAgICAgICAgICAgICAgICAgICAgMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMWUVwb2NfaSAqLwogICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwogCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX3BvY19zaXplLTIsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTHBvYyAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIGxfY3VycmVudF9wb2MtPnJlc25vMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUkVwb2NfaSAqLworICAgICAgICArK2xfY3VycmVudF9kYXRhOwogCi0gICAgICAgIGxfY3VycmVudF9wb2MgPSAgbF90Y3AtPnBvY3M7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsX25iX3BvYzsgKytpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfY3VycmVudF9wb2MtPnJlc25vMCwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJTcG9jX2kgKi8KLSAgICAgICAgICAgICAgICArK2xfY3VycmVudF9kYXRhOworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIGxfY3VycmVudF9wb2MtPmNvbXBubzEsCisgICAgICAgICAgICAgICAgICAgICAgICBsX3BvY19yb29tKTsgICAgICAgICAgICAgIC8qIENFcG9jX2kgKi8KKyAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gbF9wb2Nfcm9vbTsKIAotICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX2N1cnJlbnRfcG9jLT5jb21wbm8wLGxfcG9jX3Jvb20pOyAgICAgICAgICAgICAgLyogQ1Nwb2NfaSAqLwotICAgICAgICAgICAgICAgIGxfY3VycmVudF9kYXRhKz1sX3BvY19yb29tOworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIChPUEpfVUlOVDMyKWxfY3VycmVudF9wb2MtPnByZywKKyAgICAgICAgICAgICAgICAgICAgICAgIDEpOyAgIC8qIFBwb2NfaSAqLworICAgICAgICArK2xfY3VycmVudF9kYXRhOwogCi0gICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfY3VycmVudF9wb2MtPmxheW5vMSwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExZRXBvY19pICovCi0gICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGErPTI7CisgICAgICAgIC8qIGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIG1heCBsYXllciBhY2NvcmRpbmcgdG8gdGhlIGFjdHVhbCBudW1iZXIgb2YgbGF5ZXJzIGluIHRoZSBmaWxlLCBjb21wb25lbnRzIGFuZCByZXNvbHV0aW9ucyovCisgICAgICAgIGxfY3VycmVudF9wb2MtPmxheW5vMSA9IChPUEpfVUlOVDMyKW9wal9pbnRfbWluKChPUEpfSU5UMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9wb2MtPmxheW5vMSwgKE9QSl9JTlQzMilsX3RjcC0+bnVtbGF5ZXJzKTsKKyAgICAgICAgbF9jdXJyZW50X3BvYy0+cmVzbm8xID0gKE9QSl9VSU5UMzIpb3BqX2ludF9taW4oKE9QSl9JTlQzMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3BvYy0+cmVzbm8xLCAoT1BKX0lOVDMyKWxfdGNjcC0+bnVtcmVzb2x1dGlvbnMpOworICAgICAgICBsX2N1cnJlbnRfcG9jLT5jb21wbm8xID0gKE9QSl9VSU5UMzIpb3BqX2ludF9taW4oKE9QSl9JTlQzMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9wb2MtPmNvbXBubzEsIChPUEpfSU5UMzIpbF9uYl9jb21wKTsKIAotICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX2N1cnJlbnRfcG9jLT5yZXNubzEsMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSRXBvY19pICovCi0gICAgICAgICAgICAgICAgKytsX2N1cnJlbnRfZGF0YTsKKyAgICAgICAgKytsX2N1cnJlbnRfcG9jOworICAgIH0KIAotICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX2N1cnJlbnRfcG9jLT5jb21wbm8xLGxfcG9jX3Jvb20pOyAgICAgICAgICAgICAgLyogQ0Vwb2NfaSAqLwotICAgICAgICAgICAgICAgIGxfY3VycmVudF9kYXRhKz1sX3BvY19yb29tOwotCi0gICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfY3VycmVudF9wb2MtPnByZywxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBwb2NfaSAqLwotICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X2RhdGE7Ci0KLSAgICAgICAgICAgICAgICAvKiBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBtYXggbGF5ZXIgYWNjb3JkaW5nIHRvIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGxheWVycyBpbiB0aGUgZmlsZSwgY29tcG9uZW50cyBhbmQgcmVzb2x1dGlvbnMqLwotICAgICAgICAgICAgICAgIGxfY3VycmVudF9wb2MtPmxheW5vMSA9IChPUEpfVUlOVDMyKW9wal9pbnRfbWluKChPUEpfSU5UMzIpbF9jdXJyZW50X3BvYy0+bGF5bm8xLCAoT1BKX0lOVDMyKWxfdGNwLT5udW1sYXllcnMpOwotICAgICAgICAgICAgICAgIGxfY3VycmVudF9wb2MtPnJlc25vMSA9IChPUEpfVUlOVDMyKW9wal9pbnRfbWluKChPUEpfSU5UMzIpbF9jdXJyZW50X3BvYy0+cmVzbm8xLCAoT1BKX0lOVDMyKWxfdGNjcC0+bnVtcmVzb2x1dGlvbnMpOwotICAgICAgICAgICAgICAgIGxfY3VycmVudF9wb2MtPmNvbXBubzEgPSAoT1BKX1VJTlQzMilvcGpfaW50X21pbigoT1BKX0lOVDMyKWxfY3VycmVudF9wb2MtPmNvbXBubzEsIChPUEpfSU5UMzIpbF9uYl9jb21wKTsKLQotICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X3BvYzsKLSAgICAgICAgfQotCi0gICAgICAgICpwX2RhdGFfd3JpdHRlbiA9IGxfcG9jX3NpemU7CisgICAgKnBfZGF0YV93cml0dGVuID0gbF9wb2Nfc2l6ZTsKIH0KIAogc3RhdGljIE9QSl9VSU5UMzIgb3BqX2oya19nZXRfbWF4X3BvY19zaXplKG9wal9qMmtfdCAqcF9qMmspCiB7Ci0gICAgICAgIG9wal90Y3BfdCAqIGxfdGNwID0gMDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl90aWxlcyA9IDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9tYXhfcG9jID0gMDsKLSAgICAgICAgT1BKX1VJTlQzMiBpOworICAgIG9wal90Y3BfdCAqIGxfdGNwID0gMDA7CisgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzID0gMDsKKyAgICBPUEpfVUlOVDMyIGxfbWF4X3BvYyA9IDA7CisgICAgT1BKX1VJTlQzMiBpOwogCi0gICAgICAgIGxfdGNwID0gcF9qMmstPm1fY3AudGNwczsKLSAgICAgICAgbF9uYl90aWxlcyA9IHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHc7CisgICAgbF90Y3AgPSBwX2oyay0+bV9jcC50Y3BzOworICAgIGxfbmJfdGlsZXMgPSBwX2oyay0+bV9jcC50aCAqIHBfajJrLT5tX2NwLnR3OwogCi0gICAgICAgIGZvciAoaT0wO2k8bF9uYl90aWxlczsrK2kpIHsKLSAgICAgICAgICAgICAgICBsX21heF9wb2MgPSBvcGpfdWludF9tYXgobF9tYXhfcG9jLGxfdGNwLT5udW1wb2NzKTsKLSAgICAgICAgICAgICAgICArK2xfdGNwOwotICAgICAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGxfbmJfdGlsZXM7ICsraSkgeworICAgICAgICBsX21heF9wb2MgPSBvcGpfdWludF9tYXgobF9tYXhfcG9jLCBsX3RjcC0+bnVtcG9jcyk7CisgICAgICAgICsrbF90Y3A7CisgICAgfQogCi0gICAgICAgICsrbF9tYXhfcG9jOworICAgICsrbF9tYXhfcG9jOwogCi0gICAgICAgIHJldHVybiA0ICsgOSAqIGxfbWF4X3BvYzsKKyAgICByZXR1cm4gNCArIDkgKiBsX21heF9wb2M7CiB9CiAKLXN0YXRpYyBPUEpfVUlOVDMyIG9wal9qMmtfZ2V0X21heF90b2Nfc2l6ZSAob3BqX2oya190ICpwX2oyaykKK3N0YXRpYyBPUEpfVUlOVDMyIG9wal9qMmtfZ2V0X21heF90b2Nfc2l6ZShvcGpfajJrX3QgKnBfajJrKQogewotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl90aWxlczsKLSAgICAgICAgT1BKX1VJTlQzMiBsX21heCA9IDA7Ci0gICAgICAgIG9wal90Y3BfdCAqIGxfdGNwID0gMDA7CisgICAgT1BKX1VJTlQzMiBpOworICAgIE9QSl9VSU5UMzIgbF9uYl90aWxlczsKKyAgICBPUEpfVUlOVDMyIGxfbWF4ID0gMDsKKyAgICBvcGpfdGNwX3QgKiBsX3RjcCA9IDAwOwogCi0gICAgICAgIGxfdGNwID0gcF9qMmstPm1fY3AudGNwczsKLSAgICAgICAgbF9uYl90aWxlcyA9IHBfajJrLT5tX2NwLnR3ICogcF9qMmstPm1fY3AudGggOworICAgIGxfdGNwID0gcF9qMmstPm1fY3AudGNwczsKKyAgICBsX25iX3RpbGVzID0gcF9qMmstPm1fY3AudHcgKiBwX2oyay0+bV9jcC50aCA7CiAKLSAgICAgICAgZm9yIChpPTA7aTxsX25iX3RpbGVzOysraSkgewotICAgICAgICAgICAgICAgIGxfbWF4ID0gb3BqX3VpbnRfbWF4KGxfbWF4LGxfdGNwLT5tX25iX3RpbGVfcGFydHMpOworICAgIGZvciAoaSA9IDA7IGkgPCBsX25iX3RpbGVzOyArK2kpIHsKKyAgICAgICAgbF9tYXggPSBvcGpfdWludF9tYXgobF9tYXgsIGxfdGNwLT5tX25iX3RpbGVfcGFydHMpOwogCi0gICAgICAgICAgICAgICAgKytsX3RjcDsKLSAgICAgICAgfQorICAgICAgICArK2xfdGNwOworICAgIH0KIAotICAgICAgICByZXR1cm4gMTIgKiBsX21heDsKKyAgICByZXR1cm4gMTIgKiBsX21heDsKIH0KIAogc3RhdGljIE9QSl9VSU5UMzIgb3BqX2oya19nZXRfc3BlY2lmaWNfaGVhZGVyX3NpemVzKG9wal9qMmtfdCAqcF9qMmspCiB7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9ieXRlcyA9IDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9jb21wczsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2NvY19ieXRlcyxsX3FjY19ieXRlczsKKyAgICBPUEpfVUlOVDMyIGxfbmJfYnl0ZXMgPSAwOworICAgIE9QSl9VSU5UMzIgbF9uYl9jb21wczsKKyAgICBPUEpfVUlOVDMyIGxfY29jX2J5dGVzLCBsX3FjY19ieXRlczsKIAotICAgICAgICBsX25iX2NvbXBzID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMgLSAxOwotICAgICAgICBsX25iX2J5dGVzICs9IG9wal9qMmtfZ2V0X21heF90b2Nfc2l6ZShwX2oyayk7CisgICAgbF9uYl9jb21wcyA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzIC0gMTsKKyAgICBsX25iX2J5dGVzICs9IG9wal9qMmtfZ2V0X21heF90b2Nfc2l6ZShwX2oyayk7CiAKLSAgICAgICAgaWYgKCEoT1BKX0lTX0NJTkVNQShwX2oyay0+bV9jcC5yc2l6KSkpIHsKLSAgICAgICAgICAgICAgICBsX2NvY19ieXRlcyA9IG9wal9qMmtfZ2V0X21heF9jb2Nfc2l6ZShwX2oyayk7Ci0gICAgICAgICAgICAgICAgbF9uYl9ieXRlcyArPSBsX25iX2NvbXBzICogbF9jb2NfYnl0ZXM7CisgICAgaWYgKCEoT1BKX0lTX0NJTkVNQShwX2oyay0+bV9jcC5yc2l6KSkpIHsKKyAgICAgICAgbF9jb2NfYnl0ZXMgPSBvcGpfajJrX2dldF9tYXhfY29jX3NpemUocF9qMmspOworICAgICAgICBsX25iX2J5dGVzICs9IGxfbmJfY29tcHMgKiBsX2NvY19ieXRlczsKIAotICAgICAgICAgICAgICAgIGxfcWNjX2J5dGVzID0gb3BqX2oya19nZXRfbWF4X3FjY19zaXplKHBfajJrKTsKLSAgICAgICAgICAgICAgICBsX25iX2J5dGVzICs9IGxfbmJfY29tcHMgKiBsX3FjY19ieXRlczsKLSAgICAgICAgfQorICAgICAgICBsX3FjY19ieXRlcyA9IG9wal9qMmtfZ2V0X21heF9xY2Nfc2l6ZShwX2oyayk7CisgICAgICAgIGxfbmJfYnl0ZXMgKz0gbF9uYl9jb21wcyAqIGxfcWNjX2J5dGVzOworICAgIH0KIAotICAgICAgICBsX25iX2J5dGVzICs9IG9wal9qMmtfZ2V0X21heF9wb2Nfc2l6ZShwX2oyayk7CisgICAgbF9uYl9ieXRlcyArPSBvcGpfajJrX2dldF9tYXhfcG9jX3NpemUocF9qMmspOwogCi0gICAgICAgIC8qKiogREVWRUxPUEVSIENPUk5FUiwgQWRkIHJvb20gZm9yIHlvdXIgaGVhZGVycyAqKiovCisgICAgLyoqKiBERVZFTE9QRVIgQ09STkVSLCBBZGQgcm9vbSBmb3IgeW91ciBoZWFkZXJzICoqKi8KIAotICAgICAgICByZXR1cm4gbF9uYl9ieXRlczsKKyAgICByZXR1cm4gbF9uYl9ieXRlczsKIH0KIAogLyoqCkBAIC0zMjAzLDg0ICszNDU1LDg3IEBACiAgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUE9DIG1hcmtlci4KICAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcG9jICggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcG9jKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewotICAgICAgICBPUEpfVUlOVDMyIGksIGxfbmJfY29tcCwgbF90bXA7Ci0gICAgICAgIG9wal9pbWFnZV90ICogbF9pbWFnZSA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfb2xkX3BvY19uYiwgbF9jdXJyZW50X3BvY19uYiwgbF9jdXJyZW50X3BvY19yZW1haW5pbmc7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9jaHVua19zaXplLCBsX2NvbXBfcm9vbTsKKyAgICBPUEpfVUlOVDMyIGksIGxfbmJfY29tcCwgbF90bXA7CisgICAgb3BqX2ltYWdlX3QgKiBsX2ltYWdlID0gMDA7CisgICAgT1BKX1VJTlQzMiBsX29sZF9wb2NfbmIsIGxfY3VycmVudF9wb2NfbmIsIGxfY3VycmVudF9wb2NfcmVtYWluaW5nOworICAgIE9QSl9VSU5UMzIgbF9jaHVua19zaXplLCBsX2NvbXBfcm9vbTsKIAotICAgICAgICBvcGpfY3BfdCAqbF9jcCA9IDAwOwotICAgICAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7Ci0gICAgICAgIG9wal9wb2NfdCAqbF9jdXJyZW50X3BvYyA9IDAwOworICAgIG9wal9jcF90ICpsX2NwID0gMDA7CisgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOworICAgIG9wal9wb2NfdCAqbF9jdXJyZW50X3BvYyA9IDAwOwogCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CiAKLSAgICAgICAgbF9pbWFnZSA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2U7Ci0gICAgICAgIGxfbmJfY29tcCA9IGxfaW1hZ2UtPm51bWNvbXBzOwotICAgICAgICBpZiAobF9uYl9jb21wIDw9IDI1NikgewotICAgICAgICAgICAgICAgIGxfY29tcF9yb29tID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBsX2NvbXBfcm9vbSA9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgbF9jaHVua19zaXplID0gNSArIDIgKiBsX2NvbXBfcm9vbTsKLSAgICAgICAgbF9jdXJyZW50X3BvY19uYiA9IHBfaGVhZGVyX3NpemUgLyBsX2NodW5rX3NpemU7Ci0gICAgICAgIGxfY3VycmVudF9wb2NfcmVtYWluaW5nID0gcF9oZWFkZXJfc2l6ZSAlIGxfY2h1bmtfc2l6ZTsKKyAgICBsX2ltYWdlID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZTsKKyAgICBsX25iX2NvbXAgPSBsX2ltYWdlLT5udW1jb21wczsKKyAgICBpZiAobF9uYl9jb21wIDw9IDI1NikgeworICAgICAgICBsX2NvbXBfcm9vbSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbF9jb21wX3Jvb20gPSAyOworICAgIH0KKyAgICBsX2NodW5rX3NpemUgPSA1ICsgMiAqIGxfY29tcF9yb29tOworICAgIGxfY3VycmVudF9wb2NfbmIgPSBwX2hlYWRlcl9zaXplIC8gbF9jaHVua19zaXplOworICAgIGxfY3VycmVudF9wb2NfcmVtYWluaW5nID0gcF9oZWFkZXJfc2l6ZSAlIGxfY2h1bmtfc2l6ZTsKIAotICAgICAgICBpZiAoKGxfY3VycmVudF9wb2NfbmIgPD0gMCkgfHwgKGxfY3VycmVudF9wb2NfcmVtYWluaW5nICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUE9DIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIGlmICgobF9jdXJyZW50X3BvY19uYiA8PSAwKSB8fCAobF9jdXJyZW50X3BvY19yZW1haW5pbmcgIT0gMCkpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUE9DIG1hcmtlclxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKLSAgICAgICAgbF90Y3AgPSAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX1RQSCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9jcC0+dGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOwotICAgICAgICBsX29sZF9wb2NfbmIgPSBsX3RjcC0+UE9DID8gbF90Y3AtPm51bXBvY3MgKyAxIDogMDsKLSAgICAgICAgbF9jdXJyZW50X3BvY19uYiArPSBsX29sZF9wb2NfbmI7CisgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOworICAgIGxfdGNwID0gKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9UUEgpID8KKyAgICAgICAgICAgICZsX2NwLT50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdIDoKKyAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOworICAgIGxfb2xkX3BvY19uYiA9IGxfdGNwLT5QT0MgPyBsX3RjcC0+bnVtcG9jcyArIDEgOiAwOworICAgIGxfY3VycmVudF9wb2NfbmIgKz0gbF9vbGRfcG9jX25iOwogCi0gICAgICAgIGlmKGxfY3VycmVudF9wb2NfbmIgPj0gMzIpCi0gICAgICAgICAgewotICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJUb28gbWFueSBQT0NzICVkXG4iLCBsX2N1cnJlbnRfcG9jX25iKTsKLSAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgIH0KLSAgICAgICAgYXNzZXJ0KGxfY3VycmVudF9wb2NfbmIgPCAzMik7CisgICAgaWYgKGxfY3VycmVudF9wb2NfbmIgPj0gSjJLX01BWF9QT0NTKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJUb28gbWFueSBQT0NzICVkXG4iLCBsX2N1cnJlbnRfcG9jX25iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgLyogbm93IHBvYyBpcyBpbiB1c2UuKi8KLSAgICAgICAgbF90Y3AtPlBPQyA9IDE7CisgICAgLyogbm93IHBvYyBpcyBpbiB1c2UuKi8KKyAgICBsX3RjcC0+UE9DID0gMTsKIAotICAgICAgICBsX2N1cnJlbnRfcG9jID0gJmxfdGNwLT5wb2NzW2xfb2xkX3BvY19uYl07Ci0gICAgICAgIGZvciAgICAgKGkgPSBsX29sZF9wb2NfbmI7IGkgPCBsX2N1cnJlbnRfcG9jX25iOyArK2kpIHsKLSAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCYobF9jdXJyZW50X3BvYy0+cmVzbm8wKSwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUlNwb2NfaSAqLwotICAgICAgICAgICAgICAgICsrcF9oZWFkZXJfZGF0YTsKLSAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCYobF9jdXJyZW50X3BvYy0+Y29tcG5vMCksbF9jb21wX3Jvb20pOyAgICAvKiBDU3BvY19pICovCi0gICAgICAgICAgICAgICAgcF9oZWFkZXJfZGF0YSs9bF9jb21wX3Jvb207Ci0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmKGxfY3VycmVudF9wb2MtPmxheW5vMSksMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExZRXBvY19pICovCi0gICAgICAgICAgICAgICAgLyogbWFrZSBzdXJlIGxheWVyIGVuZCBpcyBpbiBhY2NlcHRhYmxlIGJvdW5kcyAqLwotICAgICAgICAgICAgICAgIGxfY3VycmVudF9wb2MtPmxheW5vMSA9IG9wal91aW50X21pbihsX2N1cnJlbnRfcG9jLT5sYXlubzEsIGxfdGNwLT5udW1sYXllcnMpOwotICAgICAgICAgICAgICAgIHBfaGVhZGVyX2RhdGErPTI7Ci0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmKGxfY3VycmVudF9wb2MtPnJlc25vMSksMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJFcG9jX2kgKi8KLSAgICAgICAgICAgICAgICArK3BfaGVhZGVyX2RhdGE7Ci0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmKGxfY3VycmVudF9wb2MtPmNvbXBubzEpLGxfY29tcF9yb29tKTsgICAgLyogQ0Vwb2NfaSAqLwotICAgICAgICAgICAgICAgIHBfaGVhZGVyX2RhdGErPWxfY29tcF9yb29tOwotICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdG1wLDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHBvY19pICovCi0gICAgICAgICAgICAgICAgKytwX2hlYWRlcl9kYXRhOwotICAgICAgICAgICAgICAgIGxfY3VycmVudF9wb2MtPnByZyA9IChPUEpfUFJPR19PUkRFUikgbF90bXA7Ci0gICAgICAgICAgICAgICAgLyogbWFrZSBzdXJlIGNvbXAgaXMgaW4gYWNjZXB0YWJsZSBib3VuZHMgKi8KLSAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcG9jLT5jb21wbm8xID0gb3BqX3VpbnRfbWluKGxfY3VycmVudF9wb2MtPmNvbXBubzEsIGxfbmJfY29tcCk7Ci0gICAgICAgICAgICAgICAgKytsX2N1cnJlbnRfcG9jOwotICAgICAgICB9CisgICAgbF9jdXJyZW50X3BvYyA9ICZsX3RjcC0+cG9jc1tsX29sZF9wb2NfbmJdOworICAgIGZvciAoaSA9IGxfb2xkX3BvY19uYjsgaSA8IGxfY3VycmVudF9wb2NfbmI7ICsraSkgeworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAmKGxfY3VycmVudF9wb2MtPnJlc25vMCksCisgICAgICAgICAgICAgICAgICAgICAgIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSU3BvY19pICovCisgICAgICAgICsrcF9oZWFkZXJfZGF0YTsKKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgJihsX2N1cnJlbnRfcG9jLT5jb21wbm8wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbF9jb21wX3Jvb20pOyAgLyogQ1Nwb2NfaSAqLworICAgICAgICBwX2hlYWRlcl9kYXRhICs9IGxfY29tcF9yb29tOworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAmKGxfY3VycmVudF9wb2MtPmxheW5vMSksCisgICAgICAgICAgICAgICAgICAgICAgIDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMWUVwb2NfaSAqLworICAgICAgICAvKiBtYWtlIHN1cmUgbGF5ZXIgZW5kIGlzIGluIGFjY2VwdGFibGUgYm91bmRzICovCisgICAgICAgIGxfY3VycmVudF9wb2MtPmxheW5vMSA9IG9wal91aW50X21pbihsX2N1cnJlbnRfcG9jLT5sYXlubzEsIGxfdGNwLT5udW1sYXllcnMpOworICAgICAgICBwX2hlYWRlcl9kYXRhICs9IDI7CisgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsICYobF9jdXJyZW50X3BvYy0+cmVzbm8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJFcG9jX2kgKi8KKyAgICAgICAgKytwX2hlYWRlcl9kYXRhOworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAmKGxfY3VycmVudF9wb2MtPmNvbXBubzEpLAorICAgICAgICAgICAgICAgICAgICAgICBsX2NvbXBfcm9vbSk7ICAvKiBDRXBvY19pICovCisgICAgICAgIHBfaGVhZGVyX2RhdGEgKz0gbF9jb21wX3Jvb207CisgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsICZsX3RtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcG9jX2kgKi8KKyAgICAgICAgKytwX2hlYWRlcl9kYXRhOworICAgICAgICBsX2N1cnJlbnRfcG9jLT5wcmcgPSAoT1BKX1BST0dfT1JERVIpIGxfdG1wOworICAgICAgICAvKiBtYWtlIHN1cmUgY29tcCBpcyBpbiBhY2NlcHRhYmxlIGJvdW5kcyAqLworICAgICAgICBsX2N1cnJlbnRfcG9jLT5jb21wbm8xID0gb3BqX3VpbnRfbWluKGxfY3VycmVudF9wb2MtPmNvbXBubzEsIGxfbmJfY29tcCk7CisgICAgICAgICsrbF9jdXJyZW50X3BvYzsKKyAgICB9CiAKLSAgICAgICAgbF90Y3AtPm51bXBvY3MgPSBsX2N1cnJlbnRfcG9jX25iIC0gMTsKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIGxfdGNwLT5udW1wb2NzID0gbF9jdXJyZW50X3BvY19uYiAtIDE7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiAvKioKQEAgLTMyOTEsMzYgKzM1NDYsMzggQEAKICAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBUTE0gbWFya2VyLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9jcmcgKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9jcmcob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9jb21wOwotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgT1BKX1VJTlQzMiBsX25iX2NvbXA7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0gICAgICAgIGxfbmJfY29tcCA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOworICAgIE9QSl9VTlVTRUQocF9oZWFkZXJfZGF0YSk7CiAKLSAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgIT0gbF9uYl9jb21wICo0KSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgQ1JHIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICAvKiBEbyBub3QgY2FyZSBvZiB0aGlzIGF0IHRoZSBtb21lbnQgc2luY2Ugb25seSBsb2NhbCB2YXJpYWJsZXMgYXJlIHNldCBoZXJlICovCi0gICAgICAgIC8qCi0gICAgICAgIGZvcgotICAgICAgICAgICAgICAgIChpID0gMDsgaSA8IGxfbmJfY29tcDsgKytpKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9YY3JnX2ksMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWGNyZ19pCi0gICAgICAgICAgICAgICAgcF9oZWFkZXJfZGF0YSs9MjsKLSAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX1ljcmdfaSwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBYY3JnX2kKLSAgICAgICAgICAgICAgICBwX2hlYWRlcl9kYXRhKz0yOwotICAgICAgICB9Ci0gICAgICAgICovCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICBsX25iX2NvbXAgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wczsKKworICAgIGlmIChwX2hlYWRlcl9zaXplICE9IGxfbmJfY29tcCAqIDQpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgQ1JHIG1hcmtlclxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIC8qIERvIG5vdCBjYXJlIG9mIHRoaXMgYXQgdGhlIG1vbWVudCBzaW5jZSBvbmx5IGxvY2FsIHZhcmlhYmxlcyBhcmUgc2V0IGhlcmUgKi8KKyAgICAvKgorICAgIGZvcgorICAgICAgICAgICAgKGkgPSAwOyBpIDwgbF9uYl9jb21wOyArK2kpCisgICAgeworICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9YY3JnX2ksMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWGNyZ19pCisgICAgICAgICAgICBwX2hlYWRlcl9kYXRhKz0yOworICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9ZY3JnX2ksMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWGNyZ19pCisgICAgICAgICAgICBwX2hlYWRlcl9kYXRhKz0yOworICAgIH0KKyAgICAqLworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAogLyoqCkBAIC0zMzMxLDUyICszNTg4LDU3IEBACiAgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgVExNIG1hcmtlci4KICAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfdGxtICggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfdGxtKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewotICAgICAgICBPUEpfVUlOVDMyIGxfWnRsbSwgbF9TdGxtLCBsX1NULCBsX1NQLCBsX3RvdF9udW1fdHBfcmVtYWluaW5nLCBsX3F1b3RpZW50LCBsX1B0bG1fc2l6ZTsKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIE9QSl9VSU5UMzIgbF9adGxtLCBsX1N0bG0sIGxfU1QsIGxfU1AsIGxfdG90X251bV90cF9yZW1haW5pbmcsIGxfcXVvdGllbnQsCisgICAgICAgICAgICAgICBsX1B0bG1fc2l6ZTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CiAKLSAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAyKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgVExNIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICBwX2hlYWRlcl9zaXplIC09IDI7CisgICAgT1BKX1VOVVNFRChwX2oyayk7CiAKLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9adGxtLDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWnRsbSAqLwotICAgICAgICArK3BfaGVhZGVyX2RhdGE7Ci0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfU3RsbSwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0bG0gKi8KLSAgICAgICAgKytwX2hlYWRlcl9kYXRhOworICAgIGlmIChwX2hlYWRlcl9zaXplIDwgMikgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBUTE0gbWFya2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgcF9oZWFkZXJfc2l6ZSAtPSAyOwogCi0gICAgICAgIGxfU1QgPSAoKGxfU3RsbSA+PiA0KSAmIDB4Myk7Ci0gICAgICAgIGxfU1AgPSAobF9TdGxtID4+IDYpICYgMHgxOworICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsICZsX1p0bG0sCisgICAgICAgICAgICAgICAgICAgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWnRsbSAqLworICAgICsrcF9oZWFkZXJfZGF0YTsKKyAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAmbF9TdGxtLAorICAgICAgICAgICAgICAgICAgIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0bG0gKi8KKyAgICArK3BfaGVhZGVyX2RhdGE7CiAKLSAgICAgICAgbF9QdGxtX3NpemUgPSAobF9TUCArIDEpICogMjsKLSAgICAgICAgbF9xdW90aWVudCA9IGxfUHRsbV9zaXplICsgbF9TVDsKKyAgICBsX1NUID0gKChsX1N0bG0gPj4gNCkgJiAweDMpOworICAgIGxfU1AgPSAobF9TdGxtID4+IDYpICYgMHgxOwogCi0gICAgICAgIGxfdG90X251bV90cF9yZW1haW5pbmcgPSBwX2hlYWRlcl9zaXplICUgbF9xdW90aWVudDsKKyAgICBsX1B0bG1fc2l6ZSA9IChsX1NQICsgMSkgKiAyOworICAgIGxfcXVvdGllbnQgPSBsX1B0bG1fc2l6ZSArIGxfU1Q7CiAKLSAgICAgICAgaWYgKGxfdG90X251bV90cF9yZW1haW5pbmcgIT0gMCkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFRMTSBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRklYTUUgRG8gbm90IGNhcmUgb2YgdGhpcyBhdCB0aGUgbW9tZW50IHNpbmNlIG9ubHkgbG9jYWwgdmFyaWFibGVzIGFyZSBzZXQgaGVyZSAqLwotICAgICAgICAvKgotICAgICAgICBmb3IKLSAgICAgICAgICAgICAgICAoaSA9IDA7IGkgPCBsX3RvdF9udW1fdHA7ICsraSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfVHRsbV9pLGxfU1QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR0bG1faQotICAgICAgICAgICAgICAgIHBfaGVhZGVyX2RhdGEgKz0gbF9TVDsKLSAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX1B0bG1faSxsX1B0bG1fc2l6ZSk7ICAgICAgICAgICAgLy8gUHRsbV9pCi0gICAgICAgICAgICAgICAgcF9oZWFkZXJfZGF0YSArPSBsX1B0bG1fc2l6ZTsKLSAgICAgICAgfSovCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICBsX3RvdF9udW1fdHBfcmVtYWluaW5nID0gcF9oZWFkZXJfc2l6ZSAlIGxfcXVvdGllbnQ7CisKKyAgICBpZiAobF90b3RfbnVtX3RwX3JlbWFpbmluZyAhPSAwKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFRMTSBtYXJrZXJcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICAvKiBGSVhNRSBEbyBub3QgY2FyZSBvZiB0aGlzIGF0IHRoZSBtb21lbnQgc2luY2Ugb25seSBsb2NhbCB2YXJpYWJsZXMgYXJlIHNldCBoZXJlICovCisgICAgLyoKKyAgICBmb3IKKyAgICAgICAgICAgIChpID0gMDsgaSA8IGxfdG90X251bV90cDsgKytpKQorICAgIHsKKyAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfVHRsbV9pLGxfU1QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR0bG1faQorICAgICAgICAgICAgcF9oZWFkZXJfZGF0YSArPSBsX1NUOworICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9QdGxtX2ksbF9QdGxtX3NpemUpOyAgICAgICAgICAgIC8vIFB0bG1faQorICAgICAgICAgICAgcF9oZWFkZXJfZGF0YSArPSBsX1B0bG1fc2l6ZTsKKyAgICB9Ki8KKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKIC8qKgpAQCAtMzM4Nyw2NiArMzY0OSw2OSBAQAogICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIFRMTSBtYXJrZXIuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3BsbSAoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3BsbShvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7CisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKIAotICAgICAgICBpZiAocF9oZWFkZXJfc2l6ZSA8IDEpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBQTE0gbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIC8qIERvIG5vdCBjYXJlIG9mIHRoaXMgYXQgdGhlIG1vbWVudCBzaW5jZSBvbmx5IGxvY2FsIHZhcmlhYmxlcyBhcmUgc2V0IGhlcmUgKi8KLSAgICAgICAgLyoKLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9acGxtLDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBacGxtCi0gICAgICAgICsrcF9oZWFkZXJfZGF0YTsKLSAgICAgICAgLS1wX2hlYWRlcl9zaXplOworICAgIE9QSl9VTlVTRUQocF9qMmspOworICAgIE9QSl9VTlVTRUQocF9oZWFkZXJfZGF0YSk7CiAKLSAgICAgICAgd2hpbGUKLSAgICAgICAgICAgICAgICAocF9oZWFkZXJfc2l6ZSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX05wbG0sMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOcGxtCi0gICAgICAgICAgICAgICAgKytwX2hlYWRlcl9kYXRhOwotICAgICAgICAgICAgICAgIHBfaGVhZGVyX3NpemUgLT0gKDErbF9OcGxtKTsKLSAgICAgICAgICAgICAgICBpZgotICAgICAgICAgICAgICAgICAgICAgICAgKHBfaGVhZGVyX3NpemUgPCAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFBMTSBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIChpID0gMDsgaSA8IGxfTnBsbTsgKytpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdG1wLDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcGxtX2lqCi0gICAgICAgICAgICAgICAgICAgICAgICArK3BfaGVhZGVyX2RhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIG9ubHkgdGhlIGxhc3Qgc2V2ZW4gYnl0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFja2V0X2xlbiB8PSAobF90bXAgJiAweDdmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsX3RtcCAmIDB4ODApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFja2V0X2xlbiA8PD0gNzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBzdG9yZSBwYWNrZXQgbGVuZ3RoIGFuZCBwcm9jZWVkIHRvIG5leHQgcGFja2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFja2V0X2xlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAobF9wYWNrZXRfbGVuICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUExNIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICovCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICBpZiAocF9oZWFkZXJfc2l6ZSA8IDEpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUExNIG1hcmtlclxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIC8qIERvIG5vdCBjYXJlIG9mIHRoaXMgYXQgdGhlIG1vbWVudCBzaW5jZSBvbmx5IGxvY2FsIHZhcmlhYmxlcyBhcmUgc2V0IGhlcmUgKi8KKyAgICAvKgorICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfWnBsbSwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gWnBsbQorICAgICsrcF9oZWFkZXJfZGF0YTsKKyAgICAtLXBfaGVhZGVyX3NpemU7CisKKyAgICB3aGlsZQorICAgICAgICAgICAgKHBfaGVhZGVyX3NpemUgPiAwKQorICAgIHsKKyAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfTnBsbSwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5wbG0KKyAgICAgICAgICAgICsrcF9oZWFkZXJfZGF0YTsKKyAgICAgICAgICAgIHBfaGVhZGVyX3NpemUgLT0gKDErbF9OcGxtKTsKKyAgICAgICAgICAgIGlmCisgICAgICAgICAgICAgICAgICAgIChwX2hlYWRlcl9zaXplIDwgMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUExNIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcgorICAgICAgICAgICAgICAgICAgICAoaSA9IDA7IGkgPCBsX05wbG07ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF90bXAsMSk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElwbG1faWoKKyAgICAgICAgICAgICAgICAgICAgKytwX2hlYWRlcl9kYXRhOworICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIG9ubHkgdGhlIGxhc3Qgc2V2ZW4gYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgbF9wYWNrZXRfbGVuIHw9IChsX3RtcCAmIDB4N2YpOworICAgICAgICAgICAgICAgICAgICBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsX3RtcCAmIDB4ODApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3BhY2tldF9sZW4gPDw9IDc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyBzdG9yZSBwYWNrZXQgbGVuZ3RoIGFuZCBwcm9jZWVkIHRvIG5leHQgcGFja2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9wYWNrZXRfbGVuID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYKKyAgICAgICAgICAgICAgICAgICAgKGxfcGFja2V0X2xlbiAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBQTE0gbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgIH0KKyAgICAqLworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAogLyoqCkBAIC0zNDU3LDQ4ICszNzIyLDQ5IEBACiAgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgUExUIG1hcmtlci4KICAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcGx0ICggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfcGx0KG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewotICAgICAgICBPUEpfVUlOVDMyIGxfWnBsdCwgbF90bXAsIGxfcGFja2V0X2xlbiA9IDAsIGk7CisgICAgT1BKX1VJTlQzMiBsX1pwbHQsIGxfdG1wLCBsX3BhY2tldF9sZW4gPSAwLCBpOwogCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CiAKLSAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAxKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUExUIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIE9QSl9VTlVTRUQocF9qMmspOwogCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfWnBsdCwxKTsgICAgICAgICAgICAgICAgLyogWnBsdCAqLworICAgIGlmIChwX2hlYWRlcl9zaXplIDwgMSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBQTFQgbWFya2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAmbF9acGx0LCAxKTsgICAgICAgICAgICAgIC8qIFpwbHQgKi8KKyAgICArK3BfaGVhZGVyX2RhdGE7CisgICAgLS1wX2hlYWRlcl9zaXplOworCisgICAgZm9yIChpID0gMDsgaSA8IHBfaGVhZGVyX3NpemU7ICsraSkgeworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAmbF90bXAsIDEpOyAgICAgICAvKiBJcGx0X2lqICovCiAgICAgICAgICsrcF9oZWFkZXJfZGF0YTsKLSAgICAgICAgLS1wX2hlYWRlcl9zaXplOwotCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBwX2hlYWRlcl9zaXplOyArK2kpIHsKLSAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX3RtcCwxKTsgICAgICAgICAvKiBJcGx0X2lqICovCi0gICAgICAgICAgICAgICAgKytwX2hlYWRlcl9kYXRhOwotICAgICAgICAgICAgICAgIC8qIHRha2Ugb25seSB0aGUgbGFzdCBzZXZlbiBieXRlcyAqLwotICAgICAgICAgICAgICAgIGxfcGFja2V0X2xlbiB8PSAobF90bXAgJiAweDdmKTsKLSAgICAgICAgICAgICAgICBpZiAobF90bXAgJiAweDgwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3BhY2tldF9sZW4gPDw9IDc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAvKiB0YWtlIG9ubHkgdGhlIGxhc3Qgc2V2ZW4gYnl0ZXMgKi8KKyAgICAgICAgbF9wYWNrZXRfbGVuIHw9IChsX3RtcCAmIDB4N2YpOworICAgICAgICBpZiAobF90bXAgJiAweDgwKSB7CisgICAgICAgICAgICBsX3BhY2tldF9sZW4gPDw9IDc7CisgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKiBzdG9yZSBwYWNrZXQgbGVuZ3RoIGFuZCBwcm9jZWVkIHRvIG5leHQgcGFja2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBsX3BhY2tldF9sZW4gPSAwOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxfcGFja2V0X2xlbiA9IDA7CiAgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgaWYgKGxfcGFja2V0X2xlbiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUExUIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIGlmIChsX3BhY2tldF9sZW4gIT0gMCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBQTFQgbWFya2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAogLyoqCkBAIC0zNTEwLDc0ICszNzc2LDc2IEBACiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICAqLwogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3BwbSAoCi0JCQkJCQkJCQkJCQkJCQkJCW9wal9qMmtfdCAqcF9qMmssCi0JCQkJCQkJCQkJCQkJCQkJCU9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLQkJCQkJCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotCQkJCQkJCQkJCQkJCQkJCQlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9wcG0oCisgICAgb3BqX2oya190ICpwX2oyaywKKyAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKIHsKLQlvcGpfY3BfdCAqbF9jcCA9IDAwOwotCU9QSl9VSU5UMzIgbF9aX3BwbTsKLQkKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOwotCWFzc2VydChwX2oyayAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0JCi0JLyogV2UgbmVlZCB0byBoYXZlIHRoZSBaX3BwbSBlbGVtZW50ICsgMSBieXRlIG9mIE5wcG0vSXBwbSBhdCBtaW5pbXVtICovCi0JaWYgKHBfaGVhZGVyX3NpemUgPCAyKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFBQTSBtYXJrZXJcbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQkKLQlsX2NwID0gJihwX2oyay0+bV9jcCk7Ci0JbF9jcC0+cHBtID0gMTsKLQkKLQlvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX1pfcHBtLDEpOyAgICAgICAgICAgICAgIC8qIFpfcHBtICovCi0JKytwX2hlYWRlcl9kYXRhOwotCS0tcF9oZWFkZXJfc2l6ZTsKLQkKLQkvKiBjaGVjayBhbGxvY2F0aW9uIG5lZWRlZCAqLwotCWlmIChsX2NwLT5wcG1fbWFya2VycyA9PSBOVUxMKSB7IC8qIGZpcnN0IFBQTSBtYXJrZXIgKi8KLQkJT1BKX1VJTlQzMiBsX25ld0NvdW50ID0gbF9aX3BwbSArIDFVOyAvKiBjYW4ndCBvdmVyZmxvdywgbF9aX3BwbSBpcyBVSU5UOCAqLwotCQlhc3NlcnQobF9jcC0+cHBtX21hcmtlcnNfY291bnQgPT0gMFUpOwotCQkKLQkJbF9jcC0+cHBtX21hcmtlcnMgPSAob3BqX3BweCAqKSBvcGpfY2FsbG9jKGxfbmV3Q291bnQsIHNpemVvZihvcGpfcHB4KSk7Ci0JCWlmIChsX2NwLT5wcG1fbWFya2VycyA9PSBOVUxMKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBQUE0gbWFya2VyXG4iKTsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQkJbF9jcC0+cHBtX21hcmtlcnNfY291bnQgPSBsX25ld0NvdW50OwotCX0gZWxzZSBpZiAobF9jcC0+cHBtX21hcmtlcnNfY291bnQgPD0gbF9aX3BwbSkgewotCQlPUEpfVUlOVDMyIGxfbmV3Q291bnQgPSBsX1pfcHBtICsgMVU7IC8qIGNhbid0IG92ZXJmbG93LCBsX1pfcHBtIGlzIFVJTlQ4ICovCi0JCW9wal9wcHggKm5ld19wcG1fbWFya2VyczsKLQkJbmV3X3BwbV9tYXJrZXJzID0gKG9wal9wcHggKikgb3BqX3JlYWxsb2MobF9jcC0+cHBtX21hcmtlcnMsIGxfbmV3Q291bnQgKiBzaXplb2Yob3BqX3BweCkpOwotCQlpZiAobmV3X3BwbV9tYXJrZXJzID09IE5VTEwpIHsKLQkJCS8qIGNsZWFuIHVwIHRvIGJlIGRvbmUgb24gbF9jcCBkZXN0cnVjdGlvbiAqLwotCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgUFBNIG1hcmtlclxuIik7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0JCWxfY3AtPnBwbV9tYXJrZXJzID0gbmV3X3BwbV9tYXJrZXJzOwotCQltZW1zZXQobF9jcC0+cHBtX21hcmtlcnMgKyBsX2NwLT5wcG1fbWFya2Vyc19jb3VudCwgMCwgKGxfbmV3Q291bnQgLSBsX2NwLT5wcG1fbWFya2Vyc19jb3VudCkgKiBzaXplb2Yob3BqX3BweCkpOwotCQlsX2NwLT5wcG1fbWFya2Vyc19jb3VudCA9IGxfbmV3Q291bnQ7Ci0JfQotCQotCWlmIChsX2NwLT5wcG1fbWFya2Vyc1tsX1pfcHBtXS5tX2RhdGEgIT0gTlVMTCkgewotCQkvKiBjbGVhbiB1cCB0byBiZSBkb25lIG9uIGxfY3AgZGVzdHJ1Y3Rpb24gKi8KLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlpwcG0gJXUgYWxyZWFkeSByZWFkXG4iLCBsX1pfcHBtKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0JCi0JbF9jcC0+cHBtX21hcmtlcnNbbF9aX3BwbV0ubV9kYXRhID0gb3BqX21hbGxvYyhwX2hlYWRlcl9zaXplKTsKLQlpZiAobF9jcC0+cHBtX21hcmtlcnNbbF9aX3BwbV0ubV9kYXRhID09IE5VTEwpIHsKLQkJLyogY2xlYW4gdXAgdG8gYmUgZG9uZSBvbiBsX2NwIGRlc3RydWN0aW9uICovCi0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFBQTSBtYXJrZXJcbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQlsX2NwLT5wcG1fbWFya2Vyc1tsX1pfcHBtXS5tX2RhdGFfc2l6ZSA9IHBfaGVhZGVyX3NpemU7Ci0JbWVtY3B5KGxfY3AtPnBwbV9tYXJrZXJzW2xfWl9wcG1dLm1fZGF0YSwgcF9oZWFkZXJfZGF0YSwgcF9oZWFkZXJfc2l6ZSk7CisgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKKyAgICBPUEpfVUlOVDMyIGxfWl9wcG07CiAKLQlyZXR1cm4gT1BKX1RSVUU7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisgICAgLyogV2UgbmVlZCB0byBoYXZlIHRoZSBaX3BwbSBlbGVtZW50ICsgMSBieXRlIG9mIE5wcG0vSXBwbSBhdCBtaW5pbXVtICovCisgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAyKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFBQTSBtYXJrZXJcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKKyAgICBsX2NwLT5wcG0gPSAxOworCisgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgJmxfWl9wcG0sIDEpOyAgICAgICAgICAgICAvKiBaX3BwbSAqLworICAgICsrcF9oZWFkZXJfZGF0YTsKKyAgICAtLXBfaGVhZGVyX3NpemU7CisKKyAgICAvKiBjaGVjayBhbGxvY2F0aW9uIG5lZWRlZCAqLworICAgIGlmIChsX2NwLT5wcG1fbWFya2VycyA9PSBOVUxMKSB7IC8qIGZpcnN0IFBQTSBtYXJrZXIgKi8KKyAgICAgICAgT1BKX1VJTlQzMiBsX25ld0NvdW50ID0gbF9aX3BwbSArIDFVOyAvKiBjYW4ndCBvdmVyZmxvdywgbF9aX3BwbSBpcyBVSU5UOCAqLworICAgICAgICBhc3NlcnQobF9jcC0+cHBtX21hcmtlcnNfY291bnQgPT0gMFUpOworCisgICAgICAgIGxfY3AtPnBwbV9tYXJrZXJzID0gKG9wal9wcHggKikgb3BqX2NhbGxvYyhsX25ld0NvdW50LCBzaXplb2Yob3BqX3BweCkpOworICAgICAgICBpZiAobF9jcC0+cHBtX21hcmtlcnMgPT0gTlVMTCkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgUFBNIG1hcmtlclxuIik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGxfY3AtPnBwbV9tYXJrZXJzX2NvdW50ID0gbF9uZXdDb3VudDsKKyAgICB9IGVsc2UgaWYgKGxfY3AtPnBwbV9tYXJrZXJzX2NvdW50IDw9IGxfWl9wcG0pIHsKKyAgICAgICAgT1BKX1VJTlQzMiBsX25ld0NvdW50ID0gbF9aX3BwbSArIDFVOyAvKiBjYW4ndCBvdmVyZmxvdywgbF9aX3BwbSBpcyBVSU5UOCAqLworICAgICAgICBvcGpfcHB4ICpuZXdfcHBtX21hcmtlcnM7CisgICAgICAgIG5ld19wcG1fbWFya2VycyA9IChvcGpfcHB4ICopIG9wal9yZWFsbG9jKGxfY3AtPnBwbV9tYXJrZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsX25ld0NvdW50ICogc2l6ZW9mKG9wal9wcHgpKTsKKyAgICAgICAgaWYgKG5ld19wcG1fbWFya2VycyA9PSBOVUxMKSB7CisgICAgICAgICAgICAvKiBjbGVhbiB1cCB0byBiZSBkb25lIG9uIGxfY3AgZGVzdHJ1Y3Rpb24gKi8KKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFBQTSBtYXJrZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBsX2NwLT5wcG1fbWFya2VycyA9IG5ld19wcG1fbWFya2VyczsKKyAgICAgICAgbWVtc2V0KGxfY3AtPnBwbV9tYXJrZXJzICsgbF9jcC0+cHBtX21hcmtlcnNfY291bnQsIDAsCisgICAgICAgICAgICAgICAobF9uZXdDb3VudCAtIGxfY3AtPnBwbV9tYXJrZXJzX2NvdW50KSAqIHNpemVvZihvcGpfcHB4KSk7CisgICAgICAgIGxfY3AtPnBwbV9tYXJrZXJzX2NvdW50ID0gbF9uZXdDb3VudDsKKyAgICB9CisKKyAgICBpZiAobF9jcC0+cHBtX21hcmtlcnNbbF9aX3BwbV0ubV9kYXRhICE9IE5VTEwpIHsKKyAgICAgICAgLyogY2xlYW4gdXAgdG8gYmUgZG9uZSBvbiBsX2NwIGRlc3RydWN0aW9uICovCisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJacHBtICV1IGFscmVhZHkgcmVhZFxuIiwgbF9aX3BwbSk7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgbF9jcC0+cHBtX21hcmtlcnNbbF9aX3BwbV0ubV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9tYWxsb2MocF9oZWFkZXJfc2l6ZSk7CisgICAgaWYgKGxfY3AtPnBwbV9tYXJrZXJzW2xfWl9wcG1dLm1fZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIC8qIGNsZWFuIHVwIHRvIGJlIGRvbmUgb24gbF9jcCBkZXN0cnVjdGlvbiAqLworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBQUE0gbWFya2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgbF9jcC0+cHBtX21hcmtlcnNbbF9aX3BwbV0ubV9kYXRhX3NpemUgPSBwX2hlYWRlcl9zaXplOworICAgIG1lbWNweShsX2NwLT5wcG1fbWFya2Vyc1tsX1pfcHBtXS5tX2RhdGEsIHBfaGVhZGVyX2RhdGEsIHBfaGVhZGVyX3NpemUpOworCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiAvKioKQEAgLTM1ODYsMTM1ICszODU0LDEzNiBAQAogICogQHBhcmFtICAgICAgIHBfY3AgICAgICBtYWluIGNvZGluZyBwYXJhbWV0ZXJzLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19tZXJnZV9wcG0gKCBvcGpfY3BfdCAqcF9jcCwgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX21lcmdlX3BwbShvcGpfY3BfdCAqcF9jcCwgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQogewotCU9QSl9VSU5UMzIgaSwgbF9wcG1fZGF0YV9zaXplLCBsX05fcHBtX3JlbWFpbmluZzsKLQkKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KHBfY3AgIT0gMDApOwotCWFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCWFzc2VydChwX2NwLT5wcG1fYnVmZmVyID09IE5VTEwpOwotCQotCWlmIChwX2NwLT5wcG0gPT0gMFUpIHsKLQkJcmV0dXJuIE9QSl9UUlVFOwotCX0KLQkKLQlsX3BwbV9kYXRhX3NpemUgPSAwVTsKLQlsX05fcHBtX3JlbWFpbmluZyA9IDBVOwotCWZvciAoaSA9IDBVOyBpIDwgcF9jcC0+cHBtX21hcmtlcnNfY291bnQ7ICsraSkgewotCQlpZiAocF9jcC0+cHBtX21hcmtlcnNbaV0ubV9kYXRhICE9IE5VTEwpIHsgLyogc3RhbmRhcmQgZG9lc24ndCBzZWVtIHRvIHJlcXVpcmUgY29udGlndW91cyBacHBtICovCi0JCQlPUEpfVUlOVDMyIGxfTl9wcG07Ci0JCQlPUEpfVUlOVDMyIGxfZGF0YV9zaXplID0gcF9jcC0+cHBtX21hcmtlcnNbaV0ubV9kYXRhX3NpemU7Ci0JCQljb25zdCBPUEpfQllURSogbF9kYXRhID0gcF9jcC0+cHBtX21hcmtlcnNbaV0ubV9kYXRhOwotCQkJCi0JCQlpZiAobF9OX3BwbV9yZW1haW5pbmcgPj0gbF9kYXRhX3NpemUpIHsKLQkJCQlsX05fcHBtX3JlbWFpbmluZyAtPSBsX2RhdGFfc2l6ZTsKLQkJCQlsX2RhdGFfc2l6ZSA9IDBVOwotCQkJfSBlbHNlIHsKLQkJCQlsX2RhdGEgKz0gbF9OX3BwbV9yZW1haW5pbmc7Ci0JCQkJbF9kYXRhX3NpemUgLT0gbF9OX3BwbV9yZW1haW5pbmc7Ci0JCQkJbF9OX3BwbV9yZW1haW5pbmcgPSAwVTsKLQkJCX0KLQkJCQotCQkJaWYgKGxfZGF0YV9zaXplID4gMFUpIHsKLQkJCQlkbwotCQkJCXsKLQkJCQkJLyogcmVhZCBOcHBtICovCi0JCQkJCWlmIChsX2RhdGFfc2l6ZSA8IDRVKSB7Ci0JCQkJCQkvKiBjbGVhbiB1cCB0byBiZSBkb25lIG9uIGxfY3AgZGVzdHJ1Y3Rpb24gKi8KLQkJCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIGJ5dGVzIHRvIHJlYWQgTnBwbVxuIik7Ci0JCQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJCQl9Ci0JCQkJCW9wal9yZWFkX2J5dGVzKGxfZGF0YSwgJmxfTl9wcG0sIDQpOwotCQkJCQlsX2RhdGErPTQ7Ci0JCQkJCWxfZGF0YV9zaXplLT00OwotCQkJCQlsX3BwbV9kYXRhX3NpemUgKz0gbF9OX3BwbTsgLyogY2FuJ3Qgb3ZlcmZsb3csIG1heCAyNTYgbWFya2VycyBvZiBtYXggNjU1MzYgYnl0ZXMsIHRoYXQgaXMgd2hlbiBQUE0gbWFya2VycyBhcmUgbm90IGNvcnJ1cHRlZCB3aGljaCBpcyBjaGVja2VkIGVsc2V3aGVyZSAqLwotCQkJCQkKLQkJCQkJaWYgKGxfZGF0YV9zaXplID49IGxfTl9wcG0pIHsKLQkJCQkJCWxfZGF0YV9zaXplIC09IGxfTl9wcG07Ci0JCQkJCQlsX2RhdGEgKz0gbF9OX3BwbTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWxfTl9wcG1fcmVtYWluaW5nID0gbF9OX3BwbSAtIGxfZGF0YV9zaXplOwotCQkJCQkJbF9kYXRhX3NpemUgPSAwVTsKLQkJCQkJfQotCQkJCX0gd2hpbGUgKGxfZGF0YV9zaXplID4gMFUpOwotCQkJfQotCQl9Ci0JfQotCQotCWlmIChsX05fcHBtX3JlbWFpbmluZyAhPSAwVSkgewotCQkvKiBjbGVhbiB1cCB0byBiZSBkb25lIG9uIGxfY3AgZGVzdHJ1Y3Rpb24gKi8KLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkNvcnJ1cHRlZCBQUE0gbWFya2Vyc1xuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCQotCXBfY3AtPnBwbV9idWZmZXIgPSAoT1BKX0JZVEUgKikgb3BqX21hbGxvYyhsX3BwbV9kYXRhX3NpemUpOwotCWlmIChwX2NwLT5wcG1fYnVmZmVyID09IDAwKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFBQTSBtYXJrZXJcbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQlwX2NwLT5wcG1fbGVuID0gbF9wcG1fZGF0YV9zaXplOwotCWxfcHBtX2RhdGFfc2l6ZSA9IDBVOwotCWxfTl9wcG1fcmVtYWluaW5nID0gMFU7Ci0JZm9yIChpID0gMFU7IGkgPCBwX2NwLT5wcG1fbWFya2Vyc19jb3VudDsgKytpKSB7Ci0JCWlmIChwX2NwLT5wcG1fbWFya2Vyc1tpXS5tX2RhdGEgIT0gTlVMTCkgeyAvKiBzdGFuZGFyZCBkb2Vzbid0IHNlZW0gdG8gcmVxdWlyZSBjb250aWd1b3VzIFpwcG0gKi8KLQkJCU9QSl9VSU5UMzIgbF9OX3BwbTsKLQkJCU9QSl9VSU5UMzIgbF9kYXRhX3NpemUgPSBwX2NwLT5wcG1fbWFya2Vyc1tpXS5tX2RhdGFfc2l6ZTsKLQkJCWNvbnN0IE9QSl9CWVRFKiBsX2RhdGEgPSBwX2NwLT5wcG1fbWFya2Vyc1tpXS5tX2RhdGE7Ci0JCQkKLQkJCWlmIChsX05fcHBtX3JlbWFpbmluZyA+PSBsX2RhdGFfc2l6ZSkgewotCQkJCW1lbWNweShwX2NwLT5wcG1fYnVmZmVyICsgbF9wcG1fZGF0YV9zaXplLCBsX2RhdGEsIGxfZGF0YV9zaXplKTsKLQkJCQlsX3BwbV9kYXRhX3NpemUgKz0gbF9kYXRhX3NpemU7Ci0JCQkJbF9OX3BwbV9yZW1haW5pbmcgLT0gbF9kYXRhX3NpemU7Ci0JCQkJbF9kYXRhX3NpemUgPSAwVTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWVtY3B5KHBfY3AtPnBwbV9idWZmZXIgKyBsX3BwbV9kYXRhX3NpemUsIGxfZGF0YSwgbF9OX3BwbV9yZW1haW5pbmcpOwotCQkJCWxfcHBtX2RhdGFfc2l6ZSArPSBsX05fcHBtX3JlbWFpbmluZzsKLQkJCQlsX2RhdGEgKz0gbF9OX3BwbV9yZW1haW5pbmc7Ci0JCQkJbF9kYXRhX3NpemUgLT0gbF9OX3BwbV9yZW1haW5pbmc7Ci0JCQkJbF9OX3BwbV9yZW1haW5pbmcgPSAwVTsKLQkJCX0KKyAgICBPUEpfVUlOVDMyIGksIGxfcHBtX2RhdGFfc2l6ZSwgbF9OX3BwbV9yZW1haW5pbmc7CiAKLQkJCWlmIChsX2RhdGFfc2l6ZSA+IDBVKSB7Ci0JCQkJZG8KLQkJCQl7Ci0JCQkJCS8qIHJlYWQgTnBwbSAqLwotCQkJCQlpZiAobF9kYXRhX3NpemUgPCA0VSkgewotCQkJCQkJLyogY2xlYW4gdXAgdG8gYmUgZG9uZSBvbiBsX2NwIGRlc3RydWN0aW9uICovCi0JCQkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBieXRlcyB0byByZWFkIE5wcG1cbiIpOwotCQkJCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJCQkJfQotCQkJCQlvcGpfcmVhZF9ieXRlcyhsX2RhdGEsICZsX05fcHBtLCA0KTsKLQkJCQkJbF9kYXRhKz00OwotCQkJCQlsX2RhdGFfc2l6ZS09NDsKLQkJCQkJCi0JCQkJCWlmIChsX2RhdGFfc2l6ZSA+PSBsX05fcHBtKSB7Ci0JCQkJCQltZW1jcHkocF9jcC0+cHBtX2J1ZmZlciArIGxfcHBtX2RhdGFfc2l6ZSwgbF9kYXRhLCBsX05fcHBtKTsKLQkJCQkJCWxfcHBtX2RhdGFfc2l6ZSArPSBsX05fcHBtOwotCQkJCQkJbF9kYXRhX3NpemUgLT0gbF9OX3BwbTsKLQkJCQkJCWxfZGF0YSArPSBsX05fcHBtOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbWVtY3B5KHBfY3AtPnBwbV9idWZmZXIgKyBsX3BwbV9kYXRhX3NpemUsIGxfZGF0YSwgbF9kYXRhX3NpemUpOwotCQkJCQkJbF9wcG1fZGF0YV9zaXplICs9IGxfZGF0YV9zaXplOwotCQkJCQkJbF9OX3BwbV9yZW1haW5pbmcgPSBsX05fcHBtIC0gbF9kYXRhX3NpemU7Ci0JCQkJCQlsX2RhdGFfc2l6ZSA9IDBVOwotCQkJCQl9Ci0JCQkJfSB3aGlsZSAobF9kYXRhX3NpemUgPiAwVSk7Ci0JCQl9Ci0JCQlvcGpfZnJlZShwX2NwLT5wcG1fbWFya2Vyc1tpXS5tX2RhdGEpOwotCQkJcF9jcC0+cHBtX21hcmtlcnNbaV0ubV9kYXRhID0gTlVMTDsKLQkJCXBfY3AtPnBwbV9tYXJrZXJzW2ldLm1fZGF0YV9zaXplID0gMFU7Ci0JCX0KLQl9Ci0JCi0JcF9jcC0+cHBtX2RhdGEgPSBwX2NwLT5wcG1fYnVmZmVyOwotCXBfY3AtPnBwbV9kYXRhX3NpemUgPSBwX2NwLT5wcG1fbGVuOwotCQotCXBfY3AtPnBwbV9tYXJrZXJzX2NvdW50ID0gMFU7Ci0Jb3BqX2ZyZWUocF9jcC0+cHBtX21hcmtlcnMpOwotCXBfY3AtPnBwbV9tYXJrZXJzID0gTlVMTDsKLQkKLQlyZXR1cm4gT1BKX1RSVUU7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2NwICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICBhc3NlcnQocF9jcC0+cHBtX2J1ZmZlciA9PSBOVUxMKTsKKworICAgIGlmIChwX2NwLT5wcG0gPT0gMFUpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIH0KKworICAgIGxfcHBtX2RhdGFfc2l6ZSA9IDBVOworICAgIGxfTl9wcG1fcmVtYWluaW5nID0gMFU7CisgICAgZm9yIChpID0gMFU7IGkgPCBwX2NwLT5wcG1fbWFya2Vyc19jb3VudDsgKytpKSB7CisgICAgICAgIGlmIChwX2NwLT5wcG1fbWFya2Vyc1tpXS5tX2RhdGEgIT0KKyAgICAgICAgICAgICAgICBOVUxMKSB7IC8qIHN0YW5kYXJkIGRvZXNuJ3Qgc2VlbSB0byByZXF1aXJlIGNvbnRpZ3VvdXMgWnBwbSAqLworICAgICAgICAgICAgT1BKX1VJTlQzMiBsX05fcHBtOworICAgICAgICAgICAgT1BKX1VJTlQzMiBsX2RhdGFfc2l6ZSA9IHBfY3AtPnBwbV9tYXJrZXJzW2ldLm1fZGF0YV9zaXplOworICAgICAgICAgICAgY29uc3QgT1BKX0JZVEUqIGxfZGF0YSA9IHBfY3AtPnBwbV9tYXJrZXJzW2ldLm1fZGF0YTsKKworICAgICAgICAgICAgaWYgKGxfTl9wcG1fcmVtYWluaW5nID49IGxfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgbF9OX3BwbV9yZW1haW5pbmcgLT0gbF9kYXRhX3NpemU7CisgICAgICAgICAgICAgICAgbF9kYXRhX3NpemUgPSAwVTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbF9kYXRhICs9IGxfTl9wcG1fcmVtYWluaW5nOworICAgICAgICAgICAgICAgIGxfZGF0YV9zaXplIC09IGxfTl9wcG1fcmVtYWluaW5nOworICAgICAgICAgICAgICAgIGxfTl9wcG1fcmVtYWluaW5nID0gMFU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsX2RhdGFfc2l6ZSA+IDBVKSB7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAvKiByZWFkIE5wcG0gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxfZGF0YV9zaXplIDwgNFUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFuIHVwIHRvIGJlIGRvbmUgb24gbF9jcCBkZXN0cnVjdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggYnl0ZXMgdG8gcmVhZCBOcHBtXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMobF9kYXRhLCAmbF9OX3BwbSwgNCk7CisgICAgICAgICAgICAgICAgICAgIGxfZGF0YSArPSA0OworICAgICAgICAgICAgICAgICAgICBsX2RhdGFfc2l6ZSAtPSA0OworICAgICAgICAgICAgICAgICAgICBsX3BwbV9kYXRhX3NpemUgKz0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxfTl9wcG07IC8qIGNhbid0IG92ZXJmbG93LCBtYXggMjU2IG1hcmtlcnMgb2YgbWF4IDY1NTM2IGJ5dGVzLCB0aGF0IGlzIHdoZW4gUFBNIG1hcmtlcnMgYXJlIG5vdCBjb3JydXB0ZWQgd2hpY2ggaXMgY2hlY2tlZCBlbHNld2hlcmUgKi8KKworICAgICAgICAgICAgICAgICAgICBpZiAobF9kYXRhX3NpemUgPj0gbF9OX3BwbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbF9kYXRhX3NpemUgLT0gbF9OX3BwbTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfZGF0YSArPSBsX05fcHBtOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbF9OX3BwbV9yZW1haW5pbmcgPSBsX05fcHBtIC0gbF9kYXRhX3NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBsX2RhdGFfc2l6ZSA9IDBVOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSB3aGlsZSAobF9kYXRhX3NpemUgPiAwVSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobF9OX3BwbV9yZW1haW5pbmcgIT0gMFUpIHsKKyAgICAgICAgLyogY2xlYW4gdXAgdG8gYmUgZG9uZSBvbiBsX2NwIGRlc3RydWN0aW9uICovCisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJDb3JydXB0ZWQgUFBNIG1hcmtlcnNcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIHBfY3AtPnBwbV9idWZmZXIgPSAoT1BKX0JZVEUgKikgb3BqX21hbGxvYyhsX3BwbV9kYXRhX3NpemUpOworICAgIGlmIChwX2NwLT5wcG1fYnVmZmVyID09IDAwKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFBQTSBtYXJrZXJcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICBwX2NwLT5wcG1fbGVuID0gbF9wcG1fZGF0YV9zaXplOworICAgIGxfcHBtX2RhdGFfc2l6ZSA9IDBVOworICAgIGxfTl9wcG1fcmVtYWluaW5nID0gMFU7CisgICAgZm9yIChpID0gMFU7IGkgPCBwX2NwLT5wcG1fbWFya2Vyc19jb3VudDsgKytpKSB7CisgICAgICAgIGlmIChwX2NwLT5wcG1fbWFya2Vyc1tpXS5tX2RhdGEgIT0KKyAgICAgICAgICAgICAgICBOVUxMKSB7IC8qIHN0YW5kYXJkIGRvZXNuJ3Qgc2VlbSB0byByZXF1aXJlIGNvbnRpZ3VvdXMgWnBwbSAqLworICAgICAgICAgICAgT1BKX1VJTlQzMiBsX05fcHBtOworICAgICAgICAgICAgT1BKX1VJTlQzMiBsX2RhdGFfc2l6ZSA9IHBfY3AtPnBwbV9tYXJrZXJzW2ldLm1fZGF0YV9zaXplOworICAgICAgICAgICAgY29uc3QgT1BKX0JZVEUqIGxfZGF0YSA9IHBfY3AtPnBwbV9tYXJrZXJzW2ldLm1fZGF0YTsKKworICAgICAgICAgICAgaWYgKGxfTl9wcG1fcmVtYWluaW5nID49IGxfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KHBfY3AtPnBwbV9idWZmZXIgKyBsX3BwbV9kYXRhX3NpemUsIGxfZGF0YSwgbF9kYXRhX3NpemUpOworICAgICAgICAgICAgICAgIGxfcHBtX2RhdGFfc2l6ZSArPSBsX2RhdGFfc2l6ZTsKKyAgICAgICAgICAgICAgICBsX05fcHBtX3JlbWFpbmluZyAtPSBsX2RhdGFfc2l6ZTsKKyAgICAgICAgICAgICAgICBsX2RhdGFfc2l6ZSA9IDBVOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkocF9jcC0+cHBtX2J1ZmZlciArIGxfcHBtX2RhdGFfc2l6ZSwgbF9kYXRhLCBsX05fcHBtX3JlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgbF9wcG1fZGF0YV9zaXplICs9IGxfTl9wcG1fcmVtYWluaW5nOworICAgICAgICAgICAgICAgIGxfZGF0YSArPSBsX05fcHBtX3JlbWFpbmluZzsKKyAgICAgICAgICAgICAgICBsX2RhdGFfc2l6ZSAtPSBsX05fcHBtX3JlbWFpbmluZzsKKyAgICAgICAgICAgICAgICBsX05fcHBtX3JlbWFpbmluZyA9IDBVOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobF9kYXRhX3NpemUgPiAwVSkgeworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcmVhZCBOcHBtICovCisgICAgICAgICAgICAgICAgICAgIGlmIChsX2RhdGFfc2l6ZSA8IDRVKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhbiB1cCB0byBiZSBkb25lIG9uIGxfY3AgZGVzdHJ1Y3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIGJ5dGVzIHRvIHJlYWQgTnBwbVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKGxfZGF0YSwgJmxfTl9wcG0sIDQpOworICAgICAgICAgICAgICAgICAgICBsX2RhdGEgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgbF9kYXRhX3NpemUgLT0gNDsKKworICAgICAgICAgICAgICAgICAgICBpZiAobF9kYXRhX3NpemUgPj0gbF9OX3BwbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBfY3AtPnBwbV9idWZmZXIgKyBsX3BwbV9kYXRhX3NpemUsIGxfZGF0YSwgbF9OX3BwbSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsX3BwbV9kYXRhX3NpemUgKz0gbF9OX3BwbTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfZGF0YV9zaXplIC09IGxfTl9wcG07CisgICAgICAgICAgICAgICAgICAgICAgICBsX2RhdGEgKz0gbF9OX3BwbTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwX2NwLT5wcG1fYnVmZmVyICsgbF9wcG1fZGF0YV9zaXplLCBsX2RhdGEsIGxfZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfcHBtX2RhdGFfc2l6ZSArPSBsX2RhdGFfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfTl9wcG1fcmVtYWluaW5nID0gbF9OX3BwbSAtIGxfZGF0YV9zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgbF9kYXRhX3NpemUgPSAwVTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gd2hpbGUgKGxfZGF0YV9zaXplID4gMFUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3BqX2ZyZWUocF9jcC0+cHBtX21hcmtlcnNbaV0ubV9kYXRhKTsKKyAgICAgICAgICAgIHBfY3AtPnBwbV9tYXJrZXJzW2ldLm1fZGF0YSA9IE5VTEw7CisgICAgICAgICAgICBwX2NwLT5wcG1fbWFya2Vyc1tpXS5tX2RhdGFfc2l6ZSA9IDBVOworICAgICAgICB9CisgICAgfQorCisgICAgcF9jcC0+cHBtX2RhdGEgPSBwX2NwLT5wcG1fYnVmZmVyOworICAgIHBfY3AtPnBwbV9kYXRhX3NpemUgPSBwX2NwLT5wcG1fbGVuOworCisgICAgcF9jcC0+cHBtX21hcmtlcnNfY291bnQgPSAwVTsKKyAgICBvcGpfZnJlZShwX2NwLT5wcG1fbWFya2Vycyk7CisgICAgcF9jcC0+cHBtX21hcmtlcnMgPSBOVUxMOworCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiAvKioKQEAgLTM3MjUsODAgKzM5OTQsODMgQEAKICAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBQUFQgbWFya2VyLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9wcHQgKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9wcHQob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0Jb3BqX2NwX3QgKmxfY3AgPSAwMDsKLQlvcGpfdGNwX3QgKmxfdGNwID0gMDA7Ci0JT1BKX1VJTlQzMiBsX1pfcHB0OworICAgIG9wal9jcF90ICpsX2NwID0gMDA7CisgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOworICAgIE9QSl9VSU5UMzIgbF9aX3BwdDsKIAotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7Ci0JYXNzZXJ0KHBfajJrICE9IDAwKTsKLQlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CiAKLQkvKiBXZSBuZWVkIHRvIGhhdmUgdGhlIFpfcHB0IGVsZW1lbnQgKyAxIGJ5dGUgb2YgSXBwdCBhdCBtaW5pbXVtICovCi0JaWYgKHBfaGVhZGVyX3NpemUgPCAyKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFBQVCBtYXJrZXJcbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KKyAgICAvKiBXZSBuZWVkIHRvIGhhdmUgdGhlIFpfcHB0IGVsZW1lbnQgKyAxIGJ5dGUgb2YgSXBwdCBhdCBtaW5pbXVtICovCisgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAyKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFBQVCBtYXJrZXJcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotCWxfY3AgPSAmKHBfajJrLT5tX2NwKTsKLQlpZiAobF9jcC0+cHBtKXsKLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUFBUIG1hcmtlcjogcGFja2V0IGhlYWRlciBoYXZlIGJlZW4gcHJldmlvdXNseSBmb3VuZCBpbiB0aGUgbWFpbiBoZWFkZXIgKFBQTSBtYXJrZXIpLlxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKKyAgICBpZiAobF9jcC0+cHBtKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHJlYWRpbmcgUFBUIG1hcmtlcjogcGFja2V0IGhlYWRlciBoYXZlIGJlZW4gcHJldmlvdXNseSBmb3VuZCBpbiB0aGUgbWFpbiBoZWFkZXIgKFBQTSBtYXJrZXIpLlxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0JbF90Y3AgPSAmKGxfY3AtPnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0pOwotCWxfdGNwLT5wcHQgPSAxOworICAgIGxfdGNwID0gJihsX2NwLT50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdKTsKKyAgICBsX3RjcC0+cHB0ID0gMTsKIAotCW9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfWl9wcHQsMSk7ICAgICAgICAgICAgICAgLyogWl9wcHQgKi8KLQkrK3BfaGVhZGVyX2RhdGE7Ci0JLS1wX2hlYWRlcl9zaXplOwotCQotCS8qIGNoZWNrIGFsbG9jYXRpb24gbmVlZGVkICovCi0JaWYgKGxfdGNwLT5wcHRfbWFya2VycyA9PSBOVUxMKSB7IC8qIGZpcnN0IFBQVCBtYXJrZXIgKi8KLQkJT1BKX1VJTlQzMiBsX25ld0NvdW50ID0gbF9aX3BwdCArIDFVOyAvKiBjYW4ndCBvdmVyZmxvdywgbF9aX3BwdCBpcyBVSU5UOCAqLwotCQlhc3NlcnQobF90Y3AtPnBwdF9tYXJrZXJzX2NvdW50ID09IDBVKTsKLQkJCi0JCWxfdGNwLT5wcHRfbWFya2VycyA9IChvcGpfcHB4ICopIG9wal9jYWxsb2MobF9uZXdDb3VudCwgc2l6ZW9mKG9wal9wcHgpKTsKLQkJaWYgKGxfdGNwLT5wcHRfbWFya2VycyA9PSBOVUxMKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBQUFQgbWFya2VyXG4iKTsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQkJbF90Y3AtPnBwdF9tYXJrZXJzX2NvdW50ID0gbF9uZXdDb3VudDsKLQl9IGVsc2UgaWYgKGxfdGNwLT5wcHRfbWFya2Vyc19jb3VudCA8PSBsX1pfcHB0KSB7Ci0JCU9QSl9VSU5UMzIgbF9uZXdDb3VudCA9IGxfWl9wcHQgKyAxVTsgLyogY2FuJ3Qgb3ZlcmZsb3csIGxfWl9wcHQgaXMgVUlOVDggKi8KLQkJb3BqX3BweCAqbmV3X3BwdF9tYXJrZXJzOwotCQluZXdfcHB0X21hcmtlcnMgPSAob3BqX3BweCAqKSBvcGpfcmVhbGxvYyhsX3RjcC0+cHB0X21hcmtlcnMsIGxfbmV3Q291bnQgKiBzaXplb2Yob3BqX3BweCkpOwotCQlpZiAobmV3X3BwdF9tYXJrZXJzID09IE5VTEwpIHsKLQkJCS8qIGNsZWFuIHVwIHRvIGJlIGRvbmUgb24gbF90Y3AgZGVzdHJ1Y3Rpb24gKi8KLQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFBQVCBtYXJrZXJcbiIpOwotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCQlsX3RjcC0+cHB0X21hcmtlcnMgPSBuZXdfcHB0X21hcmtlcnM7Ci0JCW1lbXNldChsX3RjcC0+cHB0X21hcmtlcnMgKyBsX3RjcC0+cHB0X21hcmtlcnNfY291bnQsIDAsIChsX25ld0NvdW50IC0gbF90Y3AtPnBwdF9tYXJrZXJzX2NvdW50KSAqIHNpemVvZihvcGpfcHB4KSk7Ci0JCWxfdGNwLT5wcHRfbWFya2Vyc19jb3VudCA9IGxfbmV3Q291bnQ7Ci0JfQotCQotCWlmIChsX3RjcC0+cHB0X21hcmtlcnNbbF9aX3BwdF0ubV9kYXRhICE9IE5VTEwpIHsKLQkJLyogY2xlYW4gdXAgdG8gYmUgZG9uZSBvbiBsX3RjcCBkZXN0cnVjdGlvbiAqLwotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiWnBwdCAldSBhbHJlYWR5IHJlYWRcbiIsIGxfWl9wcHQpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQkKLQlsX3RjcC0+cHB0X21hcmtlcnNbbF9aX3BwdF0ubV9kYXRhID0gb3BqX21hbGxvYyhwX2hlYWRlcl9zaXplKTsKLQlpZiAobF90Y3AtPnBwdF9tYXJrZXJzW2xfWl9wcHRdLm1fZGF0YSA9PSBOVUxMKSB7Ci0JCS8qIGNsZWFuIHVwIHRvIGJlIGRvbmUgb24gbF90Y3AgZGVzdHJ1Y3Rpb24gKi8KLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgUFBUIG1hcmtlclxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCWxfdGNwLT5wcHRfbWFya2Vyc1tsX1pfcHB0XS5tX2RhdGFfc2l6ZSA9IHBfaGVhZGVyX3NpemU7Ci0JbWVtY3B5KGxfdGNwLT5wcHRfbWFya2Vyc1tsX1pfcHB0XS5tX2RhdGEsIHBfaGVhZGVyX2RhdGEsIHBfaGVhZGVyX3NpemUpOwotCXJldHVybiBPUEpfVFJVRTsKKyAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAmbF9aX3BwdCwgMSk7ICAgICAgICAgICAgIC8qIFpfcHB0ICovCisgICAgKytwX2hlYWRlcl9kYXRhOworICAgIC0tcF9oZWFkZXJfc2l6ZTsKKworICAgIC8qIGNoZWNrIGFsbG9jYXRpb24gbmVlZGVkICovCisgICAgaWYgKGxfdGNwLT5wcHRfbWFya2VycyA9PSBOVUxMKSB7IC8qIGZpcnN0IFBQVCBtYXJrZXIgKi8KKyAgICAgICAgT1BKX1VJTlQzMiBsX25ld0NvdW50ID0gbF9aX3BwdCArIDFVOyAvKiBjYW4ndCBvdmVyZmxvdywgbF9aX3BwdCBpcyBVSU5UOCAqLworICAgICAgICBhc3NlcnQobF90Y3AtPnBwdF9tYXJrZXJzX2NvdW50ID09IDBVKTsKKworICAgICAgICBsX3RjcC0+cHB0X21hcmtlcnMgPSAob3BqX3BweCAqKSBvcGpfY2FsbG9jKGxfbmV3Q291bnQsIHNpemVvZihvcGpfcHB4KSk7CisgICAgICAgIGlmIChsX3RjcC0+cHB0X21hcmtlcnMgPT0gTlVMTCkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgUFBUIG1hcmtlclxuIik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGxfdGNwLT5wcHRfbWFya2Vyc19jb3VudCA9IGxfbmV3Q291bnQ7CisgICAgfSBlbHNlIGlmIChsX3RjcC0+cHB0X21hcmtlcnNfY291bnQgPD0gbF9aX3BwdCkgeworICAgICAgICBPUEpfVUlOVDMyIGxfbmV3Q291bnQgPSBsX1pfcHB0ICsgMVU7IC8qIGNhbid0IG92ZXJmbG93LCBsX1pfcHB0IGlzIFVJTlQ4ICovCisgICAgICAgIG9wal9wcHggKm5ld19wcHRfbWFya2VyczsKKyAgICAgICAgbmV3X3BwdF9tYXJrZXJzID0gKG9wal9wcHggKikgb3BqX3JlYWxsb2MobF90Y3AtPnBwdF9tYXJrZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsX25ld0NvdW50ICogc2l6ZW9mKG9wal9wcHgpKTsKKyAgICAgICAgaWYgKG5ld19wcHRfbWFya2VycyA9PSBOVUxMKSB7CisgICAgICAgICAgICAvKiBjbGVhbiB1cCB0byBiZSBkb25lIG9uIGxfdGNwIGRlc3RydWN0aW9uICovCisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBQUFQgbWFya2VyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbF90Y3AtPnBwdF9tYXJrZXJzID0gbmV3X3BwdF9tYXJrZXJzOworICAgICAgICBtZW1zZXQobF90Y3AtPnBwdF9tYXJrZXJzICsgbF90Y3AtPnBwdF9tYXJrZXJzX2NvdW50LCAwLAorICAgICAgICAgICAgICAgKGxfbmV3Q291bnQgLSBsX3RjcC0+cHB0X21hcmtlcnNfY291bnQpICogc2l6ZW9mKG9wal9wcHgpKTsKKyAgICAgICAgbF90Y3AtPnBwdF9tYXJrZXJzX2NvdW50ID0gbF9uZXdDb3VudDsKKyAgICB9CisKKyAgICBpZiAobF90Y3AtPnBwdF9tYXJrZXJzW2xfWl9wcHRdLm1fZGF0YSAhPSBOVUxMKSB7CisgICAgICAgIC8qIGNsZWFuIHVwIHRvIGJlIGRvbmUgb24gbF90Y3AgZGVzdHJ1Y3Rpb24gKi8KKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlpwcHQgJXUgYWxyZWFkeSByZWFkXG4iLCBsX1pfcHB0KTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICBsX3RjcC0+cHB0X21hcmtlcnNbbF9aX3BwdF0ubV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9tYWxsb2MocF9oZWFkZXJfc2l6ZSk7CisgICAgaWYgKGxfdGNwLT5wcHRfbWFya2Vyc1tsX1pfcHB0XS5tX2RhdGEgPT0gTlVMTCkgeworICAgICAgICAvKiBjbGVhbiB1cCB0byBiZSBkb25lIG9uIGxfdGNwIGRlc3RydWN0aW9uICovCisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFBQVCBtYXJrZXJcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICBsX3RjcC0+cHB0X21hcmtlcnNbbF9aX3BwdF0ubV9kYXRhX3NpemUgPSBwX2hlYWRlcl9zaXplOworICAgIG1lbWNweShsX3RjcC0+cHB0X21hcmtlcnNbbF9aX3BwdF0ubV9kYXRhLCBwX2hlYWRlcl9kYXRhLCBwX2hlYWRlcl9zaXplKTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKIC8qKgpAQCAtMzgwOSw3MTMgKzQwODEsODQ3IEBACiAgKi8KIHN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX21lcmdlX3BwdChvcGpfdGNwX3QgKnBfdGNwLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCiB7Ci0JT1BKX1VJTlQzMiBpLCBsX3BwdF9kYXRhX3NpemU7Ci0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChwX3RjcCAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0JYXNzZXJ0KHBfdGNwLT5wcHRfYnVmZmVyID09IE5VTEwpOwotCQotCWlmIChwX3RjcC0+cHB0ID09IDBVKSB7Ci0JCXJldHVybiBPUEpfVFJVRTsKLQl9Ci0JCi0JbF9wcHRfZGF0YV9zaXplID0gMFU7Ci0JZm9yIChpID0gMFU7IGkgPCBwX3RjcC0+cHB0X21hcmtlcnNfY291bnQ7ICsraSkgewotCQlsX3BwdF9kYXRhX3NpemUgKz0gcF90Y3AtPnBwdF9tYXJrZXJzW2ldLm1fZGF0YV9zaXplOyAvKiBjYW4ndCBvdmVyZmxvdywgbWF4IDI1NiBtYXJrZXJzIG9mIG1heCA2NTUzNiBieXRlcyAqLwotCX0KLQkKLQlwX3RjcC0+cHB0X2J1ZmZlciA9IChPUEpfQllURSAqKSBvcGpfbWFsbG9jKGxfcHB0X2RhdGFfc2l6ZSk7Ci0JaWYgKHBfdGNwLT5wcHRfYnVmZmVyID09IDAwKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFBQVCBtYXJrZXJcbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQlwX3RjcC0+cHB0X2xlbiA9IGxfcHB0X2RhdGFfc2l6ZTsKLQlsX3BwdF9kYXRhX3NpemUgPSAwVTsKLQlmb3IgKGkgPSAwVTsgaSA8IHBfdGNwLT5wcHRfbWFya2Vyc19jb3VudDsgKytpKSB7Ci0JCWlmIChwX3RjcC0+cHB0X21hcmtlcnNbaV0ubV9kYXRhICE9IE5VTEwpIHsgLyogc3RhbmRhcmQgZG9lc24ndCBzZWVtIHRvIHJlcXVpcmUgY29udGlndW91cyBacHB0ICovCi0JCQltZW1jcHkocF90Y3AtPnBwdF9idWZmZXIgKyBsX3BwdF9kYXRhX3NpemUsIHBfdGNwLT5wcHRfbWFya2Vyc1tpXS5tX2RhdGEsIHBfdGNwLT5wcHRfbWFya2Vyc1tpXS5tX2RhdGFfc2l6ZSk7Ci0JCQlsX3BwdF9kYXRhX3NpemUgKz0gcF90Y3AtPnBwdF9tYXJrZXJzW2ldLm1fZGF0YV9zaXplOyAvKiBjYW4ndCBvdmVyZmxvdywgbWF4IDI1NiBtYXJrZXJzIG9mIG1heCA2NTUzNiBieXRlcyAqLwotCQkJCi0JCQlvcGpfZnJlZShwX3RjcC0+cHB0X21hcmtlcnNbaV0ubV9kYXRhKTsKLQkJCXBfdGNwLT5wcHRfbWFya2Vyc1tpXS5tX2RhdGEgPSBOVUxMOwotCQkJcF90Y3AtPnBwdF9tYXJrZXJzW2ldLm1fZGF0YV9zaXplID0gMFU7Ci0JCX0KLQl9Ci0JCi0JcF90Y3AtPnBwdF9tYXJrZXJzX2NvdW50ID0gMFU7Ci0Jb3BqX2ZyZWUocF90Y3AtPnBwdF9tYXJrZXJzKTsKLQlwX3RjcC0+cHB0X21hcmtlcnMgPSBOVUxMOwotCQotCXBfdGNwLT5wcHRfZGF0YSA9IHBfdGNwLT5wcHRfYnVmZmVyOwotCXBfdGNwLT5wcHRfZGF0YV9zaXplID0gcF90Y3AtPnBwdF9sZW47Ci0JcmV0dXJuIE9QSl9UUlVFOwotfQorICAgIE9QSl9VSU5UMzIgaSwgbF9wcHRfZGF0YV9zaXplOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF90Y3AgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIGFzc2VydChwX3RjcC0+cHB0X2J1ZmZlciA9PSBOVUxMKTsKIAotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfdGxtKCAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3RsbV9zaXplOwotCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7Ci0KLSAgICAgICAgbF90bG1fc2l6ZSA9IDYgKyAoNSpwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90b3RhbF90aWxlX3BhcnRzKTsKLQotICAgICAgICBpZiAobF90bG1fc2l6ZSA+IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSkgewotICAgICAgICAgICAgICAgIE9QSl9CWVRFICpuZXdfaGVhZGVyX3RpbGVfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfcmVhbGxvYyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCBsX3RsbV9zaXplKTsKLSAgICAgICAgICAgICAgICBpZiAoISBuZXdfaGVhZGVyX3RpbGVfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gd3JpdGUgVExNIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gbmV3X2hlYWRlcl90aWxlX2RhdGE7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gbF90bG1fc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxfY3VycmVudF9kYXRhID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YTsKLQotICAgICAgICAvKiBjaGFuZ2UgdGhlIHdheSBkYXRhIGlzIHdyaXR0ZW4gdG8gYXZvaWQgc2Vla2luZyBpZiBwb3NzaWJsZSAqLwotICAgICAgICAvKiBUT0RPICovCi0gICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zdGFydCA9IG9wal9zdHJlYW1fdGVsbChwX3N0cmVhbSk7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLEoyS19NU19UTE0sMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUTE0gKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF90bG1fc2l6ZS0yLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExwb2MgKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsMCwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWnRsbT0wKi8KLSAgICAgICAgKytsX2N1cnJlbnRfZGF0YTsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsMHg1MCwxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RsbSBTVD0xKDhiaXRzLTI1NSB0aWxlcyBtYXgpLFNQPTEoUHRsbT0zMmJpdHMpICovCi0gICAgICAgICsrbF9jdXJyZW50X2RhdGE7Ci0KLSAgICAgICAgLyogZG8gbm90aGluZyBvbiB0aGUgNSAqIGxfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RvdGFsX3RpbGVfcGFydHMgcmVtYWluaW5nIGRhdGEgKi8KLSAgICAgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLGxfdGxtX3NpemUscF9tYW5hZ2VyKSAhPSBsX3RsbV9zaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCisgICAgaWYgKHBfdGNwLT5wcHQgPT0gMFUpIHsKICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIH0KKworICAgIGxfcHB0X2RhdGFfc2l6ZSA9IDBVOworICAgIGZvciAoaSA9IDBVOyBpIDwgcF90Y3AtPnBwdF9tYXJrZXJzX2NvdW50OyArK2kpIHsKKyAgICAgICAgbF9wcHRfZGF0YV9zaXplICs9CisgICAgICAgICAgICBwX3RjcC0+cHB0X21hcmtlcnNbaV0ubV9kYXRhX3NpemU7IC8qIGNhbid0IG92ZXJmbG93LCBtYXggMjU2IG1hcmtlcnMgb2YgbWF4IDY1NTM2IGJ5dGVzICovCisgICAgfQorCisgICAgcF90Y3AtPnBwdF9idWZmZXIgPSAoT1BKX0JZVEUgKikgb3BqX21hbGxvYyhsX3BwdF9kYXRhX3NpemUpOworICAgIGlmIChwX3RjcC0+cHB0X2J1ZmZlciA9PSAwMCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBQUFQgbWFya2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgcF90Y3AtPnBwdF9sZW4gPSBsX3BwdF9kYXRhX3NpemU7CisgICAgbF9wcHRfZGF0YV9zaXplID0gMFU7CisgICAgZm9yIChpID0gMFU7IGkgPCBwX3RjcC0+cHB0X21hcmtlcnNfY291bnQ7ICsraSkgeworICAgICAgICBpZiAocF90Y3AtPnBwdF9tYXJrZXJzW2ldLm1fZGF0YSAhPQorICAgICAgICAgICAgICAgIE5VTEwpIHsgLyogc3RhbmRhcmQgZG9lc24ndCBzZWVtIHRvIHJlcXVpcmUgY29udGlndW91cyBacHB0ICovCisgICAgICAgICAgICBtZW1jcHkocF90Y3AtPnBwdF9idWZmZXIgKyBsX3BwdF9kYXRhX3NpemUsIHBfdGNwLT5wcHRfbWFya2Vyc1tpXS5tX2RhdGEsCisgICAgICAgICAgICAgICAgICAgcF90Y3AtPnBwdF9tYXJrZXJzW2ldLm1fZGF0YV9zaXplKTsKKyAgICAgICAgICAgIGxfcHB0X2RhdGFfc2l6ZSArPQorICAgICAgICAgICAgICAgIHBfdGNwLT5wcHRfbWFya2Vyc1tpXS5tX2RhdGFfc2l6ZTsgLyogY2FuJ3Qgb3ZlcmZsb3csIG1heCAyNTYgbWFya2VycyBvZiBtYXggNjU1MzYgYnl0ZXMgKi8KKworICAgICAgICAgICAgb3BqX2ZyZWUocF90Y3AtPnBwdF9tYXJrZXJzW2ldLm1fZGF0YSk7CisgICAgICAgICAgICBwX3RjcC0+cHB0X21hcmtlcnNbaV0ubV9kYXRhID0gTlVMTDsKKyAgICAgICAgICAgIHBfdGNwLT5wcHRfbWFya2Vyc1tpXS5tX2RhdGFfc2l6ZSA9IDBVOworICAgICAgICB9CisgICAgfQorCisgICAgcF90Y3AtPnBwdF9tYXJrZXJzX2NvdW50ID0gMFU7CisgICAgb3BqX2ZyZWUocF90Y3AtPnBwdF9tYXJrZXJzKTsKKyAgICBwX3RjcC0+cHB0X21hcmtlcnMgPSBOVUxMOworCisgICAgcF90Y3AtPnBwdF9kYXRhID0gcF90Y3AtPnBwdF9idWZmZXI7CisgICAgcF90Y3AtPnBwdF9kYXRhX3NpemUgPSBwX3RjcC0+cHB0X2xlbjsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3NvdCggICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfdGxtKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKKyAgICBPUEpfVUlOVDMyIGxfdGxtX3NpemU7CiAKLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKHBfZGF0YSxKMktfTVNfU09ULDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU09UICovCi0gICAgICAgIHBfZGF0YSArPSAyOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CiAKLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKHBfZGF0YSwxMCwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMc290ICovCi0gICAgICAgIHBfZGF0YSArPSAyOworICAgIGxfdGxtX3NpemUgPSA2ICsgKDUgKiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90b3RhbF90aWxlX3BhcnRzKTsKIAotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLCBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLDIpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElzb3QgKi8KLSAgICAgICAgcF9kYXRhICs9IDI7CisgICAgaWYgKGxfdGxtX3NpemUgPiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUpIHsKKyAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfdGlsZV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwgbF90bG1fc2l6ZSk7CisgICAgICAgIGlmICghIG5ld19oZWFkZXJfdGlsZV9kYXRhKSB7CisgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKTsKKyAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBOVUxMOworICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB3cml0ZSBUTE0gbWFya2VyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IG5ld19oZWFkZXJfdGlsZV9kYXRhOworICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSBsX3RsbV9zaXplOworICAgIH0KIAotICAgICAgICAvKiBQc290ICAqLwotICAgICAgICBwX2RhdGEgKz0gNDsKKyAgICBsX2N1cnJlbnRfZGF0YSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGE7CiAKLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKHBfZGF0YSwgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fY3VycmVudF90aWxlX3BhcnRfbnVtYmVyLDEpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRQc290ICovCi0gICAgICAgICsrcF9kYXRhOworICAgIC8qIGNoYW5nZSB0aGUgd2F5IGRhdGEgaXMgd3JpdHRlbiB0byBhdm9pZCBzZWVraW5nIGlmIHBvc3NpYmxlICovCisgICAgLyogVE9ETyAqLworICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zdGFydCA9IG9wal9zdHJlYW1fdGVsbChwX3N0cmVhbSk7CiAKLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKHBfZGF0YSwgcF9qMmstPm1fY3AudGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5tX25iX3RpbGVfcGFydHMsMSk7ICAgICAgICAgICAgICAgICAgICAgIC8qIFROc290ICovCi0gICAgICAgICsrcF9kYXRhOworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgSjJLX01TX1RMTSwKKyAgICAgICAgICAgICAgICAgICAgMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUTE0gKi8KKyAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwogCi0gICAgICAgIC8qIFVuaVBHPj4gKi8KKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIGxfdGxtX3NpemUgLSAyLAorICAgICAgICAgICAgICAgICAgICAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMcG9jICovCisgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKKworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgMCwKKyAgICAgICAgICAgICAgICAgICAgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFp0bG09MCovCisgICAgKytsX2N1cnJlbnRfZGF0YTsKKworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgMHg1MCwKKyAgICAgICAgICAgICAgICAgICAgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN0bG0gU1Q9MSg4Yml0cy0yNTUgdGlsZXMgbWF4KSxTUD0xKFB0bG09MzJiaXRzKSAqLworICAgICsrbF9jdXJyZW50X2RhdGE7CisKKyAgICAvKiBkbyBub3RoaW5nIG9uIHRoZSA1ICogbF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdG90YWxfdGlsZV9wYXJ0cyByZW1haW5pbmcgZGF0YSAqLworICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCBsX3RsbV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSAhPSBsX3RsbV9zaXplKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9zb3Qob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdG90YWxfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKworICAgIE9QSl9VTlVTRUQocF9zdHJlYW0pOworCisgICAgaWYgKHBfdG90YWxfZGF0YV9zaXplIDwgMTIpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiTm90IGVub3VnaCBieXRlcyBpbiBvdXRwdXQgYnVmZmVyIHRvIHdyaXRlIFNPVCBtYXJrZXJcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIG9wal93cml0ZV9ieXRlcyhwX2RhdGEsIEoyS19NU19TT1QsCisgICAgICAgICAgICAgICAgICAgIDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNPVCAqLworICAgIHBfZGF0YSArPSAyOworCisgICAgb3BqX3dyaXRlX2J5dGVzKHBfZGF0YSwgMTAsCisgICAgICAgICAgICAgICAgICAgIDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExzb3QgKi8KKyAgICBwX2RhdGEgKz0gMjsKKworICAgIG9wal93cml0ZV9ieXRlcyhwX2RhdGEsIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgIDIpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIElzb3QgKi8KKyAgICBwX2RhdGEgKz0gMjsKKworICAgIC8qIFBzb3QgICovCisgICAgcF9kYXRhICs9IDQ7CisKKyAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLAorICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgIDEpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRQc290ICovCisgICAgKytwX2RhdGE7CisKKyAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLAorICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9jcC50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLm1fbmJfdGlsZV9wYXJ0cywKKyAgICAgICAgICAgICAgICAgICAgMSk7ICAgICAgICAgICAgICAgICAgICAgIC8qIFROc290ICovCisgICAgKytwX2RhdGE7CisKKyAgICAvKiBVbmlQRz4+ICovCiAjaWZkZWYgVVNFX0pQV0wKLSAgICAgICAgLyogdXBkYXRlIG1hcmtlcnMgc3RydWN0ICovCi0vKgotICAgICAgICBPUEpfQk9PTCByZXMgPSBqMmtfYWRkX21hcmtlcihwX2oyay0+Y3N0cl9pbmZvLCBKMktfTVNfU09ULCBwX2oyay0+c290X3N0YXJ0LCBsZW4gKyAyKTsKLSovCi0gIGFzc2VydCggMCAmJiAiVE9ETyIgKTsKKyAgICAvKiB1cGRhdGUgbWFya2VycyBzdHJ1Y3QgKi8KKyAgICAvKgorICAgICAgICAgICAgT1BKX0JPT0wgcmVzID0gajJrX2FkZF9tYXJrZXIocF9qMmstPmNzdHJfaW5mbywgSjJLX01TX1NPVCwgcF9qMmstPnNvdF9zdGFydCwgbGVuICsgMik7CisgICAgKi8KKyAgICBhc3NlcnQoMCAmJiAiVE9ETyIpOwogI2VuZGlmIC8qIFVTRV9KUFdMICovCiAKLSAgICAgICAgKiBwX2RhdGFfd3JpdHRlbiA9IDEyOworICAgICogcF9kYXRhX3dyaXR0ZW4gPSAxMjsKIAotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiBzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19nZXRfc290X3ZhbHVlcyhPUEpfQllURSAqICBwX2hlYWRlcl9kYXRhLAotCQkJCQkJCQkJCQkJCQkJCQkJCSBPUEpfVUlOVDMyICBwX2hlYWRlcl9zaXplLAotCQkJCQkJCQkJCQkJCQkJCQkJCSBPUEpfVUlOVDMyKiBwX3RpbGVfbm8sCi0JCQkJCQkJCQkJCQkJCQkJCQkJIE9QSl9VSU5UMzIqIHBfdG90X2xlbiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkgT1BKX1VJTlQzMiogcF9jdXJyZW50X3BhcnQsCi0JCQkJCQkJCQkJCQkJCQkJCQkJIE9QSl9VSU5UMzIqIHBfbnVtX3BhcnRzLAotCQkJCQkJCQkJCQkJCQkJCQkJCSBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqIHBfdGlsZV9ubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqIHBfdG90X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqIHBfY3VycmVudF9wYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiogcF9udW1fcGFydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCiB7Ci0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKLQlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQkKLQkvKiBTaXplIG9mIHRoaXMgbWFya2VyIGlzIGZpeGVkID0gMTIgKHdlIGhhdmUgYWxyZWFkeSByZWFkIG1hcmtlciBhbmQgaXRzIHNpemUpKi8KLQlpZiAocF9oZWFkZXJfc2l6ZSAhPSA4KSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFNPVCBtYXJrZXJcbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQkKLQlvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLHBfdGlsZV9ubywyKTsgICAgICAvKiBJc290ICovCi0JcF9oZWFkZXJfZGF0YSs9MjsKLQlvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLHBfdG90X2xlbiw0KTsgICAgICAvKiBQc290ICovCi0JcF9oZWFkZXJfZGF0YSs9NDsKLQlvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLHBfY3VycmVudF9wYXJ0LDEpOyAvKiBUUHNvdCAqLwotCSsrcF9oZWFkZXJfZGF0YTsKLQlvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLHBfbnVtX3BhcnRzICwxKTsgICAvKiBUTnNvdCAqLwotCSsrcF9oZWFkZXJfZGF0YTsKLQlyZXR1cm4gT1BKX1RSVUU7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworICAgIC8qIFNpemUgb2YgdGhpcyBtYXJrZXIgaXMgZml4ZWQgPSAxMiAod2UgaGF2ZSBhbHJlYWR5IHJlYWQgbWFya2VyIGFuZCBpdHMgc2l6ZSkqLworICAgIGlmIChwX2hlYWRlcl9zaXplICE9IDgpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgU09UIG1hcmtlclxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgcF90aWxlX25vLCAyKTsgICAgLyogSXNvdCAqLworICAgIHBfaGVhZGVyX2RhdGEgKz0gMjsKKyAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCBwX3RvdF9sZW4sIDQpOyAgICAvKiBQc290ICovCisgICAgcF9oZWFkZXJfZGF0YSArPSA0OworICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsIHBfY3VycmVudF9wYXJ0LCAxKTsgLyogVFBzb3QgKi8KKyAgICArK3BfaGVhZGVyX2RhdGE7CisgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgcF9udW1fcGFydHMsIDEpOyAgLyogVE5zb3QgKi8KKyAgICArK3BfaGVhZGVyX2RhdGE7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3NvdCAoIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9zb3Qob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKIHsKLSAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKLSAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfdG90X2xlbiwgbF9udW1fcGFydHMgPSAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfY3VycmVudF9wYXJ0OwotICAgICAgICBPUEpfVUlOVDMyIGxfdGlsZV94LGxfdGlsZV95OworICAgIG9wal9jcF90ICpsX2NwID0gMDA7CisgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOworICAgIE9QSl9VSU5UMzIgbF90b3RfbGVuLCBsX251bV9wYXJ0cyA9IDA7CisgICAgT1BKX1VJTlQzMiBsX2N1cnJlbnRfcGFydDsKKyAgICBPUEpfVUlOVDMyIGxfdGlsZV94LCBsX3RpbGVfeTsKIAotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0JCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCQotICAgICAgICBpZiAoISBvcGpfajJrX2dldF9zb3RfdmFsdWVzKHBfaGVhZGVyX2RhdGEsIHBfaGVhZGVyX3NpemUsICYocF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciksICZsX3RvdF9sZW4sICZsX2N1cnJlbnRfcGFydCwgJmxfbnVtX3BhcnRzLCBwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgU09UIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisKKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisgICAgaWYgKCEgb3BqX2oya19nZXRfc290X3ZhbHVlcyhwX2hlYWRlcl9kYXRhLCBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyKSwgJmxfdG90X2xlbiwgJmxfY3VycmVudF9wYXJ0LCAmbF9udW1fcGFydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFNPVCBtYXJrZXJcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyNpZmRlZiBERUJVR19WRVJCT1NFCisgICAgZnByaW50ZihzdGRlcnIsICJTT1QgJWQgJWQgJWQgJWRcbiIsCisgICAgICAgICAgICBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLCBsX3RvdF9sZW4sIGxfY3VycmVudF9wYXJ0LCBsX251bV9wYXJ0cyk7CisjZW5kaWYKKworICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKKworICAgIC8qIHRlc3RjYXNlIDIucGRmLlNJR0ZQRS43MDYuMTExMiAqLworICAgIGlmIChwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyID49IGxfY3AtPnR3ICogbF9jcC0+dGgpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgdGlsZSBudW1iZXIgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgbF90Y3AgPSAmbF9jcC0+dGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXTsKKyAgICBsX3RpbGVfeCA9IHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIgJSBsX2NwLT50dzsKKyAgICBsX3RpbGVfeSA9IHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIgLyBsX2NwLT50dzsKKworICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV90aWxlX2luZF90b19kZWMgPCAwIHx8CisgICAgICAgICAgICBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyID09IChPUEpfVUlOVDMyKQorICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fdGlsZV9pbmRfdG9fZGVjKSB7CisgICAgICAgIC8qIERvIG9ubHkgdGhpcyBjaGVjayBpZiB3ZSBkZWNvZGUgYWxsIHRpbGUgcGFydCBoZWFkZXJzLCBvciBpZiAqLworICAgICAgICAvKiB3ZSBkZWNvZGUgb25lIHByZWNpc2UgdGlsZS4gT3RoZXJ3aXNlIHRoZSBtX2N1cnJlbnRfdGlsZV9wYXJ0X251bWJlciAqLworICAgICAgICAvKiBtaWdodCBub3QgYmUgdmFsaWQgKi8KKyAgICAgICAgLyogRml4ZXMgaXNzdWUgd2l0aCBpZF8wMDAwMjAsc2lnXzA2LHNyY18wMDE5NTgsb3BfZmxpcDQscG9zXzE0OSAqLworICAgICAgICAvKiBvZiBodHRwczovL2dpdGh1Yi5jb20vdWNsb3V2YWluL29wZW5qcGVnL2lzc3Vlcy85MzkgKi8KKyAgICAgICAgLyogV2UgbXVzdCBhdm9pZCByZWFkaW5nIHR3aWNlIHRoZSBzYW1lIHRpbGUgcGFydCBudW1iZXIgZm9yIGEgZ2l2ZW4gdGlsZSAqLworICAgICAgICAvKiBzbyBhcyB0byBhdm9pZCB2YXJpb3VzIGlzc3VlcywgbGlrZSBvcGpfajJrX21lcmdlX3BwdCBiZWluZyBjYWxsZWQgKi8KKyAgICAgICAgLyogc2V2ZXJhbCB0aW1lcy4gKi8KKyAgICAgICAgLyogSVNPIDE1NDQ0LTEgQS40LjIgU3RhcnQgb2YgdGlsZS1wYXJ0IChTT1QpIG1hbmRhdGVzIHRoYXQgdGlsZSBwYXJ0cyAqLworICAgICAgICAvKiBzaG91bGQgYXBwZWFyIGluIGluY3JlYXNpbmcgb3JkZXIuICovCisgICAgICAgIGlmIChsX3RjcC0+bV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXIgKyAxICE9IChPUEpfSU5UMzIpbF9jdXJyZW50X3BhcnQpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHRpbGUgcGFydCBpbmRleCBmb3IgdGlsZSBudW1iZXIgJWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkdvdCAlZCwgZXhwZWN0ZWQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9wYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjcC0+bV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXIgKyAxKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOwotCi0gICAgICAgIC8qIHRlc3RjYXNlIDIucGRmLlNJR0ZQRS43MDYuMTExMiAqLwotICAgICAgICBpZiAocF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciA+PSBsX2NwLT50dyAqIGxfY3AtPnRoKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgdGlsZSBudW1iZXIgJWRcbiIsIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBsX3RjcCA9ICZsX2NwLT50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdOwotICAgICAgICBsX3RpbGVfeCA9IHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIgJSBsX2NwLT50dzsKLSAgICAgICAgbF90aWxlX3kgPSBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyIC8gbF9jcC0+dHc7CisgICAgbF90Y3AtPm1fY3VycmVudF90aWxlX3BhcnRfbnVtYmVyID0gKE9QSl9JTlQzMikgbF9jdXJyZW50X3BhcnQ7CiAKICNpZmRlZiBVU0VfSlBXTAotICAgICAgICBpZiAobF9jcC0+Y29ycmVjdCkgeworICAgIGlmIChsX2NwLT5jb3JyZWN0KSB7CiAKLSAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRpbGVubyA9IHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXI7Ci0gICAgICAgICAgICAgICAgc3RhdGljIE9QSl9VSU5UMzIgYmFja3VwX3RpbGVubyA9IDA7CisgICAgICAgIE9QSl9VSU5UMzIgdGlsZW5vID0gcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcjsKKyAgICAgICAgc3RhdGljIE9QSl9VSU5UMzIgYmFja3VwX3RpbGVubyA9IDA7CiAKLSAgICAgICAgICAgICAgICAvKiB0aWxlbm8gaXMgbmVnYXRpdmUgb3IgbGFyZ2VyIHRoYW4gdGhlIG51bWJlciBvZiB0aWxlcyEhISAqLwotICAgICAgICAgICAgICAgIGlmICh0aWxlbm8gPiAobF9jcC0+dHcgKiBsX2NwLT50aCkpIHsKKyAgICAgICAgLyogdGlsZW5vIGlzIG5lZ2F0aXZlIG9yIGxhcmdlciB0aGFuIHRoZSBudW1iZXIgb2YgdGlsZXMhISEgKi8KKyAgICAgICAgaWYgKHRpbGVubyA+IChsX2NwLT50dyAqIGxfY3AtPnRoKSkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQV0w6IGJhZCB0aWxlIG51bWJlciAoJWQgb3V0IG9mIGEgbWF4aW11bSBvZiAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVubywgKGxfY3AtPnR3ICogbF9jcC0+dGgpKTsKKyAgICAgICAgICAgIGlmICghSlBXTF9BU1NVTUUpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSlBXTDogZ2l2aW5nIHVwXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogd2UgdHJ5IHRvIGNvcnJlY3QgKi8KKyAgICAgICAgICAgIHRpbGVubyA9IGJhY2t1cF90aWxlbm87CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICItIHRyeWluZyB0byBhZGp1c3QgdGhpc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiLSBzZXR0aW5nIHRpbGUgbnVtYmVyIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlbm8pOworICAgICAgICB9CisKKyAgICAgICAgLyoga2VlcCB5b3VyIHByaXZhdGUgY291bnQgb2YgdGlsZXMgKi8KKyAgICAgICAgYmFja3VwX3RpbGVubysrOworICAgIH07CisjZW5kaWYgLyogVVNFX0pQV0wgKi8KKworICAgIC8qIGxvb2sgZm9yIHRoZSB0aWxlIGluIHRoZSBsaXN0IG9mIGFscmVhZHkgcHJvY2Vzc2VkIHRpbGUgKGluIHBhcnRzKS4gKi8KKyAgICAvKiBPcHRpbWl6YXRpb24gcG9zc2libGUgaGVyZSB3aXRoIGEgbW9yZSBjb21wbGV4IGRhdGEgc3RydWN0dXJlIGFuZCB3aXRoIHRoZSByZW1vdmluZyBvZiB0aWxlcyAqLworICAgIC8qIHNpbmNlIHRoZSB0aW1lIHRha2VuIGJ5IHRoaXMgZnVuY3Rpb24gY2FuIG9ubHkgZ3JvdyBhdCB0aGUgdGltZSAqLworCisgICAgLyogUFNvdCBzaG91bGQgYmUgZXF1YWwgdG8gemVybyBvciA+PTE0IG9yIDw9IDJeMzItMSAqLworICAgIGlmICgobF90b3RfbGVuICE9IDApICYmIChsX3RvdF9sZW4gPCAxNCkpIHsKKyAgICAgICAgaWYgKGxfdG90X2xlbiA9PQorICAgICAgICAgICAgICAgIDEyKSB7IC8qIE1TRDogU3BlY2lhbCBjYXNlIGZvciB0aGUgUEhSIGRhdGEgd2hpY2ggYXJlIHJlYWQgYnkga2FrYWR1Ki8KKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkVtcHR5IFNPVCBtYXJrZXIgZGV0ZWN0ZWQ6IFBzb3Q9JWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RvdF9sZW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlBzb3QgdmFsdWUgaXMgbm90IGNvcnJlY3QgcmVnYXJkcyB0byB0aGUgSlBFRzIwMDAgbm9ybTogJWQuXG4iLCBsX3RvdF9sZW4pOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworI2lmZGVmIFVTRV9KUFdMCisgICAgaWYgKGxfY3AtPmNvcnJlY3QpIHsKKworICAgICAgICAvKiB0b3RsZW4gaXMgbmVnYXRpdmUgb3IgbGFyZ2VyIHRoYW4gdGhlIGJ5dGVzIGxlZnQhISEgKi8KKyAgICAgICAgaWYgKC8qKGxfdG90X2xlbiA8IDApIHx8Ki8gKGxfdG90X2xlbiA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2hlYWRlcl9zaXplKSkgeyAgIC8qIEZJWE1FIGl0IHNlZW1zIGNvcnJlY3Q7IGZvciBpbmZvIGluIFYxIC0+IChwX3N0cmVhbV9udW1ieXRlc2xlZnQocF9zdHJlYW0pICsgOCkpKSB7ICovCisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSlBXTDogYmFkIHRpbGUgYnl0ZSBzaXplICglZCBieXRlcyBhZ2FpbnN0ICVkIGJ5dGVzIGxlZnQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RvdF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBfaGVhZGVyX3NpemUpOyAgLyogRklYTUUgaXQgc2VlbXMgY29ycmVjdDsgZm9yIGluZm8gaW4gVjEgLT4gcF9zdHJlYW1fbnVtYnl0ZXNsZWZ0KHBfc3RyZWFtKSArIDgpOyAqLworICAgICAgICAgICAgaWYgKCFKUFdMX0FTU1VNRSkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJKUFdMOiBnaXZpbmcgdXBcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiB3ZSB0cnkgdG8gY29ycmVjdCAqLworICAgICAgICAgICAgbF90b3RfbGVuID0gMDsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIi0gdHJ5aW5nIHRvIGFkanVzdCB0aGlzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICItIHNldHRpbmcgUHNvdCB0byAlZCA9PiBhc3N1bWluZyBpdCBpcyB0aGUgbGFzdCB0aWxlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RvdF9sZW4pOworICAgICAgICB9CisgICAgfTsKKyNlbmRpZiAvKiBVU0VfSlBXTCAqLworCisgICAgLyogUmVmIEEuNC4yOiBQc290IGNvdWxkIGJlIGVxdWFsIHplcm8gaWYgaXQgaXMgdGhlIGxhc3QgdGlsZS1wYXJ0IG9mIHRoZSBjb2Rlc3RyZWFtLiovCisgICAgaWYgKCFsX3RvdF9sZW4pIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICJQc290IHZhbHVlIG9mIHRoZSBjdXJyZW50IHRpbGUtcGFydCBpcyBlcXVhbCB0byB6ZXJvLCAiCisgICAgICAgICAgICAgICAgICAgICAgIndlIGFzc3VtaW5nIGl0IGlzIHRoZSBsYXN0IHRpbGUtcGFydCBvZiB0aGUgY29kZXN0cmVhbS5cbiIpOworICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9sYXN0X3RpbGVfcGFydCA9IDE7CisgICAgfQorCisgICAgaWYgKGxfdGNwLT5tX25iX3RpbGVfcGFydHMgIT0gMCAmJiBsX2N1cnJlbnRfcGFydCA+PSBsX3RjcC0+bV9uYl90aWxlX3BhcnRzKSB7CisgICAgICAgIC8qIEZpeGVzIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9vc3MtZnV6ei9pc3N1ZXMvZGV0YWlsP2lkPTI4NTEgKi8KKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiSW4gU09UIG1hcmtlciwgVFBTb3QgKCVkKSBpcyBub3QgdmFsaWQgcmVnYXJkcyB0byB0aGUgcHJldmlvdXMgIgorICAgICAgICAgICAgICAgICAgICAgICJudW1iZXIgb2YgdGlsZS1wYXJ0ICglZCksIGdpdmluZyB1cFxuIiwgbF9jdXJyZW50X3BhcnQsCisgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fbmJfdGlsZV9wYXJ0cyk7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2xhc3RfdGlsZV9wYXJ0ID0gMTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICBpZiAobF9udW1fcGFydHMgIT0KKyAgICAgICAgICAgIDApIHsgLyogTnVtYmVyIG9mIHRpbGUtcGFydCBoZWFkZXIgaXMgcHJvdmlkZWQgYnkgdGhpcyB0aWxlLXBhcnQgaGVhZGVyICovCisgICAgICAgIGxfbnVtX3BhcnRzICs9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX25iX3RpbGVfcGFydHNfY29ycmVjdGlvbjsKKyAgICAgICAgLyogVXNlZnVsIHRvIG1hbmFnZSB0aGUgY2FzZSBvZiB0ZXh0R0JSLmpwMiBmaWxlIGJlY2F1c2UgdHdvIHZhbHVlcyBvZiBUTlNvdCBhcmUgYWxsb3dlZDogdGhlIGNvcnJlY3QgbnVtYmVycyBvZgorICAgICAgICAgKiB0aWxlLXBhcnRzIGZvciB0aGF0IHRpbGUgYW5kIHplcm8gKEEuNC4yIG9mIDE1NDQ0LTEgOiAyMDAyKS4gKi8KKyAgICAgICAgaWYgKGxfdGNwLT5tX25iX3RpbGVfcGFydHMpIHsKKyAgICAgICAgICAgIGlmIChsX2N1cnJlbnRfcGFydCA+PSBsX3RjcC0+bV9uYl90aWxlX3BhcnRzKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbiBTT1QgbWFya2VyLCBUUFNvdCAoJWQpIGlzIG5vdCB2YWxpZCByZWdhcmRzIHRvIHRoZSBjdXJyZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJudW1iZXIgb2YgdGlsZS1wYXJ0ICglZCksIGdpdmluZyB1cFxuIiwgbF9jdXJyZW50X3BhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjcC0+bV9uYl90aWxlX3BhcnRzKTsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9sYXN0X3RpbGVfcGFydCA9IDE7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobF9jdXJyZW50X3BhcnQgPj0gbF9udW1fcGFydHMpIHsKKyAgICAgICAgICAgIC8qIHRlc3RjYXNlIDQ1MS5wZGYuU0lHU0VHVi5jZTkuMzcyMyAqLworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkluIFNPVCBtYXJrZXIsIFRQU290ICglZCkgaXMgbm90IHZhbGlkIHJlZ2FyZHMgdG8gdGhlIGN1cnJlbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtYmVyIG9mIHRpbGUtcGFydCAoaGVhZGVyKSAoJWQpLCBnaXZpbmcgdXBcbiIsIGxfY3VycmVudF9wYXJ0LCBsX251bV9wYXJ0cyk7CisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9sYXN0X3RpbGVfcGFydCA9IDE7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGxfdGNwLT5tX25iX3RpbGVfcGFydHMgPSBsX251bV9wYXJ0czsKKyAgICB9CisKKyAgICAvKiBJZiBrbm93IHRoZSBudW1iZXIgb2YgdGlsZSBwYXJ0IGhlYWRlciB3ZSB3aWxsIGNoZWNrIGlmIHdlIGRpZG4ndCByZWFkIHRoZSBsYXN0Ki8KKyAgICBpZiAobF90Y3AtPm1fbmJfdGlsZV9wYXJ0cykgeworICAgICAgICBpZiAobF90Y3AtPm1fbmJfdGlsZV9wYXJ0cyA9PSAobF9jdXJyZW50X3BhcnQgKyAxKSkgeworICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fY2FuX2RlY29kZSA9CisgICAgICAgICAgICAgICAgMTsgLyogUHJvY2VzcyB0aGUgbGFzdCB0aWxlLXBhcnQgaGVhZGVyKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fbGFzdF90aWxlX3BhcnQpIHsKKyAgICAgICAgLyogS2VlcCB0aGUgc2l6ZSBvZiBkYXRhIHRvIHNraXAgYWZ0ZXIgdGhpcyBtYXJrZXIgKi8KKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc290X2xlbmd0aCA9IGxfdG90X2xlbiAtCisgICAgICAgICAgICAgICAgMTI7IC8qIFNPVF9tYXJrZXJfc2l6ZSA9IDEyICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogRklYTUU6IG5lZWQgdG8gYmUgY29tcHV0ZWQgZnJvbSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUgY29kZXN0cmVhbSAqLworICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoID0gMDsKKyAgICB9CisKKyAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9IEoyS19TVEFURV9UUEg7CisKKyAgICAvKiBDaGVjayBpZiB0aGUgY3VycmVudCB0aWxlIGlzIG91dHNpZGUgdGhlIGFyZWEgd2Ugd2FudCBkZWNvZGUgb3Igbm90IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRpbGUgaW5kZXgqLworICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV90aWxlX2luZF90b19kZWMgPT0gLTEpIHsKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc2tpcF9kYXRhID0KKyAgICAgICAgICAgIChsX3RpbGVfeCA8IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXJ0X3RpbGVfeCkKKyAgICAgICAgICAgIHx8IChsX3RpbGVfeCA+PSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV94KQorICAgICAgICAgICAgfHwgKGxfdGlsZV95IDwgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhcnRfdGlsZV95KQorICAgICAgICAgICAgfHwgKGxfdGlsZV95ID49IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3kpOworICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV90aWxlX2luZF90b19kZWMgPj0gMCk7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NraXBfZGF0YSA9CisgICAgICAgICAgICAocF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciAhPSAoT1BKX1VJTlQzMikKKyAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV90aWxlX2luZF90b19kZWMpOworICAgIH0KKworICAgIC8qIEluZGV4ICovCisgICAgaWYgKHBfajJrLT5jc3RyX2luZGV4KSB7CisgICAgICAgIGFzc2VydChwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleCAhPSAwMCk7CisgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRpbGVubyA9CisgICAgICAgICAgICBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyOworICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5jdXJyZW50X3Rwc25vID0KKyAgICAgICAgICAgIGxfY3VycmVudF9wYXJ0OworCisgICAgICAgIGlmIChsX251bV9wYXJ0cyAhPSAwKSB7CisgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5uYl90cHMgPQorICAgICAgICAgICAgICAgIGxfbnVtX3BhcnRzOworICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0uY3VycmVudF9uYl90cHMgPQorICAgICAgICAgICAgICAgIGxfbnVtX3BhcnRzOworCisgICAgICAgICAgICBpZiAoIXBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4KSB7CisgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udHBfaW5kZXggPQorICAgICAgICAgICAgICAgICAgICAob3BqX3RwX2luZGV4X3QqKW9wal9jYWxsb2MobF9udW1fcGFydHMsIHNpemVvZihvcGpfdHBfaW5kZXhfdCkpOworICAgICAgICAgICAgICAgIGlmICghcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udHBfaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBTT1QgbWFya2VyLiBUaWxlIGluZGV4IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG9wal90cF9pbmRleF90ICpuZXdfdHBfaW5kZXggPSAob3BqX3RwX2luZGV4X3QgKikgb3BqX3JlYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbnVtX3BhcnRzICogc2l6ZW9mKG9wal90cF9pbmRleF90KSk7CisgICAgICAgICAgICAgICAgaWYgKCEgbmV3X3RwX2luZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udHBfaW5kZXggPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFNPVCBtYXJrZXIuIFRpbGUgaW5kZXggYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleCA9CisgICAgICAgICAgICAgICAgICAgIG5ld190cF9pbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qaWYgKCFwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleCkqLyB7CisKKyAgICAgICAgICAgICAgICBpZiAoIXBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLmN1cnJlbnRfbmJfdHBzID0gMTA7CisgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChvcGpfdHBfaW5kZXhfdCopb3BqX2NhbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5jdXJyZW50X25iX3RwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob3BqX3RwX2luZGV4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0uY3VycmVudF9uYl90cHMgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSlBXTDogYmFkIHRpbGUgbnVtYmVyICglZCBvdXQgb2YgYSBtYXhpbXVtIG9mICVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlbm8sIChsX2NwLT50dyAqIGxfY3AtPnRoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUpQV0xfQVNTVU1FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJKUFdMOiBnaXZpbmcgdXBcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgdHJ5IHRvIGNvcnJlY3QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVubyA9IGJhY2t1cF90aWxlbm87Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICItIHRyeWluZyB0byBhZGp1c3QgdGhpc1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItIHNldHRpbmcgdGlsZSBudW1iZXIgdG8gJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZW5vKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBrZWVwIHlvdXIgcHJpdmF0ZSBjb3VudCBvZiB0aWxlcyAqLwotICAgICAgICAgICAgICAgIGJhY2t1cF90aWxlbm8rKzsKLSAgICAgICAgfTsKLSNlbmRpZiAvKiBVU0VfSlBXTCAqLwotCi0gICAgICAgIC8qIGxvb2sgZm9yIHRoZSB0aWxlIGluIHRoZSBsaXN0IG9mIGFscmVhZHkgcHJvY2Vzc2VkIHRpbGUgKGluIHBhcnRzKS4gKi8KLSAgICAgICAgLyogT3B0aW1pemF0aW9uIHBvc3NpYmxlIGhlcmUgd2l0aCBhIG1vcmUgY29tcGxleCBkYXRhIHN0cnVjdHVyZSBhbmQgd2l0aCB0aGUgcmVtb3Zpbmcgb2YgdGlsZXMgKi8KLSAgICAgICAgLyogc2luY2UgdGhlIHRpbWUgdGFrZW4gYnkgdGhpcyBmdW5jdGlvbiBjYW4gb25seSBncm93IGF0IHRoZSB0aW1lICovCi0KLSAgICAgICAgLyogUFNvdCBzaG91bGQgYmUgZXF1YWwgdG8gemVybyBvciA+PTE0IG9yIDw9IDJeMzItMSAqLwotICAgICAgICBpZiAoKGxfdG90X2xlbiAhPTAgKSAmJiAobF90b3RfbGVuIDwgMTQpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGxfdG90X2xlbiA9PSAxMiApIC8qIE1TRDogU3BlY2lhbCBjYXNlIGZvciB0aGUgUEhSIGRhdGEgd2hpY2ggYXJlIHJlYWQgYnkga2FrYWR1Ki8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJFbXB0eSBTT1QgbWFya2VyIGRldGVjdGVkOiBQc290PSVkLlxuIiwgbF90b3RfbGVuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiUHNvdCB2YWx1ZSBpcyBub3QgY29ycmVjdCByZWdhcmRzIHRvIHRoZSBKUEVHMjAwMCBub3JtOiAlZC5cbiIsIGxfdG90X2xlbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0jaWZkZWYgVVNFX0pQV0wKLSAgICAgICAgaWYgKGxfY3AtPmNvcnJlY3QpIHsKLQotICAgICAgICAgICAgICAgIC8qIHRvdGxlbiBpcyBuZWdhdGl2ZSBvciBsYXJnZXIgdGhhbiB0aGUgYnl0ZXMgbGVmdCEhISAqLwotICAgICAgICAgICAgICAgIGlmICgvKihsX3RvdF9sZW4gPCAwKSB8fCovIChsX3RvdF9sZW4gPiBwX2hlYWRlcl9zaXplICkgKSB7IC8qIEZJWE1FIGl0IHNlZW1zIGNvcnJlY3Q7IGZvciBpbmZvIGluIFYxIC0+IChwX3N0cmVhbV9udW1ieXRlc2xlZnQocF9zdHJlYW0pICsgOCkpKSB7ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKUFdMOiBiYWQgdGlsZSBieXRlIHNpemUgKCVkIGJ5dGVzIGFnYWluc3QgJWQgYnl0ZXMgbGVmdClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90b3RfbGVuLCBwX2hlYWRlcl9zaXplICk7IC8qIEZJWE1FIGl0IHNlZW1zIGNvcnJlY3Q7IGZvciBpbmZvIGluIFYxIC0+IHBfc3RyZWFtX251bWJ5dGVzbGVmdChwX3N0cmVhbSkgKyA4KTsgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSlBXTF9BU1NVTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkpQV0w6IGdpdmluZyB1cFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiB3ZSB0cnkgdG8gY29ycmVjdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbF90b3RfbGVuID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIi0gdHJ5aW5nIHRvIGFkanVzdCB0aGlzXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0gc2V0dGluZyBQc290IHRvICVkID0+IGFzc3VtaW5nIGl0IGlzIHRoZSBsYXN0IHRpbGVcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90b3RfbGVuKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSNlbmRpZiAvKiBVU0VfSlBXTCAqLwotCi0gICAgICAgICAgICAgICAgLyogUmVmIEEuNC4yOiBQc290IGNvdWxkIGJlIGVxdWFsIHplcm8gaWYgaXQgaXMgdGhlIGxhc3QgdGlsZS1wYXJ0IG9mIHRoZSBjb2Rlc3RyZWFtLiovCi0gICAgICAgICAgICAgICAgaWYgKCFsX3RvdF9sZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfSU5GTywgIlBzb3QgdmFsdWUgb2YgdGhlIGN1cnJlbnQgdGlsZS1wYXJ0IGlzIGVxdWFsIHRvIHplcm8sICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2UgYXNzdW1pbmcgaXQgaXMgdGhlIGxhc3QgdGlsZS1wYXJ0IG9mIHRoZSBjb2Rlc3RyZWFtLlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9sYXN0X3RpbGVfcGFydCA9IDE7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGxfbnVtX3BhcnRzICE9IDApIHsgLyogTnVtYmVyIG9mIHRpbGUtcGFydCBoZWFkZXIgaXMgcHJvdmlkZWQgYnkgdGhpcyB0aWxlLXBhcnQgaGVhZGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICBsX251bV9wYXJ0cyArPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9uYl90aWxlX3BhcnRzX2NvcnJlY3Rpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBVc2VmdWwgdG8gbWFuYWdlIHRoZSBjYXNlIG9mIHRleHRHQlIuanAyIGZpbGUgYmVjYXVzZSB0d28gdmFsdWVzIG9mIFROU290IGFyZSBhbGxvd2VkOiB0aGUgY29ycmVjdCBudW1iZXJzIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiB0aWxlLXBhcnRzIGZvciB0aGF0IHRpbGUgYW5kIHplcm8gKEEuNC4yIG9mIDE1NDQ0LTEgOiAyMDAyKS4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX3RjcC0+bV9uYl90aWxlX3BhcnRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2N1cnJlbnRfcGFydCA+PSBsX3RjcC0+bV9uYl90aWxlX3BhcnRzKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSW4gU09UIG1hcmtlciwgVFBTb3QgKCVkKSBpcyBub3QgdmFsaWQgcmVnYXJkcyB0byB0aGUgY3VycmVudCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJudW1iZXIgb2YgdGlsZS1wYXJ0ICglZCksIGdpdmluZyB1cFxuIiwgbF9jdXJyZW50X3BhcnQsIGxfdGNwLT5tX25iX3RpbGVfcGFydHMgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9sYXN0X3RpbGVfcGFydCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGxfY3VycmVudF9wYXJ0ID49IGxfbnVtX3BhcnRzICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXN0Y2FzZSA0NTEucGRmLlNJR1NFR1YuY2U5LjM3MjMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkluIFNPVCBtYXJrZXIsIFRQU290ICglZCkgaXMgbm90IHZhbGlkIHJlZ2FyZHMgdG8gdGhlIGN1cnJlbnQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJudW1iZXIgb2YgdGlsZS1wYXJ0IChoZWFkZXIpICglZCksIGdpdmluZyB1cFxuIiwgbF9jdXJyZW50X3BhcnQsIGxfbnVtX3BhcnRzICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2xhc3RfdGlsZV9wYXJ0ID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNwLT5tX25iX3RpbGVfcGFydHMgPSBsX251bV9wYXJ0czsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBJZiBrbm93IHRoZSBudW1iZXIgb2YgdGlsZSBwYXJ0IGhlYWRlciB3ZSB3aWxsIGNoZWNrIGlmIHdlIGRpZG4ndCByZWFkIHRoZSBsYXN0Ki8KLSAgICAgICAgICAgICAgICBpZiAobF90Y3AtPm1fbmJfdGlsZV9wYXJ0cykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfdGNwLT5tX25iX3RpbGVfcGFydHMgPT0gKGxfY3VycmVudF9wYXJ0KzEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2Nhbl9kZWNvZGUgPSAxOyAvKiBQcm9jZXNzIHRoZSBsYXN0IHRpbGUtcGFydCBoZWFkZXIqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fbGFzdF90aWxlX3BhcnQpewotICAgICAgICAgICAgICAgICAgICAgICAgLyogS2VlcCB0aGUgc2l6ZSBvZiBkYXRhIHRvIHNraXAgYWZ0ZXIgdGhpcyBtYXJrZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGggPSBsX3RvdF9sZW4gLSAxMjsgLyogU09UX21hcmtlcl9zaXplID0gMTIgKi8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBGSVhNRTogbmVlZCB0byBiZSBjb21wdXRlZCBmcm9tIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIGluIHRoZSBjb2Rlc3RyZWFtICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9IEoyS19TVEFURV9UUEg7Ci0KLSAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgY3VycmVudCB0aWxlIGlzIG91dHNpZGUgdGhlIGFyZWEgd2Ugd2FudCBkZWNvZGUgb3Igbm90IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRpbGUgaW5kZXgqLwotICAgICAgICAgICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV90aWxlX2luZF90b19kZWMgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NraXBfZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsX3RpbGVfeCA8IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXJ0X3RpbGVfeCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgICAgICAobF90aWxlX3ggPj0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIChsX3RpbGVfeSA8IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXJ0X3RpbGVfeSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgICAgICAobF90aWxlX3kgPj0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV90aWxlX2luZF90b19kZWMgPj0gMCApOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc2tpcF9kYXRhID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIgIT0gKE9QSl9VSU5UMzIpcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fdGlsZV9pbmRfdG9fZGVjKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBJbmRleCAqLwotICAgICAgICAgICAgICAgIGlmIChwX2oyay0+Y3N0cl9pbmRleCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQocF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXggIT0gMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udGlsZW5vID0gcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLmN1cnJlbnRfdHBzbm8gPSBsX2N1cnJlbnRfcGFydDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfbnVtX3BhcnRzICE9IDApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5uYl90cHMgPSBsX251bV9wYXJ0czsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0uY3VycmVudF9uYl90cHMgPSBsX251bV9wYXJ0czsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udHBfaW5kZXggPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal90cF9pbmRleF90KilvcGpfY2FsbG9jKGxfbnVtX3BhcnRzLCBzaXplb2Yob3BqX3RwX2luZGV4X3QpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBTT1QgbWFya2VyLiBUaWxlIGluZGV4IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdHBfaW5kZXhfdCAqbmV3X3RwX2luZGV4ID0gKG9wal90cF9pbmRleF90ICopIG9wal9yZWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleCwgbF9udW1fcGFydHMqIHNpemVvZihvcGpfdHBfaW5kZXhfdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG5ld190cF9pbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udHBfaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udHBfaW5kZXggPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgU09UIG1hcmtlci4gVGlsZSBpbmRleCBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleCA9IG5ld190cF9pbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppZiAoIXBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4KSovIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udHBfaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLmN1cnJlbnRfbmJfdHBzID0gMTA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGpfdHBfaW5kZXhfdCopb3BqX2NhbGxvYyggcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0uY3VycmVudF9uYl90cHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob3BqX3RwX2luZGV4X3QpKTsKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCWlmICghcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udHBfaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0uY3VycmVudF9uYl90cHMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBTT1QgbWFya2VyLiBUaWxlIGluZGV4IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBsX2N1cnJlbnRfcGFydCA+PSBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5jdXJyZW50X25iX3RwcyApewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RwX2luZGV4X3QgKm5ld190cF9pbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLmN1cnJlbnRfbmJfdHBzID0gbF9jdXJyZW50X3BhcnQgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3RwX2luZGV4ID0gKG9wal90cF9pbmRleF90ICopIG9wal9yZWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLmN1cnJlbnRfbmJfdHBzICogc2l6ZW9mKG9wal90cF9pbmRleF90KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBuZXdfdHBfaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udHBfaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLmN1cnJlbnRfbmJfdHBzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgU09UIG1hcmtlci4gVGlsZSBpbmRleCBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleCA9IG5ld190cF9pbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogRklYTUUgbW92ZSB0aGlzIG9udG8gYSBzZXBhcmF0ZSBtZXRob2QgdG8gY2FsbCBiZWZvcmUgcmVhZGluZyBhbnkgU09ULCByZW1vdmUgcGFydCBhYm91dCBtYWluX2VuZCBoZWFkZXIsIHVzZSBhIGluZGV4IHN0cnVjdCBpbnNpZGUgcF9qMmsgKi8KLSAgICAgICAgICAgICAgICAvKiBpZiAocF9qMmstPmNzdHJfaW5mbykgewotICAgICAgICAgICAgICAgICAgIGlmIChsX3RjcC0+Zmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICBpZiAodGlsZW5vID09IDApIHsKLSAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT5tYWluX2hlYWRfZW5kID0gcF9zdHJlYW1fdGVsbChwX3N0cmVhbSkgLSAxMzsKLSAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3RpbGVub10udGlsZW5vID0gdGlsZW5vOwotICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbdGlsZW5vXS5zdGFydF9wb3MgPSBwX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSAtIDEyOwotICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbdGlsZW5vXS5lbmRfcG9zID0gcF9qMmstPmNzdHJfaW5mby0+dGlsZVt0aWxlbm9dLnN0YXJ0X3BvcyArIHRvdGxlbiAtIDE7Ci0gICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+dGlsZVt0aWxlbm9dLm51bV90cHMgPSBudW1wYXJ0czsKLQotICAgICAgICAgICAgICAgICAgIGlmIChudW1wYXJ0cykgewotICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbdGlsZW5vXS50cCA9IChvcGpfdHBfaW5mb190ICopIG9wal9tYWxsb2MobnVtcGFydHMgKiBzaXplb2Yob3BqX3RwX2luZm9fdCkpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3RpbGVub10udHAgPSAob3BqX3RwX2luZm9fdCAqKSBvcGpfbWFsbG9jKDEwICogc2l6ZW9mKG9wal90cF9pbmZvX3QpKTsgLy8gRml4bWUgKDEwKQotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+dGlsZVt0aWxlbm9dLmVuZF9wb3MgKz0gdG90bGVuOwotICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbdGlsZW5vXS50cFtwYXJ0bm9dLnRwX3N0YXJ0X3BvcyA9IHBfc3RyZWFtX3RlbGwocF9zdHJlYW0pIC0gMTI7Ci0gICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+dGlsZVt0aWxlbm9dLnRwW3BhcnRub10udHBfZW5kX3BvcyA9Ci0gICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+dGlsZVt0aWxlbm9dLnRwW3BhcnRub10udHBfc3RhcnRfcG9zICsgdG90bGVuIC0gMTsKLSAgICAgICAgICAgICAgICAgICB9Ki8KLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgICAgIH0KLQotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfc29kKCAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90ICogcF90aWxlX2NvZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdG90YWxfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5mb190ICpsX2NzdHJfaW5mbyA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfcmVtYWluaW5nX2RhdGE7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLEoyS19NU19TT0QsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTT0QgKi8KLSAgICAgICAgcF9kYXRhICs9IDI7Ci0KLSAgICAgICAgLyogbWFrZSByb29tIGZvciB0aGUgRU9GIG1hcmtlciAqLwotICAgICAgICBsX3JlbWFpbmluZ19kYXRhID0gIHBfdG90YWxfZGF0YV9zaXplIC0gNDsKLQotICAgICAgICAvKiB1cGRhdGUgdGlsZSBjb2RlciAqLwotICAgICAgICBwX3RpbGVfY29kZXItPnRwX251bSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2N1cnJlbnRfcG9jX3RpbGVfcGFydF9udW1iZXIgOwotICAgICAgICBwX3RpbGVfY29kZXItPmN1cl90cF9udW0gPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXI7Ci0KLSAgICAgICAgIC8qIElOREVYID4+ICovCi0gICAgICAgIC8qIFRPRE8gbWVyZ2VWMjogY2hlY2sgdGhpcyBwYXJ0IHdoaWNoIHVzZSBjc3RyX2luZm8gKi8KLSAgICAgICAgLypsX2NzdHJfaW5mbyA9IHBfajJrLT5jc3RyX2luZm87Ci0gICAgICAgIGlmIChsX2NzdHJfaW5mbykgewotICAgICAgICAgICAgICAgIGlmICghcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fY3VycmVudF90aWxlX3BhcnRfbnVtYmVyICkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIGNzdHJfaW5mby0+dGlsZVtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5lbmRfaGVhZGVyID0gcF9zdHJlYW1fdGVsbChwX3N0cmVhbSkgKyBwX2oyay0+cG9zX2NvcnJlY3Rpb24gLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgbF9jc3RyX2luZm8tPnRpbGVbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udGlsZW5vID0gcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAgICBUT0RPCi0gICAgICAgICAgICAgICAgICAgICAgICBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3N0cl9pbmZvLT50aWxlW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnBhY2tldFtjc3RyX2luZm8tPnBhY2tubyAtIDFdLmVuZF9wb3MgPCBwX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmZvLT50aWxlW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnBhY2tldFtjc3RyX2luZm8tPnBhY2tub10uc3RhcnRfcG9zID0gcF9zdHJlYW1fdGVsbChwX3N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ki8KLSAgICAgICAgICAgICAgICAvKn0qLwotICAgICAgICAgICAgICAgIC8qIFVuaVBHPj4gKi8KLSNpZmRlZiBVU0VfSlBXTAotICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBtYXJrZXJzIHN0cnVjdCAqLwotICAgICAgICAgICAgICAgIC8qT1BKX0JPT0wgcmVzID0gajJrX2FkZF9tYXJrZXIocF9qMmstPmNzdHJfaW5mbywgSjJLX01TX1NPRCwgcF9qMmstPnNvZF9zdGFydCwgMik7Ci0qLwotICBhc3NlcnQoIDAgJiYgIlRPRE8iICk7Ci0jZW5kaWYgLyogVVNFX0pQV0wgKi8KLSAgICAgICAgICAgICAgICAvKiA8PFVuaVBHICovCi0gICAgICAgIC8qfSovCi0gICAgICAgIC8qIDw8IElOREVYICovCi0KLSAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2N1cnJlbnRfdGlsZV9wYXJ0X251bWJlciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcF90aWxlX2NvZGVyLT50Y2RfaW1hZ2UtPnRpbGVzLT5wYWNrbm8gPSAwOwotICAgICAgICAgICAgICAgIGlmIChsX2NzdHJfaW5mbykgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9jc3RyX2luZm8tPnBhY2tubyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgKnBfZGF0YV93cml0dGVuID0gMDsKLQotICAgICAgICBpZiAoISBvcGpfdGNkX2VuY29kZV90aWxlKHBfdGlsZV9jb2RlciwgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwgcF9kYXRhLCBwX2RhdGFfd3JpdHRlbiwgbF9yZW1haW5pbmdfZGF0YSAsIGxfY3N0cl9pbmZvKSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJDYW5ub3QgZW5jb2RlIHRpbGVcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICAqcF9kYXRhX3dyaXR0ZW4gKz0gMjsKLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfc29kIChvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgICAgIE9QSl9TSVpFX1QgbF9jdXJyZW50X3JlYWRfc2l6ZTsKLSAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqIGxfY3N0cl9pbmRleCA9IDAwOwotICAgICAgICBPUEpfQllURSAqKiBsX2N1cnJlbnRfZGF0YSA9IDAwOwotICAgICAgICBvcGpfdGNwX3QgKiBsX3RjcCA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyICogbF90aWxlX2xlbiA9IDAwOwotICAgICAgICBPUEpfQk9PTCBsX3NvdF9sZW5ndGhfcGJfZGV0ZWN0ZWQgPSBPUEpfRkFMU0U7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLQotICAgICAgICBsX3RjcCA9ICYocF9qMmstPm1fY3AudGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXSk7Ci0KLSAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2xhc3RfdGlsZV9wYXJ0KSB7Ci0gICAgICAgICAgICAgICAgLyogb3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdCByZXR1cm5zIE9QSl9PRkZfVAotICAgICAgICAgICAgICAgIC8vIGJ1dCB3ZSBhcmUgaW4gdGhlIGxhc3QgdGlsZSBwYXJ0LAotICAgICAgICAgICAgICAgIC8vIHNvIGl0cyByZXN1bHQgd2lsbCBmaXQgb24gT1BKX1VJTlQzMiB1bmxlc3Mgd2UgZmluZAotICAgICAgICAgICAgICAgIC8vIGEgZmlsZSB3aXRoIGEgc2luZ2xlIHRpbGUgcGFydCBvZiBtb3JlIHRoYW4gNCBHQi4uLiovCi0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc290X2xlbmd0aCA9IChPUEpfVUlOVDMyKShvcGpfc3RyZWFtX2dldF9udW1iZXJfYnl0ZV9sZWZ0KHBfc3RyZWFtKSAtIDIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgLyogQ2hlY2sgdG8gYXZvaWQgcGFzcyB0aGUgbGltaXQgb2YgT1BKX1VJTlQzMiAqLwotICAgICAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGggPj0gMiApCi0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc290X2xlbmd0aCAtPSAyOwotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogTVNEOiBjYXNlIGNvbW1lbnRlZCB0byBzdXBwb3J0IGVtcHR5IFNPVCBtYXJrZXIgKFBIUiBkYXRhKSAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgPSAmKGxfdGNwLT5tX2RhdGEpOwotICAgICAgICBsX3RpbGVfbGVuID0gJmxfdGNwLT5tX2RhdGFfc2l6ZTsKLQotICAgICAgICAvKiBQYXRjaCB0byBzdXBwb3J0IG5ldyBQSFIgZGF0YSAqLwotICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc290X2xlbmd0aCkgewotICAgICAgICAgICAgLyogSWYgd2UgYXJlIGhlcmUsIHdlJ2xsIHRyeSB0byByZWFkIHRoZSBkYXRhIGFmdGVyIGFsbG9jYXRpb24gKi8KLSAgICAgICAgICAgIC8qIENoZWNrIGVub3VnaCBieXRlcyBsZWZ0IGluIHN0cmVhbSBiZWZvcmUgYWxsb2NhdGlvbiAqLwotICAgICAgICAgICAgaWYgKChPUEpfT0ZGX1QpcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc290X2xlbmd0aCA+IG9wal9zdHJlYW1fZ2V0X251bWJlcl9ieXRlX2xlZnQocF9zdHJlYW0pKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlRpbGUgcGFydCBsZW5ndGggc2l6ZSBpbmNvbnNpc3RlbnQgd2l0aCBzdHJlYW0gbGVuZ3RoXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCEgKmxfY3VycmVudF9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgLyogTEg6IG9kZGx5IGVub3VnaCwgaW4gdGhpcyBwYXRoLCBsX3RpbGVfbGVuIT0wLgotICAgICAgICAgICAgICAgICAqIFRPRE86IElmIHRoaXMgd2FzIGNvbnNpc3RlbnQsIHdlIGNvdWxkIHNpbXBsaWZ5IHRoZSBjb2RlIHRvIG9ubHkgdXNlIHJlYWxsb2MoKSwgYXMgcmVhbGxvYygwLC4uLikgZGVmYXVsdCB0byBtYWxsb2MoMCwuLi4pLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICpsX2N1cnJlbnRfZGF0YSA9IChPUEpfQllURSopIG9wal9tYWxsb2MocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc290X2xlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBPUEpfQllURSAqbF9uZXdfY3VycmVudF9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKCpsX2N1cnJlbnRfZGF0YSwgKmxfdGlsZV9sZW4gKyBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpZiAoISBsX25ld19jdXJyZW50X2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKCpsX2N1cnJlbnRfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKm5vdGhpbmcgbW9yZSBpcyBkb25lIGFzIGxfY3VycmVudF9kYXRhIHdpbGwgYmUgc2V0IHRvIG51bGwsIGFuZCBqdXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyd2FyZCB3ZSBlbnRlciBpbiB0aGUgZXJyb3IgcGF0aAotICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIGFjdHVhbCB0aWxlX2xlbiBpcyB1cGRhdGVkIChjb21taXR0ZWQpIGF0IHRoZSBlbmQgb2YgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLiAqLwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqbF9jdXJyZW50X2RhdGEgPSBsX25ld19jdXJyZW50X2RhdGE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmICgqbF9jdXJyZW50X2RhdGEgPT0gMDApIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gZGVjb2RlIHRpbGVcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBsX3NvdF9sZW5ndGhfcGJfZGV0ZWN0ZWQgPSBPUEpfVFJVRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEluZGV4ICovCi0gICAgICAgIGxfY3N0cl9pbmRleCA9IHBfajJrLT5jc3RyX2luZGV4OwotICAgICAgICBpZiAobF9jc3RyX2luZGV4KSB7Ci0gICAgICAgICAgICAgICAgT1BKX09GRl9UIGxfY3VycmVudF9wb3MgPSBvcGpfc3RyZWFtX3RlbGwocF9zdHJlYW0pIC0gMjsKLQotICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbF9jdXJyZW50X3RpbGVfcGFydCA9IGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5jdXJyZW50X3Rwc25vOwotICAgICAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleFtsX2N1cnJlbnRfdGlsZV9wYXJ0XS5lbmRfaGVhZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3BvczsKLSAgICAgICAgICAgICAgICBsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udHBfaW5kZXhbbF9jdXJyZW50X3RpbGVfcGFydF0uZW5kX3BvcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9wb3MgKyBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoICsgMjsKLQotICAgICAgICAgICAgICAgIGlmIChPUEpfRkFMU0UgPT0gb3BqX2oya19hZGRfdGxtYXJrZXIocF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NzdHJfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSjJLX01TX1NPRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGggKyAyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCB0bCBtYXJrZXJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBTT1QgbWFya2VyLiBUaWxlIGluZGV4IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAvKmxfY3N0cl9pbmRleC0+cGFja25vID0gMDsqLworICAgICAgICAgICAgICAgIGlmIChsX2N1cnJlbnRfcGFydCA+PQorICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0uY3VycmVudF9uYl90cHMpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX3RwX2luZGV4X3QgKm5ld190cF9pbmRleDsKKyAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0uY3VycmVudF9uYl90cHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3BhcnQgKyAxOworICAgICAgICAgICAgICAgICAgICBuZXdfdHBfaW5kZXggPSAob3BqX3RwX2luZGV4X3QgKikgb3BqX3JlYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLmN1cnJlbnRfbmJfdHBzICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvcGpfdHBfaW5kZXhfdCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoISBuZXdfdHBfaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRwX2luZGV4ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLmN1cnJlbnRfbmJfdHBzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIFNPVCBtYXJrZXIuIFRpbGUgaW5kZXggYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleCA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdfdHBfaW5kZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCiAgICAgICAgIH0KIAotICAgICAgICAvKiBQYXRjaCB0byBzdXBwb3J0IG5ldyBQSFIgZGF0YSAqLwotICAgICAgICBpZiAoIWxfc290X2xlbmd0aF9wYl9kZXRlY3RlZCkgewotICAgICAgICAgICAgbF9jdXJyZW50X3JlYWRfc2l6ZSA9IG9wal9zdHJlYW1fcmVhZF9kYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAqbF9jdXJyZW50X2RhdGEgKyAqbF90aWxlX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpOworICAgIH0KKworICAgIC8qIEZJWE1FIG1vdmUgdGhpcyBvbnRvIGEgc2VwYXJhdGUgbWV0aG9kIHRvIGNhbGwgYmVmb3JlIHJlYWRpbmcgYW55IFNPVCwgcmVtb3ZlIHBhcnQgYWJvdXQgbWFpbl9lbmQgaGVhZGVyLCB1c2UgYSBpbmRleCBzdHJ1Y3QgaW5zaWRlIHBfajJrICovCisgICAgLyogaWYgKHBfajJrLT5jc3RyX2luZm8pIHsKKyAgICAgICBpZiAobF90Y3AtPmZpcnN0KSB7CisgICAgICAgaWYgKHRpbGVubyA9PSAwKSB7CisgICAgICAgcF9qMmstPmNzdHJfaW5mby0+bWFpbl9oZWFkX2VuZCA9IHBfc3RyZWFtX3RlbGwocF9zdHJlYW0pIC0gMTM7CisgICAgICAgfQorCisgICAgICAgcF9qMmstPmNzdHJfaW5mby0+dGlsZVt0aWxlbm9dLnRpbGVubyA9IHRpbGVubzsKKyAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3RpbGVub10uc3RhcnRfcG9zID0gcF9zdHJlYW1fdGVsbChwX3N0cmVhbSkgLSAxMjsKKyAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3RpbGVub10uZW5kX3BvcyA9IHBfajJrLT5jc3RyX2luZm8tPnRpbGVbdGlsZW5vXS5zdGFydF9wb3MgKyB0b3RsZW4gLSAxOworICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbdGlsZW5vXS5udW1fdHBzID0gbnVtcGFydHM7CisKKyAgICAgICBpZiAobnVtcGFydHMpIHsKKyAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3RpbGVub10udHAgPSAob3BqX3RwX2luZm9fdCAqKSBvcGpfbWFsbG9jKG51bXBhcnRzICogc2l6ZW9mKG9wal90cF9pbmZvX3QpKTsKKyAgICAgICB9CisgICAgICAgZWxzZSB7CisgICAgICAgcF9qMmstPmNzdHJfaW5mby0+dGlsZVt0aWxlbm9dLnRwID0gKG9wal90cF9pbmZvX3QgKikgb3BqX21hbGxvYygxMCAqIHNpemVvZihvcGpfdHBfaW5mb190KSk7IC8vIEZpeG1lICgxMCkKKyAgICAgICB9CisgICAgICAgfQorICAgICAgIGVsc2UgeworICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbdGlsZW5vXS5lbmRfcG9zICs9IHRvdGxlbjsKKyAgICAgICB9CisKKyAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3RpbGVub10udHBbcGFydG5vXS50cF9zdGFydF9wb3MgPSBwX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSAtIDEyOworICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbdGlsZW5vXS50cFtwYXJ0bm9dLnRwX2VuZF9wb3MgPQorICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbdGlsZW5vXS50cFtwYXJ0bm9dLnRwX3N0YXJ0X3BvcyArIHRvdGxlbiAtIDE7CisgICAgICAgfSovCisgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9zb2Qob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3QgKiBwX3RpbGVfY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90b3RhbF9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqbF9jc3RyX2luZm8gPSAwMDsKKyAgICBPUEpfVUlOVDMyIGxfcmVtYWluaW5nX2RhdGE7CisKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworCisgICAgT1BKX1VOVVNFRChwX3N0cmVhbSk7CisKKyAgICBpZiAocF90b3RhbF9kYXRhX3NpemUgPCA0KSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIk5vdCBlbm91Z2ggYnl0ZXMgaW4gb3V0cHV0IGJ1ZmZlciB0byB3cml0ZSBTT0QgbWFya2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLCBKMktfTVNfU09ELAorICAgICAgICAgICAgICAgICAgICAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTT0QgKi8KKyAgICBwX2RhdGEgKz0gMjsKKworICAgIC8qIG1ha2Ugcm9vbSBmb3IgdGhlIEVPRiBtYXJrZXIgKi8KKyAgICBsX3JlbWFpbmluZ19kYXRhID0gIHBfdG90YWxfZGF0YV9zaXplIC0gNDsKKworICAgIC8qIHVwZGF0ZSB0aWxlIGNvZGVyICovCisgICAgcF90aWxlX2NvZGVyLT50cF9udW0gPQorICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3BvY190aWxlX3BhcnRfbnVtYmVyIDsKKyAgICBwX3RpbGVfY29kZXItPmN1cl90cF9udW0gPQorICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXI7CisKKyAgICAvKiBJTkRFWCA+PiAqLworICAgIC8qIFRPRE8gbWVyZ2VWMjogY2hlY2sgdGhpcyBwYXJ0IHdoaWNoIHVzZSBjc3RyX2luZm8gKi8KKyAgICAvKmxfY3N0cl9pbmZvID0gcF9qMmstPmNzdHJfaW5mbzsKKyAgICBpZiAobF9jc3RyX2luZm8pIHsKKyAgICAgICAgICAgIGlmICghcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fY3VycmVudF90aWxlX3BhcnRfbnVtYmVyICkgeworICAgICAgICAgICAgICAgICAgICAvL1RPRE8gY3N0cl9pbmZvLT50aWxlW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLmVuZF9oZWFkZXIgPSBwX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSArIHBfajJrLT5wb3NfY29ycmVjdGlvbiAtIDE7CisgICAgICAgICAgICAgICAgICAgIGxfY3N0cl9pbmZvLT50aWxlW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRpbGVubyA9IHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsqLworICAgIC8qCisgICAgVE9ETworICAgIGlmCisgICAgICAgICAgICAoY3N0cl9pbmZvLT50aWxlW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnBhY2tldFtjc3RyX2luZm8tPnBhY2tubyAtIDFdLmVuZF9wb3MgPCBwX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSkKKyAgICB7CisgICAgICAgICAgICBjc3RyX2luZm8tPnRpbGVbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0ucGFja2V0W2NzdHJfaW5mby0+cGFja25vXS5zdGFydF9wb3MgPSBwX3N0cmVhbV90ZWxsKHBfc3RyZWFtKTsKKyAgICB9Ki8KKyAgICAvKn0qLworICAgIC8qIFVuaVBHPj4gKi8KKyNpZmRlZiBVU0VfSlBXTAorICAgIC8qIHVwZGF0ZSBtYXJrZXJzIHN0cnVjdCAqLworICAgIC8qT1BKX0JPT0wgcmVzID0gajJrX2FkZF9tYXJrZXIocF9qMmstPmNzdHJfaW5mbywgSjJLX01TX1NPRCwgcF9qMmstPnNvZF9zdGFydCwgMik7CisgICAgKi8KKyAgICBhc3NlcnQoMCAmJiAiVE9ETyIpOworI2VuZGlmIC8qIFVTRV9KUFdMICovCisgICAgLyogPDxVbmlQRyAqLworICAgIC8qfSovCisgICAgLyogPDwgSU5ERVggKi8KKworICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXIgPT0gMCkgeworICAgICAgICBwX3RpbGVfY29kZXItPnRjZF9pbWFnZS0+dGlsZXMtPnBhY2tubyA9IDA7CisjaWZkZWYgZGVhZGNvZGUKKyAgICAgICAgaWYgKGxfY3N0cl9pbmZvKSB7CisgICAgICAgICAgICBsX2NzdHJfaW5mby0+cGFja25vID0gMDsKICAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxfY3VycmVudF9yZWFkX3NpemUgPSAwOworI2VuZGlmCisgICAgfQorCisgICAgKnBfZGF0YV93cml0dGVuID0gMDsKKworICAgIGlmICghIG9wal90Y2RfZW5jb2RlX3RpbGUocF90aWxlX2NvZGVyLCBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLCBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGFfd3JpdHRlbiwgbF9yZW1haW5pbmdfZGF0YSwgbF9jc3RyX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJDYW5ub3QgZW5jb2RlIHRpbGVcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgICpwX2RhdGFfd3JpdHRlbiArPSAyOworCisgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3NvZChvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICBPUEpfU0laRV9UIGxfY3VycmVudF9yZWFkX3NpemU7CisgICAgb3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqIGxfY3N0cl9pbmRleCA9IDAwOworICAgIE9QSl9CWVRFICoqIGxfY3VycmVudF9kYXRhID0gMDA7CisgICAgb3BqX3RjcF90ICogbF90Y3AgPSAwMDsKKyAgICBPUEpfVUlOVDMyICogbF90aWxlX2xlbiA9IDAwOworICAgIE9QSl9CT09MIGxfc290X2xlbmd0aF9wYl9kZXRlY3RlZCA9IE9QSl9GQUxTRTsKKworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisKKyAgICBsX3RjcCA9ICYocF9qMmstPm1fY3AudGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXSk7CisKKyAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fbGFzdF90aWxlX3BhcnQpIHsKKyAgICAgICAgLyogb3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdCByZXR1cm5zIE9QSl9PRkZfVAorICAgICAgICAvLyBidXQgd2UgYXJlIGluIHRoZSBsYXN0IHRpbGUgcGFydCwKKyAgICAgICAgLy8gc28gaXRzIHJlc3VsdCB3aWxsIGZpdCBvbiBPUEpfVUlOVDMyIHVubGVzcyB3ZSBmaW5kCisgICAgICAgIC8vIGEgZmlsZSB3aXRoIGEgc2luZ2xlIHRpbGUgcGFydCBvZiBtb3JlIHRoYW4gNCBHQi4uLiovCisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGggPSAoT1BKX1VJTlQzMikoCisgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fZ2V0X251bWJlcl9ieXRlX2xlZnQocF9zdHJlYW0pIC0gMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogQ2hlY2sgdG8gYXZvaWQgcGFzcyB0aGUgbGltaXQgb2YgT1BKX1VJTlQzMiAqLworICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc290X2xlbmd0aCA+PSAyKSB7CisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoIC09IDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBNU0Q6IGNhc2UgY29tbWVudGVkIHRvIHN1cHBvcnQgZW1wdHkgU09UIG1hcmtlciAoUEhSIGRhdGEpICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICBsX2N1cnJlbnRfZGF0YSA9ICYobF90Y3AtPm1fZGF0YSk7CisgICAgbF90aWxlX2xlbiA9ICZsX3RjcC0+bV9kYXRhX3NpemU7CisKKyAgICAvKiBQYXRjaCB0byBzdXBwb3J0IG5ldyBQSFIgZGF0YSAqLworICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoKSB7CisgICAgICAgIC8qIElmIHdlIGFyZSBoZXJlLCB3ZSdsbCB0cnkgdG8gcmVhZCB0aGUgZGF0YSBhZnRlciBhbGxvY2F0aW9uICovCisgICAgICAgIC8qIENoZWNrIGVub3VnaCBieXRlcyBsZWZ0IGluIHN0cmVhbSBiZWZvcmUgYWxsb2NhdGlvbiAqLworICAgICAgICBpZiAoKE9QSl9PRkZfVClwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoID4KKyAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX2dldF9udW1iZXJfYnl0ZV9sZWZ0KHBfc3RyZWFtKSkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbGUgcGFydCBsZW5ndGggc2l6ZSBpbmNvbnNpc3RlbnQgd2l0aCBzdHJlYW0gbGVuZ3RoXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGggPgorICAgICAgICAgICAgICAgIFVJTlRfTUFYIC0gT1BKX0NPTU1PTl9DQkxLX0RBVEFfRVhUUkEpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoID4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiVUlOVF9NQVggLSBPUEpfQ09NTU9OX0NCTEtfREFUQV9FWFRSQSIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICAvKiBBZGQgYSBtYXJnaW4gb2YgT1BKX0NPTU1PTl9DQkxLX0RBVEFfRVhUUkEgdG8gdGhlIGFsbG9jYXRpb24gd2UgKi8KKyAgICAgICAgLyogZG8gc28gdGhhdCBvcGpfbXFjX2luaXRfZGVjX2NvbW1vbigpIGNhbiBzYWZlbHkgYWRkIGEgc3ludGhldGljICovCisgICAgICAgIC8qIDB4RkZGRiBtYXJrZXIuICovCisgICAgICAgIGlmICghICpsX2N1cnJlbnRfZGF0YSkgeworICAgICAgICAgICAgLyogTEg6IG9kZGx5IGVub3VnaCwgaW4gdGhpcyBwYXRoLCBsX3RpbGVfbGVuIT0wLgorICAgICAgICAgICAgICogVE9ETzogSWYgdGhpcyB3YXMgY29uc2lzdGVudCwgd2UgY291bGQgc2ltcGxpZnkgdGhlIGNvZGUgdG8gb25seSB1c2UgcmVhbGxvYygpLCBhcyByZWFsbG9jKDAsLi4uKSBkZWZhdWx0IHRvIG1hbGxvYygwLC4uLikuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICpsX2N1cnJlbnRfZGF0YSA9IChPUEpfQllURSopIG9wal9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc290X2xlbmd0aCArIE9QSl9DT01NT05fQ0JMS19EQVRBX0VYVFJBKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9QSl9CWVRFICpsX25ld19jdXJyZW50X2RhdGE7CisgICAgICAgICAgICBpZiAoKmxfdGlsZV9sZW4gPiBVSU5UX01BWCAtIE9QSl9DT01NT05fQ0JMS19EQVRBX0VYVFJBIC0KKyAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc290X2xlbmd0aCkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKmxfdGlsZV9sZW4gPiBVSU5UX01BWCAtIE9QSl9DT01NT05fQ0JMS19EQVRBX0VYVFJBIC0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGgiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsX25ld19jdXJyZW50X2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MoKmxfY3VycmVudF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxfdGlsZV9sZW4gKyBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9DT01NT05fQ0JMS19EQVRBX0VYVFJBKTsKKyAgICAgICAgICAgIGlmICghIGxfbmV3X2N1cnJlbnRfZGF0YSkgeworICAgICAgICAgICAgICAgIG9wal9mcmVlKCpsX2N1cnJlbnRfZGF0YSk7CisgICAgICAgICAgICAgICAgLypub3RoaW5nIG1vcmUgaXMgZG9uZSBhcyBsX2N1cnJlbnRfZGF0YSB3aWxsIGJlIHNldCB0byBudWxsLCBhbmQganVzdAorICAgICAgICAgICAgICAgICAgYWZ0ZXJ3YXJkIHdlIGVudGVyIGluIHRoZSBlcnJvciBwYXRoCisgICAgICAgICAgICAgICAgICBhbmQgdGhlIGFjdHVhbCB0aWxlX2xlbiBpcyB1cGRhdGVkIChjb21taXR0ZWQpIGF0IHRoZSBlbmQgb2YgdGhlCisgICAgICAgICAgICAgICAgICBmdW5jdGlvbi4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpsX2N1cnJlbnRfZGF0YSA9IGxfbmV3X2N1cnJlbnRfZGF0YTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChsX2N1cnJlbnRfcmVhZF9zaXplICE9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9IEoyS19TVEFURV9ORU9DOworICAgICAgICBpZiAoKmxfY3VycmVudF9kYXRhID09IDAwKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gZGVjb2RlIHRpbGVcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9IEoyS19TVEFURV9UUEhTT1Q7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbF9zb3RfbGVuZ3RoX3BiX2RldGVjdGVkID0gT1BKX1RSVUU7CisgICAgfQorCisgICAgLyogSW5kZXggKi8KKyAgICBsX2NzdHJfaW5kZXggPSBwX2oyay0+Y3N0cl9pbmRleDsKKyAgICBpZiAobF9jc3RyX2luZGV4KSB7CisgICAgICAgIE9QSl9PRkZfVCBsX2N1cnJlbnRfcG9zID0gb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSAtIDI7CisKKyAgICAgICAgT1BKX1VJTlQzMiBsX2N1cnJlbnRfdGlsZV9wYXJ0ID0KKyAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5jdXJyZW50X3Rwc25vOworICAgICAgICBsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udHBfaW5kZXhbbF9jdXJyZW50X3RpbGVfcGFydF0uZW5kX2hlYWRlcgorICAgICAgICAgICAgPQorICAgICAgICAgICAgICAgIGxfY3VycmVudF9wb3M7CisgICAgICAgIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50cF9pbmRleFtsX2N1cnJlbnRfdGlsZV9wYXJ0XS5lbmRfcG9zCisgICAgICAgICAgICA9CisgICAgICAgICAgICAgICAgbF9jdXJyZW50X3BvcyArIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGggKyAyOworCisgICAgICAgIGlmIChPUEpfRkFMU0UgPT0gb3BqX2oya19hZGRfdGxtYXJrZXIocF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NzdHJfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSjJLX01TX1NPRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGggKyAyKSkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCB0bCBtYXJrZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQogCi0gICAgICAgICpsX3RpbGVfbGVuICs9IChPUEpfVUlOVDMyKWxfY3VycmVudF9yZWFkX3NpemU7CisgICAgICAgIC8qbF9jc3RyX2luZGV4LT5wYWNrbm8gPSAwOyovCisgICAgfQogCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAvKiBQYXRjaCB0byBzdXBwb3J0IG5ldyBQSFIgZGF0YSAqLworICAgIGlmICghbF9zb3RfbGVuZ3RoX3BiX2RldGVjdGVkKSB7CisgICAgICAgIGxfY3VycmVudF9yZWFkX3NpemUgPSBvcGpfc3RyZWFtX3JlYWRfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbF9jdXJyZW50X2RhdGEgKyAqbF90aWxlX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWFuYWdlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbF9jdXJyZW50X3JlYWRfc2l6ZSA9IDA7CisgICAgfQorCisgICAgaWYgKGxfY3VycmVudF9yZWFkX3NpemUgIT0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc290X2xlbmd0aCkgeworICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9IEoyS19TVEFURV9ORU9DOworICAgIH0gZWxzZSB7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID0gSjJLX1NUQVRFX1RQSFNPVDsKKyAgICB9CisKKyAgICAqbF90aWxlX2xlbiArPSAoT1BKX1VJTlQzMilsX2N1cnJlbnRfcmVhZF9zaXplOworCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiBzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9yZ24ob3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG5iX2NvbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBuYl9jb21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0gICAgICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3Jnbl9zaXplOwotICAgICAgICBvcGpfY3BfdCAqbF9jcCA9IDAwOwotICAgICAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7Ci0gICAgICAgIG9wal90Y2NwX3QgKmxfdGNjcCA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfY29tcF9yb29tOworICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKKyAgICBPUEpfVUlOVDMyIGxfcmduX3NpemU7CisgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKKyAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7CisgICAgb3BqX3RjY3BfdCAqbF90Y2NwID0gMDA7CisgICAgT1BKX1VJTlQzMiBsX2NvbXBfcm9vbTsKIAotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CiAKLSAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOwotICAgICAgICBsX3RjcCA9ICZsX2NwLT50Y3BzW3BfdGlsZV9ub107Ci0gICAgICAgIGxfdGNjcCA9ICZsX3RjcC0+dGNjcHNbcF9jb21wX25vXTsKKyAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7CisgICAgbF90Y3AgPSAmbF9jcC0+dGNwc1twX3RpbGVfbm9dOworICAgIGxfdGNjcCA9ICZsX3RjcC0+dGNjcHNbcF9jb21wX25vXTsKIAotICAgICAgICBpZiAobmJfY29tcHMgPD0gMjU2KSB7Ci0gICAgICAgICAgICAgICAgbF9jb21wX3Jvb20gPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGxfY29tcF9yb29tID0gMjsKLSAgICAgICAgfQorICAgIGlmIChuYl9jb21wcyA8PSAyNTYpIHsKKyAgICAgICAgbF9jb21wX3Jvb20gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGxfY29tcF9yb29tID0gMjsKKyAgICB9CiAKLSAgICAgICAgbF9yZ25fc2l6ZSA9IDYgKyBsX2NvbXBfcm9vbTsKKyAgICBsX3Jnbl9zaXplID0gNiArIGxfY29tcF9yb29tOwogCi0gICAgICAgIGxfY3VycmVudF9kYXRhID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YTsKKyAgICBsX2N1cnJlbnRfZGF0YSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGE7CiAKLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLEoyS19NU19SR04sMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSR04gICovCi0gICAgICAgIGxfY3VycmVudF9kYXRhICs9IDI7CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLCBKMktfTVNfUkdOLAorICAgICAgICAgICAgICAgICAgICAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJHTiAgKi8KKyAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwogCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX3Jnbl9zaXplLTIsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTHJnbiAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgbF9yZ25fc2l6ZSAtIDIsCisgICAgICAgICAgICAgICAgICAgIDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExyZ24gKi8KKyAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwogCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxwX2NvbXBfbm8sbF9jb21wX3Jvb20pOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3JnbiAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSs9bF9jb21wX3Jvb207CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLCBwX2NvbXBfbm8sCisgICAgICAgICAgICAgICAgICAgIGxfY29tcF9yb29tKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENyZ24gKi8KKyAgICBsX2N1cnJlbnRfZGF0YSArPSBsX2NvbXBfcm9vbTsKIAotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIDAsMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNyZ24gKi8KLSAgICAgICAgKytsX2N1cnJlbnRfZGF0YTsKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTcmduICovCisgICAgKytsX2N1cnJlbnRfZGF0YTsKIAotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIChPUEpfVUlOVDMyKWxfdGNjcC0+cm9pc2hpZnQsMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNQcmduICovCi0gICAgICAgICsrbF9jdXJyZW50X2RhdGE7CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLCAoT1BKX1VJTlQzMilsX3RjY3AtPnJvaXNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU1ByZ24gKi8KKyAgICArK2xfY3VycmVudF9kYXRhOwogCi0gICAgICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSxsX3Jnbl9zaXplLHBfbWFuYWdlcikgIT0gbF9yZ25fc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwgbF9yZ25fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWFuYWdlcikgIT0gbF9yZ25fc2l6ZSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9lb2MoICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9lb2Mob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKIAotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSxKMktfTVNfRU9DLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFT0MgKi8KKyAgICBvcGpfd3JpdGVfYnl0ZXMocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgSjJLX01TX0VPQywgMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRU9DICovCiAKLS8qIFVuaVBHPj4gKi8KKyAgICAvKiBVbmlQRz4+ICovCiAjaWZkZWYgVVNFX0pQV0wKLSAgICAgICAgLyogdXBkYXRlIG1hcmtlcnMgc3RydWN0ICovCi0gICAgICAgIC8qCi0gICAgICAgIE9QSl9CT09MIHJlcyA9IGoya19hZGRfbWFya2VyKHBfajJrLT5jc3RyX2luZm8sIEoyS19NU19FT0MsIHBfc3RyZWFtX3RlbGwocF9zdHJlYW0pIC0gMiwgMik7Ci0qLworICAgIC8qIHVwZGF0ZSBtYXJrZXJzIHN0cnVjdCAqLworICAgIC8qCisgICAgT1BKX0JPT0wgcmVzID0gajJrX2FkZF9tYXJrZXIocF9qMmstPmNzdHJfaW5mbywgSjJLX01TX0VPQywgcF9zdHJlYW1fdGVsbChwX3N0cmVhbSkgLSAyLCAyKTsKKyAgICAqLwogI2VuZGlmIC8qIFVTRV9KUFdMICovCiAKLSAgICAgICAgaWYgKCBvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwyLHBfbWFuYWdlcikgIT0gMikgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwgMiwgcF9tYW5hZ2VyKSAhPSAyKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIGlmICggISBvcGpfc3RyZWFtX2ZsdXNoKHBfc3RyZWFtLHBfbWFuYWdlcikgKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIGlmICghIG9wal9zdHJlYW1fZmx1c2gocF9zdHJlYW0sIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAogLyoqCkBAIC00NTI2LDU5NCArNDkzMiw2MzIgQEAKICAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBQT0MgbWFya2VyLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9yZ24gKG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX3JnbihvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX2NvbXA7Ci0gICAgICAgIG9wal9pbWFnZV90ICogbF9pbWFnZSA9IDAwOworICAgIE9QSl9VSU5UMzIgbF9uYl9jb21wOworICAgIG9wal9pbWFnZV90ICogbF9pbWFnZSA9IDAwOwogCi0gICAgICAgIG9wal9jcF90ICpsX2NwID0gMDA7Ci0gICAgICAgIG9wal90Y3BfdCAqbF90Y3AgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2NvbXBfcm9vbSwgbF9jb21wX25vLCBsX3JvaV9zdHk7CisgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKKyAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7CisgICAgT1BKX1VJTlQzMiBsX2NvbXBfcm9vbSwgbF9jb21wX25vLCBsX3JvaV9zdHk7CiAKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyovCi0gICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyovCisgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CiAKLSAgICAgICAgbF9pbWFnZSA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2U7Ci0gICAgICAgIGxfbmJfY29tcCA9IGxfaW1hZ2UtPm51bWNvbXBzOworICAgIGxfaW1hZ2UgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlOworICAgIGxfbmJfY29tcCA9IGxfaW1hZ2UtPm51bWNvbXBzOwogCi0gICAgICAgIGlmIChsX25iX2NvbXAgPD0gMjU2KSB7Ci0gICAgICAgICAgICAgICAgbF9jb21wX3Jvb20gPSAxOyB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIGxfY29tcF9yb29tID0gMjsgfQorICAgIGlmIChsX25iX2NvbXAgPD0gMjU2KSB7CisgICAgICAgIGxfY29tcF9yb29tID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBsX2NvbXBfcm9vbSA9IDI7CisgICAgfQogCi0gICAgICAgIGlmIChwX2hlYWRlcl9zaXplICE9IDIgKyBsX2NvbXBfcm9vbSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFJHTiBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICBpZiAocF9oZWFkZXJfc2l6ZSAhPSAyICsgbF9jb21wX3Jvb20pIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgUkdOIG1hcmtlclxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKLSAgICAgICAgbF90Y3AgPSAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX1RQSCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9jcC0+dGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOworICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKKyAgICBsX3RjcCA9IChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfVFBIKSA/CisgICAgICAgICAgICAmbF9jcC0+dGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXSA6CisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcDsKIAotICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX2NvbXBfbm8sbF9jb21wX3Jvb20pOyAgICAgICAgICAgLyogQ3JnbiAqLwotICAgICAgICBwX2hlYWRlcl9kYXRhKz1sX2NvbXBfcm9vbTsKLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9yb2lfc3R5LDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTcmduICovCi0gICAgICAgICsrcF9oZWFkZXJfZGF0YTsKKyAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAmbF9jb21wX25vLCBsX2NvbXBfcm9vbSk7ICAgICAgICAgLyogQ3JnbiAqLworICAgIHBfaGVhZGVyX2RhdGEgKz0gbF9jb21wX3Jvb207CisgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgJmxfcm9pX3N0eSwKKyAgICAgICAgICAgICAgICAgICAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3JnbiAqLworICAgICsrcF9oZWFkZXJfZGF0YTsKIAogI2lmZGVmIFVTRV9KUFdMCi0gICAgICAgIGlmIChsX2NwLT5jb3JyZWN0KSB7Ci0gICAgICAgICAgICAgICAgLyogdG90bGVuIGlzIG5lZ2F0aXZlIG9yIGxhcmdlciB0aGFuIHRoZSBieXRlcyBsZWZ0ISEhICovCi0gICAgICAgICAgICAgICAgaWYgKGxfY29tcF9yb29tID49IGxfbmJfY29tcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQV0w6IGJhZCBjb21wb25lbnQgbnVtYmVyIGluIFJHTiAoJWQgd2hlbiB0aGVyZSBhcmUgb25seSAlZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY29tcF9yb29tLCBsX25iX2NvbXApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFKUFdMX0FTU1VNRSB8fCBKUFdMX0FTU1VNRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSlBXTDogZ2l2aW5nIHVwXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH07CisgICAgaWYgKGxfY3AtPmNvcnJlY3QpIHsKKyAgICAgICAgLyogdG90bGVuIGlzIG5lZ2F0aXZlIG9yIGxhcmdlciB0aGFuIHRoZSBieXRlcyBsZWZ0ISEhICovCisgICAgICAgIGlmIChsX2NvbXBfcm9vbSA+PSBsX25iX2NvbXApIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJKUFdMOiBiYWQgY29tcG9uZW50IG51bWJlciBpbiBSR04gKCVkIHdoZW4gdGhlcmUgYXJlIG9ubHkgJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NvbXBfcm9vbSwgbF9uYl9jb21wKTsKKyAgICAgICAgICAgIGlmICghSlBXTF9BU1NVTUUpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSlBXTDogZ2l2aW5nIHVwXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKICNlbmRpZiAvKiBVU0VfSlBXTCAqLwogCi0gICAgICAgIC8qIHRlc3RjYXNlIDM2MzUucGRmLmFzYW4uNzcuMjkzMCAqLwotICAgICAgICBpZiAobF9jb21wX25vID49IGxfbmJfY29tcCkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiYmFkIGNvbXBvbmVudCBudW1iZXIgaW4gUkdOICglZCB3aGVuIHRoZXJlIGFyZSBvbmx5ICVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY29tcF9ubywgbF9uYl9jb21wKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgLyogdGVzdGNhc2UgMzYzNS5wZGYuYXNhbi43Ny4yOTMwICovCisgICAgaWYgKGxfY29tcF9ubyA+PSBsX25iX2NvbXApIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiYmFkIGNvbXBvbmVudCBudW1iZXIgaW4gUkdOICglZCB3aGVuIHRoZXJlIGFyZSBvbmx5ICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBsX2NvbXBfbm8sIGxfbmJfY29tcCk7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsKE9QSl9VSU5UMzIgKikgKCYobF90Y3AtPnRjY3BzW2xfY29tcF9ub10ucm9pc2hpZnQpKSwxKTsgICAvKiBTUHJnbiAqLwotICAgICAgICArK3BfaGVhZGVyX2RhdGE7CisgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMiAqKSgmKGxfdGNwLT50Y2Nwc1tsX2NvbXBfbm9dLnJvaXNoaWZ0KSksIDEpOyAgLyogU1ByZ24gKi8KKyAgICArK3BfaGVhZGVyX2RhdGE7CiAKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIHJldHVybiBPUEpfVFJVRTsKIAogfQogCi1zdGF0aWMgT1BKX0ZMT0FUMzIgb3BqX2oya19nZXRfdHBfc3RyaWRlIChvcGpfdGNwX3QgKiBwX3RjcCkKK3N0YXRpYyBPUEpfRkxPQVQzMiBvcGpfajJrX2dldF90cF9zdHJpZGUob3BqX3RjcF90ICogcF90Y3ApCiB7Ci0gICAgICAgIHJldHVybiAoT1BKX0ZMT0FUMzIpICgocF90Y3AtPm1fbmJfdGlsZV9wYXJ0cyAtIDEpICogMTQpOworICAgIHJldHVybiAoT1BKX0ZMT0FUMzIpKChwX3RjcC0+bV9uYl90aWxlX3BhcnRzIC0gMSkgKiAxNCk7CiB9CiAKLXN0YXRpYyBPUEpfRkxPQVQzMiBvcGpfajJrX2dldF9kZWZhdWx0X3N0cmlkZSAob3BqX3RjcF90ICogcF90Y3ApCitzdGF0aWMgT1BKX0ZMT0FUMzIgb3BqX2oya19nZXRfZGVmYXVsdF9zdHJpZGUob3BqX3RjcF90ICogcF90Y3ApCiB7CiAgICAgKHZvaWQpcF90Y3A7CiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3VwZGF0ZV9yYXRlcyggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfdXBkYXRlX3JhdGVzKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKIHsKLSAgICAgICAgb3BqX2NwX3QgKiBsX2NwID0gMDA7Ci0gICAgICAgIG9wal9pbWFnZV90ICogbF9pbWFnZSA9IDAwOwotICAgICAgICBvcGpfdGNwX3QgKiBsX3RjcCA9IDAwOwotICAgICAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IDAwOworICAgIG9wal9jcF90ICogbF9jcCA9IDAwOworICAgIG9wal9pbWFnZV90ICogbF9pbWFnZSA9IDAwOworICAgIG9wal90Y3BfdCAqIGxfdGNwID0gMDA7CisgICAgb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1nX2NvbXAgPSAwMDsKIAotICAgICAgICBPUEpfVUlOVDMyIGksaixrOwotICAgICAgICBPUEpfSU5UMzIgbF94MCxsX3kwLGxfeDEsbF95MTsKLSAgICAgICAgT1BKX0ZMT0FUMzIgKiBsX3JhdGVzID0gMDsKLSAgICAgICAgT1BKX0ZMT0FUMzIgbF9zb3RfcmVtb3ZlOwotICAgICAgICBPUEpfVUlOVDMyIGxfYml0c19lbXB0eSwgbF9zaXplX3BpeGVsOwotICAgICAgICBPUEpfVUlOVDMyIGxfdGlsZV9zaXplID0gMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2xhc3RfcmVzOwotICAgICAgICBPUEpfRkxPQVQzMiAoKiBsX3RwX3N0cmlkZV9mdW5jKShvcGpfdGNwX3QgKikgPSAwMDsKKyAgICBPUEpfVUlOVDMyIGksIGosIGs7CisgICAgT1BKX0lOVDMyIGxfeDAsIGxfeTAsIGxfeDEsIGxfeTE7CisgICAgT1BKX0ZMT0FUMzIgKiBsX3JhdGVzID0gMDsKKyAgICBPUEpfRkxPQVQzMiBsX3NvdF9yZW1vdmU7CisgICAgT1BKX1VJTlQzMiBsX2JpdHNfZW1wdHksIGxfc2l6ZV9waXhlbDsKKyAgICBPUEpfVUlOVDMyIGxfdGlsZV9zaXplID0gMDsKKyAgICBPUEpfVUlOVDMyIGxfbGFzdF9yZXM7CisgICAgT1BKX0ZMT0FUMzIoKiBsX3RwX3N0cmlkZV9mdW5jKShvcGpfdGNwX3QgKikgPSAwMDsKIAotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CiAKLSAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOwotICAgICAgICBsX2ltYWdlID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZTsKLSAgICAgICAgbF90Y3AgPSBsX2NwLT50Y3BzOworICAgIE9QSl9VTlVTRUQocF9tYW5hZ2VyKTsKIAotICAgICAgICBsX2JpdHNfZW1wdHkgPSA4ICogbF9pbWFnZS0+Y29tcHMtPmR4ICogbF9pbWFnZS0+Y29tcHMtPmR5OwotICAgICAgICBsX3NpemVfcGl4ZWwgPSBsX2ltYWdlLT5udW1jb21wcyAqIGxfaW1hZ2UtPmNvbXBzLT5wcmVjOwotICAgICAgICBsX3NvdF9yZW1vdmUgPSAoT1BKX0ZMT0FUMzIpIG9wal9zdHJlYW1fdGVsbChwX3N0cmVhbSkgLyAoT1BKX0ZMT0FUMzIpKGxfY3AtPnRoICogbF9jcC0+dHcpOworICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKKyAgICBsX2ltYWdlID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZTsKKyAgICBsX3RjcCA9IGxfY3AtPnRjcHM7CiAKLSAgICAgICAgaWYgKGxfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV90cF9vbikgewotICAgICAgICAgICAgICAgIGxfdHBfc3RyaWRlX2Z1bmMgPSBvcGpfajJrX2dldF90cF9zdHJpZGU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbF90cF9zdHJpZGVfZnVuYyA9IG9wal9qMmtfZ2V0X2RlZmF1bHRfc3RyaWRlOwotICAgICAgICB9CisgICAgbF9iaXRzX2VtcHR5ID0gOCAqIGxfaW1hZ2UtPmNvbXBzLT5keCAqIGxfaW1hZ2UtPmNvbXBzLT5keTsKKyAgICBsX3NpemVfcGl4ZWwgPSBsX2ltYWdlLT5udW1jb21wcyAqIGxfaW1hZ2UtPmNvbXBzLT5wcmVjOworICAgIGxfc290X3JlbW92ZSA9IChPUEpfRkxPQVQzMikgb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSAvIChPUEpfRkxPQVQzMikoCisgICAgICAgICAgICAgICAgICAgICAgIGxfY3AtPnRoICogbF9jcC0+dHcpOwogCi0gICAgICAgIGZvciAoaT0wO2k8bF9jcC0+dGg7KytpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChqPTA7ajxsX2NwLT50dzsrK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyIGxfb2Zmc2V0ID0gKE9QSl9GTE9BVDMyKSgqbF90cF9zdHJpZGVfZnVuYykobF90Y3ApIC8gKE9QSl9GTE9BVDMyKWxfdGNwLT5udW1sYXllcnM7CisgICAgaWYgKGxfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV90cF9vbikgeworICAgICAgICBsX3RwX3N0cmlkZV9mdW5jID0gb3BqX2oya19nZXRfdHBfc3RyaWRlOworICAgIH0gZWxzZSB7CisgICAgICAgIGxfdHBfc3RyaWRlX2Z1bmMgPSBvcGpfajJrX2dldF9kZWZhdWx0X3N0cmlkZTsKKyAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQgYm9yZGVycyBvZiB0aGUgdGlsZSByZXNjYWxlIG9uIHRoZSBpbWFnZSBpZiBuZWNlc3NhcnkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfeDAgPSBvcGpfaW50X21heCgoT1BKX0lOVDMyKShsX2NwLT50eDAgKyBqICogbF9jcC0+dGR4KSwgKE9QSl9JTlQzMilsX2ltYWdlLT54MCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3kwID0gb3BqX2ludF9tYXgoKE9QSl9JTlQzMikobF9jcC0+dHkwICsgaSAqIGxfY3AtPnRkeSksIChPUEpfSU5UMzIpbF9pbWFnZS0+eTApOwotICAgICAgICAgICAgICAgICAgICAgICAgbF94MSA9IG9wal9pbnRfbWluKChPUEpfSU5UMzIpKGxfY3AtPnR4MCArIChqICsgMSkgKiBsX2NwLT50ZHgpLCAoT1BKX0lOVDMyKWxfaW1hZ2UtPngxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfeTEgPSBvcGpfaW50X21pbigoT1BKX0lOVDMyKShsX2NwLT50eTAgKyAoaSArIDEpICogbF9jcC0+dGR5KSwgKE9QSl9JTlQzMilsX2ltYWdlLT55MSk7CisgICAgZm9yIChpID0gMDsgaSA8IGxfY3AtPnRoOyArK2kpIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGxfY3AtPnR3OyArK2opIHsKKyAgICAgICAgICAgIE9QSl9GTE9BVDMyIGxfb2Zmc2V0ID0gKE9QSl9GTE9BVDMyKSgqbF90cF9zdHJpZGVfZnVuYykobF90Y3ApIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9GTE9BVDMyKWxfdGNwLT5udW1sYXllcnM7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfcmF0ZXMgPSBsX3RjcC0+cmF0ZXM7CisgICAgICAgICAgICAvKiA0IGJvcmRlcnMgb2YgdGhlIHRpbGUgcmVzY2FsZSBvbiB0aGUgaW1hZ2UgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgICAgICBsX3gwID0gb3BqX2ludF9tYXgoKE9QSl9JTlQzMikobF9jcC0+dHgwICsgaiAqIGxfY3AtPnRkeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMilsX2ltYWdlLT54MCk7CisgICAgICAgICAgICBsX3kwID0gb3BqX2ludF9tYXgoKE9QSl9JTlQzMikobF9jcC0+dHkwICsgaSAqIGxfY3AtPnRkeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMilsX2ltYWdlLT55MCk7CisgICAgICAgICAgICBsX3gxID0gb3BqX2ludF9taW4oKE9QSl9JTlQzMikobF9jcC0+dHgwICsgKGogKyAxKSAqIGxfY3AtPnRkeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMilsX2ltYWdlLT54MSk7CisgICAgICAgICAgICBsX3kxID0gb3BqX2ludF9taW4oKE9QSl9JTlQzMikobF9jcC0+dHkwICsgKGkgKyAxKSAqIGxfY3AtPnRkeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMilsX2ltYWdlLT55MSk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vZGlmaWNhdGlvbiBvZiB0aGUgUkFURSA+PiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpsX3JhdGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsX3JhdGVzID0gICAgICAgICAgICAgICgoIChPUEpfRkxPQVQzMikgKGxfc2l6ZV9waXhlbCAqIChPUEpfVUlOVDMyKShsX3gxIC0gbF94MCkgKiAoT1BKX1VJTlQzMikobF95MSAtIGxfeTApKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgqbF9yYXRlcykgKiAoT1BKX0ZMT0FUMzIpbF9iaXRzX2VtcHR5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBsX3JhdGVzID0gbF90Y3AtPnJhdGVzOwogCi0gICAgICAgICAgICAgICAgICAgICAgICArK2xfcmF0ZXM7CisgICAgICAgICAgICAvKiBNb2RpZmljYXRpb24gb2YgdGhlIFJBVEUgPj4gKi8KKyAgICAgICAgICAgIGlmICgqbF9yYXRlcyA+IDAuMGYpIHsKKyAgICAgICAgICAgICAgICAqbF9yYXRlcyA9ICgoKE9QSl9GTE9BVDMyKShsX3NpemVfcGl4ZWwgKiAoT1BKX1VJTlQzMikobF94MSAtIGxfeDApICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMikobF95MSAtIGxfeTApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgqbF9yYXRlcykgKiAoT1BKX0ZMT0FUMzIpbF9iaXRzX2VtcHR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXQ7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPCBsX3RjcC0+bnVtbGF5ZXJzOyArK2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpsX3JhdGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxfcmF0ZXMgPSAgICAgICAgICAgICAgKCggKE9QSl9GTE9BVDMyKSAobF9zaXplX3BpeGVsICogKE9QSl9VSU5UMzIpKGxfeDEgLSBsX3gwKSAqIChPUEpfVUlOVDMyKShsX3kxIC0gbF95MCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCpsX3JhdGVzKSAqIChPUEpfRkxPQVQzMilsX2JpdHNfZW1wdHkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKytsX3JhdGVzOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9yYXRlczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgKytsX3RjcDsKLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGxfdGNwID0gbF9jcC0+dGNwczsKLQotICAgICAgICBmb3IgKGk9MDtpPGxfY3AtPnRoOysraSkgewotICAgICAgICAgICAgICAgIGZvciAgICAgKGo9MDtqPGxfY3AtPnR3OysraikgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9yYXRlcyA9IGxfdGNwLT5yYXRlczsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpsX3JhdGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsX3JhdGVzIC09IGxfc290X3JlbW92ZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmxfcmF0ZXMgPCAzMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsX3JhdGVzID0gMzA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgKytsX3JhdGVzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBsX2xhc3RfcmVzID0gbF90Y3AtPm51bWxheWVycyAtIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPCBsX2xhc3RfcmVzOyArK2spIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmxfcmF0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbF9yYXRlcyAtPSBsX3NvdF9yZW1vdmU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmxfcmF0ZXMgPCAqKGxfcmF0ZXMgLSAxKSArIDEwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbF9yYXRlcyAgPSAoKihsX3JhdGVzIC0gMSkpICsgMjA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX3JhdGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmxfcmF0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxfcmF0ZXMgLT0gKGxfc290X3JlbW92ZSArIDIuZik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpsX3JhdGVzIDwgKihsX3JhdGVzIC0gMSkgKyAxMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsX3JhdGVzICA9ICgqKGxfcmF0ZXMgLSAxKSkgKyAyMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICArK2xfdGNwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGxfaW1nX2NvbXAgPSBsX2ltYWdlLT5jb21wczsKLSAgICAgICAgbF90aWxlX3NpemUgPSAwOwotCi0gICAgICAgIGZvciAoaT0wO2k8bF9pbWFnZS0+bnVtY29tcHM7KytpKSB7Ci0gICAgICAgICAgICAgICAgbF90aWxlX3NpemUgKz0gKCAgICAgICAgb3BqX3VpbnRfY2VpbGRpdihsX2NwLT50ZHgsbF9pbWdfY29tcC0+ZHgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3VpbnRfY2VpbGRpdihsX2NwLT50ZHksbF9pbWdfY29tcC0+ZHkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9pbWdfY29tcC0+cHJlYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgICAgICsrbF9pbWdfY29tcDsKLSAgICAgICAgfQotCi0gICAgICAgIGxfdGlsZV9zaXplID0gKE9QSl9VSU5UMzIpIChsX3RpbGVfc2l6ZSAqIDAuMTYyNSk7IC8qIDEuMy84ID0gMC4xNjI1ICovCi0KLSAgICAgICAgbF90aWxlX3NpemUgKz0gb3BqX2oya19nZXRfc3BlY2lmaWNfaGVhZGVyX3NpemVzKHBfajJrKTsKLQotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfc2l6ZSA9IGxfdGlsZV9zaXplOwotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0JZVEUgKikgb3BqX21hbGxvYyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfc2l6ZSk7Ci0gICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YSA9PSAwMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoT1BKX0lTX0NJTkVNQShsX2NwLT5yc2l6KSkgewotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19idWZmZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0JZVEUgKikgb3BqX21hbGxvYyg1KnBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RvdGFsX3RpbGVfcGFydHMpOwotICAgICAgICAgICAgICAgIGlmICghIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19idWZmZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICBmb3IgKGsgPSAxOyBrIDwgbF90Y3AtPm51bWxheWVyczsgKytrKSB7CisgICAgICAgICAgICAgICAgaWYgKCpsX3JhdGVzID4gMC4wZikgeworICAgICAgICAgICAgICAgICAgICAqbF9yYXRlcyA9ICgoKE9QSl9GTE9BVDMyKShsX3NpemVfcGl4ZWwgKiAoT1BKX1VJTlQzMikobF94MSAtIGxfeDApICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9VSU5UMzIpKGxfeTEgLSBsX3kwKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgqbF9yYXRlcykgKiAoT1BKX0ZMT0FUMzIpbF9iaXRzX2VtcHR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXQ7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2N1cnJlbnQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfYnVmZmVyOworICAgICAgICAgICAgICAgICsrbF9yYXRlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKytsX3RjcDsKKworICAgICAgICB9CisgICAgfQorCisgICAgbF90Y3AgPSBsX2NwLT50Y3BzOworCisgICAgZm9yIChpID0gMDsgaSA8IGxfY3AtPnRoOyArK2kpIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGxfY3AtPnR3OyArK2opIHsKKyAgICAgICAgICAgIGxfcmF0ZXMgPSBsX3RjcC0+cmF0ZXM7CisKKyAgICAgICAgICAgIGlmICgqbF9yYXRlcyA+IDAuMGYpIHsKKyAgICAgICAgICAgICAgICAqbF9yYXRlcyAtPSBsX3NvdF9yZW1vdmU7CisKKyAgICAgICAgICAgICAgICBpZiAoKmxfcmF0ZXMgPCAzMC4wZikgeworICAgICAgICAgICAgICAgICAgICAqbF9yYXRlcyA9IDMwLjBmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKytsX3JhdGVzOworCisgICAgICAgICAgICBsX2xhc3RfcmVzID0gbF90Y3AtPm51bWxheWVycyAtIDE7CisKKyAgICAgICAgICAgIGZvciAoayA9IDE7IGsgPCBsX2xhc3RfcmVzOyArK2spIHsKKworICAgICAgICAgICAgICAgIGlmICgqbF9yYXRlcyA+IDAuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgKmxfcmF0ZXMgLT0gbF9zb3RfcmVtb3ZlOworCisgICAgICAgICAgICAgICAgICAgIGlmICgqbF9yYXRlcyA8ICogKGxfcmF0ZXMgLSAxKSArIDEwLjBmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqbF9yYXRlcyAgPSAoKihsX3JhdGVzIC0gMSkpICsgMjAuMGY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICArK2xfcmF0ZXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgqbF9yYXRlcyA+IDAuMGYpIHsKKyAgICAgICAgICAgICAgICAqbF9yYXRlcyAtPSAobF9zb3RfcmVtb3ZlICsgMi5mKTsKKworICAgICAgICAgICAgICAgIGlmICgqbF9yYXRlcyA8ICogKGxfcmF0ZXMgLSAxKSArIDEwLjBmKSB7CisgICAgICAgICAgICAgICAgICAgICpsX3JhdGVzICA9ICgqKGxfcmF0ZXMgLSAxKSkgKyAyMC4wZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICsrbF90Y3A7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsX2ltZ19jb21wID0gbF9pbWFnZS0+Y29tcHM7CisgICAgbF90aWxlX3NpemUgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IGxfaW1hZ2UtPm51bWNvbXBzOyArK2kpIHsKKyAgICAgICAgbF90aWxlX3NpemUgKz0gKG9wal91aW50X2NlaWxkaXYobF9jcC0+dGR4LCBsX2ltZ19jb21wLT5keCkKKyAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal91aW50X2NlaWxkaXYobF9jcC0+dGR5LCBsX2ltZ19jb21wLT5keSkKKyAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPnByZWMKKyAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICArK2xfaW1nX2NvbXA7CisgICAgfQorCisgICAgLyogVE9ETzogd2hlcmUgZG9lcyB0aGlzIG1hZ2ljIHZhbHVlIGNvbWUgZnJvbSA/ICovCisgICAgLyogVGhpcyB1c2VkIHRvIGJlIDEuMyAvIDgsIGJ1dCB3aXRoIHJhbmRvbSBkYXRhIGFuZCB2ZXJ5IHNtYWxsIGNvZGUgKi8KKyAgICAvKiBibG9jayBzaXplcywgdGhpcyBpcyBub3QgZW5vdWdoLiBGb3IgZXhhbXBsZSB3aXRoICovCisgICAgLyogYmluL3Rlc3RfdGlsZV9lbmNvZGVyIDEgMjU2IDI1NiAzMiAzMiA4IDAgcmV2ZXJzaWJsZV93aXRoX3ByZWNpbmN0LmoyayA0IDQgMyAwIDAgMSAxNiAxNiAqLworICAgIC8qIFRPRE8gcmV2aXNlIHRoaXMgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIG92ZXJoZWFkIGxpbmtlZCB0byB0aGUgKi8KKyAgICAvKiBudW1iZXIgb2YgcGFja2V0cyBhbmQgbnVtYmVyIG9mIGNvZGUgYmxvY2tzIGluIHBhY2tldHMgKi8KKyAgICBsX3RpbGVfc2l6ZSA9IChPUEpfVUlOVDMyKShsX3RpbGVfc2l6ZSAqIDEuNCAvIDgpOworCisgICAgLyogQXJiaXRyYXJ5IGFtb3VudCB0byBtYWtlIHRoZSBmb2xsb3dpbmcgd29yazogKi8KKyAgICAvKiBiaW4vdGVzdF90aWxlX2VuY29kZXIgMSAyNTYgMjU2IDE3IDE2IDggMCByZXZlcnNpYmxlX25vX3ByZWNpbmN0LmoyayA0IDQgMyAwIDAgMSAqLworICAgIGxfdGlsZV9zaXplICs9IDUwMDsKKworICAgIGxfdGlsZV9zaXplICs9IG9wal9qMmtfZ2V0X3NwZWNpZmljX2hlYWRlcl9zaXplcyhwX2oyayk7CisKKyAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfc2l6ZSA9IGxfdGlsZV9zaXplOworICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2VuY29kZWRfdGlsZV9kYXRhID0KKyAgICAgICAgKE9QSl9CWVRFICopIG9wal9tYWxsb2MocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fZW5jb2RlZF90aWxlX3NpemUpOworICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YSA9PSAwMCkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIGlmIChPUEpfSVNfQ0lORU1BKGxfY3AtPnJzaXopKSB7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19idWZmZXIgPQorICAgICAgICAgICAgKE9QSl9CWVRFICopIG9wal9tYWxsb2MoNSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90b3RhbF90aWxlX3BhcnRzKTsKKyAgICAgICAgaWYgKCEgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2J1ZmZlcikgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2N1cnJlbnQgPQorICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2J1ZmZlcjsKKyAgICB9CisKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKICNpZiAwCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2VvYyAoICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX2VvYyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQogewotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIG9wal90Y2RfdCAqIGxfdGNkID0gMDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl90aWxlczsKLSAgICAgICAgb3BqX3RjcF90ICogbF90Y3AgPSAwMDsKLSAgICAgICAgT1BKX0JPT0wgbF9zdWNjZXNzOworICAgIE9QSl9VSU5UMzIgaTsKKyAgICBvcGpfdGNkX3QgKiBsX3RjZCA9IDAwOworICAgIE9QSl9VSU5UMzIgbF9uYl90aWxlczsKKyAgICBvcGpfdGNwX3QgKiBsX3RjcCA9IDAwOworICAgIE9QSl9CT09MIGxfc3VjY2VzczsKIAotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CiAKLSAgICAgICAgbF9uYl90aWxlcyA9IHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHc7Ci0gICAgICAgIGxfdGNwID0gcF9qMmstPm1fY3AudGNwczsKKyAgICBsX25iX3RpbGVzID0gcF9qMmstPm1fY3AudGggKiBwX2oyay0+bV9jcC50dzsKKyAgICBsX3RjcCA9IHBfajJrLT5tX2NwLnRjcHM7CiAKLSAgICAgICAgbF90Y2QgPSBvcGpfdGNkX2NyZWF0ZShPUEpfVFJVRSk7Ci0gICAgICAgIGlmIChsX3RjZCA9PSAwMCkgeworICAgIGxfdGNkID0gb3BqX3RjZF9jcmVhdGUoT1BKX1RSVUUpOworICAgIGlmIChsX3RjZCA9PSAwMCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ2Fubm90IGRlY29kZSB0aWxlLCBtZW1vcnkgZXJyb3JcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBsX25iX3RpbGVzOyArK2kpIHsKKyAgICAgICAgaWYgKGxfdGNwLT5tX2RhdGEpIHsKKyAgICAgICAgICAgIGlmICghIG9wal90Y2RfaW5pdF9kZWNvZGVfdGlsZShsX3RjZCwgaSkpIHsKKyAgICAgICAgICAgICAgICBvcGpfdGNkX2Rlc3Ryb3kobF90Y2QpOwogICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJDYW5ub3QgZGVjb2RlIHRpbGUsIG1lbW9yeSBlcnJvclxuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbF9zdWNjZXNzID0gb3BqX3RjZF9kZWNvZGVfdGlsZShsX3RjZCwgbF90Y3AtPm1fZGF0YSwgbF90Y3AtPm1fZGF0YV9zaXplLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleCk7CisgICAgICAgICAgICAvKiBjbGVhbnVwICovCisKKyAgICAgICAgICAgIGlmICghIGxfc3VjY2VzcykgeworICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlIHw9IEoyS19TVEFURV9FUlI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF9uYl90aWxlczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxfdGNwLT5tX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal90Y2RfaW5pdF9kZWNvZGVfdGlsZShsX3RjZCwgaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9kZXN0cm95KGxfdGNkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkNhbm5vdCBkZWNvZGUgdGlsZSwgbWVtb3J5IGVycm9yXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgb3BqX2oya190Y3BfZGVzdHJveShsX3RjcCk7CisgICAgICAgICsrbF90Y3A7CisgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICBsX3N1Y2Nlc3MgPSBvcGpfdGNkX2RlY29kZV90aWxlKGxfdGNkLCBsX3RjcC0+bV9kYXRhLCBsX3RjcC0+bV9kYXRhX3NpemUsIGksIHBfajJrLT5jc3RyX2luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFudXAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbF9zdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlIHw9IEoyS19TVEFURV9FUlI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG9wal9qMmtfdGNwX2Rlc3Ryb3kobF90Y3ApOwotICAgICAgICAgICAgICAgICsrbF90Y3A7Ci0gICAgICAgIH0KLQotICAgICAgICBvcGpfdGNkX2Rlc3Ryb3kobF90Y2QpOwotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgb3BqX3RjZF9kZXN0cm95KGxfdGNkKTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAjZW5kaWYKIAogc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZ2V0X2VuZF9oZWFkZXIob3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIpCiB7Ci0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKIAotICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+bWFpbl9oZWFkX2VuZCA9IG9wal9zdHJlYW1fdGVsbChwX3N0cmVhbSk7CisgICAgT1BKX1VOVVNFRChwX21hbmFnZXIpOwogCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICBwX2oyay0+Y3N0cl9pbmRleC0+bWFpbl9oZWFkX2VuZCA9IG9wal9zdHJlYW1fdGVsbChwX3N0cmVhbSk7CisKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX21jdF9kYXRhX2dyb3VwKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIgKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfbWN0X2RhdGFfZ3JvdXAob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqcF9zdHJlYW0sCisgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyKQogewotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90ICogbF9tY2NfcmVjb3JkOwotICAgICAgICBvcGpfbWN0X2RhdGFfdCAqIGxfbWN0X3JlY29yZDsKLSAgICAgICAgb3BqX3RjcF90ICogbF90Y3A7CisgICAgT1BKX1VJTlQzMiBpOworICAgIG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90ICogbF9tY2NfcmVjb3JkOworICAgIG9wal9tY3RfZGF0YV90ICogbF9tY3RfcmVjb3JkOworICAgIG9wal90Y3BfdCAqIGxfdGNwOwogCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKIAotICAgICAgICBpZiAoISBvcGpfajJrX3dyaXRlX2NiZChwX2oyayxwX3N0cmVhbSxwX21hbmFnZXIpKSB7CisgICAgaWYgKCEgb3BqX2oya193cml0ZV9jYmQocF9qMmssIHBfc3RyZWFtLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgbF90Y3AgPSAmKHBfajJrLT5tX2NwLnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0pOworICAgIGxfbWN0X3JlY29yZCA9IGxfdGNwLT5tX21jdF9yZWNvcmRzOworCisgICAgZm9yIChpID0gMDsgaSA8IGxfdGNwLT5tX25iX21jdF9yZWNvcmRzOyArK2kpIHsKKworICAgICAgICBpZiAoISBvcGpfajJrX3dyaXRlX21jdF9yZWNvcmQocF9qMmssIGxfbWN0X3JlY29yZCwgcF9zdHJlYW0sIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICArK2xfbWN0X3JlY29yZDsKKyAgICB9CisKKyAgICBsX21jY19yZWNvcmQgPSBsX3RjcC0+bV9tY2NfcmVjb3JkczsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsX3RjcC0+bV9uYl9tY2NfcmVjb3JkczsgKytpKSB7CisKKyAgICAgICAgaWYgKCEgb3BqX2oya193cml0ZV9tY2NfcmVjb3JkKHBfajJrLCBsX21jY19yZWNvcmQsIHBfc3RyZWFtLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgKytsX21jY19yZWNvcmQ7CisgICAgfQorCisgICAgaWYgKCEgb3BqX2oya193cml0ZV9tY28ocF9qMmssIHBfc3RyZWFtLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9hbGxfY29jKAorICAgIG9wal9qMmtfdCAqcF9qMmssCisgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqcF9zdHJlYW0sCisgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIpCit7CisgICAgT1BKX1VJTlQzMiBjb21wbm87CisKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworCisgICAgZm9yIChjb21wbm8gPSAxOyBjb21wbm8gPCBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wczsgKytjb21wbm8pIHsKKyAgICAgICAgLyogY29kIGlzIGZpcnN0IGNvbXBvbmVudCBvZiBmaXJzdCB0aWxlICovCisgICAgICAgIGlmICghIG9wal9qMmtfY29tcGFyZV9jb2MocF9qMmssIDAsIGNvbXBubykpIHsKKyAgICAgICAgICAgIGlmICghIG9wal9qMmtfd3JpdGVfY29jKHBfajJrLCBjb21wbm8sIHBfc3RyZWFtLCBwX21hbmFnZXIpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgIH0KIAotICAgICAgICBsX3RjcCA9ICYocF9qMmstPm1fY3AudGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXSk7Ci0gICAgICAgIGxfbWN0X3JlY29yZCA9IGxfdGNwLT5tX21jdF9yZWNvcmRzOworICAgIHJldHVybiBPUEpfVFJVRTsKK30KIAotICAgICAgICBmb3IgKGk9MDtpPGxfdGNwLT5tX25iX21jdF9yZWNvcmRzOysraSkgeworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfYWxsX3FjYygKKyAgICBvcGpfajJrX3QgKnBfajJrLAorICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKnBfc3RyZWFtLAorICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyKQoreworICAgIE9QSl9VSU5UMzIgY29tcG5vOwogCi0gICAgICAgICAgICAgICAgaWYgKCEgb3BqX2oya193cml0ZV9tY3RfcmVjb3JkKHBfajJrLGxfbWN0X3JlY29yZCxwX3N0cmVhbSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwogCi0gICAgICAgICAgICAgICAgKytsX21jdF9yZWNvcmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBsX21jY19yZWNvcmQgPSBsX3RjcC0+bV9tY2NfcmVjb3JkczsKLQotICAgICAgICBmb3IgICAgIChpPTA7aTxsX3RjcC0+bV9uYl9tY2NfcmVjb3JkczsrK2kpIHsKLQotICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfd3JpdGVfbWNjX3JlY29yZChwX2oyayxsX21jY19yZWNvcmQscF9zdHJlYW0scF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICArK2xfbWNjX3JlY29yZDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghIG9wal9qMmtfd3JpdGVfbWNvKHBfajJrLHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKKyAgICBmb3IgKGNvbXBubyA9IDE7IGNvbXBubyA8IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOyArK2NvbXBubykgeworICAgICAgICAvKiBxY2QgaXMgZmlyc3QgY29tcG9uZW50IG9mIGZpcnN0IHRpbGUgKi8KKyAgICAgICAgaWYgKCEgb3BqX2oya19jb21wYXJlX3FjYyhwX2oyaywgMCwgY29tcG5vKSkgeworICAgICAgICAgICAgaWYgKCEgb3BqX2oya193cml0ZV9xY2MocF9qMmssIGNvbXBubywgcF9zdHJlYW0sIHBfbWFuYWdlcikpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIH0KKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLSNpZiAwCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9hbGxfY29jKG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3JlZ2lvbnMob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyKQogewotICAgICAgICBPUEpfVUlOVDMyIGNvbXBubzsKKyAgICBPUEpfVUlOVDMyIGNvbXBubzsKKyAgICBjb25zdCBvcGpfdGNjcF90ICpsX3RjY3AgPSAwMDsKIAotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CiAKLSAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wczsgKytjb21wbm8pCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX3dyaXRlX2NvYyhwX2oyayxjb21wbm8scF9zdHJlYW0sIHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQorICAgIGxfdGNjcCA9IHBfajJrLT5tX2NwLnRjcHMtPnRjY3BzOworCisgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wczsgKytjb21wbm8pICB7CisgICAgICAgIGlmIChsX3RjY3AtPnJvaXNoaWZ0KSB7CisKKyAgICAgICAgICAgIGlmICghIG9wal9qMmtfd3JpdGVfcmduKHBfajJrLCAwLCBjb21wbm8sIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zdHJlYW0sIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotI2VuZGlmCisgICAgICAgICsrbF90Y2NwOworICAgIH0KIAotI2lmIDAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2FsbF9xY2Mob3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIgKQotewotICAgICAgICBPUEpfVUlOVDMyIGNvbXBubzsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotCi0gICAgICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHM7ICsrY29tcG5vKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCEgb3BqX2oya193cml0ZV9xY2MocF9qMmssY29tcG5vLHBfc3RyZWFtLCBwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLSNlbmRpZgotCi0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3JlZ2lvbnMoIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlciApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgY29tcG5vOwotICAgICAgICBjb25zdCBvcGpfdGNjcF90ICpsX3RjY3AgPSAwMDsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotCi0gICAgICAgIGxfdGNjcCA9IHBfajJrLT5tX2NwLnRjcHMtPnRjY3BzOwotCi0gICAgICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHM7ICsrY29tcG5vKSAgewotICAgICAgICAgICAgICAgIGlmIChsX3RjY3AtPnJvaXNoaWZ0KSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfd3JpdGVfcmduKHBfajJrLDAsY29tcG5vLHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzLHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICArK2xfdGNjcDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2VwYyggICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2VwYyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyKQogewotICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmRleF90ICogbF9jc3RyX2luZGV4ID0gMDA7CisgICAgb3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqIGxfY3N0cl9pbmRleCA9IDAwOwogCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKIAotICAgICAgICBsX2NzdHJfaW5kZXggPSBwX2oyay0+Y3N0cl9pbmRleDsKLSAgICAgICAgaWYgKGxfY3N0cl9pbmRleCkgewotICAgICAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+Y29kZXN0cmVhbV9zaXplID0gKE9QSl9VSU5UNjQpb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKTsKLSAgICAgICAgICAgICAgICAvKiBVbmlQRz4+ICovCi0gICAgICAgICAgICAgICAgLyogVGhlIGZvbGxvd2luZyBhZGp1c3RtZW50IGlzIGRvbmUgdG8gYWRqdXN0IHRoZSBjb2Rlc3RyZWFtIHNpemUgKi8KLSAgICAgICAgICAgICAgICAvKiBpZiBTT0QgaXMgbm90IGF0IDAgaW4gdGhlIGJ1ZmZlci4gVXNlZnVsIGluIGNhc2Ugb2YgSlAyLCB3aGVyZSAqLwotICAgICAgICAgICAgICAgIC8qIHRoZSBmaXJzdCBidW5jaCBvZiBieXRlcyBpcyBub3QgaW4gdGhlIGNvZGVzdHJlYW0gICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgbF9jc3RyX2luZGV4LT5jb2Rlc3RyZWFtX3NpemUgLT0gKE9QSl9VSU5UNjQpbF9jc3RyX2luZGV4LT5tYWluX2hlYWRfc3RhcnQ7Ci0gICAgICAgICAgICAgICAgLyogPDxVbmlQRyAqLwotICAgICAgICB9CisgICAgT1BKX1VOVVNFRChwX21hbmFnZXIpOworCisgICAgbF9jc3RyX2luZGV4ID0gcF9qMmstPmNzdHJfaW5kZXg7CisgICAgaWYgKGxfY3N0cl9pbmRleCkgeworICAgICAgICBsX2NzdHJfaW5kZXgtPmNvZGVzdHJlYW1fc2l6ZSA9IChPUEpfVUlOVDY0KW9wal9zdHJlYW1fdGVsbChwX3N0cmVhbSk7CisgICAgICAgIC8qIFVuaVBHPj4gKi8KKyAgICAgICAgLyogVGhlIGZvbGxvd2luZyBhZGp1c3RtZW50IGlzIGRvbmUgdG8gYWRqdXN0IHRoZSBjb2Rlc3RyZWFtIHNpemUgKi8KKyAgICAgICAgLyogaWYgU09EIGlzIG5vdCBhdCAwIGluIHRoZSBidWZmZXIuIFVzZWZ1bCBpbiBjYXNlIG9mIEpQMiwgd2hlcmUgKi8KKyAgICAgICAgLyogdGhlIGZpcnN0IGJ1bmNoIG9mIGJ5dGVzIGlzIG5vdCBpbiB0aGUgY29kZXN0cmVhbSAgICAgICAgICAgICAgKi8KKyAgICAgICAgbF9jc3RyX2luZGV4LT5jb2Rlc3RyZWFtX3NpemUgLT0gKE9QSl9VSU5UNjQpbF9jc3RyX2luZGV4LT5tYWluX2hlYWRfc3RhcnQ7CisgICAgICAgIC8qIDw8VW5pUEcgKi8KKyAgICB9CiAKICNpZmRlZiBVU0VfSlBXTAotICAgICAgICAvKiBwcmVwYXJhdGlvbiBvZiBKUFdMIG1hcmtlciBzZWdtZW50cyAqLworICAgIC8qIHByZXBhcmF0aW9uIG9mIEpQV0wgbWFya2VyIHNlZ21lbnRzICovCiAjaWYgMAotICAgICAgICBpZihjcC0+ZXBjX29uKSB7CisgICAgaWYgKGNwLT5lcGNfb24pIHsKIAotICAgICAgICAgICAgICAgIC8qIGVuY29kZSBhY2NvcmRpbmcgdG8gSlBXTCAqLwotICAgICAgICAgICAgICAgIGpwd2xfZW5jb2RlKHBfajJrLCBwX3N0cmVhbSwgaW1hZ2UpOworICAgICAgICAvKiBlbmNvZGUgYWNjb3JkaW5nIHRvIEpQV0wgKi8KKyAgICAgICAganB3bF9lbmNvZGUocF9qMmssIHBfc3RyZWFtLCBpbWFnZSk7CiAKLSAgICAgICAgfQorICAgIH0KICNlbmRpZgotICBhc3NlcnQoIDAgJiYgIlRPRE8iICk7CisgICAgYXNzZXJ0KDAgJiYgIlRPRE8iKTsKICNlbmRpZiAvKiBVU0VfSlBXTCAqLwogCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfdW5rICggICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqb3V0cHV0X21hcmtlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfdW5rKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICpvdXRwdXRfbWFya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3Vua25vd25fbWFya2VyOwotICAgICAgICBjb25zdCBvcGpfZGVjX21lbW9yeV9tYXJrZXJfaGFuZGxlcl90ICogbF9tYXJrZXJfaGFuZGxlcjsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3NpemVfdW5rID0gMjsKKyAgICBPUEpfVUlOVDMyIGxfdW5rbm93bl9tYXJrZXI7CisgICAgY29uc3Qgb3BqX2RlY19tZW1vcnlfbWFya2VyX2hhbmRsZXJfdCAqIGxfbWFya2VyX2hhbmRsZXI7CisgICAgT1BKX1VJTlQzMiBsX3NpemVfdW5rID0gMjsKIAotICAgICAgICAvKiBwcmVjb25kaXRpb25zKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyovCisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwogCi0gICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIlVua25vd24gbWFya2VyXG4iKTsKKyAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJVbmtub3duIG1hcmtlclxuIik7CiAKLQkJZm9yICg7OykgewotICAgICAgICAgICAgICAgIC8qIFRyeSB0byByZWFkIDIgYnl0ZXMgKHRoZSBuZXh0IG1hcmtlciBJRCkgZnJvbSBzdHJlYW0gYW5kIGNvcHkgdGhlbSBpbnRvIHRoZSBidWZmZXIqLwotICAgICAgICAgICAgICAgIGlmIChvcGpfc3RyZWFtX3JlYWRfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwyLHBfbWFuYWdlcikgIT0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiByZWFkIDIgYnl0ZXMgYXMgdGhlIG5ldyBtYXJrZXIgSUQqLwotICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLCZsX3Vua25vd25fbWFya2VyLDIpOwotCi0gICAgICAgICAgICAgICAgaWYgKCEobF91bmtub3duX21hcmtlciA8IDB4ZmYwMCkpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBtYXJrZXIgaGFuZGxlciBmcm9tIHRoZSBtYXJrZXIgSUQqLwotICAgICAgICAgICAgICAgICAgICAgICAgbF9tYXJrZXJfaGFuZGxlciA9IG9wal9qMmtfZ2V0X21hcmtlcl9oYW5kbGVyKGxfdW5rbm93bl9tYXJrZXIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSAmIGxfbWFya2VyX2hhbmRsZXItPnN0YXRlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk1hcmtlciBpcyBub3QgY29tcGxpYW50IHdpdGggaXRzIHBvc2l0aW9uXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9tYXJrZXJfaGFuZGxlci0+aWQgIT0gSjJLX01TX1VOSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkZCB0aGUgbWFya2VyIHRvIHRoZSBjb2Rlc3RyZWFtIGluZGV4Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9tYXJrZXJfaGFuZGxlci0+aWQgIT0gSjJLX01TX1NPVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQk9PTCByZXMgPSBvcGpfajJrX2FkZF9taG1hcmtlcihwX2oyay0+Y3N0cl9pbmRleCwgSjJLX01TX1VOSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMikgb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSAtIGxfc2l6ZV91bmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zaXplX3Vuayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzID09IE9QSl9GQUxTRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWRkIG1oIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvKiBuZXh0IG1hcmtlciBpcyBrbm93biBhbmQgd2VsbCBsb2NhdGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2l6ZV91bmsgKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisgICAgZm9yICg7OykgeworICAgICAgICAvKiBUcnkgdG8gcmVhZCAyIGJ5dGVzICh0aGUgbmV4dCBtYXJrZXIgSUQpIGZyb20gc3RyZWFtIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgYnVmZmVyKi8KKyAgICAgICAgaWYgKG9wal9zdHJlYW1fcmVhZF9kYXRhKHBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsIDIsIHBfbWFuYWdlcikgIT0gMikgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQogCi0gICAgICAgICpvdXRwdXRfbWFya2VyID0gbF9tYXJrZXJfaGFuZGxlci0+aWQgOworICAgICAgICAvKiByZWFkIDIgYnl0ZXMgYXMgdGhlIG5ldyBtYXJrZXIgSUQqLworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgJmxfdW5rbm93bl9tYXJrZXIsIDIpOwogCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KKyAgICAgICAgaWYgKCEobF91bmtub3duX21hcmtlciA8IDB4ZmYwMCkpIHsKIAotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfbWN0X3JlY29yZCggICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9tY3RfZGF0YV90ICogcF9tY3RfcmVjb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyICkKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBsX21jdF9zaXplOwotICAgICAgICBPUEpfQllURSAqIGxfY3VycmVudF9kYXRhID0gMDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF90bXA7CisgICAgICAgICAgICAvKiBHZXQgdGhlIG1hcmtlciBoYW5kbGVyIGZyb20gdGhlIG1hcmtlciBJRCovCisgICAgICAgICAgICBsX21hcmtlcl9oYW5kbGVyID0gb3BqX2oya19nZXRfbWFya2VyX2hhbmRsZXIobF91bmtub3duX21hcmtlcik7CiAKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLQotICAgICAgICBsX21jdF9zaXplID0gMTAgKyBwX21jdF9yZWNvcmQtPm1fZGF0YV9zaXplOwotCi0gICAgICAgIGlmIChsX21jdF9zaXplID4gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfdGlsZV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsIGxfbWN0X3NpemUpOwotICAgICAgICAgICAgICAgIGlmICghIG5ld19oZWFkZXJfdGlsZV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB3cml0ZSBNQ1QgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBuZXdfaGVhZGVyX3RpbGVfZGF0YTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSBsX21jdF9zaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxKMktfTVNfTUNULDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTUNUICovCi0gICAgICAgIGxfY3VycmVudF9kYXRhICs9IDI7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfbWN0X3NpemUtMiwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMbWN0ICovCi0gICAgICAgIGxfY3VycmVudF9kYXRhICs9IDI7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLDAsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFptY3QgKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKLQotICAgICAgICAvKiBvbmx5IG9uZSBtYXJrZXIgYXRtICovCi0gICAgICAgIGxfdG1wID0gKHBfbWN0X3JlY29yZC0+bV9pbmRleCAmIDB4ZmYpIHwgKHBfbWN0X3JlY29yZC0+bV9hcnJheV90eXBlIDw8IDgpIHwgKHBfbWN0X3JlY29yZC0+bV9lbGVtZW50X3R5cGUgPDwgMTApOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX3RtcCwyKTsKLSAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsMCwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWW1jdCAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSs9MjsKLQotICAgICAgICBtZW1jcHkobF9jdXJyZW50X2RhdGEscF9tY3RfcmVjb3JkLT5tX2RhdGEscF9tY3RfcmVjb3JkLT5tX2RhdGFfc2l6ZSk7Ci0KLSAgICAgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLGxfbWN0X3NpemUscF9tYW5hZ2VyKSAhPSBsX21jdF9zaXplKSB7CisgICAgICAgICAgICBpZiAoIShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSAmIGxfbWFya2VyX2hhbmRsZXItPnN0YXRlcykpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hcmtlciBpcyBub3QgY29tcGxpYW50IHdpdGggaXRzIHBvc2l0aW9uXG4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobF9tYXJrZXJfaGFuZGxlci0+aWQgIT0gSjJLX01TX1VOSykgeworICAgICAgICAgICAgICAgICAgICAvKiBBZGQgdGhlIG1hcmtlciB0byB0aGUgY29kZXN0cmVhbSBpbmRleCovCisgICAgICAgICAgICAgICAgICAgIGlmIChsX21hcmtlcl9oYW5kbGVyLT5pZCAhPSBKMktfTVNfU09UKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQk9PTCByZXMgPSBvcGpfajJrX2FkZF9taG1hcmtlcihwX2oyay0+Y3N0cl9pbmRleCwgSjJLX01TX1VOSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfVUlOVDMyKSBvcGpfc3RyZWFtX3RlbGwocF9zdHJlYW0pIC0gbF9zaXplX3VuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2l6ZV91bmspOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBPUEpfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWRkIG1oIG1hcmtlclxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogbmV4dCBtYXJrZXIgaXMga25vd24gYW5kIHdlbGwgbG9jYXRlZCAqLworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxfc2l6ZV91bmsgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICpvdXRwdXRfbWFya2VyID0gbF9tYXJrZXJfaGFuZGxlci0+aWQgOworCisgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9tY3RfcmVjb3JkKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgIG9wal9tY3RfZGF0YV90ICogcF9tY3RfcmVjb3JkLAorICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICpwX3N0cmVhbSwKKyAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIpCit7CisgICAgT1BKX1VJTlQzMiBsX21jdF9zaXplOworICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKKyAgICBPUEpfVUlOVDMyIGxfdG1wOworCisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKworICAgIGxfbWN0X3NpemUgPSAxMCArIHBfbWN0X3JlY29yZC0+bV9kYXRhX3NpemU7CisKKyAgICBpZiAobF9tY3Rfc2l6ZSA+IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSkgeworICAgICAgICBPUEpfQllURSAqbmV3X2hlYWRlcl90aWxlX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCBsX21jdF9zaXplKTsKKyAgICAgICAgaWYgKCEgbmV3X2hlYWRlcl90aWxlX2RhdGEpIHsKKyAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEpOworICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSAwOworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHdyaXRlIE1DVCBtYXJrZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gbmV3X2hlYWRlcl90aWxlX2RhdGE7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IGxfbWN0X3NpemU7CisgICAgfQorCisgICAgbF9jdXJyZW50X2RhdGEgPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhOworCisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLCBKMktfTVNfTUNULAorICAgICAgICAgICAgICAgICAgICAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1DVCAqLworICAgIGxfY3VycmVudF9kYXRhICs9IDI7CisKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIGxfbWN0X3NpemUgLSAyLAorICAgICAgICAgICAgICAgICAgICAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMbWN0ICovCisgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKKworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgMCwKKyAgICAgICAgICAgICAgICAgICAgMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFptY3QgKi8KKyAgICBsX2N1cnJlbnRfZGF0YSArPSAyOworCisgICAgLyogb25seSBvbmUgbWFya2VyIGF0bSAqLworICAgIGxfdG1wID0gKHBfbWN0X3JlY29yZC0+bV9pbmRleCAmIDB4ZmYpIHwgKHBfbWN0X3JlY29yZC0+bV9hcnJheV90eXBlIDw8IDgpIHwKKyAgICAgICAgICAgIChwX21jdF9yZWNvcmQtPm1fZWxlbWVudF90eXBlIDw8IDEwKTsKKworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgbF90bXAsIDIpOworICAgIGxfY3VycmVudF9kYXRhICs9IDI7CisKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgIDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBZbWN0ICovCisgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKKworICAgIG1lbWNweShsX2N1cnJlbnRfZGF0YSwgcF9tY3RfcmVjb3JkLT5tX2RhdGEsIHBfbWN0X3JlY29yZC0+bV9kYXRhX3NpemUpOworCisgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsIGxfbWN0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpICE9IGxfbWN0X3NpemUpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKIC8qKgpAQCAtNTEyNCw0OTQgKzU1NjgsNTUyIEBACiAgKiBAcGFyYW0gICAgICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgTUNUIG1hcmtlci4KICAqIEBwYXJhbSAgICAgICBwX21hbmFnZXIgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfbWN0ICggICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX21jdChvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLSAgICAgICAgT1BKX1VJTlQzMiBpOwotICAgICAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF90bXA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9pbmRpeDsKLSAgICAgICAgb3BqX21jdF9kYXRhX3QgKiBsX21jdF9kYXRhOwotICAgICAgICBPUEpfQk9PTCBuZXdfbWN0ID0gT1BKX0ZBTFNFOworICAgIE9QSl9VSU5UMzIgaTsKKyAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7CisgICAgT1BKX1VJTlQzMiBsX3RtcDsKKyAgICBPUEpfVUlOVDMyIGxfaW5kaXg7CisgICAgb3BqX21jdF9kYXRhX3QgKiBsX21jdF9kYXRhOworICAgIE9QSl9CT09MIG5ld19tY3QgPSBPUEpfRkFMU0U7CiAKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOwogCi0gICAgICAgIGxfdGNwID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX1RQSCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAmcF9qMmstPm1fY3AudGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcDsKKyAgICBsX3RjcCA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9UUEggPworICAgICAgICAgICAgJnBfajJrLT5tX2NwLnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0gOgorICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3A7CiAKLSAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAyKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgTUNUIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIGlmIChwX2hlYWRlcl9zaXplIDwgMikgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBNQ1QgbWFya2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgLyogZmlyc3QgbWFya2VyICovCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdG1wLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBabWN0ICovCi0gICAgICAgIHBfaGVhZGVyX2RhdGEgKz0gMjsKLSAgICAgICAgaWYgKGxfdG1wICE9IDApIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbWN0IGRhdGEgd2l0aGluIG11bHRpcGxlIE1DVCByZWNvcmRzXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihwX2hlYWRlcl9zaXplIDw9IDYpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBNQ1QgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSW1jdCAtPiBubyBuZWVkIGZvciBvdGhlciB2YWx1ZXMsIHRha2UgdGhlIGZpcnN0LCB0eXBlIGlzIGRvdWJsZSB3aXRoIGRlY29ycmVsYXRpb24geDAwMDAgMTEwMSAwMDAwIDAwMDAqLwotICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX3RtcCwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW1jdCAqLwotICAgICAgICBwX2hlYWRlcl9kYXRhICs9IDI7Ci0KLSAgICAgICAgbF9pbmRpeCA9IGxfdG1wICYgMHhmZjsKLSAgICAgICAgbF9tY3RfZGF0YSA9IGxfdGNwLT5tX21jdF9yZWNvcmRzOwotCi0gICAgICAgIGZvciAoaT0wO2k8bF90Y3AtPm1fbmJfbWN0X3JlY29yZHM7KytpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxfbWN0X2RhdGEtPm1faW5kZXggPT0gbF9pbmRpeCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICsrbF9tY3RfZGF0YTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIE5PVCBGT1VORCAqLwotICAgICAgICBpZiAoaSA9PSBsX3RjcC0+bV9uYl9tY3RfcmVjb3JkcykgewotICAgICAgICAgICAgICAgIGlmIChsX3RjcC0+bV9uYl9tY3RfcmVjb3JkcyA9PSBsX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9tY3RfZGF0YV90ICpuZXdfbWN0X3JlY29yZHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgKz0gT1BKX0oyS19NQ1RfREVGQVVMVF9OQl9SRUNPUkRTOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXdfbWN0X3JlY29yZHMgPSAob3BqX21jdF9kYXRhX3QgKikgb3BqX3JlYWxsb2MobF90Y3AtPm1fbWN0X3JlY29yZHMsIGxfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyAqIHNpemVvZihvcGpfbWN0X2RhdGFfdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmV3X21jdF9yZWNvcmRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfdGNwLT5tX21jdF9yZWNvcmRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fbWN0X3JlY29yZHMgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjcC0+bV9uYl9tY3RfcmVjb3JkcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIE1DVCBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fbWN0X3JlY29yZHMgPSBuZXdfbWN0X3JlY29yZHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX21jdF9kYXRhID0gbF90Y3AtPm1fbWN0X3JlY29yZHMgKyBsX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChsX21jdF9kYXRhICwwLChsX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgLSBsX3RjcC0+bV9uYl9tY3RfcmVjb3JkcykgKiBzaXplb2Yob3BqX21jdF9kYXRhX3QpKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsX21jdF9kYXRhID0gbF90Y3AtPm1fbWN0X3JlY29yZHMgKyBsX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsKLSAgICAgICAgICAgICAgICBuZXdfbWN0ID0gT1BKX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobF9tY3RfZGF0YS0+bV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9tY3RfZGF0YS0+bV9kYXRhKTsKLSAgICAgICAgICAgICAgICBsX21jdF9kYXRhLT5tX2RhdGEgPSAwMDsKLSAgICAgICAgfQotCi0gICAgICAgIGxfbWN0X2RhdGEtPm1faW5kZXggPSBsX2luZGl4OwotICAgICAgICBsX21jdF9kYXRhLT5tX2FycmF5X3R5cGUgPSAoSjJLX01DVF9BUlJBWV9UWVBFKSgobF90bXAgID4+IDgpICYgMyk7Ci0gICAgICAgIGxfbWN0X2RhdGEtPm1fZWxlbWVudF90eXBlID0gKEoyS19NQ1RfRUxFTUVOVF9UWVBFKSgobF90bXAgID4+IDEwKSAmIDMpOwotCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdG1wLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBZbWN0ICovCi0gICAgICAgIHBfaGVhZGVyX2RhdGErPTI7Ci0gICAgICAgIGlmIChsX3RtcCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIE1DVCBtYXJrZXJzXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBwX2hlYWRlcl9zaXplIC09IDY7Ci0KLSAgICAgICAgbF9tY3RfZGF0YS0+bV9kYXRhID0gKE9QSl9CWVRFKilvcGpfbWFsbG9jKHBfaGVhZGVyX3NpemUpOwotICAgICAgICBpZiAoISBsX21jdF9kYXRhLT5tX2RhdGEpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBNQ1QgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweShsX21jdF9kYXRhLT5tX2RhdGEscF9oZWFkZXJfZGF0YSxwX2hlYWRlcl9zaXplKTsKLQotICAgICAgICBsX21jdF9kYXRhLT5tX2RhdGFfc2l6ZSA9IHBfaGVhZGVyX3NpemU7Ci0KLSAgICAgICAgaWYgKG5ld19tY3QpIHsKLSAgICAgICAgICAgICAgICArK2xfdGNwLT5tX25iX21jdF9yZWNvcmRzOwotICAgICAgICB9CisgICAgLyogZmlyc3QgbWFya2VyICovCisgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgJmxfdG1wLCAyKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFptY3QgKi8KKyAgICBwX2hlYWRlcl9kYXRhICs9IDI7CisgICAgaWYgKGxfdG1wICE9IDApIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbWN0IGRhdGEgd2l0aGluIG11bHRpcGxlIE1DVCByZWNvcmRzXG4iKTsKICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIH0KKworICAgIGlmIChwX2hlYWRlcl9zaXplIDw9IDYpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgTUNUIG1hcmtlclxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgLyogSW1jdCAtPiBubyBuZWVkIGZvciBvdGhlciB2YWx1ZXMsIHRha2UgdGhlIGZpcnN0LCB0eXBlIGlzIGRvdWJsZSB3aXRoIGRlY29ycmVsYXRpb24geDAwMDAgMTEwMSAwMDAwIDAwMDAqLworICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsICZsX3RtcCwgMik7ICAgICAgICAgICAgICAgICAgICAgICAvKiBJbWN0ICovCisgICAgcF9oZWFkZXJfZGF0YSArPSAyOworCisgICAgbF9pbmRpeCA9IGxfdG1wICYgMHhmZjsKKyAgICBsX21jdF9kYXRhID0gbF90Y3AtPm1fbWN0X3JlY29yZHM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbF90Y3AtPm1fbmJfbWN0X3JlY29yZHM7ICsraSkgeworICAgICAgICBpZiAobF9tY3RfZGF0YS0+bV9pbmRleCA9PSBsX2luZGl4KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICArK2xfbWN0X2RhdGE7CisgICAgfQorCisgICAgLyogTk9UIEZPVU5EICovCisgICAgaWYgKGkgPT0gbF90Y3AtPm1fbmJfbWN0X3JlY29yZHMpIHsKKyAgICAgICAgaWYgKGxfdGNwLT5tX25iX21jdF9yZWNvcmRzID09IGxfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcykgeworICAgICAgICAgICAgb3BqX21jdF9kYXRhX3QgKm5ld19tY3RfcmVjb3JkczsKKyAgICAgICAgICAgIGxfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyArPSBPUEpfSjJLX01DVF9ERUZBVUxUX05CX1JFQ09SRFM7CisKKyAgICAgICAgICAgIG5ld19tY3RfcmVjb3JkcyA9IChvcGpfbWN0X2RhdGFfdCAqKSBvcGpfcmVhbGxvYyhsX3RjcC0+bV9tY3RfcmVjb3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyAqIHNpemVvZihvcGpfbWN0X2RhdGFfdCkpOworICAgICAgICAgICAgaWYgKCEgbmV3X21jdF9yZWNvcmRzKSB7CisgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF90Y3AtPm1fbWN0X3JlY29yZHMpOworICAgICAgICAgICAgICAgIGxfdGNwLT5tX21jdF9yZWNvcmRzID0gTlVMTDsKKyAgICAgICAgICAgICAgICBsX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgPSAwOworICAgICAgICAgICAgICAgIGxfdGNwLT5tX25iX21jdF9yZWNvcmRzID0gMDsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBNQ1QgbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBVcGRhdGUgbV9tY2NfcmVjb3Jkc1tdLm1fb2Zmc2V0X2FycmF5IGFuZCBtX2RlY29ycmVsYXRpb25fYXJyYXkKKyAgICAgICAgICAgICAqIHRvIHBvaW50IHRvIHRoZSBuZXcgYWRkcmVzc2VzICovCisgICAgICAgICAgICBpZiAobmV3X21jdF9yZWNvcmRzICE9IGxfdGNwLT5tX21jdF9yZWNvcmRzKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxfdGNwLT5tX25iX21jY19yZWNvcmRzOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QqIGxfbWNjX3JlY29yZCA9CisgICAgICAgICAgICAgICAgICAgICAgICAmKGxfdGNwLT5tX21jY19yZWNvcmRzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxfbWNjX3JlY29yZC0+bV9kZWNvcnJlbGF0aW9uX2FycmF5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsX21jY19yZWNvcmQtPm1fZGVjb3JyZWxhdGlvbl9hcnJheSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X21jdF9yZWNvcmRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobF9tY2NfcmVjb3JkLT5tX2RlY29ycmVsYXRpb25fYXJyYXkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjcC0+bV9tY3RfcmVjb3Jkcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxfbWNjX3JlY29yZC0+bV9vZmZzZXRfYXJyYXkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfbWNjX3JlY29yZC0+bV9vZmZzZXRfYXJyYXkgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19tY3RfcmVjb3JkcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxfbWNjX3JlY29yZC0+bV9vZmZzZXRfYXJyYXkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjcC0+bV9tY3RfcmVjb3Jkcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxfdGNwLT5tX21jdF9yZWNvcmRzID0gbmV3X21jdF9yZWNvcmRzOworICAgICAgICAgICAgbF9tY3RfZGF0YSA9IGxfdGNwLT5tX21jdF9yZWNvcmRzICsgbF90Y3AtPm1fbmJfbWN0X3JlY29yZHM7CisgICAgICAgICAgICBtZW1zZXQobF9tY3RfZGF0YSwgMCwgKGxfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyAtIGxfdGNwLT5tX25iX21jdF9yZWNvcmRzKSAqCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9wal9tY3RfZGF0YV90KSk7CisgICAgICAgIH0KKworICAgICAgICBsX21jdF9kYXRhID0gbF90Y3AtPm1fbWN0X3JlY29yZHMgKyBsX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsKKyAgICAgICAgbmV3X21jdCA9IE9QSl9UUlVFOworICAgIH0KKworICAgIGlmIChsX21jdF9kYXRhLT5tX2RhdGEpIHsKKyAgICAgICAgb3BqX2ZyZWUobF9tY3RfZGF0YS0+bV9kYXRhKTsKKyAgICAgICAgbF9tY3RfZGF0YS0+bV9kYXRhID0gMDA7CisgICAgICAgIGxfbWN0X2RhdGEtPm1fZGF0YV9zaXplID0gMDsKKyAgICB9CisKKyAgICBsX21jdF9kYXRhLT5tX2luZGV4ID0gbF9pbmRpeDsKKyAgICBsX21jdF9kYXRhLT5tX2FycmF5X3R5cGUgPSAoSjJLX01DVF9BUlJBWV9UWVBFKSgobF90bXAgID4+IDgpICYgMyk7CisgICAgbF9tY3RfZGF0YS0+bV9lbGVtZW50X3R5cGUgPSAoSjJLX01DVF9FTEVNRU5UX1RZUEUpKChsX3RtcCAgPj4gMTApICYgMyk7CisKKyAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAmbF90bXAsIDIpOyAgICAgICAgICAgICAgICAgICAgICAgLyogWW1jdCAqLworICAgIHBfaGVhZGVyX2RhdGEgKz0gMjsKKyAgICBpZiAobF90bXAgIT0gMCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCB0YWtlIGluIGNoYXJnZSBtdWx0aXBsZSBNQ1QgbWFya2Vyc1xuIik7CisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICB9CisKKyAgICBwX2hlYWRlcl9zaXplIC09IDY7CisKKyAgICBsX21jdF9kYXRhLT5tX2RhdGEgPSAoT1BKX0JZVEUqKW9wal9tYWxsb2MocF9oZWFkZXJfc2l6ZSk7CisgICAgaWYgKCEgbF9tY3RfZGF0YS0+bV9kYXRhKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIE1DVCBtYXJrZXJcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICBtZW1jcHkobF9tY3RfZGF0YS0+bV9kYXRhLCBwX2hlYWRlcl9kYXRhLCBwX2hlYWRlcl9zaXplKTsKKworICAgIGxfbWN0X2RhdGEtPm1fZGF0YV9zaXplID0gcF9oZWFkZXJfc2l6ZTsKKworICAgIGlmIChuZXdfbWN0KSB7CisgICAgICAgICAgICArK2xfdGNwLT5tX25iX21jdF9yZWNvcmRzOworICAgIH0KKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX21jY19yZWNvcmQoICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhICogcF9tY2NfcmVjb3JkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX21jY19yZWNvcmQob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgc3RydWN0IG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YSAqIHBfbWNjX3JlY29yZCwKKyAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqcF9zdHJlYW0sCisgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyKQogewotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9tY2Nfc2l6ZTsKLSAgICAgICAgT1BKX0JZVEUgKiBsX2N1cnJlbnRfZGF0YSA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfYnl0ZXNfZm9yX2NvbXA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9tYXNrOwotICAgICAgICBPUEpfVUlOVDMyIGxfdG1jYzsKKyAgICBPUEpfVUlOVDMyIGk7CisgICAgT1BKX1VJTlQzMiBsX21jY19zaXplOworICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKKyAgICBPUEpfVUlOVDMyIGxfbmJfYnl0ZXNfZm9yX2NvbXA7CisgICAgT1BKX1VJTlQzMiBsX21hc2s7CisgICAgT1BKX1VJTlQzMiBsX3RtY2M7CiAKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwogCi0gICAgICAgIGlmIChwX21jY19yZWNvcmQtPm1fbmJfY29tcHMgPiAyNTUgKSB7CisgICAgaWYgKHBfbWNjX3JlY29yZC0+bV9uYl9jb21wcyA+IDI1NSkgewogICAgICAgICBsX25iX2J5dGVzX2Zvcl9jb21wID0gMjsKLSAgICAgICAgICAgICAgICBsX21hc2sgPSAweDgwMDA7CisgICAgICAgIGxfbWFzayA9IDB4ODAwMDsKKyAgICB9IGVsc2UgeworICAgICAgICBsX25iX2J5dGVzX2Zvcl9jb21wID0gMTsKKyAgICAgICAgbF9tYXNrID0gMDsKKyAgICB9CisKKyAgICBsX21jY19zaXplID0gcF9tY2NfcmVjb3JkLT5tX25iX2NvbXBzICogMiAqIGxfbmJfYnl0ZXNfZm9yX2NvbXAgKyAxOTsKKyAgICBpZiAobF9tY2Nfc2l6ZSA+IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSkgeworICAgICAgICBPUEpfQllURSAqbmV3X2hlYWRlcl90aWxlX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCBsX21jY19zaXplKTsKKyAgICAgICAgaWYgKCEgbmV3X2hlYWRlcl90aWxlX2RhdGEpIHsKKyAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEpOworICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSAwOworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHdyaXRlIE1DQyBtYXJrZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBsX25iX2J5dGVzX2Zvcl9jb21wID0gMTsKLSAgICAgICAgICAgICAgICBsX21hc2sgPSAwOwotICAgICAgICB9CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBuZXdfaGVhZGVyX3RpbGVfZGF0YTsKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gbF9tY2Nfc2l6ZTsKKyAgICB9CiAKLSAgICAgICAgbF9tY2Nfc2l6ZSA9IHBfbWNjX3JlY29yZC0+bV9uYl9jb21wcyAqIDIgKiBsX25iX2J5dGVzX2Zvcl9jb21wICsgMTk7Ci0gICAgICAgIGlmIChsX21jY19zaXplID4gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfdGlsZV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEsIGxfbWNjX3NpemUpOwotICAgICAgICAgICAgICAgIGlmICghIG5ld19oZWFkZXJfdGlsZV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB3cml0ZSBNQ0MgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBuZXdfaGVhZGVyX3RpbGVfZGF0YTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSBsX21jY19zaXplOwotICAgICAgICB9CisgICAgbF9jdXJyZW50X2RhdGEgPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhOwogCi0gICAgICAgIGxfY3VycmVudF9kYXRhID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YTsKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIEoyS19NU19NQ0MsCisgICAgICAgICAgICAgICAgICAgIDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTUNDICovCisgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKIAotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsSjJLX01TX01DQywyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1DQyAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgbF9tY2Nfc2l6ZSAtIDIsCisgICAgICAgICAgICAgICAgICAgIDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExtY2MgKi8KKyAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwogCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX21jY19zaXplLTIsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG1jYyAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOworICAgIC8qIGZpcnN0IG1hcmtlciAqLworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgMCwKKyAgICAgICAgICAgICAgICAgICAgMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFptY2MgKi8KKyAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwogCi0gICAgICAgIC8qIGZpcnN0IG1hcmtlciAqLwotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsMCwyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBabWNjICovCi0gICAgICAgIGxfY3VycmVudF9kYXRhICs9IDI7CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLCBwX21jY19yZWNvcmQtPm1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbWNjIC0+IG5vIG5lZWQgZm9yIG90aGVyIHZhbHVlcywgdGFrZSB0aGUgZmlyc3QgKi8KKyAgICArK2xfY3VycmVudF9kYXRhOwogCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxwX21jY19yZWNvcmQtPm1faW5kZXgsMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEltY2MgLT4gbm8gbmVlZCBmb3Igb3RoZXIgdmFsdWVzLCB0YWtlIHRoZSBmaXJzdCAqLwotICAgICAgICArK2xfY3VycmVudF9kYXRhOworICAgIC8qIG9ubHkgb25lIG1hcmtlciBhdG0gKi8KKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgIDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBZbWNjICovCisgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKIAotICAgICAgICAvKiBvbmx5IG9uZSBtYXJrZXIgYXRtICovCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwwLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFltY2MgKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGErPTI7CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLCAxLAorICAgICAgICAgICAgICAgICAgICAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUW1jYyAtPiBudW1iZXIgb2YgY29sbGVjdGlvbnMgLT4gMSAqLworICAgIGxfY3VycmVudF9kYXRhICs9IDI7CiAKLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLDEsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUW1jYyAtPiBudW1iZXIgb2YgY29sbGVjdGlvbnMgLT4gMSAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSs9MjsKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIDB4MSwKKyAgICAgICAgICAgICAgICAgICAgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBYbWNjaSB0eXBlIG9mIGNvbXBvbmVudCB0cmFuc2Zvcm1hdGlvbiAtPiBhcnJheSBiYXNlZCBkZWNvcnJlbGF0aW9uICovCisgICAgKytsX2N1cnJlbnRfZGF0YTsKIAotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsMHgxLDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBYbWNjaSB0eXBlIG9mIGNvbXBvbmVudCB0cmFuc2Zvcm1hdGlvbiAtPiBhcnJheSBiYXNlZCBkZWNvcnJlbGF0aW9uICovCi0gICAgICAgICsrbF9jdXJyZW50X2RhdGE7CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLCBwX21jY19yZWNvcmQtPm1fbmJfY29tcHMgfCBsX21hc2ssCisgICAgICAgICAgICAgICAgICAgIDIpOyAgLyogTm1jY2kgbnVtYmVyIG9mIGlucHV0IGNvbXBvbmVudHMgaW52b2x2ZWQgYW5kIHNpemUgZm9yIGVhY2ggY29tcG9uZW50IG9mZnNldCA9IDggYml0cyAqLworICAgIGxfY3VycmVudF9kYXRhICs9IDI7CiAKLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLHBfbWNjX3JlY29yZC0+bV9uYl9jb21wcyB8IGxfbWFzaywyKTsgICAgLyogTm1jY2kgbnVtYmVyIG9mIGlucHV0IGNvbXBvbmVudHMgaW52b2x2ZWQgYW5kIHNpemUgZm9yIGVhY2ggY29tcG9uZW50IG9mZnNldCA9IDggYml0cyAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSs9MjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcF9tY2NfcmVjb3JkLT5tX25iX2NvbXBzOyArK2kpIHsKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgbF9uYl9ieXRlc19mb3JfY29tcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbWNjaWogQ29tcG9uZW50IG9mZnNldCovCisgICAgICAgIGxfY3VycmVudF9kYXRhICs9IGxfbmJfYnl0ZXNfZm9yX2NvbXA7CisgICAgfQogCi0gICAgICAgIGZvciAoaT0wO2k8cF9tY2NfcmVjb3JkLT5tX25iX2NvbXBzOysraSkgewotICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxpLGxfbmJfYnl0ZXNfZm9yX2NvbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ21jY2lqIENvbXBvbmVudCBvZmZzZXQqLwotICAgICAgICAgICAgICAgIGxfY3VycmVudF9kYXRhKz1sX25iX2J5dGVzX2Zvcl9jb21wOwotICAgICAgICB9CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLCBwX21jY19yZWNvcmQtPm1fbmJfY29tcHMgfCBsX21hc2ssCisgICAgICAgICAgICAgICAgICAgIDIpOyAgLyogTW1jY2kgbnVtYmVyIG9mIG91dHB1dCBjb21wb25lbnRzIGludm9sdmVkIGFuZCBzaXplIGZvciBlYWNoIGNvbXBvbmVudCBvZmZzZXQgPSA4IGJpdHMgKi8KKyAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwogCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxwX21jY19yZWNvcmQtPm1fbmJfY29tcHN8bF9tYXNrLDIpOyAgICAgIC8qIE1tY2NpIG51bWJlciBvZiBvdXRwdXQgY29tcG9uZW50cyBpbnZvbHZlZCBhbmQgc2l6ZSBmb3IgZWFjaCBjb21wb25lbnQgb2Zmc2V0ID0gOCBiaXRzICovCi0gICAgICAgIGxfY3VycmVudF9kYXRhKz0yOworICAgIGZvciAoaSA9IDA7IGkgPCBwX21jY19yZWNvcmQtPm1fbmJfY29tcHM7ICsraSkgeworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIGksCisgICAgICAgICAgICAgICAgICAgICAgICBsX25iX2J5dGVzX2Zvcl9jb21wKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdtY2NpaiBDb21wb25lbnQgb2Zmc2V0Ki8KKyAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gbF9uYl9ieXRlc19mb3JfY29tcDsKKyAgICB9CiAKLSAgICAgICAgZm9yIChpPTA7aTxwX21jY19yZWNvcmQtPm1fbmJfY29tcHM7KytpKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGksbF9uYl9ieXRlc19mb3JfY29tcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBXbWNjaWogQ29tcG9uZW50IG9mZnNldCovCi0gICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGErPWxfbmJfYnl0ZXNfZm9yX2NvbXA7Ci0gICAgICAgIH0KKyAgICBsX3RtY2MgPSAoKCFwX21jY19yZWNvcmQtPm1faXNfaXJyZXZlcnNpYmxlKSAmIDFVKSA8PCAxNjsKIAotICAgICAgICBsX3RtY2MgPSAoKCFwX21jY19yZWNvcmQtPm1faXNfaXJyZXZlcnNpYmxlKSYxKTw8MTY7CisgICAgaWYgKHBfbWNjX3JlY29yZC0+bV9kZWNvcnJlbGF0aW9uX2FycmF5KSB7CisgICAgICAgIGxfdG1jYyB8PSBwX21jY19yZWNvcmQtPm1fZGVjb3JyZWxhdGlvbl9hcnJheS0+bV9pbmRleDsKKyAgICB9CiAKLSAgICAgICAgaWYgKHBfbWNjX3JlY29yZC0+bV9kZWNvcnJlbGF0aW9uX2FycmF5KSB7Ci0gICAgICAgICAgICAgICAgbF90bWNjIHw9IHBfbWNjX3JlY29yZC0+bV9kZWNvcnJlbGF0aW9uX2FycmF5LT5tX2luZGV4OwotICAgICAgICB9CisgICAgaWYgKHBfbWNjX3JlY29yZC0+bV9vZmZzZXRfYXJyYXkpIHsKKyAgICAgICAgbF90bWNjIHw9ICgocF9tY2NfcmVjb3JkLT5tX29mZnNldF9hcnJheS0+bV9pbmRleCkgPDwgOCk7CisgICAgfQogCi0gICAgICAgIGlmIChwX21jY19yZWNvcmQtPm1fb2Zmc2V0X2FycmF5KSB7Ci0gICAgICAgICAgICAgICAgbF90bWNjIHw9ICgocF9tY2NfcmVjb3JkLT5tX29mZnNldF9hcnJheS0+bV9pbmRleCk8PDgpOwotICAgICAgICB9CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLCBsX3RtY2MsCisgICAgICAgICAgICAgICAgICAgIDMpOyAgICAgLyogVG1jY2kgOiB1c2UgTUNUIGRlZmluZWQgYXMgbnVtYmVyIDEgYW5kIGlycmV2ZXJzaWJsZSBhcnJheSBiYXNlZC4gKi8KKyAgICBsX2N1cnJlbnRfZGF0YSArPSAzOwogCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX3RtY2MsMyk7ICAgICAgIC8qIFRtY2NpIDogdXNlIE1DVCBkZWZpbmVkIGFzIG51bWJlciAxIGFuZCBpcnJldmVyc2libGUgYXJyYXkgYmFzZWQuICovCi0gICAgICAgIGxfY3VycmVudF9kYXRhKz0zOworICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCBsX21jY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSAhPSBsX21jY19zaXplKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSxsX21jY19zaXplLHBfbWFuYWdlcikgIT0gbF9tY2Nfc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX21jYyAoICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfbWNjKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCiB7Ci0gICAgICAgIE9QSl9VSU5UMzIgaSxqOwotICAgICAgICBPUEpfVUlOVDMyIGxfdG1wOwotICAgICAgICBPUEpfVUlOVDMyIGxfaW5kaXg7Ci0gICAgICAgIG9wal90Y3BfdCAqIGxfdGNwOwotICAgICAgICBvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCAqIGxfbWNjX3JlY29yZDsKLSAgICAgICAgb3BqX21jdF9kYXRhX3QgKiBsX21jdF9kYXRhOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfY29sbGVjdGlvbnM7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9jb21wczsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX2J5dGVzX2J5X2NvbXA7Ci0gICAgICAgIE9QSl9CT09MIG5ld19tY2MgPSBPUEpfRkFMU0U7CisgICAgT1BKX1VJTlQzMiBpLCBqOworICAgIE9QSl9VSU5UMzIgbF90bXA7CisgICAgT1BKX1VJTlQzMiBsX2luZGl4OworICAgIG9wal90Y3BfdCAqIGxfdGNwOworICAgIG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90ICogbF9tY2NfcmVjb3JkOworICAgIG9wal9tY3RfZGF0YV90ICogbF9tY3RfZGF0YTsKKyAgICBPUEpfVUlOVDMyIGxfbmJfY29sbGVjdGlvbnM7CisgICAgT1BKX1VJTlQzMiBsX25iX2NvbXBzOworICAgIE9QSl9VSU5UMzIgbF9uYl9ieXRlc19ieV9jb21wOworICAgIE9QSl9CT09MIGxfbmV3X21jYyA9IE9QSl9GQUxTRTsKIAotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0gICAgICAgIGxfdGNwID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX1RQSCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAmcF9qMmstPm1fY3AudGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcDsKKyAgICBsX3RjcCA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9UUEggPworICAgICAgICAgICAgJnBfajJrLT5tX2NwLnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0gOgorICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3A7CiAKLSAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAyKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgTUNDIG1hcmtlclxuIik7CisgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAyKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIE1DQyBtYXJrZXJcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIC8qIGZpcnN0IG1hcmtlciAqLworICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsICZsX3RtcCwgMik7ICAgICAgICAgICAgICAgICAgICAgICAvKiBabWNjICovCisgICAgcF9oZWFkZXJfZGF0YSArPSAyOworICAgIGlmIChsX3RtcCAhPSAwKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIGRhdGEgc3Bhbm5pbmdcbiIpOworICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgfQorCisgICAgaWYgKHBfaGVhZGVyX3NpemUgPCA3KSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIE1DQyBtYXJrZXJcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsICZsX2luZGl4LAorICAgICAgICAgICAgICAgICAgIDEpOyAvKiBJbWNjIC0+IG5vIG5lZWQgZm9yIG90aGVyIHZhbHVlcywgdGFrZSB0aGUgZmlyc3QgKi8KKyAgICArK3BfaGVhZGVyX2RhdGE7CisKKyAgICBsX21jY19yZWNvcmQgPSBsX3RjcC0+bV9tY2NfcmVjb3JkczsKKworICAgIGZvciAoaSA9IDA7IGkgPCBsX3RjcC0+bV9uYl9tY2NfcmVjb3JkczsgKytpKSB7CisgICAgICAgIGlmIChsX21jY19yZWNvcmQtPm1faW5kZXggPT0gbF9pbmRpeCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKytsX21jY19yZWNvcmQ7CisgICAgfQorCisgICAgLyoqIE5PVCBGT1VORCAqLworICAgIGlmIChpID09IGxfdGNwLT5tX25iX21jY19yZWNvcmRzKSB7CisgICAgICAgIGlmIChsX3RjcC0+bV9uYl9tY2NfcmVjb3JkcyA9PSBsX3RjcC0+bV9uYl9tYXhfbWNjX3JlY29yZHMpIHsKKyAgICAgICAgICAgIG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90ICpuZXdfbWNjX3JlY29yZHM7CisgICAgICAgICAgICBsX3RjcC0+bV9uYl9tYXhfbWNjX3JlY29yZHMgKz0gT1BKX0oyS19NQ0NfREVGQVVMVF9OQl9SRUNPUkRTOworCisgICAgICAgICAgICBuZXdfbWNjX3JlY29yZHMgPSAob3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QgKikgb3BqX3JlYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fbWNjX3JlY29yZHMsIGxfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkcyAqIHNpemVvZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QpKTsKKyAgICAgICAgICAgIGlmICghIG5ld19tY2NfcmVjb3JkcykgeworICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfdGNwLT5tX21jY19yZWNvcmRzKTsKKyAgICAgICAgICAgICAgICBsX3RjcC0+bV9tY2NfcmVjb3JkcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgbF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzID0gMDsKKyAgICAgICAgICAgICAgICBsX3RjcC0+bV9uYl9tY2NfcmVjb3JkcyA9IDA7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlYWQgTUNDIG1hcmtlclxuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxfdGNwLT5tX21jY19yZWNvcmRzID0gbmV3X21jY19yZWNvcmRzOworICAgICAgICAgICAgbF9tY2NfcmVjb3JkID0gbF90Y3AtPm1fbWNjX3JlY29yZHMgKyBsX3RjcC0+bV9uYl9tY2NfcmVjb3JkczsKKyAgICAgICAgICAgIG1lbXNldChsX21jY19yZWNvcmQsIDAsIChsX3RjcC0+bV9uYl9tYXhfbWNjX3JlY29yZHMgLSBsX3RjcC0+bV9uYl9tY2NfcmVjb3JkcykKKyAgICAgICAgICAgICAgICAgICAqIHNpemVvZihvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCkpOworICAgICAgICB9CisgICAgICAgIGxfbWNjX3JlY29yZCA9IGxfdGNwLT5tX21jY19yZWNvcmRzICsgbF90Y3AtPm1fbmJfbWNjX3JlY29yZHM7CisgICAgICAgIGxfbmV3X21jYyA9IE9QSl9UUlVFOworICAgIH0KKyAgICBsX21jY19yZWNvcmQtPm1faW5kZXggPSBsX2luZGl4OworCisgICAgLyogb25seSBvbmUgbWFya2VyIGF0bSAqLworICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsICZsX3RtcCwgMik7ICAgICAgICAgICAgICAgICAgICAgICAvKiBZbWNjICovCisgICAgcF9oZWFkZXJfZGF0YSArPSAyOworICAgIGlmIChsX3RtcCAhPSAwKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIGRhdGEgc3Bhbm5pbmdcbiIpOworICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgfQorCisgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgJmxfbmJfY29sbGVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUW1jYyAtPiBudW1iZXIgb2YgY29sbGVjdGlvbnMgLT4gMSAqLworICAgIHBfaGVhZGVyX2RhdGEgKz0gMjsKKworICAgIGlmIChsX25iX2NvbGxlY3Rpb25zID4gMSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCB0YWtlIGluIGNoYXJnZSBtdWx0aXBsZSBjb2xsZWN0aW9uc1xuIik7CisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICB9CisKKyAgICBwX2hlYWRlcl9zaXplIC09IDc7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbF9uYl9jb2xsZWN0aW9uczsgKytpKSB7CisgICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgMykgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgTUNDIG1hcmtlclxuIik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICB9CiAKLSAgICAgICAgLyogZmlyc3QgbWFya2VyICovCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdG1wLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBabWNjICovCi0gICAgICAgIHBfaGVhZGVyX2RhdGEgKz0gMjsKLSAgICAgICAgaWYgKGxfdG1wICE9IDApIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbXVsdGlwbGUgZGF0YSBzcGFubmluZ1xuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCA3KSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgTUNDIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfaW5kaXgsMSk7IC8qIEltY2MgLT4gbm8gbmVlZCBmb3Igb3RoZXIgdmFsdWVzLCB0YWtlIHRoZSBmaXJzdCAqLworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAmbF90bXAsCisgICAgICAgICAgICAgICAgICAgICAgIDEpOyAvKiBYbWNjaSB0eXBlIG9mIGNvbXBvbmVudCB0cmFuc2Zvcm1hdGlvbiAtPiBhcnJheSBiYXNlZCBkZWNvcnJlbGF0aW9uICovCiAgICAgICAgICsrcF9oZWFkZXJfZGF0YTsKIAotICAgICAgICBsX21jY19yZWNvcmQgPSBsX3RjcC0+bV9tY2NfcmVjb3JkczsKLQotICAgICAgICBmb3IoaT0wO2k8bF90Y3AtPm1fbmJfbWNjX3JlY29yZHM7KytpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxfbWNjX3JlY29yZC0+bV9pbmRleCA9PSBsX2luZGl4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKytsX21jY19yZWNvcmQ7CisgICAgICAgIGlmIChsX3RtcCAhPSAxKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgY29sbGVjdGlvbnMgb3RoZXIgdGhhbiBhcnJheSBkZWNvcnJlbGF0aW9uXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKICAgICAgICAgfQogCi0gICAgICAgIC8qKiBOT1QgRk9VTkQgKi8KLSAgICAgICAgaWYgKGkgPT0gbF90Y3AtPm1fbmJfbWNjX3JlY29yZHMpIHsKLSAgICAgICAgICAgICAgICBpZiAobF90Y3AtPm1fbmJfbWNjX3JlY29yZHMgPT0gbF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCAqbmV3X21jY19yZWNvcmRzOwotICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzICs9IE9QSl9KMktfTUNDX0RFRkFVTFRfTkJfUkVDT1JEUzsKKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgJmxfbmJfY29tcHMsIDIpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXdfbWNjX3JlY29yZHMgPSAob3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QgKikgb3BqX3JlYWxsb2MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fbWNjX3JlY29yZHMsIGxfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkcyAqIHNpemVvZihvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmV3X21jY19yZWNvcmRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfdGNwLT5tX21jY19yZWNvcmRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fbWNjX3JlY29yZHMgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjcC0+bV9uYl9tYXhfbWNjX3JlY29yZHMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjcC0+bV9uYl9tY2NfcmVjb3JkcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIE1DQyBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fbWNjX3JlY29yZHMgPSBuZXdfbWNjX3JlY29yZHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX21jY19yZWNvcmQgPSBsX3RjcC0+bV9tY2NfcmVjb3JkcyArIGxfdGNwLT5tX25iX21jY19yZWNvcmRzOwotICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGxfbWNjX3JlY29yZCwwLChsX3RjcC0+bV9uYl9tYXhfbWNjX3JlY29yZHMtbF90Y3AtPm1fbmJfbWNjX3JlY29yZHMpICogc2l6ZW9mKG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxfbWNjX3JlY29yZCA9IGxfdGNwLT5tX21jY19yZWNvcmRzICsgbF90Y3AtPm1fbmJfbWNjX3JlY29yZHM7Ci0gICAgICAgICAgICAgICAgbmV3X21jYyA9IE9QSl9UUlVFOworICAgICAgICBwX2hlYWRlcl9kYXRhICs9IDI7CisgICAgICAgIHBfaGVhZGVyX3NpemUgLT0gMzsKKworICAgICAgICBsX25iX2J5dGVzX2J5X2NvbXAgPSAxICsgKGxfbmJfY29tcHMgPj4gMTUpOworICAgICAgICBsX21jY19yZWNvcmQtPm1fbmJfY29tcHMgPSBsX25iX2NvbXBzICYgMHg3ZmZmOworCisgICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgKGxfbmJfYnl0ZXNfYnlfY29tcCAqIGxfbWNjX3JlY29yZC0+bV9uYl9jb21wcyArIDIpKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBNQ0MgbWFya2VyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgICAgIH0KLSAgICAgICAgbF9tY2NfcmVjb3JkLT5tX2luZGV4ID0gbF9pbmRpeDsKIAotICAgICAgICAvKiBvbmx5IG9uZSBtYXJrZXIgYXRtICovCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdG1wLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBZbWNjICovCi0gICAgICAgIHBfaGVhZGVyX2RhdGErPTI7Ci0gICAgICAgIGlmIChsX3RtcCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIGRhdGEgc3Bhbm5pbmdcbiIpOworICAgICAgICBwX2hlYWRlcl9zaXplIC09IChsX25iX2J5dGVzX2J5X2NvbXAgKiBsX21jY19yZWNvcmQtPm1fbmJfY29tcHMgKyAyKTsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbF9tY2NfcmVjb3JkLT5tX25iX2NvbXBzOyArK2opIHsKKyAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsICZsX3RtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbmJfYnl0ZXNfYnlfY29tcCk7ICAgICAgLyogQ21jY2lqIENvbXBvbmVudCBvZmZzZXQqLworICAgICAgICAgICAgcF9oZWFkZXJfZGF0YSArPSBsX25iX2J5dGVzX2J5X2NvbXA7CisKKyAgICAgICAgICAgIGlmIChsX3RtcCAhPSBqKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCB0YWtlIGluIGNoYXJnZSBjb2xsZWN0aW9ucyB3aXRoIGluZGl4IHNodWZmbGVcbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfbmJfY29sbGVjdGlvbnMsMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUW1jYyAtPiBudW1iZXIgb2YgY29sbGVjdGlvbnMgLT4gMSAqLwotICAgICAgICBwX2hlYWRlcl9kYXRhKz0yOworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAmbF9uYl9jb21wcywgMik7CisgICAgICAgIHBfaGVhZGVyX2RhdGEgKz0gMjsKIAotICAgICAgICBpZiAobF9uYl9jb2xsZWN0aW9ucyA+IDEpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgbXVsdGlwbGUgY29sbGVjdGlvbnNcbiIpOworICAgICAgICBsX25iX2J5dGVzX2J5X2NvbXAgPSAxICsgKGxfbmJfY29tcHMgPj4gMTUpOworICAgICAgICBsX25iX2NvbXBzICY9IDB4N2ZmZjsKKworICAgICAgICBpZiAobF9uYl9jb21wcyAhPSBsX21jY19yZWNvcmQtPm1fbmJfY29tcHMpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCB0YWtlIGluIGNoYXJnZSBjb2xsZWN0aW9ucyB3aXRob3V0IHNhbWUgbnVtYmVyIG9mIGluZGl4ZXNcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAobF9uYl9ieXRlc19ieV9jb21wICogbF9tY2NfcmVjb3JkLT5tX25iX2NvbXBzICsgMykpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIE1DQyBtYXJrZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHBfaGVhZGVyX3NpemUgLT0gKGxfbmJfYnl0ZXNfYnlfY29tcCAqIGxfbWNjX3JlY29yZC0+bV9uYl9jb21wcyArIDMpOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBsX21jY19yZWNvcmQtPm1fbmJfY29tcHM7ICsraikgeworICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgJmxfdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9uYl9ieXRlc19ieV9jb21wKTsgICAgICAvKiBXbWNjaWogQ29tcG9uZW50IG9mZnNldCovCisgICAgICAgICAgICBwX2hlYWRlcl9kYXRhICs9IGxfbmJfYnl0ZXNfYnlfY29tcDsKKworICAgICAgICAgICAgaWYgKGxfdG1wICE9IGopIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHRha2UgaW4gY2hhcmdlIGNvbGxlY3Rpb25zIHdpdGggaW5kaXggc2h1ZmZsZVxuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgcF9oZWFkZXJfc2l6ZSAtPSA3OworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAmbF90bXAsIDMpOyAvKiBXbWNjaWogQ29tcG9uZW50IG9mZnNldCovCisgICAgICAgIHBfaGVhZGVyX2RhdGEgKz0gMzsKIAotICAgICAgICBmb3IgKGk9MDtpPGxfbmJfY29sbGVjdGlvbnM7KytpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBNQ0MgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIGxfbWNjX3JlY29yZC0+bV9pc19pcnJldmVyc2libGUgPSAhKChsX3RtcCA+PiAxNikgJiAxKTsKKyAgICAgICAgbF9tY2NfcmVjb3JkLT5tX2RlY29ycmVsYXRpb25fYXJyYXkgPSAwMDsKKyAgICAgICAgbF9tY2NfcmVjb3JkLT5tX29mZnNldF9hcnJheSA9IDAwOworCisgICAgICAgIGxfaW5kaXggPSBsX3RtcCAmIDB4ZmY7CisgICAgICAgIGlmIChsX2luZGl4ICE9IDApIHsKKyAgICAgICAgICAgIGxfbWN0X2RhdGEgPSBsX3RjcC0+bV9tY3RfcmVjb3JkczsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsgKytqKSB7CisgICAgICAgICAgICAgICAgaWYgKGxfbWN0X2RhdGEtPm1faW5kZXggPT0gbF9pbmRpeCkgeworICAgICAgICAgICAgICAgICAgICBsX21jY19yZWNvcmQtPm1fZGVjb3JyZWxhdGlvbl9hcnJheSA9IGxfbWN0X2RhdGE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK2xfbWN0X2RhdGE7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX3RtcCwxKTsgLyogWG1jY2kgdHlwZSBvZiBjb21wb25lbnQgdHJhbnNmb3JtYXRpb24gLT4gYXJyYXkgYmFzZWQgZGVjb3JyZWxhdGlvbiAqLwotICAgICAgICAgICAgICAgICsrcF9oZWFkZXJfZGF0YTsKLQotICAgICAgICAgICAgICAgIGlmIChsX3RtcCAhPSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJDYW5ub3QgdGFrZSBpbiBjaGFyZ2UgY29sbGVjdGlvbnMgb3RoZXIgdGhhbiBhcnJheSBkZWNvcnJlbGF0aW9uXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZsX25iX2NvbXBzLDIpOwotCi0gICAgICAgICAgICAgICAgcF9oZWFkZXJfZGF0YSs9MjsKLSAgICAgICAgICAgICAgICBwX2hlYWRlcl9zaXplLT0zOwotCi0gICAgICAgICAgICAgICAgbF9uYl9ieXRlc19ieV9jb21wID0gMSArIChsX25iX2NvbXBzPj4xNSk7Ci0gICAgICAgICAgICAgICAgbF9tY2NfcmVjb3JkLT5tX25iX2NvbXBzID0gbF9uYl9jb21wcyAmIDB4N2ZmZjsKLQotICAgICAgICAgICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgKGxfbmJfYnl0ZXNfYnlfY29tcCAqIGxfbWNjX3JlY29yZC0+bV9uYl9jb21wcyArIDIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBNQ0MgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcF9oZWFkZXJfc2l6ZSAtPSAobF9uYl9ieXRlc19ieV9jb21wICogbF9tY2NfcmVjb3JkLT5tX25iX2NvbXBzICsgMik7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfbWNjX3JlY29yZC0+bV9uYl9jb21wczsrK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdG1wLGxfbmJfYnl0ZXNfYnlfY29tcCk7ICAgICAgICAvKiBDbWNjaWogQ29tcG9uZW50IG9mZnNldCovCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2hlYWRlcl9kYXRhKz1sX25iX2J5dGVzX2J5X2NvbXA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX3RtcCAhPSBqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkNhbm5vdCB0YWtlIGluIGNoYXJnZSBjb2xsZWN0aW9ucyB3aXRoIGluZGl4IHNodWZmbGVcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9uYl9jb21wcywyKTsKLSAgICAgICAgICAgICAgICBwX2hlYWRlcl9kYXRhKz0yOwotCi0gICAgICAgICAgICAgICAgbF9uYl9ieXRlc19ieV9jb21wID0gMSArIChsX25iX2NvbXBzPj4xNSk7Ci0gICAgICAgICAgICAgICAgbF9uYl9jb21wcyAmPSAweDdmZmY7Ci0KLSAgICAgICAgICAgICAgICBpZiAobF9uYl9jb21wcyAhPSBsX21jY19yZWNvcmQtPm1fbmJfY29tcHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkNhbm5vdCB0YWtlIGluIGNoYXJnZSBjb2xsZWN0aW9ucyB3aXRob3V0IHNhbWUgbnVtYmVyIG9mIGluZGl4ZXNcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwX2hlYWRlcl9zaXplIDwgKGxfbmJfYnl0ZXNfYnlfY29tcCAqIGxfbWNjX3JlY29yZC0+bV9uYl9jb21wcyArIDMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBNQ0MgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcF9oZWFkZXJfc2l6ZSAtPSAobF9uYl9ieXRlc19ieV9jb21wICogbF9tY2NfcmVjb3JkLT5tX25iX2NvbXBzICsgMyk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfbWNjX3JlY29yZC0+bV9uYl9jb21wczsrK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfdG1wLGxfbmJfYnl0ZXNfYnlfY29tcCk7ICAgICAgICAvKiBXbWNjaWogQ29tcG9uZW50IG9mZnNldCovCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2hlYWRlcl9kYXRhKz1sX25iX2J5dGVzX2J5X2NvbXA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX3RtcCAhPSBqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkNhbm5vdCB0YWtlIGluIGNoYXJnZSBjb2xsZWN0aW9ucyB3aXRoIGluZGl4IHNodWZmbGVcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF90bXAsMyk7IC8qIFdtY2NpaiBDb21wb25lbnQgb2Zmc2V0Ki8KLSAgICAgICAgICAgICAgICBwX2hlYWRlcl9kYXRhICs9IDM7Ci0KLSAgICAgICAgICAgICAgICBsX21jY19yZWNvcmQtPm1faXNfaXJyZXZlcnNpYmxlID0gISAoKGxfdG1wPj4xNikgJiAxKTsKLSAgICAgICAgICAgICAgICBsX21jY19yZWNvcmQtPm1fZGVjb3JyZWxhdGlvbl9hcnJheSA9IDAwOwotICAgICAgICAgICAgICAgIGxfbWNjX3JlY29yZC0+bV9vZmZzZXRfYXJyYXkgPSAwMDsKLQotICAgICAgICAgICAgICAgIGxfaW5kaXggPSBsX3RtcCAmIDB4ZmY7Ci0gICAgICAgICAgICAgICAgaWYgKGxfaW5kaXggIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9tY3RfZGF0YSA9IGxfdGNwLT5tX21jdF9yZWNvcmRzOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajxsX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsrK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfbWN0X2RhdGEtPm1faW5kZXggPT0gbF9pbmRpeCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbWNjX3JlY29yZC0+bV9kZWNvcnJlbGF0aW9uX2FycmF5ID0gbF9tY3RfZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfbWN0X2RhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX21jY19yZWNvcmQtPm1fZGVjb3JyZWxhdGlvbl9hcnJheSA9PSAwMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBNQ0MgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsX2luZGl4ID0gKGxfdG1wID4+IDgpICYgMHhmZjsKLSAgICAgICAgICAgICAgICBpZiAobF9pbmRpeCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX21jdF9kYXRhID0gbF90Y3AtPm1fbWN0X3JlY29yZHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfdGNwLT5tX25iX21jdF9yZWNvcmRzOysraikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9tY3RfZGF0YS0+bV9pbmRleCA9PSBsX2luZGl4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9tY2NfcmVjb3JkLT5tX29mZnNldF9hcnJheSA9IGxfbWN0X2RhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX21jdF9kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9tY2NfcmVjb3JkLT5tX29mZnNldF9hcnJheSA9PSAwMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBNQ0MgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocF9oZWFkZXJfc2l6ZSAhPSAwKSB7CisgICAgICAgICAgICBpZiAobF9tY2NfcmVjb3JkLT5tX2RlY29ycmVsYXRpb25fYXJyYXkgPT0gMDApIHsKICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBNQ0MgbWFya2VyXG4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG5ld19tY2MpIHsKLSAgICAgICAgICAgICAgICArK2xfdGNwLT5tX25iX21jY19yZWNvcmRzOwotICAgICAgICB9CisgICAgICAgIGxfaW5kaXggPSAobF90bXAgPj4gOCkgJiAweGZmOworICAgICAgICBpZiAobF9pbmRpeCAhPSAwKSB7CisgICAgICAgICAgICBsX21jdF9kYXRhID0gbF90Y3AtPm1fbWN0X3JlY29yZHM7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbF90Y3AtPm1fbmJfbWN0X3JlY29yZHM7ICsraikgeworICAgICAgICAgICAgICAgIGlmIChsX21jdF9kYXRhLT5tX2luZGV4ID09IGxfaW5kaXgpIHsKKyAgICAgICAgICAgICAgICAgICAgbF9tY2NfcmVjb3JkLT5tX29mZnNldF9hcnJheSA9IGxfbWN0X2RhdGE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK2xfbWN0X2RhdGE7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICAgICAgaWYgKGxfbWNjX3JlY29yZC0+bV9vZmZzZXRfYXJyYXkgPT0gMDApIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBNQ0MgbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBfaGVhZGVyX3NpemUgIT0gMCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBNQ0MgbWFya2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICBpZiAobF9uZXdfbWNjKSB7CisgICAgICAgICsrbF90Y3AtPm1fbmJfbWNjX3JlY29yZHM7CisgICAgfQorCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9tY28oICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX21jbyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0gICAgICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX21jb19zaXplOwotICAgICAgICBvcGpfdGNwX3QgKiBsX3RjcCA9IDAwOwotICAgICAgICBvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCAqIGxfbWNjX3JlY29yZDsKLSAgICAgICAgT1BKX1VJTlQzMiBpOworICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKKyAgICBPUEpfVUlOVDMyIGxfbWNvX3NpemU7CisgICAgb3BqX3RjcF90ICogbF90Y3AgPSAwMDsKKyAgICBvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCAqIGxfbWNjX3JlY29yZDsKKyAgICBPUEpfVUlOVDMyIGk7CiAKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwogCi0gICAgICAgIGxfdGNwID0mKHBfajJrLT5tX2NwLnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0pOwotCQotICAgICAgICBsX21jb19zaXplID0gNSArIGxfdGNwLT5tX25iX21jY19yZWNvcmRzOwotICAgICAgICBpZiAobF9tY29fc2l6ZSA+IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSkgeworICAgIGxfdGNwID0gJihwX2oyay0+bV9jcC50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdKTsKIAotICAgICAgICAgICAgICAgIE9QSl9CWVRFICpuZXdfaGVhZGVyX3RpbGVfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfcmVhbGxvYyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCBsX21jb19zaXplKTsKLSAgICAgICAgICAgICAgICBpZiAoISBuZXdfaGVhZGVyX3RpbGVfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gd3JpdGUgTUNPIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gbmV3X2hlYWRlcl90aWxlX2RhdGE7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gbF9tY29fc2l6ZTsKKyAgICBsX21jb19zaXplID0gNSArIGxfdGNwLT5tX25iX21jY19yZWNvcmRzOworICAgIGlmIChsX21jb19zaXplID4gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplKSB7CisKKyAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfdGlsZV9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwgbF9tY29fc2l6ZSk7CisgICAgICAgIGlmICghIG5ld19oZWFkZXJfdGlsZV9kYXRhKSB7CisgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKTsKKyAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSBOVUxMOworICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byB3cml0ZSBNQ08gbWFya2VyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgICAgIH0KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhOworICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gbmV3X2hlYWRlcl90aWxlX2RhdGE7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IGxfbWNvX3NpemU7CisgICAgfQorICAgIGxfY3VycmVudF9kYXRhID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YTsKIAogCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxKMktfTVNfTUNPLDIpOyAgICAgICAgICAgICAgICAgICAvKiBNQ08gKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIEoyS19NU19NQ08sIDIpOyAgICAgICAgICAgICAgICAgLyogTUNPICovCisgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKIAotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF9tY29fc2l6ZS0yLDIpOyAgICAgICAgICAgICAgICAgLyogTG1jbyAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgbF9tY29fc2l6ZSAtIDIsIDIpOyAgICAgICAgICAgICAvKiBMbWNvICovCisgICAgbF9jdXJyZW50X2RhdGEgKz0gMjsKIAotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsbF90Y3AtPm1fbmJfbWNjX3JlY29yZHMsMSk7ICAgICAgLyogTm1jbyA6IG9ubHkgb25lIHRyYW5zZm9ybSBzdGFnZSovCisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLCBsX3RjcC0+bV9uYl9tY2NfcmVjb3JkcywKKyAgICAgICAgICAgICAgICAgICAgMSk7ICAgIC8qIE5tY28gOiBvbmx5IG9uZSB0cmFuc2Zvcm0gc3RhZ2UqLworICAgICsrbF9jdXJyZW50X2RhdGE7CisKKyAgICBsX21jY19yZWNvcmQgPSBsX3RjcC0+bV9tY2NfcmVjb3JkczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbF90Y3AtPm1fbmJfbWNjX3JlY29yZHM7ICsraSkgeworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGEsIGxfbWNjX3JlY29yZC0+bV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEpOyAvKiBJbWNvIC0+IHVzZSB0aGUgbWNjIGluZGljYXRlZCBieSAxKi8KICAgICAgICAgKytsX2N1cnJlbnRfZGF0YTsKKyAgICAgICAgKytsX21jY19yZWNvcmQ7CisgICAgfQogCi0gICAgICAgIGxfbWNjX3JlY29yZCA9IGxfdGNwLT5tX21jY19yZWNvcmRzOwotICAgICAgICBmb3IgKGk9MDtpPGxfdGNwLT5tX25iX21jY19yZWNvcmRzOysraSkgewotICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX21jY19yZWNvcmQtPm1faW5kZXgsMSk7LyogSW1jbyAtPiB1c2UgdGhlIG1jYyBpbmRpY2F0ZWQgYnkgMSovCi0gICAgICAgICAgICAgICAgKytsX2N1cnJlbnRfZGF0YTsKLSAgICAgICAgICAgICAgICArK2xfbWNjX3JlY29yZDsKLSAgICAgICAgfQorICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCBsX21jb19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSAhPSBsX21jb19zaXplKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSxsX21jb19zaXplLHBfbWFuYWdlcikgIT0gbF9tY29fc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiAvKioKQEAgLTU2MjIsMjA4ICs2MTI0LDIxOSBAQAogICogQHBhcmFtICAgICAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIE1DTyBtYXJrZXIuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX21jbyAoICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9tY28ob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF90bXAsIGk7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9zdGFnZXM7Ci0gICAgICAgIG9wal90Y3BfdCAqIGxfdGNwOwotICAgICAgICBvcGpfdGNjcF90ICogbF90Y2NwOwotICAgICAgICBvcGpfaW1hZ2VfdCAqIGxfaW1hZ2U7CisgICAgT1BKX1VJTlQzMiBsX3RtcCwgaTsKKyAgICBPUEpfVUlOVDMyIGxfbmJfc3RhZ2VzOworICAgIG9wal90Y3BfdCAqIGxfdGNwOworICAgIG9wal90Y2NwX3QgKiBsX3RjY3A7CisgICAgb3BqX2ltYWdlX3QgKiBsX2ltYWdlOwogCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CiAKLSAgICAgICAgbF9pbWFnZSA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2U7Ci0gICAgICAgIGxfdGNwID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX1RQSCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAmcF9qMmstPm1fY3AudGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcDsKKyAgICBsX2ltYWdlID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZTsKKyAgICBsX3RjcCA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9UUEggPworICAgICAgICAgICAgJnBfajJrLT5tX2NwLnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0gOgorICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3A7CiAKLSAgICAgICAgaWYgKHBfaGVhZGVyX3NpemUgPCAxKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgTUNPIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIGlmIChwX2hlYWRlcl9zaXplIDwgMSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBNQ08gbWFya2VyXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9uYl9zdGFnZXMsMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm1jbyA6IG9ubHkgb25lIHRyYW5zZm9ybSBzdGFnZSovCisgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgJmxfbmJfc3RhZ2VzLAorICAgICAgICAgICAgICAgICAgIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObWNvIDogb25seSBvbmUgdHJhbnNmb3JtIHN0YWdlKi8KKyAgICArK3BfaGVhZGVyX2RhdGE7CisKKyAgICBpZiAobF9uYl9zdGFnZXMgPiAxKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHRha2UgaW4gY2hhcmdlIG11bHRpcGxlIHRyYW5zZm9ybWF0aW9uIHN0YWdlcy5cbiIpOworICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgfQorCisgICAgaWYgKHBfaGVhZGVyX3NpemUgIT0gbF9uYl9zdGFnZXMgKyAxKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkVycm9yIHJlYWRpbmcgTUNPIG1hcmtlclxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgbF90Y2NwID0gbF90Y3AtPnRjY3BzOworCisgICAgZm9yIChpID0gMDsgaSA8IGxfaW1hZ2UtPm51bWNvbXBzOyArK2kpIHsKKyAgICAgICAgbF90Y2NwLT5tX2RjX2xldmVsX3NoaWZ0ID0gMDsKKyAgICAgICAgKytsX3RjY3A7CisgICAgfQorCisgICAgaWYgKGxfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgpIHsKKyAgICAgICAgb3BqX2ZyZWUobF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCk7CisgICAgICAgIGxfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXggPSAwMDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbF9uYl9zdGFnZXM7ICsraSkgeworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAmbF90bXAsIDEpOwogICAgICAgICArK3BfaGVhZGVyX2RhdGE7CiAKLSAgICAgICAgaWYgKGxfbmJfc3RhZ2VzID4gMSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkNhbm5vdCB0YWtlIGluIGNoYXJnZSBtdWx0aXBsZSB0cmFuc2Zvcm1hdGlvbiBzdGFnZXMuXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgIGlmICghIG9wal9qMmtfYWRkX21jdChsX3RjcCwgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZSwgbF90bXApKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIGlmIChwX2hlYWRlcl9zaXplICE9IGxfbmJfc3RhZ2VzICsgMSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkVycm9yIHJlYWRpbmcgTUNPIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIGxfdGNjcCA9IGxfdGNwLT50Y2NwczsKLQotICAgICAgICBmb3IgKGk9MDtpPGxfaW1hZ2UtPm51bWNvbXBzOysraSkgewotICAgICAgICAgICAgICAgIGxfdGNjcC0+bV9kY19sZXZlbF9zaGlmdCA9IDA7Ci0gICAgICAgICAgICAgICAgKytsX3RjY3A7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCkgewotICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgpOwotICAgICAgICAgICAgICAgIGxfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXggPSAwMDsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaT0wO2k8bF9uYl9zdGFnZXM7KytpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF90bXAsMSk7Ci0gICAgICAgICAgICAgICAgKytwX2hlYWRlcl9kYXRhOwotCi0gICAgICAgICAgICAgICAgaWYgKCEgb3BqX2oya19hZGRfbWN0KGxfdGNwLHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UsbF90bXApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2FkZF9tY3Qob3BqX3RjcF90ICogcF90Y3AsIG9wal9pbWFnZV90ICogcF9pbWFnZSwgT1BKX1VJTlQzMiBwX2luZGV4KQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfYWRkX21jdChvcGpfdGNwX3QgKiBwX3RjcCwgb3BqX2ltYWdlX3QgKiBwX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaW5kZXgpCiB7Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgb3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QgKiBsX21jY19yZWNvcmQ7Ci0gICAgICAgIG9wal9tY3RfZGF0YV90ICogbF9kZWNvX2FycmF5LCAqIGxfb2Zmc2V0X2FycmF5OwotICAgICAgICBPUEpfVUlOVDMyIGxfZGF0YV9zaXplLGxfbWN0X3NpemUsIGxfb2Zmc2V0X3NpemU7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9lbGVtOwotICAgICAgICBPUEpfVUlOVDMyICogbF9vZmZzZXRfZGF0YSwgKiBsX2N1cnJlbnRfb2Zmc2V0X2RhdGE7Ci0gICAgICAgIG9wal90Y2NwX3QgKiBsX3RjY3A7CisgICAgT1BKX1VJTlQzMiBpOworICAgIG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90ICogbF9tY2NfcmVjb3JkOworICAgIG9wal9tY3RfZGF0YV90ICogbF9kZWNvX2FycmF5LCAqIGxfb2Zmc2V0X2FycmF5OworICAgIE9QSl9VSU5UMzIgbF9kYXRhX3NpemUsIGxfbWN0X3NpemUsIGxfb2Zmc2V0X3NpemU7CisgICAgT1BKX1VJTlQzMiBsX25iX2VsZW07CisgICAgT1BKX1VJTlQzMiAqIGxfb2Zmc2V0X2RhdGEsICogbF9jdXJyZW50X29mZnNldF9kYXRhOworICAgIG9wal90Y2NwX3QgKiBsX3RjY3A7CiAKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF90Y3AgIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF90Y3AgIT0gMDApOwogCi0gICAgICAgIGxfbWNjX3JlY29yZCA9IHBfdGNwLT5tX21jY19yZWNvcmRzOworICAgIGxfbWNjX3JlY29yZCA9IHBfdGNwLT5tX21jY19yZWNvcmRzOwogCi0gICAgICAgIGZvciAoaT0wO2k8cF90Y3AtPm1fbmJfbWNjX3JlY29yZHM7KytpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxfbWNjX3JlY29yZC0+bV9pbmRleCA9PSBwX2luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IHBfdGNwLT5tX25iX21jY19yZWNvcmRzOyArK2kpIHsKKyAgICAgICAgaWYgKGxfbWNjX3JlY29yZC0+bV9pbmRleCA9PSBwX2luZGV4KSB7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICBpZiAoaT09cF90Y3AtPm1fbmJfbWNjX3JlY29yZHMpIHsKLSAgICAgICAgICAgICAgICAvKiogZWxlbWVudCBkaXNjYXJkZWQgKiovCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxfbWNjX3JlY29yZC0+bV9uYl9jb21wcyAhPSBwX2ltYWdlLT5udW1jb21wcykgewotICAgICAgICAgICAgICAgIC8qKiBkbyBub3Qgc3VwcG9ydCBudW1iZXIgb2YgY29tcHMgIT0gaW1hZ2UgKi8KLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBsX2RlY29fYXJyYXkgPSBsX21jY19yZWNvcmQtPm1fZGVjb3JyZWxhdGlvbl9hcnJheTsKLQotICAgICAgICBpZiAobF9kZWNvX2FycmF5KSB7Ci0gICAgICAgICAgICAgICAgbF9kYXRhX3NpemUgPSBNQ1RfRUxFTUVOVF9TSVpFW2xfZGVjb19hcnJheS0+bV9lbGVtZW50X3R5cGVdICogcF9pbWFnZS0+bnVtY29tcHMgKiBwX2ltYWdlLT5udW1jb21wczsKLSAgICAgICAgICAgICAgICBpZiAobF9kZWNvX2FycmF5LT5tX2RhdGFfc2l6ZSAhPSBsX2RhdGFfc2l6ZSB8fCAhIGxfZGVjb19hcnJheS0+bV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxfbmJfZWxlbSA9IHBfaW1hZ2UtPm51bWNvbXBzICogcF9pbWFnZS0+bnVtY29tcHM7Ci0gICAgICAgICAgICAgICAgbF9tY3Rfc2l6ZSA9IGxfbmJfZWxlbSAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfRkxPQVQzMik7Ci0gICAgICAgICAgICAgICAgcF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCA9IChPUEpfRkxPQVQzMiopb3BqX21hbGxvYyhsX21jdF9zaXplKTsKLQotICAgICAgICAgICAgICAgIGlmICghIHBfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXggKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGoya19tY3RfcmVhZF9mdW5jdGlvbnNfdG9fZmxvYXRbbF9kZWNvX2FycmF5LT5tX2VsZW1lbnRfdHlwZV0obF9kZWNvX2FycmF5LT5tX2RhdGEscF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCxsX25iX2VsZW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgbF9vZmZzZXRfYXJyYXkgPSBsX21jY19yZWNvcmQtPm1fb2Zmc2V0X2FycmF5OwotCi0gICAgICAgIGlmIChsX29mZnNldF9hcnJheSkgewotICAgICAgICAgICAgICAgIGxfZGF0YV9zaXplID0gTUNUX0VMRU1FTlRfU0laRVtsX29mZnNldF9hcnJheS0+bV9lbGVtZW50X3R5cGVdICogcF9pbWFnZS0+bnVtY29tcHM7Ci0gICAgICAgICAgICAgICAgaWYgKGxfb2Zmc2V0X2FycmF5LT5tX2RhdGFfc2l6ZSAhPSBsX2RhdGFfc2l6ZSB8fCAhIGxfb2Zmc2V0X2FycmF5LT5tX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbF9uYl9lbGVtID0gcF9pbWFnZS0+bnVtY29tcHM7Ci0gICAgICAgICAgICAgICAgbF9vZmZzZXRfc2l6ZSA9IGxfbmJfZWxlbSAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfVUlOVDMyKTsKLSAgICAgICAgICAgICAgICBsX29mZnNldF9kYXRhID0gKE9QSl9VSU5UMzIqKW9wal9tYWxsb2MobF9vZmZzZXRfc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoISBsX29mZnNldF9kYXRhICkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBqMmtfbWN0X3JlYWRfZnVuY3Rpb25zX3RvX2ludDMyW2xfb2Zmc2V0X2FycmF5LT5tX2VsZW1lbnRfdHlwZV0obF9vZmZzZXRfYXJyYXktPm1fZGF0YSxsX29mZnNldF9kYXRhLGxfbmJfZWxlbSk7Ci0KLSAgICAgICAgICAgICAgICBsX3RjY3AgPSBwX3RjcC0+dGNjcHM7Ci0gICAgICAgICAgICAgICAgbF9jdXJyZW50X29mZnNldF9kYXRhID0gbF9vZmZzZXRfZGF0YTsKLQotICAgICAgICAgICAgICAgIGZvciAoaT0wO2k8cF9pbWFnZS0+bnVtY29tcHM7KytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3RjY3AtPm1fZGNfbGV2ZWxfc2hpZnQgPSAoT1BKX0lOVDMyKSoobF9jdXJyZW50X29mZnNldF9kYXRhKyspOwotICAgICAgICAgICAgICAgICAgICAgICAgKytsX3RjY3A7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9vZmZzZXRfZGF0YSk7Ci0gICAgICAgIH0KLQorICAgIGlmIChpID09IHBfdGNwLT5tX25iX21jY19yZWNvcmRzKSB7CisgICAgICAgIC8qKiBlbGVtZW50IGRpc2NhcmRlZCAqKi8KICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIH0KKworICAgIGlmIChsX21jY19yZWNvcmQtPm1fbmJfY29tcHMgIT0gcF9pbWFnZS0+bnVtY29tcHMpIHsKKyAgICAgICAgLyoqIGRvIG5vdCBzdXBwb3J0IG51bWJlciBvZiBjb21wcyAhPSBpbWFnZSAqLworICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgfQorCisgICAgbF9kZWNvX2FycmF5ID0gbF9tY2NfcmVjb3JkLT5tX2RlY29ycmVsYXRpb25fYXJyYXk7CisKKyAgICBpZiAobF9kZWNvX2FycmF5KSB7CisgICAgICAgIGxfZGF0YV9zaXplID0gTUNUX0VMRU1FTlRfU0laRVtsX2RlY29fYXJyYXktPm1fZWxlbWVudF90eXBlXSAqIHBfaW1hZ2UtPm51bWNvbXBzCisgICAgICAgICAgICAgICAgICAgICAgKiBwX2ltYWdlLT5udW1jb21wczsKKyAgICAgICAgaWYgKGxfZGVjb19hcnJheS0+bV9kYXRhX3NpemUgIT0gbF9kYXRhX3NpemUgfHwgISBsX2RlY29fYXJyYXktPm1fZGF0YSkgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGxfbmJfZWxlbSA9IHBfaW1hZ2UtPm51bWNvbXBzICogcF9pbWFnZS0+bnVtY29tcHM7CisgICAgICAgIGxfbWN0X3NpemUgPSBsX25iX2VsZW0gKiAoT1BKX1VJTlQzMilzaXplb2YoT1BKX0ZMT0FUMzIpOworICAgICAgICBwX3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4ID0gKE9QSl9GTE9BVDMyKilvcGpfbWFsbG9jKGxfbWN0X3NpemUpOworCisgICAgICAgIGlmICghIHBfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBqMmtfbWN0X3JlYWRfZnVuY3Rpb25zX3RvX2Zsb2F0W2xfZGVjb19hcnJheS0+bV9lbGVtZW50X3R5cGVdKAorICAgICAgICAgICAgbF9kZWNvX2FycmF5LT5tX2RhdGEsIHBfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgsIGxfbmJfZWxlbSk7CisgICAgfQorCisgICAgbF9vZmZzZXRfYXJyYXkgPSBsX21jY19yZWNvcmQtPm1fb2Zmc2V0X2FycmF5OworCisgICAgaWYgKGxfb2Zmc2V0X2FycmF5KSB7CisgICAgICAgIGxfZGF0YV9zaXplID0gTUNUX0VMRU1FTlRfU0laRVtsX29mZnNldF9hcnJheS0+bV9lbGVtZW50X3R5cGVdICoKKyAgICAgICAgICAgICAgICAgICAgICBwX2ltYWdlLT5udW1jb21wczsKKyAgICAgICAgaWYgKGxfb2Zmc2V0X2FycmF5LT5tX2RhdGFfc2l6ZSAhPSBsX2RhdGFfc2l6ZSB8fCAhIGxfb2Zmc2V0X2FycmF5LT5tX2RhdGEpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBsX25iX2VsZW0gPSBwX2ltYWdlLT5udW1jb21wczsKKyAgICAgICAgbF9vZmZzZXRfc2l6ZSA9IGxfbmJfZWxlbSAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfVUlOVDMyKTsKKyAgICAgICAgbF9vZmZzZXRfZGF0YSA9IChPUEpfVUlOVDMyKilvcGpfbWFsbG9jKGxfb2Zmc2V0X3NpemUpOworCisgICAgICAgIGlmICghIGxfb2Zmc2V0X2RhdGEpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBqMmtfbWN0X3JlYWRfZnVuY3Rpb25zX3RvX2ludDMyW2xfb2Zmc2V0X2FycmF5LT5tX2VsZW1lbnRfdHlwZV0oCisgICAgICAgICAgICBsX29mZnNldF9hcnJheS0+bV9kYXRhLCBsX29mZnNldF9kYXRhLCBsX25iX2VsZW0pOworCisgICAgICAgIGxfdGNjcCA9IHBfdGNwLT50Y2NwczsKKyAgICAgICAgbF9jdXJyZW50X29mZnNldF9kYXRhID0gbF9vZmZzZXRfZGF0YTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcF9pbWFnZS0+bnVtY29tcHM7ICsraSkgeworICAgICAgICAgICAgbF90Y2NwLT5tX2RjX2xldmVsX3NoaWZ0ID0gKE9QSl9JTlQzMikgKiAobF9jdXJyZW50X29mZnNldF9kYXRhKyspOworICAgICAgICAgICAgKytsX3RjY3A7CisgICAgICAgIH0KKworICAgICAgICBvcGpfZnJlZShsX29mZnNldF9kYXRhKTsKKyAgICB9CisKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2NiZCggb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIgKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfY2JkKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIpCiB7Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2NiZF9zaXplOwotICAgICAgICBPUEpfQllURSAqIGxfY3VycmVudF9kYXRhID0gMDA7Ci0gICAgICAgIG9wal9pbWFnZV90ICpsX2ltYWdlID0gMDA7Ci0gICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2NvbXAgPSAwMDsKKyAgICBPUEpfVUlOVDMyIGk7CisgICAgT1BKX1VJTlQzMiBsX2NiZF9zaXplOworICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKKyAgICBvcGpfaW1hZ2VfdCAqbF9pbWFnZSA9IDAwOworICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2NvbXAgPSAwMDsKIAotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CiAKLSAgICAgICAgbF9pbWFnZSA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2U7Ci0gICAgICAgIGxfY2JkX3NpemUgPSA2ICsgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHM7CisgICAgbF9pbWFnZSA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2U7CisgICAgbF9jYmRfc2l6ZSA9IDYgKyBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wczsKIAotICAgICAgICBpZiAobF9jYmRfc2l6ZSA+IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSkgewotICAgICAgICAgICAgICAgIE9QSl9CWVRFICpuZXdfaGVhZGVyX3RpbGVfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfcmVhbGxvYyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCBsX2NiZF9zaXplKTsKLSAgICAgICAgICAgICAgICBpZiAoISBuZXdfaGVhZGVyX3RpbGVfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gd3JpdGUgQ0JEIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gbmV3X2hlYWRlcl90aWxlX2RhdGE7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gbF9jYmRfc2l6ZTsKKyAgICBpZiAobF9jYmRfc2l6ZSA+IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSkgeworICAgICAgICBPUEpfQllURSAqbmV3X2hlYWRlcl90aWxlX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhLCBsX2NiZF9zaXplKTsKKyAgICAgICAgaWYgKCEgbmV3X2hlYWRlcl90aWxlX2RhdGEpIHsKKyAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEpOworICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSAwOworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHdyaXRlIENCRCBtYXJrZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQorICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhID0gbmV3X2hlYWRlcl90aWxlX2RhdGE7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IGxfY2JkX3NpemU7CisgICAgfQogCi0gICAgICAgIGxfY3VycmVudF9kYXRhID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YTsKKyAgICBsX2N1cnJlbnRfZGF0YSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGE7CiAKLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLEoyS19NU19DQkQsMik7ICAgICAgICAgICAgICAgICAgIC8qIENCRCAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgSjJLX01TX0NCRCwgMik7ICAgICAgICAgICAgICAgICAvKiBDQkQgKi8KKyAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwogCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSxsX2NiZF9zaXplLTIsMik7ICAgICAgICAgICAgICAgICAvKiBMX0NCRCAqLwotICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSAyOworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgbF9jYmRfc2l6ZSAtIDIsIDIpOyAgICAgICAgICAgICAvKiBMX0NCRCAqLworICAgIGxfY3VycmVudF9kYXRhICs9IDI7CiAKLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLGxfaW1hZ2UtPm51bWNvbXBzLCAyKTsgICAgICAgICAgIC8qIE5jYmQgKi8KLSAgICAgICAgbF9jdXJyZW50X2RhdGErPTI7CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLCBsX2ltYWdlLT5udW1jb21wcywgMik7ICAgICAgICAgIC8qIE5jYmQgKi8KKyAgICBsX2N1cnJlbnRfZGF0YSArPSAyOwogCi0gICAgICAgIGxfY29tcCA9IGxfaW1hZ2UtPmNvbXBzOworICAgIGxfY29tcCA9IGxfaW1hZ2UtPmNvbXBzOwogCi0gICAgICAgIGZvciAoaT0wO2k8bF9pbWFnZS0+bnVtY29tcHM7KytpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhLCAobF9jb21wLT5zZ25kIDw8IDcpIHwgKGxfY29tcC0+cHJlYyAtIDEpLCAxKTsgICAgICAgICAgIC8qIENvbXBvbmVudCBiaXQgZGVwdGggKi8KLSAgICAgICAgICAgICAgICArK2xfY3VycmVudF9kYXRhOworICAgIGZvciAoaSA9IDA7IGkgPCBsX2ltYWdlLT5udW1jb21wczsgKytpKSB7CisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YSwgKGxfY29tcC0+c2duZCA8PCA3KSB8IChsX2NvbXAtPnByZWMgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEpOyAgICAgICAgICAgLyogQ29tcG9uZW50IGJpdCBkZXB0aCAqLworICAgICAgICArK2xfY3VycmVudF9kYXRhOwogCi0gICAgICAgICAgICAgICAgKytsX2NvbXA7Ci0gICAgICAgIH0KKyAgICAgICAgKytsX2NvbXA7CisgICAgfQogCi0gICAgICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSxsX2NiZF9zaXplLHBfbWFuYWdlcikgIT0gbF9jYmRfc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSwgbF9jYmRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWFuYWdlcikgIT0gbF9jYmRfc2l6ZSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiAvKioKQEAgLTU4MzMsNDcgKzYzNDYsNTYgQEAKICAqIEBwYXJhbSAgICAgICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBDQkQgbWFya2VyLgogICogQHBhcmFtICAgICAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9jYmQgKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfY2JkKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfY29tcCxsX251bV9jb21wOwotICAgICAgICBPUEpfVUlOVDMyIGxfY29tcF9kZWY7Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgb3BqX2ltYWdlX2NvbXBfdCAqIGxfY29tcCA9IDAwOworICAgIE9QSl9VSU5UMzIgbF9uYl9jb21wLCBsX251bV9jb21wOworICAgIE9QSl9VSU5UMzIgbF9jb21wX2RlZjsKKyAgICBPUEpfVUlOVDMyIGk7CisgICAgb3BqX2ltYWdlX2NvbXBfdCAqIGxfY29tcCA9IDAwOwogCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CiAKLSAgICAgICAgbF9udW1fY29tcCA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOworICAgIGxfbnVtX2NvbXAgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wczsKIAotICAgICAgICBpZiAocF9oZWFkZXJfc2l6ZSAhPSAocF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMgKyAyKSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJDcnJvciByZWFkaW5nIENCRCBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgaWYgKHBfaGVhZGVyX3NpemUgIT0gKHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzICsgMikpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkNycm9yIHJlYWRpbmcgQ0JEIG1hcmtlclxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgJmxfbmJfY29tcCwKKyAgICAgICAgICAgICAgICAgICAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOY2JkICovCisgICAgcF9oZWFkZXJfZGF0YSArPSAyOworCisgICAgaWYgKGxfbmJfY29tcCAhPSBsX251bV9jb21wKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJDcnJvciByZWFkaW5nIENCRCBtYXJrZXJcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIGxfY29tcCA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPmNvbXBzOworICAgIGZvciAoaSA9IDA7IGkgPCBsX251bV9jb21wOyArK2kpIHsKKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwgJmxfY29tcF9kZWYsCisgICAgICAgICAgICAgICAgICAgICAgIDEpOyAgICAgICAgICAgICAgICAgIC8qIENvbXBvbmVudCBiaXQgZGVwdGggKi8KKyAgICAgICAgKytwX2hlYWRlcl9kYXRhOworICAgICAgICBsX2NvbXAtPnNnbmQgPSAobF9jb21wX2RlZiA+PiA3KSAmIDE7CisgICAgICAgIGxfY29tcC0+cHJlYyA9IChsX2NvbXBfZGVmICYgMHg3ZikgKyAxOworCisgICAgICAgIGlmIChsX2NvbXAtPnByZWMgPiAzMSkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdmFsdWVzIGZvciBjb21wID0gJWQgOiBwcmVjPSV1IChzaG91bGQgYmUgYmV0d2VlbiAxIGFuZCAzOCBhY2NvcmRpbmcgdG8gdGhlIEpQRUcyMDAwIG5vcm0uIE9wZW5KcGVnIG9ubHkgc3VwcG9ydHMgdXAgdG8gMzEpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBsX2NvbXAtPnByZWMpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQorICAgICAgICArK2xfY29tcDsKKyAgICB9CiAKLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9uYl9jb21wLDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmNiZCAqLwotICAgICAgICBwX2hlYWRlcl9kYXRhKz0yOwotCi0gICAgICAgIGlmIChsX25iX2NvbXAgIT0gbF9udW1fY29tcCkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJDcnJvciByZWFkaW5nIENCRCBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBsX2NvbXAgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5jb21wczsKLSAgICAgICAgZm9yIChpPTA7aTxsX251bV9jb21wOysraSkgewotICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmxfY29tcF9kZWYsMSk7ICAgICAgICAgICAgICAgICAgICAvKiBDb21wb25lbnQgYml0IGRlcHRoICovCi0gICAgICAgICAgICAgICAgKytwX2hlYWRlcl9kYXRhOwotICAgICAgICBsX2NvbXAtPnNnbmQgPSAobF9jb21wX2RlZj4+NykgJiAxOwotICAgICAgICAgICAgICAgIGxfY29tcC0+cHJlYyA9IChsX2NvbXBfZGVmJjB4N2YpICsgMTsKLSAgICAgICAgICAgICAgICArK2xfY29tcDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC01ODgyLDE2ICs2NDA0LDU5IEBACiAKIHZvaWQgb3BqX2oya19zZXR1cF9kZWNvZGVyKG9wal9qMmtfdCAqajJrLCBvcGpfZHBhcmFtZXRlcnNfdCAqcGFyYW1ldGVycykKIHsKLSAgICAgICAgaWYoajJrICYmIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICBqMmstPm1fY3AubV9zcGVjaWZpY19wYXJhbS5tX2RlYy5tX2xheWVyID0gcGFyYW1ldGVycy0+Y3BfbGF5ZXI7Ci0gICAgICAgICAgICAgICAgajJrLT5tX2NwLm1fc3BlY2lmaWNfcGFyYW0ubV9kZWMubV9yZWR1Y2UgPSBwYXJhbWV0ZXJzLT5jcF9yZWR1Y2U7CisgICAgaWYgKGoyayAmJiBwYXJhbWV0ZXJzKSB7CisgICAgICAgIGoyay0+bV9jcC5tX3NwZWNpZmljX3BhcmFtLm1fZGVjLm1fbGF5ZXIgPSBwYXJhbWV0ZXJzLT5jcF9sYXllcjsKKyAgICAgICAgajJrLT5tX2NwLm1fc3BlY2lmaWNfcGFyYW0ubV9kZWMubV9yZWR1Y2UgPSBwYXJhbWV0ZXJzLT5jcF9yZWR1Y2U7CiAKKyAgICAgICAgajJrLT5kdW1wX3N0YXRlID0gKHBhcmFtZXRlcnMtPmZsYWdzICYgT1BKX0RQQVJBTUVURVJTX0RVTVBfRkxBRyk7CiAjaWZkZWYgVVNFX0pQV0wKLSAgICAgICAgICAgICAgICBqMmstPm1fY3AuY29ycmVjdCA9IHBhcmFtZXRlcnMtPmpwd2xfY29ycmVjdDsKLSAgICAgICAgICAgICAgICBqMmstPm1fY3AuZXhwX2NvbXBzID0gcGFyYW1ldGVycy0+anB3bF9leHBfY29tcHM7Ci0gICAgICAgICAgICAgICAgajJrLT5tX2NwLm1heF90aWxlcyA9IHBhcmFtZXRlcnMtPmpwd2xfbWF4X3RpbGVzOworICAgICAgICBqMmstPm1fY3AuY29ycmVjdCA9IHBhcmFtZXRlcnMtPmpwd2xfY29ycmVjdDsKKyAgICAgICAgajJrLT5tX2NwLmV4cF9jb21wcyA9IHBhcmFtZXRlcnMtPmpwd2xfZXhwX2NvbXBzOworICAgICAgICBqMmstPm1fY3AubWF4X3RpbGVzID0gcGFyYW1ldGVycy0+anB3bF9tYXhfdGlsZXM7CiAjZW5kaWYgLyogVVNFX0pQV0wgKi8KKyAgICB9Cit9CisKK09QSl9CT09MIG9wal9qMmtfc2V0X3RocmVhZHMob3BqX2oya190ICpqMmssIE9QSl9VSU5UMzIgbnVtX3RocmVhZHMpCit7CisgICAgaWYgKG9wal9oYXNfdGhyZWFkX3N1cHBvcnQoKSkgeworICAgICAgICBvcGpfdGhyZWFkX3Bvb2xfZGVzdHJveShqMmstPm1fdHApOworICAgICAgICBqMmstPm1fdHAgPSBOVUxMOworICAgICAgICBpZiAobnVtX3RocmVhZHMgPD0gKE9QSl9VSU5UMzIpSU5UX01BWCkgeworICAgICAgICAgICAgajJrLT5tX3RwID0gb3BqX3RocmVhZF9wb29sX2NyZWF0ZSgoaW50KW51bV90aHJlYWRzKTsKICAgICAgICAgfQorICAgICAgICBpZiAoajJrLT5tX3RwID09IE5VTEwpIHsKKyAgICAgICAgICAgIGoyay0+bV90cCA9IG9wal90aHJlYWRfcG9vbF9jcmVhdGUoMCk7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIE9QSl9GQUxTRTsKK30KKworc3RhdGljIGludCBvcGpfajJrX2dldF9kZWZhdWx0X3RocmVhZF9jb3VudCgpCit7CisgICAgY29uc3QgY2hhciogbnVtX3RocmVhZHNfc3RyID0gZ2V0ZW52KCJPUEpfTlVNX1RIUkVBRFMiKTsKKyAgICBpbnQgbnVtX2NwdXM7CisgICAgaW50IG51bV90aHJlYWRzOworCisgICAgaWYgKG51bV90aHJlYWRzX3N0ciA9PSBOVUxMIHx8ICFvcGpfaGFzX3RocmVhZF9zdXBwb3J0KCkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG51bV9jcHVzID0gb3BqX2dldF9udW1fY3B1cygpOworICAgIGlmIChzdHJjbXAobnVtX3RocmVhZHNfc3RyLCAiQUxMX0NQVVMiKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBudW1fY3B1czsKKyAgICB9CisgICAgaWYgKG51bV9jcHVzID09IDApIHsKKyAgICAgICAgbnVtX2NwdXMgPSAzMjsKKyAgICB9CisgICAgbnVtX3RocmVhZHMgPSBhdG9pKG51bV90aHJlYWRzX3N0cik7CisgICAgaWYgKG51bV90aHJlYWRzIDwgMCkgeworICAgICAgICBudW1fdGhyZWFkcyA9IDA7CisgICAgfSBlbHNlIGlmIChudW1fdGhyZWFkcyA+IDIgKiBudW1fY3B1cykgeworICAgICAgICBudW1fdGhyZWFkcyA9IDIgKiBudW1fY3B1czsKKyAgICB9CisgICAgcmV0dXJuIG51bV90aHJlYWRzOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNTkwMCw1MCArNjQ2NSw2MiBAQAogCiBvcGpfajJrX3QqIG9wal9qMmtfY3JlYXRlX2NvbXByZXNzKHZvaWQpCiB7Ci0gICAgICAgIG9wal9qMmtfdCAqbF9qMmsgPSAob3BqX2oya190Kikgb3BqX2NhbGxvYygxLHNpemVvZihvcGpfajJrX3QpKTsKLSAgICAgICAgaWYgKCFsX2oyaykgewotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CisgICAgb3BqX2oya190ICpsX2oyayA9IChvcGpfajJrX3QqKSBvcGpfY2FsbG9jKDEsIHNpemVvZihvcGpfajJrX3QpKTsKKyAgICBpZiAoIWxfajJrKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAogCi0gICAgICAgIGxfajJrLT5tX2lzX2RlY29kZXIgPSAwOwotICAgICAgICBsX2oyay0+bV9jcC5tX2lzX2RlY29kZXIgPSAwOworICAgIGxfajJrLT5tX2lzX2RlY29kZXIgPSAwOworICAgIGxfajJrLT5tX2NwLm1faXNfZGVjb2RlciA9IDA7CiAKLSAgICAgICAgbF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfbWFsbG9jKE9QSl9KMktfREVGQVVMVF9IRUFERVJfU0laRSk7Ci0gICAgICAgIGlmICghIGxfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEpIHsKLSAgICAgICAgICAgICAgICBvcGpfajJrX2Rlc3Ryb3kobF9qMmspOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CisgICAgbF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfbWFsbG9jKAorICAgICAgICAgICAgICAgIE9QSl9KMktfREVGQVVMVF9IRUFERVJfU0laRSk7CisgICAgaWYgKCEgbF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSkgeworICAgICAgICBvcGpfajJrX2Rlc3Ryb3kobF9qMmspOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLSAgICAgICAgbF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gT1BKX0oyS19ERUZBVUxUX0hFQURFUl9TSVpFOworICAgIGxfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9CisgICAgICAgIE9QSl9KMktfREVGQVVMVF9IRUFERVJfU0laRTsKIAotICAgICAgICAvKiB2YWxpZGF0aW9uIGxpc3QgY3JlYXRpb24qLwotICAgICAgICBsX2oyay0+bV92YWxpZGF0aW9uX2xpc3QgPSBvcGpfcHJvY2VkdXJlX2xpc3RfY3JlYXRlKCk7Ci0gICAgICAgIGlmICghIGxfajJrLT5tX3ZhbGlkYXRpb25fbGlzdCkgewotICAgICAgICAgICAgICAgIG9wal9qMmtfZGVzdHJveShsX2oyayk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KKyAgICAvKiB2YWxpZGF0aW9uIGxpc3QgY3JlYXRpb24qLworICAgIGxfajJrLT5tX3ZhbGlkYXRpb25fbGlzdCA9IG9wal9wcm9jZWR1cmVfbGlzdF9jcmVhdGUoKTsKKyAgICBpZiAoISBsX2oyay0+bV92YWxpZGF0aW9uX2xpc3QpIHsKKyAgICAgICAgb3BqX2oya19kZXN0cm95KGxfajJrKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0gICAgICAgIC8qIGV4ZWN1dGlvbiBsaXN0IGNyZWF0aW9uKi8KLSAgICAgICAgbF9qMmstPm1fcHJvY2VkdXJlX2xpc3QgPSBvcGpfcHJvY2VkdXJlX2xpc3RfY3JlYXRlKCk7Ci0gICAgICAgIGlmICghIGxfajJrLT5tX3Byb2NlZHVyZV9saXN0KSB7Ci0gICAgICAgICAgICAgICAgb3BqX2oya19kZXN0cm95KGxfajJrKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQorICAgIC8qIGV4ZWN1dGlvbiBsaXN0IGNyZWF0aW9uKi8KKyAgICBsX2oyay0+bV9wcm9jZWR1cmVfbGlzdCA9IG9wal9wcm9jZWR1cmVfbGlzdF9jcmVhdGUoKTsKKyAgICBpZiAoISBsX2oyay0+bV9wcm9jZWR1cmVfbGlzdCkgeworICAgICAgICBvcGpfajJrX2Rlc3Ryb3kobF9qMmspOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLSAgICAgICAgcmV0dXJuIGxfajJrOworICAgIGxfajJrLT5tX3RwID0gb3BqX3RocmVhZF9wb29sX2NyZWF0ZShvcGpfajJrX2dldF9kZWZhdWx0X3RocmVhZF9jb3VudCgpKTsKKyAgICBpZiAoIWxfajJrLT5tX3RwKSB7CisgICAgICAgIGxfajJrLT5tX3RwID0gb3BqX3RocmVhZF9wb29sX2NyZWF0ZSgwKTsKKyAgICB9CisgICAgaWYgKCFsX2oyay0+bV90cCkgeworICAgICAgICBvcGpfajJrX2Rlc3Ryb3kobF9qMmspOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbF9qMms7CiB9CiAKLXN0YXRpYyBpbnQgb3BqX2oya19pbml0aWFsaXNlXzRLX3BvYyhvcGpfcG9jX3QgKlBPQywgaW50IG51bXJlcyl7CitzdGF0aWMgaW50IG9wal9qMmtfaW5pdGlhbGlzZV80S19wb2Mob3BqX3BvY190ICpQT0MsIGludCBudW1yZXMpCit7CiAgICAgUE9DWzBdLnRpbGUgID0gMTsKICAgICBQT0NbMF0ucmVzbm8wICA9IDA7CiAgICAgUE9DWzBdLmNvbXBubzAgPSAwOwogICAgIFBPQ1swXS5sYXlubzEgID0gMTsKLSAgICBQT0NbMF0ucmVzbm8xICA9IChPUEpfVUlOVDMyKShudW1yZXMtMSk7CisgICAgUE9DWzBdLnJlc25vMSAgPSAoT1BKX1VJTlQzMikobnVtcmVzIC0gMSk7CiAgICAgUE9DWzBdLmNvbXBubzEgPSAzOwogICAgIFBPQ1swXS5wcmcxID0gT1BKX0NQUkw7CiAgICAgUE9DWzFdLnRpbGUgID0gMTsKLSAgICBQT0NbMV0ucmVzbm8wICA9IChPUEpfVUlOVDMyKShudW1yZXMtMSk7CisgICAgUE9DWzFdLnJlc25vMCAgPSAoT1BKX1VJTlQzMikobnVtcmVzIC0gMSk7CiAgICAgUE9DWzFdLmNvbXBubzAgPSAwOwogICAgIFBPQ1sxXS5sYXlubzEgID0gMTsKICAgICBQT0NbMV0ucmVzbm8xICA9IChPUEpfVUlOVDMyKW51bXJlczsKQEAgLTU5NTIsMTUgKzY1MjksMTYgQEAKICAgICByZXR1cm4gMjsKIH0KIAotc3RhdGljIHZvaWQgb3BqX2oya19zZXRfY2luZW1hX3BhcmFtZXRlcnMob3BqX2NwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMsIG9wal9pbWFnZV90ICppbWFnZSwgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpCitzdGF0aWMgdm9pZCBvcGpfajJrX3NldF9jaW5lbWFfcGFyYW1ldGVycyhvcGpfY3BhcmFtZXRlcnNfdCAqcGFyYW1ldGVycywKKyAgICAgICAgb3BqX2ltYWdlX3QgKmltYWdlLCBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcikKIHsKICAgICAvKiBDb25maWd1cmUgY2luZW1hIHBhcmFtZXRlcnMgKi8KICAgICBpbnQgaTsKIAogICAgIC8qIE5vIHRpbGluZyAqLwogICAgIHBhcmFtZXRlcnMtPnRpbGVfc2l6ZV9vbiA9IE9QSl9GQUxTRTsKLSAgICBwYXJhbWV0ZXJzLT5jcF90ZHg9MTsKLSAgICBwYXJhbWV0ZXJzLT5jcF90ZHk9MTsKKyAgICBwYXJhbWV0ZXJzLT5jcF90ZHggPSAxOworICAgIHBhcmFtZXRlcnMtPmNwX3RkeSA9IDE7CiAKICAgICAvKiBPbmUgdGlsZSBwYXJ0IGZvciBlYWNoIGNvbXBvbmVudCAqLwogICAgIHBhcmFtZXRlcnMtPnRwX2ZsYWcgPSAnQyc7CkBAIC01OTkwLDQzICs2NTY4LDQ0IEBACiAgICAgcGFyYW1ldGVycy0+aXJyZXZlcnNpYmxlID0gMTsKIAogICAgIC8qIE51bWJlciBvZiBsYXllcnMgKi8KLSAgICBpZiAocGFyYW1ldGVycy0+dGNwX251bWxheWVycyA+IDEpeworICAgIGlmIChwYXJhbWV0ZXJzLT50Y3BfbnVtbGF5ZXJzID4gMSkgewogICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBQcm9maWxlLTMgYW5kIDQgKDJrLzRrIGRjIHByb2ZpbGUpIHJlcXVpcmVzOlxuIgotICAgICAgICAgICAgICAgICIxIHNpbmdsZSBxdWFsaXR5IGxheWVyIgotICAgICAgICAgICAgICAgICItPiBOdW1iZXIgb2YgbGF5ZXJzIGZvcmNlZCB0byAxIChyYXRoZXIgdGhhbiAlZClcbiIKLSAgICAgICAgICAgICAgICAiLT4gUmF0ZSBvZiB0aGUgbGFzdCBsYXllciAoJTMuMWYpIHdpbGwgYmUgdXNlZCIsCi0gICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+dGNwX251bWxheWVycywgcGFyYW1ldGVycy0+dGNwX3JhdGVzW3BhcmFtZXRlcnMtPnRjcF9udW1sYXllcnMtMV0pOwotICAgICAgICBwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbMF0gPSBwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbcGFyYW1ldGVycy0+dGNwX251bWxheWVycy0xXTsKKyAgICAgICAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIFByb2ZpbGUtMyBhbmQgNCAoMmsvNGsgZGMgcHJvZmlsZSkgcmVxdWlyZXM6XG4iCisgICAgICAgICAgICAgICAgICAgICAgIjEgc2luZ2xlIHF1YWxpdHkgbGF5ZXIiCisgICAgICAgICAgICAgICAgICAgICAgIi0+IE51bWJlciBvZiBsYXllcnMgZm9yY2VkIHRvIDEgKHJhdGhlciB0aGFuICVkKVxuIgorICAgICAgICAgICAgICAgICAgICAgICItPiBSYXRlIG9mIHRoZSBsYXN0IGxheWVyICglMy4xZikgd2lsbCBiZSB1c2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT50Y3BfbnVtbGF5ZXJzLAorICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPnRjcF9yYXRlc1twYXJhbWV0ZXJzLT50Y3BfbnVtbGF5ZXJzIC0gMV0pOworICAgICAgICBwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbMF0gPSBwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbcGFyYW1ldGVycy0+dGNwX251bWxheWVycyAtIDFdOwogICAgICAgICBwYXJhbWV0ZXJzLT50Y3BfbnVtbGF5ZXJzID0gMTsKICAgICB9CiAKICAgICAvKiBSZXNvbHV0aW9uIGxldmVscyAqLwotICAgIHN3aXRjaCAocGFyYW1ldGVycy0+cnNpeil7CisgICAgc3dpdGNoIChwYXJhbWV0ZXJzLT5yc2l6KSB7CiAgICAgY2FzZSBPUEpfUFJPRklMRV9DSU5FTUFfMks6Ci0gICAgICAgIGlmKHBhcmFtZXRlcnMtPm51bXJlc29sdXRpb24gPiA2KXsKKyAgICAgICAgaWYgKHBhcmFtZXRlcnMtPm51bXJlc29sdXRpb24gPiA2KSB7CiAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICJKUEVHIDIwMDAgUHJvZmlsZS0zICgyayBkYyBwcm9maWxlKSByZXF1aXJlczpcbiIKLSAgICAgICAgICAgICAgICAgICAgIk51bWJlciBvZiBkZWNvbXBvc2l0aW9uIGxldmVscyA8PSA1XG4iCi0gICAgICAgICAgICAgICAgICAgICItPiBOdW1iZXIgb2YgZGVjb21wb3NpdGlvbiBsZXZlbHMgZm9yY2VkIHRvIDUgKHJhdGhlciB0aGFuICVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbisxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBQcm9maWxlLTMgKDJrIGRjIHByb2ZpbGUpIHJlcXVpcmVzOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiTnVtYmVyIG9mIGRlY29tcG9zaXRpb24gbGV2ZWxzIDw9IDVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+IE51bWJlciBvZiBkZWNvbXBvc2l0aW9uIGxldmVscyBmb3JjZWQgdG8gNSAocmF0aGVyIHRoYW4gJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uICsgMSk7CiAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uID0gNjsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBjYXNlIE9QSl9QUk9GSUxFX0NJTkVNQV80SzoKLSAgICAgICAgaWYocGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbiA8IDIpeworICAgICAgICBpZiAocGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbiA8IDIpIHsKICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBQcm9maWxlLTQgKDRrIGRjIHByb2ZpbGUpIHJlcXVpcmVzOlxuIgotICAgICAgICAgICAgICAgICAgICAiTnVtYmVyIG9mIGRlY29tcG9zaXRpb24gbGV2ZWxzID49IDEgJiYgPD0gNlxuIgotICAgICAgICAgICAgICAgICAgICAiLT4gTnVtYmVyIG9mIGRlY29tcG9zaXRpb24gbGV2ZWxzIGZvcmNlZCB0byAxIChyYXRoZXIgdGhhbiAlZClcbiIsCi0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPm51bXJlc29sdXRpb24rMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICJKUEVHIDIwMDAgUHJvZmlsZS00ICg0ayBkYyBwcm9maWxlKSByZXF1aXJlczpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk51bWJlciBvZiBkZWNvbXBvc2l0aW9uIGxldmVscyA+PSAxICYmIDw9IDZcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+IE51bWJlciBvZiBkZWNvbXBvc2l0aW9uIGxldmVscyBmb3JjZWQgdG8gMSAocmF0aGVyIHRoYW4gJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uICsgMSk7CiAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uID0gMTsKLSAgICAgICAgfWVsc2UgaWYocGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbiA+IDcpeworICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMtPm51bXJlc29sdXRpb24gPiA3KSB7CiAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICJKUEVHIDIwMDAgUHJvZmlsZS00ICg0ayBkYyBwcm9maWxlKSByZXF1aXJlczpcbiIKLSAgICAgICAgICAgICAgICAgICAgIk51bWJlciBvZiBkZWNvbXBvc2l0aW9uIGxldmVscyA+PSAxICYmIDw9IDZcbiIKLSAgICAgICAgICAgICAgICAgICAgIi0+IE51bWJlciBvZiBkZWNvbXBvc2l0aW9uIGxldmVscyBmb3JjZWQgdG8gNiAocmF0aGVyIHRoYW4gJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uKzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIFByb2ZpbGUtNCAoNGsgZGMgcHJvZmlsZSkgcmVxdWlyZXM6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJOdW1iZXIgb2YgZGVjb21wb3NpdGlvbiBsZXZlbHMgPj0gMSAmJiA8PSA2XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICItPiBOdW1iZXIgb2YgZGVjb21wb3NpdGlvbiBsZXZlbHMgZm9yY2VkIHRvIDYgKHJhdGhlciB0aGFuICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbiArIDEpOwogICAgICAgICAgICAgcGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbiA9IDc7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CkBAIC02MDM2LDEwICs2NjE1LDE2IEBACiAKICAgICAvKiBQcmVjaW5jdHMgKi8KICAgICBwYXJhbWV0ZXJzLT5jc3R5IHw9IDB4MDE7Ci0gICAgcGFyYW1ldGVycy0+cmVzX3NwZWMgPSBwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uLTE7Ci0gICAgZm9yIChpID0gMDsgaTxwYXJhbWV0ZXJzLT5yZXNfc3BlYzsgaSsrKSB7Ci0gICAgICAgIHBhcmFtZXRlcnMtPnByY3dfaW5pdFtpXSA9IDI1NjsKLSAgICAgICAgcGFyYW1ldGVycy0+cHJjaF9pbml0W2ldID0gMjU2OworICAgIGlmIChwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uID09IDEpIHsKKyAgICAgICAgcGFyYW1ldGVycy0+cmVzX3NwZWMgPSAxOworICAgICAgICBwYXJhbWV0ZXJzLT5wcmN3X2luaXRbMF0gPSAxMjg7CisgICAgICAgIHBhcmFtZXRlcnMtPnByY2hfaW5pdFswXSA9IDEyODsKKyAgICB9IGVsc2UgeworICAgICAgICBwYXJhbWV0ZXJzLT5yZXNfc3BlYyA9IHBhcmFtZXRlcnMtPm51bXJlc29sdXRpb24gLSAxOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcGFyYW1ldGVycy0+cmVzX3NwZWM7IGkrKykgeworICAgICAgICAgICAgcGFyYW1ldGVycy0+cHJjd19pbml0W2ldID0gMjU2OworICAgICAgICAgICAgcGFyYW1ldGVycy0+cHJjaF9pbml0W2ldID0gMjU2OworICAgICAgICB9CiAgICAgfQogCiAgICAgLyogVGhlIHByb2dyZXNzaW9uIG9yZGVyIHNoYWxsIGJlIENQUkwgKi8KQEAgLTYwNDcsNyArNjYzMiw4IEBACiAKICAgICAvKiBQcm9ncmVzc2lvbiBvcmRlciBjaGFuZ2VzIGZvciA0SywgZGlzYWxsb3dlZCBmb3IgMksgKi8KICAgICBpZiAocGFyYW1ldGVycy0+cnNpeiA9PSBPUEpfUFJPRklMRV9DSU5FTUFfNEspIHsKLSAgICAgICAgcGFyYW1ldGVycy0+bnVtcG9jcyA9IChPUEpfVUlOVDMyKW9wal9qMmtfaW5pdGlhbGlzZV80S19wb2MocGFyYW1ldGVycy0+UE9DLHBhcmFtZXRlcnMtPm51bXJlc29sdXRpb24pOworICAgICAgICBwYXJhbWV0ZXJzLT5udW1wb2NzID0gKE9QSl9VSU5UMzIpb3BqX2oya19pbml0aWFsaXNlXzRLX3BvYyhwYXJhbWV0ZXJzLT5QT0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uKTsKICAgICB9IGVsc2UgewogICAgICAgICBwYXJhbWV0ZXJzLT5udW1wb2NzID0gMDsKICAgICB9CkBAIC02MDg0LDYzICs2NjcwLDY2IEBACiAgICAgICAgIHBhcmFtZXRlcnMtPm1heF9jb21wX3NpemUgPSBPUEpfQ0lORU1BXzI0X0NPTVA7CiAgICAgfQogCi0gICAgcGFyYW1ldGVycy0+dGNwX3JhdGVzWzBdID0gKE9QSl9GTE9BVDMyKSAoaW1hZ2UtPm51bWNvbXBzICogaW1hZ2UtPmNvbXBzWzBdLncgKiBpbWFnZS0+Y29tcHNbMF0uaCAqIGltYWdlLT5jb21wc1swXS5wcmVjKS8KLSAgICAgICAgICAgIChPUEpfRkxPQVQzMikoKChPUEpfVUlOVDMyKXBhcmFtZXRlcnMtPm1heF9jc19zaXplKSAqIDggKiBpbWFnZS0+Y29tcHNbMF0uZHggKiBpbWFnZS0+Y29tcHNbMF0uZHkpOworICAgIHBhcmFtZXRlcnMtPnRjcF9yYXRlc1swXSA9IChPUEpfRkxPQVQzMikoaW1hZ2UtPm51bWNvbXBzICogaW1hZ2UtPmNvbXBzWzBdLncgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLT5jb21wc1swXS5oICogaW1hZ2UtPmNvbXBzWzBdLnByZWMpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0ZMT0FUMzIpKCgoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5tYXhfY3Nfc2l6ZSkgKiA4ICogaW1hZ2UtPmNvbXBzWzBdLmR4ICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLT5jb21wc1swXS5keSk7CiAKIH0KIAotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfaXNfY2luZW1hX2NvbXBsaWFudChvcGpfaW1hZ2VfdCAqaW1hZ2UsIE9QSl9VSU5UMTYgcnNpeiwgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19pc19jaW5lbWFfY29tcGxpYW50KG9wal9pbWFnZV90ICppbWFnZSwgT1BKX1VJTlQxNiByc2l6LAorICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcikKIHsKICAgICBPUEpfVUlOVDMyIGk7CiAKICAgICAvKiBOdW1iZXIgb2YgY29tcG9uZW50cyAqLwotICAgIGlmIChpbWFnZS0+bnVtY29tcHMgIT0gMyl7CisgICAgaWYgKGltYWdlLT5udW1jb21wcyAhPSAzKSB7CiAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKLSAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIFByb2ZpbGUtMyAoMmsgZGMgcHJvZmlsZSkgcmVxdWlyZXM6XG4iCi0gICAgICAgICAgICAgICAgIjMgY29tcG9uZW50cyIKLSAgICAgICAgICAgICAgICAiLT4gTnVtYmVyIG9mIGNvbXBvbmVudHMgb2YgaW5wdXQgaW1hZ2UgKCVkKSBpcyBub3QgY29tcGxpYW50XG4iCi0gICAgICAgICAgICAgICAgIi0+IE5vbi1wcm9maWxlLTMgY29kZXN0cmVhbSB3aWxsIGJlIGdlbmVyYXRlZFxuIiwKLSAgICAgICAgICAgICAgICBpbWFnZS0+bnVtY29tcHMpOworICAgICAgICAgICAgICAgICAgICAgICJKUEVHIDIwMDAgUHJvZmlsZS0zICgyayBkYyBwcm9maWxlKSByZXF1aXJlczpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiMyBjb21wb25lbnRzIgorICAgICAgICAgICAgICAgICAgICAgICItPiBOdW1iZXIgb2YgY29tcG9uZW50cyBvZiBpbnB1dCBpbWFnZSAoJWQpIGlzIG5vdCBjb21wbGlhbnRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiLT4gTm9uLXByb2ZpbGUtMyBjb2Rlc3RyZWFtIHdpbGwgYmUgZ2VuZXJhdGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGltYWdlLT5udW1jb21wcyk7CiAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgfQogCiAgICAgLyogQml0ZGVwdGggKi8KICAgICBmb3IgKGkgPSAwOyBpIDwgaW1hZ2UtPm51bWNvbXBzOyBpKyspIHsKLSAgICAgICAgaWYgKChpbWFnZS0+Y29tcHNbaV0uYnBwICE9IDEyKSB8IChpbWFnZS0+Y29tcHNbaV0uc2duZCkpeworICAgICAgICBpZiAoKGltYWdlLT5jb21wc1tpXS5icHAgIT0gMTIpIHwgKGltYWdlLT5jb21wc1tpXS5zZ25kKSkgewogICAgICAgICAgICAgY2hhciBzaWduZWRfc3RyW10gPSAic2lnbmVkIjsKICAgICAgICAgICAgIGNoYXIgdW5zaWduZWRfc3RyW10gPSAidW5zaWduZWQiOwotICAgICAgICAgICAgY2hhciAqdG1wX3N0ciA9IGltYWdlLT5jb21wc1tpXS5zZ25kP3NpZ25lZF9zdHI6dW5zaWduZWRfc3RyOworICAgICAgICAgICAgY2hhciAqdG1wX3N0ciA9IGltYWdlLT5jb21wc1tpXS5zZ25kID8gc2lnbmVkX3N0ciA6IHVuc2lnbmVkX3N0cjsKICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBQcm9maWxlLTMgKDJrIGRjIHByb2ZpbGUpIHJlcXVpcmVzOlxuIgotICAgICAgICAgICAgICAgICAgICAiUHJlY2lzaW9uIG9mIGVhY2ggY29tcG9uZW50IHNoYWxsIGJlIDEyIGJpdHMgdW5zaWduZWQiCi0gICAgICAgICAgICAgICAgICAgICItPiBBdCBsZWFzdCBjb21wb25lbnQgJWQgb2YgaW5wdXQgaW1hZ2UgKCVkIGJpdHMsICVzKSBpcyBub3QgY29tcGxpYW50XG4iCi0gICAgICAgICAgICAgICAgICAgICItPiBOb24tcHJvZmlsZS0zIGNvZGVzdHJlYW0gd2lsbCBiZSBnZW5lcmF0ZWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIGksaW1hZ2UtPmNvbXBzW2ldLmJwcCwgdG1wX3N0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICJKUEVHIDIwMDAgUHJvZmlsZS0zICgyayBkYyBwcm9maWxlKSByZXF1aXJlczpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZWNpc2lvbiBvZiBlYWNoIGNvbXBvbmVudCBzaGFsbCBiZSAxMiBiaXRzIHVuc2lnbmVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiLT4gQXQgbGVhc3QgY29tcG9uZW50ICVkIG9mIGlucHV0IGltYWdlICglZCBiaXRzLCAlcykgaXMgbm90IGNvbXBsaWFudFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiLT4gTm9uLXByb2ZpbGUtMyBjb2Rlc3RyZWFtIHdpbGwgYmUgZ2VuZXJhdGVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBpbWFnZS0+Y29tcHNbaV0uYnBwLCB0bXBfc3RyKTsKICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvKiBJbWFnZSBzaXplICovCi0gICAgc3dpdGNoIChyc2l6KXsKKyAgICBzd2l0Y2ggKHJzaXopIHsKICAgICBjYXNlIE9QSl9QUk9GSUxFX0NJTkVNQV8ySzoKLSAgICAgICAgaWYgKCgoaW1hZ2UtPmNvbXBzWzBdLncgPiAyMDQ4KSB8IChpbWFnZS0+Y29tcHNbMF0uaCA+IDEwODApKSl7CisgICAgICAgIGlmICgoKGltYWdlLT5jb21wc1swXS53ID4gMjA0OCkgfCAoaW1hZ2UtPmNvbXBzWzBdLmggPiAxMDgwKSkpIHsKICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBQcm9maWxlLTMgKDJrIGRjIHByb2ZpbGUpIHJlcXVpcmVzOlxuIgotICAgICAgICAgICAgICAgICAgICAid2lkdGggPD0gMjA0OCBhbmQgaGVpZ2h0IDw9IDEwODBcbiIKLSAgICAgICAgICAgICAgICAgICAgIi0+IElucHV0IGltYWdlIHNpemUgJWQgeCAlZCBpcyBub3QgY29tcGxpYW50XG4iCi0gICAgICAgICAgICAgICAgICAgICItPiBOb24tcHJvZmlsZS0zIGNvZGVzdHJlYW0gd2lsbCBiZSBnZW5lcmF0ZWRcbiIsCi0gICAgICAgICAgICAgICAgICAgIGltYWdlLT5jb21wc1swXS53LGltYWdlLT5jb21wc1swXS5oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBQcm9maWxlLTMgKDJrIGRjIHByb2ZpbGUpIHJlcXVpcmVzOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAid2lkdGggPD0gMjA0OCBhbmQgaGVpZ2h0IDw9IDEwODBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+IElucHV0IGltYWdlIHNpemUgJWQgeCAlZCBpcyBub3QgY29tcGxpYW50XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICItPiBOb24tcHJvZmlsZS0zIGNvZGVzdHJlYW0gd2lsbCBiZSBnZW5lcmF0ZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLT5jb21wc1swXS53LCBpbWFnZS0+Y29tcHNbMF0uaCk7CiAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgT1BKX1BST0ZJTEVfQ0lORU1BXzRLOgotICAgICAgICBpZiAoKChpbWFnZS0+Y29tcHNbMF0udyA+IDQwOTYpIHwgKGltYWdlLT5jb21wc1swXS5oID4gMjE2MCkpKXsKKyAgICAgICAgaWYgKCgoaW1hZ2UtPmNvbXBzWzBdLncgPiA0MDk2KSB8IChpbWFnZS0+Y29tcHNbMF0uaCA+IDIxNjApKSkgewogICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIFByb2ZpbGUtNCAoNGsgZGMgcHJvZmlsZSkgcmVxdWlyZXM6XG4iCi0gICAgICAgICAgICAgICAgICAgICJ3aWR0aCA8PSA0MDk2IGFuZCBoZWlnaHQgPD0gMjE2MFxuIgotICAgICAgICAgICAgICAgICAgICAiLT4gSW1hZ2Ugc2l6ZSAlZCB4ICVkIGlzIG5vdCBjb21wbGlhbnRcbiIKLSAgICAgICAgICAgICAgICAgICAgIi0+IE5vbi1wcm9maWxlLTQgY29kZXN0cmVhbSB3aWxsIGJlIGdlbmVyYXRlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPmNvbXBzWzBdLncsaW1hZ2UtPmNvbXBzWzBdLmgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIFByb2ZpbGUtNCAoNGsgZGMgcHJvZmlsZSkgcmVxdWlyZXM6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aWR0aCA8PSA0MDk2IGFuZCBoZWlnaHQgPD0gMjE2MFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiLT4gSW1hZ2Ugc2l6ZSAlZCB4ICVkIGlzIG5vdCBjb21wbGlhbnRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIi0+IE5vbi1wcm9maWxlLTQgY29kZXN0cmVhbSB3aWxsIGJlIGdlbmVyYXRlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPmNvbXBzWzBdLncsIGltYWdlLT5jb21wc1swXS5oKTsKICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CkBAIC02MTUxLDU3MyArNjc0MCw3MjAgQEAKICAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLU9QSl9CT09MIG9wal9qMmtfc2V0dXBfZW5jb2RlciggICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKmltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKK09QSl9CT09MIG9wal9qMmtfc2V0dXBfZW5jb2RlcihvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jcGFyYW1ldGVyc190ICpwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90ICppbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCiB7Ci0gICAgICAgIE9QSl9VSU5UMzIgaSwgaiwgdGlsZW5vLCBudW1wb2NzX3RpbGU7Ci0gICAgICAgIG9wal9jcF90ICpjcCA9IDAwOworICAgIE9QSl9VSU5UMzIgaSwgaiwgdGlsZW5vLCBudW1wb2NzX3RpbGU7CisgICAgb3BqX2NwX3QgKmNwID0gMDA7CisgICAgT1BKX1VJTlQzMiBjYmxrdywgY2Jsa2g7CiAKLSAgICAgICAgaWYoIXBfajJrIHx8ICFwYXJhbWV0ZXJzIHx8ICEgaW1hZ2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIGlmICghcF9qMmsgfHwgIXBhcmFtZXRlcnMgfHwgISBpbWFnZSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIGlmICgocGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbiA8PSAwKSB8fAorICAgICAgICAgICAgKHBhcmFtZXRlcnMtPm51bXJlc29sdXRpb24gPiBPUEpfSjJLX01BWFJMVkxTKSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG51bWJlciBvZiByZXNvbHV0aW9ucyA6ICVkIG5vdCBpbiByYW5nZSBbMSwlZF1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbiwgT1BKX0oyS19NQVhSTFZMUyk7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHBhcmFtZXRlcnMtPmNibG9ja3dfaW5pdCA8IDQgfHwgcGFyYW1ldGVycy0+Y2Jsb2Nrd19pbml0ID4gMTAyNCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBjYmxvY2t3X2luaXQ6ICVkIG5vdCBhIHBvd2VyIG9mIDIgaW4gcmFuZ2UgWzQsMTAyNF1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+Y2Jsb2Nrd19pbml0KTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgaWYgKHBhcmFtZXRlcnMtPmNibG9ja2hfaW5pdCA8IDQgfHwgcGFyYW1ldGVycy0+Y2Jsb2NraF9pbml0ID4gMTAyNCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBjYmxvY2toX2luaXQ6ICVkIG5vdCBhIHBvd2VyIG9mIDIgbm90IGluIHJhbmdlIFs0LDEwMjRdXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPmNibG9ja2hfaW5pdCk7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGlmIChwYXJhbWV0ZXJzLT5jYmxvY2t3X2luaXQgKiBwYXJhbWV0ZXJzLT5jYmxvY2toX2luaXQgPiA0MDk2KSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdmFsdWUgZm9yIGNibG9ja3dfaW5pdCAqIGNibG9ja2hfaW5pdDogc2hvdWxkIGJlIDw9IDQwOTZcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICBjYmxrdyA9IChPUEpfVUlOVDMyKW9wal9pbnRfZmxvb3Jsb2cyKHBhcmFtZXRlcnMtPmNibG9ja3dfaW5pdCk7CisgICAgY2Jsa2ggPSAoT1BKX1VJTlQzMilvcGpfaW50X2Zsb29ybG9nMihwYXJhbWV0ZXJzLT5jYmxvY2toX2luaXQpOworICAgIGlmIChwYXJhbWV0ZXJzLT5jYmxvY2t3X2luaXQgIT0gKDEgPDwgY2Jsa3cpKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdmFsdWUgZm9yIGNibG9ja3dfaW5pdDogJWQgbm90IGEgcG93ZXIgb2YgMiBpbiByYW5nZSBbNCwxMDI0XVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5jYmxvY2t3X2luaXQpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICBpZiAocGFyYW1ldGVycy0+Y2Jsb2NraF9pbml0ICE9ICgxIDw8IGNibGtoKSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBjYmxvY2t3X2luaXQ6ICVkIG5vdCBhIHBvd2VyIG9mIDIgaW4gcmFuZ2UgWzQsMTAyNF1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+Y2Jsb2NraF9pbml0KTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICAvKiBrZWVwIGEgbGluayB0byBjcCBzbyB0aGF0IHdlIGNhbiBkZXN0cm95IGl0IGxhdGVyIGluIGoya19kZXN0cm95X2NvbXByZXNzICovCisgICAgY3AgPSAmKHBfajJrLT5tX2NwKTsKKworICAgIC8qIHNldCBkZWZhdWx0IHZhbHVlcyBmb3IgY3AgKi8KKyAgICBjcC0+dHcgPSAxOworICAgIGNwLT50aCA9IDE7CisKKyAgICAvKiBGSVhNRSBBREU6IHRvIGJlIHJlbW92ZWQgb25jZSBkZXByZWNhdGVkIGNwX2NpbmVtYSBhbmQgY3BfcnNpeiBoYXZlIGJlZW4gcmVtb3ZlZCAqLworICAgIGlmIChwYXJhbWV0ZXJzLT5yc2l6ID09CisgICAgICAgICAgICBPUEpfUFJPRklMRV9OT05FKSB7IC8qIGNvbnNpZGVyIGRlcHJlY2F0ZWQgZmllbGRzIG9ubHkgaWYgUlNJWiBoYXMgbm90IGJlZW4gc2V0ICovCisgICAgICAgIE9QSl9CT09MIGRlcHJlY2F0ZWRfdXNlZCA9IE9QSl9GQUxTRTsKKyAgICAgICAgc3dpdGNoIChwYXJhbWV0ZXJzLT5jcF9jaW5lbWEpIHsKKyAgICAgICAgY2FzZSBPUEpfQ0lORU1BMktfMjQ6CisgICAgICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfQ0lORU1BXzJLOworICAgICAgICAgICAgcGFyYW1ldGVycy0+bWF4X2NzX3NpemUgPSBPUEpfQ0lORU1BXzI0X0NTOworICAgICAgICAgICAgcGFyYW1ldGVycy0+bWF4X2NvbXBfc2l6ZSA9IE9QSl9DSU5FTUFfMjRfQ09NUDsKKyAgICAgICAgICAgIGRlcHJlY2F0ZWRfdXNlZCA9IE9QSl9UUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BKX0NJTkVNQTJLXzQ4OgorICAgICAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9IE9QSl9QUk9GSUxFX0NJTkVNQV8ySzsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMtPm1heF9jc19zaXplID0gT1BKX0NJTkVNQV80OF9DUzsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMtPm1heF9jb21wX3NpemUgPSBPUEpfQ0lORU1BXzQ4X0NPTVA7CisgICAgICAgICAgICBkZXByZWNhdGVkX3VzZWQgPSBPUEpfVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9QSl9DSU5FTUE0S18yNDoKKyAgICAgICAgICAgIHBhcmFtZXRlcnMtPnJzaXogPSBPUEpfUFJPRklMRV9DSU5FTUFfNEs7CisgICAgICAgICAgICBwYXJhbWV0ZXJzLT5tYXhfY3Nfc2l6ZSA9IE9QSl9DSU5FTUFfMjRfQ1M7CisgICAgICAgICAgICBwYXJhbWV0ZXJzLT5tYXhfY29tcF9zaXplID0gT1BKX0NJTkVNQV8yNF9DT01QOworICAgICAgICAgICAgZGVwcmVjYXRlZF91c2VkID0gT1BKX1RSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPUEpfT0ZGOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChwYXJhbWV0ZXJzLT5jcF9yc2l6KSB7CisgICAgICAgIGNhc2UgT1BKX0NJTkVNQTJLOgorICAgICAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9IE9QSl9QUk9GSUxFX0NJTkVNQV8ySzsKKyAgICAgICAgICAgIGRlcHJlY2F0ZWRfdXNlZCA9IE9QSl9UUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BKX0NJTkVNQTRLOgorICAgICAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9IE9QSl9QUk9GSUxFX0NJTkVNQV80SzsKKyAgICAgICAgICAgIGRlcHJlY2F0ZWRfdXNlZCA9IE9QSl9UUlVFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT1BKX01DVDoKKyAgICAgICAgICAgIHBhcmFtZXRlcnMtPnJzaXogPSBPUEpfUFJPRklMRV9QQVJUMiB8IE9QSl9FWFRFTlNJT05fTUNUOworICAgICAgICAgICAgZGVwcmVjYXRlZF91c2VkID0gT1BKX1RSVUU7CisgICAgICAgIGNhc2UgT1BKX1NURF9SU0laOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlcHJlY2F0ZWRfdXNlZCkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRGVwcmVjYXRlZCBmaWVsZHMgY3BfY2luZW1hIG9yIGNwX3JzaXogYXJlIHVzZWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSBjb25zaWRlciB1c2luZyBvbmx5IHRoZSByc2l6IGZpZWxkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJTZWUgb3BlbmpwZWcuaCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHNcbiIpOworICAgICAgICB9CisgICAgfQogCi0gICAgICAgIGlmICgocGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbiA8PSAwKSB8fCAocGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbiA+IE9QSl9KMktfTUFYUkxWTFMpKSB7Ci0gICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSW52YWxpZCBudW1iZXIgb2YgcmVzb2x1dGlvbnMgOiAlZCBub3QgaW4gcmFuZ2UgWzEsJWRdXG4iLCBwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uLCBPUEpfSjJLX01BWFJMVkxTKTsKKyAgICAvKiBJZiBubyBleHBsaWNpdCBsYXllcnMgYXJlIHByb3ZpZGVkLCB1c2UgbG9zc2xlc3Mgc2V0dGluZ3MgKi8KKyAgICBpZiAocGFyYW1ldGVycy0+dGNwX251bWxheWVycyA9PSAwKSB7CisgICAgICAgIHBhcmFtZXRlcnMtPnRjcF9udW1sYXllcnMgPSAxOworICAgICAgICBwYXJhbWV0ZXJzLT5jcF9kaXN0b19hbGxvYyA9IDE7CisgICAgICAgIHBhcmFtZXRlcnMtPnRjcF9yYXRlc1swXSA9IDA7CisgICAgfQorCisgICAgaWYgKHBhcmFtZXRlcnMtPmNwX2Rpc3RvX2FsbG9jKSB7CisgICAgICAgIC8qIEVtaXQgd2FybmluZ3MgaWYgdGNwX3JhdGVzIGFyZSBub3QgZGVjcmVhc2luZyAqLworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgKE9QSl9VSU5UMzIpIHBhcmFtZXRlcnMtPnRjcF9udW1sYXllcnM7IGkrKykgeworICAgICAgICAgICAgT1BKX0ZMT0FUMzIgcmF0ZV9pX2NvcnIgPSBwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbaV07CisgICAgICAgICAgICBPUEpfRkxPQVQzMiByYXRlX2lfbV8xX2NvcnIgPSBwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbaSAtIDFdOworICAgICAgICAgICAgaWYgKHJhdGVfaV9jb3JyIDw9IDEuMCkgeworICAgICAgICAgICAgICAgIHJhdGVfaV9jb3JyID0gMS4wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJhdGVfaV9tXzFfY29yciA8PSAxLjApIHsKKyAgICAgICAgICAgICAgICByYXRlX2lfbV8xX2NvcnIgPSAxLjA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmF0ZV9pX2NvcnIgPj0gcmF0ZV9pX21fMV9jb3JyKSB7CisgICAgICAgICAgICAgICAgaWYgKHJhdGVfaV9jb3JyICE9IHBhcmFtZXRlcnMtPnRjcF9yYXRlc1tpXSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZV9pX21fMV9jb3JyICE9IHBhcmFtZXRlcnMtPnRjcF9yYXRlc1tpIC0gMV0pIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0Y3BfcmF0ZXNbJWRdPSVmIChjb3JyZWN0ZWQgYXMgJWYpIHNob3VsZCBiZSBzdHJpY3RseSBsZXNzZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGFuIHRjcF9yYXRlc1slZF09JWYgKGNvcnJlY3RlZCBhcyAlZilcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgcGFyYW1ldGVycy0+dGNwX3JhdGVzW2ldLCByYXRlX2lfY29yciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpIC0gMSwgcGFyYW1ldGVycy0+dGNwX3JhdGVzW2kgLSAxXSwgcmF0ZV9pX21fMV9jb3JyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJhdGVfaV9jb3JyICE9IHBhcmFtZXRlcnMtPnRjcF9yYXRlc1tpXSkgeworICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRjcF9yYXRlc1slZF09JWYgKGNvcnJlY3RlZCBhcyAlZikgc2hvdWxkIGJlIHN0cmljdGx5IGxlc3NlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoYW4gdGNwX3JhdGVzWyVkXT0lZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbaV0sIHJhdGVfaV9jb3JyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgLSAxLCBwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbaSAtIDFdKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJhdGVfaV9tXzFfY29yciAhPSBwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbaSAtIDFdKSB7CisgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGNwX3JhdGVzWyVkXT0lZiBzaG91bGQgYmUgc3RyaWN0bHkgbGVzc2VyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhhbiB0Y3BfcmF0ZXNbJWRdPSVmIChjb3JyZWN0ZWQgYXMgJWYpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHBhcmFtZXRlcnMtPnRjcF9yYXRlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpIC0gMSwgcGFyYW1ldGVycy0+dGNwX3JhdGVzW2kgLSAxXSwgcmF0ZV9pX21fMV9jb3JyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRjcF9yYXRlc1slZF09JWYgc2hvdWxkIGJlIHN0cmljdGx5IGxlc3NlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoYW4gdGNwX3JhdGVzWyVkXT0lZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSAtIDEsIHBhcmFtZXRlcnMtPnRjcF9yYXRlc1tpIC0gMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAocGFyYW1ldGVycy0+Y3BfZml4ZWRfcXVhbGl0eSkgeworICAgICAgICAvKiBFbWl0IHdhcm5pbmdzIGlmIHRjcF9kaXN0b3JhdGlvIGFyZSBub3QgaW5jcmVhc2luZyAqLworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgKE9QSl9VSU5UMzIpIHBhcmFtZXRlcnMtPnRjcF9udW1sYXllcnM7IGkrKykgeworICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMtPnRjcF9kaXN0b3JhdGlvW2ldIDwgcGFyYW1ldGVycy0+dGNwX2Rpc3RvcmF0aW9baSAtIDFdICYmCisgICAgICAgICAgICAgICAgICAgICEoaSA9PSAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT50Y3BfbnVtbGF5ZXJzIC0gMSAmJgorICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPnRjcF9kaXN0b3JhdGlvW2ldID09IDApKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRjcF9kaXN0b3JhdGlvWyVkXT0lZiBzaG91bGQgYmUgc3RyaWN0bHkgZ3JlYXRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhhbiB0Y3BfZGlzdG9yYXRpb1slZF09JWZcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBwYXJhbWV0ZXJzLT50Y3BfZGlzdG9yYXRpb1tpXSwgaSAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT50Y3BfZGlzdG9yYXRpb1tpIC0gMV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogc2VlIGlmIG1heF9jb2Rlc3RyZWFtX3NpemUgZG9lcyBsaW1pdCBpbnB1dCByYXRlICovCisgICAgaWYgKHBhcmFtZXRlcnMtPm1heF9jc19zaXplIDw9IDApIHsKKyAgICAgICAgaWYgKHBhcmFtZXRlcnMtPnRjcF9yYXRlc1twYXJhbWV0ZXJzLT50Y3BfbnVtbGF5ZXJzIC0gMV0gPiAwKSB7CisgICAgICAgICAgICBPUEpfRkxPQVQzMiB0ZW1wX3NpemU7CisgICAgICAgICAgICB0ZW1wX3NpemUgPSAoT1BKX0ZMT0FUMzIpKCgoZG91YmxlKWltYWdlLT5udW1jb21wcyAqIGltYWdlLT5jb21wc1swXS53ICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLT5jb21wc1swXS5oICogaW1hZ2UtPmNvbXBzWzBdLnByZWMpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChkb3VibGUpcGFyYW1ldGVycy0+dGNwX3JhdGVzW3BhcmFtZXRlcnMtPnRjcF9udW1sYXllcnMgLSAxXSAqIDggKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPmNvbXBzWzBdLmR4ICogaW1hZ2UtPmNvbXBzWzBdLmR5KSk7CisgICAgICAgICAgICBpZiAodGVtcF9zaXplID4gSU5UX01BWCkgeworICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPm1heF9jc19zaXplID0gSU5UX01BWDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+bWF4X2NzX3NpemUgPSAoaW50KSBmbG9vcih0ZW1wX3NpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGFyYW1ldGVycy0+bWF4X2NzX3NpemUgPSAwOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgT1BKX0ZMT0FUMzIgdGVtcF9yYXRlOworICAgICAgICBPUEpfQk9PTCBjYXAgPSBPUEpfRkFMU0U7CisgICAgICAgIHRlbXBfcmF0ZSA9IChPUEpfRkxPQVQzMikoKChkb3VibGUpaW1hZ2UtPm51bWNvbXBzICogaW1hZ2UtPmNvbXBzWzBdLncgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS0+Y29tcHNbMF0uaCAqIGltYWdlLT5jb21wc1swXS5wcmVjKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoZG91YmxlKXBhcmFtZXRlcnMtPm1heF9jc19zaXplKSAqIDggKiBpbWFnZS0+Y29tcHNbMF0uZHggKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS0+Y29tcHNbMF0uZHkpKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IChPUEpfVUlOVDMyKSBwYXJhbWV0ZXJzLT50Y3BfbnVtbGF5ZXJzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbaV0gPCB0ZW1wX3JhdGUpIHsKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbaV0gPSB0ZW1wX3JhdGU7CisgICAgICAgICAgICAgICAgY2FwID0gT1BKX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNhcCkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIGRlc2lyZWQgbWF4aW11bSBjb2Rlc3RyZWFtIHNpemUgaGFzIGxpbWl0ZWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImF0IGxlYXN0IG9uZSBvZiB0aGUgZGVzaXJlZCBxdWFsaXR5IGxheWVyc1xuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBNYW5hZ2UgcHJvZmlsZXMgYW5kIGFwcGxpY2F0aW9ucyBhbmQgc2V0IFJTSVogKi8KKyAgICAvKiBzZXQgY2luZW1hIHBhcmFtZXRlcnMgaWYgcmVxdWlyZWQgKi8KKyAgICBpZiAoT1BKX0lTX0NJTkVNQShwYXJhbWV0ZXJzLT5yc2l6KSkgeworICAgICAgICBpZiAoKHBhcmFtZXRlcnMtPnJzaXogPT0gT1BKX1BST0ZJTEVfQ0lORU1BX1MySykKKyAgICAgICAgICAgICAgICB8fCAocGFyYW1ldGVycy0+cnNpeiA9PSBPUEpfUFJPRklMRV9DSU5FTUFfUzRLKSkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIFNjYWxhYmxlIERpZ2l0YWwgQ2luZW1hIHByb2ZpbGVzIG5vdCB5ZXQgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMtPnJzaXogPSBPUEpfUFJPRklMRV9OT05FOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3BqX2oya19zZXRfY2luZW1hX3BhcmFtZXRlcnMocGFyYW1ldGVycywgaW1hZ2UsIHBfbWFuYWdlcik7CisgICAgICAgICAgICBpZiAoIW9wal9qMmtfaXNfY2luZW1hX2NvbXBsaWFudChpbWFnZSwgcGFyYW1ldGVycy0+cnNpeiwgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPnJzaXogPSBPUEpfUFJPRklMRV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChPUEpfSVNfU1RPUkFHRShwYXJhbWV0ZXJzLT5yc2l6KSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBMb25nIFRlcm0gU3RvcmFnZSBwcm9maWxlIG5vdCB5ZXQgc3VwcG9ydGVkXG4iKTsKKyAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9IE9QSl9QUk9GSUxFX05PTkU7CisgICAgfSBlbHNlIGlmIChPUEpfSVNfQlJPQURDQVNUKHBhcmFtZXRlcnMtPnJzaXopKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIEJyb2FkY2FzdCBwcm9maWxlcyBub3QgeWV0IHN1cHBvcnRlZFxuIik7CisgICAgICAgIHBhcmFtZXRlcnMtPnJzaXogPSBPUEpfUFJPRklMRV9OT05FOworICAgIH0gZWxzZSBpZiAoT1BKX0lTX0lNRihwYXJhbWV0ZXJzLT5yc2l6KSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBJTUYgcHJvZmlsZXMgbm90IHlldCBzdXBwb3J0ZWRcbiIpOworICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfTk9ORTsKKyAgICB9IGVsc2UgaWYgKE9QSl9JU19QQVJUMihwYXJhbWV0ZXJzLT5yc2l6KSkgeworICAgICAgICBpZiAocGFyYW1ldGVycy0+cnNpeiA9PSAoKE9QSl9QUk9GSUxFX1BBUlQyKSB8IChPUEpfRVhURU5TSU9OX05PTkUpKSkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIFBhcnQtMiBwcm9maWxlIGRlZmluZWRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCBubyBQYXJ0LTIgZXh0ZW5zaW9uIGVuYWJsZWQuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9maWxlIHNldCB0byBOT05FLlxuIik7CisgICAgICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfTk9ORTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXJhbWV0ZXJzLT5yc2l6ICE9ICgoT1BKX1BST0ZJTEVfUEFSVDIpIHwgKE9QSl9FWFRFTlNJT05fTUNUKSkpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIFBhcnQtMiBleHRlbnNpb24gZW5hYmxlZFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvZmlsZSBzZXQgdG8gTk9ORS5cbiIpOworICAgICAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9IE9QSl9QUk9GSUxFX05PTkU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgIGNvcHkgdXNlciBlbmNvZGluZyBwYXJhbWV0ZXJzCisgICAgKi8KKyAgICBjcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX21heF9jb21wX3NpemUgPSAoT1BKX1VJTlQzMikKKyAgICAgICAgICAgIHBhcmFtZXRlcnMtPm1heF9jb21wX3NpemU7CisgICAgY3AtPnJzaXogPSBwYXJhbWV0ZXJzLT5yc2l6OworICAgIGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fZGlzdG9fYWxsb2MgPSAoT1BKX1VJTlQzMikKKyAgICAgICAgICAgIHBhcmFtZXRlcnMtPmNwX2Rpc3RvX2FsbG9jICYgMXU7CisgICAgY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9maXhlZF9hbGxvYyA9IChPUEpfVUlOVDMyKQorICAgICAgICAgICAgcGFyYW1ldGVycy0+Y3BfZml4ZWRfYWxsb2MgJiAxdTsKKyAgICBjcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX2ZpeGVkX3F1YWxpdHkgPSAoT1BKX1VJTlQzMikKKyAgICAgICAgICAgIHBhcmFtZXRlcnMtPmNwX2ZpeGVkX3F1YWxpdHkgJiAxdTsKKworICAgIC8qIG1vZCBmaXhlZF9xdWFsaXR5ICovCisgICAgaWYgKHBhcmFtZXRlcnMtPmNwX2ZpeGVkX2FsbG9jICYmIHBhcmFtZXRlcnMtPmNwX21hdHJpY2UpIHsKKyAgICAgICAgc2l6ZV90IGFycmF5X3NpemUgPSAoc2l6ZV90KXBhcmFtZXRlcnMtPnRjcF9udW1sYXllcnMgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpcGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbiAqIDMgKiBzaXplb2YoT1BKX0lOVDMyKTsKKyAgICAgICAgY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9tYXRyaWNlID0gKE9QSl9JTlQzMiAqKSBvcGpfbWFsbG9jKGFycmF5X3NpemUpOworICAgICAgICBpZiAoIWNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fbWF0cmljZSkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIGNvcHkgb2YgdXNlciBlbmNvZGluZyBwYXJhbWV0ZXJzIG1hdHJpeCBcbiIpOwogICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQorICAgICAgICBtZW1jcHkoY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9tYXRyaWNlLCBwYXJhbWV0ZXJzLT5jcF9tYXRyaWNlLAorICAgICAgICAgICAgICAgYXJyYXlfc2l6ZSk7CisgICAgfQogCi0gICAgICAgIC8qIGtlZXAgYSBsaW5rIHRvIGNwIHNvIHRoYXQgd2UgY2FuIGRlc3Ryb3kgaXQgbGF0ZXIgaW4gajJrX2Rlc3Ryb3lfY29tcHJlc3MgKi8KLSAgICAgICAgY3AgPSAmKHBfajJrLT5tX2NwKTsKKyAgICAvKiB0aWxlcyAqLworICAgIGNwLT50ZHggPSAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5jcF90ZHg7CisgICAgY3AtPnRkeSA9IChPUEpfVUlOVDMyKXBhcmFtZXRlcnMtPmNwX3RkeTsKIAotICAgICAgICAvKiBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yIGNwICovCi0gICAgICAgIGNwLT50dyA9IDE7Ci0gICAgICAgIGNwLT50aCA9IDE7CisgICAgLyogdGlsZSBvZmZzZXQgKi8KKyAgICBjcC0+dHgwID0gKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+Y3BfdHgwOworICAgIGNwLT50eTAgPSAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5jcF90eTA7CiAKLSAgICAgICAgLyogRklYTUUgQURFOiB0byBiZSByZW1vdmVkIG9uY2UgZGVwcmVjYXRlZCBjcF9jaW5lbWEgYW5kIGNwX3JzaXogaGF2ZSBiZWVuIHJlbW92ZWQgKi8KLSAgICAgICAgaWYgKHBhcmFtZXRlcnMtPnJzaXogPT0gT1BKX1BST0ZJTEVfTk9ORSkgeyAvKiBjb25zaWRlciBkZXByZWNhdGVkIGZpZWxkcyBvbmx5IGlmIFJTSVogaGFzIG5vdCBiZWVuIHNldCAqLwotICAgICAgICAgICAgT1BKX0JPT0wgZGVwcmVjYXRlZF91c2VkID0gT1BKX0ZBTFNFOwotICAgICAgICAgICAgc3dpdGNoIChwYXJhbWV0ZXJzLT5jcF9jaW5lbWEpewotICAgICAgICAgICAgY2FzZSBPUEpfQ0lORU1BMktfMjQ6Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9IE9QSl9QUk9GSUxFX0NJTkVNQV8ySzsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5tYXhfY3Nfc2l6ZSA9IE9QSl9DSU5FTUFfMjRfQ1M7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+bWF4X2NvbXBfc2l6ZSA9IE9QSl9DSU5FTUFfMjRfQ09NUDsKLSAgICAgICAgICAgICAgICBkZXByZWNhdGVkX3VzZWQgPSBPUEpfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT1BKX0NJTkVNQTJLXzQ4OgotICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPnJzaXogPSBPUEpfUFJPRklMRV9DSU5FTUFfMks7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+bWF4X2NzX3NpemUgPSBPUEpfQ0lORU1BXzQ4X0NTOwotICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPm1heF9jb21wX3NpemUgPSBPUEpfQ0lORU1BXzQ4X0NPTVA7Ci0gICAgICAgICAgICAgICAgZGVwcmVjYXRlZF91c2VkID0gT1BKX1RSVUU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE9QSl9DSU5FTUE0S18yNDoKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfQ0lORU1BXzRLOwotICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPm1heF9jc19zaXplID0gT1BKX0NJTkVNQV8yNF9DUzsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5tYXhfY29tcF9zaXplID0gT1BKX0NJTkVNQV8yNF9DT01QOwotICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWRfdXNlZCA9IE9QSl9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPUEpfT0ZGOgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAocGFyYW1ldGVycy0+Y3BfcnNpeil7Ci0gICAgICAgICAgICBjYXNlIE9QSl9DSU5FTUEySzoKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfQ0lORU1BXzJLOwotICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWRfdXNlZCA9IE9QSl9UUlVFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBPUEpfQ0lORU1BNEs6Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9IE9QSl9QUk9GSUxFX0NJTkVNQV80SzsKLSAgICAgICAgICAgICAgICBkZXByZWNhdGVkX3VzZWQgPSBPUEpfVFJVRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgT1BKX01DVDoKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfUEFSVDIgfCBPUEpfRVhURU5TSU9OX01DVDsKLSAgICAgICAgICAgICAgICBkZXByZWNhdGVkX3VzZWQgPSBPUEpfVFJVRTsKLSAgICAgICAgICAgIGNhc2UgT1BKX1NURF9SU0laOgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZXByZWNhdGVkX3VzZWQpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiRGVwcmVjYXRlZCBmaWVsZHMgY3BfY2luZW1hIG9yIGNwX3JzaXogYXJlIHVzZWRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2UgY29uc2lkZXIgdXNpbmcgb25seSB0aGUgcnNpeiBmaWVsZFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgIlNlZSBvcGVuanBlZy5oIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlsc1xuIik7Ci0gICAgICAgICAgICB9CisgICAgLyogY29tbWVudCBzdHJpbmcgKi8KKyAgICBpZiAocGFyYW1ldGVycy0+Y3BfY29tbWVudCkgeworICAgICAgICBjcC0+Y29tbWVudCA9IChjaGFyKilvcGpfbWFsbG9jKHN0cmxlbihwYXJhbWV0ZXJzLT5jcF9jb21tZW50KSArIDFVKTsKKyAgICAgICAgaWYgKCFjcC0+Y29tbWVudCkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIGNvcHkgb2YgY29tbWVudCBzdHJpbmdcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQorICAgICAgICBzdHJjcHkoY3AtPmNvbW1lbnQsIHBhcmFtZXRlcnMtPmNwX2NvbW1lbnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIENyZWF0ZSBkZWZhdWx0IGNvbW1lbnQgZm9yIGNvZGVzdHJlYW0gKi8KKyAgICAgICAgY29uc3QgY2hhciBjb21tZW50W10gPSAiQ3JlYXRlZCBieSBPcGVuSlBFRyB2ZXJzaW9uICI7CisgICAgICAgIGNvbnN0IHNpemVfdCBjbGVuID0gc3RybGVuKGNvbW1lbnQpOworICAgICAgICBjb25zdCBjaGFyICp2ZXJzaW9uID0gb3BqX3ZlcnNpb24oKTsKIAotICAgICAgICAvKiBzZWUgaWYgbWF4X2NvZGVzdHJlYW1fc2l6ZSBkb2VzIGxpbWl0IGlucHV0IHJhdGUgKi8KLSAgICAgICAgaWYgKHBhcmFtZXRlcnMtPm1heF9jc19zaXplIDw9IDApIHsKLSAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbcGFyYW1ldGVycy0+dGNwX251bWxheWVycy0xXSA+IDApIHsKLSAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiB0ZW1wX3NpemU7Ci0gICAgICAgICAgICAgICAgdGVtcF9zaXplID0oT1BKX0ZMT0FUMzIpKGltYWdlLT5udW1jb21wcyAqIGltYWdlLT5jb21wc1swXS53ICogaW1hZ2UtPmNvbXBzWzBdLmggKiBpbWFnZS0+Y29tcHNbMF0ucHJlYykvCi0gICAgICAgICAgICAgICAgICAgICAgICAocGFyYW1ldGVycy0+dGNwX3JhdGVzW3BhcmFtZXRlcnMtPnRjcF9udW1sYXllcnMtMV0gKiA4ICogKE9QSl9GTE9BVDMyKWltYWdlLT5jb21wc1swXS5keCAqIChPUEpfRkxPQVQzMilpbWFnZS0+Y29tcHNbMF0uZHkpOwotICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPm1heF9jc19zaXplID0gKGludCkgZmxvb3IodGVtcF9zaXplKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+bWF4X2NzX3NpemUgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgT1BKX0ZMT0FUMzIgdGVtcF9yYXRlOwotICAgICAgICAgICAgT1BKX0JPT0wgY2FwID0gT1BKX0ZBTFNFOwotICAgICAgICAgICAgdGVtcF9yYXRlID0gKE9QSl9GTE9BVDMyKSAoaW1hZ2UtPm51bWNvbXBzICogaW1hZ2UtPmNvbXBzWzBdLncgKiBpbWFnZS0+Y29tcHNbMF0uaCAqIGltYWdlLT5jb21wc1swXS5wcmVjKS8KLSAgICAgICAgICAgICAgICAgICAgKE9QSl9GTE9BVDMyKSgoKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+bWF4X2NzX3NpemUpICogOCAqIGltYWdlLT5jb21wc1swXS5keCAqIGltYWdlLT5jb21wc1swXS5keSk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKE9QSl9VSU5UMzIpIHBhcmFtZXRlcnMtPnRjcF9udW1sYXllcnM7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLT50Y3BfcmF0ZXNbaV0gPCB0ZW1wX3JhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+dGNwX3JhdGVzW2ldID0gdGVtcF9yYXRlOwotICAgICAgICAgICAgICAgICAgICBjYXAgPSBPUEpfVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2FwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBkZXNpcmVkIG1heGltdW0gY29kZXN0cmVhbSBzaXplIGhhcyBsaW1pdGVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAiYXQgbGVhc3Qgb25lIG9mIHRoZSBkZXNpcmVkIHF1YWxpdHkgbGF5ZXJzXG4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIE1hbmFnZSBwcm9maWxlcyBhbmQgYXBwbGljYXRpb25zIGFuZCBzZXQgUlNJWiAqLwotICAgICAgICAvKiBzZXQgY2luZW1hIHBhcmFtZXRlcnMgaWYgcmVxdWlyZWQgKi8KLSAgICAgICAgaWYgKE9QSl9JU19DSU5FTUEocGFyYW1ldGVycy0+cnNpeikpewotICAgICAgICAgICAgaWYgKChwYXJhbWV0ZXJzLT5yc2l6ID09IE9QSl9QUk9GSUxFX0NJTkVNQV9TMkspCi0gICAgICAgICAgICAgICAgICAgIHx8IChwYXJhbWV0ZXJzLT5yc2l6ID09IE9QSl9QUk9GSUxFX0NJTkVNQV9TNEspKXsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIFNjYWxhYmxlIERpZ2l0YWwgQ2luZW1hIHByb2ZpbGVzIG5vdCB5ZXQgc3VwcG9ydGVkXG4iKTsKLSAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfTk9ORTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3BqX2oya19zZXRfY2luZW1hX3BhcmFtZXRlcnMocGFyYW1ldGVycyxpbWFnZSxwX21hbmFnZXIpOwotICAgICAgICAgICAgICAgIGlmICghb3BqX2oya19pc19jaW5lbWFfY29tcGxpYW50KGltYWdlLHBhcmFtZXRlcnMtPnJzaXoscF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfTk9ORTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoT1BKX0lTX1NUT1JBR0UocGFyYW1ldGVycy0+cnNpeikpIHsKLSAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBMb25nIFRlcm0gU3RvcmFnZSBwcm9maWxlIG5vdCB5ZXQgc3VwcG9ydGVkXG4iKTsKLSAgICAgICAgICAgIHBhcmFtZXRlcnMtPnJzaXogPSBPUEpfUFJPRklMRV9OT05FOwotICAgICAgICB9IGVsc2UgaWYgKE9QSl9JU19CUk9BRENBU1QocGFyYW1ldGVycy0+cnNpeikpIHsKLSAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBCcm9hZGNhc3QgcHJvZmlsZXMgbm90IHlldCBzdXBwb3J0ZWRcbiIpOwotICAgICAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9IE9QSl9QUk9GSUxFX05PTkU7Ci0gICAgICAgIH0gZWxzZSBpZiAoT1BKX0lTX0lNRihwYXJhbWV0ZXJzLT5yc2l6KSkgewotICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAiSlBFRyAyMDAwIElNRiBwcm9maWxlcyBub3QgeWV0IHN1cHBvcnRlZFxuIik7Ci0gICAgICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gT1BKX1BST0ZJTEVfTk9ORTsKLSAgICAgICAgfSBlbHNlIGlmIChPUEpfSVNfUEFSVDIocGFyYW1ldGVycy0+cnNpeikpIHsKLSAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLT5yc2l6ID09ICgoT1BKX1BST0ZJTEVfUEFSVDIpIHwgKE9QSl9FWFRFTlNJT05fTk9ORSkpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQRUcgMjAwMCBQYXJ0LTIgcHJvZmlsZSBkZWZpbmVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IG5vIFBhcnQtMiBleHRlbnNpb24gZW5hYmxlZC5cbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9maWxlIHNldCB0byBOT05FLlxuIik7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9IE9QSl9QUk9GSUxFX05PTkU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlcnMtPnJzaXogIT0gKChPUEpfUFJPRklMRV9QQVJUMikgfCAoT1BKX0VYVEVOU0lPTl9NQ1QpKSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVbnN1cHBvcnRlZCBQYXJ0LTIgZXh0ZW5zaW9uIGVuYWJsZWRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9maWxlIHNldCB0byBOT05FLlxuIik7Ci0gICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+cnNpeiA9IE9QSl9QUk9GSUxFX05PTkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICBjb3B5IHVzZXIgZW5jb2RpbmcgcGFyYW1ldGVycwotICAgICAgICAqLwotICAgICAgICBjcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX21heF9jb21wX3NpemUgPSAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5tYXhfY29tcF9zaXplOwotICAgICAgICBjcC0+cnNpeiA9IHBhcmFtZXRlcnMtPnJzaXo7Ci0gICAgICAgIGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fZGlzdG9fYWxsb2MgPSAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5jcF9kaXN0b19hbGxvYyAmIDF1OwotICAgICAgICBjcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX2ZpeGVkX2FsbG9jID0gKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+Y3BfZml4ZWRfYWxsb2MgJiAxdTsKLSAgICAgICAgY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9maXhlZF9xdWFsaXR5ID0gKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+Y3BfZml4ZWRfcXVhbGl0eSAmIDF1OwotCi0gICAgICAgIC8qIG1vZCBmaXhlZF9xdWFsaXR5ICovCi0gICAgICAgIGlmIChwYXJhbWV0ZXJzLT5jcF9maXhlZF9hbGxvYyAmJiBwYXJhbWV0ZXJzLT5jcF9tYXRyaWNlKSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGFycmF5X3NpemUgPSAoc2l6ZV90KXBhcmFtZXRlcnMtPnRjcF9udW1sYXllcnMgKiAoc2l6ZV90KXBhcmFtZXRlcnMtPm51bXJlc29sdXRpb24gKiAzICogc2l6ZW9mKE9QSl9JTlQzMik7Ci0gICAgICAgICAgICAgICAgY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9tYXRyaWNlID0gKE9QSl9JTlQzMiAqKSBvcGpfbWFsbG9jKGFycmF5X3NpemUpOwotCQkJCQkJCQlpZiAoIWNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fbWF0cmljZSkgewotCQkJCQkJCQkgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBjb3B5IG9mIHVzZXIgZW5jb2RpbmcgcGFyYW1ldGVycyBtYXRyaXggXG4iKTsKLQkJCQkJCQkJICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotCQkJCQkJCQl9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fbWF0cmljZSwgcGFyYW1ldGVycy0+Y3BfbWF0cmljZSwgYXJyYXlfc2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB0aWxlcyAqLwotICAgICAgICBjcC0+dGR4ID0gKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+Y3BfdGR4OwotICAgICAgICBjcC0+dGR5ID0gKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+Y3BfdGR5OwotCi0gICAgICAgIC8qIHRpbGUgb2Zmc2V0ICovCi0gICAgICAgIGNwLT50eDAgPSAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5jcF90eDA7Ci0gICAgICAgIGNwLT50eTAgPSAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5jcF90eTA7Ci0KLSAgICAgICAgLyogY29tbWVudCBzdHJpbmcgKi8KLSAgICAgICAgaWYocGFyYW1ldGVycy0+Y3BfY29tbWVudCkgewotICAgICAgICAgICAgICAgIGNwLT5jb21tZW50ID0gKGNoYXIqKW9wal9tYWxsb2Moc3RybGVuKHBhcmFtZXRlcnMtPmNwX2NvbW1lbnQpICsgMVUpOwotCQkJCQkJCQlpZighY3AtPmNvbW1lbnQpIHsKLQkJCQkJCQkJICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgY29weSBvZiBjb21tZW50IHN0cmluZ1xuIik7Ci0JCQkJCQkJCSAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLQkJCQkJCQkJfQotICAgICAgICAgICAgICAgIHN0cmNweShjcC0+Y29tbWVudCwgcGFyYW1ldGVycy0+Y3BfY29tbWVudCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogQ3JlYXRlIGRlZmF1bHQgY29tbWVudCBmb3IgY29kZXN0cmVhbSAqLwotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgY29tbWVudFtdID0gIkNyZWF0ZWQgYnkgT3BlbkpQRUcgdmVyc2lvbiAiOwotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBjbGVuID0gc3RybGVuKGNvbW1lbnQpOwotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24gPSBvcGpfdmVyc2lvbigpOwotCi0gICAgICAgICAgICAgICAgLyogVW5pUEc+PiAqLworICAgICAgICAvKiBVbmlQRz4+ICovCiAjaWZkZWYgVVNFX0pQV0wKLSAgICAgICAgICAgICAgICBjcC0+Y29tbWVudCA9IChjaGFyKilvcGpfbWFsbG9jKGNsZW4rc3RybGVuKHZlcnNpb24pKzExKTsKLQkJCQkJCQkJaWYoIWNwLT5jb21tZW50KSB7Ci0JCQkJCQkJCSAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIGNvbW1lbnQgc3RyaW5nXG4iKTsKLQkJCQkJCQkJICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotCQkJCQkJCQl9Ci0gICAgICAgICAgICAgICAgc3ByaW50ZihjcC0+Y29tbWVudCwiJXMlcyB3aXRoIEpQV0wiLCBjb21tZW50LCB2ZXJzaW9uKTsKKyAgICAgICAgY3AtPmNvbW1lbnQgPSAoY2hhciopb3BqX21hbGxvYyhjbGVuICsgc3RybGVuKHZlcnNpb24pICsgMTEpOworICAgICAgICBpZiAoIWNwLT5jb21tZW50KSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgY29tbWVudCBzdHJpbmdcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBzcHJpbnRmKGNwLT5jb21tZW50LCAiJXMlcyB3aXRoIEpQV0wiLCBjb21tZW50LCB2ZXJzaW9uKTsKICNlbHNlCi0gICAgICAgICAgICAgICAgY3AtPmNvbW1lbnQgPSAoY2hhciopb3BqX21hbGxvYyhjbGVuK3N0cmxlbih2ZXJzaW9uKSsxKTsKLQkJCQkJCQkJaWYoIWNwLT5jb21tZW50KSB7Ci0JCQkJCQkJCSAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIGNvbW1lbnQgc3RyaW5nXG4iKTsKLQkJCQkJCQkJICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotCQkJCQkJCQl9Ci0gICAgICAgICAgICAgICAgc3ByaW50ZihjcC0+Y29tbWVudCwiJXMlcyIsIGNvbW1lbnQsIHZlcnNpb24pOworICAgICAgICBjcC0+Y29tbWVudCA9IChjaGFyKilvcGpfbWFsbG9jKGNsZW4gKyBzdHJsZW4odmVyc2lvbikgKyAxKTsKKyAgICAgICAgaWYgKCFjcC0+Y29tbWVudCkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIGNvbW1lbnQgc3RyaW5nXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgc3ByaW50ZihjcC0+Y29tbWVudCwgIiVzJXMiLCBjb21tZW50LCB2ZXJzaW9uKTsKICNlbmRpZgotICAgICAgICAgICAgICAgIC8qIDw8VW5pUEcgKi8KLQkJCQl9CisgICAgICAgIC8qIDw8VW5pUEcgKi8KKyAgICB9CiAKLSAgICAgICAgLyoKLSAgICAgICAgY2FsY3VsYXRlIG90aGVyIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAgICAgICAgKi8KKyAgICAvKgorICAgIGNhbGN1bGF0ZSBvdGhlciBlbmNvZGluZyBwYXJhbWV0ZXJzCisgICAgKi8KIAotICAgICAgICBpZiAocGFyYW1ldGVycy0+dGlsZV9zaXplX29uKSB7Ci0gICAgICAgICAgICAgICAgY3AtPnR3ID0gb3BqX3VpbnRfY2VpbGRpdihpbWFnZS0+eDEgLSBjcC0+dHgwLCBjcC0+dGR4KTsKLSAgICAgICAgICAgICAgICBjcC0+dGggPSBvcGpfdWludF9jZWlsZGl2KGltYWdlLT55MSAtIGNwLT50eTAsIGNwLT50ZHkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNwLT50ZHggPSBpbWFnZS0+eDEgLSBjcC0+dHgwOwotICAgICAgICAgICAgICAgIGNwLT50ZHkgPSBpbWFnZS0+eTEgLSBjcC0+dHkwOwotICAgICAgICB9CisgICAgaWYgKHBhcmFtZXRlcnMtPnRpbGVfc2l6ZV9vbikgeworICAgICAgICBjcC0+dHcgPSBvcGpfdWludF9jZWlsZGl2KGltYWdlLT54MSAtIGNwLT50eDAsIGNwLT50ZHgpOworICAgICAgICBjcC0+dGggPSBvcGpfdWludF9jZWlsZGl2KGltYWdlLT55MSAtIGNwLT50eTAsIGNwLT50ZHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNwLT50ZHggPSBpbWFnZS0+eDEgLSBjcC0+dHgwOworICAgICAgICBjcC0+dGR5ID0gaW1hZ2UtPnkxIC0gY3AtPnR5MDsKKyAgICB9CiAKLSAgICAgICAgaWYgKHBhcmFtZXRlcnMtPnRwX29uKSB7Ci0gICAgICAgICAgICAgICAgY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV90cF9mbGFnID0gKE9QSl9CWVRFKXBhcmFtZXRlcnMtPnRwX2ZsYWc7Ci0gICAgICAgICAgICAgICAgY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV90cF9vbiA9IDE7Ci0gICAgICAgIH0KKyAgICBpZiAocGFyYW1ldGVycy0+dHBfb24pIHsKKyAgICAgICAgY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV90cF9mbGFnID0gKE9QSl9CWVRFKXBhcmFtZXRlcnMtPnRwX2ZsYWc7CisgICAgICAgIGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fdHBfb24gPSAxOworICAgIH0KIAogI2lmZGVmIFVTRV9KUFdMCi0gICAgICAgIC8qCi0gICAgICAgIGNhbGN1bGF0ZSBKUFdMIGVuY29kaW5nIHBhcmFtZXRlcnMKLSAgICAgICAgKi8KKyAgICAvKgorICAgIGNhbGN1bGF0ZSBKUFdMIGVuY29kaW5nIHBhcmFtZXRlcnMKKyAgICAqLwogCi0gICAgICAgIGlmIChwYXJhbWV0ZXJzLT5qcHdsX2VwY19vbikgewotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBpOworICAgIGlmIChwYXJhbWV0ZXJzLT5qcHdsX2VwY19vbikgeworICAgICAgICBPUEpfSU5UMzIgaTsKIAotICAgICAgICAgICAgICAgIC8qIHNldCBKUFdMIG9uICovCi0gICAgICAgICAgICAgICAgY3AtPmVwY19vbiA9IE9QSl9UUlVFOwotICAgICAgICAgICAgICAgIGNwLT5pbmZvX29uID0gT1BKX0ZBTFNFOyAvKiBubyBpbmZvcm1hdGl2ZSB0ZWNobmlxdWUgKi8KKyAgICAgICAgLyogc2V0IEpQV0wgb24gKi8KKyAgICAgICAgY3AtPmVwY19vbiA9IE9QSl9UUlVFOworICAgICAgICBjcC0+aW5mb19vbiA9IE9QSl9GQUxTRTsgLyogbm8gaW5mb3JtYXRpdmUgdGVjaG5pcXVlICovCiAKLSAgICAgICAgICAgICAgICAvKiBzZXQgRVBCIG9uICovCi0gICAgICAgICAgICAgICAgaWYgKChwYXJhbWV0ZXJzLT5qcHdsX2hwcm90X01IID4gMCkgfHwgKHBhcmFtZXRlcnMtPmpwd2xfaHByb3RfVFBIWzBdID4gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNwLT5lcGJfb24gPSBPUEpfVFJVRTsKKyAgICAgICAgLyogc2V0IEVQQiBvbiAqLworICAgICAgICBpZiAoKHBhcmFtZXRlcnMtPmpwd2xfaHByb3RfTUggPiAwKSB8fCAocGFyYW1ldGVycy0+anB3bF9ocHJvdF9UUEhbMF0gPiAwKSkgeworICAgICAgICAgICAgY3AtPmVwYl9vbiA9IE9QSl9UUlVFOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBjcC0+aHByb3RfTUggPSBwYXJhbWV0ZXJzLT5qcHdsX2hwcm90X01IOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEpQV0xfTUFYX05PX1RJTEVTUEVDUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLT5ocHJvdF9UUEhfdGlsZW5vW2ldID0gcGFyYW1ldGVycy0+anB3bF9ocHJvdF9UUEhfdGlsZW5vW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+aHByb3RfVFBIW2ldID0gcGFyYW1ldGVycy0+anB3bF9ocHJvdF9UUEhbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiB0aWxlIHNwZWNzIGFyZSBub3Qgc3BlY2lmaWVkLCBjb3B5IE1IIHNwZWNzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3AtPmhwcm90X1RQSFswXSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+aHByb3RfVFBIX3RpbGVub1swXSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLT5ocHJvdF9UUEhbMF0gPSBwYXJhbWV0ZXJzLT5qcHdsX2hwcm90X01IOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEpQV0xfTUFYX05PX1BBQ0tTUEVDUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLT5wcHJvdF90aWxlbm9baV0gPSBwYXJhbWV0ZXJzLT5qcHdsX3Bwcm90X3RpbGVub1tpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AtPnBwcm90X3BhY2tub1tpXSA9IHBhcmFtZXRlcnMtPmpwd2xfcHByb3RfcGFja25vW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+cHByb3RbaV0gPSBwYXJhbWV0ZXJzLT5qcHdsX3Bwcm90W2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIHNldCBFU0Qgd3JpdGluZyAqLwotICAgICAgICAgICAgICAgIGlmICgocGFyYW1ldGVycy0+anB3bF9zZW5zX3NpemUgPT0gMSkgfHwgKHBhcmFtZXRlcnMtPmpwd2xfc2Vuc19zaXplID09IDIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjcC0+ZXNkX29uID0gT1BKX1RSVUU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNwLT5zZW5zX3NpemUgPSBwYXJhbWV0ZXJzLT5qcHdsX3NlbnNfc2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNwLT5zZW5zX2FkZHIgPSBwYXJhbWV0ZXJzLT5qcHdsX3NlbnNfYWRkcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNwLT5zZW5zX3JhbmdlID0gcGFyYW1ldGVycy0+anB3bF9zZW5zX3JhbmdlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBjcC0+c2Vuc19NSCA9IHBhcmFtZXRlcnMtPmpwd2xfc2Vuc19NSDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBKUFdMX01BWF9OT19USUxFU1BFQ1M7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC0+c2Vuc19UUEhfdGlsZW5vW2ldID0gcGFyYW1ldGVycy0+anB3bF9zZW5zX1RQSF90aWxlbm9baV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwLT5zZW5zX1RQSFtpXSA9IHBhcmFtZXRlcnMtPmpwd2xfc2Vuc19UUEhbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogYWx3YXlzIHNldCBSRUQgd3JpdGluZyB0byBmYWxzZTogd2UgYXJlIGF0IHRoZSBlbmNvZGVyICovCi0gICAgICAgICAgICAgICAgY3AtPnJlZF9vbiA9IE9QSl9GQUxTRTsKLQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNwLT5lcGNfb24gPSBPUEpfRkFMU0U7CisgICAgICAgICAgICBjcC0+aHByb3RfTUggPSBwYXJhbWV0ZXJzLT5qcHdsX2hwcm90X01IOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEpQV0xfTUFYX05PX1RJTEVTUEVDUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgY3AtPmhwcm90X1RQSF90aWxlbm9baV0gPSBwYXJhbWV0ZXJzLT5qcHdsX2hwcm90X1RQSF90aWxlbm9baV07CisgICAgICAgICAgICAgICAgY3AtPmhwcm90X1RQSFtpXSA9IHBhcmFtZXRlcnMtPmpwd2xfaHByb3RfVFBIW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogaWYgdGlsZSBzcGVjcyBhcmUgbm90IHNwZWNpZmllZCwgY29weSBNSCBzcGVjcyAqLworICAgICAgICAgICAgaWYgKGNwLT5ocHJvdF9UUEhbMF0gPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBjcC0+aHByb3RfVFBIX3RpbGVub1swXSA9IDA7CisgICAgICAgICAgICAgICAgY3AtPmhwcm90X1RQSFswXSA9IHBhcmFtZXRlcnMtPmpwd2xfaHByb3RfTUg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSlBXTF9NQVhfTk9fUEFDS1NQRUNTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjcC0+cHByb3RfdGlsZW5vW2ldID0gcGFyYW1ldGVycy0+anB3bF9wcHJvdF90aWxlbm9baV07CisgICAgICAgICAgICAgICAgY3AtPnBwcm90X3BhY2tub1tpXSA9IHBhcmFtZXRlcnMtPmpwd2xfcHByb3RfcGFja25vW2ldOworICAgICAgICAgICAgICAgIGNwLT5wcHJvdFtpXSA9IHBhcmFtZXRlcnMtPmpwd2xfcHByb3RbaV07CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKworICAgICAgICAvKiBzZXQgRVNEIHdyaXRpbmcgKi8KKyAgICAgICAgaWYgKChwYXJhbWV0ZXJzLT5qcHdsX3NlbnNfc2l6ZSA9PSAxKSB8fCAocGFyYW1ldGVycy0+anB3bF9zZW5zX3NpemUgPT0gMikpIHsKKyAgICAgICAgICAgIGNwLT5lc2Rfb24gPSBPUEpfVFJVRTsKKworICAgICAgICAgICAgY3AtPnNlbnNfc2l6ZSA9IHBhcmFtZXRlcnMtPmpwd2xfc2Vuc19zaXplOworICAgICAgICAgICAgY3AtPnNlbnNfYWRkciA9IHBhcmFtZXRlcnMtPmpwd2xfc2Vuc19hZGRyOworICAgICAgICAgICAgY3AtPnNlbnNfcmFuZ2UgPSBwYXJhbWV0ZXJzLT5qcHdsX3NlbnNfcmFuZ2U7CisKKyAgICAgICAgICAgIGNwLT5zZW5zX01IID0gcGFyYW1ldGVycy0+anB3bF9zZW5zX01IOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEpQV0xfTUFYX05PX1RJTEVTUEVDUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgY3AtPnNlbnNfVFBIX3RpbGVub1tpXSA9IHBhcmFtZXRlcnMtPmpwd2xfc2Vuc19UUEhfdGlsZW5vW2ldOworICAgICAgICAgICAgICAgIGNwLT5zZW5zX1RQSFtpXSA9IHBhcmFtZXRlcnMtPmpwd2xfc2Vuc19UUEhbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBhbHdheXMgc2V0IFJFRCB3cml0aW5nIHRvIGZhbHNlOiB3ZSBhcmUgYXQgdGhlIGVuY29kZXIgKi8KKyAgICAgICAgY3AtPnJlZF9vbiA9IE9QSl9GQUxTRTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIGNwLT5lcGNfb24gPSBPUEpfRkFMU0U7CisgICAgfQogI2VuZGlmIC8qIFVTRV9KUFdMICovCiAKLSAgICAgICAgLyogaW5pdGlhbGl6ZSB0aGUgbXV0aXBsZSB0aWxlcyAqLwotICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0gICAgICAgIGNwLT50Y3BzID0gKG9wal90Y3BfdCopIG9wal9jYWxsb2MoY3AtPnR3ICogY3AtPnRoLCBzaXplb2Yob3BqX3RjcF90KSk7Ci0gICAgICAgIGlmICghY3AtPnRjcHMpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgdGlsZSBjb2RpbmcgcGFyYW1ldGVyc1xuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAvKiBpbml0aWFsaXplIHRoZSBtdXRpcGxlIHRpbGVzICovCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgIGNwLT50Y3BzID0gKG9wal90Y3BfdCopIG9wal9jYWxsb2MoY3AtPnR3ICogY3AtPnRoLCBzaXplb2Yob3BqX3RjcF90KSk7CisgICAgaWYgKCFjcC0+dGNwcykgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSB0aWxlIGNvZGluZyBwYXJhbWV0ZXJzXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgaWYgKHBhcmFtZXRlcnMtPm51bXBvY3MpIHsKKyAgICAgICAgLyogaW5pdGlhbGlzYXRpb24gb2YgUE9DICovCisgICAgICAgIG9wal9qMmtfY2hlY2tfcG9jX3ZhbChwYXJhbWV0ZXJzLT5QT0MsIHBhcmFtZXRlcnMtPm51bXBvY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uLCBpbWFnZS0+bnVtY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT50Y3BfbnVtbGF5ZXJzLCBwX21hbmFnZXIpOworICAgICAgICAvKiBUT0RPIE1TRCB1c2UgdGhlIHJldHVybiB2YWx1ZSovCisgICAgfQorCisgICAgZm9yICh0aWxlbm8gPSAwOyB0aWxlbm8gPCBjcC0+dHcgKiBjcC0+dGg7IHRpbGVubysrKSB7CisgICAgICAgIG9wal90Y3BfdCAqdGNwID0gJmNwLT50Y3BzW3RpbGVub107CisgICAgICAgIHRjcC0+bnVtbGF5ZXJzID0gKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+dGNwX251bWxheWVyczsKKworICAgICAgICBmb3IgKGogPSAwOyBqIDwgdGNwLT5udW1sYXllcnM7IGorKykgeworICAgICAgICAgICAgaWYgKE9QSl9JU19DSU5FTUEoY3AtPnJzaXopKSB7CisgICAgICAgICAgICAgICAgaWYgKGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fZml4ZWRfcXVhbGl0eSkgeworICAgICAgICAgICAgICAgICAgICB0Y3AtPmRpc3RvcmF0aW9bal0gPSBwYXJhbWV0ZXJzLT50Y3BfZGlzdG9yYXRpb1tqXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGNwLT5yYXRlc1tqXSA9IHBhcmFtZXRlcnMtPnRjcF9yYXRlc1tqXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fZml4ZWRfcXVhbGl0eSkgeyAgICAgICAvKiBhZGQgZml4ZWRfcXVhbGl0eSAqLworICAgICAgICAgICAgICAgICAgICB0Y3AtPmRpc3RvcmF0aW9bal0gPSBwYXJhbWV0ZXJzLT50Y3BfZGlzdG9yYXRpb1tqXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0Y3AtPnJhdGVzW2pdID0gcGFyYW1ldGVycy0+dGNwX3JhdGVzW2pdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9maXhlZF9xdWFsaXR5ICYmCisgICAgICAgICAgICAgICAgICAgIHRjcC0+cmF0ZXNbal0gPD0gMS4wKSB7CisgICAgICAgICAgICAgICAgdGNwLT5yYXRlc1tqXSA9IDAuMDsgICAgLyogZm9yY2UgbG9zc2xlc3MgKi8KKyAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIHRjcC0+Y3N0eSA9IChPUEpfVUlOVDMyKXBhcmFtZXRlcnMtPmNzdHk7CisgICAgICAgIHRjcC0+cHJnID0gcGFyYW1ldGVycy0+cHJvZ19vcmRlcjsKKyAgICAgICAgdGNwLT5tY3QgPSAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT50Y3BfbWN0OworCisgICAgICAgIG51bXBvY3NfdGlsZSA9IDA7CisgICAgICAgIHRjcC0+UE9DID0gMDsKKwogICAgICAgICBpZiAocGFyYW1ldGVycy0+bnVtcG9jcykgewotICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpc2F0aW9uIG9mIFBPQyAqLwotICAgICAgICAgICAgICAgIG9wal9qMmtfY2hlY2tfcG9jX3ZhbChwYXJhbWV0ZXJzLT5QT0MscGFyYW1ldGVycy0+bnVtcG9jcywgKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbiwgaW1hZ2UtPm51bWNvbXBzLCAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT50Y3BfbnVtbGF5ZXJzLCBwX21hbmFnZXIpOwotICAgICAgICAgICAgICAgIC8qIFRPRE8gTVNEIHVzZSB0aGUgcmV0dXJuIHZhbHVlKi8KKyAgICAgICAgICAgIC8qIGluaXRpYWxpc2F0aW9uIG9mIFBPQyAqLworICAgICAgICAgICAgdGNwLT5QT0MgPSAxOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcmFtZXRlcnMtPm51bXBvY3M7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICh0aWxlbm8gKyAxID09IHBhcmFtZXRlcnMtPlBPQ1tpXS50aWxlKSAgeworICAgICAgICAgICAgICAgICAgICBvcGpfcG9jX3QgKnRjcF9wb2MgPSAmdGNwLT5wb2NzW251bXBvY3NfdGlsZV07CisKKyAgICAgICAgICAgICAgICAgICAgdGNwX3BvYy0+cmVzbm8wICAgICAgICAgPSBwYXJhbWV0ZXJzLT5QT0NbbnVtcG9jc190aWxlXS5yZXNubzA7CisgICAgICAgICAgICAgICAgICAgIHRjcF9wb2MtPmNvbXBubzAgICAgICAgID0gcGFyYW1ldGVycy0+UE9DW251bXBvY3NfdGlsZV0uY29tcG5vMDsKKyAgICAgICAgICAgICAgICAgICAgdGNwX3BvYy0+bGF5bm8xICAgICAgICAgPSBwYXJhbWV0ZXJzLT5QT0NbbnVtcG9jc190aWxlXS5sYXlubzE7CisgICAgICAgICAgICAgICAgICAgIHRjcF9wb2MtPnJlc25vMSAgICAgICAgID0gcGFyYW1ldGVycy0+UE9DW251bXBvY3NfdGlsZV0ucmVzbm8xOworICAgICAgICAgICAgICAgICAgICB0Y3BfcG9jLT5jb21wbm8xICAgICAgICA9IHBhcmFtZXRlcnMtPlBPQ1tudW1wb2NzX3RpbGVdLmNvbXBubzE7CisgICAgICAgICAgICAgICAgICAgIHRjcF9wb2MtPnByZzEgICAgICAgICAgID0gcGFyYW1ldGVycy0+UE9DW251bXBvY3NfdGlsZV0ucHJnMTsKKyAgICAgICAgICAgICAgICAgICAgdGNwX3BvYy0+dGlsZSAgICAgICAgICAgPSBwYXJhbWV0ZXJzLT5QT0NbbnVtcG9jc190aWxlXS50aWxlOworCisgICAgICAgICAgICAgICAgICAgIG51bXBvY3NfdGlsZSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGNwLT5udW1wb2NzID0gbnVtcG9jc190aWxlIC0gMSA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0Y3AtPm51bXBvY3MgPSAwOwogICAgICAgICB9CiAKLSAgICAgICAgZm9yICh0aWxlbm8gPSAwOyB0aWxlbm8gPCBjcC0+dHcgKiBjcC0+dGg7IHRpbGVubysrKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3RjcF90ICp0Y3AgPSAmY3AtPnRjcHNbdGlsZW5vXTsKLSAgICAgICAgICAgICAgICB0Y3AtPm51bWxheWVycyA9IChPUEpfVUlOVDMyKXBhcmFtZXRlcnMtPnRjcF9udW1sYXllcnM7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdGNwLT5udW1sYXllcnM7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYoT1BKX0lTX0NJTkVNQShjcC0+cnNpeikpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9maXhlZF9xdWFsaXR5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5kaXN0b3JhdGlvW2pdID0gcGFyYW1ldGVycy0+dGNwX2Rpc3RvcmF0aW9bal07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5yYXRlc1tqXSA9IHBhcmFtZXRlcnMtPnRjcF9yYXRlc1tqXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9maXhlZF9xdWFsaXR5KSB7ICAgICAgIC8qIGFkZCBmaXhlZF9xdWFsaXR5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5kaXN0b3JhdGlvW2pdID0gcGFyYW1ldGVycy0+dGNwX2Rpc3RvcmF0aW9bal07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5yYXRlc1tqXSA9IHBhcmFtZXRlcnMtPnRjcF9yYXRlc1tqXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHRjcC0+Y3N0eSA9IChPUEpfVUlOVDMyKXBhcmFtZXRlcnMtPmNzdHk7Ci0gICAgICAgICAgICAgICAgdGNwLT5wcmcgPSBwYXJhbWV0ZXJzLT5wcm9nX29yZGVyOwotICAgICAgICAgICAgICAgIHRjcC0+bWN0ID0gKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+dGNwX21jdDsKLQotICAgICAgICAgICAgICAgIG51bXBvY3NfdGlsZSA9IDA7Ci0gICAgICAgICAgICAgICAgdGNwLT5QT0MgPSAwOwotCi0gICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMtPm51bXBvY3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluaXRpYWxpc2F0aW9uIG9mIFBPQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5QT0MgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcmFtZXRlcnMtPm51bXBvY3M7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGlsZW5vICsgMSA9PSBwYXJhbWV0ZXJzLT5QT0NbaV0udGlsZSApICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BvY190ICp0Y3BfcG9jID0gJnRjcC0+cG9jc1tudW1wb2NzX3RpbGVdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwX3BvYy0+cmVzbm8wICAgICAgICAgPSBwYXJhbWV0ZXJzLT5QT0NbbnVtcG9jc190aWxlXS5yZXNubzA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwX3BvYy0+Y29tcG5vMCAgICAgICAgPSBwYXJhbWV0ZXJzLT5QT0NbbnVtcG9jc190aWxlXS5jb21wbm8wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcF9wb2MtPmxheW5vMSAgICAgICAgID0gcGFyYW1ldGVycy0+UE9DW251bXBvY3NfdGlsZV0ubGF5bm8xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcF9wb2MtPnJlc25vMSAgICAgICAgID0gcGFyYW1ldGVycy0+UE9DW251bXBvY3NfdGlsZV0ucmVzbm8xOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcF9wb2MtPmNvbXBubzEgICAgICAgID0gcGFyYW1ldGVycy0+UE9DW251bXBvY3NfdGlsZV0uY29tcG5vMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3BfcG9jLT5wcmcxICAgICAgICAgICA9IHBhcmFtZXRlcnMtPlBPQ1tudW1wb2NzX3RpbGVdLnByZzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwX3BvYy0+dGlsZSAgICAgICAgICAgPSBwYXJhbWV0ZXJzLT5QT0NbbnVtcG9jc190aWxlXS50aWxlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtcG9jc190aWxlKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5udW1wb2NzID0gbnVtcG9jc190aWxlIC0xIDsKLSAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRjcC0+bnVtcG9jcyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdGNwLT50Y2NwcyA9IChvcGpfdGNjcF90Kikgb3BqX2NhbGxvYyhpbWFnZS0+bnVtY29tcHMsIHNpemVvZihvcGpfdGNjcF90KSk7Ci0gICAgICAgICAgICAgICAgaWYgKCF0Y3AtPnRjY3BzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgdGlsZSBjb21wb25lbnQgY29kaW5nIHBhcmFtZXRlcnNcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMtPm1jdF9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbE1jdFNpemUgPSBpbWFnZS0+bnVtY29tcHMgKiBpbWFnZS0+bnVtY29tcHMgKiAoT1BKX1VJTlQzMilzaXplb2YoT1BKX0ZMT0FUMzIpOwotICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIGxUbXBCdWYgPSAoT1BKX0ZMT0FUMzIqKW9wal9tYWxsb2MobE1jdFNpemUpOwotICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBsX2RjX3NoaWZ0ID0gKE9QSl9JTlQzMiAqKSAoKE9QSl9CWVRFICopIHBhcmFtZXRlcnMtPm1jdF9kYXRhICsgbE1jdFNpemUpOwotCi0JCQkJCQkJCQkJaWYgKCFsVG1wQnVmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRlbXAgYnVmZmVyXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdGNwLT5tY3QgPSAyOwotICAgICAgICAgICAgICAgICAgICB0Y3AtPm1fbWN0X2NvZGluZ19tYXRyaXggPSAoT1BKX0ZMT0FUMzIqKW9wal9tYWxsb2MobE1jdFNpemUpOwotCQkJCQkJCQkJCWlmICghIHRjcC0+bV9tY3RfY29kaW5nX21hdHJpeCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxUbXBCdWYpOwotCQkJCQkJCQkJCQkJCQlsVG1wQnVmID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgZW5jb2RlciBNQ1QgY29kaW5nIG1hdHJpeCBcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHRjcC0+bV9tY3RfY29kaW5nX21hdHJpeCxwYXJhbWV0ZXJzLT5tY3RfZGF0YSxsTWN0U2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweShsVG1wQnVmLHBhcmFtZXRlcnMtPm1jdF9kYXRhLGxNY3RTaXplKTsKLQotICAgICAgICAgICAgICAgICAgICB0Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCA9IChPUEpfRkxPQVQzMiopb3BqX21hbGxvYyhsTWN0U2l6ZSk7Ci0JCQkJCQkJCQkJaWYgKCEgdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgpIHsKLQkJCQkJCQkJCQkJCQkJb3BqX2ZyZWUobFRtcEJ1Zik7Ci0JCQkJCQkJCQkJCQkJCWxUbXBCdWYgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBlbmNvZGVyIE1DVCBkZWNvZGluZyBtYXRyaXggXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmKG9wal9tYXRyaXhfaW52ZXJzaW9uX2YobFRtcEJ1ZiwodGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgpLGltYWdlLT5udW1jb21wcykgPT0gT1BKX0ZBTFNFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobFRtcEJ1Zik7Ci0JCQkJCQkJCQkJCQkJCWxUbXBCdWYgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gaW52ZXJzZSBlbmNvZGVyIE1DVCBkZWNvZGluZyBtYXRyaXggXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotCQkJCQkJCQkJCX0KLQotICAgICAgICAgICAgICAgICAgICB0Y3AtPm1jdF9ub3JtcyA9IChPUEpfRkxPQVQ2NCopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfbWFsbG9jKGltYWdlLT5udW1jb21wcyAqIHNpemVvZihPUEpfRkxPQVQ2NCkpOwotCQkJCQkJCQkJCWlmICghIHRjcC0+bWN0X25vcm1zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobFRtcEJ1Zik7Ci0JCQkJCQkJCQkJCQkJCWxUbXBCdWYgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBlbmNvZGVyIE1DVCBub3JtcyBcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgb3BqX2NhbGN1bGF0ZV9ub3Jtcyh0Y3AtPm1jdF9ub3JtcyxpbWFnZS0+bnVtY29tcHMsdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgpOwotICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsVG1wQnVmKTsKLQotICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW1hZ2UtPm51bWNvbXBzOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNjcF90ICp0Y2NwID0gJnRjcC0+dGNjcHNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+bV9kY19sZXZlbF9zaGlmdCA9IGxfZGNfc2hpZnRbaV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAob3BqX2oya19zZXR1cF9tY3RfZW5jb2RpbmcodGNwLGltYWdlKSA9PSBPUEpfRkFMU0UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZyZWUgd2lsbCBiZSBoYW5kbGVkIGJ5IG9wal9qMmtfZGVzdHJveSAqLwotCQkJCQkJCQkJCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBzZXR1cCBqMmsgbWN0IGVuY29kaW5nXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHRjcC0+bWN0PT0xICYmIGltYWdlLT5udW1jb21wcyA+PSAzKSB7IC8qIFJHQi0+WUNDIE1DVCBpcyBlbmFibGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGltYWdlLT5jb21wc1swXS5keCAhPSBpbWFnZS0+Y29tcHNbMV0uZHgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbWFnZS0+Y29tcHNbMF0uZHggIT0gaW1hZ2UtPmNvbXBzWzJdLmR4KSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW1hZ2UtPmNvbXBzWzBdLmR5ICE9IGltYWdlLT5jb21wc1sxXS5keSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGltYWdlLT5jb21wc1swXS5keSAhPSBpbWFnZS0+Y29tcHNbMl0uZHkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiQ2Fubm90IHBlcmZvcm0gTUNUIG9uIGNvbXBvbmVudHMgd2l0aCBkaWZmZXJlbnQgc2l6ZXMuIERpc2FibGluZyBNQ1QuXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3AtPm1jdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbWFnZS0+bnVtY29tcHM7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNjcF90ICp0Y2NwID0gJnRjcC0+dGNjcHNbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2NvbXAgPSAmKGltYWdlLT5jb21wc1tpXSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbF9jb21wLT5zZ25kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+bV9kY19sZXZlbF9zaGlmdCA9IDEgPDwgKGxfY29tcC0+cHJlYyAtIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGltYWdlLT5udW1jb21wczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNjcF90ICp0Y2NwID0gJnRjcC0+dGNjcHNbaV07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPmNzdHkgPSBwYXJhbWV0ZXJzLT5jc3R5ICYgMHgwMTsgICAvKiAwID0+IG9uZSBwcmVjaW5jdCB8fCAxID0+IGN1c3RvbSBwcmVjaW5jdCAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPm51bXJlc29sdXRpb25zID0gKE9QSl9VSU5UMzIpcGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPmNibGt3ID0gKE9QSl9VSU5UMzIpb3BqX2ludF9mbG9vcmxvZzIocGFyYW1ldGVycy0+Y2Jsb2Nrd19pbml0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPmNibGtoID0gKE9QSl9VSU5UMzIpb3BqX2ludF9mbG9vcmxvZzIocGFyYW1ldGVycy0+Y2Jsb2NraF9pbml0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPmNibGtzdHkgPSAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5tb2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cW1mYmlkID0gcGFyYW1ldGVycy0+aXJyZXZlcnNpYmxlID8gMCA6IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0Y2NwLT5xbnRzdHkgPSBwYXJhbWV0ZXJzLT5pcnJldmVyc2libGUgPyBKMktfQ0NQX1FOVFNUWV9TRVFOVCA6IEoyS19DQ1BfUU5UU1RZX05PUU5UOwotICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+bnVtZ2JpdHMgPSAyOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKE9QSl9JTlQzMilpID09IHBhcmFtZXRlcnMtPnJvaV9jb21wbm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cm9pc2hpZnQgPSBwYXJhbWV0ZXJzLT5yb2lfc2hpZnQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2NwLT5yb2lzaGlmdCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMtPmNzdHkgJiBKMktfQ0NQX0NTVFlfUFJUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHAgPSAwLCBpdF9yZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCB0Y2NwLT5udW1yZXNvbHV0aW9ucyA+IDAgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGl0X3JlcyA9IChPUEpfSU5UMzIpdGNjcC0+bnVtcmVzb2x1dGlvbnMgLSAxOyBpdF9yZXMgPj0gMDsgaXRfcmVzLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwIDwgcGFyYW1ldGVycy0+cmVzX3NwZWMpIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVycy0+cHJjd19pbml0W3BdIDwgMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPnByY3dbaXRfcmVzXSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjd1tpdF9yZXNdID0gKE9QSl9VSU5UMzIpb3BqX2ludF9mbG9vcmxvZzIocGFyYW1ldGVycy0+cHJjd19pbml0W3BdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLT5wcmNoX2luaXRbcF0gPCAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjaFtpdF9yZXNdID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPnByY2hbaXRfcmVzXSA9IChPUEpfVUlOVDMyKW9wal9pbnRfZmxvb3Jsb2cyKHBhcmFtZXRlcnMtPnByY2hfaW5pdFtwXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHJlc19zcGVjID0gcGFyYW1ldGVycy0+cmVzX3NwZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBzaXplX3ByY3cgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgc2l6ZV9wcmNoID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzX3NwZWM+MCk7IC8qIGlzc3VlIDE4OSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3ByY3cgPSBwYXJhbWV0ZXJzLT5wcmN3X2luaXRbcmVzX3NwZWMgLSAxXSA+PiAocCAtIChyZXNfc3BlYyAtIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9wcmNoID0gcGFyYW1ldGVycy0+cHJjaF9pbml0W3Jlc19zcGVjIC0gMV0gPj4gKHAgLSAocmVzX3NwZWMgLSAxKSk7Ci0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZV9wcmN3IDwgMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPnByY3dbaXRfcmVzXSA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjd1tpdF9yZXNdID0gKE9QSl9VSU5UMzIpb3BqX2ludF9mbG9vcmxvZzIoc2l6ZV9wcmN3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplX3ByY2ggPCAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjaFtpdF9yZXNdID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2NwLT5wcmNoW2l0X3Jlc10gPSAoT1BKX1VJTlQzMilvcGpfaW50X2Zsb29ybG9nMihzaXplX3ByY2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnByaW50ZigiXG5zaXplIHByZWNpbmN0IGZvciBsZXZlbCAlZCA6ICVkLCVkXG4iLCBpdF9yZXMsdGNjcC0+cHJjd1tpdF9yZXNdLCB0Y2NwLT5wcmNoW2l0X3Jlc10pOyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgLyplbmQgZm9yKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdGNjcC0+bnVtcmVzb2x1dGlvbnM7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjd1tqXSA9IDE1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjaFtqXSA9IDE1OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZHd0X2NhbGNfZXhwbGljaXRfc3RlcHNpemVzKHRjY3AsIGltYWdlLT5jb21wc1tpXS5wcmVjKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIHRjcC0+dGNjcHMgPSAob3BqX3RjY3BfdCopIG9wal9jYWxsb2MoaW1hZ2UtPm51bWNvbXBzLCBzaXplb2Yob3BqX3RjY3BfdCkpOworICAgICAgICBpZiAoIXRjcC0+dGNjcHMpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSB0aWxlIGNvbXBvbmVudCBjb2RpbmcgcGFyYW1ldGVyc1xuIik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICB9Ci0KICAgICAgICAgaWYgKHBhcmFtZXRlcnMtPm1jdF9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2ZyZWUocGFyYW1ldGVycy0+bWN0X2RhdGEpOwotICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPm1jdF9kYXRhID0gMDA7CisKKyAgICAgICAgICAgIE9QSl9VSU5UMzIgbE1jdFNpemUgPSBpbWFnZS0+bnVtY29tcHMgKiBpbWFnZS0+bnVtY29tcHMgKiAoT1BKX1VJTlQzMilzaXplb2YoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyKTsKKyAgICAgICAgICAgIE9QSl9GTE9BVDMyICogbFRtcEJ1ZiA9IChPUEpfRkxPQVQzMiopb3BqX21hbGxvYyhsTWN0U2l6ZSk7CisgICAgICAgICAgICBPUEpfSU5UMzIgKiBsX2RjX3NoaWZ0ID0gKE9QSl9JTlQzMiAqKSgoT1BKX0JZVEUgKikgcGFyYW1ldGVycy0+bWN0X2RhdGEgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbE1jdFNpemUpOworCisgICAgICAgICAgICBpZiAoIWxUbXBCdWYpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRlbXAgYnVmZmVyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0Y3AtPm1jdCA9IDI7CisgICAgICAgICAgICB0Y3AtPm1fbWN0X2NvZGluZ19tYXRyaXggPSAoT1BKX0ZMT0FUMzIqKW9wal9tYWxsb2MobE1jdFNpemUpOworICAgICAgICAgICAgaWYgKCEgdGNwLT5tX21jdF9jb2RpbmdfbWF0cml4KSB7CisgICAgICAgICAgICAgICAgb3BqX2ZyZWUobFRtcEJ1Zik7CisgICAgICAgICAgICAgICAgbFRtcEJ1ZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBlbmNvZGVyIE1DVCBjb2RpbmcgbWF0cml4IFxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweSh0Y3AtPm1fbWN0X2NvZGluZ19tYXRyaXgsIHBhcmFtZXRlcnMtPm1jdF9kYXRhLCBsTWN0U2l6ZSk7CisgICAgICAgICAgICBtZW1jcHkobFRtcEJ1ZiwgcGFyYW1ldGVycy0+bWN0X2RhdGEsIGxNY3RTaXplKTsKKworICAgICAgICAgICAgdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXggPSAoT1BKX0ZMT0FUMzIqKW9wal9tYWxsb2MobE1jdFNpemUpOworICAgICAgICAgICAgaWYgKCEgdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgpIHsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShsVG1wQnVmKTsKKyAgICAgICAgICAgICAgICBsVG1wQnVmID0gTlVMTDsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIGVuY29kZXIgTUNUIGRlY29kaW5nIG1hdHJpeCBcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob3BqX21hdHJpeF9pbnZlcnNpb25fZihsVG1wQnVmLCAodGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPm51bWNvbXBzKSA9PSBPUEpfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShsVG1wQnVmKTsKKyAgICAgICAgICAgICAgICBsVG1wQnVmID0gTlVMTDsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBpbnZlcnNlIGVuY29kZXIgTUNUIGRlY29kaW5nIG1hdHJpeCBcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRjcC0+bWN0X25vcm1zID0gKE9QSl9GTE9BVDY0KikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX21hbGxvYyhpbWFnZS0+bnVtY29tcHMgKiBzaXplb2YoT1BKX0ZMT0FUNjQpKTsKKyAgICAgICAgICAgIGlmICghIHRjcC0+bWN0X25vcm1zKSB7CisgICAgICAgICAgICAgICAgb3BqX2ZyZWUobFRtcEJ1Zik7CisgICAgICAgICAgICAgICAgbFRtcEJ1ZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSBlbmNvZGVyIE1DVCBub3JtcyBcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcGpfY2FsY3VsYXRlX25vcm1zKHRjcC0+bWN0X25vcm1zLCBpbWFnZS0+bnVtY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4KTsKKyAgICAgICAgICAgIG9wal9mcmVlKGxUbXBCdWYpOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW1hZ2UtPm51bWNvbXBzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBvcGpfdGNjcF90ICp0Y2NwID0gJnRjcC0+dGNjcHNbaV07CisgICAgICAgICAgICAgICAgdGNjcC0+bV9kY19sZXZlbF9zaGlmdCA9IGxfZGNfc2hpZnRbaV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvcGpfajJrX3NldHVwX21jdF9lbmNvZGluZyh0Y3AsIGltYWdlKSA9PSBPUEpfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICAvKiBmcmVlIHdpbGwgYmUgaGFuZGxlZCBieSBvcGpfajJrX2Rlc3Ryb3kgKi8KKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIHNldHVwIGoyayBtY3QgZW5jb2RpbmdcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAodGNwLT5tY3QgPT0gMSAmJiBpbWFnZS0+bnVtY29tcHMgPj0gMykgeyAvKiBSR0ItPllDQyBNQ1QgaXMgZW5hYmxlZCAqLworICAgICAgICAgICAgICAgIGlmICgoaW1hZ2UtPmNvbXBzWzBdLmR4ICE9IGltYWdlLT5jb21wc1sxXS5keCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbWFnZS0+Y29tcHNbMF0uZHggIT0gaW1hZ2UtPmNvbXBzWzJdLmR4KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGltYWdlLT5jb21wc1swXS5keSAhPSBpbWFnZS0+Y29tcHNbMV0uZHkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoaW1hZ2UtPmNvbXBzWzBdLmR5ICE9IGltYWdlLT5jb21wc1syXS5keSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgcGVyZm9ybSBNQ1Qgb24gY29tcG9uZW50cyB3aXRoIGRpZmZlcmVudCBzaXplcy4gRGlzYWJsaW5nIE1DVC5cbiIpOworICAgICAgICAgICAgICAgICAgICB0Y3AtPm1jdCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGltYWdlLT5udW1jb21wczsgaSsrKSB7CisgICAgICAgICAgICAgICAgb3BqX3RjY3BfdCAqdGNjcCA9ICZ0Y3AtPnRjY3BzW2ldOworICAgICAgICAgICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2NvbXAgPSAmKGltYWdlLT5jb21wc1tpXSk7CisKKyAgICAgICAgICAgICAgICBpZiAoISBsX2NvbXAtPnNnbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGNjcC0+bV9kY19sZXZlbF9zaGlmdCA9IDEgPDwgKGxfY29tcC0+cHJlYyAtIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGltYWdlLT5udW1jb21wczsgaSsrKSB7CisgICAgICAgICAgICBvcGpfdGNjcF90ICp0Y2NwID0gJnRjcC0+dGNjcHNbaV07CisKKyAgICAgICAgICAgIHRjY3AtPmNzdHkgPSBwYXJhbWV0ZXJzLT5jc3R5ICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAweDAxOyAgIC8qIDAgPT4gb25lIHByZWNpbmN0IHx8IDEgPT4gY3VzdG9tIHByZWNpbmN0ICAqLworICAgICAgICAgICAgdGNjcC0+bnVtcmVzb2x1dGlvbnMgPSAoT1BKX1VJTlQzMilwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uOworICAgICAgICAgICAgdGNjcC0+Y2Jsa3cgPSAoT1BKX1VJTlQzMilvcGpfaW50X2Zsb29ybG9nMihwYXJhbWV0ZXJzLT5jYmxvY2t3X2luaXQpOworICAgICAgICAgICAgdGNjcC0+Y2Jsa2ggPSAoT1BKX1VJTlQzMilvcGpfaW50X2Zsb29ybG9nMihwYXJhbWV0ZXJzLT5jYmxvY2toX2luaXQpOworICAgICAgICAgICAgdGNjcC0+Y2Jsa3N0eSA9IChPUEpfVUlOVDMyKXBhcmFtZXRlcnMtPm1vZGU7CisgICAgICAgICAgICB0Y2NwLT5xbWZiaWQgPSBwYXJhbWV0ZXJzLT5pcnJldmVyc2libGUgPyAwIDogMTsKKyAgICAgICAgICAgIHRjY3AtPnFudHN0eSA9IHBhcmFtZXRlcnMtPmlycmV2ZXJzaWJsZSA/IEoyS19DQ1BfUU5UU1RZX1NFUU5UIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEoyS19DQ1BfUU5UU1RZX05PUU5UOworICAgICAgICAgICAgdGNjcC0+bnVtZ2JpdHMgPSAyOworCisgICAgICAgICAgICBpZiAoKE9QSl9JTlQzMilpID09IHBhcmFtZXRlcnMtPnJvaV9jb21wbm8pIHsKKyAgICAgICAgICAgICAgICB0Y2NwLT5yb2lzaGlmdCA9IHBhcmFtZXRlcnMtPnJvaV9zaGlmdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGNjcC0+cm9pc2hpZnQgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFyYW1ldGVycy0+Y3N0eSAmIEoyS19DQ1BfQ1NUWV9QUlQpIHsKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcCA9IDAsIGl0X3JlczsKKyAgICAgICAgICAgICAgICBhc3NlcnQodGNjcC0+bnVtcmVzb2x1dGlvbnMgPiAwKTsKKyAgICAgICAgICAgICAgICBmb3IgKGl0X3JlcyA9IChPUEpfSU5UMzIpdGNjcC0+bnVtcmVzb2x1dGlvbnMgLSAxOyBpdF9yZXMgPj0gMDsgaXRfcmVzLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHAgPCBwYXJhbWV0ZXJzLT5yZXNfc3BlYykgeworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVycy0+cHJjd19pbml0W3BdIDwgMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPnByY3dbaXRfcmVzXSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPnByY3dbaXRfcmVzXSA9IChPUEpfVUlOVDMyKW9wal9pbnRfZmxvb3Jsb2cyKHBhcmFtZXRlcnMtPnByY3dfaW5pdFtwXSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLT5wcmNoX2luaXRbcF0gPCAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjaFtpdF9yZXNdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjaFtpdF9yZXNdID0gKE9QSl9VSU5UMzIpb3BqX2ludF9mbG9vcmxvZzIocGFyYW1ldGVycy0+cHJjaF9pbml0W3BdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHJlc19zcGVjID0gcGFyYW1ldGVycy0+cmVzX3NwZWM7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgc2l6ZV9wcmN3ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBzaXplX3ByY2ggPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQocmVzX3NwZWMgPiAwKTsgLyogaXNzdWUgMTg5ICovCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3ByY3cgPSBwYXJhbWV0ZXJzLT5wcmN3X2luaXRbcmVzX3NwZWMgLSAxXSA+PiAocCAtIChyZXNfc3BlYyAtIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfcHJjaCA9IHBhcmFtZXRlcnMtPnByY2hfaW5pdFtyZXNfc3BlYyAtIDFdID4+IChwIC0gKHJlc19zcGVjIC0gMSkpOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaXplX3ByY3cgPCAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjd1tpdF9yZXNdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjd1tpdF9yZXNdID0gKE9QSl9VSU5UMzIpb3BqX2ludF9mbG9vcmxvZzIoc2l6ZV9wcmN3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemVfcHJjaCA8IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2NwLT5wcmNoW2l0X3Jlc10gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2NwLT5wcmNoW2l0X3Jlc10gPSAoT1BKX1VJTlQzMilvcGpfaW50X2Zsb29ybG9nMihzaXplX3ByY2gpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICAgICAgLypwcmludGYoIlxuc2l6ZSBwcmVjaW5jdCBmb3IgbGV2ZWwgJWQgOiAlZCwlZFxuIiwgaXRfcmVzLHRjY3AtPnByY3dbaXRfcmVzXSwgdGNjcC0+cHJjaFtpdF9yZXNdKTsgKi8KKyAgICAgICAgICAgICAgICB9ICAgICAgIC8qZW5kIGZvciovCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB0Y2NwLT5udW1yZXNvbHV0aW9uczsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIHRjY3AtPnByY3dbal0gPSAxNTsKKyAgICAgICAgICAgICAgICAgICAgdGNjcC0+cHJjaFtqXSA9IDE1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3BqX2R3dF9jYWxjX2V4cGxpY2l0X3N0ZXBzaXplcyh0Y2NwLCBpbWFnZS0+Y29tcHNbaV0ucHJlYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocGFyYW1ldGVycy0+bWN0X2RhdGEpIHsKKyAgICAgICAgb3BqX2ZyZWUocGFyYW1ldGVycy0+bWN0X2RhdGEpOworICAgICAgICBwYXJhbWV0ZXJzLT5tY3RfZGF0YSA9IDAwOworICAgIH0KKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2FkZF9taG1hcmtlcihvcGpfY29kZXN0cmVhbV9pbmRleF90ICpjc3RyX2luZGV4LCBPUEpfVUlOVDMyIHR5cGUsIE9QSl9PRkZfVCBwb3MsIE9QSl9VSU5UMzIgbGVuKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfYWRkX21obWFya2VyKG9wal9jb2Rlc3RyZWFtX2luZGV4X3QgKmNzdHJfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0eXBlLCBPUEpfT0ZGX1QgcG9zLCBPUEpfVUlOVDMyIGxlbikKIHsKLSAgICAgICAgYXNzZXJ0KGNzdHJfaW5kZXggIT0gMDApOworICAgIGFzc2VydChjc3RyX2luZGV4ICE9IDAwKTsKIAotICAgICAgICAvKiBleHBhbmQgdGhlIGxpc3Q/ICovCi0gICAgICAgIGlmICgoY3N0cl9pbmRleC0+bWFya251bSArIDEpID4gY3N0cl9pbmRleC0+bWF4bWFya251bSkgewotICAgICAgICAgICAgICAgIG9wal9tYXJrZXJfaW5mb190ICpuZXdfbWFya2VyOwotICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPm1heG1hcmtudW0gPSAoT1BKX1VJTlQzMikoMTAwICsgKE9QSl9GTE9BVDMyKSBjc3RyX2luZGV4LT5tYXhtYXJrbnVtKTsKLSAgICAgICAgICAgICAgICBuZXdfbWFya2VyID0gKG9wal9tYXJrZXJfaW5mb190ICopIG9wal9yZWFsbG9jKGNzdHJfaW5kZXgtPm1hcmtlciwgY3N0cl9pbmRleC0+bWF4bWFya251bSAqc2l6ZW9mKG9wal9tYXJrZXJfaW5mb190KSk7Ci0gICAgICAgICAgICAgICAgaWYgKCEgbmV3X21hcmtlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUoY3N0cl9pbmRleC0+bWFya2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPm1hcmtlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT5tYXhtYXJrbnVtID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPm1hcmtudW0gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCBtaCBtYXJrZXJcbiIpOyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+bWFya2VyID0gbmV3X21hcmtlcjsKKyAgICAvKiBleHBhbmQgdGhlIGxpc3Q/ICovCisgICAgaWYgKChjc3RyX2luZGV4LT5tYXJrbnVtICsgMSkgPiBjc3RyX2luZGV4LT5tYXhtYXJrbnVtKSB7CisgICAgICAgIG9wal9tYXJrZXJfaW5mb190ICpuZXdfbWFya2VyOworICAgICAgICBjc3RyX2luZGV4LT5tYXhtYXJrbnVtID0gKE9QSl9VSU5UMzIpKDEwMCArIChPUEpfRkxPQVQzMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT5tYXhtYXJrbnVtKTsKKyAgICAgICAgbmV3X21hcmtlciA9IChvcGpfbWFya2VyX2luZm9fdCAqKSBvcGpfcmVhbGxvYyhjc3RyX2luZGV4LT5tYXJrZXIsCisgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT5tYXhtYXJrbnVtICogc2l6ZW9mKG9wal9tYXJrZXJfaW5mb190KSk7CisgICAgICAgIGlmICghIG5ld19tYXJrZXIpIHsKKyAgICAgICAgICAgIG9wal9mcmVlKGNzdHJfaW5kZXgtPm1hcmtlcik7CisgICAgICAgICAgICBjc3RyX2luZGV4LT5tYXJrZXIgPSBOVUxMOworICAgICAgICAgICAgY3N0cl9pbmRleC0+bWF4bWFya251bSA9IDA7CisgICAgICAgICAgICBjc3RyX2luZGV4LT5tYXJrbnVtID0gMDsKKyAgICAgICAgICAgIC8qIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhZGQgbWggbWFya2VyXG4iKTsgKi8KKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgICAgIH0KKyAgICAgICAgY3N0cl9pbmRleC0+bWFya2VyID0gbmV3X21hcmtlcjsKKyAgICB9CiAKLSAgICAgICAgLyogYWRkIHRoZSBtYXJrZXIgKi8KLSAgICAgICAgY3N0cl9pbmRleC0+bWFya2VyW2NzdHJfaW5kZXgtPm1hcmtudW1dLnR5cGUgPSAoT1BKX1VJTlQxNil0eXBlOwotICAgICAgICBjc3RyX2luZGV4LT5tYXJrZXJbY3N0cl9pbmRleC0+bWFya251bV0ucG9zID0gKE9QSl9JTlQzMilwb3M7Ci0gICAgICAgIGNzdHJfaW5kZXgtPm1hcmtlcltjc3RyX2luZGV4LT5tYXJrbnVtXS5sZW4gPSAoT1BKX0lOVDMyKWxlbjsKLSAgICAgICAgY3N0cl9pbmRleC0+bWFya251bSsrOwotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgLyogYWRkIHRoZSBtYXJrZXIgKi8KKyAgICBjc3RyX2luZGV4LT5tYXJrZXJbY3N0cl9pbmRleC0+bWFya251bV0udHlwZSA9IChPUEpfVUlOVDE2KXR5cGU7CisgICAgY3N0cl9pbmRleC0+bWFya2VyW2NzdHJfaW5kZXgtPm1hcmtudW1dLnBvcyA9IChPUEpfSU5UMzIpcG9zOworICAgIGNzdHJfaW5kZXgtPm1hcmtlcltjc3RyX2luZGV4LT5tYXJrbnVtXS5sZW4gPSAoT1BKX0lOVDMyKWxlbjsKKyAgICBjc3RyX2luZGV4LT5tYXJrbnVtKys7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19hZGRfdGxtYXJrZXIoT1BKX1VJTlQzMiB0aWxlbm8sIG9wal9jb2Rlc3RyZWFtX2luZGV4X3QgKmNzdHJfaW5kZXgsIE9QSl9VSU5UMzIgdHlwZSwgT1BKX09GRl9UIHBvcywgT1BKX1VJTlQzMiBsZW4pCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19hZGRfdGxtYXJrZXIoT1BKX1VJTlQzMiB0aWxlbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqY3N0cl9pbmRleCwgT1BKX1VJTlQzMiB0eXBlLCBPUEpfT0ZGX1QgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGVuKQogewotICAgICAgICBhc3NlcnQoY3N0cl9pbmRleCAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChjc3RyX2luZGV4LT50aWxlX2luZGV4ICE9IDAwKTsKKyAgICBhc3NlcnQoY3N0cl9pbmRleCAhPSAwMCk7CisgICAgYXNzZXJ0KGNzdHJfaW5kZXgtPnRpbGVfaW5kZXggIT0gMDApOwogCi0gICAgICAgIC8qIGV4cGFuZCB0aGUgbGlzdD8gKi8KLSAgICAgICAgaWYgKChjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWFya251bSArIDEpID4gY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1heG1hcmtudW0pIHsKLSAgICAgICAgICAgICAgICBvcGpfbWFya2VyX2luZm9fdCAqbmV3X21hcmtlcjsKLSAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWF4bWFya251bSA9IChPUEpfVUlOVDMyKSgxMDAgKyAoT1BKX0ZMT0FUMzIpIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXhtYXJrbnVtKTsKLSAgICAgICAgICAgICAgICBuZXdfbWFya2VyID0gKG9wal9tYXJrZXJfaW5mb190ICopIG9wal9yZWFsbG9jKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWFya2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWF4bWFya251bSAqc2l6ZW9mKG9wal9tYXJrZXJfaW5mb190KSk7Ci0gICAgICAgICAgICAgICAgaWYgKCEgbmV3X21hcmtlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUoY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1hcmtlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWFya2VyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXhtYXJrbnVtID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXJrbnVtID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhZGQgdGwgbWFya2VyXG4iKTsgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXJrZXIgPSBuZXdfbWFya2VyOworICAgIC8qIGV4cGFuZCB0aGUgbGlzdD8gKi8KKyAgICBpZiAoKGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXJrbnVtICsgMSkgPgorICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1heG1hcmtudW0pIHsKKyAgICAgICAgb3BqX21hcmtlcl9pbmZvX3QgKm5ld19tYXJrZXI7CisgICAgICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXhtYXJrbnVtID0gKE9QSl9VSU5UMzIpKDEwMCArCisgICAgICAgICAgICAgICAgKE9QSl9GTE9BVDMyKSBjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWF4bWFya251bSk7CisgICAgICAgIG5ld19tYXJrZXIgPSAob3BqX21hcmtlcl9pbmZvX3QgKikgb3BqX3JlYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1hcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWF4bWFya251bSAqIHNpemVvZihvcGpfbWFya2VyX2luZm9fdCkpOworICAgICAgICBpZiAoISBuZXdfbWFya2VyKSB7CisgICAgICAgICAgICBvcGpfZnJlZShjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWFya2VyKTsKKyAgICAgICAgICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXJrZXIgPSBOVUxMOworICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1heG1hcmtudW0gPSAwOworICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1hcmtudW0gPSAwOworICAgICAgICAgICAgLyogb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCB0bCBtYXJrZXJcbiIpOyAqLworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWFya2VyID0gbmV3X21hcmtlcjsKKyAgICB9CisKKyAgICAvKiBhZGQgdGhlIG1hcmtlciAqLworICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXJrZXJbY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1hcmtudW1dLnR5cGUKKyAgICAgICAgPSAoT1BKX1VJTlQxNil0eXBlOworICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXJrZXJbY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1hcmtudW1dLnBvcworICAgICAgICA9IChPUEpfSU5UMzIpcG9zOworICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXJrZXJbY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1hcmtudW1dLmxlbgorICAgICAgICA9IChPUEpfSU5UMzIpbGVuOworICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXJrbnVtKys7CisKKyAgICBpZiAodHlwZSA9PSBKMktfTVNfU09UKSB7CisgICAgICAgIE9QSl9VSU5UMzIgbF9jdXJyZW50X3RpbGVfcGFydCA9IGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5jdXJyZW50X3Rwc25vOworCisgICAgICAgIGlmIChjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10udHBfaW5kZXgpIHsKKyAgICAgICAgICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS50cF9pbmRleFtsX2N1cnJlbnRfdGlsZV9wYXJ0XS5zdGFydF9wb3MgPSBwb3M7CiAgICAgICAgIH0KIAotICAgICAgICAvKiBhZGQgdGhlIG1hcmtlciAqLwotICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWFya2VyW2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXJrbnVtXS50eXBlID0gKE9QSl9VSU5UMTYpdHlwZTsKLSAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1hcmtlcltjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWFya251bV0ucG9zID0gKE9QSl9JTlQzMilwb3M7Ci0gICAgICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbdGlsZW5vXS5tYXJrZXJbY3N0cl9pbmRleC0+dGlsZV9pbmRleFt0aWxlbm9dLm1hcmtudW1dLmxlbiA9IChPUEpfSU5UMzIpbGVuOwotICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10ubWFya251bSsrOwotCi0gICAgICAgIGlmICh0eXBlID09IEoyS19NU19TT1QpIHsKLSAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxfY3VycmVudF90aWxlX3BhcnQgPSBjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10uY3VycmVudF90cHNubzsKLQotICAgICAgICAgICAgICAgIGlmIChjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10udHBfaW5kZXgpCi0gICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4W3RpbGVub10udHBfaW5kZXhbbF9jdXJyZW50X3RpbGVfcGFydF0uc3RhcnRfcG9zID0gcG9zOwotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIH0KKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKIC8qCkBAIC02NzI5LDcgKzc0NjUsNyBAQAogT1BKX0JPT0wgb3BqX2oya19lbmRfZGVjb21wcmVzcyhvcGpfajJrX3QgKnBfajJrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewogICAgICh2b2lkKXBfajJrOwogICAgICh2b2lkKXBfc3RyZWFtOwpAQCAtNjczNywyNTgxICs3NDczLDI4OTIgQEAKICAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLU9QSl9CT09MIG9wal9qMmtfcmVhZF9oZWFkZXIoICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2oya190KiBwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90KiogcF9pbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCogcF9tYW5hZ2VyICkKK09QSl9CT09MIG9wal9qMmtfcmVhZF9oZWFkZXIob3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfajJrX3QqIHBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCoqIHBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCogcF9tYW5hZ2VyKQogewotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CiAKLSAgICAgICAgLyogY3JlYXRlIGFuIGVtcHR5IGltYWdlIGhlYWRlciAqLwotICAgICAgICBwX2oyay0+bV9wcml2YXRlX2ltYWdlID0gb3BqX2ltYWdlX2NyZWF0ZTAoKTsKLSAgICAgICAgaWYgKCEgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICAvKiBjcmVhdGUgYW4gZW1wdHkgaW1hZ2UgaGVhZGVyICovCisgICAgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZSA9IG9wal9pbWFnZV9jcmVhdGUwKCk7CisgICAgaWYgKCEgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICAvKiBjdXN0b21pemF0aW9uIG9mIHRoZSB2YWxpZGF0aW9uICovCi0gICAgICAgIGlmICghIG9wal9qMmtfc2V0dXBfZGVjb2RpbmdfdmFsaWRhdGlvbihwX2oyaywgcF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIG9wal9pbWFnZV9kZXN0cm95KHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICAvKiBjdXN0b21pemF0aW9uIG9mIHRoZSB2YWxpZGF0aW9uICovCisgICAgaWYgKCEgb3BqX2oya19zZXR1cF9kZWNvZGluZ192YWxpZGF0aW9uKHBfajJrLCBwX21hbmFnZXIpKSB7CisgICAgICAgIG9wal9pbWFnZV9kZXN0cm95KHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpOworICAgICAgICBwX2oyay0+bV9wcml2YXRlX2ltYWdlID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgLyogdmFsaWRhdGlvbiBvZiB0aGUgcGFyYW1ldGVycyBjb2RlYyAqLwotICAgICAgICBpZiAoISBvcGpfajJrX2V4ZWMocF9qMmssIHBfajJrLT5tX3ZhbGlkYXRpb25fbGlzdCwgcF9zdHJlYW0scF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIG9wal9pbWFnZV9kZXN0cm95KHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICAvKiB2YWxpZGF0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzIGNvZGVjICovCisgICAgaWYgKCEgb3BqX2oya19leGVjKHBfajJrLCBwX2oyay0+bV92YWxpZGF0aW9uX2xpc3QsIHBfc3RyZWFtLCBwX21hbmFnZXIpKSB7CisgICAgICAgIG9wal9pbWFnZV9kZXN0cm95KHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpOworICAgICAgICBwX2oyay0+bV9wcml2YXRlX2ltYWdlID0gTlVMTDsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgLyogY3VzdG9taXphdGlvbiBvZiB0aGUgZW5jb2RpbmcgKi8KLSAgICAgICAgaWYgKCEgb3BqX2oya19zZXR1cF9oZWFkZXJfcmVhZGluZyhwX2oyaywgcF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIG9wal9pbWFnZV9kZXN0cm95KHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UgPSBOVUxMOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICAvKiBjdXN0b21pemF0aW9uIG9mIHRoZSBlbmNvZGluZyAqLworICAgIGlmICghIG9wal9qMmtfc2V0dXBfaGVhZGVyX3JlYWRpbmcocF9qMmssIHBfbWFuYWdlcikpIHsKKyAgICAgICAgb3BqX2ltYWdlX2Rlc3Ryb3kocF9qMmstPm1fcHJpdmF0ZV9pbWFnZSk7CisgICAgICAgIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UgPSBOVUxMOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICAvKiByZWFkIGhlYWRlciAqLwotICAgICAgICBpZiAoISBvcGpfajJrX2V4ZWMgKHBfajJrLHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfZGVzdHJveShwX2oyay0+bV9wcml2YXRlX2ltYWdlKTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9wcml2YXRlX2ltYWdlID0gTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgLyogcmVhZCBoZWFkZXIgKi8KKyAgICBpZiAoISBvcGpfajJrX2V4ZWMocF9qMmssIHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LCBwX3N0cmVhbSwgcF9tYW5hZ2VyKSkgeworICAgICAgICBvcGpfaW1hZ2VfZGVzdHJveShwX2oyay0+bV9wcml2YXRlX2ltYWdlKTsKKyAgICAgICAgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZSA9IE5VTEw7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgICpwX2ltYWdlID0gb3BqX2ltYWdlX2NyZWF0ZTAoKTsKLSAgICAgICAgaWYgKCEgKCpwX2ltYWdlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICAqcF9pbWFnZSA9IG9wal9pbWFnZV9jcmVhdGUwKCk7CisgICAgaWYgKCEoKnBfaW1hZ2UpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIC8qIENvcHkgY29kZXN0cmVhbSBpbWFnZSBpbmZvcm1hdGlvbiB0byB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgICAgIG9wal9jb3B5X2ltYWdlX2hlYWRlcihwX2oyay0+bV9wcml2YXRlX2ltYWdlLCAqcF9pbWFnZSk7CisgICAgLyogQ29weSBjb2Rlc3RyZWFtIGltYWdlIGluZm9ybWF0aW9uIHRvIHRoZSBvdXRwdXQgaW1hZ2UgKi8KKyAgICBvcGpfY29weV9pbWFnZV9oZWFkZXIocF9qMmstPm1fcHJpdmF0ZV9pbWFnZSwgKnBfaW1hZ2UpOwogCiAgICAgLypBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBzb21lIGVsZW1lbnRzIG9mIGNvZGVzdHJlbSBpbmRleCovCi0gICAgICAgIGlmICghb3BqX2oya19hbGxvY2F0ZV90aWxlX2VsZW1lbnRfY3N0cl9pbmRleChwX2oyaykpewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICBpZiAoIW9wal9qMmtfYWxsb2NhdGVfdGlsZV9lbGVtZW50X2NzdHJfaW5kZXgocF9qMmspKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3NldHVwX2hlYWRlcl9yZWFkaW5nIChvcGpfajJrX3QgKnBfajJrLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19zZXR1cF9oZWFkZXJfcmVhZGluZyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCiB7Ci0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0gICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfcmVhZF9oZWFkZXJfcHJvY2VkdXJlLCBwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGpfcHJvY2VkdXJlKW9wal9qMmtfcmVhZF9oZWFkZXJfcHJvY2VkdXJlLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIC8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSBwcm9jZWR1cmVzICovCi0gICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfY29weV9kZWZhdWx0X3RjcF9hbmRfY3JlYXRlX3RjZCwgcF9tYW5hZ2VyKSkgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0JCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAvKiBERVZFTE9QRVIgQ09STkVSLCBhZGQgeW91ciBjdXN0b20gcHJvY2VkdXJlcyAqLworICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGpfcHJvY2VkdXJlKW9wal9qMmtfY29weV9kZWZhdWx0X3RjcF9hbmRfY3JlYXRlX3RjZCwgcF9tYW5hZ2VyKSkgIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3NldHVwX2RlY29kaW5nX3ZhbGlkYXRpb24gKG9wal9qMmtfdCAqcF9qMmssIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3NldHVwX2RlY29kaW5nX3ZhbGlkYXRpb24ob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQogewotICAgICAgICAvKiBwcmVjb25kaXRpb25zKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyovCisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKIAotICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV92YWxpZGF0aW9uX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya19idWlsZF9kZWNvZGVyLCBwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV92YWxpZGF0aW9uX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya19kZWNvZGluZ192YWxpZGF0aW9uLCBwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3ZhbGlkYXRpb25fbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3BqX3Byb2NlZHVyZSlvcGpfajJrX2J1aWxkX2RlY29kZXIsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fdmFsaWRhdGlvbl9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGpfcHJvY2VkdXJlKW9wal9qMmtfZGVjb2RpbmdfdmFsaWRhdGlvbiwgcF9tYW5hZ2VyKSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICAvKiBERVZFTE9QRVIgQ09STkVSLCBhZGQgeW91ciBjdXN0b20gdmFsaWRhdGlvbiBwcm9jZWR1cmUgKi8KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIC8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSB2YWxpZGF0aW9uIHByb2NlZHVyZSAqLworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfbWN0X3ZhbGlkYXRpb24gKCAgICAgICBvcGpfajJrX3QgKiBwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX21jdF92YWxpZGF0aW9uKG9wal9qMmtfdCAqIHBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQogewotICAgICAgICBPUEpfQk9PTCBsX2lzX3ZhbGlkID0gT1BKX1RSVUU7Ci0gICAgICAgIE9QSl9VSU5UMzIgaSxqOworICAgIE9QSl9CT09MIGxfaXNfdmFsaWQgPSBPUEpfVFJVRTsKKyAgICBPUEpfVUlOVDMyIGksIGo7CiAKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0gICAgICAgIGlmICgocF9qMmstPm1fY3AucnNpeiAmIDB4ODIwMCkgPT0gMHg4MjAwKSB7Ci0gICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzID0gcF9qMmstPm1fY3AudGggKiBwX2oyay0+bV9jcC50dzsKLSAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKiBsX3RjcCA9IHBfajJrLT5tX2NwLnRjcHM7CisgICAgT1BKX1VOVVNFRChwX3N0cmVhbSk7CisgICAgT1BKX1VOVVNFRChwX21hbmFnZXIpOwogCi0gICAgICAgICAgICAgICAgZm9yIChpPTA7aTxsX25iX3RpbGVzOysraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfdGNwLT5tY3QgPT0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNjcF90ICogbF90Y2NwID0gbF90Y3AtPnRjY3BzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2lzX3ZhbGlkICY9IChsX3RjcC0+bV9tY3RfY29kaW5nX21hdHJpeCAhPSAwMCk7CisgICAgaWYgKChwX2oyay0+bV9jcC5yc2l6ICYgMHg4MjAwKSA9PSAweDgyMDApIHsKKyAgICAgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzID0gcF9qMmstPm1fY3AudGggKiBwX2oyay0+bV9jcC50dzsKKyAgICAgICAgb3BqX3RjcF90ICogbF90Y3AgPSBwX2oyay0+bV9jcC50Y3BzOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8cF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHM7KytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9pc192YWxpZCAmPSAhIChsX3RjY3AtPnFtZmJpZCAmIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF90Y2NwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICArK2xfdGNwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF9uYl90aWxlczsgKytpKSB7CisgICAgICAgICAgICBpZiAobF90Y3AtPm1jdCA9PSAyKSB7CisgICAgICAgICAgICAgICAgb3BqX3RjY3BfdCAqIGxfdGNjcCA9IGxfdGNwLT50Y2NwczsKKyAgICAgICAgICAgICAgICBsX2lzX3ZhbGlkICY9IChsX3RjcC0+bV9tY3RfY29kaW5nX21hdHJpeCAhPSAwMCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHM7ICsraikgeworICAgICAgICAgICAgICAgICAgICBsX2lzX3ZhbGlkICY9ICEobF90Y2NwLT5xbWZiaWQgJiAxKTsKKyAgICAgICAgICAgICAgICAgICAgKytsX3RjY3A7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKytsX3RjcDsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICByZXR1cm4gbF9pc192YWxpZDsKKyAgICByZXR1cm4gbF9pc192YWxpZDsKIH0KIAogT1BKX0JPT0wgb3BqX2oya19zZXR1cF9tY3RfZW5jb2Rpbmcob3BqX3RjcF90ICogcF90Y3AsIG9wal9pbWFnZV90ICogcF9pbWFnZSkKIHsKLSAgICAgICAgT1BKX1VJTlQzMiBpOwotICAgICAgICBPUEpfVUlOVDMyIGxfaW5kaXggPSAxOwotICAgICAgICBvcGpfbWN0X2RhdGFfdCAqIGxfbWN0X2RlY29fZGF0YSA9IDAwLCogbF9tY3Rfb2Zmc2V0X2RhdGEgPSAwMDsKLSAgICAgICAgb3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QgKiBsX21jY19kYXRhOwotICAgICAgICBPUEpfVUlOVDMyIGxfbWN0X3NpemUsbF9uYl9lbGVtOwotICAgICAgICBPUEpfRkxPQVQzMiAqIGxfZGF0YSwgKiBsX2N1cnJlbnRfZGF0YTsKLSAgICAgICAgb3BqX3RjY3BfdCAqIGxfdGNjcDsKKyAgICBPUEpfVUlOVDMyIGk7CisgICAgT1BKX1VJTlQzMiBsX2luZGl4ID0gMTsKKyAgICBvcGpfbWN0X2RhdGFfdCAqIGxfbWN0X2RlY29fZGF0YSA9IDAwLCAqIGxfbWN0X29mZnNldF9kYXRhID0gMDA7CisgICAgb3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QgKiBsX21jY19kYXRhOworICAgIE9QSl9VSU5UMzIgbF9tY3Rfc2l6ZSwgbF9uYl9lbGVtOworICAgIE9QSl9GTE9BVDMyICogbF9kYXRhLCAqIGxfY3VycmVudF9kYXRhOworICAgIG9wal90Y2NwX3QgKiBsX3RjY3A7CiAKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF90Y3AgIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF90Y3AgIT0gMDApOwogCi0gICAgICAgIGlmIChwX3RjcC0+bWN0ICE9IDIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgICAgIH0KKyAgICBpZiAocF90Y3AtPm1jdCAhPSAyKSB7CisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICB9CiAKLSAgICAgICAgaWYgKHBfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgpIHsKLSAgICAgICAgICAgICAgICBpZiAocF90Y3AtPm1fbmJfbWN0X3JlY29yZHMgPT0gcF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfbWN0X2RhdGFfdCAqbmV3X21jdF9yZWNvcmRzOwotICAgICAgICAgICAgICAgICAgICAgICAgcF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzICs9IE9QSl9KMktfTUNUX0RFRkFVTFRfTkJfUkVDT1JEUzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3X21jdF9yZWNvcmRzID0gKG9wal9tY3RfZGF0YV90ICopIG9wal9yZWFsbG9jKHBfdGNwLT5tX21jdF9yZWNvcmRzLCBwX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgKiBzaXplb2Yob3BqX21jdF9kYXRhX3QpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG5ld19tY3RfcmVjb3JkcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX3RjcC0+bV9tY3RfcmVjb3Jkcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNwLT5tX21jdF9yZWNvcmRzID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90Y3AtPm1fbmJfbWN0X3JlY29yZHMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gc2V0dXAgbWN0IGVuY29kaW5nXG4iKTsgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNwLT5tX21jdF9yZWNvcmRzID0gbmV3X21jdF9yZWNvcmRzOwotICAgICAgICAgICAgICAgICAgICAgICAgbF9tY3RfZGVjb19kYXRhID0gcF90Y3AtPm1fbWN0X3JlY29yZHMgKyBwX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGxfbWN0X2RlY29fZGF0YSAsMCwocF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzIC0gcF90Y3AtPm1fbmJfbWN0X3JlY29yZHMpICogc2l6ZW9mKG9wal9tY3RfZGF0YV90KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxfbWN0X2RlY29fZGF0YSA9IHBfdGNwLT5tX21jdF9yZWNvcmRzICsgcF90Y3AtPm1fbmJfbWN0X3JlY29yZHM7Ci0KLSAgICAgICAgICAgICAgICBpZiAobF9tY3RfZGVjb19kYXRhLT5tX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfbWN0X2RlY29fZGF0YS0+bV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfbWN0X2RlY29fZGF0YS0+bV9kYXRhID0gMDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbF9tY3RfZGVjb19kYXRhLT5tX2luZGV4ID0gbF9pbmRpeCsrOwotICAgICAgICAgICAgICAgIGxfbWN0X2RlY29fZGF0YS0+bV9hcnJheV90eXBlID0gTUNUX1RZUEVfREVDT1JSRUxBVElPTjsKLSAgICAgICAgICAgICAgICBsX21jdF9kZWNvX2RhdGEtPm1fZWxlbWVudF90eXBlID0gTUNUX1RZUEVfRkxPQVQ7Ci0gICAgICAgICAgICAgICAgbF9uYl9lbGVtID0gcF9pbWFnZS0+bnVtY29tcHMgKiBwX2ltYWdlLT5udW1jb21wczsKLSAgICAgICAgICAgICAgICBsX21jdF9zaXplID0gbF9uYl9lbGVtICogTUNUX0VMRU1FTlRfU0laRVtsX21jdF9kZWNvX2RhdGEtPm1fZWxlbWVudF90eXBlXTsKLSAgICAgICAgICAgICAgICBsX21jdF9kZWNvX2RhdGEtPm1fZGF0YSA9IChPUEpfQllURSopb3BqX21hbGxvYyhsX21jdF9zaXplICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoISBsX21jdF9kZWNvX2RhdGEtPm1fZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBqMmtfbWN0X3dyaXRlX2Z1bmN0aW9uc19mcm9tX2Zsb2F0W2xfbWN0X2RlY29fZGF0YS0+bV9lbGVtZW50X3R5cGVdKHBfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgsbF9tY3RfZGVjb19kYXRhLT5tX2RhdGEsbF9uYl9lbGVtKTsKLQotICAgICAgICAgICAgICAgIGxfbWN0X2RlY29fZGF0YS0+bV9kYXRhX3NpemUgPSBsX21jdF9zaXplOwotICAgICAgICAgICAgICAgICsrcF90Y3AtPm1fbmJfbWN0X3JlY29yZHM7Ci0gICAgICAgIH0KLQorICAgIGlmIChwX3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4KSB7CiAgICAgICAgIGlmIChwX3RjcC0+bV9uYl9tY3RfcmVjb3JkcyA9PSBwX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMpIHsKLSAgICAgICAgICAgICAgICBvcGpfbWN0X2RhdGFfdCAqbmV3X21jdF9yZWNvcmRzOwotICAgICAgICAgICAgICAgIHBfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyArPSBPUEpfSjJLX01DVF9ERUZBVUxUX05CX1JFQ09SRFM7Ci0gICAgICAgICAgICAgICAgbmV3X21jdF9yZWNvcmRzID0gKG9wal9tY3RfZGF0YV90ICopIG9wal9yZWFsbG9jKHBfdGNwLT5tX21jdF9yZWNvcmRzLCBwX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgKiBzaXplb2Yob3BqX21jdF9kYXRhX3QpKTsKLSAgICAgICAgICAgICAgICBpZiAoISBuZXdfbWN0X3JlY29yZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfdGNwLT5tX21jdF9yZWNvcmRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNwLT5tX21jdF9yZWNvcmRzID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX3RjcC0+bV9uYl9tY3RfcmVjb3JkcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gc2V0dXAgbWN0IGVuY29kaW5nXG4iKTsgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBfdGNwLT5tX21jdF9yZWNvcmRzID0gbmV3X21jdF9yZWNvcmRzOwotICAgICAgICAgICAgICAgIGxfbWN0X29mZnNldF9kYXRhID0gcF90Y3AtPm1fbWN0X3JlY29yZHMgKyBwX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsKKyAgICAgICAgICAgIG9wal9tY3RfZGF0YV90ICpuZXdfbWN0X3JlY29yZHM7CisgICAgICAgICAgICBwX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgKz0gT1BKX0oyS19NQ1RfREVGQVVMVF9OQl9SRUNPUkRTOwogCi0gICAgICAgICAgICAgICAgbWVtc2V0KGxfbWN0X29mZnNldF9kYXRhICwwLChwX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgLSBwX3RjcC0+bV9uYl9tY3RfcmVjb3JkcykgKiBzaXplb2Yob3BqX21jdF9kYXRhX3QpKTsKKyAgICAgICAgICAgIG5ld19tY3RfcmVjb3JkcyA9IChvcGpfbWN0X2RhdGFfdCAqKSBvcGpfcmVhbGxvYyhwX3RjcC0+bV9tY3RfcmVjb3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyAqIHNpemVvZihvcGpfbWN0X2RhdGFfdCkpOworICAgICAgICAgICAgaWYgKCEgbmV3X21jdF9yZWNvcmRzKSB7CisgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF90Y3AtPm1fbWN0X3JlY29yZHMpOworICAgICAgICAgICAgICAgIHBfdGNwLT5tX21jdF9yZWNvcmRzID0gTlVMTDsKKyAgICAgICAgICAgICAgICBwX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgPSAwOworICAgICAgICAgICAgICAgIHBfdGNwLT5tX25iX21jdF9yZWNvcmRzID0gMDsKKyAgICAgICAgICAgICAgICAvKiBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gc2V0dXAgbWN0IGVuY29kaW5nXG4iKTsgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcF90Y3AtPm1fbWN0X3JlY29yZHMgPSBuZXdfbWN0X3JlY29yZHM7CisgICAgICAgICAgICBsX21jdF9kZWNvX2RhdGEgPSBwX3RjcC0+bV9tY3RfcmVjb3JkcyArIHBfdGNwLT5tX25iX21jdF9yZWNvcmRzOwogCi0gICAgICAgICAgICAgICAgaWYgKGxfbWN0X2RlY29fZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9tY3RfZGVjb19kYXRhID0gbF9tY3Rfb2Zmc2V0X2RhdGEgLSAxOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbXNldChsX21jdF9kZWNvX2RhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgKHBfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyAtIHBfdGNwLT5tX25iX21jdF9yZWNvcmRzKSAqIHNpemVvZigKKyAgICAgICAgICAgICAgICAgICAgICAgb3BqX21jdF9kYXRhX3QpKTsKKyAgICAgICAgfQorICAgICAgICBsX21jdF9kZWNvX2RhdGEgPSBwX3RjcC0+bV9tY3RfcmVjb3JkcyArIHBfdGNwLT5tX25iX21jdF9yZWNvcmRzOworCisgICAgICAgIGlmIChsX21jdF9kZWNvX2RhdGEtPm1fZGF0YSkgeworICAgICAgICAgICAgb3BqX2ZyZWUobF9tY3RfZGVjb19kYXRhLT5tX2RhdGEpOworICAgICAgICAgICAgbF9tY3RfZGVjb19kYXRhLT5tX2RhdGEgPSAwMDsKICAgICAgICAgfQogCisgICAgICAgIGxfbWN0X2RlY29fZGF0YS0+bV9pbmRleCA9IGxfaW5kaXgrKzsKKyAgICAgICAgbF9tY3RfZGVjb19kYXRhLT5tX2FycmF5X3R5cGUgPSBNQ1RfVFlQRV9ERUNPUlJFTEFUSU9OOworICAgICAgICBsX21jdF9kZWNvX2RhdGEtPm1fZWxlbWVudF90eXBlID0gTUNUX1RZUEVfRkxPQVQ7CisgICAgICAgIGxfbmJfZWxlbSA9IHBfaW1hZ2UtPm51bWNvbXBzICogcF9pbWFnZS0+bnVtY29tcHM7CisgICAgICAgIGxfbWN0X3NpemUgPSBsX25iX2VsZW0gKiBNQ1RfRUxFTUVOVF9TSVpFW2xfbWN0X2RlY29fZGF0YS0+bV9lbGVtZW50X3R5cGVdOworICAgICAgICBsX21jdF9kZWNvX2RhdGEtPm1fZGF0YSA9IChPUEpfQllURSopb3BqX21hbGxvYyhsX21jdF9zaXplKTsKKworICAgICAgICBpZiAoISBsX21jdF9kZWNvX2RhdGEtPm1fZGF0YSkgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGoya19tY3Rfd3JpdGVfZnVuY3Rpb25zX2Zyb21fZmxvYXRbbF9tY3RfZGVjb19kYXRhLT5tX2VsZW1lbnRfdHlwZV0oCisgICAgICAgICAgICBwX3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4LCBsX21jdF9kZWNvX2RhdGEtPm1fZGF0YSwgbF9uYl9lbGVtKTsKKworICAgICAgICBsX21jdF9kZWNvX2RhdGEtPm1fZGF0YV9zaXplID0gbF9tY3Rfc2l6ZTsKKyAgICAgICAgKytwX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsKKyAgICB9CisKKyAgICBpZiAocF90Y3AtPm1fbmJfbWN0X3JlY29yZHMgPT0gcF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzKSB7CisgICAgICAgIG9wal9tY3RfZGF0YV90ICpuZXdfbWN0X3JlY29yZHM7CisgICAgICAgIHBfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyArPSBPUEpfSjJLX01DVF9ERUZBVUxUX05CX1JFQ09SRFM7CisgICAgICAgIG5ld19tY3RfcmVjb3JkcyA9IChvcGpfbWN0X2RhdGFfdCAqKSBvcGpfcmVhbGxvYyhwX3RjcC0+bV9tY3RfcmVjb3JkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzICogc2l6ZW9mKG9wal9tY3RfZGF0YV90KSk7CisgICAgICAgIGlmICghIG5ld19tY3RfcmVjb3JkcykgeworICAgICAgICAgICAgb3BqX2ZyZWUocF90Y3AtPm1fbWN0X3JlY29yZHMpOworICAgICAgICAgICAgcF90Y3AtPm1fbWN0X3JlY29yZHMgPSBOVUxMOworICAgICAgICAgICAgcF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzID0gMDsKKyAgICAgICAgICAgIHBfdGNwLT5tX25iX21jdF9yZWNvcmRzID0gMDsKKyAgICAgICAgICAgIC8qIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBzZXR1cCBtY3QgZW5jb2RpbmdcbiIpOyAqLworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBwX3RjcC0+bV9tY3RfcmVjb3JkcyA9IG5ld19tY3RfcmVjb3JkczsKICAgICAgICAgbF9tY3Rfb2Zmc2V0X2RhdGEgPSBwX3RjcC0+bV9tY3RfcmVjb3JkcyArIHBfdGNwLT5tX25iX21jdF9yZWNvcmRzOwogCi0gICAgICAgIGlmIChsX21jdF9vZmZzZXRfZGF0YS0+bV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZGF0YSk7Ci0gICAgICAgICAgICAgICAgbF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZGF0YSA9IDAwOworICAgICAgICBtZW1zZXQobF9tY3Rfb2Zmc2V0X2RhdGEsIDAsCisgICAgICAgICAgICAgICAocF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzIC0gcF90Y3AtPm1fbmJfbWN0X3JlY29yZHMpICogc2l6ZW9mKAorICAgICAgICAgICAgICAgICAgIG9wal9tY3RfZGF0YV90KSk7CisKKyAgICAgICAgaWYgKGxfbWN0X2RlY29fZGF0YSkgeworICAgICAgICAgICAgbF9tY3RfZGVjb19kYXRhID0gbF9tY3Rfb2Zmc2V0X2RhdGEgLSAxOwogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIGxfbWN0X29mZnNldF9kYXRhLT5tX2luZGV4ID0gbF9pbmRpeCsrOwotICAgICAgICBsX21jdF9vZmZzZXRfZGF0YS0+bV9hcnJheV90eXBlID0gTUNUX1RZUEVfT0ZGU0VUOwotICAgICAgICBsX21jdF9vZmZzZXRfZGF0YS0+bV9lbGVtZW50X3R5cGUgPSBNQ1RfVFlQRV9GTE9BVDsKLSAgICAgICAgbF9uYl9lbGVtID0gcF9pbWFnZS0+bnVtY29tcHM7Ci0gICAgICAgIGxfbWN0X3NpemUgPSBsX25iX2VsZW0gKiBNQ1RfRUxFTUVOVF9TSVpFW2xfbWN0X29mZnNldF9kYXRhLT5tX2VsZW1lbnRfdHlwZV07Ci0gICAgICAgIGxfbWN0X29mZnNldF9kYXRhLT5tX2RhdGEgPSAoT1BKX0JZVEUqKW9wal9tYWxsb2MobF9tY3Rfc2l6ZSApOworICAgIGxfbWN0X29mZnNldF9kYXRhID0gcF90Y3AtPm1fbWN0X3JlY29yZHMgKyBwX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsKIAotICAgICAgICBpZiAoISBsX21jdF9vZmZzZXRfZGF0YS0+bV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICBpZiAobF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZGF0YSkgeworICAgICAgICBvcGpfZnJlZShsX21jdF9vZmZzZXRfZGF0YS0+bV9kYXRhKTsKKyAgICAgICAgbF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZGF0YSA9IDAwOworICAgIH0KKworICAgIGxfbWN0X29mZnNldF9kYXRhLT5tX2luZGV4ID0gbF9pbmRpeCsrOworICAgIGxfbWN0X29mZnNldF9kYXRhLT5tX2FycmF5X3R5cGUgPSBNQ1RfVFlQRV9PRkZTRVQ7CisgICAgbF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZWxlbWVudF90eXBlID0gTUNUX1RZUEVfRkxPQVQ7CisgICAgbF9uYl9lbGVtID0gcF9pbWFnZS0+bnVtY29tcHM7CisgICAgbF9tY3Rfc2l6ZSA9IGxfbmJfZWxlbSAqIE1DVF9FTEVNRU5UX1NJWkVbbF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZWxlbWVudF90eXBlXTsKKyAgICBsX21jdF9vZmZzZXRfZGF0YS0+bV9kYXRhID0gKE9QSl9CWVRFKilvcGpfbWFsbG9jKGxfbWN0X3NpemUpOworCisgICAgaWYgKCEgbF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZGF0YSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIGxfZGF0YSA9IChPUEpfRkxPQVQzMiopb3BqX21hbGxvYyhsX25iX2VsZW0gKiBzaXplb2YoT1BKX0ZMT0FUMzIpKTsKKyAgICBpZiAoISBsX2RhdGEpIHsKKyAgICAgICAgb3BqX2ZyZWUobF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZGF0YSk7CisgICAgICAgIGxfbWN0X29mZnNldF9kYXRhLT5tX2RhdGEgPSAwMDsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICBsX3RjY3AgPSBwX3RjcC0+dGNjcHM7CisgICAgbF9jdXJyZW50X2RhdGEgPSBsX2RhdGE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbF9uYl9lbGVtOyArK2kpIHsKKyAgICAgICAgKihsX2N1cnJlbnRfZGF0YSsrKSA9IChPUEpfRkxPQVQzMikobF90Y2NwLT5tX2RjX2xldmVsX3NoaWZ0KTsKKyAgICAgICAgKytsX3RjY3A7CisgICAgfQorCisgICAgajJrX21jdF93cml0ZV9mdW5jdGlvbnNfZnJvbV9mbG9hdFtsX21jdF9vZmZzZXRfZGF0YS0+bV9lbGVtZW50X3R5cGVdKGxfZGF0YSwKKyAgICAgICAgICAgIGxfbWN0X29mZnNldF9kYXRhLT5tX2RhdGEsIGxfbmJfZWxlbSk7CisKKyAgICBvcGpfZnJlZShsX2RhdGEpOworCisgICAgbF9tY3Rfb2Zmc2V0X2RhdGEtPm1fZGF0YV9zaXplID0gbF9tY3Rfc2l6ZTsKKworICAgICsrcF90Y3AtPm1fbmJfbWN0X3JlY29yZHM7CisKKyAgICBpZiAocF90Y3AtPm1fbmJfbWNjX3JlY29yZHMgPT0gcF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzKSB7CisgICAgICAgIG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90ICpuZXdfbWNjX3JlY29yZHM7CisgICAgICAgIHBfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkcyArPSBPUEpfSjJLX01DVF9ERUZBVUxUX05CX1JFQ09SRFM7CisgICAgICAgIG5ld19tY2NfcmVjb3JkcyA9IChvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCAqKSBvcGpfcmVhbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNwLT5tX21jY19yZWNvcmRzLCBwX3RjcC0+bV9uYl9tYXhfbWNjX3JlY29yZHMgKiBzaXplb2YoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QpKTsKKyAgICAgICAgaWYgKCEgbmV3X21jY19yZWNvcmRzKSB7CisgICAgICAgICAgICBvcGpfZnJlZShwX3RjcC0+bV9tY2NfcmVjb3Jkcyk7CisgICAgICAgICAgICBwX3RjcC0+bV9tY2NfcmVjb3JkcyA9IE5VTEw7CisgICAgICAgICAgICBwX3RjcC0+bV9uYl9tYXhfbWNjX3JlY29yZHMgPSAwOworICAgICAgICAgICAgcF90Y3AtPm1fbmJfbWNjX3JlY29yZHMgPSAwOworICAgICAgICAgICAgLyogb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHNldHVwIG1jdCBlbmNvZGluZ1xuIik7ICovCisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICB9Ci0KLSAgICAgICAgbF9kYXRhID0gKE9QSl9GTE9BVDMyKilvcGpfbWFsbG9jKGxfbmJfZWxlbSAqIHNpemVvZihPUEpfRkxPQVQzMikpOwotICAgICAgICBpZiAoISBsX2RhdGEpIHsKLSAgICAgICAgICAgICAgICBvcGpfZnJlZShsX21jdF9vZmZzZXRfZGF0YS0+bV9kYXRhKTsKLSAgICAgICAgICAgICAgICBsX21jdF9vZmZzZXRfZGF0YS0+bV9kYXRhID0gMDA7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIGxfdGNjcCA9IHBfdGNwLT50Y2NwczsKLSAgICAgICAgbF9jdXJyZW50X2RhdGEgPSBsX2RhdGE7Ci0KLSAgICAgICAgZm9yIChpPTA7aTxsX25iX2VsZW07KytpKSB7Ci0gICAgICAgICAgICAgICAgKihsX2N1cnJlbnRfZGF0YSsrKSA9IChPUEpfRkxPQVQzMikgKGxfdGNjcC0+bV9kY19sZXZlbF9zaGlmdCk7Ci0gICAgICAgICAgICAgICAgKytsX3RjY3A7Ci0gICAgICAgIH0KLQotICAgICAgICBqMmtfbWN0X3dyaXRlX2Z1bmN0aW9uc19mcm9tX2Zsb2F0W2xfbWN0X29mZnNldF9kYXRhLT5tX2VsZW1lbnRfdHlwZV0obF9kYXRhLGxfbWN0X29mZnNldF9kYXRhLT5tX2RhdGEsbF9uYl9lbGVtKTsKLQotICAgICAgICBvcGpfZnJlZShsX2RhdGEpOwotCi0gICAgICAgIGxfbWN0X29mZnNldF9kYXRhLT5tX2RhdGFfc2l6ZSA9IGxfbWN0X3NpemU7Ci0KLSAgICAgICAgKytwX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsKLQotICAgICAgICBpZiAocF90Y3AtPm1fbmJfbWNjX3JlY29yZHMgPT0gcF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QgKm5ld19tY2NfcmVjb3JkczsKLSAgICAgICAgICAgICAgICBwX3RjcC0+bV9uYl9tYXhfbWNjX3JlY29yZHMgKz0gT1BKX0oyS19NQ1RfREVGQVVMVF9OQl9SRUNPUkRTOwotICAgICAgICAgICAgICAgIG5ld19tY2NfcmVjb3JkcyA9IChvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCAqKSBvcGpfcmVhbGxvYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90Y3AtPm1fbWNjX3JlY29yZHMsIHBfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkcyAqIHNpemVvZihvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCkpOwotICAgICAgICAgICAgICAgIGlmICghIG5ld19tY2NfcmVjb3JkcykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF90Y3AtPm1fbWNjX3JlY29yZHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcF90Y3AtPm1fbWNjX3JlY29yZHMgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgcF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNwLT5tX25iX21jY19yZWNvcmRzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBzZXR1cCBtY3QgZW5jb2RpbmdcbiIpOyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcF90Y3AtPm1fbWNjX3JlY29yZHMgPSBuZXdfbWNjX3JlY29yZHM7Ci0gICAgICAgICAgICAgICAgbF9tY2NfZGF0YSA9IHBfdGNwLT5tX21jY19yZWNvcmRzICsgcF90Y3AtPm1fbmJfbWNjX3JlY29yZHM7Ci0gICAgICAgICAgICAgICAgbWVtc2V0KGxfbWNjX2RhdGEgLDAsKHBfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkcyAtIHBfdGNwLT5tX25iX21jY19yZWNvcmRzKSAqIHNpemVvZihvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCkpOwotCi0gICAgICAgIH0KLQorICAgICAgICBwX3RjcC0+bV9tY2NfcmVjb3JkcyA9IG5ld19tY2NfcmVjb3JkczsKICAgICAgICAgbF9tY2NfZGF0YSA9IHBfdGNwLT5tX21jY19yZWNvcmRzICsgcF90Y3AtPm1fbmJfbWNjX3JlY29yZHM7Ci0gICAgICAgIGxfbWNjX2RhdGEtPm1fZGVjb3JyZWxhdGlvbl9hcnJheSA9IGxfbWN0X2RlY29fZGF0YTsKLSAgICAgICAgbF9tY2NfZGF0YS0+bV9pc19pcnJldmVyc2libGUgPSAxOwotICAgICAgICBsX21jY19kYXRhLT5tX25iX2NvbXBzID0gcF9pbWFnZS0+bnVtY29tcHM7Ci0gICAgICAgIGxfbWNjX2RhdGEtPm1faW5kZXggPSBsX2luZGl4Kys7Ci0gICAgICAgIGxfbWNjX2RhdGEtPm1fb2Zmc2V0X2FycmF5ID0gbF9tY3Rfb2Zmc2V0X2RhdGE7Ci0gICAgICAgICsrcF90Y3AtPm1fbmJfbWNjX3JlY29yZHM7CisgICAgICAgIG1lbXNldChsX21jY19kYXRhLCAwLCAocF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzIC0gcF90Y3AtPm1fbmJfbWNjX3JlY29yZHMpICoKKyAgICAgICAgICAgICAgIHNpemVvZihvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCkpOwogCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICB9CisKKyAgICBsX21jY19kYXRhID0gcF90Y3AtPm1fbWNjX3JlY29yZHMgKyBwX3RjcC0+bV9uYl9tY2NfcmVjb3JkczsKKyAgICBsX21jY19kYXRhLT5tX2RlY29ycmVsYXRpb25fYXJyYXkgPSBsX21jdF9kZWNvX2RhdGE7CisgICAgbF9tY2NfZGF0YS0+bV9pc19pcnJldmVyc2libGUgPSAxOworICAgIGxfbWNjX2RhdGEtPm1fbmJfY29tcHMgPSBwX2ltYWdlLT5udW1jb21wczsKKyAgICBsX21jY19kYXRhLT5tX2luZGV4ID0gbF9pbmRpeCsrOworICAgIGxfbWNjX2RhdGEtPm1fb2Zmc2V0X2FycmF5ID0gbF9tY3Rfb2Zmc2V0X2RhdGE7CisgICAgKytwX3RjcC0+bV9uYl9tY2NfcmVjb3JkczsKKworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfYnVpbGRfZGVjb2RlciAob3BqX2oya190ICogcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfYnVpbGRfZGVjb2RlcihvcGpfajJrX3QgKiBwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCiB7Ci0gICAgICAgIC8qIGFkZCBoZXJlIGluaXRpYWxpemF0aW9uIG9mIGNwCi0gICAgICAgICAgIGNvcHkgcGFzdGUgb2Ygc2V0dXBfZGVjb2RlciAqLwotICAodm9pZClwX2oyazsKLSAgKHZvaWQpcF9zdHJlYW07Ci0gICh2b2lkKXBfbWFuYWdlcjsKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIC8qIGFkZCBoZXJlIGluaXRpYWxpemF0aW9uIG9mIGNwCisgICAgICAgY29weSBwYXN0ZSBvZiBzZXR1cF9kZWNvZGVyICovCisgICAgKHZvaWQpcF9qMms7CisgICAgKHZvaWQpcF9zdHJlYW07CisgICAgKHZvaWQpcF9tYW5hZ2VyOworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfYnVpbGRfZW5jb2RlciAob3BqX2oya190ICogcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2J1aWxkX2VuY29kZXIob3BqX2oya190ICogcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQogewotICAgICAgICAvKiBhZGQgaGVyZSBpbml0aWFsaXphdGlvbiBvZiBjcAotICAgICAgICAgICBjb3B5IHBhc3RlIG9mIHNldHVwX2VuY29kZXIgKi8KLSAgKHZvaWQpcF9qMms7Ci0gICh2b2lkKXBfc3RyZWFtOwotICAodm9pZClwX21hbmFnZXI7Ci0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAvKiBhZGQgaGVyZSBpbml0aWFsaXphdGlvbiBvZiBjcAorICAgICAgIGNvcHkgcGFzdGUgb2Ygc2V0dXBfZW5jb2RlciAqLworICAgICh2b2lkKXBfajJrOworICAgICh2b2lkKXBfc3RyZWFtOworICAgICh2b2lkKXBfbWFuYWdlcjsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2VuY29kaW5nX3ZhbGlkYXRpb24gKCAgb3BqX2oya190ICogcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19lbmNvZGluZ192YWxpZGF0aW9uKG9wal9qMmtfdCAqIHBfajJrLAorICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKIHsKLSAgICAgICAgT1BKX0JPT0wgbF9pc192YWxpZCA9IE9QSl9UUlVFOworICAgIE9QSl9CT09MIGxfaXNfdmFsaWQgPSBPUEpfVFJVRTsKIAotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CiAKLSAgICAgICAgLyogU1RBVEUgY2hlY2tpbmcgKi8KLSAgICAgICAgLyogbWFrZSBzdXJlIHRoZSBzdGF0ZSBpcyBhdCAwICovCi0gICAgICAgIGxfaXNfdmFsaWQgJj0gKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9OT05FKTsKKyAgICBPUEpfVU5VU0VEKHBfc3RyZWFtKTsKIAotICAgICAgICAvKiBQT0lOVEVSIHZhbGlkYXRpb24gKi8KLSAgICAgICAgLyogbWFrZSBzdXJlIGEgcF9qMmsgY29kZWMgaXMgcHJlc2VudCAqLwotICAgICAgICBsX2lzX3ZhbGlkICY9IChwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCAhPSAwMCk7Ci0gICAgICAgIC8qIG1ha2Ugc3VyZSBhIHZhbGlkYXRpb24gbGlzdCBpcyBwcmVzZW50ICovCi0gICAgICAgIGxfaXNfdmFsaWQgJj0gKHBfajJrLT5tX3ZhbGlkYXRpb25fbGlzdCAhPSAwMCk7CisgICAgLyogU1RBVEUgY2hlY2tpbmcgKi8KKyAgICAvKiBtYWtlIHN1cmUgdGhlIHN0YXRlIGlzIGF0IDAgKi8KKyAgICBsX2lzX3ZhbGlkICY9IChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfTk9ORSk7CiAKLSAgICAgICAgLyogSVNPIDE1NDQ0LTE6MjAwNCBzdGF0ZXMgYmV0d2VlbiAxICYgMzMgKDAgLT4gMzIpICovCi0gICAgICAgIC8qIDMzICgzMikgd291bGQgYWx3YXlzIGZhaWwgdGhlIGNoZWNrIGJlbG93IChpZiBhIGNhc3QgdG8gNjRiaXRzIHdhcyBkb25lKSAqLwotICAgICAgICAvKiBGSVhNRSBTaGFsbCB3ZSBjaGFuZ2UgT1BKX0oyS19NQVhSTFZMUyB0byAzMiA/ICovCi0gICAgICAgIGlmICgocF9qMmstPm1fY3AudGNwcy0+dGNjcHMtPm51bXJlc29sdXRpb25zIDw9IDApIHx8IChwX2oyay0+bV9jcC50Y3BzLT50Y2Nwcy0+bnVtcmVzb2x1dGlvbnMgPiAzMikpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTnVtYmVyIG9mIHJlc29sdXRpb25zIGlzIHRvbyBoaWdoIGluIGNvbXBhcmlzb24gdG8gdGhlIHNpemUgb2YgdGlsZXNcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICAvKiBQT0lOVEVSIHZhbGlkYXRpb24gKi8KKyAgICAvKiBtYWtlIHN1cmUgYSBwX2oyayBjb2RlYyBpcyBwcmVzZW50ICovCisgICAgbF9pc192YWxpZCAmPSAocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QgIT0gMDApOworICAgIC8qIG1ha2Ugc3VyZSBhIHZhbGlkYXRpb24gbGlzdCBpcyBwcmVzZW50ICovCisgICAgbF9pc192YWxpZCAmPSAocF9qMmstPm1fdmFsaWRhdGlvbl9saXN0ICE9IDAwKTsKIAotICAgICAgICBpZiAoKHBfajJrLT5tX2NwLnRkeCkgPCAoT1BKX1VJTlQzMikgKDEgPDwgKHBfajJrLT5tX2NwLnRjcHMtPnRjY3BzLT5udW1yZXNvbHV0aW9ucyAtIDFVKSkpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTnVtYmVyIG9mIHJlc29sdXRpb25zIGlzIHRvbyBoaWdoIGluIGNvbXBhcmlzb24gdG8gdGhlIHNpemUgb2YgdGlsZXNcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICAvKiBJU08gMTU0NDQtMToyMDA0IHN0YXRlcyBiZXR3ZWVuIDEgJiAzMyAoMCAtPiAzMikgKi8KKyAgICAvKiAzMyAoMzIpIHdvdWxkIGFsd2F5cyBmYWlsIHRoZSBjaGVjayBiZWxvdyAoaWYgYSBjYXN0IHRvIDY0Yml0cyB3YXMgZG9uZSkgKi8KKyAgICAvKiBGSVhNRSBTaGFsbCB3ZSBjaGFuZ2UgT1BKX0oyS19NQVhSTFZMUyB0byAzMiA/ICovCisgICAgaWYgKChwX2oyay0+bV9jcC50Y3BzLT50Y2Nwcy0+bnVtcmVzb2x1dGlvbnMgPD0gMCkgfHwKKyAgICAgICAgICAgIChwX2oyay0+bV9jcC50Y3BzLT50Y2Nwcy0+bnVtcmVzb2x1dGlvbnMgPiAzMikpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiTnVtYmVyIG9mIHJlc29sdXRpb25zIGlzIHRvbyBoaWdoIGluIGNvbXBhcmlzb24gdG8gdGhlIHNpemUgb2YgdGlsZXNcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICBpZiAoKHBfajJrLT5tX2NwLnRkeSkgPCAoT1BKX1VJTlQzMikgKDEgPDwgKHBfajJrLT5tX2NwLnRjcHMtPnRjY3BzLT5udW1yZXNvbHV0aW9ucyAtIDFVKSkpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTnVtYmVyIG9mIHJlc29sdXRpb25zIGlzIHRvbyBoaWdoIGluIGNvbXBhcmlzb24gdG8gdGhlIHNpemUgb2YgdGlsZXNcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICBpZiAoKHBfajJrLT5tX2NwLnRkeCkgPCAoT1BKX1VJTlQzMikoMSA8PAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocF9qMmstPm1fY3AudGNwcy0+dGNjcHMtPm51bXJlc29sdXRpb25zIC0gMVUpKSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJOdW1iZXIgb2YgcmVzb2x1dGlvbnMgaXMgdG9vIGhpZ2ggaW4gY29tcGFyaXNvbiB0byB0aGUgc2l6ZSBvZiB0aWxlc1xuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIC8qIFBBUkFNRVRFUiBWQUxJREFUSU9OICovCi0gICAgICAgIHJldHVybiBsX2lzX3ZhbGlkOworICAgIGlmICgocF9qMmstPm1fY3AudGR5KSA8IChPUEpfVUlOVDMyKSgxIDw8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwX2oyay0+bV9jcC50Y3BzLT50Y2Nwcy0+bnVtcmVzb2x1dGlvbnMgLSAxVSkpKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIk51bWJlciBvZiByZXNvbHV0aW9ucyBpcyB0b28gaGlnaCBpbiBjb21wYXJpc29uIHRvIHRoZSBzaXplIG9mIHRpbGVzXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICAvKiBQQVJBTUVURVIgVkFMSURBVElPTiAqLworICAgIHJldHVybiBsX2lzX3ZhbGlkOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19kZWNvZGluZ192YWxpZGF0aW9uICggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2RlY29kaW5nX3ZhbGlkYXRpb24ob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0gICAgICAgIE9QSl9CT09MIGxfaXNfdmFsaWQgPSBPUEpfVFJVRTsKKyAgICBPUEpfQk9PTCBsX2lzX3ZhbGlkID0gT1BKX1RSVUU7CiAKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMqLworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKIAotICAgICAgICAvKiBTVEFURSBjaGVja2luZyAqLwotICAgICAgICAvKiBtYWtlIHN1cmUgdGhlIHN0YXRlIGlzIGF0IDAgKi8KKyAgICBPUEpfVU5VU0VEKHBfc3RyZWFtKTsKKyAgICBPUEpfVU5VU0VEKHBfbWFuYWdlcik7CisKKyAgICAvKiBTVEFURSBjaGVja2luZyAqLworICAgIC8qIG1ha2Ugc3VyZSB0aGUgc3RhdGUgaXMgYXQgMCAqLwogI2lmZGVmIFRPRE9fTVNECi0gICAgICAgIGxfaXNfdmFsaWQgJj0gKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19ERUNfU1RBVEVfTk9ORSk7CisgICAgbF9pc192YWxpZCAmPSAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX0RFQ19TVEFURV9OT05FKTsKICNlbmRpZgotICAgICAgICBsX2lzX3ZhbGlkICY9IChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSAweDAwMDApOworICAgIGxfaXNfdmFsaWQgJj0gKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IDB4MDAwMCk7CiAKLSAgICAgICAgLyogUE9JTlRFUiB2YWxpZGF0aW9uICovCi0gICAgICAgIC8qIG1ha2Ugc3VyZSBhIHBfajJrIGNvZGVjIGlzIHByZXNlbnQgKi8KLSAgICAgICAgLyogbWFrZSBzdXJlIGEgcHJvY2VkdXJlIGxpc3QgaXMgcHJlc2VudCAqLwotICAgICAgICBsX2lzX3ZhbGlkICY9IChwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCAhPSAwMCk7Ci0gICAgICAgIC8qIG1ha2Ugc3VyZSBhIHZhbGlkYXRpb24gbGlzdCBpcyBwcmVzZW50ICovCi0gICAgICAgIGxfaXNfdmFsaWQgJj0gKHBfajJrLT5tX3ZhbGlkYXRpb25fbGlzdCAhPSAwMCk7CisgICAgLyogUE9JTlRFUiB2YWxpZGF0aW9uICovCisgICAgLyogbWFrZSBzdXJlIGEgcF9qMmsgY29kZWMgaXMgcHJlc2VudCAqLworICAgIC8qIG1ha2Ugc3VyZSBhIHByb2NlZHVyZSBsaXN0IGlzIHByZXNlbnQgKi8KKyAgICBsX2lzX3ZhbGlkICY9IChwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCAhPSAwMCk7CisgICAgLyogbWFrZSBzdXJlIGEgdmFsaWRhdGlvbiBsaXN0IGlzIHByZXNlbnQgKi8KKyAgICBsX2lzX3ZhbGlkICY9IChwX2oyay0+bV92YWxpZGF0aW9uX2xpc3QgIT0gMDApOwogCi0gICAgICAgIC8qIFBBUkFNRVRFUiBWQUxJREFUSU9OICovCi0gICAgICAgIHJldHVybiBsX2lzX3ZhbGlkOworICAgIC8qIFBBUkFNRVRFUiBWQUxJREFUSU9OICovCisgICAgcmV0dXJuIGxfaXNfdmFsaWQ7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfaGVhZGVyX3Byb2NlZHVyZSggb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9oZWFkZXJfcHJvY2VkdXJlKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQogewotICAgICAgICBPUEpfVUlOVDMyIGxfY3VycmVudF9tYXJrZXI7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9tYXJrZXJfc2l6ZTsKLSAgICAgICAgY29uc3Qgb3BqX2RlY19tZW1vcnlfbWFya2VyX2hhbmRsZXJfdCAqIGxfbWFya2VyX2hhbmRsZXIgPSAwMDsKLSAgICAgICAgT1BKX0JPT0wgbF9oYXNfc2l6ID0gMDsKLSAgICAgICAgT1BKX0JPT0wgbF9oYXNfY29kID0gMDsKLSAgICAgICAgT1BKX0JPT0wgbF9oYXNfcWNkID0gMDsKKyAgICBPUEpfVUlOVDMyIGxfY3VycmVudF9tYXJrZXI7CisgICAgT1BKX1VJTlQzMiBsX21hcmtlcl9zaXplOworICAgIGNvbnN0IG9wal9kZWNfbWVtb3J5X21hcmtlcl9oYW5kbGVyX3QgKiBsX21hcmtlcl9oYW5kbGVyID0gMDA7CisgICAgT1BKX0JPT0wgbF9oYXNfc2l6ID0gMDsKKyAgICBPUEpfQk9PTCBsX2hhc19jb2QgPSAwOworICAgIE9QSl9CT09MIGxfaGFzX3FjZCA9IDA7CiAKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0gICAgICAgIC8qICBXZSBlbnRlciBpbiB0aGUgbWFpbiBoZWFkZXIgKi8KLSAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPSBKMktfU1RBVEVfTUhTT0M7CisgICAgLyogIFdlIGVudGVyIGluIHRoZSBtYWluIGhlYWRlciAqLworICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID0gSjJLX1NUQVRFX01IU09DOwogCi0gICAgICAgIC8qIFRyeSB0byByZWFkIHRoZSBTT0MgbWFya2VyLCB0aGUgY29kZXN0cmVhbSBtdXN0IGJlZ2luIHdpdGggU09DIG1hcmtlciAqLwotICAgICAgICBpZiAoISBvcGpfajJrX3JlYWRfc29jKHBfajJrLHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXhwZWN0ZWQgYSBTT0MgbWFya2VyIFxuIik7CisgICAgLyogVHJ5IHRvIHJlYWQgdGhlIFNPQyBtYXJrZXIsIHRoZSBjb2Rlc3RyZWFtIG11c3QgYmVnaW4gd2l0aCBTT0MgbWFya2VyICovCisgICAgaWYgKCEgb3BqX2oya19yZWFkX3NvYyhwX2oyaywgcF9zdHJlYW0sIHBfbWFuYWdlcikpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkV4cGVjdGVkIGEgU09DIG1hcmtlciBcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIC8qIFRyeSB0byByZWFkIDIgYnl0ZXMgKHRoZSBuZXh0IG1hcmtlciBJRCkgZnJvbSBzdHJlYW0gYW5kIGNvcHkgdGhlbSBpbnRvIHRoZSBidWZmZXIgKi8KKyAgICBpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLCAyLCBwX21hbmFnZXIpICE9IDIpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIC8qIFJlYWQgMiBieXRlcyBhcyB0aGUgbmV3IG1hcmtlciBJRCAqLworICAgIG9wal9yZWFkX2J5dGVzKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICZsX2N1cnJlbnRfbWFya2VyLCAyKTsKKworICAgIC8qIFRyeSB0byByZWFkIHVudGlsIHRoZSBTT1QgaXMgZGV0ZWN0ZWQgKi8KKyAgICB3aGlsZSAobF9jdXJyZW50X21hcmtlciAhPSBKMktfTVNfU09UKSB7CisKKyAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgbWFya2VyIElEIGlzIHZhbGlkICovCisgICAgICAgIGlmIChsX2N1cnJlbnRfbWFya2VyIDwgMHhmZjAwKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQSBtYXJrZXIgSUQgd2FzIGV4cGVjdGVkICgweGZmLS0pIGluc3RlYWQgb2YgJS44eFxuIiwgbF9jdXJyZW50X21hcmtlcik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLyogR2V0IHRoZSBtYXJrZXIgaGFuZGxlciBmcm9tIHRoZSBtYXJrZXIgSUQgKi8KKyAgICAgICAgbF9tYXJrZXJfaGFuZGxlciA9IG9wal9qMmtfZ2V0X21hcmtlcl9oYW5kbGVyKGxfY3VycmVudF9tYXJrZXIpOworCisgICAgICAgIC8qIE1hbmFnZSBjYXNlIHdoZXJlIG1hcmtlciBpcyB1bmtub3duICovCisgICAgICAgIGlmIChsX21hcmtlcl9oYW5kbGVyLT5pZCA9PSBKMktfTVNfVU5LKSB7CisgICAgICAgICAgICBpZiAoISBvcGpfajJrX3JlYWRfdW5rKHBfajJrLCBwX3N0cmVhbSwgJmxfY3VycmVudF9tYXJrZXIsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVua25vdyBtYXJrZXIgaGF2ZSBiZWVuIGRldGVjdGVkIGFuZCBnZW5lcmF0ZWQgZXJyb3IuXG4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobF9jdXJyZW50X21hcmtlciA9PSBKMktfTVNfU09UKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7ICAgIC8qIFNPVCBtYXJrZXIgaXMgZGV0ZWN0ZWQgbWFpbiBoZWFkZXIgaXMgY29tcGxldGVseSByZWFkICovCisgICAgICAgICAgICB9IGVsc2UgeyAvKiBHZXQgdGhlIG1hcmtlciBoYW5kbGVyIGZyb20gdGhlIG1hcmtlciBJRCAqLworICAgICAgICAgICAgICAgIGxfbWFya2VyX2hhbmRsZXIgPSBvcGpfajJrX2dldF9tYXJrZXJfaGFuZGxlcihsX2N1cnJlbnRfbWFya2VyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChsX21hcmtlcl9oYW5kbGVyLT5pZCA9PSBKMktfTVNfU0laKSB7CisgICAgICAgICAgICAvKiBNYXJrIHJlcXVpcmVkIFNJWiBtYXJrZXIgYXMgZm91bmQgKi8KKyAgICAgICAgICAgIGxfaGFzX3NpeiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxfbWFya2VyX2hhbmRsZXItPmlkID09IEoyS19NU19DT0QpIHsKKyAgICAgICAgICAgIC8qIE1hcmsgcmVxdWlyZWQgQ09EIG1hcmtlciBhcyBmb3VuZCAqLworICAgICAgICAgICAgbF9oYXNfY29kID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobF9tYXJrZXJfaGFuZGxlci0+aWQgPT0gSjJLX01TX1FDRCkgeworICAgICAgICAgICAgLyogTWFyayByZXF1aXJlZCBRQ0QgbWFya2VyIGFzIGZvdW5kICovCisgICAgICAgICAgICBsX2hhc19xY2QgPSAxOworICAgICAgICB9CisKKyAgICAgICAgLyogQ2hlY2sgaWYgdGhlIG1hcmtlciBpcyBrbm93biBhbmQgaWYgaXQgaXMgdGhlIHJpZ2h0IHBsYWNlIHRvIGZpbmQgaXQgKi8KKyAgICAgICAgaWYgKCEocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgJiBsX21hcmtlcl9oYW5kbGVyLT5zdGF0ZXMpKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFya2VyIGlzIG5vdCBjb21wbGlhbnQgd2l0aCBpdHMgcG9zaXRpb25cbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFRyeSB0byByZWFkIDIgYnl0ZXMgKHRoZSBtYXJrZXIgc2l6ZSkgZnJvbSBzdHJlYW0gYW5kIGNvcHkgdGhlbSBpbnRvIHRoZSBidWZmZXIgKi8KKyAgICAgICAgaWYgKG9wal9zdHJlYW1fcmVhZF9kYXRhKHBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsIDIsIHBfbWFuYWdlcikgIT0gMikgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHJlYWQgMiBieXRlcyBhcyB0aGUgbWFya2VyIHNpemUgKi8KKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsICZsX21hcmtlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAyKTsKKyAgICAgICAgaWYgKGxfbWFya2VyX3NpemUgPCAyKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSW52YWxpZCBtYXJrZXIgc2l6ZVxuIik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGxfbWFya2VyX3NpemUgLT0gMjsgLyogU3VidHJhY3QgdGhlIHNpemUgb2YgdGhlIG1hcmtlciBJRCBhbHJlYWR5IHJlYWQgKi8KKworICAgICAgICAvKiBDaGVjayBpZiB0aGUgbWFya2VyIHNpemUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBoZWFkZXIgZGF0YSBzaXplICovCisgICAgICAgIGlmIChsX21hcmtlcl9zaXplID4gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGFfc2l6ZSkgeworICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfcmVhbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsIGxfbWFya2VyX3NpemUpOworICAgICAgICAgICAgaWYgKCEgbmV3X2hlYWRlcl9kYXRhKSB7CisgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEpOworICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhID0gTlVMTDsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YV9zaXplID0gMDsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBoZWFkZXJcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSA9IG5ld19oZWFkZXJfZGF0YTsKKyAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhX3NpemUgPSBsX21hcmtlcl9zaXplOworICAgICAgICB9CisKKyAgICAgICAgLyogVHJ5IHRvIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIG1hcmtlciBzZWdtZW50IGZyb20gc3RyZWFtIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgYnVmZmVyICovCisgICAgICAgIGlmIChvcGpfc3RyZWFtX3JlYWRfZGF0YShwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLCBsX21hcmtlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSAhPSBsX21hcmtlcl9zaXplKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIHRvbyBzaG9ydFxuIik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLyogUmVhZCB0aGUgbWFya2VyIHNlZ21lbnQgd2l0aCB0aGUgY29ycmVjdCBtYXJrZXIgaGFuZGxlciAqLworICAgICAgICBpZiAoISgqKGxfbWFya2VyX2hhbmRsZXItPmhhbmRsZXIpKShwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsIGxfbWFya2VyX3NpemUsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXJrZXIgaGFuZGxlciBmdW5jdGlvbiBmYWlsZWQgdG8gcmVhZCB0aGUgbWFya2VyIHNlZ21lbnRcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFkZCB0aGUgbWFya2VyIHRvIHRoZSBjb2Rlc3RyZWFtIGluZGV4Ki8KKyAgICAgICAgaWYgKE9QSl9GQUxTRSA9PSBvcGpfajJrX2FkZF9taG1hcmtlcigKKyAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgIGxfbWFya2VyX2hhbmRsZXItPmlkLAorICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMikgb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSAtIGxfbWFya2VyX3NpemUgLSA0LAorICAgICAgICAgICAgICAgICAgICBsX21hcmtlcl9zaXplICsgNCkpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhZGQgbWggbWFya2VyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBUcnkgdG8gcmVhZCAyIGJ5dGVzICh0aGUgbmV4dCBtYXJrZXIgSUQpIGZyb20gc3RyZWFtIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgYnVmZmVyICovCi0gICAgICAgIGlmIChvcGpfc3RyZWFtX3JlYWRfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwyLHBfbWFuYWdlcikgIT0gMikgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJTdHJlYW0gdG9vIHNob3J0XG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogUmVhZCAyIGJ5dGVzIGFzIHRoZSBuZXcgbWFya2VyIElEICovCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLCZsX2N1cnJlbnRfbWFya2VyLDIpOwotCi0gICAgICAgIC8qIFRyeSB0byByZWFkIHVudGlsIHRoZSBTT1QgaXMgZGV0ZWN0ZWQgKi8KLSAgICAgICAgd2hpbGUgKGxfY3VycmVudF9tYXJrZXIgIT0gSjJLX01TX1NPVCkgewotCi0gICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGN1cnJlbnQgbWFya2VyIElEIGlzIHZhbGlkICovCi0gICAgICAgICAgICAgICAgaWYgKGxfY3VycmVudF9tYXJrZXIgPCAweGZmMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJBIG1hcmtlciBJRCB3YXMgZXhwZWN0ZWQgKDB4ZmYtLSkgaW5zdGVhZCBvZiAlLjh4XG4iLCBsX2N1cnJlbnRfbWFya2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogR2V0IHRoZSBtYXJrZXIgaGFuZGxlciBmcm9tIHRoZSBtYXJrZXIgSUQgKi8KLSAgICAgICAgICAgICAgICBsX21hcmtlcl9oYW5kbGVyID0gb3BqX2oya19nZXRfbWFya2VyX2hhbmRsZXIobF9jdXJyZW50X21hcmtlcik7Ci0KLSAgICAgICAgICAgICAgICAvKiBNYW5hZ2UgY2FzZSB3aGVyZSBtYXJrZXIgaXMgdW5rbm93biAqLwotICAgICAgICAgICAgICAgIGlmIChsX21hcmtlcl9oYW5kbGVyLT5pZCA9PSBKMktfTVNfVU5LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX3JlYWRfdW5rKHBfajJrLCBwX3N0cmVhbSwgJmxfY3VycmVudF9tYXJrZXIsIHBfbWFuYWdlcikpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiVW5rbm93IG1hcmtlciBoYXZlIGJlZW4gZGV0ZWN0ZWQgYW5kIGdlbmVyYXRlZCBlcnJvci5cbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jdXJyZW50X21hcmtlciA9PSBKMktfTVNfU09UKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLyogU09UIG1hcmtlciBpcyBkZXRlY3RlZCBtYWluIGhlYWRlciBpcyBjb21wbGV0ZWx5IHJlYWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgLyogR2V0IHRoZSBtYXJrZXIgaGFuZGxlciBmcm9tIHRoZSBtYXJrZXIgSUQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9tYXJrZXJfaGFuZGxlciA9IG9wal9qMmtfZ2V0X21hcmtlcl9oYW5kbGVyKGxfY3VycmVudF9tYXJrZXIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChsX21hcmtlcl9oYW5kbGVyLT5pZCA9PSBKMktfTVNfU0laKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIE1hcmsgcmVxdWlyZWQgU0laIG1hcmtlciBhcyBmb3VuZCAqLwotICAgICAgICAgICAgICAgICAgICBsX2hhc19zaXogPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobF9tYXJrZXJfaGFuZGxlci0+aWQgPT0gSjJLX01TX0NPRCkgewotICAgICAgICAgICAgICAgICAgICAvKiBNYXJrIHJlcXVpcmVkIENPRCBtYXJrZXIgYXMgZm91bmQgKi8KLSAgICAgICAgICAgICAgICAgICAgbF9oYXNfY29kID0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGxfbWFya2VyX2hhbmRsZXItPmlkID09IEoyS19NU19RQ0QpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogTWFyayByZXF1aXJlZCBRQ0QgbWFya2VyIGFzIGZvdW5kICovCi0gICAgICAgICAgICAgICAgICAgIGxfaGFzX3FjZCA9IDE7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIG1hcmtlciBpcyBrbm93biBhbmQgaWYgaXQgaXMgdGhlIHJpZ2h0IHBsYWNlIHRvIGZpbmQgaXQgKi8KLSAgICAgICAgICAgICAgICBpZiAoISAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgJiBsX21hcmtlcl9oYW5kbGVyLT5zdGF0ZXMpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk1hcmtlciBpcyBub3QgY29tcGxpYW50IHdpdGggaXRzIHBvc2l0aW9uXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogVHJ5IHRvIHJlYWQgMiBieXRlcyAodGhlIG1hcmtlciBzaXplKSBmcm9tIHN0cmVhbSBhbmQgY29weSB0aGVtIGludG8gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIGlmIChvcGpfc3RyZWFtX3JlYWRfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwyLHBfbWFuYWdlcikgIT0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiByZWFkIDIgYnl0ZXMgYXMgdGhlIG1hcmtlciBzaXplICovCi0gICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsJmxfbWFya2VyX3NpemUsMik7Ci0gICAgICAgICAgICAgICAgaWYgKGxfbWFya2VyX3NpemUgPCAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSW52YWxpZCBtYXJrZXIgc2l6ZVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsX21hcmtlcl9zaXplIC09IDI7IC8qIFN1YnRyYWN0IHRoZSBzaXplIG9mIHRoZSBtYXJrZXIgSUQgYWxyZWFkeSByZWFkICovCi0KLSAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgbWFya2VyIHNpemUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBoZWFkZXIgZGF0YSBzaXplICovCi0gICAgICAgICAgICAgICAgaWYgKGxfbWFya2VyX3NpemUgPiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqbmV3X2hlYWRlcl9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLCBsX21hcmtlcl9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG5ld19oZWFkZXJfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGFfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFkIGhlYWRlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSA9IG5ld19oZWFkZXJfZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhX3NpemUgPSBsX21hcmtlcl9zaXplOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIFRyeSB0byByZWFkIHRoZSByZXN0IG9mIHRoZSBtYXJrZXIgc2VnbWVudCBmcm9tIHN0cmVhbSBhbmQgY29weSB0aGVtIGludG8gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIGlmIChvcGpfc3RyZWFtX3JlYWRfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSxsX21hcmtlcl9zaXplLHBfbWFuYWdlcikgIT0gbF9tYXJrZXJfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBSZWFkIHRoZSBtYXJrZXIgc2VnbWVudCB3aXRoIHRoZSBjb3JyZWN0IG1hcmtlciBoYW5kbGVyICovCi0gICAgICAgICAgICAgICAgaWYgKCEgKCoobF9tYXJrZXJfaGFuZGxlci0+aGFuZGxlcikpKHBfajJrLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLGxfbWFya2VyX3NpemUscF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk1hcmtlciBoYW5kbGVyIGZ1bmN0aW9uIGZhaWxlZCB0byByZWFkIHRoZSBtYXJrZXIgc2VnbWVudFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIEFkZCB0aGUgbWFya2VyIHRvIHRoZSBjb2Rlc3RyZWFtIGluZGV4Ki8KLSAgICAgICAgICAgICAgICBpZiAoT1BKX0ZBTFNFID09IG9wal9qMmtfYWRkX21obWFya2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbWFya2VyX2hhbmRsZXItPmlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfVUlOVDMyKSBvcGpfc3RyZWFtX3RlbGwocF9zdHJlYW0pIC0gbF9tYXJrZXJfc2l6ZSAtIDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9tYXJrZXJfc2l6ZSArIDQgKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGFkZCBtaCBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBUcnkgdG8gcmVhZCAyIGJ5dGVzICh0aGUgbmV4dCBtYXJrZXIgSUQpIGZyb20gc3RyZWFtIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgaWYgKG9wal9zdHJlYW1fcmVhZF9kYXRhKHBfc3RyZWFtLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLDIscF9tYW5hZ2VyKSAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIHRvbyBzaG9ydFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIHJlYWQgMiBieXRlcyBhcyB0aGUgbmV3IG1hcmtlciBJRCAqLwotICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLCZsX2N1cnJlbnRfbWFya2VyLDIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxfaGFzX3NpeiA9PSAwKSB7Ci0gICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAicmVxdWlyZWQgU0laIG1hcmtlciBub3QgZm91bmQgaW4gbWFpbiBoZWFkZXJcbiIpOwotICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobF9oYXNfY29kID09IDApIHsKLSAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJyZXF1aXJlZCBDT0QgbWFya2VyIG5vdCBmb3VuZCBpbiBtYWluIGhlYWRlclxuIik7Ci0gICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsX2hhc19xY2QgPT0gMCkgewotICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgInJlcXVpcmVkIFFDRCBtYXJrZXIgbm90IGZvdW5kIGluIG1haW4gaGVhZGVyXG4iKTsKLSAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQkKLSAgICAgICAgaWYgKCEgb3BqX2oya19tZXJnZV9wcG0oJihwX2oyay0+bV9jcCksIHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gbWVyZ2UgUFBNIGRhdGFcbiIpOworICAgICAgICBpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwgMiwgcF9tYW5hZ2VyKSAhPSAyKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIHRvbyBzaG9ydFxuIik7CiAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICB9CiAKLSAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9JTkZPLCAiTWFpbiBoZWFkZXIgaGFzIGJlZW4gY29ycmVjdGx5IGRlY29kZWQuXG4iKTsKKyAgICAgICAgLyogcmVhZCAyIGJ5dGVzIGFzIHRoZSBuZXcgbWFya2VyIElEICovCisgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAmbF9jdXJyZW50X21hcmtlciwgMik7CisgICAgfQogCi0gICAgICAgIC8qIFBvc2l0aW9uIG9mIHRoZSBsYXN0IGVsZW1lbnQgaWYgdGhlIG1haW4gaGVhZGVyICovCi0gICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT5tYWluX2hlYWRfZW5kID0gKE9QSl9VSU5UMzIpIG9wal9zdHJlYW1fdGVsbChwX3N0cmVhbSkgLSAyOworICAgIGlmIChsX2hhc19zaXogPT0gMCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCBTSVogbWFya2VyIG5vdCBmb3VuZCBpbiBtYWluIGhlYWRlclxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGlmIChsX2hhc19jb2QgPT0gMCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCBDT0QgbWFya2VyIG5vdCBmb3VuZCBpbiBtYWluIGhlYWRlclxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGlmIChsX2hhc19xY2QgPT0gMCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCBRQ0QgbWFya2VyIG5vdCBmb3VuZCBpbiBtYWluIGhlYWRlclxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIC8qIE5leHQgc3RlcDogcmVhZCBhIHRpbGUtcGFydCBoZWFkZXIgKi8KLSAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPSBKMktfU1RBVEVfVFBIU09UOworICAgIGlmICghIG9wal9qMmtfbWVyZ2VfcHBtKCYocF9qMmstPm1fY3ApLCBwX21hbmFnZXIpKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gbWVyZ2UgUFBNIGRhdGFcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9JTkZPLCAiTWFpbiBoZWFkZXIgaGFzIGJlZW4gY29ycmVjdGx5IGRlY29kZWQuXG4iKTsKKworICAgIC8qIFBvc2l0aW9uIG9mIHRoZSBsYXN0IGVsZW1lbnQgaWYgdGhlIG1haW4gaGVhZGVyICovCisgICAgcF9qMmstPmNzdHJfaW5kZXgtPm1haW5faGVhZF9lbmQgPSAoT1BKX1VJTlQzMikgb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSAtIDI7CisKKyAgICAvKiBOZXh0IHN0ZXA6IHJlYWQgYSB0aWxlLXBhcnQgaGVhZGVyICovCisgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPSBKMktfU1RBVEVfVFBIU09UOworCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19leGVjICggb3BqX2oya190ICogcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X3QgKiBwX3Byb2NlZHVyZV9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZXhlYyhvcGpfajJrX3QgKiBwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X3QgKiBwX3Byb2NlZHVyZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKIHsKLSAgICAgICAgT1BKX0JPT0wgKCoqIGxfcHJvY2VkdXJlKSAob3BqX2oya190ICogLG9wal9zdHJlYW1fcHJpdmF0ZV90ICosb3BqX2V2ZW50X21ncl90ICopID0gMDA7Ci0gICAgICAgIE9QSl9CT09MIGxfcmVzdWx0ID0gT1BKX1RSVUU7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9wcm9jLCBpOworICAgIE9QSl9CT09MKCoqIGxfcHJvY2VkdXJlKShvcGpfajJrX3QgKiwgb3BqX3N0cmVhbV9wcml2YXRlX3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICopID0gMDA7CisgICAgT1BKX0JPT0wgbF9yZXN1bHQgPSBPUEpfVFJVRTsKKyAgICBPUEpfVUlOVDMyIGxfbmJfcHJvYywgaTsKIAotICAgICAgICAvKiBwcmVjb25kaXRpb25zKi8KLSAgICAgICAgYXNzZXJ0KHBfcHJvY2VkdXJlX2xpc3QgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zKi8KKyAgICBhc3NlcnQocF9wcm9jZWR1cmVfbGlzdCAhPSAwMCk7CisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0gICAgICAgIGxfbmJfcHJvYyA9IG9wal9wcm9jZWR1cmVfbGlzdF9nZXRfbmJfcHJvY2VkdXJlcyhwX3Byb2NlZHVyZV9saXN0KTsKLSAgICAgICAgbF9wcm9jZWR1cmUgPSAoT1BKX0JPT0wgKCoqKSAob3BqX2oya190ICogLG9wal9zdHJlYW1fcHJpdmF0ZV90ICosb3BqX2V2ZW50X21ncl90ICopKSBvcGpfcHJvY2VkdXJlX2xpc3RfZ2V0X2ZpcnN0X3Byb2NlZHVyZShwX3Byb2NlZHVyZV9saXN0KTsKKyAgICBsX25iX3Byb2MgPSBvcGpfcHJvY2VkdXJlX2xpc3RfZ2V0X25iX3Byb2NlZHVyZXMocF9wcm9jZWR1cmVfbGlzdCk7CisgICAgbF9wcm9jZWR1cmUgPSAoT1BKX0JPT0woKiopKG9wal9qMmtfdCAqLCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKikpIG9wal9wcm9jZWR1cmVfbGlzdF9nZXRfZmlyc3RfcHJvY2VkdXJlKHBfcHJvY2VkdXJlX2xpc3QpOwogCi0gICAgICAgIGZvciAgICAgKGk9MDtpPGxfbmJfcHJvYzsrK2kpIHsKLSAgICAgICAgICAgICAgICBsX3Jlc3VsdCA9IGxfcmVzdWx0ICYmICgoKmxfcHJvY2VkdXJlKSAocF9qMmsscF9zdHJlYW0scF9tYW5hZ2VyKSk7Ci0gICAgICAgICAgICAgICAgKytsX3Byb2NlZHVyZTsKLSAgICAgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBsX25iX3Byb2M7ICsraSkgeworICAgICAgICBsX3Jlc3VsdCA9IGxfcmVzdWx0ICYmICgoKmxfcHJvY2VkdXJlKShwX2oyaywgcF9zdHJlYW0sIHBfbWFuYWdlcikpOworICAgICAgICArK2xfcHJvY2VkdXJlOworICAgIH0KIAotICAgICAgICAvKiBhbmQgY2xlYXIgdGhlIHByb2NlZHVyZSBsaXN0IGF0IHRoZSBlbmQuKi8KLSAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X2NsZWFyKHBfcHJvY2VkdXJlX2xpc3QpOwotICAgICAgICByZXR1cm4gbF9yZXN1bHQ7CisgICAgLyogYW5kIGNsZWFyIHRoZSBwcm9jZWR1cmUgbGlzdCBhdCB0aGUgZW5kLiovCisgICAgb3BqX3Byb2NlZHVyZV9saXN0X2NsZWFyKHBfcHJvY2VkdXJlX2xpc3QpOworICAgIHJldHVybiBsX3Jlc3VsdDsKIH0KIAogLyogRklYTUUgRE9DKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2NvcHlfZGVmYXVsdF90Y3BfYW5kX2NyZWF0ZV90Y2QgKCAgICAgICBvcGpfajJrX3QgKiBwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfY29weV9kZWZhdWx0X3RjcF9hbmRfY3JlYXRlX3RjZChvcGpfajJrX3QgKiBwX2oyaywKKyAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0gICAgICAgIG9wal90Y3BfdCAqIGxfdGNwID0gMDA7Ci0gICAgICAgIG9wal90Y3BfdCAqIGxfZGVmYXVsdF90Y3AgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzOwotICAgICAgICBPUEpfVUlOVDMyIGksajsKLSAgICAgICAgb3BqX3RjY3BfdCAqbF9jdXJyZW50X3RjY3AgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3RjY3Bfc2l6ZTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX21jdF9zaXplOwotICAgICAgICBvcGpfaW1hZ2VfdCAqIGxfaW1hZ2U7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9tY2NfcmVjb3Jkc19zaXplLGxfbWN0X3JlY29yZHNfc2l6ZTsKLSAgICAgICAgb3BqX21jdF9kYXRhX3QgKiBsX3NyY19tY3RfcmVjLCAqbF9kZXN0X21jdF9yZWM7Ci0gICAgICAgIG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90ICogbF9zcmNfbWNjX3JlYywgKmxfZGVzdF9tY2NfcmVjOwotICAgICAgICBPUEpfVUlOVDMyIGxfb2Zmc2V0OworICAgIG9wal90Y3BfdCAqIGxfdGNwID0gMDA7CisgICAgb3BqX3RjcF90ICogbF9kZWZhdWx0X3RjcCA9IDAwOworICAgIE9QSl9VSU5UMzIgbF9uYl90aWxlczsKKyAgICBPUEpfVUlOVDMyIGksIGo7CisgICAgb3BqX3RjY3BfdCAqbF9jdXJyZW50X3RjY3AgPSAwMDsKKyAgICBPUEpfVUlOVDMyIGxfdGNjcF9zaXplOworICAgIE9QSl9VSU5UMzIgbF9tY3Rfc2l6ZTsKKyAgICBvcGpfaW1hZ2VfdCAqIGxfaW1hZ2U7CisgICAgT1BKX1VJTlQzMiBsX21jY19yZWNvcmRzX3NpemUsIGxfbWN0X3JlY29yZHNfc2l6ZTsKKyAgICBvcGpfbWN0X2RhdGFfdCAqIGxfc3JjX21jdF9yZWMsICpsX2Rlc3RfbWN0X3JlYzsKKyAgICBvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCAqIGxfc3JjX21jY19yZWMsICpsX2Rlc3RfbWNjX3JlYzsKKyAgICBPUEpfVUlOVDMyIGxfb2Zmc2V0OwogCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKIAotICAgICAgICBsX2ltYWdlID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZTsKLSAgICAgICAgbF9uYl90aWxlcyA9IHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHc7Ci0gICAgICAgIGxfdGNwID0gcF9qMmstPm1fY3AudGNwczsKLSAgICAgICAgbF90Y2NwX3NpemUgPSBsX2ltYWdlLT5udW1jb21wcyAqIChPUEpfVUlOVDMyKXNpemVvZihvcGpfdGNjcF90KTsKLSAgICAgICAgbF9kZWZhdWx0X3RjcCA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOwotICAgICAgICBsX21jdF9zaXplID0gbF9pbWFnZS0+bnVtY29tcHMgKiBsX2ltYWdlLT5udW1jb21wcyAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfRkxPQVQzMik7CisgICAgT1BKX1VOVVNFRChwX3N0cmVhbSk7CiAKLSAgICAgICAgLyogRm9yIGVhY2ggdGlsZSAqLwotICAgICAgICBmb3IgKGk9MDsgaTxsX25iX3RpbGVzOyArK2kpIHsKLSAgICAgICAgICAgICAgICAvKiBrZWVwIHRoZSB0aWxlLWNvbXBvIGNvZGluZyBwYXJhbWV0ZXJzIHBvaW50ZXIgb2YgdGhlIGN1cnJlbnQgdGlsZSBjb2RpbmcgcGFyYW1ldGVycyovCi0gICAgICAgICAgICAgICAgbF9jdXJyZW50X3RjY3AgPSBsX3RjcC0+dGNjcHM7Ci0gICAgICAgICAgICAgICAgLypDb3B5IGRlZmF1bHQgY29kaW5nIHBhcmFtZXRlcnMgaW50byB0aGUgY3VycmVudCB0aWxlIGNvZGluZyBwYXJhbWV0ZXJzKi8KLSAgICAgICAgICAgICAgICBtZW1jcHkobF90Y3AsIGxfZGVmYXVsdF90Y3AsIHNpemVvZihvcGpfdGNwX3QpKTsKLSAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXplIHNvbWUgdmFsdWVzIG9mIHRoZSBjdXJyZW50IHRpbGUgY29kaW5nIHBhcmFtZXRlcnMqLwotICAgICAgICAgICAgICAgIGxfdGNwLT5jb2QgPSAwOwotICAgICAgICAgICAgICAgIGxfdGNwLT5wcHQgPSAwOwotICAgICAgICAgICAgICAgIGxfdGNwLT5wcHRfZGF0YSA9IDAwOwotICAgICAgICAgICAgICAgIC8qIFJlbW92ZSBtZW1vcnkgbm90IG93bmVkIGJ5IHRoaXMgdGlsZSBpbiBjYXNlIG9mIGVhcmx5IGVycm9yIHJldHVybi4gKi8KLSAgICAgICAgICAgICAgICBsX3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4ID0gMDA7Ci0gICAgICAgICAgICAgICAgbF90Y3AtPm1fbmJfbWF4X21jdF9yZWNvcmRzID0gMDsKLSAgICAgICAgICAgICAgICBsX3RjcC0+bV9tY3RfcmVjb3JkcyA9IDAwOwotICAgICAgICAgICAgICAgIGxfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkcyA9IDA7Ci0gICAgICAgICAgICAgICAgbF90Y3AtPm1fbWNjX3JlY29yZHMgPSAwMDsKLSAgICAgICAgICAgICAgICAvKiBSZWNvbm5lY3QgdGhlIHRpbGUtY29tcG8gY29kaW5nIHBhcmFtZXRlcnMgcG9pbnRlciB0byB0aGUgY3VycmVudCB0aWxlIGNvZGluZyBwYXJhbWV0ZXJzKi8KLSAgICAgICAgICAgICAgICBsX3RjcC0+dGNjcHMgPSBsX2N1cnJlbnRfdGNjcDsKKyAgICBsX2ltYWdlID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZTsKKyAgICBsX25iX3RpbGVzID0gcF9qMmstPm1fY3AudGggKiBwX2oyay0+bV9jcC50dzsKKyAgICBsX3RjcCA9IHBfajJrLT5tX2NwLnRjcHM7CisgICAgbF90Y2NwX3NpemUgPSBsX2ltYWdlLT5udW1jb21wcyAqIChPUEpfVUlOVDMyKXNpemVvZihvcGpfdGNjcF90KTsKKyAgICBsX2RlZmF1bHRfdGNwID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3A7CisgICAgbF9tY3Rfc2l6ZSA9IGxfaW1hZ2UtPm51bWNvbXBzICogbF9pbWFnZS0+bnVtY29tcHMgKiAoT1BKX1VJTlQzMilzaXplb2YoCisgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMik7CiAKLSAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1jdF9kZWNvZGluZ19tYXRyaXggb2YgdGhlIGRmbHRfdGlsZV9jcCBhbmQgY29weSB0aGVtIGludG8gdGhlIGN1cnJlbnQgdGlsZSBjcCovCi0gICAgICAgICAgICAgICAgaWYgKGxfZGVmYXVsdF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCA9IChPUEpfRkxPQVQzMiopb3BqX21hbGxvYyhsX21jdF9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIGxfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXggKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkobF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCxsX2RlZmF1bHRfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgsbF9tY3Rfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgIC8qIEZvciBlYWNoIHRpbGUgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbF9uYl90aWxlczsgKytpKSB7CisgICAgICAgIC8qIGtlZXAgdGhlIHRpbGUtY29tcG8gY29kaW5nIHBhcmFtZXRlcnMgcG9pbnRlciBvZiB0aGUgY3VycmVudCB0aWxlIGNvZGluZyBwYXJhbWV0ZXJzKi8KKyAgICAgICAgbF9jdXJyZW50X3RjY3AgPSBsX3RjcC0+dGNjcHM7CisgICAgICAgIC8qQ29weSBkZWZhdWx0IGNvZGluZyBwYXJhbWV0ZXJzIGludG8gdGhlIGN1cnJlbnQgdGlsZSBjb2RpbmcgcGFyYW1ldGVycyovCisgICAgICAgIG1lbWNweShsX3RjcCwgbF9kZWZhdWx0X3RjcCwgc2l6ZW9mKG9wal90Y3BfdCkpOworICAgICAgICAvKiBJbml0aWFsaXplIHNvbWUgdmFsdWVzIG9mIHRoZSBjdXJyZW50IHRpbGUgY29kaW5nIHBhcmFtZXRlcnMqLworICAgICAgICBsX3RjcC0+Y29kID0gMDsKKyAgICAgICAgbF90Y3AtPnBwdCA9IDA7CisgICAgICAgIGxfdGNwLT5wcHRfZGF0YSA9IDAwOworICAgICAgICBsX3RjcC0+bV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXIgPSAtMTsKKyAgICAgICAgLyogUmVtb3ZlIG1lbW9yeSBub3Qgb3duZWQgYnkgdGhpcyB0aWxlIGluIGNhc2Ugb2YgZWFybHkgZXJyb3IgcmV0dXJuLiAqLworICAgICAgICBsX3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4ID0gMDA7CisgICAgICAgIGxfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyA9IDA7CisgICAgICAgIGxfdGNwLT5tX21jdF9yZWNvcmRzID0gMDA7CisgICAgICAgIGxfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkcyA9IDA7CisgICAgICAgIGxfdGNwLT5tX21jY19yZWNvcmRzID0gMDA7CisgICAgICAgIC8qIFJlY29ubmVjdCB0aGUgdGlsZS1jb21wbyBjb2RpbmcgcGFyYW1ldGVycyBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHRpbGUgY29kaW5nIHBhcmFtZXRlcnMqLworICAgICAgICBsX3RjcC0+dGNjcHMgPSBsX2N1cnJlbnRfdGNjcDsKIAotICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbWN0X3JlY29yZCBvZiB0aGUgZGZsdF90aWxlX2NwIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgY3VycmVudCB0aWxlIGNwKi8KLSAgICAgICAgICAgICAgICBsX21jdF9yZWNvcmRzX3NpemUgPSBsX2RlZmF1bHRfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyAqIChPUEpfVUlOVDMyKXNpemVvZihvcGpfbWN0X2RhdGFfdCk7Ci0gICAgICAgICAgICAgICAgbF90Y3AtPm1fbWN0X3JlY29yZHMgPSAob3BqX21jdF9kYXRhX3QqKW9wal9tYWxsb2MobF9tY3RfcmVjb3Jkc19zaXplKTsKLSAgICAgICAgICAgICAgICBpZiAoISBsX3RjcC0+bV9tY3RfcmVjb3JkcykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGxfdGNwLT5tX21jdF9yZWNvcmRzLCBsX2RlZmF1bHRfdGNwLT5tX21jdF9yZWNvcmRzLGxfbWN0X3JlY29yZHNfc2l6ZSk7Ci0KLSAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBtY3QgcmVjb3JkIGRhdGEgZnJvbSBkZmx0X3RpbGVfY3AgdG8gdGhlIGN1cnJlbnQgdGlsZSovCi0gICAgICAgICAgICAgICAgbF9zcmNfbWN0X3JlYyA9IGxfZGVmYXVsdF90Y3AtPm1fbWN0X3JlY29yZHM7Ci0gICAgICAgICAgICAgICAgbF9kZXN0X21jdF9yZWMgPSBsX3RjcC0+bV9tY3RfcmVjb3JkczsKLQotICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9kZWZhdWx0X3RjcC0+bV9uYl9tY3RfcmVjb3JkczsrK2opIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfc3JjX21jdF9yZWMtPm1fZGF0YSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZGVzdF9tY3RfcmVjLT5tX2RhdGEgPSAoT1BKX0JZVEUqKSBvcGpfbWFsbG9jKGxfc3JjX21jdF9yZWMtPm1fZGF0YV9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoISBsX2Rlc3RfbWN0X3JlYy0+bV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkobF9kZXN0X21jdF9yZWMtPm1fZGF0YSxsX3NyY19tY3RfcmVjLT5tX2RhdGEsbF9zcmNfbWN0X3JlYy0+bV9kYXRhX3NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICArK2xfc3JjX21jdF9yZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICArK2xfZGVzdF9tY3RfcmVjOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHdpdGggZWFjaCBwYXNzIHRvIGZyZWUgZXhhY3RseSB3aGF0IGhhcyBiZWVuIGFsbG9jYXRlZCBvbiBlYXJseSByZXR1cm4uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBsX3RjcC0+bV9uYl9tYXhfbWN0X3JlY29yZHMgKz0gMTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1jY19yZWNvcmQgb2YgdGhlIGRmbHRfdGlsZV9jcCBhbmQgY29weSB0aGVtIGludG8gdGhlIGN1cnJlbnQgdGlsZSBjcCovCi0gICAgICAgICAgICAgICAgbF9tY2NfcmVjb3Jkc19zaXplID0gbF9kZWZhdWx0X3RjcC0+bV9uYl9tYXhfbWNjX3JlY29yZHMgKiAoT1BKX1VJTlQzMilzaXplb2Yob3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QpOwotICAgICAgICAgICAgICAgIGxfdGNwLT5tX21jY19yZWNvcmRzID0gKG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90Kikgb3BqX21hbGxvYyhsX21jY19yZWNvcmRzX3NpemUpOwotICAgICAgICAgICAgICAgIGlmICghIGxfdGNwLT5tX21jY19yZWNvcmRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkobF90Y3AtPm1fbWNjX3JlY29yZHMsbF9kZWZhdWx0X3RjcC0+bV9tY2NfcmVjb3JkcyxsX21jY19yZWNvcmRzX3NpemUpOwotICAgICAgICAgICAgICAgIGxfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkcyA9IGxfZGVmYXVsdF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzOwotCi0gICAgICAgICAgICAgICAgLyogQ29weSB0aGUgbWNjIHJlY29yZCBkYXRhIGZyb20gZGZsdF90aWxlX2NwIHRvIHRoZSBjdXJyZW50IHRpbGUqLwotICAgICAgICAgICAgICAgIGxfc3JjX21jY19yZWMgPSBsX2RlZmF1bHRfdGNwLT5tX21jY19yZWNvcmRzOwotICAgICAgICAgICAgICAgIGxfZGVzdF9tY2NfcmVjID0gbF90Y3AtPm1fbWNjX3JlY29yZHM7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfZGVmYXVsdF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzOysraikgewotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9zcmNfbWNjX3JlYy0+bV9kZWNvcnJlbGF0aW9uX2FycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfb2Zmc2V0ID0gKE9QSl9VSU5UMzIpKGxfc3JjX21jY19yZWMtPm1fZGVjb3JyZWxhdGlvbl9hcnJheSAtIGxfZGVmYXVsdF90Y3AtPm1fbWN0X3JlY29yZHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2Rlc3RfbWNjX3JlYy0+bV9kZWNvcnJlbGF0aW9uX2FycmF5ID0gbF90Y3AtPm1fbWN0X3JlY29yZHMgKyBsX29mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfc3JjX21jY19yZWMtPm1fb2Zmc2V0X2FycmF5KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfb2Zmc2V0ID0gKE9QSl9VSU5UMzIpKGxfc3JjX21jY19yZWMtPm1fb2Zmc2V0X2FycmF5IC0gbF9kZWZhdWx0X3RjcC0+bV9tY3RfcmVjb3Jkcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZGVzdF9tY2NfcmVjLT5tX29mZnNldF9hcnJheSA9IGxfdGNwLT5tX21jdF9yZWNvcmRzICsgbF9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICsrbF9zcmNfbWNjX3JlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICsrbF9kZXN0X21jY19yZWM7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogQ29weSBhbGwgdGhlIGRmbHRfdGlsZV9jb21wb19jcCB0byB0aGUgY3VycmVudCB0aWxlIGNwICovCi0gICAgICAgICAgICAgICAgbWVtY3B5KGxfY3VycmVudF90Y2NwLGxfZGVmYXVsdF90Y3AtPnRjY3BzLGxfdGNjcF9zaXplKTsKLQotICAgICAgICAgICAgICAgIC8qIE1vdmUgdG8gbmV4dCB0aWxlIGNwKi8KLSAgICAgICAgICAgICAgICArK2xfdGNwOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ3JlYXRlIHRoZSBjdXJyZW50IHRpbGUgZGVjb2RlciovCi0gICAgICAgIHBfajJrLT5tX3RjZCA9IChvcGpfdGNkX3QqKW9wal90Y2RfY3JlYXRlKE9QSl9UUlVFKTsgLyogRklYTUUgd2h5IGEgY2FzdCA/ICovCi0gICAgICAgIGlmICghIHBfajJrLT5tX3RjZCApIHsKKyAgICAgICAgLyogR2V0IHRoZSBtY3RfZGVjb2RpbmdfbWF0cml4IG9mIHRoZSBkZmx0X3RpbGVfY3AgYW5kIGNvcHkgdGhlbSBpbnRvIHRoZSBjdXJyZW50IHRpbGUgY3AqLworICAgICAgICBpZiAobF9kZWZhdWx0X3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4KSB7CisgICAgICAgICAgICBsX3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4ID0gKE9QSl9GTE9BVDMyKilvcGpfbWFsbG9jKGxfbWN0X3NpemUpOworICAgICAgICAgICAgaWYgKCEgbF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCkgewogICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkobF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCwgbF9kZWZhdWx0X3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4LAorICAgICAgICAgICAgICAgICAgIGxfbWN0X3NpemUpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCAhb3BqX3RjZF9pbml0KHBfajJrLT5tX3RjZCwgbF9pbWFnZSwgJihwX2oyay0+bV9jcCkpICkgewotICAgICAgICAgICAgICAgIG9wal90Y2RfZGVzdHJveShwX2oyay0+bV90Y2QpOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3RjZCA9IDAwOwotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJDYW5ub3QgZGVjb2RlIHRpbGUsIG1lbW9yeSBlcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgLyogR2V0IHRoZSBtY3RfcmVjb3JkIG9mIHRoZSBkZmx0X3RpbGVfY3AgYW5kIGNvcHkgdGhlbSBpbnRvIHRoZSBjdXJyZW50IHRpbGUgY3AqLworICAgICAgICBsX21jdF9yZWNvcmRzX3NpemUgPSBsX2RlZmF1bHRfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyAqIChPUEpfVUlOVDMyKXNpemVvZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9tY3RfZGF0YV90KTsKKyAgICAgICAgbF90Y3AtPm1fbWN0X3JlY29yZHMgPSAob3BqX21jdF9kYXRhX3QqKW9wal9tYWxsb2MobF9tY3RfcmVjb3Jkc19zaXplKTsKKyAgICAgICAgaWYgKCEgbF90Y3AtPm1fbWN0X3JlY29yZHMpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGxfdGNwLT5tX21jdF9yZWNvcmRzLCBsX2RlZmF1bHRfdGNwLT5tX21jdF9yZWNvcmRzLCBsX21jdF9yZWNvcmRzX3NpemUpOworCisgICAgICAgIC8qIENvcHkgdGhlIG1jdCByZWNvcmQgZGF0YSBmcm9tIGRmbHRfdGlsZV9jcCB0byB0aGUgY3VycmVudCB0aWxlKi8KKyAgICAgICAgbF9zcmNfbWN0X3JlYyA9IGxfZGVmYXVsdF90Y3AtPm1fbWN0X3JlY29yZHM7CisgICAgICAgIGxfZGVzdF9tY3RfcmVjID0gbF90Y3AtPm1fbWN0X3JlY29yZHM7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGxfZGVmYXVsdF90Y3AtPm1fbmJfbWN0X3JlY29yZHM7ICsraikgeworCisgICAgICAgICAgICBpZiAobF9zcmNfbWN0X3JlYy0+bV9kYXRhKSB7CisKKyAgICAgICAgICAgICAgICBsX2Rlc3RfbWN0X3JlYy0+bV9kYXRhID0gKE9QSl9CWVRFKikgb3BqX21hbGxvYyhsX3NyY19tY3RfcmVjLT5tX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCEgbF9kZXN0X21jdF9yZWMtPm1fZGF0YSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1jcHkobF9kZXN0X21jdF9yZWMtPm1fZGF0YSwgbF9zcmNfbWN0X3JlYy0+bV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBsX3NyY19tY3RfcmVjLT5tX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICsrbF9zcmNfbWN0X3JlYzsKKyAgICAgICAgICAgICsrbF9kZXN0X21jdF9yZWM7CisgICAgICAgICAgICAvKiBVcGRhdGUgd2l0aCBlYWNoIHBhc3MgdG8gZnJlZSBleGFjdGx5IHdoYXQgaGFzIGJlZW4gYWxsb2NhdGVkIG9uIGVhcmx5IHJldHVybi4gKi8KKyAgICAgICAgICAgIGxfdGNwLT5tX25iX21heF9tY3RfcmVjb3JkcyArPSAxOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1zdGF0aWMgY29uc3Qgb3BqX2RlY19tZW1vcnlfbWFya2VyX2hhbmRsZXJfdCAqIG9wal9qMmtfZ2V0X21hcmtlcl9oYW5kbGVyIChPUEpfVUlOVDMyIHBfaWQpCi17Ci0gICAgICAgIGNvbnN0IG9wal9kZWNfbWVtb3J5X21hcmtlcl9oYW5kbGVyX3QgKmU7Ci0gICAgICAgIGZvciAoZSA9IGoya19tZW1vcnlfbWFya2VyX2hhbmRsZXJfdGFiOyBlLT5pZCAhPSAwOyArK2UpIHsKLSAgICAgICAgICAgICAgICBpZiAoZS0+aWQgPT0gcF9pZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qIHdlIGZpbmQgYSBoYW5kbGVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1hcmtlciBJRCovCi0gICAgICAgICAgICAgICAgfQorICAgICAgICAvKiBHZXQgdGhlIG1jY19yZWNvcmQgb2YgdGhlIGRmbHRfdGlsZV9jcCBhbmQgY29weSB0aGVtIGludG8gdGhlIGN1cnJlbnQgdGlsZSBjcCovCisgICAgICAgIGxfbWNjX3JlY29yZHNfc2l6ZSA9IGxfZGVmYXVsdF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzICogKE9QSl9VSU5UMzIpc2l6ZW9mKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QpOworICAgICAgICBsX3RjcC0+bV9tY2NfcmVjb3JkcyA9IChvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdCopIG9wal9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbWNjX3JlY29yZHNfc2l6ZSk7CisgICAgICAgIGlmICghIGxfdGNwLT5tX21jY19yZWNvcmRzKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlOwotfQorICAgICAgICBtZW1jcHkobF90Y3AtPm1fbWNjX3JlY29yZHMsIGxfZGVmYXVsdF90Y3AtPm1fbWNjX3JlY29yZHMsIGxfbWNjX3JlY29yZHNfc2l6ZSk7CisgICAgICAgIGxfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkcyA9IGxfZGVmYXVsdF90Y3AtPm1fbmJfbWF4X21jY19yZWNvcmRzOwogCi12b2lkIG9wal9qMmtfZGVzdHJveSAob3BqX2oya190ICpwX2oyaykKLXsKLSAgICAgICAgaWYgKHBfajJrID09IDAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAvKiBDb3B5IHRoZSBtY2MgcmVjb3JkIGRhdGEgZnJvbSBkZmx0X3RpbGVfY3AgdG8gdGhlIGN1cnJlbnQgdGlsZSovCisgICAgICAgIGxfc3JjX21jY19yZWMgPSBsX2RlZmF1bHRfdGNwLT5tX21jY19yZWNvcmRzOworICAgICAgICBsX2Rlc3RfbWNjX3JlYyA9IGxfdGNwLT5tX21jY19yZWNvcmRzOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBsX2RlZmF1bHRfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkczsgKytqKSB7CisKKyAgICAgICAgICAgIGlmIChsX3NyY19tY2NfcmVjLT5tX2RlY29ycmVsYXRpb25fYXJyYXkpIHsKKyAgICAgICAgICAgICAgICBsX29mZnNldCA9IChPUEpfVUlOVDMyKShsX3NyY19tY2NfcmVjLT5tX2RlY29ycmVsYXRpb25fYXJyYXkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZGVmYXVsdF90Y3AtPm1fbWN0X3JlY29yZHMpOworICAgICAgICAgICAgICAgIGxfZGVzdF9tY2NfcmVjLT5tX2RlY29ycmVsYXRpb25fYXJyYXkgPSBsX3RjcC0+bV9tY3RfcmVjb3JkcyArIGxfb2Zmc2V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobF9zcmNfbWNjX3JlYy0+bV9vZmZzZXRfYXJyYXkpIHsKKyAgICAgICAgICAgICAgICBsX29mZnNldCA9IChPUEpfVUlOVDMyKShsX3NyY19tY2NfcmVjLT5tX29mZnNldF9hcnJheSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9kZWZhdWx0X3RjcC0+bV9tY3RfcmVjb3Jkcyk7CisgICAgICAgICAgICAgICAgbF9kZXN0X21jY19yZWMtPm1fb2Zmc2V0X2FycmF5ID0gbF90Y3AtPm1fbWN0X3JlY29yZHMgKyBsX29mZnNldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKytsX3NyY19tY2NfcmVjOworICAgICAgICAgICAgKytsX2Rlc3RfbWNjX3JlYzsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChwX2oyay0+bV9pc19kZWNvZGVyKSB7CisgICAgICAgIC8qIENvcHkgYWxsIHRoZSBkZmx0X3RpbGVfY29tcG9fY3AgdG8gdGhlIGN1cnJlbnQgdGlsZSBjcCAqLworICAgICAgICBtZW1jcHkobF9jdXJyZW50X3RjY3AsIGxfZGVmYXVsdF90Y3AtPnRjY3BzLCBsX3RjY3Bfc2l6ZSk7CiAKLSAgICAgICAgICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3AgIT0gMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9qMmtfdGNwX2Rlc3Ryb3kocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3AgPSAwMDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIC8qIE1vdmUgdG8gbmV4dCB0aWxlIGNwKi8KKyAgICAgICAgKytsX3RjcDsKKyAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEgIT0gMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhID0gMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YV9zaXplID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7CisgICAgLyogQ3JlYXRlIHRoZSBjdXJyZW50IHRpbGUgZGVjb2RlciovCisgICAgcF9qMmstPm1fdGNkID0gb3BqX3RjZF9jcmVhdGUoT1BKX1RSVUUpOworICAgIGlmICghIHBfajJrLT5tX3RjZCkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fZW5jb2RlZF90aWxlX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fZW5jb2RlZF90aWxlX2RhdGEgPSAwMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2J1ZmZlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2J1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfYnVmZmVyID0gMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfY3VycmVudCA9IDAwOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSAwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KKyAgICBpZiAoIW9wal90Y2RfaW5pdChwX2oyay0+bV90Y2QsIGxfaW1hZ2UsICYocF9qMmstPm1fY3ApLCBwX2oyay0+bV90cCkpIHsKICAgICAgICAgb3BqX3RjZF9kZXN0cm95KHBfajJrLT5tX3RjZCk7CisgICAgICAgIHBfajJrLT5tX3RjZCA9IDAwOworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ2Fubm90IGRlY29kZSB0aWxlLCBtZW1vcnkgZXJyb3JcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICBvcGpfajJrX2NwX2Rlc3Ryb3koJihwX2oyay0+bV9jcCkpOwotICAgICAgICBtZW1zZXQoJihwX2oyay0+bV9jcCksMCxzaXplb2Yob3BqX2NwX3QpKTsKLQotICAgICAgICBvcGpfcHJvY2VkdXJlX2xpc3RfZGVzdHJveShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCk7Ci0gICAgICAgIHBfajJrLT5tX3Byb2NlZHVyZV9saXN0ID0gMDA7Ci0KLSAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X2Rlc3Ryb3kocF9qMmstPm1fdmFsaWRhdGlvbl9saXN0KTsKLSAgICAgICAgcF9qMmstPm1fcHJvY2VkdXJlX2xpc3QgPSAwMDsKLQotICAgICAgICBqMmtfZGVzdHJveV9jc3RyX2luZGV4KHBfajJrLT5jc3RyX2luZGV4KTsKLSAgICAgICAgcF9qMmstPmNzdHJfaW5kZXggPSBOVUxMOwotCi0gICAgICAgIG9wal9pbWFnZV9kZXN0cm95KHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpOwotICAgICAgICBwX2oyay0+bV9wcml2YXRlX2ltYWdlID0gTlVMTDsKLQotICAgICAgICBvcGpfaW1hZ2VfZGVzdHJveShwX2oyay0+bV9vdXRwdXRfaW1hZ2UpOwotICAgICAgICBwX2oyay0+bV9vdXRwdXRfaW1hZ2UgPSBOVUxMOwotCi0gICAgICAgIG9wal9mcmVlKHBfajJrKTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXZvaWQgajJrX2Rlc3Ryb3lfY3N0cl9pbmRleCAob3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqcF9jc3RyX2luZCkKK3N0YXRpYyBjb25zdCBvcGpfZGVjX21lbW9yeV9tYXJrZXJfaGFuZGxlcl90ICogb3BqX2oya19nZXRfbWFya2VyX2hhbmRsZXIoCisgICAgT1BKX1VJTlQzMiBwX2lkKQogewotICAgICAgICBpZiAocF9jc3RyX2luZCkgewotCi0gICAgICAgICAgICAgICAgaWYgKHBfY3N0cl9pbmQtPm1hcmtlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9jc3RyX2luZC0+bWFya2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmQtPm1hcmtlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHBfY3N0cl9pbmQtPnRpbGVfaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgaXRfdGlsZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaXRfdGlsZT0wOyBpdF90aWxlIDwgcF9jc3RyX2luZC0+bmJfb2ZfdGlsZXM7IGl0X3RpbGUrKykgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBfY3N0cl9pbmQtPnRpbGVfaW5kZXhbaXRfdGlsZV0ucGFja2V0X2luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9jc3RyX2luZC0+dGlsZV9pbmRleFtpdF90aWxlXS5wYWNrZXRfaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmQtPnRpbGVfaW5kZXhbaXRfdGlsZV0ucGFja2V0X2luZGV4ID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBfY3N0cl9pbmQtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfY3N0cl9pbmQtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmQtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXggPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocF9jc3RyX2luZC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrZXIpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfY3N0cl9pbmQtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NzdHJfaW5kLT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlciA9IE5VTEw7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZSggcF9jc3RyX2luZC0+dGlsZV9pbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2NzdHJfaW5kLT50aWxlX2luZGV4ID0gTlVMTDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2NzdHJfaW5kKTsKKyAgICBjb25zdCBvcGpfZGVjX21lbW9yeV9tYXJrZXJfaGFuZGxlcl90ICplOworICAgIGZvciAoZSA9IGoya19tZW1vcnlfbWFya2VyX2hhbmRsZXJfdGFiOyBlLT5pZCAhPSAwOyArK2UpIHsKKyAgICAgICAgaWYgKGUtPmlkID09IHBfaWQpIHsKKyAgICAgICAgICAgIGJyZWFrOyAvKiB3ZSBmaW5kIGEgaGFuZGxlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBtYXJrZXIgSUQqLwogICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBlOwogfQogCi1zdGF0aWMgdm9pZCBvcGpfajJrX3RjcF9kZXN0cm95IChvcGpfdGNwX3QgKnBfdGNwKQordm9pZCBvcGpfajJrX2Rlc3Ryb3kob3BqX2oya190ICpwX2oyaykKIHsKLQlpZiAocF90Y3AgPT0gMDApIHsKLQkJcmV0dXJuOwotCX0KLQkKLQlpZiAocF90Y3AtPnBwdF9tYXJrZXJzICE9IDAwKSB7Ci0JCU9QSl9VSU5UMzIgaTsKLQkJZm9yIChpID0gMFU7IGkgPCBwX3RjcC0+cHB0X21hcmtlcnNfY291bnQ7ICsraSkgewotCQkJaWYgKHBfdGNwLT5wcHRfbWFya2Vyc1tpXS5tX2RhdGEgIT0gTlVMTCkgewotCQkJCW9wal9mcmVlKHBfdGNwLT5wcHRfbWFya2Vyc1tpXS5tX2RhdGEpOwotCQkJfQotCQl9Ci0JCXBfdGNwLT5wcHRfbWFya2Vyc19jb3VudCA9IDBVOwotCQlvcGpfZnJlZShwX3RjcC0+cHB0X21hcmtlcnMpOwotCQlwX3RjcC0+cHB0X21hcmtlcnMgPSBOVUxMOwotCX0KLQkKLQlpZiAocF90Y3AtPnBwdF9idWZmZXIgIT0gMDApIHsKLQkJb3BqX2ZyZWUocF90Y3AtPnBwdF9idWZmZXIpOwotCQlwX3RjcC0+cHB0X2J1ZmZlciA9IDAwOwotCX0KLQkKLQlpZiAocF90Y3AtPnRjY3BzICE9IDAwKSB7Ci0JCW9wal9mcmVlKHBfdGNwLT50Y2Nwcyk7Ci0JCXBfdGNwLT50Y2NwcyA9IDAwOwotCX0KLQkKLQlpZiAocF90Y3AtPm1fbWN0X2NvZGluZ19tYXRyaXggIT0gMDApIHsKLQkJb3BqX2ZyZWUocF90Y3AtPm1fbWN0X2NvZGluZ19tYXRyaXgpOwotCQlwX3RjcC0+bV9tY3RfY29kaW5nX21hdHJpeCA9IDAwOwotCX0KLQkKLQlpZiAocF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCAhPSAwMCkgewotCQlvcGpfZnJlZShwX3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4KTsKLQkJcF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCA9IDAwOwotCX0KLQkKLQlpZiAocF90Y3AtPm1fbWNjX3JlY29yZHMpIHsKLQkJb3BqX2ZyZWUocF90Y3AtPm1fbWNjX3JlY29yZHMpOwotCQlwX3RjcC0+bV9tY2NfcmVjb3JkcyA9IDAwOwotCQlwX3RjcC0+bV9uYl9tYXhfbWNjX3JlY29yZHMgPSAwOwotCQlwX3RjcC0+bV9uYl9tY2NfcmVjb3JkcyA9IDA7Ci0JfQotCQotCWlmIChwX3RjcC0+bV9tY3RfcmVjb3JkcykgewotCQlvcGpfbWN0X2RhdGFfdCAqIGxfbWN0X2RhdGEgPSBwX3RjcC0+bV9tY3RfcmVjb3JkczsKLQkJT1BKX1VJTlQzMiBpOwotCQkKLQkJZm9yIChpPTA7aTxwX3RjcC0+bV9uYl9tY3RfcmVjb3JkczsrK2kpIHsKLQkJCWlmIChsX21jdF9kYXRhLT5tX2RhdGEpIHsKLQkJCQlvcGpfZnJlZShsX21jdF9kYXRhLT5tX2RhdGEpOwotCQkJCWxfbWN0X2RhdGEtPm1fZGF0YSA9IDAwOwotCQkJfQotCQkJCi0JCQkrK2xfbWN0X2RhdGE7Ci0JCX0KLQkJCi0JCW9wal9mcmVlKHBfdGNwLT5tX21jdF9yZWNvcmRzKTsKLQkJcF90Y3AtPm1fbWN0X3JlY29yZHMgPSAwMDsKLQl9CisgICAgaWYgKHBfajJrID09IDAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLQlpZiAocF90Y3AtPm1jdF9ub3JtcyAhPSAwMCkgewotCQlvcGpfZnJlZShwX3RjcC0+bWN0X25vcm1zKTsKLQkJcF90Y3AtPm1jdF9ub3JtcyA9IDAwOwotCX0KKyAgICBpZiAocF9qMmstPm1faXNfZGVjb2RlcikgewogCi0Jb3BqX2oya190Y3BfZGF0YV9kZXN0cm95KHBfdGNwKTsKKyAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwICE9IDAwKSB7CisgICAgICAgICAgICBvcGpfajJrX3RjcF9kZXN0cm95KHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwKTsKKyAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwKTsKKyAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwID0gMDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEgIT0gMDApIHsKKyAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhKTsKKyAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhID0gMDA7CisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YV9zaXplID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2NvbXBzX2luZGljZXNfdG9fZGVjb2RlKTsKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fY29tcHNfaW5kaWNlc190b19kZWNvZGUgPSAwMDsKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fbnVtY29tcHNfdG9fZGVjb2RlID0gMDsKKworICAgIH0gZWxzZSB7CisKKyAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2VuY29kZWRfdGlsZV9kYXRhKSB7CisgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YSk7CisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YSA9IDAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19idWZmZXIpIHsKKyAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19idWZmZXIpOworICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2J1ZmZlciA9IDAwOworICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2N1cnJlbnQgPSAwMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKSB7CisgICAgICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKTsKKyAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGEgPSAwMDsKKyAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2hlYWRlcl90aWxlX2RhdGFfc2l6ZSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvcGpfdGNkX2Rlc3Ryb3kocF9qMmstPm1fdGNkKTsKKworICAgIG9wal9qMmtfY3BfZGVzdHJveSgmKHBfajJrLT5tX2NwKSk7CisgICAgbWVtc2V0KCYocF9qMmstPm1fY3ApLCAwLCBzaXplb2Yob3BqX2NwX3QpKTsKKworICAgIG9wal9wcm9jZWR1cmVfbGlzdF9kZXN0cm95KHBfajJrLT5tX3Byb2NlZHVyZV9saXN0KTsKKyAgICBwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCA9IDAwOworCisgICAgb3BqX3Byb2NlZHVyZV9saXN0X2Rlc3Ryb3kocF9qMmstPm1fdmFsaWRhdGlvbl9saXN0KTsKKyAgICBwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCA9IDAwOworCisgICAgajJrX2Rlc3Ryb3lfY3N0cl9pbmRleChwX2oyay0+Y3N0cl9pbmRleCk7CisgICAgcF9qMmstPmNzdHJfaW5kZXggPSBOVUxMOworCisgICAgb3BqX2ltYWdlX2Rlc3Ryb3kocF9qMmstPm1fcHJpdmF0ZV9pbWFnZSk7CisgICAgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZSA9IE5VTEw7CisKKyAgICBvcGpfaW1hZ2VfZGVzdHJveShwX2oyay0+bV9vdXRwdXRfaW1hZ2UpOworICAgIHBfajJrLT5tX291dHB1dF9pbWFnZSA9IE5VTEw7CisKKyAgICBvcGpfdGhyZWFkX3Bvb2xfZGVzdHJveShwX2oyay0+bV90cCk7CisgICAgcF9qMmstPm1fdHAgPSBOVUxMOworCisgICAgb3BqX2ZyZWUocF9qMmspOworfQorCit2b2lkIGoya19kZXN0cm95X2NzdHJfaW5kZXgob3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqcF9jc3RyX2luZCkKK3sKKyAgICBpZiAocF9jc3RyX2luZCkgeworCisgICAgICAgIGlmIChwX2NzdHJfaW5kLT5tYXJrZXIpIHsKKyAgICAgICAgICAgIG9wal9mcmVlKHBfY3N0cl9pbmQtPm1hcmtlcik7CisgICAgICAgICAgICBwX2NzdHJfaW5kLT5tYXJrZXIgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBfY3N0cl9pbmQtPnRpbGVfaW5kZXgpIHsKKyAgICAgICAgICAgIE9QSl9VSU5UMzIgaXRfdGlsZSA9IDA7CisKKyAgICAgICAgICAgIGZvciAoaXRfdGlsZSA9IDA7IGl0X3RpbGUgPCBwX2NzdHJfaW5kLT5uYl9vZl90aWxlczsgaXRfdGlsZSsrKSB7CisKKyAgICAgICAgICAgICAgICBpZiAocF9jc3RyX2luZC0+dGlsZV9pbmRleFtpdF90aWxlXS5wYWNrZXRfaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9jc3RyX2luZC0+dGlsZV9pbmRleFtpdF90aWxlXS5wYWNrZXRfaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBwX2NzdHJfaW5kLT50aWxlX2luZGV4W2l0X3RpbGVdLnBhY2tldF9pbmRleCA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBfY3N0cl9pbmQtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9jc3RyX2luZC0+dGlsZV9pbmRleFtpdF90aWxlXS50cF9pbmRleCk7CisgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmQtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXggPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwX2NzdHJfaW5kLT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlcikgeworICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShwX2NzdHJfaW5kLT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlcik7CisgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmQtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya2VyID0gTlVMTDsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3BqX2ZyZWUocF9jc3RyX2luZC0+dGlsZV9pbmRleCk7CisgICAgICAgICAgICBwX2NzdHJfaW5kLT50aWxlX2luZGV4ID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIG9wal9mcmVlKHBfY3N0cl9pbmQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgb3BqX2oya190Y3BfZGVzdHJveShvcGpfdGNwX3QgKnBfdGNwKQoreworICAgIGlmIChwX3RjcCA9PSAwMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHBfdGNwLT5wcHRfbWFya2VycyAhPSAwMCkgeworICAgICAgICBPUEpfVUlOVDMyIGk7CisgICAgICAgIGZvciAoaSA9IDBVOyBpIDwgcF90Y3AtPnBwdF9tYXJrZXJzX2NvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGlmIChwX3RjcC0+cHB0X21hcmtlcnNbaV0ubV9kYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShwX3RjcC0+cHB0X21hcmtlcnNbaV0ubV9kYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwX3RjcC0+cHB0X21hcmtlcnNfY291bnQgPSAwVTsKKyAgICAgICAgb3BqX2ZyZWUocF90Y3AtPnBwdF9tYXJrZXJzKTsKKyAgICAgICAgcF90Y3AtPnBwdF9tYXJrZXJzID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAocF90Y3AtPnBwdF9idWZmZXIgIT0gMDApIHsKKyAgICAgICAgb3BqX2ZyZWUocF90Y3AtPnBwdF9idWZmZXIpOworICAgICAgICBwX3RjcC0+cHB0X2J1ZmZlciA9IDAwOworICAgIH0KKworICAgIGlmIChwX3RjcC0+dGNjcHMgIT0gMDApIHsKKyAgICAgICAgb3BqX2ZyZWUocF90Y3AtPnRjY3BzKTsKKyAgICAgICAgcF90Y3AtPnRjY3BzID0gMDA7CisgICAgfQorCisgICAgaWYgKHBfdGNwLT5tX21jdF9jb2RpbmdfbWF0cml4ICE9IDAwKSB7CisgICAgICAgIG9wal9mcmVlKHBfdGNwLT5tX21jdF9jb2RpbmdfbWF0cml4KTsKKyAgICAgICAgcF90Y3AtPm1fbWN0X2NvZGluZ19tYXRyaXggPSAwMDsKKyAgICB9CisKKyAgICBpZiAocF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCAhPSAwMCkgeworICAgICAgICBvcGpfZnJlZShwX3RjcC0+bV9tY3RfZGVjb2RpbmdfbWF0cml4KTsKKyAgICAgICAgcF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCA9IDAwOworICAgIH0KKworICAgIGlmIChwX3RjcC0+bV9tY2NfcmVjb3JkcykgeworICAgICAgICBvcGpfZnJlZShwX3RjcC0+bV9tY2NfcmVjb3Jkcyk7CisgICAgICAgIHBfdGNwLT5tX21jY19yZWNvcmRzID0gMDA7CisgICAgICAgIHBfdGNwLT5tX25iX21heF9tY2NfcmVjb3JkcyA9IDA7CisgICAgICAgIHBfdGNwLT5tX25iX21jY19yZWNvcmRzID0gMDsKKyAgICB9CisKKyAgICBpZiAocF90Y3AtPm1fbWN0X3JlY29yZHMpIHsKKyAgICAgICAgb3BqX21jdF9kYXRhX3QgKiBsX21jdF9kYXRhID0gcF90Y3AtPm1fbWN0X3JlY29yZHM7CisgICAgICAgIE9QSl9VSU5UMzIgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcF90Y3AtPm1fbmJfbWN0X3JlY29yZHM7ICsraSkgeworICAgICAgICAgICAgaWYgKGxfbWN0X2RhdGEtPm1fZGF0YSkgeworICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfbWN0X2RhdGEtPm1fZGF0YSk7CisgICAgICAgICAgICAgICAgbF9tY3RfZGF0YS0+bV9kYXRhID0gMDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICsrbF9tY3RfZGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIG9wal9mcmVlKHBfdGNwLT5tX21jdF9yZWNvcmRzKTsKKyAgICAgICAgcF90Y3AtPm1fbWN0X3JlY29yZHMgPSAwMDsKKyAgICB9CisKKyAgICBpZiAocF90Y3AtPm1jdF9ub3JtcyAhPSAwMCkgeworICAgICAgICBvcGpfZnJlZShwX3RjcC0+bWN0X25vcm1zKTsKKyAgICAgICAgcF90Y3AtPm1jdF9ub3JtcyA9IDAwOworICAgIH0KKworICAgIG9wal9qMmtfdGNwX2RhdGFfZGVzdHJveShwX3RjcCk7CiAKIH0KIAotc3RhdGljIHZvaWQgb3BqX2oya190Y3BfZGF0YV9kZXN0cm95IChvcGpfdGNwX3QgKnBfdGNwKQorc3RhdGljIHZvaWQgb3BqX2oya190Y3BfZGF0YV9kZXN0cm95KG9wal90Y3BfdCAqcF90Y3ApCiB7Ci0gICAgICAgIGlmIChwX3RjcC0+bV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2ZyZWUocF90Y3AtPm1fZGF0YSk7Ci0gICAgICAgICAgICAgICAgcF90Y3AtPm1fZGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcF90Y3AtPm1fZGF0YV9zaXplID0gMDsKLSAgICAgICAgfQorICAgIGlmIChwX3RjcC0+bV9kYXRhKSB7CisgICAgICAgIG9wal9mcmVlKHBfdGNwLT5tX2RhdGEpOworICAgICAgICBwX3RjcC0+bV9kYXRhID0gTlVMTDsKKyAgICAgICAgcF90Y3AtPm1fZGF0YV9zaXplID0gMDsKKyAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIG9wal9qMmtfY3BfZGVzdHJveSAob3BqX2NwX3QgKnBfY3ApCitzdGF0aWMgdm9pZCBvcGpfajJrX2NwX2Rlc3Ryb3kob3BqX2NwX3QgKnBfY3ApCiB7Ci0JT1BKX1VJTlQzMiBsX25iX3RpbGVzOwotCW9wal90Y3BfdCAqIGxfY3VycmVudF90aWxlID0gMDA7CisgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzOworICAgIG9wal90Y3BfdCAqIGxfY3VycmVudF90aWxlID0gMDA7CiAKLQlpZiAocF9jcCA9PSAwMCkKLQl7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKHBfY3AtPnRjcHMgIT0gMDApCi0JewotCQlPUEpfVUlOVDMyIGk7Ci0JCWxfY3VycmVudF90aWxlID0gcF9jcC0+dGNwczsKLQkJbF9uYl90aWxlcyA9IHBfY3AtPnRoICogcF9jcC0+dHc7Ci0JCQotCQlmb3IgKGkgPSAwVTsgaSA8IGxfbmJfdGlsZXM7ICsraSkKLQkJewotCQkJb3BqX2oya190Y3BfZGVzdHJveShsX2N1cnJlbnRfdGlsZSk7Ci0JCQkrK2xfY3VycmVudF90aWxlOwotCQl9Ci0JCW9wal9mcmVlKHBfY3AtPnRjcHMpOwotCQlwX2NwLT50Y3BzID0gMDA7Ci0JfQotCWlmIChwX2NwLT5wcG1fbWFya2VycyAhPSAwMCkgewotCQlPUEpfVUlOVDMyIGk7Ci0JCWZvciAoaSA9IDBVOyBpIDwgcF9jcC0+cHBtX21hcmtlcnNfY291bnQ7ICsraSkgewotCQkJaWYgKHBfY3AtPnBwbV9tYXJrZXJzW2ldLm1fZGF0YSAhPSBOVUxMKSB7Ci0JCQkJb3BqX2ZyZWUocF9jcC0+cHBtX21hcmtlcnNbaV0ubV9kYXRhKTsKLQkJCX0KLQkJfQotCQlwX2NwLT5wcG1fbWFya2Vyc19jb3VudCA9IDBVOwotCQlvcGpfZnJlZShwX2NwLT5wcG1fbWFya2Vycyk7Ci0JCXBfY3AtPnBwbV9tYXJrZXJzID0gTlVMTDsKLQl9Ci0Jb3BqX2ZyZWUocF9jcC0+cHBtX2J1ZmZlcik7Ci0JcF9jcC0+cHBtX2J1ZmZlciA9IDAwOwotCXBfY3AtPnBwbV9kYXRhID0gTlVMTDsgLyogcHBtX2RhdGEgYmVsb25ncyB0byB0aGUgYWxsb2NhdGVkIGJ1ZmZlciBwb2ludGVkIGJ5IHBwbV9idWZmZXIgKi8KLQlvcGpfZnJlZShwX2NwLT5jb21tZW50KTsKLQlwX2NwLT5jb21tZW50ID0gMDA7Ci0JaWYgKCEgcF9jcC0+bV9pc19kZWNvZGVyKQotCXsKLQkJb3BqX2ZyZWUocF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX21hdHJpY2UpOwotCQlwX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fbWF0cmljZSA9IDAwOwotCX0KKyAgICBpZiAocF9jcCA9PSAwMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChwX2NwLT50Y3BzICE9IDAwKSB7CisgICAgICAgIE9QSl9VSU5UMzIgaTsKKyAgICAgICAgbF9jdXJyZW50X3RpbGUgPSBwX2NwLT50Y3BzOworICAgICAgICBsX25iX3RpbGVzID0gcF9jcC0+dGggKiBwX2NwLT50dzsKKworICAgICAgICBmb3IgKGkgPSAwVTsgaSA8IGxfbmJfdGlsZXM7ICsraSkgeworICAgICAgICAgICAgb3BqX2oya190Y3BfZGVzdHJveShsX2N1cnJlbnRfdGlsZSk7CisgICAgICAgICAgICArK2xfY3VycmVudF90aWxlOworICAgICAgICB9CisgICAgICAgIG9wal9mcmVlKHBfY3AtPnRjcHMpOworICAgICAgICBwX2NwLT50Y3BzID0gMDA7CisgICAgfQorICAgIGlmIChwX2NwLT5wcG1fbWFya2VycyAhPSAwMCkgeworICAgICAgICBPUEpfVUlOVDMyIGk7CisgICAgICAgIGZvciAoaSA9IDBVOyBpIDwgcF9jcC0+cHBtX21hcmtlcnNfY291bnQ7ICsraSkgeworICAgICAgICAgICAgaWYgKHBfY3AtPnBwbV9tYXJrZXJzW2ldLm1fZGF0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9jcC0+cHBtX21hcmtlcnNbaV0ubV9kYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwX2NwLT5wcG1fbWFya2Vyc19jb3VudCA9IDBVOworICAgICAgICBvcGpfZnJlZShwX2NwLT5wcG1fbWFya2Vycyk7CisgICAgICAgIHBfY3AtPnBwbV9tYXJrZXJzID0gTlVMTDsKKyAgICB9CisgICAgb3BqX2ZyZWUocF9jcC0+cHBtX2J1ZmZlcik7CisgICAgcF9jcC0+cHBtX2J1ZmZlciA9IDAwOworICAgIHBfY3AtPnBwbV9kYXRhID0KKyAgICAgICAgTlVMTDsgLyogcHBtX2RhdGEgYmVsb25ncyB0byB0aGUgYWxsb2NhdGVkIGJ1ZmZlciBwb2ludGVkIGJ5IHBwbV9idWZmZXIgKi8KKyAgICBvcGpfZnJlZShwX2NwLT5jb21tZW50KTsKKyAgICBwX2NwLT5jb21tZW50ID0gMDA7CisgICAgaWYgKCEgcF9jcC0+bV9pc19kZWNvZGVyKSB7CisgICAgICAgIG9wal9mcmVlKHBfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9tYXRyaWNlKTsKKyAgICAgICAgcF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX21hdHJpY2UgPSAwMDsKKyAgICB9CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX25lZWRfbmJfdGlsZV9wYXJ0c19jb3JyZWN0aW9uKG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwgT1BKX1VJTlQzMiB0aWxlX25vLCBPUEpfQk9PTCogcF9jb3JyZWN0aW9uX25lZWRlZCwgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX25lZWRfbmJfdGlsZV9wYXJ0c19jb3JyZWN0aW9uKG9wal9zdHJlYW1fcHJpdmF0ZV90CisgICAgICAgICpwX3N0cmVhbSwgT1BKX1VJTlQzMiB0aWxlX25vLCBPUEpfQk9PTCogcF9jb3JyZWN0aW9uX25lZWRlZCwKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQogewotCU9QSl9CWVRFICAgbF9oZWFkZXJfZGF0YVsxMF07Ci0JT1BKX09GRl9UICBsX3N0cmVhbV9wb3NfYmFja3VwOwotCU9QSl9VSU5UMzIgbF9jdXJyZW50X21hcmtlcjsKLQlPUEpfVUlOVDMyIGxfbWFya2VyX3NpemU7Ci0JT1BKX1VJTlQzMiBsX3RpbGVfbm8sIGxfdG90X2xlbiwgbF9jdXJyZW50X3BhcnQsIGxfbnVtX3BhcnRzOwotCQotCS8qIGluaXRpYWxpemUgdG8gbm8gY29ycmVjdGlvbiBuZWVkZWQgKi8KLQkqcF9jb3JyZWN0aW9uX25lZWRlZCA9IE9QSl9GQUxTRTsKLQkKLQlsX3N0cmVhbV9wb3NfYmFja3VwID0gb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKTsKLQlpZiAobF9zdHJlYW1fcG9zX2JhY2t1cCA9PSAtMSkgewotCQkvKiBsZXQncyBkbyBub3RoaW5nICovCi0JCXJldHVybiBPUEpfVFJVRTsKLQl9Ci0JCi0JZm9yICg7OykgewotCQkvKiBUcnkgdG8gcmVhZCAyIGJ5dGVzICh0aGUgbmV4dCBtYXJrZXIgSUQpIGZyb20gc3RyZWFtIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgYnVmZmVyICovCi0JCWlmIChvcGpfc3RyZWFtX3JlYWRfZGF0YShwX3N0cmVhbSxsX2hlYWRlcl9kYXRhLCAyLCBwX21hbmFnZXIpICE9IDIpIHsKLQkJCS8qIGFzc3VtZSBhbGwgaXMgT0sgKi8KLQkJCWlmICghIG9wal9zdHJlYW1fc2VlayhwX3N0cmVhbSwgbF9zdHJlYW1fcG9zX2JhY2t1cCwgcF9tYW5hZ2VyKSkgewotCQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCQl9Ci0JCQlyZXR1cm4gT1BKX1RSVUU7Ci0JCX0KLQkJCi0JCS8qIFJlYWQgMiBieXRlcyBmcm9tIGJ1ZmZlciBhcyB0aGUgbmV3IG1hcmtlciBJRCAqLwotCQlvcGpfcmVhZF9ieXRlcyhsX2hlYWRlcl9kYXRhLCAmbF9jdXJyZW50X21hcmtlciwgMik7Ci0JCQotCQlpZiAobF9jdXJyZW50X21hcmtlciAhPSBKMktfTVNfU09UKSB7Ci0JCQkvKiBhc3N1bWUgYWxsIGlzIE9LICovCi0JCQlpZiAoISBvcGpfc3RyZWFtX3NlZWsocF9zdHJlYW0sIGxfc3RyZWFtX3Bvc19iYWNrdXAsIHBfbWFuYWdlcikpIHsKLQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJfQotCQkJcmV0dXJuIE9QSl9UUlVFOwotCQl9Ci0JCQotCQkvKiBUcnkgdG8gcmVhZCAyIGJ5dGVzICh0aGUgbWFya2VyIHNpemUpIGZyb20gc3RyZWFtIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgYnVmZmVyICovCi0JCWlmIChvcGpfc3RyZWFtX3JlYWRfZGF0YShwX3N0cmVhbSwgbF9oZWFkZXJfZGF0YSwgMiwgcF9tYW5hZ2VyKSAhPSAyKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIHRvbyBzaG9ydFxuIik7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0JCQotCQkvKiBSZWFkIDIgYnl0ZXMgZnJvbSB0aGUgYnVmZmVyIGFzIHRoZSBtYXJrZXIgc2l6ZSAqLwotCQlvcGpfcmVhZF9ieXRlcyhsX2hlYWRlcl9kYXRhLCAmbF9tYXJrZXJfc2l6ZSwgMik7Ci0JCQotCQkvKiBDaGVjayBtYXJrZXIgc2l6ZSBmb3IgU09UIE1hcmtlciAqLwotCQlpZiAobF9tYXJrZXJfc2l6ZSAhPSAxMCkgewotCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkluY29uc2lzdGVudCBtYXJrZXIgc2l6ZVxuIik7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0JCWxfbWFya2VyX3NpemUgLT0gMjsKLQkJCi0JCWlmIChvcGpfc3RyZWFtX3JlYWRfZGF0YShwX3N0cmVhbSwgbF9oZWFkZXJfZGF0YSwgbF9tYXJrZXJfc2l6ZSwgcF9tYW5hZ2VyKSAhPSBsX21hcmtlcl9zaXplKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIHRvbyBzaG9ydFxuIik7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0JCQotCQlpZiAoISBvcGpfajJrX2dldF9zb3RfdmFsdWVzKGxfaGVhZGVyX2RhdGEsIGxfbWFya2VyX3NpemUsICZsX3RpbGVfbm8sICZsX3RvdF9sZW4sICZsX2N1cnJlbnRfcGFydCwgJmxfbnVtX3BhcnRzLCBwX21hbmFnZXIpKSB7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0JCQotCQlpZiAobF90aWxlX25vID09IHRpbGVfbm8pIHsKLQkJCS8qIHdlIGZvdW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvciAqLwotCQkJYnJlYWs7Ci0JCX0KLQkJCi0JCWlmICgobF90b3RfbGVuID09IDBVKSB8fCAobF90b3RfbGVuIDwgMTRVKSkgewotCQkJLyogbGFzdCBTT1QgdW50aWwgRU9DIG9yIGludmFsaWQgUHNvdCB2YWx1ZSAqLwotCQkJLyogYXNzdW1lIGFsbCBpcyBPSyAqLwotCQkJaWYgKCEgb3BqX3N0cmVhbV9zZWVrKHBfc3RyZWFtLCBsX3N0cmVhbV9wb3NfYmFja3VwLCBwX21hbmFnZXIpKSB7Ci0JCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJCX0KLQkJCXJldHVybiBPUEpfVFJVRTsKLQkJfQotCQlsX3RvdF9sZW4gLT0gMTJVOwotCQkvKiBsb29rIGZvciBuZXh0IFNPVCBtYXJrZXIgKi8KLQkJaWYgKG9wal9zdHJlYW1fc2tpcChwX3N0cmVhbSwgKE9QSl9PRkZfVCkobF90b3RfbGVuKSwgcF9tYW5hZ2VyKSAhPSAoT1BKX09GRl9UKShsX3RvdF9sZW4pKSB7Ci0JCQkvKiBhc3N1bWUgYWxsIGlzIE9LICovCi0JCQlpZiAoISBvcGpfc3RyZWFtX3NlZWsocF9zdHJlYW0sIGxfc3RyZWFtX3Bvc19iYWNrdXAsIHBfbWFuYWdlcikpIHsKLQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJfQotCQkJcmV0dXJuIE9QSl9UUlVFOwotCQl9Ci0JfQotCQotCS8qIGNoZWNrIGZvciBjb3JyZWN0aW9uICovCi0JaWYgKGxfY3VycmVudF9wYXJ0ID09IGxfbnVtX3BhcnRzKSB7Ci0JCSpwX2NvcnJlY3Rpb25fbmVlZGVkID0gT1BKX1RSVUU7Ci0JfQotCQotCWlmICghIG9wal9zdHJlYW1fc2VlayhwX3N0cmVhbSwgbF9zdHJlYW1fcG9zX2JhY2t1cCwgcF9tYW5hZ2VyKSkgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQlyZXR1cm4gT1BKX1RSVUU7Ci19CisgICAgT1BKX0JZVEUgICBsX2hlYWRlcl9kYXRhWzEwXTsKKyAgICBPUEpfT0ZGX1QgIGxfc3RyZWFtX3Bvc19iYWNrdXA7CisgICAgT1BKX1VJTlQzMiBsX2N1cnJlbnRfbWFya2VyOworICAgIE9QSl9VSU5UMzIgbF9tYXJrZXJfc2l6ZTsKKyAgICBPUEpfVUlOVDMyIGxfdGlsZV9ubywgbF90b3RfbGVuLCBsX2N1cnJlbnRfcGFydCwgbF9udW1fcGFydHM7CiAKLU9QSl9CT09MIG9wal9qMmtfcmVhZF90aWxlX2hlYWRlciggICAgICBvcGpfajJrX3QgKiBwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfdGlsZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3RpbGVfeDAsIE9QSl9JTlQzMiAqIHBfdGlsZV95MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3gxLCBPUEpfSU5UMzIgKiBwX3RpbGVfeTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX25iX2NvbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQk9PTCAqIHBfZ29fb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2N1cnJlbnRfbWFya2VyID0gSjJLX01TX1NPVDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX21hcmtlcl9zaXplOwotICAgICAgICBjb25zdCBvcGpfZGVjX21lbW9yeV9tYXJrZXJfaGFuZGxlcl90ICogbF9tYXJrZXJfaGFuZGxlciA9IDAwOwotICAgICAgICBvcGpfdGNwX3QgKiBsX3RjcCA9IE5VTEw7CisgICAgLyogaW5pdGlhbGl6ZSB0byBubyBjb3JyZWN0aW9uIG5lZWRlZCAqLworICAgICpwX2NvcnJlY3Rpb25fbmVlZGVkID0gT1BKX0ZBTFNFOwogCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0KLSAgICAgICAgLyogUmVhY2ggdGhlIEVuZCBPZiBDb2Rlc3RyZWFtID8qLwotICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX0VPQyl7Ci0gICAgICAgICAgICAgICAgbF9jdXJyZW50X21hcmtlciA9IEoyS19NU19FT0M7Ci0gICAgICAgIH0KLSAgICAgICAgLyogV2UgbmVlZCB0byBlbmNvdW50ZXIgYSBTT1QgbWFya2VyIChhIG5ldyB0aWxlLXBhcnQgaGVhZGVyKSAqLwotICAgICAgICBlbHNlIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSAhPSBKMktfU1RBVEVfVFBIU09UKXsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogUmVhZCBpbnRvIHRoZSBjb2Rlc3RyZWFtIHVudGlsIHJlYWNoIHRoZSBFT0Mgb3IgISBjYW5fZGVjb2RlID8/PyBGSVhNRSAqLwotICAgICAgICB3aGlsZSAoICghcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fY2FuX2RlY29kZSkgJiYgKGxfY3VycmVudF9tYXJrZXIgIT0gSjJLX01TX0VPQykgKSB7Ci0KLSAgICAgICAgICAgICAgICAvKiBUcnkgdG8gcmVhZCB1bnRpbCB0aGUgU3RhcnQgT2YgRGF0YSBpcyBkZXRlY3RlZCAqLwotICAgICAgICAgICAgICAgIHdoaWxlIChsX2N1cnJlbnRfbWFya2VyICE9IEoyS19NU19TT0QpIHsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmKG9wal9zdHJlYW1fZ2V0X251bWJlcl9ieXRlX2xlZnQocF9zdHJlYW0pID09IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID0gSjJLX1NUQVRFX05FT0M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUcnkgdG8gcmVhZCAyIGJ5dGVzICh0aGUgbWFya2VyIHNpemUpIGZyb20gc3RyZWFtIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsMixwX21hbmFnZXIpICE9IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWFkIDIgYnl0ZXMgZnJvbSB0aGUgYnVmZmVyIGFzIHRoZSBtYXJrZXIgc2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsJmxfbWFya2VyX3NpemUsMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIG1hcmtlciBzaXplIChkb2VzIG5vdCBpbmNsdWRlIG1hcmtlciBJRCBidXQgaW5jbHVkZXMgbWFya2VyIHNpemUpICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9tYXJrZXJfc2l6ZSA8IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkluY29uc2lzdGVudCBtYXJrZXIgc2l6ZVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNmLiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL29wZW5qcGVnL2lzc3Vlcy9kZXRhaWw/aWQ9MjI2ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jdXJyZW50X21hcmtlciA9PSAweDgwODAgJiYgb3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChwX3N0cmVhbSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9IEoyS19TVEFURV9ORU9DOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogV2h5IHRoaXMgY29uZGl0aW9uPyBGSVhNRSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlICYgSjJLX1NUQVRFX1RQSCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGggLT0gKGxfbWFya2VyX3NpemUgKyAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfbWFya2VyX3NpemUgLT0gMjsgLyogU3VidHJhY3QgdGhlIHNpemUgb2YgdGhlIG1hcmtlciBJRCBhbHJlYWR5IHJlYWQgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBtYXJrZXIgaGFuZGxlciBmcm9tIHRoZSBtYXJrZXIgSUQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfbWFya2VyX2hhbmRsZXIgPSBvcGpfajJrX2dldF9tYXJrZXJfaGFuZGxlcihsX2N1cnJlbnRfbWFya2VyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIG1hcmtlciBpcyBrbm93biBhbmQgaWYgaXQgaXMgdGhlIHJpZ2h0IHBsYWNlIHRvIGZpbmQgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSAmIGxfbWFya2VyX2hhbmRsZXItPnN0YXRlcykgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJNYXJrZXIgaXMgbm90IGNvbXBsaWFudCB3aXRoIGl0cyBwb3NpdGlvblxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0vKiBGSVhNRSBtYW5hZ2UgY2FzZSBvZiB1bmtub3duIG1hcmtlciBhcyBpbiB0aGUgbWFpbiBoZWFkZXIgPyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB0aGUgbWFya2VyIHNpemUgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBoZWFkZXIgZGF0YSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9tYXJrZXJfc2l6ZSA+IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhX3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfZGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHdlIGFyZSBoZXJlLCB0aGlzIG1lYW5zIHdlIGNvbnNpZGVyIHRoaXMgbWFya2VyIGFzIGtub3duICYgd2Ugd2lsbCByZWFkIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGVub3VnaCBieXRlcyBsZWZ0IGluIHN0cmVhbSBiZWZvcmUgYWxsb2NhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKE9QSl9PRkZfVClsX21hcmtlcl9zaXplID4gIG9wal9zdHJlYW1fZ2V0X251bWJlcl9ieXRlX2xlZnQocF9zdHJlYW0pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk1hcmtlciBzaXplIGluY29uc2lzdGVudCB3aXRoIHN0cmVhbSBsZW5ndGhcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2hlYWRlcl9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLCBsX21hcmtlcl9zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmV3X2hlYWRlcl9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YV9zaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBoZWFkZXJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEgPSBuZXdfaGVhZGVyX2RhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhX3NpemUgPSBsX21hcmtlcl9zaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUcnkgdG8gcmVhZCB0aGUgcmVzdCBvZiB0aGUgbWFya2VyIHNlZ21lbnQgZnJvbSBzdHJlYW0gYW5kIGNvcHkgdGhlbSBpbnRvIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGpfc3RyZWFtX3JlYWRfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSxsX21hcmtlcl9zaXplLHBfbWFuYWdlcikgIT0gbF9tYXJrZXJfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIHRvbyBzaG9ydFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbF9tYXJrZXJfaGFuZGxlci0+aGFuZGxlcikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWUgaXNzdWUgIzE3NSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IHN1cmUgaG93IHRoYXQgaGFwcGVuZWQuXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWQgdGhlIG1hcmtlciBzZWdtZW50IHdpdGggdGhlIGNvcnJlY3QgbWFya2VyIGhhbmRsZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghICgqKGxfbWFya2VyX2hhbmRsZXItPmhhbmRsZXIpKShwX2oyayxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSxsX21hcmtlcl9zaXplLHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWwgdG8gcmVhZCB0aGUgY3VycmVudCBtYXJrZXIgc2VnbWVudCAoJSN4KVxuIiwgbF9jdXJyZW50X21hcmtlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFkZCB0aGUgbWFya2VyIHRvIHRoZSBjb2Rlc3RyZWFtIGluZGV4Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPUEpfRkFMU0UgPT0gb3BqX2oya19hZGRfdGxtYXJrZXIocF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9tYXJrZXJfaGFuZGxlci0+aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMikgb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSAtIGxfbWFya2VyX3NpemUgLSA0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9tYXJrZXJfc2l6ZSArIDQgKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gYWRkIHRsIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEtlZXAgdGhlIHBvc2l0aW9uIG9mIHRoZSBsYXN0IFNPVCBtYXJrZXIgcmVhZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBsX21hcmtlcl9oYW5kbGVyLT5pZCA9PSBKMktfTVNfU09UICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHNvdF9wb3MgPSAoT1BKX1VJTlQzMikgb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKSAtIGxfbWFya2VyX3NpemUgLSA0IDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdF9wb3MgPiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9sYXN0X3NvdF9yZWFkX3BvcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2xhc3Rfc290X3JlYWRfcG9zID0gc290X3BvczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc2tpcF9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNraXAgdGhlIHJlc3Qgb2YgdGhlIHRpbGUgcGFydCBoZWFkZXIqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BqX3N0cmVhbV9za2lwKHBfc3RyZWFtLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3NvdF9sZW5ndGgscF9tYW5hZ2VyKSAhPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X21hcmtlciA9IEoyS19NU19TT0Q7IC8qIE5vcm1hbGx5IHdlIHJlYWNoZWQgYSBTT0QgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcnkgdG8gcmVhZCAyIGJ5dGVzICh0aGUgbmV4dCBtYXJrZXIgSUQpIGZyb20gc3RyZWFtIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgYnVmZmVyKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wal9zdHJlYW1fcmVhZF9kYXRhKHBfc3RyZWFtLHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLDIscF9tYW5hZ2VyKSAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVhZCAyIGJ5dGVzIGZyb20gdGhlIGJ1ZmZlciBhcyB0aGUgbmV3IG1hcmtlciBJRCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwmbF9jdXJyZW50X21hcmtlciwyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYob3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChwX3N0cmVhbSkgPT0gMAotICAgICAgICAgICAgICAgICAgICAmJiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfTkVPQykKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAvKiBJZiB3ZSBkaWRuJ3Qgc2tpcCBkYXRhIGJlZm9yZSwgd2UgbmVlZCB0byByZWFkIHRoZSBTT0QgbWFya2VyKi8KLSAgICAgICAgICAgICAgICBpZiAoISBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9za2lwX2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyeSB0byByZWFkIHRoZSBTT0QgbWFya2VyIGFuZCBza2lwIGRhdGEgPyBGSVhNRSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX2oya19yZWFkX3NvZChwX2oyaywgcF9zdHJlYW0sIHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9jYW5fZGVjb2RlICYmICFwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9uYl90aWxlX3BhcnRzX2NvcnJlY3Rpb25fY2hlY2tlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJc3N1ZSAyNTQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JPT0wgbF9jb3JyZWN0aW9uX25lZWRlZDsKLQkJCQkJCQkJCQkJCQkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fbmJfdGlsZV9wYXJ0c19jb3JyZWN0aW9uX2NoZWNrZWQgPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighb3BqX2oya19uZWVkX25iX3RpbGVfcGFydHNfY29ycmVjdGlvbihwX3N0cmVhbSwgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwgJmxfY29ycmVjdGlvbl9uZWVkZWQsIHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAib3BqX2oya19hcHBseV9uYl90aWxlX3BhcnRzX2NvcnJlY3Rpb24gZXJyb3JcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY29ycmVjdGlvbl9uZWVkZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxfbmJfdGlsZXMgPSBwX2oyay0+bV9jcC50dyAqIHBfajJrLT5tX2NwLnRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbF90aWxlX25vOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fY2FuX2RlY29kZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fbmJfdGlsZV9wYXJ0c19jb3JyZWN0aW9uID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3JyZWN0IHRpbGVzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsX3RpbGVfbm8gPSAwVTsgbF90aWxlX25vIDwgbF9uYl90aWxlczsgKytsX3RpbGVfbm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwX2oyay0+bV9jcC50Y3BzW2xfdGlsZV9ub10ubV9uYl90aWxlX3BhcnRzICE9IDBVKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX2NwLnRjcHNbbF90aWxlX25vXS5tX25iX3RpbGVfcGFydHMrPTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIk5vbiBjb25mb3JtYW50IGNvZGVzdHJlYW0gVFBzb3Q9PVROc290LlxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2Nhbl9kZWNvZGUpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcnkgdG8gcmVhZCAyIGJ5dGVzICh0aGUgbmV4dCBtYXJrZXIgSUQpIGZyb20gc3RyZWFtIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGpfc3RyZWFtX3JlYWRfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwyLHBfbWFuYWdlcikgIT0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJTdHJlYW0gdG9vIHNob3J0XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVhZCAyIGJ5dGVzIGZyb20gYnVmZmVyIGFzIHRoZSBuZXcgbWFya2VyIElEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLCZsX2N1cnJlbnRfbWFya2VyLDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluZGljYXRlIHdlIHdpbGwgdHJ5IHRvIHJlYWQgYSBuZXcgdGlsZS1wYXJ0IGhlYWRlciovCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9za2lwX2RhdGEgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fY2FuX2RlY29kZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9IEoyS19TVEFURV9UUEhTT1Q7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRyeSB0byByZWFkIDIgYnl0ZXMgKHRoZSBuZXh0IG1hcmtlciBJRCkgZnJvbSBzdHJlYW0gYW5kIGNvcHkgdGhlbSBpbnRvIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGpfc3RyZWFtX3JlYWRfZGF0YShwX3N0cmVhbSxwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwyLHBfbWFuYWdlcikgIT0gMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIHRvbyBzaG9ydFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWQgMiBieXRlcyBmcm9tIGJ1ZmZlciBhcyB0aGUgbmV3IG1hcmtlciBJRCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsJmxfY3VycmVudF9tYXJrZXIsMik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ3VycmVudCBtYXJrZXIgaXMgdGhlIEVPQyBtYXJrZXIgPyovCi0gICAgICAgIGlmIChsX2N1cnJlbnRfbWFya2VyID09IEoyS19NU19FT0MpIHsKLSAgICAgICAgICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgIT0gSjJLX1NUQVRFX0VPQyApewotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9IEoyS19TVEFURV9FT0M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogRklYTUUgRE9DID8/PyovCi0gICAgICAgIGlmICggISBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9jYW5fZGVjb2RlKSB7Ci0gICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzID0gcF9qMmstPm1fY3AudGggKiBwX2oyay0+bV9jcC50dzsKLSAgICAgICAgICAgICAgICBsX3RjcCA9IHBfajJrLT5tX2NwLnRjcHMgKyBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyOwotCi0gICAgICAgICAgICAgICAgd2hpbGUoIChwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyIDwgbF9uYl90aWxlcykgJiYgKGxfdGNwLT5tX2RhdGEgPT0gMDApICkgewotICAgICAgICAgICAgICAgICAgICAgICAgKytwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyOwotICAgICAgICAgICAgICAgICAgICAgICAgKytsX3RjcDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAocF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciA9PSBsX25iX3RpbGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcF9nb19vbiA9IE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoISBvcGpfajJrX21lcmdlX3BwdChwX2oyay0+bV9jcC50Y3BzICsgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwgcF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gbWVyZ2UgUFBUIGRhdGFcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgLypGSVhNRSA/Pz8qLwotICAgICAgICBpZiAoISBvcGpfdGNkX2luaXRfZGVjb2RlX3RpbGUocF9qMmstPm1fdGNkLCBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLCBwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkNhbm5vdCBkZWNvZGUgdGlsZSwgbWVtb3J5IGVycm9yXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9JTkZPLCAiSGVhZGVyIG9mIHRpbGUgJWQgLyAlZCBoYXMgYmVlbiByZWFkLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIrMSwgKHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHcpKTsKLQotICAgICAgICAqcF90aWxlX2luZGV4ID0gcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcjsKLSAgICAgICAgKnBfZ29fb24gPSBPUEpfVFJVRTsKLSAgICAgICAgKnBfZGF0YV9zaXplID0gb3BqX3RjZF9nZXRfZGVjb2RlZF90aWxlX3NpemUocF9qMmstPm1fdGNkKTsKLSAgICAgICAgaWYgKCpwX2RhdGFfc2l6ZSA9PSAoT1BKX1VJTlQzMiktMSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICAqcF90aWxlX3gwID0gcF9qMmstPm1fdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT54MDsKLSAgICAgICAgKnBfdGlsZV95MCA9IHBfajJrLT5tX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+eTA7Ci0gICAgICAgICpwX3RpbGVfeDEgPSBwX2oyay0+bV90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPngxOwotICAgICAgICAqcF90aWxlX3kxID0gcF9qMmstPm1fdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT55MTsKLSAgICAgICAgKnBfbmJfY29tcHMgPSBwX2oyay0+bV90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPm51bWNvbXBzOwotCi0gICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSB8PSAweDAwODA7LyogRklYTUUgSjJLX0RFQ19TVEFURV9EQVRBOyovCi0KKyAgICBpZiAoIW9wal9zdHJlYW1faGFzX3NlZWsocF9zdHJlYW0pKSB7CisgICAgICAgIC8qIFdlIGNhbid0IGRvIG11Y2ggaW4gdGhpcyBjYXNlLCBzZWVrIGlzIG5lZWRlZCAqLwogICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19CisgICAgfQogCi1PUEpfQk9PTCBvcGpfajJrX2RlY29kZV90aWxlICggIG9wal9qMmtfdCAqIHBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2N1cnJlbnRfbWFya2VyOwotICAgICAgICBPUEpfQllURSBsX2RhdGEgWzJdOwotICAgICAgICBvcGpfdGNwX3QgKiBsX3RjcDsKKyAgICBsX3N0cmVhbV9wb3NfYmFja3VwID0gb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKTsKKyAgICBpZiAobF9zdHJlYW1fcG9zX2JhY2t1cCA9PSAtMSkgeworICAgICAgICAvKiBsZXQncyBkbyBub3RoaW5nICovCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICB9CiAKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQotICAgICAgICBpZiAoICEocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgJiAweDAwODAvKkZJWE1FIEoyS19ERUNfU1RBVEVfREFUQSovKQotICAgICAgICAgICAgICAgIHx8IChwX3RpbGVfaW5kZXggIT0gcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcikgKSB7CisgICAgZm9yICg7OykgeworICAgICAgICAvKiBUcnkgdG8gcmVhZCAyIGJ5dGVzICh0aGUgbmV4dCBtYXJrZXIgSUQpIGZyb20gc3RyZWFtIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgYnVmZmVyICovCisgICAgICAgIGlmIChvcGpfc3RyZWFtX3JlYWRfZGF0YShwX3N0cmVhbSwgbF9oZWFkZXJfZGF0YSwgMiwgcF9tYW5hZ2VyKSAhPSAyKSB7CisgICAgICAgICAgICAvKiBhc3N1bWUgYWxsIGlzIE9LICovCisgICAgICAgICAgICBpZiAoISBvcGpfc3RyZWFtX3NlZWsocF9zdHJlYW0sIGxfc3RyZWFtX3Bvc19iYWNrdXAsIHBfbWFuYWdlcikpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgbF90Y3AgPSAmKHBfajJrLT5tX2NwLnRjcHNbcF90aWxlX2luZGV4XSk7Ci0gICAgICAgIGlmICghIGxfdGNwLT5tX2RhdGEpIHsKLSAgICAgICAgICAgICAgICBvcGpfajJrX3RjcF9kZXN0cm95KGxfdGNwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEgb3BqX3RjZF9kZWNvZGVfdGlsZSggICAgICBwX2oyay0+bV90Y2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjcC0+bV9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90aWxlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LCBwX21hbmFnZXIpICkgewotICAgICAgICAgICAgICAgIG9wal9qMmtfdGNwX2Rlc3Ryb3kobF90Y3ApOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlIHw9IDB4ODAwMDsvKkZJWE1FIEoyS19ERUNfU1RBVEVfRVJSOyovCi0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBkZWNvZGUuXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCEgb3BqX3RjZF91cGRhdGVfdGlsZV9kYXRhKHBfajJrLT5tX3RjZCxwX2RhdGEscF9kYXRhX3NpemUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFRvIGF2b2lkIHRvIGRlc3Ryb3kgdGhlIHRjcCB3aGljaCBjYW4gYmUgdXNlZnVsIHdoZW4gd2UgdHJ5IHRvIGRlY29kZSBhIHRpbGUgZGVjb2RlZCBiZWZvcmUgKGNmIGoya19yYW5kb21fdGlsZV9hY2Nlc3MpCi0gICAgICAgICAqIHdlIGRlc3Ryb3kganVzdCB0aGUgZGF0YSB3aGljaCB3aWxsIGJlIHJlLXJlYWQgaW4gcmVhZF90aWxlX2hlYWRlciovCi0gICAgICAgIC8qb3BqX2oya190Y3BfZGVzdHJveShsX3RjcCk7Ci0gICAgICAgIHBfajJrLT5tX3RjZC0+dGNwID0gMDsqLwotICAgICAgICBvcGpfajJrX3RjcF9kYXRhX2Rlc3Ryb3kobF90Y3ApOwotCi0gICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2Nhbl9kZWNvZGUgPSAwOwotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSAmPSAofiAoMHgwMDgwdSkpOy8qIEZJWE1FIEoyS19ERUNfU1RBVEVfREFUQSk7Ki8KLQotICAgICAgICBpZihvcGpfc3RyZWFtX2dldF9udW1iZXJfYnl0ZV9sZWZ0KHBfc3RyZWFtKSA9PSAwIAotICAgICAgICAgICAgJiYgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX05FT0MpeworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlICE9IDB4MDEwMCl7IC8qRklYTUUgSjJLX0RFQ19TVEFURV9FT0MpKi8KLSAgICAgICAgICAgICAgICBpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0sbF9kYXRhLDIscF9tYW5hZ2VyKSAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIHRvbyBzaG9ydFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgLyogUmVhZCAyIGJ5dGVzIGZyb20gYnVmZmVyIGFzIHRoZSBuZXcgbWFya2VyIElEICovCisgICAgICAgIG9wal9yZWFkX2J5dGVzKGxfaGVhZGVyX2RhdGEsICZsX2N1cnJlbnRfbWFya2VyLCAyKTsKIAotICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKGxfZGF0YSwmbF9jdXJyZW50X21hcmtlciwyKTsKLQotICAgICAgICAgICAgICAgIGlmIChsX2N1cnJlbnRfbWFya2VyID09IEoyS19NU19FT0MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPSAgMHgwMTAwOy8qRklYTUUgSjJLX0RFQ19TVEFURV9FT0M7Ki8KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAobF9jdXJyZW50X21hcmtlciAhPSBKMktfTVNfU09UKQotICAgICAgICAgICAgICAgIHsgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihvcGpfc3RyZWFtX2dldF9udW1iZXJfYnl0ZV9sZWZ0KHBfc3RyZWFtKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPSBKMktfU1RBVEVfTkVPQzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJTdHJlYW0gZG9lcyBub3QgZW5kIHdpdGggRU9DXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIHRvbyBzaG9ydCwgZXhwZWN0ZWQgU09UXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya191cGRhdGVfaW1hZ2VfZGF0YSAob3BqX3RjZF90ICogcF90Y2QsIE9QSl9CWVRFICogcF9kYXRhLCBvcGpfaW1hZ2VfdCogcF9vdXRwdXRfaW1hZ2UpCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgaSxqLGsgPSAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfd2lkdGhfc3JjLGxfaGVpZ2h0X3NyYzsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3dpZHRoX2Rlc3QsbF9oZWlnaHRfZGVzdDsKLSAgICAgICAgT1BKX0lOVDMyIGxfb2Zmc2V0X3gwX3NyYywgbF9vZmZzZXRfeTBfc3JjLCBsX29mZnNldF94MV9zcmMsIGxfb2Zmc2V0X3kxX3NyYzsKLSAgICAgICAgT1BKX1NJWkVfVCBsX3N0YXJ0X29mZnNldF9zcmMsIGxfbGluZV9vZmZzZXRfc3JjLCBsX2VuZF9vZmZzZXRfc3JjIDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3N0YXJ0X3hfZGVzdCAsIGxfc3RhcnRfeV9kZXN0OwotICAgICAgICBPUEpfVUlOVDMyIGxfeDBfZGVzdCwgbF95MF9kZXN0LCBsX3gxX2Rlc3QsIGxfeTFfZGVzdDsKLSAgICAgICAgT1BKX1NJWkVfVCBsX3N0YXJ0X29mZnNldF9kZXN0LCBsX2xpbmVfb2Zmc2V0X2Rlc3Q7Ci0KLSAgICAgICAgb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1nX2NvbXBfc3JjID0gMDA7Ci0gICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wX2Rlc3QgPSAwMDsKLQotICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKiBsX3RpbGVjID0gMDA7Ci0gICAgICAgIG9wal9pbWFnZV90ICogbF9pbWFnZV9zcmMgPSAwMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3NpemVfY29tcCwgbF9yZW1haW5pbmc7Ci0gICAgICAgIE9QSl9JTlQzMiAqIGxfZGVzdF9wdHI7Ci0gICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiBsX3Jlcz0gMDA7Ci0KLSAgICAgICAgbF90aWxlYyA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5jb21wczsKLSAgICAgICAgbF9pbWFnZV9zcmMgPSBwX3RjZC0+aW1hZ2U7Ci0gICAgICAgIGxfaW1nX2NvbXBfc3JjID0gbF9pbWFnZV9zcmMtPmNvbXBzOwotCi0gICAgICAgIGxfaW1nX2NvbXBfZGVzdCA9IHBfb3V0cHV0X2ltYWdlLT5jb21wczsKLQotICAgICAgICBmb3IgKGk9MDsgaTxsX2ltYWdlX3NyYy0+bnVtY29tcHM7IGkrKykgewotCi0gICAgICAgICAgICAgICAgLyogQWxsb2NhdGUgb3V0cHV0IGNvbXBvbmVudCBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCi0gICAgICAgICAgICAgICAgaWYgKCFsX2ltZ19jb21wX2Rlc3QtPmRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB3aWR0aCA9IGxfaW1nX2NvbXBfZGVzdC0+dzsKLSAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBoZWlnaHQgPSBsX2ltZ19jb21wX2Rlc3QtPmg7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IE9QSl9VSU5UMzIgTUFYX1NJWkUgPSBVSU5UMzJfTUFYIC8gc2l6ZW9mKE9QSl9JTlQzMik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoZWlnaHQgPT0gMCB8fCB3aWR0aCA+IE1BWF9TSVpFIC8gaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxfaW1nX2NvbXBfZGVzdC0+ZGF0YSA9IChPUEpfSU5UMzIqKW9wal9jYWxsb2Mod2lkdGggKiBoZWlnaHQsIHNpemVvZihPUEpfSU5UMzIpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFsX2ltZ19jb21wX2Rlc3QtPmRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBDb3B5IGluZm8gZnJvbSBkZWNvZGVkIGNvbXAgaW1hZ2UgdG8gb3V0cHV0IGltYWdlICovCi0gICAgICAgICAgICAgICAgbF9pbWdfY29tcF9kZXN0LT5yZXNub19kZWNvZGVkID0gbF9pbWdfY29tcF9zcmMtPnJlc25vX2RlY29kZWQ7Ci0KLSAgICAgICAgICAgICAgICAvKi0tLS0tKi8KLSAgICAgICAgICAgICAgICAvKiBDb21wdXRlIHRoZSBwcmVjaXNpb24gb2YgdGhlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICBsX3NpemVfY29tcCA9IGxfaW1nX2NvbXBfc3JjLT5wcmVjID4+IDM7IC8qKC8gOCkqLwotICAgICAgICAgICAgICAgIGxfcmVtYWluaW5nID0gbF9pbWdfY29tcF9zcmMtPnByZWMgJiA3OyAgLyogKCU4KSAqLwotICAgICAgICAgICAgICAgIGxfcmVzID0gbF90aWxlYy0+cmVzb2x1dGlvbnMgKyBsX2ltZ19jb21wX3NyYy0+cmVzbm9fZGVjb2RlZDsKLQotICAgICAgICAgICAgICAgIGlmIChsX3JlbWFpbmluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgKytsX3NpemVfY29tcDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobF9zaXplX2NvbXAgPT0gMykgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9zaXplX2NvbXAgPSA0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKi0tLS0tKi8KLQotICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgdGlsZSBjb21wb25lbnQgc2l6ZSovCi0gICAgICAgICAgICAgICAgLyppZiAoaSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICJTUkM6IGxfcmVzX3gwPSVkLCBsX3Jlc194MT0lZCwgbF9yZXNfeTA9JWQsIGxfcmVzX3kxPSVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3Jlcy0+eDAsIGxfcmVzLT54MSwgbF9yZXMtPnkwLCBsX3Jlcy0+eTEpOwotICAgICAgICAgICAgICAgIH0qLwotCi0gICAgICAgICAgICAgICAgbF93aWR0aF9zcmMgPSAoT1BKX1VJTlQzMikobF9yZXMtPngxIC0gbF9yZXMtPngwKTsKLSAgICAgICAgICAgICAgICBsX2hlaWdodF9zcmMgPSAoT1BKX1VJTlQzMikobF9yZXMtPnkxIC0gbF9yZXMtPnkwKTsKLQotICAgICAgICAgICAgICAgIC8qIEJvcmRlciBvZiB0aGUgY3VycmVudCBvdXRwdXQgY29tcG9uZW50Ki8KLSAgICAgICAgICAgICAgICBsX3gwX2Rlc3QgPSBvcGpfdWludF9jZWlsZGl2cG93MihsX2ltZ19jb21wX2Rlc3QtPngwLCBsX2ltZ19jb21wX2Rlc3QtPmZhY3Rvcik7Ci0gICAgICAgICAgICAgICAgbF95MF9kZXN0ID0gb3BqX3VpbnRfY2VpbGRpdnBvdzIobF9pbWdfY29tcF9kZXN0LT55MCwgbF9pbWdfY29tcF9kZXN0LT5mYWN0b3IpOwotICAgICAgICAgICAgICAgIGxfeDFfZGVzdCA9IGxfeDBfZGVzdCArIGxfaW1nX2NvbXBfZGVzdC0+dzsgLyogY2FuJ3Qgb3ZlcmZsb3cgZ2l2ZW4gdGhhdCBpbWFnZS0+eDEgaXMgdWludDMyICovCi0gICAgICAgICAgICAgICAgbF95MV9kZXN0ID0gbF95MF9kZXN0ICsgbF9pbWdfY29tcF9kZXN0LT5oOwotCi0gICAgICAgICAgICAgICAgLyppZiAoaSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRvdXQsICJERVNUOiBsX3gwX2Rlc3Q9JWQsIGxfeDFfZGVzdD0lZCwgbF95MF9kZXN0PSVkLCBsX3kxX2Rlc3Q9JWQgKCVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF94MF9kZXN0LCBsX3gxX2Rlc3QsIGxfeTBfZGVzdCwgbF95MV9kZXN0LCBsX2ltZ19jb21wX2Rlc3QtPmZhY3RvciApOwotICAgICAgICAgICAgICAgIH0qLwotCi0gICAgICAgICAgICAgICAgLyotLS0tLSovCi0gICAgICAgICAgICAgICAgLyogQ29tcHV0ZSB0aGUgYXJlYSAobF9vZmZzZXRfeDBfc3JjLCBsX29mZnNldF95MF9zcmMsIGxfb2Zmc2V0X3gxX3NyYywgbF9vZmZzZXRfeTFfc3JjKQotICAgICAgICAgICAgICAgICAqIG9mIHRoZSBpbnB1dCBidWZmZXIgKGRlY29kZWQgdGlsZSBjb21wb25lbnQpIHdoaWNoIHdpbGwgYmUgbW92ZQotICAgICAgICAgICAgICAgICAqIGluIHRoZSBvdXRwdXQgYnVmZmVyLiBDb21wdXRlIHRoZSBhcmVhIG9mIHRoZSBvdXRwdXQgYnVmZmVyIChsX3N0YXJ0X3hfZGVzdCwKLSAgICAgICAgICAgICAgICAgKiBsX3N0YXJ0X3lfZGVzdCwgbF93aWR0aF9kZXN0LCBsX2hlaWdodF9kZXN0KSAgd2hpY2ggd2lsbCBiZSBtb2RpZmllZAotICAgICAgICAgICAgICAgICAqIGJ5IHRoaXMgaW5wdXQgYXJlYS4KLSAgICAgICAgICAgICAgICAgKiAqLwotICAgICAgICAgICAgICAgIGFzc2VydCggbF9yZXMtPngwID49IDApOwotICAgICAgICAgICAgICAgIGFzc2VydCggbF9yZXMtPngxID49IDApOwotCi0gICAgICAgICAgICAgICAgLyogUHJldmVudCBiYWQgY2FzdGluZyB0byB1bnNpZ25lZCB2YWx1ZXMgaW4gdGhlIHN1YnNlcXVlbnQgbGluZXMuICovCi0gICAgICAgICAgICAgICAgaWYgKCBsX3Jlcy0+eDAgPCAwIHx8IGxfcmVzLT54MSA8IDAgfHwgbF9yZXMtPnkwIDwgMCB8fCBsX3Jlcy0+eTEgPCAwICkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIGxfeDBfZGVzdCA8IChPUEpfVUlOVDMyKWxfcmVzLT54MCApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfc3RhcnRfeF9kZXN0ID0gKE9QSl9VSU5UMzIpbF9yZXMtPngwIC0gbF94MF9kZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXRfeDBfc3JjID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBsX3gxX2Rlc3QgPj0gKE9QSl9VSU5UMzIpbF9yZXMtPngxICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3dpZHRoX2Rlc3QgPSBsX3dpZHRoX3NyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXRfeDFfc3JjID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3dpZHRoX2Rlc3QgPSBsX3gxX2Rlc3QgLSAoT1BKX1VJTlQzMilsX3Jlcy0+eDAgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX29mZnNldF94MV9zcmMgPSAoT1BKX0lOVDMyKShsX3dpZHRoX3NyYyAtIGxfd2lkdGhfZGVzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9zdGFydF94X2Rlc3QgPSAwVTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfb2Zmc2V0X3gwX3NyYyA9IChPUEpfSU5UMzIpbF94MF9kZXN0IC0gbF9yZXMtPngwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGxfeDFfZGVzdCA+PSAoT1BKX1VJTlQzMilsX3Jlcy0+eDEgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfd2lkdGhfZGVzdCA9IGxfd2lkdGhfc3JjIC0gKE9QSl9VSU5UMzIpbF9vZmZzZXRfeDBfc3JjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX29mZnNldF94MV9zcmMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfd2lkdGhfZGVzdCA9IGxfaW1nX2NvbXBfZGVzdC0+dyA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfb2Zmc2V0X3gxX3NyYyA9IGxfcmVzLT54MSAtIChPUEpfSU5UMzIpbF94MV9kZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICggbF95MF9kZXN0IDwgKE9QSl9VSU5UMzIpbF9yZXMtPnkwICkgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9zdGFydF95X2Rlc3QgPSAoT1BKX1VJTlQzMilsX3Jlcy0+eTAgLSBsX3kwX2Rlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX29mZnNldF95MF9zcmMgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGxfeTFfZGVzdCA+PSAoT1BKX1VJTlQzMilsX3Jlcy0+eTEgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaGVpZ2h0X2Rlc3QgPSBsX2hlaWdodF9zcmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfb2Zmc2V0X3kxX3NyYyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9oZWlnaHRfZGVzdCA9IGxfeTFfZGVzdCAtIChPUEpfVUlOVDMyKWxfcmVzLT55MCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfb2Zmc2V0X3kxX3NyYyA9ICAoT1BKX0lOVDMyKShsX2hlaWdodF9zcmMgLSBsX2hlaWdodF9kZXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3N0YXJ0X3lfZGVzdCA9IDBVOwotICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXRfeTBfc3JjID0gKE9QSl9JTlQzMilsX3kwX2Rlc3QgLSBsX3Jlcy0+eTA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbF95MV9kZXN0ID49IChPUEpfVUlOVDMyKWxfcmVzLT55MSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9oZWlnaHRfZGVzdCA9IGxfaGVpZ2h0X3NyYyAtIChPUEpfVUlOVDMyKWxfb2Zmc2V0X3kwX3NyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXRfeTFfc3JjID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2hlaWdodF9kZXN0ID0gbF9pbWdfY29tcF9kZXN0LT5oIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXRfeTFfc3JjID0gbF9yZXMtPnkxIC0gKE9QSl9JTlQzMilsX3kxX2Rlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYoIChsX29mZnNldF94MF9zcmMgPCAwICkgfHwgKGxfb2Zmc2V0X3kwX3NyYyA8IDAgKSB8fCAobF9vZmZzZXRfeDFfc3JjIDwgMCApIHx8IChsX29mZnNldF95MV9zcmMgPCAwICkgKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIHRlc3RjYXNlIDI5NzcucGRmLmFzYW4uNjcuMjE5OCAqLwotICAgICAgICAgICAgICAgIGlmICgoT1BKX0lOVDMyKWxfd2lkdGhfZGVzdCA8IDAgfHwgKE9QSl9JTlQzMilsX2hlaWdodF9kZXN0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyotLS0tLSovCi0KLSAgICAgICAgICAgICAgICAvKiBDb21wdXRlIHRoZSBpbnB1dCBidWZmZXIgb2Zmc2V0ICovCi0gICAgICAgICAgICAgICAgbF9zdGFydF9vZmZzZXRfc3JjID0gKE9QSl9TSVpFX1QpbF9vZmZzZXRfeDBfc3JjICsgKE9QSl9TSVpFX1QpbF9vZmZzZXRfeTBfc3JjICogKE9QSl9TSVpFX1QpbF93aWR0aF9zcmM7Ci0gICAgICAgICAgICAgICAgbF9saW5lX29mZnNldF9zcmMgID0gKE9QSl9TSVpFX1QpbF9vZmZzZXRfeDFfc3JjICsgKE9QSl9TSVpFX1QpbF9vZmZzZXRfeDBfc3JjOwotICAgICAgICAgICAgICAgIGxfZW5kX29mZnNldF9zcmMgICA9IChPUEpfU0laRV9UKWxfb2Zmc2V0X3kxX3NyYyAqIChPUEpfU0laRV9UKWxfd2lkdGhfc3JjIC0gKE9QSl9TSVpFX1QpbF9vZmZzZXRfeDBfc3JjOwotCi0gICAgICAgICAgICAgICAgLyogQ29tcHV0ZSB0aGUgb3V0cHV0IGJ1ZmZlciBvZmZzZXQgKi8KLSAgICAgICAgICAgICAgICBsX3N0YXJ0X29mZnNldF9kZXN0ID0gKE9QSl9TSVpFX1QpbF9zdGFydF94X2Rlc3QgKyAoT1BKX1NJWkVfVClsX3N0YXJ0X3lfZGVzdCAqIChPUEpfU0laRV9UKWxfaW1nX2NvbXBfZGVzdC0+dzsKLSAgICAgICAgICAgICAgICBsX2xpbmVfb2Zmc2V0X2Rlc3QgID0gKE9QSl9TSVpFX1QpbF9pbWdfY29tcF9kZXN0LT53IC0gKE9QSl9TSVpFX1QpbF93aWR0aF9kZXN0OwotCi0gICAgICAgICAgICAgICAgLyogTW92ZSB0aGUgb3V0cHV0IGJ1ZmZlciB0byB0aGUgZmlyc3QgcGxhY2Ugd2hlcmUgd2Ugd2lsbCB3cml0ZSovCi0gICAgICAgICAgICAgICAgbF9kZXN0X3B0ciA9IGxfaW1nX2NvbXBfZGVzdC0+ZGF0YSArIGxfc3RhcnRfb2Zmc2V0X2Rlc3Q7Ci0KLSAgICAgICAgICAgICAgICAvKmlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiQ09NUE9bJWRdOlxuIixpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiU1JDOiBsX3N0YXJ0X3hfc3JjPSVkLCBsX3N0YXJ0X3lfc3JjPSVkLCBsX3dpZHRoX3NyYz0lZCwgbF9oZWlnaHRfc3JjPSVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0IHRpbGUgb2Zmc2V0OiVkLCAlZCwgJWQsICVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0IGJ1ZmZlciBvZmZzZXQ6ICVkOyAlZCwgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9yZXMtPngwLCBsX3Jlcy0+eTAsIGxfd2lkdGhfc3JjLCBsX2hlaWdodF9zcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9vZmZzZXRfeDBfc3JjLCBsX29mZnNldF95MF9zcmMsIGxfb2Zmc2V0X3gxX3NyYywgbF9vZmZzZXRfeTFfc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3RhcnRfb2Zmc2V0X3NyYywgbF9saW5lX29mZnNldF9zcmMsIGxfZW5kX29mZnNldF9zcmMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIkRFU1Q6IGxfc3RhcnRfeF9kZXN0PSVkLCBsX3N0YXJ0X3lfZGVzdD0lZCwgbF93aWR0aF9kZXN0PSVkLCBsX2hlaWdodF9kZXN0PSVkXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlx0IHN0YXJ0IG9mZnNldDogJWQsIGxpbmUgb2Zmc2V0PSAlZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3N0YXJ0X3hfZGVzdCwgbF9zdGFydF95X2Rlc3QsIGxfd2lkdGhfZGVzdCwgbF9oZWlnaHRfZGVzdCwgbF9zdGFydF9vZmZzZXRfZGVzdCwgbF9saW5lX29mZnNldF9kZXN0KTsKLSAgICAgICAgICAgICAgICB9Ki8KLQotICAgICAgICAgICAgICAgIHN3aXRjaCAobF9zaXplX2NvbXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9DSEFSICogbF9zcmNfcHRyID0gKE9QSl9DSEFSKikgcF9kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0YXJ0X29mZnNldF9zcmM7IC8qIE1vdmUgdG8gdGhlIGZpcnN0IHBsYWNlIHdoZXJlIHdlIHdpbGwgcmVhZCovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9pbWdfY29tcF9zcmMtPnNnbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDAgOyBqIDwgbF9oZWlnaHRfZGVzdCA7ICsraikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBrID0gMCA7IGsgPCBsX3dpZHRoX2Rlc3QgOyArK2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIrKykgPSAoT1BKX0lOVDMyKSAoKihsX3NyY19wdHIrKykpOyAvKiBDb3B5IG9ubHkgdGhlIGRhdGEgbmVlZGVkIGZvciB0aGUgb3V0cHV0IGltYWdlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2Rlc3RfcHRyKz0gbF9saW5lX29mZnNldF9kZXN0OyAvKiBNb3ZlIHRvIHRoZSBuZXh0IHBsYWNlIHdoZXJlIHdlIHdpbGwgd3JpdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zcmNfcHRyICs9IGxfbGluZV9vZmZzZXRfc3JjIDsgLyogTW92ZSB0byB0aGUgbmV4dCBwbGFjZSB3aGVyZSB3ZSB3aWxsIHJlYWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBqID0gMCA7IGogPCBsX2hlaWdodF9kZXN0IDsgKytqICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBrID0gMCA7IGsgPCBsX3dpZHRoX2Rlc3QgOyArK2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIrKykgPSAoT1BKX0lOVDMyKSAoKCoobF9zcmNfcHRyKyspKSYweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZGVzdF9wdHIrPSBsX2xpbmVfb2Zmc2V0X2Rlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX2xpbmVfb2Zmc2V0X3NyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9lbmRfb2Zmc2V0X3NyYzsgLyogTW92ZSB0byB0aGUgZW5kIG9mIHRoaXMgY29tcG9uZW50LXBhcnQgb2YgdGhlIGlucHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSA9IChPUEpfQllURSopIGxfc3JjX3B0cjsgLyogS2VlcCB0aGUgY3VycmVudCBwb3NpdGlvbiBmb3IgdGhlIG5leHQgY29tcG9uZW50LXBhcnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQxNiAqIGxfc3JjX3B0ciA9IChPUEpfSU5UMTYgKikgcF9kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0YXJ0X29mZnNldF9zcmM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9pbWdfY29tcF9zcmMtPnNnbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9oZWlnaHRfZGVzdDsrK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrPTA7azxsX3dpZHRoX2Rlc3Q7KytrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKihsX3NyY19wdHIrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2Rlc3RfcHRyKz0gbF9saW5lX29mZnNldF9kZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9saW5lX29mZnNldF9zcmMgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9oZWlnaHRfZGVzdDsrK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrPTA7azxsX3dpZHRoX2Rlc3Q7KytrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKCoobF9zcmNfcHRyKyspKSYweGZmZmY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2Rlc3RfcHRyKz0gbF9saW5lX29mZnNldF9kZXN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9saW5lX29mZnNldF9zcmMgOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX2VuZF9vZmZzZXRfc3JjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSA9IChPUEpfQllURSopIGxfc3JjX3B0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIGxfc3JjX3B0ciA9IChPUEpfSU5UMzIgKikgcF9kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0YXJ0X29mZnNldF9zcmM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfaGVpZ2h0X2Rlc3Q7KytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGs9MDtrPGxfd2lkdGhfZGVzdDsrK2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKCoobF9zcmNfcHRyKyspKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9kZXN0X3B0cis9IGxfbGluZV9vZmZzZXRfZGVzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX2xpbmVfb2Zmc2V0X3NyYyA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zcmNfcHRyICs9IGxfZW5kX29mZnNldF9zcmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhID0gKE9QSl9CWVRFKikgbF9zcmNfcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICsrbF9pbWdfY29tcF9kZXN0OwotICAgICAgICAgICAgICAgICsrbF9pbWdfY29tcF9zcmM7Ci0gICAgICAgICAgICAgICAgKytsX3RpbGVjOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1PUEpfQk9PTCBvcGpfajJrX3NldF9kZWNvZGVfYXJlYSggICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QqIHBfaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3N0YXJ0X3gsIE9QSl9JTlQzMiBwX3N0YXJ0X3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX2VuZF94LCBPUEpfSU5UMzIgcF9lbmRfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKLXsKLSAgICAgICAgb3BqX2NwX3QgKiBsX2NwID0gJihwX2oyay0+bV9jcCk7Ci0gICAgICAgIG9wal9pbWFnZV90ICogbF9pbWFnZSA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2U7Ci0KLSAgICAgICAgT1BKX1VJTlQzMiBpdF9jb21wOwotICAgICAgICBPUEpfSU5UMzIgbF9jb21wX3gxLCBsX2NvbXBfeTE7Ci0gICAgICAgIG9wal9pbWFnZV9jb21wX3QqIGxfaW1nX2NvbXAgPSBOVUxMOwotCi0gICAgICAgIC8qIENoZWNrIGlmIHdlIGFyZSByZWFkIHRoZSBtYWluIGhlYWRlciAqLwotICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgIT0gSjJLX1NUQVRFX1RQSFNPVCkgeyAvKiBGSVhNRSBKMktfREVDX1NUQVRFX1RQSFNPVCkqLwotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOZWVkIHRvIGRlY29kZSB0aGUgbWFpbiBoZWFkZXIgYmVmb3JlIGJlZ2luIHRvIGRlY29kZSB0aGUgcmVtYWluaW5nIGNvZGVzdHJlYW0iKTsKKyAgICAgICAgaWYgKGxfY3VycmVudF9tYXJrZXIgIT0gSjJLX01TX1NPVCkgeworICAgICAgICAgICAgLyogYXNzdW1lIGFsbCBpcyBPSyAqLworICAgICAgICAgICAgaWYgKCEgb3BqX3N0cmVhbV9zZWVrKHBfc3RyZWFtLCBsX3N0cmVhbV9wb3NfYmFja3VwLCBwX21hbmFnZXIpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICggIXBfc3RhcnRfeCAmJiAhcF9zdGFydF95ICYmICFwX2VuZF94ICYmICFwX2VuZF95KXsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0lORk8sICJObyBkZWNvZGVkIGFyZWEgcGFyYW1ldGVycywgc2V0IHRoZSBkZWNvZGVkIGFyZWEgdG8gdGhlIHdob2xlIGltYWdlXG4iKTsKKyAgICAgICAgLyogVHJ5IHRvIHJlYWQgMiBieXRlcyAodGhlIG1hcmtlciBzaXplKSBmcm9tIHN0cmVhbSBhbmQgY29weSB0aGVtIGludG8gdGhlIGJ1ZmZlciAqLworICAgICAgICBpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0sIGxfaGVhZGVyX2RhdGEsIDIsIHBfbWFuYWdlcikgIT0gMikgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhcnRfdGlsZV94ID0gMDsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3kgPSAwOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3ggPSBsX2NwLT50dzsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV95ID0gbF9jcC0+dGg7CisgICAgICAgIC8qIFJlYWQgMiBieXRlcyBmcm9tIHRoZSBidWZmZXIgYXMgdGhlIG1hcmtlciBzaXplICovCisgICAgICAgIG9wal9yZWFkX2J5dGVzKGxfaGVhZGVyX2RhdGEsICZsX21hcmtlcl9zaXplLCAyKTsKIAorICAgICAgICAvKiBDaGVjayBtYXJrZXIgc2l6ZSBmb3IgU09UIE1hcmtlciAqLworICAgICAgICBpZiAobF9tYXJrZXJfc2l6ZSAhPSAxMCkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkluY29uc2lzdGVudCBtYXJrZXIgc2l6ZVxuIik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGxfbWFya2VyX3NpemUgLT0gMjsKKworICAgICAgICBpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0sIGxfaGVhZGVyX2RhdGEsIGxfbWFya2VyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpICE9IGxfbWFya2VyX3NpemUpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJTdHJlYW0gdG9vIHNob3J0XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoISBvcGpfajJrX2dldF9zb3RfdmFsdWVzKGxfaGVhZGVyX2RhdGEsIGxfbWFya2VyX3NpemUsICZsX3RpbGVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfdG90X2xlbiwgJmxfY3VycmVudF9wYXJ0LCAmbF9udW1fcGFydHMsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAobF90aWxlX25vID09IHRpbGVfbm8pIHsKKyAgICAgICAgICAgIC8qIHdlIGZvdW5kIHdoYXQgd2Ugd2VyZSBsb29raW5nIGZvciAqLworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAobF90b3RfbGVuIDwgMTRVKSB7CisgICAgICAgICAgICAvKiBsYXN0IFNPVCB1bnRpbCBFT0Mgb3IgaW52YWxpZCBQc290IHZhbHVlICovCisgICAgICAgICAgICAvKiBhc3N1bWUgYWxsIGlzIE9LICovCisgICAgICAgICAgICBpZiAoISBvcGpfc3RyZWFtX3NlZWsocF9zdHJlYW0sIGxfc3RyZWFtX3Bvc19iYWNrdXAsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICB9CisgICAgICAgIGxfdG90X2xlbiAtPSAxMlU7CisgICAgICAgIC8qIGxvb2sgZm9yIG5leHQgU09UIG1hcmtlciAqLworICAgICAgICBpZiAob3BqX3N0cmVhbV9za2lwKHBfc3RyZWFtLCAoT1BKX09GRl9UKShsX3RvdF9sZW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWFuYWdlcikgIT0gKE9QSl9PRkZfVCkobF90b3RfbGVuKSkgeworICAgICAgICAgICAgLyogYXNzdW1lIGFsbCBpcyBPSyAqLworICAgICAgICAgICAgaWYgKCEgb3BqX3N0cmVhbV9zZWVrKHBfc3RyZWFtLCBsX3N0cmVhbV9wb3NfYmFja3VwLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNoZWNrIGZvciBjb3JyZWN0aW9uICovCisgICAgaWYgKGxfY3VycmVudF9wYXJ0ID09IGxfbnVtX3BhcnRzKSB7CisgICAgICAgICpwX2NvcnJlY3Rpb25fbmVlZGVkID0gT1BKX1RSVUU7CisgICAgfQorCisgICAgaWYgKCEgb3BqX3N0cmVhbV9zZWVrKHBfc3RyZWFtLCBsX3N0cmVhbV9wb3NfYmFja3VwLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworT1BKX0JPT0wgb3BqX2oya19yZWFkX3RpbGVfaGVhZGVyKG9wal9qMmtfdCAqIHBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX3RpbGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV94MCwgT1BKX0lOVDMyICogcF90aWxlX3kwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV94MSwgT1BKX0lOVDMyICogcF90aWxlX3kxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX25iX2NvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CT09MICogcF9nb19vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQoreworICAgIE9QSl9VSU5UMzIgbF9jdXJyZW50X21hcmtlciA9IEoyS19NU19TT1Q7CisgICAgT1BKX1VJTlQzMiBsX21hcmtlcl9zaXplOworICAgIGNvbnN0IG9wal9kZWNfbWVtb3J5X21hcmtlcl9oYW5kbGVyX3QgKiBsX21hcmtlcl9oYW5kbGVyID0gMDA7CisgICAgb3BqX3RjcF90ICogbF90Y3AgPSBOVUxMOworCisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworICAgIC8qIFJlYWNoIHRoZSBFbmQgT2YgQ29kZXN0cmVhbSA/Ki8KKyAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX0VPQykgeworICAgICAgICBsX2N1cnJlbnRfbWFya2VyID0gSjJLX01TX0VPQzsKKyAgICB9CisgICAgLyogV2UgbmVlZCB0byBlbmNvdW50ZXIgYSBTT1QgbWFya2VyIChhIG5ldyB0aWxlLXBhcnQgaGVhZGVyKSAqLworICAgIGVsc2UgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlICE9IEoyS19TVEFURV9UUEhTT1QpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICAvKiBSZWFkIGludG8gdGhlIGNvZGVzdHJlYW0gdW50aWwgcmVhY2ggdGhlIEVPQyBvciAhIGNhbl9kZWNvZGUgPz8/IEZJWE1FICovCisgICAgd2hpbGUgKCghcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fY2FuX2RlY29kZSkgJiYKKyAgICAgICAgICAgIChsX2N1cnJlbnRfbWFya2VyICE9IEoyS19NU19FT0MpKSB7CisKKyAgICAgICAgLyogVHJ5IHRvIHJlYWQgdW50aWwgdGhlIFN0YXJ0IE9mIERhdGEgaXMgZGV0ZWN0ZWQgKi8KKyAgICAgICAgd2hpbGUgKGxfY3VycmVudF9tYXJrZXIgIT0gSjJLX01TX1NPRCkgeworCisgICAgICAgICAgICBpZiAob3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChwX3N0cmVhbSkgPT0gMCkgeworICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID0gSjJLX1NUQVRFX05FT0M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFRyeSB0byByZWFkIDIgYnl0ZXMgKHRoZSBtYXJrZXIgc2l6ZSkgZnJvbSBzdHJlYW0gYW5kIGNvcHkgdGhlbSBpbnRvIHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgIGlmIChvcGpfc3RyZWFtX3JlYWRfZGF0YShwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwgMiwgcF9tYW5hZ2VyKSAhPSAyKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFJlYWQgMiBieXRlcyBmcm9tIHRoZSBidWZmZXIgYXMgdGhlIG1hcmtlciBzaXplICovCisgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwgJmxfbWFya2VyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAyKTsKKworICAgICAgICAgICAgLyogQ2hlY2sgbWFya2VyIHNpemUgKGRvZXMgbm90IGluY2x1ZGUgbWFya2VyIElEIGJ1dCBpbmNsdWRlcyBtYXJrZXIgc2l6ZSkgKi8KKyAgICAgICAgICAgIGlmIChsX21hcmtlcl9zaXplIDwgMikgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbmNvbnNpc3RlbnQgbWFya2VyIHNpemVcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNmLiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL29wZW5qcGVnL2lzc3Vlcy9kZXRhaWw/aWQ9MjI2ICovCisgICAgICAgICAgICBpZiAobF9jdXJyZW50X21hcmtlciA9PSAweDgwODAgJiYKKyAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChwX3N0cmVhbSkgPT0gMCkgeworICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID0gSjJLX1NUQVRFX05FT0M7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFdoeSB0aGlzIGNvbmRpdGlvbj8gRklYTUUgKi8KKyAgICAgICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSAmIEoyS19TVEFURV9UUEgpIHsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoIC09IChsX21hcmtlcl9zaXplICsgMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsX21hcmtlcl9zaXplIC09IDI7IC8qIFN1YnRyYWN0IHRoZSBzaXplIG9mIHRoZSBtYXJrZXIgSUQgYWxyZWFkeSByZWFkICovCisKKyAgICAgICAgICAgIC8qIEdldCB0aGUgbWFya2VyIGhhbmRsZXIgZnJvbSB0aGUgbWFya2VyIElEICovCisgICAgICAgICAgICBsX21hcmtlcl9oYW5kbGVyID0gb3BqX2oya19nZXRfbWFya2VyX2hhbmRsZXIobF9jdXJyZW50X21hcmtlcik7CisKKyAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSBtYXJrZXIgaXMga25vd24gYW5kIGlmIGl0IGlzIHRoZSByaWdodCBwbGFjZSB0byBmaW5kIGl0ICovCisgICAgICAgICAgICBpZiAoIShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSAmIGxfbWFya2VyX2hhbmRsZXItPnN0YXRlcykpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hcmtlciBpcyBub3QgY29tcGxpYW50IHdpdGggaXRzIHBvc2l0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogRklYTUUgbWFuYWdlIGNhc2Ugb2YgdW5rbm93biBtYXJrZXIgYXMgaW4gdGhlIG1haW4gaGVhZGVyID8gKi8KKworICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIG1hcmtlciBzaXplIGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgaGVhZGVyIGRhdGEgc2l6ZSAqLworICAgICAgICAgICAgaWYgKGxfbWFya2VyX3NpemUgPiBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgT1BKX0JZVEUgKm5ld19oZWFkZXJfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgLyogSWYgd2UgYXJlIGhlcmUsIHRoaXMgbWVhbnMgd2UgY29uc2lkZXIgdGhpcyBtYXJrZXIgYXMga25vd24gJiB3ZSB3aWxsIHJlYWQgaXQgKi8KKyAgICAgICAgICAgICAgICAvKiBDaGVjayBlbm91Z2ggYnl0ZXMgbGVmdCBpbiBzdHJlYW0gYmVmb3JlIGFsbG9jYXRpb24gKi8KKyAgICAgICAgICAgICAgICBpZiAoKE9QSl9PRkZfVClsX21hcmtlcl9zaXplID4gIG9wal9zdHJlYW1fZ2V0X251bWJlcl9ieXRlX2xlZnQocF9zdHJlYW0pKSB7CisgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hcmtlciBzaXplIGluY29uc2lzdGVudCB3aXRoIHN0cmVhbSBsZW5ndGhcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZXdfaGVhZGVyX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLCBsX21hcmtlcl9zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoISBuZXdfaGVhZGVyX2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEpOworICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhX3NpemUgPSAwOworICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVhZCBoZWFkZXJcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSA9IG5ld19oZWFkZXJfZGF0YTsKKyAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YV9zaXplID0gbF9tYXJrZXJfc2l6ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogVHJ5IHRvIHJlYWQgdGhlIHJlc3Qgb2YgdGhlIG1hcmtlciBzZWdtZW50IGZyb20gc3RyZWFtIGFuZCBjb3B5IHRoZW0gaW50byB0aGUgYnVmZmVyICovCisgICAgICAgICAgICBpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsIGxfbWFya2VyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSAhPSBsX21hcmtlcl9zaXplKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbF9tYXJrZXJfaGFuZGxlci0+aGFuZGxlcikgeworICAgICAgICAgICAgICAgIC8qIFNlZSBpc3N1ZSAjMTc1ICovCisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBzdXJlIGhvdyB0aGF0IGhhcHBlbmVkLlxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFJlYWQgdGhlIG1hcmtlciBzZWdtZW50IHdpdGggdGhlIGNvcnJlY3QgbWFya2VyIGhhbmRsZXIgKi8KKyAgICAgICAgICAgIGlmICghKCoobF9tYXJrZXJfaGFuZGxlci0+aGFuZGxlcikpKHBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsIGxfbWFya2VyX3NpemUsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWwgdG8gcmVhZCB0aGUgY3VycmVudCBtYXJrZXIgc2VnbWVudCAoJSN4KVxuIiwgbF9jdXJyZW50X21hcmtlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQWRkIHRoZSBtYXJrZXIgdG8gdGhlIGNvZGVzdHJlYW0gaW5kZXgqLworICAgICAgICAgICAgaWYgKE9QSl9GQUxTRSA9PSBvcGpfajJrX2FkZF90bG1hcmtlcihwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9tYXJrZXJfaGFuZGxlci0+aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfVUlOVDMyKSBvcGpfc3RyZWFtX3RlbGwocF9zdHJlYW0pIC0gbF9tYXJrZXJfc2l6ZSAtIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbWFya2VyX3NpemUgKyA0KSkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBhZGQgdGwgbWFya2VyXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBLZWVwIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBTT1QgbWFya2VyIHJlYWQgKi8KKyAgICAgICAgICAgIGlmIChsX21hcmtlcl9oYW5kbGVyLT5pZCA9PSBKMktfTVNfU09UKSB7CisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBzb3RfcG9zID0gKE9QSl9VSU5UMzIpIG9wal9zdHJlYW1fdGVsbChwX3N0cmVhbSkgLSBsX21hcmtlcl9zaXplIC0gNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICBpZiAoc290X3BvcyA+IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2xhc3Rfc290X3JlYWRfcG9zKSB7CisgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2xhc3Rfc290X3JlYWRfcG9zID0gc290X3BvczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9za2lwX2RhdGEpIHsKKyAgICAgICAgICAgICAgICAvKiBTa2lwIHRoZSByZXN0IG9mIHRoZSB0aWxlIHBhcnQgaGVhZGVyKi8KKyAgICAgICAgICAgICAgICBpZiAob3BqX3N0cmVhbV9za2lwKHBfc3RyZWFtLCBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSAhPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zb3RfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJTdHJlYW0gdG9vIHNob3J0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbF9jdXJyZW50X21hcmtlciA9IEoyS19NU19TT0Q7IC8qIE5vcm1hbGx5IHdlIHJlYWNoZWQgYSBTT0QgKi8KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogVHJ5IHRvIHJlYWQgMiBieXRlcyAodGhlIG5leHQgbWFya2VyIElEKSBmcm9tIHN0cmVhbSBhbmQgY29weSB0aGVtIGludG8gdGhlIGJ1ZmZlciovCisgICAgICAgICAgICAgICAgaWYgKG9wal9zdHJlYW1fcmVhZF9kYXRhKHBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwgMiwgcF9tYW5hZ2VyKSAhPSAyKSB7CisgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJTdHJlYW0gdG9vIHNob3J0XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogUmVhZCAyIGJ5dGVzIGZyb20gdGhlIGJ1ZmZlciBhcyB0aGUgbmV3IG1hcmtlciBJRCAqLworICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX2N1cnJlbnRfbWFya2VyLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAob3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChwX3N0cmVhbSkgPT0gMAorICAgICAgICAgICAgICAgICYmIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9ORU9DKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qIElmIHdlIGRpZG4ndCBza2lwIGRhdGEgYmVmb3JlLCB3ZSBuZWVkIHRvIHJlYWQgdGhlIFNPRCBtYXJrZXIqLworICAgICAgICBpZiAoISBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9za2lwX2RhdGEpIHsKKyAgICAgICAgICAgIC8qIFRyeSB0byByZWFkIHRoZSBTT0QgbWFya2VyIGFuZCBza2lwIGRhdGEgPyBGSVhNRSAqLworICAgICAgICAgICAgaWYgKCEgb3BqX2oya19yZWFkX3NvZChwX2oyaywgcF9zdHJlYW0sIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2Nhbl9kZWNvZGUgJiYKKyAgICAgICAgICAgICAgICAgICAgIXBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX25iX3RpbGVfcGFydHNfY29ycmVjdGlvbl9jaGVja2VkKSB7CisgICAgICAgICAgICAgICAgLyogSXNzdWUgMjU0ICovCisgICAgICAgICAgICAgICAgT1BKX0JPT0wgbF9jb3JyZWN0aW9uX25lZWRlZDsKKworICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX25iX3RpbGVfcGFydHNfY29ycmVjdGlvbl9jaGVja2VkID0gMTsKKyAgICAgICAgICAgICAgICBpZiAoIW9wal9qMmtfbmVlZF9uYl90aWxlX3BhcnRzX2NvcnJlY3Rpb24ocF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyLCAmbF9jb3JyZWN0aW9uX25lZWRlZCwgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGpfajJrX2FwcGx5X25iX3RpbGVfcGFydHNfY29ycmVjdGlvbiBlcnJvclxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsX2NvcnJlY3Rpb25fbmVlZGVkKSB7CisgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbF9uYl90aWxlcyA9IHBfajJrLT5tX2NwLnR3ICogcF9qMmstPm1fY3AudGg7CisgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbF90aWxlX25vOworCisgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2Nhbl9kZWNvZGUgPSAwOworICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9uYl90aWxlX3BhcnRzX2NvcnJlY3Rpb24gPSAxOworICAgICAgICAgICAgICAgICAgICAvKiBjb3JyZWN0IHRpbGVzICovCisgICAgICAgICAgICAgICAgICAgIGZvciAobF90aWxlX25vID0gMFU7IGxfdGlsZV9ubyA8IGxfbmJfdGlsZXM7ICsrbF90aWxlX25vKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocF9qMmstPm1fY3AudGNwc1tsX3RpbGVfbm9dLm1fbmJfdGlsZV9wYXJ0cyAhPSAwVSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX2NwLnRjcHNbbF90aWxlX25vXS5tX25iX3RpbGVfcGFydHMgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbiBjb25mb3JtYW50IGNvZGVzdHJlYW0gVFBzb3Q9PVROc290LlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fY2FuX2RlY29kZSkgeworICAgICAgICAgICAgICAgIC8qIFRyeSB0byByZWFkIDIgYnl0ZXMgKHRoZSBuZXh0IG1hcmtlciBJRCkgZnJvbSBzdHJlYW0gYW5kIGNvcHkgdGhlbSBpbnRvIHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLCAyLCBwX21hbmFnZXIpICE9IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIFJlYWQgMiBieXRlcyBmcm9tIGJ1ZmZlciBhcyB0aGUgbmV3IG1hcmtlciBJRCAqLworICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX2N1cnJlbnRfbWFya2VyLCAyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIEluZGljYXRlIHdlIHdpbGwgdHJ5IHRvIHJlYWQgYSBuZXcgdGlsZS1wYXJ0IGhlYWRlciovCisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9za2lwX2RhdGEgPSAwOworICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fY2FuX2RlY29kZSA9IDA7CisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9IEoyS19TVEFURV9UUEhTT1Q7CisKKyAgICAgICAgICAgIC8qIFRyeSB0byByZWFkIDIgYnl0ZXMgKHRoZSBuZXh0IG1hcmtlciBJRCkgZnJvbSBzdHJlYW0gYW5kIGNvcHkgdGhlbSBpbnRvIHRoZSBidWZmZXIgKi8KKyAgICAgICAgICAgIGlmIChvcGpfc3RyZWFtX3JlYWRfZGF0YShwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSwgMiwgcF9tYW5hZ2VyKSAhPSAyKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnRcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFJlYWQgMiBieXRlcyBmcm9tIGJ1ZmZlciBhcyB0aGUgbmV3IG1hcmtlciBJRCAqLworICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9jdXJyZW50X21hcmtlciwgMik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDdXJyZW50IG1hcmtlciBpcyB0aGUgRU9DIG1hcmtlciA/Ki8KKyAgICBpZiAobF9jdXJyZW50X21hcmtlciA9PSBKMktfTVNfRU9DKSB7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID0gSjJLX1NUQVRFX0VPQzsKKyAgICB9CisKKyAgICAvKiBGSVhNRSBET0MgPz8/Ki8KKyAgICBpZiAoISBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9jYW5fZGVjb2RlKSB7CisgICAgICAgIE9QSl9VSU5UMzIgbF9uYl90aWxlcyA9IHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHc7CisgICAgICAgIGxfdGNwID0gcF9qMmstPm1fY3AudGNwcyArIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXI7CisKKyAgICAgICAgd2hpbGUgKChwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyIDwgbF9uYl90aWxlcykgJiYgKGxfdGNwLT5tX2RhdGEgPT0gMDApKSB7CisgICAgICAgICAgICArK3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXI7CisgICAgICAgICAgICArK2xfdGNwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIgPT0gbF9uYl90aWxlcykgeworICAgICAgICAgICAgKnBfZ29fb24gPSBPUEpfRkFMU0U7CisgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoISBvcGpfajJrX21lcmdlX3BwdChwX2oyay0+bV9jcC50Y3BzICsgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gbWVyZ2UgUFBUIGRhdGFcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICAvKkZJWE1FID8/PyovCisgICAgaWYgKCEgb3BqX3RjZF9pbml0X2RlY29kZV90aWxlKHBfajJrLT5tX3RjZCwgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ2Fubm90IGRlY29kZSB0aWxlLCBtZW1vcnkgZXJyb3JcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfSU5GTywgIkhlYWRlciBvZiB0aWxlICVkIC8gJWQgaGFzIGJlZW4gcmVhZC5cbiIsCisgICAgICAgICAgICAgICAgICBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyICsgMSwgKHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHcpKTsKKworICAgICpwX3RpbGVfaW5kZXggPSBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyOworICAgICpwX2dvX29uID0gT1BKX1RSVUU7CisgICAgaWYgKHBfZGF0YV9zaXplKSB7CisgICAgICAgIC8qIEZvciBpbnRlcm5hbCB1c2UgaW4gajJrLmMsIHdlIGRvbid0IG5lZWQgdGhpcyAqLworICAgICAgICAvKiBUaGlzIGlzIGp1c3QgbmVlZGVkIGZvciBmb2xrcyB1c2luZyB0aGUgb3BqX3JlYWRfdGlsZV9oZWFkZXIoKSAvIG9wal9kZWNvZGVfdGlsZV9kYXRhKCkgY29tYm8gKi8KKyAgICAgICAgKnBfZGF0YV9zaXplID0gb3BqX3RjZF9nZXRfZGVjb2RlZF90aWxlX3NpemUocF9qMmstPm1fdGNkLCBPUEpfRkFMU0UpOworICAgICAgICBpZiAoKnBfZGF0YV9zaXplID09IFVJTlRfTUFYKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgfQorICAgICpwX3RpbGVfeDAgPSBwX2oyay0+bV90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPngwOworICAgICpwX3RpbGVfeTAgPSBwX2oyay0+bV90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPnkwOworICAgICpwX3RpbGVfeDEgPSBwX2oyay0+bV90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPngxOworICAgICpwX3RpbGVfeTEgPSBwX2oyay0+bV90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPnkxOworICAgICpwX25iX2NvbXBzID0gcF9qMmstPm1fdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5udW1jb21wczsKKworICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlIHw9IEoyS19TVEFURV9EQVRBOworCisgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitPUEpfQk9PTCBvcGpfajJrX2RlY29kZV90aWxlKG9wal9qMmtfdCAqIHBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQoreworICAgIE9QSl9VSU5UMzIgbF9jdXJyZW50X21hcmtlcjsKKyAgICBPUEpfQllURSBsX2RhdGEgWzJdOworICAgIG9wal90Y3BfdCAqIGxfdGNwOworICAgIG9wal9pbWFnZV90KiBsX2ltYWdlX2Zvcl9ib3VuZHM7CisKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisgICAgaWYgKCEocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgJiBKMktfU1RBVEVfREFUQSkKKyAgICAgICAgICAgIHx8IChwX3RpbGVfaW5kZXggIT0gcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICBsX3RjcCA9ICYocF9qMmstPm1fY3AudGNwc1twX3RpbGVfaW5kZXhdKTsKKyAgICBpZiAoISBsX3RjcC0+bV9kYXRhKSB7CisgICAgICAgIG9wal9qMmtfdGNwX2Rlc3Ryb3kobF90Y3ApOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIC8qIFdoZW4gdXNpbmcgdGhlIG9wal9yZWFkX3RpbGVfaGVhZGVyIC8gb3BqX2RlY29kZV90aWxlX2RhdGEgQVBJICovCisgICAgLyogc3VjaCBhcyBpbiB0ZXN0X3RpbGVfZGVjb2RlciwgbV9vdXRwdXRfaW1hZ2UgaXMgTlVMTCwgc28gZmFsbCBiYWNrICovCisgICAgLyogdG8gdGhlIGZ1bGwgaW1hZ2UgZGltZW5zaW9uLiBUaGlzIGlzIGEgYml0IHN1cnByaXNpbmcgdGhhdCAqLworICAgIC8qIG9wal9zZXRfZGVjb2RlX2FyZWEoKSBpcyBvbmx5IHVzZWQgdG8gZGV0ZXJtaW50ZSBpbnRlcnNlY3RpbmcgdGlsZXMsICovCisgICAgLyogYnV0IGZ1bGwgdGlsZSBkZWNvZGluZyBpcyBkb25lICovCisgICAgbF9pbWFnZV9mb3JfYm91bmRzID0gcF9qMmstPm1fb3V0cHV0X2ltYWdlID8gcF9qMmstPm1fb3V0cHV0X2ltYWdlIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9wcml2YXRlX2ltYWdlOworICAgIGlmICghIG9wal90Y2RfZGVjb2RlX3RpbGUocF9qMmstPm1fdGNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9pbWFnZV9mb3JfYm91bmRzLT54MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1hZ2VfZm9yX2JvdW5kcy0+eTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2ltYWdlX2Zvcl9ib3VuZHMtPngxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9pbWFnZV9mb3JfYm91bmRzLT55MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX251bWNvbXBzX3RvX2RlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2NvbXBzX2luZGljZXNfdG9fZGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90Y3AtPm1fZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNwLT5tX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGlsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LCBwX21hbmFnZXIpKSB7CisgICAgICAgIG9wal9qMmtfdGNwX2Rlc3Ryb3kobF90Y3ApOworICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSB8PSBKMktfU1RBVEVfRVJSOworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIGRlY29kZS5cbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIC8qIHBfZGF0YSBjYW4gYmUgc2V0IHRvIE5VTEwgd2hlbiB0aGUgY2FsbCB3aWxsIHRha2UgY2FyZSBvZiB1c2luZyAqLworICAgIC8qIGl0c2VsZiB0aGUgVENEIGRhdGEuIFRoaXMgaXMgdHlwaWNhbGx5IHRoZSBjYXNlIGZvciB3aG9sZSBzaW5nbGUgKi8KKyAgICAvKiB0aWxlIGRlY29kaW5nIG9wdGltaXphdGlvbi4gKi8KKyAgICBpZiAocF9kYXRhICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCEgb3BqX3RjZF91cGRhdGVfdGlsZV9kYXRhKHBfajJrLT5tX3RjZCwgcF9kYXRhLCBwX2RhdGFfc2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICAvKiBUbyBhdm9pZCB0byBkZXN0cm95IHRoZSB0Y3Agd2hpY2ggY2FuIGJlIHVzZWZ1bCB3aGVuIHdlIHRyeSB0byBkZWNvZGUgYSB0aWxlIGRlY29kZWQgYmVmb3JlIChjZiBqMmtfcmFuZG9tX3RpbGVfYWNjZXNzKQorICAgICAgICAqIHdlIGRlc3Ryb3kganVzdCB0aGUgZGF0YSB3aGljaCB3aWxsIGJlIHJlLXJlYWQgaW4gcmVhZF90aWxlX2hlYWRlciovCisgICAgICAgIC8qb3BqX2oya190Y3BfZGVzdHJveShsX3RjcCk7CisgICAgICAgIHBfajJrLT5tX3RjZC0+dGNwID0gMDsqLworICAgICAgICBvcGpfajJrX3RjcF9kYXRhX2Rlc3Ryb3kobF90Y3ApOworICAgIH0KKworICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2Nhbl9kZWNvZGUgPSAwOworICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlICY9ICh+KE9QSl9VSU5UMzIpSjJLX1NUQVRFX0RBVEEpOworCisgICAgaWYgKG9wal9zdHJlYW1fZ2V0X251bWJlcl9ieXRlX2xlZnQocF9zdHJlYW0pID09IDAKKyAgICAgICAgICAgICYmIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9ORU9DKSB7CisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICB9CisKKyAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgIT0gSjJLX1NUQVRFX0VPQykgeworICAgICAgICBpZiAob3BqX3N0cmVhbV9yZWFkX2RhdGEocF9zdHJlYW0sIGxfZGF0YSwgMiwgcF9tYW5hZ2VyKSAhPSAyKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIHRvbyBzaG9ydFxuIik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMobF9kYXRhLCAmbF9jdXJyZW50X21hcmtlciwgMik7CisKKyAgICAgICAgaWYgKGxfY3VycmVudF9tYXJrZXIgPT0gSjJLX01TX0VPQykgeworICAgICAgICAgICAgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciA9IDA7CisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9IEoyS19TVEFURV9FT0M7CisgICAgICAgIH0gZWxzZSBpZiAobF9jdXJyZW50X21hcmtlciAhPSBKMktfTVNfU09UKSB7CisgICAgICAgICAgICBpZiAob3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChwX3N0cmVhbSkgPT0gMCkgeworICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID0gSjJLX1NUQVRFX05FT0M7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiU3RyZWFtIGRvZXMgbm90IGVuZCB3aXRoIEVPQ1xuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlN0cmVhbSB0b28gc2hvcnQsIGV4cGVjdGVkIFNPVFxuIik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya191cGRhdGVfaW1hZ2VfZGF0YShvcGpfdGNkX3QgKiBwX3RjZCwKKyAgICAgICAgb3BqX2ltYWdlX3QqIHBfb3V0cHV0X2ltYWdlKQoreworICAgIE9QSl9VSU5UMzIgaSwgajsKKyAgICBPUEpfVUlOVDMyIGxfd2lkdGhfc3JjLCBsX2hlaWdodF9zcmM7CisgICAgT1BKX1VJTlQzMiBsX3dpZHRoX2Rlc3QsIGxfaGVpZ2h0X2Rlc3Q7CisgICAgT1BKX0lOVDMyIGxfb2Zmc2V0X3gwX3NyYywgbF9vZmZzZXRfeTBfc3JjLCBsX29mZnNldF94MV9zcmMsIGxfb2Zmc2V0X3kxX3NyYzsKKyAgICBPUEpfU0laRV9UIGxfc3RhcnRfb2Zmc2V0X3NyYzsKKyAgICBPUEpfVUlOVDMyIGxfc3RhcnRfeF9kZXN0LCBsX3N0YXJ0X3lfZGVzdDsKKyAgICBPUEpfVUlOVDMyIGxfeDBfZGVzdCwgbF95MF9kZXN0LCBsX3gxX2Rlc3QsIGxfeTFfZGVzdDsKKyAgICBPUEpfU0laRV9UIGxfc3RhcnRfb2Zmc2V0X2Rlc3Q7CisKKyAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcF9zcmMgPSAwMDsKKyAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcF9kZXN0ID0gMDA7CisKKyAgICBvcGpfdGNkX3RpbGVjb21wX3QgKiBsX3RpbGVjID0gMDA7CisgICAgb3BqX2ltYWdlX3QgKiBsX2ltYWdlX3NyYyA9IDAwOworICAgIE9QSl9JTlQzMiAqIGxfZGVzdF9wdHI7CisKKyAgICBsX3RpbGVjID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzOworICAgIGxfaW1hZ2Vfc3JjID0gcF90Y2QtPmltYWdlOworICAgIGxfaW1nX2NvbXBfc3JjID0gbF9pbWFnZV9zcmMtPmNvbXBzOworCisgICAgbF9pbWdfY29tcF9kZXN0ID0gcF9vdXRwdXRfaW1hZ2UtPmNvbXBzOworCisgICAgZm9yIChpID0gMDsgaSA8IGxfaW1hZ2Vfc3JjLT5udW1jb21wczsKKyAgICAgICAgICAgIGkrKywgKytsX2ltZ19jb21wX2Rlc3QsICsrbF9pbWdfY29tcF9zcmMsICArK2xfdGlsZWMpIHsKKyAgICAgICAgT1BKX0lOVDMyIHJlc194MCwgcmVzX3gxLCByZXNfeTAsIHJlc195MTsKKyAgICAgICAgT1BKX1VJTlQzMiBzcmNfZGF0YV9zdHJpZGU7CisgICAgICAgIGNvbnN0IE9QSl9JTlQzMiogcF9zcmNfZGF0YTsKKworICAgICAgICAvKiBDb3B5IGluZm8gZnJvbSBkZWNvZGVkIGNvbXAgaW1hZ2UgdG8gb3V0cHV0IGltYWdlICovCisgICAgICAgIGxfaW1nX2NvbXBfZGVzdC0+cmVzbm9fZGVjb2RlZCA9IGxfaW1nX2NvbXBfc3JjLT5yZXNub19kZWNvZGVkOworCisgICAgICAgIGlmIChwX3RjZC0+d2hvbGVfdGlsZV9kZWNvZGluZykgeworICAgICAgICAgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QqIGxfcmVzID0gbF90aWxlYy0+cmVzb2x1dGlvbnMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9pbWdfY29tcF9zcmMtPnJlc25vX2RlY29kZWQ7CisgICAgICAgICAgICByZXNfeDAgPSBsX3Jlcy0+eDA7CisgICAgICAgICAgICByZXNfeTAgPSBsX3Jlcy0+eTA7CisgICAgICAgICAgICByZXNfeDEgPSBsX3Jlcy0+eDE7CisgICAgICAgICAgICByZXNfeTEgPSBsX3Jlcy0+eTE7CisgICAgICAgICAgICBzcmNfZGF0YV9zdHJpZGUgPSAoT1BKX1VJTlQzMikoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90aWxlYy0+cmVzb2x1dGlvbnNbbF90aWxlYy0+bWluaW11bV9udW1fcmVzb2x1dGlvbnMgLSAxXS54MSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90aWxlYy0+cmVzb2x1dGlvbnNbbF90aWxlYy0+bWluaW11bV9udW1fcmVzb2x1dGlvbnMgLSAxXS54MCk7CisgICAgICAgICAgICBwX3NyY19kYXRhID0gbF90aWxlYy0+ZGF0YTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiBsX3JlcyA9IGxfdGlsZWMtPnJlc29sdXRpb25zICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1nX2NvbXBfc3JjLT5yZXNub19kZWNvZGVkOworICAgICAgICAgICAgcmVzX3gwID0gKE9QSl9JTlQzMilsX3Jlcy0+d2luX3gwOworICAgICAgICAgICAgcmVzX3kwID0gKE9QSl9JTlQzMilsX3Jlcy0+d2luX3kwOworICAgICAgICAgICAgcmVzX3gxID0gKE9QSl9JTlQzMilsX3Jlcy0+d2luX3gxOworICAgICAgICAgICAgcmVzX3kxID0gKE9QSl9JTlQzMilsX3Jlcy0+d2luX3kxOworICAgICAgICAgICAgc3JjX2RhdGFfc3RyaWRlID0gbF9yZXMtPndpbl94MSAtIGxfcmVzLT53aW5feDA7CisgICAgICAgICAgICBwX3NyY19kYXRhID0gbF90aWxlYy0+ZGF0YV93aW47CiAgICAgICAgIH0KIAotICAgICAgICAvKiAtLS0tLSAqLwotICAgICAgICAvKiBDaGVjayBpZiB0aGUgcG9zaXRpb25zIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIGFyZSBjb3JyZWN0ICovCisgICAgICAgIGlmIChwX3NyY19kYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIC8qIEhhcHBlbnMgZm9yIHBhcnRpYWwgY29tcG9uZW50IGRlY29kaW5nICovCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCi0gICAgICAgIC8qIExlZnQgKi8KLSAgICAgICAgYXNzZXJ0KHBfc3RhcnRfeCA+PSAwICk7Ci0gICAgICAgIGFzc2VydChwX3N0YXJ0X3kgPj0gMCApOworICAgICAgICBsX3dpZHRoX3NyYyA9IChPUEpfVUlOVDMyKShyZXNfeDEgLSByZXNfeDApOworICAgICAgICBsX2hlaWdodF9zcmMgPSAoT1BKX1VJTlQzMikocmVzX3kxIC0gcmVzX3kwKTsKIAotICAgICAgICBpZiAoKE9QSl9VSU5UMzIpcF9zdGFydF94ID4gbF9pbWFnZS0+eDEgKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJMZWZ0IHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MD0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWHNpej0lZCkuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgcF9zdGFydF94LCBsX2ltYWdlLT54MSk7CisKKyAgICAgICAgLyogQ3VycmVudCB0aWxlIGNvbXBvbmVudCBzaXplKi8KKyAgICAgICAgLyppZiAoaSA9PSAwKSB7CisgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiU1JDOiBsX3Jlc194MD0lZCwgbF9yZXNfeDE9JWQsIGxfcmVzX3kwPSVkLCBsX3Jlc195MT0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc194MCwgcmVzX3gxLCByZXNfeTAsIHJlc195MSk7CisgICAgICAgIH0qLworCisKKyAgICAgICAgLyogQm9yZGVyIG9mIHRoZSBjdXJyZW50IG91dHB1dCBjb21wb25lbnQqLworICAgICAgICBsX3gwX2Rlc3QgPSBvcGpfdWludF9jZWlsZGl2cG93MihsX2ltZ19jb21wX2Rlc3QtPngwLCBsX2ltZ19jb21wX2Rlc3QtPmZhY3Rvcik7CisgICAgICAgIGxfeTBfZGVzdCA9IG9wal91aW50X2NlaWxkaXZwb3cyKGxfaW1nX2NvbXBfZGVzdC0+eTAsIGxfaW1nX2NvbXBfZGVzdC0+ZmFjdG9yKTsKKyAgICAgICAgbF94MV9kZXN0ID0gbF94MF9kZXN0ICsKKyAgICAgICAgICAgICAgICAgICAgbF9pbWdfY29tcF9kZXN0LT53OyAvKiBjYW4ndCBvdmVyZmxvdyBnaXZlbiB0aGF0IGltYWdlLT54MSBpcyB1aW50MzIgKi8KKyAgICAgICAgbF95MV9kZXN0ID0gbF95MF9kZXN0ICsgbF9pbWdfY29tcF9kZXN0LT5oOworCisgICAgICAgIC8qaWYgKGkgPT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIkRFU1Q6IGxfeDBfZGVzdD0lZCwgbF94MV9kZXN0PSVkLCBsX3kwX2Rlc3Q9JWQsIGxfeTFfZGVzdD0lZCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbF94MF9kZXN0LCBsX3gxX2Rlc3QsIGxfeTBfZGVzdCwgbF95MV9kZXN0LCBsX2ltZ19jb21wX2Rlc3QtPmZhY3RvciApOworICAgICAgICB9Ki8KKworICAgICAgICAvKi0tLS0tKi8KKyAgICAgICAgLyogQ29tcHV0ZSB0aGUgYXJlYSAobF9vZmZzZXRfeDBfc3JjLCBsX29mZnNldF95MF9zcmMsIGxfb2Zmc2V0X3gxX3NyYywgbF9vZmZzZXRfeTFfc3JjKQorICAgICAgICAgKiBvZiB0aGUgaW5wdXQgYnVmZmVyIChkZWNvZGVkIHRpbGUgY29tcG9uZW50KSB3aGljaCB3aWxsIGJlIG1vdmUKKyAgICAgICAgICogaW4gdGhlIG91dHB1dCBidWZmZXIuIENvbXB1dGUgdGhlIGFyZWEgb2YgdGhlIG91dHB1dCBidWZmZXIgKGxfc3RhcnRfeF9kZXN0LAorICAgICAgICAgKiBsX3N0YXJ0X3lfZGVzdCwgbF93aWR0aF9kZXN0LCBsX2hlaWdodF9kZXN0KSAgd2hpY2ggd2lsbCBiZSBtb2RpZmllZAorICAgICAgICAgKiBieSB0aGlzIGlucHV0IGFyZWEuCisgICAgICAgICAqICovCisgICAgICAgIGFzc2VydChyZXNfeDAgPj0gMCk7CisgICAgICAgIGFzc2VydChyZXNfeDEgPj0gMCk7CisKKyAgICAgICAgLyogUHJldmVudCBiYWQgY2FzdGluZyB0byB1bnNpZ25lZCB2YWx1ZXMgaW4gdGhlIHN1YnNlcXVlbnQgbGluZXMuICovCisgICAgICAgIGlmICggcmVzX3gwIDwgMCB8fCByZXNfeDEgPCAwIHx8IHJlc195MCA8IDAgfHwgcmVzX3kxIDwgMCApIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAobF94MF9kZXN0IDwgKE9QSl9VSU5UMzIpcmVzX3gwKSB7CisgICAgICAgICAgICBsX3N0YXJ0X3hfZGVzdCA9IChPUEpfVUlOVDMyKXJlc194MCAtIGxfeDBfZGVzdDsKKyAgICAgICAgICAgIGxfb2Zmc2V0X3gwX3NyYyA9IDA7CisKKyAgICAgICAgICAgIGlmIChsX3gxX2Rlc3QgPj0gKE9QSl9VSU5UMzIpcmVzX3gxKSB7CisgICAgICAgICAgICAgICAgbF93aWR0aF9kZXN0ID0gbF93aWR0aF9zcmM7CisgICAgICAgICAgICAgICAgbF9vZmZzZXRfeDFfc3JjID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbF93aWR0aF9kZXN0ID0gbF94MV9kZXN0IC0gKE9QSl9VSU5UMzIpcmVzX3gwIDsKKyAgICAgICAgICAgICAgICBsX29mZnNldF94MV9zcmMgPSAoT1BKX0lOVDMyKShsX3dpZHRoX3NyYyAtIGxfd2lkdGhfZGVzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsX3N0YXJ0X3hfZGVzdCA9IDBVOworICAgICAgICAgICAgbF9vZmZzZXRfeDBfc3JjID0gKE9QSl9JTlQzMilsX3gwX2Rlc3QgLSByZXNfeDA7CisKKyAgICAgICAgICAgIGlmIChsX3gxX2Rlc3QgPj0gKE9QSl9VSU5UMzIpcmVzX3gxKSB7CisgICAgICAgICAgICAgICAgbF93aWR0aF9kZXN0ID0gbF93aWR0aF9zcmMgLSAoT1BKX1VJTlQzMilsX29mZnNldF94MF9zcmM7CisgICAgICAgICAgICAgICAgbF9vZmZzZXRfeDFfc3JjID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbF93aWR0aF9kZXN0ID0gbF9pbWdfY29tcF9kZXN0LT53IDsKKyAgICAgICAgICAgICAgICBsX29mZnNldF94MV9zcmMgPSByZXNfeDEgLSAoT1BKX0lOVDMyKWxfeDFfZGVzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChsX3kwX2Rlc3QgPCAoT1BKX1VJTlQzMilyZXNfeTApIHsKKyAgICAgICAgICAgIGxfc3RhcnRfeV9kZXN0ID0gKE9QSl9VSU5UMzIpcmVzX3kwIC0gbF95MF9kZXN0OworICAgICAgICAgICAgbF9vZmZzZXRfeTBfc3JjID0gMDsKKworICAgICAgICAgICAgaWYgKGxfeTFfZGVzdCA+PSAoT1BKX1VJTlQzMilyZXNfeTEpIHsKKyAgICAgICAgICAgICAgICBsX2hlaWdodF9kZXN0ID0gbF9oZWlnaHRfc3JjOworICAgICAgICAgICAgICAgIGxfb2Zmc2V0X3kxX3NyYyA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxfaGVpZ2h0X2Rlc3QgPSBsX3kxX2Rlc3QgLSAoT1BKX1VJTlQzMilyZXNfeTAgOworICAgICAgICAgICAgICAgIGxfb2Zmc2V0X3kxX3NyYyA9IChPUEpfSU5UMzIpKGxfaGVpZ2h0X3NyYyAtIGxfaGVpZ2h0X2Rlc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbF9zdGFydF95X2Rlc3QgPSAwVTsKKyAgICAgICAgICAgIGxfb2Zmc2V0X3kwX3NyYyA9IChPUEpfSU5UMzIpbF95MF9kZXN0IC0gcmVzX3kwOworCisgICAgICAgICAgICBpZiAobF95MV9kZXN0ID49IChPUEpfVUlOVDMyKXJlc195MSkgeworICAgICAgICAgICAgICAgIGxfaGVpZ2h0X2Rlc3QgPSBsX2hlaWdodF9zcmMgLSAoT1BKX1VJTlQzMilsX29mZnNldF95MF9zcmM7CisgICAgICAgICAgICAgICAgbF9vZmZzZXRfeTFfc3JjID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbF9oZWlnaHRfZGVzdCA9IGxfaW1nX2NvbXBfZGVzdC0+aCA7CisgICAgICAgICAgICAgICAgbF9vZmZzZXRfeTFfc3JjID0gcmVzX3kxIC0gKE9QSl9JTlQzMilsX3kxX2Rlc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGxfb2Zmc2V0X3gwX3NyYyA8IDApIHx8IChsX29mZnNldF95MF9zcmMgPCAwKSB8fCAobF9vZmZzZXRfeDFfc3JjIDwgMCkgfHwKKyAgICAgICAgICAgICAgICAobF9vZmZzZXRfeTFfc3JjIDwgMCkpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgLyogdGVzdGNhc2UgMjk3Ny5wZGYuYXNhbi42Ny4yMTk4ICovCisgICAgICAgIGlmICgoT1BKX0lOVDMyKWxfd2lkdGhfZGVzdCA8IDAgfHwgKE9QSl9JTlQzMilsX2hlaWdodF9kZXN0IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICAvKi0tLS0tKi8KKworICAgICAgICAvKiBDb21wdXRlIHRoZSBpbnB1dCBidWZmZXIgb2Zmc2V0ICovCisgICAgICAgIGxfc3RhcnRfb2Zmc2V0X3NyYyA9IChPUEpfU0laRV9UKWxfb2Zmc2V0X3gwX3NyYyArIChPUEpfU0laRV9UKWxfb2Zmc2V0X3kwX3NyYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChPUEpfU0laRV9UKXNyY19kYXRhX3N0cmlkZTsKKworICAgICAgICAvKiBDb21wdXRlIHRoZSBvdXRwdXQgYnVmZmVyIG9mZnNldCAqLworICAgICAgICBsX3N0YXJ0X29mZnNldF9kZXN0ID0gKE9QSl9TSVpFX1QpbF9zdGFydF94X2Rlc3QgKyAoT1BKX1NJWkVfVClsX3N0YXJ0X3lfZGVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoT1BKX1NJWkVfVClsX2ltZ19jb21wX2Rlc3QtPnc7CisKKyAgICAgICAgLyogQWxsb2NhdGUgb3V0cHV0IGNvbXBvbmVudCBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgIGlmIChsX2ltZ19jb21wX2Rlc3QtPmRhdGEgPT0gTlVMTCAmJgorICAgICAgICAgICAgICAgIGxfc3RhcnRfb2Zmc2V0X3NyYyA9PSAwICYmIGxfc3RhcnRfb2Zmc2V0X2Rlc3QgPT0gMCAmJgorICAgICAgICAgICAgICAgIHNyY19kYXRhX3N0cmlkZSA9PSBsX2ltZ19jb21wX2Rlc3QtPncgJiYKKyAgICAgICAgICAgICAgICBsX3dpZHRoX2Rlc3QgPT0gbF9pbWdfY29tcF9kZXN0LT53ICYmCisgICAgICAgICAgICAgICAgbF9oZWlnaHRfZGVzdCA9PSBsX2ltZ19jb21wX2Rlc3QtPmgpIHsKKyAgICAgICAgICAgIC8qIElmIHRoZSBmaW5hbCBpbWFnZSBtYXRjaGVzIHRoZSB0aWxlIGJ1ZmZlciwgdGhlbiBib3Jyb3cgaXQgKi8KKyAgICAgICAgICAgIC8qIGRpcmVjdGx5IHRvIHNhdmUgYSBjb3B5ICovCisgICAgICAgICAgICBpZiAocF90Y2QtPndob2xlX3RpbGVfZGVjb2RpbmcpIHsKKyAgICAgICAgICAgICAgICBsX2ltZ19jb21wX2Rlc3QtPmRhdGEgPSBsX3RpbGVjLT5kYXRhOworICAgICAgICAgICAgICAgIGxfdGlsZWMtPmRhdGEgPSBOVUxMOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsX2ltZ19jb21wX2Rlc3QtPmRhdGEgPSBsX3RpbGVjLT5kYXRhX3dpbjsKKyAgICAgICAgICAgICAgICBsX3RpbGVjLT5kYXRhX3dpbiA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChsX2ltZ19jb21wX2Rlc3QtPmRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgT1BKX1NJWkVfVCBsX3dpZHRoID0gbF9pbWdfY29tcF9kZXN0LT53OworICAgICAgICAgICAgT1BKX1NJWkVfVCBsX2hlaWdodCA9IGxfaW1nX2NvbXBfZGVzdC0+aDsKKworICAgICAgICAgICAgaWYgKChsX2hlaWdodCA9PSAwVSkgfHwgKGxfd2lkdGggPiAoU0laRV9NQVggLyBsX2hlaWdodCkpIHx8CisgICAgICAgICAgICAgICAgICAgIGxfd2lkdGggKiBsX2hlaWdodCA+IFNJWkVfTUFYIC8gc2l6ZW9mKE9QSl9JTlQzMikpIHsKKyAgICAgICAgICAgICAgICAvKiB3b3VsZCBvdmVyZmxvdyAqLwogICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKE9QSl9VSU5UMzIpcF9zdGFydF94IDwgbF9pbWFnZS0+eDApewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxlZnQgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3gwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChYT3Npej0lZCkuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3N0YXJ0X3gsIGxfaW1hZ2UtPngwKTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3ggPSAwOwotICAgICAgICAgICAgICAgIHBfaW1hZ2UtPngwID0gbF9pbWFnZS0+eDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhcnRfdGlsZV94ID0gKChPUEpfVUlOVDMyKXBfc3RhcnRfeCAtIGxfY3AtPnR4MCkgLyBsX2NwLT50ZHg7Ci0gICAgICAgICAgICAgICAgcF9pbWFnZS0+eDAgPSAoT1BKX1VJTlQzMilwX3N0YXJ0X3g7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBVcCAqLwotICAgICAgICBpZiAoKE9QSl9VSU5UMzIpcF9zdGFydF95ID4gbF9pbWFnZS0+eTEpewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVcCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTA9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFlzaXo9JWQpLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zdGFydF95LCBsX2ltYWdlLT55MSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsX2ltZ19jb21wX2Rlc3QtPmRhdGEgPSAoT1BKX0lOVDMyKikgb3BqX2ltYWdlX2RhdGFfYWxsb2MobF93aWR0aCAqIGxfaGVpZ2h0ICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihPUEpfSU5UMzIpKTsKKyAgICAgICAgICAgIGlmICghIGxfaW1nX2NvbXBfZGVzdC0+ZGF0YSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKE9QSl9VSU5UMzIpcF9zdGFydF95IDwgbF9pbWFnZS0+eTApewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVwIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MD0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWU9zaXo9JWQpLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zdGFydF95LCBsX2ltYWdlLT55MCk7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhcnRfdGlsZV95ID0gMDsKLSAgICAgICAgICAgICAgICBwX2ltYWdlLT55MCA9IGxfaW1hZ2UtPnkwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXJ0X3RpbGVfeSA9ICgoT1BKX1VJTlQzMilwX3N0YXJ0X3kgLSBsX2NwLT50eTApIC8gbF9jcC0+dGR5OwotICAgICAgICAgICAgICAgIHBfaW1hZ2UtPnkwID0gKE9QSl9VSU5UMzIpcF9zdGFydF95OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobF9pbWdfY29tcF9kZXN0LT53ICE9IGxfd2lkdGhfZGVzdCB8fAorICAgICAgICAgICAgICAgICAgICBsX2ltZ19jb21wX2Rlc3QtPmggIT0gbF9oZWlnaHRfZGVzdCkgeworICAgICAgICAgICAgICAgIG1lbXNldChsX2ltZ19jb21wX2Rlc3QtPmRhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgIChPUEpfU0laRV9UKWxfaW1nX2NvbXBfZGVzdC0+dyAqIGxfaW1nX2NvbXBfZGVzdC0+aCAqIHNpemVvZihPUEpfSU5UMzIpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8qIFJpZ2h0ICovCi0gICAgICAgIGFzc2VydCgoT1BKX1VJTlQzMilwX2VuZF94ID4gMCk7Ci0gICAgICAgIGFzc2VydCgoT1BKX1VJTlQzMilwX2VuZF95ID4gMCk7Ci0gICAgICAgIGlmICgoT1BKX1VJTlQzMilwX2VuZF94IDwgbF9pbWFnZS0+eDApIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgIlJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MT0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWE9zaXo9JWQpLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfZW5kX3gsIGxfaW1hZ2UtPngwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChPUEpfVUlOVDMyKXBfZW5kX3ggPiBsX2ltYWdlLT54MSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKLSAgICAgICAgICAgICAgICAgICAgICAgICJSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhzaXo9JWQpLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfZW5kX3gsIGxfaW1hZ2UtPngxKTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV94ID0gbF9jcC0+dHc7Ci0gICAgICAgICAgICAgICAgcF9pbWFnZS0+eDEgPSBsX2ltYWdlLT54MTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV94ID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KHBfZW5kX3ggLSAoT1BKX0lOVDMyKWxfY3AtPnR4MCwgKE9QSl9JTlQzMilsX2NwLT50ZHgpOwotICAgICAgICAgICAgICAgIHBfaW1hZ2UtPngxID0gKE9QSl9VSU5UMzIpcF9lbmRfeDsKLSAgICAgICAgfQorICAgICAgICAvKiBNb3ZlIHRoZSBvdXRwdXQgYnVmZmVyIHRvIHRoZSBmaXJzdCBwbGFjZSB3aGVyZSB3ZSB3aWxsIHdyaXRlKi8KKyAgICAgICAgbF9kZXN0X3B0ciA9IGxfaW1nX2NvbXBfZGVzdC0+ZGF0YSArIGxfc3RhcnRfb2Zmc2V0X2Rlc3Q7CiAKLSAgICAgICAgLyogQm90dG9tICovCi0gICAgICAgIGlmICgoT1BKX1VJTlQzMilwX2VuZF95IDwgbF9pbWFnZS0+eTApIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgIkJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTE9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFlPc2l6PSVkKS5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2VuZF95LCBsX2ltYWdlLT55MCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoKE9QSl9VSU5UMzIpcF9lbmRfeSA+IGxfaW1hZ2UtPnkxKXsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MT0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWXNpej0lZCkuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgcF9lbmRfeSwgbF9pbWFnZS0+eTEpOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3kgPSBsX2NwLT50aDsKLSAgICAgICAgICAgICAgICBwX2ltYWdlLT55MSA9IGxfaW1hZ2UtPnkxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeSA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdihwX2VuZF95IC0gKE9QSl9JTlQzMilsX2NwLT50eTAsIChPUEpfSU5UMzIpbF9jcC0+dGR5KTsKLSAgICAgICAgICAgICAgICBwX2ltYWdlLT55MSA9IChPUEpfVUlOVDMyKXBfZW5kX3k7Ci0gICAgICAgIH0KLSAgICAgICAgLyogLS0tLS0gKi8KLQotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kaXNjYXJkX3RpbGVzID0gMTsKLQotICAgICAgICBsX2ltZ19jb21wID0gcF9pbWFnZS0+Y29tcHM7Ci0gICAgICAgIGZvciAoaXRfY29tcD0wOyBpdF9jb21wIDwgcF9pbWFnZS0+bnVtY29tcHM7ICsraXRfY29tcCkKICAgICAgICAgewotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBsX2gsbF93OworICAgICAgICAgICAgY29uc3QgT1BKX0lOVDMyICogbF9zcmNfcHRyID0gcF9zcmNfZGF0YTsKKyAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0YXJ0X29mZnNldF9zcmM7CiAKLSAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT54MCA9IG9wal91aW50X2NlaWxkaXYocF9pbWFnZS0+eDAsIGxfaW1nX2NvbXAtPmR4KTsKLSAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT55MCA9IG9wal91aW50X2NlaWxkaXYocF9pbWFnZS0+eTAsIGxfaW1nX2NvbXAtPmR5KTsKLSAgICAgICAgICAgICAgICBsX2NvbXBfeDEgPSBvcGpfaW50X2NlaWxkaXYoKE9QSl9JTlQzMilwX2ltYWdlLT54MSwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keCk7Ci0gICAgICAgICAgICAgICAgbF9jb21wX3kxID0gb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpcF9pbWFnZS0+eTEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHkpOwotCi0gICAgICAgICAgICAgICAgbF93ID0gb3BqX2ludF9jZWlsZGl2cG93MihsX2NvbXBfeDEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZmFjdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG9wal9pbnRfY2VpbGRpdnBvdzIoKE9QSl9JTlQzMilsX2ltZ19jb21wLT54MCwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5mYWN0b3IpOwotICAgICAgICAgICAgICAgIGlmIChsX3cgPCAwKXsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaXplIHggb2YgdGhlIGRlY29kZWQgY29tcG9uZW50IGltYWdlIGlzIGluY29ycmVjdCAoY29tcFslZF0udz0lZCkuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdF9jb21wLCBsX3cpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbF9pbWdfY29tcC0+dyA9IChPUEpfVUlOVDMyKWxfdzsKLQotICAgICAgICAgICAgICAgIGxfaCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF9jb21wX3kxLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmZhY3RvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBvcGpfaW50X2NlaWxkaXZwb3cyKChPUEpfSU5UMzIpbF9pbWdfY29tcC0+eTAsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZmFjdG9yKTsKLSAgICAgICAgICAgICAgICBpZiAobF9oIDwgMCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2l6ZSB5IG9mIHRoZSBkZWNvZGVkIGNvbXBvbmVudCBpbWFnZSBpcyBpbmNvcnJlY3QgKGNvbXBbJWRdLmg9JWQpLlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfY29tcCwgbF9oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPmggPSAoT1BKX1VJTlQzMilsX2g7Ci0KLSAgICAgICAgICAgICAgICBsX2ltZ19jb21wKys7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbF9oZWlnaHRfZGVzdDsgKytqKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGxfZGVzdF9wdHIsIGxfc3JjX3B0ciwgbF93aWR0aF9kZXN0ICogc2l6ZW9mKE9QSl9JTlQzMikpOworICAgICAgICAgICAgICAgIGxfZGVzdF9wdHIgKz0gbF9pbWdfY29tcF9kZXN0LT53OworICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBzcmNfZGF0YV9zdHJpZGU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBvcGpfZXZlbnRfbXNnKCBwX21hbmFnZXIsIEVWVF9JTkZPLCJTZXR0aW5nIGRlY29kaW5nIGFyZWEgdG8gJWQsJWQsJWQsJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwX2ltYWdlLT54MCwgcF9pbWFnZS0+eTAsIHBfaW1hZ2UtPngxLCBwX2ltYWdlLT55MSk7CiAKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIH0KKworICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfdXBkYXRlX2ltYWdlX2RpbWVuc2lvbnMob3BqX2ltYWdlX3QqIHBfaW1hZ2UsCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKK3sKKyAgICBPUEpfVUlOVDMyIGl0X2NvbXA7CisgICAgT1BKX0lOVDMyIGxfY29tcF94MSwgbF9jb21wX3kxOworICAgIG9wal9pbWFnZV9jb21wX3QqIGxfaW1nX2NvbXAgPSBOVUxMOworCisgICAgbF9pbWdfY29tcCA9IHBfaW1hZ2UtPmNvbXBzOworICAgIGZvciAoaXRfY29tcCA9IDA7IGl0X2NvbXAgPCBwX2ltYWdlLT5udW1jb21wczsgKytpdF9jb21wKSB7CisgICAgICAgIGxfaW1nX2NvbXAtPngwID0gb3BqX3VpbnRfY2VpbGRpdihwX2ltYWdlLT54MCwgbF9pbWdfY29tcC0+ZHgpOworICAgICAgICBsX2ltZ19jb21wLT55MCA9IG9wal91aW50X2NlaWxkaXYocF9pbWFnZS0+eTAsIGxfaW1nX2NvbXAtPmR5KTsKKyAgICAgICAgbF9jb21wX3gxID0gb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpcF9pbWFnZS0+eDEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHgpOworICAgICAgICBsX2NvbXBfeTEgPSBvcGpfaW50X2NlaWxkaXYoKE9QSl9JTlQzMilwX2ltYWdlLT55MSwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keSk7CisKKyAgICAgICAgT1BKX0lOVDMyIGxfMSA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF9jb21wX3gxLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmZhY3Rvcik7CisgICAgICAgIE9QSl9JTlQzMiBsXzIgPSBvcGpfaW50X2NlaWxkaXZwb3cyKChPUEpfSU5UMzIpbF9pbWdfY29tcC0+eDAsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZmFjdG9yKTsKKyAgICAgICAgaWYgKGxfMSA8IGxfMikgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpemUgeCBvZiB0aGUgZGVjb2RlZCBjb21wb25lbnQgaW1hZ2UgaXMgaW5jb3JyZWN0IChjb21wWyVkXS53PDApLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfY29tcCk7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGxfaW1nX2NvbXAtPncgPSAoT1BKX1VJTlQzMikobF8xLWxfMik7CisKKyAgICAgICAgbF8xID0gb3BqX2ludF9jZWlsZGl2cG93MihsX2NvbXBfeTEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZmFjdG9yKTsKKyAgICAgICAgbF8yID0gb3BqX2ludF9jZWlsZGl2cG93MigoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPnkwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmZhY3Rvcik7CisgICAgICAgIGlmIChsXzEgPCBsXzIpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJTaXplIHkgb2YgdGhlIGRlY29kZWQgY29tcG9uZW50IGltYWdlIGlzIGluY29ycmVjdCAoY29tcFslZF0uaDwwKS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X2NvbXApOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBsX2ltZ19jb21wLT5oID0gKE9QSl9VSU5UMzIpKGxfMS1sXzIpOworCisgICAgICAgIGxfaW1nX2NvbXArKzsKKyAgICB9CisKKyAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK09QSl9CT09MIG9wal9qMmtfc2V0X2RlY29kZWRfY29tcG9uZW50cyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbnVtY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1BKX1VJTlQzMiogY29tcHNfaW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCit7CisgICAgT1BKX1VJTlQzMiBpOworICAgIE9QSl9CT09MKiBhbHJlYWR5X21hcHBlZDsKKworICAgIGlmIChwX2oyay0+bV9wcml2YXRlX2ltYWdlID09IE5VTEwpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAib3BqX3JlYWRfaGVhZGVyKCkgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgIgorICAgICAgICAgICAgICAgICAgICAgICJvcGpfc2V0X2RlY29kZWRfY29tcG9uZW50cygpLlxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgYWxyZWFkeV9tYXBwZWQgPSAoT1BKX0JPT0wqKSBvcGpfY2FsbG9jKHNpemVvZihPUEpfQk9PTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzKTsKKyAgICBpZiAoYWxyZWFkeV9tYXBwZWQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1jb21wczsgaSsrKSB7CisgICAgICAgIGlmIChjb21wc19pbmRpY2VzW2ldID49IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBjb21wb25lbnQgaW5kZXg6ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wc19pbmRpY2VzW2ldKTsKKyAgICAgICAgICAgIG9wal9mcmVlKGFscmVhZHlfbWFwcGVkKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFscmVhZHlfbWFwcGVkW2NvbXBzX2luZGljZXNbaV1dKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcG9uZW50IGluZGV4ICV1IHVzZWQgc2V2ZXJhbCB0aW1lc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHNfaW5kaWNlc1tpXSk7CisgICAgICAgICAgICBvcGpfZnJlZShhbHJlYWR5X21hcHBlZCk7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGFscmVhZHlfbWFwcGVkW2NvbXBzX2luZGljZXNbaV1dID0gT1BKX1RSVUU7CisgICAgfQorICAgIG9wal9mcmVlKGFscmVhZHlfbWFwcGVkKTsKKworICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2NvbXBzX2luZGljZXNfdG9fZGVjb2RlKTsKKyAgICBpZiAobnVtY29tcHMpIHsKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fY29tcHNfaW5kaWNlc190b19kZWNvZGUgPQorICAgICAgICAgICAgKE9QSl9VSU5UMzIqKSBvcGpfbWFsbG9jKG51bWNvbXBzICogc2l6ZW9mKE9QSl9VSU5UMzIpKTsKKyAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2NvbXBzX2luZGljZXNfdG9fZGVjb2RlID09IE5VTEwpIHsKKyAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX251bWNvbXBzX3RvX2RlY29kZSA9IDA7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIG1lbWNweShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9jb21wc19pbmRpY2VzX3RvX2RlY29kZSwKKyAgICAgICAgICAgICAgIGNvbXBzX2luZGljZXMsCisgICAgICAgICAgICAgICBudW1jb21wcyAqIHNpemVvZihPUEpfVUlOVDMyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fY29tcHNfaW5kaWNlc190b19kZWNvZGUgPSBOVUxMOworICAgIH0KKyAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9udW1jb21wc190b19kZWNvZGUgPSBudW1jb21wczsKKworICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworCitPUEpfQk9PTCBvcGpfajJrX3NldF9kZWNvZGVfYXJlYShvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QqIHBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF9zdGFydF94LCBPUEpfSU5UMzIgcF9zdGFydF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfZW5kX3gsIE9QSl9JTlQzMiBwX2VuZF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQoreworICAgIG9wal9jcF90ICogbF9jcCA9ICYocF9qMmstPm1fY3ApOworICAgIG9wal9pbWFnZV90ICogbF9pbWFnZSA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2U7CisgICAgT1BKX0JPT0wgcmV0OworICAgIE9QSl9VSU5UMzIgaXRfY29tcDsKKworICAgIGlmIChwX2oyay0+bV9jcC50dyA9PSAxICYmIHBfajJrLT5tX2NwLnRoID09IDEgJiYKKyAgICAgICAgICAgIHBfajJrLT5tX2NwLnRjcHNbMF0ubV9kYXRhICE9IE5VTEwpIHsKKyAgICAgICAgLyogSW4gdGhlIGNhc2Ugb2YgYSBzaW5nbGUtdGlsZWQgaW1hZ2Ugd2hvc2UgY29kZXN0cmVhbSB3ZSBoYXZlIGFscmVhZHkgKi8KKyAgICAgICAgLyogaW5nZXN0ZWQsIGdvIG9uICovCisgICAgfQorICAgIC8qIENoZWNrIGlmIHdlIGFyZSByZWFkIHRoZSBtYWluIGhlYWRlciAqLworICAgIGVsc2UgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlICE9IEoyS19TVEFURV9UUEhTT1QpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiTmVlZCB0byBkZWNvZGUgdGhlIG1haW4gaGVhZGVyIGJlZm9yZSBiZWdpbiB0byBkZWNvZGUgdGhlIHJlbWFpbmluZyBjb2Rlc3RyZWFtLlxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgLyogVXBkYXRlIHRoZSBjb21wc1tdLmZhY3RvciBtZW1iZXIgb2YgdGhlIG91dHB1dCBpbWFnZSB3aXRoIHRoZSBvbmUgKi8KKyAgICAvKiBvZiBtX3JlZHVjZSAqLworICAgIGZvciAoaXRfY29tcCA9IDA7IGl0X2NvbXAgPCBwX2ltYWdlLT5udW1jb21wczsgKytpdF9jb21wKSB7CisgICAgICAgIHBfaW1hZ2UtPmNvbXBzW2l0X2NvbXBdLmZhY3RvciA9IHBfajJrLT5tX2NwLm1fc3BlY2lmaWNfcGFyYW0ubV9kZWMubV9yZWR1Y2U7CisgICAgfQorCisgICAgaWYgKCFwX3N0YXJ0X3ggJiYgIXBfc3RhcnRfeSAmJiAhcF9lbmRfeCAmJiAhcF9lbmRfeSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgIk5vIGRlY29kZWQgYXJlYSBwYXJhbWV0ZXJzLCBzZXQgdGhlIGRlY29kZWQgYXJlYSB0byB0aGUgd2hvbGUgaW1hZ2VcbiIpOworCisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXJ0X3RpbGVfeCA9IDA7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXJ0X3RpbGVfeSA9IDA7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3ggPSBsX2NwLT50dzsKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeSA9IGxfY3AtPnRoOworCisgICAgICAgIHBfaW1hZ2UtPngwID0gbF9pbWFnZS0+eDA7CisgICAgICAgIHBfaW1hZ2UtPnkwID0gbF9pbWFnZS0+eTA7CisgICAgICAgIHBfaW1hZ2UtPngxID0gbF9pbWFnZS0+eDE7CisgICAgICAgIHBfaW1hZ2UtPnkxID0gbF9pbWFnZS0+eTE7CisKKyAgICAgICAgcmV0dXJuIG9wal9qMmtfdXBkYXRlX2ltYWdlX2RpbWVuc2lvbnMocF9pbWFnZSwgcF9tYW5hZ2VyKTsKKyAgICB9CisKKyAgICAvKiAtLS0tLSAqLworICAgIC8qIENoZWNrIGlmIHRoZSBwb3NpdGlvbnMgcHJvdmlkZWQgYnkgdGhlIHVzZXIgYXJlIGNvcnJlY3QgKi8KKworICAgIC8qIExlZnQgKi8KKyAgICBpZiAocF9zdGFydF94IDwgMCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJMZWZ0IHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MD0lZCkgc2hvdWxkIGJlID49IDAuXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHBfc3RhcnRfeCk7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfSBlbHNlIGlmICgoT1BKX1VJTlQzMilwX3N0YXJ0X3ggPiBsX2ltYWdlLT54MSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJMZWZ0IHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MD0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWHNpej0lZCkuXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHBfc3RhcnRfeCwgbF9pbWFnZS0+eDEpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0gZWxzZSBpZiAoKE9QSl9VSU5UMzIpcF9zdGFydF94IDwgbF9pbWFnZS0+eDApIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICJMZWZ0IHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MD0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWE9zaXo9JWQpLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBwX3N0YXJ0X3gsIGxfaW1hZ2UtPngwKTsKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhcnRfdGlsZV94ID0gMDsKKyAgICAgICAgcF9pbWFnZS0+eDAgPSBsX2ltYWdlLT54MDsKKyAgICB9IGVsc2UgeworICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3ggPSAoKE9QSl9VSU5UMzIpcF9zdGFydF94IC0KKyAgICAgICAgICAgICAgICBsX2NwLT50eDApIC8gbF9jcC0+dGR4OworICAgICAgICBwX2ltYWdlLT54MCA9IChPUEpfVUlOVDMyKXBfc3RhcnRfeDsKKyAgICB9CisKKyAgICAvKiBVcCAqLworICAgIGlmIChwX3N0YXJ0X3kgPCAwKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIlVwIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MD0lZCkgc2hvdWxkIGJlID49IDAuXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHBfc3RhcnRfeSk7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfSBlbHNlIGlmICgoT1BKX1VJTlQzMilwX3N0YXJ0X3kgPiBsX2ltYWdlLT55MSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJVcCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feTA9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFlzaXo9JWQpLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBwX3N0YXJ0X3ksIGxfaW1hZ2UtPnkxKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9IGVsc2UgaWYgKChPUEpfVUlOVDMyKXBfc3RhcnRfeSA8IGxfaW1hZ2UtPnkwKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAiVXAgcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kwPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZT3Npej0lZCkuXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHBfc3RhcnRfeSwgbF9pbWFnZS0+eTApOworICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGFydF90aWxlX3kgPSAwOworICAgICAgICBwX2ltYWdlLT55MCA9IGxfaW1hZ2UtPnkwOworICAgIH0gZWxzZSB7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXJ0X3RpbGVfeSA9ICgoT1BKX1VJTlQzMilwX3N0YXJ0X3kgLQorICAgICAgICAgICAgICAgIGxfY3AtPnR5MCkgLyBsX2NwLT50ZHk7CisgICAgICAgIHBfaW1hZ2UtPnkwID0gKE9QSl9VSU5UMzIpcF9zdGFydF95OworICAgIH0KKworICAgIC8qIFJpZ2h0ICovCisgICAgaWYgKHBfZW5kX3ggPD0gMCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIHNob3VsZCBiZSA+IDAuXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHBfZW5kX3gpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0gZWxzZSBpZiAoKE9QSl9VSU5UMzIpcF9lbmRfeCA8IGxfaW1hZ2UtPngwKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIlJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl94MT0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWE9zaXo9JWQpLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBwX2VuZF94LCBsX2ltYWdlLT54MCk7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfSBlbHNlIGlmICgoT1BKX1VJTlQzMilwX2VuZF94ID4gbF9pbWFnZS0+eDEpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICJSaWdodCBwb3NpdGlvbiBvZiB0aGUgZGVjb2RlZCBhcmVhIChyZWdpb25feDE9JWQpIGlzIG91dHNpZGUgdGhlIGltYWdlIGFyZWEgKFhzaXo9JWQpLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBwX2VuZF94LCBsX2ltYWdlLT54MSk7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2VuZF90aWxlX3ggPSBsX2NwLT50dzsKKyAgICAgICAgcF9pbWFnZS0+eDEgPSBsX2ltYWdlLT54MTsKKyAgICB9IGVsc2UgeworICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV94ID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KAorICAgICAgICAgICAgICAgICAgICBwX2VuZF94IC0gKE9QSl9JTlQzMilsX2NwLT50eDAsIChPUEpfSU5UMzIpbF9jcC0+dGR4KTsKKyAgICAgICAgcF9pbWFnZS0+eDEgPSAoT1BKX1VJTlQzMilwX2VuZF94OworICAgIH0KKworICAgIC8qIEJvdHRvbSAqLworICAgIGlmIChwX2VuZF95IDw9IDApIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MT0lZCkgc2hvdWxkIGJlID4gMC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgcF9lbmRfeSk7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfSBlbHNlIGlmICgoT1BKX1VJTlQzMilwX2VuZF95IDwgbF9pbWFnZS0+eTApIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiQm90dG9tIHBvc2l0aW9uIG9mIHRoZSBkZWNvZGVkIGFyZWEgKHJlZ2lvbl95MT0lZCkgaXMgb3V0c2lkZSB0aGUgaW1hZ2UgYXJlYSAoWU9zaXo9JWQpLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBwX2VuZF95LCBsX2ltYWdlLT55MCk7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGlmICgoT1BKX1VJTlQzMilwX2VuZF95ID4gbF9pbWFnZS0+eTEpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICJCb3R0b20gcG9zaXRpb24gb2YgdGhlIGRlY29kZWQgYXJlYSAocmVnaW9uX3kxPSVkKSBpcyBvdXRzaWRlIHRoZSBpbWFnZSBhcmVhIChZc2l6PSVkKS5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgcF9lbmRfeSwgbF9pbWFnZS0+eTEpOworICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9lbmRfdGlsZV95ID0gbF9jcC0+dGg7CisgICAgICAgIHBfaW1hZ2UtPnkxID0gbF9pbWFnZS0+eTE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZW5kX3RpbGVfeSA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigKKyAgICAgICAgICAgICAgICAgICAgcF9lbmRfeSAtIChPUEpfSU5UMzIpbF9jcC0+dHkwLCAoT1BKX0lOVDMyKWxfY3AtPnRkeSk7CisgICAgICAgIHBfaW1hZ2UtPnkxID0gKE9QSl9VSU5UMzIpcF9lbmRfeTsKKyAgICB9CisgICAgLyogLS0tLS0gKi8KKworICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2Rpc2NhcmRfdGlsZXMgPSAxOworCisgICAgcmV0ID0gb3BqX2oya191cGRhdGVfaW1hZ2VfZGltZW5zaW9ucyhwX2ltYWdlLCBwX21hbmFnZXIpOworCisgICAgaWYgKHJldCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0lORk8sICJTZXR0aW5nIGRlY29kaW5nIGFyZWEgdG8gJWQsJWQsJWQsJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcF9pbWFnZS0+eDAsIHBfaW1hZ2UtPnkwLCBwX2ltYWdlLT54MSwgcF9pbWFnZS0+eTEpOworICAgIH0KKworICAgIHJldHVybiByZXQ7CiB9CiAKIG9wal9qMmtfdCogb3BqX2oya19jcmVhdGVfZGVjb21wcmVzcyh2b2lkKQogewotICAgICAgICBvcGpfajJrX3QgKmxfajJrID0gKG9wal9qMmtfdCopIG9wal9jYWxsb2MoMSxzaXplb2Yob3BqX2oya190KSk7Ci0gICAgICAgIGlmICghbF9qMmspIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDA7Ci0gICAgICAgIH0KKyAgICBvcGpfajJrX3QgKmxfajJrID0gKG9wal9qMmtfdCopIG9wal9jYWxsb2MoMSwgc2l6ZW9mKG9wal9qMmtfdCkpOworICAgIGlmICghbF9qMmspIHsKKyAgICAgICAgcmV0dXJuIDAwOworICAgIH0KIAotICAgICAgICBsX2oyay0+bV9pc19kZWNvZGVyID0gMTsKLSAgICAgICAgbF9qMmstPm1fY3AubV9pc19kZWNvZGVyID0gMTsKKyAgICBsX2oyay0+bV9pc19kZWNvZGVyID0gMTsKKyAgICBsX2oyay0+bV9jcC5tX2lzX2RlY29kZXIgPSAxOworICAgIC8qIGluIHRoZSBhYnNlbmNlIG9mIEpQMiBib3hlcywgY29uc2lkZXIgZGlmZmVyZW50IGJpdCBkZXB0aCAvIHNpZ24gKi8KKyAgICAvKiBwZXIgY29tcG9uZW50IGlzIGFsbG93ZWQgKi8KKyAgICBsX2oyay0+bV9jcC5hbGxvd19kaWZmZXJlbnRfYml0X2RlcHRoX3NpZ24gPSAxOwogCiAjaWZkZWYgT1BKX0RJU0FCTEVfVFBTT1RfRklYCi0gICAgICAgIGxfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX25iX3RpbGVfcGFydHNfY29ycmVjdGlvbl9jaGVja2VkID0gMTsKKyAgICBsX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9uYl90aWxlX3BhcnRzX2NvcnJlY3Rpb25fY2hlY2tlZCA9IDE7CiAjZW5kaWYKIAotICAgICAgICBsX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcCA9IChvcGpfdGNwX3QqKSBvcGpfY2FsbG9jKDEsc2l6ZW9mKG9wal90Y3BfdCkpOwotICAgICAgICBpZiAoIWxfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2oya19kZXN0cm95KGxfajJrKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDA7Ci0gICAgICAgIH0KKyAgICBsX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcCA9IChvcGpfdGNwX3QqKSBvcGpfY2FsbG9jKDEsCisgICAgICAgICAgICBzaXplb2Yob3BqX3RjcF90KSk7CisgICAgaWYgKCFsX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcCkgeworICAgICAgICBvcGpfajJrX2Rlc3Ryb3kobF9qMmspOworICAgICAgICByZXR1cm4gMDA7CisgICAgfQogCi0gICAgICAgIGxfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhID0gKE9QSl9CWVRFICopIG9wal9jYWxsb2MoMSxPUEpfSjJLX0RFRkFVTFRfSEVBREVSX1NJWkUpOwotICAgICAgICBpZiAoISBsX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSkgewotICAgICAgICAgICAgICAgIG9wal9qMmtfZGVzdHJveShsX2oyayk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDAwOwotICAgICAgICB9CisgICAgbF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX2NhbGxvYygxLAorICAgICAgICAgICAgT1BKX0oyS19ERUZBVUxUX0hFQURFUl9TSVpFKTsKKyAgICBpZiAoISBsX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9oZWFkZXJfZGF0YSkgeworICAgICAgICBvcGpfajJrX2Rlc3Ryb3kobF9qMmspOworICAgICAgICByZXR1cm4gMDA7CisgICAgfQogCi0gICAgICAgIGxfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2hlYWRlcl9kYXRhX3NpemUgPSBPUEpfSjJLX0RFRkFVTFRfSEVBREVSX1NJWkU7CisgICAgbF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1faGVhZGVyX2RhdGFfc2l6ZSA9CisgICAgICAgIE9QSl9KMktfREVGQVVMVF9IRUFERVJfU0laRTsKIAotICAgICAgICBsX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV90aWxlX2luZF90b19kZWMgPSAtMSA7CisgICAgbF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fdGlsZV9pbmRfdG9fZGVjID0gLTEgOwogCi0gICAgICAgIGxfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2xhc3Rfc290X3JlYWRfcG9zID0gMCA7CisgICAgbF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fbGFzdF9zb3RfcmVhZF9wb3MgPSAwIDsKIAotICAgICAgICAvKiBjb2Rlc3RyZWFtIGluZGV4IGNyZWF0aW9uICovCi0gICAgICAgIGxfajJrLT5jc3RyX2luZGV4ID0gb3BqX2oya19jcmVhdGVfY3N0cl9pbmRleCgpOwotICAgICAgICBpZiAoIWxfajJrLT5jc3RyX2luZGV4KXsKLSAgICAgICAgICAgICAgICBvcGpfajJrX2Rlc3Ryb3kobF9qMmspOwotICAgICAgICAgICAgICAgIHJldHVybiAwMDsKLSAgICAgICAgfQorICAgIC8qIGNvZGVzdHJlYW0gaW5kZXggY3JlYXRpb24gKi8KKyAgICBsX2oyay0+Y3N0cl9pbmRleCA9IG9wal9qMmtfY3JlYXRlX2NzdHJfaW5kZXgoKTsKKyAgICBpZiAoIWxfajJrLT5jc3RyX2luZGV4KSB7CisgICAgICAgIG9wal9qMmtfZGVzdHJveShsX2oyayk7CisgICAgICAgIHJldHVybiAwMDsKKyAgICB9CiAKLSAgICAgICAgLyogdmFsaWRhdGlvbiBsaXN0IGNyZWF0aW9uICovCi0gICAgICAgIGxfajJrLT5tX3ZhbGlkYXRpb25fbGlzdCA9IG9wal9wcm9jZWR1cmVfbGlzdF9jcmVhdGUoKTsKLSAgICAgICAgaWYgKCEgbF9qMmstPm1fdmFsaWRhdGlvbl9saXN0KSB7Ci0gICAgICAgICAgICAgICAgb3BqX2oya19kZXN0cm95KGxfajJrKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDA7Ci0gICAgICAgIH0KKyAgICAvKiB2YWxpZGF0aW9uIGxpc3QgY3JlYXRpb24gKi8KKyAgICBsX2oyay0+bV92YWxpZGF0aW9uX2xpc3QgPSBvcGpfcHJvY2VkdXJlX2xpc3RfY3JlYXRlKCk7CisgICAgaWYgKCEgbF9qMmstPm1fdmFsaWRhdGlvbl9saXN0KSB7CisgICAgICAgIG9wal9qMmtfZGVzdHJveShsX2oyayk7CisgICAgICAgIHJldHVybiAwMDsKKyAgICB9CiAKLSAgICAgICAgLyogZXhlY3V0aW9uIGxpc3QgY3JlYXRpb24gKi8KLSAgICAgICAgbF9qMmstPm1fcHJvY2VkdXJlX2xpc3QgPSBvcGpfcHJvY2VkdXJlX2xpc3RfY3JlYXRlKCk7Ci0gICAgICAgIGlmICghIGxfajJrLT5tX3Byb2NlZHVyZV9saXN0KSB7Ci0gICAgICAgICAgICAgICAgb3BqX2oya19kZXN0cm95KGxfajJrKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDA7Ci0gICAgICAgIH0KKyAgICAvKiBleGVjdXRpb24gbGlzdCBjcmVhdGlvbiAqLworICAgIGxfajJrLT5tX3Byb2NlZHVyZV9saXN0ID0gb3BqX3Byb2NlZHVyZV9saXN0X2NyZWF0ZSgpOworICAgIGlmICghIGxfajJrLT5tX3Byb2NlZHVyZV9saXN0KSB7CisgICAgICAgIG9wal9qMmtfZGVzdHJveShsX2oyayk7CisgICAgICAgIHJldHVybiAwMDsKKyAgICB9CiAKLSAgICAgICAgcmV0dXJuIGxfajJrOworICAgIGxfajJrLT5tX3RwID0gb3BqX3RocmVhZF9wb29sX2NyZWF0ZShvcGpfajJrX2dldF9kZWZhdWx0X3RocmVhZF9jb3VudCgpKTsKKyAgICBpZiAoIWxfajJrLT5tX3RwKSB7CisgICAgICAgIGxfajJrLT5tX3RwID0gb3BqX3RocmVhZF9wb29sX2NyZWF0ZSgwKTsKKyAgICB9CisgICAgaWYgKCFsX2oyay0+bV90cCkgeworICAgICAgICBvcGpfajJrX2Rlc3Ryb3kobF9qMmspOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbF9qMms7CiB9CiAKIHN0YXRpYyBvcGpfY29kZXN0cmVhbV9pbmRleF90KiBvcGpfajJrX2NyZWF0ZV9jc3RyX2luZGV4KHZvaWQpCiB7Ci0gICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZGV4X3QqIGNzdHJfaW5kZXggPSAob3BqX2NvZGVzdHJlYW1faW5kZXhfdCopCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfY2FsbG9jKDEsc2l6ZW9mKG9wal9jb2Rlc3RyZWFtX2luZGV4X3QpKTsKLSAgICAgICAgaWYgKCFjc3RyX2luZGV4KQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIG9wal9jb2Rlc3RyZWFtX2luZGV4X3QqIGNzdHJfaW5kZXggPSAob3BqX2NvZGVzdHJlYW1faW5kZXhfdCopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jYWxsb2MoMSwgc2l6ZW9mKG9wal9jb2Rlc3RyZWFtX2luZGV4X3QpKTsKKyAgICBpZiAoIWNzdHJfaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0gICAgICAgIGNzdHJfaW5kZXgtPm1heG1hcmtudW0gPSAxMDA7Ci0gICAgICAgIGNzdHJfaW5kZXgtPm1hcmtudW0gPSAwOwotICAgICAgICBjc3RyX2luZGV4LT5tYXJrZXIgPSAob3BqX21hcmtlcl9pbmZvX3QqKQotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NhbGxvYyhjc3RyX2luZGV4LT5tYXhtYXJrbnVtLCBzaXplb2Yob3BqX21hcmtlcl9pbmZvX3QpKTsKLSAgICAgICAgaWYgKCFjc3RyX2luZGV4LT4gbWFya2VyKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2ZyZWUoY3N0cl9pbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KKyAgICBjc3RyX2luZGV4LT5tYXhtYXJrbnVtID0gMTAwOworICAgIGNzdHJfaW5kZXgtPm1hcmtudW0gPSAwOworICAgIGNzdHJfaW5kZXgtPm1hcmtlciA9IChvcGpfbWFya2VyX2luZm9fdCopCisgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NhbGxvYyhjc3RyX2luZGV4LT5tYXhtYXJrbnVtLCBzaXplb2Yob3BqX21hcmtlcl9pbmZvX3QpKTsKKyAgICBpZiAoIWNzdHJfaW5kZXgtPiBtYXJrZXIpIHsKKyAgICAgICAgb3BqX2ZyZWUoY3N0cl9pbmRleCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4ID0gTlVMTDsKKyAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4ID0gTlVMTDsKIAotICAgICAgICByZXR1cm4gY3N0cl9pbmRleDsKKyAgICByZXR1cm4gY3N0cl9pbmRleDsKIH0KIAotc3RhdGljIE9QSl9VSU5UMzIgb3BqX2oya19nZXRfU1BDb2RfU1BDb2Nfc2l6ZSAoICAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubyApCitzdGF0aWMgT1BKX1VJTlQzMiBvcGpfajJrX2dldF9TUENvZF9TUENvY19zaXplKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLAorICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubykKIHsKLSAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKLSAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOwotICAgICAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSAwMDsKKyAgICBvcGpfY3BfdCAqbF9jcCA9IDAwOworICAgIG9wal90Y3BfdCAqbF90Y3AgPSAwMDsKKyAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSAwMDsKIAotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CiAKLSAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOwotICAgICAgICBsX3RjcCA9ICZsX2NwLT50Y3BzW3BfdGlsZV9ub107Ci0gICAgICAgIGxfdGNjcCA9ICZsX3RjcC0+dGNjcHNbcF9jb21wX25vXTsKKyAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7CisgICAgbF90Y3AgPSAmbF9jcC0+dGNwc1twX3RpbGVfbm9dOworICAgIGxfdGNjcCA9ICZsX3RjcC0+dGNjcHNbcF9jb21wX25vXTsKIAotICAgICAgICAvKiBwcmVjb25kaXRpb25zIGFnYWluICovCi0gICAgICAgIGFzc2VydChwX3RpbGVfbm8gPCAobF9jcC0+dHcgKiBsX2NwLT50aCkpOwotICAgICAgICBhc3NlcnQocF9jb21wX25vIDwgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMpOworICAgIC8qIHByZWNvbmRpdGlvbnMgYWdhaW4gKi8KKyAgICBhc3NlcnQocF90aWxlX25vIDwgKGxfY3AtPnR3ICogbF9jcC0+dGgpKTsKKyAgICBhc3NlcnQocF9jb21wX25vIDwgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMpOwogCi0gICAgICAgIGlmIChsX3RjY3AtPmNzdHkgJiBKMktfQ0NQX0NTVFlfUFJUKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDUgKyBsX3RjY3AtPm51bXJlc29sdXRpb25zOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiA1OwotICAgICAgICB9CisgICAgaWYgKGxfdGNjcC0+Y3N0eSAmIEoyS19DQ1BfQ1NUWV9QUlQpIHsKKyAgICAgICAgcmV0dXJuIDUgKyBsX3RjY3AtPm51bXJlc29sdXRpb25zOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiA1OworICAgIH0KIH0KIAotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfU1BDb2RfU1BDb2MoICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIgKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfY29tcGFyZV9TUENvZF9TUENvYyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9ubywgT1BKX1VJTlQzMiBwX2ZpcnN0X2NvbXBfbm8sIE9QSl9VSU5UMzIgcF9zZWNvbmRfY29tcF9ubykKIHsKLSAgICAgICAgT1BKX1VJTlQzMiBpOwotICAgICAgICBvcGpfY3BfdCAqbF9jcCA9IDAwOwotICAgICAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7Ci0gICAgICAgIG9wal90Y2NwX3QgKmxfdGNjcCA9IDAwOworICAgIE9QSl9VSU5UMzIgaTsKKyAgICBvcGpfY3BfdCAqbF9jcCA9IE5VTEw7CisgICAgb3BqX3RjcF90ICpsX3RjcCA9IE5VTEw7CisgICAgb3BqX3RjY3BfdCAqbF90Y2NwMCA9IE5VTEw7CisgICAgb3BqX3RjY3BfdCAqbF90Y2NwMSA9IE5VTEw7CiAKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9oZWFkZXJfc2l6ZSAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9kYXRhICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKIAotICAgICAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7Ci0gICAgICAgIGxfdGNwID0gJmxfY3AtPnRjcHNbcF90aWxlX25vXTsKLSAgICAgICAgbF90Y2NwID0gJmxfdGNwLT50Y2Nwc1twX2NvbXBfbm9dOworICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKKyAgICBsX3RjcCA9ICZsX2NwLT50Y3BzW3BfdGlsZV9ub107CisgICAgbF90Y2NwMCA9ICZsX3RjcC0+dGNjcHNbcF9maXJzdF9jb21wX25vXTsKKyAgICBsX3RjY3AxID0gJmxfdGNwLT50Y2Nwc1twX3NlY29uZF9jb21wX25vXTsKIAotICAgICAgICAvKiBwcmVjb25kaXRpb25zIGFnYWluICovCi0gICAgICAgIGFzc2VydChwX3RpbGVfbm8gPCAobF9jcC0+dHcgKiBsX2NwLT50aCkpOwotICAgICAgICBhc3NlcnQocF9jb21wX25vIDwocF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMpKTsKKyAgICBpZiAobF90Y2NwMC0+bnVtcmVzb2x1dGlvbnMgIT0gbF90Y2NwMS0+bnVtcmVzb2x1dGlvbnMpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgaWYgKGxfdGNjcDAtPmNibGt3ICE9IGxfdGNjcDEtPmNibGt3KSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGlmIChsX3RjY3AwLT5jYmxraCAhPSBsX3RjY3AxLT5jYmxraCkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICBpZiAobF90Y2NwMC0+Y2Jsa3N0eSAhPSBsX3RjY3AxLT5jYmxrc3R5KSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGlmIChsX3RjY3AwLT5xbWZiaWQgIT0gbF90Y2NwMS0+cW1mYmlkKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGlmICgobF90Y2NwMC0+Y3N0eSAmIEoyS19DQ1BfQ1NUWV9QUlQpICE9IChsX3RjY3AxLT5jc3R5ICYgSjJLX0NDUF9DU1RZX1BSVCkpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgaWYgKCpwX2hlYWRlcl9zaXplIDwgNSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3cml0aW5nIFNQQ29kIFNQQ29jIGVsZW1lbnRcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgZm9yIChpID0gMFU7IGkgPCBsX3RjY3AwLT5udW1yZXNvbHV0aW9uczsgKytpKSB7CisgICAgICAgIGlmIChsX3RjY3AwLT5wcmN3W2ldICE9IGxfdGNjcDEtPnByY3dbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgICAgIH0KLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgLSAxLCAxKTsgIC8qIFNQY29jIChEKSAqLwotICAgICAgICArK3BfZGF0YTsKLQotICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLGxfdGNjcC0+Y2Jsa3cgLSAyLCAxKTsgICAgICAgICAgICAgICAgICAgLyogU1Bjb2MgKEUpICovCi0gICAgICAgICsrcF9kYXRhOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhwX2RhdGEsbF90Y2NwLT5jYmxraCAtIDIsIDEpOyAgICAgICAgICAgICAgICAgICAvKiBTUGNvYyAoRikgKi8KLSAgICAgICAgKytwX2RhdGE7Ci0KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKHBfZGF0YSxsX3RjY3AtPmNibGtzdHksIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU1Bjb2MgKEcpICovCi0gICAgICAgICsrcF9kYXRhOwotCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhwX2RhdGEsbF90Y2NwLT5xbWZiaWQsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNQY29jIChIKSAqLwotICAgICAgICArK3BfZGF0YTsKLQotICAgICAgICAqcF9oZWFkZXJfc2l6ZSA9ICpwX2hlYWRlcl9zaXplIC0gNTsKLQotICAgICAgICBpZiAobF90Y2NwLT5jc3R5ICYgSjJLX0NDUF9DU1RZX1BSVCkgewotCi0gICAgICAgICAgICAgICAgaWYgKCpwX2hlYWRlcl9zaXplIDwgbF90Y2NwLT5udW1yZXNvbHV0aW9ucykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdyaXRpbmcgU1BDb2QgU1BDb2MgZWxlbWVudFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsX3RjY3AtPm51bXJlc29sdXRpb25zOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhwX2RhdGEsbF90Y2NwLT5wcmN3W2ldICsgKGxfdGNjcC0+cHJjaFtpXSA8PCA0KSwgMSk7ICAgIC8qIFNQY29jIChJX2kpICovCi0gICAgICAgICAgICAgICAgICAgICAgICArK3BfZGF0YTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAqcF9oZWFkZXJfc2l6ZSA9ICpwX2hlYWRlcl9zaXplIC0gbF90Y2NwLT5udW1yZXNvbHV0aW9uczsKKyAgICAgICAgaWYgKGxfdGNjcDAtPnByY2hbaV0gIT0gbF90Y2NwMS0+cHJjaFtpXSkgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19yZWFkX1NQQ29kX1NQQ29jKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNvbXBubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfU1BDb2RfU1BDb2Mob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCisgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vLAorICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKKyAgICAgICAgT1BKX1VJTlQzMiAqIHBfaGVhZGVyX3NpemUsCisgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyKQogewotICAgICAgICBPUEpfVUlOVDMyIGksIGxfdG1wOwotICAgICAgICBvcGpfY3BfdCAqbF9jcCA9IE5VTEw7Ci0gICAgICAgIG9wal90Y3BfdCAqbF90Y3AgPSBOVUxMOwotICAgICAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSBOVUxMOwotICAgICAgICBPUEpfQllURSAqIGxfY3VycmVudF9wdHIgPSBOVUxMOworICAgIE9QSl9VSU5UMzIgaTsKKyAgICBvcGpfY3BfdCAqbF9jcCA9IDAwOworICAgIG9wal90Y3BfdCAqbF90Y3AgPSAwMDsKKyAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSAwMDsKIAotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfaGVhZGVyX3NpemUgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIGFzc2VydChwX2RhdGEgIT0gMDApOwogCi0gICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKLSAgICAgICAgbF90Y3AgPSAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX1RQSCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9jcC0+dGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOworICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKKyAgICBsX3RjcCA9ICZsX2NwLT50Y3BzW3BfdGlsZV9ub107CisgICAgbF90Y2NwID0gJmxfdGNwLT50Y2Nwc1twX2NvbXBfbm9dOwogCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbiBhZ2FpbiAqLwotICAgICAgICBpZiAoY29tcG5vID49IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIC8qIHByZWNvbmRpdGlvbnMgYWdhaW4gKi8KKyAgICBhc3NlcnQocF90aWxlX25vIDwgKGxfY3AtPnR3ICogbF9jcC0+dGgpKTsKKyAgICBhc3NlcnQocF9jb21wX25vIDwgKHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzKSk7CiAKLSAgICAgICAgbF90Y2NwID0gJmxfdGNwLT50Y2Nwc1tjb21wbm9dOwotICAgICAgICBsX2N1cnJlbnRfcHRyID0gcF9oZWFkZXJfZGF0YTsKKyAgICBpZiAoKnBfaGVhZGVyX3NpemUgPCA1KSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3cml0aW5nIFNQQ29kIFNQQ29jIGVsZW1lbnRcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICAvKiBtYWtlIHN1cmUgcm9vbSBpcyBzdWZmaWNpZW50ICovCi0gICAgICAgIGlmICgqcF9oZWFkZXJfc2l6ZSA8IDUpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBTUENvZCBTUENvYyBlbGVtZW50XG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgb3BqX3dyaXRlX2J5dGVzKHBfZGF0YSwgbF90Y2NwLT5udW1yZXNvbHV0aW9ucyAtIDEsIDEpOyAvKiBTUGNvYyAoRCkgKi8KKyAgICArK3BfZGF0YTsKIAotICAgICAgICBvcGpfcmVhZF9ieXRlcyhsX2N1cnJlbnRfcHRyLCAmbF90Y2NwLT5udW1yZXNvbHV0aW9ucyAsMSk7ICAgICAgICAgICAgICAvKiBTUGNveCAoRCkgKi8KLSAgICAgICAgKytsX3RjY3AtPm51bXJlc29sdXRpb25zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0Y2NwLT5udW1yZXNvbHV0aW9ucyA9IHJlYWQoKSArIDEgKi8KLSAgICAgICAgaWYgKGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgPiBPUEpfSjJLX01BWFJMVkxTKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBudW1yZXNvbHV0aW9ucyA6ICVkLCBtYXggdmFsdWUgaXMgc2V0IGluIG9wZW5qcGVnLmggYXQgJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjY3AtPm51bXJlc29sdXRpb25zLCBPUEpfSjJLX01BWFJMVkxTKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgICsrbF9jdXJyZW50X3B0cjsKKyAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLCBsX3RjY3AtPmNibGt3IC0gMiwgMSk7ICAgICAgICAgICAgICAgICAgLyogU1Bjb2MgKEUpICovCisgICAgKytwX2RhdGE7CiAKLSAgICAgICAgLyogSWYgdXNlciB3YW50cyB0byByZW1vdmUgbW9yZSByZXNvbHV0aW9ucyB0aGFuIHRoZSBjb2Rlc3RyZWFtIGNvbnRhaW5zLCByZXR1cm4gZXJyb3IgKi8KLSAgICAgICAgaWYgKGxfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWMubV9yZWR1Y2UgPj0gbF90Y2NwLT5udW1yZXNvbHV0aW9ucykgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciBkZWNvZGluZyBjb21wb25lbnQgJWQuXG5UaGUgbnVtYmVyIG9mIHJlc29sdXRpb25zIHRvIHJlbW92ZSBpcyBoaWdoZXIgdGhhbiB0aGUgbnVtYmVyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2YgcmVzb2x1dGlvbnMgb2YgdGhpcyBjb21wb25lbnRcbk1vZGlmeSB0aGUgY3BfcmVkdWNlIHBhcmFtZXRlci5cblxuIiwgY29tcG5vKTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSB8PSAweDgwMDA7LyogRklYTUUgSjJLX0RFQ19TVEFURV9FUlI7Ki8KLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgb3BqX3dyaXRlX2J5dGVzKHBfZGF0YSwgbF90Y2NwLT5jYmxraCAtIDIsIDEpOyAgICAgICAgICAgICAgICAgIC8qIFNQY29jIChGKSAqLworICAgICsrcF9kYXRhOwogCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKGxfY3VycmVudF9wdHIsJmxfdGNjcC0+Y2Jsa3cgLDEpOyAgICAgICAgICAgICAgICAvKiBTUGNvYyAoRSkgKi8KLSAgICAgICAgKytsX2N1cnJlbnRfcHRyOwotICAgICAgICBsX3RjY3AtPmNibGt3ICs9IDI7CisgICAgb3BqX3dyaXRlX2J5dGVzKHBfZGF0YSwgbF90Y2NwLT5jYmxrc3R5LAorICAgICAgICAgICAgICAgICAgICAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU1Bjb2MgKEcpICovCisgICAgKytwX2RhdGE7CiAKLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMobF9jdXJyZW50X3B0ciwmbF90Y2NwLT5jYmxraCAsMSk7ICAgICAgICAgICAgICAgIC8qIFNQY29jIChGKSAqLwotICAgICAgICArK2xfY3VycmVudF9wdHI7Ci0gICAgICAgIGxfdGNjcC0+Y2Jsa2ggKz0gMjsKKyAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLCBsX3RjY3AtPnFtZmJpZCwKKyAgICAgICAgICAgICAgICAgICAgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTUGNvYyAoSCkgKi8KKyAgICArK3BfZGF0YTsKIAotICAgICAgICBpZiAoKGxfdGNjcC0+Y2Jsa3cgPiAxMCkgfHwgKGxfdGNjcC0+Y2Jsa2ggPiAxMCkgfHwgKChsX3RjY3AtPmNibGt3ICsgbF90Y2NwLT5jYmxraCkgPiAxMikpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBTUENvZCBTUENvYyBlbGVtZW50LCBJbnZhbGlkIGNibGt3L2NibGtoIGNvbWJpbmF0aW9uXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0JCisgICAgKnBfaGVhZGVyX3NpemUgPSAqcF9oZWFkZXJfc2l6ZSAtIDU7CiAKLSAgICAgICAgb3BqX3JlYWRfYnl0ZXMobF9jdXJyZW50X3B0ciwmbF90Y2NwLT5jYmxrc3R5ICwxKTsgICAgICAgICAgICAgIC8qIFNQY29jIChHKSAqLwotICAgICAgICArK2xfY3VycmVudF9wdHI7CisgICAgaWYgKGxfdGNjcC0+Y3N0eSAmIEoyS19DQ1BfQ1NUWV9QUlQpIHsKIAotICAgICAgICBvcGpfcmVhZF9ieXRlcyhsX2N1cnJlbnRfcHRyLCZsX3RjY3AtPnFtZmJpZCAsMSk7ICAgICAgICAgICAgICAgLyogU1Bjb2MgKEgpICovCi0gICAgICAgICsrbF9jdXJyZW50X3B0cjsKLQotICAgICAgICAqcF9oZWFkZXJfc2l6ZSA9ICpwX2hlYWRlcl9zaXplIC0gNTsKLQotICAgICAgICAvKiB1c2UgY3VzdG9tIHByZWNpbmN0IHNpemUgPyAqLwotICAgICAgICBpZiAobF90Y2NwLT5jc3R5ICYgSjJLX0NDUF9DU1RZX1BSVCkgewotICAgICAgICAgICAgICAgIGlmICgqcF9oZWFkZXJfc2l6ZSA8IGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgICAgIChpID0gMDsgaSA8IGxfdGNjcC0+bnVtcmVzb2x1dGlvbnM7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMobF9jdXJyZW50X3B0ciwmbF90bXAgLDEpOyAgICAgICAgICAgICAgICAvKiBTUGNvYyAoSV9pKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKytsX2N1cnJlbnRfcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJlY2luY3QgZXhwb25lbnQgMCBpcyBvbmx5IGFsbG93ZWQgZm9yIGxvd2VzdCByZXNvbHV0aW9uIGxldmVsIChUYWJsZSBBLjIxKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChpICE9IDApICYmICgoKGxfdG1wICYgMHhmKSA9PSAwKSB8fCAoKGxfdG1wID4+IDQpID09IDApKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSW52YWxpZCBwcmVjaW5jdCBzaXplXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNjcC0+cHJjd1tpXSA9IGxfdG1wICYgMHhmOwotICAgICAgICAgICAgICAgICAgICAgICAgbF90Y2NwLT5wcmNoW2ldID0gbF90bXAgPj4gNDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAqcF9oZWFkZXJfc2l6ZSA9ICpwX2hlYWRlcl9zaXplIC0gbF90Y2NwLT5udW1yZXNvbHV0aW9uczsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBzZXQgZGVmYXVsdCBzaXplIGZvciB0aGUgcHJlY2luY3Qgd2lkdGggYW5kIGhlaWdodCAqLwotICAgICAgICAgICAgICAgIGZvciAgICAgKGkgPSAwOyBpIDwgbF90Y2NwLT5udW1yZXNvbHV0aW9uczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3RjY3AtPnByY3dbaV0gPSAxNTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNjcC0+cHJjaFtpXSA9IDE1OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0jaWZkZWYgV0lQX1JFTU9WRV9NU0QKLSAgICAgICAgLyogSU5ERVggPj4gKi8KLSAgICAgICAgaWYgKHBfajJrLT5jc3RyX2luZm8gJiYgY29tcG5vID09IDApIHsKLSAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxfZGF0YV9zaXplID0gbF90Y2NwLT5udW1yZXNvbHV0aW9ucyAqIHNpemVvZihPUEpfVUlOVDMyKTsKLQotICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udGNjcF9pbmZvW2NvbXBub10uY2Jsa2ggPSBsX3RjY3AtPmNibGtoOwotICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udGNjcF9pbmZvW2NvbXBub10uY2Jsa3cgPSBsX3RjY3AtPmNibGt3OwotICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udGNjcF9pbmZvW2NvbXBub10ubnVtcmVzb2x1dGlvbnMgPSBsX3RjY3AtPm51bXJlc29sdXRpb25zOwotICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udGNjcF9pbmZvW2NvbXBub10uY2Jsa3N0eSA9IGxfdGNjcC0+Y2Jsa3N0eTsKLSAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRjY3BfaW5mb1tjb21wbm9dLnFtZmJpZCA9IGxfdGNjcC0+cW1mYmlkOwotCi0gICAgICAgICAgICAgICAgbWVtY3B5KHBfajJrLT5jc3RyX2luZm8tPnRpbGVbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0ucGR4LGxfdGNjcC0+cHJjdywgbF9kYXRhX3NpemUpOwotICAgICAgICAgICAgICAgIG1lbWNweShwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnBkeSxsX3RjY3AtPnByY2gsIGxfZGF0YV9zaXplKTsKLSAgICAgICAgfQotICAgICAgICAvKiA8PCBJTkRFWCAqLwotI2VuZGlmCi0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1zdGF0aWMgdm9pZCBvcGpfajJrX2NvcHlfdGlsZV9jb21wb25lbnRfcGFyYW1ldGVycyggb3BqX2oya190ICpwX2oyayApCi17Ci0gICAgICAgIC8qIGxvb3AgKi8KLSAgICAgICAgT1BKX1VJTlQzMiBpOwotICAgICAgICBvcGpfY3BfdCAqbF9jcCA9IE5VTEw7Ci0gICAgICAgIG9wal90Y3BfdCAqbF90Y3AgPSBOVUxMOwotICAgICAgICBvcGpfdGNjcF90ICpsX3JlZl90Y2NwID0gTlVMTCwgKmxfY29waWVkX3RjY3AgPSBOVUxMOwotICAgICAgICBPUEpfVUlOVDMyIGxfcHJjX3NpemU7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotCi0gICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKLSAgICAgICAgbF90Y3AgPSAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX1RQSCkgPyAvKiBGSVhNRSBKMktfREVDX1NUQVRFX1RQSCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX2NwLT50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3A7Ci0KLSAgICAgICAgbF9yZWZfdGNjcCA9ICZsX3RjcC0+dGNjcHNbMF07Ci0gICAgICAgIGxfY29waWVkX3RjY3AgPSBsX3JlZl90Y2NwICsgMTsKLSAgICAgICAgbF9wcmNfc2l6ZSA9IGxfcmVmX3RjY3AtPm51bXJlc29sdXRpb25zICogKE9QSl9VSU5UMzIpc2l6ZW9mKE9QSl9VSU5UMzIpOwotCi0gICAgICAgIGZvciAgICAgKGk9MTsgaTxwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgbF9jb3BpZWRfdGNjcC0+bnVtcmVzb2x1dGlvbnMgPSBsX3JlZl90Y2NwLT5udW1yZXNvbHV0aW9uczsKLSAgICAgICAgICAgICAgICBsX2NvcGllZF90Y2NwLT5jYmxrdyA9IGxfcmVmX3RjY3AtPmNibGt3OwotICAgICAgICAgICAgICAgIGxfY29waWVkX3RjY3AtPmNibGtoID0gbF9yZWZfdGNjcC0+Y2Jsa2g7Ci0gICAgICAgICAgICAgICAgbF9jb3BpZWRfdGNjcC0+Y2Jsa3N0eSA9IGxfcmVmX3RjY3AtPmNibGtzdHk7Ci0gICAgICAgICAgICAgICAgbF9jb3BpZWRfdGNjcC0+cW1mYmlkID0gbF9yZWZfdGNjcC0+cW1mYmlkOwotICAgICAgICAgICAgICAgIG1lbWNweShsX2NvcGllZF90Y2NwLT5wcmN3LGxfcmVmX3RjY3AtPnByY3csbF9wcmNfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGxfY29waWVkX3RjY3AtPnByY2gsbF9yZWZfdGNjcC0+cHJjaCxsX3ByY19zaXplKTsKLSAgICAgICAgICAgICAgICArK2xfY29waWVkX3RjY3A7Ci0gICAgICAgIH0KLX0KLQotc3RhdGljIE9QSl9VSU5UMzIgb3BqX2oya19nZXRfU1FjZF9TUWNjX3NpemUgKCBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubyApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9udW1fYmFuZHM7Ci0KLSAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKLSAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOwotICAgICAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSAwMDsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0KLSAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOwotICAgICAgICBsX3RjcCA9ICZsX2NwLT50Y3BzW3BfdGlsZV9ub107Ci0gICAgICAgIGxfdGNjcCA9ICZsX3RjcC0+dGNjcHNbcF9jb21wX25vXTsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zIGFnYWluICovCi0gICAgICAgIGFzc2VydChwX3RpbGVfbm8gPCBsX2NwLT50dyAqIGxfY3AtPnRoKTsKLSAgICAgICAgYXNzZXJ0KHBfY29tcF9ubyA8IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzKTsKLQotICAgICAgICBsX251bV9iYW5kcyA9IChsX3RjY3AtPnFudHN0eSA9PSBKMktfQ0NQX1FOVFNUWV9TSVFOVCkgPyAxIDogKGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgKiAzIC0gMik7Ci0KLSAgICAgICAgaWYgKGxfdGNjcC0+cW50c3R5ID09IEoyS19DQ1BfUU5UU1RZX05PUU5UKSAgewotICAgICAgICAgICAgICAgIHJldHVybiAxICsgbF9udW1fYmFuZHM7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDEgKyAyKmxfbnVtX2JhbmRzOwotICAgICAgICB9Ci19Ci0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX1NRY2RfU1FjYyggICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlciApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9oZWFkZXJfc2l6ZTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2JhbmRfbm8sIGxfbnVtX2JhbmRzOwotICAgICAgICBPUEpfVUlOVDMyIGxfZXhwbixsX21hbnQ7Ci0KLSAgICAgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKLSAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOwotICAgICAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSAwMDsKLQotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX2hlYWRlcl9zaXplICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX2RhdGEgIT0gMDApOwotCi0gICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKLSAgICAgICAgbF90Y3AgPSAmbF9jcC0+dGNwc1twX3RpbGVfbm9dOwotICAgICAgICBsX3RjY3AgPSAmbF90Y3AtPnRjY3BzW3BfY29tcF9ub107Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyBhZ2FpbiAqLwotICAgICAgICBhc3NlcnQocF90aWxlX25vIDwgbF9jcC0+dHcgKiBsX2NwLT50aCk7Ci0gICAgICAgIGFzc2VydChwX2NvbXBfbm8gPHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzKTsKLQotICAgICAgICBsX251bV9iYW5kcyA9IChsX3RjY3AtPnFudHN0eSA9PSBKMktfQ0NQX1FOVFNUWV9TSVFOVCkgPyAxIDogKGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgKiAzIC0gMik7Ci0KLSAgICAgICAgaWYgKGxfdGNjcC0+cW50c3R5ID09IEoyS19DQ1BfUU5UU1RZX05PUU5UKSAgewotICAgICAgICAgICAgICAgIGxfaGVhZGVyX3NpemUgPSAxICsgbF9udW1fYmFuZHM7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKnBfaGVhZGVyX3NpemUgPCBsX2hlYWRlcl9zaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd3JpdGluZyBTUWNkIFNRY2MgZWxlbWVudFxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhwX2RhdGEsbF90Y2NwLT5xbnRzdHkgKyAobF90Y2NwLT5udW1nYml0cyA8PCA1KSwgMSk7ICAgIC8qIFNxY3ggKi8KLSAgICAgICAgICAgICAgICArK3BfZGF0YTsKLQotICAgICAgICAgICAgICAgIGZvciAobF9iYW5kX25vID0gMDsgbF9iYW5kX25vIDwgbF9udW1fYmFuZHM7ICsrbF9iYW5kX25vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX2V4cG4gPSAoT1BKX1VJTlQzMilsX3RjY3AtPnN0ZXBzaXplc1tsX2JhbmRfbm9dLmV4cG47Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLCBsX2V4cG4gPDwgMywgMSk7ICAgICAgICAvKiBTUHFjeF9pICovCi0gICAgICAgICAgICAgICAgICAgICAgICArK3BfZGF0YTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbF9oZWFkZXJfc2l6ZSA9IDEgKyAyKmxfbnVtX2JhbmRzOwotCi0gICAgICAgICAgICAgICAgaWYgKCpwX2hlYWRlcl9zaXplIDwgbF9oZWFkZXJfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdyaXRpbmcgU1FjZCBTUWNjIGVsZW1lbnRcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLGxfdGNjcC0+cW50c3R5ICsgKGxfdGNjcC0+bnVtZ2JpdHMgPDwgNSksIDEpOyAgICAvKiBTcWN4ICovCi0gICAgICAgICAgICAgICAgKytwX2RhdGE7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGxfYmFuZF9ubyA9IDA7IGxfYmFuZF9ubyA8IGxfbnVtX2JhbmRzOyArK2xfYmFuZF9ubykgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9leHBuID0gKE9QSl9VSU5UMzIpbF90Y2NwLT5zdGVwc2l6ZXNbbF9iYW5kX25vXS5leHBuOwotICAgICAgICAgICAgICAgICAgICAgICAgbF9tYW50ID0gKE9QSl9VSU5UMzIpbF90Y2NwLT5zdGVwc2l6ZXNbbF9iYW5kX25vXS5tYW50OwotCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLCAobF9leHBuIDw8IDExKSArIGxfbWFudCwgMik7ICAgIC8qIFNQcWN4X2kgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSArPSAyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgICpwX2hlYWRlcl9zaXplID0gKnBfaGVhZGVyX3NpemUgLSBsX2hlYWRlcl9zaXplOwotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcmVhZF9TUWNkX1NRY2Mob3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUqIHBfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQotewotICAgICAgICAvKiBsb29wKi8KLSAgICAgICAgT1BKX1VJTlQzMiBsX2JhbmRfbm87Ci0gICAgICAgIG9wal9jcF90ICpsX2NwID0gMDA7Ci0gICAgICAgIG9wal90Y3BfdCAqbF90Y3AgPSAwMDsKLSAgICAgICAgb3BqX3RjY3BfdCAqbF90Y2NwID0gMDA7Ci0gICAgICAgIE9QSl9CWVRFICogbF9jdXJyZW50X3B0ciA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfdG1wLCBsX251bV9iYW5kOwotCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfaGVhZGVyX2RhdGEgIT0gMDApOwotCi0gICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKLSAgICAgICAgLyogY29tZSBmcm9tIHRpbGUgcGFydCBoZWFkZXIgb3IgbWFpbiBoZWFkZXIgPyovCi0gICAgICAgIGxfdGNwID0gKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9UUEgpID8gLypGSVhNRSBKMktfREVDX1NUQVRFX1RQSCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX2NwLT50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3A7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9uIGFnYWluKi8KLSAgICAgICAgaWYgKHBfY29tcF9ubyA+PSAgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMpIHsKKyAgICAgICAgaWYgKCpwX2hlYWRlcl9zaXplIDwgbF90Y2NwLT5udW1yZXNvbHV0aW9ucykgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdyaXRpbmcgU1BDb2QgU1BDb2MgZWxlbWVudFxuIik7CiAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICB9CiAKLSAgICAgICAgbF90Y2NwID0gJmxfdGNwLT50Y2Nwc1twX2NvbXBfbm9dOwotICAgICAgICBsX2N1cnJlbnRfcHRyID0gcF9oZWFkZXJfZGF0YTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxfdGNjcC0+bnVtcmVzb2x1dGlvbnM7ICsraSkgeworICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKHBfZGF0YSwgbF90Y2NwLT5wcmN3W2ldICsgKGxfdGNjcC0+cHJjaFtpXSA8PCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsgICAvKiBTUGNvYyAoSV9pKSAqLworICAgICAgICAgICAgKytwX2RhdGE7CisgICAgICAgIH0KIAotICAgICAgICBpZiAoKnBfaGVhZGVyX3NpemUgPCAxKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHJlYWRpbmcgU1FjZCBvciBTUWNjIGVsZW1lbnRcbiIpOworICAgICAgICAqcF9oZWFkZXJfc2l6ZSA9ICpwX2hlYWRlcl9zaXplIC0gbF90Y2NwLT5udW1yZXNvbHV0aW9uczsKKyAgICB9CisKKyAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfU1BDb2RfU1BDb2Mob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgT1BKX1VJTlQzMiBjb21wbm8sCisgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgT1BKX1VJTlQzMiAqIHBfaGVhZGVyX3NpemUsCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKK3sKKyAgICBPUEpfVUlOVDMyIGksIGxfdG1wOworICAgIG9wal9jcF90ICpsX2NwID0gTlVMTDsKKyAgICBvcGpfdGNwX3QgKmxfdGNwID0gTlVMTDsKKyAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSBOVUxMOworICAgIE9QSl9CWVRFICogbF9jdXJyZW50X3B0ciA9IE5VTEw7CisKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICBhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7CisKKyAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7CisgICAgbF90Y3AgPSAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX1RQSCkgPworICAgICAgICAgICAgJmxfY3AtPnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0gOgorICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3A7CisKKyAgICAvKiBwcmVjb25kaXRpb24gYWdhaW4gKi8KKyAgICBpZiAoY29tcG5vID49IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgYXNzZXJ0KGNvbXBubyA8IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzKTsKKworICAgIGxfdGNjcCA9ICZsX3RjcC0+dGNjcHNbY29tcG5vXTsKKyAgICBsX2N1cnJlbnRfcHRyID0gcF9oZWFkZXJfZGF0YTsKKworICAgIC8qIG1ha2Ugc3VyZSByb29tIGlzIHN1ZmZpY2llbnQgKi8KKyAgICBpZiAoKnBfaGVhZGVyX3NpemUgPCA1KSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnRcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIG9wal9yZWFkX2J5dGVzKGxfY3VycmVudF9wdHIsICZsX3RjY3AtPm51bXJlc29sdXRpb25zLAorICAgICAgICAgICAgICAgICAgIDEpOyAgICAgICAgICAgICAgLyogU1Bjb3ggKEQpICovCisgICAgKytsX3RjY3AtPm51bXJlc29sdXRpb25zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0Y2NwLT5udW1yZXNvbHV0aW9ucyA9IHJlYWQoKSArIDEgKi8KKyAgICBpZiAobF90Y2NwLT5udW1yZXNvbHV0aW9ucyA+IE9QSl9KMktfTUFYUkxWTFMpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCB2YWx1ZSBmb3IgbnVtcmVzb2x1dGlvbnMgOiAlZCwgbWF4IHZhbHVlIGlzIHNldCBpbiBvcGVuanBlZy5oIGF0ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMsIE9QSl9KMktfTUFYUkxWTFMpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICArK2xfY3VycmVudF9wdHI7CisKKyAgICAvKiBJZiB1c2VyIHdhbnRzIHRvIHJlbW92ZSBtb3JlIHJlc29sdXRpb25zIHRoYW4gdGhlIGNvZGVzdHJlYW0gY29udGFpbnMsIHJldHVybiBlcnJvciAqLworICAgIGlmIChsX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjLm1fcmVkdWNlID49IGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgZGVjb2RpbmcgY29tcG9uZW50ICVkLlxuVGhlIG51bWJlciBvZiByZXNvbHV0aW9ucyAiCisgICAgICAgICAgICAgICAgICAgICAgInRvIHJlbW92ZSAoJWQpIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiB0aGUgbnVtYmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAib2YgcmVzb2x1dGlvbnMgb2YgdGhpcyBjb21wb25lbnQgKCVkKVxuTW9kaWZ5IHRoZSBjcF9yZWR1Y2UgcGFyYW1ldGVyLlxuXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGNvbXBubywgbF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2RlYy5tX3JlZHVjZSwgbF90Y2NwLT5udW1yZXNvbHV0aW9ucyk7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlIHw9CisgICAgICAgICAgICAweDgwMDA7LyogRklYTUUgSjJLX0RFQ19TVEFURV9FUlI7Ki8KKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICBvcGpfcmVhZF9ieXRlcyhsX2N1cnJlbnRfcHRyLCAmbF90Y2NwLT5jYmxrdywgMSk7ICAgICAgICAgICAgICAgLyogU1Bjb2MgKEUpICovCisgICAgKytsX2N1cnJlbnRfcHRyOworICAgIGxfdGNjcC0+Y2Jsa3cgKz0gMjsKKworICAgIG9wal9yZWFkX2J5dGVzKGxfY3VycmVudF9wdHIsICZsX3RjY3AtPmNibGtoLCAxKTsgICAgICAgICAgICAgICAvKiBTUGNvYyAoRikgKi8KKyAgICArK2xfY3VycmVudF9wdHI7CisgICAgbF90Y2NwLT5jYmxraCArPSAyOworCisgICAgaWYgKChsX3RjY3AtPmNibGt3ID4gMTApIHx8IChsX3RjY3AtPmNibGtoID4gMTApIHx8CisgICAgICAgICAgICAoKGxfdGNjcC0+Y2Jsa3cgKyBsX3RjY3AtPmNibGtoKSA+IDEyKSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnQsIEludmFsaWQgY2Jsa3cvY2Jsa2ggY29tYmluYXRpb25cbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworCisgICAgb3BqX3JlYWRfYnl0ZXMobF9jdXJyZW50X3B0ciwgJmxfdGNjcC0+Y2Jsa3N0eSwgMSk7ICAgICAgICAgICAgIC8qIFNQY29jIChHKSAqLworICAgICsrbF9jdXJyZW50X3B0cjsKKyAgICBpZiAobF90Y2NwLT5jYmxrc3R5ICYgMHhDMFUpIHsgLyogMiBtc2IgYXJlIHJlc2VydmVkLCBhc3N1bWUgd2UgY2FuJ3QgcmVhZCAqLworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJFcnJvciByZWFkaW5nIFNQQ29kIFNQQ29jIGVsZW1lbnQsIEludmFsaWQgY29kZS1ibG9jayBzdHlsZSBmb3VuZFxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgb3BqX3JlYWRfYnl0ZXMobF9jdXJyZW50X3B0ciwgJmxfdGNjcC0+cW1mYmlkLCAxKTsgICAgICAgICAgICAgIC8qIFNQY29jIChIKSAqLworICAgICsrbF9jdXJyZW50X3B0cjsKKworICAgICpwX2hlYWRlcl9zaXplID0gKnBfaGVhZGVyX3NpemUgLSA1OworCisgICAgLyogdXNlIGN1c3RvbSBwcmVjaW5jdCBzaXplID8gKi8KKyAgICBpZiAobF90Y2NwLT5jc3R5ICYgSjJLX0NDUF9DU1RZX1BSVCkgeworICAgICAgICBpZiAoKnBfaGVhZGVyX3NpemUgPCBsX3RjY3AtPm51bXJlc29sdXRpb25zKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBTUENvZCBTUENvYyBlbGVtZW50XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF90Y2NwLT5udW1yZXNvbHV0aW9uczsgKytpKSB7CisgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhsX2N1cnJlbnRfcHRyLCAmbF90bXAsIDEpOyAgICAgICAgICAgICAgIC8qIFNQY29jIChJX2kpICovCisgICAgICAgICAgICArK2xfY3VycmVudF9wdHI7CisgICAgICAgICAgICAvKiBQcmVjaW5jdCBleHBvbmVudCAwIGlzIG9ubHkgYWxsb3dlZCBmb3IgbG93ZXN0IHJlc29sdXRpb24gbGV2ZWwgKFRhYmxlIEEuMjEpICovCisgICAgICAgICAgICBpZiAoKGkgIT0gMCkgJiYgKCgobF90bXAgJiAweGYpID09IDApIHx8ICgobF90bXAgPj4gNCkgPT0gMCkpKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgcHJlY2luY3Qgc2l6ZVxuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxfdGNjcC0+cHJjd1tpXSA9IGxfdG1wICYgMHhmOworICAgICAgICAgICAgbF90Y2NwLT5wcmNoW2ldID0gbF90bXAgPj4gNDsKICAgICAgICAgfQotICAgICAgICAqcF9oZWFkZXJfc2l6ZSAtPSAxOwogCi0gICAgICAgIG9wal9yZWFkX2J5dGVzKGxfY3VycmVudF9wdHIsICZsX3RtcCAsMSk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTcWN4ICovCi0gICAgICAgICsrbF9jdXJyZW50X3B0cjsKKyAgICAgICAgKnBfaGVhZGVyX3NpemUgPSAqcF9oZWFkZXJfc2l6ZSAtIGxfdGNjcC0+bnVtcmVzb2x1dGlvbnM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogc2V0IGRlZmF1bHQgc2l6ZSBmb3IgdGhlIHByZWNpbmN0IHdpZHRoIGFuZCBoZWlnaHQgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxfdGNjcC0+bnVtcmVzb2x1dGlvbnM7ICsraSkgeworICAgICAgICAgICAgbF90Y2NwLT5wcmN3W2ldID0gMTU7CisgICAgICAgICAgICBsX3RjY3AtPnByY2hbaV0gPSAxNTsKKyAgICAgICAgfQorICAgIH0KIAotICAgICAgICBsX3RjY3AtPnFudHN0eSA9IGxfdG1wICYgMHgxZjsKLSAgICAgICAgbF90Y2NwLT5udW1nYml0cyA9IGxfdG1wID4+IDU7Ci0gICAgICAgIGlmIChsX3RjY3AtPnFudHN0eSA9PSBKMktfQ0NQX1FOVFNUWV9TSVFOVCkgeworI2lmZGVmIFdJUF9SRU1PVkVfTVNECisgICAgLyogSU5ERVggPj4gKi8KKyAgICBpZiAocF9qMmstPmNzdHJfaW5mbyAmJiBjb21wbm8gPT0gMCkgeworICAgICAgICBPUEpfVUlOVDMyIGxfZGF0YV9zaXplID0gbF90Y2NwLT5udW1yZXNvbHV0aW9ucyAqIHNpemVvZihPUEpfVUlOVDMyKTsKKworICAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRjY3BfaW5mb1tjb21wbm9dLmNibGtoID0KKyAgICAgICAgICAgIGxfdGNjcC0+Y2Jsa2g7CisgICAgICAgIHBfajJrLT5jc3RyX2luZm8tPnRpbGVbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0udGNjcF9pbmZvW2NvbXBub10uY2Jsa3cgPQorICAgICAgICAgICAgbF90Y2NwLT5jYmxrdzsKKyAgICAgICAgcF9qMmstPmNzdHJfaW5mby0+dGlsZVtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS50Y2NwX2luZm9bY29tcG5vXS5udW1yZXNvbHV0aW9ucworICAgICAgICAgICAgPSBsX3RjY3AtPm51bXJlc29sdXRpb25zOworICAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRjY3BfaW5mb1tjb21wbm9dLmNibGtzdHkgPQorICAgICAgICAgICAgbF90Y2NwLT5jYmxrc3R5OworICAgICAgICBwX2oyay0+Y3N0cl9pbmZvLT50aWxlW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdLnRjY3BfaW5mb1tjb21wbm9dLnFtZmJpZCA9CisgICAgICAgICAgICBsX3RjY3AtPnFtZmJpZDsKKworICAgICAgICBtZW1jcHkocF9qMmstPmNzdHJfaW5mby0+dGlsZVtwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5wZHgsIGxfdGNjcC0+cHJjdywKKyAgICAgICAgICAgICAgIGxfZGF0YV9zaXplKTsKKyAgICAgICAgbWVtY3B5KHBfajJrLT5jc3RyX2luZm8tPnRpbGVbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0ucGR5LCBsX3RjY3AtPnByY2gsCisgICAgICAgICAgICAgICBsX2RhdGFfc2l6ZSk7CisgICAgfQorICAgIC8qIDw8IElOREVYICovCisjZW5kaWYKKworICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIHZvaWQgb3BqX2oya19jb3B5X3RpbGVfY29tcG9uZW50X3BhcmFtZXRlcnMob3BqX2oya190ICpwX2oyaykKK3sKKyAgICAvKiBsb29wICovCisgICAgT1BKX1VJTlQzMiBpOworICAgIG9wal9jcF90ICpsX2NwID0gTlVMTDsKKyAgICBvcGpfdGNwX3QgKmxfdGNwID0gTlVMTDsKKyAgICBvcGpfdGNjcF90ICpsX3JlZl90Y2NwID0gTlVMTCwgKmxfY29waWVkX3RjY3AgPSBOVUxMOworICAgIE9QSl9VSU5UMzIgbF9wcmNfc2l6ZTsKKworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworCisgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOworICAgIGxfdGNwID0gKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9UUEgpCisgICAgICAgICAgICA/CisgICAgICAgICAgICAmbF9jcC0+dGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXSA6CisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcDsKKworICAgIGxfcmVmX3RjY3AgPSAmbF90Y3AtPnRjY3BzWzBdOworICAgIGxfY29waWVkX3RjY3AgPSBsX3JlZl90Y2NwICsgMTsKKyAgICBsX3ByY19zaXplID0gbF9yZWZfdGNjcC0+bnVtcmVzb2x1dGlvbnMgKiAoT1BKX1VJTlQzMilzaXplb2YoT1BKX1VJTlQzMik7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHM7ICsraSkgeworICAgICAgICBsX2NvcGllZF90Y2NwLT5udW1yZXNvbHV0aW9ucyA9IGxfcmVmX3RjY3AtPm51bXJlc29sdXRpb25zOworICAgICAgICBsX2NvcGllZF90Y2NwLT5jYmxrdyA9IGxfcmVmX3RjY3AtPmNibGt3OworICAgICAgICBsX2NvcGllZF90Y2NwLT5jYmxraCA9IGxfcmVmX3RjY3AtPmNibGtoOworICAgICAgICBsX2NvcGllZF90Y2NwLT5jYmxrc3R5ID0gbF9yZWZfdGNjcC0+Y2Jsa3N0eTsKKyAgICAgICAgbF9jb3BpZWRfdGNjcC0+cW1mYmlkID0gbF9yZWZfdGNjcC0+cW1mYmlkOworICAgICAgICBtZW1jcHkobF9jb3BpZWRfdGNjcC0+cHJjdywgbF9yZWZfdGNjcC0+cHJjdywgbF9wcmNfc2l6ZSk7CisgICAgICAgIG1lbWNweShsX2NvcGllZF90Y2NwLT5wcmNoLCBsX3JlZl90Y2NwLT5wcmNoLCBsX3ByY19zaXplKTsKKyAgICAgICAgKytsX2NvcGllZF90Y2NwOworICAgIH0KK30KKworc3RhdGljIE9QSl9VSU5UMzIgb3BqX2oya19nZXRfU1FjZF9TUWNjX3NpemUob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCisgICAgICAgIE9QSl9VSU5UMzIgcF9jb21wX25vKQoreworICAgIE9QSl9VSU5UMzIgbF9udW1fYmFuZHM7CisKKyAgICBvcGpfY3BfdCAqbF9jcCA9IDAwOworICAgIG9wal90Y3BfdCAqbF90Y3AgPSAwMDsKKyAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSAwMDsKKworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworCisgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOworICAgIGxfdGNwID0gJmxfY3AtPnRjcHNbcF90aWxlX25vXTsKKyAgICBsX3RjY3AgPSAmbF90Y3AtPnRjY3BzW3BfY29tcF9ub107CisKKyAgICAvKiBwcmVjb25kaXRpb25zIGFnYWluICovCisgICAgYXNzZXJ0KHBfdGlsZV9ubyA8IGxfY3AtPnR3ICogbF9jcC0+dGgpOworICAgIGFzc2VydChwX2NvbXBfbm8gPCBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcyk7CisKKyAgICBsX251bV9iYW5kcyA9IChsX3RjY3AtPnFudHN0eSA9PSBKMktfQ0NQX1FOVFNUWV9TSVFOVCkgPyAxIDoKKyAgICAgICAgICAgICAgICAgIChsX3RjY3AtPm51bXJlc29sdXRpb25zICogMyAtIDIpOworCisgICAgaWYgKGxfdGNjcC0+cW50c3R5ID09IEoyS19DQ1BfUU5UU1RZX05PUU5UKSAgeworICAgICAgICByZXR1cm4gMSArIGxfbnVtX2JhbmRzOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAxICsgMiAqIGxfbnVtX2JhbmRzOworICAgIH0KK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfY29tcGFyZV9TUWNkX1NRY2Mob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sIE9QSl9VSU5UMzIgcF9maXJzdF9jb21wX25vLCBPUEpfVUlOVDMyIHBfc2Vjb25kX2NvbXBfbm8pCit7CisgICAgb3BqX2NwX3QgKmxfY3AgPSBOVUxMOworICAgIG9wal90Y3BfdCAqbF90Y3AgPSBOVUxMOworICAgIG9wal90Y2NwX3QgKmxfdGNjcDAgPSBOVUxMOworICAgIG9wal90Y2NwX3QgKmxfdGNjcDEgPSBOVUxMOworICAgIE9QSl9VSU5UMzIgbF9iYW5kX25vLCBsX251bV9iYW5kczsKKworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworCisgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOworICAgIGxfdGNwID0gJmxfY3AtPnRjcHNbcF90aWxlX25vXTsKKyAgICBsX3RjY3AwID0gJmxfdGNwLT50Y2Nwc1twX2ZpcnN0X2NvbXBfbm9dOworICAgIGxfdGNjcDEgPSAmbF90Y3AtPnRjY3BzW3Bfc2Vjb25kX2NvbXBfbm9dOworCisgICAgaWYgKGxfdGNjcDAtPnFudHN0eSAhPSBsX3RjY3AxLT5xbnRzdHkpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgaWYgKGxfdGNjcDAtPm51bWdiaXRzICE9IGxfdGNjcDEtPm51bWdiaXRzKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGlmIChsX3RjY3AwLT5xbnRzdHkgPT0gSjJLX0NDUF9RTlRTVFlfU0lRTlQpIHsKKyAgICAgICAgbF9udW1fYmFuZHMgPSAxVTsKKyAgICB9IGVsc2UgeworICAgICAgICBsX251bV9iYW5kcyA9IGxfdGNjcDAtPm51bXJlc29sdXRpb25zICogM1UgLSAyVTsKKyAgICAgICAgaWYgKGxfbnVtX2JhbmRzICE9IChsX3RjY3AxLT5udW1yZXNvbHV0aW9ucyAqIDNVIC0gMlUpKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChsX2JhbmRfbm8gPSAwOyBsX2JhbmRfbm8gPCBsX251bV9iYW5kczsgKytsX2JhbmRfbm8pIHsKKyAgICAgICAgaWYgKGxfdGNjcDAtPnN0ZXBzaXplc1tsX2JhbmRfbm9dLmV4cG4gIT0gbF90Y2NwMS0+c3RlcHNpemVzW2xfYmFuZF9ub10uZXhwbikgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobF90Y2NwMC0+cW50c3R5ICE9IEoyS19DQ1BfUU5UU1RZX05PUU5UKSB7CisgICAgICAgIGZvciAobF9iYW5kX25vID0gMDsgbF9iYW5kX25vIDwgbF9udW1fYmFuZHM7ICsrbF9iYW5kX25vKSB7CisgICAgICAgICAgICBpZiAobF90Y2NwMC0+c3RlcHNpemVzW2xfYmFuZF9ub10ubWFudCAhPSBsX3RjY3AxLT5zdGVwc2l6ZXNbbF9iYW5kX25vXS5tYW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfd3JpdGVfU1FjZF9TUWNjKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbXBfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIpCit7CisgICAgT1BKX1VJTlQzMiBsX2hlYWRlcl9zaXplOworICAgIE9QSl9VSU5UMzIgbF9iYW5kX25vLCBsX251bV9iYW5kczsKKyAgICBPUEpfVUlOVDMyIGxfZXhwbiwgbF9tYW50OworCisgICAgb3BqX2NwX3QgKmxfY3AgPSAwMDsKKyAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7CisgICAgb3BqX3RjY3BfdCAqbF90Y2NwID0gMDA7CisKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9oZWFkZXJfc2l6ZSAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgYXNzZXJ0KHBfZGF0YSAhPSAwMCk7CisKKyAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7CisgICAgbF90Y3AgPSAmbF9jcC0+dGNwc1twX3RpbGVfbm9dOworICAgIGxfdGNjcCA9ICZsX3RjcC0+dGNjcHNbcF9jb21wX25vXTsKKworICAgIC8qIHByZWNvbmRpdGlvbnMgYWdhaW4gKi8KKyAgICBhc3NlcnQocF90aWxlX25vIDwgbF9jcC0+dHcgKiBsX2NwLT50aCk7CisgICAgYXNzZXJ0KHBfY29tcF9ubyA8IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzKTsKKworICAgIGxfbnVtX2JhbmRzID0gKGxfdGNjcC0+cW50c3R5ID09IEoyS19DQ1BfUU5UU1RZX1NJUU5UKSA/IDEgOgorICAgICAgICAgICAgICAgICAgKGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgKiAzIC0gMik7CisKKyAgICBpZiAobF90Y2NwLT5xbnRzdHkgPT0gSjJLX0NDUF9RTlRTVFlfTk9RTlQpICB7CisgICAgICAgIGxfaGVhZGVyX3NpemUgPSAxICsgbF9udW1fYmFuZHM7CisKKyAgICAgICAgaWYgKCpwX2hlYWRlcl9zaXplIDwgbF9oZWFkZXJfc2l6ZSkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdyaXRpbmcgU1FjZCBTUWNjIGVsZW1lbnRcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhwX2RhdGEsIGxfdGNjcC0+cW50c3R5ICsgKGxfdGNjcC0+bnVtZ2JpdHMgPDwgNSksCisgICAgICAgICAgICAgICAgICAgICAgICAxKTsgICAvKiBTcWN4ICovCisgICAgICAgICsrcF9kYXRhOworCisgICAgICAgIGZvciAobF9iYW5kX25vID0gMDsgbF9iYW5kX25vIDwgbF9udW1fYmFuZHM7ICsrbF9iYW5kX25vKSB7CisgICAgICAgICAgICBsX2V4cG4gPSAoT1BKX1VJTlQzMilsX3RjY3AtPnN0ZXBzaXplc1tsX2JhbmRfbm9dLmV4cG47CisgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLCBsX2V4cG4gPDwgMywgMSk7ICAgICAgICAvKiBTUHFjeF9pICovCisgICAgICAgICAgICArK3BfZGF0YTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGxfaGVhZGVyX3NpemUgPSAxICsgMiAqIGxfbnVtX2JhbmRzOworCisgICAgICAgIGlmICgqcF9oZWFkZXJfc2l6ZSA8IGxfaGVhZGVyX3NpemUpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3cml0aW5nIFNRY2QgU1FjYyBlbGVtZW50XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLCBsX3RjY3AtPnFudHN0eSArIChsX3RjY3AtPm51bWdiaXRzIDw8IDUpLAorICAgICAgICAgICAgICAgICAgICAgICAgMSk7ICAgLyogU3FjeCAqLworICAgICAgICArK3BfZGF0YTsKKworICAgICAgICBmb3IgKGxfYmFuZF9ubyA9IDA7IGxfYmFuZF9ubyA8IGxfbnVtX2JhbmRzOyArK2xfYmFuZF9ubykgeworICAgICAgICAgICAgbF9leHBuID0gKE9QSl9VSU5UMzIpbF90Y2NwLT5zdGVwc2l6ZXNbbF9iYW5kX25vXS5leHBuOworICAgICAgICAgICAgbF9tYW50ID0gKE9QSl9VSU5UMzIpbF90Y2NwLT5zdGVwc2l6ZXNbbF9iYW5kX25vXS5tYW50OworCisgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMocF9kYXRhLCAobF9leHBuIDw8IDExKSArIGxfbWFudCwgMik7ICAgIC8qIFNQcWN4X2kgKi8KKyAgICAgICAgICAgIHBfZGF0YSArPSAyOworICAgICAgICB9CisgICAgfQorCisgICAgKnBfaGVhZGVyX3NpemUgPSAqcF9oZWFkZXJfc2l6ZSAtIGxfaGVhZGVyX3NpemU7CisKKyAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3JlYWRfU1FjZF9TUWNjKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29tcF9ubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgIC8qIGxvb3AqLworICAgIE9QSl9VSU5UMzIgbF9iYW5kX25vOworICAgIG9wal9jcF90ICpsX2NwID0gMDA7CisgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOworICAgIG9wal90Y2NwX3QgKmxfdGNjcCA9IDAwOworICAgIE9QSl9CWVRFICogbF9jdXJyZW50X3B0ciA9IDAwOworICAgIE9QSl9VSU5UMzIgbF90bXAsIGxfbnVtX2JhbmQ7CisKKyAgICAvKiBwcmVjb25kaXRpb25zKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKKworICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKKyAgICAvKiBjb21lIGZyb20gdGlsZSBwYXJ0IGhlYWRlciBvciBtYWluIGhlYWRlciA/Ki8KKyAgICBsX3RjcCA9IChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfVFBIKQorICAgICAgICAgICAgPworICAgICAgICAgICAgJmxfY3AtPnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0gOgorICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3A7CisKKyAgICAvKiBwcmVjb25kaXRpb24gYWdhaW4qLworICAgIGlmIChwX2NvbXBfbm8gPj0gIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgbF90Y2NwID0gJmxfdGNwLT50Y2Nwc1twX2NvbXBfbm9dOworICAgIGxfY3VycmVudF9wdHIgPSBwX2hlYWRlcl9kYXRhOworCisgICAgaWYgKCpwX2hlYWRlcl9zaXplIDwgMSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3IgcmVhZGluZyBTUWNkIG9yIFNRY2MgZWxlbWVudFxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgICpwX2hlYWRlcl9zaXplIC09IDE7CisKKyAgICBvcGpfcmVhZF9ieXRlcyhsX2N1cnJlbnRfcHRyLCAmbF90bXAsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgLyogU3FjeCAqLworICAgICsrbF9jdXJyZW50X3B0cjsKKworICAgIGxfdGNjcC0+cW50c3R5ID0gbF90bXAgJiAweDFmOworICAgIGxfdGNjcC0+bnVtZ2JpdHMgPSBsX3RtcCA+PiA1OworICAgIGlmIChsX3RjY3AtPnFudHN0eSA9PSBKMktfQ0NQX1FOVFNUWV9TSVFOVCkgewogICAgICAgICBsX251bV9iYW5kID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBsX251bV9iYW5kID0gKGxfdGNjcC0+cW50c3R5ID09IEoyS19DQ1BfUU5UU1RZX05PUU5UKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKnBfaGVhZGVyX3NpemUpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICgqcF9oZWFkZXJfc2l6ZSkgLyAyOworICAgIH0gZWxzZSB7CisgICAgICAgIGxfbnVtX2JhbmQgPSAobF90Y2NwLT5xbnRzdHkgPT0gSjJLX0NDUF9RTlRTVFlfTk9RTlQpID8KKyAgICAgICAgICAgICAgICAgICAgICgqcF9oZWFkZXJfc2l6ZSkgOgorICAgICAgICAgICAgICAgICAgICAgKCpwX2hlYWRlcl9zaXplKSAvIDI7CiAKLSAgICAgICAgICAgICAgICBpZiggbF9udW1fYmFuZCA+IE9QSl9KMktfTUFYQkFORFMgKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJXaGlsZSByZWFkaW5nIENDUF9RTlRTVFkgZWxlbWVudCBpbnNpZGUgUUNEIG9yIFFDQyBtYXJrZXIgc2VnbWVudCwgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtYmVyIG9mIHN1YmJhbmRzICglZCkgaXMgZ3JlYXRlciB0byBPUEpfSjJLX01BWEJBTkRTICglZCkuIFNvIHdlIGxpbWl0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgc3RvcmVkIHRvICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9QSl9KMktfTUFYQkFORFMgKCVkKSBhbmQgc2tpcCB0aGUgcmVzdC4gXG4iLCBsX251bV9iYW5kLCBPUEpfSjJLX01BWEJBTkRTLCBPUEpfSjJLX01BWEJBTkRTKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qcmV0dXJuIE9QSl9GQUxTRTsqLwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGxfbnVtX2JhbmQgPiBPUEpfSjJLX01BWEJBTkRTKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJXaGlsZSByZWFkaW5nIENDUF9RTlRTVFkgZWxlbWVudCBpbnNpZGUgUUNEIG9yIFFDQyBtYXJrZXIgc2VnbWVudCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtYmVyIG9mIHN1YmJhbmRzICglZCkgaXMgZ3JlYXRlciB0byBPUEpfSjJLX01BWEJBTkRTICglZCkuIFNvIHdlIGxpbWl0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgc3RvcmVkIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk9QSl9KMktfTUFYQkFORFMgKCVkKSBhbmQgc2tpcCB0aGUgcmVzdC4gXG4iLCBsX251bV9iYW5kLCBPUEpfSjJLX01BWEJBTkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSjJLX01BWEJBTkRTKTsKKyAgICAgICAgICAgIC8qcmV0dXJuIE9QSl9GQUxTRTsqLwogICAgICAgICB9CisgICAgfQogCiAjaWZkZWYgVVNFX0pQV0wKLSAgICAgICAgaWYgKGxfY3AtPmNvcnJlY3QpIHsKKyAgICBpZiAobF9jcC0+Y29ycmVjdCkgewogCi0gICAgICAgICAgICAgICAgLyogaWYgSlBXTCBpcyBvbiwgd2UgY2hlY2sgd2hldGhlciB0aGVyZSBhcmUgdG9vIG1hbnkgc3ViYmFuZHMgKi8KLSAgICAgICAgICAgICAgICBpZiAoLyoobF9udW1fYmFuZCA8IDApIHx8Ki8gKGxfbnVtX2JhbmQgPj0gT1BKX0oyS19NQVhCQU5EUykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBKUFdMX0FTU1VNRSA/IEVWVF9XQVJOSU5HIDogRVZUX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSlBXTDogYmFkIG51bWJlciBvZiBzdWJiYW5kcyBpbiBTcWN4ICglZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbnVtX2JhbmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFKUFdMX0FTU1VNRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSlBXTDogZ2l2aW5nIHVwXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIHRyeSB0byBjb3JyZWN0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBsX251bV9iYW5kID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIi0gdHJ5aW5nIHRvIGFkanVzdCB0aGVtXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItIHNldHRpbmcgbnVtYmVyIG9mIGJhbmRzIHRvICVkID0+IEhZUE9USEVTSVMhISFcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbnVtX2JhbmQpOwotICAgICAgICAgICAgICAgIH07Ci0KKyAgICAgICAgLyogaWYgSlBXTCBpcyBvbiwgd2UgY2hlY2sgd2hldGhlciB0aGVyZSBhcmUgdG9vIG1hbnkgc3ViYmFuZHMgKi8KKyAgICAgICAgaWYgKC8qKGxfbnVtX2JhbmQgPCAwKSB8fCovIChsX251bV9iYW5kID49IE9QSl9KMktfTUFYQkFORFMpKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgSlBXTF9BU1NVTUUgPyBFVlRfV0FSTklORyA6IEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQV0w6IGJhZCBudW1iZXIgb2Ygc3ViYmFuZHMgaW4gU3FjeCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsX251bV9iYW5kKTsKKyAgICAgICAgICAgIGlmICghSlBXTF9BU1NVTUUpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSlBXTDogZ2l2aW5nIHVwXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogd2UgdHJ5IHRvIGNvcnJlY3QgKi8KKyAgICAgICAgICAgIGxfbnVtX2JhbmQgPSAxOworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiLSB0cnlpbmcgdG8gYWRqdXN0IHRoZW1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIi0gc2V0dGluZyBudW1iZXIgb2YgYmFuZHMgdG8gJWQgPT4gSFlQT1RIRVNJUyEhIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbF9udW1fYmFuZCk7CiAgICAgICAgIH07CisKKyAgICB9OwogI2VuZGlmIC8qIFVTRV9KUFdMICovCiAKLSAgICAgICAgaWYgKGxfdGNjcC0+cW50c3R5ID09IEoyS19DQ1BfUU5UU1RZX05PUU5UKSB7Ci0gICAgICAgICAgICAgICAgZm9yICAgICAobF9iYW5kX25vID0gMDsgbF9iYW5kX25vIDwgbF9udW1fYmFuZDsgbF9iYW5kX25vKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKGxfY3VycmVudF9wdHIsICZsX3RtcCAsMSk7ICAgICAgICAgICAgICAgICAgICAgICAvKiBTUHFjeF9pICovCi0gICAgICAgICAgICAgICAgICAgICAgICArK2xfY3VycmVudF9wdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9iYW5kX25vIDwgT1BKX0oyS19NQVhCQU5EUyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNjcC0+c3RlcHNpemVzW2xfYmFuZF9ub10uZXhwbiA9IChPUEpfSU5UMzIpKGxfdG1wID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjY3AtPnN0ZXBzaXplc1tsX2JhbmRfbm9dLm1hbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqcF9oZWFkZXJfc2l6ZSA9ICpwX2hlYWRlcl9zaXplIC0gbF9udW1fYmFuZDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgICAgIChsX2JhbmRfbm8gPSAwOyBsX2JhbmRfbm8gPCBsX251bV9iYW5kOyBsX2JhbmRfbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMobF9jdXJyZW50X3B0ciwgJmxfdG1wICwyKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFNQcWN4X2kgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9wdHIrPTI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9iYW5kX25vIDwgT1BKX0oyS19NQVhCQU5EUyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNjcC0+c3RlcHNpemVzW2xfYmFuZF9ub10uZXhwbiA9IChPUEpfSU5UMzIpKGxfdG1wID4+IDExKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90Y2NwLT5zdGVwc2l6ZXNbbF9iYW5kX25vXS5tYW50ID0gbF90bXAgJiAweDdmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKnBfaGVhZGVyX3NpemUgPSAqcF9oZWFkZXJfc2l6ZSAtIDIqbF9udW1fYmFuZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEFkZCBBbnRvbmluIDogaWYgc2NhbGFyX2Rlcml2ZWQgLT4gY29tcHV0ZSBvdGhlciBzdGVwc2l6ZXMgKi8KLSAgICAgICAgaWYgKGxfdGNjcC0+cW50c3R5ID09IEoyS19DQ1BfUU5UU1RZX1NJUU5UKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChsX2JhbmRfbm8gPSAxOyBsX2JhbmRfbm8gPCBPUEpfSjJLX01BWEJBTkRTOyBsX2JhbmRfbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgbF90Y2NwLT5zdGVwc2l6ZXNbbF9iYW5kX25vXS5leHBuID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChPUEpfSU5UMzIpKGxfdGNjcC0+c3RlcHNpemVzWzBdLmV4cG4pIC0gKE9QSl9JTlQzMikoKGxfYmFuZF9ubyAtIDEpIC8gMykgPiAwKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMikobF90Y2NwLT5zdGVwc2l6ZXNbMF0uZXhwbikgLSAoT1BKX0lOVDMyKSgobF9iYW5kX25vIC0gMSkgLyAzKSA6IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3RjY3AtPnN0ZXBzaXplc1tsX2JhbmRfbm9dLm1hbnQgPSBsX3RjY3AtPnN0ZXBzaXplc1swXS5tYW50OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotc3RhdGljIHZvaWQgb3BqX2oya19jb3B5X3RpbGVfcXVhbnRpemF0aW9uX3BhcmFtZXRlcnMoIG9wal9qMmtfdCAqcF9qMmsgKQotewotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIG9wal9jcF90ICpsX2NwID0gTlVMTDsKLSAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IE5VTEw7Ci0gICAgICAgIG9wal90Y2NwX3QgKmxfcmVmX3RjY3AgPSBOVUxMOwotICAgICAgICBvcGpfdGNjcF90ICpsX2NvcGllZF90Y2NwID0gTlVMTDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3NpemU7Ci0KLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotCi0gICAgICAgIGxfY3AgPSAmKHBfajJrLT5tX2NwKTsKLSAgICAgICAgbF90Y3AgPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfVFBIID8KLSAgICAgICAgICAgICAgICAgICAgICAgICZsX2NwLT50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdIDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOwotCi0gICAgICAgIGxfcmVmX3RjY3AgPSAmbF90Y3AtPnRjY3BzWzBdOwotICAgICAgICBsX2NvcGllZF90Y2NwID0gbF9yZWZfdGNjcCArIDE7Ci0gICAgICAgIGxfc2l6ZSA9IE9QSl9KMktfTUFYQkFORFMgKiBzaXplb2Yob3BqX3N0ZXBzaXplX3QpOwotCi0gICAgICAgIGZvciAgICAgKGk9MTtpPHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOysraSkgewotICAgICAgICAgICAgICAgIGxfY29waWVkX3RjY3AtPnFudHN0eSA9IGxfcmVmX3RjY3AtPnFudHN0eTsKLSAgICAgICAgICAgICAgICBsX2NvcGllZF90Y2NwLT5udW1nYml0cyA9IGxfcmVmX3RjY3AtPm51bWdiaXRzOwotICAgICAgICAgICAgICAgIG1lbWNweShsX2NvcGllZF90Y2NwLT5zdGVwc2l6ZXMsbF9yZWZfdGNjcC0+c3RlcHNpemVzLGxfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgKytsX2NvcGllZF90Y2NwOwotICAgICAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIG9wal9qMmtfZHVtcF90aWxlX2luZm8oIG9wal90Y3BfdCAqIGxfZGVmYXVsdF90aWxlLE9QSl9JTlQzMiBudW1jb21wcyxGSUxFKiBvdXRfc3RyZWFtKQotewotICAgICAgICBpZiAobF9kZWZhdWx0X3RpbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgY29tcG5vOwotCi0gICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHQgZGVmYXVsdCB0aWxlIHtcbiIpOwotICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHQgY3N0eT0lI3hcbiIsIGxfZGVmYXVsdF90aWxlLT5jc3R5KTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0IHByZz0lI3hcbiIsIGxfZGVmYXVsdF90aWxlLT5wcmcpOwotICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHQgbnVtbGF5ZXJzPSVkXG4iLCBsX2RlZmF1bHRfdGlsZS0+bnVtbGF5ZXJzKTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0IG1jdD0leFxuIiwgbF9kZWZhdWx0X3RpbGUtPm1jdCk7Ci0KLSAgICAgICAgICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IG51bWNvbXBzOyBjb21wbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjY3BfdCAqbF90Y2NwID0gJihsX2RlZmF1bHRfdGlsZS0+dGNjcHNbY29tcG5vXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHJlc25vOwotICAgICAgT1BKX0lOVDMyIGJhbmRubywgbnVtYmFuZHM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGluZyBzdHlsZSovCi0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0IGNvbXAgJWQge1xuIiwgY29tcG5vKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHRcdCBjc3R5PSUjeFxuIiwgbF90Y2NwLT5jc3R5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHRcdCBudW1yZXNvbHV0aW9ucz0lZFxuIiwgbF90Y2NwLT5udW1yZXNvbHV0aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0XHQgY2Jsa3c9Ml4lZFxuIiwgbF90Y2NwLT5jYmxrdyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0XHQgY2Jsa2g9Ml4lZFxuIiwgbF90Y2NwLT5jYmxraCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0XHQgY2Jsa3N0eT0lI3hcbiIsIGxfdGNjcC0+Y2Jsa3N0eSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0XHQgcW1mYmlkPSVkXG4iLCBsX3RjY3AtPnFtZmJpZCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHRcdCBwcmVjY2ludHNpemUgKHcsaCk9Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHJlc25vID0gMDsgcmVzbm8gPCBsX3RjY3AtPm51bXJlc29sdXRpb25zOyByZXNubysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIiglZCwlZCkgIiwgbF90Y2NwLT5wcmN3W3Jlc25vXSwgbF90Y2NwLT5wcmNoW3Jlc25vXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcbiIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBxdWFudGl6YXRpb24gc3R5bGUqLwotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHRcdFx0IHFudHN0eT0lZFxuIiwgbF90Y2NwLT5xbnRzdHkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHRcdFx0IG51bWdiaXRzPSVkXG4iLCBsX3RjY3AtPm51bWdiaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHRcdCBzdGVwc2l6ZXMgKG0sZSk9Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBudW1iYW5kcyA9IChsX3RjY3AtPnFudHN0eSA9PSBKMktfQ0NQX1FOVFNUWV9TSVFOVCkgPyAxIDogKE9QSl9JTlQzMilsX3RjY3AtPm51bXJlc29sdXRpb25zICogMyAtIDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IG51bWJhbmRzOyBiYW5kbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICIoJWQsJWQpICIsIGxfdGNjcC0+c3RlcHNpemVzW2JhbmRub10ubWFudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjY3AtPnN0ZXBzaXplc1tiYW5kbm9dLmV4cG4pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXG4iKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogUkdOIHZhbHVlKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHRcdCByb2lzaGlmdD0lZFxuIiwgbF90Y2NwLT5yb2lzaGlmdCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHQgfVxuIik7Ci0gICAgICAgICAgICAgICAgfSAvKmVuZCBvZiBjb21wb25lbnQgb2YgZGVmYXVsdCB0aWxlKi8KLSAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdCB9XG4iKTsgLyplbmQgb2YgZGVmYXVsdCB0aWxlKi8KKyAgICBpZiAobF90Y2NwLT5xbnRzdHkgPT0gSjJLX0NDUF9RTlRTVFlfTk9RTlQpIHsKKyAgICAgICAgZm9yIChsX2JhbmRfbm8gPSAwOyBsX2JhbmRfbm8gPCBsX251bV9iYW5kOyBsX2JhbmRfbm8rKykgeworICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMobF9jdXJyZW50X3B0ciwgJmxfdG1wLCAxKTsgICAgICAgICAgICAgICAgICAgICAgIC8qIFNQcWN4X2kgKi8KKyAgICAgICAgICAgICsrbF9jdXJyZW50X3B0cjsKKyAgICAgICAgICAgIGlmIChsX2JhbmRfbm8gPCBPUEpfSjJLX01BWEJBTkRTKSB7CisgICAgICAgICAgICAgICAgbF90Y2NwLT5zdGVwc2l6ZXNbbF9iYW5kX25vXS5leHBuID0gKE9QSl9JTlQzMikobF90bXAgPj4gMyk7CisgICAgICAgICAgICAgICAgbF90Y2NwLT5zdGVwc2l6ZXNbbF9iYW5kX25vXS5tYW50ID0gMDsKICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqcF9oZWFkZXJfc2l6ZSA9ICpwX2hlYWRlcl9zaXplIC0gbF9udW1fYmFuZDsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGxfYmFuZF9ubyA9IDA7IGxfYmFuZF9ubyA8IGxfbnVtX2JhbmQ7IGxfYmFuZF9ubysrKSB7CisgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhsX2N1cnJlbnRfcHRyLCAmbF90bXAsIDIpOyAgICAgICAgICAgICAgICAgICAgICAgLyogU1BxY3hfaSAqLworICAgICAgICAgICAgbF9jdXJyZW50X3B0ciArPSAyOworICAgICAgICAgICAgaWYgKGxfYmFuZF9ubyA8IE9QSl9KMktfTUFYQkFORFMpIHsKKyAgICAgICAgICAgICAgICBsX3RjY3AtPnN0ZXBzaXplc1tsX2JhbmRfbm9dLmV4cG4gPSAoT1BKX0lOVDMyKShsX3RtcCA+PiAxMSk7CisgICAgICAgICAgICAgICAgbF90Y2NwLT5zdGVwc2l6ZXNbbF9iYW5kX25vXS5tYW50ID0gbF90bXAgJiAweDdmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqcF9oZWFkZXJfc2l6ZSA9ICpwX2hlYWRlcl9zaXplIC0gMiAqIGxfbnVtX2JhbmQ7CisgICAgfQorCisgICAgLyogQWRkIEFudG9uaW4gOiBpZiBzY2FsYXJfZGVyaXZlZCAtPiBjb21wdXRlIG90aGVyIHN0ZXBzaXplcyAqLworICAgIGlmIChsX3RjY3AtPnFudHN0eSA9PSBKMktfQ0NQX1FOVFNUWV9TSVFOVCkgeworICAgICAgICBmb3IgKGxfYmFuZF9ubyA9IDE7IGxfYmFuZF9ubyA8IE9QSl9KMktfTUFYQkFORFM7IGxfYmFuZF9ubysrKSB7CisgICAgICAgICAgICBsX3RjY3AtPnN0ZXBzaXplc1tsX2JhbmRfbm9dLmV4cG4gPQorICAgICAgICAgICAgICAgICgoT1BKX0lOVDMyKShsX3RjY3AtPnN0ZXBzaXplc1swXS5leHBuKSAtIChPUEpfSU5UMzIpKChsX2JhbmRfbm8gLSAxKSAvIDMpID4gMCkKKyAgICAgICAgICAgICAgICA/CisgICAgICAgICAgICAgICAgKE9QSl9JTlQzMikobF90Y2NwLT5zdGVwc2l6ZXNbMF0uZXhwbikgLSAoT1BKX0lOVDMyKSgobF9iYW5kX25vIC0gMSkgLyAzKSA6IDA7CisgICAgICAgICAgICBsX3RjY3AtPnN0ZXBzaXplc1tsX2JhbmRfbm9dLm1hbnQgPSBsX3RjY3AtPnN0ZXBzaXplc1swXS5tYW50OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi12b2lkIGoya19kdW1wIChvcGpfajJrX3QqIHBfajJrLCBPUEpfSU5UMzIgZmxhZywgRklMRSogb3V0X3N0cmVhbSkKK3N0YXRpYyB2b2lkIG9wal9qMmtfY29weV90aWxlX3F1YW50aXphdGlvbl9wYXJhbWV0ZXJzKG9wal9qMmtfdCAqcF9qMmspCiB7Ci0gICAgICAgIC8qIENoZWNrIGlmIHRoZSBmbGFnIGlzIGNvbXBhdGlibGUgd2l0aCBqMmsgZmlsZSovCi0gICAgICAgIGlmICggKGZsYWcgJiBPUEpfSlAyX0lORk8pIHx8IChmbGFnICYgT1BKX0pQMl9JTkQpKXsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJXcm9uZyBmbGFnXG4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICBPUEpfVUlOVDMyIGk7CisgICAgb3BqX2NwX3QgKmxfY3AgPSBOVUxMOworICAgIG9wal90Y3BfdCAqbF90Y3AgPSBOVUxMOworICAgIG9wal90Y2NwX3QgKmxfcmVmX3RjY3AgPSBOVUxMOworICAgIG9wal90Y2NwX3QgKmxfY29waWVkX3RjY3AgPSBOVUxMOworICAgIE9QSl9VSU5UMzIgbF9zaXplOwogCi0gICAgICAgIC8qIER1bXAgdGhlIGltYWdlX2hlYWRlciAqLwotICAgICAgICBpZiAoZmxhZyAmIE9QSl9JTUdfSU5GTyl7Ci0gICAgICAgICAgICAgICAgaWYgKHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpCi0gICAgICAgICAgICAgICAgICAgICAgICBqMmtfZHVtcF9pbWFnZV9oZWFkZXIocF9qMmstPm1fcHJpdmF0ZV9pbWFnZSwgMCwgb3V0X3N0cmVhbSk7Ci0gICAgICAgIH0KKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKIAotICAgICAgICAvKiBEdW1wIHRoZSBjb2Rlc3RyZWFtIGluZm8gZnJvbSBtYWluIGhlYWRlciAqLwotICAgICAgICBpZiAoZmxhZyAmIE9QSl9KMktfTUhfSU5GTyl7Ci0gICAgICAgICAgICAgICAgb3BqX2oya19kdW1wX01IX2luZm8ocF9qMmssIG91dF9zdHJlYW0pOwotICAgICAgICB9Ci0gICAgICAgIC8qIER1bXAgYWxsIHRpbGUvY29kZXN0cmVhbSBpbmZvICovCi0gICAgICAgIGlmIChmbGFnICYgT1BKX0oyS19UQ0hfSU5GTyl7Ci0gICAgICAgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzID0gcF9qMmstPm1fY3AudGggKiBwX2oyay0+bV9jcC50dzsKLSAgICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgICAgb3BqX3RjcF90ICogbF90Y3AgPSBwX2oyay0+bV9jcC50Y3BzOwotICAgICAgICAgIGZvciAoaT0wO2k8bF9uYl90aWxlczsrK2kpIHsKLSAgICAgICAgICAgIG9wal9qMmtfZHVtcF90aWxlX2luZm8oIGxfdGNwLChPUEpfSU5UMzIpcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMsIG91dF9zdHJlYW0pOwotICAgICAgICAgICAgKytsX3RjcDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7CisgICAgbF90Y3AgPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfVFBIID8KKyAgICAgICAgICAgICZsX2NwLT50Y3BzW3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXJdIDoKKyAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOwogCi0gICAgICAgIC8qIER1bXAgdGhlIGNvZGVzdHJlYW0gaW5mbyBvZiB0aGUgY3VycmVudCB0aWxlICovCi0gICAgICAgIGlmIChmbGFnICYgT1BKX0oyS19USF9JTkZPKXsKKyAgICBsX3JlZl90Y2NwID0gJmxfdGNwLT50Y2Nwc1swXTsKKyAgICBsX2NvcGllZF90Y2NwID0gbF9yZWZfdGNjcCArIDE7CisgICAgbF9zaXplID0gT1BKX0oyS19NQVhCQU5EUyAqIHNpemVvZihvcGpfc3RlcHNpemVfdCk7CiAKKyAgICBmb3IgKGkgPSAxOyBpIDwgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHM7ICsraSkgeworICAgICAgICBsX2NvcGllZF90Y2NwLT5xbnRzdHkgPSBsX3JlZl90Y2NwLT5xbnRzdHk7CisgICAgICAgIGxfY29waWVkX3RjY3AtPm51bWdiaXRzID0gbF9yZWZfdGNjcC0+bnVtZ2JpdHM7CisgICAgICAgIG1lbWNweShsX2NvcGllZF90Y2NwLT5zdGVwc2l6ZXMsIGxfcmVmX3RjY3AtPnN0ZXBzaXplcywgbF9zaXplKTsKKyAgICAgICAgKytsX2NvcGllZF90Y2NwOworICAgIH0KK30KKworc3RhdGljIHZvaWQgb3BqX2oya19kdW1wX3RpbGVfaW5mbyhvcGpfdGNwX3QgKiBsX2RlZmF1bHRfdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIG51bWNvbXBzLCBGSUxFKiBvdXRfc3RyZWFtKQoreworICAgIGlmIChsX2RlZmF1bHRfdGlsZSkgeworICAgICAgICBPUEpfSU5UMzIgY29tcG5vOworCisgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0IGRlZmF1bHQgdGlsZSB7XG4iKTsKKyAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHRcdCBjc3R5PSUjeFxuIiwgbF9kZWZhdWx0X3RpbGUtPmNzdHkpOworICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0IHByZz0lI3hcbiIsIGxfZGVmYXVsdF90aWxlLT5wcmcpOworICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0IG51bWxheWVycz0lZFxuIiwgbF9kZWZhdWx0X3RpbGUtPm51bWxheWVycyk7CisgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHQgbWN0PSV4XG4iLCBsX2RlZmF1bHRfdGlsZS0+bWN0KTsKKworICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IG51bWNvbXBzOyBjb21wbm8rKykgeworICAgICAgICAgICAgb3BqX3RjY3BfdCAqbF90Y2NwID0gJihsX2RlZmF1bHRfdGlsZS0+dGNjcHNbY29tcG5vXSk7CisgICAgICAgICAgICBPUEpfVUlOVDMyIHJlc25vOworICAgICAgICAgICAgT1BKX0lOVDMyIGJhbmRubywgbnVtYmFuZHM7CisKKyAgICAgICAgICAgIC8qIGNvZGluZyBzdHlsZSovCisgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0IGNvbXAgJWQge1xuIiwgY29tcG5vKTsKKyAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHRcdCBjc3R5PSUjeFxuIiwgbF90Y2NwLT5jc3R5KTsKKyAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHRcdCBudW1yZXNvbHV0aW9ucz0lZFxuIiwgbF90Y2NwLT5udW1yZXNvbHV0aW9ucyk7CisgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0XHQgY2Jsa3c9Ml4lZFxuIiwgbF90Y2NwLT5jYmxrdyk7CisgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0XHQgY2Jsa2g9Ml4lZFxuIiwgbF90Y2NwLT5jYmxraCk7CisgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0XHQgY2Jsa3N0eT0lI3hcbiIsIGxfdGNjcC0+Y2Jsa3N0eSk7CisgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0XHQgcW1mYmlkPSVkXG4iLCBsX3RjY3AtPnFtZmJpZCk7CisKKyAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHRcdCBwcmVjY2ludHNpemUgKHcsaCk9Iik7CisgICAgICAgICAgICBmb3IgKHJlc25vID0gMDsgcmVzbm8gPCBsX3RjY3AtPm51bXJlc29sdXRpb25zOyByZXNubysrKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiKCVkLCVkKSAiLCBsX3RjY3AtPnByY3dbcmVzbm9dLCBsX3RjY3AtPnByY2hbcmVzbm9dKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlxuIik7CisKKyAgICAgICAgICAgIC8qIHF1YW50aXphdGlvbiBzdHlsZSovCisgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0XHQgcW50c3R5PSVkXG4iLCBsX3RjY3AtPnFudHN0eSk7CisgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0XHQgbnVtZ2JpdHM9JWRcbiIsIGxfdGNjcC0+bnVtZ2JpdHMpOworICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHRcdFx0IHN0ZXBzaXplcyAobSxlKT0iKTsKKyAgICAgICAgICAgIG51bWJhbmRzID0gKGxfdGNjcC0+cW50c3R5ID09IEoyS19DQ1BfUU5UU1RZX1NJUU5UKSA/IDEgOgorICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKWxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgKiAzIC0gMjsKKyAgICAgICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgbnVtYmFuZHM7IGJhbmRubysrKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiKCVkLCVkKSAiLCBsX3RjY3AtPnN0ZXBzaXplc1tiYW5kbm9dLm1hbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBsX3RjY3AtPnN0ZXBzaXplc1tiYW5kbm9dLmV4cG4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXG4iKTsKKworICAgICAgICAgICAgLyogUkdOIHZhbHVlKi8KKyAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHRcdCByb2lzaGlmdD0lZFxuIiwgbF90Y2NwLT5yb2lzaGlmdCk7CisKKyAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHQgfVxuIik7CisgICAgICAgIH0gLyplbmQgb2YgY29tcG9uZW50IG9mIGRlZmF1bHQgdGlsZSovCisgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0IH1cbiIpOyAvKmVuZCBvZiBkZWZhdWx0IHRpbGUqLworICAgIH0KK30KKwordm9pZCBqMmtfZHVtcChvcGpfajJrX3QqIHBfajJrLCBPUEpfSU5UMzIgZmxhZywgRklMRSogb3V0X3N0cmVhbSkKK3sKKyAgICAvKiBDaGVjayBpZiB0aGUgZmxhZyBpcyBjb21wYXRpYmxlIHdpdGggajJrIGZpbGUqLworICAgIGlmICgoZmxhZyAmIE9QSl9KUDJfSU5GTykgfHwgKGZsYWcgJiBPUEpfSlAyX0lORCkpIHsKKyAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiV3JvbmcgZmxhZ1xuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBEdW1wIHRoZSBpbWFnZV9oZWFkZXIgKi8KKyAgICBpZiAoZmxhZyAmIE9QSl9JTUdfSU5GTykgeworICAgICAgICBpZiAocF9qMmstPm1fcHJpdmF0ZV9pbWFnZSkgeworICAgICAgICAgICAgajJrX2R1bXBfaW1hZ2VfaGVhZGVyKHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UsIDAsIG91dF9zdHJlYW0pOwogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIC8qIER1bXAgdGhlIGNvZGVzdHJlYW0gaW5kZXggZnJvbSBtYWluIGhlYWRlciAqLwotICAgICAgICBpZiAoZmxhZyAmIE9QSl9KMktfTUhfSU5EKXsKLSAgICAgICAgICAgICAgICBvcGpfajJrX2R1bXBfTUhfaW5kZXgocF9qMmssIG91dF9zdHJlYW0pOworICAgIC8qIER1bXAgdGhlIGNvZGVzdHJlYW0gaW5mbyBmcm9tIG1haW4gaGVhZGVyICovCisgICAgaWYgKGZsYWcgJiBPUEpfSjJLX01IX0lORk8pIHsKKyAgICAgICAgaWYgKHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpIHsKKyAgICAgICAgICAgIG9wal9qMmtfZHVtcF9NSF9pbmZvKHBfajJrLCBvdXRfc3RyZWFtKTsKICAgICAgICAgfQotCi0gICAgICAgIC8qIER1bXAgdGhlIGNvZGVzdHJlYW0gaW5kZXggb2YgdGhlIGN1cnJlbnQgdGlsZSAqLwotICAgICAgICBpZiAoZmxhZyAmIE9QSl9KMktfVEhfSU5EKXsKLQorICAgIH0KKyAgICAvKiBEdW1wIGFsbCB0aWxlL2NvZGVzdHJlYW0gaW5mbyAqLworICAgIGlmIChmbGFnICYgT1BKX0oyS19UQ0hfSU5GTykgeworICAgICAgICBPUEpfVUlOVDMyIGxfbmJfdGlsZXMgPSBwX2oyay0+bV9jcC50aCAqIHBfajJrLT5tX2NwLnR3OworICAgICAgICBPUEpfVUlOVDMyIGk7CisgICAgICAgIG9wal90Y3BfdCAqIGxfdGNwID0gcF9qMmstPm1fY3AudGNwczsKKyAgICAgICAgaWYgKHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsX25iX3RpbGVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBvcGpfajJrX2R1bXBfdGlsZV9pbmZvKGxfdGNwLCAoT1BKX0lOVDMyKXBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X3N0cmVhbSk7CisgICAgICAgICAgICAgICAgKytsX3RjcDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgIH0KKworICAgIC8qIER1bXAgdGhlIGNvZGVzdHJlYW0gaW5mbyBvZiB0aGUgY3VycmVudCB0aWxlICovCisgICAgaWYgKGZsYWcgJiBPUEpfSjJLX1RIX0lORk8pIHsKKworICAgIH0KKworICAgIC8qIER1bXAgdGhlIGNvZGVzdHJlYW0gaW5kZXggZnJvbSBtYWluIGhlYWRlciAqLworICAgIGlmIChmbGFnICYgT1BKX0oyS19NSF9JTkQpIHsKKyAgICAgICAgb3BqX2oya19kdW1wX01IX2luZGV4KHBfajJrLCBvdXRfc3RyZWFtKTsKKyAgICB9CisKKyAgICAvKiBEdW1wIHRoZSBjb2Rlc3RyZWFtIGluZGV4IG9mIHRoZSBjdXJyZW50IHRpbGUgKi8KKyAgICBpZiAoZmxhZyAmIE9QSl9KMktfVEhfSU5EKSB7CisKKyAgICB9CiAKIH0KIAogc3RhdGljIHZvaWQgb3BqX2oya19kdW1wX01IX2luZGV4KG9wal9qMmtfdCogcF9qMmssIEZJTEUqIG91dF9zdHJlYW0pCiB7Ci0gICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZGV4X3QqIGNzdHJfaW5kZXggPSBwX2oyay0+Y3N0cl9pbmRleDsKLSAgICAgICAgT1BKX1VJTlQzMiBpdF9tYXJrZXIsIGl0X3RpbGUsIGl0X3RpbGVfcGFydDsKKyAgICBvcGpfY29kZXN0cmVhbV9pbmRleF90KiBjc3RyX2luZGV4ID0gcF9qMmstPmNzdHJfaW5kZXg7CisgICAgT1BKX1VJTlQzMiBpdF9tYXJrZXIsIGl0X3RpbGUsIGl0X3RpbGVfcGFydDsKIAotICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJDb2Rlc3RyZWFtIGluZGV4IGZyb20gbWFpbiBoZWFkZXI6IHtcbiIpOworICAgIGZwcmludGYob3V0X3N0cmVhbSwgIkNvZGVzdHJlYW0gaW5kZXggZnJvbSBtYWluIGhlYWRlcjoge1xuIik7CiAKLSAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHQgTWFpbiBoZWFkZXIgc3RhcnQgcG9zaXRpb249JSIgUFJJaTY0ICJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdCBNYWluIGhlYWRlciBlbmQgcG9zaXRpb249JSIgUFJJaTY0ICJcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT5tYWluX2hlYWRfc3RhcnQsIGNzdHJfaW5kZXgtPm1haW5faGVhZF9lbmQpOworICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0IE1haW4gaGVhZGVyIHN0YXJ0IHBvc2l0aW9uPSUiIFBSSWk2NCAiXG4iCisgICAgICAgICAgICAiXHQgTWFpbiBoZWFkZXIgZW5kIHBvc2l0aW9uPSUiIFBSSWk2NCAiXG4iLAorICAgICAgICAgICAgY3N0cl9pbmRleC0+bWFpbl9oZWFkX3N0YXJ0LCBjc3RyX2luZGV4LT5tYWluX2hlYWRfZW5kKTsKIAotICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdCBNYXJrZXIgbGlzdDoge1xuIik7CisgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHQgTWFya2VyIGxpc3Q6IHtcbiIpOwogCi0gICAgICAgIGlmIChjc3RyX2luZGV4LT5tYXJrZXIpewotICAgICAgICAgICAgICAgIGZvciAoaXRfbWFya2VyPTA7IGl0X21hcmtlciA8IGNzdHJfaW5kZXgtPm1hcmtudW0gOyBpdF9tYXJrZXIrKyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0IHR5cGU9JSN4LCBwb3M9JSIgUFJJaTY0ICIsIGxlbj0lZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT5tYXJrZXJbaXRfbWFya2VyXS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPm1hcmtlcltpdF9tYXJrZXJdLnBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT5tYXJrZXJbaXRfbWFya2VyXS5sZW4gKTsKLSAgICAgICAgICAgICAgICB9CisgICAgaWYgKGNzdHJfaW5kZXgtPm1hcmtlcikgeworICAgICAgICBmb3IgKGl0X21hcmtlciA9IDA7IGl0X21hcmtlciA8IGNzdHJfaW5kZXgtPm1hcmtudW0gOyBpdF9tYXJrZXIrKykgeworICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHRcdCB0eXBlPSUjeCwgcG9zPSUiIFBSSWk2NCAiLCBsZW49JWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPm1hcmtlcltpdF9tYXJrZXJdLnR5cGUsCisgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPm1hcmtlcltpdF9tYXJrZXJdLnBvcywKKyAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+bWFya2VyW2l0X21hcmtlcl0ubGVuKTsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdCB9XG4iKTsKKyAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdCB9XG4iKTsKIAotICAgICAgICBpZiAoY3N0cl9pbmRleC0+dGlsZV9pbmRleCl7CisgICAgaWYgKGNzdHJfaW5kZXgtPnRpbGVfaW5kZXgpIHsKIAogICAgICAgICAvKiBTaW1wbGUgdGVzdCB0byBhdm9pZCB0byB3cml0ZSBlbXB0eSBpbmZvcm1hdGlvbiovCiAgICAgICAgIE9QSl9VSU5UMzIgbF9hY2NfbmJfb2ZfdGlsZV9wYXJ0ID0gMDsKLSAgICAgICAgZm9yIChpdF90aWxlPTA7IGl0X3RpbGUgPCBjc3RyX2luZGV4LT5uYl9vZl90aWxlcyA7IGl0X3RpbGUrKyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX2FjY19uYl9vZl90aWxlX3BhcnQgKz0gY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5uYl90cHM7CisgICAgICAgIGZvciAoaXRfdGlsZSA9IDA7IGl0X3RpbGUgPCBjc3RyX2luZGV4LT5uYl9vZl90aWxlcyA7IGl0X3RpbGUrKykgeworICAgICAgICAgICAgbF9hY2NfbmJfb2ZfdGlsZV9wYXJ0ICs9IGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubmJfdHBzOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGxfYWNjX25iX29mX3RpbGVfcGFydCkKLSAgICAgICAgeworICAgICAgICBpZiAobF9hY2NfbmJfb2ZfdGlsZV9wYXJ0KSB7CiAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdCBUaWxlIGluZGV4OiB7XG4iKTsKIAotICAgICAgICAgICAgICAgICAgICBmb3IgKGl0X3RpbGU9MDsgaXRfdGlsZSA8IGNzdHJfaW5kZXgtPm5iX29mX3RpbGVzIDsgaXRfdGlsZSsrKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG5iX29mX3RpbGVfcGFydCA9IGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubmJfdHBzOworICAgICAgICAgICAgZm9yIChpdF90aWxlID0gMDsgaXRfdGlsZSA8IGNzdHJfaW5kZXgtPm5iX29mX3RpbGVzIDsgaXRfdGlsZSsrKSB7CisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBuYl9vZl90aWxlX3BhcnQgPSBjc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm5iX3RwczsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHQgbmIgb2YgdGlsZS1wYXJ0IGluIHRpbGUgWyVkXT0lZFxuIiwgaXRfdGlsZSwgbmJfb2ZfdGlsZV9wYXJ0KTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0IG5iIG9mIHRpbGUtcGFydCBpbiB0aWxlIFslZF09JWRcbiIsIGl0X3RpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBuYl9vZl90aWxlX3BhcnQpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpdF90aWxlX3BhcnQgPTA7IGl0X3RpbGVfcGFydCA8IG5iX29mX3RpbGVfcGFydDsgaXRfdGlsZV9wYXJ0KyspewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0XHQgdGlsZS1wYXJ0WyVkXTogc3Rhcl9wb3M9JSIgUFJJaTY0ICIsIGVuZF9oZWFkZXI9JSIgUFJJaTY0ICIsIGVuZF9wb3M9JSIgUFJJaTY0ICIuXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRfdGlsZV9wYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS50cF9pbmRleFtpdF90aWxlX3BhcnRdLnN0YXJ0X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXhbaXRfdGlsZV9wYXJ0XS5lbmRfaGVhZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS50cF9pbmRleFtpdF90aWxlX3BhcnRdLmVuZF9wb3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlcil7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGl0X21hcmtlcj0wOyBpdF9tYXJrZXIgPCBjc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtudW0gOyBpdF9tYXJrZXIrKyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHQgdHlwZT0lI3gsIHBvcz0lIiBQUklpNjQgIiwgbGVuPSVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrZXJbaXRfbWFya2VyXS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrZXJbaXRfbWFya2VyXS5wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlcltpdF9tYXJrZXJdLmxlbiApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS50cF9pbmRleCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGl0X3RpbGVfcGFydCA9IDA7IGl0X3RpbGVfcGFydCA8IG5iX29mX3RpbGVfcGFydDsgaXRfdGlsZV9wYXJ0KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0XHRcdCB0aWxlLXBhcnRbJWRdOiBzdGFyX3Bvcz0lIiBQUklpNjQgIiwgZW5kX2hlYWRlcj0lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklpNjQgIiwgZW5kX3Bvcz0lIiBQUklpNjQgIi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X3RpbGVfcGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS50cF9pbmRleFtpdF90aWxlX3BhcnRdLnN0YXJ0X3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS50cF9pbmRleFtpdF90aWxlX3BhcnRdLmVuZF9oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXhbaXRfdGlsZV9wYXJ0XS5lbmRfcG9zKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sIlx0IH1cbiIpOwotICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCJ9XG4iKTsKKyAgICAgICAgICAgICAgICBpZiAoY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpdF9tYXJrZXIgPSAwOyBpdF9tYXJrZXIgPCBjc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtudW0gOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0X21hcmtlcisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdFx0IHR5cGU9JSN4LCBwb3M9JSIgUFJJaTY0ICIsIGxlbj0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrZXJbaXRfbWFya2VyXS50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlcltpdF9tYXJrZXJdLnBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrZXJbaXRfbWFya2VyXS5sZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHQgfVxuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJ9XG4iKTsKIAogfQogCkBAIC05MzE5LDE1MjMgKzEwMzY2LDE3NTYgQEAKIHN0YXRpYyB2b2lkIG9wal9qMmtfZHVtcF9NSF9pbmZvKG9wal9qMmtfdCogcF9qMmssIEZJTEUqIG91dF9zdHJlYW0pCiB7CiAKLSAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiQ29kZXN0cmVhbSBpbmZvIGZyb20gbWFpbiBoZWFkZXI6IHtcbiIpOworICAgIGZwcmludGYob3V0X3N0cmVhbSwgIkNvZGVzdHJlYW0gaW5mbyBmcm9tIG1haW4gaGVhZGVyOiB7XG4iKTsKIAotICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdCB0eDA9JWQsIHR5MD0lZFxuIiwgcF9qMmstPm1fY3AudHgwLCBwX2oyay0+bV9jcC50eTApOwotICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdCB0ZHg9JWQsIHRkeT0lZFxuIiwgcF9qMmstPm1fY3AudGR4LCBwX2oyay0+bV9jcC50ZHkpOwotICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdCB0dz0lZCwgdGg9JWRcbiIsIHBfajJrLT5tX2NwLnR3LCBwX2oyay0+bV9jcC50aCk7Ci0gICAgICAgIG9wal9qMmtfZHVtcF90aWxlX2luZm8ocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3AsKE9QSl9JTlQzMilwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcywgb3V0X3N0cmVhbSk7Ci0gICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIn1cbiIpOworICAgIGZwcmludGYob3V0X3N0cmVhbSwgIlx0IHR4MD0lZCwgdHkwPSVkXG4iLCBwX2oyay0+bV9jcC50eDAsIHBfajJrLT5tX2NwLnR5MCk7CisgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiXHQgdGR4PSVkLCB0ZHk9JWRcbiIsIHBfajJrLT5tX2NwLnRkeCwgcF9qMmstPm1fY3AudGR5KTsKKyAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJcdCB0dz0lZCwgdGg9JWRcbiIsIHBfajJrLT5tX2NwLnR3LCBwX2oyay0+bV9jcC50aCk7CisgICAgb3BqX2oya19kdW1wX3RpbGVfaW5mbyhwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfSU5UMzIpcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMsIG91dF9zdHJlYW0pOworICAgIGZwcmludGYob3V0X3N0cmVhbSwgIn1cbiIpOwogfQogCi12b2lkIGoya19kdW1wX2ltYWdlX2hlYWRlcihvcGpfaW1hZ2VfdCogaW1nX2hlYWRlciwgT1BKX0JPT0wgZGV2X2R1bXBfZmxhZywgRklMRSogb3V0X3N0cmVhbSkKK3ZvaWQgajJrX2R1bXBfaW1hZ2VfaGVhZGVyKG9wal9pbWFnZV90KiBpbWdfaGVhZGVyLCBPUEpfQk9PTCBkZXZfZHVtcF9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRSogb3V0X3N0cmVhbSkKIHsKLSAgICAgICAgY2hhciB0YWJbMl07CisgICAgY2hhciB0YWJbMl07CiAKLSAgICAgICAgaWYgKGRldl9kdW1wX2ZsYWcpewotICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiW0RFVl0gRHVtcCBhbiBpbWFnZV9oZWFkZXIgc3RydWN0IHtcbiIpOwotICAgICAgICAgICAgICAgIHRhYlswXSA9ICdcMCc7CisgICAgaWYgKGRldl9kdW1wX2ZsYWcpIHsKKyAgICAgICAgZnByaW50ZihzdGRvdXQsICJbREVWXSBEdW1wIGFuIGltYWdlX2hlYWRlciBzdHJ1Y3Qge1xuIik7CisgICAgICAgIHRhYlswXSA9ICdcMCc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiSW1hZ2UgaW5mbyB7XG4iKTsKKyAgICAgICAgdGFiWzBdID0gJ1x0JzsKKyAgICAgICAgdGFiWzFdID0gJ1wwJzsKKyAgICB9CisKKyAgICBmcHJpbnRmKG91dF9zdHJlYW0sICIlcyB4MD0lZCwgeTA9JWRcbiIsIHRhYiwgaW1nX2hlYWRlci0+eDAsIGltZ19oZWFkZXItPnkwKTsKKyAgICBmcHJpbnRmKG91dF9zdHJlYW0sICAgICAiJXMgeDE9JWQsIHkxPSVkXG4iLCB0YWIsIGltZ19oZWFkZXItPngxLAorICAgICAgICAgICAgaW1nX2hlYWRlci0+eTEpOworICAgIGZwcmludGYob3V0X3N0cmVhbSwgIiVzIG51bWNvbXBzPSVkXG4iLCB0YWIsIGltZ19oZWFkZXItPm51bWNvbXBzKTsKKworICAgIGlmIChpbWdfaGVhZGVyLT5jb21wcykgeworICAgICAgICBPUEpfVUlOVDMyIGNvbXBubzsKKyAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBpbWdfaGVhZGVyLT5udW1jb21wczsgY29tcG5vKyspIHsKKyAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIiVzXHQgY29tcG9uZW50ICVkIHtcbiIsIHRhYiwgY29tcG5vKTsKKyAgICAgICAgICAgIGoya19kdW1wX2ltYWdlX2NvbXBfaGVhZGVyKCYoaW1nX2hlYWRlci0+Y29tcHNbY29tcG5vXSksIGRldl9kdW1wX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfc3RyZWFtKTsKKyAgICAgICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIiVzfVxuIiwgdGFiKTsKICAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICJJbWFnZSBpbmZvIHtcbiIpOwotICAgICAgICAgICAgICAgIHRhYlswXSA9ICdcdCc7dGFiWzFdID0gJ1wwJzsKLSAgICAgICAgfQorICAgIH0KIAotICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICIlcyB4MD0lZCwgeTA9JWRcbiIsIHRhYiwgaW1nX2hlYWRlci0+eDAsIGltZ19oZWFkZXItPnkwKTsKLSAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAgICAgIiVzIHgxPSVkLCB5MT0lZFxuIiwgdGFiLCBpbWdfaGVhZGVyLT54MSwgaW1nX2hlYWRlci0+eTEpOwotICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sICIlcyBudW1jb21wcz0lZFxuIiwgdGFiLCBpbWdfaGVhZGVyLT5udW1jb21wcyk7Ci0KLSAgICAgICAgaWYgKGltZ19oZWFkZXItPmNvbXBzKXsKLSAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNvbXBubzsKLSAgICAgICAgICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IGltZ19oZWFkZXItPm51bWNvbXBzOyBjb21wbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiJXNcdCBjb21wb25lbnQgJWQge1xuIiwgdGFiLCBjb21wbm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgajJrX2R1bXBfaW1hZ2VfY29tcF9oZWFkZXIoJihpbWdfaGVhZGVyLT5jb21wc1tjb21wbm9dKSwgZGV2X2R1bXBfZmxhZywgb3V0X3N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKG91dF9zdHJlYW0sIiVzfVxuIix0YWIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIn1cbiIpOworICAgIGZwcmludGYob3V0X3N0cmVhbSwgIn1cbiIpOwogfQogCi12b2lkIGoya19kdW1wX2ltYWdlX2NvbXBfaGVhZGVyKG9wal9pbWFnZV9jb21wX3QqIGNvbXBfaGVhZGVyLCBPUEpfQk9PTCBkZXZfZHVtcF9mbGFnLCBGSUxFKiBvdXRfc3RyZWFtKQordm9pZCBqMmtfZHVtcF9pbWFnZV9jb21wX2hlYWRlcihvcGpfaW1hZ2VfY29tcF90KiBjb21wX2hlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JPT0wgZGV2X2R1bXBfZmxhZywgRklMRSogb3V0X3N0cmVhbSkKIHsKLSAgICAgICAgY2hhciB0YWJbM107CisgICAgY2hhciB0YWJbM107CiAKLSAgICAgICAgaWYgKGRldl9kdW1wX2ZsYWcpewotICAgICAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiW0RFVl0gRHVtcCBhbiBpbWFnZV9jb21wX2hlYWRlciBzdHJ1Y3Qge1xuIik7Ci0gICAgICAgICAgICAgICAgdGFiWzBdID0gJ1wwJzsKLSAgICAgICAgfSAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICB0YWJbMF0gPSAnXHQnO3RhYlsxXSA9ICdcdCc7dGFiWzJdID0gJ1wwJzsKLSAgICAgICAgfQorICAgIGlmIChkZXZfZHVtcF9mbGFnKSB7CisgICAgICAgIGZwcmludGYoc3Rkb3V0LCAiW0RFVl0gRHVtcCBhbiBpbWFnZV9jb21wX2hlYWRlciBzdHJ1Y3Qge1xuIik7CisgICAgICAgIHRhYlswXSA9ICdcMCc7CisgICAgfSAgICAgICBlbHNlIHsKKyAgICAgICAgdGFiWzBdID0gJ1x0JzsKKyAgICAgICAgdGFiWzFdID0gJ1x0JzsKKyAgICAgICAgdGFiWzJdID0gJ1wwJzsKKyAgICB9CiAKLSAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiJXMgZHg9JWQsIGR5PSVkXG4iLCB0YWIsIGNvbXBfaGVhZGVyLT5keCwgY29tcF9oZWFkZXItPmR5KTsKLSAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiJXMgcHJlYz0lZFxuIiwgdGFiLCBjb21wX2hlYWRlci0+cHJlYyk7Ci0gICAgICAgIGZwcmludGYob3V0X3N0cmVhbSwgIiVzIHNnbmQ9JWRcbiIsIHRhYiwgY29tcF9oZWFkZXItPnNnbmQpOworICAgIGZwcmludGYob3V0X3N0cmVhbSwgIiVzIGR4PSVkLCBkeT0lZFxuIiwgdGFiLCBjb21wX2hlYWRlci0+ZHgsIGNvbXBfaGVhZGVyLT5keSk7CisgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiJXMgcHJlYz0lZFxuIiwgdGFiLCBjb21wX2hlYWRlci0+cHJlYyk7CisgICAgZnByaW50ZihvdXRfc3RyZWFtLCAiJXMgc2duZD0lZFxuIiwgdGFiLCBjb21wX2hlYWRlci0+c2duZCk7CiAKLSAgICAgICAgaWYgKGRldl9kdW1wX2ZsYWcpCi0gICAgICAgICAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAifVxuIik7CisgICAgaWYgKGRldl9kdW1wX2ZsYWcpIHsKKyAgICAgICAgZnByaW50ZihvdXRfc3RyZWFtLCAifVxuIik7CisgICAgfQogfQogCiBvcGpfY29kZXN0cmVhbV9pbmZvX3YyX3QqIGoya19nZXRfY3N0cl9pbmZvKG9wal9qMmtfdCogcF9qMmspCiB7Ci0gICAgICAgIE9QSl9VSU5UMzIgY29tcG5vOwotICAgICAgICBPUEpfVUlOVDMyIG51bWNvbXBzID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHM7Ci0gICAgICAgIG9wal90Y3BfdCAqbF9kZWZhdWx0X3RpbGU7Ci0gICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdjJfdCogY3N0cl9pbmZvID0gKG9wal9jb2Rlc3RyZWFtX2luZm9fdjJfdCopIG9wal9jYWxsb2MoMSxzaXplb2Yob3BqX2NvZGVzdHJlYW1faW5mb192Ml90KSk7Ci0JCWlmICghY3N0cl9pbmZvKQotCQkJcmV0dXJuIE5VTEw7CisgICAgT1BKX1VJTlQzMiBjb21wbm87CisgICAgT1BKX1VJTlQzMiBudW1jb21wcyA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOworICAgIG9wal90Y3BfdCAqbF9kZWZhdWx0X3RpbGU7CisgICAgb3BqX2NvZGVzdHJlYW1faW5mb192Ml90KiBjc3RyX2luZm8gPSAob3BqX2NvZGVzdHJlYW1faW5mb192Ml90Kikgb3BqX2NhbGxvYygxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9wal9jb2Rlc3RyZWFtX2luZm9fdjJfdCkpOworICAgIGlmICghY3N0cl9pbmZvKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotICAgICAgICBjc3RyX2luZm8tPm5iY29tcHMgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wczsKKyAgICBjc3RyX2luZm8tPm5iY29tcHMgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wczsKIAotICAgICAgICBjc3RyX2luZm8tPnR4MCA9IHBfajJrLT5tX2NwLnR4MDsKLSAgICAgICAgY3N0cl9pbmZvLT50eTAgPSBwX2oyay0+bV9jcC50eTA7Ci0gICAgICAgIGNzdHJfaW5mby0+dGR4ID0gcF9qMmstPm1fY3AudGR4OwotICAgICAgICBjc3RyX2luZm8tPnRkeSA9IHBfajJrLT5tX2NwLnRkeTsKLSAgICAgICAgY3N0cl9pbmZvLT50dyA9IHBfajJrLT5tX2NwLnR3OwotICAgICAgICBjc3RyX2luZm8tPnRoID0gcF9qMmstPm1fY3AudGg7CisgICAgY3N0cl9pbmZvLT50eDAgPSBwX2oyay0+bV9jcC50eDA7CisgICAgY3N0cl9pbmZvLT50eTAgPSBwX2oyay0+bV9jcC50eTA7CisgICAgY3N0cl9pbmZvLT50ZHggPSBwX2oyay0+bV9jcC50ZHg7CisgICAgY3N0cl9pbmZvLT50ZHkgPSBwX2oyay0+bV9jcC50ZHk7CisgICAgY3N0cl9pbmZvLT50dyA9IHBfajJrLT5tX2NwLnR3OworICAgIGNzdHJfaW5mby0+dGggPSBwX2oyay0+bV9jcC50aDsKIAotICAgICAgICBjc3RyX2luZm8tPnRpbGVfaW5mbyA9IE5VTEw7IC8qIE5vdCBmaWxsIGZyb20gdGhlIG1haW4gaGVhZGVyKi8KKyAgICBjc3RyX2luZm8tPnRpbGVfaW5mbyA9IE5VTEw7IC8qIE5vdCBmaWxsIGZyb20gdGhlIG1haW4gaGVhZGVyKi8KIAotICAgICAgICBsX2RlZmF1bHRfdGlsZSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwOworICAgIGxfZGVmYXVsdF90aWxlID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3A7CiAKLSAgICAgICAgY3N0cl9pbmZvLT5tX2RlZmF1bHRfdGlsZV9pbmZvLmNzdHkgPSBsX2RlZmF1bHRfdGlsZS0+Y3N0eTsKLSAgICAgICAgY3N0cl9pbmZvLT5tX2RlZmF1bHRfdGlsZV9pbmZvLnByZyA9IGxfZGVmYXVsdF90aWxlLT5wcmc7Ci0gICAgICAgIGNzdHJfaW5mby0+bV9kZWZhdWx0X3RpbGVfaW5mby5udW1sYXllcnMgPSBsX2RlZmF1bHRfdGlsZS0+bnVtbGF5ZXJzOwotICAgICAgICBjc3RyX2luZm8tPm1fZGVmYXVsdF90aWxlX2luZm8ubWN0ID0gbF9kZWZhdWx0X3RpbGUtPm1jdDsKKyAgICBjc3RyX2luZm8tPm1fZGVmYXVsdF90aWxlX2luZm8uY3N0eSA9IGxfZGVmYXVsdF90aWxlLT5jc3R5OworICAgIGNzdHJfaW5mby0+bV9kZWZhdWx0X3RpbGVfaW5mby5wcmcgPSBsX2RlZmF1bHRfdGlsZS0+cHJnOworICAgIGNzdHJfaW5mby0+bV9kZWZhdWx0X3RpbGVfaW5mby5udW1sYXllcnMgPSBsX2RlZmF1bHRfdGlsZS0+bnVtbGF5ZXJzOworICAgIGNzdHJfaW5mby0+bV9kZWZhdWx0X3RpbGVfaW5mby5tY3QgPSBsX2RlZmF1bHRfdGlsZS0+bWN0OwogCi0gICAgICAgIGNzdHJfaW5mby0+bV9kZWZhdWx0X3RpbGVfaW5mby50Y2NwX2luZm8gPSAob3BqX3RjY3BfaW5mb190Kikgb3BqX2NhbGxvYyhjc3RyX2luZm8tPm5iY29tcHMsIHNpemVvZihvcGpfdGNjcF9pbmZvX3QpKTsKLQkJaWYgKCFjc3RyX2luZm8tPm1fZGVmYXVsdF90aWxlX2luZm8udGNjcF9pbmZvKQotCQl7Ci0JCQlvcGpfZGVzdHJveV9jc3RyX2luZm8oJmNzdHJfaW5mbyk7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQorICAgIGNzdHJfaW5mby0+bV9kZWZhdWx0X3RpbGVfaW5mby50Y2NwX2luZm8gPSAob3BqX3RjY3BfaW5mb190Kikgb3BqX2NhbGxvYygKKyAgICAgICAgICAgICAgICBjc3RyX2luZm8tPm5iY29tcHMsIHNpemVvZihvcGpfdGNjcF9pbmZvX3QpKTsKKyAgICBpZiAoIWNzdHJfaW5mby0+bV9kZWZhdWx0X3RpbGVfaW5mby50Y2NwX2luZm8pIHsKKyAgICAgICAgb3BqX2Rlc3Ryb3lfY3N0cl9pbmZvKCZjc3RyX2luZm8pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLSAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBudW1jb21wczsgY29tcG5vKyspIHsKLSAgICAgICAgICAgICAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSAmKGxfZGVmYXVsdF90aWxlLT50Y2Nwc1tjb21wbm9dKTsKLSAgICAgICAgICAgICAgICBvcGpfdGNjcF9pbmZvX3QgKmxfdGNjcF9pbmZvID0gJihjc3RyX2luZm8tPm1fZGVmYXVsdF90aWxlX2luZm8udGNjcF9pbmZvW2NvbXBub10pOwotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBiYW5kbm8sIG51bWJhbmRzOworICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgbnVtY29tcHM7IGNvbXBubysrKSB7CisgICAgICAgIG9wal90Y2NwX3QgKmxfdGNjcCA9ICYobF9kZWZhdWx0X3RpbGUtPnRjY3BzW2NvbXBub10pOworICAgICAgICBvcGpfdGNjcF9pbmZvX3QgKmxfdGNjcF9pbmZvID0gJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNzdHJfaW5mby0+bV9kZWZhdWx0X3RpbGVfaW5mby50Y2NwX2luZm9bY29tcG5vXSk7CisgICAgICAgIE9QSl9JTlQzMiBiYW5kbm8sIG51bWJhbmRzOwogCi0gICAgICAgICAgICAgICAgLyogY29kaW5nIHN0eWxlKi8KLSAgICAgICAgICAgICAgICBsX3RjY3BfaW5mby0+Y3N0eSA9IGxfdGNjcC0+Y3N0eTsKLSAgICAgICAgICAgICAgICBsX3RjY3BfaW5mby0+bnVtcmVzb2x1dGlvbnMgPSBsX3RjY3AtPm51bXJlc29sdXRpb25zOwotICAgICAgICAgICAgICAgIGxfdGNjcF9pbmZvLT5jYmxrdyA9IGxfdGNjcC0+Y2Jsa3c7Ci0gICAgICAgICAgICAgICAgbF90Y2NwX2luZm8tPmNibGtoID0gbF90Y2NwLT5jYmxraDsKLSAgICAgICAgICAgICAgICBsX3RjY3BfaW5mby0+Y2Jsa3N0eSA9IGxfdGNjcC0+Y2Jsa3N0eTsKLSAgICAgICAgICAgICAgICBsX3RjY3BfaW5mby0+cW1mYmlkID0gbF90Y2NwLT5xbWZiaWQ7Ci0gICAgICAgICAgICAgICAgaWYgKGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgPCBPUEpfSjJLX01BWFJMVkxTKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShsX3RjY3BfaW5mby0+cHJjaCwgbF90Y2NwLT5wcmNoLCBsX3RjY3AtPm51bXJlc29sdXRpb25zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShsX3RjY3BfaW5mby0+cHJjdywgbF90Y2NwLT5wcmN3LCBsX3RjY3AtPm51bXJlc29sdXRpb25zKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBxdWFudGl6YXRpb24gc3R5bGUqLwotICAgICAgICAgICAgICAgIGxfdGNjcF9pbmZvLT5xbnRzdHkgPSBsX3RjY3AtPnFudHN0eTsKLSAgICAgICAgICAgICAgICBsX3RjY3BfaW5mby0+bnVtZ2JpdHMgPSBsX3RjY3AtPm51bWdiaXRzOwotCi0gICAgICAgICAgICAgICAgbnVtYmFuZHMgPSAobF90Y2NwLT5xbnRzdHkgPT0gSjJLX0NDUF9RTlRTVFlfU0lRTlQpID8gMSA6IChPUEpfSU5UMzIpbF90Y2NwLT5udW1yZXNvbHV0aW9ucyAqIDMgLSAyOwotICAgICAgICAgICAgICAgIGlmIChudW1iYW5kcyA8IE9QSl9KMktfTUFYQkFORFMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgbnVtYmFuZHM7IGJhbmRubysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGNjcF9pbmZvLT5zdGVwc2l6ZXNfbWFudFtiYW5kbm9dID0gKE9QSl9VSU5UMzIpbF90Y2NwLT5zdGVwc2l6ZXNbYmFuZG5vXS5tYW50OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjY3BfaW5mby0+c3RlcHNpemVzX2V4cG5bYmFuZG5vXSA9IChPUEpfVUlOVDMyKWxfdGNjcC0+c3RlcHNpemVzW2JhbmRub10uZXhwbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBSR04gdmFsdWUqLwotICAgICAgICAgICAgICAgIGxfdGNjcF9pbmZvLT5yb2lzaGlmdCA9IGxfdGNjcC0+cm9pc2hpZnQ7CisgICAgICAgIC8qIGNvZGluZyBzdHlsZSovCisgICAgICAgIGxfdGNjcF9pbmZvLT5jc3R5ID0gbF90Y2NwLT5jc3R5OworICAgICAgICBsX3RjY3BfaW5mby0+bnVtcmVzb2x1dGlvbnMgPSBsX3RjY3AtPm51bXJlc29sdXRpb25zOworICAgICAgICBsX3RjY3BfaW5mby0+Y2Jsa3cgPSBsX3RjY3AtPmNibGt3OworICAgICAgICBsX3RjY3BfaW5mby0+Y2Jsa2ggPSBsX3RjY3AtPmNibGtoOworICAgICAgICBsX3RjY3BfaW5mby0+Y2Jsa3N0eSA9IGxfdGNjcC0+Y2Jsa3N0eTsKKyAgICAgICAgbF90Y2NwX2luZm8tPnFtZmJpZCA9IGxfdGNjcC0+cW1mYmlkOworICAgICAgICBpZiAobF90Y2NwLT5udW1yZXNvbHV0aW9ucyA8IE9QSl9KMktfTUFYUkxWTFMpIHsKKyAgICAgICAgICAgIG1lbWNweShsX3RjY3BfaW5mby0+cHJjaCwgbF90Y2NwLT5wcmNoLCBsX3RjY3AtPm51bXJlc29sdXRpb25zKTsKKyAgICAgICAgICAgIG1lbWNweShsX3RjY3BfaW5mby0+cHJjdywgbF90Y2NwLT5wcmN3LCBsX3RjY3AtPm51bXJlc29sdXRpb25zKTsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBjc3RyX2luZm87CisgICAgICAgIC8qIHF1YW50aXphdGlvbiBzdHlsZSovCisgICAgICAgIGxfdGNjcF9pbmZvLT5xbnRzdHkgPSBsX3RjY3AtPnFudHN0eTsKKyAgICAgICAgbF90Y2NwX2luZm8tPm51bWdiaXRzID0gbF90Y2NwLT5udW1nYml0czsKKworICAgICAgICBudW1iYW5kcyA9IChsX3RjY3AtPnFudHN0eSA9PSBKMktfQ0NQX1FOVFNUWV9TSVFOVCkgPyAxIDoKKyAgICAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKWxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgKiAzIC0gMjsKKyAgICAgICAgaWYgKG51bWJhbmRzIDwgT1BKX0oyS19NQVhCQU5EUykgeworICAgICAgICAgICAgZm9yIChiYW5kbm8gPSAwOyBiYW5kbm8gPCBudW1iYW5kczsgYmFuZG5vKyspIHsKKyAgICAgICAgICAgICAgICBsX3RjY3BfaW5mby0+c3RlcHNpemVzX21hbnRbYmFuZG5vXSA9IChPUEpfVUlOVDMyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90Y2NwLT5zdGVwc2l6ZXNbYmFuZG5vXS5tYW50OworICAgICAgICAgICAgICAgIGxfdGNjcF9pbmZvLT5zdGVwc2l6ZXNfZXhwbltiYW5kbm9dID0gKE9QSl9VSU5UMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RjY3AtPnN0ZXBzaXplc1tiYW5kbm9dLmV4cG47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBSR04gdmFsdWUqLworICAgICAgICBsX3RjY3BfaW5mby0+cm9pc2hpZnQgPSBsX3RjY3AtPnJvaXNoaWZ0OworICAgIH0KKworICAgIHJldHVybiBjc3RyX2luZm87CiB9CiAKIG9wal9jb2Rlc3RyZWFtX2luZGV4X3QqIGoya19nZXRfY3N0cl9pbmRleChvcGpfajJrX3QqIHBfajJrKQogewotICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmRleF90KiBsX2NzdHJfaW5kZXggPSAob3BqX2NvZGVzdHJlYW1faW5kZXhfdCopCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfY2FsbG9jKDEsc2l6ZW9mKG9wal9jb2Rlc3RyZWFtX2luZGV4X3QpKTsKLSAgICAgICAgaWYgKCFsX2NzdHJfaW5kZXgpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgb3BqX2NvZGVzdHJlYW1faW5kZXhfdCogbF9jc3RyX2luZGV4ID0gKG9wal9jb2Rlc3RyZWFtX2luZGV4X3QqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jYWxsb2MoMSwgc2l6ZW9mKG9wal9jb2Rlc3RyZWFtX2luZGV4X3QpKTsKKyAgICBpZiAoIWxfY3N0cl9pbmRleCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLSAgICAgICAgbF9jc3RyX2luZGV4LT5tYWluX2hlYWRfc3RhcnQgPSBwX2oyay0+Y3N0cl9pbmRleC0+bWFpbl9oZWFkX3N0YXJ0OwotICAgICAgICBsX2NzdHJfaW5kZXgtPm1haW5faGVhZF9lbmQgPSBwX2oyay0+Y3N0cl9pbmRleC0+bWFpbl9oZWFkX2VuZDsKLSAgICAgICAgbF9jc3RyX2luZGV4LT5jb2Rlc3RyZWFtX3NpemUgPSBwX2oyay0+Y3N0cl9pbmRleC0+Y29kZXN0cmVhbV9zaXplOworICAgIGxfY3N0cl9pbmRleC0+bWFpbl9oZWFkX3N0YXJ0ID0gcF9qMmstPmNzdHJfaW5kZXgtPm1haW5faGVhZF9zdGFydDsKKyAgICBsX2NzdHJfaW5kZXgtPm1haW5faGVhZF9lbmQgPSBwX2oyay0+Y3N0cl9pbmRleC0+bWFpbl9oZWFkX2VuZDsKKyAgICBsX2NzdHJfaW5kZXgtPmNvZGVzdHJlYW1fc2l6ZSA9IHBfajJrLT5jc3RyX2luZGV4LT5jb2Rlc3RyZWFtX3NpemU7CiAKLSAgICAgICAgbF9jc3RyX2luZGV4LT5tYXJrbnVtID0gcF9qMmstPmNzdHJfaW5kZXgtPm1hcmtudW07Ci0gICAgICAgIGxfY3N0cl9pbmRleC0+bWFya2VyID0gKG9wal9tYXJrZXJfaW5mb190KilvcGpfbWFsbG9jKGxfY3N0cl9pbmRleC0+bWFya251bSpzaXplb2Yob3BqX21hcmtlcl9pbmZvX3QpKTsKLSAgICAgICAgaWYgKCFsX2NzdHJfaW5kZXgtPm1hcmtlcil7Ci0gICAgICAgICAgICAgICAgb3BqX2ZyZWUoIGxfY3N0cl9pbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KKyAgICBsX2NzdHJfaW5kZXgtPm1hcmtudW0gPSBwX2oyay0+Y3N0cl9pbmRleC0+bWFya251bTsKKyAgICBsX2NzdHJfaW5kZXgtPm1hcmtlciA9IChvcGpfbWFya2VyX2luZm9fdCopb3BqX21hbGxvYyhsX2NzdHJfaW5kZXgtPm1hcmtudW0gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9wal9tYXJrZXJfaW5mb190KSk7CisgICAgaWYgKCFsX2NzdHJfaW5kZXgtPm1hcmtlcikgeworICAgICAgICBvcGpfZnJlZShsX2NzdHJfaW5kZXgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKLSAgICAgICAgaWYgKHBfajJrLT5jc3RyX2luZGV4LT5tYXJrZXIpCi0gICAgICAgICAgICAgICAgbWVtY3B5KGxfY3N0cl9pbmRleC0+bWFya2VyLCBwX2oyay0+Y3N0cl9pbmRleC0+bWFya2VyLCBsX2NzdHJfaW5kZXgtPm1hcmtudW0gKiBzaXplb2Yob3BqX21hcmtlcl9pbmZvX3QpICk7Ci0gICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jc3RyX2luZGV4LT5tYXJrZXIpOwotICAgICAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+bWFya2VyID0gTlVMTDsKLSAgICAgICAgfQorICAgIGlmIChwX2oyay0+Y3N0cl9pbmRleC0+bWFya2VyKSB7CisgICAgICAgIG1lbWNweShsX2NzdHJfaW5kZXgtPm1hcmtlciwgcF9qMmstPmNzdHJfaW5kZXgtPm1hcmtlciwKKyAgICAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+bWFya251bSAqIHNpemVvZihvcGpfbWFya2VyX2luZm9fdCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIG9wal9mcmVlKGxfY3N0cl9pbmRleC0+bWFya2VyKTsKKyAgICAgICAgbF9jc3RyX2luZGV4LT5tYXJrZXIgPSBOVUxMOworICAgIH0KIAotICAgICAgICBsX2NzdHJfaW5kZXgtPm5iX29mX3RpbGVzID0gcF9qMmstPmNzdHJfaW5kZXgtPm5iX29mX3RpbGVzOwotICAgICAgICBsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXggPSAob3BqX3RpbGVfaW5kZXhfdCopb3BqX2NhbGxvYyhsX2NzdHJfaW5kZXgtPm5iX29mX3RpbGVzLCBzaXplb2Yob3BqX3RpbGVfaW5kZXhfdCkgKTsKLSAgICAgICAgaWYgKCFsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXgpewotICAgICAgICAgICAgICAgIG9wal9mcmVlKCBsX2NzdHJfaW5kZXgtPm1hcmtlcik7Ci0gICAgICAgICAgICAgICAgb3BqX2ZyZWUoIGxfY3N0cl9pbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KKyAgICBsX2NzdHJfaW5kZXgtPm5iX29mX3RpbGVzID0gcF9qMmstPmNzdHJfaW5kZXgtPm5iX29mX3RpbGVzOworICAgIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleCA9IChvcGpfdGlsZV9pbmRleF90KilvcGpfY2FsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NzdHJfaW5kZXgtPm5iX29mX3RpbGVzLCBzaXplb2Yob3BqX3RpbGVfaW5kZXhfdCkpOworICAgIGlmICghbF9jc3RyX2luZGV4LT50aWxlX2luZGV4KSB7CisgICAgICAgIG9wal9mcmVlKGxfY3N0cl9pbmRleC0+bWFya2VyKTsKKyAgICAgICAgb3BqX2ZyZWUobF9jc3RyX2luZGV4KTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0gICAgICAgIGlmICghcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXgpewotICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleCk7Ci0gICAgICAgICAgICAgICAgbF9jc3RyX2luZGV4LT50aWxlX2luZGV4ID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGl0X3RpbGUgPSAwOwotICAgICAgICAgICAgICAgIGZvciAoaXRfdGlsZSA9IDA7IGl0X3RpbGUgPCBsX2NzdHJfaW5kZXgtPm5iX29mX3RpbGVzOyBpdF90aWxlKysgKXsKKyAgICBpZiAoIXBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4KSB7CisgICAgICAgIG9wal9mcmVlKGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleCk7CisgICAgICAgIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleCA9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgT1BKX1VJTlQzMiBpdF90aWxlID0gMDsKKyAgICAgICAgZm9yIChpdF90aWxlID0gMDsgaXRfdGlsZSA8IGxfY3N0cl9pbmRleC0+bmJfb2ZfdGlsZXM7IGl0X3RpbGUrKykgewogCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUaWxlIE1hcmtlciovCi0gICAgICAgICAgICAgICAgICAgICAgICBsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya251bSA9IHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtudW07CisgICAgICAgICAgICAvKiBUaWxlIE1hcmtlciovCisgICAgICAgICAgICBsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya251bSA9CisgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya251bTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGpfbWFya2VyX2luZm9fdCopb3BqX21hbGxvYyhsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya251bSpzaXplb2Yob3BqX21hcmtlcl9pbmZvX3QpKTsKKyAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrZXIgPQorICAgICAgICAgICAgICAgIChvcGpfbWFya2VyX2luZm9fdCopb3BqX21hbGxvYyhsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya251bSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvcGpfbWFya2VyX2luZm9fdCkpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBpdF90aWxlX2ZyZWU7CisgICAgICAgICAgICBpZiAoIWxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrZXIpIHsKKyAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGl0X3RpbGVfZnJlZTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGl0X3RpbGVfZnJlZT0wOyBpdF90aWxlX2ZyZWUgPCBpdF90aWxlOyBpdF90aWxlX2ZyZWUrKyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVfZnJlZV0ubWFya2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKCBsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZSggbF9jc3RyX2luZGV4LT5tYXJrZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZSggbF9jc3RyX2luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSggbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrbnVtICogc2l6ZW9mKG9wal9tYXJrZXJfaW5mb190KSApOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBUaWxlIHBhcnQgaW5kZXgqLwotICAgICAgICAgICAgICAgICAgICAgICAgbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm5iX3RwcyA9IHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm5iX3RwczsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLnRwX2luZGV4ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal90cF9pbmRleF90KilvcGpfbWFsbG9jKGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5uYl90cHMqc2l6ZW9mKG9wal90cF9pbmRleF90KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGl0X3RpbGVfZnJlZTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGl0X3RpbGVfZnJlZT0wOyBpdF90aWxlX2ZyZWUgPCBpdF90aWxlOyBpdF90aWxlX2ZyZWUrKyl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVfZnJlZV0ubWFya2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV9mcmVlXS50cF9pbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZSggbF9jc3RyX2luZGV4LT50aWxlX2luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUoIGxfY3N0cl9pbmRleC0+bWFya2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUoIGxfY3N0cl9pbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXgpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS50cF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLnRwX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm5iX3RwcyAqIHNpemVvZihvcGpfdHBfaW5kZXhfdCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS50cF9pbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS50cF9pbmRleCA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBhY2tldCBpbmRleCAoTk9UIFVTRUQpKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5uYl9wYWNrZXQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLnBhY2tldF9pbmRleCA9IE5VTEw7Ci0KKyAgICAgICAgICAgICAgICBmb3IgKGl0X3RpbGVfZnJlZSA9IDA7IGl0X3RpbGVfZnJlZSA8IGl0X3RpbGU7IGl0X3RpbGVfZnJlZSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlX2ZyZWVdLm1hcmtlcik7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIGxfY3N0cl9pbmRleDsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXgpOworICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3N0cl9pbmRleC0+bWFya2VyKTsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NzdHJfaW5kZXgpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya2VyKQorICAgICAgICAgICAgICAgIG1lbWNweShsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya2VyLAorICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrbnVtICogc2l6ZW9mKG9wal9tYXJrZXJfaW5mb190KSk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya2VyKTsKKyAgICAgICAgICAgICAgICBsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya2VyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogVGlsZSBwYXJ0IGluZGV4Ki8KKyAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5uYl90cHMgPQorICAgICAgICAgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm5iX3RwczsKKworICAgICAgICAgICAgbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLnRwX2luZGV4ID0KKyAgICAgICAgICAgICAgICAob3BqX3RwX2luZGV4X3QqKW9wal9tYWxsb2MobF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm5iX3RwcyAqIHNpemVvZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90cF9pbmRleF90KSk7CisKKyAgICAgICAgICAgIGlmICghbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLnRwX2luZGV4KSB7CisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBpdF90aWxlX2ZyZWU7CisKKyAgICAgICAgICAgICAgICBmb3IgKGl0X3RpbGVfZnJlZSA9IDA7IGl0X3RpbGVfZnJlZSA8IGl0X3RpbGU7IGl0X3RpbGVfZnJlZSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlX2ZyZWVdLm1hcmtlcik7CisgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlX2ZyZWVdLnRwX2luZGV4KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXgpOworICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3N0cl9pbmRleC0+bWFya2VyKTsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NzdHJfaW5kZXgpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXgpIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkobF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLnRwX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS50cF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm5iX3RwcyAqIHNpemVvZihvcGpfdHBfaW5kZXhfdCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0udHBfaW5kZXgpOworICAgICAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS50cF9pbmRleCA9IE5VTEw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFBhY2tldCBpbmRleCAoTk9UIFVTRUQpKi8KKyAgICAgICAgICAgIGxfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5uYl9wYWNrZXQgPSAwOworICAgICAgICAgICAgbF9jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLnBhY2tldF9pbmRleCA9IE5VTEw7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBsX2NzdHJfaW5kZXg7CiB9CiAKIHN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2FsbG9jYXRlX3RpbGVfZWxlbWVudF9jc3RyX2luZGV4KG9wal9qMmtfdCAqcF9qMmspCiB7Ci0gICAgICAgIE9QSl9VSU5UMzIgaXRfdGlsZT0wOworICAgIE9QSl9VSU5UMzIgaXRfdGlsZSA9IDA7CiAKLSAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPm5iX29mX3RpbGVzID0gcF9qMmstPm1fY3AudHcgKiBwX2oyay0+bV9jcC50aDsKLSAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXggPSAob3BqX3RpbGVfaW5kZXhfdCopb3BqX2NhbGxvYyhwX2oyay0+Y3N0cl9pbmRleC0+bmJfb2ZfdGlsZXMsIHNpemVvZihvcGpfdGlsZV9pbmRleF90KSk7Ci0gICAgICAgIGlmICghcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXgpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICBwX2oyay0+Y3N0cl9pbmRleC0+bmJfb2ZfdGlsZXMgPSBwX2oyay0+bV9jcC50dyAqIHBfajJrLT5tX2NwLnRoOworICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4ID0gKG9wal90aWxlX2luZGV4X3QqKW9wal9jYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPm5iX29mX3RpbGVzLCBzaXplb2Yob3BqX3RpbGVfaW5kZXhfdCkpOworICAgIGlmICghcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgZm9yIChpdF90aWxlPTA7IGl0X3RpbGUgPCBwX2oyay0+Y3N0cl9pbmRleC0+bmJfb2ZfdGlsZXM7IGl0X3RpbGUrKyl7Ci0gICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWF4bWFya251bSA9IDEwMDsKLSAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrbnVtID0gMDsKLSAgICAgICAgICAgICAgICBwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXJrZXIgPSAob3BqX21hcmtlcl9pbmZvX3QqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY2FsbG9jKHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1heG1hcmtudW0sIHNpemVvZihvcGpfbWFya2VyX2luZm9fdCkpOwotICAgICAgICAgICAgICAgIGlmICghcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya2VyKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICBmb3IgKGl0X3RpbGUgPSAwOyBpdF90aWxlIDwgcF9qMmstPmNzdHJfaW5kZXgtPm5iX29mX3RpbGVzOyBpdF90aWxlKyspIHsKKyAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWF4bWFya251bSA9IDEwMDsKKyAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya251bSA9IDA7CisgICAgICAgIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W2l0X3RpbGVdLm1hcmtlciA9IChvcGpfbWFya2VyX2luZm9fdCopCisgICAgICAgICAgICAgICAgb3BqX2NhbGxvYyhwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleFtpdF90aWxlXS5tYXhtYXJrbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9wal9tYXJrZXJfaW5mb190KSk7CisgICAgICAgIGlmICghcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbaXRfdGlsZV0ubWFya2VyKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2RlY29kZV90aWxlcyAoIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19kZWNvZGVfdGlsZXMob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQogewotICAgICAgICBPUEpfQk9PTCBsX2dvX29uID0gT1BKX1RSVUU7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9jdXJyZW50X3RpbGVfbm87Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9kYXRhX3NpemUsbF9tYXhfZGF0YV9zaXplOwotICAgICAgICBPUEpfSU5UMzIgbF90aWxlX3gwLGxfdGlsZV95MCxsX3RpbGVfeDEsbF90aWxlX3kxOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfY29tcHM7Ci0gICAgICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGE7Ci0gICAgICAgIE9QSl9VSU5UMzIgbnJfdGlsZXMgPSAwOworICAgIE9QSl9CT09MIGxfZ29fb24gPSBPUEpfVFJVRTsKKyAgICBPUEpfVUlOVDMyIGxfY3VycmVudF90aWxlX25vOworICAgIE9QSl9JTlQzMiBsX3RpbGVfeDAsIGxfdGlsZV95MCwgbF90aWxlX3gxLCBsX3RpbGVfeTE7CisgICAgT1BKX1VJTlQzMiBsX25iX2NvbXBzOworICAgIE9QSl9VSU5UMzIgbnJfdGlsZXMgPSAwOwogCi0gICAgICAgIGxfY3VycmVudF9kYXRhID0gKE9QSl9CWVRFKilvcGpfbWFsbG9jKDEwMDApOwotICAgICAgICBpZiAoISBsX2N1cnJlbnRfZGF0YSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBkZWNvZGUgdGlsZXNcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgbF9tYXhfZGF0YV9zaXplID0gMTAwMDsKLQotCQlmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEgb3BqX2oya19yZWFkX3RpbGVfaGVhZGVyKCBwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9jdXJyZW50X3RpbGVfbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX3RpbGVfeDAsICZsX3RpbGVfeTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfdGlsZV94MSwgJmxfdGlsZV95MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9uYl9jb21wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9nb19vbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghIGxfZ29fb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChsX2RhdGFfc2l6ZSA+IGxfbWF4X2RhdGFfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKmxfbmV3X2N1cnJlbnRfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfcmVhbGxvYyhsX2N1cnJlbnRfZGF0YSwgbF9kYXRhX3NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbF9uZXdfY3VycmVudF9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGRlY29kZSB0aWxlICVkLyVkXG4iLCBsX2N1cnJlbnRfdGlsZV9ubyArMSwgcF9qMmstPm1fY3AudGggKiBwX2oyay0+bV9jcC50dyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfZGF0YSA9IGxfbmV3X2N1cnJlbnRfZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfbWF4X2RhdGFfc2l6ZSA9IGxfZGF0YV9zaXplOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfZGVjb2RlX3RpbGUocF9qMmssbF9jdXJyZW50X3RpbGVfbm8sbF9jdXJyZW50X2RhdGEsbF9kYXRhX3NpemUscF9zdHJlYW0scF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBkZWNvZGUgdGlsZSAlZC8lZFxuIiwgbF9jdXJyZW50X3RpbGVfbm8gKzEsIHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHcpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9JTkZPLCAiVGlsZSAlZC8lZCBoYXMgYmVlbiBkZWNvZGVkLlxuIiwgbF9jdXJyZW50X3RpbGVfbm8gKzEsIHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHcpOwotCi0gICAgICAgICAgICAgICAgaWYgKCEgb3BqX2oya191cGRhdGVfaW1hZ2VfZGF0YShwX2oyay0+bV90Y2QsbF9jdXJyZW50X2RhdGEsIHBfajJrLT5tX291dHB1dF9pbWFnZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfSU5GTywgIkltYWdlIGRhdGEgaGFzIGJlZW4gdXBkYXRlZCB3aXRoIHRpbGUgJWQuXG5cbiIsIGxfY3VycmVudF90aWxlX25vICsgMSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYob3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChwX3N0cmVhbSkgPT0gMCAgCi0gICAgICAgICAgICAgICAgICAgICYmIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX3N0YXRlID09IEoyS19TVEFURV9ORU9DKQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBpZigrK25yX3RpbGVzID09ICBwX2oyay0+bV9jcC50aCAqIHBfajJrLT5tX2NwLnR3KSAKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgLyogUGFydGljdWxhciBjYXNlIGZvciB3aG9sZSBzaW5nbGUgdGlsZSBkZWNvZGluZyAqLworICAgIC8qIFdlIGNhbiBhdm9pZCBhbGxvY2F0aW5nIGludGVybWVkaWF0ZSB0aWxlIGJ1ZmZlcnMgKi8KKyAgICBpZiAocF9qMmstPm1fY3AudHcgPT0gMSAmJiBwX2oyay0+bV9jcC50aCA9PSAxICYmCisgICAgICAgICAgICBwX2oyay0+bV9jcC50eDAgPT0gMCAmJiBwX2oyay0+bV9jcC50eTAgPT0gMCAmJgorICAgICAgICAgICAgcF9qMmstPm1fb3V0cHV0X2ltYWdlLT54MCA9PSAwICYmCisgICAgICAgICAgICBwX2oyay0+bV9vdXRwdXRfaW1hZ2UtPnkwID09IDAgJiYKKyAgICAgICAgICAgIHBfajJrLT5tX291dHB1dF9pbWFnZS0+eDEgPT0gcF9qMmstPm1fY3AudGR4ICYmCisgICAgICAgICAgICBwX2oyay0+bV9vdXRwdXRfaW1hZ2UtPnkxID09IHBfajJrLT5tX2NwLnRkeSkgeworICAgICAgICBPUEpfVUlOVDMyIGk7CisgICAgICAgIGlmICghIG9wal9qMmtfcmVhZF90aWxlX2hlYWRlcihwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX2N1cnJlbnRfdGlsZV9ubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF90aWxlX3gwLCAmbF90aWxlX3kwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfdGlsZV94MSwgJmxfdGlsZV95MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX25iX2NvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfZ29fb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgICAgIH0KIAotICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7CisgICAgICAgIGlmICghIG9wal9qMmtfZGVjb2RlX3RpbGUocF9qMmssIGxfY3VycmVudF90aWxlX25vLCBOVUxMLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc3RyZWFtLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIGRlY29kZSB0aWxlIDEvMVxuIik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLyogVHJhbnNmZXIgVENEIGRhdGEgdG8gb3V0cHV0IGltYWdlIGRhdGEgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBfajJrLT5tX291dHB1dF9pbWFnZS0+bnVtY29tcHM7IGkrKykgeworICAgICAgICAgICAgb3BqX2ltYWdlX2RhdGFfZnJlZShwX2oyay0+bV9vdXRwdXRfaW1hZ2UtPmNvbXBzW2ldLmRhdGEpOworICAgICAgICAgICAgcF9qMmstPm1fb3V0cHV0X2ltYWdlLT5jb21wc1tpXS5kYXRhID0KKyAgICAgICAgICAgICAgICBwX2oyay0+bV90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzW2ldLmRhdGE7CisgICAgICAgICAgICBwX2oyay0+bV9vdXRwdXRfaW1hZ2UtPmNvbXBzW2ldLnJlc25vX2RlY29kZWQgPQorICAgICAgICAgICAgICAgIHBfajJrLT5tX3RjZC0+aW1hZ2UtPmNvbXBzW2ldLnJlc25vX2RlY29kZWQ7CisgICAgICAgICAgICBwX2oyay0+bV90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzW2ldLmRhdGEgPSBOVUxMOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIH0KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKHBfajJrLT5tX2NwLnR3ID09IDEgJiYgcF9qMmstPm1fY3AudGggPT0gMSAmJgorICAgICAgICAgICAgICAgIHBfajJrLT5tX2NwLnRjcHNbMF0ubV9kYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGxfY3VycmVudF90aWxlX25vID0gMDsKKyAgICAgICAgICAgIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIgPSAwOworICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgfD0gSjJLX1NUQVRFX0RBVEE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoISBvcGpfajJrX3JlYWRfdGlsZV9oZWFkZXIocF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfY3VycmVudF90aWxlX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfdGlsZV94MCwgJmxfdGlsZV95MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF90aWxlX3gxLCAmbF90aWxlX3kxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX25iX2NvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX2dvX29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoISBsX2dvX29uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoISBvcGpfajJrX2RlY29kZV90aWxlKHBfajJrLCBsX2N1cnJlbnRfdGlsZV9ubywgTlVMTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3N0cmVhbSwgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBkZWNvZGUgdGlsZSAlZC8lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3RpbGVfbm8gKyAxLCBwX2oyay0+bV9jcC50aCAqIHBfajJrLT5tX2NwLnR3KTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0lORk8sICJUaWxlICVkLyVkIGhhcyBiZWVuIGRlY29kZWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF90aWxlX25vICsgMSwgcF9qMmstPm1fY3AudGggKiBwX2oyay0+bV9jcC50dyk7CisKKyAgICAgICAgaWYgKCEgb3BqX2oya191cGRhdGVfaW1hZ2VfZGF0YShwX2oyay0+bV90Y2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fb3V0cHV0X2ltYWdlKSkgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwX2oyay0+bV9jcC50dyA9PSAxICYmIHBfajJrLT5tX2NwLnRoID09IDEgJiYKKyAgICAgICAgICAgICAgICAhKHBfajJrLT5tX291dHB1dF9pbWFnZS0+eDAgPT0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+eDAgJiYKKyAgICAgICAgICAgICAgICAgIHBfajJrLT5tX291dHB1dF9pbWFnZS0+eTAgPT0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+eTAgJiYKKyAgICAgICAgICAgICAgICAgIHBfajJrLT5tX291dHB1dF9pbWFnZS0+eDEgPT0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+eDEgJiYKKyAgICAgICAgICAgICAgICAgIHBfajJrLT5tX291dHB1dF9pbWFnZS0+eTEgPT0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+eTEpKSB7CisgICAgICAgICAgICAvKiBLZWVwIGN1cnJlbnQgdGNwIGRhdGEgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9wal9qMmtfdGNwX2RhdGFfZGVzdHJveSgmcF9qMmstPm1fY3AudGNwc1tsX2N1cnJlbnRfdGlsZV9ub10pOworICAgICAgICB9CisKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICJJbWFnZSBkYXRhIGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCB0aWxlICVkLlxuXG4iLCBsX2N1cnJlbnRfdGlsZV9ubyArIDEpOworCisgICAgICAgIGlmIChvcGpfc3RyZWFtX2dldF9udW1iZXJfYnl0ZV9sZWZ0KHBfc3RyZWFtKSA9PSAwCisgICAgICAgICAgICAgICAgJiYgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPT0gSjJLX1NUQVRFX05FT0MpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICgrK25yX3RpbGVzID09ICBwX2oyay0+bV9jcC50aCAqIHBfajJrLT5tX2NwLnR3KSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAogLyoqCiAgKiBTZXRzIHVwIHRoZSBwcm9jZWR1cmVzIHRvIGRvIG9uIGRlY29kaW5nIGRhdGEuIERldmVsb3BwZXJzIHdhbnRpbmcgdG8gZXh0ZW5kIHRoZSBsaWJyYXJ5IGNhbiBhZGQgdGhlaXIgb3duIHJlYWRpbmcgcHJvY2VkdXJlcy4KICAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfc2V0dXBfZGVjb2RpbmcgKG9wal9qMmtfdCAqcF9qMmssIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3NldHVwX2RlY29kaW5nKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCiB7Ci0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0gICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfZGVjb2RlX3RpbGVzLCBwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICAvKiBERVZFTE9QRVIgQ09STkVSLCBhZGQgeW91ciBjdXN0b20gcHJvY2VkdXJlcyAqLworICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGpfcHJvY2VkdXJlKW9wal9qMmtfZGVjb2RlX3RpbGVzLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIC8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSBwcm9jZWR1cmVzICovCiAKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAogLyoKICAqIFJlYWQgYW5kIGRlY29kZSBvbmUgdGlsZS4KICAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZGVjb2RlX29uZV90aWxlICggICAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZGVjb2RlX29uZV90aWxlKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKIHsKLSAgICAgICAgT1BKX0JPT0wgbF9nb19vbiA9IE9QSl9UUlVFOwotICAgICAgICBPUEpfVUlOVDMyIGxfY3VycmVudF90aWxlX25vOwotICAgICAgICBPUEpfVUlOVDMyIGxfdGlsZV9ub190b19kZWM7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9kYXRhX3NpemUsbF9tYXhfZGF0YV9zaXplOwotICAgICAgICBPUEpfSU5UMzIgbF90aWxlX3gwLGxfdGlsZV95MCxsX3RpbGVfeDEsbF90aWxlX3kxOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfY29tcHM7Ci0gICAgICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGE7CisgICAgT1BKX0JPT0wgbF9nb19vbiA9IE9QSl9UUlVFOworICAgIE9QSl9VSU5UMzIgbF9jdXJyZW50X3RpbGVfbm87CisgICAgT1BKX1VJTlQzMiBsX3RpbGVfbm9fdG9fZGVjOworICAgIE9QSl9JTlQzMiBsX3RpbGVfeDAsIGxfdGlsZV95MCwgbF90aWxlX3gxLCBsX3RpbGVfeTE7CisgICAgT1BKX1VJTlQzMiBsX25iX2NvbXBzOworICAgIE9QSl9VSU5UMzIgbF9uYl90aWxlczsKKyAgICBPUEpfVUlOVDMyIGk7CiAKLSAgICAgICAgbF9jdXJyZW50X2RhdGEgPSAoT1BKX0JZVEUqKW9wal9tYWxsb2MoMTAwMCk7Ci0gICAgICAgIGlmICghIGxfY3VycmVudF9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGRlY29kZSBvbmUgdGlsZVxuIik7CisgICAgLypBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBzb21lIGVsZW1lbnRzIG9mIGNvZGVzdHJlbSBpbmRleCBpZiBub3QgYWxyZWFkeSBkb25lKi8KKyAgICBpZiAoIXBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4KSB7CisgICAgICAgIGlmICghb3BqX2oya19hbGxvY2F0ZV90aWxlX2VsZW1lbnRfY3N0cl9pbmRleChwX2oyaykpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgLyogTW92ZSBpbnRvIHRoZSBjb2Rlc3RyZWFtIHRvIHRoZSBmaXJzdCBTT1QgdXNlZCB0byBkZWNvZGUgdGhlIGRlc2lyZWQgdGlsZSAqLworICAgIGxfdGlsZV9ub190b19kZWMgPSAoT1BKX1VJTlQzMikKKyAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fdGlsZV9pbmRfdG9fZGVjOworICAgIGlmIChwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleCkKKyAgICAgICAgaWYgKHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4LT50cF9pbmRleCkgeworICAgICAgICAgICAgaWYgKCEgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbbF90aWxlX25vX3RvX2RlY10ubmJfdHBzKSB7CisgICAgICAgICAgICAgICAgLyogdGhlIGluZGV4IGZvciB0aGlzIHRpbGUgaGFzIG5vdCBiZWVuIGJ1aWx0LAorICAgICAgICAgICAgICAgICAqICBzbyBtb3ZlIHRvIHRoZSBsYXN0IFNPVCByZWFkICovCisgICAgICAgICAgICAgICAgaWYgKCEob3BqX3N0cmVhbV9yZWFkX3NlZWsocF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fbGFzdF9zb3RfcmVhZF9wb3MgKyAyLCBwX21hbmFnZXIpKSkgeworICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiUHJvYmxlbSB3aXRoIHNlZWsgZnVuY3Rpb25cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCEob3BqX3N0cmVhbV9yZWFkX3NlZWsocF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPmNzdHJfaW5kZXgtPnRpbGVfaW5kZXhbbF90aWxlX25vX3RvX2RlY10udHBfaW5kZXhbMF0uc3RhcnRfcG9zICsgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpKSkgeworICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiUHJvYmxlbSB3aXRoIHNlZWsgZnVuY3Rpb25cbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFNwZWNpYWwgY2FzZSBpZiB3ZSBoYXZlIHByZXZpb3VzbHkgcmVhZCB0aGUgRU9DIG1hcmtlciAoaWYgdGhlIHByZXZpb3VzIHRpbGUgZ2V0dGVkIGlzIHRoZSBsYXN0ICkgKi8KKyAgICAgICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfRU9DKSB7CisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fc3RhdGUgPSBKMktfU1RBVEVfVFBIU09UOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAvKiBSZXNldCBjdXJyZW50IHRpbGUgcGFydCBudW1iZXIgZm9yIGFsbCB0aWxlcywgYW5kIG5vdCBvbmx5IHRoZSBvbmUgKi8KKyAgICAvKiBvZiBpbnRlcmVzdC4gKi8KKyAgICAvKiBOb3QgY29tcGxldGVseSBzdXJlIHRoaXMgaXMgYWx3YXlzIGNvcnJlY3QgYnV0IHJlcXVpcmVkIGZvciAqLworICAgIC8qIC4vYnVpbGQvYmluL2oya19yYW5kb21fdGlsZV9hY2Nlc3MgLi9idWlsZC90ZXN0cy90dGUxLmoyayAqLworICAgIGxfbmJfdGlsZXMgPSBwX2oyay0+bV9jcC50dyAqIHBfajJrLT5tX2NwLnRoOworICAgIGZvciAoaSA9IDA7IGkgPCBsX25iX3RpbGVzOyArK2kpIHsKKyAgICAgICAgcF9qMmstPm1fY3AudGNwc1tpXS5tX2N1cnJlbnRfdGlsZV9wYXJ0X251bWJlciA9IC0xOworICAgIH0KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKCEgb3BqX2oya19yZWFkX3RpbGVfaGVhZGVyKHBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfY3VycmVudF90aWxlX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX3RpbGVfeDAsICZsX3RpbGVfeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF90aWxlX3gxLCAmbF90aWxlX3kxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfbmJfY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9nb19vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghIGxfZ29fb24pIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEgb3BqX2oya19kZWNvZGVfdGlsZShwX2oyaywgbF9jdXJyZW50X3RpbGVfbm8sIE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zdHJlYW0sIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9JTkZPLCAiVGlsZSAlZC8lZCBoYXMgYmVlbiBkZWNvZGVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfdGlsZV9ubyArIDEsIHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHcpOworCisgICAgICAgIGlmICghIG9wal9qMmtfdXBkYXRlX2ltYWdlX2RhdGEocF9qMmstPm1fdGNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX291dHB1dF9pbWFnZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgb3BqX2oya190Y3BfZGF0YV9kZXN0cm95KCZwX2oyay0+bV9jcC50Y3BzW2xfY3VycmVudF90aWxlX25vXSk7CisKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9JTkZPLAorICAgICAgICAgICAgICAgICAgICAgICJJbWFnZSBkYXRhIGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCB0aWxlICVkLlxuXG4iLCBsX2N1cnJlbnRfdGlsZV9ubyArIDEpOworCisgICAgICAgIGlmIChsX2N1cnJlbnRfdGlsZV9ubyA9PSBsX3RpbGVfbm9fdG9fZGVjKSB7CisgICAgICAgICAgICAvKiBtb3ZlIGludG8gdGhlIGNvZGVzdHJlYW0gdG8gdGhlIGZpcnN0IFNPVCAoRklYTUUgb3Igbm90IG1vdmU/KSovCisgICAgICAgICAgICBpZiAoIShvcGpfc3RyZWFtX3JlYWRfc2VlayhwX3N0cmVhbSwgcF9qMmstPmNzdHJfaW5kZXgtPm1haW5faGVhZF9lbmQgKyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSkpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiUHJvYmxlbSB3aXRoIHNlZWsgZnVuY3Rpb25cbiIpOwogICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgbF9tYXhfZGF0YV9zaXplID0gMTAwMDsKLQotICAgICAgICAvKkFsbG9jYXRlIGFuZCBpbml0aWFsaXplIHNvbWUgZWxlbWVudHMgb2YgY29kZXN0cmVtIGluZGV4IGlmIG5vdCBhbHJlYWR5IGRvbmUqLwotICAgICAgICBpZiggIXBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFvcGpfajJrX2FsbG9jYXRlX3RpbGVfZWxlbWVudF9jc3RyX2luZGV4KHBfajJrKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvKiBNb3ZlIGludG8gdGhlIGNvZGVzdHJlYW0gdG8gdGhlIGZpcnN0IFNPVCB1c2VkIHRvIGRlY29kZSB0aGUgZGVzaXJlZCB0aWxlICovCi0gICAgICAgIGxfdGlsZV9ub190b19kZWMgPSAoT1BKX1VJTlQzMilwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV90aWxlX2luZF90b19kZWM7Ci0gICAgICAgIGlmIChwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleCkKLSAgICAgICAgICAgICAgICBpZihwX2oyay0+Y3N0cl9pbmRleC0+dGlsZV9pbmRleC0+dHBfaW5kZXgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W2xfdGlsZV9ub190b19kZWNdLm5iX3RwcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgaW5kZXggZm9yIHRoaXMgdGlsZSBoYXMgbm90IGJlZW4gYnVpbHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBzbyBtb3ZlIHRvIHRoZSBsYXN0IFNPVCByZWFkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIShvcGpfc3RyZWFtX3JlYWRfc2VlayhwX3N0cmVhbSwgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fbGFzdF9zb3RfcmVhZF9wb3MrMiwgcF9tYW5hZ2VyKSkgKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiUHJvYmxlbSB3aXRoIHNlZWsgZnVuY3Rpb25cbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEob3BqX3N0cmVhbV9yZWFkX3NlZWsocF9zdHJlYW0sIHBfajJrLT5jc3RyX2luZGV4LT50aWxlX2luZGV4W2xfdGlsZV9ub190b19kZWNdLnRwX2luZGV4WzBdLnN0YXJ0X3BvcysyLCBwX21hbmFnZXIpKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiUHJvYmxlbSB3aXRoIHNlZWsgZnVuY3Rpb25cbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTcGVjaWFsIGNhc2UgaWYgd2UgaGF2ZSBwcmV2aW91c2x5IHJlYWQgdGhlIEVPQyBtYXJrZXIgKGlmIHRoZSBwcmV2aW91cyB0aWxlIGdldHRlZCBpcyB0aGUgbGFzdCApICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZihwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9PSBKMktfU1RBVEVfRU9DKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9zdGF0ZSA9IEoyS19TVEFURV9UUEhTT1Q7Ci0gICAgICAgICAgICAgICAgfQotCi0JCWZvciAoOzspIHsKLSAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX3JlYWRfdGlsZV9oZWFkZXIoIHBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX2N1cnJlbnRfdGlsZV9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfdGlsZV94MCwgJmxfdGlsZV95MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF90aWxlX3gxLCAmbF90aWxlX3kxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX25iX2NvbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX2dvX29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCEgbF9nb19vbikgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGxfZGF0YV9zaXplID4gbF9tYXhfZGF0YV9zaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqbF9uZXdfY3VycmVudF9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKGxfY3VycmVudF9kYXRhLCBsX2RhdGFfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBsX25ld19jdXJyZW50X2RhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfZGF0YSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE86IExIOiB3aHkgdGlsZSBudW1iZXJpbmcgcG9saWN5IHVzZWQgaW4gbWVzc2FnZXMgZGlmZmVycyBmcm9tCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvbmUgdXNlZCBpbiBvcGpfajJrX2RlY29kZV90aWxlcygpID8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGRlY29kZSB0aWxlICVkLyVkXG4iLCBsX2N1cnJlbnRfdGlsZV9ubywgKHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHcpIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfZGF0YSA9IGxfbmV3X2N1cnJlbnRfZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfbWF4X2RhdGFfc2l6ZSA9IGxfZGF0YV9zaXplOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfZGVjb2RlX3RpbGUocF9qMmssbF9jdXJyZW50X3RpbGVfbm8sbF9jdXJyZW50X2RhdGEsbF9kYXRhX3NpemUscF9zdHJlYW0scF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9JTkZPLCAiVGlsZSAlZC8lZCBoYXMgYmVlbiBkZWNvZGVkLlxuIiwgbF9jdXJyZW50X3RpbGVfbm8sIChwX2oyay0+bV9jcC50aCAqIHBfajJrLT5tX2NwLnR3KSAtIDEpOwotCi0gICAgICAgICAgICAgICAgaWYgKCEgb3BqX2oya191cGRhdGVfaW1hZ2VfZGF0YShwX2oyay0+bV90Y2QsbF9jdXJyZW50X2RhdGEsIHBfajJrLT5tX291dHB1dF9pbWFnZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfSU5GTywgIkltYWdlIGRhdGEgaGFzIGJlZW4gdXBkYXRlZCB3aXRoIHRpbGUgJWQuXG5cbiIsIGxfY3VycmVudF90aWxlX25vKTsKLQotICAgICAgICAgICAgICAgIGlmKGxfY3VycmVudF90aWxlX25vID09IGxfdGlsZV9ub190b19kZWMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogbW92ZSBpbnRvIHRoZSBjb2Rlc3RyZWFtIHRvIHRoZSB0aGUgZmlyc3QgU09UIChGSVhNRSBvciBub3QgbW92ZT8pKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKG9wal9zdHJlYW1fcmVhZF9zZWVrKHBfc3RyZWFtLCBwX2oyay0+Y3N0cl9pbmRleC0+bWFpbl9oZWFkX2VuZCArIDIsIHBfbWFuYWdlcikgKSApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlByb2JsZW0gd2l0aCBzZWVrIGZ1bmN0aW9uXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiVGlsZSByZWFkLCBkZWNvZGUgYW5kIHVwZGF0ZWQgaXMgbm90IHRoZSBkZXNpcmVkICglZCB2cyAlZCkuXG4iLCBsX2N1cnJlbnRfdGlsZV9ubywgbF90aWxlX25vX3RvX2RlYyk7Ci0gICAgICAgICAgICAgICAgfQotCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbGUgcmVhZCwgZGVjb2RlZCBhbmQgdXBkYXRlZCBpcyBub3QgdGhlIGRlc2lyZWQgb25lICglZCB2cyAlZCkuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfdGlsZV9ubyArIDEsIGxfdGlsZV9ub190b19kZWMgKyAxKTsKICAgICAgICAgfQogCi0gICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKKyAgICB9CiAKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAogLyoqCiAgKiBTZXRzIHVwIHRoZSBwcm9jZWR1cmVzIHRvIGRvIG9uIGRlY29kaW5nIG9uZSB0aWxlLiBEZXZlbG9wcGVycyB3YW50aW5nIHRvIGV4dGVuZCB0aGUgbGlicmFyeSBjYW4gYWRkIHRoZWlyIG93biByZWFkaW5nIHByb2NlZHVyZXMuCiAgKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3NldHVwX2RlY29kaW5nX3RpbGUgKG9wal9qMmtfdCAqcF9qMmssIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3NldHVwX2RlY29kaW5nX3RpbGUob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQogewotICAgICAgICAvKiBwcmVjb25kaXRpb25zKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyovCisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKIAotICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfajJrX2RlY29kZV9vbmVfdGlsZSwgcF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9wcm9jZWR1cmUpb3BqX2oya19kZWNvZGVfb25lX3RpbGUsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgLyogREVWRUxPUEVSIENPUk5FUiwgYWRkIHlvdXIgY3VzdG9tIHByb2NlZHVyZXMgKi8KKworICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9qMmtfbW92ZV9kYXRhX2Zyb21fY29kZWNfdG9fb3V0cHV0X2ltYWdlKG9wal9qMmtfdCAqIHBfajJrLAorICAgICAgICBvcGpfaW1hZ2VfdCAqIHBfaW1hZ2UpCit7CisgICAgT1BKX1VJTlQzMiBjb21wbm87CisKKyAgICAvKiBNb3ZlIGRhdGEgYW5kIGNvcHkgb25lIGluZm9ybWF0aW9uIGZyb20gY29kZWMgdG8gb3V0cHV0IGltYWdlKi8KKyAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fbnVtY29tcHNfdG9fZGVjb2RlID4gMCkgeworICAgICAgICBvcGpfaW1hZ2VfY29tcF90KiBuZXdjb21wcyA9CisgICAgICAgICAgICAob3BqX2ltYWdlX2NvbXBfdCopIG9wal9tYWxsb2MoCisgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fbnVtY29tcHNfdG9fZGVjb2RlICoKKyAgICAgICAgICAgICAgICBzaXplb2Yob3BqX2ltYWdlX2NvbXBfdCkpOworICAgICAgICBpZiAobmV3Y29tcHMgPT0gTlVMTCkgeworICAgICAgICAgICAgb3BqX2ltYWdlX2Rlc3Ryb3kocF9qMmstPm1fcHJpdmF0ZV9pbWFnZSk7CisgICAgICAgICAgICBwX2oyay0+bV9wcml2YXRlX2ltYWdlID0gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgICAgIH0KLSAgICAgICAgLyogREVWRUxPUEVSIENPUk5FUiwgYWRkIHlvdXIgY3VzdG9tIHByb2NlZHVyZXMgKi8KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgcF9pbWFnZS0+bnVtY29tcHM7IGNvbXBubysrKSB7CisgICAgICAgICAgICBvcGpfaW1hZ2VfZGF0YV9mcmVlKHBfaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YSk7CisgICAgICAgICAgICBwX2ltYWdlLT5jb21wc1tjb21wbm9dLmRhdGEgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGZvciAoY29tcG5vID0gMDsKKyAgICAgICAgICAgICAgICBjb21wbm8gPCBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9udW1jb21wc190b19kZWNvZGU7IGNvbXBubysrKSB7CisgICAgICAgICAgICBPUEpfVUlOVDMyIHNyY19jb21wbm8gPQorICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2NvbXBzX2luZGljZXNfdG9fZGVjb2RlW2NvbXBub107CisgICAgICAgICAgICBtZW1jcHkoJihuZXdjb21wc1tjb21wbm9dKSwKKyAgICAgICAgICAgICAgICAgICAmKHBfajJrLT5tX291dHB1dF9pbWFnZS0+Y29tcHNbc3JjX2NvbXBub10pLAorICAgICAgICAgICAgICAgICAgIHNpemVvZihvcGpfaW1hZ2VfY29tcF90KSk7CisgICAgICAgICAgICBuZXdjb21wc1tjb21wbm9dLnJlc25vX2RlY29kZWQgPQorICAgICAgICAgICAgICAgIHBfajJrLT5tX291dHB1dF9pbWFnZS0+Y29tcHNbc3JjX2NvbXBub10ucmVzbm9fZGVjb2RlZDsKKyAgICAgICAgICAgIG5ld2NvbXBzW2NvbXBub10uZGF0YSA9IHBfajJrLT5tX291dHB1dF9pbWFnZS0+Y29tcHNbc3JjX2NvbXBub10uZGF0YTsKKyAgICAgICAgICAgIHBfajJrLT5tX291dHB1dF9pbWFnZS0+Y29tcHNbc3JjX2NvbXBub10uZGF0YSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBwX2ltYWdlLT5udW1jb21wczsgY29tcG5vKyspIHsKKyAgICAgICAgICAgIGFzc2VydChwX2oyay0+bV9vdXRwdXRfaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YSA9PSBOVUxMKTsKKyAgICAgICAgICAgIG9wal9pbWFnZV9kYXRhX2ZyZWUocF9qMmstPm1fb3V0cHV0X2ltYWdlLT5jb21wc1tjb21wbm9dLmRhdGEpOworICAgICAgICAgICAgcF9qMmstPm1fb3V0cHV0X2ltYWdlLT5jb21wc1tjb21wbm9dLmRhdGEgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIHBfaW1hZ2UtPm51bWNvbXBzID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fbnVtY29tcHNfdG9fZGVjb2RlOworICAgICAgICBvcGpfZnJlZShwX2ltYWdlLT5jb21wcyk7CisgICAgICAgIHBfaW1hZ2UtPmNvbXBzID0gbmV3Y29tcHM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBwX2ltYWdlLT5udW1jb21wczsgY29tcG5vKyspIHsKKyAgICAgICAgICAgIHBfaW1hZ2UtPmNvbXBzW2NvbXBub10ucmVzbm9fZGVjb2RlZCA9CisgICAgICAgICAgICAgICAgcF9qMmstPm1fb3V0cHV0X2ltYWdlLT5jb21wc1tjb21wbm9dLnJlc25vX2RlY29kZWQ7CisgICAgICAgICAgICBvcGpfaW1hZ2VfZGF0YV9mcmVlKHBfaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YSk7CisgICAgICAgICAgICBwX2ltYWdlLT5jb21wc1tjb21wbm9dLmRhdGEgPSBwX2oyay0+bV9vdXRwdXRfaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YTsKKyNpZiAwCisgICAgICAgICAgICBjaGFyIGZuWzI1Nl07CisgICAgICAgICAgICBzcHJpbnRmKGZuLCAiL3RtcC8lZC5yYXciLCBjb21wbm8pOworICAgICAgICAgICAgRklMRSAqZGVidWcgPSBmb3BlbihmbiwgIndiIik7CisgICAgICAgICAgICBmd3JpdGUocF9pbWFnZS0+Y29tcHNbY29tcG5vXS5kYXRhLCBzaXplb2YoT1BKX0lOVDMyKSwKKyAgICAgICAgICAgICAgICAgICBwX2ltYWdlLT5jb21wc1tjb21wbm9dLncgKiBwX2ltYWdlLT5jb21wc1tjb21wbm9dLmgsIGRlYnVnKTsKKyAgICAgICAgICAgIGZjbG9zZShkZWJ1Zyk7CisjZW5kaWYKKyAgICAgICAgICAgIHBfajJrLT5tX291dHB1dF9pbWFnZS0+Y29tcHNbY29tcG5vXS5kYXRhID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKIE9QSl9CT09MIG9wal9qMmtfZGVjb2RlKG9wal9qMmtfdCAqIHBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90ICogcF9pbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICogcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqIHBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCiB7Ci0gICAgICAgIE9QSl9VSU5UMzIgY29tcG5vOworICAgIGlmICghcF9pbWFnZSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICBpZiAoIXBfaW1hZ2UpCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLQkKKyAgICAvKiBIZXVyaXN0aWNzIHRvIGRldGVjdCBzZXF1ZW5jZSBvcGpfcmVhZF9oZWFkZXIoKSwgb3BqX3NldF9kZWNvZGVkX3Jlc29sdXRpb25fZmFjdG9yKCkgKi8KKyAgICAvKiBhbmQgZmluYWxseSBvcGpfZGVjb2RlX2ltYWdlKCkgd2l0aG91dCBtYW51YWwgc2V0dGluZyBvZiBjb21wc1tdLmZhY3RvciAqLworICAgIC8qIFdlIGNvdWxkIHBvdGVudGlhbGx5IGFsd2F5cyBleGVjdXRlIGl0LCBpZiB3ZSBkb24ndCBhbGxvdyBwZW9wbGUgdG8gZG8gKi8KKyAgICAvKiBvcGpfcmVhZF9oZWFkZXIoKSwgbW9kaWZ5IHgwLHkwLHgxLHkxIG9mIHJldHVybmVkIGltYWdlIGFuIGNhbGwgb3BqX2RlY29kZV9pbWFnZSgpICovCisgICAgaWYgKHBfajJrLT5tX2NwLm1fc3BlY2lmaWNfcGFyYW0ubV9kZWMubV9yZWR1Y2UgPiAwICYmCisgICAgICAgICAgICBwX2oyay0+bV9wcml2YXRlX2ltYWdlICE9IE5VTEwgJiYKKyAgICAgICAgICAgIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzID4gMCAmJgorICAgICAgICAgICAgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+Y29tcHNbMF0uZmFjdG9yID09CisgICAgICAgICAgICBwX2oyay0+bV9jcC5tX3NwZWNpZmljX3BhcmFtLm1fZGVjLm1fcmVkdWNlICYmCisgICAgICAgICAgICBwX2ltYWdlLT5udW1jb21wcyA+IDAgJiYKKyAgICAgICAgICAgIHBfaW1hZ2UtPmNvbXBzWzBdLmZhY3RvciA9PSAwICYmCisgICAgICAgICAgICAvKiBEb24ndCBtZXNzIHdpdGggaW1hZ2UgZGltZW5zaW9uIGlmIHRoZSB1c2VyIGhhcyBhbGxvY2F0ZWQgaXQgKi8KKyAgICAgICAgICAgIHBfaW1hZ2UtPmNvbXBzWzBdLmRhdGEgPT0gTlVMTCkgeworICAgICAgICBPUEpfVUlOVDMyIGl0X2NvbXA7CisKKyAgICAgICAgLyogVXBkYXRlIHRoZSBjb21wc1tdLmZhY3RvciBtZW1iZXIgb2YgdGhlIG91dHB1dCBpbWFnZSB3aXRoIHRoZSBvbmUgKi8KKyAgICAgICAgLyogb2YgbV9yZWR1Y2UgKi8KKyAgICAgICAgZm9yIChpdF9jb21wID0gMDsgaXRfY29tcCA8IHBfaW1hZ2UtPm51bWNvbXBzOyArK2l0X2NvbXApIHsKKyAgICAgICAgICAgIHBfaW1hZ2UtPmNvbXBzW2l0X2NvbXBdLmZhY3RvciA9IHBfajJrLT5tX2NwLm1fc3BlY2lmaWNfcGFyYW0ubV9kZWMubV9yZWR1Y2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFvcGpfajJrX3VwZGF0ZV9pbWFnZV9kaW1lbnNpb25zKHBfaW1hZ2UsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocF9qMmstPm1fb3V0cHV0X2ltYWdlID09IE5VTEwpIHsKICAgICAgICAgcF9qMmstPm1fb3V0cHV0X2ltYWdlID0gb3BqX2ltYWdlX2NyZWF0ZTAoKTsKLSAgICAgICAgaWYgKCEgKHBfajJrLT5tX291dHB1dF9pbWFnZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICBpZiAoIShwX2oyay0+bV9vdXRwdXRfaW1hZ2UpKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICB9Ci0gICAgICAgIG9wal9jb3B5X2ltYWdlX2hlYWRlcihwX2ltYWdlLCBwX2oyay0+bV9vdXRwdXRfaW1hZ2UpOworICAgIH0KKyAgICBvcGpfY29weV9pbWFnZV9oZWFkZXIocF9pbWFnZSwgcF9qMmstPm1fb3V0cHV0X2ltYWdlKTsKIAotICAgICAgICAvKiBjdXN0b21pemF0aW9uIG9mIHRoZSBkZWNvZGluZyAqLwotICAgICAgICBvcGpfajJrX3NldHVwX2RlY29kaW5nKHBfajJrLCBwX21hbmFnZXIpOworICAgIC8qIGN1c3RvbWl6YXRpb24gb2YgdGhlIGRlY29kaW5nICovCisgICAgaWYgKCFvcGpfajJrX3NldHVwX2RlY29kaW5nKHBfajJrLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIC8qIERlY29kZSB0aGUgY29kZXN0cmVhbSAqLwotICAgICAgICBpZiAoISBvcGpfajJrX2V4ZWMgKHBfajJrLHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfZGVzdHJveShwX2oyay0+bV9wcml2YXRlX2ltYWdlKTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9wcml2YXRlX2ltYWdlID0gTlVMTDsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgLyogRGVjb2RlIHRoZSBjb2Rlc3RyZWFtICovCisgICAgaWYgKCEgb3BqX2oya19leGVjKHBfajJrLCBwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwgcF9zdHJlYW0sIHBfbWFuYWdlcikpIHsKKyAgICAgICAgb3BqX2ltYWdlX2Rlc3Ryb3kocF9qMmstPm1fcHJpdmF0ZV9pbWFnZSk7CisgICAgICAgIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UgPSBOVUxMOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICAvKiBNb3ZlIGRhdGEgYW5kIGNvcHkgb25lIGluZm9ybWF0aW9uIGZyb20gY29kZWMgdG8gb3V0cHV0IGltYWdlKi8KLSAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBwX2ltYWdlLT5udW1jb21wczsgY29tcG5vKyspIHsKLSAgICAgICAgICAgICAgICBwX2ltYWdlLT5jb21wc1tjb21wbm9dLnJlc25vX2RlY29kZWQgPSBwX2oyay0+bV9vdXRwdXRfaW1hZ2UtPmNvbXBzW2NvbXBub10ucmVzbm9fZGVjb2RlZDsKLSAgICAgICAgICAgICAgICBwX2ltYWdlLT5jb21wc1tjb21wbm9dLmRhdGEgPSBwX2oyay0+bV9vdXRwdXRfaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YTsKLSNpZiAwCi0gICAgICAgICAgICAgICAgY2hhciBmblsyNTZdOwotICAgICAgICAgICAgICAgIHNwcmludGYoIGZuLCAiL3RtcC8lZC5yYXciLCBjb21wbm8gKTsKLSAgICAgICAgICAgICAgICBGSUxFICpkZWJ1ZyA9IGZvcGVuKCBmbiwgIndiIiApOwotICAgICAgICAgICAgICAgIGZ3cml0ZSggcF9pbWFnZS0+Y29tcHNbY29tcG5vXS5kYXRhLCBzaXplb2YoT1BKX0lOVDMyKSwgcF9pbWFnZS0+Y29tcHNbY29tcG5vXS53ICogcF9pbWFnZS0+Y29tcHNbY29tcG5vXS5oLCBkZWJ1ZyApOwotICAgICAgICAgICAgICAgIGZjbG9zZSggZGVidWcgKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIHBfajJrLT5tX291dHB1dF9pbWFnZS0+Y29tcHNbY29tcG5vXS5kYXRhID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAvKiBNb3ZlIGRhdGEgYW5kIGNvcHkgb25lIGluZm9ybWF0aW9uIGZyb20gY29kZWMgdG8gb3V0cHV0IGltYWdlKi8KKyAgICByZXR1cm4gb3BqX2oya19tb3ZlX2RhdGFfZnJvbV9jb2RlY190b19vdXRwdXRfaW1hZ2UocF9qMmssIHBfaW1hZ2UpOwogfQogCi1PUEpfQk9PTCBvcGpfajJrX2dldF90aWxlKCAgICAgIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90KiBwX2ltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRpbGVfaW5kZXggKQorT1BKX0JPT0wgb3BqX2oya19nZXRfdGlsZShvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90KiBwX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdGlsZV9pbmRleCkKIHsKLSAgICAgICAgT1BKX1VJTlQzMiBjb21wbm87Ci0gICAgICAgIE9QSl9VSU5UMzIgbF90aWxlX3gsIGxfdGlsZV95OwotICAgICAgICBvcGpfaW1hZ2VfY29tcF90KiBsX2ltZ19jb21wOworICAgIE9QSl9VSU5UMzIgY29tcG5vOworICAgIE9QSl9VSU5UMzIgbF90aWxlX3gsIGxfdGlsZV95OworICAgIG9wal9pbWFnZV9jb21wX3QqIGxfaW1nX2NvbXA7CiAKLSAgICAgICAgaWYgKCFwX2ltYWdlKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIldlIG5lZWQgYW4gaW1hZ2UgcHJldmlvdXNseSBjcmVhdGVkLlxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICBpZiAoIXBfaW1hZ2UpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIldlIG5lZWQgYW4gaW1hZ2UgcHJldmlvdXNseSBjcmVhdGVkLlxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgaWYgKHBfaW1hZ2UtPm51bWNvbXBzIDwgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHMpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiSW1hZ2UgaGFzIGxlc3MgY29tcG9uZW50cyB0aGFuIGNvZGVzdHJlYW0uXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICBpZiAoLyoodGlsZV9pbmRleCA8IDApICYmKi8gKHRpbGVfaW5kZXggPj0gcF9qMmstPm1fY3AudHcgKiBwX2oyay0+bV9jcC50aCkpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiVGlsZSBpbmRleCBwcm92aWRlZCBieSB0aGUgdXNlciBpcyBpbmNvcnJlY3QgJWQgKG1heCA9ICVkKSBcbiIsIHRpbGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgKHBfajJrLT5tX2NwLnR3ICogcF9qMmstPm1fY3AudGgpIC0gMSk7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgLyogQ29tcHV0ZSB0aGUgZGltZW5zaW9uIG9mIHRoZSBkZXNpcmVkIHRpbGUqLworICAgIGxfdGlsZV94ID0gdGlsZV9pbmRleCAlIHBfajJrLT5tX2NwLnR3OworICAgIGxfdGlsZV95ID0gdGlsZV9pbmRleCAvIHBfajJrLT5tX2NwLnR3OworCisgICAgcF9pbWFnZS0+eDAgPSBsX3RpbGVfeCAqIHBfajJrLT5tX2NwLnRkeCArIHBfajJrLT5tX2NwLnR4MDsKKyAgICBpZiAocF9pbWFnZS0+eDAgPCBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT54MCkgeworICAgICAgICBwX2ltYWdlLT54MCA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPngwOworICAgIH0KKyAgICBwX2ltYWdlLT54MSA9IChsX3RpbGVfeCArIDEpICogcF9qMmstPm1fY3AudGR4ICsgcF9qMmstPm1fY3AudHgwOworICAgIGlmIChwX2ltYWdlLT54MSA+IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPngxKSB7CisgICAgICAgIHBfaW1hZ2UtPngxID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+eDE7CisgICAgfQorCisgICAgcF9pbWFnZS0+eTAgPSBsX3RpbGVfeSAqIHBfajJrLT5tX2NwLnRkeSArIHBfajJrLT5tX2NwLnR5MDsKKyAgICBpZiAocF9pbWFnZS0+eTAgPCBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT55MCkgeworICAgICAgICBwX2ltYWdlLT55MCA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPnkwOworICAgIH0KKyAgICBwX2ltYWdlLT55MSA9IChsX3RpbGVfeSArIDEpICogcF9qMmstPm1fY3AudGR5ICsgcF9qMmstPm1fY3AudHkwOworICAgIGlmIChwX2ltYWdlLT55MSA+IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPnkxKSB7CisgICAgICAgIHBfaW1hZ2UtPnkxID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+eTE7CisgICAgfQorCisgICAgbF9pbWdfY29tcCA9IHBfaW1hZ2UtPmNvbXBzOworICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHM7ICsrY29tcG5vKSB7CisgICAgICAgIE9QSl9JTlQzMiBsX2NvbXBfeDEsIGxfY29tcF95MTsKKworICAgICAgICBsX2ltZ19jb21wLT5mYWN0b3IgPSBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5jb21wc1tjb21wbm9dLmZhY3RvcjsKKworICAgICAgICBsX2ltZ19jb21wLT54MCA9IG9wal91aW50X2NlaWxkaXYocF9pbWFnZS0+eDAsIGxfaW1nX2NvbXAtPmR4KTsKKyAgICAgICAgbF9pbWdfY29tcC0+eTAgPSBvcGpfdWludF9jZWlsZGl2KHBfaW1hZ2UtPnkwLCBsX2ltZ19jb21wLT5keSk7CisgICAgICAgIGxfY29tcF94MSA9IG9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKXBfaW1hZ2UtPngxLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR4KTsKKyAgICAgICAgbF9jb21wX3kxID0gb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpcF9pbWFnZS0+eTEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHkpOworCisgICAgICAgIGxfaW1nX2NvbXAtPncgPSAoT1BKX1VJTlQzMikob3BqX2ludF9jZWlsZGl2cG93MihsX2NvbXBfeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5mYWN0b3IpIC0gb3BqX2ludF9jZWlsZGl2cG93MigoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPngwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5mYWN0b3IpKTsKKyAgICAgICAgbF9pbWdfY29tcC0+aCA9IChPUEpfVUlOVDMyKShvcGpfaW50X2NlaWxkaXZwb3cyKGxfY29tcF95MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmZhY3RvcikgLSBvcGpfaW50X2NlaWxkaXZwb3cyKChPUEpfSU5UMzIpbF9pbWdfY29tcC0+eTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmZhY3RvcikpOworCisgICAgICAgIGxfaW1nX2NvbXArKzsKKyAgICB9CisKKyAgICBpZiAocF9pbWFnZS0+bnVtY29tcHMgPiBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wcykgeworICAgICAgICAvKiBDYW4gaGFwcGVuIHdoZW4gY2FsbGluZyByZXBlYXRkbHkgb3BqX2dldF9kZWNvZGVkX3RpbGUoKSBvbiBhbgorICAgICAgICAgKiBpbWFnZSB3aXRoIGEgY29sb3IgcGFsZXR0ZSwgd2hlcmUgY29sb3IgcGFsZXR0ZSBleHBhbnNpb24gaXMgZG9uZQorICAgICAgICAgKiBsYXRlciBpbiBqcDIuYyAqLworICAgICAgICBmb3IgKGNvbXBubyA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOyBjb21wbm8gPCBwX2ltYWdlLT5udW1jb21wczsKKyAgICAgICAgICAgICAgICArK2NvbXBubykgeworICAgICAgICAgICAgb3BqX2ltYWdlX2RhdGFfZnJlZShwX2ltYWdlLT5jb21wc1tjb21wbm9dLmRhdGEpOworICAgICAgICAgICAgcF9pbWFnZS0+Y29tcHNbY29tcG5vXS5kYXRhID0gTlVMTDsKICAgICAgICAgfQorICAgICAgICBwX2ltYWdlLT5udW1jb21wcyA9IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOworICAgIH0KIAotICAgICAgICBpZiAoIC8qKHRpbGVfaW5kZXggPCAwKSAmJiovICh0aWxlX2luZGV4ID49IHBfajJrLT5tX2NwLnR3ICogcF9qMmstPm1fY3AudGgpICl7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlRpbGUgaW5kZXggcHJvdmlkZWQgYnkgdGhlIHVzZXIgaXMgaW5jb3JyZWN0ICVkIChtYXggPSAlZCkgXG4iLCB0aWxlX2luZGV4LCAocF9qMmstPm1fY3AudHcgKiBwX2oyay0+bV9jcC50aCkgLSAxKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgLyogRGVzdHJveSB0aGUgcHJldmlvdXMgb3V0cHV0IGltYWdlKi8KKyAgICBpZiAocF9qMmstPm1fb3V0cHV0X2ltYWdlKSB7CisgICAgICAgIG9wal9pbWFnZV9kZXN0cm95KHBfajJrLT5tX291dHB1dF9pbWFnZSk7CisgICAgfQogCi0gICAgICAgIC8qIENvbXB1dGUgdGhlIGRpbWVuc2lvbiBvZiB0aGUgZGVzaXJlZCB0aWxlKi8KLSAgICAgICAgbF90aWxlX3ggPSB0aWxlX2luZGV4ICUgcF9qMmstPm1fY3AudHc7Ci0gICAgICAgIGxfdGlsZV95ID0gdGlsZV9pbmRleCAvIHBfajJrLT5tX2NwLnR3OworICAgIC8qIENyZWF0ZSB0aGUgb3VwdXQgaW1hZ2UgZnJvbSB0aGUgaW5mb3JtYXRpb24gcHJldmlvdXNseSBjb21wdXRlZCovCisgICAgcF9qMmstPm1fb3V0cHV0X2ltYWdlID0gb3BqX2ltYWdlX2NyZWF0ZTAoKTsKKyAgICBpZiAoIShwX2oyay0+bV9vdXRwdXRfaW1hZ2UpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIG9wal9jb3B5X2ltYWdlX2hlYWRlcihwX2ltYWdlLCBwX2oyay0+bV9vdXRwdXRfaW1hZ2UpOwogCi0gICAgICAgIHBfaW1hZ2UtPngwID0gbF90aWxlX3ggKiBwX2oyay0+bV9jcC50ZHggKyBwX2oyay0+bV9jcC50eDA7Ci0gICAgICAgIGlmIChwX2ltYWdlLT54MCA8IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPngwKQotICAgICAgICAgICAgICAgIHBfaW1hZ2UtPngwID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+eDA7Ci0gICAgICAgIHBfaW1hZ2UtPngxID0gKGxfdGlsZV94ICsgMSkgKiBwX2oyay0+bV9jcC50ZHggKyBwX2oyay0+bV9jcC50eDA7Ci0gICAgICAgIGlmIChwX2ltYWdlLT54MSA+IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPngxKQotICAgICAgICAgICAgICAgIHBfaW1hZ2UtPngxID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+eDE7CisgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fdGlsZV9pbmRfdG9fZGVjID0gKE9QSl9JTlQzMil0aWxlX2luZGV4OwogCi0gICAgICAgIHBfaW1hZ2UtPnkwID0gbF90aWxlX3kgKiBwX2oyay0+bV9jcC50ZHkgKyBwX2oyay0+bV9jcC50eTA7Ci0gICAgICAgIGlmIChwX2ltYWdlLT55MCA8IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPnkwKQotICAgICAgICAgICAgICAgIHBfaW1hZ2UtPnkwID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+eTA7Ci0gICAgICAgIHBfaW1hZ2UtPnkxID0gKGxfdGlsZV95ICsgMSkgKiBwX2oyay0+bV9jcC50ZHkgKyBwX2oyay0+bV9jcC50eTA7Ci0gICAgICAgIGlmIChwX2ltYWdlLT55MSA+IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPnkxKQotICAgICAgICAgICAgICAgIHBfaW1hZ2UtPnkxID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+eTE7CisgICAgLyogY3VzdG9taXphdGlvbiBvZiB0aGUgZGVjb2RpbmcgKi8KKyAgICBpZiAoIW9wal9qMmtfc2V0dXBfZGVjb2RpbmdfdGlsZShwX2oyaywgcF9tYW5hZ2VyKSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICBsX2ltZ19jb21wID0gcF9pbWFnZS0+Y29tcHM7Ci0gICAgICAgIGZvciAoY29tcG5vPTA7IGNvbXBubyA8IHBfaW1hZ2UtPm51bWNvbXBzOyArK2NvbXBubykKLSAgICAgICAgewotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBsX2NvbXBfeDEsIGxfY29tcF95MTsKKyAgICAvKiBEZWNvZGUgdGhlIGNvZGVzdHJlYW0gKi8KKyAgICBpZiAoISBvcGpfajJrX2V4ZWMocF9qMmssIHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LCBwX3N0cmVhbSwgcF9tYW5hZ2VyKSkgeworICAgICAgICBvcGpfaW1hZ2VfZGVzdHJveShwX2oyay0+bV9wcml2YXRlX2ltYWdlKTsKKyAgICAgICAgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZSA9IE5VTEw7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgICAgICAgICAgbF9pbWdfY29tcC0+ZmFjdG9yID0gcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+Y29tcHNbY29tcG5vXS5mYWN0b3I7Ci0KLSAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT54MCA9IG9wal91aW50X2NlaWxkaXYocF9pbWFnZS0+eDAsIGxfaW1nX2NvbXAtPmR4KTsKLSAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT55MCA9IG9wal91aW50X2NlaWxkaXYocF9pbWFnZS0+eTAsIGxfaW1nX2NvbXAtPmR5KTsKLSAgICAgICAgICAgICAgICBsX2NvbXBfeDEgPSBvcGpfaW50X2NlaWxkaXYoKE9QSl9JTlQzMilwX2ltYWdlLT54MSwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keCk7Ci0gICAgICAgICAgICAgICAgbF9jb21wX3kxID0gb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpcF9pbWFnZS0+eTEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHkpOwotCi0gICAgICAgICAgICAgICAgbF9pbWdfY29tcC0+dyA9IChPUEpfVUlOVDMyKShvcGpfaW50X2NlaWxkaXZwb3cyKGxfY29tcF94MSwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5mYWN0b3IpIC0gb3BqX2ludF9jZWlsZGl2cG93MigoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPngwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmZhY3RvcikpOwotICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPmggPSAoT1BKX1VJTlQzMikob3BqX2ludF9jZWlsZGl2cG93MihsX2NvbXBfeTEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZmFjdG9yKSAtIG9wal9pbnRfY2VpbGRpdnBvdzIoKE9QSl9JTlQzMilsX2ltZ19jb21wLT55MCwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5mYWN0b3IpKTsKLQotICAgICAgICAgICAgICAgIGxfaW1nX2NvbXArKzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIERlc3Ryb3kgdGhlIHByZXZpb3VzIG91dHB1dCBpbWFnZSovCi0gICAgICAgIGlmIChwX2oyay0+bV9vdXRwdXRfaW1hZ2UpCi0gICAgICAgICAgICAgICAgb3BqX2ltYWdlX2Rlc3Ryb3kocF9qMmstPm1fb3V0cHV0X2ltYWdlKTsKLQotICAgICAgICAvKiBDcmVhdGUgdGhlIG91cHV0IGltYWdlIGZyb20gdGhlIGluZm9ybWF0aW9uIHByZXZpb3VzbHkgY29tcHV0ZWQqLwotICAgICAgICBwX2oyay0+bV9vdXRwdXRfaW1hZ2UgPSBvcGpfaW1hZ2VfY3JlYXRlMCgpOwotICAgICAgICBpZiAoISAocF9qMmstPm1fb3V0cHV0X2ltYWdlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgb3BqX2NvcHlfaW1hZ2VfaGVhZGVyKHBfaW1hZ2UsIHBfajJrLT5tX291dHB1dF9pbWFnZSk7Ci0KLSAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fdGlsZV9pbmRfdG9fZGVjID0gKE9QSl9JTlQzMil0aWxlX2luZGV4OwotCi0gICAgICAgIC8qIGN1c3RvbWl6YXRpb24gb2YgdGhlIGRlY29kaW5nICovCi0gICAgICAgIG9wal9qMmtfc2V0dXBfZGVjb2RpbmdfdGlsZShwX2oyaywgcF9tYW5hZ2VyKTsKLQotICAgICAgICAvKiBEZWNvZGUgdGhlIGNvZGVzdHJlYW0gKi8KLSAgICAgICAgaWYgKCEgb3BqX2oya19leGVjIChwX2oyayxwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCxwX3N0cmVhbSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2ltYWdlX2Rlc3Ryb3kocF9qMmstPm1fcHJpdmF0ZV9pbWFnZSk7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIE1vdmUgZGF0YSBhbmQgY29weSBvbmUgaW5mb3JtYXRpb24gZnJvbSBjb2RlYyB0byBvdXRwdXQgaW1hZ2UqLwotICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHBfaW1hZ2UtPm51bWNvbXBzOyBjb21wbm8rKykgewotICAgICAgICAgICAgICAgIHBfaW1hZ2UtPmNvbXBzW2NvbXBub10ucmVzbm9fZGVjb2RlZCA9IHBfajJrLT5tX291dHB1dF9pbWFnZS0+Y29tcHNbY29tcG5vXS5yZXNub19kZWNvZGVkOwotCi0gICAgICAgICAgICAgICAgaWYgKHBfaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YSk7Ci0KLSAgICAgICAgICAgICAgICBwX2ltYWdlLT5jb21wc1tjb21wbm9dLmRhdGEgPSBwX2oyay0+bV9vdXRwdXRfaW1hZ2UtPmNvbXBzW2NvbXBub10uZGF0YTsKLQotICAgICAgICAgICAgICAgIHBfajJrLT5tX291dHB1dF9pbWFnZS0+Y29tcHNbY29tcG5vXS5kYXRhID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAvKiBNb3ZlIGRhdGEgYW5kIGNvcHkgb25lIGluZm9ybWF0aW9uIGZyb20gY29kZWMgdG8gb3V0cHV0IGltYWdlKi8KKyAgICByZXR1cm4gb3BqX2oya19tb3ZlX2RhdGFfZnJvbV9jb2RlY190b19vdXRwdXRfaW1hZ2UocF9qMmssIHBfaW1hZ2UpOwogfQogCiBPUEpfQk9PTCBvcGpfajJrX3NldF9kZWNvZGVkX3Jlc29sdXRpb25fZmFjdG9yKG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcmVzX2ZhY3RvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQorICAgICAgICBPUEpfVUlOVDMyIHJlc19mYWN0b3IsCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKIHsKLSAgICAgICAgT1BKX1VJTlQzMiBpdF9jb21wOworICAgIE9QSl9VSU5UMzIgaXRfY29tcDsKIAotICAgICAgICBwX2oyay0+bV9jcC5tX3NwZWNpZmljX3BhcmFtLm1fZGVjLm1fcmVkdWNlID0gcmVzX2ZhY3RvcjsKKyAgICBwX2oyay0+bV9jcC5tX3NwZWNpZmljX3BhcmFtLm1fZGVjLm1fcmVkdWNlID0gcmVzX2ZhY3RvcjsKIAotICAgICAgICBpZiAocF9qMmstPm1fcHJpdmF0ZV9pbWFnZSkgewotICAgICAgICAgICAgICAgIGlmIChwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5jb21wcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2RlY29kZXIubV9kZWZhdWx0X3RjcC0+dGNjcHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGl0X2NvbXAgPSAwIDsgaXRfY29tcCA8IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOyBpdF9jb21wKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbWF4X3JlcyA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwLT50Y2Nwc1tpdF9jb21wXS5udW1yZXNvbHV0aW9uczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmVzX2ZhY3RvciA+PSBtYXhfcmVzKXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlJlc29sdXRpb24gZmFjdG9yIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSByZXNvbHV0aW9uIGluIHRoZSBjb21wb25lbnQuXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPmNvbXBzW2l0X2NvbXBdLmZhY3RvciA9IHJlc19mYWN0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGlmIChwX2oyay0+bV9wcml2YXRlX2ltYWdlKSB7CisgICAgICAgIGlmIChwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5jb21wcykgeworICAgICAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwKSB7CisgICAgICAgICAgICAgICAgaWYgKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX2RlZmF1bHRfdGNwLT50Y2NwcykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGl0X2NvbXAgPSAwIDsgaXRfY29tcCA8IHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPm51bWNvbXBzOyBpdF9jb21wKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbWF4X3JlcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fZGVmYXVsdF90Y3AtPnRjY3BzW2l0X2NvbXBdLm51bXJlc29sdXRpb25zOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc19mYWN0b3IgPj0gbWF4X3JlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVzb2x1dGlvbiBmYWN0b3IgaXMgZ3JlYXRlciB0aGFuIHRoZSBtYXhpbXVtIHJlc29sdXRpb24gaW4gdGhlIGNvbXBvbmVudC5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5jb21wc1tpdF9jb21wXS5mYWN0b3IgPSByZXNfZmFjdG9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICByZXR1cm4gT1BKX0ZBTFNFOwogfQogCiBPUEpfQk9PTCBvcGpfajJrX2VuY29kZShvcGpfajJrX3QgKiBwX2oyaywKICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCiB7Ci0gICAgICAgIE9QSl9VSU5UMzIgaSwgajsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX3RpbGVzOwotICAgICAgICBPUEpfVUlOVDMyIGxfbWF4X3RpbGVfc2l6ZSA9IDAsIGxfY3VycmVudF90aWxlX3NpemU7Ci0gICAgICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKLSAgICAgICAgb3BqX3RjZF90KiBwX3RjZCA9IDAwOworICAgIE9QSl9VSU5UMzIgaSwgajsKKyAgICBPUEpfVUlOVDMyIGxfbmJfdGlsZXM7CisgICAgT1BKX1NJWkVfVCBsX21heF90aWxlX3NpemUgPSAwLCBsX2N1cnJlbnRfdGlsZV9zaXplOworICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKKyAgICBPUEpfQk9PTCBsX3JldXNlX2RhdGEgPSBPUEpfRkFMU0U7CisgICAgb3BqX3RjZF90KiBwX3RjZCA9IDAwOwogCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0JCi0gICAgICAgIHBfdGNkID0gcF9qMmstPm1fdGNkOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CiAKLSAgICAgICAgbF9uYl90aWxlcyA9IHBfajJrLT5tX2NwLnRoICogcF9qMmstPm1fY3AudHc7Ci0gICAgICAgIGZvciAoaT0wO2k8bF9uYl90aWxlczsrK2kpIHsKLSAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX3ByZV93cml0ZV90aWxlKHBfajJrLGkscF9zdHJlYW0scF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY3VycmVudF9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQorICAgIHBfdGNkID0gcF9qMmstPm1fdGNkOwogCi0gICAgICAgICAgICAgICAgLyogaWYgd2Ugb25seSBoYXZlIG9uZSB0aWxlLCB0aGVuIHNpbXBseSBzZXQgdGlsZSBjb21wb25lbnQgZGF0YSBlcXVhbCB0byBpbWFnZSBjb21wb25lbnQgZGF0YSAqLwotICAgICAgICAgICAgICAgIC8qIG90aGVyd2lzZSwgYWxsb2NhdGUgdGhlIGRhdGEgKi8KLSAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPHBfajJrLT5tX3RjZC0+aW1hZ2UtPm51bWNvbXBzOysraikgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlY29tcF90KiBsX3RpbGVjID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzICsgajsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX25iX3RpbGVzID09IDEpIHsKLQkJCQkJCQkJCQkJCSAgICAgICAgb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1nX2NvbXAgPSBwX3RjZC0+aW1hZ2UtPmNvbXBzICsgajsKLQkJCQkJCQkJCQkJCSAgICAgICAgbF90aWxlYy0+ZGF0YSAgPSAgbF9pbWdfY29tcC0+ZGF0YTsKLQkJCQkJCQkJCQkJCSAgICAgICAgbF90aWxlYy0+b3duc0RhdGEgPSBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotCQkJCQkJCQkJCQkJICAgICAgICBpZighIG9wal9hbGxvY190aWxlX2NvbXBvbmVudF9kYXRhKGxfdGlsZWMpKSB7Ci0JCQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIGFsbG9jYXRpbmcgdGlsZSBjb21wb25lbnQgZGF0YS4iICk7Ci0JCQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgaWYgKGxfY3VycmVudF9kYXRhKSB7Ci0JCQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7Ci0JCQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgfQotCQkJCQkJCQkJCQkJICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0JCQkJCQkJCQkJCQkgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbF9jdXJyZW50X3RpbGVfc2l6ZSA9IG9wal90Y2RfZ2V0X2VuY29kZWRfdGlsZV9zaXplKHBfajJrLT5tX3RjZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxfbmJfdGlsZXMgPiAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jdXJyZW50X3RpbGVfc2l6ZSA+IGxfbWF4X3RpbGVfc2l6ZSkgewotCQkJCQkJCQkJCQkJICAgICAgICBPUEpfQllURSAqbF9uZXdfY3VycmVudF9kYXRhID0gKE9QSl9CWVRFICopIG9wal9yZWFsbG9jKGxfY3VycmVudF9kYXRhLCBsX2N1cnJlbnRfdGlsZV9zaXplKTsKLQkJCQkJCQkJCQkJCSAgICAgICAgaWYgKCEgbF9uZXdfY3VycmVudF9kYXRhKSB7Ci0JCQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgaWYgKGxfY3VycmVudF9kYXRhKSB7Ci0JCQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7Ci0JCQkJCQkJCQkJCQkgICAgICAgICAgICAgICAgfQotCQkJCQkJCQkJCQkJICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBlbmNvZGUgYWxsIHRpbGVzXG4iKTsKLQkJCQkJCQkJCQkJCSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotCQkJCQkJCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJCQkJCQlsX2N1cnJlbnRfZGF0YSA9IGxfbmV3X2N1cnJlbnRfZGF0YTsKLQkJCQkJCQkJCQkJCQkJCQlsX21heF90aWxlX3NpemUgPSBsX2N1cnJlbnRfdGlsZV9zaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IGltYWdlIGRhdGEgKDMyIGJpdCkgdG8gbF9jdXJyZW50X2RhdGEgYXMgY29udGlndW91cywgYWxsLWNvbXBvbmVudCwgemVybyBvZmZzZXQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAzMiBiaXQgY29tcG9uZW50cyBAIDggYml0IHByZWNpc2lvbiBnZXQgY29udmVydGVkIHRvIDggYml0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiAzMiBiaXQgY29tcG9uZW50cyBAIDE2IGJpdCBwcmVjaXNpb24gZ2V0IGNvbnZlcnRlZCB0byAxNiBiaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9qMmtfZ2V0X3RpbGVfZGF0YShwX2oyay0+bV90Y2QsbF9jdXJyZW50X2RhdGEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBub3cgY29weSB0aGlzIGRhdGEgaW50byB0aGUgdGlsZSBjb21wb25lbnQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal90Y2RfY29weV90aWxlX2RhdGEocF9qMmstPm1fdGNkLGxfY3VycmVudF9kYXRhLGxfY3VycmVudF90aWxlX3NpemUpKSB7Ci0JCQkJCQkJCQkJCQkJCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlNpemUgbWlzbWF0Y2ggYmV0d2VlbiB0aWxlIGRhdGEgYW5kIHNlbnQgZGF0YS4iICk7Ci0JCQkJCQkJCQkJCQkJCQkJb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOwotCQkJCQkJCQkJCQkJCQkJCXJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCEgb3BqX2oya19wb3N0X3dyaXRlX3RpbGUgKHBfajJrLHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2N1cnJlbnRfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KKyAgICBsX25iX3RpbGVzID0gcF9qMmstPm1fY3AudGggKiBwX2oyay0+bV9jcC50dzsKKyAgICBpZiAobF9uYl90aWxlcyA9PSAxKSB7CisgICAgICAgIGxfcmV1c2VfZGF0YSA9IE9QSl9UUlVFOworI2lmZGVmIF9fU1NFX18KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHBfajJrLT5tX3RjZC0+aW1hZ2UtPm51bWNvbXBzOyArK2opIHsKKyAgICAgICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gcF90Y2QtPmltYWdlLT5jb21wcyArIGo7CisgICAgICAgICAgICBpZiAoKChzaXplX3QpbF9pbWdfY29tcC0+ZGF0YSAmIDB4RlUpICE9CisgICAgICAgICAgICAgICAgICAgIDBVKSB7IC8qIHRpbGUgZGF0YSBzaGFsbCBiZSBhbGlnbmVkIG9uIDE2IGJ5dGVzICovCisgICAgICAgICAgICAgICAgbF9yZXVzZV9kYXRhID0gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxfY3VycmVudF9kYXRhKSB7CisjZW5kaWYKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGxfbmJfdGlsZXM7ICsraSkgeworICAgICAgICBpZiAoISBvcGpfajJrX3ByZV93cml0ZV90aWxlKHBfajJrLCBpLCBwX3N0cmVhbSwgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgaWYgKGxfY3VycmVudF9kYXRhKSB7CiAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisKKyAgICAgICAgLyogaWYgd2Ugb25seSBoYXZlIG9uZSB0aWxlLCB0aGVuIHNpbXBseSBzZXQgdGlsZSBjb21wb25lbnQgZGF0YSBlcXVhbCB0byBpbWFnZSBjb21wb25lbnQgZGF0YSAqLworICAgICAgICAvKiBvdGhlcndpc2UsIGFsbG9jYXRlIHRoZSBkYXRhICovCisgICAgICAgIGZvciAoaiA9IDA7IGogPCBwX2oyay0+bV90Y2QtPmltYWdlLT5udW1jb21wczsgKytqKSB7CisgICAgICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QqIGxfdGlsZWMgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+Y29tcHMgKyBqOworICAgICAgICAgICAgaWYgKGxfcmV1c2VfZGF0YSkgeworICAgICAgICAgICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gcF90Y2QtPmltYWdlLT5jb21wcyArIGo7CisgICAgICAgICAgICAgICAgbF90aWxlYy0+ZGF0YSAgPSAgbF9pbWdfY29tcC0+ZGF0YTsKKyAgICAgICAgICAgICAgICBsX3RpbGVjLT5vd25zRGF0YSA9IE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCEgb3BqX2FsbG9jX3RpbGVfY29tcG9uZW50X2RhdGEobF90aWxlYykpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIGFsbG9jYXRpbmcgdGlsZSBjb21wb25lbnQgZGF0YS4iKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxfY3VycmVudF9kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbF9jdXJyZW50X3RpbGVfc2l6ZSA9IG9wal90Y2RfZ2V0X2VuY29kZWRfdGlsZV9zaXplKHBfajJrLT5tX3RjZCk7CisgICAgICAgIGlmICghbF9yZXVzZV9kYXRhKSB7CisgICAgICAgICAgICBpZiAobF9jdXJyZW50X3RpbGVfc2l6ZSA+IGxfbWF4X3RpbGVfc2l6ZSkgeworICAgICAgICAgICAgICAgIE9QSl9CWVRFICpsX25ld19jdXJyZW50X2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX3JlYWxsb2MobF9jdXJyZW50X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF90aWxlX3NpemUpOworICAgICAgICAgICAgICAgIGlmICghIGxfbmV3X2N1cnJlbnRfZGF0YSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobF9jdXJyZW50X2RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gZW5jb2RlIGFsbCB0aWxlc1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxfY3VycmVudF9kYXRhID0gbF9uZXdfY3VycmVudF9kYXRhOworICAgICAgICAgICAgICAgIGxfbWF4X3RpbGVfc2l6ZSA9IGxfY3VycmVudF90aWxlX3NpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobF9jdXJyZW50X2RhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIC8qIFNob3VsZCBub3QgaGFwcGVuIGluIHByYWN0aWNlLCBidXQgd2lsbCBhdm9pZCBDb3Zlcml0eSB0byAqLworICAgICAgICAgICAgICAgIC8qIGNvbXBsYWluIGFib3V0IGEgbnVsbCBwb2ludGVyIGRlcmVmZXJlbmNlICovCisgICAgICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNvcHkgaW1hZ2UgZGF0YSAoMzIgYml0KSB0byBsX2N1cnJlbnRfZGF0YSBhcyBjb250aWd1b3VzLCBhbGwtY29tcG9uZW50LCB6ZXJvIG9mZnNldCBidWZmZXIgKi8KKyAgICAgICAgICAgIC8qIDMyIGJpdCBjb21wb25lbnRzIEAgOCBiaXQgcHJlY2lzaW9uIGdldCBjb252ZXJ0ZWQgdG8gOCBiaXQgKi8KKyAgICAgICAgICAgIC8qIDMyIGJpdCBjb21wb25lbnRzIEAgMTYgYml0IHByZWNpc2lvbiBnZXQgY29udmVydGVkIHRvIDE2IGJpdCAqLworICAgICAgICAgICAgb3BqX2oya19nZXRfdGlsZV9kYXRhKHBfajJrLT5tX3RjZCwgbF9jdXJyZW50X2RhdGEpOworCisgICAgICAgICAgICAvKiBub3cgY29weSB0aGlzIGRhdGEgaW50byB0aGUgdGlsZSBjb21wb25lbnQgKi8KKyAgICAgICAgICAgIGlmICghIG9wal90Y2RfY29weV90aWxlX2RhdGEocF9qMmstPm1fdGNkLCBsX2N1cnJlbnRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3RpbGVfc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpemUgbWlzbWF0Y2ggYmV0d2VlbiB0aWxlIGRhdGEgYW5kIHNlbnQgZGF0YS4iKTsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghIG9wal9qMmtfcG9zdF93cml0ZV90aWxlKHBfajJrLCBwX3N0cmVhbSwgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgaWYgKGxfY3VycmVudF9kYXRhKSB7CisgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChsX2N1cnJlbnRfZGF0YSkgeworICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7CisgICAgfQorICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAotT1BKX0JPT0wgb3BqX2oya19lbmRfY29tcHJlc3MoICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKK09QSl9CT09MIG9wal9qMmtfZW5kX2NvbXByZXNzKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCiB7Ci0gICAgICAgIC8qIGN1c3RvbWl6YXRpb24gb2YgdGhlIGVuY29kaW5nICovCi0gICAgICAgIGlmICghIG9wal9qMmtfc2V0dXBfZW5kX2NvbXByZXNzKHBfajJrLCBwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIC8qIGN1c3RvbWl6YXRpb24gb2YgdGhlIGVuY29kaW5nICovCisgICAgaWYgKCEgb3BqX2oya19zZXR1cF9lbmRfY29tcHJlc3MocF9qMmssIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgaWYgKCEgb3BqX2oya19leGVjIChwX2oyaywgcF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsIHBfc3RyZWFtLCBwX21hbmFnZXIpKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIGlmICghIG9wal9qMmtfZXhlYyhwX2oyaywgcF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsIHBfc3RyZWFtLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKIE9QSl9CT09MIG9wal9qMmtfc3RhcnRfY29tcHJlc3Mob3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90ICogcF9pbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqIHBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKIHsKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0gICAgICAgIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UgPSBvcGpfaW1hZ2VfY3JlYXRlMCgpOwotICAgICAgICBpZiAoISBwX2oyay0+bV9wcml2YXRlX2ltYWdlKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBpbWFnZSBoZWFkZXIuIiApOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZSA9IG9wal9pbWFnZV9jcmVhdGUwKCk7CisgICAgaWYgKCEgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIGFsbG9jYXRlIGltYWdlIGhlYWRlci4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgb3BqX2NvcHlfaW1hZ2VfaGVhZGVyKHBfaW1hZ2UsIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpOworCisgICAgLyogVE9ET19NU0Q6IEZpbmQgYSBiZXR0ZXIgd2F5ICovCisgICAgaWYgKHBfaW1hZ2UtPmNvbXBzKSB7CisgICAgICAgIE9QSl9VSU5UMzIgaXRfY29tcDsKKyAgICAgICAgZm9yIChpdF9jb21wID0gMCA7IGl0X2NvbXAgPCBwX2ltYWdlLT5udW1jb21wczsgaXRfY29tcCsrKSB7CisgICAgICAgICAgICBpZiAocF9pbWFnZS0+Y29tcHNbaXRfY29tcF0uZGF0YSkgeworICAgICAgICAgICAgICAgIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UtPmNvbXBzW2l0X2NvbXBdLmRhdGEgPSBwX2ltYWdlLT5jb21wc1tpdF9jb21wXS5kYXRhOworICAgICAgICAgICAgICAgIHBfaW1hZ2UtPmNvbXBzW2l0X2NvbXBdLmRhdGEgPSBOVUxMOworCisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgb3BqX2NvcHlfaW1hZ2VfaGVhZGVyKHBfaW1hZ2UsIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UpOworICAgIH0KIAotICAgICAgICAvKiBUT0RPX01TRDogRmluZCBhIGJldHRlciB3YXkgKi8KLSAgICAgICAgaWYgKHBfaW1hZ2UtPmNvbXBzKSB7Ci0gICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBpdF9jb21wOwotICAgICAgICAgICAgICAgIGZvciAoaXRfY29tcCA9IDAgOyBpdF9jb21wIDwgcF9pbWFnZS0+bnVtY29tcHM7IGl0X2NvbXArKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBfaW1hZ2UtPmNvbXBzW2l0X2NvbXBdLmRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+Y29tcHNbaXRfY29tcF0uZGF0YSA9cF9pbWFnZS0+Y29tcHNbaXRfY29tcF0uZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9pbWFnZS0+Y29tcHNbaXRfY29tcF0uZGF0YSA9IE5VTEw7CisgICAgLyogY3VzdG9taXphdGlvbiBvZiB0aGUgdmFsaWRhdGlvbiAqLworICAgIGlmICghIG9wal9qMmtfc2V0dXBfZW5jb2RpbmdfdmFsaWRhdGlvbihwX2oyaywgcF9tYW5hZ2VyKSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIC8qIHZhbGlkYXRpb24gb2YgdGhlIHBhcmFtZXRlcnMgY29kZWMgKi8KKyAgICBpZiAoISBvcGpfajJrX2V4ZWMocF9qMmssIHBfajJrLT5tX3ZhbGlkYXRpb25fbGlzdCwgcF9zdHJlYW0sIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgLyogY3VzdG9taXphdGlvbiBvZiB0aGUgdmFsaWRhdGlvbiAqLwotICAgICAgICBpZiAoISBvcGpfajJrX3NldHVwX2VuY29kaW5nX3ZhbGlkYXRpb24gKHBfajJrLCBwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIC8qIGN1c3RvbWl6YXRpb24gb2YgdGhlIGVuY29kaW5nICovCisgICAgaWYgKCEgb3BqX2oya19zZXR1cF9oZWFkZXJfd3JpdGluZyhwX2oyaywgcF9tYW5hZ2VyKSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICAvKiB2YWxpZGF0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzIGNvZGVjICovCi0gICAgICAgIGlmICghIG9wal9qMmtfZXhlYyhwX2oyayxwX2oyay0+bV92YWxpZGF0aW9uX2xpc3QscF9zdHJlYW0scF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICAvKiB3cml0ZSBoZWFkZXIgKi8KKyAgICBpZiAoISBvcGpfajJrX2V4ZWMocF9qMmssIHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LCBwX3N0cmVhbSwgcF9tYW5hZ2VyKSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICAvKiBjdXN0b21pemF0aW9uIG9mIHRoZSBlbmNvZGluZyAqLwotICAgICAgICBpZiAoISBvcGpfajJrX3NldHVwX2hlYWRlcl93cml0aW5nKHBfajJrLCBwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHdyaXRlIGhlYWRlciAqLwotICAgICAgICBpZiAoISBvcGpfajJrX2V4ZWMgKHBfajJrLHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcHJlX3dyaXRlX3RpbGUgKCAgICAgICBvcGpfajJrX3QgKiBwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3ByZV93cml0ZV90aWxlKG9wal9qMmtfdCAqIHBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCiB7Ci0gICh2b2lkKXBfc3RyZWFtOwotICAgICAgICBpZiAocF90aWxlX2luZGV4ICE9IHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiVGhlIGdpdmVuIHRpbGUgaW5kZXggZG9lcyBub3QgbWF0Y2guIiApOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICAodm9pZClwX3N0cmVhbTsKKyAgICBpZiAocF90aWxlX2luZGV4ICE9IHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlRoZSBnaXZlbiB0aWxlIGluZGV4IGRvZXMgbm90IG1hdGNoLiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0lORk8sICJ0aWxlIG51bWJlciAlZCAvICVkXG4iLCBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyICsgMSwgcF9qMmstPm1fY3AudHcgKiBwX2oyay0+bV9jcC50aCk7CisgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9JTkZPLCAidGlsZSBudW1iZXIgJWQgLyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIgKyAxLCBwX2oyay0+bV9jcC50dyAqIHBfajJrLT5tX2NwLnRoKTsKIAotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXIgPSAwOwotICAgICAgICBwX2oyay0+bV90Y2QtPmN1cl90b3RudW1fdHAgPSBwX2oyay0+bV9jcC50Y3BzW3BfdGlsZV9pbmRleF0ubV9uYl90aWxlX3BhcnRzOwotICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3BvY190aWxlX3BhcnRfbnVtYmVyID0gMDsKKyAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXIgPSAwOworICAgIHBfajJrLT5tX3RjZC0+Y3VyX3RvdG51bV90cCA9IHBfajJrLT5tX2NwLnRjcHNbcF90aWxlX2luZGV4XS5tX25iX3RpbGVfcGFydHM7CisgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fY3VycmVudF9wb2NfdGlsZV9wYXJ0X251bWJlciA9IDA7CiAKLSAgICAgICAgLyogaW5pdGlhbGlzYXRpb24gYmVmb3JlIHRpbGUgZW5jb2RpbmcgICovCi0gICAgICAgIGlmICghIG9wal90Y2RfaW5pdF9lbmNvZGVfdGlsZShwX2oyay0+bV90Y2QsIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIsIHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgLyogaW5pdGlhbGlzYXRpb24gYmVmb3JlIHRpbGUgZW5jb2RpbmcgICovCisgICAgaWYgKCEgb3BqX3RjZF9pbml0X2VuY29kZV90aWxlKHBfajJrLT5tX3RjZCwgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiBzdGF0aWMgdm9pZCBvcGpfZ2V0X3RpbGVfZGltZW5zaW9ucyhvcGpfaW1hZ2VfdCAqIGxfaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqIGxfdGlsZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiBsX3NpemVfY29tcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiogbF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiogbF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqIGxfb2Zmc2V0X3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqIGxfb2Zmc2V0X3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqIGxfaW1hZ2Vfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqIGxfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiBsX3RpbGVfb2Zmc2V0KSB7Ci0JT1BKX1VJTlQzMiBsX3JlbWFpbmluZzsKLQkqbF9zaXplX2NvbXAgPSBsX2ltZ19jb21wLT5wcmVjID4+IDM7IC8qICgvOCkgKi8KLQlsX3JlbWFpbmluZyA9IGxfaW1nX2NvbXAtPnByZWMgJiA3OyAgLyogKCU4KSAqLwotCWlmIChsX3JlbWFpbmluZykgewotCQkqbF9zaXplX2NvbXAgKz0gMTsKLQl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKiBsX3RpbGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1nX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiBsX3NpemVfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqIGxfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiBsX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqIGxfb2Zmc2V0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiBsX29mZnNldF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiogbF9pbWFnZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqIGxfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiogbF90aWxlX29mZnNldCkKK3sKKyAgICBPUEpfVUlOVDMyIGxfcmVtYWluaW5nOworICAgICpsX3NpemVfY29tcCA9IGxfaW1nX2NvbXAtPnByZWMgPj4gMzsgLyogKC84KSAqLworICAgIGxfcmVtYWluaW5nID0gbF9pbWdfY29tcC0+cHJlYyAmIDc7ICAvKiAoJTgpICovCisgICAgaWYgKGxfcmVtYWluaW5nKSB7CisgICAgICAgICpsX3NpemVfY29tcCArPSAxOworICAgIH0KIAotCWlmICgqbF9zaXplX2NvbXAgPT0gMykgewotCQkqbF9zaXplX2NvbXAgPSA0OwotCX0KKyAgICBpZiAoKmxfc2l6ZV9jb21wID09IDMpIHsKKyAgICAgICAgKmxfc2l6ZV9jb21wID0gNDsKKyAgICB9CiAKLQkqbF93aWR0aCAgPSAoT1BKX1VJTlQzMikobF90aWxlYy0+eDEgLSBsX3RpbGVjLT54MCk7Ci0JKmxfaGVpZ2h0ID0gKE9QSl9VSU5UMzIpKGxfdGlsZWMtPnkxIC0gbF90aWxlYy0+eTApOwotCSpsX29mZnNldF94ID0gb3BqX3VpbnRfY2VpbGRpdihsX2ltYWdlLT54MCwgbF9pbWdfY29tcC0+ZHgpOwotCSpsX29mZnNldF95ID0gb3BqX3VpbnRfY2VpbGRpdihsX2ltYWdlLT55MCwgbF9pbWdfY29tcC0+ZHkpOwotCSpsX2ltYWdlX3dpZHRoID0gKE9QSl9VSU5UMzIpb3BqX2ludF9jZWlsZGl2KChPUEpfSU5UMzIpbF9pbWFnZS0+eDEgLSAoT1BKX0lOVDMyKWxfaW1hZ2UtPngwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR4KTsKLQkqbF9zdHJpZGUgPSAqbF9pbWFnZV93aWR0aCAtICpsX3dpZHRoOwotCSpsX3RpbGVfb2Zmc2V0ID0gKChPUEpfVUlOVDMyKWxfdGlsZWMtPngwIC0gKmxfb2Zmc2V0X3gpICsgKChPUEpfVUlOVDMyKWxfdGlsZWMtPnkwIC0gKmxfb2Zmc2V0X3kpICogKmxfaW1hZ2Vfd2lkdGg7CisgICAgKmxfd2lkdGggID0gKE9QSl9VSU5UMzIpKGxfdGlsZWMtPngxIC0gbF90aWxlYy0+eDApOworICAgICpsX2hlaWdodCA9IChPUEpfVUlOVDMyKShsX3RpbGVjLT55MSAtIGxfdGlsZWMtPnkwKTsKKyAgICAqbF9vZmZzZXRfeCA9IG9wal91aW50X2NlaWxkaXYobF9pbWFnZS0+eDAsIGxfaW1nX2NvbXAtPmR4KTsKKyAgICAqbF9vZmZzZXRfeSA9IG9wal91aW50X2NlaWxkaXYobF9pbWFnZS0+eTAsIGxfaW1nX2NvbXAtPmR5KTsKKyAgICAqbF9pbWFnZV93aWR0aCA9IChPUEpfVUlOVDMyKW9wal9pbnRfY2VpbGRpdigoT1BKX0lOVDMyKWxfaW1hZ2UtPngxIC0KKyAgICAgICAgICAgICAgICAgICAgIChPUEpfSU5UMzIpbF9pbWFnZS0+eDAsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHgpOworICAgICpsX3N0cmlkZSA9ICpsX2ltYWdlX3dpZHRoIC0gKmxfd2lkdGg7CisgICAgKmxfdGlsZV9vZmZzZXQgPSAoKE9QSl9VSU5UMzIpbF90aWxlYy0+eDAgLSAqbF9vZmZzZXRfeCkgKyAoKAorICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIpbF90aWxlYy0+eTAgLSAqbF9vZmZzZXRfeSkgKiAqbF9pbWFnZV93aWR0aDsKIH0KIAotc3RhdGljIHZvaWQgb3BqX2oya19nZXRfdGlsZV9kYXRhIChvcGpfdGNkX3QgKiBwX3RjZCwgT1BKX0JZVEUgKiBwX2RhdGEpCitzdGF0aWMgdm9pZCBvcGpfajJrX2dldF90aWxlX2RhdGEob3BqX3RjZF90ICogcF90Y2QsIE9QSl9CWVRFICogcF9kYXRhKQogewotICAgICAgICBPUEpfVUlOVDMyIGksaixrID0gMDsKKyAgICBPUEpfVUlOVDMyIGksIGosIGsgPSAwOwogCi0gICAgICAgIGZvciAoaT0wO2k8cF90Y2QtPmltYWdlLT5udW1jb21wczsrK2kpIHsKLSAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqIGxfaW1hZ2UgPSAgcF90Y2QtPmltYWdlOwotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIGxfc3JjX3B0cjsKLSAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKiBsX3RpbGVjID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzICsgaTsKLSAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IGxfaW1hZ2UtPmNvbXBzICsgaTsKLSAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxfc2l6ZV9jb21wLGxfd2lkdGgsbF9oZWlnaHQsbF9vZmZzZXRfeCxsX29mZnNldF95LCBsX2ltYWdlX3dpZHRoLGxfc3RyaWRlLGxfdGlsZV9vZmZzZXQ7CisgICAgZm9yIChpID0gMDsgaSA8IHBfdGNkLT5pbWFnZS0+bnVtY29tcHM7ICsraSkgeworICAgICAgICBvcGpfaW1hZ2VfdCAqIGxfaW1hZ2UgPSAgcF90Y2QtPmltYWdlOworICAgICAgICBPUEpfSU5UMzIgKiBsX3NyY19wdHI7CisgICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqIGxfdGlsZWMgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+Y29tcHMgKyBpOworICAgICAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IGxfaW1hZ2UtPmNvbXBzICsgaTsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3NpemVfY29tcCwgbF93aWR0aCwgbF9oZWlnaHQsIGxfb2Zmc2V0X3gsIGxfb2Zmc2V0X3ksCisgICAgICAgICAgICAgICAgICAgbF9pbWFnZV93aWR0aCwgbF9zdHJpZGUsIGxfdGlsZV9vZmZzZXQ7CiAKLSAgICAgICAgICAgICAgICBvcGpfZ2V0X3RpbGVfZGltZW5zaW9ucyhsX2ltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGlsZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9pbWdfY29tcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9zaXplX2NvbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX29mZnNldF94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX29mZnNldF95LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX2ltYWdlX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF90aWxlX29mZnNldCk7CisgICAgICAgIG9wal9nZXRfdGlsZV9kaW1lbnNpb25zKGxfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGlsZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX3NpemVfY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfb2Zmc2V0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX29mZnNldF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9pbWFnZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF90aWxlX29mZnNldCk7CiAKLSAgICAgICAgICAgICAgICBsX3NyY19wdHIgPSBsX2ltZ19jb21wLT5kYXRhICsgbF90aWxlX29mZnNldDsKKyAgICAgICAgbF9zcmNfcHRyID0gbF9pbWdfY29tcC0+ZGF0YSArIGxfdGlsZV9vZmZzZXQ7CiAKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGxfc2l6ZV9jb21wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQ0hBUiAqIGxfZGVzdF9wdHIgPSAoT1BKX0NIQVIqKSBwX2RhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfaW1nX2NvbXAtPnNnbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAgICAgKGo9MDtqPGxfaGVpZ2h0OysraikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGs9MDtrPGxfd2lkdGg7KytrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKSA9IChPUEpfQ0hBUikgKCpsX3NyY19wdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9kZXN0X3B0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfc3JjX3B0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajxsX2hlaWdodDsrK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrPTA7azxsX3dpZHRoOysraykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoobF9kZXN0X3B0cikgPSAoT1BKX0NIQVIpKCgqbF9zcmNfcHRyKSYweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfZGVzdF9wdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX3NyY19wdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zcmNfcHRyICs9IGxfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSA9IChPUEpfQllURSopIGxfZGVzdF9wdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMTYgKiBsX2Rlc3RfcHRyID0gKE9QSl9JTlQxNiAqKSBwX2RhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfaW1nX2NvbXAtPnNnbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9oZWlnaHQ7KytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaz0wO2s8bF93aWR0aDsrK2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIrKykgPSAoT1BKX0lOVDE2KSAoKihsX3NyY19wdHIrKykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfaGVpZ2h0OysraikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGs9MDtrPGxfd2lkdGg7KytrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKE9QSl9JTlQxNikoKCoobF9zcmNfcHRyKyspKSAmIDB4ZmZmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zcmNfcHRyICs9IGxfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSA9IChPUEpfQllURSopIGxfZGVzdF9wdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBsX2Rlc3RfcHRyID0gKE9QSl9JTlQzMiAqKSBwX2RhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajxsX2hlaWdodDsrK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaz0wO2s8bF93aWR0aDsrK2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKihsX3NyY19wdHIrKyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhID0gKE9QSl9CWVRFKikgbF9kZXN0X3B0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc3dpdGNoIChsX3NpemVfY29tcCkgeworICAgICAgICBjYXNlIDE6IHsKKyAgICAgICAgICAgIE9QSl9DSEFSICogbF9kZXN0X3B0ciA9IChPUEpfQ0hBUiopIHBfZGF0YTsKKyAgICAgICAgICAgIGlmIChsX2ltZ19jb21wLT5zZ25kKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxfaGVpZ2h0OyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGxfd2lkdGg7ICsraykgeworICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKSA9IChPUEpfQ0hBUikoKmxfc3JjX3B0cik7CisgICAgICAgICAgICAgICAgICAgICAgICArK2xfZGVzdF9wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICArK2xfc3JjX3B0cjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9zdHJpZGU7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbF9oZWlnaHQ7ICsraikgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbF93aWR0aDsgKytrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIpID0gKE9QSl9DSEFSKSgoKmxfc3JjX3B0cikgJiAweGZmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrbF9kZXN0X3B0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrbF9zcmNfcHRyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0cmlkZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBfZGF0YSA9IChPUEpfQllURSopIGxfZGVzdF9wdHI7CiAgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogeworICAgICAgICAgICAgT1BKX0lOVDE2ICogbF9kZXN0X3B0ciA9IChPUEpfSU5UMTYgKikgcF9kYXRhOworICAgICAgICAgICAgaWYgKGxfaW1nX2NvbXAtPnNnbmQpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbF9oZWlnaHQ7ICsraikgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbF93aWR0aDsgKytrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIrKykgPSAoT1BKX0lOVDE2KSgqKGxfc3JjX3B0cisrKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbF9zcmNfcHRyICs9IGxfc3RyaWRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxfaGVpZ2h0OyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGxfd2lkdGg7ICsraykgeworICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKE9QSl9JTlQxNikoKCoobF9zcmNfcHRyKyspKSAmIDB4ZmZmZik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbF9zcmNfcHRyICs9IGxfc3RyaWRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcF9kYXRhID0gKE9QSl9CWVRFKikgbF9kZXN0X3B0cjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OiB7CisgICAgICAgICAgICBPUEpfSU5UMzIgKiBsX2Rlc3RfcHRyID0gKE9QSl9JTlQzMiAqKSBwX2RhdGE7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbF9oZWlnaHQ7ICsraikgeworICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBsX3dpZHRoOyArK2spIHsKKyAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKihsX3NyY19wdHIrKyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0cmlkZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcF9kYXRhID0gKE9QSl9CWVRFKikgbF9kZXN0X3B0cjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KIH0KIAotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfcG9zdF93cml0ZV90aWxlICggICAgICBvcGpfajJrX3QgKiBwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3Bvc3Rfd3JpdGVfdGlsZShvcGpfajJrX3QgKiBwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQogewotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfYnl0ZXNfd3JpdHRlbjsKLSAgICAgICAgT1BKX0JZVEUgKiBsX2N1cnJlbnRfZGF0YSA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfdGlsZV9zaXplID0gMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2F2YWlsYWJsZV9kYXRhOworICAgIE9QSl9VSU5UMzIgbF9uYl9ieXRlc193cml0dGVuOworICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKKyAgICBPUEpfVUlOVDMyIGxfdGlsZV9zaXplID0gMDsKKyAgICBPUEpfVUlOVDMyIGxfYXZhaWxhYmxlX2RhdGE7CiAKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fZW5jb2RlZF90aWxlX2RhdGEpOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fZW5jb2RlZF90aWxlX2RhdGEpOwogCi0gICAgICAgIGxfdGlsZV9zaXplID0gcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fZW5jb2RlZF90aWxlX3NpemU7Ci0gICAgICAgIGxfYXZhaWxhYmxlX2RhdGEgPSBsX3RpbGVfc2l6ZTsKLSAgICAgICAgbF9jdXJyZW50X2RhdGEgPSBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YTsKKyAgICBsX3RpbGVfc2l6ZSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2VuY29kZWRfdGlsZV9zaXplOworICAgIGxfYXZhaWxhYmxlX2RhdGEgPSBsX3RpbGVfc2l6ZTsKKyAgICBsX2N1cnJlbnRfZGF0YSA9IHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2VuY29kZWRfdGlsZV9kYXRhOwogCi0gICAgICAgIGxfbmJfYnl0ZXNfd3JpdHRlbiA9IDA7Ci0gICAgICAgIGlmICghIG9wal9qMmtfd3JpdGVfZmlyc3RfdGlsZV9wYXJ0KHBfajJrLGxfY3VycmVudF9kYXRhLCZsX25iX2J5dGVzX3dyaXR0ZW4sbF9hdmFpbGFibGVfZGF0YSxwX3N0cmVhbSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSBsX25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgIGxfYXZhaWxhYmxlX2RhdGEgLT0gbF9uYl9ieXRlc193cml0dGVuOworICAgIGxfbmJfYnl0ZXNfd3JpdHRlbiA9IDA7CisgICAgaWYgKCEgb3BqX2oya193cml0ZV9maXJzdF90aWxlX3BhcnQocF9qMmssIGxfY3VycmVudF9kYXRhLCAmbF9uYl9ieXRlc193cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfYXZhaWxhYmxlX2RhdGEsIHBfc3RyZWFtLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGxfY3VycmVudF9kYXRhICs9IGxfbmJfYnl0ZXNfd3JpdHRlbjsKKyAgICBsX2F2YWlsYWJsZV9kYXRhIC09IGxfbmJfYnl0ZXNfd3JpdHRlbjsKIAotICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4gPSAwOwotICAgICAgICBpZiAoISBvcGpfajJrX3dyaXRlX2FsbF90aWxlX3BhcnRzKHBfajJrLGxfY3VycmVudF9kYXRhLCZsX25iX2J5dGVzX3dyaXR0ZW4sbF9hdmFpbGFibGVfZGF0YSxwX3N0cmVhbSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIGxfbmJfYnl0ZXNfd3JpdHRlbiA9IDA7CisgICAgaWYgKCEgb3BqX2oya193cml0ZV9hbGxfdGlsZV9wYXJ0cyhwX2oyaywgbF9jdXJyZW50X2RhdGEsICZsX25iX2J5dGVzX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2F2YWlsYWJsZV9kYXRhLCBwX3N0cmVhbSwgcF9tYW5hZ2VyKSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICBsX2F2YWlsYWJsZV9kYXRhIC09IGxfbmJfYnl0ZXNfd3JpdHRlbjsKLSAgICAgICAgbF9uYl9ieXRlc193cml0dGVuID0gbF90aWxlX3NpemUgLSBsX2F2YWlsYWJsZV9kYXRhOworICAgIGxfYXZhaWxhYmxlX2RhdGEgLT0gbF9uYl9ieXRlc193cml0dGVuOworICAgIGxfbmJfYnl0ZXNfd3JpdHRlbiA9IGxfdGlsZV9zaXplIC0gbF9hdmFpbGFibGVfZGF0YTsKIAotICAgICAgICBpZiAoIG9wal9zdHJlYW1fd3JpdGVfZGF0YSggICAgIHBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2VuY29kZWRfdGlsZV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbmJfYnl0ZXNfd3JpdHRlbixwX21hbmFnZXIpICE9IGxfbmJfYnl0ZXNfd3JpdHRlbikgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fZW5jb2RlZF90aWxlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4sIHBfbWFuYWdlcikgIT0gbF9uYl9ieXRlc193cml0dGVuKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgICsrcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcjsKKyAgICArK3BfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXI7CiAKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfc2V0dXBfZW5kX2NvbXByZXNzIChvcGpfajJrX3QgKnBfajJrLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19zZXR1cF9lbmRfY29tcHJlc3Mob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQogewotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0gICAgICAgIC8qIERFVkVMT1BFUiBDT1JORVIsIGluc2VydCB5b3VyIGN1c3RvbSBwcm9jZWR1cmVzICovCi0gICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfd3JpdGVfZW9jLCBwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIC8qIERFVkVMT1BFUiBDT1JORVIsIGluc2VydCB5b3VyIGN1c3RvbSBwcm9jZWR1cmVzICovCisgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9lb2MsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgaWYgKE9QSl9JU19DSU5FTUEocF9qMmstPm1fY3AucnNpeikpIHsKLSAgICAgICAgICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfajJrX3dyaXRlX3VwZGF0ZWRfdGxtLCBwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KKyAgICBpZiAoT1BKX0lTX0NJTkVNQShwX2oyay0+bV9jcC5yc2l6KSkgeworICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV91cGRhdGVkX3RsbSwgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfajJrX3dyaXRlX2VwYywgcF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya19lbmRfZW5jb2RpbmcsIHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfZGVzdHJveV9oZWFkZXJfbWVtb3J5LCBwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9lcGMsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9wcm9jZWR1cmUpb3BqX2oya19lbmRfZW5jb2RpbmcsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9wcm9jZWR1cmUpb3BqX2oya19kZXN0cm95X2hlYWRlcl9tZW1vcnksIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19zZXR1cF9lbmNvZGluZ192YWxpZGF0aW9uIChvcGpfajJrX3QgKnBfajJrLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19zZXR1cF9lbmNvZGluZ192YWxpZGF0aW9uKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKIHsKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKIAotICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV92YWxpZGF0aW9uX2xpc3QsIChvcGpfcHJvY2VkdXJlKW9wal9qMmtfYnVpbGRfZW5jb2RlciwgcF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fdmFsaWRhdGlvbl9saXN0LCAob3BqX3Byb2NlZHVyZSlvcGpfajJrX2VuY29kaW5nX3ZhbGlkYXRpb24sIHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotCQkJCX0KKyAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV92YWxpZGF0aW9uX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9wcm9jZWR1cmUpb3BqX2oya19idWlsZF9lbmNvZGVyLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3ZhbGlkYXRpb25fbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3BqX3Byb2NlZHVyZSlvcGpfajJrX2VuY29kaW5nX3ZhbGlkYXRpb24sIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgLyogREVWRUxPUEVSIENPUk5FUiwgYWRkIHlvdXIgY3VzdG9tIHZhbGlkYXRpb24gcHJvY2VkdXJlICovCi0gICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3ZhbGlkYXRpb25fbGlzdCwgKG9wal9wcm9jZWR1cmUpb3BqX2oya19tY3RfdmFsaWRhdGlvbiwgcF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQkKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIC8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSB2YWxpZGF0aW9uIHByb2NlZHVyZSAqLworICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3ZhbGlkYXRpb25fbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3BqX3Byb2NlZHVyZSlvcGpfajJrX21jdF92YWxpZGF0aW9uLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19zZXR1cF9oZWFkZXJfd3JpdGluZyAob3BqX2oya190ICpwX2oyaywgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQorc3RhdGljIE9QSl9CT09MIG9wal9qMmtfc2V0dXBfaGVhZGVyX3dyaXRpbmcob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQogewotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0gICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfaW5pdF9pbmZvLCBwX21hbmFnZXIpKSB7CisgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9wcm9jZWR1cmUpb3BqX2oya19pbml0X2luZm8sIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9zb2MsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9zaXosIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9jb2QsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9xY2QsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9hbGxfY29jLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGpfcHJvY2VkdXJlKW9wal9qMmtfd3JpdGVfYWxsX3FjYywgcF9tYW5hZ2VyKSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIGlmIChPUEpfSVNfQ0lORU1BKHBfajJrLT5tX2NwLnJzaXopKSB7CisgICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3BqX3Byb2NlZHVyZSlvcGpfajJrX3dyaXRlX3RsbSwgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwX2oyay0+bV9jcC5yc2l6ID09IE9QSl9QUk9GSUxFX0NJTkVNQV80SykgeworICAgICAgICAgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3BqX3Byb2NlZHVyZSlvcGpfajJrX3dyaXRlX3BvYywgcF9tYW5hZ2VyKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9zb2MsIHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfd3JpdGVfc2l6LCBwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfajJrX3dyaXRlX2NvZCwgcF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9xY2QsIHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgfQogCi0gICAgICAgIGlmIChPUEpfSVNfQ0lORU1BKHBfajJrLT5tX2NwLnJzaXopKSB7Ci0gICAgICAgICAgICAgICAgLyogTm8gbmVlZCBmb3IgQ09DIG9yIFFDQywgUUNEIGFuZCBDT0QgYXJlIHVzZWQKLSAgICAgICAgICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfajJrX3dyaXRlX2FsbF9jb2MsIHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfd3JpdGVfYWxsX3FjYywgcF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfajJrX3dyaXRlX3RsbSwgcF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9CisgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9yZWdpb25zLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKHBfajJrLT5tX2NwLnJzaXogPT0gT1BKX1BST0ZJTEVfQ0lORU1BXzRLKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfajJrX3dyaXRlX3BvYywgcF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKyAgICBpZiAocF9qMmstPm1fY3AuY29tbWVudCAhPSAwMCkgIHsKKyAgICAgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGpfcHJvY2VkdXJlKW9wal9qMmtfd3JpdGVfY29tLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfd3JpdGVfcmVnaW9ucywgcF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgLyogREVWRUxPUEVSIENPUk5FUiwgaW5zZXJ0IHlvdXIgY3VzdG9tIHByb2NlZHVyZXMgKi8KKyAgICBpZiAocF9qMmstPm1fY3AucnNpeiAmIE9QSl9FWFRFTlNJT05fTUNUKSB7CisgICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3BqX3Byb2NlZHVyZSlvcGpfajJrX3dyaXRlX21jdF9kYXRhX2dyb3VwLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICB9CisgICAgfQorICAgIC8qIEVuZCBvZiBEZXZlbG9wZXIgQ29ybmVyICovCiAKLSAgICAgICAgaWYgKHBfajJrLT5tX2NwLmNvbW1lbnQgIT0gMDApICB7Ci0gICAgICAgICAgICAgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9jb20sIHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQorICAgIGlmIChwX2oyay0+Y3N0cl9pbmRleCkgeworICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9wcm9jZWR1cmUpb3BqX2oya19nZXRfZW5kX2hlYWRlciwgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQorICAgIH0KIAotICAgICAgICAvKiBERVZFTE9QRVIgQ09STkVSLCBpbnNlcnQgeW91ciBjdXN0b20gcHJvY2VkdXJlcyAqLwotICAgICAgICBpZiAocF9qMmstPm1fY3AucnNpeiAmIE9QSl9FWFRFTlNJT05fTUNUKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya193cml0ZV9tY3RfZGF0YV9ncm91cCwgcF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyogRW5kIG9mIERldmVsb3BlciBDb3JuZXIgKi8KKyAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3BqX3Byb2NlZHVyZSlvcGpfajJrX2NyZWF0ZV90Y2QsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9wcm9jZWR1cmUpb3BqX2oya191cGRhdGVfcmF0ZXMsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgaWYgKHBfajJrLT5jc3RyX2luZGV4KSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUocF9qMmstPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2oya19nZXRfZW5kX2hlYWRlciwgcF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShwX2oyay0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfajJrX2NyZWF0ZV90Y2QsIHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKHBfajJrLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qMmtfdXBkYXRlX3JhdGVzLCBwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2ZpcnN0X3RpbGVfcGFydCAob3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RvdGFsX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX2ZpcnN0X3RpbGVfcGFydChvcGpfajJrX3QgKnBfajJrLAorICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKKyAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAorICAgICAgICBPUEpfVUlOVDMyIHBfdG90YWxfZGF0YV9zaXplLAorICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyKQogewotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfYnl0ZXNfd3JpdHRlbiA9IDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgIE9QSl9CWVRFICogbF9iZWdpbl9kYXRhID0gMDA7CisgICAgT1BKX1VJTlQzMiBsX25iX2J5dGVzX3dyaXR0ZW4gPSAwOworICAgIE9QSl9VSU5UMzIgbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47CisgICAgT1BKX0JZVEUgKiBsX2JlZ2luX2RhdGEgPSAwMDsKIAotICAgICAgICBvcGpfdGNkX3QgKiBsX3RjZCA9IDAwOwotICAgICAgICBvcGpfY3BfdCAqIGxfY3AgPSAwMDsKKyAgICBvcGpfdGNkX3QgKiBsX3RjZCA9IDAwOworICAgIG9wal9jcF90ICogbF9jcCA9IDAwOwogCi0gICAgICAgIGxfdGNkID0gcF9qMmstPm1fdGNkOwotICAgICAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7CisgICAgbF90Y2QgPSBwX2oyay0+bV90Y2Q7CisgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOwogCi0gICAgICAgIGxfdGNkLT5jdXJfcGlubyA9IDA7CisgICAgbF90Y2QtPmN1cl9waW5vID0gMDsKIAotICAgICAgICAvKkdldCBudW1iZXIgb2YgdGlsZSBwYXJ0cyovCi0gICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2N1cnJlbnRfcG9jX3RpbGVfcGFydF9udW1iZXIgPSAwOworICAgIC8qR2V0IG51bWJlciBvZiB0aWxlIHBhcnRzKi8KKyAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3BvY190aWxlX3BhcnRfbnVtYmVyID0gMDsKIAotICAgICAgICAvKiBJTkRFWCA+PiAqLwotICAgICAgICAvKiA8PCBJTkRFWCAqLworICAgIC8qIElOREVYID4+ICovCisgICAgLyogPDwgSU5ERVggKi8KIAorICAgIGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuID0gMDsKKyAgICBsX2JlZ2luX2RhdGEgPSBwX2RhdGE7CisgICAgaWYgKCEgb3BqX2oya193cml0ZV9zb3QocF9qMmssIHBfZGF0YSwgcF90b3RhbF9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxfY3VycmVudF9uYl9ieXRlc193cml0dGVuLCBwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgbF9uYl9ieXRlc193cml0dGVuICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOworICAgIHBfZGF0YSArPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKKyAgICBwX3RvdGFsX2RhdGFfc2l6ZSAtPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKKworICAgIGlmICghT1BKX0lTX0NJTkVNQShsX2NwLT5yc2l6KSkgeworI2lmIDAKKyAgICAgICAgZm9yIChjb21wbm8gPSAxOyBjb21wbm8gPCBwX2oyay0+bV9wcml2YXRlX2ltYWdlLT5udW1jb21wczsgY29tcG5vKyspIHsKKyAgICAgICAgICAgIGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuID0gMDsKKyAgICAgICAgICAgIG9wal9qMmtfd3JpdGVfY29jX2luX21lbW9yeShwX2oyaywgY29tcG5vLCBwX2RhdGEsICZsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpOworICAgICAgICAgICAgbF9uYl9ieXRlc193cml0dGVuICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOworICAgICAgICAgICAgcF9kYXRhICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOworICAgICAgICAgICAgcF90b3RhbF9kYXRhX3NpemUgLT0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47CisKKyAgICAgICAgICAgIGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuID0gMDsKKyAgICAgICAgICAgIG9wal9qMmtfd3JpdGVfcWNjX2luX21lbW9yeShwX2oyaywgY29tcG5vLCBwX2RhdGEsICZsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpOworICAgICAgICAgICAgbF9uYl9ieXRlc193cml0dGVuICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOworICAgICAgICAgICAgcF9kYXRhICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOworICAgICAgICAgICAgcF90b3RhbF9kYXRhX3NpemUgLT0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAobF9jcC0+dGNwc1twX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyXS5udW1wb2NzKSB7CisgICAgICAgICAgICBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbiA9IDA7CisgICAgICAgICAgICBvcGpfajJrX3dyaXRlX3BvY19pbl9tZW1vcnkocF9qMmssIHBfZGF0YSwgJmxfY3VycmVudF9uYl9ieXRlc193cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWFuYWdlcik7CisgICAgICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4gKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47CisgICAgICAgICAgICBwX2RhdGEgKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47CisgICAgICAgICAgICBwX3RvdGFsX2RhdGFfc2l6ZSAtPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuID0gMDsKKyAgICBpZiAoISBvcGpfajJrX3dyaXRlX3NvZChwX2oyaywgbF90Y2QsIHBfZGF0YSwgJmxfY3VycmVudF9uYl9ieXRlc193cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdG90YWxfZGF0YV9zaXplLCBwX3N0cmVhbSwgcF9tYW5hZ2VyKSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIGxfbmJfYnl0ZXNfd3JpdHRlbiArPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKKyAgICAqIHBfZGF0YV93cml0dGVuID0gbF9uYl9ieXRlc193cml0dGVuOworCisgICAgLyogV3JpdGluZyBQc290IGluIFNPVCBtYXJrZXIgKi8KKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9iZWdpbl9kYXRhICsgNiwgbF9uYl9ieXRlc193cml0dGVuLAorICAgICAgICAgICAgICAgICAgICA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQU09UICovCisKKyAgICBpZiAoT1BKX0lTX0NJTkVNQShsX2NwLT5yc2l6KSkgeworICAgICAgICBvcGpfajJrX3VwZGF0ZV90bG0ocF9qMmssIGxfbmJfYnl0ZXNfd3JpdHRlbik7CisgICAgfQorCisgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9hbGxfdGlsZV9wYXJ0cyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKKyAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAorICAgICAgICBPUEpfVUlOVDMyIHBfdG90YWxfZGF0YV9zaXplLAorICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICBPUEpfVUlOVDMyIHRpbGVwYXJ0bm8gPSAwOworICAgIE9QSl9VSU5UMzIgbF9uYl9ieXRlc193cml0dGVuID0gMDsKKyAgICBPUEpfVUlOVDMyIGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOworICAgIE9QSl9VSU5UMzIgbF9wYXJ0X3RpbGVfc2l6ZTsKKyAgICBPUEpfVUlOVDMyIHRvdF9udW1fdHA7CisgICAgT1BKX1VJTlQzMiBwaW5vOworCisgICAgT1BKX0JZVEUgKiBsX2JlZ2luX2RhdGE7CisgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOworICAgIG9wal90Y2RfdCAqIGxfdGNkID0gMDA7CisgICAgb3BqX2NwX3QgKiBsX2NwID0gMDA7CisKKyAgICBsX3RjZCA9IHBfajJrLT5tX3RjZDsKKyAgICBsX2NwID0gJihwX2oyay0+bV9jcCk7CisgICAgbF90Y3AgPSBsX2NwLT50Y3BzICsgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcjsKKworICAgIC8qR2V0IG51bWJlciBvZiB0aWxlIHBhcnRzKi8KKyAgICB0b3RfbnVtX3RwID0gb3BqX2oya19nZXRfbnVtX3RwKGxfY3AsIDAsIHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIpOworCisgICAgLyogc3RhcnQgd3JpdGluZyByZW1haW5pbmcgdGlsZSBwYXJ0cyAqLworICAgICsrcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fY3VycmVudF90aWxlX3BhcnRfbnVtYmVyOworICAgIGZvciAodGlsZXBhcnRubyA9IDE7IHRpbGVwYXJ0bm8gPCB0b3RfbnVtX3RwIDsgKyt0aWxlcGFydG5vKSB7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2N1cnJlbnRfcG9jX3RpbGVfcGFydF9udW1iZXIgPSB0aWxlcGFydG5vOwogICAgICAgICBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbiA9IDA7CisgICAgICAgIGxfcGFydF90aWxlX3NpemUgPSAwOwogICAgICAgICBsX2JlZ2luX2RhdGEgPSBwX2RhdGE7Ci0gICAgICAgIGlmICghIG9wal9qMmtfd3JpdGVfc290KHBfajJrLHBfZGF0YSwmbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW4scF9zdHJlYW0scF9tYW5hZ2VyKSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisKKyAgICAgICAgaWYgKCEgb3BqX2oya193cml0ZV9zb3QocF9qMmssIHBfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90b3RhbF9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgICAgIH0KIAogICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4gKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47CiAgICAgICAgIHBfZGF0YSArPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKICAgICAgICAgcF90b3RhbF9kYXRhX3NpemUgLT0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0KLSAgICAgICAgaWYgKCFPUEpfSVNfQ0lORU1BKGxfY3AtPnJzaXopKSB7Ci0jaWYgMAotICAgICAgICAgICAgICAgIGZvciAoY29tcG5vID0gMTsgY29tcG5vIDwgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZS0+bnVtY29tcHM7IGNvbXBubysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfajJrX3dyaXRlX2NvY19pbl9tZW1vcnkocF9qMmssY29tcG5vLHBfZGF0YSwmbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW4scF9tYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfbmJfYnl0ZXNfd3JpdHRlbiArPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSArPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfdG90YWxfZGF0YV9zaXplIC09IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfajJrX3dyaXRlX3FjY19pbl9tZW1vcnkocF9qMmssY29tcG5vLHBfZGF0YSwmbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW4scF9tYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfbmJfYnl0ZXNfd3JpdHRlbiArPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSArPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfdG90YWxfZGF0YV9zaXplIC09IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOwotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgICAgICAgICAgaWYgKGxfY3AtPnRjcHNbcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcl0ubnVtcG9jcykgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2oya193cml0ZV9wb2NfaW5fbWVtb3J5KHBfajJrLHBfZGF0YSwmbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW4scF9tYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfbmJfYnl0ZXNfd3JpdHRlbiArPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YSArPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfdG90YWxfZGF0YV9zaXplIC09IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBsX3BhcnRfdGlsZV9zaXplICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOwogCiAgICAgICAgIGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuID0gMDsKLSAgICAgICAgaWYgKCEgb3BqX2oya193cml0ZV9zb2QocF9qMmssbF90Y2QscF9kYXRhLCZsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbixwX3RvdGFsX2RhdGFfc2l6ZSxwX3N0cmVhbSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgaWYgKCEgb3BqX2oya193cml0ZV9zb2QocF9qMmssIGxfdGNkLCBwX2RhdGEsICZsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90b3RhbF9kYXRhX3NpemUsIHBfc3RyZWFtLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICB9CiAKKyAgICAgICAgcF9kYXRhICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOwogICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4gKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgICogcF9kYXRhX3dyaXR0ZW4gPSBsX25iX2J5dGVzX3dyaXR0ZW47CisgICAgICAgIHBfdG90YWxfZGF0YV9zaXplIC09IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOworICAgICAgICBsX3BhcnRfdGlsZV9zaXplICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOwogCiAgICAgICAgIC8qIFdyaXRpbmcgUHNvdCBpbiBTT1QgbWFya2VyICovCi0gICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2JlZ2luX2RhdGEgKyA2LGxfbmJfYnl0ZXNfd3JpdHRlbiw0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQU09UICovCisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2JlZ2luX2RhdGEgKyA2LCBsX3BhcnRfdGlsZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQU09UICovCiAKLSAgICAgICAgaWYgKE9QSl9JU19DSU5FTUEobF9jcC0+cnNpeikpewotICAgICAgICAgICAgICAgIG9wal9qMmtfdXBkYXRlX3RsbShwX2oyayxsX25iX2J5dGVzX3dyaXR0ZW4pOworICAgICAgICBpZiAoT1BKX0lTX0NJTkVNQShsX2NwLT5yc2l6KSkgeworICAgICAgICAgICAgb3BqX2oya191cGRhdGVfdGxtKHBfajJrLCBsX3BhcnRfdGlsZV9zaXplKTsKICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KKyAgICAgICAgKytwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXI7CisgICAgfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV9hbGxfdGlsZV9wYXJ0cyggIG9wal9qMmtfdCAqcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90b3RhbF9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLXsKLSAgICAgICAgT1BKX1VJTlQzMiB0aWxlcGFydG5vPTA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9ieXRlc193cml0dGVuID0gMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3BhcnRfdGlsZV9zaXplOwotICAgICAgICBPUEpfVUlOVDMyIHRvdF9udW1fdHA7Ci0gICAgICAgIE9QSl9VSU5UMzIgcGlubzsKLQotICAgICAgICBPUEpfQllURSAqIGxfYmVnaW5fZGF0YTsKLSAgICAgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOwotICAgICAgICBvcGpfdGNkX3QgKiBsX3RjZCA9IDAwOwotICAgICAgICBvcGpfY3BfdCAqIGxfY3AgPSAwMDsKLQotICAgICAgICBsX3RjZCA9IHBfajJrLT5tX3RjZDsKLSAgICAgICAgbF9jcCA9ICYocF9qMmstPm1fY3ApOwotICAgICAgICBsX3RjcCA9IGxfY3AtPnRjcHMgKyBwX2oyay0+bV9jdXJyZW50X3RpbGVfbnVtYmVyOworICAgIGZvciAocGlubyA9IDE7IHBpbm8gPD0gbF90Y3AtPm51bXBvY3M7ICsrcGlubykgeworICAgICAgICBsX3RjZC0+Y3VyX3Bpbm8gPSBwaW5vOwogCiAgICAgICAgIC8qR2V0IG51bWJlciBvZiB0aWxlIHBhcnRzKi8KLSAgICAgICAgdG90X251bV90cCA9IG9wal9qMmtfZ2V0X251bV90cChsX2NwLDAscF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcik7CisgICAgICAgIHRvdF9udW1fdHAgPSBvcGpfajJrX2dldF9udW1fdHAobF9jcCwgcGlubywgcF9qMmstPm1fY3VycmVudF90aWxlX251bWJlcik7CisgICAgICAgIGZvciAodGlsZXBhcnRubyA9IDA7IHRpbGVwYXJ0bm8gPCB0b3RfbnVtX3RwIDsgKyt0aWxlcGFydG5vKSB7CisgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3BvY190aWxlX3BhcnRfbnVtYmVyID0gdGlsZXBhcnRubzsKKyAgICAgICAgICAgIGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuID0gMDsKKyAgICAgICAgICAgIGxfcGFydF90aWxlX3NpemUgPSAwOworICAgICAgICAgICAgbF9iZWdpbl9kYXRhID0gcF9kYXRhOwogCi0gICAgICAgIC8qIHN0YXJ0IHdyaXRpbmcgcmVtYWluaW5nIHRpbGUgcGFydHMgKi8KLSAgICAgICAgKytwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXI7Ci0gICAgICAgIGZvciAodGlsZXBhcnRubyA9IDE7IHRpbGVwYXJ0bm8gPCB0b3RfbnVtX3RwIDsgKyt0aWxlcGFydG5vKSB7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fY3VycmVudF9wb2NfdGlsZV9wYXJ0X251bWJlciA9IHRpbGVwYXJ0bm87Ci0gICAgICAgICAgICAgICAgbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW4gPSAwOwotICAgICAgICAgICAgICAgIGxfcGFydF90aWxlX3NpemUgPSAwOwotICAgICAgICAgICAgICAgIGxfYmVnaW5fZGF0YSA9IHBfZGF0YTsKKyAgICAgICAgICAgIGlmICghIG9wal9qMmtfd3JpdGVfc290KHBfajJrLCBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RvdGFsX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbiwgcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfd3JpdGVfc290KHBfajJrLHBfZGF0YSwmbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW4scF9zdHJlYW0scF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4gKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47CisgICAgICAgICAgICBwX2RhdGEgKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47CisgICAgICAgICAgICBwX3RvdGFsX2RhdGFfc2l6ZSAtPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKKyAgICAgICAgICAgIGxfcGFydF90aWxlX3NpemUgKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47CiAKLSAgICAgICAgICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4gKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgcF9kYXRhICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOwotICAgICAgICAgICAgICAgIHBfdG90YWxfZGF0YV9zaXplIC09IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOwotICAgICAgICAgICAgICAgIGxfcGFydF90aWxlX3NpemUgKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47CisgICAgICAgICAgICBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbiA9IDA7CiAKLSAgICAgICAgICAgICAgICBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbiA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKCEgb3BqX2oya193cml0ZV9zb2QocF9qMmssbF90Y2QscF9kYXRhLCZsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbixwX3RvdGFsX2RhdGFfc2l6ZSxwX3N0cmVhbSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghIG9wal9qMmtfd3JpdGVfc29kKHBfajJrLCBsX3RjZCwgcF9kYXRhLCAmbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RvdGFsX2RhdGFfc2l6ZSwgcF9zdHJlYW0sIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgcF9kYXRhICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOwotICAgICAgICAgICAgICAgIGxfbmJfYnl0ZXNfd3JpdHRlbiArPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKLSAgICAgICAgICAgICAgICBwX3RvdGFsX2RhdGFfc2l6ZSAtPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKLSAgICAgICAgICAgICAgICBsX3BhcnRfdGlsZV9zaXplICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOworICAgICAgICAgICAgbF9uYl9ieXRlc193cml0dGVuICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOworICAgICAgICAgICAgcF9kYXRhICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOworICAgICAgICAgICAgcF90b3RhbF9kYXRhX3NpemUgLT0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47CisgICAgICAgICAgICBsX3BhcnRfdGlsZV9zaXplICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOwogCi0gICAgICAgICAgICAgICAgLyogV3JpdGluZyBQc290IGluIFNPVCBtYXJrZXIgKi8KLSAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9iZWdpbl9kYXRhICsgNixsX3BhcnRfdGlsZV9zaXplLDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUFNPVCAqLworICAgICAgICAgICAgLyogV3JpdGluZyBQc290IGluIFNPVCBtYXJrZXIgKi8KKyAgICAgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2JlZ2luX2RhdGEgKyA2LCBsX3BhcnRfdGlsZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUFNPVCAqLwogCi0gICAgICAgICAgICAgICAgaWYgKE9QSl9JU19DSU5FTUEobF9jcC0+cnNpeikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9qMmtfdXBkYXRlX3RsbShwX2oyayxsX3BhcnRfdGlsZV9zaXplKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoT1BKX0lTX0NJTkVNQShsX2NwLT5yc2l6KSkgeworICAgICAgICAgICAgICAgIG9wal9qMmtfdXBkYXRlX3RsbShwX2oyaywgbF9wYXJ0X3RpbGVfc2l6ZSk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICArK3BfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2N1cnJlbnRfdGlsZV9wYXJ0X251bWJlcjsKKyAgICAgICAgICAgICsrcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fY3VycmVudF90aWxlX3BhcnRfbnVtYmVyOwogICAgICAgICB9CisgICAgfQogCi0gICAgICAgIGZvciAocGlubyA9IDE7IHBpbm8gPD0gbF90Y3AtPm51bXBvY3M7ICsrcGlubykgewotICAgICAgICAgICAgICAgIGxfdGNkLT5jdXJfcGlubyA9IHBpbm87CisgICAgKnBfZGF0YV93cml0dGVuID0gbF9uYl9ieXRlc193cml0dGVuOwogCi0gICAgICAgICAgICAgICAgLypHZXQgbnVtYmVyIG9mIHRpbGUgcGFydHMqLwotICAgICAgICAgICAgICAgIHRvdF9udW1fdHAgPSBvcGpfajJrX2dldF9udW1fdHAobF9jcCxwaW5vLHBfajJrLT5tX2N1cnJlbnRfdGlsZV9udW1iZXIpOwotICAgICAgICAgICAgICAgIGZvciAodGlsZXBhcnRubyA9IDA7IHRpbGVwYXJ0bm8gPCB0b3RfbnVtX3RwIDsgKyt0aWxlcGFydG5vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9jdXJyZW50X3BvY190aWxlX3BhcnRfbnVtYmVyID0gdGlsZXBhcnRubzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFydF90aWxlX3NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgbF9iZWdpbl9kYXRhID0gcF9kYXRhOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX3dyaXRlX3NvdChwX2oyayxwX2RhdGEsJmxfY3VycmVudF9uYl9ieXRlc193cml0dGVuLHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgbF9uYl9ieXRlc193cml0dGVuICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOwotICAgICAgICAgICAgICAgICAgICAgICAgcF90b3RhbF9kYXRhX3NpemUgLT0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3BhcnRfdGlsZV9zaXplICs9IGxfY3VycmVudF9uYl9ieXRlc193cml0dGVuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbiA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal9qMmtfd3JpdGVfc29kKHBfajJrLGxfdGNkLHBfZGF0YSwmbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW4scF90b3RhbF9kYXRhX3NpemUscF9zdHJlYW0scF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBsX25iX2J5dGVzX3dyaXR0ZW4gKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2RhdGEgKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX3RvdGFsX2RhdGFfc2l6ZSAtPSBsX2N1cnJlbnRfbmJfYnl0ZXNfd3JpdHRlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFydF90aWxlX3NpemUgKz0gbF9jdXJyZW50X25iX2J5dGVzX3dyaXR0ZW47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdyaXRpbmcgUHNvdCBpbiBTT1QgbWFya2VyICovCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9iZWdpbl9kYXRhICsgNixsX3BhcnRfdGlsZV9zaXplLDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUFNPVCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoT1BKX0lTX0NJTkVNQShsX2NwLT5yc2l6KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfajJrX3VwZGF0ZV90bG0ocF9qMmssbF9wYXJ0X3RpbGVfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICsrcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fY3VycmVudF90aWxlX3BhcnRfbnVtYmVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgICpwX2RhdGFfd3JpdHRlbiA9IGxfbmJfYnl0ZXNfd3JpdHRlbjsKLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya193cml0ZV91cGRhdGVkX3RsbSggb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3VwZGF0ZWRfdGxtKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKnBfc3RyZWFtLAorICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlcikKIHsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3RsbV9zaXplOwotICAgICAgICBPUEpfT0ZGX1QgbF90bG1fcG9zaXRpb24sIGxfY3VycmVudF9wb3NpdGlvbjsKKyAgICBPUEpfVUlOVDMyIGxfdGxtX3NpemU7CisgICAgT1BKX09GRl9UIGxfdGxtX3Bvc2l0aW9uLCBsX2N1cnJlbnRfcG9zaXRpb247CiAKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwogCi0gICAgICAgIGxfdGxtX3NpemUgPSA1ICogcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdG90YWxfdGlsZV9wYXJ0czsKLSAgICAgICAgbF90bG1fcG9zaXRpb24gPSA2ICsgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3N0YXJ0OwotICAgICAgICBsX2N1cnJlbnRfcG9zaXRpb24gPSBvcGpfc3RyZWFtX3RlbGwocF9zdHJlYW0pOworICAgIGxfdGxtX3NpemUgPSA1ICogcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdG90YWxfdGlsZV9wYXJ0czsKKyAgICBsX3RsbV9wb3NpdGlvbiA9IDYgKyBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc3RhcnQ7CisgICAgbF9jdXJyZW50X3Bvc2l0aW9uID0gb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKTsKIAotICAgICAgICBpZiAoISBvcGpfc3RyZWFtX3NlZWsocF9zdHJlYW0sbF90bG1fcG9zaXRpb24scF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICBpZiAoISBvcGpfc3RyZWFtX3NlZWsocF9zdHJlYW0sIGxfdGxtX3Bvc2l0aW9uLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEocF9zdHJlYW0scF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2J1ZmZlcixsX3RsbV9zaXplLHBfbWFuYWdlcikgIT0gbF90bG1fc2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2J1ZmZlciwgbF90bG1fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWFuYWdlcikgIT0gbF90bG1fc2l6ZSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICBpZiAoISBvcGpfc3RyZWFtX3NlZWsocF9zdHJlYW0sbF9jdXJyZW50X3Bvc2l0aW9uLHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgaWYgKCEgb3BqX3N0cmVhbV9zZWVrKHBfc3RyZWFtLCBsX2N1cnJlbnRfcG9zaXRpb24sIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZW5kX2VuY29kaW5nKCAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2VuZF9lbmNvZGluZyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyKQogewotICAgICAgICAvKiBwcmVjb25kaXRpb25zICovCi0gICAgICAgIGFzc2VydChwX2oyayAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CiAKLSAgICAgICAgb3BqX3RjZF9kZXN0cm95KHBfajJrLT5tX3RjZCk7Ci0gICAgICAgIHBfajJrLT5tX3RjZCA9IDAwOworICAgIE9QSl9VTlVTRUQocF9zdHJlYW0pOworICAgIE9QSl9VTlVTRUQocF9tYW5hZ2VyKTsKIAotICAgICAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2J1ZmZlcikgewotICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19idWZmZXIpOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19idWZmZXIgPSAwOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19jdXJyZW50ID0gMDsKLSAgICAgICAgfQorICAgIG9wal90Y2RfZGVzdHJveShwX2oyay0+bV90Y2QpOworICAgIHBfajJrLT5tX3RjZCA9IDAwOwogCi0gICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YSkgewotICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2VuY29kZWRfdGlsZV9kYXRhKTsKLSAgICAgICAgICAgICAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YSA9IDA7Ci0gICAgICAgIH0KKyAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2J1ZmZlcikgeworICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV90bG1fc290X29mZnNldHNfYnVmZmVyKTsKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fdGxtX3NvdF9vZmZzZXRzX2J1ZmZlciA9IDA7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RsbV9zb3Rfb2Zmc2V0c19jdXJyZW50ID0gMDsKKyAgICB9CiAKLSAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1fZW5jb2RlZF90aWxlX3NpemUgPSAwOworICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YSkgeworICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9lbmNvZGVkX3RpbGVfZGF0YSk7CisgICAgICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2VuY29kZWRfdGlsZV9kYXRhID0gMDsKKyAgICB9CiAKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIHBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX2VuY29kZWRfdGlsZV9zaXplID0gMDsKKworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAogLyoqCiAgKiBEZXN0cm95cyB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVjb2Rpbmcgb2YgaGVhZGVycy4KICAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qMmtfZGVzdHJveV9oZWFkZXJfbWVtb3J5ICggb3BqX2oya190ICogcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2Rlc3Ryb3lfaGVhZGVyX21lbW9yeShvcGpfajJrX3QgKiBwX2oyaywKKyAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLSAgICAgICAgLyogcHJlY29uZGl0aW9ucyAqLwotICAgICAgICBhc3NlcnQocF9qMmsgIT0gMDApOwotICAgICAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotICAgICAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKKyAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0gICAgICAgIGlmIChwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2ZyZWUocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSk7Ci0gICAgICAgICAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IDA7Ci0gICAgICAgIH0KKyAgICBPUEpfVU5VU0VEKHBfc3RyZWFtKTsKKyAgICBPUEpfVU5VU0VEKHBfbWFuYWdlcik7CiAKLSAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YV9zaXplID0gMDsKKyAgICBpZiAocF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSkgeworICAgICAgICBvcGpfZnJlZShwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhKTsKKyAgICAgICAgcF9qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmNvZGVyLm1faGVhZGVyX3RpbGVfZGF0YSA9IDA7CisgICAgfQogCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICBwX2oyay0+bV9zcGVjaWZpY19wYXJhbS5tX2VuY29kZXIubV9oZWFkZXJfdGlsZV9kYXRhX3NpemUgPSAwOworCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19pbml0X2luZm8oICAgICBvcGpfajJrX3QgKnBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlciApCitzdGF0aWMgT1BKX0JPT0wgb3BqX2oya19pbml0X2luZm8ob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlcikKIHsKLSAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5mb190ICogbF9jc3RyX2luZm8gPSAwMDsKKyAgICBvcGpfY29kZXN0cmVhbV9pbmZvX3QgKiBsX2NzdHJfaW5mbyA9IDAwOwogCi0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7Ci0gICh2b2lkKWxfY3N0cl9pbmZvOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9qMmsgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisgICAgKHZvaWQpbF9jc3RyX2luZm87CiAKLSAgICAgICAgLyogVE9ETyBtZXJnZVYyOiBjaGVjayB0aGlzIHBhcnQgd2hpY2ggdXNlIGNzdHJfaW5mbyAqLwotICAgICAgICAvKmxfY3N0cl9pbmZvID0gcF9qMmstPmNzdHJfaW5mbzsKKyAgICBPUEpfVU5VU0VEKHBfc3RyZWFtKTsKIAotICAgICAgICBpZiAobF9jc3RyX2luZm8pICB7Ci0gICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjb21wbm87Ci0gICAgICAgICAgICAgICAgbF9jc3RyX2luZm8tPnRpbGUgPSAob3BqX3RpbGVfaW5mb190ICopIG9wal9tYWxsb2MocF9qMmstPm1fY3AudHcgKiBwX2oyay0+bV9jcC50aCAqIHNpemVvZihvcGpfdGlsZV9pbmZvX3QpKTsKKyAgICAvKiBUT0RPIG1lcmdlVjI6IGNoZWNrIHRoaXMgcGFydCB3aGljaCB1c2UgY3N0cl9pbmZvICovCisgICAgLypsX2NzdHJfaW5mbyA9IHBfajJrLT5jc3RyX2luZm87CiAKLSAgICAgICAgICAgICAgICBsX2NzdHJfaW5mby0+aW1hZ2VfdyA9IHBfajJrLT5tX2ltYWdlLT54MSAtIHBfajJrLT5tX2ltYWdlLT54MDsKLSAgICAgICAgICAgICAgICBsX2NzdHJfaW5mby0+aW1hZ2VfaCA9IHBfajJrLT5tX2ltYWdlLT55MSAtIHBfajJrLT5tX2ltYWdlLT55MDsKKyAgICBpZiAobF9jc3RyX2luZm8pICB7CisgICAgICAgICAgICBPUEpfVUlOVDMyIGNvbXBubzsKKyAgICAgICAgICAgIGxfY3N0cl9pbmZvLT50aWxlID0gKG9wal90aWxlX2luZm9fdCAqKSBvcGpfbWFsbG9jKHBfajJrLT5tX2NwLnR3ICogcF9qMmstPm1fY3AudGggKiBzaXplb2Yob3BqX3RpbGVfaW5mb190KSk7CiAKLSAgICAgICAgICAgICAgICBsX2NzdHJfaW5mby0+cHJvZyA9ICgmcF9qMmstPm1fY3AudGNwc1swXSktPnByZzsKKyAgICAgICAgICAgIGxfY3N0cl9pbmZvLT5pbWFnZV93ID0gcF9qMmstPm1faW1hZ2UtPngxIC0gcF9qMmstPm1faW1hZ2UtPngwOworICAgICAgICAgICAgbF9jc3RyX2luZm8tPmltYWdlX2ggPSBwX2oyay0+bV9pbWFnZS0+eTEgLSBwX2oyay0+bV9pbWFnZS0+eTA7CiAKLSAgICAgICAgICAgICAgICBsX2NzdHJfaW5mby0+dHcgPSBwX2oyay0+bV9jcC50dzsKLSAgICAgICAgICAgICAgICBsX2NzdHJfaW5mby0+dGggPSBwX2oyay0+bV9jcC50aDsKKyAgICAgICAgICAgIGxfY3N0cl9pbmZvLT5wcm9nID0gKCZwX2oyay0+bV9jcC50Y3BzWzBdKS0+cHJnOwogCi0gICAgICAgICAgICAgICAgbF9jc3RyX2luZm8tPnRpbGVfeCA9IHBfajJrLT5tX2NwLnRkeDsqLyAgICAgICAgLyogbmV3IHZlcnNpb24gcGFyc2VyICovCi0gICAgICAgICAgICAgICAgLypsX2NzdHJfaW5mby0+dGlsZV95ID0gcF9qMmstPm1fY3AudGR5OyovICAgICAgLyogbmV3IHZlcnNpb24gcGFyc2VyICovCi0gICAgICAgICAgICAgICAgLypsX2NzdHJfaW5mby0+dGlsZV9PeCA9IHBfajJrLT5tX2NwLnR4MDsqLyAgICAgLyogbmV3IHZlcnNpb24gcGFyc2VyICovCi0gICAgICAgICAgICAgICAgLypsX2NzdHJfaW5mby0+dGlsZV9PeSA9IHBfajJrLT5tX2NwLnR5MDsqLyAgICAgLyogbmV3IHZlcnNpb24gcGFyc2VyICovCisgICAgICAgICAgICBsX2NzdHJfaW5mby0+dHcgPSBwX2oyay0+bV9jcC50dzsKKyAgICAgICAgICAgIGxfY3N0cl9pbmZvLT50aCA9IHBfajJrLT5tX2NwLnRoOwogCi0gICAgICAgICAgICAgICAgLypsX2NzdHJfaW5mby0+bnVtY29tcHMgPSBwX2oyay0+bV9pbWFnZS0+bnVtY29tcHM7CisgICAgICAgICAgICBsX2NzdHJfaW5mby0+dGlsZV94ID0gcF9qMmstPm1fY3AudGR4OyovICAgICAgICAvKiBuZXcgdmVyc2lvbiBwYXJzZXIgKi8KKyAgICAvKmxfY3N0cl9pbmZvLT50aWxlX3kgPSBwX2oyay0+bV9jcC50ZHk7Ki8gICAgICAvKiBuZXcgdmVyc2lvbiBwYXJzZXIgKi8KKyAgICAvKmxfY3N0cl9pbmZvLT50aWxlX094ID0gcF9qMmstPm1fY3AudHgwOyovICAgICAvKiBuZXcgdmVyc2lvbiBwYXJzZXIgKi8KKyAgICAvKmxfY3N0cl9pbmZvLT50aWxlX095ID0gcF9qMmstPm1fY3AudHkwOyovICAgICAvKiBuZXcgdmVyc2lvbiBwYXJzZXIgKi8KIAotICAgICAgICAgICAgICAgIGxfY3N0cl9pbmZvLT5udW1sYXllcnMgPSAoJnBfajJrLT5tX2NwLnRjcHNbMF0pLT5udW1sYXllcnM7CisgICAgLypsX2NzdHJfaW5mby0+bnVtY29tcHMgPSBwX2oyay0+bV9pbWFnZS0+bnVtY29tcHM7CiAKLSAgICAgICAgICAgICAgICBsX2NzdHJfaW5mby0+bnVtZGVjb21wb3MgPSAoT1BKX0lOVDMyKikgb3BqX21hbGxvYyhwX2oyay0+bV9pbWFnZS0+bnVtY29tcHMgKiBzaXplb2YoT1BKX0lOVDMyKSk7CisgICAgbF9jc3RyX2luZm8tPm51bWxheWVycyA9ICgmcF9qMmstPm1fY3AudGNwc1swXSktPm51bWxheWVyczsKIAotICAgICAgICAgICAgICAgIGZvciAoY29tcG5vPTA7IGNvbXBubyA8IHBfajJrLT5tX2ltYWdlLT5udW1jb21wczsgY29tcG5vKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3N0cl9pbmZvLT5udW1kZWNvbXBvc1tjb21wbm9dID0gKCZwX2oyay0+bV9jcC50Y3BzWzBdKS0+dGNjcHMtPm51bXJlc29sdXRpb25zIC0gMTsKLSAgICAgICAgICAgICAgICB9CisgICAgbF9jc3RyX2luZm8tPm51bWRlY29tcG9zID0gKE9QSl9JTlQzMiopIG9wal9tYWxsb2MocF9qMmstPm1faW1hZ2UtPm51bWNvbXBzICogc2l6ZW9mKE9QSl9JTlQzMikpOwogCi0gICAgICAgICAgICAgICAgbF9jc3RyX2luZm8tPkRfbWF4ID0gMC4wOyAgICAgICAqLyAgICAgIC8qIEFERCBNYXJjZWxhICovCisgICAgZm9yIChjb21wbm89MDsgY29tcG5vIDwgcF9qMmstPm1faW1hZ2UtPm51bWNvbXBzOyBjb21wbm8rKykgeworICAgICAgICAgICAgbF9jc3RyX2luZm8tPm51bWRlY29tcG9zW2NvbXBub10gPSAoJnBfajJrLT5tX2NwLnRjcHNbMF0pLT50Y2Nwcy0+bnVtcmVzb2x1dGlvbnMgLSAxOworICAgIH0KIAotICAgICAgICAgICAgICAgIC8qbF9jc3RyX2luZm8tPm1haW5faGVhZF9zdGFydCA9IG9wal9zdHJlYW1fdGVsbChwX3N0cmVhbSk7Ki8gLyogcG9zaXRpb24gb2YgU09DICovCisgICAgbF9jc3RyX2luZm8tPkRfbWF4ID0gMC4wOyAgICAgICAqLyAgICAgIC8qIEFERCBNYXJjZWxhICovCiAKLSAgICAgICAgICAgICAgICAvKmxfY3N0cl9pbmZvLT5tYXhtYXJrbnVtID0gMTAwOwotICAgICAgICAgICAgICAgIGxfY3N0cl9pbmZvLT5tYXJrZXIgPSAob3BqX21hcmtlcl9pbmZvX3QgKikgb3BqX21hbGxvYyhsX2NzdHJfaW5mby0+bWF4bWFya251bSAqIHNpemVvZihvcGpfbWFya2VyX2luZm9fdCkpOwotICAgICAgICAgICAgICAgIGxfY3N0cl9pbmZvLT5tYXJrbnVtID0gMDsKLSAgICAgICAgfSovCisgICAgLypsX2NzdHJfaW5mby0+bWFpbl9oZWFkX3N0YXJ0ID0gb3BqX3N0cmVhbV90ZWxsKHBfc3RyZWFtKTsqLyAvKiBwb3NpdGlvbiBvZiBTT0MgKi8KIAotICAgICAgICByZXR1cm4gb3BqX2oya19jYWxjdWxhdGVfdHAocF9qMmssJihwX2oyay0+bV9jcCksJnBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RvdGFsX3RpbGVfcGFydHMscF9qMmstPm1fcHJpdmF0ZV9pbWFnZSxwX21hbmFnZXIpOworICAgIC8qbF9jc3RyX2luZm8tPm1heG1hcmtudW0gPSAxMDA7CisgICAgbF9jc3RyX2luZm8tPm1hcmtlciA9IChvcGpfbWFya2VyX2luZm9fdCAqKSBvcGpfbWFsbG9jKGxfY3N0cl9pbmZvLT5tYXhtYXJrbnVtICogc2l6ZW9mKG9wal9tYXJrZXJfaW5mb190KSk7CisgICAgbF9jc3RyX2luZm8tPm1hcmtudW0gPSAwOworICAgIH0qLworCisgICAgcmV0dXJuIG9wal9qMmtfY2FsY3VsYXRlX3RwKHBfajJrLCAmKHBfajJrLT5tX2NwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBfajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jb2Rlci5tX3RvdGFsX3RpbGVfcGFydHMsIHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWFuYWdlcik7CiB9CiAKIC8qKgotICogQ3JlYXRlcyBhIHRpbGUtY29kZXIgZGVjb2Rlci4KKyAqIENyZWF0ZXMgYSB0aWxlLWNvZGVyIGVuY29kZXIuCiAgKgogICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KICAqIEBwYXJhbSAgICAgICBwX2oyayAgICAgICAgICAgICAgICAgICBKMksgY29kZWMuCiAgKiBAcGFyYW0gICAgICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2oya19jcmVhdGVfdGNkKCAgICAgb3BqX2oya190ICpwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfajJrX2NyZWF0ZV90Y2Qob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0gICAgICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgICAgICAgYXNzZXJ0KHBfajJrICE9IDAwKTsKLSAgICAgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0gICAgICAgIGFzc2VydChwX3N0cmVhbSAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2oyayAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgYXNzZXJ0KHBfc3RyZWFtICE9IDAwKTsKIAotICAgICAgICBwX2oyay0+bV90Y2QgPSBvcGpfdGNkX2NyZWF0ZShPUEpfRkFMU0UpOworICAgIE9QSl9VTlVTRUQocF9zdHJlYW0pOwogCi0gICAgICAgIGlmICghIHBfajJrLT5tX3RjZCkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgVGlsZSBDb2RlclxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIHBfajJrLT5tX3RjZCA9IG9wal90Y2RfY3JlYXRlKE9QSl9GQUxTRSk7CiAKLSAgICAgICAgaWYgKCFvcGpfdGNkX2luaXQocF9qMmstPm1fdGNkLHBfajJrLT5tX3ByaXZhdGVfaW1hZ2UsJnBfajJrLT5tX2NwKSkgewotICAgICAgICAgICAgICAgIG9wal90Y2RfZGVzdHJveShwX2oyay0+bV90Y2QpOwotICAgICAgICAgICAgICAgIHBfajJrLT5tX3RjZCA9IDAwOwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICBpZiAoISBwX2oyay0+bV90Y2QpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSBUaWxlIENvZGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIGlmICghb3BqX3RjZF9pbml0KHBfajJrLT5tX3RjZCwgcF9qMmstPm1fcHJpdmF0ZV9pbWFnZSwgJnBfajJrLT5tX2NwLAorICAgICAgICAgICAgICAgICAgICAgIHBfajJrLT5tX3RwKSkgeworICAgICAgICBvcGpfdGNkX2Rlc3Ryb3kocF9qMmstPm1fdGNkKTsKKyAgICAgICAgcF9qMmstPm1fdGNkID0gMDA7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1PUEpfQk9PTCBvcGpfajJrX3dyaXRlX3RpbGUgKG9wal9qMmtfdCAqIHBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCitPUEpfQk9PTCBvcGpfajJrX3dyaXRlX3RpbGUob3BqX2oya190ICogcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQogewotICAgICAgICBpZiAoISBvcGpfajJrX3ByZV93cml0ZV90aWxlKHBfajJrLHBfdGlsZV9pbmRleCxwX3N0cmVhbSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdoaWxlIG9wal9qMmtfcHJlX3dyaXRlX3RpbGUgd2l0aCB0aWxlIGluZGV4ID0gJWRcbiIsIHBfdGlsZV9pbmRleCk7CisgICAgaWYgKCEgb3BqX2oya19wcmVfd3JpdGVfdGlsZShwX2oyaywgcF90aWxlX2luZGV4LCBwX3N0cmVhbSwgcF9tYW5hZ2VyKSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSBvcGpfajJrX3ByZV93cml0ZV90aWxlIHdpdGggdGlsZSBpbmRleCA9ICVkXG4iLCBwX3RpbGVfaW5kZXgpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0gZWxzZSB7CisgICAgICAgIE9QSl9VSU5UMzIgajsKKyAgICAgICAgLyogQWxsb2NhdGUgZGF0YSAqLworICAgICAgICBmb3IgKGogPSAwOyBqIDwgcF9qMmstPm1fdGNkLT5pbWFnZS0+bnVtY29tcHM7ICsraikgeworICAgICAgICAgICAgb3BqX3RjZF90aWxlY29tcF90KiBsX3RpbGVjID0gcF9qMmstPm1fdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5jb21wcyArIGo7CisKKyAgICAgICAgICAgIGlmICghIG9wal9hbGxvY190aWxlX2NvbXBvbmVudF9kYXRhKGxfdGlsZWMpKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIGFsbG9jYXRpbmcgdGlsZSBjb21wb25lbnQgZGF0YS4iKTsKICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgajsKLSAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBkYXRhICovCi0gICAgICAgICAgICAgICAgZm9yIChqPTA7ajxwX2oyay0+bV90Y2QtPmltYWdlLT5udW1jb21wczsrK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCogbF90aWxlYyA9IHBfajJrLT5tX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+Y29tcHMgKyBqOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZighIG9wal9hbGxvY190aWxlX2NvbXBvbmVudF9kYXRhKGxfdGlsZWMpKSB7Ci0JCQkJCQkJCQkJCQkgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciBhbGxvY2F0aW5nIHRpbGUgY29tcG9uZW50IGRhdGEuIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8qIG5vdyBjb3B5IGRhdGEgaW50byB0aGUgdGhlIHRpbGUgY29tcG9uZW50ICovCi0gICAgICAgICAgICAgICAgaWYgKCEgb3BqX3RjZF9jb3B5X3RpbGVfZGF0YShwX2oyay0+bV90Y2QscF9kYXRhLHBfZGF0YV9zaXplKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlNpemUgbWlzbWF0Y2ggYmV0d2VlbiB0aWxlIGRhdGEgYW5kIHNlbnQgZGF0YS4iICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoISBvcGpfajJrX3Bvc3Rfd3JpdGVfdGlsZShwX2oyayxwX3N0cmVhbSxwX21hbmFnZXIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd2hpbGUgb3BqX2oya19wb3N0X3dyaXRlX3RpbGUgd2l0aCB0aWxlIGluZGV4ID0gJWRcbiIsIHBfdGlsZV9pbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgLyogbm93IGNvcHkgZGF0YSBpbnRvIHRoZSB0aWxlIGNvbXBvbmVudCAqLworICAgICAgICBpZiAoISBvcGpfdGNkX2NvcHlfdGlsZV9kYXRhKHBfajJrLT5tX3RjZCwgcF9kYXRhLCBwX2RhdGFfc2l6ZSkpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJTaXplIG1pc21hdGNoIGJldHdlZW4gdGlsZSBkYXRhIGFuZCBzZW50IGRhdGEuIik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmICghIG9wal9qMmtfcG9zdF93cml0ZV90aWxlKHBfajJrLCBwX3N0cmVhbSwgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoaWxlIG9wal9qMmtfcG9zdF93cml0ZV90aWxlIHdpdGggdGlsZSBpbmRleCA9ICVkXG4iLCBwX3RpbGVfaW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2oyay5oCmluZGV4IDM1OGUwNzMuLjVkMzkzYzkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvajJrLmgKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qMmsuaApAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKLSAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQKICAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKICAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KICAqCkBAIC04LDEyICs4LDEyIEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXgKICAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0LCBBbnRvbmluIERlc2NhbXBlCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KICAqIENvcHlyaWdodCAoYykgMjAwNi0yMDA3LCBQYXJ2YXRoYSBFbGFuZ292YW4KICAqIENvcHlyaWdodCAoYykgMjAwOCwgSmVyb21lIEZpbWVzLCBDb21tdW5pY2F0aW9ucyAmIFN5c3RlbWVzIDxqZXJvbWUuZmltZXNAYy1zLmZyPgotICogQ29weXJpZ2h0IChjKSAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGcmFuY2UgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZyYW5jZQogICogQ29weXJpZ2h0IChjKSAyMDEyLCBDUyBTeXN0ZW1lcyBkJ0luZm9ybWF0aW9uLCBGcmFuY2UKICAqCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgpAQCAtMzksOCArMzksOCBAQAogICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCi0jaWZuZGVmIF9fSjJLX0gKLSNkZWZpbmUgX19KMktfSAorI2lmbmRlZiBPUEpfSjJLX0gKKyNkZWZpbmUgT1BKX0oyS19ICiAvKioKIEBmaWxlIGoyay5oCiBAYnJpZWYgVGhlIEpQRUctMjAwMCBDb2Rlc3RyZWFtIFJlYWRlci9Xcml0ZXIgKEoySykKQEAgLTY1LDQzICs2NSw0MSBAQAogI2RlZmluZSBKMktfQ0NQX1FOVFNUWV9TSVFOVCAxCiAjZGVmaW5lIEoyS19DQ1BfUU5UU1RZX1NFUU5UIDIKIAotI2RlZmluZSBPUEpfSjJLX0RFRkFVTFRfQ0JMS19EQVRBX1NJWkUgODE5MgotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jZGVmaW5lIEoyS19NU19TT0MgMHhmZjRmCS8qKjwgU09DIG1hcmtlciB2YWx1ZSAqLwotI2RlZmluZSBKMktfTVNfU09UIDB4ZmY5MAkvKio8IFNPVCBtYXJrZXIgdmFsdWUgKi8KLSNkZWZpbmUgSjJLX01TX1NPRCAweGZmOTMJLyoqPCBTT0QgbWFya2VyIHZhbHVlICovCi0jZGVmaW5lIEoyS19NU19FT0MgMHhmZmQ5CS8qKjwgRU9DIG1hcmtlciB2YWx1ZSAqLwotI2RlZmluZSBKMktfTVNfU0laIDB4ZmY1MQkvKio8IFNJWiBtYXJrZXIgdmFsdWUgKi8KLSNkZWZpbmUgSjJLX01TX0NPRCAweGZmNTIJLyoqPCBDT0QgbWFya2VyIHZhbHVlICovCi0jZGVmaW5lIEoyS19NU19DT0MgMHhmZjUzCS8qKjwgQ09DIG1hcmtlciB2YWx1ZSAqLwotI2RlZmluZSBKMktfTVNfUkdOIDB4ZmY1ZQkvKio8IFJHTiBtYXJrZXIgdmFsdWUgKi8KLSNkZWZpbmUgSjJLX01TX1FDRCAweGZmNWMJLyoqPCBRQ0QgbWFya2VyIHZhbHVlICovCi0jZGVmaW5lIEoyS19NU19RQ0MgMHhmZjVkCS8qKjwgUUNDIG1hcmtlciB2YWx1ZSAqLwotI2RlZmluZSBKMktfTVNfUE9DIDB4ZmY1ZgkvKio8IFBPQyBtYXJrZXIgdmFsdWUgKi8KLSNkZWZpbmUgSjJLX01TX1RMTSAweGZmNTUJLyoqPCBUTE0gbWFya2VyIHZhbHVlICovCi0jZGVmaW5lIEoyS19NU19QTE0gMHhmZjU3CS8qKjwgUExNIG1hcmtlciB2YWx1ZSAqLwotI2RlZmluZSBKMktfTVNfUExUIDB4ZmY1OAkvKio8IFBMVCBtYXJrZXIgdmFsdWUgKi8KLSNkZWZpbmUgSjJLX01TX1BQTSAweGZmNjAJLyoqPCBQUE0gbWFya2VyIHZhbHVlICovCi0jZGVmaW5lIEoyS19NU19QUFQgMHhmZjYxCS8qKjwgUFBUIG1hcmtlciB2YWx1ZSAqLwotI2RlZmluZSBKMktfTVNfU09QIDB4ZmY5MQkvKio8IFNPUCBtYXJrZXIgdmFsdWUgKi8KLSNkZWZpbmUgSjJLX01TX0VQSCAweGZmOTIJLyoqPCBFUEggbWFya2VyIHZhbHVlICovCi0jZGVmaW5lIEoyS19NU19DUkcgMHhmZjYzCS8qKjwgQ1JHIG1hcmtlciB2YWx1ZSAqLwotI2RlZmluZSBKMktfTVNfQ09NIDB4ZmY2NAkvKio8IENPTSBtYXJrZXIgdmFsdWUgKi8KLSNkZWZpbmUgSjJLX01TX0NCRCAweGZmNzgJLyoqPCBDQkQgbWFya2VyIHZhbHVlICovCi0jZGVmaW5lIEoyS19NU19NQ0MgMHhmZjc1CS8qKjwgTUNDIG1hcmtlciB2YWx1ZSAqLwotI2RlZmluZSBKMktfTVNfTUNUIDB4ZmY3NAkvKio8IE1DVCBtYXJrZXIgdmFsdWUgKi8KLSNkZWZpbmUgSjJLX01TX01DTyAweGZmNzcJLyoqPCBNQ08gbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19TT0MgMHhmZjRmICAgLyoqPCBTT0MgbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19TT1QgMHhmZjkwICAgLyoqPCBTT1QgbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19TT0QgMHhmZjkzICAgLyoqPCBTT0QgbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19FT0MgMHhmZmQ5ICAgLyoqPCBFT0MgbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19TSVogMHhmZjUxICAgLyoqPCBTSVogbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19DT0QgMHhmZjUyICAgLyoqPCBDT0QgbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19DT0MgMHhmZjUzICAgLyoqPCBDT0MgbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19SR04gMHhmZjVlICAgLyoqPCBSR04gbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19RQ0QgMHhmZjVjICAgLyoqPCBRQ0QgbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19RQ0MgMHhmZjVkICAgLyoqPCBRQ0MgbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19QT0MgMHhmZjVmICAgLyoqPCBQT0MgbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19UTE0gMHhmZjU1ICAgLyoqPCBUTE0gbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19QTE0gMHhmZjU3ICAgLyoqPCBQTE0gbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19QTFQgMHhmZjU4ICAgLyoqPCBQTFQgbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19QUE0gMHhmZjYwICAgLyoqPCBQUE0gbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19QUFQgMHhmZjYxICAgLyoqPCBQUFQgbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19TT1AgMHhmZjkxICAgLyoqPCBTT1AgbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19FUEggMHhmZjkyICAgLyoqPCBFUEggbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19DUkcgMHhmZjYzICAgLyoqPCBDUkcgbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19DT00gMHhmZjY0ICAgLyoqPCBDT00gbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19DQkQgMHhmZjc4ICAgLyoqPCBDQkQgbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19NQ0MgMHhmZjc1ICAgLyoqPCBNQ0MgbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19NQ1QgMHhmZjc0ICAgLyoqPCBNQ1QgbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19NQ08gMHhmZjc3ICAgLyoqPCBNQ08gbWFya2VyIHZhbHVlICovCiAKLSNkZWZpbmUgSjJLX01TX1VOSyAwCQkvKio8IFVOS05PV04gbWFya2VyIHZhbHVlICovCisjZGVmaW5lIEoyS19NU19VTksgMCAgICAgICAgLyoqPCBVTktOT1dOIG1hcmtlciB2YWx1ZSAqLwogCiAvKiBVbmlQRz4+ICovCiAjaWZkZWYgVVNFX0pQV0wKLSNkZWZpbmUgSjJLX01TX0VQQyAweGZmNjgJLyoqPCBFUEMgbWFya2VyIHZhbHVlIChQYXJ0IDExOiBKUEVHIDIwMDAgZm9yIFdpcmVsZXNzKSAqLwotI2RlZmluZSBKMktfTVNfRVBCIDB4ZmY2NgkvKio8IEVQQiBtYXJrZXIgdmFsdWUgKFBhcnQgMTE6IEpQRUcgMjAwMCBmb3IgV2lyZWxlc3MpICovIAotI2RlZmluZSBKMktfTVNfRVNEIDB4ZmY2NwkvKio8IEVTRCBtYXJrZXIgdmFsdWUgKFBhcnQgMTE6IEpQRUcgMjAwMCBmb3IgV2lyZWxlc3MpICovIAotI2RlZmluZSBKMktfTVNfUkVEIDB4ZmY2OQkvKio8IFJFRCBtYXJrZXIgdmFsdWUgKFBhcnQgMTE6IEpQRUcgMjAwMCBmb3IgV2lyZWxlc3MpICovCisjZGVmaW5lIEoyS19NU19FUEMgMHhmZjY4ICAgLyoqPCBFUEMgbWFya2VyIHZhbHVlIChQYXJ0IDExOiBKUEVHIDIwMDAgZm9yIFdpcmVsZXNzKSAqLworI2RlZmluZSBKMktfTVNfRVBCIDB4ZmY2NiAgIC8qKjwgRVBCIG1hcmtlciB2YWx1ZSAoUGFydCAxMTogSlBFRyAyMDAwIGZvciBXaXJlbGVzcykgKi8KKyNkZWZpbmUgSjJLX01TX0VTRCAweGZmNjcgICAvKio8IEVTRCBtYXJrZXIgdmFsdWUgKFBhcnQgMTE6IEpQRUcgMjAwMCBmb3IgV2lyZWxlc3MpICovCisjZGVmaW5lIEoyS19NU19SRUQgMHhmZjY5ICAgLyoqPCBSRUQgbWFya2VyIHZhbHVlIChQYXJ0IDExOiBKUEVHIDIwMDAgZm9yIFdpcmVsZXNzKSAqLwogI2VuZGlmIC8qIFVTRV9KUFdMICovCiAjaWZkZWYgVVNFX0pQU0VDCiAjZGVmaW5lIEoyS19NU19TRUMgMHhmZjY1ICAgIC8qKjwgU0VDIG1hcmtlciB2YWx1ZSAoUGFydCA4OiBTZWN1cmUgSlBFRyAyMDAwKSAqLwpAQCAtMTA5LDYgKzEwNyw4IEBACiAjZW5kaWYgLyogVVNFX0pQU0VDICovCiAvKiA8PFVuaVBHICovCiAKKyNkZWZpbmUgSjJLX01BWF9QT0NTICAgIDMyICAgICAgLyoqPCBNYXhpbXVtIG51bWJlciBvZiBQT0NzICovCisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qKgpAQCAtMTE2LDkxICsxMTYsODkgQEAKICAqIFRoZXNlIHZhbHVlcyBtYXkgYmUgY29tYmluZWQgd2l0aCBhIHwgb3BlcmF0b3IuCiAgKiAqLwogdHlwZWRlZiBlbnVtIEoyS19TVEFUVVMgewotCUoyS19TVEFURV9OT05FICA9ICAweDAwMDAsIC8qKjwgYSBTT0MgbWFya2VyIGlzIGV4cGVjdGVkICovCi0JSjJLX1NUQVRFX01IU09DICA9IDB4MDAwMSwgLyoqPCBhIFNPQyBtYXJrZXIgaXMgZXhwZWN0ZWQgKi8KLQlKMktfU1RBVEVfTUhTSVogID0gMHgwMDAyLCAvKio8IGEgU0laIG1hcmtlciBpcyBleHBlY3RlZCAqLwotCUoyS19TVEFURV9NSCAgICAgPSAweDAwMDQsIC8qKjwgdGhlIGRlY29kaW5nIHByb2Nlc3MgaXMgaW4gdGhlIG1haW4gaGVhZGVyICovCi0JSjJLX1NUQVRFX1RQSFNPVCA9IDB4MDAwOCwgLyoqPCB0aGUgZGVjb2RpbmcgcHJvY2VzcyBpcyBpbiBhIHRpbGUgcGFydCBoZWFkZXIgYW5kIGV4cGVjdHMgYSBTT1QgbWFya2VyICovCi0JSjJLX1NUQVRFX1RQSCAgICA9IDB4MDAxMCwgLyoqPCB0aGUgZGVjb2RpbmcgcHJvY2VzcyBpcyBpbiBhIHRpbGUgcGFydCBoZWFkZXIgKi8KLQlKMktfU1RBVEVfTVQgICAgID0gMHgwMDIwLCAvKio8IHRoZSBFT0MgbWFya2VyIGhhcyBqdXN0IGJlZW4gcmVhZCAqLwotCUoyS19TVEFURV9ORU9DICAgPSAweDAwNDAsIC8qKjwgdGhlIGRlY29kaW5nIHByb2Nlc3MgbXVzdCBub3QgZXhwZWN0IGEgRU9DIG1hcmtlciBiZWNhdXNlIHRoZSBjb2Rlc3RyZWFtIGlzIHRydW5jYXRlZCAqLworICAgIEoyS19TVEFURV9OT05FICA9ICAweDAwMDAsIC8qKjwgYSBTT0MgbWFya2VyIGlzIGV4cGVjdGVkICovCisgICAgSjJLX1NUQVRFX01IU09DICA9IDB4MDAwMSwgLyoqPCBhIFNPQyBtYXJrZXIgaXMgZXhwZWN0ZWQgKi8KKyAgICBKMktfU1RBVEVfTUhTSVogID0gMHgwMDAyLCAvKio8IGEgU0laIG1hcmtlciBpcyBleHBlY3RlZCAqLworICAgIEoyS19TVEFURV9NSCAgICAgPSAweDAwMDQsIC8qKjwgdGhlIGRlY29kaW5nIHByb2Nlc3MgaXMgaW4gdGhlIG1haW4gaGVhZGVyICovCisgICAgSjJLX1NUQVRFX1RQSFNPVCA9IDB4MDAwOCwgLyoqPCB0aGUgZGVjb2RpbmcgcHJvY2VzcyBpcyBpbiBhIHRpbGUgcGFydCBoZWFkZXIgYW5kIGV4cGVjdHMgYSBTT1QgbWFya2VyICovCisgICAgSjJLX1NUQVRFX1RQSCAgICA9IDB4MDAxMCwgLyoqPCB0aGUgZGVjb2RpbmcgcHJvY2VzcyBpcyBpbiBhIHRpbGUgcGFydCBoZWFkZXIgKi8KKyAgICBKMktfU1RBVEVfTVQgICAgID0gMHgwMDIwLCAvKio8IHRoZSBFT0MgbWFya2VyIGhhcyBqdXN0IGJlZW4gcmVhZCAqLworICAgIEoyS19TVEFURV9ORU9DICAgPSAweDAwNDAsIC8qKjwgdGhlIGRlY29kaW5nIHByb2Nlc3MgbXVzdCBub3QgZXhwZWN0IGEgRU9DIG1hcmtlciBiZWNhdXNlIHRoZSBjb2Rlc3RyZWFtIGlzIHRydW5jYXRlZCAqLworICAgIEoyS19TVEFURV9EQVRBICAgPSAweDAwODAsIC8qKjwgYSB0aWxlIGhlYWRlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcmVhZCBhbmQgY29kZXN0cmVhbSBpcyBleHBlY3RlZCAqLwogCi0JSjJLX1NUQVRFX0VPQwkgPSAweDAxMDAsIC8qKjwgdGhlIGRlY29kaW5nIHByb2Nlc3MgaGFzIGVuY291bnRlcmVkIHRoZSBFT0MgbWFya2VyICovCi0JSjJLX1NUQVRFX0VSUiAgICA9IDB4ODAwMCAgLyoqPCB0aGUgZGVjb2RpbmcgcHJvY2VzcyBoYXMgZW5jb3VudGVyZWQgYW4gZXJyb3IgKEZJWE1FIHdhcm5pbmcgVjEgPSAweDAwODApKi8KKyAgICBKMktfU1RBVEVfRU9DICAgID0gMHgwMTAwLCAvKio8IHRoZSBkZWNvZGluZyBwcm9jZXNzIGhhcyBlbmNvdW50ZXJlZCB0aGUgRU9DIG1hcmtlciAqLworICAgIEoyS19TVEFURV9FUlIgICAgPSAweDgwMDAgIC8qKjwgdGhlIGRlY29kaW5nIHByb2Nlc3MgaGFzIGVuY291bnRlcmVkIGFuIGVycm9yIChGSVhNRSB3YXJuaW5nIFYxID0gMHgwMDgwKSovCiB9IEoyS19TVEFUVVM7CiAKIC8qKgogICogVHlwZSBvZiBlbGVtZW50cyBzdG9yaW5nIGluIHRoZSBNQ1QgZGF0YQogICovCi10eXBlZGVmIGVudW0gTUNUX0VMRU1FTlRfVFlQRQotewotCU1DVF9UWVBFX0lOVDE2ID0gMCwJCS8qKiBNQ1QgZGF0YSBpcyBzdG9yZWQgYXMgc2lnbmVkIHNob3J0cyovCi0JTUNUX1RZUEVfSU5UMzIgPSAxLAkJLyoqIE1DVCBkYXRhIGlzIHN0b3JlZCBhcyBzaWduZWQgaW50ZWdlcnMqLwotCU1DVF9UWVBFX0ZMT0FUID0gMiwJCS8qKiBNQ1QgZGF0YSBpcyBzdG9yZWQgYXMgZmxvYXRzKi8KLQlNQ1RfVFlQRV9ET1VCTEUgPSAzCQkvKiogTUNUIGRhdGEgaXMgc3RvcmVkIGFzIGRvdWJsZXMqLwordHlwZWRlZiBlbnVtIE1DVF9FTEVNRU5UX1RZUEUgeworICAgIE1DVF9UWVBFX0lOVDE2ID0gMCwgICAgIC8qKiBNQ1QgZGF0YSBpcyBzdG9yZWQgYXMgc2lnbmVkIHNob3J0cyovCisgICAgTUNUX1RZUEVfSU5UMzIgPSAxLCAgICAgLyoqIE1DVCBkYXRhIGlzIHN0b3JlZCBhcyBzaWduZWQgaW50ZWdlcnMqLworICAgIE1DVF9UWVBFX0ZMT0FUID0gMiwgICAgIC8qKiBNQ1QgZGF0YSBpcyBzdG9yZWQgYXMgZmxvYXRzKi8KKyAgICBNQ1RfVFlQRV9ET1VCTEUgPSAzICAgICAvKiogTUNUIGRhdGEgaXMgc3RvcmVkIGFzIGRvdWJsZXMqLwogfSBKMktfTUNUX0VMRU1FTlRfVFlQRTsKIAogLyoqCiAgKiBUeXBlIG9mIE1DVCBhcnJheQogICovCi10eXBlZGVmIGVudW0gTUNUX0FSUkFZX1RZUEUKLXsKLQlNQ1RfVFlQRV9ERVBFTkRFTkNZID0gMCwKLQlNQ1RfVFlQRV9ERUNPUlJFTEFUSU9OID0gMSwKLQlNQ1RfVFlQRV9PRkZTRVQgPSAyCit0eXBlZGVmIGVudW0gTUNUX0FSUkFZX1RZUEUgeworICAgIE1DVF9UWVBFX0RFUEVOREVOQ1kgPSAwLAorICAgIE1DVF9UWVBFX0RFQ09SUkVMQVRJT04gPSAxLAorICAgIE1DVF9UWVBFX09GRlNFVCA9IDIKIH0gSjJLX01DVF9BUlJBWV9UWVBFOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0vKiogCi1UMiBlbmNvZGluZyBtb2RlIAorLyoqCitUMiBlbmNvZGluZyBtb2RlCiAqLwogdHlwZWRlZiBlbnVtIFQyX01PREUgewotCVRIUkVTSF9DQUxDID0gMCwJLyoqIEZ1bmN0aW9uIGNhbGxlZCBpbiBSYXRlIGFsbG9jYXRpb24gcHJvY2VzcyovCi0JRklOQUxfUEFTUyA9IDEJCS8qKiBGdW5jdGlvbiBjYWxsZWQgaW4gVGllciAyIHByb2Nlc3MqLwotfUoyS19UMl9NT0RFOworICAgIFRIUkVTSF9DQUxDID0gMCwgICAgLyoqIEZ1bmN0aW9uIGNhbGxlZCBpbiBSYXRlIGFsbG9jYXRpb24gcHJvY2VzcyovCisgICAgRklOQUxfUEFTUyA9IDEgICAgICAvKiogRnVuY3Rpb24gY2FsbGVkIGluIFRpZXIgMiBwcm9jZXNzKi8KK30gSjJLX1QyX01PREU7CiAKIC8qKgogICogUXVhbnRpemF0aW9uIHN0ZXBzaXplCiAgKi8KIHR5cGVkZWYgc3RydWN0IG9wal9zdGVwc2l6ZSB7Ci0JLyoqIGV4cG9uZW50ICovCi0JT1BKX0lOVDMyIGV4cG47Ci0JLyoqIG1hbnRpc3NhICovCi0JT1BKX0lOVDMyIG1hbnQ7CisgICAgLyoqIGV4cG9uZW50ICovCisgICAgT1BKX0lOVDMyIGV4cG47CisgICAgLyoqIG1hbnRpc3NhICovCisgICAgT1BKX0lOVDMyIG1hbnQ7CiB9IG9wal9zdGVwc2l6ZV90OwogCiAvKioKIFRpbGUtY29tcG9uZW50IGNvZGluZyBwYXJhbWV0ZXJzCiAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3RjY3AKLXsKLQkvKiogY29kaW5nIHN0eWxlICovCi0JT1BKX1VJTlQzMiBjc3R5OwotCS8qKiBudW1iZXIgb2YgcmVzb2x1dGlvbnMgKi8KLQlPUEpfVUlOVDMyIG51bXJlc29sdXRpb25zOwotCS8qKiBjb2RlLWJsb2NrcyB3aWR0aCAqLwotCU9QSl9VSU5UMzIgY2Jsa3c7Ci0JLyoqIGNvZGUtYmxvY2tzIGhlaWdodCAqLwotCU9QSl9VSU5UMzIgY2Jsa2g7Ci0JLyoqIGNvZGUtYmxvY2sgY29kaW5nIHN0eWxlICovCi0JT1BKX1VJTlQzMiBjYmxrc3R5OwotCS8qKiBkaXNjcmV0ZSB3YXZlbGV0IHRyYW5zZm9ybSBpZGVudGlmaWVyICovCi0JT1BKX1VJTlQzMiBxbWZiaWQ7Ci0JLyoqIHF1YW50aXNhdGlvbiBzdHlsZSAqLwotCU9QSl9VSU5UMzIgcW50c3R5OwotCS8qKiBzdGVwc2l6ZXMgdXNlZCBmb3IgcXVhbnRpemF0aW9uICovCi0Jb3BqX3N0ZXBzaXplX3Qgc3RlcHNpemVzW09QSl9KMktfTUFYQkFORFNdOwotCS8qKiBudW1iZXIgb2YgZ3VhcmQgYml0cyAqLwotCU9QSl9VSU5UMzIgbnVtZ2JpdHM7Ci0JLyoqIFJlZ2lvbiBPZiBJbnRlcmVzdCBzaGlmdCAqLwotCU9QSl9JTlQzMiByb2lzaGlmdDsKLQkvKiogcHJlY2luY3Qgd2lkdGggKi8KLQlPUEpfVUlOVDMyIHByY3dbT1BKX0oyS19NQVhSTFZMU107Ci0JLyoqIHByZWNpbmN0IGhlaWdodCAqLwotCU9QSl9VSU5UMzIgcHJjaFtPUEpfSjJLX01BWFJMVkxTXTsKLQkvKiogdGhlIGRjX2xldmVsX3NoaWZ0ICoqLwotCU9QSl9JTlQzMiBtX2RjX2xldmVsX3NoaWZ0OwordHlwZWRlZiBzdHJ1Y3Qgb3BqX3RjY3AgeworICAgIC8qKiBjb2Rpbmcgc3R5bGUgKi8KKyAgICBPUEpfVUlOVDMyIGNzdHk7CisgICAgLyoqIG51bWJlciBvZiByZXNvbHV0aW9ucyAqLworICAgIE9QSl9VSU5UMzIgbnVtcmVzb2x1dGlvbnM7CisgICAgLyoqIGNvZGUtYmxvY2tzIHdpZHRoICovCisgICAgT1BKX1VJTlQzMiBjYmxrdzsKKyAgICAvKiogY29kZS1ibG9ja3MgaGVpZ2h0ICovCisgICAgT1BKX1VJTlQzMiBjYmxraDsKKyAgICAvKiogY29kZS1ibG9jayBjb2Rpbmcgc3R5bGUgKi8KKyAgICBPUEpfVUlOVDMyIGNibGtzdHk7CisgICAgLyoqIGRpc2NyZXRlIHdhdmVsZXQgdHJhbnNmb3JtIGlkZW50aWZpZXIgKi8KKyAgICBPUEpfVUlOVDMyIHFtZmJpZDsKKyAgICAvKiogcXVhbnRpc2F0aW9uIHN0eWxlICovCisgICAgT1BKX1VJTlQzMiBxbnRzdHk7CisgICAgLyoqIHN0ZXBzaXplcyB1c2VkIGZvciBxdWFudGl6YXRpb24gKi8KKyAgICBvcGpfc3RlcHNpemVfdCBzdGVwc2l6ZXNbT1BKX0oyS19NQVhCQU5EU107CisgICAgLyoqIG51bWJlciBvZiBndWFyZCBiaXRzICovCisgICAgT1BKX1VJTlQzMiBudW1nYml0czsKKyAgICAvKiogUmVnaW9uIE9mIEludGVyZXN0IHNoaWZ0ICovCisgICAgT1BKX0lOVDMyIHJvaXNoaWZ0OworICAgIC8qKiBwcmVjaW5jdCB3aWR0aCAqLworICAgIE9QSl9VSU5UMzIgcHJjd1tPUEpfSjJLX01BWFJMVkxTXTsKKyAgICAvKiogcHJlY2luY3QgaGVpZ2h0ICovCisgICAgT1BKX1VJTlQzMiBwcmNoW09QSl9KMktfTUFYUkxWTFNdOworICAgIC8qKiB0aGUgZGNfbGV2ZWxfc2hpZnQgKiovCisgICAgT1BKX0lOVDMyIG1fZGNfbGV2ZWxfc2hpZnQ7CiB9CiBvcGpfdGNjcF90OwogCkBAIC0yMDksMzMgKzIwNywzMCBAQAogLyoqCiAgKiBGSVhNRSBET0MKICAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX21jdF9kYXRhCi17Ci0JSjJLX01DVF9FTEVNRU5UX1RZUEUgbV9lbGVtZW50X3R5cGU7Ci0JSjJLX01DVF9BUlJBWV9UWVBFCSBtX2FycmF5X3R5cGU7Ci0JT1BKX1VJTlQzMgkJCSBtX2luZGV4OwotCU9QSl9CWVRFICoJCQkgbV9kYXRhOwotCU9QSl9VSU5UMzIJCQkgbV9kYXRhX3NpemU7Cit0eXBlZGVmIHN0cnVjdCBvcGpfbWN0X2RhdGEgeworICAgIEoyS19NQ1RfRUxFTUVOVF9UWVBFIG1fZWxlbWVudF90eXBlOworICAgIEoyS19NQ1RfQVJSQVlfVFlQRSAgIG1fYXJyYXlfdHlwZTsKKyAgICBPUEpfVUlOVDMyICAgICAgICAgICBtX2luZGV4OworICAgIE9QSl9CWVRFICogICAgICAgICAgIG1fZGF0YTsKKyAgICBPUEpfVUlOVDMyICAgICAgICAgICBtX2RhdGFfc2l6ZTsKIH0KIG9wal9tY3RfZGF0YV90OwogCiAvKioKICAqIEZJWE1FIERPQwogICovCi10eXBlZGVmIHN0cnVjdCBvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGEKLXsKLQlPUEpfVUlOVDMyCQkJIG1faW5kZXg7Ci0JT1BKX1VJTlQzMgkJCSBtX25iX2NvbXBzOwotCW9wal9tY3RfZGF0YV90ICoJIG1fZGVjb3JyZWxhdGlvbl9hcnJheTsKLQlvcGpfbWN0X2RhdGFfdCAqCSBtX29mZnNldF9hcnJheTsKLQlPUEpfVUlOVDMyCQkJIG1faXNfaXJyZXZlcnNpYmxlIDogMTsKK3R5cGVkZWYgc3RydWN0IG9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YSB7CisgICAgT1BKX1VJTlQzMiAgICAgICAgICAgbV9pbmRleDsKKyAgICBPUEpfVUlOVDMyICAgICAgICAgICBtX25iX2NvbXBzOworICAgIG9wal9tY3RfZGF0YV90ICogICAgIG1fZGVjb3JyZWxhdGlvbl9hcnJheTsKKyAgICBvcGpfbWN0X2RhdGFfdCAqICAgICBtX29mZnNldF9hcnJheTsKKyAgICBPUEpfQklURklFTEQgICAgICAgICBtX2lzX2lycmV2ZXJzaWJsZSA6IDE7CiB9CiBvcGpfc2ltcGxlX21jY19kZWNvcnJlbGF0aW9uX2RhdGFfdDsKIAotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3BweF9zdHJ1Y3QKLXsKLQlPUEpfQllURSogICBtX2RhdGE7IC8qIG1fZGF0YSA9PSBOVUxMID0+IFpwcHggbm90IHJlYWQgeWV0ICovCi0JT1BKX1VJTlQzMgltX2RhdGFfc2l6ZTsKK3R5cGVkZWYgc3RydWN0IG9wal9wcHhfc3RydWN0IHsKKyAgICBPUEpfQllURSogICBtX2RhdGE7IC8qIG1fZGF0YSA9PSBOVUxMID0+IFpwcHggbm90IHJlYWQgeWV0ICovCisgICAgT1BKX1VJTlQzMiAgbV9kYXRhX3NpemU7CiB9IG9wal9wcHg7CiAKIC8qKgpAQCAtMjQzLDEwNiArMjM4LDEwNSBAQAogdGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBzdG9yZSBjb2RpbmcvZGVjb2RpbmcgcGFyYW1ldGVycyBjb21tb24gdG8gYWxsCiB0aWxlcyAoaW5mb3JtYXRpb24gbGlrZSBDT0QsIENPQyBpbiBtYWluIGhlYWRlcikKICovCi10eXBlZGVmIHN0cnVjdCBvcGpfdGNwCi17Ci0JLyoqIGNvZGluZyBzdHlsZSAqLwotCU9QSl9VSU5UMzIgY3N0eTsKLQkvKiogcHJvZ3Jlc3Npb24gb3JkZXIgKi8KLQlPUEpfUFJPR19PUkRFUiBwcmc7Ci0JLyoqIG51bWJlciBvZiBsYXllcnMgKi8KLQlPUEpfVUlOVDMyIG51bWxheWVyczsKLQlPUEpfVUlOVDMyIG51bV9sYXllcnNfdG9fZGVjb2RlOwotCS8qKiBtdWx0aS1jb21wb25lbnQgdHJhbnNmb3JtIGlkZW50aWZpZXIgKi8KLQlPUEpfVUlOVDMyIG1jdDsKLQkvKiogcmF0ZXMgb2YgbGF5ZXJzICovCi0JT1BKX0ZMT0FUMzIgcmF0ZXNbMTAwXTsKLQkvKiogbnVtYmVyIG9mIHByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZXMgKi8KLQlPUEpfVUlOVDMyIG51bXBvY3M7Ci0JLyoqIHByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZXMgKi8KLQlvcGpfcG9jX3QgcG9jc1szMl07Ci0JCi0JLyoqIG51bWJlciBvZiBwcHQgbWFya2VycyAocmVzZXJ2ZWQgc2l6ZSkgKi8KLQlPUEpfVUlOVDMyIHBwdF9tYXJrZXJzX2NvdW50OwotCS8qKiBwcHQgbWFya2VycyBkYXRhICh0YWJsZSBpbmRleGVkIGJ5IFpwcHQpICovCi0Jb3BqX3BweCogcHB0X21hcmtlcnM7Ci0JCi0JLyoqIHBhY2tldCBoZWFkZXIgc3RvcmUgdGhlcmUgZm9yIGZ1dHVyZSB1c2UgaW4gdDJfZGVjb2RlX3BhY2tldCAqLwotCU9QSl9CWVRFICpwcHRfZGF0YTsKLQkvKiogdXNlZCB0byBrZWVwIGEgdHJhY2sgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgKi8KLQlPUEpfQllURSAqcHB0X2J1ZmZlcjsKLQkvKiogTnVtYmVyIG9mIGJ5dGVzIHN0b3JlZCBpbnNpZGUgcHB0X2RhdGEqLwotCU9QSl9VSU5UMzIgcHB0X2RhdGFfc2l6ZTsKLQkvKiogc2l6ZSBvZiBwcHRfZGF0YSovCi0JT1BKX1VJTlQzMiBwcHRfbGVuOwotCS8qKiBhZGQgZml4ZWRfcXVhbGl0eSAqLwotCU9QSl9GTE9BVDMyIGRpc3RvcmF0aW9bMTAwXTsKLQkvKiogdGlsZS1jb21wb25lbnQgY29kaW5nIHBhcmFtZXRlcnMgKi8KLQlvcGpfdGNjcF90ICp0Y2NwczsKLQkvKiogbnVtYmVyIG9mIHRpbGUgcGFydHMgZm9yIHRoZSB0aWxlLiAqLwotCU9QSl9VSU5UMzIgbV9uYl90aWxlX3BhcnRzOwotCS8qKiBkYXRhIGZvciB0aGUgdGlsZSAqLwotCU9QSl9CWVRFICoJCW1fZGF0YTsKLQkvKiogc2l6ZSBvZiBkYXRhICovCi0JT1BKX1VJTlQzMgkJbV9kYXRhX3NpemU7Ci0JLyoqIGVuY29kaW5nIG5vcm1zICovCi0JT1BKX0ZMT0FUNjQgKgltY3Rfbm9ybXM7Ci0JLyoqIHRoZSBtY3QgZGVjb2RpbmcgbWF0cml4ICovCi0JT1BKX0ZMT0FUMzIgKgltX21jdF9kZWNvZGluZ19tYXRyaXg7Ci0JLyoqIHRoZSBtY3QgY29kaW5nIG1hdHJpeCAqLwotCU9QSl9GTE9BVDMyICoJbV9tY3RfY29kaW5nX21hdHJpeDsKLQkvKiogbWN0IHJlY29yZHMgKi8KLQlvcGpfbWN0X2RhdGFfdCAqIG1fbWN0X3JlY29yZHM7Ci0JLyoqIHRoZSBudW1iZXIgb2YgbWN0IHJlY29yZHMuICovCi0JT1BKX1VJTlQzMiBtX25iX21jdF9yZWNvcmRzOwotCS8qKiB0aGUgbWF4IG51bWJlciBvZiBtY3QgcmVjb3Jkcy4gKi8KLQlPUEpfVUlOVDMyIG1fbmJfbWF4X21jdF9yZWNvcmRzOwotCS8qKiBtY2MgcmVjb3JkcyAqLwotCW9wal9zaW1wbGVfbWNjX2RlY29ycmVsYXRpb25fZGF0YV90ICogbV9tY2NfcmVjb3JkczsKLQkvKiogdGhlIG51bWJlciBvZiBtY3QgcmVjb3Jkcy4gKi8KLQlPUEpfVUlOVDMyIG1fbmJfbWNjX3JlY29yZHM7Ci0JLyoqIHRoZSBtYXggbnVtYmVyIG9mIG1jdCByZWNvcmRzLiAqLwotCU9QSl9VSU5UMzIgbV9uYl9tYXhfbWNjX3JlY29yZHM7Cit0eXBlZGVmIHN0cnVjdCBvcGpfdGNwIHsKKyAgICAvKiogY29kaW5nIHN0eWxlICovCisgICAgT1BKX1VJTlQzMiBjc3R5OworICAgIC8qKiBwcm9ncmVzc2lvbiBvcmRlciAqLworICAgIE9QSl9QUk9HX09SREVSIHByZzsKKyAgICAvKiogbnVtYmVyIG9mIGxheWVycyAqLworICAgIE9QSl9VSU5UMzIgbnVtbGF5ZXJzOworICAgIE9QSl9VSU5UMzIgbnVtX2xheWVyc190b19kZWNvZGU7CisgICAgLyoqIG11bHRpLWNvbXBvbmVudCB0cmFuc2Zvcm0gaWRlbnRpZmllciAqLworICAgIE9QSl9VSU5UMzIgbWN0OworICAgIC8qKiByYXRlcyBvZiBsYXllcnMgKi8KKyAgICBPUEpfRkxPQVQzMiByYXRlc1sxMDBdOworICAgIC8qKiBudW1iZXIgb2YgcHJvZ3Jlc3Npb24gb3JkZXIgY2hhbmdlcyAqLworICAgIE9QSl9VSU5UMzIgbnVtcG9jczsKKyAgICAvKiogcHJvZ3Jlc3Npb24gb3JkZXIgY2hhbmdlcyAqLworICAgIG9wal9wb2NfdCBwb2NzW0oyS19NQVhfUE9DU107CisKKyAgICAvKiogbnVtYmVyIG9mIHBwdCBtYXJrZXJzIChyZXNlcnZlZCBzaXplKSAqLworICAgIE9QSl9VSU5UMzIgcHB0X21hcmtlcnNfY291bnQ7CisgICAgLyoqIHBwdCBtYXJrZXJzIGRhdGEgKHRhYmxlIGluZGV4ZWQgYnkgWnBwdCkgKi8KKyAgICBvcGpfcHB4KiBwcHRfbWFya2VyczsKKworICAgIC8qKiBwYWNrZXQgaGVhZGVyIHN0b3JlIHRoZXJlIGZvciBmdXR1cmUgdXNlIGluIHQyX2RlY29kZV9wYWNrZXQgKi8KKyAgICBPUEpfQllURSAqcHB0X2RhdGE7CisgICAgLyoqIHVzZWQgdG8ga2VlcCBhIHRyYWNrIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5ICovCisgICAgT1BKX0JZVEUgKnBwdF9idWZmZXI7CisgICAgLyoqIE51bWJlciBvZiBieXRlcyBzdG9yZWQgaW5zaWRlIHBwdF9kYXRhKi8KKyAgICBPUEpfVUlOVDMyIHBwdF9kYXRhX3NpemU7CisgICAgLyoqIHNpemUgb2YgcHB0X2RhdGEqLworICAgIE9QSl9VSU5UMzIgcHB0X2xlbjsKKyAgICAvKiogYWRkIGZpeGVkX3F1YWxpdHkgKi8KKyAgICBPUEpfRkxPQVQzMiBkaXN0b3JhdGlvWzEwMF07CisgICAgLyoqIHRpbGUtY29tcG9uZW50IGNvZGluZyBwYXJhbWV0ZXJzICovCisgICAgb3BqX3RjY3BfdCAqdGNjcHM7CisgICAgLyoqIGN1cnJlbnQgdGlsZSBwYXJ0IG51bWJlciBvciAtMSBpZiBmaXJzdCB0aW1lIGludG8gdGhpcyB0aWxlICovCisgICAgT1BKX0lOVDMyICBtX2N1cnJlbnRfdGlsZV9wYXJ0X251bWJlcjsKKyAgICAvKiogbnVtYmVyIG9mIHRpbGUgcGFydHMgZm9yIHRoZSB0aWxlLiAqLworICAgIE9QSl9VSU5UMzIgbV9uYl90aWxlX3BhcnRzOworICAgIC8qKiBkYXRhIGZvciB0aGUgdGlsZSAqLworICAgIE9QSl9CWVRFICogICAgICBtX2RhdGE7CisgICAgLyoqIHNpemUgb2YgZGF0YSAqLworICAgIE9QSl9VSU5UMzIgICAgICBtX2RhdGFfc2l6ZTsKKyAgICAvKiogZW5jb2Rpbmcgbm9ybXMgKi8KKyAgICBPUEpfRkxPQVQ2NCAqICAgbWN0X25vcm1zOworICAgIC8qKiB0aGUgbWN0IGRlY29kaW5nIG1hdHJpeCAqLworICAgIE9QSl9GTE9BVDMyICogICBtX21jdF9kZWNvZGluZ19tYXRyaXg7CisgICAgLyoqIHRoZSBtY3QgY29kaW5nIG1hdHJpeCAqLworICAgIE9QSl9GTE9BVDMyICogICBtX21jdF9jb2RpbmdfbWF0cml4OworICAgIC8qKiBtY3QgcmVjb3JkcyAqLworICAgIG9wal9tY3RfZGF0YV90ICogbV9tY3RfcmVjb3JkczsKKyAgICAvKiogdGhlIG51bWJlciBvZiBtY3QgcmVjb3Jkcy4gKi8KKyAgICBPUEpfVUlOVDMyIG1fbmJfbWN0X3JlY29yZHM7CisgICAgLyoqIHRoZSBtYXggbnVtYmVyIG9mIG1jdCByZWNvcmRzLiAqLworICAgIE9QSl9VSU5UMzIgbV9uYl9tYXhfbWN0X3JlY29yZHM7CisgICAgLyoqIG1jYyByZWNvcmRzICovCisgICAgb3BqX3NpbXBsZV9tY2NfZGVjb3JyZWxhdGlvbl9kYXRhX3QgKiBtX21jY19yZWNvcmRzOworICAgIC8qKiB0aGUgbnVtYmVyIG9mIG1jdCByZWNvcmRzLiAqLworICAgIE9QSl9VSU5UMzIgbV9uYl9tY2NfcmVjb3JkczsKKyAgICAvKiogdGhlIG1heCBudW1iZXIgb2YgbWN0IHJlY29yZHMuICovCisgICAgT1BKX1VJTlQzMiBtX25iX21heF9tY2NfcmVjb3JkczsKIAogCi0JLyoqKioqIEZMQUdTICoqKioqKiovCi0JLyoqIElmIGNvZCA9PSAxIC0tPiB0aGVyZSB3YXMgYSBDT0QgbWFya2VyIGZvciB0aGUgcHJlc2VudCB0aWxlICovCi0JT1BKX1VJTlQzMiBjb2QgOiAxOwotCS8qKiBJZiBwcHQgPT0gMSAtLT4gdGhlcmUgd2FzIGEgUFBUIG1hcmtlciBmb3IgdGhlIHByZXNlbnQgdGlsZSAqLwotCU9QSl9VSU5UMzIgcHB0IDogMTsKLQkvKiogaW5kaWNhdGVzIGlmIGEgUE9DIG1hcmtlciBoYXMgYmVlbiB1c2VkIE86Tk8sIDE6WUVTICovCi0JT1BKX1VJTlQzMiBQT0MgOiAxOworICAgIC8qKioqKiBGTEFHUyAqKioqKioqLworICAgIC8qKiBJZiBjb2QgPT0gMSAtLT4gdGhlcmUgd2FzIGEgQ09EIG1hcmtlciBmb3IgdGhlIHByZXNlbnQgdGlsZSAqLworICAgIE9QSl9CSVRGSUVMRCBjb2QgOiAxOworICAgIC8qKiBJZiBwcHQgPT0gMSAtLT4gdGhlcmUgd2FzIGEgUFBUIG1hcmtlciBmb3IgdGhlIHByZXNlbnQgdGlsZSAqLworICAgIE9QSl9CSVRGSUVMRCBwcHQgOiAxOworICAgIC8qKiBpbmRpY2F0ZXMgaWYgYSBQT0MgbWFya2VyIGhhcyBiZWVuIHVzZWQgTzpOTywgMTpZRVMgKi8KKyAgICBPUEpfQklURklFTEQgUE9DIDogMTsKIH0gb3BqX3RjcF90OwogCiAKIAogCi10eXBlZGVmIHN0cnVjdCBvcGpfZW5jb2RpbmdfcGFyYW0KLXsKLQkvKiogTWF4aW11bSByYXRlIGZvciBlYWNoIGNvbXBvbmVudC4gSWYgPT0gMCwgY29tcG9uZW50IHNpemUgbGltaXRhdGlvbiBpcyBub3QgY29uc2lkZXJlZCAqLwotCU9QSl9VSU5UMzIgbV9tYXhfY29tcF9zaXplOwotCS8qKiBQb3NpdGlvbiBvZiB0aWxlIHBhcnQgZmxhZyBpbiBwcm9ncmVzc2lvbiBvcmRlciovCi0JT1BKX0lOVDMyIG1fdHBfcG9zOwotCS8qKiBmaXhlZCBsYXllciAqLwotCU9QSl9JTlQzMiAqbV9tYXRyaWNlOwotCS8qKiBGbGFnIGRldGVybWluaW5nIHRpbGUgcGFydCBnZW5lcmF0aW9uKi8KLQlPUEpfQllURSBtX3RwX2ZsYWc7Ci0JLyoqIGFsbG9jYXRpb24gYnkgcmF0ZS9kaXN0b3J0aW9uICovCi0JT1BKX1VJTlQzMiBtX2Rpc3RvX2FsbG9jIDogMTsKLQkvKiogYWxsb2NhdGlvbiBieSBmaXhlZCBsYXllciAqLwotCU9QSl9VSU5UMzIgbV9maXhlZF9hbGxvYyA6IDE7Ci0JLyoqIGFkZCBmaXhlZF9xdWFsaXR5ICovCi0JT1BKX1VJTlQzMiBtX2ZpeGVkX3F1YWxpdHkgOiAxOwotCS8qKiBFbmFibGluZyBUaWxlIHBhcnQgZ2VuZXJhdGlvbiovCi0JT1BKX1VJTlQzMiBtX3RwX29uIDogMTsKK3R5cGVkZWYgc3RydWN0IG9wal9lbmNvZGluZ19wYXJhbSB7CisgICAgLyoqIE1heGltdW0gcmF0ZSBmb3IgZWFjaCBjb21wb25lbnQuIElmID09IDAsIGNvbXBvbmVudCBzaXplIGxpbWl0YXRpb24gaXMgbm90IGNvbnNpZGVyZWQgKi8KKyAgICBPUEpfVUlOVDMyIG1fbWF4X2NvbXBfc2l6ZTsKKyAgICAvKiogUG9zaXRpb24gb2YgdGlsZSBwYXJ0IGZsYWcgaW4gcHJvZ3Jlc3Npb24gb3JkZXIqLworICAgIE9QSl9JTlQzMiBtX3RwX3BvczsKKyAgICAvKiogZml4ZWQgbGF5ZXIgKi8KKyAgICBPUEpfSU5UMzIgKm1fbWF0cmljZTsKKyAgICAvKiogRmxhZyBkZXRlcm1pbmluZyB0aWxlIHBhcnQgZ2VuZXJhdGlvbiovCisgICAgT1BKX0JZVEUgbV90cF9mbGFnOworICAgIC8qKiBhbGxvY2F0aW9uIGJ5IHJhdGUvZGlzdG9ydGlvbiAqLworICAgIE9QSl9CSVRGSUVMRCBtX2Rpc3RvX2FsbG9jIDogMTsKKyAgICAvKiogYWxsb2NhdGlvbiBieSBmaXhlZCBsYXllciAqLworICAgIE9QSl9CSVRGSUVMRCBtX2ZpeGVkX2FsbG9jIDogMTsKKyAgICAvKiogYWRkIGZpeGVkX3F1YWxpdHkgKi8KKyAgICBPUEpfQklURklFTEQgbV9maXhlZF9xdWFsaXR5IDogMTsKKyAgICAvKiogRW5hYmxpbmcgVGlsZSBwYXJ0IGdlbmVyYXRpb24qLworICAgIE9QSl9CSVRGSUVMRCBtX3RwX29uIDogMTsKIH0KIG9wal9lbmNvZGluZ19wYXJhbV90OwogCi10eXBlZGVmIHN0cnVjdCBvcGpfZGVjb2RpbmdfcGFyYW0KLXsKLQkvKiogaWYgIT0gMCwgdGhlbiBvcmlnaW5hbCBkaW1lbnNpb24gZGl2aWRlZCBieSAyXihyZWR1Y2UpOyBpZiA9PSAwIG9yIG5vdCB1c2VkLCBpbWFnZSBpcyBkZWNvZGVkIHRvIHRoZSBmdWxsIHJlc29sdXRpb24gKi8KLQlPUEpfVUlOVDMyIG1fcmVkdWNlOwotCS8qKiBpZiAhPSAwLCB0aGVuIG9ubHkgdGhlIGZpcnN0ICJsYXllciIgbGF5ZXJzIGFyZSBkZWNvZGVkOyBpZiA9PSAwIG9yIG5vdCB1c2VkLCBhbGwgdGhlIHF1YWxpdHkgbGF5ZXJzIGFyZSBkZWNvZGVkICovCi0JT1BKX1VJTlQzMiBtX2xheWVyOwordHlwZWRlZiBzdHJ1Y3Qgb3BqX2RlY29kaW5nX3BhcmFtIHsKKyAgICAvKiogaWYgIT0gMCwgdGhlbiBvcmlnaW5hbCBkaW1lbnNpb24gZGl2aWRlZCBieSAyXihyZWR1Y2UpOyBpZiA9PSAwIG9yIG5vdCB1c2VkLCBpbWFnZSBpcyBkZWNvZGVkIHRvIHRoZSBmdWxsIHJlc29sdXRpb24gKi8KKyAgICBPUEpfVUlOVDMyIG1fcmVkdWNlOworICAgIC8qKiBpZiAhPSAwLCB0aGVuIG9ubHkgdGhlIGZpcnN0ICJsYXllciIgbGF5ZXJzIGFyZSBkZWNvZGVkOyBpZiA9PSAwIG9yIG5vdCB1c2VkLCBhbGwgdGhlIHF1YWxpdHkgbGF5ZXJzIGFyZSBkZWNvZGVkICovCisgICAgT1BKX1VJTlQzMiBtX2xheWVyOwogfQogb3BqX2RlY29kaW5nX3BhcmFtX3Q7CiAKQEAgLTM1MCwxOTkgKzM0NCwxOTQgQEAKIC8qKgogICogQ29kaW5nIHBhcmFtZXRlcnMKICAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX2NwCi17Ci0JLyoqIFNpemUgb2YgdGhlIGltYWdlIGluIGJpdHMqLwotCS8qaW50IGltZ19zaXplOyovCi0JLyoqIFJzaXoqLwordHlwZWRlZiBzdHJ1Y3Qgb3BqX2NwIHsKKyAgICAvKiogU2l6ZSBvZiB0aGUgaW1hZ2UgaW4gYml0cyovCisgICAgLyppbnQgaW1nX3NpemU7Ki8KKyAgICAvKiogUnNpeiovCiAgICAgT1BKX1VJTlQxNiByc2l6OwotCS8qKiBYVE9zaXogKi8KLQlPUEpfVUlOVDMyIHR4MDsgLyogTVNEIHNlZSBub3JtICovCi0JLyoqIFlUT3NpeiAqLwotCU9QSl9VSU5UMzIgdHkwOyAvKiBNU0Qgc2VlIG5vcm0gKi8KLQkvKiogWFRzaXogKi8KLQlPUEpfVUlOVDMyIHRkeDsKLQkvKiogWVRzaXogKi8KLQlPUEpfVUlOVDMyIHRkeTsKLQkvKiogY29tbWVudCAqLwotCU9QSl9DSEFSICpjb21tZW50OwotCS8qKiBudW1iZXIgb2YgdGlsZXMgaW4gd2lkdGggKi8KLQlPUEpfVUlOVDMyIHR3OwotCS8qKiBudW1iZXIgb2YgdGlsZXMgaW4gaGVpZ3RoICovCi0JT1BKX1VJTlQzMiB0aDsKKyAgICAvKiogWFRPc2l6ICovCisgICAgT1BKX1VJTlQzMiB0eDA7IC8qIE1TRCBzZWUgbm9ybSAqLworICAgIC8qKiBZVE9zaXogKi8KKyAgICBPUEpfVUlOVDMyIHR5MDsgLyogTVNEIHNlZSBub3JtICovCisgICAgLyoqIFhUc2l6ICovCisgICAgT1BKX1VJTlQzMiB0ZHg7CisgICAgLyoqIFlUc2l6ICovCisgICAgT1BKX1VJTlQzMiB0ZHk7CisgICAgLyoqIGNvbW1lbnQgKi8KKyAgICBPUEpfQ0hBUiAqY29tbWVudDsKKyAgICAvKiogbnVtYmVyIG9mIHRpbGVzIGluIHdpZHRoICovCisgICAgT1BKX1VJTlQzMiB0dzsKKyAgICAvKiogbnVtYmVyIG9mIHRpbGVzIGluIGhlaWdodCAqLworICAgIE9QSl9VSU5UMzIgdGg7CiAKLQkvKiogbnVtYmVyIG9mIHBwbSBtYXJrZXJzIChyZXNlcnZlZCBzaXplKSAqLwotCU9QSl9VSU5UMzIgcHBtX21hcmtlcnNfY291bnQ7Ci0JLyoqIHBwbSBtYXJrZXJzIGRhdGEgKHRhYmxlIGluZGV4ZWQgYnkgWnBwbSkgKi8KLQlvcGpfcHB4KiBwcG1fbWFya2VyczsKLQkKLQkvKiogcGFja2V0IGhlYWRlciBzdG9yZSB0aGVyZSBmb3IgZnV0dXJlIHVzZSBpbiB0Ml9kZWNvZGVfcGFja2V0ICovCi0JT1BKX0JZVEUgKnBwbV9kYXRhOwotCS8qKiBzaXplIG9mIHRoZSBwcG1fZGF0YSovCi0JT1BKX1VJTlQzMiBwcG1fbGVuOwotCS8qKiBzaXplIG9mIHRoZSBwcG1fZGF0YSovCi0JT1BKX1VJTlQzMiBwcG1fZGF0YV9yZWFkOworICAgIC8qKiBudW1iZXIgb2YgcHBtIG1hcmtlcnMgKHJlc2VydmVkIHNpemUpICovCisgICAgT1BKX1VJTlQzMiBwcG1fbWFya2Vyc19jb3VudDsKKyAgICAvKiogcHBtIG1hcmtlcnMgZGF0YSAodGFibGUgaW5kZXhlZCBieSBacHBtKSAqLworICAgIG9wal9wcHgqIHBwbV9tYXJrZXJzOwogCi0JT1BKX0JZVEUgKnBwbV9kYXRhX2N1cnJlbnQ7CisgICAgLyoqIHBhY2tldCBoZWFkZXIgc3RvcmUgdGhlcmUgZm9yIGZ1dHVyZSB1c2UgaW4gdDJfZGVjb2RlX3BhY2tldCAqLworICAgIE9QSl9CWVRFICpwcG1fZGF0YTsKKyAgICAvKiogc2l6ZSBvZiB0aGUgcHBtX2RhdGEqLworICAgIE9QSl9VSU5UMzIgcHBtX2xlbjsKKyAgICAvKiogc2l6ZSBvZiB0aGUgcHBtX2RhdGEqLworICAgIE9QSl9VSU5UMzIgcHBtX2RhdGFfcmVhZDsKIAotCS8qKiBwYWNrZXQgaGVhZGVyIHN0b3JhZ2Ugb3JpZ2luYWwgYnVmZmVyICovCi0JT1BKX0JZVEUgKnBwbV9idWZmZXI7Ci0JLyoqIHBvaW50ZXIgcmVtYWluaW5nIG9uIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBmaXJzdCBoZWFkZXIgaWYgcHBtIGlzIHVzZWQgKi8KLQlPUEpfQllURSAqcHBtX2RhdGFfZmlyc3Q7Ci0JLyoqIE51bWJlciBvZiBieXRlcyBhY3R1YWxseSBzdG9yZWQgaW5zaWRlIHRoZSBwcG1fZGF0YSAqLwotCU9QSl9VSU5UMzIgcHBtX2RhdGFfc2l6ZTsKLQkvKiogdXNlIGluIGNhc2Ugb2YgbXVsdGlwbGUgbWFya2VyIFBQTSAobnVtYmVyIG9mIGluZm8gYWxyZWFkeSBzdG9yZSkgKi8KLQlPUEpfSU5UMzIgcHBtX3N0b3JlOwotCS8qKiB1c2UgaW4gY2FzZSBvZiBtdWx0aXBsZSBtYXJrZXIgUFBNIChjYXNlIG9uIG5vbi1maW5pc2hlZCBwcmV2aW91cyBpbmZvKSAqLwotCU9QSl9JTlQzMiBwcG1fcHJldmlvdXM7CisgICAgT1BKX0JZVEUgKnBwbV9kYXRhX2N1cnJlbnQ7CiAKLQkvKiogdGlsZSBjb2RpbmcgcGFyYW1ldGVycyAqLwotCW9wal90Y3BfdCAqdGNwczsKKyAgICAvKiogcGFja2V0IGhlYWRlciBzdG9yYWdlIG9yaWdpbmFsIGJ1ZmZlciAqLworICAgIE9QSl9CWVRFICpwcG1fYnVmZmVyOworICAgIC8qKiBwb2ludGVyIHJlbWFpbmluZyBvbiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZmlyc3QgaGVhZGVyIGlmIHBwbSBpcyB1c2VkICovCisgICAgT1BKX0JZVEUgKnBwbV9kYXRhX2ZpcnN0OworICAgIC8qKiBOdW1iZXIgb2YgYnl0ZXMgYWN0dWFsbHkgc3RvcmVkIGluc2lkZSB0aGUgcHBtX2RhdGEgKi8KKyAgICBPUEpfVUlOVDMyIHBwbV9kYXRhX3NpemU7CisgICAgLyoqIHVzZSBpbiBjYXNlIG9mIG11bHRpcGxlIG1hcmtlciBQUE0gKG51bWJlciBvZiBpbmZvIGFscmVhZHkgc3RvcmUpICovCisgICAgT1BKX0lOVDMyIHBwbV9zdG9yZTsKKyAgICAvKiogdXNlIGluIGNhc2Ugb2YgbXVsdGlwbGUgbWFya2VyIFBQTSAoY2FzZSBvbiBub24tZmluaXNoZWQgcHJldmlvdXMgaW5mbykgKi8KKyAgICBPUEpfSU5UMzIgcHBtX3ByZXZpb3VzOwogCi0JdW5pb24KLQl7Ci0JCW9wal9kZWNvZGluZ19wYXJhbV90IG1fZGVjOwotCQlvcGpfZW5jb2RpbmdfcGFyYW1fdCBtX2VuYzsKLQl9Ci0JbV9zcGVjaWZpY19wYXJhbTsKKyAgICAvKiogdGlsZSBjb2RpbmcgcGFyYW1ldGVycyAqLworICAgIG9wal90Y3BfdCAqdGNwczsKKworICAgIHVuaW9uIHsKKyAgICAgICAgb3BqX2RlY29kaW5nX3BhcmFtX3QgbV9kZWM7CisgICAgICAgIG9wal9lbmNvZGluZ19wYXJhbV90IG1fZW5jOworICAgIH0KKyAgICBtX3NwZWNpZmljX3BhcmFtOwogCiAKLS8qIFVuaVBHPj4gKi8KKyAgICAvKiBVbmlQRz4+ICovCiAjaWZkZWYgVVNFX0pQV0wKLQkvKiogZW5hYmxlcyB3cml0aW5nIG9mIEVQQyBpbiBNSCwgdGh1cyBhY3RpdmF0aW5nIEpQV0wgKi8KLQlPUEpfQk9PTCBlcGNfb247Ci0JLyoqIGVuYWJsZXMgd3JpdGluZyBvZiBFUEIsIGluIGNhc2Ugb2YgYWN0aXZhdGVkIEpQV0wgKi8KLQlPUEpfQk9PTCBlcGJfb247Ci0JLyoqIGVuYWJsZXMgd3JpdGluZyBvZiBFU0QsIGluIGNhc2Ugb2YgYWN0aXZhdGVkIEpQV0wgKi8KLQlPUEpfQk9PTCBlc2Rfb247Ci0JLyoqIGVuYWJsZXMgd3JpdGluZyBvZiBpbmZvcm1hdGl2ZSB0ZWNobmlxdWVzIG9mIEVTRCwgaW4gY2FzZSBvZiBhY3RpdmF0ZWQgSlBXTCAqLwotCU9QSl9CT09MIGluZm9fb247Ci0JLyoqIGVuYWJsZXMgd3JpdGluZyBvZiBSRUQsIGluIGNhc2Ugb2YgYWN0aXZhdGVkIEpQV0wgKi8KLQlPUEpfQk9PTCByZWRfb247Ci0JLyoqIGVycm9yIHByb3RlY3Rpb24gbWV0aG9kIGZvciBNSCAoMCwxLDE2LDMyLDM3LTEyOCkgKi8KLQlpbnQgaHByb3RfTUg7Ci0JLyoqIHRpbGUgbnVtYmVyIG9mIGhlYWRlciBwcm90ZWN0aW9uIHNwZWNpZmljYXRpb24gKD49MCkgKi8KLQlpbnQgaHByb3RfVFBIX3RpbGVub1tKUFdMX01BWF9OT19USUxFU1BFQ1NdOwotCS8qKiBlcnJvciBwcm90ZWN0aW9uIG1ldGhvZHMgZm9yIFRQSHMgKDAsMSwxNiwzMiwzNy0xMjgpICovCi0JaW50IGhwcm90X1RQSFtKUFdMX01BWF9OT19USUxFU1BFQ1NdOwotCS8qKiB0aWxlIG51bWJlciBvZiBwYWNrZXQgcHJvdGVjdGlvbiBzcGVjaWZpY2F0aW9uICg+PTApICovCi0JaW50IHBwcm90X3RpbGVub1tKUFdMX01BWF9OT19QQUNLU1BFQ1NdOwotCS8qKiBwYWNrZXQgbnVtYmVyIG9mIHBhY2tldCBwcm90ZWN0aW9uIHNwZWNpZmljYXRpb24gKD49MCkgKi8KLQlpbnQgcHByb3RfcGFja25vW0pQV0xfTUFYX05PX1BBQ0tTUEVDU107Ci0JLyoqIGVycm9yIHByb3RlY3Rpb24gbWV0aG9kcyBmb3IgcGFja2V0cyAoMCwxLDE2LDMyLDM3LTEyOCkgKi8KLQlpbnQgcHByb3RbSlBXTF9NQVhfTk9fUEFDS1NQRUNTXTsKLQkvKiogZW5hYmxlcyB3cml0aW5nIG9mIEVTRCwgKDAvMi80IGJ5dGVzKSAqLwotCWludCBzZW5zX3NpemU7Ci0JLyoqIHNlbnNpdGl2aXR5IGFkZHJlc3Npbmcgc2l6ZSAoMD1hdXRvLzIvNCBieXRlcykgKi8KLQlpbnQgc2Vuc19hZGRyOwotCS8qKiBzZW5zaXRpdml0eSByYW5nZSAoMC0zKSAqLwotCWludCBzZW5zX3JhbmdlOwotCS8qKiBzZW5zaXRpdml0eSBtZXRob2QgZm9yIE1IICgtMSwwLTcpICovCi0JaW50IHNlbnNfTUg7Ci0JLyoqIHRpbGUgbnVtYmVyIG9mIHNlbnNpdGl2aXR5IHNwZWNpZmljYXRpb24gKD49MCkgKi8KLQlpbnQgc2Vuc19UUEhfdGlsZW5vW0pQV0xfTUFYX05PX1RJTEVTUEVDU107Ci0JLyoqIHNlbnNpdGl2aXR5IG1ldGhvZHMgZm9yIFRQSHMgKC0xLDAtNykgKi8KLQlpbnQgc2Vuc19UUEhbSlBXTF9NQVhfTk9fVElMRVNQRUNTXTsKLQkvKiogZW5hYmxlcyBKUFdMIGNvcnJlY3Rpb24gYXQgdGhlIGRlY29kZXIgKi8KLQlPUEpfQk9PTCBjb3JyZWN0OwotCS8qKiBleHBlY3RlZCBudW1iZXIgb2YgY29tcG9uZW50cyBhdCB0aGUgZGVjb2RlciAqLwotCWludCBleHBfY29tcHM7Ci0JLyoqIG1heGltdW0gbnVtYmVyIG9mIHRpbGVzIGF0IHRoZSBkZWNvZGVyICovCi0JT1BKX1VJTlQzMiBtYXhfdGlsZXM7CisgICAgLyoqIGVuYWJsZXMgd3JpdGluZyBvZiBFUEMgaW4gTUgsIHRodXMgYWN0aXZhdGluZyBKUFdMICovCisgICAgT1BKX0JPT0wgZXBjX29uOworICAgIC8qKiBlbmFibGVzIHdyaXRpbmcgb2YgRVBCLCBpbiBjYXNlIG9mIGFjdGl2YXRlZCBKUFdMICovCisgICAgT1BKX0JPT0wgZXBiX29uOworICAgIC8qKiBlbmFibGVzIHdyaXRpbmcgb2YgRVNELCBpbiBjYXNlIG9mIGFjdGl2YXRlZCBKUFdMICovCisgICAgT1BKX0JPT0wgZXNkX29uOworICAgIC8qKiBlbmFibGVzIHdyaXRpbmcgb2YgaW5mb3JtYXRpdmUgdGVjaG5pcXVlcyBvZiBFU0QsIGluIGNhc2Ugb2YgYWN0aXZhdGVkIEpQV0wgKi8KKyAgICBPUEpfQk9PTCBpbmZvX29uOworICAgIC8qKiBlbmFibGVzIHdyaXRpbmcgb2YgUkVELCBpbiBjYXNlIG9mIGFjdGl2YXRlZCBKUFdMICovCisgICAgT1BKX0JPT0wgcmVkX29uOworICAgIC8qKiBlcnJvciBwcm90ZWN0aW9uIG1ldGhvZCBmb3IgTUggKDAsMSwxNiwzMiwzNy0xMjgpICovCisgICAgaW50IGhwcm90X01IOworICAgIC8qKiB0aWxlIG51bWJlciBvZiBoZWFkZXIgcHJvdGVjdGlvbiBzcGVjaWZpY2F0aW9uICg+PTApICovCisgICAgaW50IGhwcm90X1RQSF90aWxlbm9bSlBXTF9NQVhfTk9fVElMRVNQRUNTXTsKKyAgICAvKiogZXJyb3IgcHJvdGVjdGlvbiBtZXRob2RzIGZvciBUUEhzICgwLDEsMTYsMzIsMzctMTI4KSAqLworICAgIGludCBocHJvdF9UUEhbSlBXTF9NQVhfTk9fVElMRVNQRUNTXTsKKyAgICAvKiogdGlsZSBudW1iZXIgb2YgcGFja2V0IHByb3RlY3Rpb24gc3BlY2lmaWNhdGlvbiAoPj0wKSAqLworICAgIGludCBwcHJvdF90aWxlbm9bSlBXTF9NQVhfTk9fUEFDS1NQRUNTXTsKKyAgICAvKiogcGFja2V0IG51bWJlciBvZiBwYWNrZXQgcHJvdGVjdGlvbiBzcGVjaWZpY2F0aW9uICg+PTApICovCisgICAgaW50IHBwcm90X3BhY2tub1tKUFdMX01BWF9OT19QQUNLU1BFQ1NdOworICAgIC8qKiBlcnJvciBwcm90ZWN0aW9uIG1ldGhvZHMgZm9yIHBhY2tldHMgKDAsMSwxNiwzMiwzNy0xMjgpICovCisgICAgaW50IHBwcm90W0pQV0xfTUFYX05PX1BBQ0tTUEVDU107CisgICAgLyoqIGVuYWJsZXMgd3JpdGluZyBvZiBFU0QsICgwLzIvNCBieXRlcykgKi8KKyAgICBpbnQgc2Vuc19zaXplOworICAgIC8qKiBzZW5zaXRpdml0eSBhZGRyZXNzaW5nIHNpemUgKDA9YXV0by8yLzQgYnl0ZXMpICovCisgICAgaW50IHNlbnNfYWRkcjsKKyAgICAvKiogc2Vuc2l0aXZpdHkgcmFuZ2UgKDAtMykgKi8KKyAgICBpbnQgc2Vuc19yYW5nZTsKKyAgICAvKiogc2Vuc2l0aXZpdHkgbWV0aG9kIGZvciBNSCAoLTEsMC03KSAqLworICAgIGludCBzZW5zX01IOworICAgIC8qKiB0aWxlIG51bWJlciBvZiBzZW5zaXRpdml0eSBzcGVjaWZpY2F0aW9uICg+PTApICovCisgICAgaW50IHNlbnNfVFBIX3RpbGVub1tKUFdMX01BWF9OT19USUxFU1BFQ1NdOworICAgIC8qKiBzZW5zaXRpdml0eSBtZXRob2RzIGZvciBUUEhzICgtMSwwLTcpICovCisgICAgaW50IHNlbnNfVFBIW0pQV0xfTUFYX05PX1RJTEVTUEVDU107CisgICAgLyoqIGVuYWJsZXMgSlBXTCBjb3JyZWN0aW9uIGF0IHRoZSBkZWNvZGVyICovCisgICAgT1BKX0JPT0wgY29ycmVjdDsKKyAgICAvKiogZXhwZWN0ZWQgbnVtYmVyIG9mIGNvbXBvbmVudHMgYXQgdGhlIGRlY29kZXIgKi8KKyAgICBpbnQgZXhwX2NvbXBzOworICAgIC8qKiBtYXhpbXVtIG51bWJlciBvZiB0aWxlcyBhdCB0aGUgZGVjb2RlciAqLworICAgIE9QSl9VSU5UMzIgbWF4X3RpbGVzOwogI2VuZGlmIC8qIFVTRV9KUFdMICovCiAKLQkvKioqKioqKiogRkxBR1MgKioqKioqKioqLwotCS8qKiBpZiBwcG0gPT0gMSAtLT4gdGhlcmUgd2FzIGEgUFBNIG1hcmtlciovCi0JT1BKX1VJTlQzMiBwcG0gOiAxOwotCS8qKiB0ZWxscyBpZiB0aGUgcGFyYW1ldGVyIGlzIGEgY29kaW5nIG9yIGRlY29kaW5nIG9uZSAqLwotCU9QSl9VSU5UMzIgbV9pc19kZWNvZGVyIDogMTsKLS8qIDw8VW5pUEcgKi8KKyAgICAvKioqKioqKiogRkxBR1MgKioqKioqKioqLworICAgIC8qKiBpZiBwcG0gPT0gMSAtLT4gdGhlcmUgd2FzIGEgUFBNIG1hcmtlciovCisgICAgT1BKX0JJVEZJRUxEIHBwbSA6IDE7CisgICAgLyoqIHRlbGxzIGlmIHRoZSBwYXJhbWV0ZXIgaXMgYSBjb2Rpbmcgb3IgZGVjb2Rpbmcgb25lICovCisgICAgT1BKX0JJVEZJRUxEIG1faXNfZGVjb2RlciA6IDE7CisgICAgLyoqIHdoZXRoZXIgZGlmZmVyZW50IGJpdCBkZXB0aCBvciBzaWduIHBlciBjb21wb25lbnQgaXMgYWxsb3dlZC4gRGVjb2RlciBvbmx5IGZvciBvdyAqLworICAgIE9QSl9CSVRGSUVMRCBhbGxvd19kaWZmZXJlbnRfYml0X2RlcHRoX3NpZ24gOiAxOworICAgIC8qIDw8VW5pUEcgKi8KIH0gb3BqX2NwX3Q7CiAKIAotdHlwZWRlZiBzdHJ1Y3Qgb3BqX2oya19kZWMKLXsKLQkvKiogbG9jYXRlIGluIHdoaWNoIHBhcnQgb2YgdGhlIGNvZGVzdHJlYW0gdGhlIGRlY29kZXIgaXMgKG1haW4gaGVhZGVyLCB0aWxlIGhlYWRlciwgZW5kKSAqLwotCU9QSl9VSU5UMzIgbV9zdGF0ZTsKLQkvKioKLQkgKiBzdG9yZSBkZWNvZGluZyBwYXJhbWV0ZXJzIGNvbW1vbiB0byBhbGwgdGlsZXMgKGluZm9ybWF0aW9uIGxpa2UgQ09ELCBDT0MgaW4gbWFpbiBoZWFkZXIpCi0JICovCi0Jb3BqX3RjcF90ICptX2RlZmF1bHRfdGNwOwotCU9QSl9CWVRFICAqbV9oZWFkZXJfZGF0YTsKLQlPUEpfVUlOVDMyIG1faGVhZGVyX2RhdGFfc2l6ZTsKLQkvKiogdG8gdGVsbCB0aGUgdGlsZSBwYXJ0IGxlbmd0aCAqLwotCU9QSl9VSU5UMzIgbV9zb3RfbGVuZ3RoOwotCS8qKiBPbmx5IHRpbGVzIGluZGV4IGluIHRoZSBjb3JyZWN0IHJhbmdlIHdpbGwgYmUgZGVjb2RlZC4qLwotCU9QSl9VSU5UMzIgbV9zdGFydF90aWxlX3g7Ci0JT1BKX1VJTlQzMiBtX3N0YXJ0X3RpbGVfeTsKLQlPUEpfVUlOVDMyIG1fZW5kX3RpbGVfeDsKLQlPUEpfVUlOVDMyIG1fZW5kX3RpbGVfeTsKLQkvKioKLQkgKiBEZWNvZGVkIGFyZWEgc2V0IGJ5IHRoZSB1c2VyCi0JICovCi0JT1BKX1VJTlQzMiBtX0RBX3gwOwotCU9QSl9VSU5UMzIgbV9EQV95MDsKLQlPUEpfVUlOVDMyIG1fREFfeDE7Ci0JT1BKX1VJTlQzMiBtX0RBX3kxOwordHlwZWRlZiBzdHJ1Y3Qgb3BqX2oya19kZWMgeworICAgIC8qKiBsb2NhdGUgaW4gd2hpY2ggcGFydCBvZiB0aGUgY29kZXN0cmVhbSB0aGUgZGVjb2RlciBpcyAobWFpbiBoZWFkZXIsIHRpbGUgaGVhZGVyLCBlbmQpICovCisgICAgT1BKX1VJTlQzMiBtX3N0YXRlOworICAgIC8qKgorICAgICAqIHN0b3JlIGRlY29kaW5nIHBhcmFtZXRlcnMgY29tbW9uIHRvIGFsbCB0aWxlcyAoaW5mb3JtYXRpb24gbGlrZSBDT0QsIENPQyBpbiBtYWluIGhlYWRlcikKKyAgICAgKi8KKyAgICBvcGpfdGNwX3QgKm1fZGVmYXVsdF90Y3A7CisgICAgT1BKX0JZVEUgICptX2hlYWRlcl9kYXRhOworICAgIE9QSl9VSU5UMzIgbV9oZWFkZXJfZGF0YV9zaXplOworICAgIC8qKiB0byB0ZWxsIHRoZSB0aWxlIHBhcnQgbGVuZ3RoICovCisgICAgT1BKX1VJTlQzMiBtX3NvdF9sZW5ndGg7CisgICAgLyoqIE9ubHkgdGlsZXMgaW5kZXggaW4gdGhlIGNvcnJlY3QgcmFuZ2Ugd2lsbCBiZSBkZWNvZGVkLiovCisgICAgT1BKX1VJTlQzMiBtX3N0YXJ0X3RpbGVfeDsKKyAgICBPUEpfVUlOVDMyIG1fc3RhcnRfdGlsZV95OworICAgIE9QSl9VSU5UMzIgbV9lbmRfdGlsZV94OworICAgIE9QSl9VSU5UMzIgbV9lbmRfdGlsZV95OwogCi0JLyoqIEluZGV4IG9mIHRoZSB0aWxlIHRvIGRlY29kZSAodXNlZCBpbiBnZXRfdGlsZSkgKi8KLQlPUEpfSU5UMzIgbV90aWxlX2luZF90b19kZWM7Ci0JLyoqIFBvc2l0aW9uIG9mIHRoZSBsYXN0IFNPVCBtYXJrZXIgcmVhZCAqLwotCU9QSl9PRkZfVCBtX2xhc3Rfc290X3JlYWRfcG9zOworICAgIC8qKiBJbmRleCBvZiB0aGUgdGlsZSB0byBkZWNvZGUgKHVzZWQgaW4gZ2V0X3RpbGUpICovCisgICAgT1BKX0lOVDMyIG1fdGlsZV9pbmRfdG9fZGVjOworICAgIC8qKiBQb3NpdGlvbiBvZiB0aGUgbGFzdCBTT1QgbWFya2VyIHJlYWQgKi8KKyAgICBPUEpfT0ZGX1QgbV9sYXN0X3NvdF9yZWFkX3BvczsKIAotCS8qKgotCSAqIEluZGljYXRlIHRoYXQgdGhlIGN1cnJlbnQgdGlsZS1wYXJ0IGlzIGFzc3VtZSBhcyB0aGUgbGFzdCB0aWxlIHBhcnQgb2YgdGhlIGNvZGVzdHJlYW0uCi0JICogSXQgaXMgdXNlZnVsIGluIHRoZSBjYXNlIG9mIFBTb3QgaXMgZXF1YWwgdG8gemVyby4gVGhlIHNvdCBsZW5ndGggd2lsbCBiZSBjb21wdXRlIGluIHRoZQotCSAqIFNPRCByZWFkZXIgZnVuY3Rpb24uIEZJWE1FIE5PVCBVU0VEIGZvciB0aGUgbW9tZW50Ci0JICovCi0JT1BKX0JPT0wgICBtX2xhc3RfdGlsZV9wYXJ0OwotCS8qKiB0byB0ZWxsIHRoYXQgYSB0aWxlIGNhbiBiZSBkZWNvZGVkLiAqLwotCU9QSl9VSU5UMzIgbV9jYW5fZGVjb2RlCQkJOiAxOwotCU9QSl9VSU5UMzIgbV9kaXNjYXJkX3RpbGVzCQk6IDE7Ci0JT1BKX1VJTlQzMiBtX3NraXBfZGF0YQkJCTogMTsKLQkvKiogVE5zb3QgY29ycmVjdGlvbiA6IHNlZSBpc3N1ZSAyNTQgKiovCi0JT1BKX1VJTlQzMiBtX25iX3RpbGVfcGFydHNfY29ycmVjdGlvbl9jaGVja2VkIDogMTsKLQlPUEpfVUlOVDMyIG1fbmJfdGlsZV9wYXJ0c19jb3JyZWN0aW9uIDogMTsKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZSB0aGF0IHRoZSBjdXJyZW50IHRpbGUtcGFydCBpcyBhc3N1bWUgYXMgdGhlIGxhc3QgdGlsZSBwYXJ0IG9mIHRoZSBjb2Rlc3RyZWFtLgorICAgICAqIEl0IGlzIHVzZWZ1bCBpbiB0aGUgY2FzZSBvZiBQU290IGlzIGVxdWFsIHRvIHplcm8uIFRoZSBzb3QgbGVuZ3RoIHdpbGwgYmUgY29tcHV0ZSBpbiB0aGUKKyAgICAgKiBTT0QgcmVhZGVyIGZ1bmN0aW9uLiBGSVhNRSBOT1QgVVNFRCBmb3IgdGhlIG1vbWVudAorICAgICAqLworICAgIE9QSl9CT09MICAgbV9sYXN0X3RpbGVfcGFydDsKKworICAgIE9QSl9VSU5UMzIgICBtX251bWNvbXBzX3RvX2RlY29kZTsKKyAgICBPUEpfVUlOVDMyICAqbV9jb21wc19pbmRpY2VzX3RvX2RlY29kZTsKKworICAgIC8qKiB0byB0ZWxsIHRoYXQgYSB0aWxlIGNhbiBiZSBkZWNvZGVkLiAqLworICAgIE9QSl9CSVRGSUVMRCBtX2Nhbl9kZWNvZGUgOiAxOworICAgIE9QSl9CSVRGSUVMRCBtX2Rpc2NhcmRfdGlsZXMgOiAxOworICAgIE9QSl9CSVRGSUVMRCBtX3NraXBfZGF0YSA6IDE7CisgICAgLyoqIFROc290IGNvcnJlY3Rpb24gOiBzZWUgaXNzdWUgMjU0ICoqLworICAgIE9QSl9CSVRGSUVMRCBtX25iX3RpbGVfcGFydHNfY29ycmVjdGlvbl9jaGVja2VkIDogMTsKKyAgICBPUEpfQklURklFTEQgbV9uYl90aWxlX3BhcnRzX2NvcnJlY3Rpb24gOiAxOwogCiB9IG9wal9qMmtfZGVjX3Q7CiAKLXR5cGVkZWYgc3RydWN0IG9wal9qMmtfZW5jCi17Ci0JLyoqIFRpbGUgcGFydCBudW1iZXIsIHJlZ2FyZGxlc3Mgb2YgcG9jLCBmb3IgZWFjaCBuZXcgcG9jLCB0cCBpcyByZXNldCB0byAxKi8KLQlPUEpfVUlOVDMyIG1fY3VycmVudF9wb2NfdGlsZV9wYXJ0X251bWJlcjsgLyogdHBfbnVtICovCit0eXBlZGVmIHN0cnVjdCBvcGpfajJrX2VuYyB7CisgICAgLyoqIFRpbGUgcGFydCBudW1iZXIsIHJlZ2FyZGxlc3Mgb2YgcG9jLCBmb3IgZWFjaCBuZXcgcG9jLCB0cCBpcyByZXNldCB0byAxKi8KKyAgICBPUEpfVUlOVDMyIG1fY3VycmVudF9wb2NfdGlsZV9wYXJ0X251bWJlcjsgLyogdHBfbnVtICovCiAKLQkvKiogVGlsZSBwYXJ0IG51bWJlciBjdXJyZW50bHkgY29kaW5nLCB0YWtpbmcgaW50byBhY2NvdW50IFBPQy4gbV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXIgaG9sZHMgdGhlIHRvdGFsIG51bWJlciBvZiB0aWxlIHBhcnRzIHdoaWxlIGVuY29kaW5nIHRoZSBsYXN0IHRpbGUgcGFydC4qLwotCU9QSl9VSU5UMzIgbV9jdXJyZW50X3RpbGVfcGFydF9udW1iZXI7IC8qY3VyX3RwX251bSAqLworICAgIC8qKiBUaWxlIHBhcnQgbnVtYmVyIGN1cnJlbnRseSBjb2RpbmcsIHRha2luZyBpbnRvIGFjY291bnQgUE9DLiBtX2N1cnJlbnRfdGlsZV9wYXJ0X251bWJlciBob2xkcyB0aGUgdG90YWwgbnVtYmVyIG9mIHRpbGUgcGFydHMgd2hpbGUgZW5jb2RpbmcgdGhlIGxhc3QgdGlsZSBwYXJ0LiovCisgICAgT1BKX1VJTlQzMiBtX2N1cnJlbnRfdGlsZV9wYXJ0X251bWJlcjsgLypjdXJfdHBfbnVtICovCiAKLQkvKioKLQlsb2NhdGUgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBUTE0gbWFya2VyCi0JYWZ0ZXIgZW5jb2RpbmcgdGhlIHRpbGVwYXJ0LCBhIGp1bXAgKGluIGoya193cml0ZV9zb2QpIGlzIGRvbmUgdG8gdGhlIFRMTSBtYXJrZXIgdG8gc3RvcmUgdGhlIHZhbHVlIG9mIGl0cyBsZW5ndGguCi0JKi8KKyAgICAvKioKKyAgICBsb2NhdGUgdGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBUTE0gbWFya2VyCisgICAgYWZ0ZXIgZW5jb2RpbmcgdGhlIHRpbGVwYXJ0LCBhIGp1bXAgKGluIGoya193cml0ZV9zb2QpIGlzIGRvbmUgdG8gdGhlIFRMTSBtYXJrZXIgdG8gc3RvcmUgdGhlIHZhbHVlIG9mIGl0cyBsZW5ndGguCisgICAgKi8KICAgICBPUEpfT0ZGX1QgbV90bG1fc3RhcnQ7Ci0JLyoqCi0JICogU3RvcmVzIHRoZSBzaXplcyBvZiB0aGUgdGxtLgotCSAqLwotCU9QSl9CWVRFICogbV90bG1fc290X29mZnNldHNfYnVmZmVyOwotCS8qKgotCSAqIFRoZSBjdXJyZW50IG9mZnNldCBvZiB0aGUgdGxtIGJ1ZmZlci4KLQkgKi8KLQlPUEpfQllURSAqIG1fdGxtX3NvdF9vZmZzZXRzX2N1cnJlbnQ7CisgICAgLyoqCisgICAgICogU3RvcmVzIHRoZSBzaXplcyBvZiB0aGUgdGxtLgorICAgICAqLworICAgIE9QSl9CWVRFICogbV90bG1fc290X29mZnNldHNfYnVmZmVyOworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IG9mZnNldCBvZiB0aGUgdGxtIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBPUEpfQllURSAqIG1fdGxtX3NvdF9vZmZzZXRzX2N1cnJlbnQ7CiAKLQkvKiogVG90YWwgbnVtIG9mIHRpbGUgcGFydHMgaW4gd2hvbGUgaW1hZ2UgPSBudW0gdGlsZXMqIG51bSB0aWxlcGFydHMgaW4gZWFjaCB0aWxlKi8KLQkvKiogdXNlZCBpbiBUTE1tYXJrZXIqLwotCU9QSl9VSU5UMzIgbV90b3RhbF90aWxlX3BhcnRzOwkgLyogdG90bnVtX3RwICovCisgICAgLyoqIFRvdGFsIG51bSBvZiB0aWxlIHBhcnRzIGluIHdob2xlIGltYWdlID0gbnVtIHRpbGVzKiBudW0gdGlsZXBhcnRzIGluIGVhY2ggdGlsZSovCisgICAgLyoqIHVzZWQgaW4gVExNbWFya2VyKi8KKyAgICBPUEpfVUlOVDMyIG1fdG90YWxfdGlsZV9wYXJ0czsgICAvKiB0b3RudW1fdHAgKi8KIAotCS8qIGVuY29kZWQgZGF0YSBmb3IgYSB0aWxlICovCi0JT1BKX0JZVEUgKiBtX2VuY29kZWRfdGlsZV9kYXRhOworICAgIC8qIGVuY29kZWQgZGF0YSBmb3IgYSB0aWxlICovCisgICAgT1BKX0JZVEUgKiBtX2VuY29kZWRfdGlsZV9kYXRhOwogCi0JLyogc2l6ZSBvZiB0aGUgZW5jb2RlZF9kYXRhICovCi0JT1BKX1VJTlQzMiBtX2VuY29kZWRfdGlsZV9zaXplOworICAgIC8qIHNpemUgb2YgdGhlIGVuY29kZWRfZGF0YSAqLworICAgIE9QSl9VSU5UMzIgbV9lbmNvZGVkX3RpbGVfc2l6ZTsKIAotCS8qIGVuY29kZWQgZGF0YSBmb3IgYSB0aWxlICovCi0JT1BKX0JZVEUgKiBtX2hlYWRlcl90aWxlX2RhdGE7CisgICAgLyogZW5jb2RlZCBkYXRhIGZvciBhIHRpbGUgKi8KKyAgICBPUEpfQllURSAqIG1faGVhZGVyX3RpbGVfZGF0YTsKIAotCS8qIHNpemUgb2YgdGhlIGVuY29kZWRfZGF0YSAqLwotCU9QSl9VSU5UMzIgbV9oZWFkZXJfdGlsZV9kYXRhX3NpemU7CisgICAgLyogc2l6ZSBvZiB0aGUgZW5jb2RlZF9kYXRhICovCisgICAgT1BKX1VJTlQzMiBtX2hlYWRlcl90aWxlX2RhdGFfc2l6ZTsKIAogCiB9IG9wal9qMmtfZW5jX3Q7CkBAIC01NTMsNDIgKzU0Miw1MSBAQAogLyoqCiBKUEVHLTIwMDAgY29kZXN0cmVhbSByZWFkZXIvd3JpdGVyCiAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX2oyawotewotCS8qIEoySyBjb2Rlc3RyZWFtIGlzIGRlY29kZWQqLwotCU9QSl9CT09MIG1faXNfZGVjb2RlcjsKK3R5cGVkZWYgc3RydWN0IG9wal9qMmsgeworICAgIC8qIEoySyBjb2Rlc3RyZWFtIGlzIGRlY29kZWQqLworICAgIE9QSl9CT09MIG1faXNfZGVjb2RlcjsKIAotCS8qIEZJWE1FIERPQyovCi0JdW5pb24KLQl7Ci0JCW9wal9qMmtfZGVjX3QgbV9kZWNvZGVyOwotCQlvcGpfajJrX2VuY190IG1fZW5jb2RlcjsKLQl9Ci0JbV9zcGVjaWZpY19wYXJhbTsKKyAgICAvKiBGSVhNRSBET0MqLworICAgIHVuaW9uIHsKKyAgICAgICAgb3BqX2oya19kZWNfdCBtX2RlY29kZXI7CisgICAgICAgIG9wal9qMmtfZW5jX3QgbV9lbmNvZGVyOworICAgIH0KKyAgICBtX3NwZWNpZmljX3BhcmFtOwogCi0JLyoqIHBvaW50ZXIgdG8gdGhlIGludGVybmFsL3ByaXZhdGUgZW5jb2RlZCAvIGRlY29kZWQgaW1hZ2UgKi8KLQlvcGpfaW1hZ2VfdCogbV9wcml2YXRlX2ltYWdlOworICAgIC8qKiBwb2ludGVyIHRvIHRoZSBpbnRlcm5hbC9wcml2YXRlIGVuY29kZWQgLyBkZWNvZGVkIGltYWdlICovCisgICAgb3BqX2ltYWdlX3QqIG1fcHJpdmF0ZV9pbWFnZTsKIAotCS8qIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBpbWFnZSAoZGVjb2RlZCkqLwotCW9wal9pbWFnZV90KiBtX291dHB1dF9pbWFnZTsKKyAgICAvKiBwb2ludGVyIHRvIHRoZSBvdXRwdXQgaW1hZ2UgKGRlY29kZWQpKi8KKyAgICBvcGpfaW1hZ2VfdCogbV9vdXRwdXRfaW1hZ2U7CiAKLQkvKiogQ29kaW5nIHBhcmFtZXRlcnMgKi8KLQlvcGpfY3BfdCBtX2NwOworICAgIC8qKiBDb2RpbmcgcGFyYW1ldGVycyAqLworICAgIG9wal9jcF90IG1fY3A7CiAKLQkvKiogdGhlIGxpc3Qgb2YgcHJvY2VkdXJlcyB0byBleGVjICoqLwotCW9wal9wcm9jZWR1cmVfbGlzdF90ICoJbV9wcm9jZWR1cmVfbGlzdDsKKyAgICAvKiogdGhlIGxpc3Qgb2YgcHJvY2VkdXJlcyB0byBleGVjICoqLworICAgIG9wal9wcm9jZWR1cmVfbGlzdF90ICogIG1fcHJvY2VkdXJlX2xpc3Q7CiAKLQkvKiogdGhlIGxpc3Qgb2YgdmFsaWRhdGlvbiBwcm9jZWR1cmVzIHRvIGZvbGxvdyB0byBtYWtlIHN1cmUgdGhlIGNvZGUgaXMgdmFsaWQgKiovCi0Jb3BqX3Byb2NlZHVyZV9saXN0X3QgKgltX3ZhbGlkYXRpb25fbGlzdDsKKyAgICAvKiogdGhlIGxpc3Qgb2YgdmFsaWRhdGlvbiBwcm9jZWR1cmVzIHRvIGZvbGxvdyB0byBtYWtlIHN1cmUgdGhlIGNvZGUgaXMgdmFsaWQgKiovCisgICAgb3BqX3Byb2NlZHVyZV9saXN0X3QgKiAgbV92YWxpZGF0aW9uX2xpc3Q7CiAKLQkvKiogaGVscGVyIHVzZWQgdG8gd3JpdGUgdGhlIGluZGV4IGZpbGUgKi8KLQlvcGpfY29kZXN0cmVhbV9pbmRleF90ICpjc3RyX2luZGV4OworICAgIC8qKiBoZWxwZXIgdXNlZCB0byB3cml0ZSB0aGUgaW5kZXggZmlsZSAqLworICAgIG9wal9jb2Rlc3RyZWFtX2luZGV4X3QgKmNzdHJfaW5kZXg7CiAKLQkvKiogbnVtYmVyIG9mIHRoZSB0aWxlIGN1cmVudGx5IGNvbmNlcm4gYnkgY29kaW5nL2RlY29kaW5nICovCi0JT1BKX1VJTlQzMiBtX2N1cnJlbnRfdGlsZV9udW1iZXI7CisgICAgLyoqIG51bWJlciBvZiB0aGUgdGlsZSBjdXJyZW50bHkgY29uY2VybiBieSBjb2RpbmcvZGVjb2RpbmcgKi8KKyAgICBPUEpfVUlOVDMyIG1fY3VycmVudF90aWxlX251bWJlcjsKIAotCS8qKiB0aGUgY3VycmVudCB0aWxlIGNvZGVyL2RlY29kZXIgKiovCi0Jc3RydWN0IG9wal90Y2QgKgltX3RjZDsKKyAgICAvKiogdGhlIGN1cnJlbnQgdGlsZSBjb2Rlci9kZWNvZGVyICoqLworICAgIHN0cnVjdCBvcGpfdGNkICogICAgbV90Y2Q7CisKKyAgICAvKiogTnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlICovCisgICAgaW50IG1fbnVtX3RocmVhZHM7CisKKyAgICAvKiogVGhyZWFkIHBvb2wgKi8KKyAgICBvcGpfdGhyZWFkX3Bvb2xfdCogbV90cDsKKworICAgIE9QSl9VSU5UMzIgaWhkcl93OworICAgIE9QSl9VSU5UMzIgaWhkcl9oOworICAgIE9QSl9VSU5UMzIgZW51bWNzOworICAgIHVuc2lnbmVkIGludCBkdW1wX3N0YXRlOwogfQogb3BqX2oya190OwogCkBAIC02MDEsMTIgKzU5OSwxNCBAQAogCiAvKioKIFNldHVwIHRoZSBkZWNvZGVyIGRlY29kaW5nIHBhcmFtZXRlcnMgdXNpbmcgdXNlciBwYXJhbWV0ZXJzLgotRGVjb2RpbmcgcGFyYW1ldGVycyBhcmUgcmV0dXJuZWQgaW4gajJrLT5jcC4gCitEZWNvZGluZyBwYXJhbWV0ZXJzIGFyZSByZXR1cm5lZCBpbiBqMmstPmNwLgogQHBhcmFtIGoyayBKMksgZGVjb21wcmVzc29yIGhhbmRsZQogQHBhcmFtIHBhcmFtZXRlcnMgZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzCiAqLwogdm9pZCBvcGpfajJrX3NldHVwX2RlY29kZXIob3BqX2oya190ICpqMmssIG9wal9kcGFyYW1ldGVyc190ICpwYXJhbWV0ZXJzKTsKIAorT1BKX0JPT0wgb3BqX2oya19zZXRfdGhyZWFkcyhvcGpfajJrX3QgKmoyaywgT1BKX1VJTlQzMiBudW1fdGhyZWFkcyk7CisKIC8qKgogICogQ3JlYXRlcyBhIEoySyBjb21wcmVzc2lvbiBzdHJ1Y3R1cmUKICAqCkBAIC02MTUsMTUgKzYxNSwxNSBAQAogb3BqX2oya190KiBvcGpfajJrX2NyZWF0ZV9jb21wcmVzcyh2b2lkKTsKIAogCi1PUEpfQk9PTCBvcGpfajJrX3NldHVwX2VuY29kZXIoCW9wal9qMmtfdCAqcF9qMmssCi0JCQkJCQkgICAgb3BqX2NwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMsCi0JCQkJCQkgICAgb3BqX2ltYWdlX3QgKmltYWdlLAotCQkJCQkJICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CitPUEpfQk9PTCBvcGpfajJrX3NldHVwX2VuY29kZXIob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY3BhcmFtZXRlcnNfdCAqcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiBDb252ZXJ0cyBhbiBlbnVtIHR5cGUgcHJvZ3Jlc3Npb24gb3JkZXIgdG8gc3RyaW5nIHR5cGUKICovCi1jaGFyICpvcGpfajJrX2NvbnZlcnRfcHJvZ3Jlc3Npb25fb3JkZXIoT1BKX1BST0dfT1JERVIgcHJnX29yZGVyKTsKK2NvbnN0IGNoYXIgKm9wal9qMmtfY29udmVydF9wcm9ncmVzc2lvbl9vcmRlcihPUEpfUFJPR19PUkRFUiBwcmdfb3JkZXIpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLypAfSovCkBAIC02NDgsODcgKzY0OCwxMDIgQEAKICAqCiAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGJveCBpcyB2YWxpZC4KICAqLwotT1BKX0JPT0wgb3BqX2oya19yZWFkX2hlYWRlcigJb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfajJrX3QqIHBfajJrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCoqIHBfaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCogcF9tYW5hZ2VyICk7CitPUEpfQk9PTCBvcGpfajJrX3JlYWRfaGVhZGVyKG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2oya190KiBwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QqKiBwX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QqIHBfbWFuYWdlcik7CiAKIAogLyoqCiAgKiBEZXN0cm95cyBhIGpwZWcyMDAwIGNvZGVjLgogICoKLSAqIEBwYXJhbQlwX2oyawl0aGUganBlZzIwMDAwIHN0cnVjdHVyZSB0byBkZXN0cm95LgorICogQHBhcmFtICAgcF9qMmsgICB0aGUganBlZzIwMDAwIHN0cnVjdHVyZSB0byBkZXN0cm95LgogICovCi12b2lkIG9wal9qMmtfZGVzdHJveSAob3BqX2oya190ICpwX2oyayk7Cit2b2lkIG9wal9qMmtfZGVzdHJveShvcGpfajJrX3QgKnBfajJrKTsKIAogLyoqCiAgKiBEZXN0cm95cyBhIGNvZGVzdHJlYW0gaW5kZXggc3RydWN0dXJlLgogICoKLSAqIEBwYXJhbQlwX2NzdHJfaW5kCXRoZSBjb2Rlc3RyZWFtIGluZGV4IHBhcmFtZXRlciB0byBkZXN0cm95LgorICogQHBhcmFtICAgcF9jc3RyX2luZCAgdGhlIGNvZGVzdHJlYW0gaW5kZXggcGFyYW1ldGVyIHRvIGRlc3Ryb3kuCiAgKi8KLXZvaWQgajJrX2Rlc3Ryb3lfY3N0cl9pbmRleCAob3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqcF9jc3RyX2luZCk7Cit2b2lkIGoya19kZXN0cm95X2NzdHJfaW5kZXgob3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqcF9jc3RyX2luZCk7CiAKIC8qKgogICogRGVjb2RlIHRpbGUgZGF0YS4KLSAqIEBwYXJhbQlwX2oyawkJdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtCXBfdGlsZV9pbmRleAorICogQHBhcmFtICAgcF9qMmsgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtICAgcF90aWxlX2luZGV4CiAgKiBAcGFyYW0gcF9kYXRhICAgICAgIEZJWE1FIERPQwogICogQHBhcmFtIHBfZGF0YV9zaXplICBGSVhNRSBET0MKLSAqIEBwYXJhbQlwX3N0cmVhbQkJCXRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbQlwX21hbmFnZXIJdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqIEBwYXJhbSAgIHBfc3RyZWFtICAgICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtICAgcF9tYW5hZ2VyICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICAqLwotT1BKX0JPT0wgb3BqX2oya19kZWNvZGVfdGlsZSAoICBvcGpfajJrX3QgKiBwX2oyaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworT1BKX0JPT0wgb3BqX2oya19kZWNvZGVfdGlsZShvcGpfajJrX3QgKiBwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogUmVhZHMgYSB0aWxlIGhlYWRlci4KLSAqIEBwYXJhbQlwX2oyawkJdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtCXBfdGlsZV9pbmRleCBGSVhNRSBET0MKLSAqIEBwYXJhbQlwX2RhdGFfc2l6ZSBGSVhNRSBET0MKLSAqIEBwYXJhbQlwX3RpbGVfeDAgRklYTUUgRE9DCi0gKiBAcGFyYW0JcF90aWxlX3kwIEZJWE1FIERPQwotICogQHBhcmFtCXBfdGlsZV94MSBGSVhNRSBET0MKLSAqIEBwYXJhbQlwX3RpbGVfeTEgRklYTUUgRE9DCi0gKiBAcGFyYW0JcF9uYl9jb21wcyBGSVhNRSBET0MKLSAqIEBwYXJhbQlwX2dvX29uIEZJWE1FIERPQwotICogQHBhcmFtCXBfc3RyZWFtCQkJdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgotICogQHBhcmFtCXBfbWFuYWdlcgl0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorICogQHBhcmFtICAgcF9qMmsgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtICAgcF90aWxlX2luZGV4IEZJWE1FIERPQworICogQHBhcmFtICAgcF9kYXRhX3NpemUgRklYTUUgRE9DCisgKiBAcGFyYW0gICBwX3RpbGVfeDAgRklYTUUgRE9DCisgKiBAcGFyYW0gICBwX3RpbGVfeTAgRklYTUUgRE9DCisgKiBAcGFyYW0gICBwX3RpbGVfeDEgRklYTUUgRE9DCisgKiBAcGFyYW0gICBwX3RpbGVfeTEgRklYTUUgRE9DCisgKiBAcGFyYW0gICBwX25iX2NvbXBzIEZJWE1FIERPQworICogQHBhcmFtICAgcF9nb19vbiBGSVhNRSBET0MKKyAqIEBwYXJhbSAgIHBfc3RyZWFtICAgICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtICAgcF9tYW5hZ2VyICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICAqLwotT1BKX0JPT0wgb3BqX2oya19yZWFkX3RpbGVfaGVhZGVyICggb3BqX2oya190ICogcF9qMmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF90aWxlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3gwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3kwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3gxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3kxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbmJfY29tcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQk9PTCAqIHBfZ29fb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK09QSl9CT09MIG9wal9qMmtfcmVhZF90aWxlX2hlYWRlcihvcGpfajJrX3QgKiBwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF90aWxlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3RpbGVfeDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3kwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV94MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3RpbGVfeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbmJfY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JPT0wgKiBwX2dvX29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAKKy8qKiBTZXRzIHRoZSBpbmRpY2VzIG9mIHRoZSBjb21wb25lbnRzIHRvIGRlY29kZS4KKyAqCisgKiBAcGFyYW0gcF9qMmsgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gbnVtY29tcHMgICAgICBOdW1iZXIgb2YgY29tcG9uZW50cyB0byBkZWNvZGUuCisgKiBAcGFyYW0gY29tcHNfaW5kaWNlcyBBcnJheSBvZiBudW1fY29tcHRzIGluZGljZXMgKG51bWJlcmluZyBzdGFydGluZyBhdCAwKQorICogICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgY29tcG9uZW50cyB0byBkZWNvZGUuCisgKiBAcGFyYW0gcF9tYW5hZ2VyICAgICBFdmVudCBtYW5hZ2VyCisgKgorICogQHJldHVybiBPUEpfVFJVRSBpbiBjYXNlIG9mIHN1Y2Nlc3MuCisgKi8KK09QSl9CT09MIG9wal9qMmtfc2V0X2RlY29kZWRfY29tcG9uZW50cyhvcGpfajJrX3QgKnBfajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbnVtY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1BKX1VJTlQzMiogY29tcHNfaW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworCiAvKioKICAqIFNldHMgdGhlIGdpdmVuIGFyZWEgdG8gYmUgZGVjb2RlZC4gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHJpZ2h0IGFmdGVyIG9wal9yZWFkX2hlYWRlciBhbmQgYmVmb3JlIGFueSB0aWxlIGhlYWRlciByZWFkaW5nLgogICoKLSAqIEBwYXJhbQlwX2oyawkJCXRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqIEBwYXJhbQlwX2ltYWdlICAgICBGSVhNRSBET0MKLSAqIEBwYXJhbQlwX3N0YXJ0X3gJCXRoZSBsZWZ0IHBvc2l0aW9uIG9mIHRoZSByZWN0YW5nbGUgdG8gZGVjb2RlIChpbiBpbWFnZSBjb29yZGluYXRlcykuCi0gKiBAcGFyYW0JcF9zdGFydF95CQl0aGUgdXAgcG9zaXRpb24gb2YgdGhlIHJlY3RhbmdsZSB0byBkZWNvZGUgKGluIGltYWdlIGNvb3JkaW5hdGVzKS4KLSAqIEBwYXJhbQlwX2VuZF94CQkJdGhlIHJpZ2h0IHBvc2l0aW9uIG9mIHRoZSByZWN0YW5nbGUgdG8gZGVjb2RlIChpbiBpbWFnZSBjb29yZGluYXRlcykuCi0gKiBAcGFyYW0JcF9lbmRfeQkJCXRoZSBib3R0b20gcG9zaXRpb24gb2YgdGhlIHJlY3RhbmdsZSB0byBkZWNvZGUgKGluIGltYWdlIGNvb3JkaW5hdGVzKS4KLSAqIEBwYXJhbQlwX21hbmFnZXIJCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIKKyAqIEBwYXJhbSAgIHBfajJrICAgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gICBwX2ltYWdlICAgICBGSVhNRSBET0MKKyAqIEBwYXJhbSAgIHBfc3RhcnRfeCAgICAgICB0aGUgbGVmdCBwb3NpdGlvbiBvZiB0aGUgcmVjdGFuZ2xlIHRvIGRlY29kZSAoaW4gaW1hZ2UgY29vcmRpbmF0ZXMpLgorICogQHBhcmFtICAgcF9zdGFydF95ICAgICAgIHRoZSB1cCBwb3NpdGlvbiBvZiB0aGUgcmVjdGFuZ2xlIHRvIGRlY29kZSAoaW4gaW1hZ2UgY29vcmRpbmF0ZXMpLgorICogQHBhcmFtICAgcF9lbmRfeCAgICAgICAgIHRoZSByaWdodCBwb3NpdGlvbiBvZiB0aGUgcmVjdGFuZ2xlIHRvIGRlY29kZSAoaW4gaW1hZ2UgY29vcmRpbmF0ZXMpLgorICogQHBhcmFtICAgcF9lbmRfeSAgICAgICAgIHRoZSBib3R0b20gcG9zaXRpb24gb2YgdGhlIHJlY3RhbmdsZSB0byBkZWNvZGUgKGluIGltYWdlIGNvb3JkaW5hdGVzKS4KKyAqIEBwYXJhbSAgIHBfbWFuYWdlciAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyCiAgKgotICogQHJldHVybgl0cnVlCQkJaWYgdGhlIGFyZWEgY291bGQgYmUgc2V0LgorICogQHJldHVybiAgdHJ1ZSAgICAgICAgICAgIGlmIHRoZSBhcmVhIGNvdWxkIGJlIHNldC4KICAqLwotT1BKX0JPT0wgb3BqX2oya19zZXRfZGVjb2RlX2FyZWEoCW9wal9qMmtfdCAqcF9qMmssCi0JCQkJCQkJCSAgICBvcGpfaW1hZ2VfdCogcF9pbWFnZSwKLQkJCQkJCQkJICAgIE9QSl9JTlQzMiBwX3N0YXJ0X3gsIE9QSl9JTlQzMiBwX3N0YXJ0X3ksCi0JCQkJCQkJCSAgICBPUEpfSU5UMzIgcF9lbmRfeCwgT1BKX0lOVDMyIHBfZW5kX3ksCi0JCQkJCQkJCSAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK09QSl9CT09MIG9wal9qMmtfc2V0X2RlY29kZV9hcmVhKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCogcF9pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3N0YXJ0X3gsIE9QSl9JTlQzMiBwX3N0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF9lbmRfeCwgT1BKX0lOVDMyIHBfZW5kX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIENyZWF0ZXMgYSBKMksgZGVjb21wcmVzc2lvbiBzdHJ1Y3R1cmUuCkBAIC03NDEsNDggKzc1Niw1MCBAQAogLyoqCiAgKiBEdW1wIHNvbWUgZWxlbWVudHMgZnJvbSB0aGUgSjJLIGRlY29tcHJlc3Npb24gc3RydWN0dXJlIC4KICAqCi0gKkBwYXJhbSBwX2oyawkJCQl0aGUganBlZzIwMDAgY29kZWMuCi0gKkBwYXJhbSBmbGFnCQkJCWZsYWcgdG8gZGVzY3JpYmUgd2hhdCBlbG1lbnRzIGFyZSBkdW1wLgotICpAcGFyYW0gb3V0X3N0cmVhbQkJCW91dHB1dCBzdHJlYW0gd2hlcmUgZHVtcCB0aGUgZWxlbWVudHMuCisgKkBwYXJhbSBwX2oyayAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgorICpAcGFyYW0gZmxhZyAgICAgICAgICAgICAgIGZsYWcgdG8gZGVzY3JpYmUgd2hhdCBlbGVtZW50cyBhcmUgZHVtcC4KKyAqQHBhcmFtIG91dF9zdHJlYW0gICAgICAgICBvdXRwdXQgc3RyZWFtIHdoZXJlIGR1bXAgdGhlIGVsZW1lbnRzLgogICoKICovCi12b2lkIGoya19kdW1wIChvcGpfajJrX3QqIHBfajJrLCBPUEpfSU5UMzIgZmxhZywgRklMRSogb3V0X3N0cmVhbSk7Cit2b2lkIGoya19kdW1wKG9wal9qMmtfdCogcF9qMmssIE9QSl9JTlQzMiBmbGFnLCBGSUxFKiBvdXRfc3RyZWFtKTsKIAogCiAKIC8qKgogICogRHVtcCBhbiBpbWFnZSBoZWFkZXIgc3RydWN0dXJlLgogICoKLSAqQHBhcmFtIGltYWdlCQkJdGhlIGltYWdlIGhlYWRlciB0byBkdW1wLgotICpAcGFyYW0gZGV2X2R1bXBfZmxhZwkJZmxhZyB0byBkZXNjcmliZSBpZiB3ZSBhcmUgaW4gdGhlIGNhc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB1c2Ugb3V0c2lkZSBqMmtfZHVtcCBmdW5jdGlvbgotICpAcGFyYW0gb3V0X3N0cmVhbQkJCW91dHB1dCBzdHJlYW0gd2hlcmUgZHVtcCB0aGUgZWxlbWVudHMuCisgKkBwYXJhbSBpbWFnZSAgICAgICAgICB0aGUgaW1hZ2UgaGVhZGVyIHRvIGR1bXAuCisgKkBwYXJhbSBkZXZfZHVtcF9mbGFnICAgICAgZmxhZyB0byBkZXNjcmliZSBpZiB3ZSBhcmUgaW4gdGhlIGNhc2Ugb2YgdGhpcyBmdW5jdGlvbiBpcyB1c2Ugb3V0c2lkZSBqMmtfZHVtcCBmdW5jdGlvbgorICpAcGFyYW0gb3V0X3N0cmVhbSAgICAgICAgIG91dHB1dCBzdHJlYW0gd2hlcmUgZHVtcCB0aGUgZWxlbWVudHMuCiAgKi8KLXZvaWQgajJrX2R1bXBfaW1hZ2VfaGVhZGVyKG9wal9pbWFnZV90KiBpbWFnZSwgT1BKX0JPT0wgZGV2X2R1bXBfZmxhZywgRklMRSogb3V0X3N0cmVhbSk7Cit2b2lkIGoya19kdW1wX2ltYWdlX2hlYWRlcihvcGpfaW1hZ2VfdCogaW1hZ2UsIE9QSl9CT09MIGRldl9kdW1wX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFKiBvdXRfc3RyZWFtKTsKIAogLyoqCiAgKiBEdW1wIGEgY29tcG9uZW50IGltYWdlIGhlYWRlciBzdHJ1Y3R1cmUuCiAgKgotICpAcGFyYW0gY29tcAkJdGhlIGNvbXBvbmVudCBpbWFnZSBoZWFkZXIgdG8gZHVtcC4KLSAqQHBhcmFtIGRldl9kdW1wX2ZsYWcJCWZsYWcgdG8gZGVzY3JpYmUgaWYgd2UgYXJlIGluIHRoZSBjYXNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdXNlIG91dHNpZGUgajJrX2R1bXAgZnVuY3Rpb24KLSAqQHBhcmFtIG91dF9zdHJlYW0JCQlvdXRwdXQgc3RyZWFtIHdoZXJlIGR1bXAgdGhlIGVsZW1lbnRzLgorICpAcGFyYW0gY29tcCAgICAgICB0aGUgY29tcG9uZW50IGltYWdlIGhlYWRlciB0byBkdW1wLgorICpAcGFyYW0gZGV2X2R1bXBfZmxhZyAgICAgIGZsYWcgdG8gZGVzY3JpYmUgaWYgd2UgYXJlIGluIHRoZSBjYXNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgdXNlIG91dHNpZGUgajJrX2R1bXAgZnVuY3Rpb24KKyAqQHBhcmFtIG91dF9zdHJlYW0gICAgICAgICBvdXRwdXQgc3RyZWFtIHdoZXJlIGR1bXAgdGhlIGVsZW1lbnRzLgogICovCi12b2lkIGoya19kdW1wX2ltYWdlX2NvbXBfaGVhZGVyKG9wal9pbWFnZV9jb21wX3QqIGNvbXAsIE9QSl9CT09MIGRldl9kdW1wX2ZsYWcsIEZJTEUqIG91dF9zdHJlYW0pOwordm9pZCBqMmtfZHVtcF9pbWFnZV9jb21wX2hlYWRlcihvcGpfaW1hZ2VfY29tcF90KiBjb21wLCBPUEpfQk9PTCBkZXZfZHVtcF9mbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFKiBvdXRfc3RyZWFtKTsKIAogLyoqCiAgKiBHZXQgdGhlIGNvZGVzdHJlYW0gaW5mbyBmcm9tIGEgSlBFRzIwMDAgY29kZWMuCiAgKgotICpAcGFyYW0JcF9qMmsJCQkJdGhlIGNvbXBvbmVudCBpbWFnZSBoZWFkZXIgdG8gZHVtcC4KKyAqQHBhcmFtICAgIHBfajJrICAgICAgICAgICAgICAgdGhlIGNvbXBvbmVudCBpbWFnZSBoZWFkZXIgdG8gZHVtcC4KICAqCi0gKkByZXR1cm4JdGhlIGNvZGVzdHJlYW0gaW5mb3JtYXRpb24gZXh0cmFjdCBmcm9tIHRoZSBqcGcyMDAwIGNvZGVjCisgKkByZXR1cm4gICB0aGUgY29kZXN0cmVhbSBpbmZvcm1hdGlvbiBleHRyYWN0IGZyb20gdGhlIGpwZzIwMDAgY29kZWMKICAqLwogb3BqX2NvZGVzdHJlYW1faW5mb192Ml90KiBqMmtfZ2V0X2NzdHJfaW5mbyhvcGpfajJrX3QqIHBfajJrKTsKIAogLyoqCiAgKiBHZXQgdGhlIGNvZGVzdHJlYW0gaW5kZXggZnJvbSBhIEpQRUcyMDAwIGNvZGVjLgogICoKLSAqQHBhcmFtCXBfajJrCQkJCXRoZSBjb21wb25lbnQgaW1hZ2UgaGVhZGVyIHRvIGR1bXAuCisgKkBwYXJhbSAgICBwX2oyayAgICAgICAgICAgICAgIHRoZSBjb21wb25lbnQgaW1hZ2UgaGVhZGVyIHRvIGR1bXAuCiAgKgotICpAcmV0dXJuCXRoZSBjb2Rlc3RyZWFtIGluZGV4IGV4dHJhY3QgZnJvbSB0aGUganBnMjAwMCBjb2RlYworICpAcmV0dXJuICAgdGhlIGNvZGVzdHJlYW0gaW5kZXggZXh0cmFjdCBmcm9tIHRoZSBqcGcyMDAwIGNvZGVjCiAgKi8KIG9wal9jb2Rlc3RyZWFtX2luZGV4X3QqIGoya19nZXRfY3N0cl9pbmRleChvcGpfajJrX3QqIHBfajJrKTsKIApAQCAtODAwLDY0ICs4MTcsNjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKTsKIAogCi1PUEpfQk9PTCBvcGpfajJrX2dldF90aWxlKAlvcGpfajJrX3QgKnBfajJrLAotCQkJICAgIAkJCW9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLQkJCQkgICAgCQlvcGpfaW1hZ2VfdCogcF9pbWFnZSwKLQkJCQkJICAgIAlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIsCi0JCQkJCQkgICAgT1BKX1VJTlQzMiB0aWxlX2luZGV4ICk7CitPUEpfQk9PTCBvcGpfajJrX2dldF90aWxlKG9wal9qMmtfdCAqcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QqIHBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlX2luZGV4KTsKIAotT1BKX0JPT0wgb3BqX2oya19zZXRfZGVjb2RlZF9yZXNvbHV0aW9uX2ZhY3RvcihvcGpfajJrX3QgKnBfajJrLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiByZXNfZmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworT1BKX0JPT0wgb3BqX2oya19zZXRfZGVjb2RlZF9yZXNvbHV0aW9uX2ZhY3RvcihvcGpfajJrX3QgKnBfajJrLAorICAgICAgICBPUEpfVUlOVDMyIHJlc19mYWN0b3IsCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIAogLyoqCiAgKiBXcml0ZXMgYSB0aWxlLgotICogQHBhcmFtCXBfajJrCQl0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gICBwX2oyayAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCiAgKiBAcGFyYW0gcF90aWxlX2luZGV4IEZJWE1FIERPQwogICogQHBhcmFtIHBfZGF0YSBGSVhNRSBET0MKICAqIEBwYXJhbSBwX2RhdGFfc2l6ZSBGSVhNRSBET0MKLSAqIEBwYXJhbQlwX3N0cmVhbQkJCXRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbQlwX21hbmFnZXIJdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqIEBwYXJhbSAgIHBfc3RyZWFtICAgICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtICAgcF9tYW5hZ2VyICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICAqLwotT1BKX0JPT0wgb3BqX2oya193cml0ZV90aWxlICgJb3BqX2oya190ICogcF9qMmssCi0JCQkJCQkJICAgIE9QSl9VSU5UMzIgcF90aWxlX2luZGV4LAotCQkJCQkJCSAgICBPUEpfQllURSAqIHBfZGF0YSwKLQkJCQkJCQkgICAgT1BKX1VJTlQzMiBwX2RhdGFfc2l6ZSwKLQkJCQkJCQkgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotCQkJCQkJCSAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK09QSl9CT09MIG9wal9qMmtfd3JpdGVfdGlsZShvcGpfajJrX3QgKiBwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIEVuY29kZXMgYW4gaW1hZ2UgaW50byBhIEpQRUctMjAwMCBjb2Rlc3RyZWFtCiAgKi8KLU9QSl9CT09MIG9wal9qMmtfZW5jb2RlKAlvcGpfajJrX3QgKiBwX2oyaywKLQkJCSAgICAJCQlvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotCQkJCSAgICAJCW9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworT1BKX0JPT0wgb3BqX2oya19lbmNvZGUob3BqX2oya190ICogcF9qMmssCisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBTdGFydHMgYSBjb21wcmVzc2lvbiBzY2hlbWUsIGkuZS4gdmFsaWRhdGVzIHRoZSBjb2RlYyBwYXJhbWV0ZXJzLCB3cml0ZXMgdGhlIGhlYWRlci4KICAqCi0gKiBAcGFyYW0JcF9qMmsJCXRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqIEBwYXJhbQlwX3N0cmVhbQkJCXRoZSBzdHJlYW0gb2JqZWN0LgotICogQHBhcmFtCXBfaW1hZ2UgRklYTUUgRE9DCi0gKiBAcGFyYW0JcF9tYW5hZ2VyCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisgKiBAcGFyYW0gICBwX2oyayAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gICBwX3N0cmVhbSAgICAgICAgICAgIHRoZSBzdHJlYW0gb2JqZWN0LgorICogQHBhcmFtICAgcF9pbWFnZSBGSVhNRSBET0MKKyAqIEBwYXJhbSAgIHBfbWFuYWdlciAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAgKgogICogQHJldHVybiB0cnVlIGlmIHRoZSBjb2RlYyBpcyB2YWxpZC4KICAqLwogT1BKX0JPT0wgb3BqX2oya19zdGFydF9jb21wcmVzcyhvcGpfajJrX3QgKnBfajJrLAotCQkJCQkJCSAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0JCQkJCQkJICAgIG9wal9pbWFnZV90ICogcF9pbWFnZSwKLQkJCQkJCQkgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqIHBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogRW5kcyB0aGUgY29tcHJlc3Npb24gcHJvY2VkdXJlcyBhbmQgcG9zc2liaWxpeSBhZGQgZGF0YSB0byBiZSByZWFkIGFmdGVyIHRoZQogICogY29kZXN0cmVhbS4KICAqLwotT1BKX0JPT0wgb3BqX2oya19lbmRfY29tcHJlc3MoIAlvcGpfajJrX3QgKnBfajJrLAotCQkJCQkJCSAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotCQkJCQkJCSAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworT1BKX0JPT0wgb3BqX2oya19lbmRfY29tcHJlc3Mob3BqX2oya190ICpwX2oyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCi1PUEpfQk9PTCBvcGpfajJrX3NldHVwX21jdF9lbmNvZGluZyAob3BqX3RjcF90ICogcF90Y3AsIG9wal9pbWFnZV90ICogcF9pbWFnZSk7CitPUEpfQk9PTCBvcGpfajJrX3NldHVwX21jdF9lbmNvZGluZyhvcGpfdGNwX3QgKiBwX3RjcCwgb3BqX2ltYWdlX3QgKiBwX2ltYWdlKTsKIAogCi0jZW5kaWYgLyogX19KMktfSCAqLworI2VuZGlmIC8qIE9QSl9KMktfSCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvanAyLmMKaW5kZXggODEyOGQ5OC4uMjM3NGQ0NSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuYworKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2pwMi5jCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAotICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZAogICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cwogICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgogICoKQEAgLTgsMTEgKzgsMTEgQEAKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBQcm9mZXNzb3IgQmVub2l0IE1hY3EKICAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzLCBEYXZpZCBKYW5zc2VucwogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIFlhbm5pY2sgVmVyc2NodWVyZW4KLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eCAKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eAogICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQsIEFudG9uaW4gRGVzY2FtcGUKICAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQogICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIEthb3JpIEhhZ2loYXJhCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZSIAorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGUgogICogQ29weXJpZ2h0IChjKSAyMDEyLCBDUyBTeXN0ZW1lcyBkJ0luZm9ybWF0aW9uLCBGcmFuY2UKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpAQCAtNDIsNyArNDIsOSBAQAogLyoqIEBkZWZncm91cCBKUDIgSlAyIC0gSlBFRy0yMDAwIGZpbGUgZm9ybWF0IHJlYWRlci93cml0ZXIgKi8KIC8qQHsqLwogCi0jZGVmaW5lIE9QSl9CT1hfU0laRQkxMDI0CisjZGVmaW5lIE9QSl9CT1hfU0laRSAgICAxMDI0CisKKyNkZWZpbmUgT1BKX1VOVVNFRCh4KSAodm9pZCl4CiAKIC8qKiBAbmFtZSBMb2NhbCBzdGF0aWMgZnVuY3Rpb25zICovCiAvKkB7Ki8KQEAgLTUyLDEzMCArNTQsMTMxIEBACiAvKioKICAqIFJlYWRzIGEgSUhEUiBib3ggLSBJbWFnZSBIZWFkZXIgYm94CiAgKgotICogQHBhcmFtCXBfaW1hZ2VfaGVhZGVyX2RhdGEJCQlwb2ludGVyIHRvIGFjdHVhbCBkYXRhIChhbHJlYWR5IHJlYWQgZnJvbSBmaWxlKQotICogQHBhcmFtCWpwMgkJCQkJCQl0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KLSAqIEBwYXJhbQlwX2ltYWdlX2hlYWRlcl9zaXplCQkJdGhlIHNpemUgb2YgdGhlIGltYWdlIGhlYWRlcgotICogQHBhcmFtCXBfbWFuYWdlcgkJCQkJdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqIEBwYXJhbSAgIHBfaW1hZ2VfaGVhZGVyX2RhdGEgICAgICAgICBwb2ludGVyIHRvIGFjdHVhbCBkYXRhIChhbHJlYWR5IHJlYWQgZnJvbSBmaWxlKQorICogQHBhcmFtICAganAyICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjLgorICogQHBhcmFtICAgcF9pbWFnZV9oZWFkZXJfc2l6ZSAgICAgICAgIHRoZSBzaXplIG9mIHRoZSBpbWFnZSBoZWFkZXIKKyAqIEBwYXJhbSAgIHBfbWFuYWdlciAgICAgICAgICAgICAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogICoKLSAqIEByZXR1cm4JdHJ1ZSBpZiB0aGUgaW1hZ2UgaGVhZGVyIGlzIHZhbGlkLCBmYWxzZSBlbHNlLgorICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgaW1hZ2UgaGVhZGVyIGlzIHZhbGlkLCBmYWxzZSBlbHNlLgogICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2loZHIoICBvcGpfanAyX3QgKmpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpwX2ltYWdlX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2ltYWdlX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2loZHIob3BqX2pwMl90ICpqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKnBfaW1hZ2VfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2ltYWdlX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogV3JpdGVzIHRoZSBJbWFnZSBIZWFkZXIgYm94IC0gSW1hZ2UgSGVhZGVyIGJveC4KICAqCi0gKiBAcGFyYW0ganAyCQkJCQlqcGVnMjAwMCBmaWxlIGNvZGVjLgotICogQHBhcmFtIHBfbmJfYnl0ZXNfd3JpdHRlbglwb2ludGVyIHRvIHN0b3JlIHRoZSBuYiBvZiBieXRlcyB3cml0dGVuIGJ5IHRoZSBmdW5jdGlvbi4KKyAqIEBwYXJhbSBqcDIgICAgICAgICAgICAgICAgICAganBlZzIwMDAgZmlsZSBjb2RlYy4KKyAqIEBwYXJhbSBwX25iX2J5dGVzX3dyaXR0ZW4gICAgcG9pbnRlciB0byBzdG9yZSB0aGUgbmIgb2YgYnl0ZXMgd3JpdHRlbiBieSB0aGUgZnVuY3Rpb24uCiAgKgotICogQHJldHVybgl0aGUgZGF0YSBiZWluZyBjb3BpZWQuCisgKiBAcmV0dXJuICB0aGUgZGF0YSBiZWluZyBjb3BpZWQuCiAqLwogc3RhdGljIE9QSl9CWVRFICogb3BqX2pwMl93cml0ZV9paGRyKG9wal9qcDJfdCAqanAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX25iX2J5dGVzX3dyaXR0ZW4gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9uYl9ieXRlc193cml0dGVuKTsKIAogLyoqCiAgKiBXcml0ZXMgdGhlIEJpdCBwZXIgQ29tcG9uZW50IGJveC4KICAqCi0gKiBAcGFyYW0JanAyCQkJCQkJanBlZzIwMDAgZmlsZSBjb2RlYy4KLSAqIEBwYXJhbQlwX25iX2J5dGVzX3dyaXR0ZW4JCXBvaW50ZXIgdG8gc3RvcmUgdGhlIG5iIG9mIGJ5dGVzIHdyaXR0ZW4gYnkgdGhlIGZ1bmN0aW9uLgorICogQHBhcmFtICAganAyICAgICAgICAgICAgICAgICAgICAganBlZzIwMDAgZmlsZSBjb2RlYy4KKyAqIEBwYXJhbSAgIHBfbmJfYnl0ZXNfd3JpdHRlbiAgICAgIHBvaW50ZXIgdG8gc3RvcmUgdGhlIG5iIG9mIGJ5dGVzIHdyaXR0ZW4gYnkgdGhlIGZ1bmN0aW9uLgogICoKLSAqIEByZXR1cm4JdGhlIGRhdGEgYmVpbmcgY29waWVkLgorICogQHJldHVybiAgdGhlIGRhdGEgYmVpbmcgY29waWVkLgogKi8KLXN0YXRpYyBPUEpfQllURSAqIG9wal9qcDJfd3JpdGVfYnBjYygJb3BqX2pwMl90ICpqcDIsCi0JCQkJCQkJCSAgICAgICAgT1BKX1VJTlQzMiAqIHBfbmJfYnl0ZXNfd3JpdHRlbiApOworc3RhdGljIE9QSl9CWVRFICogb3BqX2pwMl93cml0ZV9icGNjKG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX25iX2J5dGVzX3dyaXR0ZW4pOwogCiAvKioKICAqIFJlYWRzIGEgQml0IHBlciBDb21wb25lbnQgYm94LgogICoKLSAqIEBwYXJhbQlwX2JwY19oZWFkZXJfZGF0YQkJCXBvaW50ZXIgdG8gYWN0dWFsIGRhdGEgKGFscmVhZHkgcmVhZCBmcm9tIGZpbGUpCi0gKiBAcGFyYW0JanAyCQkJCQkJCXRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjLgotICogQHBhcmFtCXBfYnBjX2hlYWRlcl9zaXplCQkJdGhlIHNpemUgb2YgdGhlIGJwYyBoZWFkZXIKLSAqIEBwYXJhbQlwX21hbmFnZXIJCQkJCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisgKiBAcGFyYW0gICBwX2JwY19oZWFkZXJfZGF0YSAgICAgICAgICAgcG9pbnRlciB0byBhY3R1YWwgZGF0YSAoYWxyZWFkeSByZWFkIGZyb20gZmlsZSkKKyAqIEBwYXJhbSAgIGpwMiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KKyAqIEBwYXJhbSAgIHBfYnBjX2hlYWRlcl9zaXplICAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgYnBjIGhlYWRlcgorICogQHBhcmFtICAgcF9tYW5hZ2VyICAgICAgICAgICAgICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAgKgotICogQHJldHVybgl0cnVlIGlmIHRoZSBicGMgaGVhZGVyIGlzIHZhbGlkLCBmYWxlIGVsc2UuCisgKiBAcmV0dXJuICB0cnVlIGlmIHRoZSBicGMgaGVhZGVyIGlzIHZhbGlkLCBmYWxzZSBlbHNlLgogICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2JwY2MoICBvcGpfanAyX3QgKmpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9icGNfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfYnBjX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2JwY2Mob3BqX2pwMl90ICpqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2JwY19oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfYnBjX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfY2RlZigJb3BqX2pwMl90ICoganAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2NkZWZfaGVhZGVyX2RhdGEsCi0JCQkJCQkJCQlPUEpfVUlOVDMyIHBfY2RlZl9oZWFkZXJfc2l6ZSwKLQkJCQkJCQkJCW9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9jZGVmKG9wal9qcDJfdCAqIGpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfY2RlZl9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY2RlZl9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCi1zdGF0aWMgdm9pZCBvcGpfanAyX2FwcGx5X2NkZWYob3BqX2ltYWdlX3QgKmltYWdlLCBvcGpfanAyX2NvbG9yX3QgKmNvbG9yLCBvcGpfZXZlbnRfbWdyX3QgKik7CitzdGF0aWMgdm9pZCBvcGpfanAyX2FwcGx5X2NkZWYob3BqX2ltYWdlX3QgKmltYWdlLCBvcGpfanAyX2NvbG9yX3QgKmNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqKTsKIAogLyoqCiAgKiBXcml0ZXMgdGhlIENoYW5uZWwgRGVmaW5pdGlvbiBib3guCiAgKgotICogQHBhcmFtIGpwMgkJCQkJanBlZzIwMDAgZmlsZSBjb2RlYy4KLSAqIEBwYXJhbSBwX25iX2J5dGVzX3dyaXR0ZW4JcG9pbnRlciB0byBzdG9yZSB0aGUgbmIgb2YgYnl0ZXMgd3JpdHRlbiBieSB0aGUgZnVuY3Rpb24uCisgKiBAcGFyYW0ganAyICAgICAgICAgICAgICAgICAgIGpwZWcyMDAwIGZpbGUgY29kZWMuCisgKiBAcGFyYW0gcF9uYl9ieXRlc193cml0dGVuICAgIHBvaW50ZXIgdG8gc3RvcmUgdGhlIG5iIG9mIGJ5dGVzIHdyaXR0ZW4gYnkgdGhlIGZ1bmN0aW9uLgogICoKLSAqIEByZXR1cm4JdGhlIGRhdGEgYmVpbmcgY29waWVkLgorICogQHJldHVybiAgdGhlIGRhdGEgYmVpbmcgY29waWVkLgogICovCi1zdGF0aWMgT1BKX0JZVEUgKiBvcGpfanAyX3dyaXRlX2NkZWYoICAgb3BqX2pwMl90ICpqcDIsCi0JCQkJCQkJCQkJCQkJCQkJCQkgT1BKX1VJTlQzMiAqIHBfbmJfYnl0ZXNfd3JpdHRlbiApOworc3RhdGljIE9QSl9CWVRFICogb3BqX2pwMl93cml0ZV9jZGVmKG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX25iX2J5dGVzX3dyaXR0ZW4pOwogCiAvKioKICAqIFdyaXRlcyB0aGUgQ29sb3VyIFNwZWNpZmljYXRpb24gYm94LgogICoKLSAqIEBwYXJhbSBqcDIJCQkJCWpwZWcyMDAwIGZpbGUgY29kZWMuCi0gKiBAcGFyYW0gcF9uYl9ieXRlc193cml0dGVuCXBvaW50ZXIgdG8gc3RvcmUgdGhlIG5iIG9mIGJ5dGVzIHdyaXR0ZW4gYnkgdGhlIGZ1bmN0aW9uLgorICogQHBhcmFtIGpwMiAgICAgICAgICAgICAgICAgICBqcGVnMjAwMCBmaWxlIGNvZGVjLgorICogQHBhcmFtIHBfbmJfYnl0ZXNfd3JpdHRlbiAgICBwb2ludGVyIHRvIHN0b3JlIHRoZSBuYiBvZiBieXRlcyB3cml0dGVuIGJ5IHRoZSBmdW5jdGlvbi4KICAqCi0gKiBAcmV0dXJuCXRoZSBkYXRhIGJlaW5nIGNvcGllZC4KKyAqIEByZXR1cm4gIHRoZSBkYXRhIGJlaW5nIGNvcGllZC4KICovCi1zdGF0aWMgT1BKX0JZVEUgKiBvcGpfanAyX3dyaXRlX2NvbHIoICAgb3BqX2pwMl90ICpqcDIsCi0JCQkJCQkJCQkgICAgT1BKX1VJTlQzMiAqIHBfbmJfYnl0ZXNfd3JpdHRlbiApOworc3RhdGljIE9QSl9CWVRFICogb3BqX2pwMl93cml0ZV9jb2xyKG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX25iX2J5dGVzX3dyaXR0ZW4pOwogCiAvKioKICAqIFdyaXRlcyBhIEZUWVAgYm94IC0gRmlsZSB0eXBlIGJveAogICoKLSAqIEBwYXJhbQljaW8JCQl0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0JanAyCQkJdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCi0gKiBAcGFyYW0JcF9tYW5hZ2VyCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisgKiBAcGFyYW0gICBjaW8gICAgICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCisgKiBAcGFyYW0gICBqcDIgICAgICAgICB0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KKyAqIEBwYXJhbSAgIHBfbWFuYWdlciAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAgKgotICogQHJldHVybgl0cnVlIGlmIHdyaXRpbmcgd2FzIHN1Y2Nlc3NmdWwuCisgKiBAcmV0dXJuICB0cnVlIGlmIHdyaXRpbmcgd2FzIHN1Y2Nlc3NmdWwuCiAgKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3dyaXRlX2Z0eXAoCW9wal9qcDJfdCAqanAyLAotCQkJCQkJCQkJb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKLQkJCQkJCQkJCW9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfd3JpdGVfZnR5cChvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBSZWFkcyBhIGEgRlRZUCBib3ggLSBGaWxlIHR5cGUgYm94CiAgKgotICogQHBhcmFtCXBfaGVhZGVyX2RhdGEJdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBGVFlQIGJveC4KLSAqIEBwYXJhbQlqcDIJCQkJdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCi0gKiBAcGFyYW0JcF9oZWFkZXJfc2l6ZQl0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIEZUWVAgYm94LgotICogQHBhcmFtCXBfbWFuYWdlcgkJdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqIEBwYXJhbSAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIEZUWVAgYm94LgorICogQHBhcmFtICAganAyICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjLgorICogQHBhcmFtICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgRlRZUCBib3guCisgKiBAcGFyYW0gICBwX21hbmFnZXIgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICAqCiAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIEZUWVAgYm94IGlzIHZhbGlkLgogICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2Z0eXAoCW9wal9qcDJfdCAqanAyLAotCQkJCQkJCQkJT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAotCQkJCQkJCQkJT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotCQkJCQkJCQkJb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2Z0eXAob3BqX2pwMl90ICpqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9za2lwX2pwMmMoCW9wal9qcDJfdCAqanAyLAotCQkJCQkJICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0JCQkJCQkgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9za2lwX2pwMmMob3BqX2pwMl90ICpqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIFJlYWRzIHRoZSBKcGVnMjAwMCBmaWxlIEhlYWRlciBib3ggLSBKUDIgSGVhZGVyIGJveCAod2FybmluZywgdGhpcyBpcyBhIHN1cGVyIGJveCkuCiAgKgotICogQHBhcmFtCXBfaGVhZGVyX2RhdGEJdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBmaWxlIGhlYWRlciBib3guCi0gKiBAcGFyYW0JanAyCQkJCXRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjLgotICogQHBhcmFtCXBfaGVhZGVyX3NpemUJdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBmaWxlIGhlYWRlciBib3guCi0gKiBAcGFyYW0JcF9tYW5hZ2VyCQl0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorICogQHBhcmFtICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSBoZWFkZXIgYm94LgorICogQHBhcmFtICAganAyICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjLgorICogQHBhcmFtICAgcF9oZWFkZXJfc2l6ZSAgIHRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSBoZWFkZXIgYm94LgorICogQHBhcmFtICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAgKgogICogQHJldHVybiB0cnVlIGlmIHRoZSBKUDIgSGVhZGVyIGJveCB3YXMgc3VjY2Vzc2Z1bGx5IHJlY29nbml6ZWQuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9qcDJoKCAgb3BqX2pwMl90ICpqcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9qcDJoKG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpwX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIFdyaXRlcyB0aGUgSnBlZzIwMDAgZmlsZSBIZWFkZXIgYm94IC0gSlAyIEhlYWRlciBib3ggKHdhcm5pbmcsIHRoaXMgaXMgYSBzdXBlciBib3gpLgpAQCAtMTg3LDYxICsxOTAsNjEgQEAKICAqIEByZXR1cm4gdHJ1ZSBpZiB3cml0aW5nIHdhcyBzdWNjZXNzZnVsLgogICovCiBzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl93cml0ZV9qcDJoKG9wal9qcDJfdCAqanAyLAotCQkJCQkJCQkJCQkJCQlvcGpfc3RyZWFtX3ByaXZhdGVfdCAqc3RyZWFtLAotCQkJCQkJCQkJCQkJCQlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBXcml0ZXMgdGhlIEpwZWcyMDAwIGNvZGVzdHJlYW0gSGVhZGVyIGJveCAtIEpQMkMgSGVhZGVyIGJveC4gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBBRlRFUiB0aGUgY29kaW5nIGhhcyBiZWVuIGRvbmUuCiAgKgotICogQHBhcmFtCWNpbwkJCXRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KLSAqIEBwYXJhbQlqcDIJCQl0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KLSAqIEBwYXJhbQlwX21hbmFnZXIJdXNlciBldmVudCBtYW5hZ2VyLgorICogQHBhcmFtICAgY2lvICAgICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgorICogQHBhcmFtICAganAyICAgICAgICAgdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCisgKiBAcGFyYW0gICBwX21hbmFnZXIgICB1c2VyIGV2ZW50IG1hbmFnZXIuCiAgKgogICogQHJldHVybiB0cnVlIGlmIHdyaXRpbmcgd2FzIHN1Y2Nlc3NmdWwuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qcDJfd3JpdGVfanAyYygJb3BqX2pwMl90ICpqcDIsCi0JCQkJCQkJCSAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotCQkJCQkJCQkgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl93cml0ZV9qcDJjKG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAjaWZkZWYgVVNFX0pQSVAKIC8qKgogICogV3JpdGUgaW5kZXggRmluZGVyIGJveAogICogQHBhcmFtIGNpbyAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSB0by4KLSAqIEBwYXJhbQlqcDIJCQl0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KLSAqIEBwYXJhbQlwX21hbmFnZXIJdXNlciBldmVudCBtYW5hZ2VyLgorICogQHBhcmFtICAganAyICAgICAgICAgdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCisgKiBAcGFyYW0gICBwX21hbmFnZXIgICB1c2VyIGV2ZW50IG1hbmFnZXIuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qcGlwX3dyaXRlX2lwdHIoCW9wal9qcDJfdCAqanAyLAotCQkJCQkJCQkgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKLQkJCQkJCQkJICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qcGlwX3dyaXRlX2lwdHIob3BqX2pwMl90ICpqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBXcml0ZSBpbmRleCBGaW5kZXIgYm94CiAgKiBAcGFyYW0gY2lvICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIHRvLgotICogQHBhcmFtCWpwMgkJCXRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjLgotICogQHBhcmFtCXBfbWFuYWdlcgl1c2VyIGV2ZW50IG1hbmFnZXIuCisgKiBAcGFyYW0gICBqcDIgICAgICAgICB0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KKyAqIEBwYXJhbSAgIHBfbWFuYWdlciAgIHVzZXIgZXZlbnQgbWFuYWdlci4KICAqLwogc3RhdGljIE9QSl9CT09MIG9wal9qcGlwX3dyaXRlX2NpZHgob3BqX2pwMl90ICpqcDIsCi0gIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0gIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogV3JpdGUgZmlsZSBJbmRleCAoc3VwZXJib3gpCiAgKiBAcGFyYW0gY2lvICAgICB0aGUgc3RyZWFtIHRvIHdyaXRlIHRvLgotICogQHBhcmFtCWpwMgkJCXRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjLgotICogQHBhcmFtCXBfbWFuYWdlcgl1c2VyIGV2ZW50IG1hbmFnZXIuCisgKiBAcGFyYW0gICBqcDIgICAgICAgICB0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KKyAqIEBwYXJhbSAgIHBfbWFuYWdlciAgIHVzZXIgZXZlbnQgbWFuYWdlci4KICAqLwogc3RhdGljIE9QSl9CT09MIG9wal9qcGlwX3dyaXRlX2ZpZHgob3BqX2pwMl90ICpqcDIsCi0gIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0gIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAjZW5kaWYgLyogVVNFX0pQSVAgKi8KIAogLyoqCiAgKiBSZWFkcyBhIGpwZWcyMDAwIGZpbGUgc2lnbmF0dXJlIGJveC4KICAqCi0gKiBAcGFyYW0JcF9oZWFkZXJfZGF0YQl0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIHNpZ25hdHVyZSBib3guCi0gKiBAcGFyYW0JanAyCQkJCXRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjLgotICogQHBhcmFtCXBfaGVhZGVyX3NpemUJdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBzaWduYXR1cmUgYm94LgotICogQHBhcmFtCXBfbWFuYWdlcgkJdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KKyAqIEBwYXJhbSAgIHBfaGVhZGVyX2RhdGEgICB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIHNpZ25hdHVyZSBib3guCisgKiBAcGFyYW0gICBqcDIgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCisgKiBAcGFyYW0gICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBzaWduYXR1cmUgYm94LgorICogQHBhcmFtICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAgKgogICogQHJldHVybiB0cnVlIGlmIHRoZSBmaWxlIHNpZ25hdHVyZSBib3ggaXMgdmFsaWQuCiAgKi8KQEAgLTI1NCwyMSArMjU3LDI1IEBACiAgKiBXcml0ZXMgYSBqcGVnMjAwMCBmaWxlIHNpZ25hdHVyZSBib3guCiAgKgogICogQHBhcmFtIGNpbyB0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCi0gKiBAcGFyYW0JanAyCQkJdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCisgKiBAcGFyYW0gICBqcDIgICAgICAgICB0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KICAqIEBwYXJhbSBwX21hbmFnZXIgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICAqCiAgKiBAcmV0dXJuIHRydWUgaWYgd3JpdGluZyB3YXMgc3VjY2Vzc2Z1bC4KICAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qcDJfd3JpdGVfanAoCW9wal9qcDJfdCAqanAyLAotCQkJICAgIAkgICAgICAgIAkgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKLQkJCQkgICAgICAgICAgICAJCW9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfd3JpdGVfanAob3BqX2pwMl90ICpqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiBBcHBseSBjb2xsZWN0ZWQgcGFsZXR0ZSBkYXRhCi1AcGFyYW0gY29sb3IgQ29sbGVjdG9yIGZvciBwcm9maWxlLCBjZGVmIGFuZCBwY2xyIGRhdGEKLUBwYXJhbSBpbWFnZQorQHBhcmFtIGltYWdlIEltYWdlLgorQHBhcmFtIGNvbG9yIENvbGxlY3RvciBmb3IgcHJvZmlsZSwgY2RlZiBhbmQgcGNsciBkYXRhLgorQHBhcmFtIHBfbWFuYWdlciB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorQHJldHVybiB0cnVlIGluIGNhc2Ugb2Ygc3VjY2VzcwogKi8KLXN0YXRpYyB2b2lkIG9wal9qcDJfYXBwbHlfcGNscihvcGpfaW1hZ2VfdCAqaW1hZ2UsIG9wal9qcDJfY29sb3JfdCAqY29sb3IpOworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfYXBwbHlfcGNscihvcGpfaW1hZ2VfdCAqaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9qcDJfY29sb3JfdCAqY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIHN0YXRpYyB2b2lkIG9wal9qcDJfZnJlZV9wY2xyKG9wal9qcDJfY29sb3JfdCAqY29sb3IpOwogCkBAIC0yODIsMTAgKzI4OSwxMCBAQAogICoKICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9wY2xyKAlvcGpfanAyX3QgKmpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9wY2xyX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3BjbHJfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfcGNscihvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfcGNscl9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfcGNscl9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIENvbGxlY3QgY29tcG9uZW50IG1hcHBpbmcgZGF0YQpAQCAtMjk4LDI1ICszMDUsMjUgQEAKICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlCiAqLwogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2NtYXAoCW9wal9qcDJfdCAqIGpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9jbWFwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NtYXBfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfY21hcChvcGpfanAyX3QgKiBqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2NtYXBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NtYXBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBSZWFkcyB0aGUgQ29sb3IgU3BlY2lmaWNhdGlvbiBib3guCiAgKgotICogQHBhcmFtCXBfY29scl9oZWFkZXJfZGF0YQkJCXBvaW50ZXIgdG8gYWN0dWFsIGRhdGEgKGFscmVhZHkgcmVhZCBmcm9tIGZpbGUpCi0gKiBAcGFyYW0JanAyCQkJCQkJCXRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjLgotICogQHBhcmFtCXBfY29scl9oZWFkZXJfc2l6ZQkJCXRoZSBzaXplIG9mIHRoZSBjb2xvciBoZWFkZXIKLSAqIEBwYXJhbQlwX21hbmFnZXIJCQkJCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisgKiBAcGFyYW0gICBwX2NvbHJfaGVhZGVyX2RhdGEgICAgICAgICAgcG9pbnRlciB0byBhY3R1YWwgZGF0YSAoYWxyZWFkeSByZWFkIGZyb20gZmlsZSkKKyAqIEBwYXJhbSAgIGpwMiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KKyAqIEBwYXJhbSAgIHBfY29scl9oZWFkZXJfc2l6ZSAgICAgICAgICB0aGUgc2l6ZSBvZiB0aGUgY29sb3IgaGVhZGVyCisgKiBAcGFyYW0gICBwX21hbmFnZXIgICAgICAgICAgICAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICAqCi0gKiBAcmV0dXJuCXRydWUgaWYgdGhlIGJwYyBoZWFkZXIgaXMgdmFsaWQsIGZhbGUgZWxzZS4KKyAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGJwYyBoZWFkZXIgaXMgdmFsaWQsIGZhbHNlIGVsc2UuCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9jb2xyKCAgb3BqX2pwMl90ICpqcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfY29scl9oZWFkZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb2xyX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2NvbHIob3BqX2pwMl90ICpqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2NvbHJfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NvbHJfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLypAfSovCiAKQEAgLTMyNiwxMyArMzMzLDE1IEBACiAgKiBTZXRzIHVwIHRoZSBwcm9jZWR1cmVzIHRvIGRvIG9uIHdyaXRpbmcgaGVhZGVyIGFmdGVyIHRoZSBjb2Rlc3RyZWFtLgogICogRGV2ZWxvcHBlcnMgd2FudGluZyB0byBleHRlbmQgdGhlIGxpYnJhcnkgY2FuIGFkZCB0aGVpciBvd24gd3JpdGluZyBwcm9jZWR1cmVzLgogICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9zZXR1cF9lbmRfaGVhZGVyX3dyaXRpbmcgKG9wal9qcDJfdCAqanAyLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfc2V0dXBfZW5kX2hlYWRlcl93cml0aW5nKG9wal9qcDJfdCAqanAyLAorICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIFNldHMgdXAgdGhlIHByb2NlZHVyZXMgdG8gZG8gb24gcmVhZGluZyBoZWFkZXIgYWZ0ZXIgdGhlIGNvZGVzdHJlYW0uCiAgKiBEZXZlbG9wcGVycyB3YW50aW5nIHRvIGV4dGVuZCB0aGUgbGlicmFyeSBjYW4gYWRkIHRoZWlyIG93biB3cml0aW5nIHByb2NlZHVyZXMuCiAgKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3NldHVwX2VuZF9oZWFkZXJfcmVhZGluZyAob3BqX2pwMl90ICpqcDIsIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9zZXR1cF9lbmRfaGVhZGVyX3JlYWRpbmcob3BqX2pwMl90ICpqcDIsCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogUmVhZHMgYSBqcGVnMjAwMCBmaWxlIGhlYWRlciBzdHJ1Y3R1cmUuCkBAIC0zNDMsMzQgKzM1MiwzNCBAQAogICoKICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgYm94IGlzIHZhbGlkLgogICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2hlYWRlcl9wcm9jZWR1cmUoICBvcGpfanAyX3QgKmpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfaGVhZGVyX3Byb2NlZHVyZShvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnN0cmVhbSwKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCi0gKiBFeGN1dGVzIHRoZSBnaXZlbiBwcm9jZWR1cmVzIG9uIHRoZSBnaXZlbiBjb2RlYy4KKyAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBwcm9jZWR1cmVzIG9uIHRoZSBnaXZlbiBjb2RlYy4KICAqCi0gKiBAcGFyYW0JcF9wcm9jZWR1cmVfbGlzdAl0aGUgbGlzdCBvZiBwcm9jZWR1cmVzIHRvIGV4ZWN1dGUKLSAqIEBwYXJhbQlqcDIJCQkJCXRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjIHRvIGV4ZWN1dGUgdGhlIHByb2NlZHVyZXMgb24uCi0gKiBAcGFyYW0Jc3RyZWFtCQkJCQl0aGUgc3RyZWFtIHRvIGV4ZWN1dGUgdGhlIHByb2NlZHVyZXMgb24uCi0gKiBAcGFyYW0JcF9tYW5hZ2VyCQkJdGhlIHVzZXIgbWFuYWdlci4KKyAqIEBwYXJhbSAgIHBfcHJvY2VkdXJlX2xpc3QgICAgdGhlIGxpc3Qgb2YgcHJvY2VkdXJlcyB0byBleGVjdXRlCisgKiBAcGFyYW0gICBqcDIgICAgICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBmaWxlIGNvZGVjIHRvIGV4ZWN1dGUgdGhlIHByb2NlZHVyZXMgb24uCisgKiBAcGFyYW0gICBzdHJlYW0gICAgICAgICAgICAgICAgICB0aGUgc3RyZWFtIHRvIGV4ZWN1dGUgdGhlIHByb2NlZHVyZXMgb24uCisgKiBAcGFyYW0gICBwX21hbmFnZXIgICAgICAgICAgIHRoZSB1c2VyIG1hbmFnZXIuCiAgKgotICogQHJldHVybgl0cnVlCQkJCWlmIGFsbCB0aGUgcHJvY2VkdXJlcyB3ZXJlIHN1Y2Nlc3NmdWxseSBleGVjdXRlZC4KKyAqIEByZXR1cm4gIHRydWUgICAgICAgICAgICAgICAgaWYgYWxsIHRoZSBwcm9jZWR1cmVzIHdlcmUgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkLgogICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9leGVjICggIG9wal9qcDJfdCAqIGpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X3QgKiBwX3Byb2NlZHVyZV9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX2V4ZWMob3BqX2pwMl90ICoganAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcHJvY2VkdXJlX2xpc3RfdCAqIHBfcHJvY2VkdXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogUmVhZHMgYSBib3ggaGVhZGVyLiBUaGUgYm94IGlzIHRoZSB3YXkgZGF0YSBpcyBwYWNrZWQgaW5zaWRlIGEganBlZzIwMDAgZmlsZSBzdHJ1Y3R1cmUuCiAgKgotICogQHBhcmFtCWNpbwkJCQkJCXRoZSBpbnB1dCBzdHJlYW0gdG8gcmVhZCBkYXRhIGZyb20uCi0gKiBAcGFyYW0JYm94CQkJCQkJdGhlIGJveCBzdHJ1Y3R1cmUgdG8gZmlsbC4KLSAqIEBwYXJhbQlwX251bWJlcl9ieXRlc19yZWFkCQlwb2ludGVyIHRvIGFuIGludCB0aGF0IHdpbGwgc3RvcmUgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gdGhlIHN0cmVhbSAoc2hvdWwgdXN1YWxseSBiZSAyKS4KLSAqIEBwYXJhbQlwX21hbmFnZXIJCQkJdXNlciBldmVudCBtYW5hZ2VyLgorICogQHBhcmFtICAgY2lvICAgICAgICAgICAgICAgICAgICAgdGhlIGlucHV0IHN0cmVhbSB0byByZWFkIGRhdGEgZnJvbS4KKyAqIEBwYXJhbSAgIGJveCAgICAgICAgICAgICAgICAgICAgIHRoZSBib3ggc3RydWN0dXJlIHRvIGZpbGwuCisgKiBAcGFyYW0gICBwX251bWJlcl9ieXRlc19yZWFkICAgICBwb2ludGVyIHRvIGFuIGludCB0aGF0IHdpbGwgc3RvcmUgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gdGhlIHN0cmVhbSAoc2hvdWwgdXN1YWxseSBiZSAyKS4KKyAqIEBwYXJhbSAgIHBfbWFuYWdlciAgICAgICAgICAgICAgIHVzZXIgZXZlbnQgbWFuYWdlci4KICAqCi0gKiBAcmV0dXJuCXRydWUgaWYgdGhlIGJveCBpcyByZWNvZ25pemVkLCBmYWxzZSBvdGhlcndpc2UKKyAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGJveCBpcyByZWNvZ25pemVkLCBmYWxzZSBvdGhlcndpc2UKICovCiBzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2JveGhkcihvcGpfanAyX2JveF90ICpib3gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9udW1iZXJfYnl0ZXNfcmVhZCwKQEAgLTM3OCw0NDUgKzM4Nyw0ODkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgotICogU2V0cyB1cCB0aGUgdmFsaWRhdGlvbiAsaS5lLiBhZGRzIHRoZSBwcm9jZWR1cmVzIHRvIGxhdWNoIHRvIG1ha2Ugc3VyZSB0aGUgY29kZWMgcGFyYW1ldGVycworICogU2V0cyB1cCB0aGUgdmFsaWRhdGlvbiAsaS5lLiBhZGRzIHRoZSBwcm9jZWR1cmVzIHRvIGxhdW5jaCB0byBtYWtlIHN1cmUgdGhlIGNvZGVjIHBhcmFtZXRlcnMKICAqIGFyZSB2YWxpZC4gRGV2ZWxvcHBlcnMgd2FudGluZyB0byBleHRlbmQgdGhlIGxpYnJhcnkgY2FuIGFkZCB0aGVpciBvd24gdmFsaWRhdGlvbiBwcm9jZWR1cmVzLgogICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9zZXR1cF9lbmNvZGluZ192YWxpZGF0aW9uIChvcGpfanAyX3QgKmpwMiwgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3NldHVwX2VuY29kaW5nX3ZhbGlkYXRpb24ob3BqX2pwMl90ICpqcDIsCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogU2V0cyB1cCB0aGUgcHJvY2VkdXJlcyB0byBkbyBvbiB3cml0aW5nIGhlYWRlci4gRGV2ZWxvcHBlcnMgd2FudGluZyB0byBleHRlbmQgdGhlIGxpYnJhcnkgY2FuIGFkZCB0aGVpciBvd24gd3JpdGluZyBwcm9jZWR1cmVzLgogICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9zZXR1cF9oZWFkZXJfd3JpdGluZyAob3BqX2pwMl90ICpqcDIsIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9zZXR1cF9oZWFkZXJfd3JpdGluZyhvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAotc3RhdGljIE9QSl9CT09MIG9wal9qcDJfZGVmYXVsdF92YWxpZGF0aW9uICgJb3BqX2pwMl90ICoganAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9kZWZhdWx0X3ZhbGlkYXRpb24ob3BqX2pwMl90ICoganAyLAorICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIEZpbmRzIHRoZSBpbWFnZSBleGVjdXRpb24gZnVuY3Rpb24gcmVsYXRlZCB0byB0aGUgZ2l2ZW4gYm94IGlkLgogICoKLSAqIEBwYXJhbQlwX2lkCXRoZSBpZCBvZiB0aGUgaGFuZGxlciB0byBmZXRjaC4KKyAqIEBwYXJhbSAgIHBfaWQgICAgdGhlIGlkIG9mIHRoZSBoYW5kbGVyIHRvIGZldGNoLgogICoKLSAqIEByZXR1cm4JdGhlIGdpdmVuIGhhbmRsZXIgb3IgTlVMTCBpZiBpdCBjb3VsZCBub3QgYmUgZm91bmQuCisgKiBAcmV0dXJuICB0aGUgZ2l2ZW4gaGFuZGxlciBvciBOVUxMIGlmIGl0IGNvdWxkIG5vdCBiZSBmb3VuZC4KICAqLwotc3RhdGljIGNvbnN0IG9wal9qcDJfaGVhZGVyX2hhbmRsZXJfdCAqIG9wal9qcDJfaW1nX2ZpbmRfaGFuZGxlciAoT1BKX1VJTlQzMiBwX2lkKTsKK3N0YXRpYyBjb25zdCBvcGpfanAyX2hlYWRlcl9oYW5kbGVyX3QgKiBvcGpfanAyX2ltZ19maW5kX2hhbmRsZXIoCisgICAgT1BKX1VJTlQzMiBwX2lkKTsKIAogLyoqCiAgKiBGaW5kcyB0aGUgZXhlY3V0aW9uIGZ1bmN0aW9uIHJlbGF0ZWQgdG8gdGhlIGdpdmVuIGJveCBpZC4KICAqCi0gKiBAcGFyYW0JcF9pZAl0aGUgaWQgb2YgdGhlIGhhbmRsZXIgdG8gZmV0Y2guCisgKiBAcGFyYW0gICBwX2lkICAgIHRoZSBpZCBvZiB0aGUgaGFuZGxlciB0byBmZXRjaC4KICAqCi0gKiBAcmV0dXJuCXRoZSBnaXZlbiBoYW5kbGVyIG9yIE5VTEwgaWYgaXQgY291bGQgbm90IGJlIGZvdW5kLgorICogQHJldHVybiAgdGhlIGdpdmVuIGhhbmRsZXIgb3IgTlVMTCBpZiBpdCBjb3VsZCBub3QgYmUgZm91bmQuCiAgKi8KLXN0YXRpYyBjb25zdCBvcGpfanAyX2hlYWRlcl9oYW5kbGVyX3QgKiBvcGpfanAyX2ZpbmRfaGFuZGxlciAoT1BKX1VJTlQzMiBwX2lkICk7CitzdGF0aWMgY29uc3Qgb3BqX2pwMl9oZWFkZXJfaGFuZGxlcl90ICogb3BqX2pwMl9maW5kX2hhbmRsZXIoT1BKX1VJTlQzMiBwX2lkKTsKIAotc3RhdGljIGNvbnN0IG9wal9qcDJfaGVhZGVyX2hhbmRsZXJfdCBqcDJfaGVhZGVyIFtdID0KLXsKLQl7SlAyX0pQLG9wal9qcDJfcmVhZF9qcH0sCi0Je0pQMl9GVFlQLG9wal9qcDJfcmVhZF9mdHlwfSwKLQl7SlAyX0pQMkgsb3BqX2pwMl9yZWFkX2pwMmh9CitzdGF0aWMgY29uc3Qgb3BqX2pwMl9oZWFkZXJfaGFuZGxlcl90IGpwMl9oZWFkZXIgW10gPSB7CisgICAge0pQMl9KUCwgb3BqX2pwMl9yZWFkX2pwfSwKKyAgICB7SlAyX0ZUWVAsIG9wal9qcDJfcmVhZF9mdHlwfSwKKyAgICB7SlAyX0pQMkgsIG9wal9qcDJfcmVhZF9qcDJofQogfTsKIAotc3RhdGljIGNvbnN0IG9wal9qcDJfaGVhZGVyX2hhbmRsZXJfdCBqcDJfaW1nX2hlYWRlciBbXSA9Ci17Ci0Je0pQMl9JSERSLG9wal9qcDJfcmVhZF9paGRyfSwKLQl7SlAyX0NPTFIsb3BqX2pwMl9yZWFkX2NvbHJ9LAotCXtKUDJfQlBDQyxvcGpfanAyX3JlYWRfYnBjY30sCi0Je0pQMl9QQ0xSLG9wal9qcDJfcmVhZF9wY2xyfSwKLQl7SlAyX0NNQVAsb3BqX2pwMl9yZWFkX2NtYXB9LAotCXtKUDJfQ0RFRixvcGpfanAyX3JlYWRfY2RlZn0KK3N0YXRpYyBjb25zdCBvcGpfanAyX2hlYWRlcl9oYW5kbGVyX3QganAyX2ltZ19oZWFkZXIgW10gPSB7CisgICAge0pQMl9JSERSLCBvcGpfanAyX3JlYWRfaWhkcn0sCisgICAge0pQMl9DT0xSLCBvcGpfanAyX3JlYWRfY29scn0sCisgICAge0pQMl9CUENDLCBvcGpfanAyX3JlYWRfYnBjY30sCisgICAge0pQMl9QQ0xSLCBvcGpfanAyX3JlYWRfcGNscn0sCisgICAge0pQMl9DTUFQLCBvcGpfanAyX3JlYWRfY21hcH0sCisgICAge0pQMl9DREVGLCBvcGpfanAyX3JlYWRfY2RlZn0KIAogfTsKIAogLyoqCiAgKiBSZWFkcyBhIGJveCBoZWFkZXIuIFRoZSBib3ggaXMgdGhlIHdheSBkYXRhIGlzIHBhY2tlZCBpbnNpZGUgYSBqcGVnMjAwMCBmaWxlIHN0cnVjdHVyZS4gRGF0YSBpcyByZWFkIGZyb20gYSBjaGFyYWN0ZXIgc3RyaW5nCiAgKgotICogQHBhcmFtCWJveAkJCQkJCXRoZSBib3ggc3RydWN0dXJlIHRvIGZpbGwuCi0gKiBAcGFyYW0JcF9kYXRhCQkJCQl0aGUgY2hhcmFjdGVyIHN0cmluZyB0byByZWFkIGRhdGEgZnJvbS4KLSAqIEBwYXJhbQlwX251bWJlcl9ieXRlc19yZWFkCQlwb2ludGVyIHRvIGFuIGludCB0aGF0IHdpbGwgc3RvcmUgdGhlIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gdGhlIHN0cmVhbSAoc2hvdWwgdXN1YWxseSBiZSAyKS4KLSAqIEBwYXJhbQlwX2JveF9tYXhfc2l6ZQkJCXRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYm94LgotICogQHBhcmFtCXBfbWFuYWdlciAgICAgICAgIEZJWE1FIERPQworICogQHBhcmFtICAgYm94ICAgICAgICAgICAgICAgICAgICAgdGhlIGJveCBzdHJ1Y3R1cmUgdG8gZmlsbC4KKyAqIEBwYXJhbSAgIHBfZGF0YSAgICAgICAgICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgc3RyaW5nIHRvIHJlYWQgZGF0YSBmcm9tLgorICogQHBhcmFtICAgcF9udW1iZXJfYnl0ZXNfcmVhZCAgICAgcG9pbnRlciB0byBhbiBpbnQgdGhhdCB3aWxsIHN0b3JlIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIHRoZSBzdHJlYW0gKHNob3VsIHVzdWFsbHkgYmUgMikuCisgKiBAcGFyYW0gICBwX2JveF9tYXhfc2l6ZSAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJveC4KKyAqIEBwYXJhbSAgIHBfbWFuYWdlciAgICAgICAgIEZJWE1FIERPQwogICoKLSAqIEByZXR1cm4JdHJ1ZSBpZiB0aGUgYm94IGlzIHJlY29nbml6ZWQsIGZhbHNlIG90aGVyd2lzZQorICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgYm94IGlzIHJlY29nbml6ZWQsIGZhbHNlIG90aGVyd2lzZQogKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfYm94aGRyX2NoYXIoICAgb3BqX2pwMl9ib3hfdCAqYm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbnVtYmVyX2J5dGVzX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9ib3hfbWF4X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9ib3hoZHJfY2hhcihvcGpfanAyX2JveF90ICpib3gsCisgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAorICAgICAgICBPUEpfVUlOVDMyICogcF9udW1iZXJfYnl0ZXNfcmVhZCwKKyAgICAgICAgT1BKX1VJTlQzMiBwX2JveF9tYXhfc2l6ZSwKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCi0gKiBTZXRzIHVwIHRoZSB2YWxpZGF0aW9uICxpLmUuIGFkZHMgdGhlIHByb2NlZHVyZXMgdG8gbGF1Y2ggdG8gbWFrZSBzdXJlIHRoZSBjb2RlYyBwYXJhbWV0ZXJzCisgKiBTZXRzIHVwIHRoZSB2YWxpZGF0aW9uICxpLmUuIGFkZHMgdGhlIHByb2NlZHVyZXMgdG8gbGF1bmNoIHRvIG1ha2Ugc3VyZSB0aGUgY29kZWMgcGFyYW1ldGVycwogICogYXJlIHZhbGlkLiBEZXZlbG9wcGVycyB3YW50aW5nIHRvIGV4dGVuZCB0aGUgbGlicmFyeSBjYW4gYWRkIHRoZWlyIG93biB2YWxpZGF0aW9uIHByb2NlZHVyZXMuCiAgKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3NldHVwX2RlY29kaW5nX3ZhbGlkYXRpb24gKG9wal9qcDJfdCAqanAyLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOworc3RhdGljIE9QSl9CT09MIG9wal9qcDJfc2V0dXBfZGVjb2RpbmdfdmFsaWRhdGlvbihvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBTZXRzIHVwIHRoZSBwcm9jZWR1cmVzIHRvIGRvIG9uIHJlYWRpbmcgaGVhZGVyLgogICogRGV2ZWxvcHBlcnMgd2FudGluZyB0byBleHRlbmQgdGhlIGxpYnJhcnkgY2FuIGFkZCB0aGVpciBvd24gd3JpdGluZyBwcm9jZWR1cmVzLgogICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9zZXR1cF9oZWFkZXJfcmVhZGluZyAob3BqX2pwMl90ICpqcDIsIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9zZXR1cF9oZWFkZXJfcmVhZGluZyhvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIHN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfYm94aGRyKG9wal9qcDJfYm94X3QgKmJveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX251bWJlcl9ieXRlc19yZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9udW1iZXJfYnl0ZXNfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCiB7Ci0JLyogcmVhZCBoZWFkZXIgZnJvbSBmaWxlICovCi0JT1BKX0JZVEUgbF9kYXRhX2hlYWRlciBbOF07CisgICAgLyogcmVhZCBoZWFkZXIgZnJvbSBmaWxlICovCisgICAgT1BKX0JZVEUgbF9kYXRhX2hlYWRlciBbOF07CiAKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KGNpbyAhPSAwMCk7Ci0JYXNzZXJ0KGJveCAhPSAwMCk7Ci0JYXNzZXJ0KHBfbnVtYmVyX2J5dGVzX3JlYWQgIT0gMDApOwotCWFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQoY2lvICE9IDAwKTsKKyAgICBhc3NlcnQoYm94ICE9IDAwKTsKKyAgICBhc3NlcnQocF9udW1iZXJfYnl0ZXNfcmVhZCAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CiAKLQkqcF9udW1iZXJfYnl0ZXNfcmVhZCA9IChPUEpfVUlOVDMyKW9wal9zdHJlYW1fcmVhZF9kYXRhKGNpbyxsX2RhdGFfaGVhZGVyLDgscF9tYW5hZ2VyKTsKLQlpZiAoKnBfbnVtYmVyX2J5dGVzX3JlYWQgIT0gOCkgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQotCS8qIHByb2Nlc3MgcmVhZCBkYXRhICovCi0Jb3BqX3JlYWRfYnl0ZXMobF9kYXRhX2hlYWRlciwmKGJveC0+bGVuZ3RoKSwgNCk7Ci0Jb3BqX3JlYWRfYnl0ZXMobF9kYXRhX2hlYWRlcis0LCYoYm94LT50eXBlKSwgNCk7Ci0gICAgCi0gIGlmKGJveC0+bGVuZ3RoID09IDApLyogbGFzdCBib3ggKi8KLSAgICB7Ci0gICAgY29uc3QgT1BKX09GRl9UIGJsZWZ0ID0gb3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChjaW8pOwotICAgIGJveC0+bGVuZ3RoID0gKE9QSl9VSU5UMzIpYmxlZnQ7Ci0gICAgYXNzZXJ0KCAoT1BKX09GRl9UKWJveC0+bGVuZ3RoID09IGJsZWZ0ICk7Ci0gICAgcmV0dXJuIE9QSl9UUlVFOworICAgICpwX251bWJlcl9ieXRlc19yZWFkID0gKE9QSl9VSU5UMzIpb3BqX3N0cmVhbV9yZWFkX2RhdGEoY2lvLCBsX2RhdGFfaGVhZGVyLCA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKTsKKyAgICBpZiAoKnBfbnVtYmVyX2J5dGVzX3JlYWQgIT0gOCkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgIH0KIAotCS8qIGRvIHdlIGhhdmUgYSAic3BlY2lhbCB2ZXJ5IGxhcmdlIGJveCA/IiAqLwotCS8qIHJlYWQgdGhlbiB0aGUgWExCb3ggKi8KLQlpZiAoYm94LT5sZW5ndGggPT0gMSkgewotCQlPUEpfVUlOVDMyIGxfeGxfcGFydF9zaXplOworICAgIC8qIHByb2Nlc3MgcmVhZCBkYXRhICovCisgICAgb3BqX3JlYWRfYnl0ZXMobF9kYXRhX2hlYWRlciwgJihib3gtPmxlbmd0aCksIDQpOworICAgIG9wal9yZWFkX2J5dGVzKGxfZGF0YV9oZWFkZXIgKyA0LCAmKGJveC0+dHlwZSksIDQpOwogCi0JCU9QSl9VSU5UMzIgbF9uYl9ieXRlc19yZWFkID0gKE9QSl9VSU5UMzIpb3BqX3N0cmVhbV9yZWFkX2RhdGEoY2lvLGxfZGF0YV9oZWFkZXIsOCxwX21hbmFnZXIpOwotCQlpZiAobF9uYl9ieXRlc19yZWFkICE9IDgpIHsKLQkJCWlmIChsX25iX2J5dGVzX3JlYWQgPiAwKSB7Ci0JCQkJKnBfbnVtYmVyX2J5dGVzX3JlYWQgKz0gbF9uYl9ieXRlc19yZWFkOwotCQkJfQorICAgIGlmIChib3gtPmxlbmd0aCA9PSAwKSB7IC8qIGxhc3QgYm94ICovCisgICAgICAgIGNvbnN0IE9QSl9PRkZfVCBibGVmdCA9IG9wal9zdHJlYW1fZ2V0X251bWJlcl9ieXRlX2xlZnQoY2lvKTsKKyAgICAgICAgaWYgKGJsZWZ0ID4gKE9QSl9PRkZfVCkoMHhGRkZGRkZGRlUgLSA4VSkpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgaGFuZGxlIGJveCBzaXplcyBoaWdoZXIgdGhhbiAyXjMyXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgYm94LT5sZW5ndGggPSAoT1BKX1VJTlQzMilibGVmdCArIDhVOworICAgICAgICBhc3NlcnQoKE9QSl9PRkZfVClib3gtPmxlbmd0aCA9PSBibGVmdCArIDgpOworICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgfQogCi0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9CisgICAgLyogZG8gd2UgaGF2ZSBhICJzcGVjaWFsIHZlcnkgbGFyZ2UgYm94ID8iICovCisgICAgLyogcmVhZCB0aGVuIHRoZSBYTEJveCAqLworICAgIGlmIChib3gtPmxlbmd0aCA9PSAxKSB7CisgICAgICAgIE9QSl9VSU5UMzIgbF94bF9wYXJ0X3NpemU7CisKKyAgICAgICAgT1BKX1VJTlQzMiBsX25iX2J5dGVzX3JlYWQgPSAoT1BKX1VJTlQzMilvcGpfc3RyZWFtX3JlYWRfZGF0YShjaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9kYXRhX2hlYWRlciwgOCwgcF9tYW5hZ2VyKTsKKyAgICAgICAgaWYgKGxfbmJfYnl0ZXNfcmVhZCAhPSA4KSB7CisgICAgICAgICAgICBpZiAobF9uYl9ieXRlc19yZWFkID4gMCkgeworICAgICAgICAgICAgICAgICpwX251bWJlcl9ieXRlc19yZWFkICs9IGxfbmJfYnl0ZXNfcmVhZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQogCiAgICAgICAgICpwX251bWJlcl9ieXRlc19yZWFkID0gMTY7Ci0JCW9wal9yZWFkX2J5dGVzKGxfZGF0YV9oZWFkZXIsJmxfeGxfcGFydF9zaXplLCA0KTsKLQkJaWYgKGxfeGxfcGFydF9zaXplICE9IDApIHsKLQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJDYW5ub3QgaGFuZGxlIGJveCBzaXplcyBoaWdoZXIgdGhhbiAyXjMyXG4iKTsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQkJb3BqX3JlYWRfYnl0ZXMobF9kYXRhX2hlYWRlcis0LCYoYm94LT5sZW5ndGgpLCA0KTsKLQl9CisgICAgICAgIG9wal9yZWFkX2J5dGVzKGxfZGF0YV9oZWFkZXIsICZsX3hsX3BhcnRfc2l6ZSwgNCk7CisgICAgICAgIGlmIChsX3hsX3BhcnRfc2l6ZSAhPSAwKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGhhbmRsZSBib3ggc2l6ZXMgaGlnaGVyIHRoYW4gMl4zMlxuIik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIG9wal9yZWFkX2J5dGVzKGxfZGF0YV9oZWFkZXIgKyA0LCAmKGJveC0+bGVuZ3RoKSwgNCk7CisgICAgfQogICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAogI2lmIDAKLXN0YXRpYyB2b2lkIGpwMl93cml0ZV91cmwob3BqX2Npb190ICpjaW8sIGNoYXIgKklkeF9maWxlKSB7Ci0JT1BKX1VJTlQzMiBpOwotCW9wal9qcDJfYm94X3QgYm94Oworc3RhdGljIHZvaWQganAyX3dyaXRlX3VybChvcGpfY2lvX3QgKmNpbywgY2hhciAqSWR4X2ZpbGUpCit7CisgICAgT1BKX1VJTlQzMiBpOworICAgIG9wal9qcDJfYm94X3QgYm94OwogCi0JYm94LmluaXRfcG9zID0gY2lvX3RlbGwoY2lvKTsKLQljaW9fc2tpcChjaW8sIDQpOwotCWNpb193cml0ZShjaW8sIEpQMl9VUkwsIDQpOwkvKiBEQlRMICovCi0JY2lvX3dyaXRlKGNpbywgMCwgMSk7CQkvKiBWRVJTICovCi0JY2lvX3dyaXRlKGNpbywgMCwgMyk7CQkvKiBGTEFHICovCisgICAgYm94LmluaXRfcG9zID0gY2lvX3RlbGwoY2lvKTsKKyAgICBjaW9fc2tpcChjaW8sIDQpOworICAgIGNpb193cml0ZShjaW8sIEpQMl9VUkwsIDQpOyAvKiBEQlRMICovCisgICAgY2lvX3dyaXRlKGNpbywgMCwgMSk7ICAgICAgIC8qIFZFUlMgKi8KKyAgICBjaW9fd3JpdGUoY2lvLCAwLCAzKTsgICAgICAgLyogRkxBRyAqLwogCi0JaWYoSWR4X2ZpbGUpIHsKLQkJZm9yIChpID0gMDsgaSA8IHN0cmxlbihJZHhfZmlsZSk7IGkrKykgewotCQkJY2lvX3dyaXRlKGNpbywgSWR4X2ZpbGVbaV0sIDEpOwotCQl9Ci0JfQorICAgIGlmIChJZHhfZmlsZSkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RybGVuKElkeF9maWxlKTsgaSsrKSB7CisgICAgICAgICAgICBjaW9fd3JpdGUoY2lvLCBJZHhfZmlsZVtpXSwgMSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlib3gubGVuZ3RoID0gY2lvX3RlbGwoY2lvKSAtIGJveC5pbml0X3BvczsKLQljaW9fc2VlayhjaW8sIGJveC5pbml0X3Bvcyk7Ci0JY2lvX3dyaXRlKGNpbywgYm94Lmxlbmd0aCwgNCk7CS8qIEwgKi8KLQljaW9fc2VlayhjaW8sIGJveC5pbml0X3BvcyArIGJveC5sZW5ndGgpOworICAgIGJveC5sZW5ndGggPSBjaW9fdGVsbChjaW8pIC0gYm94LmluaXRfcG9zOworICAgIGNpb19zZWVrKGNpbywgYm94LmluaXRfcG9zKTsKKyAgICBjaW9fd3JpdGUoY2lvLCBib3gubGVuZ3RoLCA0KTsgIC8qIEwgKi8KKyAgICBjaW9fc2VlayhjaW8sIGJveC5pbml0X3BvcyArIGJveC5sZW5ndGgpOwogfQogI2VuZGlmCiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfaWhkciggb3BqX2pwMl90ICpqcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKnBfaW1hZ2VfaGVhZGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2ltYWdlX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2loZHIob3BqX2pwMl90ICpqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKnBfaW1hZ2VfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2ltYWdlX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKIHsKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KHBfaW1hZ2VfaGVhZGVyX2RhdGEgIT0gMDApOwotCWFzc2VydChqcDIgIT0gMDApOwotCWFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9pbWFnZV9oZWFkZXJfZGF0YSAhPSAwMCk7CisgICAgYXNzZXJ0KGpwMiAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CiAKLQlpZiAocF9pbWFnZV9oZWFkZXJfc2l6ZSAhPSAxNCkgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQmFkIGltYWdlIGhlYWRlciBib3ggKGJhZCBzaXplKVxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgIGlmIChqcDItPmNvbXBzICE9IE5VTEwpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICJJZ25vcmluZyBpaGRyIGJveC4gRmlyc3QgaWhkciBib3ggYWxyZWFkeSByZWFkXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIH0KIAotCW9wal9yZWFkX2J5dGVzKHBfaW1hZ2VfaGVhZGVyX2RhdGEsJihqcDItPmgpLDQpOwkJCS8qIEhFSUdIVCAqLwotCXBfaW1hZ2VfaGVhZGVyX2RhdGEgKz0gNDsKLQlvcGpfcmVhZF9ieXRlcyhwX2ltYWdlX2hlYWRlcl9kYXRhLCYoanAyLT53KSw0KTsJCQkvKiBXSURUSCAqLwotCXBfaW1hZ2VfaGVhZGVyX2RhdGEgKz0gNDsKLQlvcGpfcmVhZF9ieXRlcyhwX2ltYWdlX2hlYWRlcl9kYXRhLCYoanAyLT5udW1jb21wcyksMik7CQkvKiBOQyAqLwotCXBfaW1hZ2VfaGVhZGVyX2RhdGEgKz0gMjsKKyAgICBpZiAocF9pbWFnZV9oZWFkZXJfc2l6ZSAhPSAxNCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQmFkIGltYWdlIGhlYWRlciBib3ggKGJhZCBzaXplKVxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0JLyogYWxsb2NhdGUgbWVtb3J5IGZvciBjb21wb25lbnRzICovCi0Jb3BqX2ZyZWUoanAyLT5jb21wcyk7Ci0JanAyLT5jb21wcyA9IChvcGpfanAyX2NvbXBzX3QqKSBvcGpfY2FsbG9jKGpwMi0+bnVtY29tcHMsIHNpemVvZihvcGpfanAyX2NvbXBzX3QpKTsKLQlpZiAoanAyLT5jb21wcyA9PSAwKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBoYW5kbGUgaW1hZ2UgaGVhZGVyIChpaGRyKVxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgIG9wal9yZWFkX2J5dGVzKHBfaW1hZ2VfaGVhZGVyX2RhdGEsICYoanAyLT5oKSwgNCk7ICAgICAgICAgIC8qIEhFSUdIVCAqLworICAgIHBfaW1hZ2VfaGVhZGVyX2RhdGEgKz0gNDsKKyAgICBvcGpfcmVhZF9ieXRlcyhwX2ltYWdlX2hlYWRlcl9kYXRhLCAmKGpwMi0+dyksIDQpOyAgICAgICAgICAvKiBXSURUSCAqLworICAgIHBfaW1hZ2VfaGVhZGVyX2RhdGEgKz0gNDsKKyAgICBvcGpfcmVhZF9ieXRlcyhwX2ltYWdlX2hlYWRlcl9kYXRhLCAmKGpwMi0+bnVtY29tcHMpLCAyKTsgICAvKiBOQyAqLworICAgIHBfaW1hZ2VfaGVhZGVyX2RhdGEgKz0gMjsKIAotCW9wal9yZWFkX2J5dGVzKHBfaW1hZ2VfaGVhZGVyX2RhdGEsJihqcDItPmJwYyksMSk7CQkJLyogQlBDICovCi0JKysgcF9pbWFnZV9oZWFkZXJfZGF0YTsKKyAgICBpZiAoKGpwMi0+bnVtY29tcHMgLSAxVSkgPj0KKyAgICAgICAgICAgIDE2Mzg0VSkgeyAvKiB1bnNpZ25lZCB1bmRlcmZsb3cgaXMgd2VsbCBkZWZpbmVkOiAxVSA8PSBqcDItPm51bWNvbXBzIDw9IDE2Mzg0VSAqLworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSW52YWxpZCBudW1iZXIgb2YgY29tcG9uZW50cyAoaWhkcilcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotCW9wal9yZWFkX2J5dGVzKHBfaW1hZ2VfaGVhZGVyX2RhdGEsJihqcDItPkMpLDEpOwkJCS8qIEMgKi8KLQkrKyBwX2ltYWdlX2hlYWRlcl9kYXRhOworICAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgY29tcG9uZW50cyAqLworICAgIG9wal9mcmVlKGpwMi0+Y29tcHMpOworICAgIGpwMi0+Y29tcHMgPSAob3BqX2pwMl9jb21wc190Kikgb3BqX2NhbGxvYyhqcDItPm51bWNvbXBzLAorICAgICAgICAgICAgICAgICBzaXplb2Yob3BqX2pwMl9jb21wc190KSk7CisgICAgaWYgKGpwMi0+Y29tcHMgPT0gMCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIG1lbW9yeSB0byBoYW5kbGUgaW1hZ2UgaGVhZGVyIChpaGRyKVxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0JLyogU2hvdWxkIGJlIGVxdWFsIHRvIDcgY2YuIGNoYXB0ZXIgYWJvdXQgaW1hZ2UgaGVhZGVyIGJveCBvZiB0aGUgbm9ybSAqLwotCWlmIChqcDItPkMgIT0gNyl7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfSU5GTywgIkpQMiBJSERSIGJveDogY29tcHJlc3Npb24gdHlwZSBpbmRpY2F0ZSB0aGF0IHRoZSBmaWxlIGlzIG5vdCBhIGNvbmZvcm1pbmcgSlAyIGZpbGUgKCVkKSBcbiIsIGpwMi0+Qyk7Ci0JfQorICAgIG9wal9yZWFkX2J5dGVzKHBfaW1hZ2VfaGVhZGVyX2RhdGEsICYoanAyLT5icGMpLCAxKTsgICAgICAgIC8qIEJQQyAqLworICAgICsrIHBfaW1hZ2VfaGVhZGVyX2RhdGE7CiAKLQlvcGpfcmVhZF9ieXRlcyhwX2ltYWdlX2hlYWRlcl9kYXRhLCYoanAyLT5VbmtDKSwxKTsJCQkvKiBVbmtDICovCi0JKysgcF9pbWFnZV9oZWFkZXJfZGF0YTsKLQlvcGpfcmVhZF9ieXRlcyhwX2ltYWdlX2hlYWRlcl9kYXRhLCYoanAyLT5JUFIpLDEpOwkJCS8qIElQUiAqLwotCSsrIHBfaW1hZ2VfaGVhZGVyX2RhdGE7CisgICAgb3BqX3JlYWRfYnl0ZXMocF9pbWFnZV9oZWFkZXJfZGF0YSwgJihqcDItPkMpLCAxKTsgICAgICAgICAgLyogQyAqLworICAgICsrIHBfaW1hZ2VfaGVhZGVyX2RhdGE7CiAKLQlyZXR1cm4gT1BKX1RSVUU7CisgICAgLyogU2hvdWxkIGJlIGVxdWFsIHRvIDcgY2YuIGNoYXB0ZXIgYWJvdXQgaW1hZ2UgaGVhZGVyIGJveCBvZiB0aGUgbm9ybSAqLworICAgIGlmIChqcDItPkMgIT0gNykgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgIkpQMiBJSERSIGJveDogY29tcHJlc3Npb24gdHlwZSBpbmRpY2F0ZSB0aGF0IHRoZSBmaWxlIGlzIG5vdCBhIGNvbmZvcm1pbmcgSlAyIGZpbGUgKCVkKSBcbiIsCisgICAgICAgICAgICAgICAgICAgICAganAyLT5DKTsKKyAgICB9CisKKyAgICBvcGpfcmVhZF9ieXRlcyhwX2ltYWdlX2hlYWRlcl9kYXRhLCAmKGpwMi0+VW5rQyksIDEpOyAgICAgICAvKiBVbmtDICovCisgICAgKysgcF9pbWFnZV9oZWFkZXJfZGF0YTsKKyAgICBvcGpfcmVhZF9ieXRlcyhwX2ltYWdlX2hlYWRlcl9kYXRhLCAmKGpwMi0+SVBSKSwgMSk7ICAgICAgICAvKiBJUFIgKi8KKyAgICArKyBwX2ltYWdlX2hlYWRlcl9kYXRhOworCisgICAganAyLT5qMmstPm1fY3AuYWxsb3dfZGlmZmVyZW50X2JpdF9kZXB0aF9zaWduID0gKGpwMi0+YnBjID09IDI1NSk7CisgICAganAyLT5qMmstPmloZHJfdyA9IGpwMi0+dzsKKyAgICBqcDItPmoyay0+aWhkcl9oID0ganAyLT5oOworICAgIGpwMi0+aGFzX2loZHIgPSAxOworCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiBzdGF0aWMgT1BKX0JZVEUgKiBvcGpfanAyX3dyaXRlX2loZHIob3BqX2pwMl90ICpqcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9uYl9ieXRlc193cml0dGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbmJfYnl0ZXNfd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewotCU9QSl9CWVRFICogbF9paGRyX2RhdGEsKiBsX2N1cnJlbnRfaWhkcl9wdHI7Ci0JCi0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChqcDIgIT0gMDApOwotCWFzc2VydChwX25iX2J5dGVzX3dyaXR0ZW4gIT0gMDApOworICAgIE9QSl9CWVRFICogbF9paGRyX2RhdGEsICogbF9jdXJyZW50X2loZHJfcHRyOwogCi0JLyogZGVmYXVsdCBpbWFnZSBoZWFkZXIgaXMgMjIgYnl0ZXMgd2lkZSAqLwotCWxfaWhkcl9kYXRhID0gKE9QSl9CWVRFICopIG9wal9jYWxsb2MoMSwyMik7Ci0JaWYgKGxfaWhkcl9kYXRhID09IDAwKSB7Ci0JCXJldHVybiAwMDsKLQl9CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChqcDIgIT0gMDApOworICAgIGFzc2VydChwX25iX2J5dGVzX3dyaXR0ZW4gIT0gMDApOwogCi0JbF9jdXJyZW50X2loZHJfcHRyID0gbF9paGRyX2RhdGE7Ci0JCi0Jb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9paGRyX3B0ciwyMiw0KTsJCQkJLyogd3JpdGUgYm94IHNpemUgKi8KLQlsX2N1cnJlbnRfaWhkcl9wdHIrPTQ7CisgICAgLyogZGVmYXVsdCBpbWFnZSBoZWFkZXIgaXMgMjIgYnl0ZXMgd2lkZSAqLworICAgIGxfaWhkcl9kYXRhID0gKE9QSl9CWVRFICopIG9wal9jYWxsb2MoMSwgMjIpOworICAgIGlmIChsX2loZHJfZGF0YSA9PSAwMCkgeworICAgICAgICByZXR1cm4gMDA7CisgICAgfQogCi0Jb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9paGRyX3B0cixKUDJfSUhEUiwgNCk7CQkvKiBJSERSICovCi0JbF9jdXJyZW50X2loZHJfcHRyKz00OwotCQotCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfaWhkcl9wdHIsanAyLT5oLCA0KTsJCS8qIEhFSUdIVCAqLwotCWxfY3VycmVudF9paGRyX3B0cis9NDsKLQkKLQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2loZHJfcHRyLCBqcDItPncsIDQpOwkJLyogV0lEVEggKi8KLQlsX2N1cnJlbnRfaWhkcl9wdHIrPTQ7Ci0JCi0Jb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9paGRyX3B0ciwganAyLT5udW1jb21wcywgMik7CQkvKiBOQyAqLwotCWxfY3VycmVudF9paGRyX3B0cis9MjsKLQkKLQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2loZHJfcHRyLCBqcDItPmJwYywgMSk7CQkvKiBCUEMgKi8KLQkrK2xfY3VycmVudF9paGRyX3B0cjsKLQkKLQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2loZHJfcHRyLCBqcDItPkMsIDEpOwkJLyogQyA6IEFsd2F5cyA3ICovCi0JKytsX2N1cnJlbnRfaWhkcl9wdHI7Ci0JCi0Jb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9paGRyX3B0ciwganAyLT5VbmtDLCAxKTsJCS8qIFVua0MsIGNvbG9yc3BhY2UgdW5rbm93biAqLwotCSsrbF9jdXJyZW50X2loZHJfcHRyOwotCQotCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfaWhkcl9wdHIsIGpwMi0+SVBSLCAxKTsJCS8qIElQUiwgbm8gaW50ZWxsZWN0dWFsIHByb3BlcnR5ICovCi0JKytsX2N1cnJlbnRfaWhkcl9wdHI7Ci0JCi0JKnBfbmJfYnl0ZXNfd3JpdHRlbiA9IDIyOwotCQotCXJldHVybiBsX2loZHJfZGF0YTsKKyAgICBsX2N1cnJlbnRfaWhkcl9wdHIgPSBsX2loZHJfZGF0YTsKKworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfaWhkcl9wdHIsIDIyLCA0KTsgICAgICAgICAgICAgLyogd3JpdGUgYm94IHNpemUgKi8KKyAgICBsX2N1cnJlbnRfaWhkcl9wdHIgKz0gNDsKKworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfaWhkcl9wdHIsIEpQMl9JSERSLCA0KTsgICAgICAgLyogSUhEUiAqLworICAgIGxfY3VycmVudF9paGRyX3B0ciArPSA0OworCisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9paGRyX3B0ciwganAyLT5oLCA0KTsgICAgIC8qIEhFSUdIVCAqLworICAgIGxfY3VycmVudF9paGRyX3B0ciArPSA0OworCisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9paGRyX3B0ciwganAyLT53LCA0KTsgICAgIC8qIFdJRFRIICovCisgICAgbF9jdXJyZW50X2loZHJfcHRyICs9IDQ7CisKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2loZHJfcHRyLCBqcDItPm51bWNvbXBzLCAyKTsgICAgICAvKiBOQyAqLworICAgIGxfY3VycmVudF9paGRyX3B0ciArPSAyOworCisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9paGRyX3B0ciwganAyLT5icGMsIDEpOyAgICAgICAvKiBCUEMgKi8KKyAgICArK2xfY3VycmVudF9paGRyX3B0cjsKKworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfaWhkcl9wdHIsIGpwMi0+QywgMSk7ICAgICAvKiBDIDogQWx3YXlzIDcgKi8KKyAgICArK2xfY3VycmVudF9paGRyX3B0cjsKKworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfaWhkcl9wdHIsIGpwMi0+VW5rQywKKyAgICAgICAgICAgICAgICAgICAgMSk7ICAgICAgLyogVW5rQywgY29sb3JzcGFjZSB1bmtub3duICovCisgICAgKytsX2N1cnJlbnRfaWhkcl9wdHI7CisKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2loZHJfcHRyLCBqcDItPklQUiwKKyAgICAgICAgICAgICAgICAgICAgMSk7ICAgICAgIC8qIElQUiwgbm8gaW50ZWxsZWN0dWFsIHByb3BlcnR5ICovCisgICAgKytsX2N1cnJlbnRfaWhkcl9wdHI7CisKKyAgICAqcF9uYl9ieXRlc193cml0dGVuID0gMjI7CisKKyAgICByZXR1cm4gbF9paGRyX2RhdGE7CiB9CiAKLXN0YXRpYyBPUEpfQllURSAqIG9wal9qcDJfd3JpdGVfYnBjYygJb3BqX2pwMl90ICpqcDIsCi0JCQkJCQkgICAgICAgIE9QSl9VSU5UMzIgKiBwX25iX2J5dGVzX3dyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorc3RhdGljIE9QSl9CWVRFICogb3BqX2pwMl93cml0ZV9icGNjKG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX25iX2J5dGVzX3dyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLQlPUEpfVUlOVDMyIGk7Ci0JLyogcm9vbSBmb3IgOCBieXRlcyBmb3IgYm94IGFuZCAxIGJ5dGUgZm9yIGVhY2ggY29tcG9uZW50ICovCi0JT1BKX1VJTlQzMiBsX2JwY2Nfc2l6ZSA9IDggKyBqcDItPm51bWNvbXBzOwotCU9QSl9CWVRFICogbF9icGNjX2RhdGEsKiBsX2N1cnJlbnRfYnBjY19wdHI7Ci0JCi0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChqcDIgIT0gMDApOwotCWFzc2VydChwX25iX2J5dGVzX3dyaXR0ZW4gIT0gMDApOworICAgIE9QSl9VSU5UMzIgaTsKKyAgICAvKiByb29tIGZvciA4IGJ5dGVzIGZvciBib3ggYW5kIDEgYnl0ZSBmb3IgZWFjaCBjb21wb25lbnQgKi8KKyAgICBPUEpfVUlOVDMyIGxfYnBjY19zaXplOworICAgIE9QSl9CWVRFICogbF9icGNjX2RhdGEsICogbF9jdXJyZW50X2JwY2NfcHRyOwogCi0JbF9icGNjX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX2NhbGxvYygxLGxfYnBjY19zaXplKTsKLQlpZiAobF9icGNjX2RhdGEgPT0gMDApIHsKLQkJcmV0dXJuIDAwOwotCX0KKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KGpwMiAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbmJfYnl0ZXNfd3JpdHRlbiAhPSAwMCk7CisgICAgbF9icGNjX3NpemUgPSA4ICsganAyLT5udW1jb21wczsKIAotCWxfY3VycmVudF9icGNjX3B0ciA9IGxfYnBjY19kYXRhOworICAgIGxfYnBjY19kYXRhID0gKE9QSl9CWVRFICopIG9wal9jYWxsb2MoMSwgbF9icGNjX3NpemUpOworICAgIGlmIChsX2JwY2NfZGF0YSA9PSAwMCkgeworICAgICAgICByZXR1cm4gMDA7CisgICAgfQogCi0Jb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9icGNjX3B0cixsX2JwY2Nfc2l6ZSw0KTsJCQkJLyogd3JpdGUgYm94IHNpemUgKi8KLQlsX2N1cnJlbnRfYnBjY19wdHIgKz0gNDsKLQkKLQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2JwY2NfcHRyLEpQMl9CUENDLDQpOwkJCQkJLyogQlBDQyAqLwotCWxfY3VycmVudF9icGNjX3B0ciArPSA0OworICAgIGxfY3VycmVudF9icGNjX3B0ciA9IGxfYnBjY19kYXRhOwogCi0JZm9yIChpID0gMDsgaSA8IGpwMi0+bnVtY29tcHM7ICsraSkgIHsKLQkJb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9icGNjX3B0ciwganAyLT5jb21wc1tpXS5icGNjLCAxKTsgLyogd3JpdGUgZWFjaCBjb21wb25lbnQgaW5mb3JtYXRpb24gKi8KLQkJKytsX2N1cnJlbnRfYnBjY19wdHI7Ci0JfQorICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfYnBjY19wdHIsIGxfYnBjY19zaXplLAorICAgICAgICAgICAgICAgICAgICA0KTsgICAgICAgICAgICAvKiB3cml0ZSBib3ggc2l6ZSAqLworICAgIGxfY3VycmVudF9icGNjX3B0ciArPSA0OwogCi0JKnBfbmJfYnl0ZXNfd3JpdHRlbiA9IGxfYnBjY19zaXplOwotCQotCXJldHVybiBsX2JwY2NfZGF0YTsKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2JwY2NfcHRyLCBKUDJfQlBDQywgNCk7ICAgICAgICAgICAgICAgLyogQlBDQyAqLworICAgIGxfY3VycmVudF9icGNjX3B0ciArPSA0OworCisgICAgZm9yIChpID0gMDsgaSA8IGpwMi0+bnVtY29tcHM7ICsraSkgIHsKKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9icGNjX3B0ciwganAyLT5jb21wc1tpXS5icGNjLAorICAgICAgICAgICAgICAgICAgICAgICAgMSk7IC8qIHdyaXRlIGVhY2ggY29tcG9uZW50IGluZm9ybWF0aW9uICovCisgICAgICAgICsrbF9jdXJyZW50X2JwY2NfcHRyOworICAgIH0KKworICAgICpwX25iX2J5dGVzX3dyaXR0ZW4gPSBsX2JwY2Nfc2l6ZTsKKworICAgIHJldHVybiBsX2JwY2NfZGF0YTsKIH0KIAotc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9icGNjKCBvcGpfanAyX3QgKmpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfYnBjX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9icGNfaGVhZGVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9icGNjKG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9icGNfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2JwY19oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLQlPUEpfVUlOVDMyIGk7CisgICAgT1BKX1VJTlQzMiBpOwogCi0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChwX2JwY19oZWFkZXJfZGF0YSAhPSAwMCk7Ci0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2JwY19oZWFkZXJfZGF0YSAhPSAwMCk7CisgICAgYXNzZXJ0KGpwMiAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CiAKLQkKLQlpZiAoanAyLT5icGMgIT0gMjU1ICl7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkEgQlBDQyBoZWFkZXIgYm94IGlzIGF2YWlsYWJsZSBhbHRob3VnaCBCUEMgZ2l2ZW4gYnkgdGhlIElIRFIgYm94ICglZCkgaW5kaWNhdGUgY29tcG9uZW50cyBiaXQgZGVwdGggaXMgY29uc3RhbnRcbiIsanAyLT5icGMpOwotCX0KIAotCS8qIGFuZCBsZW5ndGggaXMgcmVsZXZhbnQgKi8KLQlpZiAocF9icGNfaGVhZGVyX3NpemUgIT0ganAyLT5udW1jb21wcykgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQmFkIEJQQ0MgaGVhZGVyIGJveCAoYmFkIHNpemUpXG4iKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9CisgICAgaWYgKGpwMi0+YnBjICE9IDI1NSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgIkEgQlBDQyBoZWFkZXIgYm94IGlzIGF2YWlsYWJsZSBhbHRob3VnaCBCUEMgZ2l2ZW4gYnkgdGhlIElIRFIgYm94ICglZCkgaW5kaWNhdGUgY29tcG9uZW50cyBiaXQgZGVwdGggaXMgY29uc3RhbnRcbiIsCisgICAgICAgICAgICAgICAgICAgICAganAyLT5icGMpOworICAgIH0KIAotCS8qIHJlYWQgaW5mbyBmb3IgZWFjaCBjb21wb25lbnQgKi8KLQlmb3IgKGkgPSAwOyBpIDwganAyLT5udW1jb21wczsgKytpKSB7Ci0JCW9wal9yZWFkX2J5dGVzKHBfYnBjX2hlYWRlcl9kYXRhLCZqcDItPmNvbXBzW2ldLmJwY2MgLDEpOwkvKiByZWFkIGVhY2ggQlBDQyBjb21wb25lbnQgKi8KLQkJKytwX2JwY19oZWFkZXJfZGF0YTsKLQl9CisgICAgLyogYW5kIGxlbmd0aCBpcyByZWxldmFudCAqLworICAgIGlmIChwX2JwY19oZWFkZXJfc2l6ZSAhPSBqcDItPm51bWNvbXBzKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJCYWQgQlBDQyBoZWFkZXIgYm94IChiYWQgc2l6ZSlcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotCXJldHVybiBPUEpfVFJVRTsKKyAgICAvKiByZWFkIGluZm8gZm9yIGVhY2ggY29tcG9uZW50ICovCisgICAgZm9yIChpID0gMDsgaSA8IGpwMi0+bnVtY29tcHM7ICsraSkgeworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2JwY19oZWFkZXJfZGF0YSwgJmpwMi0+Y29tcHNbaV0uYnBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgMSk7ICAvKiByZWFkIGVhY2ggQlBDQyBjb21wb25lbnQgKi8KKyAgICAgICAgKytwX2JwY19oZWFkZXJfZGF0YTsKKyAgICB9CisKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9Ci1zdGF0aWMgT1BKX0JZVEUgKiBvcGpfanAyX3dyaXRlX2NkZWYob3BqX2pwMl90ICpqcDIsIE9QSl9VSU5UMzIgKiBwX25iX2J5dGVzX3dyaXR0ZW4pCitzdGF0aWMgT1BKX0JZVEUgKiBvcGpfanAyX3dyaXRlX2NkZWYob3BqX2pwMl90ICpqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbmJfYnl0ZXNfd3JpdHRlbikKIHsKLQkvKiByb29tIGZvciA4IGJ5dGVzIGZvciBib3gsIDIgZm9yIG4gKi8KLQlPUEpfVUlOVDMyIGxfY2RlZl9zaXplID0gMTA7Ci0JT1BKX0JZVEUgKiBsX2NkZWZfZGF0YSwqIGxfY3VycmVudF9jZGVmX3B0cjsKLQlPUEpfVUlOVDMyIGxfdmFsdWU7Ci0JT1BKX1VJTlQxNiBpOworICAgIC8qIHJvb20gZm9yIDggYnl0ZXMgZm9yIGJveCwgMiBmb3IgbiAqLworICAgIE9QSl9VSU5UMzIgbF9jZGVmX3NpemUgPSAxMDsKKyAgICBPUEpfQllURSAqIGxfY2RlZl9kYXRhLCAqIGxfY3VycmVudF9jZGVmX3B0cjsKKyAgICBPUEpfVUlOVDMyIGxfdmFsdWU7CisgICAgT1BKX1VJTlQxNiBpOwogCi0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChqcDIgIT0gMDApOwotCWFzc2VydChwX25iX2J5dGVzX3dyaXR0ZW4gIT0gMDApOwotCWFzc2VydChqcDItPmNvbG9yLmpwMl9jZGVmICE9IDAwKTsKLQlhc3NlcnQoanAyLT5jb2xvci5qcDJfY2RlZi0+aW5mbyAhPSAwMCk7Ci0JYXNzZXJ0KGpwMi0+Y29sb3IuanAyX2NkZWYtPm4gPiAwVSk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChqcDIgIT0gMDApOworICAgIGFzc2VydChwX25iX2J5dGVzX3dyaXR0ZW4gIT0gMDApOworICAgIGFzc2VydChqcDItPmNvbG9yLmpwMl9jZGVmICE9IDAwKTsKKyAgICBhc3NlcnQoanAyLT5jb2xvci5qcDJfY2RlZi0+aW5mbyAhPSAwMCk7CisgICAgYXNzZXJ0KGpwMi0+Y29sb3IuanAyX2NkZWYtPm4gPiAwVSk7CiAKLQlsX2NkZWZfc2l6ZSArPSA2VSAqIGpwMi0+Y29sb3IuanAyX2NkZWYtPm47CisgICAgbF9jZGVmX3NpemUgKz0gNlUgKiBqcDItPmNvbG9yLmpwMl9jZGVmLT5uOwogCi0JbF9jZGVmX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX21hbGxvYyhsX2NkZWZfc2l6ZSk7Ci0JaWYgKGxfY2RlZl9kYXRhID09IDAwKSB7Ci0JCXJldHVybiAwMDsKLQl9CisgICAgbF9jZGVmX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX21hbGxvYyhsX2NkZWZfc2l6ZSk7CisgICAgaWYgKGxfY2RlZl9kYXRhID09IDAwKSB7CisgICAgICAgIHJldHVybiAwMDsKKyAgICB9CiAKLQlsX2N1cnJlbnRfY2RlZl9wdHIgPSBsX2NkZWZfZGF0YTsKLQkKLQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NkZWZfcHRyLGxfY2RlZl9zaXplLDQpOwkJCS8qIHdyaXRlIGJveCBzaXplICovCi0JbF9jdXJyZW50X2NkZWZfcHRyICs9IDQ7CisgICAgbF9jdXJyZW50X2NkZWZfcHRyID0gbF9jZGVmX2RhdGE7CiAKLQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NkZWZfcHRyLEpQMl9DREVGLDQpOwkJCQkJLyogQlBDQyAqLwotCWxfY3VycmVudF9jZGVmX3B0ciArPSA0OworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfY2RlZl9wdHIsIGxfY2RlZl9zaXplLCA0KTsgICAgICAgIC8qIHdyaXRlIGJveCBzaXplICovCisgICAgbF9jdXJyZW50X2NkZWZfcHRyICs9IDQ7CiAKLQlsX3ZhbHVlID0ganAyLT5jb2xvci5qcDJfY2RlZi0+bjsKLQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NkZWZfcHRyLGxfdmFsdWUsMik7CQkJCQkvKiBOICovCi0JbF9jdXJyZW50X2NkZWZfcHRyICs9IDI7CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9jZGVmX3B0ciwgSlAyX0NERUYsIDQpOyAgICAgICAgICAgICAgIC8qIEJQQ0MgKi8KKyAgICBsX2N1cnJlbnRfY2RlZl9wdHIgKz0gNDsKIAotCWZvciAoaSA9IDBVOyBpIDwganAyLT5jb2xvci5qcDJfY2RlZi0+bjsgKytpKSB7Ci0JCWxfdmFsdWUgPSBqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLmNuOwotCQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NkZWZfcHRyLGxfdmFsdWUsMik7CQkJCQkvKiBDbmkgKi8KLQkJbF9jdXJyZW50X2NkZWZfcHRyICs9IDI7Ci0JCWxfdmFsdWUgPSBqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLnR5cDsKLQkJb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9jZGVmX3B0cixsX3ZhbHVlLDIpOwkJCQkJLyogVHlwaSAqLwotCQlsX2N1cnJlbnRfY2RlZl9wdHIgKz0gMjsKLQkJbF92YWx1ZSA9IGpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm9baV0uYXNvYzsKLQkJb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9jZGVmX3B0cixsX3ZhbHVlLDIpOwkJCQkJLyogQXNvY2kgKi8KLQkJbF9jdXJyZW50X2NkZWZfcHRyICs9IDI7Ci0JfQotCSpwX25iX2J5dGVzX3dyaXR0ZW4gPSBsX2NkZWZfc2l6ZTsKKyAgICBsX3ZhbHVlID0ganAyLT5jb2xvci5qcDJfY2RlZi0+bjsKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NkZWZfcHRyLCBsX3ZhbHVlLCAyKTsgICAgICAgICAgICAgICAgLyogTiAqLworICAgIGxfY3VycmVudF9jZGVmX3B0ciArPSAyOwogCi0JcmV0dXJuIGxfY2RlZl9kYXRhOworICAgIGZvciAoaSA9IDBVOyBpIDwganAyLT5jb2xvci5qcDJfY2RlZi0+bjsgKytpKSB7CisgICAgICAgIGxfdmFsdWUgPSBqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLmNuOworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NkZWZfcHRyLCBsX3ZhbHVlLCAyKTsgICAgICAgICAgICAgICAgLyogQ25pICovCisgICAgICAgIGxfY3VycmVudF9jZGVmX3B0ciArPSAyOworICAgICAgICBsX3ZhbHVlID0ganAyLT5jb2xvci5qcDJfY2RlZi0+aW5mb1tpXS50eXA7CisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfY2RlZl9wdHIsIGxfdmFsdWUsIDIpOyAgICAgICAgICAgICAgICAvKiBUeXBpICovCisgICAgICAgIGxfY3VycmVudF9jZGVmX3B0ciArPSAyOworICAgICAgICBsX3ZhbHVlID0ganAyLT5jb2xvci5qcDJfY2RlZi0+aW5mb1tpXS5hc29jOworICAgICAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NkZWZfcHRyLCBsX3ZhbHVlLCAyKTsgICAgICAgICAgICAgICAgLyogQXNvY2kgKi8KKyAgICAgICAgbF9jdXJyZW50X2NkZWZfcHRyICs9IDI7CisgICAgfQorICAgICpwX25iX2J5dGVzX3dyaXR0ZW4gPSBsX2NkZWZfc2l6ZTsKKworICAgIHJldHVybiBsX2NkZWZfZGF0YTsKIH0KIAotc3RhdGljIE9QSl9CWVRFICogb3BqX2pwMl93cml0ZV9jb2xyKCAgb3BqX2pwMl90ICpqcDIsCi0JCQkJCQkJICAgIE9QSl9VSU5UMzIgKiBwX25iX2J5dGVzX3dyaXR0ZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorc3RhdGljIE9QSl9CWVRFICogb3BqX2pwMl93cml0ZV9jb2xyKG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX25iX2J5dGVzX3dyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLQkvKiByb29tIGZvciA4IGJ5dGVzIGZvciBib3ggMyBmb3IgY29tbW9uIGRhdGEgYW5kIHZhcmlhYmxlIHVwb24gcHJvZmlsZSovCi0JT1BKX1VJTlQzMiBsX2NvbHJfc2l6ZSA9IDExOwotCU9QSl9CWVRFICogbF9jb2xyX2RhdGEsKiBsX2N1cnJlbnRfY29scl9wdHI7CisgICAgLyogcm9vbSBmb3IgOCBieXRlcyBmb3IgYm94IDMgZm9yIGNvbW1vbiBkYXRhIGFuZCB2YXJpYWJsZSB1cG9uIHByb2ZpbGUqLworICAgIE9QSl9VSU5UMzIgbF9jb2xyX3NpemUgPSAxMTsKKyAgICBPUEpfQllURSAqIGxfY29scl9kYXRhLCAqIGxfY3VycmVudF9jb2xyX3B0cjsKIAotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQoanAyICE9IDAwKTsKLQlhc3NlcnQocF9uYl9ieXRlc193cml0dGVuICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KGpwMiAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbmJfYnl0ZXNfd3JpdHRlbiAhPSAwMCk7CiAgICAgYXNzZXJ0KGpwMi0+bWV0aCA9PSAxIHx8IGpwMi0+bWV0aCA9PSAyKTsKIAotCXN3aXRjaCAoanAyLT5tZXRoKSB7IAotCQljYXNlIDEgOgotCQkJbF9jb2xyX3NpemUgKz0gNDsgLyogRW51bUNTICovCi0JCQlicmVhazsKLQkJY2FzZSAyIDoKLSAgICAgICAgICAgIGFzc2VydChqcDItPmNvbG9yLmljY19wcm9maWxlX2xlbik7CS8qIElDQyBwcm9maWxlICovCi0gICAgICAgICAgICBsX2NvbHJfc2l6ZSArPSBqcDItPmNvbG9yLmljY19wcm9maWxlX2xlbjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0IDoKLQkJCXJldHVybiAwMDsKLQl9CisgICAgc3dpdGNoIChqcDItPm1ldGgpIHsKKyAgICBjYXNlIDEgOgorICAgICAgICBsX2NvbHJfc2l6ZSArPSA0OyAvKiBFbnVtQ1MgKi8KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyIDoKKyAgICAgICAgYXNzZXJ0KGpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfbGVuKTsgLyogSUNDIHByb2ZpbGUgKi8KKyAgICAgICAgbF9jb2xyX3NpemUgKz0ganAyLT5jb2xvci5pY2NfcHJvZmlsZV9sZW47CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQgOgorICAgICAgICByZXR1cm4gMDA7CisgICAgfQogCi0JbF9jb2xyX2RhdGEgPSAoT1BKX0JZVEUgKikgb3BqX2NhbGxvYygxLGxfY29scl9zaXplKTsKLQlpZiAobF9jb2xyX2RhdGEgPT0gMDApIHsKLQkJcmV0dXJuIDAwOwotCX0KLQkKLQlsX2N1cnJlbnRfY29scl9wdHIgPSBsX2NvbHJfZGF0YTsKKyAgICBsX2NvbHJfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfY2FsbG9jKDEsIGxfY29scl9zaXplKTsKKyAgICBpZiAobF9jb2xyX2RhdGEgPT0gMDApIHsKKyAgICAgICAgcmV0dXJuIDAwOworICAgIH0KIAotCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfY29scl9wdHIsbF9jb2xyX3NpemUsNCk7CQkJCS8qIHdyaXRlIGJveCBzaXplICovCi0JbF9jdXJyZW50X2NvbHJfcHRyICs9IDQ7Ci0JCi0Jb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9jb2xyX3B0cixKUDJfQ09MUiw0KTsJCQkJCS8qIEJQQ0MgKi8KLQlsX2N1cnJlbnRfY29scl9wdHIgKz0gNDsKLQkKLQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NvbHJfcHRyLCBqcDItPm1ldGgsMSk7CQkJCS8qIE1FVEggKi8KLQkrK2xfY3VycmVudF9jb2xyX3B0cjsKLQkKLQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NvbHJfcHRyLCBqcDItPnByZWNlZGVuY2UsMSk7CQkJLyogUFJFQ0VERU5DRSAqLwotCSsrbF9jdXJyZW50X2NvbHJfcHRyOwotCQotCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfY29scl9wdHIsIGpwMi0+YXBwcm94LDEpOwkJCQkvKiBBUFBST1ggKi8KLQkrK2xfY3VycmVudF9jb2xyX3B0cjsKLQkKLQlpZiAoanAyLT5tZXRoID09IDEpIHsgLyogTWV0aCB2YWx1ZSBpcyByZXN0cmljdGVkIHRvIDEgb3IgMiAoVGFibGUgSS45IG9mIHBhcnQgMSkgKi8KLSAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9jb2xyX3B0ciwganAyLT5lbnVtY3MsNCk7IH0gICAgICAgLyogRW51bUNTICovCisgICAgbF9jdXJyZW50X2NvbHJfcHRyID0gbF9jb2xyX2RhdGE7CisKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NvbHJfcHRyLCBsX2NvbHJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgNCk7ICAgICAgICAgICAgLyogd3JpdGUgYm94IHNpemUgKi8KKyAgICBsX2N1cnJlbnRfY29scl9wdHIgKz0gNDsKKworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfY29scl9wdHIsIEpQMl9DT0xSLCA0KTsgICAgICAgICAgICAgICAvKiBCUENDICovCisgICAgbF9jdXJyZW50X2NvbHJfcHRyICs9IDQ7CisKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2NvbHJfcHRyLCBqcDItPm1ldGgsIDEpOyAgICAgICAgICAgICAgLyogTUVUSCAqLworICAgICsrbF9jdXJyZW50X2NvbHJfcHRyOworCisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9jb2xyX3B0ciwganAyLT5wcmVjZWRlbmNlLCAxKTsgICAgICAgIC8qIFBSRUNFREVOQ0UgKi8KKyAgICArK2xfY3VycmVudF9jb2xyX3B0cjsKKworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfY29scl9wdHIsIGpwMi0+YXBwcm94LCAxKTsgICAgICAgICAgICAvKiBBUFBST1ggKi8KKyAgICArK2xfY3VycmVudF9jb2xyX3B0cjsKKworICAgIGlmIChqcDItPm1ldGggPT0KKyAgICAgICAgICAgIDEpIHsgLyogTWV0aCB2YWx1ZSBpcyByZXN0cmljdGVkIHRvIDEgb3IgMiAoVGFibGUgSS45IG9mIHBhcnQgMSkgKi8KKyAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9jb2xyX3B0ciwganAyLT5lbnVtY3MsIDQpOworICAgIH0gICAgICAgLyogRW51bUNTICovCiAgICAgZWxzZSB7CiAgICAgICAgIGlmIChqcDItPm1ldGggPT0gMikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSUNDIHByb2ZpbGUgKi8KICAgICAgICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IGpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfbGVuOyArK2kpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBqcDItPmNvbG9yLmljY19wcm9maWxlX2xlbjsgKytpKSB7CiAgICAgICAgICAgICAgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9jb2xyX3B0ciwganAyLT5jb2xvci5pY2NfcHJvZmlsZV9idWZbaV0sIDEpOwogICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X2NvbHJfcHRyOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0JfQorICAgIH0KIAotCSpwX25iX2J5dGVzX3dyaXR0ZW4gPSBsX2NvbHJfc2l6ZTsKLQkKLQlyZXR1cm4gbF9jb2xyX2RhdGE7CisgICAgKnBfbmJfYnl0ZXNfd3JpdHRlbiA9IGxfY29scl9zaXplOworCisgICAgcmV0dXJuIGxfY29scl9kYXRhOwogfQogCiBzdGF0aWMgdm9pZCBvcGpfanAyX2ZyZWVfcGNscihvcGpfanAyX2NvbG9yX3QgKmNvbG9yKQpAQCAtODI1LDY2OSArODc4LDczMiBAQAogICAgIG9wal9mcmVlKGNvbG9yLT5qcDJfcGNsci0+Y2hhbm5lbF9zaXplKTsKICAgICBvcGpfZnJlZShjb2xvci0+anAyX3BjbHItPmVudHJpZXMpOwogCi0JaWYoY29sb3ItPmpwMl9wY2xyLT5jbWFwKSBvcGpfZnJlZShjb2xvci0+anAyX3BjbHItPmNtYXApOworICAgIGlmIChjb2xvci0+anAyX3BjbHItPmNtYXApIHsKKyAgICAgICAgb3BqX2ZyZWUoY29sb3ItPmpwMl9wY2xyLT5jbWFwKTsKKyAgICB9CiAKLSAgICBvcGpfZnJlZShjb2xvci0+anAyX3BjbHIpOyBjb2xvci0+anAyX3BjbHIgPSBOVUxMOworICAgIG9wal9mcmVlKGNvbG9yLT5qcDJfcGNscik7CisgICAgY29sb3ItPmpwMl9wY2xyID0gTlVMTDsKIH0KIAotc3RhdGljIE9QSl9CT09MIG9wal9qcDJfY2hlY2tfY29sb3Iob3BqX2ltYWdlX3QgKmltYWdlLCBvcGpfanAyX2NvbG9yX3QgKmNvbG9yLCBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcikKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX2NoZWNrX2NvbG9yKG9wal9pbWFnZV90ICppbWFnZSwgb3BqX2pwMl9jb2xvcl90ICpjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKQogewotCU9QSl9VSU5UMTYgaTsKKyAgICBPUEpfVUlOVDE2IGk7CiAKLQkvKiB0ZXN0Y2FzZSA0MTQ5LnBkZi5TSUdTRUdWLmNmNy4zNTAxICovCi0JaWYgKGNvbG9yLT5qcDJfY2RlZikgewotCQlvcGpfanAyX2NkZWZfaW5mb190ICppbmZvID0gY29sb3ItPmpwMl9jZGVmLT5pbmZvOwotCQlPUEpfVUlOVDE2IG4gPSBjb2xvci0+anAyX2NkZWYtPm47Ci0JCU9QSl9VSU5UMzIgbnJfY2hhbm5lbHMgPSBpbWFnZS0+bnVtY29tcHM7IC8qIEZJWE1FIGltYWdlLT5udW1jb21wcyA9PSBqcDItPm51bWNvbXBzIGJlZm9yZSBjb2xvciBpcyBhcHBsaWVkID8/PyAqLworICAgIC8qIHRlc3RjYXNlIDQxNDkucGRmLlNJR1NFR1YuY2Y3LjM1MDEgKi8KKyAgICBpZiAoY29sb3ItPmpwMl9jZGVmKSB7CisgICAgICAgIG9wal9qcDJfY2RlZl9pbmZvX3QgKmluZm8gPSBjb2xvci0+anAyX2NkZWYtPmluZm87CisgICAgICAgIE9QSl9VSU5UMTYgbiA9IGNvbG9yLT5qcDJfY2RlZi0+bjsKKyAgICAgICAgT1BKX1VJTlQzMiBucl9jaGFubmVscyA9CisgICAgICAgICAgICBpbWFnZS0+bnVtY29tcHM7IC8qIEZJWE1FIGltYWdlLT5udW1jb21wcyA9PSBqcDItPm51bWNvbXBzIGJlZm9yZSBjb2xvciBpcyBhcHBsaWVkID8/PyAqLwogCi0JCS8qIGNkZWYgYXBwbGllcyB0byBjbWFwIGNoYW5uZWxzIGlmIGFueSAqLwotCQlpZiAoY29sb3ItPmpwMl9wY2xyICYmIGNvbG9yLT5qcDJfcGNsci0+Y21hcCkgewotCQkJbnJfY2hhbm5lbHMgPSAoT1BKX1VJTlQzMiljb2xvci0+anAyX3BjbHItPm5yX2NoYW5uZWxzOwotCQl9CisgICAgICAgIC8qIGNkZWYgYXBwbGllcyB0byBjbWFwIGNoYW5uZWxzIGlmIGFueSAqLworICAgICAgICBpZiAoY29sb3ItPmpwMl9wY2xyICYmIGNvbG9yLT5qcDJfcGNsci0+Y21hcCkgeworICAgICAgICAgICAgbnJfY2hhbm5lbHMgPSAoT1BKX1VJTlQzMiljb2xvci0+anAyX3BjbHItPm5yX2NoYW5uZWxzOworICAgICAgICB9CiAKLQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotCQkJaWYgKGluZm9baV0uY24gPj0gbnJfY2hhbm5lbHMpIHsKLQkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSW52YWxpZCBjb21wb25lbnQgaW5kZXggJWQgKD49ICVkKS5cbiIsIGluZm9baV0uY24sIG5yX2NoYW5uZWxzKTsKLQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJfQotCQkJaWYgKGluZm9baV0uYXNvYyA9PSA2NTUzNVUpIGNvbnRpbnVlOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaW5mb1tpXS5jbiA+PSBucl9jaGFubmVscykgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbnZhbGlkIGNvbXBvbmVudCBpbmRleCAlZCAoPj0gJWQpLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9baV0uY24sIG5yX2NoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluZm9baV0uYXNvYyA9PSA2NTUzNVUpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KIAotCQkJaWYgKGluZm9baV0uYXNvYyA+IDAgJiYgKE9QSl9VSU5UMzIpKGluZm9baV0uYXNvYyAtIDEpID49IG5yX2NoYW5uZWxzKSB7Ci0JCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgY29tcG9uZW50IGluZGV4ICVkICg+PSAlZCkuXG4iLCBpbmZvW2ldLmFzb2MgLSAxLCBucl9jaGFubmVscyk7Ci0JCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJCX0KLQkJfQorICAgICAgICAgICAgaWYgKGluZm9baV0uYXNvYyA+IDAgJiYgKE9QSl9VSU5UMzIpKGluZm9baV0uYXNvYyAtIDEpID49IG5yX2NoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgY29tcG9uZW50IGluZGV4ICVkICg+PSAlZCkuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1tpXS5hc29jIC0gMSwgbnJfY2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQkvKiBpc3N1ZSAzOTcgKi8KLQkJLyogSVNPIDE1NDQ0LTEgc3RhdGVzIHRoYXQgaWYgY2RlZiBpcyBwcmVzZW50LCBpdCBzaGFsbCBjb250YWluIGEgY29tcGxldGUgbGlzdCBvZiBjaGFubmVsIGRlZmluaXRpb25zLiAqLwotCQl3aGlsZSAobnJfY2hhbm5lbHMgPiAwKQotCQl7Ci0JCQlmb3IoaSA9IDA7IGkgPCBuOyArK2kpIHsKLQkJCQlpZiAoKE9QSl9VSU5UMzIpaW5mb1tpXS5jbiA9PSAobnJfY2hhbm5lbHMgLSAxVSkpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGkgPT0gbikgewotCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbmNvbXBsZXRlIGNoYW5uZWwgZGVmaW5pdGlvbnMuXG4iKTsKLQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJfQotCQkJLS1ucl9jaGFubmVsczsKLQkJfQotCX0KKyAgICAgICAgLyogaXNzdWUgMzk3ICovCisgICAgICAgIC8qIElTTyAxNTQ0NC0xIHN0YXRlcyB0aGF0IGlmIGNkZWYgaXMgcHJlc2VudCwgaXQgc2hhbGwgY29udGFpbiBhIGNvbXBsZXRlIGxpc3Qgb2YgY2hhbm5lbCBkZWZpbml0aW9ucy4gKi8KKyAgICAgICAgd2hpbGUgKG5yX2NoYW5uZWxzID4gMCkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICAgICAgICAgIGlmICgoT1BKX1VJTlQzMilpbmZvW2ldLmNuID09IChucl9jaGFubmVscyAtIDFVKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaSA9PSBuKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkluY29tcGxldGUgY2hhbm5lbCBkZWZpbml0aW9ucy5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAtLW5yX2NoYW5uZWxzOworICAgICAgICB9CisgICAgfQogCi0JLyogdGVzdGNhc2VzIDQ1MS5wZGYuU0lHU0VHVi5mNGMuMzcyMywgNDUxLnBkZi5TSUdTRUdWLjViNS4zNzIzIGFuZAotCSAgIDY2ZWEzMWFjYmIwZjIzYTJiYmM5MWY2NGQ2OWEwM2Y1X3NpZ25hbF9zaWdzZWd2XzEzOTM3YzBfNzAzMF81NzI1LnBkZiAqLwotCWlmIChjb2xvci0+anAyX3BjbHIgJiYgY29sb3ItPmpwMl9wY2xyLT5jbWFwKSB7Ci0JCU9QSl9VSU5UMTYgbnJfY2hhbm5lbHMgPSBjb2xvci0+anAyX3BjbHItPm5yX2NoYW5uZWxzOwotCQlvcGpfanAyX2NtYXBfY29tcF90ICpjbWFwID0gY29sb3ItPmpwMl9wY2xyLT5jbWFwOwotCQlPUEpfQk9PTCAqcGNvbF91c2FnZSwgaXNfc2FuZSA9IE9QSl9UUlVFOworICAgIC8qIHRlc3RjYXNlcyA0NTEucGRmLlNJR1NFR1YuZjRjLjM3MjMsIDQ1MS5wZGYuU0lHU0VHVi41YjUuMzcyMyBhbmQKKyAgICAgICA2NmVhMzFhY2JiMGYyM2EyYmJjOTFmNjRkNjlhMDNmNV9zaWduYWxfc2lnc2Vndl8xMzkzN2MwXzcwMzBfNTcyNS5wZGYgKi8KKyAgICBpZiAoY29sb3ItPmpwMl9wY2xyICYmIGNvbG9yLT5qcDJfcGNsci0+Y21hcCkgeworICAgICAgICBPUEpfVUlOVDE2IG5yX2NoYW5uZWxzID0gY29sb3ItPmpwMl9wY2xyLT5ucl9jaGFubmVsczsKKyAgICAgICAgb3BqX2pwMl9jbWFwX2NvbXBfdCAqY21hcCA9IGNvbG9yLT5qcDJfcGNsci0+Y21hcDsKKyAgICAgICAgT1BKX0JPT0wgKnBjb2xfdXNhZ2UsIGlzX3NhbmUgPSBPUEpfVFJVRTsKIAotCQkvKiB2ZXJpZnkgdGhhdCBhbGwgb3JpZ2luYWwgY29tcG9uZW50cyBtYXRjaCBhbiBleGlzdGluZyBvbmUgKi8KLQkJZm9yIChpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyBpKyspIHsKLQkJCWlmIChjbWFwW2ldLmNtcCA+PSBpbWFnZS0+bnVtY29tcHMpIHsKLQkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSW52YWxpZCBjb21wb25lbnQgaW5kZXggJWQgKD49ICVkKS5cbiIsIGNtYXBbaV0uY21wLCBpbWFnZS0+bnVtY29tcHMpOwotCQkJCWlzX3NhbmUgPSBPUEpfRkFMU0U7Ci0JCQl9Ci0JCX0KKyAgICAgICAgLyogdmVyaWZ5IHRoYXQgYWxsIG9yaWdpbmFsIGNvbXBvbmVudHMgbWF0Y2ggYW4gZXhpc3Rpbmcgb25lICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucl9jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoY21hcFtpXS5jbXAgPj0gaW1hZ2UtPm51bWNvbXBzKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgY29tcG9uZW50IGluZGV4ICVkICg+PSAlZCkuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21hcFtpXS5jbXAsIGltYWdlLT5udW1jb21wcyk7CisgICAgICAgICAgICAgICAgaXNfc2FuZSA9IE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0JCXBjb2xfdXNhZ2UgPSBvcGpfY2FsbG9jKG5yX2NoYW5uZWxzLCBzaXplb2YoT1BKX0JPT0wpKTsKLQkJaWYgKCFwY29sX3VzYWdlKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiVW5leHBlY3RlZCBPT00uXG4iKTsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQkJLyogdmVyaWZ5IHRoYXQgbm8gY29tcG9uZW50IGlzIHRhcmdldGVkIG1vcmUgdGhhbiBvbmNlICovCi0JCWZvciAoaSA9IDA7IGkgPCBucl9jaGFubmVsczsgaSsrKSB7Ci0JCQlpZiAoY21hcFtpXS5tdHlwICE9IDAgJiYgY21hcFtpXS5tdHlwICE9IDEpIHsKLQkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiVW5leHBlY3RlZCBNVFlQIHZhbHVlLlxuIik7Ci0JCQkJb3BqX2ZyZWUocGNvbF91c2FnZSk7Ci0JCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJCX0KLQkJCU9QSl9VSU5UMTYgcGNvbCA9IGNtYXBbaV0ucGNvbDsKLQkJCWlmIChwY29sID49IG5yX2NoYW5uZWxzKSB7Ci0JCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgY29tcG9uZW50L3BhbGV0dGUgaW5kZXggZm9yIGRpcmVjdCBtYXBwaW5nICVkLlxuIiwgcGNvbCk7Ci0JCQkJaXNfc2FuZSA9IE9QSl9GQUxTRTsKLQkJCX0KLQkJCWVsc2UgaWYgKHBjb2xfdXNhZ2VbcGNvbF0gJiYgY21hcFtpXS5tdHlwICE9IDApIHsKLQkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ29tcG9uZW50ICVkIGlzIG1hcHBlZCB0d2ljZS5cbiIsIHBjb2wpOwotCQkJCWlzX3NhbmUgPSBPUEpfRkFMU0U7Ci0JCQl9Ci0gICAgICBlbHNlIGlmIChjbWFwW2ldLm10eXAgPT0gMCAmJiBjbWFwW2ldLnBjb2wgIT0gMCkgewotICAgICAgICAvKiBJLjUuMy41IFBDT0w6IElmIHRoZSB2YWx1ZSBvZiB0aGUgTVRZUCBmaWVsZCBmb3IgdGhpcyBjaGFubmVsIGlzIDAsIHRoZW4KLSAgICAgICAgICogdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgc2hhbGwgYmUgMC4gKi8KLQkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRGlyZWN0IHVzZSBhdCAjJWQgaG93ZXZlciBwY29sPSVkLlxuIiwgaSwgcGNvbCk7Ci0JCQkJaXNfc2FuZSA9IE9QSl9GQUxTRTsKLSAgICAgIH0KLQkJCWVsc2UKLQkJCQlwY29sX3VzYWdlW3Bjb2xdID0gT1BKX1RSVUU7Ci0JCX0KLQkJLyogdmVyaWZ5IHRoYXQgYWxsIGNvbXBvbmVudHMgYXJlIHRhcmdldGVkIGF0IGxlYXN0IG9uY2UgKi8KLQkJZm9yIChpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyBpKyspIHsKLQkJCWlmICghcGNvbF91c2FnZVtpXSAmJiBjbWFwW2ldLm10eXAgIT0gMCkgewotCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJDb21wb25lbnQgJWQgZG9lc24ndCBoYXZlIGEgbWFwcGluZy5cbiIsIGkpOwotCQkJCWlzX3NhbmUgPSBPUEpfRkFMU0U7Ci0JCQl9Ci0JCX0KLQkJLyogSXNzdWUgMjM1LzQ0NyB3ZWlyZCBjbWFwICovCi0JCWlmICgxICYmIGlzX3NhbmUgJiYgKGltYWdlLT5udW1jb21wcz09MVUpKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgbnJfY2hhbm5lbHM7IGkrKykgewotCQkJCWlmICghcGNvbF91c2FnZVtpXSkgewotCQkJCQlpc19zYW5lID0gMFU7Ci0JCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkNvbXBvbmVudCBtYXBwaW5nIHNlZW1zIHdyb25nLiBUcnlpbmcgdG8gY29ycmVjdC5cbiIsIGkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIWlzX3NhbmUpIHsKLQkJCQlpc19zYW5lID0gT1BKX1RSVUU7Ci0JCQkJZm9yIChpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyBpKyspIHsKLQkJCQkJY21hcFtpXS5tdHlwID0gMVU7Ci0JCQkJCWNtYXBbaV0ucGNvbCA9IChPUEpfQllURSkgaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJb3BqX2ZyZWUocGNvbF91c2FnZSk7Ci0JCWlmICghaXNfc2FuZSkgewotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCX0KKyAgICAgICAgcGNvbF91c2FnZSA9IChPUEpfQk9PTCAqKSBvcGpfY2FsbG9jKG5yX2NoYW5uZWxzLCBzaXplb2YoT1BKX0JPT0wpKTsKKyAgICAgICAgaWYgKCFwY29sX3VzYWdlKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiVW5leHBlY3RlZCBPT00uXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgLyogdmVyaWZ5IHRoYXQgbm8gY29tcG9uZW50IGlzIHRhcmdldGVkIG1vcmUgdGhhbiBvbmNlICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucl9jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICBPUEpfQllURSBtdHlwID0gY21hcFtpXS5tdHlwOworICAgICAgICAgICAgT1BKX0JZVEUgcGNvbCA9IGNtYXBbaV0ucGNvbDsKKyAgICAgICAgICAgIC8qIFNlZSBJU08gMTU0NDQtMSBUYWJsZSBJLjE0IOKAkyBNVFlQaSBmaWVsZCB2YWx1ZXMgKi8KKyAgICAgICAgICAgIGlmIChtdHlwICE9IDAgJiYgbXR5cCAhPSAxKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlIGZvciBjbWFwWyVkXS5tdHlwID0gJWQuXG4iLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXR5cCk7CisgICAgICAgICAgICAgICAgaXNfc2FuZSA9IE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGNvbCA+PSBucl9jaGFubmVscykgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBjb21wb25lbnQvcGFsZXR0ZSBpbmRleCBmb3IgZGlyZWN0IG1hcHBpbmcgJWQuXG4iLCBwY29sKTsKKyAgICAgICAgICAgICAgICBpc19zYW5lID0gT1BKX0ZBTFNFOworICAgICAgICAgICAgfSBlbHNlIGlmIChwY29sX3VzYWdlW3Bjb2xdICYmIG10eXAgPT0gMSkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJDb21wb25lbnQgJWQgaXMgbWFwcGVkIHR3aWNlLlxuIiwgcGNvbCk7CisgICAgICAgICAgICAgICAgaXNfc2FuZSA9IE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobXR5cCA9PSAwICYmIHBjb2wgIT0gMCkgeworICAgICAgICAgICAgICAgIC8qIEkuNS4zLjUgUENPTDogSWYgdGhlIHZhbHVlIG9mIHRoZSBNVFlQIGZpZWxkIGZvciB0aGlzIGNoYW5uZWwgaXMgMCwgdGhlbgorICAgICAgICAgICAgICAgICAqIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIHNoYWxsIGJlIDAuICovCisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkRpcmVjdCB1c2UgYXQgIyVkIGhvd2V2ZXIgcGNvbD0lZC5cbiIsIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY29sKTsKKyAgICAgICAgICAgICAgICBpc19zYW5lID0gT1BKX0ZBTFNFOworICAgICAgICAgICAgfSBlbHNlIGlmIChtdHlwID09IDEgJiYgcGNvbCAhPSBpKSB7CisgICAgICAgICAgICAgICAgLyogT3BlbkpQRUcgaW1wbGVtZW50YXRpb24gbGltaXRhdGlvbi4gU2VlIGFzc2VydChpID09IHBjb2wpOyAqLworICAgICAgICAgICAgICAgIC8qIGluIG9wal9qcDJfYXBwbHlfcGNscigpICovCisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbXBsZW1lbnRhdGlvbiBsaW1pdGF0aW9uOiBmb3IgcGFsZXR0ZSBtYXBwaW5nLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGNvbFslZF0gc2hvdWxkIGJlIGVxdWFsIHRvICVkLCBidXQgaXMgZXF1YWwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvICVkLlxuIiwgaSwgaSwgcGNvbCk7CisgICAgICAgICAgICAgICAgaXNfc2FuZSA9IE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGNvbF91c2FnZVtwY29sXSA9IE9QSl9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8qIHZlcmlmeSB0aGF0IGFsbCBjb21wb25lbnRzIGFyZSB0YXJnZXRlZCBhdCBsZWFzdCBvbmNlICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucl9jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIXBjb2xfdXNhZ2VbaV0gJiYgY21hcFtpXS5tdHlwICE9IDApIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ29tcG9uZW50ICVkIGRvZXNuJ3QgaGF2ZSBhIG1hcHBpbmcuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7CisgICAgICAgICAgICAgICAgaXNfc2FuZSA9IE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBJc3N1ZSAyMzUvNDQ3IHdlaXJkIGNtYXAgKi8KKyAgICAgICAgaWYgKDEgJiYgaXNfc2FuZSAmJiAoaW1hZ2UtPm51bWNvbXBzID09IDFVKSkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBjb2xfdXNhZ2VbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgaXNfc2FuZSA9IDBVOworICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBvbmVudCBtYXBwaW5nIHNlZW1zIHdyb25nLiBUcnlpbmcgdG8gY29ycmVjdC5cbiIsIGkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWlzX3NhbmUpIHsKKyAgICAgICAgICAgICAgICBpc19zYW5lID0gT1BKX1RSVUU7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgY21hcFtpXS5tdHlwID0gMVU7CisgICAgICAgICAgICAgICAgICAgIGNtYXBbaV0ucGNvbCA9IChPUEpfQllURSkgaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb3BqX2ZyZWUocGNvbF91c2FnZSk7CisgICAgICAgIGlmICghaXNfc2FuZSkgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiBPUEpfVFJVRTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKIC8qIGZpbGU5LmpwMiAqLwotc3RhdGljIHZvaWQgb3BqX2pwMl9hcHBseV9wY2xyKG9wal9pbWFnZV90ICppbWFnZSwgb3BqX2pwMl9jb2xvcl90ICpjb2xvcikKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX2FwcGx5X3BjbHIob3BqX2ltYWdlX3QgKmltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfanAyX2NvbG9yX3QgKmNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCiB7Ci0Jb3BqX2ltYWdlX2NvbXBfdCAqb2xkX2NvbXBzLCAqbmV3X2NvbXBzOwotCU9QSl9CWVRFICpjaGFubmVsX3NpemUsICpjaGFubmVsX3NpZ247Ci0JT1BKX1VJTlQzMiAqZW50cmllczsKLQlvcGpfanAyX2NtYXBfY29tcF90ICpjbWFwOwotCU9QSl9JTlQzMiAqc3JjLCAqZHN0OwotCU9QSl9VSU5UMzIgaiwgbWF4OwotCU9QSl9VSU5UMTYgaSwgbnJfY2hhbm5lbHMsIGNtcCwgcGNvbDsKLQlPUEpfSU5UMzIgaywgdG9wX2s7CisgICAgb3BqX2ltYWdlX2NvbXBfdCAqb2xkX2NvbXBzLCAqbmV3X2NvbXBzOworICAgIE9QSl9CWVRFICpjaGFubmVsX3NpemUsICpjaGFubmVsX3NpZ247CisgICAgT1BKX1VJTlQzMiAqZW50cmllczsKKyAgICBvcGpfanAyX2NtYXBfY29tcF90ICpjbWFwOworICAgIE9QSl9JTlQzMiAqc3JjLCAqZHN0OworICAgIE9QSl9VSU5UMzIgaiwgbWF4OworICAgIE9QSl9VSU5UMTYgaSwgbnJfY2hhbm5lbHMsIGNtcCwgcGNvbDsKKyAgICBPUEpfSU5UMzIgaywgdG9wX2s7CiAKLQljaGFubmVsX3NpemUgPSBjb2xvci0+anAyX3BjbHItPmNoYW5uZWxfc2l6ZTsKLQljaGFubmVsX3NpZ24gPSBjb2xvci0+anAyX3BjbHItPmNoYW5uZWxfc2lnbjsKLQllbnRyaWVzID0gY29sb3ItPmpwMl9wY2xyLT5lbnRyaWVzOwotCWNtYXAgPSBjb2xvci0+anAyX3BjbHItPmNtYXA7Ci0JbnJfY2hhbm5lbHMgPSBjb2xvci0+anAyX3BjbHItPm5yX2NoYW5uZWxzOworICAgIGNoYW5uZWxfc2l6ZSA9IGNvbG9yLT5qcDJfcGNsci0+Y2hhbm5lbF9zaXplOworICAgIGNoYW5uZWxfc2lnbiA9IGNvbG9yLT5qcDJfcGNsci0+Y2hhbm5lbF9zaWduOworICAgIGVudHJpZXMgPSBjb2xvci0+anAyX3BjbHItPmVudHJpZXM7CisgICAgY21hcCA9IGNvbG9yLT5qcDJfcGNsci0+Y21hcDsKKyAgICBucl9jaGFubmVscyA9IGNvbG9yLT5qcDJfcGNsci0+bnJfY2hhbm5lbHM7CiAKLQlvbGRfY29tcHMgPSBpbWFnZS0+Y29tcHM7Ci0JLyogT3ZlcmZsb3cgY2hlY2s6IHByZXZlbnQgaW50ZWdlciBvdmVyZmxvdyAqLwotCWZvciAoaSA9IDA7IGkgPCBucl9jaGFubmVsczsgKytpKSB7Ci0JCWNtcCA9IGNtYXBbaV0uY21wOwotCQlpZiAob2xkX2NvbXBzW2NtcF0uaCA9PSAwIHx8IG9sZF9jb21wc1tjbXBdLncgPiAoKE9QSl9VSU5UMzIpLTEpIC8gc2l6ZW9mKE9QSl9JTlQzMikgLyBvbGRfY29tcHNbY21wXS5oKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQluZXdfY29tcHMgPSAob3BqX2ltYWdlX2NvbXBfdCopCi0JCQlvcGpfbWFsbG9jKG5yX2NoYW5uZWxzICogc2l6ZW9mKG9wal9pbWFnZV9jb21wX3QpKTsKLQlpZiAoIW5ld19jb21wcykgewotCQkvKiBGSVhNRSBubyBlcnJvciBjb2RlIGZvciBvcGpfanAyX2FwcGx5X3BjbHIgKi8KLQkJLyogRklYTUUgZXZlbnQgbWFuYWdlciBlcnJvciBjYWxsYmFjayAqLwotCQlyZXR1cm47Ci0JfQotCWZvcihpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyArK2kpIHsKLQkJcGNvbCA9IGNtYXBbaV0ucGNvbDsgY21wID0gY21hcFtpXS5jbXA7Ci0KLQkJLyogRGlyZWN0IHVzZSAqLwotICAgIGlmKGNtYXBbaV0ubXR5cCA9PSAwKXsKLSAgICAgIGFzc2VydCggcGNvbCA9PSAwICk7Ci0gICAgICBuZXdfY29tcHNbaV0gPSBvbGRfY29tcHNbY21wXTsKLSAgICB9IGVsc2UgewotICAgICAgYXNzZXJ0KCBpID09IHBjb2wgKTsgLy8gcHJvYmFibHkgd3Jvbmc/Ci0gICAgICBuZXdfY29tcHNbaV0gPSBvbGRfY29tcHNbY21wXTsKLSAgICB9Ci0KLQkJLyogUGFsZXR0ZSBtYXBwaW5nOiAqLwotCQluZXdfY29tcHNbaV0uZGF0YSA9IChPUEpfSU5UMzIqKQotCQkJCW9wal9tYWxsb2Mob2xkX2NvbXBzW2NtcF0udyAqIG9sZF9jb21wc1tjbXBdLmggKiBzaXplb2YoT1BKX0lOVDMyKSk7Ci0JCWlmICghbmV3X2NvbXBzW2ldLmRhdGEpIHsKLQkJCW9wal9mcmVlKG5ld19jb21wcyk7Ci0JCQluZXdfY29tcHMgPSBOVUxMOwotCQkJLyogRklYTUUgbm8gZXJyb3IgY29kZSBmb3Igb3BqX2pwMl9hcHBseV9wY2xyICovCi0JCQkvKiBGSVhNRSBldmVudCBtYW5hZ2VyIGVycm9yIGNhbGxiYWNrICovCi0JCQlyZXR1cm47Ci0JCX0KLQkJbmV3X2NvbXBzW2ldLnByZWMgPSBjaGFubmVsX3NpemVbaV07Ci0JCW5ld19jb21wc1tpXS5zZ25kID0gY2hhbm5lbF9zaWduW2ldOwotCX0KLQotCXRvcF9rID0gY29sb3ItPmpwMl9wY2xyLT5ucl9lbnRyaWVzIC0gMTsKLQotCWZvcihpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyArK2kpIHsKLQkJLyogUGFsZXR0ZSBtYXBwaW5nOiAqLwotCQljbXAgPSBjbWFwW2ldLmNtcDsgcGNvbCA9IGNtYXBbaV0ucGNvbDsKLQkJc3JjID0gb2xkX2NvbXBzW2NtcF0uZGF0YTsKLQkJZHN0ID0gbmV3X2NvbXBzW2ldLmRhdGE7Ci0JCW1heCA9IG5ld19jb21wc1tpXS53ICogbmV3X2NvbXBzW2ldLmg7Ci0KLQkJLyogUHJldmVudCBudWxsIHBvaW50ZXIgYWNjZXNzICovCi0JCWlmICghc3JjIHx8ICFkc3QpIHsKLQkJCWZvciAoaiA9IDA7IGogPCBucl9jaGFubmVsczsgKytqKSB7Ci0JCQkJb3BqX2ZyZWUobmV3X2NvbXBzW2pdLmRhdGEpOwotCQkJfQotCQkJb3BqX2ZyZWUobmV3X2NvbXBzKTsKLQkJCW5ld19jb21wcyA9IE5VTEw7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKiBEaXJlY3QgdXNlOiAqLwotICAgIGlmKGNtYXBbaV0ubXR5cCA9PSAwKSB7Ci0gICAgICBhc3NlcnQoIGNtcCA9PSAwICk7IC8vIHByb2JhYmx5IHdyb25nLgotICAgICAgZm9yKGogPSAwOyBqIDwgbWF4OyArK2opIHsKLSAgICAgICAgZHN0W2pdID0gc3JjW2pdOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIGFzc2VydCggaSA9PSBwY29sICk7IC8vIHByb2JhYmx5IHdyb25nPwotICAgICAgZm9yKGogPSAwOyBqIDwgbWF4OyArK2opIHsKLSAgICAgICAgLyogVGhlIGluZGV4ICovCi0gICAgICAgIGlmKChrID0gc3JjW2pdKSA8IDApIGsgPSAwOyBlbHNlIGlmKGsgPiB0b3BfaykgayA9IHRvcF9rOwotCi0gICAgICAgIC8qIFRoZSBjb2xvdXIgKi8KLSAgICAgICAgZHN0W2pdID0gKE9QSl9JTlQzMillbnRyaWVzW2sgKiBucl9jaGFubmVscyArIHBjb2xdOworICAgIGZvciAoaSA9IDA7IGkgPCBucl9jaGFubmVsczsgKytpKSB7CisgICAgICAgIC8qIFBhbGV0dGUgbWFwcGluZzogKi8KKyAgICAgICAgY21wID0gY21hcFtpXS5jbXA7CisgICAgICAgIGlmIChpbWFnZS0+Y29tcHNbY21wXS5kYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpbWFnZS0+Y29tcHNbJWRdLmRhdGEgPT0gTlVMTCBpbiBvcGpfanAyX2FwcGx5X3BjbHIoKS5cbiIsIGkpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQogICAgIH0KLQl9CiAKLQltYXggPSBpbWFnZS0+bnVtY29tcHM7Ci0JZm9yKGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKLQkJaWYob2xkX2NvbXBzW2ldLmRhdGEpIG9wal9mcmVlKG9sZF9jb21wc1tpXS5kYXRhKTsKLQl9CisgICAgb2xkX2NvbXBzID0gaW1hZ2UtPmNvbXBzOworICAgIC8qIE92ZXJmbG93IGNoZWNrOiBwcmV2ZW50IGludGVnZXIgb3ZlcmZsb3cgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnJfY2hhbm5lbHM7ICsraSkgeworICAgICAgY21wID0gY21hcFtpXS5jbXA7CisgICAgICBpZiAob2xkX2NvbXBzW2NtcF0uaCA9PSAwIHx8IG9sZF9jb21wc1tjbXBdLncgPiAoKE9QSl9VSU5UMzIpLTEpIC8gc2l6ZW9mKE9QSl9JTlQzMikgLyBvbGRfY29tcHNbY21wXS5oKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICB9CisgICAgfQogCi0Jb3BqX2ZyZWUob2xkX2NvbXBzKTsKLQlpbWFnZS0+Y29tcHMgPSBuZXdfY29tcHM7Ci0JaW1hZ2UtPm51bWNvbXBzID0gbnJfY2hhbm5lbHM7CisgICAgbmV3X2NvbXBzID0gKG9wal9pbWFnZV9jb21wX3QqKQorICAgICAgICAgICAgICAgIG9wal9tYWxsb2MobnJfY2hhbm5lbHMgKiBzaXplb2Yob3BqX2ltYWdlX2NvbXBfdCkpOworICAgIGlmICghbmV3X2NvbXBzKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgaW4gb3BqX2pwMl9hcHBseV9wY2xyKCkuXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyArK2kpIHsKKyAgICAgICAgcGNvbCA9IGNtYXBbaV0ucGNvbDsKKyAgICAgICAgY21wID0gY21hcFtpXS5jbXA7CiAKLQlvcGpfanAyX2ZyZWVfcGNscihjb2xvcik7CisgICAgICAgIC8qIERpcmVjdCB1c2UgKi8KKyAgICAgICAgaWYgKGNtYXBbaV0ubXR5cCA9PSAwKSB7CisgICAgICAgICAgICBhc3NlcnQocGNvbCA9PSAwKTsKKyAgICAgICAgICAgIG5ld19jb21wc1tpXSA9IG9sZF9jb21wc1tjbXBdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KCBpID09IHBjb2wgKTsgLy8gcHJvYmFibHkgd3Jvbmc/CisgICAgICAgICAgICBuZXdfY29tcHNbaV0gPSBvbGRfY29tcHNbY21wXTsKKyAgICAgICAgfQogCisgICAgICAgIC8qIFBhbGV0dGUgbWFwcGluZzogKi8KKyAgICAgICAgbmV3X2NvbXBzW2ldLmRhdGEgPSAoT1BKX0lOVDMyKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfZGF0YV9hbGxvYyhvbGRfY29tcHNbY21wXS53ICogb2xkX2NvbXBzW2NtcF0uaCAqIHNpemVvZihPUEpfSU5UMzIpKTsKKyAgICAgICAgaWYgKCFuZXdfY29tcHNbaV0uZGF0YSkgeworICAgICAgICAgICAgd2hpbGUgKGkgPiAwKSB7CisgICAgICAgICAgICAgICAgLS0gaTsKKyAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfZGF0YV9mcmVlKG5ld19jb21wc1tpXS5kYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wal9mcmVlKG5ld19jb21wcyk7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSBpbiBvcGpfanAyX2FwcGx5X3BjbHIoKS5cbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBuZXdfY29tcHNbaV0ucHJlYyA9IGNoYW5uZWxfc2l6ZVtpXTsKKyAgICAgICAgbmV3X2NvbXBzW2ldLnNnbmQgPSBjaGFubmVsX3NpZ25baV07CisgICAgfQorCisgICAgdG9wX2sgPSBjb2xvci0+anAyX3BjbHItPm5yX2VudHJpZXMgLSAxOworCisgICAgZm9yIChpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyArK2kpIHsKKyAgICAgICAgLyogUGFsZXR0ZSBtYXBwaW5nOiAqLworICAgICAgICBjbXAgPSBjbWFwW2ldLmNtcDsKKyAgICAgICAgcGNvbCA9IGNtYXBbaV0ucGNvbDsKKyAgICAgICAgc3JjID0gb2xkX2NvbXBzW2NtcF0uZGF0YTsKKyAgICAgICAgZHN0ID0gbmV3X2NvbXBzW2ldLmRhdGE7CisgICAgICAgIG1heCA9IG5ld19jb21wc1tpXS53ICogbmV3X2NvbXBzW2ldLmg7CisKKyAgICAgICAgLyogUHJldmVudCBudWxsIHBvaW50ZXIgYWNjZXNzICovCisgICAgICAgIGlmICghc3JjIHx8ICFkc3QpIHsKKyAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnJfY2hhbm5lbHM7ICsraikgeworICAgICAgICAgICAgb3BqX2ltYWdlX2RhdGFfZnJlZShuZXdfY29tcHNbal0uZGF0YSk7CisgICAgICAgICAgfQorICAgICAgICAgIG9wal9mcmVlKG5ld19jb21wcyk7CisgICAgICAgICAgbmV3X2NvbXBzID0gTlVMTDsKKyAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLyogRGlyZWN0IHVzZTogKi8KKyAgICAgICAgaWYgKGNtYXBbaV0ubXR5cCA9PSAwKSB7CisgICAgICAgICAgICBhc3NlcnQoIGNtcCA9PSAwICk7IC8vIHByb2JhYmx5IHdyb25nLgorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG1heDsgKytqKSB7CisgICAgICAgICAgICAgICAgZHN0W2pdID0gc3JjW2pdOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0KCBpID09IHBjb2wgKTsgLy8gcHJvYmFibHkgd3Jvbmc/CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbWF4OyArK2opIHsKKyAgICAgICAgICAgICAgICAvKiBUaGUgaW5kZXggKi8KKyAgICAgICAgICAgICAgICBpZiAoKGsgPSBzcmNbal0pIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBrID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGsgPiB0b3BfaykgeworICAgICAgICAgICAgICAgICAgICBrID0gdG9wX2s7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogVGhlIGNvbG91ciAqLworICAgICAgICAgICAgICAgIGRzdFtqXSA9IChPUEpfSU5UMzIpZW50cmllc1trICogbnJfY2hhbm5lbHMgKyBwY29sXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1heCA9IGltYWdlLT5udW1jb21wczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbWF4OyArK2kpIHsKKyAgICAgICAgaWYgKG9sZF9jb21wc1tpXS5kYXRhKSB7CisgICAgICAgICAgICBvcGpfaW1hZ2VfZGF0YV9mcmVlKG9sZF9jb21wc1tpXS5kYXRhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG9wal9mcmVlKG9sZF9jb21wcyk7CisgICAgaW1hZ2UtPmNvbXBzID0gbmV3X2NvbXBzOworICAgIGltYWdlLT5udW1jb21wcyA9IG5yX2NoYW5uZWxzOworCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfS8qIGFwcGx5X3BjbHIoKSAqLwogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX3BjbHIoCW9wal9qcDJfdCAqanAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9wY2xyX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9wY2xyX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfcGNscihvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfcGNscl9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfcGNscl9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLQlvcGpfanAyX3BjbHJfdCAqanAyX3BjbHI7Ci0JT1BKX0JZVEUgKmNoYW5uZWxfc2l6ZSwgKmNoYW5uZWxfc2lnbjsKLQlPUEpfVUlOVDMyICplbnRyaWVzOwotCU9QSl9VSU5UMTYgbnJfZW50cmllcyxucl9jaGFubmVsczsKLQlPUEpfVUlOVDE2IGksIGo7Ci0JT1BKX1VJTlQzMiBsX3ZhbHVlOwotCU9QSl9CWVRFICpvcmlnX2hlYWRlcl9kYXRhID0gcF9wY2xyX2hlYWRlcl9kYXRhOworICAgIG9wal9qcDJfcGNscl90ICpqcDJfcGNscjsKKyAgICBPUEpfQllURSAqY2hhbm5lbF9zaXplLCAqY2hhbm5lbF9zaWduOworICAgIE9QSl9VSU5UMzIgKmVudHJpZXM7CisgICAgT1BKX1VJTlQxNiBucl9lbnRyaWVzLCBucl9jaGFubmVsczsKKyAgICBPUEpfVUlOVDE2IGksIGo7CisgICAgT1BKX1VJTlQzMiBsX3ZhbHVlOworICAgIE9QSl9CWVRFICpvcmlnX2hlYWRlcl9kYXRhID0gcF9wY2xyX2hlYWRlcl9kYXRhOwogCi0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChwX3BjbHJfaGVhZGVyX2RhdGEgIT0gMDApOwotCWFzc2VydChqcDIgIT0gMDApOwotCWFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9wY2xyX2hlYWRlcl9kYXRhICE9IDAwKTsKKyAgICBhc3NlcnQoanAyICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKICAgICAodm9pZClwX3BjbHJfaGVhZGVyX3NpemU7CiAKLQlpZihqcDItPmNvbG9yLmpwMl9wY2xyKQotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCi0JaWYgKHBfcGNscl9oZWFkZXJfc2l6ZSA8IDMpCi0JCXJldHVybiBPUEpfRkFMU0U7Ci0KLQlvcGpfcmVhZF9ieXRlcyhwX3BjbHJfaGVhZGVyX2RhdGEsICZsX3ZhbHVlICwgMik7CS8qIE5FICovCi0JcF9wY2xyX2hlYWRlcl9kYXRhICs9IDI7Ci0JbnJfZW50cmllcyA9IChPUEpfVUlOVDE2KSBsX3ZhbHVlOwotCWlmICgobnJfZW50cmllcyA9PSAwVSkgfHwgKG5yX2VudHJpZXMgPiAxMDI0VSkpIHsKLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgUENMUiBib3guIFJlcG9ydHMgJWQgZW50cmllc1xuIiwgKGludClucl9lbnRyaWVzKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0KLQlvcGpfcmVhZF9ieXRlcyhwX3BjbHJfaGVhZGVyX2RhdGEsICZsX3ZhbHVlICwgMSk7CS8qIE5QQyAqLwotCSsrcF9wY2xyX2hlYWRlcl9kYXRhOwotCW5yX2NoYW5uZWxzID0gKE9QSl9VSU5UMTYpIGxfdmFsdWU7Ci0JaWYgKG5yX2NoYW5uZWxzID09IDBVKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbnZhbGlkIFBDTFIgYm94LiBSZXBvcnRzIDAgcGFsZXR0ZSBjb2x1bW5zXG4iKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0KLQlpZiAocF9wY2xyX2hlYWRlcl9zaXplIDwgMyArIChPUEpfVUlOVDMyKW5yX2NoYW5uZWxzKQotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCi0JZW50cmllcyA9IChPUEpfVUlOVDMyKikgb3BqX21hbGxvYygoc2l6ZV90KW5yX2NoYW5uZWxzICogbnJfZW50cmllcyAqIHNpemVvZihPUEpfVUlOVDMyKSk7Ci0gICAgaWYgKCFlbnRyaWVzKQorICAgIGlmIChqcDItPmNvbG9yLmpwMl9wY2xyKSB7CiAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0JY2hhbm5lbF9zaXplID0gKE9QSl9CWVRFKikgb3BqX21hbGxvYyhucl9jaGFubmVscyk7Ci0gICAgaWYgKCFjaGFubmVsX3NpemUpCi0gICAgeworICAgIH0KKworICAgIGlmIChwX3BjbHJfaGVhZGVyX3NpemUgPCAzKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgb3BqX3JlYWRfYnl0ZXMocF9wY2xyX2hlYWRlcl9kYXRhLCAmbF92YWx1ZSwgMik7ICAgIC8qIE5FICovCisgICAgcF9wY2xyX2hlYWRlcl9kYXRhICs9IDI7CisgICAgbnJfZW50cmllcyA9IChPUEpfVUlOVDE2KSBsX3ZhbHVlOworICAgIGlmICgobnJfZW50cmllcyA9PSAwVSkgfHwgKG5yX2VudHJpZXMgPiAxMDI0VSkpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgUENMUiBib3guIFJlcG9ydHMgJWQgZW50cmllc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAoaW50KW5yX2VudHJpZXMpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIG9wal9yZWFkX2J5dGVzKHBfcGNscl9oZWFkZXJfZGF0YSwgJmxfdmFsdWUsIDEpOyAgICAvKiBOUEMgKi8KKyAgICArK3BfcGNscl9oZWFkZXJfZGF0YTsKKyAgICBucl9jaGFubmVscyA9IChPUEpfVUlOVDE2KSBsX3ZhbHVlOworICAgIGlmIChucl9jaGFubmVscyA9PSAwVSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIFBDTFIgYm94LiBSZXBvcnRzIDAgcGFsZXR0ZSBjb2x1bW5zXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICBpZiAocF9wY2xyX2hlYWRlcl9zaXplIDwgMyArIChPUEpfVUlOVDMyKW5yX2NoYW5uZWxzKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgZW50cmllcyA9IChPUEpfVUlOVDMyKikgb3BqX21hbGxvYygoc2l6ZV90KW5yX2NoYW5uZWxzICogbnJfZW50cmllcyAqIHNpemVvZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKSk7CisgICAgaWYgKCFlbnRyaWVzKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGNoYW5uZWxfc2l6ZSA9IChPUEpfQllURSopIG9wal9tYWxsb2MobnJfY2hhbm5lbHMpOworICAgIGlmICghY2hhbm5lbF9zaXplKSB7CiAgICAgICAgIG9wal9mcmVlKGVudHJpZXMpOwogICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgIH0KLQljaGFubmVsX3NpZ24gPSAoT1BKX0JZVEUqKSBvcGpfbWFsbG9jKG5yX2NoYW5uZWxzKTsKLQlpZiAoIWNoYW5uZWxfc2lnbikKLQl7CisgICAgY2hhbm5lbF9zaWduID0gKE9QSl9CWVRFKikgb3BqX21hbGxvYyhucl9jaGFubmVscyk7CisgICAgaWYgKCFjaGFubmVsX3NpZ24pIHsKICAgICAgICAgb3BqX2ZyZWUoZW50cmllcyk7CiAgICAgICAgIG9wal9mcmVlKGNoYW5uZWxfc2l6ZSk7CiAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgIH0KIAotCWpwMl9wY2xyID0gKG9wal9qcDJfcGNscl90KilvcGpfbWFsbG9jKHNpemVvZihvcGpfanAyX3BjbHJfdCkpOwotICAgIGlmICghanAyX3BjbHIpCi0gICAgeworICAgIGpwMl9wY2xyID0gKG9wal9qcDJfcGNscl90KilvcGpfbWFsbG9jKHNpemVvZihvcGpfanAyX3BjbHJfdCkpOworICAgIGlmICghanAyX3BjbHIpIHsKICAgICAgICAgb3BqX2ZyZWUoZW50cmllcyk7CiAgICAgICAgIG9wal9mcmVlKGNoYW5uZWxfc2l6ZSk7CiAgICAgICAgIG9wal9mcmVlKGNoYW5uZWxfc2lnbik7CiAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgfQogCi0JanAyX3BjbHItPmNoYW5uZWxfc2lnbiA9IGNoYW5uZWxfc2lnbjsKLQlqcDJfcGNsci0+Y2hhbm5lbF9zaXplID0gY2hhbm5lbF9zaXplOwotCWpwMl9wY2xyLT5lbnRyaWVzID0gZW50cmllczsKLQlqcDJfcGNsci0+bnJfZW50cmllcyA9IG5yX2VudHJpZXM7Ci0JanAyX3BjbHItPm5yX2NoYW5uZWxzID0gKE9QSl9CWVRFKSBsX3ZhbHVlOwotCWpwMl9wY2xyLT5jbWFwID0gTlVMTDsKKyAgICBqcDJfcGNsci0+Y2hhbm5lbF9zaWduID0gY2hhbm5lbF9zaWduOworICAgIGpwMl9wY2xyLT5jaGFubmVsX3NpemUgPSBjaGFubmVsX3NpemU7CisgICAganAyX3BjbHItPmVudHJpZXMgPSBlbnRyaWVzOworICAgIGpwMl9wY2xyLT5ucl9lbnRyaWVzID0gbnJfZW50cmllczsKKyAgICBqcDJfcGNsci0+bnJfY2hhbm5lbHMgPSAoT1BKX0JZVEUpIGxfdmFsdWU7CisgICAganAyX3BjbHItPmNtYXAgPSBOVUxMOwogCi0JanAyLT5jb2xvci5qcDJfcGNsciA9IGpwMl9wY2xyOworICAgIGpwMi0+Y29sb3IuanAyX3BjbHIgPSBqcDJfcGNscjsKIAotCWZvcihpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyArK2kpIHsKLQkJb3BqX3JlYWRfYnl0ZXMocF9wY2xyX2hlYWRlcl9kYXRhLCAmbF92YWx1ZSAsIDEpOwkvKiBCaSAqLwotCQkrK3BfcGNscl9oZWFkZXJfZGF0YTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnJfY2hhbm5lbHM7ICsraSkgeworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX3BjbHJfaGVhZGVyX2RhdGEsICZsX3ZhbHVlLCAxKTsgICAgLyogQmkgKi8KKyAgICAgICAgKytwX3BjbHJfaGVhZGVyX2RhdGE7CiAKLQkJY2hhbm5lbF9zaXplW2ldID0gKE9QSl9CWVRFKSgobF92YWx1ZSAmIDB4N2YpICsgMSk7Ci0JCWNoYW5uZWxfc2lnbltpXSA9IChsX3ZhbHVlICYgMHg4MCkgPyAxIDogMDsKLQl9CisgICAgICAgIGNoYW5uZWxfc2l6ZVtpXSA9IChPUEpfQllURSkoKGxfdmFsdWUgJiAweDdmKSArIDEpOworICAgICAgICBjaGFubmVsX3NpZ25baV0gPSAobF92YWx1ZSAmIDB4ODApID8gMSA6IDA7CisgICAgfQogCi0JZm9yKGogPSAwOyBqIDwgbnJfZW50cmllczsgKytqKSB7Ci0JCWZvcihpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyArK2kpIHsKLQkJCU9QSl9VSU5UMzIgYnl0ZXNfdG9fcmVhZCA9IChPUEpfVUlOVDMyKSgoY2hhbm5lbF9zaXplW2ldKzcpPj4zKTsKKyAgICBmb3IgKGogPSAwOyBqIDwgbnJfZW50cmllczsgKytqKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucl9jaGFubmVsczsgKytpKSB7CisgICAgICAgICAgICBPUEpfVUlOVDMyIGJ5dGVzX3RvX3JlYWQgPSAoT1BKX1VJTlQzMikoKGNoYW5uZWxfc2l6ZVtpXSArIDcpID4+IDMpOwogCi0JCQlpZiAoYnl0ZXNfdG9fcmVhZCA+IHNpemVvZihPUEpfVUlOVDMyKSkKLQkJCQlieXRlc190b19yZWFkID0gc2l6ZW9mKE9QSl9VSU5UMzIpOwotCQkJaWYgKChwdHJkaWZmX3QpcF9wY2xyX2hlYWRlcl9zaXplIDwgKHB0cmRpZmZfdCkocF9wY2xyX2hlYWRlcl9kYXRhIC0gb3JpZ19oZWFkZXJfZGF0YSkgKyAocHRyZGlmZl90KWJ5dGVzX3RvX3JlYWQpCi0JCQkJcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIGlmIChieXRlc190b19yZWFkID4gc2l6ZW9mKE9QSl9VSU5UMzIpKSB7CisgICAgICAgICAgICAgICAgYnl0ZXNfdG9fcmVhZCA9IHNpemVvZihPUEpfVUlOVDMyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgocHRyZGlmZl90KXBfcGNscl9oZWFkZXJfc2l6ZSA8IChwdHJkaWZmX3QpKHBfcGNscl9oZWFkZXJfZGF0YSAtCisgICAgICAgICAgICAgICAgICAgIG9yaWdfaGVhZGVyX2RhdGEpICsgKHB0cmRpZmZfdClieXRlc190b19yZWFkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KIAotCQkJb3BqX3JlYWRfYnl0ZXMocF9wY2xyX2hlYWRlcl9kYXRhLCAmbF92YWx1ZSAsIGJ5dGVzX3RvX3JlYWQpOwkvKiBDamkgKi8KLQkJCXBfcGNscl9oZWFkZXJfZGF0YSArPSBieXRlc190b19yZWFkOwotCQkJKmVudHJpZXMgPSAoT1BKX1VJTlQzMikgbF92YWx1ZTsKLQkJCWVudHJpZXMrKzsKLQkJfQotCX0KKyAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfcGNscl9oZWFkZXJfZGF0YSwgJmxfdmFsdWUsIGJ5dGVzX3RvX3JlYWQpOyAgICAvKiBDamkgKi8KKyAgICAgICAgICAgIHBfcGNscl9oZWFkZXJfZGF0YSArPSBieXRlc190b19yZWFkOworICAgICAgICAgICAgKmVudHJpZXMgPSAoT1BKX1VJTlQzMikgbF92YWx1ZTsKKyAgICAgICAgICAgIGVudHJpZXMrKzsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiBPUEpfVFJVRTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfY21hcCgJb3BqX2pwMl90ICoganAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9jbWFwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jbWFwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfY21hcChvcGpfanAyX3QgKiBqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2NtYXBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2NtYXBfaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0Jb3BqX2pwMl9jbWFwX2NvbXBfdCAqY21hcDsKLQlPUEpfQllURSBpLCBucl9jaGFubmVsczsKLQlPUEpfVUlOVDMyIGxfdmFsdWU7CisgICAgb3BqX2pwMl9jbWFwX2NvbXBfdCAqY21hcDsKKyAgICBPUEpfQllURSBpLCBucl9jaGFubmVsczsKKyAgICBPUEpfVUlOVDMyIGxfdmFsdWU7CiAKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KHBfY21hcF9oZWFkZXJfZGF0YSAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChqcDIgIT0gMDApOworICAgIGFzc2VydChwX2NtYXBfaGVhZGVyX2RhdGEgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogICAgICh2b2lkKXBfY21hcF9oZWFkZXJfc2l6ZTsKIAotCS8qIE5lZWQgbnJfY2hhbm5lbHM6ICovCi0JaWYoanAyLT5jb2xvci5qcDJfcGNsciA9PSBOVUxMKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOZWVkIHRvIHJlYWQgYSBQQ0xSIGJveCBiZWZvcmUgdGhlIENNQVAgYm94LlxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCi0JLyogUGFydCAxLCBJLjUuMy41OiAnVGhlcmUgc2hhbGwgYmUgYXQgbW9zdCBvbmUgQ29tcG9uZW50IE1hcHBpbmcgYm94Ci0JICogaW5zaWRlIGEgSlAyIEhlYWRlciBib3gnIDoKLQkqLwotCWlmKGpwMi0+Y29sb3IuanAyX3BjbHItPmNtYXApIHsKLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk9ubHkgb25lIENNQVAgYm94IGlzIGFsbG93ZWQuXG4iKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0KLQlucl9jaGFubmVscyA9IGpwMi0+Y29sb3IuanAyX3BjbHItPm5yX2NoYW5uZWxzOwotCWlmIChwX2NtYXBfaGVhZGVyX3NpemUgPCAoT1BKX1VJTlQzMilucl9jaGFubmVscyAqIDQpIHsKLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkluc3VmZmljaWVudCBkYXRhIGZvciBDTUFQIGJveC5cbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQotCWNtYXAgPSAob3BqX2pwMl9jbWFwX2NvbXBfdCopIG9wal9tYWxsb2MobnJfY2hhbm5lbHMgKiBzaXplb2Yob3BqX2pwMl9jbWFwX2NvbXBfdCkpOwotICAgIGlmICghY21hcCkKKyAgICAvKiBOZWVkIG5yX2NoYW5uZWxzOiAqLworICAgIGlmIChqcDItPmNvbG9yLmpwMl9wY2xyID09IE5VTEwpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiTmVlZCB0byByZWFkIGEgUENMUiBib3ggYmVmb3JlIHRoZSBDTUFQIGJveC5cbiIpOwogICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIC8qIFBhcnQgMSwgSS41LjMuNTogJ1RoZXJlIHNoYWxsIGJlIGF0IG1vc3Qgb25lIENvbXBvbmVudCBNYXBwaW5nIGJveAorICAgICAqIGluc2lkZSBhIEpQMiBIZWFkZXIgYm94JyA6CisgICAgKi8KKyAgICBpZiAoanAyLT5jb2xvci5qcDJfcGNsci0+Y21hcCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiT25seSBvbmUgQ01BUCBib3ggaXMgYWxsb3dlZC5cbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIG5yX2NoYW5uZWxzID0ganAyLT5jb2xvci5qcDJfcGNsci0+bnJfY2hhbm5lbHM7CisgICAgaWYgKHBfY21hcF9oZWFkZXJfc2l6ZSA8IChPUEpfVUlOVDMyKW5yX2NoYW5uZWxzICogNCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSW5zdWZmaWNpZW50IGRhdGEgZm9yIENNQVAgYm94LlxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgY21hcCA9IChvcGpfanAyX2NtYXBfY29tcF90Kikgb3BqX21hbGxvYyhucl9jaGFubmVscyAqIHNpemVvZigKKyAgICAgICAgICAgICAgICBvcGpfanAyX2NtYXBfY29tcF90KSk7CisgICAgaWYgKCFjbWFwKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCiAKLQlmb3IoaSA9IDA7IGkgPCBucl9jaGFubmVsczsgKytpKSB7Ci0JCW9wal9yZWFkX2J5dGVzX0JFKHBfY21hcF9oZWFkZXJfZGF0YSwgJmxfdmFsdWUsIDIpOwkJCS8qIENNUF5pICovCi0JCXBfY21hcF9oZWFkZXJfZGF0YSArPTI7Ci0JCWNtYXBbaV0uY21wID0gKE9QSl9VSU5UMTYpIGxfdmFsdWU7CisgICAgZm9yIChpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyArK2kpIHsKKyAgICAgICAgb3BqX3JlYWRfYnl0ZXNfQkUocF9jbWFwX2hlYWRlcl9kYXRhLCAmbF92YWx1ZSwgMik7ICAgICAvKiBDTVBeaSAqLworICAgICAgICBwX2NtYXBfaGVhZGVyX2RhdGEgKz0gMjsKKyAgICAgICAgY21hcFtpXS5jbXAgPSAoT1BKX1VJTlQxNikgbF92YWx1ZTsKIAotCQlvcGpfcmVhZF9ieXRlcyhwX2NtYXBfaGVhZGVyX2RhdGEsICZsX3ZhbHVlLCAxKTsJCQkvKiBNVFlQXmkgKi8KLQkJKytwX2NtYXBfaGVhZGVyX2RhdGE7Ci0JCWNtYXBbaV0ubXR5cCA9IChPUEpfQllURSkgbF92YWx1ZTsKKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9jbWFwX2hlYWRlcl9kYXRhLCAmbF92YWx1ZSwgMSk7ICAgICAgICAgICAgLyogTVRZUF5pICovCisgICAgICAgICsrcF9jbWFwX2hlYWRlcl9kYXRhOworICAgICAgICBjbWFwW2ldLm10eXAgPSAoT1BKX0JZVEUpIGxfdmFsdWU7CiAKLQkJb3BqX3JlYWRfYnl0ZXMocF9jbWFwX2hlYWRlcl9kYXRhLCAmbF92YWx1ZSwgMSk7CQkJLyogUENPTF5pICovCi0JCSsrcF9jbWFwX2hlYWRlcl9kYXRhOwotCQljbWFwW2ldLnBjb2wgPSAoT1BKX0JZVEUpIGxfdmFsdWU7Ci0JfQorICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2NtYXBfaGVhZGVyX2RhdGEsICZsX3ZhbHVlLCAxKTsgICAgICAgICAgICAvKiBQQ09MXmkgKi8KKyAgICAgICAgKytwX2NtYXBfaGVhZGVyX2RhdGE7CisgICAgICAgIGNtYXBbaV0ucGNvbCA9IChPUEpfQllURSkgbF92YWx1ZTsKKyAgICB9CiAKLQlqcDItPmNvbG9yLmpwMl9wY2xyLT5jbWFwID0gY21hcDsKKyAgICBqcDItPmNvbG9yLmpwMl9wY2xyLT5jbWFwID0gY21hcDsKIAotCXJldHVybiBPUEpfVFJVRTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyB2b2lkIG9wal9qcDJfYXBwbHlfY2RlZihvcGpfaW1hZ2VfdCAqaW1hZ2UsIG9wal9qcDJfY29sb3JfdCAqY29sb3IsIG9wal9ldmVudF9tZ3JfdCAqbWFuYWdlcikKK3N0YXRpYyB2b2lkIG9wal9qcDJfYXBwbHlfY2RlZihvcGpfaW1hZ2VfdCAqaW1hZ2UsIG9wal9qcDJfY29sb3JfdCAqY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICptYW5hZ2VyKQogewotCW9wal9qcDJfY2RlZl9pbmZvX3QgKmluZm87Ci0JT1BKX1VJTlQxNiBpLCBuLCBjbiwgYXNvYywgYWNuOwotCQotCWluZm8gPSBjb2xvci0+anAyX2NkZWYtPmluZm87Ci0JbiA9IGNvbG9yLT5qcDJfY2RlZi0+bjsKLQkKLQlmb3IoaSA9IDA7IGkgPCBuOyArK2kpCi0JewotCQkvKiBXQVRDSDogYWNuID0gYXNvYyAtIDEgISAqLwotCQlhc29jID0gaW5mb1tpXS5hc29jOwotCQljbiA9IGluZm9baV0uY247Ci0JCQotCQlpZiggY24gPj0gaW1hZ2UtPm51bWNvbXBzKQotCQl7Ci0JCQlvcGpfZXZlbnRfbXNnKG1hbmFnZXIsIEVWVF9XQVJOSU5HLCAib3BqX2pwMl9hcHBseV9jZGVmOiBjbj0lZCwgbnVtY29tcHM9JWRcbiIsIGNuLCBpbWFnZS0+bnVtY29tcHMpOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYoYXNvYyA9PSAwIHx8IGFzb2MgPT0gNjU1MzUpCi0JCXsKLQkJCWltYWdlLT5jb21wc1tjbl0uYWxwaGEgPSBpbmZvW2ldLnR5cDsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCQotCQlhY24gPSAoT1BKX1VJTlQxNikoYXNvYyAtIDEpOwotCQlpZiggYWNuID49IGltYWdlLT5udW1jb21wcyApCi0JCXsKLQkJCW9wal9ldmVudF9tc2cobWFuYWdlciwgRVZUX1dBUk5JTkcsICJvcGpfanAyX2FwcGx5X2NkZWY6IGFjbj0lZCwgbnVtY29tcHM9JWRcbiIsIGFjbiwgaW1hZ2UtPm51bWNvbXBzKTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCQotCQkvKiBTd2FwIG9ubHkgaWYgY29sb3IgY2hhbm5lbCAqLwotCQlpZigoY24gIT0gYWNuKSAmJiAoaW5mb1tpXS50eXAgPT0gMCkpCi0JCXsKLQkJCW9wal9pbWFnZV9jb21wX3Qgc2F2ZWQ7Ci0JCQlPUEpfVUlOVDE2IGo7Ci0JCQkKLQkJCW1lbWNweSgmc2F2ZWQsICZpbWFnZS0+Y29tcHNbY25dLCBzaXplb2Yob3BqX2ltYWdlX2NvbXBfdCkpOwotCQkJbWVtY3B5KCZpbWFnZS0+Y29tcHNbY25dLCAmaW1hZ2UtPmNvbXBzW2Fjbl0sIHNpemVvZihvcGpfaW1hZ2VfY29tcF90KSk7Ci0JCQltZW1jcHkoJmltYWdlLT5jb21wc1thY25dLCAmc2F2ZWQsIHNpemVvZihvcGpfaW1hZ2VfY29tcF90KSk7Ci0JCQkKLQkJCS8qIFN3YXAgY2hhbm5lbHMgaW4gZm9sbG93aW5nIGNoYW5uZWwgZGVmaW5pdGlvbnMsIGRvbid0IGJvdGhlciB3aXRoIGogPD0gaSB0aGF0IGFyZSBhbHJlYWR5IHByb2Nlc3NlZCAqLwotCQkJZm9yIChqID0gKE9QSl9VSU5UMTYpKGkgKyAxVSk7IGogPCBuIDsgKytqKQotCQkJewotCQkJCWlmIChpbmZvW2pdLmNuID09IGNuKSB7Ci0JCQkJCWluZm9bal0uY24gPSBhY247Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGluZm9bal0uY24gPT0gYWNuKSB7Ci0JCQkJCWluZm9bal0uY24gPSBjbjsKLQkJCQl9Ci0JCQkJLyogYXNvYyBpcyByZWxhdGVkIHRvIGNvbG9yIGluZGV4LiBEbyBub3QgdXBkYXRlLiAqLwotCQkJfQotCQl9Ci0JCQotCQlpbWFnZS0+Y29tcHNbY25dLmFscGhhID0gaW5mb1tpXS50eXA7Ci0JfQotCQotCWlmKGNvbG9yLT5qcDJfY2RlZi0+aW5mbykgb3BqX2ZyZWUoY29sb3ItPmpwMl9jZGVmLT5pbmZvKTsKLQkKLQlvcGpfZnJlZShjb2xvci0+anAyX2NkZWYpOyBjb2xvci0+anAyX2NkZWYgPSBOVUxMOwotCQorICAgIG9wal9qcDJfY2RlZl9pbmZvX3QgKmluZm87CisgICAgT1BKX1VJTlQxNiBpLCBuLCBjbiwgYXNvYywgYWNuOworCisgICAgaW5mbyA9IGNvbG9yLT5qcDJfY2RlZi0+aW5mbzsKKyAgICBuID0gY29sb3ItPmpwMl9jZGVmLT5uOworCisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICAvKiBXQVRDSDogYWNuID0gYXNvYyAtIDEgISAqLworICAgICAgICBhc29jID0gaW5mb1tpXS5hc29jOworICAgICAgICBjbiA9IGluZm9baV0uY247CisKKyAgICAgICAgaWYgKGNuID49IGltYWdlLT5udW1jb21wcykgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhtYW5hZ2VyLCBFVlRfV0FSTklORywgIm9wal9qcDJfYXBwbHlfY2RlZjogY249JWQsIG51bWNvbXBzPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjbiwgaW1hZ2UtPm51bWNvbXBzKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChhc29jID09IDAgfHwgYXNvYyA9PSA2NTUzNSkgeworICAgICAgICAgICAgaW1hZ2UtPmNvbXBzW2NuXS5hbHBoYSA9IGluZm9baV0udHlwOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBhY24gPSAoT1BKX1VJTlQxNikoYXNvYyAtIDEpOworICAgICAgICBpZiAoYWNuID49IGltYWdlLT5udW1jb21wcykgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhtYW5hZ2VyLCBFVlRfV0FSTklORywgIm9wal9qcDJfYXBwbHlfY2RlZjogYWNuPSVkLCBudW1jb21wcz0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWNuLCBpbWFnZS0+bnVtY29tcHMpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvKiBTd2FwIG9ubHkgaWYgY29sb3IgY2hhbm5lbCAqLworICAgICAgICBpZiAoKGNuICE9IGFjbikgJiYgKGluZm9baV0udHlwID09IDApKSB7CisgICAgICAgICAgICBvcGpfaW1hZ2VfY29tcF90IHNhdmVkOworICAgICAgICAgICAgT1BKX1VJTlQxNiBqOworCisgICAgICAgICAgICBtZW1jcHkoJnNhdmVkLCAmaW1hZ2UtPmNvbXBzW2NuXSwgc2l6ZW9mKG9wal9pbWFnZV9jb21wX3QpKTsKKyAgICAgICAgICAgIG1lbWNweSgmaW1hZ2UtPmNvbXBzW2NuXSwgJmltYWdlLT5jb21wc1thY25dLCBzaXplb2Yob3BqX2ltYWdlX2NvbXBfdCkpOworICAgICAgICAgICAgbWVtY3B5KCZpbWFnZS0+Y29tcHNbYWNuXSwgJnNhdmVkLCBzaXplb2Yob3BqX2ltYWdlX2NvbXBfdCkpOworCisgICAgICAgICAgICAvKiBTd2FwIGNoYW5uZWxzIGluIGZvbGxvd2luZyBjaGFubmVsIGRlZmluaXRpb25zLCBkb24ndCBib3RoZXIgd2l0aCBqIDw9IGkgdGhhdCBhcmUgYWxyZWFkeSBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgIGZvciAoaiA9IChPUEpfVUlOVDE2KShpICsgMVUpOyBqIDwgbiA7ICsraikgeworICAgICAgICAgICAgICAgIGlmIChpbmZvW2pdLmNuID09IGNuKSB7CisgICAgICAgICAgICAgICAgICAgIGluZm9bal0uY24gPSBhY247CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmZvW2pdLmNuID09IGFjbikgeworICAgICAgICAgICAgICAgICAgICBpbmZvW2pdLmNuID0gY247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIGFzb2MgaXMgcmVsYXRlZCB0byBjb2xvciBpbmRleC4gRG8gbm90IHVwZGF0ZS4gKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGltYWdlLT5jb21wc1tjbl0uYWxwaGEgPSBpbmZvW2ldLnR5cDsKKyAgICB9CisKKyAgICBpZiAoY29sb3ItPmpwMl9jZGVmLT5pbmZvKSB7CisgICAgICAgIG9wal9mcmVlKGNvbG9yLT5qcDJfY2RlZi0+aW5mbyk7CisgICAgfQorCisgICAgb3BqX2ZyZWUoY29sb3ItPmpwMl9jZGVmKTsKKyAgICBjb2xvci0+anAyX2NkZWYgPSBOVUxMOworCiB9LyoganAyX2FwcGx5X2NkZWYoKSAqLwogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2NkZWYoCW9wal9qcDJfdCAqIGpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfY2RlZl9oZWFkZXJfZGF0YSwKLQkJCQkJCQlPUEpfVUlOVDMyIHBfY2RlZl9oZWFkZXJfc2l6ZSwKLQkJCQkJCQlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2NkZWYob3BqX2pwMl90ICoganAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9jZGVmX2hlYWRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jZGVmX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewotCW9wal9qcDJfY2RlZl9pbmZvX3QgKmNkZWZfaW5mbzsKLQlPUEpfVUlOVDE2IGk7Ci0JT1BKX1VJTlQzMiBsX3ZhbHVlOworICAgIG9wal9qcDJfY2RlZl9pbmZvX3QgKmNkZWZfaW5mbzsKKyAgICBPUEpfVUlOVDE2IGk7CisgICAgT1BKX1VJTlQzMiBsX3ZhbHVlOwogCi0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChqcDIgIT0gMDApOwotCWFzc2VydChwX2NkZWZfaGVhZGVyX2RhdGEgIT0gMDApOwotCWFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQoanAyICE9IDAwKTsKKyAgICBhc3NlcnQocF9jZGVmX2hlYWRlcl9kYXRhICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKICAgICAodm9pZClwX2NkZWZfaGVhZGVyX3NpemU7CiAKLQkvKiBQYXJ0IDEsIEkuNS4zLjY6ICdUaGUgc2hhbGwgYmUgYXQgbW9zdCBvbmUgQ2hhbm5lbCBEZWZpbml0aW9uIGJveAotCSAqIGluc2lkZSBhIEpQMiBIZWFkZXIgYm94LicqLwotCWlmKGpwMi0+Y29sb3IuanAyX2NkZWYpIHJldHVybiBPUEpfRkFMU0U7CisgICAgLyogUGFydCAxLCBJLjUuMy42OiAnVGhlIHNoYWxsIGJlIGF0IG1vc3Qgb25lIENoYW5uZWwgRGVmaW5pdGlvbiBib3gKKyAgICAgKiBpbnNpZGUgYSBKUDIgSGVhZGVyIGJveC4nKi8KKyAgICBpZiAoanAyLT5jb2xvci5qcDJfY2RlZikgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotCWlmIChwX2NkZWZfaGVhZGVyX3NpemUgPCAyKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbnN1ZmZpY2llbnQgZGF0YSBmb3IgQ0RFRiBib3guXG4iKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9CisgICAgaWYgKHBfY2RlZl9oZWFkZXJfc2l6ZSA8IDIpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkluc3VmZmljaWVudCBkYXRhIGZvciBDREVGIGJveC5cbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotCW9wal9yZWFkX2J5dGVzKHBfY2RlZl9oZWFkZXJfZGF0YSwmbF92YWx1ZSAsMik7CQkJLyogTiAqLwotCXBfY2RlZl9oZWFkZXJfZGF0YSs9IDI7CisgICAgb3BqX3JlYWRfYnl0ZXMocF9jZGVmX2hlYWRlcl9kYXRhLCAmbF92YWx1ZSwgMik7ICAgICAgICAvKiBOICovCisgICAgcF9jZGVmX2hlYWRlcl9kYXRhICs9IDI7CiAKLQlpZiAoIChPUEpfVUlOVDE2KWxfdmFsdWUgPT0gMCl7IC8qIHN6dWt3MDAwOiBGSVhNRSAqLwotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTnVtYmVyIG9mIGNoYW5uZWwgZGVzY3JpcHRpb24gaXMgZXF1YWwgdG8gemVybyBpbiBDREVGIGJveC5cbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KKyAgICBpZiAoKE9QSl9VSU5UMTYpbF92YWx1ZSA9PSAwKSB7IC8qIHN6dWt3MDAwOiBGSVhNRSAqLworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJOdW1iZXIgb2YgY2hhbm5lbCBkZXNjcmlwdGlvbiBpcyBlcXVhbCB0byB6ZXJvIGluIENERUYgYm94LlxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0JaWYgKHBfY2RlZl9oZWFkZXJfc2l6ZSA8IDIgKyAoT1BKX1VJTlQzMikoT1BKX1VJTlQxNilsX3ZhbHVlICogNikgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSW5zdWZmaWNpZW50IGRhdGEgZm9yIENERUYgYm94LlxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgIGlmIChwX2NkZWZfaGVhZGVyX3NpemUgPCAyICsgKE9QSl9VSU5UMzIpKE9QSl9VSU5UMTYpbF92YWx1ZSAqIDYpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkluc3VmZmljaWVudCBkYXRhIGZvciBDREVGIGJveC5cbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotCWNkZWZfaW5mbyA9IChvcGpfanAyX2NkZWZfaW5mb190Kikgb3BqX21hbGxvYyhsX3ZhbHVlICogc2l6ZW9mKG9wal9qcDJfY2RlZl9pbmZvX3QpKTsKLQlpZiAoIWNkZWZfaW5mbykKLQkJcmV0dXJuIE9QSl9GQUxTRTsKKyAgICBjZGVmX2luZm8gPSAob3BqX2pwMl9jZGVmX2luZm9fdCopIG9wal9tYWxsb2MobF92YWx1ZSAqIHNpemVvZigKKyAgICAgICAgICAgICAgICAgICAgb3BqX2pwMl9jZGVmX2luZm9fdCkpOworICAgIGlmICghY2RlZl9pbmZvKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0JanAyLT5jb2xvci5qcDJfY2RlZiA9IChvcGpfanAyX2NkZWZfdCopb3BqX21hbGxvYyhzaXplb2Yob3BqX2pwMl9jZGVmX3QpKTsKLQlpZighanAyLT5jb2xvci5qcDJfY2RlZikKLQl7Ci0JCW9wal9mcmVlKGNkZWZfaW5mbyk7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCWpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm8gPSBjZGVmX2luZm87Ci0JanAyLT5jb2xvci5qcDJfY2RlZi0+biA9IChPUEpfVUlOVDE2KSBsX3ZhbHVlOworICAgIGpwMi0+Y29sb3IuanAyX2NkZWYgPSAob3BqX2pwMl9jZGVmX3QqKW9wal9tYWxsb2Moc2l6ZW9mKG9wal9qcDJfY2RlZl90KSk7CisgICAgaWYgKCFqcDItPmNvbG9yLmpwMl9jZGVmKSB7CisgICAgICAgIG9wal9mcmVlKGNkZWZfaW5mbyk7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm8gPSBjZGVmX2luZm87CisgICAganAyLT5jb2xvci5qcDJfY2RlZi0+biA9IChPUEpfVUlOVDE2KSBsX3ZhbHVlOwogCi0JZm9yKGkgPSAwOyBpIDwganAyLT5jb2xvci5qcDJfY2RlZi0+bjsgKytpKSB7Ci0JCW9wal9yZWFkX2J5dGVzKHBfY2RlZl9oZWFkZXJfZGF0YSwgJmxfdmFsdWUsIDIpOwkJCS8qIENuXmkgKi8KLQkJcF9jZGVmX2hlYWRlcl9kYXRhICs9MjsKLQkJY2RlZl9pbmZvW2ldLmNuID0gKE9QSl9VSU5UMTYpIGxfdmFsdWU7CisgICAgZm9yIChpID0gMDsgaSA8IGpwMi0+Y29sb3IuanAyX2NkZWYtPm47ICsraSkgeworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2NkZWZfaGVhZGVyX2RhdGEsICZsX3ZhbHVlLCAyKTsgICAgICAgICAgICAvKiBDbl5pICovCisgICAgICAgIHBfY2RlZl9oZWFkZXJfZGF0YSArPSAyOworICAgICAgICBjZGVmX2luZm9baV0uY24gPSAoT1BKX1VJTlQxNikgbF92YWx1ZTsKIAotCQlvcGpfcmVhZF9ieXRlcyhwX2NkZWZfaGVhZGVyX2RhdGEsICZsX3ZhbHVlLCAyKTsJCQkvKiBUeXBeaSAqLwotCQlwX2NkZWZfaGVhZGVyX2RhdGEgKz0yOwotCQljZGVmX2luZm9baV0udHlwID0gKE9QSl9VSU5UMTYpIGxfdmFsdWU7CisgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfY2RlZl9oZWFkZXJfZGF0YSwgJmxfdmFsdWUsIDIpOyAgICAgICAgICAgIC8qIFR5cF5pICovCisgICAgICAgIHBfY2RlZl9oZWFkZXJfZGF0YSArPSAyOworICAgICAgICBjZGVmX2luZm9baV0udHlwID0gKE9QSl9VSU5UMTYpIGxfdmFsdWU7CiAKLQkJb3BqX3JlYWRfYnl0ZXMocF9jZGVmX2hlYWRlcl9kYXRhLCAmbF92YWx1ZSwgMik7CQkJLyogQXNvY15pICovCi0JCXBfY2RlZl9oZWFkZXJfZGF0YSArPTI7Ci0JCWNkZWZfaW5mb1tpXS5hc29jID0gKE9QSl9VSU5UMTYpIGxfdmFsdWU7Ci0gICB9CisgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfY2RlZl9oZWFkZXJfZGF0YSwgJmxfdmFsdWUsIDIpOyAgICAgICAgICAgIC8qIEFzb2NeaSAqLworICAgICAgICBwX2NkZWZfaGVhZGVyX2RhdGEgKz0gMjsKKyAgICAgICAgY2RlZl9pbmZvW2ldLmFzb2MgPSAoT1BKX1VJTlQxNikgbF92YWx1ZTsKKyAgICB9CiAKLQlyZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2NvbHIoIG9wal9qcDJfdCAqanAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9jb2xyX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9jb2xyX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfY29scihvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfY29scl9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfY29scl9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLQlPUEpfVUlOVDMyIGxfdmFsdWU7CisgICAgT1BKX1VJTlQzMiBsX3ZhbHVlOwogCi0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChqcDIgIT0gMDApOwotCWFzc2VydChwX2NvbHJfaGVhZGVyX2RhdGEgIT0gMDApOwotCWFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQoanAyICE9IDAwKTsKKyAgICBhc3NlcnQocF9jb2xyX2hlYWRlcl9kYXRhICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKIAotCWlmIChwX2NvbHJfaGVhZGVyX3NpemUgPCAzKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJCYWQgQ09MUiBoZWFkZXIgYm94IChiYWQgc2l6ZSlcbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KKyAgICBpZiAocF9jb2xyX2hlYWRlcl9zaXplIDwgMykgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQmFkIENPTFIgaGVhZGVyIGJveCAoYmFkIHNpemUpXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLQkvKiBQYXJ0IDEsIEkuNS4zLjMgOiAnQSBjb25mb3JtaW5nIEpQMiByZWFkZXIgc2hhbGwgaWdub3JlIGFsbCBDb2xvdXIKLQkgKiBTcGVjaWZpY2F0aW9uIGJveGVzIGFmdGVyIHRoZSBmaXJzdC4nCi0JKi8KLQlpZihqcDItPmNvbG9yLmpwMl9oYXNfY29scikgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0lORk8sICJBIGNvbmZvcm1pbmcgSlAyIHJlYWRlciBzaGFsbCBpZ25vcmUgYWxsIENvbG91ciBTcGVjaWZpY2F0aW9uIGJveGVzIGFmdGVyIHRoZSBmaXJzdCwgc28gd2UgaWdub3JlIHRoaXMgb25lLlxuIik7Ci0JCXBfY29scl9oZWFkZXJfZGF0YSArPSBwX2NvbHJfaGVhZGVyX3NpemU7Ci0JCXJldHVybiBPUEpfVFJVRTsKLQl9CisgICAgLyogUGFydCAxLCBJLjUuMy4zIDogJ0EgY29uZm9ybWluZyBKUDIgcmVhZGVyIHNoYWxsIGlnbm9yZSBhbGwgQ29sb3VyCisgICAgICogU3BlY2lmaWNhdGlvbiBib3hlcyBhZnRlciB0aGUgZmlyc3QuJworICAgICovCisgICAgaWYgKGpwMi0+Y29sb3IuanAyX2hhc19jb2xyKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAiQSBjb25mb3JtaW5nIEpQMiByZWFkZXIgc2hhbGwgaWdub3JlIGFsbCBDb2xvdXIgU3BlY2lmaWNhdGlvbiBib3hlcyBhZnRlciB0aGUgZmlyc3QsIHNvIHdlIGlnbm9yZSB0aGlzIG9uZS5cbiIpOworICAgICAgICBwX2NvbHJfaGVhZGVyX2RhdGEgKz0gcF9jb2xyX2hlYWRlcl9zaXplOworICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgfQogCi0Jb3BqX3JlYWRfYnl0ZXMocF9jb2xyX2hlYWRlcl9kYXRhLCZqcDItPm1ldGggLDEpOwkJCS8qIE1FVEggKi8KLQkrK3BfY29scl9oZWFkZXJfZGF0YTsKKyAgICBvcGpfcmVhZF9ieXRlcyhwX2NvbHJfaGVhZGVyX2RhdGEsICZqcDItPm1ldGgsIDEpOyAgICAgICAgICAvKiBNRVRIICovCisgICAgKytwX2NvbHJfaGVhZGVyX2RhdGE7CiAKLQlvcGpfcmVhZF9ieXRlcyhwX2NvbHJfaGVhZGVyX2RhdGEsJmpwMi0+cHJlY2VkZW5jZSAsMSk7CQkvKiBQUkVDRURFTkNFICovCi0JKytwX2NvbHJfaGVhZGVyX2RhdGE7CisgICAgb3BqX3JlYWRfYnl0ZXMocF9jb2xyX2hlYWRlcl9kYXRhLCAmanAyLT5wcmVjZWRlbmNlLCAxKTsgICAgLyogUFJFQ0VERU5DRSAqLworICAgICsrcF9jb2xyX2hlYWRlcl9kYXRhOwogCi0Jb3BqX3JlYWRfYnl0ZXMocF9jb2xyX2hlYWRlcl9kYXRhLCZqcDItPmFwcHJveCAsMSk7CQkJLyogQVBQUk9YICovCi0JKytwX2NvbHJfaGVhZGVyX2RhdGE7CisgICAgb3BqX3JlYWRfYnl0ZXMocF9jb2xyX2hlYWRlcl9kYXRhLCAmanAyLT5hcHByb3gsIDEpOyAgICAgICAgLyogQVBQUk9YICovCisgICAgKytwX2NvbHJfaGVhZGVyX2RhdGE7CiAKLQlpZiAoanAyLT5tZXRoID09IDEpIHsKLQkJaWYgKHBfY29scl9oZWFkZXJfc2l6ZSA8IDcpIHsKLQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJCYWQgQ09MUiBoZWFkZXIgYm94IChiYWQgc2l6ZTogJWQpXG4iLCBwX2NvbHJfaGVhZGVyX3NpemUpOwotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCQlpZiAoKHBfY29scl9oZWFkZXJfc2l6ZSA+IDcpICYmIChqcDItPmVudW1jcyAhPSAxNCkpIHsgLyogaGFuZGxlZCBiZWxvdyBmb3IgQ0lFTGFiKSAqLwotCQkJLyogdGVzdGNhc2UgQWx0b25hX1RlY2huaWNhbF92MjBfeDQucGRmICovCi0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJCYWQgQ09MUiBoZWFkZXIgYm94IChiYWQgc2l6ZTogJWQpXG4iLCBwX2NvbHJfaGVhZGVyX3NpemUpOwotCQl9CisgICAgaWYgKGpwMi0+bWV0aCA9PSAxKSB7CisgICAgICAgIGlmIChwX2NvbHJfaGVhZGVyX3NpemUgPCA3KSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQmFkIENPTFIgaGVhZGVyIGJveCAoYmFkIHNpemU6ICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jb2xyX2hlYWRlcl9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChwX2NvbHJfaGVhZGVyX3NpemUgPiA3KSAmJgorICAgICAgICAgICAgICAgIChqcDItPmVudW1jcyAhPSAxNCkpIHsgLyogaGFuZGxlZCBiZWxvdyBmb3IgQ0lFTGFiKSAqLworICAgICAgICAgICAgLyogdGVzdGNhc2UgQWx0b25hX1RlY2huaWNhbF92MjBfeDQucGRmICovCisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJCYWQgQ09MUiBoZWFkZXIgYm94IChiYWQgc2l6ZTogJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NvbHJfaGVhZGVyX3NpemUpOworICAgICAgICB9CiAKLQkJb3BqX3JlYWRfYnl0ZXMocF9jb2xyX2hlYWRlcl9kYXRhLCZqcDItPmVudW1jcyAsNCk7CQkJLyogRW51bUNTICovCisgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfY29scl9oZWFkZXJfZGF0YSwgJmpwMi0+ZW51bWNzLCA0KTsgICAgICAgIC8qIEVudW1DUyAqLwogCi0JCXBfY29scl9oZWFkZXJfZGF0YSArPSA0OworICAgICAgICBwX2NvbHJfaGVhZGVyX2RhdGEgKz0gNDsKIAotCQlpZihqcDItPmVudW1jcyA9PSAxNCkvKiBDSUVMYWIgKi8KLQkJewotCQkJT1BKX1VJTlQzMiAqY2llbGFiOwotCQkJT1BKX1VJTlQzMiBybCwgb2wsIHJhLCBvYSwgcmIsIG9iLCBpbDsKKyAgICAgICAgaWYgKGpwMi0+ZW51bWNzID09IDE0KSB7IC8qIENJRUxhYiAqLworICAgICAgICAgICAgT1BKX1VJTlQzMiAqY2llbGFiOworICAgICAgICAgICAgT1BKX1VJTlQzMiBybCwgb2wsIHJhLCBvYSwgcmIsIG9iLCBpbDsKIAotCQkJY2llbGFiID0gKE9QSl9VSU5UMzIqKW9wal9tYWxsb2MoOSAqIHNpemVvZihPUEpfVUlOVDMyKSk7Ci0JCQljaWVsYWJbMF0gPSAxNDsgLyogZW51bWNzICovCi0JCQkKLQkJCS8qIGRlZmF1bHQgdmFsdWVzICovCi0JCQlybCA9IHJhID0gcmIgPSBvbCA9IG9hID0gb2IgPSAwOwotCQkJaWwgPSAweDAwNDQzNTMwOyAvKiBENTAgKi8KLQkJCWNpZWxhYlsxXSA9IDB4NDQ0NTQ2MDA7LyogREVGICovCisgICAgICAgICAgICBjaWVsYWIgPSAoT1BKX1VJTlQzMiopb3BqX21hbGxvYyg5ICogc2l6ZW9mKE9QSl9VSU5UMzIpKTsKKyAgICAgICAgICAgIGlmIChjaWVsYWIgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgY2llbGFiXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2llbGFiWzBdID0gMTQ7IC8qIGVudW1jcyAqLwogCi0JCQlpZihwX2NvbHJfaGVhZGVyX3NpemUgPT0gMzUpCi0JCQl7Ci0JCQkJb3BqX3JlYWRfYnl0ZXMocF9jb2xyX2hlYWRlcl9kYXRhLCAmcmwsIDQpOwotCQkJCXBfY29scl9oZWFkZXJfZGF0YSArPSA0OwotCQkJCW9wal9yZWFkX2J5dGVzKHBfY29scl9oZWFkZXJfZGF0YSwgJm9sLCA0KTsKLQkJCQlwX2NvbHJfaGVhZGVyX2RhdGEgKz0gNDsKLQkJCQlvcGpfcmVhZF9ieXRlcyhwX2NvbHJfaGVhZGVyX2RhdGEsICZyYSwgNCk7Ci0JCQkJcF9jb2xyX2hlYWRlcl9kYXRhICs9IDQ7Ci0JCQkJb3BqX3JlYWRfYnl0ZXMocF9jb2xyX2hlYWRlcl9kYXRhLCAmb2EsIDQpOwotCQkJCXBfY29scl9oZWFkZXJfZGF0YSArPSA0OwotCQkJCW9wal9yZWFkX2J5dGVzKHBfY29scl9oZWFkZXJfZGF0YSwgJnJiLCA0KTsKLQkJCQlwX2NvbHJfaGVhZGVyX2RhdGEgKz0gNDsKLQkJCQlvcGpfcmVhZF9ieXRlcyhwX2NvbHJfaGVhZGVyX2RhdGEsICZvYiwgNCk7Ci0JCQkJcF9jb2xyX2hlYWRlcl9kYXRhICs9IDQ7Ci0JCQkJb3BqX3JlYWRfYnl0ZXMocF9jb2xyX2hlYWRlcl9kYXRhLCAmaWwsIDQpOwotCQkJCXBfY29scl9oZWFkZXJfZGF0YSArPSA0OwotCQkJCQotCQkJCWNpZWxhYlsxXSA9IDA7Ci0JCQl9Ci0JCQllbHNlIGlmKHBfY29scl9oZWFkZXJfc2l6ZSAhPSA3KQotCQkJewotCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkJhZCBDT0xSIGhlYWRlciBib3ggKENJRUxhYiwgYmFkIHNpemU6ICVkKVxuIiwgcF9jb2xyX2hlYWRlcl9zaXplKTsKLQkJCX0KLQkJCWNpZWxhYlsyXSA9IHJsOyBjaWVsYWJbNF0gPSByYTsgY2llbGFiWzZdID0gcmI7Ci0JCQljaWVsYWJbM10gPSBvbDsgY2llbGFiWzVdID0gb2E7IGNpZWxhYls3XSA9IG9iOwotCQkJY2llbGFiWzhdID0gaWw7CisgICAgICAgICAgICAvKiBkZWZhdWx0IHZhbHVlcyAqLworICAgICAgICAgICAgcmwgPSByYSA9IHJiID0gb2wgPSBvYSA9IG9iID0gMDsKKyAgICAgICAgICAgIGlsID0gMHgwMDQ0MzUzMDsgLyogRDUwICovCisgICAgICAgICAgICBjaWVsYWJbMV0gPSAweDQ0NDU0NjAwOy8qIERFRiAqLwogCi0JCQlqcDItPmNvbG9yLmljY19wcm9maWxlX2J1ZiA9IChPUEpfQllURSopY2llbGFiOwotCQkJanAyLT5jb2xvci5pY2NfcHJvZmlsZV9sZW4gPSAwOwotCQl9Ci0JCWpwMi0+Y29sb3IuanAyX2hhc19jb2xyID0gMTsKLQl9Ci0JZWxzZSBpZiAoanAyLT5tZXRoID09IDIpIHsKLQkJLyogSUNDIHByb2ZpbGUgKi8KLQkJT1BKX0lOVDMyIGl0X2ljY192YWx1ZSA9IDA7Ci0JCU9QSl9JTlQzMiBpY2NfbGVuID0gKE9QSl9JTlQzMilwX2NvbHJfaGVhZGVyX3NpemUgLSAzOworICAgICAgICAgICAgaWYgKHBfY29scl9oZWFkZXJfc2l6ZSA9PSAzNSkgeworICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfY29scl9oZWFkZXJfZGF0YSwgJnJsLCA0KTsKKyAgICAgICAgICAgICAgICBwX2NvbHJfaGVhZGVyX2RhdGEgKz0gNDsKKyAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2NvbHJfaGVhZGVyX2RhdGEsICZvbCwgNCk7CisgICAgICAgICAgICAgICAgcF9jb2xyX2hlYWRlcl9kYXRhICs9IDQ7CisgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9jb2xyX2hlYWRlcl9kYXRhLCAmcmEsIDQpOworICAgICAgICAgICAgICAgIHBfY29scl9oZWFkZXJfZGF0YSArPSA0OworICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfY29scl9oZWFkZXJfZGF0YSwgJm9hLCA0KTsKKyAgICAgICAgICAgICAgICBwX2NvbHJfaGVhZGVyX2RhdGEgKz0gNDsKKyAgICAgICAgICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2NvbHJfaGVhZGVyX2RhdGEsICZyYiwgNCk7CisgICAgICAgICAgICAgICAgcF9jb2xyX2hlYWRlcl9kYXRhICs9IDQ7CisgICAgICAgICAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9jb2xyX2hlYWRlcl9kYXRhLCAmb2IsIDQpOworICAgICAgICAgICAgICAgIHBfY29scl9oZWFkZXJfZGF0YSArPSA0OworICAgICAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfY29scl9oZWFkZXJfZGF0YSwgJmlsLCA0KTsKKyAgICAgICAgICAgICAgICBwX2NvbHJfaGVhZGVyX2RhdGEgKz0gNDsKIAotCQlqcDItPmNvbG9yLmljY19wcm9maWxlX2xlbiA9IChPUEpfVUlOVDMyKWljY19sZW47Ci0JCWpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfYnVmID0gKE9QSl9CWVRFKikgb3BqX2NhbGxvYygxLChzaXplX3QpaWNjX2xlbik7Ci0JCWlmICghanAyLT5jb2xvci5pY2NfcHJvZmlsZV9idWYpCi0JCXsKLQkJCWpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfbGVuID0gMDsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KKyAgICAgICAgICAgICAgICBjaWVsYWJbMV0gPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChwX2NvbHJfaGVhZGVyX3NpemUgIT0gNykgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgQ09MUiBoZWFkZXIgYm94IChDSUVMYWIsIGJhZCBzaXplOiAlZClcbiIsIHBfY29scl9oZWFkZXJfc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaWVsYWJbMl0gPSBybDsKKyAgICAgICAgICAgIGNpZWxhYls0XSA9IHJhOworICAgICAgICAgICAgY2llbGFiWzZdID0gcmI7CisgICAgICAgICAgICBjaWVsYWJbM10gPSBvbDsKKyAgICAgICAgICAgIGNpZWxhYls1XSA9IG9hOworICAgICAgICAgICAgY2llbGFiWzddID0gb2I7CisgICAgICAgICAgICBjaWVsYWJbOF0gPSBpbDsKIAotCQlmb3IgKGl0X2ljY192YWx1ZSA9IDA7IGl0X2ljY192YWx1ZSA8IGljY19sZW47ICsraXRfaWNjX3ZhbHVlKQotCQl7Ci0JCQlvcGpfcmVhZF9ieXRlcyhwX2NvbHJfaGVhZGVyX2RhdGEsJmxfdmFsdWUsMSk7CQkvKiBpY2MgdmFsdWVzICovCi0JCQkrK3BfY29scl9oZWFkZXJfZGF0YTsKLQkJCWpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfYnVmW2l0X2ljY192YWx1ZV0gPSAoT1BKX0JZVEUpIGxfdmFsdWU7Ci0JCX0KLQkgICAgCi0JCWpwMi0+Y29sb3IuanAyX2hhc19jb2xyID0gMTsKLQl9Ci0JZWxzZSBpZiAoanAyLT5tZXRoID4gMikKLQl7Ci0JCS8qCUlTTy9JRUMgMTU0NDQtMToyMDA0IChFKSwgVGFibGUgSS45IExlZ2FsIE1FVEggdmFsdWVzOgotCQljb25mb3JtaW5nIEpQMiByZWFkZXIgc2hhbGwgaWdub3JlIHRoZSBlbnRpcmUgQ29sb3VyIFNwZWNpZmljYXRpb24gYm94LiovCi0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfSU5GTywgIkNPTFIgQk9YIG1ldGggdmFsdWUgaXMgbm90IGEgcmVndWxhciB2YWx1ZSAoJWQpLCAiCi0JCQkic28gd2Ugd2lsbCBpZ25vcmUgdGhlIGVudGlyZSBDb2xvdXIgU3BlY2lmaWNhdGlvbiBib3guIFxuIiwganAyLT5tZXRoKTsKLQl9Ci0JcmV0dXJuIE9QSl9UUlVFOworICAgICAgICAgICAganAyLT5jb2xvci5pY2NfcHJvZmlsZV9idWYgPSAoT1BKX0JZVEUqKWNpZWxhYjsKKyAgICAgICAgICAgIGpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfbGVuID0gMDsKKyAgICAgICAgfQorICAgICAgICBqcDItPmNvbG9yLmpwMl9oYXNfY29sciA9IDE7CisgICAgfSBlbHNlIGlmIChqcDItPm1ldGggPT0gMikgeworICAgICAgICAvKiBJQ0MgcHJvZmlsZSAqLworICAgICAgICBPUEpfSU5UMzIgaXRfaWNjX3ZhbHVlID0gMDsKKyAgICAgICAgT1BKX0lOVDMyIGljY19sZW4gPSAoT1BKX0lOVDMyKXBfY29scl9oZWFkZXJfc2l6ZSAtIDM7CisKKyAgICAgICAganAyLT5jb2xvci5pY2NfcHJvZmlsZV9sZW4gPSAoT1BKX1VJTlQzMilpY2NfbGVuOworICAgICAgICBqcDItPmNvbG9yLmljY19wcm9maWxlX2J1ZiA9IChPUEpfQllURSopIG9wal9jYWxsb2MoMSwgKHNpemVfdClpY2NfbGVuKTsKKyAgICAgICAgaWYgKCFqcDItPmNvbG9yLmljY19wcm9maWxlX2J1ZikgeworICAgICAgICAgICAganAyLT5jb2xvci5pY2NfcHJvZmlsZV9sZW4gPSAwOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaXRfaWNjX3ZhbHVlID0gMDsgaXRfaWNjX3ZhbHVlIDwgaWNjX2xlbjsgKytpdF9pY2NfdmFsdWUpIHsKKyAgICAgICAgICAgIG9wal9yZWFkX2J5dGVzKHBfY29scl9oZWFkZXJfZGF0YSwgJmxfdmFsdWUsIDEpOyAgICAvKiBpY2MgdmFsdWVzICovCisgICAgICAgICAgICArK3BfY29scl9oZWFkZXJfZGF0YTsKKyAgICAgICAgICAgIGpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfYnVmW2l0X2ljY192YWx1ZV0gPSAoT1BKX0JZVEUpIGxfdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBqcDItPmNvbG9yLmpwMl9oYXNfY29sciA9IDE7CisgICAgfSBlbHNlIGlmIChqcDItPm1ldGggPiAyKSB7CisgICAgICAgIC8qICBJU08vSUVDIDE1NDQ0LTE6MjAwNCAoRSksIFRhYmxlIEkuOSBMZWdhbCBNRVRIIHZhbHVlczoKKyAgICAgICAgY29uZm9ybWluZyBKUDIgcmVhZGVyIHNoYWxsIGlnbm9yZSB0aGUgZW50aXJlIENvbG91ciBTcGVjaWZpY2F0aW9uIGJveC4qLworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgIkNPTFIgQk9YIG1ldGggdmFsdWUgaXMgbm90IGEgcmVndWxhciB2YWx1ZSAoJWQpLCAiCisgICAgICAgICAgICAgICAgICAgICAgInNvIHdlIHdpbGwgaWdub3JlIHRoZSBlbnRpcmUgQ29sb3VyIFNwZWNpZmljYXRpb24gYm94LiBcbiIsIGpwMi0+bWV0aCk7CisgICAgfQorICAgIGlmIChqcDItPmNvbG9yLmpwMl9oYXNfY29scikgeworICAgICAgICBqcDItPmoyay0+ZW51bWNzID0ganAyLT5lbnVtY3M7CisgICAgfQorICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAogT1BKX0JPT0wgb3BqX2pwMl9kZWNvZGUob3BqX2pwMl90ICpqcDIsCkBAIC0xNDk1LDI3MSArMTYxMSwyOTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90KiBwX2ltYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQogewotCWlmICghcF9pbWFnZSkKLQkJcmV0dXJuIE9QSl9GQUxTRTsKKyAgICBpZiAoIXBfaW1hZ2UpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLQkvKiBKMksgZGVjb2RpbmcgKi8KLQlpZiggISBvcGpfajJrX2RlY29kZShqcDItPmoyaywgcF9zdHJlYW0sIHBfaW1hZ2UsIHBfbWFuYWdlcikgKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gZGVjb2RlIHRoZSBjb2Rlc3RyZWFtIGluIHRoZSBKUDIgZmlsZVxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgIC8qIEoySyBkZWNvZGluZyAqLworICAgIGlmICghIG9wal9qMmtfZGVjb2RlKGpwMi0+ajJrLCBwX3N0cmVhbSwgcF9pbWFnZSwgcF9tYW5hZ2VyKSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZGVjb2RlIHRoZSBjb2Rlc3RyZWFtIGluIHRoZSBKUDIgZmlsZVxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0JaWYgKCFqcDItPmlnbm9yZV9wY2xyX2NtYXBfY2RlZil7Ci0JCWlmICghb3BqX2pwMl9jaGVja19jb2xvcihwX2ltYWdlLCAmKGpwMi0+Y29sb3IpLCBwX21hbmFnZXIpKSB7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9CisgICAgaWYgKGpwMi0+ajJrLT5tX3NwZWNpZmljX3BhcmFtLm1fZGVjb2Rlci5tX251bWNvbXBzX3RvX2RlY29kZSkgeworICAgICAgICAvKiBCeXBhc3MgYWxsIEpQMiBjb21wb25lbnQgdHJhbnNmb3JtcyAqLworICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgfQogCi0JCS8qIFNldCBJbWFnZSBDb2xvciBTcGFjZSAqLwotCQlpZiAoanAyLT5lbnVtY3MgPT0gMTYpCi0JCQlwX2ltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1JHQjsKLQkJZWxzZSBpZiAoanAyLT5lbnVtY3MgPT0gMTcpCi0JCQlwX2ltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfR1JBWTsKLQkJZWxzZSBpZiAoanAyLT5lbnVtY3MgPT0gMTgpCi0JCQlwX2ltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1lDQzsKLQkJZWxzZSBpZiAoanAyLT5lbnVtY3MgPT0gMjQpCi0JCQlwX2ltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfRVlDQzsKLQkJZWxzZSBpZiAoanAyLT5lbnVtY3MgPT0gMTIpCi0JCQlwX2ltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfQ01ZSzsKLQkJZWxzZQotCQkJcF9pbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX1VOS05PV047CisgICAgaWYgKCFqcDItPmlnbm9yZV9wY2xyX2NtYXBfY2RlZikgeworICAgICAgICBpZiAoIW9wal9qcDJfY2hlY2tfY29sb3IocF9pbWFnZSwgJihqcDItPmNvbG9yKSwgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQogCi0JCWlmKGpwMi0+Y29sb3IuanAyX3BjbHIpIHsKLQkJCS8qIFBhcnQgMSwgSS41LjMuNDogRWl0aGVyIGJvdGggb3Igbm9uZSA6ICovCi0JCQlpZiggIWpwMi0+Y29sb3IuanAyX3BjbHItPmNtYXApCi0JCQkJb3BqX2pwMl9mcmVlX3BjbHIoJihqcDItPmNvbG9yKSk7Ci0JCQllbHNlIGlmIChwX2ltYWdlLT5wZGZpdW1fdXNlX2NvbG9yc3BhY2UpCi0JCQkJb3BqX2pwMl9hcHBseV9wY2xyKHBfaW1hZ2UsICYoanAyLT5jb2xvcikpOwotCQl9CisgICAgICAgIC8qIFNldCBJbWFnZSBDb2xvciBTcGFjZSAqLworICAgICAgICBpZiAoanAyLT5lbnVtY3MgPT0gMTYpIHsKKyAgICAgICAgICAgIHBfaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19TUkdCOworICAgICAgICB9IGVsc2UgaWYgKGpwMi0+ZW51bWNzID09IDE3KSB7CisgICAgICAgICAgICBwX2ltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfR1JBWTsKKyAgICAgICAgfSBlbHNlIGlmIChqcDItPmVudW1jcyA9PSAxOCkgeworICAgICAgICAgICAgcF9pbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX1NZQ0M7CisgICAgICAgIH0gZWxzZSBpZiAoanAyLT5lbnVtY3MgPT0gMjQpIHsKKyAgICAgICAgICAgIHBfaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19FWUNDOworICAgICAgICB9IGVsc2UgaWYgKGpwMi0+ZW51bWNzID09IDEyKSB7CisgICAgICAgICAgICBwX2ltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfQ01ZSzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBfaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19VTktOT1dOOworICAgICAgICB9CiAKLQkJLyogQXBwbHkgdGhlIGNvbG9yIHNwYWNlIGlmIG5lZWRlZCAqLwotCQlpZihqcDItPmNvbG9yLmpwMl9jZGVmKSB7Ci0JCQlvcGpfanAyX2FwcGx5X2NkZWYocF9pbWFnZSwgJihqcDItPmNvbG9yKSwgcF9tYW5hZ2VyKTsKLQkJfQorICAgICAgICBpZiAoanAyLT5jb2xvci5qcDJfcGNscikgeworICAgICAgICAgICAgLyogUGFydCAxLCBJLjUuMy40OiBFaXRoZXIgYm90aCBvciBub25lIDogKi8KKyAgICAgICAgICAgIGlmICghanAyLT5jb2xvci5qcDJfcGNsci0+Y21hcCkgeworICAgICAgICAgICAgICAgIG9wal9qcDJfZnJlZV9wY2xyKCYoanAyLT5jb2xvcikpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwX2ltYWdlLT5wZGZpdW1fdXNlX2NvbG9yc3BhY2UpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW9wal9qcDJfYXBwbHlfcGNscihwX2ltYWdlLCAmKGpwMi0+Y29sb3IpLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CiAKLQkJaWYoanAyLT5jb2xvci5pY2NfcHJvZmlsZV9idWYpIHsKLQkJCXBfaW1hZ2UtPmljY19wcm9maWxlX2J1ZiA9IGpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfYnVmOwotCQkJcF9pbWFnZS0+aWNjX3Byb2ZpbGVfbGVuID0ganAyLT5jb2xvci5pY2NfcHJvZmlsZV9sZW47Ci0JCQlqcDItPmNvbG9yLmljY19wcm9maWxlX2J1ZiA9IE5VTEw7Ci0JCX0KLQl9CisgICAgICAgIC8qIEFwcGx5IHRoZSBjb2xvciBzcGFjZSBpZiBuZWVkZWQgKi8KKyAgICAgICAgaWYgKGpwMi0+Y29sb3IuanAyX2NkZWYpIHsKKyAgICAgICAgICAgIG9wal9qcDJfYXBwbHlfY2RlZihwX2ltYWdlLCAmKGpwMi0+Y29sb3IpLCBwX21hbmFnZXIpOworICAgICAgICB9CiAKLQlyZXR1cm4gT1BKX1RSVUU7CisgICAgICAgIGlmIChqcDItPmNvbG9yLmljY19wcm9maWxlX2J1ZikgeworICAgICAgICAgICAgcF9pbWFnZS0+aWNjX3Byb2ZpbGVfYnVmID0ganAyLT5jb2xvci5pY2NfcHJvZmlsZV9idWY7CisgICAgICAgICAgICBwX2ltYWdlLT5pY2NfcHJvZmlsZV9sZW4gPSBqcDItPmNvbG9yLmljY19wcm9maWxlX2xlbjsKKyAgICAgICAgICAgIGpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfYnVmID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAogc3RhdGljIE9QSl9CT09MIG9wal9qcDJfd3JpdGVfanAyaChvcGpfanAyX3QgKmpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewotCW9wal9qcDJfaW1nX2hlYWRlcl93cml0ZXJfaGFuZGxlcl90IGxfd3JpdGVycyBbNF07Ci0Jb3BqX2pwMl9pbWdfaGVhZGVyX3dyaXRlcl9oYW5kbGVyX3QgKiBsX2N1cnJlbnRfd3JpdGVyOworICAgIG9wal9qcDJfaW1nX2hlYWRlcl93cml0ZXJfaGFuZGxlcl90IGxfd3JpdGVycyBbNF07CisgICAgb3BqX2pwMl9pbWdfaGVhZGVyX3dyaXRlcl9oYW5kbGVyX3QgKiBsX2N1cnJlbnRfd3JpdGVyOwogCi0JT1BKX0lOVDMyIGksIGxfbmJfcGFzczsKLQkvKiBzaXplIG9mIGRhdGEgZm9yIHN1cGVyIGJveCovCi0JT1BKX1VJTlQzMiBsX2pwMmhfc2l6ZSA9IDg7Ci0JT1BKX0JPT0wgbF9yZXN1bHQgPSBPUEpfVFJVRTsKKyAgICBPUEpfSU5UMzIgaSwgbF9uYl9wYXNzOworICAgIC8qIHNpemUgb2YgZGF0YSBmb3Igc3VwZXIgYm94Ki8KKyAgICBPUEpfVUlOVDMyIGxfanAyaF9zaXplID0gODsKKyAgICBPUEpfQk9PTCBsX3Jlc3VsdCA9IE9QSl9UUlVFOwogCi0JLyogdG8gc3RvcmUgdGhlIGRhdGEgb2YgdGhlIHN1cGVyIGJveCAqLwotCU9QSl9CWVRFIGxfanAyaF9kYXRhIFs4XTsKLQkKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KHN0cmVhbSAhPSAwMCk7Ci0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogdG8gc3RvcmUgdGhlIGRhdGEgb2YgdGhlIHN1cGVyIGJveCAqLworICAgIE9QSl9CWVRFIGxfanAyaF9kYXRhIFs4XTsKIAotCW1lbXNldChsX3dyaXRlcnMsMCxzaXplb2YobF93cml0ZXJzKSk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChzdHJlYW0gIT0gMDApOworICAgIGFzc2VydChqcDIgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0JaWYgKGpwMi0+YnBjID09IDI1NSkgewotCQlsX25iX3Bhc3MgPSAzOwotCQlsX3dyaXRlcnNbMF0uaGFuZGxlciA9IG9wal9qcDJfd3JpdGVfaWhkcjsKLQkJbF93cml0ZXJzWzFdLmhhbmRsZXIgPSBvcGpfanAyX3dyaXRlX2JwY2M7Ci0JCWxfd3JpdGVyc1syXS5oYW5kbGVyID0gb3BqX2pwMl93cml0ZV9jb2xyOwotCX0KLQllbHNlIHsKLQkJbF9uYl9wYXNzID0gMjsKLQkJbF93cml0ZXJzWzBdLmhhbmRsZXIgPSBvcGpfanAyX3dyaXRlX2loZHI7Ci0JCWxfd3JpdGVyc1sxXS5oYW5kbGVyID0gb3BqX2pwMl93cml0ZV9jb2xyOwotCX0KLQkKLQlpZiAoanAyLT5jb2xvci5qcDJfY2RlZiAhPSBOVUxMKSB7Ci0JCWxfd3JpdGVyc1tsX25iX3Bhc3NdLmhhbmRsZXIgPSBvcGpfanAyX3dyaXRlX2NkZWY7Ci0JCWxfbmJfcGFzcysrOwotCX0KLQkKLQkvKiB3cml0ZSBib3ggaGVhZGVyICovCi0JLyogd3JpdGUgSlAySCB0eXBlICovCi0Jb3BqX3dyaXRlX2J5dGVzKGxfanAyaF9kYXRhKzQsSlAyX0pQMkgsNCk7CisgICAgbWVtc2V0KGxfd3JpdGVycywgMCwgc2l6ZW9mKGxfd3JpdGVycykpOwogCi0JbF9jdXJyZW50X3dyaXRlciA9IGxfd3JpdGVyczsKLQlmb3IgKGk9MDtpPGxfbmJfcGFzczsrK2kpIHsKLQkJbF9jdXJyZW50X3dyaXRlci0+bV9kYXRhID0gbF9jdXJyZW50X3dyaXRlci0+aGFuZGxlcihqcDIsJihsX2N1cnJlbnRfd3JpdGVyLT5tX3NpemUpKTsKLQkJaWYgKGxfY3VycmVudF93cml0ZXItPm1fZGF0YSA9PSAwMCkgewotCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGhvbGQgSlAyIEhlYWRlciBkYXRhXG4iKTsKLQkJCWxfcmVzdWx0ID0gT1BKX0ZBTFNFOwotCQkJYnJlYWs7Ci0JCX0KKyAgICBpZiAoanAyLT5icGMgPT0gMjU1KSB7CisgICAgICAgIGxfbmJfcGFzcyA9IDM7CisgICAgICAgIGxfd3JpdGVyc1swXS5oYW5kbGVyID0gb3BqX2pwMl93cml0ZV9paGRyOworICAgICAgICBsX3dyaXRlcnNbMV0uaGFuZGxlciA9IG9wal9qcDJfd3JpdGVfYnBjYzsKKyAgICAgICAgbF93cml0ZXJzWzJdLmhhbmRsZXIgPSBvcGpfanAyX3dyaXRlX2NvbHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbF9uYl9wYXNzID0gMjsKKyAgICAgICAgbF93cml0ZXJzWzBdLmhhbmRsZXIgPSBvcGpfanAyX3dyaXRlX2loZHI7CisgICAgICAgIGxfd3JpdGVyc1sxXS5oYW5kbGVyID0gb3BqX2pwMl93cml0ZV9jb2xyOworICAgIH0KIAotCQlsX2pwMmhfc2l6ZSArPSBsX2N1cnJlbnRfd3JpdGVyLT5tX3NpemU7Ci0JCSsrbF9jdXJyZW50X3dyaXRlcjsKLQl9CisgICAgaWYgKGpwMi0+Y29sb3IuanAyX2NkZWYgIT0gTlVMTCkgeworICAgICAgICBsX3dyaXRlcnNbbF9uYl9wYXNzXS5oYW5kbGVyID0gb3BqX2pwMl93cml0ZV9jZGVmOworICAgICAgICBsX25iX3Bhc3MrKzsKKyAgICB9CiAKLQlpZiAoISBsX3Jlc3VsdCkgewotCQlsX2N1cnJlbnRfd3JpdGVyID0gbF93cml0ZXJzOwotCQlmb3IgKGk9MDtpPGxfbmJfcGFzczsrK2kpIHsKLQkJCWlmIChsX2N1cnJlbnRfd3JpdGVyLT5tX2RhdGEgIT0gMDApIHsKLQkJCQlvcGpfZnJlZShsX2N1cnJlbnRfd3JpdGVyLT5tX2RhdGEgKTsKLQkJCX0KLQkJCSsrbF9jdXJyZW50X3dyaXRlcjsKLQkJfQorICAgIC8qIHdyaXRlIGJveCBoZWFkZXIgKi8KKyAgICAvKiB3cml0ZSBKUDJIIHR5cGUgKi8KKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9qcDJoX2RhdGEgKyA0LCBKUDJfSlAySCwgNCk7CiAKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9CisgICAgbF9jdXJyZW50X3dyaXRlciA9IGxfd3JpdGVyczsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbF9uYl9wYXNzOyArK2kpIHsKKyAgICAgICAgbF9jdXJyZW50X3dyaXRlci0+bV9kYXRhID0gbF9jdXJyZW50X3dyaXRlci0+aGFuZGxlcihqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYobF9jdXJyZW50X3dyaXRlci0+bV9zaXplKSk7CisgICAgICAgIGlmIChsX2N1cnJlbnRfd3JpdGVyLT5tX2RhdGEgPT0gMDApIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIG1lbW9yeSB0byBob2xkIEpQMiBIZWFkZXIgZGF0YVxuIik7CisgICAgICAgICAgICBsX3Jlc3VsdCA9IE9QSl9GQUxTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAKLQkvKiB3cml0ZSBzdXBlciBib3ggc2l6ZSAqLwotCW9wal93cml0ZV9ieXRlcyhsX2pwMmhfZGF0YSxsX2pwMmhfc2l6ZSw0KTsKLQkKLQkvKiB3cml0ZSBzdXBlciBib3ggZGF0YSBvbiBzdHJlYW0gKi8KLQlpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHN0cmVhbSxsX2pwMmhfZGF0YSw4LHBfbWFuYWdlcikgIT0gOCkgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIGVycm9yIHdoaWxlIHdyaXRpbmcgSlAyIEhlYWRlciBib3hcbiIpOwotCQlsX3Jlc3VsdCA9IE9QSl9GQUxTRTsKLQl9Ci0JCi0JaWYgKGxfcmVzdWx0KSB7Ci0JCWxfY3VycmVudF93cml0ZXIgPSBsX3dyaXRlcnM7Ci0JCWZvciAoaT0wO2k8bF9uYl9wYXNzOysraSkgewotCQkJaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShzdHJlYW0sbF9jdXJyZW50X3dyaXRlci0+bV9kYXRhLGxfY3VycmVudF93cml0ZXItPm1fc2l6ZSxwX21hbmFnZXIpICE9IGxfY3VycmVudF93cml0ZXItPm1fc2l6ZSkgewotCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJTdHJlYW0gZXJyb3Igd2hpbGUgd3JpdGluZyBKUDIgSGVhZGVyIGJveFxuIik7Ci0JCQkJbF9yZXN1bHQgPSBPUEpfRkFMU0U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQkrK2xfY3VycmVudF93cml0ZXI7Ci0JCX0KLQl9CisgICAgICAgIGxfanAyaF9zaXplICs9IGxfY3VycmVudF93cml0ZXItPm1fc2l6ZTsKKyAgICAgICAgKytsX2N1cnJlbnRfd3JpdGVyOworICAgIH0KIAotCWxfY3VycmVudF93cml0ZXIgPSBsX3dyaXRlcnM7Ci0JCi0JLyogY2xlYW51cCAqLwotCWZvciAoaT0wO2k8bF9uYl9wYXNzOysraSkgewotCQlpZiAobF9jdXJyZW50X3dyaXRlci0+bV9kYXRhICE9IDAwKSB7Ci0JCQlvcGpfZnJlZShsX2N1cnJlbnRfd3JpdGVyLT5tX2RhdGEgKTsKLQkJfQotCQkrK2xfY3VycmVudF93cml0ZXI7Ci0JfQorICAgIGlmICghIGxfcmVzdWx0KSB7CisgICAgICAgIGxfY3VycmVudF93cml0ZXIgPSBsX3dyaXRlcnM7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsX25iX3Bhc3M7ICsraSkgeworICAgICAgICAgICAgaWYgKGxfY3VycmVudF93cml0ZXItPm1fZGF0YSAhPSAwMCkgeworICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF93cml0ZXItPm1fZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2xfY3VycmVudF93cml0ZXI7CisgICAgICAgIH0KIAotCXJldHVybiBsX3Jlc3VsdDsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICAvKiB3cml0ZSBzdXBlciBib3ggc2l6ZSAqLworICAgIG9wal93cml0ZV9ieXRlcyhsX2pwMmhfZGF0YSwgbF9qcDJoX3NpemUsIDQpOworCisgICAgLyogd3JpdGUgc3VwZXIgYm94IGRhdGEgb24gc3RyZWFtICovCisgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShzdHJlYW0sIGxfanAyaF9kYXRhLCA4LCBwX21hbmFnZXIpICE9IDgpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiU3RyZWFtIGVycm9yIHdoaWxlIHdyaXRpbmcgSlAyIEhlYWRlciBib3hcbiIpOworICAgICAgICBsX3Jlc3VsdCA9IE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICBpZiAobF9yZXN1bHQpIHsKKyAgICAgICAgbF9jdXJyZW50X3dyaXRlciA9IGxfd3JpdGVyczsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxfbmJfcGFzczsgKytpKSB7CisgICAgICAgICAgICBpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKHN0cmVhbSwgbF9jdXJyZW50X3dyaXRlci0+bV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfd3JpdGVyLT5tX3NpemUsIHBfbWFuYWdlcikgIT0gbF9jdXJyZW50X3dyaXRlci0+bV9zaXplKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdHJlYW0gZXJyb3Igd2hpbGUgd3JpdGluZyBKUDIgSGVhZGVyIGJveFxuIik7CisgICAgICAgICAgICAgICAgbF9yZXN1bHQgPSBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2xfY3VycmVudF93cml0ZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsX2N1cnJlbnRfd3JpdGVyID0gbF93cml0ZXJzOworCisgICAgLyogY2xlYW51cCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsX25iX3Bhc3M7ICsraSkgeworICAgICAgICBpZiAobF9jdXJyZW50X3dyaXRlci0+bV9kYXRhICE9IDAwKSB7CisgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfd3JpdGVyLT5tX2RhdGEpOworICAgICAgICB9CisgICAgICAgICsrbF9jdXJyZW50X3dyaXRlcjsKKyAgICB9CisKKyAgICByZXR1cm4gbF9yZXN1bHQ7CiB9CiAKIHN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3dyaXRlX2Z0eXAob3BqX2pwMl90ICpqcDIsCi0JCQkJCQkJb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKLQkJCQkJCQlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCiB7Ci0JT1BKX1VJTlQzMiBpOwotCU9QSl9VSU5UMzIgbF9mdHlwX3NpemUgPSAxNiArIDQgKiBqcDItPm51bWNsOwotCU9QSl9CWVRFICogbF9mdHlwX2RhdGEsICogbF9jdXJyZW50X2RhdGFfcHRyOwotCU9QSl9CT09MIGxfcmVzdWx0OworICAgIE9QSl9VSU5UMzIgaTsKKyAgICBPUEpfVUlOVDMyIGxfZnR5cF9zaXplOworICAgIE9QSl9CWVRFICogbF9mdHlwX2RhdGEsICogbF9jdXJyZW50X2RhdGFfcHRyOworICAgIE9QSl9CT09MIGxfcmVzdWx0OwogCi0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChjaW8gIT0gMDApOwotCWFzc2VydChqcDIgIT0gMDApOwotCWFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQoY2lvICE9IDAwKTsKKyAgICBhc3NlcnQoanAyICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICBsX2Z0eXBfc2l6ZSA9IDE2ICsgNCAqIGpwMi0+bnVtY2w7CiAKLQlsX2Z0eXBfZGF0YSA9IChPUEpfQllURSAqKSBvcGpfY2FsbG9jKDEsbF9mdHlwX3NpemUpOwotCQotCWlmIChsX2Z0eXBfZGF0YSA9PSAwMCkgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGZ0eXAgZGF0YVxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgIGxfZnR5cF9kYXRhID0gKE9QSl9CWVRFICopIG9wal9jYWxsb2MoMSwgbF9mdHlwX3NpemUpOwogCi0JbF9jdXJyZW50X2RhdGFfcHRyID0gbF9mdHlwX2RhdGE7CisgICAgaWYgKGxfZnR5cF9kYXRhID09IDAwKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBoYW5kbGUgZnR5cCBkYXRhXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLQlvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGFfcHRyLCBsX2Z0eXBfc2l6ZSw0KTsgLyogYm94IHNpemUgKi8KLQlsX2N1cnJlbnRfZGF0YV9wdHIgKz0gNDsKKyAgICBsX2N1cnJlbnRfZGF0YV9wdHIgPSBsX2Z0eXBfZGF0YTsKIAotCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YV9wdHIsIEpQMl9GVFlQLDQpOyAvKiBGVFlQICovCi0JbF9jdXJyZW50X2RhdGFfcHRyICs9IDQ7CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhX3B0ciwgbF9mdHlwX3NpemUsIDQpOyAvKiBib3ggc2l6ZSAqLworICAgIGxfY3VycmVudF9kYXRhX3B0ciArPSA0OwogCi0Jb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhX3B0ciwganAyLT5icmFuZCw0KTsgLyogQlIgKi8KLQlsX2N1cnJlbnRfZGF0YV9wdHIgKz0gNDsKKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGFfcHRyLCBKUDJfRlRZUCwgNCk7IC8qIEZUWVAgKi8KKyAgICBsX2N1cnJlbnRfZGF0YV9wdHIgKz0gNDsKIAotCW9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YV9wdHIsIGpwMi0+bWludmVyc2lvbiw0KTsgLyogTWluViAqLwotCWxfY3VycmVudF9kYXRhX3B0ciArPSA0OworICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YV9wdHIsIGpwMi0+YnJhbmQsIDQpOyAvKiBCUiAqLworICAgIGxfY3VycmVudF9kYXRhX3B0ciArPSA0OwogCi0JZm9yIChpID0gMDsgaSA8IGpwMi0+bnVtY2w7IGkrKykgIHsKLQkJb3BqX3dyaXRlX2J5dGVzKGxfY3VycmVudF9kYXRhX3B0ciwganAyLT5jbFtpXSw0KTsJLyogQ0wgKi8KLQl9Ci0JCi0JbF9yZXN1bHQgPSAob3BqX3N0cmVhbV93cml0ZV9kYXRhKGNpbyxsX2Z0eXBfZGF0YSxsX2Z0eXBfc2l6ZSxwX21hbmFnZXIpID09IGxfZnR5cF9zaXplKTsKLQlpZiAoISBsX3Jlc3VsdCkKLQl7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3aGlsZSB3cml0aW5nIGZ0eXAgZGF0YSB0byBzdHJlYW1cbiIpOwotCX0KKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9jdXJyZW50X2RhdGFfcHRyLCBqcDItPm1pbnZlcnNpb24sIDQpOyAvKiBNaW5WICovCisgICAgbF9jdXJyZW50X2RhdGFfcHRyICs9IDQ7CiAKLQlvcGpfZnJlZShsX2Z0eXBfZGF0YSk7Ci0JCi0JcmV0dXJuIGxfcmVzdWx0OworICAgIGZvciAoaSA9IDA7IGkgPCBqcDItPm51bWNsOyBpKyspICB7CisgICAgICAgIG9wal93cml0ZV9ieXRlcyhsX2N1cnJlbnRfZGF0YV9wdHIsIGpwMi0+Y2xbaV0sIDQpOyAvKiBDTCAqLworICAgIH0KKworICAgIGxfcmVzdWx0ID0gKG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sIGxfZnR5cF9kYXRhLCBsX2Z0eXBfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSA9PSBsX2Z0eXBfc2l6ZSk7CisgICAgaWYgKCEgbF9yZXN1bHQpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgd3JpdGluZyBmdHlwIGRhdGEgdG8gc3RyZWFtXG4iKTsKKyAgICB9CisKKyAgICBvcGpfZnJlZShsX2Z0eXBfZGF0YSk7CisKKyAgICByZXR1cm4gbF9yZXN1bHQ7CiB9CiAKIHN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3dyaXRlX2pwMmMob3BqX2pwMl90ICpqcDIsCi0JCQkJCQkJb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKLQkJCQkJCQlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCiB7Ci0JT1BKX09GRl9UIGoya19jb2Rlc3RyZWFtX2V4aXQ7Ci0JT1BKX0JZVEUgbF9kYXRhX2hlYWRlciBbOF07Ci0JCi0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChqcDIgIT0gMDApOwotCWFzc2VydChjaW8gIT0gMDApOwotCWFzc2VydChwX21hbmFnZXIgIT0gMDApOwotCWFzc2VydChvcGpfc3RyZWFtX2hhc19zZWVrKGNpbykpOwotCQotCWoya19jb2Rlc3RyZWFtX2V4aXQgPSBvcGpfc3RyZWFtX3RlbGwoY2lvKTsKLQlvcGpfd3JpdGVfYnl0ZXMobF9kYXRhX2hlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgKE9QSl9VSU5UMzIpIChqMmtfY29kZXN0cmVhbV9leGl0IC0ganAyLT5qMmtfY29kZXN0cmVhbV9vZmZzZXQpLAorICAgIE9QSl9PRkZfVCBqMmtfY29kZXN0cmVhbV9leGl0OworICAgIE9QSl9CWVRFIGxfZGF0YV9oZWFkZXIgWzhdOworCisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChqcDIgIT0gMDApOworICAgIGFzc2VydChjaW8gIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIGFzc2VydChvcGpfc3RyZWFtX2hhc19zZWVrKGNpbykpOworCisgICAgajJrX2NvZGVzdHJlYW1fZXhpdCA9IG9wal9zdHJlYW1fdGVsbChjaW8pOworICAgIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMikoajJrX2NvZGVzdHJlYW1fZXhpdCAtIGpwMi0+ajJrX2NvZGVzdHJlYW1fb2Zmc2V0KSwKICAgICAgICAgICAgICAgICAgICAgNCk7IC8qIHNpemUgb2YgY29kZXN0cmVhbSAqLwotCW9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyICsgNCxKUDJfSlAyQyw0KTsJCQkJCQkJCQkgICAvKiBKUDJDICovCisgICAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIgKyA0LCBKUDJfSlAyQywKKyAgICAgICAgICAgICAgICAgICAgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEpQMkMgKi8KIAotCWlmICghIG9wal9zdHJlYW1fc2VlayhjaW8sanAyLT5qMmtfY29kZXN0cmVhbV9vZmZzZXQscF9tYW5hZ2VyKSkgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIHNlZWsgaW4gdGhlIHN0cmVhbS5cbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQkKLQlpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKGNpbyxsX2RhdGFfaGVhZGVyLDgscF9tYW5hZ2VyKSAhPSA4KSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gc2VlayBpbiB0aGUgc3RyZWFtLlxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgIGlmICghIG9wal9zdHJlYW1fc2VlayhjaW8sIGpwMi0+ajJrX2NvZGVzdHJlYW1fb2Zmc2V0LCBwX21hbmFnZXIpKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gc2VlayBpbiB0aGUgc3RyZWFtLlxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0JaWYgKCEgb3BqX3N0cmVhbV9zZWVrKGNpbyxqMmtfY29kZXN0cmVhbV9leGl0LHBfbWFuYWdlcikpIHsKLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBzZWVrIGluIHRoZSBzdHJlYW0uXG4iKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9CisgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sIGxfZGF0YV9oZWFkZXIsIDgsIHBfbWFuYWdlcikgIT0gOCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIHNlZWsgaW4gdGhlIHN0cmVhbS5cbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotCXJldHVybiBPUEpfVFJVRTsKKyAgICBpZiAoISBvcGpfc3RyZWFtX3NlZWsoY2lvLCBqMmtfY29kZXN0cmVhbV9leGl0LCBwX21hbmFnZXIpKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gc2VlayBpbiB0aGUgc3RyZWFtLlxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl93cml0ZV9qcCgJb3BqX2pwMl90ICpqcDIsCi0JCQkgICAgCQkgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKLQkJCQkgICAgCQlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQorc3RhdGljIE9QSl9CT09MIG9wal9qcDJfd3JpdGVfanAob3BqX2pwMl90ICpqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQogewotCS8qIDEyIGJ5dGVzIHdpbGwgYmUgcmVhZCAqLwotCU9QSl9CWVRFIGxfc2lnbmF0dXJlX2RhdGEgWzEyXTsKKyAgICAvKiAxMiBieXRlcyB3aWxsIGJlIHJlYWQgKi8KKyAgICBPUEpfQllURSBsX3NpZ25hdHVyZV9kYXRhIFsxMl07CiAKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KGNpbyAhPSAwMCk7Ci0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChjaW8gIT0gMDApOworICAgIGFzc2VydChqcDIgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0JLyogd3JpdGUgYm94IGxlbmd0aCAqLwotCW9wal93cml0ZV9ieXRlcyhsX3NpZ25hdHVyZV9kYXRhLDEyLDQpOwotCS8qIHdyaXRlcyBib3ggdHlwZSAqLwotCW9wal93cml0ZV9ieXRlcyhsX3NpZ25hdHVyZV9kYXRhKzQsSlAyX0pQLDQpOwotCS8qIHdyaXRlcyBtYWdpYyBudW1iZXIqLwotCW9wal93cml0ZV9ieXRlcyhsX3NpZ25hdHVyZV9kYXRhKzgsMHgwZDBhODcwYSw0KTsKLQkKLQlpZiAob3BqX3N0cmVhbV93cml0ZV9kYXRhKGNpbyxsX3NpZ25hdHVyZV9kYXRhLDEyLHBfbWFuYWdlcikgIT0gMTIpIHsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9CisgICAgT1BKX1VOVVNFRChqcDIpOwogCi0JcmV0dXJuIE9QSl9UUlVFOworICAgIC8qIHdyaXRlIGJveCBsZW5ndGggKi8KKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9zaWduYXR1cmVfZGF0YSwgMTIsIDQpOworICAgIC8qIHdyaXRlcyBib3ggdHlwZSAqLworICAgIG9wal93cml0ZV9ieXRlcyhsX3NpZ25hdHVyZV9kYXRhICsgNCwgSlAyX0pQLCA0KTsKKyAgICAvKiB3cml0ZXMgbWFnaWMgbnVtYmVyKi8KKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9zaWduYXR1cmVfZGF0YSArIDgsIDB4MGQwYTg3MGEsIDQpOworCisgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sIGxfc2lnbmF0dXJlX2RhdGEsIDEyLCBwX21hbmFnZXIpICE9IDEyKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTc2OCw1NzggKzE5MDQsNjQ1IEBACiAKIHZvaWQgb3BqX2pwMl9zZXR1cF9kZWNvZGVyKG9wal9qcDJfdCAqanAyLCBvcGpfZHBhcmFtZXRlcnNfdCAqcGFyYW1ldGVycykKIHsKLQkvKiBzZXR1cCB0aGUgSjJLIGNvZGVjICovCi0Jb3BqX2oya19zZXR1cF9kZWNvZGVyKGpwMi0+ajJrLCBwYXJhbWV0ZXJzKTsKKyAgICAvKiBzZXR1cCB0aGUgSjJLIGNvZGVjICovCisgICAgb3BqX2oya19zZXR1cF9kZWNvZGVyKGpwMi0+ajJrLCBwYXJhbWV0ZXJzKTsKIAotCS8qIGZ1cnRoZXIgSlAyIGluaXRpYWxpemF0aW9ucyBnbyBoZXJlICovCi0JanAyLT5jb2xvci5qcDJfaGFzX2NvbHIgPSAwOwotCWpwMi0+Y29tcHMgPSBOVUxMOwotICAgIGpwMi0+aWdub3JlX3BjbHJfY21hcF9jZGVmID0gcGFyYW1ldGVycy0+ZmxhZ3MgJiBPUEpfRFBBUkFNRVRFUlNfSUdOT1JFX1BDTFJfQ01BUF9DREVGX0ZMQUc7CisgICAgLyogZnVydGhlciBKUDIgaW5pdGlhbGl6YXRpb25zIGdvIGhlcmUgKi8KKyAgICBqcDItPmNvbG9yLmpwMl9oYXNfY29sciA9IDA7CisgICAganAyLT5jb21wcyA9IE5VTEw7CisgICAganAyLT5pZ25vcmVfcGNscl9jbWFwX2NkZWYgPSBwYXJhbWV0ZXJzLT5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRFBBUkFNRVRFUlNfSUdOT1JFX1BDTFJfQ01BUF9DREVGX0ZMQUc7Cit9CisKK09QSl9CT09MIG9wal9qcDJfc2V0X3RocmVhZHMob3BqX2pwMl90ICpqcDIsIE9QSl9VSU5UMzIgbnVtX3RocmVhZHMpCit7CisgICAgcmV0dXJuIG9wal9qMmtfc2V0X3RocmVhZHMoanAyLT5qMmssIG51bV90aHJlYWRzKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIEpQMiBlbmNvZGVyIGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1PUEpfQk9PTCBvcGpfanAyX3NldHVwX2VuY29kZXIoCW9wal9qcDJfdCAqanAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jcGFyYW1ldGVyc190ICpwYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90ICppbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCitPUEpfQk9PTCBvcGpfanAyX3NldHVwX2VuY29kZXIob3BqX2pwMl90ICpqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKmltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKIHsKLQlPUEpfVUlOVDMyIGk7Ci0JT1BKX1VJTlQzMiBkZXB0aF8wOwotICBPUEpfVUlOVDMyIHNpZ247Ci0JT1BKX1VJTlQzMiBhbHBoYV9jb3VudDsKLQlPUEpfVUlOVDMyIGNvbG9yX2NoYW5uZWxzID0gMFU7Ci0JT1BKX1VJTlQzMiBhbHBoYV9jaGFubmVsID0gMFU7Ci0JCisgICAgT1BKX1VJTlQzMiBpOworICAgIE9QSl9VSU5UMzIgZGVwdGhfMDsKKyAgICBPUEpfVUlOVDMyIHNpZ247CisgICAgT1BKX1VJTlQzMiBhbHBoYV9jb3VudDsKKyAgICBPUEpfVUlOVDMyIGNvbG9yX2NoYW5uZWxzID0gMFU7CisgICAgT1BKX1VJTlQzMiBhbHBoYV9jaGFubmVsID0gMFU7CiAKLQlpZighanAyIHx8ICFwYXJhbWV0ZXJzIHx8ICFpbWFnZSkKLQkJcmV0dXJuIE9QSl9GQUxTRTsKIAotCS8qIHNldHVwIHRoZSBKMksgY29kZWMgKi8KLQkvKiAtLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQkvKiBDaGVjayBpZiBudW1iZXIgb2YgY29tcG9uZW50cyByZXNwZWN0cyBzdGFuZGFyZCAqLwotCWlmIChpbWFnZS0+bnVtY29tcHMgPCAxIHx8IGltYWdlLT5udW1jb21wcyA+IDE2Mzg0KSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJJbnZhbGlkIG51bWJlciBvZiBjb21wb25lbnRzIHNwZWNpZmllZCB3aGlsZSBzZXR0aW5nIHVwIEpQMiBlbmNvZGVyXG4iKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0KLQlpZiAob3BqX2oya19zZXR1cF9lbmNvZGVyKGpwMi0+ajJrLCBwYXJhbWV0ZXJzLCBpbWFnZSwgcF9tYW5hZ2VyICkgPT0gT1BKX0ZBTFNFKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCi0JLyogc2V0dXAgdGhlIEpQMiBjb2RlYyAqLwotCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQkKLQkvKiBQcm9maWxlIGJveCAqLwotCi0JanAyLT5icmFuZCA9IEpQMl9KUDI7CS8qIEJSICovCi0JanAyLT5taW52ZXJzaW9uID0gMDsJLyogTWluViAqLwotCWpwMi0+bnVtY2wgPSAxOwotCWpwMi0+Y2wgPSAoT1BKX1VJTlQzMiopIG9wal9tYWxsb2MoanAyLT5udW1jbCAqIHNpemVvZihPUEpfVUlOVDMyKSk7Ci0JaWYgKCFqcDItPmNsKXsKLQkJanAyLT5jbCA9IE5VTEw7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB3aGVuIHNldHVwIHRoZSBKUDIgZW5jb2RlclxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCWpwMi0+Y2xbMF0gPSBKUDJfSlAyOwkvKiBDTDAgOiBKUDIgKi8KLQotCS8qIEltYWdlIEhlYWRlciBib3ggKi8KLQotCWpwMi0+bnVtY29tcHMgPSBpbWFnZS0+bnVtY29tcHM7CS8qIE5DICovCi0JanAyLT5jb21wcyA9IChvcGpfanAyX2NvbXBzX3QqKSBvcGpfbWFsbG9jKGpwMi0+bnVtY29tcHMgKiBzaXplb2Yob3BqX2pwMl9jb21wc190KSk7Ci0JaWYgKCFqcDItPmNvbXBzKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB3aGVuIHNldHVwIHRoZSBKUDIgZW5jb2RlclxuIik7Ci0JCS8qIE1lbW9yeSBvZiBqcDItPmNsIHdpbGwgYmUgZnJlZWQgYnkgb3BqX2pwMl9kZXN0cm95ICovCi0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCi0JanAyLT5oID0gaW1hZ2UtPnkxIC0gaW1hZ2UtPnkwOwkJLyogSEVJR0hUICovCi0JanAyLT53ID0gaW1hZ2UtPngxIC0gaW1hZ2UtPngwOwkJLyogV0lEVEggKi8KLQkvKiBCUEMgKi8KLQlkZXB0aF8wID0gaW1hZ2UtPmNvbXBzWzBdLnByZWMgLSAxOwotCXNpZ24gPSBpbWFnZS0+Y29tcHNbMF0uc2duZDsKLQlqcDItPmJwYyA9IGRlcHRoXzAgKyAoc2lnbiA8PCA3KTsKLQlmb3IgKGkgPSAxOyBpIDwgaW1hZ2UtPm51bWNvbXBzOyBpKyspIHsKLQkJT1BKX1VJTlQzMiBkZXB0aCA9IGltYWdlLT5jb21wc1tpXS5wcmVjIC0gMTsKLQkJc2lnbiA9IGltYWdlLT5jb21wc1tpXS5zZ25kOwotCQlpZiAoZGVwdGhfMCAhPSBkZXB0aCkKLQkJCWpwMi0+YnBjID0gMjU1OwotCX0KLQlqcDItPkMgPSA3OwkJCS8qIEMgOiBBbHdheXMgNyAqLwotCWpwMi0+VW5rQyA9IDA7CQkvKiBVbmtDLCBjb2xvcnNwYWNlIHNwZWNpZmllZCBpbiBjb2xyIGJveCAqLwotCWpwMi0+SVBSID0gMDsJCS8qIElQUiwgbm8gaW50ZWxsZWN0dWFsIHByb3BlcnR5ICovCi0JCi0JLyogQml0c1BlckNvbXBvbmVudCBib3ggKi8KLQlmb3IgKGkgPSAwOyBpIDwgaW1hZ2UtPm51bWNvbXBzOyBpKyspIHsKLQkJanAyLT5jb21wc1tpXS5icGNjID0gaW1hZ2UtPmNvbXBzW2ldLnByZWMgLSAxICsgKGltYWdlLT5jb21wc1tpXS5zZ25kIDw8IDcpOwotCX0KLQotCS8qIENvbG91ciBTcGVjaWZpY2F0aW9uIGJveCAqLwotICAgIGlmKGltYWdlLT5pY2NfcHJvZmlsZV9sZW4pIHsKLSAgICAgICAganAyLT5tZXRoID0gMjsKLSAgICAgICAganAyLT5lbnVtY3MgPSAwOwotICAgIH0gCi0gICAgZWxzZSB7Ci0gICAgICAgIGpwMi0+bWV0aCA9IDE7Ci0gICAgICAgIGlmIChpbWFnZS0+Y29sb3Jfc3BhY2UgPT0gMSkKLSAgICAgICAgICAgIGpwMi0+ZW51bWNzID0gMTY7CS8qIHNSR0IgYXMgZGVmaW5lZCBieSBJRUMgNjE5NjYtMi0xICovCi0gICAgICAgIGVsc2UgaWYgKGltYWdlLT5jb2xvcl9zcGFjZSA9PSAyKQotICAgICAgICAgICAganAyLT5lbnVtY3MgPSAxNzsJLyogZ3JleXNjYWxlICovCi0gICAgICAgIGVsc2UgaWYgKGltYWdlLT5jb2xvcl9zcGFjZSA9PSAzKQotICAgICAgICAgICAganAyLT5lbnVtY3MgPSAxODsJLyogWVVWICovCisgICAgaWYgKCFqcDIgfHwgIXBhcmFtZXRlcnMgfHwgIWltYWdlKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgfQogCi0JLyogQ2hhbm5lbCBEZWZpbml0aW9uIGJveCAqLwotCS8qIEZJWE1FIG5vdCBwcm92aWRlZCBieSBwYXJhbWV0ZXJzICovCi0JLyogV2UgdHJ5IHRvIGRvIHdoYXQgd2UgY2FuLi4uICovCi0JYWxwaGFfY291bnQgPSAwVTsKLQlmb3IgKGkgPSAwOyBpIDwgaW1hZ2UtPm51bWNvbXBzOyBpKyspIHsKLQkJaWYgKGltYWdlLT5jb21wc1tpXS5hbHBoYSAhPSAwKSB7Ci0JCQlhbHBoYV9jb3VudCsrOwotCQkJYWxwaGFfY2hhbm5lbCA9IGk7Ci0JCX0KLQl9Ci0JaWYgKGFscGhhX2NvdW50ID09IDFVKSB7IC8qIG5vIHdheSB0byBkZWFsIHdpdGggbW9yZSB0aGFuIDEgYWxwaGEgY2hhbm5lbCAqLwotCQlzd2l0Y2ggKGpwMi0+ZW51bWNzKSB7Ci0JCQljYXNlIDE2OgotCQkJY2FzZSAxODoKLQkJCQljb2xvcl9jaGFubmVscyA9IDM7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDE3OgotCQkJCWNvbG9yX2NoYW5uZWxzID0gMTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYWxwaGFfY291bnQgPSAwVTsKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoYWxwaGFfY291bnQgPT0gMFUpIHsKLQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkFscGhhIGNoYW5uZWwgc3BlY2lmaWVkIGJ1dCB1bmtub3duIGVudW1jcy4gTm8gY2RlZiBib3ggd2lsbCBiZSBjcmVhdGVkLlxuIik7Ci0JCX0gZWxzZSBpZiAoaW1hZ2UtPm51bWNvbXBzIDwgKGNvbG9yX2NoYW5uZWxzKzEpKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJBbHBoYSBjaGFubmVsIHNwZWNpZmllZCBidXQgbm90IGVub3VnaCBpbWFnZSBjb21wb25lbnRzIGZvciBhbiBhdXRvbWF0aWMgY2RlZiBib3ggY3JlYXRpb24uXG4iKTsKLQkJCWFscGhhX2NvdW50ID0gMFU7Ci0JCX0gZWxzZSBpZiAoKE9QSl9VSU5UMzIpYWxwaGFfY2hhbm5lbCA8IGNvbG9yX2NoYW5uZWxzKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJBbHBoYSBjaGFubmVsIHBvc2l0aW9uIGNvbmZsaWN0cyB3aXRoIGNvbG9yIGNoYW5uZWwuIE5vIGNkZWYgYm94IHdpbGwgYmUgY3JlYXRlZC5cbiIpOwotCQkJYWxwaGFfY291bnQgPSAwVTsKLQkJfQotCX0gZWxzZSBpZiAoYWxwaGFfY291bnQgPiAxKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIk11bHRpcGxlIGFscGhhIGNoYW5uZWxzIHNwZWNpZmllZC4gTm8gY2RlZiBib3ggd2lsbCBiZSBjcmVhdGVkLlxuIik7Ci0JfQotCWlmIChhbHBoYV9jb3VudCA9PSAxVSkgeyAvKiBpZiBoZXJlLCB3ZSBrbm93IHdoYXQgd2UgY2FuIGRvICovCi0JCWpwMi0+Y29sb3IuanAyX2NkZWYgPSAob3BqX2pwMl9jZGVmX3QqKW9wal9tYWxsb2Moc2l6ZW9mKG9wal9qcDJfY2RlZl90KSk7Ci0JCWlmKCFqcDItPmNvbG9yLmpwMl9jZGVmKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gc2V0dXAgdGhlIEpQMiBlbmNvZGVyXG4iKTsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQkJLyogbm8gbWVtc2V0IG5lZWRlZCwgYWxsIHZhbHVlcyB3aWxsIGJlIG92ZXJ3cml0dGVuIGV4Y2VwdCBpZiBqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvIGFsbG9jYXRpb24gZmFpbHMsICovCi0JCS8qIGluIHdoaWNoIGNhc2UganAyLT5jb2xvci5qcDJfY2RlZi0+aW5mbyB3aWxsIGJlIE5VTEwgPT4gdmFsaWQgZm9yIGRlc3RydWN0aW9uICovCi0JCWpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm8gPSAob3BqX2pwMl9jZGVmX2luZm9fdCopIG9wal9tYWxsb2MoaW1hZ2UtPm51bWNvbXBzICogc2l6ZW9mKG9wal9qcDJfY2RlZl9pbmZvX3QpKTsKLQkJaWYgKCFqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvKSB7Ci0JCQkvKiBtZW1vcnkgd2lsbCBiZSBmcmVlZCBieSBvcGpfanAyX2Rlc3Ryb3kgKi8KLQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBzZXR1cCB0aGUgSlAyIGVuY29kZXJcbiIpOwotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCQlqcDItPmNvbG9yLmpwMl9jZGVmLT5uID0gKE9QSl9VSU5UMTYpIGltYWdlLT5udW1jb21wczsgLyogY2FzdCBpcyB2YWxpZCA6IGltYWdlLT5udW1jb21wcyBbMSwxNjM4NF0gKi8KLQkJZm9yIChpID0gMFU7IGkgPCBjb2xvcl9jaGFubmVsczsgaSsrKSB7Ci0JCQlqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLmNuID0gKE9QSl9VSU5UMTYpaTsgLyogY2FzdCBpcyB2YWxpZCA6IGltYWdlLT5udW1jb21wcyBbMSwxNjM4NF0gKi8KLQkJCWpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm9baV0udHlwID0gMFU7Ci0JCQlqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLmFzb2MgPSAoT1BKX1VJTlQxNikoaSsxVSk7IC8qIE5vIG92ZXJmbG93ICsgY2FzdCBpcyB2YWxpZCA6IGltYWdlLT5udW1jb21wcyBbMSwxNjM4NF0gKi8KLQkJfQotCQlmb3IgKDsgaSA8IGltYWdlLT5udW1jb21wczsgaSsrKSB7Ci0JCQlpZiAoaW1hZ2UtPmNvbXBzW2ldLmFscGhhICE9IDApIHsgLyogd2UnbGwgYmUgaGVyZSBleGFjdGx5IG9uY2UgKi8KLQkJCQlqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLmNuID0gKE9QSl9VSU5UMTYpaTsgLyogY2FzdCBpcyB2YWxpZCA6IGltYWdlLT5udW1jb21wcyBbMSwxNjM4NF0gKi8KLQkJCQlqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLnR5cCA9IDFVOyAvKiBPcGFjaXR5IGNoYW5uZWwgKi8KLQkJCQlqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLmFzb2MgPSAwVTsgLyogQXBwbHkgYWxwaGEgY2hhbm5lbCB0byB0aGUgd2hvbGUgaW1hZ2UgKi8KLQkJCX0gZWxzZSB7Ci0JCQkJLyogVW5rbm93biBjaGFubmVsICovCi0JCQkJanAyLT5jb2xvci5qcDJfY2RlZi0+aW5mb1tpXS5jbiA9IChPUEpfVUlOVDE2KWk7IC8qIGNhc3QgaXMgdmFsaWQgOiBpbWFnZS0+bnVtY29tcHMgWzEsMTYzODRdICovCi0JCQkJanAyLT5jb2xvci5qcDJfY2RlZi0+aW5mb1tpXS50eXAgPSA2NTUzNVU7Ci0JCQkJanAyLT5jb2xvci5qcDJfY2RlZi0+aW5mb1tpXS5hc29jID0gNjU1MzVVOwotCQkJfQotCQl9Ci0JfQorICAgIC8qIHNldHVwIHRoZSBKMksgY29kZWMgKi8KKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLQlqcDItPnByZWNlZGVuY2UgPSAwOwkvKiBQUkVDRURFTkNFICovCi0JanAyLT5hcHByb3ggPSAwOwkJLyogQVBQUk9YICovCisgICAgLyogQ2hlY2sgaWYgbnVtYmVyIG9mIGNvbXBvbmVudHMgcmVzcGVjdHMgc3RhbmRhcmQgKi8KKyAgICBpZiAoaW1hZ2UtPm51bWNvbXBzIDwgMSB8fCBpbWFnZS0+bnVtY29tcHMgPiAxNjM4NCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG51bWJlciBvZiBjb21wb25lbnRzIHNwZWNpZmllZCB3aGlsZSBzZXR0aW5nIHVwIEpQMiBlbmNvZGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLQlqcDItPmpwaXBfb24gPSBwYXJhbWV0ZXJzLT5qcGlwX29uOworICAgIGlmIChvcGpfajJrX3NldHVwX2VuY29kZXIoanAyLT5qMmssIHBhcmFtZXRlcnMsIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSA9PSBPUEpfRkFMU0UpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLQlyZXR1cm4gT1BKX1RSVUU7CisgICAgLyogc2V0dXAgdGhlIEpQMiBjb2RlYyAqLworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIC8qIFByb2ZpbGUgYm94ICovCisKKyAgICBqcDItPmJyYW5kID0gSlAyX0pQMjsgICAvKiBCUiAqLworICAgIGpwMi0+bWludmVyc2lvbiA9IDA7ICAgIC8qIE1pblYgKi8KKyAgICBqcDItPm51bWNsID0gMTsKKyAgICBqcDItPmNsID0gKE9QSl9VSU5UMzIqKSBvcGpfbWFsbG9jKGpwMi0+bnVtY2wgKiBzaXplb2YoT1BKX1VJTlQzMikpOworICAgIGlmICghanAyLT5jbCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIG1lbW9yeSB3aGVuIHNldHVwIHRoZSBKUDIgZW5jb2RlclxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGpwMi0+Y2xbMF0gPSBKUDJfSlAyOyAgIC8qIENMMCA6IEpQMiAqLworCisgICAgLyogSW1hZ2UgSGVhZGVyIGJveCAqLworCisgICAganAyLT5udW1jb21wcyA9IGltYWdlLT5udW1jb21wczsgICAgLyogTkMgKi8KKyAgICBqcDItPmNvbXBzID0gKG9wal9qcDJfY29tcHNfdCopIG9wal9tYWxsb2MoanAyLT5udW1jb21wcyAqIHNpemVvZigKKyAgICAgICAgICAgICAgICAgICAgIG9wal9qcDJfY29tcHNfdCkpOworICAgIGlmICghanAyLT5jb21wcykgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIG1lbW9yeSB3aGVuIHNldHVwIHRoZSBKUDIgZW5jb2RlclxuIik7CisgICAgICAgIC8qIE1lbW9yeSBvZiBqcDItPmNsIHdpbGwgYmUgZnJlZWQgYnkgb3BqX2pwMl9kZXN0cm95ICovCisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAganAyLT5oID0gaW1hZ2UtPnkxIC0gaW1hZ2UtPnkwOyAgICAgLyogSEVJR0hUICovCisgICAganAyLT53ID0gaW1hZ2UtPngxIC0gaW1hZ2UtPngwOyAgICAgLyogV0lEVEggKi8KKyAgICAvKiBCUEMgKi8KKyAgICBkZXB0aF8wID0gaW1hZ2UtPmNvbXBzWzBdLnByZWMgLSAxOworICAgIHNpZ24gPSBpbWFnZS0+Y29tcHNbMF0uc2duZDsKKyAgICBqcDItPmJwYyA9IGRlcHRoXzAgKyAoc2lnbiA8PCA3KTsKKyAgICBmb3IgKGkgPSAxOyBpIDwgaW1hZ2UtPm51bWNvbXBzOyBpKyspIHsKKyAgICAgICAgT1BKX1VJTlQzMiBkZXB0aCA9IGltYWdlLT5jb21wc1tpXS5wcmVjIC0gMTsKKyAgICAgICAgc2lnbiA9IGltYWdlLT5jb21wc1tpXS5zZ25kOworICAgICAgICBpZiAoZGVwdGhfMCAhPSBkZXB0aCkgeworICAgICAgICAgICAganAyLT5icGMgPSAyNTU7CisgICAgICAgIH0KKyAgICB9CisgICAganAyLT5DID0gNzsgICAgICAgICAvKiBDIDogQWx3YXlzIDcgKi8KKyAgICBqcDItPlVua0MgPSAwOyAgICAgIC8qIFVua0MsIGNvbG9yc3BhY2Ugc3BlY2lmaWVkIGluIGNvbHIgYm94ICovCisgICAganAyLT5JUFIgPSAwOyAgICAgICAvKiBJUFIsIG5vIGludGVsbGVjdHVhbCBwcm9wZXJ0eSAqLworCisgICAgLyogQml0c1BlckNvbXBvbmVudCBib3ggKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgaW1hZ2UtPm51bWNvbXBzOyBpKyspIHsKKyAgICAgICAganAyLT5jb21wc1tpXS5icGNjID0gaW1hZ2UtPmNvbXBzW2ldLnByZWMgLSAxICsgKGltYWdlLT5jb21wc1tpXS5zZ25kIDw8IDcpOworICAgIH0KKworICAgIC8qIENvbG91ciBTcGVjaWZpY2F0aW9uIGJveCAqLworICAgIGlmIChpbWFnZS0+aWNjX3Byb2ZpbGVfbGVuKSB7CisgICAgICAgIGpwMi0+bWV0aCA9IDI7CisgICAgICAgIGpwMi0+ZW51bWNzID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBqcDItPm1ldGggPSAxOworICAgICAgICBpZiAoaW1hZ2UtPmNvbG9yX3NwYWNlID09IDEpIHsKKyAgICAgICAgICAgIGpwMi0+ZW51bWNzID0gMTY7ICAgIC8qIHNSR0IgYXMgZGVmaW5lZCBieSBJRUMgNjE5NjYtMi0xICovCisgICAgICAgIH0gZWxzZSBpZiAoaW1hZ2UtPmNvbG9yX3NwYWNlID09IDIpIHsKKyAgICAgICAgICAgIGpwMi0+ZW51bWNzID0gMTc7ICAgIC8qIGdyZXlzY2FsZSAqLworICAgICAgICB9IGVsc2UgaWYgKGltYWdlLT5jb2xvcl9zcGFjZSA9PSAzKSB7CisgICAgICAgICAgICBqcDItPmVudW1jcyA9IDE4OyAgICAvKiBZVVYgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENoYW5uZWwgRGVmaW5pdGlvbiBib3ggKi8KKyAgICAvKiBGSVhNRSBub3QgcHJvdmlkZWQgYnkgcGFyYW1ldGVycyAqLworICAgIC8qIFdlIHRyeSB0byBkbyB3aGF0IHdlIGNhbi4uLiAqLworICAgIGFscGhhX2NvdW50ID0gMFU7CisgICAgZm9yIChpID0gMDsgaSA8IGltYWdlLT5udW1jb21wczsgaSsrKSB7CisgICAgICAgIGlmIChpbWFnZS0+Y29tcHNbaV0uYWxwaGEgIT0gMCkgeworICAgICAgICAgICAgYWxwaGFfY291bnQrKzsKKyAgICAgICAgICAgIGFscGhhX2NoYW5uZWwgPSBpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChhbHBoYV9jb3VudCA9PSAxVSkgeyAvKiBubyB3YXkgdG8gZGVhbCB3aXRoIG1vcmUgdGhhbiAxIGFscGhhIGNoYW5uZWwgKi8KKyAgICAgICAgc3dpdGNoIChqcDItPmVudW1jcykgeworICAgICAgICBjYXNlIDE2OgorICAgICAgICBjYXNlIDE4OgorICAgICAgICAgICAgY29sb3JfY2hhbm5lbHMgPSAzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTc6CisgICAgICAgICAgICBjb2xvcl9jaGFubmVscyA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFscGhhX2NvdW50ID0gMFU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWxwaGFfY291bnQgPT0gMFUpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkFscGhhIGNoYW5uZWwgc3BlY2lmaWVkIGJ1dCB1bmtub3duIGVudW1jcy4gTm8gY2RlZiBib3ggd2lsbCBiZSBjcmVhdGVkLlxuIik7CisgICAgICAgIH0gZWxzZSBpZiAoaW1hZ2UtPm51bWNvbXBzIDwgKGNvbG9yX2NoYW5uZWxzICsgMSkpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkFscGhhIGNoYW5uZWwgc3BlY2lmaWVkIGJ1dCBub3QgZW5vdWdoIGltYWdlIGNvbXBvbmVudHMgZm9yIGFuIGF1dG9tYXRpYyBjZGVmIGJveCBjcmVhdGlvbi5cbiIpOworICAgICAgICAgICAgYWxwaGFfY291bnQgPSAwVTsKKyAgICAgICAgfSBlbHNlIGlmICgoT1BKX1VJTlQzMilhbHBoYV9jaGFubmVsIDwgY29sb3JfY2hhbm5lbHMpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkFscGhhIGNoYW5uZWwgcG9zaXRpb24gY29uZmxpY3RzIHdpdGggY29sb3IgY2hhbm5lbC4gTm8gY2RlZiBib3ggd2lsbCBiZSBjcmVhdGVkLlxuIik7CisgICAgICAgICAgICBhbHBoYV9jb3VudCA9IDBVOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChhbHBoYV9jb3VudCA+IDEpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICJNdWx0aXBsZSBhbHBoYSBjaGFubmVscyBzcGVjaWZpZWQuIE5vIGNkZWYgYm94IHdpbGwgYmUgY3JlYXRlZC5cbiIpOworICAgIH0KKyAgICBpZiAoYWxwaGFfY291bnQgPT0gMVUpIHsgLyogaWYgaGVyZSwgd2Uga25vdyB3aGF0IHdlIGNhbiBkbyAqLworICAgICAgICBqcDItPmNvbG9yLmpwMl9jZGVmID0gKG9wal9qcDJfY2RlZl90KilvcGpfbWFsbG9jKHNpemVvZihvcGpfanAyX2NkZWZfdCkpOworICAgICAgICBpZiAoIWpwMi0+Y29sb3IuanAyX2NkZWYpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIG1lbW9yeSB0byBzZXR1cCB0aGUgSlAyIGVuY29kZXJcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICAvKiBubyBtZW1zZXQgbmVlZGVkLCBhbGwgdmFsdWVzIHdpbGwgYmUgb3ZlcndyaXR0ZW4gZXhjZXB0IGlmIGpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm8gYWxsb2NhdGlvbiBmYWlscywgKi8KKyAgICAgICAgLyogaW4gd2hpY2ggY2FzZSBqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvIHdpbGwgYmUgTlVMTCA9PiB2YWxpZCBmb3IgZGVzdHJ1Y3Rpb24gKi8KKyAgICAgICAganAyLT5jb2xvci5qcDJfY2RlZi0+aW5mbyA9IChvcGpfanAyX2NkZWZfaW5mb190Kikgb3BqX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZS0+bnVtY29tcHMgKiBzaXplb2Yob3BqX2pwMl9jZGVmX2luZm9fdCkpOworICAgICAgICBpZiAoIWpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm8pIHsKKyAgICAgICAgICAgIC8qIG1lbW9yeSB3aWxsIGJlIGZyZWVkIGJ5IG9wal9qcDJfZGVzdHJveSAqLworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIHNldHVwIHRoZSBKUDIgZW5jb2RlclxuIik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGpwMi0+Y29sb3IuanAyX2NkZWYtPm4gPSAoT1BKX1VJTlQxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLT5udW1jb21wczsgLyogY2FzdCBpcyB2YWxpZCA6IGltYWdlLT5udW1jb21wcyBbMSwxNjM4NF0gKi8KKyAgICAgICAgZm9yIChpID0gMFU7IGkgPCBjb2xvcl9jaGFubmVsczsgaSsrKSB7CisgICAgICAgICAgICBqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLmNuID0gKE9QSl9VSU5UMTYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsgLyogY2FzdCBpcyB2YWxpZCA6IGltYWdlLT5udW1jb21wcyBbMSwxNjM4NF0gKi8KKyAgICAgICAgICAgIGpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm9baV0udHlwID0gMFU7CisgICAgICAgICAgICBqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLmFzb2MgPSAoT1BKX1VJTlQxNikoaSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxVSk7IC8qIE5vIG92ZXJmbG93ICsgY2FzdCBpcyB2YWxpZCA6IGltYWdlLT5udW1jb21wcyBbMSwxNjM4NF0gKi8KKyAgICAgICAgfQorICAgICAgICBmb3IgKDsgaSA8IGltYWdlLT5udW1jb21wczsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaW1hZ2UtPmNvbXBzW2ldLmFscGhhICE9IDApIHsgLyogd2UnbGwgYmUgaGVyZSBleGFjdGx5IG9uY2UgKi8KKyAgICAgICAgICAgICAgICBqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLmNuID0gKE9QSl9VSU5UMTYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7IC8qIGNhc3QgaXMgdmFsaWQgOiBpbWFnZS0+bnVtY29tcHMgWzEsMTYzODRdICovCisgICAgICAgICAgICAgICAganAyLT5jb2xvci5qcDJfY2RlZi0+aW5mb1tpXS50eXAgPSAxVTsgLyogT3BhY2l0eSBjaGFubmVsICovCisgICAgICAgICAgICAgICAganAyLT5jb2xvci5qcDJfY2RlZi0+aW5mb1tpXS5hc29jID0KKyAgICAgICAgICAgICAgICAgICAgMFU7IC8qIEFwcGx5IGFscGhhIGNoYW5uZWwgdG8gdGhlIHdob2xlIGltYWdlICovCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIFVua25vd24gY2hhbm5lbCAqLworICAgICAgICAgICAgICAgIGpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm9baV0uY24gPSAoT1BKX1VJTlQxNikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTsgLyogY2FzdCBpcyB2YWxpZCA6IGltYWdlLT5udW1jb21wcyBbMSwxNjM4NF0gKi8KKyAgICAgICAgICAgICAgICBqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLnR5cCA9IDY1NTM1VTsKKyAgICAgICAgICAgICAgICBqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvW2ldLmFzb2MgPSA2NTUzNVU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBqcDItPnByZWNlZGVuY2UgPSAwOyAgICAvKiBQUkVDRURFTkNFICovCisgICAganAyLT5hcHByb3ggPSAwOyAgICAgICAgLyogQVBQUk9YICovCisKKyAgICBqcDItPmpwaXBfb24gPSBwYXJhbWV0ZXJzLT5qcGlwX29uOworCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiBPUEpfQk9PTCBvcGpfanAyX2VuY29kZShvcGpfanAyX3QgKmpwMiwKLQkJCQkJCW9wal9zdHJlYW1fcHJpdmF0ZV90ICpzdHJlYW0sCi0JCQkJCQlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQogewotCXJldHVybiBvcGpfajJrX2VuY29kZShqcDItPmoyaywgc3RyZWFtLCBwX21hbmFnZXIpOworICAgIHJldHVybiBvcGpfajJrX2VuY29kZShqcDItPmoyaywgc3RyZWFtLCBwX21hbmFnZXIpOwogfQogCiBPUEpfQk9PTCBvcGpfanAyX2VuZF9kZWNvbXByZXNzKG9wal9qcDJfdCAqanAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KGNpbyAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChqcDIgIT0gMDApOworICAgIGFzc2VydChjaW8gIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0JLyogY3VzdG9taXphdGlvbiBvZiB0aGUgZW5kIGVuY29kaW5nICovCi0JaWYgKCEgb3BqX2pwMl9zZXR1cF9lbmRfaGVhZGVyX3JlYWRpbmcoanAyLCBwX21hbmFnZXIpKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgIC8qIGN1c3RvbWl6YXRpb24gb2YgdGhlIGVuZCBlbmNvZGluZyAqLworICAgIGlmICghIG9wal9qcDJfc2V0dXBfZW5kX2hlYWRlcl9yZWFkaW5nKGpwMiwgcF9tYW5hZ2VyKSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotCS8qIHdyaXRlIGhlYWRlciAqLwotCWlmICghIG9wal9qcDJfZXhlYyAoanAyLGpwMi0+bV9wcm9jZWR1cmVfbGlzdCxjaW8scF9tYW5hZ2VyKSkgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KKyAgICAvKiB3cml0ZSBoZWFkZXIgKi8KKyAgICBpZiAoISBvcGpfanAyX2V4ZWMoanAyLCBqcDItPm1fcHJvY2VkdXJlX2xpc3QsIGNpbywgcF9tYW5hZ2VyKSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotCXJldHVybiBvcGpfajJrX2VuZF9kZWNvbXByZXNzKGpwMi0+ajJrLCBjaW8sIHBfbWFuYWdlcik7CisgICAgcmV0dXJuIG9wal9qMmtfZW5kX2RlY29tcHJlc3MoanAyLT5qMmssIGNpbywgcF9tYW5hZ2VyKTsKIH0KIAotT1BKX0JPT0wgb3BqX2pwMl9lbmRfY29tcHJlc3MoCW9wal9qcDJfdCAqanAyLAotCQkJCQkJCSAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotCQkJCQkJCSAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorT1BKX0JPT0wgb3BqX2pwMl9lbmRfY29tcHJlc3Mob3BqX2pwMl90ICpqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KGNpbyAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChqcDIgIT0gMDApOworICAgIGFzc2VydChjaW8gIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0JLyogY3VzdG9taXphdGlvbiBvZiB0aGUgZW5kIGVuY29kaW5nICovCi0JaWYgKCEgb3BqX2pwMl9zZXR1cF9lbmRfaGVhZGVyX3dyaXRpbmcoanAyLCBwX21hbmFnZXIpKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgIC8qIGN1c3RvbWl6YXRpb24gb2YgdGhlIGVuZCBlbmNvZGluZyAqLworICAgIGlmICghIG9wal9qcDJfc2V0dXBfZW5kX2hlYWRlcl93cml0aW5nKGpwMiwgcF9tYW5hZ2VyKSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotCWlmICghIG9wal9qMmtfZW5kX2NvbXByZXNzKGpwMi0+ajJrLGNpbyxwX21hbmFnZXIpKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgIGlmICghIG9wal9qMmtfZW5kX2NvbXByZXNzKGpwMi0+ajJrLCBjaW8sIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLQkvKiB3cml0ZSBoZWFkZXIgKi8KLQlyZXR1cm4gb3BqX2pwMl9leGVjKGpwMixqcDItPm1fcHJvY2VkdXJlX2xpc3QsY2lvLHBfbWFuYWdlcik7CisgICAgLyogd3JpdGUgaGVhZGVyICovCisgICAgcmV0dXJuIG9wal9qcDJfZXhlYyhqcDIsIGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwgY2lvLCBwX21hbmFnZXIpOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9zZXR1cF9lbmRfaGVhZGVyX3dyaXRpbmcgKG9wal9qcDJfdCAqanAyLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9zZXR1cF9lbmRfaGVhZGVyX3dyaXRpbmcob3BqX2pwMl90ICpqcDIsCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKIHsKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChqcDIgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCiAjaWZkZWYgVVNFX0pQSVAKLQlpZigganAyLT5qcGlwX29uICkgewotCQlpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShqcDItPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2pwaXBfd3JpdGVfaXB0ciwgcF9tYW5hZ2VyKSkgewotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCX0KKyAgICBpZiAoanAyLT5qcGlwX29uKSB7CisgICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9wcm9jZWR1cmUpb3BqX2pwaXBfd3JpdGVfaXB0ciwgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgIH0KICNlbmRpZgotCWlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfanAyX3dyaXRlX2pwMmMsIHBfbWFuYWdlcikpIHsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0JLyogREVWRUxPUEVSIENPUk5FUiwgYWRkIHlvdXIgY3VzdG9tIHByb2NlZHVyZXMgKi8KKyAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShqcDItPm1fcHJvY2VkdXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9wcm9jZWR1cmUpb3BqX2pwMl93cml0ZV9qcDJjLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIC8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSBwcm9jZWR1cmVzICovCiAjaWZkZWYgVVNFX0pQSVAKLSAgaWYoIGpwMi0+anBpcF9vbiApCi0JewotCQlpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShqcDItPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2pwaXBfd3JpdGVfY2lkeCwgcF9tYW5hZ2VyKSkgewotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCQlpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShqcDItPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2pwaXBfd3JpdGVfZmlkeCwgcF9tYW5hZ2VyKSkgewotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCX0KKyAgICBpZiAoanAyLT5qcGlwX29uKSB7CisgICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9wcm9jZWR1cmUpb3BqX2pwaXBfd3JpdGVfY2lkeCwgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShqcDItPm1fcHJvY2VkdXJlX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGpfcHJvY2VkdXJlKW9wal9qcGlwX3dyaXRlX2ZpZHgsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CiAjZW5kaWYKLQlyZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9zZXR1cF9lbmRfaGVhZGVyX3JlYWRpbmcgKG9wal9qcDJfdCAqanAyLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9zZXR1cF9lbmRfaGVhZGVyX3JlYWRpbmcob3BqX2pwMl90ICpqcDIsCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKIHsKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0JCi0JaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUoanAyLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qcDJfcmVhZF9oZWFkZXJfcHJvY2VkdXJlLCBwX21hbmFnZXIpKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCS8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSBwcm9jZWR1cmVzICovCi0JCi0JcmV0dXJuIE9QSl9UUlVFOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQoanAyICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKworICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3BqX3Byb2NlZHVyZSlvcGpfanAyX3JlYWRfaGVhZGVyX3Byb2NlZHVyZSwgcF9tYW5hZ2VyKSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICAvKiBERVZFTE9QRVIgQ09STkVSLCBhZGQgeW91ciBjdXN0b20gcHJvY2VkdXJlcyAqLworCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9kZWZhdWx0X3ZhbGlkYXRpb24gKAlvcGpfanAyX3QgKiBqcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9kZWZhdWx0X3ZhbGlkYXRpb24ob3BqX2pwMl90ICoganAyLAorICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLQlPUEpfQk9PTCBsX2lzX3ZhbGlkID0gT1BKX1RSVUU7Ci0JT1BKX1VJTlQzMiBpOworICAgIE9QSl9CT09MIGxfaXNfdmFsaWQgPSBPUEpfVFJVRTsKKyAgICBPUEpfVUlOVDMyIGk7CiAKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KGNpbyAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChqcDIgIT0gMDApOworICAgIGFzc2VydChjaW8gIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0JLyogSlBFRzIwMDAgY29kZWMgdmFsaWRhdGlvbiAqLworICAgIE9QSl9VTlVTRUQocF9tYW5hZ2VyKTsKIAotCS8qIFNUQVRFIGNoZWNraW5nICovCi0JLyogbWFrZSBzdXJlIHRoZSBzdGF0ZSBpcyBhdCAwICovCi0JbF9pc192YWxpZCAmPSAoanAyLT5qcDJfc3RhdGUgPT0gSlAyX1NUQVRFX05PTkUpOworICAgIC8qIEpQRUcyMDAwIGNvZGVjIHZhbGlkYXRpb24gKi8KIAotCS8qIG1ha2Ugc3VyZSBub3QgcmVhZGluZyBhIGpwMmggPz8/PyBXRUlSRCAqLwotCWxfaXNfdmFsaWQgJj0gKGpwMi0+anAyX2ltZ19zdGF0ZSA9PSBKUDJfSU1HX1NUQVRFX05PTkUpOworICAgIC8qIFNUQVRFIGNoZWNraW5nICovCisgICAgLyogbWFrZSBzdXJlIHRoZSBzdGF0ZSBpcyBhdCAwICovCisgICAgbF9pc192YWxpZCAmPSAoanAyLT5qcDJfc3RhdGUgPT0gSlAyX1NUQVRFX05PTkUpOwogCi0JLyogUE9JTlRFUiB2YWxpZGF0aW9uICovCi0JLyogbWFrZSBzdXJlIGEgajJrIGNvZGVjIGlzIHByZXNlbnQgKi8KLQlsX2lzX3ZhbGlkICY9IChqcDItPmoyayAhPSAwMCk7CisgICAgLyogbWFrZSBzdXJlIG5vdCByZWFkaW5nIGEganAyaCA/Pz8/IFdFSVJEICovCisgICAgbF9pc192YWxpZCAmPSAoanAyLT5qcDJfaW1nX3N0YXRlID09IEpQMl9JTUdfU1RBVEVfTk9ORSk7CiAKLQkvKiBtYWtlIHN1cmUgYSBwcm9jZWR1cmUgbGlzdCBpcyBwcmVzZW50ICovCi0JbF9pc192YWxpZCAmPSAoanAyLT5tX3Byb2NlZHVyZV9saXN0ICE9IDAwKTsKKyAgICAvKiBQT0lOVEVSIHZhbGlkYXRpb24gKi8KKyAgICAvKiBtYWtlIHN1cmUgYSBqMmsgY29kZWMgaXMgcHJlc2VudCAqLworICAgIGxfaXNfdmFsaWQgJj0gKGpwMi0+ajJrICE9IDAwKTsKIAotCS8qIG1ha2Ugc3VyZSBhIHZhbGlkYXRpb24gbGlzdCBpcyBwcmVzZW50ICovCi0JbF9pc192YWxpZCAmPSAoanAyLT5tX3ZhbGlkYXRpb25fbGlzdCAhPSAwMCk7CisgICAgLyogbWFrZSBzdXJlIGEgcHJvY2VkdXJlIGxpc3QgaXMgcHJlc2VudCAqLworICAgIGxfaXNfdmFsaWQgJj0gKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCAhPSAwMCk7CiAKLQkvKiBQQVJBTUVURVIgVkFMSURBVElPTiAqLwotCS8qIG51bWJlciBvZiBjb21wb25lbnRzICovCi0JbF9pc192YWxpZCAmPSAoanAyLT5udW1jbCA+IDApOwotCS8qIHdpZHRoICovCi0JbF9pc192YWxpZCAmPSAoanAyLT5oID4gMCk7Ci0JLyogaGVpZ2h0ICovCi0JbF9pc192YWxpZCAmPSAoanAyLT53ID4gMCk7Ci0JLyogcHJlY2lzaW9uICovCi0JZm9yIChpID0gMDsgaSA8IGpwMi0+bnVtY29tcHM7ICsraSkJewotCQlsX2lzX3ZhbGlkICY9ICgoanAyLT5jb21wc1tpXS5icGNjICYgMHg3RlUpIDwgMzhVKTsgLyogMCBpcyB2YWxpZCwgaWdub3JlIHNpZ24gZm9yIGNoZWNrICovCi0JfQorICAgIC8qIG1ha2Ugc3VyZSBhIHZhbGlkYXRpb24gbGlzdCBpcyBwcmVzZW50ICovCisgICAgbF9pc192YWxpZCAmPSAoanAyLT5tX3ZhbGlkYXRpb25fbGlzdCAhPSAwMCk7CiAKLQkvKiBNRVRIICovCi0JbF9pc192YWxpZCAmPSAoKGpwMi0+bWV0aCA+IDApICYmIChqcDItPm1ldGggPCAzKSk7CisgICAgLyogUEFSQU1FVEVSIFZBTElEQVRJT04gKi8KKyAgICAvKiBudW1iZXIgb2YgY29tcG9uZW50cyAqLworICAgIGxfaXNfdmFsaWQgJj0gKGpwMi0+bnVtY2wgPiAwKTsKKyAgICAvKiB3aWR0aCAqLworICAgIGxfaXNfdmFsaWQgJj0gKGpwMi0+aCA+IDApOworICAgIC8qIGhlaWdodCAqLworICAgIGxfaXNfdmFsaWQgJj0gKGpwMi0+dyA+IDApOworICAgIC8qIHByZWNpc2lvbiAqLworICAgIGZvciAoaSA9IDA7IGkgPCBqcDItPm51bWNvbXBzOyArK2kpIHsKKyAgICAgICAgbF9pc192YWxpZCAmPSAoKGpwMi0+Y29tcHNbaV0uYnBjYyAmIDB4N0ZVKSA8CisgICAgICAgICAgICAgICAgICAgICAgIDM4VSk7IC8qIDAgaXMgdmFsaWQsIGlnbm9yZSBzaWduIGZvciBjaGVjayAqLworICAgIH0KIAotCS8qIHN0cmVhbSB2YWxpZGF0aW9uICovCi0JLyogYmFjayBhbmQgZm9ydGggaXMgbmVlZGVkICovCi0JbF9pc192YWxpZCAmPSBvcGpfc3RyZWFtX2hhc19zZWVrKGNpbyk7CisgICAgLyogTUVUSCAqLworICAgIGxfaXNfdmFsaWQgJj0gKChqcDItPm1ldGggPiAwKSAmJiAoanAyLT5tZXRoIDwgMykpOwogCi0JcmV0dXJuIGxfaXNfdmFsaWQ7CisgICAgLyogc3RyZWFtIHZhbGlkYXRpb24gKi8KKyAgICAvKiBiYWNrIGFuZCBmb3J0aCBpcyBuZWVkZWQgKi8KKyAgICBsX2lzX3ZhbGlkICY9IG9wal9zdHJlYW1faGFzX3NlZWsoY2lvKTsKKworICAgIHJldHVybiBsX2lzX3ZhbGlkOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2hlYWRlcl9wcm9jZWR1cmUoICBvcGpfanAyX3QgKmpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfaGVhZGVyX3Byb2NlZHVyZShvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnN0cmVhbSwKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0Jb3BqX2pwMl9ib3hfdCBib3g7Ci0JT1BKX1VJTlQzMiBsX25iX2J5dGVzX3JlYWQ7Ci0JY29uc3Qgb3BqX2pwMl9oZWFkZXJfaGFuZGxlcl90ICogbF9jdXJyZW50X2hhbmRsZXI7Ci0JY29uc3Qgb3BqX2pwMl9oZWFkZXJfaGFuZGxlcl90ICogbF9jdXJyZW50X2hhbmRsZXJfbWlzcGxhY2VkOwotCU9QSl9VSU5UMzIgbF9sYXN0X2RhdGFfc2l6ZSA9IE9QSl9CT1hfU0laRTsKLQlPUEpfVUlOVDMyIGxfY3VycmVudF9kYXRhX3NpemU7Ci0JT1BKX0JZVEUgKiBsX2N1cnJlbnRfZGF0YSA9IDAwOworICAgIG9wal9qcDJfYm94X3QgYm94OworICAgIE9QSl9VSU5UMzIgbF9uYl9ieXRlc19yZWFkOworICAgIGNvbnN0IG9wal9qcDJfaGVhZGVyX2hhbmRsZXJfdCAqIGxfY3VycmVudF9oYW5kbGVyOworICAgIGNvbnN0IG9wal9qcDJfaGVhZGVyX2hhbmRsZXJfdCAqIGxfY3VycmVudF9oYW5kbGVyX21pc3BsYWNlZDsKKyAgICBPUEpfVUlOVDMyIGxfbGFzdF9kYXRhX3NpemUgPSBPUEpfQk9YX1NJWkU7CisgICAgT1BKX1VJTlQzMiBsX2N1cnJlbnRfZGF0YV9zaXplOworICAgIE9QSl9CWVRFICogbF9jdXJyZW50X2RhdGEgPSAwMDsKIAotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQoc3RyZWFtICE9IDAwKTsKLQlhc3NlcnQoanAyICE9IDAwKTsKLQlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHN0cmVhbSAhPSAwMCk7CisgICAgYXNzZXJ0KGpwMiAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CiAKLQlsX2N1cnJlbnRfZGF0YSA9IChPUEpfQllURSopb3BqX2NhbGxvYygxLGxfbGFzdF9kYXRhX3NpemUpOworICAgIGxfY3VycmVudF9kYXRhID0gKE9QSl9CWVRFKilvcGpfY2FsbG9jKDEsIGxfbGFzdF9kYXRhX3NpemUpOwogCi0JaWYgKGxfY3VycmVudF9kYXRhID09IDAwKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBoYW5kbGUganBlZzIwMDAgZmlsZSBoZWFkZXJcbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KKyAgICBpZiAobF9jdXJyZW50X2RhdGEgPT0gMDApIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiTm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGpwZWcyMDAwIGZpbGUgaGVhZGVyXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLQl3aGlsZSAob3BqX2pwMl9yZWFkX2JveGhkcigmYm94LCZsX25iX2J5dGVzX3JlYWQsc3RyZWFtLHBfbWFuYWdlcikpIHsKLQkJLyogaXMgaXQgdGhlIGNvZGVzdHJlYW0gYm94ID8gKi8KLQkJaWYgKGJveC50eXBlID09IEpQMl9KUDJDKSB7Ci0JCQlpZiAoanAyLT5qcDJfc3RhdGUgJiBKUDJfU1RBVEVfSEVBREVSKSB7Ci0JCQkJanAyLT5qcDJfc3RhdGUgfD0gSlAyX1NUQVRFX0NPREVTVFJFQU07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKLQkJCQlyZXR1cm4gT1BKX1RSVUU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiYmFkIHBsYWNlZCBqcGVnIGNvZGVzdHJlYW1cbiIpOwotCQkJCW9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKLQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYJKGJveC5sZW5ndGggPT0gMCkgewotCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkNhbm5vdCBoYW5kbGUgYm94IG9mIHVuZGVmaW5lZCBzaXplc1xuIik7Ci0JCQlvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0JCS8qIHRlc3RjYXNlIDE4NTEucGRmLlNJR1NFR1YuY2U5Ljk0OCAqLworICAgIHdoaWxlIChvcGpfanAyX3JlYWRfYm94aGRyKCZib3gsICZsX25iX2J5dGVzX3JlYWQsIHN0cmVhbSwgcF9tYW5hZ2VyKSkgeworICAgICAgICAvKiBpcyBpdCB0aGUgY29kZXN0cmVhbSBib3ggPyAqLworICAgICAgICBpZiAoYm94LnR5cGUgPT0gSlAyX0pQMkMpIHsKKyAgICAgICAgICAgIGlmIChqcDItPmpwMl9zdGF0ZSAmIEpQMl9TVEFURV9IRUFERVIpIHsKKyAgICAgICAgICAgICAgICBqcDItPmpwMl9zdGF0ZSB8PSBKUDJfU1RBVEVfQ09ERVNUUkVBTTsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiYmFkIHBsYWNlZCBqcGVnIGNvZGVzdHJlYW1cbiIpOworICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGJveC5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkNhbm5vdCBoYW5kbGUgYm94IG9mIHVuZGVmaW5lZCBzaXplc1xuIik7CisgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIC8qIHRlc3RjYXNlIDE4NTEucGRmLlNJR1NFR1YuY2U5Ljk0OCAqLwogICAgICAgICBlbHNlIGlmIChib3gubGVuZ3RoIDwgbF9uYl9ieXRlc19yZWFkKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiaW52YWxpZCBib3ggc2l6ZSAlZCAoJXgpXG4iLCBib3gubGVuZ3RoLCBib3gudHlwZSk7Ci0JCQlvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiaW52YWxpZCBib3ggc2l6ZSAlZCAoJXgpXG4iLCBib3gubGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib3gudHlwZSk7CisgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CiAKLQkJbF9jdXJyZW50X2hhbmRsZXIgPSBvcGpfanAyX2ZpbmRfaGFuZGxlcihib3gudHlwZSk7Ci0JCWxfY3VycmVudF9oYW5kbGVyX21pc3BsYWNlZCA9IG9wal9qcDJfaW1nX2ZpbmRfaGFuZGxlcihib3gudHlwZSk7Ci0JCWxfY3VycmVudF9kYXRhX3NpemUgPSBib3gubGVuZ3RoIC0gbF9uYl9ieXRlc19yZWFkOworICAgICAgICBsX2N1cnJlbnRfaGFuZGxlciA9IG9wal9qcDJfZmluZF9oYW5kbGVyKGJveC50eXBlKTsKKyAgICAgICAgbF9jdXJyZW50X2hhbmRsZXJfbWlzcGxhY2VkID0gb3BqX2pwMl9pbWdfZmluZF9oYW5kbGVyKGJveC50eXBlKTsKKyAgICAgICAgbF9jdXJyZW50X2RhdGFfc2l6ZSA9IGJveC5sZW5ndGggLSBsX25iX2J5dGVzX3JlYWQ7CiAKLQkJaWYgKChsX2N1cnJlbnRfaGFuZGxlciAhPSAwMCkgfHwgKGxfY3VycmVudF9oYW5kbGVyX21pc3BsYWNlZCAhPSAwMCkpIHsKLQkJCWlmIChsX2N1cnJlbnRfaGFuZGxlciA9PSAwMCkgewotCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkZvdW5kIGEgbWlzcGxhY2VkICclYyVjJWMlYycgYm94IG91dHNpZGUganAyaCBib3hcbiIsIChPUEpfQllURSkoYm94LnR5cGU+PjI0KSwgKE9QSl9CWVRFKShib3gudHlwZT4+MTYpLCAoT1BKX0JZVEUpKGJveC50eXBlPj44KSwgKE9QSl9CWVRFKShib3gudHlwZT4+MCkpOwotCQkJCWlmIChqcDItPmpwMl9zdGF0ZSAmIEpQMl9TVEFURV9IRUFERVIpIHsKLQkJCQkJLyogcmVhZCBhbnl3YXksIHdlIGFscmVhZHkgaGF2ZSBqcDJoICovCi0JCQkJCWxfY3VycmVudF9oYW5kbGVyID0gbF9jdXJyZW50X2hhbmRsZXJfbWlzcGxhY2VkOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkpQRUcyMDAwIEhlYWRlciBib3ggbm90IHJlYWQgeWV0LCAnJWMlYyVjJWMnIGJveCB3aWxsIGJlIGlnbm9yZWRcbiIsIChPUEpfQllURSkoYm94LnR5cGU+PjI0KSwgKE9QSl9CWVRFKShib3gudHlwZT4+MTYpLCAoT1BKX0JZVEUpKGJveC50eXBlPj44KSwgKE9QSl9CWVRFKShib3gudHlwZT4+MCkpOwotCQkJCQlqcDItPmpwMl9zdGF0ZSB8PSBKUDJfU1RBVEVfVU5LTk9XTjsKLQkJCQkJaWYgKG9wal9zdHJlYW1fc2tpcChzdHJlYW0sbF9jdXJyZW50X2RhdGFfc2l6ZSxwX21hbmFnZXIpICE9IGxfY3VycmVudF9kYXRhX3NpemUpIHsKLQkJCQkJCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiUHJvYmxlbSB3aXRoIHNraXBwaW5nIEpQRUcyMDAwIGJveCwgc3RyZWFtIGVycm9yXG4iKTsKLQkJCQkJCQlvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7Ci0JCQkJCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoKE9QSl9PRkZfVClsX2N1cnJlbnRfZGF0YV9zaXplID4gb3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChzdHJlYW0pKSB7Ci0JCQkJLyogZG8gbm90IGV2ZW4gdHJ5IHRvIG1hbGxvYyBpZiB3ZSBjYW4ndCByZWFkICovCi0JCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgYm94IHNpemUgJWQgZm9yIGJveCAnJWMlYyVjJWMnLiBOZWVkICVkIGJ5dGVzLCAlZCBieXRlcyByZW1haW5pbmcgXG4iLCBib3gubGVuZ3RoLCAoT1BKX0JZVEUpKGJveC50eXBlPj4yNCksIChPUEpfQllURSkoYm94LnR5cGU+PjE2KSwgKE9QSl9CWVRFKShib3gudHlwZT4+OCksIChPUEpfQllURSkoYm94LnR5cGU+PjApLCBsX2N1cnJlbnRfZGF0YV9zaXplLCAoT1BKX1VJTlQzMilvcGpfc3RyZWFtX2dldF9udW1iZXJfYnl0ZV9sZWZ0KHN0cmVhbSkpOwotCQkJCW9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKLQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJfQotCQkJaWYgKGxfY3VycmVudF9kYXRhX3NpemUgPiBsX2xhc3RfZGF0YV9zaXplKSB7Ci0JCQkJT1BKX0JZVEUqIG5ld19jdXJyZW50X2RhdGEgPSAoT1BKX0JZVEUqKW9wal9yZWFsbG9jKGxfY3VycmVudF9kYXRhLGxfY3VycmVudF9kYXRhX3NpemUpOwotCQkJCWlmICghbmV3X2N1cnJlbnRfZGF0YSkgewotCQkJCQlvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBoYW5kbGUganBlZzIwMDAgYm94XG4iKTsKLQkJCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJCQl9CisgICAgICAgIGlmICgobF9jdXJyZW50X2hhbmRsZXIgIT0gMDApIHx8IChsX2N1cnJlbnRfaGFuZGxlcl9taXNwbGFjZWQgIT0gMDApKSB7CisgICAgICAgICAgICBpZiAobF9jdXJyZW50X2hhbmRsZXIgPT0gMDApIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm91bmQgYSBtaXNwbGFjZWQgJyVjJWMlYyVjJyBib3ggb3V0c2lkZSBqcDJoIGJveFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfQllURSkoYm94LnR5cGUgPj4gMjQpLCAoT1BKX0JZVEUpKGJveC50eXBlID4+IDE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfQllURSkoYm94LnR5cGUgPj4gOCksIChPUEpfQllURSkoYm94LnR5cGUgPj4gMCkpOworICAgICAgICAgICAgICAgIGlmIChqcDItPmpwMl9zdGF0ZSAmIEpQMl9TVEFURV9IRUFERVIpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcmVhZCBhbnl3YXksIHdlIGFscmVhZHkgaGF2ZSBqcDJoICovCisgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9oYW5kbGVyID0gbF9jdXJyZW50X2hhbmRsZXJfbWlzcGxhY2VkOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSlBFRzIwMDAgSGVhZGVyIGJveCBub3QgcmVhZCB5ZXQsICclYyVjJWMlYycgYm94IHdpbGwgYmUgaWdub3JlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0JZVEUpKGJveC50eXBlID4+IDI0KSwgKE9QSl9CWVRFKShib3gudHlwZSA+PiAxNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9CWVRFKShib3gudHlwZSA+PiA4KSwgKE9QSl9CWVRFKShib3gudHlwZSA+PiAwKSk7CisgICAgICAgICAgICAgICAgICAgIGpwMi0+anAyX3N0YXRlIHw9IEpQMl9TVEFURV9VTktOT1dOOworICAgICAgICAgICAgICAgICAgICBpZiAob3BqX3N0cmVhbV9za2lwKHN0cmVhbSwgbF9jdXJyZW50X2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpICE9IGxfY3VycmVudF9kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9ibGVtIHdpdGggc2tpcHBpbmcgSlBFRzIwMDAgYm94LCBzdHJlYW0gZXJyb3JcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKE9QSl9PRkZfVClsX2N1cnJlbnRfZGF0YV9zaXplID4gb3BqX3N0cmVhbV9nZXRfbnVtYmVyX2J5dGVfbGVmdChzdHJlYW0pKSB7CisgICAgICAgICAgICAgICAgLyogZG8gbm90IGV2ZW4gdHJ5IHRvIG1hbGxvYyBpZiB3ZSBjYW4ndCByZWFkICovCisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGJveCBzaXplICVkIGZvciBib3ggJyVjJWMlYyVjJy4gTmVlZCAlZCBieXRlcywgJWQgYnl0ZXMgcmVtYWluaW5nIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC5sZW5ndGgsIChPUEpfQllURSkoYm94LnR5cGUgPj4gMjQpLCAoT1BKX0JZVEUpKGJveC50eXBlID4+IDE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfQllURSkoYm94LnR5cGUgPj4gOCksIChPUEpfQllURSkoYm94LnR5cGUgPj4gMCksIGxfY3VycmVudF9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMilvcGpfc3RyZWFtX2dldF9udW1iZXJfYnl0ZV9sZWZ0KHN0cmVhbSkpOworICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxfY3VycmVudF9kYXRhX3NpemUgPiBsX2xhc3RfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgT1BKX0JZVEUqIG5ld19jdXJyZW50X2RhdGEgPSAoT1BKX0JZVEUqKW9wal9yZWFsbG9jKGxfY3VycmVudF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGFfc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCFuZXdfY3VycmVudF9kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGpwZWcyMDAwIGJveFxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGxfY3VycmVudF9kYXRhID0gbmV3X2N1cnJlbnRfZGF0YTsKLQkJCQlsX2xhc3RfZGF0YV9zaXplID0gbF9jdXJyZW50X2RhdGFfc2l6ZTsKLQkJCX0KKyAgICAgICAgICAgICAgICBsX2xhc3RfZGF0YV9zaXplID0gbF9jdXJyZW50X2RhdGFfc2l6ZTsKKyAgICAgICAgICAgIH0KIAotCQkJbF9uYl9ieXRlc19yZWFkID0gKE9QSl9VSU5UMzIpb3BqX3N0cmVhbV9yZWFkX2RhdGEoc3RyZWFtLGxfY3VycmVudF9kYXRhLGxfY3VycmVudF9kYXRhX3NpemUscF9tYW5hZ2VyKTsKLQkJCWlmIChsX25iX2J5dGVzX3JlYWQgIT0gbF9jdXJyZW50X2RhdGFfc2l6ZSkgewotCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJQcm9ibGVtIHdpdGggcmVhZGluZyBKUEVHMjAwMCBib3gsIHN0cmVhbSBlcnJvclxuIik7Ci0gICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOyAgICAgICAgICAgICAgICAKLQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJfQorICAgICAgICAgICAgbF9uYl9ieXRlc19yZWFkID0gKE9QSl9VSU5UMzIpb3BqX3N0cmVhbV9yZWFkX2RhdGEoc3RyZWFtLCBsX2N1cnJlbnRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9kYXRhX3NpemUsIHBfbWFuYWdlcik7CisgICAgICAgICAgICBpZiAobF9uYl9ieXRlc19yZWFkICE9IGxfY3VycmVudF9kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb2JsZW0gd2l0aCByZWFkaW5nIEpQRUcyMDAwIGJveCwgc3RyZWFtIGVycm9yXG4iKTsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KIAotCQkJaWYgKCEgbF9jdXJyZW50X2hhbmRsZXItPmhhbmRsZXIoanAyLGxfY3VycmVudF9kYXRhLGxfY3VycmVudF9kYXRhX3NpemUscF9tYW5hZ2VyKSkgewotCQkJCW9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKLQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJfQotCQl9Ci0JCWVsc2UgeworICAgICAgICAgICAgaWYgKCEgbF9jdXJyZW50X2hhbmRsZXItPmhhbmRsZXIoanAyLCBsX2N1cnJlbnRfZGF0YSwgbF9jdXJyZW50X2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmICghKGpwMi0+anAyX3N0YXRlICYgSlAyX1NUQVRFX1NJR05BVFVSRSkpIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTWFsZm9ybWVkIEpQMiBmaWxlIGZvcm1hdDogZmlyc3QgYm94IG11c3QgYmUgSlBFRyAyMDAwIHNpZ25hdHVyZSBib3hcbiIpOworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFsZm9ybWVkIEpQMiBmaWxlIGZvcm1hdDogZmlyc3QgYm94IG11c3QgYmUgSlBFRyAyMDAwIHNpZ25hdHVyZSBib3hcbiIpOwogICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCEoanAyLT5qcDJfc3RhdGUgJiBKUDJfU1RBVEVfRklMRV9UWVBFKSkgewotICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJNYWxmb3JtZWQgSlAyIGZpbGUgZm9ybWF0OiBzZWNvbmQgYm94IG11c3QgYmUgZmlsZSB0eXBlIGJveFxuIik7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWxmb3JtZWQgSlAyIGZpbGUgZm9ybWF0OiBzZWNvbmQgYm94IG11c3QgYmUgZmlsZSB0eXBlIGJveFxuIik7CiAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOwogICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgICAgICAgICB9Ci0JCQlqcDItPmpwMl9zdGF0ZSB8PSBKUDJfU1RBVEVfVU5LTk9XTjsKLQkJCWlmIChvcGpfc3RyZWFtX3NraXAoc3RyZWFtLGxfY3VycmVudF9kYXRhX3NpemUscF9tYW5hZ2VyKSAhPSBsX2N1cnJlbnRfZGF0YV9zaXplKSB7Ci0JCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIlByb2JsZW0gd2l0aCBza2lwcGluZyBKUEVHMjAwMCBib3gsIHN0cmVhbSBlcnJvclxuIik7Ci0JCQkJb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOwotCQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCQl9Ci0JCX0KLQl9CisgICAgICAgICAgICBqcDItPmpwMl9zdGF0ZSB8PSBKUDJfU1RBVEVfVU5LTk9XTjsKKyAgICAgICAgICAgIGlmIChvcGpfc3RyZWFtX3NraXAoc3RyZWFtLCBsX2N1cnJlbnRfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpICE9IGxfY3VycmVudF9kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICBpZiAoanAyLT5qcDJfc3RhdGUgJiBKUDJfU1RBVEVfQ09ERVNUUkVBTSkgeworICAgICAgICAgICAgICAgICAgICAvKiBJZiB3ZSBhbHJlYWR5IHJlYWQgdGhlIGNvZGVzdHJlYW0sIGRvIG5vdCBlcnJvciBvdXQgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogTmVlZGVkIGZvciBkYXRhL2lucHV0L25vbnJlZ3Jlc3Npb24vaXNzdWUyNTQuanAyICovCisgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvYmxlbSB3aXRoIHNraXBwaW5nIEpQRUcyMDAwIGJveCwgc3RyZWFtIGVycm9yXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJvYmxlbSB3aXRoIHNraXBwaW5nIEpQRUcyMDAwIGJveCwgc3RyZWFtIGVycm9yXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2RhdGEpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCW9wal9mcmVlKGxfY3VycmVudF9kYXRhKTsKKyAgICBvcGpfZnJlZShsX2N1cnJlbnRfZGF0YSk7CiAKLQlyZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiAvKioKLSAqIEV4Y3V0ZXMgdGhlIGdpdmVuIHByb2NlZHVyZXMgb24gdGhlIGdpdmVuIGNvZGVjLgorICogRXhlY3V0ZXMgdGhlIGdpdmVuIHByb2NlZHVyZXMgb24gdGhlIGdpdmVuIGNvZGVjLgogICoKLSAqIEBwYXJhbQlwX3Byb2NlZHVyZV9saXN0CXRoZSBsaXN0IG9mIHByb2NlZHVyZXMgdG8gZXhlY3V0ZQotICogQHBhcmFtCWpwMgkJCQkJdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMgdG8gZXhlY3V0ZSB0aGUgcHJvY2VkdXJlcyBvbi4KLSAqIEBwYXJhbQlzdHJlYW0JCQkJCXRoZSBzdHJlYW0gdG8gZXhlY3V0ZSB0aGUgcHJvY2VkdXJlcyBvbi4KLSAqIEBwYXJhbQlwX21hbmFnZXIJCQl0aGUgdXNlciBtYW5hZ2VyLgorICogQHBhcmFtICAgcF9wcm9jZWR1cmVfbGlzdCAgICB0aGUgbGlzdCBvZiBwcm9jZWR1cmVzIHRvIGV4ZWN1dGUKKyAqIEBwYXJhbSAgIGpwMiAgICAgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMgdG8gZXhlY3V0ZSB0aGUgcHJvY2VkdXJlcyBvbi4KKyAqIEBwYXJhbSAgIHN0cmVhbSAgICAgICAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gZXhlY3V0ZSB0aGUgcHJvY2VkdXJlcyBvbi4KKyAqIEBwYXJhbSAgIHBfbWFuYWdlciAgICAgICAgICAgdGhlIHVzZXIgbWFuYWdlci4KICAqCi0gKiBAcmV0dXJuCXRydWUJCQkJaWYgYWxsIHRoZSBwcm9jZWR1cmVzIHdlcmUgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVkLgorICogQHJldHVybiAgdHJ1ZSAgICAgICAgICAgICAgICBpZiBhbGwgdGhlIHByb2NlZHVyZXMgd2VyZSBzdWNjZXNzZnVsbHkgZXhlY3V0ZWQuCiAgKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX2V4ZWMgKCAgb3BqX2pwMl90ICoganAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcHJvY2VkdXJlX2xpc3RfdCAqIHBfcHJvY2VkdXJlX2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9leGVjKG9wal9qcDJfdCAqIGpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X3QgKiBwX3Byb2NlZHVyZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAKIHsKLQlPUEpfQk9PTCAoKiogbF9wcm9jZWR1cmUpIChvcGpfanAyX3QgKiBqcDIsIG9wal9zdHJlYW1fcHJpdmF0ZV90ICosIG9wal9ldmVudF9tZ3JfdCAqKSA9IDAwOwotCU9QSl9CT09MIGxfcmVzdWx0ID0gT1BKX1RSVUU7Ci0JT1BKX1VJTlQzMiBsX25iX3Byb2MsIGk7CisgICAgT1BKX0JPT0woKiogbF9wcm9jZWR1cmUpKG9wal9qcDJfdCAqIGpwMiwgb3BqX3N0cmVhbV9wcml2YXRlX3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICopID0gMDA7CisgICAgT1BKX0JPT0wgbF9yZXN1bHQgPSBPUEpfVFJVRTsKKyAgICBPUEpfVUlOVDMyIGxfbmJfcHJvYywgaTsKIAotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQocF9wcm9jZWR1cmVfbGlzdCAhPSAwMCk7Ci0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KHN0cmVhbSAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX3Byb2NlZHVyZV9saXN0ICE9IDAwKTsKKyAgICBhc3NlcnQoanAyICE9IDAwKTsKKyAgICBhc3NlcnQoc3RyZWFtICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKIAotCWxfbmJfcHJvYyA9IG9wal9wcm9jZWR1cmVfbGlzdF9nZXRfbmJfcHJvY2VkdXJlcyhwX3Byb2NlZHVyZV9saXN0KTsKLQlsX3Byb2NlZHVyZSA9IChPUEpfQk9PTCAoKiopIChvcGpfanAyX3QgKiBqcDIsIG9wal9zdHJlYW1fcHJpdmF0ZV90ICosIG9wal9ldmVudF9tZ3JfdCAqKSkgb3BqX3Byb2NlZHVyZV9saXN0X2dldF9maXJzdF9wcm9jZWR1cmUocF9wcm9jZWR1cmVfbGlzdCk7CisgICAgbF9uYl9wcm9jID0gb3BqX3Byb2NlZHVyZV9saXN0X2dldF9uYl9wcm9jZWR1cmVzKHBfcHJvY2VkdXJlX2xpc3QpOworICAgIGxfcHJvY2VkdXJlID0gKE9QSl9CT09MKCoqKShvcGpfanAyX3QgKiBqcDIsIG9wal9zdHJlYW1fcHJpdmF0ZV90ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqKSkgb3BqX3Byb2NlZHVyZV9saXN0X2dldF9maXJzdF9wcm9jZWR1cmUocF9wcm9jZWR1cmVfbGlzdCk7CiAKLQlmb3IJKGk9MDtpPGxfbmJfcHJvYzsrK2kpIHsKLQkJbF9yZXN1bHQgPSBsX3Jlc3VsdCAmJiAoKmxfcHJvY2VkdXJlKSAoanAyLHN0cmVhbSxwX21hbmFnZXIpOwotCQkrK2xfcHJvY2VkdXJlOwotCX0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbF9uYl9wcm9jOyArK2kpIHsKKyAgICAgICAgbF9yZXN1bHQgPSBsX3Jlc3VsdCAmJiAoKmxfcHJvY2VkdXJlKShqcDIsIHN0cmVhbSwgcF9tYW5hZ2VyKTsKKyAgICAgICAgKytsX3Byb2NlZHVyZTsKKyAgICB9CiAKLQkvKiBhbmQgY2xlYXIgdGhlIHByb2NlZHVyZSBsaXN0IGF0IHRoZSBlbmQuICovCi0Jb3BqX3Byb2NlZHVyZV9saXN0X2NsZWFyKHBfcHJvY2VkdXJlX2xpc3QpOwotCXJldHVybiBsX3Jlc3VsdDsKKyAgICAvKiBhbmQgY2xlYXIgdGhlIHByb2NlZHVyZSBsaXN0IGF0IHRoZSBlbmQuICovCisgICAgb3BqX3Byb2NlZHVyZV9saXN0X2NsZWFyKHBfcHJvY2VkdXJlX2xpc3QpOworICAgIHJldHVybiBsX3Jlc3VsdDsKIH0KIAogT1BKX0JPT0wgb3BqX2pwMl9zdGFydF9jb21wcmVzcyhvcGpfanAyX3QgKmpwMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKiBwX2ltYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KHN0cmVhbSAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChqcDIgIT0gMDApOworICAgIGFzc2VydChzdHJlYW0gIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0JLyogY3VzdG9taXphdGlvbiBvZiB0aGUgdmFsaWRhdGlvbiAqLwotCWlmICghIG9wal9qcDJfc2V0dXBfZW5jb2RpbmdfdmFsaWRhdGlvbiAoanAyLCBwX21hbmFnZXIpKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgIC8qIGN1c3RvbWl6YXRpb24gb2YgdGhlIHZhbGlkYXRpb24gKi8KKyAgICBpZiAoISBvcGpfanAyX3NldHVwX2VuY29kaW5nX3ZhbGlkYXRpb24oanAyLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0JLyogdmFsaWRhdGlvbiBvZiB0aGUgcGFyYW1ldGVycyBjb2RlYyAqLwotCWlmICghIG9wal9qcDJfZXhlYyhqcDIsanAyLT5tX3ZhbGlkYXRpb25fbGlzdCxzdHJlYW0scF9tYW5hZ2VyKSkgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KKyAgICAvKiB2YWxpZGF0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzIGNvZGVjICovCisgICAgaWYgKCEgb3BqX2pwMl9leGVjKGpwMiwganAyLT5tX3ZhbGlkYXRpb25fbGlzdCwgc3RyZWFtLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0JLyogY3VzdG9taXphdGlvbiBvZiB0aGUgZW5jb2RpbmcgKi8KLQlpZiAoISBvcGpfanAyX3NldHVwX2hlYWRlcl93cml0aW5nKGpwMiwgcF9tYW5hZ2VyKSkgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KKyAgICAvKiBjdXN0b21pemF0aW9uIG9mIHRoZSBlbmNvZGluZyAqLworICAgIGlmICghIG9wal9qcDJfc2V0dXBfaGVhZGVyX3dyaXRpbmcoanAyLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0JLyogd3JpdGUgaGVhZGVyICovCi0JaWYgKCEgb3BqX2pwMl9leGVjIChqcDIsanAyLT5tX3Byb2NlZHVyZV9saXN0LHN0cmVhbSxwX21hbmFnZXIpKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgIC8qIHdyaXRlIGhlYWRlciAqLworICAgIGlmICghIG9wal9qcDJfZXhlYyhqcDIsIGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwgc3RyZWFtLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0JcmV0dXJuIG9wal9qMmtfc3RhcnRfY29tcHJlc3MoanAyLT5qMmssc3RyZWFtLHBfaW1hZ2UscF9tYW5hZ2VyKTsKKyAgICByZXR1cm4gb3BqX2oya19zdGFydF9jb21wcmVzcyhqcDItPmoyaywgc3RyZWFtLCBwX2ltYWdlLCBwX21hbmFnZXIpOwogfQogCi1zdGF0aWMgY29uc3Qgb3BqX2pwMl9oZWFkZXJfaGFuZGxlcl90ICogb3BqX2pwMl9maW5kX2hhbmRsZXIgKE9QSl9VSU5UMzIgcF9pZCkKK3N0YXRpYyBjb25zdCBvcGpfanAyX2hlYWRlcl9oYW5kbGVyX3QgKiBvcGpfanAyX2ZpbmRfaGFuZGxlcihPUEpfVUlOVDMyIHBfaWQpCiB7Ci0JT1BKX1VJTlQzMiBpLCBsX2hhbmRsZXJfc2l6ZSA9IHNpemVvZihqcDJfaGVhZGVyKSAvIHNpemVvZihvcGpfanAyX2hlYWRlcl9oYW5kbGVyX3QpOworICAgIE9QSl9VSU5UMzIgaSwgbF9oYW5kbGVyX3NpemUgPSBzaXplb2YoanAyX2hlYWRlcikgLyBzaXplb2YoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfanAyX2hlYWRlcl9oYW5kbGVyX3QpOwogCi0JZm9yIChpPTA7aTxsX2hhbmRsZXJfc2l6ZTsrK2kpIHsKLQkJaWYgKGpwMl9oZWFkZXJbaV0uaWQgPT0gcF9pZCkgewotCQkJcmV0dXJuICZqcDJfaGVhZGVyW2ldOwotCQl9Ci0JfQotCXJldHVybiBOVUxMOworICAgIGZvciAoaSA9IDA7IGkgPCBsX2hhbmRsZXJfc2l6ZTsgKytpKSB7CisgICAgICAgIGlmIChqcDJfaGVhZGVyW2ldLmlkID09IHBfaWQpIHsKKyAgICAgICAgICAgIHJldHVybiAmanAyX2hlYWRlcltpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKIH0KIAogLyoqCiAgKiBGaW5kcyB0aGUgaW1hZ2UgZXhlY3V0aW9uIGZ1bmN0aW9uIHJlbGF0ZWQgdG8gdGhlIGdpdmVuIGJveCBpZC4KICAqCi0gKiBAcGFyYW0JcF9pZAl0aGUgaWQgb2YgdGhlIGhhbmRsZXIgdG8gZmV0Y2guCisgKiBAcGFyYW0gICBwX2lkICAgIHRoZSBpZCBvZiB0aGUgaGFuZGxlciB0byBmZXRjaC4KICAqCi0gKiBAcmV0dXJuCXRoZSBnaXZlbiBoYW5kbGVyIG9yIDAwIGlmIGl0IGNvdWxkIG5vdCBiZSBmb3VuZC4KKyAqIEByZXR1cm4gIHRoZSBnaXZlbiBoYW5kbGVyIG9yIDAwIGlmIGl0IGNvdWxkIG5vdCBiZSBmb3VuZC4KICAqLwotc3RhdGljIGNvbnN0IG9wal9qcDJfaGVhZGVyX2hhbmRsZXJfdCAqIG9wal9qcDJfaW1nX2ZpbmRfaGFuZGxlciAoT1BKX1VJTlQzMiBwX2lkKQorc3RhdGljIGNvbnN0IG9wal9qcDJfaGVhZGVyX2hhbmRsZXJfdCAqIG9wal9qcDJfaW1nX2ZpbmRfaGFuZGxlcigKKyAgICBPUEpfVUlOVDMyIHBfaWQpCiB7Ci0JT1BKX1VJTlQzMiBpLCBsX2hhbmRsZXJfc2l6ZSA9IHNpemVvZihqcDJfaW1nX2hlYWRlcikgLyBzaXplb2Yob3BqX2pwMl9oZWFkZXJfaGFuZGxlcl90KTsKLQlmb3IgKGk9MDtpPGxfaGFuZGxlcl9zaXplOysraSkKLQl7Ci0JCWlmIChqcDJfaW1nX2hlYWRlcltpXS5pZCA9PSBwX2lkKSB7Ci0JCQlyZXR1cm4gJmpwMl9pbWdfaGVhZGVyW2ldOwotCQl9Ci0JfQorICAgIE9QSl9VSU5UMzIgaSwgbF9oYW5kbGVyX3NpemUgPSBzaXplb2YoanAyX2ltZ19oZWFkZXIpIC8gc2l6ZW9mKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2pwMl9oZWFkZXJfaGFuZGxlcl90KTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbF9oYW5kbGVyX3NpemU7ICsraSkgeworICAgICAgICBpZiAoanAyX2ltZ19oZWFkZXJbaV0uaWQgPT0gcF9pZCkgeworICAgICAgICAgICAgcmV0dXJuICZqcDJfaW1nX2hlYWRlcltpXTsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiAvKioKICAqIFJlYWRzIGEganBlZzIwMDAgZmlsZSBzaWduYXR1cmUgYm94LgogICoKLSAqIEBwYXJhbQlwX2hlYWRlcl9kYXRhCXRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgc2lnbmF0dXJlIGJveC4KLSAqIEBwYXJhbQlqcDIJCQkJdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCi0gKiBAcGFyYW0JcF9oZWFkZXJfc2l6ZQl0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIHNpZ25hdHVyZSBib3guCi0gKiBAcGFyYW0JcF9tYW5hZ2VyCQl0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorICogQHBhcmFtICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgc2lnbmF0dXJlIGJveC4KKyAqIEBwYXJhbSAgIGpwMiAgICAgICAgICAgICB0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KKyAqIEBwYXJhbSAgIHBfaGVhZGVyX3NpemUgICB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIHNpZ25hdHVyZSBib3guCisgKiBAcGFyYW0gICBwX21hbmFnZXIgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICAqCiAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGZpbGUgc2lnbmF0dXJlIGJveCBpcyB2YWxpZC4KICAqLwpAQCAtMjM0Nyw1NzggKzI1NTAsNjM0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9oZWFkZXJfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIAogewotCU9QSl9VSU5UMzIgbF9tYWdpY19udW1iZXI7CisgICAgT1BKX1VJTlQzMiBsX21hZ2ljX251bWJlcjsKIAotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7Ci0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKKyAgICBhc3NlcnQoanAyICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKIAotCWlmIChqcDItPmpwMl9zdGF0ZSAhPSBKUDJfU1RBVEVfTk9ORSkgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiVGhlIHNpZ25hdHVyZSBib3ggbXVzdCBiZSB0aGUgZmlyc3QgYm94IGluIHRoZSBmaWxlLlxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgIGlmIChqcDItPmpwMl9zdGF0ZSAhPSBKUDJfU1RBVEVfTk9ORSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJUaGUgc2lnbmF0dXJlIGJveCBtdXN0IGJlIHRoZSBmaXJzdCBib3ggaW4gdGhlIGZpbGUuXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLQkvKiBhc3N1cmUgbGVuZ3RoIG9mIGRhdGEgaXMgY29ycmVjdCAoNCAtPiBtYWdpYyBudW1iZXIpICovCi0JaWYgKHBfaGVhZGVyX3NpemUgIT0gNCkgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd2l0aCBKUCBzaWduYXR1cmUgQm94IHNpemVcbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KKyAgICAvKiBhc3N1cmUgbGVuZ3RoIG9mIGRhdGEgaXMgY29ycmVjdCAoNCAtPiBtYWdpYyBudW1iZXIpICovCisgICAgaWYgKHBfaGVhZGVyX3NpemUgIT0gNCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRXJyb3Igd2l0aCBKUCBzaWduYXR1cmUgQm94IHNpemVcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotCS8qIHJlYXJyYW5nZSBkYXRhICovCi0Jb3BqX3JlYWRfYnl0ZXMocF9oZWFkZXJfZGF0YSwmbF9tYWdpY19udW1iZXIsNCk7Ci0JaWYgKGxfbWFnaWNfbnVtYmVyICE9IDB4MGQwYTg3MGEgKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3aXRoIEpQIFNpZ25hdHVyZSA6IGJhZCBtYWdpYyBudW1iZXJcbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KKyAgICAvKiByZWFycmFuZ2UgZGF0YSAqLworICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsICZsX21hZ2ljX251bWJlciwgNCk7CisgICAgaWYgKGxfbWFnaWNfbnVtYmVyICE9IDB4MGQwYTg3MGEpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2l0aCBKUCBTaWduYXR1cmUgOiBiYWQgbWFnaWMgbnVtYmVyXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLQlqcDItPmpwMl9zdGF0ZSB8PSBKUDJfU1RBVEVfU0lHTkFUVVJFOworICAgIGpwMi0+anAyX3N0YXRlIHw9IEpQMl9TVEFURV9TSUdOQVRVUkU7CiAKLQlyZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiAvKioKICAqIFJlYWRzIGEgYSBGVFlQIGJveCAtIEZpbGUgdHlwZSBib3gKICAqCi0gKiBAcGFyYW0JcF9oZWFkZXJfZGF0YQl0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIEZUWVAgYm94LgotICogQHBhcmFtCWpwMgkJCQl0aGUganBlZzIwMDAgZmlsZSBjb2RlYy4KLSAqIEBwYXJhbQlwX2hlYWRlcl9zaXplCXRoZSBzaXplIG9mIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgRlRZUCBib3guCi0gKiBAcGFyYW0JcF9tYW5hZ2VyCQl0aGUgdXNlciBldmVudCBtYW5hZ2VyLgorICogQHBhcmFtICAgcF9oZWFkZXJfZGF0YSAgIHRoZSBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgRlRZUCBib3guCisgKiBAcGFyYW0gICBqcDIgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCisgKiBAcGFyYW0gICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBGVFlQIGJveC4KKyAqIEBwYXJhbSAgIHBfbWFuYWdlciAgICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogICoKICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgRlRZUCBib3ggaXMgdmFsaWQuCiAgKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfZnR5cCgJb3BqX2pwMl90ICpqcDIsCi0JCQkJCQkJCQlPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCi0JCQkJCQkJCQlPUEpfVUlOVDMyIHBfaGVhZGVyX3NpemUsCi0JCQkJCQkJCQlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfZnR5cChvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewotCU9QSl9VSU5UMzIgaSwgbF9yZW1haW5pbmdfYnl0ZXM7CisgICAgT1BKX1VJTlQzMiBpLCBsX3JlbWFpbmluZ19ieXRlczsKIAotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7Ci0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKKyAgICBhc3NlcnQoanAyICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKIAotCWlmIChqcDItPmpwMl9zdGF0ZSAhPSBKUDJfU1RBVEVfU0lHTkFUVVJFKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJUaGUgZnR5cCBib3ggbXVzdCBiZSB0aGUgc2Vjb25kIGJveCBpbiB0aGUgZmlsZS5cbiIpOwotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KKyAgICBpZiAoanAyLT5qcDJfc3RhdGUgIT0gSlAyX1NUQVRFX1NJR05BVFVSRSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJUaGUgZnR5cCBib3ggbXVzdCBiZSB0aGUgc2Vjb25kIGJveCBpbiB0aGUgZmlsZS5cbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotCS8qIGFzc3VyZSBsZW5ndGggb2YgZGF0YSBpcyBjb3JyZWN0ICovCi0JaWYgKHBfaGVhZGVyX3NpemUgPCA4KSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3aXRoIEZUWVAgc2lnbmF0dXJlIEJveCBzaXplXG4iKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9CisgICAgLyogYXNzdXJlIGxlbmd0aCBvZiBkYXRhIGlzIGNvcnJlY3QgKi8KKyAgICBpZiAocF9oZWFkZXJfc2l6ZSA8IDgpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdpdGggRlRZUCBzaWduYXR1cmUgQm94IHNpemVcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotCW9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsJmpwMi0+YnJhbmQsNCk7CQkvKiBCUiAqLwotCXBfaGVhZGVyX2RhdGEgKz0gNDsKKyAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAmanAyLT5icmFuZCwgNCk7ICAgICAgLyogQlIgKi8KKyAgICBwX2hlYWRlcl9kYXRhICs9IDQ7CiAKLQlvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZqcDItPm1pbnZlcnNpb24sNCk7CQkvKiBNaW5WICovCi0JcF9oZWFkZXJfZGF0YSArPSA0OworICAgIG9wal9yZWFkX2J5dGVzKHBfaGVhZGVyX2RhdGEsICZqcDItPm1pbnZlcnNpb24sIDQpOyAgICAgLyogTWluViAqLworICAgIHBfaGVhZGVyX2RhdGEgKz0gNDsKIAotCWxfcmVtYWluaW5nX2J5dGVzID0gcF9oZWFkZXJfc2l6ZSAtIDg7CisgICAgbF9yZW1haW5pbmdfYnl0ZXMgPSBwX2hlYWRlcl9zaXplIC0gODsKIAotCS8qIHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIGJ5dGVzIHNob3VsZCBiZSBhIG11bHRpcGxlIG9mIDQgKi8KLQlpZiAoKGxfcmVtYWluaW5nX2J5dGVzICYgMHgzKSAhPSAwKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJFcnJvciB3aXRoIEZUWVAgc2lnbmF0dXJlIEJveCBzaXplXG4iKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9CisgICAgLyogdGhlIG51bWJlciBvZiByZW1haW5pbmcgYnl0ZXMgc2hvdWxkIGJlIGEgbXVsdGlwbGUgb2YgNCAqLworICAgIGlmICgobF9yZW1haW5pbmdfYnl0ZXMgJiAweDMpICE9IDApIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkVycm9yIHdpdGggRlRZUCBzaWduYXR1cmUgQm94IHNpemVcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotCS8qIGRpdiBieSA0ICovCi0JanAyLT5udW1jbCA9IGxfcmVtYWluaW5nX2J5dGVzID4+IDI7Ci0JaWYgKGpwMi0+bnVtY2wpIHsKLQkJanAyLT5jbCA9IChPUEpfVUlOVDMyICopIG9wal9jYWxsb2MoanAyLT5udW1jbCwgc2l6ZW9mKE9QSl9VSU5UMzIpKTsKLQkJaWYgKGpwMi0+Y2wgPT0gMDApIHsKLQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB3aXRoIEZUWVAgQm94XG4iKTsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQl9CisgICAgLyogZGl2IGJ5IDQgKi8KKyAgICBqcDItPm51bWNsID0gbF9yZW1haW5pbmdfYnl0ZXMgPj4gMjsKKyAgICBpZiAoanAyLT5udW1jbCkgeworICAgICAgICBqcDItPmNsID0gKE9QSl9VSU5UMzIgKikgb3BqX2NhbGxvYyhqcDItPm51bWNsLCBzaXplb2YoT1BKX1VJTlQzMikpOworICAgICAgICBpZiAoanAyLT5jbCA9PSAwMCkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHdpdGggRlRZUCBCb3hcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgIH0KIAotCWZvciAoaSA9IDA7IGkgPCBqcDItPm51bWNsOyArK2kpCi0JewotCQlvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCZqcDItPmNsW2ldLDQpOwkJLyogQ0xpICovCi0JCXBfaGVhZGVyX2RhdGEgKz0gNDsKLQl9CisgICAgZm9yIChpID0gMDsgaSA8IGpwMi0+bnVtY2w7ICsraSkgeworICAgICAgICBvcGpfcmVhZF9ieXRlcyhwX2hlYWRlcl9kYXRhLCAmanAyLT5jbFtpXSwgNCk7ICAgICAgLyogQ0xpICovCisgICAgICAgIHBfaGVhZGVyX2RhdGEgKz0gNDsKKyAgICB9CiAKLQlqcDItPmpwMl9zdGF0ZSB8PSBKUDJfU1RBVEVfRklMRV9UWVBFOworICAgIGpwMi0+anAyX3N0YXRlIHw9IEpQMl9TVEFURV9GSUxFX1RZUEU7CiAKLQlyZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9za2lwX2pwMmMoCW9wal9qcDJfdCAqanAyLAotCQkJCQkgICAgCW9wal9zdHJlYW1fcHJpdmF0ZV90ICpzdHJlYW0sCi0JCQkJCSAgICAJb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3NraXBfanAyYyhvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKIHsKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KHN0cmVhbSAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChqcDIgIT0gMDApOworICAgIGFzc2VydChzdHJlYW0gIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0JanAyLT5qMmtfY29kZXN0cmVhbV9vZmZzZXQgPSBvcGpfc3RyZWFtX3RlbGwoc3RyZWFtKTsKKyAgICBqcDItPmoya19jb2Rlc3RyZWFtX29mZnNldCA9IG9wal9zdHJlYW1fdGVsbChzdHJlYW0pOwogCi0JaWYgKG9wal9zdHJlYW1fc2tpcChzdHJlYW0sOCxwX21hbmFnZXIpICE9IDgpIHsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9CisgICAgaWYgKG9wal9zdHJlYW1fc2tpcChzdHJlYW0sIDgsIHBfbWFuYWdlcikgIT0gOCkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotCXJldHVybiBPUEpfVFJVRTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfanBpcF9za2lwX2lwdHIoCW9wal9qcDJfdCAqanAyLAotICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqc3RyZWFtLAotICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQorc3RhdGljIE9QSl9CT09MIG9wal9qcGlwX3NraXBfaXB0cihvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQogewotICAvKiBwcmVjb25kaXRpb25zICovCi0gIGFzc2VydChqcDIgIT0gMDApOwotICBhc3NlcnQoc3RyZWFtICE9IDAwKTsKLSAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChqcDIgIT0gMDApOworICAgIGFzc2VydChzdHJlYW0gIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0gIGpwMi0+anBpcF9pcHRyX29mZnNldCA9IG9wal9zdHJlYW1fdGVsbChzdHJlYW0pOworICAgIGpwMi0+anBpcF9pcHRyX29mZnNldCA9IG9wal9zdHJlYW1fdGVsbChzdHJlYW0pOwogCi0gIGlmIChvcGpfc3RyZWFtX3NraXAoc3RyZWFtLDI0LHBfbWFuYWdlcikgIT0gMjQpIHsKLSAgICByZXR1cm4gT1BKX0ZBTFNFOwotICB9CisgICAgaWYgKG9wal9zdHJlYW1fc2tpcChzdHJlYW0sIDI0LCBwX21hbmFnZXIpICE9IDI0KSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gIHJldHVybiBPUEpfVFJVRTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKIC8qKgogICogUmVhZHMgdGhlIEpwZWcyMDAwIGZpbGUgSGVhZGVyIGJveCAtIEpQMiBIZWFkZXIgYm94ICh3YXJuaW5nLCB0aGlzIGlzIGEgc3VwZXIgYm94KS4KICAqCi0gKiBAcGFyYW0JcF9oZWFkZXJfZGF0YQl0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIGZpbGUgaGVhZGVyIGJveC4KLSAqIEBwYXJhbQlqcDIJCQkJdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCi0gKiBAcGFyYW0JcF9oZWFkZXJfc2l6ZQl0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhlIGZpbGUgaGVhZGVyIGJveC4KLSAqIEBwYXJhbQlwX21hbmFnZXIJCXRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCisgKiBAcGFyYW0gICBwX2hlYWRlcl9kYXRhICAgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBmaWxlIGhlYWRlciBib3guCisgKiBAcGFyYW0gICBqcDIgICAgICAgICAgICAgdGhlIGpwZWcyMDAwIGZpbGUgY29kZWMuCisgKiBAcGFyYW0gICBwX2hlYWRlcl9zaXplICAgdGhlIHNpemUgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSBmaWxlIGhlYWRlciBib3guCisgKiBAcGFyYW0gICBwX21hbmFnZXIgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlci4KICAqCiAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIEpQMiBIZWFkZXIgYm94IHdhcyBzdWNjZXNzZnVsbHkgcmVjb2duaXplZC4KICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2pwMmgoICBvcGpfanAyX3QgKmpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpwX2hlYWRlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2pwMmgob3BqX2pwMl90ICpqcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKnBfaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewotCU9QSl9VSU5UMzIgbF9ib3hfc2l6ZT0wLCBsX2N1cnJlbnRfZGF0YV9zaXplID0gMDsKLQlvcGpfanAyX2JveF90IGJveDsKLQljb25zdCBvcGpfanAyX2hlYWRlcl9oYW5kbGVyX3QgKiBsX2N1cnJlbnRfaGFuZGxlcjsKLQlPUEpfQk9PTCBsX2hhc19paGRyID0gMDsKKyAgICBPUEpfVUlOVDMyIGxfYm94X3NpemUgPSAwLCBsX2N1cnJlbnRfZGF0YV9zaXplID0gMDsKKyAgICBvcGpfanAyX2JveF90IGJveDsKKyAgICBjb25zdCBvcGpfanAyX2hlYWRlcl9oYW5kbGVyX3QgKiBsX2N1cnJlbnRfaGFuZGxlcjsKKyAgICBPUEpfQk9PTCBsX2hhc19paGRyID0gMDsKIAotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQocF9oZWFkZXJfZGF0YSAhPSAwMCk7Ci0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2hlYWRlcl9kYXRhICE9IDAwKTsKKyAgICBhc3NlcnQoanAyICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKIAotCS8qIG1ha2Ugc3VyZSB0aGUgYm94IGlzIHdlbGwgcGxhY2VkICovCi0JaWYgKChqcDItPmpwMl9zdGF0ZSAmIEpQMl9TVEFURV9GSUxFX1RZUEUpICE9IEpQMl9TVEFURV9GSUxFX1RZUEUgKSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJUaGUgIGJveCBtdXN0IGJlIHRoZSBmaXJzdCBib3ggaW4gdGhlIGZpbGUuXG4iKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9CisgICAgLyogbWFrZSBzdXJlIHRoZSBib3ggaXMgd2VsbCBwbGFjZWQgKi8KKyAgICBpZiAoKGpwMi0+anAyX3N0YXRlICYgSlAyX1NUQVRFX0ZJTEVfVFlQRSkgIT0gSlAyX1NUQVRFX0ZJTEVfVFlQRSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJUaGUgIGJveCBtdXN0IGJlIHRoZSBmaXJzdCBib3ggaW4gdGhlIGZpbGUuXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLQlqcDItPmpwMl9pbWdfc3RhdGUgPSBKUDJfSU1HX1NUQVRFX05PTkU7CisgICAganAyLT5qcDJfaW1nX3N0YXRlID0gSlAyX0lNR19TVEFURV9OT05FOwogCi0JLyogaXRlcmF0ZSB3aGlsZSByZW1haW5pbmcgZGF0YSAqLwotCXdoaWxlIChwX2hlYWRlcl9zaXplID4gMCkgeworICAgIC8qIGl0ZXJhdGUgd2hpbGUgcmVtYWluaW5nIGRhdGEgKi8KKyAgICB3aGlsZSAocF9oZWFkZXJfc2l6ZSA+IDApIHsKIAotCQlpZiAoISBvcGpfanAyX3JlYWRfYm94aGRyX2NoYXIoJmJveCxwX2hlYWRlcl9kYXRhLCZsX2JveF9zaXplLHBfaGVhZGVyX3NpemUsIHBfbWFuYWdlcikpIHsKLQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJTdHJlYW0gZXJyb3Igd2hpbGUgcmVhZGluZyBKUDIgSGVhZGVyIGJveFxuIik7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9CisgICAgICAgIGlmICghIG9wal9qcDJfcmVhZF9ib3hoZHJfY2hhcigmYm94LCBwX2hlYWRlcl9kYXRhLCAmbF9ib3hfc2l6ZSwgcF9oZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJTdHJlYW0gZXJyb3Igd2hpbGUgcmVhZGluZyBKUDIgSGVhZGVyIGJveFxuIik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CiAKLQkJaWYgKGJveC5sZW5ndGggPiBwX2hlYWRlcl9zaXplKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIGVycm9yIHdoaWxlIHJlYWRpbmcgSlAyIEhlYWRlciBib3g6IGJveCBsZW5ndGggaXMgaW5jb25zaXN0ZW50LlxuIik7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9CisgICAgICAgIGlmIChib3gubGVuZ3RoID4gcF9oZWFkZXJfc2l6ZSkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0cmVhbSBlcnJvciB3aGlsZSByZWFkaW5nIEpQMiBIZWFkZXIgYm94OiBib3ggbGVuZ3RoIGlzIGluY29uc2lzdGVudC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQogCi0JCWxfY3VycmVudF9oYW5kbGVyID0gb3BqX2pwMl9pbWdfZmluZF9oYW5kbGVyKGJveC50eXBlKTsKLQkJbF9jdXJyZW50X2RhdGFfc2l6ZSA9IGJveC5sZW5ndGggLSBsX2JveF9zaXplOwotCQlwX2hlYWRlcl9kYXRhICs9IGxfYm94X3NpemU7CisgICAgICAgIGxfY3VycmVudF9oYW5kbGVyID0gb3BqX2pwMl9pbWdfZmluZF9oYW5kbGVyKGJveC50eXBlKTsKKyAgICAgICAgbF9jdXJyZW50X2RhdGFfc2l6ZSA9IGJveC5sZW5ndGggLSBsX2JveF9zaXplOworICAgICAgICBwX2hlYWRlcl9kYXRhICs9IGxfYm94X3NpemU7CiAKLQkJaWYgKGxfY3VycmVudF9oYW5kbGVyICE9IDAwKSB7Ci0JCQlpZiAoISBsX2N1cnJlbnRfaGFuZGxlci0+aGFuZGxlcihqcDIscF9oZWFkZXJfZGF0YSxsX2N1cnJlbnRfZGF0YV9zaXplLHBfbWFuYWdlcikpIHsKLQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJanAyLT5qcDJfaW1nX3N0YXRlIHw9IEpQMl9JTUdfU1RBVEVfVU5LTk9XTjsKLQkJfQorICAgICAgICBpZiAobF9jdXJyZW50X2hhbmRsZXIgIT0gMDApIHsKKyAgICAgICAgICAgIGlmICghIGxfY3VycmVudF9oYW5kbGVyLT5oYW5kbGVyKGpwMiwgcF9oZWFkZXJfZGF0YSwgbF9jdXJyZW50X2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAganAyLT5qcDJfaW1nX3N0YXRlIHw9IEpQMl9JTUdfU1RBVEVfVU5LTk9XTjsKKyAgICAgICAgfQogCi0JCWlmIChib3gudHlwZSA9PSBKUDJfSUhEUikgewotCQkJbF9oYXNfaWhkciA9IDE7Ci0JCX0KKyAgICAgICAgaWYgKGJveC50eXBlID09IEpQMl9JSERSKSB7CisgICAgICAgICAgICBsX2hhc19paGRyID0gMTsKKyAgICAgICAgfQogCi0JCXBfaGVhZGVyX2RhdGEgKz0gbF9jdXJyZW50X2RhdGFfc2l6ZTsKLQkJcF9oZWFkZXJfc2l6ZSAtPSBib3gubGVuZ3RoOwotCX0KKyAgICAgICAgcF9oZWFkZXJfZGF0YSArPSBsX2N1cnJlbnRfZGF0YV9zaXplOworICAgICAgICBwX2hlYWRlcl9zaXplIC09IGJveC5sZW5ndGg7CisgICAgfQogCi0JaWYgKGxfaGFzX2loZHIgPT0gMCkgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiU3RyZWFtIGVycm9yIHdoaWxlIHJlYWRpbmcgSlAyIEhlYWRlciBib3g6IG5vICdpaGRyJyBib3guXG4iKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9CisgICAgaWYgKGxfaGFzX2loZHIgPT0gMCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJTdHJlYW0gZXJyb3Igd2hpbGUgcmVhZGluZyBKUDIgSGVhZGVyIGJveDogbm8gJ2loZHInIGJveC5cbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotCWpwMi0+anAyX3N0YXRlIHw9IEpQMl9TVEFURV9IRUFERVI7CisgICAganAyLT5qcDJfc3RhdGUgfD0gSlAyX1NUQVRFX0hFQURFUjsKKyAgICBqcDItPmhhc19qcDJoID0gMTsKIAotCXJldHVybiBPUEpfVFJVRTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3JlYWRfYm94aGRyX2NoYXIoICAgb3BqX2pwMl9ib3hfdCAqYm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX251bWJlcl9ieXRlc19yZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9ib3hfbWF4X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorc3RhdGljIE9QSl9CT09MIG9wal9qcDJfcmVhZF9ib3hoZHJfY2hhcihvcGpfanAyX2JveF90ICpib3gsCisgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAorICAgICAgICBPUEpfVUlOVDMyICogcF9udW1iZXJfYnl0ZXNfcmVhZCwKKyAgICAgICAgT1BKX1VJTlQzMiBwX2JveF9tYXhfc2l6ZSwKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewotCU9QSl9VSU5UMzIgbF92YWx1ZTsKKyAgICBPUEpfVUlOVDMyIGxfdmFsdWU7CiAKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KHBfZGF0YSAhPSAwMCk7Ci0JYXNzZXJ0KGJveCAhPSAwMCk7Ci0JYXNzZXJ0KHBfbnVtYmVyX2J5dGVzX3JlYWQgIT0gMDApOwotCWFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9kYXRhICE9IDAwKTsKKyAgICBhc3NlcnQoYm94ICE9IDAwKTsKKyAgICBhc3NlcnQocF9udW1iZXJfYnl0ZXNfcmVhZCAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CiAKLQlpZiAocF9ib3hfbWF4X3NpemUgPCA4KSB7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJDYW5ub3QgaGFuZGxlIGJveCBvZiBsZXNzIHRoYW4gOCBieXRlc1xuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgIGlmIChwX2JveF9tYXhfc2l6ZSA8IDgpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkNhbm5vdCBoYW5kbGUgYm94IG9mIGxlc3MgdGhhbiA4IGJ5dGVzXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLQkvKiBwcm9jZXNzIHJlYWQgZGF0YSAqLwotCW9wal9yZWFkX2J5dGVzKHBfZGF0YSwgJmxfdmFsdWUsIDQpOwotCXBfZGF0YSArPSA0OwotCWJveC0+bGVuZ3RoID0gKE9QSl9VSU5UMzIpKGxfdmFsdWUpOworICAgIC8qIHByb2Nlc3MgcmVhZCBkYXRhICovCisgICAgb3BqX3JlYWRfYnl0ZXMocF9kYXRhLCAmbF92YWx1ZSwgNCk7CisgICAgcF9kYXRhICs9IDQ7CisgICAgYm94LT5sZW5ndGggPSAoT1BKX1VJTlQzMikobF92YWx1ZSk7CiAKLQlvcGpfcmVhZF9ieXRlcyhwX2RhdGEsICZsX3ZhbHVlLCA0KTsKLQlwX2RhdGEgKz0gNDsKLQlib3gtPnR5cGUgPSAoT1BKX1VJTlQzMikobF92YWx1ZSk7CisgICAgb3BqX3JlYWRfYnl0ZXMocF9kYXRhLCAmbF92YWx1ZSwgNCk7CisgICAgcF9kYXRhICs9IDQ7CisgICAgYm94LT50eXBlID0gKE9QSl9VSU5UMzIpKGxfdmFsdWUpOwogCi0JKnBfbnVtYmVyX2J5dGVzX3JlYWQgPSA4OworICAgICpwX251bWJlcl9ieXRlc19yZWFkID0gODsKIAotCS8qIGRvIHdlIGhhdmUgYSAic3BlY2lhbCB2ZXJ5IGxhcmdlIGJveCA/IiAqLwotCS8qIHJlYWQgdGhlbiB0aGUgWExCb3ggKi8KLQlpZiAoYm94LT5sZW5ndGggPT0gMSkgewotCQlPUEpfVUlOVDMyIGxfeGxfcGFydF9zaXplOworICAgIC8qIGRvIHdlIGhhdmUgYSAic3BlY2lhbCB2ZXJ5IGxhcmdlIGJveCA/IiAqLworICAgIC8qIHJlYWQgdGhlbiB0aGUgWExCb3ggKi8KKyAgICBpZiAoYm94LT5sZW5ndGggPT0gMSkgeworICAgICAgICBPUEpfVUlOVDMyIGxfeGxfcGFydF9zaXplOwogCi0JCWlmIChwX2JveF9tYXhfc2l6ZSA8IDE2KSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ2Fubm90IGhhbmRsZSBYTCBib3ggb2YgbGVzcyB0aGFuIDE2IGJ5dGVzXG4iKTsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KKyAgICAgICAgaWYgKHBfYm94X21heF9zaXplIDwgMTYpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgaGFuZGxlIFhMIGJveCBvZiBsZXNzIHRoYW4gMTYgYnl0ZXNcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQogCi0JCW9wal9yZWFkX2J5dGVzKHBfZGF0YSwmbF94bF9wYXJ0X3NpemUsIDQpOwotCQlwX2RhdGEgKz0gNDsKLQkJKnBfbnVtYmVyX2J5dGVzX3JlYWQgKz0gNDsKKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9kYXRhLCAmbF94bF9wYXJ0X3NpemUsIDQpOworICAgICAgICBwX2RhdGEgKz0gNDsKKyAgICAgICAgKnBfbnVtYmVyX2J5dGVzX3JlYWQgKz0gNDsKIAotCQlpZiAobF94bF9wYXJ0X3NpemUgIT0gMCkgewotCQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkNhbm5vdCBoYW5kbGUgYm94IHNpemVzIGhpZ2hlciB0aGFuIDJeMzJcbiIpOwotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQorICAgICAgICBpZiAobF94bF9wYXJ0X3NpemUgIT0gMCkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBoYW5kbGUgYm94IHNpemVzIGhpZ2hlciB0aGFuIDJeMzJcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQogCi0JCW9wal9yZWFkX2J5dGVzKHBfZGF0YSwgJmxfdmFsdWUsIDQpOwotCQkqcF9udW1iZXJfYnl0ZXNfcmVhZCArPSA0OwotCQlib3gtPmxlbmd0aCA9IChPUEpfVUlOVDMyKShsX3ZhbHVlKTsKKyAgICAgICAgb3BqX3JlYWRfYnl0ZXMocF9kYXRhLCAmbF92YWx1ZSwgNCk7CisgICAgICAgICpwX251bWJlcl9ieXRlc19yZWFkICs9IDQ7CisgICAgICAgIGJveC0+bGVuZ3RoID0gKE9QSl9VSU5UMzIpKGxfdmFsdWUpOwogCi0JCWlmIChib3gtPmxlbmd0aCA9PSAwKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ2Fubm90IGhhbmRsZSBib3ggb2YgdW5kZWZpbmVkIHNpemVzXG4iKTsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQl9Ci0JZWxzZSBpZiAoYm94LT5sZW5ndGggPT0gMCkgewotCQlvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ2Fubm90IGhhbmRsZSBib3ggb2YgdW5kZWZpbmVkIHNpemVzXG4iKTsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0JaWYgKGJveC0+bGVuZ3RoIDwgKnBfbnVtYmVyX2J5dGVzX3JlYWQpIHsKLQkJb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkJveCBsZW5ndGggaXMgaW5jb25zaXN0ZW50LlxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCXJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgaWYgKGJveC0+bGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJDYW5ub3QgaGFuZGxlIGJveCBvZiB1bmRlZmluZWQgc2l6ZXNcbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYm94LT5sZW5ndGggPT0gMCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiQ2Fubm90IGhhbmRsZSBib3ggb2YgdW5kZWZpbmVkIHNpemVzXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgaWYgKGJveC0+bGVuZ3RoIDwgKnBfbnVtYmVyX2J5dGVzX3JlYWQpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkJveCBsZW5ndGggaXMgaW5jb25zaXN0ZW50LlxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAotT1BKX0JPT0wgb3BqX2pwMl9yZWFkX2hlYWRlcigJb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfanAyX3QgKmpwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKiogcF9pbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK09QSl9CT09MIG9wal9qcDJfcmVhZF9oZWFkZXIob3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKiogcF9pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQoanAyICE9IDAwKTsKLQlhc3NlcnQocF9zdHJlYW0gIT0gMDApOwotCWFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQoanAyICE9IDAwKTsKKyAgICBhc3NlcnQocF9zdHJlYW0gIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0JLyogY3VzdG9taXphdGlvbiBvZiB0aGUgdmFsaWRhdGlvbiAqLwotCWlmICghIG9wal9qcDJfc2V0dXBfZGVjb2RpbmdfdmFsaWRhdGlvbiAoanAyLCBwX21hbmFnZXIpKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgIC8qIGN1c3RvbWl6YXRpb24gb2YgdGhlIHZhbGlkYXRpb24gKi8KKyAgICBpZiAoISBvcGpfanAyX3NldHVwX2RlY29kaW5nX3ZhbGlkYXRpb24oanAyLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0JLyogY3VzdG9taXphdGlvbiBvZiB0aGUgZW5jb2RpbmcgKi8KLQlpZiAoISBvcGpfanAyX3NldHVwX2hlYWRlcl9yZWFkaW5nKGpwMiwgcF9tYW5hZ2VyKSkgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KKyAgICAvKiBjdXN0b21pemF0aW9uIG9mIHRoZSBlbmNvZGluZyAqLworICAgIGlmICghIG9wal9qcDJfc2V0dXBfaGVhZGVyX3JlYWRpbmcoanAyLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0JLyogdmFsaWRhdGlvbiBvZiB0aGUgcGFyYW1ldGVycyBjb2RlYyAqLwotCWlmICghIG9wal9qcDJfZXhlYyhqcDIsanAyLT5tX3ZhbGlkYXRpb25fbGlzdCxwX3N0cmVhbSxwX21hbmFnZXIpKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgIC8qIHZhbGlkYXRpb24gb2YgdGhlIHBhcmFtZXRlcnMgY29kZWMgKi8KKyAgICBpZiAoISBvcGpfanAyX2V4ZWMoanAyLCBqcDItPm1fdmFsaWRhdGlvbl9saXN0LCBwX3N0cmVhbSwgcF9tYW5hZ2VyKSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotCS8qIHJlYWQgaGVhZGVyICovCi0JaWYgKCEgb3BqX2pwMl9leGVjIChqcDIsanAyLT5tX3Byb2NlZHVyZV9saXN0LHBfc3RyZWFtLHBfbWFuYWdlcikpIHsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9CisgICAgLyogcmVhZCBoZWFkZXIgKi8KKyAgICBpZiAoISBvcGpfanAyX2V4ZWMoanAyLCBqcDItPm1fcHJvY2VkdXJlX2xpc3QsIHBfc3RyZWFtLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGlmIChqcDItPmhhc19qcDJoID09IDApIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkpQMkggYm94IG1pc3NpbmcuIFJlcXVpcmVkLlxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGlmIChqcDItPmhhc19paGRyID09IDApIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIklIRFIgYm94X21pc3NpbmcuIFJlcXVpcmVkLlxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0JcmV0dXJuIG9wal9qMmtfcmVhZF9oZWFkZXIoCXBfc3RyZWFtLAotCQkJCQkJCWpwMi0+ajJrLAotCQkJCQkJCXBfaW1hZ2UsCi0JCQkJCQkJcF9tYW5hZ2VyKTsKKyAgICByZXR1cm4gb3BqX2oya19yZWFkX2hlYWRlcihwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqcDItPmoyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWFuYWdlcik7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3NldHVwX2VuY29kaW5nX3ZhbGlkYXRpb24gKG9wal9qcDJfdCAqanAyLCBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCitzdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9zZXR1cF9lbmNvZGluZ192YWxpZGF0aW9uKG9wal9qcDJfdCAqanAyLAorICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCiB7Ci0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChqcDIgIT0gMDApOwotCWFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQoanAyICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKIAotCWlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV92YWxpZGF0aW9uX2xpc3QsIChvcGpfcHJvY2VkdXJlKW9wal9qcDJfZGVmYXVsdF92YWxpZGF0aW9uLCBwX21hbmFnZXIpKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCS8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSB2YWxpZGF0aW9uIHByb2NlZHVyZSAqLwotCQotCXJldHVybiBPUEpfVFJVRTsKKyAgICBpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShqcDItPm1fdmFsaWRhdGlvbl9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGpfcHJvY2VkdXJlKW9wal9qcDJfZGVmYXVsdF92YWxpZGF0aW9uLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIC8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSB2YWxpZGF0aW9uIHByb2NlZHVyZSAqLworCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9zZXR1cF9kZWNvZGluZ192YWxpZGF0aW9uIChvcGpfanAyX3QgKmpwMiwgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQorc3RhdGljIE9QSl9CT09MIG9wal9qcDJfc2V0dXBfZGVjb2RpbmdfdmFsaWRhdGlvbihvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQogewotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQoanAyICE9IDAwKTsKLQlhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLQkKLQkvKiBERVZFTE9QRVIgQ09STkVSLCBhZGQgeW91ciBjdXN0b20gdmFsaWRhdGlvbiBwcm9jZWR1cmUgKi8KLQkKLQlyZXR1cm4gT1BKX1RSVUU7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChqcDIgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOworCisgICAgT1BKX1VOVVNFRChqcDIpOworICAgIE9QSl9VTlVTRUQocF9tYW5hZ2VyKTsKKworICAgIC8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSB2YWxpZGF0aW9uIHByb2NlZHVyZSAqLworCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX2pwMl9zZXR1cF9oZWFkZXJfd3JpdGluZyAob3BqX2pwMl90ICpqcDIsIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKK3N0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3NldHVwX2hlYWRlcl93cml0aW5nKG9wal9qcDJfdCAqanAyLAorICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCiB7Ci0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChqcDIgIT0gMDApOwotCWFzc2VydChwX21hbmFnZXIgIT0gMDApOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQoanAyICE9IDAwKTsKKyAgICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKIAotCWlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfanAyX3dyaXRlX2pwLCBwX21hbmFnZXIpKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCWlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfanAyX3dyaXRlX2Z0eXAsIHBfbWFuYWdlcikpIHsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0JaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUoanAyLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qcDJfd3JpdGVfanAyaCwgcF9tYW5hZ2VyKSkgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQlpZigganAyLT5qcGlwX29uICkgewotCQlpZiAoISBvcGpfcHJvY2VkdXJlX2xpc3RfYWRkX3Byb2NlZHVyZShqcDItPm1fcHJvY2VkdXJlX2xpc3QsKG9wal9wcm9jZWR1cmUpb3BqX2pwaXBfc2tpcF9pcHRyLCBwX21hbmFnZXIpKSB7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0JfQotCWlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwob3BqX3Byb2NlZHVyZSlvcGpfanAyX3NraXBfanAyYyxwX21hbmFnZXIpKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3BqX3Byb2NlZHVyZSlvcGpfanAyX3dyaXRlX2pwLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3BqX3Byb2NlZHVyZSlvcGpfanAyX3dyaXRlX2Z0eXAsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUoanAyLT5tX3Byb2NlZHVyZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGpfcHJvY2VkdXJlKW9wal9qcDJfd3JpdGVfanAyaCwgcF9tYW5hZ2VyKSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICBpZiAoanAyLT5qcGlwX29uKSB7CisgICAgICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9wcm9jZWR1cmUpb3BqX2pwaXBfc2tpcF9pcHRyLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgfQorICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3BqX3Byb2NlZHVyZSlvcGpfanAyX3NraXBfanAyYywgcF9tYW5hZ2VyKSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotCS8qIERFVkVMT1BFUiBDT1JORVIsIGluc2VydCB5b3VyIGN1c3RvbSBwcm9jZWR1cmVzICovCisgICAgLyogREVWRUxPUEVSIENPUk5FUiwgaW5zZXJ0IHlvdXIgY3VzdG9tIHByb2NlZHVyZXMgKi8KIAotCXJldHVybiBPUEpfVFJVRTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfanAyX3NldHVwX2hlYWRlcl9yZWFkaW5nIChvcGpfanAyX3QgKmpwMiwgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQorc3RhdGljIE9QSl9CT09MIG9wal9qcDJfc2V0dXBfaGVhZGVyX3JlYWRpbmcob3BqX2pwMl90ICpqcDIsCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKIHsKLQkvKiBwcmVjb25kaXRpb25zICovCi0JYXNzZXJ0KGpwMiAhPSAwMCk7Ci0JYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChqcDIgIT0gMDApOworICAgIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwogCi0JaWYgKCEgb3BqX3Byb2NlZHVyZV9saXN0X2FkZF9wcm9jZWR1cmUoanAyLT5tX3Byb2NlZHVyZV9saXN0LChvcGpfcHJvY2VkdXJlKW9wal9qcDJfcmVhZF9oZWFkZXJfcHJvY2VkdXJlLCBwX21hbmFnZXIpKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCQotCS8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSBwcm9jZWR1cmVzICovCi0JCi0JcmV0dXJuIE9QSl9UUlVFOworICAgIGlmICghIG9wal9wcm9jZWR1cmVfbGlzdF9hZGRfcHJvY2VkdXJlKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3BqX3Byb2NlZHVyZSlvcGpfanAyX3JlYWRfaGVhZGVyX3Byb2NlZHVyZSwgcF9tYW5hZ2VyKSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIC8qIERFVkVMT1BFUiBDT1JORVIsIGFkZCB5b3VyIGN1c3RvbSBwcm9jZWR1cmVzICovCisKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLU9QSl9CT09MIG9wal9qcDJfcmVhZF90aWxlX2hlYWRlciAoIG9wal9qcDJfdCAqIHBfanAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfdGlsZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV94MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV95MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV94MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV95MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX25iX2NvbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JPT0wgKiBwX2dvX29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCitPUEpfQk9PTCBvcGpfanAyX3JlYWRfdGlsZV9oZWFkZXIob3BqX2pwMl90ICogcF9qcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfdGlsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV95MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3RpbGVfeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3kxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX25iX2NvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CT09MICogcF9nb19vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0JcmV0dXJuIG9wal9qMmtfcmVhZF90aWxlX2hlYWRlcihwX2pwMi0+ajJrLAotCQkJCQkJCQlwX3RpbGVfaW5kZXgsCi0JCQkJCQkJCXBfZGF0YV9zaXplLAotCQkJCQkJCQlwX3RpbGVfeDAsIHBfdGlsZV95MCwKLQkJCQkJCQkJcF90aWxlX3gxLCBwX3RpbGVfeTEsCi0JCQkJCQkJCXBfbmJfY29tcHMsCi0JCQkJCQkJCXBfZ29fb24sCi0JCQkJCQkJCXBfc3RyZWFtLAotCQkJCQkJCQlwX21hbmFnZXIpOworICAgIHJldHVybiBvcGpfajJrX3JlYWRfdGlsZV9oZWFkZXIocF9qcDItPmoyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGlsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90aWxlX3gwLCBwX3RpbGVfeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RpbGVfeDEsIHBfdGlsZV95MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbmJfY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2dvX29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpOwogfQogCi1PUEpfQk9PTCBvcGpfanAyX3dyaXRlX3RpbGUgKAlvcGpfanAyX3QgKnBfanAyLAotCQkJCQkgCSAJICAgIE9QSl9VSU5UMzIgcF90aWxlX2luZGV4LAotCQkJCQkgCSAJICAgIE9QSl9CWVRFICogcF9kYXRhLAotCQkJCQkgCSAJICAgIE9QSl9VSU5UMzIgcF9kYXRhX3NpemUsCi0JCQkJCSAJIAkgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotCQkJCQkgCSAJICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCitPUEpfQk9PTCBvcGpfanAyX3dyaXRlX3RpbGUob3BqX2pwMl90ICpwX2pwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIAogewotCXJldHVybiBvcGpfajJrX3dyaXRlX3RpbGUgKHBfanAyLT5qMmsscF90aWxlX2luZGV4LHBfZGF0YSxwX2RhdGFfc2l6ZSxwX3N0cmVhbSxwX21hbmFnZXIpOworICAgIHJldHVybiBvcGpfajJrX3dyaXRlX3RpbGUocF9qcDItPmoyaywgcF90aWxlX2luZGV4LCBwX2RhdGEsIHBfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9zdHJlYW0sIHBfbWFuYWdlcik7CiB9CiAKLU9QSl9CT09MIG9wal9qcDJfZGVjb2RlX3RpbGUgKCAgb3BqX2pwMl90ICogcF9qcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorT1BKX0JPT0wgb3BqX2pwMl9kZWNvZGVfdGlsZShvcGpfanAyX3QgKiBwX2pwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLQlyZXR1cm4gb3BqX2oya19kZWNvZGVfdGlsZSAocF9qcDItPmoyayxwX3RpbGVfaW5kZXgscF9kYXRhLHBfZGF0YV9zaXplLHBfc3RyZWFtLHBfbWFuYWdlcik7CisgICAgcmV0dXJuIG9wal9qMmtfZGVjb2RlX3RpbGUocF9qcDItPmoyaywgcF90aWxlX2luZGV4LCBwX2RhdGEsIHBfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc3RyZWFtLCBwX21hbmFnZXIpOwogfQogCiB2b2lkIG9wal9qcDJfZGVzdHJveShvcGpfanAyX3QgKmpwMikKIHsKLQlpZiAoanAyKSB7Ci0JCS8qIGRlc3Ryb3kgdGhlIEoySyBjb2RlYyAqLwotCQlvcGpfajJrX2Rlc3Ryb3koanAyLT5qMmspOwotCQlqcDItPmoyayA9IDAwOworICAgIGlmIChqcDIpIHsKKyAgICAgICAgLyogZGVzdHJveSB0aGUgSjJLIGNvZGVjICovCisgICAgICAgIG9wal9qMmtfZGVzdHJveShqcDItPmoyayk7CisgICAgICAgIGpwMi0+ajJrID0gMDA7CiAKLQkJaWYgKGpwMi0+Y29tcHMpIHsKLQkJCW9wal9mcmVlKGpwMi0+Y29tcHMpOwotCQkJanAyLT5jb21wcyA9IDAwOwotCQl9CisgICAgICAgIGlmIChqcDItPmNvbXBzKSB7CisgICAgICAgICAgICBvcGpfZnJlZShqcDItPmNvbXBzKTsKKyAgICAgICAgICAgIGpwMi0+Y29tcHMgPSAwMDsKKyAgICAgICAgfQogCi0JCWlmIChqcDItPmNsKSB7Ci0JCQlvcGpfZnJlZShqcDItPmNsKTsKLQkJCWpwMi0+Y2wgPSAwMDsKLQkJfQorICAgICAgICBpZiAoanAyLT5jbCkgeworICAgICAgICAgICAgb3BqX2ZyZWUoanAyLT5jbCk7CisgICAgICAgICAgICBqcDItPmNsID0gMDA7CisgICAgICAgIH0KIAotCQlpZiAoanAyLT5jb2xvci5pY2NfcHJvZmlsZV9idWYpIHsKLQkJCW9wal9mcmVlKGpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfYnVmKTsKLQkJCWpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfYnVmID0gMDA7Ci0JCX0KKyAgICAgICAgaWYgKGpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfYnVmKSB7CisgICAgICAgICAgICBvcGpfZnJlZShqcDItPmNvbG9yLmljY19wcm9maWxlX2J1Zik7CisgICAgICAgICAgICBqcDItPmNvbG9yLmljY19wcm9maWxlX2J1ZiA9IDAwOworICAgICAgICB9CiAKLQkJaWYgKGpwMi0+Y29sb3IuanAyX2NkZWYpIHsKLQkJCWlmIChqcDItPmNvbG9yLmpwMl9jZGVmLT5pbmZvKSB7Ci0JCQkJb3BqX2ZyZWUoanAyLT5jb2xvci5qcDJfY2RlZi0+aW5mbyk7Ci0JCQkJanAyLT5jb2xvci5qcDJfY2RlZi0+aW5mbyA9IE5VTEw7Ci0JCQl9CisgICAgICAgIGlmIChqcDItPmNvbG9yLmpwMl9jZGVmKSB7CisgICAgICAgICAgICBpZiAoanAyLT5jb2xvci5qcDJfY2RlZi0+aW5mbykgeworICAgICAgICAgICAgICAgIG9wal9mcmVlKGpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm8pOworICAgICAgICAgICAgICAgIGpwMi0+Y29sb3IuanAyX2NkZWYtPmluZm8gPSBOVUxMOworICAgICAgICAgICAgfQogCi0JCQlvcGpfZnJlZShqcDItPmNvbG9yLmpwMl9jZGVmKTsKLQkJCWpwMi0+Y29sb3IuanAyX2NkZWYgPSAwMDsKLQkJfQorICAgICAgICAgICAgb3BqX2ZyZWUoanAyLT5jb2xvci5qcDJfY2RlZik7CisgICAgICAgICAgICBqcDItPmNvbG9yLmpwMl9jZGVmID0gMDA7CisgICAgICAgIH0KIAotCQlpZiAoanAyLT5jb2xvci5qcDJfcGNscikgewotCQkJaWYgKGpwMi0+Y29sb3IuanAyX3BjbHItPmNtYXApIHsKLQkJCQlvcGpfZnJlZShqcDItPmNvbG9yLmpwMl9wY2xyLT5jbWFwKTsKLQkJCQlqcDItPmNvbG9yLmpwMl9wY2xyLT5jbWFwID0gTlVMTDsKLQkJCX0KLQkJCWlmIChqcDItPmNvbG9yLmpwMl9wY2xyLT5jaGFubmVsX3NpZ24pIHsKLQkJCQlvcGpfZnJlZShqcDItPmNvbG9yLmpwMl9wY2xyLT5jaGFubmVsX3NpZ24pOwotCQkJCWpwMi0+Y29sb3IuanAyX3BjbHItPmNoYW5uZWxfc2lnbiA9IE5VTEw7Ci0JCQl9Ci0JCQlpZiAoanAyLT5jb2xvci5qcDJfcGNsci0+Y2hhbm5lbF9zaXplKSB7Ci0JCQkJb3BqX2ZyZWUoanAyLT5jb2xvci5qcDJfcGNsci0+Y2hhbm5lbF9zaXplKTsKLQkJCQlqcDItPmNvbG9yLmpwMl9wY2xyLT5jaGFubmVsX3NpemUgPSBOVUxMOwotCQkJfQotCQkJaWYgKGpwMi0+Y29sb3IuanAyX3BjbHItPmVudHJpZXMpIHsKLQkJCQlvcGpfZnJlZShqcDItPmNvbG9yLmpwMl9wY2xyLT5lbnRyaWVzKTsKLQkJCQlqcDItPmNvbG9yLmpwMl9wY2xyLT5lbnRyaWVzID0gTlVMTDsKLQkJCX0KKyAgICAgICAgaWYgKGpwMi0+Y29sb3IuanAyX3BjbHIpIHsKKyAgICAgICAgICAgIGlmIChqcDItPmNvbG9yLmpwMl9wY2xyLT5jbWFwKSB7CisgICAgICAgICAgICAgICAgb3BqX2ZyZWUoanAyLT5jb2xvci5qcDJfcGNsci0+Y21hcCk7CisgICAgICAgICAgICAgICAganAyLT5jb2xvci5qcDJfcGNsci0+Y21hcCA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoanAyLT5jb2xvci5qcDJfcGNsci0+Y2hhbm5lbF9zaWduKSB7CisgICAgICAgICAgICAgICAgb3BqX2ZyZWUoanAyLT5jb2xvci5qcDJfcGNsci0+Y2hhbm5lbF9zaWduKTsKKyAgICAgICAgICAgICAgICBqcDItPmNvbG9yLmpwMl9wY2xyLT5jaGFubmVsX3NpZ24gPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGpwMi0+Y29sb3IuanAyX3BjbHItPmNoYW5uZWxfc2l6ZSkgeworICAgICAgICAgICAgICAgIG9wal9mcmVlKGpwMi0+Y29sb3IuanAyX3BjbHItPmNoYW5uZWxfc2l6ZSk7CisgICAgICAgICAgICAgICAganAyLT5jb2xvci5qcDJfcGNsci0+Y2hhbm5lbF9zaXplID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChqcDItPmNvbG9yLmpwMl9wY2xyLT5lbnRyaWVzKSB7CisgICAgICAgICAgICAgICAgb3BqX2ZyZWUoanAyLT5jb2xvci5qcDJfcGNsci0+ZW50cmllcyk7CisgICAgICAgICAgICAgICAganAyLT5jb2xvci5qcDJfcGNsci0+ZW50cmllcyA9IE5VTEw7CisgICAgICAgICAgICB9CiAKLQkJCW9wal9mcmVlKGpwMi0+Y29sb3IuanAyX3BjbHIpOwotCQkJanAyLT5jb2xvci5qcDJfcGNsciA9IDAwOwotCQl9CisgICAgICAgICAgICBvcGpfZnJlZShqcDItPmNvbG9yLmpwMl9wY2xyKTsKKyAgICAgICAgICAgIGpwMi0+Y29sb3IuanAyX3BjbHIgPSAwMDsKKyAgICAgICAgfQogCi0JCWlmIChqcDItPm1fdmFsaWRhdGlvbl9saXN0KSB7Ci0JCQlvcGpfcHJvY2VkdXJlX2xpc3RfZGVzdHJveShqcDItPm1fdmFsaWRhdGlvbl9saXN0KTsKLQkJCWpwMi0+bV92YWxpZGF0aW9uX2xpc3QgPSAwMDsKLQkJfQorICAgICAgICBpZiAoanAyLT5tX3ZhbGlkYXRpb25fbGlzdCkgeworICAgICAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X2Rlc3Ryb3koanAyLT5tX3ZhbGlkYXRpb25fbGlzdCk7CisgICAgICAgICAgICBqcDItPm1fdmFsaWRhdGlvbl9saXN0ID0gMDA7CisgICAgICAgIH0KIAotCQlpZiAoanAyLT5tX3Byb2NlZHVyZV9saXN0KSB7Ci0JCQlvcGpfcHJvY2VkdXJlX2xpc3RfZGVzdHJveShqcDItPm1fcHJvY2VkdXJlX2xpc3QpOwotCQkJanAyLT5tX3Byb2NlZHVyZV9saXN0ID0gMDA7Ci0JCX0KKyAgICAgICAgaWYgKGpwMi0+bV9wcm9jZWR1cmVfbGlzdCkgeworICAgICAgICAgICAgb3BqX3Byb2NlZHVyZV9saXN0X2Rlc3Ryb3koanAyLT5tX3Byb2NlZHVyZV9saXN0KTsKKyAgICAgICAgICAgIGpwMi0+bV9wcm9jZWR1cmVfbGlzdCA9IDAwOworICAgICAgICB9CiAKLQkJb3BqX2ZyZWUoanAyKTsKLQl9CisgICAgICAgIG9wal9mcmVlKGpwMik7CisgICAgfQogfQogCi1PUEpfQk9PTCBvcGpfanAyX3NldF9kZWNvZGVfYXJlYSgJb3BqX2pwMl90ICpwX2pwMiwKLQkJCQkJCQkJICAgIG9wal9pbWFnZV90KiBwX2ltYWdlLAotCQkJCQkJCQkgICAgT1BKX0lOVDMyIHBfc3RhcnRfeCwgT1BKX0lOVDMyIHBfc3RhcnRfeSwKLQkJCQkJCQkJICAgIE9QSl9JTlQzMiBwX2VuZF94LCBPUEpfSU5UMzIgcF9lbmRfeSwKLQkJCQkJCQkJICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorT1BKX0JPT0wgb3BqX2pwMl9zZXRfZGVjb2RlZF9jb21wb25lbnRzKG9wal9qcDJfdCAqcF9qcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBudW1jb21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfVUlOVDMyKiBjb21wc19pbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKIHsKLQlyZXR1cm4gb3BqX2oya19zZXRfZGVjb2RlX2FyZWEocF9qcDItPmoyaywgcF9pbWFnZSwgcF9zdGFydF94LCBwX3N0YXJ0X3ksIHBfZW5kX3gsIHBfZW5kX3ksIHBfbWFuYWdlcik7CisgICAgcmV0dXJuIG9wal9qMmtfc2V0X2RlY29kZWRfY29tcG9uZW50cyhwX2pwMi0+ajJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtY29tcHMsIGNvbXBzX2luZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpOwogfQogCi1PUEpfQk9PTCBvcGpfanAyX2dldF90aWxlKAlvcGpfanAyX3QgKnBfanAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCogcF9pbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlX2luZGV4Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorT1BKX0JPT0wgb3BqX2pwMl9zZXRfZGVjb2RlX2FyZWEob3BqX2pwMl90ICpwX2pwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90KiBwX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfc3RhcnRfeCwgT1BKX0lOVDMyIHBfc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX2VuZF94LCBPUEpfSU5UMzIgcF9lbmRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0JaWYgKCFwX2ltYWdlKQotCQlyZXR1cm4gT1BKX0ZBTFNFOworICAgIHJldHVybiBvcGpfajJrX3NldF9kZWNvZGVfYXJlYShwX2pwMi0+ajJrLCBwX2ltYWdlLCBwX3N0YXJ0X3gsIHBfc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9lbmRfeCwgcF9lbmRfeSwgcF9tYW5hZ2VyKTsKK30KIAotCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkpQMiBib3ggd2hpY2ggYXJlIGFmdGVyIHRoZSBjb2Rlc3RyZWFtIHdpbGwgbm90IGJlIHJlYWQgYnkgdGhpcyBmdW5jdGlvbi5cbiIpOworT1BKX0JPT0wgb3BqX2pwMl9nZXRfdGlsZShvcGpfanAyX3QgKnBfanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90KiBwX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdGlsZV9pbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICBpZiAoIXBfaW1hZ2UpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLQlpZiAoISBvcGpfajJrX2dldF90aWxlKHBfanAyLT5qMmssIHBfc3RyZWFtLCBwX2ltYWdlLCBwX21hbmFnZXIsIHRpbGVfaW5kZXgpICl7Ci0JCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gZGVjb2RlIHRoZSBjb2Rlc3RyZWFtIGluIHRoZSBKUDIgZmlsZVxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICJKUDIgYm94IHdoaWNoIGFyZSBhZnRlciB0aGUgY29kZXN0cmVhbSB3aWxsIG5vdCBiZSByZWFkIGJ5IHRoaXMgZnVuY3Rpb24uXG4iKTsKIAotCWlmICghb3BqX2pwMl9jaGVja19jb2xvcihwX2ltYWdlLCAmKHBfanAyLT5jb2xvciksIHBfbWFuYWdlcikpIHsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9CisgICAgaWYgKCEgb3BqX2oya19nZXRfdGlsZShwX2pwMi0+ajJrLCBwX3N0cmVhbSwgcF9pbWFnZSwgcF9tYW5hZ2VyLCB0aWxlX2luZGV4KSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gZGVjb2RlIHRoZSBjb2Rlc3RyZWFtIGluIHRoZSBKUDIgZmlsZVxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0JLyogU2V0IEltYWdlIENvbG9yIFNwYWNlICovCi0JaWYgKHBfanAyLT5lbnVtY3MgPT0gMTYpCi0JCXBfaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19TUkdCOwotCWVsc2UgaWYgKHBfanAyLT5lbnVtY3MgPT0gMTcpCi0JCXBfaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19HUkFZOwotCWVsc2UgaWYgKHBfanAyLT5lbnVtY3MgPT0gMTgpCi0JCXBfaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19TWUNDOwotCWVsc2UgaWYgKHBfanAyLT5lbnVtY3MgPT0gMjQpCi0JCXBfaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19FWUNDOwotCWVsc2UgaWYgKHBfanAyLT5lbnVtY3MgPT0gMTIpCi0JCXBfaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19DTVlLOwotCWVsc2UKLQkJcF9pbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX1VOS05PV047CisgICAgaWYgKHBfanAyLT5qMmstPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWNvZGVyLm1fbnVtY29tcHNfdG9fZGVjb2RlKSB7CisgICAgICAgIC8qIEJ5cGFzcyBhbGwgSlAyIGNvbXBvbmVudCB0cmFuc2Zvcm1zICovCisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICB9CiAKLQlpZihwX2pwMi0+Y29sb3IuanAyX3BjbHIpIHsKLQkJLyogUGFydCAxLCBJLjUuMy40OiBFaXRoZXIgYm90aCBvciBub25lIDogKi8KLQkJaWYoICFwX2pwMi0+Y29sb3IuanAyX3BjbHItPmNtYXApCi0JCQlvcGpfanAyX2ZyZWVfcGNscigmKHBfanAyLT5jb2xvcikpOwotCQllbHNlCi0JCQlvcGpfanAyX2FwcGx5X3BjbHIocF9pbWFnZSwgJihwX2pwMi0+Y29sb3IpKTsKLQl9Ci0JCi0JLyogQXBwbHkgdGhlIGNvbG9yIHNwYWNlIGlmIG5lZWRlZCAqLwotCWlmKHBfanAyLT5jb2xvci5qcDJfY2RlZikgewotCQlvcGpfanAyX2FwcGx5X2NkZWYocF9pbWFnZSwgJihwX2pwMi0+Y29sb3IpLCBwX21hbmFnZXIpOwotCX0KKyAgICBpZiAoIW9wal9qcDJfY2hlY2tfY29sb3IocF9pbWFnZSwgJihwX2pwMi0+Y29sb3IpLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0JaWYocF9qcDItPmNvbG9yLmljY19wcm9maWxlX2J1ZikgewotCQlwX2ltYWdlLT5pY2NfcHJvZmlsZV9idWYgPSBwX2pwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfYnVmOwotCQlwX2ltYWdlLT5pY2NfcHJvZmlsZV9sZW4gPSBwX2pwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfbGVuOwotCQlwX2pwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfYnVmID0gTlVMTDsKLQl9CisgICAgLyogU2V0IEltYWdlIENvbG9yIFNwYWNlICovCisgICAgaWYgKHBfanAyLT5lbnVtY3MgPT0gMTYpIHsKKyAgICAgICAgcF9pbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX1NSR0I7CisgICAgfSBlbHNlIGlmIChwX2pwMi0+ZW51bWNzID09IDE3KSB7CisgICAgICAgIHBfaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19HUkFZOworICAgIH0gZWxzZSBpZiAocF9qcDItPmVudW1jcyA9PSAxOCkgeworICAgICAgICBwX2ltYWdlLT5jb2xvcl9zcGFjZSA9IE9QSl9DTFJTUENfU1lDQzsKKyAgICB9IGVsc2UgaWYgKHBfanAyLT5lbnVtY3MgPT0gMjQpIHsKKyAgICAgICAgcF9pbWFnZS0+Y29sb3Jfc3BhY2UgPSBPUEpfQ0xSU1BDX0VZQ0M7CisgICAgfSBlbHNlIGlmIChwX2pwMi0+ZW51bWNzID09IDEyKSB7CisgICAgICAgIHBfaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19DTVlLOworICAgIH0gZWxzZSB7CisgICAgICAgIHBfaW1hZ2UtPmNvbG9yX3NwYWNlID0gT1BKX0NMUlNQQ19VTktOT1dOOworICAgIH0KIAotCXJldHVybiBPUEpfVFJVRTsKKyAgICBpZiAocF9qcDItPmNvbG9yLmpwMl9wY2xyKSB7CisgICAgICAgIC8qIFBhcnQgMSwgSS41LjMuNDogRWl0aGVyIGJvdGggb3Igbm9uZSA6ICovCisgICAgICAgIGlmICghcF9qcDItPmNvbG9yLmpwMl9wY2xyLT5jbWFwKSB7CisgICAgICAgICAgICBvcGpfanAyX2ZyZWVfcGNscigmKHBfanAyLT5jb2xvcikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFvcGpfanAyX2FwcGx5X3BjbHIocF9pbWFnZSwgJihwX2pwMi0+Y29sb3IpLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEFwcGx5IHRoZSBjb2xvciBzcGFjZSBpZiBuZWVkZWQgKi8KKyAgICBpZiAocF9qcDItPmNvbG9yLmpwMl9jZGVmKSB7CisgICAgICAgIG9wal9qcDJfYXBwbHlfY2RlZihwX2ltYWdlLCAmKHBfanAyLT5jb2xvciksIHBfbWFuYWdlcik7CisgICAgfQorCisgICAgaWYgKHBfanAyLT5jb2xvci5pY2NfcHJvZmlsZV9idWYpIHsKKyAgICAgICAgcF9pbWFnZS0+aWNjX3Byb2ZpbGVfYnVmID0gcF9qcDItPmNvbG9yLmljY19wcm9maWxlX2J1ZjsKKyAgICAgICAgcF9pbWFnZS0+aWNjX3Byb2ZpbGVfbGVuID0gcF9qcDItPmNvbG9yLmljY19wcm9maWxlX2xlbjsKKyAgICAgICAgcF9qcDItPmNvbG9yLmljY19wcm9maWxlX2J1ZiA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjkyNywyNTEgKzMxODYsMjU5IEBACiAKIG9wal9qcDJfdCogb3BqX2pwMl9jcmVhdGUoT1BKX0JPT0wgcF9pc19kZWNvZGVyKQogewotCW9wal9qcDJfdCAqanAyID0gKG9wal9qcDJfdCopb3BqX2NhbGxvYygxLHNpemVvZihvcGpfanAyX3QpKTsKLQlpZiAoanAyKSB7CisgICAgb3BqX2pwMl90ICpqcDIgPSAob3BqX2pwMl90KilvcGpfY2FsbG9jKDEsIHNpemVvZihvcGpfanAyX3QpKTsKKyAgICBpZiAoanAyKSB7CiAKLQkJLyogY3JlYXRlIHRoZSBKMksgY29kZWMgKi8KLQkJaWYgKCEgcF9pc19kZWNvZGVyKSB7Ci0JCQlqcDItPmoyayA9IG9wal9qMmtfY3JlYXRlX2NvbXByZXNzKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlqcDItPmoyayA9IG9wal9qMmtfY3JlYXRlX2RlY29tcHJlc3MoKTsKLQkJfQorICAgICAgICAvKiBjcmVhdGUgdGhlIEoySyBjb2RlYyAqLworICAgICAgICBpZiAoISBwX2lzX2RlY29kZXIpIHsKKyAgICAgICAgICAgIGpwMi0+ajJrID0gb3BqX2oya19jcmVhdGVfY29tcHJlc3MoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGpwMi0+ajJrID0gb3BqX2oya19jcmVhdGVfZGVjb21wcmVzcygpOworICAgICAgICB9CiAKLQkJaWYgKGpwMi0+ajJrID09IDAwKSB7Ci0JCQlvcGpfanAyX2Rlc3Ryb3koanAyKTsKLQkJCXJldHVybiAwMDsKLQkJfQorICAgICAgICBpZiAoanAyLT5qMmsgPT0gMDApIHsKKyAgICAgICAgICAgIG9wal9qcDJfZGVzdHJveShqcDIpOworICAgICAgICAgICAgcmV0dXJuIDAwOworICAgICAgICB9CiAKLQkJLyogQ29sb3Igc3RydWN0dXJlICovCi0JCWpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfYnVmID0gTlVMTDsKLQkJanAyLT5jb2xvci5pY2NfcHJvZmlsZV9sZW4gPSAwOwotCQlqcDItPmNvbG9yLmpwMl9jZGVmID0gTlVMTDsKLQkJanAyLT5jb2xvci5qcDJfcGNsciA9IE5VTEw7Ci0JCWpwMi0+Y29sb3IuanAyX2hhc19jb2xyID0gMDsKKyAgICAgICAgLyogQ29sb3Igc3RydWN0dXJlICovCisgICAgICAgIGpwMi0+Y29sb3IuaWNjX3Byb2ZpbGVfYnVmID0gTlVMTDsKKyAgICAgICAganAyLT5jb2xvci5pY2NfcHJvZmlsZV9sZW4gPSAwOworICAgICAgICBqcDItPmNvbG9yLmpwMl9jZGVmID0gTlVMTDsKKyAgICAgICAganAyLT5jb2xvci5qcDJfcGNsciA9IE5VTEw7CisgICAgICAgIGpwMi0+Y29sb3IuanAyX2hhc19jb2xyID0gMDsKIAotCQkvKiB2YWxpZGF0aW9uIGxpc3QgY3JlYXRpb24gKi8KLQkJanAyLT5tX3ZhbGlkYXRpb25fbGlzdCA9IG9wal9wcm9jZWR1cmVfbGlzdF9jcmVhdGUoKTsKLQkJaWYgKCEganAyLT5tX3ZhbGlkYXRpb25fbGlzdCkgewotCQkJb3BqX2pwMl9kZXN0cm95KGpwMik7Ci0JCQlyZXR1cm4gMDA7Ci0JCX0KKyAgICAgICAgLyogdmFsaWRhdGlvbiBsaXN0IGNyZWF0aW9uICovCisgICAgICAgIGpwMi0+bV92YWxpZGF0aW9uX2xpc3QgPSBvcGpfcHJvY2VkdXJlX2xpc3RfY3JlYXRlKCk7CisgICAgICAgIGlmICghIGpwMi0+bV92YWxpZGF0aW9uX2xpc3QpIHsKKyAgICAgICAgICAgIG9wal9qcDJfZGVzdHJveShqcDIpOworICAgICAgICAgICAgcmV0dXJuIDAwOworICAgICAgICB9CiAKLQkJLyogZXhlY3V0aW9uIGxpc3QgY3JlYXRpb24gKi8KLQkJanAyLT5tX3Byb2NlZHVyZV9saXN0ID0gb3BqX3Byb2NlZHVyZV9saXN0X2NyZWF0ZSgpOwotCQlpZiAoISBqcDItPm1fcHJvY2VkdXJlX2xpc3QpIHsKLQkJCW9wal9qcDJfZGVzdHJveShqcDIpOwotCQkJcmV0dXJuIDAwOwotCQl9Ci0JfQorICAgICAgICAvKiBleGVjdXRpb24gbGlzdCBjcmVhdGlvbiAqLworICAgICAgICBqcDItPm1fcHJvY2VkdXJlX2xpc3QgPSBvcGpfcHJvY2VkdXJlX2xpc3RfY3JlYXRlKCk7CisgICAgICAgIGlmICghIGpwMi0+bV9wcm9jZWR1cmVfbGlzdCkgeworICAgICAgICAgICAgb3BqX2pwMl9kZXN0cm95KGpwMik7CisgICAgICAgICAgICByZXR1cm4gMDA7CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4ganAyOworICAgIHJldHVybiBqcDI7CiB9CiAKIHZvaWQganAyX2R1bXAob3BqX2pwMl90KiBwX2pwMiwgT1BKX0lOVDMyIGZsYWcsIEZJTEUqIG91dF9zdHJlYW0pCiB7Ci0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChwX2pwMiAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyAqLworICAgIGFzc2VydChwX2pwMiAhPSAwMCk7CiAKLQlqMmtfZHVtcChwX2pwMi0+ajJrLAotCQkJCQlmbGFnLAotCQkJCQlvdXRfc3RyZWFtKTsKKyAgICBqMmtfZHVtcChwX2pwMi0+ajJrLAorICAgICAgICAgICAgIGZsYWcsCisgICAgICAgICAgICAgb3V0X3N0cmVhbSk7CiB9CiAKIG9wal9jb2Rlc3RyZWFtX2luZGV4X3QqIGpwMl9nZXRfY3N0cl9pbmRleChvcGpfanAyX3QqIHBfanAyKQogewotCXJldHVybiBqMmtfZ2V0X2NzdHJfaW5kZXgocF9qcDItPmoyayk7CisgICAgcmV0dXJuIGoya19nZXRfY3N0cl9pbmRleChwX2pwMi0+ajJrKTsKIH0KIAogb3BqX2NvZGVzdHJlYW1faW5mb192Ml90KiBqcDJfZ2V0X2NzdHJfaW5mbyhvcGpfanAyX3QqIHBfanAyKQogewotCXJldHVybiBqMmtfZ2V0X2NzdHJfaW5mbyhwX2pwMi0+ajJrKTsKKyAgICByZXR1cm4gajJrX2dldF9jc3RyX2luZm8ocF9qcDItPmoyayk7CiB9CiAKIE9QSl9CT09MIG9wal9qcDJfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3Iob3BqX2pwMl90ICpwX2pwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiByZXNfZmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCisgICAgICAgIE9QSl9VSU5UMzIgcmVzX2ZhY3RvciwKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQogewotCXJldHVybiBvcGpfajJrX3NldF9kZWNvZGVkX3Jlc29sdXRpb25fZmFjdG9yKHBfanAyLT5qMmssIHJlc19mYWN0b3IsIHBfbWFuYWdlcik7CisgICAgcmV0dXJuIG9wal9qMmtfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3IocF9qcDItPmoyaywgcmVzX2ZhY3RvciwgcF9tYW5hZ2VyKTsKIH0KIAogLyogSlBJUCBzcGVjaWZpYyAqLwogCiAjaWZkZWYgVVNFX0pQSVAKIHN0YXRpYyBPUEpfQk9PTCBvcGpfanBpcF93cml0ZV9pcHRyKG9wal9qcDJfdCAqanAyLAotICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKIHsKLSAgT1BKX09GRl9UIGoya19jb2Rlc3RyZWFtX2V4aXQ7Ci0gIE9QSl9CWVRFIGxfZGF0YV9oZWFkZXIgWzI0XTsKKyAgICBPUEpfT0ZGX1QgajJrX2NvZGVzdHJlYW1fZXhpdDsKKyAgICBPUEpfQllURSBsX2RhdGFfaGVhZGVyIFsyNF07CiAKLSAgLyogcHJlY29uZGl0aW9ucyAqLwotICBhc3NlcnQoanAyICE9IDAwKTsKLSAgYXNzZXJ0KGNpbyAhPSAwMCk7Ci0gIGFzc2VydChwX21hbmFnZXIgIT0gMDApOwotICBhc3NlcnQob3BqX3N0cmVhbV9oYXNfc2VlayhjaW8pKTsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KGpwMiAhPSAwMCk7CisgICAgYXNzZXJ0KGNpbyAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgYXNzZXJ0KG9wal9zdHJlYW1faGFzX3NlZWsoY2lvKSk7CiAKLSAgajJrX2NvZGVzdHJlYW1fZXhpdCA9IG9wal9zdHJlYW1fdGVsbChjaW8pOwotICBvcGpfd3JpdGVfYnl0ZXMobF9kYXRhX2hlYWRlciwgMjQsIDQpOyAvKiBzaXplIG9mIGlwdHIgKi8KLSAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIgKyA0LEpQSVBfSVBUUiw0KTsJCQkJCQkJCQkgICAvKiBJUFRSICovCisgICAgajJrX2NvZGVzdHJlYW1fZXhpdCA9IG9wal9zdHJlYW1fdGVsbChjaW8pOworICAgIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyLCAyNCwgNCk7IC8qIHNpemUgb2YgaXB0ciAqLworICAgIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyICsgNCwgSlBJUF9JUFRSLAorICAgICAgICAgICAgICAgICAgICA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElQVFIgKi8KICNpZiAwCi0gIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyICsgNCArIDQsIDAsIDgpOyAvKiBvZmZzZXQgKi8KLSAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIgKyA4ICsgOCwgMCwgOCk7IC8qIGxlbmd0aCAqLworICAgIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyICsgNCArIDQsIDAsIDgpOyAvKiBvZmZzZXQgKi8KKyAgICBvcGpfd3JpdGVfYnl0ZXMobF9kYXRhX2hlYWRlciArIDggKyA4LCAwLCA4KTsgLyogbGVuZ3RoICovCiAjZWxzZQotICBvcGpfd3JpdGVfZG91YmxlKGxfZGF0YV9oZWFkZXIgKyA0ICsgNCwgMCk7IC8qIG9mZnNldCAqLwotICBvcGpfd3JpdGVfZG91YmxlKGxfZGF0YV9oZWFkZXIgKyA4ICsgOCwgMCk7IC8qIGxlbmd0aCAqLworICAgIG9wal93cml0ZV9kb3VibGUobF9kYXRhX2hlYWRlciArIDQgKyA0LCAwKTsgLyogb2Zmc2V0ICovCisgICAgb3BqX3dyaXRlX2RvdWJsZShsX2RhdGFfaGVhZGVyICsgOCArIDgsIDApOyAvKiBsZW5ndGggKi8KICNlbmRpZgogCi0gIGlmICghIG9wal9zdHJlYW1fc2VlayhjaW8sanAyLT5qcGlwX2lwdHJfb2Zmc2V0LHBfbWFuYWdlcikpIHsKLSAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIHNlZWsgaW4gdGhlIHN0cmVhbS5cbiIpOwotICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gIH0KKyAgICBpZiAoISBvcGpfc3RyZWFtX3NlZWsoY2lvLCBqcDItPmpwaXBfaXB0cl9vZmZzZXQsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBzZWVrIGluIHRoZSBzdHJlYW0uXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sbF9kYXRhX2hlYWRlciwyNCxwX21hbmFnZXIpICE9IDI0KSB7Ci0gICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBzZWVrIGluIHRoZSBzdHJlYW0uXG4iKTsKLSAgICByZXR1cm4gT1BKX0ZBTFNFOwotICB9CisgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sIGxfZGF0YV9oZWFkZXIsIDI0LCBwX21hbmFnZXIpICE9IDI0KSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gc2VlayBpbiB0aGUgc3RyZWFtLlxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gIGlmICghIG9wal9zdHJlYW1fc2VlayhjaW8sajJrX2NvZGVzdHJlYW1fZXhpdCxwX21hbmFnZXIpKSB7Ci0gICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBzZWVrIGluIHRoZSBzdHJlYW0uXG4iKTsKLSAgICByZXR1cm4gT1BKX0ZBTFNFOwotICB9CisgICAgaWYgKCEgb3BqX3N0cmVhbV9zZWVrKGNpbywgajJrX2NvZGVzdHJlYW1fZXhpdCwgcF9tYW5hZ2VyKSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIHNlZWsgaW4gdGhlIHN0cmVhbS5cbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICByZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiBzdGF0aWMgT1BKX0JPT0wgb3BqX2pwaXBfd3JpdGVfZmlkeChvcGpfanAyX3QgKmpwMiwKLSAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKLSAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpCiB7Ci0gIE9QSl9PRkZfVCBqMmtfY29kZXN0cmVhbV9leGl0OwotICBPUEpfQllURSBsX2RhdGFfaGVhZGVyIFsyNF07CisgICAgT1BKX09GRl9UIGoya19jb2Rlc3RyZWFtX2V4aXQ7CisgICAgT1BKX0JZVEUgbF9kYXRhX2hlYWRlciBbMjRdOwogCi0gIC8qIHByZWNvbmRpdGlvbnMgKi8KLSAgYXNzZXJ0KGpwMiAhPSAwMCk7Ci0gIGFzc2VydChjaW8gIT0gMDApOwotICBhc3NlcnQocF9tYW5hZ2VyICE9IDAwKTsKLSAgYXNzZXJ0KG9wal9zdHJlYW1faGFzX3NlZWsoY2lvKSk7CisgICAgT1BKX1VOVVNFRChqcDIpOwogCi0gIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyLCAyNCwgNCk7IC8qIHNpemUgb2YgaXB0ciAqLwotICBvcGpfd3JpdGVfYnl0ZXMobF9kYXRhX2hlYWRlciArIDQsSlBJUF9GSURYLDQpOwkJCQkJCQkJCSAgIC8qIElQVFIgKi8KLSAgb3BqX3dyaXRlX2RvdWJsZShsX2RhdGFfaGVhZGVyICsgNCArIDQsIDApOyAvKiBvZmZzZXQgKi8KLSAgb3BqX3dyaXRlX2RvdWJsZShsX2RhdGFfaGVhZGVyICsgOCArIDgsIDApOyAvKiBsZW5ndGggKi8KKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KGpwMiAhPSAwMCk7CisgICAgYXNzZXJ0KGNpbyAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgYXNzZXJ0KG9wal9zdHJlYW1faGFzX3NlZWsoY2lvKSk7CiAKLSAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sbF9kYXRhX2hlYWRlciwyNCxwX21hbmFnZXIpICE9IDI0KSB7Ci0gICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBzZWVrIGluIHRoZSBzdHJlYW0uXG4iKTsKLSAgICByZXR1cm4gT1BKX0ZBTFNFOwotICB9CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIsIDI0LCA0KTsgLyogc2l6ZSBvZiBpcHRyICovCisgICAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIgKyA0LCBKUElQX0ZJRFgsCisgICAgICAgICAgICAgICAgICAgIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSVBUUiAqLworICAgIG9wal93cml0ZV9kb3VibGUobF9kYXRhX2hlYWRlciArIDQgKyA0LCAwKTsgLyogb2Zmc2V0ICovCisgICAgb3BqX3dyaXRlX2RvdWJsZShsX2RhdGFfaGVhZGVyICsgOCArIDgsIDApOyAvKiBsZW5ndGggKi8KIAotICBqMmtfY29kZXN0cmVhbV9leGl0ID0gb3BqX3N0cmVhbV90ZWxsKGNpbyk7Ci0gIGlmICghIG9wal9zdHJlYW1fc2VlayhjaW8sajJrX2NvZGVzdHJlYW1fZXhpdCxwX21hbmFnZXIpKSB7Ci0gICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBzZWVrIGluIHRoZSBzdHJlYW0uXG4iKTsKLSAgICByZXR1cm4gT1BKX0ZBTFNFOwotICB9CisgICAgaWYgKG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sIGxfZGF0YV9oZWFkZXIsIDI0LCBwX21hbmFnZXIpICE9IDI0KSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gc2VlayBpbiB0aGUgc3RyZWFtLlxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gIHJldHVybiBPUEpfVFJVRTsKKyAgICBqMmtfY29kZXN0cmVhbV9leGl0ID0gb3BqX3N0cmVhbV90ZWxsKGNpbyk7CisgICAgaWYgKCEgb3BqX3N0cmVhbV9zZWVrKGNpbywgajJrX2NvZGVzdHJlYW1fZXhpdCwgcF9tYW5hZ2VyKSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIHNlZWsgaW4gdGhlIHN0cmVhbS5cbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAogc3RhdGljIE9QSl9CT09MIG9wal9qcGlwX3dyaXRlX2NpZHgob3BqX2pwMl90ICpqcDIsCi0gIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0gIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKQogewotICBPUEpfT0ZGX1QgajJrX2NvZGVzdHJlYW1fZXhpdDsKLSAgT1BKX0JZVEUgbF9kYXRhX2hlYWRlciBbMjRdOworICAgIE9QSl9PRkZfVCBqMmtfY29kZXN0cmVhbV9leGl0OworICAgIE9QSl9CWVRFIGxfZGF0YV9oZWFkZXIgWzI0XTsKIAotICAvKiBwcmVjb25kaXRpb25zICovCi0gIGFzc2VydChqcDIgIT0gMDApOwotICBhc3NlcnQoY2lvICE9IDAwKTsKLSAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7Ci0gIGFzc2VydChvcGpfc3RyZWFtX2hhc19zZWVrKGNpbykpOworICAgIE9QSl9VTlVTRUQoanAyKTsKIAotICBqMmtfY29kZXN0cmVhbV9leGl0ID0gb3BqX3N0cmVhbV90ZWxsKGNpbyk7Ci0gIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyLCAyNCwgNCk7IC8qIHNpemUgb2YgaXB0ciAqLwotICBvcGpfd3JpdGVfYnl0ZXMobF9kYXRhX2hlYWRlciArIDQsSlBJUF9DSURYLDQpOwkJCQkJCQkJCSAgIC8qIElQVFIgKi8KKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KGpwMiAhPSAwMCk7CisgICAgYXNzZXJ0KGNpbyAhPSAwMCk7CisgICAgYXNzZXJ0KHBfbWFuYWdlciAhPSAwMCk7CisgICAgYXNzZXJ0KG9wal9zdHJlYW1faGFzX3NlZWsoY2lvKSk7CisKKyAgICBqMmtfY29kZXN0cmVhbV9leGl0ID0gb3BqX3N0cmVhbV90ZWxsKGNpbyk7CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIsIDI0LCA0KTsgLyogc2l6ZSBvZiBpcHRyICovCisgICAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIgKyA0LCBKUElQX0NJRFgsCisgICAgICAgICAgICAgICAgICAgIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSVBUUiAqLwogI2lmIDAKLSAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIgKyA0ICsgNCwgMCwgOCk7IC8qIG9mZnNldCAqLwotICBvcGpfd3JpdGVfYnl0ZXMobF9kYXRhX2hlYWRlciArIDggKyA4LCAwLCA4KTsgLyogbGVuZ3RoICovCisgICAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIgKyA0ICsgNCwgMCwgOCk7IC8qIG9mZnNldCAqLworICAgIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyICsgOCArIDgsIDAsIDgpOyAvKiBsZW5ndGggKi8KICNlbHNlCi0gIG9wal93cml0ZV9kb3VibGUobF9kYXRhX2hlYWRlciArIDQgKyA0LCAwKTsgLyogb2Zmc2V0ICovCi0gIG9wal93cml0ZV9kb3VibGUobF9kYXRhX2hlYWRlciArIDggKyA4LCAwKTsgLyogbGVuZ3RoICovCisgICAgb3BqX3dyaXRlX2RvdWJsZShsX2RhdGFfaGVhZGVyICsgNCArIDQsIDApOyAvKiBvZmZzZXQgKi8KKyAgICBvcGpfd3JpdGVfZG91YmxlKGxfZGF0YV9oZWFkZXIgKyA4ICsgOCwgMCk7IC8qIGxlbmd0aCAqLwogI2VuZGlmCiAKLSAgaWYgKCEgb3BqX3N0cmVhbV9zZWVrKGNpbyxqMmtfY29kZXN0cmVhbV9leGl0LHBfbWFuYWdlcikpIHsKLSAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIHNlZWsgaW4gdGhlIHN0cmVhbS5cbiIpOwotICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gIH0KKyAgICBpZiAoISBvcGpfc3RyZWFtX3NlZWsoY2lvLCBqMmtfY29kZXN0cmVhbV9leGl0LCBwX21hbmFnZXIpKSB7CisgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gc2VlayBpbiB0aGUgc3RyZWFtLlxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEoY2lvLGxfZGF0YV9oZWFkZXIsMjQscF9tYW5hZ2VyKSAhPSAyNCkgewotICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJGYWlsZWQgdG8gc2VlayBpbiB0aGUgc3RyZWFtLlxuIik7Ci0gICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgfQorICAgIGlmIChvcGpfc3RyZWFtX3dyaXRlX2RhdGEoY2lvLCBsX2RhdGFfaGVhZGVyLCAyNCwgcF9tYW5hZ2VyKSAhPSAyNCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiRmFpbGVkIHRvIHNlZWsgaW4gdGhlIHN0cmVhbS5cbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICBqMmtfY29kZXN0cmVhbV9leGl0ID0gb3BqX3N0cmVhbV90ZWxsKGNpbyk7Ci0gIGlmICghIG9wal9zdHJlYW1fc2VlayhjaW8sajJrX2NvZGVzdHJlYW1fZXhpdCxwX21hbmFnZXIpKSB7Ci0gICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBzZWVrIGluIHRoZSBzdHJlYW0uXG4iKTsKLSAgICByZXR1cm4gT1BKX0ZBTFNFOwotICB9CisgICAgajJrX2NvZGVzdHJlYW1fZXhpdCA9IG9wal9zdHJlYW1fdGVsbChjaW8pOworICAgIGlmICghIG9wal9zdHJlYW1fc2VlayhjaW8sIGoya19jb2Rlc3RyZWFtX2V4aXQsIHBfbWFuYWdlcikpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkZhaWxlZCB0byBzZWVrIGluIHRoZSBzdHJlYW0uXG4iKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgcmV0dXJuIE9QSl9UUlVFOworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAogI2lmIDAKLXN0YXRpYyB2b2lkIHdyaXRlX3ByeHkoIGludCBvZmZzZXRfanAyYywgaW50IGxlbmd0aF9qcDJjLCBpbnQgb2Zmc2V0X2lkeCwgaW50IGxlbmd0aF9pZHgsIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0gIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCitzdGF0aWMgdm9pZCB3cml0ZV9wcnh5KGludCBvZmZzZXRfanAyYywgaW50IGxlbmd0aF9qcDJjLCBpbnQgb2Zmc2V0X2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aF9pZHgsIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCisgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKIHsKLSAgT1BKX0JZVEUgbF9kYXRhX2hlYWRlciBbOF07Ci0gIE9QSl9PRkZfVCBsZW4sIGxlbnA7CisgICAgT1BKX0JZVEUgbF9kYXRhX2hlYWRlciBbOF07CisgICAgT1BKX09GRl9UIGxlbiwgbGVucDsKIAotICBsZW5wID0gb3BqX3N0cmVhbV90ZWxsKGNpbyk7Ci0gIG9wal9zdHJlYW1fc2tpcChjaW8sIDQsIHBfbWFuYWdlcik7ICAgICAgICAgLyogTCBbYXQgdGhlIGVuZF0gKi8KLSAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIsSlBJUF9QUlhZLDQpOyAvKiBJUFRSICAgICAgICAgICAqLwotICBvcGpfc3RyZWFtX3dyaXRlX2RhdGEoY2lvLGxfZGF0YV9oZWFkZXIsNCxwX21hbmFnZXIpOworICAgIGxlbnAgPSBvcGpfc3RyZWFtX3RlbGwoY2lvKTsKKyAgICBvcGpfc3RyZWFtX3NraXAoY2lvLCA0LCBwX21hbmFnZXIpOyAgICAgICAgIC8qIEwgW2F0IHRoZSBlbmRdICovCisgICAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIsIEpQSVBfUFJYWSwgNCk7IC8qIElQVFIgICAgICAgICAgICovCisgICAgb3BqX3N0cmVhbV93cml0ZV9kYXRhKGNpbywgbF9kYXRhX2hlYWRlciwgNCwgcF9tYW5hZ2VyKTsKIAotICBvcGpfd3JpdGVfYnl0ZXMoIGxfZGF0YV9oZWFkZXIsIG9mZnNldF9qcDJjLCA4KTsgLyogT09GRiAgICAgICAgICAgKi8KLSAgb3BqX3N0cmVhbV93cml0ZV9kYXRhKGNpbyxsX2RhdGFfaGVhZGVyLDgscF9tYW5hZ2VyKTsKLSAgb3BqX3dyaXRlX2J5dGVzKCBsX2RhdGFfaGVhZGVyLCBsZW5ndGhfanAyYywgNCk7IC8qIE9CSCBwYXJ0IDEgICAgICovCi0gIG9wal93cml0ZV9ieXRlcyggbF9kYXRhX2hlYWRlcis0LCBKUDJfSlAyQywgNCk7ICAvKiBPQkggcGFydCAyICAgICAqLwotICBvcGpfc3RyZWFtX3dyaXRlX2RhdGEoY2lvLGxfZGF0YV9oZWFkZXIsOCxwX21hbmFnZXIpOworICAgIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyLCBvZmZzZXRfanAyYywgOCk7ICAvKiBPT0ZGICAgICAgICAgICAqLworICAgIG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sIGxfZGF0YV9oZWFkZXIsIDgsIHBfbWFuYWdlcik7CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIsIGxlbmd0aF9qcDJjLCA0KTsgIC8qIE9CSCBwYXJ0IDEgICAgICovCisgICAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIgKyA0LCBKUDJfSlAyQywgNCk7IC8qIE9CSCBwYXJ0IDIgICAgICovCisgICAgb3BqX3N0cmVhbV93cml0ZV9kYXRhKGNpbywgbF9kYXRhX2hlYWRlciwgOCwgcF9tYW5hZ2VyKTsKIAotICBvcGpfd3JpdGVfYnl0ZXMoIGxfZGF0YV9oZWFkZXIsIDEsIDEpOy8qIE5JICAgICAgICAgICAgICovCi0gIG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sbF9kYXRhX2hlYWRlciwxLHBfbWFuYWdlcik7CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIsIDEsIDEpOyAvKiBOSSAgICAgICAgICAgICAqLworICAgIG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sIGxfZGF0YV9oZWFkZXIsIDEsIHBfbWFuYWdlcik7CiAKLSAgb3BqX3dyaXRlX2J5dGVzKCBsX2RhdGFfaGVhZGVyLCBvZmZzZXRfaWR4LCA4KTsgIC8qIElPRkYgICAgICAgICAgICovCi0gIG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sbF9kYXRhX2hlYWRlciw4LHBfbWFuYWdlcik7Ci0gIG9wal93cml0ZV9ieXRlcyggbF9kYXRhX2hlYWRlciwgbGVuZ3RoX2lkeCwgNCk7ICAvKiBJQkggcGFydCAxICAgICAqLwotICBvcGpfd3JpdGVfYnl0ZXMoIGxfZGF0YV9oZWFkZXIrNCwgSlBJUF9DSURYLCA0KTsgICAvKiBJQkggcGFydCAyICAgICAqLwotICBvcGpfc3RyZWFtX3dyaXRlX2RhdGEoY2lvLGxfZGF0YV9oZWFkZXIsOCxwX21hbmFnZXIpOworICAgIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyLCBvZmZzZXRfaWR4LCA4KTsgICAvKiBJT0ZGICAgICAgICAgICAqLworICAgIG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sIGxfZGF0YV9oZWFkZXIsIDgsIHBfbWFuYWdlcik7CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIsIGxlbmd0aF9pZHgsIDQpOyAgIC8qIElCSCBwYXJ0IDEgICAgICovCisgICAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIgKyA0LCBKUElQX0NJRFgsIDQpOyAgLyogSUJIIHBhcnQgMiAgICAgKi8KKyAgICBvcGpfc3RyZWFtX3dyaXRlX2RhdGEoY2lvLCBsX2RhdGFfaGVhZGVyLCA4LCBwX21hbmFnZXIpOwogCi0gIGxlbiA9IG9wal9zdHJlYW1fdGVsbChjaW8pLWxlbnA7Ci0gIG9wal9zdHJlYW1fc2tpcChjaW8sIGxlbnAsIHBfbWFuYWdlcik7Ci0gIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyLGxlbiw0KTsvKiBMICAgICAgICAgICAgICAqLwotICBvcGpfc3RyZWFtX3dyaXRlX2RhdGEoY2lvLGxfZGF0YV9oZWFkZXIsNCxwX21hbmFnZXIpOwotICBvcGpfc3RyZWFtX3NlZWsoY2lvLCBsZW5wK2xlbixwX21hbmFnZXIpOworICAgIGxlbiA9IG9wal9zdHJlYW1fdGVsbChjaW8pIC0gbGVucDsKKyAgICBvcGpfc3RyZWFtX3NraXAoY2lvLCBsZW5wLCBwX21hbmFnZXIpOworICAgIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyLCBsZW4sIDQpOyAvKiBMICAgICAgICAgICAgICAqLworICAgIG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sIGxfZGF0YV9oZWFkZXIsIDQsIHBfbWFuYWdlcik7CisgICAgb3BqX3N0cmVhbV9zZWVrKGNpbywgbGVucCArIGxlbiwgcF9tYW5hZ2VyKTsKIH0KICNlbmRpZgogCiAKICNpZiAwCi1zdGF0aWMgaW50IHdyaXRlX2ZpZHgoIGludCBvZmZzZXRfanAyYywgaW50IGxlbmd0aF9qcDJjLCBpbnQgb2Zmc2V0X2lkeCwgaW50IGxlbmd0aF9pZHgsIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCi0gIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApCitzdGF0aWMgaW50IHdyaXRlX2ZpZHgoaW50IG9mZnNldF9qcDJjLCBpbnQgbGVuZ3RoX2pwMmMsIGludCBvZmZzZXRfaWR4LAorICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGhfaWR4LCBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAorICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcikKIHsKLSAgT1BKX0JZVEUgbF9kYXRhX2hlYWRlciBbNF07Ci0gIE9QSl9PRkZfVCBsZW4sIGxlbnA7CisgICAgT1BKX0JZVEUgbF9kYXRhX2hlYWRlciBbNF07CisgICAgT1BKX09GRl9UIGxlbiwgbGVucDsKIAotICBsZW5wID0gb3BqX3N0cmVhbV90ZWxsKGNpbyk7Ci0gIG9wal9zdHJlYW1fc2tpcChjaW8sIDQsIHBfbWFuYWdlcik7Ci0gIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyLEpQSVBfRklEWCw0KTsgLyogRklEWCAqLwotICBvcGpfc3RyZWFtX3dyaXRlX2RhdGEoY2lvLGxfZGF0YV9oZWFkZXIsNCxwX21hbmFnZXIpOworICAgIGxlbnAgPSBvcGpfc3RyZWFtX3RlbGwoY2lvKTsKKyAgICBvcGpfc3RyZWFtX3NraXAoY2lvLCA0LCBwX21hbmFnZXIpOworICAgIG9wal93cml0ZV9ieXRlcyhsX2RhdGFfaGVhZGVyLCBKUElQX0ZJRFgsIDQpOyAvKiBGSURYICovCisgICAgb3BqX3N0cmVhbV93cml0ZV9kYXRhKGNpbywgbF9kYXRhX2hlYWRlciwgNCwgcF9tYW5hZ2VyKTsKIAotICB3cml0ZV9wcnh5KCBvZmZzZXRfanAyYywgbGVuZ3RoX2pwMmMsIG9mZnNldF9pZHgsIGxlbmd0aF9pZHgsIGNpbyxwX21hbmFnZXIpOworICAgIHdyaXRlX3ByeHkob2Zmc2V0X2pwMmMsIGxlbmd0aF9qcDJjLCBvZmZzZXRfaWR4LCBsZW5ndGhfaWR4LCBjaW8sIHBfbWFuYWdlcik7CiAKLSAgbGVuID0gb3BqX3N0cmVhbV90ZWxsKGNpbyktbGVucDsKLSAgb3BqX3N0cmVhbV9za2lwKGNpbywgbGVucCwgcF9tYW5hZ2VyKTsKLSAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIsbGVuLDQpOy8qIEwgICAgICAgICAgICAgICovCi0gIG9wal9zdHJlYW1fd3JpdGVfZGF0YShjaW8sbF9kYXRhX2hlYWRlciw0LHBfbWFuYWdlcik7Ci0gIG9wal9zdHJlYW1fc2VlayhjaW8sIGxlbnArbGVuLHBfbWFuYWdlcik7CisgICAgbGVuID0gb3BqX3N0cmVhbV90ZWxsKGNpbykgLSBsZW5wOworICAgIG9wal9zdHJlYW1fc2tpcChjaW8sIGxlbnAsIHBfbWFuYWdlcik7CisgICAgb3BqX3dyaXRlX2J5dGVzKGxfZGF0YV9oZWFkZXIsIGxlbiwgNCk7IC8qIEwgICAgICAgICAgICAgICovCisgICAgb3BqX3N0cmVhbV93cml0ZV9kYXRhKGNpbywgbF9kYXRhX2hlYWRlciwgNCwgcF9tYW5hZ2VyKTsKKyAgICBvcGpfc3RyZWFtX3NlZWsoY2lvLCBsZW5wICsgbGVuLCBwX21hbmFnZXIpOwogCi0gIHJldHVybiBsZW47CisgICAgcmV0dXJuIGxlbjsKIH0KICNlbmRpZgogI2VuZGlmIC8qIFVTRV9KUElQICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2pwMi5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9qcDIuaAppbmRleCA5NDEzODgzLi4zNGFiZDUxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL2pwMi5oCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvanAyLmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCiAgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCiAgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCiAgKgpAQCAtOCw3ICs4LDcgQEAKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBQcm9mZXNzb3IgQmVub2l0IE1hY3EKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRlIgCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZSCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCkBAIC0zMyw4ICszMyw4IEBACiAgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KLSNpZm5kZWYgX19KUDJfSAotI2RlZmluZSBfX0pQMl9ICisjaWZuZGVmIE9QSl9KUDJfSAorI2RlZmluZSBPUEpfSlAyX0gKIC8qKgogQGZpbGUganAyLmgKIEBicmllZiBUaGUgSlBFRy0yMDAwIGZpbGUgZm9ybWF0IFJlYWRlci9Xcml0ZXIgKEpQMikKQEAgLTcwLDU2ICs3MCw1MCBAQAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi10eXBlZGVmIGVudW0KLXsKLSAgSlAyX1NUQVRFX05PTkUgICAgICAgICAgICA9IDB4MCwKLSAgSlAyX1NUQVRFX1NJR05BVFVSRSAgICAgICA9IDB4MSwKLSAgSlAyX1NUQVRFX0ZJTEVfVFlQRSAgICAgICA9IDB4MiwKLSAgSlAyX1NUQVRFX0hFQURFUiAgICAgICAgICA9IDB4NCwKLSAgSlAyX1NUQVRFX0NPREVTVFJFQU0gICAgICA9IDB4OCwKLSAgSlAyX1NUQVRFX0VORF9DT0RFU1RSRUFNICA9IDB4MTAsCi0gIEpQMl9TVEFURV9VTktOT1dOICAgICAgICAgPSAweDdmZmZmZmZmIC8qIElTTyBDIHJlc3RyaWN0cyBlbnVtZXJhdG9yIHZhbHVlcyB0byByYW5nZSBvZiAnaW50JyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBKUDJfU1RBVEVfTk9ORSAgICAgICAgICAgID0gMHgwLAorICAgIEpQMl9TVEFURV9TSUdOQVRVUkUgICAgICAgPSAweDEsCisgICAgSlAyX1NUQVRFX0ZJTEVfVFlQRSAgICAgICA9IDB4MiwKKyAgICBKUDJfU1RBVEVfSEVBREVSICAgICAgICAgID0gMHg0LAorICAgIEpQMl9TVEFURV9DT0RFU1RSRUFNICAgICAgPSAweDgsCisgICAgSlAyX1NUQVRFX0VORF9DT0RFU1RSRUFNICA9IDB4MTAsCisgICAgSlAyX1NUQVRFX1VOS05PV04gICAgICAgICA9IDB4N2ZmZmZmZmYgLyogSVNPIEMgcmVzdHJpY3RzIGVudW1lcmF0b3IgdmFsdWVzIHRvIHJhbmdlIG9mICdpbnQnICovCiB9CiBKUDJfU1RBVEU7CiAKLXR5cGVkZWYgZW51bQotewotICBKUDJfSU1HX1NUQVRFX05PTkUgICAgICAgID0gMHgwLAotICBKUDJfSU1HX1NUQVRFX1VOS05PV04gICAgID0gMHg3ZmZmZmZmZgordHlwZWRlZiBlbnVtIHsKKyAgICBKUDJfSU1HX1NUQVRFX05PTkUgICAgICAgID0gMHgwLAorICAgIEpQMl9JTUdfU1RBVEVfVU5LTk9XTiAgICAgPSAweDdmZmZmZmZmCiB9CiBKUDJfSU1HX1NUQVRFOwogCi0vKiogCisvKioKIENoYW5uZWwgZGVzY3JpcHRpb246IGNoYW5uZWwgaW5kZXgsIHR5cGUsIGFzc29jaWF0aW9uCiAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX2pwMl9jZGVmX2luZm8KLXsKK3R5cGVkZWYgc3RydWN0IG9wal9qcDJfY2RlZl9pbmZvIHsKICAgICBPUEpfVUlOVDE2IGNuLCB0eXAsIGFzb2M7CiB9IG9wal9qcDJfY2RlZl9pbmZvX3Q7CiAKLS8qKiAKKy8qKgogQ2hhbm5lbCBkZXNjcmlwdGlvbnMgYW5kIG51bWJlciBvZiBkZXNjcmlwdGlvbnMKICovCi10eXBlZGVmIHN0cnVjdCBvcGpfanAyX2NkZWYKLXsKK3R5cGVkZWYgc3RydWN0IG9wal9qcDJfY2RlZiB7CiAgICAgb3BqX2pwMl9jZGVmX2luZm9fdCAqaW5mbzsKICAgICBPUEpfVUlOVDE2IG47CiB9IG9wal9qcDJfY2RlZl90OwogCi0vKiogCisvKioKIENvbXBvbmVudCBtYXBwaW5nczogY2hhbm5lbCBpbmRleCwgbWFwcGluZyB0eXBlLCBwYWxldHRlIGluZGV4CiAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX2pwMl9jbWFwX2NvbXAKLXsKK3R5cGVkZWYgc3RydWN0IG9wal9qcDJfY21hcF9jb21wIHsKICAgICBPUEpfVUlOVDE2IGNtcDsKICAgICBPUEpfQllURSBtdHlwLCBwY29sOwogfSBvcGpfanAyX2NtYXBfY29tcF90OwogCi0vKiogCisvKioKIFBhbGV0dGUgZGF0YTogdGFibGUgZW50cmllcywgcGFsZXR0ZSBjb2x1bW5zCiAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX2pwMl9wY2xyCi17Cit0eXBlZGVmIHN0cnVjdCBvcGpfanAyX3BjbHIgewogICAgIE9QSl9VSU5UMzIgKmVudHJpZXM7CiAgICAgT1BKX0JZVEUgKmNoYW5uZWxfc2lnbjsKICAgICBPUEpfQllURSAqY2hhbm5lbF9zaXplOwpAQCAtMTI4LDExICsxMjIsMTAgQEAKICAgICBPUEpfQllURSBucl9jaGFubmVsczsKIH0gb3BqX2pwMl9wY2xyX3Q7CiAKLS8qKiAKLUNvbGxlY3RvciBmb3IgSUNDIHByb2ZpbGUsIHBhbGV0dGUsIGNvbXBvbmVudCBtYXBwaW5nLCBjaGFubmVsIGRlc2NyaXB0aW9uIAorLyoqCitDb2xsZWN0b3IgZm9yIElDQyBwcm9maWxlLCBwYWxldHRlLCBjb21wb25lbnQgbWFwcGluZywgY2hhbm5lbCBkZXNjcmlwdGlvbgogKi8KLXR5cGVkZWYgc3RydWN0IG9wal9qcDJfY29sb3IKLXsKK3R5cGVkZWYgc3RydWN0IG9wal9qcDJfY29sb3IgewogICAgIE9QSl9CWVRFICppY2NfcHJvZmlsZV9idWY7CiAgICAgT1BKX1VJTlQzMiBpY2NfcHJvZmlsZV9sZW47CiAKQEAgLTE0MSw2MCArMTM0LDYxIEBACiAgICAgT1BKX0JZVEUganAyX2hhc19jb2xyOwogfSBvcGpfanAyX2NvbG9yX3Q7CiAKLS8qKiAKKy8qKgogSlAyIGNvbXBvbmVudAogKi8KIHR5cGVkZWYgc3RydWN0IG9wal9qcDJfY29tcHMgewotICBPUEpfVUlOVDMyIGRlcHRoOyAgICAgIAotICBPUEpfVUlOVDMyIHNnbmQ7ICAgICAgIAotICBPUEpfVUlOVDMyIGJwY2M7CisgICAgT1BKX1VJTlQzMiBkZXB0aDsKKyAgICBPUEpfVUlOVDMyIHNnbmQ7CisgICAgT1BKX1VJTlQzMiBicGNjOwogfSBvcGpfanAyX2NvbXBzX3Q7CiAKIC8qKgogSlBFRy0yMDAwIGZpbGUgZm9ybWF0IHJlYWRlci93cml0ZXIKICovCi10eXBlZGVmIHN0cnVjdCBvcGpfanAyCi17Ci0gIC8qKiBoYW5kbGUgdG8gdGhlIEoySyBjb2RlYyAgKi8KLSAgb3BqX2oya190ICpqMms7Ci0gIC8qKiBsaXN0IG9mIHZhbGlkYXRpb24gcHJvY2VkdXJlcyAqLwotICBzdHJ1Y3Qgb3BqX3Byb2NlZHVyZV9saXN0ICogbV92YWxpZGF0aW9uX2xpc3Q7Ci0gIC8qKiBsaXN0IG9mIGV4ZWN1dGlvbiBwcm9jZWR1cmVzICovCi0gIHN0cnVjdCBvcGpfcHJvY2VkdXJlX2xpc3QgKiBtX3Byb2NlZHVyZV9saXN0OwordHlwZWRlZiBzdHJ1Y3Qgb3BqX2pwMiB7CisgICAgLyoqIGhhbmRsZSB0byB0aGUgSjJLIGNvZGVjICAqLworICAgIG9wal9qMmtfdCAqajJrOworICAgIC8qKiBsaXN0IG9mIHZhbGlkYXRpb24gcHJvY2VkdXJlcyAqLworICAgIHN0cnVjdCBvcGpfcHJvY2VkdXJlX2xpc3QgKiBtX3ZhbGlkYXRpb25fbGlzdDsKKyAgICAvKiogbGlzdCBvZiBleGVjdXRpb24gcHJvY2VkdXJlcyAqLworICAgIHN0cnVjdCBvcGpfcHJvY2VkdXJlX2xpc3QgKiBtX3Byb2NlZHVyZV9saXN0OwogCi0gIC8qIHdpZHRoIG9mIGltYWdlICovCi0gIE9QSl9VSU5UMzIgdzsKLSAgLyogaGVpZ2h0IG9mIGltYWdlICovCi0gIE9QSl9VSU5UMzIgaDsKLSAgLyogbnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gdGhlIGltYWdlICovCi0gIE9QSl9VSU5UMzIgbnVtY29tcHM7Ci0gIE9QSl9VSU5UMzIgYnBjOwotICBPUEpfVUlOVDMyIEM7Ci0gIE9QSl9VSU5UMzIgVW5rQzsKLSAgT1BKX1VJTlQzMiBJUFI7Ci0gIE9QSl9VSU5UMzIgbWV0aDsKLSAgT1BKX1VJTlQzMiBhcHByb3g7Ci0gIE9QSl9VSU5UMzIgZW51bWNzOwotICBPUEpfVUlOVDMyIHByZWNlZGVuY2U7Ci0gIE9QSl9VSU5UMzIgYnJhbmQ7Ci0gIE9QSl9VSU5UMzIgbWludmVyc2lvbjsKLSAgT1BKX1VJTlQzMiBudW1jbDsKLSAgT1BKX1VJTlQzMiAqY2w7Ci0gIG9wal9qcDJfY29tcHNfdCAqY29tcHM7Ci0gIC8qIEZJWE1FOiBUaGUgZm9sbG93aW5nIHR3byB2YXJpYWJsZXMgYXJlIHVzZWQgdG8gc2F2ZSBvZmZzZXQKLSAgICBhcyB3ZSB3cml0ZSBvdXQgYSBKUDIgZmlsZSB0byBkaXNrLiBUaGlzIG1lY2FuaXNtIGlzIG5vdCBmbGV4aWJsZQotICAgIGFzIGNvZGVjIHdyaXRlcnMgd2lsbCBuZWVkIHRvIGV4dGFuZCB0aG9zZSBmaWVsZHMgYXMgbmV3IHBhcnQKLSAgICBvZiB0aGUgc3RhbmRhcmQgYXJlIGltcGxlbWVudGVkLgotICAqLworICAgIC8qIHdpZHRoIG9mIGltYWdlICovCisgICAgT1BKX1VJTlQzMiB3OworICAgIC8qIGhlaWdodCBvZiBpbWFnZSAqLworICAgIE9QSl9VSU5UMzIgaDsKKyAgICAvKiBudW1iZXIgb2YgY29tcG9uZW50cyBpbiB0aGUgaW1hZ2UgKi8KKyAgICBPUEpfVUlOVDMyIG51bWNvbXBzOworICAgIE9QSl9VSU5UMzIgYnBjOworICAgIE9QSl9VSU5UMzIgQzsKKyAgICBPUEpfVUlOVDMyIFVua0M7CisgICAgT1BKX1VJTlQzMiBJUFI7CisgICAgT1BKX1VJTlQzMiBtZXRoOworICAgIE9QSl9VSU5UMzIgYXBwcm94OworICAgIE9QSl9VSU5UMzIgZW51bWNzOworICAgIE9QSl9VSU5UMzIgcHJlY2VkZW5jZTsKKyAgICBPUEpfVUlOVDMyIGJyYW5kOworICAgIE9QSl9VSU5UMzIgbWludmVyc2lvbjsKKyAgICBPUEpfVUlOVDMyIG51bWNsOworICAgIE9QSl9VSU5UMzIgKmNsOworICAgIG9wal9qcDJfY29tcHNfdCAqY29tcHM7CisgICAgLyogRklYTUU6IFRoZSBmb2xsb3dpbmcgdHdvIHZhcmlhYmxlcyBhcmUgdXNlZCB0byBzYXZlIG9mZnNldAorICAgICAgYXMgd2Ugd3JpdGUgb3V0IGEgSlAyIGZpbGUgdG8gZGlzay4gVGhpcyBtZWNoYW5pc20gaXMgbm90IGZsZXhpYmxlCisgICAgICBhcyBjb2RlYyB3cml0ZXJzIHdpbGwgbmVlZCB0byBleHRhbmQgdGhvc2UgZmllbGRzIGFzIG5ldyBwYXJ0CisgICAgICBvZiB0aGUgc3RhbmRhcmQgYXJlIGltcGxlbWVudGVkLgorICAgICovCiAgICAgT1BKX09GRl9UIGoya19jb2Rlc3RyZWFtX29mZnNldDsKICAgICBPUEpfT0ZGX1QganBpcF9pcHRyX29mZnNldDsKLQlPUEpfQk9PTCBqcGlwX29uOwotICBPUEpfVUlOVDMyIGpwMl9zdGF0ZTsKLSAgT1BKX1VJTlQzMiBqcDJfaW1nX3N0YXRlOworICAgIE9QSl9CT09MIGpwaXBfb247CisgICAgT1BKX1VJTlQzMiBqcDJfc3RhdGU7CisgICAgT1BKX1VJTlQzMiBqcDJfaW1nX3N0YXRlOwogCi0gIG9wal9qcDJfY29sb3JfdCBjb2xvcjsKLSAgICAKKyAgICBvcGpfanAyX2NvbG9yX3QgY29sb3I7CisKICAgICBPUEpfQk9PTCBpZ25vcmVfcGNscl9jbWFwX2NkZWY7CisgICAgT1BKX0JZVEUgaGFzX2pwMmg7CisgICAgT1BKX0JZVEUgaGFzX2loZHI7CiB9CiBvcGpfanAyX3Q7CiAKQEAgLTIwNywyOCArMjAxLDI2IEBACiAgICAgT1BKX0lOVDMyIGluaXRfcG9zOwogfSBvcGpfanAyX2JveF90OwogCi10eXBlZGVmIHN0cnVjdCBvcGpfanAyX2hlYWRlcl9oYW5kbGVyCi17Ci0gIC8qIG1hcmtlciB2YWx1ZSAqLwotICBPUEpfVUlOVDMyIGlkOwotICAvKiBhY3Rpb24gbGlua2VkIHRvIHRoZSBtYXJrZXIgKi8KLSAgT1BKX0JPT0wgKCpoYW5kbGVyKSAoICAgICBvcGpfanAyX3QgKmpwMiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKnBfaGVhZGVyX2RhdGEsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9oZWFkZXJfc2l6ZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKK3R5cGVkZWYgc3RydWN0IG9wal9qcDJfaGVhZGVyX2hhbmRsZXIgeworICAgIC8qIG1hcmtlciB2YWx1ZSAqLworICAgIE9QSl9VSU5UMzIgaWQ7CisgICAgLyogYWN0aW9uIGxpbmtlZCB0byB0aGUgbWFya2VyICovCisgICAgT1BKX0JPT0woKmhhbmRsZXIpKG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9oZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2hlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogfQogb3BqX2pwMl9oZWFkZXJfaGFuZGxlcl90OwogCiAKLXR5cGVkZWYgc3RydWN0IG9wal9qcDJfaW1nX2hlYWRlcl93cml0ZXJfaGFuZGxlciAKLXsKLSAgLyogYWN0aW9uIHRvIHBlcmZvcm0gKi8KLSAgT1BKX0JZVEUqICAgKCpoYW5kbGVyKSAob3BqX2pwMl90ICpqcDIsIE9QSl9VSU5UMzIgKiBwX2RhdGFfc2l6ZSk7Ci0gIC8qIHJlc3VsdCBvZiB0aGUgYWN0aW9uIDogZGF0YSAqLwotICBPUEpfQllURSogICBtX2RhdGE7Ci0gIC8qIHNpemUgb2YgZGF0YSAqLwotICBPUEpfVUlOVDMyICBtX3NpemU7Ci19IAordHlwZWRlZiBzdHJ1Y3Qgb3BqX2pwMl9pbWdfaGVhZGVyX3dyaXRlcl9oYW5kbGVyIHsKKyAgICAvKiBhY3Rpb24gdG8gcGVyZm9ybSAqLworICAgIE9QSl9CWVRFKiAgICgqaGFuZGxlcikob3BqX2pwMl90ICpqcDIsIE9QSl9VSU5UMzIgKiBwX2RhdGFfc2l6ZSk7CisgICAgLyogcmVzdWx0IG9mIHRoZSBhY3Rpb24gOiBkYXRhICovCisgICAgT1BKX0JZVEUqICAgbV9kYXRhOworICAgIC8qIHNpemUgb2YgZGF0YSAqLworICAgIE9QSl9VSU5UMzIgIG1fc2l6ZTsKK30KIG9wal9qcDJfaW1nX2hlYWRlcl93cml0ZXJfaGFuZGxlcl90OwogCiAvKiogQG5hbWUgRXhwb3J0ZWQgZnVuY3Rpb25zICovCkBAIC0yNDMsNiArMjM1LDE0IEBACiAqLwogdm9pZCBvcGpfanAyX3NldHVwX2RlY29kZXIob3BqX2pwMl90ICpqcDIsIG9wal9kcGFyYW1ldGVyc190ICpwYXJhbWV0ZXJzKTsKIAorLyoqIEFsbG9jYXRlcyB3b3JrZXIgdGhyZWFkcyBmb3IgdGhlIGNvbXByZXNzb3IvZGVjb21wcmVzc29yLgorICoKKyAqIEBwYXJhbSBqcDIgSlAyIGRlY29tcHJlc3NvciBoYW5kbGUKKyAqIEBwYXJhbSBudW1fdGhyZWFkcyBOdW1iZXIgb2YgdGhyZWFkcy4KKyAqIEByZXR1cm4gT1BKX1RSVUUgaW4gY2FzZSBvZiBzdWNjZXNzLgorICovCitPUEpfQk9PTCBvcGpfanAyX3NldF90aHJlYWRzKG9wal9qcDJfdCAqanAyLCBPUEpfVUlOVDMyIG51bV90aHJlYWRzKTsKKwogLyoqCiAgKiBEZWNvZGUgYW4gaW1hZ2UgZnJvbSBhIEpQRUctMjAwMCBmaWxlIHN0cmVhbQogICogQHBhcmFtIGpwMiBKUDIgZGVjb21wcmVzc29yIGhhbmRsZQpAQCAtMjU0LDEyICsyNTQsMTIgQEAKICovCiBPUEpfQk9PTCBvcGpfanAyX2RlY29kZShvcGpfanAyX3QgKmpwMiwKICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgIG9wal9pbWFnZV90KiBwX2ltYWdlLAotICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90KiBwX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCi0gKiBTZXR1cCB0aGUgZW5jb2RlciBwYXJhbWV0ZXJzIHVzaW5nIHRoZSBjdXJyZW50IGltYWdlIGFuZCB1c2luZyB1c2VyIHBhcmFtZXRlcnMuIAotICogQ29kaW5nIHBhcmFtZXRlcnMgYXJlIHJldHVybmVkIGluIGpwMi0+ajJrLT5jcC4gCisgKiBTZXR1cCB0aGUgZW5jb2RlciBwYXJhbWV0ZXJzIHVzaW5nIHRoZSBjdXJyZW50IGltYWdlIGFuZCB1c2luZyB1c2VyIHBhcmFtZXRlcnMuCisgKiBDb2RpbmcgcGFyYW1ldGVycyBhcmUgcmV0dXJuZWQgaW4ganAyLT5qMmstPmNwLgogICoKICAqIEBwYXJhbSBqcDIgSlAyIGNvbXByZXNzb3IgaGFuZGxlCiAgKiBAcGFyYW0gcGFyYW1ldGVycyBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzCkBAIC0yNjcsMTAgKzI2NywxMCBAQAogICogQHBhcmFtIHBfbWFuYWdlciAgRklYTUUgRE9DCiAgKiBAcmV0dXJuIE9QSl9UUlVFIGlmIHN1Y2Nlc3NmdWwsIE9QSl9GQUxTRSBvdGhlcndpc2UKICovCi1PUEpfQk9PTCBvcGpfanAyX3NldHVwX2VuY29kZXIoICBvcGpfanAyX3QgKmpwMiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90ICppbWFnZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKK09QSl9CT09MIG9wal9qcDJfc2V0dXBfZW5jb2RlcihvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY3BhcmFtZXRlcnNfdCAqcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogLyoqCiBFbmNvZGUgYW4gaW1hZ2UgaW50byBhIEpQRUctMjAwMCBmaWxlIHN0cmVhbQpAQCAtMjc5LDkgKzI3OSw5IEBACiBAcGFyYW0gcF9tYW5hZ2VyICBldmVudCBtYW5hZ2VyCiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIGZhbHNlIG90aGVyd2lzZQogKi8KLU9QSl9CT09MIG9wal9qcDJfZW5jb2RlKCAgb3BqX2pwMl90ICpqcDIsIAotICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqc3RyZWFtLCAKLSAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKK09QSl9CT09MIG9wal9qcDJfZW5jb2RlKG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIAogLyoqCkBAIC0zMDQsOSArMzA0LDkgQEAKICAqIEVuZHMgdGhlIGNvbXByZXNzaW9uIHByb2NlZHVyZXMgYW5kIHBvc3NpYmlsaXkgYWRkIGRhdGEgdG8gYmUgcmVhZCBhZnRlciB0aGUKICAqIGNvZGVzdHJlYW0uCiAgKi8KLU9QSl9CT09MIG9wal9qcDJfZW5kX2NvbXByZXNzKCAgb3BqX2pwMl90ICpqcDIsCi0gICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqY2lvLAotICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKK09QSl9CT09MIG9wal9qcDJfZW5kX2NvbXByZXNzKG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKmNpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTMxNCw3ICszMTQsNyBAQAogICogRW5kcyB0aGUgZGVjb21wcmVzc2lvbiBwcm9jZWR1cmVzIGFuZCBwb3NzaWJpbGl5IGFkZCBkYXRhIHRvIGJlIHJlYWQgYWZ0ZXIgdGhlCiAgKiBjb2Rlc3RyZWFtLgogICovCi1PUEpfQk9PTCBvcGpfanAyX2VuZF9kZWNvbXByZXNzKG9wal9qcDJfdCAqanAyLCAKK09QSl9CT09MIG9wal9qcDJfZW5kX2RlY29tcHJlc3Mob3BqX2pwMl90ICpqcDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpjaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKQEAgLTMyOCwxMCArMzI4LDI1IEBACiAgKgogICogQHJldHVybiB0cnVlIGlmIHRoZSBib3ggaXMgdmFsaWQuCiAgKi8KLU9QSl9CT09MIG9wal9qcDJfcmVhZF9oZWFkZXIoICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9qcDJfdCAqanAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqKiBwX2ltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK09QSl9CT09MIG9wal9qcDJfcmVhZF9oZWFkZXIob3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfanAyX3QgKmpwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKiogcF9pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKKworLyoqIFNldHMgdGhlIGluZGljZXMgb2YgdGhlIGNvbXBvbmVudHMgdG8gZGVjb2RlLgorICoKKyAqIEBwYXJhbSBqcDIgSlAyIGRlY29tcHJlc3NvciBoYW5kbGUKKyAqIEBwYXJhbSBudW1jb21wcyBOdW1iZXIgb2YgY29tcG9uZW50cyB0byBkZWNvZGUuCisgKiBAcGFyYW0gY29tcHNfaW5kaWNlcyBBcnJheSBvZiBudW1fY29tcHRzIGluZGljZXMgKG51bWJlcmluZyBzdGFydGluZyBhdCAwKQorICogICAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb21wb25lbnRzIHRvIGRlY29kZS4KKyAqIEBwYXJhbSBwX21hbmFnZXIgRXZlbnQgbWFuYWdlcjsKKyAqCisgKiBAcmV0dXJuIE9QSl9UUlVFIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KKyAqLworT1BKX0JPT0wgb3BqX2pwMl9zZXRfZGVjb2RlZF9jb21wb25lbnRzKG9wal9qcDJfdCAqanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbnVtY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1BKX1VJTlQzMiogY29tcHNfaW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIFJlYWRzIGEgdGlsZSBoZWFkZXIuCkBAIC0zNDcsMTcgKzM2MiwxNyBAQAogICogQHBhcmFtICBwX3N0cmVhbSAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KICAqIEBwYXJhbSAgcF9tYW5hZ2VyICAgICB0aGUgdXNlciBldmVudCBtYW5hZ2VyLgogICovCi1PUEpfQk9PTCBvcGpfanAyX3JlYWRfdGlsZV9oZWFkZXIgKCBvcGpfanAyX3QgKiBwX2pwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX3RpbGVfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3RpbGVfeDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3RpbGVfeTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3RpbGVfeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3RpbGVfeTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9uYl9jb21wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CT09MICogcF9nb19vbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworT1BKX0JPT0wgb3BqX2pwMl9yZWFkX3RpbGVfaGVhZGVyKG9wal9qcDJfdCAqIHBfanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX3RpbGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV94MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3RpbGVfeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV95MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9uYl9jb21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQk9PTCAqIHBfZ29fb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKIC8qKgogICogV3JpdGVzIGEgdGlsZS4KQEAgLTM2OSwxMiArMzg0LDEyIEBACiAgKiBAcGFyYW0gIHBfc3RyZWFtICAgICAgdGhlIHN0cmVhbSB0byB3cml0ZSBkYXRhIHRvLgogICogQHBhcmFtICBwX21hbmFnZXIgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIuCiAgKi8KLU9QSl9CT09MIG9wal9qcDJfd3JpdGVfdGlsZSAoICBvcGpfanAyX3QgKnBfanAyLAotICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyICk7CitPUEpfQk9PTCBvcGpfanAyX3dyaXRlX3RpbGUob3BqX2pwMl90ICpwX2pwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIERlY29kZSB0aWxlIGRhdGEuCkBAIC0zODcsMTkgKzQwMiwxOSBAQAogICoKICAqIEByZXR1cm4gRklYTUUgRE9DCiAgKi8KLU9QSl9CT09MIG9wal9qcDJfZGVjb2RlX3RpbGUgKCAgb3BqX2pwMl90ICogcF9qcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIgKTsKK09QSl9CT09MIG9wal9qcDJfZGVjb2RlX3RpbGUob3BqX2pwMl90ICogcF9qcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKnBfc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpOwogCiAvKioKICAqIENyZWF0ZXMgYSBqcGVnMjAwMCBmaWxlIGRlY29tcHJlc3Nvci4KICAqCiAgKiBAcmV0dXJuICBhbiBlbXB0eSBqcGVnMjAwMCBmaWxlIGNvZGVjLgogICovCi1vcGpfanAyX3QqIG9wal9qcDJfY3JlYXRlIChPUEpfQk9PTCBwX2lzX2RlY29kZXIpOworb3BqX2pwMl90KiBvcGpfanAyX2NyZWF0ZShPUEpfQk9PTCBwX2lzX2RlY29kZXIpOwogCiAvKioKIERlc3Ryb3kgYSBKUDIgZGVjb21wcmVzc29yIGhhbmRsZQpAQCAtNDIxLDI4ICs0MzYsMjggQEAKICAqCiAgKiBAcmV0dXJuICB0cnVlICAgICAgaWYgdGhlIGFyZWEgY291bGQgYmUgc2V0LgogICovCi1PUEpfQk9PTCBvcGpfanAyX3NldF9kZWNvZGVfYXJlYSggIG9wal9qcDJfdCAqcF9qcDIsCi0gICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90KiBwX2ltYWdlLAotICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF9zdGFydF94LCBPUEpfSU5UMzIgcF9zdGFydF95LAotICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF9lbmRfeCwgT1BKX0lOVDMyIHBfZW5kX3ksCi0gICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlciApOworT1BKX0JPT0wgb3BqX2pwMl9zZXRfZGVjb2RlX2FyZWEob3BqX2pwMl90ICpwX2pwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90KiBwX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfc3RhcnRfeCwgT1BKX0lOVDMyIHBfc3RhcnRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX2VuZF94LCBPUEpfSU5UMzIgcF9lbmRfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAKLSAvKioKLSAqIAotICovCi1PUEpfQk9PTCBvcGpfanAyX2dldF90aWxlKCAgb3BqX2pwMl90ICpwX2pwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QqIHBfaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdGlsZV9pbmRleCApOworLyoqCisqCisqLworT1BKX0JPT0wgb3BqX2pwMl9nZXRfdGlsZShvcGpfanAyX3QgKnBfanAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90KiBwX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdGlsZV9pbmRleCk7CiAKIAogLyoqCi0gKiAKKyAqCiAgKi8KLU9QSl9CT09MIG9wal9qcDJfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3Iob3BqX2pwMl90ICpwX2pwMiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcmVzX2ZhY3RvciwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CitPUEpfQk9PTCBvcGpfanAyX3NldF9kZWNvZGVkX3Jlc29sdXRpb25fZmFjdG9yKG9wal9qcDJfdCAqcF9qcDIsCisgICAgICAgIE9QSl9VSU5UMzIgcmVzX2ZhY3RvciwKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKIAogCiAvKiBUT0RPIE1TRDogY2xlYW4gdGhlc2UgMyBmdW5jdGlvbnMgKi8KQEAgLTQ1MCwxMSArNDY1LDExIEBACiAgKiBEdW1wIHNvbWUgZWxlbWVudHMgZnJvbSB0aGUgSlAyIGRlY29tcHJlc3Npb24gc3RydWN0dXJlIC4KICAqCiAgKkBwYXJhbSBwX2pwMiAgICAgICAgdGhlIGpwMiBjb2RlYy4KLSAqQHBhcmFtIGZsYWcgICAgICAgIGZsYWcgdG8gZGVzY3JpYmUgd2hhdCBlbG1lbnRzIGFyZSBkdW1wLgorICpAcGFyYW0gZmxhZyAgICAgICAgZmxhZyB0byBkZXNjcmliZSB3aGF0IGVsZW1lbnRzIGFyZSBkdW1wLgogICpAcGFyYW0gb3V0X3N0cmVhbSAgICAgIG91dHB1dCBzdHJlYW0gd2hlcmUgZHVtcCB0aGUgZWxlbWVudHMuCiAgKgogKi8KLXZvaWQganAyX2R1bXAgKG9wal9qcDJfdCogcF9qcDIsIE9QSl9JTlQzMiBmbGFnLCBGSUxFKiBvdXRfc3RyZWFtKTsKK3ZvaWQganAyX2R1bXAob3BqX2pwMl90KiBwX2pwMiwgT1BKX0lOVDMyIGZsYWcsIEZJTEUqIG91dF9zdHJlYW0pOwogCiAvKioKICAqIEdldCB0aGUgY29kZXN0cmVhbSBpbmZvIGZyb20gYSBKUEVHMjAwMCBjb2RlYy4KQEAgLTQ3OSw1ICs0OTQsNSBAQAogCiAvKkB9Ki8KIAotI2VuZGlmIC8qIF9fSlAyX0ggKi8KKyNlbmRpZiAvKiBPUEpfSlAyX0ggKi8KIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9tY3QuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvbWN0LmMKaW5kZXggNzczMWMxNS4uODFlYzIyMyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9tY3QuYworKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL21jdC5jCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAotICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZAogICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cwogICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgogICoKQEAgLTgsMTAgKzgsMTAgQEAKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBQcm9mZXNzb3IgQmVub2l0IE1hY3EKICAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzLCBEYXZpZCBKYW5zc2VucwogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIFlhbm5pY2sgVmVyc2NodWVyZW4KLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eCAKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eAogICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQsIEFudG9uaW4gRGVzY2FtcGUKICAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQotICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGUiAKKyAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRlIKICAqIENvcHlyaWdodCAoYykgMjAxMiwgQ1MgU3lzdGVtZXMgZCdJbmZvcm1hdGlvbiwgRnJhbmNlCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKQEAgLTYyLDE0ICs2MiwxNCBAQAogLyogPC9zdW1tYXJ5PiAqLwogc3RhdGljIGNvbnN0IE9QSl9GTE9BVDY0IG9wal9tY3Rfbm9ybXNfcmVhbFszXSA9IHsgMS43MzIsIDEuODA1LCAxLjU3MyB9OwogCi1jb25zdCBPUEpfRkxPQVQ2NCAqIG9wal9tY3RfZ2V0X21jdF9ub3JtcyAoKQorY29uc3QgT1BKX0ZMT0FUNjQgKiBvcGpfbWN0X2dldF9tY3Rfbm9ybXMoKQogewotCXJldHVybiBvcGpfbWN0X25vcm1zOworICAgIHJldHVybiBvcGpfbWN0X25vcm1zOwogfQogCi1jb25zdCBPUEpfRkxPQVQ2NCAqIG9wal9tY3RfZ2V0X21jdF9ub3Jtc19yZWFsICgpCitjb25zdCBPUEpfRkxPQVQ2NCAqIG9wal9tY3RfZ2V0X21jdF9ub3Jtc19yZWFsKCkKIHsKLQlyZXR1cm4gb3BqX21jdF9ub3Jtc19yZWFsOworICAgIHJldHVybiBvcGpfbWN0X25vcm1zX3JlYWw7CiB9CiAKIC8qIDxzdW1tYXJ5PiAqLwpAQCAtNzcsNjMgKzc3LDY3IEBACiAvKiA8L3N1bW1hcnk+ICovCiAjaWZkZWYgVVNFX1NTRTIKIHZvaWQgb3BqX21jdF9lbmNvZGUoCi0JCU9QSl9JTlQzMiogcmVzdHJpY3QgYzAsCi0JCU9QSl9JTlQzMiogcmVzdHJpY3QgYzEsCi0JCU9QSl9JTlQzMiogcmVzdHJpY3QgYzIsCi0JCU9QSl9VSU5UMzIgbikKKyAgICBPUEpfSU5UMzIqIE9QSl9SRVNUUklDVCBjMCwKKyAgICBPUEpfSU5UMzIqIE9QSl9SRVNUUklDVCBjMSwKKyAgICBPUEpfSU5UMzIqIE9QSl9SRVNUUklDVCBjMiwKKyAgICBPUEpfU0laRV9UIG4pCiB7Ci0JT1BKX1NJWkVfVCBpOwotCWNvbnN0IE9QSl9TSVpFX1QgbGVuID0gbjsKLQkKLQlmb3IoaSA9IDA7IGkgPCAobGVuICYgfjNVKTsgaSArPSA0KSB7Ci0JCV9fbTEyOGkgeSwgdSwgdjsKLQkJX19tMTI4aSByID0gX21tX2xvYWRfc2kxMjgoKGNvbnN0IF9fbTEyOGkgKikmKGMwW2ldKSk7Ci0JCV9fbTEyOGkgZyA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpICopJihjMVtpXSkpOwotCQlfX20xMjhpIGIgPSBfbW1fbG9hZF9zaTEyOCgoY29uc3QgX19tMTI4aSAqKSYoYzJbaV0pKTsKLQkJeSA9IF9tbV9hZGRfZXBpMzIoZywgZyk7Ci0JCXkgPSBfbW1fYWRkX2VwaTMyKHksIGIpOwotCQl5ID0gX21tX2FkZF9lcGkzMih5LCByKTsKLQkJeSA9IF9tbV9zcmFpX2VwaTMyKHksIDIpOwotCQl1ID0gX21tX3N1Yl9lcGkzMihiLCBnKTsKLQkJdiA9IF9tbV9zdWJfZXBpMzIociwgZyk7Ci0JCV9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSAqKSYoYzBbaV0pLCB5KTsKLQkJX21tX3N0b3JlX3NpMTI4KChfX20xMjhpICopJihjMVtpXSksIHUpOwotCQlfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkgKikmKGMyW2ldKSwgdik7Ci0JfQotCQotCWZvcig7IGkgPCBsZW47ICsraSkgewotCQlPUEpfSU5UMzIgciA9IGMwW2ldOwotCQlPUEpfSU5UMzIgZyA9IGMxW2ldOwotCQlPUEpfSU5UMzIgYiA9IGMyW2ldOwotCQlPUEpfSU5UMzIgeSA9IChyICsgKGcgKiAyKSArIGIpID4+IDI7Ci0JCU9QSl9JTlQzMiB1ID0gYiAtIGc7Ci0JCU9QSl9JTlQzMiB2ID0gciAtIGc7Ci0JCWMwW2ldID0geTsKLQkJYzFbaV0gPSB1OwotCQljMltpXSA9IHY7Ci0JfQorICAgIE9QSl9TSVpFX1QgaTsKKyAgICBjb25zdCBPUEpfU0laRV9UIGxlbiA9IG47CisgICAgLyogYnVmZmVyIGFyZSBhbGlnbmVkIG9uIDE2IGJ5dGVzICovCisgICAgYXNzZXJ0KCgoc2l6ZV90KWMwICYgMHhmKSA9PSAwKTsKKyAgICBhc3NlcnQoKChzaXplX3QpYzEgJiAweGYpID09IDApOworICAgIGFzc2VydCgoKHNpemVfdCljMiAmIDB4ZikgPT0gMCk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgKGxlbiAmIH4zVSk7IGkgKz0gNCkgeworICAgICAgICBfX20xMjhpIHksIHUsIHY7CisgICAgICAgIF9fbTEyOGkgciA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpICopICYgKGMwW2ldKSk7CisgICAgICAgIF9fbTEyOGkgZyA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpICopICYgKGMxW2ldKSk7CisgICAgICAgIF9fbTEyOGkgYiA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpICopICYgKGMyW2ldKSk7CisgICAgICAgIHkgPSBfbW1fYWRkX2VwaTMyKGcsIGcpOworICAgICAgICB5ID0gX21tX2FkZF9lcGkzMih5LCBiKTsKKyAgICAgICAgeSA9IF9tbV9hZGRfZXBpMzIoeSwgcik7CisgICAgICAgIHkgPSBfbW1fc3JhaV9lcGkzMih5LCAyKTsKKyAgICAgICAgdSA9IF9tbV9zdWJfZXBpMzIoYiwgZyk7CisgICAgICAgIHYgPSBfbW1fc3ViX2VwaTMyKHIsIGcpOworICAgICAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkgKikgJiAoYzBbaV0pLCB5KTsKKyAgICAgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpICopICYgKGMxW2ldKSwgdSk7CisgICAgICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSAqKSAmIChjMltpXSksIHYpOworICAgIH0KKworICAgIGZvciAoOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgT1BKX0lOVDMyIHIgPSBjMFtpXTsKKyAgICAgICAgT1BKX0lOVDMyIGcgPSBjMVtpXTsKKyAgICAgICAgT1BKX0lOVDMyIGIgPSBjMltpXTsKKyAgICAgICAgT1BKX0lOVDMyIHkgPSAociArIChnICogMikgKyBiKSA+PiAyOworICAgICAgICBPUEpfSU5UMzIgdSA9IGIgLSBnOworICAgICAgICBPUEpfSU5UMzIgdiA9IHIgLSBnOworICAgICAgICBjMFtpXSA9IHk7CisgICAgICAgIGMxW2ldID0gdTsKKyAgICAgICAgYzJbaV0gPSB2OworICAgIH0KIH0KICNlbHNlCiB2b2lkIG9wal9tY3RfZW5jb2RlKAotCQlPUEpfSU5UMzIqIHJlc3RyaWN0IGMwLAotCQlPUEpfSU5UMzIqIHJlc3RyaWN0IGMxLAotCQlPUEpfSU5UMzIqIHJlc3RyaWN0IGMyLAotCQlPUEpfVUlOVDMyIG4pCisgICAgT1BKX0lOVDMyKiBPUEpfUkVTVFJJQ1QgYzAsCisgICAgT1BKX0lOVDMyKiBPUEpfUkVTVFJJQ1QgYzEsCisgICAgT1BKX0lOVDMyKiBPUEpfUkVTVFJJQ1QgYzIsCisgICAgT1BKX1NJWkVfVCBuKQogewotCU9QSl9TSVpFX1QgaTsKLQljb25zdCBPUEpfU0laRV9UIGxlbiA9IG47Ci0JCi0JZm9yKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKLQkJT1BKX0lOVDMyIHIgPSBjMFtpXTsKLQkJT1BKX0lOVDMyIGcgPSBjMVtpXTsKLQkJT1BKX0lOVDMyIGIgPSBjMltpXTsKLQkJT1BKX0lOVDMyIHkgPSAociArIChnICogMikgKyBiKSA+PiAyOwotCQlPUEpfSU5UMzIgdSA9IGIgLSBnOwotCQlPUEpfSU5UMzIgdiA9IHIgLSBnOwotCQljMFtpXSA9IHk7Ci0JCWMxW2ldID0gdTsKLQkJYzJbaV0gPSB2OwotCX0KKyAgICBPUEpfU0laRV9UIGk7CisgICAgY29uc3QgT1BKX1NJWkVfVCBsZW4gPSBuOworCisgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgIE9QSl9JTlQzMiByID0gYzBbaV07CisgICAgICAgIE9QSl9JTlQzMiBnID0gYzFbaV07CisgICAgICAgIE9QSl9JTlQzMiBiID0gYzJbaV07CisgICAgICAgIE9QSl9JTlQzMiB5ID0gKHIgKyAoZyAqIDIpICsgYikgPj4gMjsKKyAgICAgICAgT1BKX0lOVDMyIHUgPSBiIC0gZzsKKyAgICAgICAgT1BKX0lOVDMyIHYgPSByIC0gZzsKKyAgICAgICAgYzBbaV0gPSB5OworICAgICAgICBjMVtpXSA9IHU7CisgICAgICAgIGMyW2ldID0gdjsKKyAgICB9CiB9CiAjZW5kaWYKIApAQCAtMTQyLDY2ICsxNDYsNjcgQEAKIC8qIDwvc3VtbWFyeT4gKi8KICNpZmRlZiBVU0VfU1NFMgogdm9pZCBvcGpfbWN0X2RlY29kZSgKLQkJT1BKX0lOVDMyKiByZXN0cmljdCBjMCwKLQkJT1BKX0lOVDMyKiByZXN0cmljdCBjMSwKLQkJT1BKX0lOVDMyKiByZXN0cmljdCBjMiwKLQkJT1BKX1VJTlQzMiBuKQorICAgIE9QSl9JTlQzMiogT1BKX1JFU1RSSUNUIGMwLAorICAgIE9QSl9JTlQzMiogT1BKX1JFU1RSSUNUIGMxLAorICAgIE9QSl9JTlQzMiogT1BKX1JFU1RSSUNUIGMyLAorICAgIE9QSl9TSVpFX1QgbikKIHsKLQlPUEpfU0laRV9UIGk7Ci0JY29uc3QgT1BKX1NJWkVfVCBsZW4gPSBuOwotCQotCWZvcihpID0gMDsgaSA8IChsZW4gJiB+M1UpOyBpICs9IDQpIHsKLQkJX19tMTI4aSByLCBnLCBiOwotCQlfX20xMjhpIHkgPSBfbW1fbG9hZF9zaTEyOCgoY29uc3QgX19tMTI4aSAqKSYoYzBbaV0pKTsKLQkJX19tMTI4aSB1ID0gX21tX2xvYWRfc2kxMjgoKGNvbnN0IF9fbTEyOGkgKikmKGMxW2ldKSk7Ci0JCV9fbTEyOGkgdiA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpICopJihjMltpXSkpOwotCQlnID0geTsKLQkJZyA9IF9tbV9zdWJfZXBpMzIoZywgX21tX3NyYWlfZXBpMzIoX21tX2FkZF9lcGkzMih1LCB2KSwgMikpOwotCQlyID0gX21tX2FkZF9lcGkzMih2LCBnKTsKLQkJYiA9IF9tbV9hZGRfZXBpMzIodSwgZyk7Ci0JCV9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSAqKSYoYzBbaV0pLCByKTsKLQkJX21tX3N0b3JlX3NpMTI4KChfX20xMjhpICopJihjMVtpXSksIGcpOwotCQlfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkgKikmKGMyW2ldKSwgYik7Ci0JfQotCWZvciAoOyBpIDwgbGVuOyArK2kpIHsKLQkJT1BKX0lOVDMyIHkgPSBjMFtpXTsKLQkJT1BKX0lOVDMyIHUgPSBjMVtpXTsKLQkJT1BKX0lOVDMyIHYgPSBjMltpXTsKLQkJT1BKX0lOVDMyIGcgPSB5IC0gKCh1ICsgdikgPj4gMik7Ci0JCU9QSl9JTlQzMiByID0gdiArIGc7Ci0JCU9QSl9JTlQzMiBiID0gdSArIGc7Ci0JCWMwW2ldID0gcjsKLQkJYzFbaV0gPSBnOwotCQljMltpXSA9IGI7Ci0JfQorICAgIE9QSl9TSVpFX1QgaTsKKyAgICBjb25zdCBPUEpfU0laRV9UIGxlbiA9IG47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgKGxlbiAmIH4zVSk7IGkgKz0gNCkgeworICAgICAgICBfX20xMjhpIHIsIGcsIGI7CisgICAgICAgIF9fbTEyOGkgeSA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpICopICYgKGMwW2ldKSk7CisgICAgICAgIF9fbTEyOGkgdSA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpICopICYgKGMxW2ldKSk7CisgICAgICAgIF9fbTEyOGkgdiA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpICopICYgKGMyW2ldKSk7CisgICAgICAgIGcgPSB5OworICAgICAgICBnID0gX21tX3N1Yl9lcGkzMihnLCBfbW1fc3JhaV9lcGkzMihfbW1fYWRkX2VwaTMyKHUsIHYpLCAyKSk7CisgICAgICAgIHIgPSBfbW1fYWRkX2VwaTMyKHYsIGcpOworICAgICAgICBiID0gX21tX2FkZF9lcGkzMih1LCBnKTsKKyAgICAgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpICopICYgKGMwW2ldKSwgcik7CisgICAgICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSAqKSAmIChjMVtpXSksIGcpOworICAgICAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkgKikgJiAoYzJbaV0pLCBiKTsKKyAgICB9CisgICAgZm9yICg7IGkgPCBsZW47ICsraSkgeworICAgICAgICBPUEpfSU5UMzIgeSA9IGMwW2ldOworICAgICAgICBPUEpfSU5UMzIgdSA9IGMxW2ldOworICAgICAgICBPUEpfSU5UMzIgdiA9IGMyW2ldOworICAgICAgICBPUEpfSU5UMzIgZyA9IHkgLSAoKHUgKyB2KSA+PiAyKTsKKyAgICAgICAgT1BKX0lOVDMyIHIgPSB2ICsgZzsKKyAgICAgICAgT1BKX0lOVDMyIGIgPSB1ICsgZzsKKyAgICAgICAgYzBbaV0gPSByOworICAgICAgICBjMVtpXSA9IGc7CisgICAgICAgIGMyW2ldID0gYjsKKyAgICB9CiB9CiAjZWxzZQogdm9pZCBvcGpfbWN0X2RlY29kZSgKLQkJT1BKX0lOVDMyKiByZXN0cmljdCBjMCwKLQkJT1BKX0lOVDMyKiByZXN0cmljdCBjMSwgCi0JCU9QSl9JTlQzMiogcmVzdHJpY3QgYzIsIAotCQlPUEpfVUlOVDMyIG4pCisgICAgT1BKX0lOVDMyKiBPUEpfUkVTVFJJQ1QgYzAsCisgICAgT1BKX0lOVDMyKiBPUEpfUkVTVFJJQ1QgYzEsCisgICAgT1BKX0lOVDMyKiBPUEpfUkVTVFJJQ1QgYzIsCisgICAgT1BKX1NJWkVfVCBuKQogewotCU9QSl9VSU5UMzIgaTsKLQlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0JCU9QSl9JTlQzMiB5ID0gYzBbaV07Ci0JCU9QSl9JTlQzMiB1ID0gYzFbaV07Ci0JCU9QSl9JTlQzMiB2ID0gYzJbaV07Ci0JCU9QSl9JTlQzMiBnID0geSAtICgodSArIHYpID4+IDIpOwotCQlPUEpfSU5UMzIgciA9IHYgKyBnOwotCQlPUEpfSU5UMzIgYiA9IHUgKyBnOwotCQljMFtpXSA9IHI7Ci0JCWMxW2ldID0gZzsKLQkJYzJbaV0gPSBiOwotCX0KKyAgICBPUEpfVUlOVDMyIGk7CisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBPUEpfSU5UMzIgeSA9IGMwW2ldOworICAgICAgICBPUEpfSU5UMzIgdSA9IGMxW2ldOworICAgICAgICBPUEpfSU5UMzIgdiA9IGMyW2ldOworICAgICAgICBPUEpfSU5UMzIgZyA9IHkgLSAoKHUgKyB2KSA+PiAyKTsKKyAgICAgICAgT1BKX0lOVDMyIHIgPSB2ICsgZzsKKyAgICAgICAgT1BKX0lOVDMyIGIgPSB1ICsgZzsKKyAgICAgICAgYzBbaV0gPSByOworICAgICAgICBjMVtpXSA9IGc7CisgICAgICAgIGMyW2ldID0gYjsKKyAgICB9CiB9CiAjZW5kaWYKIAogLyogPHN1bW1hcnk+ICovCiAvKiBHZXQgbm9ybSBvZiBiYXNpcyBmdW5jdGlvbiBvZiByZXZlcnNpYmxlIE1DVC4gKi8KIC8qIDwvc3VtbWFyeT4gKi8KLU9QSl9GTE9BVDY0IG9wal9tY3RfZ2V0bm9ybShPUEpfVUlOVDMyIGNvbXBubykgewotCXJldHVybiBvcGpfbWN0X25vcm1zW2NvbXBub107CitPUEpfRkxPQVQ2NCBvcGpfbWN0X2dldG5vcm0oT1BKX1VJTlQzMiBjb21wbm8pCit7CisgICAgcmV0dXJuIG9wal9tY3Rfbm9ybXNbY29tcG5vXTsKIH0KIAogLyogPHN1bW1hcnk+ICovCkBAIC0yMDksMTY0ICsyMTQsMTcxIEBACiAvKiA8L3N1bW1hcnk+ICovCiAjaWZkZWYgVVNFX1NTRTQKIHZvaWQgb3BqX21jdF9lbmNvZGVfcmVhbCgKLQkJCQkJCQkJCQkJCSBPUEpfSU5UMzIqIHJlc3RyaWN0IGMwLAotCQkJCQkJCQkJCQkJIE9QSl9JTlQzMiogcmVzdHJpY3QgYzEsCi0JCQkJCQkJCQkJCQkgT1BKX0lOVDMyKiByZXN0cmljdCBjMiwKLQkJCQkJCQkJCQkJCSBPUEpfVUlOVDMyIG4pCisgICAgT1BKX0lOVDMyKiBPUEpfUkVTVFJJQ1QgYzAsCisgICAgT1BKX0lOVDMyKiBPUEpfUkVTVFJJQ1QgYzEsCisgICAgT1BKX0lOVDMyKiBPUEpfUkVTVFJJQ1QgYzIsCisgICAgT1BKX1NJWkVfVCBuKQogewotCU9QSl9TSVpFX1QgaTsKLQljb25zdCBPUEpfU0laRV9UIGxlbiA9IG47Ci0JCi0JY29uc3QgX19tMTI4aSByeSA9IF9tbV9zZXQxX2VwaTMyKDI0NDkpOwotCWNvbnN0IF9fbTEyOGkgZ3kgPSBfbW1fc2V0MV9lcGkzMig0ODA5KTsKLQljb25zdCBfX20xMjhpIGJ5ID0gX21tX3NldDFfZXBpMzIoOTM0KTsKLQljb25zdCBfX20xMjhpIHJ1ID0gX21tX3NldDFfZXBpMzIoMTM4Mik7Ci0JY29uc3QgX19tMTI4aSBndSA9IF9tbV9zZXQxX2VwaTMyKDI3MTQpOwotCS8qIGNvbnN0IF9fbTEyOGkgYnUgPSBfbW1fc2V0MV9lcGkzMig0MDk2KTsgKi8KLQkvKiBjb25zdCBfX20xMjhpIHJ2ID0gX21tX3NldDFfZXBpMzIoNDA5Nik7ICovCi0JY29uc3QgX19tMTI4aSBndiA9IF9tbV9zZXQxX2VwaTMyKDM0MzApOwotCWNvbnN0IF9fbTEyOGkgYnYgPSBfbW1fc2V0MV9lcGkzMig2NjYpOwotCWNvbnN0IF9fbTEyOGkgbXVscm91bmQgPSBfbW1fc2h1ZmZsZV9lcGkzMihfbW1fY3Z0c2kzMl9zaTEyOCg0MDk2KSwgX01NX1NIVUZGTEUoMSwgMCwgMSwgMCkpOwotCQotCWZvcihpID0gMDsgaSA8IChsZW4gJiB+M1UpOyBpICs9IDQpIHsKLQkJX19tMTI4aSBsbywgaGk7Ci0JCV9fbTEyOGkgeSwgdSwgdjsKLQkJX19tMTI4aSByID0gX21tX2xvYWRfc2kxMjgoKGNvbnN0IF9fbTEyOGkgKikmKGMwW2ldKSk7Ci0JCV9fbTEyOGkgZyA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpICopJihjMVtpXSkpOwotCQlfX20xMjhpIGIgPSBfbW1fbG9hZF9zaTEyOCgoY29uc3QgX19tMTI4aSAqKSYoYzJbaV0pKTsKLQkJCi0JCWxvID0gcjsKLQkJaGkgPSBfbW1fc2h1ZmZsZV9lcGkzMihyLCBfTU1fU0hVRkZMRSgzLCAzLCAxLCAxKSk7Ci0JCWxvID0gX21tX211bF9lcGkzMihsbywgcnkpOwotCQloaSA9IF9tbV9tdWxfZXBpMzIoaGksIHJ5KTsKLQkJbG8gPSBfbW1fYWRkX2VwaTY0KGxvLCBtdWxyb3VuZCk7Ci0JCWhpID0gX21tX2FkZF9lcGk2NChoaSwgbXVscm91bmQpOwotCQlsbyA9IF9tbV9zcmxpX2VwaTY0KGxvLCAxMyk7Ci0JCWhpID0gX21tX3NsbGlfZXBpNjQoaGksIDMyLTEzKTsKLQkJeSA9IF9tbV9ibGVuZF9lcGkxNihsbywgaGksIDB4Q0MpOwotCQkKLQkJbG8gPSBnOwotCQloaSA9IF9tbV9zaHVmZmxlX2VwaTMyKGcsIF9NTV9TSFVGRkxFKDMsIDMsIDEsIDEpKTsKLQkJbG8gPSBfbW1fbXVsX2VwaTMyKGxvLCBneSk7Ci0JCWhpID0gX21tX211bF9lcGkzMihoaSwgZ3kpOwotCQlsbyA9IF9tbV9hZGRfZXBpNjQobG8sIG11bHJvdW5kKTsKLQkJaGkgPSBfbW1fYWRkX2VwaTY0KGhpLCBtdWxyb3VuZCk7Ci0JCWxvID0gX21tX3NybGlfZXBpNjQobG8sIDEzKTsKLQkJaGkgPSBfbW1fc2xsaV9lcGk2NChoaSwgMzItMTMpOwotCQl5ID0gX21tX2FkZF9lcGkzMih5LCBfbW1fYmxlbmRfZXBpMTYobG8sIGhpLCAweENDKSk7Ci0JCQotCQlsbyA9IGI7Ci0JCWhpID0gX21tX3NodWZmbGVfZXBpMzIoYiwgX01NX1NIVUZGTEUoMywgMywgMSwgMSkpOwotCQlsbyA9IF9tbV9tdWxfZXBpMzIobG8sIGJ5KTsKLQkJaGkgPSBfbW1fbXVsX2VwaTMyKGhpLCBieSk7Ci0JCWxvID0gX21tX2FkZF9lcGk2NChsbywgbXVscm91bmQpOwotCQloaSA9IF9tbV9hZGRfZXBpNjQoaGksIG11bHJvdW5kKTsKLQkJbG8gPSBfbW1fc3JsaV9lcGk2NChsbywgMTMpOwotCQloaSA9IF9tbV9zbGxpX2VwaTY0KGhpLCAzMi0xMyk7Ci0JCXkgPSBfbW1fYWRkX2VwaTMyKHksIF9tbV9ibGVuZF9lcGkxNihsbywgaGksIDB4Q0MpKTsKLQkJX21tX3N0b3JlX3NpMTI4KChfX20xMjhpICopJihjMFtpXSksIHkpOwotCQkKLQkJLypsbyA9IGI7Ci0JCWhpID0gX21tX3NodWZmbGVfZXBpMzIoYiwgX01NX1NIVUZGTEUoMywgMywgMSwgMSkpOwotCQlsbyA9IF9tbV9tdWxfZXBpMzIobG8sIG11bHJvdW5kKTsKLQkJaGkgPSBfbW1fbXVsX2VwaTMyKGhpLCBtdWxyb3VuZCk7Ki8KLQkJbG8gPSBfbW1fY3Z0ZXBpMzJfZXBpNjQoX21tX3NodWZmbGVfZXBpMzIoYiwgX01NX1NIVUZGTEUoMywgMiwgMiwgMCkpKTsKLQkJaGkgPSBfbW1fY3Z0ZXBpMzJfZXBpNjQoX21tX3NodWZmbGVfZXBpMzIoYiwgX01NX1NIVUZGTEUoMywgMiwgMywgMSkpKTsKLQkJbG8gPSBfbW1fc2xsaV9lcGk2NChsbywgMTIpOwotCQloaSA9IF9tbV9zbGxpX2VwaTY0KGhpLCAxMik7Ci0JCWxvID0gX21tX2FkZF9lcGk2NChsbywgbXVscm91bmQpOwotCQloaSA9IF9tbV9hZGRfZXBpNjQoaGksIG11bHJvdW5kKTsKLQkJbG8gPSBfbW1fc3JsaV9lcGk2NChsbywgMTMpOwotCQloaSA9IF9tbV9zbGxpX2VwaTY0KGhpLCAzMi0xMyk7Ci0JCXUgPSBfbW1fYmxlbmRfZXBpMTYobG8sIGhpLCAweENDKTsKLQkJCi0JCWxvID0gcjsKLQkJaGkgPSBfbW1fc2h1ZmZsZV9lcGkzMihyLCBfTU1fU0hVRkZMRSgzLCAzLCAxLCAxKSk7Ci0JCWxvID0gX21tX211bF9lcGkzMihsbywgcnUpOwotCQloaSA9IF9tbV9tdWxfZXBpMzIoaGksIHJ1KTsKLQkJbG8gPSBfbW1fYWRkX2VwaTY0KGxvLCBtdWxyb3VuZCk7Ci0JCWhpID0gX21tX2FkZF9lcGk2NChoaSwgbXVscm91bmQpOwotCQlsbyA9IF9tbV9zcmxpX2VwaTY0KGxvLCAxMyk7Ci0JCWhpID0gX21tX3NsbGlfZXBpNjQoaGksIDMyLTEzKTsKLQkJdSA9IF9tbV9zdWJfZXBpMzIodSwgX21tX2JsZW5kX2VwaTE2KGxvLCBoaSwgMHhDQykpOwotCQkKLQkJbG8gPSBnOwotCQloaSA9IF9tbV9zaHVmZmxlX2VwaTMyKGcsIF9NTV9TSFVGRkxFKDMsIDMsIDEsIDEpKTsKLQkJbG8gPSBfbW1fbXVsX2VwaTMyKGxvLCBndSk7Ci0JCWhpID0gX21tX211bF9lcGkzMihoaSwgZ3UpOwotCQlsbyA9IF9tbV9hZGRfZXBpNjQobG8sIG11bHJvdW5kKTsKLQkJaGkgPSBfbW1fYWRkX2VwaTY0KGhpLCBtdWxyb3VuZCk7Ci0JCWxvID0gX21tX3NybGlfZXBpNjQobG8sIDEzKTsKLQkJaGkgPSBfbW1fc2xsaV9lcGk2NChoaSwgMzItMTMpOwotCQl1ID0gX21tX3N1Yl9lcGkzMih1LCBfbW1fYmxlbmRfZXBpMTYobG8sIGhpLCAweENDKSk7Ci0JCV9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSAqKSYoYzFbaV0pLCB1KTsKLQkJCi0JCS8qbG8gPSByOwotCQloaSA9IF9tbV9zaHVmZmxlX2VwaTMyKHIsIF9NTV9TSFVGRkxFKDMsIDMsIDEsIDEpKTsKLQkJbG8gPSBfbW1fbXVsX2VwaTMyKGxvLCBtdWxyb3VuZCk7Ci0JCWhpID0gX21tX211bF9lcGkzMihoaSwgbXVscm91bmQpOyovCi0JCWxvID0gX21tX2N2dGVwaTMyX2VwaTY0KF9tbV9zaHVmZmxlX2VwaTMyKHIsIF9NTV9TSFVGRkxFKDMsIDIsIDIsIDApKSk7Ci0JCWhpID0gX21tX2N2dGVwaTMyX2VwaTY0KF9tbV9zaHVmZmxlX2VwaTMyKHIsIF9NTV9TSFVGRkxFKDMsIDIsIDMsIDEpKSk7Ci0JCWxvID0gX21tX3NsbGlfZXBpNjQobG8sIDEyKTsKLQkJaGkgPSBfbW1fc2xsaV9lcGk2NChoaSwgMTIpOwotCQlsbyA9IF9tbV9hZGRfZXBpNjQobG8sIG11bHJvdW5kKTsKLQkJaGkgPSBfbW1fYWRkX2VwaTY0KGhpLCBtdWxyb3VuZCk7Ci0JCWxvID0gX21tX3NybGlfZXBpNjQobG8sIDEzKTsKLQkJaGkgPSBfbW1fc2xsaV9lcGk2NChoaSwgMzItMTMpOwotCQl2ID0gX21tX2JsZW5kX2VwaTE2KGxvLCBoaSwgMHhDQyk7Ci0JCQotCQlsbyA9IGc7Ci0JCWhpID0gX21tX3NodWZmbGVfZXBpMzIoZywgX01NX1NIVUZGTEUoMywgMywgMSwgMSkpOwotCQlsbyA9IF9tbV9tdWxfZXBpMzIobG8sIGd2KTsKLQkJaGkgPSBfbW1fbXVsX2VwaTMyKGhpLCBndik7Ci0JCWxvID0gX21tX2FkZF9lcGk2NChsbywgbXVscm91bmQpOwotCQloaSA9IF9tbV9hZGRfZXBpNjQoaGksIG11bHJvdW5kKTsKLQkJbG8gPSBfbW1fc3JsaV9lcGk2NChsbywgMTMpOwotCQloaSA9IF9tbV9zbGxpX2VwaTY0KGhpLCAzMi0xMyk7Ci0JCXYgPSBfbW1fc3ViX2VwaTMyKHYsIF9tbV9ibGVuZF9lcGkxNihsbywgaGksIDB4Q0MpKTsKLQkJCi0JCWxvID0gYjsKLQkJaGkgPSBfbW1fc2h1ZmZsZV9lcGkzMihiLCBfTU1fU0hVRkZMRSgzLCAzLCAxLCAxKSk7Ci0JCWxvID0gX21tX211bF9lcGkzMihsbywgYnYpOwotCQloaSA9IF9tbV9tdWxfZXBpMzIoaGksIGJ2KTsKLQkJbG8gPSBfbW1fYWRkX2VwaTY0KGxvLCBtdWxyb3VuZCk7Ci0JCWhpID0gX21tX2FkZF9lcGk2NChoaSwgbXVscm91bmQpOwotCQlsbyA9IF9tbV9zcmxpX2VwaTY0KGxvLCAxMyk7Ci0JCWhpID0gX21tX3NsbGlfZXBpNjQoaGksIDMyLTEzKTsKLQkJdiA9IF9tbV9zdWJfZXBpMzIodiwgX21tX2JsZW5kX2VwaTE2KGxvLCBoaSwgMHhDQykpOwotCQlfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkgKikmKGMyW2ldKSwgdik7Ci0JfQotCWZvcig7IGkgPCBsZW47ICsraSkgewotCQlPUEpfSU5UMzIgciA9IGMwW2ldOwotCQlPUEpfSU5UMzIgZyA9IGMxW2ldOwotCQlPUEpfSU5UMzIgYiA9IGMyW2ldOwotCQlPUEpfSU5UMzIgeSA9ICBvcGpfaW50X2ZpeF9tdWwociwgMjQ0OSkgKyBvcGpfaW50X2ZpeF9tdWwoZywgNDgwOSkgKyBvcGpfaW50X2ZpeF9tdWwoYiwgOTM0KTsKLQkJT1BKX0lOVDMyIHUgPSAtb3BqX2ludF9maXhfbXVsKHIsIDEzODIpIC0gb3BqX2ludF9maXhfbXVsKGcsIDI3MTQpICsgb3BqX2ludF9maXhfbXVsKGIsIDQwOTYpOwotCQlPUEpfSU5UMzIgdiA9ICBvcGpfaW50X2ZpeF9tdWwociwgNDA5NikgLSBvcGpfaW50X2ZpeF9tdWwoZywgMzQzMCkgLSBvcGpfaW50X2ZpeF9tdWwoYiwgNjY2KTsKLQkJYzBbaV0gPSB5OwotCQljMVtpXSA9IHU7Ci0JCWMyW2ldID0gdjsKLQl9CisgICAgT1BKX1NJWkVfVCBpOworICAgIGNvbnN0IE9QSl9TSVpFX1QgbGVuID0gbjsKKworICAgIGNvbnN0IF9fbTEyOGkgcnkgPSBfbW1fc2V0MV9lcGkzMigyNDQ5KTsKKyAgICBjb25zdCBfX20xMjhpIGd5ID0gX21tX3NldDFfZXBpMzIoNDgwOSk7CisgICAgY29uc3QgX19tMTI4aSBieSA9IF9tbV9zZXQxX2VwaTMyKDkzNCk7CisgICAgY29uc3QgX19tMTI4aSBydSA9IF9tbV9zZXQxX2VwaTMyKDEzODIpOworICAgIGNvbnN0IF9fbTEyOGkgZ3UgPSBfbW1fc2V0MV9lcGkzMigyNzE0KTsKKyAgICAvKiBjb25zdCBfX20xMjhpIGJ1ID0gX21tX3NldDFfZXBpMzIoNDA5Nik7ICovCisgICAgLyogY29uc3QgX19tMTI4aSBydiA9IF9tbV9zZXQxX2VwaTMyKDQwOTYpOyAqLworICAgIGNvbnN0IF9fbTEyOGkgZ3YgPSBfbW1fc2V0MV9lcGkzMigzNDMwKTsKKyAgICBjb25zdCBfX20xMjhpIGJ2ID0gX21tX3NldDFfZXBpMzIoNjY2KTsKKyAgICBjb25zdCBfX20xMjhpIG11bHJvdW5kID0gX21tX3NodWZmbGVfZXBpMzIoX21tX2N2dHNpMzJfc2kxMjgoNDA5NiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9NTV9TSFVGRkxFKDEsIDAsIDEsIDApKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAobGVuICYgfjNVKTsgaSArPSA0KSB7CisgICAgICAgIF9fbTEyOGkgbG8sIGhpOworICAgICAgICBfX20xMjhpIHksIHUsIHY7CisgICAgICAgIF9fbTEyOGkgciA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpICopICYgKGMwW2ldKSk7CisgICAgICAgIF9fbTEyOGkgZyA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpICopICYgKGMxW2ldKSk7CisgICAgICAgIF9fbTEyOGkgYiA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpICopICYgKGMyW2ldKSk7CisKKyAgICAgICAgbG8gPSByOworICAgICAgICBoaSA9IF9tbV9zaHVmZmxlX2VwaTMyKHIsIF9NTV9TSFVGRkxFKDMsIDMsIDEsIDEpKTsKKyAgICAgICAgbG8gPSBfbW1fbXVsX2VwaTMyKGxvLCByeSk7CisgICAgICAgIGhpID0gX21tX211bF9lcGkzMihoaSwgcnkpOworICAgICAgICBsbyA9IF9tbV9hZGRfZXBpNjQobG8sIG11bHJvdW5kKTsKKyAgICAgICAgaGkgPSBfbW1fYWRkX2VwaTY0KGhpLCBtdWxyb3VuZCk7CisgICAgICAgIGxvID0gX21tX3NybGlfZXBpNjQobG8sIDEzKTsKKyAgICAgICAgaGkgPSBfbW1fc2xsaV9lcGk2NChoaSwgMzIgLSAxMyk7CisgICAgICAgIHkgPSBfbW1fYmxlbmRfZXBpMTYobG8sIGhpLCAweENDKTsKKworICAgICAgICBsbyA9IGc7CisgICAgICAgIGhpID0gX21tX3NodWZmbGVfZXBpMzIoZywgX01NX1NIVUZGTEUoMywgMywgMSwgMSkpOworICAgICAgICBsbyA9IF9tbV9tdWxfZXBpMzIobG8sIGd5KTsKKyAgICAgICAgaGkgPSBfbW1fbXVsX2VwaTMyKGhpLCBneSk7CisgICAgICAgIGxvID0gX21tX2FkZF9lcGk2NChsbywgbXVscm91bmQpOworICAgICAgICBoaSA9IF9tbV9hZGRfZXBpNjQoaGksIG11bHJvdW5kKTsKKyAgICAgICAgbG8gPSBfbW1fc3JsaV9lcGk2NChsbywgMTMpOworICAgICAgICBoaSA9IF9tbV9zbGxpX2VwaTY0KGhpLCAzMiAtIDEzKTsKKyAgICAgICAgeSA9IF9tbV9hZGRfZXBpMzIoeSwgX21tX2JsZW5kX2VwaTE2KGxvLCBoaSwgMHhDQykpOworCisgICAgICAgIGxvID0gYjsKKyAgICAgICAgaGkgPSBfbW1fc2h1ZmZsZV9lcGkzMihiLCBfTU1fU0hVRkZMRSgzLCAzLCAxLCAxKSk7CisgICAgICAgIGxvID0gX21tX211bF9lcGkzMihsbywgYnkpOworICAgICAgICBoaSA9IF9tbV9tdWxfZXBpMzIoaGksIGJ5KTsKKyAgICAgICAgbG8gPSBfbW1fYWRkX2VwaTY0KGxvLCBtdWxyb3VuZCk7CisgICAgICAgIGhpID0gX21tX2FkZF9lcGk2NChoaSwgbXVscm91bmQpOworICAgICAgICBsbyA9IF9tbV9zcmxpX2VwaTY0KGxvLCAxMyk7CisgICAgICAgIGhpID0gX21tX3NsbGlfZXBpNjQoaGksIDMyIC0gMTMpOworICAgICAgICB5ID0gX21tX2FkZF9lcGkzMih5LCBfbW1fYmxlbmRfZXBpMTYobG8sIGhpLCAweENDKSk7CisgICAgICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSAqKSAmIChjMFtpXSksIHkpOworCisgICAgICAgIC8qbG8gPSBiOworICAgICAgICBoaSA9IF9tbV9zaHVmZmxlX2VwaTMyKGIsIF9NTV9TSFVGRkxFKDMsIDMsIDEsIDEpKTsKKyAgICAgICAgbG8gPSBfbW1fbXVsX2VwaTMyKGxvLCBtdWxyb3VuZCk7CisgICAgICAgIGhpID0gX21tX211bF9lcGkzMihoaSwgbXVscm91bmQpOyovCisgICAgICAgIGxvID0gX21tX2N2dGVwaTMyX2VwaTY0KF9tbV9zaHVmZmxlX2VwaTMyKGIsIF9NTV9TSFVGRkxFKDMsIDIsIDIsIDApKSk7CisgICAgICAgIGhpID0gX21tX2N2dGVwaTMyX2VwaTY0KF9tbV9zaHVmZmxlX2VwaTMyKGIsIF9NTV9TSFVGRkxFKDMsIDIsIDMsIDEpKSk7CisgICAgICAgIGxvID0gX21tX3NsbGlfZXBpNjQobG8sIDEyKTsKKyAgICAgICAgaGkgPSBfbW1fc2xsaV9lcGk2NChoaSwgMTIpOworICAgICAgICBsbyA9IF9tbV9hZGRfZXBpNjQobG8sIG11bHJvdW5kKTsKKyAgICAgICAgaGkgPSBfbW1fYWRkX2VwaTY0KGhpLCBtdWxyb3VuZCk7CisgICAgICAgIGxvID0gX21tX3NybGlfZXBpNjQobG8sIDEzKTsKKyAgICAgICAgaGkgPSBfbW1fc2xsaV9lcGk2NChoaSwgMzIgLSAxMyk7CisgICAgICAgIHUgPSBfbW1fYmxlbmRfZXBpMTYobG8sIGhpLCAweENDKTsKKworICAgICAgICBsbyA9IHI7CisgICAgICAgIGhpID0gX21tX3NodWZmbGVfZXBpMzIociwgX01NX1NIVUZGTEUoMywgMywgMSwgMSkpOworICAgICAgICBsbyA9IF9tbV9tdWxfZXBpMzIobG8sIHJ1KTsKKyAgICAgICAgaGkgPSBfbW1fbXVsX2VwaTMyKGhpLCBydSk7CisgICAgICAgIGxvID0gX21tX2FkZF9lcGk2NChsbywgbXVscm91bmQpOworICAgICAgICBoaSA9IF9tbV9hZGRfZXBpNjQoaGksIG11bHJvdW5kKTsKKyAgICAgICAgbG8gPSBfbW1fc3JsaV9lcGk2NChsbywgMTMpOworICAgICAgICBoaSA9IF9tbV9zbGxpX2VwaTY0KGhpLCAzMiAtIDEzKTsKKyAgICAgICAgdSA9IF9tbV9zdWJfZXBpMzIodSwgX21tX2JsZW5kX2VwaTE2KGxvLCBoaSwgMHhDQykpOworCisgICAgICAgIGxvID0gZzsKKyAgICAgICAgaGkgPSBfbW1fc2h1ZmZsZV9lcGkzMihnLCBfTU1fU0hVRkZMRSgzLCAzLCAxLCAxKSk7CisgICAgICAgIGxvID0gX21tX211bF9lcGkzMihsbywgZ3UpOworICAgICAgICBoaSA9IF9tbV9tdWxfZXBpMzIoaGksIGd1KTsKKyAgICAgICAgbG8gPSBfbW1fYWRkX2VwaTY0KGxvLCBtdWxyb3VuZCk7CisgICAgICAgIGhpID0gX21tX2FkZF9lcGk2NChoaSwgbXVscm91bmQpOworICAgICAgICBsbyA9IF9tbV9zcmxpX2VwaTY0KGxvLCAxMyk7CisgICAgICAgIGhpID0gX21tX3NsbGlfZXBpNjQoaGksIDMyIC0gMTMpOworICAgICAgICB1ID0gX21tX3N1Yl9lcGkzMih1LCBfbW1fYmxlbmRfZXBpMTYobG8sIGhpLCAweENDKSk7CisgICAgICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSAqKSAmIChjMVtpXSksIHUpOworCisgICAgICAgIC8qbG8gPSByOworICAgICAgICBoaSA9IF9tbV9zaHVmZmxlX2VwaTMyKHIsIF9NTV9TSFVGRkxFKDMsIDMsIDEsIDEpKTsKKyAgICAgICAgbG8gPSBfbW1fbXVsX2VwaTMyKGxvLCBtdWxyb3VuZCk7CisgICAgICAgIGhpID0gX21tX211bF9lcGkzMihoaSwgbXVscm91bmQpOyovCisgICAgICAgIGxvID0gX21tX2N2dGVwaTMyX2VwaTY0KF9tbV9zaHVmZmxlX2VwaTMyKHIsIF9NTV9TSFVGRkxFKDMsIDIsIDIsIDApKSk7CisgICAgICAgIGhpID0gX21tX2N2dGVwaTMyX2VwaTY0KF9tbV9zaHVmZmxlX2VwaTMyKHIsIF9NTV9TSFVGRkxFKDMsIDIsIDMsIDEpKSk7CisgICAgICAgIGxvID0gX21tX3NsbGlfZXBpNjQobG8sIDEyKTsKKyAgICAgICAgaGkgPSBfbW1fc2xsaV9lcGk2NChoaSwgMTIpOworICAgICAgICBsbyA9IF9tbV9hZGRfZXBpNjQobG8sIG11bHJvdW5kKTsKKyAgICAgICAgaGkgPSBfbW1fYWRkX2VwaTY0KGhpLCBtdWxyb3VuZCk7CisgICAgICAgIGxvID0gX21tX3NybGlfZXBpNjQobG8sIDEzKTsKKyAgICAgICAgaGkgPSBfbW1fc2xsaV9lcGk2NChoaSwgMzIgLSAxMyk7CisgICAgICAgIHYgPSBfbW1fYmxlbmRfZXBpMTYobG8sIGhpLCAweENDKTsKKworICAgICAgICBsbyA9IGc7CisgICAgICAgIGhpID0gX21tX3NodWZmbGVfZXBpMzIoZywgX01NX1NIVUZGTEUoMywgMywgMSwgMSkpOworICAgICAgICBsbyA9IF9tbV9tdWxfZXBpMzIobG8sIGd2KTsKKyAgICAgICAgaGkgPSBfbW1fbXVsX2VwaTMyKGhpLCBndik7CisgICAgICAgIGxvID0gX21tX2FkZF9lcGk2NChsbywgbXVscm91bmQpOworICAgICAgICBoaSA9IF9tbV9hZGRfZXBpNjQoaGksIG11bHJvdW5kKTsKKyAgICAgICAgbG8gPSBfbW1fc3JsaV9lcGk2NChsbywgMTMpOworICAgICAgICBoaSA9IF9tbV9zbGxpX2VwaTY0KGhpLCAzMiAtIDEzKTsKKyAgICAgICAgdiA9IF9tbV9zdWJfZXBpMzIodiwgX21tX2JsZW5kX2VwaTE2KGxvLCBoaSwgMHhDQykpOworCisgICAgICAgIGxvID0gYjsKKyAgICAgICAgaGkgPSBfbW1fc2h1ZmZsZV9lcGkzMihiLCBfTU1fU0hVRkZMRSgzLCAzLCAxLCAxKSk7CisgICAgICAgIGxvID0gX21tX211bF9lcGkzMihsbywgYnYpOworICAgICAgICBoaSA9IF9tbV9tdWxfZXBpMzIoaGksIGJ2KTsKKyAgICAgICAgbG8gPSBfbW1fYWRkX2VwaTY0KGxvLCBtdWxyb3VuZCk7CisgICAgICAgIGhpID0gX21tX2FkZF9lcGk2NChoaSwgbXVscm91bmQpOworICAgICAgICBsbyA9IF9tbV9zcmxpX2VwaTY0KGxvLCAxMyk7CisgICAgICAgIGhpID0gX21tX3NsbGlfZXBpNjQoaGksIDMyIC0gMTMpOworICAgICAgICB2ID0gX21tX3N1Yl9lcGkzMih2LCBfbW1fYmxlbmRfZXBpMTYobG8sIGhpLCAweENDKSk7CisgICAgICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSAqKSAmIChjMltpXSksIHYpOworICAgIH0KKyAgICBmb3IgKDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgIE9QSl9JTlQzMiByID0gYzBbaV07CisgICAgICAgIE9QSl9JTlQzMiBnID0gYzFbaV07CisgICAgICAgIE9QSl9JTlQzMiBiID0gYzJbaV07CisgICAgICAgIE9QSl9JTlQzMiB5ID0gIG9wal9pbnRfZml4X211bChyLCAyNDQ5KSArIG9wal9pbnRfZml4X211bChnLAorICAgICAgICAgICAgICAgICAgICAgICA0ODA5KSArIG9wal9pbnRfZml4X211bChiLCA5MzQpOworICAgICAgICBPUEpfSU5UMzIgdSA9IC1vcGpfaW50X2ZpeF9tdWwociwgMTM4MikgLSBvcGpfaW50X2ZpeF9tdWwoZywKKyAgICAgICAgICAgICAgICAgICAgICAyNzE0KSArIG9wal9pbnRfZml4X211bChiLCA0MDk2KTsKKyAgICAgICAgT1BKX0lOVDMyIHYgPSAgb3BqX2ludF9maXhfbXVsKHIsIDQwOTYpIC0gb3BqX2ludF9maXhfbXVsKGcsCisgICAgICAgICAgICAgICAgICAgICAgIDM0MzApIC0gb3BqX2ludF9maXhfbXVsKGIsIDY2Nik7CisgICAgICAgIGMwW2ldID0geTsKKyAgICAgICAgYzFbaV0gPSB1OworICAgICAgICBjMltpXSA9IHY7CisgICAgfQogfQogI2Vsc2UKIHZvaWQgb3BqX21jdF9lbmNvZGVfcmVhbCgKLQkJT1BKX0lOVDMyKiByZXN0cmljdCBjMCwKLQkJT1BKX0lOVDMyKiByZXN0cmljdCBjMSwKLQkJT1BKX0lOVDMyKiByZXN0cmljdCBjMiwKLQkJT1BKX1VJTlQzMiBuKQorICAgIE9QSl9JTlQzMiogT1BKX1JFU1RSSUNUIGMwLAorICAgIE9QSl9JTlQzMiogT1BKX1JFU1RSSUNUIGMxLAorICAgIE9QSl9JTlQzMiogT1BKX1JFU1RSSUNUIGMyLAorICAgIE9QSl9TSVpFX1QgbikKIHsKLQlPUEpfVUlOVDMyIGk7Ci0JZm9yKGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0JCU9QSl9JTlQzMiByID0gYzBbaV07Ci0JCU9QSl9JTlQzMiBnID0gYzFbaV07Ci0JCU9QSl9JTlQzMiBiID0gYzJbaV07Ci0JCU9QSl9JTlQzMiB5ID0gIG9wal9pbnRfZml4X211bChyLCAyNDQ5KSArIG9wal9pbnRfZml4X211bChnLCA0ODA5KSArIG9wal9pbnRfZml4X211bChiLCA5MzQpOwotCQlPUEpfSU5UMzIgdSA9IC1vcGpfaW50X2ZpeF9tdWwociwgMTM4MikgLSBvcGpfaW50X2ZpeF9tdWwoZywgMjcxNCkgKyBvcGpfaW50X2ZpeF9tdWwoYiwgNDA5Nik7Ci0JCU9QSl9JTlQzMiB2ID0gIG9wal9pbnRfZml4X211bChyLCA0MDk2KSAtIG9wal9pbnRfZml4X211bChnLCAzNDMwKSAtIG9wal9pbnRfZml4X211bChiLCA2NjYpOwotCQljMFtpXSA9IHk7Ci0JCWMxW2ldID0gdTsKLQkJYzJbaV0gPSB2OwotCX0KKyAgICBPUEpfVUlOVDMyIGk7CisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBPUEpfSU5UMzIgciA9IGMwW2ldOworICAgICAgICBPUEpfSU5UMzIgZyA9IGMxW2ldOworICAgICAgICBPUEpfSU5UMzIgYiA9IGMyW2ldOworICAgICAgICBPUEpfSU5UMzIgeSA9ICBvcGpfaW50X2ZpeF9tdWwociwgMjQ0OSkgKyBvcGpfaW50X2ZpeF9tdWwoZywKKyAgICAgICAgICAgICAgICAgICAgICAgNDgwOSkgKyBvcGpfaW50X2ZpeF9tdWwoYiwgOTM0KTsKKyAgICAgICAgT1BKX0lOVDMyIHUgPSAtb3BqX2ludF9maXhfbXVsKHIsIDEzODIpIC0gb3BqX2ludF9maXhfbXVsKGcsCisgICAgICAgICAgICAgICAgICAgICAgMjcxNCkgKyBvcGpfaW50X2ZpeF9tdWwoYiwgNDA5Nik7CisgICAgICAgIE9QSl9JTlQzMiB2ID0gIG9wal9pbnRfZml4X211bChyLCA0MDk2KSAtIG9wal9pbnRfZml4X211bChnLAorICAgICAgICAgICAgICAgICAgICAgICAzNDMwKSAtIG9wal9pbnRfZml4X211bChiLCA2NjYpOworICAgICAgICBjMFtpXSA9IHk7CisgICAgICAgIGMxW2ldID0gdTsKKyAgICAgICAgYzJbaV0gPSB2OworICAgIH0KIH0KICNlbmRpZgogCkBAIC0zNzQsMTgzICszODYsMTg1IEBACiAvKiBJbnZlcnNlIGlycmV2ZXJzaWJsZSBNQ1QuICovCiAvKiA8L3N1bW1hcnk+ICovCiB2b2lkIG9wal9tY3RfZGVjb2RlX3JlYWwoCi0JCU9QSl9GTE9BVDMyKiByZXN0cmljdCBjMCwKLQkJT1BKX0ZMT0FUMzIqIHJlc3RyaWN0IGMxLAotCQlPUEpfRkxPQVQzMiogcmVzdHJpY3QgYzIsCi0JCU9QSl9VSU5UMzIgbikKKyAgICBPUEpfRkxPQVQzMiogT1BKX1JFU1RSSUNUIGMwLAorICAgIE9QSl9GTE9BVDMyKiBPUEpfUkVTVFJJQ1QgYzEsCisgICAgT1BKX0ZMT0FUMzIqIE9QSl9SRVNUUklDVCBjMiwKKyAgICBPUEpfU0laRV9UIG4pCiB7Ci0JT1BKX1VJTlQzMiBpOworICAgIE9QSl9VSU5UMzIgaTsKICNpZmRlZiBVU0VfU1NFCi0JX19tMTI4IHZydiwgdmd1LCB2Z3YsIHZidTsKLQl2cnYgPSBfbW1fc2V0MV9wcygxLjQwMmYpOwotCXZndSA9IF9tbV9zZXQxX3BzKDAuMzQ0MTNmKTsKLQl2Z3YgPSBfbW1fc2V0MV9wcygwLjcxNDE0Zik7Ci0JdmJ1ID0gX21tX3NldDFfcHMoMS43NzJmKTsKLQlmb3IgKGkgPSAwOyBpIDwgKG4gPj4gMyk7ICsraSkgewotCQlfX20xMjggdnksIHZ1LCB2djsKLQkJX19tMTI4IHZyLCB2ZywgdmI7CisgICAgX19tMTI4IHZydiwgdmd1LCB2Z3YsIHZidTsKKyAgICB2cnYgPSBfbW1fc2V0MV9wcygxLjQwMmYpOworICAgIHZndSA9IF9tbV9zZXQxX3BzKDAuMzQ0MTNmKTsKKyAgICB2Z3YgPSBfbW1fc2V0MV9wcygwLjcxNDE0Zik7CisgICAgdmJ1ID0gX21tX3NldDFfcHMoMS43NzJmKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKG4gPj4gMyk7ICsraSkgeworICAgICAgICBfX20xMjggdnksIHZ1LCB2djsKKyAgICAgICAgX19tMTI4IHZyLCB2ZywgdmI7CiAKLQkJdnkgPSBfbW1fbG9hZF9wcyhjMCk7Ci0JCXZ1ID0gX21tX2xvYWRfcHMoYzEpOwotCQl2diA9IF9tbV9sb2FkX3BzKGMyKTsKLQkJdnIgPSBfbW1fYWRkX3BzKHZ5LCBfbW1fbXVsX3BzKHZ2LCB2cnYpKTsKLQkJdmcgPSBfbW1fc3ViX3BzKF9tbV9zdWJfcHModnksIF9tbV9tdWxfcHModnUsIHZndSkpLCBfbW1fbXVsX3BzKHZ2LCB2Z3YpKTsKLQkJdmIgPSBfbW1fYWRkX3BzKHZ5LCBfbW1fbXVsX3BzKHZ1LCB2YnUpKTsKLQkJX21tX3N0b3JlX3BzKGMwLCB2cik7Ci0JCV9tbV9zdG9yZV9wcyhjMSwgdmcpOwotCQlfbW1fc3RvcmVfcHMoYzIsIHZiKTsKLQkJYzAgKz0gNDsKLQkJYzEgKz0gNDsKLQkJYzIgKz0gNDsKKyAgICAgICAgdnkgPSBfbW1fbG9hZF9wcyhjMCk7CisgICAgICAgIHZ1ID0gX21tX2xvYWRfcHMoYzEpOworICAgICAgICB2diA9IF9tbV9sb2FkX3BzKGMyKTsKKyAgICAgICAgdnIgPSBfbW1fYWRkX3BzKHZ5LCBfbW1fbXVsX3BzKHZ2LCB2cnYpKTsKKyAgICAgICAgdmcgPSBfbW1fc3ViX3BzKF9tbV9zdWJfcHModnksIF9tbV9tdWxfcHModnUsIHZndSkpLCBfbW1fbXVsX3BzKHZ2LCB2Z3YpKTsKKyAgICAgICAgdmIgPSBfbW1fYWRkX3BzKHZ5LCBfbW1fbXVsX3BzKHZ1LCB2YnUpKTsKKyAgICAgICAgX21tX3N0b3JlX3BzKGMwLCB2cik7CisgICAgICAgIF9tbV9zdG9yZV9wcyhjMSwgdmcpOworICAgICAgICBfbW1fc3RvcmVfcHMoYzIsIHZiKTsKKyAgICAgICAgYzAgKz0gNDsKKyAgICAgICAgYzEgKz0gNDsKKyAgICAgICAgYzIgKz0gNDsKIAotCQl2eSA9IF9tbV9sb2FkX3BzKGMwKTsKLQkJdnUgPSBfbW1fbG9hZF9wcyhjMSk7Ci0JCXZ2ID0gX21tX2xvYWRfcHMoYzIpOwotCQl2ciA9IF9tbV9hZGRfcHModnksIF9tbV9tdWxfcHModnYsIHZydikpOwotCQl2ZyA9IF9tbV9zdWJfcHMoX21tX3N1Yl9wcyh2eSwgX21tX211bF9wcyh2dSwgdmd1KSksIF9tbV9tdWxfcHModnYsIHZndikpOwotCQl2YiA9IF9tbV9hZGRfcHModnksIF9tbV9tdWxfcHModnUsIHZidSkpOwotCQlfbW1fc3RvcmVfcHMoYzAsIHZyKTsKLQkJX21tX3N0b3JlX3BzKGMxLCB2Zyk7Ci0JCV9tbV9zdG9yZV9wcyhjMiwgdmIpOwotCQljMCArPSA0OwotCQljMSArPSA0OwotCQljMiArPSA0OwotCX0KLQluICY9IDc7CisgICAgICAgIHZ5ID0gX21tX2xvYWRfcHMoYzApOworICAgICAgICB2dSA9IF9tbV9sb2FkX3BzKGMxKTsKKyAgICAgICAgdnYgPSBfbW1fbG9hZF9wcyhjMik7CisgICAgICAgIHZyID0gX21tX2FkZF9wcyh2eSwgX21tX211bF9wcyh2diwgdnJ2KSk7CisgICAgICAgIHZnID0gX21tX3N1Yl9wcyhfbW1fc3ViX3BzKHZ5LCBfbW1fbXVsX3BzKHZ1LCB2Z3UpKSwgX21tX211bF9wcyh2diwgdmd2KSk7CisgICAgICAgIHZiID0gX21tX2FkZF9wcyh2eSwgX21tX211bF9wcyh2dSwgdmJ1KSk7CisgICAgICAgIF9tbV9zdG9yZV9wcyhjMCwgdnIpOworICAgICAgICBfbW1fc3RvcmVfcHMoYzEsIHZnKTsKKyAgICAgICAgX21tX3N0b3JlX3BzKGMyLCB2Yik7CisgICAgICAgIGMwICs9IDQ7CisgICAgICAgIGMxICs9IDQ7CisgICAgICAgIGMyICs9IDQ7CisgICAgfQorICAgIG4gJj0gNzsKICNlbmRpZgotCWZvcihpID0gMDsgaSA8IG47ICsraSkgewotCQlPUEpfRkxPQVQzMiB5ID0gYzBbaV07Ci0JCU9QSl9GTE9BVDMyIHUgPSBjMVtpXTsKLQkJT1BKX0ZMT0FUMzIgdiA9IGMyW2ldOwotCQlPUEpfRkxPQVQzMiByID0geSArICh2ICogMS40MDJmKTsKLQkJT1BKX0ZMT0FUMzIgZyA9IHkgLSAodSAqIDAuMzQ0MTNmKSAtICh2ICogKDAuNzE0MTRmKSk7Ci0JCU9QSl9GTE9BVDMyIGIgPSB5ICsgKHUgKiAxLjc3MmYpOwotCQljMFtpXSA9IHI7Ci0JCWMxW2ldID0gZzsKLQkJYzJbaV0gPSBiOwotCX0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgIE9QSl9GTE9BVDMyIHkgPSBjMFtpXTsKKyAgICAgICAgT1BKX0ZMT0FUMzIgdSA9IGMxW2ldOworICAgICAgICBPUEpfRkxPQVQzMiB2ID0gYzJbaV07CisgICAgICAgIE9QSl9GTE9BVDMyIHIgPSB5ICsgKHYgKiAxLjQwMmYpOworICAgICAgICBPUEpfRkxPQVQzMiBnID0geSAtICh1ICogMC4zNDQxM2YpIC0gKHYgKiAoMC43MTQxNGYpKTsKKyAgICAgICAgT1BKX0ZMT0FUMzIgYiA9IHkgKyAodSAqIDEuNzcyZik7CisgICAgICAgIGMwW2ldID0gcjsKKyAgICAgICAgYzFbaV0gPSBnOworICAgICAgICBjMltpXSA9IGI7CisgICAgfQogfQogCiAvKiA8c3VtbWFyeT4gKi8KIC8qIEdldCBub3JtIG9mIGJhc2lzIGZ1bmN0aW9uIG9mIGlycmV2ZXJzaWJsZSBNQ1QuICovCiAvKiA8L3N1bW1hcnk+ICovCi1PUEpfRkxPQVQ2NCBvcGpfbWN0X2dldG5vcm1fcmVhbChPUEpfVUlOVDMyIGNvbXBubykgewotCXJldHVybiBvcGpfbWN0X25vcm1zX3JlYWxbY29tcG5vXTsKK09QSl9GTE9BVDY0IG9wal9tY3RfZ2V0bm9ybV9yZWFsKE9QSl9VSU5UMzIgY29tcG5vKQoreworICAgIHJldHVybiBvcGpfbWN0X25vcm1zX3JlYWxbY29tcG5vXTsKIH0KIAogCiBPUEpfQk9PTCBvcGpfbWN0X2VuY29kZV9jdXN0b20oCi0JCQkJCSAgIE9QSl9CWVRFICogcENvZGluZ2RhdGEsCi0JCQkJCSAgIE9QSl9VSU5UMzIgbiwKLQkJCQkJICAgT1BKX0JZVEUgKiogcERhdGEsCi0JCQkJCSAgIE9QSl9VSU5UMzIgcE5iQ29tcCwKLQkJCQkJICAgT1BKX1VJTlQzMiBpc1NpZ25lZCkKKyAgICBPUEpfQllURSAqIHBDb2RpbmdkYXRhLAorICAgIE9QSl9TSVpFX1QgbiwKKyAgICBPUEpfQllURSAqKiBwRGF0YSwKKyAgICBPUEpfVUlOVDMyIHBOYkNvbXAsCisgICAgT1BKX1VJTlQzMiBpc1NpZ25lZCkKIHsKLQlPUEpfRkxPQVQzMiAqIGxNY3QgPSAoT1BKX0ZMT0FUMzIgKikgcENvZGluZ2RhdGE7Ci0JT1BKX1VJTlQzMiBpOwotCU9QSl9VSU5UMzIgajsKLQlPUEpfVUlOVDMyIGs7Ci0JT1BKX1VJTlQzMiBsTmJNYXRDb2VmZiA9IHBOYkNvbXAgKiBwTmJDb21wOwotCU9QSl9JTlQzMiAqIGxDdXJyZW50RGF0YSA9IDAwOwotCU9QSl9JTlQzMiAqIGxDdXJyZW50TWF0cml4ID0gMDA7Ci0JT1BKX0lOVDMyICoqIGxEYXRhID0gKE9QSl9JTlQzMiAqKikgcERhdGE7Ci0JT1BKX1VJTlQzMiBsTXVsdGlwbGljYXRvciA9IDEgPDwgMTM7Ci0JT1BKX0lOVDMyICogbE1jdFB0cjsKKyAgICBPUEpfRkxPQVQzMiAqIGxNY3QgPSAoT1BKX0ZMT0FUMzIgKikgcENvZGluZ2RhdGE7CisgICAgT1BKX1NJWkVfVCBpOworICAgIE9QSl9VSU5UMzIgajsKKyAgICBPUEpfVUlOVDMyIGs7CisgICAgT1BKX1VJTlQzMiBsTmJNYXRDb2VmZiA9IHBOYkNvbXAgKiBwTmJDb21wOworICAgIE9QSl9JTlQzMiAqIGxDdXJyZW50RGF0YSA9IDAwOworICAgIE9QSl9JTlQzMiAqIGxDdXJyZW50TWF0cml4ID0gMDA7CisgICAgT1BKX0lOVDMyICoqIGxEYXRhID0gKE9QSl9JTlQzMiAqKikgcERhdGE7CisgICAgT1BKX1VJTlQzMiBsTXVsdGlwbGljYXRvciA9IDEgPDwgMTM7CisgICAgT1BKX0lOVDMyICogbE1jdFB0cjsKIAogICAgIE9QSl9BUkdfTk9UX1VTRUQoaXNTaWduZWQpOwogCi0JbEN1cnJlbnREYXRhID0gKE9QSl9JTlQzMiAqKSBvcGpfbWFsbG9jKChwTmJDb21wICsgbE5iTWF0Q29lZmYpICogc2l6ZW9mKE9QSl9JTlQzMikpOwotCWlmICghIGxDdXJyZW50RGF0YSkgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KKyAgICBsQ3VycmVudERhdGEgPSAoT1BKX0lOVDMyICopIG9wal9tYWxsb2MoKHBOYkNvbXAgKyBsTmJNYXRDb2VmZikgKiBzaXplb2YoCisgICAgICAgICAgICBPUEpfSU5UMzIpKTsKKyAgICBpZiAoISBsQ3VycmVudERhdGEpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLQlsQ3VycmVudE1hdHJpeCA9IGxDdXJyZW50RGF0YSArIHBOYkNvbXA7CisgICAgbEN1cnJlbnRNYXRyaXggPSBsQ3VycmVudERhdGEgKyBwTmJDb21wOwogCi0JZm9yIChpID0wO2k8bE5iTWF0Q29lZmY7KytpKSB7Ci0JCWxDdXJyZW50TWF0cml4W2ldID0gKE9QSl9JTlQzMikgKCoobE1jdCsrKSAqIChPUEpfRkxPQVQzMilsTXVsdGlwbGljYXRvcik7Ci0JfQorICAgIGZvciAoaSA9IDA7IGkgPCBsTmJNYXRDb2VmZjsgKytpKSB7CisgICAgICAgIGxDdXJyZW50TWF0cml4W2ldID0gKE9QSl9JTlQzMikoKihsTWN0KyspICogKE9QSl9GTE9BVDMyKWxNdWx0aXBsaWNhdG9yKTsKKyAgICB9CiAKLQlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSAgewotCQlsTWN0UHRyID0gbEN1cnJlbnRNYXRyaXg7Ci0JCWZvciAoaj0wO2o8cE5iQ29tcDsrK2opIHsKLQkJCWxDdXJyZW50RGF0YVtqXSA9ICgqKGxEYXRhW2pdKSk7Ci0JCX0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSAgeworICAgICAgICBsTWN0UHRyID0gbEN1cnJlbnRNYXRyaXg7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBwTmJDb21wOyArK2opIHsKKyAgICAgICAgICAgIGxDdXJyZW50RGF0YVtqXSA9ICgqKGxEYXRhW2pdKSk7CisgICAgICAgIH0KIAotCQlmb3IgKGo9MDtqPHBOYkNvbXA7KytqKSB7Ci0JCQkqKGxEYXRhW2pdKSA9IDA7Ci0JCQlmb3IgKGs9MDtrPHBOYkNvbXA7KytrKSB7Ci0JCQkJKihsRGF0YVtqXSkgKz0gb3BqX2ludF9maXhfbXVsKCpsTWN0UHRyLCBsQ3VycmVudERhdGFba10pOwotCQkJCSsrbE1jdFB0cjsKLQkJCX0KKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHBOYkNvbXA7ICsraikgeworICAgICAgICAgICAgKihsRGF0YVtqXSkgPSAwOworICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHBOYkNvbXA7ICsraykgeworICAgICAgICAgICAgICAgICoobERhdGFbal0pICs9IG9wal9pbnRfZml4X211bCgqbE1jdFB0ciwgbEN1cnJlbnREYXRhW2tdKTsKKyAgICAgICAgICAgICAgICArK2xNY3RQdHI7CisgICAgICAgICAgICB9CiAKLQkJCSsrbERhdGFbal07Ci0JCX0KLQl9CisgICAgICAgICAgICArK2xEYXRhW2pdOworICAgICAgICB9CisgICAgfQogCi0Jb3BqX2ZyZWUobEN1cnJlbnREYXRhKTsKKyAgICBvcGpfZnJlZShsQ3VycmVudERhdGEpOwogCi0JcmV0dXJuIE9QSl9UUlVFOworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAogT1BKX0JPT0wgb3BqX21jdF9kZWNvZGVfY3VzdG9tKAotCQkJCQkgICBPUEpfQllURSAqIHBEZWNvZGluZ0RhdGEsCi0JCQkJCSAgIE9QSl9VSU5UMzIgbiwKLQkJCQkJICAgT1BKX0JZVEUgKiogcERhdGEsCi0JCQkJCSAgIE9QSl9VSU5UMzIgcE5iQ29tcCwKLQkJCQkJICAgT1BKX1VJTlQzMiBpc1NpZ25lZCkKKyAgICBPUEpfQllURSAqIHBEZWNvZGluZ0RhdGEsCisgICAgT1BKX1NJWkVfVCBuLAorICAgIE9QSl9CWVRFICoqIHBEYXRhLAorICAgIE9QSl9VSU5UMzIgcE5iQ29tcCwKKyAgICBPUEpfVUlOVDMyIGlzU2lnbmVkKQogewotCU9QSl9GTE9BVDMyICogbE1jdDsKLQlPUEpfVUlOVDMyIGk7Ci0JT1BKX1VJTlQzMiBqOwotCU9QSl9VSU5UMzIgazsKKyAgICBPUEpfRkxPQVQzMiAqIGxNY3Q7CisgICAgT1BKX1NJWkVfVCBpOworICAgIE9QSl9VSU5UMzIgajsKKyAgICBPUEpfVUlOVDMyIGs7CiAKLQlPUEpfRkxPQVQzMiAqIGxDdXJyZW50RGF0YSA9IDAwOwotCU9QSl9GTE9BVDMyICogbEN1cnJlbnRSZXN1bHQgPSAwMDsKLQlPUEpfRkxPQVQzMiAqKiBsRGF0YSA9IChPUEpfRkxPQVQzMiAqKikgcERhdGE7CisgICAgT1BKX0ZMT0FUMzIgKiBsQ3VycmVudERhdGEgPSAwMDsKKyAgICBPUEpfRkxPQVQzMiAqIGxDdXJyZW50UmVzdWx0ID0gMDA7CisgICAgT1BKX0ZMT0FUMzIgKiogbERhdGEgPSAoT1BKX0ZMT0FUMzIgKiopIHBEYXRhOwogCiAgICAgT1BKX0FSR19OT1RfVVNFRChpc1NpZ25lZCk7CiAKLQlsQ3VycmVudERhdGEgPSAoT1BKX0ZMT0FUMzIgKikgb3BqX21hbGxvYyAoMiAqIHBOYkNvbXAgKiBzaXplb2YoT1BKX0ZMT0FUMzIpKTsKLQlpZiAoISBsQ3VycmVudERhdGEpIHsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9Ci0JbEN1cnJlbnRSZXN1bHQgPSBsQ3VycmVudERhdGEgKyBwTmJDb21wOworICAgIGxDdXJyZW50RGF0YSA9IChPUEpfRkxPQVQzMiAqKSBvcGpfbWFsbG9jKDIgKiBwTmJDb21wICogc2l6ZW9mKE9QSl9GTE9BVDMyKSk7CisgICAgaWYgKCEgbEN1cnJlbnREYXRhKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGxDdXJyZW50UmVzdWx0ID0gbEN1cnJlbnREYXRhICsgcE5iQ29tcDsKIAotCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKLQkJbE1jdCA9IChPUEpfRkxPQVQzMiAqKSBwRGVjb2RpbmdEYXRhOwotCQlmb3IgKGo9MDtqPHBOYkNvbXA7KytqKSB7Ci0JCQlsQ3VycmVudERhdGFbal0gPSAoT1BKX0ZMT0FUMzIpICgqKGxEYXRhW2pdKSk7Ci0JCX0KLQkJZm9yIChqPTA7ajxwTmJDb21wOysraikgewotCQkJbEN1cnJlbnRSZXN1bHRbal0gPSAwOwotCQkJZm9yCShrPTA7azxwTmJDb21wOysraykJewotCQkJCWxDdXJyZW50UmVzdWx0W2pdICs9ICoobE1jdCsrKSAqIGxDdXJyZW50RGF0YVtrXTsKLQkJCX0KLQkJCSoobERhdGFbal0rKykgPSAoT1BKX0ZMT0FUMzIpIChsQ3VycmVudFJlc3VsdFtqXSk7Ci0JCX0KLQl9Ci0Jb3BqX2ZyZWUobEN1cnJlbnREYXRhKTsKLQlyZXR1cm4gT1BKX1RSVUU7CisgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBsTWN0ID0gKE9QSl9GTE9BVDMyICopIHBEZWNvZGluZ0RhdGE7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBwTmJDb21wOyArK2opIHsKKyAgICAgICAgICAgIGxDdXJyZW50RGF0YVtqXSA9IChPUEpfRkxPQVQzMikoKihsRGF0YVtqXSkpOworICAgICAgICB9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBwTmJDb21wOyArK2opIHsKKyAgICAgICAgICAgIGxDdXJyZW50UmVzdWx0W2pdID0gMDsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBwTmJDb21wOyArK2spIHsKKyAgICAgICAgICAgICAgICBsQ3VycmVudFJlc3VsdFtqXSArPSAqKGxNY3QrKykgKiBsQ3VycmVudERhdGFba107CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqKGxEYXRhW2pdKyspID0gKE9QSl9GTE9BVDMyKShsQ3VycmVudFJlc3VsdFtqXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgb3BqX2ZyZWUobEN1cnJlbnREYXRhKTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXZvaWQgb3BqX2NhbGN1bGF0ZV9ub3JtcygJT1BKX0ZMT0FUNjQgKiBwTm9ybXMsCi0JCQkJCQkJT1BKX1VJTlQzMiBwTmJDb21wcywKLQkJCQkJCQlPUEpfRkxPQVQzMiAqIHBNYXRyaXgpCit2b2lkIG9wal9jYWxjdWxhdGVfbm9ybXMoT1BKX0ZMT0FUNjQgKiBwTm9ybXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwTmJDb21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiAqIHBNYXRyaXgpCiB7Ci0JT1BKX1VJTlQzMiBpLGosbEluZGV4OwotCU9QSl9GTE9BVDMyIGxDdXJyZW50VmFsdWU7Ci0JT1BKX0ZMT0FUNjQgKiBsTm9ybXMgPSAoT1BKX0ZMT0FUNjQgKikgcE5vcm1zOwotCU9QSl9GTE9BVDMyICogbE1hdHJpeCA9IChPUEpfRkxPQVQzMiAqKSBwTWF0cml4OworICAgIE9QSl9VSU5UMzIgaSwgaiwgbEluZGV4OworICAgIE9QSl9GTE9BVDMyIGxDdXJyZW50VmFsdWU7CisgICAgT1BKX0ZMT0FUNjQgKiBsTm9ybXMgPSAoT1BKX0ZMT0FUNjQgKikgcE5vcm1zOworICAgIE9QSl9GTE9BVDMyICogbE1hdHJpeCA9IChPUEpfRkxPQVQzMiAqKSBwTWF0cml4OwogCi0JZm9yCShpPTA7aTxwTmJDb21wczsrK2kpIHsKLQkJbE5vcm1zW2ldID0gMDsKLQkJbEluZGV4ID0gaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcE5iQ29tcHM7ICsraSkgeworICAgICAgICBsTm9ybXNbaV0gPSAwOworICAgICAgICBsSW5kZXggPSBpOwogCi0JCWZvcgkoaj0wO2o8cE5iQ29tcHM7KytqKSB7Ci0JCQlsQ3VycmVudFZhbHVlID0gbE1hdHJpeFtsSW5kZXhdOwotCQkJbEluZGV4ICs9IHBOYkNvbXBzOwotCQkJbE5vcm1zW2ldICs9IGxDdXJyZW50VmFsdWUgKiBsQ3VycmVudFZhbHVlOwotCQl9Ci0JCWxOb3Jtc1tpXSA9IHNxcnQobE5vcm1zW2ldKTsKLQl9CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBwTmJDb21wczsgKytqKSB7CisgICAgICAgICAgICBsQ3VycmVudFZhbHVlID0gbE1hdHJpeFtsSW5kZXhdOworICAgICAgICAgICAgbEluZGV4ICs9IHBOYkNvbXBzOworICAgICAgICAgICAgbE5vcm1zW2ldICs9IGxDdXJyZW50VmFsdWUgKiBsQ3VycmVudFZhbHVlOworICAgICAgICB9CisgICAgICAgIGxOb3Jtc1tpXSA9IHNxcnQobE5vcm1zW2ldKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL21jdC5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9tY3QuaAppbmRleCAxYzFmNGQwLi4yZTM3Y2U3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL21jdC5oCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvbWN0LmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCiAgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCiAgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCiAgKgpAQCAtOCwxMCArOCwxMCBAQAogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQogICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMsIERhdmlkIEphbnNzZW5zCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgWWFubmljayBWZXJzY2h1ZXJlbgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4IAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQogICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZSIAorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGUgogICogQ29weXJpZ2h0IChjKSAyMDEyLCBDUyBTeXN0ZW1lcyBkJ0luZm9ybWF0aW9uLCBGcmFuY2UKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpAQCAtMzcsOCArMzcsOCBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KIAotI2lmbmRlZiBfX01DVF9ICi0jZGVmaW5lIF9fTUNUX0gKKyNpZm5kZWYgT1BKX01DVF9ICisjZGVmaW5lIE9QSl9NQ1RfSAogLyoqCiBAZmlsZSBtY3QuaAogQGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIGEgbXVsdGktY29tcG9uZW50IHRyYW5zZm9ybXMgKE1DVCkKQEAgLTYwLDcgKzYwLDggQEAKIEBwYXJhbSBjMiBTYW1wbGVzIGJsdWUgY29tcG9uZW50CiBAcGFyYW0gbiBOdW1iZXIgb2Ygc2FtcGxlcyBmb3IgZWFjaCBjb21wb25lbnQKICovCi12b2lkIG9wal9tY3RfZW5jb2RlKE9QSl9JTlQzMiAqYzAsIE9QSl9JTlQzMiAqYzEsIE9QSl9JTlQzMiAqYzIsIE9QSl9VSU5UMzIgbik7Cit2b2lkIG9wal9tY3RfZW5jb2RlKE9QSl9JTlQzMiogT1BKX1JFU1RSSUNUIGMwLCBPUEpfSU5UMzIqIE9QSl9SRVNUUklDVCBjMSwKKyAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyKiBPUEpfUkVTVFJJQ1QgYzIsIE9QSl9TSVpFX1Qgbik7CiAvKioKIEFwcGx5IGEgcmV2ZXJzaWJsZSBtdWx0aS1jb21wb25lbnQgaW52ZXJzZSB0cmFuc2Zvcm0gdG8gYW4gaW1hZ2UKIEBwYXJhbSBjMCBTYW1wbGVzIGZvciBsdW1pbmFuY2UgY29tcG9uZW50CkBAIC02OCwxMSArNjksMTIgQEAKIEBwYXJhbSBjMiBTYW1wbGVzIGZvciBibHVlIGNocm9taW5hbmNlIGNvbXBvbmVudAogQHBhcmFtIG4gTnVtYmVyIG9mIHNhbXBsZXMgZm9yIGVhY2ggY29tcG9uZW50CiAqLwotdm9pZCBvcGpfbWN0X2RlY29kZShPUEpfSU5UMzIgKmMwLCBPUEpfSU5UMzIgKmMxLCBPUEpfSU5UMzIgKmMyLCBPUEpfVUlOVDMyIG4pOwordm9pZCBvcGpfbWN0X2RlY29kZShPUEpfSU5UMzIqIE9QSl9SRVNUUklDVCBjMCwgT1BKX0lOVDMyKiBPUEpfUkVTVFJJQ1QgYzEsCisgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiogT1BKX1JFU1RSSUNUIGMyLCBPUEpfU0laRV9UIG4pOwogLyoqCiBHZXQgbm9ybSBvZiB0aGUgYmFzaXMgZnVuY3Rpb24gdXNlZCBmb3IgdGhlIHJldmVyc2libGUgbXVsdGktY29tcG9uZW50IHRyYW5zZm9ybQogQHBhcmFtIGNvbXBubyBOdW1iZXIgb2YgdGhlIGNvbXBvbmVudCAoMC0+WSwgMS0+VSwgMi0+VikKLUByZXR1cm4gCitAcmV0dXJuCiAqLwogT1BKX0ZMT0FUNjQgb3BqX21jdF9nZXRub3JtKE9QSl9VSU5UMzIgY29tcG5vKTsKIApAQCAtODMsNyArODUsOCBAQAogQHBhcmFtIGMyIFNhbXBsZXMgYmx1ZSBjb21wb25lbnQKIEBwYXJhbSBuIE51bWJlciBvZiBzYW1wbGVzIGZvciBlYWNoIGNvbXBvbmVudAogKi8KLXZvaWQgb3BqX21jdF9lbmNvZGVfcmVhbChPUEpfSU5UMzIgKmMwLCBPUEpfSU5UMzIgKmMxLCBPUEpfSU5UMzIgKmMyLCBPUEpfVUlOVDMyIG4pOwordm9pZCBvcGpfbWN0X2VuY29kZV9yZWFsKE9QSl9JTlQzMiogT1BKX1JFU1RSSUNUIGMwLCBPUEpfSU5UMzIqIE9QSl9SRVNUUklDVCBjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIqIE9QSl9SRVNUUklDVCBjMiwgT1BKX1NJWkVfVCBuKTsKIC8qKgogQXBwbHkgYW4gaXJyZXZlcnNpYmxlIG11bHRpLWNvbXBvbmVudCBpbnZlcnNlIHRyYW5zZm9ybSB0byBhbiBpbWFnZQogQHBhcmFtIGMwIFNhbXBsZXMgZm9yIGx1bWluYW5jZSBjb21wb25lbnQKQEAgLTkxLDExICs5NCwxMiBAQAogQHBhcmFtIGMyIFNhbXBsZXMgZm9yIGJsdWUgY2hyb21pbmFuY2UgY29tcG9uZW50CiBAcGFyYW0gbiBOdW1iZXIgb2Ygc2FtcGxlcyBmb3IgZWFjaCBjb21wb25lbnQKICovCi12b2lkIG9wal9tY3RfZGVjb2RlX3JlYWwoT1BKX0ZMT0FUMzIqIGMwLCBPUEpfRkxPQVQzMiogYzEsIE9QSl9GTE9BVDMyKiBjMiwgT1BKX1VJTlQzMiBuKTsKK3ZvaWQgb3BqX21jdF9kZWNvZGVfcmVhbChPUEpfRkxPQVQzMiogT1BKX1JFU1RSSUNUIGMwLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyKiBPUEpfUkVTVFJJQ1QgYzEsIE9QSl9GTE9BVDMyKiBPUEpfUkVTVFJJQ1QgYzIsIE9QSl9TSVpFX1Qgbik7CiAvKioKIEdldCBub3JtIG9mIHRoZSBiYXNpcyBmdW5jdGlvbiB1c2VkIGZvciB0aGUgaXJyZXZlcnNpYmxlIG11bHRpLWNvbXBvbmVudCB0cmFuc2Zvcm0KIEBwYXJhbSBjb21wbm8gTnVtYmVyIG9mIHRoZSBjb21wb25lbnQgKDAtPlksIDEtPlUsIDItPlYpCi1AcmV0dXJuIAorQHJldHVybgogKi8KIE9QSl9GTE9BVDY0IG9wal9tY3RfZ2V0bm9ybV9yZWFsKE9QSl9VSU5UMzIgY29tcG5vKTsKIApAQCAtMTA5LDExICsxMTMsMTEgQEAKIEByZXR1cm4gT1BKX0ZBTFNFIGlmIGZ1bmN0aW9uIGVuY291bnRlciBhIHByb2JsZW0sIE9QSl9UUlVFIG90aGVyd2lzZQogKi8KIE9QSl9CT09MIG9wal9tY3RfZW5jb2RlX2N1c3RvbSgKLQkJCQkJICAgT1BKX0JZVEUgKiBwX2NvZGluZ19kYXRhLAotCQkJCQkgICBPUEpfVUlOVDMyIG4sCi0JCQkJCSAgIE9QSl9CWVRFICoqIHBfZGF0YSwKLQkJCQkJICAgT1BKX1VJTlQzMiBwX25iX2NvbXAsCi0JCQkJCSAgIE9QSl9VSU5UMzIgaXNfc2lnbmVkKTsKKyAgICBPUEpfQllURSAqIHBfY29kaW5nX2RhdGEsCisgICAgT1BKX1NJWkVfVCBuLAorICAgIE9QSl9CWVRFICoqIHBfZGF0YSwKKyAgICBPUEpfVUlOVDMyIHBfbmJfY29tcCwKKyAgICBPUEpfVUlOVDMyIGlzX3NpZ25lZCk7CiAvKioKIEZJWE1FIERPQwogQHBhcmFtIHBEZWNvZGluZ0RhdGEgICAgTUNUIGRhdGEKQEAgLTEyNCwzMiArMTI4LDMyIEBACiBAcmV0dXJuIE9QSl9GQUxTRSBpZiBmdW5jdGlvbiBlbmNvdW50ZXIgYSBwcm9ibGVtLCBPUEpfVFJVRSBvdGhlcndpc2UKICovCiBPUEpfQk9PTCBvcGpfbWN0X2RlY29kZV9jdXN0b20oCi0JCQkJCSAgIE9QSl9CWVRFICogcERlY29kaW5nRGF0YSwKLQkJCQkJICAgT1BKX1VJTlQzMiBuLAotCQkJCQkgICBPUEpfQllURSAqKiBwRGF0YSwKLQkJCQkJICAgT1BKX1VJTlQzMiBwTmJDb21wLAotCQkJCQkgICBPUEpfVUlOVDMyIGlzU2lnbmVkKTsKKyAgICBPUEpfQllURSAqIHBEZWNvZGluZ0RhdGEsCisgICAgT1BKX1NJWkVfVCBuLAorICAgIE9QSl9CWVRFICoqIHBEYXRhLAorICAgIE9QSl9VSU5UMzIgcE5iQ29tcCwKKyAgICBPUEpfVUlOVDMyIGlzU2lnbmVkKTsKIC8qKgogRklYTUUgRE9DCiBAcGFyYW0gcE5vcm1zICAgICAgICAgICBNQ1QgZGF0YQogQHBhcmFtIHBfbmJfY29tcHMgICAgICAgc2l6ZSBvZiBjb21wb25lbnRzCiBAcGFyYW0gcE1hdHJpeCAgICAgICAgICBjb21wb25lbnRzCi1AcmV0dXJuIAorQHJldHVybgogKi8KLXZvaWQgb3BqX2NhbGN1bGF0ZV9ub3JtcyggICBPUEpfRkxPQVQ2NCAqIHBOb3JtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbmJfY29tcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgKiBwTWF0cml4KTsKK3ZvaWQgb3BqX2NhbGN1bGF0ZV9ub3JtcyhPUEpfRkxPQVQ2NCAqIHBOb3JtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbmJfY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgKiBwTWF0cml4KTsKIC8qKgotRklYTUUgRE9DIAorRklYTUUgRE9DCiAqLwotY29uc3QgT1BKX0ZMT0FUNjQgKiBvcGpfbWN0X2dldF9tY3Rfbm9ybXMgKHZvaWQpOworY29uc3QgT1BKX0ZMT0FUNjQgKiBvcGpfbWN0X2dldF9tY3Rfbm9ybXModm9pZCk7CiAvKioKLUZJWE1FIERPQyAKK0ZJWE1FIERPQwogKi8KLWNvbnN0IE9QSl9GTE9BVDY0ICogb3BqX21jdF9nZXRfbWN0X25vcm1zX3JlYWwgKHZvaWQpOworY29uc3QgT1BKX0ZMT0FUNjQgKiBvcGpfbWN0X2dldF9tY3Rfbm9ybXNfcmVhbCh2b2lkKTsKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKkB9Ki8KIAogLypAfSovCiAKLSNlbmRpZiAvKiBfX01DVF9IICovCisjZW5kaWYgLyogT1BKX01DVF9IICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL21xYy5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9tcWMuYwppbmRleCA3ZTBmNTYzLi42Mjk5YjE3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL21xYy5jCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvbXFjLmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCiAgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCiAgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCiAgKgpAQCAtOCw3ICs4LDcgQEAKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBQcm9mZXNzb3IgQmVub2l0IE1hY3EKICAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzLCBEYXZpZCBKYW5zc2VucwogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIFlhbm5pY2sgVmVyc2NodWVyZW4KLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eCAKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eAogICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQsIEFudG9uaW4gRGVzY2FtcGUKICAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQogICogQ29weXJpZ2h0IChjKSAyMDA4LCBKZXJvbWUgRmltZXMsIENvbW11bmljYXRpb25zICYgU3lzdGVtZXMgPGplcm9tZS5maW1lc0BjLXMuZnI+CkBAIC0zOCw2ICszOCw4IEBACiAKICNpbmNsdWRlICJvcGpfaW5jbHVkZXMuaCIKIAorI2luY2x1ZGUgPGFzc2VydC5oPgorCiAvKiogQGRlZmdyb3VwIE1RQyBNUUMgLSBJbXBsZW1lbnRhdGlvbiBvZiBhbiBNUS1Db2RlciAqLwogLypAeyovCiAKQEAgLTcwLDI4ICs3Miw2IEBACiBAcGFyYW0gbXFjIE1RQyBoYW5kbGUKICovCiBzdGF0aWMgdm9pZCBvcGpfbXFjX3NldGJpdHMob3BqX21xY190ICptcWMpOwotLyoqCi1GSVhNRSBET0MKLUBwYXJhbSBtcWMgTVFDIGhhbmRsZQotQHJldHVybiAKLSovCi1zdGF0aWMgSU5MSU5FIE9QSl9JTlQzMiBvcGpfbXFjX21wc2V4Y2hhbmdlKG9wal9tcWNfdCAqY29uc3QgbXFjKTsKLS8qKgotRklYTUUgRE9DCi1AcGFyYW0gbXFjIE1RQyBoYW5kbGUKLUByZXR1cm4gCi0qLwotc3RhdGljIElOTElORSBPUEpfSU5UMzIgb3BqX21xY19scHNleGNoYW5nZShvcGpfbXFjX3QgKmNvbnN0IG1xYyk7Ci0vKioKLUlucHV0IGEgYnl0ZQotQHBhcmFtIG1xYyBNUUMgaGFuZGxlCi0qLwotc3RhdGljIElOTElORSB2b2lkIG9wal9tcWNfYnl0ZWluKG9wal9tcWNfdCAqY29uc3QgbXFjKTsKLS8qKgotUmVub3JtYWxpemUgbXFjLT5hIGFuZCBtcWMtPmMgd2hpbGUgZGVjb2RpbmcKLUBwYXJhbSBtcWMgTVFDIGhhbmRsZQotKi8KLXN0YXRpYyBJTkxJTkUgdm9pZCBvcGpfbXFjX3Jlbm9ybWQob3BqX21xY190ICpjb25zdCBtcWMpOwogLypAfSovCiAKIC8qQH0qLwpAQCAtOTksNTE2ICs3OSw0ODIgQEAKIC8qIDxzdW1tYXJ5PiAqLwogLyogVGhpcyBhcnJheSBkZWZpbmVzIGFsbCB0aGUgcG9zc2libGUgc3RhdGVzIGZvciBhIGNvbnRleHQuICovCiAvKiA8L3N1bW1hcnk+ICovCi1zdGF0aWMgb3BqX21xY19zdGF0ZV90IG1xY19zdGF0ZXNbNDcgKiAyXSA9IHsKLQl7MHg1NjAxLCAwLCAmbXFjX3N0YXRlc1syXSwgJm1xY19zdGF0ZXNbM119LAotCXsweDU2MDEsIDEsICZtcWNfc3RhdGVzWzNdLCAmbXFjX3N0YXRlc1syXX0sCi0JezB4MzQwMSwgMCwgJm1xY19zdGF0ZXNbNF0sICZtcWNfc3RhdGVzWzEyXX0sCi0JezB4MzQwMSwgMSwgJm1xY19zdGF0ZXNbNV0sICZtcWNfc3RhdGVzWzEzXX0sCi0JezB4MTgwMSwgMCwgJm1xY19zdGF0ZXNbNl0sICZtcWNfc3RhdGVzWzE4XX0sCi0JezB4MTgwMSwgMSwgJm1xY19zdGF0ZXNbN10sICZtcWNfc3RhdGVzWzE5XX0sCi0JezB4MGFjMSwgMCwgJm1xY19zdGF0ZXNbOF0sICZtcWNfc3RhdGVzWzI0XX0sCi0JezB4MGFjMSwgMSwgJm1xY19zdGF0ZXNbOV0sICZtcWNfc3RhdGVzWzI1XX0sCi0JezB4MDUyMSwgMCwgJm1xY19zdGF0ZXNbMTBdLCAmbXFjX3N0YXRlc1s1OF19LAotCXsweDA1MjEsIDEsICZtcWNfc3RhdGVzWzExXSwgJm1xY19zdGF0ZXNbNTldfSwKLQl7MHgwMjIxLCAwLCAmbXFjX3N0YXRlc1s3Nl0sICZtcWNfc3RhdGVzWzY2XX0sCi0JezB4MDIyMSwgMSwgJm1xY19zdGF0ZXNbNzddLCAmbXFjX3N0YXRlc1s2N119LAotCXsweDU2MDEsIDAsICZtcWNfc3RhdGVzWzE0XSwgJm1xY19zdGF0ZXNbMTNdfSwKLQl7MHg1NjAxLCAxLCAmbXFjX3N0YXRlc1sxNV0sICZtcWNfc3RhdGVzWzEyXX0sCi0JezB4NTQwMSwgMCwgJm1xY19zdGF0ZXNbMTZdLCAmbXFjX3N0YXRlc1syOF19LAotCXsweDU0MDEsIDEsICZtcWNfc3RhdGVzWzE3XSwgJm1xY19zdGF0ZXNbMjldfSwKLQl7MHg0ODAxLCAwLCAmbXFjX3N0YXRlc1sxOF0sICZtcWNfc3RhdGVzWzI4XX0sCi0JezB4NDgwMSwgMSwgJm1xY19zdGF0ZXNbMTldLCAmbXFjX3N0YXRlc1syOV19LAotCXsweDM4MDEsIDAsICZtcWNfc3RhdGVzWzIwXSwgJm1xY19zdGF0ZXNbMjhdfSwKLQl7MHgzODAxLCAxLCAmbXFjX3N0YXRlc1syMV0sICZtcWNfc3RhdGVzWzI5XX0sCi0JezB4MzAwMSwgMCwgJm1xY19zdGF0ZXNbMjJdLCAmbXFjX3N0YXRlc1szNF19LAotCXsweDMwMDEsIDEsICZtcWNfc3RhdGVzWzIzXSwgJm1xY19zdGF0ZXNbMzVdfSwKLQl7MHgyNDAxLCAwLCAmbXFjX3N0YXRlc1syNF0sICZtcWNfc3RhdGVzWzM2XX0sCi0JezB4MjQwMSwgMSwgJm1xY19zdGF0ZXNbMjVdLCAmbXFjX3N0YXRlc1szN119LAotCXsweDFjMDEsIDAsICZtcWNfc3RhdGVzWzI2XSwgJm1xY19zdGF0ZXNbNDBdfSwKLQl7MHgxYzAxLCAxLCAmbXFjX3N0YXRlc1syN10sICZtcWNfc3RhdGVzWzQxXX0sCi0JezB4MTYwMSwgMCwgJm1xY19zdGF0ZXNbNThdLCAmbXFjX3N0YXRlc1s0Ml19LAotCXsweDE2MDEsIDEsICZtcWNfc3RhdGVzWzU5XSwgJm1xY19zdGF0ZXNbNDNdfSwKLQl7MHg1NjAxLCAwLCAmbXFjX3N0YXRlc1szMF0sICZtcWNfc3RhdGVzWzI5XX0sCi0JezB4NTYwMSwgMSwgJm1xY19zdGF0ZXNbMzFdLCAmbXFjX3N0YXRlc1syOF19LAotCXsweDU0MDEsIDAsICZtcWNfc3RhdGVzWzMyXSwgJm1xY19zdGF0ZXNbMjhdfSwKLQl7MHg1NDAxLCAxLCAmbXFjX3N0YXRlc1szM10sICZtcWNfc3RhdGVzWzI5XX0sCi0JezB4NTEwMSwgMCwgJm1xY19zdGF0ZXNbMzRdLCAmbXFjX3N0YXRlc1szMF19LAotCXsweDUxMDEsIDEsICZtcWNfc3RhdGVzWzM1XSwgJm1xY19zdGF0ZXNbMzFdfSwKLQl7MHg0ODAxLCAwLCAmbXFjX3N0YXRlc1szNl0sICZtcWNfc3RhdGVzWzMyXX0sCi0JezB4NDgwMSwgMSwgJm1xY19zdGF0ZXNbMzddLCAmbXFjX3N0YXRlc1szM119LAotCXsweDM4MDEsIDAsICZtcWNfc3RhdGVzWzM4XSwgJm1xY19zdGF0ZXNbMzRdfSwKLQl7MHgzODAxLCAxLCAmbXFjX3N0YXRlc1szOV0sICZtcWNfc3RhdGVzWzM1XX0sCi0JezB4MzQwMSwgMCwgJm1xY19zdGF0ZXNbNDBdLCAmbXFjX3N0YXRlc1szNl19LAotCXsweDM0MDEsIDEsICZtcWNfc3RhdGVzWzQxXSwgJm1xY19zdGF0ZXNbMzddfSwKLQl7MHgzMDAxLCAwLCAmbXFjX3N0YXRlc1s0Ml0sICZtcWNfc3RhdGVzWzM4XX0sCi0JezB4MzAwMSwgMSwgJm1xY19zdGF0ZXNbNDNdLCAmbXFjX3N0YXRlc1szOV19LAotCXsweDI4MDEsIDAsICZtcWNfc3RhdGVzWzQ0XSwgJm1xY19zdGF0ZXNbMzhdfSwKLQl7MHgyODAxLCAxLCAmbXFjX3N0YXRlc1s0NV0sICZtcWNfc3RhdGVzWzM5XX0sCi0JezB4MjQwMSwgMCwgJm1xY19zdGF0ZXNbNDZdLCAmbXFjX3N0YXRlc1s0MF19LAotCXsweDI0MDEsIDEsICZtcWNfc3RhdGVzWzQ3XSwgJm1xY19zdGF0ZXNbNDFdfSwKLQl7MHgyMjAxLCAwLCAmbXFjX3N0YXRlc1s0OF0sICZtcWNfc3RhdGVzWzQyXX0sCi0JezB4MjIwMSwgMSwgJm1xY19zdGF0ZXNbNDldLCAmbXFjX3N0YXRlc1s0M119LAotCXsweDFjMDEsIDAsICZtcWNfc3RhdGVzWzUwXSwgJm1xY19zdGF0ZXNbNDRdfSwKLQl7MHgxYzAxLCAxLCAmbXFjX3N0YXRlc1s1MV0sICZtcWNfc3RhdGVzWzQ1XX0sCi0JezB4MTgwMSwgMCwgJm1xY19zdGF0ZXNbNTJdLCAmbXFjX3N0YXRlc1s0Nl19LAotCXsweDE4MDEsIDEsICZtcWNfc3RhdGVzWzUzXSwgJm1xY19zdGF0ZXNbNDddfSwKLQl7MHgxNjAxLCAwLCAmbXFjX3N0YXRlc1s1NF0sICZtcWNfc3RhdGVzWzQ4XX0sCi0JezB4MTYwMSwgMSwgJm1xY19zdGF0ZXNbNTVdLCAmbXFjX3N0YXRlc1s0OV19LAotCXsweDE0MDEsIDAsICZtcWNfc3RhdGVzWzU2XSwgJm1xY19zdGF0ZXNbNTBdfSwKLQl7MHgxNDAxLCAxLCAmbXFjX3N0YXRlc1s1N10sICZtcWNfc3RhdGVzWzUxXX0sCi0JezB4MTIwMSwgMCwgJm1xY19zdGF0ZXNbNThdLCAmbXFjX3N0YXRlc1s1Ml19LAotCXsweDEyMDEsIDEsICZtcWNfc3RhdGVzWzU5XSwgJm1xY19zdGF0ZXNbNTNdfSwKLQl7MHgxMTAxLCAwLCAmbXFjX3N0YXRlc1s2MF0sICZtcWNfc3RhdGVzWzU0XX0sCi0JezB4MTEwMSwgMSwgJm1xY19zdGF0ZXNbNjFdLCAmbXFjX3N0YXRlc1s1NV19LAotCXsweDBhYzEsIDAsICZtcWNfc3RhdGVzWzYyXSwgJm1xY19zdGF0ZXNbNTZdfSwKLQl7MHgwYWMxLCAxLCAmbXFjX3N0YXRlc1s2M10sICZtcWNfc3RhdGVzWzU3XX0sCi0JezB4MDljMSwgMCwgJm1xY19zdGF0ZXNbNjRdLCAmbXFjX3N0YXRlc1s1OF19LAotCXsweDA5YzEsIDEsICZtcWNfc3RhdGVzWzY1XSwgJm1xY19zdGF0ZXNbNTldfSwKLQl7MHgwOGExLCAwLCAmbXFjX3N0YXRlc1s2Nl0sICZtcWNfc3RhdGVzWzYwXX0sCi0JezB4MDhhMSwgMSwgJm1xY19zdGF0ZXNbNjddLCAmbXFjX3N0YXRlc1s2MV19LAotCXsweDA1MjEsIDAsICZtcWNfc3RhdGVzWzY4XSwgJm1xY19zdGF0ZXNbNjJdfSwKLQl7MHgwNTIxLCAxLCAmbXFjX3N0YXRlc1s2OV0sICZtcWNfc3RhdGVzWzYzXX0sCi0JezB4MDQ0MSwgMCwgJm1xY19zdGF0ZXNbNzBdLCAmbXFjX3N0YXRlc1s2NF19LAotCXsweDA0NDEsIDEsICZtcWNfc3RhdGVzWzcxXSwgJm1xY19zdGF0ZXNbNjVdfSwKLQl7MHgwMmExLCAwLCAmbXFjX3N0YXRlc1s3Ml0sICZtcWNfc3RhdGVzWzY2XX0sCi0JezB4MDJhMSwgMSwgJm1xY19zdGF0ZXNbNzNdLCAmbXFjX3N0YXRlc1s2N119LAotCXsweDAyMjEsIDAsICZtcWNfc3RhdGVzWzc0XSwgJm1xY19zdGF0ZXNbNjhdfSwKLQl7MHgwMjIxLCAxLCAmbXFjX3N0YXRlc1s3NV0sICZtcWNfc3RhdGVzWzY5XX0sCi0JezB4MDE0MSwgMCwgJm1xY19zdGF0ZXNbNzZdLCAmbXFjX3N0YXRlc1s3MF19LAotCXsweDAxNDEsIDEsICZtcWNfc3RhdGVzWzc3XSwgJm1xY19zdGF0ZXNbNzFdfSwKLQl7MHgwMTExLCAwLCAmbXFjX3N0YXRlc1s3OF0sICZtcWNfc3RhdGVzWzcyXX0sCi0JezB4MDExMSwgMSwgJm1xY19zdGF0ZXNbNzldLCAmbXFjX3N0YXRlc1s3M119LAotCXsweDAwODUsIDAsICZtcWNfc3RhdGVzWzgwXSwgJm1xY19zdGF0ZXNbNzRdfSwKLQl7MHgwMDg1LCAxLCAmbXFjX3N0YXRlc1s4MV0sICZtcWNfc3RhdGVzWzc1XX0sCi0JezB4MDA0OSwgMCwgJm1xY19zdGF0ZXNbODJdLCAmbXFjX3N0YXRlc1s3Nl19LAotCXsweDAwNDksIDEsICZtcWNfc3RhdGVzWzgzXSwgJm1xY19zdGF0ZXNbNzddfSwKLQl7MHgwMDI1LCAwLCAmbXFjX3N0YXRlc1s4NF0sICZtcWNfc3RhdGVzWzc4XX0sCi0JezB4MDAyNSwgMSwgJm1xY19zdGF0ZXNbODVdLCAmbXFjX3N0YXRlc1s3OV19LAotCXsweDAwMTUsIDAsICZtcWNfc3RhdGVzWzg2XSwgJm1xY19zdGF0ZXNbODBdfSwKLQl7MHgwMDE1LCAxLCAmbXFjX3N0YXRlc1s4N10sICZtcWNfc3RhdGVzWzgxXX0sCi0JezB4MDAwOSwgMCwgJm1xY19zdGF0ZXNbODhdLCAmbXFjX3N0YXRlc1s4Ml19LAotCXsweDAwMDksIDEsICZtcWNfc3RhdGVzWzg5XSwgJm1xY19zdGF0ZXNbODNdfSwKLQl7MHgwMDA1LCAwLCAmbXFjX3N0YXRlc1s5MF0sICZtcWNfc3RhdGVzWzg0XX0sCi0JezB4MDAwNSwgMSwgJm1xY19zdGF0ZXNbOTFdLCAmbXFjX3N0YXRlc1s4NV19LAotCXsweDAwMDEsIDAsICZtcWNfc3RhdGVzWzkwXSwgJm1xY19zdGF0ZXNbODZdfSwKLQl7MHgwMDAxLCAxLCAmbXFjX3N0YXRlc1s5MV0sICZtcWNfc3RhdGVzWzg3XX0sCi0JezB4NTYwMSwgMCwgJm1xY19zdGF0ZXNbOTJdLCAmbXFjX3N0YXRlc1s5Ml19LAotCXsweDU2MDEsIDEsICZtcWNfc3RhdGVzWzkzXSwgJm1xY19zdGF0ZXNbOTNdfSwKK3N0YXRpYyBjb25zdCBvcGpfbXFjX3N0YXRlX3QgbXFjX3N0YXRlc1s0NyAqIDJdID0geworICAgIHsweDU2MDEsIDAsICZtcWNfc3RhdGVzWzJdLCAmbXFjX3N0YXRlc1szXX0sCisgICAgezB4NTYwMSwgMSwgJm1xY19zdGF0ZXNbM10sICZtcWNfc3RhdGVzWzJdfSwKKyAgICB7MHgzNDAxLCAwLCAmbXFjX3N0YXRlc1s0XSwgJm1xY19zdGF0ZXNbMTJdfSwKKyAgICB7MHgzNDAxLCAxLCAmbXFjX3N0YXRlc1s1XSwgJm1xY19zdGF0ZXNbMTNdfSwKKyAgICB7MHgxODAxLCAwLCAmbXFjX3N0YXRlc1s2XSwgJm1xY19zdGF0ZXNbMThdfSwKKyAgICB7MHgxODAxLCAxLCAmbXFjX3N0YXRlc1s3XSwgJm1xY19zdGF0ZXNbMTldfSwKKyAgICB7MHgwYWMxLCAwLCAmbXFjX3N0YXRlc1s4XSwgJm1xY19zdGF0ZXNbMjRdfSwKKyAgICB7MHgwYWMxLCAxLCAmbXFjX3N0YXRlc1s5XSwgJm1xY19zdGF0ZXNbMjVdfSwKKyAgICB7MHgwNTIxLCAwLCAmbXFjX3N0YXRlc1sxMF0sICZtcWNfc3RhdGVzWzU4XX0sCisgICAgezB4MDUyMSwgMSwgJm1xY19zdGF0ZXNbMTFdLCAmbXFjX3N0YXRlc1s1OV19LAorICAgIHsweDAyMjEsIDAsICZtcWNfc3RhdGVzWzc2XSwgJm1xY19zdGF0ZXNbNjZdfSwKKyAgICB7MHgwMjIxLCAxLCAmbXFjX3N0YXRlc1s3N10sICZtcWNfc3RhdGVzWzY3XX0sCisgICAgezB4NTYwMSwgMCwgJm1xY19zdGF0ZXNbMTRdLCAmbXFjX3N0YXRlc1sxM119LAorICAgIHsweDU2MDEsIDEsICZtcWNfc3RhdGVzWzE1XSwgJm1xY19zdGF0ZXNbMTJdfSwKKyAgICB7MHg1NDAxLCAwLCAmbXFjX3N0YXRlc1sxNl0sICZtcWNfc3RhdGVzWzI4XX0sCisgICAgezB4NTQwMSwgMSwgJm1xY19zdGF0ZXNbMTddLCAmbXFjX3N0YXRlc1syOV19LAorICAgIHsweDQ4MDEsIDAsICZtcWNfc3RhdGVzWzE4XSwgJm1xY19zdGF0ZXNbMjhdfSwKKyAgICB7MHg0ODAxLCAxLCAmbXFjX3N0YXRlc1sxOV0sICZtcWNfc3RhdGVzWzI5XX0sCisgICAgezB4MzgwMSwgMCwgJm1xY19zdGF0ZXNbMjBdLCAmbXFjX3N0YXRlc1syOF19LAorICAgIHsweDM4MDEsIDEsICZtcWNfc3RhdGVzWzIxXSwgJm1xY19zdGF0ZXNbMjldfSwKKyAgICB7MHgzMDAxLCAwLCAmbXFjX3N0YXRlc1syMl0sICZtcWNfc3RhdGVzWzM0XX0sCisgICAgezB4MzAwMSwgMSwgJm1xY19zdGF0ZXNbMjNdLCAmbXFjX3N0YXRlc1szNV19LAorICAgIHsweDI0MDEsIDAsICZtcWNfc3RhdGVzWzI0XSwgJm1xY19zdGF0ZXNbMzZdfSwKKyAgICB7MHgyNDAxLCAxLCAmbXFjX3N0YXRlc1syNV0sICZtcWNfc3RhdGVzWzM3XX0sCisgICAgezB4MWMwMSwgMCwgJm1xY19zdGF0ZXNbMjZdLCAmbXFjX3N0YXRlc1s0MF19LAorICAgIHsweDFjMDEsIDEsICZtcWNfc3RhdGVzWzI3XSwgJm1xY19zdGF0ZXNbNDFdfSwKKyAgICB7MHgxNjAxLCAwLCAmbXFjX3N0YXRlc1s1OF0sICZtcWNfc3RhdGVzWzQyXX0sCisgICAgezB4MTYwMSwgMSwgJm1xY19zdGF0ZXNbNTldLCAmbXFjX3N0YXRlc1s0M119LAorICAgIHsweDU2MDEsIDAsICZtcWNfc3RhdGVzWzMwXSwgJm1xY19zdGF0ZXNbMjldfSwKKyAgICB7MHg1NjAxLCAxLCAmbXFjX3N0YXRlc1szMV0sICZtcWNfc3RhdGVzWzI4XX0sCisgICAgezB4NTQwMSwgMCwgJm1xY19zdGF0ZXNbMzJdLCAmbXFjX3N0YXRlc1syOF19LAorICAgIHsweDU0MDEsIDEsICZtcWNfc3RhdGVzWzMzXSwgJm1xY19zdGF0ZXNbMjldfSwKKyAgICB7MHg1MTAxLCAwLCAmbXFjX3N0YXRlc1szNF0sICZtcWNfc3RhdGVzWzMwXX0sCisgICAgezB4NTEwMSwgMSwgJm1xY19zdGF0ZXNbMzVdLCAmbXFjX3N0YXRlc1szMV19LAorICAgIHsweDQ4MDEsIDAsICZtcWNfc3RhdGVzWzM2XSwgJm1xY19zdGF0ZXNbMzJdfSwKKyAgICB7MHg0ODAxLCAxLCAmbXFjX3N0YXRlc1szN10sICZtcWNfc3RhdGVzWzMzXX0sCisgICAgezB4MzgwMSwgMCwgJm1xY19zdGF0ZXNbMzhdLCAmbXFjX3N0YXRlc1szNF19LAorICAgIHsweDM4MDEsIDEsICZtcWNfc3RhdGVzWzM5XSwgJm1xY19zdGF0ZXNbMzVdfSwKKyAgICB7MHgzNDAxLCAwLCAmbXFjX3N0YXRlc1s0MF0sICZtcWNfc3RhdGVzWzM2XX0sCisgICAgezB4MzQwMSwgMSwgJm1xY19zdGF0ZXNbNDFdLCAmbXFjX3N0YXRlc1szN119LAorICAgIHsweDMwMDEsIDAsICZtcWNfc3RhdGVzWzQyXSwgJm1xY19zdGF0ZXNbMzhdfSwKKyAgICB7MHgzMDAxLCAxLCAmbXFjX3N0YXRlc1s0M10sICZtcWNfc3RhdGVzWzM5XX0sCisgICAgezB4MjgwMSwgMCwgJm1xY19zdGF0ZXNbNDRdLCAmbXFjX3N0YXRlc1szOF19LAorICAgIHsweDI4MDEsIDEsICZtcWNfc3RhdGVzWzQ1XSwgJm1xY19zdGF0ZXNbMzldfSwKKyAgICB7MHgyNDAxLCAwLCAmbXFjX3N0YXRlc1s0Nl0sICZtcWNfc3RhdGVzWzQwXX0sCisgICAgezB4MjQwMSwgMSwgJm1xY19zdGF0ZXNbNDddLCAmbXFjX3N0YXRlc1s0MV19LAorICAgIHsweDIyMDEsIDAsICZtcWNfc3RhdGVzWzQ4XSwgJm1xY19zdGF0ZXNbNDJdfSwKKyAgICB7MHgyMjAxLCAxLCAmbXFjX3N0YXRlc1s0OV0sICZtcWNfc3RhdGVzWzQzXX0sCisgICAgezB4MWMwMSwgMCwgJm1xY19zdGF0ZXNbNTBdLCAmbXFjX3N0YXRlc1s0NF19LAorICAgIHsweDFjMDEsIDEsICZtcWNfc3RhdGVzWzUxXSwgJm1xY19zdGF0ZXNbNDVdfSwKKyAgICB7MHgxODAxLCAwLCAmbXFjX3N0YXRlc1s1Ml0sICZtcWNfc3RhdGVzWzQ2XX0sCisgICAgezB4MTgwMSwgMSwgJm1xY19zdGF0ZXNbNTNdLCAmbXFjX3N0YXRlc1s0N119LAorICAgIHsweDE2MDEsIDAsICZtcWNfc3RhdGVzWzU0XSwgJm1xY19zdGF0ZXNbNDhdfSwKKyAgICB7MHgxNjAxLCAxLCAmbXFjX3N0YXRlc1s1NV0sICZtcWNfc3RhdGVzWzQ5XX0sCisgICAgezB4MTQwMSwgMCwgJm1xY19zdGF0ZXNbNTZdLCAmbXFjX3N0YXRlc1s1MF19LAorICAgIHsweDE0MDEsIDEsICZtcWNfc3RhdGVzWzU3XSwgJm1xY19zdGF0ZXNbNTFdfSwKKyAgICB7MHgxMjAxLCAwLCAmbXFjX3N0YXRlc1s1OF0sICZtcWNfc3RhdGVzWzUyXX0sCisgICAgezB4MTIwMSwgMSwgJm1xY19zdGF0ZXNbNTldLCAmbXFjX3N0YXRlc1s1M119LAorICAgIHsweDExMDEsIDAsICZtcWNfc3RhdGVzWzYwXSwgJm1xY19zdGF0ZXNbNTRdfSwKKyAgICB7MHgxMTAxLCAxLCAmbXFjX3N0YXRlc1s2MV0sICZtcWNfc3RhdGVzWzU1XX0sCisgICAgezB4MGFjMSwgMCwgJm1xY19zdGF0ZXNbNjJdLCAmbXFjX3N0YXRlc1s1Nl19LAorICAgIHsweDBhYzEsIDEsICZtcWNfc3RhdGVzWzYzXSwgJm1xY19zdGF0ZXNbNTddfSwKKyAgICB7MHgwOWMxLCAwLCAmbXFjX3N0YXRlc1s2NF0sICZtcWNfc3RhdGVzWzU4XX0sCisgICAgezB4MDljMSwgMSwgJm1xY19zdGF0ZXNbNjVdLCAmbXFjX3N0YXRlc1s1OV19LAorICAgIHsweDA4YTEsIDAsICZtcWNfc3RhdGVzWzY2XSwgJm1xY19zdGF0ZXNbNjBdfSwKKyAgICB7MHgwOGExLCAxLCAmbXFjX3N0YXRlc1s2N10sICZtcWNfc3RhdGVzWzYxXX0sCisgICAgezB4MDUyMSwgMCwgJm1xY19zdGF0ZXNbNjhdLCAmbXFjX3N0YXRlc1s2Ml19LAorICAgIHsweDA1MjEsIDEsICZtcWNfc3RhdGVzWzY5XSwgJm1xY19zdGF0ZXNbNjNdfSwKKyAgICB7MHgwNDQxLCAwLCAmbXFjX3N0YXRlc1s3MF0sICZtcWNfc3RhdGVzWzY0XX0sCisgICAgezB4MDQ0MSwgMSwgJm1xY19zdGF0ZXNbNzFdLCAmbXFjX3N0YXRlc1s2NV19LAorICAgIHsweDAyYTEsIDAsICZtcWNfc3RhdGVzWzcyXSwgJm1xY19zdGF0ZXNbNjZdfSwKKyAgICB7MHgwMmExLCAxLCAmbXFjX3N0YXRlc1s3M10sICZtcWNfc3RhdGVzWzY3XX0sCisgICAgezB4MDIyMSwgMCwgJm1xY19zdGF0ZXNbNzRdLCAmbXFjX3N0YXRlc1s2OF19LAorICAgIHsweDAyMjEsIDEsICZtcWNfc3RhdGVzWzc1XSwgJm1xY19zdGF0ZXNbNjldfSwKKyAgICB7MHgwMTQxLCAwLCAmbXFjX3N0YXRlc1s3Nl0sICZtcWNfc3RhdGVzWzcwXX0sCisgICAgezB4MDE0MSwgMSwgJm1xY19zdGF0ZXNbNzddLCAmbXFjX3N0YXRlc1s3MV19LAorICAgIHsweDAxMTEsIDAsICZtcWNfc3RhdGVzWzc4XSwgJm1xY19zdGF0ZXNbNzJdfSwKKyAgICB7MHgwMTExLCAxLCAmbXFjX3N0YXRlc1s3OV0sICZtcWNfc3RhdGVzWzczXX0sCisgICAgezB4MDA4NSwgMCwgJm1xY19zdGF0ZXNbODBdLCAmbXFjX3N0YXRlc1s3NF19LAorICAgIHsweDAwODUsIDEsICZtcWNfc3RhdGVzWzgxXSwgJm1xY19zdGF0ZXNbNzVdfSwKKyAgICB7MHgwMDQ5LCAwLCAmbXFjX3N0YXRlc1s4Ml0sICZtcWNfc3RhdGVzWzc2XX0sCisgICAgezB4MDA0OSwgMSwgJm1xY19zdGF0ZXNbODNdLCAmbXFjX3N0YXRlc1s3N119LAorICAgIHsweDAwMjUsIDAsICZtcWNfc3RhdGVzWzg0XSwgJm1xY19zdGF0ZXNbNzhdfSwKKyAgICB7MHgwMDI1LCAxLCAmbXFjX3N0YXRlc1s4NV0sICZtcWNfc3RhdGVzWzc5XX0sCisgICAgezB4MDAxNSwgMCwgJm1xY19zdGF0ZXNbODZdLCAmbXFjX3N0YXRlc1s4MF19LAorICAgIHsweDAwMTUsIDEsICZtcWNfc3RhdGVzWzg3XSwgJm1xY19zdGF0ZXNbODFdfSwKKyAgICB7MHgwMDA5LCAwLCAmbXFjX3N0YXRlc1s4OF0sICZtcWNfc3RhdGVzWzgyXX0sCisgICAgezB4MDAwOSwgMSwgJm1xY19zdGF0ZXNbODldLCAmbXFjX3N0YXRlc1s4M119LAorICAgIHsweDAwMDUsIDAsICZtcWNfc3RhdGVzWzkwXSwgJm1xY19zdGF0ZXNbODRdfSwKKyAgICB7MHgwMDA1LCAxLCAmbXFjX3N0YXRlc1s5MV0sICZtcWNfc3RhdGVzWzg1XX0sCisgICAgezB4MDAwMSwgMCwgJm1xY19zdGF0ZXNbOTBdLCAmbXFjX3N0YXRlc1s4Nl19LAorICAgIHsweDAwMDEsIDEsICZtcWNfc3RhdGVzWzkxXSwgJm1xY19zdGF0ZXNbODddfSwKKyAgICB7MHg1NjAxLCAwLCAmbXFjX3N0YXRlc1s5Ml0sICZtcWNfc3RhdGVzWzkyXX0sCisgICAgezB4NTYwMSwgMSwgJm1xY19zdGF0ZXNbOTNdLCAmbXFjX3N0YXRlc1s5M119LAogfTsKIAotLyogCisvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgbG9jYWwgZnVuY3Rpb25zCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwogCi1zdGF0aWMgdm9pZCBvcGpfbXFjX2J5dGVvdXQob3BqX21xY190ICptcWMpIHsKLQlpZiAoKm1xYy0+YnAgPT0gMHhmZikgewotCQltcWMtPmJwKys7Ci0JCSptcWMtPmJwID0gKE9QSl9CWVRFKShtcWMtPmMgPj4gMjApOwotCQltcWMtPmMgJj0gMHhmZmZmZjsKLQkJbXFjLT5jdCA9IDc7Ci0JfSBlbHNlIHsKLQkJaWYgKChtcWMtPmMgJiAweDgwMDAwMDApID09IDApIHsJLyogKChtcWMtPmMmMHg4MDAwMDAwKT09MCkgQ0hBTkdFICovCi0JCQltcWMtPmJwKys7Ci0JCQkqbXFjLT5icCA9IChPUEpfQllURSkobXFjLT5jID4+IDE5KTsKLQkJCW1xYy0+YyAmPSAweDdmZmZmOwotCQkJbXFjLT5jdCA9IDg7Ci0JCX0gZWxzZSB7Ci0JCQkoKm1xYy0+YnApKys7Ci0JCQlpZiAoKm1xYy0+YnAgPT0gMHhmZikgewotCQkJCW1xYy0+YyAmPSAweDdmZmZmZmY7Ci0JCQkJbXFjLT5icCsrOwotCQkJCSptcWMtPmJwID0gKE9QSl9CWVRFKShtcWMtPmMgPj4gMjApOwotCQkJCW1xYy0+YyAmPSAweGZmZmZmOwotCQkJCW1xYy0+Y3QgPSA3OwotCQkJfSBlbHNlIHsKLQkJCQltcWMtPmJwKys7Ci0JCQkJKm1xYy0+YnAgPSAoT1BKX0JZVEUpKG1xYy0+YyA+PiAxOSk7Ci0JCQkJbXFjLT5jICY9IDB4N2ZmZmY7Ci0JCQkJbXFjLT5jdCA9IDg7Ci0JCQl9Ci0JCX0KLQl9CitzdGF0aWMgdm9pZCBvcGpfbXFjX2J5dGVvdXQob3BqX21xY190ICptcWMpCit7CisgICAgLyogYnAgaXMgaW5pdGlhbGl6ZWQgdG8gc3RhcnQgLSAxIGluIG9wal9tcWNfaW5pdF9lbmMoKSAqLworICAgIC8qIGJ1dCB0aGlzIGlzIHNhZmUsIHNlZSBvcGpfdGNkX2NvZGVfYmxvY2tfZW5jX2FsbG9jYXRlX2RhdGEoKSAqLworICAgIGFzc2VydChtcWMtPmJwID49IG1xYy0+c3RhcnQgLSAxKTsKKyAgICBpZiAoKm1xYy0+YnAgPT0gMHhmZikgeworICAgICAgICBtcWMtPmJwKys7CisgICAgICAgICptcWMtPmJwID0gKE9QSl9CWVRFKShtcWMtPmMgPj4gMjApOworICAgICAgICBtcWMtPmMgJj0gMHhmZmZmZjsKKyAgICAgICAgbXFjLT5jdCA9IDc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChtcWMtPmMgJiAweDgwMDAwMDApID09IDApIHsKKyAgICAgICAgICAgIG1xYy0+YnArKzsKKyAgICAgICAgICAgICptcWMtPmJwID0gKE9QSl9CWVRFKShtcWMtPmMgPj4gMTkpOworICAgICAgICAgICAgbXFjLT5jICY9IDB4N2ZmZmY7CisgICAgICAgICAgICBtcWMtPmN0ID0gODsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICgqbXFjLT5icCkrKzsKKyAgICAgICAgICAgIGlmICgqbXFjLT5icCA9PSAweGZmKSB7CisgICAgICAgICAgICAgICAgbXFjLT5jICY9IDB4N2ZmZmZmZjsKKyAgICAgICAgICAgICAgICBtcWMtPmJwKys7CisgICAgICAgICAgICAgICAgKm1xYy0+YnAgPSAoT1BKX0JZVEUpKG1xYy0+YyA+PiAyMCk7CisgICAgICAgICAgICAgICAgbXFjLT5jICY9IDB4ZmZmZmY7CisgICAgICAgICAgICAgICAgbXFjLT5jdCA9IDc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1xYy0+YnArKzsKKyAgICAgICAgICAgICAgICAqbXFjLT5icCA9IChPUEpfQllURSkobXFjLT5jID4+IDE5KTsKKyAgICAgICAgICAgICAgICBtcWMtPmMgJj0gMHg3ZmZmZjsKKyAgICAgICAgICAgICAgICBtcWMtPmN0ID0gODsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIH0KIAotc3RhdGljIHZvaWQgb3BqX21xY19yZW5vcm1lKG9wal9tcWNfdCAqbXFjKSB7Ci0JZG8gewotCQltcWMtPmEgPDw9IDE7Ci0JCW1xYy0+YyA8PD0gMTsKLQkJbXFjLT5jdC0tOwotCQlpZiAobXFjLT5jdCA9PSAwKSB7Ci0JCQlvcGpfbXFjX2J5dGVvdXQobXFjKTsKLQkJfQotCX0gd2hpbGUgKChtcWMtPmEgJiAweDgwMDApID09IDApOworc3RhdGljIHZvaWQgb3BqX21xY19yZW5vcm1lKG9wal9tcWNfdCAqbXFjKQoreworICAgIGRvIHsKKyAgICAgICAgbXFjLT5hIDw8PSAxOworICAgICAgICBtcWMtPmMgPDw9IDE7CisgICAgICAgIG1xYy0+Y3QtLTsKKyAgICAgICAgaWYgKG1xYy0+Y3QgPT0gMCkgeworICAgICAgICAgICAgb3BqX21xY19ieXRlb3V0KG1xYyk7CisgICAgICAgIH0KKyAgICB9IHdoaWxlICgobXFjLT5hICYgMHg4MDAwKSA9PSAwKTsKIH0KIAotc3RhdGljIHZvaWQgb3BqX21xY19jb2RlbXBzKG9wal9tcWNfdCAqbXFjKSB7Ci0JbXFjLT5hIC09ICgqbXFjLT5jdXJjdHgpLT5xZXZhbDsKLQlpZiAoKG1xYy0+YSAmIDB4ODAwMCkgPT0gMCkgewotCQlpZiAobXFjLT5hIDwgKCptcWMtPmN1cmN0eCktPnFldmFsKSB7Ci0JCQltcWMtPmEgPSAoKm1xYy0+Y3VyY3R4KS0+cWV2YWw7Ci0JCX0gZWxzZSB7Ci0JCQltcWMtPmMgKz0gKCptcWMtPmN1cmN0eCktPnFldmFsOwotCQl9Ci0JCSptcWMtPmN1cmN0eCA9ICgqbXFjLT5jdXJjdHgpLT5ubXBzOwotCQlvcGpfbXFjX3Jlbm9ybWUobXFjKTsKLQl9IGVsc2UgewotCQltcWMtPmMgKz0gKCptcWMtPmN1cmN0eCktPnFldmFsOwotCX0KK3N0YXRpYyB2b2lkIG9wal9tcWNfY29kZW1wcyhvcGpfbXFjX3QgKm1xYykKK3sKKyAgICBtcWMtPmEgLT0gKCptcWMtPmN1cmN0eCktPnFldmFsOworICAgIGlmICgobXFjLT5hICYgMHg4MDAwKSA9PSAwKSB7CisgICAgICAgIGlmIChtcWMtPmEgPCAoKm1xYy0+Y3VyY3R4KS0+cWV2YWwpIHsKKyAgICAgICAgICAgIG1xYy0+YSA9ICgqbXFjLT5jdXJjdHgpLT5xZXZhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1xYy0+YyArPSAoKm1xYy0+Y3VyY3R4KS0+cWV2YWw7CisgICAgICAgIH0KKyAgICAgICAgKm1xYy0+Y3VyY3R4ID0gKCptcWMtPmN1cmN0eCktPm5tcHM7CisgICAgICAgIG9wal9tcWNfcmVub3JtZShtcWMpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1xYy0+YyArPSAoKm1xYy0+Y3VyY3R4KS0+cWV2YWw7CisgICAgfQogfQogCi1zdGF0aWMgdm9pZCBvcGpfbXFjX2NvZGVscHMob3BqX21xY190ICptcWMpIHsKLQltcWMtPmEgLT0gKCptcWMtPmN1cmN0eCktPnFldmFsOwotCWlmIChtcWMtPmEgPCAoKm1xYy0+Y3VyY3R4KS0+cWV2YWwpIHsKLQkJbXFjLT5jICs9ICgqbXFjLT5jdXJjdHgpLT5xZXZhbDsKLQl9IGVsc2UgewotCQltcWMtPmEgPSAoKm1xYy0+Y3VyY3R4KS0+cWV2YWw7Ci0JfQotCSptcWMtPmN1cmN0eCA9ICgqbXFjLT5jdXJjdHgpLT5ubHBzOwotCW9wal9tcWNfcmVub3JtZShtcWMpOworc3RhdGljIHZvaWQgb3BqX21xY19jb2RlbHBzKG9wal9tcWNfdCAqbXFjKQoreworICAgIG1xYy0+YSAtPSAoKm1xYy0+Y3VyY3R4KS0+cWV2YWw7CisgICAgaWYgKG1xYy0+YSA8ICgqbXFjLT5jdXJjdHgpLT5xZXZhbCkgeworICAgICAgICBtcWMtPmMgKz0gKCptcWMtPmN1cmN0eCktPnFldmFsOworICAgIH0gZWxzZSB7CisgICAgICAgIG1xYy0+YSA9ICgqbXFjLT5jdXJjdHgpLT5xZXZhbDsKKyAgICB9CisgICAgKm1xYy0+Y3VyY3R4ID0gKCptcWMtPmN1cmN0eCktPm5scHM7CisgICAgb3BqX21xY19yZW5vcm1lKG1xYyk7CiB9CiAKLXN0YXRpYyB2b2lkIG9wal9tcWNfc2V0Yml0cyhvcGpfbXFjX3QgKm1xYykgewotCU9QSl9VSU5UMzIgdGVtcGMgPSBtcWMtPmMgKyBtcWMtPmE7Ci0JbXFjLT5jIHw9IDB4ZmZmZjsKLQlpZiAobXFjLT5jID49IHRlbXBjKSB7Ci0JCW1xYy0+YyAtPSAweDgwMDA7Ci0JfQorc3RhdGljIHZvaWQgb3BqX21xY19zZXRiaXRzKG9wal9tcWNfdCAqbXFjKQoreworICAgIE9QSl9VSU5UMzIgdGVtcGMgPSBtcWMtPmMgKyBtcWMtPmE7CisgICAgbXFjLT5jIHw9IDB4ZmZmZjsKKyAgICBpZiAobXFjLT5jID49IHRlbXBjKSB7CisgICAgICAgIG1xYy0+YyAtPSAweDgwMDA7CisgICAgfQogfQogCi1zdGF0aWMgSU5MSU5FIE9QSl9JTlQzMiBvcGpfbXFjX21wc2V4Y2hhbmdlKG9wal9tcWNfdCAqY29uc3QgbXFjKSB7Ci0JT1BKX0lOVDMyIGQ7Ci0JaWYgKG1xYy0+YSA8ICgqbXFjLT5jdXJjdHgpLT5xZXZhbCkgewotCQlkID0gKE9QSl9JTlQzMikoMSAtICgqbXFjLT5jdXJjdHgpLT5tcHMpOwotCQkqbXFjLT5jdXJjdHggPSAoKm1xYy0+Y3VyY3R4KS0+bmxwczsKLQl9IGVsc2UgewotCQlkID0gKE9QSl9JTlQzMikoKm1xYy0+Y3VyY3R4KS0+bXBzOwotCQkqbXFjLT5jdXJjdHggPSAoKm1xYy0+Y3VyY3R4KS0+bm1wczsKLQl9Ci0JCi0JcmV0dXJuIGQ7Ci19Ci0KLXN0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9tcWNfbHBzZXhjaGFuZ2Uob3BqX21xY190ICpjb25zdCBtcWMpIHsKLQlPUEpfSU5UMzIgZDsKLQlpZiAobXFjLT5hIDwgKCptcWMtPmN1cmN0eCktPnFldmFsKSB7Ci0JCW1xYy0+YSA9ICgqbXFjLT5jdXJjdHgpLT5xZXZhbDsKLQkJZCA9IChPUEpfSU5UMzIpKCptcWMtPmN1cmN0eCktPm1wczsKLQkJKm1xYy0+Y3VyY3R4ID0gKCptcWMtPmN1cmN0eCktPm5tcHM7Ci0JfSBlbHNlIHsKLQkJbXFjLT5hID0gKCptcWMtPmN1cmN0eCktPnFldmFsOwotCQlkID0gKE9QSl9JTlQzMikoMSAtICgqbXFjLT5jdXJjdHgpLT5tcHMpOwotCQkqbXFjLT5jdXJjdHggPSAoKm1xYy0+Y3VyY3R4KS0+bmxwczsKLQl9Ci0JCi0JcmV0dXJuIGQ7Ci19Ci0KLSNpZmRlZiBNUUNfUEVSRl9PUFQKLXN0YXRpYyBJTkxJTkUgdm9pZCBvcGpfbXFjX2J5dGVpbihvcGpfbXFjX3QgKmNvbnN0IG1xYykgewotCXVuc2lnbmVkIGludCBpID0gKigodW5zaWduZWQgaW50ICopIG1xYy0+YnApOwotCW1xYy0+YyArPSBpICYgMHhmZmZmMDA7Ci0JbXFjLT5jdCA9IGkgJiAweDBmOwotCW1xYy0+YnAgKz0gKGkgPj4gMikgJiAweDA0OwotfQotI2Vsc2UKLXN0YXRpYyB2b2lkIG9wal9tcWNfYnl0ZWluKG9wal9tcWNfdCAqY29uc3QgbXFjKSB7Ci0JaWYgKG1xYy0+YnAgIT0gbXFjLT5lbmQpIHsKLQkJT1BKX1VJTlQzMiBjOwotCQlpZiAobXFjLT5icCArIDEgIT0gbXFjLT5lbmQpIHsKLQkJCWMgPSAqKG1xYy0+YnAgKyAxKTsKLQkJfSBlbHNlIHsKLQkJCWMgPSAweGZmOwotCQl9Ci0JCWlmICgqbXFjLT5icCA9PSAweGZmKSB7Ci0JCQlpZiAoYyA+IDB4OGYpIHsKLQkJCQltcWMtPmMgKz0gMHhmZjAwOwotCQkJCW1xYy0+Y3QgPSA4OwotCQkJfSBlbHNlIHsKLQkJCQltcWMtPmJwKys7Ci0JCQkJbXFjLT5jICs9IGMgPDwgOTsKLQkJCQltcWMtPmN0ID0gNzsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW1xYy0+YnArKzsKLQkJCW1xYy0+YyArPSBjIDw8IDg7Ci0JCQltcWMtPmN0ID0gODsKLQkJfQotCX0gZWxzZSB7Ci0JCW1xYy0+YyArPSAweGZmMDA7Ci0JCW1xYy0+Y3QgPSA4OwotCX0KLX0KLSNlbmRpZgotCi1zdGF0aWMgSU5MSU5FIHZvaWQgb3BqX21xY19yZW5vcm1kKG9wal9tcWNfdCAqY29uc3QgbXFjKSB7Ci0JZG8gewotCQlpZiAobXFjLT5jdCA9PSAwKSB7Ci0JCQlvcGpfbXFjX2J5dGVpbihtcWMpOwotCQl9Ci0JCW1xYy0+YSA8PD0gMTsKLQkJbXFjLT5jIDw8PSAxOwotCQltcWMtPmN0LS07Ci0JfSB3aGlsZSAobXFjLT5hIDwgMHg4MDAwKTsKLX0KLQotLyogCisvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgTVEtQ29kZXIgaW50ZXJmYWNlCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwogCi1vcGpfbXFjX3QqIG9wal9tcWNfY3JlYXRlKHZvaWQpIHsKLQlvcGpfbXFjX3QgKm1xYyA9IChvcGpfbXFjX3QqKW9wal9tYWxsb2Moc2l6ZW9mKG9wal9tcWNfdCkpOwotI2lmZGVmIE1RQ19QRVJGX09QVAotCWlmIChtcWMpIHsKLQkJbXFjLT5idWZmZXIgPSBOVUxMOwotCX0KLSNlbmRpZgotCXJldHVybiBtcWM7Ci19Ci0KLXZvaWQgb3BqX21xY19kZXN0cm95KG9wal9tcWNfdCAqbXFjKSB7Ci0JaWYobXFjKSB7Ci0jaWZkZWYgTVFDX1BFUkZfT1BUCi0JCWlmIChtcWMtPmJ1ZmZlcikgewotCQkJb3BqX2ZyZWUobXFjLT5idWZmZXIpOwotCQl9Ci0jZW5kaWYKLQkJb3BqX2ZyZWUobXFjKTsKLQl9Ci19Ci0KLU9QSl9VSU5UMzIgb3BqX21xY19udW1ieXRlcyhvcGpfbXFjX3QgKm1xYykgewotCWNvbnN0IHB0cmRpZmZfdCBkaWZmID0gbXFjLT5icCAtIG1xYy0+c3RhcnQ7CitPUEpfVUlOVDMyIG9wal9tcWNfbnVtYnl0ZXMob3BqX21xY190ICptcWMpCit7CisgICAgY29uc3QgcHRyZGlmZl90IGRpZmYgPSBtcWMtPmJwIC0gbXFjLT5zdGFydDsKICNpZiAwCi0gIGFzc2VydCggZGlmZiA8PSAweGZmZmZmZmZmICYmIGRpZmYgPj0gMCApOyAvKiBVSU5UMzJfTUFYICovCisgICAgYXNzZXJ0KGRpZmYgPD0gMHhmZmZmZmZmZiAmJiBkaWZmID49IDApOyAgIC8qIFVJTlQzMl9NQVggKi8KICNlbmRpZgotCXJldHVybiAoT1BKX1VJTlQzMilkaWZmOworICAgIHJldHVybiAoT1BKX1VJTlQzMilkaWZmOwogfQogCi12b2lkIG9wal9tcWNfaW5pdF9lbmMob3BqX21xY190ICptcWMsIE9QSl9CWVRFICpicCkgewotICAgIC8qIFRPRE8gTVNEOiBuZWVkIHRvIHRha2UgYSBsb29rIHRvIHRoZSB2MiB2ZXJzaW9uICovCi0Jb3BqX21xY19zZXRjdXJjdHgobXFjLCAwKTsKLQltcWMtPmEgPSAweDgwMDA7Ci0JbXFjLT5jID0gMDsKLQltcWMtPmJwID0gYnAgLSAxOwotCW1xYy0+Y3QgPSAxMjsKLQlpZiAoKm1xYy0+YnAgPT0gMHhmZikgewotCQltcWMtPmN0ID0gMTM7Ci0JfQotCW1xYy0+c3RhcnQgPSBicDsKK3ZvaWQgb3BqX21xY19pbml0X2VuYyhvcGpfbXFjX3QgKm1xYywgT1BKX0JZVEUgKmJwKQoreworICAgIC8qIFRvIGF2b2lkIHRoZSBjdXJjdHggcG9pbnRlciB0byBiZSBkYW5nbGluZywgYnV0IG5vdCBzdHJpY3RseSAqLworICAgIC8qIHJlcXVpcmVkIGFzIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgYWx3YXlzIHNldCBiZWZvcmUgZW5jb2RpbmcgKi8KKyAgICBvcGpfbXFjX3NldGN1cmN0eChtcWMsIDApOworCisgICAgLyogQXMgc3BlY2lmaWVkIGluIEZpZ3VyZSBDLjEwIC0gSW5pdGlhbGl6YXRpb24gb2YgdGhlIGVuY29kZXIgKi8KKyAgICAvKiAoQy4yLjggSW5pdGlhbGl6YXRpb24gb2YgdGhlIGVuY29kZXIgKElOSVRFTkMpKSAqLworICAgIG1xYy0+YSA9IDB4ODAwMDsKKyAgICBtcWMtPmMgPSAwOworICAgIC8qIFllcywgd2UgcG9pbnQgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyLCBidXQgdGhpcyBpcyBzYWZlICovCisgICAgLyogZ2l2ZW4gb3BqX3RjZF9jb2RlX2Jsb2NrX2VuY19hbGxvY2F0ZV9kYXRhKCkgKi8KKyAgICBtcWMtPmJwID0gYnAgLSAxOworICAgIG1xYy0+Y3QgPSAxMjsKKyAgICAvKiBBdCB0aGlzIHBvaW50IHdlIHNob3VsZCB0ZXN0ICoobXFjLT5icCkgYWdhaW5zdCAweEZGLCBidXQgdGhpcyBpcyBub3QgKi8KKyAgICAvKiBuZWNlc3NhcnksIGFzIHRoaXMgaXMgb25seSB1c2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvZGUgYmxvY2sgKi8KKyAgICAvKiBhbmQgb3VyIGluaXRpYWwgZmFrZSBieXRlIGlzIHNldCBhdCAwICovCisgICAgYXNzZXJ0KCoobXFjLT5icCkgIT0gMHhmZik7CisKKyAgICBtcWMtPnN0YXJ0ID0gYnA7CisgICAgbXFjLT5lbmRfb2ZfYnl0ZV9zdHJlYW1fY291bnRlciA9IDA7CiB9CiAKLXZvaWQgb3BqX21xY19lbmNvZGUob3BqX21xY190ICptcWMsIE9QSl9VSU5UMzIgZCkgewotCWlmICgoKm1xYy0+Y3VyY3R4KS0+bXBzID09IGQpIHsKLQkJb3BqX21xY19jb2RlbXBzKG1xYyk7Ci0JfSBlbHNlIHsKLQkJb3BqX21xY19jb2RlbHBzKG1xYyk7Ci0JfQordm9pZCBvcGpfbXFjX2VuY29kZShvcGpfbXFjX3QgKm1xYywgT1BKX1VJTlQzMiBkKQoreworICAgIGlmICgoKm1xYy0+Y3VyY3R4KS0+bXBzID09IGQpIHsKKyAgICAgICAgb3BqX21xY19jb2RlbXBzKG1xYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3BqX21xY19jb2RlbHBzKG1xYyk7CisgICAgfQogfQogCi12b2lkIG9wal9tcWNfZmx1c2gob3BqX21xY190ICptcWMpIHsKLQlvcGpfbXFjX3NldGJpdHMobXFjKTsKLQltcWMtPmMgPDw9IG1xYy0+Y3Q7Ci0Jb3BqX21xY19ieXRlb3V0KG1xYyk7Ci0JbXFjLT5jIDw8PSBtcWMtPmN0OwotCW9wal9tcWNfYnl0ZW91dChtcWMpOwotCQotCWlmICgqbXFjLT5icCAhPSAweGZmKSB7Ci0JCW1xYy0+YnArKzsKLQl9Cit2b2lkIG9wal9tcWNfZmx1c2gob3BqX21xY190ICptcWMpCit7CisgICAgLyogQy4yLjkgVGVybWluYXRpb24gb2YgY29kaW5nIChGTFVTSCkgKi8KKyAgICAvKiBGaWd1cmUgQy4xMSDigJMgRkxVU0ggcHJvY2VkdXJlICovCisgICAgb3BqX21xY19zZXRiaXRzKG1xYyk7CisgICAgbXFjLT5jIDw8PSBtcWMtPmN0OworICAgIG9wal9tcWNfYnl0ZW91dChtcWMpOworICAgIG1xYy0+YyA8PD0gbXFjLT5jdDsKKyAgICBvcGpfbXFjX2J5dGVvdXQobXFjKTsKKworICAgIC8qIEl0IGlzIGZvcmJpZGRlbiB0aGF0IGEgY29kaW5nIHBhc3MgZW5kcyB3aXRoIDB4ZmYgKi8KKyAgICBpZiAoKm1xYy0+YnAgIT0gMHhmZikgeworICAgICAgICAvKiBBZHZhbmNlIHBvaW50ZXIgc28gdGhhdCBvcGpfbXFjX251bWJ5dGVzKCkgcmV0dXJucyBhIHZhbGlkIHZhbHVlICovCisgICAgICAgIG1xYy0+YnArKzsKKyAgICB9CiB9CiAKLXZvaWQgb3BqX21xY19ieXBhc3NfaW5pdF9lbmMob3BqX21xY190ICptcWMpIHsKLQltcWMtPmMgPSAwOwotCW1xYy0+Y3QgPSA4OwotCS8qaWYgKCptcWMtPmJwID09IDB4ZmYpIHsKLQltcWMtPmN0ID0gNzsKLSAgICAgfSAqLworI2RlZmluZSBCWVBBU1NfQ1RfSU5JVCAgMHhERUFEQkVFRgorCit2b2lkIG9wal9tcWNfYnlwYXNzX2luaXRfZW5jKG9wal9tcWNfdCAqbXFjKQoreworICAgIC8qIFRoaXMgZnVuY3Rpb24gaXMgbm9ybWFsbHkgY2FsbGVkIGFmdGVyIGF0IGxlYXN0IG9uZSBvcGpfbXFjX2ZsdXNoKCkgKi8KKyAgICAvKiB3aGljaCB3aWxsIGhhdmUgYWR2YW5jZSBtcWMtPmJwIGJ5IGF0IGxlYXN0IDIgYnl0ZXMgYmV5b25kIGl0cyAqLworICAgIC8qIGluaXRpYWwgcG9zaXRpb24gKi8KKyAgICBhc3NlcnQobXFjLT5icCA+PSBtcWMtPnN0YXJ0KTsKKyAgICBtcWMtPmMgPSAwOworICAgIC8qIGluIHRoZW9yeSB3ZSBzaG91bGQgaW5pdGlhbGl6ZSB0byA4LCBidXQgdXNlIHRoaXMgc3BlY2lhbCB2YWx1ZSAqLworICAgIC8qIGFzIGEgaGludCB0aGF0IG9wal9tcWNfYnlwYXNzX2VuYygpIGhhcyBuZXZlciBiZWVuIGNhbGxlZCwgc28gKi8KKyAgICAvKiBhcyB0byBhdm9pZCB0aGUgMHhmZiAweDdmIGVsaW1pbmF0aW9uIHRyaWNrIGluIG9wal9tcWNfYnlwYXNzX2ZsdXNoX2VuYygpICovCisgICAgLyogdG8gdHJpZ2dlciB3aGVuIHdlIGRvbid0IGhhdmUgb3V0cHV0IGFueSBiaXQgZHVyaW5nIHRoaXMgYnlwYXNzIHNlcXVlbmNlICovCisgICAgLyogQW55IHZhbHVlID4gOCB3aWxsIGRvICovCisgICAgbXFjLT5jdCA9IEJZUEFTU19DVF9JTklUOworICAgIC8qIEdpdmVuIHRoYXQgd2UgYXJlIGNhbGxlZCBhZnRlciBvcGpfbXFjX2ZsdXNoKCksIHRoZSBwcmV2aW91cyBieXRlICovCisgICAgLyogY2Fubm90IGJlIDB4ZmYuICovCisgICAgYXNzZXJ0KG1xYy0+YnBbLTFdICE9IDB4ZmYpOwogfQogCi12b2lkIG9wal9tcWNfYnlwYXNzX2VuYyhvcGpfbXFjX3QgKm1xYywgT1BKX1VJTlQzMiBkKSB7Ci0JbXFjLT5jdC0tOwotCW1xYy0+YyA9IG1xYy0+YyArIChkIDw8IG1xYy0+Y3QpOwotCWlmIChtcWMtPmN0ID09IDApIHsKLQkJbXFjLT5icCsrOwotCQkqbXFjLT5icCA9IChPUEpfQllURSltcWMtPmM7Ci0JCW1xYy0+Y3QgPSA4OwotCQlpZiAoKm1xYy0+YnAgPT0gMHhmZikgewotCQkJbXFjLT5jdCA9IDc7Ci0JCX0KLQkJbXFjLT5jID0gMDsKLQl9Ci19Ci0KLU9QSl9VSU5UMzIgb3BqX21xY19ieXBhc3NfZmx1c2hfZW5jKG9wal9tcWNfdCAqbXFjKSB7Ci0JT1BKX0JZVEUgYml0X3BhZGRpbmc7Ci0JCi0JYml0X3BhZGRpbmcgPSAwOwotCQotCWlmIChtcWMtPmN0ICE9IDApIHsKLQkJd2hpbGUgKG1xYy0+Y3QgPiAwKSB7Ci0JCQltcWMtPmN0LS07Ci0JCQltcWMtPmMgKz0gKE9QSl9VSU5UMzIpKGJpdF9wYWRkaW5nIDw8IG1xYy0+Y3QpOwotCQkJYml0X3BhZGRpbmcgPSAoYml0X3BhZGRpbmcgKyAxKSAmIDB4MDE7Ci0JCX0KLQkJbXFjLT5icCsrOwotCQkqbXFjLT5icCA9IChPUEpfQllURSltcWMtPmM7Ci0JCW1xYy0+Y3QgPSA4OwotCQltcWMtPmMgPSAwOwotCX0KLQkKLQlyZXR1cm4gMTsKLX0KLQotdm9pZCBvcGpfbXFjX3Jlc2V0X2VuYyhvcGpfbXFjX3QgKm1xYykgewotCW9wal9tcWNfcmVzZXRzdGF0ZXMobXFjKTsKLQlvcGpfbXFjX3NldHN0YXRlKG1xYywgVDFfQ1RYTk9fVU5JLCAwLCA0Nik7Ci0Jb3BqX21xY19zZXRzdGF0ZShtcWMsIFQxX0NUWE5PX0FHRywgMCwgMyk7Ci0Jb3BqX21xY19zZXRzdGF0ZShtcWMsIFQxX0NUWE5PX1pDLCAwLCA0KTsKLX0KLQotT1BKX1VJTlQzMiBvcGpfbXFjX3Jlc3RhcnRfZW5jKG9wal9tcWNfdCAqbXFjKSB7Ci0JT1BKX1VJTlQzMiBjb3JyZWN0aW9uID0gMTsKLQkKLQkvKiA8Zmx1c2ggcGFydD4gKi8KLQlPUEpfSU5UMzIgbiA9IChPUEpfSU5UMzIpKDI3IC0gMTUgLSBtcWMtPmN0KTsKLQltcWMtPmMgPDw9IG1xYy0+Y3Q7Ci0Jd2hpbGUgKG4gPiAwKSB7Ci0JCW9wal9tcWNfYnl0ZW91dChtcWMpOwotCQluIC09IChPUEpfSU5UMzIpbXFjLT5jdDsKLQkJbXFjLT5jIDw8PSBtcWMtPmN0OwotCX0KLQlvcGpfbXFjX2J5dGVvdXQobXFjKTsKLQkKLQlyZXR1cm4gY29ycmVjdGlvbjsKLX0KLQotdm9pZCBvcGpfbXFjX3Jlc3RhcnRfaW5pdF9lbmMob3BqX21xY190ICptcWMpIHsKLQkvKiA8UmUtaW5pdCBwYXJ0PiAqLwotCW9wal9tcWNfc2V0Y3VyY3R4KG1xYywgMCk7Ci0JbXFjLT5hID0gMHg4MDAwOwotCW1xYy0+YyA9IDA7Ci0JbXFjLT5jdCA9IDEyOwotCW1xYy0+YnAtLTsKLQlpZiAoKm1xYy0+YnAgPT0gMHhmZikgewotCQltcWMtPmN0ID0gMTM7Ci0JfQotfQotCi12b2lkIG9wal9tcWNfZXJ0ZXJtX2VuYyhvcGpfbXFjX3QgKm1xYykgewotCU9QSl9JTlQzMiBrID0gKE9QSl9JTlQzMikoMTEgLSBtcWMtPmN0ICsgMSk7Ci0JCi0Jd2hpbGUgKGsgPiAwKSB7Ci0JCW1xYy0+YyA8PD0gbXFjLT5jdDsKLQkJbXFjLT5jdCA9IDA7Ci0JCW9wal9tcWNfYnl0ZW91dChtcWMpOwotCQlrIC09IChPUEpfSU5UMzIpbXFjLT5jdDsKLQl9Ci0JCi0JaWYgKCptcWMtPmJwICE9IDB4ZmYpIHsKLQkJb3BqX21xY19ieXRlb3V0KG1xYyk7Ci0JfQotfQotCi12b2lkIG9wal9tcWNfc2VnbWFya19lbmMob3BqX21xY190ICptcWMpIHsKLQlPUEpfVUlOVDMyIGk7Ci0Jb3BqX21xY19zZXRjdXJjdHgobXFjLCAxOCk7Ci0JCi0JZm9yIChpID0gMTsgaSA8IDU7IGkrKykgewotCQlvcGpfbXFjX2VuY29kZShtcWMsIGkgJSAyKTsKLQl9Ci19Ci0KLU9QSl9CT09MIG9wal9tcWNfaW5pdF9kZWMob3BqX21xY190ICptcWMsIE9QSl9CWVRFICpicCwgT1BKX1VJTlQzMiBsZW4pIHsKLQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIDApOwotCW1xYy0+c3RhcnQgPSBicDsKLQltcWMtPmVuZCA9IGJwICsgbGVuOwotCW1xYy0+YnAgPSBicDsKLQlpZiAobGVuPT0wKSBtcWMtPmMgPSAweGZmIDw8IDE2OwotCWVsc2UgbXFjLT5jID0gKE9QSl9VSU5UMzIpKCptcWMtPmJwIDw8IDE2KTsKLQotI2lmZGVmIE1RQ19QRVJGX09QVCAvKiBUT0RPX01TRDogY2hlY2sgdGhpcyBvcHRpb24gYW5kIHB1dCBpbiBleHBlcmltZW50YWwgKi8KLQl7Ci0gICAgICAgIE9QSl9VSU5UMzIgYzsKLQkJT1BKX1VJTlQzMiAqaXA7Ci0JCU9QSl9CWVRFICplbmQgPSBtcWMtPmVuZCAtIDE7Ci0gICAgICAgIHZvaWQqIG5ld19idWZmZXIgPSBvcGpfcmVhbGxvYyhtcWMtPmJ1ZmZlciwgKGxlbiArIDEpICogc2l6ZW9mKE9QSl9VSU5UMzIpKTsKLSAgICAgICAgaWYgKCEgbmV3X2J1ZmZlcikgewotICAgICAgICAgICAgb3BqX2ZyZWUobXFjLT5idWZmZXIpOwotICAgICAgICAgICAgbXFjLT5idWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKK3ZvaWQgb3BqX21xY19ieXBhc3NfZW5jKG9wal9tcWNfdCAqbXFjLCBPUEpfVUlOVDMyIGQpCit7CisgICAgaWYgKG1xYy0+Y3QgPT0gQllQQVNTX0NUX0lOSVQpIHsKKyAgICAgICAgbXFjLT5jdCA9IDg7CisgICAgfQorICAgIG1xYy0+Y3QtLTsKKyAgICBtcWMtPmMgPSBtcWMtPmMgKyAoZCA8PCBtcWMtPmN0KTsKKyAgICBpZiAobXFjLT5jdCA9PSAwKSB7CisgICAgICAgICptcWMtPmJwID0gKE9QSl9CWVRFKW1xYy0+YzsKKyAgICAgICAgbXFjLT5jdCA9IDg7CisgICAgICAgIC8qIElmIHRoZSBwcmV2aW91cyBieXRlIHdhcyAweGZmLCBtYWtlIHN1cmUgdGhhdCB0aGUgbmV4dCBtc2IgaXMgMCAqLworICAgICAgICBpZiAoKm1xYy0+YnAgPT0gMHhmZikgeworICAgICAgICAgICAgbXFjLT5jdCA9IDc7CiAgICAgICAgIH0KLSAgICAgICAgbXFjLT5idWZmZXIgPSBuZXdfYnVmZmVyOwotCQkKLSAgICAgICAgaXAgPSAoT1BKX1VJTlQzMiAqKSBtcWMtPmJ1ZmZlcjsKKyAgICAgICAgbXFjLT5icCsrOworICAgICAgICBtcWMtPmMgPSAwOworICAgIH0KK30KIAotCQl3aGlsZSAoYnAgPCBlbmQpIHsKLQkJCWMgPSAqKGJwICsgMSk7Ci0JCQlpZiAoKmJwID09IDB4ZmYpIHsKLQkJCQlpZiAoYyA+IDB4OGYpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJKmlwID0gMHgwMDAwMDAxNyB8IChjIDw8IDkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJKmlwID0gMHgwMDAwMDAxOCB8IChjIDw8IDgpOwotCQkJfQotCQkJYnArKzsKLQkJCWlwKys7Ci0JCX0KK09QSl9VSU5UMzIgb3BqX21xY19ieXBhc3NfZ2V0X2V4dHJhX2J5dGVzKG9wal9tcWNfdCAqbXFjLCBPUEpfQk9PTCBlcnRlcm0pCit7CisgICAgcmV0dXJuIChtcWMtPmN0IDwgNyB8fAorICAgICAgICAgICAgKG1xYy0+Y3QgPT0gNyAmJiAoZXJ0ZXJtIHx8IG1xYy0+YnBbLTFdICE9IDB4ZmYpKSkgPyAxIDogMDsKK30KIAotCQkvKiBIYW5kbGUgbGFzdCBieXRlIG9mIGRhdGEgKi8KLQkJYyA9IDB4ZmY7Ci0JCWlmICgqYnAgPT0gMHhmZikgewotCQkJKmlwID0gMHgwMDAwZmYxODsKLQkJfSBlbHNlIHsKLQkJCWJwKys7Ci0JCQkqaXAgPSAweDAwMDAwMDE4IHwgKGMgPDwgOCk7Ci0JCX0KLQkJaXArKzsKK3ZvaWQgb3BqX21xY19ieXBhc3NfZmx1c2hfZW5jKG9wal9tcWNfdCAqbXFjLCBPUEpfQk9PTCBlcnRlcm0pCit7CisgICAgLyogSXMgdGhlcmUgYW55IGJpdCByZW1haW5pbmcgdG8gYmUgZmx1c2hlZCA/ICovCisgICAgLyogSWYgdGhlIGxhc3Qgb3V0cHV0IGJ5dGUgaXMgMHhmZiwgd2UgY2FuIGRpc2NhcmQgaXQsIHVubGVzcyAqLworICAgIC8qIGVydGVybSBpcyByZXF1aXJlZCAoSSdtIG5vdCBjb21wbGV0ZWx5IHN1cmUgd2h5IGluIGVydGVybSAqLworICAgIC8qIHdlIG11c3Qgb3V0cHV0IDB4ZmYgMHgyYSBpZiB0aGUgbGFzdCBieXRlIHdhcyAweGZmIGluc3RlYWQgb2YgKi8KKyAgICAvKiBkaXNjYXJkaW5nIGl0LCBidXQgS2FrYWR1IHJlcXVpcmVzIGl0IHdoZW4gZGVjb2RpbmcgKi8KKyAgICAvKiBpbiAtZnVzc3kgbW9kZSkgKi8KKyAgICBpZiAobXFjLT5jdCA8IDcgfHwgKG1xYy0+Y3QgPT0gNyAmJiAoZXJ0ZXJtIHx8IG1xYy0+YnBbLTFdICE9IDB4ZmYpKSkgeworICAgICAgICBPUEpfQllURSBiaXRfdmFsdWUgPSAwOworICAgICAgICAvKiBJZiBzbywgZmlsbCB0aGUgcmVtYWluaW5nIGxzYnMgd2l0aCBhbiBhbHRlcm5hdGluZyBzZXF1ZW5jZSBvZiAqLworICAgICAgICAvKiAwLDEsLi4uICovCisgICAgICAgIC8qIE5vdGU6IGl0IHNlZW1zIHRoZSBzdGFuZGFyZCBvbmx5IHJlcXVpcmVzIHRoYXQgZm9yIGEgRVJURVJNIGZsdXNoICovCisgICAgICAgIC8qIGFuZCBkb2Vzbid0IHNwZWNpZnkgd2hhdCB0byBkbyBmb3IgYSByZWd1bGFyIEJZUEFTUyBmbHVzaCAqLworICAgICAgICB3aGlsZSAobXFjLT5jdCA+IDApIHsKKyAgICAgICAgICAgIG1xYy0+Y3QtLTsKKyAgICAgICAgICAgIG1xYy0+YyArPSAoT1BKX1VJTlQzMikoYml0X3ZhbHVlIDw8IG1xYy0+Y3QpOworICAgICAgICAgICAgYml0X3ZhbHVlID0gKE9QSl9CWVRFKSgxVSAtIGJpdF92YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgKm1xYy0+YnAgPSAoT1BKX0JZVEUpbXFjLT5jOworICAgICAgICAvKiBBZHZhbmNlIHBvaW50ZXIgc28gdGhhdCBvcGpfbXFjX251bWJ5dGVzKCkgcmV0dXJucyBhIHZhbGlkIHZhbHVlICovCisgICAgICAgIG1xYy0+YnArKzsKKyAgICB9IGVsc2UgaWYgKG1xYy0+Y3QgPT0gNyAmJiBtcWMtPmJwWy0xXSA9PSAweGZmKSB7CisgICAgICAgIC8qIERpc2NhcmQgbGFzdCAweGZmICovCisgICAgICAgIGFzc2VydCghZXJ0ZXJtKTsKKyAgICAgICAgbXFjLT5icCAtLTsKKyAgICB9IGVsc2UgaWYgKG1xYy0+Y3QgPT0gOCAmJiAhZXJ0ZXJtICYmCisgICAgICAgICAgICAgICBtcWMtPmJwWy0xXSA9PSAweDdmICYmIG1xYy0+YnBbLTJdID09IDB4ZmYpIHsKKyAgICAgICAgLyogVGlueSBvcHRpbWl6YXRpb246IGRpc2NhcmQgdGVybWluYXRpbmcgMHhmZiAweDdmIHNpbmNlIGl0IGlzICovCisgICAgICAgIC8qIGludGVycHJldGVkIGFzIDB4ZmYgMHg3ZiBbMHhmZiAweGZmXSBieSB0aGUgZGVjb2RlciwgYW5kIGdpdmVuICovCisgICAgICAgIC8qIHRoZSBiaXQgc3R1ZmZpbmcsIGluIGZhY3QgYXMgMHhmZiAweGZmIFsweGZmIC4uXSAqLworICAgICAgICAvKiBIYXBwZW5zIG9uY2Ugb24gb3BqX2NvbXByZXNzIC1pIC4uL01BUEEudGlmIC1vIE1BUEEuajJrICAtTSAxICovCisgICAgICAgIG1xYy0+YnAgLT0gMjsKKyAgICB9CiAKLQkJKmlwID0gMHgwMDAwZmYwODsKLQkJbXFjLT5icCA9IG1xYy0+YnVmZmVyOwotCX0KKyAgICBhc3NlcnQobXFjLT5icFstMV0gIT0gMHhmZik7Cit9CisKK3ZvaWQgb3BqX21xY19yZXNldF9lbmMob3BqX21xY190ICptcWMpCit7CisgICAgb3BqX21xY19yZXNldHN0YXRlcyhtcWMpOworICAgIG9wal9tcWNfc2V0c3RhdGUobXFjLCBUMV9DVFhOT19VTkksIDAsIDQ2KTsKKyAgICBvcGpfbXFjX3NldHN0YXRlKG1xYywgVDFfQ1RYTk9fQUdHLCAwLCAzKTsKKyAgICBvcGpfbXFjX3NldHN0YXRlKG1xYywgVDFfQ1RYTk9fWkMsIDAsIDQpOworfQorCisjaWZkZWYgbm90ZGVmCitPUEpfVUlOVDMyIG9wal9tcWNfcmVzdGFydF9lbmMob3BqX21xY190ICptcWMpCit7CisgICAgT1BKX1VJTlQzMiBjb3JyZWN0aW9uID0gMTsKKworICAgIC8qIDxmbHVzaCBwYXJ0PiAqLworICAgIE9QSl9JTlQzMiBuID0gKE9QSl9JTlQzMikoMjcgLSAxNSAtIG1xYy0+Y3QpOworICAgIG1xYy0+YyA8PD0gbXFjLT5jdDsKKyAgICB3aGlsZSAobiA+IDApIHsKKyAgICAgICAgb3BqX21xY19ieXRlb3V0KG1xYyk7CisgICAgICAgIG4gLT0gKE9QSl9JTlQzMiltcWMtPmN0OworICAgICAgICBtcWMtPmMgPDw9IG1xYy0+Y3Q7CisgICAgfQorICAgIG9wal9tcWNfYnl0ZW91dChtcWMpOworCisgICAgcmV0dXJuIGNvcnJlY3Rpb247Cit9CiAjZW5kaWYKLQlvcGpfbXFjX2J5dGVpbihtcWMpOwotCW1xYy0+YyA8PD0gNzsKLQltcWMtPmN0IC09IDc7Ci0JbXFjLT5hID0gMHg4MDAwOwotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisKK3ZvaWQgb3BqX21xY19yZXN0YXJ0X2luaXRfZW5jKG9wal9tcWNfdCAqbXFjKQoreworICAgIC8qIDxSZS1pbml0IHBhcnQ+ICovCisKKyAgICAvKiBBcyBzcGVjaWZpZWQgaW4gRmlndXJlIEMuMTAgLSBJbml0aWFsaXphdGlvbiBvZiB0aGUgZW5jb2RlciAqLworICAgIC8qIChDLjIuOCBJbml0aWFsaXphdGlvbiBvZiB0aGUgZW5jb2RlciAoSU5JVEVOQykpICovCisgICAgbXFjLT5hID0gMHg4MDAwOworICAgIG1xYy0+YyA9IDA7CisgICAgbXFjLT5jdCA9IDEyOworICAgIC8qIFRoaXMgZnVuY3Rpb24gaXMgbm9ybWFsbHkgY2FsbGVkIGFmdGVyIGF0IGxlYXN0IG9uZSBvcGpfbXFjX2ZsdXNoKCkgKi8KKyAgICAvKiB3aGljaCB3aWxsIGhhdmUgYWR2YW5jZSBtcWMtPmJwIGJ5IGF0IGxlYXN0IDIgYnl0ZXMgYmV5b25kIGl0cyAqLworICAgIC8qIGluaXRpYWwgcG9zaXRpb24gKi8KKyAgICBtcWMtPmJwIC0tOworICAgIGFzc2VydChtcWMtPmJwID49IG1xYy0+c3RhcnQgLSAxKTsKKyAgICBhc3NlcnQoKm1xYy0+YnAgIT0gMHhmZik7CisgICAgaWYgKCptcWMtPmJwID09IDB4ZmYpIHsKKyAgICAgICAgbXFjLT5jdCA9IDEzOworICAgIH0KIH0KIAotT1BKX0lOVDMyIG9wal9tcWNfZGVjb2RlKG9wal9tcWNfdCAqY29uc3QgbXFjKSB7Ci0JT1BKX0lOVDMyIGQ7Ci0JbXFjLT5hIC09ICgqbXFjLT5jdXJjdHgpLT5xZXZhbDsKLQlpZiAoKG1xYy0+YyA+PiAxNikgPCAoKm1xYy0+Y3VyY3R4KS0+cWV2YWwpIHsKLQkJZCA9IG9wal9tcWNfbHBzZXhjaGFuZ2UobXFjKTsKLQkJb3BqX21xY19yZW5vcm1kKG1xYyk7Ci0JfSBlbHNlIHsKLQkJbXFjLT5jIC09ICgqbXFjLT5jdXJjdHgpLT5xZXZhbCA8PCAxNjsKLQkJaWYgKChtcWMtPmEgJiAweDgwMDApID09IDApIHsKLQkJCWQgPSBvcGpfbXFjX21wc2V4Y2hhbmdlKG1xYyk7Ci0JCQlvcGpfbXFjX3Jlbm9ybWQobXFjKTsKLQkJfSBlbHNlIHsKLQkJCWQgPSAoT1BKX0lOVDMyKSgqbXFjLT5jdXJjdHgpLT5tcHM7Ci0JCX0KLQl9Cit2b2lkIG9wal9tcWNfZXJ0ZXJtX2VuYyhvcGpfbXFjX3QgKm1xYykKK3sKKyAgICBPUEpfSU5UMzIgayA9IChPUEpfSU5UMzIpKDExIC0gbXFjLT5jdCArIDEpOwogCi0JcmV0dXJuIGQ7CisgICAgd2hpbGUgKGsgPiAwKSB7CisgICAgICAgIG1xYy0+YyA8PD0gbXFjLT5jdDsKKyAgICAgICAgbXFjLT5jdCA9IDA7CisgICAgICAgIG9wal9tcWNfYnl0ZW91dChtcWMpOworICAgICAgICBrIC09IChPUEpfSU5UMzIpbXFjLT5jdDsKKyAgICB9CisKKyAgICBpZiAoKm1xYy0+YnAgIT0gMHhmZikgeworICAgICAgICBvcGpfbXFjX2J5dGVvdXQobXFjKTsKKyAgICB9CiB9CiAKLXZvaWQgb3BqX21xY19yZXNldHN0YXRlcyhvcGpfbXFjX3QgKm1xYykgewotCU9QSl9VSU5UMzIgaTsKLQlmb3IgKGkgPSAwOyBpIDwgTVFDX05VTUNUWFM7IGkrKykgewotCQltcWMtPmN0eHNbaV0gPSBtcWNfc3RhdGVzOwotCX0KK3ZvaWQgb3BqX21xY19zZWdtYXJrX2VuYyhvcGpfbXFjX3QgKm1xYykKK3sKKyAgICBPUEpfVUlOVDMyIGk7CisgICAgb3BqX21xY19zZXRjdXJjdHgobXFjLCAxOCk7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKSB7CisgICAgICAgIG9wal9tcWNfZW5jb2RlKG1xYywgaSAlIDIpOworICAgIH0KIH0KIAotdm9pZCBvcGpfbXFjX3NldHN0YXRlKG9wal9tcWNfdCAqbXFjLCBPUEpfVUlOVDMyIGN0eG5vLCBPUEpfVUlOVDMyIG1zYiwgT1BKX0lOVDMyIHByb2IpIHsKLQltcWMtPmN0eHNbY3R4bm9dID0gJm1xY19zdGF0ZXNbbXNiICsgKE9QSl9VSU5UMzIpKHByb2IgPDwgMSldOworc3RhdGljIHZvaWQgb3BqX21xY19pbml0X2RlY19jb21tb24ob3BqX21xY190ICptcWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgZXh0cmFfd3JpdGFibGVfYnl0ZXMpCit7CisgICAgKHZvaWQpZXh0cmFfd3JpdGFibGVfYnl0ZXM7CisKKyAgICBhc3NlcnQoZXh0cmFfd3JpdGFibGVfYnl0ZXMgPj0gT1BKX0NPTU1PTl9DQkxLX0RBVEFfRVhUUkEpOworICAgIG1xYy0+c3RhcnQgPSBicDsKKyAgICBtcWMtPmVuZCA9IGJwICsgbGVuOworICAgIC8qIEluc2VydCBhbiBhcnRpZmljaWFsIDB4RkYgMHhGRiBtYXJrZXIgYXQgZW5kIG9mIHRoZSBjb2RlIGJsb2NrICovCisgICAgLyogZGF0YSBzbyB0aGF0IHRoZSBieXRlaW4gcm91dGluZXMgc3RvcCBvbiBpdC4gVGhpcyBzYXZlcyB1cyBjb21wYXJpbmcgKi8KKyAgICAvKiB0aGUgYnAgYW5kIGVuZCBwb2ludGVycyAqLworICAgIC8qIEJ1dCBiZWZvcmUgaW5zZXJ0aW5nIGl0LCBiYWNrdXAgdGggYnl0ZXMgd2Ugd2lsbCBvdmVyd3JpdGUgKi8KKyAgICBtZW1jcHkobXFjLT5iYWNrdXAsIG1xYy0+ZW5kLCBPUEpfQ09NTU9OX0NCTEtfREFUQV9FWFRSQSk7CisgICAgbXFjLT5lbmRbMF0gPSAweEZGOworICAgIG1xYy0+ZW5kWzFdID0gMHhGRjsKKyAgICBtcWMtPmJwID0gYnA7Cit9Cit2b2lkIG9wal9tcWNfaW5pdF9kZWMob3BqX21xY190ICptcWMsIE9QSl9CWVRFICpicCwgT1BKX1VJTlQzMiBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBleHRyYV93cml0YWJsZV9ieXRlcykKK3sKKyAgICAvKiBJbXBsZW1lbnRzIElTTyAxNTQ0NC0xIEMuMy41IEluaXRpYWxpemF0aW9uIG9mIHRoZSBkZWNvZGVyIChJTklUREVDKSAqLworICAgIC8qIE5vdGU6IGFsdGVybmF0ZSAiSi4xIC0gSW5pdGlhbGl6YXRpb24gb2YgdGhlIHNvZnR3YXJlLWNvbnZlbnRpb25zICovCisgICAgLyogZGVjb2RlciIgaGFzIGJlZW4gdHJpZWQsIGJ1dCBkb2VzICovCisgICAgLyogbm90IGJyaW5nIGFueSBpbXByb3ZlbWVudC4gKi8KKyAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3VjbG91dmFpbi9vcGVuanBlZy9pc3N1ZXMvOTIxICovCisgICAgb3BqX21xY19pbml0X2RlY19jb21tb24obXFjLCBicCwgbGVuLCBleHRyYV93cml0YWJsZV9ieXRlcyk7CisgICAgb3BqX21xY19zZXRjdXJjdHgobXFjLCAwKTsKKyAgICBtcWMtPmVuZF9vZl9ieXRlX3N0cmVhbV9jb3VudGVyID0gMDsKKyAgICBpZiAobGVuID09IDApIHsKKyAgICAgICAgbXFjLT5jID0gMHhmZiA8PCAxNjsKKyAgICB9IGVsc2UgeworICAgICAgICBtcWMtPmMgPSAoT1BKX1VJTlQzMikoKm1xYy0+YnAgPDwgMTYpOworICAgIH0KKworICAgIG9wal9tcWNfYnl0ZWluKG1xYyk7CisgICAgbXFjLT5jIDw8PSA3OworICAgIG1xYy0+Y3QgLT0gNzsKKyAgICBtcWMtPmEgPSAweDgwMDA7Cit9CisKKwordm9pZCBvcGpfbXFjX3Jhd19pbml0X2RlYyhvcGpfbXFjX3QgKm1xYywgT1BKX0JZVEUgKmJwLCBPUEpfVUlOVDMyIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBleHRyYV93cml0YWJsZV9ieXRlcykKK3sKKyAgICBvcGpfbXFjX2luaXRfZGVjX2NvbW1vbihtcWMsIGJwLCBsZW4sIGV4dHJhX3dyaXRhYmxlX2J5dGVzKTsKKyAgICBtcWMtPmMgPSAwOworICAgIG1xYy0+Y3QgPSAwOworfQorCisKK3ZvaWQgb3BxX21xY19maW5pc2hfZGVjKG9wal9tcWNfdCAqbXFjKQoreworICAgIC8qIFJlc3RvcmUgdGhlIGJ5dGVzIG92ZXJ3cml0dGVuIGJ5IG9wal9tcWNfaW5pdF9kZWNfY29tbW9uKCkgKi8KKyAgICBtZW1jcHkobXFjLT5lbmQsIG1xYy0+YmFja3VwLCBPUEpfQ09NTU9OX0NCTEtfREFUQV9FWFRSQSk7Cit9CisKK3ZvaWQgb3BqX21xY19yZXNldHN0YXRlcyhvcGpfbXFjX3QgKm1xYykKK3sKKyAgICBPUEpfVUlOVDMyIGk7CisgICAgZm9yIChpID0gMDsgaSA8IE1RQ19OVU1DVFhTOyBpKyspIHsKKyAgICAgICAgbXFjLT5jdHhzW2ldID0gbXFjX3N0YXRlczsKKyAgICB9Cit9CisKK3ZvaWQgb3BqX21xY19zZXRzdGF0ZShvcGpfbXFjX3QgKm1xYywgT1BKX1VJTlQzMiBjdHhubywgT1BKX1VJTlQzMiBtc2IsCisgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHByb2IpCit7CisgICAgbXFjLT5jdHhzW2N0eG5vXSA9ICZtcWNfc3RhdGVzW21zYiArIChPUEpfVUlOVDMyKShwcm9iIDw8IDEpXTsKIH0KIAogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL21xYy5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9tcWMuaAppbmRleCA2OWEyZDQ2Li42OWEyYTc5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL21xYy5oCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvbXFjLmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCiAgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCiAgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCiAgKgpAQCAtOCw3ICs4LDcgQEAKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBQcm9mZXNzb3IgQmVub2l0IE1hY3EKICAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzLCBEYXZpZCBKYW5zc2VucwogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIFlhbm5pY2sgVmVyc2NodWVyZW4KLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eCAKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eAogICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQsIEFudG9uaW4gRGVzY2FtcGUKICAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQogICogQ29weXJpZ2h0IChjKSAyMDA4LCBKZXJvbWUgRmltZXMsIENvbW11bmljYXRpb25zICYgU3lzdGVtZXMgPGplcm9tZS5maW1lc0BjLXMuZnI+CkBAIC0zNiw4ICszNiwxMSBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KIAotI2lmbmRlZiBfX01RQ19ICi0jZGVmaW5lIF9fTVFDX0gKKyNpZm5kZWYgT1BKX01RQ19ICisjZGVmaW5lIE9QSl9NUUNfSAorCisjaW5jbHVkZSAib3BqX2NvbW1vbi5oIgorCiAvKioKIEBmaWxlIG1xYy5oCiBAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYW4gTVEtQ29kZXIgKE1RQykKQEAgLTUzLDE0ICs1NiwxNCBAQAogVGhpcyBzdHJ1Y3QgZGVmaW5lcyB0aGUgc3RhdGUgb2YgYSBjb250ZXh0LgogKi8KIHR5cGVkZWYgc3RydWN0IG9wal9tcWNfc3RhdGUgewotCS8qKiB0aGUgcHJvYmFiaWxpdHkgb2YgdGhlIExlYXN0IFByb2JhYmxlIFN5bWJvbCAoMC43NS0+MHg4MDAwLCAxLjUtPjB4ZmZmZikgKi8KLQlPUEpfVUlOVDMyIHFldmFsOwotCS8qKiB0aGUgTW9zdCBQcm9iYWJsZSBTeW1ib2wgKDAgb3IgMSkgKi8KLQlPUEpfVUlOVDMyIG1wczsKLQkvKiogbmV4dCBzdGF0ZSBpZiB0aGUgbmV4dCBlbmNvZGVkIHN5bWJvbCBpcyB0aGUgTVBTICovCi0Jc3RydWN0IG9wal9tcWNfc3RhdGUgKm5tcHM7Ci0JLyoqIG5leHQgc3RhdGUgaWYgdGhlIG5leHQgZW5jb2RlZCBzeW1ib2wgaXMgdGhlIExQUyAqLwotCXN0cnVjdCBvcGpfbXFjX3N0YXRlICpubHBzOworICAgIC8qKiB0aGUgcHJvYmFiaWxpdHkgb2YgdGhlIExlYXN0IFByb2JhYmxlIFN5bWJvbCAoMC43NS0+MHg4MDAwLCAxLjUtPjB4ZmZmZikgKi8KKyAgICBPUEpfVUlOVDMyIHFldmFsOworICAgIC8qKiB0aGUgTW9zdCBQcm9iYWJsZSBTeW1ib2wgKDAgb3IgMSkgKi8KKyAgICBPUEpfVUlOVDMyIG1wczsKKyAgICAvKiogbmV4dCBzdGF0ZSBpZiB0aGUgbmV4dCBlbmNvZGVkIHN5bWJvbCBpcyB0aGUgTVBTICovCisgICAgY29uc3Qgc3RydWN0IG9wal9tcWNfc3RhdGUgKm5tcHM7CisgICAgLyoqIG5leHQgc3RhdGUgaWYgdGhlIG5leHQgZW5jb2RlZCBzeW1ib2wgaXMgdGhlIExQUyAqLworICAgIGNvbnN0IHN0cnVjdCBvcGpfbXFjX3N0YXRlICpubHBzOwogfSBvcGpfbXFjX3N0YXRlX3Q7CiAKICNkZWZpbmUgTVFDX05VTUNUWFMgMTkKQEAgLTY5LDMyICs3MiwzNiBAQAogTVEgY29kZXIKICovCiB0eXBlZGVmIHN0cnVjdCBvcGpfbXFjIHsKLQlPUEpfVUlOVDMyIGM7Ci0JT1BKX1VJTlQzMiBhOwotCU9QSl9VSU5UMzIgY3Q7Ci0JT1BKX0JZVEUgKmJwOwotCU9QSl9CWVRFICpzdGFydDsKLQlPUEpfQllURSAqZW5kOwotCW9wal9tcWNfc3RhdGVfdCAqY3R4c1tNUUNfTlVNQ1RYU107Ci0Jb3BqX21xY19zdGF0ZV90ICoqY3VyY3R4OwotI2lmZGVmIE1RQ19QRVJGX09QVAotCXVuc2lnbmVkIGNoYXIgKmJ1ZmZlcjsKLSNlbmRpZgorICAgIC8qKiB0ZW1wb3JhcnkgYnVmZmVyIHdoZXJlIGJpdHMgYXJlIGNvZGVkIG9yIGRlY29kZWQgKi8KKyAgICBPUEpfVUlOVDMyIGM7CisgICAgLyoqIG9ubHkgdXNlZCBieSBNUSBkZWNvZGVyICovCisgICAgT1BKX1VJTlQzMiBhOworICAgIC8qKiBudW1iZXIgb2YgYml0cyBhbHJlYWR5IHJlYWQgb3IgZnJlZSB0byB3cml0ZSAqLworICAgIE9QSl9VSU5UMzIgY3Q7CisgICAgLyogb25seSB1c2VkIGJ5IGRlY29kZXIsIHRvIGNvdW50IHRoZSBudW1iZXIgb2YgdGltZXMgYSB0ZXJtaW5hdGluZyAweEZGID4weDhGIG1hcmtlciBpcyByZWFkICovCisgICAgT1BKX1VJTlQzMiBlbmRfb2ZfYnl0ZV9zdHJlYW1fY291bnRlcjsKKyAgICAvKiogcG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCisgICAgT1BKX0JZVEUgKmJwOworICAgIC8qKiBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyICovCisgICAgT1BKX0JZVEUgKnN0YXJ0OworICAgIC8qKiBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLworICAgIE9QSl9CWVRFICplbmQ7CisgICAgLyoqIEFycmF5IG9mIGNvbnRleHRzICovCisgICAgY29uc3Qgb3BqX21xY19zdGF0ZV90ICpjdHhzW01RQ19OVU1DVFhTXTsKKyAgICAvKiogQWN0aXZlIGNvbnRleHQgKi8KKyAgICBjb25zdCBvcGpfbXFjX3N0YXRlX3QgKipjdXJjdHg7CisgICAgLyogbHV0X2N0eG5vX3pjIHNoaWZ0ZWQgYnkgKDEgPDwgOSkgKiBiYW5kbm8gKi8KKyAgICBjb25zdCBPUEpfQllURSogbHV0X2N0eG5vX3pjX29yaWVudDsKKyAgICAvKiogT3JpZ2luYWwgdmFsdWUgb2YgdGhlIDIgYnl0ZXMgYXQgZW5kWzBdIGFuZCBlbmRbMV0gKi8KKyAgICBPUEpfQllURSBiYWNrdXBbT1BKX0NPTU1PTl9DQkxLX0RBVEFfRVhUUkFdOwogfSBvcGpfbXFjX3Q7CiAKKyNpbmNsdWRlICJtcWNfaW5sLmgiCisKIC8qKiBAbmFtZSBFeHBvcnRlZCBmdW5jdGlvbnMgKi8KIC8qQHsqLwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qKgotQ3JlYXRlIGEgbmV3IE1RQyBoYW5kbGUgCi1AcmV0dXJuIFJldHVybnMgYSBuZXcgTVFDIGhhbmRsZSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlCi0qLwotb3BqX21xY190KiBvcGpfbXFjX2NyZWF0ZSh2b2lkKTsKLS8qKgotRGVzdHJveSBhIHByZXZpb3VzbHkgY3JlYXRlZCBNUUMgaGFuZGxlCi1AcGFyYW0gbXFjIE1RQyBoYW5kbGUgdG8gZGVzdHJveQotKi8KLXZvaWQgb3BqX21xY19kZXN0cm95KG9wal9tcWNfdCAqbXFjKTsKKwogLyoqCiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuL3JlYWQgc2luY2UgaW5pdGlhbGlzYXRpb24KIEBwYXJhbSBtcWMgTVFDIGhhbmRsZQpAQCAtMTAyLDcgKzEwOSw3IEBACiAqLwogT1BKX1VJTlQzMiBvcGpfbXFjX251bWJ5dGVzKG9wal9tcWNfdCAqbXFjKTsKIC8qKgotUmVzZXQgdGhlIHN0YXRlcyBvZiBhbGwgdGhlIGNvbnRleHQgb2YgdGhlIGNvZGVyL2RlY29kZXIgCitSZXNldCB0aGUgc3RhdGVzIG9mIGFsbCB0aGUgY29udGV4dCBvZiB0aGUgY29kZXIvZGVjb2RlcgogKGVhY2ggY29udGV4dCBpcyBzZXQgdG8gYSBzdGF0ZSB3aGVyZSAwIGFuZCAxIGFyZSBtb3JlIG9yIGxlc3MgZXF1aXByb2JhYmxlKQogQHBhcmFtIG1xYyBNUUMgaGFuZGxlCiAqLwpAQCAtMTE0LDcgKzEyMSw4IEBACiBAcGFyYW0gbXNiIFRoZSBNU0Igb2YgdGhlIG5ldyBzdGF0ZSBvZiB0aGUgY29udGV4dAogQHBhcmFtIHByb2IgTnVtYmVyIHRoYXQgaWRlbnRpZmllcyB0aGUgcHJvYmFiaWxpdHkgb2YgdGhlIHN5bWJvbHMgZm9yIHRoZSBuZXcgc3RhdGUgb2YgdGhlIGNvbnRleHQKICovCi12b2lkIG9wal9tcWNfc2V0c3RhdGUob3BqX21xY190ICptcWMsIE9QSl9VSU5UMzIgY3R4bm8sIE9QSl9VSU5UMzIgbXNiLCBPUEpfSU5UMzIgcHJvYik7Cit2b2lkIG9wal9tcWNfc2V0c3RhdGUob3BqX21xY190ICptcWMsIE9QSl9VSU5UMzIgY3R4bm8sIE9QSl9VSU5UMzIgbXNiLAorICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwcm9iKTsKIC8qKgogSW5pdGlhbGl6ZSB0aGUgZW5jb2RlcgogQHBhcmFtIG1xYyBNUUMgaGFuZGxlCkBAIC0xMjYsNyArMTM0LDcgQEAKIEBwYXJhbSBtcWMgTVFDIGhhbmRsZQogQHBhcmFtIGN0eG5vIE51bWJlciB0aGF0IGlkZW50aWZpZXMgdGhlIGNvbnRleHQKICovCi0jZGVmaW5lIG9wal9tcWNfc2V0Y3VyY3R4KG1xYywgY3R4bm8pCShtcWMpLT5jdXJjdHggPSAmKG1xYyktPmN0eHNbKE9QSl9VSU5UMzIpKGN0eG5vKV0KKyNkZWZpbmUgb3BqX21xY19zZXRjdXJjdHgobXFjLCBjdHhubykgICAobXFjKS0+Y3VyY3R4ID0gJihtcWMpLT5jdHhzWyhPUEpfVUlOVDMyKShjdHhubyldCiAvKioKIEVuY29kZSBhIHN5bWJvbCB1c2luZyB0aGUgTVEtY29kZXIKIEBwYXJhbSBtcWMgTVFDIGhhbmRsZQpAQCAtMTM5LDM4ICsxNDcsNDcgQEAKICovCiB2b2lkIG9wal9tcWNfZmx1c2gob3BqX21xY190ICptcWMpOwogLyoqCi1CWVBBU1MgbW9kZSBzd2l0Y2gsIGluaXRpYWxpemF0aW9uIG9wZXJhdGlvbi4gCi1KUEVHIDIwMDAgcCA1MDUuIAotPGgyPk5vdCBmdWxseSBpbXBsZW1lbnRlZCBhbmQgdGVzdGVkICEhPC9oMj4KK0JZUEFTUyBtb2RlIHN3aXRjaCwgaW5pdGlhbGl6YXRpb24gb3BlcmF0aW9uLgorSlBFRyAyMDAwIHAgNTA1LgogQHBhcmFtIG1xYyBNUUMgaGFuZGxlCiAqLwogdm9pZCBvcGpfbXFjX2J5cGFzc19pbml0X2VuYyhvcGpfbXFjX3QgKm1xYyk7CisKKy8qKiBSZXR1cm4gbnVtYmVyIG9mIGV4dHJhIGJ5dGVzIHRvIGFkZCB0byBvcGpfbXFjX251bWJ5dGVzKCkgZm9yIHRoZcKyCisgICAgc2l6ZSBvZiBhIG5vbi10ZXJtaW5hdGluZyBCWVBBU1MgcGFzcworQHBhcmFtIG1xYyBNUUMgaGFuZGxlCitAcGFyYW0gZXJ0ZXJtIDEgaWYgRVJURVJNIGlzIGVuYWJsZWQsIDAgb3RoZXJ3aXNlCisqLworT1BKX1VJTlQzMiBvcGpfbXFjX2J5cGFzc19nZXRfZXh0cmFfYnl0ZXMob3BqX21xY190ICptcWMsIE9QSl9CT09MIGVydGVybSk7CisKIC8qKgotQllQQVNTIG1vZGUgc3dpdGNoLCBjb2Rpbmcgb3BlcmF0aW9uLiAKLUpQRUcgMjAwMCBwIDUwNS4gCi08aDI+Tm90IGZ1bGx5IGltcGxlbWVudGVkIGFuZCB0ZXN0ZWQgISE8L2gyPgorQllQQVNTIG1vZGUgc3dpdGNoLCBjb2Rpbmcgb3BlcmF0aW9uLgorSlBFRyAyMDAwIHAgNTA1LgogQHBhcmFtIG1xYyBNUUMgaGFuZGxlCiBAcGFyYW0gZCBUaGUgc3ltYm9sIHRvIGJlIGVuY29kZWQgKDAgb3IgMSkKICovCiB2b2lkIG9wal9tcWNfYnlwYXNzX2VuYyhvcGpfbXFjX3QgKm1xYywgT1BKX1VJTlQzMiBkKTsKIC8qKgogQllQQVNTIG1vZGUgc3dpdGNoLCBmbHVzaCBvcGVyYXRpb24KLTxoMj5Ob3QgZnVsbHkgaW1wbGVtZW50ZWQgYW5kIHRlc3RlZCAhITwvaDI+CiBAcGFyYW0gbXFjIE1RQyBoYW5kbGUKLUByZXR1cm4gUmV0dXJucyAxIChhbHdheXMpCitAcGFyYW0gZXJ0ZXJtIDEgaWYgRVJURVJNIGlzIGVuYWJsZWQsIDAgb3RoZXJ3aXNlCiAqLwotT1BKX1VJTlQzMiBvcGpfbXFjX2J5cGFzc19mbHVzaF9lbmMob3BqX21xY190ICptcWMpOwordm9pZCBvcGpfbXFjX2J5cGFzc19mbHVzaF9lbmMob3BqX21xY190ICptcWMsIE9QSl9CT09MIGVydGVybSk7CiAvKioKIFJFU0VUIG1vZGUgc3dpdGNoCiBAcGFyYW0gbXFjIE1RQyBoYW5kbGUKICovCiB2b2lkIG9wal9tcWNfcmVzZXRfZW5jKG9wal9tcWNfdCAqbXFjKTsKKworI2lmZGVmIG5vdGRlZgogLyoqCiBSRVNUQVJUIG1vZGUgc3dpdGNoIChURVJNQUxMKQogQHBhcmFtIG1xYyBNUUMgaGFuZGxlCiBAcmV0dXJuIFJldHVybnMgMSAoYWx3YXlzKQogKi8KIE9QSl9VSU5UMzIgb3BqX21xY19yZXN0YXJ0X2VuYyhvcGpfbXFjX3QgKm1xYyk7CisjZW5kaWYKKwogLyoqCiBSRVNUQVJUIG1vZGUgc3dpdGNoIChURVJNQUxMKSByZWluaXRpYWxpc2F0aW9uCiBAcGFyYW0gbXFjIE1RQyBoYW5kbGUKQEAgLTE4NiwyMiArMjAzLDY5IEBACiBAcGFyYW0gbXFjIE1RQyBoYW5kbGUKICovCiB2b2lkIG9wal9tcWNfc2VnbWFya19lbmMob3BqX21xY190ICptcWMpOworCiAvKioKLUluaXRpYWxpemUgdGhlIGRlY29kZXIKK0luaXRpYWxpemUgdGhlIGRlY29kZXIgZm9yIE1RIGRlY29kaW5nLgorCitvcGpfbXFjX2ZpbmlzaF9kZWMoKSBtdXN0IGJlIGFic29sdXRlbHkgY2FsbGVkIGFmdGVyIGZpbmlzaGluZyB0aGUgZGVjb2RpbmcKK3Bhc3Nlcywgc28gYXMgdG8gcmVzdG9yZSB0aGUgYnl0ZXMgdGVtcG9yYXJpbHkgb3ZlcndyaXR0ZW4uCisKIEBwYXJhbSBtcWMgTVFDIGhhbmRsZQogQHBhcmFtIGJwIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIgZnJvbSB3aGljaCB0aGUgYnl0ZXMgd2lsbCBiZSByZWFkCisgICAgICAgICAgTm90ZSB0aGF0IE9QSl9DT01NT05fQ0JMS19EQVRBX0VYVFJBIGJ5dGVzIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgorICAgICAgICAgIHdpbGwgYmUgdGVtcG9yYXJpbHkgb3ZlcndyaXR0ZW4gd2l0aCBhbiBhcnRpZmljaWFsIDB4RkYgMHhGRiBtYXJrZXIuCisgICAgICAgICAgKHRoZXkgd2lsbCBiZSBiYWNrdXBlZCBpbiB0aGUgbXFjIHN0cnVjdHVyZSB0byBiZSByZXN0b3JlZCBsYXRlcikKKyAgICAgICAgICBTbyBicCBtdXN0IGJlIGF0IGxlYXN0IGxlbiArIE9QSl9DT01NT05fQ0JMS19EQVRBX0VYVFJBIGxhcmdlLCBhbmQKKyAgICAgICAgICB3cml0YWJsZS4KIEBwYXJhbSBsZW4gTGVuZ3RoIG9mIHRoZSBpbnB1dCBidWZmZXIKK0BwYXJhbSBleHRyYV93cml0YWJsZV9ieXRlcyBJbmRpY2F0ZSBob3cgbWFueSBieXRlcyBhZnRlciBsZW4gYXJlIHdyaXRhYmxlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdG8gaW5kaWNhdGUgeW91ciBjb25zZW50IHRoYXQgYnAgbXVzdCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhcmdlIGVub3VnaC4KICovCi1PUEpfQk9PTCBvcGpfbXFjX2luaXRfZGVjKG9wal9tcWNfdCAqbXFjLCBPUEpfQllURSAqYnAsIE9QSl9VSU5UMzIgbGVuKTsKK3ZvaWQgb3BqX21xY19pbml0X2RlYyhvcGpfbXFjX3QgKm1xYywgT1BKX0JZVEUgKmJwLCBPUEpfVUlOVDMyIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGV4dHJhX3dyaXRhYmxlX2J5dGVzKTsKKworLyoqCitJbml0aWFsaXplIHRoZSBkZWNvZGVyIGZvciBSQVcgZGVjb2RpbmcuCisKK29wal9tcWNfZmluaXNoX2RlYygpIG11c3QgYmUgYWJzb2x1dGVseSBjYWxsZWQgYWZ0ZXIgZmluaXNoaW5nIHRoZSBkZWNvZGluZworcGFzc2VzLCBzbyBhcyB0byByZXN0b3JlIHRoZSBieXRlcyB0ZW1wb3JhcmlseSBvdmVyd3JpdHRlbi4KKworQHBhcmFtIG1xYyBNUUMgaGFuZGxlCitAcGFyYW0gYnAgUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlciBmcm9tIHdoaWNoIHRoZSBieXRlcyB3aWxsIGJlIHJlYWQKKyAgICAgICAgICBOb3RlIHRoYXQgT1BKX0NPTU1PTl9DQkxLX0RBVEFfRVhUUkEgYnl0ZXMgYXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyCisgICAgICAgICAgd2lsbCBiZSB0ZW1wb3JhcmlseSBvdmVyd3JpdHRlbiB3aXRoIGFuIGFydGlmaWNpYWwgMHhGRiAweEZGIG1hcmtlci4KKyAgICAgICAgICAodGhleSB3aWxsIGJlIGJhY2t1cGVkIGluIHRoZSBtcWMgc3RydWN0dXJlIHRvIGJlIHJlc3RvcmVkIGxhdGVyKQorICAgICAgICAgIFNvIGJwIG11c3QgYmUgYXQgbGVhc3QgbGVuICsgT1BKX0NPTU1PTl9DQkxLX0RBVEFfRVhUUkEgbGFyZ2UsIGFuZAorICAgICAgICAgIHdyaXRhYmxlLgorQHBhcmFtIGxlbiBMZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlcgorQHBhcmFtIGV4dHJhX3dyaXRhYmxlX2J5dGVzIEluZGljYXRlIGhvdyBtYW55IGJ5dGVzIGFmdGVyIGxlbiBhcmUgd3JpdGFibGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0byBpbmRpY2F0ZSB5b3VyIGNvbnNlbnQgdGhhdCBicCBtdXN0IGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFyZ2UgZW5vdWdoLgorKi8KK3ZvaWQgb3BqX21xY19yYXdfaW5pdF9kZWMob3BqX21xY190ICptcWMsIE9QSl9CWVRFICpicCwgT1BKX1VJTlQzMiBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgZXh0cmFfd3JpdGFibGVfYnl0ZXMpOworCisKKy8qKgorVGVybWluYXRlIFJBVy9NUUMgZGVjb2RpbmcKKworVGhpcyByZXN0b3JlcyB0aGUgYnl0ZXMgdGVtcG9yYXJpbHkgb3ZlcndyaXR0ZW4gYnkgb3BqX21xY19pbml0X2RlYygpLworb3BqX21xY19yYXdfaW5pdF9kZWMoKQorCitAcGFyYW0gbXFjIE1RQyBoYW5kbGUKKyovCit2b2lkIG9wcV9tcWNfZmluaXNoX2RlYyhvcGpfbXFjX3QgKm1xYyk7CisKIC8qKgogRGVjb2RlIGEgc3ltYm9sCiBAcGFyYW0gbXFjIE1RQyBoYW5kbGUKIEByZXR1cm4gUmV0dXJucyB0aGUgZGVjb2RlZCBzeW1ib2wgKDAgb3IgMSkKICovCi1PUEpfSU5UMzIgb3BqX21xY19kZWNvZGUob3BqX21xY190ICogY29uc3QgbXFjKTsKKy8qc3RhdGljIElOTElORSBPUEpfVUlOVDMyIG9wal9tcWNfZGVjb2RlKG9wal9tcWNfdCAqIGNvbnN0IG1xYyk7Ki8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKkB9Ki8KIAogLypAfSovCiAKLSNlbmRpZiAvKiBfX01RQ19IICovCisjZW5kaWYgLyogT1BKX01RQ19IICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL21xY19pbmwuaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvbXFjX2lubC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMGEzMjgKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL21xY19pbmwuaApAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQKKyAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKKyAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgVW5pdmVyc2l0ZSBjYXRob2xpcXVlIGRlIExvdXZhaW4gKFVDTCksIEJlbGdpdW0KKyAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBQcm9mZXNzb3IgQmVub2l0IE1hY3EKKyAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzLCBEYXZpZCBKYW5zc2VucworICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIFlhbm5pY2sgVmVyc2NodWVyZW4KKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQsIEFudG9uaW4gRGVzY2FtcGUKKyAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQorICogQ29weXJpZ2h0IChjKSAyMDA4LCBKZXJvbWUgRmltZXMsIENvbW11bmljYXRpb25zICYgU3lzdGVtZXMgPGplcm9tZS5maW1lc0BjLXMuZnI+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgT1BKX01RQ19JTkxfSAorI2RlZmluZSBPUEpfTVFDX0lOTF9ICisKKy8qIEZvciBpbnRlcm5hbCB1c2Ugb2Ygb3BqX21xY19kZWNvZGVfbWFjcm8oKSAqLworI2RlZmluZSBvcGpfbXFjX21wc2V4Y2hhbmdlX21hY3JvKGQsIGN1cmN0eCwgYSkgXAoreyBcCisgICAgaWYgKGEgPCAoKmN1cmN0eCktPnFldmFsKSB7IFwKKyAgICAgICAgZCA9ICEoKCpjdXJjdHgpLT5tcHMpOyBcCisgICAgICAgICpjdXJjdHggPSAoKmN1cmN0eCktPm5scHM7IFwKKyAgICB9IGVsc2UgeyBcCisgICAgICAgIGQgPSAoKmN1cmN0eCktPm1wczsgXAorICAgICAgICAqY3VyY3R4ID0gKCpjdXJjdHgpLT5ubXBzOyBcCisgICAgfSBcCit9CisKKy8qIEZvciBpbnRlcm5hbCB1c2Ugb2Ygb3BqX21xY19kZWNvZGVfbWFjcm8oKSAqLworI2RlZmluZSBvcGpfbXFjX2xwc2V4Y2hhbmdlX21hY3JvKGQsIGN1cmN0eCwgYSkgXAoreyBcCisgICAgaWYgKGEgPCAoKmN1cmN0eCktPnFldmFsKSB7IFwKKyAgICAgICAgYSA9ICgqY3VyY3R4KS0+cWV2YWw7IFwKKyAgICAgICAgZCA9ICgqY3VyY3R4KS0+bXBzOyBcCisgICAgICAgICpjdXJjdHggPSAoKmN1cmN0eCktPm5tcHM7IFwKKyAgICB9IGVsc2UgeyBcCisgICAgICAgIGEgPSAoKmN1cmN0eCktPnFldmFsOyBcCisgICAgICAgIGQgPSAhKCgqY3VyY3R4KS0+bXBzKTsgXAorICAgICAgICAqY3VyY3R4ID0gKCpjdXJjdHgpLT5ubHBzOyBcCisgICAgfSBcCit9CisKKworLyoqCitEZWNvZGUgYSBzeW1ib2wgdXNpbmcgcmF3LWRlY29kZXIuIENmciBwLjUwNiBUQVVCTUFOCitAcGFyYW0gbXFjIE1RQyBoYW5kbGUKK0ByZXR1cm4gUmV0dXJucyB0aGUgZGVjb2RlZCBzeW1ib2wgKDAgb3IgMSkKKyovCitzdGF0aWMgSU5MSU5FIE9QSl9VSU5UMzIgb3BqX21xY19yYXdfZGVjb2RlKG9wal9tcWNfdCAqbXFjKQoreworICAgIE9QSl9VSU5UMzIgZDsKKyAgICBpZiAobXFjLT5jdCA9PSAwKSB7CisgICAgICAgIC8qIEdpdmVuIG9wal9tcWNfcmF3X2luaXRfZGVjKCkgd2Uga25vdyB0aGF0IGF0IHNvbWUgcG9pbnQgd2Ugd2lsbCAqLworICAgICAgICAvKiBoYXZlIGEgMHhGRiAweEZGIGFydGlmaWNpYWwgbWFya2VyICovCisgICAgICAgIGlmIChtcWMtPmMgPT0gMHhmZikgeworICAgICAgICAgICAgaWYgKCptcWMtPmJwICA+IDB4OGYpIHsKKyAgICAgICAgICAgICAgICBtcWMtPmMgPSAweGZmOworICAgICAgICAgICAgICAgIG1xYy0+Y3QgPSA4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtcWMtPmMgPSAqbXFjLT5icDsKKyAgICAgICAgICAgICAgICBtcWMtPmJwICsrOworICAgICAgICAgICAgICAgIG1xYy0+Y3QgPSA3OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXFjLT5jID0gKm1xYy0+YnA7CisgICAgICAgICAgICBtcWMtPmJwICsrOworICAgICAgICAgICAgbXFjLT5jdCA9IDg7CisgICAgICAgIH0KKyAgICB9CisgICAgbXFjLT5jdC0tOworICAgIGQgPSAoKE9QSl9VSU5UMzIpbXFjLT5jID4+IG1xYy0+Y3QpICYgMHgwMVU7CisKKyAgICByZXR1cm4gZDsKK30KKworCisjZGVmaW5lIG9wal9tcWNfYnl0ZWluX21hY3JvKG1xYywgYywgY3QpIFwKK3sgXAorICAgICAgICBPUEpfVUlOVDMyIGxfYzsgIFwKKyAgICAgICAgLyogR2l2ZW4gb3BqX21xY19pbml0X2RlYygpIHdlIGtub3cgdGhhdCBhdCBzb21lIHBvaW50IHdlIHdpbGwgKi8gXAorICAgICAgICAvKiBoYXZlIGEgMHhGRiAweEZGIGFydGlmaWNpYWwgbWFya2VyICovIFwKKyAgICAgICAgbF9jID0gKihtcWMtPmJwICsgMSk7IFwKKyAgICAgICAgaWYgKCptcWMtPmJwID09IDB4ZmYpIHsgXAorICAgICAgICAgICAgaWYgKGxfYyA+IDB4OGYpIHsgXAorICAgICAgICAgICAgICAgIGMgKz0gMHhmZjAwOyBcCisgICAgICAgICAgICAgICAgY3QgPSA4OyBcCisgICAgICAgICAgICAgICAgbXFjLT5lbmRfb2ZfYnl0ZV9zdHJlYW1fY291bnRlciArKzsgXAorICAgICAgICAgICAgfSBlbHNlIHsgXAorICAgICAgICAgICAgICAgIG1xYy0+YnArKzsgXAorICAgICAgICAgICAgICAgIGMgKz0gbF9jIDw8IDk7IFwKKyAgICAgICAgICAgICAgICBjdCA9IDc7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IGVsc2UgeyBcCisgICAgICAgICAgICBtcWMtPmJwKys7IFwKKyAgICAgICAgICAgIGMgKz0gbF9jIDw8IDg7IFwKKyAgICAgICAgICAgIGN0ID0gODsgXAorICAgICAgICB9IFwKK30KKworLyogRm9yIGludGVybmFsIHVzZSBvZiBvcGpfbXFjX2RlY29kZV9tYWNybygpICovCisjZGVmaW5lIG9wal9tcWNfcmVub3JtZF9tYWNybyhtcWMsIGEsIGMsIGN0KSBcCit7IFwKKyAgICBkbyB7IFwKKyAgICAgICAgaWYgKGN0ID09IDApIHsgXAorICAgICAgICAgICAgb3BqX21xY19ieXRlaW5fbWFjcm8obXFjLCBjLCBjdCk7IFwKKyAgICAgICAgfSBcCisgICAgICAgIGEgPDw9IDE7IFwKKyAgICAgICAgYyA8PD0gMTsgXAorICAgICAgICBjdC0tOyBcCisgICAgfSB3aGlsZSAoYSA8IDB4ODAwMCk7IFwKK30KKworI2RlZmluZSBvcGpfbXFjX2RlY29kZV9tYWNybyhkLCBtcWMsIGN1cmN0eCwgYSwgYywgY3QpIFwKK3sgXAorICAgIC8qIEltcGxlbWVudHMgSVNPIDE1NDQ0LTEgQy4zLjIgRGVjb2RpbmcgYSBkZWNpc2lvbiAoREVDT0RFKSAqLyBcCisgICAgLyogTm90ZTogYWx0ZXJuYXRlICJKLjIgLSBEZWNvZGluZyBhbiBNUFMgb3IgYW4gTFBTIGluIHRoZSAqLyBcCisgICAgLyogc29mdHdhcmUtY29udmVudGlvbnMgZGVjb2RlciIgaGFzIGJlZW4gdHJpZWQsIGJ1dCBkb2VzIG5vdCBicmluZyBhbnkgKi8gXAorICAgIC8qIGltcHJvdmVtZW50LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3VjbG91dmFpbi9vcGVuanBlZy9pc3N1ZXMvOTIxICovIFwKKyAgICBhIC09ICgqY3VyY3R4KS0+cWV2YWw7ICBcCisgICAgaWYgKChjID4+IDE2KSA8ICgqY3VyY3R4KS0+cWV2YWwpIHsgIFwKKyAgICAgICAgb3BqX21xY19scHNleGNoYW5nZV9tYWNybyhkLCBjdXJjdHgsIGEpOyAgXAorICAgICAgICBvcGpfbXFjX3Jlbm9ybWRfbWFjcm8obXFjLCBhLCBjLCBjdCk7ICBcCisgICAgfSBlbHNlIHsgIFwKKyAgICAgICAgYyAtPSAoKmN1cmN0eCktPnFldmFsIDw8IDE2OyAgXAorICAgICAgICBpZiAoKGEgJiAweDgwMDApID09IDApIHsgXAorICAgICAgICAgICAgb3BqX21xY19tcHNleGNoYW5nZV9tYWNybyhkLCBjdXJjdHgsIGEpOyBcCisgICAgICAgICAgICBvcGpfbXFjX3Jlbm9ybWRfbWFjcm8obXFjLCBhLCBjLCBjdCk7IFwKKyAgICAgICAgfSBlbHNlIHsgXAorICAgICAgICAgICAgZCA9ICgqY3VyY3R4KS0+bXBzOyBcCisgICAgICAgIH0gXAorICAgIH0gXAorfQorCisjZGVmaW5lIERPV05MT0FEX01RQ19WQVJJQUJMRVMobXFjLCBjdXJjdHgsIGMsIGEsIGN0KSBcCisgICAgICAgIHJlZ2lzdGVyIGNvbnN0IG9wal9tcWNfc3RhdGVfdCAqKmN1cmN0eCA9IG1xYy0+Y3VyY3R4OyBcCisgICAgICAgIHJlZ2lzdGVyIE9QSl9VSU5UMzIgYyA9IG1xYy0+YzsgXAorICAgICAgICByZWdpc3RlciBPUEpfVUlOVDMyIGEgPSBtcWMtPmE7IFwKKyAgICAgICAgcmVnaXN0ZXIgT1BKX1VJTlQzMiBjdCA9IG1xYy0+Y3QKKworI2RlZmluZSBVUExPQURfTVFDX1ZBUklBQkxFUyhtcWMsIGN1cmN0eCwgYywgYSwgY3QpIFwKKyAgICAgICAgbXFjLT5jdXJjdHggPSBjdXJjdHg7IFwKKyAgICAgICAgbXFjLT5jID0gYzsgXAorICAgICAgICBtcWMtPmEgPSBhOyBcCisgICAgICAgIG1xYy0+Y3QgPSBjdDsKKworLyoqCitJbnB1dCBhIGJ5dGUKK0BwYXJhbSBtcWMgTVFDIGhhbmRsZQorKi8KK3N0YXRpYyBJTkxJTkUgdm9pZCBvcGpfbXFjX2J5dGVpbihvcGpfbXFjX3QgKmNvbnN0IG1xYykKK3sKKyAgICBvcGpfbXFjX2J5dGVpbl9tYWNybyhtcWMsIG1xYy0+YywgbXFjLT5jdCk7Cit9CisKKy8qKgorUmVub3JtYWxpemUgbXFjLT5hIGFuZCBtcWMtPmMgd2hpbGUgZGVjb2RpbmcKK0BwYXJhbSBtcWMgTVFDIGhhbmRsZQorKi8KKyNkZWZpbmUgb3BqX21xY19yZW5vcm1kKG1xYykgXAorICAgIG9wal9tcWNfcmVub3JtZF9tYWNybyhtcWMsIG1xYy0+YSwgbXFjLT5jLCBtcWMtPmN0KQorCisvKioKK0RlY29kZSBhIHN5bWJvbAorQHBhcmFtIGQgT1BKX1VJTlQzMiB2YWx1ZSB3aGVyZSB0byBzdG9yZSB0aGUgZGVjb2RlZCBzeW1ib2wKK0BwYXJhbSBtcWMgTVFDIGhhbmRsZQorQHJldHVybiBSZXR1cm5zIHRoZSBkZWNvZGVkIHN5bWJvbCAoMCBvciAxKSBpbiBkCisqLworI2RlZmluZSBvcGpfbXFjX2RlY29kZShkLCBtcWMpIFwKKyAgICBvcGpfbXFjX2RlY29kZV9tYWNybyhkLCBtcWMsIG1xYy0+Y3VyY3R4LCBtcWMtPmEsIG1xYy0+YywgbXFjLT5jdCkKKworI2VuZGlmIC8qIE9QSl9NUUNfSU5MX0ggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BlbmpwZWcuYyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BlbmpwZWcuYwppbmRleCA1MTE0Y2MxLi43YjEyMzAzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wZW5qcGVnLmMKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGVuanBlZy5jCkBAIC0xLDExICsxLDExIEBACiAvKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCiAgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCiAgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCiAgKgogICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZSIAorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGUgogICogQ29weXJpZ2h0IChjKSAyMDEyLCBDUyBTeXN0ZW1lcyBkJ0luZm9ybWF0aW9uLCBGcmFuY2UKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpAQCAtNDEsMTEwICs0MSwxMTMgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIEZ1bmN0aW9ucyB0byBzZXQgdGhlIG1lc3NhZ2UgaGFuZGxlcnMgKi8KIAotT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zZXRfaW5mb19oYW5kbGVyKAlvcGpfY29kZWNfdCAqIHBfY29kZWMsIAotCQkJCQkJCQkJCQlvcGpfbXNnX2NhbGxiYWNrIHBfY2FsbGJhY2ssCi0JCQkJCQkJCQkJCXZvaWQgKiBwX3VzZXJfZGF0YSkKK09QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0X2luZm9faGFuZGxlcihvcGpfY29kZWNfdCAqIHBfY29kZWMsCisgICAgICAgIG9wal9tc2dfY2FsbGJhY2sgcF9jYWxsYmFjaywKKyAgICAgICAgdm9pZCAqIHBfdXNlcl9kYXRhKQogewotCW9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKLQlpZighIGxfY29kZWMpewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQkKLQlsX2NvZGVjLT5tX2V2ZW50X21nci5pbmZvX2hhbmRsZXIgPSBwX2NhbGxiYWNrOwotCWxfY29kZWMtPm1fZXZlbnRfbWdyLm1faW5mb19kYXRhID0gcF91c2VyX2RhdGE7Ci0JCi0JcmV0dXJuIE9QSl9UUlVFOworICAgIG9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKKyAgICBpZiAoISBsX2NvZGVjKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgbF9jb2RlYy0+bV9ldmVudF9tZ3IuaW5mb19oYW5kbGVyID0gcF9jYWxsYmFjazsKKyAgICBsX2NvZGVjLT5tX2V2ZW50X21nci5tX2luZm9fZGF0YSA9IHBfdXNlcl9kYXRhOworCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1PUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldF93YXJuaW5nX2hhbmRsZXIoCW9wal9jb2RlY190ICogcF9jb2RlYywgCi0JCQkJCQkJCQkJCQlvcGpfbXNnX2NhbGxiYWNrIHBfY2FsbGJhY2ssCi0JCQkJCQkJCQkJCQl2b2lkICogcF91c2VyX2RhdGEpCitPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldF93YXJuaW5nX2hhbmRsZXIob3BqX2NvZGVjX3QgKiBwX2NvZGVjLAorICAgICAgICBvcGpfbXNnX2NhbGxiYWNrIHBfY2FsbGJhY2ssCisgICAgICAgIHZvaWQgKiBwX3VzZXJfZGF0YSkKIHsKLQlvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7Ci0JaWYgKCEgbF9jb2RlYykgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQkKLQlsX2NvZGVjLT5tX2V2ZW50X21nci53YXJuaW5nX2hhbmRsZXIgPSBwX2NhbGxiYWNrOwotCWxfY29kZWMtPm1fZXZlbnRfbWdyLm1fd2FybmluZ19kYXRhID0gcF91c2VyX2RhdGE7Ci0JCi0JcmV0dXJuIE9QSl9UUlVFOworICAgIG9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKKyAgICBpZiAoISBsX2NvZGVjKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgbF9jb2RlYy0+bV9ldmVudF9tZ3Iud2FybmluZ19oYW5kbGVyID0gcF9jYWxsYmFjazsKKyAgICBsX2NvZGVjLT5tX2V2ZW50X21nci5tX3dhcm5pbmdfZGF0YSA9IHBfdXNlcl9kYXRhOworCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1PUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldF9lcnJvcl9oYW5kbGVyKG9wal9jb2RlY190ICogcF9jb2RlYywgCi0JCQkJCQkJCQkJCW9wal9tc2dfY2FsbGJhY2sgcF9jYWxsYmFjaywKLQkJCQkJCQkJCQkJdm9pZCAqIHBfdXNlcl9kYXRhKQorT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zZXRfZXJyb3JfaGFuZGxlcihvcGpfY29kZWNfdCAqIHBfY29kZWMsCisgICAgICAgIG9wal9tc2dfY2FsbGJhY2sgcF9jYWxsYmFjaywKKyAgICAgICAgdm9pZCAqIHBfdXNlcl9kYXRhKQogewotCW9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKLQlpZiAoISBsX2NvZGVjKSB7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCQotCWxfY29kZWMtPm1fZXZlbnRfbWdyLmVycm9yX2hhbmRsZXIgPSBwX2NhbGxiYWNrOwotCWxfY29kZWMtPm1fZXZlbnRfbWdyLm1fZXJyb3JfZGF0YSA9IHBfdXNlcl9kYXRhOwotCQotCXJldHVybiBPUEpfVFJVRTsKKyAgICBvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7CisgICAgaWYgKCEgbF9jb2RlYykgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIGxfY29kZWMtPm1fZXZlbnRfbWdyLmVycm9yX2hhbmRsZXIgPSBwX2NhbGxiYWNrOworICAgIGxfY29kZWMtPm1fZXZlbnRfbWdyLm1fZXJyb3JfZGF0YSA9IHBfdXNlcl9kYXRhOworCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXN0YXRpYyBPUEpfU0laRV9UIG9wal9yZWFkX2Zyb21fZmlsZSAodm9pZCAqIHBfYnVmZmVyLCBPUEpfU0laRV9UIHBfbmJfYnl0ZXMsIEZJTEUgKiBwX2ZpbGUpCitzdGF0aWMgT1BKX1NJWkVfVCBvcGpfcmVhZF9mcm9tX2ZpbGUodm9pZCAqIHBfYnVmZmVyLCBPUEpfU0laRV9UIHBfbmJfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRSAqIHBfZmlsZSkKIHsKLQlPUEpfU0laRV9UIGxfbmJfcmVhZCA9IGZyZWFkKHBfYnVmZmVyLDEscF9uYl9ieXRlcyxwX2ZpbGUpOwotCXJldHVybiBsX25iX3JlYWQgPyBsX25iX3JlYWQgOiAoT1BKX1NJWkVfVCktMTsKKyAgICBPUEpfU0laRV9UIGxfbmJfcmVhZCA9IGZyZWFkKHBfYnVmZmVyLCAxLCBwX25iX2J5dGVzLCBwX2ZpbGUpOworICAgIHJldHVybiBsX25iX3JlYWQgPyBsX25iX3JlYWQgOiAoT1BKX1NJWkVfVCkgLSAxOwogfQogCi1zdGF0aWMgT1BKX1VJTlQ2NCBvcGpfZ2V0X2RhdGFfbGVuZ3RoX2Zyb21fZmlsZSAoRklMRSAqIHBfZmlsZSkKK3N0YXRpYyBPUEpfVUlOVDY0IG9wal9nZXRfZGF0YV9sZW5ndGhfZnJvbV9maWxlKEZJTEUgKiBwX2ZpbGUpCiB7Ci0JT1BKX09GRl9UIGZpbGVfbGVuZ3RoID0gMDsKKyAgICBPUEpfT0ZGX1QgZmlsZV9sZW5ndGggPSAwOwogCi0JT1BKX0ZTRUVLKHBfZmlsZSwgMCwgU0VFS19FTkQpOwotCWZpbGVfbGVuZ3RoID0gKE9QSl9PRkZfVClPUEpfRlRFTEwocF9maWxlKTsKLQlPUEpfRlNFRUsocF9maWxlLCAwLCBTRUVLX1NFVCk7CisgICAgT1BKX0ZTRUVLKHBfZmlsZSwgMCwgU0VFS19FTkQpOworICAgIGZpbGVfbGVuZ3RoID0gKE9QSl9PRkZfVClPUEpfRlRFTEwocF9maWxlKTsKKyAgICBPUEpfRlNFRUsocF9maWxlLCAwLCBTRUVLX1NFVCk7CiAKLQlyZXR1cm4gKE9QSl9VSU5UNjQpZmlsZV9sZW5ndGg7CisgICAgcmV0dXJuIChPUEpfVUlOVDY0KWZpbGVfbGVuZ3RoOwogfQogCi1zdGF0aWMgT1BKX1NJWkVfVCBvcGpfd3JpdGVfZnJvbV9maWxlICh2b2lkICogcF9idWZmZXIsIE9QSl9TSVpFX1QgcF9uYl9ieXRlcywgRklMRSAqIHBfZmlsZSkKK3N0YXRpYyBPUEpfU0laRV9UIG9wal93cml0ZV9mcm9tX2ZpbGUodm9pZCAqIHBfYnVmZmVyLCBPUEpfU0laRV9UIHBfbmJfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEUgKiBwX2ZpbGUpCiB7Ci0JcmV0dXJuIGZ3cml0ZShwX2J1ZmZlciwxLHBfbmJfYnl0ZXMscF9maWxlKTsKKyAgICByZXR1cm4gZndyaXRlKHBfYnVmZmVyLCAxLCBwX25iX2J5dGVzLCBwX2ZpbGUpOwogfQogCi1zdGF0aWMgT1BKX09GRl9UIG9wal9za2lwX2Zyb21fZmlsZSAoT1BKX09GRl9UIHBfbmJfYnl0ZXMsIEZJTEUgKiBwX3VzZXJfZGF0YSkKK3N0YXRpYyBPUEpfT0ZGX1Qgb3BqX3NraXBfZnJvbV9maWxlKE9QSl9PRkZfVCBwX25iX2J5dGVzLCBGSUxFICogcF91c2VyX2RhdGEpCiB7Ci0JaWYgKE9QSl9GU0VFSyhwX3VzZXJfZGF0YSxwX25iX2J5dGVzLFNFRUtfQ1VSKSkgewotCQlyZXR1cm4gLTE7Ci0JfQorICAgIGlmIChPUEpfRlNFRUsocF91c2VyX2RhdGEsIHBfbmJfYnl0ZXMsIFNFRUtfQ1VSKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0JcmV0dXJuIHBfbmJfYnl0ZXM7CisgICAgcmV0dXJuIHBfbmJfYnl0ZXM7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfc2Vla19mcm9tX2ZpbGUgKE9QSl9PRkZfVCBwX25iX2J5dGVzLCBGSUxFICogcF91c2VyX2RhdGEpCitzdGF0aWMgT1BKX0JPT0wgb3BqX3NlZWtfZnJvbV9maWxlKE9QSl9PRkZfVCBwX25iX2J5dGVzLCBGSUxFICogcF91c2VyX2RhdGEpCiB7Ci0JaWYgKE9QSl9GU0VFSyhwX3VzZXJfZGF0YSxwX25iX2J5dGVzLFNFRUtfU0VUKSkgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KKyAgICBpZiAoT1BKX0ZTRUVLKHBfdXNlcl9kYXRhLCBwX25iX2J5dGVzLCBTRUVLX1NFVCkpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLQlyZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAjaWZkZWYgX1dJTjMyCiAjaWZuZGVmIE9QSl9TVEFUSUMKIEJPT0wgQVBJRU5UUlkKLURsbE1haW4oSElOU1RBTkNFIGhNb2R1bGUsIERXT1JEIHVsX3JlYXNvbl9mb3JfY2FsbCwgTFBWT0lEIGxwUmVzZXJ2ZWQpIHsKK0RsbE1haW4oSElOU1RBTkNFIGhNb2R1bGUsIERXT1JEIHVsX3JlYXNvbl9mb3JfY2FsbCwgTFBWT0lEIGxwUmVzZXJ2ZWQpCit7CiAKLQlPUEpfQVJHX05PVF9VU0VEKGxwUmVzZXJ2ZWQpOwotCU9QSl9BUkdfTk9UX1VTRUQoaE1vZHVsZSk7CisgICAgT1BKX0FSR19OT1RfVVNFRChscFJlc2VydmVkKTsKKyAgICBPUEpfQVJHX05PVF9VU0VEKGhNb2R1bGUpOwogCi0Jc3dpdGNoICh1bF9yZWFzb25fZm9yX2NhbGwpIHsKLQkJY2FzZSBETExfUFJPQ0VTU19BVFRBQ0ggOgotCQkJYnJlYWs7Ci0JCWNhc2UgRExMX1BST0NFU1NfREVUQUNIIDoKLQkJCWJyZWFrOwotCQljYXNlIERMTF9USFJFQURfQVRUQUNIIDoKLQkJY2FzZSBETExfVEhSRUFEX0RFVEFDSCA6Ci0JCQlicmVhazsKKyAgICBzd2l0Y2ggKHVsX3JlYXNvbl9mb3JfY2FsbCkgeworICAgIGNhc2UgRExMX1BST0NFU1NfQVRUQUNIIDoKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBETExfUFJPQ0VTU19ERVRBQ0ggOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIERMTF9USFJFQURfQVRUQUNIIDoKKyAgICBjYXNlIERMTF9USFJFQURfREVUQUNIIDoKKyAgICAgICAgYnJlYWs7CiAgICAgfQogCiAgICAgcmV0dXJuIFRSVUU7CkBAIC0xNTQsNyArMTU3LDggQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1jb25zdCBjaGFyKiBPUEpfQ0FMTENPTlYgb3BqX3ZlcnNpb24odm9pZCkgeworY29uc3QgY2hhciogT1BKX0NBTExDT05WIG9wal92ZXJzaW9uKHZvaWQpCit7CiAgICAgcmV0dXJuIE9QSl9QQUNLQUdFX1ZFUlNJT047CiB9CiAKQEAgLTE2MywzNzMgKzE2Nyw0NDUgQEAKIAogb3BqX2NvZGVjX3QqIE9QSl9DQUxMQ09OViBvcGpfY3JlYXRlX2RlY29tcHJlc3MoT1BKX0NPREVDX0ZPUk1BVCBwX2Zvcm1hdCkKIHsKLQlvcGpfY29kZWNfcHJpdmF0ZV90ICpsX2NvZGVjID0gMDA7CisgICAgb3BqX2NvZGVjX3ByaXZhdGVfdCAqbF9jb2RlYyA9IDAwOwogCi0JbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90Kikgb3BqX2NhbGxvYygxLCBzaXplb2Yob3BqX2NvZGVjX3ByaXZhdGVfdCkpOwotCWlmICghbF9jb2RlYyl7Ci0JCXJldHVybiAwMDsKLQl9CisgICAgbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90Kikgb3BqX2NhbGxvYygxLCBzaXplb2Yob3BqX2NvZGVjX3ByaXZhdGVfdCkpOworICAgIGlmICghbF9jb2RlYykgeworICAgICAgICByZXR1cm4gMDA7CisgICAgfQogCi0JbF9jb2RlYy0+aXNfZGVjb21wcmVzc29yID0gMTsKKyAgICBsX2NvZGVjLT5pc19kZWNvbXByZXNzb3IgPSAxOwogCi0Jc3dpdGNoIChwX2Zvcm1hdCkgewotCQljYXNlIE9QSl9DT0RFQ19KMks6Ci0JCQlsX2NvZGVjLT5vcGpfZHVtcF9jb2RlYyA9ICh2b2lkICgqKSAodm9pZCosIE9QSl9JTlQzMiwgRklMRSopKSBqMmtfZHVtcDsKKyAgICBzd2l0Y2ggKHBfZm9ybWF0KSB7CisgICAgY2FzZSBPUEpfQ09ERUNfSjJLOgorICAgICAgICBsX2NvZGVjLT5vcGpfZHVtcF9jb2RlYyA9ICh2b2lkICgqKSh2b2lkKiwgT1BKX0lOVDMyLCBGSUxFKikpIGoya19kdW1wOwogCi0JCQlsX2NvZGVjLT5vcGpfZ2V0X2NvZGVjX2luZm8gPSAob3BqX2NvZGVzdHJlYW1faW5mb192Ml90KiAoKikgKHZvaWQqKSApIGoya19nZXRfY3N0cl9pbmZvOworICAgICAgICBsX2NvZGVjLT5vcGpfZ2V0X2NvZGVjX2luZm8gPSAob3BqX2NvZGVzdHJlYW1faW5mb192Ml90KiAoKikoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCopKSBqMmtfZ2V0X2NzdHJfaW5mbzsKIAotCQkJbF9jb2RlYy0+b3BqX2dldF9jb2RlY19pbmRleCA9IChvcGpfY29kZXN0cmVhbV9pbmRleF90KiAoKikgKHZvaWQqKSApIGoya19nZXRfY3N0cl9pbmRleDsKKyAgICAgICAgbF9jb2RlYy0+b3BqX2dldF9jb2RlY19pbmRleCA9IChvcGpfY29kZXN0cmVhbV9pbmRleF90KiAoKikoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKSkgajJrX2dldF9jc3RyX2luZGV4OwogCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9kZWNvZGUgPQotCQkJCQkoT1BKX0JPT0wgKCopICgJdm9pZCAqLAotCQkJCQkJCQkJc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAotCQkJCQkJCQkJb3BqX2ltYWdlX3QqLCBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqICkpIG9wal9qMmtfZGVjb2RlOworICAgICAgICBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9kZWNvZGUgPQorICAgICAgICAgICAgKE9QSl9CT09MKCopKHZvaWQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICosCisgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QqLCBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSkgb3BqX2oya19kZWNvZGU7CiAKLQkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX2VuZF9kZWNvbXByZXNzID0KLQkJCQkJKE9QSl9CT09MICgqKSAoCXZvaWQgKiwKLQkJCQkJCQkJCXN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKLQkJCQkJCQkJCXN0cnVjdCBvcGpfZXZlbnRfbWdyICopKSBvcGpfajJrX2VuZF9kZWNvbXByZXNzOworICAgICAgICBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9lbmRfZGVjb21wcmVzcyA9CisgICAgICAgICAgICAoT1BKX0JPT0woKikodm9pZCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSkgb3BqX2oya19lbmRfZGVjb21wcmVzczsKIAotCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfcmVhZF9oZWFkZXIgPQotCQkJCQkoT1BKX0JPT0wgKCopICgJc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAotCQkJCQkJCQkJdm9pZCAqLAotCQkJCQkJCQkJb3BqX2ltYWdlX3QgKiosCi0JCQkJCQkJCQlzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqICkpIG9wal9qMmtfcmVhZF9oZWFkZXI7CisgICAgICAgIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX3JlYWRfaGVhZGVyID0KKyAgICAgICAgICAgIChPUEpfQk9PTCgqKShzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICosCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90ICoqLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICopKSBvcGpfajJrX3JlYWRfaGVhZGVyOwogCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9kZXN0cm95ID0KLQkJCQkJKHZvaWQgKCopICh2b2lkICopKW9wal9qMmtfZGVzdHJveTsKKyAgICAgICAgbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfZGVzdHJveSA9CisgICAgICAgICAgICAodm9pZCAoKikodm9pZCAqKSlvcGpfajJrX2Rlc3Ryb3k7CiAKLQkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX3NldHVwX2RlY29kZXIgPQotCQkJCQkodm9pZCAoKikgKHZvaWQgKiAsIG9wal9kcGFyYW1ldGVyc190ICogKSkgb3BqX2oya19zZXR1cF9kZWNvZGVyOworICAgICAgICBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9zZXR1cF9kZWNvZGVyID0KKyAgICAgICAgICAgICh2b2lkICgqKSh2b2lkICosIG9wal9kcGFyYW1ldGVyc190ICopKSBvcGpfajJrX3NldHVwX2RlY29kZXI7CiAKLQkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX3JlYWRfdGlsZV9oZWFkZXIgPQotCQkJCQkoT1BKX0JPT0wgKCopICgJdm9pZCAqLAotCQkJCQkJCQkJT1BKX1VJTlQzMiosCi0JCQkJCQkJCQlPUEpfVUlOVDMyKiwKLQkJCQkJCQkJCU9QSl9JTlQzMiosIE9QSl9JTlQzMiosCi0JCQkJCQkJCQlPUEpfSU5UMzIqLCBPUEpfSU5UMzIqLAotCQkJCQkJCQkJT1BKX1VJTlQzMiosCi0JCQkJCQkJCQlPUEpfQk9PTCosCi0JCQkJCQkJCQlzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICosCi0JCQkJCQkJCQlzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqICkpIG9wal9qMmtfcmVhZF90aWxlX2hlYWRlcjsKKyAgICAgICAgbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfcmVhZF90aWxlX2hlYWRlciA9CisgICAgICAgICAgICAoT1BKX0JPT0woKikodm9pZCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiosIE9QSl9JTlQzMiosCisgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyKiwgT1BKX0lOVDMyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQk9PTCosCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICopKSBvcGpfajJrX3JlYWRfdGlsZV9oZWFkZXI7CiAKLQkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX2RlY29kZV90aWxlX2RhdGEgPQotCQkJCQkoT1BKX0JPT0wgKCopICggdm9pZCAqLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUqLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKikpIG9wal9qMmtfZGVjb2RlX3RpbGU7CisgICAgICAgIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX2RlY29kZV90aWxlX2RhdGEgPQorICAgICAgICAgICAgKE9QSl9CT09MKCopKHZvaWQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSkgb3BqX2oya19kZWNvZGVfdGlsZTsKIAotCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfc2V0X2RlY29kZV9hcmVhID0KLQkJCQkJKE9QSl9CT09MICgqKSAoIHZvaWQgKiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCosIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyLCBPUEpfSU5UMzIsIE9QSl9JTlQzMiwgT1BKX0lOVDMyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICopKSBvcGpfajJrX3NldF9kZWNvZGVfYXJlYTsKKyAgICAgICAgbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfc2V0X2RlY29kZV9hcmVhID0KKyAgICAgICAgICAgIChPUEpfQk9PTCgqKSh2b2lkICosCisgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QqLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiwgT1BKX0lOVDMyLCBPUEpfSU5UMzIsIE9QSl9JTlQzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSkgb3BqX2oya19zZXRfZGVjb2RlX2FyZWE7CiAKLQkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX2dldF9kZWNvZGVkX3RpbGUgPSAKLSAgICAgICAgICAgICAgICAgICAgKE9QSl9CT09MICgqKSAoIHZvaWQgKnBfY29kZWMsCi0JCQkJCQkJCSAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9jaW8sCi0JCQkJCQkJCSAgICBvcGpfaW1hZ2VfdCAqcF9pbWFnZSwKLQkJCQkJCQkJICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyLAotCQkJCQkJCQkgICAgT1BKX1VJTlQzMiB0aWxlX2luZGV4KSkgb3BqX2oya19nZXRfdGlsZTsKKyAgICAgICAgbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfZ2V0X2RlY29kZWRfdGlsZSA9CisgICAgICAgICAgICAoT1BKX0JPT0woKikodm9pZCAqcF9jb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9jaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlX2luZGV4KSkgb3BqX2oya19nZXRfdGlsZTsKIAotCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3IgPSAKLSAgICAgICAgICAgICAgICAgICAgKE9QSl9CT09MICgqKSAoIHZvaWQgKiBwX2NvZGVjLAotCQkJCQkJCQkJT1BKX1VJTlQzMiByZXNfZmFjdG9yLAotCQkJCQkJCQkJc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIpKSBvcGpfajJrX3NldF9kZWNvZGVkX3Jlc29sdXRpb25fZmFjdG9yOworICAgICAgICBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9zZXRfZGVjb2RlZF9yZXNvbHV0aW9uX2ZhY3RvciA9CisgICAgICAgICAgICAoT1BKX0JPT0woKikodm9pZCAqIHBfY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiByZXNfZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyKSkgb3BqX2oya19zZXRfZGVjb2RlZF9yZXNvbHV0aW9uX2ZhY3RvcjsKIAotCQkJbF9jb2RlYy0+bV9jb2RlYyA9IG9wal9qMmtfY3JlYXRlX2RlY29tcHJlc3MoKTsKKyAgICAgICAgbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfc2V0X2RlY29kZWRfY29tcG9uZW50cyA9CisgICAgICAgICAgICAoT1BKX0JPT0woKikodm9pZCAqIHBfY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBudW1jb21wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfVUlOVDMyICogY29tcHNfaW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlcikpIG9wal9qMmtfc2V0X2RlY29kZWRfY29tcG9uZW50czsKIAotCQkJaWYgKCEgbF9jb2RlYy0+bV9jb2RlYykgewotCQkJCW9wal9mcmVlKGxfY29kZWMpOwotCQkJCXJldHVybiBOVUxMOwotCQkJfQorICAgICAgICBsX2NvZGVjLT5vcGpfc2V0X3RocmVhZHMgPQorICAgICAgICAgICAgKE9QSl9CT09MKCopKHZvaWQgKiBwX2NvZGVjLCBPUEpfVUlOVDMyIG51bV90aHJlYWRzKSkgb3BqX2oya19zZXRfdGhyZWFkczsKIAotCQkJYnJlYWs7CisgICAgICAgIGxfY29kZWMtPm1fY29kZWMgPSBvcGpfajJrX2NyZWF0ZV9kZWNvbXByZXNzKCk7CiAKLQkJY2FzZSBPUEpfQ09ERUNfSlAyOgotCQkJLyogZ2V0IGEgSlAyIGRlY29kZXIgaGFuZGxlICovCi0JCQlsX2NvZGVjLT5vcGpfZHVtcF9jb2RlYyA9ICh2b2lkICgqKSAodm9pZCosIE9QSl9JTlQzMiwgRklMRSopKSBqcDJfZHVtcDsKKyAgICAgICAgaWYgKCEgbF9jb2RlYy0+bV9jb2RlYykgeworICAgICAgICAgICAgb3BqX2ZyZWUobF9jb2RlYyk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCQlsX2NvZGVjLT5vcGpfZ2V0X2NvZGVjX2luZm8gPSAob3BqX2NvZGVzdHJlYW1faW5mb192Ml90KiAoKikgKHZvaWQqKSApIGpwMl9nZXRfY3N0cl9pbmZvOworICAgICAgICBicmVhazsKIAotCQkJbF9jb2RlYy0+b3BqX2dldF9jb2RlY19pbmRleCA9IChvcGpfY29kZXN0cmVhbV9pbmRleF90KiAoKikgKHZvaWQqKSApIGpwMl9nZXRfY3N0cl9pbmRleDsKKyAgICBjYXNlIE9QSl9DT0RFQ19KUDI6CisgICAgICAgIC8qIGdldCBhIEpQMiBkZWNvZGVyIGhhbmRsZSAqLworICAgICAgICBsX2NvZGVjLT5vcGpfZHVtcF9jb2RlYyA9ICh2b2lkICgqKSh2b2lkKiwgT1BKX0lOVDMyLCBGSUxFKikpIGpwMl9kdW1wOwogCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9kZWNvZGUgPQotCQkJCQkoT1BKX0JPT0wgKCopICgJdm9pZCAqLAotCQkJCQkJCQkJc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAotCQkJCQkJCQkJb3BqX2ltYWdlX3QqLAotCQkJCQkJCQkJc3RydWN0IG9wal9ldmVudF9tZ3IgKiApKSBvcGpfanAyX2RlY29kZTsKKyAgICAgICAgbF9jb2RlYy0+b3BqX2dldF9jb2RlY19pbmZvID0gKG9wal9jb2Rlc3RyZWFtX2luZm9fdjJfdCogKCopKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKSkganAyX2dldF9jc3RyX2luZm87CiAKLQkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX2VuZF9kZWNvbXByZXNzID0gIAotICAgICAgICAgICAgICAgICAgICAoT1BKX0JPT0wgKCopICggdm9pZCAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKikpIG9wal9qcDJfZW5kX2RlY29tcHJlc3M7CisgICAgICAgIGxfY29kZWMtPm9wal9nZXRfY29kZWNfaW5kZXggPSAob3BqX2NvZGVzdHJlYW1faW5kZXhfdCogKCopKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKikpIGpwMl9nZXRfY3N0cl9pbmRleDsKIAotCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfcmVhZF9oZWFkZXIgPSAgCi0gICAgICAgICAgICAgICAgICAgIChPUEpfQk9PTCAoKikgKCBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICosCi0JCQkJCSAgICAgICAgICAgICAgICB2b2lkICosCi0JCQkJCSAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqKiwKLQkJCQkJICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogKSkgb3BqX2pwMl9yZWFkX2hlYWRlcjsKKyAgICAgICAgbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfZGVjb2RlID0KKyAgICAgICAgICAgIChPUEpfQk9PTCgqKSh2b2lkICosCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSkgb3BqX2pwMl9kZWNvZGU7CiAKLQkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX3JlYWRfdGlsZV9oZWFkZXIgPSAKLSAgICAgICAgICAgICAgICAgICAgKE9QSl9CT09MICgqKSAoIHZvaWQgKiwKLQkJCQkJICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIqLAotCQkJCQkgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiosCi0JCQkJCSAgICAgICAgICAgICAgICBPUEpfSU5UMzIqLAotCQkJCQkgICAgICAgICAgICAgICAgT1BKX0lOVDMyKiwKLQkJCQkJICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqICwKLQkJCQkJICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqICwKLQkJCQkJICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiAsCi0JCQkJCSAgICAgICAgICAgICAgICBPUEpfQk9PTCAqLAotCQkJCQkgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAotCQkJCQkgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiApKSBvcGpfanAyX3JlYWRfdGlsZV9oZWFkZXI7CisgICAgICAgIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX2VuZF9kZWNvbXByZXNzID0KKyAgICAgICAgICAgIChPUEpfQk9PTCgqKSh2b2lkICosCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICopKSBvcGpfanAyX2VuZF9kZWNvbXByZXNzOwogCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9kZWNvZGVfdGlsZV9kYXRhID0gCi0gICAgICAgICAgICAgICAgICAgIChPUEpfQk9PTCAoKikgKCB2b2lkICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyLE9QSl9CWVRFKixPUEpfVUlOVDMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiApKSBvcGpfanAyX2RlY29kZV90aWxlOworICAgICAgICBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9yZWFkX2hlYWRlciA9CisgICAgICAgICAgICAoT1BKX0JPT0woKikoc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSkgb3BqX2pwMl9yZWFkX2hlYWRlcjsKIAotCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfZGVzdHJveSA9ICh2b2lkICgqKSAodm9pZCAqKSlvcGpfanAyX2Rlc3Ryb3k7CisgICAgICAgIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX3JlYWRfdGlsZV9oZWFkZXIgPQorICAgICAgICAgICAgKE9QSl9CT09MKCopKHZvaWQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIqLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiosCisgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CT09MICosCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICopKSBvcGpfanAyX3JlYWRfdGlsZV9oZWFkZXI7CiAKLQkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX3NldHVwX2RlY29kZXIgPSAKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKCopICh2b2lkICogLG9wal9kcGFyYW1ldGVyc190ICogKSkgb3BqX2pwMl9zZXR1cF9kZWNvZGVyOworICAgICAgICBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9kZWNvZGVfdGlsZV9kYXRhID0KKyAgICAgICAgICAgIChPUEpfQk9PTCgqKSh2b2lkICosCisgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiwgT1BKX0JZVEUqLCBPUEpfVUlOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSkgb3BqX2pwMl9kZWNvZGVfdGlsZTsKIAotCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfc2V0X2RlY29kZV9hcmVhID0gCi0gICAgICAgICAgICAgICAgICAgIChPUEpfQk9PTCAoKikgKCB2b2lkICosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCosIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyLE9QSl9JTlQzMixPUEpfSU5UMzIsT1BKX0lOVDMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiApKSBvcGpfanAyX3NldF9kZWNvZGVfYXJlYTsKKyAgICAgICAgbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfZGVzdHJveSA9ICh2b2lkICgqKSgKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSlvcGpfanAyX2Rlc3Ryb3k7CiAKLQkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX2dldF9kZWNvZGVkX3RpbGUgPSAKLSAgICAgICAgICAgICAgICAgICAgKE9QSl9CT09MICgqKSAoIHZvaWQgKnBfY29kZWMsCi0JCQkJCQkJCQlvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9jaW8sCi0JCQkJCQkJCQlvcGpfaW1hZ2VfdCAqcF9pbWFnZSwKLQkJCQkJCQkJCXN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyLAotCQkJCQkJCQkJT1BKX1VJTlQzMiB0aWxlX2luZGV4KSkgb3BqX2pwMl9nZXRfdGlsZTsKKyAgICAgICAgbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfc2V0dXBfZGVjb2RlciA9CisgICAgICAgICAgICAodm9pZCAoKikodm9pZCAqLCBvcGpfZHBhcmFtZXRlcnNfdCAqKSkgb3BqX2pwMl9zZXR1cF9kZWNvZGVyOwogCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9zZXRfZGVjb2RlZF9yZXNvbHV0aW9uX2ZhY3RvciA9IAotICAgICAgICAgICAgICAgICAgICAoT1BKX0JPT0wgKCopICggdm9pZCAqIHBfY29kZWMsCi0JCQkJCQkgICAgCQlPUEpfVUlOVDMyIHJlc19mYWN0b3IsCi0JCQkJCQkJICAgIAlvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpKSBvcGpfanAyX3NldF9kZWNvZGVkX3Jlc29sdXRpb25fZmFjdG9yOworICAgICAgICBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9zZXRfZGVjb2RlX2FyZWEgPQorICAgICAgICAgICAgKE9QSl9CT09MKCopKHZvaWQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCosCisgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyLCBPUEpfSU5UMzIsIE9QSl9JTlQzMiwgT1BKX0lOVDMyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICopKSBvcGpfanAyX3NldF9kZWNvZGVfYXJlYTsKIAotCQkJbF9jb2RlYy0+bV9jb2RlYyA9IG9wal9qcDJfY3JlYXRlKE9QSl9UUlVFKTsKKyAgICAgICAgbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfZ2V0X2RlY29kZWRfdGlsZSA9CisgICAgICAgICAgICAoT1BKX0JPT0woKikodm9pZCAqcF9jb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqcF9jaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlX2luZGV4KSkgb3BqX2pwMl9nZXRfdGlsZTsKIAotCQkJaWYgKCEgbF9jb2RlYy0+bV9jb2RlYykgewotCQkJCW9wal9mcmVlKGxfY29kZWMpOwotCQkJCXJldHVybiAwMDsKLQkJCX0KKyAgICAgICAgbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3IgPQorICAgICAgICAgICAgKE9QSl9CT09MKCopKHZvaWQgKiBwX2NvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcmVzX2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKiBwX21hbmFnZXIpKSBvcGpfanAyX3NldF9kZWNvZGVkX3Jlc29sdXRpb25fZmFjdG9yOwogCi0JCQlicmVhazsKLQkJY2FzZSBPUEpfQ09ERUNfVU5LTk9XTjoKLQkJY2FzZSBPUEpfQ09ERUNfSlBUOgotCQlkZWZhdWx0OgotCQkJb3BqX2ZyZWUobF9jb2RlYyk7Ci0JCQlyZXR1cm4gMDA7Ci0JfQorICAgICAgICBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9zZXRfZGVjb2RlZF9jb21wb25lbnRzID0KKyAgICAgICAgICAgIChPUEpfQk9PTCgqKSh2b2lkICogcF9jb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG51bWNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9QSl9VSU5UMzIgKiBjb21wc19pbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyKSkgb3BqX2pwMl9zZXRfZGVjb2RlZF9jb21wb25lbnRzOwogCi0Jb3BqX3NldF9kZWZhdWx0X2V2ZW50X2hhbmRsZXIoJihsX2NvZGVjLT5tX2V2ZW50X21ncikpOwotCXJldHVybiAob3BqX2NvZGVjX3QqKSBsX2NvZGVjOworICAgICAgICBsX2NvZGVjLT5vcGpfc2V0X3RocmVhZHMgPQorICAgICAgICAgICAgKE9QSl9CT09MKCopKHZvaWQgKiBwX2NvZGVjLCBPUEpfVUlOVDMyIG51bV90aHJlYWRzKSkgb3BqX2pwMl9zZXRfdGhyZWFkczsKKworICAgICAgICBsX2NvZGVjLT5tX2NvZGVjID0gb3BqX2pwMl9jcmVhdGUoT1BKX1RSVUUpOworCisgICAgICAgIGlmICghIGxfY29kZWMtPm1fY29kZWMpIHsKKyAgICAgICAgICAgIG9wal9mcmVlKGxfY29kZWMpOworICAgICAgICAgICAgcmV0dXJuIDAwOworICAgICAgICB9CisKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPUEpfQ09ERUNfVU5LTk9XTjoKKyAgICBjYXNlIE9QSl9DT0RFQ19KUFQ6CisgICAgZGVmYXVsdDoKKyAgICAgICAgb3BqX2ZyZWUobF9jb2RlYyk7CisgICAgICAgIHJldHVybiAwMDsKKyAgICB9CisKKyAgICBvcGpfc2V0X2RlZmF1bHRfZXZlbnRfaGFuZGxlcigmKGxfY29kZWMtPm1fZXZlbnRfbWdyKSk7CisgICAgcmV0dXJuIChvcGpfY29kZWNfdCopIGxfY29kZWM7CiB9CiAKLXZvaWQgT1BKX0NBTExDT05WIG9wal9zZXRfZGVmYXVsdF9kZWNvZGVyX3BhcmFtZXRlcnMob3BqX2RwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMpIHsKLQlpZihwYXJhbWV0ZXJzKSB7Ci0JCW1lbXNldChwYXJhbWV0ZXJzLCAwLCBzaXplb2Yob3BqX2RwYXJhbWV0ZXJzX3QpKTsKLQkJLyogZGVmYXVsdCBkZWNvZGluZyBwYXJhbWV0ZXJzICovCi0JCXBhcmFtZXRlcnMtPmNwX2xheWVyID0gMDsKLQkJcGFyYW1ldGVycy0+Y3BfcmVkdWNlID0gMDsKK3ZvaWQgT1BKX0NBTExDT05WIG9wal9zZXRfZGVmYXVsdF9kZWNvZGVyX3BhcmFtZXRlcnMob3BqX2RwYXJhbWV0ZXJzX3QKKyAgICAgICAgKnBhcmFtZXRlcnMpCit7CisgICAgaWYgKHBhcmFtZXRlcnMpIHsKKyAgICAgICAgbWVtc2V0KHBhcmFtZXRlcnMsIDAsIHNpemVvZihvcGpfZHBhcmFtZXRlcnNfdCkpOworICAgICAgICAvKiBkZWZhdWx0IGRlY29kaW5nIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgcGFyYW1ldGVycy0+Y3BfbGF5ZXIgPSAwOworICAgICAgICBwYXJhbWV0ZXJzLT5jcF9yZWR1Y2UgPSAwOwogCi0JCXBhcmFtZXRlcnMtPmRlY29kX2Zvcm1hdCA9IC0xOwotCQlwYXJhbWV0ZXJzLT5jb2RfZm9ybWF0ID0gLTE7Ci0JCXBhcmFtZXRlcnMtPmZsYWdzID0gMDsJCQotLyogVW5pUEc+PiAqLworICAgICAgICBwYXJhbWV0ZXJzLT5kZWNvZF9mb3JtYXQgPSAtMTsKKyAgICAgICAgcGFyYW1ldGVycy0+Y29kX2Zvcm1hdCA9IC0xOworICAgICAgICBwYXJhbWV0ZXJzLT5mbGFncyA9IDA7CisgICAgICAgIC8qIFVuaVBHPj4gKi8KICNpZmRlZiBVU0VfSlBXTAotCQlwYXJhbWV0ZXJzLT5qcHdsX2NvcnJlY3QgPSBPUEpfRkFMU0U7Ci0JCXBhcmFtZXRlcnMtPmpwd2xfZXhwX2NvbXBzID0gSlBXTF9FWFBFQ1RFRF9DT01QT05FTlRTOwotCQlwYXJhbWV0ZXJzLT5qcHdsX21heF90aWxlcyA9IEpQV0xfTUFYSU1VTV9USUxFUzsKKyAgICAgICAgcGFyYW1ldGVycy0+anB3bF9jb3JyZWN0ID0gT1BKX0ZBTFNFOworICAgICAgICBwYXJhbWV0ZXJzLT5qcHdsX2V4cF9jb21wcyA9IEpQV0xfRVhQRUNURURfQ09NUE9ORU5UUzsKKyAgICAgICAgcGFyYW1ldGVycy0+anB3bF9tYXhfdGlsZXMgPSBKUFdMX01BWElNVU1fVElMRVM7CiAjZW5kaWYgLyogVVNFX0pQV0wgKi8KLS8qIDw8VW5pUEcgKi8KLQl9CisgICAgICAgIC8qIDw8VW5pUEcgKi8KKyAgICB9Cit9CisKKworT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9jb2RlY19zZXRfdGhyZWFkcyhvcGpfY29kZWNfdCAqcF9jb2RlYywKKyAgICAgICAgaW50IG51bV90aHJlYWRzKQoreworICAgIGlmIChwX2NvZGVjICYmIChudW1fdGhyZWFkcyA+PSAwKSkgeworICAgICAgICBvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7CisKKyAgICAgICAgcmV0dXJuIGxfY29kZWMtPm9wal9zZXRfdGhyZWFkcyhsX2NvZGVjLT5tX2NvZGVjLCAoT1BKX1VJTlQzMiludW1fdGhyZWFkcyk7CisgICAgfQorICAgIHJldHVybiBPUEpfRkFMU0U7CiB9CiAKIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0dXBfZGVjb2RlcihvcGpfY29kZWNfdCAqcF9jb2RlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZHBhcmFtZXRlcnNfdCAqcGFyYW1ldGVycyAKLQkJCQkJCQkJCQkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2RwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLQlpZiAocF9jb2RlYyAmJiBwYXJhbWV0ZXJzKSB7IAotCQlvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7CisgICAgaWYgKHBfY29kZWMgJiYgcGFyYW1ldGVycykgeworICAgICAgICBvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7CiAKLQkJaWYgKCEgbF9jb2RlYy0+aXNfZGVjb21wcmVzc29yKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKCYobF9jb2RlYy0+bV9ldmVudF9tZ3IpLCBFVlRfRVJST1IsIAotICAgICAgICAgICAgICAgICJDb2RlYyBwcm92aWRlZCB0byB0aGUgb3BqX3NldHVwX2RlY29kZXIgZnVuY3Rpb24gaXMgbm90IGEgZGVjb21wcmVzc29yIGhhbmRsZXIuXG4iKTsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KKyAgICAgICAgaWYgKCEgbF9jb2RlYy0+aXNfZGVjb21wcmVzc29yKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKCYobF9jb2RlYy0+bV9ldmVudF9tZ3IpLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDb2RlYyBwcm92aWRlZCB0byB0aGUgb3BqX3NldHVwX2RlY29kZXIgZnVuY3Rpb24gaXMgbm90IGEgZGVjb21wcmVzc29yIGhhbmRsZXIuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KIAotCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9zZXR1cF9kZWNvZGVyKGxfY29kZWMtPm1fY29kZWMsCi0JCQkJCQkJCQkJCQkJCQkJcGFyYW1ldGVycyk7Ci0JCXJldHVybiBPUEpfVFJVRTsKLQl9Ci0JcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfc2V0dXBfZGVjb2RlcihsX2NvZGVjLT5tX2NvZGVjLAorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMpOworICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgfQorICAgIHJldHVybiBPUEpfRkFMU0U7CiB9CiAKLU9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfcmVhZF9oZWFkZXIgKAlvcGpfc3RyZWFtX3QgKnBfc3RyZWFtLAotCQkJCQkJCQkJCW9wal9jb2RlY190ICpwX2NvZGVjLAotCQkJCQkJCQkJCW9wal9pbWFnZV90ICoqcF9pbWFnZSApCitPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3JlYWRfaGVhZGVyKG9wal9zdHJlYW1fdCAqcF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2RlY190ICpwX2NvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqKnBfaW1hZ2UpCiB7Ci0JaWYgKHBfY29kZWMgJiYgcF9zdHJlYW0pIHsKLQkJb3BqX2NvZGVjX3ByaXZhdGVfdCogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90KikgcF9jb2RlYzsKLQkJb3BqX3N0cmVhbV9wcml2YXRlX3QqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90KikgcF9zdHJlYW07CisgICAgaWYgKHBfY29kZWMgJiYgcF9zdHJlYW0pIHsKKyAgICAgICAgb3BqX2NvZGVjX3ByaXZhdGVfdCogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90KikgcF9jb2RlYzsKKyAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90KikgcF9zdHJlYW07CiAKLQkJaWYoISBsX2NvZGVjLT5pc19kZWNvbXByZXNzb3IpIHsKLQkJCW9wal9ldmVudF9tc2coJihsX2NvZGVjLT5tX2V2ZW50X21nciksIEVWVF9FUlJPUiwgCi0gICAgICAgICAgICAgICAgIkNvZGVjIHByb3ZpZGVkIHRvIHRoZSBvcGpfcmVhZF9oZWFkZXIgZnVuY3Rpb24gaXMgbm90IGEgZGVjb21wcmVzc29yIGhhbmRsZXIuXG4iKTsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KKyAgICAgICAgaWYgKCEgbF9jb2RlYy0+aXNfZGVjb21wcmVzc29yKSB7CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKCYobF9jb2RlYy0+bV9ldmVudF9tZ3IpLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDb2RlYyBwcm92aWRlZCB0byB0aGUgb3BqX3JlYWRfaGVhZGVyIGZ1bmN0aW9uIGlzIG5vdCBhIGRlY29tcHJlc3NvciBoYW5kbGVyLlxuIik7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CiAKLQkJcmV0dXJuIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX3JlYWRfaGVhZGVyKAlsX3N0cmVhbSwKLQkJCQkJCQkJCQkJCQkJCQkJCWxfY29kZWMtPm1fY29kZWMsCi0JCQkJCQkJCQkJCQkJCQkJCQlwX2ltYWdlLAotCQkJCQkJCQkJCQkJCQkJCQkJJihsX2NvZGVjLT5tX2V2ZW50X21ncikgKTsKLQl9CisgICAgICAgIHJldHVybiBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9yZWFkX2hlYWRlcihsX3N0cmVhbSwKKyAgICAgICAgICAgICAgICBsX2NvZGVjLT5tX2NvZGVjLAorICAgICAgICAgICAgICAgIHBfaW1hZ2UsCisgICAgICAgICAgICAgICAgJihsX2NvZGVjLT5tX2V2ZW50X21ncikpOworICAgIH0KIAotCXJldHVybiBPUEpfRkFMU0U7CisgICAgcmV0dXJuIE9QSl9GQUxTRTsKIH0KIAotT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9kZWNvZGUoICAgb3BqX2NvZGVjX3QgKnBfY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3QgKnBfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QqIHBfaW1hZ2UpCisKK09QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0X2RlY29kZWRfY29tcG9uZW50cyhvcGpfY29kZWNfdCAqcF9jb2RlYywKKyAgICAgICAgT1BKX1VJTlQzMiBudW1jb21wcywKKyAgICAgICAgY29uc3QgT1BKX1VJTlQzMiogY29tcHNfaW5kaWNlcywKKyAgICAgICAgT1BKX0JPT0wgYXBwbHlfY29sb3JfdHJhbnNmb3JtcykKIHsKLQlpZiAocF9jb2RlYyAmJiBwX3N0cmVhbSkgewotCQlvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7Ci0JCW9wal9zdHJlYW1fcHJpdmF0ZV90ICogbF9zdHJlYW0gPSAob3BqX3N0cmVhbV9wcml2YXRlX3QgKikgcF9zdHJlYW07CisgICAgaWYgKHBfY29kZWMpIHsKKyAgICAgICAgb3BqX2NvZGVjX3ByaXZhdGVfdCAqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCAqKSBwX2NvZGVjOwogCi0JCWlmICghIGxfY29kZWMtPmlzX2RlY29tcHJlc3NvcikgewotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQorICAgICAgICBpZiAoISBsX2NvZGVjLT5pc19kZWNvbXByZXNzb3IpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2coJihsX2NvZGVjLT5tX2V2ZW50X21nciksIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvZGVjIHByb3ZpZGVkIHRvIHRoZSBvcGpfc2V0X2RlY29kZWRfY29tcG9uZW50cyBmdW5jdGlvbiBpcyBub3QgYSBkZWNvbXByZXNzb3IgaGFuZGxlci5cbiIpOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQogCi0JCXJldHVybiBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9kZWNvZGUobF9jb2RlYy0+bV9jb2RlYywKLQkJCQkJCQkJCQkJCQkJCQlsX3N0cmVhbSwKLQkJCQkJCQkJCQkJCQkJCQlwX2ltYWdlLAotCQkJCQkJCQkJCQkJCQkJCSYobF9jb2RlYy0+bV9ldmVudF9tZ3IpICk7Ci0JfQorICAgICAgICBpZiAoYXBwbHlfY29sb3JfdHJhbnNmb3JtcykgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZygmKGxfY29kZWMtPm1fZXZlbnRfbWdyKSwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiYXBwbHlfY29sb3JfdHJhbnNmb3JtcyA9IE9QSl9UUlVFIGlzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KIAotCXJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIHJldHVybiAgbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfc2V0X2RlY29kZWRfY29tcG9uZW50cygKKyAgICAgICAgICAgICAgICAgICAgbF9jb2RlYy0+bV9jb2RlYywKKyAgICAgICAgICAgICAgICAgICAgbnVtY29tcHMsCisgICAgICAgICAgICAgICAgICAgIGNvbXBzX2luZGljZXMsCisgICAgICAgICAgICAgICAgICAgICYobF9jb2RlYy0+bV9ldmVudF9tZ3IpKTsKKyAgICB9CisgICAgcmV0dXJuIE9QSl9GQUxTRTsKIH0KIAotT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zZXRfZGVjb2RlX2FyZWEoCW9wal9jb2RlY190ICpwX2NvZGVjLAotCQkJCQkJCQkJCQlvcGpfaW1hZ2VfdCogcF9pbWFnZSwKLQkJCQkJCQkJCQkJT1BKX0lOVDMyIHBfc3RhcnRfeCwgT1BKX0lOVDMyIHBfc3RhcnRfeSwKLQkJCQkJCQkJCQkJT1BKX0lOVDMyIHBfZW5kX3gsIE9QSl9JTlQzMiBwX2VuZF95Ci0JCQkJCQkJCQkJCSkKK09QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfZGVjb2RlKG9wal9jb2RlY190ICpwX2NvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV90ICpwX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90KiBwX2ltYWdlKQogewotCWlmIChwX2NvZGVjKSB7Ci0JCW9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKLQkJCi0JCWlmICghIGxfY29kZWMtPmlzX2RlY29tcHJlc3NvcikgewotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQorICAgIGlmIChwX2NvZGVjICYmIHBfc3RyZWFtKSB7CisgICAgICAgIG9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKKyAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqKSBwX3N0cmVhbTsKIAotCQlyZXR1cm4gIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX3NldF9kZWNvZGVfYXJlYSgJbF9jb2RlYy0+bV9jb2RlYywKLQkJCQkJCQkJCQkJCQkJCQkJCQlwX2ltYWdlLAotCQkJCQkJCQkJCQkJCQkJCQkJCXBfc3RhcnRfeCwgcF9zdGFydF95LAotCQkJCQkJCQkJCQkJCQkJCQkJCXBfZW5kX3gsIHBfZW5kX3ksCi0JCQkJCQkJCQkJCQkJCQkJCQkJJihsX2NvZGVjLT5tX2V2ZW50X21ncikgKTsKLQl9Ci0JcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgaWYgKCEgbF9jb2RlYy0+aXNfZGVjb21wcmVzc29yKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX2RlY29kZShsX2NvZGVjLT5tX2NvZGVjLAorICAgICAgICAgICAgICAgIGxfc3RyZWFtLAorICAgICAgICAgICAgICAgIHBfaW1hZ2UsCisgICAgICAgICAgICAgICAgJihsX2NvZGVjLT5tX2V2ZW50X21ncikpOworICAgIH0KKworICAgIHJldHVybiBPUEpfRkFMU0U7CiB9CiAKLU9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfcmVhZF90aWxlX2hlYWRlcigJb3BqX2NvZGVjX3QgKnBfY29kZWMsCi0JCQkJCQkJCQkJCW9wal9zdHJlYW1fdCAqIHBfc3RyZWFtLAotCQkJCQkJCQkJCQlPUEpfVUlOVDMyICogcF90aWxlX2luZGV4LAotCQkJCQkJCQkJCQlPUEpfVUlOVDMyICogcF9kYXRhX3NpemUsCi0JCQkJCQkJCQkJCU9QSl9JTlQzMiAqIHBfdGlsZV94MCwgT1BKX0lOVDMyICogcF90aWxlX3kwLAotCQkJCQkJCQkJCQlPUEpfSU5UMzIgKiBwX3RpbGVfeDEsIE9QSl9JTlQzMiAqIHBfdGlsZV95MSwKLQkJCQkJCQkJCQkJT1BKX1VJTlQzMiAqIHBfbmJfY29tcHMsCi0JCQkJCQkJCQkJCU9QSl9CT09MICogcF9zaG91bGRfZ29fb24pCitPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldF9kZWNvZGVfYXJlYShvcGpfY29kZWNfdCAqcF9jb2RlYywKKyAgICAgICAgb3BqX2ltYWdlX3QqIHBfaW1hZ2UsCisgICAgICAgIE9QSl9JTlQzMiBwX3N0YXJ0X3gsIE9QSl9JTlQzMiBwX3N0YXJ0X3ksCisgICAgICAgIE9QSl9JTlQzMiBwX2VuZF94LCBPUEpfSU5UMzIgcF9lbmRfeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0JaWYgKHBfY29kZWMgJiYgcF9zdHJlYW0gJiYgcF9kYXRhX3NpemUgJiYgcF90aWxlX2luZGV4KSB7Ci0JCW9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKLQkJb3BqX3N0cmVhbV9wcml2YXRlX3QgKiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqKSBwX3N0cmVhbTsKKyAgICBpZiAocF9jb2RlYykgeworICAgICAgICBvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7CiAKLQkJaWYgKCEgbF9jb2RlYy0+aXNfZGVjb21wcmVzc29yKSB7Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9CisgICAgICAgIGlmICghIGxfY29kZWMtPmlzX2RlY29tcHJlc3NvcikgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQogCi0JCXJldHVybiBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9yZWFkX3RpbGVfaGVhZGVyKAlsX2NvZGVjLT5tX2NvZGVjLAotCQkJCQkJCQkJCQkJCQkJCQkJCXBfdGlsZV9pbmRleCwKLQkJCQkJCQkJCQkJCQkJCQkJCQlwX2RhdGFfc2l6ZSwKLQkJCQkJCQkJCQkJCQkJCQkJCQlwX3RpbGVfeDAsIHBfdGlsZV95MCwKLQkJCQkJCQkJCQkJCQkJCQkJCQlwX3RpbGVfeDEsIHBfdGlsZV95MSwKLQkJCQkJCQkJCQkJCQkJCQkJCQlwX25iX2NvbXBzLAotCQkJCQkJCQkJCQkJCQkJCQkJCXBfc2hvdWxkX2dvX29uLAotCQkJCQkJCQkJCQkJCQkJCQkJCWxfc3RyZWFtLAotCQkJCQkJCQkJCQkJCQkJCQkJCSYobF9jb2RlYy0+bV9ldmVudF9tZ3IpKTsKLQl9Ci0JcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgcmV0dXJuICBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9zZXRfZGVjb2RlX2FyZWEoCisgICAgICAgICAgICAgICAgICAgIGxfY29kZWMtPm1fY29kZWMsCisgICAgICAgICAgICAgICAgICAgIHBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgIHBfc3RhcnRfeCwgcF9zdGFydF95LAorICAgICAgICAgICAgICAgICAgICBwX2VuZF94LCBwX2VuZF95LAorICAgICAgICAgICAgICAgICAgICAmKGxfY29kZWMtPm1fZXZlbnRfbWdyKSk7CisgICAgfQorICAgIHJldHVybiBPUEpfRkFMU0U7CiB9CiAKLU9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfZGVjb2RlX3RpbGVfZGF0YSgJb3BqX2NvZGVjX3QgKnBfY29kZWMsCi0JCQkJCQkJCQkJCU9QSl9VSU5UMzIgcF90aWxlX2luZGV4LAotCQkJCQkJCQkJCQlPUEpfQllURSAqIHBfZGF0YSwKLQkJCQkJCQkJCQkJT1BKX1VJTlQzMiBwX2RhdGFfc2l6ZSwKLQkJCQkJCQkJCQkJb3BqX3N0cmVhbV90ICpwX3N0cmVhbQotCQkJCQkJCQkJCQkpCitPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3JlYWRfdGlsZV9oZWFkZXIob3BqX2NvZGVjX3QgKnBfY29kZWMsCisgICAgICAgIG9wal9zdHJlYW1fdCAqIHBfc3RyZWFtLAorICAgICAgICBPUEpfVUlOVDMyICogcF90aWxlX2luZGV4LAorICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3NpemUsCisgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV94MCwgT1BKX0lOVDMyICogcF90aWxlX3kwLAorICAgICAgICBPUEpfSU5UMzIgKiBwX3RpbGVfeDEsIE9QSl9JTlQzMiAqIHBfdGlsZV95MSwKKyAgICAgICAgT1BKX1VJTlQzMiAqIHBfbmJfY29tcHMsCisgICAgICAgIE9QSl9CT09MICogcF9zaG91bGRfZ29fb24pCiB7Ci0JaWYgKHBfY29kZWMgJiYgcF9kYXRhICYmIHBfc3RyZWFtKSB7Ci0JCW9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKLQkJb3BqX3N0cmVhbV9wcml2YXRlX3QgKiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqKSBwX3N0cmVhbTsKKyAgICBpZiAocF9jb2RlYyAmJiBwX3N0cmVhbSAmJiBwX2RhdGFfc2l6ZSAmJiBwX3RpbGVfaW5kZXgpIHsKKyAgICAgICAgb3BqX2NvZGVjX3ByaXZhdGVfdCAqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCAqKSBwX2NvZGVjOworICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90ICopIHBfc3RyZWFtOwogCi0JCWlmICghIGxfY29kZWMtPmlzX2RlY29tcHJlc3NvcikgewotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQorICAgICAgICBpZiAoISBsX2NvZGVjLT5pc19kZWNvbXByZXNzb3IpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KIAotCQlyZXR1cm4gbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfZGVjb2RlX3RpbGVfZGF0YSgJbF9jb2RlYy0+bV9jb2RlYywKLQkJCQkJCQkJCQkJCQkJCQkJCQlwX3RpbGVfaW5kZXgsCi0JCQkJCQkJCQkJCQkJCQkJCQkJcF9kYXRhLAotCQkJCQkJCQkJCQkJCQkJCQkJCXBfZGF0YV9zaXplLAotCQkJCQkJCQkJCQkJCQkJCQkJCWxfc3RyZWFtLAotCQkJCQkJCQkJCQkJCQkJCQkJCSYobF9jb2RlYy0+bV9ldmVudF9tZ3IpICk7Ci0JfQotCXJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIHJldHVybiBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9yZWFkX3RpbGVfaGVhZGVyKAorICAgICAgICAgICAgICAgICAgIGxfY29kZWMtPm1fY29kZWMsCisgICAgICAgICAgICAgICAgICAgcF90aWxlX2luZGV4LAorICAgICAgICAgICAgICAgICAgIHBfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgIHBfdGlsZV94MCwgcF90aWxlX3kwLAorICAgICAgICAgICAgICAgICAgIHBfdGlsZV94MSwgcF90aWxlX3kxLAorICAgICAgICAgICAgICAgICAgIHBfbmJfY29tcHMsCisgICAgICAgICAgICAgICAgICAgcF9zaG91bGRfZ29fb24sCisgICAgICAgICAgICAgICAgICAgbF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgJihsX2NvZGVjLT5tX2V2ZW50X21ncikpOworICAgIH0KKyAgICByZXR1cm4gT1BKX0ZBTFNFOwogfQogCi1PUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX2dldF9kZWNvZGVkX3RpbGUoCW9wal9jb2RlY190ICpwX2NvZGVjLAotCQkJCQkJCQkJCQlvcGpfc3RyZWFtX3QgKnBfc3RyZWFtLAotCQkJCQkJCQkJCQlvcGpfaW1hZ2VfdCAqcF9pbWFnZSwKLQkJCQkJCQkJCQkJT1BKX1VJTlQzMiB0aWxlX2luZGV4KQorT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9kZWNvZGVfdGlsZV9kYXRhKG9wal9jb2RlY190ICpwX2NvZGVjLAorICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9pbmRleCwKKyAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCisgICAgICAgIE9QSl9VSU5UMzIgcF9kYXRhX3NpemUsCisgICAgICAgIG9wal9zdHJlYW1fdCAqcF9zdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLQlpZiAocF9jb2RlYyAmJiBwX3N0cmVhbSkgewotCQlvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7Ci0JCW9wal9zdHJlYW1fcHJpdmF0ZV90ICogbF9zdHJlYW0gPSAob3BqX3N0cmVhbV9wcml2YXRlX3QgKikgcF9zdHJlYW07CisgICAgaWYgKHBfY29kZWMgJiYgcF9kYXRhICYmIHBfc3RyZWFtKSB7CisgICAgICAgIG9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKKyAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqKSBwX3N0cmVhbTsKIAotCQlpZiAoISBsX2NvZGVjLT5pc19kZWNvbXByZXNzb3IpIHsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQkJCi0JCXJldHVybiBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9nZXRfZGVjb2RlZF90aWxlKAlsX2NvZGVjLT5tX2NvZGVjLAotCQkJCQkJCQkJCQkJCQkJCQkJCWxfc3RyZWFtLAotCQkJCQkJCQkJCQkJCQkJCQkJCXBfaW1hZ2UsCi0JCQkJCQkJCQkJCQkJCQkJCQkJJihsX2NvZGVjLT5tX2V2ZW50X21nciksCi0JCQkJCQkJCQkJCQkJCQkJCQkJdGlsZV9pbmRleCk7Ci0JfQorICAgICAgICBpZiAoISBsX2NvZGVjLT5pc19kZWNvbXByZXNzb3IpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KIAotCXJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIHJldHVybiBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9kZWNvZGVfdGlsZV9kYXRhKAorICAgICAgICAgICAgICAgICAgIGxfY29kZWMtPm1fY29kZWMsCisgICAgICAgICAgICAgICAgICAgcF90aWxlX2luZGV4LAorICAgICAgICAgICAgICAgICAgIHBfZGF0YSwKKyAgICAgICAgICAgICAgICAgICBwX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBsX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAmKGxfY29kZWMtPm1fZXZlbnRfbWdyKSk7CisgICAgfQorICAgIHJldHVybiBPUEpfRkFMU0U7CiB9CiAKLU9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3Iob3BqX2NvZGVjX3QgKnBfY29kZWMsIAotCQkJCQkJCQkJCQkJCQlPUEpfVUlOVDMyIHJlc19mYWN0b3IgKQorT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9nZXRfZGVjb2RlZF90aWxlKG9wal9jb2RlY190ICpwX2NvZGVjLAorICAgICAgICBvcGpfc3RyZWFtX3QgKnBfc3RyZWFtLAorICAgICAgICBvcGpfaW1hZ2VfdCAqcF9pbWFnZSwKKyAgICAgICAgT1BKX1VJTlQzMiB0aWxlX2luZGV4KQogewotCW9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKKyAgICBpZiAocF9jb2RlYyAmJiBwX3N0cmVhbSkgeworICAgICAgICBvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7CisgICAgICAgIG9wal9zdHJlYW1fcHJpdmF0ZV90ICogbF9zdHJlYW0gPSAob3BqX3N0cmVhbV9wcml2YXRlX3QgKikgcF9zdHJlYW07CiAKLQlpZiAoICFsX2NvZGVjICl7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQorICAgICAgICBpZiAoISBsX2NvZGVjLT5pc19kZWNvbXByZXNzb3IpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KIAotCXJldHVybiBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9zZXRfZGVjb2RlZF9yZXNvbHV0aW9uX2ZhY3RvcihsX2NvZGVjLT5tX2NvZGVjLAotCQkJCQkJCQkJCQkJCQkJCQkJCXJlc19mYWN0b3IsCi0JCQkJCQkJCQkJCQkJCQkJCQkJJihsX2NvZGVjLT5tX2V2ZW50X21ncikgKTsKKyAgICAgICAgcmV0dXJuIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX2dldF9kZWNvZGVkX3RpbGUoCisgICAgICAgICAgICAgICAgICAgbF9jb2RlYy0+bV9jb2RlYywKKyAgICAgICAgICAgICAgICAgICBsX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICBwX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICYobF9jb2RlYy0+bV9ldmVudF9tZ3IpLAorICAgICAgICAgICAgICAgICAgIHRpbGVfaW5kZXgpOworICAgIH0KKworICAgIHJldHVybiBPUEpfRkFMU0U7Cit9CisKK09QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3Iob3BqX2NvZGVjX3QgKnBfY29kZWMsCisgICAgICAgIE9QSl9VSU5UMzIgcmVzX2ZhY3RvcikKK3sKKyAgICBvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7CisKKyAgICBpZiAoIWxfY29kZWMpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3IoCisgICAgICAgICAgICAgICBsX2NvZGVjLT5tX2NvZGVjLAorICAgICAgICAgICAgICAgcmVzX2ZhY3RvciwKKyAgICAgICAgICAgICAgICYobF9jb2RlYy0+bV9ldmVudF9tZ3IpKTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtNTM3LDM5NSArNjEzLDQwMyBAQAogCiBvcGpfY29kZWNfdCogT1BKX0NBTExDT05WIG9wal9jcmVhdGVfY29tcHJlc3MoT1BKX0NPREVDX0ZPUk1BVCBwX2Zvcm1hdCkKIHsKLQlvcGpfY29kZWNfcHJpdmF0ZV90ICpsX2NvZGVjID0gMDA7CisgICAgb3BqX2NvZGVjX3ByaXZhdGVfdCAqbF9jb2RlYyA9IDAwOwogCi0JbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90KilvcGpfY2FsbG9jKDEsIHNpemVvZihvcGpfY29kZWNfcHJpdmF0ZV90KSk7Ci0JaWYgKCFsX2NvZGVjKSB7Ci0JCXJldHVybiAwMDsKLQl9Ci0JCi0JbF9jb2RlYy0+aXNfZGVjb21wcmVzc29yID0gMDsKKyAgICBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QqKW9wal9jYWxsb2MoMSwgc2l6ZW9mKG9wal9jb2RlY19wcml2YXRlX3QpKTsKKyAgICBpZiAoIWxfY29kZWMpIHsKKyAgICAgICAgcmV0dXJuIDAwOworICAgIH0KIAotCXN3aXRjaChwX2Zvcm1hdCkgewotCQljYXNlIE9QSl9DT0RFQ19KMks6Ci0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfZW5jb2RlID0gKE9QSl9CT09MICgqKSAodm9pZCAqLAotCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKLQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqICkpIG9wal9qMmtfZW5jb2RlOworICAgIGxfY29kZWMtPmlzX2RlY29tcHJlc3NvciA9IDA7CiAKLQkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2NvbXByZXNzaW9uLm9wal9lbmRfY29tcHJlc3MgPSAoT1BKX0JPT0wgKCopICgJdm9pZCAqLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJc3RydWN0IG9wal9ldmVudF9tZ3IgKikpIG9wal9qMmtfZW5kX2NvbXByZXNzOworICAgIHN3aXRjaCAocF9mb3JtYXQpIHsKKyAgICBjYXNlIE9QSl9DT0RFQ19KMks6CisgICAgICAgIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2NvbXByZXNzaW9uLm9wal9lbmNvZGUgPSAoT1BKX0JPT0woKikodm9pZCAqLAorICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSkgb3BqX2oya19lbmNvZGU7CiAKLQkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2NvbXByZXNzaW9uLm9wal9zdGFydF9jb21wcmVzcyA9IChPUEpfQk9PTCAoKikgKHZvaWQgKiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfaW1hZ2UgKiAsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSkgb3BqX2oya19zdGFydF9jb21wcmVzczsKKyAgICAgICAgbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX2VuZF9jb21wcmVzcyA9IChPUEpfQk9PTCgqKSh2b2lkICosCisgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAorICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICopKSBvcGpfajJrX2VuZF9jb21wcmVzczsKIAotCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX3dyaXRlX3RpbGUgPSAoT1BKX0JPT0wgKCopICh2b2lkICosCi0JCQkJCQkJCQkJCQkJCQkJCQkJCU9QSl9VSU5UMzIsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCU9QSl9CWVRFKiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAotCQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSApIG9wal9qMmtfd3JpdGVfdGlsZTsKKyAgICAgICAgbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX3N0YXJ0X2NvbXByZXNzID0gKE9QSl9CT09MKCopKHZvaWQgKiwKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICosCisgICAgICAgICAgICAgICAgc3RydWN0IG9wal9pbWFnZSAqLAorICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICopKSBvcGpfajJrX3N0YXJ0X2NvbXByZXNzOwogCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfZGVzdHJveSA9ICh2b2lkICgqKSAodm9pZCAqKSkgb3BqX2oya19kZXN0cm95OworICAgICAgICBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfd3JpdGVfdGlsZSA9IChPUEpfQk9PTCgqKSh2b2lkICosCisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiwKKyAgICAgICAgICAgICAgICBPUEpfQllURSosCisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiwKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICosCisgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKikpIG9wal9qMmtfd3JpdGVfdGlsZTsKIAotCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX3NldHVwX2VuY29kZXIgPSAoT1BKX0JPT0wgKCopICgJdm9pZCAqLAotCQkJCQkJCQkJCQkJCQkJCQkJCQlvcGpfY3BhcmFtZXRlcnNfdCAqLAotCQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX2ltYWdlICosCi0JCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfZXZlbnRfbWdyICogKSkgb3BqX2oya19zZXR1cF9lbmNvZGVyOworICAgICAgICBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfZGVzdHJveSA9ICh2b2lkICgqKSgKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSkgb3BqX2oya19kZXN0cm95OwogCi0JCQlsX2NvZGVjLT5tX2NvZGVjID0gb3BqX2oya19jcmVhdGVfY29tcHJlc3MoKTsKLQkJCWlmICghIGxfY29kZWMtPm1fY29kZWMpIHsKLQkJCQlvcGpfZnJlZShsX2NvZGVjKTsKLQkJCQlyZXR1cm4gMDA7Ci0JCQl9CisgICAgICAgIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2NvbXByZXNzaW9uLm9wal9zZXR1cF9lbmNvZGVyID0gKE9QSl9CT09MKCopKHZvaWQgKiwKKyAgICAgICAgICAgICAgICBvcGpfY3BhcmFtZXRlcnNfdCAqLAorICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfaW1hZ2UgKiwKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSkgb3BqX2oya19zZXR1cF9lbmNvZGVyOwogCi0JCQlicmVhazsKKyAgICAgICAgbF9jb2RlYy0+bV9jb2RlYyA9IG9wal9qMmtfY3JlYXRlX2NvbXByZXNzKCk7CisgICAgICAgIGlmICghIGxfY29kZWMtPm1fY29kZWMpIHsKKyAgICAgICAgICAgIG9wal9mcmVlKGxfY29kZWMpOworICAgICAgICAgICAgcmV0dXJuIDAwOworICAgICAgICB9CiAKLQkJY2FzZSBPUEpfQ09ERUNfSlAyOgotCQkJLyogZ2V0IGEgSlAyIGRlY29kZXIgaGFuZGxlICovCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfZW5jb2RlID0gKE9QSl9CT09MICgqKSAodm9pZCAqLAotCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKLQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqICkpIG9wal9qcDJfZW5jb2RlOworICAgICAgICBicmVhazsKIAotCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX2VuZF9jb21wcmVzcyA9IChPUEpfQk9PTCAoKikgKAl2b2lkICosCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICosCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSkgb3BqX2pwMl9lbmRfY29tcHJlc3M7CisgICAgY2FzZSBPUEpfQ09ERUNfSlAyOgorICAgICAgICAvKiBnZXQgYSBKUDIgZGVjb2RlciBoYW5kbGUgKi8KKyAgICAgICAgbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX2VuY29kZSA9IChPUEpfQk9PTCgqKSh2b2lkICosCisgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAorICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICopKSBvcGpfanAyX2VuY29kZTsKIAotCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX3N0YXJ0X2NvbXByZXNzID0gKE9QSl9CT09MICgqKSAodm9pZCAqLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJc3RydWN0IG9wal9pbWFnZSAqICwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfZXZlbnRfbWdyICopKSAgb3BqX2pwMl9zdGFydF9jb21wcmVzczsKKyAgICAgICAgbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX2VuZF9jb21wcmVzcyA9IChPUEpfQk9PTCgqKSh2b2lkICosCisgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAorICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICopKSBvcGpfanAyX2VuZF9jb21wcmVzczsKIAotCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX3dyaXRlX3RpbGUgPSAoT1BKX0JPT0wgKCopICh2b2lkICosCi0JCQkJCQkJCQkJCQkJCQkJCQkJCU9QSl9VSU5UMzIsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCU9QSl9CWVRFKiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqLAotCQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSkgb3BqX2pwMl93cml0ZV90aWxlOworICAgICAgICBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfc3RhcnRfY29tcHJlc3MgPSAoT1BKX0JPT0woKikodm9pZCAqLAorICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiwKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2ltYWdlICosCisgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKikpICBvcGpfanAyX3N0YXJ0X2NvbXByZXNzOwogCi0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfZGVzdHJveSA9ICh2b2lkICgqKSAodm9pZCAqKSkgb3BqX2pwMl9kZXN0cm95OworICAgICAgICBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfd3JpdGVfdGlsZSA9IChPUEpfQk9PTCgqKSh2b2lkICosCisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiwKKyAgICAgICAgICAgICAgICBPUEpfQllURSosCisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiwKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICosCisgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKikpIG9wal9qcDJfd3JpdGVfdGlsZTsKIAotCQkJbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX3NldHVwX2VuY29kZXIgPSAoT1BKX0JPT0wgKCopICgJdm9pZCAqLAotCQkJCQkJCQkJCQkJCQkJCQkJCQlvcGpfY3BhcmFtZXRlcnNfdCAqLAotCQkJCQkJCQkJCQkJCQkJCQkJCQlzdHJ1Y3Qgb3BqX2ltYWdlICosCi0JCQkJCQkJCQkJCQkJCQkJCQkJCXN0cnVjdCBvcGpfZXZlbnRfbWdyICogKSkgb3BqX2pwMl9zZXR1cF9lbmNvZGVyOworICAgICAgICBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfZGVzdHJveSA9ICh2b2lkICgqKSgKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSkgb3BqX2pwMl9kZXN0cm95OwogCi0JCQlsX2NvZGVjLT5tX2NvZGVjID0gb3BqX2pwMl9jcmVhdGUoT1BKX0ZBTFNFKTsKLQkJCWlmICghIGxfY29kZWMtPm1fY29kZWMpIHsKLQkJCQlvcGpfZnJlZShsX2NvZGVjKTsKLQkJCQlyZXR1cm4gMDA7Ci0JCQl9CisgICAgICAgIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2NvbXByZXNzaW9uLm9wal9zZXR1cF9lbmNvZGVyID0gKE9QSl9CT09MKCopKHZvaWQgKiwKKyAgICAgICAgICAgICAgICBvcGpfY3BhcmFtZXRlcnNfdCAqLAorICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfaW1hZ2UgKiwKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqKSkgb3BqX2pwMl9zZXR1cF9lbmNvZGVyOwogCi0JCQlicmVhazsKKyAgICAgICAgbF9jb2RlYy0+bV9jb2RlYyA9IG9wal9qcDJfY3JlYXRlKE9QSl9GQUxTRSk7CisgICAgICAgIGlmICghIGxfY29kZWMtPm1fY29kZWMpIHsKKyAgICAgICAgICAgIG9wal9mcmVlKGxfY29kZWMpOworICAgICAgICAgICAgcmV0dXJuIDAwOworICAgICAgICB9CiAKLQkJY2FzZSBPUEpfQ09ERUNfVU5LTk9XTjoKLQkJY2FzZSBPUEpfQ09ERUNfSlBUOgotCQlkZWZhdWx0OgotCQkJb3BqX2ZyZWUobF9jb2RlYyk7Ci0JCQlyZXR1cm4gMDA7Ci0JfQorICAgICAgICBicmVhazsKIAotCW9wal9zZXRfZGVmYXVsdF9ldmVudF9oYW5kbGVyKCYobF9jb2RlYy0+bV9ldmVudF9tZ3IpKTsKLQlyZXR1cm4gKG9wal9jb2RlY190KikgbF9jb2RlYzsKKyAgICBjYXNlIE9QSl9DT0RFQ19VTktOT1dOOgorICAgIGNhc2UgT1BKX0NPREVDX0pQVDoKKyAgICBkZWZhdWx0OgorICAgICAgICBvcGpfZnJlZShsX2NvZGVjKTsKKyAgICAgICAgcmV0dXJuIDAwOworICAgIH0KKworICAgIG9wal9zZXRfZGVmYXVsdF9ldmVudF9oYW5kbGVyKCYobF9jb2RlYy0+bV9ldmVudF9tZ3IpKTsKKyAgICByZXR1cm4gKG9wal9jb2RlY190KikgbF9jb2RlYzsKIH0KIAotdm9pZCBPUEpfQ0FMTENPTlYgb3BqX3NldF9kZWZhdWx0X2VuY29kZXJfcGFyYW1ldGVycyhvcGpfY3BhcmFtZXRlcnNfdCAqcGFyYW1ldGVycykgewotCWlmKHBhcmFtZXRlcnMpIHsKLQkJbWVtc2V0KHBhcmFtZXRlcnMsIDAsIHNpemVvZihvcGpfY3BhcmFtZXRlcnNfdCkpOwotCQkvKiBkZWZhdWx0IGNvZGluZyBwYXJhbWV0ZXJzICovCit2b2lkIE9QSl9DQUxMQ09OViBvcGpfc2V0X2RlZmF1bHRfZW5jb2Rlcl9wYXJhbWV0ZXJzKG9wal9jcGFyYW1ldGVyc190CisgICAgICAgICpwYXJhbWV0ZXJzKQoreworICAgIGlmIChwYXJhbWV0ZXJzKSB7CisgICAgICAgIG1lbXNldChwYXJhbWV0ZXJzLCAwLCBzaXplb2Yob3BqX2NwYXJhbWV0ZXJzX3QpKTsKKyAgICAgICAgLyogZGVmYXVsdCBjb2RpbmcgcGFyYW1ldGVycyAqLwogICAgICAgICBwYXJhbWV0ZXJzLT5jcF9jaW5lbWEgPSBPUEpfT0ZGOyAvKiBERVBSRUNBVEVEICovCiAgICAgICAgIHBhcmFtZXRlcnMtPnJzaXogPSBPUEpfUFJPRklMRV9OT05FOwotCQlwYXJhbWV0ZXJzLT5tYXhfY29tcF9zaXplID0gMDsKLQkJcGFyYW1ldGVycy0+bnVtcmVzb2x1dGlvbiA9IDY7CisgICAgICAgIHBhcmFtZXRlcnMtPm1heF9jb21wX3NpemUgPSAwOworICAgICAgICBwYXJhbWV0ZXJzLT5udW1yZXNvbHV0aW9uID0gNjsKICAgICAgICAgcGFyYW1ldGVycy0+Y3BfcnNpeiA9IE9QSl9TVERfUlNJWjsgLyogREVQUkVDQVRFRCAqLwotCQlwYXJhbWV0ZXJzLT5jYmxvY2t3X2luaXQgPSA2NDsKLQkJcGFyYW1ldGVycy0+Y2Jsb2NraF9pbml0ID0gNjQ7Ci0JCXBhcmFtZXRlcnMtPnByb2dfb3JkZXIgPSBPUEpfTFJDUDsKLQkJcGFyYW1ldGVycy0+cm9pX2NvbXBubyA9IC0xOwkJLyogbm8gUk9JICovCi0JCXBhcmFtZXRlcnMtPnN1YnNhbXBsaW5nX2R4ID0gMTsKLQkJcGFyYW1ldGVycy0+c3Vic2FtcGxpbmdfZHkgPSAxOwotCQlwYXJhbWV0ZXJzLT50cF9vbiA9IDA7Ci0JCXBhcmFtZXRlcnMtPmRlY29kX2Zvcm1hdCA9IC0xOwotCQlwYXJhbWV0ZXJzLT5jb2RfZm9ybWF0ID0gLTE7Ci0JCXBhcmFtZXRlcnMtPnRjcF9yYXRlc1swXSA9IDA7ICAgCi0JCXBhcmFtZXRlcnMtPnRjcF9udW1sYXllcnMgPSAwOwotCQlwYXJhbWV0ZXJzLT5jcF9kaXN0b19hbGxvYyA9IDA7Ci0JCXBhcmFtZXRlcnMtPmNwX2ZpeGVkX2FsbG9jID0gMDsKLQkJcGFyYW1ldGVycy0+Y3BfZml4ZWRfcXVhbGl0eSA9IDA7Ci0JCXBhcmFtZXRlcnMtPmpwaXBfb24gPSBPUEpfRkFMU0U7Ci0vKiBVbmlQRz4+ICovCisgICAgICAgIHBhcmFtZXRlcnMtPmNibG9ja3dfaW5pdCA9IDY0OworICAgICAgICBwYXJhbWV0ZXJzLT5jYmxvY2toX2luaXQgPSA2NDsKKyAgICAgICAgcGFyYW1ldGVycy0+cHJvZ19vcmRlciA9IE9QSl9MUkNQOworICAgICAgICBwYXJhbWV0ZXJzLT5yb2lfY29tcG5vID0gLTE7ICAgICAgICAvKiBubyBST0kgKi8KKyAgICAgICAgcGFyYW1ldGVycy0+c3Vic2FtcGxpbmdfZHggPSAxOworICAgICAgICBwYXJhbWV0ZXJzLT5zdWJzYW1wbGluZ19keSA9IDE7CisgICAgICAgIHBhcmFtZXRlcnMtPnRwX29uID0gMDsKKyAgICAgICAgcGFyYW1ldGVycy0+ZGVjb2RfZm9ybWF0ID0gLTE7CisgICAgICAgIHBhcmFtZXRlcnMtPmNvZF9mb3JtYXQgPSAtMTsKKyAgICAgICAgcGFyYW1ldGVycy0+dGNwX3JhdGVzWzBdID0gMDsKKyAgICAgICAgcGFyYW1ldGVycy0+dGNwX251bWxheWVycyA9IDA7CisgICAgICAgIHBhcmFtZXRlcnMtPmNwX2Rpc3RvX2FsbG9jID0gMDsKKyAgICAgICAgcGFyYW1ldGVycy0+Y3BfZml4ZWRfYWxsb2MgPSAwOworICAgICAgICBwYXJhbWV0ZXJzLT5jcF9maXhlZF9xdWFsaXR5ID0gMDsKKyAgICAgICAgcGFyYW1ldGVycy0+anBpcF9vbiA9IE9QSl9GQUxTRTsKKyAgICAgICAgLyogVW5pUEc+PiAqLwogI2lmZGVmIFVTRV9KUFdMCi0JCXBhcmFtZXRlcnMtPmpwd2xfZXBjX29uID0gT1BKX0ZBTFNFOwotCQlwYXJhbWV0ZXJzLT5qcHdsX2hwcm90X01IID0gLTE7IC8qIC0xIG1lYW5zIHVuYXNzaWduZWQgKi8KLQkJewotCQkJaW50IGk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgSlBXTF9NQVhfTk9fVElMRVNQRUNTOyBpKyspIHsKLQkJCQlwYXJhbWV0ZXJzLT5qcHdsX2hwcm90X1RQSF90aWxlbm9baV0gPSAtMTsgLyogdW5hc3NpZ25lZCAqLwotCQkJCXBhcmFtZXRlcnMtPmpwd2xfaHByb3RfVFBIW2ldID0gMDsgLyogYWJzZW50ICovCi0JCQl9Ci0JCX07Ci0JCXsKLQkJCWludCBpOwotCQkJZm9yIChpID0gMDsgaSA8IEpQV0xfTUFYX05PX1BBQ0tTUEVDUzsgaSsrKSB7Ci0JCQkJcGFyYW1ldGVycy0+anB3bF9wcHJvdF90aWxlbm9baV0gPSAtMTsgLyogdW5hc3NpZ25lZCAqLwotCQkJCXBhcmFtZXRlcnMtPmpwd2xfcHByb3RfcGFja25vW2ldID0gLTE7IC8qIHVuYXNzaWduZWQgKi8KLQkJCQlwYXJhbWV0ZXJzLT5qcHdsX3Bwcm90W2ldID0gMDsgLyogYWJzZW50ICovCi0JCQl9Ci0JCX07Ci0JCXBhcmFtZXRlcnMtPmpwd2xfc2Vuc19zaXplID0gMDsgLyogMCBtZWFucyBubyBFU0QgKi8KLQkJcGFyYW1ldGVycy0+anB3bF9zZW5zX2FkZHIgPSAwOyAvKiAwIG1lYW5zIGF1dG8gKi8KLQkJcGFyYW1ldGVycy0+anB3bF9zZW5zX3JhbmdlID0gMDsgLyogMCBtZWFucyBwYWNrZXQgKi8KLQkJcGFyYW1ldGVycy0+anB3bF9zZW5zX01IID0gLTE7IC8qIC0xIG1lYW5zIHVuYXNzaWduZWQgKi8KLQkJewotCQkJaW50IGk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgSlBXTF9NQVhfTk9fVElMRVNQRUNTOyBpKyspIHsKLQkJCQlwYXJhbWV0ZXJzLT5qcHdsX3NlbnNfVFBIX3RpbGVub1tpXSA9IC0xOyAvKiB1bmFzc2lnbmVkICovCi0JCQkJcGFyYW1ldGVycy0+anB3bF9zZW5zX1RQSFtpXSA9IC0xOyAvKiBhYnNlbnQgKi8KLQkJCX0KLQkJfTsKKyAgICAgICAgcGFyYW1ldGVycy0+anB3bF9lcGNfb24gPSBPUEpfRkFMU0U7CisgICAgICAgIHBhcmFtZXRlcnMtPmpwd2xfaHByb3RfTUggPSAtMTsgLyogLTEgbWVhbnMgdW5hc3NpZ25lZCAqLworICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBKUFdMX01BWF9OT19USUxFU1BFQ1M7IGkrKykgeworICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPmpwd2xfaHByb3RfVFBIX3RpbGVub1tpXSA9IC0xOyAvKiB1bmFzc2lnbmVkICovCisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+anB3bF9ocHJvdF9UUEhbaV0gPSAwOyAvKiBhYnNlbnQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgSlBXTF9NQVhfTk9fUEFDS1NQRUNTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5qcHdsX3Bwcm90X3RpbGVub1tpXSA9IC0xOyAvKiB1bmFzc2lnbmVkICovCisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy0+anB3bF9wcHJvdF9wYWNrbm9baV0gPSAtMTsgLyogdW5hc3NpZ25lZCAqLworICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPmpwd2xfcHByb3RbaV0gPSAwOyAvKiBhYnNlbnQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgcGFyYW1ldGVycy0+anB3bF9zZW5zX3NpemUgPSAwOyAvKiAwIG1lYW5zIG5vIEVTRCAqLworICAgICAgICBwYXJhbWV0ZXJzLT5qcHdsX3NlbnNfYWRkciA9IDA7IC8qIDAgbWVhbnMgYXV0byAqLworICAgICAgICBwYXJhbWV0ZXJzLT5qcHdsX3NlbnNfcmFuZ2UgPSAwOyAvKiAwIG1lYW5zIHBhY2tldCAqLworICAgICAgICBwYXJhbWV0ZXJzLT5qcHdsX3NlbnNfTUggPSAtMTsgLyogLTEgbWVhbnMgdW5hc3NpZ25lZCAqLworICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBKUFdMX01BWF9OT19USUxFU1BFQ1M7IGkrKykgeworICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMtPmpwd2xfc2Vuc19UUEhfdGlsZW5vW2ldID0gLTE7IC8qIHVuYXNzaWduZWQgKi8KKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLT5qcHdsX3NlbnNfVFBIW2ldID0gLTE7IC8qIGFic2VudCAqLworICAgICAgICAgICAgfQorICAgICAgICB9OwogI2VuZGlmIC8qIFVTRV9KUFdMICovCi0vKiA8PFVuaVBHICovCi0JfQorICAgICAgICAvKiA8PFVuaVBHICovCisgICAgfQogfQogCi1PUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldHVwX2VuY29kZXIob3BqX2NvZGVjX3QgKnBfY29kZWMsIAotCQkJCQkJCQkJCW9wal9jcGFyYW1ldGVyc190ICpwYXJhbWV0ZXJzLCAKLQkJCQkJCQkJCQlvcGpfaW1hZ2VfdCAqcF9pbWFnZSkKK09QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0dXBfZW5jb2RlcihvcGpfY29kZWNfdCAqcF9jb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY3BhcmFtZXRlcnNfdCAqcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqcF9pbWFnZSkKIHsKLQlpZiAocF9jb2RlYyAmJiBwYXJhbWV0ZXJzICYmIHBfaW1hZ2UpIHsKLQkJb3BqX2NvZGVjX3ByaXZhdGVfdCAqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCAqKSBwX2NvZGVjOworICAgIGlmIChwX2NvZGVjICYmIHBhcmFtZXRlcnMgJiYgcF9pbWFnZSkgeworICAgICAgICBvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7CiAKLQkJaWYgKCEgbF9jb2RlYy0+aXNfZGVjb21wcmVzc29yKSB7Ci0JCQlyZXR1cm4gbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX3NldHVwX2VuY29kZXIoCWxfY29kZWMtPm1fY29kZWMsCi0JCQkJCQkJCQkJCQkJCQkJCXBhcmFtZXRlcnMsCi0JCQkJCQkJCQkJCQkJCQkJCXBfaW1hZ2UsCi0JCQkJCQkJCQkJCQkJCQkJCSYobF9jb2RlYy0+bV9ldmVudF9tZ3IpICk7Ci0JCX0KLQl9CisgICAgICAgIGlmICghIGxfY29kZWMtPmlzX2RlY29tcHJlc3NvcikgeworICAgICAgICAgICAgcmV0dXJuIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2NvbXByZXNzaW9uLm9wal9zZXR1cF9lbmNvZGVyKGxfY29kZWMtPm1fY29kZWMsCisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgIHBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICYobF9jb2RlYy0+bV9ldmVudF9tZ3IpKTsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiBPUEpfRkFMU0U7CisgICAgcmV0dXJuIE9QSl9GQUxTRTsKIH0KIAotT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zdGFydF9jb21wcmVzcyAoCW9wal9jb2RlY190ICpwX2NvZGVjLAotCQkJCQkJCQkJCQlvcGpfaW1hZ2VfdCAqIHBfaW1hZ2UsCi0JCQkJCQkJCQkJCW9wal9zdHJlYW1fdCAqcF9zdHJlYW0pCitPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3N0YXJ0X2NvbXByZXNzKG9wal9jb2RlY190ICpwX2NvZGVjLAorICAgICAgICBvcGpfaW1hZ2VfdCAqIHBfaW1hZ2UsCisgICAgICAgIG9wal9zdHJlYW1fdCAqcF9zdHJlYW0pCiB7Ci0JaWYgKHBfY29kZWMgJiYgcF9zdHJlYW0pIHsKLQkJb3BqX2NvZGVjX3ByaXZhdGVfdCAqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCAqKSBwX2NvZGVjOwotCQlvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90ICopIHBfc3RyZWFtOworICAgIGlmIChwX2NvZGVjICYmIHBfc3RyZWFtKSB7CisgICAgICAgIG9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKKyAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqKSBwX3N0cmVhbTsKIAotCQlpZiAoISBsX2NvZGVjLT5pc19kZWNvbXByZXNzb3IpIHsKLQkJCXJldHVybiBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfc3RhcnRfY29tcHJlc3MoCWxfY29kZWMtPm1fY29kZWMsCi0JCQkJCQkJCQkJCQkJCQkJCQkJbF9zdHJlYW0sCi0JCQkJCQkJCQkJCQkJCQkJCQkJcF9pbWFnZSwKLQkJCQkJCQkJCQkJCQkJCQkJCQkmKGxfY29kZWMtPm1fZXZlbnRfbWdyKSk7Ci0JCX0KLQl9CisgICAgICAgIGlmICghIGxfY29kZWMtPmlzX2RlY29tcHJlc3NvcikgeworICAgICAgICAgICAgcmV0dXJuIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2NvbXByZXNzaW9uLm9wal9zdGFydF9jb21wcmVzcyhsX2NvZGVjLT5tX2NvZGVjLAorICAgICAgICAgICAgICAgICAgICBsX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgcF9pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgJihsX2NvZGVjLT5tX2V2ZW50X21ncikpOworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIE9QSl9GQUxTRTsKKyAgICByZXR1cm4gT1BKX0ZBTFNFOwogfQogCiBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX2VuY29kZShvcGpfY29kZWNfdCAqcF9pbmZvLCBvcGpfc3RyZWFtX3QgKnBfc3RyZWFtKQogewotCWlmIChwX2luZm8gJiYgcF9zdHJlYW0pIHsKLQkJb3BqX2NvZGVjX3ByaXZhdGVfdCAqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCAqKSBwX2luZm87Ci0JCW9wal9zdHJlYW1fcHJpdmF0ZV90ICogbF9zdHJlYW0gPSAob3BqX3N0cmVhbV9wcml2YXRlX3QgKikgcF9zdHJlYW07CisgICAgaWYgKHBfaW5mbyAmJiBwX3N0cmVhbSkgeworICAgICAgICBvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfaW5mbzsKKyAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqKSBwX3N0cmVhbTsKIAotCQlpZiAoISBsX2NvZGVjLT5pc19kZWNvbXByZXNzb3IpIHsKLQkJCXJldHVybiBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfZW5jb2RlKAlsX2NvZGVjLT5tX2NvZGVjLAotCQkJCQkJCQkJCQkJCQkJbF9zdHJlYW0sCi0JCQkJCQkJCQkJCQkJCQkmKGxfY29kZWMtPm1fZXZlbnRfbWdyKSk7Ci0JCX0KLQl9CisgICAgICAgIGlmICghIGxfY29kZWMtPmlzX2RlY29tcHJlc3NvcikgeworICAgICAgICAgICAgcmV0dXJuIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2NvbXByZXNzaW9uLm9wal9lbmNvZGUobF9jb2RlYy0+bV9jb2RlYywKKyAgICAgICAgICAgICAgICAgICAgbF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICYobF9jb2RlYy0+bV9ldmVudF9tZ3IpKTsKKyAgICAgICAgfQorICAgIH0KIAotCXJldHVybiBPUEpfRkFMU0U7CisgICAgcmV0dXJuIE9QSl9GQUxTRTsKIAogfQogCi1PUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX2VuZF9jb21wcmVzcyAob3BqX2NvZGVjX3QgKnBfY29kZWMsCi0JCQkJCQkJCQkJb3BqX3N0cmVhbV90ICpwX3N0cmVhbSkKK09QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfZW5kX2NvbXByZXNzKG9wal9jb2RlY190ICpwX2NvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV90ICpwX3N0cmVhbSkKIHsKLQlpZiAocF9jb2RlYyAmJiBwX3N0cmVhbSkgewotCQlvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7Ci0JCW9wal9zdHJlYW1fcHJpdmF0ZV90ICogbF9zdHJlYW0gPSAob3BqX3N0cmVhbV9wcml2YXRlX3QgKikgcF9zdHJlYW07CisgICAgaWYgKHBfY29kZWMgJiYgcF9zdHJlYW0pIHsKKyAgICAgICAgb3BqX2NvZGVjX3ByaXZhdGVfdCAqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCAqKSBwX2NvZGVjOworICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90ICopIHBfc3RyZWFtOwogCi0JCWlmICghIGxfY29kZWMtPmlzX2RlY29tcHJlc3NvcikgewotCQkJcmV0dXJuIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2NvbXByZXNzaW9uLm9wal9lbmRfY29tcHJlc3MobF9jb2RlYy0+bV9jb2RlYywKLQkJCQkJCQkJCQkJCQkJCQkJCWxfc3RyZWFtLAotCQkJCQkJCQkJCQkJCQkJCQkJJihsX2NvZGVjLT5tX2V2ZW50X21ncikpOwotCQl9Ci0JfQotCXJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIGlmICghIGxfY29kZWMtPmlzX2RlY29tcHJlc3NvcikgeworICAgICAgICAgICAgcmV0dXJuIGxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2NvbXByZXNzaW9uLm9wal9lbmRfY29tcHJlc3MobF9jb2RlYy0+bV9jb2RlYywKKyAgICAgICAgICAgICAgICAgICAgbF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICYobF9jb2RlYy0+bV9ldmVudF9tZ3IpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT1BKX0ZBTFNFOwogCiB9CiAKLU9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfZW5kX2RlY29tcHJlc3MgKAlvcGpfY29kZWNfdCAqcF9jb2RlYywKLQkJCQkJCQkJCQkJb3BqX3N0cmVhbV90ICpwX3N0cmVhbSkKK09QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfZW5kX2RlY29tcHJlc3Mob3BqX2NvZGVjX3QgKnBfY29kZWMsCisgICAgICAgIG9wal9zdHJlYW1fdCAqcF9zdHJlYW0pCiB7Ci0JaWYgKHBfY29kZWMgJiYgcF9zdHJlYW0pIHsKLQkJb3BqX2NvZGVjX3ByaXZhdGVfdCAqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCAqKSBwX2NvZGVjOwotCQlvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90ICopIHBfc3RyZWFtOworICAgIGlmIChwX2NvZGVjICYmIHBfc3RyZWFtKSB7CisgICAgICAgIG9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKKyAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqKSBwX3N0cmVhbTsKIAotCQlpZiAoISBsX2NvZGVjLT5pc19kZWNvbXByZXNzb3IpIHsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQkJCi0JCXJldHVybiBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9lbmRfZGVjb21wcmVzcyhsX2NvZGVjLT5tX2NvZGVjLAotCQkJCQkJCQkJCQkJCQkJCQkJbF9zdHJlYW0sCi0JCQkJCQkJCQkJCQkJCQkJCQkmKGxfY29kZWMtPm1fZXZlbnRfbWdyKSApOwotCX0KKyAgICAgICAgaWYgKCEgbF9jb2RlYy0+aXNfZGVjb21wcmVzc29yKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CiAKLQlyZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICByZXR1cm4gbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fZGVjb21wcmVzc2lvbi5vcGpfZW5kX2RlY29tcHJlc3MoCisgICAgICAgICAgICAgICAgICAgbF9jb2RlYy0+bV9jb2RlYywKKyAgICAgICAgICAgICAgICAgICBsX3N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAmKGxfY29kZWMtPm1fZXZlbnRfbWdyKSk7CisgICAgfQorCisgICAgcmV0dXJuIE9QSl9GQUxTRTsKIH0KIAogT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zZXRfTUNUKG9wal9jcGFyYW1ldGVyc190ICpwYXJhbWV0ZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyICogcEVuY29kaW5nTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfZGNfc2hpZnQsT1BKX1VJTlQzMiBwTmJDb21wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfZGNfc2hpZnQsIE9QSl9VSU5UMzIgcE5iQ29tcCkKIHsKLQlPUEpfVUlOVDMyIGxfbWF0cml4X3NpemUgPSBwTmJDb21wICogcE5iQ29tcCAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfRkxPQVQzMik7Ci0JT1BKX1VJTlQzMiBsX2RjX3NoaWZ0X3NpemUgPSBwTmJDb21wICogKE9QSl9VSU5UMzIpc2l6ZW9mKE9QSl9JTlQzMik7Ci0JT1BKX1VJTlQzMiBsX21jdF90b3RhbF9zaXplID0gbF9tYXRyaXhfc2l6ZSArIGxfZGNfc2hpZnRfc2l6ZTsKKyAgICBPUEpfVUlOVDMyIGxfbWF0cml4X3NpemUgPSBwTmJDb21wICogcE5iQ29tcCAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfRkxPQVQzMik7CisgICAgT1BKX1VJTlQzMiBsX2RjX3NoaWZ0X3NpemUgPSBwTmJDb21wICogKE9QSl9VSU5UMzIpc2l6ZW9mKE9QSl9JTlQzMik7CisgICAgT1BKX1VJTlQzMiBsX21jdF90b3RhbF9zaXplID0gbF9tYXRyaXhfc2l6ZSArIGxfZGNfc2hpZnRfc2l6ZTsKIAotCS8qIGFkZCBNQ1QgY2FwYWJpbGl0eSAqLworICAgIC8qIGFkZCBNQ1QgY2FwYWJpbGl0eSAqLwogICAgIGlmIChPUEpfSVNfUEFSVDIocGFyYW1ldGVycy0+cnNpeikpIHsKICAgICAgICAgcGFyYW1ldGVycy0+cnNpeiB8PSBPUEpfRVhURU5TSU9OX01DVDsKICAgICB9IGVsc2UgewogICAgICAgICBwYXJhbWV0ZXJzLT5yc2l6ID0gKChPUEpfUFJPRklMRV9QQVJUMikgfCAoT1BKX0VYVEVOU0lPTl9NQ1QpKTsKICAgICB9Ci0JcGFyYW1ldGVycy0+aXJyZXZlcnNpYmxlID0gMTsKKyAgICBwYXJhbWV0ZXJzLT5pcnJldmVyc2libGUgPSAxOwogCi0JLyogdXNlIGFycmF5IGJhc2VkIE1DVCAqLwotCXBhcmFtZXRlcnMtPnRjcF9tY3QgPSAyOwotCXBhcmFtZXRlcnMtPm1jdF9kYXRhID0gb3BqX21hbGxvYyhsX21jdF90b3RhbF9zaXplKTsKLQlpZiAoISBwYXJhbWV0ZXJzLT5tY3RfZGF0YSkgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KKyAgICAvKiB1c2UgYXJyYXkgYmFzZWQgTUNUICovCisgICAgcGFyYW1ldGVycy0+dGNwX21jdCA9IDI7CisgICAgcGFyYW1ldGVycy0+bWN0X2RhdGEgPSBvcGpfbWFsbG9jKGxfbWN0X3RvdGFsX3NpemUpOworICAgIGlmICghIHBhcmFtZXRlcnMtPm1jdF9kYXRhKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0JbWVtY3B5KHBhcmFtZXRlcnMtPm1jdF9kYXRhLHBFbmNvZGluZ01hdHJpeCxsX21hdHJpeF9zaXplKTsKLQltZW1jcHkoKChPUEpfQllURSAqKSBwYXJhbWV0ZXJzLT5tY3RfZGF0YSkgKyAgbF9tYXRyaXhfc2l6ZSxwX2RjX3NoaWZ0LGxfZGNfc2hpZnRfc2l6ZSk7CisgICAgbWVtY3B5KHBhcmFtZXRlcnMtPm1jdF9kYXRhLCBwRW5jb2RpbmdNYXRyaXgsIGxfbWF0cml4X3NpemUpOworICAgIG1lbWNweSgoKE9QSl9CWVRFICopIHBhcmFtZXRlcnMtPm1jdF9kYXRhKSArICBsX21hdHJpeF9zaXplLCBwX2RjX3NoaWZ0LAorICAgICAgICAgICBsX2RjX3NoaWZ0X3NpemUpOwogCi0JcmV0dXJuIE9QSl9UUlVFOworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAotT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal93cml0ZV90aWxlICgJb3BqX2NvZGVjX3QgKnBfY29kZWMsCi0JCQkJCQkJCQkJT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCi0JCQkJCQkJCQkJT1BKX0JZVEUgKiBwX2RhdGEsCi0JCQkJCQkJCQkJT1BKX1VJTlQzMiBwX2RhdGFfc2l6ZSwKLQkJCQkJCQkJCQlvcGpfc3RyZWFtX3QgKnBfc3RyZWFtICkKK09QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfd3JpdGVfdGlsZShvcGpfY29kZWNfdCAqcF9jb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fdCAqcF9zdHJlYW0pCiB7Ci0JaWYgKHBfY29kZWMgJiYgcF9zdHJlYW0gJiYgcF9kYXRhKSB7Ci0JCW9wal9jb2RlY19wcml2YXRlX3QgKiBsX2NvZGVjID0gKG9wal9jb2RlY19wcml2YXRlX3QgKikgcF9jb2RlYzsKLQkJb3BqX3N0cmVhbV9wcml2YXRlX3QgKiBsX3N0cmVhbSA9IChvcGpfc3RyZWFtX3ByaXZhdGVfdCAqKSBwX3N0cmVhbTsKKyAgICBpZiAocF9jb2RlYyAmJiBwX3N0cmVhbSAmJiBwX2RhdGEpIHsKKyAgICAgICAgb3BqX2NvZGVjX3ByaXZhdGVfdCAqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCAqKSBwX2NvZGVjOworICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIGxfc3RyZWFtID0gKG9wal9zdHJlYW1fcHJpdmF0ZV90ICopIHBfc3RyZWFtOwogCi0JCWlmIChsX2NvZGVjLT5pc19kZWNvbXByZXNzb3IpIHsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KKyAgICAgICAgaWYgKGxfY29kZWMtPmlzX2RlY29tcHJlc3NvcikgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQogCi0JCXJldHVybiBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfd3JpdGVfdGlsZSgJbF9jb2RlYy0+bV9jb2RlYywKLQkJCQkJCQkJCQkJCQkJCQkJcF90aWxlX2luZGV4LAotCQkJCQkJCQkJCQkJCQkJCQlwX2RhdGEsCi0JCQkJCQkJCQkJCQkJCQkJCXBfZGF0YV9zaXplLAotCQkJCQkJCQkJCQkJCQkJCQlsX3N0cmVhbSwKLQkJCQkJCQkJCQkJCQkJCQkJJihsX2NvZGVjLT5tX2V2ZW50X21ncikgKTsKLQl9CisgICAgICAgIHJldHVybiBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfd3JpdGVfdGlsZShsX2NvZGVjLT5tX2NvZGVjLAorICAgICAgICAgICAgICAgIHBfdGlsZV9pbmRleCwKKyAgICAgICAgICAgICAgICBwX2RhdGEsCisgICAgICAgICAgICAgICAgcF9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgbF9zdHJlYW0sCisgICAgICAgICAgICAgICAgJihsX2NvZGVjLT5tX2V2ZW50X21ncikpOworICAgIH0KIAotCXJldHVybiBPUEpfRkFMU0U7CisgICAgcmV0dXJuIE9QSl9GQUxTRTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCiB2b2lkIE9QSl9DQUxMQ09OViBvcGpfZGVzdHJveV9jb2RlYyhvcGpfY29kZWNfdCAqcF9jb2RlYykKIHsKLQlpZiAocF9jb2RlYykgewotCQlvcGpfY29kZWNfcHJpdmF0ZV90ICogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90ICopIHBfY29kZWM7CisgICAgaWYgKHBfY29kZWMpIHsKKyAgICAgICAgb3BqX2NvZGVjX3ByaXZhdGVfdCAqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCAqKSBwX2NvZGVjOwogCi0JCWlmIChsX2NvZGVjLT5pc19kZWNvbXByZXNzb3IpIHsKLQkJCWxfY29kZWMtPm1fY29kZWNfZGF0YS5tX2RlY29tcHJlc3Npb24ub3BqX2Rlc3Ryb3kobF9jb2RlYy0+bV9jb2RlYyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9jb21wcmVzc2lvbi5vcGpfZGVzdHJveShsX2NvZGVjLT5tX2NvZGVjKTsKLQkJfQorICAgICAgICBpZiAobF9jb2RlYy0+aXNfZGVjb21wcmVzc29yKSB7CisgICAgICAgICAgICBsX2NvZGVjLT5tX2NvZGVjX2RhdGEubV9kZWNvbXByZXNzaW9uLm9wal9kZXN0cm95KGxfY29kZWMtPm1fY29kZWMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbF9jb2RlYy0+bV9jb2RlY19kYXRhLm1fY29tcHJlc3Npb24ub3BqX2Rlc3Ryb3kobF9jb2RlYy0+bV9jb2RlYyk7CisgICAgICAgIH0KIAotCQlsX2NvZGVjLT5tX2NvZGVjID0gMDA7Ci0JCW9wal9mcmVlKGxfY29kZWMpOwotCX0KKyAgICAgICAgbF9jb2RlYy0+bV9jb2RlYyA9IDAwOworICAgICAgICBvcGpfZnJlZShsX2NvZGVjKTsKKyAgICB9CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotdm9pZCBPUEpfQ0FMTENPTlYgb3BqX2R1bXBfY29kZWMoCW9wal9jb2RlY190ICpwX2NvZGVjLAotCQkJCQkJCQkJT1BKX0lOVDMyIGluZm9fZmxhZywKLQkJCQkJCQkJCUZJTEUqIG91dHB1dF9zdHJlYW0pCit2b2lkIE9QSl9DQUxMQ09OViBvcGpfZHVtcF9jb2RlYyhvcGpfY29kZWNfdCAqcF9jb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBpbmZvX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFKiBvdXRwdXRfc3RyZWFtKQogewotCWlmIChwX2NvZGVjKSB7Ci0JCW9wal9jb2RlY19wcml2YXRlX3QqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCopIHBfY29kZWM7CisgICAgaWYgKHBfY29kZWMpIHsKKyAgICAgICAgb3BqX2NvZGVjX3ByaXZhdGVfdCogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90KikgcF9jb2RlYzsKIAotCQlsX2NvZGVjLT5vcGpfZHVtcF9jb2RlYyhsX2NvZGVjLT5tX2NvZGVjLCBpbmZvX2ZsYWcsIG91dHB1dF9zdHJlYW0pOwotCQlyZXR1cm47Ci0JfQorICAgICAgICBsX2NvZGVjLT5vcGpfZHVtcF9jb2RlYyhsX2NvZGVjLT5tX2NvZGVjLCBpbmZvX2ZsYWcsIG91dHB1dF9zdHJlYW0pOworICAgICAgICByZXR1cm47CisgICAgfQogCi0JLyogVE9ETyByZXR1cm4gZXJyb3IgKi8KLQkvKiBmcHJpbnRmKHN0ZGVyciwgIltFUlJPUl0gSW5wdXQgcGFyYW1ldGVyIG9mIHRoZSBkdW1wX2NvZGVjIGZ1bmN0aW9uIGFyZSBpbmNvcnJlY3QuXG4iKTsgKi8KLQlyZXR1cm47CisgICAgLyogVE9ETyByZXR1cm4gZXJyb3IgKi8KKyAgICAvKiBmcHJpbnRmKHN0ZGVyciwgIltFUlJPUl0gSW5wdXQgcGFyYW1ldGVyIG9mIHRoZSBkdW1wX2NvZGVjIGZ1bmN0aW9uIGFyZSBpbmNvcnJlY3QuXG4iKTsgKi8KKyAgICByZXR1cm47CiB9CiAKIG9wal9jb2Rlc3RyZWFtX2luZm9fdjJfdCogT1BKX0NBTExDT05WIG9wal9nZXRfY3N0cl9pbmZvKG9wal9jb2RlY190ICpwX2NvZGVjKQogewotCWlmIChwX2NvZGVjKSB7Ci0JCW9wal9jb2RlY19wcml2YXRlX3QqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCopIHBfY29kZWM7CisgICAgaWYgKHBfY29kZWMpIHsKKyAgICAgICAgb3BqX2NvZGVjX3ByaXZhdGVfdCogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90KikgcF9jb2RlYzsKIAotCQlyZXR1cm4gbF9jb2RlYy0+b3BqX2dldF9jb2RlY19pbmZvKGxfY29kZWMtPm1fY29kZWMpOwotCX0KKyAgICAgICAgcmV0dXJuIGxfY29kZWMtPm9wal9nZXRfY29kZWNfaW5mbyhsX2NvZGVjLT5tX2NvZGVjKTsKKyAgICB9CiAKLQlyZXR1cm4gTlVMTDsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBPUEpfQ0FMTENPTlYgb3BqX2Rlc3Ryb3lfY3N0cl9pbmZvKG9wal9jb2Rlc3RyZWFtX2luZm9fdjJfdCAqKmNzdHJfaW5mbykgewotCWlmIChjc3RyX2luZm8pIHsKK3ZvaWQgT1BKX0NBTExDT05WIG9wal9kZXN0cm95X2NzdHJfaW5mbyhvcGpfY29kZXN0cmVhbV9pbmZvX3YyX3QgKipjc3RyX2luZm8pCit7CisgICAgaWYgKGNzdHJfaW5mbykgewogCi0JCWlmICgoKmNzdHJfaW5mbyktPm1fZGVmYXVsdF90aWxlX2luZm8udGNjcF9pbmZvKXsKLQkJCW9wal9mcmVlKCgqY3N0cl9pbmZvKS0+bV9kZWZhdWx0X3RpbGVfaW5mby50Y2NwX2luZm8pOwotCQl9CisgICAgICAgIGlmICgoKmNzdHJfaW5mbyktPm1fZGVmYXVsdF90aWxlX2luZm8udGNjcF9pbmZvKSB7CisgICAgICAgICAgICBvcGpfZnJlZSgoKmNzdHJfaW5mbyktPm1fZGVmYXVsdF90aWxlX2luZm8udGNjcF9pbmZvKTsKKyAgICAgICAgfQogCi0JCWlmICgoKmNzdHJfaW5mbyktPnRpbGVfaW5mbyl7Ci0JCQkvKiBGSVhNRSBub3QgdXNlZCBmb3IgdGhlIG1vbWVudCovCi0JCX0KKyAgICAgICAgaWYgKCgqY3N0cl9pbmZvKS0+dGlsZV9pbmZvKSB7CisgICAgICAgICAgICAvKiBGSVhNRSBub3QgdXNlZCBmb3IgdGhlIG1vbWVudCovCisgICAgICAgIH0KIAotCQlvcGpfZnJlZSgoKmNzdHJfaW5mbykpOwotCQkoKmNzdHJfaW5mbykgPSBOVUxMOwotCX0KKyAgICAgICAgb3BqX2ZyZWUoKCpjc3RyX2luZm8pKTsKKyAgICAgICAgKCpjc3RyX2luZm8pID0gTlVMTDsKKyAgICB9CiB9CiAKIG9wal9jb2Rlc3RyZWFtX2luZGV4X3QgKiBPUEpfQ0FMTENPTlYgb3BqX2dldF9jc3RyX2luZGV4KG9wal9jb2RlY190ICpwX2NvZGVjKQogewotCWlmIChwX2NvZGVjKSB7Ci0JCW9wal9jb2RlY19wcml2YXRlX3QqIGxfY29kZWMgPSAob3BqX2NvZGVjX3ByaXZhdGVfdCopIHBfY29kZWM7CisgICAgaWYgKHBfY29kZWMpIHsKKyAgICAgICAgb3BqX2NvZGVjX3ByaXZhdGVfdCogbF9jb2RlYyA9IChvcGpfY29kZWNfcHJpdmF0ZV90KikgcF9jb2RlYzsKIAotCQlyZXR1cm4gbF9jb2RlYy0+b3BqX2dldF9jb2RlY19pbmRleChsX2NvZGVjLT5tX2NvZGVjKTsKLQl9CisgICAgICAgIHJldHVybiBsX2NvZGVjLT5vcGpfZ2V0X2NvZGVjX2luZGV4KGxfY29kZWMtPm1fY29kZWMpOworICAgIH0KIAotCXJldHVybiBOVUxMOworICAgIHJldHVybiBOVUxMOwogfQogCiB2b2lkIE9QSl9DQUxMQ09OViBvcGpfZGVzdHJveV9jc3RyX2luZGV4KG9wal9jb2Rlc3RyZWFtX2luZGV4X3QgKipwX2NzdHJfaW5kZXgpCiB7Ci0JaWYgKCpwX2NzdHJfaW5kZXgpewotCQlqMmtfZGVzdHJveV9jc3RyX2luZGV4KCpwX2NzdHJfaW5kZXgpOwotCQkoKnBfY3N0cl9pbmRleCkgPSBOVUxMOwotCX0KKyAgICBpZiAoKnBfY3N0cl9pbmRleCkgeworICAgICAgICBqMmtfZGVzdHJveV9jc3RyX2luZGV4KCpwX2NzdHJfaW5kZXgpOworICAgICAgICAoKnBfY3N0cl9pbmRleCkgPSBOVUxMOworICAgIH0KIH0KIAotb3BqX3N0cmVhbV90KiBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9jcmVhdGVfZGVmYXVsdF9maWxlX3N0cmVhbSAoY29uc3QgY2hhciAqZm5hbWUsIE9QSl9CT09MIHBfaXNfcmVhZF9zdHJlYW0pCitvcGpfc3RyZWFtX3QqIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX2NyZWF0ZV9kZWZhdWx0X2ZpbGVfc3RyZWFtKAorICAgIGNvbnN0IGNoYXIgKmZuYW1lLCBPUEpfQk9PTCBwX2lzX3JlYWRfc3RyZWFtKQogewotICAgIHJldHVybiBvcGpfc3RyZWFtX2NyZWF0ZV9maWxlX3N0cmVhbShmbmFtZSwgT1BKX0oyS19TVFJFQU1fQ0hVTktfU0laRSwgcF9pc19yZWFkX3N0cmVhbSk7CisgICAgcmV0dXJuIG9wal9zdHJlYW1fY3JlYXRlX2ZpbGVfc3RyZWFtKGZuYW1lLCBPUEpfSjJLX1NUUkVBTV9DSFVOS19TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2lzX3JlYWRfc3RyZWFtKTsKIH0KIAotb3BqX3N0cmVhbV90KiBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9jcmVhdGVfZmlsZV9zdHJlYW0gKAotICAgICAgICBjb25zdCBjaGFyICpmbmFtZSwgCi0JCU9QSl9TSVpFX1QgcF9zaXplLCAKLSAgICAgICAgT1BKX0JPT0wgcF9pc19yZWFkX3N0cmVhbSkKK29wal9zdHJlYW1fdCogT1BKX0NBTExDT05WIG9wal9zdHJlYW1fY3JlYXRlX2ZpbGVfc3RyZWFtKAorICAgIGNvbnN0IGNoYXIgKmZuYW1lLAorICAgIE9QSl9TSVpFX1QgcF9zaXplLAorICAgIE9QSl9CT09MIHBfaXNfcmVhZF9zdHJlYW0pCiB7CiAgICAgb3BqX3N0cmVhbV90KiBsX3N0cmVhbSA9IDAwOwogICAgIEZJTEUgKnBfZmlsZTsKQEAgLTkzNCwyNyArMTAxOCw0OCBAQAogICAgIGlmICghIGZuYW1lKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICAKLSAgICBpZihwX2lzX3JlYWRfc3RyZWFtKSBtb2RlID0gInJiIjsgZWxzZSBtb2RlID0gIndiIjsKKworICAgIGlmIChwX2lzX3JlYWRfc3RyZWFtKSB7CisgICAgICAgIG1vZGUgPSAicmIiOworICAgIH0gZWxzZSB7CisgICAgICAgIG1vZGUgPSAid2IiOworICAgIH0KIAogICAgIHBfZmlsZSA9IGZvcGVuKGZuYW1lLCBtb2RlKTsKIAogICAgIGlmICghIHBfZmlsZSkgewotCSAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgbF9zdHJlYW0gPSBvcGpfc3RyZWFtX2NyZWF0ZShwX3NpemUscF9pc19yZWFkX3N0cmVhbSk7CisgICAgbF9zdHJlYW0gPSBvcGpfc3RyZWFtX2NyZWF0ZShwX3NpemUsIHBfaXNfcmVhZF9zdHJlYW0pOwogICAgIGlmICghIGxfc3RyZWFtKSB7CiAgICAgICAgIGZjbG9zZShwX2ZpbGUpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBvcGpfc3RyZWFtX3NldF91c2VyX2RhdGEobF9zdHJlYW0sIHBfZmlsZSwgKG9wal9zdHJlYW1fZnJlZV91c2VyX2RhdGFfZm4pIGZjbG9zZSk7Ci0gICAgb3BqX3N0cmVhbV9zZXRfdXNlcl9kYXRhX2xlbmd0aChsX3N0cmVhbSwgb3BqX2dldF9kYXRhX2xlbmd0aF9mcm9tX2ZpbGUocF9maWxlKSk7CisgICAgb3BqX3N0cmVhbV9zZXRfdXNlcl9kYXRhKGxfc3RyZWFtLCBwX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGpfc3RyZWFtX2ZyZWVfdXNlcl9kYXRhX2ZuKSBmY2xvc2UpOworICAgIG9wal9zdHJlYW1fc2V0X3VzZXJfZGF0YV9sZW5ndGgobF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZ2V0X2RhdGFfbGVuZ3RoX2Zyb21fZmlsZShwX2ZpbGUpKTsKICAgICBvcGpfc3RyZWFtX3NldF9yZWFkX2Z1bmN0aW9uKGxfc3RyZWFtLCAob3BqX3N0cmVhbV9yZWFkX2ZuKSBvcGpfcmVhZF9mcm9tX2ZpbGUpOwotICAgIG9wal9zdHJlYW1fc2V0X3dyaXRlX2Z1bmN0aW9uKGxfc3RyZWFtLCAob3BqX3N0cmVhbV93cml0ZV9mbikgb3BqX3dyaXRlX2Zyb21fZmlsZSk7CisgICAgb3BqX3N0cmVhbV9zZXRfd3JpdGVfZnVuY3Rpb24obF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wal9zdHJlYW1fd3JpdGVfZm4pIG9wal93cml0ZV9mcm9tX2ZpbGUpOwogICAgIG9wal9zdHJlYW1fc2V0X3NraXBfZnVuY3Rpb24obF9zdHJlYW0sIChvcGpfc3RyZWFtX3NraXBfZm4pIG9wal9za2lwX2Zyb21fZmlsZSk7CiAgICAgb3BqX3N0cmVhbV9zZXRfc2Vla19mdW5jdGlvbihsX3N0cmVhbSwgKG9wal9zdHJlYW1fc2Vla19mbikgb3BqX3NlZWtfZnJvbV9maWxlKTsKIAogICAgIHJldHVybiBsX3N0cmVhbTsKIH0KKworCit2b2lkKiBPUEpfQ0FMTENPTlYgb3BqX2ltYWdlX2RhdGFfYWxsb2MoT1BKX1NJWkVfVCBzaXplKQoreworICAgIHZvaWQqIHJldCA9IG9wal9hbGlnbmVkX21hbGxvYyhzaXplKTsKKyAgICAvKiBwcmludGYoIm9wal9pbWFnZV9kYXRhX2FsbG9jICVwXG4iLCByZXQpOyAqLworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgT1BKX0NBTExDT05WIG9wal9pbWFnZV9kYXRhX2ZyZWUodm9pZCogcHRyKQoreworICAgIC8qIHByaW50Zigib3BqX2ltYWdlX2RhdGFfZnJlZSAlcFxuIiwgcHRyKTsgKi8KKyAgICBvcGpfYWxpZ25lZF9mcmVlKHB0cik7Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wZW5qcGVnLmggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wZW5qcGVnLmgKaW5kZXggZTU3MTY3Mi4uYzExOWU4ZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGVuanBlZy5oCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BlbmpwZWcuaApAQCAtMSwxMTAgKzEsMTEwIEBACi0gLyoKLSAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAotICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAotICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cwotICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBVbml2ZXJzaXRlIGNhdGhvbGlxdWUgZGUgTG91dmFpbiAoVUNMKSwgQmVsZ2l1bQotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQotICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMsIERhdmlkIEphbnNzZW5zCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgWWFubmljayBWZXJzY2h1ZXJlbgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4IAotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQsIEFudG9uaW4gRGVzY2FtcGUKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQotICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcsIFBhcnZhdGhhIEVsYW5nb3ZhbgotICogQ29weXJpZ2h0IChjKSAyMDA4LCBKZXJvbWUgRmltZXMsIENvbW11bmljYXRpb25zICYgU3lzdGVtZXMgPGplcm9tZS5maW1lc0BjLXMuZnI+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgS2FvcmkgSGFnaWhhcmEKLSAqIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRnJhbmNlIAotICogQ29weXJpZ2h0IChjKSAyMDEyLCBDUyBTeXN0ZW1lcyBkJ0luZm9ybWF0aW9uLCBGcmFuY2UKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgQVMgSVMnCi0gKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCi0gKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQotICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQotICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQotICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KKy8qCisqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzCisqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZAorKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCisqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KKyoKKyogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCisqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBQcm9mZXNzb3IgQmVub2l0IE1hY3EKKyogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMsIERhdmlkIEphbnNzZW5zCisqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCisqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eAorKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQorKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KKyogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcsIFBhcnZhdGhhIEVsYW5nb3ZhbgorKiBDb3B5cmlnaHQgKGMpIDIwMDgsIEplcm9tZSBGaW1lcywgQ29tbXVuaWNhdGlvbnMgJiBTeXN0ZW1lcyA8amVyb21lLmZpbWVzQGMtcy5mcj4KKyogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEsIEthb3JpIEhhZ2loYXJhCisqIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRnJhbmNlCisqIENvcHlyaWdodCAoYykgMjAxMiwgQ1MgU3lzdGVtZXMgZCdJbmZvcm1hdGlvbiwgRnJhbmNlCisqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisqCisqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyogYXJlIG1ldDoKKyogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisqCisqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJworKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLwogI2lmbmRlZiBPUEVOSlBFR19ICiAjZGVmaW5lIE9QRU5KUEVHX0gKIAogCi0vKiAKKy8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBDb21waWxlciBkaXJlY3RpdmVzCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwogCiAvKgotVGhlIGlubGluZSBrZXl3b3JkIGlzIHN1cHBvcnRlZCBieSBDOTkgYnV0IG5vdCBieSBDOTAuIAotTW9zdCBjb21waWxlcnMgaW1wbGVtZW50IHRoZWlyIG93biB2ZXJzaW9uIG9mIHRoaXMga2V5d29yZCAuLi4gCitUaGUgaW5saW5lIGtleXdvcmQgaXMgc3VwcG9ydGVkIGJ5IEM5OSBidXQgbm90IGJ5IEM5MC4KK01vc3QgY29tcGlsZXJzIGltcGxlbWVudCB0aGVpciBvd24gdmVyc2lvbiBvZiB0aGlzIGtleXdvcmQgLi4uCiAqLwogI2lmbmRlZiBJTkxJTkUKLQkjaWYgZGVmaW5lZChfTVNDX1ZFUikKLQkJI2RlZmluZSBJTkxJTkUgX19mb3JjZWlubGluZQotCSNlbGlmIGRlZmluZWQoX19HTlVDX18pCi0JCSNkZWZpbmUgSU5MSU5FIF9faW5saW5lX18KLQkjZWxpZiBkZWZpbmVkKF9fTVdFUktTX18pCi0JCSNkZWZpbmUgSU5MSU5FIGlubGluZQotCSNlbHNlIAotCQkvKiBhZGQgb3RoZXIgY29tcGlsZXJzIGhlcmUgLi4uICovCi0JCSNkZWZpbmUgSU5MSU5FIAotCSNlbmRpZiAvKiBkZWZpbmVkKDxDb21waWxlcj4pICovCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgSU5MSU5FIF9fZm9yY2VpbmxpbmUKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pCisjZGVmaW5lIElOTElORSBfX2lubGluZV9fCisjZWxpZiBkZWZpbmVkKF9fTVdFUktTX18pCisjZGVmaW5lIElOTElORSBpbmxpbmUKKyNlbHNlCisvKiBhZGQgb3RoZXIgY29tcGlsZXJzIGhlcmUgLi4uICovCisjZGVmaW5lIElOTElORQorI2VuZGlmIC8qIGRlZmluZWQoPENvbXBpbGVyPikgKi8KICNlbmRpZiAvKiBJTkxJTkUgKi8KIAogLyogZGVwcmVjYXRlZCBhdHRyaWJ1dGUgKi8KICNpZmRlZiBfX0dOVUNfXwotCSNkZWZpbmUgT1BKX0RFUFJFQ0FURUQoZnVuYykgZnVuYyBfX2F0dHJpYnV0ZV9fICgoZGVwcmVjYXRlZCkpCisjZGVmaW5lIE9QSl9ERVBSRUNBVEVEKGZ1bmMpIGZ1bmMgX19hdHRyaWJ1dGVfXyAoKGRlcHJlY2F0ZWQpKQogI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKLQkjZGVmaW5lIE9QSl9ERVBSRUNBVEVEKGZ1bmMpIF9fZGVjbHNwZWMoZGVwcmVjYXRlZCkgZnVuYworI2RlZmluZSBPUEpfREVQUkVDQVRFRChmdW5jKSBfX2RlY2xzcGVjKGRlcHJlY2F0ZWQpIGZ1bmMKICNlbHNlCi0JI3ByYWdtYSBtZXNzYWdlKCJXQVJOSU5HOiBZb3UgbmVlZCB0byBpbXBsZW1lbnQgREVQUkVDQVRFRCBmb3IgdGhpcyBjb21waWxlciIpCi0JI2RlZmluZSBPUEpfREVQUkVDQVRFRChmdW5jKSBmdW5jCisjcHJhZ21hIG1lc3NhZ2UoIldBUk5JTkc6IFlvdSBuZWVkIHRvIGltcGxlbWVudCBERVBSRUNBVEVEIGZvciB0aGlzIGNvbXBpbGVyIikKKyNkZWZpbmUgT1BKX0RFUFJFQ0FURUQoZnVuYykgZnVuYwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKE9QSl9TVEFUSUMpIHx8ICFkZWZpbmVkKF9XSU4zMikKIC8qIGh0dHA6Ly9nY2MuZ251Lm9yZy93aWtpL1Zpc2liaWxpdHkgKi8KLSMJaWYgX19HTlVDX18gPj0gNAotIwkJaWYgZGVmaW5lZChPUEpfU1RBVElDKSAvKiBzdGF0aWMgbGlicmFyeSB1c2VzICJoaWRkZW4iICovCi0jCQkJZGVmaW5lIE9QSl9BUEkgICAgX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJoaWRkZW4iKSkpCi0jCQllbHNlCi0jCQkJZGVmaW5lIE9QSl9BUEkgICAgX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotIwkJZW5kaWYKLSMJCWRlZmluZSBPUEpfTE9DQUwgIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiaGlkZGVuIikpKQotIwllbHNlCi0jCQlkZWZpbmUgT1BKX0FQSQotIwkJZGVmaW5lIE9QSl9MT0NBTAotIwllbmRpZgotIwlkZWZpbmUgT1BKX0NBTExDT05WCisjICAgaWYgX19HTlVDX18gPj0gNAorIyAgICAgICBpZiBkZWZpbmVkKE9QSl9TVEFUSUMpIC8qIHN0YXRpYyBsaWJyYXJ5IHVzZXMgImhpZGRlbiIgKi8KKyMgICAgICAgICAgIGRlZmluZSBPUEpfQVBJICAgIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiaGlkZGVuIikpKQorIyAgICAgICBlbHNlCisjICAgICAgICAgICBkZWZpbmUgT1BKX0FQSSAgICBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCisjICAgICAgIGVuZGlmCisjICAgICAgIGRlZmluZSBPUEpfTE9DQUwgIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiaGlkZGVuIikpKQorIyAgIGVsc2UKKyMgICAgICAgZGVmaW5lIE9QSl9BUEkKKyMgICAgICAgZGVmaW5lIE9QSl9MT0NBTAorIyAgIGVuZGlmCisjICAgZGVmaW5lIE9QSl9DQUxMQ09OVgogI2Vsc2UKLSMJZGVmaW5lIE9QSl9DQUxMQ09OViBfX3N0ZGNhbGwKKyMgICBkZWZpbmUgT1BKX0NBTExDT05WIF9fc3RkY2FsbAogLyoKLVRoZSBmb2xsb3dpbmcgaWZkZWYgYmxvY2sgaXMgdGhlIHN0YW5kYXJkIHdheSBvZiBjcmVhdGluZyBtYWNyb3Mgd2hpY2ggbWFrZSBleHBvcnRpbmcgCitUaGUgZm9sbG93aW5nIGlmZGVmIGJsb2NrIGlzIHRoZSBzdGFuZGFyZCB3YXkgb2YgY3JlYXRpbmcgbWFjcm9zIHdoaWNoIG1ha2UgZXhwb3J0aW5nCiBmcm9tIGEgRExMIHNpbXBsZXIuIEFsbCBmaWxlcyB3aXRoaW4gdGhpcyBETEwgYXJlIGNvbXBpbGVkIHdpdGggdGhlIE9QSl9FWFBPUlRTCiBzeW1ib2wgZGVmaW5lZCBvbiB0aGUgY29tbWFuZCBsaW5lLiB0aGlzIHN5bWJvbCBzaG91bGQgbm90IGJlIGRlZmluZWQgb24gYW55IHByb2plY3QKLXRoYXQgdXNlcyB0aGlzIERMTC4gVGhpcyB3YXkgYW55IG90aGVyIHByb2plY3Qgd2hvc2Ugc291cmNlIGZpbGVzIGluY2x1ZGUgdGhpcyBmaWxlIHNlZSAKK3RoYXQgdXNlcyB0aGlzIERMTC4gVGhpcyB3YXkgYW55IG90aGVyIHByb2plY3Qgd2hvc2Ugc291cmNlIGZpbGVzIGluY2x1ZGUgdGhpcyBmaWxlIHNlZQogT1BKX0FQSSBmdW5jdGlvbnMgYXMgYmVpbmcgaW1wb3J0ZWQgZnJvbSBhIERMTCwgd2hlcmVhcyB0aGlzIERMTCBzZWVzIHN5bWJvbHMKIGRlZmluZWQgd2l0aCB0aGlzIG1hY3JvIGFzIGJlaW5nIGV4cG9ydGVkLgogKi8KLSMJaWYgZGVmaW5lZChPUEpfRVhQT1JUUykgfHwgZGVmaW5lZChETExfRVhQT1JUKQotIwkJZGVmaW5lIE9QSl9BUEkgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0jCWVsc2UKLSMJCWRlZmluZSBPUEpfQVBJIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQotIwllbmRpZiAvKiBPUEpfRVhQT1JUUyAqLworIyAgIGlmIGRlZmluZWQoT1BKX0VYUE9SVFMpIHx8IGRlZmluZWQoRExMX0VYUE9SVCkKKyMgICAgICAgZGVmaW5lIE9QSl9BUEkgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgZWxzZQorIyAgICAgICBkZWZpbmUgT1BKX0FQSSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICBlbmRpZiAvKiBPUEpfRVhQT1JUUyAqLwogI2VuZGlmIC8qICFPUEpfU1RBVElDIHx8ICFfV0lOMzIgKi8KIAogdHlwZWRlZiBpbnQgT1BKX0JPT0w7CkBAIC0xMzUsNyArMTM1LDcgQEAKIC8qIEF2b2lkIGNvbXBpbGUtdGltZSB3YXJuaW5nIGJlY2F1c2UgcGFyYW1ldGVyIGlzIG5vdCB1c2VkICovCiAjZGVmaW5lIE9QSl9BUkdfTk9UX1VTRUQoeCkgKHZvaWQpKHgpCiAKLS8qIAorLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIFVzZWZ1bCBjb25zdGFudCBkZWZpbml0aW9ucwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTQzLDE5ICsxNDMsMTkgQEAKIAogI2RlZmluZSBPUEpfUEFUSF9MRU4gNDA5NiAvKio8IE1heGltdW0gYWxsb3dlZCBzaXplIGZvciBmaWxlbmFtZXMgKi8KIAotI2RlZmluZSBPUEpfSjJLX01BWFJMVkxTIDMzCQkJCQkvKio8IE51bWJlciBvZiBtYXhpbXVtIHJlc29sdXRpb24gbGV2ZWwgYXV0aG9yaXplZCAqLwotI2RlZmluZSBPUEpfSjJLX01BWEJBTkRTICgzKk9QSl9KMktfTUFYUkxWTFMtMikJLyoqPCBOdW1iZXIgb2YgbWF4aW11bSBzdWItYmFuZCBsaW5rZWQgdG8gbnVtYmVyIG9mIHJlc29sdXRpb24gbGV2ZWwgKi8KKyNkZWZpbmUgT1BKX0oyS19NQVhSTFZMUyAzMyAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgbWF4aW11bSByZXNvbHV0aW9uIGxldmVsIGF1dGhvcml6ZWQgKi8KKyNkZWZpbmUgT1BKX0oyS19NQVhCQU5EUyAoMypPUEpfSjJLX01BWFJMVkxTLTIpIC8qKjwgTnVtYmVyIG9mIG1heGltdW0gc3ViLWJhbmQgbGlua2VkIHRvIG51bWJlciBvZiByZXNvbHV0aW9uIGxldmVsICovCiAKLSNkZWZpbmUgT1BKX0oyS19ERUZBVUxUX05CX1NFR1MJCQkJMTAKLSNkZWZpbmUgT1BKX0oyS19TVFJFQU1fQ0hVTktfU0laRQkJCTB4MTAwMDAwIC8qKiAxIG1lZ2EgYnkgZGVmYXVsdCAqLwotI2RlZmluZSBPUEpfSjJLX0RFRkFVTFRfSEVBREVSX1NJWkUJCQkxMDAwCi0jZGVmaW5lIE9QSl9KMktfTUNDX0RFRkFVTFRfTkJfUkVDT1JEUwkJMTAKLSNkZWZpbmUgT1BKX0oyS19NQ1RfREVGQVVMVF9OQl9SRUNPUkRTCQkxMAorI2RlZmluZSBPUEpfSjJLX0RFRkFVTFRfTkJfU0VHUyAgICAgICAgICAgICAxMAorI2RlZmluZSBPUEpfSjJLX1NUUkVBTV9DSFVOS19TSVpFICAgICAgICAgICAweDEwMDAwMCAvKiogMSBtZWdhIGJ5IGRlZmF1bHQgKi8KKyNkZWZpbmUgT1BKX0oyS19ERUZBVUxUX0hFQURFUl9TSVpFICAgICAgICAgMTAwMAorI2RlZmluZSBPUEpfSjJLX01DQ19ERUZBVUxUX05CX1JFQ09SRFMgICAgICAxMAorI2RlZmluZSBPUEpfSjJLX01DVF9ERUZBVUxUX05CX1JFQ09SRFMgICAgICAxMAogCiAvKiBVbmlQRz4+ICovIC8qIE5PVCBZRVQgVVNFRCBJTiBUSEUgVjIgVkVSU0lPTiBPRiBPUEVOSlBFRyAqLwotI2RlZmluZSBKUFdMX01BWF9OT19USUxFU1BFQ1MJMTYgLyoqPCBNYXhpbXVtIG51bWJlciBvZiB0aWxlIHBhcnRzIGV4cGVjdGVkIGJ5IEpQV0w6IGluY3JlYXNlIGF0IHlvdXIgd2lsbCAqLwotI2RlZmluZSBKUFdMX01BWF9OT19QQUNLU1BFQ1MJMTYgLyoqPCBNYXhpbXVtIG51bWJlciBvZiBwYWNrZXQgcGFydHMgZXhwZWN0ZWQgYnkgSlBXTDogaW5jcmVhc2UgYXQgeW91ciB3aWxsICovCi0jZGVmaW5lIEpQV0xfTUFYX05PX01BUktFUlMJNTEyIC8qKjwgTWF4aW11bSBudW1iZXIgb2YgSlBXTCBtYXJrZXJzOiBpbmNyZWFzZSBhdCB5b3VyIHdpbGwgKi8KKyNkZWZpbmUgSlBXTF9NQVhfTk9fVElMRVNQRUNTICAgMTYgLyoqPCBNYXhpbXVtIG51bWJlciBvZiB0aWxlIHBhcnRzIGV4cGVjdGVkIGJ5IEpQV0w6IGluY3JlYXNlIGF0IHlvdXIgd2lsbCAqLworI2RlZmluZSBKUFdMX01BWF9OT19QQUNLU1BFQ1MgICAxNiAvKio8IE1heGltdW0gbnVtYmVyIG9mIHBhY2tldCBwYXJ0cyBleHBlY3RlZCBieSBKUFdMOiBpbmNyZWFzZSBhdCB5b3VyIHdpbGwgKi8KKyNkZWZpbmUgSlBXTF9NQVhfTk9fTUFSS0VSUyA1MTIgLyoqPCBNYXhpbXVtIG51bWJlciBvZiBKUFdMIG1hcmtlcnM6IGluY3JlYXNlIGF0IHlvdXIgd2lsbCAqLwogI2RlZmluZSBKUFdMX1BSSVZBVEVJTkRFWF9OQU1FICJqcHdsX2luZGV4X3ByaXZhdGVmaWxlbmFtZSIgLyoqPCBpbmRleCBmaWxlIG5hbWUgdXNlZCB3aGVuIEpQV0wgaXMgb24gKi8KICNkZWZpbmUgSlBXTF9FWFBFQ1RFRF9DT01QT05FTlRTIDMgLyoqPCBFeHBlY3QgdGhpcyBudW1iZXIgb2YgY29tcG9uZW50cywgc28geW91J2xsIGZpbmQgYmV0dGVyIHRoZSBmaXJzdCBFUEIgKi8KICNkZWZpbmUgSlBXTF9NQVhJTVVNX1RJTEVTIDgxOTIgLyoqPCBFeHBlY3QgdGhpcyBtYXhpbXVtIG51bWJlciBvZiB0aWxlcywgdG8gYXZvaWQgc29tZSBjcmFzaGVzICovCkBAIC0xNjcsMTkgKzE2NywxOSBAQAogICogRVhQRVJJTUVOVEFMIEZPUiBUSEUgTU9NRU5UCiAgKiBTdXBwb3J0ZWQgb3B0aW9ucyBhYm91dCBmaWxlIGluZm9ybWF0aW9uIHVzZWQgb25seSBpbiBqMmtfZHVtcAogKi8KLSNkZWZpbmUgT1BKX0lNR19JTkZPCQkxCS8qKjwgQmFzaWMgaW1hZ2UgaW5mb3JtYXRpb24gcHJvdmlkZWQgdG8gdGhlIHVzZXIgKi8KLSNkZWZpbmUgT1BKX0oyS19NSF9JTkZPCQkyCS8qKjwgQ29kZXN0cmVhbSBpbmZvcm1hdGlvbiBiYXNlZCBvbmx5IG9uIHRoZSBtYWluIGhlYWRlciAqLwotI2RlZmluZSBPUEpfSjJLX1RIX0lORk8JCTQJLyoqPCBUaWxlIGluZm9ybWF0aW9uIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRpbGUgaGVhZGVyICovCi0jZGVmaW5lIE9QSl9KMktfVENIX0lORk8JOAkvKio8IFRpbGUvQ29tcG9uZW50IGluZm9ybWF0aW9uIG9mIGFsbCB0aWxlcyAqLwotI2RlZmluZSBPUEpfSjJLX01IX0lORAkJMTYJLyoqPCBDb2Rlc3RyZWFtIGluZGV4IGJhc2VkIG9ubHkgb24gdGhlIG1haW4gaGVhZGVyICovCi0jZGVmaW5lIE9QSl9KMktfVEhfSU5ECQkzMgkvKio8IFRpbGUgaW5kZXggYmFzZWQgb24gdGhlIGN1cnJlbnQgdGlsZSAqLwotLypGSVhNRSAjZGVmaW5lIE9QSl9KMktfQ1NUUl9JTkQJNDgqLwkvKio8ICAqLwotI2RlZmluZSBPUEpfSlAyX0lORk8JCTEyOAkvKio8IEpQMiBmaWxlIGluZm9ybWF0aW9uICovCi0jZGVmaW5lIE9QSl9KUDJfSU5ECQkJMjU2CS8qKjwgSlAyIGZpbGUgaW5kZXggKi8KKyNkZWZpbmUgT1BKX0lNR19JTkZPICAgICAgICAxICAgLyoqPCBCYXNpYyBpbWFnZSBpbmZvcm1hdGlvbiBwcm92aWRlZCB0byB0aGUgdXNlciAqLworI2RlZmluZSBPUEpfSjJLX01IX0lORk8gICAgIDIgICAvKio8IENvZGVzdHJlYW0gaW5mb3JtYXRpb24gYmFzZWQgb25seSBvbiB0aGUgbWFpbiBoZWFkZXIgKi8KKyNkZWZpbmUgT1BKX0oyS19USF9JTkZPICAgICA0ICAgLyoqPCBUaWxlIGluZm9ybWF0aW9uIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRpbGUgaGVhZGVyICovCisjZGVmaW5lIE9QSl9KMktfVENIX0lORk8gICAgOCAgIC8qKjwgVGlsZS9Db21wb25lbnQgaW5mb3JtYXRpb24gb2YgYWxsIHRpbGVzICovCisjZGVmaW5lIE9QSl9KMktfTUhfSU5EICAgICAgMTYgIC8qKjwgQ29kZXN0cmVhbSBpbmRleCBiYXNlZCBvbmx5IG9uIHRoZSBtYWluIGhlYWRlciAqLworI2RlZmluZSBPUEpfSjJLX1RIX0lORCAgICAgIDMyICAvKio8IFRpbGUgaW5kZXggYmFzZWQgb24gdGhlIGN1cnJlbnQgdGlsZSAqLworLypGSVhNRSAjZGVmaW5lIE9QSl9KMktfQ1NUUl9JTkQgICAgNDgqLyAgICAvKio8ICAqLworI2RlZmluZSBPUEpfSlAyX0lORk8gICAgICAgIDEyOCAvKio8IEpQMiBmaWxlIGluZm9ybWF0aW9uICovCisjZGVmaW5lIE9QSl9KUDJfSU5EICAgICAgICAgMjU2IC8qKjwgSlAyIGZpbGUgaW5kZXggKi8KIAogLyoqCiAgKiBKUEVHIDIwMDAgUHJvZmlsZXMsIHNlZSBUYWJsZSBBLjEwIGZyb20gMTU0NDQtMSAodXBkYXRlZCBpbiB2YXJpb3VzIEFNRCkKLSAqIFRoZXNlIHZhbHVlcyBoZWxwIGNob3NpbmcgdGhlIFJTSVogdmFsdWUgZm9yIHRoZSBKMksgY29kZXN0cmVhbS4KKyAqIFRoZXNlIHZhbHVlcyBoZWxwIGNob29zaW5nIHRoZSBSU0laIHZhbHVlIGZvciB0aGUgSjJLIGNvZGVzdHJlYW0uCiAgKiBUaGUgUlNJWiB2YWx1ZSB0cmlnZ2VycyB2YXJpb3VzIGVuY29kaW5nIG9wdGlvbnMsIGFzIGRldGFpbGVkIGluIFRhYmxlIEEuMTAuCiAgKiBJZiBPUEpfUFJPRklMRV9QQVJUMiBpcyBjaG9zZW4sIGl0IGhhcyB0byBiZSBjb21iaW5lZCB3aXRoIG9uZSBvciBtb3JlIGV4dGVuc2lvbnMKICAqIGRlc2NyaWJlZCBoZXJldW5kZXIuCkBAIC0yMjgsMTIgKzIyOCwxMiBAQAogLyoqCiAgKiBKUEVHIDIwMDAgY29kZXN0cmVhbSBhbmQgY29tcG9uZW50IHNpemUgbGltaXRzIGluIGNpbmVtYSBwcm9maWxlcwogICogKi8KLSNkZWZpbmUgT1BKX0NJTkVNQV8yNF9DUyAgICAgMTMwMjA4MyAgIAkvKiogTWF4aW11bSBjb2Rlc3RyZWFtIGxlbmd0aCBmb3IgMjRmcHMgKi8KKyNkZWZpbmUgT1BKX0NJTkVNQV8yNF9DUyAgICAgMTMwMjA4MyAgICAvKiogTWF4aW11bSBjb2Rlc3RyZWFtIGxlbmd0aCBmb3IgMjRmcHMgKi8KICNkZWZpbmUgT1BKX0NJTkVNQV80OF9DUyAgICAgNjUxMDQxICAgICAvKiogTWF4aW11bSBjb2Rlc3RyZWFtIGxlbmd0aCBmb3IgNDhmcHMgKi8KICNkZWZpbmUgT1BKX0NJTkVNQV8yNF9DT01QICAgMTA0MTY2NiAgICAvKiogTWF4aW11bSBzaXplIHBlciBjb2xvciBjb21wb25lbnQgZm9yIDJLICYgNEsgQCAyNGZwcyAqLwotI2RlZmluZSBPUEpfQ0lORU1BXzQ4X0NPTVAgICA1MjA4MzMJCS8qKiBNYXhpbXVtIHNpemUgcGVyIGNvbG9yIGNvbXBvbmVudCBmb3IgMksgQCA0OGZwcyAqLworI2RlZmluZSBPUEpfQ0lORU1BXzQ4X0NPTVAgICA1MjA4MzMgICAgIC8qKiBNYXhpbXVtIHNpemUgcGVyIGNvbG9yIGNvbXBvbmVudCBmb3IgMksgQCA0OGZwcyAqLwogCi0vKiAKKy8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBlbnVtIGRlZmluaXRpb25zCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0yNDQsOSArMjQ0LDkgQEAKICAqIFJzaXogQ2FwYWJpbGl0aWVzCiAgKiAqLwogdHlwZWRlZiBlbnVtIFJTSVpfQ0FQQUJJTElUSUVTIHsKLSAgICBPUEpfU1REX1JTSVogPSAwLAkJLyoqIFN0YW5kYXJkIEpQRUcyMDAwIHByb2ZpbGUqLwotICAgIE9QSl9DSU5FTUEySyA9IDMsCQkvKiogUHJvZmlsZSBuYW1lIGZvciBhIDJLIGltYWdlKi8KLSAgICBPUEpfQ0lORU1BNEsgPSA0LAkJLyoqIFByb2ZpbGUgbmFtZSBmb3IgYSA0SyBpbWFnZSovCisgICAgT1BKX1NURF9SU0laID0gMCwgICAgICAgLyoqIFN0YW5kYXJkIEpQRUcyMDAwIHByb2ZpbGUqLworICAgIE9QSl9DSU5FTUEySyA9IDMsICAgICAgIC8qKiBQcm9maWxlIG5hbWUgZm9yIGEgMksgaW1hZ2UqLworICAgIE9QSl9DSU5FTUE0SyA9IDQsICAgICAgIC8qKiBQcm9maWxlIG5hbWUgZm9yIGEgNEsgaW1hZ2UqLwogICAgIE9QSl9NQ1QgPSAweDgxMDAKIH0gT1BKX1JTSVpfQ0FQQUJJTElUSUVTOwogCkBAIC0yNTUsMzMgKzI1NSwzMyBAQAogICogRGlnaXRhbCBjaW5lbWEgb3BlcmF0aW9uIG1vZGUKICAqICovCiB0eXBlZGVmIGVudW0gQ0lORU1BX01PREUgewotICAgIE9QSl9PRkYgPSAwLAkJCS8qKiBOb3QgRGlnaXRhbCBDaW5lbWEqLwotICAgIE9QSl9DSU5FTUEyS18yNCA9IDEsCS8qKiAySyBEaWdpdGFsIENpbmVtYSBhdCAyNCBmcHMqLwotICAgIE9QSl9DSU5FTUEyS180OCA9IDIsCS8qKiAySyBEaWdpdGFsIENpbmVtYSBhdCA0OCBmcHMqLwotICAgIE9QSl9DSU5FTUE0S18yNCA9IDMJCS8qKiA0SyBEaWdpdGFsIENpbmVtYSBhdCAyNCBmcHMqLwotfU9QSl9DSU5FTUFfTU9ERTsKKyAgICBPUEpfT0ZGID0gMCwgICAgICAgICAgICAvKiogTm90IERpZ2l0YWwgQ2luZW1hKi8KKyAgICBPUEpfQ0lORU1BMktfMjQgPSAxLCAgICAvKiogMksgRGlnaXRhbCBDaW5lbWEgYXQgMjQgZnBzKi8KKyAgICBPUEpfQ0lORU1BMktfNDggPSAyLCAgICAvKiogMksgRGlnaXRhbCBDaW5lbWEgYXQgNDggZnBzKi8KKyAgICBPUEpfQ0lORU1BNEtfMjQgPSAzICAgICAvKiogNEsgRGlnaXRhbCBDaW5lbWEgYXQgMjQgZnBzKi8KK30gT1BKX0NJTkVNQV9NT0RFOwogCi0vKiogCisvKioKICAqIFByb2dyZXNzaW9uIG9yZGVyCiAgKiAqLwogdHlwZWRlZiBlbnVtIFBST0dfT1JERVIgewotCU9QSl9QUk9HX1VOS05PV04gPSAtMSwJLyoqPCBwbGFjZS1ob2xkZXIgKi8KLQlPUEpfTFJDUCA9IDAsCQkJLyoqPCBsYXllci1yZXNvbHV0aW9uLWNvbXBvbmVudC1wcmVjaW5jdCBvcmRlciAqLwotCU9QSl9STENQID0gMSwJCQkvKio8IHJlc29sdXRpb24tbGF5ZXItY29tcG9uZW50LXByZWNpbmN0IG9yZGVyICovCi0JT1BKX1JQQ0wgPSAyLAkJCS8qKjwgcmVzb2x1dGlvbi1wcmVjaW5jdC1jb21wb25lbnQtbGF5ZXIgb3JkZXIgKi8KLQlPUEpfUENSTCA9IDMsCQkJLyoqPCBwcmVjaW5jdC1jb21wb25lbnQtcmVzb2x1dGlvbi1sYXllciBvcmRlciAqLwotCU9QSl9DUFJMID0gNAkJCS8qKjwgY29tcG9uZW50LXByZWNpbmN0LXJlc29sdXRpb24tbGF5ZXIgb3JkZXIgKi8KKyAgICBPUEpfUFJPR19VTktOT1dOID0gLTEsICAvKio8IHBsYWNlLWhvbGRlciAqLworICAgIE9QSl9MUkNQID0gMCwgICAgICAgICAgIC8qKjwgbGF5ZXItcmVzb2x1dGlvbi1jb21wb25lbnQtcHJlY2luY3Qgb3JkZXIgKi8KKyAgICBPUEpfUkxDUCA9IDEsICAgICAgICAgICAvKio8IHJlc29sdXRpb24tbGF5ZXItY29tcG9uZW50LXByZWNpbmN0IG9yZGVyICovCisgICAgT1BKX1JQQ0wgPSAyLCAgICAgICAgICAgLyoqPCByZXNvbHV0aW9uLXByZWNpbmN0LWNvbXBvbmVudC1sYXllciBvcmRlciAqLworICAgIE9QSl9QQ1JMID0gMywgICAgICAgICAgIC8qKjwgcHJlY2luY3QtY29tcG9uZW50LXJlc29sdXRpb24tbGF5ZXIgb3JkZXIgKi8KKyAgICBPUEpfQ1BSTCA9IDQgICAgICAgICAgICAvKio8IGNvbXBvbmVudC1wcmVjaW5jdC1yZXNvbHV0aW9uLWxheWVyIG9yZGVyICovCiB9IE9QSl9QUk9HX09SREVSOwogCiAvKioKICAqIFN1cHBvcnRlZCBpbWFnZSBjb2xvciBzcGFjZXMKICovCiB0eXBlZGVmIGVudW0gQ09MT1JfU1BBQ0UgewotICAgIE9QSl9DTFJTUENfVU5LTk9XTiA9IC0xLAkvKio8IG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGxpYnJhcnkgKi8KLSAgICBPUEpfQ0xSU1BDX1VOU1BFQ0lGSUVEID0gMCwJLyoqPCBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb2Rlc3RyZWFtICovCi0gICAgT1BKX0NMUlNQQ19TUkdCID0gMSwJCS8qKjwgc1JHQiAqLwotICAgIE9QSl9DTFJTUENfR1JBWSA9IDIsCQkvKio8IGdyYXlzY2FsZSAqLwotICAgIE9QSl9DTFJTUENfU1lDQyA9IDMsCQkvKio8IFlVViAqLworICAgIE9QSl9DTFJTUENfVU5LTk9XTiA9IC0xLCAgICAvKio8IG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGxpYnJhcnkgKi8KKyAgICBPUEpfQ0xSU1BDX1VOU1BFQ0lGSUVEID0gMCwgLyoqPCBub3Qgc3BlY2lmaWVkIGluIHRoZSBjb2Rlc3RyZWFtICovCisgICAgT1BKX0NMUlNQQ19TUkdCID0gMSwgICAgICAgIC8qKjwgc1JHQiAqLworICAgIE9QSl9DTFJTUENfR1JBWSA9IDIsICAgICAgICAvKio8IGdyYXlzY2FsZSAqLworICAgIE9QSl9DTFJTUENfU1lDQyA9IDMsICAgICAgICAvKio8IFlVViAqLwogICAgIE9QSl9DTFJTUENfRVlDQyA9IDQsICAgICAgICAvKio8IGUtWUNDICovCiAgICAgT1BKX0NMUlNQQ19DTVlLID0gNSAgICAgICAgIC8qKjwgQ01ZSyAqLwogfSBPUEpfQ09MT1JfU1BBQ0U7CkBAIC0yOTAsMTYgKzI5MCwxNiBAQAogICogU3VwcG9ydGVkIGNvZGVjCiAqLwogdHlwZWRlZiBlbnVtIENPREVDX0ZPUk1BVCB7Ci0JT1BKX0NPREVDX1VOS05PV04gPSAtMSwJLyoqPCBwbGFjZS1ob2xkZXIgKi8KLQlPUEpfQ09ERUNfSjJLICA9IDAsCQkvKio8IEpQRUctMjAwMCBjb2Rlc3RyZWFtIDogcmVhZC93cml0ZSAqLwotCU9QSl9DT0RFQ19KUFQgID0gMSwJCS8qKjwgSlBULXN0cmVhbSAoSlBFRyAyMDAwLCBKUElQKSA6IHJlYWQgb25seSAqLwotICAgIE9QSl9DT0RFQ19KUDIgID0gMiwJCS8qKjwgSlAyIGZpbGUgZm9ybWF0IDogcmVhZC93cml0ZSAqLwotICAgIE9QSl9DT0RFQ19KUFAgID0gMywJCS8qKjwgSlBQLXN0cmVhbSAoSlBFRyAyMDAwLCBKUElQKSA6IHRvIGJlIGNvZGVkICovCi0gICAgT1BKX0NPREVDX0pQWCAgPSA0CQkvKio8IEpQWCBmaWxlIGZvcm1hdCAoSlBFRyAyMDAwIFBhcnQtMikgOiB0byBiZSBjb2RlZCAqLworICAgIE9QSl9DT0RFQ19VTktOT1dOID0gLTEsIC8qKjwgcGxhY2UtaG9sZGVyICovCisgICAgT1BKX0NPREVDX0oySyAgPSAwLCAgICAgLyoqPCBKUEVHLTIwMDAgY29kZXN0cmVhbSA6IHJlYWQvd3JpdGUgKi8KKyAgICBPUEpfQ09ERUNfSlBUICA9IDEsICAgICAvKio8IEpQVC1zdHJlYW0gKEpQRUcgMjAwMCwgSlBJUCkgOiByZWFkIG9ubHkgKi8KKyAgICBPUEpfQ09ERUNfSlAyICA9IDIsICAgICAvKio8IEpQMiBmaWxlIGZvcm1hdCA6IHJlYWQvd3JpdGUgKi8KKyAgICBPUEpfQ09ERUNfSlBQICA9IDMsICAgICAvKio8IEpQUC1zdHJlYW0gKEpQRUcgMjAwMCwgSlBJUCkgOiB0byBiZSBjb2RlZCAqLworICAgIE9QSl9DT0RFQ19KUFggID0gNCAgICAgIC8qKjwgSlBYIGZpbGUgZm9ybWF0IChKUEVHIDIwMDAgUGFydC0yKSA6IHRvIGJlIGNvZGVkICovCiB9IE9QSl9DT0RFQ19GT1JNQVQ7CiAKIAotLyogCisvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgZXZlbnQgbWFuYWdlciB0eXBlZGVmIGRlZmluaXRpb25zCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0zMDgsMTEgKzMwOCwxMSBAQAogLyoqCiAgKiBDYWxsYmFjayBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIGV2ZW50cwogICogQHBhcmFtIG1zZyAgICAgICAgICAgICAgIEV2ZW50IG1lc3NhZ2UKLSAqIEBwYXJhbSBjbGllbnRfZGF0YSAgICAgICBDbGllbnQgb2JqZWN0IHdoZXJlIHdpbGwgYmUgcmV0dXJuIHRoZSBldmVudCBtZXNzYWdlIAorICogQHBhcmFtIGNsaWVudF9kYXRhICAgICAgIENsaWVudCBvYmplY3Qgd2hlcmUgd2lsbCBiZSByZXR1cm4gdGhlIGV2ZW50IG1lc3NhZ2UKICAqICovCi10eXBlZGVmIHZvaWQgKCpvcGpfbXNnX2NhbGxiYWNrKSAoY29uc3QgY2hhciAqbXNnLCB2b2lkICpjbGllbnRfZGF0YSk7Cit0eXBlZGVmIHZvaWQgKCpvcGpfbXNnX2NhbGxiYWNrKShjb25zdCBjaGFyICptc2csIHZvaWQgKmNsaWVudF9kYXRhKTsKIAotLyogCisvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgY29kZWMgdHlwZWRlZiBkZWZpbml0aW9ucwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMzIwLDE0NyArMzIwLDE1MCBAQAogCiAvKioKICAqIFByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZXMKLSAqIAorICoKICAqLwogdHlwZWRlZiBzdHJ1Y3Qgb3BqX3BvYyB7Ci0JLyoqIFJlc29sdXRpb24gbnVtIHN0YXJ0LCBDb21wb25lbnQgbnVtIHN0YXJ0LCBnaXZlbiBieSBQT0MgKi8KLQlPUEpfVUlOVDMyIHJlc25vMCwgY29tcG5vMDsKLQkvKiogTGF5ZXIgbnVtIGVuZCxSZXNvbHV0aW9uIG51bSBlbmQsIENvbXBvbmVudCBudW0gZW5kLCBnaXZlbiBieSBQT0MgKi8KLQlPUEpfVUlOVDMyIGxheW5vMSwgcmVzbm8xLCBjb21wbm8xOwotCS8qKiBMYXllciBudW0gc3RhcnQsUHJlY2luY3QgbnVtIHN0YXJ0LCBQcmVjaW5jdCBudW0gZW5kICovCi0JT1BKX1VJTlQzMiBsYXlubzAsIHByZWNubzAsIHByZWNubzE7Ci0JLyoqIFByb2dyZXNzaW9uIG9yZGVyIGVudW0qLwotCU9QSl9QUk9HX09SREVSIHByZzEscHJnOwotCS8qKiBQcm9ncmVzc2lvbiBvcmRlciBzdHJpbmcqLwotCU9QSl9DSEFSIHByb2dvcmRlcls1XTsKLQkvKiogVGlsZSBudW1iZXIgKi8KLQlPUEpfVUlOVDMyIHRpbGU7Ci0JLyoqIFN0YXJ0IGFuZCBlbmQgdmFsdWVzIGZvciBUaWxlIHdpZHRoIGFuZCBoZWlnaHQqLwotCU9QSl9JTlQzMiB0eDAsdHgxLHR5MCx0eTE7Ci0JLyoqIFN0YXJ0IHZhbHVlLCBpbml0aWFsaXNlZCBpbiBwaV9pbml0aWFsaXNlX2VuY29kZSovCi0JT1BKX1VJTlQzMiBsYXlTLCByZXNTLCBjb21wUywgcHJjUzsKLQkvKiogRW5kIHZhbHVlLCBpbml0aWFsaXNlZCBpbiBwaV9pbml0aWFsaXNlX2VuY29kZSAqLwotCU9QSl9VSU5UMzIgbGF5RSwgcmVzRSwgY29tcEUsIHByY0U7Ci0JLyoqIFN0YXJ0IGFuZCBlbmQgdmFsdWVzIG9mIFRpbGUgd2lkdGggYW5kIGhlaWdodCwgaW5pdGlhbGlzZWQgaW4gcGlfaW5pdGlhbGlzZV9lbmNvZGUqLwotCU9QSl9VSU5UMzIgdHhTLHR4RSx0eVMsdHlFLGR4LGR5OwotCS8qKiBUZW1wb3JhcnkgdmFsdWVzIGZvciBUaWxlIHBhcnRzLCBpbml0aWFsaXNlZCBpbiBwaV9jcmVhdGVfZW5jb2RlICovCi0JT1BKX1VJTlQzMiBsYXlfdCwgcmVzX3QsIGNvbXBfdCwgcHJjX3QsdHgwX3QsdHkwX3Q7CisgICAgLyoqIFJlc29sdXRpb24gbnVtIHN0YXJ0LCBDb21wb25lbnQgbnVtIHN0YXJ0LCBnaXZlbiBieSBQT0MgKi8KKyAgICBPUEpfVUlOVDMyIHJlc25vMCwgY29tcG5vMDsKKyAgICAvKiogTGF5ZXIgbnVtIGVuZCxSZXNvbHV0aW9uIG51bSBlbmQsIENvbXBvbmVudCBudW0gZW5kLCBnaXZlbiBieSBQT0MgKi8KKyAgICBPUEpfVUlOVDMyIGxheW5vMSwgcmVzbm8xLCBjb21wbm8xOworICAgIC8qKiBMYXllciBudW0gc3RhcnQsUHJlY2luY3QgbnVtIHN0YXJ0LCBQcmVjaW5jdCBudW0gZW5kICovCisgICAgT1BKX1VJTlQzMiBsYXlubzAsIHByZWNubzAsIHByZWNubzE7CisgICAgLyoqIFByb2dyZXNzaW9uIG9yZGVyIGVudW0qLworICAgIE9QSl9QUk9HX09SREVSIHByZzEsIHByZzsKKyAgICAvKiogUHJvZ3Jlc3Npb24gb3JkZXIgc3RyaW5nKi8KKyAgICBPUEpfQ0hBUiBwcm9nb3JkZXJbNV07CisgICAgLyoqIFRpbGUgbnVtYmVyICovCisgICAgT1BKX1VJTlQzMiB0aWxlOworICAgIC8qKiBTdGFydCBhbmQgZW5kIHZhbHVlcyBmb3IgVGlsZSB3aWR0aCBhbmQgaGVpZ2h0Ki8KKyAgICBPUEpfSU5UMzIgdHgwLCB0eDEsIHR5MCwgdHkxOworICAgIC8qKiBTdGFydCB2YWx1ZSwgaW5pdGlhbGlzZWQgaW4gcGlfaW5pdGlhbGlzZV9lbmNvZGUqLworICAgIE9QSl9VSU5UMzIgbGF5UywgcmVzUywgY29tcFMsIHByY1M7CisgICAgLyoqIEVuZCB2YWx1ZSwgaW5pdGlhbGlzZWQgaW4gcGlfaW5pdGlhbGlzZV9lbmNvZGUgKi8KKyAgICBPUEpfVUlOVDMyIGxheUUsIHJlc0UsIGNvbXBFLCBwcmNFOworICAgIC8qKiBTdGFydCBhbmQgZW5kIHZhbHVlcyBvZiBUaWxlIHdpZHRoIGFuZCBoZWlnaHQsIGluaXRpYWxpc2VkIGluIHBpX2luaXRpYWxpc2VfZW5jb2RlKi8KKyAgICBPUEpfVUlOVDMyIHR4UywgdHhFLCB0eVMsIHR5RSwgZHgsIGR5OworICAgIC8qKiBUZW1wb3JhcnkgdmFsdWVzIGZvciBUaWxlIHBhcnRzLCBpbml0aWFsaXNlZCBpbiBwaV9jcmVhdGVfZW5jb2RlICovCisgICAgT1BKX1VJTlQzMiBsYXlfdCwgcmVzX3QsIGNvbXBfdCwgcHJjX3QsIHR4MF90LCB0eTBfdDsKIH0gb3BqX3BvY190OwogCiAvKioKICAqIENvbXByZXNzaW9uIHBhcmFtZXRlcnMKICAqICovCiB0eXBlZGVmIHN0cnVjdCBvcGpfY3BhcmFtZXRlcnMgewotCS8qKiBzaXplIG9mIHRpbGU6IHRpbGVfc2l6ZV9vbiA9IGZhbHNlIChub3QgaW4gYXJndW1lbnQpIG9yID0gdHJ1ZSAoaW4gYXJndW1lbnQpICovCi0JT1BKX0JPT0wgdGlsZV9zaXplX29uOwotCS8qKiBYVE9zaXogKi8KLQlpbnQgY3BfdHgwOwotCS8qKiBZVE9zaXogKi8KLQlpbnQgY3BfdHkwOwotCS8qKiBYVHNpeiAqLwotCWludCBjcF90ZHg7Ci0JLyoqIFlUc2l6ICovCi0JaW50IGNwX3RkeTsKLQkvKiogYWxsb2NhdGlvbiBieSByYXRlL2Rpc3RvcnRpb24gKi8KLQlpbnQgY3BfZGlzdG9fYWxsb2M7Ci0JLyoqIGFsbG9jYXRpb24gYnkgZml4ZWQgbGF5ZXIgKi8KLQlpbnQgY3BfZml4ZWRfYWxsb2M7Ci0JLyoqIGFkZCBmaXhlZF9xdWFsaXR5ICovCi0JaW50IGNwX2ZpeGVkX3F1YWxpdHk7Ci0JLyoqIGZpeGVkIGxheWVyICovCi0JaW50ICpjcF9tYXRyaWNlOwotCS8qKiBjb21tZW50IGZvciBjb2RpbmcgKi8KLQljaGFyICpjcF9jb21tZW50OwotCS8qKiBjc3R5IDogY29kaW5nIHN0eWxlICovCi0JaW50IGNzdHk7Ci0JLyoqIHByb2dyZXNzaW9uIG9yZGVyIChkZWZhdWx0IE9QSl9MUkNQKSAqLwotCU9QSl9QUk9HX09SREVSIHByb2dfb3JkZXI7Ci0JLyoqIHByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZXMgKi8KLQlvcGpfcG9jX3QgUE9DWzMyXTsKLQkvKiogbnVtYmVyIG9mIHByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZXMgKFBPQyksIGRlZmF1bHQgdG8gMCAqLwotCU9QSl9VSU5UMzIgbnVtcG9jczsKLQkvKiogbnVtYmVyIG9mIGxheWVycyAqLwotCWludCB0Y3BfbnVtbGF5ZXJzOwotICAgIC8qKiByYXRlcyBvZiBsYXllcnMgLSBtaWdodCBiZSBzdWJzZXF1ZW50bHkgbGltaXRlZCBieSB0aGUgbWF4X2NzX3NpemUgZmllbGQgKi8KLQlmbG9hdCB0Y3BfcmF0ZXNbMTAwXTsKLQkvKiogZGlmZmVyZW50IHBzbnIgZm9yIHN1Y2Nlc3NpdmUgbGF5ZXJzICovCi0JZmxvYXQgdGNwX2Rpc3RvcmF0aW9bMTAwXTsKLQkvKiogbnVtYmVyIG9mIHJlc29sdXRpb25zICovCi0JaW50IG51bXJlc29sdXRpb247Ci0JLyoqIGluaXRpYWwgY29kZSBibG9jayB3aWR0aCwgZGVmYXVsdCB0byA2NCAqLwotIAlpbnQgY2Jsb2Nrd19pbml0OwotCS8qKiBpbml0aWFsIGNvZGUgYmxvY2sgaGVpZ2h0LCBkZWZhdWx0IHRvIDY0ICovCi0JaW50IGNibG9ja2hfaW5pdDsKLQkvKiogbW9kZSBzd2l0Y2ggKGNibGtfc3R5bGUpICovCi0JaW50IG1vZGU7Ci0JLyoqIDEgOiB1c2UgdGhlIGlycmV2ZXJzaWJsZSBEV1QgOS03LCAwIDogdXNlIGxvc3NsZXNzIGNvbXByZXNzaW9uIChkZWZhdWx0KSAqLwotCWludCBpcnJldmVyc2libGU7Ci0JLyoqIHJlZ2lvbiBvZiBpbnRlcmVzdDogYWZmZWN0ZWQgY29tcG9uZW50IGluIFswLi4zXSwgLTEgbWVhbnMgbm8gUk9JICovCi0JaW50IHJvaV9jb21wbm87Ci0JLyoqIHJlZ2lvbiBvZiBpbnRlcmVzdDogdXBzaGlmdCB2YWx1ZSAqLwotCWludCByb2lfc2hpZnQ7Ci0JLyogbnVtYmVyIG9mIHByZWNpbmN0IHNpemUgc3BlY2lmaWNhdGlvbnMgKi8KLQlpbnQgcmVzX3NwZWM7Ci0JLyoqIGluaXRpYWwgcHJlY2luY3Qgd2lkdGggKi8KLQlpbnQgcHJjd19pbml0W09QSl9KMktfTUFYUkxWTFNdOwotCS8qKiBpbml0aWFsIHByZWNpbmN0IGhlaWdodCAqLwotCWludCBwcmNoX2luaXRbT1BKX0oyS19NQVhSTFZMU107CisgICAgLyoqIHNpemUgb2YgdGlsZTogdGlsZV9zaXplX29uID0gZmFsc2UgKG5vdCBpbiBhcmd1bWVudCkgb3IgPSB0cnVlIChpbiBhcmd1bWVudCkgKi8KKyAgICBPUEpfQk9PTCB0aWxlX3NpemVfb247CisgICAgLyoqIFhUT3NpeiAqLworICAgIGludCBjcF90eDA7CisgICAgLyoqIFlUT3NpeiAqLworICAgIGludCBjcF90eTA7CisgICAgLyoqIFhUc2l6ICovCisgICAgaW50IGNwX3RkeDsKKyAgICAvKiogWVRzaXogKi8KKyAgICBpbnQgY3BfdGR5OworICAgIC8qKiBhbGxvY2F0aW9uIGJ5IHJhdGUvZGlzdG9ydGlvbiAqLworICAgIGludCBjcF9kaXN0b19hbGxvYzsKKyAgICAvKiogYWxsb2NhdGlvbiBieSBmaXhlZCBsYXllciAqLworICAgIGludCBjcF9maXhlZF9hbGxvYzsKKyAgICAvKiogYWRkIGZpeGVkX3F1YWxpdHkgKi8KKyAgICBpbnQgY3BfZml4ZWRfcXVhbGl0eTsKKyAgICAvKiogZml4ZWQgbGF5ZXIgKi8KKyAgICBpbnQgKmNwX21hdHJpY2U7CisgICAgLyoqIGNvbW1lbnQgZm9yIGNvZGluZyAqLworICAgIGNoYXIgKmNwX2NvbW1lbnQ7CisgICAgLyoqIGNzdHkgOiBjb2Rpbmcgc3R5bGUgKi8KKyAgICBpbnQgY3N0eTsKKyAgICAvKiogcHJvZ3Jlc3Npb24gb3JkZXIgKGRlZmF1bHQgT1BKX0xSQ1ApICovCisgICAgT1BKX1BST0dfT1JERVIgcHJvZ19vcmRlcjsKKyAgICAvKiogcHJvZ3Jlc3Npb24gb3JkZXIgY2hhbmdlcyAqLworICAgIG9wal9wb2NfdCBQT0NbMzJdOworICAgIC8qKiBudW1iZXIgb2YgcHJvZ3Jlc3Npb24gb3JkZXIgY2hhbmdlcyAoUE9DKSwgZGVmYXVsdCB0byAwICovCisgICAgT1BKX1VJTlQzMiBudW1wb2NzOworICAgIC8qKiBudW1iZXIgb2YgbGF5ZXJzICovCisgICAgaW50IHRjcF9udW1sYXllcnM7CisgICAgLyoqIHJhdGVzIG9mIGxheWVycyAtIG1pZ2h0IGJlIHN1YnNlcXVlbnRseSBsaW1pdGVkIGJ5IHRoZSBtYXhfY3Nfc2l6ZSBmaWVsZC4KKyAgICAgKiBTaG91bGQgYmUgZGVjcmVhc2luZy4gMSBjYW4gYmUKKyAgICAgKiB1c2VkIGFzIGxhc3QgdmFsdWUgdG8gaW5kaWNhdGUgdGhlIGxhc3QgbGF5ZXIgaXMgbG9zc2xlc3MuICovCisgICAgZmxvYXQgdGNwX3JhdGVzWzEwMF07CisgICAgLyoqIGRpZmZlcmVudCBwc25yIGZvciBzdWNjZXNzaXZlIGxheWVycy4gU2hvdWxkIGJlIGluY3JlYXNpbmcuIDAgY2FuIGJlCisgICAgICogdXNlZCBhcyBsYXN0IHZhbHVlIHRvIGluZGljYXRlIHRoZSBsYXN0IGxheWVyIGlzIGxvc3NsZXNzLiAqLworICAgIGZsb2F0IHRjcF9kaXN0b3JhdGlvWzEwMF07CisgICAgLyoqIG51bWJlciBvZiByZXNvbHV0aW9ucyAqLworICAgIGludCBudW1yZXNvbHV0aW9uOworICAgIC8qKiBpbml0aWFsIGNvZGUgYmxvY2sgd2lkdGgsIGRlZmF1bHQgdG8gNjQgKi8KKyAgICBpbnQgY2Jsb2Nrd19pbml0OworICAgIC8qKiBpbml0aWFsIGNvZGUgYmxvY2sgaGVpZ2h0LCBkZWZhdWx0IHRvIDY0ICovCisgICAgaW50IGNibG9ja2hfaW5pdDsKKyAgICAvKiogbW9kZSBzd2l0Y2ggKGNibGtfc3R5bGUpICovCisgICAgaW50IG1vZGU7CisgICAgLyoqIDEgOiB1c2UgdGhlIGlycmV2ZXJzaWJsZSBEV1QgOS03LCAwIDogdXNlIGxvc3NsZXNzIGNvbXByZXNzaW9uIChkZWZhdWx0KSAqLworICAgIGludCBpcnJldmVyc2libGU7CisgICAgLyoqIHJlZ2lvbiBvZiBpbnRlcmVzdDogYWZmZWN0ZWQgY29tcG9uZW50IGluIFswLi4zXSwgLTEgbWVhbnMgbm8gUk9JICovCisgICAgaW50IHJvaV9jb21wbm87CisgICAgLyoqIHJlZ2lvbiBvZiBpbnRlcmVzdDogdXBzaGlmdCB2YWx1ZSAqLworICAgIGludCByb2lfc2hpZnQ7CisgICAgLyogbnVtYmVyIG9mIHByZWNpbmN0IHNpemUgc3BlY2lmaWNhdGlvbnMgKi8KKyAgICBpbnQgcmVzX3NwZWM7CisgICAgLyoqIGluaXRpYWwgcHJlY2luY3Qgd2lkdGggKi8KKyAgICBpbnQgcHJjd19pbml0W09QSl9KMktfTUFYUkxWTFNdOworICAgIC8qKiBpbml0aWFsIHByZWNpbmN0IGhlaWdodCAqLworICAgIGludCBwcmNoX2luaXRbT1BKX0oyS19NQVhSTFZMU107CiAKLQkvKipAbmFtZSBjb21tYW5kIGxpbmUgZW5jb2RlciBwYXJhbWV0ZXJzIChub3QgdXNlZCBpbnNpZGUgdGhlIGxpYnJhcnkpICovCi0JLypAeyovCi0JLyoqIGlucHV0IGZpbGUgbmFtZSAqLwotCWNoYXIgaW5maWxlW09QSl9QQVRIX0xFTl07Ci0JLyoqIG91dHB1dCBmaWxlIG5hbWUgKi8KLQljaGFyIG91dGZpbGVbT1BKX1BBVEhfTEVOXTsKLQkvKiogREVQUkVDQVRFRC4gSW5kZXggZ2VuZXJhdGlvbiBpcyBub3cgaGFuZGVsZCB3aXRoIHRoZSBvcGpfZW5jb2RlX3dpdGhfaW5mbygpIGZ1bmN0aW9uLiBTZXQgdG8gTlVMTCAqLwotCWludCBpbmRleF9vbjsKLQkvKiogREVQUkVDQVRFRC4gSW5kZXggZ2VuZXJhdGlvbiBpcyBub3cgaGFuZGVsZCB3aXRoIHRoZSBvcGpfZW5jb2RlX3dpdGhfaW5mbygpIGZ1bmN0aW9uLiBTZXQgdG8gTlVMTCAqLwotCWNoYXIgaW5kZXhbT1BKX1BBVEhfTEVOXTsKLQkvKiogc3ViaW1hZ2UgZW5jb2Rpbmc6IG9yaWdpbiBpbWFnZSBvZmZzZXQgaW4geCBkaXJlY3Rpb24gKi8KLQlpbnQgaW1hZ2Vfb2Zmc2V0X3gwOwotCS8qKiBzdWJpbWFnZSBlbmNvZGluZzogb3JpZ2luIGltYWdlIG9mZnNldCBpbiB5IGRpcmVjdGlvbiAqLwotCWludCBpbWFnZV9vZmZzZXRfeTA7Ci0JLyoqIHN1YnNhbXBsaW5nIHZhbHVlIGZvciBkeCAqLwotCWludCBzdWJzYW1wbGluZ19keDsKLQkvKiogc3Vic2FtcGxpbmcgdmFsdWUgZm9yIGR5ICovCi0JaW50IHN1YnNhbXBsaW5nX2R5OwotCS8qKiBpbnB1dCBmaWxlIGZvcm1hdCAwOiBQR1gsIDE6IFB4TSwgMjogQk1QIDM6VElGKi8KLQlpbnQgZGVjb2RfZm9ybWF0OwotCS8qKiBvdXRwdXQgZmlsZSBmb3JtYXQgMDogSjJLLCAxOiBKUDIsIDI6IEpQVCAqLwotCWludCBjb2RfZm9ybWF0OwotCS8qQH0qLworICAgIC8qKkBuYW1lIGNvbW1hbmQgbGluZSBlbmNvZGVyIHBhcmFtZXRlcnMgKG5vdCB1c2VkIGluc2lkZSB0aGUgbGlicmFyeSkgKi8KKyAgICAvKkB7Ki8KKyAgICAvKiogaW5wdXQgZmlsZSBuYW1lICovCisgICAgY2hhciBpbmZpbGVbT1BKX1BBVEhfTEVOXTsKKyAgICAvKiogb3V0cHV0IGZpbGUgbmFtZSAqLworICAgIGNoYXIgb3V0ZmlsZVtPUEpfUEFUSF9MRU5dOworICAgIC8qKiBERVBSRUNBVEVELiBJbmRleCBnZW5lcmF0aW9uIGlzIG5vdyBoYW5kZWxkIHdpdGggdGhlIG9wal9lbmNvZGVfd2l0aF9pbmZvKCkgZnVuY3Rpb24uIFNldCB0byBOVUxMICovCisgICAgaW50IGluZGV4X29uOworICAgIC8qKiBERVBSRUNBVEVELiBJbmRleCBnZW5lcmF0aW9uIGlzIG5vdyBoYW5kZWxkIHdpdGggdGhlIG9wal9lbmNvZGVfd2l0aF9pbmZvKCkgZnVuY3Rpb24uIFNldCB0byBOVUxMICovCisgICAgY2hhciBpbmRleFtPUEpfUEFUSF9MRU5dOworICAgIC8qKiBzdWJpbWFnZSBlbmNvZGluZzogb3JpZ2luIGltYWdlIG9mZnNldCBpbiB4IGRpcmVjdGlvbiAqLworICAgIGludCBpbWFnZV9vZmZzZXRfeDA7CisgICAgLyoqIHN1YmltYWdlIGVuY29kaW5nOiBvcmlnaW4gaW1hZ2Ugb2Zmc2V0IGluIHkgZGlyZWN0aW9uICovCisgICAgaW50IGltYWdlX29mZnNldF95MDsKKyAgICAvKiogc3Vic2FtcGxpbmcgdmFsdWUgZm9yIGR4ICovCisgICAgaW50IHN1YnNhbXBsaW5nX2R4OworICAgIC8qKiBzdWJzYW1wbGluZyB2YWx1ZSBmb3IgZHkgKi8KKyAgICBpbnQgc3Vic2FtcGxpbmdfZHk7CisgICAgLyoqIGlucHV0IGZpbGUgZm9ybWF0IDA6IFBHWCwgMTogUHhNLCAyOiBCTVAgMzpUSUYqLworICAgIGludCBkZWNvZF9mb3JtYXQ7CisgICAgLyoqIG91dHB1dCBmaWxlIGZvcm1hdCAwOiBKMkssIDE6IEpQMiwgMjogSlBUICovCisgICAgaW50IGNvZF9mb3JtYXQ7CisgICAgLypAfSovCiAKLS8qIFVuaVBHPj4gKi8gLyogTk9UIFlFVCBVU0VEIElOIFRIRSBWMiBWRVJTSU9OIE9GIE9QRU5KUEVHICovCi0JLyoqQG5hbWUgSlBXTCBlbmNvZGluZyBwYXJhbWV0ZXJzICovCi0JLypAeyovCi0JLyoqIGVuYWJsZXMgd3JpdGluZyBvZiBFUEMgaW4gTUgsIHRodXMgYWN0aXZhdGluZyBKUFdMICovCi0JT1BKX0JPT0wganB3bF9lcGNfb247Ci0JLyoqIGVycm9yIHByb3RlY3Rpb24gbWV0aG9kIGZvciBNSCAoMCwxLDE2LDMyLDM3LTEyOCkgKi8KLQlpbnQganB3bF9ocHJvdF9NSDsKLQkvKiogdGlsZSBudW1iZXIgb2YgaGVhZGVyIHByb3RlY3Rpb24gc3BlY2lmaWNhdGlvbiAoPj0wKSAqLwotCWludCBqcHdsX2hwcm90X1RQSF90aWxlbm9bSlBXTF9NQVhfTk9fVElMRVNQRUNTXTsKLQkvKiogZXJyb3IgcHJvdGVjdGlvbiBtZXRob2RzIGZvciBUUEhzICgwLDEsMTYsMzIsMzctMTI4KSAqLwotCWludCBqcHdsX2hwcm90X1RQSFtKUFdMX01BWF9OT19USUxFU1BFQ1NdOwotCS8qKiB0aWxlIG51bWJlciBvZiBwYWNrZXQgcHJvdGVjdGlvbiBzcGVjaWZpY2F0aW9uICg+PTApICovCi0JaW50IGpwd2xfcHByb3RfdGlsZW5vW0pQV0xfTUFYX05PX1BBQ0tTUEVDU107Ci0JLyoqIHBhY2tldCBudW1iZXIgb2YgcGFja2V0IHByb3RlY3Rpb24gc3BlY2lmaWNhdGlvbiAoPj0wKSAqLwotCWludCBqcHdsX3Bwcm90X3BhY2tub1tKUFdMX01BWF9OT19QQUNLU1BFQ1NdOwotCS8qKiBlcnJvciBwcm90ZWN0aW9uIG1ldGhvZHMgZm9yIHBhY2tldHMgKDAsMSwxNiwzMiwzNy0xMjgpICovCi0JaW50IGpwd2xfcHByb3RbSlBXTF9NQVhfTk9fUEFDS1NQRUNTXTsKLQkvKiogZW5hYmxlcyB3cml0aW5nIG9mIEVTRCwgKDA9bm8vMS8yIGJ5dGVzKSAqLwotCWludCBqcHdsX3NlbnNfc2l6ZTsKLQkvKiogc2Vuc2l0aXZpdHkgYWRkcmVzc2luZyBzaXplICgwPWF1dG8vMi80IGJ5dGVzKSAqLwotCWludCBqcHdsX3NlbnNfYWRkcjsKLQkvKiogc2Vuc2l0aXZpdHkgcmFuZ2UgKDAtMykgKi8KLQlpbnQganB3bF9zZW5zX3JhbmdlOwotCS8qKiBzZW5zaXRpdml0eSBtZXRob2QgZm9yIE1IICgtMT1ubywwLTcpICovCi0JaW50IGpwd2xfc2Vuc19NSDsKLQkvKiogdGlsZSBudW1iZXIgb2Ygc2Vuc2l0aXZpdHkgc3BlY2lmaWNhdGlvbiAoPj0wKSAqLwotCWludCBqcHdsX3NlbnNfVFBIX3RpbGVub1tKUFdMX01BWF9OT19USUxFU1BFQ1NdOwotCS8qKiBzZW5zaXRpdml0eSBtZXRob2RzIGZvciBUUEhzICgtMT1ubywwLTcpICovCi0JaW50IGpwd2xfc2Vuc19UUEhbSlBXTF9NQVhfTk9fVElMRVNQRUNTXTsKLQkvKkB9Ki8KLS8qIDw8VW5pUEcgKi8KKyAgICAvKiBVbmlQRz4+ICovIC8qIE5PVCBZRVQgVVNFRCBJTiBUSEUgVjIgVkVSU0lPTiBPRiBPUEVOSlBFRyAqLworICAgIC8qKkBuYW1lIEpQV0wgZW5jb2RpbmcgcGFyYW1ldGVycyAqLworICAgIC8qQHsqLworICAgIC8qKiBlbmFibGVzIHdyaXRpbmcgb2YgRVBDIGluIE1ILCB0aHVzIGFjdGl2YXRpbmcgSlBXTCAqLworICAgIE9QSl9CT09MIGpwd2xfZXBjX29uOworICAgIC8qKiBlcnJvciBwcm90ZWN0aW9uIG1ldGhvZCBmb3IgTUggKDAsMSwxNiwzMiwzNy0xMjgpICovCisgICAgaW50IGpwd2xfaHByb3RfTUg7CisgICAgLyoqIHRpbGUgbnVtYmVyIG9mIGhlYWRlciBwcm90ZWN0aW9uIHNwZWNpZmljYXRpb24gKD49MCkgKi8KKyAgICBpbnQganB3bF9ocHJvdF9UUEhfdGlsZW5vW0pQV0xfTUFYX05PX1RJTEVTUEVDU107CisgICAgLyoqIGVycm9yIHByb3RlY3Rpb24gbWV0aG9kcyBmb3IgVFBIcyAoMCwxLDE2LDMyLDM3LTEyOCkgKi8KKyAgICBpbnQganB3bF9ocHJvdF9UUEhbSlBXTF9NQVhfTk9fVElMRVNQRUNTXTsKKyAgICAvKiogdGlsZSBudW1iZXIgb2YgcGFja2V0IHByb3RlY3Rpb24gc3BlY2lmaWNhdGlvbiAoPj0wKSAqLworICAgIGludCBqcHdsX3Bwcm90X3RpbGVub1tKUFdMX01BWF9OT19QQUNLU1BFQ1NdOworICAgIC8qKiBwYWNrZXQgbnVtYmVyIG9mIHBhY2tldCBwcm90ZWN0aW9uIHNwZWNpZmljYXRpb24gKD49MCkgKi8KKyAgICBpbnQganB3bF9wcHJvdF9wYWNrbm9bSlBXTF9NQVhfTk9fUEFDS1NQRUNTXTsKKyAgICAvKiogZXJyb3IgcHJvdGVjdGlvbiBtZXRob2RzIGZvciBwYWNrZXRzICgwLDEsMTYsMzIsMzctMTI4KSAqLworICAgIGludCBqcHdsX3Bwcm90W0pQV0xfTUFYX05PX1BBQ0tTUEVDU107CisgICAgLyoqIGVuYWJsZXMgd3JpdGluZyBvZiBFU0QsICgwPW5vLzEvMiBieXRlcykgKi8KKyAgICBpbnQganB3bF9zZW5zX3NpemU7CisgICAgLyoqIHNlbnNpdGl2aXR5IGFkZHJlc3Npbmcgc2l6ZSAoMD1hdXRvLzIvNCBieXRlcykgKi8KKyAgICBpbnQganB3bF9zZW5zX2FkZHI7CisgICAgLyoqIHNlbnNpdGl2aXR5IHJhbmdlICgwLTMpICovCisgICAgaW50IGpwd2xfc2Vuc19yYW5nZTsKKyAgICAvKiogc2Vuc2l0aXZpdHkgbWV0aG9kIGZvciBNSCAoLTE9bm8sMC03KSAqLworICAgIGludCBqcHdsX3NlbnNfTUg7CisgICAgLyoqIHRpbGUgbnVtYmVyIG9mIHNlbnNpdGl2aXR5IHNwZWNpZmljYXRpb24gKD49MCkgKi8KKyAgICBpbnQganB3bF9zZW5zX1RQSF90aWxlbm9bSlBXTF9NQVhfTk9fVElMRVNQRUNTXTsKKyAgICAvKiogc2Vuc2l0aXZpdHkgbWV0aG9kcyBmb3IgVFBIcyAoLTE9bm8sMC03KSAqLworICAgIGludCBqcHdsX3NlbnNfVFBIW0pQV0xfTUFYX05PX1RJTEVTUEVDU107CisgICAgLypAfSovCisgICAgLyogPDxVbmlQRyAqLwogCiAgICAgLyoqCiAgICAgICogREVQUkVDQVRFRDogdXNlIFJTSVosIE9QSl9QUk9GSUxFXyogYW5kIE1BWF9DT01QX1NJWkUgaW5zdGVhZApAQCAtNDcxLDIzICs0NzQsMjMgQEAKICAgICAgKiBNYXhpbXVtIHNpemUgKGluIGJ5dGVzKSBmb3IgZWFjaCBjb21wb25lbnQuCiAgICAgICogSWYgPT0gMCwgY29tcG9uZW50IHNpemUgbGltaXRhdGlvbiBpcyBub3QgY29uc2lkZXJlZAogICAgICAqICovCi0JaW50IG1heF9jb21wX3NpemU7CisgICAgaW50IG1heF9jb21wX3NpemU7CiAgICAgLyoqCiAgICAgICogREVQUkVDQVRFRDogdXNlIFJTSVosIE9QSl9QUk9GSUxFXyogYW5kIE9QSl9FWFRFTlNJT05fKiBpbnN0ZWFkCiAgICAgICogUHJvZmlsZSBuYW1lCiAgICAgICogKi8KICAgICBPUEpfUlNJWl9DQVBBQklMSVRJRVMgY3BfcnNpejsKLQkvKiogVGlsZSBwYXJ0IGdlbmVyYXRpb24qLwotCWNoYXIgdHBfb247Ci0JLyoqIEZsYWcgZm9yIFRpbGUgcGFydCBnZW5lcmF0aW9uKi8KLQljaGFyIHRwX2ZsYWc7Ci0JLyoqIE1DVCAobXVsdGlwbGUgY29tcG9uZW50IHRyYW5zZm9ybSkgKi8KLQljaGFyIHRjcF9tY3Q7Ci0JLyoqIEVuYWJsZSBKUElQIGluZGV4aW5nKi8KLQlPUEpfQk9PTCBqcGlwX29uOwotCS8qKiBOYWl2ZSBpbXBsZW1lbnRhdGlvbiBvZiBNQ1QgcmVzdHJpY3RlZCB0byBhIHNpbmdsZSByZXZlcnNpYmxlIGFycmF5IGJhc2VkIAorICAgIC8qKiBUaWxlIHBhcnQgZ2VuZXJhdGlvbiovCisgICAgY2hhciB0cF9vbjsKKyAgICAvKiogRmxhZyBmb3IgVGlsZSBwYXJ0IGdlbmVyYXRpb24qLworICAgIGNoYXIgdHBfZmxhZzsKKyAgICAvKiogTUNUIChtdWx0aXBsZSBjb21wb25lbnQgdHJhbnNmb3JtKSAqLworICAgIGNoYXIgdGNwX21jdDsKKyAgICAvKiogRW5hYmxlIEpQSVAgaW5kZXhpbmcqLworICAgIE9QSl9CT09MIGpwaXBfb247CisgICAgLyoqIE5haXZlIGltcGxlbWVudGF0aW9uIG9mIE1DVCByZXN0cmljdGVkIHRvIGEgc2luZ2xlIHJldmVyc2libGUgYXJyYXkgYmFzZWQKICAgICAgICAgZW5jb2Rpbmcgd2l0aG91dCBvZmZzZXQgY29uY2VybmluZyBhbGwgdGhlIGNvbXBvbmVudHMuICovCi0Jdm9pZCAqIG1jdF9kYXRhOworICAgIHZvaWQgKiBtY3RfZGF0YTsKICAgICAvKioKICAgICAgKiBNYXhpbXVtIHNpemUgKGluIGJ5dGVzKSBmb3IgdGhlIHdob2xlIGNvZGVzdHJlYW0uCiAgICAgICogSWYgPT0gMCwgY29kZXN0cmVhbSBzaXplIGxpbWl0YXRpb24gaXMgbm90IGNvbnNpZGVyZWQKQEAgLTQ5OCw3MiArNTAxLDczIEBACiAgICAgLyoqIFJTSVogdmFsdWUKICAgICAgICAgVG8gYmUgdXNlZCB0byBjb21iaW5lIE9QSl9QUk9GSUxFXyosIE9QSl9FWFRFTlNJT05fKiBhbmQgKHN1YilsZXZlbHMgdmFsdWVzLiAqLwogICAgIE9QSl9VSU5UMTYgcnNpejsKLX0gb3BqX2NwYXJhbWV0ZXJzX3Q7ICAKK30gb3BqX2NwYXJhbWV0ZXJzX3Q7CiAKLSNkZWZpbmUgT1BKX0RQQVJBTUVURVJTX0lHTk9SRV9QQ0xSX0NNQVBfQ0RFRl9GTEFHCTB4MDAwMQorI2RlZmluZSBPUEpfRFBBUkFNRVRFUlNfSUdOT1JFX1BDTFJfQ01BUF9DREVGX0ZMQUcgIDB4MDAwMQorI2RlZmluZSBPUEpfRFBBUkFNRVRFUlNfRFVNUF9GTEFHIDB4MDAwMgogCiAvKioKICAqIERlY29tcHJlc3Npb24gcGFyYW1ldGVycwogICogKi8KIHR5cGVkZWYgc3RydWN0IG9wal9kcGFyYW1ldGVycyB7Ci0JLyoqIAotCVNldCB0aGUgbnVtYmVyIG9mIGhpZ2hlc3QgcmVzb2x1dGlvbiBsZXZlbHMgdG8gYmUgZGlzY2FyZGVkLiAKLQlUaGUgaW1hZ2UgcmVzb2x1dGlvbiBpcyBlZmZlY3RpdmVseSBkaXZpZGVkIGJ5IDIgdG8gdGhlIHBvd2VyIG9mIHRoZSBudW1iZXIgb2YgZGlzY2FyZGVkIGxldmVscy4gCi0JVGhlIHJlZHVjZSBmYWN0b3IgaXMgbGltaXRlZCBieSB0aGUgc21hbGxlc3QgdG90YWwgbnVtYmVyIG9mIGRlY29tcG9zaXRpb24gbGV2ZWxzIGFtb25nIHRpbGVzLgotCWlmICE9IDAsIHRoZW4gb3JpZ2luYWwgZGltZW5zaW9uIGRpdmlkZWQgYnkgMl4ocmVkdWNlKTsgCi0JaWYgPT0gMCBvciBub3QgdXNlZCwgaW1hZ2UgaXMgZGVjb2RlZCB0byB0aGUgZnVsbCByZXNvbHV0aW9uIAotCSovCi0JT1BKX1VJTlQzMiBjcF9yZWR1Y2U7Ci0JLyoqIAotCVNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgcXVhbGl0eSBsYXllcnMgdG8gZGVjb2RlLiAKLQlJZiB0aGVyZSBhcmUgbGVzcyBxdWFsaXR5IGxheWVycyB0aGFuIHRoZSBzcGVjaWZpZWQgbnVtYmVyLCBhbGwgdGhlIHF1YWxpdHkgbGF5ZXJzIGFyZSBkZWNvZGVkLgotCWlmICE9IDAsIHRoZW4gb25seSB0aGUgZmlyc3QgImxheWVyIiBsYXllcnMgYXJlIGRlY29kZWQ7IAotCWlmID09IDAgb3Igbm90IHVzZWQsIGFsbCB0aGUgcXVhbGl0eSBsYXllcnMgYXJlIGRlY29kZWQgCi0JKi8KLQlPUEpfVUlOVDMyIGNwX2xheWVyOworICAgIC8qKgorICAgIFNldCB0aGUgbnVtYmVyIG9mIGhpZ2hlc3QgcmVzb2x1dGlvbiBsZXZlbHMgdG8gYmUgZGlzY2FyZGVkLgorICAgIFRoZSBpbWFnZSByZXNvbHV0aW9uIGlzIGVmZmVjdGl2ZWx5IGRpdmlkZWQgYnkgMiB0byB0aGUgcG93ZXIgb2YgdGhlIG51bWJlciBvZiBkaXNjYXJkZWQgbGV2ZWxzLgorICAgIFRoZSByZWR1Y2UgZmFjdG9yIGlzIGxpbWl0ZWQgYnkgdGhlIHNtYWxsZXN0IHRvdGFsIG51bWJlciBvZiBkZWNvbXBvc2l0aW9uIGxldmVscyBhbW9uZyB0aWxlcy4KKyAgICBpZiAhPSAwLCB0aGVuIG9yaWdpbmFsIGRpbWVuc2lvbiBkaXZpZGVkIGJ5IDJeKHJlZHVjZSk7CisgICAgaWYgPT0gMCBvciBub3QgdXNlZCwgaW1hZ2UgaXMgZGVjb2RlZCB0byB0aGUgZnVsbCByZXNvbHV0aW9uCisgICAgKi8KKyAgICBPUEpfVUlOVDMyIGNwX3JlZHVjZTsKKyAgICAvKioKKyAgICBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHF1YWxpdHkgbGF5ZXJzIHRvIGRlY29kZS4KKyAgICBJZiB0aGVyZSBhcmUgbGVzcyBxdWFsaXR5IGxheWVycyB0aGFuIHRoZSBzcGVjaWZpZWQgbnVtYmVyLCBhbGwgdGhlIHF1YWxpdHkgbGF5ZXJzIGFyZSBkZWNvZGVkLgorICAgIGlmICE9IDAsIHRoZW4gb25seSB0aGUgZmlyc3QgImxheWVyIiBsYXllcnMgYXJlIGRlY29kZWQ7CisgICAgaWYgPT0gMCBvciBub3QgdXNlZCwgYWxsIHRoZSBxdWFsaXR5IGxheWVycyBhcmUgZGVjb2RlZAorICAgICovCisgICAgT1BKX1VJTlQzMiBjcF9sYXllcjsKIAotCS8qKkBuYW1lIGNvbW1hbmQgbGluZSBkZWNvZGVyIHBhcmFtZXRlcnMgKG5vdCB1c2VkIGluc2lkZSB0aGUgbGlicmFyeSkgKi8KLQkvKkB7Ki8KLQkvKiogaW5wdXQgZmlsZSBuYW1lICovCi0JY2hhciBpbmZpbGVbT1BKX1BBVEhfTEVOXTsKLQkvKiogb3V0cHV0IGZpbGUgbmFtZSAqLwotCWNoYXIgb3V0ZmlsZVtPUEpfUEFUSF9MRU5dOwotCS8qKiBpbnB1dCBmaWxlIGZvcm1hdCAwOiBKMkssIDE6IEpQMiwgMjogSlBUICovCi0JaW50IGRlY29kX2Zvcm1hdDsKLQkvKiogb3V0cHV0IGZpbGUgZm9ybWF0IDA6IFBHWCwgMTogUHhNLCAyOiBCTVAgKi8KLQlpbnQgY29kX2Zvcm1hdDsKKyAgICAvKipAbmFtZSBjb21tYW5kIGxpbmUgZGVjb2RlciBwYXJhbWV0ZXJzIChub3QgdXNlZCBpbnNpZGUgdGhlIGxpYnJhcnkpICovCisgICAgLypAeyovCisgICAgLyoqIGlucHV0IGZpbGUgbmFtZSAqLworICAgIGNoYXIgaW5maWxlW09QSl9QQVRIX0xFTl07CisgICAgLyoqIG91dHB1dCBmaWxlIG5hbWUgKi8KKyAgICBjaGFyIG91dGZpbGVbT1BKX1BBVEhfTEVOXTsKKyAgICAvKiogaW5wdXQgZmlsZSBmb3JtYXQgMDogSjJLLCAxOiBKUDIsIDI6IEpQVCAqLworICAgIGludCBkZWNvZF9mb3JtYXQ7CisgICAgLyoqIG91dHB1dCBmaWxlIGZvcm1hdCAwOiBQR1gsIDE6IFB4TSwgMjogQk1QICovCisgICAgaW50IGNvZF9mb3JtYXQ7CiAKLQkvKiogRGVjb2RpbmcgYXJlYSBsZWZ0IGJvdW5kYXJ5ICovCi0JT1BKX1VJTlQzMiBEQV94MDsKLQkvKiogRGVjb2RpbmcgYXJlYSByaWdodCBib3VuZGFyeSAqLwotCU9QSl9VSU5UMzIgREFfeDE7Ci0JLyoqIERlY29kaW5nIGFyZWEgdXAgYm91bmRhcnkgKi8KLQlPUEpfVUlOVDMyIERBX3kwOwotCS8qKiBEZWNvZGluZyBhcmVhIGJvdHRvbSBib3VuZGFyeSAqLwotCU9QSl9VSU5UMzIgREFfeTE7Ci0JLyoqIFZlcmJvc2UgbW9kZSAqLwotCU9QSl9CT09MIG1fdmVyYm9zZTsKKyAgICAvKiogRGVjb2RpbmcgYXJlYSBsZWZ0IGJvdW5kYXJ5ICovCisgICAgT1BKX1VJTlQzMiBEQV94MDsKKyAgICAvKiogRGVjb2RpbmcgYXJlYSByaWdodCBib3VuZGFyeSAqLworICAgIE9QSl9VSU5UMzIgREFfeDE7CisgICAgLyoqIERlY29kaW5nIGFyZWEgdXAgYm91bmRhcnkgKi8KKyAgICBPUEpfVUlOVDMyIERBX3kwOworICAgIC8qKiBEZWNvZGluZyBhcmVhIGJvdHRvbSBib3VuZGFyeSAqLworICAgIE9QSl9VSU5UMzIgREFfeTE7CisgICAgLyoqIFZlcmJvc2UgbW9kZSAqLworICAgIE9QSl9CT09MIG1fdmVyYm9zZTsKIAotCS8qKiB0aWxlIG51bWJlciBvdCB0aGUgZGVjb2RlZCB0aWxlKi8KLQlPUEpfVUlOVDMyIHRpbGVfaW5kZXg7Ci0JLyoqIE5iIG9mIHRpbGUgdG8gZGVjb2RlICovCi0JT1BKX1VJTlQzMiBuYl90aWxlX3RvX2RlY29kZTsKKyAgICAvKiogdGlsZSBudW1iZXIgb3QgdGhlIGRlY29kZWQgdGlsZSovCisgICAgT1BKX1VJTlQzMiB0aWxlX2luZGV4OworICAgIC8qKiBOYiBvZiB0aWxlIHRvIGRlY29kZSAqLworICAgIE9QSl9VSU5UMzIgbmJfdGlsZV90b19kZWNvZGU7CiAKLQkvKkB9Ki8KKyAgICAvKkB9Ki8KIAotLyogVW5pUEc+PiAqLyAvKiBOT1QgWUVUIFVTRUQgSU4gVEhFIFYyIFZFUlNJT04gT0YgT1BFTkpQRUcgKi8KLQkvKipAbmFtZSBKUFdMIGRlY29kaW5nIHBhcmFtZXRlcnMgKi8KLQkvKkB7Ki8KLQkvKiogYWN0aXZhdGVzIHRoZSBKUFdMIGNvcnJlY3Rpb24gY2FwYWJpbGl0aWVzICovCi0JT1BKX0JPT0wganB3bF9jb3JyZWN0OwotCS8qKiBleHBlY3RlZCBudW1iZXIgb2YgY29tcG9uZW50cyAqLwotCWludCBqcHdsX2V4cF9jb21wczsKLQkvKiogbWF4aW11bSBudW1iZXIgb2YgdGlsZXMgKi8KLQlpbnQganB3bF9tYXhfdGlsZXM7Ci0JLypAfSovCi0vKiA8PFVuaVBHICovCisgICAgLyogVW5pUEc+PiAqLyAvKiBOT1QgWUVUIFVTRUQgSU4gVEhFIFYyIFZFUlNJT04gT0YgT1BFTkpQRUcgKi8KKyAgICAvKipAbmFtZSBKUFdMIGRlY29kaW5nIHBhcmFtZXRlcnMgKi8KKyAgICAvKkB7Ki8KKyAgICAvKiogYWN0aXZhdGVzIHRoZSBKUFdMIGNvcnJlY3Rpb24gY2FwYWJpbGl0aWVzICovCisgICAgT1BKX0JPT0wganB3bF9jb3JyZWN0OworICAgIC8qKiBleHBlY3RlZCBudW1iZXIgb2YgY29tcG9uZW50cyAqLworICAgIGludCBqcHdsX2V4cF9jb21wczsKKyAgICAvKiogbWF4aW11bSBudW1iZXIgb2YgdGlsZXMgKi8KKyAgICBpbnQganB3bF9tYXhfdGlsZXM7CisgICAgLypAfSovCisgICAgLyogPDxVbmlQRyAqLwogCi0JdW5zaWduZWQgaW50IGZsYWdzOworICAgIHVuc2lnbmVkIGludCBmbGFnczsKIAogfSBvcGpfZHBhcmFtZXRlcnNfdDsKIApAQCAtNTczLDcgKzU3Nyw3IEBACiAgKiAqLwogdHlwZWRlZiB2b2lkICogb3BqX2NvZGVjX3Q7CiAKLS8qIAorLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIEkvTyBzdHJlYW0gdHlwZWRlZiBkZWZpbml0aW9ucwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNTgzLDQxICs1ODcsNDUgQEAKICAqIFN0cmVhbSBvcGVuIGZsYWdzLgogICogKi8KIC8qKiBUaGUgc3RyZWFtIHdhcyBvcGVuZWQgZm9yIHJlYWRpbmcuICovCi0jZGVmaW5lIE9QSl9TVFJFQU1fUkVBRAlPUEpfVFJVRQorI2RlZmluZSBPUEpfU1RSRUFNX1JFQUQgT1BKX1RSVUUKIC8qKiBUaGUgc3RyZWFtIHdhcyBvcGVuZWQgZm9yIHdyaXRpbmcuICovCiAjZGVmaW5lIE9QSl9TVFJFQU1fV1JJVEUgT1BKX0ZBTFNFCiAKIC8qCiAgKiBDYWxsYmFjayBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIHJlYWQgZnVuY3Rpb24KICAqLwotdHlwZWRlZiBPUEpfU0laRV9UICgqIG9wal9zdHJlYW1fcmVhZF9mbikgKHZvaWQgKiBwX2J1ZmZlciwgT1BKX1NJWkVfVCBwX25iX2J5dGVzLCB2b2lkICogcF91c2VyX2RhdGEpIDsKK3R5cGVkZWYgT1BKX1NJWkVfVCgqIG9wal9zdHJlYW1fcmVhZF9mbikodm9pZCAqIHBfYnVmZmVyLCBPUEpfU0laRV9UIHBfbmJfYnl0ZXMsCisgICAgICAgIHZvaWQgKiBwX3VzZXJfZGF0YSkgOwogCiAvKgogICogQ2FsbGJhY2sgZnVuY3Rpb24gcHJvdG90eXBlIGZvciB3cml0ZSBmdW5jdGlvbgogICovCi10eXBlZGVmIE9QSl9TSVpFX1QgKCogb3BqX3N0cmVhbV93cml0ZV9mbikgKHZvaWQgKiBwX2J1ZmZlciwgT1BKX1NJWkVfVCBwX25iX2J5dGVzLCB2b2lkICogcF91c2VyX2RhdGEpIDsKK3R5cGVkZWYgT1BKX1NJWkVfVCgqIG9wal9zdHJlYW1fd3JpdGVfZm4pKHZvaWQgKiBwX2J1ZmZlciwKKyAgICAgICAgT1BKX1NJWkVfVCBwX25iX2J5dGVzLCB2b2lkICogcF91c2VyX2RhdGEpIDsKIAogLyoKICAqIENhbGxiYWNrIGZ1bmN0aW9uIHByb3RvdHlwZSBmb3Igc2tpcCBmdW5jdGlvbgogICovCi10eXBlZGVmIE9QSl9PRkZfVCAoKiBvcGpfc3RyZWFtX3NraXBfZm4pIChPUEpfT0ZGX1QgcF9uYl9ieXRlcywgdm9pZCAqIHBfdXNlcl9kYXRhKSA7Cit0eXBlZGVmIE9QSl9PRkZfVCgqIG9wal9zdHJlYW1fc2tpcF9mbikoT1BKX09GRl9UIHBfbmJfYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIHBfdXNlcl9kYXRhKSA7CiAKIC8qCiAgKiBDYWxsYmFjayBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIHNlZWsgZnVuY3Rpb24KICAqLwotdHlwZWRlZiBPUEpfQk9PTCAoKiBvcGpfc3RyZWFtX3NlZWtfZm4pIChPUEpfT0ZGX1QgcF9uYl9ieXRlcywgdm9pZCAqIHBfdXNlcl9kYXRhKSA7Cit0eXBlZGVmIE9QSl9CT09MKCogb3BqX3N0cmVhbV9zZWVrX2ZuKShPUEpfT0ZGX1QgcF9uYl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBwX3VzZXJfZGF0YSkgOwogCiAvKgogICogQ2FsbGJhY2sgZnVuY3Rpb24gcHJvdG90eXBlIGZvciBmcmVlIHVzZXIgZGF0YSBmdW5jdGlvbgogICovCi10eXBlZGVmIHZvaWQgKCogb3BqX3N0cmVhbV9mcmVlX3VzZXJfZGF0YV9mbikgKHZvaWQgKiBwX3VzZXJfZGF0YSkgOwordHlwZWRlZiB2b2lkICgqIG9wal9zdHJlYW1fZnJlZV91c2VyX2RhdGFfZm4pKHZvaWQgKiBwX3VzZXJfZGF0YSkgOwogCiAvKgogICogSlBFRzIwMDAgU3RyZWFtLgogICovCiB0eXBlZGVmIHZvaWQgKiBvcGpfc3RyZWFtX3Q7CiAKLS8qIAorLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIGltYWdlIHR5cGVkZWYgZGVmaW5pdGlvbnMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTYyNyw1OSArNjM1LDYwIEBACiAgKiBEZWZpbmVzIGEgc2luZ2xlIGltYWdlIGNvbXBvbmVudAogICogKi8KIHR5cGVkZWYgc3RydWN0IG9wal9pbWFnZV9jb21wIHsKLQkvKiogWFJzaXo6IGhvcml6b250YWwgc2VwYXJhdGlvbiBvZiBhIHNhbXBsZSBvZiBpdGggY29tcG9uZW50IHdpdGggcmVzcGVjdCB0byB0aGUgcmVmZXJlbmNlIGdyaWQgKi8KLQlPUEpfVUlOVDMyIGR4OwotCS8qKiBZUnNpejogdmVydGljYWwgc2VwYXJhdGlvbiBvZiBhIHNhbXBsZSBvZiBpdGggY29tcG9uZW50IHdpdGggcmVzcGVjdCB0byB0aGUgcmVmZXJlbmNlIGdyaWQgKi8KLQlPUEpfVUlOVDMyIGR5OwotCS8qKiBkYXRhIHdpZHRoICovCi0JT1BKX1VJTlQzMiB3OwotCS8qKiBkYXRhIGhlaWdodCAqLwotCU9QSl9VSU5UMzIgaDsKLQkvKiogeCBjb21wb25lbnQgb2Zmc2V0IGNvbXBhcmVkIHRvIHRoZSB3aG9sZSBpbWFnZSAqLwotCU9QSl9VSU5UMzIgeDA7Ci0JLyoqIHkgY29tcG9uZW50IG9mZnNldCBjb21wYXJlZCB0byB0aGUgd2hvbGUgaW1hZ2UgKi8KLQlPUEpfVUlOVDMyIHkwOwotCS8qKiBwcmVjaXNpb24gKi8KLQlPUEpfVUlOVDMyIHByZWM7Ci0JLyoqIGltYWdlIGRlcHRoIGluIGJpdHMgKi8KLQlPUEpfVUlOVDMyIGJwcDsKLQkvKiogc2lnbmVkICgxKSAvIHVuc2lnbmVkICgwKSAqLwotCU9QSl9VSU5UMzIgc2duZDsKLQkvKiogbnVtYmVyIG9mIGRlY29kZWQgcmVzb2x1dGlvbiAqLwotCU9QSl9VSU5UMzIgcmVzbm9fZGVjb2RlZDsKLQkvKiogbnVtYmVyIG9mIGRpdmlzaW9uIGJ5IDIgb2YgdGhlIG91dCBpbWFnZSBjb21wYXJlZCB0byB0aGUgb3JpZ2luYWwgc2l6ZSBvZiBpbWFnZSAqLwotCU9QSl9VSU5UMzIgZmFjdG9yOwotCS8qKiBpbWFnZSBjb21wb25lbnQgZGF0YSAqLwotCU9QSl9JTlQzMiAqZGF0YTsKLSAgLyoqIGFscGhhIGNoYW5uZWwgKi8KLSAgT1BKX1VJTlQxNiBhbHBoYTsKKyAgICAvKiogWFJzaXo6IGhvcml6b250YWwgc2VwYXJhdGlvbiBvZiBhIHNhbXBsZSBvZiBpdGggY29tcG9uZW50IHdpdGggcmVzcGVjdCB0byB0aGUgcmVmZXJlbmNlIGdyaWQgKi8KKyAgICBPUEpfVUlOVDMyIGR4OworICAgIC8qKiBZUnNpejogdmVydGljYWwgc2VwYXJhdGlvbiBvZiBhIHNhbXBsZSBvZiBpdGggY29tcG9uZW50IHdpdGggcmVzcGVjdCB0byB0aGUgcmVmZXJlbmNlIGdyaWQgKi8KKyAgICBPUEpfVUlOVDMyIGR5OworICAgIC8qKiBkYXRhIHdpZHRoICovCisgICAgT1BKX1VJTlQzMiB3OworICAgIC8qKiBkYXRhIGhlaWdodCAqLworICAgIE9QSl9VSU5UMzIgaDsKKyAgICAvKiogeCBjb21wb25lbnQgb2Zmc2V0IGNvbXBhcmVkIHRvIHRoZSB3aG9sZSBpbWFnZSAqLworICAgIE9QSl9VSU5UMzIgeDA7CisgICAgLyoqIHkgY29tcG9uZW50IG9mZnNldCBjb21wYXJlZCB0byB0aGUgd2hvbGUgaW1hZ2UgKi8KKyAgICBPUEpfVUlOVDMyIHkwOworICAgIC8qKiBwcmVjaXNpb24gKi8KKyAgICBPUEpfVUlOVDMyIHByZWM7CisgICAgLyoqIGltYWdlIGRlcHRoIGluIGJpdHMgKi8KKyAgICBPUEpfVUlOVDMyIGJwcDsKKyAgICAvKiogc2lnbmVkICgxKSAvIHVuc2lnbmVkICgwKSAqLworICAgIE9QSl9VSU5UMzIgc2duZDsKKyAgICAvKiogbnVtYmVyIG9mIGRlY29kZWQgcmVzb2x1dGlvbiAqLworICAgIE9QSl9VSU5UMzIgcmVzbm9fZGVjb2RlZDsKKyAgICAvKiogbnVtYmVyIG9mIGRpdmlzaW9uIGJ5IDIgb2YgdGhlIG91dCBpbWFnZSBjb21wYXJlZCB0byB0aGUgb3JpZ2luYWwgc2l6ZSBvZiBpbWFnZSAqLworICAgIE9QSl9VSU5UMzIgZmFjdG9yOworICAgIC8qKiBpbWFnZSBjb21wb25lbnQgZGF0YSAqLworICAgIE9QSl9JTlQzMiAqZGF0YTsKKyAgICAvKiogYWxwaGEgY2hhbm5lbCAqLworICAgIE9QSl9VSU5UMTYgYWxwaGE7CiB9IG9wal9pbWFnZV9jb21wX3Q7CiAKLS8qKiAKKy8qKgogICogRGVmaW5lcyBpbWFnZSBkYXRhIGFuZCBjaGFyYWN0ZXJpc3RpY3MKICAqICovCiB0eXBlZGVmIHN0cnVjdCBvcGpfaW1hZ2UgewotCS8qKiBYT3NpejogaG9yaXpvbnRhbCBvZmZzZXQgZnJvbSB0aGUgb3JpZ2luIG9mIHRoZSByZWZlcmVuY2UgZ3JpZCB0byB0aGUgbGVmdCBzaWRlIG9mIHRoZSBpbWFnZSBhcmVhICovCi0JT1BKX1VJTlQzMiB4MDsKLQkvKiogWU9zaXo6IHZlcnRpY2FsIG9mZnNldCBmcm9tIHRoZSBvcmlnaW4gb2YgdGhlIHJlZmVyZW5jZSBncmlkIHRvIHRoZSB0b3Agc2lkZSBvZiB0aGUgaW1hZ2UgYXJlYSAqLwotCU9QSl9VSU5UMzIgeTA7Ci0JLyoqIFhzaXo6IHdpZHRoIG9mIHRoZSByZWZlcmVuY2UgZ3JpZCAqLwotCU9QSl9VSU5UMzIgeDE7Ci0JLyoqIFlzaXo6IGhlaWdodCBvZiB0aGUgcmVmZXJlbmNlIGdyaWQgKi8KLQlPUEpfVUlOVDMyIHkxOwotCS8qKiBudW1iZXIgb2YgY29tcG9uZW50cyBpbiB0aGUgaW1hZ2UgKi8KLQlPUEpfVUlOVDMyIG51bWNvbXBzOwotCS8qKiBjb2xvciBzcGFjZTogc1JHQiwgR3JleXNjYWxlIG9yIFlVViAqLwotCU9QSl9DT0xPUl9TUEFDRSBjb2xvcl9zcGFjZTsKLQkvKiogaW1hZ2UgY29tcG9uZW50cyAqLwotCW9wal9pbWFnZV9jb21wX3QgKmNvbXBzOwotCS8qKiAncmVzdHJpY3RlZCcgSUNDIHByb2ZpbGUgKi8KLQlPUEpfQllURSAqaWNjX3Byb2ZpbGVfYnVmOwotCS8qKiBzaXplIG9mIElDQyBwcm9maWxlICovCi0JT1BKX1VJTlQzMiBpY2NfcHJvZmlsZV9sZW47CisgICAgLyoqIFhPc2l6OiBob3Jpem9udGFsIG9mZnNldCBmcm9tIHRoZSBvcmlnaW4gb2YgdGhlIHJlZmVyZW5jZSBncmlkIHRvIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIGltYWdlIGFyZWEgKi8KKyAgICBPUEpfVUlOVDMyIHgwOworICAgIC8qKiBZT3NpejogdmVydGljYWwgb2Zmc2V0IGZyb20gdGhlIG9yaWdpbiBvZiB0aGUgcmVmZXJlbmNlIGdyaWQgdG8gdGhlIHRvcCBzaWRlIG9mIHRoZSBpbWFnZSBhcmVhICovCisgICAgT1BKX1VJTlQzMiB5MDsKKyAgICAvKiogWHNpejogd2lkdGggb2YgdGhlIHJlZmVyZW5jZSBncmlkICovCisgICAgT1BKX1VJTlQzMiB4MTsKKyAgICAvKiogWXNpejogaGVpZ2h0IG9mIHRoZSByZWZlcmVuY2UgZ3JpZCAqLworICAgIE9QSl9VSU5UMzIgeTE7CisgICAgLyoqIG51bWJlciBvZiBjb21wb25lbnRzIGluIHRoZSBpbWFnZSAqLworICAgIE9QSl9VSU5UMzIgbnVtY29tcHM7CisgICAgLyoqIGNvbG9yIHNwYWNlOiBzUkdCLCBHcmV5c2NhbGUgb3IgWVVWICovCisgICAgT1BKX0NPTE9SX1NQQUNFIGNvbG9yX3NwYWNlOworICAgIC8qKiBpbWFnZSBjb21wb25lbnRzICovCisgICAgb3BqX2ltYWdlX2NvbXBfdCAqY29tcHM7CisgICAgLyoqICdyZXN0cmljdGVkJyBJQ0MgcHJvZmlsZSAqLworICAgIE9QSl9CWVRFICppY2NfcHJvZmlsZV9idWY7CisgICAgLyoqIHNpemUgb2YgSUNDIHByb2ZpbGUgKi8KKyAgICBPUEpfVUlOVDMyIGljY19wcm9maWxlX2xlbjsKIAotCS8qKiBXaGV0aGVyIHRvIGFwcGx5IFBDTFIgb3Igbm90ICovCi0JT1BKX0JPT0wgcGRmaXVtX3VzZV9jb2xvcnNwYWNlOworCisgICAgLyoqIFdoZXRoZXIgdG8gYXBwbHkgUENMUiBvciBub3QgKi8KKyAgICBPUEpfQk9PTCBwZGZpdW1fdXNlX2NvbG9yc3BhY2U7CiB9IG9wal9pbWFnZV90OwogCiAKQEAgLTY4NywyOCArNjk2LDI4IEBACiAgKiBDb21wb25lbnQgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgdXNlZCBieSB0aGUgb3BqX2ltYWdlX2NyZWF0ZSBmdW5jdGlvbgogICogKi8KIHR5cGVkZWYgc3RydWN0IG9wal9pbWFnZV9jb21wdHBhcm0gewotCS8qKiBYUnNpejogaG9yaXpvbnRhbCBzZXBhcmF0aW9uIG9mIGEgc2FtcGxlIG9mIGl0aCBjb21wb25lbnQgd2l0aCByZXNwZWN0IHRvIHRoZSByZWZlcmVuY2UgZ3JpZCAqLwotCU9QSl9VSU5UMzIgZHg7Ci0JLyoqIFlSc2l6OiB2ZXJ0aWNhbCBzZXBhcmF0aW9uIG9mIGEgc2FtcGxlIG9mIGl0aCBjb21wb25lbnQgd2l0aCByZXNwZWN0IHRvIHRoZSByZWZlcmVuY2UgZ3JpZCAqLwotCU9QSl9VSU5UMzIgZHk7Ci0JLyoqIGRhdGEgd2lkdGggKi8KLQlPUEpfVUlOVDMyIHc7Ci0JLyoqIGRhdGEgaGVpZ2h0ICovCi0JT1BKX1VJTlQzMiBoOwotCS8qKiB4IGNvbXBvbmVudCBvZmZzZXQgY29tcGFyZWQgdG8gdGhlIHdob2xlIGltYWdlICovCi0JT1BKX1VJTlQzMiB4MDsKLQkvKiogeSBjb21wb25lbnQgb2Zmc2V0IGNvbXBhcmVkIHRvIHRoZSB3aG9sZSBpbWFnZSAqLwotCU9QSl9VSU5UMzIgeTA7Ci0JLyoqIHByZWNpc2lvbiAqLwotCU9QSl9VSU5UMzIgcHJlYzsKLQkvKiogaW1hZ2UgZGVwdGggaW4gYml0cyAqLwotCU9QSl9VSU5UMzIgYnBwOwotCS8qKiBzaWduZWQgKDEpIC8gdW5zaWduZWQgKDApICovCi0JT1BKX1VJTlQzMiBzZ25kOworICAgIC8qKiBYUnNpejogaG9yaXpvbnRhbCBzZXBhcmF0aW9uIG9mIGEgc2FtcGxlIG9mIGl0aCBjb21wb25lbnQgd2l0aCByZXNwZWN0IHRvIHRoZSByZWZlcmVuY2UgZ3JpZCAqLworICAgIE9QSl9VSU5UMzIgZHg7CisgICAgLyoqIFlSc2l6OiB2ZXJ0aWNhbCBzZXBhcmF0aW9uIG9mIGEgc2FtcGxlIG9mIGl0aCBjb21wb25lbnQgd2l0aCByZXNwZWN0IHRvIHRoZSByZWZlcmVuY2UgZ3JpZCAqLworICAgIE9QSl9VSU5UMzIgZHk7CisgICAgLyoqIGRhdGEgd2lkdGggKi8KKyAgICBPUEpfVUlOVDMyIHc7CisgICAgLyoqIGRhdGEgaGVpZ2h0ICovCisgICAgT1BKX1VJTlQzMiBoOworICAgIC8qKiB4IGNvbXBvbmVudCBvZmZzZXQgY29tcGFyZWQgdG8gdGhlIHdob2xlIGltYWdlICovCisgICAgT1BKX1VJTlQzMiB4MDsKKyAgICAvKiogeSBjb21wb25lbnQgb2Zmc2V0IGNvbXBhcmVkIHRvIHRoZSB3aG9sZSBpbWFnZSAqLworICAgIE9QSl9VSU5UMzIgeTA7CisgICAgLyoqIHByZWNpc2lvbiAqLworICAgIE9QSl9VSU5UMzIgcHJlYzsKKyAgICAvKiogaW1hZ2UgZGVwdGggaW4gYml0cyAqLworICAgIE9QSl9VSU5UMzIgYnBwOworICAgIC8qKiBzaWduZWQgKDEpIC8gdW5zaWduZWQgKDApICovCisgICAgT1BKX1VJTlQzMiBzZ25kOwogfSBvcGpfaW1hZ2VfY21wdHBhcm1fdDsKIAogCi0vKiAKKy8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBJbmZvcm1hdGlvbiBvbiB0aGUgSlBFRyAyMDAwIGNvZGVzdHJlYW0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTcxOSwxNCArNzI4LDE0IEBACiAgKiBJbmRleCBzdHJ1Y3R1cmUgOiBJbmZvcm1hdGlvbiBjb25jZXJuaW5nIGEgcGFja2V0IGluc2lkZSB0aWxlCiAgKiAqLwogdHlwZWRlZiBzdHJ1Y3Qgb3BqX3BhY2tldF9pbmZvIHsKLQkvKiogcGFja2V0IHN0YXJ0IHBvc2l0aW9uIChpbmNsdWRpbmcgU09QIG1hcmtlciBpZiBpdCBleGlzdHMpICovCi0JT1BKX09GRl9UIHN0YXJ0X3BvczsKLQkvKiogZW5kIG9mIHBhY2tldCBoZWFkZXIgcG9zaXRpb24gKGluY2x1ZGluZyBFUEggbWFya2VyIGlmIGl0IGV4aXN0cykqLwotCU9QSl9PRkZfVCBlbmRfcGhfcG9zOwotCS8qKiBwYWNrZXQgZW5kIHBvc2l0aW9uICovCi0JT1BKX09GRl9UIGVuZF9wb3M7Ci0JLyoqIHBhY2tldCBkaXN0b3JzaW9uICovCi0JZG91YmxlIGRpc3RvOworICAgIC8qKiBwYWNrZXQgc3RhcnQgcG9zaXRpb24gKGluY2x1ZGluZyBTT1AgbWFya2VyIGlmIGl0IGV4aXN0cykgKi8KKyAgICBPUEpfT0ZGX1Qgc3RhcnRfcG9zOworICAgIC8qKiBlbmQgb2YgcGFja2V0IGhlYWRlciBwb3NpdGlvbiAoaW5jbHVkaW5nIEVQSCBtYXJrZXIgaWYgaXQgZXhpc3RzKSovCisgICAgT1BKX09GRl9UIGVuZF9waF9wb3M7CisgICAgLyoqIHBhY2tldCBlbmQgcG9zaXRpb24gKi8KKyAgICBPUEpfT0ZGX1QgZW5kX3BvczsKKyAgICAvKiogcGFja2V0IGRpc3RvcnNpb24gKi8KKyAgICBkb3VibGUgZGlzdG87CiB9IG9wal9wYWNrZXRfaW5mb190OwogCiAKQEAgLTczNSwxMiArNzQ0LDEyIEBACiAgKiBNYXJrZXIgc3RydWN0dXJlCiAgKiAqLwogdHlwZWRlZiBzdHJ1Y3Qgb3BqX21hcmtlcl9pbmZvIHsKLQkvKiogbWFya2VyIHR5cGUgKi8KLQl1bnNpZ25lZCBzaG9ydCBpbnQgdHlwZTsKLQkvKiogcG9zaXRpb24gaW4gY29kZXN0cmVhbSAqLwotCU9QSl9PRkZfVCBwb3M7Ci0JLyoqIGxlbmd0aCwgbWFya2VyIHZhbCBpbmNsdWRlZCAqLwotCWludCBsZW47CisgICAgLyoqIG1hcmtlciB0eXBlICovCisgICAgdW5zaWduZWQgc2hvcnQgaW50IHR5cGU7CisgICAgLyoqIHBvc2l0aW9uIGluIGNvZGVzdHJlYW0gKi8KKyAgICBPUEpfT0ZGX1QgcG9zOworICAgIC8qKiBsZW5ndGgsIG1hcmtlciB2YWwgaW5jbHVkZWQgKi8KKyAgICBpbnQgbGVuOwogfSBvcGpfbWFya2VyX2luZm9fdDsKIC8qIDw8VW5pUEcgKi8KIApAQCAtNzQ4LDEwOCArNzU3LDEwOCBAQAogICogSW5kZXggc3RydWN0dXJlIDogSW5mb3JtYXRpb24gY29uY2VybmluZyB0aWxlLXBhcnRzCiAqLwogdHlwZWRlZiBzdHJ1Y3Qgb3BqX3RwX2luZm8gewotCS8qKiBzdGFydCBwb3NpdGlvbiBvZiB0aWxlIHBhcnQgKi8KLQlpbnQgdHBfc3RhcnRfcG9zOwotCS8qKiBlbmQgcG9zaXRpb24gb2YgdGlsZSBwYXJ0IGhlYWRlciAqLwotCWludCB0cF9lbmRfaGVhZGVyOwotCS8qKiBlbmQgcG9zaXRpb24gb2YgdGlsZSBwYXJ0ICovCi0JaW50IHRwX2VuZF9wb3M7Ci0JLyoqIHN0YXJ0IHBhY2tldCBvZiB0aWxlIHBhcnQgKi8KLQlpbnQgdHBfc3RhcnRfcGFjazsKLQkvKiogbnVtYmVyIG9mIHBhY2tldHMgb2YgdGlsZSBwYXJ0ICovCi0JaW50IHRwX251bXBhY2tzOworICAgIC8qKiBzdGFydCBwb3NpdGlvbiBvZiB0aWxlIHBhcnQgKi8KKyAgICBpbnQgdHBfc3RhcnRfcG9zOworICAgIC8qKiBlbmQgcG9zaXRpb24gb2YgdGlsZSBwYXJ0IGhlYWRlciAqLworICAgIGludCB0cF9lbmRfaGVhZGVyOworICAgIC8qKiBlbmQgcG9zaXRpb24gb2YgdGlsZSBwYXJ0ICovCisgICAgaW50IHRwX2VuZF9wb3M7CisgICAgLyoqIHN0YXJ0IHBhY2tldCBvZiB0aWxlIHBhcnQgKi8KKyAgICBpbnQgdHBfc3RhcnRfcGFjazsKKyAgICAvKiogbnVtYmVyIG9mIHBhY2tldHMgb2YgdGlsZSBwYXJ0ICovCisgICAgaW50IHRwX251bXBhY2tzOwogfSBvcGpfdHBfaW5mb190OwogCiAvKioKICAqIEluZGV4IHN0cnVjdHVyZSA6IGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aWxlcwogKi8KIHR5cGVkZWYgc3RydWN0IG9wal90aWxlX2luZm8gewotCS8qKiB2YWx1ZSBvZiB0aHJlc2ggZm9yIGVhY2ggbGF5ZXIgYnkgdGlsZSBjZnIuIE1hcmNlbGEgICAqLwotCWRvdWJsZSAqdGhyZXNoOwotCS8qKiBudW1iZXIgb2YgdGlsZSAqLwotCWludCB0aWxlbm87Ci0JLyoqIHN0YXJ0IHBvc2l0aW9uICovCi0JaW50IHN0YXJ0X3BvczsKLQkvKiogZW5kIHBvc2l0aW9uIG9mIHRoZSBoZWFkZXIgKi8KLQlpbnQgZW5kX2hlYWRlcjsKLQkvKiogZW5kIHBvc2l0aW9uICovCi0JaW50IGVuZF9wb3M7Ci0JLyoqIHByZWNpbmN0IG51bWJlciBmb3IgZWFjaCByZXNvbHV0aW9uIGxldmVsICh3aWR0aCkgKi8KLQlpbnQgcHdbMzNdOwotCS8qKiBwcmVjaW5jdCBudW1iZXIgZm9yIGVhY2ggcmVzb2x1dGlvbiBsZXZlbCAoaGVpZ2h0KSAqLwotCWludCBwaFszM107Ci0JLyoqIHByZWNpbmN0IHNpemUgKGluIHBvd2VyIG9mIDIpLCBpbiBYIGZvciBlYWNoIHJlc29sdXRpb24gbGV2ZWwgKi8KLQlpbnQgcGR4WzMzXTsKLQkvKiogcHJlY2luY3Qgc2l6ZSAoaW4gcG93ZXIgb2YgMiksIGluIFkgZm9yIGVhY2ggcmVzb2x1dGlvbiBsZXZlbCAqLwotCWludCBwZHlbMzNdOwotCS8qKiBpbmZvcm1hdGlvbiBjb25jZXJuaW5nIHBhY2tldHMgaW5zaWRlIHRpbGUgKi8KLQlvcGpfcGFja2V0X2luZm9fdCAqcGFja2V0OwotCS8qKiBhZGQgZml4ZWRfcXVhbGl0eSAqLwotCWludCBudW1waXg7Ci0JLyoqIGFkZCBmaXhlZF9xdWFsaXR5ICovCi0JZG91YmxlIGRpc3RvdGlsZTsKLSAgCS8qKiBudW1iZXIgb2YgbWFya2VycyAqLwotCWludCBtYXJrbnVtOwotCS8qKiBsaXN0IG9mIG1hcmtlcnMgKi8KLQlvcGpfbWFya2VyX2luZm9fdCAqbWFya2VyOwotCS8qKiBhY3R1YWwgc2l6ZSBvZiBtYXJrZXJzIGFycmF5ICovCi0JaW50IG1heG1hcmtudW07Ci0JLyoqIG51bWJlciBvZiB0aWxlIHBhcnRzICovCi0JaW50IG51bV90cHM7Ci0JLyoqIGluZm9ybWF0aW9uIGNvbmNlcm5pbmcgdGlsZSBwYXJ0cyAqLwotCW9wal90cF9pbmZvX3QgKnRwOworICAgIC8qKiB2YWx1ZSBvZiB0aHJlc2ggZm9yIGVhY2ggbGF5ZXIgYnkgdGlsZSBjZnIuIE1hcmNlbGEgICAqLworICAgIGRvdWJsZSAqdGhyZXNoOworICAgIC8qKiBudW1iZXIgb2YgdGlsZSAqLworICAgIGludCB0aWxlbm87CisgICAgLyoqIHN0YXJ0IHBvc2l0aW9uICovCisgICAgaW50IHN0YXJ0X3BvczsKKyAgICAvKiogZW5kIHBvc2l0aW9uIG9mIHRoZSBoZWFkZXIgKi8KKyAgICBpbnQgZW5kX2hlYWRlcjsKKyAgICAvKiogZW5kIHBvc2l0aW9uICovCisgICAgaW50IGVuZF9wb3M7CisgICAgLyoqIHByZWNpbmN0IG51bWJlciBmb3IgZWFjaCByZXNvbHV0aW9uIGxldmVsICh3aWR0aCkgKi8KKyAgICBpbnQgcHdbMzNdOworICAgIC8qKiBwcmVjaW5jdCBudW1iZXIgZm9yIGVhY2ggcmVzb2x1dGlvbiBsZXZlbCAoaGVpZ2h0KSAqLworICAgIGludCBwaFszM107CisgICAgLyoqIHByZWNpbmN0IHNpemUgKGluIHBvd2VyIG9mIDIpLCBpbiBYIGZvciBlYWNoIHJlc29sdXRpb24gbGV2ZWwgKi8KKyAgICBpbnQgcGR4WzMzXTsKKyAgICAvKiogcHJlY2luY3Qgc2l6ZSAoaW4gcG93ZXIgb2YgMiksIGluIFkgZm9yIGVhY2ggcmVzb2x1dGlvbiBsZXZlbCAqLworICAgIGludCBwZHlbMzNdOworICAgIC8qKiBpbmZvcm1hdGlvbiBjb25jZXJuaW5nIHBhY2tldHMgaW5zaWRlIHRpbGUgKi8KKyAgICBvcGpfcGFja2V0X2luZm9fdCAqcGFja2V0OworICAgIC8qKiBhZGQgZml4ZWRfcXVhbGl0eSAqLworICAgIGludCBudW1waXg7CisgICAgLyoqIGFkZCBmaXhlZF9xdWFsaXR5ICovCisgICAgZG91YmxlIGRpc3RvdGlsZTsKKyAgICAvKiogbnVtYmVyIG9mIG1hcmtlcnMgKi8KKyAgICBpbnQgbWFya251bTsKKyAgICAvKiogbGlzdCBvZiBtYXJrZXJzICovCisgICAgb3BqX21hcmtlcl9pbmZvX3QgKm1hcmtlcjsKKyAgICAvKiogYWN0dWFsIHNpemUgb2YgbWFya2VycyBhcnJheSAqLworICAgIGludCBtYXhtYXJrbnVtOworICAgIC8qKiBudW1iZXIgb2YgdGlsZSBwYXJ0cyAqLworICAgIGludCBudW1fdHBzOworICAgIC8qKiBpbmZvcm1hdGlvbiBjb25jZXJuaW5nIHRpbGUgcGFydHMgKi8KKyAgICBvcGpfdHBfaW5mb190ICp0cDsKIH0gb3BqX3RpbGVfaW5mb190OwogCiAvKioKICAqIEluZGV4IHN0cnVjdHVyZSBvZiB0aGUgY29kZXN0cmVhbQogKi8KIHR5cGVkZWYgc3RydWN0IG9wal9jb2Rlc3RyZWFtX2luZm8gewotCS8qKiBtYXhpbXVtIGRpc3RvcnRpb24gcmVkdWN0aW9uIG9uIHRoZSB3aG9sZSBpbWFnZSAoYWRkIGZvciBNYXJjZWxhKSAqLwotCWRvdWJsZSBEX21heDsKLQkvKiogcGFja2V0IG51bWJlciAqLwotCWludCBwYWNrbm87Ci0JLyoqIHdyaXRpbmcgdGhlIHBhY2tldCBpbiB0aGUgaW5kZXggd2l0aCB0Ml9lbmNvZGVfcGFja2V0cyAqLwotCWludCBpbmRleF93cml0ZTsKLQkvKiogaW1hZ2Ugd2lkdGggKi8KLQlpbnQgaW1hZ2VfdzsKLQkvKiogaW1hZ2UgaGVpZ2h0ICovCi0JaW50IGltYWdlX2g7Ci0JLyoqIHByb2dyZXNzaW9uIG9yZGVyICovCi0JT1BKX1BST0dfT1JERVIgcHJvZzsKLQkvKiogdGlsZSBzaXplIGluIHggKi8KLQlpbnQgdGlsZV94OwotCS8qKiB0aWxlIHNpemUgaW4geSAqLwotCWludCB0aWxlX3k7Ci0JLyoqICovCi0JaW50IHRpbGVfT3g7Ci0JLyoqICovCi0JaW50IHRpbGVfT3k7Ci0JLyoqIG51bWJlciBvZiB0aWxlcyBpbiBYICovCi0JaW50IHR3OwotCS8qKiBudW1iZXIgb2YgdGlsZXMgaW4gWSAqLwotCWludCB0aDsKLQkvKiogY29tcG9uZW50IG51bWJlcnMgKi8KLQlpbnQgbnVtY29tcHM7Ci0JLyoqIG51bWJlciBvZiBsYXllciAqLwotCWludCBudW1sYXllcnM7Ci0JLyoqIG51bWJlciBvZiBkZWNvbXBvc2l0aW9uIGZvciBlYWNoIGNvbXBvbmVudCAqLwotCWludCAqbnVtZGVjb21wb3M7Ci0vKiBVbmlQRz4+ICovCi0JLyoqIG51bWJlciBvZiBtYXJrZXJzICovCi0JaW50IG1hcmtudW07Ci0JLyoqIGxpc3Qgb2YgbWFya2VycyAqLwotCW9wal9tYXJrZXJfaW5mb190ICptYXJrZXI7Ci0JLyoqIGFjdHVhbCBzaXplIG9mIG1hcmtlcnMgYXJyYXkgKi8KLQlpbnQgbWF4bWFya251bTsKLS8qIDw8VW5pUEcgKi8KLQkvKiogbWFpbiBoZWFkZXIgcG9zaXRpb24gKi8KLQlpbnQgbWFpbl9oZWFkX3N0YXJ0OwotCS8qKiBtYWluIGhlYWRlciBwb3NpdGlvbiAqLwotCWludCBtYWluX2hlYWRfZW5kOwotCS8qKiBjb2Rlc3RyZWFtJ3Mgc2l6ZSAqLwotCWludCBjb2Rlc3RyZWFtX3NpemU7Ci0JLyoqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aWxlcyBpbnNpZGUgaW1hZ2UgKi8KLQlvcGpfdGlsZV9pbmZvX3QgKnRpbGU7CisgICAgLyoqIG1heGltdW0gZGlzdG9ydGlvbiByZWR1Y3Rpb24gb24gdGhlIHdob2xlIGltYWdlIChhZGQgZm9yIE1hcmNlbGEpICovCisgICAgZG91YmxlIERfbWF4OworICAgIC8qKiBwYWNrZXQgbnVtYmVyICovCisgICAgaW50IHBhY2tubzsKKyAgICAvKiogd3JpdGluZyB0aGUgcGFja2V0IGluIHRoZSBpbmRleCB3aXRoIHQyX2VuY29kZV9wYWNrZXRzICovCisgICAgaW50IGluZGV4X3dyaXRlOworICAgIC8qKiBpbWFnZSB3aWR0aCAqLworICAgIGludCBpbWFnZV93OworICAgIC8qKiBpbWFnZSBoZWlnaHQgKi8KKyAgICBpbnQgaW1hZ2VfaDsKKyAgICAvKiogcHJvZ3Jlc3Npb24gb3JkZXIgKi8KKyAgICBPUEpfUFJPR19PUkRFUiBwcm9nOworICAgIC8qKiB0aWxlIHNpemUgaW4geCAqLworICAgIGludCB0aWxlX3g7CisgICAgLyoqIHRpbGUgc2l6ZSBpbiB5ICovCisgICAgaW50IHRpbGVfeTsKKyAgICAvKiogKi8KKyAgICBpbnQgdGlsZV9PeDsKKyAgICAvKiogKi8KKyAgICBpbnQgdGlsZV9PeTsKKyAgICAvKiogbnVtYmVyIG9mIHRpbGVzIGluIFggKi8KKyAgICBpbnQgdHc7CisgICAgLyoqIG51bWJlciBvZiB0aWxlcyBpbiBZICovCisgICAgaW50IHRoOworICAgIC8qKiBjb21wb25lbnQgbnVtYmVycyAqLworICAgIGludCBudW1jb21wczsKKyAgICAvKiogbnVtYmVyIG9mIGxheWVyICovCisgICAgaW50IG51bWxheWVyczsKKyAgICAvKiogbnVtYmVyIG9mIGRlY29tcG9zaXRpb24gZm9yIGVhY2ggY29tcG9uZW50ICovCisgICAgaW50ICpudW1kZWNvbXBvczsKKyAgICAvKiBVbmlQRz4+ICovCisgICAgLyoqIG51bWJlciBvZiBtYXJrZXJzICovCisgICAgaW50IG1hcmtudW07CisgICAgLyoqIGxpc3Qgb2YgbWFya2VycyAqLworICAgIG9wal9tYXJrZXJfaW5mb190ICptYXJrZXI7CisgICAgLyoqIGFjdHVhbCBzaXplIG9mIG1hcmtlcnMgYXJyYXkgKi8KKyAgICBpbnQgbWF4bWFya251bTsKKyAgICAvKiA8PFVuaVBHICovCisgICAgLyoqIG1haW4gaGVhZGVyIHBvc2l0aW9uICovCisgICAgaW50IG1haW5faGVhZF9zdGFydDsKKyAgICAvKiogbWFpbiBoZWFkZXIgcG9zaXRpb24gKi8KKyAgICBpbnQgbWFpbl9oZWFkX2VuZDsKKyAgICAvKiogY29kZXN0cmVhbSdzIHNpemUgKi8KKyAgICBpbnQgY29kZXN0cmVhbV9zaXplOworICAgIC8qKiBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGlsZXMgaW5zaWRlIGltYWdlICovCisgICAgb3BqX3RpbGVfaW5mb190ICp0aWxlOwogfSBvcGpfY29kZXN0cmVhbV9pbmZvX3Q7CiAKIC8qIDwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtODU4LDM2ICs4NjcsMzUgQEAKIC8qKgogICogVGlsZS1jb21wb25lbnQgY29kaW5nIHBhcmFtZXRlcnMgaW5mb3JtYXRpb24KICAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3RjY3BfaW5mbwotewotCS8qKiBjb21wb25lbnQgaW5kZXggKi8KLQlPUEpfVUlOVDMyIGNvbXBubzsKLQkvKiogY29kaW5nIHN0eWxlICovCi0JT1BKX1VJTlQzMiBjc3R5OwotCS8qKiBudW1iZXIgb2YgcmVzb2x1dGlvbnMgKi8KLQlPUEpfVUlOVDMyIG51bXJlc29sdXRpb25zOwotCS8qKiBjb2RlLWJsb2NrcyB3aWR0aCAqLwotCU9QSl9VSU5UMzIgY2Jsa3c7Ci0JLyoqIGNvZGUtYmxvY2tzIGhlaWdodCAqLwotCU9QSl9VSU5UMzIgY2Jsa2g7Ci0JLyoqIGNvZGUtYmxvY2sgY29kaW5nIHN0eWxlICovCi0JT1BKX1VJTlQzMiBjYmxrc3R5OwotCS8qKiBkaXNjcmV0ZSB3YXZlbGV0IHRyYW5zZm9ybSBpZGVudGlmaWVyICovCi0JT1BKX1VJTlQzMiBxbWZiaWQ7Ci0JLyoqIHF1YW50aXNhdGlvbiBzdHlsZSAqLwotCU9QSl9VSU5UMzIgcW50c3R5OwotCS8qKiBzdGVwc2l6ZXMgdXNlZCBmb3IgcXVhbnRpemF0aW9uICovCi0JT1BKX1VJTlQzMiBzdGVwc2l6ZXNfbWFudFtPUEpfSjJLX01BWEJBTkRTXTsKLQkvKiogc3RlcHNpemVzIHVzZWQgZm9yIHF1YW50aXphdGlvbiAqLwotCU9QSl9VSU5UMzIgc3RlcHNpemVzX2V4cG5bT1BKX0oyS19NQVhCQU5EU107Ci0JLyoqIG51bWJlciBvZiBndWFyZCBiaXRzICovCi0JT1BKX1VJTlQzMiBudW1nYml0czsKLQkvKiogUmVnaW9uIE9mIEludGVyZXN0IHNoaWZ0ICovCi0JT1BKX0lOVDMyIHJvaXNoaWZ0OwotCS8qKiBwcmVjaW5jdCB3aWR0aCAqLwotCU9QSl9VSU5UMzIgcHJjd1tPUEpfSjJLX01BWFJMVkxTXTsKLQkvKiogcHJlY2luY3QgaGVpZ2h0ICovCi0JT1BKX1VJTlQzMiBwcmNoW09QSl9KMktfTUFYUkxWTFNdOwordHlwZWRlZiBzdHJ1Y3Qgb3BqX3RjY3BfaW5mbyB7CisgICAgLyoqIGNvbXBvbmVudCBpbmRleCAqLworICAgIE9QSl9VSU5UMzIgY29tcG5vOworICAgIC8qKiBjb2Rpbmcgc3R5bGUgKi8KKyAgICBPUEpfVUlOVDMyIGNzdHk7CisgICAgLyoqIG51bWJlciBvZiByZXNvbHV0aW9ucyAqLworICAgIE9QSl9VSU5UMzIgbnVtcmVzb2x1dGlvbnM7CisgICAgLyoqIGxvZzIgb2YgY29kZS1ibG9ja3Mgd2lkdGggKi8KKyAgICBPUEpfVUlOVDMyIGNibGt3OworICAgIC8qKiBsb2cyIG9mIGNvZGUtYmxvY2tzIGhlaWdodCAqLworICAgIE9QSl9VSU5UMzIgY2Jsa2g7CisgICAgLyoqIGNvZGUtYmxvY2sgY29kaW5nIHN0eWxlICovCisgICAgT1BKX1VJTlQzMiBjYmxrc3R5OworICAgIC8qKiBkaXNjcmV0ZSB3YXZlbGV0IHRyYW5zZm9ybSBpZGVudGlmaWVyOiAwID0gOS03IGlycmV2ZXJzaWJsZSwgMSA9IDUtMyByZXZlcnNpYmxlICovCisgICAgT1BKX1VJTlQzMiBxbWZiaWQ7CisgICAgLyoqIHF1YW50aXNhdGlvbiBzdHlsZSAqLworICAgIE9QSl9VSU5UMzIgcW50c3R5OworICAgIC8qKiBzdGVwc2l6ZXMgdXNlZCBmb3IgcXVhbnRpemF0aW9uICovCisgICAgT1BKX1VJTlQzMiBzdGVwc2l6ZXNfbWFudFtPUEpfSjJLX01BWEJBTkRTXTsKKyAgICAvKiogc3RlcHNpemVzIHVzZWQgZm9yIHF1YW50aXphdGlvbiAqLworICAgIE9QSl9VSU5UMzIgc3RlcHNpemVzX2V4cG5bT1BKX0oyS19NQVhCQU5EU107CisgICAgLyoqIG51bWJlciBvZiBndWFyZCBiaXRzICovCisgICAgT1BKX1VJTlQzMiBudW1nYml0czsKKyAgICAvKiogUmVnaW9uIE9mIEludGVyZXN0IHNoaWZ0ICovCisgICAgT1BKX0lOVDMyIHJvaXNoaWZ0OworICAgIC8qKiBwcmVjaW5jdCB3aWR0aCAqLworICAgIE9QSl9VSU5UMzIgcHJjd1tPUEpfSjJLX01BWFJMVkxTXTsKKyAgICAvKiogcHJlY2luY3QgaGVpZ2h0ICovCisgICAgT1BKX1VJTlQzMiBwcmNoW09QSl9KMktfTUFYUkxWTFNdOwogfQogb3BqX3RjY3BfaW5mb190OwogCkBAIC04OTYsMTkgKzkwNCwxOSBAQAogICovCiB0eXBlZGVmIHN0cnVjdCBvcGpfdGlsZV92Ml9pbmZvIHsKIAotCS8qKiBudW1iZXIgKGluZGV4KSBvZiB0aWxlICovCi0JaW50IHRpbGVubzsKLQkvKiogY29kaW5nIHN0eWxlICovCi0JT1BKX1VJTlQzMiBjc3R5OwotCS8qKiBwcm9ncmVzc2lvbiBvcmRlciAqLwotCU9QSl9QUk9HX09SREVSIHByZzsKLQkvKiogbnVtYmVyIG9mIGxheWVycyAqLwotCU9QSl9VSU5UMzIgbnVtbGF5ZXJzOwotCS8qKiBtdWx0aS1jb21wb25lbnQgdHJhbnNmb3JtIGlkZW50aWZpZXIgKi8KLQlPUEpfVUlOVDMyIG1jdDsKKyAgICAvKiogbnVtYmVyIChpbmRleCkgb2YgdGlsZSAqLworICAgIGludCB0aWxlbm87CisgICAgLyoqIGNvZGluZyBzdHlsZSAqLworICAgIE9QSl9VSU5UMzIgY3N0eTsKKyAgICAvKiogcHJvZ3Jlc3Npb24gb3JkZXIgKi8KKyAgICBPUEpfUFJPR19PUkRFUiBwcmc7CisgICAgLyoqIG51bWJlciBvZiBsYXllcnMgKi8KKyAgICBPUEpfVUlOVDMyIG51bWxheWVyczsKKyAgICAvKiogbXVsdGktY29tcG9uZW50IHRyYW5zZm9ybSBpZGVudGlmaWVyICovCisgICAgT1BKX1VJTlQzMiBtY3Q7CiAKLQkvKiogaW5mb3JtYXRpb24gY29uY2VybmluZyB0aWxlIGNvbXBvbmVudCBwYXJhbWV0ZXJzKi8KLQlvcGpfdGNjcF9pbmZvX3QgKnRjY3BfaW5mbzsKKyAgICAvKiogaW5mb3JtYXRpb24gY29uY2VybmluZyB0aWxlIGNvbXBvbmVudCBwYXJhbWV0ZXJzKi8KKyAgICBvcGpfdGNjcF9pbmZvX3QgKnRjY3BfaW5mbzsKIAogfSBvcGpfdGlsZV9pbmZvX3YyX3Q7CiAKQEAgLTkxNiwyOCArOTI0LDI4IEBACiAgKiBJbmZvcm1hdGlvbiBzdHJ1Y3R1cmUgYWJvdXQgdGhlIGNvZGVzdHJlYW0gKEZJWE1FIHNob3VsZCBiZSBleHBhbmQgYW5kIGVuaGFuY2UpCiAgKi8KIHR5cGVkZWYgc3RydWN0IG9wal9jb2Rlc3RyZWFtX2luZm9fdjIgewotCS8qIFRpbGUgaW5mbyAqLwotCS8qKiB0aWxlIG9yaWdpbiBpbiB4ID0gWFRPc2l6ICovCi0JT1BKX1VJTlQzMiB0eDA7Ci0JLyoqIHRpbGUgb3JpZ2luIGluIHkgPSBZVE9zaXogKi8KLQlPUEpfVUlOVDMyIHR5MDsKLQkvKiogdGlsZSBzaXplIGluIHggPSBYVHNpeiAqLwotCU9QSl9VSU5UMzIgdGR4OwotCS8qKiB0aWxlIHNpemUgaW4geSA9IFlUc2l6ICovCi0JT1BKX1VJTlQzMiB0ZHk7Ci0JLyoqIG51bWJlciBvZiB0aWxlcyBpbiBYICovCi0JT1BKX1VJTlQzMiB0dzsKLQkvKiogbnVtYmVyIG9mIHRpbGVzIGluIFkgKi8KLQlPUEpfVUlOVDMyIHRoOworICAgIC8qIFRpbGUgaW5mbyAqLworICAgIC8qKiB0aWxlIG9yaWdpbiBpbiB4ID0gWFRPc2l6ICovCisgICAgT1BKX1VJTlQzMiB0eDA7CisgICAgLyoqIHRpbGUgb3JpZ2luIGluIHkgPSBZVE9zaXogKi8KKyAgICBPUEpfVUlOVDMyIHR5MDsKKyAgICAvKiogdGlsZSBzaXplIGluIHggPSBYVHNpeiAqLworICAgIE9QSl9VSU5UMzIgdGR4OworICAgIC8qKiB0aWxlIHNpemUgaW4geSA9IFlUc2l6ICovCisgICAgT1BKX1VJTlQzMiB0ZHk7CisgICAgLyoqIG51bWJlciBvZiB0aWxlcyBpbiBYICovCisgICAgT1BKX1VJTlQzMiB0dzsKKyAgICAvKiogbnVtYmVyIG9mIHRpbGVzIGluIFkgKi8KKyAgICBPUEpfVUlOVDMyIHRoOwogCi0JLyoqIG51bWJlciBvZiBjb21wb25lbnRzKi8KLQlPUEpfVUlOVDMyIG5iY29tcHM7CisgICAgLyoqIG51bWJlciBvZiBjb21wb25lbnRzKi8KKyAgICBPUEpfVUlOVDMyIG5iY29tcHM7CiAKLQkvKiogRGVmYXVsdCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGlsZXMgaW5zaWRlIGltYWdlICovCi0Jb3BqX3RpbGVfaW5mb192Ml90IG1fZGVmYXVsdF90aWxlX2luZm87CisgICAgLyoqIERlZmF1bHQgaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRpbGVzIGluc2lkZSBpbWFnZSAqLworICAgIG9wal90aWxlX2luZm9fdjJfdCBtX2RlZmF1bHRfdGlsZV9pbmZvOwogCi0JLyoqIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aWxlcyBpbnNpZGUgaW1hZ2UgKi8KLQlvcGpfdGlsZV9pbmZvX3YyX3QgKnRpbGVfaW5mbzsgLyogRklYTUUgbm90IHVzZWQgZm9yIHRoZSBtb21lbnQgKi8KKyAgICAvKiogaW5mb3JtYXRpb24gcmVnYXJkaW5nIHRpbGVzIGluc2lkZSBpbWFnZSAqLworICAgIG9wal90aWxlX2luZm9fdjJfdCAqdGlsZV9pbmZvOyAvKiBGSVhNRSBub3QgdXNlZCBmb3IgdGhlIG1vbWVudCAqLwogCiB9IG9wal9jb2Rlc3RyZWFtX2luZm9fdjJfdDsKIApAQCAtOTQ2LDEyICs5NTQsMTIgQEAKICAqIEluZGV4IHN0cnVjdHVyZSBhYm91dCBhIHRpbGUgcGFydAogICovCiB0eXBlZGVmIHN0cnVjdCBvcGpfdHBfaW5kZXggewotCS8qKiBzdGFydCBwb3NpdGlvbiAqLwotCU9QSl9PRkZfVCBzdGFydF9wb3M7Ci0JLyoqIGVuZCBwb3NpdGlvbiBvZiB0aGUgaGVhZGVyICovCi0JT1BKX09GRl9UIGVuZF9oZWFkZXI7Ci0JLyoqIGVuZCBwb3NpdGlvbiAqLwotCU9QSl9PRkZfVCBlbmRfcG9zOworICAgIC8qKiBzdGFydCBwb3NpdGlvbiAqLworICAgIE9QSl9PRkZfVCBzdGFydF9wb3M7CisgICAgLyoqIGVuZCBwb3NpdGlvbiBvZiB0aGUgaGVhZGVyICovCisgICAgT1BKX09GRl9UIGVuZF9oZWFkZXI7CisgICAgLyoqIGVuZCBwb3NpdGlvbiAqLworICAgIE9QSl9PRkZfVCBlbmRfcG9zOwogCiB9IG9wal90cF9pbmRleF90OwogCkBAIC05NTksMzEgKzk2NywzMSBAQAogICogSW5kZXggc3RydWN0dXJlIGFib3V0IGEgdGlsZQogICovCiB0eXBlZGVmIHN0cnVjdCBvcGpfdGlsZV9pbmRleCB7Ci0JLyoqIHRpbGUgaW5kZXggKi8KLQlPUEpfVUlOVDMyIHRpbGVubzsKKyAgICAvKiogdGlsZSBpbmRleCAqLworICAgIE9QSl9VSU5UMzIgdGlsZW5vOwogCi0JLyoqIG51bWJlciBvZiB0aWxlIHBhcnRzICovCi0JT1BKX1VJTlQzMiBuYl90cHM7Ci0JLyoqIGN1cnJlbnQgbmIgb2YgdGlsZSBwYXJ0IChhbGxvY2F0ZWQpKi8KLQlPUEpfVUlOVDMyIGN1cnJlbnRfbmJfdHBzOwotCS8qKiBjdXJyZW50IHRpbGUtcGFydCBpbmRleCAqLwotCU9QSl9VSU5UMzIgY3VycmVudF90cHNubzsKLQkvKiogaW5mb3JtYXRpb24gY29uY2VybmluZyB0aWxlIHBhcnRzICovCi0Jb3BqX3RwX2luZGV4X3QgKnRwX2luZGV4OworICAgIC8qKiBudW1iZXIgb2YgdGlsZSBwYXJ0cyAqLworICAgIE9QSl9VSU5UMzIgbmJfdHBzOworICAgIC8qKiBjdXJyZW50IG5iIG9mIHRpbGUgcGFydCAoYWxsb2NhdGVkKSovCisgICAgT1BKX1VJTlQzMiBjdXJyZW50X25iX3RwczsKKyAgICAvKiogY3VycmVudCB0aWxlLXBhcnQgaW5kZXggKi8KKyAgICBPUEpfVUlOVDMyIGN1cnJlbnRfdHBzbm87CisgICAgLyoqIGluZm9ybWF0aW9uIGNvbmNlcm5pbmcgdGlsZSBwYXJ0cyAqLworICAgIG9wal90cF9pbmRleF90ICp0cF9pbmRleDsKIAotCS8qIFVuaVBHPj4gKi8gLyogTk9UIFVTRUQgRk9SIFRIRSBNT01FTlQgSU4gVEhFIFYyIFZFUlNJT04gKi8KLQkJLyoqIG51bWJlciBvZiBtYXJrZXJzICovCi0JCU9QSl9VSU5UMzIgbWFya251bTsKLQkJLyoqIGxpc3Qgb2YgbWFya2VycyAqLwotCQlvcGpfbWFya2VyX2luZm9fdCAqbWFya2VyOwotCQkvKiogYWN0dWFsIHNpemUgb2YgbWFya2VycyBhcnJheSAqLwotCQlPUEpfVUlOVDMyIG1heG1hcmtudW07Ci0JLyogPDxVbmlQRyAqLworICAgIC8qIFVuaVBHPj4gKi8gLyogTk9UIFVTRUQgRk9SIFRIRSBNT01FTlQgSU4gVEhFIFYyIFZFUlNJT04gKi8KKyAgICAvKiogbnVtYmVyIG9mIG1hcmtlcnMgKi8KKyAgICBPUEpfVUlOVDMyIG1hcmtudW07CisgICAgLyoqIGxpc3Qgb2YgbWFya2VycyAqLworICAgIG9wal9tYXJrZXJfaW5mb190ICptYXJrZXI7CisgICAgLyoqIGFjdHVhbCBzaXplIG9mIG1hcmtlcnMgYXJyYXkgKi8KKyAgICBPUEpfVUlOVDMyIG1heG1hcmtudW07CisgICAgLyogPDxVbmlQRyAqLwogCi0JLyoqIHBhY2tldCBudW1iZXIgKi8KLQlPUEpfVUlOVDMyIG5iX3BhY2tldDsKLQkvKiogaW5mb3JtYXRpb24gY29uY2VybmluZyBwYWNrZXRzIGluc2lkZSB0aWxlICovCi0Jb3BqX3BhY2tldF9pbmZvX3QgKnBhY2tldF9pbmRleDsKKyAgICAvKiogcGFja2V0IG51bWJlciAqLworICAgIE9QSl9VSU5UMzIgbmJfcGFja2V0OworICAgIC8qKiBpbmZvcm1hdGlvbiBjb25jZXJuaW5nIHBhY2tldHMgaW5zaWRlIHRpbGUgKi8KKyAgICBvcGpfcGFja2V0X2luZm9fdCAqcGFja2V0X2luZGV4OwogCiB9IG9wal90aWxlX2luZGV4X3Q7CiAKQEAgLTk5MSwyOSArOTk5LDI5IEBACiAgKiBJbmRleCBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGVzdHJlYW0gKEZJWE1FIHNob3VsZCBiZSBleHBhbmQgYW5kIGVuaGFuY2UpCiAgKi8KIHR5cGVkZWYgc3RydWN0IG9wal9jb2Rlc3RyZWFtX2luZGV4IHsKLQkvKiogbWFpbiBoZWFkZXIgc3RhcnQgcG9zaXRpb24gKFNPQyBwb3NpdGlvbikgKi8KLQlPUEpfT0ZGX1QgbWFpbl9oZWFkX3N0YXJ0OwotCS8qKiBtYWluIGhlYWRlciBlbmQgcG9zaXRpb24gKGZpcnN0IFNPVCBwb3NpdGlvbikgKi8KLQlPUEpfT0ZGX1QgbWFpbl9oZWFkX2VuZDsKKyAgICAvKiogbWFpbiBoZWFkZXIgc3RhcnQgcG9zaXRpb24gKFNPQyBwb3NpdGlvbikgKi8KKyAgICBPUEpfT0ZGX1QgbWFpbl9oZWFkX3N0YXJ0OworICAgIC8qKiBtYWluIGhlYWRlciBlbmQgcG9zaXRpb24gKGZpcnN0IFNPVCBwb3NpdGlvbikgKi8KKyAgICBPUEpfT0ZGX1QgbWFpbl9oZWFkX2VuZDsKIAotCS8qKiBjb2Rlc3RyZWFtJ3Mgc2l6ZSAqLwotCU9QSl9VSU5UNjQgY29kZXN0cmVhbV9zaXplOworICAgIC8qKiBjb2Rlc3RyZWFtJ3Mgc2l6ZSAqLworICAgIE9QSl9VSU5UNjQgY29kZXN0cmVhbV9zaXplOwogCi0vKiBVbmlQRz4+ICovIC8qIE5PVCBVU0VEIEZPUiBUSEUgTU9NRU5UIElOIFRIRSBWMiBWRVJTSU9OICovCi0JLyoqIG51bWJlciBvZiBtYXJrZXJzICovCi0JT1BKX1VJTlQzMiBtYXJrbnVtOwotCS8qKiBsaXN0IG9mIG1hcmtlcnMgKi8KLQlvcGpfbWFya2VyX2luZm9fdCAqbWFya2VyOwotCS8qKiBhY3R1YWwgc2l6ZSBvZiBtYXJrZXJzIGFycmF5ICovCi0JT1BKX1VJTlQzMiBtYXhtYXJrbnVtOwotLyogPDxVbmlQRyAqLworICAgIC8qIFVuaVBHPj4gKi8gLyogTk9UIFVTRUQgRk9SIFRIRSBNT01FTlQgSU4gVEhFIFYyIFZFUlNJT04gKi8KKyAgICAvKiogbnVtYmVyIG9mIG1hcmtlcnMgKi8KKyAgICBPUEpfVUlOVDMyIG1hcmtudW07CisgICAgLyoqIGxpc3Qgb2YgbWFya2VycyAqLworICAgIG9wal9tYXJrZXJfaW5mb190ICptYXJrZXI7CisgICAgLyoqIGFjdHVhbCBzaXplIG9mIG1hcmtlcnMgYXJyYXkgKi8KKyAgICBPUEpfVUlOVDMyIG1heG1hcmtudW07CisgICAgLyogPDxVbmlQRyAqLwogCi0JLyoqICovCi0JT1BKX1VJTlQzMiBuYl9vZl90aWxlczsKLQkvKiogKi8KLQlvcGpfdGlsZV9pbmRleF90ICp0aWxlX2luZGV4OyAvKiBGSVhNRSBub3QgdXNlZCBmb3IgdGhlIG1vbWVudCAqLworICAgIC8qKiAqLworICAgIE9QSl9VSU5UMzIgbmJfb2ZfdGlsZXM7CisgICAgLyoqICovCisgICAgb3BqX3RpbGVfaW5kZXhfdCAqdGlsZV9pbmRleDsgLyogRklYTUUgbm90IHVzZWQgZm9yIHRoZSBtb21lbnQgKi8KIAotfW9wal9jb2Rlc3RyZWFtX2luZGV4X3Q7Cit9IG9wal9jb2Rlc3RyZWFtX2luZGV4X3Q7CiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4gKi8KIAogLyoKQEAgLTEwMjcsOCArMTAzNSw4IEBACiAgKiBFWFBFUklNRU5UQUwgRk9SIFRIRSBNT01FTlQKICAqLwogdHlwZWRlZiBzdHJ1Y3Qgb3BqX2pwMl9tZXRhZGF0YSB7Ci0JLyoqICovCi0JT1BKX0lOVDMyCW5vdF91c2VkOworICAgIC8qKiAqLworICAgIE9QSl9JTlQzMiAgIG5vdF91c2VkOwogCiB9IG9wal9qcDJfbWV0YWRhdGFfdDsKIApAQCAtMTAzNyw4ICsxMDQ1LDggQEAKICAqIEVYUEVSSU1FTlRBTCBGT1IgVEhFIE1PTUVOVAogICovCiB0eXBlZGVmIHN0cnVjdCBvcGpfanAyX2luZGV4IHsKLQkvKiogKi8KLQlPUEpfSU5UMzIJbm90X3VzZWQ7CisgICAgLyoqICovCisgICAgT1BKX0lOVDMyICAgbm90X3VzZWQ7CiAKIH0gb3BqX2pwMl9pbmRleF90OwogCkBAIC0xMDQ4LDcgKzEwNTYsNyBAQAogI2VuZGlmCiAKIAotLyogCisvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgb3BlbmpwZWcgdmVyc2lvbgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTA1Nyw3ICsxMDY1LDcgQEAKIC8qIEdldCB0aGUgdmVyc2lvbiBvZiB0aGUgb3BlbmpwZWcgbGlicmFyeSovCiBPUEpfQVBJIGNvbnN0IGNoYXIgKiBPUEpfQ0FMTENPTlYgb3BqX3ZlcnNpb24odm9pZCk7CiAKLS8qIAorLyoKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIGltYWdlIGZ1bmN0aW9ucyBkZWZpbml0aW9ucwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTA3MSw3ICsxMDc5LDggQEAKICAqIEBwYXJhbSBjbHJzcGMgICAgICAgIGltYWdlIGNvbG9yIHNwYWNlCiAgKiBAcmV0dXJuIHJldHVybnMgICAgICBhIG5ldyBpbWFnZSBzdHJ1Y3R1cmUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQogICogKi8KLU9QSl9BUEkgb3BqX2ltYWdlX3QqIE9QSl9DQUxMQ09OViBvcGpfaW1hZ2VfY3JlYXRlKE9QSl9VSU5UMzIgbnVtY21wdHMsIG9wal9pbWFnZV9jbXB0cGFybV90ICpjbXB0cGFybXMsIE9QSl9DT0xPUl9TUEFDRSBjbHJzcGMpOworT1BKX0FQSSBvcGpfaW1hZ2VfdCogT1BKX0NBTExDT05WIG9wal9pbWFnZV9jcmVhdGUoT1BKX1VJTlQzMiBudW1jbXB0cywKKyAgICAgICAgb3BqX2ltYWdlX2NtcHRwYXJtX3QgKmNtcHRwYXJtcywgT1BKX0NPTE9SX1NQQUNFIGNscnNwYyk7CiAKIC8qKgogICogRGVhbGxvY2F0ZSBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhbiBpbWFnZQpAQCAtMTA4MywxNSArMTA5MiwzNyBAQAogLyoqCiAgKiBDcmVhdGVzIGFuIGltYWdlIHdpdGhvdXQgYWxsb2NhdGluZyBtZW1vcnkgZm9yIHRoZSBpbWFnZSAodXNlZCBpbiB0aGUgbmV3IHZlcnNpb24gb2YgdGhlIGxpYnJhcnkpLgogICoKLSAqIEBwYXJhbQludW1jbXB0cyAgICB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMKLSAqIEBwYXJhbQljbXB0cGFybXMgICB0aGUgY29tcG9uZW50cyBwYXJhbWV0ZXJzCi0gKiBAcGFyYW0JY2xyc3BjICAgICAgdGhlIGltYWdlIGNvbG9yIHNwYWNlCisgKiBAcGFyYW0gICBudW1jbXB0cyAgICB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMKKyAqIEBwYXJhbSAgIGNtcHRwYXJtcyAgIHRoZSBjb21wb25lbnRzIHBhcmFtZXRlcnMKKyAqIEBwYXJhbSAgIGNscnNwYyAgICAgIHRoZSBpbWFnZSBjb2xvciBzcGFjZQogICoKLSAqIEByZXR1cm4JYSBuZXcgaW1hZ2Ugc3RydWN0dXJlIGlmIHN1Y2Nlc3NmdWwsIE5VTEwgb3RoZXJ3aXNlLgorICogQHJldHVybiAgYSBuZXcgaW1hZ2Ugc3RydWN0dXJlIGlmIHN1Y2Nlc3NmdWwsIE5VTEwgb3RoZXJ3aXNlLgogKi8KLU9QSl9BUEkgb3BqX2ltYWdlX3QqIE9QSl9DQUxMQ09OViBvcGpfaW1hZ2VfdGlsZV9jcmVhdGUoT1BKX1VJTlQzMiBudW1jbXB0cywgb3BqX2ltYWdlX2NtcHRwYXJtX3QgKmNtcHRwYXJtcywgT1BKX0NPTE9SX1NQQUNFIGNscnNwYyk7CitPUEpfQVBJIG9wal9pbWFnZV90KiBPUEpfQ0FMTENPTlYgb3BqX2ltYWdlX3RpbGVfY3JlYXRlKE9QSl9VSU5UMzIgbnVtY21wdHMsCisgICAgICAgIG9wal9pbWFnZV9jbXB0cGFybV90ICpjbXB0cGFybXMsIE9QSl9DT0xPUl9TUEFDRSBjbHJzcGMpOwogCi0vKiAKKy8qKgorICogQWxsb2NhdG9yIGZvciBvcGpfaW1hZ2VfdC0+Y29tcHNbXS5kYXRhCisgKiBUbyBiZSBwYWlyZWQgd2l0aCBvcGpfaW1hZ2VfZGF0YV9mcmVlLgorICoKKyAqIEBwYXJhbSAgIHNpemUgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlCisgKgorICogQHJldHVybiAgYSBuZXcgcG9pbnRlciBpZiBzdWNjZXNzZnVsLCBOVUxMIG90aGVyd2lzZS4KKyAqIEBzaW5jZSAyLjIuMAorKi8KK09QSl9BUEkgdm9pZCogT1BKX0NBTExDT05WIG9wal9pbWFnZV9kYXRhX2FsbG9jKE9QSl9TSVpFX1Qgc2l6ZSk7CisKKy8qKgorICogRGVzdHJ1Y3RvciBmb3Igb3BqX2ltYWdlX3QtPmNvbXBzW10uZGF0YQorICogVG8gYmUgcGFpcmVkIHdpdGggb3BqX2ltYWdlX2RhdGFfYWxsb2MuCisgKgorICogQHBhcmFtICAgcHRyICAgIFBvaW50ZXIgdG8gZnJlZQorICoKKyAqIEBzaW5jZSAyLjIuMAorKi8KK09QSl9BUEkgdm9pZCBPUEpfQ0FMTENPTlYgb3BqX2ltYWdlX2RhdGFfZnJlZSh2b2lkKiBwdHIpOworCisvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgc3RyZWFtIGZ1bmN0aW9ucyBkZWZpbml0aW9ucwogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTEwMCw2NSArMTEzMSw3MiBAQAogLyoqCiAgKiBDcmVhdGVzIGFuIGFic3RyYWN0IHN0cmVhbS4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcgZXhjZXB0IGFsbG9jYXRpbmcgbWVtb3J5IGFuZCBpbml0aWFsaXppbmcgdGhlIGFic3RyYWN0IHN0cmVhbS4KICAqCi0gKiBAcGFyYW0JcF9pc19pbnB1dAkJaWYgc2V0IHRvIHRydWUgdGhlbiB0aGUgc3RyZWFtIHdpbGwgYmUgYW4gaW5wdXQgc3RyZWFtLCBhbiBvdXRwdXQgc3RyZWFtIGVsc2UuCisgKiBAcGFyYW0gICBwX2lzX2lucHV0ICAgICAgaWYgc2V0IHRvIHRydWUgdGhlbiB0aGUgc3RyZWFtIHdpbGwgYmUgYW4gaW5wdXQgc3RyZWFtLCBhbiBvdXRwdXQgc3RyZWFtIGVsc2UuCiAgKgotICogQHJldHVybglhIHN0cmVhbSBvYmplY3QuCisgKiBAcmV0dXJuICBhIHN0cmVhbSBvYmplY3QuCiAqLwotT1BKX0FQSSBvcGpfc3RyZWFtX3QqIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX2RlZmF1bHRfY3JlYXRlKE9QSl9CT09MIHBfaXNfaW5wdXQpOworT1BKX0FQSSBvcGpfc3RyZWFtX3QqIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX2RlZmF1bHRfY3JlYXRlKAorICAgIE9QSl9CT09MIHBfaXNfaW5wdXQpOwogCiAvKioKICAqIENyZWF0ZXMgYW4gYWJzdHJhY3Qgc3RyZWFtLiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90aGluZyBleGNlcHQgYWxsb2NhdGluZyBtZW1vcnkgYW5kIGluaXRpYWxpemluZyB0aGUgYWJzdHJhY3Qgc3RyZWFtLgogICoKLSAqIEBwYXJhbQlwX2J1ZmZlcl9zaXplICBGSVhNRSBET0MKLSAqIEBwYXJhbQlwX2lzX2lucHV0CQlpZiBzZXQgdG8gdHJ1ZSB0aGVuIHRoZSBzdHJlYW0gd2lsbCBiZSBhbiBpbnB1dCBzdHJlYW0sIGFuIG91dHB1dCBzdHJlYW0gZWxzZS4KKyAqIEBwYXJhbSAgIHBfYnVmZmVyX3NpemUgIEZJWE1FIERPQworICogQHBhcmFtICAgcF9pc19pbnB1dCAgICAgIGlmIHNldCB0byB0cnVlIHRoZW4gdGhlIHN0cmVhbSB3aWxsIGJlIGFuIGlucHV0IHN0cmVhbSwgYW4gb3V0cHV0IHN0cmVhbSBlbHNlLgogICoKLSAqIEByZXR1cm4JYSBzdHJlYW0gb2JqZWN0LgorICogQHJldHVybiAgYSBzdHJlYW0gb2JqZWN0LgogKi8KLU9QSl9BUEkgb3BqX3N0cmVhbV90KiBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9jcmVhdGUoT1BKX1NJWkVfVCBwX2J1ZmZlcl9zaXplLCBPUEpfQk9PTCBwX2lzX2lucHV0KTsKK09QSl9BUEkgb3BqX3N0cmVhbV90KiBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9jcmVhdGUoT1BKX1NJWkVfVCBwX2J1ZmZlcl9zaXplLAorICAgICAgICBPUEpfQk9PTCBwX2lzX2lucHV0KTsKIAogLyoqCiAgKiBEZXN0cm95cyBhIHN0cmVhbSBjcmVhdGVkIGJ5IG9wal9jcmVhdGVfc3RyZWFtLiBUaGlzIGZ1bmN0aW9uIGRvZXMgTk9UIGNsb3NlIHRoZSBhYnN0cmFjdCBzdHJlYW0uIElmIG5lZWRlZCB0aGUgdXNlciBtdXN0CiAgKiBjbG9zZSBpdHMgb3duIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzdHJlYW0uCiAgKgotICogQHBhcmFtCXBfc3RyZWFtCXRoZSBzdHJlYW0gdG8gZGVzdHJveS4KKyAqIEBwYXJhbSAgIHBfc3RyZWFtICAgIHRoZSBzdHJlYW0gdG8gZGVzdHJveS4KICAqLwogT1BKX0FQSSB2b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX2Rlc3Ryb3kob3BqX3N0cmVhbV90KiBwX3N0cmVhbSk7Ci0gCisKIC8qKgogICogU2V0cyB0aGUgZ2l2ZW4gZnVuY3Rpb24gdG8gYmUgdXNlZCBhcyBhIHJlYWQgZnVuY3Rpb24uCi0gKiBAcGFyYW0JCXBfc3RyZWFtCXRoZSBzdHJlYW0gdG8gbW9kaWZ5Ci0gKiBAcGFyYW0JCXBfZnVuY3Rpb24JdGhlIGZ1bmN0aW9uIHRvIHVzZSBhIHJlYWQgZnVuY3Rpb24uCisgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgdGhlIHN0cmVhbSB0byBtb2RpZnkKKyAqIEBwYXJhbSAgICAgICBwX2Z1bmN0aW9uICB0aGUgZnVuY3Rpb24gdG8gdXNlIGEgcmVhZCBmdW5jdGlvbi4KICovCi1PUEpfQVBJIHZvaWQgT1BKX0NBTExDT05WIG9wal9zdHJlYW1fc2V0X3JlYWRfZnVuY3Rpb24ob3BqX3N0cmVhbV90KiBwX3N0cmVhbSwgb3BqX3N0cmVhbV9yZWFkX2ZuIHBfZnVuY3Rpb24pOworT1BKX0FQSSB2b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX3NldF9yZWFkX2Z1bmN0aW9uKG9wal9zdHJlYW1fdCogcF9zdHJlYW0sCisgICAgICAgIG9wal9zdHJlYW1fcmVhZF9mbiBwX2Z1bmN0aW9uKTsKIAogLyoqCiAgKiBTZXRzIHRoZSBnaXZlbiBmdW5jdGlvbiB0byBiZSB1c2VkIGFzIGEgd3JpdGUgZnVuY3Rpb24uCi0gKiBAcGFyYW0JCXBfc3RyZWFtCXRoZSBzdHJlYW0gdG8gbW9kaWZ5Ci0gKiBAcGFyYW0JCXBfZnVuY3Rpb24JdGhlIGZ1bmN0aW9uIHRvIHVzZSBhIHdyaXRlIGZ1bmN0aW9uLgorICogQHBhcmFtICAgICAgIHBfc3RyZWFtICAgIHRoZSBzdHJlYW0gdG8gbW9kaWZ5CisgKiBAcGFyYW0gICAgICAgcF9mdW5jdGlvbiAgdGhlIGZ1bmN0aW9uIHRvIHVzZSBhIHdyaXRlIGZ1bmN0aW9uLgogKi8KLU9QSl9BUEkgdm9pZCBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9zZXRfd3JpdGVfZnVuY3Rpb24ob3BqX3N0cmVhbV90KiBwX3N0cmVhbSwgb3BqX3N0cmVhbV93cml0ZV9mbiBwX2Z1bmN0aW9uKTsKK09QSl9BUEkgdm9pZCBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9zZXRfd3JpdGVfZnVuY3Rpb24ob3BqX3N0cmVhbV90KiBwX3N0cmVhbSwKKyAgICAgICAgb3BqX3N0cmVhbV93cml0ZV9mbiBwX2Z1bmN0aW9uKTsKIAogLyoqCiAgKiBTZXRzIHRoZSBnaXZlbiBmdW5jdGlvbiB0byBiZSB1c2VkIGFzIGEgc2tpcCBmdW5jdGlvbi4KLSAqIEBwYXJhbQkJcF9zdHJlYW0JdGhlIHN0cmVhbSB0byBtb2RpZnkKLSAqIEBwYXJhbQkJcF9mdW5jdGlvbgl0aGUgZnVuY3Rpb24gdG8gdXNlIGEgc2tpcCBmdW5jdGlvbi4KKyAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICB0aGUgc3RyZWFtIHRvIG1vZGlmeQorICogQHBhcmFtICAgICAgIHBfZnVuY3Rpb24gIHRoZSBmdW5jdGlvbiB0byB1c2UgYSBza2lwIGZ1bmN0aW9uLgogKi8KLU9QSl9BUEkgdm9pZCBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9zZXRfc2tpcF9mdW5jdGlvbihvcGpfc3RyZWFtX3QqIHBfc3RyZWFtLCBvcGpfc3RyZWFtX3NraXBfZm4gcF9mdW5jdGlvbik7CitPUEpfQVBJIHZvaWQgT1BKX0NBTExDT05WIG9wal9zdHJlYW1fc2V0X3NraXBfZnVuY3Rpb24ob3BqX3N0cmVhbV90KiBwX3N0cmVhbSwKKyAgICAgICAgb3BqX3N0cmVhbV9za2lwX2ZuIHBfZnVuY3Rpb24pOwogCiAvKioKICAqIFNldHMgdGhlIGdpdmVuIGZ1bmN0aW9uIHRvIGJlIHVzZWQgYXMgYSBzZWVrIGZ1bmN0aW9uLCB0aGUgc3RyZWFtIGlzIHRoZW4gc2Vla2FibGUuCi0gKiBAcGFyYW0JCXBfc3RyZWFtCXRoZSBzdHJlYW0gdG8gbW9kaWZ5Ci0gKiBAcGFyYW0JCXBfZnVuY3Rpb24JdGhlIGZ1bmN0aW9uIHRvIHVzZSBhIHNraXAgZnVuY3Rpb24uCisgKiBAcGFyYW0gICAgICAgcF9zdHJlYW0gICAgdGhlIHN0cmVhbSB0byBtb2RpZnkKKyAqIEBwYXJhbSAgICAgICBwX2Z1bmN0aW9uICB0aGUgZnVuY3Rpb24gdG8gdXNlIGEgc2tpcCBmdW5jdGlvbi4KICovCi1PUEpfQVBJIHZvaWQgT1BKX0NBTExDT05WIG9wal9zdHJlYW1fc2V0X3NlZWtfZnVuY3Rpb24ob3BqX3N0cmVhbV90KiBwX3N0cmVhbSwgb3BqX3N0cmVhbV9zZWVrX2ZuIHBfZnVuY3Rpb24pOworT1BKX0FQSSB2b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX3NldF9zZWVrX2Z1bmN0aW9uKG9wal9zdHJlYW1fdCogcF9zdHJlYW0sCisgICAgICAgIG9wal9zdHJlYW1fc2Vla19mbiBwX2Z1bmN0aW9uKTsKIAogLyoqCiAgKiBTZXRzIHRoZSBnaXZlbiBkYXRhIHRvIGJlIHVzZWQgYXMgYSB1c2VyIGRhdGEgZm9yIHRoZSBzdHJlYW0uCi0gKiBAcGFyYW0JCXBfc3RyZWFtCXRoZSBzdHJlYW0gdG8gbW9kaWZ5Ci0gKiBAcGFyYW0JCXBfZGF0YQkJdGhlIGRhdGEgdG8gc2V0LgotICogQHBhcmFtCQlwX2Z1bmN0aW9uCXRoZSBmdW5jdGlvbiB0byBmcmVlIHBfZGF0YSB3aGVuIG9wal9zdHJlYW1fZGVzdHJveSgpIGlzIGNhbGxlZC4KKyAqIEBwYXJhbSAgICAgICBwX3N0cmVhbSAgICB0aGUgc3RyZWFtIHRvIG1vZGlmeQorICogQHBhcmFtICAgICAgIHBfZGF0YSAgICAgIHRoZSBkYXRhIHRvIHNldC4KKyAqIEBwYXJhbSAgICAgICBwX2Z1bmN0aW9uICB0aGUgZnVuY3Rpb24gdG8gZnJlZSBwX2RhdGEgd2hlbiBvcGpfc3RyZWFtX2Rlc3Ryb3koKSBpcyBjYWxsZWQuCiAqLwotT1BKX0FQSSB2b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX3NldF91c2VyX2RhdGEgKG9wal9zdHJlYW1fdCogcF9zdHJlYW0sIHZvaWQgKiBwX2RhdGEsIG9wal9zdHJlYW1fZnJlZV91c2VyX2RhdGFfZm4gcF9mdW5jdGlvbik7CitPUEpfQVBJIHZvaWQgT1BKX0NBTExDT05WIG9wal9zdHJlYW1fc2V0X3VzZXJfZGF0YShvcGpfc3RyZWFtX3QqIHBfc3RyZWFtLAorICAgICAgICB2b2lkICogcF9kYXRhLCBvcGpfc3RyZWFtX2ZyZWVfdXNlcl9kYXRhX2ZuIHBfZnVuY3Rpb24pOwogCiAvKioKICAqIFNldHMgdGhlIGxlbmd0aCBvZiB0aGUgdXNlciBkYXRhIGZvciB0aGUgc3RyZWFtLgpAQCAtMTE2NiwyNSArMTIwNCwyOCBAQAogICogQHBhcmFtIHBfc3RyZWFtICAgIHRoZSBzdHJlYW0gdG8gbW9kaWZ5CiAgKiBAcGFyYW0gZGF0YV9sZW5ndGggbGVuZ3RoIG9mIHRoZSB1c2VyX2RhdGEuCiAqLwotT1BKX0FQSSB2b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX3NldF91c2VyX2RhdGFfbGVuZ3RoKG9wal9zdHJlYW1fdCogcF9zdHJlYW0sIE9QSl9VSU5UNjQgZGF0YV9sZW5ndGgpOworT1BKX0FQSSB2b2lkIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX3NldF91c2VyX2RhdGFfbGVuZ3RoKAorICAgIG9wal9zdHJlYW1fdCogcF9zdHJlYW0sIE9QSl9VSU5UNjQgZGF0YV9sZW5ndGgpOwogCiAvKioKICAqIENyZWF0ZSBhIHN0cmVhbSBmcm9tIGEgZmlsZSBpZGVudGlmaWVkIHdpdGggaXRzIGZpbGVuYW1lIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzIChoZWxwZXIgZnVuY3Rpb24pCiAgKiBAcGFyYW0gZm5hbWUgICAgICAgICAgICAgdGhlIGZpbGVuYW1lIG9mIHRoZSBmaWxlIHRvIHN0cmVhbQogICogQHBhcmFtIHBfaXNfcmVhZF9zdHJlYW0gIHdoZXRoZXIgdGhlIHN0cmVhbSBpcyBhIHJlYWQgc3RyZWFtICh0cnVlKSBvciBub3QgKGZhbHNlKQogKi8KLU9QSl9BUEkgb3BqX3N0cmVhbV90KiBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9jcmVhdGVfZGVmYXVsdF9maWxlX3N0cmVhbSAoY29uc3QgY2hhciAqZm5hbWUsIE9QSl9CT09MIHBfaXNfcmVhZF9zdHJlYW0pOwotIAorT1BKX0FQSSBvcGpfc3RyZWFtX3QqIE9QSl9DQUxMQ09OViBvcGpfc3RyZWFtX2NyZWF0ZV9kZWZhdWx0X2ZpbGVfc3RyZWFtKAorICAgIGNvbnN0IGNoYXIgKmZuYW1lLCBPUEpfQk9PTCBwX2lzX3JlYWRfc3RyZWFtKTsKKwogLyoqIENyZWF0ZSBhIHN0cmVhbSBmcm9tIGEgZmlsZSBpZGVudGlmaWVkIHdpdGggaXRzIGZpbGVuYW1lIHdpdGggYSBzcGVjaWZpYyBidWZmZXIgc2l6ZQogICogQHBhcmFtIGZuYW1lICAgICAgICAgICAgIHRoZSBmaWxlbmFtZSBvZiB0aGUgZmlsZSB0byBzdHJlYW0KICAqIEBwYXJhbSBwX2J1ZmZlcl9zaXplICAgICBzaXplIG9mIHRoZSBjaHVuayB1c2VkIHRvIHN0cmVhbQogICogQHBhcmFtIHBfaXNfcmVhZF9zdHJlYW0gIHdoZXRoZXIgdGhlIHN0cmVhbSBpcyBhIHJlYWQgc3RyZWFtICh0cnVlKSBvciBub3QgKGZhbHNlKQogKi8KLU9QSl9BUEkgb3BqX3N0cmVhbV90KiBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9jcmVhdGVfZmlsZV9zdHJlYW0gKGNvbnN0IGNoYXIgKmZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1NJWkVfVCBwX2J1ZmZlcl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JPT0wgcF9pc19yZWFkX3N0cmVhbSk7Ci0gCi0vKiAKK09QSl9BUEkgb3BqX3N0cmVhbV90KiBPUEpfQ0FMTENPTlYgb3BqX3N0cmVhbV9jcmVhdGVfZmlsZV9zdHJlYW0oCisgICAgY29uc3QgY2hhciAqZm5hbWUsCisgICAgT1BKX1NJWkVfVCBwX2J1ZmZlcl9zaXplLAorICAgIE9QSl9CT09MIHBfaXNfcmVhZF9zdHJlYW0pOworCisvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgZXZlbnQgbWFuYWdlciBmdW5jdGlvbnMgZGVmaW5pdGlvbnMKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTExOTUsOSArMTIzNiw5IEBACiAgKiBAcGFyYW0gcF9jYWxsYmFjayAgICB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSB1c2VkCiAgKiBAcGFyYW0gcF91c2VyX2RhdGEgICBjbGllbnQgb2JqZWN0IHdoZXJlIHdpbGwgYmUgcmV0dXJuZWQgdGhlIG1lc3NhZ2UKICovCi1PUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0X2luZm9faGFuZGxlcihvcGpfY29kZWNfdCAqIHBfY29kZWMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX21zZ19jYWxsYmFjayBwX2NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIHBfdXNlcl9kYXRhKTsKK09QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zZXRfaW5mb19oYW5kbGVyKG9wal9jb2RlY190ICogcF9jb2RlYywKKyAgICAgICAgb3BqX21zZ19jYWxsYmFjayBwX2NhbGxiYWNrLAorICAgICAgICB2b2lkICogcF91c2VyX2RhdGEpOwogLyoqCiAgKiBTZXQgdGhlIHdhcm5pbmcgaGFuZGxlciB1c2UgYnkgb3BlbmpwZWcuCiAgKiBAcGFyYW0gcF9jb2RlYyAgICAgICB0aGUgY29kZWMgcHJldmlvdXNseSBpbml0aWFsaXNlCkBAIC0xMjA1LDE5ICsxMjQ2LDE5IEBACiAgKiBAcGFyYW0gcF91c2VyX2RhdGEgICBjbGllbnQgb2JqZWN0IHdoZXJlIHdpbGwgYmUgcmV0dXJuZWQgdGhlIG1lc3NhZ2UKICovCiBPUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0X3dhcm5pbmdfaGFuZGxlcihvcGpfY29kZWNfdCAqIHBfY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfbXNnX2NhbGxiYWNrIHBfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogcF91c2VyX2RhdGEpOworICAgICAgICBvcGpfbXNnX2NhbGxiYWNrIHBfY2FsbGJhY2ssCisgICAgICAgIHZvaWQgKiBwX3VzZXJfZGF0YSk7CiAvKioKICAqIFNldCB0aGUgZXJyb3IgaGFuZGxlciB1c2UgYnkgb3BlbmpwZWcuCiAgKiBAcGFyYW0gcF9jb2RlYyAgICAgICB0aGUgY29kZWMgcHJldmlvdXNseSBpbml0aWFsaXNlCiAgKiBAcGFyYW0gcF9jYWxsYmFjayAgICB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSB1c2VkCiAgKiBAcGFyYW0gcF91c2VyX2RhdGEgICBjbGllbnQgb2JqZWN0IHdoZXJlIHdpbGwgYmUgcmV0dXJuZWQgdGhlIG1lc3NhZ2UKICovCi1PUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0X2Vycm9yX2hhbmRsZXIob3BqX2NvZGVjX3QgKiBwX2NvZGVjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfbXNnX2NhbGxiYWNrIHBfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqIHBfdXNlcl9kYXRhKTsKK09QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zZXRfZXJyb3JfaGFuZGxlcihvcGpfY29kZWNfdCAqIHBfY29kZWMsCisgICAgICAgIG9wal9tc2dfY2FsbGJhY2sgcF9jYWxsYmFjaywKKyAgICAgICAgdm9pZCAqIHBfdXNlcl9kYXRhKTsKIAotLyogCisvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgY29kZWMgZnVuY3Rpb25zIGRlZmluaXRpb25zCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xMjI1LDE4OSArMTI2NiwyNTQgQEAKIAogLyoqCiAgKiBDcmVhdGVzIGEgSjJLL0pQMiBkZWNvbXByZXNzaW9uIHN0cnVjdHVyZQotICogQHBhcmFtIGZvcm1hdCAJCURlY29kZXIgdG8gc2VsZWN0CisgKiBAcGFyYW0gZm9ybWF0ICAgICAgICBEZWNvZGVyIHRvIHNlbGVjdAogICoKICAqIEByZXR1cm4gUmV0dXJucyBhIGhhbmRsZSB0byBhIGRlY29tcHJlc3NvciBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlCiAgKiAqLwotT1BKX0FQSSBvcGpfY29kZWNfdCogT1BKX0NBTExDT05WIG9wal9jcmVhdGVfZGVjb21wcmVzcyhPUEpfQ09ERUNfRk9STUFUIGZvcm1hdCk7CitPUEpfQVBJIG9wal9jb2RlY190KiBPUEpfQ0FMTENPTlYgb3BqX2NyZWF0ZV9kZWNvbXByZXNzKAorICAgIE9QSl9DT0RFQ19GT1JNQVQgZm9ybWF0KTsKIAogLyoqCiAgKiBEZXN0cm95IGEgZGVjb21wcmVzc29yIGhhbmRsZQogICoKLSAqIEBwYXJhbQlwX2NvZGVjCQkJZGVjb21wcmVzc29yIGhhbmRsZSB0byBkZXN0cm95CisgKiBAcGFyYW0gICBwX2NvZGVjICAgICAgICAgZGVjb21wcmVzc29yIGhhbmRsZSB0byBkZXN0cm95CiAgKi8KIE9QSl9BUEkgdm9pZCBPUEpfQ0FMTENPTlYgb3BqX2Rlc3Ryb3lfY29kZWMob3BqX2NvZGVjX3QgKiBwX2NvZGVjKTsKIAogLyoqCiAgKiBSZWFkIGFmdGVyIHRoZSBjb2Rlc3RyZWFtIGlmIG5lY2Vzc2FyeQotICogQHBhcmFtCXBfY29kZWMJCQl0aGUgSlBFRzIwMDAgY29kZWMgdG8gcmVhZC4KLSAqIEBwYXJhbQlwX3N0cmVhbQkJdGhlIEpQRUcyMDAwIHN0cmVhbS4KKyAqIEBwYXJhbSAgIHBfY29kZWMgICAgICAgICB0aGUgSlBFRzIwMDAgY29kZWMgdG8gcmVhZC4KKyAqIEBwYXJhbSAgIHBfc3RyZWFtICAgICAgICB0aGUgSlBFRzIwMDAgc3RyZWFtLgogICovCi1PUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfZW5kX2RlY29tcHJlc3MgKAlvcGpfY29kZWNfdCAqcF9jb2RlYywKLQkJCQkJCQkJCQkJCQlvcGpfc3RyZWFtX3QgKnBfc3RyZWFtKTsKK09QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9lbmRfZGVjb21wcmVzcyhvcGpfY29kZWNfdCAqcF9jb2RlYywKKyAgICAgICAgb3BqX3N0cmVhbV90ICpwX3N0cmVhbSk7CiAKIAogLyoqCiAgKiBTZXQgZGVjb2RpbmcgcGFyYW1ldGVycyB0byBkZWZhdWx0IHZhbHVlcwogICogQHBhcmFtIHBhcmFtZXRlcnMgRGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzCiAgKi8KLU9QSl9BUEkgdm9pZCBPUEpfQ0FMTENPTlYgb3BqX3NldF9kZWZhdWx0X2RlY29kZXJfcGFyYW1ldGVycyhvcGpfZHBhcmFtZXRlcnNfdCAqcGFyYW1ldGVycyk7CitPUEpfQVBJIHZvaWQgT1BKX0NBTExDT05WIG9wal9zZXRfZGVmYXVsdF9kZWNvZGVyX3BhcmFtZXRlcnMoCisgICAgb3BqX2RwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMpOwogCiAvKioKICAqIFNldHVwIHRoZSBkZWNvZGVyIHdpdGggZGVjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyIGFuZCB3aXRoIHRoZSBtZXNzYWdlIGhhbmRsZXIKICAqIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLgogICoKLSAqIEBwYXJhbSBwX2NvZGVjIAkJZGVjb21wcmVzc29yIGhhbmRsZXIKLSAqIEBwYXJhbSBwYXJhbWV0ZXJzIAlkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMKKyAqIEBwYXJhbSBwX2NvZGVjICAgICAgIGRlY29tcHJlc3NvciBoYW5kbGVyCisgKiBAcGFyYW0gcGFyYW1ldGVycyAgICBkZWNvbXByZXNzaW9uIHBhcmFtZXRlcnMKICAqCi0gKiBAcmV0dXJuIHRydWUJCQlpZiB0aGUgZGVjb2RlciBpcyBjb3JyZWN0bHkgc2V0CisgKiBAcmV0dXJuIHRydWUgICAgICAgICBpZiB0aGUgZGVjb2RlciBpcyBjb3JyZWN0bHkgc2V0CiAgKi8KIE9QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zZXR1cF9kZWNvZGVyKG9wal9jb2RlY190ICpwX2NvZGVjLAotCQkJCQkJCQkJCQkJb3BqX2RwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMgKTsKKyAgICAgICAgb3BqX2RwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMpOworCisvKioKKyAqIEFsbG9jYXRlcyB3b3JrZXIgdGhyZWFkcyBmb3IgdGhlIGNvbXByZXNzb3IvZGVjb21wcmVzc29yLgorICoKKyAqIEJ5IGRlZmF1bHQsIG9ubHkgdGhlIG1haW4gdGhyZWFkIGlzIHVzZWQuIElmIHRoaXMgZnVuY3Rpb24gaXMgbm90IHVzZWQsCisgKiBidXQgdGhlIE9QSl9OVU1fVEhSRUFEUyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBzZXQsIGl0cyB2YWx1ZSB3aWxsIGJlCisgKiB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG51bWJlciBvZiB0aHJlYWRzLiBUaGUgdmFsdWUgY2FuIGJlIGVpdGhlciBhbiBpbnRlZ2VyCisgKiBudW1iZXIsIG9yICJBTExfQ1BVUyIuIElmIE9QSl9OVU1fVEhSRUFEUyBpcyBzZXQgYW5kIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLAorICogdGhpcyBmdW5jdGlvbiB3aWxsIG92ZXJyaWRlIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlLgorICoKKyAqIE5vdGU6IGN1cnJlbnRseSBvbmx5IGhhcyBlZmZlY3Qgb24gdGhlIGRlY29tcHJlc3Nvci4KKyAqCisgKiBAcGFyYW0gcF9jb2RlYyAgICAgICBkZWNvbXByZXNzb3IgaGFuZGxlcgorICogQHBhcmFtIG51bV90aHJlYWRzICAgbnVtYmVyIG9mIHRocmVhZHMuCisgKgorICogQHJldHVybiBPUEpfVFJVRSAgICAgaWYgdGhlIGRlY29kZXIgaXMgY29ycmVjdGx5IHNldAorICovCitPUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfY29kZWNfc2V0X3RocmVhZHMob3BqX2NvZGVjX3QgKnBfY29kZWMsCisgICAgICAgIGludCBudW1fdGhyZWFkcyk7CiAKIC8qKgogICogRGVjb2RlcyBhbiBpbWFnZSBoZWFkZXIuCiAgKgotICogQHBhcmFtCXBfc3RyZWFtCQl0aGUganBlZzIwMDAgc3RyZWFtLgotICogQHBhcmFtCXBfY29kZWMJCQl0aGUganBlZzIwMDAgY29kZWMgdG8gcmVhZC4KLSAqIEBwYXJhbQlwX2ltYWdlCQkJdGhlIGltYWdlIHN0cnVjdHVyZSBpbml0aWFsaXplZCB3aXRoIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgZW5jb2RlZCBpbWFnZS4KKyAqIEBwYXJhbSAgIHBfc3RyZWFtICAgICAgICB0aGUganBlZzIwMDAgc3RyZWFtLgorICogQHBhcmFtICAgcF9jb2RlYyAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYyB0byByZWFkLgorICogQHBhcmFtICAgcF9pbWFnZSAgICAgICAgIHRoZSBpbWFnZSBzdHJ1Y3R1cmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIGVuY29kZWQgaW1hZ2UuCiAgKgotICogQHJldHVybiB0cnVlCQkJCWlmIHRoZSBtYWluIGhlYWRlciBvZiB0aGUgY29kZXN0cmVhbSBhbmQgdGhlIEpQMiBoZWFkZXIgaXMgY29ycmVjdGx5IHJlYWQuCisgKiBAcmV0dXJuIHRydWUgICAgICAgICAgICAgaWYgdGhlIG1haW4gaGVhZGVyIG9mIHRoZSBjb2Rlc3RyZWFtIGFuZCB0aGUgSlAyIGhlYWRlciBpcyBjb3JyZWN0bHkgcmVhZC4KICAqLwotT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3JlYWRfaGVhZGVyICgJb3BqX3N0cmVhbV90ICpwX3N0cmVhbSwKLQkJCQkJCQkJCQkJCW9wal9jb2RlY190ICpwX2NvZGVjLAotCQkJCQkJCQkJCQkJb3BqX2ltYWdlX3QgKipwX2ltYWdlKTsKK09QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9yZWFkX2hlYWRlcihvcGpfc3RyZWFtX3QgKnBfc3RyZWFtLAorICAgICAgICBvcGpfY29kZWNfdCAqcF9jb2RlYywKKyAgICAgICAgb3BqX2ltYWdlX3QgKipwX2ltYWdlKTsKKworCisvKiogUmVzdHJpY3QgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIHRvIGRlY29kZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgb3BqX3JlYWRfaGVhZGVyKCkuCisgKgorICogVGhpcyBmdW5jdGlvbiBlbmFibGVzIHRvIHJlc3RyaWN0IHRoZSBzZXQgb2YgZGVjb2RlZCBjb21wb25lbnRzIHRvIHRoZQorICogc3BlY2lmaWVkIGluZGljZXMuCisgKiBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gKGFwcGx5X2NvbG9yX3RyYW5zZm9ybXMgPT0gT1BKX0ZBTFNFKQorICogaXMgc3VjaCB0aGF0IG5laXRoZXIgdGhlIG11bHRpLWNvbXBvbmVudCB0cmFuc2Zvcm0gYXQgY29kZXN0cmVhbSBsZXZlbCwKKyAqIG5vciBKUDIgY2hhbm5lbCB0cmFuc2Zvcm1hdGlvbnMgd2lsbCBiZSBhcHBsaWVkLgorICogQ29uc2VxdWVudGx5IHRoZSBpbmRpY2VzIGFyZSByZWxhdGl2ZSB0byB0aGUgY29kZXN0cmVhbS4KKyAqCisgKiBOb3RlOiBvcGpfZGVjb2RlX3RpbGVfZGF0YSgpIHNob3VsZCBub3QgYmUgdXNlZCB0b2dldGhlciB3aXRoIG9wal9zZXRfZGVjb2RlZF9jb21wb25lbnRzKCkuCisgKgorICogQHBhcmFtICAgcF9jb2RlYyAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYyB0byByZWFkLgorICogQHBhcmFtICAgbnVtY29tcHMgICAgICAgIFNpemUgb2YgdGhlIGNvbXBzX2luZGljZXMgYXJyYXkuCisgKiBAcGFyYW0gICBjb21wc19pbmRpY2VzICAgQXJyYXkgb2YgbnVtY29tcHMgdmFsdWVzIHJlcHJlc2VudGluZyB0aGUgaW5kaWNlcworICogICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBjb21wb25lbnRzIHRvIGRlY29kZSAocmVsYXRpdmUgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXN0cmVhbSwgc3RhcnRpbmcgYXQgMCkKKyAqIEBwYXJhbSAgIGFwcGx5X2NvbG9yX3RyYW5zZm9ybXMgV2hldGhlciBtdWx0aS1jb21wb25lbnQgdHJhbnNmb3JtIGF0IGNvZGVzdHJlYW0gbGV2ZWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgSlAyIGNoYW5uZWwgdHJhbnNmb3JtYXRpb25zIHNob3VsZCBiZSBhcHBsaWVkLgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50bHkgdGhpcyBwYXJhbWV0ZXIgc2hvdWxkIGJlIHNldCB0byBPUEpfRkFMU0UuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmcgaXQgdG8gT1BKX1RSVUUgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuCisgKgorICogQHJldHVybiBPUEpfVFJVRSAgICAgICAgIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KKyAqLworT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldF9kZWNvZGVkX2NvbXBvbmVudHMob3BqX2NvZGVjX3QgKnBfY29kZWMsCisgICAgICAgIE9QSl9VSU5UMzIgbnVtY29tcHMsCisgICAgICAgIGNvbnN0IE9QSl9VSU5UMzIqIGNvbXBzX2luZGljZXMsCisgICAgICAgIE9QSl9CT09MIGFwcGx5X2NvbG9yX3RyYW5zZm9ybXMpOwogCiAvKioKICAqIFNldHMgdGhlIGdpdmVuIGFyZWEgdG8gYmUgZGVjb2RlZC4gVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHJpZ2h0IGFmdGVyIG9wal9yZWFkX2hlYWRlciBhbmQgYmVmb3JlIGFueSB0aWxlIGhlYWRlciByZWFkaW5nLgogICoKLSAqIEBwYXJhbQlwX2NvZGVjCQkJdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtCXBfaW1hZ2UgICAgICAgICB0aGUgZGVjb2RlZCBpbWFnZSBwcmV2aW91c2x5IHNldHRlZCBieSBvcGpfcmVhZF9oZWFkZXIKLSAqIEBwYXJhbQlwX3N0YXJ0X3gJCXRoZSBsZWZ0IHBvc2l0aW9uIG9mIHRoZSByZWN0YW5nbGUgdG8gZGVjb2RlIChpbiBpbWFnZSBjb29yZGluYXRlcykuCi0gKiBAcGFyYW0JcF9lbmRfeAkJCXRoZSByaWdodCBwb3NpdGlvbiBvZiB0aGUgcmVjdGFuZ2xlIHRvIGRlY29kZSAoaW4gaW1hZ2UgY29vcmRpbmF0ZXMpLgotICogQHBhcmFtCXBfc3RhcnRfeQkJdGhlIHVwIHBvc2l0aW9uIG9mIHRoZSByZWN0YW5nbGUgdG8gZGVjb2RlIChpbiBpbWFnZSBjb29yZGluYXRlcykuCi0gKiBAcGFyYW0JcF9lbmRfeQkJCXRoZSBib3R0b20gcG9zaXRpb24gb2YgdGhlIHJlY3RhbmdsZSB0byBkZWNvZGUgKGluIGltYWdlIGNvb3JkaW5hdGVzKS4KKyAqIFRoZSBjb29yZGluYXRlcyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgZXhwcmVzc2VkIGluIHRoZSByZWZlcmVuY2UgZ3JpZCwKKyAqIHRoYXQgaXMgdG8gc2F5IGF0IHRoZSBoaWdoZXN0IHJlc29sdXRpb24gbGV2ZWwsIGV2ZW4gaWYgcmVxdWVzdGluZyB0aGUgaW1hZ2UgYXQgbG93ZXIKKyAqIHJlc29sdXRpb24gbGV2ZWxzLgogICoKLSAqIEByZXR1cm4JdHJ1ZQkJCWlmIHRoZSBhcmVhIGNvdWxkIGJlIHNldC4KKyAqIEdlbmVyYWxseSBvcGpfc2V0X2RlY29kZV9hcmVhKCkgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IG9wal9kZWNvZGUoKSwgYW5kIHRoZQorICogY29kZWMgY2Fubm90IGJlIHJlLXVzZWQuCisgKiBJbiB0aGUgcGFydGljdWxhciBjYXNlIG9mIGFuIGltYWdlIG1hZGUgb2YgYSBzaW5nbGUgdGlsZSwgc2V2ZXJhbCBzZXF1ZW5jZXMgb2YKKyAqIGNhbGxzIHRvIG9wb2pfc2V0X2RlY29kZV9hcmVhKCkgYW5kIG9wal9kZWNvZGUoKSBhcmUgYWxsb3dlZCwgYW5kIHdpbGwgYnJpbmcKKyAqIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyB3aGVuIHJlYWRpbmcgYW4gaW1hZ2UgYnkgY2h1bmtzLgorICoKKyAqIEBwYXJhbSAgIHBfY29kZWMgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gICBwX2ltYWdlICAgICAgICAgdGhlIGRlY29kZWQgaW1hZ2UgcHJldmlvdXNseSBzZXR0ZWQgYnkgb3BqX3JlYWRfaGVhZGVyCisgKiBAcGFyYW0gICBwX3N0YXJ0X3ggICAgICAgdGhlIGxlZnQgcG9zaXRpb24gb2YgdGhlIHJlY3RhbmdsZSB0byBkZWNvZGUgKGluIGltYWdlIGNvb3JkaW5hdGVzKS4KKyAqIEBwYXJhbSAgIHBfZW5kX3ggICAgICAgICB0aGUgcmlnaHQgcG9zaXRpb24gb2YgdGhlIHJlY3RhbmdsZSB0byBkZWNvZGUgKGluIGltYWdlIGNvb3JkaW5hdGVzKS4KKyAqIEBwYXJhbSAgIHBfc3RhcnRfeSAgICAgICB0aGUgdXAgcG9zaXRpb24gb2YgdGhlIHJlY3RhbmdsZSB0byBkZWNvZGUgKGluIGltYWdlIGNvb3JkaW5hdGVzKS4KKyAqIEBwYXJhbSAgIHBfZW5kX3kgICAgICAgICB0aGUgYm90dG9tIHBvc2l0aW9uIG9mIHRoZSByZWN0YW5nbGUgdG8gZGVjb2RlIChpbiBpbWFnZSBjb29yZGluYXRlcykuCisgKgorICogQHJldHVybiAgdHJ1ZSAgICAgICAgICAgIGlmIHRoZSBhcmVhIGNvdWxkIGJlIHNldC4KICAqLwotT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldF9kZWNvZGVfYXJlYSgJb3BqX2NvZGVjX3QgKnBfY29kZWMsCi0JCQkJCQkJCQkJCQkJb3BqX2ltYWdlX3QqIHBfaW1hZ2UsCi0JCQkJCQkJCQkJCQkJT1BKX0lOVDMyIHBfc3RhcnRfeCwgT1BKX0lOVDMyIHBfc3RhcnRfeSwKLQkJCQkJCQkJCQkJCQlPUEpfSU5UMzIgcF9lbmRfeCwgT1BKX0lOVDMyIHBfZW5kX3kgKTsKK09QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zZXRfZGVjb2RlX2FyZWEob3BqX2NvZGVjX3QgKnBfY29kZWMsCisgICAgICAgIG9wal9pbWFnZV90KiBwX2ltYWdlLAorICAgICAgICBPUEpfSU5UMzIgcF9zdGFydF94LCBPUEpfSU5UMzIgcF9zdGFydF95LAorICAgICAgICBPUEpfSU5UMzIgcF9lbmRfeCwgT1BKX0lOVDMyIHBfZW5kX3kpOwogCiAvKioKICAqIERlY29kZSBhbiBpbWFnZSBmcm9tIGEgSlBFRy0yMDAwIGNvZGVzdHJlYW0KICAqCi0gKiBAcGFyYW0gcF9kZWNvbXByZXNzb3IgCWRlY29tcHJlc3NvciBoYW5kbGUKLSAqIEBwYXJhbSBwX3N0cmVhbQkJCUlucHV0IGJ1ZmZlciBzdHJlYW0KLSAqIEBwYXJhbSBwX2ltYWdlIAkJCXRoZSBkZWNvZGVkIGltYWdlCi0gKiBAcmV0dXJuIAkJCQkJdHJ1ZSBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UKKyAqIEBwYXJhbSBwX2RlY29tcHJlc3NvciAgICBkZWNvbXByZXNzb3IgaGFuZGxlCisgKiBAcGFyYW0gcF9zdHJlYW0gICAgICAgICAgSW5wdXQgYnVmZmVyIHN0cmVhbQorICogQHBhcmFtIHBfaW1hZ2UgICAgICAgICAgIHRoZSBkZWNvZGVkIGltYWdlCisgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgdHJ1ZSBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UKICAqICovCi1PUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfZGVjb2RlKCAgIG9wal9jb2RlY190ICpwX2RlY29tcHJlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV90ICpwX3N0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKnBfaW1hZ2UpOworT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX2RlY29kZShvcGpfY29kZWNfdCAqcF9kZWNvbXByZXNzb3IsCisgICAgICAgIG9wal9zdHJlYW1fdCAqcF9zdHJlYW0sCisgICAgICAgIG9wal9pbWFnZV90ICpwX2ltYWdlKTsKIAogLyoqCiAgKiBHZXQgdGhlIGRlY29kZWQgdGlsZSBmcm9tIHRoZSBjb2RlYwogICoKLSAqIEBwYXJhbQlwX2NvZGVjCQkJdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtCXBfc3RyZWFtCQlpbnB1dCBzdHJlYW1tCi0gKiBAcGFyYW0JcF9pbWFnZQkJCW91dHB1dCBpbWFnZQotICogQHBhcmFtCXRpbGVfaW5kZXgJCWluZGV4IG9mIHRoZSB0aWxlIHdoaWNoIHdpbGwgYmUgZGVjb2RlCisgKiBAcGFyYW0gICBwX2NvZGVjICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtICAgcF9zdHJlYW0gICAgICAgIGlucHV0IHN0cmVhbW0KKyAqIEBwYXJhbSAgIHBfaW1hZ2UgICAgICAgICBvdXRwdXQgaW1hZ2UKKyAqIEBwYXJhbSAgIHRpbGVfaW5kZXggICAgICBpbmRleCBvZiB0aGUgdGlsZSB3aGljaCB3aWxsIGJlIGRlY29kZQogICoKLSAqIEByZXR1cm4JCQkJCXRydWUgaWYgc3VjY2Vzcywgb3RoZXJ3aXNlIGZhbHNlCisgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgdHJ1ZSBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UKICAqLwotT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX2dldF9kZWNvZGVkX3RpbGUoCW9wal9jb2RlY190ICpwX2NvZGVjLAotCQkJCQkJCQkJCQkJCW9wal9zdHJlYW1fdCAqcF9zdHJlYW0sCi0JCQkJCQkJCQkJCQkJb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCi0JCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiB0aWxlX2luZGV4KTsKK09QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9nZXRfZGVjb2RlZF90aWxlKG9wal9jb2RlY190ICpwX2NvZGVjLAorICAgICAgICBvcGpfc3RyZWFtX3QgKnBfc3RyZWFtLAorICAgICAgICBvcGpfaW1hZ2VfdCAqcF9pbWFnZSwKKyAgICAgICAgT1BKX1VJTlQzMiB0aWxlX2luZGV4KTsKIAogLyoqCiAgKiBTZXQgdGhlIHJlc29sdXRpb24gZmFjdG9yIG9mIHRoZSBkZWNvZGVkIGltYWdlCi0gKiBAcGFyYW0JcF9jb2RlYwkJCXRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqIEBwYXJhbQlyZXNfZmFjdG9yCQlyZXNvbHV0aW9uIGZhY3RvciB0byBzZXQKKyAqIEBwYXJhbSAgIHBfY29kZWMgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gICByZXNfZmFjdG9yICAgICAgcmVzb2x1dGlvbiBmYWN0b3IgdG8gc2V0CiAgKgotICogQHJldHVybgkJCQkJdHJ1ZSBpZiBzdWNjZXNzLCBvdGhlcndpc2UgZmFsc2UKKyAqIEByZXR1cm4gICAgICAgICAgICAgICAgICB0cnVlIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBmYWxzZQogICovCi1PUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3Iob3BqX2NvZGVjX3QgKnBfY29kZWMsIE9QSl9VSU5UMzIgcmVzX2ZhY3Rvcik7CitPUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3IoCisgICAgb3BqX2NvZGVjX3QgKnBfY29kZWMsIE9QSl9VSU5UMzIgcmVzX2ZhY3Rvcik7CiAKIC8qKgogICogV3JpdGVzIGEgdGlsZSB3aXRoIHRoZSBnaXZlbiBkYXRhLgogICoKLSAqIEBwYXJhbQlwX2NvZGVjCQkgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KLSAqIEBwYXJhbQlwX3RpbGVfaW5kZXgJCXRoZSBpbmRleCBvZiB0aGUgdGlsZSB0byB3cml0ZS4gQXQgdGhlIG1vbWVudCwgdGhlIHRpbGVzIG11c3QgYmUgd3JpdHRlbiBmcm9tIDAgdG8gbi0xIGluIHNlcXVlbmNlLgotICogQHBhcmFtCXBfZGF0YQkJCQlwb2ludGVyIHRvIHRoZSBkYXRhIHRvIHdyaXRlLiBEYXRhIGlzIGFycmFuZ2VkIGluIHNlcXVlbmNlLCBkYXRhX2NvbXAwLCB0aGVuIGRhdGFfY29tcDEsIHRoZW4gLi4uIE5PIElOVEVSTEVBVklORyBzaG91bGQgYmUgc2V0LgotICogQHBhcmFtCXBfZGF0YV9zaXplCQkJdGhpcyB2YWx1ZSBvcyB1c2VkIHRvIG1ha2Ugc3VyZSB0aGUgZGF0YSBiZWluZyB3cml0dGVuIGlzIGNvcnJlY3QuIFRoZSBzaXplIG11c3QgYmUgZXF1YWwgdG8gdGhlIHN1bSBmb3IgZWFjaCBjb21wb25lbnQgb2YgCisgKiBAcGFyYW0gICBwX2NvZGVjICAgICAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KKyAqIEBwYXJhbSAgIHBfdGlsZV9pbmRleCAgICAgICAgdGhlIGluZGV4IG9mIHRoZSB0aWxlIHRvIHdyaXRlLiBBdCB0aGUgbW9tZW50LCB0aGUgdGlsZXMgbXVzdCBiZSB3cml0dGVuIGZyb20gMCB0byBuLTEgaW4gc2VxdWVuY2UuCisgKiBAcGFyYW0gICBwX2RhdGEgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGRhdGEgdG8gd3JpdGUuIERhdGEgaXMgYXJyYW5nZWQgaW4gc2VxdWVuY2UsIGRhdGFfY29tcDAsIHRoZW4gZGF0YV9jb21wMSwgdGhlbiAuLi4gTk8gSU5URVJMRUFWSU5HIHNob3VsZCBiZSBzZXQuCisgKiBAcGFyYW0gICBwX2RhdGFfc2l6ZSAgICAgICAgIHRoaXMgdmFsdWUgb3MgdXNlZCB0byBtYWtlIHN1cmUgdGhlIGRhdGEgYmVpbmcgd3JpdHRlbiBpcyBjb3JyZWN0LiBUaGUgc2l6ZSBtdXN0IGJlIGVxdWFsIHRvIHRoZSBzdW0gZm9yIGVhY2ggY29tcG9uZW50IG9mCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfd2lkdGggKiB0aWxlX2hlaWdodCAqIGNvbXBvbmVudF9zaXplLiBjb21wb25lbnRfc2l6ZSBjYW4gYmUgMSwyIG9yIDQgYnl0ZXMsIGRlcGVuZGluZyBvbiB0aGUgcHJlY2lzaW9uIG9mIHRoZSBnaXZlbiBjb21wb25lbnQuCi0gKiBAcGFyYW0JcF9zdHJlYW0JCQl0aGUgc3RyZWFtIHRvIHdyaXRlIGRhdGEgdG8uCisgKiBAcGFyYW0gICBwX3N0cmVhbSAgICAgICAgICAgIHRoZSBzdHJlYW0gdG8gd3JpdGUgZGF0YSB0by4KICAqCi0gKiBAcmV0dXJuCXRydWUgaWYgdGhlIGRhdGEgY291bGQgYmUgd3JpdHRlbi4KKyAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGRhdGEgY291bGQgYmUgd3JpdHRlbi4KICAqLwotT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3dyaXRlX3RpbGUgKAlvcGpfY29kZWNfdCAqcF9jb2RlYywKLQkJCQkJCQkJCQkJCU9QSl9VSU5UMzIgcF90aWxlX2luZGV4LAotCQkJCQkJCQkJCQkJT1BKX0JZVEUgKiBwX2RhdGEsCi0JCQkJCQkJCQkJCQlPUEpfVUlOVDMyIHBfZGF0YV9zaXplLAotCQkJCQkJCQkJCQkJb3BqX3N0cmVhbV90ICpwX3N0cmVhbSApOworT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3dyaXRlX3RpbGUob3BqX2NvZGVjX3QgKnBfY29kZWMsCisgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX2luZGV4LAorICAgICAgICBPUEpfQllURSAqIHBfZGF0YSwKKyAgICAgICAgT1BKX1VJTlQzMiBwX2RhdGFfc2l6ZSwKKyAgICAgICAgb3BqX3N0cmVhbV90ICpwX3N0cmVhbSk7CiAKIC8qKgogICogUmVhZHMgYSB0aWxlIGhlYWRlci4gVGhpcyBmdW5jdGlvbiBpcyBjb21wdWxzb3J5IGFuZCBhbGxvd3Mgb25lIHRvIGtub3cgdGhlIHNpemUgb2YgdGhlIHRpbGUgdGhhdCB3aWxsIGJlIGRlY29kZWQuCiAgKiBUaGUgdXNlciBtYXkgbmVlZCB0byByZWZlciB0byB0aGUgaW1hZ2UgZ290IGJ5IG9wal9yZWFkX2hlYWRlciB0byB1bmRlcnN0YW5kIHRoZSBzaXplIGJlaW5nIHRha2VuIGJ5IHRoZSB0aWxlLgogICoKLSAqIEBwYXJhbQlwX2NvZGVjCQkJdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtCXBfdGlsZV9pbmRleAlwb2ludGVyIHRvIGEgdmFsdWUgdGhhdCB3aWxsIGhvbGQgdGhlIGluZGV4IG9mIHRoZSB0aWxlIGJlaW5nIGRlY29kZWQsIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KLSAqIEBwYXJhbQlwX2RhdGFfc2l6ZQkJcG9pbnRlciB0byBhIHZhbHVlIHRoYXQgd2lsbCBob2xkIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGRlY29kZWQgZGF0YSwgaW4gY2FzZSBvZiBzdWNjZXNzLiBJbiBjYXNlCi0gKgkJCQkJCQlvZiB0cnVuY2F0ZWQgY29kZXN0cmVhbXMsIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIGRlY29kZWQgbWF5IGJlIGxvd2VyLiBUaGUgY29tcHV0YXRpb24gb2YgdGhlIHNpemUgaXMgdGhlIHNhbWUKLSAqCQkJCQkJCWFzIGRlcGljdGVkIGluIG9wal93cml0ZV90aWxlLgotICogQHBhcmFtCXBfdGlsZV94MAkJcG9pbnRlciB0byBhIHZhbHVlIHRoYXQgd2lsbCBob2xkIHRoZSB4MCBwb3Mgb2YgdGhlIHRpbGUgKGluIHRoZSBpbWFnZSkuCi0gKiBAcGFyYW0JcF90aWxlX3kwCQlwb2ludGVyIHRvIGEgdmFsdWUgdGhhdCB3aWxsIGhvbGQgdGhlIHkwIHBvcyBvZiB0aGUgdGlsZSAoaW4gdGhlIGltYWdlKS4KLSAqIEBwYXJhbQlwX3RpbGVfeDEJCXBvaW50ZXIgdG8gYSB2YWx1ZSB0aGF0IHdpbGwgaG9sZCB0aGUgeDEgcG9zIG9mIHRoZSB0aWxlIChpbiB0aGUgaW1hZ2UpLgotICogQHBhcmFtCXBfdGlsZV95MQkJcG9pbnRlciB0byBhIHZhbHVlIHRoYXQgd2lsbCBob2xkIHRoZSB5MSBwb3Mgb2YgdGhlIHRpbGUgKGluIHRoZSBpbWFnZSkuCi0gKiBAcGFyYW0JcF9uYl9jb21wcwkJcG9pbnRlciB0byBhIHZhbHVlIHRoYXQgd2lsbCBob2xkIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyBpbiB0aGUgdGlsZS4KLSAqIEBwYXJhbQlwX3Nob3VsZF9nb19vbglwb2ludGVyIHRvIGEgYm9vbGVhbiB0aGF0IHdpbGwgaG9sZCB0aGUgZmFjdCB0aGF0IHRoZSBkZWNvZGluZyBzaG91bGQgZ28gb24uIEluIGNhc2UgdGhlCi0gKgkJCQkJCQljb2Rlc3RyZWFtIGlzIG92ZXIgYXQgdGhlIHRpbWUgb2YgdGhlIGNhbGwsIHRoZSB2YWx1ZSB3aWxsIGJlIHNldCB0byBmYWxzZS4gVGhlIHVzZXIgc2hvdWxkIHRoZW4gc3RvcAotICoJCQkJCQkJdGhlIGRlY29kaW5nLgotICogQHBhcmFtCXBfc3RyZWFtCQl0aGUgc3RyZWFtIHRvIGRlY29kZS4KLSAqIEByZXR1cm4JdHJ1ZQkJCWlmIHRoZSB0aWxlIGhlYWRlciBjb3VsZCBiZSBkZWNvZGVkLiBJbiBjYXNlIHRoZSBkZWNvZGluZyBzaG91bGQgZW5kLCB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgc3RpbGwgdHJ1ZS4KLSAqCQkJCQkJCXJldHVybmluZyBmYWxzZSBtYXkgYmUgdGhlIHJlc3VsdCBvZiBhIHNob3J0YWdlIG9mIG1lbW9yeSBvciBhbiBpbnRlcm5hbCBlcnJvci4KKyAqIEBwYXJhbSAgIHBfY29kZWMgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gICBwX3RpbGVfaW5kZXggICAgcG9pbnRlciB0byBhIHZhbHVlIHRoYXQgd2lsbCBob2xkIHRoZSBpbmRleCBvZiB0aGUgdGlsZSBiZWluZyBkZWNvZGVkLCBpbiBjYXNlIG9mIHN1Y2Nlc3MuCisgKiBAcGFyYW0gICBwX2RhdGFfc2l6ZSAgICAgcG9pbnRlciB0byBhIHZhbHVlIHRoYXQgd2lsbCBob2xkIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGRlY29kZWQgZGF0YSwgaW4gY2FzZSBvZiBzdWNjZXNzLiBJbiBjYXNlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdHJ1bmNhdGVkIGNvZGVzdHJlYW1zLCB0aGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyBkZWNvZGVkIG1heSBiZSBsb3dlci4gVGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBzaXplIGlzIHRoZSBzYW1lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgZGVwaWN0ZWQgaW4gb3BqX3dyaXRlX3RpbGUuCisgKiBAcGFyYW0gICBwX3RpbGVfeDAgICAgICAgcG9pbnRlciB0byBhIHZhbHVlIHRoYXQgd2lsbCBob2xkIHRoZSB4MCBwb3Mgb2YgdGhlIHRpbGUgKGluIHRoZSBpbWFnZSkuCisgKiBAcGFyYW0gICBwX3RpbGVfeTAgICAgICAgcG9pbnRlciB0byBhIHZhbHVlIHRoYXQgd2lsbCBob2xkIHRoZSB5MCBwb3Mgb2YgdGhlIHRpbGUgKGluIHRoZSBpbWFnZSkuCisgKiBAcGFyYW0gICBwX3RpbGVfeDEgICAgICAgcG9pbnRlciB0byBhIHZhbHVlIHRoYXQgd2lsbCBob2xkIHRoZSB4MSBwb3Mgb2YgdGhlIHRpbGUgKGluIHRoZSBpbWFnZSkuCisgKiBAcGFyYW0gICBwX3RpbGVfeTEgICAgICAgcG9pbnRlciB0byBhIHZhbHVlIHRoYXQgd2lsbCBob2xkIHRoZSB5MSBwb3Mgb2YgdGhlIHRpbGUgKGluIHRoZSBpbWFnZSkuCisgKiBAcGFyYW0gICBwX25iX2NvbXBzICAgICAgcG9pbnRlciB0byBhIHZhbHVlIHRoYXQgd2lsbCBob2xkIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyBpbiB0aGUgdGlsZS4KKyAqIEBwYXJhbSAgIHBfc2hvdWxkX2dvX29uICBwb2ludGVyIHRvIGEgYm9vbGVhbiB0aGF0IHdpbGwgaG9sZCB0aGUgZmFjdCB0aGF0IHRoZSBkZWNvZGluZyBzaG91bGQgZ28gb24uIEluIGNhc2UgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXN0cmVhbSBpcyBvdmVyIGF0IHRoZSB0aW1lIG9mIHRoZSBjYWxsLCB0aGUgdmFsdWUgd2lsbCBiZSBzZXQgdG8gZmFsc2UuIFRoZSB1c2VyIHNob3VsZCB0aGVuIHN0b3AKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGVjb2RpbmcuCisgKiBAcGFyYW0gICBwX3N0cmVhbSAgICAgICAgdGhlIHN0cmVhbSB0byBkZWNvZGUuCisgKiBAcmV0dXJuICB0cnVlICAgICAgICAgICAgaWYgdGhlIHRpbGUgaGVhZGVyIGNvdWxkIGJlIGRlY29kZWQuIEluIGNhc2UgdGhlIGRlY29kaW5nIHNob3VsZCBlbmQsIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBzdGlsbCB0cnVlLgorICogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmluZyBmYWxzZSBtYXkgYmUgdGhlIHJlc3VsdCBvZiBhIHNob3J0YWdlIG9mIG1lbW9yeSBvciBhbiBpbnRlcm5hbCBlcnJvci4KICAqLwotT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3JlYWRfdGlsZV9oZWFkZXIoCW9wal9jb2RlY190ICpwX2NvZGVjLAotCQkJCQkJCQkJCQkJb3BqX3N0cmVhbV90ICogcF9zdHJlYW0sCi0JCQkJCQkJCQkJCQlPUEpfVUlOVDMyICogcF90aWxlX2luZGV4LAotCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiAqIHBfZGF0YV9zaXplLAotCQkJCQkJCQkJCQkJT1BKX0lOVDMyICogcF90aWxlX3gwLCBPUEpfSU5UMzIgKiBwX3RpbGVfeTAsCi0JCQkJCQkJCQkJCQlPUEpfSU5UMzIgKiBwX3RpbGVfeDEsIE9QSl9JTlQzMiAqIHBfdGlsZV95MSwKLQkJCQkJCQkJCQkJCU9QSl9VSU5UMzIgKiBwX25iX2NvbXBzLAotCQkJCQkJCQkJCQkJT1BKX0JPT0wgKiBwX3Nob3VsZF9nb19vbiApOworT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3JlYWRfdGlsZV9oZWFkZXIob3BqX2NvZGVjX3QgKnBfY29kZWMsCisgICAgICAgIG9wal9zdHJlYW1fdCAqIHBfc3RyZWFtLAorICAgICAgICBPUEpfVUlOVDMyICogcF90aWxlX2luZGV4LAorICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3NpemUsCisgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV94MCwgT1BKX0lOVDMyICogcF90aWxlX3kwLAorICAgICAgICBPUEpfSU5UMzIgKiBwX3RpbGVfeDEsIE9QSl9JTlQzMiAqIHBfdGlsZV95MSwKKyAgICAgICAgT1BKX1VJTlQzMiAqIHBfbmJfY29tcHMsCisgICAgICAgIE9QSl9CT09MICogcF9zaG91bGRfZ29fb24pOwogCiAvKioKICAqIFJlYWRzIGEgdGlsZSBkYXRhLiBUaGlzIGZ1bmN0aW9uIGlzIGNvbXB1bHNvcnkgYW5kIGFsbG93cyBvbmUgdG8gZGVjb2RlIHRpbGUgZGF0YS4gb3BqX3JlYWRfdGlsZV9oZWFkZXIgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUuCiAgKiBUaGUgdXNlciBtYXkgbmVlZCB0byByZWZlciB0byB0aGUgaW1hZ2UgZ290IGJ5IG9wal9yZWFkX2hlYWRlciB0byB1bmRlcnN0YW5kIHRoZSBzaXplIGJlaW5nIHRha2VuIGJ5IHRoZSB0aWxlLgogICoKLSAqIEBwYXJhbQlwX2NvZGVjCQkJdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtCXBfdGlsZV9pbmRleAl0aGUgaW5kZXggb2YgdGhlIHRpbGUgYmVpbmcgZGVjb2RlZCwgdGhpcyBzaG91bGQgYmUgdGhlIHZhbHVlIHNldCBieSBvcGpfcmVhZF90aWxlX2hlYWRlci4KLSAqIEBwYXJhbQlwX2RhdGEJCQlwb2ludGVyIHRvIGEgbWVtb3J5IGJsb2NrIHRoYXQgd2lsbCBob2xkIHRoZSBkZWNvZGVkIGRhdGEuCi0gKiBAcGFyYW0JcF9kYXRhX3NpemUJCXNpemUgb2YgcF9kYXRhLiBwX2RhdGFfc2l6ZSBzaG91bGQgYmUgYmlnZ2VyIG9yIGVxdWFsIHRvIHRoZSB2YWx1ZSBzZXQgYnkgb3BqX3JlYWRfdGlsZV9oZWFkZXIuCi0gKiBAcGFyYW0JcF9zdHJlYW0JCXRoZSBzdHJlYW0gdG8gZGVjb2RlLgorICogTm90ZTogb3BqX2RlY29kZV90aWxlX2RhdGEoKSBzaG91bGQgbm90IGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBvcGpfc2V0X2RlY29kZWRfY29tcG9uZW50cygpLgogICoKLSAqIEByZXR1cm4JdHJ1ZQkJCWlmIHRoZSBkYXRhIGNvdWxkIGJlIGRlY29kZWQuCisgKiBAcGFyYW0gICBwX2NvZGVjICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtICAgcF90aWxlX2luZGV4ICAgIHRoZSBpbmRleCBvZiB0aGUgdGlsZSBiZWluZyBkZWNvZGVkLCB0aGlzIHNob3VsZCBiZSB0aGUgdmFsdWUgc2V0IGJ5IG9wal9yZWFkX3RpbGVfaGVhZGVyLgorICogQHBhcmFtICAgcF9kYXRhICAgICAgICAgIHBvaW50ZXIgdG8gYSBtZW1vcnkgYmxvY2sgdGhhdCB3aWxsIGhvbGQgdGhlIGRlY29kZWQgZGF0YS4KKyAqIEBwYXJhbSAgIHBfZGF0YV9zaXplICAgICBzaXplIG9mIHBfZGF0YS4gcF9kYXRhX3NpemUgc2hvdWxkIGJlIGJpZ2dlciBvciBlcXVhbCB0byB0aGUgdmFsdWUgc2V0IGJ5IG9wal9yZWFkX3RpbGVfaGVhZGVyLgorICogQHBhcmFtICAgcF9zdHJlYW0gICAgICAgIHRoZSBzdHJlYW0gdG8gZGVjb2RlLgorICoKKyAqIEByZXR1cm4gIHRydWUgICAgICAgICAgICBpZiB0aGUgZGF0YSBjb3VsZCBiZSBkZWNvZGVkLgogICovCi1PUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfZGVjb2RlX3RpbGVfZGF0YSgJb3BqX2NvZGVjX3QgKnBfY29kZWMsCi0JCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCi0JCQkJCQkJCQkJCQkJT1BKX0JZVEUgKiBwX2RhdGEsCi0JCQkJCQkJCQkJCQkJT1BKX1VJTlQzMiBwX2RhdGFfc2l6ZSwKLQkJCQkJCQkJCQkJCQlvcGpfc3RyZWFtX3QgKnBfc3RyZWFtICk7CitPUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfZGVjb2RlX3RpbGVfZGF0YShvcGpfY29kZWNfdCAqcF9jb2RlYywKKyAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCisgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAorICAgICAgICBPUEpfVUlOVDMyIHBfZGF0YV9zaXplLAorICAgICAgICBvcGpfc3RyZWFtX3QgKnBfc3RyZWFtKTsKIAogLyogQ09NUFJFU1NJT04gRlVOQ1RJT05TKi8KIAogLyoqCiAgKiBDcmVhdGVzIGEgSjJLL0pQMiBjb21wcmVzc2lvbiBzdHJ1Y3R1cmUKLSAqIEBwYXJhbSAJZm9ybWF0IAkJQ29kZXIgdG8gc2VsZWN0Ci0gKiBAcmV0dXJuIAkJCQlSZXR1cm5zIGEgaGFuZGxlIHRvIGEgY29tcHJlc3NvciBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIE5VTEwgb3RoZXJ3aXNlCisgKiBAcGFyYW0gICBmb3JtYXQgICAgICBDb2RlciB0byBzZWxlY3QKKyAqIEByZXR1cm4gICAgICAgICAgICAgIFJldHVybnMgYSBoYW5kbGUgdG8gYSBjb21wcmVzc29yIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKICAqLwogT1BKX0FQSSBvcGpfY29kZWNfdCogT1BKX0NBTExDT05WIG9wal9jcmVhdGVfY29tcHJlc3MoT1BKX0NPREVDX0ZPUk1BVCBmb3JtYXQpOwogCiAvKioKLVNldCBlbmNvZGluZyBwYXJhbWV0ZXJzIHRvIGRlZmF1bHQgdmFsdWVzLCB0aGF0IG1lYW5zIDogCitTZXQgZW5jb2RpbmcgcGFyYW1ldGVycyB0byBkZWZhdWx0IHZhbHVlcywgdGhhdCBtZWFucyA6CiA8dWw+CiA8bGk+TG9zc2xlc3MKIDxsaT4xIHRpbGUKQEAgLTE0MjcsNDUgKzE1MzMsNDYgQEAKIDwvdWw+CiBAcGFyYW0gcGFyYW1ldGVycyBDb21wcmVzc2lvbiBwYXJhbWV0ZXJzCiAqLwotT1BKX0FQSSB2b2lkIE9QSl9DQUxMQ09OViBvcGpfc2V0X2RlZmF1bHRfZW5jb2Rlcl9wYXJhbWV0ZXJzKG9wal9jcGFyYW1ldGVyc190ICpwYXJhbWV0ZXJzKTsKK09QSl9BUEkgdm9pZCBPUEpfQ0FMTENPTlYgb3BqX3NldF9kZWZhdWx0X2VuY29kZXJfcGFyYW1ldGVycygKKyAgICBvcGpfY3BhcmFtZXRlcnNfdCAqcGFyYW1ldGVycyk7CiAKIC8qKgogICogU2V0dXAgdGhlIGVuY29kZXIgcGFyYW1ldGVycyB1c2luZyB0aGUgY3VycmVudCBpbWFnZSBhbmQgdXNpbmcgdXNlciBwYXJhbWV0ZXJzLgotICogQHBhcmFtIHBfY29kZWMgCQlDb21wcmVzc29yIGhhbmRsZQotICogQHBhcmFtIHBhcmFtZXRlcnMgCUNvbXByZXNzaW9uIHBhcmFtZXRlcnMKLSAqIEBwYXJhbSBpbWFnZSAJCUlucHV0IGZpbGxlZCBpbWFnZQorICogQHBhcmFtIHBfY29kZWMgICAgICAgQ29tcHJlc3NvciBoYW5kbGUKKyAqIEBwYXJhbSBwYXJhbWV0ZXJzICAgIENvbXByZXNzaW9uIHBhcmFtZXRlcnMKKyAqIEBwYXJhbSBpbWFnZSAgICAgICAgIElucHV0IGZpbGxlZCBpbWFnZQogICovCi1PUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0dXBfZW5jb2RlcihvcGpfY29kZWNfdCAqcF9jb2RlYywgCi0JCQkJCQkJCQkJCQlvcGpfY3BhcmFtZXRlcnNfdCAqcGFyYW1ldGVycywgCi0JCQkJCQkJCQkJCQlvcGpfaW1hZ2VfdCAqaW1hZ2UpOworT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldHVwX2VuY29kZXIob3BqX2NvZGVjX3QgKnBfY29kZWMsCisgICAgICAgIG9wal9jcGFyYW1ldGVyc190ICpwYXJhbWV0ZXJzLAorICAgICAgICBvcGpfaW1hZ2VfdCAqaW1hZ2UpOwogCiAvKioKICAqIFN0YXJ0IHRvIGNvbXByZXNzIHRoZSBjdXJyZW50IGltYWdlLgotICogQHBhcmFtIHBfY29kZWMgCQlDb21wcmVzc29yIGhhbmRsZQotICogQHBhcmFtIGltYWdlIAkgICAgSW5wdXQgZmlsbGVkIGltYWdlCi0gKiBAcGFyYW0gcF9zdHJlYW0gCQlJbnB1dCBzdGdyZWFtCisgKiBAcGFyYW0gcF9jb2RlYyAgICAgICBDb21wcmVzc29yIGhhbmRsZQorICogQHBhcmFtIHBfaW1hZ2UgICAgICAgSW5wdXQgZmlsbGVkIGltYWdlCisgKiBAcGFyYW0gcF9zdHJlYW0gICAgICBJbnB1dCBzdGdyZWFtCiAgKi8KLU9QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zdGFydF9jb21wcmVzcyAoCW9wal9jb2RlY190ICpwX2NvZGVjLAotCQkJCQkJCQkJCQkJCW9wal9pbWFnZV90ICogcF9pbWFnZSwKLQkJCQkJCQkJCQkJCQlvcGpfc3RyZWFtX3QgKnBfc3RyZWFtKTsKK09QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9zdGFydF9jb21wcmVzcyhvcGpfY29kZWNfdCAqcF9jb2RlYywKKyAgICAgICAgb3BqX2ltYWdlX3QgKiBwX2ltYWdlLAorICAgICAgICBvcGpfc3RyZWFtX3QgKnBfc3RyZWFtKTsKIAogLyoqCiAgKiBFbmQgdG8gY29tcHJlc3MgdGhlIGN1cnJlbnQgaW1hZ2UuCi0gKiBAcGFyYW0gcF9jb2RlYyAJCUNvbXByZXNzb3IgaGFuZGxlCi0gKiBAcGFyYW0gcF9zdHJlYW0gCQlJbnB1dCBzdGdyZWFtCisgKiBAcGFyYW0gcF9jb2RlYyAgICAgICBDb21wcmVzc29yIGhhbmRsZQorICogQHBhcmFtIHBfc3RyZWFtICAgICAgSW5wdXQgc3RncmVhbQogICovCi1PUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfZW5kX2NvbXByZXNzIChvcGpfY29kZWNfdCAqcF9jb2RlYywKLQkJCQkJCQkJCQkJCW9wal9zdHJlYW1fdCAqcF9zdHJlYW0pOworT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX2VuZF9jb21wcmVzcyhvcGpfY29kZWNfdCAqcF9jb2RlYywKKyAgICAgICAgb3BqX3N0cmVhbV90ICpwX3N0cmVhbSk7CiAKIC8qKgogICogRW5jb2RlIGFuIGltYWdlIGludG8gYSBKUEVHLTIwMDAgY29kZXN0cmVhbQotICogQHBhcmFtIHBfY29kZWMgCQljb21wcmVzc29yIGhhbmRsZQotICogQHBhcmFtIHBfc3RyZWFtIAkJT3V0cHV0IGJ1ZmZlciBzdHJlYW0KKyAqIEBwYXJhbSBwX2NvZGVjICAgICAgIGNvbXByZXNzb3IgaGFuZGxlCisgKiBAcGFyYW0gcF9zdHJlYW0gICAgICBPdXRwdXQgYnVmZmVyIHN0cmVhbQogICoKLSAqIEByZXR1cm4gCQkJCVJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIGZhbHNlIG90aGVyd2lzZQorICogQHJldHVybiAgICAgICAgICAgICAgUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlCiAgKi8KIE9QSl9BUEkgT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9lbmNvZGUob3BqX2NvZGVjX3QgKnBfY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9zdHJlYW1fdCAqcF9zdHJlYW0pOworICAgICAgICBvcGpfc3RyZWFtX3QgKnBfc3RyZWFtKTsKIC8qCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBjb2RlYyBvdXRwdXQgZnVuY3Rpb25zIGRlZmluaXRpb25zCkBAIC0xNDc3LDYwICsxNTg0LDY1IEBACiBEZXN0cm95IENvZGVzdHJlYW0gaW5mb3JtYXRpb24gYWZ0ZXIgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbgogQHBhcmFtIGNzdHJfaW5mbyBDb2Rlc3RyZWFtIGluZm9ybWF0aW9uIHN0cnVjdHVyZQogKi8KLU9QSl9BUEkgdm9pZCBPUEpfQ0FMTENPTlYgb3BqX2Rlc3Ryb3lfY3N0cl9pbmZvKG9wal9jb2Rlc3RyZWFtX2luZm9fdjJfdCAqKmNzdHJfaW5mbyk7CitPUEpfQVBJIHZvaWQgT1BKX0NBTExDT05WIG9wal9kZXN0cm95X2NzdHJfaW5mbyhvcGpfY29kZXN0cmVhbV9pbmZvX3YyX3QKKyAgICAgICAgKipjc3RyX2luZm8pOwogCiAKIC8qKgogICogRHVtcCB0aGUgY29kZWMgaW5mb3JtYXRpb24gaW50byB0aGUgb3V0cHV0IHN0cmVhbQogICoKLSAqIEBwYXJhbQlwX2NvZGVjCQkJdGhlIGpwZWcyMDAwIGNvZGVjLgotICogQHBhcmFtCWluZm9fZmxhZwkJdHlwZSBvZiBpbmZvcm1hdGlvbiBkdW1wLgotICogQHBhcmFtCW91dHB1dF9zdHJlYW0Jb3V0cHV0IHN0cmVhbSB3aGVyZSBkdW1wIHRoZSBpbmZvcm1hdGlvbnMgZ2V0IGZyb20gdGhlIGNvZGVjLgorICogQHBhcmFtICAgcF9jb2RlYyAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KKyAqIEBwYXJhbSAgIGluZm9fZmxhZyAgICAgICB0eXBlIG9mIGluZm9ybWF0aW9uIGR1bXAuCisgKiBAcGFyYW0gICBvdXRwdXRfc3RyZWFtICAgb3V0cHV0IHN0cmVhbSB3aGVyZSBkdW1wIHRoZSBpbmZvcm1hdGlvbiBnb3R0ZW4gZnJvbSB0aGUgY29kZWMuCiAgKgogICovCi1PUEpfQVBJIHZvaWQgT1BKX0NBTExDT05WIG9wal9kdW1wX2NvZGVjKAlvcGpfY29kZWNfdCAqcF9jb2RlYywKLQkJCQkJCQkJCQkJT1BKX0lOVDMyIGluZm9fZmxhZywKLQkJCQkJCQkJCQkJRklMRSogb3V0cHV0X3N0cmVhbSk7CitPUEpfQVBJIHZvaWQgT1BKX0NBTExDT05WIG9wal9kdW1wX2NvZGVjKG9wal9jb2RlY190ICpwX2NvZGVjLAorICAgICAgICBPUEpfSU5UMzIgaW5mb19mbGFnLAorICAgICAgICBGSUxFKiBvdXRwdXRfc3RyZWFtKTsKIAogLyoqCiAgKiBHZXQgdGhlIGNvZGVzdHJlYW0gaW5mb3JtYXRpb24gZnJvbSB0aGUgY29kZWMKICAqCi0gKiBAcGFyYW0JcF9jb2RlYwkJCXRoZSBqcGVnMjAwMCBjb2RlYy4KKyAqIEBwYXJhbSAgIHBfY29kZWMgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCiAgKgotICogQHJldHVybgkJCQkJYSBwb2ludGVyIHRvIGEgY29kZXN0cmVhbSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCisgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIHRvIGEgY29kZXN0cmVhbSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUuCiAgKgogICovCi1PUEpfQVBJIG9wal9jb2Rlc3RyZWFtX2luZm9fdjJfdCogT1BKX0NBTExDT05WIG9wal9nZXRfY3N0cl9pbmZvKG9wal9jb2RlY190ICpwX2NvZGVjKTsKK09QSl9BUEkgb3BqX2NvZGVzdHJlYW1faW5mb192Ml90KiBPUEpfQ0FMTENPTlYgb3BqX2dldF9jc3RyX2luZm8oCisgICAgb3BqX2NvZGVjX3QgKnBfY29kZWMpOwogCiAvKioKICAqIEdldCB0aGUgY29kZXN0cmVhbSBpbmRleCBmcm9tIHRoZSBjb2RlYwogICoKLSAqIEBwYXJhbQlwX2NvZGVjCQkJdGhlIGpwZWcyMDAwIGNvZGVjLgorICogQHBhcmFtICAgcF9jb2RlYyAgICAgICAgIHRoZSBqcGVnMjAwMCBjb2RlYy4KICAqCi0gKiBAcmV0dXJuCQkJCQlhIHBvaW50ZXIgdG8gYSBjb2Rlc3RyZWFtIGluZGV4IHN0cnVjdHVyZS4KKyAqIEByZXR1cm4gICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgdG8gYSBjb2Rlc3RyZWFtIGluZGV4IHN0cnVjdHVyZS4KICAqCiAgKi8KLU9QSl9BUEkgb3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqIE9QSl9DQUxMQ09OViBvcGpfZ2V0X2NzdHJfaW5kZXgob3BqX2NvZGVjX3QgKnBfY29kZWMpOworT1BKX0FQSSBvcGpfY29kZXN0cmVhbV9pbmRleF90ICogT1BKX0NBTExDT05WIG9wal9nZXRfY3N0cl9pbmRleCgKKyAgICBvcGpfY29kZWNfdCAqcF9jb2RlYyk7CiAKLU9QSl9BUEkgdm9pZCBPUEpfQ0FMTENPTlYgb3BqX2Rlc3Ryb3lfY3N0cl9pbmRleChvcGpfY29kZXN0cmVhbV9pbmRleF90ICoqcF9jc3RyX2luZGV4KTsKK09QSl9BUEkgdm9pZCBPUEpfQ0FMTENPTlYgb3BqX2Rlc3Ryb3lfY3N0cl9pbmRleChvcGpfY29kZXN0cmVhbV9pbmRleF90CisgICAgICAgICoqcF9jc3RyX2luZGV4KTsKIAogCiAvKioKICAqIEdldCB0aGUgSlAyIGZpbGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgY29kZWMgRklYTUUKICAqCi0gKiBAcGFyYW0JcF9jb2RlYwkJCXRoZSBqcGVnMjAwMCBjb2RlYy4KKyAqIEBwYXJhbSAgIHBfY29kZWMgICAgICAgICB0aGUganBlZzIwMDAgY29kZWMuCiAgKgotICogQHJldHVybgkJCQkJYSBwb2ludGVyIHRvIGEgSlAyIG1ldGFkYXRhIHN0cnVjdHVyZS4KKyAqIEByZXR1cm4gICAgICAgICAgICAgICAgICBhIHBvaW50ZXIgdG8gYSBKUDIgbWV0YWRhdGEgc3RydWN0dXJlLgogICoKICAqLwotT1BKX0FQSSBvcGpfanAyX21ldGFkYXRhX3QqIE9QSl9DQUxMQ09OViBvcGpfZ2V0X2pwMl9tZXRhZGF0YShvcGpfY29kZWNfdCAqcF9jb2RlYyk7CitPUEpfQVBJIG9wal9qcDJfbWV0YWRhdGFfdCogT1BKX0NBTExDT05WIG9wal9nZXRfanAyX21ldGFkYXRhKAorICAgIG9wal9jb2RlY190ICpwX2NvZGVjKTsKIAogLyoqCiAgKiBHZXQgdGhlIEpQMiBmaWxlIGluZGV4IGZyb20gdGhlIGNvZGVjIEZJWE1FCiAgKgotICogQHBhcmFtCXBfY29kZWMJCQl0aGUganBlZzIwMDAgY29kZWMuCisgKiBAcGFyYW0gICBwX2NvZGVjICAgICAgICAgdGhlIGpwZWcyMDAwIGNvZGVjLgogICoKLSAqIEByZXR1cm4JCQkJCWEgcG9pbnRlciB0byBhIEpQMiBpbmRleCBzdHJ1Y3R1cmUuCisgKiBAcmV0dXJuICAgICAgICAgICAgICAgICAgYSBwb2ludGVyIHRvIGEgSlAyIGluZGV4IHN0cnVjdHVyZS4KICAqCiAgKi8KIE9QSl9BUEkgb3BqX2pwMl9pbmRleF90KiBPUEpfQ0FMTENPTlYgb3BqX2dldF9qcDJfaW5kZXgob3BqX2NvZGVjX3QgKnBfY29kZWMpOwpAQCAtMTU0NSwxOCArMTY1NywzMSBAQAogLyoqCiAgKiBTZXRzIHRoZSBNQ1QgbWF0cml4IHRvIHVzZS4KICAqCi0gKiBAcGFyYW0JcGFyYW1ldGVycwkJdGhlIHBhcmFtZXRlcnMgdG8gY2hhbmdlLgotICogQHBhcmFtCXBFbmNvZGluZ01hdHJpeAl0aGUgZW5jb2RpbmcgbWF0cml4LgotICogQHBhcmFtCXBfZGNfc2hpZnQJCXRoZSBkYyBzaGlmdCBjb2VmZmljaWVudHMgdG8gdXNlLgotICogQHBhcmFtCXBOYkNvbXAJCQl0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgb2YgdGhlIGltYWdlLgorICogQHBhcmFtICAgcGFyYW1ldGVycyAgICAgIHRoZSBwYXJhbWV0ZXJzIHRvIGNoYW5nZS4KKyAqIEBwYXJhbSAgIHBFbmNvZGluZ01hdHJpeCB0aGUgZW5jb2RpbmcgbWF0cml4LgorICogQHBhcmFtICAgcF9kY19zaGlmdCAgICAgIHRoZSBkYyBzaGlmdCBjb2VmZmljaWVudHMgdG8gdXNlLgorICogQHBhcmFtICAgcE5iQ29tcCAgICAgICAgIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cyBvZiB0aGUgaW1hZ2UuCiAgKgotICogQHJldHVybgl0cnVlIGlmIHRoZSBwYXJhbWV0ZXJzIGNvdWxkIGJlIHNldC4KKyAqIEByZXR1cm4gIHRydWUgaWYgdGhlIHBhcmFtZXRlcnMgY291bGQgYmUgc2V0LgogICovCi1PUEpfQVBJIE9QSl9CT09MIE9QSl9DQUxMQ09OViBvcGpfc2V0X01DVCggb3BqX2NwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgT1BKX0ZMT0FUMzIgKiBwRW5jb2RpbmdNYXRyaXgsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgT1BKX0lOVDMyICogcF9kY19zaGlmdCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICBPUEpfVUlOVDMyIHBOYkNvbXApOworT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX3NldF9NQ1Qob3BqX2NwYXJhbWV0ZXJzX3QgKnBhcmFtZXRlcnMsCisgICAgICAgIE9QSl9GTE9BVDMyICogcEVuY29kaW5nTWF0cml4LAorICAgICAgICBPUEpfSU5UMzIgKiBwX2RjX3NoaWZ0LAorICAgICAgICBPUEpfVUlOVDMyIHBOYkNvbXApOwogCisvKgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgVGhyZWFkIGZ1bmN0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworLyoqIFJldHVybnMgaWYgdGhlIGxpYnJhcnkgaXMgYnVpbHQgd2l0aCB0aHJlYWQgc3VwcG9ydC4KKyAqIE9QSl9UUlVFIGlmIG11dGV4LCBjb25kaXRpb24sIHRocmVhZCwgdGhyZWFkIHBvb2wgYXJlIGF2YWlsYWJsZS4KKyAqLworT1BKX0FQSSBPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX2hhc190aHJlYWRfc3VwcG9ydCh2b2lkKTsKKworLyoqIFJldHVybiB0aGUgbnVtYmVyIG9mIHZpcnR1YWwgQ1BVcyAqLworT1BKX0FQSSBpbnQgT1BKX0NBTExDT05WIG9wal9nZXRfbnVtX2NwdXModm9pZCk7CiAKIAogI2lmZGVmIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9jbG9jay5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfY2xvY2suYwppbmRleCAwZGY5OWVmLi4yNGY3OWE5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9jbG9jay5jCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2Nsb2NrLmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCiAgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCiAgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCiAgKgpAQCAtMjksNiArMjksOCBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KIAorI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgorCiAjaWZkZWYgX1dJTjMyCiAjaW5jbHVkZSA8d2luZG93cy5oPgogI2Vsc2UKQEAgLTM2LDI5ICszOCwzMCBAQAogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogI2luY2x1ZGUgPHN5cy90aW1lcy5oPgogI2VuZGlmIC8qIF9XSU4zMiAqLwotI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgogCi1PUEpfRkxPQVQ2NCBvcGpfY2xvY2sodm9pZCkgeworT1BKX0ZMT0FUNjQgb3BqX2Nsb2NrKHZvaWQpCit7CiAjaWZkZWYgX1dJTjMyCi0JLyogX1dJTjMyOiB1c2UgUXVlcnlQZXJmb3JtYW5jZSAodmVyeSBhY2N1cmF0ZSkgKi8KLSAgICBMQVJHRV9JTlRFR0VSIGZyZXEgLCB0IDsKKyAgICAvKiBfV0lOMzI6IHVzZSBRdWVyeVBlcmZvcm1hbmNlICh2ZXJ5IGFjY3VyYXRlKSAqLworICAgIExBUkdFX0lOVEVHRVIgZnJlcSwgdCA7CiAgICAgLyogZnJlcSBpcyB0aGUgY2xvY2sgc3BlZWQgb2YgdGhlIENQVSAqLwogICAgIFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koJmZyZXEpIDsKLQkvKiBjb3V0IDw8ICJmcmVxID0gIiA8PCAoKGRvdWJsZSkgZnJlcS5RdWFkUGFydCkgPDwgZW5kbDsgKi8KKyAgICAvKiBjb3V0IDw8ICJmcmVxID0gIiA8PCAoKGRvdWJsZSkgZnJlcS5RdWFkUGFydCkgPDwgZW5kbDsgKi8KICAgICAvKiB0IGlzIHRoZSBoaWdoIHJlc29sdXRpb24gcGVyZm9ybWFuY2UgY291bnRlciAoc2VlIE1TRE4pICovCi0gICAgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIgKCAmIHQgKSA7Ci0gICAgcmV0dXJuICggdC5RdWFkUGFydCAvKE9QSl9GTE9BVDY0KSBmcmVxLlF1YWRQYXJ0ICkgOworICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCYgdCkgOworICAgIHJldHVybiAoKE9QSl9GTE9BVDY0KSB0LlF1YWRQYXJ0IC8gKE9QSl9GTE9BVDY0KSBmcmVxLlF1YWRQYXJ0KSA7CiAjZWxzZQotCS8qIFVuaXggb3IgTGludXg6IHVzZSByZXNvdXJjZSB1c2FnZSAqLworICAgIC8qIFVuaXggb3IgTGludXg6IHVzZSByZXNvdXJjZSB1c2FnZSAqLwogICAgIHN0cnVjdCBydXNhZ2UgdDsKICAgICBPUEpfRkxPQVQ2NCBwcm9jVGltZTsKICAgICAvKiAoMSkgR2V0IHRoZSBydXNhZ2UgZGF0YSBzdHJ1Y3R1cmUgYXQgdGhpcyBtb21lbnQgKG1hbiBnZXRydXNhZ2UpICovCi0gICAgZ2V0cnVzYWdlKDAsJnQpOworICAgIGdldHJ1c2FnZSgwLCAmdCk7CiAgICAgLyogKDIpIFdoYXQgaXMgdGhlIGVsYXBzZWQgdGltZSA/IC0gQ1BVIHRpbWUgPSBVc2VyIHRpbWUgKyBTeXN0ZW0gdGltZSAqLwotCS8qICgyYSkgR2V0IHRoZSBzZWNvbmRzICovCisgICAgLyogKDJhKSBHZXQgdGhlIHNlY29uZHMgKi8KICAgICBwcm9jVGltZSA9IChPUEpfRkxPQVQ2NCkodC5ydV91dGltZS50dl9zZWMgKyB0LnJ1X3N0aW1lLnR2X3NlYyk7CiAgICAgLyogKDJiKSBNb3JlIHByZWNpc2VseSEgR2V0IHRoZSBtaWNyb3NlY29uZHMgcGFydCAhICovCi0gICAgcmV0dXJuICggcHJvY1RpbWUgKyAoT1BKX0ZMT0FUNjQpKHQucnVfdXRpbWUudHZfdXNlYyArIHQucnVfc3RpbWUudHZfdXNlYykgKiAxZS02ICkgOworICAgIHJldHVybiAocHJvY1RpbWUgKyAoT1BKX0ZMT0FUNjQpKHQucnVfdXRpbWUudHZfdXNlYyArIHQucnVfc3RpbWUudHZfdXNlYykgKgorICAgICAgICAgICAgMWUtNikgOwogI2VuZGlmCiB9CiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2Nsb2NrLmggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9jbG9jay5oCmluZGV4IDZmNTE2OGIuLjc2MzY2ZjUgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2Nsb2NrLmgKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfY2xvY2suaApAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKLSAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQKICAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKICAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KICAqCkBAIC0yOCw4ICsyOCw4IEBACiAgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KLSNpZm5kZWYgX19PUEpfQ0xPQ0tfSAotI2RlZmluZSBfX09QSl9DTE9DS19ICisjaWZuZGVmIE9QSl9DTE9DS19ICisjZGVmaW5lIE9QSl9DTE9DS19ICiAvKioKIEBmaWxlIG9wal9jbG9jay5oCiBAYnJpZWYgSW50ZXJuYWwgZnVuY3Rpb24gZm9yIHRpbWluZwpAQCAtNTUsNSArNTUsNSBAQAogCiAvKkB9Ki8KIAotI2VuZGlmIC8qIF9fT1BKX0NMT0NLX0ggKi8KKyNlbmRpZiAvKiBPUEpfQ0xPQ0tfSCAqLwogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9jb2RlYy5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfY29kZWMuaAppbmRleCA2YmQ3OTFmLi5iOTYyYjEyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9jb2RlYy5oCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2NvZGVjLmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCiAgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCiAgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCiAgKgpAQCAtMjksOCArMjksOCBAQAogICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCi0jaWZuZGVmIF9fT1BKX0NPREVDX0gKLSNkZWZpbmUgX19PUEpfQ09ERUNfSAorI2lmbmRlZiBPUEpfQ09ERUNfSAorI2RlZmluZSBPUEpfQ09ERUNfSAogLyoqCiBAZmlsZSBvcGpfY29kZWMuaAogKi8KQEAgLTM5LDExMyArMzksMTE1IEBACiAvKioKICAqIE1haW4gY29kZWMgaGFuZGxlciB1c2VkIGZvciBjb21wcmVzc2lvbiBvciBkZWNvbXByZXNzaW9uLgogICovCi10eXBlZGVmIHN0cnVjdCBvcGpfY29kZWNfcHJpdmF0ZQotewordHlwZWRlZiBzdHJ1Y3Qgb3BqX2NvZGVjX3ByaXZhdGUgewogICAgIC8qKiBGSVhNRSBET0MgKi8KLSAgICB1bmlvbgotICAgIHsKKyAgICB1bmlvbiB7CiAgICAgICAgIC8qKgogICAgICAgICAgKiBEZWNvbXByZXNzaW9uIGhhbmRsZXIuCiAgICAgICAgICAqLwotICAgICAgICBzdHJ1Y3Qgb3BqX2RlY29tcHJlc3Npb24KLSAgICAgICAgeworICAgICAgICBzdHJ1Y3Qgb3BqX2RlY29tcHJlc3Npb24gewogICAgICAgICAgICAgLyoqIE1haW4gaGVhZGVyIHJlYWRpbmcgZnVuY3Rpb24gaGFuZGxlciAqLwotICAgICAgICAgICAgT1BKX0JPT0wgKCpvcGpfcmVhZF9oZWFkZXIpICggc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqIGNpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBwX2NvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKipwX2ltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIpOworICAgICAgICAgICAgT1BKX0JPT0woKm9wal9yZWFkX2hlYWRlcikoc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqIGNpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBwX2NvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKipwX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIpOwogCiAgICAgICAgICAgICAvKiogRGVjb2RpbmcgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIE9QSl9CT09MICgqb3BqX2RlY29kZSkgKCB2b2lkICogcF9jb2RlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICogcF9jaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKiBwX2ltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyKTsKKyAgICAgICAgICAgIE9QSl9CT09MKCpvcGpfZGVjb2RlKSh2b2lkICogcF9jb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICogcF9jaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKiBwX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyKTsKIAogICAgICAgICAgICAgLyoqIEZJWE1FIERPQyAqLwotICAgICAgICAgICAgT1BKX0JPT0wgKCpvcGpfcmVhZF90aWxlX2hlYWRlcikoIHZvaWQgKiBwX2NvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX3RpbGVfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV94MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3RpbGVfeTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3gxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV95MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9uYl9jb21wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQk9PTCAqIHBfc2hvdWxkX2dvX29uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiBwX2NpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlcik7CisgICAgICAgICAgICBPUEpfQk9PTCgqb3BqX3JlYWRfdGlsZV9oZWFkZXIpKHZvaWQgKiBwX2NvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF90aWxlX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV94MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90aWxlX3kwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3RpbGVfeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdGlsZV95MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbmJfY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CT09MICogcF9zaG91bGRfZ29fb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiBwX2NpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIpOwogCiAgICAgICAgICAgICAvKiogRklYTUUgRE9DICovCi0gICAgICAgICAgICBPUEpfQk9PTCAoKm9wal9kZWNvZGVfdGlsZV9kYXRhKSggdm9pZCAqIHBfY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICogcF9jaW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIpOworICAgICAgICAgICAgT1BKX0JPT0woKm9wal9kZWNvZGVfdGlsZV9kYXRhKSh2b2lkICogcF9jb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICogcF9jaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyKTsKIAogICAgICAgICAgICAgLyoqIFJlYWRpbmcgZnVuY3Rpb24gdXNlZCBhZnRlciBjb2Rlc3RyZWFtIGlmIG5lY2Vzc2FyeSAqLwotICAgICAgICAgICAgT1BKX0JPT0wgKCogb3BqX2VuZF9kZWNvbXByZXNzKSAoIHZvaWQgKnBfY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqIGNpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlcik7CisgICAgICAgICAgICBPUEpfQk9PTCgqIG9wal9lbmRfZGVjb21wcmVzcykodm9pZCAqcF9jb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICogY2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyKTsKIAogICAgICAgICAgICAgLyoqIENvZGVjIGRlc3Ryb3kgZnVuY3Rpb24gaGFuZGxlciAqLwotICAgICAgICAgICAgdm9pZCAoKm9wal9kZXN0cm95KSAodm9pZCAqIHBfY29kZWMpOworICAgICAgICAgICAgdm9pZCAoKm9wal9kZXN0cm95KSh2b2lkICogcF9jb2RlYyk7CiAKICAgICAgICAgICAgIC8qKiBTZXR1cCBkZWNvZGVyIGZ1bmN0aW9uIGhhbmRsZXIgKi8KLSAgICAgICAgICAgIHZvaWQgKCpvcGpfc2V0dXBfZGVjb2RlcikgKCB2b2lkICogcF9jb2RlYywgb3BqX2RwYXJhbWV0ZXJzX3QgKiBwX3BhcmFtKTsKKyAgICAgICAgICAgIHZvaWQgKCpvcGpfc2V0dXBfZGVjb2Rlcikodm9pZCAqIHBfY29kZWMsIG9wal9kcGFyYW1ldGVyc190ICogcF9wYXJhbSk7CiAKICAgICAgICAgICAgIC8qKiBTZXQgZGVjb2RlIGFyZWEgZnVuY3Rpb24gaGFuZGxlciAqLwotICAgICAgICAgICAgT1BKX0JPT0wgKCpvcGpfc2V0X2RlY29kZV9hcmVhKSAoIHZvaWQgKiBwX2NvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90ICogcF9pbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF9zdGFydF94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX2VuZF94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3N0YXJ0X3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfZW5kX3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIpOworICAgICAgICAgICAgT1BKX0JPT0woKm9wal9zZXRfZGVjb2RlX2FyZWEpKHZvaWQgKiBwX2NvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90ICogcF9pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF9zdGFydF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX2VuZF94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3N0YXJ0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfZW5kX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIpOwogCiAgICAgICAgICAgICAvKiogR2V0IHRpbGUgZnVuY3Rpb24gKi8KLSAgICAgICAgICAgIE9QSl9CT09MICgqb3BqX2dldF9kZWNvZGVkX3RpbGUpICggdm9pZCAqcF9jb2RlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3N0cmVhbV9wcml2YXRlX3QgKiBwX2NpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRpbGVfaW5kZXgpOworICAgICAgICAgICAgT1BKX0JPT0woKm9wal9nZXRfZGVjb2RlZF90aWxlKSh2b2lkICpwX2NvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfc3RyZWFtX3ByaXZhdGVfdCAqIHBfY2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqcF9pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdGlsZV9pbmRleCk7CiAKICAgICAgICAgICAgIC8qKiBTZXQgdGhlIGRlY29kZWQgcmVzb2x1dGlvbiBmYWN0b3IgKi8KLSAgICAgICAgICAgIE9QSl9CT09MICgqb3BqX3NldF9kZWNvZGVkX3Jlc29sdXRpb25fZmFjdG9yKSAoIHZvaWQgKiBwX2NvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiByZXNfZmFjdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICogcF9tYW5hZ2VyKTsKKyAgICAgICAgICAgIE9QSl9CT09MKCpvcGpfc2V0X2RlY29kZWRfcmVzb2x1dGlvbl9mYWN0b3IpKHZvaWQgKiBwX2NvZGVjLAorICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHJlc19mYWN0b3IsCisgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CisKKyAgICAgICAgICAgIC8qKiBTZXQgdGhlIGRlY29kZWQgY29tcG9uZW50cyAqLworICAgICAgICAgICAgT1BKX0JPT0woKm9wal9zZXRfZGVjb2RlZF9jb21wb25lbnRzKSh2b2lkICogcF9jb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBudW1fY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9QSl9VSU5UMzIqIGNvbXBzX2luZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqIHBfbWFuYWdlcik7CiAgICAgICAgIH0gbV9kZWNvbXByZXNzaW9uOwogCiAgICAgICAgIC8qKgogICAgICAgICAgKiBDb21wcmVzc2lvbiBoYW5kbGVyLiBGSVhNRSBET0MKICAgICAgICAgICovCi0gICAgICAgIHN0cnVjdCBvcGpfY29tcHJlc3Npb24KLSAgICAgICAgewotICAgICAgICAgICAgT1BKX0JPT0wgKCogb3BqX3N0YXJ0X2NvbXByZXNzKSAoIHZvaWQgKnBfY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqIGNpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2ltYWdlICogcF9pbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlcik7CisgICAgICAgIHN0cnVjdCBvcGpfY29tcHJlc3Npb24geworICAgICAgICAgICAgT1BKX0JPT0woKiBvcGpfc3RhcnRfY29tcHJlc3MpKHZvaWQgKnBfY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqIGNpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2ltYWdlICogcF9pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlcik7CiAKLSAgICAgICAgICAgIE9QSl9CT09MICgqIG9wal9lbmNvZGUpICggdm9pZCAqIHBfY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKnBfY2lvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlcik7CisgICAgICAgICAgICBPUEpfQk9PTCgqIG9wal9lbmNvZGUpKHZvaWQgKiBwX2NvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX3N0cmVhbV9wcml2YXRlICpwX2NpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9ldmVudF9tZ3IgKiBwX21hbmFnZXIpOwogCi0gICAgICAgICAgICBPUEpfQk9PTCAoKiBvcGpfd3JpdGVfdGlsZSkgKCB2b2lkICogcF9jb2RlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqIHBfY2lvLAorICAgICAgICAgICAgT1BKX0JPT0woKiBvcGpfd3JpdGVfdGlsZSkodm9pZCAqIHBfY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfc3RyZWFtX3ByaXZhdGUgKiBwX2NpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyKTsKKworICAgICAgICAgICAgT1BKX0JPT0woKiBvcGpfZW5kX2NvbXByZXNzKSh2b2lkICogcF9jb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqIHBfY2lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlcik7CisKKyAgICAgICAgICAgIHZvaWQgKCogb3BqX2Rlc3Ryb3kpKHZvaWQgKiBwX2NvZGVjKTsKKworICAgICAgICAgICAgT1BKX0JPT0woKiBvcGpfc2V0dXBfZW5jb2Rlcikodm9pZCAqIHBfY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY3BhcmFtZXRlcnNfdCAqIHBfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2ltYWdlICogcF9pbWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBvcGpfZXZlbnRfbWdyICogcF9tYW5hZ2VyKTsKLQotICAgICAgICAgICAgT1BKX0JPT0wgKCogb3BqX2VuZF9jb21wcmVzcykgKAl2b2lkICogcF9jb2RlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9zdHJlYW1fcHJpdmF0ZSAqIHBfY2lvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlcik7Ci0KLSAgICAgICAgICAgIHZvaWQgKCogb3BqX2Rlc3Ryb3kpICh2b2lkICogcF9jb2RlYyk7Ci0KLSAgICAgICAgICAgIE9QSl9CT09MICgqIG9wal9zZXR1cF9lbmNvZGVyKSAoIHZvaWQgKiBwX2NvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwYXJhbWV0ZXJzX3QgKiBwX3BhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9pbWFnZSAqIHBfaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgb3BqX2V2ZW50X21nciAqIHBfbWFuYWdlcik7CiAgICAgICAgIH0gbV9jb21wcmVzc2lvbjsKICAgICB9IG1fY29kZWNfZGF0YTsKICAgICAvKiogRklYTUUgRE9DKi8KQEAgLTE1NCwxMiArMTU2LDE2IEBACiAgICAgb3BqX2V2ZW50X21ncl90IG1fZXZlbnRfbWdyOwogICAgIC8qKiBGbGFnIHRvIGluZGljYXRlIGlmIHRoZSBjb2RlYyBpcyB1c2VkIHRvIGRlY29kZSBvciBlbmNvZGUqLwogICAgIE9QSl9CT09MIGlzX2RlY29tcHJlc3NvcjsKLSAgICB2b2lkICgqb3BqX2R1bXBfY29kZWMpICh2b2lkICogcF9jb2RlYywgT1BKX0lOVDMyIGluZm9fZmxhZywgRklMRSogb3V0cHV0X3N0cmVhbSk7CisgICAgdm9pZCAoKm9wal9kdW1wX2NvZGVjKSh2b2lkICogcF9jb2RlYywgT1BKX0lOVDMyIGluZm9fZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEUqIG91dHB1dF9zdHJlYW0pOwogICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdjJfdCogKCpvcGpfZ2V0X2NvZGVjX2luZm8pKHZvaWQqIHBfY29kZWMpOwogICAgIG9wal9jb2Rlc3RyZWFtX2luZGV4X3QqICgqb3BqX2dldF9jb2RlY19pbmRleCkodm9pZCogcF9jb2RlYyk7CisKKyAgICAvKiogU2V0IG51bWJlciBvZiB0aHJlYWRzICovCisgICAgT1BKX0JPT0woKm9wal9zZXRfdGhyZWFkcykodm9pZCAqIHBfY29kZWMsIE9QSl9VSU5UMzIgbnVtX3RocmVhZHMpOwogfQogb3BqX2NvZGVjX3ByaXZhdGVfdDsKIAogCi0jZW5kaWYgLyogX19PUEpfQ09ERUNfSCAqLworI2VuZGlmIC8qIE9QSl9DT0RFQ19IICovCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2NvbW1vbi5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA1MTMzOQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2NvbW1vbi5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCisgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCisgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCBJbnRvUElYIFNBIDxzdXBwb3J0QGludG9waXguY29tPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBPUEpfQ09NTU1PTl9ICisjZGVmaW5lIE9QSl9DT01NTU9OX0gKKworLyoKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICBDb21tb24gY29uc3RhbnRzIHNoYXJlZCBhbW9uZyBzZXZlcmFsIG1vZHVsZXMKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworI2RlZmluZSBPUEpfQ09NTU9OX0NCTEtfREFUQV9FWFRSQSAgICAgICAgMiAgICAvKio8IE1hcmdpbiBmb3IgYSBmYWtlIEZGRkYgbWFya2VyICovCisKKyNlbmRpZiAvKiBPUEpfQ09NTU1PTl9IICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9jb25maWcuaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2NvbmZpZy5oCmluZGV4IDM3YmM5YmEuLjczODQ1NDEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2NvbmZpZy5oCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2NvbmZpZy5oCkBAIC0xMiw1ICsxMiw1IEBACiAKIC8qIFZlcnNpb24gbnVtYmVyLiAqLwogI2RlZmluZSBPUEpfVkVSU0lPTl9NQUpPUiAyCi0jZGVmaW5lIE9QSl9WRVJTSU9OX01JTk9SIDEKKyNkZWZpbmUgT1BKX1ZFUlNJT05fTUlOT1IgMwogI2RlZmluZSBPUEpfVkVSU0lPTl9CVUlMRCAwCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9jb25maWdfcHJpdmF0ZS5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfY29uZmlnX3ByaXZhdGUuaAppbmRleCA3ZDdlM2VhLi44MWI0NDlkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9jb25maWdfcHJpdmF0ZS5oCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2NvbmZpZ19wcml2YXRlLmgKQEAgLTcsNyArNyw3IEBACiAvKiBjcmVhdGUgb3BqX2NvbmZpZ19wcml2YXRlLmggZm9yIENNYWtlICovCiAjZGVmaW5lIE9QSl9IQVZFX0lOVFRZUEVTX0ggCTEKIAotI2RlZmluZSBPUEpfUEFDS0FHRV9WRVJTSU9OICIyLjEuMCIKKyNkZWZpbmUgT1BKX1BBQ0tBR0VfVkVSU0lPTiAiMi4zLjAiCiAKIC8qIE5vdCB1c2VkIGJ5IG9wZW5qcDIqLwogLyojZGVmaW5lIEhBVkVfTUVNT1JZX0ggMSovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9pbmNsdWRlcy5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfaW5jbHVkZXMuaAppbmRleCA1YWRkMDkxLi4wYTg2MjhjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9pbmNsdWRlcy5oCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2luY2x1ZGVzLmgKQEAgLTEsMTEgKzEsMTEgQEAKIC8qCi0gKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKLSAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQKICAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKICAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRlIgCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZSCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCkBAIC01NCw2ICs1NCw3IEBACiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KIAogLyoKICAgVXNlIGZzZWVrbygpIGFuZCBmdGVsbG8oKSBpZiB0aGV5IGFyZSBhdmFpbGFibGUgc2luY2UgdGhleSB1c2UKQEAgLTcwLDExICs3MSwxMSBAQAogI2lmIGRlZmluZWQoV0lOMzIpICYmICFkZWZpbmVkKFdpbmRvd3M5NSkgJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiBcCiAgICEoZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPCAxNDAwKSAmJiBcCiAgICEoZGVmaW5lZChfX01JTkdXMzJfXykgJiYgX19NU1ZDUlRfVkVSU0lPTl9fIDwgMHg4MDApCi0gIC8qCi0gICAgV2luZG93cyAnOTUgYW5kIEJvcmxhbmQgQyBkbyBub3Qgc3VwcG9ydCBfbHNlZWtpNjQKLSAgICBWaXN1YWwgU3R1ZGlvIGRvZXMgbm90IHN1cHBvcnQgX2ZzZWVraTY0IGFuZCBfZnRlbGxpNjQgdW50aWwgdGhlIDIwMDUgcmVsZWFzZS4KLSAgICBXaXRob3V0IHRoZXNlIGludGVyZmFjZXMsIGZpbGVzIG92ZXIgMkdCIGluIHNpemUgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIFdpbmRvd3MuCi0gICovCisvKgorICBXaW5kb3dzICc5NSBhbmQgQm9ybGFuZCBDIGRvIG5vdCBzdXBwb3J0IF9sc2Vla2k2NAorICBWaXN1YWwgU3R1ZGlvIGRvZXMgbm90IHN1cHBvcnQgX2ZzZWVraTY0IGFuZCBfZnRlbGxpNjQgdW50aWwgdGhlIDIwMDUgcmVsZWFzZS4KKyAgV2l0aG91dCB0aGVzZSBpbnRlcmZhY2VzLCBmaWxlcyBvdmVyIDJHQiBpbiBzaXplIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBXaW5kb3dzLgorKi8KICMgIGRlZmluZSBPUEpfRlNFRUsoc3RyZWFtLG9mZnNldCx3aGVuY2UpIF9mc2Vla2k2NChzdHJlYW0sLyogX19pbnQ2NCAqLyBvZmZzZXQsd2hlbmNlKQogIyAgZGVmaW5lIE9QSl9GU1RBVChmaWxkZXMsc3RhdF9idWZmKSBfZnN0YXRpNjQoZmlsZGVzLC8qIHN0cnVjdCBfc3RhdGk2NCAqLyBzdGF0X2J1ZmYpCiAjICBkZWZpbmUgT1BKX0ZURUxMKHN0cmVhbSkgLyogX19pbnQ2NCAqLyBfZnRlbGxpNjQoc3RyZWFtKQpAQCAtMTAzLDY5ICsxMDQsMTIwIEBACiAqLwogCiAvKiBBcmUgcmVzdHJpY3RlZCBwb2ludGVycyBhdmFpbGFibGU/IChDOTkpICovCi0jaWYgKF9fU1REQ19WRVJTSU9OX18gIT0gMTk5OTAxTCkKLQkvKiBOb3QgYSBDOTkgY29tcGlsZXIgKi8KLQkjaWZkZWYgX19HTlVDX18KLQkJI2RlZmluZSByZXN0cmljdCBfX3Jlc3RyaWN0X18KLQkjZWxzZQotCQkjZGVmaW5lIHJlc3RyaWN0IC8qIHJlc3RyaWN0ICovCi0JI2VuZGlmCisjaWYgKF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCkKKyNkZWZpbmUgT1BKX1JFU1RSSUNUIHJlc3RyaWN0CisjZWxzZQorLyogTm90IGEgQzk5IGNvbXBpbGVyICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyNkZWZpbmUgT1BKX1JFU1RSSUNUIF9fcmVzdHJpY3RfXworCisvKgorICB2YzE0ICgyMDE1KSBvdXRwdXRzIHdyb25nIHJlc3VsdHMuCisgIE5lZWQgdG8gY2hlY2sgT1BKX1JFU1RSSUNUIHVzYWdlIChvciBhIGJ1ZyBpbiB2YzE0KQorICAgICNlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxNDAwKQorICAgICAgICAjZGVmaW5lIE9QSl9SRVNUUklDVCBfX3Jlc3RyaWN0CisqLworI2Vsc2UKKyNkZWZpbmUgT1BKX1JFU1RSSUNUIC8qIHJlc3RyaWN0ICovCisjZW5kaWYKICNlbmRpZgogCisjaWZkZWYgX19oYXNfYXR0cmlidXRlCisjaWYgX19oYXNfYXR0cmlidXRlKG5vX3Nhbml0aXplKQorI2RlZmluZSBPUEpfTk9TQU5JVElaRShraW5kKSBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZShraW5kKSkpCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBPUEpfTk9TQU5JVElaRQorI2RlZmluZSBPUEpfTk9TQU5JVElaRShraW5kKQorI2VuZGlmCiAKIAogLyogTVNWQyBiZWZvcmUgMjAxMyBhbmQgQm9ybGFuZCBDIGRvIG5vdCBoYXZlIGxyaW50ZiAqLwogI2lmIGRlZmluZWQoX01TQ19WRVIpCiAjaW5jbHVkZSA8aW50cmluLmg+Ci1zdGF0aWMgSU5MSU5FIGxvbmcgb3BqX2xyaW50ZihmbG9hdCBmKXsKK3N0YXRpYyBJTkxJTkUgbG9uZyBvcGpfbHJpbnRmKGZsb2F0IGYpCit7CiAjaWZkZWYgX01fWDY0Ci0JcmV0dXJuIF9tbV9jdnRfc3Myc2koX21tX2xvYWRfc3MoJmYpKTsKKyAgICByZXR1cm4gX21tX2N2dF9zczJzaShfbW1fbG9hZF9zcygmZikpOwogCi0JLyogY29tbWVudGVkIG91dCBsaW5lIGJyZWFrcyBtYW55IHRlc3RzICovCi0gIC8qIHJldHVybiAobG9uZykoKGY+MC4wZikgPyAoZiArIDAuNWYpOihmIC0wLjVmKSk7ICovCisgICAgLyogY29tbWVudGVkIG91dCBsaW5lIGJyZWFrcyBtYW55IHRlc3RzICovCisgICAgLyogcmV0dXJuIChsb25nKSgoZj4wLjBmKSA/IChmICsgMC41Zik6KGYgLTAuNWYpKTsgKi8KICNlbGlmIGRlZmluZWQoX01fSVg4NikKICAgICBpbnQgaTsKLSAgICAgX2FzbXsKKyAgICBfYXNtewogICAgICAgICBmbGQgZgogICAgICAgICBmaXN0cCBpCiAgICAgfTsKLSAKKwogICAgIHJldHVybiBpOwotI2Vsc2UgCi0JcmV0dXJuIChsb25nKSgoZj4wLjBmKSA/IChmICsgMC41ZikgOiAoZiAtIDAuNWYpKTsKKyNlbHNlCisgICAgcmV0dXJuIChsb25nKSgoZj4wLjBmKSA/IChmICsgMC41ZikgOiAoZiAtIDAuNWYpKTsKICNlbmRpZgogfQogI2VsaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pCi1zdGF0aWMgSU5MSU5FIGxvbmcgb3BqX2xyaW50ZihmbG9hdCBmKSB7CitzdGF0aWMgSU5MSU5FIGxvbmcgb3BqX2xyaW50ZihmbG9hdCBmKQorewogI2lmZGVmIF9NX1g2NAotICAgICByZXR1cm4gKGxvbmcpKChmPjAuMGYpID8gKGYgKyAwLjVmKTooZiAtMC41ZikpOworICAgIHJldHVybiAobG9uZykoKGYgPiAwLjBmKSA/IChmICsgMC41ZikgOiAoZiAtIDAuNWYpKTsKICNlbHNlCi0JaW50IGk7CisgICAgaW50IGk7CiAKLQlfYXNtIHsKLQkJZmxkIGYKLQkJCWZpc3RwIGkKLQl9OworICAgIF9hc20geworICAgICAgICBmbGQgZgorICAgICAgICBmaXN0cCBpCisgICAgfTsKIAotCXJldHVybiBpOworICAgIHJldHVybiBpOwogI2VuZGlmCiB9CiAjZWxzZQotc3RhdGljIElOTElORSBsb25nIG9wal9scmludGYoZmxvYXQgZikgewotCXJldHVybiBscmludGYoZik7CitzdGF0aWMgSU5MSU5FIGxvbmcgb3BqX2xyaW50ZihmbG9hdCBmKQoreworICAgIHJldHVybiBscmludGYoZik7CiB9CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA8IDE0MDApCi0JI2RlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgorI2RlZmluZSB2c25wcmludGYgX3ZzbnByaW50ZgogI2VuZGlmCiAKIC8qIE1TVkMgeDg2IGlzIHJlYWxseSBiYWQgYXQgZG9pbmcgaW50NjQgPSBpbnQzMiAqIGludDMyIG9uIGl0cyBvd24uIFVzZSBpbnRyaW5zaWMuICovCiAjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDE0MDApICYmICFkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpICYmIGRlZmluZWQoX01fSVg4NikKLSMJaW5jbHVkZSA8aW50cmluLmg+Ci0jCXByYWdtYSBpbnRyaW5zaWMoX19lbXVsKQorIyAgIGluY2x1ZGUgPGludHJpbi5oPgorIyAgIHByYWdtYSBpbnRyaW5zaWMoX19lbXVsKQogI2VuZGlmCiAKKy8qIEFwcGFyZW50bHkgVmlzdWFsIFN0dWRpbyBkb2Vzbid0IGRlZmluZSBfX1NTRV9fIC8gX19TU0UyX18gbWFjcm9zICovCisjaWYgZGVmaW5lZChfTV9YNjQpCisvKiBJbnRlbCA2NGJpdCBzdXBwb3J0IFNTRSBhbmQgU1NFMiAqLworIyAgIGlmbmRlZiBfX1NTRV9fCisjICAgICAgIGRlZmluZSBfX1NTRV9fIDEKKyMgICBlbmRpZgorIyAgIGlmbmRlZiBfX1NTRTJfXworIyAgICAgICBkZWZpbmUgX19TU0UyX18gMQorIyAgIGVuZGlmCisjZW5kaWYKKworLyogRm9yIHg4NiwgdGVzdCB0aGUgdmFsdWUgb2YgdGhlIF9NX0lYODZfRlAgbWFjcm8uICovCisvKiBTZWUgaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9iMDA4NGtheS5hc3B4ICovCisjaWYgZGVmaW5lZChfTV9JWDg2X0ZQKQorIyAgIGlmIF9NX0lYODZfRlAgPj0gMQorIyAgICAgICBpZm5kZWYgX19TU0VfXworIyAgICAgICAgICAgZGVmaW5lIF9fU1NFX18gMQorIyAgICAgICBlbmRpZgorIyAgIGVuZGlmCisjICAgaWYgX01fSVg4Nl9GUCA+PSAyCisjICAgICAgIGlmbmRlZiBfX1NTRTJfXworIyAgICAgICAgICAgZGVmaW5lIF9fU1NFMl9fIDEKKyMgICAgICAgZW5kaWYKKyMgICBlbmRpZgorI2VuZGlmCisKKy8qIFR5cGUgdG8gdXNlIGZvciBiaXQtZmllbGRzIGluIGludGVybmFsIGhlYWRlcnMgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IE9QSl9CSVRGSUVMRDsKKworI2RlZmluZSBPUEpfVU5VU0VEKHgpICh2b2lkKXgKKwogI2luY2x1ZGUgIm9wal9pbnR0eXBlcy5oIgogI2luY2x1ZGUgIm9wal9jbG9jay5oIgogI2luY2x1ZGUgIm9wal9tYWxsb2MuaCIKQEAgLTE3NCwxMyArMjI2LDE1IEBACiAjaW5jbHVkZSAiYmlvLmgiCiAjaW5jbHVkZSAiY2lvLmgiCiAKKyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlICJ0bHNfa2V5cy5oIgorCiAjaW5jbHVkZSAiaW1hZ2UuaCIKICNpbmNsdWRlICJpbnZlcnQuaCIKICNpbmNsdWRlICJqMmsuaCIKICNpbmNsdWRlICJqcDIuaCIKIAogI2luY2x1ZGUgIm1xYy5oIgotI2luY2x1ZGUgInJhdy5oIgogI2luY2x1ZGUgImJpby5oIgogCiAjaW5jbHVkZSAicGkuaCIKQEAgLTE5MSw2ICsyNDUsNyBAQAogI2luY2x1ZGUgInQyLmgiCiAjaW5jbHVkZSAibWN0LmgiCiAjaW5jbHVkZSAib3BqX2ludG1hdGguaCIKKyNpbmNsdWRlICJzcGFyc2VfYXJyYXkuaCIKIAogI2lmZGVmIFVTRV9KUElQCiAjaW5jbHVkZSAiY2lkeF9tYW5hZ2VyLmgiCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9pbnRtYXRoLmggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9pbnRtYXRoLmgKaW5kZXggM2Y3OTM0Yy4uYWQxMzU5NyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfaW50bWF0aC5oCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2ludG1hdGguaApAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKLSAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQKICAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKICAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KICAqCkBAIC04LDcgKzgsNyBAQAogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQogICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMsIERhdmlkIEphbnNzZW5zCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgWWFubmljayBWZXJzY2h1ZXJlbgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4IAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQogICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgpAQCAtMzQsOCArMzQsOCBAQAogICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCi0jaWZuZGVmIF9fSU5UX0gKLSNkZWZpbmUgX19JTlRfSAorI2lmbmRlZiBPUEpfSU5UTUFUSF9ICisjZGVmaW5lIE9QSl9JTlRNQVRIX0gKIC8qKgogQGZpbGUgb3BqX2ludG1hdGguaAogQGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIG9wZXJhdGlvbnMgb24gaW50ZWdlcnMgKElOVCkKQEAgLTUzLDQxICs1Myw1NSBAQAogR2V0IHRoZSBtaW5pbXVtIG9mIHR3byBpbnRlZ2VycwogQHJldHVybiBSZXR1cm5zIGEgaWYgYSA8IGIgZWxzZSBiCiAqLwotc3RhdGljIElOTElORSBPUEpfSU5UMzIgb3BqX2ludF9taW4oT1BKX0lOVDMyIGEsIE9QSl9JTlQzMiBiKSB7Ci0JcmV0dXJuIGEgPCBiID8gYSA6IGI7CitzdGF0aWMgSU5MSU5FIE9QSl9JTlQzMiBvcGpfaW50X21pbihPUEpfSU5UMzIgYSwgT1BKX0lOVDMyIGIpCit7CisgICAgcmV0dXJuIGEgPCBiID8gYSA6IGI7CiB9CiAKIC8qKgogR2V0IHRoZSBtaW5pbXVtIG9mIHR3byBpbnRlZ2VycwogQHJldHVybiBSZXR1cm5zIGEgaWYgYSA8IGIgZWxzZSBiCiAqLwotc3RhdGljIElOTElORSBPUEpfVUlOVDMyIG9wal91aW50X21pbihPUEpfVUlOVDMyIGEsIE9QSl9VSU5UMzIgYikgewotCXJldHVybiBhIDwgYiA/IGEgOiBiOworc3RhdGljIElOTElORSBPUEpfVUlOVDMyIG9wal91aW50X21pbihPUEpfVUlOVDMyIGEsIE9QSl9VSU5UMzIgYikKK3sKKyAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKIH0KIAogLyoqCiBHZXQgdGhlIG1heGltdW0gb2YgdHdvIGludGVnZXJzCiBAcmV0dXJuIFJldHVybnMgYSBpZiBhID4gYiBlbHNlIGIKICovCi1zdGF0aWMgSU5MSU5FIE9QSl9JTlQzMiBvcGpfaW50X21heChPUEpfSU5UMzIgYSwgT1BKX0lOVDMyIGIpIHsKLQlyZXR1cm4gKGEgPiBiKSA/IGEgOiBiOworc3RhdGljIElOTElORSBPUEpfSU5UMzIgb3BqX2ludF9tYXgoT1BKX0lOVDMyIGEsIE9QSl9JTlQzMiBiKQoreworICAgIHJldHVybiAoYSA+IGIpID8gYSA6IGI7CiB9CiAKIC8qKgogR2V0IHRoZSBtYXhpbXVtIG9mIHR3byBpbnRlZ2VycwogQHJldHVybiBSZXR1cm5zIGEgaWYgYSA+IGIgZWxzZSBiCiAqLwotc3RhdGljIElOTElORSBPUEpfVUlOVDMyIG9wal91aW50X21heChPUEpfVUlOVDMyICBhLCBPUEpfVUlOVDMyICBiKSB7Ci0JcmV0dXJuIChhID4gYikgPyBhIDogYjsKK3N0YXRpYyBJTkxJTkUgT1BKX1VJTlQzMiBvcGpfdWludF9tYXgoT1BKX1VJTlQzMiAgYSwgT1BKX1VJTlQzMiAgYikKK3sKKyAgICByZXR1cm4gKGEgPiBiKSA/IGEgOiBiOwogfQogCiAvKioKICBHZXQgdGhlIHNhdHVyYXRlZCBzdW0gb2YgdHdvIHVuc2lnbmVkIGludGVnZXJzCiAgQHJldHVybiBSZXR1cm5zIHNhdHVyYXRlZCBzdW0gb2YgYStiCiAgKi8KLXN0YXRpYyBJTkxJTkUgT1BKX1VJTlQzMiBvcGpfdWludF9hZGRzKE9QSl9VSU5UMzIgYSwgT1BKX1VJTlQzMiBiKSB7Ci0JT1BKX1VJTlQ2NCBzdW0gPSAoT1BKX1VJTlQ2NClhICsgKE9QSl9VSU5UNjQpYjsKLQlyZXR1cm4gKE9QSl9VSU5UMzIpKC0oT1BKX0lOVDMyKShzdW0gPj4gMzIpKSB8IChPUEpfVUlOVDMyKXN1bTsKK3N0YXRpYyBJTkxJTkUgT1BKX1VJTlQzMiBvcGpfdWludF9hZGRzKE9QSl9VSU5UMzIgYSwgT1BKX1VJTlQzMiBiKQoreworICAgIE9QSl9VSU5UNjQgc3VtID0gKE9QSl9VSU5UNjQpYSArIChPUEpfVUlOVDY0KWI7CisgICAgcmV0dXJuIChPUEpfVUlOVDMyKSgtKE9QSl9JTlQzMikoc3VtID4+IDMyKSkgfCAoT1BKX1VJTlQzMilzdW07Cit9CisKKy8qKgorIEdldCB0aGUgc2F0dXJhdGVkIGRpZmZlcmVuY2Ugb2YgdHdvIHVuc2lnbmVkIGludGVnZXJzCisgQHJldHVybiBSZXR1cm5zIHNhdHVyYXRlZCBzdW0gb2YgYS1iCisgKi8KK3N0YXRpYyBJTkxJTkUgT1BKX1VJTlQzMiBvcGpfdWludF9zdWJzKE9QSl9VSU5UMzIgYSwgT1BKX1VJTlQzMiBiKQoreworICAgIHJldHVybiAoYSA+PSBiKSA/IGEgLSBiIDogMDsKIH0KIAogLyoqCkBAIC05Niw5MyArMTEwLDEyNyBAQAogPHVsPgogPGxpPlJldHVybnMgYSBpZiAobWluIDwgYSA8IG1heCkKIDxsaT5SZXR1cm5zIG1heCBpZiAoYSA+IG1heCkKLTxsaT5SZXR1cm5zIG1pbiBpZiAoYSA8IG1pbikgCis8bGk+UmV0dXJucyBtaW4gaWYgKGEgPCBtaW4pCiA8L3VsPgogKi8KLXN0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9pbnRfY2xhbXAoT1BKX0lOVDMyIGEsIE9QSl9JTlQzMiBtaW4sIE9QSl9JTlQzMiBtYXgpIHsKLQlpZiAoYSA8IG1pbikKLQkJcmV0dXJuIG1pbjsKLQlpZiAoYSA+IG1heCkKLQkJcmV0dXJuIG1heDsKLQlyZXR1cm4gYTsKK3N0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9pbnRfY2xhbXAoT1BKX0lOVDMyIGEsIE9QSl9JTlQzMiBtaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBtYXgpCit7CisgICAgaWYgKGEgPCBtaW4pIHsKKyAgICAgICAgcmV0dXJuIG1pbjsKKyAgICB9CisgICAgaWYgKGEgPiBtYXgpIHsKKyAgICAgICAgcmV0dXJuIG1heDsKKyAgICB9CisgICAgcmV0dXJuIGE7CiB9CisKKy8qKgorQ2xhbXAgYW4gaW50ZWdlciBpbnNpZGUgYW4gaW50ZXJ2YWwKK0ByZXR1cm4KKzx1bD4KKzxsaT5SZXR1cm5zIGEgaWYgKG1pbiA8IGEgPCBtYXgpCis8bGk+UmV0dXJucyBtYXggaWYgKGEgPiBtYXgpCis8bGk+UmV0dXJucyBtaW4gaWYgKGEgPCBtaW4pCis8L3VsPgorKi8KK3N0YXRpYyBJTkxJTkUgT1BKX0lOVDY0IG9wal9pbnQ2NF9jbGFtcChPUEpfSU5UNjQgYSwgT1BKX0lOVDY0IG1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UNjQgbWF4KQoreworICAgIGlmIChhIDwgbWluKSB7CisgICAgICAgIHJldHVybiBtaW47CisgICAgfQorICAgIGlmIChhID4gbWF4KSB7CisgICAgICAgIHJldHVybiBtYXg7CisgICAgfQorICAgIHJldHVybiBhOworfQorCiAvKioKIEByZXR1cm4gR2V0IGFic29sdXRlIHZhbHVlIG9mIGludGVnZXIKICovCi1zdGF0aWMgSU5MSU5FIE9QSl9JTlQzMiBvcGpfaW50X2FicyhPUEpfSU5UMzIgYSkgewotCXJldHVybiBhIDwgMCA/IC1hIDogYTsKK3N0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9pbnRfYWJzKE9QSl9JTlQzMiBhKQoreworICAgIHJldHVybiBhIDwgMCA/IC1hIDogYTsKIH0KIC8qKgogRGl2aWRlIGFuIGludGVnZXIgYW5kIHJvdW5kIHVwd2FyZHMKIEByZXR1cm4gUmV0dXJucyBhIGRpdmlkZWQgYnkgYgogKi8KLXN0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9pbnRfY2VpbGRpdihPUEpfSU5UMzIgYSwgT1BKX0lOVDMyIGIpIHsKLQlhc3NlcnQoYik7Ci0JcmV0dXJuIChhICsgYiAtIDEpIC8gYjsKK3N0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9pbnRfY2VpbGRpdihPUEpfSU5UMzIgYSwgT1BKX0lOVDMyIGIpCit7CisgICAgYXNzZXJ0KGIpOworICAgIHJldHVybiAoT1BKX0lOVDMyKSgoKE9QSl9JTlQ2NClhICsgYiAtIDEpIC8gYik7CiB9CiAKIC8qKgogRGl2aWRlIGFuIGludGVnZXIgYW5kIHJvdW5kIHVwd2FyZHMKIEByZXR1cm4gUmV0dXJucyBhIGRpdmlkZWQgYnkgYgogKi8KLXN0YXRpYyBJTkxJTkUgT1BKX1VJTlQzMiAgb3BqX3VpbnRfY2VpbGRpdihPUEpfVUlOVDMyICBhLCBPUEpfVUlOVDMyICBiKSB7Ci0JYXNzZXJ0KGIpOwotCXJldHVybiAoYSArIGIgLSAxKSAvIGI7CitzdGF0aWMgSU5MSU5FIE9QSl9VSU5UMzIgIG9wal91aW50X2NlaWxkaXYoT1BKX1VJTlQzMiAgYSwgT1BKX1VJTlQzMiAgYikKK3sKKyAgICBhc3NlcnQoYik7CisgICAgcmV0dXJuIChhICsgYiAtIDEpIC8gYjsKIH0KIAogLyoqCiBEaXZpZGUgYW4gaW50ZWdlciBieSBhIHBvd2VyIG9mIDIgYW5kIHJvdW5kIHVwd2FyZHMKIEByZXR1cm4gUmV0dXJucyBhIGRpdmlkZWQgYnkgMl5iCiAqLwotc3RhdGljIElOTElORSBPUEpfSU5UMzIgb3BqX2ludF9jZWlsZGl2cG93MihPUEpfSU5UMzIgYSwgT1BKX0lOVDMyIGIpIHsKLQlyZXR1cm4gKE9QSl9JTlQzMikoKGEgKyAoKE9QSl9JTlQ2NCkxIDw8IGIpIC0gMSkgPj4gYik7CitzdGF0aWMgSU5MSU5FIE9QSl9JTlQzMiBvcGpfaW50X2NlaWxkaXZwb3cyKE9QSl9JTlQzMiBhLCBPUEpfSU5UMzIgYikKK3sKKyAgICByZXR1cm4gKE9QSl9JTlQzMikoKGEgKyAoKE9QSl9JTlQ2NCkxIDw8IGIpIC0gMSkgPj4gYik7CiB9CiAKIC8qKgogIERpdmlkZSBhIDY0Yml0cyBpbnRlZ2VyIGJ5IGEgcG93ZXIgb2YgMiBhbmQgcm91bmQgdXB3YXJkcwogIEByZXR1cm4gUmV0dXJucyBhIGRpdmlkZWQgYnkgMl5iCiAgKi8KLXN0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9pbnQ2NF9jZWlsZGl2cG93MihPUEpfSU5UNjQgYSwgT1BKX0lOVDMyIGIpIHsKLQlyZXR1cm4gKE9QSl9JTlQzMikoKGEgKyAoKE9QSl9JTlQ2NCkxIDw8IGIpIC0gMSkgPj4gYik7CitzdGF0aWMgSU5MSU5FIE9QSl9JTlQzMiBvcGpfaW50NjRfY2VpbGRpdnBvdzIoT1BKX0lOVDY0IGEsIE9QSl9JTlQzMiBiKQoreworICAgIHJldHVybiAoT1BKX0lOVDMyKSgoYSArICgoT1BKX0lOVDY0KTEgPDwgYikgLSAxKSA+PiBiKTsKIH0KIAogLyoqCiAgRGl2aWRlIGFuIGludGVnZXIgYnkgYSBwb3dlciBvZiAyIGFuZCByb3VuZCB1cHdhcmRzCiAgQHJldHVybiBSZXR1cm5zIGEgZGl2aWRlZCBieSAyXmIKICAqLwotc3RhdGljIElOTElORSBPUEpfVUlOVDMyIG9wal91aW50X2NlaWxkaXZwb3cyKE9QSl9VSU5UMzIgYSwgT1BKX1VJTlQzMiBiKSB7Ci0JcmV0dXJuIChPUEpfVUlOVDMyKSgoYSArICgoT1BKX1VJTlQ2NCkxVSA8PCBiKSAtIDFVKSA+PiBiKTsKK3N0YXRpYyBJTkxJTkUgT1BKX1VJTlQzMiBvcGpfdWludF9jZWlsZGl2cG93MihPUEpfVUlOVDMyIGEsIE9QSl9VSU5UMzIgYikKK3sKKyAgICByZXR1cm4gKE9QSl9VSU5UMzIpKChhICsgKChPUEpfVUlOVDY0KTFVIDw8IGIpIC0gMVUpID4+IGIpOwogfQogCiAvKioKIERpdmlkZSBhbiBpbnRlZ2VyIGJ5IGEgcG93ZXIgb2YgMiBhbmQgcm91bmQgZG93bndhcmRzCiBAcmV0dXJuIFJldHVybnMgYSBkaXZpZGVkIGJ5IDJeYgogKi8KLXN0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9pbnRfZmxvb3JkaXZwb3cyKE9QSl9JTlQzMiBhLCBPUEpfSU5UMzIgYikgewotCXJldHVybiBhID4+IGI7CitzdGF0aWMgSU5MSU5FIE9QSl9JTlQzMiBvcGpfaW50X2Zsb29yZGl2cG93MihPUEpfSU5UMzIgYSwgT1BKX0lOVDMyIGIpCit7CisgICAgcmV0dXJuIGEgPj4gYjsKIH0KIC8qKgogR2V0IGxvZ2FyaXRobSBvZiBhbiBpbnRlZ2VyIGFuZCByb3VuZCBkb3dud2FyZHMKIEByZXR1cm4gUmV0dXJucyBsb2cyKGEpCiAqLwotc3RhdGljIElOTElORSBPUEpfSU5UMzIgb3BqX2ludF9mbG9vcmxvZzIoT1BKX0lOVDMyIGEpIHsKLQlPUEpfSU5UMzIgbDsKLQlmb3IgKGwgPSAwOyBhID4gMTsgbCsrKSB7Ci0JCWEgPj49IDE7Ci0JfQotCXJldHVybiBsOworc3RhdGljIElOTElORSBPUEpfSU5UMzIgb3BqX2ludF9mbG9vcmxvZzIoT1BKX0lOVDMyIGEpCit7CisgICAgT1BKX0lOVDMyIGw7CisgICAgZm9yIChsID0gMDsgYSA+IDE7IGwrKykgeworICAgICAgICBhID4+PSAxOworICAgIH0KKyAgICByZXR1cm4gbDsKIH0KIC8qKgogR2V0IGxvZ2FyaXRobSBvZiBhbiBpbnRlZ2VyIGFuZCByb3VuZCBkb3dud2FyZHMKIEByZXR1cm4gUmV0dXJucyBsb2cyKGEpCiAqLwotc3RhdGljIElOTElORSBPUEpfVUlOVDMyICBvcGpfdWludF9mbG9vcmxvZzIoT1BKX1VJTlQzMiAgYSkgewotCU9QSl9VSU5UMzIgIGw7Ci0JZm9yIChsID0gMDsgYSA+IDE7ICsrbCkKLQl7Ci0JCWEgPj49IDE7Ci0JfQotCXJldHVybiBsOworc3RhdGljIElOTElORSBPUEpfVUlOVDMyICBvcGpfdWludF9mbG9vcmxvZzIoT1BKX1VJTlQzMiAgYSkKK3sKKyAgICBPUEpfVUlOVDMyICBsOworICAgIGZvciAobCA9IDA7IGEgPiAxOyArK2wpIHsKKyAgICAgICAgYSA+Pj0gMTsKKyAgICB9CisgICAgcmV0dXJuIGw7CiB9CiAKIC8qKgpAQCAtMTkxLDI4ICsyMzksMzEgQEAKIEBwYXJhbSBiCiBAcmV0dXJuIFJldHVybnMgYSAqIGIKICovCi1zdGF0aWMgSU5MSU5FIE9QSl9JTlQzMiBvcGpfaW50X2ZpeF9tdWwoT1BKX0lOVDMyIGEsIE9QSl9JTlQzMiBiKSB7CitzdGF0aWMgSU5MSU5FIE9QSl9JTlQzMiBvcGpfaW50X2ZpeF9tdWwoT1BKX0lOVDMyIGEsIE9QSl9JTlQzMiBiKQorewogI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxNDAwKSAmJiAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKSAmJiBkZWZpbmVkKF9NX0lYODYpCi0JT1BKX0lOVDY0IHRlbXAgPSBfX2VtdWwoYSwgYik7CisgICAgT1BKX0lOVDY0IHRlbXAgPSBfX2VtdWwoYSwgYik7CiAjZWxzZQotCU9QSl9JTlQ2NCB0ZW1wID0gKE9QSl9JTlQ2NCkgYSAqIChPUEpfSU5UNjQpIGIgOworICAgIE9QSl9JTlQ2NCB0ZW1wID0gKE9QSl9JTlQ2NCkgYSAqIChPUEpfSU5UNjQpIGIgOwogI2VuZGlmCi0JdGVtcCArPSA0MDk2OwotCWFzc2VydCgodGVtcCA+PiAxMykgPD0gKE9QSl9JTlQ2NCkweDdGRkZGRkZGKTsKLQlhc3NlcnQoKHRlbXAgPj4gMTMpID49ICgtKE9QSl9JTlQ2NCkweDdGRkZGRkZGIC0gKE9QSl9JTlQ2NCkxKSk7Ci0JcmV0dXJuIChPUEpfSU5UMzIpICh0ZW1wID4+IDEzKTsKKyAgICB0ZW1wICs9IDQwOTY7CisgICAgYXNzZXJ0KCh0ZW1wID4+IDEzKSA8PSAoT1BKX0lOVDY0KTB4N0ZGRkZGRkYpOworICAgIGFzc2VydCgodGVtcCA+PiAxMykgPj0gKC0oT1BKX0lOVDY0KTB4N0ZGRkZGRkYgLSAoT1BKX0lOVDY0KTEpKTsKKyAgICByZXR1cm4gKE9QSl9JTlQzMikodGVtcCA+PiAxMyk7CiB9CiAKLXN0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9pbnRfZml4X211bF90MShPUEpfSU5UMzIgYSwgT1BKX0lOVDMyIGIpIHsKK3N0YXRpYyBJTkxJTkUgT1BKX0lOVDMyIG9wal9pbnRfZml4X211bF90MShPUEpfSU5UMzIgYSwgT1BKX0lOVDMyIGIpCit7CiAjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDE0MDApICYmICFkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpICYmIGRlZmluZWQoX01fSVg4NikKLQlPUEpfSU5UNjQgdGVtcCA9IF9fZW11bChhLCBiKTsKKyAgICBPUEpfSU5UNjQgdGVtcCA9IF9fZW11bChhLCBiKTsKICNlbHNlCi0JT1BKX0lOVDY0IHRlbXAgPSAoT1BKX0lOVDY0KSBhICogKE9QSl9JTlQ2NCkgYiA7CisgICAgT1BKX0lOVDY0IHRlbXAgPSAoT1BKX0lOVDY0KSBhICogKE9QSl9JTlQ2NCkgYiA7CiAjZW5kaWYKLQl0ZW1wICs9IDQwOTY7Ci0JYXNzZXJ0KCh0ZW1wID4+ICgxMyArIDExIC0gVDFfTk1TRURFQ19GUkFDQklUUykpIDw9IChPUEpfSU5UNjQpMHg3RkZGRkZGRik7Ci0JYXNzZXJ0KCh0ZW1wID4+ICgxMyArIDExIC0gVDFfTk1TRURFQ19GUkFDQklUUykpID49ICgtKE9QSl9JTlQ2NCkweDdGRkZGRkZGIC0gKE9QSl9JTlQ2NCkxKSk7Ci0JcmV0dXJuIChPUEpfSU5UMzIpICh0ZW1wID4+ICgxMyArIDExIC0gVDFfTk1TRURFQ19GUkFDQklUUykpIDsKKyAgICB0ZW1wICs9IDQwOTY7CisgICAgYXNzZXJ0KCh0ZW1wID4+ICgxMyArIDExIC0gVDFfTk1TRURFQ19GUkFDQklUUykpIDw9IChPUEpfSU5UNjQpMHg3RkZGRkZGRik7CisgICAgYXNzZXJ0KCh0ZW1wID4+ICgxMyArIDExIC0gVDFfTk1TRURFQ19GUkFDQklUUykpID49ICgtKE9QSl9JTlQ2NCkweDdGRkZGRkZGIC0KKyAgICAgICAgICAgIChPUEpfSU5UNjQpMSkpOworICAgIHJldHVybiAoT1BKX0lOVDMyKSh0ZW1wID4+ICgxMyArIDExIC0gVDFfTk1TRURFQ19GUkFDQklUUykpIDsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTIyMCw0ICsyNzEsNCBAQAogCiAvKkB9Ki8KIAotI2VuZGlmCisjZW5kaWYgLyogT1BKX0lOVE1BVEhfSCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfaW50dHlwZXMuaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX2ludHR5cGVzLmgKaW5kZXggZTc0YWVkNi4uMmM5NzQ5YSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfaW50dHlwZXMuaAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL29wal9pbnR0eXBlcy5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAotICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZAogICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cwogICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgogICoKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX21hbGxvYy5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfbWFsbG9jLmgKaW5kZXggNTE3NzA3Zi4uNzliM2E2NCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfbWFsbG9jLmgKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfbWFsbG9jLmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCiAgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCiAgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCiAgKgpAQCAtMjksOCArMjksOCBAQAogICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKICAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCi0jaWZuZGVmIF9fT1BKX01BTExPQ19ICi0jZGVmaW5lIF9fT1BKX01BTExPQ19ICisjaWZuZGVmIE9QSl9NQUxMT0NfSAorI2RlZmluZSBPUEpfTUFMTE9DX0gKIC8qKgogQGZpbGUgb3BqX21hbGxvYy5oCiBAYnJpZWYgSW50ZXJuYWwgZnVuY3Rpb25zCkBAIC02Myw4ICs2Myw4IEBACiAKIC8qKgogQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgd2l0aCBlbGVtZW50cyBpbml0aWFsaXplZCB0byAwCi1AcGFyYW0gbnVtIEJsb2NrcyB0byBhbGxvY2F0ZQotQHBhcmFtIHNpemUgQnl0ZXMgcGVyIGJsb2NrIHRvIGFsbG9jYXRlCitAcGFyYW0gbnVtT2ZFbGVtZW50cyAgQmxvY2tzIHRvIGFsbG9jYXRlCitAcGFyYW0gc2l6ZU9mRWxlbWVudHMgQnl0ZXMgcGVyIGJsb2NrIHRvIGFsbG9jYXRlCiBAcmV0dXJuIFJldHVybnMgYSB2b2lkIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBzcGFjZSwgb3IgTlVMTCBpZiB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgbWVtb3J5IGF2YWlsYWJsZQogKi8KICNpZmRlZiBBTExPQ19QRVJGX09QVApAQCAtODUsNjQgKzg1LDc5IEBACiAqLwogLyogRklYTUU6IFRoZXNlIHNob3VsZCBiZSBzZXQgd2l0aCBjbWFrZSB0ZXN0cywgYnV0IHdlJ3JlIGN1cnJlbnRseSBub3QgcmVxdWlyaW5nIHVzZSBvZiBjbWFrZSAqLwogI2lmZGVmIF9XSU4zMgotCS8qIFNvbWVvbmUgc2hvdWxkIHRlbGwgdGhlIG1pbmd3IHBlb3BsZSB0aGF0IHRoZWlyIG1hbGxvYy5oIG91Z2h0IHRvIHByb3ZpZGUgX21tX21hbGxvYygpICovCi0JI2lmZGVmIF9fR05VQ19fCi0JCSNpbmNsdWRlIDxtbV9tYWxsb2MuaD4KLQkJI2RlZmluZSBIQVZFX01NX01BTExPQwotCSNlbHNlIC8qIE1TVkMsIEludGVsIEMrKyAqLwotCQkjaW5jbHVkZSA8bWFsbG9jLmg+Ci0JCSNpZmRlZiBfbW1fbWFsbG9jCi0JCQkjZGVmaW5lIEhBVkVfTU1fTUFMTE9DCi0JCSNlbmRpZgotCSNlbmRpZgorICAvKiBTb21lb25lIHNob3VsZCB0ZWxsIHRoZSBtaW5ndyBwZW9wbGUgdGhhdCB0aGVpciBtYWxsb2MuaCBvdWdodCB0byBwcm92aWRlIF9tbV9tYWxsb2MoKSAqLworICAjaWZkZWYgX19HTlVDX18KKyAgICAjaW5jbHVkZSA8bW1fbWFsbG9jLmg+CisgICAgI2RlZmluZSBIQVZFX01NX01BTExPQworICAjZWxzZSAvKiBNU1ZDLCBJbnRlbCBDKysgKi8KKyAgICAjaW5jbHVkZSA8bWFsbG9jLmg+CisgICAgI2lmZGVmIF9tbV9tYWxsb2MKKyAgICAgICNkZWZpbmUgSEFWRV9NTV9NQUxMT0MKKyAgICAjZW5kaWYKKyAgI2VuZGlmCiAjZWxzZSAvKiBOb3QgX1dJTjMyICovCi0JI2lmIGRlZmluZWQoX19zdW4pCi0JCSNkZWZpbmUgSEFWRV9NRU1BTElHTgorICAjaWYgZGVmaW5lZChfX3N1bikKKyAgICAjZGVmaW5lIEhBVkVfTUVNQUxJR04KICAgI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykKICAgICAjZGVmaW5lIEhBVkVfUE9TSVhfTUVNQUxJR04KLQkvKiBMaW51eCB4ODZfNjQgYW5kIE9TWCBhbHdheXMgYWxpZ24gYWxsb2NhdGlvbnMgdG8gMTYgYnl0ZXMgKi8KLQkjZWxpZiAhZGVmaW5lZChfX2FtZDY0X18pICYmICFkZWZpbmVkKF9fQVBQTEVfXykgJiYgIWRlZmluZWQoX0FJWCkKLQkJI2RlZmluZSBIQVZFX01FTUFMSUdOCi0JCSNpbmNsdWRlIDxtYWxsb2MuaD4JCQkKLQkjZW5kaWYKKyAgLyogTGludXggeDg2XzY0IGFuZCBPU1ggYWx3YXlzIGFsaWduIGFsbG9jYXRpb25zIHRvIDE2IGJ5dGVzICovCisgICNlbGlmICFkZWZpbmVkKF9fYW1kNjRfXykgJiYgIWRlZmluZWQoX19BUFBMRV9fKSAmJiAhZGVmaW5lZChfQUlYKQorICAgICNkZWZpbmUgSEFWRV9NRU1BTElHTgorICAgICNpbmNsdWRlIDxtYWxsb2MuaD4KKyAgI2VuZGlmCiAjZW5kaWYKIAogI2RlZmluZSBvcGpfYWxpZ25lZF9tYWxsb2Moc2l6ZSkgbWFsbG9jKHNpemUpCisjZGVmaW5lIG9wal9hbGlnbmVkXzMyX21hbGxvYyhzaXplKSBtYWxsb2Moc2l6ZSkKICNkZWZpbmUgb3BqX2FsaWduZWRfZnJlZShtKSBmcmVlKG0pCiAKICNpZmRlZiBIQVZFX01NX01BTExPQwotCSN1bmRlZiBvcGpfYWxpZ25lZF9tYWxsb2MKLQkjZGVmaW5lIG9wal9hbGlnbmVkX21hbGxvYyhzaXplKSBfbW1fbWFsbG9jKHNpemUsIDE2KQotCSN1bmRlZiBvcGpfYWxpZ25lZF9mcmVlCi0JI2RlZmluZSBvcGpfYWxpZ25lZF9mcmVlKG0pIF9tbV9mcmVlKG0pCisgICN1bmRlZiBvcGpfYWxpZ25lZF9tYWxsb2MKKyAgI2RlZmluZSBvcGpfYWxpZ25lZF9tYWxsb2Moc2l6ZSkgX21tX21hbGxvYygoc2l6ZSksIDE2KQorICAjdW5kZWYgb3BqX2FsaWduZWRfMzJfbWFsbG9jCisgICNkZWZpbmUgb3BqX2FsaWduZWRfMzJfbWFsbG9jKHNpemUpIF9tbV9tYWxsb2MoKHNpemUpLCAzMikKKyAgI3VuZGVmIG9wal9hbGlnbmVkX2ZyZWUKKyAgI2RlZmluZSBvcGpfYWxpZ25lZF9mcmVlKG0pIF9tbV9mcmVlKG0pCiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfTUVNQUxJR04KLQlleHRlcm4gdm9pZCogbWVtYWxpZ24oc2l6ZV90LCBzaXplX3QpOwotCSN1bmRlZiBvcGpfYWxpZ25lZF9tYWxsb2MKLQkjZGVmaW5lIG9wal9hbGlnbmVkX21hbGxvYyhzaXplKSBtZW1hbGlnbigxNiwgKHNpemUpKQotCSN1bmRlZiBvcGpfYWxpZ25lZF9mcmVlCi0JI2RlZmluZSBvcGpfYWxpZ25lZF9mcmVlKG0pIGZyZWUobSkKKyAgZXh0ZXJuIHZvaWQqIG1lbWFsaWduKHNpemVfdCwgc2l6ZV90KTsKKyAgI3VuZGVmIG9wal9hbGlnbmVkX21hbGxvYworICAjZGVmaW5lIG9wal9hbGlnbmVkX21hbGxvYyhzaXplKSBtZW1hbGlnbigxNiwgKHNpemUpKQorICAjdW5kZWYgb3BqX2FsaWduZWRfMzJfbWFsbG9jCisgICNkZWZpbmUgb3BqX2FsaWduZWRfMzJfbWFsbG9jKHNpemUpIG1lbWFsaWduKDMyLCAoc2l6ZSkpCisgICN1bmRlZiBvcGpfYWxpZ25lZF9mcmVlCisgICNkZWZpbmUgb3BqX2FsaWduZWRfZnJlZShtKSBmcmVlKG0pCiAjZW5kaWYKIAogI2lmZGVmIEhBVkVfUE9TSVhfTUVNQUxJR04KLQkjdW5kZWYgb3BqX2FsaWduZWRfbWFsbG9jCi0JZXh0ZXJuIGludCBwb3NpeF9tZW1hbGlnbih2b2lkKiosIHNpemVfdCwgc2l6ZV90KTsKKyAgI3VuZGVmIG9wal9hbGlnbmVkX21hbGxvYworICBleHRlcm4gaW50IHBvc2l4X21lbWFsaWduKHZvaWQqKiwgc2l6ZV90LCBzaXplX3QpOwogCi0Jc3RhdGljIElOTElORSB2b2lkKiBfX2F0dHJpYnV0ZV9fICgobWFsbG9jKSkgb3BqX2FsaWduZWRfbWFsbG9jKHNpemVfdCBzaXplKXsKLQkJdm9pZCogbWVtID0gTlVMTDsKLQkJcG9zaXhfbWVtYWxpZ24oJm1lbSwgMTYsIHNpemUpOwotCQlyZXR1cm4gbWVtOwotCX0KLQkjdW5kZWYgb3BqX2FsaWduZWRfZnJlZQotCSNkZWZpbmUgb3BqX2FsaWduZWRfZnJlZShtKSBmcmVlKG0pCisgIHN0YXRpYyBJTkxJTkUgdm9pZCogX19hdHRyaWJ1dGVfXyAoKG1hbGxvYykpIG9wal9hbGlnbmVkX21hbGxvYyhzaXplX3Qgc2l6ZSl7CisgICAgdm9pZCogbWVtID0gTlVMTDsKKyAgICBwb3NpeF9tZW1hbGlnbigmbWVtLCAxNiwgc2l6ZSk7CisgICAgcmV0dXJuIG1lbTsKKyAgfQorCisgICN1bmRlZiBvcGpfYWxpZ25lZF8zMl9tYWxsb2MKKyAgc3RhdGljIElOTElORSB2b2lkKiBfX2F0dHJpYnV0ZV9fICgobWFsbG9jKSkgb3BqX2FsaWduZWRfMzJfbWFsbG9jKHNpemVfdCBzaXplKXsKKyAgICB2b2lkKiBtZW0gPSBOVUxMOworICAgIHBvc2l4X21lbWFsaWduKCZtZW0sIDMyLCBzaXplKTsKKyAgICByZXR1cm4gbWVtOworICB9CisKKyAgI3VuZGVmIG9wal9hbGlnbmVkX2ZyZWUKKyAgI2RlZmluZSBvcGpfYWxpZ25lZF9mcmVlKG0pIGZyZWUobSkKICNlbmRpZgogCiAjaWZkZWYgQUxMT0NfUEVSRl9PUFQKLQkjdW5kZWYgb3BqX2FsaWduZWRfbWFsbG9jCi0JI2RlZmluZSBvcGpfYWxpZ25lZF9tYWxsb2Moc2l6ZSkgb3BqX21hbGxvYyhzaXplKQotCSN1bmRlZiBvcGpfYWxpZ25lZF9mcmVlCi0JI2RlZmluZSBvcGpfYWxpZ25lZF9mcmVlKG0pIG9wal9mcmVlKG0pCisgICN1bmRlZiBvcGpfYWxpZ25lZF9tYWxsb2MKKyAgI2RlZmluZSBvcGpfYWxpZ25lZF9tYWxsb2Moc2l6ZSkgb3BqX21hbGxvYyhzaXplKQorICAjdW5kZWYgb3BqX2FsaWduZWRfMzJfbWFsbG9jCisgICNkZWZpbmUgb3BqX2FsaWduZWRfMzJfbWFsbG9jKHNpemUpIG9wal9tYWxsb2Moc2l6ZSkKKyAgI3VuZGVmIG9wal9hbGlnbmVkX2ZyZWUKKyAgI2RlZmluZSBvcGpfYWxpZ25lZF9mcmVlKG0pIG9wal9mcmVlKG0pCiAjZW5kaWYKIAogLyoqCkBAIC0xNzIsNyArMTg3LDcgQEAKICNkZWZpbmUgb3BqX2ZyZWUobSkgZnJlZShtKQogI2VuZGlmCiAKLSNpZmRlZiBfX0dOVUNfXworI2lmIGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKE9QSl9TS0lQX1BPSVNPTikKICNwcmFnbWEgR0NDIHBvaXNvbiBtYWxsb2MgY2FsbG9jIHJlYWxsb2MgZnJlZQogI2VuZGlmCiAKQEAgLTE4MSw1ICsxOTYsNSBAQAogCiAvKkB9Ki8KIAotI2VuZGlmIC8qIF9fT1BKX01BTExPQ19IICovCisjZW5kaWYgLyogT1BKX01BTExPQ19IICovCiAKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvb3BqX3N0ZGludC5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfc3RkaW50LmgKaW5kZXggYjg1NTZhMS4uZjI2YzkyMSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfc3RkaW50LmgKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9vcGpfc3RkaW50LmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCiAgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCiAgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCiAgKgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9waS5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9waS5jCmluZGV4IDkwOTdlMzEuLjI1NmZlMzcgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvcGkuYworKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3BpLmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCiAgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCiAgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCiAgKgpAQCAtOCw3ICs4LDcgQEAKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBQcm9mZXNzb3IgQmVub2l0IE1hY3EKICAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzLCBEYXZpZCBKYW5zc2VucwogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIFlhbm5pY2sgVmVyc2NodWVyZW4KLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eCAKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eAogICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQsIEFudG9uaW4gRGVzY2FtcGUKICAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQogICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcsIFBhcnZhdGhhIEVsYW5nb3ZhbgpAQCAtMzYsNyArMzYsNiBAQAogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KIAotI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgogCiAvKiogQGRlZmdyb3VwIFBJIFBJIC0gSW1wbGVtZW50YXRpb24gb2YgYSBwYWNrZXQgaXRlcmF0b3IgKi8KQEAgLTc5LDY4ICs3OCw2OCBAQAogLyoqCiAgKiBVcGRhdGVzIHRoZSBjb2RpbmcgcGFyYW1ldGVycyBpZiB0aGUgZW5jb2RpbmcgaXMgdXNlZCB3aXRoIFByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZXMgYW5kIGZpbmFsIChvciBjaW5lbWEgcGFyYW1ldGVycyBhcmUgdXNlZCkuCiAgKgotICogQHBhcmFtCXBfY3AJCXRoZSBjb2RpbmcgcGFyYW1ldGVycyB0byBtb2RpZnkKLSAqIEBwYXJhbQlwX3RpbGVubwl0aGUgdGlsZSBpbmRleCBiZWluZyBjb25jZXJuZWQuCi0gKiBAcGFyYW0JcF90eDAJCVgwIHBhcmFtZXRlciBmb3IgdGhlIHRpbGUKLSAqIEBwYXJhbQlwX3R4MQkJWDEgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQotICogQHBhcmFtCXBfdHkwCQlZMCBwYXJhbWV0ZXIgZm9yIHRoZSB0aWxlCi0gKiBAcGFyYW0JcF90eTEJCVkxIHBhcmFtZXRlciBmb3IgdGhlIHRpbGUKLSAqIEBwYXJhbQlwX21heF9wcmVjCXRoZSBtYXhpbXVtIHByZWNpc2lvbiBmb3IgYWxsIHRoZSBiYW5kcyBvZiB0aGUgdGlsZQotICogQHBhcmFtCXBfbWF4X3Jlcwl0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVzb2x1dGlvbnMgZm9yIGFsbCB0aGUgcG9jIGluc2lkZSB0aGUgdGlsZS4KLSAqIEBwYXJhbQlwX2R4X21pbgkJdGhlIG1pbmltdW0gZHggb2YgYWxsIHRoZSBjb21wb25lbnRzIG9mIGFsbCB0aGUgcmVzb2x1dGlvbnMgZm9yIHRoZSB0aWxlLgotICogQHBhcmFtCXBfZHlfbWluCQl0aGUgbWluaW11bSBkeSBvZiBhbGwgdGhlIGNvbXBvbmVudHMgb2YgYWxsIHRoZSByZXNvbHV0aW9ucyBmb3IgdGhlIHRpbGUuCisgKiBAcGFyYW0gICBwX2NwICAgICAgICB0aGUgY29kaW5nIHBhcmFtZXRlcnMgdG8gbW9kaWZ5CisgKiBAcGFyYW0gICBwX3RpbGVubyAgICB0aGUgdGlsZSBpbmRleCBiZWluZyBjb25jZXJuZWQuCisgKiBAcGFyYW0gICBwX3R4MCAgICAgICBYMCBwYXJhbWV0ZXIgZm9yIHRoZSB0aWxlCisgKiBAcGFyYW0gICBwX3R4MSAgICAgICBYMSBwYXJhbWV0ZXIgZm9yIHRoZSB0aWxlCisgKiBAcGFyYW0gICBwX3R5MCAgICAgICBZMCBwYXJhbWV0ZXIgZm9yIHRoZSB0aWxlCisgKiBAcGFyYW0gICBwX3R5MSAgICAgICBZMSBwYXJhbWV0ZXIgZm9yIHRoZSB0aWxlCisgKiBAcGFyYW0gICBwX21heF9wcmVjICB0aGUgbWF4aW11bSBwcmVjaXNpb24gZm9yIGFsbCB0aGUgYmFuZHMgb2YgdGhlIHRpbGUKKyAqIEBwYXJhbSAgIHBfbWF4X3JlcyAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXNvbHV0aW9ucyBmb3IgYWxsIHRoZSBwb2MgaW5zaWRlIHRoZSB0aWxlLgorICogQHBhcmFtICAgcF9keF9taW4gICAgICAgIHRoZSBtaW5pbXVtIGR4IG9mIGFsbCB0aGUgY29tcG9uZW50cyBvZiBhbGwgdGhlIHJlc29sdXRpb25zIGZvciB0aGUgdGlsZS4KKyAqIEBwYXJhbSAgIHBfZHlfbWluICAgICAgICB0aGUgbWluaW11bSBkeSBvZiBhbGwgdGhlIGNvbXBvbmVudHMgb2YgYWxsIHRoZSByZXNvbHV0aW9ucyBmb3IgdGhlIHRpbGUuCiAgKi8KLXN0YXRpYyB2b2lkIG9wal9waV91cGRhdGVfZW5jb2RlX3BvY19hbmRfZmluYWwgKCBvcGpfY3BfdCAqcF9jcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3R4MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF90eDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfdHkwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3R5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3ByZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9yZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2R4X21pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZHlfbWluKTsKK3N0YXRpYyB2b2lkIG9wal9waV91cGRhdGVfZW5jb2RlX3BvY19hbmRfZmluYWwob3BqX2NwX3QgKnBfY3AsCisgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlbm8sCisgICAgICAgIE9QSl9JTlQzMiBwX3R4MCwKKyAgICAgICAgT1BKX0lOVDMyIHBfdHgxLAorICAgICAgICBPUEpfSU5UMzIgcF90eTAsCisgICAgICAgIE9QSl9JTlQzMiBwX3R5MSwKKyAgICAgICAgT1BKX1VJTlQzMiBwX21heF9wcmVjLAorICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3JlcywKKyAgICAgICAgT1BKX1VJTlQzMiBwX2R4X21pbiwKKyAgICAgICAgT1BKX1VJTlQzMiBwX2R5X21pbik7CiAKIC8qKgogICogVXBkYXRlcyB0aGUgY29kaW5nIHBhcmFtZXRlcnMgaWYgdGhlIGVuY29kaW5nIGlzIG5vdCB1c2VkIHdpdGggUHJvZ3Jlc3Npb24gb3JkZXIgY2hhbmdlcyBhbmQgZmluYWwgKGFuZCBjaW5lbWEgcGFyYW1ldGVycyBhcmUgdXNlZCkuCiAgKgotICogQHBhcmFtCXBfY3AJCXRoZSBjb2RpbmcgcGFyYW1ldGVycyB0byBtb2RpZnkKLSAqIEBwYXJhbQlwX251bV9jb21wcwkJdGhlIG51bWJlciBvZiBjb21wb25lbnRzCi0gKiBAcGFyYW0JcF90aWxlbm8JdGhlIHRpbGUgaW5kZXggYmVpbmcgY29uY2VybmVkLgotICogQHBhcmFtCXBfdHgwCQlYMCBwYXJhbWV0ZXIgZm9yIHRoZSB0aWxlCi0gKiBAcGFyYW0JcF90eDEJCVgxIHBhcmFtZXRlciBmb3IgdGhlIHRpbGUKLSAqIEBwYXJhbQlwX3R5MAkJWTAgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQotICogQHBhcmFtCXBfdHkxCQlZMSBwYXJhbWV0ZXIgZm9yIHRoZSB0aWxlCi0gKiBAcGFyYW0JcF9tYXhfcHJlYwl0aGUgbWF4aW11bSBwcmVjaXNpb24gZm9yIGFsbCB0aGUgYmFuZHMgb2YgdGhlIHRpbGUKLSAqIEBwYXJhbQlwX21heF9yZXMJdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlc29sdXRpb25zIGZvciBhbGwgdGhlIHBvYyBpbnNpZGUgdGhlIHRpbGUuCi0gKiBAcGFyYW0JcF9keF9taW4JCXRoZSBtaW5pbXVtIGR4IG9mIGFsbCB0aGUgY29tcG9uZW50cyBvZiBhbGwgdGhlIHJlc29sdXRpb25zIGZvciB0aGUgdGlsZS4KLSAqIEBwYXJhbQlwX2R5X21pbgkJdGhlIG1pbmltdW0gZHkgb2YgYWxsIHRoZSBjb21wb25lbnRzIG9mIGFsbCB0aGUgcmVzb2x1dGlvbnMgZm9yIHRoZSB0aWxlLgorICogQHBhcmFtICAgcF9jcCAgICAgICAgdGhlIGNvZGluZyBwYXJhbWV0ZXJzIHRvIG1vZGlmeQorICogQHBhcmFtICAgcF9udW1fY29tcHMgICAgIHRoZSBudW1iZXIgb2YgY29tcG9uZW50cworICogQHBhcmFtICAgcF90aWxlbm8gICAgdGhlIHRpbGUgaW5kZXggYmVpbmcgY29uY2VybmVkLgorICogQHBhcmFtICAgcF90eDAgICAgICAgWDAgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQorICogQHBhcmFtICAgcF90eDEgICAgICAgWDEgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQorICogQHBhcmFtICAgcF90eTAgICAgICAgWTAgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQorICogQHBhcmFtICAgcF90eTEgICAgICAgWTEgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQorICogQHBhcmFtICAgcF9tYXhfcHJlYyAgdGhlIG1heGltdW0gcHJlY2lzaW9uIGZvciBhbGwgdGhlIGJhbmRzIG9mIHRoZSB0aWxlCisgKiBAcGFyYW0gICBwX21heF9yZXMgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVzb2x1dGlvbnMgZm9yIGFsbCB0aGUgcG9jIGluc2lkZSB0aGUgdGlsZS4KKyAqIEBwYXJhbSAgIHBfZHhfbWluICAgICAgICB0aGUgbWluaW11bSBkeCBvZiBhbGwgdGhlIGNvbXBvbmVudHMgb2YgYWxsIHRoZSByZXNvbHV0aW9ucyBmb3IgdGhlIHRpbGUuCisgKiBAcGFyYW0gICBwX2R5X21pbiAgICAgICAgdGhlIG1pbmltdW0gZHkgb2YgYWxsIHRoZSBjb21wb25lbnRzIG9mIGFsbCB0aGUgcmVzb2x1dGlvbnMgZm9yIHRoZSB0aWxlLgogICovCi1zdGF0aWMgdm9pZCBvcGpfcGlfdXBkYXRlX2VuY29kZV9ub3RfcG9jICggIG9wal9jcF90ICpwX2NwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbnVtX2NvbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF90eDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3R4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfdHkwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF90eTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcHJlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9yZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9keF9taW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9keV9taW4pOworc3RhdGljIHZvaWQgb3BqX3BpX3VwZGF0ZV9lbmNvZGVfbm90X3BvYyhvcGpfY3BfdCAqcF9jcCwKKyAgICAgICAgT1BKX1VJTlQzMiBwX251bV9jb21wcywKKyAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVubywKKyAgICAgICAgT1BKX0lOVDMyIHBfdHgwLAorICAgICAgICBPUEpfSU5UMzIgcF90eDEsCisgICAgICAgIE9QSl9JTlQzMiBwX3R5MCwKKyAgICAgICAgT1BKX0lOVDMyIHBfdHkxLAorICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3ByZWMsCisgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcmVzLAorICAgICAgICBPUEpfVUlOVDMyIHBfZHhfbWluLAorICAgICAgICBPUEpfVUlOVDMyIHBfZHlfbWluKTsKIC8qKgogICogR2V0cyB0aGUgZW5jb2RpbmcgcGFyYW1ldGVycyBuZWVkZWQgdG8gdXBkYXRlIHRoZSBjb2RpbmcgcGFyYW1ldGVycyBhbmQgYWxsIHRoZSBwb2NzLgotICogCi0gKiBAcGFyYW0JcF9pbWFnZQkJCXRoZSBpbWFnZSBiZWluZyBlbmNvZGVkLgotICogQHBhcmFtCXBfY3AJCQl0aGUgY29kaW5nIHBhcmFtZXRlcnMuCi0gKiBAcGFyYW0JdGlsZW5vCQkJdGhlIHRpbGUgaW5kZXggb2YgdGhlIHRpbGUgYmVpbmcgZW5jb2RlZC4KLSAqIEBwYXJhbQlwX3R4MAkJCXBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIFgwIHBhcmFtZXRlciBmb3IgdGhlIHRpbGUKLSAqIEBwYXJhbQlwX3R4MQkJCXBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIFgxIHBhcmFtZXRlciBmb3IgdGhlIHRpbGUKLSAqIEBwYXJhbQlwX3R5MAkJCXBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIFkwIHBhcmFtZXRlciBmb3IgdGhlIHRpbGUKLSAqIEBwYXJhbQlwX3R5MQkJCXBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIFkxIHBhcmFtZXRlciBmb3IgdGhlIHRpbGUKLSAqIEBwYXJhbQlwX21heF9wcmVjCQlwb2ludGVyIHRoYXQgd2lsbCBob2xkIHRoZSB0aGUgbWF4aW11bSBwcmVjaXNpb24gZm9yIGFsbCB0aGUgYmFuZHMgb2YgdGhlIHRpbGUKLSAqIEBwYXJhbQlwX21heF9yZXMJCXBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXNvbHV0aW9ucyBmb3IgYWxsIHRoZSBwb2MgaW5zaWRlIHRoZSB0aWxlLgotICogQHBhcmFtCXBfZHhfbWluCQkJcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgdGhlIG1pbmltdW0gZHggb2YgYWxsIHRoZSBjb21wb25lbnRzIG9mIGFsbCB0aGUgcmVzb2x1dGlvbnMgZm9yIHRoZSB0aWxlLgotICogQHBhcmFtCXBfZHlfbWluCQkJcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgdGhlIG1pbmltdW0gZHkgb2YgYWxsIHRoZSBjb21wb25lbnRzIG9mIGFsbCB0aGUgcmVzb2x1dGlvbnMgZm9yIHRoZSB0aWxlLgorICoKKyAqIEBwYXJhbSAgIHBfaW1hZ2UgICAgICAgICB0aGUgaW1hZ2UgYmVpbmcgZW5jb2RlZC4KKyAqIEBwYXJhbSAgIHBfY3AgICAgICAgICAgICB0aGUgY29kaW5nIHBhcmFtZXRlcnMuCisgKiBAcGFyYW0gICB0aWxlbm8gICAgICAgICAgdGhlIHRpbGUgaW5kZXggb2YgdGhlIHRpbGUgYmVpbmcgZW5jb2RlZC4KKyAqIEBwYXJhbSAgIHBfdHgwICAgICAgICAgICBwb2ludGVyIHRoYXQgd2lsbCBob2xkIHRoZSBYMCBwYXJhbWV0ZXIgZm9yIHRoZSB0aWxlCisgKiBAcGFyYW0gICBwX3R4MSAgICAgICAgICAgcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgWDEgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQorICogQHBhcmFtICAgcF90eTAgICAgICAgICAgIHBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIFkwIHBhcmFtZXRlciBmb3IgdGhlIHRpbGUKKyAqIEBwYXJhbSAgIHBfdHkxICAgICAgICAgICBwb2ludGVyIHRoYXQgd2lsbCBob2xkIHRoZSBZMSBwYXJhbWV0ZXIgZm9yIHRoZSB0aWxlCisgKiBAcGFyYW0gICBwX21heF9wcmVjICAgICAgcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgbWF4aW11bSBwcmVjaXNpb24gZm9yIGFsbCB0aGUgYmFuZHMgb2YgdGhlIHRpbGUKKyAqIEBwYXJhbSAgIHBfbWF4X3JlcyAgICAgICBwb2ludGVyIHRoYXQgd2lsbCBob2xkIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXNvbHV0aW9ucyBmb3IgYWxsIHRoZSBwb2MgaW5zaWRlIHRoZSB0aWxlLgorICogQHBhcmFtICAgcF9keF9taW4gICAgICAgICAgICBwb2ludGVyIHRoYXQgd2lsbCBob2xkIHRoZSBtaW5pbXVtIGR4IG9mIGFsbCB0aGUgY29tcG9uZW50cyBvZiBhbGwgdGhlIHJlc29sdXRpb25zIGZvciB0aGUgdGlsZS4KKyAqIEBwYXJhbSAgIHBfZHlfbWluICAgICAgICAgICAgcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgbWluaW11bSBkeSBvZiBhbGwgdGhlIGNvbXBvbmVudHMgb2YgYWxsIHRoZSByZXNvbHV0aW9ucyBmb3IgdGhlIHRpbGUuCiAgKi8KIHN0YXRpYyB2b2lkIG9wal9nZXRfZW5jb2RpbmdfcGFyYW1ldGVycyhjb25zdCBvcGpfaW1hZ2VfdCAqcF9pbWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGpfY3BfdCAqcF9jcCwKQEAgLTE1Miw3ICsxNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2R4X21pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9keV9taW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbWF4X3ByZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbWF4X3JlcyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX21heF9yZXMpOwogCiAvKioKICAqIEdldHMgdGhlIGVuY29kaW5nIHBhcmFtZXRlcnMgbmVlZGVkIHRvIHVwZGF0ZSB0aGUgY29kaW5nIHBhcmFtZXRlcnMgYW5kIGFsbCB0aGUgcG9jcy4KQEAgLTE2MSw2NSArMTYwLDY1IEBACiAgKiB0byBhbiBhcmVhIG9mIHNpemUgNCAqIG1heF9yZXMuIFRoZSBkYXRhIGlzIHN0b3JlZCBpbnNpZGUgdGhpcyBhcmVhIHdpdGggdGhlIGZvbGxvd2luZyBwYXR0ZXJuIDoKICAqIGR4X2NvbXBpX3JlczAgLCBkeV9jb21waV9yZXMwICwgd19jb21waV9yZXMwLCBoX2NvbXBpX3JlczAgLCBkeF9jb21waV9yZXMxICwgZHlfY29tcGlfcmVzMSAsIHdfY29tcGlfcmVzMSwgaF9jb21waV9yZXMxICwgLi4uCiAgKgotICogQHBhcmFtCXBfaW1hZ2UJCQl0aGUgaW1hZ2UgYmVpbmcgZW5jb2RlZC4KLSAqIEBwYXJhbQlwX2NwCQkJdGhlIGNvZGluZyBwYXJhbWV0ZXJzLgotICogQHBhcmFtCXRpbGVubwkJCXRoZSB0aWxlIGluZGV4IG9mIHRoZSB0aWxlIGJlaW5nIGVuY29kZWQuCi0gKiBAcGFyYW0JcF90eDAJCQlwb2ludGVyIHRoYXQgd2lsbCBob2xkIHRoZSBYMCBwYXJhbWV0ZXIgZm9yIHRoZSB0aWxlCi0gKiBAcGFyYW0JcF90eDEJCQlwb2ludGVyIHRoYXQgd2lsbCBob2xkIHRoZSBYMSBwYXJhbWV0ZXIgZm9yIHRoZSB0aWxlCi0gKiBAcGFyYW0JcF90eTAJCQlwb2ludGVyIHRoYXQgd2lsbCBob2xkIHRoZSBZMCBwYXJhbWV0ZXIgZm9yIHRoZSB0aWxlCi0gKiBAcGFyYW0JcF90eTEJCQlwb2ludGVyIHRoYXQgd2lsbCBob2xkIHRoZSBZMSBwYXJhbWV0ZXIgZm9yIHRoZSB0aWxlCi0gKiBAcGFyYW0JcF9tYXhfcHJlYwkJcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgdGhlIG1heGltdW0gcHJlY2lzaW9uIGZvciBhbGwgdGhlIGJhbmRzIG9mIHRoZSB0aWxlCi0gKiBAcGFyYW0JcF9tYXhfcmVzCQlwb2ludGVyIHRoYXQgd2lsbCBob2xkIHRoZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgcmVzb2x1dGlvbnMgZm9yIGFsbCB0aGUgcG9jIGluc2lkZSB0aGUgdGlsZS4KLSAqIEBwYXJhbQlwX2R4X21pbgkJcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgdGhlIG1pbmltdW0gZHggb2YgYWxsIHRoZSBjb21wb25lbnRzIG9mIGFsbCB0aGUgcmVzb2x1dGlvbnMgZm9yIHRoZSB0aWxlLgotICogQHBhcmFtCXBfZHlfbWluCQlwb2ludGVyIHRoYXQgd2lsbCBob2xkIHRoZSB0aGUgbWluaW11bSBkeSBvZiBhbGwgdGhlIGNvbXBvbmVudHMgb2YgYWxsIHRoZSByZXNvbHV0aW9ucyBmb3IgdGhlIHRpbGUuCi0gKiBAcGFyYW0JcF9yZXNvbHV0aW9ucwlwb2ludGVyIHRvIGFuIGFyZWEgY29ycmVzcG9uZGluZyB0byB0aGUgb25lIGRlc2NyaWJlZCBhYm92ZS4KKyAqIEBwYXJhbSAgIHBfaW1hZ2UgICAgICAgICB0aGUgaW1hZ2UgYmVpbmcgZW5jb2RlZC4KKyAqIEBwYXJhbSAgIHBfY3AgICAgICAgICAgICB0aGUgY29kaW5nIHBhcmFtZXRlcnMuCisgKiBAcGFyYW0gICB0aWxlbm8gICAgICAgICAgdGhlIHRpbGUgaW5kZXggb2YgdGhlIHRpbGUgYmVpbmcgZW5jb2RlZC4KKyAqIEBwYXJhbSAgIHBfdHgwICAgICAgICAgICBwb2ludGVyIHRoYXQgd2lsbCBob2xkIHRoZSBYMCBwYXJhbWV0ZXIgZm9yIHRoZSB0aWxlCisgKiBAcGFyYW0gICBwX3R4MSAgICAgICAgICAgcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgWDEgcGFyYW1ldGVyIGZvciB0aGUgdGlsZQorICogQHBhcmFtICAgcF90eTAgICAgICAgICAgIHBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIFkwIHBhcmFtZXRlciBmb3IgdGhlIHRpbGUKKyAqIEBwYXJhbSAgIHBfdHkxICAgICAgICAgICBwb2ludGVyIHRoYXQgd2lsbCBob2xkIHRoZSBZMSBwYXJhbWV0ZXIgZm9yIHRoZSB0aWxlCisgKiBAcGFyYW0gICBwX21heF9wcmVjICAgICAgcG9pbnRlciB0aGF0IHdpbGwgaG9sZCB0aGUgbWF4aW11bSBwcmVjaXNpb24gZm9yIGFsbCB0aGUgYmFuZHMgb2YgdGhlIHRpbGUKKyAqIEBwYXJhbSAgIHBfbWF4X3JlcyAgICAgICBwb2ludGVyIHRoYXQgd2lsbCBob2xkIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXNvbHV0aW9ucyBmb3IgYWxsIHRoZSBwb2MgaW5zaWRlIHRoZSB0aWxlLgorICogQHBhcmFtICAgcF9keF9taW4gICAgICAgIHBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIG1pbmltdW0gZHggb2YgYWxsIHRoZSBjb21wb25lbnRzIG9mIGFsbCB0aGUgcmVzb2x1dGlvbnMgZm9yIHRoZSB0aWxlLgorICogQHBhcmFtICAgcF9keV9taW4gICAgICAgIHBvaW50ZXIgdGhhdCB3aWxsIGhvbGQgdGhlIG1pbmltdW0gZHkgb2YgYWxsIHRoZSBjb21wb25lbnRzIG9mIGFsbCB0aGUgcmVzb2x1dGlvbnMgZm9yIHRoZSB0aWxlLgorICogQHBhcmFtICAgcF9yZXNvbHV0aW9ucyAgIHBvaW50ZXIgdG8gYW4gYXJlYSBjb3JyZXNwb25kaW5nIHRvIHRoZSBvbmUgZGVzY3JpYmVkIGFib3ZlLgogICovCiBzdGF0aWMgdm9pZCBvcGpfZ2V0X2FsbF9lbmNvZGluZ19wYXJhbWV0ZXJzKGNvbnN0IG9wal9pbWFnZV90ICpwX2ltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGpfY3BfdCAqcF9jcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdHgwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBwX3R4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90eTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9keF9taW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2R5X21pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbWF4X3ByZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX21heF9yZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiogcF9yZXNvbHV0aW9ucyApOworICAgICAgICBjb25zdCBvcGpfY3BfdCAqcF9jcCwKKyAgICAgICAgT1BKX1VJTlQzMiB0aWxlbm8sCisgICAgICAgIE9QSl9JTlQzMiAqIHBfdHgwLAorICAgICAgICBPUEpfSU5UMzIgKiBwX3R4MSwKKyAgICAgICAgT1BKX0lOVDMyICogcF90eTAsCisgICAgICAgIE9QSl9JTlQzMiAqIHBfdHkxLAorICAgICAgICBPUEpfVUlOVDMyICogcF9keF9taW4sCisgICAgICAgIE9QSl9VSU5UMzIgKiBwX2R5X21pbiwKKyAgICAgICAgT1BKX1VJTlQzMiAqIHBfbWF4X3ByZWMsCisgICAgICAgIE9QSl9VSU5UMzIgKiBwX21heF9yZXMsCisgICAgICAgIE9QSl9VSU5UMzIgKiogcF9yZXNvbHV0aW9ucyk7CiAvKioKICAqIEFsbG9jYXRlcyBtZW1vcnkgZm9yIGEgcGFja2V0IGl0ZXJhdG9yLiBEYXRhIGFuZCBkYXRhIHNpemVzIGFyZSBzZXQgYnkgdGhpcyBvcGVyYXRpb24uCiAgKiBObyBvdGhlciBkYXRhIGlzIHNldC4gVGhlIGluY2x1ZGUgc2VjdGlvbiBvZiB0aGUgcGFja2V0ICBpdGVyYXRvciBpcyBub3QgYWxsb2NhdGVkLgotICogCi0gKiBAcGFyYW0JcF9pbWFnZQkJdGhlIGltYWdlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcGFja2V0IGl0ZXJhdG9yIChpbiBmYWN0IG9ubHkgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIGlzIHJlbGV2YW50LgotICogQHBhcmFtCXBfY3AJCXRoZSBjb2RpbmcgcGFyYW1ldGVycy4KLSAqIEBwYXJhbQl0aWxlbm8JdGhlIGluZGV4IG9mIHRoZSB0aWxlIGZyb20gd2hpY2ggY3JlYXRpbmcgdGhlIHBhY2tldCBpdGVyYXRvci4KKyAqCisgKiBAcGFyYW0gICBwX2ltYWdlICAgICB0aGUgaW1hZ2UgdXNlZCB0byBpbml0aWFsaXplIHRoZSBwYWNrZXQgaXRlcmF0b3IgKGluIGZhY3Qgb25seSB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgaXMgcmVsZXZhbnQuCisgKiBAcGFyYW0gICBwX2NwICAgICAgICB0aGUgY29kaW5nIHBhcmFtZXRlcnMuCisgKiBAcGFyYW0gICB0aWxlbm8gIHRoZSBpbmRleCBvZiB0aGUgdGlsZSBmcm9tIHdoaWNoIGNyZWF0aW5nIHRoZSBwYWNrZXQgaXRlcmF0b3IuCiAgKi8KLXN0YXRpYyBvcGpfcGlfaXRlcmF0b3JfdCAqIG9wal9waV9jcmVhdGUoCWNvbnN0IG9wal9pbWFnZV90ICpwX2ltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGpfY3BfdCAqcF9jcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlbm8gKTsKK3N0YXRpYyBvcGpfcGlfaXRlcmF0b3JfdCAqIG9wal9waV9jcmVhdGUoY29uc3Qgb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCisgICAgICAgIGNvbnN0IG9wal9jcF90ICpwX2NwLAorICAgICAgICBPUEpfVUlOVDMyIHRpbGVubyk7CiAvKioKICAqIEZJWE1FIERPQwogICovCi1zdGF0aWMgdm9pZCBvcGpfcGlfdXBkYXRlX2RlY29kZV9ub3RfcG9jIChvcGpfcGlfaXRlcmF0b3JfdCAqIHBfcGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKiBwX3RjcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcHJlY2lzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9yZXMpOworc3RhdGljIHZvaWQgb3BqX3BpX3VwZGF0ZV9kZWNvZGVfbm90X3BvYyhvcGpfcGlfaXRlcmF0b3JfdCAqIHBfcGksCisgICAgICAgIG9wal90Y3BfdCAqIHBfdGNwLAorICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3ByZWNpc2lvbiwKKyAgICAgICAgT1BKX1VJTlQzMiBwX21heF9yZXMpOwogLyoqCiAgKiBGSVhNRSBET0MKICAqLwotc3RhdGljIHZvaWQgb3BqX3BpX3VwZGF0ZV9kZWNvZGVfcG9jICggIG9wal9waV9pdGVyYXRvcl90ICogcF9waSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKiBwX3RjcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3ByZWNpc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3Jlcyk7CitzdGF0aWMgdm9pZCBvcGpfcGlfdXBkYXRlX2RlY29kZV9wb2Mob3BqX3BpX2l0ZXJhdG9yX3QgKiBwX3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y3BfdCAqIHBfdGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcHJlY2lzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcmVzKTsKIAogLyoqCiAgKiBGSVhNRSBET0MKICAqLwotc3RhdGljIE9QSl9CT09MIG9wal9waV9jaGVja19uZXh0X2xldmVsKAlPUEpfSU5UMzIgcG9zLAotCQkJCQkJCQlvcGpfY3BfdCAqY3AsCi0JCQkJCQkJCU9QSl9VSU5UMzIgdGlsZW5vLAotCQkJCQkJCQlPUEpfVUlOVDMyIHBpbm8sCi0JCQkJCQkJCWNvbnN0IE9QSl9DSEFSICpwcm9nKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfcGlfY2hlY2tfbmV4dF9sZXZlbChPUEpfSU5UMzIgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jcF90ICpjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRpbGVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBpbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1BKX0NIQVIgKnByb2cpOwogCiAvKkB9Ki8KIApAQCAtMjMxLDkyOCArMjMwLDExMjQgQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfcGlfbmV4dF9scmNwKG9wal9waV9pdGVyYXRvcl90ICogcGkpIHsKLQlvcGpfcGlfY29tcF90ICpjb21wID0gTlVMTDsKLQlvcGpfcGlfcmVzb2x1dGlvbl90ICpyZXMgPSBOVUxMOwotCU9QSl9VSU5UMzIgaW5kZXggPSAwOwotCQotCWlmICghcGktPmZpcnN0KSB7Ci0JCWNvbXAgPSAmcGktPmNvbXBzW3BpLT5jb21wbm9dOwotCQlyZXMgPSAmY29tcC0+cmVzb2x1dGlvbnNbcGktPnJlc25vXTsKLQkJZ290byBMQUJFTF9TS0lQOwotCX0gZWxzZSB7Ci0JCXBpLT5maXJzdCA9IDA7Ci0JfQotCi0JZm9yIChwaS0+bGF5bm8gPSBwaS0+cG9jLmxheW5vMDsgcGktPmxheW5vIDwgcGktPnBvYy5sYXlubzE7IHBpLT5sYXlubysrKSB7Ci0JCWZvciAocGktPnJlc25vID0gcGktPnBvYy5yZXNubzA7IHBpLT5yZXNubyA8IHBpLT5wb2MucmVzbm8xOwotCQlwaS0+cmVzbm8rKykgewotCQkJZm9yIChwaS0+Y29tcG5vID0gcGktPnBvYy5jb21wbm8wOyBwaS0+Y29tcG5vIDwgcGktPnBvYy5jb21wbm8xOyBwaS0+Y29tcG5vKyspIHsKLQkJCQljb21wID0gJnBpLT5jb21wc1twaS0+Y29tcG5vXTsKLQkJCQlpZiAocGktPnJlc25vID49IGNvbXAtPm51bXJlc29sdXRpb25zKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlyZXMgPSAmY29tcC0+cmVzb2x1dGlvbnNbcGktPnJlc25vXTsKLQkJCQlpZiAoIXBpLT50cF9vbil7Ci0JCQkJCXBpLT5wb2MucHJlY25vMSA9IHJlcy0+cHcgKiByZXMtPnBoOwotCQkJCX0KLQkJCQlmb3IgKHBpLT5wcmVjbm8gPSBwaS0+cG9jLnByZWNubzA7IHBpLT5wcmVjbm8gPCBwaS0+cG9jLnByZWNubzE7IHBpLT5wcmVjbm8rKykgewotCQkJCQlpbmRleCA9IHBpLT5sYXlubyAqIHBpLT5zdGVwX2wgKyBwaS0+cmVzbm8gKiBwaS0+c3RlcF9yICsgcGktPmNvbXBubyAqIHBpLT5zdGVwX2MgKyBwaS0+cHJlY25vICogcGktPnN0ZXBfcDsKLQkJCQkJaWYgKCFwaS0+aW5jbHVkZVtpbmRleF0pIHsKLQkJCQkJCXBpLT5pbmNsdWRlW2luZGV4XSA9IDE7Ci0JCQkJCQlyZXR1cm4gT1BKX1RSVUU7Ci0JCQkJCX0KLUxBQkVMX1NLSVA6OwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQlyZXR1cm4gT1BKX0ZBTFNFOwotfQotCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3BpX25leHRfcmxjcChvcGpfcGlfaXRlcmF0b3JfdCAqIHBpKSB7Ci0Jb3BqX3BpX2NvbXBfdCAqY29tcCA9IE5VTEw7Ci0Jb3BqX3BpX3Jlc29sdXRpb25fdCAqcmVzID0gTlVMTDsKLQlPUEpfVUlOVDMyIGluZGV4ID0gMDsKLQotCWlmICghcGktPmZpcnN0KSB7Ci0JCWNvbXAgPSAmcGktPmNvbXBzW3BpLT5jb21wbm9dOwotCQlyZXMgPSAmY29tcC0+cmVzb2x1dGlvbnNbcGktPnJlc25vXTsKLQkJZ290byBMQUJFTF9TS0lQOwotCX0gZWxzZSB7Ci0JCXBpLT5maXJzdCA9IDA7Ci0JfQotCi0JZm9yIChwaS0+cmVzbm8gPSBwaS0+cG9jLnJlc25vMDsgcGktPnJlc25vIDwgcGktPnBvYy5yZXNubzE7IHBpLT5yZXNubysrKSB7Ci0JCWZvciAocGktPmxheW5vID0gcGktPnBvYy5sYXlubzA7IHBpLT5sYXlubyA8IHBpLT5wb2MubGF5bm8xOyBwaS0+bGF5bm8rKykgewotCQkJZm9yIChwaS0+Y29tcG5vID0gcGktPnBvYy5jb21wbm8wOyBwaS0+Y29tcG5vIDwgcGktPnBvYy5jb21wbm8xOyBwaS0+Y29tcG5vKyspIHsKLQkJCQljb21wID0gJnBpLT5jb21wc1twaS0+Y29tcG5vXTsKLQkJCQlpZiAocGktPnJlc25vID49IGNvbXAtPm51bXJlc29sdXRpb25zKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlyZXMgPSAmY29tcC0+cmVzb2x1dGlvbnNbcGktPnJlc25vXTsKLQkJCQlpZighcGktPnRwX29uKXsKLQkJCQkJcGktPnBvYy5wcmVjbm8xID0gcmVzLT5wdyAqIHJlcy0+cGg7Ci0JCQkJfQotCQkJCWZvciAocGktPnByZWNubyA9IHBpLT5wb2MucHJlY25vMDsgcGktPnByZWNubyA8IHBpLT5wb2MucHJlY25vMTsgcGktPnByZWNubysrKSB7Ci0JCQkJCWluZGV4ID0gcGktPmxheW5vICogcGktPnN0ZXBfbCArIHBpLT5yZXNubyAqIHBpLT5zdGVwX3IgKyBwaS0+Y29tcG5vICogcGktPnN0ZXBfYyArIHBpLT5wcmVjbm8gKiBwaS0+c3RlcF9wOwotCQkJCQlpZiAoIXBpLT5pbmNsdWRlW2luZGV4XSkgewotCQkJCQkJcGktPmluY2x1ZGVbaW5kZXhdID0gMTsKLQkJCQkJCXJldHVybiBPUEpfVFJVRTsKLQkJCQkJfQotTEFCRUxfU0tJUDo7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXJldHVybiBPUEpfRkFMU0U7Ci19Ci0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfcGlfbmV4dF9ycGNsKG9wal9waV9pdGVyYXRvcl90ICogcGkpIHsKLQlvcGpfcGlfY29tcF90ICpjb21wID0gTlVMTDsKLQlvcGpfcGlfcmVzb2x1dGlvbl90ICpyZXMgPSBOVUxMOwotCU9QSl9VSU5UMzIgaW5kZXggPSAwOwotCi0JaWYgKCFwaS0+Zmlyc3QpIHsKLQkJZ290byBMQUJFTF9TS0lQOwotCX0gZWxzZSB7Ci0JCU9QSl9VSU5UMzIgY29tcG5vLCByZXNubzsKLQkJcGktPmZpcnN0ID0gMDsKLQkJcGktPmR4ID0gMDsKLQkJcGktPmR5ID0gMDsKLQkJZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBwaS0+bnVtY29tcHM7IGNvbXBubysrKSB7Ci0JCQljb21wID0gJnBpLT5jb21wc1tjb21wbm9dOwotCQkJZm9yIChyZXNubyA9IDA7IHJlc25vIDwgY29tcC0+bnVtcmVzb2x1dGlvbnM7IHJlc25vKyspIHsKLQkJCQlPUEpfVUlOVDMyIGR4LCBkeTsKLQkJCQlyZXMgPSAmY29tcC0+cmVzb2x1dGlvbnNbcmVzbm9dOwotCQkJCWR4ID0gY29tcC0+ZHggKiAoMXUgPDwgKHJlcy0+cGR4ICsgY29tcC0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm8pKTsKLQkJCQlkeSA9IGNvbXAtPmR5ICogKDF1IDw8IChyZXMtPnBkeSArIGNvbXAtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vKSk7Ci0JCQkJcGktPmR4ID0gIXBpLT5keCA/IGR4IDogb3BqX3VpbnRfbWluKHBpLT5keCwgZHgpOwotCQkJCXBpLT5keSA9ICFwaS0+ZHkgPyBkeSA6IG9wal91aW50X21pbihwaS0+ZHksIGR5KTsKLQkJCX0KLQkJfQotCX0KLWlmICghcGktPnRwX29uKXsKLQkJCXBpLT5wb2MudHkwID0gcGktPnR5MDsKLQkJCXBpLT5wb2MudHgwID0gcGktPnR4MDsKLQkJCXBpLT5wb2MudHkxID0gcGktPnR5MTsKLQkJCXBpLT5wb2MudHgxID0gcGktPnR4MTsKLQkJfQotCWZvciAocGktPnJlc25vID0gcGktPnBvYy5yZXNubzA7IHBpLT5yZXNubyA8IHBpLT5wb2MucmVzbm8xOyBwaS0+cmVzbm8rKykgewotCQlmb3IgKHBpLT55ID0gcGktPnBvYy50eTA7IHBpLT55IDwgcGktPnBvYy50eTE7IHBpLT55ICs9IChPUEpfSU5UMzIpKHBpLT5keSAtIChPUEpfVUlOVDMyKShwaS0+eSAlIChPUEpfSU5UMzIpcGktPmR5KSkpIHsKLQkJCWZvciAocGktPnggPSBwaS0+cG9jLnR4MDsgcGktPnggPCBwaS0+cG9jLnR4MTsgcGktPnggKz0gKE9QSl9JTlQzMikocGktPmR4IC0gKE9QSl9VSU5UMzIpKHBpLT54ICUgKE9QSl9JTlQzMilwaS0+ZHgpKSkgewotCQkJCWZvciAocGktPmNvbXBubyA9IHBpLT5wb2MuY29tcG5vMDsgcGktPmNvbXBubyA8IHBpLT5wb2MuY29tcG5vMTsgcGktPmNvbXBubysrKSB7Ci0JCQkJCU9QSl9VSU5UMzIgbGV2ZWxubzsKLQkJCQkJT1BKX0lOVDMyIHRyeDAsIHRyeTA7Ci0JCQkJCU9QSl9JTlQzMiAgdHJ4MSwgdHJ5MTsKLQkJCQkJT1BKX1VJTlQzMiAgcnB4LCBycHk7Ci0JCQkJCU9QSl9JTlQzMiAgcHJjaSwgcHJjajsKLQkJCQkJY29tcCA9ICZwaS0+Y29tcHNbcGktPmNvbXBub107Ci0JCQkJCWlmIChwaS0+cmVzbm8gPj0gY29tcC0+bnVtcmVzb2x1dGlvbnMpIHsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCXJlcyA9ICZjb21wLT5yZXNvbHV0aW9uc1twaS0+cmVzbm9dOwotCQkJCQlsZXZlbG5vID0gY29tcC0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcGktPnJlc25vOwotCQkJCQl0cngwID0gb3BqX2ludF9jZWlsZGl2KHBpLT50eDAsIChPUEpfSU5UMzIpKGNvbXAtPmR4IDw8IGxldmVsbm8pKTsKLQkJCQkJdHJ5MCA9IG9wal9pbnRfY2VpbGRpdihwaS0+dHkwLCAoT1BKX0lOVDMyKShjb21wLT5keSA8PCBsZXZlbG5vKSk7Ci0JCQkJCXRyeDEgPSBvcGpfaW50X2NlaWxkaXYocGktPnR4MSwgKE9QSl9JTlQzMikoY29tcC0+ZHggPDwgbGV2ZWxubykpOwotCQkJCQl0cnkxID0gb3BqX2ludF9jZWlsZGl2KHBpLT50eTEsIChPUEpfSU5UMzIpKGNvbXAtPmR5IDw8IGxldmVsbm8pKTsKLQkJCQkJcnB4ID0gcmVzLT5wZHggKyBsZXZlbG5vOwotCQkJCQlycHkgPSByZXMtPnBkeSArIGxldmVsbm87Ci0JCQkJCWlmICghKChwaS0+eSAlIChPUEpfSU5UMzIpKGNvbXAtPmR5IDw8IHJweSkgPT0gMCkgfHwgKChwaS0+eSA9PSBwaS0+dHkwKSAmJiAoKHRyeTAgPDwgbGV2ZWxubykgJSAoMSA8PCBycHkpKSkpKXsKLQkJCQkJCWNvbnRpbnVlOwkKLQkJCQkJfQotCQkJCQlpZiAoISgocGktPnggJSAoT1BKX0lOVDMyKShjb21wLT5keCA8PCBycHgpID09IDApIHx8ICgocGktPnggPT0gcGktPnR4MCkgJiYgKCh0cngwIDw8IGxldmVsbm8pICUgKDEgPDwgcnB4KSkpKSl7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQkKLQkJCQkJaWYgKChyZXMtPnB3PT0wKXx8KHJlcy0+cGg9PTApKSBjb250aW51ZTsKLQkJCQkJCi0JCQkJCWlmICgodHJ4MD09dHJ4MSl8fCh0cnkwPT10cnkxKSkgY29udGludWU7Ci0JCQkJCQotCQkJCQlwcmNpID0gb3BqX2ludF9mbG9vcmRpdnBvdzIob3BqX2ludF9jZWlsZGl2KHBpLT54LCAoT1BKX0lOVDMyKShjb21wLT5keCA8PCBsZXZlbG5vKSksIChPUEpfSU5UMzIpcmVzLT5wZHgpCi0JCQkJCQkgLSBvcGpfaW50X2Zsb29yZGl2cG93Mih0cngwLCAoT1BKX0lOVDMyKXJlcy0+cGR4KTsKLQkJCQkJcHJjaiA9IG9wal9pbnRfZmxvb3JkaXZwb3cyKG9wal9pbnRfY2VpbGRpdihwaS0+eSwgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgbGV2ZWxubykpLCAoT1BKX0lOVDMyKXJlcy0+cGR5KQotCQkJCQkJIC0gb3BqX2ludF9mbG9vcmRpdnBvdzIodHJ5MCwgKE9QSl9JTlQzMilyZXMtPnBkeSk7Ci0JCQkJCXBpLT5wcmVjbm8gPSAoT1BKX1VJTlQzMikocHJjaSArIHByY2ogKiAoT1BKX0lOVDMyKXJlcy0+cHcpOwotCQkJCQlpZiAocGktPnByZWNubyA+PSByZXMtPnB3ICogcmVzLT5waCkgewotCQkJCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJCQkJfQotCQkJCQlmb3IgKHBpLT5sYXlubyA9IHBpLT5wb2MubGF5bm8wOyBwaS0+bGF5bm8gPCBwaS0+cG9jLmxheW5vMTsgcGktPmxheW5vKyspIHsKLQkJCQkJCWluZGV4ID0gcGktPmxheW5vICogcGktPnN0ZXBfbCArIHBpLT5yZXNubyAqIHBpLT5zdGVwX3IgKyBwaS0+Y29tcG5vICogcGktPnN0ZXBfYyArIHBpLT5wcmVjbm8gKiBwaS0+c3RlcF9wOwotCQkJCQkJaWYgKCFwaS0+aW5jbHVkZVtpbmRleF0pIHsKLQkJCQkJCQlwaS0+aW5jbHVkZVtpbmRleF0gPSAxOwotCQkJCQkJCXJldHVybiBPUEpfVFJVRTsKLQkJCQkJCX0KLUxBQkVMX1NLSVA6OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXJldHVybiBPUEpfRkFMU0U7Ci19Ci0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfcGlfbmV4dF9wY3JsKG9wal9waV9pdGVyYXRvcl90ICogcGkpIHsKLQlvcGpfcGlfY29tcF90ICpjb21wID0gTlVMTDsKLQlvcGpfcGlfcmVzb2x1dGlvbl90ICpyZXMgPSBOVUxMOwotCU9QSl9VSU5UMzIgaW5kZXggPSAwOwotCi0JaWYgKCFwaS0+Zmlyc3QpIHsKLQkJY29tcCA9ICZwaS0+Y29tcHNbcGktPmNvbXBub107Ci0JCWdvdG8gTEFCRUxfU0tJUDsKLQl9IGVsc2UgewotCQlPUEpfVUlOVDMyIGNvbXBubywgcmVzbm87Ci0JCXBpLT5maXJzdCA9IDA7Ci0JCXBpLT5keCA9IDA7Ci0JCXBpLT5keSA9IDA7Ci0JCWZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgcGktPm51bWNvbXBzOyBjb21wbm8rKykgewotCQkJY29tcCA9ICZwaS0+Y29tcHNbY29tcG5vXTsKLQkJCWZvciAocmVzbm8gPSAwOyByZXNubyA8IGNvbXAtPm51bXJlc29sdXRpb25zOyByZXNubysrKSB7Ci0JCQkJT1BKX1VJTlQzMiBkeCwgZHk7Ci0JCQkJcmVzID0gJmNvbXAtPnJlc29sdXRpb25zW3Jlc25vXTsKLQkJCQlkeCA9IGNvbXAtPmR4ICogKDF1IDw8IChyZXMtPnBkeCArIGNvbXAtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vKSk7Ci0JCQkJZHkgPSBjb21wLT5keSAqICgxdSA8PCAocmVzLT5wZHkgKyBjb21wLT5udW1yZXNvbHV0aW9ucyAtIDEgLSByZXNubykpOwotCQkJCXBpLT5keCA9ICFwaS0+ZHggPyBkeCA6IG9wal91aW50X21pbihwaS0+ZHgsIGR4KTsKLQkJCQlwaS0+ZHkgPSAhcGktPmR5ID8gZHkgOiBvcGpfdWludF9taW4ocGktPmR5LCBkeSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKCFwaS0+dHBfb24pewotCQkJcGktPnBvYy50eTAgPSBwaS0+dHkwOwotCQkJcGktPnBvYy50eDAgPSBwaS0+dHgwOwotCQkJcGktPnBvYy50eTEgPSBwaS0+dHkxOwotCQkJcGktPnBvYy50eDEgPSBwaS0+dHgxOwotCQl9Ci0JZm9yIChwaS0+eSA9IHBpLT5wb2MudHkwOyBwaS0+eSA8IHBpLT5wb2MudHkxOyBwaS0+eSArPSAoT1BKX0lOVDMyKShwaS0+ZHkgLSAoT1BKX1VJTlQzMikocGktPnkgJSAoT1BKX0lOVDMyKXBpLT5keSkpKSB7Ci0JCWZvciAocGktPnggPSBwaS0+cG9jLnR4MDsgcGktPnggPCBwaS0+cG9jLnR4MTsgcGktPnggKz0gKE9QSl9JTlQzMikocGktPmR4IC0gKE9QSl9VSU5UMzIpKHBpLT54ICUgKE9QSl9JTlQzMilwaS0+ZHgpKSkgewotCQkJZm9yIChwaS0+Y29tcG5vID0gcGktPnBvYy5jb21wbm8wOyBwaS0+Y29tcG5vIDwgcGktPnBvYy5jb21wbm8xOyBwaS0+Y29tcG5vKyspIHsKLQkJCQljb21wID0gJnBpLT5jb21wc1twaS0+Y29tcG5vXTsKLQkJCQlmb3IgKHBpLT5yZXNubyA9IHBpLT5wb2MucmVzbm8wOyBwaS0+cmVzbm8gPCBvcGpfdWludF9taW4ocGktPnBvYy5yZXNubzEsIGNvbXAtPm51bXJlc29sdXRpb25zKTsgcGktPnJlc25vKyspIHsKLQkJCQkJT1BKX1VJTlQzMiBsZXZlbG5vOwotCQkJCQlPUEpfSU5UMzIgdHJ4MCwgdHJ5MDsKLQkJCQkJT1BKX0lOVDMyIHRyeDEsIHRyeTE7Ci0JCQkJCU9QSl9VSU5UMzIgcnB4LCBycHk7Ci0JCQkJCU9QSl9JTlQzMiBwcmNpLCBwcmNqOwotCQkJCQlyZXMgPSAmY29tcC0+cmVzb2x1dGlvbnNbcGktPnJlc25vXTsKLQkJCQkJbGV2ZWxubyA9IGNvbXAtPm51bXJlc29sdXRpb25zIC0gMSAtIHBpLT5yZXNubzsKLQkJCQkJdHJ4MCA9IG9wal9pbnRfY2VpbGRpdihwaS0+dHgwLCAoT1BKX0lOVDMyKShjb21wLT5keCA8PCBsZXZlbG5vKSk7Ci0JCQkJCXRyeTAgPSBvcGpfaW50X2NlaWxkaXYocGktPnR5MCwgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgbGV2ZWxubykpOwotCQkJCQl0cngxID0gb3BqX2ludF9jZWlsZGl2KHBpLT50eDEsIChPUEpfSU5UMzIpKGNvbXAtPmR4IDw8IGxldmVsbm8pKTsKLQkJCQkJdHJ5MSA9IG9wal9pbnRfY2VpbGRpdihwaS0+dHkxLCAoT1BKX0lOVDMyKShjb21wLT5keSA8PCBsZXZlbG5vKSk7Ci0JCQkJCXJweCA9IHJlcy0+cGR4ICsgbGV2ZWxubzsKLQkJCQkJcnB5ID0gcmVzLT5wZHkgKyBsZXZlbG5vOwotCQkJCQlpZiAoISgocGktPnkgJSAoT1BKX0lOVDMyKShjb21wLT5keSA8PCBycHkpID09IDApIHx8ICgocGktPnkgPT0gcGktPnR5MCkgJiYgKCh0cnkwIDw8IGxldmVsbm8pICUgKDEgPDwgcnB5KSkpKSl7Ci0JCQkJCQljb250aW51ZTsJCi0JCQkJCX0KLQkJCQkJaWYgKCEoKHBpLT54ICUgKE9QSl9JTlQzMikoY29tcC0+ZHggPDwgcnB4KSA9PSAwKSB8fCAoKHBpLT54ID09IHBpLT50eDApICYmICgodHJ4MCA8PCBsZXZlbG5vKSAlICgxIDw8IHJweCkpKSkpewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJCi0JCQkJCWlmICgocmVzLT5wdz09MCl8fChyZXMtPnBoPT0wKSkgY29udGludWU7Ci0JCQkJCQotCQkJCQlpZiAoKHRyeDA9PXRyeDEpfHwodHJ5MD09dHJ5MSkpIGNvbnRpbnVlOwotCQkJCQkKLQkJCQkJcHJjaSA9IG9wal9pbnRfZmxvb3JkaXZwb3cyKG9wal9pbnRfY2VpbGRpdihwaS0+eCwgKE9QSl9JTlQzMikoY29tcC0+ZHggPDwgbGV2ZWxubykpLCAoT1BKX0lOVDMyKXJlcy0+cGR4KQotCQkJCQkJIC0gb3BqX2ludF9mbG9vcmRpdnBvdzIodHJ4MCwgKE9QSl9JTlQzMilyZXMtPnBkeCk7Ci0JCQkJCXByY2ogPSBvcGpfaW50X2Zsb29yZGl2cG93MihvcGpfaW50X2NlaWxkaXYocGktPnksIChPUEpfSU5UMzIpKGNvbXAtPmR5IDw8IGxldmVsbm8pKSwgKE9QSl9JTlQzMilyZXMtPnBkeSkKLQkJCQkJCSAtIG9wal9pbnRfZmxvb3JkaXZwb3cyKHRyeTAsIChPUEpfSU5UMzIpcmVzLT5wZHkpOwotCQkJCQlwaS0+cHJlY25vID0gKE9QSl9VSU5UMzIpKHByY2kgKyBwcmNqICogKE9QSl9JTlQzMilyZXMtPnB3KTsKLQkJCQkJaWYgKHBpLT5wcmVjbm8gPj0gcmVzLT5wdyAqIHJlcy0+cGgpIHsKLQkJCQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCQkJCX0KLQkJCQkJZm9yIChwaS0+bGF5bm8gPSBwaS0+cG9jLmxheW5vMDsgcGktPmxheW5vIDwgcGktPnBvYy5sYXlubzE7IHBpLT5sYXlubysrKSB7Ci0JCQkJCQlpbmRleCA9IHBpLT5sYXlubyAqIHBpLT5zdGVwX2wgKyBwaS0+cmVzbm8gKiBwaS0+c3RlcF9yICsgcGktPmNvbXBubyAqIHBpLT5zdGVwX2MgKyBwaS0+cHJlY25vICogcGktPnN0ZXBfcDsKLQkJCQkJCWlmICghcGktPmluY2x1ZGVbaW5kZXhdKSB7Ci0JCQkJCQkJcGktPmluY2x1ZGVbaW5kZXhdID0gMTsKLQkJCQkJCQlyZXR1cm4gT1BKX1RSVUU7Ci0JCQkJCQl9CQotTEFCRUxfU0tJUDo7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIE9QSl9GQUxTRTsKLX0KLQotc3RhdGljIE9QSl9CT09MIG9wal9waV9uZXh0X2Nwcmwob3BqX3BpX2l0ZXJhdG9yX3QgKiBwaSkgewotCW9wal9waV9jb21wX3QgKmNvbXAgPSBOVUxMOwotCW9wal9waV9yZXNvbHV0aW9uX3QgKnJlcyA9IE5VTEw7Ci0JT1BKX1VJTlQzMiBpbmRleCA9IDA7Ci0KLQlpZiAoIXBpLT5maXJzdCkgewotCQljb21wID0gJnBpLT5jb21wc1twaS0+Y29tcG5vXTsKLQkJZ290byBMQUJFTF9TS0lQOwotCX0gZWxzZSB7Ci0JCXBpLT5maXJzdCA9IDA7Ci0JfQotCi0JZm9yIChwaS0+Y29tcG5vID0gcGktPnBvYy5jb21wbm8wOyBwaS0+Y29tcG5vIDwgcGktPnBvYy5jb21wbm8xOyBwaS0+Y29tcG5vKyspIHsKLQkJT1BKX1VJTlQzMiByZXNubzsKLQkJY29tcCA9ICZwaS0+Y29tcHNbcGktPmNvbXBub107Ci0JCXBpLT5keCA9IDA7Ci0JCXBpLT5keSA9IDA7Ci0JCWZvciAocmVzbm8gPSAwOyByZXNubyA8IGNvbXAtPm51bXJlc29sdXRpb25zOyByZXNubysrKSB7Ci0JCQlPUEpfVUlOVDMyIGR4LCBkeTsKLQkJCXJlcyA9ICZjb21wLT5yZXNvbHV0aW9uc1tyZXNub107Ci0JCQlkeCA9IGNvbXAtPmR4ICogKDF1IDw8IChyZXMtPnBkeCArIGNvbXAtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vKSk7Ci0JCQlkeSA9IGNvbXAtPmR5ICogKDF1IDw8IChyZXMtPnBkeSArIGNvbXAtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vKSk7Ci0JCQlwaS0+ZHggPSAhcGktPmR4ID8gZHggOiBvcGpfdWludF9taW4ocGktPmR4LCBkeCk7Ci0JCQlwaS0+ZHkgPSAhcGktPmR5ID8gZHkgOiBvcGpfdWludF9taW4ocGktPmR5LCBkeSk7Ci0JCX0KLQkJaWYgKCFwaS0+dHBfb24pewotCQkJcGktPnBvYy50eTAgPSBwaS0+dHkwOwotCQkJcGktPnBvYy50eDAgPSBwaS0+dHgwOwotCQkJcGktPnBvYy50eTEgPSBwaS0+dHkxOwotCQkJcGktPnBvYy50eDEgPSBwaS0+dHgxOwotCQl9Ci0JCWZvciAocGktPnkgPSBwaS0+cG9jLnR5MDsgcGktPnkgPCBwaS0+cG9jLnR5MTsgcGktPnkgKz0gKE9QSl9JTlQzMikocGktPmR5IC0gKE9QSl9VSU5UMzIpKHBpLT55ICUgKE9QSl9JTlQzMilwaS0+ZHkpKSkgewotCQkJZm9yIChwaS0+eCA9IHBpLT5wb2MudHgwOyBwaS0+eCA8IHBpLT5wb2MudHgxOyBwaS0+eCArPSAoT1BKX0lOVDMyKShwaS0+ZHggLSAoT1BKX1VJTlQzMikocGktPnggJSAoT1BKX0lOVDMyKXBpLT5keCkpKSB7Ci0JCQkJZm9yIChwaS0+cmVzbm8gPSBwaS0+cG9jLnJlc25vMDsgcGktPnJlc25vIDwgb3BqX3VpbnRfbWluKHBpLT5wb2MucmVzbm8xLCBjb21wLT5udW1yZXNvbHV0aW9ucyk7IHBpLT5yZXNubysrKSB7Ci0JCQkJCU9QSl9VSU5UMzIgbGV2ZWxubzsKLQkJCQkJT1BKX0lOVDMyIHRyeDAsIHRyeTA7Ci0JCQkJCU9QSl9JTlQzMiB0cngxLCB0cnkxOwotCQkJCQlPUEpfVUlOVDMyIHJweCwgcnB5OwotCQkJCQlPUEpfSU5UMzIgcHJjaSwgcHJjajsKLQkJCQkJcmVzID0gJmNvbXAtPnJlc29sdXRpb25zW3BpLT5yZXNub107Ci0JCQkJCWxldmVsbm8gPSBjb21wLT5udW1yZXNvbHV0aW9ucyAtIDEgLSBwaS0+cmVzbm87Ci0JCQkJCXRyeDAgPSBvcGpfaW50X2NlaWxkaXYocGktPnR4MCwgKE9QSl9JTlQzMikoY29tcC0+ZHggPDwgbGV2ZWxubykpOwotCQkJCQl0cnkwID0gb3BqX2ludF9jZWlsZGl2KHBpLT50eTAsIChPUEpfSU5UMzIpKGNvbXAtPmR5IDw8IGxldmVsbm8pKTsKLQkJCQkJdHJ4MSA9IG9wal9pbnRfY2VpbGRpdihwaS0+dHgxLCAoT1BKX0lOVDMyKShjb21wLT5keCA8PCBsZXZlbG5vKSk7Ci0JCQkJCXRyeTEgPSBvcGpfaW50X2NlaWxkaXYocGktPnR5MSwgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgbGV2ZWxubykpOwotCQkJCQlycHggPSByZXMtPnBkeCArIGxldmVsbm87Ci0JCQkJCXJweSA9IHJlcy0+cGR5ICsgbGV2ZWxubzsKLQkJCQkJaWYgKCEoKHBpLT55ICUgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgcnB5KSA9PSAwKSB8fCAoKHBpLT55ID09IHBpLT50eTApICYmICgodHJ5MCA8PCBsZXZlbG5vKSAlICgxIDw8IHJweSkpKSkpewotCQkJCQkJY29udGludWU7CQotCQkJCQl9Ci0JCQkJCWlmICghKChwaS0+eCAlIChPUEpfSU5UMzIpKGNvbXAtPmR4IDw8IHJweCkgPT0gMCkgfHwgKChwaS0+eCA9PSBwaS0+dHgwKSAmJiAoKHRyeDAgPDwgbGV2ZWxubykgJSAoMSA8PCBycHgpKSkpKXsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoKHJlcy0+cHc9PTApfHwocmVzLT5waD09MCkpIGNvbnRpbnVlOwotCQkJCQkKLQkJCQkJaWYgKCh0cngwPT10cngxKXx8KHRyeTA9PXRyeTEpKSBjb250aW51ZTsKLQkJCQkJCi0JCQkJCXByY2kgPSBvcGpfaW50X2Zsb29yZGl2cG93MihvcGpfaW50X2NlaWxkaXYocGktPngsIChPUEpfSU5UMzIpKGNvbXAtPmR4IDw8IGxldmVsbm8pKSwgKE9QSl9JTlQzMilyZXMtPnBkeCkKLQkJCQkJCSAtIG9wal9pbnRfZmxvb3JkaXZwb3cyKHRyeDAsIChPUEpfSU5UMzIpcmVzLT5wZHgpOwotCQkJCQlwcmNqID0gb3BqX2ludF9mbG9vcmRpdnBvdzIob3BqX2ludF9jZWlsZGl2KHBpLT55LCAoT1BKX0lOVDMyKShjb21wLT5keSA8PCBsZXZlbG5vKSksIChPUEpfSU5UMzIpcmVzLT5wZHkpCi0JCQkJCQkgLSBvcGpfaW50X2Zsb29yZGl2cG93Mih0cnkwLCAoT1BKX0lOVDMyKXJlcy0+cGR5KTsKLQkJCQkJcGktPnByZWNubyA9IChPUEpfVUlOVDMyKShwcmNpICsgcHJjaiAqIChPUEpfSU5UMzIpcmVzLT5wdyk7Ci0JCQkJCWlmIChwaS0+cHJlY25vID49IHJlcy0+cHcgKiByZXMtPnBoKSB7Ci0JCQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJCQl9Ci0JCQkJCWZvciAocGktPmxheW5vID0gcGktPnBvYy5sYXlubzA7IHBpLT5sYXlubyA8IHBpLT5wb2MubGF5bm8xOyBwaS0+bGF5bm8rKykgewotCQkJCQkJaW5kZXggPSBwaS0+bGF5bm8gKiBwaS0+c3RlcF9sICsgcGktPnJlc25vICogcGktPnN0ZXBfciArIHBpLT5jb21wbm8gKiBwaS0+c3RlcF9jICsgcGktPnByZWNubyAqIHBpLT5zdGVwX3A7Ci0JCQkJCQlpZiAoIXBpLT5pbmNsdWRlW2luZGV4XSkgewotCQkJCQkJCXBpLT5pbmNsdWRlW2luZGV4XSA9IDE7Ci0JCQkJCQkJcmV0dXJuIE9QSl9UUlVFOwotCQkJCQkJfQotTEFCRUxfU0tJUDo7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JcmV0dXJuIE9QSl9GQUxTRTsKLX0KLQotc3RhdGljIHZvaWQgb3BqX2dldF9lbmNvZGluZ19wYXJhbWV0ZXJzKAljb25zdCBvcGpfaW1hZ2VfdCAqcF9pbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wal9jcF90ICpwX2NwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIHBfdHgwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICAqIHBfdHgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICAqIHBfdHkwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICAqIHBfdHkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZHhfbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZHlfbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbWF4X3ByZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9tYXhfcmVzICkKK3N0YXRpYyB2b2lkIG9wal9waV9lbWl0X2Vycm9yKG9wal9waV9pdGVyYXRvcl90ICogcGksIGNvbnN0IGNoYXIqIG1zZykKIHsKLQkvKiBsb29wICovCi0JT1BKX1VJTlQzMiAgY29tcG5vLCByZXNubzsKLQkvKiBwb2ludGVycyAqLwotCWNvbnN0IG9wal90Y3BfdCAqbF90Y3AgPSAwMDsKLQljb25zdCBvcGpfdGNjcF90ICogbF90Y2NwID0gMDA7Ci0JY29uc3Qgb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1nX2NvbXAgPSAwMDsKLQotCS8qIHBvc2l0aW9uIGluIHggYW5kIHkgb2YgdGlsZSAqLwotCU9QSl9VSU5UMzIgcCwgcTsKLQotCS8qIHByZWNvbmRpdGlvbnMgKi8KLQlhc3NlcnQocF9jcCAhPSAwMCk7Ci0JYXNzZXJ0KHBfaW1hZ2UgIT0gMDApOwotCWFzc2VydChwX3RpbGVubyA8IHBfY3AtPnR3ICogcF9jcC0+dGgpOwotCi0JLyogaW5pdGlhbGl6YXRpb25zICovCi0JbF90Y3AgPSAmcF9jcC0+dGNwcyBbcF90aWxlbm9dOwotCWxfaW1nX2NvbXAgPSBwX2ltYWdlLT5jb21wczsKLQlsX3RjY3AgPSBsX3RjcC0+dGNjcHM7Ci0KLQkvKiBoZXJlIGNhbGN1bGF0aW9uIG9mIHR4MCwgdHgxLCB0eTAsIHR5MSwgbWF4cHJlYywgZHggYW5kIGR5ICovCi0JcCA9IHBfdGlsZW5vICUgcF9jcC0+dHc7Ci0JcSA9IHBfdGlsZW5vIC8gcF9jcC0+dHc7Ci0KLQkvKiBmaW5kIGV4dGVudCBvZiB0aWxlICovCi0JKnBfdHgwID0gb3BqX2ludF9tYXgoKE9QSl9JTlQzMikocF9jcC0+dHgwICsgcCAqIHBfY3AtPnRkeCksIChPUEpfSU5UMzIpcF9pbWFnZS0+eDApOwotCSpwX3R4MSA9IG9wal9pbnRfbWluKChPUEpfSU5UMzIpKHBfY3AtPnR4MCArIChwICsgMSkgKiBwX2NwLT50ZHgpLCAoT1BKX0lOVDMyKXBfaW1hZ2UtPngxKTsKLQkqcF90eTAgPSBvcGpfaW50X21heCgoT1BKX0lOVDMyKShwX2NwLT50eTAgKyBxICogcF9jcC0+dGR5KSwgKE9QSl9JTlQzMilwX2ltYWdlLT55MCk7Ci0JKnBfdHkxID0gb3BqX2ludF9taW4oKE9QSl9JTlQzMikocF9jcC0+dHkwICsgKHEgKyAxKSAqIHBfY3AtPnRkeSksIChPUEpfSU5UMzIpcF9pbWFnZS0+eTEpOwotCi0JLyogbWF4IHByZWNpc2lvbiBpcyAwIChjYW4gb25seSBncm93KSAqLwotCSpwX21heF9wcmVjID0gMDsKLQkqcF9tYXhfcmVzID0gMDsKLQotCS8qIHRha2UgdGhlIGxhcmdlc3QgdmFsdWUgZm9yIGR4X21pbiBhbmQgZHlfbWluICovCi0JKnBfZHhfbWluID0gMHg3ZmZmZmZmZjsKLQkqcF9keV9taW4gID0gMHg3ZmZmZmZmZjsKLQotCWZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgcF9pbWFnZS0+bnVtY29tcHM7ICsrY29tcG5vKSB7Ci0JCS8qIGFyaXRobWV0aWMgdmFyaWFibGVzIHRvIGNhbGN1bGF0ZSAqLwotCQlPUEpfVUlOVDMyIGxfbGV2ZWxfbm87Ci0JCU9QSl9JTlQzMiBsX3J4MCwgbF9yeTAsIGxfcngxLCBsX3J5MTsKLQkJT1BKX0lOVDMyIGxfcHgwLCBsX3B5MCwgbF9weDEsIHB5MTsKLQkJT1BKX1VJTlQzMiBsX3BkeCwgbF9wZHk7Ci0JCU9QSl9VSU5UMzIgbF9wdywgbF9waDsKLQkJT1BKX1VJTlQzMiBsX3Byb2R1Y3Q7Ci0JCU9QSl9JTlQzMiBsX3RjeDAsIGxfdGN5MCwgbF90Y3gxLCBsX3RjeTE7Ci0KLQkJbF90Y3gwID0gb3BqX2ludF9jZWlsZGl2KCpwX3R4MCwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keCk7Ci0JCWxfdGN5MCA9IG9wal9pbnRfY2VpbGRpdigqcF90eTAsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHkpOwotCQlsX3RjeDEgPSBvcGpfaW50X2NlaWxkaXYoKnBfdHgxLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR4KTsKLQkJbF90Y3kxID0gb3BqX2ludF9jZWlsZGl2KCpwX3R5MSwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keSk7Ci0KLQkJaWYgKGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgPiAqcF9tYXhfcmVzKSB7Ci0JCQkqcF9tYXhfcmVzID0gbF90Y2NwLT5udW1yZXNvbHV0aW9uczsKLQkJfQotCi0JCS8qIHVzZSBjdXN0b20gc2l6ZSBmb3IgcHJlY2luY3RzICovCi0JCWZvciAocmVzbm8gPSAwOyByZXNubyA8IGxfdGNjcC0+bnVtcmVzb2x1dGlvbnM7ICsrcmVzbm8pIHsKLQkJCU9QSl9VSU5UMzIgbF9keCwgbF9keTsKLQotCQkJLyogcHJlY2luY3Qgd2lkdGggYW5kIGhlaWdodCAqLwotCQkJbF9wZHggPSBsX3RjY3AtPnByY3dbcmVzbm9dOwotCQkJbF9wZHkgPSBsX3RjY3AtPnByY2hbcmVzbm9dOwotCi0JCQlsX2R4ID0gbF9pbWdfY29tcC0+ZHggKiAoMXUgPDwgKGxfcGR4ICsgbF90Y2NwLT5udW1yZXNvbHV0aW9ucyAtIDEgLSByZXNubykpOwotCQkJbF9keSA9IGxfaW1nX2NvbXAtPmR5ICogKDF1IDw8IChsX3BkeSArIGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm8pKTsKLQotCQkJLyogdGFrZSB0aGUgbWluaW11bSBzaXplIGZvciBkeCBmb3IgZWFjaCBjb21wIGFuZCByZXNvbHV0aW9uICovCi0JCQkqcF9keF9taW4gPSBvcGpfdWludF9taW4oKnBfZHhfbWluLCBsX2R4KTsKLQkJCSpwX2R5X21pbiA9IG9wal91aW50X21pbigqcF9keV9taW4sIGxfZHkpOwotCi0JCQkvKiB2YXJpb3VzIGNhbGN1bGF0aW9ucyBvZiBleHRlbnRzICovCi0JCQlsX2xldmVsX25vID0gbF90Y2NwLT5udW1yZXNvbHV0aW9ucyAtIDEgLSByZXNubzsKLQotCQkJbF9yeDAgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGN4MCwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKLQkJCWxfcnkwID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RjeTAsIChPUEpfSU5UMzIpbF9sZXZlbF9ubyk7Ci0JCQlsX3J4MSA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90Y3gxLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOwotCQkJbF9yeTEgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGN5MSwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKLQotCQkJbF9weDAgPSBvcGpfaW50X2Zsb29yZGl2cG93MihsX3J4MCwgKE9QSl9JTlQzMilsX3BkeCkgPDwgbF9wZHg7Ci0JCQlsX3B5MCA9IG9wal9pbnRfZmxvb3JkaXZwb3cyKGxfcnkwLCAoT1BKX0lOVDMyKWxfcGR5KSA8PCBsX3BkeTsKLQkJCWxfcHgxID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3J4MSwgKE9QSl9JTlQzMilsX3BkeCkgPDwgbF9wZHg7Ci0KLQkJCXB5MSA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF9yeTEsIChPUEpfSU5UMzIpbF9wZHkpIDw8IGxfcGR5OwotCi0JCQlsX3B3ID0gKGxfcngwPT1sX3J4MSk/MDooT1BKX1VJTlQzMikoKGxfcHgxIC0gbF9weDApID4+IGxfcGR4KTsKLQkJCWxfcGggPSAobF9yeTA9PWxfcnkxKT8wOihPUEpfVUlOVDMyKSgocHkxIC0gbF9weTApID4+IGxfcGR5KTsKLQotCQkJbF9wcm9kdWN0ID0gbF9wdyAqIGxfcGg7Ci0KLQkJCS8qIHVwZGF0ZSBwcmVjaXNpb24gKi8KLQkJCWlmIChsX3Byb2R1Y3QgPiAqcF9tYXhfcHJlYykgewotCQkJCSpwX21heF9wcmVjID0gbF9wcm9kdWN0OwotCQkJfQotCQl9Ci0JCSsrbF9pbWdfY29tcDsKLQkJKytsX3RjY3A7Ci0JfQorICAgICh2b2lkKXBpOworICAgICh2b2lkKW1zZzsKIH0KIAorc3RhdGljIE9QSl9CT09MIG9wal9waV9uZXh0X2xyY3Aob3BqX3BpX2l0ZXJhdG9yX3QgKiBwaSkKK3sKKyAgICBvcGpfcGlfY29tcF90ICpjb21wID0gTlVMTDsKKyAgICBvcGpfcGlfcmVzb2x1dGlvbl90ICpyZXMgPSBOVUxMOworICAgIE9QSl9VSU5UMzIgaW5kZXggPSAwOwogCi1zdGF0aWMgdm9pZCBvcGpfZ2V0X2FsbF9lbmNvZGluZ19wYXJhbWV0ZXJzKCAgIGNvbnN0IG9wal9pbWFnZV90ICpwX2ltYWdlLAorICAgIGlmICghcGktPmZpcnN0KSB7CisgICAgICAgIGNvbXAgPSAmcGktPmNvbXBzW3BpLT5jb21wbm9dOworICAgICAgICByZXMgPSAmY29tcC0+cmVzb2x1dGlvbnNbcGktPnJlc25vXTsKKyAgICAgICAgZ290byBMQUJFTF9TS0lQOworICAgIH0gZWxzZSB7CisgICAgICAgIHBpLT5maXJzdCA9IDA7CisgICAgfQorCisgICAgZm9yIChwaS0+bGF5bm8gPSBwaS0+cG9jLmxheW5vMDsgcGktPmxheW5vIDwgcGktPnBvYy5sYXlubzE7IHBpLT5sYXlubysrKSB7CisgICAgICAgIGZvciAocGktPnJlc25vID0gcGktPnBvYy5yZXNubzA7IHBpLT5yZXNubyA8IHBpLT5wb2MucmVzbm8xOworICAgICAgICAgICAgICAgIHBpLT5yZXNubysrKSB7CisgICAgICAgICAgICBmb3IgKHBpLT5jb21wbm8gPSBwaS0+cG9jLmNvbXBubzA7IHBpLT5jb21wbm8gPCBwaS0+cG9jLmNvbXBubzE7IHBpLT5jb21wbm8rKykgeworICAgICAgICAgICAgICAgIGNvbXAgPSAmcGktPmNvbXBzW3BpLT5jb21wbm9dOworICAgICAgICAgICAgICAgIGlmIChwaS0+cmVzbm8gPj0gY29tcC0+bnVtcmVzb2x1dGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcyA9ICZjb21wLT5yZXNvbHV0aW9uc1twaS0+cmVzbm9dOworICAgICAgICAgICAgICAgIGlmICghcGktPnRwX29uKSB7CisgICAgICAgICAgICAgICAgICAgIHBpLT5wb2MucHJlY25vMSA9IHJlcy0+cHcgKiByZXMtPnBoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKHBpLT5wcmVjbm8gPSBwaS0+cG9jLnByZWNubzA7IHBpLT5wcmVjbm8gPCBwaS0+cG9jLnByZWNubzE7IHBpLT5wcmVjbm8rKykgeworICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHBpLT5sYXlubyAqIHBpLT5zdGVwX2wgKyBwaS0+cmVzbm8gKiBwaS0+c3RlcF9yICsgcGktPmNvbXBubyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGktPnN0ZXBfYyArIHBpLT5wcmVjbm8gKiBwaS0+c3RlcF9wOworICAgICAgICAgICAgICAgICAgICAvKiBBdm9pZHMgaW5kZXggb3V0IG9mIGJvdW5kcyBhY2Nlc3Mgd2l0aCAqLworICAgICAgICAgICAgICAgICAgICAvKiBpZF8wMDAwOTgsc2lnXzExLHNyY18wMDU0MTEsb3BfaGF2b2MscmVwXzIgb2YgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogaHR0cHM6Ly9naXRodWIuY29tL3VjbG91dmFpbi9vcGVuanBlZy9pc3N1ZXMvOTM4ICovCisgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIG1vc3QgY2xldmVyIGZpeC4gUGVyaGFwcyAqLworICAgICAgICAgICAgICAgICAgICAvKiBpbmNsdWRlIHNob3VsZCBiZSByZXNpemVkIHdoZW4gYSBQT0MgYXJpc2VzLCBvciAqLworICAgICAgICAgICAgICAgICAgICAvKiB0aGUgUE9DIHNob3VsZCBiZSByZWplY3RlZCAqLworICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gcGktPmluY2x1ZGVfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2VtaXRfZXJyb3IocGksICJJbnZhbGlkIGFjY2VzcyB0byBwaS0+aW5jbHVkZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIXBpLT5pbmNsdWRlW2luZGV4XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGktPmluY2x1ZGVbaW5kZXhdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorTEFCRUxfU0tJUDoKKyAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPUEpfRkFMU0U7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfcGlfbmV4dF9ybGNwKG9wal9waV9pdGVyYXRvcl90ICogcGkpCit7CisgICAgb3BqX3BpX2NvbXBfdCAqY29tcCA9IE5VTEw7CisgICAgb3BqX3BpX3Jlc29sdXRpb25fdCAqcmVzID0gTlVMTDsKKyAgICBPUEpfVUlOVDMyIGluZGV4ID0gMDsKKworICAgIGlmICghcGktPmZpcnN0KSB7CisgICAgICAgIGNvbXAgPSAmcGktPmNvbXBzW3BpLT5jb21wbm9dOworICAgICAgICByZXMgPSAmY29tcC0+cmVzb2x1dGlvbnNbcGktPnJlc25vXTsKKyAgICAgICAgZ290byBMQUJFTF9TS0lQOworICAgIH0gZWxzZSB7CisgICAgICAgIHBpLT5maXJzdCA9IDA7CisgICAgfQorCisgICAgZm9yIChwaS0+cmVzbm8gPSBwaS0+cG9jLnJlc25vMDsgcGktPnJlc25vIDwgcGktPnBvYy5yZXNubzE7IHBpLT5yZXNubysrKSB7CisgICAgICAgIGZvciAocGktPmxheW5vID0gcGktPnBvYy5sYXlubzA7IHBpLT5sYXlubyA8IHBpLT5wb2MubGF5bm8xOyBwaS0+bGF5bm8rKykgeworICAgICAgICAgICAgZm9yIChwaS0+Y29tcG5vID0gcGktPnBvYy5jb21wbm8wOyBwaS0+Y29tcG5vIDwgcGktPnBvYy5jb21wbm8xOyBwaS0+Y29tcG5vKyspIHsKKyAgICAgICAgICAgICAgICBjb21wID0gJnBpLT5jb21wc1twaS0+Y29tcG5vXTsKKyAgICAgICAgICAgICAgICBpZiAocGktPnJlc25vID49IGNvbXAtPm51bXJlc29sdXRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXMgPSAmY29tcC0+cmVzb2x1dGlvbnNbcGktPnJlc25vXTsKKyAgICAgICAgICAgICAgICBpZiAoIXBpLT50cF9vbikgeworICAgICAgICAgICAgICAgICAgICBwaS0+cG9jLnByZWNubzEgPSByZXMtPnB3ICogcmVzLT5waDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChwaS0+cHJlY25vID0gcGktPnBvYy5wcmVjbm8wOyBwaS0+cHJlY25vIDwgcGktPnBvYy5wcmVjbm8xOyBwaS0+cHJlY25vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBwaS0+bGF5bm8gKiBwaS0+c3RlcF9sICsgcGktPnJlc25vICogcGktPnN0ZXBfciArIHBpLT5jb21wbm8gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpLT5zdGVwX2MgKyBwaS0+cHJlY25vICogcGktPnN0ZXBfcDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IHBpLT5pbmNsdWRlX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9waV9lbWl0X2Vycm9yKHBpLCAiSW52YWxpZCBhY2Nlc3MgdG8gcGktPmluY2x1ZGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwaS0+aW5jbHVkZVtpbmRleF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpLT5pbmNsdWRlW2luZGV4XSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KK0xBQkVMX1NLSVA6CisgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT1BKX0ZBTFNFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX3BpX25leHRfcnBjbChvcGpfcGlfaXRlcmF0b3JfdCAqIHBpKQoreworICAgIG9wal9waV9jb21wX3QgKmNvbXAgPSBOVUxMOworICAgIG9wal9waV9yZXNvbHV0aW9uX3QgKnJlcyA9IE5VTEw7CisgICAgT1BKX1VJTlQzMiBpbmRleCA9IDA7CisKKyAgICBpZiAoIXBpLT5maXJzdCkgeworICAgICAgICBnb3RvIExBQkVMX1NLSVA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgT1BKX1VJTlQzMiBjb21wbm8sIHJlc25vOworICAgICAgICBwaS0+Zmlyc3QgPSAwOworICAgICAgICBwaS0+ZHggPSAwOworICAgICAgICBwaS0+ZHkgPSAwOworICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHBpLT5udW1jb21wczsgY29tcG5vKyspIHsKKyAgICAgICAgICAgIGNvbXAgPSAmcGktPmNvbXBzW2NvbXBub107CisgICAgICAgICAgICBmb3IgKHJlc25vID0gMDsgcmVzbm8gPCBjb21wLT5udW1yZXNvbHV0aW9uczsgcmVzbm8rKykgeworICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgZHgsIGR5OworICAgICAgICAgICAgICAgIHJlcyA9ICZjb21wLT5yZXNvbHV0aW9uc1tyZXNub107CisgICAgICAgICAgICAgICAgaWYgKHJlcy0+cGR4ICsgY29tcC0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm8gPCAzMiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY29tcC0+ZHggPD0gVUlOVF9NQVggLyAoMXUgPDwgKHJlcy0+cGR4ICsgY29tcC0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm8pKSkgeworICAgICAgICAgICAgICAgICAgICBkeCA9IGNvbXAtPmR4ICogKDF1IDw8IChyZXMtPnBkeCArIGNvbXAtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vKSk7CisgICAgICAgICAgICAgICAgICAgIHBpLT5keCA9ICFwaS0+ZHggPyBkeCA6IG9wal91aW50X21pbihwaS0+ZHgsIGR4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlcy0+cGR5ICsgY29tcC0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm8gPCAzMiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY29tcC0+ZHkgPD0gVUlOVF9NQVggLyAoMXUgPDwgKHJlcy0+cGR5ICsgY29tcC0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm8pKSkgeworICAgICAgICAgICAgICAgICAgICBkeSA9IGNvbXAtPmR5ICogKDF1IDw8IChyZXMtPnBkeSArIGNvbXAtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vKSk7CisgICAgICAgICAgICAgICAgICAgIHBpLT5keSA9ICFwaS0+ZHkgPyBkeSA6IG9wal91aW50X21pbihwaS0+ZHksIGR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBpLT5keCA9PSAwIHx8IHBpLT5keSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgfQorICAgIGlmICghcGktPnRwX29uKSB7CisgICAgICAgIHBpLT5wb2MudHkwID0gcGktPnR5MDsKKyAgICAgICAgcGktPnBvYy50eDAgPSBwaS0+dHgwOworICAgICAgICBwaS0+cG9jLnR5MSA9IHBpLT50eTE7CisgICAgICAgIHBpLT5wb2MudHgxID0gcGktPnR4MTsKKyAgICB9CisgICAgZm9yIChwaS0+cmVzbm8gPSBwaS0+cG9jLnJlc25vMDsgcGktPnJlc25vIDwgcGktPnBvYy5yZXNubzE7IHBpLT5yZXNubysrKSB7CisgICAgICAgIGZvciAocGktPnkgPSBwaS0+cG9jLnR5MDsgcGktPnkgPCBwaS0+cG9jLnR5MTsKKyAgICAgICAgICAgICAgICBwaS0+eSArPSAoT1BKX0lOVDMyKShwaS0+ZHkgLSAoT1BKX1VJTlQzMikocGktPnkgJSAoT1BKX0lOVDMyKXBpLT5keSkpKSB7CisgICAgICAgICAgICBmb3IgKHBpLT54ID0gcGktPnBvYy50eDA7IHBpLT54IDwgcGktPnBvYy50eDE7CisgICAgICAgICAgICAgICAgICAgIHBpLT54ICs9IChPUEpfSU5UMzIpKHBpLT5keCAtIChPUEpfVUlOVDMyKShwaS0+eCAlIChPUEpfSU5UMzIpcGktPmR4KSkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKHBpLT5jb21wbm8gPSBwaS0+cG9jLmNvbXBubzA7IHBpLT5jb21wbm8gPCBwaS0+cG9jLmNvbXBubzE7IHBpLT5jb21wbm8rKykgeworICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxldmVsbm87CisgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB0cngwLCB0cnkwOworICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgIHRyeDEsIHRyeTE7CisgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgIHJweCwgcnB5OworICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgIHByY2ksIHByY2o7CisgICAgICAgICAgICAgICAgICAgIGNvbXAgPSAmcGktPmNvbXBzW3BpLT5jb21wbm9dOworICAgICAgICAgICAgICAgICAgICBpZiAocGktPnJlc25vID49IGNvbXAtPm51bXJlc29sdXRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXMgPSAmY29tcC0+cmVzb2x1dGlvbnNbcGktPnJlc25vXTsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxubyA9IGNvbXAtPm51bXJlc29sdXRpb25zIC0gMSAtIHBpLT5yZXNubzsKKyAgICAgICAgICAgICAgICAgICAgLyogQXZvaWRzIGRpdmlzaW9uIGJ5IHplcm8gKi8KKyAgICAgICAgICAgICAgICAgICAgLyogUmVsYXRlcyB0byBpZF8wMDAwMDQsc2lnXzA2LHNyY18wMDA2Nzksb3BfYXJpdGg4LHBvc180OSx2YWxfLTE3ICovCisgICAgICAgICAgICAgICAgICAgIC8qIG9mICBodHRwczovL2dpdGh1Yi5jb20vdWNsb3V2YWluL29wZW5qcGVnL2lzc3Vlcy85MzggKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsbm8gPj0gMzIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGNvbXAtPmR4IDw8IGxldmVsbm8pID4+IGxldmVsbm8pICE9IGNvbXAtPmR4IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjb21wLT5keSA8PCBsZXZlbG5vKSA+PiBsZXZlbG5vKSAhPSBjb21wLT5keSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChjb21wLT5keCA8PCBsZXZlbG5vKSA+IElOVF9NQVggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcC0+ZHkgPDwgbGV2ZWxubykgPiBJTlRfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cngwID0gb3BqX2ludF9jZWlsZGl2KHBpLT50eDAsIChPUEpfSU5UMzIpKGNvbXAtPmR4IDw8IGxldmVsbm8pKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5MCA9IG9wal9pbnRfY2VpbGRpdihwaS0+dHkwLCAoT1BKX0lOVDMyKShjb21wLT5keSA8PCBsZXZlbG5vKSk7CisgICAgICAgICAgICAgICAgICAgIHRyeDEgPSBvcGpfaW50X2NlaWxkaXYocGktPnR4MSwgKE9QSl9JTlQzMikoY29tcC0+ZHggPDwgbGV2ZWxubykpOworICAgICAgICAgICAgICAgICAgICB0cnkxID0gb3BqX2ludF9jZWlsZGl2KHBpLT50eTEsIChPUEpfSU5UMzIpKGNvbXAtPmR5IDw8IGxldmVsbm8pKTsKKyAgICAgICAgICAgICAgICAgICAgcnB4ID0gcmVzLT5wZHggKyBsZXZlbG5vOworICAgICAgICAgICAgICAgICAgICBycHkgPSByZXMtPnBkeSArIGxldmVsbm87CisKKyAgICAgICAgICAgICAgICAgICAgLyogVG8gYXZvaWQgZGl2aXNpb25zIGJ5IHplcm8gLyB1bmRlZmluZWQgYmVoYXZpb3VyIG9uIHNoaWZ0ICovCisgICAgICAgICAgICAgICAgICAgIC8qIGluIGJlbG93IHRlc3RzICovCisgICAgICAgICAgICAgICAgICAgIC8qIEZpeGVzIHJlYWRpbmcgaWQ6MDAwMDI2LHNpZzowOCxzcmM6MDAyNDE5LG9wOmludDMyLHBvczo2MCx2YWw6KzMyICovCisgICAgICAgICAgICAgICAgICAgIC8qIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS91Y2xvdXZhaW4vb3BlbmpwZWcvaXNzdWVzLzkzOCAqLworICAgICAgICAgICAgICAgICAgICBpZiAocnB4ID49IDMxIHx8ICgoY29tcC0+ZHggPDwgcnB4KSA+PiBycHgpICE9IGNvbXAtPmR4IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnB5ID49IDMxIHx8ICgoY29tcC0+ZHkgPDwgcnB5KSA+PiBycHkpICE9IGNvbXAtPmR5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIFNlZSBJU08tMTU0NDEuIEIuMTIuMS4zIFJlc29sdXRpb24gbGV2ZWwtcG9zaXRpb24tY29tcG9uZW50LWxheWVyIHByb2dyZXNzaW9uICovCisgICAgICAgICAgICAgICAgICAgIGlmICghKChwaS0+eSAlIChPUEpfSU5UMzIpKGNvbXAtPmR5IDw8IHJweSkgPT0gMCkgfHwgKChwaS0+eSA9PSBwaS0+dHkwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodHJ5MCA8PCBsZXZlbG5vKSAlICgxIDw8IHJweSkpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghKChwaS0+eCAlIChPUEpfSU5UMzIpKGNvbXAtPmR4IDw8IHJweCkgPT0gMCkgfHwgKChwaS0+eCA9PSBwaS0+dHgwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodHJ4MCA8PCBsZXZlbG5vKSAlICgxIDw8IHJweCkpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKChyZXMtPnB3ID09IDApIHx8IChyZXMtPnBoID09IDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICgodHJ4MCA9PSB0cngxKSB8fCAodHJ5MCA9PSB0cnkxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwcmNpID0gb3BqX2ludF9mbG9vcmRpdnBvdzIob3BqX2ludF9jZWlsZGl2KHBpLT54LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMikoY29tcC0+ZHggPDwgbGV2ZWxubykpLCAoT1BKX0lOVDMyKXJlcy0+cGR4KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBvcGpfaW50X2Zsb29yZGl2cG93Mih0cngwLCAoT1BKX0lOVDMyKXJlcy0+cGR4KTsKKyAgICAgICAgICAgICAgICAgICAgcHJjaiA9IG9wal9pbnRfZmxvb3JkaXZwb3cyKG9wal9pbnRfY2VpbGRpdihwaS0+eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfSU5UMzIpKGNvbXAtPmR5IDw8IGxldmVsbm8pKSwgKE9QSl9JTlQzMilyZXMtPnBkeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gb3BqX2ludF9mbG9vcmRpdnBvdzIodHJ5MCwgKE9QSl9JTlQzMilyZXMtPnBkeSk7CisgICAgICAgICAgICAgICAgICAgIHBpLT5wcmVjbm8gPSAoT1BKX1VJTlQzMikocHJjaSArIHByY2ogKiAoT1BKX0lOVDMyKXJlcy0+cHcpOworICAgICAgICAgICAgICAgICAgICBpZiAocGktPnByZWNubyA+PSByZXMtPnB3ICogcmVzLT5waCkgeworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChwaS0+bGF5bm8gPSBwaS0+cG9jLmxheW5vMDsgcGktPmxheW5vIDwgcGktPnBvYy5sYXlubzE7IHBpLT5sYXlubysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHBpLT5sYXlubyAqIHBpLT5zdGVwX2wgKyBwaS0+cmVzbm8gKiBwaS0+c3RlcF9yICsgcGktPmNvbXBubyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpLT5zdGVwX2MgKyBwaS0+cHJlY25vICogcGktPnN0ZXBfcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSBwaS0+aW5jbHVkZV9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2VtaXRfZXJyb3IocGksICJJbnZhbGlkIGFjY2VzcyB0byBwaS0+aW5jbHVkZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBpLT5pbmNsdWRlW2luZGV4XSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpLT5pbmNsdWRlW2luZGV4XSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorTEFCRUxfU0tJUDoKKyAgICAgICAgICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPUEpfRkFMU0U7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfcGlfbmV4dF9wY3JsKG9wal9waV9pdGVyYXRvcl90ICogcGkpCit7CisgICAgb3BqX3BpX2NvbXBfdCAqY29tcCA9IE5VTEw7CisgICAgb3BqX3BpX3Jlc29sdXRpb25fdCAqcmVzID0gTlVMTDsKKyAgICBPUEpfVUlOVDMyIGluZGV4ID0gMDsKKworICAgIGlmICghcGktPmZpcnN0KSB7CisgICAgICAgIGNvbXAgPSAmcGktPmNvbXBzW3BpLT5jb21wbm9dOworICAgICAgICBnb3RvIExBQkVMX1NLSVA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgT1BKX1VJTlQzMiBjb21wbm8sIHJlc25vOworICAgICAgICBwaS0+Zmlyc3QgPSAwOworICAgICAgICBwaS0+ZHggPSAwOworICAgICAgICBwaS0+ZHkgPSAwOworICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHBpLT5udW1jb21wczsgY29tcG5vKyspIHsKKyAgICAgICAgICAgIGNvbXAgPSAmcGktPmNvbXBzW2NvbXBub107CisgICAgICAgICAgICBmb3IgKHJlc25vID0gMDsgcmVzbm8gPCBjb21wLT5udW1yZXNvbHV0aW9uczsgcmVzbm8rKykgeworICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgZHgsIGR5OworICAgICAgICAgICAgICAgIHJlcyA9ICZjb21wLT5yZXNvbHV0aW9uc1tyZXNub107CisgICAgICAgICAgICAgICAgaWYgKHJlcy0+cGR4ICsgY29tcC0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm8gPCAzMiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY29tcC0+ZHggPD0gVUlOVF9NQVggLyAoMXUgPDwgKHJlcy0+cGR4ICsgY29tcC0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm8pKSkgeworICAgICAgICAgICAgICAgICAgICBkeCA9IGNvbXAtPmR4ICogKDF1IDw8IChyZXMtPnBkeCArIGNvbXAtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vKSk7CisgICAgICAgICAgICAgICAgICAgIHBpLT5keCA9ICFwaS0+ZHggPyBkeCA6IG9wal91aW50X21pbihwaS0+ZHgsIGR4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHJlcy0+cGR5ICsgY29tcC0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm8gPCAzMiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY29tcC0+ZHkgPD0gVUlOVF9NQVggLyAoMXUgPDwgKHJlcy0+cGR5ICsgY29tcC0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm8pKSkgeworICAgICAgICAgICAgICAgICAgICBkeSA9IGNvbXAtPmR5ICogKDF1IDw8IChyZXMtPnBkeSArIGNvbXAtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vKSk7CisgICAgICAgICAgICAgICAgICAgIHBpLT5keSA9ICFwaS0+ZHkgPyBkeSA6IG9wal91aW50X21pbihwaS0+ZHksIGR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBpLT5keCA9PSAwIHx8IHBpLT5keSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgfQorICAgIGlmICghcGktPnRwX29uKSB7CisgICAgICAgIHBpLT5wb2MudHkwID0gcGktPnR5MDsKKyAgICAgICAgcGktPnBvYy50eDAgPSBwaS0+dHgwOworICAgICAgICBwaS0+cG9jLnR5MSA9IHBpLT50eTE7CisgICAgICAgIHBpLT5wb2MudHgxID0gcGktPnR4MTsKKyAgICB9CisgICAgZm9yIChwaS0+eSA9IHBpLT5wb2MudHkwOyBwaS0+eSA8IHBpLT5wb2MudHkxOworICAgICAgICAgICAgcGktPnkgKz0gKE9QSl9JTlQzMikocGktPmR5IC0gKE9QSl9VSU5UMzIpKHBpLT55ICUgKE9QSl9JTlQzMilwaS0+ZHkpKSkgeworICAgICAgICBmb3IgKHBpLT54ID0gcGktPnBvYy50eDA7IHBpLT54IDwgcGktPnBvYy50eDE7CisgICAgICAgICAgICAgICAgcGktPnggKz0gKE9QSl9JTlQzMikocGktPmR4IC0gKE9QSl9VSU5UMzIpKHBpLT54ICUgKE9QSl9JTlQzMilwaS0+ZHgpKSkgeworICAgICAgICAgICAgZm9yIChwaS0+Y29tcG5vID0gcGktPnBvYy5jb21wbm8wOyBwaS0+Y29tcG5vIDwgcGktPnBvYy5jb21wbm8xOyBwaS0+Y29tcG5vKyspIHsKKyAgICAgICAgICAgICAgICBjb21wID0gJnBpLT5jb21wc1twaS0+Y29tcG5vXTsKKyAgICAgICAgICAgICAgICBmb3IgKHBpLT5yZXNubyA9IHBpLT5wb2MucmVzbm8wOworICAgICAgICAgICAgICAgICAgICAgICAgcGktPnJlc25vIDwgb3BqX3VpbnRfbWluKHBpLT5wb2MucmVzbm8xLCBjb21wLT5udW1yZXNvbHV0aW9ucyk7IHBpLT5yZXNubysrKSB7CisgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGV2ZWxubzsKKyAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHRyeDAsIHRyeTA7CisgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB0cngxLCB0cnkxOworICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHJweCwgcnB5OworICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcHJjaSwgcHJjajsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gJmNvbXAtPnJlc29sdXRpb25zW3BpLT5yZXNub107CisgICAgICAgICAgICAgICAgICAgIGxldmVsbm8gPSBjb21wLT5udW1yZXNvbHV0aW9ucyAtIDEgLSBwaS0+cmVzbm87CisgICAgICAgICAgICAgICAgICAgIC8qIEF2b2lkcyBkaXZpc2lvbiBieSB6ZXJvICovCisgICAgICAgICAgICAgICAgICAgIC8qIFJlbGF0ZXMgdG8gaWRfMDAwMDA0LHNpZ18wNixzcmNfMDAwNjc5LG9wX2FyaXRoOCxwb3NfNDksdmFsXy0xNyAqLworICAgICAgICAgICAgICAgICAgICAvKiBvZiAgaHR0cHM6Ly9naXRodWIuY29tL3VjbG91dmFpbi9vcGVuanBlZy9pc3N1ZXMvOTM4ICovCisgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbG5vID49IDMyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjb21wLT5keCA8PCBsZXZlbG5vKSA+PiBsZXZlbG5vKSAhPSBjb21wLT5keCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY29tcC0+ZHkgPDwgbGV2ZWxubykgPj4gbGV2ZWxubykgIT0gY29tcC0+ZHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoY29tcC0+ZHggPDwgbGV2ZWxubykgPiBJTlRfTUFYIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXAtPmR5IDw8IGxldmVsbm8pID4gSU5UX01BWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHJ4MCA9IG9wal9pbnRfY2VpbGRpdihwaS0+dHgwLCAoT1BKX0lOVDMyKShjb21wLT5keCA8PCBsZXZlbG5vKSk7CisgICAgICAgICAgICAgICAgICAgIHRyeTAgPSBvcGpfaW50X2NlaWxkaXYocGktPnR5MCwgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgbGV2ZWxubykpOworICAgICAgICAgICAgICAgICAgICB0cngxID0gb3BqX2ludF9jZWlsZGl2KHBpLT50eDEsIChPUEpfSU5UMzIpKGNvbXAtPmR4IDw8IGxldmVsbm8pKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5MSA9IG9wal9pbnRfY2VpbGRpdihwaS0+dHkxLCAoT1BKX0lOVDMyKShjb21wLT5keSA8PCBsZXZlbG5vKSk7CisgICAgICAgICAgICAgICAgICAgIHJweCA9IHJlcy0+cGR4ICsgbGV2ZWxubzsKKyAgICAgICAgICAgICAgICAgICAgcnB5ID0gcmVzLT5wZHkgKyBsZXZlbG5vOworCisgICAgICAgICAgICAgICAgICAgIC8qIFRvIGF2b2lkIGRpdmlzaW9ucyBieSB6ZXJvIC8gdW5kZWZpbmVkIGJlaGF2aW91ciBvbiBzaGlmdCAqLworICAgICAgICAgICAgICAgICAgICAvKiBpbiBiZWxvdyB0ZXN0cyAqLworICAgICAgICAgICAgICAgICAgICAvKiBSZWxhdGVzIHRvIGlkOjAwMDAxOSxzaWc6MDgsc3JjOjAwMTA5OCxvcDpmbGlwMSxwb3M6NDkgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogb2YgaHR0cHM6Ly9naXRodWIuY29tL3VjbG91dmFpbi9vcGVuanBlZy9pc3N1ZXMvOTM4ICovCisgICAgICAgICAgICAgICAgICAgIGlmIChycHggPj0gMzEgfHwgKChjb21wLT5keCA8PCBycHgpID4+IHJweCkgIT0gY29tcC0+ZHggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBycHkgPj0gMzEgfHwgKChjb21wLT5keSA8PCBycHkpID4+IHJweSkgIT0gY29tcC0+ZHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogU2VlIElTTy0xNTQ0MS4gQi4xMi4xLjQgUG9zaXRpb24tY29tcG9uZW50LXJlc29sdXRpb24gbGV2ZWwtbGF5ZXIgcHJvZ3Jlc3Npb24gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoKHBpLT55ICUgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgcnB5KSA9PSAwKSB8fCAoKHBpLT55ID09IHBpLT50eTApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0cnkwIDw8IGxldmVsbm8pICUgKDEgPDwgcnB5KSkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoKHBpLT54ICUgKE9QSl9JTlQzMikoY29tcC0+ZHggPDwgcnB4KSA9PSAwKSB8fCAoKHBpLT54ID09IHBpLT50eDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0cngwIDw8IGxldmVsbm8pICUgKDEgPDwgcnB4KSkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoKHJlcy0+cHcgPT0gMCkgfHwgKHJlcy0+cGggPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0cngwID09IHRyeDEpIHx8ICh0cnkwID09IHRyeTEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHByY2kgPSBvcGpfaW50X2Zsb29yZGl2cG93MihvcGpfaW50X2NlaWxkaXYocGktPngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKShjb21wLT5keCA8PCBsZXZlbG5vKSksIChPUEpfSU5UMzIpcmVzLT5wZHgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG9wal9pbnRfZmxvb3JkaXZwb3cyKHRyeDAsIChPUEpfSU5UMzIpcmVzLT5wZHgpOworICAgICAgICAgICAgICAgICAgICBwcmNqID0gb3BqX2ludF9mbG9vcmRpdnBvdzIob3BqX2ludF9jZWlsZGl2KHBpLT55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgbGV2ZWxubykpLCAoT1BKX0lOVDMyKXJlcy0+cGR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBvcGpfaW50X2Zsb29yZGl2cG93Mih0cnkwLCAoT1BKX0lOVDMyKXJlcy0+cGR5KTsKKyAgICAgICAgICAgICAgICAgICAgcGktPnByZWNubyA9IChPUEpfVUlOVDMyKShwcmNpICsgcHJjaiAqIChPUEpfSU5UMzIpcmVzLT5wdyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwaS0+cHJlY25vID49IHJlcy0+cHcgKiByZXMtPnBoKSB7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKHBpLT5sYXlubyA9IHBpLT5wb2MubGF5bm8wOyBwaS0+bGF5bm8gPCBwaS0+cG9jLmxheW5vMTsgcGktPmxheW5vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gcGktPmxheW5vICogcGktPnN0ZXBfbCArIHBpLT5yZXNubyAqIHBpLT5zdGVwX3IgKyBwaS0+Y29tcG5vICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGktPnN0ZXBfYyArIHBpLT5wcmVjbm8gKiBwaS0+c3RlcF9wOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IHBpLT5pbmNsdWRlX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfZW1pdF9lcnJvcihwaSwgIkludmFsaWQgYWNjZXNzIHRvIHBpLT5pbmNsdWRlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGktPmluY2x1ZGVbaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGktPmluY2x1ZGVbaW5kZXhdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CitMQUJFTF9TS0lQOgorICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9QSl9GQUxTRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal9waV9uZXh0X2Nwcmwob3BqX3BpX2l0ZXJhdG9yX3QgKiBwaSkKK3sKKyAgICBvcGpfcGlfY29tcF90ICpjb21wID0gTlVMTDsKKyAgICBvcGpfcGlfcmVzb2x1dGlvbl90ICpyZXMgPSBOVUxMOworICAgIE9QSl9VSU5UMzIgaW5kZXggPSAwOworCisgICAgaWYgKCFwaS0+Zmlyc3QpIHsKKyAgICAgICAgY29tcCA9ICZwaS0+Y29tcHNbcGktPmNvbXBub107CisgICAgICAgIGdvdG8gTEFCRUxfU0tJUDsKKyAgICB9IGVsc2UgeworICAgICAgICBwaS0+Zmlyc3QgPSAwOworICAgIH0KKworICAgIGZvciAocGktPmNvbXBubyA9IHBpLT5wb2MuY29tcG5vMDsgcGktPmNvbXBubyA8IHBpLT5wb2MuY29tcG5vMTsgcGktPmNvbXBubysrKSB7CisgICAgICAgIE9QSl9VSU5UMzIgcmVzbm87CisgICAgICAgIGNvbXAgPSAmcGktPmNvbXBzW3BpLT5jb21wbm9dOworICAgICAgICBwaS0+ZHggPSAwOworICAgICAgICBwaS0+ZHkgPSAwOworICAgICAgICBmb3IgKHJlc25vID0gMDsgcmVzbm8gPCBjb21wLT5udW1yZXNvbHV0aW9uczsgcmVzbm8rKykgeworICAgICAgICAgICAgT1BKX1VJTlQzMiBkeCwgZHk7CisgICAgICAgICAgICByZXMgPSAmY29tcC0+cmVzb2x1dGlvbnNbcmVzbm9dOworICAgICAgICAgICAgaWYgKHJlcy0+cGR4ICsgY29tcC0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm8gPCAzMiAmJgorICAgICAgICAgICAgICAgICAgICBjb21wLT5keCA8PSBVSU5UX01BWCAvICgxdSA8PCAocmVzLT5wZHggKyBjb21wLT5udW1yZXNvbHV0aW9ucyAtIDEgLSByZXNubykpKSB7CisgICAgICAgICAgICAgICAgZHggPSBjb21wLT5keCAqICgxdSA8PCAocmVzLT5wZHggKyBjb21wLT5udW1yZXNvbHV0aW9ucyAtIDEgLSByZXNubykpOworICAgICAgICAgICAgICAgIHBpLT5keCA9ICFwaS0+ZHggPyBkeCA6IG9wal91aW50X21pbihwaS0+ZHgsIGR4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXMtPnBkeSArIGNvbXAtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vIDwgMzIgJiYKKyAgICAgICAgICAgICAgICAgICAgY29tcC0+ZHkgPD0gVUlOVF9NQVggLyAoMXUgPDwgKHJlcy0+cGR5ICsgY29tcC0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm8pKSkgeworICAgICAgICAgICAgICAgIGR5ID0gY29tcC0+ZHkgKiAoMXUgPDwgKHJlcy0+cGR5ICsgY29tcC0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm8pKTsKKyAgICAgICAgICAgICAgICBwaS0+ZHkgPSAhcGktPmR5ID8gZHkgOiBvcGpfdWludF9taW4ocGktPmR5LCBkeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBpLT5keCA9PSAwIHx8IHBpLT5keSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmICghcGktPnRwX29uKSB7CisgICAgICAgICAgICBwaS0+cG9jLnR5MCA9IHBpLT50eTA7CisgICAgICAgICAgICBwaS0+cG9jLnR4MCA9IHBpLT50eDA7CisgICAgICAgICAgICBwaS0+cG9jLnR5MSA9IHBpLT50eTE7CisgICAgICAgICAgICBwaS0+cG9jLnR4MSA9IHBpLT50eDE7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChwaS0+eSA9IHBpLT5wb2MudHkwOyBwaS0+eSA8IHBpLT5wb2MudHkxOworICAgICAgICAgICAgICAgIHBpLT55ICs9IChPUEpfSU5UMzIpKHBpLT5keSAtIChPUEpfVUlOVDMyKShwaS0+eSAlIChPUEpfSU5UMzIpcGktPmR5KSkpIHsKKyAgICAgICAgICAgIGZvciAocGktPnggPSBwaS0+cG9jLnR4MDsgcGktPnggPCBwaS0+cG9jLnR4MTsKKyAgICAgICAgICAgICAgICAgICAgcGktPnggKz0gKE9QSl9JTlQzMikocGktPmR4IC0gKE9QSl9VSU5UMzIpKHBpLT54ICUgKE9QSl9JTlQzMilwaS0+ZHgpKSkgeworICAgICAgICAgICAgICAgIGZvciAocGktPnJlc25vID0gcGktPnBvYy5yZXNubzA7CisgICAgICAgICAgICAgICAgICAgICAgICBwaS0+cmVzbm8gPCBvcGpfdWludF9taW4ocGktPnBvYy5yZXNubzEsIGNvbXAtPm51bXJlc29sdXRpb25zKTsgcGktPnJlc25vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsZXZlbG5vOworICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgdHJ4MCwgdHJ5MDsKKyAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHRyeDEsIHRyeTE7CisgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcnB4LCBycHk7CisgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwcmNpLCBwcmNqOworICAgICAgICAgICAgICAgICAgICByZXMgPSAmY29tcC0+cmVzb2x1dGlvbnNbcGktPnJlc25vXTsKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWxubyA9IGNvbXAtPm51bXJlc29sdXRpb25zIC0gMSAtIHBpLT5yZXNubzsKKyAgICAgICAgICAgICAgICAgICAgLyogQXZvaWRzIGRpdmlzaW9uIGJ5IHplcm8gb24gaWRfMDAwMDA0LHNpZ18wNixzcmNfMDAwNjc5LG9wX2FyaXRoOCxwb3NfNDksdmFsXy0xNyAqLworICAgICAgICAgICAgICAgICAgICAvKiBvZiAgaHR0cHM6Ly9naXRodWIuY29tL3VjbG91dmFpbi9vcGVuanBlZy9pc3N1ZXMvOTM4ICovCisgICAgICAgICAgICAgICAgICAgIGlmIChsZXZlbG5vID49IDMyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjb21wLT5keCA8PCBsZXZlbG5vKSA+PiBsZXZlbG5vKSAhPSBjb21wLT5keCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoY29tcC0+ZHkgPDwgbGV2ZWxubykgPj4gbGV2ZWxubykgIT0gY29tcC0+ZHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoY29tcC0+ZHggPDwgbGV2ZWxubykgPiBJTlRfTUFYIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXAtPmR5IDw8IGxldmVsbm8pID4gSU5UX01BWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHJ4MCA9IG9wal9pbnRfY2VpbGRpdihwaS0+dHgwLCAoT1BKX0lOVDMyKShjb21wLT5keCA8PCBsZXZlbG5vKSk7CisgICAgICAgICAgICAgICAgICAgIHRyeTAgPSBvcGpfaW50X2NlaWxkaXYocGktPnR5MCwgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgbGV2ZWxubykpOworICAgICAgICAgICAgICAgICAgICB0cngxID0gb3BqX2ludF9jZWlsZGl2KHBpLT50eDEsIChPUEpfSU5UMzIpKGNvbXAtPmR4IDw8IGxldmVsbm8pKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5MSA9IG9wal9pbnRfY2VpbGRpdihwaS0+dHkxLCAoT1BKX0lOVDMyKShjb21wLT5keSA8PCBsZXZlbG5vKSk7CisgICAgICAgICAgICAgICAgICAgIHJweCA9IHJlcy0+cGR4ICsgbGV2ZWxubzsKKyAgICAgICAgICAgICAgICAgICAgcnB5ID0gcmVzLT5wZHkgKyBsZXZlbG5vOworCisgICAgICAgICAgICAgICAgICAgIC8qIFRvIGF2b2lkIGRpdmlzaW9ucyBieSB6ZXJvIC8gdW5kZWZpbmVkIGJlaGF2aW91ciBvbiBzaGlmdCAqLworICAgICAgICAgICAgICAgICAgICAvKiBpbiBiZWxvdyB0ZXN0cyAqLworICAgICAgICAgICAgICAgICAgICAvKiBGaXhlcyByZWFkaW5nIGlkOjAwMDAxOSxzaWc6MDgsc3JjOjAwMTA5OCxvcDpmbGlwMSxwb3M6NDkgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogb2YgaHR0cHM6Ly9naXRodWIuY29tL3VjbG91dmFpbi9vcGVuanBlZy9pc3N1ZXMvOTM4ICovCisgICAgICAgICAgICAgICAgICAgIGlmIChycHggPj0gMzEgfHwgKChjb21wLT5keCA8PCBycHgpID4+IHJweCkgIT0gY29tcC0+ZHggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBycHkgPj0gMzEgfHwgKChjb21wLT5keSA8PCBycHkpID4+IHJweSkgIT0gY29tcC0+ZHkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogU2VlIElTTy0xNTQ0MS4gQi4xMi4xLjUgQ29tcG9uZW50LXBvc2l0aW9uLXJlc29sdXRpb24gbGV2ZWwtbGF5ZXIgcHJvZ3Jlc3Npb24gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoKHBpLT55ICUgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgcnB5KSA9PSAwKSB8fCAoKHBpLT55ID09IHBpLT50eTApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0cnkwIDw8IGxldmVsbm8pICUgKDEgPDwgcnB5KSkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEoKHBpLT54ICUgKE9QSl9JTlQzMikoY29tcC0+ZHggPDwgcnB4KSA9PSAwKSB8fCAoKHBpLT54ID09IHBpLT50eDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0cngwIDw8IGxldmVsbm8pICUgKDEgPDwgcnB4KSkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoKHJlcy0+cHcgPT0gMCkgfHwgKHJlcy0+cGggPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0cngwID09IHRyeDEpIHx8ICh0cnkwID09IHRyeTEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHByY2kgPSBvcGpfaW50X2Zsb29yZGl2cG93MihvcGpfaW50X2NlaWxkaXYocGktPngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKShjb21wLT5keCA8PCBsZXZlbG5vKSksIChPUEpfSU5UMzIpcmVzLT5wZHgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG9wal9pbnRfZmxvb3JkaXZwb3cyKHRyeDAsIChPUEpfSU5UMzIpcmVzLT5wZHgpOworICAgICAgICAgICAgICAgICAgICBwcmNqID0gb3BqX2ludF9mbG9vcmRpdnBvdzIob3BqX2ludF9jZWlsZGl2KHBpLT55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMikoY29tcC0+ZHkgPDwgbGV2ZWxubykpLCAoT1BKX0lOVDMyKXJlcy0+cGR5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBvcGpfaW50X2Zsb29yZGl2cG93Mih0cnkwLCAoT1BKX0lOVDMyKXJlcy0+cGR5KTsKKyAgICAgICAgICAgICAgICAgICAgcGktPnByZWNubyA9IChPUEpfVUlOVDMyKShwcmNpICsgcHJjaiAqIChPUEpfSU5UMzIpcmVzLT5wdyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwaS0+cHJlY25vID49IHJlcy0+cHcgKiByZXMtPnBoKSB7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKHBpLT5sYXlubyA9IHBpLT5wb2MubGF5bm8wOyBwaS0+bGF5bm8gPCBwaS0+cG9jLmxheW5vMTsgcGktPmxheW5vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gcGktPmxheW5vICogcGktPnN0ZXBfbCArIHBpLT5yZXNubyAqIHBpLT5zdGVwX3IgKyBwaS0+Y29tcG5vICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGktPnN0ZXBfYyArIHBpLT5wcmVjbm8gKiBwaS0+c3RlcF9wOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IHBpLT5pbmNsdWRlX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfZW1pdF9lcnJvcihwaSwgIkludmFsaWQgYWNjZXNzIHRvIHBpLT5pbmNsdWRlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGktPmluY2x1ZGVbaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGktPmluY2x1ZGVbaW5kZXhdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CitMQUJFTF9TS0lQOgorICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9QSl9GQUxTRTsKK30KKworc3RhdGljIHZvaWQgb3BqX2dldF9lbmNvZGluZ19wYXJhbWV0ZXJzKGNvbnN0IG9wal9pbWFnZV90ICpwX2ltYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wal9jcF90ICpwX2NwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdGlsZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlbm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90eDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90eDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90eTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogcF90eTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICAqIHBfdHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAgKiBwX3R5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgICogcF90eTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZHhfbWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2R5X21pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9tYXhfcHJlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9tYXhfcmVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiogcF9yZXNvbHV0aW9ucyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfbWF4X3JlcykKIHsKLQkvKiBsb29wKi8KLQlPUEpfVUlOVDMyIGNvbXBubywgcmVzbm87CisgICAgLyogbG9vcCAqLworICAgIE9QSl9VSU5UMzIgIGNvbXBubywgcmVzbm87CisgICAgLyogcG9pbnRlcnMgKi8KKyAgICBjb25zdCBvcGpfdGNwX3QgKmxfdGNwID0gMDA7CisgICAgY29uc3Qgb3BqX3RjY3BfdCAqIGxfdGNjcCA9IDAwOworICAgIGNvbnN0IG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gMDA7CiAKLQkvKiBwb2ludGVycyovCi0JY29uc3Qgb3BqX3RjcF90ICp0Y3AgPSAwMDsKLQljb25zdCBvcGpfdGNjcF90ICogbF90Y2NwID0gMDA7Ci0JY29uc3Qgb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1nX2NvbXAgPSAwMDsKKyAgICAvKiBwb3NpdGlvbiBpbiB4IGFuZCB5IG9mIHRpbGUgKi8KKyAgICBPUEpfVUlOVDMyIHAsIHE7CiAKLQkvKiB0byBzdG9yZSBsX2R4LCBsX2R5LCB3IGFuZCBoIGZvciBlYWNoIHJlc29sdXRpb24gYW5kIGNvbXBvbmVudC4qLwotCU9QSl9VSU5UMzIgKiBsUmVzb2x1dGlvblB0cjsKKyAgICAvKiBwcmVjb25kaXRpb25zICovCisgICAgYXNzZXJ0KHBfY3AgIT0gMDApOworICAgIGFzc2VydChwX2ltYWdlICE9IDAwKTsKKyAgICBhc3NlcnQocF90aWxlbm8gPCBwX2NwLT50dyAqIHBfY3AtPnRoKTsKIAotCS8qIHBvc2l0aW9uIGluIHggYW5kIHkgb2YgdGlsZSovCi0JT1BKX1VJTlQzMiBwLCBxOworICAgIC8qIGluaXRpYWxpemF0aW9ucyAqLworICAgIGxfdGNwID0gJnBfY3AtPnRjcHMgW3BfdGlsZW5vXTsKKyAgICBsX2ltZ19jb21wID0gcF9pbWFnZS0+Y29tcHM7CisgICAgbF90Y2NwID0gbF90Y3AtPnRjY3BzOwogCi0JLyogbm9uLWNvcnJlY3RlZCAoaW4gcmVnYXJkIHRvIGltYWdlIG9mZnNldCkgdGlsZSBvZmZzZXQgKi8KLQlPUEpfVUlOVDMyIGxfdHgwLCBsX3R5MDsKKyAgICAvKiBoZXJlIGNhbGN1bGF0aW9uIG9mIHR4MCwgdHgxLCB0eTAsIHR5MSwgbWF4cHJlYywgZHggYW5kIGR5ICovCisgICAgcCA9IHBfdGlsZW5vICUgcF9jcC0+dHc7CisgICAgcSA9IHBfdGlsZW5vIC8gcF9jcC0+dHc7CiAKLQkvKiBwcmVjb25kaXRpb25zIGluIGRlYnVnKi8KLQlhc3NlcnQocF9jcCAhPSAwMCk7Ci0JYXNzZXJ0KHBfaW1hZ2UgIT0gMDApOwotCWFzc2VydCh0aWxlbm8gPCBwX2NwLT50dyAqIHBfY3AtPnRoKTsKKyAgICAvKiBmaW5kIGV4dGVudCBvZiB0aWxlICovCisgICAgKnBfdHgwID0gb3BqX2ludF9tYXgoKE9QSl9JTlQzMikocF9jcC0+dHgwICsgcCAqIHBfY3AtPnRkeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMilwX2ltYWdlLT54MCk7CisgICAgKnBfdHgxID0gb3BqX2ludF9taW4oKE9QSl9JTlQzMikocF9jcC0+dHgwICsgKHAgKyAxKSAqIHBfY3AtPnRkeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMilwX2ltYWdlLT54MSk7CisgICAgKnBfdHkwID0gb3BqX2ludF9tYXgoKE9QSl9JTlQzMikocF9jcC0+dHkwICsgcSAqIHBfY3AtPnRkeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMilwX2ltYWdlLT55MCk7CisgICAgKnBfdHkxID0gb3BqX2ludF9taW4oKE9QSl9JTlQzMikocF9jcC0+dHkwICsgKHEgKyAxKSAqIHBfY3AtPnRkeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMilwX2ltYWdlLT55MSk7CiAKLQkvKiBpbml0aWFsaXphdGlvbnMqLwotCXRjcCA9ICZwX2NwLT50Y3BzIFt0aWxlbm9dOwotCWxfdGNjcCA9IHRjcC0+dGNjcHM7Ci0JbF9pbWdfY29tcCA9IHBfaW1hZ2UtPmNvbXBzOworICAgIC8qIG1heCBwcmVjaXNpb24gaXMgMCAoY2FuIG9ubHkgZ3JvdykgKi8KKyAgICAqcF9tYXhfcHJlYyA9IDA7CisgICAgKnBfbWF4X3JlcyA9IDA7CiAKLQkvKiBwb3NpdGlvbiBpbiB4IGFuZCB5IG9mIHRpbGUqLwotCXAgPSB0aWxlbm8gJSBwX2NwLT50dzsKLQlxID0gdGlsZW5vIC8gcF9jcC0+dHc7CisgICAgLyogdGFrZSB0aGUgbGFyZ2VzdCB2YWx1ZSBmb3IgZHhfbWluIGFuZCBkeV9taW4gKi8KKyAgICAqcF9keF9taW4gPSAweDdmZmZmZmZmOworICAgICpwX2R5X21pbiAgPSAweDdmZmZmZmZmOwogCi0JLyogaGVyZSBjYWxjdWxhdGlvbiBvZiB0eDAsIHR4MSwgdHkwLCB0eTEsIG1heHByZWMsIGxfZHggYW5kIGxfZHkgKi8KLQlsX3R4MCA9IHBfY3AtPnR4MCArIHAgKiBwX2NwLT50ZHg7IC8qIGNhbid0IGJlIGdyZWF0ZXIgdGhhbiBwX2ltYWdlLT54MSBzbyB3b24ndCBvdmVyZmxvdyAqLwotCSpwX3R4MCA9IChPUEpfSU5UMzIpb3BqX3VpbnRfbWF4KGxfdHgwLCBwX2ltYWdlLT54MCk7Ci0JKnBfdHgxID0gKE9QSl9JTlQzMilvcGpfdWludF9taW4ob3BqX3VpbnRfYWRkcyhsX3R4MCwgcF9jcC0+dGR4KSwgcF9pbWFnZS0+eDEpOwotCWxfdHkwID0gcF9jcC0+dHkwICsgcSAqIHBfY3AtPnRkeTsgLyogY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIHBfaW1hZ2UtPnkxIHNvIHdvbid0IG92ZXJmbG93ICovCi0JKnBfdHkwID0gKE9QSl9JTlQzMilvcGpfdWludF9tYXgobF90eTAsIHBfaW1hZ2UtPnkwKTsKLQkqcF90eTEgPSAoT1BKX0lOVDMyKW9wal91aW50X21pbihvcGpfdWludF9hZGRzKGxfdHkwLCBwX2NwLT50ZHkpLCBwX2ltYWdlLT55MSk7CisgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBwX2ltYWdlLT5udW1jb21wczsgKytjb21wbm8pIHsKKyAgICAgICAgLyogYXJpdGhtZXRpYyB2YXJpYWJsZXMgdG8gY2FsY3VsYXRlICovCisgICAgICAgIE9QSl9VSU5UMzIgbF9sZXZlbF9ubzsKKyAgICAgICAgT1BKX0lOVDMyIGxfcngwLCBsX3J5MCwgbF9yeDEsIGxfcnkxOworICAgICAgICBPUEpfSU5UMzIgbF9weDAsIGxfcHkwLCBsX3B4MSwgcHkxOworICAgICAgICBPUEpfVUlOVDMyIGxfcGR4LCBsX3BkeTsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3B3LCBsX3BoOworICAgICAgICBPUEpfVUlOVDMyIGxfcHJvZHVjdDsKKyAgICAgICAgT1BKX0lOVDMyIGxfdGN4MCwgbF90Y3kwLCBsX3RjeDEsIGxfdGN5MTsKIAotCS8qIG1heCBwcmVjaXNpb24gYW5kIHJlc29sdXRpb24gaXMgMCAoY2FuIG9ubHkgZ3JvdykqLwotCSpwX21heF9wcmVjID0gMDsKLQkqcF9tYXhfcmVzID0gMDsKKyAgICAgICAgbF90Y3gwID0gb3BqX2ludF9jZWlsZGl2KCpwX3R4MCwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keCk7CisgICAgICAgIGxfdGN5MCA9IG9wal9pbnRfY2VpbGRpdigqcF90eTAsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHkpOworICAgICAgICBsX3RjeDEgPSBvcGpfaW50X2NlaWxkaXYoKnBfdHgxLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR4KTsKKyAgICAgICAgbF90Y3kxID0gb3BqX2ludF9jZWlsZGl2KCpwX3R5MSwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keSk7CiAKLQkvKiB0YWtlIHRoZSBsYXJnZXN0IHZhbHVlIGZvciBkeF9taW4gYW5kIGR5X21pbiovCi0JKnBfZHhfbWluID0gMHg3ZmZmZmZmZjsKLQkqcF9keV9taW4gPSAweDdmZmZmZmZmOworICAgICAgICBpZiAobF90Y2NwLT5udW1yZXNvbHV0aW9ucyA+ICpwX21heF9yZXMpIHsKKyAgICAgICAgICAgICpwX21heF9yZXMgPSBsX3RjY3AtPm51bXJlc29sdXRpb25zOworICAgICAgICB9CiAKLQlmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHBfaW1hZ2UtPm51bWNvbXBzOyArK2NvbXBubykgewotCQkvKiBhcml0bWV0aWMgdmFyaWFibGVzIHRvIGNhbGN1bGF0ZSovCi0JCU9QSl9VSU5UMzIgbF9sZXZlbF9ubzsKLQkJT1BKX0lOVDMyIGxfcngwLCBsX3J5MCwgbF9yeDEsIGxfcnkxOwotCQlPUEpfSU5UMzIgbF9weDAsIGxfcHkwLCBsX3B4MSwgcHkxOwotCQlPUEpfVUlOVDMyIGxfcHJvZHVjdDsKLQkJT1BKX0lOVDMyIGxfdGN4MCwgbF90Y3kwLCBsX3RjeDEsIGxfdGN5MTsKLQkJT1BKX1VJTlQzMiBsX3BkeCwgbF9wZHkgLCBsX3B3ICwgbF9waDsKKyAgICAgICAgLyogdXNlIGN1c3RvbSBzaXplIGZvciBwcmVjaW5jdHMgKi8KKyAgICAgICAgZm9yIChyZXNubyA9IDA7IHJlc25vIDwgbF90Y2NwLT5udW1yZXNvbHV0aW9uczsgKytyZXNubykgeworICAgICAgICAgICAgT1BKX1VJTlQzMiBsX2R4LCBsX2R5OwogCi0JCWxSZXNvbHV0aW9uUHRyID0gcF9yZXNvbHV0aW9uc1tjb21wbm9dOworICAgICAgICAgICAgLyogcHJlY2luY3Qgd2lkdGggYW5kIGhlaWdodCAqLworICAgICAgICAgICAgbF9wZHggPSBsX3RjY3AtPnByY3dbcmVzbm9dOworICAgICAgICAgICAgbF9wZHkgPSBsX3RjY3AtPnByY2hbcmVzbm9dOwogCi0JCWxfdGN4MCA9IG9wal9pbnRfY2VpbGRpdigqcF90eDAsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHgpOwotCQlsX3RjeTAgPSBvcGpfaW50X2NlaWxkaXYoKnBfdHkwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR5KTsKLQkJbF90Y3gxID0gb3BqX2ludF9jZWlsZGl2KCpwX3R4MSwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keCk7Ci0JCWxfdGN5MSA9IG9wal9pbnRfY2VpbGRpdigqcF90eTEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHkpOworICAgICAgICAgICAgbF9keCA9IGxfaW1nX2NvbXAtPmR4ICogKDF1IDw8IChsX3BkeCArIGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm8pKTsKKyAgICAgICAgICAgIGxfZHkgPSBsX2ltZ19jb21wLT5keSAqICgxdSA8PCAobF9wZHkgKyBsX3RjY3AtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vKSk7CiAKLQkJaWYgKGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgPiAqcF9tYXhfcmVzKSB7Ci0JCQkqcF9tYXhfcmVzID0gbF90Y2NwLT5udW1yZXNvbHV0aW9uczsKLQkJfQorICAgICAgICAgICAgLyogdGFrZSB0aGUgbWluaW11bSBzaXplIGZvciBkeCBmb3IgZWFjaCBjb21wIGFuZCByZXNvbHV0aW9uICovCisgICAgICAgICAgICAqcF9keF9taW4gPSBvcGpfdWludF9taW4oKnBfZHhfbWluLCBsX2R4KTsKKyAgICAgICAgICAgICpwX2R5X21pbiA9IG9wal91aW50X21pbigqcF9keV9taW4sIGxfZHkpOwogCi0JCS8qIHVzZSBjdXN0b20gc2l6ZSBmb3IgcHJlY2luY3RzKi8KLQkJbF9sZXZlbF9ubyA9IGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgLSAxOwotCQlmb3IgKHJlc25vID0gMDsgcmVzbm8gPCBsX3RjY3AtPm51bXJlc29sdXRpb25zOyArK3Jlc25vKSB7Ci0JCQlPUEpfVUlOVDMyIGxfZHgsIGxfZHk7CisgICAgICAgICAgICAvKiB2YXJpb3VzIGNhbGN1bGF0aW9ucyBvZiBleHRlbnRzICovCisgICAgICAgICAgICBsX2xldmVsX25vID0gbF90Y2NwLT5udW1yZXNvbHV0aW9ucyAtIDEgLSByZXNubzsKIAotCQkJLyogcHJlY2luY3Qgd2lkdGggYW5kIGhlaWdodCovCi0JCQlsX3BkeCA9IGxfdGNjcC0+cHJjd1tyZXNub107Ci0JCQlsX3BkeSA9IGxfdGNjcC0+cHJjaFtyZXNub107Ci0JCQkqbFJlc29sdXRpb25QdHIrKyA9IGxfcGR4OwotCQkJKmxSZXNvbHV0aW9uUHRyKysgPSBsX3BkeTsKLQkJCWxfZHggPSBsX2ltZ19jb21wLT5keCAqICgxdSA8PCAobF9wZHggKyBsX2xldmVsX25vKSk7Ci0JCQlsX2R5ID0gbF9pbWdfY29tcC0+ZHkgKiAoMXUgPDwgKGxfcGR5ICsgbF9sZXZlbF9ubykpOwotCQkJLyogdGFrZSB0aGUgbWluaW11bSBzaXplIGZvciBsX2R4IGZvciBlYWNoIGNvbXAgYW5kIHJlc29sdXRpb24qLwotCQkJKnBfZHhfbWluID0gKE9QSl9VSU5UMzIpb3BqX2ludF9taW4oKE9QSl9JTlQzMikqcF9keF9taW4sIChPUEpfSU5UMzIpbF9keCk7Ci0JCQkqcF9keV9taW4gPSAoT1BKX1VJTlQzMilvcGpfaW50X21pbigoT1BKX0lOVDMyKSpwX2R5X21pbiwgKE9QSl9JTlQzMilsX2R5KTsKKyAgICAgICAgICAgIGxfcngwID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RjeDAsIChPUEpfSU5UMzIpbF9sZXZlbF9ubyk7CisgICAgICAgICAgICBsX3J5MCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90Y3kwLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOworICAgICAgICAgICAgbF9yeDEgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGN4MSwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKKyAgICAgICAgICAgIGxfcnkxID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RjeTEsIChPUEpfSU5UMzIpbF9sZXZlbF9ubyk7CiAKLQkJCS8qIHZhcmlvdXMgY2FsY3VsYXRpb25zIG9mIGV4dGVudHMqLwotCQkJbF9yeDAgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGN4MCwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKLQkJCWxfcnkwID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RjeTAsIChPUEpfSU5UMzIpbF9sZXZlbF9ubyk7Ci0JCQlsX3J4MSA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90Y3gxLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOwotCQkJbF9yeTEgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGN5MSwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKLQkJCWxfcHgwID0gb3BqX2ludF9mbG9vcmRpdnBvdzIobF9yeDAsIChPUEpfSU5UMzIpbF9wZHgpIDw8IGxfcGR4OwotCQkJbF9weTAgPSBvcGpfaW50X2Zsb29yZGl2cG93MihsX3J5MCwgKE9QSl9JTlQzMilsX3BkeSkgPDwgbF9wZHk7Ci0JCQlsX3B4MSA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF9yeDEsIChPUEpfSU5UMzIpbF9wZHgpIDw8IGxfcGR4OwotCQkJcHkxID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3J5MSwgKE9QSl9JTlQzMilsX3BkeSkgPDwgbF9wZHk7Ci0JCQlsX3B3ID0gKGxfcngwPT1sX3J4MSk/MDooT1BKX1VJTlQzMikoKGxfcHgxIC0gbF9weDApID4+IGxfcGR4KTsKLQkJCWxfcGggPSAobF9yeTA9PWxfcnkxKT8wOihPUEpfVUlOVDMyKSgocHkxIC0gbF9weTApID4+IGxfcGR5KTsKLQkJCSpsUmVzb2x1dGlvblB0cisrID0gbF9wdzsKLQkJCSpsUmVzb2x1dGlvblB0cisrID0gbF9waDsKLQkJCWxfcHJvZHVjdCA9IGxfcHcgKiBsX3BoOwotCQkJCisgICAgICAgICAgICBsX3B4MCA9IG9wal9pbnRfZmxvb3JkaXZwb3cyKGxfcngwLCAoT1BKX0lOVDMyKWxfcGR4KSA8PCBsX3BkeDsKKyAgICAgICAgICAgIGxfcHkwID0gb3BqX2ludF9mbG9vcmRpdnBvdzIobF9yeTAsIChPUEpfSU5UMzIpbF9wZHkpIDw8IGxfcGR5OworICAgICAgICAgICAgbF9weDEgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfcngxLCAoT1BKX0lOVDMyKWxfcGR4KSA8PCBsX3BkeDsKKworICAgICAgICAgICAgcHkxID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3J5MSwgKE9QSl9JTlQzMilsX3BkeSkgPDwgbF9wZHk7CisKKyAgICAgICAgICAgIGxfcHcgPSAobF9yeDAgPT0gbF9yeDEpID8gMCA6IChPUEpfVUlOVDMyKSgobF9weDEgLSBsX3B4MCkgPj4gbF9wZHgpOworICAgICAgICAgICAgbF9waCA9IChsX3J5MCA9PSBsX3J5MSkgPyAwIDogKE9QSl9VSU5UMzIpKChweTEgLSBsX3B5MCkgPj4gbF9wZHkpOworCisgICAgICAgICAgICBsX3Byb2R1Y3QgPSBsX3B3ICogbF9waDsKKworICAgICAgICAgICAgLyogdXBkYXRlIHByZWNpc2lvbiAqLworICAgICAgICAgICAgaWYgKGxfcHJvZHVjdCA+ICpwX21heF9wcmVjKSB7CisgICAgICAgICAgICAgICAgKnBfbWF4X3ByZWMgPSBsX3Byb2R1Y3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKytsX2ltZ19jb21wOworICAgICAgICArK2xfdGNjcDsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQgb3BqX2dldF9hbGxfZW5jb2RpbmdfcGFyYW1ldGVycyhjb25zdCBvcGpfaW1hZ2VfdCAqcF9pbWFnZSwKKyAgICAgICAgY29uc3Qgb3BqX2NwX3QgKnBfY3AsCisgICAgICAgIE9QSl9VSU5UMzIgdGlsZW5vLAorICAgICAgICBPUEpfSU5UMzIgKiBwX3R4MCwKKyAgICAgICAgT1BKX0lOVDMyICogcF90eDEsCisgICAgICAgIE9QSl9JTlQzMiAqIHBfdHkwLAorICAgICAgICBPUEpfSU5UMzIgKiBwX3R5MSwKKyAgICAgICAgT1BKX1VJTlQzMiAqIHBfZHhfbWluLAorICAgICAgICBPUEpfVUlOVDMyICogcF9keV9taW4sCisgICAgICAgIE9QSl9VSU5UMzIgKiBwX21heF9wcmVjLAorICAgICAgICBPUEpfVUlOVDMyICogcF9tYXhfcmVzLAorICAgICAgICBPUEpfVUlOVDMyICoqIHBfcmVzb2x1dGlvbnMpCit7CisgICAgLyogbG9vcCovCisgICAgT1BKX1VJTlQzMiBjb21wbm8sIHJlc25vOworCisgICAgLyogcG9pbnRlcnMqLworICAgIGNvbnN0IG9wal90Y3BfdCAqdGNwID0gMDA7CisgICAgY29uc3Qgb3BqX3RjY3BfdCAqIGxfdGNjcCA9IDAwOworICAgIGNvbnN0IG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gMDA7CisKKyAgICAvKiB0byBzdG9yZSBsX2R4LCBsX2R5LCB3IGFuZCBoIGZvciBlYWNoIHJlc29sdXRpb24gYW5kIGNvbXBvbmVudC4qLworICAgIE9QSl9VSU5UMzIgKiBsUmVzb2x1dGlvblB0cjsKKworICAgIC8qIHBvc2l0aW9uIGluIHggYW5kIHkgb2YgdGlsZSovCisgICAgT1BKX1VJTlQzMiBwLCBxOworCisgICAgLyogbm9uLWNvcnJlY3RlZCAoaW4gcmVnYXJkIHRvIGltYWdlIG9mZnNldCkgdGlsZSBvZmZzZXQgKi8KKyAgICBPUEpfVUlOVDMyIGxfdHgwLCBsX3R5MDsKKworICAgIC8qIHByZWNvbmRpdGlvbnMgaW4gZGVidWcqLworICAgIGFzc2VydChwX2NwICE9IDAwKTsKKyAgICBhc3NlcnQocF9pbWFnZSAhPSAwMCk7CisgICAgYXNzZXJ0KHRpbGVubyA8IHBfY3AtPnR3ICogcF9jcC0+dGgpOworCisgICAgLyogaW5pdGlhbGl6YXRpb25zKi8KKyAgICB0Y3AgPSAmcF9jcC0+dGNwcyBbdGlsZW5vXTsKKyAgICBsX3RjY3AgPSB0Y3AtPnRjY3BzOworICAgIGxfaW1nX2NvbXAgPSBwX2ltYWdlLT5jb21wczsKKworICAgIC8qIHBvc2l0aW9uIGluIHggYW5kIHkgb2YgdGlsZSovCisgICAgcCA9IHRpbGVubyAlIHBfY3AtPnR3OworICAgIHEgPSB0aWxlbm8gLyBwX2NwLT50dzsKKworICAgIC8qIGhlcmUgY2FsY3VsYXRpb24gb2YgdHgwLCB0eDEsIHR5MCwgdHkxLCBtYXhwcmVjLCBsX2R4IGFuZCBsX2R5ICovCisgICAgbF90eDAgPSBwX2NwLT50eDAgKyBwICoKKyAgICAgICAgICAgIHBfY3AtPnRkeDsgLyogY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIHBfaW1hZ2UtPngxIHNvIHdvbid0IG92ZXJmbG93ICovCisgICAgKnBfdHgwID0gKE9QSl9JTlQzMilvcGpfdWludF9tYXgobF90eDAsIHBfaW1hZ2UtPngwKTsKKyAgICAqcF90eDEgPSAoT1BKX0lOVDMyKW9wal91aW50X21pbihvcGpfdWludF9hZGRzKGxfdHgwLCBwX2NwLT50ZHgpLCBwX2ltYWdlLT54MSk7CisgICAgbF90eTAgPSBwX2NwLT50eTAgKyBxICoKKyAgICAgICAgICAgIHBfY3AtPnRkeTsgLyogY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIHBfaW1hZ2UtPnkxIHNvIHdvbid0IG92ZXJmbG93ICovCisgICAgKnBfdHkwID0gKE9QSl9JTlQzMilvcGpfdWludF9tYXgobF90eTAsIHBfaW1hZ2UtPnkwKTsKKyAgICAqcF90eTEgPSAoT1BKX0lOVDMyKW9wal91aW50X21pbihvcGpfdWludF9hZGRzKGxfdHkwLCBwX2NwLT50ZHkpLCBwX2ltYWdlLT55MSk7CisKKyAgICAvKiBtYXggcHJlY2lzaW9uIGFuZCByZXNvbHV0aW9uIGlzIDAgKGNhbiBvbmx5IGdyb3cpKi8KKyAgICAqcF9tYXhfcHJlYyA9IDA7CisgICAgKnBfbWF4X3JlcyA9IDA7CisKKyAgICAvKiB0YWtlIHRoZSBsYXJnZXN0IHZhbHVlIGZvciBkeF9taW4gYW5kIGR5X21pbiovCisgICAgKnBfZHhfbWluID0gMHg3ZmZmZmZmZjsKKyAgICAqcF9keV9taW4gPSAweDdmZmZmZmZmOworCisgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBwX2ltYWdlLT5udW1jb21wczsgKytjb21wbm8pIHsKKyAgICAgICAgLyogYXJpdG1ldGljIHZhcmlhYmxlcyB0byBjYWxjdWxhdGUqLworICAgICAgICBPUEpfVUlOVDMyIGxfbGV2ZWxfbm87CisgICAgICAgIE9QSl9JTlQzMiBsX3J4MCwgbF9yeTAsIGxfcngxLCBsX3J5MTsKKyAgICAgICAgT1BKX0lOVDMyIGxfcHgwLCBsX3B5MCwgbF9weDEsIHB5MTsKKyAgICAgICAgT1BKX1VJTlQzMiBsX3Byb2R1Y3Q7CisgICAgICAgIE9QSl9JTlQzMiBsX3RjeDAsIGxfdGN5MCwgbF90Y3gxLCBsX3RjeTE7CisgICAgICAgIE9QSl9VSU5UMzIgbF9wZHgsIGxfcGR5LCBsX3B3LCBsX3BoOworCisgICAgICAgIGxSZXNvbHV0aW9uUHRyID0gcF9yZXNvbHV0aW9uc1tjb21wbm9dOworCisgICAgICAgIGxfdGN4MCA9IG9wal9pbnRfY2VpbGRpdigqcF90eDAsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHgpOworICAgICAgICBsX3RjeTAgPSBvcGpfaW50X2NlaWxkaXYoKnBfdHkwLCAoT1BKX0lOVDMyKWxfaW1nX2NvbXAtPmR5KTsKKyAgICAgICAgbF90Y3gxID0gb3BqX2ludF9jZWlsZGl2KCpwX3R4MSwgKE9QSl9JTlQzMilsX2ltZ19jb21wLT5keCk7CisgICAgICAgIGxfdGN5MSA9IG9wal9pbnRfY2VpbGRpdigqcF90eTEsIChPUEpfSU5UMzIpbF9pbWdfY29tcC0+ZHkpOworCisgICAgICAgIGlmIChsX3RjY3AtPm51bXJlc29sdXRpb25zID4gKnBfbWF4X3JlcykgeworICAgICAgICAgICAgKnBfbWF4X3JlcyA9IGxfdGNjcC0+bnVtcmVzb2x1dGlvbnM7CisgICAgICAgIH0KKworICAgICAgICAvKiB1c2UgY3VzdG9tIHNpemUgZm9yIHByZWNpbmN0cyovCisgICAgICAgIGxfbGV2ZWxfbm8gPSBsX3RjY3AtPm51bXJlc29sdXRpb25zOworICAgICAgICBmb3IgKHJlc25vID0gMDsgcmVzbm8gPCBsX3RjY3AtPm51bXJlc29sdXRpb25zOyArK3Jlc25vKSB7CisgICAgICAgICAgICBPUEpfVUlOVDMyIGxfZHgsIGxfZHk7CisKKyAgICAgICAgICAgIC0tbF9sZXZlbF9ubzsKKworICAgICAgICAgICAgLyogcHJlY2luY3Qgd2lkdGggYW5kIGhlaWdodCovCisgICAgICAgICAgICBsX3BkeCA9IGxfdGNjcC0+cHJjd1tyZXNub107CisgICAgICAgICAgICBsX3BkeSA9IGxfdGNjcC0+cHJjaFtyZXNub107CisgICAgICAgICAgICAqbFJlc29sdXRpb25QdHIrKyA9IGxfcGR4OworICAgICAgICAgICAgKmxSZXNvbHV0aW9uUHRyKysgPSBsX3BkeTsKKyAgICAgICAgICAgIGlmIChsX3BkeCArIGxfbGV2ZWxfbm8gPCAzMiAmJgorICAgICAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT5keCA8PSBVSU5UX01BWCAvICgxdSA8PCAobF9wZHggKyBsX2xldmVsX25vKSkpIHsKKyAgICAgICAgICAgICAgICBsX2R4ID0gbF9pbWdfY29tcC0+ZHggKiAoMXUgPDwgKGxfcGR4ICsgbF9sZXZlbF9ubykpOworICAgICAgICAgICAgICAgIC8qIHRha2UgdGhlIG1pbmltdW0gc2l6ZSBmb3IgbF9keCBmb3IgZWFjaCBjb21wIGFuZCByZXNvbHV0aW9uKi8KKyAgICAgICAgICAgICAgICAqcF9keF9taW4gPSAoT1BKX1VJTlQzMilvcGpfaW50X21pbigoT1BKX0lOVDMyKSAqIHBfZHhfbWluLCAoT1BKX0lOVDMyKWxfZHgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxfcGR5ICsgbF9sZXZlbF9ubyA8IDMyICYmCisgICAgICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPmR5IDw9IFVJTlRfTUFYIC8gKDF1IDw8IChsX3BkeSArIGxfbGV2ZWxfbm8pKSkgeworICAgICAgICAgICAgICAgIGxfZHkgPSBsX2ltZ19jb21wLT5keSAqICgxdSA8PCAobF9wZHkgKyBsX2xldmVsX25vKSk7CisgICAgICAgICAgICAgICAgKnBfZHlfbWluID0gKE9QSl9VSU5UMzIpb3BqX2ludF9taW4oKE9QSl9JTlQzMikgKiBwX2R5X21pbiwgKE9QSl9JTlQzMilsX2R5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogdmFyaW91cyBjYWxjdWxhdGlvbnMgb2YgZXh0ZW50cyovCisgICAgICAgICAgICBsX3J4MCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90Y3gwLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOworICAgICAgICAgICAgbF9yeTAgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGN5MCwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKKyAgICAgICAgICAgIGxfcngxID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RjeDEsIChPUEpfSU5UMzIpbF9sZXZlbF9ubyk7CisgICAgICAgICAgICBsX3J5MSA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90Y3kxLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOworICAgICAgICAgICAgbF9weDAgPSBvcGpfaW50X2Zsb29yZGl2cG93MihsX3J4MCwgKE9QSl9JTlQzMilsX3BkeCkgPDwgbF9wZHg7CisgICAgICAgICAgICBsX3B5MCA9IG9wal9pbnRfZmxvb3JkaXZwb3cyKGxfcnkwLCAoT1BKX0lOVDMyKWxfcGR5KSA8PCBsX3BkeTsKKyAgICAgICAgICAgIGxfcHgxID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3J4MSwgKE9QSl9JTlQzMilsX3BkeCkgPDwgbF9wZHg7CisgICAgICAgICAgICBweTEgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfcnkxLCAoT1BKX0lOVDMyKWxfcGR5KSA8PCBsX3BkeTsKKyAgICAgICAgICAgIGxfcHcgPSAobF9yeDAgPT0gbF9yeDEpID8gMCA6IChPUEpfVUlOVDMyKSgobF9weDEgLSBsX3B4MCkgPj4gbF9wZHgpOworICAgICAgICAgICAgbF9waCA9IChsX3J5MCA9PSBsX3J5MSkgPyAwIDogKE9QSl9VSU5UMzIpKChweTEgLSBsX3B5MCkgPj4gbF9wZHkpOworICAgICAgICAgICAgKmxSZXNvbHV0aW9uUHRyKysgPSBsX3B3OworICAgICAgICAgICAgKmxSZXNvbHV0aW9uUHRyKysgPSBsX3BoOworICAgICAgICAgICAgbF9wcm9kdWN0ID0gbF9wdyAqIGxfcGg7CisKICAgICAgICAgICAgIC8qIHVwZGF0ZSBwcmVjaXNpb24qLwotCQkJaWYgKGxfcHJvZHVjdCA+ICpwX21heF9wcmVjKSB7Ci0JCQkJKnBfbWF4X3ByZWMgPSBsX3Byb2R1Y3Q7Ci0JCQl9CisgICAgICAgICAgICBpZiAobF9wcm9kdWN0ID4gKnBfbWF4X3ByZWMpIHsKKyAgICAgICAgICAgICAgICAqcF9tYXhfcHJlYyA9IGxfcHJvZHVjdDsKKyAgICAgICAgICAgIH0KIAotCQkJLS1sX2xldmVsX25vOwotCQl9Ci0JCSsrbF90Y2NwOwotCQkrK2xfaW1nX2NvbXA7Ci0JfQorICAgICAgICB9CisgICAgICAgICsrbF90Y2NwOworICAgICAgICArK2xfaW1nX2NvbXA7CisgICAgfQogfQogCi1zdGF0aWMgb3BqX3BpX2l0ZXJhdG9yX3QgKiBvcGpfcGlfY3JlYXRlKAljb25zdCBvcGpfaW1hZ2VfdCAqaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcGpfY3BfdCAqY3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRpbGVubyApCitzdGF0aWMgb3BqX3BpX2l0ZXJhdG9yX3QgKiBvcGpfcGlfY3JlYXRlKGNvbnN0IG9wal9pbWFnZV90ICppbWFnZSwKKyAgICAgICAgY29uc3Qgb3BqX2NwX3QgKmNwLAorICAgICAgICBPUEpfVUlOVDMyIHRpbGVubykKIHsKLQkvKiBsb29wKi8KLQlPUEpfVUlOVDMyIHBpbm8sIGNvbXBubzsKLQkvKiBudW1iZXIgb2YgcG9jIGluIHRoZSBwX3BpKi8KLQlPUEpfVUlOVDMyIGxfcG9jX2JvdW5kOworICAgIC8qIGxvb3AqLworICAgIE9QSl9VSU5UMzIgcGlubywgY29tcG5vOworICAgIC8qIG51bWJlciBvZiBwb2MgaW4gdGhlIHBfcGkqLworICAgIE9QSl9VSU5UMzIgbF9wb2NfYm91bmQ7CiAKLQkvKiBwb2ludGVycyB0byB0aWxlIGNvZGluZyBwYXJhbWV0ZXJzIGFuZCBjb21wb25lbnRzLiovCi0Jb3BqX3BpX2l0ZXJhdG9yX3QgKmxfcGkgPSAwMDsKLQlvcGpfdGNwX3QgKnRjcCA9IDAwOwotCWNvbnN0IG9wal90Y2NwX3QgKnRjY3AgPSAwMDsKKyAgICAvKiBwb2ludGVycyB0byB0aWxlIGNvZGluZyBwYXJhbWV0ZXJzIGFuZCBjb21wb25lbnRzLiovCisgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKmxfcGkgPSAwMDsKKyAgICBvcGpfdGNwX3QgKnRjcCA9IDAwOworICAgIGNvbnN0IG9wal90Y2NwX3QgKnRjY3AgPSAwMDsKIAotCS8qIGN1cnJlbnQgcGFja2V0IGl0ZXJhdG9yIGJlaW5nIGFsbG9jYXRlZCovCi0Jb3BqX3BpX2l0ZXJhdG9yX3QgKmxfY3VycmVudF9waSA9IDAwOworICAgIC8qIGN1cnJlbnQgcGFja2V0IGl0ZXJhdG9yIGJlaW5nIGFsbG9jYXRlZCovCisgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKmxfY3VycmVudF9waSA9IDAwOwogCi0JLyogcHJlY29uZGl0aW9ucyBpbiBkZWJ1ZyovCi0JYXNzZXJ0KGNwICE9IDAwKTsKLQlhc3NlcnQoaW1hZ2UgIT0gMDApOwotCWFzc2VydCh0aWxlbm8gPCBjcC0+dHcgKiBjcC0+dGgpOworICAgIC8qIHByZWNvbmRpdGlvbnMgaW4gZGVidWcqLworICAgIGFzc2VydChjcCAhPSAwMCk7CisgICAgYXNzZXJ0KGltYWdlICE9IDAwKTsKKyAgICBhc3NlcnQodGlsZW5vIDwgY3AtPnR3ICogY3AtPnRoKTsKIAotCS8qIGluaXRpYWxpemF0aW9ucyovCi0JdGNwID0gJmNwLT50Y3BzW3RpbGVub107Ci0JbF9wb2NfYm91bmQgPSB0Y3AtPm51bXBvY3MrMTsKKyAgICAvKiBpbml0aWFsaXphdGlvbnMqLworICAgIHRjcCA9ICZjcC0+dGNwc1t0aWxlbm9dOworICAgIGxfcG9jX2JvdW5kID0gdGNwLT5udW1wb2NzICsgMTsKIAotCS8qIG1lbW9yeSBhbGxvY2F0aW9ucyovCi0JbF9waSA9IChvcGpfcGlfaXRlcmF0b3JfdCopIG9wal9jYWxsb2MoKGxfcG9jX2JvdW5kKSwgc2l6ZW9mKG9wal9waV9pdGVyYXRvcl90KSk7Ci0JaWYgKCFsX3BpKSB7Ci0JCXJldHVybiBOVUxMOwotCX0KKyAgICAvKiBtZW1vcnkgYWxsb2NhdGlvbnMqLworICAgIGxfcGkgPSAob3BqX3BpX2l0ZXJhdG9yX3QqKSBvcGpfY2FsbG9jKChsX3BvY19ib3VuZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9wal9waV9pdGVyYXRvcl90KSk7CisgICAgaWYgKCFsX3BpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIAotCWxfY3VycmVudF9waSA9IGxfcGk7Ci0JZm9yIChwaW5vID0gMDsgcGlubyA8IGxfcG9jX2JvdW5kIDsgKytwaW5vKSB7CisgICAgbF9jdXJyZW50X3BpID0gbF9waTsKKyAgICBmb3IgKHBpbm8gPSAwOyBwaW5vIDwgbF9wb2NfYm91bmQgOyArK3Bpbm8pIHsKIAotCQlsX2N1cnJlbnRfcGktPmNvbXBzID0gKG9wal9waV9jb21wX3QqKSBvcGpfY2FsbG9jKGltYWdlLT5udW1jb21wcywgc2l6ZW9mKG9wal9waV9jb21wX3QpKTsKLQkJaWYgKCEgbF9jdXJyZW50X3BpLT5jb21wcykgewotCQkJb3BqX3BpX2Rlc3Ryb3kobF9waSwgbF9wb2NfYm91bmQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KKyAgICAgICAgbF9jdXJyZW50X3BpLT5jb21wcyA9IChvcGpfcGlfY29tcF90Kikgb3BqX2NhbGxvYyhpbWFnZS0+bnVtY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob3BqX3BpX2NvbXBfdCkpOworICAgICAgICBpZiAoISBsX2N1cnJlbnRfcGktPmNvbXBzKSB7CisgICAgICAgICAgICBvcGpfcGlfZGVzdHJveShsX3BpLCBsX3BvY19ib3VuZCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0JCWxfY3VycmVudF9waS0+bnVtY29tcHMgPSBpbWFnZS0+bnVtY29tcHM7CisgICAgICAgIGxfY3VycmVudF9waS0+bnVtY29tcHMgPSBpbWFnZS0+bnVtY29tcHM7CiAKLQkJZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBpbWFnZS0+bnVtY29tcHM7ICsrY29tcG5vKSB7Ci0JCQlvcGpfcGlfY29tcF90ICpjb21wID0gJmxfY3VycmVudF9waS0+Y29tcHNbY29tcG5vXTsKKyAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBpbWFnZS0+bnVtY29tcHM7ICsrY29tcG5vKSB7CisgICAgICAgICAgICBvcGpfcGlfY29tcF90ICpjb21wID0gJmxfY3VycmVudF9waS0+Y29tcHNbY29tcG5vXTsKIAotCQkJdGNjcCA9ICZ0Y3AtPnRjY3BzW2NvbXBub107CisgICAgICAgICAgICB0Y2NwID0gJnRjcC0+dGNjcHNbY29tcG5vXTsKIAotCQkJY29tcC0+cmVzb2x1dGlvbnMgPSAob3BqX3BpX3Jlc29sdXRpb25fdCopIG9wal9jYWxsb2ModGNjcC0+bnVtcmVzb2x1dGlvbnMsIHNpemVvZihvcGpfcGlfcmVzb2x1dGlvbl90KSk7Ci0JCQlpZiAoIWNvbXAtPnJlc29sdXRpb25zKSB7Ci0JCQkJb3BqX3BpX2Rlc3Ryb3kobF9waSwgbF9wb2NfYm91bmQpOwotCQkJCXJldHVybiAwMDsKLQkJCX0KKyAgICAgICAgICAgIGNvbXAtPnJlc29sdXRpb25zID0gKG9wal9waV9yZXNvbHV0aW9uX3QqKSBvcGpfY2FsbG9jKHRjY3AtPm51bXJlc29sdXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob3BqX3BpX3Jlc29sdXRpb25fdCkpOworICAgICAgICAgICAgaWYgKCFjb21wLT5yZXNvbHV0aW9ucykgeworICAgICAgICAgICAgICAgIG9wal9waV9kZXN0cm95KGxfcGksIGxfcG9jX2JvdW5kKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDA7CisgICAgICAgICAgICB9CiAKLQkJCWNvbXAtPm51bXJlc29sdXRpb25zID0gdGNjcC0+bnVtcmVzb2x1dGlvbnM7Ci0JCX0KLQkJKytsX2N1cnJlbnRfcGk7Ci0JfQotCXJldHVybiBsX3BpOworICAgICAgICAgICAgY29tcC0+bnVtcmVzb2x1dGlvbnMgPSB0Y2NwLT5udW1yZXNvbHV0aW9uczsKKyAgICAgICAgfQorICAgICAgICArK2xfY3VycmVudF9waTsKKyAgICB9CisgICAgcmV0dXJuIGxfcGk7CiB9CiAKLXN0YXRpYyB2b2lkIG9wal9waV91cGRhdGVfZW5jb2RlX3BvY19hbmRfZmluYWwgKCAgIG9wal9jcF90ICpwX2NwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF90eDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3R4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfdHkwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF90eTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcHJlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9yZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9keF9taW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9keV9taW4pCitzdGF0aWMgdm9pZCBvcGpfcGlfdXBkYXRlX2VuY29kZV9wb2NfYW5kX2ZpbmFsKG9wal9jcF90ICpwX2NwLAorICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZW5vLAorICAgICAgICBPUEpfSU5UMzIgcF90eDAsCisgICAgICAgIE9QSl9JTlQzMiBwX3R4MSwKKyAgICAgICAgT1BKX0lOVDMyIHBfdHkwLAorICAgICAgICBPUEpfSU5UMzIgcF90eTEsCisgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcHJlYywKKyAgICAgICAgT1BKX1VJTlQzMiBwX21heF9yZXMsCisgICAgICAgIE9QSl9VSU5UMzIgcF9keF9taW4sCisgICAgICAgIE9QSl9VSU5UMzIgcF9keV9taW4pCiB7Ci0JLyogbG9vcCovCi0JT1BKX1VJTlQzMiBwaW5vOwotCS8qIHRpbGUgY29kaW5nIHBhcmFtZXRlciovCi0Jb3BqX3RjcF90ICpsX3RjcCA9IDAwOwotCS8qIGN1cnJlbnQgcG9jIGJlaW5nIHVwZGF0ZWQqLwotCW9wal9wb2NfdCAqIGxfY3VycmVudF9wb2MgPSAwMDsKKyAgICAvKiBsb29wKi8KKyAgICBPUEpfVUlOVDMyIHBpbm87CisgICAgLyogdGlsZSBjb2RpbmcgcGFyYW1ldGVyKi8KKyAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7CisgICAgLyogY3VycmVudCBwb2MgYmVpbmcgdXBkYXRlZCovCisgICAgb3BqX3BvY190ICogbF9jdXJyZW50X3BvYyA9IDAwOwogCi0JLyogbnVtYmVyIG9mIHBvY3MqLwotCU9QSl9VSU5UMzIgbF9wb2NfYm91bmQ7CisgICAgLyogbnVtYmVyIG9mIHBvY3MqLworICAgIE9QSl9VSU5UMzIgbF9wb2NfYm91bmQ7CiAKICAgICBPUEpfQVJHX05PVF9VU0VEKHBfbWF4X3Jlcyk7CiAKLQkvKiBwcmVjb25kaXRpb25zIGluIGRlYnVnKi8KLQlhc3NlcnQocF9jcCAhPSAwMCk7Ci0JYXNzZXJ0KHBfdGlsZW5vIDwgcF9jcC0+dHcgKiBwX2NwLT50aCk7CisgICAgLyogcHJlY29uZGl0aW9ucyBpbiBkZWJ1ZyovCisgICAgYXNzZXJ0KHBfY3AgIT0gMDApOworICAgIGFzc2VydChwX3RpbGVubyA8IHBfY3AtPnR3ICogcF9jcC0+dGgpOwogCi0JLyogaW5pdGlhbGl6YXRpb25zKi8KLQlsX3RjcCA9ICZwX2NwLT50Y3BzIFtwX3RpbGVub107Ci0JLyogbnVtYmVyIG9mIGl0ZXJhdGlvbnMgaW4gdGhlIGxvb3AgKi8KLQlsX3BvY19ib3VuZCA9IGxfdGNwLT5udW1wb2NzKzE7CisgICAgLyogaW5pdGlhbGl6YXRpb25zKi8KKyAgICBsX3RjcCA9ICZwX2NwLT50Y3BzIFtwX3RpbGVub107CisgICAgLyogbnVtYmVyIG9mIGl0ZXJhdGlvbnMgaW4gdGhlIGxvb3AgKi8KKyAgICBsX3BvY19ib3VuZCA9IGxfdGNwLT5udW1wb2NzICsgMTsKIAotCS8qIHN0YXJ0IGF0IGZpcnN0IGVsZW1lbnQsIGFuZCB0byBtYWtlIHN1cmUgdGhlIGNvbXBpbGVyIHdpbGwgbm90IG1ha2UgYSBjYWxjdWxhdGlvbiBlYWNoIHRpbWUgaW4gdGhlIGxvb3AKLQkgICBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZWxlbWVudCB0byBtb2RpZnkgcmF0aGVyIHRoYW4gbF90Y3AtPnBvY3NbaV0qLwotCWxfY3VycmVudF9wb2MgPSBsX3RjcC0+cG9jczsKKyAgICAvKiBzdGFydCBhdCBmaXJzdCBlbGVtZW50LCBhbmQgdG8gbWFrZSBzdXJlIHRoZSBjb21waWxlciB3aWxsIG5vdCBtYWtlIGEgY2FsY3VsYXRpb24gZWFjaCB0aW1lIGluIHRoZSBsb29wCisgICAgICAgc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQgdG8gbW9kaWZ5IHJhdGhlciB0aGFuIGxfdGNwLT5wb2NzW2ldKi8KKyAgICBsX2N1cnJlbnRfcG9jID0gbF90Y3AtPnBvY3M7CiAKLQlsX2N1cnJlbnRfcG9jLT5jb21wUyA9IGxfY3VycmVudF9wb2MtPmNvbXBubzA7Ci0JbF9jdXJyZW50X3BvYy0+Y29tcEUgPSBsX2N1cnJlbnRfcG9jLT5jb21wbm8xOwotCWxfY3VycmVudF9wb2MtPnJlc1MgPSBsX2N1cnJlbnRfcG9jLT5yZXNubzA7Ci0JbF9jdXJyZW50X3BvYy0+cmVzRSA9IGxfY3VycmVudF9wb2MtPnJlc25vMTsKLQlsX2N1cnJlbnRfcG9jLT5sYXlFID0gbF9jdXJyZW50X3BvYy0+bGF5bm8xOworICAgIGxfY3VycmVudF9wb2MtPmNvbXBTID0gbF9jdXJyZW50X3BvYy0+Y29tcG5vMDsKKyAgICBsX2N1cnJlbnRfcG9jLT5jb21wRSA9IGxfY3VycmVudF9wb2MtPmNvbXBubzE7CisgICAgbF9jdXJyZW50X3BvYy0+cmVzUyA9IGxfY3VycmVudF9wb2MtPnJlc25vMDsKKyAgICBsX2N1cnJlbnRfcG9jLT5yZXNFID0gbF9jdXJyZW50X3BvYy0+cmVzbm8xOworICAgIGxfY3VycmVudF9wb2MtPmxheUUgPSBsX2N1cnJlbnRfcG9jLT5sYXlubzE7CiAKLQkvKiBzcGVjaWFsIHRyZWF0bWVudCBmb3IgdGhlIGZpcnN0IGVsZW1lbnQqLwotCWxfY3VycmVudF9wb2MtPmxheVMgPSAwOwotCWxfY3VycmVudF9wb2MtPnByZyAgPSBsX2N1cnJlbnRfcG9jLT5wcmcxOwotCWxfY3VycmVudF9wb2MtPnByY1MgPSAwOworICAgIC8qIHNwZWNpYWwgdHJlYXRtZW50IGZvciB0aGUgZmlyc3QgZWxlbWVudCovCisgICAgbF9jdXJyZW50X3BvYy0+bGF5UyA9IDA7CisgICAgbF9jdXJyZW50X3BvYy0+cHJnICA9IGxfY3VycmVudF9wb2MtPnByZzE7CisgICAgbF9jdXJyZW50X3BvYy0+cHJjUyA9IDA7CiAKLQlsX2N1cnJlbnRfcG9jLT5wcmNFID0gcF9tYXhfcHJlYzsKLQlsX2N1cnJlbnRfcG9jLT50eFMgPSAoT1BKX1VJTlQzMilwX3R4MDsKLQlsX2N1cnJlbnRfcG9jLT50eEUgPSAoT1BKX1VJTlQzMilwX3R4MTsKLQlsX2N1cnJlbnRfcG9jLT50eVMgPSAoT1BKX1VJTlQzMilwX3R5MDsKLQlsX2N1cnJlbnRfcG9jLT50eUUgPSAoT1BKX1VJTlQzMilwX3R5MTsKLQlsX2N1cnJlbnRfcG9jLT5keCA9IHBfZHhfbWluOwotCWxfY3VycmVudF9wb2MtPmR5ID0gcF9keV9taW47CisgICAgbF9jdXJyZW50X3BvYy0+cHJjRSA9IHBfbWF4X3ByZWM7CisgICAgbF9jdXJyZW50X3BvYy0+dHhTID0gKE9QSl9VSU5UMzIpcF90eDA7CisgICAgbF9jdXJyZW50X3BvYy0+dHhFID0gKE9QSl9VSU5UMzIpcF90eDE7CisgICAgbF9jdXJyZW50X3BvYy0+dHlTID0gKE9QSl9VSU5UMzIpcF90eTA7CisgICAgbF9jdXJyZW50X3BvYy0+dHlFID0gKE9QSl9VSU5UMzIpcF90eTE7CisgICAgbF9jdXJyZW50X3BvYy0+ZHggPSBwX2R4X21pbjsKKyAgICBsX2N1cnJlbnRfcG9jLT5keSA9IHBfZHlfbWluOwogCi0JKysgbF9jdXJyZW50X3BvYzsKLQlmb3IgKHBpbm8gPSAxO3Bpbm8gPCBsX3BvY19ib3VuZCA7ICsrcGlubykgewotCQlsX2N1cnJlbnRfcG9jLT5jb21wUyA9IGxfY3VycmVudF9wb2MtPmNvbXBubzA7Ci0JCWxfY3VycmVudF9wb2MtPmNvbXBFPSBsX2N1cnJlbnRfcG9jLT5jb21wbm8xOwotCQlsX2N1cnJlbnRfcG9jLT5yZXNTID0gbF9jdXJyZW50X3BvYy0+cmVzbm8wOwotCQlsX2N1cnJlbnRfcG9jLT5yZXNFID0gbF9jdXJyZW50X3BvYy0+cmVzbm8xOwotCQlsX2N1cnJlbnRfcG9jLT5sYXlFID0gbF9jdXJyZW50X3BvYy0+bGF5bm8xOwotCQlsX2N1cnJlbnRfcG9jLT5wcmcgID0gbF9jdXJyZW50X3BvYy0+cHJnMTsKLQkJbF9jdXJyZW50X3BvYy0+cHJjUyA9IDA7Ci0JCS8qIHNwZWNpYWwgdHJlYXRtZW50IGhlcmUgZGlmZmVyZW50IGZyb20gdGhlIGZpcnN0IGVsZW1lbnQqLwotCQlsX2N1cnJlbnRfcG9jLT5sYXlTID0gKGxfY3VycmVudF9wb2MtPmxheUUgPiAobF9jdXJyZW50X3BvYy0xKS0+bGF5RSkgPyBsX2N1cnJlbnRfcG9jLT5sYXlFIDogMDsKKyAgICArKyBsX2N1cnJlbnRfcG9jOworICAgIGZvciAocGlubyA9IDE7IHBpbm8gPCBsX3BvY19ib3VuZCA7ICsrcGlubykgeworICAgICAgICBsX2N1cnJlbnRfcG9jLT5jb21wUyA9IGxfY3VycmVudF9wb2MtPmNvbXBubzA7CisgICAgICAgIGxfY3VycmVudF9wb2MtPmNvbXBFID0gbF9jdXJyZW50X3BvYy0+Y29tcG5vMTsKKyAgICAgICAgbF9jdXJyZW50X3BvYy0+cmVzUyA9IGxfY3VycmVudF9wb2MtPnJlc25vMDsKKyAgICAgICAgbF9jdXJyZW50X3BvYy0+cmVzRSA9IGxfY3VycmVudF9wb2MtPnJlc25vMTsKKyAgICAgICAgbF9jdXJyZW50X3BvYy0+bGF5RSA9IGxfY3VycmVudF9wb2MtPmxheW5vMTsKKyAgICAgICAgbF9jdXJyZW50X3BvYy0+cHJnICA9IGxfY3VycmVudF9wb2MtPnByZzE7CisgICAgICAgIGxfY3VycmVudF9wb2MtPnByY1MgPSAwOworICAgICAgICAvKiBzcGVjaWFsIHRyZWF0bWVudCBoZXJlIGRpZmZlcmVudCBmcm9tIHRoZSBmaXJzdCBlbGVtZW50Ki8KKyAgICAgICAgbF9jdXJyZW50X3BvYy0+bGF5UyA9IChsX2N1cnJlbnRfcG9jLT5sYXlFID4gKGxfY3VycmVudF9wb2MgLSAxKS0+bGF5RSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3BvYy0+bGF5RSA6IDA7CiAKLQkJbF9jdXJyZW50X3BvYy0+cHJjRSA9IHBfbWF4X3ByZWM7Ci0JCWxfY3VycmVudF9wb2MtPnR4UyA9IChPUEpfVUlOVDMyKXBfdHgwOwotCQlsX2N1cnJlbnRfcG9jLT50eEUgPSAoT1BKX1VJTlQzMilwX3R4MTsKLQkJbF9jdXJyZW50X3BvYy0+dHlTID0gKE9QSl9VSU5UMzIpcF90eTA7Ci0JCWxfY3VycmVudF9wb2MtPnR5RSA9IChPUEpfVUlOVDMyKXBfdHkxOwotCQlsX2N1cnJlbnRfcG9jLT5keCA9IHBfZHhfbWluOwotCQlsX2N1cnJlbnRfcG9jLT5keSA9IHBfZHlfbWluOwotCQkrKyBsX2N1cnJlbnRfcG9jOwotCX0KKyAgICAgICAgbF9jdXJyZW50X3BvYy0+cHJjRSA9IHBfbWF4X3ByZWM7CisgICAgICAgIGxfY3VycmVudF9wb2MtPnR4UyA9IChPUEpfVUlOVDMyKXBfdHgwOworICAgICAgICBsX2N1cnJlbnRfcG9jLT50eEUgPSAoT1BKX1VJTlQzMilwX3R4MTsKKyAgICAgICAgbF9jdXJyZW50X3BvYy0+dHlTID0gKE9QSl9VSU5UMzIpcF90eTA7CisgICAgICAgIGxfY3VycmVudF9wb2MtPnR5RSA9IChPUEpfVUlOVDMyKXBfdHkxOworICAgICAgICBsX2N1cnJlbnRfcG9jLT5keCA9IHBfZHhfbWluOworICAgICAgICBsX2N1cnJlbnRfcG9jLT5keSA9IHBfZHlfbWluOworICAgICAgICArKyBsX2N1cnJlbnRfcG9jOworICAgIH0KIH0KIAotc3RhdGljIHZvaWQgb3BqX3BpX3VwZGF0ZV9lbmNvZGVfbm90X3BvYyAoCW9wal9jcF90ICpwX2NwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX251bV9jb21wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF90eDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF90eDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF90eTAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcF90eTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3ByZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3JlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9keF9taW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZHlfbWluKQorc3RhdGljIHZvaWQgb3BqX3BpX3VwZGF0ZV9lbmNvZGVfbm90X3BvYyhvcGpfY3BfdCAqcF9jcCwKKyAgICAgICAgT1BKX1VJTlQzMiBwX251bV9jb21wcywKKyAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVubywKKyAgICAgICAgT1BKX0lOVDMyIHBfdHgwLAorICAgICAgICBPUEpfSU5UMzIgcF90eDEsCisgICAgICAgIE9QSl9JTlQzMiBwX3R5MCwKKyAgICAgICAgT1BKX0lOVDMyIHBfdHkxLAorICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3ByZWMsCisgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcmVzLAorICAgICAgICBPUEpfVUlOVDMyIHBfZHhfbWluLAorICAgICAgICBPUEpfVUlOVDMyIHBfZHlfbWluKQogewotCS8qIGxvb3AqLwotCU9QSl9VSU5UMzIgcGlubzsKLQkvKiB0aWxlIGNvZGluZyBwYXJhbWV0ZXIqLwotCW9wal90Y3BfdCAqbF90Y3AgPSAwMDsKLQkvKiBjdXJyZW50IHBvYyBiZWluZyB1cGRhdGVkKi8KLQlvcGpfcG9jX3QgKiBsX2N1cnJlbnRfcG9jID0gMDA7Ci0JLyogbnVtYmVyIG9mIHBvY3MqLwotCU9QSl9VSU5UMzIgbF9wb2NfYm91bmQ7CisgICAgLyogbG9vcCovCisgICAgT1BKX1VJTlQzMiBwaW5vOworICAgIC8qIHRpbGUgY29kaW5nIHBhcmFtZXRlciovCisgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOworICAgIC8qIGN1cnJlbnQgcG9jIGJlaW5nIHVwZGF0ZWQqLworICAgIG9wal9wb2NfdCAqIGxfY3VycmVudF9wb2MgPSAwMDsKKyAgICAvKiBudW1iZXIgb2YgcG9jcyovCisgICAgT1BKX1VJTlQzMiBsX3BvY19ib3VuZDsKIAotCS8qIHByZWNvbmRpdGlvbnMgaW4gZGVidWcqLwotCWFzc2VydChwX2NwICE9IDAwKTsKLQlhc3NlcnQocF90aWxlbm8gPCBwX2NwLT50dyAqIHBfY3AtPnRoKTsKKyAgICAvKiBwcmVjb25kaXRpb25zIGluIGRlYnVnKi8KKyAgICBhc3NlcnQocF9jcCAhPSAwMCk7CisgICAgYXNzZXJ0KHBfdGlsZW5vIDwgcF9jcC0+dHcgKiBwX2NwLT50aCk7CiAKLQkvKiBpbml0aWFsaXphdGlvbnMqLwotCWxfdGNwID0gJnBfY3AtPnRjcHMgW3BfdGlsZW5vXTsKKyAgICAvKiBpbml0aWFsaXphdGlvbnMqLworICAgIGxfdGNwID0gJnBfY3AtPnRjcHMgW3BfdGlsZW5vXTsKIAotCS8qIG51bWJlciBvZiBpdGVyYXRpb25zIGluIHRoZSBsb29wICovCi0JbF9wb2NfYm91bmQgPSBsX3RjcC0+bnVtcG9jcysxOworICAgIC8qIG51bWJlciBvZiBpdGVyYXRpb25zIGluIHRoZSBsb29wICovCisgICAgbF9wb2NfYm91bmQgPSBsX3RjcC0+bnVtcG9jcyArIDE7CiAKLQkvKiBzdGFydCBhdCBmaXJzdCBlbGVtZW50LCBhbmQgdG8gbWFrZSBzdXJlIHRoZSBjb21waWxlciB3aWxsIG5vdCBtYWtlIGEgY2FsY3VsYXRpb24gZWFjaCB0aW1lIGluIHRoZSBsb29wCi0JICAgc3RvcmUgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGVsZW1lbnQgdG8gbW9kaWZ5IHJhdGhlciB0aGFuIGxfdGNwLT5wb2NzW2ldKi8KLQlsX2N1cnJlbnRfcG9jID0gbF90Y3AtPnBvY3M7CisgICAgLyogc3RhcnQgYXQgZmlyc3QgZWxlbWVudCwgYW5kIHRvIG1ha2Ugc3VyZSB0aGUgY29tcGlsZXIgd2lsbCBub3QgbWFrZSBhIGNhbGN1bGF0aW9uIGVhY2ggdGltZSBpbiB0aGUgbG9vcAorICAgICAgIHN0b3JlIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBlbGVtZW50IHRvIG1vZGlmeSByYXRoZXIgdGhhbiBsX3RjcC0+cG9jc1tpXSovCisgICAgbF9jdXJyZW50X3BvYyA9IGxfdGNwLT5wb2NzOwogCi0JZm9yIChwaW5vID0gMDsgcGlubyA8IGxfcG9jX2JvdW5kIDsgKytwaW5vKSB7Ci0JCWxfY3VycmVudF9wb2MtPmNvbXBTID0gMDsKLQkJbF9jdXJyZW50X3BvYy0+Y29tcEUgPSBwX251bV9jb21wczsvKnBfaW1hZ2UtPm51bWNvbXBzOyovCi0JCWxfY3VycmVudF9wb2MtPnJlc1MgPSAwOwotCQlsX2N1cnJlbnRfcG9jLT5yZXNFID0gcF9tYXhfcmVzOwotCQlsX2N1cnJlbnRfcG9jLT5sYXlTID0gMDsKLQkJbF9jdXJyZW50X3BvYy0+bGF5RSA9IGxfdGNwLT5udW1sYXllcnM7Ci0JCWxfY3VycmVudF9wb2MtPnByZyAgPSBsX3RjcC0+cHJnOwotCQlsX2N1cnJlbnRfcG9jLT5wcmNTID0gMDsKLQkJbF9jdXJyZW50X3BvYy0+cHJjRSA9IHBfbWF4X3ByZWM7Ci0JCWxfY3VycmVudF9wb2MtPnR4UyA9IChPUEpfVUlOVDMyKXBfdHgwOwotCQlsX2N1cnJlbnRfcG9jLT50eEUgPSAoT1BKX1VJTlQzMilwX3R4MTsKLQkJbF9jdXJyZW50X3BvYy0+dHlTID0gKE9QSl9VSU5UMzIpcF90eTA7Ci0JCWxfY3VycmVudF9wb2MtPnR5RSA9IChPUEpfVUlOVDMyKXBfdHkxOwotCQlsX2N1cnJlbnRfcG9jLT5keCA9IHBfZHhfbWluOwotCQlsX2N1cnJlbnRfcG9jLT5keSA9IHBfZHlfbWluOwotCQkrKyBsX2N1cnJlbnRfcG9jOwotCX0KKyAgICBmb3IgKHBpbm8gPSAwOyBwaW5vIDwgbF9wb2NfYm91bmQgOyArK3Bpbm8pIHsKKyAgICAgICAgbF9jdXJyZW50X3BvYy0+Y29tcFMgPSAwOworICAgICAgICBsX2N1cnJlbnRfcG9jLT5jb21wRSA9IHBfbnVtX2NvbXBzOy8qcF9pbWFnZS0+bnVtY29tcHM7Ki8KKyAgICAgICAgbF9jdXJyZW50X3BvYy0+cmVzUyA9IDA7CisgICAgICAgIGxfY3VycmVudF9wb2MtPnJlc0UgPSBwX21heF9yZXM7CisgICAgICAgIGxfY3VycmVudF9wb2MtPmxheVMgPSAwOworICAgICAgICBsX2N1cnJlbnRfcG9jLT5sYXlFID0gbF90Y3AtPm51bWxheWVyczsKKyAgICAgICAgbF9jdXJyZW50X3BvYy0+cHJnICA9IGxfdGNwLT5wcmc7CisgICAgICAgIGxfY3VycmVudF9wb2MtPnByY1MgPSAwOworICAgICAgICBsX2N1cnJlbnRfcG9jLT5wcmNFID0gcF9tYXhfcHJlYzsKKyAgICAgICAgbF9jdXJyZW50X3BvYy0+dHhTID0gKE9QSl9VSU5UMzIpcF90eDA7CisgICAgICAgIGxfY3VycmVudF9wb2MtPnR4RSA9IChPUEpfVUlOVDMyKXBfdHgxOworICAgICAgICBsX2N1cnJlbnRfcG9jLT50eVMgPSAoT1BKX1VJTlQzMilwX3R5MDsKKyAgICAgICAgbF9jdXJyZW50X3BvYy0+dHlFID0gKE9QSl9VSU5UMzIpcF90eTE7CisgICAgICAgIGxfY3VycmVudF9wb2MtPmR4ID0gcF9keF9taW47CisgICAgICAgIGxfY3VycmVudF9wb2MtPmR5ID0gcF9keV9taW47CisgICAgICAgICsrIGxfY3VycmVudF9wb2M7CisgICAgfQogfQogCi1zdGF0aWMgdm9pZCBvcGpfcGlfdXBkYXRlX2RlY29kZV9wb2MgKG9wal9waV9pdGVyYXRvcl90ICogcF9waSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKiBwX3RjcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3ByZWNpc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3JlcykKK3N0YXRpYyB2b2lkIG9wal9waV91cGRhdGVfZGVjb2RlX3BvYyhvcGpfcGlfaXRlcmF0b3JfdCAqIHBfcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjcF90ICogcF90Y3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9wcmVjaXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9yZXMpCiB7Ci0JLyogbG9vcCovCi0JT1BKX1VJTlQzMiBwaW5vOworICAgIC8qIGxvb3AqLworICAgIE9QSl9VSU5UMzIgcGlubzsKIAotCS8qIGVuY29kaW5nIHByYW1ldGVycyB0byBzZXQqLwotCU9QSl9VSU5UMzIgbF9ib3VuZDsKKyAgICAvKiBlbmNvZGluZyBwcmFtZXRlcnMgdG8gc2V0Ki8KKyAgICBPUEpfVUlOVDMyIGxfYm91bmQ7CiAKLQlvcGpfcGlfaXRlcmF0b3JfdCAqIGxfY3VycmVudF9waSA9IDAwOwotCW9wal9wb2NfdCogbF9jdXJyZW50X3BvYyA9IDA7CisgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKiBsX2N1cnJlbnRfcGkgPSAwMDsKKyAgICBvcGpfcG9jX3QqIGxfY3VycmVudF9wb2MgPSAwOwogCiAgICAgT1BKX0FSR19OT1RfVVNFRChwX21heF9yZXMpOwogCi0JLyogcHJlY29uZGl0aW9ucyBpbiBkZWJ1ZyovCi0JYXNzZXJ0KHBfcGkgIT0gMDApOwotCWFzc2VydChwX3RjcCAhPSAwMCk7CisgICAgLyogcHJlY29uZGl0aW9ucyBpbiBkZWJ1ZyovCisgICAgYXNzZXJ0KHBfcGkgIT0gMDApOworICAgIGFzc2VydChwX3RjcCAhPSAwMCk7CiAKLQkvKiBpbml0aWFsaXphdGlvbnMqLwotCWxfYm91bmQgPSBwX3RjcC0+bnVtcG9jcysxOwotCWxfY3VycmVudF9waSA9IHBfcGk7Ci0JbF9jdXJyZW50X3BvYyA9IHBfdGNwLT5wb2NzOworICAgIC8qIGluaXRpYWxpemF0aW9ucyovCisgICAgbF9ib3VuZCA9IHBfdGNwLT5udW1wb2NzICsgMTsKKyAgICBsX2N1cnJlbnRfcGkgPSBwX3BpOworICAgIGxfY3VycmVudF9wb2MgPSBwX3RjcC0+cG9jczsKIAotCWZvcgkocGlubyA9IDA7cGlubzxsX2JvdW5kOysrcGlubykgewotCQlsX2N1cnJlbnRfcGktPnBvYy5wcmcgPSBsX2N1cnJlbnRfcG9jLT5wcmc7IC8qIFByb2dyZXNzaW9uIE9yZGVyICMwICovCi0JCWxfY3VycmVudF9waS0+Zmlyc3QgPSAxOworICAgIGZvciAocGlubyA9IDA7IHBpbm8gPCBsX2JvdW5kOyArK3Bpbm8pIHsKKyAgICAgICAgbF9jdXJyZW50X3BpLT5wb2MucHJnID0gbF9jdXJyZW50X3BvYy0+cHJnOyAvKiBQcm9ncmVzc2lvbiBPcmRlciAjMCAqLworICAgICAgICBsX2N1cnJlbnRfcGktPmZpcnN0ID0gMTsKIAotCQlsX2N1cnJlbnRfcGktPnBvYy5yZXNubzAgPSBsX2N1cnJlbnRfcG9jLT5yZXNubzA7IC8qIFJlc29sdXRpb24gTGV2ZWwgSW5kZXggIzAgKFN0YXJ0KSAqLwotCQlsX2N1cnJlbnRfcGktPnBvYy5jb21wbm8wID0gbF9jdXJyZW50X3BvYy0+Y29tcG5vMDsgLyogQ29tcG9uZW50IEluZGV4ICMwIChTdGFydCkgKi8KLQkJbF9jdXJyZW50X3BpLT5wb2MubGF5bm8wID0gMDsKLQkJbF9jdXJyZW50X3BpLT5wb2MucHJlY25vMCA9IDA7Ci0JCWxfY3VycmVudF9waS0+cG9jLnJlc25vMSA9IGxfY3VycmVudF9wb2MtPnJlc25vMTsgLyogUmVzb2x1dGlvbiBMZXZlbCBJbmRleCAjMCAoRW5kKSAqLwotCQlsX2N1cnJlbnRfcGktPnBvYy5jb21wbm8xID0gbF9jdXJyZW50X3BvYy0+Y29tcG5vMTsgLyogQ29tcG9uZW50IEluZGV4ICMwIChFbmQpICovCi0JCWxfY3VycmVudF9waS0+cG9jLmxheW5vMSA9IG9wal91aW50X21pbihsX2N1cnJlbnRfcG9jLT5sYXlubzEsIHBfdGNwLT5udW1sYXllcnMpOyAvKiBMYXllciBJbmRleCAjMCAoRW5kKSAqLwotCQlsX2N1cnJlbnRfcGktPnBvYy5wcmVjbm8xID0gcF9tYXhfcHJlY2lzaW9uOwotCQkrK2xfY3VycmVudF9waTsKLQkJKytsX2N1cnJlbnRfcG9jOwotCX0KKyAgICAgICAgbF9jdXJyZW50X3BpLT5wb2MucmVzbm8wID0KKyAgICAgICAgICAgIGxfY3VycmVudF9wb2MtPnJlc25vMDsgLyogUmVzb2x1dGlvbiBMZXZlbCBJbmRleCAjMCAoU3RhcnQpICovCisgICAgICAgIGxfY3VycmVudF9waS0+cG9jLmNvbXBubzAgPQorICAgICAgICAgICAgbF9jdXJyZW50X3BvYy0+Y29tcG5vMDsgLyogQ29tcG9uZW50IEluZGV4ICMwIChTdGFydCkgKi8KKyAgICAgICAgbF9jdXJyZW50X3BpLT5wb2MubGF5bm8wID0gMDsKKyAgICAgICAgbF9jdXJyZW50X3BpLT5wb2MucHJlY25vMCA9IDA7CisgICAgICAgIGxfY3VycmVudF9waS0+cG9jLnJlc25vMSA9CisgICAgICAgICAgICBsX2N1cnJlbnRfcG9jLT5yZXNubzE7IC8qIFJlc29sdXRpb24gTGV2ZWwgSW5kZXggIzAgKEVuZCkgKi8KKyAgICAgICAgbF9jdXJyZW50X3BpLT5wb2MuY29tcG5vMSA9CisgICAgICAgICAgICBsX2N1cnJlbnRfcG9jLT5jb21wbm8xOyAvKiBDb21wb25lbnQgSW5kZXggIzAgKEVuZCkgKi8KKyAgICAgICAgbF9jdXJyZW50X3BpLT5wb2MubGF5bm8xID0gb3BqX3VpbnRfbWluKGxfY3VycmVudF9wb2MtPmxheW5vMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNwLT5udW1sYXllcnMpOyAvKiBMYXllciBJbmRleCAjMCAoRW5kKSAqLworICAgICAgICBsX2N1cnJlbnRfcGktPnBvYy5wcmVjbm8xID0gcF9tYXhfcHJlY2lzaW9uOworICAgICAgICArK2xfY3VycmVudF9waTsKKyAgICAgICAgKytsX2N1cnJlbnRfcG9jOworICAgIH0KIH0KIAotc3RhdGljIHZvaWQgb3BqX3BpX3VwZGF0ZV9kZWNvZGVfbm90X3BvYyAob3BqX3BpX2l0ZXJhdG9yX3QgKiBwX3BpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKiBwX3RjcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9wcmVjaXNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfcmVzKQorc3RhdGljIHZvaWQgb3BqX3BpX3VwZGF0ZV9kZWNvZGVfbm90X3BvYyhvcGpfcGlfaXRlcmF0b3JfdCAqIHBfcGksCisgICAgICAgIG9wal90Y3BfdCAqIHBfdGNwLAorICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3ByZWNpc2lvbiwKKyAgICAgICAgT1BKX1VJTlQzMiBwX21heF9yZXMpCiB7Ci0JLyogbG9vcCovCi0JT1BKX1VJTlQzMiBwaW5vOworICAgIC8qIGxvb3AqLworICAgIE9QSl9VSU5UMzIgcGlubzsKIAotCS8qIGVuY29kaW5nIHByYW1ldGVycyB0byBzZXQqLwotCU9QSl9VSU5UMzIgbF9ib3VuZDsKKyAgICAvKiBlbmNvZGluZyBwcmFtZXRlcnMgdG8gc2V0Ki8KKyAgICBPUEpfVUlOVDMyIGxfYm91bmQ7CiAKLQlvcGpfcGlfaXRlcmF0b3JfdCAqIGxfY3VycmVudF9waSA9IDAwOwotCS8qIHByZWNvbmRpdGlvbnMgaW4gZGVidWcqLwotCWFzc2VydChwX3RjcCAhPSAwMCk7Ci0JYXNzZXJ0KHBfcGkgIT0gMDApOworICAgIG9wal9waV9pdGVyYXRvcl90ICogbF9jdXJyZW50X3BpID0gMDA7CisgICAgLyogcHJlY29uZGl0aW9ucyBpbiBkZWJ1ZyovCisgICAgYXNzZXJ0KHBfdGNwICE9IDAwKTsKKyAgICBhc3NlcnQocF9waSAhPSAwMCk7CiAKLQkvKiBpbml0aWFsaXphdGlvbnMqLwotCWxfYm91bmQgPSBwX3RjcC0+bnVtcG9jcysxOwotCWxfY3VycmVudF9waSA9IHBfcGk7CisgICAgLyogaW5pdGlhbGl6YXRpb25zKi8KKyAgICBsX2JvdW5kID0gcF90Y3AtPm51bXBvY3MgKyAxOworICAgIGxfY3VycmVudF9waSA9IHBfcGk7CiAKLQlmb3IgKHBpbm8gPSAwO3Bpbm88bF9ib3VuZDsrK3Bpbm8pIHsKLQkJbF9jdXJyZW50X3BpLT5wb2MucHJnID0gcF90Y3AtPnByZzsKLQkJbF9jdXJyZW50X3BpLT5maXJzdCA9IDE7Ci0JCWxfY3VycmVudF9waS0+cG9jLnJlc25vMCA9IDA7Ci0JCWxfY3VycmVudF9waS0+cG9jLmNvbXBubzAgPSAwOwotCQlsX2N1cnJlbnRfcGktPnBvYy5sYXlubzAgPSAwOwotCQlsX2N1cnJlbnRfcGktPnBvYy5wcmVjbm8wID0gMDsKLQkJbF9jdXJyZW50X3BpLT5wb2MucmVzbm8xID0gcF9tYXhfcmVzOwotCQlsX2N1cnJlbnRfcGktPnBvYy5jb21wbm8xID0gbF9jdXJyZW50X3BpLT5udW1jb21wczsKLQkJbF9jdXJyZW50X3BpLT5wb2MubGF5bm8xID0gcF90Y3AtPm51bWxheWVyczsKLQkJbF9jdXJyZW50X3BpLT5wb2MucHJlY25vMSA9IHBfbWF4X3ByZWNpc2lvbjsKLQkJKytsX2N1cnJlbnRfcGk7Ci0JfQorICAgIGZvciAocGlubyA9IDA7IHBpbm8gPCBsX2JvdW5kOyArK3Bpbm8pIHsKKyAgICAgICAgbF9jdXJyZW50X3BpLT5wb2MucHJnID0gcF90Y3AtPnByZzsKKyAgICAgICAgbF9jdXJyZW50X3BpLT5maXJzdCA9IDE7CisgICAgICAgIGxfY3VycmVudF9waS0+cG9jLnJlc25vMCA9IDA7CisgICAgICAgIGxfY3VycmVudF9waS0+cG9jLmNvbXBubzAgPSAwOworICAgICAgICBsX2N1cnJlbnRfcGktPnBvYy5sYXlubzAgPSAwOworICAgICAgICBsX2N1cnJlbnRfcGktPnBvYy5wcmVjbm8wID0gMDsKKyAgICAgICAgbF9jdXJyZW50X3BpLT5wb2MucmVzbm8xID0gcF9tYXhfcmVzOworICAgICAgICBsX2N1cnJlbnRfcGktPnBvYy5jb21wbm8xID0gbF9jdXJyZW50X3BpLT5udW1jb21wczsKKyAgICAgICAgbF9jdXJyZW50X3BpLT5wb2MubGF5bm8xID0gcF90Y3AtPm51bWxheWVyczsKKyAgICAgICAgbF9jdXJyZW50X3BpLT5wb2MucHJlY25vMSA9IHBfbWF4X3ByZWNpc2lvbjsKKyAgICAgICAgKytsX2N1cnJlbnRfcGk7CisgICAgfQogfQogCiAKIAotc3RhdGljIE9QSl9CT09MIG9wal9waV9jaGVja19uZXh0X2xldmVsKAlPUEpfSU5UMzIgcG9zLAotCQkJCQkJCQlvcGpfY3BfdCAqY3AsCi0JCQkJCQkJCU9QSl9VSU5UMzIgdGlsZW5vLAotCQkJCQkJCQlPUEpfVUlOVDMyIHBpbm8sCi0JCQkJCQkJCWNvbnN0IE9QSl9DSEFSICpwcm9nKQorc3RhdGljIE9QSl9CT09MIG9wal9waV9jaGVja19uZXh0X2xldmVsKE9QSl9JTlQzMiBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwX3QgKmNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdGlsZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcGlubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfQ0hBUiAqcHJvZykKIHsKLQlPUEpfSU5UMzIgaTsKLQlvcGpfdGNwX3QgKnRjcHMgPSZjcC0+dGNwc1t0aWxlbm9dOwotCW9wal9wb2NfdCAqdGNwID0gJnRjcHMtPnBvY3NbcGlub107CisgICAgT1BKX0lOVDMyIGk7CisgICAgb3BqX3RjcF90ICp0Y3BzID0gJmNwLT50Y3BzW3RpbGVub107CisgICAgb3BqX3BvY190ICp0Y3AgPSAmdGNwcy0+cG9jc1twaW5vXTsKIAotCWlmKHBvcz49MCl7Ci0JCWZvcihpPXBvcztwb3M+PTA7aS0tKXsKLQkJCXN3aXRjaChwcm9nW2ldKXsKLQkJICAgIGNhc2UgJ1InOgotCQkJICAgIGlmKHRjcC0+cmVzX3Q9PXRjcC0+cmVzRSl7Ci0JCQkJICAgIGlmKG9wal9waV9jaGVja19uZXh0X2xldmVsKHBvcy0xLGNwLHRpbGVubyxwaW5vLHByb2cpKXsKLQkJCQkJICAgIHJldHVybiBPUEpfVFJVRTsKLQkJCQkgICAgfWVsc2V7Ci0JCQkJCSAgICByZXR1cm4gT1BKX0ZBTFNFOwotCQkJCSAgICB9Ci0JCQkgICAgfWVsc2V7Ci0JCQkJICAgIHJldHVybiBPUEpfVFJVRTsKLQkJCSAgICB9Ci0JCQkgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdDJzoKLQkJCSAgICBpZih0Y3AtPmNvbXBfdD09dGNwLT5jb21wRSl7Ci0JCQkJICAgIGlmKG9wal9waV9jaGVja19uZXh0X2xldmVsKHBvcy0xLGNwLHRpbGVubyxwaW5vLHByb2cpKXsKLQkJCQkJICAgIHJldHVybiBPUEpfVFJVRTsKLQkJCQkgICAgfWVsc2V7Ci0JCQkJCSAgICByZXR1cm4gT1BKX0ZBTFNFOwotCQkJCSAgICB9Ci0JCQkgICAgfWVsc2V7Ci0JCQkJICAgIHJldHVybiBPUEpfVFJVRTsKLQkJCSAgICB9Ci0JCQkgICAgYnJlYWs7Ci0JCSAgICBjYXNlICdMJzoKLQkJCSAgICBpZih0Y3AtPmxheV90PT10Y3AtPmxheUUpewotCQkJCSAgICBpZihvcGpfcGlfY2hlY2tfbmV4dF9sZXZlbChwb3MtMSxjcCx0aWxlbm8scGlubyxwcm9nKSl7Ci0JCQkJCSAgICByZXR1cm4gT1BKX1RSVUU7Ci0JCQkJICAgIH1lbHNlewotCQkJCQkgICAgcmV0dXJuIE9QSl9GQUxTRTsKLQkJCQkgICAgfQotCQkJICAgIH1lbHNlewotCQkJCSAgICByZXR1cm4gT1BKX1RSVUU7Ci0JCQkgICAgfQotCQkJICAgIGJyZWFrOwotCQkgICAgY2FzZSAnUCc6Ci0JCQkgICAgc3dpdGNoKHRjcC0+cHJnKXsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBPUEpfTFJDUDogLyogZmFsbCB0aHJvdWdoICovCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgT1BKX1JMQ1A6Ci0JCQkJCSAgICBpZih0Y3AtPnByY190ID09IHRjcC0+cHJjRSl7Ci0JCQkJCQkgICAgaWYob3BqX3BpX2NoZWNrX25leHRfbGV2ZWwoaS0xLGNwLHRpbGVubyxwaW5vLHByb2cpKXsKLQkJCQkJCQkgICAgcmV0dXJuIE9QSl9UUlVFOwotCQkJCQkJICAgIH1lbHNlewotCQkJCQkJCSAgICByZXR1cm4gT1BKX0ZBTFNFOwotCQkJCQkJICAgIH0KLQkJCQkJICAgIH1lbHNlewotCQkJCQkJICAgIHJldHVybiBPUEpfVFJVRTsKLQkJCQkJICAgIH0KLQkJCQkJICAgIGJyZWFrOwotCQkJICAgIGRlZmF1bHQ6Ci0JCQkJICAgIGlmKHRjcC0+dHgwX3QgPT0gdGNwLT50eEUpewotCQkJCQkgICAgLypUWSovCi0JCQkJCSAgICBpZih0Y3AtPnR5MF90ID09IHRjcC0+dHlFKXsKLQkJCQkJCSAgICBpZihvcGpfcGlfY2hlY2tfbmV4dF9sZXZlbChpLTEsY3AsdGlsZW5vLHBpbm8scHJvZykpewotCQkJCQkJCSAgICByZXR1cm4gT1BKX1RSVUU7Ci0JCQkJCQkgICAgfWVsc2V7Ci0JCQkJCQkJICAgIHJldHVybiBPUEpfRkFMU0U7Ci0JCQkJCQkgICAgfQotCQkJCQkgICAgfWVsc2V7Ci0JCQkJCQkgICAgcmV0dXJuIE9QSl9UUlVFOwotCQkJCQkgICAgfS8qVFkqLwotCQkJCSAgICB9ZWxzZXsKLQkJCQkJICAgIHJldHVybiBPUEpfVFJVRTsKLQkJCQkgICAgfQotCQkJCSAgICBicmVhazsKLQkJCSAgICB9LyplbmQgY2FzZSBQKi8KLQkJICAgIH0vKmVuZCBzd2l0Y2gqLwotCQl9LyplbmQgZm9yKi8KLQl9LyplbmQgaWYqLwotCXJldHVybiBPUEpfRkFMU0U7CisgICAgaWYgKHBvcyA+PSAwKSB7CisgICAgICAgIGZvciAoaSA9IHBvczsgcG9zID49IDA7IGktLSkgeworICAgICAgICAgICAgc3dpdGNoIChwcm9nW2ldKSB7CisgICAgICAgICAgICBjYXNlICdSJzoKKyAgICAgICAgICAgICAgICBpZiAodGNwLT5yZXNfdCA9PSB0Y3AtPnJlc0UpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wal9waV9jaGVja19uZXh0X2xldmVsKHBvcyAtIDEsIGNwLCB0aWxlbm8sIHBpbm8sIHByb2cpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgICAgIGlmICh0Y3AtPmNvbXBfdCA9PSB0Y3AtPmNvbXBFKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvcGpfcGlfY2hlY2tfbmV4dF9sZXZlbChwb3MgLSAxLCBjcCwgdGlsZW5vLCBwaW5vLCBwcm9nKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdMJzoKKyAgICAgICAgICAgICAgICBpZiAodGNwLT5sYXlfdCA9PSB0Y3AtPmxheUUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wal9waV9jaGVja19uZXh0X2xldmVsKHBvcyAtIDEsIGNwLCB0aWxlbm8sIHBpbm8sIHByb2cpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1AnOgorICAgICAgICAgICAgICAgIHN3aXRjaCAodGNwLT5wcmcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIE9QSl9MUkNQOiAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgICAgICAgICBjYXNlIE9QSl9STENQOgorICAgICAgICAgICAgICAgICAgICBpZiAodGNwLT5wcmNfdCA9PSB0Y3AtPnByY0UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGpfcGlfY2hlY2tfbmV4dF9sZXZlbChpIC0gMSwgY3AsIHRpbGVubywgcGlubywgcHJvZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRjcC0+dHgwX3QgPT0gdGNwLT50eEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qVFkqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRjcC0+dHkwX3QgPT0gdGNwLT50eUUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BqX3BpX2NoZWNrX25leHRfbGV2ZWwoaSAtIDEsIGNwLCB0aWxlbm8sIHBpbm8sIHByb2cpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICAgICAgICAgICAgICAgICAgfS8qVFkqLworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0vKmVuZCBjYXNlIFAqLworICAgICAgICAgICAgfS8qZW5kIHN3aXRjaCovCisgICAgICAgIH0vKmVuZCBmb3IqLworICAgIH0vKmVuZCBpZiovCisgICAgcmV0dXJuIE9QSl9GQUxTRTsKIH0KIAogCkBAIC0xMTYyLDczMiArMTM1Nyw3MzkgQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICovCiBvcGpfcGlfaXRlcmF0b3JfdCAqb3BqX3BpX2NyZWF0ZV9kZWNvZGUob3BqX2ltYWdlX3QgKnBfaW1hZ2UsCi0JCQkJCQkJCQkJb3BqX2NwX3QgKnBfY3AsCi0JCQkJCQkJCQkJT1BKX1VJTlQzMiBwX3RpbGVfbm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwX3QgKnBfY3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8pCiB7Ci0JLyogbG9vcCAqLwotCU9QSl9VSU5UMzIgcGlubzsKLQlPUEpfVUlOVDMyIGNvbXBubywgcmVzbm87CisgICAgT1BKX1VJTlQzMiBudW1jb21wcyA9IHBfaW1hZ2UtPm51bWNvbXBzOwogCi0JLyogdG8gc3RvcmUgdywgaCwgZHggYW5kIGR5IGZybyBhbGwgY29tcG9uZW50cyBhbmQgcmVzb2x1dGlvbnMgKi8KLQlPUEpfVUlOVDMyICogbF90bXBfZGF0YTsKLQlPUEpfVUlOVDMyICoqIGxfdG1wX3B0cjsKKyAgICAvKiBsb29wICovCisgICAgT1BKX1VJTlQzMiBwaW5vOworICAgIE9QSl9VSU5UMzIgY29tcG5vLCByZXNubzsKIAotCS8qIGVuY29kaW5nIHByYW1ldGVycyB0byBzZXQgKi8KLQlPUEpfVUlOVDMyIGxfbWF4X3JlczsKLQlPUEpfVUlOVDMyIGxfbWF4X3ByZWM7Ci0JT1BKX0lOVDMyIGxfdHgwLGxfdHgxLGxfdHkwLGxfdHkxOwotCU9QSl9VSU5UMzIgbF9keF9taW4sbF9keV9taW47Ci0JT1BKX1VJTlQzMiBsX2JvdW5kOwotCU9QSl9VSU5UMzIgbF9zdGVwX3AgLCBsX3N0ZXBfYyAsIGxfc3RlcF9yICwgbF9zdGVwX2wgOwotCU9QSl9VSU5UMzIgbF9kYXRhX3N0cmlkZTsKKyAgICAvKiB0byBzdG9yZSB3LCBoLCBkeCBhbmQgZHkgZnJvIGFsbCBjb21wb25lbnRzIGFuZCByZXNvbHV0aW9ucyAqLworICAgIE9QSl9VSU5UMzIgKiBsX3RtcF9kYXRhOworICAgIE9QSl9VSU5UMzIgKiogbF90bXBfcHRyOwogCi0JLyogcG9pbnRlcnMgKi8KLQlvcGpfcGlfaXRlcmF0b3JfdCAqbF9waSA9IDAwOwotCW9wal90Y3BfdCAqbF90Y3AgPSAwMDsKLQljb25zdCBvcGpfdGNjcF90ICpsX3RjY3AgPSAwMDsKLQlvcGpfcGlfY29tcF90ICpsX2N1cnJlbnRfY29tcCA9IDAwOwotCW9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gMDA7Ci0Jb3BqX3BpX2l0ZXJhdG9yX3QgKiBsX2N1cnJlbnRfcGkgPSAwMDsKLQlPUEpfVUlOVDMyICogbF9lbmNvZGluZ192YWx1ZV9wdHIgPSAwMDsKKyAgICAvKiBlbmNvZGluZyBwcmFtZXRlcnMgdG8gc2V0ICovCisgICAgT1BKX1VJTlQzMiBsX21heF9yZXM7CisgICAgT1BKX1VJTlQzMiBsX21heF9wcmVjOworICAgIE9QSl9JTlQzMiBsX3R4MCwgbF90eDEsIGxfdHkwLCBsX3R5MTsKKyAgICBPUEpfVUlOVDMyIGxfZHhfbWluLCBsX2R5X21pbjsKKyAgICBPUEpfVUlOVDMyIGxfYm91bmQ7CisgICAgT1BKX1VJTlQzMiBsX3N0ZXBfcCwgbF9zdGVwX2MsIGxfc3RlcF9yLCBsX3N0ZXBfbCA7CisgICAgT1BKX1VJTlQzMiBsX2RhdGFfc3RyaWRlOwogCi0JLyogcHJlY29uZGl0aW9ucyBpbiBkZWJ1ZyAqLwotCWFzc2VydChwX2NwICE9IDAwKTsKLQlhc3NlcnQocF9pbWFnZSAhPSAwMCk7Ci0JYXNzZXJ0KHBfdGlsZV9ubyA8IHBfY3AtPnR3ICogcF9jcC0+dGgpOworICAgIC8qIHBvaW50ZXJzICovCisgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKmxfcGkgPSAwMDsKKyAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7CisgICAgY29uc3Qgb3BqX3RjY3BfdCAqbF90Y2NwID0gMDA7CisgICAgb3BqX3BpX2NvbXBfdCAqbF9jdXJyZW50X2NvbXAgPSAwMDsKKyAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IDAwOworICAgIG9wal9waV9pdGVyYXRvcl90ICogbF9jdXJyZW50X3BpID0gMDA7CisgICAgT1BKX1VJTlQzMiAqIGxfZW5jb2RpbmdfdmFsdWVfcHRyID0gMDA7CiAKLQkvKiBpbml0aWFsaXphdGlvbnMgKi8KLQlsX3RjcCA9ICZwX2NwLT50Y3BzW3BfdGlsZV9ub107Ci0JbF9ib3VuZCA9IGxfdGNwLT5udW1wb2NzKzE7CisgICAgLyogcHJlY29uZGl0aW9ucyBpbiBkZWJ1ZyAqLworICAgIGFzc2VydChwX2NwICE9IDAwKTsKKyAgICBhc3NlcnQocF9pbWFnZSAhPSAwMCk7CisgICAgYXNzZXJ0KHBfdGlsZV9ubyA8IHBfY3AtPnR3ICogcF9jcC0+dGgpOwogCi0JbF9kYXRhX3N0cmlkZSA9IDQgKiBPUEpfSjJLX01BWFJMVkxTOwotCWxfdG1wX2RhdGEgPSAoT1BKX1VJTlQzMiopb3BqX21hbGxvYygKLQkJbF9kYXRhX3N0cmlkZSAqIHBfaW1hZ2UtPm51bWNvbXBzICogc2l6ZW9mKE9QSl9VSU5UMzIpKTsKLQlpZgotCQkoISBsX3RtcF9kYXRhKQotCXsKLQkJcmV0dXJuIDAwOwotCX0KLQlsX3RtcF9wdHIgPSAoT1BKX1VJTlQzMioqKW9wal9tYWxsb2MoCi0JCXBfaW1hZ2UtPm51bWNvbXBzICogc2l6ZW9mKE9QSl9VSU5UMzIgKikpOwotCWlmCi0JCSghIGxfdG1wX3B0cikKLQl7Ci0JCW9wal9mcmVlKGxfdG1wX2RhdGEpOwotCQlyZXR1cm4gMDA7Ci0JfQorICAgIC8qIGluaXRpYWxpemF0aW9ucyAqLworICAgIGxfdGNwID0gJnBfY3AtPnRjcHNbcF90aWxlX25vXTsKKyAgICBsX2JvdW5kID0gbF90Y3AtPm51bXBvY3MgKyAxOwogCi0JLyogbWVtb3J5IGFsbG9jYXRpb24gZm9yIHBpICovCi0JbF9waSA9IG9wal9waV9jcmVhdGUocF9pbWFnZSwgcF9jcCwgcF90aWxlX25vKTsKLQlpZiAoIWxfcGkpIHsKLQkJb3BqX2ZyZWUobF90bXBfZGF0YSk7Ci0JCW9wal9mcmVlKGxfdG1wX3B0cik7Ci0JCXJldHVybiAwMDsKLQl9CisgICAgbF9kYXRhX3N0cmlkZSA9IDQgKiBPUEpfSjJLX01BWFJMVkxTOworICAgIGxfdG1wX2RhdGEgPSAoT1BKX1VJTlQzMiopb3BqX21hbGxvYygKKyAgICAgICAgICAgICAgICAgICAgIGxfZGF0YV9zdHJpZGUgKiBudW1jb21wcyAqIHNpemVvZihPUEpfVUlOVDMyKSk7CisgICAgaWYKKyAgICAoISBsX3RtcF9kYXRhKSB7CisgICAgICAgIHJldHVybiAwMDsKKyAgICB9CisgICAgbF90bXBfcHRyID0gKE9QSl9VSU5UMzIqKilvcGpfbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICBudW1jb21wcyAqIHNpemVvZihPUEpfVUlOVDMyICopKTsKKyAgICBpZgorICAgICghIGxfdG1wX3B0cikgeworICAgICAgICBvcGpfZnJlZShsX3RtcF9kYXRhKTsKKyAgICAgICAgcmV0dXJuIDAwOworICAgIH0KIAotCWxfZW5jb2RpbmdfdmFsdWVfcHRyID0gbF90bXBfZGF0YTsKLQkvKiB1cGRhdGUgcG9pbnRlciBhcnJheSAqLwotCWZvcgotCQkoY29tcG5vID0gMDsgY29tcG5vIDwgcF9pbWFnZS0+bnVtY29tcHM7ICsrY29tcG5vKQotCXsKLQkJbF90bXBfcHRyW2NvbXBub10gPSBsX2VuY29kaW5nX3ZhbHVlX3B0cjsKLQkJbF9lbmNvZGluZ192YWx1ZV9wdHIgKz0gbF9kYXRhX3N0cmlkZTsKLQl9Ci0JLyogZ2V0IGVuY29kaW5nIHBhcmFtZXRlcnMgKi8KLQlvcGpfZ2V0X2FsbF9lbmNvZGluZ19wYXJhbWV0ZXJzKHBfaW1hZ2UscF9jcCxwX3RpbGVfbm8sJmxfdHgwLCZsX3R4MSwmbF90eTAsJmxfdHkxLCZsX2R4X21pbiwmbF9keV9taW4sJmxfbWF4X3ByZWMsJmxfbWF4X3JlcyxsX3RtcF9wdHIpOworICAgIC8qIG1lbW9yeSBhbGxvY2F0aW9uIGZvciBwaSAqLworICAgIGxfcGkgPSBvcGpfcGlfY3JlYXRlKHBfaW1hZ2UsIHBfY3AsIHBfdGlsZV9ubyk7CisgICAgaWYgKCFsX3BpKSB7CisgICAgICAgIG9wal9mcmVlKGxfdG1wX2RhdGEpOworICAgICAgICBvcGpfZnJlZShsX3RtcF9wdHIpOworICAgICAgICByZXR1cm4gMDA7CisgICAgfQogCi0JLyogc3RlcCBjYWxjdWxhdGlvbnMgKi8KLQlsX3N0ZXBfcCA9IDE7Ci0JbF9zdGVwX2MgPSBsX21heF9wcmVjICogbF9zdGVwX3A7Ci0JbF9zdGVwX3IgPSBwX2ltYWdlLT5udW1jb21wcyAqIGxfc3RlcF9jOwotCWxfc3RlcF9sID0gbF9tYXhfcmVzICogbF9zdGVwX3I7CisgICAgbF9lbmNvZGluZ192YWx1ZV9wdHIgPSBsX3RtcF9kYXRhOworICAgIC8qIHVwZGF0ZSBwb2ludGVyIGFycmF5ICovCisgICAgZm9yCisgICAgKGNvbXBubyA9IDA7IGNvbXBubyA8IG51bWNvbXBzOyArK2NvbXBubykgeworICAgICAgICBsX3RtcF9wdHJbY29tcG5vXSA9IGxfZW5jb2RpbmdfdmFsdWVfcHRyOworICAgICAgICBsX2VuY29kaW5nX3ZhbHVlX3B0ciArPSBsX2RhdGFfc3RyaWRlOworICAgIH0KKyAgICAvKiBnZXQgZW5jb2RpbmcgcGFyYW1ldGVycyAqLworICAgIG9wal9nZXRfYWxsX2VuY29kaW5nX3BhcmFtZXRlcnMocF9pbWFnZSwgcF9jcCwgcF90aWxlX25vLCAmbF90eDAsICZsX3R4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX3R5MCwgJmxfdHkxLCAmbF9keF9taW4sICZsX2R5X21pbiwgJmxfbWF4X3ByZWMsICZsX21heF9yZXMsIGxfdG1wX3B0cik7CiAKLQkvKiBzZXQgdmFsdWVzIGZvciBmaXJzdCBwYWNrZXQgaXRlcmF0b3IgKi8KLQlsX2N1cnJlbnRfcGkgPSBsX3BpOworICAgIC8qIHN0ZXAgY2FsY3VsYXRpb25zICovCisgICAgbF9zdGVwX3AgPSAxOworICAgIGxfc3RlcF9jID0gbF9tYXhfcHJlYyAqIGxfc3RlcF9wOworICAgIGxfc3RlcF9yID0gbnVtY29tcHMgKiBsX3N0ZXBfYzsKKyAgICBsX3N0ZXBfbCA9IGxfbWF4X3JlcyAqIGxfc3RlcF9yOwogCi0JLyogbWVtb3J5IGFsbG9jYXRpb24gZm9yIGluY2x1ZGUgKi8KLQlsX2N1cnJlbnRfcGktPmluY2x1ZGUgPSAwMDsKLQlpZgotCQkobF9zdGVwX2wgJiYgbF90Y3AtPm51bWxheWVycyA8IFVJTlRfTUFYIC8gbF9zdGVwX2wgLSAxKQotCXsKLQkJbF9jdXJyZW50X3BpLT5pbmNsdWRlID0gKE9QSl9JTlQxNiopb3BqX2NhbGxvYygobF90Y3AtPm51bWxheWVycyArIDEpICogbF9zdGVwX2wsIHNpemVvZihPUEpfSU5UMTYpKTsKLQl9CisgICAgLyogc2V0IHZhbHVlcyBmb3IgZmlyc3QgcGFja2V0IGl0ZXJhdG9yICovCisgICAgbF9jdXJyZW50X3BpID0gbF9waTsKIAotCWlmCi0JCSghbF9jdXJyZW50X3BpLT5pbmNsdWRlKQotCXsKLQkJb3BqX2ZyZWUobF90bXBfZGF0YSk7Ci0JCW9wal9mcmVlKGxfdG1wX3B0cik7Ci0JCW9wal9waV9kZXN0cm95KGxfcGksIGxfYm91bmQpOwotCQlyZXR1cm4gMDA7Ci0JfQorICAgIC8qIG1lbW9yeSBhbGxvY2F0aW9uIGZvciBpbmNsdWRlICovCisgICAgLyogcHJldmVudCBhbiBpbnRlZ2VyIG92ZXJmbG93IGlzc3VlICovCisgICAgLyogMCA8IGxfdGNwLT5udW1sYXllcnMgPCA2NTUzNiBjLmYuIG9wal9qMmtfcmVhZF9jb2QgaW4gajJrLmMgKi8KKyAgICBsX2N1cnJlbnRfcGktPmluY2x1ZGUgPSAwMDsKKyAgICBpZiAobF9zdGVwX2wgPD0gKFVJTlRfTUFYIC8gKGxfdGNwLT5udW1sYXllcnMgKyAxVSkpKSB7CisgICAgICAgIGxfY3VycmVudF9waS0+aW5jbHVkZV9zaXplID0gKGxfdGNwLT5udW1sYXllcnMgKyAxVSkgKiBsX3N0ZXBfbDsKKyAgICAgICAgbF9jdXJyZW50X3BpLT5pbmNsdWRlID0gKE9QSl9JTlQxNiopIG9wal9jYWxsb2MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcGktPmluY2x1ZGVfc2l6ZSwgc2l6ZW9mKE9QSl9JTlQxNikpOworICAgIH0KIAotCS8qIHNwZWNpYWwgdHJlYXRtZW50IGZvciB0aGUgZmlyc3QgcGFja2V0IGl0ZXJhdG9yICovCi0JbF9jdXJyZW50X2NvbXAgPSBsX2N1cnJlbnRfcGktPmNvbXBzOwotCWxfaW1nX2NvbXAgPSBwX2ltYWdlLT5jb21wczsKLQlsX3RjY3AgPSBsX3RjcC0+dGNjcHM7CisgICAgaWYgKCFsX2N1cnJlbnRfcGktPmluY2x1ZGUpIHsKKyAgICAgICAgb3BqX2ZyZWUobF90bXBfZGF0YSk7CisgICAgICAgIG9wal9mcmVlKGxfdG1wX3B0cik7CisgICAgICAgIG9wal9waV9kZXN0cm95KGxfcGksIGxfYm91bmQpOworICAgICAgICByZXR1cm4gMDA7CisgICAgfQogCi0JbF9jdXJyZW50X3BpLT50eDAgPSBsX3R4MDsKLQlsX2N1cnJlbnRfcGktPnR5MCA9IGxfdHkwOwotCWxfY3VycmVudF9waS0+dHgxID0gbF90eDE7Ci0JbF9jdXJyZW50X3BpLT50eTEgPSBsX3R5MTsKKyAgICAvKiBzcGVjaWFsIHRyZWF0bWVudCBmb3IgdGhlIGZpcnN0IHBhY2tldCBpdGVyYXRvciAqLworICAgIGxfY3VycmVudF9jb21wID0gbF9jdXJyZW50X3BpLT5jb21wczsKKyAgICBsX2ltZ19jb21wID0gcF9pbWFnZS0+Y29tcHM7CisgICAgbF90Y2NwID0gbF90Y3AtPnRjY3BzOwogCi0JLypsX2N1cnJlbnRfcGktPmR4ID0gbF9pbWdfY29tcC0+ZHg7Ki8KLQkvKmxfY3VycmVudF9waS0+ZHkgPSBsX2ltZ19jb21wLT5keTsqLworICAgIGxfY3VycmVudF9waS0+dHgwID0gbF90eDA7CisgICAgbF9jdXJyZW50X3BpLT50eTAgPSBsX3R5MDsKKyAgICBsX2N1cnJlbnRfcGktPnR4MSA9IGxfdHgxOworICAgIGxfY3VycmVudF9waS0+dHkxID0gbF90eTE7CiAKLQlsX2N1cnJlbnRfcGktPnN0ZXBfcCA9IGxfc3RlcF9wOwotCWxfY3VycmVudF9waS0+c3RlcF9jID0gbF9zdGVwX2M7Ci0JbF9jdXJyZW50X3BpLT5zdGVwX3IgPSBsX3N0ZXBfcjsKLQlsX2N1cnJlbnRfcGktPnN0ZXBfbCA9IGxfc3RlcF9sOworICAgIC8qbF9jdXJyZW50X3BpLT5keCA9IGxfaW1nX2NvbXAtPmR4OyovCisgICAgLypsX2N1cnJlbnRfcGktPmR5ID0gbF9pbWdfY29tcC0+ZHk7Ki8KIAotCS8qIGFsbG9jYXRpb24gZm9yIGNvbXBvbmVudHMgYW5kIG51bWJlciBvZiBjb21wb25lbnRzIGhhcyBhbHJlYWR5IGJlZW4gY2FsY3VsYXRlZCBieSBvcGpfcGlfY3JlYXRlICovCi0JZm9yCi0JCShjb21wbm8gPSAwOyBjb21wbm8gPCBsX2N1cnJlbnRfcGktPm51bWNvbXBzOyArK2NvbXBubykKLQl7Ci0JCW9wal9waV9yZXNvbHV0aW9uX3QgKmxfcmVzID0gbF9jdXJyZW50X2NvbXAtPnJlc29sdXRpb25zOwotCQlsX2VuY29kaW5nX3ZhbHVlX3B0ciA9IGxfdG1wX3B0cltjb21wbm9dOworICAgIGxfY3VycmVudF9waS0+c3RlcF9wID0gbF9zdGVwX3A7CisgICAgbF9jdXJyZW50X3BpLT5zdGVwX2MgPSBsX3N0ZXBfYzsKKyAgICBsX2N1cnJlbnRfcGktPnN0ZXBfciA9IGxfc3RlcF9yOworICAgIGxfY3VycmVudF9waS0+c3RlcF9sID0gbF9zdGVwX2w7CiAKLQkJbF9jdXJyZW50X2NvbXAtPmR4ID0gbF9pbWdfY29tcC0+ZHg7Ci0JCWxfY3VycmVudF9jb21wLT5keSA9IGxfaW1nX2NvbXAtPmR5OwotCQkvKiByZXNvbHV0aW9ucyBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCAqLwotCQlmb3IKLQkJCShyZXNubyA9IDA7IHJlc25vIDwgbF9jdXJyZW50X2NvbXAtPm51bXJlc29sdXRpb25zOyByZXNubysrKQotCQl7Ci0JCQlsX3Jlcy0+cGR4ID0gKihsX2VuY29kaW5nX3ZhbHVlX3B0cisrKTsKLQkJCWxfcmVzLT5wZHkgPSAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOwotCQkJbF9yZXMtPnB3ID0gICoobF9lbmNvZGluZ192YWx1ZV9wdHIrKyk7Ci0JCQlsX3Jlcy0+cGggPSAgKihsX2VuY29kaW5nX3ZhbHVlX3B0cisrKTsKLQkJCSsrbF9yZXM7Ci0JCX0KLQkJKytsX2N1cnJlbnRfY29tcDsKLQkJKytsX2ltZ19jb21wOwotCQkrK2xfdGNjcDsKLQl9Ci0JKytsX2N1cnJlbnRfcGk7CisgICAgLyogYWxsb2NhdGlvbiBmb3IgY29tcG9uZW50cyBhbmQgbnVtYmVyIG9mIGNvbXBvbmVudHMgaGFzIGFscmVhZHkgYmVlbiBjYWxjdWxhdGVkIGJ5IG9wal9waV9jcmVhdGUgKi8KKyAgICBmb3IKKyAgICAoY29tcG5vID0gMDsgY29tcG5vIDwgbnVtY29tcHM7ICsrY29tcG5vKSB7CisgICAgICAgIG9wal9waV9yZXNvbHV0aW9uX3QgKmxfcmVzID0gbF9jdXJyZW50X2NvbXAtPnJlc29sdXRpb25zOworICAgICAgICBsX2VuY29kaW5nX3ZhbHVlX3B0ciA9IGxfdG1wX3B0cltjb21wbm9dOwogCi0JZm9yIChwaW5vID0gMSA7IHBpbm88bF9ib3VuZCA7ICsrcGlubyApCi0JewotCQlsX2N1cnJlbnRfY29tcCA9IGxfY3VycmVudF9waS0+Y29tcHM7Ci0JCWxfaW1nX2NvbXAgPSBwX2ltYWdlLT5jb21wczsKLQkJbF90Y2NwID0gbF90Y3AtPnRjY3BzOworICAgICAgICBsX2N1cnJlbnRfY29tcC0+ZHggPSBsX2ltZ19jb21wLT5keDsKKyAgICAgICAgbF9jdXJyZW50X2NvbXAtPmR5ID0gbF9pbWdfY29tcC0+ZHk7CisgICAgICAgIC8qIHJlc29sdXRpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkICovCisgICAgICAgIGZvcgorICAgICAgICAocmVzbm8gPSAwOyByZXNubyA8IGxfY3VycmVudF9jb21wLT5udW1yZXNvbHV0aW9uczsgcmVzbm8rKykgeworICAgICAgICAgICAgbF9yZXMtPnBkeCA9ICoobF9lbmNvZGluZ192YWx1ZV9wdHIrKyk7CisgICAgICAgICAgICBsX3Jlcy0+cGR5ID0gKihsX2VuY29kaW5nX3ZhbHVlX3B0cisrKTsKKyAgICAgICAgICAgIGxfcmVzLT5wdyA9ICAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOworICAgICAgICAgICAgbF9yZXMtPnBoID0gICoobF9lbmNvZGluZ192YWx1ZV9wdHIrKyk7CisgICAgICAgICAgICArK2xfcmVzOworICAgICAgICB9CisgICAgICAgICsrbF9jdXJyZW50X2NvbXA7CisgICAgICAgICsrbF9pbWdfY29tcDsKKyAgICAgICAgKytsX3RjY3A7CisgICAgfQorICAgICsrbF9jdXJyZW50X3BpOwogCi0JCWxfY3VycmVudF9waS0+dHgwID0gbF90eDA7Ci0JCWxfY3VycmVudF9waS0+dHkwID0gbF90eTA7Ci0JCWxfY3VycmVudF9waS0+dHgxID0gbF90eDE7Ci0JCWxfY3VycmVudF9waS0+dHkxID0gbF90eTE7Ci0JCS8qbF9jdXJyZW50X3BpLT5keCA9IGxfZHhfbWluOyovCi0JCS8qbF9jdXJyZW50X3BpLT5keSA9IGxfZHlfbWluOyovCi0JCWxfY3VycmVudF9waS0+c3RlcF9wID0gbF9zdGVwX3A7Ci0JCWxfY3VycmVudF9waS0+c3RlcF9jID0gbF9zdGVwX2M7Ci0JCWxfY3VycmVudF9waS0+c3RlcF9yID0gbF9zdGVwX3I7Ci0JCWxfY3VycmVudF9waS0+c3RlcF9sID0gbF9zdGVwX2w7CisgICAgZm9yIChwaW5vID0gMSA7IHBpbm8gPCBsX2JvdW5kIDsgKytwaW5vKSB7CisgICAgICAgIGxfY3VycmVudF9jb21wID0gbF9jdXJyZW50X3BpLT5jb21wczsKKyAgICAgICAgbF9pbWdfY29tcCA9IHBfaW1hZ2UtPmNvbXBzOworICAgICAgICBsX3RjY3AgPSBsX3RjcC0+dGNjcHM7CiAKLQkJLyogYWxsb2NhdGlvbiBmb3IgY29tcG9uZW50cyBhbmQgbnVtYmVyIG9mIGNvbXBvbmVudHMgaGFzIGFscmVhZHkgYmVlbiBjYWxjdWxhdGVkIGJ5IG9wal9waV9jcmVhdGUgKi8KLQkJZm9yCi0JCQkoY29tcG5vID0gMDsgY29tcG5vIDwgbF9jdXJyZW50X3BpLT5udW1jb21wczsgKytjb21wbm8pCi0JCXsKLQkJCW9wal9waV9yZXNvbHV0aW9uX3QgKmxfcmVzID0gbF9jdXJyZW50X2NvbXAtPnJlc29sdXRpb25zOwotCQkJbF9lbmNvZGluZ192YWx1ZV9wdHIgPSBsX3RtcF9wdHJbY29tcG5vXTsKKyAgICAgICAgbF9jdXJyZW50X3BpLT50eDAgPSBsX3R4MDsKKyAgICAgICAgbF9jdXJyZW50X3BpLT50eTAgPSBsX3R5MDsKKyAgICAgICAgbF9jdXJyZW50X3BpLT50eDEgPSBsX3R4MTsKKyAgICAgICAgbF9jdXJyZW50X3BpLT50eTEgPSBsX3R5MTsKKyAgICAgICAgLypsX2N1cnJlbnRfcGktPmR4ID0gbF9keF9taW47Ki8KKyAgICAgICAgLypsX2N1cnJlbnRfcGktPmR5ID0gbF9keV9taW47Ki8KKyAgICAgICAgbF9jdXJyZW50X3BpLT5zdGVwX3AgPSBsX3N0ZXBfcDsKKyAgICAgICAgbF9jdXJyZW50X3BpLT5zdGVwX2MgPSBsX3N0ZXBfYzsKKyAgICAgICAgbF9jdXJyZW50X3BpLT5zdGVwX3IgPSBsX3N0ZXBfcjsKKyAgICAgICAgbF9jdXJyZW50X3BpLT5zdGVwX2wgPSBsX3N0ZXBfbDsKIAotCQkJbF9jdXJyZW50X2NvbXAtPmR4ID0gbF9pbWdfY29tcC0+ZHg7Ci0JCQlsX2N1cnJlbnRfY29tcC0+ZHkgPSBsX2ltZ19jb21wLT5keTsKLQkJCS8qIHJlc29sdXRpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkICovCi0JCQlmb3IKLQkJCQkocmVzbm8gPSAwOyByZXNubyA8IGxfY3VycmVudF9jb21wLT5udW1yZXNvbHV0aW9uczsgcmVzbm8rKykKLQkJCXsKLQkJCQlsX3Jlcy0+cGR4ID0gKihsX2VuY29kaW5nX3ZhbHVlX3B0cisrKTsKLQkJCQlsX3Jlcy0+cGR5ID0gKihsX2VuY29kaW5nX3ZhbHVlX3B0cisrKTsKLQkJCQlsX3Jlcy0+cHcgPSAgKihsX2VuY29kaW5nX3ZhbHVlX3B0cisrKTsKLQkJCQlsX3Jlcy0+cGggPSAgKihsX2VuY29kaW5nX3ZhbHVlX3B0cisrKTsKLQkJCQkrK2xfcmVzOwotCQkJfQotCQkJKytsX2N1cnJlbnRfY29tcDsKLQkJCSsrbF9pbWdfY29tcDsKLQkJCSsrbF90Y2NwOwotCQl9Ci0JCS8qIHNwZWNpYWwgdHJlYXRtZW50Ki8KLQkJbF9jdXJyZW50X3BpLT5pbmNsdWRlID0gKGxfY3VycmVudF9waS0xKS0+aW5jbHVkZTsKLQkJKytsX2N1cnJlbnRfcGk7Ci0JfQotCW9wal9mcmVlKGxfdG1wX2RhdGEpOwotCWxfdG1wX2RhdGEgPSAwMDsKLQlvcGpfZnJlZShsX3RtcF9wdHIpOwotCWxfdG1wX3B0ciA9IDAwOwotCWlmCi0JCShsX3RjcC0+UE9DKQotCXsKLQkJb3BqX3BpX3VwZGF0ZV9kZWNvZGVfcG9jIChsX3BpLGxfdGNwLGxfbWF4X3ByZWMsbF9tYXhfcmVzKTsKLQl9Ci0JZWxzZQotCXsKLQkJb3BqX3BpX3VwZGF0ZV9kZWNvZGVfbm90X3BvYyhsX3BpLGxfdGNwLGxfbWF4X3ByZWMsbF9tYXhfcmVzKTsKLQl9Ci0JcmV0dXJuIGxfcGk7CisgICAgICAgIC8qIGFsbG9jYXRpb24gZm9yIGNvbXBvbmVudHMgYW5kIG51bWJlciBvZiBjb21wb25lbnRzIGhhcyBhbHJlYWR5IGJlZW4gY2FsY3VsYXRlZCBieSBvcGpfcGlfY3JlYXRlICovCisgICAgICAgIGZvcgorICAgICAgICAoY29tcG5vID0gMDsgY29tcG5vIDwgbnVtY29tcHM7ICsrY29tcG5vKSB7CisgICAgICAgICAgICBvcGpfcGlfcmVzb2x1dGlvbl90ICpsX3JlcyA9IGxfY3VycmVudF9jb21wLT5yZXNvbHV0aW9uczsKKyAgICAgICAgICAgIGxfZW5jb2RpbmdfdmFsdWVfcHRyID0gbF90bXBfcHRyW2NvbXBub107CisKKyAgICAgICAgICAgIGxfY3VycmVudF9jb21wLT5keCA9IGxfaW1nX2NvbXAtPmR4OworICAgICAgICAgICAgbF9jdXJyZW50X2NvbXAtPmR5ID0gbF9pbWdfY29tcC0+ZHk7CisgICAgICAgICAgICAvKiByZXNvbHV0aW9ucyBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCAqLworICAgICAgICAgICAgZm9yCisgICAgICAgICAgICAocmVzbm8gPSAwOyByZXNubyA8IGxfY3VycmVudF9jb21wLT5udW1yZXNvbHV0aW9uczsgcmVzbm8rKykgeworICAgICAgICAgICAgICAgIGxfcmVzLT5wZHggPSAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOworICAgICAgICAgICAgICAgIGxfcmVzLT5wZHkgPSAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOworICAgICAgICAgICAgICAgIGxfcmVzLT5wdyA9ICAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOworICAgICAgICAgICAgICAgIGxfcmVzLT5waCA9ICAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOworICAgICAgICAgICAgICAgICsrbF9yZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2xfY3VycmVudF9jb21wOworICAgICAgICAgICAgKytsX2ltZ19jb21wOworICAgICAgICAgICAgKytsX3RjY3A7CisgICAgICAgIH0KKyAgICAgICAgLyogc3BlY2lhbCB0cmVhdG1lbnQqLworICAgICAgICBsX2N1cnJlbnRfcGktPmluY2x1ZGUgPSAobF9jdXJyZW50X3BpIC0gMSktPmluY2x1ZGU7CisgICAgICAgIGxfY3VycmVudF9waS0+aW5jbHVkZV9zaXplID0gKGxfY3VycmVudF9waSAtIDEpLT5pbmNsdWRlX3NpemU7CisgICAgICAgICsrbF9jdXJyZW50X3BpOworICAgIH0KKyAgICBvcGpfZnJlZShsX3RtcF9kYXRhKTsKKyAgICBsX3RtcF9kYXRhID0gMDA7CisgICAgb3BqX2ZyZWUobF90bXBfcHRyKTsKKyAgICBsX3RtcF9wdHIgPSAwMDsKKyAgICBpZgorICAgIChsX3RjcC0+UE9DKSB7CisgICAgICAgIG9wal9waV91cGRhdGVfZGVjb2RlX3BvYyhsX3BpLCBsX3RjcCwgbF9tYXhfcHJlYywgbF9tYXhfcmVzKTsKKyAgICB9IGVsc2UgeworICAgICAgICBvcGpfcGlfdXBkYXRlX2RlY29kZV9ub3RfcG9jKGxfcGksIGxfdGNwLCBsX21heF9wcmVjLCBsX21heF9yZXMpOworICAgIH0KKyAgICByZXR1cm4gbF9waTsKIH0KIAogCiAKIG9wal9waV9pdGVyYXRvcl90ICpvcGpfcGlfaW5pdGlhbGlzZV9lbmNvZGUoY29uc3Qgb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jcF90ICpwX2NwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSjJLX1QyX01PREUgcF90Ml9tb2RlICkKKyAgICAgICAgb3BqX2NwX3QgKnBfY3AsCisgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLAorICAgICAgICBKMktfVDJfTU9ERSBwX3QyX21vZGUpCiB7Ci0JLyogbG9vcCovCi0JT1BKX1VJTlQzMiBwaW5vOwotCU9QSl9VSU5UMzIgY29tcG5vLCByZXNubzsKKyAgICBPUEpfVUlOVDMyIG51bWNvbXBzID0gcF9pbWFnZS0+bnVtY29tcHM7CiAKLQkvKiB0byBzdG9yZSB3LCBoLCBkeCBhbmQgZHkgZnJvIGFsbCBjb21wb25lbnRzIGFuZCByZXNvbHV0aW9ucyovCi0JT1BKX1VJTlQzMiAqIGxfdG1wX2RhdGE7Ci0JT1BKX1VJTlQzMiAqKiBsX3RtcF9wdHI7CisgICAgLyogbG9vcCovCisgICAgT1BKX1VJTlQzMiBwaW5vOworICAgIE9QSl9VSU5UMzIgY29tcG5vLCByZXNubzsKIAotCS8qIGVuY29kaW5nIHByYW1ldGVycyB0byBzZXQqLwotCU9QSl9VSU5UMzIgbF9tYXhfcmVzOwotCU9QSl9VSU5UMzIgbF9tYXhfcHJlYzsKLQlPUEpfSU5UMzIgbF90eDAsbF90eDEsbF90eTAsbF90eTE7Ci0JT1BKX1VJTlQzMiBsX2R4X21pbixsX2R5X21pbjsKLQlPUEpfVUlOVDMyIGxfYm91bmQ7Ci0JT1BKX1VJTlQzMiBsX3N0ZXBfcCAsIGxfc3RlcF9jICwgbF9zdGVwX3IgLCBsX3N0ZXBfbCA7Ci0JT1BKX1VJTlQzMiBsX2RhdGFfc3RyaWRlOworICAgIC8qIHRvIHN0b3JlIHcsIGgsIGR4IGFuZCBkeSBmcm8gYWxsIGNvbXBvbmVudHMgYW5kIHJlc29sdXRpb25zKi8KKyAgICBPUEpfVUlOVDMyICogbF90bXBfZGF0YTsKKyAgICBPUEpfVUlOVDMyICoqIGxfdG1wX3B0cjsKIAotCS8qIHBvaW50ZXJzKi8KLQlvcGpfcGlfaXRlcmF0b3JfdCAqbF9waSA9IDAwOwotCW9wal90Y3BfdCAqbF90Y3AgPSAwMDsKLQljb25zdCBvcGpfdGNjcF90ICpsX3RjY3AgPSAwMDsKLQlvcGpfcGlfY29tcF90ICpsX2N1cnJlbnRfY29tcCA9IDAwOwotCW9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gMDA7Ci0Jb3BqX3BpX2l0ZXJhdG9yX3QgKiBsX2N1cnJlbnRfcGkgPSAwMDsKLQlPUEpfVUlOVDMyICogbF9lbmNvZGluZ192YWx1ZV9wdHIgPSAwMDsKKyAgICAvKiBlbmNvZGluZyBwcmFtZXRlcnMgdG8gc2V0Ki8KKyAgICBPUEpfVUlOVDMyIGxfbWF4X3JlczsKKyAgICBPUEpfVUlOVDMyIGxfbWF4X3ByZWM7CisgICAgT1BKX0lOVDMyIGxfdHgwLCBsX3R4MSwgbF90eTAsIGxfdHkxOworICAgIE9QSl9VSU5UMzIgbF9keF9taW4sIGxfZHlfbWluOworICAgIE9QSl9VSU5UMzIgbF9ib3VuZDsKKyAgICBPUEpfVUlOVDMyIGxfc3RlcF9wLCBsX3N0ZXBfYywgbF9zdGVwX3IsIGxfc3RlcF9sIDsKKyAgICBPUEpfVUlOVDMyIGxfZGF0YV9zdHJpZGU7CiAKLQkvKiBwcmVjb25kaXRpb25zIGluIGRlYnVnKi8KLQlhc3NlcnQocF9jcCAhPSAwMCk7Ci0JYXNzZXJ0KHBfaW1hZ2UgIT0gMDApOwotCWFzc2VydChwX3RpbGVfbm8gPCBwX2NwLT50dyAqIHBfY3AtPnRoKTsKKyAgICAvKiBwb2ludGVycyovCisgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKmxfcGkgPSAwMDsKKyAgICBvcGpfdGNwX3QgKmxfdGNwID0gMDA7CisgICAgY29uc3Qgb3BqX3RjY3BfdCAqbF90Y2NwID0gMDA7CisgICAgb3BqX3BpX2NvbXBfdCAqbF9jdXJyZW50X2NvbXAgPSAwMDsKKyAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IDAwOworICAgIG9wal9waV9pdGVyYXRvcl90ICogbF9jdXJyZW50X3BpID0gMDA7CisgICAgT1BKX1VJTlQzMiAqIGxfZW5jb2RpbmdfdmFsdWVfcHRyID0gMDA7CiAKLQkvKiBpbml0aWFsaXphdGlvbnMqLwotCWxfdGNwID0gJnBfY3AtPnRjcHNbcF90aWxlX25vXTsKLQlsX2JvdW5kID0gbF90Y3AtPm51bXBvY3MrMTsKKyAgICAvKiBwcmVjb25kaXRpb25zIGluIGRlYnVnKi8KKyAgICBhc3NlcnQocF9jcCAhPSAwMCk7CisgICAgYXNzZXJ0KHBfaW1hZ2UgIT0gMDApOworICAgIGFzc2VydChwX3RpbGVfbm8gPCBwX2NwLT50dyAqIHBfY3AtPnRoKTsKIAotCWxfZGF0YV9zdHJpZGUgPSA0ICogT1BKX0oyS19NQVhSTFZMUzsKLQlsX3RtcF9kYXRhID0gKE9QSl9VSU5UMzIqKW9wal9tYWxsb2MoCi0JCWxfZGF0YV9zdHJpZGUgKiBwX2ltYWdlLT5udW1jb21wcyAqIHNpemVvZihPUEpfVUlOVDMyKSk7Ci0JaWYgKCEgbF90bXBfZGF0YSkgewotCQlyZXR1cm4gMDA7Ci0JfQorICAgIC8qIGluaXRpYWxpemF0aW9ucyovCisgICAgbF90Y3AgPSAmcF9jcC0+dGNwc1twX3RpbGVfbm9dOworICAgIGxfYm91bmQgPSBsX3RjcC0+bnVtcG9jcyArIDE7CiAKLQlsX3RtcF9wdHIgPSAoT1BKX1VJTlQzMioqKW9wal9tYWxsb2MoCi0JCXBfaW1hZ2UtPm51bWNvbXBzICogc2l6ZW9mKE9QSl9VSU5UMzIgKikpOwotCWlmICghIGxfdG1wX3B0cikgewotCQlvcGpfZnJlZShsX3RtcF9kYXRhKTsKLQkJcmV0dXJuIDAwOwotCX0KKyAgICBsX2RhdGFfc3RyaWRlID0gNCAqIE9QSl9KMktfTUFYUkxWTFM7CisgICAgbF90bXBfZGF0YSA9IChPUEpfVUlOVDMyKilvcGpfbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgbF9kYXRhX3N0cmlkZSAqIG51bWNvbXBzICogc2l6ZW9mKE9QSl9VSU5UMzIpKTsKKyAgICBpZiAoISBsX3RtcF9kYXRhKSB7CisgICAgICAgIHJldHVybiAwMDsKKyAgICB9CiAKLQkvKiBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgcGkqLwotCWxfcGkgPSBvcGpfcGlfY3JlYXRlKHBfaW1hZ2UscF9jcCxwX3RpbGVfbm8pOwotCWlmICghbF9waSkgewotCQlvcGpfZnJlZShsX3RtcF9kYXRhKTsKLQkJb3BqX2ZyZWUobF90bXBfcHRyKTsKLQkJcmV0dXJuIDAwOwotCX0KKyAgICBsX3RtcF9wdHIgPSAoT1BKX1VJTlQzMioqKW9wal9tYWxsb2MoCisgICAgICAgICAgICAgICAgICAgIG51bWNvbXBzICogc2l6ZW9mKE9QSl9VSU5UMzIgKikpOworICAgIGlmICghIGxfdG1wX3B0cikgeworICAgICAgICBvcGpfZnJlZShsX3RtcF9kYXRhKTsKKyAgICAgICAgcmV0dXJuIDAwOworICAgIH0KIAotCWxfZW5jb2RpbmdfdmFsdWVfcHRyID0gbF90bXBfZGF0YTsKLQkvKiB1cGRhdGUgcG9pbnRlciBhcnJheSovCi0JZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBwX2ltYWdlLT5udW1jb21wczsgKytjb21wbm8pIHsKLQkJbF90bXBfcHRyW2NvbXBub10gPSBsX2VuY29kaW5nX3ZhbHVlX3B0cjsKLQkJbF9lbmNvZGluZ192YWx1ZV9wdHIgKz0gbF9kYXRhX3N0cmlkZTsKLQl9CisgICAgLyogbWVtb3J5IGFsbG9jYXRpb24gZm9yIHBpKi8KKyAgICBsX3BpID0gb3BqX3BpX2NyZWF0ZShwX2ltYWdlLCBwX2NwLCBwX3RpbGVfbm8pOworICAgIGlmICghbF9waSkgeworICAgICAgICBvcGpfZnJlZShsX3RtcF9kYXRhKTsKKyAgICAgICAgb3BqX2ZyZWUobF90bXBfcHRyKTsKKyAgICAgICAgcmV0dXJuIDAwOworICAgIH0KIAotCS8qIGdldCBlbmNvZGluZyBwYXJhbWV0ZXJzKi8KLQlvcGpfZ2V0X2FsbF9lbmNvZGluZ19wYXJhbWV0ZXJzKHBfaW1hZ2UscF9jcCxwX3RpbGVfbm8sJmxfdHgwLCZsX3R4MSwmbF90eTAsJmxfdHkxLCZsX2R4X21pbiwmbF9keV9taW4sJmxfbWF4X3ByZWMsJmxfbWF4X3JlcyxsX3RtcF9wdHIpOworICAgIGxfZW5jb2RpbmdfdmFsdWVfcHRyID0gbF90bXBfZGF0YTsKKyAgICAvKiB1cGRhdGUgcG9pbnRlciBhcnJheSovCisgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBudW1jb21wczsgKytjb21wbm8pIHsKKyAgICAgICAgbF90bXBfcHRyW2NvbXBub10gPSBsX2VuY29kaW5nX3ZhbHVlX3B0cjsKKyAgICAgICAgbF9lbmNvZGluZ192YWx1ZV9wdHIgKz0gbF9kYXRhX3N0cmlkZTsKKyAgICB9CiAKLQkvKiBzdGVwIGNhbGN1bGF0aW9ucyovCi0JbF9zdGVwX3AgPSAxOwotCWxfc3RlcF9jID0gbF9tYXhfcHJlYyAqIGxfc3RlcF9wOwotCWxfc3RlcF9yID0gcF9pbWFnZS0+bnVtY29tcHMgKiBsX3N0ZXBfYzsKLQlsX3N0ZXBfbCA9IGxfbWF4X3JlcyAqIGxfc3RlcF9yOworICAgIC8qIGdldCBlbmNvZGluZyBwYXJhbWV0ZXJzKi8KKyAgICBvcGpfZ2V0X2FsbF9lbmNvZGluZ19wYXJhbWV0ZXJzKHBfaW1hZ2UsIHBfY3AsIHBfdGlsZV9ubywgJmxfdHgwLCAmbF90eDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF90eTAsICZsX3R5MSwgJmxfZHhfbWluLCAmbF9keV9taW4sICZsX21heF9wcmVjLCAmbF9tYXhfcmVzLCBsX3RtcF9wdHIpOwogCi0JLyogc2V0IHZhbHVlcyBmb3IgZmlyc3QgcGFja2V0IGl0ZXJhdG9yKi8KLQlsX3BpLT50cF9vbiA9IChPUEpfQllURSlwX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fdHBfb247Ci0JbF9jdXJyZW50X3BpID0gbF9waTsKKyAgICAvKiBzdGVwIGNhbGN1bGF0aW9ucyovCisgICAgbF9zdGVwX3AgPSAxOworICAgIGxfc3RlcF9jID0gbF9tYXhfcHJlYyAqIGxfc3RlcF9wOworICAgIGxfc3RlcF9yID0gbnVtY29tcHMgKiBsX3N0ZXBfYzsKKyAgICBsX3N0ZXBfbCA9IGxfbWF4X3JlcyAqIGxfc3RlcF9yOwogCi0JLyogbWVtb3J5IGFsbG9jYXRpb24gZm9yIGluY2x1ZGUqLwotCWxfY3VycmVudF9waS0+aW5jbHVkZSA9IChPUEpfSU5UMTYqKSBvcGpfY2FsbG9jKGxfdGNwLT5udW1sYXllcnMgKiBsX3N0ZXBfbCwgc2l6ZW9mKE9QSl9JTlQxNikpOwotCWlmICghbF9jdXJyZW50X3BpLT5pbmNsdWRlKSB7Ci0JCW9wal9mcmVlKGxfdG1wX2RhdGEpOwotCQlvcGpfZnJlZShsX3RtcF9wdHIpOwotCQlvcGpfcGlfZGVzdHJveShsX3BpLCBsX2JvdW5kKTsKLQkJcmV0dXJuIDAwOwotCX0KKyAgICAvKiBzZXQgdmFsdWVzIGZvciBmaXJzdCBwYWNrZXQgaXRlcmF0b3IqLworICAgIGxfcGktPnRwX29uID0gKE9QSl9CWVRFKXBfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV90cF9vbjsKKyAgICBsX2N1cnJlbnRfcGkgPSBsX3BpOwogCi0JLyogc3BlY2lhbCB0cmVhdG1lbnQgZm9yIHRoZSBmaXJzdCBwYWNrZXQgaXRlcmF0b3IqLwotCWxfY3VycmVudF9jb21wID0gbF9jdXJyZW50X3BpLT5jb21wczsKLQlsX2ltZ19jb21wID0gcF9pbWFnZS0+Y29tcHM7Ci0JbF90Y2NwID0gbF90Y3AtPnRjY3BzOwotCWxfY3VycmVudF9waS0+dHgwID0gbF90eDA7Ci0JbF9jdXJyZW50X3BpLT50eTAgPSBsX3R5MDsKLQlsX2N1cnJlbnRfcGktPnR4MSA9IGxfdHgxOwotCWxfY3VycmVudF9waS0+dHkxID0gbF90eTE7Ci0JbF9jdXJyZW50X3BpLT5keCA9IGxfZHhfbWluOwotCWxfY3VycmVudF9waS0+ZHkgPSBsX2R5X21pbjsKLQlsX2N1cnJlbnRfcGktPnN0ZXBfcCA9IGxfc3RlcF9wOwotCWxfY3VycmVudF9waS0+c3RlcF9jID0gbF9zdGVwX2M7Ci0JbF9jdXJyZW50X3BpLT5zdGVwX3IgPSBsX3N0ZXBfcjsKLQlsX2N1cnJlbnRfcGktPnN0ZXBfbCA9IGxfc3RlcF9sOworICAgIC8qIG1lbW9yeSBhbGxvY2F0aW9uIGZvciBpbmNsdWRlKi8KKyAgICBsX2N1cnJlbnRfcGktPmluY2x1ZGVfc2l6ZSA9IGxfdGNwLT5udW1sYXllcnMgKiBsX3N0ZXBfbDsKKyAgICBsX2N1cnJlbnRfcGktPmluY2x1ZGUgPSAoT1BKX0lOVDE2Kikgb3BqX2NhbGxvYyhsX2N1cnJlbnRfcGktPmluY2x1ZGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoT1BKX0lOVDE2KSk7CisgICAgaWYgKCFsX2N1cnJlbnRfcGktPmluY2x1ZGUpIHsKKyAgICAgICAgb3BqX2ZyZWUobF90bXBfZGF0YSk7CisgICAgICAgIG9wal9mcmVlKGxfdG1wX3B0cik7CisgICAgICAgIG9wal9waV9kZXN0cm95KGxfcGksIGxfYm91bmQpOworICAgICAgICByZXR1cm4gMDA7CisgICAgfQogCi0JLyogYWxsb2NhdGlvbiBmb3IgY29tcG9uZW50cyBhbmQgbnVtYmVyIG9mIGNvbXBvbmVudHMgaGFzIGFscmVhZHkgYmVlbiBjYWxjdWxhdGVkIGJ5IG9wal9waV9jcmVhdGUgKi8KLQlmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IGxfY3VycmVudF9waS0+bnVtY29tcHM7ICsrY29tcG5vKSB7Ci0JCW9wal9waV9yZXNvbHV0aW9uX3QgKmxfcmVzID0gbF9jdXJyZW50X2NvbXAtPnJlc29sdXRpb25zOwotCQlsX2VuY29kaW5nX3ZhbHVlX3B0ciA9IGxfdG1wX3B0cltjb21wbm9dOworICAgIC8qIHNwZWNpYWwgdHJlYXRtZW50IGZvciB0aGUgZmlyc3QgcGFja2V0IGl0ZXJhdG9yKi8KKyAgICBsX2N1cnJlbnRfY29tcCA9IGxfY3VycmVudF9waS0+Y29tcHM7CisgICAgbF9pbWdfY29tcCA9IHBfaW1hZ2UtPmNvbXBzOworICAgIGxfdGNjcCA9IGxfdGNwLT50Y2NwczsKKyAgICBsX2N1cnJlbnRfcGktPnR4MCA9IGxfdHgwOworICAgIGxfY3VycmVudF9waS0+dHkwID0gbF90eTA7CisgICAgbF9jdXJyZW50X3BpLT50eDEgPSBsX3R4MTsKKyAgICBsX2N1cnJlbnRfcGktPnR5MSA9IGxfdHkxOworICAgIGxfY3VycmVudF9waS0+ZHggPSBsX2R4X21pbjsKKyAgICBsX2N1cnJlbnRfcGktPmR5ID0gbF9keV9taW47CisgICAgbF9jdXJyZW50X3BpLT5zdGVwX3AgPSBsX3N0ZXBfcDsKKyAgICBsX2N1cnJlbnRfcGktPnN0ZXBfYyA9IGxfc3RlcF9jOworICAgIGxfY3VycmVudF9waS0+c3RlcF9yID0gbF9zdGVwX3I7CisgICAgbF9jdXJyZW50X3BpLT5zdGVwX2wgPSBsX3N0ZXBfbDsKIAotCQlsX2N1cnJlbnRfY29tcC0+ZHggPSBsX2ltZ19jb21wLT5keDsKLQkJbF9jdXJyZW50X2NvbXAtPmR5ID0gbF9pbWdfY29tcC0+ZHk7CisgICAgLyogYWxsb2NhdGlvbiBmb3IgY29tcG9uZW50cyBhbmQgbnVtYmVyIG9mIGNvbXBvbmVudHMgaGFzIGFscmVhZHkgYmVlbiBjYWxjdWxhdGVkIGJ5IG9wal9waV9jcmVhdGUgKi8KKyAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IG51bWNvbXBzOyArK2NvbXBubykgeworICAgICAgICBvcGpfcGlfcmVzb2x1dGlvbl90ICpsX3JlcyA9IGxfY3VycmVudF9jb21wLT5yZXNvbHV0aW9uczsKKyAgICAgICAgbF9lbmNvZGluZ192YWx1ZV9wdHIgPSBsX3RtcF9wdHJbY29tcG5vXTsKIAotCQkvKiByZXNvbHV0aW9ucyBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCAqLwotCQlmb3IgKHJlc25vID0gMDsgcmVzbm8gPCBsX2N1cnJlbnRfY29tcC0+bnVtcmVzb2x1dGlvbnM7IHJlc25vKyspIHsKLQkJCWxfcmVzLT5wZHggPSAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOwotCQkJbF9yZXMtPnBkeSA9ICoobF9lbmNvZGluZ192YWx1ZV9wdHIrKyk7Ci0JCQlsX3Jlcy0+cHcgPSAgKihsX2VuY29kaW5nX3ZhbHVlX3B0cisrKTsKLQkJCWxfcmVzLT5waCA9ICAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOwotCQkJKytsX3JlczsKLQkJfQorICAgICAgICBsX2N1cnJlbnRfY29tcC0+ZHggPSBsX2ltZ19jb21wLT5keDsKKyAgICAgICAgbF9jdXJyZW50X2NvbXAtPmR5ID0gbF9pbWdfY29tcC0+ZHk7CiAKLQkJKytsX2N1cnJlbnRfY29tcDsKLQkJKytsX2ltZ19jb21wOwotCQkrK2xfdGNjcDsKLQl9Ci0JKytsX2N1cnJlbnRfcGk7CisgICAgICAgIC8qIHJlc29sdXRpb25zIGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkICovCisgICAgICAgIGZvciAocmVzbm8gPSAwOyByZXNubyA8IGxfY3VycmVudF9jb21wLT5udW1yZXNvbHV0aW9uczsgcmVzbm8rKykgeworICAgICAgICAgICAgbF9yZXMtPnBkeCA9ICoobF9lbmNvZGluZ192YWx1ZV9wdHIrKyk7CisgICAgICAgICAgICBsX3Jlcy0+cGR5ID0gKihsX2VuY29kaW5nX3ZhbHVlX3B0cisrKTsKKyAgICAgICAgICAgIGxfcmVzLT5wdyA9ICAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOworICAgICAgICAgICAgbF9yZXMtPnBoID0gICoobF9lbmNvZGluZ192YWx1ZV9wdHIrKyk7CisgICAgICAgICAgICArK2xfcmVzOworICAgICAgICB9CiAKLQlmb3IgKHBpbm8gPSAxIDsgcGlubzxsX2JvdW5kIDsgKytwaW5vICkgewotCQlsX2N1cnJlbnRfY29tcCA9IGxfY3VycmVudF9waS0+Y29tcHM7Ci0JCWxfaW1nX2NvbXAgPSBwX2ltYWdlLT5jb21wczsKLQkJbF90Y2NwID0gbF90Y3AtPnRjY3BzOworICAgICAgICArK2xfY3VycmVudF9jb21wOworICAgICAgICArK2xfaW1nX2NvbXA7CisgICAgICAgICsrbF90Y2NwOworICAgIH0KKyAgICArK2xfY3VycmVudF9waTsKIAotCQlsX2N1cnJlbnRfcGktPnR4MCA9IGxfdHgwOwotCQlsX2N1cnJlbnRfcGktPnR5MCA9IGxfdHkwOwotCQlsX2N1cnJlbnRfcGktPnR4MSA9IGxfdHgxOwotCQlsX2N1cnJlbnRfcGktPnR5MSA9IGxfdHkxOwotCQlsX2N1cnJlbnRfcGktPmR4ID0gbF9keF9taW47Ci0JCWxfY3VycmVudF9waS0+ZHkgPSBsX2R5X21pbjsKLQkJbF9jdXJyZW50X3BpLT5zdGVwX3AgPSBsX3N0ZXBfcDsKLQkJbF9jdXJyZW50X3BpLT5zdGVwX2MgPSBsX3N0ZXBfYzsKLQkJbF9jdXJyZW50X3BpLT5zdGVwX3IgPSBsX3N0ZXBfcjsKLQkJbF9jdXJyZW50X3BpLT5zdGVwX2wgPSBsX3N0ZXBfbDsKKyAgICBmb3IgKHBpbm8gPSAxIDsgcGlubyA8IGxfYm91bmQgOyArK3Bpbm8pIHsKKyAgICAgICAgbF9jdXJyZW50X2NvbXAgPSBsX2N1cnJlbnRfcGktPmNvbXBzOworICAgICAgICBsX2ltZ19jb21wID0gcF9pbWFnZS0+Y29tcHM7CisgICAgICAgIGxfdGNjcCA9IGxfdGNwLT50Y2NwczsKIAotCQkvKiBhbGxvY2F0aW9uIGZvciBjb21wb25lbnRzIGFuZCBudW1iZXIgb2YgY29tcG9uZW50cyBoYXMgYWxyZWFkeSBiZWVuIGNhbGN1bGF0ZWQgYnkgb3BqX3BpX2NyZWF0ZSAqLwotCQlmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IGxfY3VycmVudF9waS0+bnVtY29tcHM7ICsrY29tcG5vKSB7Ci0JCQlvcGpfcGlfcmVzb2x1dGlvbl90ICpsX3JlcyA9IGxfY3VycmVudF9jb21wLT5yZXNvbHV0aW9uczsKLQkJCWxfZW5jb2RpbmdfdmFsdWVfcHRyID0gbF90bXBfcHRyW2NvbXBub107CisgICAgICAgIGxfY3VycmVudF9waS0+dHgwID0gbF90eDA7CisgICAgICAgIGxfY3VycmVudF9waS0+dHkwID0gbF90eTA7CisgICAgICAgIGxfY3VycmVudF9waS0+dHgxID0gbF90eDE7CisgICAgICAgIGxfY3VycmVudF9waS0+dHkxID0gbF90eTE7CisgICAgICAgIGxfY3VycmVudF9waS0+ZHggPSBsX2R4X21pbjsKKyAgICAgICAgbF9jdXJyZW50X3BpLT5keSA9IGxfZHlfbWluOworICAgICAgICBsX2N1cnJlbnRfcGktPnN0ZXBfcCA9IGxfc3RlcF9wOworICAgICAgICBsX2N1cnJlbnRfcGktPnN0ZXBfYyA9IGxfc3RlcF9jOworICAgICAgICBsX2N1cnJlbnRfcGktPnN0ZXBfciA9IGxfc3RlcF9yOworICAgICAgICBsX2N1cnJlbnRfcGktPnN0ZXBfbCA9IGxfc3RlcF9sOwogCi0JCQlsX2N1cnJlbnRfY29tcC0+ZHggPSBsX2ltZ19jb21wLT5keDsKLQkJCWxfY3VycmVudF9jb21wLT5keSA9IGxfaW1nX2NvbXAtPmR5OwotCQkJLyogcmVzb2x1dGlvbnMgaGF2ZSBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgKi8KLQkJCWZvciAocmVzbm8gPSAwOyByZXNubyA8IGxfY3VycmVudF9jb21wLT5udW1yZXNvbHV0aW9uczsgcmVzbm8rKykgewotCQkJCWxfcmVzLT5wZHggPSAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOwotCQkJCWxfcmVzLT5wZHkgPSAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOwotCQkJCWxfcmVzLT5wdyA9ICAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOwotCQkJCWxfcmVzLT5waCA9ICAqKGxfZW5jb2RpbmdfdmFsdWVfcHRyKyspOwotCQkJCSsrbF9yZXM7Ci0JCQl9Ci0JCQkrK2xfY3VycmVudF9jb21wOwotCQkJKytsX2ltZ19jb21wOwotCQkJKytsX3RjY3A7Ci0JCX0KKyAgICAgICAgLyogYWxsb2NhdGlvbiBmb3IgY29tcG9uZW50cyBhbmQgbnVtYmVyIG9mIGNvbXBvbmVudHMgaGFzIGFscmVhZHkgYmVlbiBjYWxjdWxhdGVkIGJ5IG9wal9waV9jcmVhdGUgKi8KKyAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBudW1jb21wczsgKytjb21wbm8pIHsKKyAgICAgICAgICAgIG9wal9waV9yZXNvbHV0aW9uX3QgKmxfcmVzID0gbF9jdXJyZW50X2NvbXAtPnJlc29sdXRpb25zOworICAgICAgICAgICAgbF9lbmNvZGluZ192YWx1ZV9wdHIgPSBsX3RtcF9wdHJbY29tcG5vXTsKIAotCQkvKiBzcGVjaWFsIHRyZWF0bWVudCovCi0JCWxfY3VycmVudF9waS0+aW5jbHVkZSA9IChsX2N1cnJlbnRfcGktMSktPmluY2x1ZGU7Ci0JCSsrbF9jdXJyZW50X3BpOwotCX0KKyAgICAgICAgICAgIGxfY3VycmVudF9jb21wLT5keCA9IGxfaW1nX2NvbXAtPmR4OworICAgICAgICAgICAgbF9jdXJyZW50X2NvbXAtPmR5ID0gbF9pbWdfY29tcC0+ZHk7CisgICAgICAgICAgICAvKiByZXNvbHV0aW9ucyBoYXZlIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCAqLworICAgICAgICAgICAgZm9yIChyZXNubyA9IDA7IHJlc25vIDwgbF9jdXJyZW50X2NvbXAtPm51bXJlc29sdXRpb25zOyByZXNubysrKSB7CisgICAgICAgICAgICAgICAgbF9yZXMtPnBkeCA9ICoobF9lbmNvZGluZ192YWx1ZV9wdHIrKyk7CisgICAgICAgICAgICAgICAgbF9yZXMtPnBkeSA9ICoobF9lbmNvZGluZ192YWx1ZV9wdHIrKyk7CisgICAgICAgICAgICAgICAgbF9yZXMtPnB3ID0gICoobF9lbmNvZGluZ192YWx1ZV9wdHIrKyk7CisgICAgICAgICAgICAgICAgbF9yZXMtPnBoID0gICoobF9lbmNvZGluZ192YWx1ZV9wdHIrKyk7CisgICAgICAgICAgICAgICAgKytsX3JlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrbF9jdXJyZW50X2NvbXA7CisgICAgICAgICAgICArK2xfaW1nX2NvbXA7CisgICAgICAgICAgICArK2xfdGNjcDsKKyAgICAgICAgfQogCi0Jb3BqX2ZyZWUobF90bXBfZGF0YSk7Ci0JbF90bXBfZGF0YSA9IDAwOwotCW9wal9mcmVlKGxfdG1wX3B0cik7Ci0JbF90bXBfcHRyID0gMDA7CisgICAgICAgIC8qIHNwZWNpYWwgdHJlYXRtZW50Ki8KKyAgICAgICAgbF9jdXJyZW50X3BpLT5pbmNsdWRlID0gKGxfY3VycmVudF9waSAtIDEpLT5pbmNsdWRlOworICAgICAgICBsX2N1cnJlbnRfcGktPmluY2x1ZGVfc2l6ZSA9IChsX2N1cnJlbnRfcGkgLSAxKS0+aW5jbHVkZV9zaXplOworICAgICAgICArK2xfY3VycmVudF9waTsKKyAgICB9CisKKyAgICBvcGpfZnJlZShsX3RtcF9kYXRhKTsKKyAgICBsX3RtcF9kYXRhID0gMDA7CisgICAgb3BqX2ZyZWUobF90bXBfcHRyKTsKKyAgICBsX3RtcF9wdHIgPSAwMDsKIAogICAgIGlmIChsX3RjcC0+UE9DICYmIChPUEpfSVNfQ0lORU1BKHBfY3AtPnJzaXopIHx8IHBfdDJfbW9kZSA9PSBGSU5BTF9QQVNTKSkgewotCQlvcGpfcGlfdXBkYXRlX2VuY29kZV9wb2NfYW5kX2ZpbmFsKHBfY3AscF90aWxlX25vLGxfdHgwLGxfdHgxLGxfdHkwLGxfdHkxLGxfbWF4X3ByZWMsbF9tYXhfcmVzLGxfZHhfbWluLGxfZHlfbWluKTsKLQl9Ci0JZWxzZSB7Ci0JCW9wal9waV91cGRhdGVfZW5jb2RlX25vdF9wb2MocF9jcCxwX2ltYWdlLT5udW1jb21wcyxwX3RpbGVfbm8sbF90eDAsbF90eDEsbF90eTAsbF90eTEsbF9tYXhfcHJlYyxsX21heF9yZXMsbF9keF9taW4sbF9keV9taW4pOwotCX0KKyAgICAgICAgb3BqX3BpX3VwZGF0ZV9lbmNvZGVfcG9jX2FuZF9maW5hbChwX2NwLCBwX3RpbGVfbm8sIGxfdHgwLCBsX3R4MSwgbF90eTAsIGxfdHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbWF4X3ByZWMsIGxfbWF4X3JlcywgbF9keF9taW4sIGxfZHlfbWluKTsKKyAgICB9IGVsc2UgeworICAgICAgICBvcGpfcGlfdXBkYXRlX2VuY29kZV9ub3RfcG9jKHBfY3AsIG51bWNvbXBzLCBwX3RpbGVfbm8sIGxfdHgwLCBsX3R4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3R5MCwgbF90eTEsIGxfbWF4X3ByZWMsIGxfbWF4X3JlcywgbF9keF9taW4sIGxfZHlfbWluKTsKKyAgICB9CiAKLQlyZXR1cm4gbF9waTsKKyAgICByZXR1cm4gbF9waTsKIH0KIAotdm9pZCBvcGpfcGlfY3JlYXRlX2VuY29kZSggCW9wal9waV9pdGVyYXRvcl90ICpwaSwKLQkJCQkJCQlvcGpfY3BfdCAqY3AsCi0JCQkJCQkJT1BKX1VJTlQzMiB0aWxlbm8sCi0JCQkJCQkJT1BKX1VJTlQzMiBwaW5vLAotCQkJCQkJCU9QSl9VSU5UMzIgdHBudW0sCi0JCQkJCQkJT1BKX0lOVDMyIHRwcG9zLAotCQkJCQkJCUoyS19UMl9NT0RFIHQyX21vZGUpCit2b2lkIG9wal9waV9jcmVhdGVfZW5jb2RlKG9wal9waV9pdGVyYXRvcl90ICpwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwX3QgKmNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRpbGVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwaW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRwbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgdHBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEoyS19UMl9NT0RFIHQyX21vZGUpCiB7Ci0JY29uc3QgT1BKX0NIQVIgKnByb2c7Ci0JT1BKX0lOVDMyIGk7Ci0JT1BKX1VJTlQzMiBpbmNyX3RvcD0xLHJlc2V0WD0wOwotCW9wal90Y3BfdCAqdGNwcyA9JmNwLT50Y3BzW3RpbGVub107Ci0Jb3BqX3BvY190ICp0Y3A9ICZ0Y3BzLT5wb2NzW3Bpbm9dOworICAgIGNvbnN0IE9QSl9DSEFSICpwcm9nOworICAgIE9QSl9JTlQzMiBpOworICAgIE9QSl9VSU5UMzIgaW5jcl90b3AgPSAxLCByZXNldFggPSAwOworICAgIG9wal90Y3BfdCAqdGNwcyA9ICZjcC0+dGNwc1t0aWxlbm9dOworICAgIG9wal9wb2NfdCAqdGNwID0gJnRjcHMtPnBvY3NbcGlub107CiAKLQlwcm9nID0gb3BqX2oya19jb252ZXJ0X3Byb2dyZXNzaW9uX29yZGVyKHRjcC0+cHJnKTsKKyAgICBwcm9nID0gb3BqX2oya19jb252ZXJ0X3Byb2dyZXNzaW9uX29yZGVyKHRjcC0+cHJnKTsKIAotCXBpW3Bpbm9dLmZpcnN0ID0gMTsKLQlwaVtwaW5vXS5wb2MucHJnID0gdGNwLT5wcmc7CisgICAgcGlbcGlub10uZmlyc3QgPSAxOworICAgIHBpW3Bpbm9dLnBvYy5wcmcgPSB0Y3AtPnByZzsKIAotICAgIGlmKCEoY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV90cF9vbiAmJiAoKCFPUEpfSVNfQ0lORU1BKGNwLT5yc2l6KSAmJiAodDJfbW9kZSA9PSBGSU5BTF9QQVNTKSkgfHwgT1BKX0lTX0NJTkVNQShjcC0+cnNpeikpKSl7Ci0JCXBpW3Bpbm9dLnBvYy5yZXNubzAgPSB0Y3AtPnJlc1M7Ci0JCXBpW3Bpbm9dLnBvYy5yZXNubzEgPSB0Y3AtPnJlc0U7Ci0JCXBpW3Bpbm9dLnBvYy5jb21wbm8wID0gdGNwLT5jb21wUzsKLQkJcGlbcGlub10ucG9jLmNvbXBubzEgPSB0Y3AtPmNvbXBFOwotCQlwaVtwaW5vXS5wb2MubGF5bm8wID0gdGNwLT5sYXlTOwotCQlwaVtwaW5vXS5wb2MubGF5bm8xID0gdGNwLT5sYXlFOwotCQlwaVtwaW5vXS5wb2MucHJlY25vMCA9IHRjcC0+cHJjUzsKLQkJcGlbcGlub10ucG9jLnByZWNubzEgPSB0Y3AtPnByY0U7Ci0JCXBpW3Bpbm9dLnBvYy50eDAgPSAoT1BKX0lOVDMyKXRjcC0+dHhTOwotCQlwaVtwaW5vXS5wb2MudHkwID0gKE9QSl9JTlQzMil0Y3AtPnR5UzsKLQkJcGlbcGlub10ucG9jLnR4MSA9IChPUEpfSU5UMzIpdGNwLT50eEU7Ci0JCXBpW3Bpbm9dLnBvYy50eTEgPSAoT1BKX0lOVDMyKXRjcC0+dHlFOwotCX1lbHNlIHsKLQkJZm9yKGk9dHBwb3MrMTtpPDQ7aSsrKXsKLQkJCXN3aXRjaChwcm9nW2ldKXsKLQkJCWNhc2UgJ1InOgotCQkJCXBpW3Bpbm9dLnBvYy5yZXNubzAgPSB0Y3AtPnJlc1M7Ci0JCQkJcGlbcGlub10ucG9jLnJlc25vMSA9IHRjcC0+cmVzRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgJ0MnOgotCQkJCXBpW3Bpbm9dLnBvYy5jb21wbm8wID0gdGNwLT5jb21wUzsKLQkJCQlwaVtwaW5vXS5wb2MuY29tcG5vMSA9IHRjcC0+Y29tcEU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdMJzoKLQkJCQlwaVtwaW5vXS5wb2MubGF5bm8wID0gdGNwLT5sYXlTOwotCQkJCXBpW3Bpbm9dLnBvYy5sYXlubzEgPSB0Y3AtPmxheUU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlICdQJzoKLQkJCQlzd2l0Y2godGNwLT5wcmcpewotCQkJCWNhc2UgT1BKX0xSQ1A6Ci0JCQkJY2FzZSBPUEpfUkxDUDoKLQkJCQkJcGlbcGlub10ucG9jLnByZWNubzAgPSB0Y3AtPnByY1M7Ci0JCQkJCXBpW3Bpbm9dLnBvYy5wcmVjbm8xID0gdGNwLT5wcmNFOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlwaVtwaW5vXS5wb2MudHgwID0gKE9QSl9JTlQzMil0Y3AtPnR4UzsKLQkJCQkJcGlbcGlub10ucG9jLnR5MCA9IChPUEpfSU5UMzIpdGNwLT50eVM7Ci0JCQkJCXBpW3Bpbm9dLnBvYy50eDEgPSAoT1BKX0lOVDMyKXRjcC0+dHhFOwotCQkJCQlwaVtwaW5vXS5wb2MudHkxID0gKE9QSl9JTlQzMil0Y3AtPnR5RTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9CisgICAgaWYgKCEoY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV90cF9vbiAmJiAoKCFPUEpfSVNfQ0lORU1BKGNwLT5yc2l6KSAmJgorICAgICAgICAgICAgKHQyX21vZGUgPT0gRklOQUxfUEFTUykpIHx8IE9QSl9JU19DSU5FTUEoY3AtPnJzaXopKSkpIHsKKyAgICAgICAgcGlbcGlub10ucG9jLnJlc25vMCA9IHRjcC0+cmVzUzsKKyAgICAgICAgcGlbcGlub10ucG9jLnJlc25vMSA9IHRjcC0+cmVzRTsKKyAgICAgICAgcGlbcGlub10ucG9jLmNvbXBubzAgPSB0Y3AtPmNvbXBTOworICAgICAgICBwaVtwaW5vXS5wb2MuY29tcG5vMSA9IHRjcC0+Y29tcEU7CisgICAgICAgIHBpW3Bpbm9dLnBvYy5sYXlubzAgPSB0Y3AtPmxheVM7CisgICAgICAgIHBpW3Bpbm9dLnBvYy5sYXlubzEgPSB0Y3AtPmxheUU7CisgICAgICAgIHBpW3Bpbm9dLnBvYy5wcmVjbm8wID0gdGNwLT5wcmNTOworICAgICAgICBwaVtwaW5vXS5wb2MucHJlY25vMSA9IHRjcC0+cHJjRTsKKyAgICAgICAgcGlbcGlub10ucG9jLnR4MCA9IChPUEpfSU5UMzIpdGNwLT50eFM7CisgICAgICAgIHBpW3Bpbm9dLnBvYy50eTAgPSAoT1BKX0lOVDMyKXRjcC0+dHlTOworICAgICAgICBwaVtwaW5vXS5wb2MudHgxID0gKE9QSl9JTlQzMil0Y3AtPnR4RTsKKyAgICAgICAgcGlbcGlub10ucG9jLnR5MSA9IChPUEpfSU5UMzIpdGNwLT50eUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yIChpID0gdHBwb3MgKyAxOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHByb2dbaV0pIHsKKyAgICAgICAgICAgIGNhc2UgJ1InOgorICAgICAgICAgICAgICAgIHBpW3Bpbm9dLnBvYy5yZXNubzAgPSB0Y3AtPnJlc1M7CisgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLnJlc25vMSA9IHRjcC0+cmVzRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgICAgIHBpW3Bpbm9dLnBvYy5jb21wbm8wID0gdGNwLT5jb21wUzsKKyAgICAgICAgICAgICAgICBwaVtwaW5vXS5wb2MuY29tcG5vMSA9IHRjcC0+Y29tcEU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdMJzoKKyAgICAgICAgICAgICAgICBwaVtwaW5vXS5wb2MubGF5bm8wID0gdGNwLT5sYXlTOworICAgICAgICAgICAgICAgIHBpW3Bpbm9dLnBvYy5sYXlubzEgPSB0Y3AtPmxheUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHRjcC0+cHJnKSB7CisgICAgICAgICAgICAgICAgY2FzZSBPUEpfTFJDUDoKKyAgICAgICAgICAgICAgICBjYXNlIE9QSl9STENQOgorICAgICAgICAgICAgICAgICAgICBwaVtwaW5vXS5wb2MucHJlY25vMCA9IHRjcC0+cHJjUzsKKyAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLnByZWNubzEgPSB0Y3AtPnByY0U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHBpW3Bpbm9dLnBvYy50eDAgPSAoT1BKX0lOVDMyKXRjcC0+dHhTOworICAgICAgICAgICAgICAgICAgICBwaVtwaW5vXS5wb2MudHkwID0gKE9QSl9JTlQzMil0Y3AtPnR5UzsKKyAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLnR4MSA9IChPUEpfSU5UMzIpdGNwLT50eEU7CisgICAgICAgICAgICAgICAgICAgIHBpW3Bpbm9dLnBvYy50eTEgPSAoT1BKX0lOVDMyKXRjcC0+dHlFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlpZih0cG51bT09MCl7Ci0JCQlmb3IoaT10cHBvcztpPj0wO2ktLSl7Ci0JCQkJc3dpdGNoKHByb2dbaV0pewotCQkJCWNhc2UgJ0MnOgotCQkJCQl0Y3AtPmNvbXBfdCA9IHRjcC0+Y29tcFM7Ci0JCQkJCXBpW3Bpbm9dLnBvYy5jb21wbm8wID0gdGNwLT5jb21wX3Q7Ci0JCQkJCXBpW3Bpbm9dLnBvYy5jb21wbm8xID0gdGNwLT5jb21wX3QrMTsKLQkJCQkJdGNwLT5jb21wX3QrPTE7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1InOgotCQkJCQl0Y3AtPnJlc190ID0gdGNwLT5yZXNTOwotCQkJCQlwaVtwaW5vXS5wb2MucmVzbm8wID0gdGNwLT5yZXNfdDsKLQkJCQkJcGlbcGlub10ucG9jLnJlc25vMSA9IHRjcC0+cmVzX3QrMTsKLQkJCQkJdGNwLT5yZXNfdCs9MTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnTCc6Ci0JCQkJCXRjcC0+bGF5X3QgPSB0Y3AtPmxheVM7Ci0JCQkJCXBpW3Bpbm9dLnBvYy5sYXlubzAgPSB0Y3AtPmxheV90OwotCQkJCQlwaVtwaW5vXS5wb2MubGF5bm8xID0gdGNwLT5sYXlfdCsxOwotCQkJCQl0Y3AtPmxheV90Kz0xOwotCQkJCQlicmVhazsKLQkJCQljYXNlICdQJzoKLQkJCQkJc3dpdGNoKHRjcC0+cHJnKXsKLQkJCQkJY2FzZSBPUEpfTFJDUDoKLQkJCQkJY2FzZSBPUEpfUkxDUDoKLQkJCQkJCXRjcC0+cHJjX3QgPSB0Y3AtPnByY1M7Ci0JCQkJCQlwaVtwaW5vXS5wb2MucHJlY25vMCA9IHRjcC0+cHJjX3Q7Ci0JCQkJCQlwaVtwaW5vXS5wb2MucHJlY25vMSA9IHRjcC0+cHJjX3QrMTsKLQkJCQkJCXRjcC0+cHJjX3QrPTE7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCXRjcC0+dHgwX3QgPSB0Y3AtPnR4UzsKLQkJCQkJCXRjcC0+dHkwX3QgPSB0Y3AtPnR5UzsKLQkJCQkJCXBpW3Bpbm9dLnBvYy50eDAgPSAoT1BKX0lOVDMyKXRjcC0+dHgwX3Q7Ci0JCQkJCQlwaVtwaW5vXS5wb2MudHgxID0gKE9QSl9JTlQzMikodGNwLT50eDBfdCArIHRjcC0+ZHggLSAodGNwLT50eDBfdCAlIHRjcC0+ZHgpKTsKLQkJCQkJCXBpW3Bpbm9dLnBvYy50eTAgPSAoT1BKX0lOVDMyKXRjcC0+dHkwX3Q7Ci0JCQkJCQlwaVtwaW5vXS5wb2MudHkxID0gKE9QSl9JTlQzMikodGNwLT50eTBfdCArIHRjcC0+ZHkgLSAodGNwLT50eTBfdCAlIHRjcC0+ZHkpKTsKLQkJCQkJCXRjcC0+dHgwX3QgPSAoT1BKX1VJTlQzMilwaVtwaW5vXS5wb2MudHgxOwotCQkJCQkJdGNwLT50eTBfdCA9IChPUEpfVUlOVDMyKXBpW3Bpbm9dLnBvYy50eTE7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpbmNyX3RvcD0xOwotCQl9ZWxzZXsKLQkJCWZvcihpPXRwcG9zO2k+PTA7aS0tKXsKLQkJCQlzd2l0Y2gocHJvZ1tpXSl7Ci0JCQkJY2FzZSAnQyc6Ci0JCQkJCXBpW3Bpbm9dLnBvYy5jb21wbm8wID0gdGNwLT5jb21wX3QtMTsKLQkJCQkJcGlbcGlub10ucG9jLmNvbXBubzEgPSB0Y3AtPmNvbXBfdDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnUic6Ci0JCQkJCXBpW3Bpbm9dLnBvYy5yZXNubzAgPSB0Y3AtPnJlc190LTE7Ci0JCQkJCXBpW3Bpbm9dLnBvYy5yZXNubzEgPSB0Y3AtPnJlc190OwotCQkJCQlicmVhazsKLQkJCQljYXNlICdMJzoKLQkJCQkJcGlbcGlub10ucG9jLmxheW5vMCA9IHRjcC0+bGF5X3QtMTsKLQkJCQkJcGlbcGlub10ucG9jLmxheW5vMSA9IHRjcC0+bGF5X3Q7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1AnOgotCQkJCQlzd2l0Y2godGNwLT5wcmcpewotCQkJCQljYXNlIE9QSl9MUkNQOgotCQkJCQljYXNlIE9QSl9STENQOgotCQkJCQkJcGlbcGlub10ucG9jLnByZWNubzAgPSB0Y3AtPnByY190LTE7Ci0JCQkJCQlwaVtwaW5vXS5wb2MucHJlY25vMSA9IHRjcC0+cHJjX3Q7Ci0JCQkJCQlicmVhazsKLQkJCQkJZGVmYXVsdDoKLQkJCQkJCXBpW3Bpbm9dLnBvYy50eDAgPSAoT1BKX0lOVDMyKSh0Y3AtPnR4MF90IC0gdGNwLT5keCAtICh0Y3AtPnR4MF90ICUgdGNwLT5keCkpOwotCQkJCQkJcGlbcGlub10ucG9jLnR4MSA9IChPUEpfSU5UMzIpdGNwLT50eDBfdCA7Ci0JCQkJCQlwaVtwaW5vXS5wb2MudHkwID0gKE9QSl9JTlQzMikodGNwLT50eTBfdCAtIHRjcC0+ZHkgLSAodGNwLT50eTBfdCAlIHRjcC0+ZHkpKTsKLQkJCQkJCXBpW3Bpbm9dLnBvYy50eTEgPSAoT1BKX0lOVDMyKXRjcC0+dHkwX3QgOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmKGluY3JfdG9wPT0xKXsKLQkJCQkJc3dpdGNoKHByb2dbaV0pewotCQkJCQljYXNlICdSJzoKLQkJCQkJCWlmKHRjcC0+cmVzX3Q9PXRjcC0+cmVzRSl7Ci0JCQkJCQkJaWYob3BqX3BpX2NoZWNrX25leHRfbGV2ZWwoaS0xLGNwLHRpbGVubyxwaW5vLHByb2cpKXsKLQkJCQkJCQkJdGNwLT5yZXNfdCA9IHRjcC0+cmVzUzsKLQkJCQkJCQkJcGlbcGlub10ucG9jLnJlc25vMCA9IHRjcC0+cmVzX3Q7Ci0JCQkJCQkJCXBpW3Bpbm9dLnBvYy5yZXNubzEgPSB0Y3AtPnJlc190KzE7Ci0JCQkJCQkJCXRjcC0+cmVzX3QrPTE7Ci0JCQkJCQkJCWluY3JfdG9wPTE7Ci0JCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCWluY3JfdG9wPTA7Ci0JCQkJCQkJfQotCQkJCQkJfWVsc2V7Ci0JCQkJCQkJcGlbcGlub10ucG9jLnJlc25vMCA9IHRjcC0+cmVzX3Q7Ci0JCQkJCQkJcGlbcGlub10ucG9jLnJlc25vMSA9IHRjcC0+cmVzX3QrMTsKLQkJCQkJCQl0Y3AtPnJlc190Kz0xOwotCQkJCQkJCWluY3JfdG9wPTA7Ci0JCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAnQyc6Ci0JCQkJCQlpZih0Y3AtPmNvbXBfdCA9PXRjcC0+Y29tcEUpewotCQkJCQkJCWlmKG9wal9waV9jaGVja19uZXh0X2xldmVsKGktMSxjcCx0aWxlbm8scGlubyxwcm9nKSl7Ci0JCQkJCQkJCXRjcC0+Y29tcF90ID0gdGNwLT5jb21wUzsKLQkJCQkJCQkJcGlbcGlub10ucG9jLmNvbXBubzAgPSB0Y3AtPmNvbXBfdDsKLQkJCQkJCQkJcGlbcGlub10ucG9jLmNvbXBubzEgPSB0Y3AtPmNvbXBfdCsxOwotCQkJCQkJCQl0Y3AtPmNvbXBfdCs9MTsKLQkJCQkJCQkJaW5jcl90b3A9MTsKLQkJCQkJCQl9ZWxzZXsKLQkJCQkJCQkJaW5jcl90b3A9MDsKLQkJCQkJCQl9Ci0JCQkJCQl9ZWxzZXsKLQkJCQkJCQlwaVtwaW5vXS5wb2MuY29tcG5vMCA9IHRjcC0+Y29tcF90OwotCQkJCQkJCXBpW3Bpbm9dLnBvYy5jb21wbm8xID0gdGNwLT5jb21wX3QrMTsKLQkJCQkJCQl0Y3AtPmNvbXBfdCs9MTsKLQkJCQkJCQlpbmNyX3RvcD0wOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJ0wnOgotCQkJCQkJaWYodGNwLT5sYXlfdCA9PSB0Y3AtPmxheUUpewotCQkJCQkJCWlmKG9wal9waV9jaGVja19uZXh0X2xldmVsKGktMSxjcCx0aWxlbm8scGlubyxwcm9nKSl7Ci0JCQkJCQkJCXRjcC0+bGF5X3QgPSB0Y3AtPmxheVM7Ci0JCQkJCQkJCXBpW3Bpbm9dLnBvYy5sYXlubzAgPSB0Y3AtPmxheV90OwotCQkJCQkJCQlwaVtwaW5vXS5wb2MubGF5bm8xID0gdGNwLT5sYXlfdCsxOwotCQkJCQkJCQl0Y3AtPmxheV90Kz0xOwotCQkJCQkJCQlpbmNyX3RvcD0xOwotCQkJCQkJCX1lbHNlewotCQkJCQkJCQlpbmNyX3RvcD0wOwotCQkJCQkJCX0KLQkJCQkJCX1lbHNlewotCQkJCQkJCXBpW3Bpbm9dLnBvYy5sYXlubzAgPSB0Y3AtPmxheV90OwotCQkJCQkJCXBpW3Bpbm9dLnBvYy5sYXlubzEgPSB0Y3AtPmxheV90KzE7Ci0JCQkJCQkJdGNwLT5sYXlfdCs9MTsKLQkJCQkJCQlpbmNyX3RvcD0wOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgJ1AnOgotCQkJCQkJc3dpdGNoKHRjcC0+cHJnKXsKLQkJCQkJCWNhc2UgT1BKX0xSQ1A6Ci0JCQkJCQljYXNlIE9QSl9STENQOgotCQkJCQkJCWlmKHRjcC0+cHJjX3QgPT0gdGNwLT5wcmNFKXsKLQkJCQkJCQkJaWYob3BqX3BpX2NoZWNrX25leHRfbGV2ZWwoaS0xLGNwLHRpbGVubyxwaW5vLHByb2cpKXsKLQkJCQkJCQkJCXRjcC0+cHJjX3QgPSB0Y3AtPnByY1M7Ci0JCQkJCQkJCQlwaVtwaW5vXS5wb2MucHJlY25vMCA9IHRjcC0+cHJjX3Q7Ci0JCQkJCQkJCQlwaVtwaW5vXS5wb2MucHJlY25vMSA9IHRjcC0+cHJjX3QrMTsKLQkJCQkJCQkJCXRjcC0+cHJjX3QrPTE7Ci0JCQkJCQkJCQlpbmNyX3RvcD0xOwotCQkJCQkJCQl9ZWxzZXsKLQkJCQkJCQkJCWluY3JfdG9wPTA7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9ZWxzZXsKLQkJCQkJCQkJcGlbcGlub10ucG9jLnByZWNubzAgPSB0Y3AtPnByY190OwotCQkJCQkJCQlwaVtwaW5vXS5wb2MucHJlY25vMSA9IHRjcC0+cHJjX3QrMTsKLQkJCQkJCQkJdGNwLT5wcmNfdCs9MTsKLQkJCQkJCQkJaW5jcl90b3A9MDsKLQkJCQkJCQl9Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlkZWZhdWx0OgotCQkJCQkJCWlmKHRjcC0+dHgwX3QgPj0gdGNwLT50eEUpewotCQkJCQkJCQlpZih0Y3AtPnR5MF90ID49IHRjcC0+dHlFKXsKLQkJCQkJCQkJCWlmKG9wal9waV9jaGVja19uZXh0X2xldmVsKGktMSxjcCx0aWxlbm8scGlubyxwcm9nKSl7Ci0JCQkJCQkJCQkJdGNwLT50eTBfdCA9IHRjcC0+dHlTOwotCQkJCQkJCQkJCXBpW3Bpbm9dLnBvYy50eTAgPSAoT1BKX0lOVDMyKXRjcC0+dHkwX3Q7Ci0JCQkJCQkJCQkJcGlbcGlub10ucG9jLnR5MSA9IChPUEpfSU5UMzIpKHRjcC0+dHkwX3QgKyB0Y3AtPmR5IC0gKHRjcC0+dHkwX3QgJSB0Y3AtPmR5KSk7Ci0JCQkJCQkJCQkJdGNwLT50eTBfdCA9IChPUEpfVUlOVDMyKXBpW3Bpbm9dLnBvYy50eTE7Ci0JCQkJCQkJCQkJaW5jcl90b3A9MTtyZXNldFg9MTsKLQkJCQkJCQkJCX1lbHNlewotCQkJCQkJCQkJCWluY3JfdG9wPTA7cmVzZXRYPTA7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX1lbHNlewotCQkJCQkJCQkJcGlbcGlub10ucG9jLnR5MCA9IChPUEpfSU5UMzIpdGNwLT50eTBfdDsKLQkJCQkJCQkJCXBpW3Bpbm9dLnBvYy50eTEgPSAoT1BKX0lOVDMyKSh0Y3AtPnR5MF90ICsgdGNwLT5keSAtICh0Y3AtPnR5MF90ICUgdGNwLT5keSkpOwotCQkJCQkJCQkJdGNwLT50eTBfdCA9IChPUEpfVUlOVDMyKXBpW3Bpbm9dLnBvYy50eTE7Ci0JCQkJCQkJCQlpbmNyX3RvcD0wO3Jlc2V0WD0xOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWlmKHJlc2V0WD09MSl7Ci0JCQkJCQkJCQl0Y3AtPnR4MF90ID0gdGNwLT50eFM7Ci0JCQkJCQkJCQlwaVtwaW5vXS5wb2MudHgwID0gKE9QSl9JTlQzMil0Y3AtPnR4MF90OwotCQkJCQkJCQkJcGlbcGlub10ucG9jLnR4MSA9IChPUEpfSU5UMzIpKHRjcC0+dHgwX3QgKyB0Y3AtPmR4LSAodGNwLT50eDBfdCAlIHRjcC0+ZHgpKTsKLQkJCQkJCQkJCXRjcC0+dHgwX3QgPSAoT1BKX1VJTlQzMilwaVtwaW5vXS5wb2MudHgxOwotCQkJCQkJCQl9Ci0JCQkJCQkJfWVsc2V7Ci0JCQkJCQkJCXBpW3Bpbm9dLnBvYy50eDAgPSAoT1BKX0lOVDMyKXRjcC0+dHgwX3Q7Ci0JCQkJCQkJCXBpW3Bpbm9dLnBvYy50eDEgPSAoT1BKX0lOVDMyKSh0Y3AtPnR4MF90ICsgdGNwLT5keC0gKHRjcC0+dHgwX3QgJSB0Y3AtPmR4KSk7Ci0JCQkJCQkJCXRjcC0+dHgwX3QgPSAoT1BKX1VJTlQzMilwaVtwaW5vXS5wb2MudHgxOwotCQkJCQkJCQlpbmNyX3RvcD0wOwotCQkJCQkJCX0KLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQorICAgICAgICBpZiAodHBudW0gPT0gMCkgeworICAgICAgICAgICAgZm9yIChpID0gdHBwb3M7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwcm9nW2ldKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnQyc6CisgICAgICAgICAgICAgICAgICAgIHRjcC0+Y29tcF90ID0gdGNwLT5jb21wUzsKKyAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLmNvbXBubzAgPSB0Y3AtPmNvbXBfdDsKKyAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLmNvbXBubzEgPSB0Y3AtPmNvbXBfdCArIDE7CisgICAgICAgICAgICAgICAgICAgIHRjcC0+Y29tcF90ICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ1InOgorICAgICAgICAgICAgICAgICAgICB0Y3AtPnJlc190ID0gdGNwLT5yZXNTOworICAgICAgICAgICAgICAgICAgICBwaVtwaW5vXS5wb2MucmVzbm8wID0gdGNwLT5yZXNfdDsKKyAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLnJlc25vMSA9IHRjcC0+cmVzX3QgKyAxOworICAgICAgICAgICAgICAgICAgICB0Y3AtPnJlc190ICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0wnOgorICAgICAgICAgICAgICAgICAgICB0Y3AtPmxheV90ID0gdGNwLT5sYXlTOworICAgICAgICAgICAgICAgICAgICBwaVtwaW5vXS5wb2MubGF5bm8wID0gdGNwLT5sYXlfdDsKKyAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLmxheW5vMSA9IHRjcC0+bGF5X3QgKyAxOworICAgICAgICAgICAgICAgICAgICB0Y3AtPmxheV90ICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ1AnOgorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRjcC0+cHJnKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BKX0xSQ1A6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT1BKX1JMQ1A6CisgICAgICAgICAgICAgICAgICAgICAgICB0Y3AtPnByY190ID0gdGNwLT5wcmNTOworICAgICAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLnByZWNubzAgPSB0Y3AtPnByY190OworICAgICAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLnByZWNubzEgPSB0Y3AtPnByY190ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjcC0+cHJjX3QgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT50eDBfdCA9IHRjcC0+dHhTOworICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT50eTBfdCA9IHRjcC0+dHlTOworICAgICAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLnR4MCA9IChPUEpfSU5UMzIpdGNwLT50eDBfdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpW3Bpbm9dLnBvYy50eDEgPSAoT1BKX0lOVDMyKSh0Y3AtPnR4MF90ICsgdGNwLT5keCAtICh0Y3AtPnR4MF90ICUgdGNwLT5keCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLnR5MCA9IChPUEpfSU5UMzIpdGNwLT50eTBfdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpW3Bpbm9dLnBvYy50eTEgPSAoT1BKX0lOVDMyKSh0Y3AtPnR5MF90ICsgdGNwLT5keSAtICh0Y3AtPnR5MF90ICUgdGNwLT5keSkpOworICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT50eDBfdCA9IChPUEpfVUlOVDMyKXBpW3Bpbm9dLnBvYy50eDE7CisgICAgICAgICAgICAgICAgICAgICAgICB0Y3AtPnR5MF90ID0gKE9QSl9VSU5UMzIpcGlbcGlub10ucG9jLnR5MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluY3JfdG9wID0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IHRwcG9zOyBpID49IDA7IGktLSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAocHJvZ1tpXSkgeworICAgICAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgICAgICAgICBwaVtwaW5vXS5wb2MuY29tcG5vMCA9IHRjcC0+Y29tcF90IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLmNvbXBubzEgPSB0Y3AtPmNvbXBfdDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnUic6CisgICAgICAgICAgICAgICAgICAgIHBpW3Bpbm9dLnBvYy5yZXNubzAgPSB0Y3AtPnJlc190IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLnJlc25vMSA9IHRjcC0+cmVzX3Q7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ0wnOgorICAgICAgICAgICAgICAgICAgICBwaVtwaW5vXS5wb2MubGF5bm8wID0gdGNwLT5sYXlfdCAtIDE7CisgICAgICAgICAgICAgICAgICAgIHBpW3Bpbm9dLnBvYy5sYXlubzEgPSB0Y3AtPmxheV90OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0Y3AtPnByZykgeworICAgICAgICAgICAgICAgICAgICBjYXNlIE9QSl9MUkNQOgorICAgICAgICAgICAgICAgICAgICBjYXNlIE9QSl9STENQOgorICAgICAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLnByZWNubzAgPSB0Y3AtPnByY190IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpW3Bpbm9dLnBvYy5wcmVjbm8xID0gdGNwLT5wcmNfdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLnR4MCA9IChPUEpfSU5UMzIpKHRjcC0+dHgwX3QgLSB0Y3AtPmR4IC0gKHRjcC0+dHgwX3QgJSB0Y3AtPmR4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwaVtwaW5vXS5wb2MudHgxID0gKE9QSl9JTlQzMil0Y3AtPnR4MF90IDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpW3Bpbm9dLnBvYy50eTAgPSAoT1BKX0lOVDMyKSh0Y3AtPnR5MF90IC0gdGNwLT5keSAtICh0Y3AtPnR5MF90ICUgdGNwLT5keSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLnR5MSA9IChPUEpfSU5UMzIpdGNwLT50eTBfdCA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluY3JfdG9wID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwcm9nW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1InOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRjcC0+cmVzX3QgPT0gdGNwLT5yZXNFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wal9waV9jaGVja19uZXh0X2xldmVsKGkgLSAxLCBjcCwgdGlsZW5vLCBwaW5vLCBwcm9nKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3AtPnJlc190ID0gdGNwLT5yZXNTOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaVtwaW5vXS5wb2MucmVzbm8wID0gdGNwLT5yZXNfdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLnJlc25vMSA9IHRjcC0+cmVzX3QgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3AtPnJlc190ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JfdG9wID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyX3RvcCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaVtwaW5vXS5wb2MucmVzbm8wID0gdGNwLT5yZXNfdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaVtwaW5vXS5wb2MucmVzbm8xID0gdGNwLT5yZXNfdCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5yZXNfdCArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JfdG9wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0Y3AtPmNvbXBfdCA9PSB0Y3AtPmNvbXBFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wal9waV9jaGVja19uZXh0X2xldmVsKGkgLSAxLCBjcCwgdGlsZW5vLCBwaW5vLCBwcm9nKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3AtPmNvbXBfdCA9IHRjcC0+Y29tcFM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpW3Bpbm9dLnBvYy5jb21wbm8wID0gdGNwLT5jb21wX3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpW3Bpbm9dLnBvYy5jb21wbm8xID0gdGNwLT5jb21wX3QgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3AtPmNvbXBfdCArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyX3RvcCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcl90b3AgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLmNvbXBubzAgPSB0Y3AtPmNvbXBfdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaVtwaW5vXS5wb2MuY29tcG5vMSA9IHRjcC0+Y29tcF90ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3AtPmNvbXBfdCArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JfdG9wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdMJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0Y3AtPmxheV90ID09IHRjcC0+bGF5RSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGpfcGlfY2hlY2tfbmV4dF9sZXZlbChpIC0gMSwgY3AsIHRpbGVubywgcGlubywgcHJvZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5sYXlfdCA9IHRjcC0+bGF5UzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLmxheW5vMCA9IHRjcC0+bGF5X3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpW3Bpbm9dLnBvYy5sYXlubzEgPSB0Y3AtPmxheV90ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5sYXlfdCArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyX3RvcCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcl90b3AgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLmxheW5vMCA9IHRjcC0+bGF5X3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLmxheW5vMSA9IHRjcC0+bGF5X3QgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcC0+bGF5X3QgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyX3RvcCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnUCc6CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHRjcC0+cHJnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE9QSl9MUkNQOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBPUEpfUkxDUDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGNwLT5wcmNfdCA9PSB0Y3AtPnByY0UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wal9waV9jaGVja19uZXh0X2xldmVsKGkgLSAxLCBjcCwgdGlsZW5vLCBwaW5vLCBwcm9nKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNwLT5wcmNfdCA9IHRjcC0+cHJjUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpW3Bpbm9dLnBvYy5wcmVjbm8wID0gdGNwLT5wcmNfdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpW3Bpbm9dLnBvYy5wcmVjbm8xID0gdGNwLT5wcmNfdCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3AtPnByY190ICs9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyX3RvcCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyX3RvcCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaVtwaW5vXS5wb2MucHJlY25vMCA9IHRjcC0+cHJjX3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpW3Bpbm9dLnBvYy5wcmVjbm8xID0gdGNwLT5wcmNfdCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjcC0+cHJjX3QgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcl90b3AgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRjcC0+dHgwX3QgPj0gdGNwLT50eEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRjcC0+dHkwX3QgPj0gdGNwLT50eUUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGpfcGlfY2hlY2tfbmV4dF9sZXZlbChpIC0gMSwgY3AsIHRpbGVubywgcGlubywgcHJvZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3AtPnR5MF90ID0gdGNwLT50eVM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLnR5MCA9IChPUEpfSU5UMzIpdGNwLT50eTBfdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaVtwaW5vXS5wb2MudHkxID0gKE9QSl9JTlQzMikodGNwLT50eTBfdCArIHRjcC0+ZHkgLSAodGNwLT50eTBfdCAlIHRjcC0+ZHkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3AtPnR5MF90ID0gKE9QSl9VSU5UMzIpcGlbcGlub10ucG9jLnR5MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNyX3RvcCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRYID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcl90b3AgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0WCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaVtwaW5vXS5wb2MudHkwID0gKE9QSl9JTlQzMil0Y3AtPnR5MF90OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLnR5MSA9IChPUEpfSU5UMzIpKHRjcC0+dHkwX3QgKyB0Y3AtPmR5IC0gKHRjcC0+dHkwX3QgJSB0Y3AtPmR5KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3AtPnR5MF90ID0gKE9QSl9VSU5UMzIpcGlbcGlub10ucG9jLnR5MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY3JfdG9wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0WCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc2V0WCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3AtPnR4MF90ID0gdGNwLT50eFM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaVtwaW5vXS5wb2MudHgwID0gKE9QSl9JTlQzMil0Y3AtPnR4MF90OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlbcGlub10ucG9jLnR4MSA9IChPUEpfSU5UMzIpKHRjcC0+dHgwX3QgKyB0Y3AtPmR4IC0gKHRjcC0+dHgwX3QgJSB0Y3AtPmR4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3AtPnR4MF90ID0gKE9QSl9VSU5UMzIpcGlbcGlub10ucG9jLnR4MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpW3Bpbm9dLnBvYy50eDAgPSAoT1BKX0lOVDMyKXRjcC0+dHgwX3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpW3Bpbm9dLnBvYy50eDEgPSAoT1BKX0lOVDMyKSh0Y3AtPnR4MF90ICsgdGNwLT5keCAtICh0Y3AtPnR4MF90ICUgdGNwLT5keCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y3AtPnR4MF90ID0gKE9QSl9VSU5UMzIpcGlbcGlub10ucG9jLnR4MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcl90b3AgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQogCiB2b2lkIG9wal9waV9kZXN0cm95KG9wal9waV9pdGVyYXRvcl90ICpwX3BpLAogICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbmJfZWxlbWVudHMpCiB7Ci0JT1BKX1VJTlQzMiBjb21wbm8sIHBpbm87Ci0Jb3BqX3BpX2l0ZXJhdG9yX3QgKmxfY3VycmVudF9waSA9IHBfcGk7CisgICAgT1BKX1VJTlQzMiBjb21wbm8sIHBpbm87CisgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKmxfY3VycmVudF9waSA9IHBfcGk7CiAgICAgaWYgKHBfcGkpIHsKLQkJaWYgKHBfcGktPmluY2x1ZGUpIHsKLQkJCW9wal9mcmVlKHBfcGktPmluY2x1ZGUpOwotCQkJcF9waS0+aW5jbHVkZSA9IDAwOwotCQl9Ci0JCWZvciAocGlubyA9IDA7IHBpbm8gPCBwX25iX2VsZW1lbnRzOyArK3Bpbm8pewotCQkJaWYobF9jdXJyZW50X3BpLT5jb21wcykgewotCQkJCW9wal9waV9jb21wX3QgKmxfY3VycmVudF9jb21wb25lbnQgPSBsX2N1cnJlbnRfcGktPmNvbXBzOwotICAgICAgICAgICAgICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgbF9jdXJyZW50X3BpLT5udW1jb21wczsgY29tcG5vKyspewotICAgICAgICAgICAgICAgICAgICBpZihsX2N1cnJlbnRfY29tcG9uZW50LT5yZXNvbHV0aW9ucykgewotCQkJCQkJb3BqX2ZyZWUobF9jdXJyZW50X2NvbXBvbmVudC0+cmVzb2x1dGlvbnMpOwotCQkJCQkJbF9jdXJyZW50X2NvbXBvbmVudC0+cmVzb2x1dGlvbnMgPSAwMDsKLQkJCQkJfQorICAgICAgICBpZiAocF9waS0+aW5jbHVkZSkgeworICAgICAgICAgICAgb3BqX2ZyZWUocF9waS0+aW5jbHVkZSk7CisgICAgICAgICAgICBwX3BpLT5pbmNsdWRlID0gMDA7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChwaW5vID0gMDsgcGlubyA8IHBfbmJfZWxlbWVudHM7ICsrcGlubykgeworICAgICAgICAgICAgaWYgKGxfY3VycmVudF9waS0+Y29tcHMpIHsKKyAgICAgICAgICAgICAgICBvcGpfcGlfY29tcF90ICpsX2N1cnJlbnRfY29tcG9uZW50ID0gbF9jdXJyZW50X3BpLT5jb21wczsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IGxfY3VycmVudF9waS0+bnVtY29tcHM7IGNvbXBubysrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsX2N1cnJlbnRfY29tcG9uZW50LT5yZXNvbHV0aW9ucykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X2NvbXBvbmVudC0+cmVzb2x1dGlvbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X2NvbXBvbmVudC0+cmVzb2x1dGlvbnMgPSAwMDsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0JCQkJCSsrbF9jdXJyZW50X2NvbXBvbmVudDsKLQkJCQl9Ci0JCQkJb3BqX2ZyZWUobF9jdXJyZW50X3BpLT5jb21wcyk7Ci0JCQkJbF9jdXJyZW50X3BpLT5jb21wcyA9IDA7Ci0JCQl9Ci0JCQkrK2xfY3VycmVudF9waTsKLQkJfQotCQlvcGpfZnJlZShwX3BpKTsKLQl9CisgICAgICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X2NvbXBvbmVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jdXJyZW50X3BpLT5jb21wcyk7CisgICAgICAgICAgICAgICAgbF9jdXJyZW50X3BpLT5jb21wcyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2xfY3VycmVudF9waTsKKyAgICAgICAgfQorICAgICAgICBvcGpfZnJlZShwX3BpKTsKKyAgICB9CiB9CiAKIAogCi12b2lkIG9wal9waV91cGRhdGVfZW5jb2RpbmdfcGFyYW1ldGVycygJY29uc3Qgb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwX3QgKnBfY3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8gKQordm9pZCBvcGpfcGlfdXBkYXRlX2VuY29kaW5nX3BhcmFtZXRlcnMoY29uc3Qgb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY3BfdCAqcF9jcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vKQogewotCS8qIGVuY29kaW5nIHBhcmFtZXRlcnMgdG8gc2V0ICovCi0JT1BKX1VJTlQzMiBsX21heF9yZXM7Ci0JT1BKX1VJTlQzMiBsX21heF9wcmVjOwotCU9QSl9JTlQzMiBsX3R4MCxsX3R4MSxsX3R5MCxsX3R5MTsKLQlPUEpfVUlOVDMyIGxfZHhfbWluLGxfZHlfbWluOworICAgIC8qIGVuY29kaW5nIHBhcmFtZXRlcnMgdG8gc2V0ICovCisgICAgT1BKX1VJTlQzMiBsX21heF9yZXM7CisgICAgT1BKX1VJTlQzMiBsX21heF9wcmVjOworICAgIE9QSl9JTlQzMiBsX3R4MCwgbF90eDEsIGxfdHkwLCBsX3R5MTsKKyAgICBPUEpfVUlOVDMyIGxfZHhfbWluLCBsX2R5X21pbjsKIAotCS8qIHBvaW50ZXJzICovCi0Jb3BqX3RjcF90ICpsX3RjcCA9IDAwOworICAgIC8qIHBvaW50ZXJzICovCisgICAgb3BqX3RjcF90ICpsX3RjcCA9IDAwOwogCi0JLyogcHJlY29uZGl0aW9ucyAqLwotCWFzc2VydChwX2NwICE9IDAwKTsKLQlhc3NlcnQocF9pbWFnZSAhPSAwMCk7Ci0JYXNzZXJ0KHBfdGlsZV9ubyA8IHBfY3AtPnR3ICogcF9jcC0+dGgpOworICAgIC8qIHByZWNvbmRpdGlvbnMgKi8KKyAgICBhc3NlcnQocF9jcCAhPSAwMCk7CisgICAgYXNzZXJ0KHBfaW1hZ2UgIT0gMDApOworICAgIGFzc2VydChwX3RpbGVfbm8gPCBwX2NwLT50dyAqIHBfY3AtPnRoKTsKIAotCWxfdGNwID0gJihwX2NwLT50Y3BzW3BfdGlsZV9ub10pOworICAgIGxfdGNwID0gJihwX2NwLT50Y3BzW3BfdGlsZV9ub10pOwogCi0JLyogZ2V0IGVuY29kaW5nIHBhcmFtZXRlcnMgKi8KLQlvcGpfZ2V0X2VuY29kaW5nX3BhcmFtZXRlcnMocF9pbWFnZSxwX2NwLHBfdGlsZV9ubywmbF90eDAsJmxfdHgxLCZsX3R5MCwmbF90eTEsJmxfZHhfbWluLCZsX2R5X21pbiwmbF9tYXhfcHJlYywmbF9tYXhfcmVzKTsKKyAgICAvKiBnZXQgZW5jb2RpbmcgcGFyYW1ldGVycyAqLworICAgIG9wal9nZXRfZW5jb2RpbmdfcGFyYW1ldGVycyhwX2ltYWdlLCBwX2NwLCBwX3RpbGVfbm8sICZsX3R4MCwgJmxfdHgxLCAmbF90eTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX3R5MSwgJmxfZHhfbWluLCAmbF9keV9taW4sICZsX21heF9wcmVjLCAmbF9tYXhfcmVzKTsKIAotCWlmIChsX3RjcC0+UE9DKSB7Ci0JCW9wal9waV91cGRhdGVfZW5jb2RlX3BvY19hbmRfZmluYWwocF9jcCxwX3RpbGVfbm8sbF90eDAsbF90eDEsbF90eTAsbF90eTEsbF9tYXhfcHJlYyxsX21heF9yZXMsbF9keF9taW4sbF9keV9taW4pOwotCX0KLQllbHNlIHsKLQkJb3BqX3BpX3VwZGF0ZV9lbmNvZGVfbm90X3BvYyhwX2NwLHBfaW1hZ2UtPm51bWNvbXBzLHBfdGlsZV9ubyxsX3R4MCxsX3R4MSxsX3R5MCxsX3R5MSxsX21heF9wcmVjLGxfbWF4X3JlcyxsX2R4X21pbixsX2R5X21pbik7Ci0JfQorICAgIGlmIChsX3RjcC0+UE9DKSB7CisgICAgICAgIG9wal9waV91cGRhdGVfZW5jb2RlX3BvY19hbmRfZmluYWwocF9jcCwgcF90aWxlX25vLCBsX3R4MCwgbF90eDEsIGxfdHkwLCBsX3R5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX21heF9wcmVjLCBsX21heF9yZXMsIGxfZHhfbWluLCBsX2R5X21pbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3BqX3BpX3VwZGF0ZV9lbmNvZGVfbm90X3BvYyhwX2NwLCBwX2ltYWdlLT5udW1jb21wcywgcF90aWxlX25vLCBsX3R4MCwgbF90eDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90eTAsIGxfdHkxLCBsX21heF9wcmVjLCBsX21heF9yZXMsIGxfZHhfbWluLCBsX2R5X21pbik7CisgICAgfQogfQogCi1PUEpfQk9PTCBvcGpfcGlfbmV4dChvcGpfcGlfaXRlcmF0b3JfdCAqIHBpKSB7Ci0Jc3dpdGNoIChwaS0+cG9jLnByZykgewotCQljYXNlIE9QSl9MUkNQOgotCQkJcmV0dXJuIG9wal9waV9uZXh0X2xyY3AocGkpOwotCQljYXNlIE9QSl9STENQOgotCQkJcmV0dXJuIG9wal9waV9uZXh0X3JsY3AocGkpOwotCQljYXNlIE9QSl9SUENMOgotCQkJcmV0dXJuIG9wal9waV9uZXh0X3JwY2wocGkpOwotCQljYXNlIE9QSl9QQ1JMOgotCQkJcmV0dXJuIG9wal9waV9uZXh0X3BjcmwocGkpOwotCQljYXNlIE9QSl9DUFJMOgotCQkJcmV0dXJuIG9wal9waV9uZXh0X2NwcmwocGkpOwotCQljYXNlIE9QSl9QUk9HX1VOS05PV046Ci0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KLQkKLQlyZXR1cm4gT1BKX0ZBTFNFOworT1BKX0JPT0wgb3BqX3BpX25leHQob3BqX3BpX2l0ZXJhdG9yX3QgKiBwaSkKK3sKKyAgICBzd2l0Y2ggKHBpLT5wb2MucHJnKSB7CisgICAgY2FzZSBPUEpfTFJDUDoKKyAgICAgICAgcmV0dXJuIG9wal9waV9uZXh0X2xyY3AocGkpOworICAgIGNhc2UgT1BKX1JMQ1A6CisgICAgICAgIHJldHVybiBvcGpfcGlfbmV4dF9ybGNwKHBpKTsKKyAgICBjYXNlIE9QSl9SUENMOgorICAgICAgICByZXR1cm4gb3BqX3BpX25leHRfcnBjbChwaSk7CisgICAgY2FzZSBPUEpfUENSTDoKKyAgICAgICAgcmV0dXJuIG9wal9waV9uZXh0X3BjcmwocGkpOworICAgIGNhc2UgT1BKX0NQUkw6CisgICAgICAgIHJldHVybiBvcGpfcGlfbmV4dF9jcHJsKHBpKTsKKyAgICBjYXNlIE9QSl9QUk9HX1VOS05PV046CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgcmV0dXJuIE9QSl9GQUxTRTsKIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvcGkuaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvcGkuaAppbmRleCAyNjVkNWIxLi44YzBkYzI1IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3BpLmgKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9waS5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAotICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZAogICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cwogICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgogICoKQEAgLTgsNyArOCw3IEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXgKICAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0LCBBbnRvbmluIERlc2NhbXBlCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkBAIC0zNSw4ICszNSw4IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCi0jaWZuZGVmIF9fUElfSAotI2RlZmluZSBfX1BJX0gKKyNpZm5kZWYgT1BKX1BJX0gKKyNkZWZpbmUgT1BKX1BJX0gKIC8qKgogQGZpbGUgcGkuaAogQGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIGEgcGFja2V0IGl0ZXJhdG9yIChQSSkKQEAgLTUzLDU4ICs1Myw2MCBAQAogRklYTUUgRE9DCiAqLwogdHlwZWRlZiBzdHJ1Y3Qgb3BqX3BpX3Jlc29sdXRpb24gewotICBPUEpfVUlOVDMyIHBkeCwgcGR5OwotICBPUEpfVUlOVDMyIHB3LCBwaDsKKyAgICBPUEpfVUlOVDMyIHBkeCwgcGR5OworICAgIE9QSl9VSU5UMzIgcHcsIHBoOwogfSBvcGpfcGlfcmVzb2x1dGlvbl90OwogCiAvKioKIEZJWE1FIERPQwogKi8KIHR5cGVkZWYgc3RydWN0IG9wal9waV9jb21wIHsKLSAgT1BKX1VJTlQzMiBkeCwgZHk7Ci0gIC8qKiBudW1iZXIgb2YgcmVzb2x1dGlvbiBsZXZlbHMgKi8KLSAgT1BKX1VJTlQzMiBudW1yZXNvbHV0aW9uczsKLSAgb3BqX3BpX3Jlc29sdXRpb25fdCAqcmVzb2x1dGlvbnM7CisgICAgT1BKX1VJTlQzMiBkeCwgZHk7CisgICAgLyoqIG51bWJlciBvZiByZXNvbHV0aW9uIGxldmVscyAqLworICAgIE9QSl9VSU5UMzIgbnVtcmVzb2x1dGlvbnM7CisgICAgb3BqX3BpX3Jlc29sdXRpb25fdCAqcmVzb2x1dGlvbnM7CiB9IG9wal9waV9jb21wX3Q7CiAKIC8qKgogUGFja2V0IGl0ZXJhdG9yCiAqLwogdHlwZWRlZiBzdHJ1Y3Qgb3BqX3BpX2l0ZXJhdG9yIHsKLSAgLyoqIEVuYWJsaW5nIFRpbGUgcGFydCBnZW5lcmF0aW9uKi8KLSAgT1BKX0JZVEUgdHBfb247Ci0gIC8qKiBwcmVjaXNlIGlmIHRoZSBwYWNrZXQgaGFzIGJlZW4gYWxyZWFkeSB1c2VkICh1c2VmdWwgZm9yIHByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZSkgKi8KLSAgT1BKX0lOVDE2ICppbmNsdWRlOwotICAvKiogbGF5ZXIgc3RlcCB1c2VkIHRvIGxvY2FsaXplIHRoZSBwYWNrZXQgaW4gdGhlIGluY2x1ZGUgdmVjdG9yICovCi0gIE9QSl9VSU5UMzIgc3RlcF9sOwotICAvKiogcmVzb2x1dGlvbiBzdGVwIHVzZWQgdG8gbG9jYWxpemUgdGhlIHBhY2tldCBpbiB0aGUgaW5jbHVkZSB2ZWN0b3IgKi8KLSAgT1BKX1VJTlQzMiBzdGVwX3I7Ci0gIC8qKiBjb21wb25lbnQgc3RlcCB1c2VkIHRvIGxvY2FsaXplIHRoZSBwYWNrZXQgaW4gdGhlIGluY2x1ZGUgdmVjdG9yICovCi0gIE9QSl9VSU5UMzIgc3RlcF9jOwotICAvKiogcHJlY2luY3Qgc3RlcCB1c2VkIHRvIGxvY2FsaXplIHRoZSBwYWNrZXQgaW4gdGhlIGluY2x1ZGUgdmVjdG9yICovCi0gIE9QSl9VSU5UMzIgc3RlcF9wOwotICAvKiogY29tcG9uZW50IHRoYXQgaWRlbnRpZnkgdGhlIHBhY2tldCAqLwotICBPUEpfVUlOVDMyIGNvbXBubzsKLSAgLyoqIHJlc29sdXRpb24gdGhhdCBpZGVudGlmeSB0aGUgcGFja2V0ICovCi0gIE9QSl9VSU5UMzIgcmVzbm87Ci0gIC8qKiBwcmVjaW5jdCB0aGF0IGlkZW50aWZ5IHRoZSBwYWNrZXQgKi8KLSAgT1BKX1VJTlQzMiBwcmVjbm87Ci0gIC8qKiBsYXllciB0aGF0IGlkZW50aWZ5IHRoZSBwYWNrZXQgKi8KLSAgT1BKX1VJTlQzMiBsYXlubzsKLSAgLyoqIDAgaWYgdGhlIGZpcnN0IHBhY2tldCAqLwotICBPUEpfQk9PTCBmaXJzdDsKLSAgLyoqIHByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZSBpbmZvcm1hdGlvbiAqLwotICBvcGpfcG9jX3QgcG9jOwotICAvKiogbnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gdGhlIGltYWdlICovCi0gIE9QSl9VSU5UMzIgbnVtY29tcHM7Ci0gIC8qKiBDb21wb25lbnRzKi8KLSAgb3BqX3BpX2NvbXBfdCAqY29tcHM7Ci0gIC8qKiBGSVhNRSBET0MqLwotICBPUEpfSU5UMzIgdHgwLCB0eTAsIHR4MSwgdHkxOwotICAvKiogRklYTUUgRE9DKi8KLSAgT1BKX0lOVDMyIHgsIHk7Ci0gIC8qKiBGSVhNRSBET0MqLwotICBPUEpfVUlOVDMyIGR4LCBkeTsKKyAgICAvKiogRW5hYmxpbmcgVGlsZSBwYXJ0IGdlbmVyYXRpb24qLworICAgIE9QSl9CWVRFIHRwX29uOworICAgIC8qKiBwcmVjaXNlIGlmIHRoZSBwYWNrZXQgaGFzIGJlZW4gYWxyZWFkeSB1c2VkICh1c2VmdWwgZm9yIHByb2dyZXNzaW9uIG9yZGVyIGNoYW5nZSkgKi8KKyAgICBPUEpfSU5UMTYgKmluY2x1ZGU7CisgICAgLyoqIE51bWJlciBvZiBlbGVtZW50cyBpbiBpbmNsdWRlIGFycmF5ICovCisgICAgT1BKX1VJTlQzMiBpbmNsdWRlX3NpemU7CisgICAgLyoqIGxheWVyIHN0ZXAgdXNlZCB0byBsb2NhbGl6ZSB0aGUgcGFja2V0IGluIHRoZSBpbmNsdWRlIHZlY3RvciAqLworICAgIE9QSl9VSU5UMzIgc3RlcF9sOworICAgIC8qKiByZXNvbHV0aW9uIHN0ZXAgdXNlZCB0byBsb2NhbGl6ZSB0aGUgcGFja2V0IGluIHRoZSBpbmNsdWRlIHZlY3RvciAqLworICAgIE9QSl9VSU5UMzIgc3RlcF9yOworICAgIC8qKiBjb21wb25lbnQgc3RlcCB1c2VkIHRvIGxvY2FsaXplIHRoZSBwYWNrZXQgaW4gdGhlIGluY2x1ZGUgdmVjdG9yICovCisgICAgT1BKX1VJTlQzMiBzdGVwX2M7CisgICAgLyoqIHByZWNpbmN0IHN0ZXAgdXNlZCB0byBsb2NhbGl6ZSB0aGUgcGFja2V0IGluIHRoZSBpbmNsdWRlIHZlY3RvciAqLworICAgIE9QSl9VSU5UMzIgc3RlcF9wOworICAgIC8qKiBjb21wb25lbnQgdGhhdCBpZGVudGlmeSB0aGUgcGFja2V0ICovCisgICAgT1BKX1VJTlQzMiBjb21wbm87CisgICAgLyoqIHJlc29sdXRpb24gdGhhdCBpZGVudGlmeSB0aGUgcGFja2V0ICovCisgICAgT1BKX1VJTlQzMiByZXNubzsKKyAgICAvKiogcHJlY2luY3QgdGhhdCBpZGVudGlmeSB0aGUgcGFja2V0ICovCisgICAgT1BKX1VJTlQzMiBwcmVjbm87CisgICAgLyoqIGxheWVyIHRoYXQgaWRlbnRpZnkgdGhlIHBhY2tldCAqLworICAgIE9QSl9VSU5UMzIgbGF5bm87CisgICAgLyoqIDAgaWYgdGhlIGZpcnN0IHBhY2tldCAqLworICAgIE9QSl9CT09MIGZpcnN0OworICAgIC8qKiBwcm9ncmVzc2lvbiBvcmRlciBjaGFuZ2UgaW5mb3JtYXRpb24gKi8KKyAgICBvcGpfcG9jX3QgcG9jOworICAgIC8qKiBudW1iZXIgb2YgY29tcG9uZW50cyBpbiB0aGUgaW1hZ2UgKi8KKyAgICBPUEpfVUlOVDMyIG51bWNvbXBzOworICAgIC8qKiBDb21wb25lbnRzKi8KKyAgICBvcGpfcGlfY29tcF90ICpjb21wczsKKyAgICAvKiogRklYTUUgRE9DKi8KKyAgICBPUEpfSU5UMzIgdHgwLCB0eTAsIHR4MSwgdHkxOworICAgIC8qKiBGSVhNRSBET0MqLworICAgIE9QSl9JTlQzMiB4LCB5OworICAgIC8qKiBGSVhNRSBET0MqLworICAgIE9QSl9VSU5UMzIgZHgsIGR5OwogfSBvcGpfcGlfaXRlcmF0b3JfdDsKIAogLyoqIEBuYW1lIEV4cG9ydGVkIGZ1bmN0aW9ucyAqLwpAQCAtMTEzLDI4ICsxMTUsMjggQEAKIC8qKgogICogQ3JlYXRlcyBhIHBhY2tldCBpdGVyYXRvciBmb3IgZW5jb2RpbmcuCiAgKgotICogQHBhcmFtCWltYWdlCQl0aGUgaW1hZ2UgYmVpbmcgZW5jb2RlZC4KLSAqIEBwYXJhbQljcAkJdGhlIGNvZGluZyBwYXJhbWV0ZXJzLgotICogQHBhcmFtCXRpbGVubwlpbmRleCBvZiB0aGUgdGlsZSBiZWluZyBlbmNvZGVkLgotICogQHBhcmFtCXQyX21vZGUJdGhlIHR5cGUgb2YgcGFzcyBmb3IgZ2VuZXJhdGluZyB0aGUgcGFja2V0IGl0ZXJhdG9yCisgKiBAcGFyYW0gICBpbWFnZSAgICAgICB0aGUgaW1hZ2UgYmVpbmcgZW5jb2RlZC4KKyAqIEBwYXJhbSAgIGNwICAgICAgdGhlIGNvZGluZyBwYXJhbWV0ZXJzLgorICogQHBhcmFtICAgdGlsZW5vICBpbmRleCBvZiB0aGUgdGlsZSBiZWluZyBlbmNvZGVkLgorICogQHBhcmFtICAgdDJfbW9kZSB0aGUgdHlwZSBvZiBwYXNzIGZvciBnZW5lcmF0aW5nIHRoZSBwYWNrZXQgaXRlcmF0b3IKICAqCi0gKiBAcmV0dXJuCWEgbGlzdCBvZiBwYWNrZXQgaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0IHBhY2tldCBvZiB0aGUgdGlsZSAobm90IHRydWUpLgorICogQHJldHVybiAgYSBsaXN0IG9mIHBhY2tldCBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QgcGFja2V0IG9mIHRoZSB0aWxlIChub3QgdHJ1ZSkuCiAqLwogb3BqX3BpX2l0ZXJhdG9yX3QgKm9wal9waV9pbml0aWFsaXNlX2VuY29kZShjb25zdCBvcGpfaW1hZ2VfdCAqaW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jcF90ICpjcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEoyS19UMl9NT0RFIHQyX21vZGUpOworICAgICAgICBvcGpfY3BfdCAqY3AsCisgICAgICAgIE9QSl9VSU5UMzIgdGlsZW5vLAorICAgICAgICBKMktfVDJfTU9ERSB0Ml9tb2RlKTsKIAogLyoqCiAgKiBVcGRhdGVzIHRoZSBlbmNvZGluZyBwYXJhbWV0ZXJzIG9mIHRoZSBjb2RlYy4KICAqCi0gKiBAcGFyYW0JcF9pbWFnZQkJdGhlIGltYWdlIGJlaW5nIGVuY29kZWQuCi0gKiBAcGFyYW0JcF9jcAkJdGhlIGNvZGluZyBwYXJhbWV0ZXJzLgotICogQHBhcmFtCXBfdGlsZV9ubwlpbmRleCBvZiB0aGUgdGlsZSBiZWluZyBlbmNvZGVkLgorICogQHBhcmFtICAgcF9pbWFnZSAgICAgdGhlIGltYWdlIGJlaW5nIGVuY29kZWQuCisgKiBAcGFyYW0gICBwX2NwICAgICAgICB0aGUgY29kaW5nIHBhcmFtZXRlcnMuCisgKiBAcGFyYW0gICBwX3RpbGVfbm8gICBpbmRleCBvZiB0aGUgdGlsZSBiZWluZyBlbmNvZGVkLgogKi8KLXZvaWQgb3BqX3BpX3VwZGF0ZV9lbmNvZGluZ19wYXJhbWV0ZXJzKAljb25zdCBvcGpfaW1hZ2VfdCAqcF9pbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY3BfdCAqcF9jcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9ubyApOwordm9pZCBvcGpfcGlfdXBkYXRlX2VuY29kaW5nX3BhcmFtZXRlcnMoY29uc3Qgb3BqX2ltYWdlX3QgKnBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY3BfdCAqcF9jcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vKTsKIAogLyoqCiBNb2RpZnkgdGhlIHBhY2tldCBpdGVyYXRvciBmb3IgZW5hYmxpbmcgdGlsZSBwYXJ0IGdlbmVyYXRpb24KQEAgLTE0NiwxMyArMTQ4LDEzIEBACiBAcGFyYW0gdHBwb3MgVGhlIHBvc2l0aW9uIG9mIHRoZSB0aWxlIHBhcnQgZmxhZyBpbiB0aGUgcHJvZ3Jlc3Npb24gb3JkZXIKIEBwYXJhbSB0Ml9tb2RlIEZJWE1FIERPQwogKi8KLXZvaWQgb3BqX3BpX2NyZWF0ZV9lbmNvZGUoICBvcGpfcGlfaXRlcmF0b3JfdCAqcGksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jcF90ICpjcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRpbGVubywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwaW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdHBudW0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB0cHBvcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSjJLX1QyX01PREUgdDJfbW9kZSk7Cit2b2lkIG9wal9waV9jcmVhdGVfZW5jb2RlKG9wal9waV9pdGVyYXRvcl90ICpwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwX3QgKmNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRpbGVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwaW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRwbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgdHBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEoyS19UMl9NT0RFIHQyX21vZGUpOwogCiAvKioKIENyZWF0ZSBhIHBhY2tldCBpdGVyYXRvciBmb3IgRGVjb2RlcgpAQCAtMTYyLDE0ICsxNjQsMTQgQEAKIEByZXR1cm4gUmV0dXJucyBhIHBhY2tldCBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QgcGFja2V0IG9mIHRoZSB0aWxlCiBAc2VlIG9wal9waV9kZXN0cm95CiAqLwotb3BqX3BpX2l0ZXJhdG9yX3QgKm9wal9waV9jcmVhdGVfZGVjb2RlKG9wal9pbWFnZV90ICogaW1hZ2UsIAorb3BqX3BpX2l0ZXJhdG9yX3QgKm9wal9waV9jcmVhdGVfZGVjb2RlKG9wal9pbWFnZV90ICogaW1hZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwX3QgKiBjcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHRpbGVubyk7CiAvKioKICAqIERlc3Ryb3lzIGEgcGFja2V0IGl0ZXJhdG9yIGFycmF5LgogICoKLSAqIEBwYXJhbQlwX3BpCQkJdGhlIHBhY2tldCBpdGVyYXRvciBhcnJheSB0byBkZXN0cm95LgotICogQHBhcmFtCXBfbmJfZWxlbWVudHMJdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkuCisgKiBAcGFyYW0gICBwX3BpICAgICAgICAgICAgdGhlIHBhY2tldCBpdGVyYXRvciBhcnJheSB0byBkZXN0cm95LgorICogQHBhcmFtICAgcF9uYl9lbGVtZW50cyAgIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5LgogICovCiB2b2lkIG9wal9waV9kZXN0cm95KG9wal9waV9pdGVyYXRvcl90ICpwX3BpLAogICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbmJfZWxlbWVudHMpOwpAQCAtMTg1LDQgKzE4Nyw0IEBACiAKIC8qQH0qLwogCi0jZW5kaWYgLyogX19QSV9IICovCisjZW5kaWYgLyogT1BKX1BJX0ggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvcmF3LmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3Jhdy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDk4NzYxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvcmF3LmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCi0gKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCi0gKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQotICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKLSAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJvcGpfaW5jbHVkZXMuaCIKLQotLyogCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBsb2NhbCBmdW5jdGlvbnMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSovCi0KLQotLyogCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICBSQVcgZW5jb2RpbmcgaW50ZXJmYWNlCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0qLwotCi1vcGpfcmF3X3QqIG9wal9yYXdfY3JlYXRlKHZvaWQpIHsKLQlvcGpfcmF3X3QgKnJhdyA9IChvcGpfcmF3X3QqKW9wal9tYWxsb2Moc2l6ZW9mKG9wal9yYXdfdCkpOwotCXJldHVybiByYXc7Ci19Ci0KLXZvaWQgb3BqX3Jhd19kZXN0cm95KG9wal9yYXdfdCAqcmF3KSB7Ci0JaWYocmF3KSB7Ci0JCW9wal9mcmVlKHJhdyk7Ci0JfQotfQotCi1PUEpfVUlOVDMyIG9wal9yYXdfbnVtYnl0ZXMob3BqX3Jhd190ICpyYXcpIHsKLQljb25zdCBwdHJkaWZmX3QgZGlmZiA9IHJhdy0+YnAgLSByYXctPnN0YXJ0OwotICBhc3NlcnQoIGRpZmYgPD0gKHB0cmRpZmZfdCkweGZmZmZmZmZmICYmIGRpZmYgPj0gMCApOyAvKiBVSU5UMzJfTUFYICovCi0JcmV0dXJuIChPUEpfVUlOVDMyKWRpZmY7Ci19Ci0KLXZvaWQgb3BqX3Jhd19pbml0X2RlYyhvcGpfcmF3X3QgKnJhdywgT1BKX0JZVEUgKmJwLCBPUEpfVUlOVDMyIGxlbikgewotCXJhdy0+c3RhcnQgPSBicDsKLQlyYXctPmxlbm1heCA9IGxlbjsKLQlyYXctPmxlbiA9IDA7Ci0JcmF3LT5jID0gMDsKLQlyYXctPmN0ID0gMDsKLX0KLQotT1BKX1VJTlQzMiBvcGpfcmF3X2RlY29kZShvcGpfcmF3X3QgKnJhdykgewotCU9QSl9VSU5UMzIgZDsKLQlpZiAocmF3LT5jdCA9PSAwKSB7Ci0JCXJhdy0+Y3QgPSA4OwotCQlpZiAocmF3LT5sZW4gPT0gcmF3LT5sZW5tYXgpIHsKLQkJCXJhdy0+YyA9IDB4ZmY7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocmF3LT5jID09IDB4ZmYpIHsKLQkJCQlyYXctPmN0ID0gNzsKLQkJCX0KLQkJCXJhdy0+YyA9ICoocmF3LT5zdGFydCArIHJhdy0+bGVuKTsKLQkJCXJhdy0+bGVuKys7Ci0JCX0KLQl9Ci0JcmF3LT5jdC0tOwotCWQgPSAocmF3LT5jID4+IHJhdy0+Y3QpICYgMHgwMTsKLQkKLQlyZXR1cm4gZDsKLX0KLQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9yYXcuaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvcmF3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MmM2NjYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9yYXcuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCi0gKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCi0gKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFVuaXZlcnNpdGUgY2F0aG9saXF1ZSBkZSBMb3V2YWluIChVQ0wpLCBCZWxnaXVtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQotICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJwotICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQotICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKLSAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKLSAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCi0gKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKLSAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCi0gKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKLSAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpZm5kZWYgX19SQVdfSAotI2RlZmluZSBfX1JBV19ICi0vKioKLUBmaWxlIHJhdy5oCi1AYnJpZWYgSW1wbGVtZW50YXRpb24gb2Ygb3BlcmF0aW9ucyBmb3IgcmF3IGVuY29kaW5nIChSQVcpCi0KLVRoZSBmdW5jdGlvbnMgaW4gUkFXLkMgaGF2ZSBmb3IgZ29hbCB0byByZWFsaXplIHRoZSBvcGVyYXRpb24gb2YgcmF3IGVuY29kaW5nIGxpbmtlZAotd2l0aCB0aGUgY29ycmVzcG9uZGluZyBtb2RlIHN3aXRjaC4KLSovCi0KLS8qKiBAZGVmZ3JvdXAgUkFXIFJBVyAtIEltcGxlbWVudGF0aW9uIG9mIG9wZXJhdGlvbnMgZm9yIHJhdyBlbmNvZGluZyAqLwotLypAeyovCi0KLS8qKgotUkFXIGVuY29kaW5nIG9wZXJhdGlvbnMKLSovCi10eXBlZGVmIHN0cnVjdCBvcGpfcmF3IHsKLQkvKiogdGVtcG9yYXJ5IGJ1ZmZlciB3aGVyZSBiaXRzIGFyZSBjb2RlZCBvciBkZWNvZGVkICovCi0JT1BKX0JZVEUgYzsKLQkvKiogbnVtYmVyIG9mIGJpdHMgYWxyZWFkeSByZWFkIG9yIGZyZWUgdG8gd3JpdGUgKi8KLQlPUEpfVUlOVDMyIGN0OwotCS8qKiBtYXhpbXVtIGxlbmd0aCB0byBkZWNvZGUgKi8KLQlPUEpfVUlOVDMyIGxlbm1heDsKLQkvKiogbGVuZ3RoIGRlY29kZWQgKi8KLQlPUEpfVUlOVDMyIGxlbjsKLQkvKiogcG9pbnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JT1BKX0JZVEUgKmJwOwotCS8qKiBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyICovCi0JT1BKX0JZVEUgKnN0YXJ0OwotCS8qKiBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciAqLwotCU9QSl9CWVRFICplbmQ7Ci19IG9wal9yYXdfdDsKLQotLyoqIEBuYW1lIEV4cG9ydGVkIGZ1bmN0aW9ucyAqLwotLypAeyovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoqCi1DcmVhdGUgYSBuZXcgUkFXIGhhbmRsZSAKLUByZXR1cm4gUmV0dXJucyBhIG5ldyBSQVcgaGFuZGxlIGlmIHN1Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBvdGhlcndpc2UKLSovCi1vcGpfcmF3X3QqIG9wal9yYXdfY3JlYXRlKHZvaWQpOwotLyoqCi1EZXN0cm95IGEgcHJldmlvdXNseSBjcmVhdGVkIFJBVyBoYW5kbGUKLUBwYXJhbSByYXcgUkFXIGhhbmRsZSB0byBkZXN0cm95Ci0qLwotdm9pZCBvcGpfcmF3X2Rlc3Ryb3kob3BqX3Jhd190ICpyYXcpOwotLyoqCi1SZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuL3JlYWQgc2luY2UgaW5pdGlhbGlzYXRpb24KLUBwYXJhbSByYXcgUkFXIGhhbmRsZSB0byBkZXN0cm95Ci1AcmV0dXJuIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBhbHJlYWR5IGVuY29kZWQKLSovCi1PUEpfVUlOVDMyIG9wal9yYXdfbnVtYnl0ZXMob3BqX3Jhd190ICpyYXcpOwotLyoqCi1Jbml0aWFsaXplIHRoZSBkZWNvZGVyCi1AcGFyYW0gcmF3IFJBVyBoYW5kbGUKLUBwYXJhbSBicCBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIGZyb20gd2hpY2ggdGhlIGJ5dGVzIHdpbGwgYmUgcmVhZAotQHBhcmFtIGxlbiBMZW5ndGggb2YgdGhlIGlucHV0IGJ1ZmZlcgotKi8KLXZvaWQgb3BqX3Jhd19pbml0X2RlYyhvcGpfcmF3X3QgKnJhdywgT1BKX0JZVEUgKmJwLCBPUEpfVUlOVDMyIGxlbik7Ci0vKioKLURlY29kZSBhIHN5bWJvbCB1c2luZyByYXctZGVjb2Rlci4gQ2ZyIHAuNTA2IFRBVUJNQU4KLUBwYXJhbSByYXcgUkFXIGhhbmRsZQotQHJldHVybiBSZXR1cm5zIHRoZSBkZWNvZGVkIHN5bWJvbCAoMCBvciAxKQotKi8KLU9QSl9VSU5UMzIgb3BqX3Jhd19kZWNvZGUob3BqX3Jhd190ICpyYXcpOwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qQH0qLwotCi0vKkB9Ki8KLQotI2VuZGlmIC8qIF9fUkFXX0ggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvc3BhcnNlX2FycmF5LmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3NwYXJzZV9hcnJheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMTkyOTIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3NwYXJzZV9hcnJheS5jCkBAIC0wLDAgKzEsMzQ2IEBACisvKgorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZAorICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cworICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgSW50b1BpeCBTQSA8Y29udGFjdEBpbnRvcGl4LmNvbT4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgQVMgSVMnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgorCisKK3N0cnVjdCBvcGpfc3BhcnNlX2FycmF5X2ludDMyIHsKKyAgICBPUEpfVUlOVDMyIHdpZHRoOworICAgIE9QSl9VSU5UMzIgaGVpZ2h0OworICAgIE9QSl9VSU5UMzIgYmxvY2tfd2lkdGg7CisgICAgT1BKX1VJTlQzMiBibG9ja19oZWlnaHQ7CisgICAgT1BKX1VJTlQzMiBibG9ja19jb3VudF9ob3I7CisgICAgT1BKX1VJTlQzMiBibG9ja19jb3VudF92ZXI7CisgICAgT1BKX0lOVDMyKiogZGF0YV9ibG9ja3M7Cit9OworCitvcGpfc3BhcnNlX2FycmF5X2ludDMyX3QqIG9wal9zcGFyc2VfYXJyYXlfaW50MzJfY3JlYXRlKE9QSl9VSU5UMzIgd2lkdGgsCisgICAgICAgIE9QSl9VSU5UMzIgaGVpZ2h0LAorICAgICAgICBPUEpfVUlOVDMyIGJsb2NrX3dpZHRoLAorICAgICAgICBPUEpfVUlOVDMyIGJsb2NrX2hlaWdodCkKK3sKKyAgICBvcGpfc3BhcnNlX2FycmF5X2ludDMyX3QqIHNhOworCisgICAgaWYgKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDAgfHwgYmxvY2tfd2lkdGggPT0gMCB8fCBibG9ja19oZWlnaHQgPT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKGJsb2NrX3dpZHRoID4gKChPUEpfVUlOVDMyKX4wVSkgLyBibG9ja19oZWlnaHQgLyBzaXplb2YoT1BKX0lOVDMyKSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBzYSA9IChvcGpfc3BhcnNlX2FycmF5X2ludDMyX3QqKSBvcGpfY2FsbG9jKDEsCisgICAgICAgICAgICBzaXplb2Yob3BqX3NwYXJzZV9hcnJheV9pbnQzMl90KSk7CisgICAgc2EtPndpZHRoID0gd2lkdGg7CisgICAgc2EtPmhlaWdodCA9IGhlaWdodDsKKyAgICBzYS0+YmxvY2tfd2lkdGggPSBibG9ja193aWR0aDsKKyAgICBzYS0+YmxvY2tfaGVpZ2h0ID0gYmxvY2tfaGVpZ2h0OworICAgIHNhLT5ibG9ja19jb3VudF9ob3IgPSBvcGpfdWludF9jZWlsZGl2KHdpZHRoLCBibG9ja193aWR0aCk7CisgICAgc2EtPmJsb2NrX2NvdW50X3ZlciA9IG9wal91aW50X2NlaWxkaXYoaGVpZ2h0LCBibG9ja19oZWlnaHQpOworICAgIGlmIChzYS0+YmxvY2tfY291bnRfaG9yID4gKChPUEpfVUlOVDMyKX4wVSkgLyBzYS0+YmxvY2tfY291bnRfdmVyKSB7CisgICAgICAgIG9wal9mcmVlKHNhKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHNhLT5kYXRhX2Jsb2NrcyA9IChPUEpfSU5UMzIqKikgb3BqX2NhbGxvYyhzaXplb2YoT1BKX0lOVDMyKiksCisgICAgICAgICAgICAgICAgICAgICAgc2EtPmJsb2NrX2NvdW50X2hvciAqIHNhLT5ibG9ja19jb3VudF92ZXIpOworICAgIGlmIChzYS0+ZGF0YV9ibG9ja3MgPT0gTlVMTCkgeworICAgICAgICBvcGpfZnJlZShzYSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJldHVybiBzYTsKK30KKwordm9pZCBvcGpfc3BhcnNlX2FycmF5X2ludDMyX2ZyZWUob3BqX3NwYXJzZV9hcnJheV9pbnQzMl90KiBzYSkKK3sKKyAgICBpZiAoc2EpIHsKKyAgICAgICAgT1BKX1VJTlQzMiBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2EtPmJsb2NrX2NvdW50X2hvciAqIHNhLT5ibG9ja19jb3VudF92ZXI7IGkrKykgeworICAgICAgICAgICAgaWYgKHNhLT5kYXRhX2Jsb2Nrc1tpXSkgeworICAgICAgICAgICAgICAgIG9wal9mcmVlKHNhLT5kYXRhX2Jsb2Nrc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb3BqX2ZyZWUoc2EtPmRhdGFfYmxvY2tzKTsKKyAgICAgICAgb3BqX2ZyZWUoc2EpOworICAgIH0KK30KKworT1BKX0JPT0wgb3BqX3NwYXJzZV9hcnJheV9pc19yZWdpb25fdmFsaWQoY29uc3Qgb3BqX3NwYXJzZV9hcnJheV9pbnQzMl90KiBzYSwKKyAgICAgICAgT1BKX1VJTlQzMiB4MCwKKyAgICAgICAgT1BKX1VJTlQzMiB5MCwKKyAgICAgICAgT1BKX1VJTlQzMiB4MSwKKyAgICAgICAgT1BKX1VJTlQzMiB5MSkKK3sKKyAgICByZXR1cm4gISh4MCA+PSBzYS0+d2lkdGggfHwgeDEgPD0geDAgfHwgeDEgPiBzYS0+d2lkdGggfHwKKyAgICAgICAgICAgICB5MCA+PSBzYS0+aGVpZ2h0IHx8IHkxIDw9IHkwIHx8IHkxID4gc2EtPmhlaWdodCk7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfc3BhcnNlX2FycmF5X2ludDMyX3JlYWRfb3Jfd3JpdGUoCisgICAgY29uc3Qgb3BqX3NwYXJzZV9hcnJheV9pbnQzMl90KiBzYSwKKyAgICBPUEpfVUlOVDMyIHgwLAorICAgIE9QSl9VSU5UMzIgeTAsCisgICAgT1BKX1VJTlQzMiB4MSwKKyAgICBPUEpfVUlOVDMyIHkxLAorICAgIE9QSl9JTlQzMiogYnVmLAorICAgIE9QSl9VSU5UMzIgYnVmX2NvbF9zdHJpZGUsCisgICAgT1BKX1VJTlQzMiBidWZfbGluZV9zdHJpZGUsCisgICAgT1BKX0JPT0wgZm9yZ2l2aW5nLAorICAgIE9QSl9CT09MIGlzX3JlYWRfb3ApCit7CisgICAgT1BKX1VJTlQzMiB5LCBibG9ja195OworICAgIE9QSl9VSU5UMzIgeV9pbmNyID0gMDsKKyAgICBjb25zdCBPUEpfVUlOVDMyIGJsb2NrX3dpZHRoID0gc2EtPmJsb2NrX3dpZHRoOworCisgICAgaWYgKCFvcGpfc3BhcnNlX2FycmF5X2lzX3JlZ2lvbl92YWxpZChzYSwgeDAsIHkwLCB4MSwgeTEpKSB7CisgICAgICAgIHJldHVybiBmb3JnaXZpbmc7CisgICAgfQorCisgICAgYmxvY2tfeSA9IHkwIC8gc2EtPmJsb2NrX2hlaWdodDsKKyAgICBmb3IgKHkgPSB5MDsgeSA8IHkxOyBibG9ja195ICsrLCB5ICs9IHlfaW5jcikgeworICAgICAgICBPUEpfVUlOVDMyIHgsIGJsb2NrX3g7CisgICAgICAgIE9QSl9VSU5UMzIgeF9pbmNyID0gMDsKKyAgICAgICAgT1BKX1VJTlQzMiBibG9ja195X29mZnNldDsKKyAgICAgICAgeV9pbmNyID0gKHkgPT0geTApID8gc2EtPmJsb2NrX2hlaWdodCAtICh5MCAlIHNhLT5ibG9ja19oZWlnaHQpIDoKKyAgICAgICAgICAgICAgICAgc2EtPmJsb2NrX2hlaWdodDsKKyAgICAgICAgYmxvY2tfeV9vZmZzZXQgPSBzYS0+YmxvY2tfaGVpZ2h0IC0geV9pbmNyOworICAgICAgICB5X2luY3IgPSBvcGpfdWludF9taW4oeV9pbmNyLCB5MSAtIHkpOworICAgICAgICBibG9ja194ID0geDAgLyBibG9ja193aWR0aDsKKyAgICAgICAgZm9yICh4ID0geDA7IHggPCB4MTsgYmxvY2tfeCArKywgeCArPSB4X2luY3IpIHsKKyAgICAgICAgICAgIE9QSl9VSU5UMzIgajsKKyAgICAgICAgICAgIE9QSl9VSU5UMzIgYmxvY2tfeF9vZmZzZXQ7CisgICAgICAgICAgICBPUEpfSU5UMzIqIHNyY19ibG9jazsKKyAgICAgICAgICAgIHhfaW5jciA9ICh4ID09IHgwKSA/IGJsb2NrX3dpZHRoIC0gKHgwICUgYmxvY2tfd2lkdGgpIDogYmxvY2tfd2lkdGg7CisgICAgICAgICAgICBibG9ja194X29mZnNldCA9IGJsb2NrX3dpZHRoIC0geF9pbmNyOworICAgICAgICAgICAgeF9pbmNyID0gb3BqX3VpbnRfbWluKHhfaW5jciwgeDEgLSB4KTsKKyAgICAgICAgICAgIHNyY19ibG9jayA9IHNhLT5kYXRhX2Jsb2Nrc1tibG9ja195ICogc2EtPmJsb2NrX2NvdW50X2hvciArIGJsb2NrX3hdOworICAgICAgICAgICAgaWYgKGlzX3JlYWRfb3ApIHsKKyAgICAgICAgICAgICAgICBpZiAoc3JjX2Jsb2NrID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1Zl9jb2xfc3RyaWRlID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiogZGVzdF9wdHIgPSBidWYgKyAoeSAtIHkwKSAqIChPUEpfU0laRV9UKWJ1Zl9saW5lX3N0cmlkZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHggLSB4MCkgKiBidWZfY29sX3N0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB5X2luY3I7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChkZXN0X3B0ciwgMCwgc2l6ZW9mKE9QSl9JTlQzMikgKiB4X2luY3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcHRyICs9IGJ1Zl9saW5lX3N0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiogZGVzdF9wdHIgPSBidWYgKyAoeSAtIHkwKSAqIChPUEpfU0laRV9UKWJ1Zl9saW5lX3N0cmlkZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHggLSB4MCkgKiBidWZfY29sX3N0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB5X2luY3I7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgeF9pbmNyOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9wdHJbayAqIGJ1Zl9jb2xfc3RyaWRlXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcHRyICs9IGJ1Zl9saW5lX3N0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9QSl9JTlQzMiogT1BKX1JFU1RSSUNUIHNyY19wdHIgPSBzcmNfYmxvY2sgKyBibG9ja195X29mZnNldCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1NJWkVfVClibG9ja193aWR0aCArIGJsb2NrX3hfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBpZiAoYnVmX2NvbF9zdHJpZGUgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyKiBPUEpfUkVTVFJJQ1QgZGVzdF9wdHIgPSBidWYgKyAoeSAtIHkwKSAqIChPUEpfU0laRV9UKWJ1Zl9saW5lX3N0cmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh4IC0geDApICogYnVmX2NvbF9zdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeF9pbmNyID09IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1lIGNvZGUgYXMgZ2VuZXJhbCBicmFuY2gsIGJ1dCB0aGUgY29tcGlsZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjYW4gaGF2ZSBhbiBlZmZpY2llbnQgbWVtY3B5KCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkoeF9pbmNyKTsgLyogdHJpY2sgdG8gc2lsZW50IGNwcGNoZWNrIGR1cGxpY2F0ZUJyYW5jaCB3YXJuaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHlfaW5jcjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkZXN0X3B0ciwgc3JjX3B0ciwgc2l6ZW9mKE9QSl9JTlQzMikgKiB4X2luY3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3B0ciArPSBidWZfbGluZV9zdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19wdHIgKz0gYmxvY2tfd2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgeV9pbmNyOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRlc3RfcHRyLCBzcmNfcHRyLCBzaXplb2YoT1BKX0lOVDMyKSAqIHhfaW5jcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcHRyICs9IGJ1Zl9saW5lX3N0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3B0ciArPSBibG9ja193aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIqIE9QSl9SRVNUUklDVCBkZXN0X3B0ciA9IGJ1ZiArICh5IC0geTApICogKE9QSl9TSVpFX1QpYnVmX2xpbmVfc3RyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHggLSB4MCkgKiBidWZfY29sX3N0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4X2luY3IgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB5X2luY3I7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGVzdF9wdHIgPSAqc3JjX3B0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9wdHIgKz0gYnVmX2xpbmVfc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcHRyICs9IGJsb2NrX3dpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeV9pbmNyID09IDEgJiYgYnVmX2NvbF9zdHJpZGUgPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgKHhfaW5jciAmIH4zVSk7IGsgKz0gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3B0cltrICogYnVmX2NvbF9zdHJpZGVdID0gc3JjX3B0cltrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9wdHJbKGsgKyAxKSAqIGJ1Zl9jb2xfc3RyaWRlXSA9IHNyY19wdHJbayArIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3B0clsoayArIDIpICogYnVmX2NvbF9zdHJpZGVdID0gc3JjX3B0cltrICsgMl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcHRyWyhrICsgMykgKiBidWZfY29sX3N0cmlkZV0gPSBzcmNfcHRyW2sgKyAzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGsgPCB4X2luY3I7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3B0cltrICogYnVmX2NvbF9zdHJpZGVdID0gc3JjX3B0cltrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHhfaW5jciA+PSA4ICYmIGJ1Zl9jb2xfc3RyaWRlID09IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgeV9pbmNyOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgKHhfaW5jciAmIH4zVSk7IGsgKz0gNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9wdHJbayAqIGJ1Zl9jb2xfc3RyaWRlXSA9IHNyY19wdHJba107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3B0clsoayArIDEpICogYnVmX2NvbF9zdHJpZGVdID0gc3JjX3B0cltrICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3B0clsoayArIDIpICogYnVmX2NvbF9zdHJpZGVdID0gc3JjX3B0cltrICsgMl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3B0clsoayArIDMpICogYnVmX2NvbF9zdHJpZGVdID0gc3JjX3B0cltrICsgM107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGsgPCB4X2luY3I7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9wdHJbayAqIGJ1Zl9jb2xfc3RyaWRlXSA9IHNyY19wdHJba107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9wdHIgKz0gYnVmX2xpbmVfc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcHRyICs9IGJsb2NrX3dpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2VuZXJhbCBjYXNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHlfaW5jcjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IHhfaW5jcjsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3B0cltrICogYnVmX2NvbF9zdHJpZGVdID0gc3JjX3B0cltrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3B0ciArPSBidWZfbGluZV9zdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19wdHIgKz0gYmxvY2tfd2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoc3JjX2Jsb2NrID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3JjX2Jsb2NrID0gKE9QSl9JTlQzMiopIG9wal9jYWxsb2MoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2EtPmJsb2NrX3dpZHRoICogc2EtPmJsb2NrX2hlaWdodCAqIHNpemVvZihPUEpfSU5UMzIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19ibG9jayA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNhLT5kYXRhX2Jsb2Nrc1tibG9ja195ICogc2EtPmJsb2NrX2NvdW50X2hvciArIGJsb2NrX3hdID0gc3JjX2Jsb2NrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChidWZfY29sX3N0cmlkZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiogT1BKX1JFU1RSSUNUIGRlc3RfcHRyID0gc3JjX2Jsb2NrICsgYmxvY2tfeV9vZmZzZXQgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfU0laRV9UKWJsb2NrX3dpZHRoICsgYmxvY2tfeF9vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9QSl9JTlQzMiogT1BKX1JFU1RSSUNUIHNyY19wdHIgPSBidWYgKyAoeSAtIHkwKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1NJWkVfVClidWZfbGluZV9zdHJpZGUgKyAoeCAtIHgwKSAqIGJ1Zl9jb2xfc3RyaWRlOworICAgICAgICAgICAgICAgICAgICBpZiAoeF9pbmNyID09IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbWUgY29kZSBhcyBnZW5lcmFsIGJyYW5jaCwgYnV0IHRoZSBjb21waWxlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FuIGhhdmUgYW4gZWZmaWNpZW50IG1lbWNweSgpICovCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkoeF9pbmNyKTsgLyogdHJpY2sgdG8gc2lsZW50IGNwcGNoZWNrIGR1cGxpY2F0ZUJyYW5jaCB3YXJuaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgeV9pbmNyOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZGVzdF9wdHIsIHNyY19wdHIsIHNpemVvZihPUEpfSU5UMzIpICogeF9pbmNyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3B0ciArPSBibG9ja193aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcHRyICs9IGJ1Zl9saW5lX3N0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB5X2luY3I7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShkZXN0X3B0ciwgc3JjX3B0ciwgc2l6ZW9mKE9QSl9JTlQzMikgKiB4X2luY3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcHRyICs9IGJsb2NrX3dpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19wdHIgKz0gYnVmX2xpbmVfc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyKiBPUEpfUkVTVFJJQ1QgZGVzdF9wdHIgPSBzcmNfYmxvY2sgKyBibG9ja195X29mZnNldCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9TSVpFX1QpYmxvY2tfd2lkdGggKyBibG9ja194X29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgT1BKX0lOVDMyKiBPUEpfUkVTVFJJQ1Qgc3JjX3B0ciA9IGJ1ZiArICh5IC0geTApICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfU0laRV9UKWJ1Zl9saW5lX3N0cmlkZSArICh4IC0geDApICogYnVmX2NvbF9zdHJpZGU7CisgICAgICAgICAgICAgICAgICAgIGlmICh4X2luY3IgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHlfaW5jcjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRlc3RfcHRyID0gKnNyY19wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3B0ciArPSBidWZfbGluZV9zdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9wdHIgKz0gYmxvY2tfd2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeF9pbmNyID49IDggJiYgYnVmX2NvbF9zdHJpZGUgPT0gOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHlfaW5jcjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCAoeF9pbmNyICYgfjNVKTsgayArPSA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcHRyW2tdID0gc3JjX3B0cltrICogYnVmX2NvbF9zdHJpZGVdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3B0cltrICsgMV0gPSBzcmNfcHRyWyhrICsgMSkgKiBidWZfY29sX3N0cmlkZV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcHRyW2sgKyAyXSA9IHNyY19wdHJbKGsgKyAyKSAqIGJ1Zl9jb2xfc3RyaWRlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9wdHJbayArIDNdID0gc3JjX3B0clsoayArIDMpICogYnVmX2NvbF9zdHJpZGVdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgayA8IHhfaW5jcjsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfcHRyW2tdID0gc3JjX3B0cltrICogYnVmX2NvbF9zdHJpZGVdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfcHRyICs9IGJ1Zl9saW5lX3N0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3B0ciArPSBibG9ja193aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdlbmVyYWwgY2FzZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHlfaW5jcjsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCB4X2luY3I7IGsrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3B0cltrXSA9IHNyY19wdHJbayAqIGJ1Zl9jb2xfc3RyaWRlXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3B0ciArPSBidWZfbGluZV9zdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdF9wdHIgKz0gYmxvY2tfd2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK09QSl9CT09MIG9wal9zcGFyc2VfYXJyYXlfaW50MzJfcmVhZChjb25zdCBvcGpfc3BhcnNlX2FycmF5X2ludDMyX3QqIHNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgeDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB5MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyKiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgZGVzdF9jb2xfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgZGVzdF9saW5lX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQk9PTCBmb3JnaXZpbmcpCit7CisgICAgcmV0dXJuIG9wal9zcGFyc2VfYXJyYXlfaW50MzJfcmVhZF9vcl93cml0ZSgKKyAgICAgICAgICAgICAgIChvcGpfc3BhcnNlX2FycmF5X2ludDMyX3QqKXNhLCB4MCwgeTAsIHgxLCB5MSwKKyAgICAgICAgICAgICAgIGRlc3QsCisgICAgICAgICAgICAgICBkZXN0X2NvbF9zdHJpZGUsCisgICAgICAgICAgICAgICBkZXN0X2xpbmVfc3RyaWRlLAorICAgICAgICAgICAgICAgZm9yZ2l2aW5nLAorICAgICAgICAgICAgICAgT1BKX1RSVUUpOworfQorCitPUEpfQk9PTCBvcGpfc3BhcnNlX2FycmF5X2ludDMyX3dyaXRlKG9wal9zcGFyc2VfYXJyYXlfaW50MzJfdCogc2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgeDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9QSl9JTlQzMiogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHNyY19jb2xfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHNyY19saW5lX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JPT0wgZm9yZ2l2aW5nKQoreworICAgIHJldHVybiBvcGpfc3BhcnNlX2FycmF5X2ludDMyX3JlYWRfb3Jfd3JpdGUoc2EsIHgwLCB5MCwgeDEsIHkxLAorICAgICAgICAgICAgKE9QSl9JTlQzMiopc3JjLAorICAgICAgICAgICAgc3JjX2NvbF9zdHJpZGUsCisgICAgICAgICAgICBzcmNfbGluZV9zdHJpZGUsCisgICAgICAgICAgICBmb3JnaXZpbmcsCisgICAgICAgICAgICBPUEpfRkFMU0UpOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC9zcGFyc2VfYXJyYXkuaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvc3BhcnNlX2FycmF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ5MjdlYQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvc3BhcnNlX2FycmF5LmgKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCisgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCisgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCBJbnRvUGl4IFNBIDxjb250YWN0QGludG9waXguY29tPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAib3BqX2luY2x1ZGVzLmgiCisKKyNpZm5kZWYgT1BKX1NQQVJTRV9BUlJBWV9ICisjZGVmaW5lIE9QSl9TUEFSU0VfQVJSQVlfSAorLyoqCitAZmlsZSBzcGFyc2VfYXJyYXkuaAorQGJyaWVmIFNwYXJzZSBhcnJheSBtYW5hZ2VtZW50CisKK1RoZSBmdW5jdGlvbnMgaW4gdGhpcyBmaWxlIG1hbmFnZSBzcGFyc2UgYXJyYXlzLiBTcGFyc2UgYXJyYXlzIGFyZSBhcnJheXMgd2l0aAorcG90ZW50aWFsIGJpZyBkaW1lbnNpb25zLCBidXQgd2l0aCB2ZXJ5IGZldyBzYW1wbGVzIGFjdHVhbGx5IHNldC4gU3VjaCBzcGFyc2UKK2FycmF5cyByZXF1aXJlIGFsbG9jYXRpbmcgYSBsb3cgYW1vdW50IG9mIG1lbW9yeSwgYnkganVzdCBhbGxvY2F0aW5nIG1lbW9yeQorZm9yIGJsb2NrcyBvZiB0aGUgYXJyYXkgdGhhdCBhcmUgc2V0LiBUaGUgbWluaW11bSBtZW1vcnkgYWxsb2NhdGlvbiB1bml0IGlzIGEKK2EgYmxvY2suIFRoZXJlIGlzIGEgdHJhZGUtb2ZmIHRvIHBpY2sgdXAgYW4gYXBwcm9wcmlhdGUgZGltZW5zaW9uIGZvciBibG9ja3MuCitJZiBpdCBpcyB0b28gYmlnLCBhbmQgcGl4ZWxzIHNldCBhcmUgZmFyIGZyb20gZWFjaCBvdGhlciwgdG9vIG11Y2ggbWVtb3J5IHdpbGwKK2JlIHVzZWQuIElmIGJsb2NrcyBhcmUgdG9vIHNtYWxsLCB0aGUgYm9vay1rZWVwaW5nIGNvc3RzIG9mIGJsb2NrcyB3aWxsIHJhaXNlLgorKi8KKworLyoqIEBkZWZncm91cCBTUEFSU0VfQVJSQVkgU1BBUlNFIEFSUkFZUyAtIFNwYXJzZSBhcnJheXMgKi8KKy8qQHsqLworCisvKiogT3BhcXVlIHR5cGUgZm9yIHNwYXJzZSBhcnJheXMgdGhhdCBjb250YWluIGludDMyIHZhbHVlcyAqLwordHlwZWRlZiBzdHJ1Y3Qgb3BqX3NwYXJzZV9hcnJheV9pbnQzMiBvcGpfc3BhcnNlX2FycmF5X2ludDMyX3Q7CisKKy8qKiBDcmVhdGVzIGEgbmV3IHNwYXJzZSBhcnJheS4KKyAqIEBwYXJhbSB3aWR0aCB0b3RhbCB3aWR0aCBvZiB0aGUgYXJyYXkuCisgKiBAcGFyYW0gaGVpZ2h0IHRvdGFsIGhlaWdodCBvZiB0aGUgYXJyYXkKKyAqIEBwYXJhbSBibG9ja193aWR0aCB3aWR0aCBvZiBhIGJsb2NrLgorICogQHBhcmFtIGJsb2NrX2hlaWdodCBoZWlnaHQgb2YgYSBibG9jay4KKyAqIEByZXR1cm4gYSBuZXcgc3BhcnNlIGFycmF5IGluc3RhbmNlLCBvciBOVUxMIGluIGNhc2Ugb2YgZmFpbHVyZS4KKyAqLworb3BqX3NwYXJzZV9hcnJheV9pbnQzMl90KiBvcGpfc3BhcnNlX2FycmF5X2ludDMyX2NyZWF0ZShPUEpfVUlOVDMyIHdpZHRoLAorICAgICAgICBPUEpfVUlOVDMyIGhlaWdodCwKKyAgICAgICAgT1BKX1VJTlQzMiBibG9ja193aWR0aCwKKyAgICAgICAgT1BKX1VJTlQzMiBibG9ja19oZWlnaHQpOworCisvKiogRnJlZXMgYSBzcGFyc2UgYXJyYXkuCisgKiBAcGFyYW0gc2Egc3BhcnNlIGFycmF5IGluc3RhbmNlLgorICovCit2b2lkIG9wal9zcGFyc2VfYXJyYXlfaW50MzJfZnJlZShvcGpfc3BhcnNlX2FycmF5X2ludDMyX3QqIHNhKTsKKworLyoqIFJldHVybnMgd2hldGhlciByZWdpb24gYm91bmRzIGFyZSB2YWxpZCAobm9uIGVtcHR5IGFuZCB3aXRoaW4gYXJyYXkgYm91bmRzKQorICogQHBhcmFtIHNhIHNwYXJzZSBhcnJheSBpbnN0YW5jZS4KKyAqIEBwYXJhbSB4MCBsZWZ0IHggY29vcmRpbmF0ZSBvZiB0aGUgcmVnaW9uLgorICogQHBhcmFtIHkwIHRvcCB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlZ2lvbi4KKyAqIEBwYXJhbSB4MSByaWdodCB4IGNvb3JkaW5hdGUgKG5vdCBpbmNsdWRlZCkgb2YgdGhlIHJlZ2lvbi4gTXVzdCBiZSBncmVhdGVyIHRoYW4geDAuCisgKiBAcGFyYW0geTEgYm90dG9tIHkgY29vcmRpbmF0ZSAobm90IGluY2x1ZGVkKSBvZiB0aGUgcmVnaW9uLiBNdXN0IGJlIGdyZWF0ZXIgdGhhbiB5MC4KKyAqIEByZXR1cm4gT1BKX1RSVUUgb3IgT1BKX0ZBTFNFLgorICovCitPUEpfQk9PTCBvcGpfc3BhcnNlX2FycmF5X2lzX3JlZ2lvbl92YWxpZChjb25zdCBvcGpfc3BhcnNlX2FycmF5X2ludDMyX3QqIHNhLAorICAgICAgICBPUEpfVUlOVDMyIHgwLAorICAgICAgICBPUEpfVUlOVDMyIHkwLAorICAgICAgICBPUEpfVUlOVDMyIHgxLAorICAgICAgICBPUEpfVUlOVDMyIHkxKTsKKworLyoqIFJlYWQgdGhlIGNvbnRlbnQgb2YgYSByZWN0YW5ndWxhciByZWdpb24gb2YgdGhlIHNwYXJzZSBhcnJheSBpbnRvIGEKKyAqIHVzZXIgYnVmZmVyLgorICoKKyAqIFJlZ2lvbnMgbm90IHdyaXR0ZW4gd2l0aCBvcGpfc3BhcnNlX2FycmF5X2ludDMyX3dyaXRlKCkgYXJlIHJlYWQgYXMgMC4KKyAqCisgKiBAcGFyYW0gc2Egc3BhcnNlIGFycmF5IGluc3RhbmNlLgorICogQHBhcmFtIHgwIGxlZnQgeCBjb29yZGluYXRlIG9mIHRoZSByZWdpb24gdG8gcmVhZCBpbiB0aGUgc3BhcnNlIGFycmF5LgorICogQHBhcmFtIHkwIHRvcCB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlZ2lvbiB0byByZWFkIGluIHRoZSBzcGFyc2UgYXJyYXkuCisgKiBAcGFyYW0geDEgcmlnaHQgeCBjb29yZGluYXRlIChub3QgaW5jbHVkZWQpIG9mIHRoZSByZWdpb24gdG8gcmVhZCBpbiB0aGUgc3BhcnNlIGFycmF5LiBNdXN0IGJlIGdyZWF0ZXIgdGhhbiB4MC4KKyAqIEBwYXJhbSB5MSBib3R0b20geSBjb29yZGluYXRlIChub3QgaW5jbHVkZWQpIG9mIHRoZSByZWdpb24gdG8gcmVhZCBpbiB0aGUgc3BhcnNlIGFycmF5LiBNdXN0IGJlIGdyZWF0ZXIgdGhhbiB5MC4KKyAqIEBwYXJhbSBkZXN0IHVzZXIgYnVmZmVyIHRvIGZpbGwuIE11c3QgYmUgYXQgbGVhc3Qgc2l6ZW9mKGludDMyKSAqICggKHkxIC0geTAgLSAxKSAqIGRlc3RfbGluZV9zdHJpZGUgKyAoeDEgLSB4MCAtIDEpICogZGVzdF9jb2xfc3RyaWRlICsgMSkgYnl0ZXMgbGFyZ2UuCisgKiBAcGFyYW0gZGVzdF9jb2xfc3RyaWRlIHNwYWNpbmcgKGluIGVsZW1lbnRzLCBub3QgaW4gYnl0ZXMpIGluIHggZGltZW5zaW9uIGJldHdlZW4gY29uc2VjdXRpdmUgZWxlbWVudHMgb2YgdGhlIHVzZXIgYnVmZmVyLgorICogQHBhcmFtIGRlc3RfbGluZV9zdHJpZGUgc3BhY2luZyAoaW4gZWxlbWVudHMsIG5vdCBpbiBieXRlcykgaW4geSBkaW1lbnNpb24gYmV0d2VlbiBjb25zZWN1dGl2ZSBlbGVtZW50cyBvZiB0aGUgdXNlciBidWZmZXIuCisgKiBAcGFyYW0gZm9yZ2l2aW5nIGlmIHNldCB0byBUUlVFIGFuZCB0aGUgcmVnaW9uIGlzIGludmFsaWQsIE9QSl9UUlVFIHdpbGwgc3RpbGwgYmUgcmV0dXJuZWQuCisgKiBAcmV0dXJuIE9QSl9UUlVFIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KKyAqLworT1BKX0JPT0wgb3BqX3NwYXJzZV9hcnJheV9pbnQzMl9yZWFkKGNvbnN0IG9wal9zcGFyc2VfYXJyYXlfaW50MzJfdCogc2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIqIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBkZXN0X2NvbF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBkZXN0X2xpbmVfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CT09MIGZvcmdpdmluZyk7CisKKworLyoqIFdyaXRlIHRoZSBjb250ZW50IG9mIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIGludG8gdGhlIHNwYXJzZSBhcnJheSBmcm9tIGEKKyAqIHVzZXIgYnVmZmVyLgorICoKKyAqIEJsb2NrcyBpbnRlcnNlY3RpbmcgdGhlIHJlZ2lvbiBhcmUgYWxsb2NhdGVkLCBpZiBub3QgYWxyZWFkeSBkb25lLgorICoKKyAqIEBwYXJhbSBzYSBzcGFyc2UgYXJyYXkgaW5zdGFuY2UuCisgKiBAcGFyYW0geDAgbGVmdCB4IGNvb3JkaW5hdGUgb2YgdGhlIHJlZ2lvbiB0byB3cml0ZSBpbnRvIHRoZSBzcGFyc2UgYXJyYXkuCisgKiBAcGFyYW0geTAgdG9wIHggY29vcmRpbmF0ZSBvZiB0aGUgcmVnaW9uIHRvIHdyaXRlIGludG8gdGhlIHNwYXJzZSBhcnJheS4KKyAqIEBwYXJhbSB4MSByaWdodCB4IGNvb3JkaW5hdGUgKG5vdCBpbmNsdWRlZCkgb2YgdGhlIHJlZ2lvbiB0byB3cml0ZSBpbnRvIHRoZSBzcGFyc2UgYXJyYXkuIE11c3QgYmUgZ3JlYXRlciB0aGFuIHgwLgorICogQHBhcmFtIHkxIGJvdHRvbSB5IGNvb3JkaW5hdGUgKG5vdCBpbmNsdWRlZCkgb2YgdGhlIHJlZ2lvbiB0byB3cml0ZSBpbnRvIHRoZSBzcGFyc2UgYXJyYXkuIE11c3QgYmUgZ3JlYXRlciB0aGFuIHkwLgorICogQHBhcmFtIHNyYyB1c2VyIGJ1ZmZlciB0byBmaWxsLiBNdXN0IGJlIGF0IGxlYXN0IHNpemVvZihpbnQzMikgKiAoICh5MSAtIHkwIC0gMSkgKiBzcmNfbGluZV9zdHJpZGUgKyAoeDEgLSB4MCAtIDEpICogc3JjX2NvbF9zdHJpZGUgKyAxKSBieXRlcyBsYXJnZS4KKyAqIEBwYXJhbSBzcmNfY29sX3N0cmlkZSBzcGFjaW5nIChpbiBlbGVtZW50cywgbm90IGluIGJ5dGVzKSBpbiB4IGRpbWVuc2lvbiBiZXR3ZWVuIGNvbnNlY3V0aXZlIGVsZW1lbnRzIG9mIHRoZSB1c2VyIGJ1ZmZlci4KKyAqIEBwYXJhbSBzcmNfbGluZV9zdHJpZGUgc3BhY2luZyAoaW4gZWxlbWVudHMsIG5vdCBpbiBieXRlcykgaW4geSBkaW1lbnNpb24gYmV0d2VlbiBjb25zZWN1dGl2ZSBlbGVtZW50cyBvZiB0aGUgdXNlciBidWZmZXIuCisgKiBAcGFyYW0gZm9yZ2l2aW5nIGlmIHNldCB0byBUUlVFIGFuZCB0aGUgcmVnaW9uIGlzIGludmFsaWQsIE9QSl9UUlVFIHdpbGwgc3RpbGwgYmUgcmV0dXJuZWQuCisgKiBAcmV0dXJuIE9QSl9UUlVFIGluIGNhc2Ugb2Ygc3VjY2Vzcy4KKyAqLworT1BKX0JPT0wgb3BqX3NwYXJzZV9hcnJheV9pbnQzMl93cml0ZShvcGpfc3BhcnNlX2FycmF5X2ludDMyX3QqIHNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfSU5UMzIqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBzcmNfY29sX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBzcmNfbGluZV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CT09MIGZvcmdpdmluZyk7CisKKy8qQH0qLworCisjZW5kaWYgLyogT1BKX1NQQVJTRV9BUlJBWV9IICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3QxLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3QxLmMKaW5kZXggMWFkODUwYy4uNzY3NDQzOCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90MS5jCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdDEuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKLSAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQKICAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKICAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KICAqCkBAIC04LDEwICs4LDEyIEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXgKICAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0LCBBbnRvbmluIERlc2NhbXBlCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KICAqIENvcHlyaWdodCAoYykgMjAwNywgQ2FsbHVtIExlcndpY2sgPHNlZ0BoYXh4ZWQuY29tPgorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDYXJsIEhldGhlcmluZ3RvbgorICogQ29weXJpZ2h0IChjKSAyMDE3LCBJbnRvUElYIFNBIDxzdXBwb3J0QGludG9waXguY29tPgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTM2LDI1MCArMzgsMTU3IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCisjZGVmaW5lIE9QSl9TS0lQX1BPSVNPTgogI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgorCisjaWZkZWYgX19TU0VfXworI2luY2x1ZGUgPHhtbWludHJpbi5oPgorI2VuZGlmCisjaWZkZWYgX19TU0UyX18KKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0dOVUNfXykKKyNwcmFnbWEgR0NDIHBvaXNvbiBtYWxsb2MgY2FsbG9jIHJlYWxsb2MgZnJlZQorI2VuZGlmCisKICNpbmNsdWRlICJ0MV9sdXRzLmgiCiAKIC8qKiBAZGVmZ3JvdXAgVDEgVDEgLSBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgdGllci0xIGNvZGluZyAqLwogLypAeyovCiAKKyNkZWZpbmUgVDFfRkxBR1MoeCwgeSkgKHQxLT5mbGFnc1t4ICsgMSArICgoeSAvIDQpICsgMSkgKiAodDEtPncrMildKQorCisjZGVmaW5lIG9wal90MV9zZXRjdXJjdHgoY3VyY3R4LCBjdHhubykgIGN1cmN0eCA9ICYobXFjKS0+Y3R4c1soT1BKX1VJTlQzMikoY3R4bm8pXQorCiAvKiogQG5hbWUgTG9jYWwgc3RhdGljIGZ1bmN0aW9ucyAqLwogLypAeyovCiAKLXN0YXRpYyBJTkxJTkUgT1BKX0JZVEUgb3BqX3QxX2dldGN0eG5vX3pjKE9QSl9VSU5UMzIgZiwgT1BKX1VJTlQzMiBvcmllbnQpOwotc3RhdGljIE9QSl9CWVRFIG9wal90MV9nZXRjdHhub19zYyhPUEpfVUlOVDMyIGYpOworc3RhdGljIElOTElORSBPUEpfQllURSBvcGpfdDFfZ2V0Y3R4bm9femMob3BqX21xY190ICptcWMsIE9QSl9VSU5UMzIgZik7CiBzdGF0aWMgSU5MSU5FIE9QSl9VSU5UMzIgb3BqX3QxX2dldGN0eG5vX21hZyhPUEpfVUlOVDMyIGYpOwotc3RhdGljIE9QSl9CWVRFIG9wal90MV9nZXRzcGIoT1BKX1VJTlQzMiBmKTsKIHN0YXRpYyBPUEpfSU5UMTYgb3BqX3QxX2dldG5tc2VkZWNfc2lnKE9QSl9VSU5UMzIgeCwgT1BKX1VJTlQzMiBiaXRwb3MpOwogc3RhdGljIE9QSl9JTlQxNiBvcGpfdDFfZ2V0bm1zZWRlY19yZWYoT1BKX1VJTlQzMiB4LCBPUEpfVUlOVDMyIGJpdHBvcyk7Ci1zdGF0aWMgdm9pZCBvcGpfdDFfdXBkYXRlZmxhZ3Mob3BqX2ZsYWdfdCAqZmxhZ3NwLCBPUEpfVUlOVDMyIHMsIE9QSl9VSU5UMzIgc3RyaWRlKTsKLS8qKgotRW5jb2RlIHNpZ25pZmljYW50IHBhc3MKLSovCi1zdGF0aWMgdm9pZCBvcGpfdDFfZW5jX3NpZ3Bhc3Nfc3RlcChvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBvcmllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKm5tc2VkZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB2c2MpOworc3RhdGljIElOTElORSB2b2lkIG9wal90MV91cGRhdGVfZmxhZ3Mob3BqX2ZsYWdfdCAqZmxhZ3NwLCBPUEpfVUlOVDMyIGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBzLCBPUEpfVUlOVDMyIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdnNjKTsKKwogCiAvKioKIERlY29kZSBzaWduaWZpY2FudCBwYXNzCiAqLwotI2lmIDAKLXN0YXRpYyB2b2lkIG9wal90MV9kZWNfc2lncGFzc19zdGVwKG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG9yaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvbmVwbHVzaGFsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHZzYyk7Ci0jZW5kaWYKIAogc3RhdGljIElOTElORSB2b2lkIG9wal90MV9kZWNfc2lncGFzc19zdGVwX3JhdygKLSAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9yaWVudCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgb25lcGx1c2hhbGYsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIHZzYyk7CisgICAgb3BqX3QxX3QgKnQxLAorICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKKyAgICBPUEpfSU5UMzIgKmRhdGFwLAorICAgIE9QSl9JTlQzMiBvbmVwbHVzaGFsZiwKKyAgICBPUEpfVUlOVDMyIHZzYywKKyAgICBPUEpfVUlOVDMyIHJvdyk7CiBzdGF0aWMgSU5MSU5FIHZvaWQgb3BqX3QxX2RlY19zaWdwYXNzX3N0ZXBfbXFjKAotICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnc3AsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhcCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgb3JpZW50LAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvbmVwbHVzaGFsZik7Ci1zdGF0aWMgSU5MSU5FIHZvaWQgb3BqX3QxX2RlY19zaWdwYXNzX3N0ZXBfbXFjX3ZzYygKLSAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9yaWVudCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgb25lcGx1c2hhbGYsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIHZzYyk7Ci0KKyAgICBvcGpfdDFfdCAqdDEsCisgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAorICAgIE9QSl9JTlQzMiAqZGF0YXAsCisgICAgT1BKX0lOVDMyIG9uZXBsdXNoYWxmLAorICAgIE9QSl9VSU5UMzIgcm93LAorICAgIE9QSl9VSU5UMzIgZmxhZ3Nfc3RyaWRlLAorICAgIE9QSl9VSU5UMzIgdnNjKTsKIAogLyoqCiBFbmNvZGUgc2lnbmlmaWNhbnQgcGFzcwogKi8KLXN0YXRpYyB2b2lkIG9wal90MV9lbmNfc2lncGFzcyggb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBvcmllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqbm1zZWRlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjYmxrc3R5KTsKK3N0YXRpYyB2b2lkIG9wal90MV9lbmNfc2lncGFzcyhvcGpfdDFfdCAqdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIGJwbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpubXNlZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjYmxrc3R5KTsKIAogLyoqCiBEZWNvZGUgc2lnbmlmaWNhbnQgcGFzcwogKi8KIHN0YXRpYyB2b2lkIG9wal90MV9kZWNfc2lncGFzc19yYXcoCi0gICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBicG5vLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvcmllbnQsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIGNibGtzdHkpOwotc3RhdGljIHZvaWQgb3BqX3QxX2RlY19zaWdwYXNzX21xYygKLSAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIGJwbm8sCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9yaWVudCk7Ci1zdGF0aWMgdm9pZCBvcGpfdDFfZGVjX3NpZ3Bhc3NfbXFjX3ZzYygKLSAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIGJwbm8sCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9yaWVudCk7Ci0KLQorICAgIG9wal90MV90ICp0MSwKKyAgICBPUEpfSU5UMzIgYnBubywKKyAgICBPUEpfSU5UMzIgY2Jsa3N0eSk7CiAKIC8qKgogRW5jb2RlIHJlZmluZW1lbnQgcGFzcwogKi8KLXN0YXRpYyB2b2lkIG9wal90MV9lbmNfcmVmcGFzc19zdGVwKG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKm5tc2VkZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB2c2MpOwotCi0KLS8qKgotRW5jb2RlIHJlZmluZW1lbnQgcGFzcwotKi8KLXN0YXRpYyB2b2lkIG9wal90MV9lbmNfcmVmcGFzcyggb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpubXNlZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNibGtzdHkpOworc3RhdGljIHZvaWQgb3BqX3QxX2VuY19yZWZwYXNzKG9wal90MV90ICp0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKm5tc2VkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgdHlwZSk7CiAKIC8qKgogRGVjb2RlIHJlZmluZW1lbnQgcGFzcwogKi8KIHN0YXRpYyB2b2lkIG9wal90MV9kZWNfcmVmcGFzc19yYXcoCi0gICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBicG5vLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBjYmxrc3R5KTsKLXN0YXRpYyB2b2lkIG9wal90MV9kZWNfcmVmcGFzc19tcWMoCi0gICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBicG5vKTsKLXN0YXRpYyB2b2lkIG9wal90MV9kZWNfcmVmcGFzc19tcWNfdnNjKAotICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubyk7CisgICAgb3BqX3QxX3QgKnQxLAorICAgIE9QSl9JTlQzMiBicG5vKTsKIAogCiAvKioKIERlY29kZSByZWZpbmVtZW50IHBhc3MKICovCi0jaWYgMAotc3RhdGljIHZvaWQgb3BqX3QxX2RlY19yZWZwYXNzX3N0ZXAob3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwb3NoYWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIG5lZ2hhbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB2c2MpOwotI2VuZGlmCiAKIHN0YXRpYyBJTkxJTkUgdm9pZCAgb3BqX3QxX2RlY19yZWZwYXNzX3N0ZXBfcmF3KAotICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnc3AsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhcCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcG9zaGFsZiwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgbmVnaGFsZiwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgdnNjKTsKKyAgICBvcGpfdDFfdCAqdDEsCisgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAorICAgIE9QSl9JTlQzMiAqZGF0YXAsCisgICAgT1BKX0lOVDMyIHBvc2hhbGYsCisgICAgT1BKX1VJTlQzMiByb3cpOwogc3RhdGljIElOTElORSB2b2lkIG9wal90MV9kZWNfcmVmcGFzc19zdGVwX21xYygKLSAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBvc2hhbGYsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIG5lZ2hhbGYpOwotc3RhdGljIElOTElORSB2b2lkIG9wal90MV9kZWNfcmVmcGFzc19zdGVwX21xY192c2MoCi0gICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGFwLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwb3NoYWxmLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBuZWdoYWxmLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB2c2MpOworICAgIG9wal90MV90ICp0MSwKKyAgICBvcGpfZmxhZ190ICpmbGFnc3AsCisgICAgT1BKX0lOVDMyICpkYXRhcCwKKyAgICBPUEpfSU5UMzIgcG9zaGFsZiwKKyAgICBPUEpfVUlOVDMyIHJvdyk7CiAKIAotCi0vKioKLUVuY29kZSBjbGVhbi11cCBwYXNzCi0qLwotc3RhdGljIHZvaWQgb3BqX3QxX2VuY19jbG5wYXNzX3N0ZXAoCi0JCW9wal90MV90ICp0MSwKLQkJb3BqX2ZsYWdfdCAqZmxhZ3NwLAotCQlPUEpfSU5UMzIgKmRhdGFwLAotCQlPUEpfVUlOVDMyIG9yaWVudCwKLQkJT1BKX0lOVDMyIGJwbm8sCi0JCU9QSl9JTlQzMiBvbmUsCi0JCU9QSl9JTlQzMiAqbm1zZWRlYywKLQkJT1BKX1VJTlQzMiBwYXJ0aWFsLAotCQlPUEpfVUlOVDMyIHZzYyk7CiAvKioKIERlY29kZSBjbGVhbi11cCBwYXNzCiAqLwotc3RhdGljIHZvaWQgb3BqX3QxX2RlY19jbG5wYXNzX3N0ZXBfcGFydGlhbCgKLQkJb3BqX3QxX3QgKnQxLAotCQlvcGpfZmxhZ190ICpmbGFnc3AsCi0JCU9QSl9JTlQzMiAqZGF0YXAsCi0JCU9QSl9JTlQzMiBvcmllbnQsCi0JCU9QSl9JTlQzMiBvbmVwbHVzaGFsZik7CisKIHN0YXRpYyB2b2lkIG9wal90MV9kZWNfY2xucGFzc19zdGVwKAotCQlvcGpfdDFfdCAqdDEsCi0JCW9wal9mbGFnX3QgKmZsYWdzcCwKLQkJT1BKX0lOVDMyICpkYXRhcCwKLQkJT1BKX0lOVDMyIG9yaWVudCwKLQkJT1BKX0lOVDMyIG9uZXBsdXNoYWxmKTsKLXN0YXRpYyB2b2lkIG9wal90MV9kZWNfY2xucGFzc19zdGVwX3ZzYygKLQkJb3BqX3QxX3QgKnQxLAotCQlvcGpfZmxhZ190ICpmbGFnc3AsCi0JCU9QSl9JTlQzMiAqZGF0YXAsCi0JCU9QSl9JTlQzMiBvcmllbnQsCi0JCU9QSl9JTlQzMiBvbmVwbHVzaGFsZiwKLQkJT1BKX0lOVDMyIHBhcnRpYWwsCi0JCU9QSl9JTlQzMiB2c2MpOworICAgIG9wal90MV90ICp0MSwKKyAgICBvcGpfZmxhZ190ICpmbGFnc3AsCisgICAgT1BKX0lOVDMyICpkYXRhcCwKKyAgICBPUEpfSU5UMzIgb25lcGx1c2hhbGYsCisgICAgT1BKX1VJTlQzMiByb3csCisgICAgT1BKX1VJTlQzMiB2c2MpOworCiAvKioKIEVuY29kZSBjbGVhbi11cCBwYXNzCiAqLwogc3RhdGljIHZvaWQgb3BqX3QxX2VuY19jbG5wYXNzKAotCQlvcGpfdDFfdCAqdDEsCi0JCU9QSl9JTlQzMiBicG5vLAotCQlPUEpfVUlOVDMyIG9yaWVudCwKLQkJT1BKX0lOVDMyICpubXNlZGVjLAotCQlPUEpfVUlOVDMyIGNibGtzdHkpOwotLyoqCi1EZWNvZGUgY2xlYW4tdXAgcGFzcwotKi8KLXN0YXRpYyB2b2lkIG9wal90MV9kZWNfY2xucGFzcygKLQkJb3BqX3QxX3QgKnQxLAotCQlPUEpfSU5UMzIgYnBubywKLQkJT1BKX0lOVDMyIG9yaWVudCwKLQkJT1BKX0lOVDMyIGNibGtzdHkpOworICAgIG9wal90MV90ICp0MSwKKyAgICBPUEpfSU5UMzIgYnBubywKKyAgICBPUEpfSU5UMzIgKm5tc2VkZWMsCisgICAgT1BKX1VJTlQzMiBjYmxrc3R5KTsKIAogc3RhdGljIE9QSl9GTE9BVDY0IG9wal90MV9nZXR3bXNlZGVjKAotCQlPUEpfSU5UMzIgbm1zZWRlYywKLQkJT1BKX1VJTlQzMiBjb21wbm8sCi0JCU9QSl9VSU5UMzIgbGV2ZWwsCi0JCU9QSl9VSU5UMzIgb3JpZW50LAotCQlPUEpfSU5UMzIgYnBubywKLQkJT1BKX1VJTlQzMiBxbWZiaWQsCi0JCU9QSl9GTE9BVDY0IHN0ZXBzaXplLAotCQlPUEpfVUlOVDMyIG51bWNvbXBzLAotCQljb25zdCBPUEpfRkxPQVQ2NCAqIG1jdF9ub3JtcywKLQkJT1BKX1VJTlQzMiBtY3RfbnVtY29tcHMpOworICAgIE9QSl9JTlQzMiBubXNlZGVjLAorICAgIE9QSl9VSU5UMzIgY29tcG5vLAorICAgIE9QSl9VSU5UMzIgbGV2ZWwsCisgICAgT1BKX1VJTlQzMiBvcmllbnQsCisgICAgT1BKX0lOVDMyIGJwbm8sCisgICAgT1BKX1VJTlQzMiBxbWZiaWQsCisgICAgT1BKX0ZMT0FUNjQgc3RlcHNpemUsCisgICAgT1BKX1VJTlQzMiBudW1jb21wcywKKyAgICBjb25zdCBPUEpfRkxPQVQ2NCAqIG1jdF9ub3JtcywKKyAgICBPUEpfVUlOVDMyIG1jdF9udW1jb21wcyk7CiAKLXN0YXRpYyB2b2lkIG9wal90MV9lbmNvZGVfY2Jsayggb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX2NibGtfZW5jX3QqIGNibGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgb3JpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNvbXBubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBxbWZiaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDY0IHN0ZXBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNibGtzdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbnVtY29tcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICogdGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1BKX0ZMT0FUNjQgKiBtY3Rfbm9ybXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbWN0X251bWNvbXBzKTsKK3N0YXRpYyB2b2lkIG9wal90MV9lbmNvZGVfY2JsayhvcGpfdDFfdCAqdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9jYmxrX2VuY190KiBjYmxrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgb3JpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY29tcG5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBxbWZiaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUNjQgc3RlcHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjYmxrc3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbnVtY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlX3QgKiB0aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9QSl9GTE9BVDY0ICogbWN0X25vcm1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbWN0X251bWNvbXBzKTsKIAogLyoqCiBEZWNvZGUgMSBjb2RlLWJsb2NrCkBAIC0yODgsMTYgKzE5NywyMiBAQAogQHBhcmFtIG9yaWVudAogQHBhcmFtIHJvaXNoaWZ0IFJlZ2lvbiBvZiBpbnRlcmVzdCBzaGlmdGluZyB2YWx1ZQogQHBhcmFtIGNibGtzdHkgQ29kZS1ibG9jayBzdHlsZQorQHBhcmFtIHBfbWFuYWdlciB0aGUgZXZlbnQgbWFuYWdlcgorQHBhcmFtIHBfbWFuYWdlcl9tdXRleCBtdXRleCBmb3IgdGhlIGV2ZW50IG1hbmFnZXIKK0BwYXJhbSBjaGVja19wdGVybSB3aGV0aGVyIFBURVJNIGNvcnJlY3QgdGVybWluYXRpb24gc2hvdWxkIGJlIGNoZWNrZWQKICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3QxX2RlY29kZV9jYmxrKCBvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX2NibGtfZGVjX3QqIGNibGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG9yaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcm9pc2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNibGtzdHkpOworc3RhdGljIE9QSl9CT09MIG9wal90MV9kZWNvZGVfY2JsayhvcGpfdDFfdCAqdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfY2Jsa19kZWNfdCogY2JsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBvcmllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcm9pc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY2Jsa3N0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9tdXRleF90KiBwX21hbmFnZXJfbXV0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CT09MIGNoZWNrX3B0ZXJtKTsKIAotc3RhdGljIE9QSl9CT09MIG9wal90MV9hbGxvY2F0ZV9idWZmZXJzKCAgIG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgaCk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX3QxX2FsbG9jYXRlX2J1ZmZlcnMob3BqX3QxX3QgKnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGgpOwogCiAvKkB9Ki8KIApAQCAtMzA1LDkwNyArMjIwLDEzMTAgQEAKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotc3RhdGljIE9QSl9CWVRFIG9wal90MV9nZXRjdHhub196YyhPUEpfVUlOVDMyIGYsIE9QSl9VSU5UMzIgb3JpZW50KSB7Ci0JcmV0dXJuIGx1dF9jdHhub196Y1sob3JpZW50IDw8IDgpIHwgKGYgJiBUMV9TSUdfT1RIKV07CitzdGF0aWMgSU5MSU5FIE9QSl9CWVRFIG9wal90MV9nZXRjdHhub196YyhvcGpfbXFjX3QgKm1xYywgT1BKX1VJTlQzMiBmKQoreworICAgIHJldHVybiBtcWMtPmx1dF9jdHhub196Y19vcmllbnRbKGYgJiBUMV9TSUdNQV9ORUlHSEJPVVJTKV07CiB9CiAKLXN0YXRpYyBPUEpfQllURSBvcGpfdDFfZ2V0Y3R4bm9fc2MoT1BKX1VJTlQzMiBmKSB7Ci0JcmV0dXJuIGx1dF9jdHhub19zY1soZiAmIChUMV9TSUdfUFJJTSB8IFQxX1NHTikpID4+IDRdOworc3RhdGljIElOTElORSBPUEpfVUlOVDMyIG9wal90MV9nZXRjdHh0bm9fc2Nfb3Jfc3BiX2luZGV4KE9QSl9VSU5UMzIgZlgsCisgICAgICAgIE9QSl9VSU5UMzIgcGZYLAorICAgICAgICBPUEpfVUlOVDMyIG5mWCwKKyAgICAgICAgT1BKX1VJTlQzMiBjaSkKK3sKKyAgICAvKgorICAgICAgMCBwZlggVDFfQ0hJX1RISVMgICAgICAgICAgIFQxX0xVVF9TR05fVworICAgICAgMSB0ZlggVDFfU0lHTUFfMSAgICAgICAgICAgIFQxX0xVVF9TSUdfTgorICAgICAgMiBuZlggVDFfQ0hJX1RISVMgICAgICAgICAgIFQxX0xVVF9TR05fRQorICAgICAgMyB0ZlggVDFfU0lHTUFfMyAgICAgICAgICAgIFQxX0xVVF9TSUdfVworICAgICAgNCAgZlggVDFfQ0hJXyhUSElTIC0gMSkgICAgIFQxX0xVVF9TR05fTgorICAgICAgNSB0ZlggVDFfU0lHTUFfNSAgICAgICAgICAgIFQxX0xVVF9TSUdfRQorICAgICAgNiAgZlggVDFfQ0hJXyhUSElTICsgMSkgICAgIFQxX0xVVF9TR05fUworICAgICAgNyB0ZlggVDFfU0lHTUFfNyAgICAgICAgICAgIFQxX0xVVF9TSUdfUworICAgICovCisKKyAgICBPUEpfVUlOVDMyIGx1ID0gKGZYID4+IChjaSAqIDNVKSkgJiAoVDFfU0lHTUFfMSB8IFQxX1NJR01BXzMgfCBUMV9TSUdNQV81IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfU0lHTUFfNyk7CisKKyAgICBsdSB8PSAocGZYID4+IChUMV9DSElfVEhJU19JICAgICAgKyAoY2kgKiAzVSkpKSAmICgxVSA8PCAwKTsKKyAgICBsdSB8PSAobmZYID4+IChUMV9DSElfVEhJU19JIC0gMlUgKyAoY2kgKiAzVSkpKSAmICgxVSA8PCAyKTsKKyAgICBpZiAoY2kgPT0gMFUpIHsKKyAgICAgICAgbHUgfD0gKGZYID4+IChUMV9DSElfMF9JIC0gNFUpKSAmICgxVSA8PCA0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBsdSB8PSAoZlggPj4gKFQxX0NISV8xX0kgLSA0VSArICgoY2kgLSAxVSkgKiAzVSkpKSAmICgxVSA8PCA0KTsKKyAgICB9CisgICAgbHUgfD0gKGZYID4+IChUMV9DSElfMl9JIC0gNlUgKyAoY2kgKiAzVSkpKSAmICgxVSA8PCA2KTsKKyAgICByZXR1cm4gbHU7CiB9CiAKLXN0YXRpYyBPUEpfVUlOVDMyIG9wal90MV9nZXRjdHhub19tYWcoT1BKX1VJTlQzMiBmKSB7Ci0JT1BKX1VJTlQzMiB0bXAxID0gKGYgJiBUMV9TSUdfT1RIKSA/IFQxX0NUWE5PX01BRyArIDEgOiBUMV9DVFhOT19NQUc7Ci0JT1BKX1VJTlQzMiB0bXAyID0gKGYgJiBUMV9SRUZJTkUpID8gVDFfQ1RYTk9fTUFHICsgMiA6IHRtcDE7Ci0JcmV0dXJuICh0bXAyKTsKK3N0YXRpYyBJTkxJTkUgT1BKX0JZVEUgb3BqX3QxX2dldGN0eG5vX3NjKE9QSl9VSU5UMzIgbHUpCit7CisgICAgcmV0dXJuIGx1dF9jdHhub19zY1tsdV07CiB9CiAKLXN0YXRpYyBPUEpfQllURSBvcGpfdDFfZ2V0c3BiKE9QSl9VSU5UMzIgZikgewotCXJldHVybiBsdXRfc3BiWyhmICYgKFQxX1NJR19QUklNIHwgVDFfU0dOKSkgPj4gNF07CitzdGF0aWMgSU5MSU5FIE9QSl9VSU5UMzIgb3BqX3QxX2dldGN0eG5vX21hZyhPUEpfVUlOVDMyIGYpCit7CisgICAgT1BKX1VJTlQzMiB0bXAgPSAoZiAmIFQxX1NJR01BX05FSUdIQk9VUlMpID8gVDFfQ1RYTk9fTUFHICsgMSA6IFQxX0NUWE5PX01BRzsKKyAgICBPUEpfVUlOVDMyIHRtcDIgPSAoZiAmIFQxX01VXzApID8gVDFfQ1RYTk9fTUFHICsgMiA6IHRtcDsKKyAgICByZXR1cm4gdG1wMjsKIH0KIAotc3RhdGljIE9QSl9JTlQxNiBvcGpfdDFfZ2V0bm1zZWRlY19zaWcoT1BKX1VJTlQzMiB4LCBPUEpfVUlOVDMyIGJpdHBvcykgewotCWlmIChiaXRwb3MgPiAwKSB7Ci0JCXJldHVybiBsdXRfbm1zZWRlY19zaWdbKHggPj4gKGJpdHBvcykpICYgKCgxIDw8IFQxX05NU0VERUNfQklUUykgLSAxKV07Ci0JfQotCQotCXJldHVybiBsdXRfbm1zZWRlY19zaWcwW3ggJiAoKDEgPDwgVDFfTk1TRURFQ19CSVRTKSAtIDEpXTsKK3N0YXRpYyBJTkxJTkUgT1BKX0JZVEUgb3BqX3QxX2dldHNwYihPUEpfVUlOVDMyIGx1KQoreworICAgIHJldHVybiBsdXRfc3BiW2x1XTsKIH0KIAotc3RhdGljIE9QSl9JTlQxNiBvcGpfdDFfZ2V0bm1zZWRlY19yZWYoT1BKX1VJTlQzMiB4LCBPUEpfVUlOVDMyIGJpdHBvcykgewotCWlmIChiaXRwb3MgPiAwKSB7Ci0JCXJldHVybiBsdXRfbm1zZWRlY19yZWZbKHggPj4gKGJpdHBvcykpICYgKCgxIDw8IFQxX05NU0VERUNfQklUUykgLSAxKV07Ci0JfQorc3RhdGljIE9QSl9JTlQxNiBvcGpfdDFfZ2V0bm1zZWRlY19zaWcoT1BKX1VJTlQzMiB4LCBPUEpfVUlOVDMyIGJpdHBvcykKK3sKKyAgICBpZiAoYml0cG9zID4gMCkgeworICAgICAgICByZXR1cm4gbHV0X25tc2VkZWNfc2lnWyh4ID4+IChiaXRwb3MpKSAmICgoMSA8PCBUMV9OTVNFREVDX0JJVFMpIC0gMSldOworICAgIH0KKworICAgIHJldHVybiBsdXRfbm1zZWRlY19zaWcwW3ggJiAoKDEgPDwgVDFfTk1TRURFQ19CSVRTKSAtIDEpXTsKK30KKworc3RhdGljIE9QSl9JTlQxNiBvcGpfdDFfZ2V0bm1zZWRlY19yZWYoT1BKX1VJTlQzMiB4LCBPUEpfVUlOVDMyIGJpdHBvcykKK3sKKyAgICBpZiAoYml0cG9zID4gMCkgeworICAgICAgICByZXR1cm4gbHV0X25tc2VkZWNfcmVmWyh4ID4+IChiaXRwb3MpKSAmICgoMSA8PCBUMV9OTVNFREVDX0JJVFMpIC0gMSldOworICAgIH0KIAogICAgIHJldHVybiBsdXRfbm1zZWRlY19yZWYwW3ggJiAoKDEgPDwgVDFfTk1TRURFQ19CSVRTKSAtIDEpXTsKIH0KIAotc3RhdGljIHZvaWQgb3BqX3QxX3VwZGF0ZWZsYWdzKG9wal9mbGFnX3QgKmZsYWdzcCwgT1BKX1VJTlQzMiBzLCBPUEpfVUlOVDMyIHN0cmlkZSkgewotCW9wal9mbGFnX3QgKm5wID0gZmxhZ3NwIC0gc3RyaWRlOwotCW9wal9mbGFnX3QgKnNwID0gZmxhZ3NwICsgc3RyaWRlOwotCi0Jc3RhdGljIGNvbnN0IG9wal9mbGFnX3QgbW9kW10gPSB7Ci0JCVQxX1NJR19TLCBUMV9TSUdfU3xUMV9TR05fUywKLQkJVDFfU0lHX0UsIFQxX1NJR19FfFQxX1NHTl9FLAotCQlUMV9TSUdfVywgVDFfU0lHX1d8VDFfU0dOX1csCi0JCVQxX1NJR19OLCBUMV9TSUdfTnxUMV9TR05fTgotCX07Ci0KLQlucFstMV0gfD0gVDFfU0lHX1NFOwotCW5wWzBdICB8PSBtb2Rbc107Ci0JbnBbMV0gIHw9IFQxX1NJR19TVzsKLQotCWZsYWdzcFstMV0gfD0gbW9kW3MrMl07Ci0JZmxhZ3NwWzBdICB8PSBUMV9TSUc7Ci0JZmxhZ3NwWzFdICB8PSBtb2Rbcys0XTsKLQotCXNwWy0xXSB8PSBUMV9TSUdfTkU7Ci0Jc3BbMF0gIHw9IG1vZFtzKzZdOwotCXNwWzFdICB8PSBUMV9TSUdfTlc7CisjZGVmaW5lIG9wal90MV91cGRhdGVfZmxhZ3NfbWFjcm8oZmxhZ3MsIGZsYWdzcCwgY2ksIHMsIHN0cmlkZSwgdnNjKSBcCit7IFwKKyAgICAvKiBlYXN0ICovIFwKKyAgICBmbGFnc3BbLTFdIHw9IFQxX1NJR01BXzUgPDwgKDNVICogY2kpOyBcCisgXAorICAgIC8qIG1hcmsgdGFyZ2V0IGFzIHNpZ25pZmljYW50ICovIFwKKyAgICBmbGFncyB8PSAoKHMgPDwgVDFfQ0hJXzFfSSkgfCBUMV9TSUdNQV80KSA8PCAoM1UgKiBjaSk7IFwKKyBcCisgICAgLyogd2VzdCAqLyBcCisgICAgZmxhZ3NwWzFdIHw9IFQxX1NJR01BXzMgPDwgKDNVICogY2kpOyBcCisgXAorICAgIC8qIG5vcnRoLXdlc3QsIG5vcnRoLCBub3J0aC1lYXN0ICovIFwKKyAgICBpZiAoY2kgPT0gMFUgJiYgISh2c2MpKSB7IFwKKyAgICAgICAgb3BqX2ZsYWdfdCogbm9ydGggPSBmbGFnc3AgLSAoc3RyaWRlKTsgXAorICAgICAgICAqbm9ydGggfD0gKHMgPDwgVDFfQ0hJXzVfSSkgfCBUMV9TSUdNQV8xNjsgXAorICAgICAgICBub3J0aFstMV0gfD0gVDFfU0lHTUFfMTc7IFwKKyAgICAgICAgbm9ydGhbMV0gfD0gVDFfU0lHTUFfMTU7IFwKKyAgICB9IFwKKyBcCisgICAgLyogc291dGgtd2VzdCwgc291dGgsIHNvdXRoLWVhc3QgKi8gXAorICAgIGlmIChjaSA9PSAzVSkgeyBcCisgICAgICAgIG9wal9mbGFnX3QqIHNvdXRoID0gZmxhZ3NwICsgKHN0cmlkZSk7IFwKKyAgICAgICAgKnNvdXRoIHw9IChzIDw8IFQxX0NISV8wX0kpIHwgVDFfU0lHTUFfMTsgXAorICAgICAgICBzb3V0aFstMV0gfD0gVDFfU0lHTUFfMjsgXAorICAgICAgICBzb3V0aFsxXSB8PSBUMV9TSUdNQV8wOyBcCisgICAgfSBcCiB9CiAKLXN0YXRpYyB2b2lkIG9wal90MV9lbmNfc2lncGFzc19zdGVwKCAgIG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG9yaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIGJwbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqbm1zZWRlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB2c2MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorCitzdGF0aWMgSU5MSU5FIHZvaWQgb3BqX3QxX3VwZGF0ZV9mbGFncyhvcGpfZmxhZ190ICpmbGFnc3AsIE9QSl9VSU5UMzIgY2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHMsIE9QSl9VSU5UMzIgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB2c2MpCiB7Ci0JT1BKX0lOVDMyIHY7Ci0gICAgT1BKX1VJTlQzMiBmbGFnOwotCQotCW9wal9tcWNfdCAqbXFjID0gdDEtPm1xYzsJLyogTVFDIGNvbXBvbmVudCAqLwotCQotCWZsYWcgPSB2c2MgPyAoT1BKX1VJTlQzMikoKCpmbGFnc3ApICYgKH4oVDFfU0lHX1MgfCBUMV9TSUdfU0UgfCBUMV9TSUdfU1cgfCBUMV9TR05fUykpKSA6IChPUEpfVUlOVDMyKSgqZmxhZ3NwKTsKLQlpZiAoKGZsYWcgJiBUMV9TSUdfT1RIKSAmJiAhKGZsYWcgJiAoVDFfU0lHIHwgVDFfVklTSVQpKSkgewotCQl2ID0gb3BqX2ludF9hYnMoKmRhdGFwKSAmIG9uZSA/IDEgOiAwOwotCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub196YyhmbGFnLCBvcmllbnQpKTsJLyogRVNTQUkgKi8KLQkJaWYgKHR5cGUgPT0gVDFfVFlQRV9SQVcpIHsJLyogQllQQVNTL0xBWlkgTU9ERSAqLwotCQkJb3BqX21xY19ieXBhc3NfZW5jKG1xYywgKE9QSl9VSU5UMzIpdik7Ci0JCX0gZWxzZSB7Ci0JCQlvcGpfbXFjX2VuY29kZShtcWMsIChPUEpfVUlOVDMyKXYpOwotCQl9Ci0JCWlmICh2KSB7Ci0JCQl2ID0gKmRhdGFwIDwgMCA/IDEgOiAwOwotCQkJKm5tc2VkZWMgKz0Jb3BqX3QxX2dldG5tc2VkZWNfc2lnKChPUEpfVUlOVDMyKW9wal9pbnRfYWJzKCpkYXRhcCksIChPUEpfVUlOVDMyKShicG5vKSk7Ci0JCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub19zYyhmbGFnKSk7CS8qIEVTU0FJICovCi0JCQlpZiAodHlwZSA9PSBUMV9UWVBFX1JBVykgewkvKiBCWVBBU1MvTEFaWSBNT0RFICovCi0JCQkJb3BqX21xY19ieXBhc3NfZW5jKG1xYywgKE9QSl9VSU5UMzIpdik7Ci0JCQl9IGVsc2UgewotCQkJCW9wal9tcWNfZW5jb2RlKG1xYywgKE9QSl9VSU5UMzIpKHYgXiBvcGpfdDFfZ2V0c3BiKChPUEpfVUlOVDMyKWZsYWcpKSk7Ci0JCQl9Ci0JCQlvcGpfdDFfdXBkYXRlZmxhZ3MoZmxhZ3NwLCAoT1BKX1VJTlQzMil2LCB0MS0+ZmxhZ3Nfc3RyaWRlKTsKLQkJfQotCQkqZmxhZ3NwIHw9IFQxX1ZJU0lUOwotCX0KKyAgICBvcGpfdDFfdXBkYXRlX2ZsYWdzX21hY3JvKCpmbGFnc3AsIGZsYWdzcCwgY2ksIHMsIHN0cmlkZSwgdnNjKTsKIH0KIAorLyoqCitFbmNvZGUgc2lnbmlmaWNhbnQgcGFzcworKi8KK3N0YXRpYyBJTkxJTkUgdm9pZCBvcGpfdDFfZW5jX3NpZ3Bhc3Nfc3RlcChvcGpfdDFfdCAqdDEsCisgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKKyAgICAgICAgT1BKX0lOVDMyICpkYXRhcCwKKyAgICAgICAgT1BKX0lOVDMyIGJwbm8sCisgICAgICAgIE9QSl9JTlQzMiBvbmUsCisgICAgICAgIE9QSl9JTlQzMiAqbm1zZWRlYywKKyAgICAgICAgT1BKX0JZVEUgdHlwZSwKKyAgICAgICAgT1BKX1VJTlQzMiBjaSwKKyAgICAgICAgT1BKX1VJTlQzMiB2c2MpCit7CisgICAgT1BKX1VJTlQzMiB2OworCisgICAgb3BqX21xY190ICptcWMgPSAmKHQxLT5tcWMpOyAgIC8qIE1RQyBjb21wb25lbnQgKi8KKworICAgIE9QSl9VSU5UMzIgY29uc3QgZmxhZ3MgPSAqZmxhZ3NwOworCisgICAgaWYgKChmbGFncyAmICgoVDFfU0lHTUFfVEhJUyB8IFQxX1BJX1RISVMpIDw8IChjaSAqIDNVKSkpID09IDBVICYmCisgICAgICAgICAgICAoZmxhZ3MgJiAoVDFfU0lHTUFfTkVJR0hCT1VSUyA8PCAoY2kgKiAzVSkpKSAhPSAwVSkgeworICAgICAgICBPUEpfVUlOVDMyIGN0eHQxID0gb3BqX3QxX2dldGN0eG5vX3pjKG1xYywgZmxhZ3MgPj4gKGNpICogM1UpKTsKKyAgICAgICAgdiA9IChvcGpfaW50X2FicygqZGF0YXApICYgb25lKSA/IDEgOiAwOworI2lmZGVmIERFQlVHX0VOQ19TSUcKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICBjdHh0MT0lZFxuIiwgY3R4dDEpOworI2VuZGlmCisgICAgICAgIG9wal9tcWNfc2V0Y3VyY3R4KG1xYywgY3R4dDEpOworICAgICAgICBpZiAodHlwZSA9PSBUMV9UWVBFX1JBVykgeyAgLyogQllQQVNTL0xBWlkgTU9ERSAqLworICAgICAgICAgICAgb3BqX21xY19ieXBhc3NfZW5jKG1xYywgdik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcGpfbXFjX2VuY29kZShtcWMsIHYpOworICAgICAgICB9CisgICAgICAgIGlmICh2KSB7CisgICAgICAgICAgICBPUEpfVUlOVDMyIGx1ID0gb3BqX3QxX2dldGN0eHRub19zY19vcl9zcGJfaW5kZXgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmbGFnc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzcFstMV0sIGZsYWdzcFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2kpOworICAgICAgICAgICAgT1BKX1VJTlQzMiBjdHh0MiA9IG9wal90MV9nZXRjdHhub19zYyhsdSk7CisgICAgICAgICAgICB2ID0gKmRhdGFwIDwgMCA/IDFVIDogMFU7CisgICAgICAgICAgICAqbm1zZWRlYyArPSBvcGpfdDFfZ2V0bm1zZWRlY19zaWcoKE9QSl9VSU5UMzIpb3BqX2ludF9hYnMoKmRhdGFwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMilicG5vKTsKKyNpZmRlZiBERUJVR19FTkNfU0lHCisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgIGN0eHQyPSVkXG4iLCBjdHh0Mik7CisjZW5kaWYKKyAgICAgICAgICAgIG9wal9tcWNfc2V0Y3VyY3R4KG1xYywgY3R4dDIpOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gVDFfVFlQRV9SQVcpIHsgIC8qIEJZUEFTUy9MQVpZIE1PREUgKi8KKyAgICAgICAgICAgICAgICBvcGpfbXFjX2J5cGFzc19lbmMobXFjLCB2KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBzcGIgPSBvcGpfdDFfZ2V0c3BiKGx1KTsKKyNpZmRlZiBERUJVR19FTkNfU0lHCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICBzcGI9JWRcbiIsIHNwYik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBvcGpfbXFjX2VuY29kZShtcWMsIHYgXiBzcGIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3BqX3QxX3VwZGF0ZV9mbGFncyhmbGFnc3AsIGNpLCB2LCB0MS0+dyArIDIsIHZzYyk7CisgICAgICAgIH0KKyAgICAgICAgKmZsYWdzcCB8PSBUMV9QSV9USElTIDw8IChjaSAqIDNVKTsKKyAgICB9Cit9CiAKIHN0YXRpYyBJTkxJTkUgdm9pZCBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9yYXcoCi0gICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGFwLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvcmllbnQsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIG9uZXBsdXNoYWxmLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB2c2MpCisgICAgb3BqX3QxX3QgKnQxLAorICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKKyAgICBPUEpfSU5UMzIgKmRhdGFwLAorICAgIE9QSl9JTlQzMiBvbmVwbHVzaGFsZiwKKyAgICBPUEpfVUlOVDMyIHZzYywKKyAgICBPUEpfVUlOVDMyIGNpKQogewotICAgICAgICBPUEpfSU5UMzIgdiwgZmxhZzsKLSAgICAgICAgb3BqX3Jhd190ICpyYXcgPSB0MS0+cmF3OyAgICAgICAvKiBSQVcgY29tcG9uZW50ICovCi0gICAgICAgIE9QSl9BUkdfTk9UX1VTRUQob3JpZW50KTsKLSAgICAgICAKLSAgICAgICAgZmxhZyA9IHZzYyA/ICgoKmZsYWdzcCkgJiAofihUMV9TSUdfUyB8IFQxX1NJR19TRSB8IFQxX1NJR19TVyB8IFQxX1NHTl9TKSkpIDogKCpmbGFnc3ApOwotICAgICAgICBpZiAoKGZsYWcgJiBUMV9TSUdfT1RIKSAmJiAhKGZsYWcgJiAoVDFfU0lHIHwgVDFfVklTSVQpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wal9yYXdfZGVjb2RlKHJhdykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IChPUEpfSU5UMzIpb3BqX3Jhd19kZWNvZGUocmF3KTsgICAgLyogRVNTQUkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFwID0gdiA/IC1vbmVwbHVzaGFsZiA6IG9uZXBsdXNoYWxmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfdXBkYXRlZmxhZ3MoZmxhZ3NwLCAoT1BKX1VJTlQzMil2LCB0MS0+ZmxhZ3Nfc3RyaWRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqZmxhZ3NwIHw9IFQxX1ZJU0lUOworICAgIE9QSl9VSU5UMzIgdjsKKyAgICBvcGpfbXFjX3QgKm1xYyA9ICYodDEtPm1xYyk7ICAgICAgIC8qIFJBVyBjb21wb25lbnQgKi8KKworICAgIE9QSl9VSU5UMzIgY29uc3QgZmxhZ3MgPSAqZmxhZ3NwOworCisgICAgaWYgKChmbGFncyAmICgoVDFfU0lHTUFfVEhJUyB8IFQxX1BJX1RISVMpIDw8IChjaSAqIDNVKSkpID09IDBVICYmCisgICAgICAgICAgICAoZmxhZ3MgJiAoVDFfU0lHTUFfTkVJR0hCT1VSUyA8PCAoY2kgKiAzVSkpKSAhPSAwVSkgeworICAgICAgICBpZiAob3BqX21xY19yYXdfZGVjb2RlKG1xYykpIHsKKyAgICAgICAgICAgIHYgPSBvcGpfbXFjX3Jhd19kZWNvZGUobXFjKTsKKyAgICAgICAgICAgICpkYXRhcCA9IHYgPyAtb25lcGx1c2hhbGYgOiBvbmVwbHVzaGFsZjsKKyAgICAgICAgICAgIG9wal90MV91cGRhdGVfZmxhZ3MoZmxhZ3NwLCBjaSwgdiwgdDEtPncgKyAyLCB2c2MpOwogICAgICAgICB9Ci19ICAgICAgCisgICAgICAgICpmbGFnc3AgfD0gVDFfUElfVEhJUyA8PCAoY2kgKiAzVSk7CisgICAgfQorfQorCisjZGVmaW5lIG9wal90MV9kZWNfc2lncGFzc19zdGVwX21xY19tYWNybyhmbGFncywgZmxhZ3NwLCBmbGFnc19zdHJpZGUsIGRhdGEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfc3RyaWRlLCBjaSwgbXFjLCBjdXJjdHgsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsIGEsIGMsIGN0LCBvbmVwbHVzaGFsZiwgdnNjKSBcCit7IFwKKyAgICBpZiAoKGZsYWdzICYgKChUMV9TSUdNQV9USElTIHwgVDFfUElfVEhJUykgPDwgKGNpICogM1UpKSkgPT0gMFUgJiYgXAorICAgICAgICAoZmxhZ3MgJiAoVDFfU0lHTUFfTkVJR0hCT1VSUyA8PCAoY2kgKiAzVSkpKSAhPSAwVSkgeyBcCisgICAgICAgIE9QSl9VSU5UMzIgY3R4dDEgPSBvcGpfdDFfZ2V0Y3R4bm9femMobXFjLCBmbGFncyA+PiAoY2kgKiAzVSkpOyBcCisgICAgICAgIG9wal90MV9zZXRjdXJjdHgoY3VyY3R4LCBjdHh0MSk7IFwKKyAgICAgICAgb3BqX21xY19kZWNvZGVfbWFjcm8odiwgbXFjLCBjdXJjdHgsIGEsIGMsIGN0KTsgXAorICAgICAgICBpZiAodikgeyBcCisgICAgICAgICAgICBPUEpfVUlOVDMyIGx1ID0gb3BqX3QxX2dldGN0eHRub19zY19vcl9zcGJfaW5kZXgoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3NwWy0xXSwgZmxhZ3NwWzFdLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpKTsgXAorICAgICAgICAgICAgT1BKX1VJTlQzMiBjdHh0MiA9IG9wal90MV9nZXRjdHhub19zYyhsdSk7IFwKKyAgICAgICAgICAgIE9QSl9VSU5UMzIgc3BiID0gb3BqX3QxX2dldHNwYihsdSk7IFwKKyAgICAgICAgICAgIG9wal90MV9zZXRjdXJjdHgoY3VyY3R4LCBjdHh0Mik7IFwKKyAgICAgICAgICAgIG9wal9tcWNfZGVjb2RlX21hY3JvKHYsIG1xYywgY3VyY3R4LCBhLCBjLCBjdCk7IFwKKyAgICAgICAgICAgIHYgPSB2IF4gc3BiOyBcCisgICAgICAgICAgICBkYXRhW2NpKmRhdGFfc3RyaWRlXSA9IHYgPyAtb25lcGx1c2hhbGYgOiBvbmVwbHVzaGFsZjsgXAorICAgICAgICAgICAgb3BqX3QxX3VwZGF0ZV9mbGFnc19tYWNybyhmbGFncywgZmxhZ3NwLCBjaSwgdiwgZmxhZ3Nfc3RyaWRlLCB2c2MpOyBcCisgICAgICAgIH0gXAorICAgICAgICBmbGFncyB8PSBUMV9QSV9USElTIDw8IChjaSAqIDNVKTsgXAorICAgIH0gXAorfQogCiBzdGF0aWMgSU5MSU5FIHZvaWQgb3BqX3QxX2RlY19zaWdwYXNzX3N0ZXBfbXFjKAotICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnc3AsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhcCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgb3JpZW50LAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvbmVwbHVzaGFsZikKKyAgICBvcGpfdDFfdCAqdDEsCisgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAorICAgIE9QSl9JTlQzMiAqZGF0YXAsCisgICAgT1BKX0lOVDMyIG9uZXBsdXNoYWxmLAorICAgIE9QSl9VSU5UMzIgY2ksCisgICAgT1BKX1VJTlQzMiBmbGFnc19zdHJpZGUsCisgICAgT1BKX1VJTlQzMiB2c2MpCiB7Ci0gICAgICAgIE9QSl9JTlQzMiB2LCBmbGFnOwotICAgICAgIAotICAgICAgICBvcGpfbXFjX3QgKm1xYyA9IHQxLT5tcWM7ICAgICAgIC8qIE1RQyBjb21wb25lbnQgKi8KLSAgICAgICAKLSAgICAgICAgZmxhZyA9ICpmbGFnc3A7Ci0gICAgICAgIGlmICgoZmxhZyAmIFQxX1NJR19PVEgpICYmICEoZmxhZyAmIChUMV9TSUcgfCBUMV9WSVNJVCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub196YygoT1BKX1VJTlQzMilmbGFnLCAoT1BKX1VJTlQzMilvcmllbnQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGpfbXFjX2RlY29kZShtcWMpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9tcWNfc2V0Y3VyY3R4KG1xYywgb3BqX3QxX2dldGN0eG5vX3NjKChPUEpfVUlOVDMyKWZsYWcpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IG9wal9tcWNfZGVjb2RlKG1xYykgXiBvcGpfdDFfZ2V0c3BiKChPUEpfVUlOVDMyKWZsYWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YXAgPSB2ID8gLW9uZXBsdXNoYWxmIDogb25lcGx1c2hhbGY7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV91cGRhdGVmbGFncyhmbGFnc3AsIChPUEpfVUlOVDMyKXYsIHQxLT5mbGFnc19zdHJpZGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICpmbGFnc3AgfD0gVDFfVklTSVQ7Ci0gICAgICAgIH0KLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVlNDIGFuZCAgQllQQVNTIGJ5IEFudG9uaW4gKi8KKyAgICBPUEpfVUlOVDMyIHY7CiAKLXN0YXRpYyBJTkxJTkUgdm9pZCBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9tcWNfdnNjKAotICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnc3AsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhcCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgb3JpZW50LAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvbmVwbHVzaGFsZiwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgdnNjKQotewotICAgICAgICBPUEpfSU5UMzIgdiwgZmxhZzsKLSAgICAgICAKLSAgICAgICAgb3BqX21xY190ICptcWMgPSB0MS0+bXFjOyAgICAgICAvKiBNUUMgY29tcG9uZW50ICovCi0gICAgICAgCi0gICAgICAgIGZsYWcgPSB2c2MgPyAoKCpmbGFnc3ApICYgKH4oVDFfU0lHX1MgfCBUMV9TSUdfU0UgfCBUMV9TSUdfU1cgfCBUMV9TR05fUykpKSA6ICgqZmxhZ3NwKTsKLSAgICAgICAgaWYgKChmbGFnICYgVDFfU0lHX09USCkgJiYgIShmbGFnICYgKFQxX1NJRyB8IFQxX1ZJU0lUKSkpIHsKLSAgICAgICAgICAgICAgICBvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub196YygoT1BKX1VJTlQzMilmbGFnLCAoT1BKX1VJTlQzMilvcmllbnQpKTsKLSAgICAgICAgICAgICAgICBpZiAob3BqX21xY19kZWNvZGUobXFjKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX21xY19zZXRjdXJjdHgobXFjLCBvcGpfdDFfZ2V0Y3R4bm9fc2MoKE9QSl9VSU5UMzIpZmxhZykpOwotICAgICAgICAgICAgICAgICAgICAgICAgdiA9IG9wal9tcWNfZGVjb2RlKG1xYykgXiBvcGpfdDFfZ2V0c3BiKChPUEpfVUlOVDMyKWZsYWcpOwotICAgICAgICAgICAgICAgICAgICAgICAgKmRhdGFwID0gdiA/IC1vbmVwbHVzaGFsZiA6IG9uZXBsdXNoYWxmOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX3VwZGF0ZWZsYWdzKGZsYWdzcCwgKE9QSl9VSU5UMzIpdiwgdDEtPmZsYWdzX3N0cmlkZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICpmbGFnc3AgfD0gVDFfVklTSVQ7Ci0gICAgICAgIH0KLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVlNDIGFuZCAgQllQQVNTIGJ5IEFudG9uaW4gKi8KLQotCisgICAgb3BqX21xY190ICptcWMgPSAmKHQxLT5tcWMpOyAgICAgICAvKiBNUUMgY29tcG9uZW50ICovCisgICAgb3BqX3QxX2RlY19zaWdwYXNzX3N0ZXBfbXFjX21hY3JvKCpmbGFnc3AsIGZsYWdzcCwgZmxhZ3Nfc3RyaWRlLCBkYXRhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgY2ksIG1xYywgbXFjLT5jdXJjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsIG1xYy0+YSwgbXFjLT5jLCBtcWMtPmN0LCBvbmVwbHVzaGFsZiwgdnNjKTsKK30KIAogc3RhdGljIHZvaWQgb3BqX3QxX2VuY19zaWdwYXNzKG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBicG5vLAotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBvcmllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKm5tc2VkZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjYmxrc3R5Ci0gICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIGJwbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpubXNlZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjYmxrc3R5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiB7Ci0JT1BKX1VJTlQzMiBpLCBqLCBrLCB2c2M7IAotICAgIE9QSl9JTlQzMiBvbmU7CisgICAgT1BKX1VJTlQzMiBpLCBrOworICAgIE9QSl9JTlQzMiBjb25zdCBvbmUgPSAxIDw8IChicG5vICsgVDFfTk1TRURFQ19GUkFDQklUUyk7CisgICAgb3BqX2ZsYWdfdCogZiA9ICZUMV9GTEFHUygwLCAwKTsKKyAgICBPUEpfVUlOVDMyIGNvbnN0IGV4dHJhID0gMjsKIAotCSpubXNlZGVjID0gMDsKLQlvbmUgPSAxIDw8IChicG5vICsgVDFfTk1TRURFQ19GUkFDQklUUyk7Ci0JZm9yIChrID0gMDsgayA8IHQxLT5oOyBrICs9IDQpIHsKLQkJZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKLQkJCWZvciAoaiA9IGs7IGogPCBrICsgNCAmJiBqIDwgdDEtPmg7ICsraikgewotCQkJCXZzYyA9ICgoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9WU0MpICYmIChqID09IGsgKyAzIHx8IGogPT0gdDEtPmggLSAxKSkgPyAxIDogMDsKLQkJCQlvcGpfdDFfZW5jX3NpZ3Bhc3Nfc3RlcCgKLQkJCQkJCXQxLAotCQkJCQkJJnQxLT5mbGFnc1soKGorMSkgKiB0MS0+ZmxhZ3Nfc3RyaWRlKSArIGkgKyAxXSwKLQkJCQkJCSZ0MS0+ZGF0YVsoaiAqIHQxLT5kYXRhX3N0cmlkZSkgKyBpXSwKLQkJCQkJCW9yaWVudCwKLQkJCQkJCWJwbm8sCi0JCQkJCQlvbmUsCi0JCQkJCQlubXNlZGVjLAotCQkJCQkJdHlwZSwKLQkJCQkJCXZzYyk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgKm5tc2VkZWMgPSAwOworI2lmZGVmIERFQlVHX0VOQ19TSUcKKyAgICBmcHJpbnRmKHN0ZGVyciwgImVuY19zaWdwYXNzOiBicG5vPSVkXG4iLCBicG5vKTsKKyNlbmRpZgorICAgIGZvciAoayA9IDA7IGsgPCAodDEtPmggJiB+M1UpOyBrICs9IDQpIHsKKyNpZmRlZiBERUJVR19FTkNfU0lHCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiIGs9JWRcbiIsIGspOworI2VuZGlmCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0MS0+dzsgKytpKSB7CisjaWZkZWYgREVCVUdfRU5DX1NJRworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgaT0lZFxuIiwgaSk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmICgqZiA9PSAwVSkgeworICAgICAgICAgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gZm9yIGFueSBvZiB0aGUgNCBkYXRhIHBvaW50cyAqLworICAgICAgICAgICAgICAgIGYrKzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wal90MV9lbmNfc2lncGFzc19zdGVwKAorICAgICAgICAgICAgICAgIHQxLAorICAgICAgICAgICAgICAgIGYsCisgICAgICAgICAgICAgICAgJnQxLT5kYXRhWygoayArIDApICogdDEtPmRhdGFfc3RyaWRlKSArIGldLAorICAgICAgICAgICAgICAgIGJwbm8sCisgICAgICAgICAgICAgICAgb25lLAorICAgICAgICAgICAgICAgIG5tc2VkZWMsCisgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAwLCBjYmxrc3R5ICYgSjJLX0NDUF9DQkxLU1RZX1ZTQyk7CisgICAgICAgICAgICBvcGpfdDFfZW5jX3NpZ3Bhc3Nfc3RlcCgKKyAgICAgICAgICAgICAgICB0MSwKKyAgICAgICAgICAgICAgICBmLAorICAgICAgICAgICAgICAgICZ0MS0+ZGF0YVsoKGsgKyAxKSAqIHQxLT5kYXRhX3N0cmlkZSkgKyBpXSwKKyAgICAgICAgICAgICAgICBicG5vLAorICAgICAgICAgICAgICAgIG9uZSwKKyAgICAgICAgICAgICAgICBubXNlZGVjLAorICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgMSwgMCk7CisgICAgICAgICAgICBvcGpfdDFfZW5jX3NpZ3Bhc3Nfc3RlcCgKKyAgICAgICAgICAgICAgICB0MSwKKyAgICAgICAgICAgICAgICBmLAorICAgICAgICAgICAgICAgICZ0MS0+ZGF0YVsoKGsgKyAyKSAqIHQxLT5kYXRhX3N0cmlkZSkgKyBpXSwKKyAgICAgICAgICAgICAgICBicG5vLAorICAgICAgICAgICAgICAgIG9uZSwKKyAgICAgICAgICAgICAgICBubXNlZGVjLAorICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgMiwgMCk7CisgICAgICAgICAgICBvcGpfdDFfZW5jX3NpZ3Bhc3Nfc3RlcCgKKyAgICAgICAgICAgICAgICB0MSwKKyAgICAgICAgICAgICAgICBmLAorICAgICAgICAgICAgICAgICZ0MS0+ZGF0YVsoKGsgKyAzKSAqIHQxLT5kYXRhX3N0cmlkZSkgKyBpXSwKKyAgICAgICAgICAgICAgICBicG5vLAorICAgICAgICAgICAgICAgIG9uZSwKKyAgICAgICAgICAgICAgICBubXNlZGVjLAorICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgMywgMCk7CisgICAgICAgICAgICArK2Y7CisgICAgICAgIH0KKyAgICAgICAgZiArPSBleHRyYTsKKyAgICB9CisKKyAgICBpZiAoayA8IHQxLT5oKSB7CisgICAgICAgIE9QSl9VSU5UMzIgajsKKyNpZmRlZiBERUJVR19FTkNfU0lHCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiIGs9JWRcbiIsIGspOworI2VuZGlmCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0MS0+dzsgKytpKSB7CisjaWZkZWYgREVCVUdfRU5DX1NJRworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgaT0lZFxuIiwgaSk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmICgqZiA9PSAwVSkgeworICAgICAgICAgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gZm9yIGFueSBvZiB0aGUgNCBkYXRhIHBvaW50cyAqLworICAgICAgICAgICAgICAgIGYrKzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaiA9IGs7IGogPCB0MS0+aDsgKytqKSB7CisgICAgICAgICAgICAgICAgb3BqX3QxX2VuY19zaWdwYXNzX3N0ZXAoCisgICAgICAgICAgICAgICAgICAgIHQxLAorICAgICAgICAgICAgICAgICAgICBmLAorICAgICAgICAgICAgICAgICAgICAmdDEtPmRhdGFbKGogKiB0MS0+ZGF0YV9zdHJpZGUpICsgaV0sCisgICAgICAgICAgICAgICAgICAgIGJwbm8sCisgICAgICAgICAgICAgICAgICAgIG9uZSwKKyAgICAgICAgICAgICAgICAgICAgbm1zZWRlYywKKyAgICAgICAgICAgICAgICAgICAgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgaiAtIGssCisgICAgICAgICAgICAgICAgICAgIChqID09IGsgJiYgKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfVlNDKSAhPSAwKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2Y7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIHN0YXRpYyB2b2lkIG9wal90MV9kZWNfc2lncGFzc19yYXcoCi0gICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBicG5vLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvcmllbnQsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIGNibGtzdHkpCisgICAgb3BqX3QxX3QgKnQxLAorICAgIE9QSl9JTlQzMiBicG5vLAorICAgIE9QSl9JTlQzMiBjYmxrc3R5KQogewotICAgICAgICBPUEpfSU5UMzIgb25lLCBoYWxmLCBvbmVwbHVzaGFsZiwgdnNjOwotICAgICAgICBPUEpfVUlOVDMyIGksIGosIGs7IAotICAgICAgICBvbmUgPSAxIDw8IGJwbm87Ci0gICAgICAgIGhhbGYgPSBvbmUgPj4gMTsKLSAgICAgICAgb25lcGx1c2hhbGYgPSBvbmUgfCBoYWxmOwotICAgICAgICBmb3IgKGsgPSAwOyBrIDwgdDEtPmg7IGsgKz0gNCkgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0MS0+dzsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBrOyBqIDwgayArIDQgJiYgaiA8IHQxLT5oOyArK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnNjID0gKChjYmxrc3R5ICYgSjJLX0NDUF9DQkxLU1RZX1ZTQykgJiYgKGogPT0gayArIDMgfHwgaiA9PSB0MS0+aCAtIDEpKSA/IDEgOiAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9yYXcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0MS0+ZmxhZ3NbKChqKzEpICogdDEtPmZsYWdzX3N0cmlkZSkgKyBpICsgMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdDEtPmRhdGFbKGogKiB0MS0+dykgKyBpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXBsdXNoYWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnNjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9CisgICAgT1BKX0lOVDMyIG9uZSwgaGFsZiwgb25lcGx1c2hhbGY7CisgICAgT1BKX1VJTlQzMiBpLCBqLCBrOworICAgIE9QSl9JTlQzMiAqZGF0YSA9IHQxLT5kYXRhOworICAgIG9wal9mbGFnX3QgKmZsYWdzcCA9ICZUMV9GTEFHUygwLCAwKTsKKyAgICBjb25zdCBPUEpfVUlOVDMyIGxfdyA9IHQxLT53OworICAgIG9uZSA9IDEgPDwgYnBubzsKKyAgICBoYWxmID0gb25lID4+IDE7CisgICAgb25lcGx1c2hhbGYgPSBvbmUgfCBoYWxmOworCisgICAgZm9yIChrID0gMDsgayA8ICh0MS0+aCAmIH4zVSk7IGsgKz0gNCwgZmxhZ3NwICs9IDIsIGRhdGEgKz0gMyAqIGxfdykgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF93OyArK2ksICsrZmxhZ3NwLCArK2RhdGEpIHsKKyAgICAgICAgICAgIG9wal9mbGFnX3QgZmxhZ3MgPSAqZmxhZ3NwOworICAgICAgICAgICAgaWYgKGZsYWdzICE9IDApIHsKKyAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9yYXcoCisgICAgICAgICAgICAgICAgICAgIHQxLAorICAgICAgICAgICAgICAgICAgICBmbGFnc3AsCisgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgIG9uZXBsdXNoYWxmLAorICAgICAgICAgICAgICAgICAgICBjYmxrc3R5ICYgSjJLX0NDUF9DQkxLU1RZX1ZTQywgLyogdnNjICovCisgICAgICAgICAgICAgICAgICAgIDBVKTsKKyAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9yYXcoCisgICAgICAgICAgICAgICAgICAgIHQxLAorICAgICAgICAgICAgICAgICAgICBmbGFnc3AsCisgICAgICAgICAgICAgICAgICAgIGRhdGEgKyBsX3csCisgICAgICAgICAgICAgICAgICAgIG9uZXBsdXNoYWxmLAorICAgICAgICAgICAgICAgICAgICBPUEpfRkFMU0UsIC8qIHZzYyAqLworICAgICAgICAgICAgICAgICAgICAxVSk7CisgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19zaWdwYXNzX3N0ZXBfcmF3KAorICAgICAgICAgICAgICAgICAgICB0MSwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3NwLAorICAgICAgICAgICAgICAgICAgICBkYXRhICsgMiAqIGxfdywKKyAgICAgICAgICAgICAgICAgICAgb25lcGx1c2hhbGYsCisgICAgICAgICAgICAgICAgICAgIE9QSl9GQUxTRSwgLyogdnNjICovCisgICAgICAgICAgICAgICAgICAgIDJVKTsKKyAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9yYXcoCisgICAgICAgICAgICAgICAgICAgIHQxLAorICAgICAgICAgICAgICAgICAgICBmbGFnc3AsCisgICAgICAgICAgICAgICAgICAgIGRhdGEgKyAzICogbF93LAorICAgICAgICAgICAgICAgICAgICBvbmVwbHVzaGFsZiwKKyAgICAgICAgICAgICAgICAgICAgT1BKX0ZBTFNFLCAvKiB2c2MgKi8KKyAgICAgICAgICAgICAgICAgICAgM1UpOworICAgICAgICAgICAgfQogICAgICAgICB9Ci19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZTQyBhbmQgIEJZUEFTUyBieSBBbnRvbmluICovCisgICAgfQorICAgIGlmIChrIDwgdDEtPmgpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxfdzsgKytpLCArK2ZsYWdzcCwgKytkYXRhKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdDEtPmggLSBrOyArK2opIHsKKyAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9yYXcoCisgICAgICAgICAgICAgICAgICAgIHQxLAorICAgICAgICAgICAgICAgICAgICBmbGFnc3AsCisgICAgICAgICAgICAgICAgICAgIGRhdGEgKyBqICogbF93LAorICAgICAgICAgICAgICAgICAgICBvbmVwbHVzaGFsZiwKKyAgICAgICAgICAgICAgICAgICAgY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9WU0MsIC8qIHZzYyAqLworICAgICAgICAgICAgICAgICAgICBqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworI2RlZmluZSBvcGpfdDFfZGVjX3NpZ3Bhc3NfbXFjX2ludGVybmFsKHQxLCBicG5vLCB2c2MsIHcsIGgsIGZsYWdzX3N0cmlkZSkgXAoreyBcCisgICAgICAgIE9QSl9JTlQzMiBvbmUsIGhhbGYsIG9uZXBsdXNoYWxmOyBcCisgICAgICAgIE9QSl9VSU5UMzIgaSwgaiwgazsgXAorICAgICAgICByZWdpc3RlciBPUEpfSU5UMzIgKmRhdGEgPSB0MS0+ZGF0YTsgXAorICAgICAgICByZWdpc3RlciBvcGpfZmxhZ190ICpmbGFnc3AgPSAmdDEtPmZsYWdzWyhmbGFnc19zdHJpZGUpICsgMV07IFwKKyAgICAgICAgY29uc3QgT1BKX1VJTlQzMiBsX3cgPSB3OyBcCisgICAgICAgIG9wal9tcWNfdCogbXFjID0gJih0MS0+bXFjKTsgXAorICAgICAgICBET1dOTE9BRF9NUUNfVkFSSUFCTEVTKG1xYywgY3VyY3R4LCBjLCBhLCBjdCk7IFwKKyAgICAgICAgcmVnaXN0ZXIgT1BKX1VJTlQzMiB2OyBcCisgICAgICAgIG9uZSA9IDEgPDwgYnBubzsgXAorICAgICAgICBoYWxmID0gb25lID4+IDE7IFwKKyAgICAgICAgb25lcGx1c2hhbGYgPSBvbmUgfCBoYWxmOyBcCisgICAgICAgIGZvciAoayA9IDA7IGsgPCAoaCAmIH4zdSk7IGsgKz0gNCwgZGF0YSArPSAzKmxfdywgZmxhZ3NwICs9IDIpIHsgXAorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsX3c7ICsraSwgKytkYXRhLCArK2ZsYWdzcCkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZmxhZ190IGZsYWdzID0gKmZsYWdzcDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZsYWdzICE9IDAgKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9tcWNfbWFjcm8oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIGZsYWdzcCwgZmxhZ3Nfc3RyaWRlLCBkYXRhLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdywgMCwgbXFjLCBjdXJjdHgsIHYsIGEsIGMsIGN0LCBvbmVwbHVzaGFsZiwgdnNjKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfc2lncGFzc19zdGVwX21xY19tYWNybyggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgZmxhZ3NwLCBmbGFnc19zdHJpZGUsIGRhdGEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF93LCAxLCBtcWMsIGN1cmN0eCwgdiwgYSwgYywgY3QsIG9uZXBsdXNoYWxmLCBPUEpfRkFMU0UpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19zaWdwYXNzX3N0ZXBfbXFjX21hY3JvKCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBmbGFnc3AsIGZsYWdzX3N0cmlkZSwgZGF0YSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3csIDIsIG1xYywgY3VyY3R4LCB2LCBhLCBjLCBjdCwgb25lcGx1c2hhbGYsIE9QSl9GQUxTRSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9tcWNfbWFjcm8oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIGZsYWdzcCwgZmxhZ3Nfc3RyaWRlLCBkYXRhLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdywgMywgbXFjLCBjdXJjdHgsIHYsIGEsIGMsIGN0LCBvbmVwbHVzaGFsZiwgT1BKX0ZBTFNFKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmbGFnc3AgPSBmbGFnczsgXAorICAgICAgICAgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgICAgICBVUExPQURfTVFDX1ZBUklBQkxFUyhtcWMsIGN1cmN0eCwgYywgYSwgY3QpOyBcCisgICAgICAgIGlmKCBrIDwgaCApIHsgXAorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxfdzsgKytpLCArK2RhdGEsICsrZmxhZ3NwKSB7IFwKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaCAtIGs7ICsraikgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9tcWModDEsIGZsYWdzcCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKyBqICogbF93LCBvbmVwbHVzaGFsZiwgaiwgZmxhZ3Nfc3RyaWRlLCB2c2MpOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCit9CisKK3N0YXRpYyB2b2lkIG9wal90MV9kZWNfc2lncGFzc19tcWNfNjR4NjRfbm92c2MoCisgICAgb3BqX3QxX3QgKnQxLAorICAgIE9QSl9JTlQzMiBicG5vKQoreworICAgIG9wal90MV9kZWNfc2lncGFzc19tcWNfaW50ZXJuYWwodDEsIGJwbm8sIE9QSl9GQUxTRSwgNjQsIDY0LCA2Nik7Cit9CisKK3N0YXRpYyB2b2lkIG9wal90MV9kZWNfc2lncGFzc19tcWNfNjR4NjRfdnNjKAorICAgIG9wal90MV90ICp0MSwKKyAgICBPUEpfSU5UMzIgYnBubykKK3sKKyAgICBvcGpfdDFfZGVjX3NpZ3Bhc3NfbXFjX2ludGVybmFsKHQxLCBicG5vLCBPUEpfVFJVRSwgNjQsIDY0LCA2Nik7Cit9CisKK3N0YXRpYyB2b2lkIG9wal90MV9kZWNfc2lncGFzc19tcWNfZ2VuZXJpY19ub3ZzYygKKyAgICBvcGpfdDFfdCAqdDEsCisgICAgT1BKX0lOVDMyIGJwbm8pCit7CisgICAgb3BqX3QxX2RlY19zaWdwYXNzX21xY19pbnRlcm5hbCh0MSwgYnBubywgT1BKX0ZBTFNFLCB0MS0+dywgdDEtPmgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MS0+dyArIDJVKTsKK30KKworc3RhdGljIHZvaWQgb3BqX3QxX2RlY19zaWdwYXNzX21xY19nZW5lcmljX3ZzYygKKyAgICBvcGpfdDFfdCAqdDEsCisgICAgT1BKX0lOVDMyIGJwbm8pCit7CisgICAgb3BqX3QxX2RlY19zaWdwYXNzX21xY19pbnRlcm5hbCh0MSwgYnBubywgT1BKX1RSVUUsIHQxLT53LCB0MS0+aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxLT53ICsgMlUpOworfQogCiBzdGF0aWMgdm9pZCBvcGpfdDFfZGVjX3NpZ3Bhc3NfbXFjKAotICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubywKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgb3JpZW50KQorICAgIG9wal90MV90ICp0MSwKKyAgICBPUEpfSU5UMzIgYnBubywKKyAgICBPUEpfSU5UMzIgY2Jsa3N0eSkKIHsKLSAgICAgICAgT1BKX0lOVDMyIG9uZSwgaGFsZiwgb25lcGx1c2hhbGY7Ci0gICAgICAgIE9QSl9VSU5UMzIgaSwgaiwgazsKLSAgICAgICAgT1BKX0lOVDMyICpkYXRhMSA9IHQxLT5kYXRhOwotICAgICAgICBvcGpfZmxhZ190ICpmbGFnczEgPSAmdDEtPmZsYWdzWzFdOwotICAgICAgICBvbmUgPSAxIDw8IGJwbm87Ci0gICAgICAgIGhhbGYgPSBvbmUgPj4gMTsKLSAgICAgICAgb25lcGx1c2hhbGYgPSBvbmUgfCBoYWxmOwotICAgICAgICBmb3IgKGsgPSAwOyBrIDwgKHQxLT5oICYgfjN1KTsgayArPSA0KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YTIgPSBkYXRhMSArIGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnczIgPSBmbGFnczEgKyBpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MyICs9IHQxLT5mbGFnc19zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9tcWModDEsIGZsYWdzMiwgZGF0YTIsIG9yaWVudCwgb25lcGx1c2hhbGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTIgKz0gdDEtPnc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGFnczIgKz0gdDEtPmZsYWdzX3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfc2lncGFzc19zdGVwX21xYyh0MSwgZmxhZ3MyLCBkYXRhMiwgb3JpZW50LCBvbmVwbHVzaGFsZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhMiArPSB0MS0+dzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzMiArPSB0MS0+ZmxhZ3Nfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19zaWdwYXNzX3N0ZXBfbXFjKHQxLCBmbGFnczIsIGRhdGEyLCBvcmllbnQsIG9uZXBsdXNoYWxmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEyICs9IHQxLT53OwotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MyICs9IHQxLT5mbGFnc19zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9tcWModDEsIGZsYWdzMiwgZGF0YTIsIG9yaWVudCwgb25lcGx1c2hhbGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTIgKz0gdDEtPnc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRhdGExICs9IHQxLT53IDw8IDI7Ci0gICAgICAgICAgICAgICAgZmxhZ3MxICs9IHQxLT5mbGFnc19zdHJpZGUgPDwgMjsKKyAgICBpZiAodDEtPncgPT0gNjQgJiYgdDEtPmggPT0gNjQpIHsKKyAgICAgICAgaWYgKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfVlNDKSB7CisgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3NfbXFjXzY0eDY0X3ZzYyh0MSwgYnBubyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3NfbXFjXzY0eDY0X25vdnNjKHQxLCBicG5vKTsKICAgICAgICAgfQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdDEtPnc7ICsraSkgewotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YTIgPSBkYXRhMSArIGk7Ci0gICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3MyID0gZmxhZ3MxICsgaTsKLSAgICAgICAgICAgICAgICBmb3IgKGogPSBrOyBqIDwgdDEtPmg7ICsraikgewotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MyICs9IHQxLT5mbGFnc19zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcF9tcWModDEsIGZsYWdzMiwgZGF0YTIsIG9yaWVudCwgb25lcGx1c2hhbGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTIgKz0gdDEtPnc7Ci0gICAgICAgICAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChjYmxrc3R5ICYgSjJLX0NDUF9DQkxLU1RZX1ZTQykgeworICAgICAgICAgICAgb3BqX3QxX2RlY19zaWdwYXNzX21xY19nZW5lcmljX3ZzYyh0MSwgYnBubyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3NfbXFjX2dlbmVyaWNfbm92c2ModDEsIGJwbm8pOwogICAgICAgICB9Ci19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZTQyBhbmQgIEJZUEFTUyBieSBBbnRvbmluICovCi0KLXN0YXRpYyB2b2lkIG9wal90MV9kZWNfc2lncGFzc19tcWNfdnNjKAotICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubywKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgb3JpZW50KQotewotICAgICAgICBPUEpfSU5UMzIgb25lLCBoYWxmLCBvbmVwbHVzaGFsZiwgdnNjOwotICAgICAgICBPUEpfVUlOVDMyIGksIGosIGs7Ci0gICAgICAgIG9uZSA9IDEgPDwgYnBubzsKLSAgICAgICAgaGFsZiA9IG9uZSA+PiAxOwotICAgICAgICBvbmVwbHVzaGFsZiA9IG9uZSB8IGhhbGY7Ci0gICAgICAgIGZvciAoayA9IDA7IGsgPCB0MS0+aDsgayArPSA0KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IGs7IGogPCBrICsgNCAmJiBqIDwgdDEtPmg7ICsraikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c2MgPSAoaiA9PSBrICsgMyB8fCBqID09IHQxLT5oIC0gMSkgPyAxIDogMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19zaWdwYXNzX3N0ZXBfbXFjX3ZzYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnQxLT5mbGFnc1soKGorMSkgKiB0MS0+ZmxhZ3Nfc3RyaWRlKSArIGkgKyAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0MS0+ZGF0YVsoaiAqIHQxLT53KSArIGldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lcGx1c2hhbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWU0MgYW5kICBCWVBBU1MgYnkgQW50b25pbiAqLwotCi0KLQotc3RhdGljIHZvaWQgb3BqX3QxX2VuY19yZWZwYXNzX3N0ZXAoICAgb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnc3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBicG5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgb25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKm5tc2VkZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdnNjKQotewotCU9QSl9JTlQzMiB2OwotCU9QSl9VSU5UMzIgZmxhZzsKLQkKLQlvcGpfbXFjX3QgKm1xYyA9IHQxLT5tcWM7CS8qIE1RQyBjb21wb25lbnQgKi8KLQkKLQlmbGFnID0gdnNjID8gKE9QSl9VSU5UMzIpKCgqZmxhZ3NwKSAmICh+KFQxX1NJR19TIHwgVDFfU0lHX1NFIHwgVDFfU0lHX1NXIHwgVDFfU0dOX1MpKSkgOiAoT1BKX1VJTlQzMikoKmZsYWdzcCk7Ci0JaWYgKChmbGFnICYgKFQxX1NJRyB8IFQxX1ZJU0lUKSkgPT0gVDFfU0lHKSB7Ci0JCSpubXNlZGVjICs9IG9wal90MV9nZXRubXNlZGVjX3JlZigoT1BKX1VJTlQzMilvcGpfaW50X2FicygqZGF0YXApLCAoT1BKX1VJTlQzMikoYnBubykpOwotCQl2ID0gb3BqX2ludF9hYnMoKmRhdGFwKSAmIG9uZSA/IDEgOiAwOwotCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub19tYWcoZmxhZykpOwkvKiBFU1NBSSAqLwotCQlpZiAodHlwZSA9PSBUMV9UWVBFX1JBVykgewkvKiBCWVBBU1MvTEFaWSBNT0RFICovCi0JCQlvcGpfbXFjX2J5cGFzc19lbmMobXFjLCAoT1BKX1VJTlQzMil2KTsKLQkJfSBlbHNlIHsKLQkJCW9wal9tcWNfZW5jb2RlKG1xYywgKE9QSl9VSU5UMzIpdik7Ci0JCX0KLQkJKmZsYWdzcCB8PSBUMV9SRUZJTkU7Ci0JfQorICAgIH0KIH0KIAorLyoqCitFbmNvZGUgcmVmaW5lbWVudCBwYXNzIHN0ZXAKKyovCitzdGF0aWMgSU5MSU5FIHZvaWQgb3BqX3QxX2VuY19yZWZwYXNzX3N0ZXAob3BqX3QxX3QgKnQxLAorICAgICAgICBvcGpfZmxhZ190ICpmbGFnc3AsCisgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCisgICAgICAgIE9QSl9JTlQzMiBicG5vLAorICAgICAgICBPUEpfSU5UMzIgb25lLAorICAgICAgICBPUEpfSU5UMzIgKm5tc2VkZWMsCisgICAgICAgIE9QSl9CWVRFIHR5cGUsCisgICAgICAgIE9QSl9VSU5UMzIgY2kpCit7CisgICAgT1BKX1VJTlQzMiB2OworCisgICAgb3BqX21xY190ICptcWMgPSAmKHQxLT5tcWMpOyAgIC8qIE1RQyBjb21wb25lbnQgKi8KKworICAgIE9QSl9VSU5UMzIgY29uc3Qgc2hpZnRfZmxhZ3MgPQorICAgICAgICAoKmZsYWdzcCA+PiAoY2kgKiAzVSkpOworCisgICAgaWYgKChzaGlmdF9mbGFncyAmIChUMV9TSUdNQV9USElTIHwgVDFfUElfVEhJUykpID09IFQxX1NJR01BX1RISVMpIHsKKyAgICAgICAgT1BKX1VJTlQzMiBjdHh0ID0gb3BqX3QxX2dldGN0eG5vX21hZyhzaGlmdF9mbGFncyk7CisgICAgICAgICpubXNlZGVjICs9IG9wal90MV9nZXRubXNlZGVjX3JlZigoT1BKX1VJTlQzMilvcGpfaW50X2FicygqZGF0YXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9VSU5UMzIpYnBubyk7CisgICAgICAgIHYgPSAob3BqX2ludF9hYnMoKmRhdGFwKSAmIG9uZSkgPyAxIDogMDsKKyNpZmRlZiBERUJVR19FTkNfUkVGCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiICBjdHh0PSVkXG4iLCBjdHh0KTsKKyNlbmRpZgorICAgICAgICBvcGpfbXFjX3NldGN1cmN0eChtcWMsIGN0eHQpOworICAgICAgICBpZiAodHlwZSA9PSBUMV9UWVBFX1JBVykgeyAgLyogQllQQVNTL0xBWlkgTU9ERSAqLworICAgICAgICAgICAgb3BqX21xY19ieXBhc3NfZW5jKG1xYywgdik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcGpfbXFjX2VuY29kZShtcWMsIHYpOworICAgICAgICB9CisgICAgICAgICpmbGFnc3AgfD0gVDFfTVVfVEhJUyA8PCAoY2kgKiAzVSk7CisgICAgfQorfQorCisKIHN0YXRpYyBJTkxJTkUgdm9pZCBvcGpfdDFfZGVjX3JlZnBhc3Nfc3RlcF9yYXcoCi0gICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKmRhdGFwLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwb3NoYWxmLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBuZWdoYWxmLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB2c2MpCisgICAgb3BqX3QxX3QgKnQxLAorICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKKyAgICBPUEpfSU5UMzIgKmRhdGFwLAorICAgIE9QSl9JTlQzMiBwb3NoYWxmLAorICAgIE9QSl9VSU5UMzIgY2kpCiB7Ci0gICAgICAgIE9QSl9JTlQzMiB2LCB0LCBmbGFnOwotICAgICAgIAotICAgICAgICBvcGpfcmF3X3QgKnJhdyA9IHQxLT5yYXc7ICAgICAgIC8qIFJBVyBjb21wb25lbnQgKi8KLSAgICAgICAKLSAgICAgICAgZmxhZyA9IHZzYyA/ICgoKmZsYWdzcCkgJiAofihUMV9TSUdfUyB8IFQxX1NJR19TRSB8IFQxX1NJR19TVyB8IFQxX1NHTl9TKSkpIDogKCpmbGFnc3ApOwotICAgICAgICBpZiAoKGZsYWcgJiAoVDFfU0lHIHwgVDFfVklTSVQpKSA9PSBUMV9TSUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHYgPSAoT1BKX0lOVDMyKW9wal9yYXdfZGVjb2RlKHJhdyk7Ci0gICAgICAgICAgICAgICAgdCA9IHYgPyBwb3NoYWxmIDogbmVnaGFsZjsKLSAgICAgICAgICAgICAgICAqZGF0YXAgKz0gKmRhdGFwIDwgMCA/IC10IDogdDsKLSAgICAgICAgICAgICAgICAqZmxhZ3NwIHw9IFQxX1JFRklORTsKLSAgICAgICAgfQotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWU0MgYW5kICBCWVBBU1MgYnkgQW50b25pbiAgKi8KKyAgICBPUEpfVUlOVDMyIHY7CisKKyAgICBvcGpfbXFjX3QgKm1xYyA9ICYodDEtPm1xYyk7ICAgICAgIC8qIFJBVyBjb21wb25lbnQgKi8KKworICAgIGlmICgoKmZsYWdzcCAmICgoVDFfU0lHTUFfVEhJUyB8IFQxX1BJX1RISVMpIDw8IChjaSAqIDNVKSkpID09CisgICAgICAgICAgICAoVDFfU0lHTUFfVEhJUyA8PCAoY2kgKiAzVSkpKSB7CisgICAgICAgIHYgPSBvcGpfbXFjX3Jhd19kZWNvZGUobXFjKTsKKyAgICAgICAgKmRhdGFwICs9ICh2IF4gKCpkYXRhcCA8IDApKSA/IHBvc2hhbGYgOiAtcG9zaGFsZjsKKyAgICAgICAgKmZsYWdzcCB8PSBUMV9NVV9USElTIDw8IChjaSAqIDNVKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgb3BqX3QxX2RlY19yZWZwYXNzX3N0ZXBfbXFjX21hY3JvKGZsYWdzLCBkYXRhLCBkYXRhX3N0cmlkZSwgY2ksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1xYywgY3VyY3R4LCB2LCBhLCBjLCBjdCwgcG9zaGFsZikgXAoreyBcCisgICAgaWYgKChmbGFncyAmICgoVDFfU0lHTUFfVEhJUyB8IFQxX1BJX1RISVMpIDw8IChjaSAqIDNVKSkpID09IFwKKyAgICAgICAgICAgIChUMV9TSUdNQV9USElTIDw8IChjaSAqIDNVKSkpIHsgXAorICAgICAgICBPUEpfVUlOVDMyIGN0eHQgPSBvcGpfdDFfZ2V0Y3R4bm9fbWFnKGZsYWdzID4+IChjaSAqIDNVKSk7IFwKKyAgICAgICAgb3BqX3QxX3NldGN1cmN0eChjdXJjdHgsIGN0eHQpOyBcCisgICAgICAgIG9wal9tcWNfZGVjb2RlX21hY3JvKHYsIG1xYywgY3VyY3R4LCBhLCBjLCBjdCk7IFwKKyAgICAgICAgZGF0YVtjaSpkYXRhX3N0cmlkZV0gKz0gKHYgXiAoZGF0YVtjaSpkYXRhX3N0cmlkZV0gPCAwKSkgPyBwb3NoYWxmIDogLXBvc2hhbGY7IFwKKyAgICAgICAgZmxhZ3MgfD0gVDFfTVVfVEhJUyA8PCAoY2kgKiAzVSk7IFwKKyAgICB9IFwKK30KIAogc3RhdGljIElOTElORSB2b2lkIG9wal90MV9kZWNfcmVmcGFzc19zdGVwX21xYygKLSAgICAgICAgICAgICAgICBvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgb3BqX2ZsYWdfdCAqZmxhZ3NwLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YXAsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBvc2hhbGYsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyIG5lZ2hhbGYpCisgICAgb3BqX3QxX3QgKnQxLAorICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKKyAgICBPUEpfSU5UMzIgKmRhdGFwLAorICAgIE9QSl9JTlQzMiBwb3NoYWxmLAorICAgIE9QSl9VSU5UMzIgY2kpCiB7Ci0gICAgICAgIE9QSl9JTlQzMiB2LCB0LCBmbGFnOwotICAgICAgIAotICAgICAgICBvcGpfbXFjX3QgKm1xYyA9IHQxLT5tcWM7ICAgICAgIC8qIE1RQyBjb21wb25lbnQgKi8KLSAgICAgICAKLSAgICAgICAgZmxhZyA9ICpmbGFnc3A7Ci0gICAgICAgIGlmICgoZmxhZyAmIChUMV9TSUcgfCBUMV9WSVNJVCkpID09IFQxX1NJRykgewotICAgICAgICAgICAgICAgIG9wal9tcWNfc2V0Y3VyY3R4KG1xYywgb3BqX3QxX2dldGN0eG5vX21hZygoT1BKX1VJTlQzMilmbGFnKSk7ICAgICAgLyogRVNTQUkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBvcGpfbXFjX2RlY29kZShtcWMpOwotICAgICAgICAgICAgICAgIHQgPSB2ID8gcG9zaGFsZiA6IG5lZ2hhbGY7Ci0gICAgICAgICAgICAgICAgKmRhdGFwICs9ICpkYXRhcCA8IDAgPyAtdCA6IHQ7Ci0gICAgICAgICAgICAgICAgKmZsYWdzcCB8PSBUMV9SRUZJTkU7Ci0gICAgICAgICAgICAgICAgfQotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWU0MgYW5kICBCWVBBU1MgYnkgQW50b25pbiAgKi8KKyAgICBPUEpfVUlOVDMyIHY7CiAKLXN0YXRpYyBJTkxJTkUgdm9pZCBvcGpfdDFfZGVjX3JlZnBhc3Nfc3RlcF9tcWNfdnNjKAotICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnc3AsCi0gICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhcCwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgcG9zaGFsZiwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgbmVnaGFsZiwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgdnNjKQotewotICAgICAgICBPUEpfSU5UMzIgdiwgdCwgZmxhZzsKLSAgICAgICAKLSAgICAgICAgb3BqX21xY190ICptcWMgPSB0MS0+bXFjOyAgICAgICAvKiBNUUMgY29tcG9uZW50ICovCi0gICAgICAgCi0gICAgICAgIGZsYWcgPSB2c2MgPyAoKCpmbGFnc3ApICYgKH4oVDFfU0lHX1MgfCBUMV9TSUdfU0UgfCBUMV9TSUdfU1cgfCBUMV9TR05fUykpKSA6ICgqZmxhZ3NwKTsKLSAgICAgICAgaWYgKChmbGFnICYgKFQxX1NJRyB8IFQxX1ZJU0lUKSkgPT0gVDFfU0lHKSB7Ci0gICAgICAgICAgICAgICAgb3BqX21xY19zZXRjdXJjdHgobXFjLCBvcGpfdDFfZ2V0Y3R4bm9fbWFnKChPUEpfVUlOVDMyKWZsYWcpKTsgICAgICAvKiBFU1NBSSAqLwotICAgICAgICAgICAgICAgIHYgPSBvcGpfbXFjX2RlY29kZShtcWMpOwotICAgICAgICAgICAgICAgIHQgPSB2ID8gcG9zaGFsZiA6IG5lZ2hhbGY7Ci0gICAgICAgICAgICAgICAgKmRhdGFwICs9ICpkYXRhcCA8IDAgPyAtdCA6IHQ7Ci0gICAgICAgICAgICAgICAgKmZsYWdzcCB8PSBUMV9SRUZJTkU7Ci0gICAgICAgIH0KLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVlNDIGFuZCAgQllQQVNTIGJ5IEFudG9uaW4gICovCi0KKyAgICBvcGpfbXFjX3QgKm1xYyA9ICYodDEtPm1xYyk7ICAgICAgIC8qIE1RQyBjb21wb25lbnQgKi8KKyAgICBvcGpfdDFfZGVjX3JlZnBhc3Nfc3RlcF9tcWNfbWFjcm8oKmZsYWdzcCwgZGF0YXAsIDAsIGNpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcWMsIG1xYy0+Y3VyY3R4LCB2LCBtcWMtPmEsIG1xYy0+YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXFjLT5jdCwgcG9zaGFsZik7Cit9CiAKIHN0YXRpYyB2b2lkIG9wal90MV9lbmNfcmVmcGFzcygKLQkJb3BqX3QxX3QgKnQxLAotCQlPUEpfSU5UMzIgYnBubywKLQkJT1BKX0lOVDMyICpubXNlZGVjLAotCQlPUEpfQllURSB0eXBlLAotCQlPUEpfVUlOVDMyIGNibGtzdHkpCisgICAgb3BqX3QxX3QgKnQxLAorICAgIE9QSl9JTlQzMiBicG5vLAorICAgIE9QSl9JTlQzMiAqbm1zZWRlYywKKyAgICBPUEpfQllURSB0eXBlKQogewotCU9QSl9VSU5UMzIgaSwgaiwgaywgdnNjOwotICAgIE9QSl9JTlQzMiBvbmU7CisgICAgT1BKX1VJTlQzMiBpLCBrOworICAgIGNvbnN0IE9QSl9JTlQzMiBvbmUgPSAxIDw8IChicG5vICsgVDFfTk1TRURFQ19GUkFDQklUUyk7CisgICAgb3BqX2ZsYWdfdCogZiA9ICZUMV9GTEFHUygwLCAwKTsKKyAgICBjb25zdCBPUEpfVUlOVDMyIGV4dHJhID0gMlU7CiAKLQkqbm1zZWRlYyA9IDA7Ci0Jb25lID0gMSA8PCAoYnBubyArIFQxX05NU0VERUNfRlJBQ0JJVFMpOwotCWZvciAoayA9IDA7IGsgPCB0MS0+aDsgayArPSA0KSB7Ci0JCWZvciAoaSA9IDA7IGkgPCB0MS0+dzsgKytpKSB7Ci0JCQlmb3IgKGogPSBrOyBqIDwgayArIDQgJiYgaiA8IHQxLT5oOyArK2opIHsKLQkJCQl2c2MgPSAoKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfVlNDKSAmJiAoaiA9PSBrICsgMyB8fCBqID09IHQxLT5oIC0gMSkpID8gMSA6IDA7Ci0JCQkJb3BqX3QxX2VuY19yZWZwYXNzX3N0ZXAoCi0JCQkJCQl0MSwKLQkJCQkJCSZ0MS0+ZmxhZ3NbKChqKzEpICogdDEtPmZsYWdzX3N0cmlkZSkgKyBpICsgMV0sCi0JCQkJCQkmdDEtPmRhdGFbKGogKiB0MS0+ZGF0YV9zdHJpZGUpICsgaV0sCi0JCQkJCQlicG5vLAotCQkJCQkJb25lLAotCQkJCQkJbm1zZWRlYywKLQkJCQkJCXR5cGUsCi0JCQkJCQl2c2MpOwotCQkJfQotCQl9Ci0JfQorICAgICpubXNlZGVjID0gMDsKKyNpZmRlZiBERUJVR19FTkNfUkVGCisgICAgZnByaW50ZihzdGRlcnIsICJlbmNfcmVmcGFzczogYnBubz0lZFxuIiwgYnBubyk7CisjZW5kaWYKKyAgICBmb3IgKGsgPSAwOyBrIDwgKHQxLT5oICYgfjNVKTsgayArPSA0KSB7CisjaWZkZWYgREVCVUdfRU5DX1JFRgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiBrPSVkXG4iLCBrKTsKKyNlbmRpZgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdDEtPnc7ICsraSkgeworI2lmZGVmIERFQlVHX0VOQ19SRUYKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiIGk9JWRcbiIsIGkpOworI2VuZGlmCisgICAgICAgICAgICBpZiAoKCpmICYgKFQxX1NJR01BXzQgfCBUMV9TSUdNQV83IHwgVDFfU0lHTUFfMTAgfCBUMV9TSUdNQV8xMykpID09IDApIHsKKyAgICAgICAgICAgICAgICAvKiBub25lIHNpZ25pZmljYW50ICovCisgICAgICAgICAgICAgICAgZisrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCgqZiAmIChUMV9QSV8wIHwgVDFfUElfMSB8IFQxX1BJXzIgfCBUMV9QSV8zKSkgPT0KKyAgICAgICAgICAgICAgICAgICAgKFQxX1BJXzAgfCBUMV9QSV8xIHwgVDFfUElfMiB8IFQxX1BJXzMpKSB7CisgICAgICAgICAgICAgICAgLyogYWxsIHByb2Nlc3NlZCBieSBzaWdwYXNzICovCisgICAgICAgICAgICAgICAgZisrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvcGpfdDFfZW5jX3JlZnBhc3Nfc3RlcCgKKyAgICAgICAgICAgICAgICB0MSwKKyAgICAgICAgICAgICAgICBmLAorICAgICAgICAgICAgICAgICZ0MS0+ZGF0YVsoKGsgKyAwKSAqIHQxLT5kYXRhX3N0cmlkZSkgKyBpXSwKKyAgICAgICAgICAgICAgICBicG5vLAorICAgICAgICAgICAgICAgIG9uZSwKKyAgICAgICAgICAgICAgICBubXNlZGVjLAorICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICBvcGpfdDFfZW5jX3JlZnBhc3Nfc3RlcCgKKyAgICAgICAgICAgICAgICB0MSwKKyAgICAgICAgICAgICAgICBmLAorICAgICAgICAgICAgICAgICZ0MS0+ZGF0YVsoKGsgKyAxKSAqIHQxLT5kYXRhX3N0cmlkZSkgKyBpXSwKKyAgICAgICAgICAgICAgICBicG5vLAorICAgICAgICAgICAgICAgIG9uZSwKKyAgICAgICAgICAgICAgICBubXNlZGVjLAorICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgMSk7CisgICAgICAgICAgICBvcGpfdDFfZW5jX3JlZnBhc3Nfc3RlcCgKKyAgICAgICAgICAgICAgICB0MSwKKyAgICAgICAgICAgICAgICBmLAorICAgICAgICAgICAgICAgICZ0MS0+ZGF0YVsoKGsgKyAyKSAqIHQxLT5kYXRhX3N0cmlkZSkgKyBpXSwKKyAgICAgICAgICAgICAgICBicG5vLAorICAgICAgICAgICAgICAgIG9uZSwKKyAgICAgICAgICAgICAgICBubXNlZGVjLAorICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgMik7CisgICAgICAgICAgICBvcGpfdDFfZW5jX3JlZnBhc3Nfc3RlcCgKKyAgICAgICAgICAgICAgICB0MSwKKyAgICAgICAgICAgICAgICBmLAorICAgICAgICAgICAgICAgICZ0MS0+ZGF0YVsoKGsgKyAzKSAqIHQxLT5kYXRhX3N0cmlkZSkgKyBpXSwKKyAgICAgICAgICAgICAgICBicG5vLAorICAgICAgICAgICAgICAgIG9uZSwKKyAgICAgICAgICAgICAgICBubXNlZGVjLAorICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgMyk7CisgICAgICAgICAgICArK2Y7CisgICAgICAgIH0KKyAgICAgICAgZiArPSBleHRyYTsKKyAgICB9CisKKyAgICBpZiAoayA8IHQxLT5oKSB7CisgICAgICAgIE9QSl9VSU5UMzIgajsKKyNpZmRlZiBERUJVR19FTkNfUkVGCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiIGs9JWRcbiIsIGspOworI2VuZGlmCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0MS0+dzsgKytpKSB7CisjaWZkZWYgREVCVUdfRU5DX1JFRgorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgaT0lZFxuIiwgaSk7CisjZW5kaWYKKyAgICAgICAgICAgIGlmICgoKmYgJiAoVDFfU0lHTUFfNCB8IFQxX1NJR01BXzcgfCBUMV9TSUdNQV8xMCB8IFQxX1NJR01BXzEzKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIG5vbmUgc2lnbmlmaWNhbnQgKi8KKyAgICAgICAgICAgICAgICBmKys7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGogPSBrOyBqIDwgdDEtPmg7ICsraikgeworICAgICAgICAgICAgICAgIG9wal90MV9lbmNfcmVmcGFzc19zdGVwKAorICAgICAgICAgICAgICAgICAgICB0MSwKKyAgICAgICAgICAgICAgICAgICAgZiwKKyAgICAgICAgICAgICAgICAgICAgJnQxLT5kYXRhWyhqICogdDEtPmRhdGFfc3RyaWRlKSArIGldLAorICAgICAgICAgICAgICAgICAgICBicG5vLAorICAgICAgICAgICAgICAgICAgICBvbmUsCisgICAgICAgICAgICAgICAgICAgIG5tc2VkZWMsCisgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgIGogLSBrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrZjsKKyAgICAgICAgfQorICAgIH0KIH0KIAorCiBzdGF0aWMgdm9pZCBvcGpfdDFfZGVjX3JlZnBhc3NfcmF3KAotICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubywKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgY2Jsa3N0eSkKKyAgICBvcGpfdDFfdCAqdDEsCisgICAgT1BKX0lOVDMyIGJwbm8pCiB7Ci0gICAgICAgIE9QSl9JTlQzMiBvbmUsIHBvc2hhbGYsIG5lZ2hhbGY7Ci0gICAgICAgIE9QSl9VSU5UMzIgaSwgaiwgazsKLSAgICAgICAgT1BKX0lOVDMyIHZzYzsKLSAgICAgICAgb25lID0gMSA8PCBicG5vOwotICAgICAgICBwb3NoYWxmID0gb25lID4+IDE7Ci0gICAgICAgIG5lZ2hhbGYgPSBicG5vID4gMCA/IC1wb3NoYWxmIDogLTE7Ci0gICAgICAgIGZvciAoayA9IDA7IGsgPCB0MS0+aDsgayArPSA0KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IGs7IGogPCBrICsgNCAmJiBqIDwgdDEtPmg7ICsraikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c2MgPSAoKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfVlNDKSAmJiAoaiA9PSBrICsgMyB8fCBqID09IHQxLT5oIC0gMSkpID8gMSA6IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfcmVmcGFzc19zdGVwX3JhdygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnQxLT5mbGFnc1soKGorMSkgKiB0MS0+ZmxhZ3Nfc3RyaWRlKSArIGkgKyAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0MS0+ZGF0YVsoaiAqIHQxLT53KSArIGldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaGFsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2hhbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KKyAgICBPUEpfSU5UMzIgb25lLCBwb3NoYWxmOworICAgIE9QSl9VSU5UMzIgaSwgaiwgazsKKyAgICBPUEpfSU5UMzIgKmRhdGEgPSB0MS0+ZGF0YTsKKyAgICBvcGpfZmxhZ190ICpmbGFnc3AgPSAmVDFfRkxBR1MoMCwgMCk7CisgICAgY29uc3QgT1BKX1VJTlQzMiBsX3cgPSB0MS0+dzsKKyAgICBvbmUgPSAxIDw8IGJwbm87CisgICAgcG9zaGFsZiA9IG9uZSA+PiAxOworICAgIGZvciAoayA9IDA7IGsgPCAodDEtPmggJiB+M1UpOyBrICs9IDQsIGZsYWdzcCArPSAyLCBkYXRhICs9IDMgKiBsX3cpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxfdzsgKytpLCArK2ZsYWdzcCwgKytkYXRhKSB7CisgICAgICAgICAgICBvcGpfZmxhZ190IGZsYWdzID0gKmZsYWdzcDsKKyAgICAgICAgICAgIGlmIChmbGFncyAhPSAwKSB7CisgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19yZWZwYXNzX3N0ZXBfcmF3KAorICAgICAgICAgICAgICAgICAgICB0MSwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3NwLAorICAgICAgICAgICAgICAgICAgICBkYXRhLAorICAgICAgICAgICAgICAgICAgICBwb3NoYWxmLAorICAgICAgICAgICAgICAgICAgICAwVSk7CisgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19yZWZwYXNzX3N0ZXBfcmF3KAorICAgICAgICAgICAgICAgICAgICB0MSwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3NwLAorICAgICAgICAgICAgICAgICAgICBkYXRhICsgbF93LAorICAgICAgICAgICAgICAgICAgICBwb3NoYWxmLAorICAgICAgICAgICAgICAgICAgICAxVSk7CisgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19yZWZwYXNzX3N0ZXBfcmF3KAorICAgICAgICAgICAgICAgICAgICB0MSwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3NwLAorICAgICAgICAgICAgICAgICAgICBkYXRhICsgMiAqIGxfdywKKyAgICAgICAgICAgICAgICAgICAgcG9zaGFsZiwKKyAgICAgICAgICAgICAgICAgICAgMlUpOworICAgICAgICAgICAgICAgIG9wal90MV9kZWNfcmVmcGFzc19zdGVwX3JhdygKKyAgICAgICAgICAgICAgICAgICAgdDEsCisgICAgICAgICAgICAgICAgICAgIGZsYWdzcCwKKyAgICAgICAgICAgICAgICAgICAgZGF0YSArIDMgKiBsX3csCisgICAgICAgICAgICAgICAgICAgIHBvc2hhbGYsCisgICAgICAgICAgICAgICAgICAgIDNVKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWU0MgYW5kICBCWVBBU1MgYnkgQW50b25pbiAqLwotCi1zdGF0aWMgdm9pZCBvcGpfdDFfZGVjX3JlZnBhc3NfbXFjKAotICAgICAgICAgICAgICAgIG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYnBubykKLXsKLSAgICAgICAgT1BKX0lOVDMyIG9uZSwgcG9zaGFsZiwgbmVnaGFsZjsKLSAgICAgICAgT1BKX1VJTlQzMiBpLCBqLCBrOwotICAgICAgICBPUEpfSU5UMzIgKmRhdGExID0gdDEtPmRhdGE7Ci0gICAgICAgIG9wal9mbGFnX3QgKmZsYWdzMSA9ICZ0MS0+ZmxhZ3NbMV07Ci0gICAgICAgIG9uZSA9IDEgPDwgYnBubzsKLSAgICAgICAgcG9zaGFsZiA9IG9uZSA+PiAxOwotICAgICAgICBuZWdoYWxmID0gYnBubyA+IDAgPyAtcG9zaGFsZiA6IC0xOwotICAgICAgICBmb3IgKGsgPSAwOyBrIDwgKHQxLT5oICYgfjN1KTsgayArPSA0KSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqZGF0YTIgPSBkYXRhMSArIGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnczIgPSBmbGFnczEgKyBpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MyICs9IHQxLT5mbGFnc19zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3JlZnBhc3Nfc3RlcF9tcWModDEsIGZsYWdzMiwgZGF0YTIsIHBvc2hhbGYsIG5lZ2hhbGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTIgKz0gdDEtPnc7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGFnczIgKz0gdDEtPmZsYWdzX3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfcmVmcGFzc19zdGVwX21xYyh0MSwgZmxhZ3MyLCBkYXRhMiwgcG9zaGFsZiwgbmVnaGFsZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhMiArPSB0MS0+dzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzMiArPSB0MS0+ZmxhZ3Nfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19yZWZwYXNzX3N0ZXBfbXFjKHQxLCBmbGFnczIsIGRhdGEyLCBwb3NoYWxmLCBuZWdoYWxmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEyICs9IHQxLT53OwotICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MyICs9IHQxLT5mbGFnc19zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3JlZnBhc3Nfc3RlcF9tcWModDEsIGZsYWdzMiwgZGF0YTIsIHBvc2hhbGYsIG5lZ2hhbGYpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTIgKz0gdDEtPnc7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRhdGExICs9IHQxLT53IDw8IDI7Ci0gICAgICAgICAgICAgICAgZmxhZ3MxICs9IHQxLT5mbGFnc19zdHJpZGUgPDwgMjsKKyAgICB9CisgICAgaWYgKGsgPCB0MS0+aCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF93OyArK2ksICsrZmxhZ3NwLCArK2RhdGEpIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB0MS0+aCAtIGs7ICsraikgeworICAgICAgICAgICAgICAgIG9wal90MV9kZWNfcmVmcGFzc19zdGVwX3JhdygKKyAgICAgICAgICAgICAgICAgICAgdDEsCisgICAgICAgICAgICAgICAgICAgIGZsYWdzcCwKKyAgICAgICAgICAgICAgICAgICAgZGF0YSArIGogKiBsX3csCisgICAgICAgICAgICAgICAgICAgIHBvc2hhbGYsCisgICAgICAgICAgICAgICAgICAgIGopOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0MS0+dzsgKytpKSB7Ci0gICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhMiA9IGRhdGExICsgaTsKLSAgICAgICAgICAgICAgICBvcGpfZmxhZ190ICpmbGFnczIgPSBmbGFnczEgKyBpOwotICAgICAgICAgICAgICAgIGZvciAoaiA9IGs7IGogPCB0MS0+aDsgKytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbGFnczIgKz0gdDEtPmZsYWdzX3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfcmVmcGFzc19zdGVwX21xYyh0MSwgZmxhZ3MyLCBkYXRhMiwgcG9zaGFsZiwgbmVnaGFsZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhMiArPSB0MS0+dzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVlNDIGFuZCAgQllQQVNTIGJ5IEFudG9uaW4gKi8KLQotc3RhdGljIHZvaWQgb3BqX3QxX2RlY19yZWZwYXNzX21xY192c2MoCi0gICAgICAgICAgICAgICAgb3BqX3QxX3QgKnQxLAotICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBicG5vKQotewotICAgICAgICBPUEpfSU5UMzIgb25lLCBwb3NoYWxmLCBuZWdoYWxmOwotICAgICAgICBPUEpfVUlOVDMyIGksIGosIGs7Ci0gICAgICAgIE9QSl9JTlQzMiB2c2M7Ci0gICAgICAgIG9uZSA9IDEgPDwgYnBubzsKLSAgICAgICAgcG9zaGFsZiA9IG9uZSA+PiAxOwotICAgICAgICBuZWdoYWxmID0gYnBubyA+IDAgPyAtcG9zaGFsZiA6IC0xOwotICAgICAgICBmb3IgKGsgPSAwOyBrIDwgdDEtPmg7IGsgKz0gNCkgewotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0MS0+dzsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBrOyBqIDwgayArIDQgJiYgaiA8IHQxLT5oOyArK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnNjID0gKChqID09IGsgKyAzIHx8IGogPT0gdDEtPmggLSAxKSkgPyAxIDogMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19yZWZwYXNzX3N0ZXBfbXFjX3ZzYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnQxLT5mbGFnc1soKGorMSkgKiB0MS0+ZmxhZ3Nfc3RyaWRlKSArIGkgKyAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0MS0+ZGF0YVsoaiAqIHQxLT53KSArIGldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaGFsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2hhbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2c2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWU0MgYW5kICBCWVBBU1MgYnkgQW50b25pbiAqLwotCi0KLXN0YXRpYyB2b2lkIG9wal90MV9lbmNfY2xucGFzc19zdGVwKAotCQlvcGpfdDFfdCAqdDEsCi0JCW9wal9mbGFnX3QgKmZsYWdzcCwKLQkJT1BKX0lOVDMyICpkYXRhcCwKLQkJT1BKX1VJTlQzMiBvcmllbnQsCi0JCU9QSl9JTlQzMiBicG5vLAotCQlPUEpfSU5UMzIgb25lLAotCQlPUEpfSU5UMzIgKm5tc2VkZWMsCi0JCU9QSl9VSU5UMzIgcGFydGlhbCwKLQkJT1BKX1VJTlQzMiB2c2MpCi17Ci0JT1BKX0lOVDMyIHY7Ci0JT1BKX1VJTlQzMiBmbGFnOwotCQotCW9wal9tcWNfdCAqbXFjID0gdDEtPm1xYzsJLyogTVFDIGNvbXBvbmVudCAqLwotCQotCWZsYWcgPSB2c2MgPyAoT1BKX1VJTlQzMikoKCpmbGFnc3ApICYgKH4oVDFfU0lHX1MgfCBUMV9TSUdfU0UgfCBUMV9TSUdfU1cgfCBUMV9TR05fUykpKSA6IChPUEpfVUlOVDMyKSgqZmxhZ3NwKTsKLQlpZiAocGFydGlhbCkgewotCQlnb3RvIExBQkVMX1BBUlRJQUw7Ci0JfQotCWlmICghKCpmbGFnc3AgJiAoVDFfU0lHIHwgVDFfVklTSVQpKSkgewotCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub196YyhmbGFnLCBvcmllbnQpKTsKLQkJdiA9IG9wal9pbnRfYWJzKCpkYXRhcCkgJiBvbmUgPyAxIDogMDsKLQkJb3BqX21xY19lbmNvZGUobXFjLCAoT1BKX1VJTlQzMil2KTsKLQkJaWYgKHYpIHsKLUxBQkVMX1BBUlRJQUw6Ci0JCQkqbm1zZWRlYyArPSBvcGpfdDFfZ2V0bm1zZWRlY19zaWcoKE9QSl9VSU5UMzIpb3BqX2ludF9hYnMoKmRhdGFwKSwgKE9QSl9VSU5UMzIpKGJwbm8pKTsKLQkJCW9wal9tcWNfc2V0Y3VyY3R4KG1xYywgb3BqX3QxX2dldGN0eG5vX3NjKGZsYWcpKTsKLQkJCXYgPSAqZGF0YXAgPCAwID8gMSA6IDA7Ci0JCQlvcGpfbXFjX2VuY29kZShtcWMsIChPUEpfVUlOVDMyKSh2IF4gb3BqX3QxX2dldHNwYigoT1BKX1VJTlQzMilmbGFnKSkpOwotCQkJb3BqX3QxX3VwZGF0ZWZsYWdzKGZsYWdzcCwgKE9QSl9VSU5UMzIpdiwgdDEtPmZsYWdzX3N0cmlkZSk7Ci0JCX0KLQl9Ci0JKmZsYWdzcCAmPSB+VDFfVklTSVQ7CisgICAgfQogfQogCi1zdGF0aWMgdm9pZCBvcGpfdDFfZGVjX2NsbnBhc3Nfc3RlcF9wYXJ0aWFsKAotCQlvcGpfdDFfdCAqdDEsCi0JCW9wal9mbGFnX3QgKmZsYWdzcCwKLQkJT1BKX0lOVDMyICpkYXRhcCwKLQkJT1BKX0lOVDMyIG9yaWVudCwKLQkJT1BKX0lOVDMyIG9uZXBsdXNoYWxmKQorI2RlZmluZSBvcGpfdDFfZGVjX3JlZnBhc3NfbXFjX2ludGVybmFsKHQxLCBicG5vLCB3LCBoLCBmbGFnc19zdHJpZGUpIFwKK3sgXAorICAgICAgICBPUEpfSU5UMzIgb25lLCBwb3NoYWxmOyBcCisgICAgICAgIE9QSl9VSU5UMzIgaSwgaiwgazsgXAorICAgICAgICByZWdpc3RlciBPUEpfSU5UMzIgKmRhdGEgPSB0MS0+ZGF0YTsgXAorICAgICAgICByZWdpc3RlciBvcGpfZmxhZ190ICpmbGFnc3AgPSAmdDEtPmZsYWdzW2ZsYWdzX3N0cmlkZSArIDFdOyBcCisgICAgICAgIGNvbnN0IE9QSl9VSU5UMzIgbF93ID0gdzsgXAorICAgICAgICBvcGpfbXFjX3QqIG1xYyA9ICYodDEtPm1xYyk7IFwKKyAgICAgICAgRE9XTkxPQURfTVFDX1ZBUklBQkxFUyhtcWMsIGN1cmN0eCwgYywgYSwgY3QpOyBcCisgICAgICAgIHJlZ2lzdGVyIE9QSl9VSU5UMzIgdjsgXAorICAgICAgICBvbmUgPSAxIDw8IGJwbm87IFwKKyAgICAgICAgcG9zaGFsZiA9IG9uZSA+PiAxOyBcCisgICAgICAgIGZvciAoayA9IDA7IGsgPCAoaCAmIH4zdSk7IGsgKz0gNCwgZGF0YSArPSAzKmxfdywgZmxhZ3NwICs9IDIpIHsgXAorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsX3c7ICsraSwgKytkYXRhLCArK2ZsYWdzcCkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZmxhZ190IGZsYWdzID0gKmZsYWdzcDsgXAorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZsYWdzICE9IDAgKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3JlZnBhc3Nfc3RlcF9tcWNfbWFjcm8oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIGRhdGEsIGxfdywgMCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcWMsIGN1cmN0eCwgdiwgYSwgYywgY3QsIHBvc2hhbGYpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19yZWZwYXNzX3N0ZXBfbXFjX21hY3JvKCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBkYXRhLCBsX3csIDEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXFjLCBjdXJjdHgsIHYsIGEsIGMsIGN0LCBwb3NoYWxmKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfcmVmcGFzc19zdGVwX21xY19tYWNybyggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgZGF0YSwgbF93LCAyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1xYywgY3VyY3R4LCB2LCBhLCBjLCBjdCwgcG9zaGFsZik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3JlZnBhc3Nfc3RlcF9tcWNfbWFjcm8oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIGRhdGEsIGxfdywgMywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcWMsIGN1cmN0eCwgdiwgYSwgYywgY3QsIHBvc2hhbGYpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZsYWdzcCA9IGZsYWdzOyBcCisgICAgICAgICAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgfSBcCisgICAgICAgIFVQTE9BRF9NUUNfVkFSSUFCTEVTKG1xYywgY3VyY3R4LCBjLCBhLCBjdCk7IFwKKyAgICAgICAgaWYoIGsgPCBoICkgeyBcCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF93OyArK2ksICsrZGF0YSwgKytmbGFnc3ApIHsgXAorICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBoIC0gazsgKytqKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfcmVmcGFzc19zdGVwX21xYyh0MSwgZmxhZ3NwLCBkYXRhICsgaiAqIGxfdywgcG9zaGFsZiwgaik7IFwKKyAgICAgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKK30KKworc3RhdGljIHZvaWQgb3BqX3QxX2RlY19yZWZwYXNzX21xY182NHg2NCgKKyAgICBvcGpfdDFfdCAqdDEsCisgICAgT1BKX0lOVDMyIGJwbm8pCiB7Ci0JT1BKX0lOVDMyIHYsIGZsYWc7Ci0Jb3BqX21xY190ICptcWMgPSB0MS0+bXFjOwkvKiBNUUMgY29tcG9uZW50ICovCi0JCi0JT1BKX0FSR19OT1RfVVNFRChvcmllbnQpOwotCQotCWZsYWcgPSAqZmxhZ3NwOwotCW9wal9tcWNfc2V0Y3VyY3R4KG1xYywgb3BqX3QxX2dldGN0eG5vX3NjKChPUEpfVUlOVDMyKWZsYWcpKTsKLQl2ID0gb3BqX21xY19kZWNvZGUobXFjKSBeIG9wal90MV9nZXRzcGIoKE9QSl9VSU5UMzIpZmxhZyk7Ci0JKmRhdGFwID0gdiA/IC1vbmVwbHVzaGFsZiA6IG9uZXBsdXNoYWxmOwotCW9wal90MV91cGRhdGVmbGFncyhmbGFnc3AsIChPUEpfVUlOVDMyKXYsIHQxLT5mbGFnc19zdHJpZGUpOwotCSpmbGFnc3AgJj0gflQxX1ZJU0lUOwotfQkJCQkvKiBWU0MgYW5kICBCWVBBU1MgYnkgQW50b25pbiAqLworICAgIG9wal90MV9kZWNfcmVmcGFzc19tcWNfaW50ZXJuYWwodDEsIGJwbm8sIDY0LCA2NCwgNjYpOworfQorCitzdGF0aWMgdm9pZCBvcGpfdDFfZGVjX3JlZnBhc3NfbXFjX2dlbmVyaWMoCisgICAgb3BqX3QxX3QgKnQxLAorICAgIE9QSl9JTlQzMiBicG5vKQoreworICAgIG9wal90MV9kZWNfcmVmcGFzc19tcWNfaW50ZXJuYWwodDEsIGJwbm8sIHQxLT53LCB0MS0+aCwgdDEtPncgKyAyVSk7Cit9CisKK3N0YXRpYyB2b2lkIG9wal90MV9kZWNfcmVmcGFzc19tcWMoCisgICAgb3BqX3QxX3QgKnQxLAorICAgIE9QSl9JTlQzMiBicG5vKQoreworICAgIGlmICh0MS0+dyA9PSA2NCAmJiB0MS0+aCA9PSA2NCkgeworICAgICAgICBvcGpfdDFfZGVjX3JlZnBhc3NfbXFjXzY0eDY0KHQxLCBicG5vKTsKKyAgICB9IGVsc2UgeworICAgICAgICBvcGpfdDFfZGVjX3JlZnBhc3NfbXFjX2dlbmVyaWModDEsIGJwbm8pOworICAgIH0KK30KKworLyoqCitFbmNvZGUgY2xlYW4tdXAgcGFzcyBzdGVwCisqLworc3RhdGljIHZvaWQgb3BqX3QxX2VuY19jbG5wYXNzX3N0ZXAoCisgICAgb3BqX3QxX3QgKnQxLAorICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKKyAgICBPUEpfSU5UMzIgKmRhdGFwLAorICAgIE9QSl9JTlQzMiBicG5vLAorICAgIE9QSl9JTlQzMiBvbmUsCisgICAgT1BKX0lOVDMyICpubXNlZGVjLAorICAgIE9QSl9VSU5UMzIgYWdnLAorICAgIE9QSl9VSU5UMzIgcnVubGVuLAorICAgIE9QSl9VSU5UMzIgbGltLAorICAgIE9QSl9VSU5UMzIgY2Jsa3N0eSkKK3sKKyAgICBPUEpfVUlOVDMyIHY7CisgICAgT1BKX1VJTlQzMiBjaTsKKyAgICBvcGpfbXFjX3QgKm1xYyA9ICYodDEtPm1xYyk7ICAgLyogTVFDIGNvbXBvbmVudCAqLworCisgICAgY29uc3QgT1BKX1VJTlQzMiBjaGVjayA9IChUMV9TSUdNQV80IHwgVDFfU0lHTUFfNyB8IFQxX1NJR01BXzEwIHwgVDFfU0lHTUFfMTMgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDFfUElfMCB8IFQxX1BJXzEgfCBUMV9QSV8yIHwgVDFfUElfMyk7CisKKyAgICBpZiAoKCpmbGFnc3AgJiBjaGVjaykgPT0gY2hlY2spIHsKKyAgICAgICAgaWYgKHJ1bmxlbiA9PSAwKSB7CisgICAgICAgICAgICAqZmxhZ3NwICY9IH4oVDFfUElfMCB8IFQxX1BJXzEgfCBUMV9QSV8yIHwgVDFfUElfMyk7CisgICAgICAgIH0gZWxzZSBpZiAocnVubGVuID09IDEpIHsKKyAgICAgICAgICAgICpmbGFnc3AgJj0gfihUMV9QSV8xIHwgVDFfUElfMiB8IFQxX1BJXzMpOworICAgICAgICB9IGVsc2UgaWYgKHJ1bmxlbiA9PSAyKSB7CisgICAgICAgICAgICAqZmxhZ3NwICY9IH4oVDFfUElfMiB8IFQxX1BJXzMpOworICAgICAgICB9IGVsc2UgaWYgKHJ1bmxlbiA9PSAzKSB7CisgICAgICAgICAgICAqZmxhZ3NwICY9IH4oVDFfUElfMyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoY2kgPSBydW5sZW47IGNpIDwgbGltOyArK2NpKSB7CisgICAgICAgIE9QSl9VSU5UMzIgdnNjOworICAgICAgICBvcGpfZmxhZ190IGZsYWdzOworICAgICAgICBPUEpfVUlOVDMyIGN0eHQxOworCisgICAgICAgIGZsYWdzID0gKmZsYWdzcDsKKworICAgICAgICBpZiAoKGFnZyAhPSAwKSAmJiAoY2kgPT0gcnVubGVuKSkgeworICAgICAgICAgICAgZ290byBMQUJFTF9QQVJUSUFMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEoZmxhZ3MgJiAoKFQxX1NJR01BX1RISVMgfCBUMV9QSV9USElTKSA8PCAoY2kgKiAzVSkpKSkgeworICAgICAgICAgICAgY3R4dDEgPSBvcGpfdDFfZ2V0Y3R4bm9femMobXFjLCBmbGFncyA+PiAoY2kgKiAzVSkpOworI2lmZGVmIERFQlVHX0VOQ19DTE4KKyAgICAgICAgICAgIHByaW50ZigiICAgY3R4dDE9JWRcbiIsIGN0eHQxKTsKKyNlbmRpZgorICAgICAgICAgICAgb3BqX21xY19zZXRjdXJjdHgobXFjLCBjdHh0MSk7CisgICAgICAgICAgICB2ID0gKG9wal9pbnRfYWJzKCpkYXRhcCkgJiBvbmUpID8gMSA6IDA7CisgICAgICAgICAgICBvcGpfbXFjX2VuY29kZShtcWMsIHYpOworICAgICAgICAgICAgaWYgKHYpIHsKKyAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGN0eHQyLCBzcGI7CisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsdTsKK0xBQkVMX1BBUlRJQUw6CisgICAgICAgICAgICAgICAgbHUgPSBvcGpfdDFfZ2V0Y3R4dG5vX3NjX29yX3NwYl9pbmRleCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAqZmxhZ3NwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzcFstMV0sIGZsYWdzcFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaSk7CisgICAgICAgICAgICAgICAgKm5tc2VkZWMgKz0gb3BqX3QxX2dldG5tc2VkZWNfc2lnKChPUEpfVUlOVDMyKW9wal9pbnRfYWJzKCpkYXRhcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfVUlOVDMyKWJwbm8pOworICAgICAgICAgICAgICAgIGN0eHQyID0gb3BqX3QxX2dldGN0eG5vX3NjKGx1KTsKKyNpZmRlZiBERUJVR19FTkNfQ0xOCisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICBjdHh0Mj0lZFxuIiwgY3R4dDIpOworI2VuZGlmCisgICAgICAgICAgICAgICAgb3BqX21xY19zZXRjdXJjdHgobXFjLCBjdHh0Mik7CisKKyAgICAgICAgICAgICAgICB2ID0gKmRhdGFwIDwgMCA/IDFVIDogMFU7CisgICAgICAgICAgICAgICAgc3BiID0gb3BqX3QxX2dldHNwYihsdSk7CisjaWZkZWYgREVCVUdfRU5DX0NMTgorICAgICAgICAgICAgICAgIHByaW50ZigiICAgc3BiPSVkXG4iLCBzcGIpOworI2VuZGlmCisgICAgICAgICAgICAgICAgb3BqX21xY19lbmNvZGUobXFjLCB2IF4gc3BiKTsKKyAgICAgICAgICAgICAgICB2c2MgPSAoKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfVlNDKSAmJiAoY2kgPT0gMCkpID8gMSA6IDA7CisgICAgICAgICAgICAgICAgb3BqX3QxX3VwZGF0ZV9mbGFncyhmbGFnc3AsIGNpLCB2LCB0MS0+dyArIDJVLCB2c2MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICpmbGFnc3AgJj0gfihUMV9QSV9USElTIDw8ICgzVSAqIGNpKSk7CisgICAgICAgIGRhdGFwICs9IHQxLT5kYXRhX3N0cmlkZTsKKyAgICB9Cit9CisKKyNkZWZpbmUgb3BqX3QxX2RlY19jbG5wYXNzX3N0ZXBfbWFjcm8oY2hlY2tfZmxhZ3MsIHBhcnRpYWwsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIGZsYWdzcCwgZmxhZ3Nfc3RyaWRlLCBkYXRhLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfc3RyaWRlLCBjaSwgbXFjLCBjdXJjdHgsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgYSwgYywgY3QsIG9uZXBsdXNoYWxmLCB2c2MpIFwKK3sgXAorICAgIGlmICggIWNoZWNrX2ZsYWdzIHx8ICEoZmxhZ3MgJiAoKFQxX1NJR01BX1RISVMgfCBUMV9QSV9USElTKSA8PCAoY2kgKiAzVSkpKSkge1wKKyAgICAgICAgZG8geyBcCisgICAgICAgICAgICBpZiggIXBhcnRpYWwgKSB7IFwKKyAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGN0eHQxID0gb3BqX3QxX2dldGN0eG5vX3pjKG1xYywgZmxhZ3MgPj4gKGNpICogM1UpKTsgXAorICAgICAgICAgICAgICAgIG9wal90MV9zZXRjdXJjdHgoY3VyY3R4LCBjdHh0MSk7IFwKKyAgICAgICAgICAgICAgICBvcGpfbXFjX2RlY29kZV9tYWNybyh2LCBtcWMsIGN1cmN0eCwgYSwgYywgY3QpOyBcCisgICAgICAgICAgICAgICAgaWYoICF2ICkgXAorICAgICAgICAgICAgICAgICAgICBicmVhazsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICB7IFwKKyAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGx1ID0gb3BqX3QxX2dldGN0eHRub19zY19vcl9zcGJfaW5kZXgoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBmbGFnc3BbLTFdLCBmbGFnc3BbMV0sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpKTsgXAorICAgICAgICAgICAgICAgIG9wal90MV9zZXRjdXJjdHgoY3VyY3R4LCBvcGpfdDFfZ2V0Y3R4bm9fc2MobHUpKTsgXAorICAgICAgICAgICAgICAgIG9wal9tcWNfZGVjb2RlX21hY3JvKHYsIG1xYywgY3VyY3R4LCBhLCBjLCBjdCk7IFwKKyAgICAgICAgICAgICAgICB2ID0gdiBeIG9wal90MV9nZXRzcGIobHUpOyBcCisgICAgICAgICAgICAgICAgZGF0YVtjaSpkYXRhX3N0cmlkZV0gPSB2ID8gLW9uZXBsdXNoYWxmIDogb25lcGx1c2hhbGY7IFwKKyAgICAgICAgICAgICAgICBvcGpfdDFfdXBkYXRlX2ZsYWdzX21hY3JvKGZsYWdzLCBmbGFnc3AsIGNpLCB2LCBmbGFnc19zdHJpZGUsIHZzYyk7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IHdoaWxlKDApOyBcCisgICAgfSBcCit9CiAKIHN0YXRpYyB2b2lkIG9wal90MV9kZWNfY2xucGFzc19zdGVwKAotCQlvcGpfdDFfdCAqdDEsCi0JCW9wal9mbGFnX3QgKmZsYWdzcCwKLQkJT1BKX0lOVDMyICpkYXRhcCwKLQkJT1BKX0lOVDMyIG9yaWVudCwKLQkJT1BKX0lOVDMyIG9uZXBsdXNoYWxmKQorICAgIG9wal90MV90ICp0MSwKKyAgICBvcGpfZmxhZ190ICpmbGFnc3AsCisgICAgT1BKX0lOVDMyICpkYXRhcCwKKyAgICBPUEpfSU5UMzIgb25lcGx1c2hhbGYsCisgICAgT1BKX1VJTlQzMiBjaSwKKyAgICBPUEpfVUlOVDMyIHZzYykKIHsKLQlPUEpfSU5UMzIgdiwgZmxhZzsKLQkKLQlvcGpfbXFjX3QgKm1xYyA9IHQxLT5tcWM7CS8qIE1RQyBjb21wb25lbnQgKi8KLQkKLQlmbGFnID0gKmZsYWdzcDsKLQlpZiAoIShmbGFnICYgKFQxX1NJRyB8IFQxX1ZJU0lUKSkpIHsKLQkJb3BqX21xY19zZXRjdXJjdHgobXFjLCBvcGpfdDFfZ2V0Y3R4bm9femMoKE9QSl9VSU5UMzIpZmxhZywgKE9QSl9VSU5UMzIpb3JpZW50KSk7Ci0JCWlmIChvcGpfbXFjX2RlY29kZShtcWMpKSB7Ci0JCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIG9wal90MV9nZXRjdHhub19zYygoT1BKX1VJTlQzMilmbGFnKSk7Ci0JCQl2ID0gb3BqX21xY19kZWNvZGUobXFjKSBeIG9wal90MV9nZXRzcGIoKE9QSl9VSU5UMzIpZmxhZyk7Ci0JCQkqZGF0YXAgPSB2ID8gLW9uZXBsdXNoYWxmIDogb25lcGx1c2hhbGY7Ci0JCQlvcGpfdDFfdXBkYXRlZmxhZ3MoZmxhZ3NwLCAoT1BKX1VJTlQzMil2LCB0MS0+ZmxhZ3Nfc3RyaWRlKTsKLQkJfQotCX0KLQkqZmxhZ3NwICY9IH5UMV9WSVNJVDsKLX0JCQkJLyogVlNDIGFuZCAgQllQQVNTIGJ5IEFudG9uaW4gKi8KKyAgICBPUEpfVUlOVDMyIHY7CiAKLXN0YXRpYyB2b2lkIG9wal90MV9kZWNfY2xucGFzc19zdGVwX3ZzYygKLQkJb3BqX3QxX3QgKnQxLAotCQlvcGpfZmxhZ190ICpmbGFnc3AsCi0JCU9QSl9JTlQzMiAqZGF0YXAsCi0JCU9QSl9JTlQzMiBvcmllbnQsCi0JCU9QSl9JTlQzMiBvbmVwbHVzaGFsZiwKLQkJT1BKX0lOVDMyIHBhcnRpYWwsCi0JCU9QSl9JTlQzMiB2c2MpCi17Ci0JT1BKX0lOVDMyIHYsIGZsYWc7Ci0JCi0Jb3BqX21xY190ICptcWMgPSB0MS0+bXFjOwkvKiBNUUMgY29tcG9uZW50ICovCi0JCi0JZmxhZyA9IHZzYyA/ICgoKmZsYWdzcCkgJiAofihUMV9TSUdfUyB8IFQxX1NJR19TRSB8IFQxX1NJR19TVyB8IFQxX1NHTl9TKSkpIDogKCpmbGFnc3ApOwotCWlmIChwYXJ0aWFsKSB7Ci0JCWdvdG8gTEFCRUxfUEFSVElBTDsKLQl9Ci0JaWYgKCEoZmxhZyAmIChUMV9TSUcgfCBUMV9WSVNJVCkpKSB7Ci0JCW9wal9tcWNfc2V0Y3VyY3R4KG1xYywgb3BqX3QxX2dldGN0eG5vX3pjKChPUEpfVUlOVDMyKWZsYWcsIChPUEpfVUlOVDMyKW9yaWVudCkpOwotCQlpZiAob3BqX21xY19kZWNvZGUobXFjKSkgewotTEFCRUxfUEFSVElBTDoKLQkJCW9wal9tcWNfc2V0Y3VyY3R4KG1xYywgb3BqX3QxX2dldGN0eG5vX3NjKChPUEpfVUlOVDMyKWZsYWcpKTsKLQkJCXYgPSBvcGpfbXFjX2RlY29kZShtcWMpIF4gb3BqX3QxX2dldHNwYigoT1BKX1VJTlQzMilmbGFnKTsKLQkJCSpkYXRhcCA9IHYgPyAtb25lcGx1c2hhbGYgOiBvbmVwbHVzaGFsZjsKLQkJCW9wal90MV91cGRhdGVmbGFncyhmbGFnc3AsIChPUEpfVUlOVDMyKXYsIHQxLT5mbGFnc19zdHJpZGUpOwotCQl9Ci0JfQotCSpmbGFnc3AgJj0gflQxX1ZJU0lUOworICAgIG9wal9tcWNfdCAqbXFjID0gJih0MS0+bXFjKTsgICAvKiBNUUMgY29tcG9uZW50ICovCisgICAgb3BqX3QxX2RlY19jbG5wYXNzX3N0ZXBfbWFjcm8oT1BKX1RSVUUsIE9QSl9GQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZmxhZ3NwLCBmbGFnc3AsIHQxLT53ICsgMlUsIGRhdGFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGNpLCBtcWMsIG1xYy0+Y3VyY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsIG1xYy0+YSwgbXFjLT5jLCBtcWMtPmN0LCBvbmVwbHVzaGFsZiwgdnNjKTsKIH0KIAogc3RhdGljIHZvaWQgb3BqX3QxX2VuY19jbG5wYXNzKAotCQlvcGpfdDFfdCAqdDEsCi0JCU9QSl9JTlQzMiBicG5vLAotCQlPUEpfVUlOVDMyIG9yaWVudCwKLQkJT1BKX0lOVDMyICpubXNlZGVjLAotCQlPUEpfVUlOVDMyIGNibGtzdHkpCisgICAgb3BqX3QxX3QgKnQxLAorICAgIE9QSl9JTlQzMiBicG5vLAorICAgIE9QSl9JTlQzMiAqbm1zZWRlYywKKyAgICBPUEpfVUlOVDMyIGNibGtzdHkpCiB7Ci0JT1BKX1VJTlQzMiBpLCBqLCBrOwotCU9QSl9JTlQzMiBvbmU7Ci0JT1BKX1VJTlQzMiBhZ2csIHJ1bmxlbiwgdnNjOwotCQotCW9wal9tcWNfdCAqbXFjID0gdDEtPm1xYzsJLyogTVFDIGNvbXBvbmVudCAqLwotCQotCSpubXNlZGVjID0gMDsKLQlvbmUgPSAxIDw8IChicG5vICsgVDFfTk1TRURFQ19GUkFDQklUUyk7Ci0JZm9yIChrID0gMDsgayA8IHQxLT5oOyBrICs9IDQpIHsKLQkJZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKLQkJCWlmIChrICsgMyA8IHQxLT5oKSB7Ci0JCQkJaWYgKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfVlNDKSB7Ci0JCQkJCWFnZyA9ICEoTUFDUk9fdDFfZmxhZ3MoMSArIGssMSArIGkpICYgKFQxX1NJRyB8IFQxX1ZJU0lUIHwgVDFfU0lHX09USCkKLQkJCQkJCXx8IE1BQ1JPX3QxX2ZsYWdzKDEgKyBrICsgMSwxICsgaSkgJiAoVDFfU0lHIHwgVDFfVklTSVQgfCBUMV9TSUdfT1RIKQotCQkJCQkJfHwgTUFDUk9fdDFfZmxhZ3MoMSArIGsgKyAyLDEgKyBpKSAmIChUMV9TSUcgfCBUMV9WSVNJVCB8IFQxX1NJR19PVEgpCi0JCQkJCQl8fCAoTUFDUk9fdDFfZmxhZ3MoMSArIGsgKyAzLDEgKyBpKSAKLQkJCQkJCSYgKH4oVDFfU0lHX1MgfCBUMV9TSUdfU0UgfCBUMV9TSUdfU1cgfAlUMV9TR05fUykpKSAmIChUMV9TSUcgfCBUMV9WSVNJVCB8IFQxX1NJR19PVEgpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlhZ2cgPSAhKChNQUNST190MV9mbGFncygxICsgaywxICsgaSkgfCAKLQkJCQkJCSAgICBNQUNST190MV9mbGFncygxICsgayArIDEsMSArIGkpIHwKLQkJCQkJCSAgICBNQUNST190MV9mbGFncygxICsgayArIDIsMSArIGkpIHwgCi0JCQkJCQkgICAgIE1BQ1JPX3QxX2ZsYWdzKDEgKyBrICsgMywxICsgaSkpICYgKFQxX1NJRyB8IFQxX1ZJU0lUIHwgVDFfU0lHX09USCkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJYWdnID0gMDsKLQkJCX0KLQkJCWlmIChhZ2cpIHsKLQkJCQlmb3IgKHJ1bmxlbiA9IDA7IHJ1bmxlbiA8IDQ7ICsrcnVubGVuKSB7Ci0JCQkJCWlmIChvcGpfaW50X2Ficyh0MS0+ZGF0YVsoKGsgKyBydW5sZW4pKnQxLT5kYXRhX3N0cmlkZSkgKyBpXSkgJiBvbmUpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJb3BqX21xY19zZXRjdXJjdHgobXFjLCBUMV9DVFhOT19BR0cpOwotCQkJCW9wal9tcWNfZW5jb2RlKG1xYywgcnVubGVuICE9IDQpOwotCQkJCWlmIChydW5sZW4gPT0gNCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJb3BqX21xY19zZXRjdXJjdHgobXFjLCBUMV9DVFhOT19VTkkpOwotCQkJCW9wal9tcWNfZW5jb2RlKG1xYywgcnVubGVuID4+IDEpOwotCQkJCW9wal9tcWNfZW5jb2RlKG1xYywgcnVubGVuICYgMSk7Ci0JCQl9IGVsc2UgewotCQkJCXJ1bmxlbiA9IDA7Ci0JCQl9Ci0JCQlmb3IgKGogPSBrICsgcnVubGVuOyBqIDwgayArIDQgJiYgaiA8IHQxLT5oOyArK2opIHsKLQkJCQl2c2MgPSAoKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfVlNDKSAmJiAoaiA9PSBrICsgMyB8fCBqID09IHQxLT5oIC0gMSkpID8gMSA6IDA7Ci0JCQkJb3BqX3QxX2VuY19jbG5wYXNzX3N0ZXAoCi0JCQkJCQl0MSwKLQkJCQkJCSZ0MS0+ZmxhZ3NbKChqKzEpICogdDEtPmZsYWdzX3N0cmlkZSkgKyBpICsgMV0sCi0JCQkJCQkmdDEtPmRhdGFbKGogKiB0MS0+ZGF0YV9zdHJpZGUpICsgaV0sCi0JCQkJCQlvcmllbnQsCi0JCQkJCQlicG5vLAotCQkJCQkJb25lLAotCQkJCQkJbm1zZWRlYywKLQkJCQkJCWFnZyAmJiAoaiA9PSBrICsgcnVubGVuKSwKLQkJCQkJCXZzYyk7Ci0JCQl9Ci0JCX0KLQl9CisgICAgT1BKX1VJTlQzMiBpLCBrOworICAgIGNvbnN0IE9QSl9JTlQzMiBvbmUgPSAxIDw8IChicG5vICsgVDFfTk1TRURFQ19GUkFDQklUUyk7CisgICAgT1BKX1VJTlQzMiBhZ2csIHJ1bmxlbjsKKworICAgIG9wal9tcWNfdCAqbXFjID0gJih0MS0+bXFjKTsgICAvKiBNUUMgY29tcG9uZW50ICovCisKKyAgICAqbm1zZWRlYyA9IDA7CisjaWZkZWYgREVCVUdfRU5DX0NMTgorICAgIHByaW50ZigiZW5jX2NsbnBhc3M6IGJwbm89JWRcbiIsIGJwbm8pOworI2VuZGlmCisgICAgZm9yIChrID0gMDsgayA8ICh0MS0+aCAmIH4zVSk7IGsgKz0gNCkgeworI2lmZGVmIERFQlVHX0VOQ19DTE4KKyAgICAgICAgcHJpbnRmKCIgaz0lZFxuIiwgayk7CisjZW5kaWYKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKKyNpZmRlZiBERUJVR19FTkNfQ0xOCisgICAgICAgICAgICBwcmludGYoIiAgaT0lZFxuIiwgaSk7CisjZW5kaWYKKyAgICAgICAgICAgIGFnZyA9ICEoVDFfRkxBR1MoaSwgaykpOworI2lmZGVmIERFQlVHX0VOQ19DTE4KKyAgICAgICAgICAgIHByaW50ZigiICAgYWdnPSVkXG4iLCBhZ2cpOworI2VuZGlmCisgICAgICAgICAgICBpZiAoYWdnKSB7CisgICAgICAgICAgICAgICAgZm9yIChydW5sZW4gPSAwOyBydW5sZW4gPCA0OyArK3J1bmxlbikgeworICAgICAgICAgICAgICAgICAgICBpZiAob3BqX2ludF9hYnModDEtPmRhdGFbKChrICsgcnVubGVuKSp0MS0+ZGF0YV9zdHJpZGUpICsgaV0pICYgb25lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvcGpfbXFjX3NldGN1cmN0eChtcWMsIFQxX0NUWE5PX0FHRyk7CisgICAgICAgICAgICAgICAgb3BqX21xY19lbmNvZGUobXFjLCBydW5sZW4gIT0gNCk7CisgICAgICAgICAgICAgICAgaWYgKHJ1bmxlbiA9PSA0KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvcGpfbXFjX3NldGN1cmN0eChtcWMsIFQxX0NUWE5PX1VOSSk7CisgICAgICAgICAgICAgICAgb3BqX21xY19lbmNvZGUobXFjLCBydW5sZW4gPj4gMSk7CisgICAgICAgICAgICAgICAgb3BqX21xY19lbmNvZGUobXFjLCBydW5sZW4gJiAxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnVubGVuID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wal90MV9lbmNfY2xucGFzc19zdGVwKAorICAgICAgICAgICAgICAgIHQxLAorICAgICAgICAgICAgICAgICZUMV9GTEFHUyhpLCBrKSwKKyAgICAgICAgICAgICAgICAmdDEtPmRhdGFbKChrICsgcnVubGVuKSAqIHQxLT5kYXRhX3N0cmlkZSkgKyBpXSwKKyAgICAgICAgICAgICAgICBicG5vLAorICAgICAgICAgICAgICAgIG9uZSwKKyAgICAgICAgICAgICAgICBubXNlZGVjLAorICAgICAgICAgICAgICAgIGFnZywKKyAgICAgICAgICAgICAgICBydW5sZW4sCisgICAgICAgICAgICAgICAgNFUsCisgICAgICAgICAgICAgICAgY2Jsa3N0eSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGsgPCB0MS0+aCkgeworICAgICAgICBhZ2cgPSAwOworICAgICAgICBydW5sZW4gPSAwOworI2lmZGVmIERFQlVHX0VOQ19DTE4KKyAgICAgICAgcHJpbnRmKCIgaz0lZFxuIiwgayk7CisjZW5kaWYKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKKyNpZmRlZiBERUJVR19FTkNfQ0xOCisgICAgICAgICAgICBwcmludGYoIiAgaT0lZFxuIiwgaSk7CisgICAgICAgICAgICBwcmludGYoIiAgIGFnZz0lZFxuIiwgYWdnKTsKKyNlbmRpZgorICAgICAgICAgICAgb3BqX3QxX2VuY19jbG5wYXNzX3N0ZXAoCisgICAgICAgICAgICAgICAgdDEsCisgICAgICAgICAgICAgICAgJlQxX0ZMQUdTKGksIGspLAorICAgICAgICAgICAgICAgICZ0MS0+ZGF0YVsoKGsgKyBydW5sZW4pICogdDEtPmRhdGFfc3RyaWRlKSArIGldLAorICAgICAgICAgICAgICAgIGJwbm8sCisgICAgICAgICAgICAgICAgb25lLAorICAgICAgICAgICAgICAgIG5tc2VkZWMsCisgICAgICAgICAgICAgICAgYWdnLAorICAgICAgICAgICAgICAgIHJ1bmxlbiwKKyAgICAgICAgICAgICAgICB0MS0+aCAtIGssCisgICAgICAgICAgICAgICAgY2Jsa3N0eSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNkZWZpbmUgb3BqX3QxX2RlY19jbG5wYXNzX2ludGVybmFsKHQxLCBicG5vLCB2c2MsIHcsIGgsIGZsYWdzX3N0cmlkZSkgXAoreyBcCisgICAgT1BKX0lOVDMyIG9uZSwgaGFsZiwgb25lcGx1c2hhbGY7IFwKKyAgICBPUEpfVUlOVDMyIHJ1bmxlbjsgXAorICAgIE9QSl9VSU5UMzIgaSwgaiwgazsgXAorICAgIGNvbnN0IE9QSl9VSU5UMzIgbF93ID0gdzsgXAorICAgIG9wal9tcWNfdCogbXFjID0gJih0MS0+bXFjKTsgXAorICAgIHJlZ2lzdGVyIE9QSl9JTlQzMiAqZGF0YSA9IHQxLT5kYXRhOyBcCisgICAgcmVnaXN0ZXIgb3BqX2ZsYWdfdCAqZmxhZ3NwID0gJnQxLT5mbGFnc1tmbGFnc19zdHJpZGUgKyAxXTsgXAorICAgIERPV05MT0FEX01RQ19WQVJJQUJMRVMobXFjLCBjdXJjdHgsIGMsIGEsIGN0KTsgXAorICAgIHJlZ2lzdGVyIE9QSl9VSU5UMzIgdjsgXAorICAgIG9uZSA9IDEgPDwgYnBubzsgXAorICAgIGhhbGYgPSBvbmUgPj4gMTsgXAorICAgIG9uZXBsdXNoYWxmID0gb25lIHwgaGFsZjsgXAorICAgIGZvciAoayA9IDA7IGsgPCAoaCAmIH4zdSk7IGsgKz0gNCwgZGF0YSArPSAzKmxfdywgZmxhZ3NwICs9IDIpIHsgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF93OyArK2ksICsrZGF0YSwgKytmbGFnc3ApIHsgXAorICAgICAgICAgICAgb3BqX2ZsYWdfdCBmbGFncyA9ICpmbGFnc3A7IFwKKyAgICAgICAgICAgIGlmIChmbGFncyA9PSAwKSB7IFwKKyAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBhcnRpYWwgPSBPUEpfVFJVRTsgXAorICAgICAgICAgICAgICAgIG9wal90MV9zZXRjdXJjdHgoY3VyY3R4LCBUMV9DVFhOT19BR0cpOyBcCisgICAgICAgICAgICAgICAgb3BqX21xY19kZWNvZGVfbWFjcm8odiwgbXFjLCBjdXJjdHgsIGEsIGMsIGN0KTsgXAorICAgICAgICAgICAgICAgIGlmICghdikgeyBcCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyBcCisgICAgICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAgICAgb3BqX3QxX3NldGN1cmN0eChjdXJjdHgsIFQxX0NUWE5PX1VOSSk7IFwKKyAgICAgICAgICAgICAgICBvcGpfbXFjX2RlY29kZV9tYWNybyhydW5sZW4sIG1xYywgY3VyY3R4LCBhLCBjLCBjdCk7IFwKKyAgICAgICAgICAgICAgICBvcGpfbXFjX2RlY29kZV9tYWNybyh2LCBtcWMsIGN1cmN0eCwgYSwgYywgY3QpOyBcCisgICAgICAgICAgICAgICAgcnVubGVuID0gKHJ1bmxlbiA8PCAxKSB8IHY7IFwKKyAgICAgICAgICAgICAgICBzd2l0Y2gocnVubGVuKSB7IFwKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiBcCisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX2NsbnBhc3Nfc3RlcF9tYWNybyhPUEpfRkFMU0UsIE9QSl9UUlVFLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIGZsYWdzcCwgZmxhZ3Nfc3RyaWRlLCBkYXRhLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdywgMCwgbXFjLCBjdXJjdHgsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgYSwgYywgY3QsIG9uZXBsdXNoYWxmLCB2c2MpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsID0gT1BKX0ZBTFNFOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBGQUxMVEhSVSAqLyBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogXAorICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19jbG5wYXNzX3N0ZXBfbWFjcm8oT1BKX0ZBTFNFLCBwYXJ0aWFsLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIGZsYWdzcCwgZmxhZ3Nfc3RyaWRlLCBkYXRhLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdywgMSwgbXFjLCBjdXJjdHgsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgYSwgYywgY3QsIG9uZXBsdXNoYWxmLCBPUEpfRkFMU0UpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsID0gT1BKX0ZBTFNFOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBGQUxMVEhSVSAqLyBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogXAorICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19jbG5wYXNzX3N0ZXBfbWFjcm8oT1BKX0ZBTFNFLCBwYXJ0aWFsLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIGZsYWdzcCwgZmxhZ3Nfc3RyaWRlLCBkYXRhLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdywgMiwgbXFjLCBjdXJjdHgsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgYSwgYywgY3QsIG9uZXBsdXNoYWxmLCBPUEpfRkFMU0UpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsID0gT1BKX0ZBTFNFOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBGQUxMVEhSVSAqLyBcCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzogXAorICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19jbG5wYXNzX3N0ZXBfbWFjcm8oT1BKX0ZBTFNFLCBwYXJ0aWFsLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIGZsYWdzcCwgZmxhZ3Nfc3RyaWRlLCBkYXRhLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdywgMywgbXFjLCBjdXJjdHgsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgYSwgYywgY3QsIG9uZXBsdXNoYWxmLCBPUEpfRkFMU0UpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgfSBlbHNlIHsgXAorICAgICAgICAgICAgICAgIG9wal90MV9kZWNfY2xucGFzc19zdGVwX21hY3JvKE9QSl9UUlVFLCBPUEpfRkFMU0UsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBmbGFnc3AsIGZsYWdzX3N0cmlkZSwgZGF0YSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF93LCAwLCBtcWMsIGN1cmN0eCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgYSwgYywgY3QsIG9uZXBsdXNoYWxmLCB2c2MpOyBcCisgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19jbG5wYXNzX3N0ZXBfbWFjcm8oT1BKX1RSVUUsIE9QSl9GQUxTRSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIGZsYWdzcCwgZmxhZ3Nfc3RyaWRlLCBkYXRhLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3csIDEsIG1xYywgY3VyY3R4LCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2LCBhLCBjLCBjdCwgb25lcGx1c2hhbGYsIE9QSl9GQUxTRSk7IFwKKyAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX2NsbnBhc3Nfc3RlcF9tYWNybyhPUEpfVFJVRSwgT1BKX0ZBTFNFLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgZmxhZ3NwLCBmbGFnc19zdHJpZGUsIGRhdGEsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdywgMiwgbXFjLCBjdXJjdHgsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYsIGEsIGMsIGN0LCBvbmVwbHVzaGFsZiwgT1BKX0ZBTFNFKTsgXAorICAgICAgICAgICAgICAgIG9wal90MV9kZWNfY2xucGFzc19zdGVwX21hY3JvKE9QSl9UUlVFLCBPUEpfRkFMU0UsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBmbGFnc3AsIGZsYWdzX3N0cmlkZSwgZGF0YSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF93LCAzLCBtcWMsIGN1cmN0eCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgYSwgYywgY3QsIG9uZXBsdXNoYWxmLCBPUEpfRkFMU0UpOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgICpmbGFnc3AgPSBmbGFncyAmIH4oVDFfUElfMCB8IFQxX1BJXzEgfCBUMV9QSV8yIHwgVDFfUElfMyk7IFwKKyAgICAgICAgfSBcCisgICAgfSBcCisgICAgVVBMT0FEX01RQ19WQVJJQUJMRVMobXFjLCBjdXJjdHgsIGMsIGEsIGN0KTsgXAorICAgIGlmKCBrIDwgaCApIHsgXAorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF93OyArK2ksICsrZmxhZ3NwLCArK2RhdGEpIHsgXAorICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGggLSBrOyArK2opIHsgXAorICAgICAgICAgICAgICAgIG9wal90MV9kZWNfY2xucGFzc19zdGVwKHQxLCBmbGFnc3AsIGRhdGEgKyBqICogbF93LCBvbmVwbHVzaGFsZiwgaiwgdnNjKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICAqZmxhZ3NwICY9IH4oVDFfUElfMCB8IFQxX1BJXzEgfCBUMV9QSV8yIHwgVDFfUElfMyk7IFwKKyAgICAgICAgfSBcCisgICAgfSBcCit9CisKK3N0YXRpYyB2b2lkIG9wal90MV9kZWNfY2xucGFzc19jaGVja19zZWdzeW0ob3BqX3QxX3QgKnQxLCBPUEpfSU5UMzIgY2Jsa3N0eSkKK3sKKyAgICBpZiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9TRUdTWU0pIHsKKyAgICAgICAgb3BqX21xY190KiBtcWMgPSAmKHQxLT5tcWMpOworICAgICAgICBPUEpfVUlOVDMyIHYsIHYyOworICAgICAgICBvcGpfbXFjX3NldGN1cmN0eChtcWMsIFQxX0NUWE5PX1VOSSk7CisgICAgICAgIG9wal9tcWNfZGVjb2RlKHYsIG1xYyk7CisgICAgICAgIG9wal9tcWNfZGVjb2RlKHYyLCBtcWMpOworICAgICAgICB2ID0gKHYgPDwgMSkgfCB2MjsKKyAgICAgICAgb3BqX21xY19kZWNvZGUodjIsIG1xYyk7CisgICAgICAgIHYgPSAodiA8PCAxKSB8IHYyOworICAgICAgICBvcGpfbXFjX2RlY29kZSh2MiwgbXFjKTsKKyAgICAgICAgdiA9ICh2IDw8IDEpIHwgdjI7CisgICAgICAgIC8qCisgICAgICAgIGlmICh2IT0weGEpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2codDEtPmNpbmZvLCBFVlRfV0FSTklORywgIkJhZCBzZWdtZW50YXRpb24gc3ltYm9sICV4XG4iLCB2KTsKKyAgICAgICAgfQorICAgICAgICAqLworICAgIH0KK30KKworc3RhdGljIHZvaWQgb3BqX3QxX2RlY19jbG5wYXNzXzY0eDY0X25vdnNjKAorICAgIG9wal90MV90ICp0MSwKKyAgICBPUEpfSU5UMzIgYnBubykKK3sKKyAgICBvcGpfdDFfZGVjX2NsbnBhc3NfaW50ZXJuYWwodDEsIGJwbm8sIE9QSl9GQUxTRSwgNjQsIDY0LCA2Nik7Cit9CisKK3N0YXRpYyB2b2lkIG9wal90MV9kZWNfY2xucGFzc182NHg2NF92c2MoCisgICAgb3BqX3QxX3QgKnQxLAorICAgIE9QSl9JTlQzMiBicG5vKQoreworICAgIG9wal90MV9kZWNfY2xucGFzc19pbnRlcm5hbCh0MSwgYnBubywgT1BKX1RSVUUsIDY0LCA2NCwgNjYpOworfQorCitzdGF0aWMgdm9pZCBvcGpfdDFfZGVjX2NsbnBhc3NfZ2VuZXJpY19ub3ZzYygKKyAgICBvcGpfdDFfdCAqdDEsCisgICAgT1BKX0lOVDMyIGJwbm8pCit7CisgICAgb3BqX3QxX2RlY19jbG5wYXNzX2ludGVybmFsKHQxLCBicG5vLCBPUEpfRkFMU0UsIHQxLT53LCB0MS0+aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEtPncgKyAyVSk7Cit9CisKK3N0YXRpYyB2b2lkIG9wal90MV9kZWNfY2xucGFzc19nZW5lcmljX3ZzYygKKyAgICBvcGpfdDFfdCAqdDEsCisgICAgT1BKX0lOVDMyIGJwbm8pCit7CisgICAgb3BqX3QxX2RlY19jbG5wYXNzX2ludGVybmFsKHQxLCBicG5vLCBPUEpfVFJVRSwgdDEtPncsIHQxLT5oLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MS0+dyArIDJVKTsKIH0KIAogc3RhdGljIHZvaWQgb3BqX3QxX2RlY19jbG5wYXNzKAotCQlvcGpfdDFfdCAqdDEsCi0JCU9QSl9JTlQzMiBicG5vLAotCQlPUEpfSU5UMzIgb3JpZW50LAotCQlPUEpfSU5UMzIgY2Jsa3N0eSkKKyAgICBvcGpfdDFfdCAqdDEsCisgICAgT1BKX0lOVDMyIGJwbm8sCisgICAgT1BKX0lOVDMyIGNibGtzdHkpCiB7Ci0JT1BKX0lOVDMyIG9uZSwgaGFsZiwgb25lcGx1c2hhbGYsIGFnZywgcnVubGVuLCB2c2M7Ci0gICAgT1BKX1VJTlQzMiBpLCBqLCBrOwotCU9QSl9JTlQzMiBzZWdzeW0gPSBjYmxrc3R5ICYgSjJLX0NDUF9DQkxLU1RZX1NFR1NZTTsKLQkKLQlvcGpfbXFjX3QgKm1xYyA9IHQxLT5tcWM7CS8qIE1RQyBjb21wb25lbnQgKi8KLQkKLQlvbmUgPSAxIDw8IGJwbm87Ci0JaGFsZiA9IG9uZSA+PiAxOwotCW9uZXBsdXNoYWxmID0gb25lIHwgaGFsZjsKLQlpZiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9WU0MpIHsKLQlmb3IgKGsgPSAwOyBrIDwgdDEtPmg7IGsgKz0gNCkgewotCQlmb3IgKGkgPSAwOyBpIDwgdDEtPnc7ICsraSkgewotCQkJaWYgKGsgKyAzIDwgdDEtPmgpIHsKLQkJCQkJYWdnID0gIShNQUNST190MV9mbGFncygxICsgaywxICsgaSkgJiAoVDFfU0lHIHwgVDFfVklTSVQgfCBUMV9TSUdfT1RIKQotCQkJCQkJfHwgTUFDUk9fdDFfZmxhZ3MoMSArIGsgKyAxLDEgKyBpKSAmIChUMV9TSUcgfCBUMV9WSVNJVCB8IFQxX1NJR19PVEgpCi0JCQkJCQl8fCBNQUNST190MV9mbGFncygxICsgayArIDIsMSArIGkpICYgKFQxX1NJRyB8IFQxX1ZJU0lUIHwgVDFfU0lHX09USCkKLQkJCQkJCXx8IChNQUNST190MV9mbGFncygxICsgayArIDMsMSArIGkpIAotCQkJCQkJJiAofihUMV9TSUdfUyB8IFQxX1NJR19TRSB8IFQxX1NJR19TVyB8CVQxX1NHTl9TKSkpICYgKFQxX1NJRyB8IFQxX1ZJU0lUIHwgVDFfU0lHX09USCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJYWdnID0gMDsKLQkJCX0KLQkJCWlmIChhZ2cpIHsKLQkJCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIFQxX0NUWE5PX0FHRyk7Ci0JCQkJaWYgKCFvcGpfbXFjX2RlY29kZShtcWMpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIFQxX0NUWE5PX1VOSSk7Ci0JCQkJcnVubGVuID0gb3BqX21xY19kZWNvZGUobXFjKTsKLQkJCQlydW5sZW4gPSAocnVubGVuIDw8IDEpIHwgb3BqX21xY19kZWNvZGUobXFjKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcnVubGVuID0gMDsKLQkJCX0KLQkJCWZvciAoaiA9IGsgKyAoT1BKX1VJTlQzMilydW5sZW47IGogPCBrICsgNCAmJiBqIDwgdDEtPmg7ICsraikgewotCQkJCQl2c2MgPSAoaiA9PSBrICsgMyB8fCBqID09IHQxLT5oIC0gMSkgPyAxIDogMDsKLQkJCQkJb3BqX3QxX2RlY19jbG5wYXNzX3N0ZXBfdnNjKAotCQkJCQkJdDEsCi0JCQkJCQkmdDEtPmZsYWdzWygoaisxKSAqIHQxLT5mbGFnc19zdHJpZGUpICsgaSArIDFdLAotCQkJCQkJJnQxLT5kYXRhWyhqICogdDEtPncpICsgaV0sCi0JCQkJCQlvcmllbnQsCi0JCQkJCQlvbmVwbHVzaGFsZiwKLQkJCQkJCWFnZyAmJiAoaiA9PSBrICsgKE9QSl9VSU5UMzIpcnVubGVuKSwKLQkJCQkJCXZzYyk7Ci0JCQl9Ci0JCX0KLQl9Ci0JfSBlbHNlIHsKLQkJT1BKX0lOVDMyICpkYXRhMSA9IHQxLT5kYXRhOwotCQlvcGpfZmxhZ190ICpmbGFnczEgPSAmdDEtPmZsYWdzWzFdOwotCQlmb3IgKGsgPSAwOyBrIDwgKHQxLT5oICYgfjN1KTsgayArPSA0KSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgdDEtPnc7ICsraSkgewotCQkJCU9QSl9JTlQzMiAqZGF0YTIgPSBkYXRhMSArIGk7Ci0JCQkJb3BqX2ZsYWdfdCAqZmxhZ3MyID0gZmxhZ3MxICsgaTsKLQkJCQlhZ2cgPSAhKChNQUNST190MV9mbGFncygxICsgaywgMSArIGkpIHwKLQkJCQkJCQlNQUNST190MV9mbGFncygxICsgayArIDEsIDEgKyBpKSB8Ci0JCQkJCQkJTUFDUk9fdDFfZmxhZ3MoMSArIGsgKyAyLCAxICsgaSkgfAotCQkJCQkJCU1BQ1JPX3QxX2ZsYWdzKDEgKyBrICsgMywgMSArIGkpKSAmIChUMV9TSUcgfCBUMV9WSVNJVCB8IFQxX1NJR19PVEgpKTsKLQkJCQlpZiAoYWdnKSB7Ci0JCQkJCW9wal9tcWNfc2V0Y3VyY3R4KG1xYywgVDFfQ1RYTk9fQUdHKTsKLQkJCQkJaWYgKCFvcGpfbXFjX2RlY29kZShtcWMpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlvcGpfbXFjX3NldGN1cmN0eChtcWMsIFQxX0NUWE5PX1VOSSk7Ci0JCQkJCXJ1bmxlbiA9IG9wal9tcWNfZGVjb2RlKG1xYyk7Ci0JCQkJCXJ1bmxlbiA9IChydW5sZW4gPDwgMSkgfCBvcGpfbXFjX2RlY29kZShtcWMpOwotCQkJCQlmbGFnczIgKz0gKE9QSl9VSU5UMzIpcnVubGVuICogdDEtPmZsYWdzX3N0cmlkZTsKLQkJCQkJZGF0YTIgKz0gKE9QSl9VSU5UMzIpcnVubGVuICogdDEtPnc7Ci0JCQkJCWZvciAoaiA9IChPUEpfVUlOVDMyKXJ1bmxlbjsgaiA8IDQgJiYgaiA8IHQxLT5oOyArK2opIHsKLQkJCQkJCWZsYWdzMiArPSB0MS0+ZmxhZ3Nfc3RyaWRlOwotCQkJCQkJaWYgKGFnZyAmJiAoaiA9PSAoT1BKX1VJTlQzMilydW5sZW4pKSB7Ci0JCQkJCQkJb3BqX3QxX2RlY19jbG5wYXNzX3N0ZXBfcGFydGlhbCh0MSwgZmxhZ3MyLCBkYXRhMiwgb3JpZW50LCBvbmVwbHVzaGFsZik7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCW9wal90MV9kZWNfY2xucGFzc19zdGVwKHQxLCBmbGFnczIsIGRhdGEyLCBvcmllbnQsIG9uZXBsdXNoYWxmKTsKLQkJCQkJCX0KLQkJCQkJCWRhdGEyICs9IHQxLT53OwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZmxhZ3MyICs9IHQxLT5mbGFnc19zdHJpZGU7Ci0JCQkJCW9wal90MV9kZWNfY2xucGFzc19zdGVwKHQxLCBmbGFnczIsIGRhdGEyLCBvcmllbnQsIG9uZXBsdXNoYWxmKTsKLQkJCQkJZGF0YTIgKz0gdDEtPnc7Ci0JCQkJCWZsYWdzMiArPSB0MS0+ZmxhZ3Nfc3RyaWRlOwotCQkJCQlvcGpfdDFfZGVjX2NsbnBhc3Nfc3RlcCh0MSwgZmxhZ3MyLCBkYXRhMiwgb3JpZW50LCBvbmVwbHVzaGFsZik7Ci0JCQkJCWRhdGEyICs9IHQxLT53OwotCQkJCQlmbGFnczIgKz0gdDEtPmZsYWdzX3N0cmlkZTsKLQkJCQkJb3BqX3QxX2RlY19jbG5wYXNzX3N0ZXAodDEsIGZsYWdzMiwgZGF0YTIsIG9yaWVudCwgb25lcGx1c2hhbGYpOwotCQkJCQlkYXRhMiArPSB0MS0+dzsKLQkJCQkJZmxhZ3MyICs9IHQxLT5mbGFnc19zdHJpZGU7Ci0JCQkJCW9wal90MV9kZWNfY2xucGFzc19zdGVwKHQxLCBmbGFnczIsIGRhdGEyLCBvcmllbnQsIG9uZXBsdXNoYWxmKTsKLQkJCQkJZGF0YTIgKz0gdDEtPnc7Ci0JCQkJfQotCQkJfQotCQkJZGF0YTEgKz0gdDEtPncgPDwgMjsKLQkJCWZsYWdzMSArPSB0MS0+ZmxhZ3Nfc3RyaWRlIDw8IDI7Ci0JCX0KLQkJZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKLQkJCU9QSl9JTlQzMiAqZGF0YTIgPSBkYXRhMSArIGk7Ci0JCQlvcGpfZmxhZ190ICpmbGFnczIgPSBmbGFnczEgKyBpOwotCQkJZm9yIChqID0gazsgaiA8IHQxLT5oOyArK2opIHsKLQkJCQlmbGFnczIgKz0gdDEtPmZsYWdzX3N0cmlkZTsKLQkJCQlvcGpfdDFfZGVjX2NsbnBhc3Nfc3RlcCh0MSwgZmxhZ3MyLCBkYXRhMiwgb3JpZW50LCBvbmVwbHVzaGFsZik7Ci0JCQkJZGF0YTIgKz0gdDEtPnc7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoc2Vnc3ltKSB7Ci0JCU9QSl9JTlQzMiB2ID0gMDsKLQkJb3BqX21xY19zZXRjdXJjdHgobXFjLCBUMV9DVFhOT19VTkkpOwotCQl2ID0gb3BqX21xY19kZWNvZGUobXFjKTsKLQkJdiA9ICh2IDw8IDEpIHwgb3BqX21xY19kZWNvZGUobXFjKTsKLQkJdiA9ICh2IDw8IDEpIHwgb3BqX21xY19kZWNvZGUobXFjKTsKLQkJdiA9ICh2IDw8IDEpIHwgb3BqX21xY19kZWNvZGUobXFjKTsKLQkJLyoKLQkJaWYgKHYhPTB4YSkgewotCQkJb3BqX2V2ZW50X21zZyh0MS0+Y2luZm8sIEVWVF9XQVJOSU5HLCAiQmFkIHNlZ21lbnRhdGlvbiBzeW1ib2wgJXhcbiIsIHYpOwotCQl9IAotCQkqLwotCX0KLX0JCQkJLyogVlNDIGFuZCAgQllQQVNTIGJ5IEFudG9uaW4gKi8KKyAgICBpZiAodDEtPncgPT0gNjQgJiYgdDEtPmggPT0gNjQpIHsKKyAgICAgICAgaWYgKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfVlNDKSB7CisgICAgICAgICAgICBvcGpfdDFfZGVjX2NsbnBhc3NfNjR4NjRfdnNjKHQxLCBicG5vKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9wal90MV9kZWNfY2xucGFzc182NHg2NF9ub3ZzYyh0MSwgYnBubyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9WU0MpIHsKKyAgICAgICAgICAgIG9wal90MV9kZWNfY2xucGFzc19nZW5lcmljX3ZzYyh0MSwgYnBubyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcGpfdDFfZGVjX2NsbnBhc3NfZ2VuZXJpY19ub3ZzYyh0MSwgYnBubyk7CisgICAgICAgIH0KKyAgICB9CisgICAgb3BqX3QxX2RlY19jbG5wYXNzX2NoZWNrX3NlZ3N5bSh0MSwgY2Jsa3N0eSk7Cit9CiAKIAogLyoqIG1vZCBmaXhlZF9xdWFsaXR5ICovCiBzdGF0aWMgT1BKX0ZMT0FUNjQgb3BqX3QxX2dldHdtc2VkZWMoCi0JCU9QSl9JTlQzMiBubXNlZGVjLAotCQlPUEpfVUlOVDMyIGNvbXBubywKLQkJT1BKX1VJTlQzMiBsZXZlbCwKLQkJT1BKX1VJTlQzMiBvcmllbnQsCi0JCU9QSl9JTlQzMiBicG5vLAotCQlPUEpfVUlOVDMyIHFtZmJpZCwKLQkJT1BKX0ZMT0FUNjQgc3RlcHNpemUsCi0JCU9QSl9VSU5UMzIgbnVtY29tcHMsCi0JCWNvbnN0IE9QSl9GTE9BVDY0ICogbWN0X25vcm1zLAotCQlPUEpfVUlOVDMyIG1jdF9udW1jb21wcykKKyAgICBPUEpfSU5UMzIgbm1zZWRlYywKKyAgICBPUEpfVUlOVDMyIGNvbXBubywKKyAgICBPUEpfVUlOVDMyIGxldmVsLAorICAgIE9QSl9VSU5UMzIgb3JpZW50LAorICAgIE9QSl9JTlQzMiBicG5vLAorICAgIE9QSl9VSU5UMzIgcW1mYmlkLAorICAgIE9QSl9GTE9BVDY0IHN0ZXBzaXplLAorICAgIE9QSl9VSU5UMzIgbnVtY29tcHMsCisgICAgY29uc3QgT1BKX0ZMT0FUNjQgKiBtY3Rfbm9ybXMsCisgICAgT1BKX1VJTlQzMiBtY3RfbnVtY29tcHMpCiB7Ci0JT1BKX0ZMT0FUNjQgdzEgPSAxLCB3Miwgd21zZWRlYzsKLQlPUEpfQVJHX05PVF9VU0VEKG51bWNvbXBzKTsKKyAgICBPUEpfRkxPQVQ2NCB3MSA9IDEsIHcyLCB3bXNlZGVjOworICAgIE9QSl9BUkdfTk9UX1VTRUQobnVtY29tcHMpOwogCi0JaWYgKG1jdF9ub3JtcyAmJiAoY29tcG5vIDwgbWN0X251bWNvbXBzKSkgewotCQl3MSA9IG1jdF9ub3Jtc1tjb21wbm9dOwotCX0KKyAgICBpZiAobWN0X25vcm1zICYmIChjb21wbm8gPCBtY3RfbnVtY29tcHMpKSB7CisgICAgICAgIHcxID0gbWN0X25vcm1zW2NvbXBub107CisgICAgfQogCi0JaWYgKHFtZmJpZCA9PSAxKSB7Ci0JCXcyID0gb3BqX2R3dF9nZXRub3JtKGxldmVsLCBvcmllbnQpOwotCX0gZWxzZSB7CS8qIGlmIChxbWZiaWQgPT0gMCkgKi8KLQkJdzIgPSBvcGpfZHd0X2dldG5vcm1fcmVhbChsZXZlbCwgb3JpZW50KTsKLQl9CisgICAgaWYgKHFtZmJpZCA9PSAxKSB7CisgICAgICAgIHcyID0gb3BqX2R3dF9nZXRub3JtKGxldmVsLCBvcmllbnQpOworICAgIH0gZWxzZSB7ICAgIC8qIGlmIChxbWZiaWQgPT0gMCkgKi8KKyAgICAgICAgdzIgPSBvcGpfZHd0X2dldG5vcm1fcmVhbChsZXZlbCwgb3JpZW50KTsKKyAgICB9CiAKLQl3bXNlZGVjID0gdzEgKiB3MiAqIHN0ZXBzaXplICogKDEgPDwgYnBubyk7Ci0Jd21zZWRlYyAqPSB3bXNlZGVjICogbm1zZWRlYyAvIDgxOTIuMDsKKyAgICB3bXNlZGVjID0gdzEgKiB3MiAqIHN0ZXBzaXplICogKDEgPDwgYnBubyk7CisgICAgd21zZWRlYyAqPSB3bXNlZGVjICogbm1zZWRlYyAvIDgxOTIuMDsKIAotCXJldHVybiB3bXNlZGVjOworICAgIHJldHVybiB3bXNlZGVjOwogfQogCiBzdGF0aWMgT1BKX0JPT0wgb3BqX3QxX2FsbG9jYXRlX2J1ZmZlcnMoCi0JCW9wal90MV90ICp0MSwKLQkJT1BKX1VJTlQzMiB3LAotCQlPUEpfVUlOVDMyIGgpCisgICAgb3BqX3QxX3QgKnQxLAorICAgIE9QSl9VSU5UMzIgdywKKyAgICBPUEpfVUlOVDMyIGgpCiB7Ci0JT1BKX1VJTlQzMiBkYXRhc2l6ZT13ICogaDsKLQlPUEpfVUlOVDMyIGZsYWdzc2l6ZTsKKyAgICBPUEpfVUlOVDMyIGZsYWdzc2l6ZTsKKyAgICBPUEpfVUlOVDMyIGZsYWdzX3N0cmlkZTsKIAotCS8qIGVuY29kZXIgdXNlcyB0aWxlIGJ1ZmZlciwgc28gbm8gbmVlZCB0byBhbGxvY2F0ZSAqLwotCWlmICghdDEtPmVuY29kZXIpIHsKLQkJaWYoZGF0YXNpemUgPiB0MS0+ZGF0YXNpemUpewotCQkJb3BqX2FsaWduZWRfZnJlZSh0MS0+ZGF0YSk7Ci0JCQlpZiAoKChPUEpfVUlOVDMyKS0xKSAvIChPUEpfVUlOVDMyKXNpemVvZihPUEpfSU5UMzIpIDwgZGF0YXNpemUpIHsKLQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJfQotCQkJdDEtPmRhdGEgPSAoT1BKX0lOVDMyKikgb3BqX2FsaWduZWRfbWFsbG9jKGRhdGFzaXplICogc2l6ZW9mKE9QSl9JTlQzMikpOwotCQkJaWYoIXQxLT5kYXRhKXsKLQkJCQkvKiBGSVhNRSBldmVudCBtYW5hZ2VyIGVycm9yIGNhbGxiYWNrICovCi0JCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJCX0KLQkJCXQxLT5kYXRhc2l6ZT1kYXRhc2l6ZTsKLQkJfQotCQltZW1zZXQodDEtPmRhdGEsMCxkYXRhc2l6ZSAqIHNpemVvZihPUEpfSU5UMzIpKTsKLQl9Ci0JdDEtPmZsYWdzX3N0cmlkZT13KzI7Ci0JZmxhZ3NzaXplPXQxLT5mbGFnc19zdHJpZGUgKiAoaCsyKTsKKyAgICAvKiBObyByaXNrIG9mIG92ZXJmbG93LiBQcmlvciBjaGVja3MgZW5zdXJlIHRob3NlIGFzc2VydCBhcmUgbWV0ICovCisgICAgLyogVGhleSBhcmUgcGVyIHRoZSBzcGVjaWZpY2F0aW9uICovCisgICAgYXNzZXJ0KHcgPD0gMTAyNCk7CisgICAgYXNzZXJ0KGggPD0gMTAyNCk7CisgICAgYXNzZXJ0KHcgKiBoIDw9IDQwOTYpOwogCi0JaWYoZmxhZ3NzaXplID4gdDEtPmZsYWdzc2l6ZSl7Ci0JCW9wal9hbGlnbmVkX2ZyZWUodDEtPmZsYWdzKTsKLQkJaWYgKCgoT1BKX1VJTlQzMiktMSkgLyAoT1BKX1VJTlQzMilzaXplb2Yob3BqX2ZsYWdfdCkgPCBmbGFnc3NpemUpIHsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQkJdDEtPmZsYWdzID0gKG9wal9mbGFnX3QqKSBvcGpfYWxpZ25lZF9tYWxsb2MoZmxhZ3NzaXplICogc2l6ZW9mKG9wal9mbGFnX3QpKTsKLQkJaWYoIXQxLT5mbGFncyl7Ci0JCQkvKiBGSVhNRSBldmVudCBtYW5hZ2VyIGVycm9yIGNhbGxiYWNrICovCi0JCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQl9Ci0JCXQxLT5mbGFnc3NpemU9ZmxhZ3NzaXplOwotCX0KLQltZW1zZXQodDEtPmZsYWdzLDAsZmxhZ3NzaXplICogc2l6ZW9mKG9wal9mbGFnX3QpKTsKKyAgICAvKiBlbmNvZGVyIHVzZXMgdGlsZSBidWZmZXIsIHNvIG5vIG5lZWQgdG8gYWxsb2NhdGUgKi8KKyAgICBpZiAoIXQxLT5lbmNvZGVyKSB7CisgICAgICAgIE9QSl9VSU5UMzIgZGF0YXNpemUgPSB3ICogaDsKIAotCXQxLT53PXc7Ci0JdDEtPmg9aDsKKyAgICAgICAgaWYgKGRhdGFzaXplID4gdDEtPmRhdGFzaXplKSB7CisgICAgICAgICAgICBvcGpfYWxpZ25lZF9mcmVlKHQxLT5kYXRhKTsKKyAgICAgICAgICAgIHQxLT5kYXRhID0gKE9QSl9JTlQzMiopIG9wal9hbGlnbmVkX21hbGxvYyhkYXRhc2l6ZSAqIHNpemVvZihPUEpfSU5UMzIpKTsKKyAgICAgICAgICAgIGlmICghdDEtPmRhdGEpIHsKKyAgICAgICAgICAgICAgICAvKiBGSVhNRSBldmVudCBtYW5hZ2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHQxLT5kYXRhc2l6ZSA9IGRhdGFzaXplOworICAgICAgICB9CisgICAgICAgIC8qIG1lbXNldCBmaXJzdCBhcmcgaXMgZGVjbGFyZWQgdG8gbmV2ZXIgYmUgbnVsbCBieSBnY2MgKi8KKyAgICAgICAgaWYgKHQxLT5kYXRhICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1lbXNldCh0MS0+ZGF0YSwgMCwgZGF0YXNpemUgKiBzaXplb2YoT1BKX0lOVDMyKSk7CisgICAgICAgIH0KKyAgICB9CiAKLQlyZXR1cm4gT1BKX1RSVUU7CisgICAgZmxhZ3Nfc3RyaWRlID0gdyArIDJVOyAvKiBjYW4ndCBiZSAwVSAqLworCisgICAgZmxhZ3NzaXplID0gKGggKyAzVSkgLyA0VSArIDJVOworCisgICAgZmxhZ3NzaXplICo9IGZsYWdzX3N0cmlkZTsKKyAgICB7CisgICAgICAgIG9wal9mbGFnX3QqIHA7CisgICAgICAgIE9QSl9VSU5UMzIgeDsKKyAgICAgICAgT1BKX1VJTlQzMiBmbGFnc19oZWlnaHQgPSAoaCArIDNVKSAvIDRVOworCisgICAgICAgIGlmIChmbGFnc3NpemUgPiB0MS0+ZmxhZ3NzaXplKSB7CisKKyAgICAgICAgICAgIG9wal9hbGlnbmVkX2ZyZWUodDEtPmZsYWdzKTsKKyAgICAgICAgICAgIHQxLT5mbGFncyA9IChvcGpfZmxhZ190Kikgb3BqX2FsaWduZWRfbWFsbG9jKGZsYWdzc2l6ZSAqIHNpemVvZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZmxhZ190KSk7CisgICAgICAgICAgICBpZiAoIXQxLT5mbGFncykgeworICAgICAgICAgICAgICAgIC8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHQxLT5mbGFnc3NpemUgPSBmbGFnc3NpemU7CisKKyAgICAgICAgbWVtc2V0KHQxLT5mbGFncywgMCwgZmxhZ3NzaXplICogc2l6ZW9mKG9wal9mbGFnX3QpKTsKKworICAgICAgICBwID0gJnQxLT5mbGFnc1swXTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGZsYWdzX3N0cmlkZTsgKyt4KSB7CisgICAgICAgICAgICAvKiBtYWdpYyB2YWx1ZSB0byBob3BlZnVsbHkgc3RvcCBhbnkgcGFzc2VzIGJlaW5nIGludGVyZXN0ZWQgaW4gdGhpcyBlbnRyeSAqLworICAgICAgICAgICAgKnArKyA9IChUMV9QSV8wIHwgVDFfUElfMSB8IFQxX1BJXzIgfCBUMV9QSV8zKTsKKyAgICAgICAgfQorCisgICAgICAgIHAgPSAmdDEtPmZsYWdzWygoZmxhZ3NfaGVpZ2h0ICsgMSkgKiBmbGFnc19zdHJpZGUpXTsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IGZsYWdzX3N0cmlkZTsgKyt4KSB7CisgICAgICAgICAgICAvKiBtYWdpYyB2YWx1ZSB0byBob3BlZnVsbHkgc3RvcCBhbnkgcGFzc2VzIGJlaW5nIGludGVyZXN0ZWQgaW4gdGhpcyBlbnRyeSAqLworICAgICAgICAgICAgKnArKyA9IChUMV9QSV8wIHwgVDFfUElfMSB8IFQxX1BJXzIgfCBUMV9QSV8zKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoICUgNCkgeworICAgICAgICAgICAgT1BKX1VJTlQzMiB2ID0gMDsKKyAgICAgICAgICAgIHAgPSAmdDEtPmZsYWdzWygoZmxhZ3NfaGVpZ2h0KSAqIGZsYWdzX3N0cmlkZSldOworICAgICAgICAgICAgaWYgKGggJSA0ID09IDEpIHsKKyAgICAgICAgICAgICAgICB2IHw9IFQxX1BJXzEgfCBUMV9QSV8yIHwgVDFfUElfMzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaCAlIDQgPT0gMikgeworICAgICAgICAgICAgICAgIHYgfD0gVDFfUElfMiB8IFQxX1BJXzM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGggJSA0ID09IDMpIHsKKyAgICAgICAgICAgICAgICB2IHw9IFQxX1BJXzM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHggPSAwOyB4IDwgZmxhZ3Nfc3RyaWRlOyArK3gpIHsKKyAgICAgICAgICAgICAgICAqcCsrID0gdjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHQxLT53ID0gdzsKKyAgICB0MS0+aCA9IGg7CisKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0xMjE4LDI4ICsxNTM2LDE2IEBACiAqLwogb3BqX3QxX3QqIG9wal90MV9jcmVhdGUoT1BKX0JPT0wgaXNFbmNvZGVyKQogewotCW9wal90MV90ICpsX3QxID0gMDA7CisgICAgb3BqX3QxX3QgKmxfdDEgPSAwMDsKIAotCWxfdDEgPSAob3BqX3QxX3QqKSBvcGpfY2FsbG9jKDEsc2l6ZW9mKG9wal90MV90KSk7Ci0JaWYgKCFsX3QxKSB7Ci0JCXJldHVybiAwMDsKLQl9CisgICAgbF90MSA9IChvcGpfdDFfdCopIG9wal9jYWxsb2MoMSwgc2l6ZW9mKG9wal90MV90KSk7CisgICAgaWYgKCFsX3QxKSB7CisgICAgICAgIHJldHVybiAwMDsKKyAgICB9CiAKLQkvKiBjcmVhdGUgTVFDIGFuZCBSQVcgaGFuZGxlcyAqLwotCWxfdDEtPm1xYyA9IG9wal9tcWNfY3JlYXRlKCk7Ci0JaWYgKCEgbF90MS0+bXFjKSB7Ci0JCW9wal90MV9kZXN0cm95KGxfdDEpOwotCQlyZXR1cm4gMDA7Ci0JfQorICAgIGxfdDEtPmVuY29kZXIgPSBpc0VuY29kZXI7CiAKLQlsX3QxLT5yYXcgPSBvcGpfcmF3X2NyZWF0ZSgpOwotCWlmICghIGxfdDEtPnJhdykgewotCQlvcGpfdDFfZGVzdHJveShsX3QxKTsKLQkJcmV0dXJuIDAwOwotCX0KLQlsX3QxLT5lbmNvZGVyID0gaXNFbmNvZGVyOwotCi0JcmV0dXJuIGxfdDE7CisgICAgcmV0dXJuIGxfdDE7CiB9CiAKIApAQCAtMTI1MCw1MjEgKzE1NTYsODY0IEBACiAqLwogdm9pZCBvcGpfdDFfZGVzdHJveShvcGpfdDFfdCAqcF90MSkKIHsKLQlpZiAoISBwX3QxKSB7Ci0JCXJldHVybjsKLQl9CisgICAgaWYgKCEgcF90MSkgeworICAgICAgICByZXR1cm47CisgICAgfQogCi0JLyogZGVzdHJveSBNUUMgYW5kIFJBVyBoYW5kbGVzICovCi0Jb3BqX21xY19kZXN0cm95KHBfdDEtPm1xYyk7Ci0JcF90MS0+bXFjID0gMDA7Ci0Jb3BqX3Jhd19kZXN0cm95KHBfdDEtPnJhdyk7Ci0JcF90MS0+cmF3ID0gMDA7Ci0JCi0JLyogZW5jb2RlciB1c2VzIHRpbGUgYnVmZmVyLCBzbyBubyBuZWVkIHRvIGZyZWUgKi8KLQlpZiAoIXBfdDEtPmVuY29kZXIgJiYgcF90MS0+ZGF0YSkgewotCQlvcGpfYWxpZ25lZF9mcmVlKHBfdDEtPmRhdGEpOwotCQlwX3QxLT5kYXRhID0gMDA7Ci0JfQorICAgIC8qIGVuY29kZXIgdXNlcyB0aWxlIGJ1ZmZlciwgc28gbm8gbmVlZCB0byBmcmVlICovCisgICAgaWYgKCFwX3QxLT5lbmNvZGVyICYmIHBfdDEtPmRhdGEpIHsKKyAgICAgICAgb3BqX2FsaWduZWRfZnJlZShwX3QxLT5kYXRhKTsKKyAgICAgICAgcF90MS0+ZGF0YSA9IDAwOworICAgIH0KIAotCWlmIChwX3QxLT5mbGFncykgewotCQlvcGpfYWxpZ25lZF9mcmVlKHBfdDEtPmZsYWdzKTsKLQkJcF90MS0+ZmxhZ3MgPSAwMDsKLQl9CisgICAgaWYgKHBfdDEtPmZsYWdzKSB7CisgICAgICAgIG9wal9hbGlnbmVkX2ZyZWUocF90MS0+ZmxhZ3MpOworICAgICAgICBwX3QxLT5mbGFncyA9IDAwOworICAgIH0KIAotCW9wal9mcmVlKHBfdDEpOworICAgIG9wal9mcmVlKHBfdDEtPmNibGtkYXRhYnVmZmVyKTsKKworICAgIG9wal9mcmVlKHBfdDEpOwogfQogCi1PUEpfQk9PTCBvcGpfdDFfZGVjb2RlX2NibGtzKCAgIG9wal90MV90KiB0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QqIHRpbGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2NwX3QqIHRjY3AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit0eXBlZGVmIHN0cnVjdCB7CisgICAgT1BKX0JPT0wgd2hvbGVfdGlsZV9kZWNvZGluZzsKKyAgICBPUEpfVUlOVDMyIHJlc25vOworICAgIG9wal90Y2RfY2Jsa19kZWNfdCogY2JsazsKKyAgICBvcGpfdGNkX2JhbmRfdCogYmFuZDsKKyAgICBvcGpfdGNkX3RpbGVjb21wX3QqIHRpbGVjOworICAgIG9wal90Y2NwX3QqIHRjY3A7CisgICAgT1BKX0JPT0wgbXVzdHVzZV9jYmxrZGF0YWJ1ZmZlcjsKKyAgICB2b2xhdGlsZSBPUEpfQk9PTCogcHJldDsKKyAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcjsKKyAgICBvcGpfbXV0ZXhfdCogcF9tYW5hZ2VyX211dGV4OworICAgIE9QSl9CT09MIGNoZWNrX3B0ZXJtOworfSBvcGpfdDFfY2Jsa19kZWNvZGVfcHJvY2Vzc2luZ19qb2JfdDsKKworc3RhdGljIHZvaWQgb3BqX3QxX2Rlc3Ryb3lfd3JhcHBlcih2b2lkKiB0MSkKIHsKLQlPUEpfVUlOVDMyIHJlc25vLCBiYW5kbm8sIHByZWNubywgY2Jsa25vOwotCU9QSl9VSU5UMzIgdGlsZV93ID0gKE9QSl9VSU5UMzIpKHRpbGVjLT54MSAtIHRpbGVjLT54MCk7CisgICAgb3BqX3QxX2Rlc3Ryb3koKG9wal90MV90KikgdDEpOworfQogCi0JZm9yIChyZXNubyA9IDA7IHJlc25vIDwgdGlsZWMtPm1pbmltdW1fbnVtX3Jlc29sdXRpb25zOyArK3Jlc25vKSB7Ci0JCW9wal90Y2RfcmVzb2x1dGlvbl90KiByZXMgPSAmdGlsZWMtPnJlc29sdXRpb25zW3Jlc25vXTsKK3N0YXRpYyB2b2lkIG9wal90MV9jbGJsX2RlY29kZV9wcm9jZXNzb3Iodm9pZCogdXNlcl9kYXRhLCBvcGpfdGxzX3QqIHRscykKK3sKKyAgICBvcGpfdGNkX2NibGtfZGVjX3QqIGNibGs7CisgICAgb3BqX3RjZF9iYW5kX3QqIGJhbmQ7CisgICAgb3BqX3RjZF90aWxlY29tcF90KiB0aWxlYzsKKyAgICBvcGpfdGNjcF90KiB0Y2NwOworICAgIE9QSl9JTlQzMiogT1BKX1JFU1RSSUNUIGRhdGFwOworICAgIE9QSl9VSU5UMzIgY2Jsa193LCBjYmxrX2g7CisgICAgT1BKX0lOVDMyIHgsIHk7CisgICAgT1BKX1VJTlQzMiBpLCBqOworICAgIG9wal90MV9jYmxrX2RlY29kZV9wcm9jZXNzaW5nX2pvYl90KiBqb2I7CisgICAgb3BqX3QxX3QqIHQxOworICAgIE9QSl9VSU5UMzIgcmVzbm87CisgICAgT1BKX1VJTlQzMiB0aWxlX3c7CiAKLQkJZm9yIChiYW5kbm8gPSAwOyBiYW5kbm8gPCByZXMtPm51bWJhbmRzOyArK2JhbmRubykgewotCQkJb3BqX3RjZF9iYW5kX3QqIHJlc3RyaWN0IGJhbmQgPSAmcmVzLT5iYW5kc1tiYW5kbm9dOworICAgIGpvYiA9IChvcGpfdDFfY2Jsa19kZWNvZGVfcHJvY2Vzc2luZ19qb2JfdCopIHVzZXJfZGF0YTsKIAotCQkJZm9yIChwcmVjbm8gPSAwOyBwcmVjbm8gPCByZXMtPnB3ICogcmVzLT5waDsgKytwcmVjbm8pIHsKLQkJCQlvcGpfdGNkX3ByZWNpbmN0X3QqIHByZWNpbmN0ID0gJmJhbmQtPnByZWNpbmN0c1twcmVjbm9dOworICAgIGNibGsgPSBqb2ItPmNibGs7CiAKLQkJCQlmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IHByZWNpbmN0LT5jdyAqIHByZWNpbmN0LT5jaDsgKytjYmxrbm8pIHsKLQkJCQkJb3BqX3RjZF9jYmxrX2RlY190KiBjYmxrID0gJnByZWNpbmN0LT5jYmxrcy5kZWNbY2Jsa25vXTsKLQkJCQkJT1BKX0lOVDMyKiByZXN0cmljdCBkYXRhcDsKLQkJCQkJT1BKX1VJTlQzMiBjYmxrX3csIGNibGtfaDsKLQkJCQkJT1BKX0lOVDMyIHgsIHk7Ci0JCQkJCU9QSl9VSU5UMzIgaSwgajsKKyAgICBpZiAoIWpvYi0+d2hvbGVfdGlsZV9kZWNvZGluZykgeworICAgICAgICBjYmxrX3cgPSAoT1BKX1VJTlQzMikoY2Jsay0+eDEgLSBjYmxrLT54MCk7CisgICAgICAgIGNibGtfaCA9IChPUEpfVUlOVDMyKShjYmxrLT55MSAtIGNibGstPnkwKTsKIAotICAgICAgICAgICAgICAgICAgICBpZiAoT1BKX0ZBTFNFID09IG9wal90MV9kZWNvZGVfY2JsaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQtPmJhbmRubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9VSU5UMzIpdGNjcC0+cm9pc2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPmNibGtzdHkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgY2Jsay0+ZGVjb2RlZF9kYXRhID0gKE9QSl9JTlQzMiopb3BqX2FsaWduZWRfbWFsbG9jKGNibGtfdyAqIGNibGtfaCAqIHNpemVvZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMikpOworICAgICAgICBpZiAoY2Jsay0+ZGVjb2RlZF9kYXRhID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChqb2ItPnBfbWFuYWdlcl9tdXRleCkgeworICAgICAgICAgICAgICAgIG9wal9tdXRleF9sb2NrKGpvYi0+cF9tYW5hZ2VyX211dGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wal9ldmVudF9tc2coam9iLT5wX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBhbGxvY2F0ZSBjYmxrLT5kZWNvZGVkX2RhdGFcbiIpOworICAgICAgICAgICAgaWYgKGpvYi0+cF9tYW5hZ2VyX211dGV4KSB7CisgICAgICAgICAgICAgICAgb3BqX211dGV4X3VubG9jayhqb2ItPnBfbWFuYWdlcl9tdXRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqKGpvYi0+cHJldCkgPSBPUEpfRkFMU0U7CisgICAgICAgICAgICBvcGpfZnJlZShqb2IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8qIFplcm8taW5pdCByZXF1aXJlZCAqLworICAgICAgICBtZW1zZXQoY2Jsay0+ZGVjb2RlZF9kYXRhLCAwLCBjYmxrX3cgKiBjYmxrX2ggKiBzaXplb2YoT1BKX0lOVDMyKSk7CisgICAgfSBlbHNlIGlmIChjYmxrLT5kZWNvZGVkX2RhdGEpIHsKKyAgICAgICAgLyogTm90IHN1cmUgaWYgdGhhdCBjb2RlIHBhdGggY2FuIGhhcHBlbiwgYnV0IGJldHRlciBiZSAqLworICAgICAgICAvKiBzYWZlIHRoYW4gc29ycnkgKi8KKyAgICAgICAgb3BqX2FsaWduZWRfZnJlZShjYmxrLT5kZWNvZGVkX2RhdGEpOworICAgICAgICBjYmxrLT5kZWNvZGVkX2RhdGEgPSBOVUxMOworICAgIH0KKworICAgIHJlc25vID0gam9iLT5yZXNubzsKKyAgICBiYW5kID0gam9iLT5iYW5kOworICAgIHRpbGVjID0gam9iLT50aWxlYzsKKyAgICB0Y2NwID0gam9iLT50Y2NwOworICAgIHRpbGVfdyA9IChPUEpfVUlOVDMyKSh0aWxlYy0+cmVzb2x1dGlvbnNbdGlsZWMtPm1pbmltdW1fbnVtX3Jlc29sdXRpb25zIC0gMV0ueDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLQorICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlYy0+cmVzb2x1dGlvbnNbdGlsZWMtPm1pbmltdW1fbnVtX3Jlc29sdXRpb25zIC0gMV0ueDApOworCisgICAgaWYgKCEqKGpvYi0+cHJldCkpIHsKKyAgICAgICAgb3BqX2ZyZWUoam9iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHQxID0gKG9wal90MV90Kikgb3BqX3Rsc19nZXQodGxzLCBPUEpfVExTX0tFWV9UMSk7CisgICAgaWYgKHQxID09IE5VTEwpIHsKKyAgICAgICAgdDEgPSBvcGpfdDFfY3JlYXRlKE9QSl9GQUxTRSk7CisgICAgICAgIG9wal90bHNfc2V0KHRscywgT1BKX1RMU19LRVlfVDEsIHQxLCBvcGpfdDFfZGVzdHJveV93cmFwcGVyKTsKKyAgICB9CisgICAgdDEtPm11c3R1c2VfY2Jsa2RhdGFidWZmZXIgPSBqb2ItPm11c3R1c2VfY2Jsa2RhdGFidWZmZXI7CisKKyAgICBpZiAoT1BKX0ZBTFNFID09IG9wal90MV9kZWNvZGVfY2JsaygKKyAgICAgICAgICAgICAgICB0MSwKKyAgICAgICAgICAgICAgICBjYmxrLAorICAgICAgICAgICAgICAgIGJhbmQtPmJhbmRubywKKyAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMil0Y2NwLT5yb2lzaGlmdCwKKyAgICAgICAgICAgICAgICB0Y2NwLT5jYmxrc3R5LAorICAgICAgICAgICAgICAgIGpvYi0+cF9tYW5hZ2VyLAorICAgICAgICAgICAgICAgIGpvYi0+cF9tYW5hZ2VyX211dGV4LAorICAgICAgICAgICAgICAgIGpvYi0+Y2hlY2tfcHRlcm0pKSB7CisgICAgICAgICooam9iLT5wcmV0KSA9IE9QSl9GQUxTRTsKKyAgICAgICAgb3BqX2ZyZWUoam9iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHggPSBjYmxrLT54MCAtIGJhbmQtPngwOworICAgIHkgPSBjYmxrLT55MCAtIGJhbmQtPnkwOworICAgIGlmIChiYW5kLT5iYW5kbm8gJiAxKSB7CisgICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiBwcmVzID0gJnRpbGVjLT5yZXNvbHV0aW9uc1tyZXNubyAtIDFdOworICAgICAgICB4ICs9IHByZXMtPngxIC0gcHJlcy0+eDA7CisgICAgfQorICAgIGlmIChiYW5kLT5iYW5kbm8gJiAyKSB7CisgICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiBwcmVzID0gJnRpbGVjLT5yZXNvbHV0aW9uc1tyZXNubyAtIDFdOworICAgICAgICB5ICs9IHByZXMtPnkxIC0gcHJlcy0+eTA7CisgICAgfQorCisgICAgZGF0YXAgPSBjYmxrLT5kZWNvZGVkX2RhdGEgPyBjYmxrLT5kZWNvZGVkX2RhdGEgOiB0MS0+ZGF0YTsKKyAgICBjYmxrX3cgPSB0MS0+dzsKKyAgICBjYmxrX2ggPSB0MS0+aDsKKworICAgIGlmICh0Y2NwLT5yb2lzaGlmdCkgeworICAgICAgICBpZiAodGNjcC0+cm9pc2hpZnQgPj0gMzEpIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjYmxrX2g7ICsraikgeworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjYmxrX3c7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBkYXRhcFsoaiAqIGNibGtfdykgKyBpXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT1BKX0lOVDMyIHRocmVzaCA9IDEgPDwgdGNjcC0+cm9pc2hpZnQ7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2Jsa19oOyArK2opIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2Jsa193OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHZhbCA9IGRhdGFwWyhqICogY2Jsa193KSArIGldOworICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgbWFnID0gYWJzKHZhbCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYWcgPj0gdGhyZXNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYWcgPj49IHRjY3AtPnJvaXNoaWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXBbKGogKiBjYmxrX3cpICsgaV0gPSB2YWwgPCAwID8gLW1hZyA6IG1hZzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEJvdGggY2FuIGJlIG5vbiBOVUxMIGlmIGZvciBleGFtcGxlIGRlY29kaW5nIGEgZnVsbCB0aWxlIGFuZCB0aGVuICovCisgICAgLyogcGFydGlhbGx5IGEgdGlsZS4gSW4gd2hpY2ggY2FzZSBwYXJ0aWFsIGRlY29kaW5nIHNob3VsZCBiZSB0aGUgKi8KKyAgICAvKiBwcmlvcml0eSAqLworICAgIGFzc2VydCgoY2Jsay0+ZGVjb2RlZF9kYXRhICE9IE5VTEwpIHx8ICh0aWxlYy0+ZGF0YSAhPSBOVUxMKSk7CisKKyAgICBpZiAoY2Jsay0+ZGVjb2RlZF9kYXRhKSB7CisgICAgICAgIE9QSl9VSU5UMzIgY2Jsa19zaXplID0gY2Jsa193ICogY2Jsa19oOworICAgICAgICBpZiAodGNjcC0+cW1mYmlkID09IDEpIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjYmxrX3NpemU7ICsraSkgeworICAgICAgICAgICAgICAgIGRhdGFwW2ldIC89IDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAvKiBpZiAodGNjcC0+cW1mYmlkID09IDApICovCisgICAgICAgICAgICBpID0gMDsKKyNpZmRlZiBfX1NTRTJfXworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOCB4bW1fc3RlcHNpemUgPSBfbW1fc2V0MV9wcyhiYW5kLT5zdGVwc2l6ZSk7CisgICAgICAgICAgICAgICAgZm9yICg7IGkgPCAoY2Jsa19zaXplICYgfjE1VSk7IGkgKz0gMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgX19tMTI4IHhtbTBfZGF0YSA9IF9tbV9jdnRlcGkzMl9wcyhfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSAqIGNvbnN0KSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXAgKyAwKSkpOworICAgICAgICAgICAgICAgICAgICBfX20xMjggeG1tMV9kYXRhID0gX21tX2N2dGVwaTMyX3BzKF9tbV9sb2FkX3NpMTI4KChfX20xMjhpICogY29uc3QpKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhcCArIDQpKSk7CisgICAgICAgICAgICAgICAgICAgIF9fbTEyOCB4bW0yX2RhdGEgPSBfbW1fY3Z0ZXBpMzJfcHMoX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkgKiBjb25zdCkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFwICsgOCkpKTsKKyAgICAgICAgICAgICAgICAgICAgX19tMTI4IHhtbTNfZGF0YSA9IF9tbV9jdnRlcGkzMl9wcyhfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSAqIGNvbnN0KSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXAgKyAxMikpKTsKKyAgICAgICAgICAgICAgICAgICAgX21tX3N0b3JlX3BzKChmbG9hdCopKGRhdGFwICsgIDApLCBfbW1fbXVsX3BzKHhtbTBfZGF0YSwgeG1tX3N0ZXBzaXplKSk7CisgICAgICAgICAgICAgICAgICAgIF9tbV9zdG9yZV9wcygoZmxvYXQqKShkYXRhcCArICA0KSwgX21tX211bF9wcyh4bW0xX2RhdGEsIHhtbV9zdGVwc2l6ZSkpOworICAgICAgICAgICAgICAgICAgICBfbW1fc3RvcmVfcHMoKGZsb2F0KikoZGF0YXAgKyAgOCksIF9tbV9tdWxfcHMoeG1tMl9kYXRhLCB4bW1fc3RlcHNpemUpKTsKKyAgICAgICAgICAgICAgICAgICAgX21tX3N0b3JlX3BzKChmbG9hdCopKGRhdGFwICsgMTIpLCBfbW1fbXVsX3BzKHhtbTNfZGF0YSwgeG1tX3N0ZXBzaXplKSk7CisgICAgICAgICAgICAgICAgICAgIGRhdGFwICs9IDE2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgZm9yICg7IGkgPCBjYmxrX3NpemU7ICsraSkgeworICAgICAgICAgICAgICAgIE9QSl9GTE9BVDMyIHRtcCA9ICgoT1BKX0ZMT0FUMzIpKCpkYXRhcCkpICogYmFuZC0+c3RlcHNpemU7CisgICAgICAgICAgICAgICAgbWVtY3B5KGRhdGFwLCAmdG1wLCBzaXplb2YodG1wKSk7CisgICAgICAgICAgICAgICAgZGF0YXArKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAodGNjcC0+cW1mYmlkID09IDEpIHsKKyAgICAgICAgT1BKX0lOVDMyKiBPUEpfUkVTVFJJQ1QgdGlsZWRwID0gJnRpbGVjLT5kYXRhWyhPUEpfU0laRV9UKXkgKiB0aWxlX3cgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfU0laRV9UKXhdOworICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2Jsa19oOyArK2opIHsKKyAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgZm9yICg7IGkgPCAoY2Jsa193ICYgfihPUEpfVUlOVDMyKTNVKTsgaSArPSA0VSkgeworICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB0bXAwID0gZGF0YXBbKGogKiBjYmxrX3cpICsgaSArIDBVXTsKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgdG1wMSA9IGRhdGFwWyhqICogY2Jsa193KSArIGkgKyAxVV07CisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHRtcDIgPSBkYXRhcFsoaiAqIGNibGtfdykgKyBpICsgMlVdOworICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB0bXAzID0gZGF0YXBbKGogKiBjYmxrX3cpICsgaSArIDNVXTsKKyAgICAgICAgICAgICAgICAoKE9QSl9JTlQzMiopdGlsZWRwKVsoaiAqIChPUEpfU0laRV9UKXRpbGVfdykgKyBpICsgMFVdID0gdG1wMCAvIDI7CisgICAgICAgICAgICAgICAgKChPUEpfSU5UMzIqKXRpbGVkcClbKGogKiAoT1BKX1NJWkVfVCl0aWxlX3cpICsgaSArIDFVXSA9IHRtcDEgLyAyOworICAgICAgICAgICAgICAgICgoT1BKX0lOVDMyKil0aWxlZHApWyhqICogKE9QSl9TSVpFX1QpdGlsZV93KSArIGkgKyAyVV0gPSB0bXAyIC8gMjsKKyAgICAgICAgICAgICAgICAoKE9QSl9JTlQzMiopdGlsZWRwKVsoaiAqIChPUEpfU0laRV9UKXRpbGVfdykgKyBpICsgM1VdID0gdG1wMyAvIDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKDsgaSA8IGNibGtfdzsgKytpKSB7CisgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHRtcCA9IGRhdGFwWyhqICogY2Jsa193KSArIGldOworICAgICAgICAgICAgICAgICgoT1BKX0lOVDMyKil0aWxlZHApWyhqICogKE9QSl9TSVpFX1QpdGlsZV93KSArIGldID0gdG1wIC8gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7ICAgICAgICAvKiBpZiAodGNjcC0+cW1mYmlkID09IDApICovCisgICAgICAgIE9QSl9GTE9BVDMyKiBPUEpfUkVTVFJJQ1QgdGlsZWRwID0gKE9QSl9GTE9BVDMyKikgJnRpbGVjLT5kYXRhWyhPUEpfU0laRV9UKXkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV93ICsgKE9QSl9TSVpFX1QpeF07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBjYmxrX2g7ICsraikgeworICAgICAgICAgICAgT1BKX0ZMT0FUMzIqIE9QSl9SRVNUUklDVCB0aWxlZHAyID0gdGlsZWRwOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNibGtfdzsgKytpKSB7CisgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgdG1wID0gKE9QSl9GTE9BVDMyKSAqIGRhdGFwICogYmFuZC0+c3RlcHNpemU7CisgICAgICAgICAgICAgICAgKnRpbGVkcDIgPSB0bXA7CisgICAgICAgICAgICAgICAgZGF0YXArKzsKKyAgICAgICAgICAgICAgICB0aWxlZHAyKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aWxlZHAgKz0gdGlsZV93OworICAgICAgICB9CisgICAgfQorCisgICAgb3BqX2ZyZWUoam9iKTsKK30KKworCit2b2lkIG9wal90MV9kZWNvZGVfY2Jsa3Mob3BqX3RjZF90KiB0Y2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgT1BKX0JPT0wqIHByZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlY29tcF90KiB0aWxlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNjcF90KiB0Y2NwLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9tdXRleF90KiBwX21hbmFnZXJfbXV0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JPT0wgY2hlY2tfcHRlcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICBvcGpfdGhyZWFkX3Bvb2xfdCogdHAgPSB0Y2QtPnRocmVhZF9wb29sOworICAgIE9QSl9VSU5UMzIgcmVzbm8sIGJhbmRubywgcHJlY25vLCBjYmxrbm87CisKKyNpZmRlZiBERUJVR19WRVJCT1NFCisgICAgT1BKX1VJTlQzMiBjb2RlYmxvY2tzX2RlY29kZWQgPSAwOworICAgIHByaW50ZigiRW50ZXIgb3BqX3QxX2RlY29kZV9jYmxrcygpXG4iKTsKKyNlbmRpZgorCisgICAgZm9yIChyZXNubyA9IDA7IHJlc25vIDwgdGlsZWMtPm1pbmltdW1fbnVtX3Jlc29sdXRpb25zOyArK3Jlc25vKSB7CisgICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiByZXMgPSAmdGlsZWMtPnJlc29sdXRpb25zW3Jlc25vXTsKKworICAgICAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IHJlcy0+bnVtYmFuZHM7ICsrYmFuZG5vKSB7CisgICAgICAgICAgICBvcGpfdGNkX2JhbmRfdCogT1BKX1JFU1RSSUNUIGJhbmQgPSAmcmVzLT5iYW5kc1tiYW5kbm9dOworCisgICAgICAgICAgICBmb3IgKHByZWNubyA9IDA7IHByZWNubyA8IHJlcy0+cHcgKiByZXMtPnBoOyArK3ByZWNubykgeworICAgICAgICAgICAgICAgIG9wal90Y2RfcHJlY2luY3RfdCogcHJlY2luY3QgPSAmYmFuZC0+cHJlY2luY3RzW3ByZWNub107CisKKyAgICAgICAgICAgICAgICBpZiAoIW9wal90Y2RfaXNfc3ViYmFuZF9hcmVhX29mX2ludGVyZXN0KHRjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVjLT5jb21wbm8sCisgICAgICAgICAgICAgICAgICAgICAgICByZXNubywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQtPmJhbmRubywKKyAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfVUlOVDMyKXByZWNpbmN0LT54MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfVUlOVDMyKXByZWNpbmN0LT55MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfVUlOVDMyKXByZWNpbmN0LT54MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfVUlOVDMyKXByZWNpbmN0LT55MSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBwcmVjaW5jdC0+Y3cgKiBwcmVjaW5jdC0+Y2g7ICsrY2Jsa25vKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX2NibGtfZGVjX3QqIGNibGsgPSAmcHJlY2luY3QtPmNibGtzLmRlY1tjYmxrbm9dOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNibGstPmRlY29kZWRfZGF0YSkgeworI2lmZGVmIERFQlVHX1ZFUkJPU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkRpc2NhcmRpbmcgY29kZWJsb2NrICVkLCVkIGF0IHJlc25vPSVkLCBiYW5kbm89JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPngwLCBjYmxrLT55MCwgcmVzbm8sIGJhbmRubyk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfYWxpZ25lZF9mcmVlKGNibGstPmRlY29kZWRfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+ZGVjb2RlZF9kYXRhID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IHByZWNpbmN0LT5jdyAqIHByZWNpbmN0LT5jaDsgKytjYmxrbm8pIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9jYmxrX2RlY190KiBjYmxrID0gJnByZWNpbmN0LT5jYmxrcy5kZWNbY2Jsa25vXTsKKyAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2NibGtfZGVjb2RlX3Byb2Nlc3Npbmdfam9iX3QqIGpvYjsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIW9wal90Y2RfaXNfc3ViYmFuZF9hcmVhX29mX2ludGVyZXN0KHRjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlYy0+Y29tcG5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQtPmJhbmRubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMiljYmxrLT54MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMiljYmxrLT55MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMiljYmxrLT54MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMiljYmxrLT55MSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYmxrLT5kZWNvZGVkX2RhdGEpIHsKKyNpZmRlZiBERUJVR19WRVJCT1NFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJEaXNjYXJkaW5nIGNvZGVibG9jayAlZCwlZCBhdCByZXNubz0lZCwgYmFuZG5vPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT54MCwgY2Jsay0+eTAsIHJlc25vLCBiYW5kbm8pOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2FsaWduZWRfZnJlZShjYmxrLT5kZWNvZGVkX2RhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPmRlY29kZWRfZGF0YSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0JCQkJCXggPSBjYmxrLT54MCAtIGJhbmQtPngwOwotCQkJCQl5ID0gY2Jsay0+eTAgLSBiYW5kLT55MDsKLQkJCQkJaWYgKGJhbmQtPmJhbmRubyAmIDEpIHsKLQkJCQkJCW9wal90Y2RfcmVzb2x1dGlvbl90KiBwcmVzID0gJnRpbGVjLT5yZXNvbHV0aW9uc1tyZXNubyAtIDFdOwotCQkJCQkJeCArPSBwcmVzLT54MSAtIHByZXMtPngwOwotCQkJCQl9Ci0JCQkJCWlmIChiYW5kLT5iYW5kbm8gJiAyKSB7Ci0JCQkJCQlvcGpfdGNkX3Jlc29sdXRpb25fdCogcHJlcyA9ICZ0aWxlYy0+cmVzb2x1dGlvbnNbcmVzbm8gLSAxXTsKLQkJCQkJCXkgKz0gcHJlcy0+eTEgLSBwcmVzLT55MDsKLQkJCQkJfQorICAgICAgICAgICAgICAgICAgICBpZiAoIXRjZC0+d2hvbGVfdGlsZV9kZWNvZGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjYmxrX3cgPSAoT1BKX1VJTlQzMikoY2Jsay0+eDEgLSBjYmxrLT54MCk7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNibGtfaCA9IChPUEpfVUlOVDMyKShjYmxrLT55MSAtIGNibGstPnkwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYmxrLT5kZWNvZGVkX2RhdGEgIT0gTlVMTCkgeworI2lmZGVmIERFQlVHX1ZFUkJPU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlJldXNpbmcgY29kZWJsb2NrICVkLCVkIGF0IHJlc25vPSVkLCBiYW5kbm89JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPngwLCBjYmxrLT55MCwgcmVzbm8sIGJhbmRubyk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYmxrX3cgPT0gMCB8fCBjYmxrX2ggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorI2lmZGVmIERFQlVHX1ZFUkJPU0UKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRGVjb2RpbmcgY29kZWJsb2NrICVkLCVkIGF0IHJlc25vPSVkLCBiYW5kbm89JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+eDAsIGNibGstPnkwLCByZXNubywgYmFuZG5vKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCQkJZGF0YXA9dDEtPmRhdGE7Ci0JCQkJCWNibGtfdyA9IHQxLT53OwotCQkJCQljYmxrX2ggPSB0MS0+aDsKKyAgICAgICAgICAgICAgICAgICAgam9iID0gKG9wal90MV9jYmxrX2RlY29kZV9wcm9jZXNzaW5nX2pvYl90Kikgb3BqX2NhbGxvYygxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvcGpfdDFfY2Jsa19kZWNvZGVfcHJvY2Vzc2luZ19qb2JfdCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWpvYikgeworICAgICAgICAgICAgICAgICAgICAgICAgKnByZXQgPSBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgam9iLT53aG9sZV90aWxlX2RlY29kaW5nID0gdGNkLT53aG9sZV90aWxlX2RlY29kaW5nOworICAgICAgICAgICAgICAgICAgICBqb2ItPnJlc25vID0gcmVzbm87CisgICAgICAgICAgICAgICAgICAgIGpvYi0+Y2JsayA9IGNibGs7CisgICAgICAgICAgICAgICAgICAgIGpvYi0+YmFuZCA9IGJhbmQ7CisgICAgICAgICAgICAgICAgICAgIGpvYi0+dGlsZWMgPSB0aWxlYzsKKyAgICAgICAgICAgICAgICAgICAgam9iLT50Y2NwID0gdGNjcDsKKyAgICAgICAgICAgICAgICAgICAgam9iLT5wcmV0ID0gcHJldDsKKyAgICAgICAgICAgICAgICAgICAgam9iLT5wX21hbmFnZXJfbXV0ZXggPSBwX21hbmFnZXJfbXV0ZXg7CisgICAgICAgICAgICAgICAgICAgIGpvYi0+cF9tYW5hZ2VyID0gcF9tYW5hZ2VyOworICAgICAgICAgICAgICAgICAgICBqb2ItPmNoZWNrX3B0ZXJtID0gY2hlY2tfcHRlcm07CisgICAgICAgICAgICAgICAgICAgIGpvYi0+bXVzdHVzZV9jYmxrZGF0YWJ1ZmZlciA9IG9wal90aHJlYWRfcG9vbF9nZXRfdGhyZWFkX2NvdW50KHRwKSA+IDE7CisgICAgICAgICAgICAgICAgICAgIG9wal90aHJlYWRfcG9vbF9zdWJtaXRfam9iKHRwLCBvcGpfdDFfY2xibF9kZWNvZGVfcHJvY2Vzc29yLCBqb2IpOworI2lmZGVmIERFQlVHX1ZFUkJPU0UKKyAgICAgICAgICAgICAgICAgICAgY29kZWJsb2Nrc19kZWNvZGVkICsrOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGlmICghKCpwcmV0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAvKiBjYmxrbm8gKi8KKyAgICAgICAgICAgIH0gLyogcHJlY25vICovCisgICAgICAgIH0gLyogYmFuZG5vICovCisgICAgfSAvKiByZXNubyAqLwogCi0JCQkJCWlmICh0Y2NwLT5yb2lzaGlmdCkgewotCQkJCQkJT1BKX0lOVDMyIHRocmVzaCA9IDEgPDwgdGNjcC0+cm9pc2hpZnQ7Ci0JCQkJCQlmb3IgKGogPSAwOyBqIDwgY2Jsa19oOyArK2opIHsKLQkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgY2Jsa193OyArK2kpIHsKLQkJCQkJCQkJT1BKX0lOVDMyIHZhbCA9IGRhdGFwWyhqICogY2Jsa193KSArIGldOwotCQkJCQkJCQlPUEpfSU5UMzIgbWFnID0gYWJzKHZhbCk7Ci0JCQkJCQkJCWlmIChtYWcgPj0gdGhyZXNoKSB7Ci0JCQkJCQkJCQltYWcgPj49IHRjY3AtPnJvaXNoaWZ0OwotCQkJCQkJCQkJZGF0YXBbKGogKiBjYmxrX3cpICsgaV0gPSB2YWwgPCAwID8gLW1hZyA6IG1hZzsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAodGNjcC0+cW1mYmlkID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiogcmVzdHJpY3QgdGlsZWRwID0gJnRpbGVjLT5kYXRhWyhPUEpfVUlOVDMyKXkgKiB0aWxlX3cgKyAoT1BKX1VJTlQzMil4XTsKLQkJCQkJCWZvciAoaiA9IDA7IGogPCBjYmxrX2g7ICsraikgewotCQkJCQkJCWZvciAoaSA9IDA7IGkgPCBjYmxrX3c7ICsraSkgewotCQkJCQkJCQlPUEpfSU5UMzIgdG1wID0gZGF0YXBbKGogKiBjYmxrX3cpICsgaV07Ci0JCQkJCQkJCSgoT1BKX0lOVDMyKil0aWxlZHApWyhqICogdGlsZV93KSArIGldID0gdG1wLzI7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewkJLyogaWYgKHRjY3AtPnFtZmJpZCA9PSAwKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIqIHJlc3RyaWN0IHRpbGVkcCA9IChPUEpfRkxPQVQzMiopICZ0aWxlYy0+ZGF0YVsoT1BKX1VJTlQzMil5ICogdGlsZV93ICsgKE9QSl9VSU5UMzIpeF07Ci0JCQkJCQlmb3IgKGogPSAwOyBqIDwgY2Jsa19oOyArK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiogcmVzdHJpY3QgdGlsZWRwMiA9IHRpbGVkcDsKLQkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgY2Jsa193OyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgdG1wID0gKE9QSl9GTE9BVDMyKSpkYXRhcCAqIGJhbmQtPnN0ZXBzaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqdGlsZWRwMiA9IHRtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZWRwMisrOwotCQkJCQkJCX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlZHAgKz0gdGlsZV93OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSAvKiBjYmxrbm8gKi8KLQkJCX0gLyogcHJlY25vICovCi0JCX0gLyogYmFuZG5vICovCi0JfSAvKiByZXNubyAqLwotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisjaWZkZWYgREVCVUdfVkVSQk9TRQorICAgIHByaW50ZigiTGVhdmUgb3BqX3QxX2RlY29kZV9jYmxrcygpLiBOdW1iZXIgZGVjb2RlZDogJWRcbiIsIGNvZGVibG9ja3NfZGVjb2RlZCk7CisjZW5kaWYKKyAgICByZXR1cm47CiB9CiAKIAogc3RhdGljIE9QSl9CT09MIG9wal90MV9kZWNvZGVfY2JsayhvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9jYmxrX2RlY190KiBjYmxrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgb3JpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcm9pc2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjYmxrc3R5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX2NibGtfZGVjX3QqIGNibGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgb3JpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHJvaXNoaWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNibGtzdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfbXV0ZXhfdCogcF9tYW5hZ2VyX211dGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQk9PTCBjaGVja19wdGVybSkKIHsKLQlvcGpfcmF3X3QgKnJhdyA9IHQxLT5yYXc7CS8qIFJBVyBjb21wb25lbnQgKi8KLQlvcGpfbXFjX3QgKm1xYyA9IHQxLT5tcWM7CS8qIE1RQyBjb21wb25lbnQgKi8KKyAgICBvcGpfbXFjX3QgKm1xYyA9ICYodDEtPm1xYyk7ICAgLyogTVFDIGNvbXBvbmVudCAqLwogCi0JT1BKX0lOVDMyIGJwbm9fcGx1c19vbmU7Ci0JT1BKX1VJTlQzMiBwYXNzdHlwZTsKLQlPUEpfVUlOVDMyIHNlZ25vLCBwYXNzbm87Ci0JT1BKX0JZVEUgdHlwZSA9IFQxX1RZUEVfTVE7IC8qIEJZUEFTUyBtb2RlICovCisgICAgT1BKX0lOVDMyIGJwbm9fcGx1c19vbmU7CisgICAgT1BKX1VJTlQzMiBwYXNzdHlwZTsKKyAgICBPUEpfVUlOVDMyIHNlZ25vLCBwYXNzbm87CisgICAgT1BKX0JZVEUqIGNibGtkYXRhID0gTlVMTDsKKyAgICBPUEpfVUlOVDMyIGNibGtkYXRhaW5kZXggPSAwOworICAgIE9QSl9CWVRFIHR5cGUgPSBUMV9UWVBFX01ROyAvKiBCWVBBU1MgbW9kZSAqLworICAgIE9QSl9JTlQzMiogb3JpZ2luYWxfdDFfZGF0YSA9IE5VTEw7CiAKLQlpZighb3BqX3QxX2FsbG9jYXRlX2J1ZmZlcnMoCi0JCQkJdDEsCi0JCQkJKE9QSl9VSU5UMzIpKGNibGstPngxIC0gY2Jsay0+eDApLAotCQkJCShPUEpfVUlOVDMyKShjYmxrLT55MSAtIGNibGstPnkwKSkpCi0JewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KKyAgICBtcWMtPmx1dF9jdHhub196Y19vcmllbnQgPSBsdXRfY3R4bm9femMgKyAob3JpZW50IDw8IDkpOwogCi0JYnBub19wbHVzX29uZSA9IChPUEpfSU5UMzIpKHJvaXNoaWZ0ICsgY2Jsay0+bnVtYnBzKTsKLQlwYXNzdHlwZSA9IDI7CisgICAgaWYgKCFvcGpfdDFfYWxsb2NhdGVfYnVmZmVycygKKyAgICAgICAgICAgICAgICB0MSwKKyAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMikoY2Jsay0+eDEgLSBjYmxrLT54MCksCisgICAgICAgICAgICAgICAgKE9QSl9VSU5UMzIpKGNibGstPnkxIC0gY2Jsay0+eTApKSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotCW9wal9tcWNfcmVzZXRzdGF0ZXMobXFjKTsKLQlvcGpfbXFjX3NldHN0YXRlKG1xYywgVDFfQ1RYTk9fVU5JLCAwLCA0Nik7Ci0Jb3BqX21xY19zZXRzdGF0ZShtcWMsIFQxX0NUWE5PX0FHRywgMCwgMyk7Ci0Jb3BqX21xY19zZXRzdGF0ZShtcWMsIFQxX0NUWE5PX1pDLCAwLCA0KTsKKyAgICBicG5vX3BsdXNfb25lID0gKE9QSl9JTlQzMikocm9pc2hpZnQgKyBjYmxrLT5udW1icHMpOworICAgIGlmIChicG5vX3BsdXNfb25lID49IDMxKSB7CisgICAgICAgIGlmIChwX21hbmFnZXJfbXV0ZXgpIHsKKyAgICAgICAgICAgIG9wal9tdXRleF9sb2NrKHBfbWFuYWdlcl9tdXRleCk7CisgICAgICAgIH0KKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICJvcGpfdDFfZGVjb2RlX2NibGsoKTogdW5zdXBwb3J0ZWQgYnBub19wbHVzX29uZSA9ICVkID49IDMxXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGJwbm9fcGx1c19vbmUpOworICAgICAgICBpZiAocF9tYW5hZ2VyX211dGV4KSB7CisgICAgICAgICAgICBvcGpfbXV0ZXhfdW5sb2NrKHBfbWFuYWdlcl9tdXRleCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgcGFzc3R5cGUgPSAyOwogCi0JZm9yIChzZWdubyA9IDA7IHNlZ25vIDwgY2Jsay0+cmVhbF9udW1fc2VnczsgKytzZWdubykgewotCQlvcGpfdGNkX3NlZ190ICpzZWcgPSAmY2Jsay0+c2Vnc1tzZWdub107CisgICAgb3BqX21xY19yZXNldHN0YXRlcyhtcWMpOworICAgIG9wal9tcWNfc2V0c3RhdGUobXFjLCBUMV9DVFhOT19VTkksIDAsIDQ2KTsKKyAgICBvcGpfbXFjX3NldHN0YXRlKG1xYywgVDFfQ1RYTk9fQUdHLCAwLCAzKTsKKyAgICBvcGpfbXFjX3NldHN0YXRlKG1xYywgVDFfQ1RYTk9fWkMsIDAsIDQpOwogCi0JCS8qIEJZUEFTUyBtb2RlICovCi0JCXR5cGUgPSAoKGJwbm9fcGx1c19vbmUgPD0gKChPUEpfSU5UMzIpIChjYmxrLT5udW1icHMpKSAtIDQpICYmIChwYXNzdHlwZSA8IDIpICYmIChjYmxrc3R5ICYgSjJLX0NDUF9DQkxLU1RZX0xBWlkpKSA/IFQxX1RZUEVfUkFXIDogVDFfVFlQRV9NUTsKLQkJLyogRklYTUU6IHNsdmlld2VyIGdldHMgaGVyZSB3aXRoIGEgbnVsbCBwb2ludGVyLiBXaHk/IFBhcnRpYWxseSBkb3dubG9hZGVkIGFuZC9vciBjb3JydXB0IHRleHR1cmVzPyAqLwotCQlpZihzZWctPmRhdGEgPT0gMDApewotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKHR5cGUgPT0gVDFfVFlQRV9SQVcpIHsKLQkJCW9wal9yYXdfaW5pdF9kZWMocmF3LCAoKnNlZy0+ZGF0YSkgKyBzZWctPmRhdGFpbmRleCwgc2VnLT5sZW4pOwotCQl9IGVsc2UgewotICAgICAgICAgICAgaWYgKE9QSl9GQUxTRSA9PSBvcGpfbXFjX2luaXRfZGVjKG1xYywgKCpzZWctPmRhdGEpICsgc2VnLT5kYXRhaW5kZXgsIHNlZy0+bGVuKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIC8qIEV2ZW4gaWYgd2UgaGF2ZSBhIHNpbmdsZSBjaHVuaywgaW4gbXVsdGktdGhyZWFkZWQgZGVjb2RpbmcgKi8KKyAgICAvKiB0aGUgaW5zZXJ0aW9uIG9mIG91ciBzeW50aGV0aWMgbWFya2VyIG1pZ2h0IHBvdGVudGlhbGx5IG92ZXJyaWRlICovCisgICAgLyogdmFsaWQgY29kZXN0cmVhbSBvZiBvdGhlciBjb2RlYmxvY2tzIGRlY29kZWQgaW4gcGFyYWxsZWwuICovCisgICAgaWYgKGNibGstPm51bWNodW5rcyA+IDEgfHwgdDEtPm11c3R1c2VfY2Jsa2RhdGFidWZmZXIpIHsKKyAgICAgICAgT1BKX1VJTlQzMiBpOworICAgICAgICBPUEpfVUlOVDMyIGNibGtfbGVuOworCisgICAgICAgIC8qIENvbXB1dGUgd2hvbGUgY29kZWJsb2NrIGxlbmd0aCBmcm9tIGNodW5rIGxlbmd0aHMgKi8KKyAgICAgICAgY2Jsa19sZW4gPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2Jsay0+bnVtY2h1bmtzOyBpKyspIHsKKyAgICAgICAgICAgIGNibGtfbGVuICs9IGNibGstPmNodW5rc1tpXS5sZW47CisgICAgICAgIH0KKworICAgICAgICAvKiBBbGxvY2F0ZSB0ZW1wb3JhcnkgbWVtb3J5IGlmIG5lZWRlZCAqLworICAgICAgICBpZiAoY2Jsa19sZW4gKyBPUEpfQ09NTU9OX0NCTEtfREFUQV9FWFRSQSA+IHQxLT5jYmxrZGF0YWJ1ZmZlcnNpemUpIHsKKyAgICAgICAgICAgIGNibGtkYXRhID0gKE9QSl9CWVRFKilvcGpfcmVhbGxvYyh0MS0+Y2Jsa2RhdGFidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jsa19sZW4gKyBPUEpfQ09NTU9OX0NCTEtfREFUQV9FWFRSQSk7CisgICAgICAgICAgICBpZiAoY2Jsa2RhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgICAgICAgICB9Ci0JCX0KKyAgICAgICAgICAgIHQxLT5jYmxrZGF0YWJ1ZmZlciA9IGNibGtkYXRhOworICAgICAgICAgICAgbWVtc2V0KHQxLT5jYmxrZGF0YWJ1ZmZlciArIGNibGtfbGVuLCAwLCBPUEpfQ09NTU9OX0NCTEtfREFUQV9FWFRSQSk7CisgICAgICAgICAgICB0MS0+Y2Jsa2RhdGFidWZmZXJzaXplID0gY2Jsa19sZW4gKyBPUEpfQ09NTU9OX0NCTEtfREFUQV9FWFRSQTsKKyAgICAgICAgfQogCi0JCWZvciAocGFzc25vID0gMDsgKHBhc3NubyA8IHNlZy0+cmVhbF9udW1fcGFzc2VzKSAmJiAoYnBub19wbHVzX29uZSA+PSAxKTsgKytwYXNzbm8pIHsKKyAgICAgICAgLyogQ29uY2F0ZW5hdGUgYWxsIGNodW5rcyAqLworICAgICAgICBjYmxrZGF0YSA9IHQxLT5jYmxrZGF0YWJ1ZmZlcjsKKyAgICAgICAgY2Jsa19sZW4gPSAwOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY2Jsay0+bnVtY2h1bmtzOyBpKyspIHsKKyAgICAgICAgICAgIG1lbWNweShjYmxrZGF0YSArIGNibGtfbGVuLCBjYmxrLT5jaHVua3NbaV0uZGF0YSwgY2Jsay0+Y2h1bmtzW2ldLmxlbik7CisgICAgICAgICAgICBjYmxrX2xlbiArPSBjYmxrLT5jaHVua3NbaV0ubGVuOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChjYmxrLT5udW1jaHVua3MgPT0gMSkgeworICAgICAgICBjYmxrZGF0YSA9IGNibGstPmNodW5rc1swXS5kYXRhOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIE5vdCBzdXJlIGlmIHRoYXQgY2FuIGhhcHBlbiBpbiBwcmFjdGljZSwgYnV0IGF2b2lkIENvdmVyaXR5IHRvICovCisgICAgICAgIC8qIHRoaW5rIHdlIHdpbGwgZGVyZWZlcmVuY2UgYSBudWxsIGNibGtkdGEgcG9pbnRlciAqLworICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgfQorCisgICAgLyogRm9yIHN1YnRpbGUgZGVjb2RpbmcsIGRpcmVjdGx5IGRlY29kZSBpbiB0aGUgZGVjb2RlZF9kYXRhIGJ1ZmZlciBvZiAqLworICAgIC8qIHRoZSBjb2RlLWJsb2NrLiBIYWNrIHQxLT5kYXRhIHRvIHBvaW50IHRvIGl0LCBhbmQgcmVzdG9yZSBpdCBsYXRlciAqLworICAgIGlmIChjYmxrLT5kZWNvZGVkX2RhdGEpIHsKKyAgICAgICAgb3JpZ2luYWxfdDFfZGF0YSA9IHQxLT5kYXRhOworICAgICAgICB0MS0+ZGF0YSA9IGNibGstPmRlY29kZWRfZGF0YTsKKyAgICB9CisKKyAgICBmb3IgKHNlZ25vID0gMDsgc2Vnbm8gPCBjYmxrLT5yZWFsX251bV9zZWdzOyArK3NlZ25vKSB7CisgICAgICAgIG9wal90Y2Rfc2VnX3QgKnNlZyA9ICZjYmxrLT5zZWdzW3NlZ25vXTsKKworICAgICAgICAvKiBCWVBBU1MgbW9kZSAqLworICAgICAgICB0eXBlID0gKChicG5vX3BsdXNfb25lIDw9ICgoT1BKX0lOVDMyKShjYmxrLT5udW1icHMpKSAtIDQpICYmIChwYXNzdHlwZSA8IDIpICYmCisgICAgICAgICAgICAgICAgKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfTEFaWSkpID8gVDFfVFlQRV9SQVcgOiBUMV9UWVBFX01ROworCisgICAgICAgIGlmICh0eXBlID09IFQxX1RZUEVfUkFXKSB7CisgICAgICAgICAgICBvcGpfbXFjX3Jhd19pbml0X2RlYyhtcWMsIGNibGtkYXRhICsgY2Jsa2RhdGFpbmRleCwgc2VnLT5sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQ09NTU9OX0NCTEtfREFUQV9FWFRSQSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcGpfbXFjX2luaXRfZGVjKG1xYywgY2Jsa2RhdGEgKyBjYmxrZGF0YWluZGV4LCBzZWctPmxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0NPTU1PTl9DQkxLX0RBVEFfRVhUUkEpOworICAgICAgICB9CisgICAgICAgIGNibGtkYXRhaW5kZXggKz0gc2VnLT5sZW47CisKKyAgICAgICAgZm9yIChwYXNzbm8gPSAwOyAocGFzc25vIDwgc2VnLT5yZWFsX251bV9wYXNzZXMpICYmCisgICAgICAgICAgICAgICAgKGJwbm9fcGx1c19vbmUgPj0gMSk7ICsrcGFzc25vKSB7CiAgICAgICAgICAgICBzd2l0Y2ggKHBhc3N0eXBlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBUMV9UWVBFX1JBVykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19zaWdwYXNzX3Jhdyh0MSwgYnBub19wbHVzX29uZSwgKE9QSl9JTlQzMilvcmllbnQsIChPUEpfSU5UMzIpY2Jsa3N0eSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9WU0MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3NfbXFjX3ZzYyh0MSwgYnBub19wbHVzX29uZSwgKE9QSl9JTlQzMilvcmllbnQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3NfbXFjKHQxLCBicG5vX3BsdXNfb25lLCAoT1BKX0lOVDMyKW9yaWVudCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBUMV9UWVBFX1JBVykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfcmVmcGFzc19yYXcodDEsIGJwbm9fcGx1c19vbmUsIChPUEpfSU5UMzIpY2Jsa3N0eSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9WU0MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3JlZnBhc3NfbXFjX3ZzYyh0MSwgYnBub19wbHVzX29uZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZWNfcmVmcGFzc19tcWModDEsIGJwbm9fcGx1c19vbmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19jbG5wYXNzKHQxLCBicG5vX3BsdXNfb25lLCAoT1BKX0lOVDMyKW9yaWVudCwgKE9QSl9JTlQzMiljYmxrc3R5KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gVDFfVFlQRV9SQVcpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19zaWdwYXNzX3Jhdyh0MSwgYnBub19wbHVzX29uZSwgKE9QSl9JTlQzMiljYmxrc3R5KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3NpZ3Bhc3NfbXFjKHQxLCBicG5vX3BsdXNfb25lLCAoT1BKX0lOVDMyKWNibGtzdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBUMV9UWVBFX1JBVykgeworICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3JlZnBhc3NfcmF3KHQxLCBicG5vX3BsdXNfb25lKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvcGpfdDFfZGVjX3JlZnBhc3NfbXFjKHQxLCBicG5vX3BsdXNfb25lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgb3BqX3QxX2RlY19jbG5wYXNzKHQxLCBicG5vX3BsdXNfb25lLCAoT1BKX0lOVDMyKWNibGtzdHkpOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0JCQlpZiAoKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfUkVTRVQpICYmIHR5cGUgPT0gVDFfVFlQRV9NUSkgewotCQkJCW9wal9tcWNfcmVzZXRzdGF0ZXMobXFjKTsKLQkJCQlvcGpfbXFjX3NldHN0YXRlKG1xYywgVDFfQ1RYTk9fVU5JLCAwLCA0Nik7Ci0JCQkJb3BqX21xY19zZXRzdGF0ZShtcWMsIFQxX0NUWE5PX0FHRywgMCwgMyk7Ci0JCQkJb3BqX21xY19zZXRzdGF0ZShtcWMsIFQxX0NUWE5PX1pDLCAwLCA0KTsKLQkJCX0KLQkJCWlmICgrK3Bhc3N0eXBlID09IDMpIHsKLQkJCQlwYXNzdHlwZSA9IDA7Ci0JCQkJYnBub19wbHVzX29uZS0tOwotCQkJfQotCQl9Ci0JfQorICAgICAgICAgICAgaWYgKChjYmxrc3R5ICYgSjJLX0NDUF9DQkxLU1RZX1JFU0VUKSAmJiB0eXBlID09IFQxX1RZUEVfTVEpIHsKKyAgICAgICAgICAgICAgICBvcGpfbXFjX3Jlc2V0c3RhdGVzKG1xYyk7CisgICAgICAgICAgICAgICAgb3BqX21xY19zZXRzdGF0ZShtcWMsIFQxX0NUWE5PX1VOSSwgMCwgNDYpOworICAgICAgICAgICAgICAgIG9wal9tcWNfc2V0c3RhdGUobXFjLCBUMV9DVFhOT19BR0csIDAsIDMpOworICAgICAgICAgICAgICAgIG9wal9tcWNfc2V0c3RhdGUobXFjLCBUMV9DVFhOT19aQywgMCwgNCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKytwYXNzdHlwZSA9PSAzKSB7CisgICAgICAgICAgICAgICAgcGFzc3R5cGUgPSAwOworICAgICAgICAgICAgICAgIGJwbm9fcGx1c19vbmUtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG9wcV9tcWNfZmluaXNoX2RlYyhtcWMpOworICAgIH0KKworICAgIGlmIChjaGVja19wdGVybSkgeworICAgICAgICBpZiAobXFjLT5icCArIDIgPCBtcWMtPmVuZCkgeworICAgICAgICAgICAgaWYgKHBfbWFuYWdlcl9tdXRleCkgeworICAgICAgICAgICAgICAgIG9wal9tdXRleF9sb2NrKHBfbWFuYWdlcl9tdXRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJQVEVSTSBjaGVjayBmYWlsdXJlOiAlZCByZW1haW5pbmcgYnl0ZXMgaW4gY29kZSBibG9jayAoJWQgdXNlZCAvICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkobXFjLT5lbmQgLSBtcWMtPmJwKSAtIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKG1xYy0+YnAgLSBtcWMtPnN0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkobXFjLT5lbmQgLSBtcWMtPnN0YXJ0KSk7CisgICAgICAgICAgICBpZiAocF9tYW5hZ2VyX211dGV4KSB7CisgICAgICAgICAgICAgICAgb3BqX211dGV4X3VubG9jayhwX21hbmFnZXJfbXV0ZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1xYy0+ZW5kX29mX2J5dGVfc3RyZWFtX2NvdW50ZXIgPiAyKSB7CisgICAgICAgICAgICBpZiAocF9tYW5hZ2VyX211dGV4KSB7CisgICAgICAgICAgICAgICAgb3BqX211dGV4X2xvY2socF9tYW5hZ2VyX211dGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlBURVJNIGNoZWNrIGZhaWx1cmU6ICVkIHN5bnRoZXRpemVkIDB4RkYgbWFya2VycyByZWFkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtcWMtPmVuZF9vZl9ieXRlX3N0cmVhbV9jb3VudGVyKTsKKyAgICAgICAgICAgIGlmIChwX21hbmFnZXJfbXV0ZXgpIHsKKyAgICAgICAgICAgICAgICBvcGpfbXV0ZXhfdW5sb2NrKHBfbWFuYWdlcl9tdXRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBSZXN0b3JlIG9yaWdpbmFsIHQxLT5kYXRhIGlzIG5lZWRlZCAqLworICAgIGlmIChjYmxrLT5kZWNvZGVkX2RhdGEpIHsKKyAgICAgICAgdDEtPmRhdGEgPSBvcmlnaW5hbF90MV9kYXRhOworICAgIH0KKwogICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAogCiAKIAotT1BKX0JPT0wgb3BqX3QxX2VuY29kZV9jYmxrcyggICBvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICp0aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKnRjcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1BKX0ZMT0FUNjQgKiBtY3Rfbm9ybXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbWN0X251bWNvbXBzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK09QSl9CT09MIG9wal90MV9lbmNvZGVfY2Jsa3Mob3BqX3QxX3QgKnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjcF90ICp0Y3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9QSl9GTE9BVDY0ICogbWN0X25vcm1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG1jdF9udW1jb21wcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKIHsKLQlPUEpfVUlOVDMyIGNvbXBubywgcmVzbm8sIGJhbmRubywgcHJlY25vLCBjYmxrbm87CisgICAgT1BKX1VJTlQzMiBjb21wbm8sIHJlc25vLCBiYW5kbm8sIHByZWNubywgY2Jsa25vOwogCi0JdGlsZS0+ZGlzdG90aWxlID0gMDsJCS8qIGZpeGVkX3F1YWxpdHkgKi8KKyAgICB0aWxlLT5kaXN0b3RpbGUgPSAwOyAgICAgICAgLyogZml4ZWRfcXVhbGl0eSAqLwogCi0JZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCB0aWxlLT5udW1jb21wczsgKytjb21wbm8pIHsKLQkJb3BqX3RjZF90aWxlY29tcF90KiB0aWxlYyA9ICZ0aWxlLT5jb21wc1tjb21wbm9dOwotCQlvcGpfdGNjcF90KiB0Y2NwID0gJnRjcC0+dGNjcHNbY29tcG5vXTsKLQkJT1BKX1VJTlQzMiB0aWxlX3cgPSAoT1BKX1VJTlQzMikodGlsZWMtPngxIC0gdGlsZWMtPngwKTsKKyAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHRpbGUtPm51bWNvbXBzOyArK2NvbXBubykgeworICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QqIHRpbGVjID0gJnRpbGUtPmNvbXBzW2NvbXBub107CisgICAgICAgIG9wal90Y2NwX3QqIHRjY3AgPSAmdGNwLT50Y2Nwc1tjb21wbm9dOworICAgICAgICBPUEpfVUlOVDMyIHRpbGVfdyA9IChPUEpfVUlOVDMyKSh0aWxlYy0+eDEgLSB0aWxlYy0+eDApOwogCi0JCWZvciAocmVzbm8gPSAwOyByZXNubyA8IHRpbGVjLT5udW1yZXNvbHV0aW9uczsgKytyZXNubykgewotCQkJb3BqX3RjZF9yZXNvbHV0aW9uX3QgKnJlcyA9ICZ0aWxlYy0+cmVzb2x1dGlvbnNbcmVzbm9dOworICAgICAgICBmb3IgKHJlc25vID0gMDsgcmVzbm8gPCB0aWxlYy0+bnVtcmVzb2x1dGlvbnM7ICsrcmVzbm8pIHsKKyAgICAgICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90ICpyZXMgPSAmdGlsZWMtPnJlc29sdXRpb25zW3Jlc25vXTsKIAotCQkJZm9yIChiYW5kbm8gPSAwOyBiYW5kbm8gPCByZXMtPm51bWJhbmRzOyArK2JhbmRubykgewotCQkJCW9wal90Y2RfYmFuZF90KiByZXN0cmljdCBiYW5kID0gJnJlcy0+YmFuZHNbYmFuZG5vXTsKLSAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYmFuZGNvbnN0ID0gODE5MiAqIDgxOTIgLyAoKE9QSl9JTlQzMikgZmxvb3IoYmFuZC0+c3RlcHNpemUgKiA4MTkyKSk7CisgICAgICAgICAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IHJlcy0+bnVtYmFuZHM7ICsrYmFuZG5vKSB7CisgICAgICAgICAgICAgICAgb3BqX3RjZF9iYW5kX3QqIE9QSl9SRVNUUklDVCBiYW5kID0gJnJlcy0+YmFuZHNbYmFuZG5vXTsKKyAgICAgICAgICAgICAgICBPUEpfSU5UMzIgYmFuZGNvbnN0OwogCi0JCQkJZm9yIChwcmVjbm8gPSAwOyBwcmVjbm8gPCByZXMtPnB3ICogcmVzLT5waDsgKytwcmVjbm8pIHsKLQkJCQkJb3BqX3RjZF9wcmVjaW5jdF90ICpwcmMgPSAmYmFuZC0+cHJlY2luY3RzW3ByZWNub107CisgICAgICAgICAgICAgICAgLyogU2tpcCBlbXB0eSBiYW5kcyAqLworICAgICAgICAgICAgICAgIGlmIChvcGpfdGNkX2lzX2JhbmRfZW1wdHkoYmFuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQogCi0JCQkJCWZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgcHJjLT5jdyAqIHByYy0+Y2g7ICsrY2Jsa25vKSB7Ci0JCQkJCQlvcGpfdGNkX2NibGtfZW5jX3QqIGNibGsgPSAmcHJjLT5jYmxrcy5lbmNbY2Jsa25vXTsKLQkJCQkJCU9QSl9JTlQzMiogcmVzdHJpY3QgdGlsZWRwOwotCQkJCQkJT1BKX1VJTlQzMiBjYmxrX3c7Ci0JCQkJCQlPUEpfVUlOVDMyIGNibGtfaDsKLQkJCQkJCU9QSl9VSU5UMzIgaSwgaiwgdGlsZUluZGV4PTAsIHRpbGVMaW5lQWR2YW5jZTsKKyAgICAgICAgICAgICAgICBiYW5kY29uc3QgPSA4MTkyICogODE5MiAvICgoT1BKX0lOVDMyKSBmbG9vcihiYW5kLT5zdGVwc2l6ZSAqIDgxOTIpKTsKKyAgICAgICAgICAgICAgICBmb3IgKHByZWNubyA9IDA7IHByZWNubyA8IHJlcy0+cHcgKiByZXMtPnBoOyArK3ByZWNubykgeworICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3ByZWNpbmN0X3QgKnByYyA9ICZiYW5kLT5wcmVjaW5jdHNbcHJlY25vXTsKIAotCQkJCQkJT1BKX0lOVDMyIHggPSBjYmxrLT54MCAtIGJhbmQtPngwOwotCQkJCQkJT1BKX0lOVDMyIHkgPSBjYmxrLT55MCAtIGJhbmQtPnkwOwotCQkJCQkJaWYgKGJhbmQtPmJhbmRubyAmIDEpIHsKLQkJCQkJCQlvcGpfdGNkX3Jlc29sdXRpb25fdCAqcHJlcyA9ICZ0aWxlYy0+cmVzb2x1dGlvbnNbcmVzbm8gLSAxXTsKLQkJCQkJCQl4ICs9IHByZXMtPngxIC0gcHJlcy0+eDA7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoYmFuZC0+YmFuZG5vICYgMikgewotCQkJCQkJCW9wal90Y2RfcmVzb2x1dGlvbl90ICpwcmVzID0gJnRpbGVjLT5yZXNvbHV0aW9uc1tyZXNubyAtIDFdOwotCQkJCQkJCXkgKz0gcHJlcy0+eTEgLSBwcmVzLT55MDsKLQkJCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBwcmMtPmN3ICogcHJjLT5jaDsgKytjYmxrbm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfY2Jsa19lbmNfdCogY2JsayA9ICZwcmMtPmNibGtzLmVuY1tjYmxrbm9dOworICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyKiBPUEpfUkVTVFJJQ1QgdGlsZWRwOworICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjYmxrX3c7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNibGtfaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgaSwgaiwgdGlsZUxpbmVBZHZhbmNlOworICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1NJWkVfVCB0aWxlSW5kZXggPSAwOwogCi0JCQkJCQlpZighb3BqX3QxX2FsbG9jYXRlX2J1ZmZlcnMoCi0JCQkJCQkJCQl0MSwKLQkJCQkJCQkJCShPUEpfVUlOVDMyKShjYmxrLT54MSAtIGNibGstPngwKSwKLQkJCQkJCQkJCShPUEpfVUlOVDMyKShjYmxrLT55MSAtIGNibGstPnkwKSkpCi0JCQkJCQl7Ci0JCQkJCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB4ID0gY2Jsay0+eDAgLSBiYW5kLT54MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB5ID0gY2Jsay0+eTAgLSBiYW5kLT55MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYW5kLT5iYW5kbm8gJiAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QgKnByZXMgPSAmdGlsZWMtPnJlc29sdXRpb25zW3Jlc25vIC0gMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCArPSBwcmVzLT54MSAtIHByZXMtPngwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJhbmQtPmJhbmRubyAmIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCAqcHJlcyA9ICZ0aWxlYy0+cmVzb2x1dGlvbnNbcmVzbm8gLSAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ICs9IHByZXMtPnkxIC0gcHJlcy0+eTA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLQkJCQkJCWNibGtfdyA9IHQxLT53OwotCQkJCQkJY2Jsa19oID0gdDEtPmg7Ci0JCQkJCQl0aWxlTGluZUFkdmFuY2UgPSB0aWxlX3cgLSBjYmxrX3c7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wal90MV9hbGxvY2F0ZV9idWZmZXJzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMikoY2Jsay0+eDEgLSBjYmxrLT54MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMikoY2Jsay0+eTEgLSBjYmxrLT55MCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotCQkJCQkJdGlsZWRwPSZ0aWxlYy0+ZGF0YVsoT1BKX1VJTlQzMil5ICogdGlsZV93ICsgKE9QSl9VSU5UMzIpeF07Ci0JCQkJCQl0MS0+ZGF0YSA9IHRpbGVkcDsKLQkJCQkJCXQxLT5kYXRhX3N0cmlkZSA9IHRpbGVfdzsKLQkJCQkJCWlmICh0Y2NwLT5xbWZiaWQgPT0gMSkgewotCQkJCQkJCWZvciAoaiA9IDA7IGogPCBjYmxrX2g7ICsraikgewotCQkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgY2Jsa193OyArK2kpIHsKLQkJCQkJCQkJCXRpbGVkcFt0aWxlSW5kZXhdIDw8PSBUMV9OTVNFREVDX0ZSQUNCSVRTOwotCQkJCQkJCQkJdGlsZUluZGV4Kys7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJdGlsZUluZGV4ICs9IHRpbGVMaW5lQWR2YW5jZTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewkJLyogaWYgKHRjY3AtPnFtZmJpZCA9PSAwKSAqLwotCQkJCQkJCWZvciAoaiA9IDA7IGogPCBjYmxrX2g7ICsraikgewotCQkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgY2Jsa193OyArK2kpIHsKLQkJCQkJCQkJCU9QSl9JTlQzMiB0bXAgPSB0aWxlZHBbdGlsZUluZGV4XTsKLQkJCQkJCQkJCXRpbGVkcFt0aWxlSW5kZXhdID0KLQkJCQkJCQkJCQlvcGpfaW50X2ZpeF9tdWxfdDEoCi0JCQkJCQkJCQkJdG1wLAotCQkJCQkJCQkJCWJhbmRjb25zdCk7Ci0JCQkJCQkJCQl0aWxlSW5kZXgrKzsKLQkJCQkJCQkJfQotCQkJCQkJCQl0aWxlSW5kZXggKz0gdGlsZUxpbmVBZHZhbmNlOwotCQkJCQkJCX0KLQkJCQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNibGtfdyA9IHQxLT53OworICAgICAgICAgICAgICAgICAgICAgICAgY2Jsa19oID0gdDEtPmg7CisgICAgICAgICAgICAgICAgICAgICAgICB0aWxlTGluZUFkdmFuY2UgPSB0aWxlX3cgLSBjYmxrX3c7CiAKLQkJCQkJCW9wal90MV9lbmNvZGVfY2JsaygKLQkJCQkJCQkJdDEsCi0JCQkJCQkJCWNibGssCi0JCQkJCQkJCWJhbmQtPmJhbmRubywKLQkJCQkJCQkJY29tcG5vLAotCQkJCQkJCQl0aWxlYy0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm8sCi0JCQkJCQkJCXRjY3AtPnFtZmJpZCwKLQkJCQkJCQkJYmFuZC0+c3RlcHNpemUsCi0JCQkJCQkJCXRjY3AtPmNibGtzdHksCi0JCQkJCQkJCXRpbGUtPm51bWNvbXBzLAotCQkJCQkJCQl0aWxlLAotCQkJCQkJCQltY3Rfbm9ybXMsCi0JCQkJCQkJCW1jdF9udW1jb21wcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aWxlZHAgPSAmdGlsZWMtPmRhdGFbKE9QSl9TSVpFX1QpeSAqIHRpbGVfdyArIChPUEpfU0laRV9UKXhdOworICAgICAgICAgICAgICAgICAgICAgICAgdDEtPmRhdGEgPSB0aWxlZHA7CisgICAgICAgICAgICAgICAgICAgICAgICB0MS0+ZGF0YV9zdHJpZGUgPSB0aWxlX3c7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGNjcC0+cW1mYmlkID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2Jsa19oOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNibGtfdzsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlZHBbdGlsZUluZGV4XSAqPSAoMSA8PCBUMV9OTVNFREVDX0ZSQUNCSVRTKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVJbmRleCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVJbmRleCArPSB0aWxlTGluZUFkdmFuY2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgIC8qIGlmICh0Y2NwLT5xbWZiaWQgPT0gMCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgY2Jsa19oOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNibGtfdzsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgdG1wID0gdGlsZWRwW3RpbGVJbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlZHBbdGlsZUluZGV4XSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ludF9maXhfbXVsX3QxKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmRjb25zdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlSW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlSW5kZXggKz0gdGlsZUxpbmVBZHZhbmNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotCQkJCQl9IC8qIGNibGtubyAqLwotCQkJCX0gLyogcHJlY25vICovCi0JCQl9IC8qIGJhbmRubyAqLwotCQl9IC8qIHJlc25vICAqLwotCX0gLyogY29tcG5vICAqLwotCXJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9lbmNvZGVfY2JsaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmxrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQtPmJhbmRubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZWMtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjY3AtPnFtZmJpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kLT5zdGVwc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2NwLT5jYmxrc3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUtPm51bWNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWN0X25vcm1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1jdF9udW1jb21wcyk7CisKKyAgICAgICAgICAgICAgICAgICAgfSAvKiBjYmxrbm8gKi8KKyAgICAgICAgICAgICAgICB9IC8qIHByZWNubyAqLworICAgICAgICAgICAgfSAvKiBiYW5kbm8gKi8KKyAgICAgICAgfSAvKiByZXNubyAgKi8KKyAgICB9IC8qIGNvbXBubyAgKi8KKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKKy8qIFJldHVybnMgd2hldGhlciB0aGUgcGFzcyAoYnBubywgcGFzc3R5cGUpIGlzIHRlcm1pbmF0ZWQgKi8KK3N0YXRpYyBpbnQgb3BqX3QxX2VuY19pc190ZXJtX3Bhc3Mob3BqX3RjZF9jYmxrX2VuY190KiBjYmxrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNibGtzdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBicG5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBhc3N0eXBlKQoreworICAgIC8qIElzIGl0IHRoZSBsYXN0IGNsZWFudXAgcGFzcyA/ICovCisgICAgaWYgKHBhc3N0eXBlID09IDIgJiYgYnBubyA9PSAwKSB7CisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICB9CisKKyAgICBpZiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9URVJNQUxMKSB7CisgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICB9CisKKyAgICBpZiAoKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfTEFaWSkpIHsKKyAgICAgICAgLyogRm9yIGJ5cGFzcyBhcml0aG1ldGljIGJ5cGFzcywgdGVybWluYXRlIHRoZSA0dGggY2xlYW51cCBwYXNzICovCisgICAgICAgIGlmICgoYnBubyA9PSAoKE9QSl9JTlQzMiljYmxrLT5udW1icHMgLSA0KSkgJiYgKHBhc3N0eXBlID09IDIpKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgIH0KKyAgICAgICAgLyogYW5kIGJleW9uZCB0ZXJtaW5hdGUgYWxsIHRoZSBtYWduaXR1ZGUgcmVmaW5lbWVudCBwYXNzZXMgKGluIHJhdykgKi8KKyAgICAgICAgLyogYW5kIGNsZWFudXAgcGFzc2VzIChpbiBNUUMpICovCisgICAgICAgIGlmICgoYnBubyA8ICgoT1BKX0lOVDMyKShjYmxrLT5udW1icHMpIC0gNCkpICYmIChwYXNzdHlwZSA+IDApKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT1BKX0ZBTFNFOworfQorCisKIC8qKiBtb2QgZml4ZWRfcXVhbGl0eSAqLwogc3RhdGljIHZvaWQgb3BqX3QxX2VuY29kZV9jYmxrKG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfY2Jsa19lbmNfdCogY2JsaywKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgb3JpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjb21wbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBxbWZiaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQ2NCBzdGVwc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY2Jsa3N0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbnVtY29tcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqIHRpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfRkxPQVQ2NCAqIG1jdF9ub3JtcywKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbWN0X251bWNvbXBzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfY2Jsa19lbmNfdCogY2JsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG9yaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNvbXBubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcW1mYmlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDY0IHN0ZXBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY2Jsa3N0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG51bWNvbXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICogdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfRkxPQVQ2NCAqIG1jdF9ub3JtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG1jdF9udW1jb21wcykKIHsKLQlPUEpfRkxPQVQ2NCBjdW13bXNlZGVjID0gMC4wOworICAgIE9QSl9GTE9BVDY0IGN1bXdtc2VkZWMgPSAwLjA7CiAKLQlvcGpfbXFjX3QgKm1xYyA9IHQxLT5tcWM7CS8qIE1RQyBjb21wb25lbnQgKi8KKyAgICBvcGpfbXFjX3QgKm1xYyA9ICYodDEtPm1xYyk7ICAgLyogTVFDIGNvbXBvbmVudCAqLwogCi0JT1BKX1VJTlQzMiBwYXNzbm87Ci0JT1BKX0lOVDMyIGJwbm87Ci0JT1BKX1VJTlQzMiBwYXNzdHlwZTsKLQlPUEpfSU5UMzIgbm1zZWRlYyA9IDA7Ci0JT1BKX0lOVDMyIG1heDsKLQlPUEpfVUlOVDMyIGksIGo7Ci0JT1BKX0JZVEUgdHlwZSA9IFQxX1RZUEVfTVE7Ci0JT1BKX0ZMT0FUNjQgdGVtcHdtc2VkZWM7CisgICAgT1BKX1VJTlQzMiBwYXNzbm87CisgICAgT1BKX0lOVDMyIGJwbm87CisgICAgT1BKX1VJTlQzMiBwYXNzdHlwZTsKKyAgICBPUEpfSU5UMzIgbm1zZWRlYyA9IDA7CisgICAgT1BKX0lOVDMyIG1heDsKKyAgICBPUEpfVUlOVDMyIGksIGo7CisgICAgT1BKX0JZVEUgdHlwZSA9IFQxX1RZUEVfTVE7CisgICAgT1BKX0ZMT0FUNjQgdGVtcHdtc2VkZWM7CiAKLQltYXggPSAwOwotCWZvciAoaSA9IDA7IGkgPCB0MS0+dzsgKytpKSB7Ci0JCWZvciAoaiA9IDA7IGogPCB0MS0+aDsgKytqKSB7Ci0JCQlPUEpfSU5UMzIgdG1wID0gYWJzKHQxLT5kYXRhW2kgKyBqKnQxLT5kYXRhX3N0cmlkZV0pOwotCQkJbWF4ID0gb3BqX2ludF9tYXgobWF4LCB0bXApOwotCQl9Ci0JfQorI2lmZGVmIEVYVFJBX0RFQlVHCisgICAgcHJpbnRmKCJlbmNvZGVfY2Jsayh4PSVkLHk9JWQseDE9JWQseTE9JWQsb3JpZW50PSVkLGNvbXBubz0lZCxsZXZlbD0lZFxuIiwKKyAgICAgICAgICAgY2Jsay0+eDAsIGNibGstPnkwLCBjYmxrLT54MSwgY2Jsay0+eTEsIG9yaWVudCwgY29tcG5vLCBsZXZlbCk7CisjZW5kaWYKIAotCWNibGstPm51bWJwcyA9IG1heCA/IChPUEpfVUlOVDMyKSgob3BqX2ludF9mbG9vcmxvZzIobWF4KSArIDEpIC0gVDFfTk1TRURFQ19GUkFDQklUUykgOiAwOworICAgIG1xYy0+bHV0X2N0eG5vX3pjX29yaWVudCA9IGx1dF9jdHhub196YyArIChvcmllbnQgPDwgOSk7CiAKLQlicG5vID0gKE9QSl9JTlQzMikoY2Jsay0+bnVtYnBzIC0gMSk7Ci0JcGFzc3R5cGUgPSAyOworICAgIG1heCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHQxLT53OyArK2kpIHsKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHQxLT5oOyArK2opIHsKKyAgICAgICAgICAgIE9QSl9JTlQzMiB0bXAgPSBhYnModDEtPmRhdGFbaSArIGogKiB0MS0+ZGF0YV9zdHJpZGVdKTsKKyAgICAgICAgICAgIG1heCA9IG9wal9pbnRfbWF4KG1heCwgdG1wKTsKKyAgICAgICAgfQorICAgIH0KIAotCW9wal9tcWNfcmVzZXRzdGF0ZXMobXFjKTsKLQlvcGpfbXFjX3NldHN0YXRlKG1xYywgVDFfQ1RYTk9fVU5JLCAwLCA0Nik7Ci0Jb3BqX21xY19zZXRzdGF0ZShtcWMsIFQxX0NUWE5PX0FHRywgMCwgMyk7Ci0Jb3BqX21xY19zZXRzdGF0ZShtcWMsIFQxX0NUWE5PX1pDLCAwLCA0KTsKLQlvcGpfbXFjX2luaXRfZW5jKG1xYywgY2Jsay0+ZGF0YSk7CisgICAgY2Jsay0+bnVtYnBzID0gbWF4ID8gKE9QSl9VSU5UMzIpKChvcGpfaW50X2Zsb29ybG9nMihtYXgpICsgMSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMV9OTVNFREVDX0ZSQUNCSVRTKSA6IDA7CisgICAgaWYgKGNibGstPm51bWJwcyA9PSAwKSB7CisgICAgICAgIGNibGstPnRvdGFscGFzc2VzID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotCWZvciAocGFzc25vID0gMDsgYnBubyA+PSAwOyArK3Bhc3NubykgewotCQlvcGpfdGNkX3Bhc3NfdCAqcGFzcyA9ICZjYmxrLT5wYXNzZXNbcGFzc25vXTsKLQkJT1BKX1VJTlQzMiBjb3JyZWN0aW9uID0gMzsKLQkJdHlwZSA9ICgoYnBubyA8ICgoT1BKX0lOVDMyKSAoY2Jsay0+bnVtYnBzKSAtIDQpKSAmJiAocGFzc3R5cGUgPCAyKSAmJiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9MQVpZKSkgPyBUMV9UWVBFX1JBVyA6IFQxX1RZUEVfTVE7CisgICAgYnBubyA9IChPUEpfSU5UMzIpKGNibGstPm51bWJwcyAtIDEpOworICAgIHBhc3N0eXBlID0gMjsKIAotCQlzd2l0Y2ggKHBhc3N0eXBlKSB7Ci0JCQljYXNlIDA6Ci0JCQkJb3BqX3QxX2VuY19zaWdwYXNzKHQxLCBicG5vLCBvcmllbnQsICZubXNlZGVjLCB0eXBlLCBjYmxrc3R5KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMToKLQkJCQlvcGpfdDFfZW5jX3JlZnBhc3ModDEsIGJwbm8sICZubXNlZGVjLCB0eXBlLCBjYmxrc3R5KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQlvcGpfdDFfZW5jX2NsbnBhc3ModDEsIGJwbm8sIG9yaWVudCwgJm5tc2VkZWMsIGNibGtzdHkpOwotCQkJCS8qIGNvZGUgc3dpdGNoIFNFR01BUksgKGkuZS4gU0VHU1lNKSAqLwotCQkJCWlmIChjYmxrc3R5ICYgSjJLX0NDUF9DQkxLU1RZX1NFR1NZTSkKLQkJCQkJb3BqX21xY19zZWdtYXJrX2VuYyhtcWMpOwotCQkJCWJyZWFrOwotCQl9CisgICAgb3BqX21xY19yZXNldHN0YXRlcyhtcWMpOworICAgIG9wal9tcWNfc2V0c3RhdGUobXFjLCBUMV9DVFhOT19VTkksIDAsIDQ2KTsKKyAgICBvcGpfbXFjX3NldHN0YXRlKG1xYywgVDFfQ1RYTk9fQUdHLCAwLCAzKTsKKyAgICBvcGpfbXFjX3NldHN0YXRlKG1xYywgVDFfQ1RYTk9fWkMsIDAsIDQpOworICAgIG9wal9tcWNfaW5pdF9lbmMobXFjLCBjYmxrLT5kYXRhKTsKIAotCQkvKiBmaXhlZF9xdWFsaXR5ICovCi0JCXRlbXB3bXNlZGVjID0gb3BqX3QxX2dldHdtc2VkZWMobm1zZWRlYywgY29tcG5vLCBsZXZlbCwgb3JpZW50LCBicG5vLCBxbWZiaWQsIHN0ZXBzaXplLCBudW1jb21wcyxtY3Rfbm9ybXMsIG1jdF9udW1jb21wcykgOwotCQljdW13bXNlZGVjICs9IHRlbXB3bXNlZGVjOwotCQl0aWxlLT5kaXN0b3RpbGUgKz0gdGVtcHdtc2VkZWM7CisgICAgZm9yIChwYXNzbm8gPSAwOyBicG5vID49IDA7ICsrcGFzc25vKSB7CisgICAgICAgIG9wal90Y2RfcGFzc190ICpwYXNzID0gJmNibGstPnBhc3Nlc1twYXNzbm9dOworICAgICAgICB0eXBlID0gKChicG5vIDwgKChPUEpfSU5UMzIpKGNibGstPm51bWJwcykgLSA0KSkgJiYgKHBhc3N0eXBlIDwgMikgJiYKKyAgICAgICAgICAgICAgICAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9MQVpZKSkgPyBUMV9UWVBFX1JBVyA6IFQxX1RZUEVfTVE7CiAKLQkJLyogQ29kZSBzd2l0Y2ggIlJFU1RBUlQiIChpLmUuIFRFUk1BTEwpICovCi0JCWlmICgoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9URVJNQUxMKQkmJiAhKChwYXNzdHlwZSA9PSAyKSAmJiAoYnBubyAtIDEgPCAwKSkpIHsKLQkJCWlmICh0eXBlID09IFQxX1RZUEVfUkFXKSB7Ci0JCQkJb3BqX21xY19mbHVzaChtcWMpOwotCQkJCWNvcnJlY3Rpb24gPSAxOwotCQkJCS8qIGNvcnJlY3Rpb24gPSBtcWNfYnlwYXNzX2ZsdXNoX2VuYygpOyAqLwotCQkJfSBlbHNlIHsJCQkvKiBjb3JyZWN0aW9uID0gbXFjX3Jlc3RhcnRfZW5jKCk7ICovCi0JCQkJb3BqX21xY19mbHVzaChtcWMpOwotCQkJCWNvcnJlY3Rpb24gPSAxOwotCQkJfQotCQkJcGFzcy0+dGVybSA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKChicG5vIDwgKChPUEpfSU5UMzIpIChjYmxrLT5udW1icHMpIC0gNCkgJiYgKHBhc3N0eXBlID4gMCkpCi0JCQkJfHwgKChicG5vID09ICgoT1BKX0lOVDMyKWNibGstPm51bWJwcyAtIDQpKSAmJiAocGFzc3R5cGUgPT0gMikpKSAmJiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9MQVpZKSkgewotCQkJCWlmICh0eXBlID09IFQxX1RZUEVfUkFXKSB7Ci0JCQkJCW9wal9tcWNfZmx1c2gobXFjKTsKLQkJCQkJY29ycmVjdGlvbiA9IDE7Ci0JCQkJCS8qIGNvcnJlY3Rpb24gPSBtcWNfYnlwYXNzX2ZsdXNoX2VuYygpOyAqLwotCQkJCX0gZWxzZSB7CQkvKiBjb3JyZWN0aW9uID0gbXFjX3Jlc3RhcnRfZW5jKCk7ICovCi0JCQkJCW9wal9tcWNfZmx1c2gobXFjKTsKLQkJCQkJY29ycmVjdGlvbiA9IDE7Ci0JCQkJfQotCQkJCXBhc3MtPnRlcm0gPSAxOwotCQkJfSBlbHNlIHsKLQkJCQlwYXNzLT50ZXJtID0gMDsKLQkJCX0KLQkJfQorICAgICAgICAvKiBJZiB0aGUgcHJldmlvdXMgcGFzcyB3YXMgdGVybWluYXRpbmcsIHdlIG5lZWQgdG8gcmVzZXQgdGhlIGVuY29kZXIgKi8KKyAgICAgICAgaWYgKHBhc3NubyA+IDAgJiYgY2Jsay0+cGFzc2VzW3Bhc3NubyAtIDFdLnRlcm0pIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IFQxX1RZUEVfUkFXKSB7CisgICAgICAgICAgICAgICAgb3BqX21xY19ieXBhc3NfaW5pdF9lbmMobXFjKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3BqX21xY19yZXN0YXJ0X2luaXRfZW5jKG1xYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotCQlpZiAoKytwYXNzdHlwZSA9PSAzKSB7Ci0JCQlwYXNzdHlwZSA9IDA7Ci0JCQlicG5vLS07Ci0JCX0KKyAgICAgICAgc3dpdGNoIChwYXNzdHlwZSkgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBvcGpfdDFfZW5jX3NpZ3Bhc3ModDEsIGJwbm8sICZubXNlZGVjLCB0eXBlLCBjYmxrc3R5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBvcGpfdDFfZW5jX3JlZnBhc3ModDEsIGJwbm8sICZubXNlZGVjLCB0eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBvcGpfdDFfZW5jX2NsbnBhc3ModDEsIGJwbm8sICZubXNlZGVjLCBjYmxrc3R5KTsKKyAgICAgICAgICAgIC8qIGNvZGUgc3dpdGNoIFNFR01BUksgKGkuZS4gU0VHU1lNKSAqLworICAgICAgICAgICAgaWYgKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfU0VHU1lNKSB7CisgICAgICAgICAgICAgICAgb3BqX21xY19zZWdtYXJrX2VuYyhtcWMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotCQlpZiAocGFzcy0+dGVybSAmJiBicG5vID4gMCkgewotCQkJdHlwZSA9ICgoYnBubyA8ICgoT1BKX0lOVDMyKSAoY2Jsay0+bnVtYnBzKSAtIDQpKSAmJiAocGFzc3R5cGUgPCAyKSAmJiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9MQVpZKSkgPyBUMV9UWVBFX1JBVyA6IFQxX1RZUEVfTVE7Ci0JCQlpZiAodHlwZSA9PSBUMV9UWVBFX1JBVykKLQkJCQlvcGpfbXFjX2J5cGFzc19pbml0X2VuYyhtcWMpOwotCQkJZWxzZQotCQkJCW9wal9tcWNfcmVzdGFydF9pbml0X2VuYyhtcWMpOwotCQl9CisgICAgICAgIC8qIGZpeGVkX3F1YWxpdHkgKi8KKyAgICAgICAgdGVtcHdtc2VkZWMgPSBvcGpfdDFfZ2V0d21zZWRlYyhubXNlZGVjLCBjb21wbm8sIGxldmVsLCBvcmllbnQsIGJwbm8sIHFtZmJpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwc2l6ZSwgbnVtY29tcHMsIG1jdF9ub3JtcywgbWN0X251bWNvbXBzKSA7CisgICAgICAgIGN1bXdtc2VkZWMgKz0gdGVtcHdtc2VkZWM7CisgICAgICAgIHRpbGUtPmRpc3RvdGlsZSArPSB0ZW1wd21zZWRlYzsKKyAgICAgICAgcGFzcy0+ZGlzdG9ydGlvbmRlYyA9IGN1bXdtc2VkZWM7CiAKLQkJcGFzcy0+ZGlzdG9ydGlvbmRlYyA9IGN1bXdtc2VkZWM7Ci0JCXBhc3MtPnJhdGUgPSBvcGpfbXFjX251bWJ5dGVzKG1xYykgKyBjb3JyZWN0aW9uOwkvKiBGSVhNRSAqLworICAgICAgICBpZiAob3BqX3QxX2VuY19pc190ZXJtX3Bhc3MoY2JsaywgY2Jsa3N0eSwgYnBubywgcGFzc3R5cGUpKSB7CisgICAgICAgICAgICAvKiBJZiBpdCBpcyBhIHRlcm1pbmF0ZWQgcGFzcywgdGVybWluYXRlIGl0ICovCisgICAgICAgICAgICBpZiAodHlwZSA9PSBUMV9UWVBFX1JBVykgeworICAgICAgICAgICAgICAgIG9wal9tcWNfYnlwYXNzX2ZsdXNoX2VuYyhtcWMsIGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfUFRFUk0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9QVEVSTSkgeworICAgICAgICAgICAgICAgICAgICBvcGpfbXFjX2VydGVybV9lbmMobXFjKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvcGpfbXFjX2ZsdXNoKG1xYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFzcy0+dGVybSA9IDE7CisgICAgICAgICAgICBwYXNzLT5yYXRlID0gb3BqX21xY19udW1ieXRlcyhtcWMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogTm9uIHRlcm1pbmF0ZWQgcGFzcyAqLworICAgICAgICAgICAgT1BKX1VJTlQzMiByYXRlX2V4dHJhX2J5dGVzOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gVDFfVFlQRV9SQVcpIHsKKyAgICAgICAgICAgICAgICByYXRlX2V4dHJhX2J5dGVzID0gb3BqX21xY19ieXBhc3NfZ2V0X2V4dHJhX2J5dGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXFjLCAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9QVEVSTSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByYXRlX2V4dHJhX2J5dGVzID0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhc3MtPnRlcm0gPSAwOworICAgICAgICAgICAgcGFzcy0+cmF0ZSA9IG9wal9tcWNfbnVtYnl0ZXMobXFjKSArIHJhdGVfZXh0cmFfYnl0ZXM7CisgICAgICAgIH0KIAotCQkvKiBDb2RlLXN3aXRjaCAiUkVTRVQiICovCi0JCWlmIChjYmxrc3R5ICYgSjJLX0NDUF9DQkxLU1RZX1JFU0VUKQotCQkJb3BqX21xY19yZXNldF9lbmMobXFjKTsKLQl9CisgICAgICAgIGlmICgrK3Bhc3N0eXBlID09IDMpIHsKKyAgICAgICAgICAgIHBhc3N0eXBlID0gMDsKKyAgICAgICAgICAgIGJwbm8tLTsKKyAgICAgICAgfQogCi0JLyogQ29kZSBzd2l0Y2ggIkVSVEVSTSIgKGkuZS4gUFRFUk0pICovCi0JaWYgKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfUFRFUk0pCi0JCW9wal9tcWNfZXJ0ZXJtX2VuYyhtcWMpOwotCWVsc2UgLyogRGVmYXVsdCBjb2RpbmcgKi8gaWYgKCEoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9MQVpZKSkKLQkJb3BqX21xY19mbHVzaChtcWMpOworICAgICAgICAvKiBDb2RlLXN3aXRjaCAiUkVTRVQiICovCisgICAgICAgIGlmIChjYmxrc3R5ICYgSjJLX0NDUF9DQkxLU1RZX1JFU0VUKSB7CisgICAgICAgICAgICBvcGpfbXFjX3Jlc2V0X2VuYyhtcWMpOworICAgICAgICB9CisgICAgfQogCi0JY2Jsay0+dG90YWxwYXNzZXMgPSBwYXNzbm87CisgICAgY2Jsay0+dG90YWxwYXNzZXMgPSBwYXNzbm87CiAKLQlmb3IgKHBhc3NubyA9IDA7IHBhc3NubzxjYmxrLT50b3RhbHBhc3NlczsgcGFzc25vKyspIHsKLQkJb3BqX3RjZF9wYXNzX3QgKnBhc3MgPSAmY2Jsay0+cGFzc2VzW3Bhc3Nub107Ci0JCWlmIChwYXNzLT5yYXRlID4gb3BqX21xY19udW1ieXRlcyhtcWMpKQotCQkJcGFzcy0+cmF0ZSA9IG9wal9tcWNfbnVtYnl0ZXMobXFjKTsKLQkJLypQcmV2ZW50aW5nIGdlbmVyYXRpb24gb2YgRkYgYXMgbGFzdCBkYXRhIGJ5dGUgb2YgYSBwYXNzKi8KLQkJaWYoKHBhc3MtPnJhdGU+MSkgJiYgKGNibGstPmRhdGFbcGFzcy0+cmF0ZSAtIDFdID09IDB4RkYpKXsKLQkJCXBhc3MtPnJhdGUtLTsKLQkJfQotCQlwYXNzLT5sZW4gPSBwYXNzLT5yYXRlIC0gKHBhc3NubyA9PSAwID8gMCA6IGNibGstPnBhc3Nlc1twYXNzbm8gLSAxXS5yYXRlKTsKLQl9CisgICAgaWYgKGNibGstPnRvdGFscGFzc2VzKSB7CisgICAgICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHBhc3MgcmF0ZXMgYXJlIGluY3JlYXNpbmcgKi8KKyAgICAgICAgT1BKX1VJTlQzMiBsYXN0X3Bhc3NfcmF0ZSA9IG9wal9tcWNfbnVtYnl0ZXMobXFjKTsKKyAgICAgICAgZm9yIChwYXNzbm8gPSBjYmxrLT50b3RhbHBhc3NlczsgcGFzc25vID4gMDspIHsKKyAgICAgICAgICAgIG9wal90Y2RfcGFzc190ICpwYXNzID0gJmNibGstPnBhc3Nlc1stLXBhc3Nub107CisgICAgICAgICAgICBpZiAocGFzcy0+cmF0ZSA+IGxhc3RfcGFzc19yYXRlKSB7CisgICAgICAgICAgICAgICAgcGFzcy0+cmF0ZSA9IGxhc3RfcGFzc19yYXRlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsYXN0X3Bhc3NfcmF0ZSA9IHBhc3MtPnJhdGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHBhc3NubyA9IDA7IHBhc3NubyA8IGNibGstPnRvdGFscGFzc2VzOyBwYXNzbm8rKykgeworICAgICAgICBvcGpfdGNkX3Bhc3NfdCAqcGFzcyA9ICZjYmxrLT5wYXNzZXNbcGFzc25vXTsKKworICAgICAgICAvKiBQcmV2ZW50IGdlbmVyYXRpb24gb2YgRkYgYXMgbGFzdCBkYXRhIGJ5dGUgb2YgYSBwYXNzKi8KKyAgICAgICAgLyogRm9yIHRlcm1pbmF0aW5nIHBhc3NlcywgdGhlIGZsdXNoaW5nIHByb2NlZHVyZSBlbnN1cmVkIHRoaXMgYWxyZWFkeSAqLworICAgICAgICBhc3NlcnQocGFzcy0+cmF0ZSA+IDApOworICAgICAgICBpZiAoY2Jsay0+ZGF0YVtwYXNzLT5yYXRlIC0gMV0gPT0gMHhGRikgeworICAgICAgICAgICAgcGFzcy0+cmF0ZS0tOworICAgICAgICB9CisgICAgICAgIHBhc3MtPmxlbiA9IHBhc3MtPnJhdGUgLSAocGFzc25vID09IDAgPyAwIDogY2Jsay0+cGFzc2VzW3Bhc3NubyAtIDFdLnJhdGUpOworICAgIH0KKworI2lmZGVmIEVYVFJBX0RFQlVHCisgICAgcHJpbnRmKCIgbGVuPSVkXG4iLCAoY2Jsay0+dG90YWxwYXNzZXMpID8gb3BqX21xY19udW1ieXRlcyhtcWMpIDogMCk7CisKKyAgICAvKiBDaGVjayB0aGF0IHRoZXJlIG5vdCAweGZmID49MHg5MCBzZXF1ZW5jZXMgKi8KKyAgICBpZiAoY2Jsay0+dG90YWxwYXNzZXMpIHsKKyAgICAgICAgT1BKX1VJTlQzMiBpOworICAgICAgICBPUEpfVUlOVDMyIGxlbiA9IG9wal9tcWNfbnVtYnl0ZXMobXFjKTsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgICAgICBpZiAoY2Jsay0+ZGF0YVtpIC0gMV0gPT0gMHhmZiAmJiBjYmxrLT5kYXRhW2ldID49IDB4OTApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIjB4ZmYgJTAyeCBhdCBvZmZzZXQgJWRcbiIsIGNibGstPmRhdGFbaV0sIGkgLSAxKTsKKyAgICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmCiB9Ci0KLSNpZiAwCi1zdGF0aWMgdm9pZCBvcGpfdDFfZGVjX3JlZnBhc3Nfc3RlcCggICBvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBvc2hhbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBuZWdoYWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHZzYykKLXsKLQlPUEpfSU5UMzIgIHQ7Ci0JT1BKX1VJTlQzMiB2LGZsYWc7Ci0KLQlvcGpfbXFjX3QgKm1xYyA9IHQxLT5tcWM7CS8qIE1RQyBjb21wb25lbnQgKi8KLQlvcGpfcmF3X3QgKnJhdyA9IHQxLT5yYXc7CS8qIFJBVyBjb21wb25lbnQgKi8KLQotCWZsYWcgPSB2c2MgPyAoKCpmbGFnc3ApICYgKH4oVDFfU0lHX1MgfCBUMV9TSUdfU0UgfCBUMV9TSUdfU1cgfCBUMV9TR05fUykpKSA6ICgqZmxhZ3NwKTsKLQlpZiAoKGZsYWcgJiAoVDFfU0lHIHwgVDFfVklTSVQpKSA9PSBUMV9TSUcpIHsKLQkJb3BqX21xY19zZXRjdXJjdHgobXFjLCBvcGpfdDFfZ2V0Y3R4bm9fbWFnKGZsYWcpKTsJLyogRVNTQUkgKi8KLQkJaWYgKHR5cGUgPT0gVDFfVFlQRV9SQVcpIHsKLQkJCXYgPSBvcGpfcmF3X2RlY29kZShyYXcpOwotCQl9IGVsc2UgewotCQkJdiA9IG9wal9tcWNfZGVjb2RlKG1xYyk7Ci0JCX0KLQkJdCA9IHYgPyBwb3NoYWxmIDogbmVnaGFsZjsKLQkJKmRhdGFwICs9ICpkYXRhcCA8IDAgPyAtdCA6IHQ7Ci0JCSpmbGFnc3AgfD0gVDFfUkVGSU5FOwotCX0KLX0JCQkJLyogVlNDIGFuZCAgQllQQVNTIGJ5IEFudG9uaW4gICovCi0jZW5kaWYKLQotCi0KLSNpZiAwCi1zdGF0aWMgdm9pZCBvcGpfdDFfZGVjX3NpZ3Bhc3Nfc3RlcCggICBvcGpfdDFfdCAqdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mbGFnX3QgKmZsYWdzcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICpkYXRhcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBvcmllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBvbmVwbHVzaGFsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB2c2MpCi17Ci0JT1BKX1VJTlQzMiB2LCBmbGFnOwotCi0Jb3BqX3Jhd190ICpyYXcgPSB0MS0+cmF3OwkvKiBSQVcgY29tcG9uZW50ICovCi0Jb3BqX21xY190ICptcWMgPSB0MS0+bXFjOwkvKiBNUUMgY29tcG9uZW50ICovCi0KLQlmbGFnID0gdnNjID8gKCgqZmxhZ3NwKSAmICh+KFQxX1NJR19TIHwgVDFfU0lHX1NFIHwgVDFfU0lHX1NXIHwgVDFfU0dOX1MpKSkgOiAoKmZsYWdzcCk7Ci0JaWYgKChmbGFnICYgVDFfU0lHX09USCkgJiYgIShmbGFnICYgKFQxX1NJRyB8IFQxX1ZJU0lUKSkpIHsKLQkJaWYgKHR5cGUgPT0gVDFfVFlQRV9SQVcpIHsKLQkJCWlmIChvcGpfcmF3X2RlY29kZShyYXcpKSB7Ci0JCQkJdiA9IG9wal9yYXdfZGVjb2RlKHJhdyk7CS8qIEVTU0FJICovCi0JCQkJKmRhdGFwID0gdiA/IC1vbmVwbHVzaGFsZiA6IG9uZXBsdXNoYWxmOwotCQkJCW9wal90MV91cGRhdGVmbGFncyhmbGFnc3AsIHYsIHQxLT5mbGFnc19zdHJpZGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJb3BqX21xY19zZXRjdXJjdHgobXFjLCBvcGpfdDFfZ2V0Y3R4bm9femMoZmxhZywgb3JpZW50KSk7Ci0JCQlpZiAob3BqX21xY19kZWNvZGUobXFjKSkgewotCQkJCW9wal9tcWNfc2V0Y3VyY3R4KG1xYywgb3BqX3QxX2dldGN0eG5vX3NjKGZsYWcpKTsKLQkJCQl2ID0gb3BqX21xY19kZWNvZGUobXFjKSBeIG9wal90MV9nZXRzcGIoZmxhZyk7Ci0JCQkJKmRhdGFwID0gdiA/IC1vbmVwbHVzaGFsZiA6IG9uZXBsdXNoYWxmOwotCQkJCW9wal90MV91cGRhdGVmbGFncyhmbGFnc3AsIHYsIHQxLT5mbGFnc19zdHJpZGUpOwotCQkJfQotCQl9Ci0JCSpmbGFnc3AgfD0gVDFfVklTSVQ7Ci0JfQotfQkJCQkvKiBWU0MgYW5kICBCWVBBU1MgYnkgQW50b25pbiAqLwotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3QxLmggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3QxLmgKaW5kZXggM2JjMGFkOS4uMTcxZGZiMCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90MS5oCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdDEuaApAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKLSAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQKICAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKICAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KICAqCkBAIC04LDkgKzgsMTEgQEAKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBQcm9mZXNzb3IgQmVub2l0IE1hY3EKICAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzLCBEYXZpZCBKYW5zc2VucwogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIFlhbm5pY2sgVmVyc2NodWVyZW4KLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eCAKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eAogICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQsIEFudG9uaW4gRGVzY2FtcGUKICAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQorICogQ29weXJpZ2h0IChjKSAyMDEyLCBDYXJsIEhldGhlcmluZ3RvbgorICogQ29weXJpZ2h0IChjKSAyMDE3LCBJbnRvUElYIFNBIDxzdXBwb3J0QGludG9waXguY29tPgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTM0LDggKzM2LDggQEAKICAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwotI2lmbmRlZiBfX1QxX0gKLSNkZWZpbmUgX19UMV9ICisjaWZuZGVmIE9QSl9UMV9ICisjZGVmaW5lIE9QSl9UMV9ICiAvKioKIEBmaWxlIHQxLmgKIEBicmllZiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgdGllci0xIGNvZGluZyAoY29kaW5nIG9mIGNvZGUtYmxvY2sgY29lZmZpY2llbnRzKSAoVDEpCkBAIC01MCw3MiArNTIsMTY0IEBACiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogI2RlZmluZSBUMV9OTVNFREVDX0JJVFMgNwogCi0jZGVmaW5lIFQxX1NJR19ORSAweDAwMDEJLyoqPCBDb250ZXh0IG9yaWVudGF0aW9uIDogTm9ydGgtRWFzdCBkaXJlY3Rpb24gKi8KLSNkZWZpbmUgVDFfU0lHX1NFIDB4MDAwMgkvKio8IENvbnRleHQgb3JpZW50YXRpb24gOiBTb3V0aC1FYXN0IGRpcmVjdGlvbiAqLwotI2RlZmluZSBUMV9TSUdfU1cgMHgwMDA0CS8qKjwgQ29udGV4dCBvcmllbnRhdGlvbiA6IFNvdXRoLVdlc3QgZGlyZWN0aW9uICovCi0jZGVmaW5lIFQxX1NJR19OVyAweDAwMDgJLyoqPCBDb250ZXh0IG9yaWVudGF0aW9uIDogTm9ydGgtV2VzdCBkaXJlY3Rpb24gKi8KLSNkZWZpbmUgVDFfU0lHX04gMHgwMDEwCQkvKio8IENvbnRleHQgb3JpZW50YXRpb24gOiBOb3J0aCBkaXJlY3Rpb24gKi8KLSNkZWZpbmUgVDFfU0lHX0UgMHgwMDIwCQkvKio8IENvbnRleHQgb3JpZW50YXRpb24gOiBFYXN0IGRpcmVjdGlvbiAqLwotI2RlZmluZSBUMV9TSUdfUyAweDAwNDAJCS8qKjwgQ29udGV4dCBvcmllbnRhdGlvbiA6IFNvdXRoIGRpcmVjdGlvbiAqLwotI2RlZmluZSBUMV9TSUdfVyAweDAwODAJCS8qKjwgQ29udGV4dCBvcmllbnRhdGlvbiA6IFdlc3QgZGlyZWN0aW9uICovCi0jZGVmaW5lIFQxX1NJR19PVEggKFQxX1NJR19OfFQxX1NJR19ORXxUMV9TSUdfRXxUMV9TSUdfU0V8VDFfU0lHX1N8VDFfU0lHX1NXfFQxX1NJR19XfFQxX1NJR19OVykKLSNkZWZpbmUgVDFfU0lHX1BSSU0gKFQxX1NJR19OfFQxX1NJR19FfFQxX1NJR19TfFQxX1NJR19XKQotCi0jZGVmaW5lIFQxX1NHTl9OIDB4MDEwMAotI2RlZmluZSBUMV9TR05fRSAweDAyMDAKLSNkZWZpbmUgVDFfU0dOX1MgMHgwNDAwCi0jZGVmaW5lIFQxX1NHTl9XIDB4MDgwMAotI2RlZmluZSBUMV9TR04gKFQxX1NHTl9OfFQxX1NHTl9FfFQxX1NHTl9TfFQxX1NHTl9XKQotCi0jZGVmaW5lIFQxX1NJRyAweDEwMDAKLSNkZWZpbmUgVDFfUkVGSU5FIDB4MjAwMAotI2RlZmluZSBUMV9WSVNJVCAweDQwMDAKLQotI2RlZmluZSBUMV9OVU1DVFhTX1pDIDkKLSNkZWZpbmUgVDFfTlVNQ1RYU19TQyA1CisjZGVmaW5lIFQxX05VTUNUWFNfWkMgIDkKKyNkZWZpbmUgVDFfTlVNQ1RYU19TQyAgNQogI2RlZmluZSBUMV9OVU1DVFhTX01BRyAzCiAjZGVmaW5lIFQxX05VTUNUWFNfQUdHIDEKICNkZWZpbmUgVDFfTlVNQ1RYU19VTkkgMQogCi0jZGVmaW5lIFQxX0NUWE5PX1pDIDAKLSNkZWZpbmUgVDFfQ1RYTk9fU0MgKFQxX0NUWE5PX1pDK1QxX05VTUNUWFNfWkMpCisjZGVmaW5lIFQxX0NUWE5PX1pDICAwCisjZGVmaW5lIFQxX0NUWE5PX1NDICAoVDFfQ1RYTk9fWkMrVDFfTlVNQ1RYU19aQykKICNkZWZpbmUgVDFfQ1RYTk9fTUFHIChUMV9DVFhOT19TQytUMV9OVU1DVFhTX1NDKQogI2RlZmluZSBUMV9DVFhOT19BR0cgKFQxX0NUWE5PX01BRytUMV9OVU1DVFhTX01BRykKICNkZWZpbmUgVDFfQ1RYTk9fVU5JIChUMV9DVFhOT19BR0crVDFfTlVNQ1RYU19BR0cpCi0jZGVmaW5lIFQxX05VTUNUWFMgKFQxX0NUWE5PX1VOSStUMV9OVU1DVFhTX1VOSSkKKyNkZWZpbmUgVDFfTlVNQ1RYUyAgIChUMV9DVFhOT19VTkkrVDFfTlVNQ1RYU19VTkkpCiAKICNkZWZpbmUgVDFfTk1TRURFQ19GUkFDQklUUyAoVDFfTk1TRURFQ19CSVRTLTEpCiAKLSNkZWZpbmUgVDFfVFlQRV9NUSAwCS8qKjwgTm9ybWFsIGNvZGluZyB1c2luZyBlbnRyb3B5IGNvZGVyICovCi0jZGVmaW5lIFQxX1RZUEVfUkFXIDEJLyoqPCBObyBlbmNvZGluZyB0aGUgaW5mb3JtYXRpb24gaXMgc3RvcmUgdW5kZXIgcmF3IGZvcm1hdCBpbiBjb2Rlc3RyZWFtIChtb2RlIHN3aXRjaCBSQVcpKi8KKyNkZWZpbmUgVDFfVFlQRV9NUSAwICAgIC8qKjwgTm9ybWFsIGNvZGluZyB1c2luZyBlbnRyb3B5IGNvZGVyICovCisjZGVmaW5lIFQxX1RZUEVfUkFXIDEgICAvKio8IE5vIGVuY29kaW5nIHRoZSBpbmZvcm1hdGlvbiBpcyBzdG9yZSB1bmRlciByYXcgZm9ybWF0IGluIGNvZGVzdHJlYW0gKG1vZGUgc3dpdGNoIFJBVykqLworCisvKiBCRUdJTk5JTkcgb2YgZmxhZ3MgdGhhdCBhcHBseSB0byBvcGpfZmxhZ190ICovCisvKiogV2UgaG9sZCB0aGUgc3RhdGUgb2YgaW5kaXZpZHVhbCBkYXRhIHBvaW50cyBmb3IgdGhlIFQxIGVuY29kZXIgdXNpbmcKKyAqICBhIHNpbmdsZSAzMi1iaXQgZmxhZ3Mgd29yZCB0byBob2xkIHRoZSBzdGF0ZSBvZiA0IGRhdGEgcG9pbnRzLiAgVGhpcyBjb3JyZXNwb25kcworICogIHRvIHRoZSA0LXBvaW50LWhpZ2ggY29sdW1ucyB0aGF0IHRoZSBkYXRhIGlzIHByb2Nlc3NlZCBpbi4KKyAqCisgKiAgVGhlc2UgXCNkZWZpbmVzIGRlY2xhcmUgdGhlIGxheW91dCBvZiBhIDMyLWJpdCBmbGFncyB3b3JkLgorICoKKyAqICBUaGlzIGlzIGN1cnJlbnRseSBkb25lIGZvciBlbmNvZGluZyBvbmx5LgorICogIFRoZSB2YWx1ZXMgbXVzdCBOT1QgYmUgY2hhbmdlZCwgb3RoZXJ3aXNlIHRoaXMgaXMgZ29pbmcgdG8gYnJlYWsgYSBsb3Qgb2YKKyAqICBhc3N1bXB0aW9ucy4KKyAqLworCisvKiBTSUdNQTogc2lnbmlmaWNhbmNlIHN0YXRlICgzIGNvbHMgeCA2IHJvd3MpCisgKiBDSEk6ICAgc3RhdGUgZm9yIG5lZ2F0aXZlIHNhbXBsZSB2YWx1ZSAoMSBjb2wgeCA2IHJvd3MpCisgKiBNVTogICAgc3RhdGUgZm9yIHZpc2l0ZWQgaW4gcmVmaW5lbWVudCBwYXNzICgxIGNvbCB4IDQgcm93cykKKyAqIFBJOiAgICBzdGF0ZSBmb3IgdmlzaXRlZCBpbiBzaWduaWZpY2FuY2UgcGFzcyAoMSBjb2wgKiA0IHJvd3MpCisgKi8KKworI2RlZmluZSBUMV9TSUdNQV8wICAoMVUgPDwgMCkKKyNkZWZpbmUgVDFfU0lHTUFfMSAgKDFVIDw8IDEpCisjZGVmaW5lIFQxX1NJR01BXzIgICgxVSA8PCAyKQorI2RlZmluZSBUMV9TSUdNQV8zICAoMVUgPDwgMykKKyNkZWZpbmUgVDFfU0lHTUFfNCAgKDFVIDw8IDQpCisjZGVmaW5lIFQxX1NJR01BXzUgICgxVSA8PCA1KQorI2RlZmluZSBUMV9TSUdNQV82ICAoMVUgPDwgNikKKyNkZWZpbmUgVDFfU0lHTUFfNyAgKDFVIDw8IDcpCisjZGVmaW5lIFQxX1NJR01BXzggICgxVSA8PCA4KQorI2RlZmluZSBUMV9TSUdNQV85ICAoMVUgPDwgOSkKKyNkZWZpbmUgVDFfU0lHTUFfMTAgKDFVIDw8IDEwKQorI2RlZmluZSBUMV9TSUdNQV8xMSAoMVUgPDwgMTEpCisjZGVmaW5lIFQxX1NJR01BXzEyICgxVSA8PCAxMikKKyNkZWZpbmUgVDFfU0lHTUFfMTMgKDFVIDw8IDEzKQorI2RlZmluZSBUMV9TSUdNQV8xNCAoMVUgPDwgMTQpCisjZGVmaW5lIFQxX1NJR01BXzE1ICgxVSA8PCAxNSkKKyNkZWZpbmUgVDFfU0lHTUFfMTYgKDFVIDw8IDE2KQorI2RlZmluZSBUMV9TSUdNQV8xNyAoMVUgPDwgMTcpCisKKyNkZWZpbmUgVDFfQ0hJXzAgICAgKDFVIDw8IDE4KQorI2RlZmluZSBUMV9DSElfMF9JICAxOAorI2RlZmluZSBUMV9DSElfMSAgICAoMVUgPDwgMTkpCisjZGVmaW5lIFQxX0NISV8xX0kgIDE5CisjZGVmaW5lIFQxX01VXzAgICAgICgxVSA8PCAyMCkKKyNkZWZpbmUgVDFfUElfMCAgICAgKDFVIDw8IDIxKQorI2RlZmluZSBUMV9DSElfMiAgICAoMVUgPDwgMjIpCisjZGVmaW5lIFQxX0NISV8yX0kgIDIyCisjZGVmaW5lIFQxX01VXzEgICAgICgxVSA8PCAyMykKKyNkZWZpbmUgVDFfUElfMSAgICAgKDFVIDw8IDI0KQorI2RlZmluZSBUMV9DSElfMyAgICAoMVUgPDwgMjUpCisjZGVmaW5lIFQxX01VXzIgICAgICgxVSA8PCAyNikKKyNkZWZpbmUgVDFfUElfMiAgICAgKDFVIDw8IDI3KQorI2RlZmluZSBUMV9DSElfNCAgICAoMVUgPDwgMjgpCisjZGVmaW5lIFQxX01VXzMgICAgICgxVSA8PCAyOSkKKyNkZWZpbmUgVDFfUElfMyAgICAgKDFVIDw8IDMwKQorI2RlZmluZSBUMV9DSElfNSAgICAoMVUgPDwgMzEpCisjZGVmaW5lIFQxX0NISV81X0kgIDMxCisKKy8qKiBBcyBhbiBleGFtcGxlLCB0aGUgYml0cyBUMV9TSUdNQV8zLCBUMV9TSUdNQV80IGFuZCBUMV9TSUdNQV81CisgKiAgaW5kaWNhdGUgdGhlIHNpZ25pZmljYW5jZSBzdGF0ZSBvZiB0aGUgd2VzdCBuZWlnaGJvdXIgb2YgZGF0YSBwb2ludCB6ZXJvCisgKiAgb2Ygb3VyIGZvdXIsIHRoZSBwb2ludCBpdHNlbGYsIGFuZCBpdHMgZWFzdCBuZWlnaGJvdXIgcmVzcGVjdGl2ZWx5LgorICogIE1hbnkgb2YgdGhlIGJpdHMgYXJlIGFycmFuZ2VkIHNvIHRoYXQgZ2l2ZW4gYSBmbGFncyB3b3JkLCB5b3UgY2FuCisgKiAgbG9vayBhdCB0aGUgdmFsdWVzIGZvciB0aGUgZGF0YSBwb2ludCAwLCB0aGVuIHNoaWZ0IHRoZSBmbGFncworICogIHdvcmQgcmlnaHQgYnkgMyBiaXRzIGFuZCBsb29rIGF0IHRoZSBzYW1lIGJpdCBwb3NpdGlvbnMgdG8gc2VlIHRoZQorICogIHZhbHVlcyBmb3IgZGF0YSBwb2ludCAxLgorICoKKyAqICBUaGUgXCNkZWZpbmVzIGJlbG93IGhlbHAgYSBiaXQgd2l0aCB0aGlzOyBzYXkgeW91IGhhdmUgYSBmbGFncyB3b3JkCisgKiAgZiwgeW91IGNhbiBkbyB0aGluZ3MgbGlrZQorICoKKyAqICAoZiAmIFQxX1NJR01BX1RISVMpCisgKgorICogIHRvIHNlZSB0aGUgc2lnbmlmaWNhbmNlIGJpdCBvZiBkYXRhIHBvaW50IDAsIHRoZW4gZG8KKyAqCisgKiAgKChmID4+IDMpICYgVDFfU0lHTUFfVEhJUykKKyAqCisgKiAgdG8gc2VlIHRoZSBzaWduaWZpY2FuY2UgYml0IG9mIGRhdGEgcG9pbnQgMS4KKyAqLworCisjZGVmaW5lIFQxX1NJR01BX05XICAgVDFfU0lHTUFfMAorI2RlZmluZSBUMV9TSUdNQV9OICAgIFQxX1NJR01BXzEKKyNkZWZpbmUgVDFfU0lHTUFfTkUgICBUMV9TSUdNQV8yCisjZGVmaW5lIFQxX1NJR01BX1cgICAgVDFfU0lHTUFfMworI2RlZmluZSBUMV9TSUdNQV9USElTIFQxX1NJR01BXzQKKyNkZWZpbmUgVDFfU0lHTUFfRSAgICBUMV9TSUdNQV81CisjZGVmaW5lIFQxX1NJR01BX1NXICAgVDFfU0lHTUFfNgorI2RlZmluZSBUMV9TSUdNQV9TICAgIFQxX1NJR01BXzcKKyNkZWZpbmUgVDFfU0lHTUFfU0UgICBUMV9TSUdNQV84CisjZGVmaW5lIFQxX1NJR01BX05FSUdIQk9VUlMgKFQxX1NJR01BX05XIHwgVDFfU0lHTUFfTiB8IFQxX1NJR01BX05FIHwgVDFfU0lHTUFfVyB8IFQxX1NJR01BX0UgfCBUMV9TSUdNQV9TVyB8IFQxX1NJR01BX1MgfCBUMV9TSUdNQV9TRSkKKworI2RlZmluZSBUMV9DSElfVEhJUyAgIFQxX0NISV8xCisjZGVmaW5lIFQxX0NISV9USElTX0kgVDFfQ0hJXzFfSQorI2RlZmluZSBUMV9NVV9USElTICAgIFQxX01VXzAKKyNkZWZpbmUgVDFfUElfVEhJUyAgICBUMV9QSV8wCisjZGVmaW5lIFQxX0NISV9TICAgICAgVDFfQ0hJXzIKKworI2RlZmluZSBUMV9MVVRfU0dOX1cgKDFVIDw8IDApCisjZGVmaW5lIFQxX0xVVF9TSUdfTiAoMVUgPDwgMSkKKyNkZWZpbmUgVDFfTFVUX1NHTl9FICgxVSA8PCAyKQorI2RlZmluZSBUMV9MVVRfU0lHX1cgKDFVIDw8IDMpCisjZGVmaW5lIFQxX0xVVF9TR05fTiAoMVUgPDwgNCkKKyNkZWZpbmUgVDFfTFVUX1NJR19FICgxVSA8PCA1KQorI2RlZmluZSBUMV9MVVRfU0dOX1MgKDFVIDw8IDYpCisjZGVmaW5lIFQxX0xVVF9TSUdfUyAoMVUgPDwgNykKKy8qIEVORCBvZiBmbGFncyB0aGF0IGFwcGx5IHRvIG9wal9mbGFnX3QgKi8KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotdHlwZWRlZiBPUEpfSU5UMTYgb3BqX2ZsYWdfdDsKKy8qKiBGbGFncyBmb3IgNCBjb25zZWN1dGl2ZSByb3dzIG9mIGEgY29sdW1uICovCit0eXBlZGVmIE9QSl9VSU5UMzIgb3BqX2ZsYWdfdDsKIAogLyoqCiBUaWVyLTEgY29kaW5nIChjb2Rpbmcgb2YgY29kZS1ibG9jayBjb2VmZmljaWVudHMpCiAqLwogdHlwZWRlZiBzdHJ1Y3Qgb3BqX3QxIHsKIAotCS8qKiBNUUMgY29tcG9uZW50ICovCi0Jb3BqX21xY190ICptcWM7Ci0JLyoqIFJBVyBjb21wb25lbnQgKi8KLQlvcGpfcmF3X3QgKnJhdzsKKyAgICAvKiogTVFDIGNvbXBvbmVudCAqLworICAgIG9wal9tcWNfdCBtcWM7CiAKLQlPUEpfSU5UMzIgICpkYXRhOwotCW9wal9mbGFnX3QgKmZsYWdzOwotCU9QSl9VSU5UMzIgdzsKLQlPUEpfVUlOVDMyIGg7Ci0JT1BKX1VJTlQzMiBkYXRhc2l6ZTsKLQlPUEpfVUlOVDMyIGZsYWdzc2l6ZTsKLQlPUEpfVUlOVDMyIGZsYWdzX3N0cmlkZTsKLQlPUEpfVUlOVDMyIGRhdGFfc3RyaWRlOwotCU9QSl9CT09MICAgZW5jb2RlcjsKKyAgICBPUEpfSU5UMzIgICpkYXRhOworICAgIC8qKiBGbGFncyB1c2VkIGJ5IGRlY29kZXIgYW5kIGVuY29kZXIuCisgICAgICogU3VjaCB0aGF0IGZsYWdzWzErMF0gaXMgZm9yIHN0YXRlIG9mIGNvbD0wLHJvdz0wLi4zLAorICAgICAgIGZsYWdzWzErMV0gZm9yIGNvbD0xLCByb3c9MC4uMywgZmxhZ3NbMStmbGFnc19zdHJpZGVdIGZvciBjb2w9MCxyb3c9NC4uNywgLi4uCisgICAgICAgVGhpcyBhcnJheSBhdm9pZHMgdG9vIG11Y2ggY2FjaGUgdHJhc2hpbmcgd2hlbiBwcm9jZXNzaW5nIGJ5IDQgdmVydGljYWwgc2FtcGxlcworICAgICAgIGFzIGRvbmUgaW4gdGhlIHZhcmlvdXMgZGVjb2Rpbmcgc3RlcHMuICovCisgICAgb3BqX2ZsYWdfdCAqZmxhZ3M7CisKKyAgICBPUEpfVUlOVDMyIHc7CisgICAgT1BKX1VJTlQzMiBoOworICAgIE9QSl9VSU5UMzIgZGF0YXNpemU7CisgICAgT1BKX1VJTlQzMiBmbGFnc3NpemU7CisgICAgT1BKX1VJTlQzMiBkYXRhX3N0cmlkZTsKKyAgICBPUEpfQk9PTCAgIGVuY29kZXI7CisKKyAgICAvKiBUaHJlIDMgdmFyaWFibGVzIGJlbG93IGFyZSBvbmx5IHVzZWQgYnkgdGhlIGRlY29kZXIgKi8KKyAgICAvKiBzZXQgdG8gVFJVRSBpbiBtdWx0aXRocmVhZGVkIGNvbnRleHQgKi8KKyAgICBPUEpfQk9PTCAgICAgbXVzdHVzZV9jYmxrZGF0YWJ1ZmZlcjsKKyAgICAvKiBUZW1wb3JhcnkgYnVmZmVyIHRvIGNvbmNhdGVuYXRlIGFsbCBjaHVua3Mgb2YgYSBjb2RlYm9jayAqLworICAgIE9QSl9CWVRFICAgICpjYmxrZGF0YWJ1ZmZlcjsKKyAgICAvKiBNYXhpbXVtIHNpemUgYXZhaWxhYmxlIGluIGNibGtkYXRhYnVmZmVyICovCisgICAgT1BKX1VJTlQzMiAgIGNibGtkYXRhYnVmZmVyc2l6ZTsKIH0gb3BqX3QxX3Q7CiAKLSNkZWZpbmUgTUFDUk9fdDFfZmxhZ3MoeCx5KSB0MS0+ZmxhZ3NbKCh4KSoodDEtPmZsYWdzX3N0cmlkZSkpKyh5KV0KLQogLyoqIEBuYW1lIEV4cG9ydGVkIGZ1bmN0aW9ucyAqLwogLypAeyovCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTI4LDIxICsyMjIsMjkgQEAKIEBwYXJhbSBtY3Rfbm9ybXMgIEZJWE1FIERPQwogQHBhcmFtIG1jdF9udW1jb21wcyBOdW1iZXIgb2YgY29tcG9uZW50cyB1c2VkIGZvciBNQ1QKICovCi1PUEpfQk9PTCBvcGpfdDFfZW5jb2RlX2NibGtzKCAgIG9wal90MV90ICp0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlX3QgKnRpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y3BfdCAqdGNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfRkxPQVQ2NCAqIG1jdF9ub3JtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBtY3RfbnVtY29tcHMpOworT1BKX0JPT0wgb3BqX3QxX2VuY29kZV9jYmxrcyhvcGpfdDFfdCAqdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICp0aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKnRjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1BKX0ZMT0FUNjQgKiBtY3Rfbm9ybXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbWN0X251bWNvbXBzKTsKIAogLyoqCiBEZWNvZGUgdGhlIGNvZGUtYmxvY2tzIG9mIGEgdGlsZQotQHBhcmFtIHQxIFQxIGhhbmRsZQorQHBhcmFtIHRjZCBUQ0QgaGFuZGxlCitAcGFyYW0gcHJldCBQb2ludGVyIHRvIHJldHVybiB2YWx1ZQogQHBhcmFtIHRpbGVjIFRoZSB0aWxlIHRvIGRlY29kZQogQHBhcmFtIHRjY3AgVGlsZSBjb2RpbmcgcGFyYW1ldGVycworQHBhcmFtIHBfbWFuYWdlciB0aGUgZXZlbnQgbWFuYWdlcgorQHBhcmFtIHBfbWFuYWdlcl9tdXRleCBtdXRleCBmb3IgdGhlIGV2ZW50IG1hbmFnZXIKK0BwYXJhbSBjaGVja19wdGVybSB3aGV0aGVyIFBURVJNIGNvcnJlY3QgdGVybWluYXRpb24gc2hvdWxkIGJlIGNoZWNrZWQKICovCi1PUEpfQk9PTCBvcGpfdDFfZGVjb2RlX2NibGtzKCAgIG9wal90MV90KiB0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlY29tcF90KiB0aWxlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjY3BfdCogdGNjcCk7Cit2b2lkIG9wal90MV9kZWNvZGVfY2Jsa3Mob3BqX3RjZF90KiB0Y2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgT1BKX0JPT0wqIHByZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlY29tcF90KiB0aWxlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNjcF90KiB0Y2NwLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9tdXRleF90KiBwX21hbmFnZXJfbXV0ZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JPT0wgY2hlY2tfcHRlcm0pOwogCiAKIApAQCAtMTY0LDQgKzI2Niw0IEBACiAKIC8qQH0qLwogCi0jZW5kaWYgLyogX19UMV9IICovCisjZW5kaWYgLyogT1BKX1QxX0ggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdDFfZ2VuZXJhdGVfbHV0cy5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90MV9nZW5lcmF0ZV9sdXRzLmMKaW5kZXggMTk5N2QzOS4uOWFkNmYyMCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90MV9nZW5lcmF0ZV9sdXRzLmMKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90MV9nZW5lcmF0ZV9sdXRzLmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCiAgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCiAgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCiAgKgpAQCAtOCwxMCArOCwxMSBAQAogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQogICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMsIERhdmlkIEphbnNzZW5zCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgWWFubmljayBWZXJzY2h1ZXJlbgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4IAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQogICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDcsIENhbGx1bSBMZXJ3aWNrIDxzZWdAaGF4eGVkLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAxMiwgQ2FybCBIZXRoZXJpbmd0b24KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zOCwyNDUgKzM5LDI3MyBAQAogCiAjaW5jbHVkZSAib3BqX2luY2x1ZGVzLmgiCiAKLXN0YXRpYyBpbnQgdDFfaW5pdF9jdHhub196YyhpbnQgZiwgaW50IG9yaWVudCkgewotCWludCBoLCB2LCBkLCBuLCB0LCBodjsKLQluID0gMDsKLQloID0gKChmICYgVDFfU0lHX1cpICE9IDApICsgKChmICYgVDFfU0lHX0UpICE9IDApOwotCXYgPSAoKGYgJiBUMV9TSUdfTikgIT0gMCkgKyAoKGYgJiBUMV9TSUdfUykgIT0gMCk7Ci0JZCA9ICgoZiAmIFQxX1NJR19OVykgIT0gMCkgKyAoKGYgJiBUMV9TSUdfTkUpICE9IDApICsgKChmICYgVDFfU0lHX1NFKSAhPSAwKSArICgoZiAmIFQxX1NJR19TVykgIT0gMCk7CitzdGF0aWMgaW50IHQxX2luaXRfY3R4bm9femMoT1BKX1VJTlQzMiBmLCBPUEpfVUlOVDMyIG9yaWVudCkKK3sKKyAgICBpbnQgaCwgdiwgZCwgbiwgdCwgaHY7CisgICAgbiA9IDA7CisgICAgaCA9ICgoZiAmIFQxX1NJR01BXzMpICE9IDApICsgKChmICYgVDFfU0lHTUFfNSkgIT0gMCk7CisgICAgdiA9ICgoZiAmIFQxX1NJR01BXzEpICE9IDApICsgKChmICYgVDFfU0lHTUFfNykgIT0gMCk7CisgICAgZCA9ICgoZiAmIFQxX1NJR01BXzApICE9IDApICsgKChmICYgVDFfU0lHTUFfMikgIT0gMCkgKyAoKAorICAgICAgICAgICAgICAgIGYgJiBUMV9TSUdNQV84KSAhPSAwKSArICgoZiAmIFQxX1NJR01BXzYpICE9IDApOwogCi0Jc3dpdGNoIChvcmllbnQpIHsKLQkJY2FzZSAyOgotCQkJdCA9IGg7Ci0JCQloID0gdjsKLQkJCXYgPSB0OwotCQljYXNlIDA6Ci0JCWNhc2UgMToKLQkJCWlmICghaCkgewotCQkJCWlmICghdikgewotCQkJCQlpZiAoIWQpCi0JCQkJCQluID0gMDsKLQkJCQkJZWxzZSBpZiAoZCA9PSAxKQotCQkJCQkJbiA9IDE7Ci0JCQkJCWVsc2UKLQkJCQkJCW4gPSAyOwotCQkJCX0gZWxzZSBpZiAodiA9PSAxKSB7Ci0JCQkJCW4gPSAzOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW4gPSA0OwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoaCA9PSAxKSB7Ci0JCQkJaWYgKCF2KSB7Ci0JCQkJCWlmICghZCkKLQkJCQkJCW4gPSA1OwotCQkJCQllbHNlCi0JCQkJCQluID0gNjsKLQkJCQl9IGVsc2UgewotCQkJCQluID0gNzsKLQkJCQl9Ci0JCQl9IGVsc2UKLQkJCQluID0gODsKLQkJCWJyZWFrOwotCQljYXNlIDM6Ci0JCQlodiA9IGggKyB2OwotCQkJaWYgKCFkKSB7Ci0JCQkJaWYgKCFodikgewotCQkJCQluID0gMDsKLQkJCQl9IGVsc2UgaWYgKGh2ID09IDEpIHsKLQkJCQkJbiA9IDE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbiA9IDI7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChkID09IDEpIHsKLQkJCQlpZiAoIWh2KSB7Ci0JCQkJCW4gPSAzOwotCQkJCX0gZWxzZSBpZiAoaHYgPT0gMSkgewotCQkJCQluID0gNDsKLQkJCQl9IGVsc2UgewotCQkJCQluID0gNTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGQgPT0gMikgewotCQkJCWlmICghaHYpIHsKLQkJCQkJbiA9IDY7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJbiA9IDc7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQluID0gODsKLQkJCX0KLQkJCWJyZWFrOwotCX0KKyAgICBzd2l0Y2ggKG9yaWVudCkgeworICAgIGNhc2UgMjoKKyAgICAgICAgdCA9IGg7CisgICAgICAgIGggPSB2OworICAgICAgICB2ID0gdDsKKyAgICBjYXNlIDA6CisgICAgY2FzZSAxOgorICAgICAgICBpZiAoIWgpIHsKKyAgICAgICAgICAgIGlmICghdikgeworICAgICAgICAgICAgICAgIGlmICghZCkgeworICAgICAgICAgICAgICAgICAgICBuID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGQgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBuID0gMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBuID0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHYgPT0gMSkgeworICAgICAgICAgICAgICAgIG4gPSAzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuID0gNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChoID09IDEpIHsKKyAgICAgICAgICAgIGlmICghdikgeworICAgICAgICAgICAgICAgIGlmICghZCkgeworICAgICAgICAgICAgICAgICAgICBuID0gNTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBuID0gNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG4gPSA3OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbiA9IDg7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICBodiA9IGggKyB2OworICAgICAgICBpZiAoIWQpIHsKKyAgICAgICAgICAgIGlmICghaHYpIHsKKyAgICAgICAgICAgICAgICBuID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaHYgPT0gMSkgeworICAgICAgICAgICAgICAgIG4gPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChkID09IDEpIHsKKyAgICAgICAgICAgIGlmICghaHYpIHsKKyAgICAgICAgICAgICAgICBuID0gMzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaHYgPT0gMSkgeworICAgICAgICAgICAgICAgIG4gPSA0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuID0gNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChkID09IDIpIHsKKyAgICAgICAgICAgIGlmICghaHYpIHsKKyAgICAgICAgICAgICAgICBuID0gNjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbiA9IDc7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuID0gODsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CiAKLQlyZXR1cm4gKFQxX0NUWE5PX1pDICsgbik7CisgICAgcmV0dXJuIChUMV9DVFhOT19aQyArIG4pOwogfQogCi1zdGF0aWMgaW50IHQxX2luaXRfY3R4bm9fc2MoaW50IGYpIHsKLQlpbnQgaGMsIHZjLCBuOwotCW4gPSAwOworc3RhdGljIGludCB0MV9pbml0X2N0eG5vX3NjKE9QSl9VSU5UMzIgZikKK3sKKyAgICBpbnQgaGMsIHZjLCBuOworICAgIG4gPSAwOwogCi0JaGMgPSBvcGpfaW50X21pbigoKGYgJiAoVDFfU0lHX0UgfCBUMV9TR05fRSkpID09Ci0JCQkJVDFfU0lHX0UpICsgKChmICYgKFQxX1NJR19XIHwgVDFfU0dOX1cpKSA9PSBUMV9TSUdfVyksCi0JCQkxKSAtIG9wal9pbnRfbWluKCgoZiAmIChUMV9TSUdfRSB8IFQxX1NHTl9FKSkgPT0KLQkJCQkJKFQxX1NJR19FIHwgVDFfU0dOX0UpKSArCi0JCQkJKChmICYgKFQxX1NJR19XIHwgVDFfU0dOX1cpKSA9PQotCQkJCSAoVDFfU0lHX1cgfCBUMV9TR05fVykpLCAxKTsKKyAgICBoYyA9IG9wal9pbnRfbWluKCgoZiAmIChUMV9MVVRfU0lHX0UgfCBUMV9MVVRfU0dOX0UpKSA9PQorICAgICAgICAgICAgICAgICAgICAgIFQxX0xVVF9TSUdfRSkgKyAoKGYgJiAoVDFfTFVUX1NJR19XIHwgVDFfTFVUX1NHTl9XKSkgPT0gVDFfTFVUX1NJR19XKSwKKyAgICAgICAgICAgICAgICAgICAgIDEpIC0gb3BqX2ludF9taW4oKChmICYgKFQxX0xVVF9TSUdfRSB8IFQxX0xVVF9TR05fRSkpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVDFfTFVUX1NJR19FIHwgVDFfTFVUX1NHTl9FKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGYgJiAoVDFfTFVUX1NJR19XIHwgVDFfTFVUX1NHTl9XKSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUMV9MVVRfU0lHX1cgfCBUMV9MVVRfU0dOX1cpKSwgMSk7CiAKLQl2YyA9IG9wal9pbnRfbWluKCgoZiAmIChUMV9TSUdfTiB8IFQxX1NHTl9OKSkgPT0KLQkJCQlUMV9TSUdfTikgKyAoKGYgJiAoVDFfU0lHX1MgfCBUMV9TR05fUykpID09IFQxX1NJR19TKSwKLQkJCTEpIC0gb3BqX2ludF9taW4oKChmICYgKFQxX1NJR19OIHwgVDFfU0dOX04pKSA9PQotCQkJCQkoVDFfU0lHX04gfCBUMV9TR05fTikpICsKLQkJCQkoKGYgJiAoVDFfU0lHX1MgfCBUMV9TR05fUykpID09Ci0JCQkJIChUMV9TSUdfUyB8IFQxX1NHTl9TKSksIDEpOworICAgIHZjID0gb3BqX2ludF9taW4oKChmICYgKFQxX0xVVF9TSUdfTiB8IFQxX0xVVF9TR05fTikpID09CisgICAgICAgICAgICAgICAgICAgICAgVDFfTFVUX1NJR19OKSArICgoZiAmIChUMV9MVVRfU0lHX1MgfCBUMV9MVVRfU0dOX1MpKSA9PSBUMV9MVVRfU0lHX1MpLAorICAgICAgICAgICAgICAgICAgICAgMSkgLSBvcGpfaW50X21pbigoKGYgJiAoVDFfTFVUX1NJR19OIHwgVDFfTFVUX1NHTl9OKSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUMV9MVVRfU0lHX04gfCBUMV9MVVRfU0dOX04pKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZiAmIChUMV9MVVRfU0lHX1MgfCBUMV9MVVRfU0dOX1MpKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFQxX0xVVF9TSUdfUyB8IFQxX0xVVF9TR05fUykpLCAxKTsKIAotCWlmIChoYyA8IDApIHsKLQkJaGMgPSAtaGM7Ci0JCXZjID0gLXZjOwotCX0KLQlpZiAoIWhjKSB7Ci0JCWlmICh2YyA9PSAtMSkKLQkJCW4gPSAxOwotCQllbHNlIGlmICghdmMpCi0JCQluID0gMDsKLQkJZWxzZQotCQkJbiA9IDE7Ci0JfSBlbHNlIGlmIChoYyA9PSAxKSB7Ci0JCWlmICh2YyA9PSAtMSkKLQkJCW4gPSAyOwotCQllbHNlIGlmICghdmMpCi0JCQluID0gMzsKLQkJZWxzZQotCQkJbiA9IDQ7Ci0JfQorICAgIGlmIChoYyA8IDApIHsKKyAgICAgICAgaGMgPSAtaGM7CisgICAgICAgIHZjID0gLXZjOworICAgIH0KKyAgICBpZiAoIWhjKSB7CisgICAgICAgIGlmICh2YyA9PSAtMSkgeworICAgICAgICAgICAgbiA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAoIXZjKSB7CisgICAgICAgICAgICBuID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG4gPSAxOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChoYyA9PSAxKSB7CisgICAgICAgIGlmICh2YyA9PSAtMSkgeworICAgICAgICAgICAgbiA9IDI7CisgICAgICAgIH0gZWxzZSBpZiAoIXZjKSB7CisgICAgICAgICAgICBuID0gMzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG4gPSA0OworICAgICAgICB9CisgICAgfQogCi0JcmV0dXJuIChUMV9DVFhOT19TQyArIG4pOworICAgIHJldHVybiAoVDFfQ1RYTk9fU0MgKyBuKTsKIH0KIAotc3RhdGljIGludCB0MV9pbml0X3NwYihpbnQgZikgewotCWludCBoYywgdmMsIG47CitzdGF0aWMgaW50IHQxX2luaXRfc3BiKE9QSl9VSU5UMzIgZikKK3sKKyAgICBpbnQgaGMsIHZjLCBuOwogCi0JaGMgPSBvcGpfaW50X21pbigoKGYgJiAoVDFfU0lHX0UgfCBUMV9TR05fRSkpID09Ci0JCQkJVDFfU0lHX0UpICsgKChmICYgKFQxX1NJR19XIHwgVDFfU0dOX1cpKSA9PSBUMV9TSUdfVyksCi0JCQkxKSAtIG9wal9pbnRfbWluKCgoZiAmIChUMV9TSUdfRSB8IFQxX1NHTl9FKSkgPT0KLQkJCQkJKFQxX1NJR19FIHwgVDFfU0dOX0UpKSArCi0JCQkJKChmICYgKFQxX1NJR19XIHwgVDFfU0dOX1cpKSA9PQotCQkJCSAoVDFfU0lHX1cgfCBUMV9TR05fVykpLCAxKTsKKyAgICBoYyA9IG9wal9pbnRfbWluKCgoZiAmIChUMV9MVVRfU0lHX0UgfCBUMV9MVVRfU0dOX0UpKSA9PQorICAgICAgICAgICAgICAgICAgICAgIFQxX0xVVF9TSUdfRSkgKyAoKGYgJiAoVDFfTFVUX1NJR19XIHwgVDFfTFVUX1NHTl9XKSkgPT0gVDFfTFVUX1NJR19XKSwKKyAgICAgICAgICAgICAgICAgICAgIDEpIC0gb3BqX2ludF9taW4oKChmICYgKFQxX0xVVF9TSUdfRSB8IFQxX0xVVF9TR05fRSkpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVDFfTFVUX1NJR19FIHwgVDFfTFVUX1NHTl9FKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGYgJiAoVDFfTFVUX1NJR19XIHwgVDFfTFVUX1NHTl9XKSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUMV9MVVRfU0lHX1cgfCBUMV9MVVRfU0dOX1cpKSwgMSk7CiAKLQl2YyA9IG9wal9pbnRfbWluKCgoZiAmIChUMV9TSUdfTiB8IFQxX1NHTl9OKSkgPT0KLQkJCQlUMV9TSUdfTikgKyAoKGYgJiAoVDFfU0lHX1MgfCBUMV9TR05fUykpID09IFQxX1NJR19TKSwKLQkJCTEpIC0gb3BqX2ludF9taW4oKChmICYgKFQxX1NJR19OIHwgVDFfU0dOX04pKSA9PQotCQkJCQkoVDFfU0lHX04gfCBUMV9TR05fTikpICsKLQkJCQkoKGYgJiAoVDFfU0lHX1MgfCBUMV9TR05fUykpID09Ci0JCQkJIChUMV9TSUdfUyB8IFQxX1NHTl9TKSksIDEpOworICAgIHZjID0gb3BqX2ludF9taW4oKChmICYgKFQxX0xVVF9TSUdfTiB8IFQxX0xVVF9TR05fTikpID09CisgICAgICAgICAgICAgICAgICAgICAgVDFfTFVUX1NJR19OKSArICgoZiAmIChUMV9MVVRfU0lHX1MgfCBUMV9MVVRfU0dOX1MpKSA9PSBUMV9MVVRfU0lHX1MpLAorICAgICAgICAgICAgICAgICAgICAgMSkgLSBvcGpfaW50X21pbigoKGYgJiAoVDFfTFVUX1NJR19OIHwgVDFfTFVUX1NHTl9OKSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUMV9MVVRfU0lHX04gfCBUMV9MVVRfU0dOX04pKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZiAmIChUMV9MVVRfU0lHX1MgfCBUMV9MVVRfU0dOX1MpKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFQxX0xVVF9TSUdfUyB8IFQxX0xVVF9TR05fUykpLCAxKTsKIAotCWlmICghaGMgJiYgIXZjKQotCQluID0gMDsKLQllbHNlCi0JCW4gPSAoIShoYyA+IDAgfHwgKCFoYyAmJiB2YyA+IDApKSk7CisgICAgaWYgKCFoYyAmJiAhdmMpIHsKKyAgICAgICAgbiA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbiA9ICghKGhjID4gMCB8fCAoIWhjICYmIHZjID4gMCkpKTsKKyAgICB9CiAKLQlyZXR1cm4gbjsKKyAgICByZXR1cm4gbjsKIH0KIAotc3RhdGljIHZvaWQgZHVtcF9hcnJheTE2KGludCBhcnJheVtdLGludCBzaXplKXsKLQlpbnQgaTsKLQktLXNpemU7Ci0JZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkgewotCQlwcmludGYoIjB4JTA0eCwgIiwgYXJyYXlbaV0pOwotCQlpZighKChpKzEpJjB4NykpCi0JCQlwcmludGYoIlxuICAiKTsKLQl9Ci0JcHJpbnRmKCIweCUwNHhcbn07XG5cbiIsIGFycmF5W3NpemVdKTsKK3N0YXRpYyB2b2lkIGR1bXBfYXJyYXkxNihpbnQgYXJyYXlbXSwgaW50IHNpemUpCit7CisgICAgaW50IGk7CisgICAgLS1zaXplOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKyAgICAgICAgcHJpbnRmKCIweCUwNHgsIiwgYXJyYXlbaV0pOworICAgICAgICBpZiAoISgoaSArIDEpICYgMHg3KSkgeworICAgICAgICAgICAgcHJpbnRmKCJcbiAgICAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiICIpOworICAgICAgICB9CisgICAgfQorICAgIHByaW50ZigiMHglMDR4XG59O1xuXG4iLCBhcnJheVtzaXplXSk7CiB9CiAKIGludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKLQlpbnQgaSwgajsKLQlkb3VibGUgdSwgdiwgdDsKKyAgICB1bnNpZ25lZCBpbnQgaSwgajsKKyAgICBkb3VibGUgdSwgdiwgdDsKIAotCWludCBsdXRfY3R4bm9femNbMTAyNF07Ci0JaW50IGx1dF9ubXNlZGVjX3NpZ1sxIDw8IFQxX05NU0VERUNfQklUU107Ci0JaW50IGx1dF9ubXNlZGVjX3NpZzBbMSA8PCBUMV9OTVNFREVDX0JJVFNdOwotCWludCBsdXRfbm1zZWRlY19yZWZbMSA8PCBUMV9OTVNFREVDX0JJVFNdOwotCWludCBsdXRfbm1zZWRlY19yZWYwWzEgPDwgVDFfTk1TRURFQ19CSVRTXTsKLSAgKHZvaWQpYXJnYzsgKHZvaWQpYXJndjsKKyAgICBpbnQgbHV0X2N0eG5vX3pjWzIwNDhdOworICAgIGludCBsdXRfbm1zZWRlY19zaWdbMSA8PCBUMV9OTVNFREVDX0JJVFNdOworICAgIGludCBsdXRfbm1zZWRlY19zaWcwWzEgPDwgVDFfTk1TRURFQ19CSVRTXTsKKyAgICBpbnQgbHV0X25tc2VkZWNfcmVmWzEgPDwgVDFfTk1TRURFQ19CSVRTXTsKKyAgICBpbnQgbHV0X25tc2VkZWNfcmVmMFsxIDw8IFQxX05NU0VERUNfQklUU107CisgICAgKHZvaWQpYXJnYzsKKyAgICAodm9pZClhcmd2OwogCi0JcHJpbnRmKCIvKiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHQxX2dlbmVyYXRlX2x1dHMuYyAqL1xuXG4iKTsKKyAgICBwcmludGYoIi8qIFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdDFfZ2VuZXJhdGVfbHV0cy5jICovXG5cbiIpOwogCi0JLyogbHV0X2N0eG5vX3pjICovCi0JZm9yIChqID0gMDsgaiA8IDQ7ICsraikgewotCQlmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKLQkJCWludCBvcmllbnQgPSBqOwotCQkJaWYgKG9yaWVudCA9PSAyKSB7Ci0JCQkJb3JpZW50ID0gMTsKLQkJCX0gZWxzZSBpZiAob3JpZW50ID09IDEpIHsKLQkJCQlvcmllbnQgPSAyOwotCQkJfQotCQkJbHV0X2N0eG5vX3pjWyhvcmllbnQgPDwgOCkgfCBpXSA9IHQxX2luaXRfY3R4bm9femMoaSwgaik7Ci0JCX0KLQl9CisgICAgLyogbHV0X2N0eG5vX3pjICovCisgICAgZm9yIChqID0gMDsgaiA8IDQ7ICsraikgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNTEyOyArK2kpIHsKKyAgICAgICAgICAgIE9QSl9VSU5UMzIgb3JpZW50ID0gajsKKyAgICAgICAgICAgIGlmIChvcmllbnQgPT0gMikgeworICAgICAgICAgICAgICAgIG9yaWVudCA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9yaWVudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgb3JpZW50ID0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGx1dF9jdHhub196Y1sob3JpZW50IDw8IDkpIHwgaV0gPSB0MV9pbml0X2N0eG5vX3pjKGksIGopOworICAgICAgICB9CisgICAgfQogCi0JcHJpbnRmKCJzdGF0aWMgT1BKX0JZVEUgbHV0X2N0eG5vX3pjWzEwMjRdID0ge1xuICAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgMTAyMzsgKytpKSB7Ci0JCXByaW50ZigiJWksICIsIGx1dF9jdHhub196Y1tpXSk7Ci0JCWlmKCEoKGkrMSkmMHgxZikpCi0JCQlwcmludGYoIlxuICAiKTsKLQl9Ci0JcHJpbnRmKCIlaVxufTtcblxuIiwgbHV0X2N0eG5vX3pjWzEwMjNdKTsKKyAgICBwcmludGYoInN0YXRpYyBjb25zdCBPUEpfQllURSBsdXRfY3R4bm9femNbMjA0OF0gPSB7XG4gICAgIik7CisgICAgZm9yIChpID0gMDsgaSA8IDIwNDc7ICsraSkgeworICAgICAgICBwcmludGYoIiVpLCIsIGx1dF9jdHhub196Y1tpXSk7CisgICAgICAgIGlmICghKChpICsgMSkgJiAweDFmKSkgeworICAgICAgICAgICAgcHJpbnRmKCJcbiAgICAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiICIpOworICAgICAgICB9CisgICAgfQorICAgIHByaW50ZigiJWlcbn07XG5cbiIsIGx1dF9jdHhub196Y1syMDQ3XSk7CiAKLQkvKiBsdXRfY3R4bm9fc2MgKi8KLQlwcmludGYoInN0YXRpYyBPUEpfQllURSBsdXRfY3R4bm9fc2NbMjU2XSA9IHtcbiAgIik7Ci0JZm9yIChpID0gMDsgaSA8IDI1NTsgKytpKSB7Ci0JCXByaW50ZigiMHgleCwgIiwgdDFfaW5pdF9jdHhub19zYyhpIDw8IDQpKTsKLQkJaWYoISgoaSsxKSYweGYpKQotCQkJcHJpbnRmKCJcbiAgIik7Ci0JfQotCXByaW50ZigiMHgleFxufTtcblxuIiwgdDFfaW5pdF9jdHhub19zYygyNTUgPDwgNCkpOworICAgIC8qIGx1dF9jdHhub19zYyAqLworICAgIHByaW50Zigic3RhdGljIGNvbnN0IE9QSl9CWVRFIGx1dF9jdHhub19zY1syNTZdID0ge1xuICAgICIpOworICAgIGZvciAoaSA9IDA7IGkgPCAyNTU7ICsraSkgeworICAgICAgICBwcmludGYoIjB4JXgsIiwgdDFfaW5pdF9jdHhub19zYyhpKSk7CisgICAgICAgIGlmICghKChpICsgMSkgJiAweGYpKSB7CisgICAgICAgICAgICBwcmludGYoIlxuICAgICIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRmKCIgIik7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJpbnRmKCIweCV4XG59O1xuXG4iLCB0MV9pbml0X2N0eG5vX3NjKDI1NSkpOwogCi0JLyogbHV0X3NwYiAqLwotCXByaW50Zigic3RhdGljIE9QSl9CWVRFIGx1dF9zcGJbMjU2XSA9IHtcbiAgIik7Ci0JZm9yIChpID0gMDsgaSA8IDI1NTsgKytpKSB7Ci0JCXByaW50ZigiJWksICIsIHQxX2luaXRfc3BiKGkgPDwgNCkpOwotCQlpZighKChpKzEpJjB4MWYpKQotCQkJcHJpbnRmKCJcbiAgIik7Ci0JfQotCXByaW50ZigiJWlcbn07XG5cbiIsIHQxX2luaXRfc3BiKDI1NSA8PCA0KSk7CisgICAgLyogbHV0X3NwYiAqLworICAgIHByaW50Zigic3RhdGljIGNvbnN0IE9QSl9CWVRFIGx1dF9zcGJbMjU2XSA9IHtcbiAgICAiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMjU1OyArK2kpIHsKKyAgICAgICAgcHJpbnRmKCIlaSwiLCB0MV9pbml0X3NwYihpKSk7CisgICAgICAgIGlmICghKChpICsgMSkgJiAweDFmKSkgeworICAgICAgICAgICAgcHJpbnRmKCJcbiAgICAiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW50ZigiICIpOworICAgICAgICB9CisgICAgfQorICAgIHByaW50ZigiJWlcbn07XG5cbiIsIHQxX2luaXRfc3BiKDI1NSkpOwogCi0JLyogRklYTUUgRklYTUUgRklYTUUgKi8KLQkvKiBmcHJpbnRmKHN0ZG91dCwibm1zZWRlYyBsdXRzOlxuIik7ICovCi0JZm9yIChpID0gMDsgaSA8ICgxIDw8IFQxX05NU0VERUNfQklUUyk7ICsraSkgewotCQl0ID0gaSAvIHBvdygyLCBUMV9OTVNFREVDX0ZSQUNCSVRTKTsKLQkJdSA9IHQ7Ci0JCXYgPSB0IC0gMS41OwotCQlsdXRfbm1zZWRlY19zaWdbaV0gPSAKLQkJCW9wal9pbnRfbWF4KDAsIAotCQkJCQkoaW50KSAoZmxvb3IoKHUgKiB1IC0gdiAqIHYpICogcG93KDIsIFQxX05NU0VERUNfRlJBQ0JJVFMpICsgMC41KSAvIHBvdygyLCBUMV9OTVNFREVDX0ZSQUNCSVRTKSAqIDgxOTIuMCkpOwotCQlsdXRfbm1zZWRlY19zaWcwW2ldID0KLQkJCW9wal9pbnRfbWF4KDAsCi0JCQkJCShpbnQpIChmbG9vcigodSAqIHUpICogcG93KDIsIFQxX05NU0VERUNfRlJBQ0JJVFMpICsgMC41KSAvIHBvdygyLCBUMV9OTVNFREVDX0ZSQUNCSVRTKSAqIDgxOTIuMCkpOwotCQl1ID0gdCAtIDEuMDsKLQkJaWYgKGkgJiAoMSA8PCAoVDFfTk1TRURFQ19CSVRTIC0gMSkpKSB7Ci0JCQl2ID0gdCAtIDEuNTsKLQkJfSBlbHNlIHsKLQkJCXYgPSB0IC0gMC41OwotCQl9Ci0JCWx1dF9ubXNlZGVjX3JlZltpXSA9Ci0JCQlvcGpfaW50X21heCgwLAotCQkJCQkoaW50KSAoZmxvb3IoKHUgKiB1IC0gdiAqIHYpICogcG93KDIsIFQxX05NU0VERUNfRlJBQ0JJVFMpICsgMC41KSAvIHBvdygyLCBUMV9OTVNFREVDX0ZSQUNCSVRTKSAqIDgxOTIuMCkpOwotCQlsdXRfbm1zZWRlY19yZWYwW2ldID0KLQkJCW9wal9pbnRfbWF4KDAsCi0JCQkJCShpbnQpIChmbG9vcigodSAqIHUpICogcG93KDIsIFQxX05NU0VERUNfRlJBQ0JJVFMpICsgMC41KSAvIHBvdygyLCBUMV9OTVNFREVDX0ZSQUNCSVRTKSAqIDgxOTIuMCkpOwotCX0KKyAgICAvKiBGSVhNRSBGSVhNRSBGSVhNRSAqLworICAgIC8qIGZwcmludGYoc3Rkb3V0LCJubXNlZGVjIGx1dHM6XG4iKTsgKi8KKyAgICBmb3IgKGkgPSAwVTsgaSA8ICgxVSA8PCBUMV9OTVNFREVDX0JJVFMpOyArK2kpIHsKKyAgICAgICAgdCA9IGkgLyBwb3coMiwgVDFfTk1TRURFQ19GUkFDQklUUyk7CisgICAgICAgIHUgPSB0OworICAgICAgICB2ID0gdCAtIDEuNTsKKyAgICAgICAgbHV0X25tc2VkZWNfc2lnW2ldID0KKyAgICAgICAgICAgIG9wal9pbnRfbWF4KDAsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShmbG9vcigodSAqIHUgLSB2ICogdikgKiBwb3coMiwgVDFfTk1TRURFQ19GUkFDQklUUykgKyAwLjUpIC8gcG93KDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX05NU0VERUNfRlJBQ0JJVFMpICogODE5Mi4wKSk7CisgICAgICAgIGx1dF9ubXNlZGVjX3NpZzBbaV0gPQorICAgICAgICAgICAgb3BqX2ludF9tYXgoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGZsb29yKCh1ICogdSkgKiBwb3coMiwgVDFfTk1TRURFQ19GUkFDQklUUykgKyAwLjUpIC8gcG93KDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX05NU0VERUNfRlJBQ0JJVFMpICogODE5Mi4wKSk7CisgICAgICAgIHUgPSB0IC0gMS4wOworICAgICAgICBpZiAoaSAmICgxIDw8IChUMV9OTVNFREVDX0JJVFMgLSAxKSkpIHsKKyAgICAgICAgICAgIHYgPSB0IC0gMS41OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdiA9IHQgLSAwLjU7CisgICAgICAgIH0KKyAgICAgICAgbHV0X25tc2VkZWNfcmVmW2ldID0KKyAgICAgICAgICAgIG9wal9pbnRfbWF4KDAsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShmbG9vcigodSAqIHUgLSB2ICogdikgKiBwb3coMiwgVDFfTk1TRURFQ19GUkFDQklUUykgKyAwLjUpIC8gcG93KDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX05NU0VERUNfRlJBQ0JJVFMpICogODE5Mi4wKSk7CisgICAgICAgIGx1dF9ubXNlZGVjX3JlZjBbaV0gPQorICAgICAgICAgICAgb3BqX2ludF9tYXgoMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGZsb29yKCh1ICogdSkgKiBwb3coMiwgVDFfTk1TRURFQ19GUkFDQklUUykgKyAwLjUpIC8gcG93KDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxX05NU0VERUNfRlJBQ0JJVFMpICogODE5Mi4wKSk7CisgICAgfQogCi0JcHJpbnRmKCJzdGF0aWMgT1BKX0lOVDE2IGx1dF9ubXNlZGVjX3NpZ1sxIDw8IFQxX05NU0VERUNfQklUU10gPSB7XG4gICIpOwotCWR1bXBfYXJyYXkxNihsdXRfbm1zZWRlY19zaWcsIDEgPDwgVDFfTk1TRURFQ19CSVRTKTsKKyAgICBwcmludGYoInN0YXRpYyBjb25zdCBPUEpfSU5UMTYgbHV0X25tc2VkZWNfc2lnWzFVIDw8IFQxX05NU0VERUNfQklUU10gPSB7XG4gICAgIik7CisgICAgZHVtcF9hcnJheTE2KGx1dF9ubXNlZGVjX3NpZywgMVUgPDwgVDFfTk1TRURFQ19CSVRTKTsKIAotCXByaW50Zigic3RhdGljIE9QSl9JTlQxNiBsdXRfbm1zZWRlY19zaWcwWzEgPDwgVDFfTk1TRURFQ19CSVRTXSA9IHtcbiAgIik7Ci0JZHVtcF9hcnJheTE2KGx1dF9ubXNlZGVjX3NpZzAsIDEgPDwgVDFfTk1TRURFQ19CSVRTKTsKKyAgICBwcmludGYoInN0YXRpYyBjb25zdCBPUEpfSU5UMTYgbHV0X25tc2VkZWNfc2lnMFsxVSA8PCBUMV9OTVNFREVDX0JJVFNdID0ge1xuICAgICIpOworICAgIGR1bXBfYXJyYXkxNihsdXRfbm1zZWRlY19zaWcwLCAxVSA8PCBUMV9OTVNFREVDX0JJVFMpOwogCi0JcHJpbnRmKCJzdGF0aWMgT1BKX0lOVDE2IGx1dF9ubXNlZGVjX3JlZlsxIDw8IFQxX05NU0VERUNfQklUU10gPSB7XG4gICIpOwotCWR1bXBfYXJyYXkxNihsdXRfbm1zZWRlY19yZWYsIDEgPDwgVDFfTk1TRURFQ19CSVRTKTsKKyAgICBwcmludGYoInN0YXRpYyBjb25zdCBPUEpfSU5UMTYgbHV0X25tc2VkZWNfcmVmWzFVIDw8IFQxX05NU0VERUNfQklUU10gPSB7XG4gICAgIik7CisgICAgZHVtcF9hcnJheTE2KGx1dF9ubXNlZGVjX3JlZiwgMVUgPDwgVDFfTk1TRURFQ19CSVRTKTsKIAotCXByaW50Zigic3RhdGljIE9QSl9JTlQxNiBsdXRfbm1zZWRlY19yZWYwWzEgPDwgVDFfTk1TRURFQ19CSVRTXSA9IHtcbiAgIik7Ci0JZHVtcF9hcnJheTE2KGx1dF9ubXNlZGVjX3JlZjAsIDEgPDwgVDFfTk1TRURFQ19CSVRTKTsKKyAgICBwcmludGYoInN0YXRpYyBjb25zdCBPUEpfSU5UMTYgbHV0X25tc2VkZWNfcmVmMFsxVSA8PCBUMV9OTVNFREVDX0JJVFNdID0ge1xuICAgICIpOworICAgIGR1bXBfYXJyYXkxNihsdXRfbm1zZWRlY19yZWYwLCAxVSA8PCBUMV9OTVNFREVDX0JJVFMpOwogCi0JcmV0dXJuIDA7CisgICAgcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3QxX2x1dHMuaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdDFfbHV0cy5oCmluZGV4IDM3Nzc2YjYuLjFhNWU3ODQgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdDFfbHV0cy5oCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdDFfbHV0cy5oCkBAIC0xLDE0MyArMSwxNzUgQEAKIC8qIFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdDFfZ2VuZXJhdGVfbHV0cy5jICovCiAKLXN0YXRpYyBPUEpfQllURSBsdXRfY3R4bm9femNbMTAyNF0gPSB7Ci0gIDAsIDEsIDEsIDIsIDEsIDIsIDIsIDIsIDEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIAotICA1LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCAKLSAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgCi0gIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIAotICA1LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCAKLSAgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgCi0gIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIAotICA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCAKLSAgMCwgMSwgMSwgMiwgMSwgMiwgMiwgMiwgMSwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgNSwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIAotICA1LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCAKLSAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIAotICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCAKLSAgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgCi0gIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIAotICAwLCAxLCAxLCAyLCAxLCAyLCAyLCAyLCAxLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAKLSAgNSwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIAotICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCAKLSAgNSwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgNywgCi0gIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIAotICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCAKLSAgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgCi0gIDAsIDMsIDMsIDYsIDMsIDYsIDYsIDgsIDMsIDYsIDYsIDgsIDYsIDgsIDgsIDgsIDEsIDQsIDQsIDcsIDQsIDcsIDcsIDgsIDQsIDcsIDcsIDgsIDcsIDgsIDgsIDgsIAotICAxLCA0LCA0LCA3LCA0LCA3LCA3LCA4LCA0LCA3LCA3LCA4LCA3LCA4LCA4LCA4LCAyLCA1LCA1LCA3LCA1LCA3LCA3LCA4LCA1LCA3LCA3LCA4LCA3LCA4LCA4LCA4LCAKLSAgMSwgNCwgNCwgNywgNCwgNywgNywgOCwgNCwgNywgNywgOCwgNywgOCwgOCwgOCwgMiwgNSwgNSwgNywgNSwgNywgNywgOCwgNSwgNywgNywgOCwgNywgOCwgOCwgOCwgCi0gIDIsIDUsIDUsIDcsIDUsIDcsIDcsIDgsIDUsIDcsIDcsIDgsIDcsIDgsIDgsIDgsIDIsIDUsIDUsIDcsIDUsIDcsIDcsIDgsIDUsIDcsIDcsIDgsIDcsIDgsIDgsIDgsIAotICAxLCA0LCA0LCA3LCA0LCA3LCA3LCA4LCA0LCA3LCA3LCA4LCA3LCA4LCA4LCA4LCAyLCA1LCA1LCA3LCA1LCA3LCA3LCA4LCA1LCA3LCA3LCA4LCA3LCA4LCA4LCA4LCAKLSAgMiwgNSwgNSwgNywgNSwgNywgNywgOCwgNSwgNywgNywgOCwgNywgOCwgOCwgOCwgMiwgNSwgNSwgNywgNSwgNywgNywgOCwgNSwgNywgNywgOCwgNywgOCwgOCwgOCwgCi0gIDIsIDUsIDUsIDcsIDUsIDcsIDcsIDgsIDUsIDcsIDcsIDgsIDcsIDgsIDgsIDgsIDIsIDUsIDUsIDcsIDUsIDcsIDcsIDgsIDUsIDcsIDcsIDgsIDcsIDgsIDgsIDgsIAotICAyLCA1LCA1LCA3LCA1LCA3LCA3LCA4LCA1LCA3LCA3LCA4LCA3LCA4LCA4LCA4LCAyLCA1LCA1LCA3LCA1LCA3LCA3LCA4LCA1LCA3LCA3LCA4LCA3LCA4LCA4LCA4CitzdGF0aWMgY29uc3QgT1BKX0JZVEUgbHV0X2N0eG5vX3pjWzIwNDhdID0geworICAgIDAsIDEsIDMsIDMsIDEsIDIsIDMsIDMsIDUsIDYsIDcsIDcsIDYsIDYsIDcsIDcsIDAsIDEsIDMsIDMsIDEsIDIsIDMsIDMsIDUsIDYsIDcsIDcsIDYsIDYsIDcsIDcsCisgICAgNSwgNiwgNywgNywgNiwgNiwgNywgNywgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgNSwgNiwgNywgNywgNiwgNiwgNywgNywgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKKyAgICAxLCAyLCAzLCAzLCAyLCAyLCAzLCAzLCA2LCA2LCA3LCA3LCA2LCA2LCA3LCA3LCAxLCAyLCAzLCAzLCAyLCAyLCAzLCAzLCA2LCA2LCA3LCA3LCA2LCA2LCA3LCA3LAorICAgIDYsIDYsIDcsIDcsIDYsIDYsIDcsIDcsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDYsIDYsIDcsIDcsIDYsIDYsIDcsIDcsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCisgICAgMywgMywgNCwgNCwgMywgMywgNCwgNCwgNywgNywgNywgNywgNywgNywgNywgNywgMywgMywgNCwgNCwgMywgMywgNCwgNCwgNywgNywgNywgNywgNywgNywgNywgNywKKyAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAorICAgIDMsIDMsIDQsIDQsIDMsIDMsIDQsIDQsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDMsIDMsIDQsIDQsIDMsIDMsIDQsIDQsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgICAgNywgNywgNywgNywgNywgNywgNywgNywgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgNywgNywgNywgNywgNywgNywgNywgNywgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKKyAgICAxLCAyLCAzLCAzLCAyLCAyLCAzLCAzLCA2LCA2LCA3LCA3LCA2LCA2LCA3LCA3LCAxLCAyLCAzLCAzLCAyLCAyLCAzLCAzLCA2LCA2LCA3LCA3LCA2LCA2LCA3LCA3LAorICAgIDYsIDYsIDcsIDcsIDYsIDYsIDcsIDcsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDYsIDYsIDcsIDcsIDYsIDYsIDcsIDcsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCisgICAgMiwgMiwgMywgMywgMiwgMiwgMywgMywgNiwgNiwgNywgNywgNiwgNiwgNywgNywgMiwgMiwgMywgMywgMiwgMiwgMywgMywgNiwgNiwgNywgNywgNiwgNiwgNywgNywKKyAgICA2LCA2LCA3LCA3LCA2LCA2LCA3LCA3LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA2LCA2LCA3LCA3LCA2LCA2LCA3LCA3LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAorICAgIDMsIDMsIDQsIDQsIDMsIDMsIDQsIDQsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDMsIDMsIDQsIDQsIDMsIDMsIDQsIDQsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgICAgNywgNywgNywgNywgNywgNywgNywgNywgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgNywgNywgNywgNywgNywgNywgNywgNywgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKKyAgICAzLCAzLCA0LCA0LCAzLCAzLCA0LCA0LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCAzLCAzLCA0LCA0LCAzLCAzLCA0LCA0LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCisgICAgMCwgMSwgNSwgNiwgMSwgMiwgNiwgNiwgMywgMywgNywgNywgMywgMywgNywgNywgMCwgMSwgNSwgNiwgMSwgMiwgNiwgNiwgMywgMywgNywgNywgMywgMywgNywgNywKKyAgICAzLCAzLCA3LCA3LCAzLCAzLCA3LCA3LCA0LCA0LCA3LCA3LCA0LCA0LCA3LCA3LCAzLCAzLCA3LCA3LCAzLCAzLCA3LCA3LCA0LCA0LCA3LCA3LCA0LCA0LCA3LCA3LAorICAgIDEsIDIsIDYsIDYsIDIsIDIsIDYsIDYsIDMsIDMsIDcsIDcsIDMsIDMsIDcsIDcsIDEsIDIsIDYsIDYsIDIsIDIsIDYsIDYsIDMsIDMsIDcsIDcsIDMsIDMsIDcsIDcsCisgICAgMywgMywgNywgNywgMywgMywgNywgNywgNCwgNCwgNywgNywgNCwgNCwgNywgNywgMywgMywgNywgNywgMywgMywgNywgNywgNCwgNCwgNywgNywgNCwgNCwgNywgNywKKyAgICA1LCA2LCA4LCA4LCA2LCA2LCA4LCA4LCA3LCA3LCA4LCA4LCA3LCA3LCA4LCA4LCA1LCA2LCA4LCA4LCA2LCA2LCA4LCA4LCA3LCA3LCA4LCA4LCA3LCA3LCA4LCA4LAorICAgIDcsIDcsIDgsIDgsIDcsIDcsIDgsIDgsIDcsIDcsIDgsIDgsIDcsIDcsIDgsIDgsIDcsIDcsIDgsIDgsIDcsIDcsIDgsIDgsIDcsIDcsIDgsIDgsIDcsIDcsIDgsIDgsCisgICAgNiwgNiwgOCwgOCwgNiwgNiwgOCwgOCwgNywgNywgOCwgOCwgNywgNywgOCwgOCwgNiwgNiwgOCwgOCwgNiwgNiwgOCwgOCwgNywgNywgOCwgOCwgNywgNywgOCwgOCwKKyAgICA3LCA3LCA4LCA4LCA3LCA3LCA4LCA4LCA3LCA3LCA4LCA4LCA3LCA3LCA4LCA4LCA3LCA3LCA4LCA4LCA3LCA3LCA4LCA4LCA3LCA3LCA4LCA4LCA3LCA3LCA4LCA4LAorICAgIDEsIDIsIDYsIDYsIDIsIDIsIDYsIDYsIDMsIDMsIDcsIDcsIDMsIDMsIDcsIDcsIDEsIDIsIDYsIDYsIDIsIDIsIDYsIDYsIDMsIDMsIDcsIDcsIDMsIDMsIDcsIDcsCisgICAgMywgMywgNywgNywgMywgMywgNywgNywgNCwgNCwgNywgNywgNCwgNCwgNywgNywgMywgMywgNywgNywgMywgMywgNywgNywgNCwgNCwgNywgNywgNCwgNCwgNywgNywKKyAgICAyLCAyLCA2LCA2LCAyLCAyLCA2LCA2LCAzLCAzLCA3LCA3LCAzLCAzLCA3LCA3LCAyLCAyLCA2LCA2LCAyLCAyLCA2LCA2LCAzLCAzLCA3LCA3LCAzLCAzLCA3LCA3LAorICAgIDMsIDMsIDcsIDcsIDMsIDMsIDcsIDcsIDQsIDQsIDcsIDcsIDQsIDQsIDcsIDcsIDMsIDMsIDcsIDcsIDMsIDMsIDcsIDcsIDQsIDQsIDcsIDcsIDQsIDQsIDcsIDcsCisgICAgNiwgNiwgOCwgOCwgNiwgNiwgOCwgOCwgNywgNywgOCwgOCwgNywgNywgOCwgOCwgNiwgNiwgOCwgOCwgNiwgNiwgOCwgOCwgNywgNywgOCwgOCwgNywgNywgOCwgOCwKKyAgICA3LCA3LCA4LCA4LCA3LCA3LCA4LCA4LCA3LCA3LCA4LCA4LCA3LCA3LCA4LCA4LCA3LCA3LCA4LCA4LCA3LCA3LCA4LCA4LCA3LCA3LCA4LCA4LCA3LCA3LCA4LCA4LAorICAgIDYsIDYsIDgsIDgsIDYsIDYsIDgsIDgsIDcsIDcsIDgsIDgsIDcsIDcsIDgsIDgsIDYsIDYsIDgsIDgsIDYsIDYsIDgsIDgsIDcsIDcsIDgsIDgsIDcsIDcsIDgsIDgsCisgICAgNywgNywgOCwgOCwgNywgNywgOCwgOCwgNywgNywgOCwgOCwgNywgNywgOCwgOCwgNywgNywgOCwgOCwgNywgNywgOCwgOCwgNywgNywgOCwgOCwgNywgNywgOCwgOCwKKyAgICAwLCAxLCAzLCAzLCAxLCAyLCAzLCAzLCA1LCA2LCA3LCA3LCA2LCA2LCA3LCA3LCAwLCAxLCAzLCAzLCAxLCAyLCAzLCAzLCA1LCA2LCA3LCA3LCA2LCA2LCA3LCA3LAorICAgIDUsIDYsIDcsIDcsIDYsIDYsIDcsIDcsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDUsIDYsIDcsIDcsIDYsIDYsIDcsIDcsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCisgICAgMSwgMiwgMywgMywgMiwgMiwgMywgMywgNiwgNiwgNywgNywgNiwgNiwgNywgNywgMSwgMiwgMywgMywgMiwgMiwgMywgMywgNiwgNiwgNywgNywgNiwgNiwgNywgNywKKyAgICA2LCA2LCA3LCA3LCA2LCA2LCA3LCA3LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA2LCA2LCA3LCA3LCA2LCA2LCA3LCA3LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAorICAgIDMsIDMsIDQsIDQsIDMsIDMsIDQsIDQsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDMsIDMsIDQsIDQsIDMsIDMsIDQsIDQsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgICAgNywgNywgNywgNywgNywgNywgNywgNywgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgNywgNywgNywgNywgNywgNywgNywgNywgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKKyAgICAzLCAzLCA0LCA0LCAzLCAzLCA0LCA0LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCAzLCAzLCA0LCA0LCAzLCAzLCA0LCA0LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCisgICAgMSwgMiwgMywgMywgMiwgMiwgMywgMywgNiwgNiwgNywgNywgNiwgNiwgNywgNywgMSwgMiwgMywgMywgMiwgMiwgMywgMywgNiwgNiwgNywgNywgNiwgNiwgNywgNywKKyAgICA2LCA2LCA3LCA3LCA2LCA2LCA3LCA3LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA2LCA2LCA3LCA3LCA2LCA2LCA3LCA3LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAorICAgIDIsIDIsIDMsIDMsIDIsIDIsIDMsIDMsIDYsIDYsIDcsIDcsIDYsIDYsIDcsIDcsIDIsIDIsIDMsIDMsIDIsIDIsIDMsIDMsIDYsIDYsIDcsIDcsIDYsIDYsIDcsIDcsCisgICAgNiwgNiwgNywgNywgNiwgNiwgNywgNywgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwgNiwgNiwgNywgNywgNiwgNiwgNywgNywgOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCwKKyAgICAzLCAzLCA0LCA0LCAzLCAzLCA0LCA0LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCAzLCAzLCA0LCA0LCAzLCAzLCA0LCA0LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorICAgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDgsIDgsIDgsIDgsIDgsIDgsIDgsIDgsCisgICAgMywgMywgNCwgNCwgMywgMywgNCwgNCwgNywgNywgNywgNywgNywgNywgNywgNywgMywgMywgNCwgNCwgMywgMywgNCwgNCwgNywgNywgNywgNywgNywgNywgNywgNywKKyAgICA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA3LCA4LCA4LCA4LCA4LCA4LCA4LCA4LCA4LAorICAgIDAsIDMsIDEsIDQsIDMsIDYsIDQsIDcsIDEsIDQsIDIsIDUsIDQsIDcsIDUsIDcsIDAsIDMsIDEsIDQsIDMsIDYsIDQsIDcsIDEsIDQsIDIsIDUsIDQsIDcsIDUsIDcsCisgICAgMSwgNCwgMiwgNSwgNCwgNywgNSwgNywgMiwgNSwgMiwgNSwgNSwgNywgNSwgNywgMSwgNCwgMiwgNSwgNCwgNywgNSwgNywgMiwgNSwgMiwgNSwgNSwgNywgNSwgNywKKyAgICAzLCA2LCA0LCA3LCA2LCA4LCA3LCA4LCA0LCA3LCA1LCA3LCA3LCA4LCA3LCA4LCAzLCA2LCA0LCA3LCA2LCA4LCA3LCA4LCA0LCA3LCA1LCA3LCA3LCA4LCA3LCA4LAorICAgIDQsIDcsIDUsIDcsIDcsIDgsIDcsIDgsIDUsIDcsIDUsIDcsIDcsIDgsIDcsIDgsIDQsIDcsIDUsIDcsIDcsIDgsIDcsIDgsIDUsIDcsIDUsIDcsIDcsIDgsIDcsIDgsCisgICAgMSwgNCwgMiwgNSwgNCwgNywgNSwgNywgMiwgNSwgMiwgNSwgNSwgNywgNSwgNywgMSwgNCwgMiwgNSwgNCwgNywgNSwgNywgMiwgNSwgMiwgNSwgNSwgNywgNSwgNywKKyAgICAyLCA1LCAyLCA1LCA1LCA3LCA1LCA3LCAyLCA1LCAyLCA1LCA1LCA3LCA1LCA3LCAyLCA1LCAyLCA1LCA1LCA3LCA1LCA3LCAyLCA1LCAyLCA1LCA1LCA3LCA1LCA3LAorICAgIDQsIDcsIDUsIDcsIDcsIDgsIDcsIDgsIDUsIDcsIDUsIDcsIDcsIDgsIDcsIDgsIDQsIDcsIDUsIDcsIDcsIDgsIDcsIDgsIDUsIDcsIDUsIDcsIDcsIDgsIDcsIDgsCisgICAgNSwgNywgNSwgNywgNywgOCwgNywgOCwgNSwgNywgNSwgNywgNywgOCwgNywgOCwgNSwgNywgNSwgNywgNywgOCwgNywgOCwgNSwgNywgNSwgNywgNywgOCwgNywgOCwKKyAgICAzLCA2LCA0LCA3LCA2LCA4LCA3LCA4LCA0LCA3LCA1LCA3LCA3LCA4LCA3LCA4LCAzLCA2LCA0LCA3LCA2LCA4LCA3LCA4LCA0LCA3LCA1LCA3LCA3LCA4LCA3LCA4LAorICAgIDQsIDcsIDUsIDcsIDcsIDgsIDcsIDgsIDUsIDcsIDUsIDcsIDcsIDgsIDcsIDgsIDQsIDcsIDUsIDcsIDcsIDgsIDcsIDgsIDUsIDcsIDUsIDcsIDcsIDgsIDcsIDgsCisgICAgNiwgOCwgNywgOCwgOCwgOCwgOCwgOCwgNywgOCwgNywgOCwgOCwgOCwgOCwgOCwgNiwgOCwgNywgOCwgOCwgOCwgOCwgOCwgNywgOCwgNywgOCwgOCwgOCwgOCwgOCwKKyAgICA3LCA4LCA3LCA4LCA4LCA4LCA4LCA4LCA3LCA4LCA3LCA4LCA4LCA4LCA4LCA4LCA3LCA4LCA3LCA4LCA4LCA4LCA4LCA4LCA3LCA4LCA3LCA4LCA4LCA4LCA4LCA4LAorICAgIDQsIDcsIDUsIDcsIDcsIDgsIDcsIDgsIDUsIDcsIDUsIDcsIDcsIDgsIDcsIDgsIDQsIDcsIDUsIDcsIDcsIDgsIDcsIDgsIDUsIDcsIDUsIDcsIDcsIDgsIDcsIDgsCisgICAgNSwgNywgNSwgNywgNywgOCwgNywgOCwgNSwgNywgNSwgNywgNywgOCwgNywgOCwgNSwgNywgNSwgNywgNywgOCwgNywgOCwgNSwgNywgNSwgNywgNywgOCwgNywgOCwKKyAgICA3LCA4LCA3LCA4LCA4LCA4LCA4LCA4LCA3LCA4LCA3LCA4LCA4LCA4LCA4LCA4LCA3LCA4LCA3LCA4LCA4LCA4LCA4LCA4LCA3LCA4LCA3LCA4LCA4LCA4LCA4LCA4LAorICAgIDcsIDgsIDcsIDgsIDgsIDgsIDgsIDgsIDcsIDgsIDcsIDgsIDgsIDgsIDgsIDgsIDcsIDgsIDcsIDgsIDgsIDgsIDgsIDgsIDcsIDgsIDcsIDgsIDgsIDgsIDgsIDgKIH07CiAKLXN0YXRpYyBPUEpfQllURSBsdXRfY3R4bm9fc2NbMjU2XSA9IHsKLSAgMHg5LCAweGEsIDB4YywgMHhkLCAweGEsIDB4YSwgMHhkLCAweGQsIDB4YywgMHhkLCAweGMsIDB4ZCwgMHhkLCAweGQsIDB4ZCwgMHhkLCAKLSAgMHg5LCAweGEsIDB4YywgMHhiLCAweGEsIDB4OSwgMHhkLCAweGMsIDB4YywgMHhiLCAweGMsIDB4YiwgMHhkLCAweGMsIDB4ZCwgMHhjLCAKLSAgMHg5LCAweGEsIDB4YywgMHhiLCAweGEsIDB4YSwgMHhiLCAweGIsIDB4YywgMHhkLCAweDksIDB4YSwgMHhkLCAweGQsIDB4YSwgMHhhLCAKLSAgMHg5LCAweGEsIDB4YywgMHhkLCAweGEsIDB4OSwgMHhiLCAweGMsIDB4YywgMHhiLCAweDksIDB4YSwgMHhkLCAweGMsIDB4YSwgMHg5LCAKLSAgMHg5LCAweGEsIDB4YywgMHhkLCAweGEsIDB4OSwgMHhiLCAweGMsIDB4YywgMHhkLCAweGMsIDB4ZCwgMHhiLCAweGMsIDB4YiwgMHhjLCAKLSAgMHg5LCAweGEsIDB4YywgMHhiLCAweGEsIDB4YSwgMHhiLCAweGIsIDB4YywgMHhiLCAweGMsIDB4YiwgMHhiLCAweGIsIDB4YiwgMHhiLCAKLSAgMHg5LCAweGEsIDB4YywgMHhiLCAweGEsIDB4OSwgMHhkLCAweGMsIDB4YywgMHhkLCAweDksIDB4YSwgMHhiLCAweGMsIDB4YSwgMHg5LCAKLSAgMHg5LCAweGEsIDB4YywgMHhkLCAweGEsIDB4YSwgMHhkLCAweGQsIDB4YywgMHhiLCAweDksIDB4YSwgMHhiLCAweGIsIDB4YSwgMHhhLCAKLSAgMHg5LCAweGEsIDB4YywgMHhkLCAweGEsIDB4YSwgMHhkLCAweGQsIDB4YywgMHhiLCAweDksIDB4YSwgMHhiLCAweGIsIDB4YSwgMHhhLCAKLSAgMHg5LCAweGEsIDB4YywgMHhiLCAweGEsIDB4OSwgMHhkLCAweGMsIDB4YywgMHhkLCAweDksIDB4YSwgMHhiLCAweGMsIDB4YSwgMHg5LCAKLSAgMHg5LCAweGEsIDB4YywgMHhiLCAweGEsIDB4YSwgMHhiLCAweGIsIDB4YywgMHhiLCAweGMsIDB4YiwgMHhiLCAweGIsIDB4YiwgMHhiLCAKLSAgMHg5LCAweGEsIDB4YywgMHhkLCAweGEsIDB4OSwgMHhiLCAweGMsIDB4YywgMHhkLCAweGMsIDB4ZCwgMHhiLCAweGMsIDB4YiwgMHhjLCAKLSAgMHg5LCAweGEsIDB4YywgMHhkLCAweGEsIDB4OSwgMHhiLCAweGMsIDB4YywgMHhiLCAweDksIDB4YSwgMHhkLCAweGMsIDB4YSwgMHg5LCAKLSAgMHg5LCAweGEsIDB4YywgMHhiLCAweGEsIDB4YSwgMHhiLCAweGIsIDB4YywgMHhkLCAweDksIDB4YSwgMHhkLCAweGQsIDB4YSwgMHhhLCAKLSAgMHg5LCAweGEsIDB4YywgMHhiLCAweGEsIDB4OSwgMHhkLCAweGMsIDB4YywgMHhiLCAweGMsIDB4YiwgMHhkLCAweGMsIDB4ZCwgMHhjLCAKLSAgMHg5LCAweGEsIDB4YywgMHhkLCAweGEsIDB4YSwgMHhkLCAweGQsIDB4YywgMHhkLCAweGMsIDB4ZCwgMHhkLCAweGQsIDB4ZCwgMHhkCitzdGF0aWMgY29uc3QgT1BKX0JZVEUgbHV0X2N0eG5vX3NjWzI1Nl0gPSB7CisgICAgMHg5LCAweDksIDB4YSwgMHhhLCAweDksIDB4OSwgMHhhLCAweGEsIDB4YywgMHhjLCAweGQsIDB4YiwgMHhjLCAweGMsIDB4ZCwgMHhiLAorICAgIDB4OSwgMHg5LCAweGEsIDB4YSwgMHg5LCAweDksIDB4YSwgMHhhLCAweGMsIDB4YywgMHhiLCAweGQsIDB4YywgMHhjLCAweGIsIDB4ZCwKKyAgICAweGMsIDB4YywgMHhkLCAweGQsIDB4YywgMHhjLCAweGIsIDB4YiwgMHhjLCAweDksIDB4ZCwgMHhhLCAweDksIDB4YywgMHhhLCAweGIsCisgICAgMHhjLCAweGMsIDB4YiwgMHhiLCAweGMsIDB4YywgMHhkLCAweGQsIDB4YywgMHg5LCAweGIsIDB4YSwgMHg5LCAweGMsIDB4YSwgMHhkLAorICAgIDB4OSwgMHg5LCAweGEsIDB4YSwgMHg5LCAweDksIDB4YSwgMHhhLCAweGMsIDB4YywgMHhkLCAweGIsIDB4YywgMHhjLCAweGQsIDB4YiwKKyAgICAweDksIDB4OSwgMHhhLCAweGEsIDB4OSwgMHg5LCAweGEsIDB4YSwgMHhjLCAweGMsIDB4YiwgMHhkLCAweGMsIDB4YywgMHhiLCAweGQsCisgICAgMHhjLCAweGMsIDB4ZCwgMHhkLCAweGMsIDB4YywgMHhiLCAweGIsIDB4YywgMHg5LCAweGQsIDB4YSwgMHg5LCAweGMsIDB4YSwgMHhiLAorICAgIDB4YywgMHhjLCAweGIsIDB4YiwgMHhjLCAweGMsIDB4ZCwgMHhkLCAweGMsIDB4OSwgMHhiLCAweGEsIDB4OSwgMHhjLCAweGEsIDB4ZCwKKyAgICAweGEsIDB4YSwgMHhhLCAweGEsIDB4YSwgMHhhLCAweGEsIDB4YSwgMHhkLCAweGIsIDB4ZCwgMHhiLCAweGQsIDB4YiwgMHhkLCAweGIsCisgICAgMHhhLCAweGEsIDB4OSwgMHg5LCAweGEsIDB4YSwgMHg5LCAweDksIDB4ZCwgMHhiLCAweGMsIDB4YywgMHhkLCAweGIsIDB4YywgMHhjLAorICAgIDB4ZCwgMHhkLCAweGQsIDB4ZCwgMHhiLCAweGIsIDB4YiwgMHhiLCAweGQsIDB4YSwgMHhkLCAweGEsIDB4YSwgMHhiLCAweGEsIDB4YiwKKyAgICAweGQsIDB4ZCwgMHhjLCAweGMsIDB4YiwgMHhiLCAweGMsIDB4YywgMHhkLCAweGEsIDB4YywgMHg5LCAweGEsIDB4YiwgMHg5LCAweGMsCisgICAgMHhhLCAweGEsIDB4OSwgMHg5LCAweGEsIDB4YSwgMHg5LCAweDksIDB4YiwgMHhkLCAweGMsIDB4YywgMHhiLCAweGQsIDB4YywgMHhjLAorICAgIDB4YSwgMHhhLCAweGEsIDB4YSwgMHhhLCAweGEsIDB4YSwgMHhhLCAweGIsIDB4ZCwgMHhiLCAweGQsIDB4YiwgMHhkLCAweGIsIDB4ZCwKKyAgICAweGIsIDB4YiwgMHhjLCAweGMsIDB4ZCwgMHhkLCAweGMsIDB4YywgMHhiLCAweGEsIDB4YywgMHg5LCAweGEsIDB4ZCwgMHg5LCAweGMsCisgICAgMHhiLCAweGIsIDB4YiwgMHhiLCAweGQsIDB4ZCwgMHhkLCAweGQsIDB4YiwgMHhhLCAweGIsIDB4YSwgMHhhLCAweGQsIDB4YSwgMHhkCiB9OwogCi1zdGF0aWMgT1BKX0JZVEUgbHV0X3NwYlsyNTZdID0gewotICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAKLSAgMCwgMCwgMSwgMSwgMCwgMCwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMCwgMCwgMSwgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgCi0gIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIAotICAwLCAwLCAxLCAxLCAxLCAwLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCAxLCAxLCAKLSAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMCwgMCwgMSwgMSwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMCwgMSwgMSwgMSwgMCwgMCwgCi0gIDAsIDAsIDEsIDEsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDEsIDEsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIAotICAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxLCAxLCAwLCAwLCAxLCAxLCAxLCAwLCAwLCAxLCAwLCAwLCAxLCAxLCAwLCAwLCAxLCAxLCAwLCAxLCAxLCAxLCAxLCAxLCAKLSAgMCwgMCwgMSwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMQorc3RhdGljIGNvbnN0IE9QSl9CWVRFIGx1dF9zcGJbMjU2XSA9IHsKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAwLCAxLCAxLCAwLCAwLCAxLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLAorICAgIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDEsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDEsIDAsIDEsIDEsIDEsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMCwgMSwgMSwgMCwgMCwgMSwgMSwgMCwgMSwgMCwgMSwgMCwgMSwgMCwgMSwKKyAgICAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAxLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAxLCAwLCAxLCAxLCAxLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDEsIDAsIDEsIDAsIDEsCisgICAgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMSwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMSwKKyAgICAxLCAxLCAwLCAwLCAxLCAxLCAwLCAwLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAxLCAwLCAxLCAwLCAxLCAwLCAxLAorICAgIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDAsIDEsIDAsIDAsIDEsIDEsIDAsIDEsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDAsIDEsIDAsIDEsIDEsIDEsIDEsIDEKIH07CiAKLXN0YXRpYyBPUEpfSU5UMTYgbHV0X25tc2VkZWNfc2lnWzEgPDwgVDFfTk1TRURFQ19CSVRTXSA9IHsKLSAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIAotICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgCi0gIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAKLSAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIAotICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgCi0gIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAKLSAgMHgwMDAwLCAweDAxODAsIDB4MDMwMCwgMHgwNDgwLCAweDA2MDAsIDB4MDc4MCwgMHgwOTAwLCAweDBhODAsIAotICAweDBjMDAsIDB4MGQ4MCwgMHgwZjAwLCAweDEwODAsIDB4MTIwMCwgMHgxMzgwLCAweDE1MDAsIDB4MTY4MCwgCi0gIDB4MTgwMCwgMHgxOTgwLCAweDFiMDAsIDB4MWM4MCwgMHgxZTAwLCAweDFmODAsIDB4MjEwMCwgMHgyMjgwLCAKLSAgMHgyNDAwLCAweDI1ODAsIDB4MjcwMCwgMHgyODgwLCAweDJhMDAsIDB4MmI4MCwgMHgyZDAwLCAweDJlODAsIAotICAweDMwMDAsIDB4MzE4MCwgMHgzMzAwLCAweDM0ODAsIDB4MzYwMCwgMHgzNzgwLCAweDM5MDAsIDB4M2E4MCwgCi0gIDB4M2MwMCwgMHgzZDgwLCAweDNmMDAsIDB4NDA4MCwgMHg0MjAwLCAweDQzODAsIDB4NDUwMCwgMHg0NjgwLCAKLSAgMHg0ODAwLCAweDQ5ODAsIDB4NGIwMCwgMHg0YzgwLCAweDRlMDAsIDB4NGY4MCwgMHg1MTAwLCAweDUyODAsIAotICAweDU0MDAsIDB4NTU4MCwgMHg1NzAwLCAweDU4ODAsIDB4NWEwMCwgMHg1YjgwLCAweDVkMDAsIDB4NWU4MCwgCi0gIDB4NjAwMCwgMHg2MTgwLCAweDYzMDAsIDB4NjQ4MCwgMHg2NjAwLCAweDY3ODAsIDB4NjkwMCwgMHg2YTgwLCAKLSAgMHg2YzAwLCAweDZkODAsIDB4NmYwMCwgMHg3MDgwLCAweDcyMDAsIDB4NzM4MCwgMHg3NTAwLCAweDc2ODAKK3N0YXRpYyBjb25zdCBPUEpfSU5UMTYgbHV0X25tc2VkZWNfc2lnWzFVIDw8IFQxX05NU0VERUNfQklUU10gPSB7CisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsCisgICAgMHgwMDAwLCAweDAxODAsIDB4MDMwMCwgMHgwNDgwLCAweDA2MDAsIDB4MDc4MCwgMHgwOTAwLCAweDBhODAsCisgICAgMHgwYzAwLCAweDBkODAsIDB4MGYwMCwgMHgxMDgwLCAweDEyMDAsIDB4MTM4MCwgMHgxNTAwLCAweDE2ODAsCisgICAgMHgxODAwLCAweDE5ODAsIDB4MWIwMCwgMHgxYzgwLCAweDFlMDAsIDB4MWY4MCwgMHgyMTAwLCAweDIyODAsCisgICAgMHgyNDAwLCAweDI1ODAsIDB4MjcwMCwgMHgyODgwLCAweDJhMDAsIDB4MmI4MCwgMHgyZDAwLCAweDJlODAsCisgICAgMHgzMDAwLCAweDMxODAsIDB4MzMwMCwgMHgzNDgwLCAweDM2MDAsIDB4Mzc4MCwgMHgzOTAwLCAweDNhODAsCisgICAgMHgzYzAwLCAweDNkODAsIDB4M2YwMCwgMHg0MDgwLCAweDQyMDAsIDB4NDM4MCwgMHg0NTAwLCAweDQ2ODAsCisgICAgMHg0ODAwLCAweDQ5ODAsIDB4NGIwMCwgMHg0YzgwLCAweDRlMDAsIDB4NGY4MCwgMHg1MTAwLCAweDUyODAsCisgICAgMHg1NDAwLCAweDU1ODAsIDB4NTcwMCwgMHg1ODgwLCAweDVhMDAsIDB4NWI4MCwgMHg1ZDAwLCAweDVlODAsCisgICAgMHg2MDAwLCAweDYxODAsIDB4NjMwMCwgMHg2NDgwLCAweDY2MDAsIDB4Njc4MCwgMHg2OTAwLCAweDZhODAsCisgICAgMHg2YzAwLCAweDZkODAsIDB4NmYwMCwgMHg3MDgwLCAweDcyMDAsIDB4NzM4MCwgMHg3NTAwLCAweDc2ODAKIH07CiAKLXN0YXRpYyBPUEpfSU5UMTYgbHV0X25tc2VkZWNfc2lnMFsxIDw8IFQxX05NU0VERUNfQklUU10gPSB7Ci0gIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDA4MCwgMHgwMDgwLCAKLSAgMHgwMDgwLCAweDAwODAsIDB4MDEwMCwgMHgwMTAwLCAweDAxMDAsIDB4MDE4MCwgMHgwMTgwLCAweDAyMDAsIAotICAweDAyMDAsIDB4MDI4MCwgMHgwMjgwLCAweDAzMDAsIDB4MDMwMCwgMHgwMzgwLCAweDA0MDAsIDB4MDQwMCwgCi0gIDB4MDQ4MCwgMHgwNTAwLCAweDA1ODAsIDB4MDU4MCwgMHgwNjAwLCAweDA2ODAsIDB4MDcwMCwgMHgwNzgwLCAKLSAgMHgwODAwLCAweDA4ODAsIDB4MDkwMCwgMHgwOTgwLCAweDBhMDAsIDB4MGE4MCwgMHgwYjgwLCAweDBjMDAsIAotICAweDBjODAsIDB4MGQwMCwgMHgwZTAwLCAweDBlODAsIDB4MGYwMCwgMHgxMDAwLCAweDEwODAsIDB4MTE4MCwgCi0gIDB4MTIwMCwgMHgxMzAwLCAweDEzODAsIDB4MTQ4MCwgMHgxNTAwLCAweDE2MDAsIDB4MTcwMCwgMHgxNzgwLCAKLSAgMHgxODgwLCAweDE5ODAsIDB4MWE4MCwgMHgxYjAwLCAweDFjMDAsIDB4MWQwMCwgMHgxZTAwLCAweDFmMDAsIAotICAweDIwMDAsIDB4MjEwMCwgMHgyMjAwLCAweDIzMDAsIDB4MjQwMCwgMHgyNTAwLCAweDI2ODAsIDB4Mjc4MCwgCi0gIDB4Mjg4MCwgMHgyOTgwLCAweDJiMDAsIDB4MmMwMCwgMHgyZDAwLCAweDJlODAsIDB4MmY4MCwgMHgzMTAwLCAKLSAgMHgzMjAwLCAweDMzODAsIDB4MzQ4MCwgMHgzNjAwLCAweDM3MDAsIDB4Mzg4MCwgMHgzYTAwLCAweDNiMDAsIAotICAweDNjODAsIDB4M2UwMCwgMHgzZjgwLCAweDQwODAsIDB4NDIwMCwgMHg0MzgwLCAweDQ1MDAsIDB4NDY4MCwgCi0gIDB4NDgwMCwgMHg0OTgwLCAweDRiMDAsIDB4NGM4MCwgMHg0ZTAwLCAweDRmODAsIDB4NTE4MCwgMHg1MzAwLCAKLSAgMHg1NDgwLCAweDU2MDAsIDB4NTgwMCwgMHg1OTgwLCAweDViMDAsIDB4NWQwMCwgMHg1ZTgwLCAweDYwODAsIAotICAweDYyMDAsIDB4NjQwMCwgMHg2NTgwLCAweDY3ODAsIDB4NjkwMCwgMHg2YjAwLCAweDZkMDAsIDB4NmU4MCwgCi0gIDB4NzA4MCwgMHg3MjgwLCAweDc0ODAsIDB4NzYwMCwgMHg3ODAwLCAweDdhMDAsIDB4N2MwMCwgMHg3ZTAwCitzdGF0aWMgY29uc3QgT1BKX0lOVDE2IGx1dF9ubXNlZGVjX3NpZzBbMVUgPDwgVDFfTk1TRURFQ19CSVRTXSA9IHsKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwODAsIDB4MDA4MCwKKyAgICAweDAwODAsIDB4MDA4MCwgMHgwMTAwLCAweDAxMDAsIDB4MDEwMCwgMHgwMTgwLCAweDAxODAsIDB4MDIwMCwKKyAgICAweDAyMDAsIDB4MDI4MCwgMHgwMjgwLCAweDAzMDAsIDB4MDMwMCwgMHgwMzgwLCAweDA0MDAsIDB4MDQwMCwKKyAgICAweDA0ODAsIDB4MDUwMCwgMHgwNTgwLCAweDA1ODAsIDB4MDYwMCwgMHgwNjgwLCAweDA3MDAsIDB4MDc4MCwKKyAgICAweDA4MDAsIDB4MDg4MCwgMHgwOTAwLCAweDA5ODAsIDB4MGEwMCwgMHgwYTgwLCAweDBiODAsIDB4MGMwMCwKKyAgICAweDBjODAsIDB4MGQwMCwgMHgwZTAwLCAweDBlODAsIDB4MGYwMCwgMHgxMDAwLCAweDEwODAsIDB4MTE4MCwKKyAgICAweDEyMDAsIDB4MTMwMCwgMHgxMzgwLCAweDE0ODAsIDB4MTUwMCwgMHgxNjAwLCAweDE3MDAsIDB4MTc4MCwKKyAgICAweDE4ODAsIDB4MTk4MCwgMHgxYTgwLCAweDFiMDAsIDB4MWMwMCwgMHgxZDAwLCAweDFlMDAsIDB4MWYwMCwKKyAgICAweDIwMDAsIDB4MjEwMCwgMHgyMjAwLCAweDIzMDAsIDB4MjQwMCwgMHgyNTAwLCAweDI2ODAsIDB4Mjc4MCwKKyAgICAweDI4ODAsIDB4Mjk4MCwgMHgyYjAwLCAweDJjMDAsIDB4MmQwMCwgMHgyZTgwLCAweDJmODAsIDB4MzEwMCwKKyAgICAweDMyMDAsIDB4MzM4MCwgMHgzNDgwLCAweDM2MDAsIDB4MzcwMCwgMHgzODgwLCAweDNhMDAsIDB4M2IwMCwKKyAgICAweDNjODAsIDB4M2UwMCwgMHgzZjgwLCAweDQwODAsIDB4NDIwMCwgMHg0MzgwLCAweDQ1MDAsIDB4NDY4MCwKKyAgICAweDQ4MDAsIDB4NDk4MCwgMHg0YjAwLCAweDRjODAsIDB4NGUwMCwgMHg0ZjgwLCAweDUxODAsIDB4NTMwMCwKKyAgICAweDU0ODAsIDB4NTYwMCwgMHg1ODAwLCAweDU5ODAsIDB4NWIwMCwgMHg1ZDAwLCAweDVlODAsIDB4NjA4MCwKKyAgICAweDYyMDAsIDB4NjQwMCwgMHg2NTgwLCAweDY3ODAsIDB4NjkwMCwgMHg2YjAwLCAweDZkMDAsIDB4NmU4MCwKKyAgICAweDcwODAsIDB4NzI4MCwgMHg3NDgwLCAweDc2MDAsIDB4NzgwMCwgMHg3YTAwLCAweDdjMDAsIDB4N2UwMAogfTsKIAotc3RhdGljIE9QSl9JTlQxNiBsdXRfbm1zZWRlY19yZWZbMSA8PCBUMV9OTVNFREVDX0JJVFNdID0gewotICAweDE4MDAsIDB4MTc4MCwgMHgxNzAwLCAweDE2ODAsIDB4MTYwMCwgMHgxNTgwLCAweDE1MDAsIDB4MTQ4MCwgCi0gIDB4MTQwMCwgMHgxMzgwLCAweDEzMDAsIDB4MTI4MCwgMHgxMjAwLCAweDExODAsIDB4MTEwMCwgMHgxMDgwLCAKLSAgMHgxMDAwLCAweDBmODAsIDB4MGYwMCwgMHgwZTgwLCAweDBlMDAsIDB4MGQ4MCwgMHgwZDAwLCAweDBjODAsIAotICAweDBjMDAsIDB4MGI4MCwgMHgwYjAwLCAweDBhODAsIDB4MGEwMCwgMHgwOTgwLCAweDA5MDAsIDB4MDg4MCwgCi0gIDB4MDgwMCwgMHgwNzgwLCAweDA3MDAsIDB4MDY4MCwgMHgwNjAwLCAweDA1ODAsIDB4MDUwMCwgMHgwNDgwLCAKLSAgMHgwNDAwLCAweDAzODAsIDB4MDMwMCwgMHgwMjgwLCAweDAyMDAsIDB4MDE4MCwgMHgwMTAwLCAweDAwODAsIAotICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgCi0gIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAKLSAgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIAotICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgCi0gIDB4MDAwMCwgMHgwMDgwLCAweDAxMDAsIDB4MDE4MCwgMHgwMjAwLCAweDAyODAsIDB4MDMwMCwgMHgwMzgwLCAKLSAgMHgwNDAwLCAweDA0ODAsIDB4MDUwMCwgMHgwNTgwLCAweDA2MDAsIDB4MDY4MCwgMHgwNzAwLCAweDA3ODAsIAotICAweDA4MDAsIDB4MDg4MCwgMHgwOTAwLCAweDA5ODAsIDB4MGEwMCwgMHgwYTgwLCAweDBiMDAsIDB4MGI4MCwgCi0gIDB4MGMwMCwgMHgwYzgwLCAweDBkMDAsIDB4MGQ4MCwgMHgwZTAwLCAweDBlODAsIDB4MGYwMCwgMHgwZjgwLCAKLSAgMHgxMDAwLCAweDEwODAsIDB4MTEwMCwgMHgxMTgwLCAweDEyMDAsIDB4MTI4MCwgMHgxMzAwLCAweDEzODAsIAotICAweDE0MDAsIDB4MTQ4MCwgMHgxNTAwLCAweDE1ODAsIDB4MTYwMCwgMHgxNjgwLCAweDE3MDAsIDB4MTc4MAorc3RhdGljIGNvbnN0IE9QSl9JTlQxNiBsdXRfbm1zZWRlY19yZWZbMVUgPDwgVDFfTk1TRURFQ19CSVRTXSA9IHsKKyAgICAweDE4MDAsIDB4MTc4MCwgMHgxNzAwLCAweDE2ODAsIDB4MTYwMCwgMHgxNTgwLCAweDE1MDAsIDB4MTQ4MCwKKyAgICAweDE0MDAsIDB4MTM4MCwgMHgxMzAwLCAweDEyODAsIDB4MTIwMCwgMHgxMTgwLCAweDExMDAsIDB4MTA4MCwKKyAgICAweDEwMDAsIDB4MGY4MCwgMHgwZjAwLCAweDBlODAsIDB4MGUwMCwgMHgwZDgwLCAweDBkMDAsIDB4MGM4MCwKKyAgICAweDBjMDAsIDB4MGI4MCwgMHgwYjAwLCAweDBhODAsIDB4MGEwMCwgMHgwOTgwLCAweDA5MDAsIDB4MDg4MCwKKyAgICAweDA4MDAsIDB4MDc4MCwgMHgwNzAwLCAweDA2ODAsIDB4MDYwMCwgMHgwNTgwLCAweDA1MDAsIDB4MDQ4MCwKKyAgICAweDA0MDAsIDB4MDM4MCwgMHgwMzAwLCAweDAyODAsIDB4MDIwMCwgMHgwMTgwLCAweDAxMDAsIDB4MDA4MCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwKKyAgICAweDAwMDAsIDB4MDA4MCwgMHgwMTAwLCAweDAxODAsIDB4MDIwMCwgMHgwMjgwLCAweDAzMDAsIDB4MDM4MCwKKyAgICAweDA0MDAsIDB4MDQ4MCwgMHgwNTAwLCAweDA1ODAsIDB4MDYwMCwgMHgwNjgwLCAweDA3MDAsIDB4MDc4MCwKKyAgICAweDA4MDAsIDB4MDg4MCwgMHgwOTAwLCAweDA5ODAsIDB4MGEwMCwgMHgwYTgwLCAweDBiMDAsIDB4MGI4MCwKKyAgICAweDBjMDAsIDB4MGM4MCwgMHgwZDAwLCAweDBkODAsIDB4MGUwMCwgMHgwZTgwLCAweDBmMDAsIDB4MGY4MCwKKyAgICAweDEwMDAsIDB4MTA4MCwgMHgxMTAwLCAweDExODAsIDB4MTIwMCwgMHgxMjgwLCAweDEzMDAsIDB4MTM4MCwKKyAgICAweDE0MDAsIDB4MTQ4MCwgMHgxNTAwLCAweDE1ODAsIDB4MTYwMCwgMHgxNjgwLCAweDE3MDAsIDB4MTc4MAogfTsKIAotc3RhdGljIE9QSl9JTlQxNiBsdXRfbm1zZWRlY19yZWYwWzEgPDwgVDFfTk1TRURFQ19CSVRTXSA9IHsKLSAgMHgyMDAwLCAweDFmMDAsIDB4MWUwMCwgMHgxZDAwLCAweDFjMDAsIDB4MWIwMCwgMHgxYTgwLCAweDE5ODAsIAotICAweDE4ODAsIDB4MTc4MCwgMHgxNzAwLCAweDE2MDAsIDB4MTUwMCwgMHgxNDgwLCAweDEzODAsIDB4MTMwMCwgCi0gIDB4MTIwMCwgMHgxMTgwLCAweDEwODAsIDB4MTAwMCwgMHgwZjAwLCAweDBlODAsIDB4MGUwMCwgMHgwZDAwLCAKLSAgMHgwYzgwLCAweDBjMDAsIDB4MGI4MCwgMHgwYTgwLCAweDBhMDAsIDB4MDk4MCwgMHgwOTAwLCAweDA4ODAsIAotICAweDA4MDAsIDB4MDc4MCwgMHgwNzAwLCAweDA2ODAsIDB4MDYwMCwgMHgwNTgwLCAweDA1ODAsIDB4MDUwMCwgCi0gIDB4MDQ4MCwgMHgwNDAwLCAweDA0MDAsIDB4MDM4MCwgMHgwMzAwLCAweDAzMDAsIDB4MDI4MCwgMHgwMjgwLCAKLSAgMHgwMjAwLCAweDAyMDAsIDB4MDE4MCwgMHgwMTgwLCAweDAxMDAsIDB4MDEwMCwgMHgwMTAwLCAweDAwODAsIAotICAweDAwODAsIDB4MDA4MCwgMHgwMDgwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgCi0gIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDA4MCwgMHgwMDgwLCAKLSAgMHgwMDgwLCAweDAwODAsIDB4MDEwMCwgMHgwMTAwLCAweDAxMDAsIDB4MDE4MCwgMHgwMTgwLCAweDAyMDAsIAotICAweDAyMDAsIDB4MDI4MCwgMHgwMjgwLCAweDAzMDAsIDB4MDMwMCwgMHgwMzgwLCAweDA0MDAsIDB4MDQwMCwgCi0gIDB4MDQ4MCwgMHgwNTAwLCAweDA1ODAsIDB4MDU4MCwgMHgwNjAwLCAweDA2ODAsIDB4MDcwMCwgMHgwNzgwLCAKLSAgMHgwODAwLCAweDA4ODAsIDB4MDkwMCwgMHgwOTgwLCAweDBhMDAsIDB4MGE4MCwgMHgwYjgwLCAweDBjMDAsIAotICAweDBjODAsIDB4MGQwMCwgMHgwZTAwLCAweDBlODAsIDB4MGYwMCwgMHgxMDAwLCAweDEwODAsIDB4MTE4MCwgCi0gIDB4MTIwMCwgMHgxMzAwLCAweDEzODAsIDB4MTQ4MCwgMHgxNTAwLCAweDE2MDAsIDB4MTcwMCwgMHgxNzgwLCAKLSAgMHgxODgwLCAweDE5ODAsIDB4MWE4MCwgMHgxYjAwLCAweDFjMDAsIDB4MWQwMCwgMHgxZTAwLCAweDFmMDAKK3N0YXRpYyBjb25zdCBPUEpfSU5UMTYgbHV0X25tc2VkZWNfcmVmMFsxVSA8PCBUMV9OTVNFREVDX0JJVFNdID0geworICAgIDB4MjAwMCwgMHgxZjAwLCAweDFlMDAsIDB4MWQwMCwgMHgxYzAwLCAweDFiMDAsIDB4MWE4MCwgMHgxOTgwLAorICAgIDB4MTg4MCwgMHgxNzgwLCAweDE3MDAsIDB4MTYwMCwgMHgxNTAwLCAweDE0ODAsIDB4MTM4MCwgMHgxMzAwLAorICAgIDB4MTIwMCwgMHgxMTgwLCAweDEwODAsIDB4MTAwMCwgMHgwZjAwLCAweDBlODAsIDB4MGUwMCwgMHgwZDAwLAorICAgIDB4MGM4MCwgMHgwYzAwLCAweDBiODAsIDB4MGE4MCwgMHgwYTAwLCAweDA5ODAsIDB4MDkwMCwgMHgwODgwLAorICAgIDB4MDgwMCwgMHgwNzgwLCAweDA3MDAsIDB4MDY4MCwgMHgwNjAwLCAweDA1ODAsIDB4MDU4MCwgMHgwNTAwLAorICAgIDB4MDQ4MCwgMHgwNDAwLCAweDA0MDAsIDB4MDM4MCwgMHgwMzAwLCAweDAzMDAsIDB4MDI4MCwgMHgwMjgwLAorICAgIDB4MDIwMCwgMHgwMjAwLCAweDAxODAsIDB4MDE4MCwgMHgwMTAwLCAweDAxMDAsIDB4MDEwMCwgMHgwMDgwLAorICAgIDB4MDA4MCwgMHgwMDgwLCAweDAwODAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLAorICAgIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDA4MCwgMHgwMDgwLAorICAgIDB4MDA4MCwgMHgwMDgwLCAweDAxMDAsIDB4MDEwMCwgMHgwMTAwLCAweDAxODAsIDB4MDE4MCwgMHgwMjAwLAorICAgIDB4MDIwMCwgMHgwMjgwLCAweDAyODAsIDB4MDMwMCwgMHgwMzAwLCAweDAzODAsIDB4MDQwMCwgMHgwNDAwLAorICAgIDB4MDQ4MCwgMHgwNTAwLCAweDA1ODAsIDB4MDU4MCwgMHgwNjAwLCAweDA2ODAsIDB4MDcwMCwgMHgwNzgwLAorICAgIDB4MDgwMCwgMHgwODgwLCAweDA5MDAsIDB4MDk4MCwgMHgwYTAwLCAweDBhODAsIDB4MGI4MCwgMHgwYzAwLAorICAgIDB4MGM4MCwgMHgwZDAwLCAweDBlMDAsIDB4MGU4MCwgMHgwZjAwLCAweDEwMDAsIDB4MTA4MCwgMHgxMTgwLAorICAgIDB4MTIwMCwgMHgxMzAwLCAweDEzODAsIDB4MTQ4MCwgMHgxNTAwLCAweDE2MDAsIDB4MTcwMCwgMHgxNzgwLAorICAgIDB4MTg4MCwgMHgxOTgwLCAweDFhODAsIDB4MWIwMCwgMHgxYzAwLCAweDFkMDAsIDB4MWUwMCwgMHgxZjAwCiB9OwogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3QyLmMgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3QyLmMKaW5kZXggNWFmMWE2OS4uNmY5NTZkMSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Mi5jCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdDIuYwpAQCAtMSw2ICsxLDYgQEAKIC8qCi0gKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcyAKLSAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZCAKKyAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQKICAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKICAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KICAqCkBAIC04LDExICs4LDEyIEBACiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAxNCwgUHJvZmVzc29yIEJlbm9pdCBNYWNxCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMywgRGF2aWQgSmFuc3NlbnMKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDAzLCBZYW5uaWNrIFZlcnNjaHVlcmVuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXggCisgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwNywgRnJhbmNvaXMtT2xpdmllciBEZXZhdXgKICAqIENvcHlyaWdodCAoYykgMjAwMy0yMDE0LCBBbnRvbmluIERlc2NhbXBlCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIEhlcnZlIERyb2xvbiwgRnJlZUltYWdlIFRlYW0KLSAqIENvcHlyaWdodCAoYykgMjAwOCwgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRlIgCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZSCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQorICogQ29weXJpZ2h0IChjKSAyMDE3LCBJbnRvUElYIFNBIDxzdXBwb3J0QGludG9waXguY29tPgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKQEAgLTM4LDYgKzM5LDggQEAKICAqLwogCiAjaW5jbHVkZSAib3BqX2luY2x1ZGVzLmgiCisjaW5jbHVkZSAib3BqX2NvbW1vbi5oIgorCiAKIC8qKiBAZGVmZ3JvdXAgVDIgVDIgLSBJbXBsZW1lbnRhdGlvbiBvZiBhIHRpZXItMiBjb2RpbmcgKi8KIC8qQHsqLwpAQCAtNDcsNyArNTAsNyBAQAogCiBzdGF0aWMgdm9pZCBvcGpfdDJfcHV0Y29tbWFjb2RlKG9wal9iaW9fdCAqYmlvLCBPUEpfSU5UMzIgbik7CiAKLXN0YXRpYyBPUEpfVUlOVDMyIG9wal90Ml9nZXRjb21tYWNvZGUob3BqX2Jpb190ICpiaW8pOyAKK3N0YXRpYyBPUEpfVUlOVDMyIG9wal90Ml9nZXRjb21tYWNvZGUob3BqX2Jpb190ICpiaW8pOwogLyoqCiBWYXJpYWJsZSBsZW5ndGggY29kZSBmb3Igc2lnbmFsbGluZyBkZWx0YSBaaWwgKHRydW5jYXRpb24gcG9pbnQpCiBAcGFyYW0gYmlvICBCaXQgSW5wdXQvT3V0cHV0IGNvbXBvbmVudApAQCAtNjYsMTYgKzY5LDIwIEBACiBAcGFyYW0gcF9kYXRhX3dyaXR0ZW4gICBGSVhNRSBET0MKIEBwYXJhbSBsZW4gTGVuZ3RoIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKIEBwYXJhbSBjc3RyX2luZm8gQ29kZXN0cmVhbSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKK0BwYXJhbSBwX3QyX21vZGUgSWYgPT0gVEhSRVNIX0NBTEMgSW4gVGhyZXNob2xkIGNhbGN1bGF0aW9uICxJZiA9PSBGSU5BTF9QQVNTIEZpbmFsIHBhc3MKK0BwYXJhbSBwX21hbmFnZXIgdGhlIHVzZXIgZXZlbnQgbWFuYWdlcgogQHJldHVybgogKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfdDJfZW5jb2RlX3BhY2tldCggICBPUEpfVUlOVDMyIHRpbGVubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqdGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKnRjcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqcGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKmRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqY3N0cl9pbmZvKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdDJfZW5jb2RlX3BhY2tldChPUEpfVUlOVDMyIHRpbGVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKnRjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqY3N0cl9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEoyS19UMl9NT0RFIHBfdDJfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcik7CiAKIC8qKgogRGVjb2RlIGEgcGFja2V0IG9mIGEgdGlsZSBmcm9tIGEgc291cmNlIGJ1ZmZlcgpAQCAtODcsMzkgKzk0LDQwIEBACiBAcGFyYW0gZGF0YV9yZWFkICAgRklYTUUgRE9DCiBAcGFyYW0gbWF4X2xlbmd0aCAgRklYTUUgRE9DCiBAcGFyYW0gcGFja19pbmZvIFBhY2tldCBpbmZvcm1hdGlvbgorQHBhcmFtIHBfbWFuYWdlciB0aGUgdXNlciBldmVudCBtYW5hZ2VyCiAKIEByZXR1cm4gIEZJWE1FIERPQwogKi8KLXN0YXRpYyBPUEpfQk9PTCBvcGpfdDJfZGVjb2RlX3BhY2tldCggICBvcGpfdDJfdCogdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlX3QgKnRpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjcF90ICp0Y3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKnBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIGRhdGFfcmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG1heF9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKnBhY2tfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcik7CitzdGF0aWMgT1BKX0JPT0wgb3BqX3QyX2RlY29kZV9wYWNrZXQob3BqX3QyX3QqIHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICp0aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y3BfdCAqdGNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9waV9pdGVyYXRvcl90ICpwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBkYXRhX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBtYXhfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9wYWNrZXRfaW5mb190ICpwYWNrX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpOwogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3QyX3NraXBfcGFja2V0KCBvcGpfdDJfdCogcF90MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICpwX3RpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKnBfdGNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKnBfcGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9zcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9wYWNrZXRfaW5mb190ICpwX3BhY2tfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdDJfc2tpcF9wYWNrZXQob3BqX3QyX3QqIHBfdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICpwX3RpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y3BfdCAqcF90Y3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9waV9pdGVyYXRvcl90ICpwX3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9wYWNrZXRfaW5mb190ICpwX3BhY2tfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpOwogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3QyX3JlYWRfcGFja2V0X2hlYWRlciggIG9wal90Ml90KiBwX3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqcF90aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKnBfdGNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqcF9waSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JPT0wgKiBwX2lzX2RhdGFfcHJlc2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKnBfc3JjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfcmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9wYWNrZXRfaW5mb190ICpwX3BhY2tfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpOworc3RhdGljIE9QSl9CT09MIG9wal90Ml9yZWFkX3BhY2tldF9oZWFkZXIob3BqX3QyX3QqIHBfdDIsCisgICAgICAgIG9wal90Y2RfdGlsZV90ICpwX3RpbGUsCisgICAgICAgIG9wal90Y3BfdCAqcF90Y3AsCisgICAgICAgIG9wal9waV9pdGVyYXRvcl90ICpwX3BpLAorICAgICAgICBPUEpfQk9PTCAqIHBfaXNfZGF0YV9wcmVzZW50LAorICAgICAgICBPUEpfQllURSAqcF9zcmNfZGF0YSwKKyAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV9yZWFkLAorICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X2xlbmd0aCwKKyAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKnBfcGFja19pbmZvLAorICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcik7CiAKIHN0YXRpYyBPUEpfQk9PTCBvcGpfdDJfcmVhZF9wYWNrZXRfZGF0YShvcGpfdDJfdCogcF90MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqcF90aWxlLApAQCAtMTQ0LDEwICsxNTIsMTAgQEAKIEBwYXJhbSBjYmxrc3R5CiBAcGFyYW0gZmlyc3QKICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3QyX2luaXRfc2VnKCAgICBvcGpfdGNkX2NibGtfZGVjX3QqIGNibGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjYmxrc3R5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBmaXJzdCk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX3QyX2luaXRfc2VnKG9wal90Y2RfY2Jsa19kZWNfdCogY2JsaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBjYmxrc3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGZpcnN0KTsKIAogLypAfSovCiAKQEAgLTE1NiwxNzkgKzE2NCwxOTcgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qICNkZWZpbmUgUkVTVEFSVCAweDA0ICovCi1zdGF0aWMgdm9pZCBvcGpfdDJfcHV0Y29tbWFjb2RlKG9wal9iaW9fdCAqYmlvLCBPUEpfSU5UMzIgbikgewotICAgICAgICB3aGlsZSAoLS1uID49IDApIHsKLSAgICAgICAgICAgICAgICBvcGpfYmlvX3dyaXRlKGJpbywgMSwgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgb3BqX2Jpb193cml0ZShiaW8sIDAsIDEpOworc3RhdGljIHZvaWQgb3BqX3QyX3B1dGNvbW1hY29kZShvcGpfYmlvX3QgKmJpbywgT1BKX0lOVDMyIG4pCit7CisgICAgd2hpbGUgKC0tbiA+PSAwKSB7CisgICAgICAgIG9wal9iaW9fd3JpdGUoYmlvLCAxLCAxKTsKKyAgICB9CisgICAgb3BqX2Jpb193cml0ZShiaW8sIDAsIDEpOwogfQogCiBzdGF0aWMgT1BKX1VJTlQzMiBvcGpfdDJfZ2V0Y29tbWFjb2RlKG9wal9iaW9fdCAqYmlvKQogewogICAgIE9QSl9VSU5UMzIgbiA9IDA7CiAgICAgd2hpbGUgKG9wal9iaW9fcmVhZChiaW8sIDEpKSB7Ci0JICAgICsrbjsKKyAgICAgICAgKytuOwogICAgIH0KICAgICByZXR1cm4gbjsKIH0KIAotc3RhdGljIHZvaWQgb3BqX3QyX3B1dG51bXBhc3NlcyhvcGpfYmlvX3QgKmJpbywgT1BKX1VJTlQzMiBuKSB7Ci0gICAgICAgIGlmIChuID09IDEpIHsKLSAgICAgICAgICAgICAgICBvcGpfYmlvX3dyaXRlKGJpbywgMCwgMSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobiA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2Jpb193cml0ZShiaW8sIDIsIDIpOwotICAgICAgICB9IGVsc2UgaWYgKG4gPD0gNSkgewotICAgICAgICAgICAgICAgIG9wal9iaW9fd3JpdGUoYmlvLCAweGMgfCAobiAtIDMpLCA0KTsKLSAgICAgICAgfSBlbHNlIGlmIChuIDw9IDM2KSB7Ci0gICAgICAgICAgICAgICAgb3BqX2Jpb193cml0ZShiaW8sIDB4MWUwIHwgKG4gLSA2KSwgOSk7Ci0gICAgICAgIH0gZWxzZSBpZiAobiA8PSAxNjQpIHsKLSAgICAgICAgICAgICAgICBvcGpfYmlvX3dyaXRlKGJpbywgMHhmZjgwIHwgKG4gLSAzNyksIDE2KTsKLSAgICAgICAgfQorc3RhdGljIHZvaWQgb3BqX3QyX3B1dG51bXBhc3NlcyhvcGpfYmlvX3QgKmJpbywgT1BKX1VJTlQzMiBuKQoreworICAgIGlmIChuID09IDEpIHsKKyAgICAgICAgb3BqX2Jpb193cml0ZShiaW8sIDAsIDEpOworICAgIH0gZWxzZSBpZiAobiA9PSAyKSB7CisgICAgICAgIG9wal9iaW9fd3JpdGUoYmlvLCAyLCAyKTsKKyAgICB9IGVsc2UgaWYgKG4gPD0gNSkgeworICAgICAgICBvcGpfYmlvX3dyaXRlKGJpbywgMHhjIHwgKG4gLSAzKSwgNCk7CisgICAgfSBlbHNlIGlmIChuIDw9IDM2KSB7CisgICAgICAgIG9wal9iaW9fd3JpdGUoYmlvLCAweDFlMCB8IChuIC0gNiksIDkpOworICAgIH0gZWxzZSBpZiAobiA8PSAxNjQpIHsKKyAgICAgICAgb3BqX2Jpb193cml0ZShiaW8sIDB4ZmY4MCB8IChuIC0gMzcpLCAxNik7CisgICAgfQogfQogCi1zdGF0aWMgT1BKX1VJTlQzMiBvcGpfdDJfZ2V0bnVtcGFzc2VzKG9wal9iaW9fdCAqYmlvKSB7Ci0gICAgICAgIE9QSl9VSU5UMzIgbjsKLSAgICAgICAgaWYgKCFvcGpfYmlvX3JlYWQoYmlvLCAxKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgaWYgKCFvcGpfYmlvX3JlYWQoYmlvLCAxKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gMjsKLSAgICAgICAgaWYgKChuID0gb3BqX2Jpb19yZWFkKGJpbywgMikpICE9IDMpCi0gICAgICAgICAgICAgICAgcmV0dXJuICgzICsgbik7Ci0gICAgICAgIGlmICgobiA9IG9wal9iaW9fcmVhZChiaW8sIDUpKSAhPSAzMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gKDYgKyBuKTsKLSAgICAgICAgcmV0dXJuICgzNyArIG9wal9iaW9fcmVhZChiaW8sIDcpKTsKK3N0YXRpYyBPUEpfVUlOVDMyIG9wal90Ml9nZXRudW1wYXNzZXMob3BqX2Jpb190ICpiaW8pCit7CisgICAgT1BKX1VJTlQzMiBuOworICAgIGlmICghb3BqX2Jpb19yZWFkKGJpbywgMSkpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghb3BqX2Jpb19yZWFkKGJpbywgMSkpIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIGlmICgobiA9IG9wal9iaW9fcmVhZChiaW8sIDIpKSAhPSAzKSB7CisgICAgICAgIHJldHVybiAoMyArIG4pOworICAgIH0KKyAgICBpZiAoKG4gPSBvcGpfYmlvX3JlYWQoYmlvLCA1KSkgIT0gMzEpIHsKKyAgICAgICAgcmV0dXJuICg2ICsgbik7CisgICAgfQorICAgIHJldHVybiAoMzcgKyBvcGpfYmlvX3JlYWQoYmlvLCA3KSk7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLU9QSl9CT09MIG9wal90Ml9lbmNvZGVfcGFja2V0cyggb3BqX3QyX3QqIHBfdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqcF90aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4bGF5ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9kZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmZvX3QgKmNzdHJfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RwX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHBfdHBfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfcGlubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSjJLX1QyX01PREUgcF90Ml9tb2RlKQorT1BKX0JPT0wgb3BqX3QyX2VuY29kZV9wYWNrZXRzKG9wal90Ml90KiBwX3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICpwX3RpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heGxheWVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9kZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmZvX3QgKmNzdHJfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdHBfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBwX3RwX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfcGlubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKMktfVDJfTU9ERSBwX3QyX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpCiB7Ci0gICAgICAgIE9QSl9CWVRFICpsX2N1cnJlbnRfZGF0YSA9IHBfZGVzdDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX2J5dGVzID0gMDsKLSAgICAgICAgT1BKX1VJTlQzMiBjb21wbm87Ci0gICAgICAgIE9QSl9VSU5UMzIgcG9jOwotICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqbF9waSA9IDAwOwotICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqbF9jdXJyZW50X3BpID0gMDA7Ci0gICAgICAgIG9wal9pbWFnZV90ICpsX2ltYWdlID0gcF90Mi0+aW1hZ2U7Ci0gICAgICAgIG9wal9jcF90ICpsX2NwID0gcF90Mi0+Y3A7Ci0gICAgICAgIG9wal90Y3BfdCAqbF90Y3AgPSAmbF9jcC0+dGNwc1twX3RpbGVfbm9dOwotICAgICAgICBPUEpfVUlOVDMyIHBvY25vID0gKGxfY3AtPnJzaXogPT0gT1BKX1BST0ZJTEVfQ0lORU1BXzRLKT8gMjogMTsKLSAgICAgICAgT1BKX1VJTlQzMiBsX21heF9jb21wID0gbF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX21heF9jb21wX3NpemUgPiAwID8gbF9pbWFnZS0+bnVtY29tcHMgOiAxOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfcG9jcyA9IGxfdGNwLT5udW1wb2NzICsgMTsKKyAgICBPUEpfQllURSAqbF9jdXJyZW50X2RhdGEgPSBwX2Rlc3Q7CisgICAgT1BKX1VJTlQzMiBsX25iX2J5dGVzID0gMDsKKyAgICBPUEpfVUlOVDMyIGNvbXBubzsKKyAgICBPUEpfVUlOVDMyIHBvYzsKKyAgICBvcGpfcGlfaXRlcmF0b3JfdCAqbF9waSA9IDAwOworICAgIG9wal9waV9pdGVyYXRvcl90ICpsX2N1cnJlbnRfcGkgPSAwMDsKKyAgICBvcGpfaW1hZ2VfdCAqbF9pbWFnZSA9IHBfdDItPmltYWdlOworICAgIG9wal9jcF90ICpsX2NwID0gcF90Mi0+Y3A7CisgICAgb3BqX3RjcF90ICpsX3RjcCA9ICZsX2NwLT50Y3BzW3BfdGlsZV9ub107CisgICAgT1BKX1VJTlQzMiBwb2NubyA9IChsX2NwLT5yc2l6ID09IE9QSl9QUk9GSUxFX0NJTkVNQV80SykgPyAyIDogMTsKKyAgICBPUEpfVUlOVDMyIGxfbWF4X2NvbXAgPSBsX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fbWF4X2NvbXBfc2l6ZSA+IDAgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1hZ2UtPm51bWNvbXBzIDogMTsKKyAgICBPUEpfVUlOVDMyIGxfbmJfcG9jcyA9IGxfdGNwLT5udW1wb2NzICsgMTsKIAotICAgICAgICBsX3BpID0gb3BqX3BpX2luaXRpYWxpc2VfZW5jb2RlKGxfaW1hZ2UsIGxfY3AsIHBfdGlsZV9ubywgcF90Ml9tb2RlKTsKLSAgICAgICAgaWYgKCFsX3BpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgIGxfcGkgPSBvcGpfcGlfaW5pdGlhbGlzZV9lbmNvZGUobF9pbWFnZSwgbF9jcCwgcF90aWxlX25vLCBwX3QyX21vZGUpOworICAgIGlmICghbF9waSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICAqIHBfZGF0YV93cml0dGVuID0gMDsKKyAgICAqIHBfZGF0YV93cml0dGVuID0gMDsKIAotICAgICAgICBpZiAocF90Ml9tb2RlID09IFRIUkVTSF9DQUxDICl7IC8qIENhbGN1bGF0aW5nIHRocmVzaG9sZCAqLwotICAgICAgICAgICAgICAgIGxfY3VycmVudF9waSA9IGxfcGk7CisgICAgaWYgKHBfdDJfbW9kZSA9PSBUSFJFU0hfQ0FMQykgeyAvKiBDYWxjdWxhdGluZyB0aHJlc2hvbGQgKi8KKyAgICAgICAgbF9jdXJyZW50X3BpID0gbF9waTsKIAotICAgICAgICAgICAgICAgIGZvciAgICAgKGNvbXBubyA9IDA7IGNvbXBubyA8IGxfbWF4X2NvbXA7ICsrY29tcG5vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxfY29tcF9sZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3BpID0gbF9waTsKKyAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBsX21heF9jb21wOyArK2NvbXBubykgeworICAgICAgICAgICAgT1BKX1VJTlQzMiBsX2NvbXBfbGVuID0gMDsKKyAgICAgICAgICAgIGxfY3VycmVudF9waSA9IGxfcGk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocG9jID0gMDsgcG9jIDwgcG9jbm8gOyArK3BvYykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxfdHBfbnVtID0gY29tcG5vOworICAgICAgICAgICAgZm9yIChwb2MgPSAwOyBwb2MgPCBwb2NubyA7ICsrcG9jKSB7CisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsX3RwX251bSA9IGNvbXBubzsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPIE1TRCA6IGNoZWNrIHdoeSB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBmYWlsIChjZi4gdjEpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9waV9jcmVhdGVfZW5jb2RlKGxfcGksIGxfY3AscF90aWxlX25vLHBvYyxsX3RwX251bSxwX3RwX3BvcyxwX3QyX21vZGUpOworICAgICAgICAgICAgICAgIC8qIFRPRE8gTVNEIDogY2hlY2sgd2h5IHRoaXMgZnVuY3Rpb24gY2Fubm90IGZhaWwgKGNmLiB2MSkgKi8KKyAgICAgICAgICAgICAgICBvcGpfcGlfY3JlYXRlX2VuY29kZShsX3BpLCBsX2NwLCBwX3RpbGVfbm8sIHBvYywgbF90cF9udW0sIHBfdHBfcG9zLCBwX3QyX21vZGUpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2N1cnJlbnRfcGktPnBvYy5wcmcgPT0gT1BKX1BST0dfVU5LTk9XTikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETyBBREUgOiBhZGQgYW4gZXJyb3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9waV9kZXN0cm95KGxfcGksIGxfbmJfcG9jcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvcGpfcGlfbmV4dChsX2N1cnJlbnRfcGkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY3VycmVudF9waS0+bGF5bm8gPCBwX21heGxheWVycykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9uYl9ieXRlcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal90Ml9lbmNvZGVfcGFja2V0KHBfdGlsZV9ubyxwX3RpbGUsIGxfdGNwLCBsX2N1cnJlbnRfcGksIGxfY3VycmVudF9kYXRhLCAmbF9uYl9ieXRlcywgcF9tYXhfbGVuLCBjc3RyX2luZm8pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9waV9kZXN0cm95KGxfcGksIGxfbmJfcG9jcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY29tcF9sZW4gKz0gbF9uYl9ieXRlczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9kYXRhICs9IGxfbmJfYnl0ZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21heF9sZW4gLT0gbF9uYl9ieXRlczsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwX2RhdGFfd3JpdHRlbiArPSBsX25iX2J5dGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fbWF4X2NvbXBfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2NvbXBfbGVuID4gbF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX21heF9jb21wX3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9waV9kZXN0cm95KGxfcGksIGxfbmJfcG9jcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X3BpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsgIC8qIHQyX21vZGUgPT0gRklOQUxfUEFTUyAgKi8KLSAgICAgICAgICAgICAgICBvcGpfcGlfY3JlYXRlX2VuY29kZShsX3BpLCBsX2NwLHBfdGlsZV9ubyxwX3Bpbm8scF90cF9udW0scF90cF9wb3MscF90Ml9tb2RlKTsKLQotICAgICAgICAgICAgICAgIGxfY3VycmVudF9waSA9ICZsX3BpW3BfcGlub107CiAgICAgICAgICAgICAgICAgaWYgKGxfY3VycmVudF9waS0+cG9jLnByZyA9PSBPUEpfUFJPR19VTktOT1dOKSB7CiAgICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gQURFIDogYWRkIGFuIGVycm9yICovCiAgICAgICAgICAgICAgICAgICAgIG9wal9waV9kZXN0cm95KGxfcGksIGxfbmJfcG9jcyk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHdoaWxlIChvcGpfcGlfbmV4dChsX2N1cnJlbnRfcGkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jdXJyZW50X3BpLT5sYXlubyA8IHBfbWF4bGF5ZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbmJfYnl0ZXM9MDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxfY3VycmVudF9waS0+bGF5bm8gPCBwX21heGxheWVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgbF9uYl9ieXRlcyA9IDA7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3QyX2VuY29kZV9wYWNrZXQocF90aWxlX25vLHBfdGlsZSwgbF90Y3AsIGxfY3VycmVudF9waSwgbF9jdXJyZW50X2RhdGEsICZsX25iX2J5dGVzLCBwX21heF9sZW4sIGNzdHJfaW5mbykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfZGVzdHJveShsX3BpLCBsX25iX3BvY3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSBsX25iX2J5dGVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21heF9sZW4gLT0gbF9uYl9ieXRlczsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBfZGF0YV93cml0dGVuICs9IGxfbmJfYnl0ZXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSU5ERVggPj4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY3N0cl9pbmZvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY3N0cl9pbmZvLT5pbmRleF93cml0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RpbGVfaW5mb190ICppbmZvX1RMID0gJmNzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKmluZm9fUEsgPSAmaW5mb19UTC0+cGFja2V0W2NzdHJfaW5mby0+cGFja25vXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3N0cl9pbmZvLT5wYWNrbm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19QSy0+c3RhcnRfcG9zID0gaW5mb19UTC0+ZW5kX2hlYWRlciArIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX1BLLT5zdGFydF9wb3MgPSAoKGxfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV90cF9vbiB8IGxfdGNwLT5QT0MpJiYgaW5mb19QSy0+c3RhcnRfcG9zKSA/IGluZm9fUEstPnN0YXJ0X3BvcyA6IGluZm9fVEwtPnBhY2tldFtjc3RyX2luZm8tPnBhY2tubyAtIDFdLmVuZF9wb3MgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19QSy0+ZW5kX3BvcyA9IGluZm9fUEstPnN0YXJ0X3BvcyArIGxfbmJfYnl0ZXMgLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19QSy0+ZW5kX3BoX3BvcyArPSBpbmZvX1BLLT5zdGFydF9wb3MgLSAxOyAgLyogRW5kIG9mIHBhY2tldCBoZWFkZXIgd2hpY2ggbm93IG9ubHkgcmVwcmVzZW50cyB0aGUgZGlzdGFuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHN0YXJ0IG9mIHBhY2tldCBpcyBpbmNyZW1lbnRlZCBieSB2YWx1ZSBvZiBzdGFydCBvZiBwYWNrZXQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5mby0+cGFja25vKys7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogPDwgSU5ERVggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytwX3RpbGUtPnBhY2tubzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal90Ml9lbmNvZGVfcGFja2V0KHBfdGlsZV9ubywgcF90aWxlLCBsX3RjcCwgbF9jdXJyZW50X3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGEsICZsX25iX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYXhfbGVuLCBjc3RyX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3QyX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2Rlc3Ryb3kobF9waSwgbF9uYl9wb2NzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBsX2NvbXBfbGVuICs9IGxfbmJfYnl0ZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSBsX25iX2J5dGVzOworICAgICAgICAgICAgICAgICAgICAgICAgcF9tYXhfbGVuIC09IGxfbmJfYnl0ZXM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICogcF9kYXRhX3dyaXR0ZW4gKz0gbF9uYl9ieXRlczsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fbWF4X2NvbXBfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobF9jb21wX2xlbiA+IGxfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9tYXhfY29tcF9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfZGVzdHJveShsX3BpLCBsX25iX3BvY3MpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X3BpOworICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgfSBlbHNlIHsgLyogdDJfbW9kZSA9PSBGSU5BTF9QQVNTICAqLworICAgICAgICBvcGpfcGlfY3JlYXRlX2VuY29kZShsX3BpLCBsX2NwLCBwX3RpbGVfbm8sIHBfcGlubywgcF90cF9udW0sIHBfdHBfcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3QyX21vZGUpOwogCi0gICAgICAgIG9wal9waV9kZXN0cm95KGxfcGksIGxfbmJfcG9jcyk7CisgICAgICAgIGxfY3VycmVudF9waSA9ICZsX3BpW3BfcGlub107CisgICAgICAgIGlmIChsX2N1cnJlbnRfcGktPnBvYy5wcmcgPT0gT1BKX1BST0dfVU5LTk9XTikgeworICAgICAgICAgICAgLyogVE9ETyBBREUgOiBhZGQgYW4gZXJyb3IgKi8KKyAgICAgICAgICAgIG9wal9waV9kZXN0cm95KGxfcGksIGxfbmJfcG9jcyk7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChvcGpfcGlfbmV4dChsX2N1cnJlbnRfcGkpKSB7CisgICAgICAgICAgICBpZiAobF9jdXJyZW50X3BpLT5sYXlubyA8IHBfbWF4bGF5ZXJzKSB7CisgICAgICAgICAgICAgICAgbF9uYl9ieXRlcyA9IDA7CiAKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICAgICAgICAgIGlmICghIG9wal90Ml9lbmNvZGVfcGFja2V0KHBfdGlsZV9ubywgcF90aWxlLCBsX3RjcCwgbF9jdXJyZW50X3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9kYXRhLCAmbF9uYl9ieXRlcywgcF9tYXhfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5mbywgcF90Ml9tb2RlLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIG9wal9waV9kZXN0cm95KGxfcGksIGxfbmJfcG9jcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gbF9uYl9ieXRlczsKKyAgICAgICAgICAgICAgICBwX21heF9sZW4gLT0gbF9uYl9ieXRlczsKKworICAgICAgICAgICAgICAgICogcF9kYXRhX3dyaXR0ZW4gKz0gbF9uYl9ieXRlczsKKworICAgICAgICAgICAgICAgIC8qIElOREVYID4+ICovCisgICAgICAgICAgICAgICAgaWYgKGNzdHJfaW5mbykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY3N0cl9pbmZvLT5pbmRleF93cml0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RpbGVfaW5mb190ICppbmZvX1RMID0gJmNzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dOworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKmluZm9fUEsgPSAmaW5mb19UTC0+cGFja2V0W2NzdHJfaW5mby0+cGFja25vXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3N0cl9pbmZvLT5wYWNrbm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX1BLLT5zdGFydF9wb3MgPSBpbmZvX1RMLT5lbmRfaGVhZGVyICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19QSy0+c3RhcnRfcG9zID0gKChsX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fdHBfb24gfCBsX3RjcC0+UE9DKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX1BLLT5zdGFydF9wb3MpID8gaW5mb19QSy0+c3RhcnRfcG9zIDogaW5mb19UTC0+cGFja2V0W2NzdHJfaW5mby0+cGFja25vIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxXS5lbmRfcG9zICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fUEstPmVuZF9wb3MgPSBpbmZvX1BLLT5zdGFydF9wb3MgKyBsX25iX2J5dGVzIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fUEstPmVuZF9waF9wb3MgKz0gaW5mb19QSy0+c3RhcnRfcG9zIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTsgIC8qIEVuZCBvZiBwYWNrZXQgaGVhZGVyIHdoaWNoIG5vdyBvbmx5IHJlcHJlc2VudHMgdGhlIGRpc3RhbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdGFydCBvZiBwYWNrZXQgaXMgaW5jcmVtZW50ZWQgYnkgdmFsdWUgb2Ygc3RhcnQgb2YgcGFja2V0Ki8KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5mby0+cGFja25vKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIDw8IElOREVYICovCisgICAgICAgICAgICAgICAgKytwX3RpbGUtPnBhY2tubzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG9wal9waV9kZXN0cm95KGxfcGksIGxfbmJfcG9jcyk7CisKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKIC8qIHNlZSBpc3N1ZSA4MCAqLwpAQCAtMzM4LDE1NCArMzY0LDIwOCBAQAogLyogaXNzdWUgMjkwICovCiBzdGF0aWMgdm9pZCBvcGpfbnVsbF9qYXNfZnByaW50ZihGSUxFKiBmaWxlLCBjb25zdCBjaGFyICogZm9ybWF0LCAuLi4pCiB7Ci0gICh2b2lkKWZpbGU7Ci0gICh2b2lkKWZvcm1hdDsKKyAgICAodm9pZClmaWxlOworICAgICh2b2lkKWZvcm1hdDsKIH0KICNkZWZpbmUgSkFTX0ZQUklOVEYgb3BqX251bGxfamFzX2ZwcmludGYKICNlbmRpZgogCi1PUEpfQk9PTCBvcGpfdDJfZGVjb2RlX3BhY2tldHMoIG9wal90Ml90ICpwX3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfdGlsZV9ubywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlX3QgKnBfdGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKnBfc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmRleF90ICpwX2NzdHJfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKQorT1BKX0JPT0wgb3BqX3QyX2RlY29kZV9wYWNrZXRzKG9wal90Y2RfdCogdGNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Ml90ICpwX3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICpwX3RpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKnBfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmRleF90ICpwX2NzdHJfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpCiB7Ci0gICAgICAgIE9QSl9CWVRFICpsX2N1cnJlbnRfZGF0YSA9IHBfc3JjOwotICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqbF9waSA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIHBpbm87Ci0gICAgICAgIG9wal9pbWFnZV90ICpsX2ltYWdlID0gcF90Mi0+aW1hZ2U7Ci0gICAgICAgIG9wal9jcF90ICpsX2NwID0gcF90Mi0+Y3A7Ci0gICAgICAgIG9wal90Y3BfdCAqbF90Y3AgPSAmKHBfdDItPmNwLT50Y3BzW3BfdGlsZV9ub10pOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfYnl0ZXNfcmVhZDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX3BvY3MgPSBsX3RjcC0+bnVtcG9jcyArIDE7Ci0gICAgICAgIG9wal9waV9pdGVyYXRvcl90ICpsX2N1cnJlbnRfcGkgPSAwMDsKKyAgICBPUEpfQllURSAqbF9jdXJyZW50X2RhdGEgPSBwX3NyYzsKKyAgICBvcGpfcGlfaXRlcmF0b3JfdCAqbF9waSA9IDAwOworICAgIE9QSl9VSU5UMzIgcGlubzsKKyAgICBvcGpfaW1hZ2VfdCAqbF9pbWFnZSA9IHBfdDItPmltYWdlOworICAgIG9wal9jcF90ICpsX2NwID0gcF90Mi0+Y3A7CisgICAgb3BqX3RjcF90ICpsX3RjcCA9ICYocF90Mi0+Y3AtPnRjcHNbcF90aWxlX25vXSk7CisgICAgT1BKX1VJTlQzMiBsX25iX2J5dGVzX3JlYWQ7CisgICAgT1BKX1VJTlQzMiBsX25iX3BvY3MgPSBsX3RjcC0+bnVtcG9jcyArIDE7CisgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKmxfY3VycmVudF9waSA9IDAwOwogI2lmZGVmIFRPRE9fTVNECi0gICAgICAgIE9QSl9VSU5UMzIgY3VydHAgPSAwOwotICAgICAgICBPUEpfVUlOVDMyIHRwX3N0YXJ0X3BhY2tubzsKLSNlbmRpZiAKLSAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKmxfcGFja19pbmZvID0gMDA7Ci0gICAgICAgIG9wal9pbWFnZV9jb21wX3QqIGxfaW1nX2NvbXAgPSAwMDsKKyAgICBPUEpfVUlOVDMyIGN1cnRwID0gMDsKKyAgICBPUEpfVUlOVDMyIHRwX3N0YXJ0X3BhY2tubzsKKyNlbmRpZgorICAgIG9wal9wYWNrZXRfaW5mb190ICpsX3BhY2tfaW5mbyA9IDAwOworICAgIG9wal9pbWFnZV9jb21wX3QqIGxfaW1nX2NvbXAgPSAwMDsKIAotICAgICAgICBPUEpfQVJHX05PVF9VU0VEKHBfY3N0cl9pbmRleCk7CisgICAgT1BKX0FSR19OT1RfVVNFRChwX2NzdHJfaW5kZXgpOwogCiAjaWZkZWYgVE9ET19NU0QKLSAgICAgICAgaWYgKHBfY3N0cl9pbmRleCkgewotICAgICAgICAgICAgICAgIGxfcGFja19pbmZvID0gcF9jc3RyX2luZGV4LT50aWxlX2luZGV4W3BfdGlsZV9ub10ucGFja2V0OwotICAgICAgICB9CisgICAgaWYgKHBfY3N0cl9pbmRleCkgeworICAgICAgICBsX3BhY2tfaW5mbyA9IHBfY3N0cl9pbmRleC0+dGlsZV9pbmRleFtwX3RpbGVfbm9dLnBhY2tldDsKKyAgICB9CiAjZW5kaWYKIAotICAgICAgICAvKiBjcmVhdGUgYSBwYWNrZXQgaXRlcmF0b3IgKi8KLSAgICAgICAgbF9waSA9IG9wal9waV9jcmVhdGVfZGVjb2RlKGxfaW1hZ2UsIGxfY3AsIHBfdGlsZV9ubyk7Ci0gICAgICAgIGlmICghbF9waSkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgLyogY3JlYXRlIGEgcGFja2V0IGl0ZXJhdG9yICovCisgICAgbF9waSA9IG9wal9waV9jcmVhdGVfZGVjb2RlKGxfaW1hZ2UsIGxfY3AsIHBfdGlsZV9ubyk7CisgICAgaWYgKCFsX3BpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisKKyAgICBsX2N1cnJlbnRfcGkgPSBsX3BpOworCisgICAgZm9yIChwaW5vID0gMDsgcGlubyA8PSBsX3RjcC0+bnVtcG9jczsgKytwaW5vKSB7CisKKyAgICAgICAgLyogaWYgdGhlIHJlc29sdXRpb24gbmVlZGVkIGlzIHRvbyBsb3csIG9uZSBkaW0gb2YgdGhlIHRpbGVjIGNvdWxkIGJlIGVxdWFsIHRvIHplcm8KKyAgICAgICAgICogYW5kIG5vIHBhY2tldHMgYXJlIHVzZWQgdG8gZGVjb2RlIHRoaXMgcmVzb2x1dGlvbiBhbmQKKyAgICAgICAgICogbF9jdXJyZW50X3BpLT5yZXNubyBpcyBhbHdheXMgPj0gcF90aWxlLT5jb21wc1tsX2N1cnJlbnRfcGktPmNvbXBub10ubWluaW11bV9udW1fcmVzb2x1dGlvbnMKKyAgICAgICAgICogYW5kIG5vIGxfaW1nX2NvbXAtPnJlc25vX2RlY29kZWQgYXJlIGNvbXB1dGVkCisgICAgICAgICAqLworICAgICAgICBPUEpfQk9PTCogZmlyc3RfcGFzc19mYWlsZWQgPSBOVUxMOworCisgICAgICAgIGlmIChsX2N1cnJlbnRfcGktPnBvYy5wcmcgPT0gT1BKX1BST0dfVU5LTk9XTikgeworICAgICAgICAgICAgLyogVE9ETyBBREUgOiBhZGQgYW4gZXJyb3IgKi8KKyAgICAgICAgICAgIG9wal9waV9kZXN0cm95KGxfcGksIGxfbmJfcG9jcyk7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICB9CiAKKyAgICAgICAgZmlyc3RfcGFzc19mYWlsZWQgPSAoT1BKX0JPT0wqKW9wal9tYWxsb2MobF9pbWFnZS0+bnVtY29tcHMgKiBzaXplb2YoT1BKX0JPT0wpKTsKKyAgICAgICAgaWYgKCFmaXJzdF9wYXNzX2ZhaWxlZCkgeworICAgICAgICAgICAgb3BqX3BpX2Rlc3Ryb3kobF9waSwgbF9uYl9wb2NzKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KGZpcnN0X3Bhc3NfZmFpbGVkLCBPUEpfVFJVRSwgbF9pbWFnZS0+bnVtY29tcHMgKiBzaXplb2YoT1BKX0JPT0wpKTsKIAotICAgICAgICBsX2N1cnJlbnRfcGkgPSBsX3BpOworICAgICAgICB3aGlsZSAob3BqX3BpX25leHQobF9jdXJyZW50X3BpKSkgeworICAgICAgICAgICAgT1BKX0JPT0wgc2tpcF9wYWNrZXQgPSBPUEpfRkFMU0U7CisgICAgICAgICAgICBKQVNfRlBSSU5URihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAicGFja2V0IG9mZnNldD0wMDAwMDE2NiBwcmc9JWQgY21wdG5vPSUwMmQgcmx2bG5vPSUwMmQgcHJjbm89JTAzZCBseXJubz0lMDJkXG5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcGktPnBvYy5wcmcxLCBsX2N1cnJlbnRfcGktPmNvbXBubywgbF9jdXJyZW50X3BpLT5yZXNubywKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9waS0+cHJlY25vLCBsX2N1cnJlbnRfcGktPmxheW5vKTsKIAotICAgICAgICBmb3IgICAgIChwaW5vID0gMDsgcGlubyA8PSBsX3RjcC0+bnVtcG9jczsgKytwaW5vKSB7CisgICAgICAgICAgICAvKiBJZiB0aGUgcGFja2V0IGxheWVyIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiB0aGUgbWF4aW11bSAqLworICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxheWVycywgc2tpcCB0aGUgcGFja2V0ICovCisgICAgICAgICAgICBpZiAobF9jdXJyZW50X3BpLT5sYXlubyA+PSBsX3RjcC0+bnVtX2xheWVyc190b19kZWNvZGUpIHsKKyAgICAgICAgICAgICAgICBza2lwX3BhY2tldCA9IE9QSl9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogSWYgdGhlIHBhY2tldCByZXNvbHV0aW9uIG51bWJlciBpcyBncmVhdGVyIHRoYW4gdGhlIG1pbmltdW0gKi8KKyAgICAgICAgICAgIC8qIG51bWJlciBvZiByZXNvbHV0aW9uIGFsbG93ZWQsIHNraXAgdGhlIHBhY2tldCAqLworICAgICAgICAgICAgZWxzZSBpZiAobF9jdXJyZW50X3BpLT5yZXNubyA+PQorICAgICAgICAgICAgICAgICAgICAgcF90aWxlLT5jb21wc1tsX2N1cnJlbnRfcGktPmNvbXBub10ubWluaW11bV9udW1fcmVzb2x1dGlvbnMpIHsKKyAgICAgICAgICAgICAgICBza2lwX3BhY2tldCA9IE9QSl9UUlVFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvKiBJZiBubyBwcmVjaW5jdHMgb2YgYW55IGJhbmQgaW50ZXJzZWN0cyB0aGUgYXJlYSBvZiBpbnRlcmVzdCwgKi8KKyAgICAgICAgICAgICAgICAvKiBza2lwIHRoZSBwYWNrZXQgKi8KKyAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGJhbmRubzsKKyAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKnRpbGVjID0gJnBfdGlsZS0+Y29tcHNbbF9jdXJyZW50X3BpLT5jb21wbm9dOworICAgICAgICAgICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90ICpyZXMgPSAmdGlsZWMtPnJlc29sdXRpb25zW2xfY3VycmVudF9waS0+cmVzbm9dOwogCi0gICAgICAgICAgICAgICAgLyogaWYgdGhlIHJlc29sdXRpb24gbmVlZGVkIGlzIHRvbyBsb3csIG9uZSBkaW0gb2YgdGhlIHRpbGVjIGNvdWxkIGJlIGVxdWFsIHRvIHplcm8KLSAgICAgICAgICAgICAgICAgKiBhbmQgbm8gcGFja2V0cyBhcmUgdXNlZCB0byBkZWNvZGUgdGhpcyByZXNvbHV0aW9uIGFuZAotICAgICAgICAgICAgICAgICAqIGxfY3VycmVudF9waS0+cmVzbm8gaXMgYWx3YXlzID49IHBfdGlsZS0+Y29tcHNbbF9jdXJyZW50X3BpLT5jb21wbm9dLm1pbmltdW1fbnVtX3Jlc29sdXRpb25zCi0gICAgICAgICAgICAgICAgICogYW5kIG5vIGxfaW1nX2NvbXAtPnJlc25vX2RlY29kZWQgYXJlIGNvbXB1dGVkCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgT1BKX0JPT0wqIGZpcnN0X3Bhc3NfZmFpbGVkID0gTlVMTDsKLQkJCQkJCi0gICAgICAgICAgICAgICAgaWYgKGxfY3VycmVudF9waS0+cG9jLnByZyA9PSBPUEpfUFJPR19VTktOT1dOKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFRPRE8gQURFIDogYWRkIGFuIGVycm9yICovCisgICAgICAgICAgICAgICAgc2tpcF9wYWNrZXQgPSBPUEpfVFJVRTsKKyAgICAgICAgICAgICAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IHJlcy0+bnVtYmFuZHM7ICsrYmFuZG5vKSB7CisgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfYmFuZF90KiBiYW5kID0gJnJlcy0+YmFuZHNbYmFuZG5vXTsKKyAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9wcmVjaW5jdF90KiBwcmVjID0gJmJhbmQtPnByZWNpbmN0c1tsX2N1cnJlbnRfcGktPnByZWNub107CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wal90Y2RfaXNfc3ViYmFuZF9hcmVhX29mX2ludGVyZXN0KHRjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9waS0+Y29tcG5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3BpLT5yZXNubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQtPmJhbmRubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfVUlOVDMyKXByZWMtPngwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9VSU5UMzIpcHJlYy0+eTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMilwcmVjLT54MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfVUlOVDMyKXByZWMtPnkxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2tpcF9wYWNrZXQgPSBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoInBhY2tldCBjbXB0bm89JTAyZCBybHZsbm89JTAyZCBwcmNubz0lMDNkIGx5cm5vPSUwMmQgLT4gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcGktPmNvbXBubywgbF9jdXJyZW50X3BpLT5yZXNubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9waS0+cHJlY25vLCBsX2N1cnJlbnRfcGktPmxheW5vLCBza2lwX3BhY2tldCA/ICJza2lwcGVkIiA6ICJrZXB0Iik7CisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFza2lwX3BhY2tldCkgeworICAgICAgICAgICAgICAgIGxfbmJfYnl0ZXNfcmVhZCA9IDA7CisKKyAgICAgICAgICAgICAgICBmaXJzdF9wYXNzX2ZhaWxlZFtsX2N1cnJlbnRfcGktPmNvbXBub10gPSBPUEpfRkFMU0U7CisKKyAgICAgICAgICAgICAgICBpZiAoISBvcGpfdDJfZGVjb2RlX3BhY2tldChwX3QyLCBwX3RpbGUsIGxfdGNwLCBsX2N1cnJlbnRfcGksIGxfY3VycmVudF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX25iX2J5dGVzX3JlYWQsIHBfbWF4X2xlbiwgbF9wYWNrX2luZm8sIHBfbWFuYWdlcikpIHsKICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2Rlc3Ryb3kobF9waSwgbF9uYl9wb2NzKTsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUoZmlyc3RfcGFzc19mYWlsZWQpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICAgICAgICAgIH0KLQkJCQkJCi0gICAgICAgICAgICAgICAgZmlyc3RfcGFzc19mYWlsZWQgPSAoT1BKX0JPT0wqKW9wal9tYWxsb2MobF9pbWFnZS0+bnVtY29tcHMgKiBzaXplb2YoT1BKX0JPT0wpKTsKLSAgICAgICAgICAgICAgICBpZiAoIWZpcnN0X3Bhc3NfZmFpbGVkKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2Rlc3Ryb3kobF9waSxsX25iX3BvY3MpOworCisgICAgICAgICAgICAgICAgbF9pbWdfY29tcCA9ICYobF9pbWFnZS0+Y29tcHNbbF9jdXJyZW50X3BpLT5jb21wbm9dKTsKKyAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT5yZXNub19kZWNvZGVkID0gb3BqX3VpbnRfbWF4KGxfY3VycmVudF9waS0+cmVzbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPnJlc25vX2RlY29kZWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsX25iX2J5dGVzX3JlYWQgPSAwOworICAgICAgICAgICAgICAgIGlmICghIG9wal90Ml9za2lwX3BhY2tldChwX3QyLCBwX3RpbGUsIGxfdGNwLCBsX2N1cnJlbnRfcGksIGxfY3VycmVudF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9uYl9ieXRlc19yZWFkLCBwX21heF9sZW4sIGxfcGFja19pbmZvLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIG9wal9waV9kZXN0cm95KGxfcGksIGxfbmJfcG9jcyk7CisgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGZpcnN0X3Bhc3NfZmFpbGVkKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtc2V0KGZpcnN0X3Bhc3NfZmFpbGVkLCBPUEpfVFJVRSwgbF9pbWFnZS0+bnVtY29tcHMgKiBzaXplb2YoT1BKX0JPT0wpKTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHdoaWxlIChvcGpfcGlfbmV4dChsX2N1cnJlbnRfcGkpKSB7Ci0gICAgICAgICAgICAgICAgICBKQVNfRlBSSU5URiggc3RkZXJyLCAicGFja2V0IG9mZnNldD0wMDAwMDE2NiBwcmc9JWQgY21wdG5vPSUwMmQgcmx2bG5vPSUwMmQgcHJjbm89JTAzZCBseXJubz0lMDJkXG5cbiIsCi0gICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9waS0+cG9jLnByZzEsIGxfY3VycmVudF9waS0+Y29tcG5vLCBsX2N1cnJlbnRfcGktPnJlc25vLCBsX2N1cnJlbnRfcGktPnByZWNubywgbF9jdXJyZW50X3BpLT5sYXlubyApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF90Y3AtPm51bV9sYXllcnNfdG9fZGVjb2RlID4gbF9jdXJyZW50X3BpLT5sYXlubwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxfY3VycmVudF9waS0+cmVzbm8gPCBwX3RpbGUtPmNvbXBzW2xfY3VycmVudF9waS0+Y29tcG5vXS5taW5pbXVtX251bV9yZXNvbHV0aW9ucykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX25iX2J5dGVzX3JlYWQgPSAwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3Bhc3NfZmFpbGVkW2xfY3VycmVudF9waS0+Y29tcG5vXSA9IE9QSl9GQUxTRTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfdDJfZGVjb2RlX3BhY2tldChwX3QyLHBfdGlsZSxsX3RjcCxsX2N1cnJlbnRfcGksbF9jdXJyZW50X2RhdGEsJmxfbmJfYnl0ZXNfcmVhZCxwX21heF9sZW4sbF9wYWNrX2luZm8sIHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfZGVzdHJveShsX3BpLGxfbmJfcG9jcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUoZmlyc3RfcGFzc19mYWlsZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2ltZ19jb21wID0gJihsX2ltYWdlLT5jb21wc1tsX2N1cnJlbnRfcGktPmNvbXBub10pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT5yZXNub19kZWNvZGVkID0gb3BqX3VpbnRfbWF4KGxfY3VycmVudF9waS0+cmVzbm8sIGxfaW1nX2NvbXAtPnJlc25vX2RlY29kZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbmJfYnl0ZXNfcmVhZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal90Ml9za2lwX3BhY2tldChwX3QyLHBfdGlsZSxsX3RjcCxsX2N1cnJlbnRfcGksbF9jdXJyZW50X2RhdGEsJmxfbmJfYnl0ZXNfcmVhZCxwX21heF9sZW4sbF9wYWNrX2luZm8sIHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfZGVzdHJveShsX3BpLGxfbmJfcG9jcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUoZmlyc3RfcGFzc19mYWlsZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0X3Bhc3NfZmFpbGVkW2xfY3VycmVudF9waS0+Y29tcG5vXSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2ltZ19jb21wID0gJihsX2ltYWdlLT5jb21wc1tsX2N1cnJlbnRfcGktPmNvbXBub10pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9pbWdfY29tcC0+cmVzbm9fZGVjb2RlZCA9PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAtPnJlc25vX2RlY29kZWQgPSBwX3RpbGUtPmNvbXBzW2xfY3VycmVudF9waS0+Y29tcG5vXS5taW5pbXVtX251bV9yZXNvbHV0aW9ucyAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9kYXRhICs9IGxfbmJfYnl0ZXNfcmVhZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfbWF4X2xlbiAtPSBsX25iX2J5dGVzX3JlYWQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIElOREVYID4+ICovCi0jaWZkZWYgVE9ET19NU0QKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBfY3N0cl9pbmZvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90aWxlX2luZm9fdjJfdCAqaW5mb19UTCA9ICZwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGFja2V0X2luZm9fdCAqaW5mb19QSyA9ICZpbmZvX1RMLT5wYWNrZXRbcF9jc3RyX2luZm8tPnBhY2tub107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwX3N0YXJ0X3BhY2tubyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcF9jc3RyX2luZm8tPnBhY2tubykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fUEstPnN0YXJ0X3BvcyA9IGluZm9fVEwtPmVuZF9oZWFkZXIgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZm9fVEwtPnBhY2tldFtwX2NzdHJfaW5mby0+cGFja25vLTFdLmVuZF9wb3MgPj0gKE9QSl9JTlQzMilwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dLnRwW2N1cnRwXS50cF9lbmRfcG9zKXsgLyogTmV3IHRpbGUgcGFydCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9fVEwtPnRwW2N1cnRwXS50cF9udW1wYWNrcyA9IHBfY3N0cl9pbmZvLT5wYWNrbm8gLSB0cF9zdGFydF9wYWNrbm87IC8qIE51bWJlciBvZiBwYWNrZXRzIGluIHByZXZpb3VzIHRpbGUtcGFydCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRwX3N0YXJ0X3BhY2tubyA9IHBfY3N0cl9pbmZvLT5wYWNrbm87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VydHArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX1BLLT5zdGFydF9wb3MgPSBwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dLnRwW2N1cnRwXS50cF9lbmRfaGVhZGVyKzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19QSy0+c3RhcnRfcG9zID0gKGxfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV90cF9vbiAmJiBpbmZvX1BLLT5zdGFydF9wb3MpID8gaW5mb19QSy0+c3RhcnRfcG9zIDogaW5mb19UTC0+cGFja2V0W3BfY3N0cl9pbmZvLT5wYWNrbm8gLSAxXS5lbmRfcG9zICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvX1BLLT5lbmRfcG9zID0gaW5mb19QSy0+c3RhcnRfcG9zICsgbF9uYl9ieXRlc19yZWFkIC0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19QSy0+ZW5kX3BoX3BvcyArPSBpbmZvX1BLLT5zdGFydF9wb3MgLSAxOyAgLyogRW5kIG9mIHBhY2tldCBoZWFkZXIgd2hpY2ggbm93IG9ubHkgcmVwcmVzZW50cyB0aGUgZGlzdGFuY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytwX2NzdHJfaW5mby0+cGFja25vOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiA8PCBJTkRFWCAqLworICAgICAgICAgICAgaWYgKGZpcnN0X3Bhc3NfZmFpbGVkW2xfY3VycmVudF9waS0+Y29tcG5vXSkgeworICAgICAgICAgICAgICAgIGxfaW1nX2NvbXAgPSAmKGxfaW1hZ2UtPmNvbXBzW2xfY3VycmVudF9waS0+Y29tcG5vXSk7CisgICAgICAgICAgICAgICAgaWYgKGxfaW1nX2NvbXAtPnJlc25vX2RlY29kZWQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT5yZXNub19kZWNvZGVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBfdGlsZS0+Y29tcHNbbF9jdXJyZW50X3BpLT5jb21wbm9dLm1pbmltdW1fbnVtX3Jlc29sdXRpb25zIC0gMTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKytsX2N1cnJlbnRfcGk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBvcGpfZnJlZShmaXJzdF9wYXNzX2ZhaWxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogSU5ERVggPj4gKi8KKyAgICAgICAgICAgIGxfY3VycmVudF9kYXRhICs9IGxfbmJfYnl0ZXNfcmVhZDsKKyAgICAgICAgICAgIHBfbWF4X2xlbiAtPSBsX25iX2J5dGVzX3JlYWQ7CisKKyAgICAgICAgICAgIC8qIElOREVYID4+ICovCiAjaWZkZWYgVE9ET19NU0QKLSAgICAgICAgaWYKLSAgICAgICAgICAgICAgICAocF9jc3RyX2luZm8pIHsKLSAgICAgICAgICAgICAgICBwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dLnRwW2N1cnRwXS50cF9udW1wYWNrcyA9IHBfY3N0cl9pbmZvLT5wYWNrbm8gLSB0cF9zdGFydF9wYWNrbm87IC8qIE51bWJlciBvZiBwYWNrZXRzIGluIGxhc3QgdGlsZS1wYXJ0ICovCi0gICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwX2NzdHJfaW5mbykgeworICAgICAgICAgICAgICAgIG9wal90aWxlX2luZm9fdjJfdCAqaW5mb19UTCA9ICZwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dOworICAgICAgICAgICAgICAgIG9wal9wYWNrZXRfaW5mb190ICppbmZvX1BLID0gJmluZm9fVEwtPnBhY2tldFtwX2NzdHJfaW5mby0+cGFja25vXTsKKyAgICAgICAgICAgICAgICB0cF9zdGFydF9wYWNrbm8gPSAwOworICAgICAgICAgICAgICAgIGlmICghcF9jc3RyX2luZm8tPnBhY2tubykgeworICAgICAgICAgICAgICAgICAgICBpbmZvX1BLLT5zdGFydF9wb3MgPSBpbmZvX1RMLT5lbmRfaGVhZGVyICsgMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluZm9fVEwtPnBhY2tldFtwX2NzdHJfaW5mby0+cGFja25vIC0gMV0uZW5kX3BvcyA+PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmZvLT50aWxlW3BfdGlsZV9ub10udHBbY3VydHBdLnRwX2VuZF9wb3MpIHsgLyogTmV3IHRpbGUgcGFydCAqLworICAgICAgICAgICAgICAgICAgICBpbmZvX1RMLT50cFtjdXJ0cF0udHBfbnVtcGFja3MgPSBwX2NzdHJfaW5mby0+cGFja25vIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHBfc3RhcnRfcGFja25vOyAvKiBOdW1iZXIgb2YgcGFja2V0cyBpbiBwcmV2aW91cyB0aWxlLXBhcnQgKi8KKyAgICAgICAgICAgICAgICAgICAgdHBfc3RhcnRfcGFja25vID0gcF9jc3RyX2luZm8tPnBhY2tubzsKKyAgICAgICAgICAgICAgICAgICAgY3VydHArKzsKKyAgICAgICAgICAgICAgICAgICAgaW5mb19QSy0+c3RhcnRfcG9zID0gcF9jc3RyX2luZm8tPnRpbGVbcF90aWxlX25vXS50cFtjdXJ0cF0udHBfZW5kX2hlYWRlciArIDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW5mb19QSy0+c3RhcnRfcG9zID0gKGxfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV90cF9vbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19QSy0+c3RhcnRfcG9zKSA/IGluZm9fUEstPnN0YXJ0X3BvcyA6IGluZm9fVEwtPnBhY2tldFtwX2NzdHJfaW5mby0+cGFja25vIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxXS5lbmRfcG9zICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5mb19QSy0+ZW5kX3BvcyA9IGluZm9fUEstPnN0YXJ0X3BvcyArIGxfbmJfYnl0ZXNfcmVhZCAtIDE7CisgICAgICAgICAgICAgICAgaW5mb19QSy0+ZW5kX3BoX3BvcyArPSBpbmZvX1BLLT5zdGFydF9wb3MgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTsgIC8qIEVuZCBvZiBwYWNrZXQgaGVhZGVyIHdoaWNoIG5vdyBvbmx5IHJlcHJlc2VudHMgdGhlIGRpc3RhbmNlICovCisgICAgICAgICAgICAgICAgKytwX2NzdHJfaW5mby0+cGFja25vOworICAgICAgICAgICAgfQogI2VuZGlmCi0gICAgICAgIC8qIDw8IElOREVYICovCisgICAgICAgICAgICAvKiA8PCBJTkRFWCAqLworICAgICAgICB9CisgICAgICAgICsrbF9jdXJyZW50X3BpOwogCi0gICAgICAgIC8qIGRvbid0IGZvcmdldCB0byByZWxlYXNlIHBpICovCi0gICAgICAgIG9wal9waV9kZXN0cm95KGxfcGksbF9uYl9wb2NzKTsKLSAgICAgICAgKnBfZGF0YV9yZWFkID0gKE9QSl9VSU5UMzIpKGxfY3VycmVudF9kYXRhIC0gcF9zcmMpOwotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgIG9wal9mcmVlKGZpcnN0X3Bhc3NfZmFpbGVkKTsKKyAgICB9CisgICAgLyogSU5ERVggPj4gKi8KKyNpZmRlZiBUT0RPX01TRAorICAgIGlmCisgICAgKHBfY3N0cl9pbmZvKSB7CisgICAgICAgIHBfY3N0cl9pbmZvLT50aWxlW3BfdGlsZV9ub10udHBbY3VydHBdLnRwX251bXBhY2tzID0gcF9jc3RyX2luZm8tPnBhY2tubyAtCisgICAgICAgICAgICAgICAgdHBfc3RhcnRfcGFja25vOyAvKiBOdW1iZXIgb2YgcGFja2V0cyBpbiBsYXN0IHRpbGUtcGFydCAqLworICAgIH0KKyNlbmRpZgorICAgIC8qIDw8IElOREVYICovCisKKyAgICAvKiBkb24ndCBmb3JnZXQgdG8gcmVsZWFzZSBwaSAqLworICAgIG9wal9waV9kZXN0cm95KGxfcGksIGxfbmJfcG9jcyk7CisgICAgKnBfZGF0YV9yZWFkID0gKE9QSl9VSU5UMzIpKGxfY3VycmVudF9kYXRhIC0gcF9zcmMpOworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTQ5OSw4ODMgKzU3OSw5ODUgQEAKICovCiBvcGpfdDJfdCogb3BqX3QyX2NyZWF0ZShvcGpfaW1hZ2VfdCAqcF9pbWFnZSwgb3BqX2NwX3QgKnBfY3ApCiB7Ci0gICAgICAgIC8qIGNyZWF0ZSB0aGUgdDIgc3RydWN0dXJlICovCi0gICAgICAgIG9wal90Ml90ICpsX3QyID0gKG9wal90Ml90KilvcGpfY2FsbG9jKDEsc2l6ZW9mKG9wal90Ml90KSk7Ci0gICAgICAgIGlmICghbF90MikgewotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CisgICAgLyogY3JlYXRlIHRoZSB0MiBzdHJ1Y3R1cmUgKi8KKyAgICBvcGpfdDJfdCAqbF90MiA9IChvcGpfdDJfdCopb3BqX2NhbGxvYygxLCBzaXplb2Yob3BqX3QyX3QpKTsKKyAgICBpZiAoIWxfdDIpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogCi0gICAgICAgIGxfdDItPmltYWdlID0gcF9pbWFnZTsKLSAgICAgICAgbF90Mi0+Y3AgPSBwX2NwOworICAgIGxfdDItPmltYWdlID0gcF9pbWFnZTsKKyAgICBsX3QyLT5jcCA9IHBfY3A7CiAKLSAgICAgICAgcmV0dXJuIGxfdDI7CisgICAgcmV0dXJuIGxfdDI7CiB9CiAKLXZvaWQgb3BqX3QyX2Rlc3Ryb3kob3BqX3QyX3QgKnQyKSB7Ci0gICAgICAgIGlmKHQyKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2ZyZWUodDIpOwotICAgICAgICB9Ci19Ci0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfdDJfZGVjb2RlX3BhY2tldCggIG9wal90Ml90KiBwX3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqcF90aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKnBfdGNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqcF9waSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKnBfc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGFja2V0X2luZm9fdCAqcF9wYWNrX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKQordm9pZCBvcGpfdDJfZGVzdHJveShvcGpfdDJfdCAqdDIpCiB7Ci0gICAgICAgIE9QSl9CT09MIGxfcmVhZF9kYXRhOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfYnl0ZXNfcmVhZCA9IDA7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl90b3RhbF9ieXRlc19yZWFkID0gMDsKKyAgICBpZiAodDIpIHsKKyAgICAgICAgb3BqX2ZyZWUodDIpOworICAgIH0KK30KIAotICAgICAgICAqcF9kYXRhX3JlYWQgPSAwOworc3RhdGljIE9QSl9CT09MIG9wal90Ml9kZWNvZGVfcGFja2V0KG9wal90Ml90KiBwX3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICpwX3RpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjcF90ICpwX3RjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqcF9waSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9wYWNrZXRfaW5mb190ICpwX3BhY2tfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcikKK3sKKyAgICBPUEpfQk9PTCBsX3JlYWRfZGF0YTsKKyAgICBPUEpfVUlOVDMyIGxfbmJfYnl0ZXNfcmVhZCA9IDA7CisgICAgT1BKX1VJTlQzMiBsX25iX3RvdGFsX2J5dGVzX3JlYWQgPSAwOwogCi0gICAgICAgIGlmICghIG9wal90Ml9yZWFkX3BhY2tldF9oZWFkZXIocF90MixwX3RpbGUscF90Y3AscF9waSwmbF9yZWFkX2RhdGEscF9zcmMsJmxfbmJfYnl0ZXNfcmVhZCxwX21heF9sZW5ndGgscF9wYWNrX2luZm8sIHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICpwX2RhdGFfcmVhZCA9IDA7CisKKyAgICBpZiAoISBvcGpfdDJfcmVhZF9wYWNrZXRfaGVhZGVyKHBfdDIsIHBfdGlsZSwgcF90Y3AsIHBfcGksICZsX3JlYWRfZGF0YSwgcF9zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbF9uYl9ieXRlc19yZWFkLCBwX21heF9sZW5ndGgsIHBfcGFja19pbmZvLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgcF9zcmMgKz0gbF9uYl9ieXRlc19yZWFkOworICAgIGxfbmJfdG90YWxfYnl0ZXNfcmVhZCArPSBsX25iX2J5dGVzX3JlYWQ7CisgICAgcF9tYXhfbGVuZ3RoIC09IGxfbmJfYnl0ZXNfcmVhZDsKKworICAgIC8qIHdlIHNob3VsZCByZWFkIGRhdGEgZm9yIHRoZSBwYWNrZXQgKi8KKyAgICBpZiAobF9yZWFkX2RhdGEpIHsKKyAgICAgICAgbF9uYl9ieXRlc19yZWFkID0gMDsKKworICAgICAgICBpZiAoISBvcGpfdDJfcmVhZF9wYWNrZXRfZGF0YShwX3QyLCBwX3RpbGUsIHBfcGksIHBfc3JjLCAmbF9uYl9ieXRlc19yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21heF9sZW5ndGgsIHBfcGFja19pbmZvLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICB9CiAKLSAgICAgICAgcF9zcmMgKz0gbF9uYl9ieXRlc19yZWFkOwogICAgICAgICBsX25iX3RvdGFsX2J5dGVzX3JlYWQgKz0gbF9uYl9ieXRlc19yZWFkOwotICAgICAgICBwX21heF9sZW5ndGggLT0gbF9uYl9ieXRlc19yZWFkOworICAgIH0KIAotICAgICAgICAvKiB3ZSBzaG91bGQgcmVhZCBkYXRhIGZvciB0aGUgcGFja2V0ICovCi0gICAgICAgIGlmIChsX3JlYWRfZGF0YSkgewotICAgICAgICAgICAgICAgIGxfbmJfYnl0ZXNfcmVhZCA9IDA7CisgICAgKnBfZGF0YV9yZWFkID0gbF9uYl90b3RhbF9ieXRlc19yZWFkOwogCi0gICAgICAgICAgICAgICAgaWYgKCEgb3BqX3QyX3JlYWRfcGFja2V0X2RhdGEocF90MixwX3RpbGUscF9waSxwX3NyYywmbF9uYl9ieXRlc19yZWFkLHBfbWF4X2xlbmd0aCxwX3BhY2tfaW5mbywgcF9tYW5hZ2VyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsX25iX3RvdGFsX2J5dGVzX3JlYWQgKz0gbF9uYl9ieXRlc19yZWFkOwotICAgICAgICB9Ci0KLSAgICAgICAgKnBfZGF0YV9yZWFkID0gbF9uYl90b3RhbF9ieXRlc19yZWFkOwotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfdDJfZW5jb2RlX3BhY2tldCggIE9QSl9VSU5UMzIgdGlsZW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqIHRpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y3BfdCAqIHRjcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKnBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5mb190ICpjc3RyX2luZm8pCitzdGF0aWMgT1BKX0JPT0wgb3BqX3QyX2VuY29kZV9wYWNrZXQoT1BKX1VJTlQzMiB0aWxlbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlX3QgKiB0aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y3BfdCAqIHRjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqY3N0cl9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEoyS19UMl9NT0RFIHBfdDJfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcikKIHsKLSAgICAgICAgT1BKX1VJTlQzMiBiYW5kbm8sIGNibGtubzsKLSAgICAgICAgT1BKX0JZVEUqIGMgPSBkZXN0OwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfYnl0ZXM7Ci0gICAgICAgIE9QSl9VSU5UMzIgY29tcG5vID0gcGktPmNvbXBubzsgICAgIC8qIGNvbXBvbmVudCB2YWx1ZSAqLwotICAgICAgICBPUEpfVUlOVDMyIHJlc25vICA9IHBpLT5yZXNubzsgICAgICAvKiByZXNvbHV0aW9uIGxldmVsIHZhbHVlICovCi0gICAgICAgIE9QSl9VSU5UMzIgcHJlY25vID0gcGktPnByZWNubzsgICAgIC8qIHByZWNpbmN0IHZhbHVlICovCi0gICAgICAgIE9QSl9VSU5UMzIgbGF5bm8gID0gcGktPmxheW5vOyAgICAgIC8qIHF1YWxpdHkgbGF5ZXIgdmFsdWUgKi8KLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX2Jsb2NrczsKLSAgICAgICAgb3BqX3RjZF9iYW5kX3QgKmJhbmQgPSAwMDsKLSAgICAgICAgb3BqX3RjZF9jYmxrX2VuY190KiBjYmxrID0gMDA7Ci0gICAgICAgIG9wal90Y2RfcGFzc190ICpwYXNzID0gMDA7CisgICAgT1BKX1VJTlQzMiBiYW5kbm8sIGNibGtubzsKKyAgICBPUEpfQllURSogYyA9IGRlc3Q7CisgICAgT1BKX1VJTlQzMiBsX25iX2J5dGVzOworICAgIE9QSl9VSU5UMzIgY29tcG5vID0gcGktPmNvbXBubzsgICAgIC8qIGNvbXBvbmVudCB2YWx1ZSAqLworICAgIE9QSl9VSU5UMzIgcmVzbm8gID0gcGktPnJlc25vOyAgICAgIC8qIHJlc29sdXRpb24gbGV2ZWwgdmFsdWUgKi8KKyAgICBPUEpfVUlOVDMyIHByZWNubyA9IHBpLT5wcmVjbm87ICAgICAvKiBwcmVjaW5jdCB2YWx1ZSAqLworICAgIE9QSl9VSU5UMzIgbGF5bm8gID0gcGktPmxheW5vOyAgICAgIC8qIHF1YWxpdHkgbGF5ZXIgdmFsdWUgKi8KKyAgICBPUEpfVUlOVDMyIGxfbmJfYmxvY2tzOworICAgIG9wal90Y2RfYmFuZF90ICpiYW5kID0gMDA7CisgICAgb3BqX3RjZF9jYmxrX2VuY190KiBjYmxrID0gMDA7CisgICAgb3BqX3RjZF9wYXNzX3QgKnBhc3MgPSAwMDsKIAotICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKnRpbGVjID0gJnRpbGUtPmNvbXBzW2NvbXBub107Ci0gICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90ICpyZXMgPSAmdGlsZWMtPnJlc29sdXRpb25zW3Jlc25vXTsKKyAgICBvcGpfdGNkX3RpbGVjb21wX3QgKnRpbGVjID0gJnRpbGUtPmNvbXBzW2NvbXBub107CisgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QgKnJlcyA9ICZ0aWxlYy0+cmVzb2x1dGlvbnNbcmVzbm9dOwogCi0gICAgICAgIG9wal9iaW9fdCAqYmlvID0gMDA7ICAgIC8qIEJJTyBjb21wb25lbnQgKi8KKyAgICBvcGpfYmlvX3QgKmJpbyA9IDAwOyAgICAvKiBCSU8gY29tcG9uZW50ICovCisgICAgT1BKX0JPT0wgcGFja2V0X2VtcHR5ID0gT1BKX1RSVUU7CiAKLSAgICAgICAgLyogPFNPUCAweGZmOTE+ICovCi0gICAgICAgIGlmICh0Y3AtPmNzdHkgJiBKMktfQ1BfQ1NUWV9TT1ApIHsKLSAgICAgICAgICAgICAgICBjWzBdID0gMjU1OwotICAgICAgICAgICAgICAgIGNbMV0gPSAxNDU7Ci0gICAgICAgICAgICAgICAgY1syXSA9IDA7Ci0gICAgICAgICAgICAgICAgY1szXSA9IDQ7CisgICAgLyogPFNPUCAweGZmOTE+ICovCisgICAgaWYgKHRjcC0+Y3N0eSAmIEoyS19DUF9DU1RZX1NPUCkgeworICAgICAgICBpZiAobGVuZ3RoIDwgNikgeworICAgICAgICAgICAgaWYgKHBfdDJfbW9kZSA9PSBGSU5BTF9QQVNTKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGpfdDJfZW5jb2RlX3BhY2tldCgpOiBvbmx5ICV1IGJ5dGVzIHJlbWFpbmluZyBpbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0IGJ1ZmZlci4gJXUgbmVlZGVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwgNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGNbMF0gPSAyNTU7CisgICAgICAgIGNbMV0gPSAxNDU7CisgICAgICAgIGNbMl0gPSAwOworICAgICAgICBjWzNdID0gNDsKICNpZiAwCi0gICAgICAgICAgICAgICAgY1s0XSA9ICh0aWxlLT5wYWNrbm8gJSA2NTUzNikgLyAyNTY7Ci0gICAgICAgICAgICAgICAgY1s1XSA9ICh0aWxlLT5wYWNrbm8gJSA2NTUzNikgJSAyNTY7CisgICAgICAgIGNbNF0gPSAodGlsZS0+cGFja25vICUgNjU1MzYpIC8gMjU2OworICAgICAgICBjWzVdID0gKHRpbGUtPnBhY2tubyAlIDY1NTM2KSAlIDI1NjsKICNlbHNlCi0gICAgICAgICAgICAgICAgY1s0XSA9ICh0aWxlLT5wYWNrbm8gPj4gOCkgJiAweGZmOyAvKiBwYWNrbm8gaXMgdWludDMyX3QgKi8KLSAgICAgICAgICAgICAgICBjWzVdID0gdGlsZS0+cGFja25vICYgMHhmZjsKKyAgICAgICAgY1s0XSA9ICh0aWxlLT5wYWNrbm8gPj4gOCkgJiAweGZmOyAvKiBwYWNrbm8gaXMgdWludDMyX3QgKi8KKyAgICAgICAgY1s1XSA9IHRpbGUtPnBhY2tubyAmIDB4ZmY7CiAjZW5kaWYKLSAgICAgICAgICAgICAgICBjICs9IDY7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoIC09IDY7Ci0gICAgICAgIH0KLSAgICAgICAgLyogPC9TT1A+ICovCisgICAgICAgIGMgKz0gNjsKKyAgICAgICAgbGVuZ3RoIC09IDY7CisgICAgfQorICAgIC8qIDwvU09QPiAqLwogCi0gICAgICAgIGlmICghbGF5bm8pIHsKLSAgICAgICAgICAgICAgICBiYW5kID0gcmVzLT5iYW5kczsKLQotICAgICAgICAgICAgICAgIGZvcihiYW5kbm8gPSAwOyBiYW5kbm8gPCByZXMtPm51bWJhbmRzOyArK2JhbmRubykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9wcmVjaW5jdF90ICpwcmMgPSAmYmFuZC0+cHJlY2luY3RzW3ByZWNub107Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Z3RfcmVzZXQocHJjLT5pbmNsdHJlZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGd0X3Jlc2V0KHByYy0+aW1zYnRyZWUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBsX25iX2Jsb2NrcyA9IHByYy0+Y3cgKiBwcmMtPmNoOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICAgICAoY2Jsa25vID0gMDsgY2Jsa25vIDwgbF9uYl9ibG9ja3M7ICsrY2Jsa25vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGsgPSAmcHJjLT5jYmxrcy5lbmNbY2Jsa25vXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT5udW1wYXNzZXMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGd0X3NldHZhbHVlKHByYy0+aW1zYnRyZWUsIGNibGtubywgYmFuZC0+bnVtYnBzIC0gKE9QSl9JTlQzMiljYmxrLT5udW1icHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgKytiYW5kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJpbyA9IG9wal9iaW9fY3JlYXRlKCk7Ci0gICAgICAgIGlmICghYmlvKSB7Ci0gICAgICAgICAgICAgICAgLyogRklYTUUgZXZlbnQgbWFuYWdlciBlcnJvciBjYWxsYmFjayAqLwotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgb3BqX2Jpb19pbml0X2VuYyhiaW8sIGMsIGxlbmd0aCk7Ci0gICAgICAgIG9wal9iaW9fd3JpdGUoYmlvLCAxLCAxKTsgICAgICAgICAgIC8qIEVtcHR5IGhlYWRlciBiaXQgKi8KLQotICAgICAgICAvKiBXcml0aW5nIFBhY2tldCBoZWFkZXIgKi8KKyAgICBpZiAoIWxheW5vKSB7CiAgICAgICAgIGJhbmQgPSByZXMtPmJhbmRzOwotICAgICAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IHJlcy0+bnVtYmFuZHM7ICsrYmFuZG5vKSAgICAgIHsKLSAgICAgICAgICAgICAgICBvcGpfdGNkX3ByZWNpbmN0X3QgKnByYyA9ICZiYW5kLT5wcmVjaW5jdHNbcHJlY25vXTsKIAotICAgICAgICAgICAgICAgIGxfbmJfYmxvY2tzID0gcHJjLT5jdyAqIHByYy0+Y2g7Ci0gICAgICAgICAgICAgICAgY2JsayA9IHByYy0+Y2Jsa3MuZW5jOworICAgICAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IHJlcy0+bnVtYmFuZHM7ICsrYmFuZG5vLCArK2JhbmQpIHsKKyAgICAgICAgICAgIG9wal90Y2RfcHJlY2luY3RfdCAqcHJjOwogCi0gICAgICAgICAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBsX25iX2Jsb2NrczsgKytjYmxrbm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfbGF5ZXJfdCAqbGF5ZXIgPSAmY2Jsay0+bGF5ZXJzW2xheW5vXTsKKyAgICAgICAgICAgIC8qIFNraXAgZW1wdHkgYmFuZHMgKi8KKyAgICAgICAgICAgIGlmIChvcGpfdGNkX2lzX2JhbmRfZW1wdHkoYmFuZCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjYmxrLT5udW1wYXNzZXMgJiYgbGF5ZXItPm51bXBhc3NlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGd0X3NldHZhbHVlKHByYy0+aW5jbHRyZWUsIGNibGtubywgKE9QSl9JTlQzMilsYXlubyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmMgPSAmYmFuZC0+cHJlY2luY3RzW3ByZWNub107CisgICAgICAgICAgICBvcGpfdGd0X3Jlc2V0KHByYy0+aW5jbHRyZWUpOworICAgICAgICAgICAgb3BqX3RndF9yZXNldChwcmMtPmltc2J0cmVlKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgKytjYmxrOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxfbmJfYmxvY2tzID0gcHJjLT5jdyAqIHByYy0+Y2g7CisgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IGxfbmJfYmxvY2tzOyArK2NibGtubykgeworICAgICAgICAgICAgICAgIGNibGsgPSAmcHJjLT5jYmxrcy5lbmNbY2Jsa25vXTsKIAotICAgICAgICAgICAgICAgIGNibGsgPSBwcmMtPmNibGtzLmVuYzsKLSAgICAgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IGxfbmJfYmxvY2tzOyBjYmxrbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9sYXllcl90ICpsYXllciA9ICZjYmxrLT5sYXllcnNbbGF5bm9dOwotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBpbmNyZW1lbnQgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBudW1wID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGVuID0gMCwgcGFzc25vOwotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsX25iX3Bhc3NlczsKKyAgICAgICAgICAgICAgICBjYmxrLT5udW1wYXNzZXMgPSAwOworICAgICAgICAgICAgICAgIG9wal90Z3Rfc2V0dmFsdWUocHJjLT5pbXNidHJlZSwgY2Jsa25vLCBiYW5kLT5udW1icHMgLSAoT1BKX0lOVDMyKWNibGstPm51bWJwcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNibGsgaW5jbHVzaW9uIGJpdHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2Jsay0+bnVtcGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Z3RfZW5jb2RlKGJpbywgcHJjLT5pbmNsdHJlZSwgY2Jsa25vLCAoT1BKX0lOVDMyKShsYXlubyArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9iaW9fd3JpdGUoYmlvLCBsYXllci0+bnVtcGFzc2VzICE9IDAsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIGJpbyA9IG9wal9iaW9fY3JlYXRlKCk7CisgICAgaWYgKCFiaW8pIHsKKyAgICAgICAgLyogRklYTUUgZXZlbnQgbWFuYWdlciBlcnJvciBjYWxsYmFjayAqLworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICBvcGpfYmlvX2luaXRfZW5jKGJpbywgYywgbGVuZ3RoKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgY2JsayBub3QgaW5jbHVkZWQsIGdvIHRvIHRoZSBuZXh0IGNibGsgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxheWVyLT5udW1wYXNzZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytjYmxrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgZmlyc3QgaW5zdGFuY2Ugb2YgY2JsayAtLT4gemVybyBiaXQtcGxhbmVzIGluZm9ybWF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNibGstPm51bXBhc3NlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT5udW1sZW5iaXRzID0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RndF9lbmNvZGUoYmlvLCBwcmMtPmltc2J0cmVlLCBjYmxrbm8sIDk5OSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RpbmcgcGFzc2VzIGluY2x1ZGVkICovCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDJfcHV0bnVtcGFzc2VzKGJpbywgbGF5ZXItPm51bXBhc3Nlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX25iX3Bhc3NlcyA9IGNibGstPm51bXBhc3NlcyArIGxheWVyLT5udW1wYXNzZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gY2Jsay0+cGFzc2VzICsgIGNibGstPm51bXBhc3NlczsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogY29tcHV0YXRpb24gb2YgdGhlIGluY3JlYXNlIG9mIHRoZSBsZW5ndGggaW5kaWNhdG9yIGFuZCBpbnNlcnRpb24gaW4gdGhlIGhlYWRlciAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocGFzc25vID0gY2Jsay0+bnVtcGFzc2VzOyBwYXNzbm8gPCBsX25iX3Bhc3NlczsgKytwYXNzbm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytudW1wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gKz0gcGFzcy0+bGVuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzLT50ZXJtIHx8IHBhc3NubyA9PSAoY2Jsay0+bnVtcGFzc2VzICsgbGF5ZXItPm51bXBhc3NlcykgLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50ID0gKE9QSl9VSU5UMzIpb3BqX2ludF9tYXgoKE9QSl9JTlQzMilpbmNyZW1lbnQsIG9wal9pbnRfZmxvb3Jsb2cyKChPUEpfSU5UMzIpbGVuKSArIDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKChPUEpfSU5UMzIpY2Jsay0+bnVtbGVuYml0cyArIG9wal9pbnRfZmxvb3Jsb2cyKChPUEpfSU5UMzIpbnVtcCkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bXAgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytwYXNzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3QyX3B1dGNvbW1hY29kZShiaW8sIChPUEpfSU5UMzIpaW5jcmVtZW50KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogY29tcHV0YXRpb24gb2YgdGhlIG5ldyBMZW5ndGggaW5kaWNhdG9yICovCi0gICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT5udW1sZW5iaXRzICs9IGluY3JlbWVudDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGNibGstPnBhc3NlcyArICBjYmxrLT5udW1wYXNzZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnNlcnRpb24gb2YgdGhlIGNvZGV3b3JkIHNlZ21lbnQgbGVuZ3RoICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHBhc3NubyA9IGNibGstPm51bXBhc3NlczsgcGFzc25vIDwgbF9uYl9wYXNzZXM7ICsrcGFzc25vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bXArKzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuICs9IHBhc3MtPmxlbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzcy0+dGVybSB8fCBwYXNzbm8gPT0gKGNibGstPm51bXBhc3NlcyArIGxheWVyLT5udW1wYXNzZXMpIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9iaW9fd3JpdGUoYmlvLCAoT1BKX1VJTlQzMilsZW4sIGNibGstPm51bWxlbmJpdHMgKyAoT1BKX1VJTlQzMilvcGpfaW50X2Zsb29ybG9nMigoT1BKX0lOVDMyKW51bXApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bXAgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrcGFzczsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgKytjYmxrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICsrYmFuZDsKKyAgICAvKiBDaGVjayBpZiB0aGUgcGFja2V0IGlzIGVtcHR5ICovCisgICAgLyogTm90ZTogd2UgY291bGQgYWxzbyBza2lwIHRoYXQgc3RlcCBhbmQgYWx3YXlzIHdyaXRlIGEgcGFja2V0IGhlYWRlciAqLworICAgIGJhbmQgPSByZXMtPmJhbmRzOworICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgcmVzLT5udW1iYW5kczsgKytiYW5kbm8sICsrYmFuZCkgeworICAgICAgICBvcGpfdGNkX3ByZWNpbmN0X3QgKnByYzsKKyAgICAgICAgLyogU2tpcCBlbXB0eSBiYW5kcyAqLworICAgICAgICBpZiAob3BqX3RjZF9pc19iYW5kX2VtcHR5KGJhbmQpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghb3BqX2Jpb19mbHVzaChiaW8pKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2Jpb19kZXN0cm95KGJpbyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsgICAgICAgICAgICAgICAvKiBtb2RpZmllZCB0byBlbGltaW5hdGUgbG9uZ2ptcCAhISAqLworICAgICAgICBwcmMgPSAmYmFuZC0+cHJlY2luY3RzW3ByZWNub107CisgICAgICAgIGxfbmJfYmxvY2tzID0gcHJjLT5jdyAqIHByYy0+Y2g7CisgICAgICAgIGNibGsgPSBwcmMtPmNibGtzLmVuYzsKKyAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBsX25iX2Jsb2NrczsgY2Jsa25vKyssICsrY2JsaykgeworICAgICAgICAgICAgb3BqX3RjZF9sYXllcl90ICpsYXllciA9ICZjYmxrLT5sYXllcnNbbGF5bm9dOworCisgICAgICAgICAgICAvKiBpZiBjYmxrIG5vdCBpbmNsdWRlZCwgZ28gdG8gdGhlIG5leHQgY2JsayAgKi8KKyAgICAgICAgICAgIGlmICghbGF5ZXItPm51bXBhc3NlcykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGFja2V0X2VtcHR5ID0gT1BKX0ZBTFNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwYWNrZXRfZW1wdHkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgb3BqX2Jpb193cml0ZShiaW8sIHBhY2tldF9lbXB0eSA/IDAgOiAxLCAxKTsgICAgICAgICAgIC8qIEVtcHR5IGhlYWRlciBiaXQgKi8KKworCisgICAgLyogV3JpdGluZyBQYWNrZXQgaGVhZGVyICovCisgICAgYmFuZCA9IHJlcy0+YmFuZHM7CisgICAgZm9yIChiYW5kbm8gPSAwOyAhcGFja2V0X2VtcHR5ICYmCisgICAgICAgICAgICBiYW5kbm8gPCByZXMtPm51bWJhbmRzOyArK2JhbmRubywgKytiYW5kKSAgICAgIHsKKyAgICAgICAgb3BqX3RjZF9wcmVjaW5jdF90ICpwcmM7CisKKyAgICAgICAgLyogU2tpcCBlbXB0eSBiYW5kcyAqLworICAgICAgICBpZiAob3BqX3RjZF9pc19iYW5kX2VtcHR5KGJhbmQpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGxfbmJfYnl0ZXMgPSAoT1BKX1VJTlQzMilvcGpfYmlvX251bWJ5dGVzKGJpbyk7Ci0gICAgICAgIGMgKz0gbF9uYl9ieXRlczsKLSAgICAgICAgbGVuZ3RoIC09IGxfbmJfYnl0ZXM7CisgICAgICAgIHByYyA9ICZiYW5kLT5wcmVjaW5jdHNbcHJlY25vXTsKKyAgICAgICAgbF9uYl9ibG9ja3MgPSBwcmMtPmN3ICogcHJjLT5jaDsKKyAgICAgICAgY2JsayA9IHByYy0+Y2Jsa3MuZW5jOwogCisgICAgICAgIGZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgbF9uYl9ibG9ja3M7ICsrY2Jsa25vKSB7CisgICAgICAgICAgICBvcGpfdGNkX2xheWVyX3QgKmxheWVyID0gJmNibGstPmxheWVyc1tsYXlub107CisKKyAgICAgICAgICAgIGlmICghY2Jsay0+bnVtcGFzc2VzICYmIGxheWVyLT5udW1wYXNzZXMpIHsKKyAgICAgICAgICAgICAgICBvcGpfdGd0X3NldHZhbHVlKHByYy0+aW5jbHRyZWUsIGNibGtubywgKE9QSl9JTlQzMilsYXlubyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICsrY2JsazsKKyAgICAgICAgfQorCisgICAgICAgIGNibGsgPSBwcmMtPmNibGtzLmVuYzsKKyAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBsX25iX2Jsb2NrczsgY2Jsa25vKyspIHsKKyAgICAgICAgICAgIG9wal90Y2RfbGF5ZXJfdCAqbGF5ZXIgPSAmY2Jsay0+bGF5ZXJzW2xheW5vXTsKKyAgICAgICAgICAgIE9QSl9VSU5UMzIgaW5jcmVtZW50ID0gMDsKKyAgICAgICAgICAgIE9QSl9VSU5UMzIgbnVtcCA9IDA7CisgICAgICAgICAgICBPUEpfVUlOVDMyIGxlbiA9IDAsIHBhc3NubzsKKyAgICAgICAgICAgIE9QSl9VSU5UMzIgbF9uYl9wYXNzZXM7CisKKyAgICAgICAgICAgIC8qIGNibGsgaW5jbHVzaW9uIGJpdHMgKi8KKyAgICAgICAgICAgIGlmICghY2Jsay0+bnVtcGFzc2VzKSB7CisgICAgICAgICAgICAgICAgb3BqX3RndF9lbmNvZGUoYmlvLCBwcmMtPmluY2x0cmVlLCBjYmxrbm8sIChPUEpfSU5UMzIpKGxheW5vICsgMSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvcGpfYmlvX3dyaXRlKGJpbywgbGF5ZXItPm51bXBhc3NlcyAhPSAwLCAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogaWYgY2JsayBub3QgaW5jbHVkZWQsIGdvIHRvIHRoZSBuZXh0IGNibGsgICovCisgICAgICAgICAgICBpZiAoIWxheWVyLT5udW1wYXNzZXMpIHsKKyAgICAgICAgICAgICAgICArK2NibGs7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGlmIGZpcnN0IGluc3RhbmNlIG9mIGNibGsgLS0+IHplcm8gYml0LXBsYW5lcyBpbmZvcm1hdGlvbiAqLworICAgICAgICAgICAgaWYgKCFjYmxrLT5udW1wYXNzZXMpIHsKKyAgICAgICAgICAgICAgICBjYmxrLT5udW1sZW5iaXRzID0gMzsKKyAgICAgICAgICAgICAgICBvcGpfdGd0X2VuY29kZShiaW8sIHByYy0+aW1zYnRyZWUsIGNibGtubywgOTk5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGluZyBwYXNzZXMgaW5jbHVkZWQgKi8KKyAgICAgICAgICAgIG9wal90Ml9wdXRudW1wYXNzZXMoYmlvLCBsYXllci0+bnVtcGFzc2VzKTsKKyAgICAgICAgICAgIGxfbmJfcGFzc2VzID0gY2Jsay0+bnVtcGFzc2VzICsgbGF5ZXItPm51bXBhc3NlczsKKyAgICAgICAgICAgIHBhc3MgPSBjYmxrLT5wYXNzZXMgKyAgY2Jsay0+bnVtcGFzc2VzOworCisgICAgICAgICAgICAvKiBjb21wdXRhdGlvbiBvZiB0aGUgaW5jcmVhc2Ugb2YgdGhlIGxlbmd0aCBpbmRpY2F0b3IgYW5kIGluc2VydGlvbiBpbiB0aGUgaGVhZGVyICAgICAqLworICAgICAgICAgICAgZm9yIChwYXNzbm8gPSBjYmxrLT5udW1wYXNzZXM7IHBhc3NubyA8IGxfbmJfcGFzc2VzOyArK3Bhc3NubykgeworICAgICAgICAgICAgICAgICsrbnVtcDsKKyAgICAgICAgICAgICAgICBsZW4gKz0gcGFzcy0+bGVuOworCisgICAgICAgICAgICAgICAgaWYgKHBhc3MtPnRlcm0gfHwgcGFzc25vID09IChjYmxrLT5udW1wYXNzZXMgKyBsYXllci0+bnVtcGFzc2VzKSAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5jcmVtZW50ID0gKE9QSl9VSU5UMzIpb3BqX2ludF9tYXgoKE9QSl9JTlQzMilpbmNyZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbnRfZmxvb3Jsb2cyKChPUEpfSU5UMzIpbGVuKSArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoKE9QSl9JTlQzMiljYmxrLT5udW1sZW5iaXRzICsgb3BqX2ludF9mbG9vcmxvZzIoKE9QSl9JTlQzMiludW1wKSkpOworICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBudW1wID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICArK3Bhc3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcGpfdDJfcHV0Y29tbWFjb2RlKGJpbywgKE9QSl9JTlQzMilpbmNyZW1lbnQpOworCisgICAgICAgICAgICAvKiBjb21wdXRhdGlvbiBvZiB0aGUgbmV3IExlbmd0aCBpbmRpY2F0b3IgKi8KKyAgICAgICAgICAgIGNibGstPm51bWxlbmJpdHMgKz0gaW5jcmVtZW50OworCisgICAgICAgICAgICBwYXNzID0gY2Jsay0+cGFzc2VzICsgIGNibGstPm51bXBhc3NlczsKKyAgICAgICAgICAgIC8qIGluc2VydGlvbiBvZiB0aGUgY29kZXdvcmQgc2VnbWVudCBsZW5ndGggKi8KKyAgICAgICAgICAgIGZvciAocGFzc25vID0gY2Jsay0+bnVtcGFzc2VzOyBwYXNzbm8gPCBsX25iX3Bhc3NlczsgKytwYXNzbm8pIHsKKyAgICAgICAgICAgICAgICBudW1wKys7CisgICAgICAgICAgICAgICAgbGVuICs9IHBhc3MtPmxlbjsKKworICAgICAgICAgICAgICAgIGlmIChwYXNzLT50ZXJtIHx8IHBhc3NubyA9PSAoY2Jsay0+bnVtcGFzc2VzICsgbGF5ZXItPm51bXBhc3NlcykgLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIG9wal9iaW9fd3JpdGUoYmlvLCAoT1BKX1VJTlQzMilsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+bnVtbGVuYml0cyArIChPUEpfVUlOVDMyKW9wal9pbnRfZmxvb3Jsb2cyKChPUEpfSU5UMzIpbnVtcCkpOworICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOworICAgICAgICAgICAgICAgICAgICBudW1wID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKytwYXNzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICArK2NibGs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIW9wal9iaW9fZmx1c2goYmlvKSkgewogICAgICAgICBvcGpfYmlvX2Rlc3Ryb3koYmlvKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsgICAgICAgICAgICAgICAvKiBtb2RpZmllZCB0byBlbGltaW5hdGUgbG9uZ2ptcCAhISAqLworICAgIH0KIAotICAgICAgICAvKiA8RVBIIDB4ZmY5Mj4gKi8KLSAgICAgICAgaWYgKHRjcC0+Y3N0eSAmIEoyS19DUF9DU1RZX0VQSCkgewotICAgICAgICAgICAgICAgIGNbMF0gPSAyNTU7Ci0gICAgICAgICAgICAgICAgY1sxXSA9IDE0NjsKLSAgICAgICAgICAgICAgICBjICs9IDI7Ci0gICAgICAgICAgICAgICAgbGVuZ3RoIC09IDI7CisgICAgbF9uYl9ieXRlcyA9IChPUEpfVUlOVDMyKW9wal9iaW9fbnVtYnl0ZXMoYmlvKTsKKyAgICBjICs9IGxfbmJfYnl0ZXM7CisgICAgbGVuZ3RoIC09IGxfbmJfYnl0ZXM7CisKKyAgICBvcGpfYmlvX2Rlc3Ryb3koYmlvKTsKKworICAgIC8qIDxFUEggMHhmZjkyPiAqLworICAgIGlmICh0Y3AtPmNzdHkgJiBKMktfQ1BfQ1NUWV9FUEgpIHsKKyAgICAgICAgaWYgKGxlbmd0aCA8IDIpIHsKKyAgICAgICAgICAgIGlmIChwX3QyX21vZGUgPT0gRklOQUxfUEFTUykgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3BqX3QyX2VuY29kZV9wYWNrZXQoKTogb25seSAldSBieXRlcyByZW1haW5pbmcgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dCBidWZmZXIuICV1IG5lZWRlZC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsIDIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQotICAgICAgICAvKiA8L0VQSD4gKi8KKyAgICAgICAgY1swXSA9IDI1NTsKKyAgICAgICAgY1sxXSA9IDE0NjsKKyAgICAgICAgYyArPSAyOworICAgICAgICBsZW5ndGggLT0gMjsKKyAgICB9CisgICAgLyogPC9FUEg+ICovCiAKLSAgICAgICAgLyogPDwgSU5ERVggKi8KLSAgICAgICAgLyogRW5kIG9mIHBhY2tldCBoZWFkZXIgcG9zaXRpb24uIEN1cnJlbnRseSBvbmx5IHJlcHJlc2VudHMgdGhlIGRpc3RhbmNlIHRvIHN0YXJ0IG9mIHBhY2tldAotICAgICAgICAgICBXaWxsIGJlIHVwZGF0ZWQgbGF0ZXIgYnkgaW5jcmVtZW50aW5nIHdpdGggcGFja2V0IHN0YXJ0IHZhbHVlKi8KLSAgICAgICAgaWYoY3N0cl9pbmZvICYmIGNzdHJfaW5mby0+aW5kZXhfd3JpdGUpIHsKKyAgICAvKiA8PCBJTkRFWCAqLworICAgIC8qIEVuZCBvZiBwYWNrZXQgaGVhZGVyIHBvc2l0aW9uLiBDdXJyZW50bHkgb25seSByZXByZXNlbnRzIHRoZSBkaXN0YW5jZSB0byBzdGFydCBvZiBwYWNrZXQKKyAgICAgICBXaWxsIGJlIHVwZGF0ZWQgbGF0ZXIgYnkgaW5jcmVtZW50aW5nIHdpdGggcGFja2V0IHN0YXJ0IHZhbHVlKi8KKyAgICBpZiAoY3N0cl9pbmZvICYmIGNzdHJfaW5mby0+aW5kZXhfd3JpdGUpIHsKKyAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKmluZm9fUEsgPSAmY3N0cl9pbmZvLT50aWxlW3RpbGVub10ucGFja2V0W2NzdHJfaW5mby0+cGFja25vXTsKKyAgICAgICAgaW5mb19QSy0+ZW5kX3BoX3BvcyA9IChPUEpfSU5UMzIpKGMgLSBkZXN0KTsKKyAgICB9CisgICAgLyogSU5ERVggPj4gKi8KKworICAgIC8qIFdyaXRpbmcgdGhlIHBhY2tldCBib2R5ICovCisgICAgYmFuZCA9IHJlcy0+YmFuZHM7CisgICAgZm9yIChiYW5kbm8gPSAwOyAhcGFja2V0X2VtcHR5ICYmIGJhbmRubyA8IHJlcy0+bnVtYmFuZHM7IGJhbmRubysrLCArK2JhbmQpIHsKKyAgICAgICAgb3BqX3RjZF9wcmVjaW5jdF90ICpwcmM7CisKKyAgICAgICAgLyogU2tpcCBlbXB0eSBiYW5kcyAqLworICAgICAgICBpZiAob3BqX3RjZF9pc19iYW5kX2VtcHR5KGJhbmQpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByYyA9ICZiYW5kLT5wcmVjaW5jdHNbcHJlY25vXTsKKyAgICAgICAgbF9uYl9ibG9ja3MgPSBwcmMtPmN3ICogcHJjLT5jaDsKKyAgICAgICAgY2JsayA9IHByYy0+Y2Jsa3MuZW5jOworCisgICAgICAgIGZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgbF9uYl9ibG9ja3M7ICsrY2Jsa25vKSB7CisgICAgICAgICAgICBvcGpfdGNkX2xheWVyX3QgKmxheWVyID0gJmNibGstPmxheWVyc1tsYXlub107CisKKyAgICAgICAgICAgIGlmICghbGF5ZXItPm51bXBhc3NlcykgeworICAgICAgICAgICAgICAgICsrY2JsazsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxheWVyLT5sZW4gPiBsZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBpZiAocF90Ml9tb2RlID09IEZJTkFMX1BBU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3BqX3QyX2VuY29kZV9wYWNrZXQoKTogb25seSAldSBieXRlcyByZW1haW5pbmcgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQgYnVmZmVyLiAldSBuZWVkZWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwgbGF5ZXItPmxlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1lbWNweShjLCBsYXllci0+ZGF0YSwgbGF5ZXItPmxlbik7CisgICAgICAgICAgICBjYmxrLT5udW1wYXNzZXMgKz0gbGF5ZXItPm51bXBhc3NlczsKKyAgICAgICAgICAgIGMgKz0gbGF5ZXItPmxlbjsKKyAgICAgICAgICAgIGxlbmd0aCAtPSBsYXllci0+bGVuOworCisgICAgICAgICAgICAvKiA8PCBJTkRFWCAqLworICAgICAgICAgICAgaWYgKGNzdHJfaW5mbyAmJiBjc3RyX2luZm8tPmluZGV4X3dyaXRlKSB7CiAgICAgICAgICAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKmluZm9fUEsgPSAmY3N0cl9pbmZvLT50aWxlW3RpbGVub10ucGFja2V0W2NzdHJfaW5mby0+cGFja25vXTsKLSAgICAgICAgICAgICAgICBpbmZvX1BLLT5lbmRfcGhfcG9zID0gKE9QSl9JTlQzMikoYyAtIGRlc3QpOwotICAgICAgICB9Ci0gICAgICAgIC8qIElOREVYID4+ICovCi0KLSAgICAgICAgLyogV3JpdGluZyB0aGUgcGFja2V0IGJvZHkgKi8KLSAgICAgICAgYmFuZCA9IHJlcy0+YmFuZHM7Ci0gICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgcmVzLT5udW1iYW5kczsgYmFuZG5vKyspIHsKLSAgICAgICAgICAgICAgICBvcGpfdGNkX3ByZWNpbmN0X3QgKnByYyA9ICZiYW5kLT5wcmVjaW5jdHNbcHJlY25vXTsKLQotICAgICAgICAgICAgICAgIGxfbmJfYmxvY2tzID0gcHJjLT5jdyAqIHByYy0+Y2g7Ci0gICAgICAgICAgICAgICAgY2JsayA9IHByYy0+Y2Jsa3MuZW5jOwotCi0gICAgICAgICAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBsX25iX2Jsb2NrczsgKytjYmxrbm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfbGF5ZXJfdCAqbGF5ZXIgPSAmY2Jsay0+bGF5ZXJzW2xheW5vXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXllci0+bnVtcGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrY2JsazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXllci0+bGVuID4gbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShjLCBsYXllci0+ZGF0YSwgbGF5ZXItPmxlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT5udW1wYXNzZXMgKz0gbGF5ZXItPm51bXBhc3NlczsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMgKz0gbGF5ZXItPmxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCAtPSBsYXllci0+bGVuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiA8PCBJTkRFWCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYoY3N0cl9pbmZvICYmIGNzdHJfaW5mby0+aW5kZXhfd3JpdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKmluZm9fUEsgPSAmY3N0cl9pbmZvLT50aWxlW3RpbGVub10ucGFja2V0W2NzdHJfaW5mby0+cGFja25vXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb19QSy0+ZGlzdG8gKz0gbGF5ZXItPmRpc3RvOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3N0cl9pbmZvLT5EX21heCA8IGluZm9fUEstPmRpc3RvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmZvLT5EX21heCA9IGluZm9fUEstPmRpc3RvOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICsrY2JsazsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIElOREVYID4+ICovCisgICAgICAgICAgICAgICAgaW5mb19QSy0+ZGlzdG8gKz0gbGF5ZXItPmRpc3RvOworICAgICAgICAgICAgICAgIGlmIChjc3RyX2luZm8tPkRfbWF4IDwgaW5mb19QSy0+ZGlzdG8pIHsKKyAgICAgICAgICAgICAgICAgICAgY3N0cl9pbmZvLT5EX21heCA9IGluZm9fUEstPmRpc3RvOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICArK2JhbmQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICsrY2JsazsKKyAgICAgICAgICAgIC8qIElOREVYID4+ICovCiAgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgYXNzZXJ0KCBjID49IGRlc3QgKTsKLSAgICAgICAgKiBwX2RhdGFfd3JpdHRlbiArPSAoT1BKX1VJTlQzMikoYyAtIGRlc3QpOworICAgIGFzc2VydChjID49IGRlc3QpOworICAgICogcF9kYXRhX3dyaXR0ZW4gKz0gKE9QSl9VSU5UMzIpKGMgLSBkZXN0KTsKIAotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3QyX3NraXBfcGFja2V0KCBvcGpfdDJfdCogcF90MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICpwX3RpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKnBfdGNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKnBfcGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9zcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9wYWNrZXRfaW5mb190ICpwX3BhY2tfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKQorc3RhdGljIE9QSl9CT09MIG9wal90Ml9za2lwX3BhY2tldChvcGpfdDJfdCogcF90MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlX3QgKnBfdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjcF90ICpwX3RjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKnBfcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpwX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BhY2tldF9pbmZvX3QgKnBfcGFja19pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcikKIHsKLSAgICAgICAgT1BKX0JPT0wgbF9yZWFkX2RhdGE7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl9ieXRlc19yZWFkID0gMDsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX3RvdGFsX2J5dGVzX3JlYWQgPSAwOworICAgIE9QSl9CT09MIGxfcmVhZF9kYXRhOworICAgIE9QSl9VSU5UMzIgbF9uYl9ieXRlc19yZWFkID0gMDsKKyAgICBPUEpfVUlOVDMyIGxfbmJfdG90YWxfYnl0ZXNfcmVhZCA9IDA7CiAKLSAgICAgICAgKnBfZGF0YV9yZWFkID0gMDsKKyAgICAqcF9kYXRhX3JlYWQgPSAwOwogCi0gICAgICAgIGlmICghIG9wal90Ml9yZWFkX3BhY2tldF9oZWFkZXIocF90MixwX3RpbGUscF90Y3AscF9waSwmbF9yZWFkX2RhdGEscF9zcmMsJmxfbmJfYnl0ZXNfcmVhZCxwX21heF9sZW5ndGgscF9wYWNrX2luZm8sIHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIGlmICghIG9wal90Ml9yZWFkX3BhY2tldF9oZWFkZXIocF90MiwgcF90aWxlLCBwX3RjcCwgcF9waSwgJmxfcmVhZF9kYXRhLCBwX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsX25iX2J5dGVzX3JlYWQsIHBfbWF4X2xlbmd0aCwgcF9wYWNrX2luZm8sIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICBwX3NyYyArPSBsX25iX2J5dGVzX3JlYWQ7CisgICAgbF9uYl90b3RhbF9ieXRlc19yZWFkICs9IGxfbmJfYnl0ZXNfcmVhZDsKKyAgICBwX21heF9sZW5ndGggLT0gbF9uYl9ieXRlc19yZWFkOworCisgICAgLyogd2Ugc2hvdWxkIHJlYWQgZGF0YSBmb3IgdGhlIHBhY2tldCAqLworICAgIGlmIChsX3JlYWRfZGF0YSkgeworICAgICAgICBsX25iX2J5dGVzX3JlYWQgPSAwOworCisgICAgICAgIGlmICghIG9wal90Ml9za2lwX3BhY2tldF9kYXRhKHBfdDIsIHBfdGlsZSwgcF9waSwgJmxfbmJfYnl0ZXNfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYXhfbGVuZ3RoLCBwX3BhY2tfaW5mbywgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQogCi0gICAgICAgIHBfc3JjICs9IGxfbmJfYnl0ZXNfcmVhZDsKICAgICAgICAgbF9uYl90b3RhbF9ieXRlc19yZWFkICs9IGxfbmJfYnl0ZXNfcmVhZDsKLSAgICAgICAgcF9tYXhfbGVuZ3RoIC09IGxfbmJfYnl0ZXNfcmVhZDsKKyAgICB9CisgICAgKnBfZGF0YV9yZWFkID0gbF9uYl90b3RhbF9ieXRlc19yZWFkOwogCi0gICAgICAgIC8qIHdlIHNob3VsZCByZWFkIGRhdGEgZm9yIHRoZSBwYWNrZXQgKi8KLSAgICAgICAgaWYgKGxfcmVhZF9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgbF9uYl9ieXRlc19yZWFkID0gMDsKLQotICAgICAgICAgICAgICAgIGlmICghIG9wal90Ml9za2lwX3BhY2tldF9kYXRhKHBfdDIscF90aWxlLHBfcGksJmxfbmJfYnl0ZXNfcmVhZCxwX21heF9sZW5ndGgscF9wYWNrX2luZm8sIHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbF9uYl90b3RhbF9ieXRlc19yZWFkICs9IGxfbmJfYnl0ZXNfcmVhZDsKLSAgICAgICAgfQotICAgICAgICAqcF9kYXRhX3JlYWQgPSBsX25iX3RvdGFsX2J5dGVzX3JlYWQ7Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3QyX3JlYWRfcGFja2V0X2hlYWRlciggb3BqX3QyX3QqIHBfdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqcF90aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjcF90ICpwX3RjcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9waV9pdGVyYXRvcl90ICpwX3BpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JPT0wgKiBwX2lzX2RhdGFfcHJlc2VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpwX3NyY19kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV9yZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGFja2V0X2luZm9fdCAqcF9wYWNrX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcikKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdDJfcmVhZF9wYWNrZXRfaGVhZGVyKG9wal90Ml90KiBwX3QyLAorICAgICAgICBvcGpfdGNkX3RpbGVfdCAqcF90aWxlLAorICAgICAgICBvcGpfdGNwX3QgKnBfdGNwLAorICAgICAgICBvcGpfcGlfaXRlcmF0b3JfdCAqcF9waSwKKyAgICAgICAgT1BKX0JPT0wgKiBwX2lzX2RhdGFfcHJlc2VudCwKKyAgICAgICAgT1BKX0JZVEUgKnBfc3JjX2RhdGEsCisgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfcmVhZCwKKyAgICAgICAgT1BKX1VJTlQzMiBwX21heF9sZW5ndGgsCisgICAgICAgIG9wal9wYWNrZXRfaW5mb190ICpwX3BhY2tfaW5mbywKKyAgICAgICAgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpCiAKIHsKLSAgICAgICAgLyogbG9vcCAqLwotICAgICAgICBPUEpfVUlOVDMyIGJhbmRubywgY2Jsa25vOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfY29kZV9ibG9ja3M7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9yZW1haW5pbmdfbGVuZ3RoOwotICAgICAgICBPUEpfVUlOVDMyIGxfaGVhZGVyX2xlbmd0aDsKLSAgICAgICAgT1BKX1VJTlQzMiAqIGxfbW9kaWZpZWRfbGVuZ3RoX3B0ciA9IDAwOwotICAgICAgICBPUEpfQllURSAqbF9jdXJyZW50X2RhdGEgPSBwX3NyY19kYXRhOwotICAgICAgICBvcGpfY3BfdCAqbF9jcCA9IHBfdDItPmNwOwotICAgICAgICBvcGpfYmlvX3QgKmxfYmlvID0gMDA7ICAvKiBCSU8gY29tcG9uZW50ICovCi0gICAgICAgIG9wal90Y2RfYmFuZF90ICpsX2JhbmQgPSAwMDsKLSAgICAgICAgb3BqX3RjZF9jYmxrX2RlY190KiBsX2NibGsgPSAwMDsKLSAgICAgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QqIGxfcmVzID0gJnBfdGlsZS0+Y29tcHNbcF9waS0+Y29tcG5vXS5yZXNvbHV0aW9uc1twX3BpLT5yZXNub107CisgICAgLyogbG9vcCAqLworICAgIE9QSl9VSU5UMzIgYmFuZG5vLCBjYmxrbm87CisgICAgT1BKX1VJTlQzMiBsX25iX2NvZGVfYmxvY2tzOworICAgIE9QSl9VSU5UMzIgbF9yZW1haW5pbmdfbGVuZ3RoOworICAgIE9QSl9VSU5UMzIgbF9oZWFkZXJfbGVuZ3RoOworICAgIE9QSl9VSU5UMzIgKiBsX21vZGlmaWVkX2xlbmd0aF9wdHIgPSAwMDsKKyAgICBPUEpfQllURSAqbF9jdXJyZW50X2RhdGEgPSBwX3NyY19kYXRhOworICAgIG9wal9jcF90ICpsX2NwID0gcF90Mi0+Y3A7CisgICAgb3BqX2Jpb190ICpsX2JpbyA9IDAwOyAgLyogQklPIGNvbXBvbmVudCAqLworICAgIG9wal90Y2RfYmFuZF90ICpsX2JhbmQgPSAwMDsKKyAgICBvcGpfdGNkX2NibGtfZGVjX3QqIGxfY2JsayA9IDAwOworICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiBsX3JlcyA9CisgICAgICAgICZwX3RpbGUtPmNvbXBzW3BfcGktPmNvbXBub10ucmVzb2x1dGlvbnNbcF9waS0+cmVzbm9dOwogCi0gICAgICAgIE9QSl9CWVRFICpsX2hlYWRlcl9kYXRhID0gMDA7Ci0gICAgICAgIE9QSl9CWVRFICoqbF9oZWFkZXJfZGF0YV9zdGFydCA9IDAwOworICAgIE9QSl9CWVRFICpsX2hlYWRlcl9kYXRhID0gMDA7CisgICAgT1BKX0JZVEUgKipsX2hlYWRlcl9kYXRhX3N0YXJ0ID0gMDA7CiAKLSAgICAgICAgT1BKX1VJTlQzMiBsX3ByZXNlbnQ7CisgICAgT1BKX1VJTlQzMiBsX3ByZXNlbnQ7CiAKLSAgICAgICAgaWYgKHBfcGktPmxheW5vID09IDApIHsKLSAgICAgICAgICAgICAgICBsX2JhbmQgPSBsX3Jlcy0+YmFuZHM7Ci0KLSAgICAgICAgICAgICAgICAvKiByZXNldCB0YWd0cmVlcyAqLwotICAgICAgICAgICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgbF9yZXMtPm51bWJhbmRzOyArK2JhbmRubykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9wcmVjaW5jdF90ICpsX3ByYyA9ICZsX2JhbmQtPnByZWNpbmN0c1twX3BpLT5wcmVjbm9dOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEgKChsX2JhbmQtPngxLWxfYmFuZC0+eDAgPT0gMCl8fChsX2JhbmQtPnkxLWxfYmFuZC0+eTAgPT0gMCkpICkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGd0X3Jlc2V0KGxfcHJjLT5pbmNsdHJlZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Z3RfcmVzZXQobF9wcmMtPmltc2J0cmVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrID0gbF9wcmMtPmNibGtzLmRlYzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX25iX2NvZGVfYmxvY2tzID0gbF9wcmMtPmN3ICogbF9wcmMtPmNoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IGxfbmJfY29kZV9ibG9ja3M7ICsrY2Jsa25vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5udW1zZWdzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NibGstPnJlYWxfbnVtX3NlZ3MgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9jYmxrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICsrbF9iYW5kOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIFNPUCBtYXJrZXJzICovCi0KLSAgICAgICAgaWYgKHBfdGNwLT5jc3R5ICYgSjJLX0NQX0NTVFlfU09QKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBfbWF4X2xlbmd0aCA8IDYpIHsKLQkJCQkJCQkJCQkJCW9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIk5vdCBlbm91Z2ggc3BhY2UgZm9yIGV4cGVjdGVkIFNPUCBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKCpsX2N1cnJlbnRfZGF0YSkgIT0gMHhmZiB8fCAoKihsX2N1cnJlbnRfZGF0YSArIDEpICE9IDB4OTEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICJFeHBlY3RlZCBTT1AgbWFya2VyXG4iKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gNjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiogVE9ETyA6IGNoZWNrIHRoZSBOc29wIHZhbHVlICovCi0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICBXaGVuIHRoZSBtYXJrZXIgUFBUL1BQTSBpcyB1c2VkIHRoZSBwYWNrZXQgaGVhZGVyIGFyZSBzdG9yZSBpbiBQUFQvUFBNIG1hcmtlcgotICAgICAgICBUaGlzIHBhcnQgZGVhbCB3aXRoIHRoaXMgY2FyYWN0ZXJpc3RpYwotICAgICAgICBzdGVwIDE6IFJlYWQgcGFja2V0IGhlYWRlciBpbiB0aGUgc2F2ZWQgc3RydWN0dXJlCi0gICAgICAgIHN0ZXAgMjogUmV0dXJuIHRvIGNvZGVzdHJlYW0gZm9yIGRlY29kaW5nCi0gICAgICAgICovCi0KLSAgICAgICAgbF9iaW8gPSBvcGpfYmlvX2NyZWF0ZSgpOwotICAgICAgICBpZiAoISBsX2JpbykgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobF9jcC0+cHBtID09IDEpIHsgLyogUFBNICovCi0gICAgICAgICAgICAgICAgbF9oZWFkZXJfZGF0YV9zdGFydCA9ICZsX2NwLT5wcG1fZGF0YTsKLSAgICAgICAgICAgICAgICBsX2hlYWRlcl9kYXRhID0gKmxfaGVhZGVyX2RhdGFfc3RhcnQ7Ci0gICAgICAgICAgICAgICAgbF9tb2RpZmllZF9sZW5ndGhfcHRyID0gJihsX2NwLT5wcG1fbGVuKTsKLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBfdGNwLT5wcHQgPT0gMSkgeyAvKiBQUFQgKi8KLSAgICAgICAgICAgICAgICBsX2hlYWRlcl9kYXRhX3N0YXJ0ID0gJihwX3RjcC0+cHB0X2RhdGEpOwotICAgICAgICAgICAgICAgIGxfaGVhZGVyX2RhdGEgPSAqbF9oZWFkZXJfZGF0YV9zdGFydDsKLSAgICAgICAgICAgICAgICBsX21vZGlmaWVkX2xlbmd0aF9wdHIgPSAmKHBfdGNwLT5wcHRfbGVuKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsgIC8qIE5vcm1hbCBDYXNlICovCi0gICAgICAgICAgICAgICAgbF9oZWFkZXJfZGF0YV9zdGFydCA9ICYobF9jdXJyZW50X2RhdGEpOwotICAgICAgICAgICAgICAgIGxfaGVhZGVyX2RhdGEgPSAqbF9oZWFkZXJfZGF0YV9zdGFydDsKLSAgICAgICAgICAgICAgICBsX3JlbWFpbmluZ19sZW5ndGggPSAoT1BKX1VJTlQzMikocF9zcmNfZGF0YStwX21heF9sZW5ndGgtbF9oZWFkZXJfZGF0YSk7Ci0gICAgICAgICAgICAgICAgbF9tb2RpZmllZF9sZW5ndGhfcHRyID0gJihsX3JlbWFpbmluZ19sZW5ndGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3BqX2Jpb19pbml0X2RlYyhsX2JpbywgbF9oZWFkZXJfZGF0YSwqbF9tb2RpZmllZF9sZW5ndGhfcHRyKTsKLQotICAgICAgICBsX3ByZXNlbnQgPSBvcGpfYmlvX3JlYWQobF9iaW8sIDEpOwotICAgICAgICBKQVNfRlBSSU5URihzdGRlcnIsICJwcmVzZW50PSVkIFxuIiwgbF9wcmVzZW50ICk7Ci0gICAgICAgIGlmICghbF9wcmVzZW50KSB7Ci0gICAgICAgICAgICAvKiBUT0RPIE1TRDogbm8gdGVzdCB0byBjb250cm9sIHRoZSBvdXRwdXQgb2YgdGhpcyBmdW5jdGlvbiovCi0gICAgICAgICAgICAgICAgb3BqX2Jpb19pbmFsaWduKGxfYmlvKTsKLSAgICAgICAgICAgICAgICBsX2hlYWRlcl9kYXRhICs9IG9wal9iaW9fbnVtYnl0ZXMobF9iaW8pOwotICAgICAgICAgICAgICAgIG9wal9iaW9fZGVzdHJveShsX2Jpbyk7Ci0KLSAgICAgICAgICAgICAgICAvKiBFUEggbWFya2VycyAqLwotICAgICAgICAgICAgICAgIGlmIChwX3RjcC0+Y3N0eSAmIEoyS19DUF9DU1RZX0VQSCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgqbF9tb2RpZmllZF9sZW5ndGhfcHRyIC0gKE9QSl9VSU5UMzIpKGxfaGVhZGVyX2RhdGEgLSAqbF9oZWFkZXJfZGF0YV9zdGFydCkpIDwgMlUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiTm90IGVub3VnaCBzcGFjZSBmb3IgZXhwZWN0ZWQgRVBIIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCgqbF9oZWFkZXJfZGF0YSkgIT0gMHhmZiB8fCAoKihsX2hlYWRlcl9kYXRhICsgMSkgIT0gMHg5MikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiRXhwZWN0ZWQgRVBIIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2hlYWRlcl9kYXRhICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbF9oZWFkZXJfbGVuZ3RoID0gKE9QSl9VSU5UMzIpKGxfaGVhZGVyX2RhdGEgLSAqbF9oZWFkZXJfZGF0YV9zdGFydCk7Ci0gICAgICAgICAgICAgICAgKmxfbW9kaWZpZWRfbGVuZ3RoX3B0ciAtPSBsX2hlYWRlcl9sZW5ndGg7Ci0gICAgICAgICAgICAgICAgKmxfaGVhZGVyX2RhdGFfc3RhcnQgKz0gbF9oZWFkZXJfbGVuZ3RoOwotCi0gICAgICAgICAgICAgICAgLyogPDwgSU5ERVggKi8KLSAgICAgICAgICAgICAgICAvKiBFbmQgb2YgcGFja2V0IGhlYWRlciBwb3NpdGlvbi4gQ3VycmVudGx5IG9ubHkgcmVwcmVzZW50cyB0aGUgZGlzdGFuY2UgdG8gc3RhcnQgb2YgcGFja2V0Ci0gICAgICAgICAgICAgICAgICAgV2lsbCBiZSB1cGRhdGVkIGxhdGVyIGJ5IGluY3JlbWVudGluZyB3aXRoIHBhY2tldCBzdGFydCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgIGlmIChwX3BhY2tfaW5mbykgewotICAgICAgICAgICAgICAgICAgICAgICAgcF9wYWNrX2luZm8tPmVuZF9waF9wb3MgPSAoT1BKX0lOVDMyKShsX2N1cnJlbnRfZGF0YSAtIHBfc3JjX2RhdGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBJTkRFWCA+PiAqLwotCi0gICAgICAgICAgICAgICAgKiBwX2lzX2RhdGFfcHJlc2VudCA9IE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAqcF9kYXRhX3JlYWQgPSAoT1BKX1VJTlQzMikobF9jdXJyZW50X2RhdGEgLSBwX3NyY19kYXRhKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgICAgIH0KLQorICAgIGlmIChwX3BpLT5sYXlubyA9PSAwKSB7CiAgICAgICAgIGxfYmFuZCA9IGxfcmVzLT5iYW5kczsKLSAgICAgICAgZm9yIChiYW5kbm8gPSAwOyBiYW5kbm8gPCBsX3Jlcy0+bnVtYmFuZHM7ICsrYmFuZG5vKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3RjZF9wcmVjaW5jdF90ICpsX3ByYyA9ICYobF9iYW5kLT5wcmVjaW5jdHNbcF9waS0+cHJlY25vXSk7CiAKLSAgICAgICAgICAgICAgICBpZiAoKGxfYmFuZC0+eDEtbF9iYW5kLT54MCA9PSAwKXx8KGxfYmFuZC0+eTEtbF9iYW5kLT55MCA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgKytsX2JhbmQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgLyogcmVzZXQgdGFndHJlZXMgKi8KKyAgICAgICAgZm9yIChiYW5kbm8gPSAwOyBiYW5kbm8gPCBsX3Jlcy0+bnVtYmFuZHM7ICsrYmFuZG5vKSB7CisgICAgICAgICAgICBpZiAoIW9wal90Y2RfaXNfYmFuZF9lbXB0eShsX2JhbmQpKSB7CisgICAgICAgICAgICAgICAgb3BqX3RjZF9wcmVjaW5jdF90ICpsX3ByYyA9ICZsX2JhbmQtPnByZWNpbmN0c1twX3BpLT5wcmVjbm9dOworICAgICAgICAgICAgICAgIGlmICghKHBfcGktPnByZWNubyA8IChsX2JhbmQtPnByZWNpbmN0c19kYXRhX3NpemUgLyBzaXplb2YoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3ByZWNpbmN0X3QpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIkludmFsaWQgcHJlY2luY3RcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICAgICAgICAgIH0KIAorCisgICAgICAgICAgICAgICAgb3BqX3RndF9yZXNldChsX3ByYy0+aW5jbHRyZWUpOworICAgICAgICAgICAgICAgIG9wal90Z3RfcmVzZXQobF9wcmMtPmltc2J0cmVlKTsKKyAgICAgICAgICAgICAgICBsX2NibGsgPSBsX3ByYy0+Y2Jsa3MuZGVjOworCiAgICAgICAgICAgICAgICAgbF9uYl9jb2RlX2Jsb2NrcyA9IGxfcHJjLT5jdyAqIGxfcHJjLT5jaDsKLSAgICAgICAgICAgICAgICBsX2NibGsgPSBsX3ByYy0+Y2Jsa3MuZGVjOwotICAgICAgICAgICAgICAgIGZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgbF9uYl9jb2RlX2Jsb2NrczsgY2Jsa25vKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbF9pbmNsdWRlZCxsX2luY3JlbWVudCwgbF9zZWdubzsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBuOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBjYmxrIG5vdCB5ZXQgaW5jbHVkZWQgYmVmb3JlIC0tPiBpbmNsdXNpb24gdGFndHJlZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsX2NibGstPm51bXNlZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9pbmNsdWRlZCA9IG9wal90Z3RfZGVjb2RlKGxfYmlvLCBsX3ByYy0+aW5jbHRyZWUsIGNibGtubywgKE9QSl9JTlQzMikocF9waS0+bGF5bm8gKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsc2Ugb25lIGJpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW5jbHVkZWQgPSBvcGpfYmlvX3JlYWQobF9iaW8sIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBjYmxrIG5vdCBpbmNsdWRlZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsX2luY2x1ZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+bnVtbmV3cGFzc2VzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX2NibGs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpBU19GUFJJTlRGKHN0ZGVyciwgImluY2x1ZGVkPSVkIFxuIiwgbF9pbmNsdWRlZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBjYmxrIG5vdCB5ZXQgaW5jbHVkZWQgLS0+IHplcm8tYml0cGxhbmUgdGFndHJlZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsX2NibGstPm51bXNlZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBpID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIW9wal90Z3RfZGVjb2RlKGxfYmlvLCBsX3ByYy0+aW1zYnRyZWUsIGNibGtubywgKE9QSl9JTlQzMilpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+bnVtYnBzID0gKE9QSl9VSU5UMzIpbF9iYW5kLT5udW1icHMgKyAxIC0gaTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5udW1sZW5iaXRzID0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGluZyBwYXNzZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+bnVtbmV3cGFzc2VzID0gb3BqX3QyX2dldG51bXBhc3NlcyhsX2Jpbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX2luY3JlbWVudCA9IG9wal90Ml9nZXRjb21tYWNvZGUobF9iaW8pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggaW5kaWNhdG9yIGluY3JlbWVudCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5udW1sZW5iaXRzICs9IGxfaW5jcmVtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgbF9zZWdubyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbF9jYmxrLT5udW1zZWdzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal90Ml9pbml0X3NlZyhsX2NibGssIGxfc2Vnbm8sIHBfdGNwLT50Y2Nwc1twX3BpLT5jb21wbm9dLmNibGtzdHksIDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2Jpb19kZXN0cm95KGxfYmlvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zZWdubyA9IGxfY2Jsay0+bnVtc2VncyAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2NibGstPnNlZ3NbbF9zZWdub10ubnVtcGFzc2VzID09IGxfY2Jsay0+c2Vnc1tsX3NlZ25vXS5tYXhwYXNzZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfc2Vnbm87Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3QyX2luaXRfc2VnKGxfY2JsaywgbF9zZWdubywgcF90Y3AtPnRjY3BzW3BfcGktPmNvbXBub10uY2Jsa3N0eSwgMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9iaW9fZGVzdHJveShsX2Jpbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbiA9IChPUEpfSU5UMzIpbF9jYmxrLT5udW1uZXdwYXNzZXM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5zZWdzW2xfc2Vnbm9dLm51bW5ld3Bhc3NlcyA9IChPUEpfVUlOVDMyKW9wal9pbnRfbWluKChPUEpfSU5UMzIpKGxfY2Jsay0+c2Vnc1tsX3NlZ25vXS5tYXhwYXNzZXMgLSBsX2NibGstPnNlZ3NbbF9zZWdub10ubnVtcGFzc2VzKSwgbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+c2Vnc1tsX3NlZ25vXS5uZXdsZW4gPSBvcGpfYmlvX3JlYWQobF9iaW8sIGxfY2Jsay0+bnVtbGVuYml0cyArIG9wal91aW50X2Zsb29ybG9nMihsX2NibGstPnNlZ3NbbF9zZWdub10ubnVtbmV3cGFzc2VzKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFTX0ZQUklOVEYoc3RkZXJyLCAiaW5jbHVkZWQ9JWQgbnVtbmV3cGFzc2VzPSVkIGluY3JlbWVudD0lZCBsZW49JWQgXG4iLCBsX2luY2x1ZGVkLCBsX2NibGstPnNlZ3NbbF9zZWdub10ubnVtbmV3cGFzc2VzLCBsX2luY3JlbWVudCwgbF9jYmxrLT5zZWdzW2xfc2Vnbm9dLm5ld2xlbiApOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gLT0gKE9QSl9JTlQzMilsX2NibGstPnNlZ3NbbF9zZWdub10ubnVtbmV3cGFzc2VzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfc2Vnbm87Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfdDJfaW5pdF9zZWcobF9jYmxrLCBsX3NlZ25vLCBwX3RjcC0+dGNjcHNbcF9waS0+Y29tcG5vXS5jYmxrc3R5LCAwKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2Jpb19kZXN0cm95KGxfYmlvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChuID4gMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICsrbF9jYmxrOworICAgICAgICAgICAgICAgIGZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgbF9uYl9jb2RlX2Jsb2NrczsgKytjYmxrbm8pIHsKKyAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5udW1zZWdzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5yZWFsX251bV9zZWdzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgKytsX2NibGs7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgKytsX2JhbmQ7CisgICAgICAgICAgICArK2xfYmFuZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNPUCBtYXJrZXJzICovCisKKyAgICBpZiAocF90Y3AtPmNzdHkgJiBKMktfQ1BfQ1NUWV9TT1ApIHsKKyAgICAgICAgaWYgKHBfbWF4X2xlbmd0aCA8IDYpIHsKKyAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBlbm91Z2ggc3BhY2UgZm9yIGV4cGVjdGVkIFNPUCBtYXJrZXJcbiIpOworICAgICAgICB9IGVsc2UgaWYgKCgqbF9jdXJyZW50X2RhdGEpICE9IDB4ZmYgfHwgKCoobF9jdXJyZW50X2RhdGEgKyAxKSAhPSAweDkxKSkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiRXhwZWN0ZWQgU09QIG1hcmtlclxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSA2OwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFvcGpfYmlvX2luYWxpZ24obF9iaW8pKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2Jpb19kZXN0cm95KGxfYmlvKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgICAgIC8qKiBUT0RPIDogY2hlY2sgdGhlIE5zb3AgdmFsdWUgKi8KKyAgICB9CiAKKyAgICAvKgorICAgIFdoZW4gdGhlIG1hcmtlciBQUFQvUFBNIGlzIHVzZWQgdGhlIHBhY2tldCBoZWFkZXIgYXJlIHN0b3JlIGluIFBQVC9QUE0gbWFya2VyCisgICAgVGhpcyBwYXJ0IGRlYWwgd2l0aCB0aGlzIGNhcmFjdGVyaXN0aWMKKyAgICBzdGVwIDE6IFJlYWQgcGFja2V0IGhlYWRlciBpbiB0aGUgc2F2ZWQgc3RydWN0dXJlCisgICAgc3RlcCAyOiBSZXR1cm4gdG8gY29kZXN0cmVhbSBmb3IgZGVjb2RpbmcKKyAgICAqLworCisgICAgbF9iaW8gPSBvcGpfYmlvX2NyZWF0ZSgpOworICAgIGlmICghIGxfYmlvKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgaWYgKGxfY3AtPnBwbSA9PSAxKSB7IC8qIFBQTSAqLworICAgICAgICBsX2hlYWRlcl9kYXRhX3N0YXJ0ID0gJmxfY3AtPnBwbV9kYXRhOworICAgICAgICBsX2hlYWRlcl9kYXRhID0gKmxfaGVhZGVyX2RhdGFfc3RhcnQ7CisgICAgICAgIGxfbW9kaWZpZWRfbGVuZ3RoX3B0ciA9ICYobF9jcC0+cHBtX2xlbik7CisKKyAgICB9IGVsc2UgaWYgKHBfdGNwLT5wcHQgPT0gMSkgeyAvKiBQUFQgKi8KKyAgICAgICAgbF9oZWFkZXJfZGF0YV9zdGFydCA9ICYocF90Y3AtPnBwdF9kYXRhKTsKKyAgICAgICAgbF9oZWFkZXJfZGF0YSA9ICpsX2hlYWRlcl9kYXRhX3N0YXJ0OworICAgICAgICBsX21vZGlmaWVkX2xlbmd0aF9wdHIgPSAmKHBfdGNwLT5wcHRfbGVuKTsKKyAgICB9IGVsc2UgeyAvKiBOb3JtYWwgQ2FzZSAqLworICAgICAgICBsX2hlYWRlcl9kYXRhX3N0YXJ0ID0gJihsX2N1cnJlbnRfZGF0YSk7CisgICAgICAgIGxfaGVhZGVyX2RhdGEgPSAqbF9oZWFkZXJfZGF0YV9zdGFydDsKKyAgICAgICAgbF9yZW1haW5pbmdfbGVuZ3RoID0gKE9QSl9VSU5UMzIpKHBfc3JjX2RhdGEgKyBwX21heF9sZW5ndGggLSBsX2hlYWRlcl9kYXRhKTsKKyAgICAgICAgbF9tb2RpZmllZF9sZW5ndGhfcHRyID0gJihsX3JlbWFpbmluZ19sZW5ndGgpOworICAgIH0KKworICAgIG9wal9iaW9faW5pdF9kZWMobF9iaW8sIGxfaGVhZGVyX2RhdGEsICpsX21vZGlmaWVkX2xlbmd0aF9wdHIpOworCisgICAgbF9wcmVzZW50ID0gb3BqX2Jpb19yZWFkKGxfYmlvLCAxKTsKKyAgICBKQVNfRlBSSU5URihzdGRlcnIsICJwcmVzZW50PSVkIFxuIiwgbF9wcmVzZW50KTsKKyAgICBpZiAoIWxfcHJlc2VudCkgeworICAgICAgICAvKiBUT0RPIE1TRDogbm8gdGVzdCB0byBjb250cm9sIHRoZSBvdXRwdXQgb2YgdGhpcyBmdW5jdGlvbiovCisgICAgICAgIG9wal9iaW9faW5hbGlnbihsX2Jpbyk7CiAgICAgICAgIGxfaGVhZGVyX2RhdGEgKz0gb3BqX2Jpb19udW1ieXRlcyhsX2Jpbyk7CiAgICAgICAgIG9wal9iaW9fZGVzdHJveShsX2Jpbyk7CiAKICAgICAgICAgLyogRVBIIG1hcmtlcnMgKi8KICAgICAgICAgaWYgKHBfdGNwLT5jc3R5ICYgSjJLX0NQX0NTVFlfRVBIKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCgqbF9tb2RpZmllZF9sZW5ndGhfcHRyIC0gKE9QSl9VSU5UMzIpKGxfaGVhZGVyX2RhdGEgLSAqbF9oZWFkZXJfZGF0YV9zdGFydCkpIDwgMlUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIk5vdCBlbm91Z2ggc3BhY2UgZm9yIGV4cGVjdGVkIEVQSCBtYXJrZXJcbiIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKCpsX2hlYWRlcl9kYXRhKSAhPSAweGZmIHx8ICgqKGxfaGVhZGVyX2RhdGEgKyAxKSAhPSAweDkyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiRXhwZWN0ZWQgRVBIIG1hcmtlclxuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfaGVhZGVyX2RhdGEgKz0gMjsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKCpsX21vZGlmaWVkX2xlbmd0aF9wdHIgLSAoT1BKX1VJTlQzMikobF9oZWFkZXJfZGF0YSAtCisgICAgICAgICAgICAgICAgICAgICpsX2hlYWRlcl9kYXRhX3N0YXJ0KSkgPCAyVSkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIHNwYWNlIGZvciBleHBlY3RlZCBFUEggbWFya2VyXG4iKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKCpsX2hlYWRlcl9kYXRhKSAhPSAweGZmIHx8ICgqKGxfaGVhZGVyX2RhdGEgKyAxKSAhPSAweDkyKSkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywgIkV4cGVjdGVkIEVQSCBtYXJrZXJcbiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsX2hlYWRlcl9kYXRhICs9IDI7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBsX2hlYWRlcl9sZW5ndGggPSAoT1BKX1VJTlQzMikobF9oZWFkZXJfZGF0YSAtICpsX2hlYWRlcl9kYXRhX3N0YXJ0KTsKLSAgICAgICAgSkFTX0ZQUklOVEYoIHN0ZGVyciwgImhkcmxlbj0lZCBcbiIsIGxfaGVhZGVyX2xlbmd0aCApOwotICAgICAgICBKQVNfRlBSSU5URiggc3RkZXJyLCAicGFja2V0IGJvZHlcbiIpOwogICAgICAgICAqbF9tb2RpZmllZF9sZW5ndGhfcHRyIC09IGxfaGVhZGVyX2xlbmd0aDsKICAgICAgICAgKmxfaGVhZGVyX2RhdGFfc3RhcnQgKz0gbF9oZWFkZXJfbGVuZ3RoOwogCiAgICAgICAgIC8qIDw8IElOREVYICovCiAgICAgICAgIC8qIEVuZCBvZiBwYWNrZXQgaGVhZGVyIHBvc2l0aW9uLiBDdXJyZW50bHkgb25seSByZXByZXNlbnRzIHRoZSBkaXN0YW5jZSB0byBzdGFydCBvZiBwYWNrZXQKLSAgICAgICAgIFdpbGwgYmUgdXBkYXRlZCBsYXRlciBieSBpbmNyZW1lbnRpbmcgd2l0aCBwYWNrZXQgc3RhcnQgdmFsdWUgKi8KKyAgICAgICAgICAgV2lsbCBiZSB1cGRhdGVkIGxhdGVyIGJ5IGluY3JlbWVudGluZyB3aXRoIHBhY2tldCBzdGFydCB2YWx1ZSAqLwogICAgICAgICBpZiAocF9wYWNrX2luZm8pIHsKLSAgICAgICAgICAgICAgICBwX3BhY2tfaW5mby0+ZW5kX3BoX3BvcyA9IChPUEpfSU5UMzIpKGxfY3VycmVudF9kYXRhIC0gcF9zcmNfZGF0YSk7CisgICAgICAgICAgICBwX3BhY2tfaW5mby0+ZW5kX3BoX3BvcyA9IChPUEpfSU5UMzIpKGxfY3VycmVudF9kYXRhIC0gcF9zcmNfZGF0YSk7CiAgICAgICAgIH0KICAgICAgICAgLyogSU5ERVggPj4gKi8KIAotICAgICAgICAqcF9pc19kYXRhX3ByZXNlbnQgPSBPUEpfVFJVRTsKKyAgICAgICAgKiBwX2lzX2RhdGFfcHJlc2VudCA9IE9QSl9GQUxTRTsKICAgICAgICAgKnBfZGF0YV9yZWFkID0gKE9QSl9VSU5UMzIpKGxfY3VycmVudF9kYXRhIC0gcF9zcmNfZGF0YSk7Ci0KICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQorICAgIH0KIAotc3RhdGljIE9QSl9CT09MIG9wal90Ml9yZWFkX3BhY2tldF9kYXRhKCAgIG9wal90Ml90KiBwX3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlX3QgKnBfdGlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9waV9pdGVyYXRvcl90ICpwX3BpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKnBfc3JjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9wYWNrZXRfaW5mb190ICpwYWNrX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QqIHBfbWFuYWdlcikKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBiYW5kbm8sIGNibGtubzsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX2NvZGVfYmxvY2tzOwotICAgICAgICBPUEpfQllURSAqbF9jdXJyZW50X2RhdGEgPSBwX3NyY19kYXRhOwotICAgICAgICBvcGpfdGNkX2JhbmRfdCAqbF9iYW5kID0gMDA7Ci0gICAgICAgIG9wal90Y2RfY2Jsa19kZWNfdCogbF9jYmxrID0gMDA7Ci0gICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiBsX3JlcyA9ICZwX3RpbGUtPmNvbXBzW3BfcGktPmNvbXBub10ucmVzb2x1dGlvbnNbcF9waS0+cmVzbm9dOworICAgIGxfYmFuZCA9IGxfcmVzLT5iYW5kczsKKyAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IGxfcmVzLT5udW1iYW5kczsgKytiYW5kbm8sICsrbF9iYW5kKSB7CisgICAgICAgIG9wal90Y2RfcHJlY2luY3RfdCAqbF9wcmMgPSAmKGxfYmFuZC0+cHJlY2luY3RzW3BfcGktPnByZWNub10pOwogCi0gICAgICAgIE9QSl9BUkdfTk9UX1VTRUQocF90Mik7Ci0gICAgICAgIE9QSl9BUkdfTk9UX1VTRUQocGFja19pbmZvKTsKLQotICAgICAgICBsX2JhbmQgPSBsX3Jlcy0+YmFuZHM7Ci0gICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgbF9yZXMtPm51bWJhbmRzOyArK2JhbmRubykgewotICAgICAgICAgICAgICAgIG9wal90Y2RfcHJlY2luY3RfdCAqbF9wcmMgPSAmbF9iYW5kLT5wcmVjaW5jdHNbcF9waS0+cHJlY25vXTsKLQotICAgICAgICAgICAgICAgIGlmICgobF9iYW5kLT54MS1sX2JhbmQtPngwID09IDApfHwobF9iYW5kLT55MS1sX2JhbmQtPnkwID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICArK2xfYmFuZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxfbmJfY29kZV9ibG9ja3MgPSBsX3ByYy0+Y3cgKiBsX3ByYy0+Y2g7Ci0gICAgICAgICAgICAgICAgbF9jYmxrID0gbF9wcmMtPmNibGtzLmRlYzsKLQotICAgICAgICAgICAgICAgIGZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgbF9uYl9jb2RlX2Jsb2NrczsgKytjYmxrbm8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2Rfc2VnX3QgKmxfc2VnID0gMDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbF9jYmxrLT5udW1uZXdwYXNzZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbm90aGluZyB0byBkbyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfY2JsazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbF9jYmxrLT5udW1zZWdzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnID0gbF9jYmxrLT5zZWdzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfY2Jsay0+bnVtc2VnczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5kYXRhX2N1cnJlbnRfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zZWcgPSAmbF9jYmxrLT5zZWdzW2xfY2Jsay0+bnVtc2VncyAtIDFdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX3NlZy0+bnVtcGFzc2VzID09IGxfc2VnLT5tYXhwYXNzZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfc2VnOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9jYmxrLT5udW1zZWdzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgcG9zc2libGUgb3ZlcmZsb3cgKG9uIGxfY3VycmVudF9kYXRhIG9ubHksIGFzc3VtZXMgaW5wdXQgYXJncyBhbHJlYWR5IGNoZWNrZWQpIHRoZW4gc2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCgoT1BKX1NJWkVfVClsX2N1cnJlbnRfZGF0YSArIChPUEpfU0laRV9UKWxfc2VnLT5uZXdsZW4pIDwgKE9QSl9TSVpFX1QpbF9jdXJyZW50X2RhdGEpIHx8IChsX2N1cnJlbnRfZGF0YSArIGxfc2VnLT5uZXdsZW4gPiBwX3NyY19kYXRhICsgcF9tYXhfbGVuZ3RoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJyZWFkOiBzZWdtZW50IHRvbyBsb25nICglZCkgd2l0aCBtYXggKCVkKSBmb3IgY29kZWJsb2NrICVkIChwPSVkLCBiPSVkLCByPSVkLCBjPSVkKVxuIiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCWxfc2VnLT5uZXdsZW4sIHBfbWF4X2xlbmd0aCwgY2Jsa25vLCBwX3BpLT5wcmVjbm8sIGJhbmRubywgcF9waS0+cmVzbm8sIHBfcGktPmNvbXBubyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0jaWZkZWYgVVNFX0pQV0wKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIG5lZWQgaGVyZSBhIGoyayBoYW5kbGUgdG8gdmVyaWZ5IGlmIG1ha2luZyBhIGNoZWNrIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmFsaWRpdHkgb2YgY2Jsb2NrcyBwYXJhbWV0ZXJzIGlzIHNlbGVjdGVkIGZyb20gdXNlciAoLVcpICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGV0J3MgY2hlY2sgdGhhdCB3ZSBhcmUgbm90IGV4Y2VlZGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGxfY2Jsay0+bGVuICsgbF9zZWctPm5ld2xlbikgPiA4MTkyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQV0w6IHNlZ21lbnQgdG9vIGxvbmcgKCVkKSBmb3IgY29kZWJsb2NrICVkIChwPSVkLCBiPSVkLCByPSVkLCBjPSVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnLT5uZXdsZW4sIGNibGtubywgcF9waS0+cHJlY25vLCBiYW5kbm8sIHBfcGktPnJlc25vLCBwX3BpLT5jb21wbm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSlBXTF9BU1NVTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJKUFdMOiBnaXZpbmcgdXBcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zZWctPm5ld2xlbiA9IDgxOTIgLSBsX2NibGstPmxlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX1dBUk5JTkcsICIgICAgICAtIHRydW5jYXRpbmcgc2VnbWVudCB0byAlZFxuIiwgbF9zZWctPm5ld2xlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLSNlbmRpZiAvKiBVU0VfSlBXTCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBwb3NzaWJsZSBvdmVyZmxvdyBvbiBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobF9jYmxrLT5kYXRhX2N1cnJlbnRfc2l6ZSArIGxfc2VnLT5uZXdsZW4pIDwgbF9jYmxrLT5kYXRhX2N1cnJlbnRfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJyZWFkOiBzZWdtZW50IHRvbyBsb25nICglZCkgd2l0aCBjdXJyZW50IHNpemUgKCVkID4gJWQpIGZvciBjb2RlYmxvY2sgJWQgKHA9JWQsIGI9JWQsIHI9JWQsIGM9JWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zZWctPm5ld2xlbiwgbF9jYmxrLT5kYXRhX2N1cnJlbnRfc2l6ZSwgMHhGRkZGRkZGRiAtIGxfc2VnLT5uZXdsZW4sIGNibGtubywgcF9waS0+cHJlY25vLCBiYW5kbm8sIHBfcGktPnJlc25vLCBwX3BpLT5jb21wbm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGNibGstPmRhdGEgaGF2ZSBhbGxvY2F0ZWQgZW5vdWdoIG1lbW9yeSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGxfY2Jsay0+ZGF0YV9jdXJyZW50X3NpemUgKyBsX3NlZy0+bmV3bGVuKSA+IGxfY2Jsay0+ZGF0YV9tYXhfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUqIG5ld19jYmxrX2RhdGEgPSAoT1BKX0JZVEUqKSBvcGpfcmVhbGxvYyhsX2NibGstPmRhdGEsIGxfY2Jsay0+ZGF0YV9jdXJyZW50X3NpemUgKyBsX3NlZy0+bmV3bGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEgbmV3X2NibGtfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY2Jsay0+ZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5kYXRhID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NibGstPmRhdGFfbWF4X3NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWFsbG9jIGNvZGUgYmxvY2sgY2F0YSFcbiIpOyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NibGstPmRhdGFfbWF4X3NpemUgPSBsX2NibGstPmRhdGFfY3VycmVudF9zaXplICsgbF9zZWctPm5ld2xlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+ZGF0YSA9IG5ld19jYmxrX2RhdGE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGxfY2Jsay0+ZGF0YSArIGxfY2Jsay0+ZGF0YV9jdXJyZW50X3NpemUsIGxfY3VycmVudF9kYXRhLCBsX3NlZy0+bmV3bGVuKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9zZWctPm51bXBhc3NlcyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zZWctPmRhdGEgPSAmbF9jYmxrLT5kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnLT5kYXRhaW5kZXggPSBsX2NibGstPmRhdGFfY3VycmVudF9zaXplOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X2RhdGEgKz0gbF9zZWctPm5ld2xlbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zZWctPm51bXBhc3NlcyArPSBsX3NlZy0+bnVtbmV3cGFzc2VzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NibGstPm51bW5ld3Bhc3NlcyAtPSBsX3NlZy0+bnVtbmV3cGFzc2VzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnLT5yZWFsX251bV9wYXNzZXMgPSBsX3NlZy0+bnVtcGFzc2VzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NibGstPmRhdGFfY3VycmVudF9zaXplICs9IGxfc2VnLT5uZXdsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnLT5sZW4gKz0gbF9zZWctPm5ld2xlbjsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jYmxrLT5udW1uZXdwYXNzZXMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX3NlZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfY2Jsay0+bnVtc2VnczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAobF9jYmxrLT5udW1uZXdwYXNzZXMgPiAwKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgbF9jYmxrLT5yZWFsX251bV9zZWdzID0gbF9jYmxrLT5udW1zZWdzOwotICAgICAgICAgICAgICAgICAgICAgICAgKytsX2NibGs7Ci0gICAgICAgICAgICAgICAgfSAvKiBuZXh0IGNvZGVfYmxvY2sgKi8KLQotICAgICAgICAgICAgICAgICsrbF9iYW5kOworICAgICAgICBpZiAob3BqX3RjZF9pc19iYW5kX2VtcHR5KGxfYmFuZCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgKihwX2RhdGFfcmVhZCkgPSAoT1BKX1VJTlQzMikobF9jdXJyZW50X2RhdGEgLSBwX3NyY19kYXRhKTsKKyAgICAgICAgbF9uYl9jb2RlX2Jsb2NrcyA9IGxfcHJjLT5jdyAqIGxfcHJjLT5jaDsKKyAgICAgICAgbF9jYmxrID0gbF9wcmMtPmNibGtzLmRlYzsKKyAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBsX25iX2NvZGVfYmxvY2tzOyBjYmxrbm8rKykgeworICAgICAgICAgICAgT1BKX1VJTlQzMiBsX2luY2x1ZGVkLCBsX2luY3JlbWVudCwgbF9zZWdubzsKKyAgICAgICAgICAgIE9QSl9JTlQzMiBuOwogCisgICAgICAgICAgICAvKiBpZiBjYmxrIG5vdCB5ZXQgaW5jbHVkZWQgYmVmb3JlIC0tPiBpbmNsdXNpb24gdGFndHJlZSAqLworICAgICAgICAgICAgaWYgKCFsX2NibGstPm51bXNlZ3MpIHsKKyAgICAgICAgICAgICAgICBsX2luY2x1ZGVkID0gb3BqX3RndF9kZWNvZGUobF9iaW8sIGxfcHJjLT5pbmNsdHJlZSwgY2Jsa25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKShwX3BpLT5sYXlubyArIDEpKTsKKyAgICAgICAgICAgICAgICAvKiBlbHNlIG9uZSBiaXQgKi8KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbF9pbmNsdWRlZCA9IG9wal9iaW9fcmVhZChsX2JpbywgMSk7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQorICAgICAgICAgICAgLyogaWYgY2JsayBub3QgaW5jbHVkZWQgKi8KKyAgICAgICAgICAgIGlmICghbF9pbmNsdWRlZCkgeworICAgICAgICAgICAgICAgIGxfY2Jsay0+bnVtbmV3cGFzc2VzID0gMDsKKyAgICAgICAgICAgICAgICArK2xfY2JsazsKKyAgICAgICAgICAgICAgICBKQVNfRlBSSU5URihzdGRlcnIsICJpbmNsdWRlZD0lZCBcbiIsIGxfaW5jbHVkZWQpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3QyX3NraXBfcGFja2V0X2RhdGEoICAgb3BqX3QyX3QqIHBfdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqcF90aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKnBfcGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9wYWNrZXRfaW5mb190ICpwYWNrX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcikKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBiYW5kbm8sIGNibGtubzsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX2NvZGVfYmxvY2tzOwotICAgICAgICBvcGpfdGNkX2JhbmRfdCAqbF9iYW5kID0gMDA7Ci0gICAgICAgIG9wal90Y2RfY2Jsa19kZWNfdCogbF9jYmxrID0gMDA7Ci0gICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiBsX3JlcyA9ICZwX3RpbGUtPmNvbXBzW3BfcGktPmNvbXBub10ucmVzb2x1dGlvbnNbcF9waS0+cmVzbm9dOworICAgICAgICAgICAgLyogaWYgY2JsayBub3QgeWV0IGluY2x1ZGVkIC0tPiB6ZXJvLWJpdHBsYW5lIHRhZ3RyZWUgKi8KKyAgICAgICAgICAgIGlmICghbF9jYmxrLT5udW1zZWdzKSB7CisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBpID0gMDsKIAotICAgICAgICBPUEpfQVJHX05PVF9VU0VEKHBfdDIpOwotICAgICAgICBPUEpfQVJHX05PVF9VU0VEKHBhY2tfaW5mbyk7Ci0KLSAgICAgICAgKnBfZGF0YV9yZWFkID0gMDsKLSAgICAgICAgbF9iYW5kID0gbF9yZXMtPmJhbmRzOwotCi0gICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgbF9yZXMtPm51bWJhbmRzOyArK2JhbmRubykgewotICAgICAgICAgICAgICAgIG9wal90Y2RfcHJlY2luY3RfdCAqbF9wcmMgPSAmbF9iYW5kLT5wcmVjaW5jdHNbcF9waS0+cHJlY25vXTsKLQotICAgICAgICAgICAgICAgIGlmICgobF9iYW5kLT54MS1sX2JhbmQtPngwID09IDApfHwobF9iYW5kLT55MS1sX2JhbmQtPnkwID09IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICArK2xfYmFuZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIHdoaWxlICghb3BqX3RndF9kZWNvZGUobF9iaW8sIGxfcHJjLT5pbXNidHJlZSwgY2Jsa25vLCAoT1BKX0lOVDMyKWkpKSB7CisgICAgICAgICAgICAgICAgICAgICsraTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBsX25iX2NvZGVfYmxvY2tzID0gbF9wcmMtPmN3ICogbF9wcmMtPmNoOwotICAgICAgICAgICAgICAgIGxfY2JsayA9IGxfcHJjLT5jYmxrcy5kZWM7CisgICAgICAgICAgICAgICAgbF9jYmxrLT5udW1icHMgPSAoT1BKX1VJTlQzMilsX2JhbmQtPm51bWJwcyArIDEgLSBpOworICAgICAgICAgICAgICAgIGxfY2Jsay0+bnVtbGVuYml0cyA9IDM7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IGxfbmJfY29kZV9ibG9ja3M7ICsrY2Jsa25vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3NlZ190ICpsX3NlZyA9IDAwOworICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGluZyBwYXNzZXMgKi8KKyAgICAgICAgICAgIGxfY2Jsay0+bnVtbmV3cGFzc2VzID0gb3BqX3QyX2dldG51bXBhc3NlcyhsX2Jpbyk7CisgICAgICAgICAgICBsX2luY3JlbWVudCA9IG9wal90Ml9nZXRjb21tYWNvZGUobF9iaW8pOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxfY2Jsay0+bnVtbmV3cGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX2NibGs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogbGVuZ3RoIGluZGljYXRvciBpbmNyZW1lbnQgKi8KKyAgICAgICAgICAgIGxfY2Jsay0+bnVtbGVuYml0cyArPSBsX2luY3JlbWVudDsKKyAgICAgICAgICAgIGxfc2Vnbm8gPSAwOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxfY2Jsay0+bnVtc2VncykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NlZyA9IGxfY2Jsay0+c2VnczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX2NibGstPm51bXNlZ3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+ZGF0YV9jdXJyZW50X3NpemUgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnID0gJmxfY2Jsay0+c2Vnc1tsX2NibGstPm51bXNlZ3MgLSAxXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9zZWctPm51bXBhc3NlcyA9PSBsX3NlZy0+bWF4cGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX3NlZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfY2Jsay0+bnVtc2VnczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIHBvc3NpYmxlIG92ZXJmbG93IHRoZW4gc2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKCgqcF9kYXRhX3JlYWQgKyBsX3NlZy0+bmV3bGVuKSA8ICgqcF9kYXRhX3JlYWQpKSB8fCAoKCpwX2RhdGFfcmVhZCArIGxfc2VnLT5uZXdsZW4pID4gcF9tYXhfbGVuZ3RoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJza2lwOiBzZWdtZW50IHRvbyBsb25nICglZCkgd2l0aCBtYXggKCVkKSBmb3IgY29kZWJsb2NrICVkIChwPSVkLCBiPSVkLCByPSVkLCBjPSVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnLT5uZXdsZW4sIHBfbWF4X2xlbmd0aCwgY2Jsa25vLCBwX3BpLT5wcmVjbm8sIGJhbmRubywgcF9waS0+cmVzbm8sIHBfcGktPmNvbXBubyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0jaWZkZWYgVVNFX0pQV0wKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdlIG5lZWQgaGVyZSBhIGoyayBoYW5kbGUgdG8gdmVyaWZ5IGlmIG1ha2luZyBhIGNoZWNrIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmFsaWRpdHkgb2YgY2Jsb2NrcyBwYXJhbWV0ZXJzIGlzIHNlbGVjdGVkIGZyb20gdXNlciAoLVcpICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGV0J3MgY2hlY2sgdGhhdCB3ZSBhcmUgbm90IGV4Y2VlZGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGxfY2Jsay0+bGVuICsgbF9zZWctPm5ld2xlbikgPiA4MTkyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkpQV0w6IHNlZ21lbnQgdG9vIGxvbmcgKCVkKSBmb3IgY29kZWJsb2NrICVkIChwPSVkLCBiPSVkLCByPSVkLCBjPSVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnLT5uZXdsZW4sIGNibGtubywgcF9waS0+cHJlY25vLCBiYW5kbm8sIHBfcGktPnJlc25vLCBwX3BpLT5jb21wbm8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghSlBXTF9BU1NVTUUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJKUFdMOiBnaXZpbmcgdXBcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC05OTk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnLT5uZXdsZW4gPSA4MTkyIC0gbF9jYmxrLT5sZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiICAgICAgLSB0cnVuY2F0aW5nIHNlZ21lbnQgdG8gJWRcbiIsIGxfc2VnLT5uZXdsZW4pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0jZW5kaWYgLyogVVNFX0pQV0wgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKQVNfRlBSSU5URihzdGRlcnIsICJwX2RhdGFfcmVhZCAoJWQpIG5ld2xlbiAoJWQpIFxuIiwgKnBfZGF0YV9yZWFkLCBsX3NlZy0+bmV3bGVuICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocF9kYXRhX3JlYWQpICs9IGxfc2VnLT5uZXdsZW47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zZWctPm51bXBhc3NlcyArPSBsX3NlZy0+bnVtbmV3cGFzc2VzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NibGstPm51bW5ld3Bhc3NlcyAtPSBsX3NlZy0+bnVtbmV3cGFzc2VzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jYmxrLT5udW1uZXdwYXNzZXMgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX3NlZzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfY2Jsay0+bnVtc2VnczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAobF9jYmxrLT5udW1uZXdwYXNzZXMgPiAwKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgKytsX2NibGs7CisgICAgICAgICAgICBpZiAoIWxfY2Jsay0+bnVtc2VncykgeworICAgICAgICAgICAgICAgIGlmICghIG9wal90Ml9pbml0X3NlZyhsX2NibGssIGxfc2Vnbm8sIHBfdGNwLT50Y2Nwc1twX3BpLT5jb21wbm9dLmNibGtzdHksIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIG9wal9iaW9fZGVzdHJveShsX2Jpbyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CiAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgKytsX2JhbmQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLQotT1BKX0JPT0wgb3BqX3QyX2luaXRfc2VnKCAgIG9wal90Y2RfY2Jsa19kZWNfdCogY2JsaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGluZGV4LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGNibGtzdHksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgZmlyc3QpCi17Ci0gICAgICAgIG9wal90Y2Rfc2VnX3QqIHNlZyA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfc2VncyA9IGluZGV4ICsgMTsKLQotICAgICAgICBpZiAobF9uYl9zZWdzID4gY2Jsay0+bV9jdXJyZW50X21heF9zZWdzKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3RjZF9zZWdfdCogbmV3X3NlZ3M7Ci0gICAgICAgICAgICAgICAgY2Jsay0+bV9jdXJyZW50X21heF9zZWdzICs9IE9QSl9KMktfREVGQVVMVF9OQl9TRUdTOwotCi0gICAgICAgICAgICAgICAgbmV3X3NlZ3MgPSAob3BqX3RjZF9zZWdfdCopIG9wal9yZWFsbG9jKGNibGstPnNlZ3MsIGNibGstPm1fY3VycmVudF9tYXhfc2VncyAqIHNpemVvZihvcGpfdGNkX3NlZ190KSk7Ci0gICAgICAgICAgICAgICAgaWYoISBuZXdfc2VncykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUoY2Jsay0+c2Vncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT5zZWdzID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPm1fY3VycmVudF9tYXhfc2VncyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gaW5pdGlhbGl6ZSBzZWdtZW50ICVkXG4iLCBsX25iX3NlZ3MpOyAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsX3NlZ25vID0gbF9jYmxrLT5udW1zZWdzIC0gMTsKKyAgICAgICAgICAgICAgICBpZiAobF9jYmxrLT5zZWdzW2xfc2Vnbm9dLm51bXBhc3NlcyA9PSBsX2NibGstPnNlZ3NbbF9zZWdub10ubWF4cGFzc2VzKSB7CisgICAgICAgICAgICAgICAgICAgICsrbF9zZWdubzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3QyX2luaXRfc2VnKGxfY2JsaywgbF9zZWdubywgcF90Y3AtPnRjY3BzW3BfcGktPmNvbXBub10uY2Jsa3N0eSwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9iaW9fZGVzdHJveShsX2Jpbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNibGstPnNlZ3MgPSBuZXdfc2VnczsKLSAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbiA9IChPUEpfSU5UMzIpbF9jYmxrLT5udW1uZXdwYXNzZXM7CiAKLSAgICAgICAgc2VnID0gJmNibGstPnNlZ3NbaW5kZXhdOwotICAgICAgICBtZW1zZXQoc2VnLDAsc2l6ZW9mKG9wal90Y2Rfc2VnX3QpKTsKLQotICAgICAgICBpZiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9URVJNQUxMKSB7Ci0gICAgICAgICAgICAgICAgc2VnLT5tYXhwYXNzZXMgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNibGtzdHkgJiBKMktfQ0NQX0NCTEtTVFlfTEFaWSkgewotICAgICAgICAgICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VnLT5tYXhwYXNzZXMgPSAxMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgc2VnLT5tYXhwYXNzZXMgPSAoKChzZWcgLSAxKS0+bWF4cGFzc2VzID09IDEpIHx8ICgoc2VnIC0gMSktPm1heHBhc3NlcyA9PSAxMCkpID8gMiA6IDE7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBiaXRfbnVtYmVyOworICAgICAgICAgICAgICAgIGxfY2Jsay0+c2Vnc1tsX3NlZ25vXS5udW1uZXdwYXNzZXMgPSAoT1BKX1VJTlQzMilvcGpfaW50X21pbigoT1BKX0lOVDMyKSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+c2Vnc1tsX3NlZ25vXS5tYXhwYXNzZXMgLSBsX2NibGstPnNlZ3NbbF9zZWdub10ubnVtcGFzc2VzKSwgbik7CisgICAgICAgICAgICAgICAgYml0X251bWJlciA9IGxfY2Jsay0+bnVtbGVuYml0cyArIG9wal91aW50X2Zsb29ybG9nMigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+c2Vnc1tsX3NlZ25vXS5udW1uZXdwYXNzZXMpOworICAgICAgICAgICAgICAgIGlmIChiaXRfbnVtYmVyID4gMzIpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBiaXQgbnVtYmVyICVkIGluIG9wal90Ml9yZWFkX3BhY2tldF9oZWFkZXIoKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRfbnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2Jpb19kZXN0cm95KGxfYmlvKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbF9jYmxrLT5zZWdzW2xfc2Vnbm9dLm5ld2xlbiA9IG9wal9iaW9fcmVhZChsX2JpbywgYml0X251bWJlcik7CisgICAgICAgICAgICAgICAgSkFTX0ZQUklOVEYoc3RkZXJyLCAiaW5jbHVkZWQ9JWQgbnVtbmV3cGFzc2VzPSVkIGluY3JlbWVudD0lZCBsZW49JWQgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW5jbHVkZWQsIGxfY2Jsay0+c2Vnc1tsX3NlZ25vXS5udW1uZXdwYXNzZXMsIGxfaW5jcmVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+c2Vnc1tsX3NlZ25vXS5uZXdsZW4pOworCisgICAgICAgICAgICAgICAgbiAtPSAoT1BKX0lOVDMyKWxfY2Jsay0+c2Vnc1tsX3NlZ25vXS5udW1uZXdwYXNzZXM7CisgICAgICAgICAgICAgICAgaWYgKG4gPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICsrbF9zZWdubzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfdDJfaW5pdF9zZWcobF9jYmxrLCBsX3NlZ25vLCBwX3RjcC0+dGNjcHNbcF9waS0+Y29tcG5vXS5jYmxrc3R5LCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2Jpb19kZXN0cm95KGxfYmlvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlIChuID4gMCk7CisKKyAgICAgICAgICAgICsrbF9jYmxrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFvcGpfYmlvX2luYWxpZ24obF9iaW8pKSB7CisgICAgICAgIG9wal9iaW9fZGVzdHJveShsX2Jpbyk7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgbF9oZWFkZXJfZGF0YSArPSBvcGpfYmlvX251bWJ5dGVzKGxfYmlvKTsKKyAgICBvcGpfYmlvX2Rlc3Ryb3kobF9iaW8pOworCisgICAgLyogRVBIIG1hcmtlcnMgKi8KKyAgICBpZiAocF90Y3AtPmNzdHkgJiBKMktfQ1BfQ1NUWV9FUEgpIHsKKyAgICAgICAgaWYgKCgqbF9tb2RpZmllZF9sZW5ndGhfcHRyIC0gKE9QSl9VSU5UMzIpKGxfaGVhZGVyX2RhdGEgLQorICAgICAgICAgICAgICAgICpsX2hlYWRlcl9kYXRhX3N0YXJ0KSkgPCAyVSkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IGVub3VnaCBzcGFjZSBmb3IgZXhwZWN0ZWQgRVBIIG1hcmtlclxuIik7CisgICAgICAgIH0gZWxzZSBpZiAoKCpsX2hlYWRlcl9kYXRhKSAhPSAweGZmIHx8ICgqKGxfaGVhZGVyX2RhdGEgKyAxKSAhPSAweDkyKSkgeworICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiRXhwZWN0ZWQgRVBIIG1hcmtlclxuIik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2VnLT5tYXhwYXNzZXMgPSAxMDk7CisgICAgICAgICAgICBsX2hlYWRlcl9kYXRhICs9IDI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsX2hlYWRlcl9sZW5ndGggPSAoT1BKX1VJTlQzMikobF9oZWFkZXJfZGF0YSAtICpsX2hlYWRlcl9kYXRhX3N0YXJ0KTsKKyAgICBKQVNfRlBSSU5URihzdGRlcnIsICJoZHJsZW49JWQgXG4iLCBsX2hlYWRlcl9sZW5ndGgpOworICAgIEpBU19GUFJJTlRGKHN0ZGVyciwgInBhY2tldCBib2R5XG4iKTsKKyAgICAqbF9tb2RpZmllZF9sZW5ndGhfcHRyIC09IGxfaGVhZGVyX2xlbmd0aDsKKyAgICAqbF9oZWFkZXJfZGF0YV9zdGFydCArPSBsX2hlYWRlcl9sZW5ndGg7CisKKyAgICAvKiA8PCBJTkRFWCAqLworICAgIC8qIEVuZCBvZiBwYWNrZXQgaGVhZGVyIHBvc2l0aW9uLiBDdXJyZW50bHkgb25seSByZXByZXNlbnRzIHRoZSBkaXN0YW5jZSB0byBzdGFydCBvZiBwYWNrZXQKKyAgICAgV2lsbCBiZSB1cGRhdGVkIGxhdGVyIGJ5IGluY3JlbWVudGluZyB3aXRoIHBhY2tldCBzdGFydCB2YWx1ZSAqLworICAgIGlmIChwX3BhY2tfaW5mbykgeworICAgICAgICBwX3BhY2tfaW5mby0+ZW5kX3BoX3BvcyA9IChPUEpfSU5UMzIpKGxfY3VycmVudF9kYXRhIC0gcF9zcmNfZGF0YSk7CisgICAgfQorICAgIC8qIElOREVYID4+ICovCisKKyAgICAqcF9pc19kYXRhX3ByZXNlbnQgPSBPUEpfVFJVRTsKKyAgICAqcF9kYXRhX3JlYWQgPSAoT1BKX1VJTlQzMikobF9jdXJyZW50X2RhdGEgLSBwX3NyY19kYXRhKTsKKworICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal90Ml9yZWFkX3BhY2tldF9kYXRhKG9wal90Ml90KiBwX3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICpwX3RpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3BpX2l0ZXJhdG9yX3QgKnBfcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKnBfc3JjX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9wYWNrZXRfaW5mb190ICpwYWNrX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90KiBwX21hbmFnZXIpCit7CisgICAgT1BKX1VJTlQzMiBiYW5kbm8sIGNibGtubzsKKyAgICBPUEpfVUlOVDMyIGxfbmJfY29kZV9ibG9ja3M7CisgICAgT1BKX0JZVEUgKmxfY3VycmVudF9kYXRhID0gcF9zcmNfZGF0YTsKKyAgICBvcGpfdGNkX2JhbmRfdCAqbF9iYW5kID0gMDA7CisgICAgb3BqX3RjZF9jYmxrX2RlY190KiBsX2NibGsgPSAwMDsKKyAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCogbF9yZXMgPQorICAgICAgICAmcF90aWxlLT5jb21wc1twX3BpLT5jb21wbm9dLnJlc29sdXRpb25zW3BfcGktPnJlc25vXTsKKworICAgIE9QSl9BUkdfTk9UX1VTRUQocF90Mik7CisgICAgT1BKX0FSR19OT1RfVVNFRChwYWNrX2luZm8pOworCisgICAgbF9iYW5kID0gbF9yZXMtPmJhbmRzOworICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgbF9yZXMtPm51bWJhbmRzOyArK2JhbmRubykgeworICAgICAgICBvcGpfdGNkX3ByZWNpbmN0X3QgKmxfcHJjID0gJmxfYmFuZC0+cHJlY2luY3RzW3BfcGktPnByZWNub107CisKKyAgICAgICAgaWYgKChsX2JhbmQtPngxIC0gbF9iYW5kLT54MCA9PSAwKSB8fCAobF9iYW5kLT55MSAtIGxfYmFuZC0+eTAgPT0gMCkpIHsKKyAgICAgICAgICAgICsrbF9iYW5kOworICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgIGxfbmJfY29kZV9ibG9ja3MgPSBsX3ByYy0+Y3cgKiBsX3ByYy0+Y2g7CisgICAgICAgIGxfY2JsayA9IGxfcHJjLT5jYmxrcy5kZWM7CisKKyAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBsX25iX2NvZGVfYmxvY2tzOyArK2NibGtubykgeworICAgICAgICAgICAgb3BqX3RjZF9zZWdfdCAqbF9zZWcgPSAwMDsKKworICAgICAgICAgICAgaWYgKCFsX2NibGstPm51bW5ld3Bhc3NlcykgeworICAgICAgICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAgICAgICAgICAgICArK2xfY2JsazsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFsX2NibGstPm51bXNlZ3MpIHsKKyAgICAgICAgICAgICAgICBsX3NlZyA9IGxfY2Jsay0+c2VnczsKKyAgICAgICAgICAgICAgICArK2xfY2Jsay0+bnVtc2VnczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbF9zZWcgPSAmbF9jYmxrLT5zZWdzW2xfY2Jsay0+bnVtc2VncyAtIDFdOworCisgICAgICAgICAgICAgICAgaWYgKGxfc2VnLT5udW1wYXNzZXMgPT0gbF9zZWctPm1heHBhc3NlcykgeworICAgICAgICAgICAgICAgICAgICArK2xfc2VnOworICAgICAgICAgICAgICAgICAgICArK2xfY2Jsay0+bnVtc2VnczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAvKiBDaGVjayBwb3NzaWJsZSBvdmVyZmxvdyAob24gbF9jdXJyZW50X2RhdGEgb25seSwgYXNzdW1lcyBpbnB1dCBhcmdzIGFscmVhZHkgY2hlY2tlZCkgdGhlbiBzaXplICovCisgICAgICAgICAgICAgICAgaWYgKCgoKE9QSl9TSVpFX1QpbF9jdXJyZW50X2RhdGEgKyAoT1BKX1NJWkVfVClsX3NlZy0+bmV3bGVuKSA8CisgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1NJWkVfVClsX2N1cnJlbnRfZGF0YSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsX2N1cnJlbnRfZGF0YSArIGxfc2VnLT5uZXdsZW4gPiBwX3NyY19kYXRhICsgcF9tYXhfbGVuZ3RoKSkgeworICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkOiBzZWdtZW50IHRvbyBsb25nICglZCkgd2l0aCBtYXggKCVkKSBmb3IgY29kZWJsb2NrICVkIChwPSVkLCBiPSVkLCByPSVkLCBjPSVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NlZy0+bmV3bGVuLCBwX21heF9sZW5ndGgsIGNibGtubywgcF9waS0+cHJlY25vLCBiYW5kbm8sIHBfcGktPnJlc25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcGktPmNvbXBubyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgVVNFX0pQV0wKKyAgICAgICAgICAgICAgICAvKiB3ZSBuZWVkIGhlcmUgYSBqMmsgaGFuZGxlIHRvIHZlcmlmeSBpZiBtYWtpbmcgYSBjaGVjayB0bworICAgICAgICAgICAgICAgIHRoZSB2YWxpZGl0eSBvZiBjYmxvY2tzIHBhcmFtZXRlcnMgaXMgc2VsZWN0ZWQgZnJvbSB1c2VyICgtVykgKi8KKworICAgICAgICAgICAgICAgIC8qIGxldCdzIGNoZWNrIHRoYXQgd2UgYXJlIG5vdCBleGNlZWRpbmcgKi8KKyAgICAgICAgICAgICAgICBpZiAoKGxfY2Jsay0+bGVuICsgbF9zZWctPm5ld2xlbikgPiA4MTkyKSB7CisgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSlBXTDogc2VnbWVudCB0b28gbG9uZyAoJWQpIGZvciBjb2RlYmxvY2sgJWQgKHA9JWQsIGI9JWQsIHI9JWQsIGM9JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnLT5uZXdsZW4sIGNibGtubywgcF9waS0+cHJlY25vLCBiYW5kbm8sIHBfcGktPnJlc25vLCBwX3BpLT5jb21wbm8pOworICAgICAgICAgICAgICAgICAgICBpZiAoIUpQV0xfQVNTVU1FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiSlBXTDogZ2l2aW5nIHVwXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbF9zZWctPm5ld2xlbiA9IDgxOTIgLSBsX2NibGstPmxlbjsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiICAgICAgLSB0cnVuY2F0aW5nIHNlZ21lbnQgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zZWctPm5ld2xlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH07CisKKyNlbmRpZiAvKiBVU0VfSlBXTCAqLworCisgICAgICAgICAgICAgICAgaWYgKGxfY2Jsay0+bnVtY2h1bmtzID09IGxfY2Jsay0+bnVtY2h1bmtzYWxsb2MpIHsKKyAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsX251bWNodW5rc2FsbG9jID0gbF9jYmxrLT5udW1jaHVua3NhbGxvYyAqIDIgKyAxOworICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3NlZ19kYXRhX2NodW5rX3QqIGxfY2h1bmtzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChvcGpfdGNkX3NlZ19kYXRhX2NodW5rX3QqKW9wal9yZWFsbG9jKGxfY2Jsay0+Y2h1bmtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX251bWNodW5rc2FsbG9jICogc2l6ZW9mKG9wal90Y2Rfc2VnX2RhdGFfY2h1bmtfdCkpOworICAgICAgICAgICAgICAgICAgICBpZiAobF9jaHVua3MgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBhbGxvY2F0ZSBvcGpfdGNkX3NlZ19kYXRhX2NodW5rX3QqIGFycmF5Iik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+Y2h1bmtzID0gbF9jaHVua3M7CisgICAgICAgICAgICAgICAgICAgIGxfY2Jsay0+bnVtY2h1bmtzYWxsb2MgPSBsX251bWNodW5rc2FsbG9jOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGxfY2Jsay0+Y2h1bmtzW2xfY2Jsay0+bnVtY2h1bmtzXS5kYXRhID0gbF9jdXJyZW50X2RhdGE7CisgICAgICAgICAgICAgICAgbF9jYmxrLT5jaHVua3NbbF9jYmxrLT5udW1jaHVua3NdLmxlbiA9IGxfc2VnLT5uZXdsZW47CisgICAgICAgICAgICAgICAgbF9jYmxrLT5udW1jaHVua3MgKys7CisKKyAgICAgICAgICAgICAgICBsX2N1cnJlbnRfZGF0YSArPSBsX3NlZy0+bmV3bGVuOworICAgICAgICAgICAgICAgIGxfc2VnLT5sZW4gKz0gbF9zZWctPm5ld2xlbjsKKyAgICAgICAgICAgICAgICBsX3NlZy0+bnVtcGFzc2VzICs9IGxfc2VnLT5udW1uZXdwYXNzZXM7CisgICAgICAgICAgICAgICAgbF9jYmxrLT5udW1uZXdwYXNzZXMgLT0gbF9zZWctPm51bW5ld3Bhc3NlczsKKworICAgICAgICAgICAgICAgIGxfc2VnLT5yZWFsX251bV9wYXNzZXMgPSBsX3NlZy0+bnVtcGFzc2VzOworCisgICAgICAgICAgICAgICAgaWYgKGxfY2Jsay0+bnVtbmV3cGFzc2VzID4gMCkgeworICAgICAgICAgICAgICAgICAgICArK2xfc2VnOworICAgICAgICAgICAgICAgICAgICArK2xfY2Jsay0+bnVtc2VnczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlIChsX2NibGstPm51bW5ld3Bhc3NlcyA+IDApOworCisgICAgICAgICAgICBsX2NibGstPnJlYWxfbnVtX3NlZ3MgPSBsX2NibGstPm51bXNlZ3M7CisgICAgICAgICAgICArK2xfY2JsazsKKyAgICAgICAgfSAvKiBuZXh0IGNvZGVfYmxvY2sgKi8KKworICAgICAgICArK2xfYmFuZDsKKyAgICB9CisKKyAgICAqKHBfZGF0YV9yZWFkKSA9IChPUEpfVUlOVDMyKShsX2N1cnJlbnRfZGF0YSAtIHBfc3JjX2RhdGEpOworCisKKyAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdDJfc2tpcF9wYWNrZXRfZGF0YShvcGpfdDJfdCogcF90MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqcF90aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9waV9pdGVyYXRvcl90ICpwX3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfcGFja2V0X2luZm9fdCAqcGFja19pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKQoreworICAgIE9QSl9VSU5UMzIgYmFuZG5vLCBjYmxrbm87CisgICAgT1BKX1VJTlQzMiBsX25iX2NvZGVfYmxvY2tzOworICAgIG9wal90Y2RfYmFuZF90ICpsX2JhbmQgPSAwMDsKKyAgICBvcGpfdGNkX2NibGtfZGVjX3QqIGxfY2JsayA9IDAwOworICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiBsX3JlcyA9CisgICAgICAgICZwX3RpbGUtPmNvbXBzW3BfcGktPmNvbXBub10ucmVzb2x1dGlvbnNbcF9waS0+cmVzbm9dOworCisgICAgT1BKX0FSR19OT1RfVVNFRChwX3QyKTsKKyAgICBPUEpfQVJHX05PVF9VU0VEKHBhY2tfaW5mbyk7CisKKyAgICAqcF9kYXRhX3JlYWQgPSAwOworICAgIGxfYmFuZCA9IGxfcmVzLT5iYW5kczsKKworICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgbF9yZXMtPm51bWJhbmRzOyArK2JhbmRubykgeworICAgICAgICBvcGpfdGNkX3ByZWNpbmN0X3QgKmxfcHJjID0gJmxfYmFuZC0+cHJlY2luY3RzW3BfcGktPnByZWNub107CisKKyAgICAgICAgaWYgKChsX2JhbmQtPngxIC0gbF9iYW5kLT54MCA9PSAwKSB8fCAobF9iYW5kLT55MSAtIGxfYmFuZC0+eTAgPT0gMCkpIHsKKyAgICAgICAgICAgICsrbF9iYW5kOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBsX25iX2NvZGVfYmxvY2tzID0gbF9wcmMtPmN3ICogbF9wcmMtPmNoOworICAgICAgICBsX2NibGsgPSBsX3ByYy0+Y2Jsa3MuZGVjOworCisgICAgICAgIGZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgbF9uYl9jb2RlX2Jsb2NrczsgKytjYmxrbm8pIHsKKyAgICAgICAgICAgIG9wal90Y2Rfc2VnX3QgKmxfc2VnID0gMDA7CisKKyAgICAgICAgICAgIGlmICghbF9jYmxrLT5udW1uZXdwYXNzZXMpIHsKKyAgICAgICAgICAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgICAgICAgICAgICAgKytsX2NibGs7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbF9jYmxrLT5udW1zZWdzKSB7CisgICAgICAgICAgICAgICAgbF9zZWcgPSBsX2NibGstPnNlZ3M7CisgICAgICAgICAgICAgICAgKytsX2NibGstPm51bXNlZ3M7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxfc2VnID0gJmxfY2Jsay0+c2Vnc1tsX2NibGstPm51bXNlZ3MgLSAxXTsKKworICAgICAgICAgICAgICAgIGlmIChsX3NlZy0+bnVtcGFzc2VzID09IGxfc2VnLT5tYXhwYXNzZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKytsX3NlZzsKKyAgICAgICAgICAgICAgICAgICAgKytsX2NibGstPm51bXNlZ3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgLyogQ2hlY2sgcG9zc2libGUgb3ZlcmZsb3cgdGhlbiBzaXplICovCisgICAgICAgICAgICAgICAgaWYgKCgoKnBfZGF0YV9yZWFkICsgbF9zZWctPm5ld2xlbikgPCAoKnBfZGF0YV9yZWFkKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICgoKnBfZGF0YV9yZWFkICsgbF9zZWctPm5ld2xlbikgPiBwX21heF9sZW5ndGgpKSB7CisgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNraXA6IHNlZ21lbnQgdG9vIGxvbmcgKCVkKSB3aXRoIG1heCAoJWQpIGZvciBjb2RlYmxvY2sgJWQgKHA9JWQsIGI9JWQsIHI9JWQsIGM9JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2VnLT5uZXdsZW4sIHBfbWF4X2xlbmd0aCwgY2Jsa25vLCBwX3BpLT5wcmVjbm8sIGJhbmRubywgcF9waS0+cmVzbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9waS0+Y29tcG5vKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisKKyNpZmRlZiBVU0VfSlBXTAorICAgICAgICAgICAgICAgIC8qIHdlIG5lZWQgaGVyZSBhIGoyayBoYW5kbGUgdG8gdmVyaWZ5IGlmIG1ha2luZyBhIGNoZWNrIHRvCisgICAgICAgICAgICAgICAgdGhlIHZhbGlkaXR5IG9mIGNibG9ja3MgcGFyYW1ldGVycyBpcyBzZWxlY3RlZCBmcm9tIHVzZXIgKC1XKSAqLworCisgICAgICAgICAgICAgICAgLyogbGV0J3MgY2hlY2sgdGhhdCB3ZSBhcmUgbm90IGV4Y2VlZGluZyAqLworICAgICAgICAgICAgICAgIGlmICgobF9jYmxrLT5sZW4gKyBsX3NlZy0+bmV3bGVuKSA+IDgxOTIpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKUFdMOiBzZWdtZW50IHRvbyBsb25nICglZCkgZm9yIGNvZGVibG9jayAlZCAocD0lZCwgYj0lZCwgcj0lZCwgYz0lZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zZWctPm5ld2xlbiwgY2Jsa25vLCBwX3BpLT5wcmVjbm8sIGJhbmRubywgcF9waS0+cmVzbm8sIHBfcGktPmNvbXBubyk7CisgICAgICAgICAgICAgICAgICAgIGlmICghSlBXTF9BU1NVTUUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJKUFdMOiBnaXZpbmcgdXBcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC05OTk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbF9zZWctPm5ld2xlbiA9IDgxOTIgLSBsX2NibGstPmxlbjsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9XQVJOSU5HLCAiICAgICAgLSB0cnVuY2F0aW5nIHNlZ21lbnQgdG8gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zZWctPm5ld2xlbik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH07CisKKyNlbmRpZiAvKiBVU0VfSlBXTCAqLworICAgICAgICAgICAgICAgIEpBU19GUFJJTlRGKHN0ZGVyciwgInBfZGF0YV9yZWFkICglZCkgbmV3bGVuICglZCkgXG4iLCAqcF9kYXRhX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zZWctPm5ld2xlbik7CisgICAgICAgICAgICAgICAgKihwX2RhdGFfcmVhZCkgKz0gbF9zZWctPm5ld2xlbjsKKworICAgICAgICAgICAgICAgIGxfc2VnLT5udW1wYXNzZXMgKz0gbF9zZWctPm51bW5ld3Bhc3NlczsKKyAgICAgICAgICAgICAgICBsX2NibGstPm51bW5ld3Bhc3NlcyAtPSBsX3NlZy0+bnVtbmV3cGFzc2VzOworICAgICAgICAgICAgICAgIGlmIChsX2NibGstPm51bW5ld3Bhc3NlcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgKytsX3NlZzsKKyAgICAgICAgICAgICAgICAgICAgKytsX2NibGstPm51bXNlZ3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAobF9jYmxrLT5udW1uZXdwYXNzZXMgPiAwKTsKKworICAgICAgICAgICAgKytsX2NibGs7CisgICAgICAgIH0KKworICAgICAgICArK2xfYmFuZDsKKyAgICB9CisKKyAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKKworc3RhdGljIE9QSl9CT09MIG9wal90Ml9pbml0X3NlZyhvcGpfdGNkX2NibGtfZGVjX3QqIGNibGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgY2Jsa3N0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBmaXJzdCkKK3sKKyAgICBvcGpfdGNkX3NlZ190KiBzZWcgPSAwMDsKKyAgICBPUEpfVUlOVDMyIGxfbmJfc2VncyA9IGluZGV4ICsgMTsKKworICAgIGlmIChsX25iX3NlZ3MgPiBjYmxrLT5tX2N1cnJlbnRfbWF4X3NlZ3MpIHsKKyAgICAgICAgb3BqX3RjZF9zZWdfdCogbmV3X3NlZ3M7CisgICAgICAgIE9QSl9VSU5UMzIgbF9tX2N1cnJlbnRfbWF4X3NlZ3MgPSBjYmxrLT5tX2N1cnJlbnRfbWF4X3NlZ3MgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0oyS19ERUZBVUxUX05CX1NFR1M7CisKKyAgICAgICAgbmV3X3NlZ3MgPSAob3BqX3RjZF9zZWdfdCopIG9wal9yZWFsbG9jKGNibGstPnNlZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX21fY3VycmVudF9tYXhfc2VncyAqIHNpemVvZihvcGpfdGNkX3NlZ190KSk7CisgICAgICAgIGlmICghIG5ld19zZWdzKSB7CisgICAgICAgICAgICAvKiBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gaW5pdGlhbGl6ZSBzZWdtZW50ICVkXG4iLCBsX25iX3NlZ3MpOyAqLworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBjYmxrLT5zZWdzID0gbmV3X3NlZ3M7CisgICAgICAgIG1lbXNldChuZXdfc2VncyArIGNibGstPm1fY3VycmVudF9tYXhfc2VncywKKyAgICAgICAgICAgICAgIDAsIE9QSl9KMktfREVGQVVMVF9OQl9TRUdTICogc2l6ZW9mKG9wal90Y2Rfc2VnX3QpKTsKKyAgICAgICAgY2Jsay0+bV9jdXJyZW50X21heF9zZWdzID0gbF9tX2N1cnJlbnRfbWF4X3NlZ3M7CisgICAgfQorCisgICAgc2VnID0gJmNibGstPnNlZ3NbaW5kZXhdOworICAgIG9wal90Y2RfcmVpbml0X3NlZ21lbnQoc2VnKTsKKworICAgIGlmIChjYmxrc3R5ICYgSjJLX0NDUF9DQkxLU1RZX1RFUk1BTEwpIHsKKyAgICAgICAgc2VnLT5tYXhwYXNzZXMgPSAxOworICAgIH0gZWxzZSBpZiAoY2Jsa3N0eSAmIEoyS19DQ1BfQ0JMS1NUWV9MQVpZKSB7CisgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgc2VnLT5tYXhwYXNzZXMgPSAxMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlZy0+bWF4cGFzc2VzID0gKCgoc2VnIC0gMSktPm1heHBhc3NlcyA9PSAxKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChzZWcgLSAxKS0+bWF4cGFzc2VzID09IDEwKSkgPyAyIDogMTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFNlZSBwYXJhZ3JhcGggIkIuMTAuNiBOdW1iZXIgb2YgY29kaW5nIHBhc3NlcyIgb2YgdGhlIHN0YW5kYXJkLgorICAgICAgICAgKiBQcm9iYWJseSB0aGF0IDEwOSBtdXN0IGJlIGludGVycHJldGVkIGEgKE1iLTEpKjMgKyAxIHdpdGggTWI9MzcsCisgICAgICAgICAqIE1iIGJlaW5nIHRoZSBtYXhpbXVtIG51bWJlciBvZiBiaXQtcGxhbmVzIGF2YWlsYWJsZSBmb3IgdGhlCisgICAgICAgICAqIHJlcHJlc2VudGF0aW9uIG9mIGNvZWZmaWNpZW50cyBpbiB0aGUgc3ViLWJhbmQgKi8KKyAgICAgICAgc2VnLT5tYXhwYXNzZXMgPSAxMDk7CisgICAgfQorCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Mi5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Mi5oCmluZGV4IDNiNjUyZWUuLjY2NTAwYjEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdDIuaAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3QyLmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCiAgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCiAgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCiAgKgpAQCAtOCwxMSArOCwxMiBAQAogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQogICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMsIERhdmlkIEphbnNzZW5zCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgWWFubmljayBWZXJzY2h1ZXJlbgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4IAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQogICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZSIAorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGUgogICogQ29weXJpZ2h0IChjKSAyMDEyLCBDUyBTeXN0ZW1lcyBkJ0luZm9ybWF0aW9uLCBGcmFuY2UKKyAqIENvcHlyaWdodCAoYykgMjAxNywgSW50b1BJWCBTQSA8c3VwcG9ydEBpbnRvcGl4LmNvbT4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zNiw4ICszNyw4IEBACiAgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KLSNpZm5kZWYgX19UMl9ICi0jZGVmaW5lIF9fVDJfSAorI2lmbmRlZiBPUEpfVDJfSAorI2RlZmluZSBPUEpfVDJfSAogLyoqCiBAZmlsZSB0Mi5oCiBAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSB0aWVyLTIgY29kaW5nIChwYWNrZXRpemF0aW9uIG9mIGNvZGUtYmxvY2sgZGF0YSkgKFQyKQpAQCAtNTIsMTAgKzUzLDEwIEBACiAqLwogdHlwZWRlZiBzdHJ1Y3Qgb3BqX3QyIHsKIAotCS8qKiBFbmNvZGluZzogcG9pbnRlciB0byB0aGUgc3JjIGltYWdlLiBEZWNvZGluZzogcG9pbnRlciB0byB0aGUgZHN0IGltYWdlLiAqLwotCW9wal9pbWFnZV90ICppbWFnZTsKLQkvKiogcG9pbnRlciB0byB0aGUgaW1hZ2UgY29kaW5nIHBhcmFtZXRlcnMgKi8KLQlvcGpfY3BfdCAqY3A7CisgICAgLyoqIEVuY29kaW5nOiBwb2ludGVyIHRvIHRoZSBzcmMgaW1hZ2UuIERlY29kaW5nOiBwb2ludGVyIHRvIHRoZSBkc3QgaW1hZ2UuICovCisgICAgb3BqX2ltYWdlX3QgKmltYWdlOworICAgIC8qKiBwb2ludGVyIHRvIHRoZSBpbWFnZSBjb2RpbmcgcGFyYW1ldGVycyAqLworICAgIG9wal9jcF90ICpjcDsKIH0gb3BqX3QyX3Q7CiAKIC8qKiBAbmFtZSBFeHBvcnRlZCBmdW5jdGlvbnMgKi8KQEAgLTc1LDIzICs3NiwyNiBAQAogQHBhcmFtIHRwbnVtICAgICAgICAgICAgVGlsZSBwYXJ0IG51bWJlciBvZiB0aGUgY3VycmVudCB0aWxlCiBAcGFyYW0gdHBwb3MgICAgICAgICAgICBUaGUgcG9zaXRpb24gb2YgdGhlIHRpbGUgcGFydCBmbGFnIGluIHRoZSBwcm9ncmVzc2lvbiBvcmRlcgogQHBhcmFtIHBpbm8gICAgICAgICAgICAgRklYTUUgRE9DCi1AcGFyYW0gdDJfbW9kZSAgICAgICAgICBJZiA9PSAwIEluIFRocmVzaG9sZCBjYWxjdWxhdGlvbiAsSWYgPT0gMSBGaW5hbCBwYXNzCitAcGFyYW0gdDJfbW9kZSAgICAgICAgICBJZiA9PSBUSFJFU0hfQ0FMQyBJbiBUaHJlc2hvbGQgY2FsY3VsYXRpb24gLElmID09IEZJTkFMX1BBU1MgRmluYWwgcGFzcworQHBhcmFtIHBfbWFuYWdlciAgICAgICAgdGhlIHVzZXIgZXZlbnQgbWFuYWdlcgogKi8KLU9QSl9CT09MIG9wal90Ml9lbmNvZGVfcGFja2V0cygJb3BqX3QyX3QqIHQyLAotCQkJCQkJCQlPUEpfVUlOVDMyIHRpbGVubywKLQkJCQkJCQkJb3BqX3RjZF90aWxlX3QgKnRpbGUsCi0JCQkJCQkJCU9QSl9VSU5UMzIgbWF4bGF5ZXJzLAotCQkJCQkJCQlPUEpfQllURSAqZGVzdCwKLQkJCQkJCQkJT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAotCQkJCQkJCQlPUEpfVUlOVDMyIGxlbiwKLQkJCQkJCQkJb3BqX2NvZGVzdHJlYW1faW5mb190ICpjc3RyX2luZm8sCi0JCQkJCQkJCU9QSl9VSU5UMzIgdHBudW0sCi0JCQkJCQkJCU9QSl9JTlQzMiB0cHBvcywKLQkJCQkJCQkJT1BKX1VJTlQzMiBwaW5vLAotCQkJCQkJCQlKMktfVDJfTU9ERSB0Ml9tb2RlKTsKK09QSl9CT09MIG9wal90Ml9lbmNvZGVfcGFja2V0cyhvcGpfdDJfdCogdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlX3QgKnRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBtYXhsYXllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqY3N0cl9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgdHBudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHRwcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcGlubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKMktfVDJfTU9ERSB0Ml9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKTsKIAogLyoqCiBEZWNvZGUgdGhlIHBhY2tldHMgb2YgYSB0aWxlIGZyb20gYSBzb3VyY2UgYnVmZmVyCitAcGFyYW0gdGNkIFRDRCBoYW5kbGUKIEBwYXJhbSB0MiBUMiBoYW5kbGUKIEBwYXJhbSB0aWxlbm8gbnVtYmVyIHRoYXQgaWRlbnRpZmllcyB0aGUgdGlsZSBmb3Igd2hpY2ggdG8gZGVjb2RlIHRoZSBwYWNrZXRzCiBAcGFyYW0gdGlsZSB0aWxlIGZvciB3aGljaCB0byBkZWNvZGUgdGhlIHBhY2tldHMKQEAgLTk5LDI0ICsxMDMsMjYgQEAKIEBwYXJhbSBwX2RhdGFfcmVhZCB0aGUgc291cmNlIGJ1ZmZlcgogQHBhcmFtIGxlbiBsZW5ndGggb2YgdGhlIHNvdXJjZSBidWZmZXIKIEBwYXJhbSBjc3RyX2luZm8gICBGSVhNRSBET0MKK0BwYXJhbSBwX21hbmFnZXIgdGhlIHVzZXIgZXZlbnQgbWFuYWdlcgogCiBAcmV0dXJuIEZJWE1FIERPQwogICovCi1PUEpfQk9PTCBvcGpfdDJfZGVjb2RlX3BhY2tldHMoCW9wal90Ml90ICp0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZV90ICp0aWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmRleF90ICpjc3RyX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKTsKK09QSl9CT09MIG9wal90Ml9kZWNvZGVfcGFja2V0cyhvcGpfdGNkX3QqIHRjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDJfdCAqdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlX3QgKnRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3JlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqY3N0cl9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBDcmVhdGVzIGEgVGllciAyIGhhbmRsZQogICoKLSAqIEBwYXJhbQlwX2ltYWdlCQlTb3VyY2Ugb3IgZGVzdGluYXRpb24gaW1hZ2UKLSAqIEBwYXJhbQlwX2NwCQlJbWFnZSBjb2RpbmcgcGFyYW1ldGVycy4KLSAqIEByZXR1cm4JCWEgbmV3IFQyIGhhbmRsZSBpZiBzdWNjZXNzZnVsLCBOVUxMIG90aGVyd2lzZS4KKyAqIEBwYXJhbSAgIHBfaW1hZ2UgICAgIFNvdXJjZSBvciBkZXN0aW5hdGlvbiBpbWFnZQorICogQHBhcmFtICAgcF9jcCAgICAgICAgSW1hZ2UgY29kaW5nIHBhcmFtZXRlcnMuCisgKiBAcmV0dXJuICAgICAgYSBuZXcgVDIgaGFuZGxlIGlmIHN1Y2Nlc3NmdWwsIE5VTEwgb3RoZXJ3aXNlLgogKi8KIG9wal90Ml90KiBvcGpfdDJfY3JlYXRlKG9wal9pbWFnZV90ICpwX2ltYWdlLCBvcGpfY3BfdCAqcF9jcCk7CiAKQEAgLTEzMSw0ICsxMzcsNCBAQAogCiAvKkB9Ki8KIAotI2VuZGlmIC8qIF9fVDJfSCAqLworI2VuZGlmIC8qIE9QSl9UMl9IICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3RjZC5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Y2QuYwppbmRleCAwNmVlZTRlLi43Mjk4ZmEzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3RjZC5jCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGNkLmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCiAgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCiAgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCiAgKgpAQCAtOCwxMiArOCwxMyBAQAogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQogICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMsIERhdmlkIEphbnNzZW5zCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgWWFubmljayBWZXJzY2h1ZXJlbgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4IAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQogICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwNywgUGFydmF0aGEgRWxhbmdvdmFuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZSIAorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGUgogICogQ29weXJpZ2h0IChjKSAyMDEyLCBDUyBTeXN0ZW1lcyBkJ0luZm9ybWF0aW9uLCBGcmFuY2UKKyAqIENvcHlyaWdodCAoYykgMjAxNywgSW50b1BJWCBTQSA8c3VwcG9ydEBpbnRvcGl4LmNvbT4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zOSwxMDAgKzQwLDEwOCBAQAogICovCiAKICNpbmNsdWRlICJvcGpfaW5jbHVkZXMuaCIKKyNpbmNsdWRlICJvcGpfY29tbW9uLmgiCiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKIC8qIFRPRE8gTVNEOiAqLwotI2lmZGVmIFRPRE9fTVNEIAotdm9pZCB0Y2RfZHVtcChGSUxFICpmZCwgb3BqX3RjZF90ICp0Y2QsIG9wal90Y2RfaW1hZ2VfdCAqIGltZykgewotICAgICAgICBpbnQgdGlsZW5vLCBjb21wbm8sIHJlc25vLCBiYW5kbm8sIHByZWNubzsvKiwgY2Jsa25vOyovCisjaWZkZWYgVE9ET19NU0QKK3ZvaWQgdGNkX2R1bXAoRklMRSAqZmQsIG9wal90Y2RfdCAqdGNkLCBvcGpfdGNkX2ltYWdlX3QgKiBpbWcpCit7CisgICAgaW50IHRpbGVubywgY29tcG5vLCByZXNubywgYmFuZG5vLCBwcmVjbm87LyosIGNibGtubzsqLwogCi0gICAgICAgIGZwcmludGYoZmQsICJpbWFnZSB7XG4iKTsKLSAgICAgICAgZnByaW50ZihmZCwgIiAgdHc9JWQsIHRoPSVkIHgwPSVkIHgxPSVkIHkwPSVkIHkxPSVkXG4iLCAKLSAgICAgICAgICAgICAgICBpbWctPnR3LCBpbWctPnRoLCB0Y2QtPmltYWdlLT54MCwgdGNkLT5pbWFnZS0+eDEsIHRjZC0+aW1hZ2UtPnkwLCB0Y2QtPmltYWdlLT55MSk7CisgICAgZnByaW50ZihmZCwgImltYWdlIHtcbiIpOworICAgIGZwcmludGYoZmQsICIgIHR3PSVkLCB0aD0lZCB4MD0lZCB4MT0lZCB5MD0lZCB5MT0lZFxuIiwKKyAgICAgICAgICAgIGltZy0+dHcsIGltZy0+dGgsIHRjZC0+aW1hZ2UtPngwLCB0Y2QtPmltYWdlLT54MSwgdGNkLT5pbWFnZS0+eTAsCisgICAgICAgICAgICB0Y2QtPmltYWdlLT55MSk7CiAKLSAgICAgICAgZm9yICh0aWxlbm8gPSAwOyB0aWxlbm8gPCBpbWctPnRoICogaW1nLT50dzsgdGlsZW5vKyspIHsKLSAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVfdCAqdGlsZSA9ICZ0Y2QtPnRjZF9pbWFnZS0+dGlsZXNbdGlsZW5vXTsKLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICB0aWxlIHtcbiIpOwotICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgeDA9JWQsIHkwPSVkLCB4MT0lZCwgeTE9JWQsIG51bWNvbXBzPSVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgdGlsZS0+eDAsIHRpbGUtPnkwLCB0aWxlLT54MSwgdGlsZS0+eTEsIHRpbGUtPm51bWNvbXBzKTsKLSAgICAgICAgICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHRpbGUtPm51bWNvbXBzOyBjb21wbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICp0aWxlYyA9ICZ0aWxlLT5jb21wc1tjb21wbm9dOwotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICB0aWxlYyB7XG4iKTsKKyAgICBmb3IgKHRpbGVubyA9IDA7IHRpbGVubyA8IGltZy0+dGggKiBpbWctPnR3OyB0aWxlbm8rKykgeworICAgICAgICBvcGpfdGNkX3RpbGVfdCAqdGlsZSA9ICZ0Y2QtPnRjZF9pbWFnZS0+dGlsZXNbdGlsZW5vXTsKKyAgICAgICAgZnByaW50ZihmZCwgIiAgdGlsZSB7XG4iKTsKKyAgICAgICAgZnByaW50ZihmZCwgIiAgICB4MD0lZCwgeTA9JWQsIHgxPSVkLCB5MT0lZCwgbnVtY29tcHM9JWRcbiIsCisgICAgICAgICAgICAgICAgdGlsZS0+eDAsIHRpbGUtPnkwLCB0aWxlLT54MSwgdGlsZS0+eTEsIHRpbGUtPm51bWNvbXBzKTsKKyAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCB0aWxlLT5udW1jb21wczsgY29tcG5vKyspIHsKKyAgICAgICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqdGlsZWMgPSAmdGlsZS0+Y29tcHNbY29tcG5vXTsKKyAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgdGlsZWMge1xuIik7CisgICAgICAgICAgICBmcHJpbnRmKGZkLAorICAgICAgICAgICAgICAgICAgICAiICAgICAgeDA9JWQsIHkwPSVkLCB4MT0lZCwgeTE9JWQsIG51bXJlc29sdXRpb25zPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICB0aWxlYy0+eDAsIHRpbGVjLT55MCwgdGlsZWMtPngxLCB0aWxlYy0+eTEsIHRpbGVjLT5udW1yZXNvbHV0aW9ucyk7CisgICAgICAgICAgICBmb3IgKHJlc25vID0gMDsgcmVzbm8gPCB0aWxlYy0+bnVtcmVzb2x1dGlvbnM7IHJlc25vKyspIHsKKyAgICAgICAgICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCAqcmVzID0gJnRpbGVjLT5yZXNvbHV0aW9uc1tyZXNub107CisgICAgICAgICAgICAgICAgZnByaW50ZihmZCwgIlxuICAgcmVzIHtcbiIpOworICAgICAgICAgICAgICAgIGZwcmludGYoZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgIHgwPSVkLCB5MD0lZCwgeDE9JWQsIHkxPSVkLCBwdz0lZCwgcGg9JWQsIG51bWJhbmRzPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzLT54MCwgcmVzLT55MCwgcmVzLT54MSwgcmVzLT55MSwgcmVzLT5wdywgcmVzLT5waCwgcmVzLT5udW1iYW5kcyk7CisgICAgICAgICAgICAgICAgZm9yIChiYW5kbm8gPSAwOyBiYW5kbm8gPCByZXMtPm51bWJhbmRzOyBiYW5kbm8rKykgeworICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX2JhbmRfdCAqYmFuZCA9ICZyZXMtPmJhbmRzW2JhbmRub107CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgICAgIGJhbmQge1xuIik7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICB4MD0lZCwgeTA9JWQsIHgxPSVkLCB5MT0lZCwgc3RlcHNpemU9JWYsIG51bWJwcz0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kLT54MCwgYmFuZC0+eTAsIGJhbmQtPngxLCBiYW5kLT55MSwgYmFuZC0+c3RlcHNpemUsIGJhbmQtPm51bWJwcyk7CisgICAgICAgICAgICAgICAgICAgIGZvciAocHJlY25vID0gMDsgcHJlY25vIDwgcmVzLT5wdyAqIHJlcy0+cGg7IHByZWNubysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3ByZWNpbmN0X3QgKnByZWMgPSAmYmFuZC0+cHJlY2luY3RzW3ByZWNub107CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgICAgICAgIHByZWMge1xuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgeDA9JWQsIHkwPSVkLCB4MT0lZCwgeTE9JWQsIG51bXJlc29sdXRpb25zPSVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlYy0+eDAsIHRpbGVjLT55MCwgdGlsZWMtPngxLCB0aWxlYy0+eTEsIHRpbGVjLT5udW1yZXNvbHV0aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHJlc25vID0gMDsgcmVzbm8gPCB0aWxlYy0+bnVtcmVzb2x1dGlvbnM7IHJlc25vKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QgKnJlcyA9ICZ0aWxlYy0+cmVzb2x1dGlvbnNbcmVzbm9dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiXG4gICByZXMge1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICB4MD0lZCwgeTA9JWQsIHgxPSVkLCB5MT0lZCwgY3c9JWQsIGNoPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjLT54MCwgcHJlYy0+eTAsIHByZWMtPngxLCBwcmVjLT55MSwgcHJlYy0+Y3csIHByZWMtPmNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IHByZWMtPmN3ICogcHJlYy0+Y2g7IGNibGtubysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfY2Jsa190ICpjYmxrID0gJnByZWMtPmNibGtzW2NibGtub107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgICAgICAgICBjYmxrIHtcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgeDA9JWQsIHkwPSVkLCB4MT0lZCwgeTE9JWQsIHB3PSVkLCBwaD0lZCwgbnVtYmFuZHM9JWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLT54MCwgcmVzLT55MCwgcmVzLT54MSwgcmVzLT55MSwgcmVzLT5wdywgcmVzLT5waCwgcmVzLT5udW1iYW5kcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgcmVzLT5udW1iYW5kczsgYmFuZG5vKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX2JhbmRfdCAqYmFuZCA9ICZyZXMtPmJhbmRzW2JhbmRub107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICAgICAgYmFuZCB7XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICB4MD0lZCwgeTA9JWQsIHgxPSVkLCB5MT0lZCwgc3RlcHNpemU9JWYsIG51bWJwcz0lZFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbmQtPngwLCBiYW5kLT55MCwgYmFuZC0+eDEsIGJhbmQtPnkxLCBiYW5kLT5zdGVwc2l6ZSwgYmFuZC0+bnVtYnBzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHByZWNubyA9IDA7IHByZWNubyA8IHJlcy0+cHcgKiByZXMtPnBoOyBwcmVjbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9wcmVjaW5jdF90ICpwcmVjID0gJmJhbmQtPnByZWNpbmN0c1twcmVjbm9dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICAgICAgICBwcmVjIHtcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIHgwPSVkLCB5MD0lZCwgeDE9JWQsIHkxPSVkLCBjdz0lZCwgY2g9JWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWMtPngwLCBwcmVjLT55MCwgcHJlYy0+eDEsIHByZWMtPnkxLCBwcmVjLT5jdywgcHJlYy0+Y2gpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgcHJlYy0+Y3cgKiBwcmVjLT5jaDsgY2Jsa25vKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9jYmxrX3QgKmNibGsgPSAmcHJlYy0+Y2Jsa3NbY2Jsa25vXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICAgICAgICAgIGNibGsge1xuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgeDA9JWQsIHkwPSVkLCB4MT0lZCwgeTE9JWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+eDAsIGNibGstPnkwLCBjYmxrLT54MSwgY2Jsay0+eTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgICAgICAgICAgfVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICAgICAgICB9XG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICAgICAgfVxuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICAgIH1cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIHgwPSVkLCB5MD0lZCwgeDE9JWQsIHkxPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPngwLCBjYmxrLT55MCwgY2Jsay0+eDEsIGNibGstPnkxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICAgICAgICAgIH1cbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmZCwgIiAgICB9XG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgICAgICAgIH1cbiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmQsICIgICAgICAgIH1cbiIpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICB9XG4iKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgICAgfVxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcHJpbnRmKGZkLCAiICAgIH1cbiIpOwogICAgICAgICB9Ci0gICAgICAgIGZwcmludGYoZmQsICJ9XG4iKTsKKyAgICAgICAgZnByaW50ZihmZCwgIiAgfVxuIik7CisgICAgfQorICAgIGZwcmludGYoZmQsICJ9XG4iKTsKIH0KICNlbmRpZgogCiAvKioKICAqIEluaXRpYWxpemVzIHRpbGUgY29kaW5nL2RlY29kaW5nCiAgKi8KLXN0YXRpYyBJTkxJTkUgT1BKX0JPT0wgb3BqX3RjZF9pbml0X3RpbGUob3BqX3RjZF90ICpwX3RjZCwgT1BKX1VJTlQzMiBwX3RpbGVfbm8sIE9QSl9CT09MIGlzRW5jb2RlciwgT1BKX0ZMT0FUMzIgZnJhY3Rpb24sIE9QSl9TSVpFX1Qgc2l6ZW9mX2Jsb2NrLCBvcGpfZXZlbnRfbWdyX3QqIG1hbmFnZXIpOworc3RhdGljIElOTElORSBPUEpfQk9PTCBvcGpfdGNkX2luaXRfdGlsZShvcGpfdGNkX3QgKnBfdGNkLCBPUEpfVUlOVDMyIHBfdGlsZV9ubywKKyAgICAgICAgT1BKX0JPT0wgaXNFbmNvZGVyLCBPUEpfRkxPQVQzMiBmcmFjdGlvbiwgT1BKX1NJWkVfVCBzaXplb2ZfYmxvY2ssCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCogbWFuYWdlcik7CiAKIC8qKgogKiBBbGxvY2F0ZXMgbWVtb3J5IGZvciBhIGRlY29kaW5nIGNvZGUgYmxvY2suCiAqLwotc3RhdGljIE9QSl9CT09MIG9wal90Y2RfY29kZV9ibG9ja19kZWNfYWxsb2NhdGUgKG9wal90Y2RfY2Jsa19kZWNfdCAqIHBfY29kZV9ibG9jayk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF9jb2RlX2Jsb2NrX2RlY19hbGxvY2F0ZShvcGpfdGNkX2NibGtfZGVjX3QgKgorICAgICAgICBwX2NvZGVfYmxvY2spOwogCiAvKioKICAqIERlYWxsb2NhdGVzIHRoZSBkZWNvZGluZyBkYXRhIG9mIHRoZSBnaXZlbiBwcmVjaW5jdC4KICAqLwotc3RhdGljIHZvaWQgb3BqX3RjZF9jb2RlX2Jsb2NrX2RlY19kZWFsbG9jYXRlIChvcGpfdGNkX3ByZWNpbmN0X3QgKiBwX3ByZWNpbmN0KTsKK3N0YXRpYyB2b2lkIG9wal90Y2RfY29kZV9ibG9ja19kZWNfZGVhbGxvY2F0ZShvcGpfdGNkX3ByZWNpbmN0X3QgKiBwX3ByZWNpbmN0KTsKIAogLyoqCiAgKiBBbGxvY2F0ZXMgbWVtb3J5IGZvciBhbiBlbmNvZGluZyBjb2RlIGJsb2NrIChidXQgbm90IGRhdGEpLgogICovCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF9jb2RlX2Jsb2NrX2VuY19hbGxvY2F0ZSAob3BqX3RjZF9jYmxrX2VuY190ICogcF9jb2RlX2Jsb2NrKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX2NvZGVfYmxvY2tfZW5jX2FsbG9jYXRlKG9wal90Y2RfY2Jsa19lbmNfdCAqCisgICAgICAgIHBfY29kZV9ibG9jayk7CiAKIC8qKgogICogQWxsb2NhdGVzIGRhdGEgZm9yIGFuIGVuY29kaW5nIGNvZGUgYmxvY2sKICAqLwotc3RhdGljIE9QSl9CT09MIG9wal90Y2RfY29kZV9ibG9ja19lbmNfYWxsb2NhdGVfZGF0YSAob3BqX3RjZF9jYmxrX2VuY190ICogcF9jb2RlX2Jsb2NrKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX2NvZGVfYmxvY2tfZW5jX2FsbG9jYXRlX2RhdGEob3BqX3RjZF9jYmxrX2VuY190ICoKKyAgICAgICAgcF9jb2RlX2Jsb2NrKTsKIAogLyoqCiAgKiBEZWFsbG9jYXRlcyB0aGUgZW5jb2RpbmcgZGF0YSBvZiB0aGUgZ2l2ZW4gcHJlY2luY3QuCiAgKi8KLXN0YXRpYyB2b2lkIG9wal90Y2RfY29kZV9ibG9ja19lbmNfZGVhbGxvY2F0ZSAob3BqX3RjZF9wcmVjaW5jdF90ICogcF9wcmVjaW5jdCk7CitzdGF0aWMgdm9pZCBvcGpfdGNkX2NvZGVfYmxvY2tfZW5jX2RlYWxsb2NhdGUob3BqX3RjZF9wcmVjaW5jdF90ICogcF9wcmVjaW5jdCk7CiAKIAogLyoqCkBAIC0xNDIsNDAgKzE1MSw0OCBAQAogc3RhdGljIHZvaWQgb3BqX3RjZF9mcmVlX3RpbGUob3BqX3RjZF90ICp0Y2QpOwogCiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX3QyX2RlY29kZSAoIG9wal90Y2RfdCAqcF90Y2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfc3JjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3NyY19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqcF9jc3RyX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpOworc3RhdGljIE9QSl9CT09MIG9wal90Y2RfdDJfZGVjb2RlKG9wal90Y2RfdCAqcF90Y2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX3NyY19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3NyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZGV4X3QgKnBfY3N0cl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcik7CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX3QxX2RlY29kZSAob3BqX3RjZF90ICpwX3RjZCk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF90MV9kZWNvZGUob3BqX3RjZF90ICpwX3RjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcik7CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX2R3dF9kZWNvZGUgKG9wal90Y2RfdCAqcF90Y2QpOworc3RhdGljIE9QSl9CT09MIG9wal90Y2RfZHd0X2RlY29kZShvcGpfdGNkX3QgKnBfdGNkKTsKIAotc3RhdGljIE9QSl9CT09MIG9wal90Y2RfbWN0X2RlY29kZSAob3BqX3RjZF90ICpwX3RjZCwgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpOworc3RhdGljIE9QSl9CT09MIG9wal90Y2RfbWN0X2RlY29kZShvcGpfdGNkX3QgKnBfdGNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcik7CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX2RjX2xldmVsX3NoaWZ0X2RlY29kZSAob3BqX3RjZF90ICpwX3RjZCk7CitzdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF9kY19sZXZlbF9zaGlmdF9kZWNvZGUob3BqX3RjZF90ICpwX3RjZCk7CiAKIAotc3RhdGljIE9QSl9CT09MIG9wal90Y2RfZGNfbGV2ZWxfc2hpZnRfZW5jb2RlICggb3BqX3RjZF90ICpwX3RjZCApOworc3RhdGljIE9QSl9CT09MIG9wal90Y2RfZGNfbGV2ZWxfc2hpZnRfZW5jb2RlKG9wal90Y2RfdCAqcF90Y2QpOwogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF9tY3RfZW5jb2RlICggb3BqX3RjZF90ICpwX3RjZCApOworc3RhdGljIE9QSl9CT09MIG9wal90Y2RfbWN0X2VuY29kZShvcGpfdGNkX3QgKnBfdGNkKTsKIAotc3RhdGljIE9QSl9CT09MIG9wal90Y2RfZHd0X2VuY29kZSAoIG9wal90Y2RfdCAqcF90Y2QgKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX2R3dF9lbmNvZGUob3BqX3RjZF90ICpwX3RjZCk7CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX3QxX2VuY29kZSAoIG9wal90Y2RfdCAqcF90Y2QgKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX3QxX2VuY29kZShvcGpfdGNkX3QgKnBfdGNkKTsKIAotc3RhdGljIE9QSl9CT09MIG9wal90Y2RfdDJfZW5jb2RlICggICAgIG9wal90Y2RfdCAqcF90Y2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kZXN0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9kZXN0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqcF9jc3RyX2luZm8gKTsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX3QyX2VuY29kZShvcGpfdGNkX3QgKnBfdGNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kZXN0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfZGVzdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqcF9jc3RyX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpOwogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF9yYXRlX2FsbG9jYXRlX2VuY29kZSggICBvcGpfdGNkX3QgKnBfdGNkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kZXN0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9kZXN0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5mb190ICpwX2NzdHJfaW5mbyApOworc3RhdGljIE9QSl9CT09MIG9wal90Y2RfcmF0ZV9hbGxvY2F0ZV9lbmNvZGUob3BqX3RjZF90ICpwX3RjZCwKKyAgICAgICAgT1BKX0JZVEUgKiBwX2Rlc3RfZGF0YSwKKyAgICAgICAgT1BKX1VJTlQzMiBwX21heF9kZXN0X3NpemUsCisgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqcF9jc3RyX2luZm8sCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKTsKKworCitzdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF9pc193aG9sZV90aWxlY29tcF9kZWNvZGluZyhvcGpfdGNkX3QgKnRjZCwKKyAgICAgICAgT1BKX1VJTlQzMiBjb21wbm8pOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCkBAIC0xODQsMTMwNyArMjAxLDE2MjUgQEAKICovCiBvcGpfdGNkX3QqIG9wal90Y2RfY3JlYXRlKE9QSl9CT09MIHBfaXNfZGVjb2RlcikKIHsKLSAgICAgICAgb3BqX3RjZF90ICpsX3RjZCA9IDAwOworICAgIG9wal90Y2RfdCAqbF90Y2QgPSAwMDsKIAotICAgICAgICAvKiBjcmVhdGUgdGhlIHRjZCBzdHJ1Y3R1cmUgKi8KLSAgICAgICAgbF90Y2QgPSAob3BqX3RjZF90Kikgb3BqX2NhbGxvYygxLHNpemVvZihvcGpfdGNkX3QpKTsKLSAgICAgICAgaWYgKCFsX3RjZCkgewotICAgICAgICAgICAgICAgIHJldHVybiAwMDsKLSAgICAgICAgfQorICAgIC8qIGNyZWF0ZSB0aGUgdGNkIHN0cnVjdHVyZSAqLworICAgIGxfdGNkID0gKG9wal90Y2RfdCopIG9wal9jYWxsb2MoMSwgc2l6ZW9mKG9wal90Y2RfdCkpOworICAgIGlmICghbF90Y2QpIHsKKyAgICAgICAgcmV0dXJuIDAwOworICAgIH0KIAotICAgICAgICBsX3RjZC0+bV9pc19kZWNvZGVyID0gcF9pc19kZWNvZGVyID8gMSA6IDA7CisgICAgbF90Y2QtPm1faXNfZGVjb2RlciA9IHBfaXNfZGVjb2RlciA/IDEgOiAwOwogCi0gICAgICAgIGxfdGNkLT50Y2RfaW1hZ2UgPSAob3BqX3RjZF9pbWFnZV90KilvcGpfY2FsbG9jKDEsc2l6ZW9mKG9wal90Y2RfaW1hZ2VfdCkpOwotICAgICAgICBpZiAoIWxfdGNkLT50Y2RfaW1hZ2UpIHsKLSAgICAgICAgICAgICAgICBvcGpfZnJlZShsX3RjZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDAwOwotICAgICAgICB9CisgICAgbF90Y2QtPnRjZF9pbWFnZSA9IChvcGpfdGNkX2ltYWdlX3QqKW9wal9jYWxsb2MoMSwgc2l6ZW9mKG9wal90Y2RfaW1hZ2VfdCkpOworICAgIGlmICghbF90Y2QtPnRjZF9pbWFnZSkgeworICAgICAgICBvcGpfZnJlZShsX3RjZCk7CisgICAgICAgIHJldHVybiAwMDsKKyAgICB9CiAKLSAgICAgICAgcmV0dXJuIGxfdGNkOworICAgIHJldHVybiBsX3RjZDsKIH0KIAogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi12b2lkIG9wal90Y2RfcmF0ZWFsbG9jYXRlX2ZpeGVkKG9wal90Y2RfdCAqdGNkKSB7Ci0gICAgICAgIE9QSl9VSU5UMzIgbGF5bm87Ci0KLSAgICAgICAgZm9yIChsYXlubyA9IDA7IGxheW5vIDwgdGNkLT50Y3AtPm51bWxheWVyczsgbGF5bm8rKykgewotICAgICAgICAgICAgICAgIG9wal90Y2RfbWFrZWxheWVyX2ZpeGVkKHRjZCwgbGF5bm8sIDEpOwotICAgICAgICB9Ci19Ci0KLQotdm9pZCBvcGpfdGNkX21ha2VsYXllciggb3BqX3RjZF90ICp0Y2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxheW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUNjQgdGhyZXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBmaW5hbCkKK3ZvaWQgb3BqX3RjZF9yYXRlYWxsb2NhdGVfZml4ZWQob3BqX3RjZF90ICp0Y2QpCiB7Ci0gICAgICAgIE9QSl9VSU5UMzIgY29tcG5vLCByZXNubywgYmFuZG5vLCBwcmVjbm8sIGNibGtubzsKLSAgICAgICAgT1BKX1VJTlQzMiBwYXNzbm87CisgICAgT1BKX1VJTlQzMiBsYXlubzsKIAotICAgICAgICBvcGpfdGNkX3RpbGVfdCAqdGNkX3RpbGUgPSB0Y2QtPnRjZF9pbWFnZS0+dGlsZXM7Ci0KLSAgICAgICAgdGNkX3RpbGUtPmRpc3RvbGF5ZXJbbGF5bm9dID0gMDsgICAgICAgIC8qIGZpeGVkX3F1YWxpdHkgKi8KLQotICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHRjZF90aWxlLT5udW1jb21wczsgY29tcG5vKyspIHsKLSAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKnRpbGVjID0gJnRjZF90aWxlLT5jb21wc1tjb21wbm9dOwotCi0gICAgICAgICAgICAgICAgZm9yIChyZXNubyA9IDA7IHJlc25vIDwgdGlsZWMtPm51bXJlc29sdXRpb25zOyByZXNubysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCAqcmVzID0gJnRpbGVjLT5yZXNvbHV0aW9uc1tyZXNub107Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgcmVzLT5udW1iYW5kczsgYmFuZG5vKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9iYW5kX3QgKmJhbmQgPSAmcmVzLT5iYW5kc1tiYW5kbm9dOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocHJlY25vID0gMDsgcHJlY25vIDwgcmVzLT5wdyAqIHJlcy0+cGg7IHByZWNubysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9wcmVjaW5jdF90ICpwcmMgPSAmYmFuZC0+cHJlY2luY3RzW3ByZWNub107Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IHByYy0+Y3cgKiBwcmMtPmNoOyBjYmxrbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9jYmxrX2VuY190ICpjYmxrID0gJnByYy0+Y2Jsa3MuZW5jW2NibGtub107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX2xheWVyX3QgKmxheWVyID0gJmNibGstPmxheWVyc1tsYXlub107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG47Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXlubyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPm51bXBhc3Nlc2lubGF5ZXJzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGNibGstPm51bXBhc3Nlc2lubGF5ZXJzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHBhc3NubyA9IGNibGstPm51bXBhc3Nlc2lubGF5ZXJzOyBwYXNzbm8gPCBjYmxrLT50b3RhbHBhc3NlczsgcGFzc25vKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBkcjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUNjQgZGQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfcGFzc190ICpwYXNzID0gJmNibGstPnBhc3Nlc1twYXNzbm9dOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkciA9IHBhc3MtPnJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGQgPSBwYXNzLT5kaXN0b3J0aW9uZGVjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyID0gcGFzcy0+cmF0ZSAtIGNibGstPnBhc3Nlc1tuIC0gMV0ucmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZCA9IHBhc3MtPmRpc3RvcnRpb25kZWMgLSBjYmxrLT5wYXNzZXNbbiAtIDFdLmRpc3RvcnRpb25kZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRkICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gcGFzc25vICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhyZXNoIC0gKGRkIC8gZHIpIDwgREJMX0VQU0lMT04pIC8qIGRvIG5vdCByZWx5IG9uIGZsb2F0IGVxdWFsaXR5LCBjaGVjayB3aXRoIERCTF9FUFNJTE9OIG1hcmdpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBwYXNzbm8gKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci0+bnVtcGFzc2VzID0gbiAtIGNibGstPm51bXBhc3Nlc2lubGF5ZXJzOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxheWVyLT5udW1wYXNzZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmRpc3RvID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYmxrLT5udW1wYXNzZXNpbmxheWVycyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5sZW4gPSBjYmxrLT5wYXNzZXNbbiAtIDFdLnJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5kYXRhID0gY2Jsay0+ZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmRpc3RvID0gY2Jsay0+cGFzc2VzW24gLSAxXS5kaXN0b3J0aW9uZGVjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmxlbiA9IGNibGstPnBhc3Nlc1tuIC0gMV0ucmF0ZSAtIGNibGstPnBhc3Nlc1tjYmxrLT5udW1wYXNzZXNpbmxheWVycyAtIDFdLnJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5kYXRhID0gY2Jsay0+ZGF0YSArIGNibGstPnBhc3Nlc1tjYmxrLT5udW1wYXNzZXNpbmxheWVycyAtIDFdLnJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5kaXN0byA9IGNibGstPnBhc3Nlc1tuIC0gMV0uZGlzdG9ydGlvbmRlYyAtIGNibGstPnBhc3Nlc1tjYmxrLT5udW1wYXNzZXNpbmxheWVycyAtIDFdLmRpc3RvcnRpb25kZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZF90aWxlLT5kaXN0b2xheWVyW2xheW5vXSArPSBsYXllci0+ZGlzdG87ICAgIC8qIGZpeGVkX3F1YWxpdHkgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT5udW1wYXNzZXNpbmxheWVycyA9IG47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgZm9yIChsYXlubyA9IDA7IGxheW5vIDwgdGNkLT50Y3AtPm51bWxheWVyczsgbGF5bm8rKykgeworICAgICAgICBvcGpfdGNkX21ha2VsYXllcl9maXhlZCh0Y2QsIGxheW5vLCAxKTsKKyAgICB9CiB9CiAKLXZvaWQgb3BqX3RjZF9tYWtlbGF5ZXJfZml4ZWQob3BqX3RjZF90ICp0Y2QsIE9QSl9VSU5UMzIgbGF5bm8sIE9QSl9VSU5UMzIgZmluYWwpIHsKLSAgICAgICAgT1BKX1VJTlQzMiBjb21wbm8sIHJlc25vLCBiYW5kbm8sIHByZWNubywgY2Jsa25vOwotICAgICAgICBPUEpfSU5UMzIgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgLyosIG1hdHJpY2VbdGNkX3RjcC0+bnVtbGF5ZXJzXVt0Y2RfdGlsZS0+Y29tcHNbMF0ubnVtcmVzb2x1dGlvbnNdWzNdOyAqLwotICAgICAgICBPUEpfSU5UMzIgbWF0cmljZVsxMF1bMTBdWzNdOwotICAgICAgICBPUEpfVUlOVDMyIGksIGosIGs7CiAKLSAgICAgICAgb3BqX2NwX3QgKmNwID0gdGNkLT5jcDsKLSAgICAgICAgb3BqX3RjZF90aWxlX3QgKnRjZF90aWxlID0gdGNkLT50Y2RfaW1hZ2UtPnRpbGVzOwotICAgICAgICBvcGpfdGNwX3QgKnRjZF90Y3AgPSB0Y2QtPnRjcDsKLQotICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHRjZF90aWxlLT5udW1jb21wczsgY29tcG5vKyspIHsKLSAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKnRpbGVjID0gJnRjZF90aWxlLT5jb21wc1tjb21wbm9dOwotCi0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHRjZF90Y3AtPm51bWxheWVyczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgdGlsZWMtPm51bXJlc29sdXRpb25zOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDM7IGsrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpY2VbaV1bal1ba10gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMikgKChPUEpfRkxPQVQzMiljcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX21hdHJpY2VbaSAqIHRpbGVjLT5udW1yZXNvbHV0aW9ucyAqIDMgKyBqICogMyArIGtdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChPUEpfRkxPQVQzMikgKHRjZC0+aW1hZ2UtPmNvbXBzW2NvbXBub10ucHJlYyAvIDE2LjApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAocmVzbm8gPSAwOyByZXNubyA8IHRpbGVjLT5udW1yZXNvbHV0aW9uczsgcmVzbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QgKnJlcyA9ICZ0aWxlYy0+cmVzb2x1dGlvbnNbcmVzbm9dOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IHJlcy0+bnVtYmFuZHM7IGJhbmRubysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfYmFuZF90ICpiYW5kID0gJnJlcy0+YmFuZHNbYmFuZG5vXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHByZWNubyA9IDA7IHByZWNubyA8IHJlcy0+cHcgKiByZXMtPnBoOyBwcmVjbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfcHJlY2luY3RfdCAqcHJjID0gJmJhbmQtPnByZWNpbmN0c1twcmVjbm9dOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBwcmMtPmN3ICogcHJjLT5jaDsgY2Jsa25vKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfY2Jsa19lbmNfdCAqY2JsayA9ICZwcmMtPmNibGtzLmVuY1tjYmxrbm9dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9sYXllcl90ICpsYXllciA9ICZjYmxrLT5sYXllcnNbbGF5bm9dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBuOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIGltc2IgPSAoT1BKX0lOVDMyKSh0Y2QtPmltYWdlLT5jb21wc1tjb21wbm9dLnByZWMgLSBjYmxrLT5udW1icHMpOyAvKiBudW1iZXIgb2YgYml0LXBsYW4gZXF1YWwgdG8gemVybyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb3JyZWN0aW9uIG9mIHRoZSBtYXRyaXggb2YgY29lZmZpY2llbnQgdG8gaW5jbHVkZSB0aGUgSU1TQiBpbmZvcm1hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxheW5vID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtYXRyaWNlW2xheW5vXVtyZXNub11bYmFuZG5vXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltc2IgPj0gdmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgLT0gaW1zYjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtYXRyaWNlW2xheW5vXVtyZXNub11bYmFuZG5vXSAtIG1hdHJpY2VbbGF5bm8gLSAxXVtyZXNub11bYmFuZG5vXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltc2IgPj0gbWF0cmljZVtsYXlubyAtIDFdW3Jlc25vXVtiYW5kbm9dKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgLT0gKGltc2IgLSBtYXRyaWNlW2xheW5vIC0gMV1bcmVzbm9dW2JhbmRub10pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxheW5vID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+bnVtcGFzc2VzaW5sYXllcnMgPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gY2Jsay0+bnVtcGFzc2VzaW5sYXllcnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2Jsay0+bnVtcGFzc2VzaW5sYXllcnMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4gPSAzICogKE9QSl9VSU5UMzIpdmFsdWUgLSAyICsgY2Jsay0+bnVtcGFzc2VzaW5sYXllcnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGNibGstPm51bXBhc3Nlc2lubGF5ZXJzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gMyAqIChPUEpfVUlOVDMyKXZhbHVlICsgY2Jsay0+bnVtcGFzc2VzaW5sYXllcnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5udW1wYXNzZXMgPSBuIC0gY2Jsay0+bnVtcGFzc2VzaW5sYXllcnM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGF5ZXItPm51bXBhc3NlcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYmxrLT5udW1wYXNzZXNpbmxheWVycyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5sZW4gPSBjYmxrLT5wYXNzZXNbbiAtIDFdLnJhdGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5kYXRhID0gY2Jsay0+ZGF0YTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5sZW4gPSBjYmxrLT5wYXNzZXNbbiAtIDFdLnJhdGUgLSBjYmxrLT5wYXNzZXNbY2Jsay0+bnVtcGFzc2VzaW5sYXllcnMgLSAxXS5yYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci0+ZGF0YSA9IGNibGstPmRhdGEgKyBjYmxrLT5wYXNzZXNbY2Jsay0+bnVtcGFzc2VzaW5sYXllcnMgLSAxXS5yYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluYWwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPm51bXBhc3Nlc2lubGF5ZXJzID0gbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLX0KLQotT1BKX0JPT0wgb3BqX3RjZF9yYXRlYWxsb2NhdGUoICBvcGpfdGNkX3QgKnRjZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5mb190ICpjc3RyX2luZm8pCit2b2lkIG9wal90Y2RfbWFrZWxheWVyKG9wal90Y2RfdCAqdGNkLAorICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxheW5vLAorICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQ2NCB0aHJlc2gsCisgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgZmluYWwpCiB7Ci0gICAgICAgIE9QSl9VSU5UMzIgY29tcG5vLCByZXNubywgYmFuZG5vLCBwcmVjbm8sIGNibGtubywgbGF5bm87Ci0gICAgICAgIE9QSl9VSU5UMzIgcGFzc25vOwotICAgICAgICBPUEpfRkxPQVQ2NCBtaW4sIG1heDsKLSAgICAgICAgT1BKX0ZMT0FUNjQgY3VtZGlzdG9bMTAwXTsgICAgICAvKiBmaXhlZF9xdWFsaXR5ICovCi0gICAgICAgIGNvbnN0IE9QSl9GTE9BVDY0IEsgPSAxOyAgICAgICAgICAgICAgICAvKiAxLjE7IGZpeGVkX3F1YWxpdHkgKi8KLSAgICAgICAgT1BKX0ZMT0FUNjQgbWF4U0UgPSAwOworICAgIE9QSl9VSU5UMzIgY29tcG5vLCByZXNubywgYmFuZG5vLCBwcmVjbm8sIGNibGtubzsKKyAgICBPUEpfVUlOVDMyIHBhc3NubzsKIAotICAgICAgICBvcGpfY3BfdCAqY3AgPSB0Y2QtPmNwOwotICAgICAgICBvcGpfdGNkX3RpbGVfdCAqdGNkX3RpbGUgPSB0Y2QtPnRjZF9pbWFnZS0+dGlsZXM7Ci0gICAgICAgIG9wal90Y3BfdCAqdGNkX3RjcCA9IHRjZC0+dGNwOworICAgIG9wal90Y2RfdGlsZV90ICp0Y2RfdGlsZSA9IHRjZC0+dGNkX2ltYWdlLT50aWxlczsKIAotICAgICAgICBtaW4gPSBEQkxfTUFYOwotICAgICAgICBtYXggPSAwOworICAgIHRjZF90aWxlLT5kaXN0b2xheWVyW2xheW5vXSA9IDA7ICAgICAgICAvKiBmaXhlZF9xdWFsaXR5ICovCiAKLSAgICAgICAgdGNkX3RpbGUtPm51bXBpeCA9IDA7ICAgICAgICAgICAvKiBmaXhlZF9xdWFsaXR5ICovCisgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCB0Y2RfdGlsZS0+bnVtY29tcHM7IGNvbXBubysrKSB7CisgICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqdGlsZWMgPSAmdGNkX3RpbGUtPmNvbXBzW2NvbXBub107CiAKLSAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCB0Y2RfdGlsZS0+bnVtY29tcHM7IGNvbXBubysrKSB7Ci0gICAgICAgICAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICp0aWxlYyA9ICZ0Y2RfdGlsZS0+Y29tcHNbY29tcG5vXTsKLSAgICAgICAgICAgICAgICB0aWxlYy0+bnVtcGl4ID0gMDsKKyAgICAgICAgZm9yIChyZXNubyA9IDA7IHJlc25vIDwgdGlsZWMtPm51bXJlc29sdXRpb25zOyByZXNubysrKSB7CisgICAgICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCAqcmVzID0gJnRpbGVjLT5yZXNvbHV0aW9uc1tyZXNub107CiAKLSAgICAgICAgICAgICAgICBmb3IgKHJlc25vID0gMDsgcmVzbm8gPCB0aWxlYy0+bnVtcmVzb2x1dGlvbnM7IHJlc25vKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90ICpyZXMgPSAmdGlsZWMtPnJlc29sdXRpb25zW3Jlc25vXTsKKyAgICAgICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgcmVzLT5udW1iYW5kczsgYmFuZG5vKyspIHsKKyAgICAgICAgICAgICAgICBvcGpfdGNkX2JhbmRfdCAqYmFuZCA9ICZyZXMtPmJhbmRzW2JhbmRub107CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgcmVzLT5udW1iYW5kczsgYmFuZG5vKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9iYW5kX3QgKmJhbmQgPSAmcmVzLT5iYW5kc1tiYW5kbm9dOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocHJlY25vID0gMDsgcHJlY25vIDwgcmVzLT5wdyAqIHJlcy0+cGg7IHByZWNubysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9wcmVjaW5jdF90ICpwcmMgPSAmYmFuZC0+cHJlY2luY3RzW3ByZWNub107Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IHByYy0+Y3cgKiBwcmMtPmNoOyBjYmxrbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9jYmxrX2VuY190ICpjYmxrID0gJnByYy0+Y2Jsa3MuZW5jW2NibGtub107Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocGFzc25vID0gMDsgcGFzc25vIDwgY2Jsay0+dG90YWxwYXNzZXM7IHBhc3NubysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfcGFzc190ICpwYXNzID0gJmNibGstPnBhc3Nlc1twYXNzbm9dOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgZHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9GTE9BVDY0IGRkLCByZHNsb3BlOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzbm8gPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyID0gKE9QSl9JTlQzMilwYXNzLT5yYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkID0gcGFzcy0+ZGlzdG9ydGlvbmRlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkciA9IChPUEpfSU5UMzIpKHBhc3MtPnJhdGUgLSBjYmxrLT5wYXNzZXNbcGFzc25vIC0gMV0ucmF0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGQgPSBwYXNzLT5kaXN0b3J0aW9uZGVjIC0gY2Jsay0+cGFzc2VzW3Bhc3NubyAtIDFdLmRpc3RvcnRpb25kZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHIgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmRzbG9wZSA9IGRkIC8gZHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZHNsb3BlIDwgbWluKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluID0gcmRzbG9wZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZHNsb3BlID4gbWF4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gcmRzbG9wZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBwYXNzbm8gKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWRfcXVhbGl0eSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNkX3RpbGUtPm51bXBpeCArPSAoKGNibGstPngxIC0gY2Jsay0+eDApICogKGNibGstPnkxIC0gY2Jsay0+eTApKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVjLT5udW1waXggKz0gKChjYmxrLT54MSAtIGNibGstPngwKSAqIChjYmxrLT55MSAtIGNibGstPnkwKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBjYmtsbm8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBwcmVjbm8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogYmFuZG5vICovCi0gICAgICAgICAgICAgICAgfSAvKiByZXNubyAqLwotCi0gICAgICAgICAgICAgICAgbWF4U0UgKz0gKCgoT1BKX0ZMT0FUNjQpKDEgPDwgdGNkLT5pbWFnZS0+Y29tcHNbY29tcG5vXS5wcmVjKSAtIDEuMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICogKChPUEpfRkxPQVQ2NCkoMSA8PCB0Y2QtPmltYWdlLT5jb21wc1tjb21wbm9dLnByZWMpIC0xLjApKQotICAgICAgICAgICAgICAgICAgICAgICAgKiAoKE9QSl9GTE9BVDY0KSh0aWxlYy0+bnVtcGl4KSk7Ci0gICAgICAgIH0gLyogY29tcG5vICovCi0KLSAgICAgICAgLyogaW5kZXggZmlsZSAqLwotICAgICAgICBpZihjc3RyX2luZm8pIHsKLSAgICAgICAgICAgICAgICBvcGpfdGlsZV9pbmZvX3QgKnRpbGVfaW5mbyA9ICZjc3RyX2luZm8tPnRpbGVbdGNkLT50Y2RfdGlsZW5vXTsKLSAgICAgICAgICAgICAgICB0aWxlX2luZm8tPm51bXBpeCA9IHRjZF90aWxlLT5udW1waXg7Ci0gICAgICAgICAgICAgICAgdGlsZV9pbmZvLT5kaXN0b3RpbGUgPSB0Y2RfdGlsZS0+ZGlzdG90aWxlOwotICAgICAgICAgICAgICAgIHRpbGVfaW5mby0+dGhyZXNoID0gKE9QSl9GTE9BVDY0ICopIG9wal9tYWxsb2ModGNkX3RjcC0+bnVtbGF5ZXJzICogc2l6ZW9mKE9QSl9GTE9BVDY0KSk7Ci0gICAgICAgICAgICAgICAgaWYgKCF0aWxlX2luZm8tPnRocmVzaCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogRklYTUUgZXZlbnQgbWFuYWdlciBlcnJvciBjYWxsYmFjayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAvKiBTa2lwIGVtcHR5IGJhbmRzICovCisgICAgICAgICAgICAgICAgaWYgKG9wal90Y2RfaXNfYmFuZF9lbXB0eShiYW5kKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KIAotICAgICAgICBmb3IgKGxheW5vID0gMDsgbGF5bm8gPCB0Y2RfdGNwLT5udW1sYXllcnM7IGxheW5vKyspIHsKLSAgICAgICAgICAgICAgICBPUEpfRkxPQVQ2NCBsbyA9IG1pbjsKLSAgICAgICAgICAgICAgICBPUEpfRkxPQVQ2NCBoaSA9IG1heDsKLSAgICAgICAgICAgICAgICBPUEpfQk9PTCBzdWNjZXNzID0gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbWF4bGVuID0gdGNkX3RjcC0+cmF0ZXNbbGF5bm9dID8gb3BqX3VpbnRfbWluKCgoT1BKX1VJTlQzMikgY2VpbCh0Y2RfdGNwLT5yYXRlc1tsYXlub10pKSwgbGVuKSA6IGxlbjsKLSAgICAgICAgICAgICAgICBPUEpfRkxPQVQ2NCBnb29kdGhyZXNoID0gMDsKLSAgICAgICAgICAgICAgICBPUEpfRkxPQVQ2NCBzdGFibGVfdGhyZXNoID0gMDsKLSAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgICAgICAgICAgT1BKX0ZMT0FUNjQgZGlzdG90YXJnZXQ7ICAgICAgICAgICAgICAgIC8qIGZpeGVkX3F1YWxpdHkgKi8KKyAgICAgICAgICAgICAgICBmb3IgKHByZWNubyA9IDA7IHByZWNubyA8IHJlcy0+cHcgKiByZXMtPnBoOyBwcmVjbm8rKykgeworICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3ByZWNpbmN0X3QgKnByYyA9ICZiYW5kLT5wcmVjaW5jdHNbcHJlY25vXTsKIAotICAgICAgICAgICAgICAgIC8qIGZpeGVkX3F1YWxpdHkgKi8KLSAgICAgICAgICAgICAgICBkaXN0b3RhcmdldCA9IHRjZF90aWxlLT5kaXN0b3RpbGUgLSAoKEsgKiBtYXhTRSkgLyBwb3coKE9QSl9GTE9BVDMyKTEwLCB0Y2RfdGNwLT5kaXN0b3JhdGlvW2xheW5vXSAvIDEwKSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgcHJjLT5jdyAqIHByYy0+Y2g7IGNibGtubysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX2NibGtfZW5jX3QgKmNibGsgPSAmcHJjLT5jYmxrcy5lbmNbY2Jsa25vXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfbGF5ZXJfdCAqbGF5ZXIgPSAmY2Jsay0+bGF5ZXJzW2xheW5vXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbjsKIAotICAgICAgICAgICAgICAgIC8qIERvbid0IHRyeSB0byBmaW5kIGFuIG9wdGltYWwgdGhyZXNob2xkIGJ1dCByYXRoZXIgdGFrZSBldmVyeXRoaW5nIG5vdCBpbmNsdWRlZCB5ZXQsIGlmCi0gICAgICAgICAgICAgICAgICAtciB4eCx5eSx6eiwwICAgKGRpc3RvX2FsbG9jID09IDEgYW5kIHJhdGVzID09IDApCi0gICAgICAgICAgICAgICAgICAtcSB4eCx5eSx6eiwwICAgKGZpeGVkX3F1YWxpdHkgPT0gMSBhbmQgZGlzdG9yYXRpbyA9PSAwKQotICAgICAgICAgICAgICAgICAgPT0+IHBvc3NpYmxlIHRvIGhhdmUgc29tZSBsb3NzeSBsYXllcnMgYW5kIHRoZSBsYXN0IGxheWVyIGZvciBzdXJlIGxvc3NsZXNzICovCi0gICAgICAgICAgICAgICAgaWYgKCAoKGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fZGlzdG9fYWxsb2M9PTEpICYmICh0Y2RfdGNwLT5yYXRlc1tsYXlub10+MCkpIHx8ICgoY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9maXhlZF9xdWFsaXR5PT0xKSAmJiAodGNkX3RjcC0+ZGlzdG9yYXRpb1tsYXlub10+MCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDJfdCp0MiA9IG9wal90Ml9jcmVhdGUodGNkLT5pbWFnZSwgY3ApOwotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUNjQgdGhyZXNoID0gMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQyID09IDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF5bm8gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPm51bXBhc3Nlc2lubGF5ZXJzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgZm9yICAgICAoaSA9IDA7IGkgPCAxMjg7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQ2NCBkaXN0b2FjaGlldmVkID0gMDsgIC8qIGZpeGVkX3F1YWxpdHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBjYmxrLT5udW1wYXNzZXNpbmxheWVyczsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2ggPSAobG8gKyBoaSkgLyAyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVzaCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTcGVjaWFsIHZhbHVlIHRvIGluZGljYXRlIHRvIHVzZSBhbGwgcGFzc2VzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGNibGstPnRvdGFscGFzc2VzOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHBhc3NubyA9IGNibGstPm51bXBhc3Nlc2lubGF5ZXJzOyBwYXNzbm8gPCBjYmxrLT50b3RhbHBhc3NlczsgcGFzc25vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBkcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUNjQgZGQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfcGFzc190ICpwYXNzID0gJmNibGstPnBhc3Nlc1twYXNzbm9dOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfbWFrZWxheWVyKHRjZCwgbGF5bm8sIHRocmVzaCwgMCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fZml4ZWRfcXVhbGl0eSkgeyAgICAgICAvKiBmaXhlZF9xdWFsaXR5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoT1BKX0lTX0NJTkVNQShjcC0+cnNpeikpewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3QyX2VuY29kZV9wYWNrZXRzKHQyLHRjZC0+dGNkX3RpbGVubywgdGNkX3RpbGUsIGxheW5vICsgMSwgZGVzdCwgcF9kYXRhX3dyaXR0ZW4sIG1heGxlbiwgY3N0cl9pbmZvLHRjZC0+Y3VyX3RwX251bSx0Y2QtPnRwX3Bvcyx0Y2QtPmN1cl9waW5vLFRIUkVTSF9DQUxDKSkgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvID0gdGhyZXNoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0b2FjaGlldmVkID0gbGF5bm8gPT0gMCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Y2RfdGlsZS0+ZGlzdG9sYXllclswXSA6IGN1bWRpc3RvW2xheW5vIC0gMV0gKyB0Y2RfdGlsZS0+ZGlzdG9sYXllcltsYXlub107Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3RvYWNoaWV2ZWQgPCBkaXN0b3RhcmdldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpPXRocmVzaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFibGVfdGhyZXNoID0gdGhyZXNoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbz10aHJlc2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RvYWNoaWV2ZWQgPSAobGF5bm8gPT0gMCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZF90aWxlLT5kaXN0b2xheWVyWzBdIDogKGN1bWRpc3RvW2xheW5vIC0gMV0gKyB0Y2RfdGlsZS0+ZGlzdG9sYXllcltsYXlub10pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlzdG9hY2hpZXZlZCA8IGRpc3RvdGFyZ2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpID0gdGhyZXNoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFibGVfdGhyZXNoID0gdGhyZXNoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvID0gdGhyZXNoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHIgPSBwYXNzLT5yYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGQgPSBwYXNzLT5kaXN0b3J0aW9uZGVjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal90Ml9lbmNvZGVfcGFja2V0cyh0MiwgdGNkLT50Y2RfdGlsZW5vLCB0Y2RfdGlsZSwgbGF5bm8gKyAxLCBkZXN0LHBfZGF0YV93cml0dGVuLCBtYXhsZW4sIGNzdHJfaW5mbyx0Y2QtPmN1cl90cF9udW0sdGNkLT50cF9wb3MsdGNkLT5jdXJfcGlubyxUSFJFU0hfQ0FMQykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETzogd2hhdCB0byBkbyB3aXRoIGwgPz8/IHNlZWsgLyB0ZWxsID8/PyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3BqX2V2ZW50X21zZyh0Y2QtPmNpbmZvLCBFVlRfSU5GTywgInJhdGUgYWxsb2M6IGxlbj0lZCwgbWF4PSVkXG4iLCBsLCBtYXhsZW4pOyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG8gPSB0aHJlc2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaSA9IHRocmVzaDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFibGVfdGhyZXNoID0gdGhyZXNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHIgPSBwYXNzLT5yYXRlIC0gY2Jsay0+cGFzc2VzW24gLSAxXS5yYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGQgPSBwYXNzLT5kaXN0b3J0aW9uZGVjIC0gY2Jsay0+cGFzc2VzW24gLSAxXS5kaXN0b3J0aW9uZGVjOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRkICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gcGFzc25vICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlc2ggLSAoZGQgLyBkcikgPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCTF9FUFNJTE9OKSB7IC8qIGRvIG5vdCByZWx5IG9uIGZsb2F0IGVxdWFsaXR5LCBjaGVjayB3aXRoIERCTF9FUFNJTE9OIG1hcmdpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHBhc3NubyArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBPUEpfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvb2R0aHJlc2ggPSBzdGFibGVfdGhyZXNoID09IDA/IHRocmVzaCA6IHN0YWJsZV90aHJlc2g7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXllci0+bnVtcGFzc2VzID0gbiAtIGNibGstPm51bXBhc3Nlc2lubGF5ZXJzOwogCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdDJfZGVzdHJveSh0Mik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBPUEpfVFJVRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdvb2R0aHJlc2ggPSBtaW47CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxheWVyLT5udW1wYXNzZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci0+ZGlzdG8gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2Jsay0+bnVtcGFzc2VzaW5sYXllcnMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5sZW4gPSBjYmxrLT5wYXNzZXNbbiAtIDFdLnJhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmRhdGEgPSBjYmxrLT5kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5kaXN0byA9IGNibGstPnBhc3Nlc1tuIC0gMV0uZGlzdG9ydGlvbmRlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmxlbiA9IGNibGstPnBhc3Nlc1tuIC0gMV0ucmF0ZSAtIGNibGstPnBhc3Nlc1tjYmxrLT5udW1wYXNzZXNpbmxheWVycyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFdLnJhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmRhdGEgPSBjYmxrLT5kYXRhICsgY2Jsay0+cGFzc2VzW2NibGstPm51bXBhc3Nlc2lubGF5ZXJzIC0gMV0ucmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci0+ZGlzdG8gPSBjYmxrLT5wYXNzZXNbbiAtIDFdLmRpc3RvcnRpb25kZWMgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPnBhc3Nlc1tjYmxrLT5udW1wYXNzZXNpbmxheWVycyAtIDFdLmRpc3RvcnRpb25kZWM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRjZF90aWxlLT5kaXN0b2xheWVyW2xheW5vXSArPSBsYXllci0+ZGlzdG87ICAgIC8qIGZpeGVkX3F1YWxpdHkgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jsay0+bnVtcGFzc2VzaW5sYXllcnMgPSBuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmKGNzdHJfaW5mbykgeyAvKiBUaHJlc2hvbGQgZm9yIE1hcmNlbGEgSW5kZXggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGNzdHJfaW5mby0+dGlsZVt0Y2QtPnRjZF90aWxlbm9dLnRocmVzaFtsYXlub10gPSBnb29kdGhyZXNoOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG9wal90Y2RfbWFrZWxheWVyKHRjZCwgbGF5bm8sIGdvb2R0aHJlc2gsIDEpOwotCi0gICAgICAgICAgICAgICAgLyogZml4ZWRfcXVhbGl0eSAqLwotICAgICAgICAgICAgICAgIGN1bWRpc3RvW2xheW5vXSA9IChsYXlubyA9PSAwKSA/IHRjZF90aWxlLT5kaXN0b2xheWVyWzBdIDogKGN1bWRpc3RvW2xheW5vIC0gMV0gKyB0Y2RfdGlsZS0+ZGlzdG9sYXllcltsYXlub10pOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIH0KIH0KIAotT1BKX0JPT0wgb3BqX3RjZF9pbml0KCBvcGpfdGNkX3QgKnBfdGNkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9pbWFnZV90ICogcF9pbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY3BfdCAqIHBfY3AgKQordm9pZCBvcGpfdGNkX21ha2VsYXllcl9maXhlZChvcGpfdGNkX3QgKnRjZCwgT1BKX1VJTlQzMiBsYXlubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBmaW5hbCkKIHsKLSAgICAgICAgcF90Y2QtPmltYWdlID0gcF9pbWFnZTsKLSAgICAgICAgcF90Y2QtPmNwID0gcF9jcDsKKyAgICBPUEpfVUlOVDMyIGNvbXBubywgcmVzbm8sIGJhbmRubywgcHJlY25vLCBjYmxrbm87CisgICAgT1BKX0lOVDMyIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qLCBtYXRyaWNlW3RjZF90Y3AtPm51bWxheWVyc11bdGNkX3RpbGUtPmNvbXBzWzBdLm51bXJlc29sdXRpb25zXVszXTsgKi8KKyAgICBPUEpfSU5UMzIgbWF0cmljZVsxMF1bMTBdWzNdOworICAgIE9QSl9VSU5UMzIgaSwgaiwgazsKIAotICAgICAgICBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcyA9IChvcGpfdGNkX3RpbGVfdCAqKSBvcGpfY2FsbG9jKDEsc2l6ZW9mKG9wal90Y2RfdGlsZV90KSk7Ci0gICAgICAgIGlmICghIHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICBvcGpfY3BfdCAqY3AgPSB0Y2QtPmNwOworICAgIG9wal90Y2RfdGlsZV90ICp0Y2RfdGlsZSA9IHRjZC0+dGNkX2ltYWdlLT50aWxlczsKKyAgICBvcGpfdGNwX3QgKnRjZF90Y3AgPSB0Y2QtPnRjcDsKKworICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgdGNkX3RpbGUtPm51bWNvbXBzOyBjb21wbm8rKykgeworICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKnRpbGVjID0gJnRjZF90aWxlLT5jb21wc1tjb21wbm9dOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0Y2RfdGNwLT5udW1sYXllcnM7IGkrKykgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHRpbGVjLT5udW1yZXNvbHV0aW9uczsgaisrKSB7CisgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDM7IGsrKykgeworICAgICAgICAgICAgICAgICAgICBtYXRyaWNlW2ldW2pdW2tdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfSU5UMzIpKChPUEpfRkxPQVQzMiljcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX21hdHJpY2VbaSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVjLT5udW1yZXNvbHV0aW9ucyAqIDMgKyBqICogMyArIGtdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChPUEpfRkxPQVQzMikodGNkLT5pbWFnZS0+Y29tcHNbY29tcG5vXS5wcmVjIC8gMTYuMCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5jb21wcyA9IChvcGpfdGNkX3RpbGVjb21wX3QgKikgb3BqX2NhbGxvYyhwX2ltYWdlLT5udW1jb21wcyxzaXplb2Yob3BqX3RjZF90aWxlY29tcF90KSk7Ci0gICAgICAgIGlmICghIHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5jb21wcyApIHsKKyAgICAgICAgZm9yIChyZXNubyA9IDA7IHJlc25vIDwgdGlsZWMtPm51bXJlc29sdXRpb25zOyByZXNubysrKSB7CisgICAgICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCAqcmVzID0gJnRpbGVjLT5yZXNvbHV0aW9uc1tyZXNub107CisKKyAgICAgICAgICAgIGZvciAoYmFuZG5vID0gMDsgYmFuZG5vIDwgcmVzLT5udW1iYW5kczsgYmFuZG5vKyspIHsKKyAgICAgICAgICAgICAgICBvcGpfdGNkX2JhbmRfdCAqYmFuZCA9ICZyZXMtPmJhbmRzW2JhbmRub107CisKKyAgICAgICAgICAgICAgICAvKiBTa2lwIGVtcHR5IGJhbmRzICovCisgICAgICAgICAgICAgICAgaWYgKG9wal90Y2RfaXNfYmFuZF9lbXB0eShiYW5kKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKHByZWNubyA9IDA7IHByZWNubyA8IHJlcy0+cHcgKiByZXMtPnBoOyBwcmVjbm8rKykgeworICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3ByZWNpbmN0X3QgKnByYyA9ICZiYW5kLT5wcmVjaW5jdHNbcHJlY25vXTsKKworICAgICAgICAgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IHByYy0+Y3cgKiBwcmMtPmNoOyBjYmxrbm8rKykgeworICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9jYmxrX2VuY190ICpjYmxrID0gJnByYy0+Y2Jsa3MuZW5jW2NibGtub107CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX2xheWVyX3QgKmxheWVyID0gJmNibGstPmxheWVyc1tsYXlub107CisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIG47CisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgaW1zYiA9IChPUEpfSU5UMzIpKHRjZC0+aW1hZ2UtPmNvbXBzW2NvbXBub10ucHJlYyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNibGstPm51bWJwcyk7IC8qIG51bWJlciBvZiBiaXQtcGxhbiBlcXVhbCB0byB6ZXJvICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvcnJlY3Rpb24gb2YgdGhlIG1hdHJpeCBvZiBjb2VmZmljaWVudCB0byBpbmNsdWRlIHRoZSBJTVNCIGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF5bm8gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gbWF0cmljZVtsYXlub11bcmVzbm9dW2JhbmRub107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltc2IgPj0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIC09IGltc2I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1hdHJpY2VbbGF5bm9dW3Jlc25vXVtiYW5kbm9dIC0gbWF0cmljZVtsYXlubyAtIDFdW3Jlc25vXVtiYW5kbm9dOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbXNiID49IG1hdHJpY2VbbGF5bm8gLSAxXVtyZXNub11bYmFuZG5vXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSAtPSAoaW1zYiAtIG1hdHJpY2VbbGF5bm8gLSAxXVtyZXNub11bYmFuZG5vXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxheW5vID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT5udW1wYXNzZXNpbmxheWVycyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBjYmxrLT5udW1wYXNzZXNpbmxheWVyczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYmxrLT5udW1wYXNzZXNpbmxheWVycyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IDMgKiAoT1BKX1VJTlQzMil2YWx1ZSAtIDIgKyBjYmxrLT5udW1wYXNzZXNpbmxheWVyczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gY2Jsay0+bnVtcGFzc2VzaW5sYXllcnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gMyAqIChPUEpfVUlOVDMyKXZhbHVlICsgY2Jsay0+bnVtcGFzc2VzaW5sYXllcnM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5udW1wYXNzZXMgPSBuIC0gY2Jsay0+bnVtcGFzc2VzaW5sYXllcnM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGF5ZXItPm51bXBhc3NlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2Jsay0+bnVtcGFzc2VzaW5sYXllcnMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyLT5sZW4gPSBjYmxrLT5wYXNzZXNbbiAtIDFdLnJhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXItPmRhdGEgPSBjYmxrLT5kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci0+bGVuID0gY2Jsay0+cGFzc2VzW24gLSAxXS5yYXRlIC0gY2Jsay0+cGFzc2VzW2NibGstPm51bXBhc3Nlc2lubGF5ZXJzIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMV0ucmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllci0+ZGF0YSA9IGNibGstPmRhdGEgKyBjYmxrLT5wYXNzZXNbY2Jsay0+bnVtcGFzc2VzaW5sYXllcnMgLSAxXS5yYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluYWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmxrLT5udW1wYXNzZXNpbmxheWVycyA9IG47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK09QSl9CT09MIG9wal90Y2RfcmF0ZWFsbG9jYXRlKG9wal90Y2RfdCAqdGNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKmRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqY3N0cl9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpCit7CisgICAgT1BKX1VJTlQzMiBjb21wbm8sIHJlc25vLCBiYW5kbm8sIHByZWNubywgY2Jsa25vLCBsYXlubzsKKyAgICBPUEpfVUlOVDMyIHBhc3NubzsKKyAgICBPUEpfRkxPQVQ2NCBtaW4sIG1heDsKKyAgICBPUEpfRkxPQVQ2NCBjdW1kaXN0b1sxMDBdOyAgICAgIC8qIGZpeGVkX3F1YWxpdHkgKi8KKyAgICBjb25zdCBPUEpfRkxPQVQ2NCBLID0gMTsgICAgICAgICAgICAgICAgLyogMS4xOyBmaXhlZF9xdWFsaXR5ICovCisgICAgT1BKX0ZMT0FUNjQgbWF4U0UgPSAwOworCisgICAgb3BqX2NwX3QgKmNwID0gdGNkLT5jcDsKKyAgICBvcGpfdGNkX3RpbGVfdCAqdGNkX3RpbGUgPSB0Y2QtPnRjZF9pbWFnZS0+dGlsZXM7CisgICAgb3BqX3RjcF90ICp0Y2RfdGNwID0gdGNkLT50Y3A7CisKKyAgICBtaW4gPSBEQkxfTUFYOworICAgIG1heCA9IDA7CisKKyAgICB0Y2RfdGlsZS0+bnVtcGl4ID0gMDsgICAgICAgICAgIC8qIGZpeGVkX3F1YWxpdHkgKi8KKworICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgdGNkX3RpbGUtPm51bWNvbXBzOyBjb21wbm8rKykgeworICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKnRpbGVjID0gJnRjZF90aWxlLT5jb21wc1tjb21wbm9dOworICAgICAgICB0aWxlYy0+bnVtcGl4ID0gMDsKKworICAgICAgICBmb3IgKHJlc25vID0gMDsgcmVzbm8gPCB0aWxlYy0+bnVtcmVzb2x1dGlvbnM7IHJlc25vKyspIHsKKyAgICAgICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90ICpyZXMgPSAmdGlsZWMtPnJlc29sdXRpb25zW3Jlc25vXTsKKworICAgICAgICAgICAgZm9yIChiYW5kbm8gPSAwOyBiYW5kbm8gPCByZXMtPm51bWJhbmRzOyBiYW5kbm8rKykgeworICAgICAgICAgICAgICAgIG9wal90Y2RfYmFuZF90ICpiYW5kID0gJnJlcy0+YmFuZHNbYmFuZG5vXTsKKworICAgICAgICAgICAgICAgIC8qIFNraXAgZW1wdHkgYmFuZHMgKi8KKyAgICAgICAgICAgICAgICBpZiAob3BqX3RjZF9pc19iYW5kX2VtcHR5KGJhbmQpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAocHJlY25vID0gMDsgcHJlY25vIDwgcmVzLT5wdyAqIHJlcy0+cGg7IHByZWNubysrKSB7CisgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfcHJlY2luY3RfdCAqcHJjID0gJmJhbmQtPnByZWNpbmN0c1twcmVjbm9dOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgcHJjLT5jdyAqIHByYy0+Y2g7IGNibGtubysrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX2NibGtfZW5jX3QgKmNibGsgPSAmcHJjLT5jYmxrcy5lbmNbY2Jsa25vXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChwYXNzbm8gPSAwOyBwYXNzbm8gPCBjYmxrLT50b3RhbHBhc3NlczsgcGFzc25vKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3Bhc3NfdCAqcGFzcyA9ICZjYmxrLT5wYXNzZXNbcGFzc25vXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgZHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUNjQgZGQsIHJkc2xvcGU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzc25vID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHIgPSAoT1BKX0lOVDMyKXBhc3MtPnJhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkID0gcGFzcy0+ZGlzdG9ydGlvbmRlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkciA9IChPUEpfSU5UMzIpKHBhc3MtPnJhdGUgLSBjYmxrLT5wYXNzZXNbcGFzc25vIC0gMV0ucmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRkID0gcGFzcy0+ZGlzdG9ydGlvbmRlYyAtIGNibGstPnBhc3Nlc1twYXNzbm8gLSAxXS5kaXN0b3J0aW9uZGVjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkciA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJkc2xvcGUgPSBkZCAvIGRyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZHNsb3BlIDwgbWluKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IHJkc2xvcGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJkc2xvcGUgPiBtYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gcmRzbG9wZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8qIHBhc3NubyAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXhlZF9xdWFsaXR5ICovCisgICAgICAgICAgICAgICAgICAgICAgICB0Y2RfdGlsZS0+bnVtcGl4ICs9ICgoY2Jsay0+eDEgLSBjYmxrLT54MCkgKiAoY2Jsay0+eTEgLSBjYmxrLT55MCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdGlsZWMtPm51bXBpeCArPSAoKGNibGstPngxIC0gY2Jsay0+eDApICogKGNibGstPnkxIC0gY2Jsay0+eTApKTsKKyAgICAgICAgICAgICAgICAgICAgfSAvKiBjYmtsbm8gKi8KKyAgICAgICAgICAgICAgICB9IC8qIHByZWNubyAqLworICAgICAgICAgICAgfSAvKiBiYW5kbm8gKi8KKyAgICAgICAgfSAvKiByZXNubyAqLworCisgICAgICAgIG1heFNFICs9ICgoKE9QSl9GTE9BVDY0KSgxIDw8IHRjZC0+aW1hZ2UtPmNvbXBzW2NvbXBub10ucHJlYykgLSAxLjApCisgICAgICAgICAgICAgICAgICAqICgoT1BKX0ZMT0FUNjQpKDEgPDwgdGNkLT5pbWFnZS0+Y29tcHNbY29tcG5vXS5wcmVjKSAtIDEuMCkpCisgICAgICAgICAgICAgICAgICogKChPUEpfRkxPQVQ2NCkodGlsZWMtPm51bXBpeCkpOworICAgIH0gLyogY29tcG5vICovCisKKyAgICAvKiBpbmRleCBmaWxlICovCisgICAgaWYgKGNzdHJfaW5mbykgeworICAgICAgICBvcGpfdGlsZV9pbmZvX3QgKnRpbGVfaW5mbyA9ICZjc3RyX2luZm8tPnRpbGVbdGNkLT50Y2RfdGlsZW5vXTsKKyAgICAgICAgdGlsZV9pbmZvLT5udW1waXggPSB0Y2RfdGlsZS0+bnVtcGl4OworICAgICAgICB0aWxlX2luZm8tPmRpc3RvdGlsZSA9IHRjZF90aWxlLT5kaXN0b3RpbGU7CisgICAgICAgIHRpbGVfaW5mby0+dGhyZXNoID0gKE9QSl9GTE9BVDY0ICopIG9wal9tYWxsb2ModGNkX3RjcC0+bnVtbGF5ZXJzICogc2l6ZW9mKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQ2NCkpOworICAgICAgICBpZiAoIXRpbGVfaW5mby0+dGhyZXNoKSB7CisgICAgICAgICAgICAvKiBGSVhNRSBldmVudCBtYW5hZ2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChsYXlubyA9IDA7IGxheW5vIDwgdGNkX3RjcC0+bnVtbGF5ZXJzOyBsYXlubysrKSB7CisgICAgICAgIE9QSl9GTE9BVDY0IGxvID0gbWluOworICAgICAgICBPUEpfRkxPQVQ2NCBoaSA9IG1heDsKKyAgICAgICAgT1BKX1VJTlQzMiBtYXhsZW4gPSB0Y2RfdGNwLT5yYXRlc1tsYXlub10gPiAwLjBmID8gb3BqX3VpbnRfbWluKCgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIpIGNlaWwodGNkX3RjcC0+cmF0ZXNbbGF5bm9dKSksIGxlbikgOiBsZW47CisgICAgICAgIE9QSl9GTE9BVDY0IGdvb2R0aHJlc2ggPSAwOworICAgICAgICBPUEpfRkxPQVQ2NCBzdGFibGVfdGhyZXNoID0gMDsKKyAgICAgICAgT1BKX1VJTlQzMiBpOworICAgICAgICBPUEpfRkxPQVQ2NCBkaXN0b3RhcmdldDsgICAgICAgICAgICAgICAgLyogZml4ZWRfcXVhbGl0eSAqLworCisgICAgICAgIC8qIGZpeGVkX3F1YWxpdHkgKi8KKyAgICAgICAgZGlzdG90YXJnZXQgPSB0Y2RfdGlsZS0+ZGlzdG90aWxlIC0gKChLICogbWF4U0UpIC8gcG93KChPUEpfRkxPQVQzMikxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRjZF90Y3AtPmRpc3RvcmF0aW9bbGF5bm9dIC8gMTApKTsKKworICAgICAgICAvKiBEb24ndCB0cnkgdG8gZmluZCBhbiBvcHRpbWFsIHRocmVzaG9sZCBidXQgcmF0aGVyIHRha2UgZXZlcnl0aGluZyBub3QgaW5jbHVkZWQgeWV0LCBpZgorICAgICAgICAgIC1yIHh4LHl5LHp6LDAgICAoZGlzdG9fYWxsb2MgPT0gMSBhbmQgcmF0ZXMgPT0gMCkKKyAgICAgICAgICAtcSB4eCx5eSx6eiwwICAgKGZpeGVkX3F1YWxpdHkgPT0gMSBhbmQgZGlzdG9yYXRpbyA9PSAwKQorICAgICAgICAgID09PiBwb3NzaWJsZSB0byBoYXZlIHNvbWUgbG9zc3kgbGF5ZXJzIGFuZCB0aGUgbGFzdCBsYXllciBmb3Igc3VyZSBsb3NzbGVzcyAqLworICAgICAgICBpZiAoKChjcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX2Rpc3RvX2FsbG9jID09IDEpICYmCisgICAgICAgICAgICAgICAgKHRjZF90Y3AtPnJhdGVzW2xheW5vXSA+IDAuMGYpKSB8fAorICAgICAgICAgICAgICAgICgoY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9maXhlZF9xdWFsaXR5ID09IDEpICYmCisgICAgICAgICAgICAgICAgICh0Y2RfdGNwLT5kaXN0b3JhdGlvW2xheW5vXSA+IDAuMCkpKSB7CisgICAgICAgICAgICBvcGpfdDJfdCp0MiA9IG9wal90Ml9jcmVhdGUodGNkLT5pbWFnZSwgY3ApOworICAgICAgICAgICAgT1BKX0ZMT0FUNjQgdGhyZXNoID0gMDsKKworICAgICAgICAgICAgaWYgKHQyID09IDAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyODsgKytpKSB7CisgICAgICAgICAgICAgICAgT1BKX0ZMT0FUNjQgZGlzdG9hY2hpZXZlZCA9IDA7ICAvKiBmaXhlZF9xdWFsaXR5ICovCisKKyAgICAgICAgICAgICAgICB0aHJlc2ggPSAobG8gKyBoaSkgLyAyOworCisgICAgICAgICAgICAgICAgb3BqX3RjZF9tYWtlbGF5ZXIodGNkLCBsYXlubywgdGhyZXNoLCAwKTsKKworICAgICAgICAgICAgICAgIGlmIChjcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX2ZpeGVkX3F1YWxpdHkpIHsgICAgICAgLyogZml4ZWRfcXVhbGl0eSAqLworICAgICAgICAgICAgICAgICAgICBpZiAoT1BKX0lTX0NJTkVNQShjcC0+cnNpeikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal90Ml9lbmNvZGVfcGFja2V0cyh0MiwgdGNkLT50Y2RfdGlsZW5vLCB0Y2RfdGlsZSwgbGF5bm8gKyAxLCBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YV93cml0dGVuLCBtYXhsZW4sIGNzdHJfaW5mbywgdGNkLT5jdXJfdHBfbnVtLCB0Y2QtPnRwX3BvcywgdGNkLT5jdXJfcGlubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSFJFU0hfQ0FMQywgcF9tYW5hZ2VyKSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG8gPSB0aHJlc2g7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RvYWNoaWV2ZWQgPSBsYXlubyA9PSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNkX3RpbGUtPmRpc3RvbGF5ZXJbMF0gOiBjdW1kaXN0b1tsYXlubyAtIDFdICsgdGNkX3RpbGUtPmRpc3RvbGF5ZXJbbGF5bm9dOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3RvYWNoaWV2ZWQgPCBkaXN0b3RhcmdldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaSA9IHRocmVzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhYmxlX3RocmVzaCA9IHRocmVzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG8gPSB0aHJlc2g7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZGlzdG9hY2hpZXZlZCA9IChsYXlubyA9PSAwKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGNkX3RpbGUtPmRpc3RvbGF5ZXJbMF0gOiAoY3VtZGlzdG9bbGF5bm8gLSAxXSArIHRjZF90aWxlLT5kaXN0b2xheWVyW2xheW5vXSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXN0b2FjaGlldmVkIDwgZGlzdG90YXJnZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaSA9IHRocmVzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFibGVfdGhyZXNoID0gdGhyZXNoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbG8gPSB0aHJlc2g7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfdDJfZW5jb2RlX3BhY2tldHModDIsIHRjZC0+dGNkX3RpbGVubywgdGNkX3RpbGUsIGxheW5vICsgMSwgZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YV93cml0dGVuLCBtYXhsZW4sIGNzdHJfaW5mbywgdGNkLT5jdXJfdHBfbnVtLCB0Y2QtPnRwX3BvcywgdGNkLT5jdXJfcGlubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRIUkVTSF9DQUxDLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUT0RPOiB3aGF0IHRvIGRvIHdpdGggbCA/Pz8gc2VlayAvIHRlbGwgPz8/ICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGpfZXZlbnRfbXNnKHRjZC0+Y2luZm8sIEVWVF9JTkZPLCAicmF0ZSBhbGxvYzogbGVuPSVkLCBtYXg9JWRcbiIsIGwsIG1heGxlbik7ICovCisgICAgICAgICAgICAgICAgICAgICAgICBsbyA9IHRocmVzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaGkgPSB0aHJlc2g7CisgICAgICAgICAgICAgICAgICAgIHN0YWJsZV90aHJlc2ggPSB0aHJlc2g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnb29kdGhyZXNoID0gc3RhYmxlX3RocmVzaCA9PSAwID8gdGhyZXNoIDogc3RhYmxlX3RocmVzaDsKKworICAgICAgICAgICAgb3BqX3QyX2Rlc3Ryb3kodDIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogU3BlY2lhbCB2YWx1ZSB0byBpbmRpY2F0ZSB0byB1c2UgYWxsIHBhc3NlcyAqLworICAgICAgICAgICAgZ29vZHRocmVzaCA9IC0xOwogICAgICAgICB9CiAKLSAgICAgICAgcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPm51bWNvbXBzID0gcF9pbWFnZS0+bnVtY29tcHM7Ci0gICAgICAgIHBfdGNkLT50cF9wb3MgPSBwX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fdHBfcG9zOworICAgICAgICBpZiAoY3N0cl9pbmZvKSB7IC8qIFRocmVzaG9sZCBmb3IgTWFyY2VsYSBJbmRleCAqLworICAgICAgICAgICAgY3N0cl9pbmZvLT50aWxlW3RjZC0+dGNkX3RpbGVub10udGhyZXNoW2xheW5vXSA9IGdvb2R0aHJlc2g7CisgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgIG9wal90Y2RfbWFrZWxheWVyKHRjZCwgbGF5bm8sIGdvb2R0aHJlc2gsIDEpOworCisgICAgICAgIC8qIGZpeGVkX3F1YWxpdHkgKi8KKyAgICAgICAgY3VtZGlzdG9bbGF5bm9dID0gKGxheW5vID09IDApID8gdGNkX3RpbGUtPmRpc3RvbGF5ZXJbMF0gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAoY3VtZGlzdG9bbGF5bm8gLSAxXSArIHRjZF90aWxlLT5kaXN0b2xheWVyW2xheW5vXSk7CisgICAgfQorCisgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitPUEpfQk9PTCBvcGpfdGNkX2luaXQob3BqX3RjZF90ICpwX3RjZCwKKyAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqIHBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwX3QgKiBwX2NwLAorICAgICAgICAgICAgICAgICAgICAgIG9wal90aHJlYWRfcG9vbF90KiBwX3RwKQoreworICAgIHBfdGNkLT5pbWFnZSA9IHBfaW1hZ2U7CisgICAgcF90Y2QtPmNwID0gcF9jcDsKKworICAgIHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzID0gKG9wal90Y2RfdGlsZV90ICopIG9wal9jYWxsb2MoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvcGpfdGNkX3RpbGVfdCkpOworICAgIGlmICghIHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzID0gKG9wal90Y2RfdGlsZWNvbXBfdCAqKSBvcGpfY2FsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2ltYWdlLT5udW1jb21wcywgc2l6ZW9mKG9wal90Y2RfdGlsZWNvbXBfdCkpOworICAgIGlmICghIHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5jb21wcykgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5udW1jb21wcyA9IHBfaW1hZ2UtPm51bWNvbXBzOworICAgIHBfdGNkLT50cF9wb3MgPSBwX2NwLT5tX3NwZWNpZmljX3BhcmFtLm1fZW5jLm1fdHBfcG9zOworICAgIHBfdGNkLT50aHJlYWRfcG9vbCA9IHBfdHA7CisKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKIC8qKgogRGVzdHJveSBhIHByZXZpb3VzbHkgY3JlYXRlZCBUQ0QgaGFuZGxlCiAqLwotdm9pZCBvcGpfdGNkX2Rlc3Ryb3kob3BqX3RjZF90ICp0Y2QpIHsKLSAgICAgICAgaWYgKHRjZCkgewotICAgICAgICAgICAgICAgIG9wal90Y2RfZnJlZV90aWxlKHRjZCk7Cit2b2lkIG9wal90Y2RfZGVzdHJveShvcGpfdGNkX3QgKnRjZCkKK3sKKyAgICBpZiAodGNkKSB7CisgICAgICAgIG9wal90Y2RfZnJlZV90aWxlKHRjZCk7CiAKLSAgICAgICAgICAgICAgICBpZiAodGNkLT50Y2RfaW1hZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKHRjZC0+dGNkX2ltYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRjZC0+dGNkX2ltYWdlID0gMDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9wal9mcmVlKHRjZCk7CisgICAgICAgIGlmICh0Y2QtPnRjZF9pbWFnZSkgeworICAgICAgICAgICAgb3BqX2ZyZWUodGNkLT50Y2RfaW1hZ2UpOworICAgICAgICAgICAgdGNkLT50Y2RfaW1hZ2UgPSAwMDsKICAgICAgICAgfQorCisgICAgICAgIG9wal9mcmVlKHRjZC0+dXNlZF9jb21wb25lbnQpOworCisgICAgICAgIG9wal9mcmVlKHRjZCk7CisgICAgfQogfQogCiBPUEpfQk9PTCBvcGpfYWxsb2NfdGlsZV9jb21wb25lbnRfZGF0YShvcGpfdGNkX3RpbGVjb21wX3QgKmxfdGlsZWMpCiB7Ci0JaWYgKChsX3RpbGVjLT5kYXRhID09IDAwKSB8fCAoKGxfdGlsZWMtPmRhdGFfc2l6ZV9uZWVkZWQgPiBsX3RpbGVjLT5kYXRhX3NpemUpICYmIChsX3RpbGVjLT5vd25zRGF0YSA9PSBPUEpfRkFMU0UpKSkgewotCQlsX3RpbGVjLT5kYXRhID0gKE9QSl9JTlQzMiAqKSBvcGpfbWFsbG9jKGxfdGlsZWMtPmRhdGFfc2l6ZV9uZWVkZWQpOwotCQlpZiAoISBsX3RpbGVjLT5kYXRhICkgewotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCQkvKmZwcmludGYoc3RkZXJyLCAidEFsbG9jYXRlIGRhdGEgb2YgdGlsZWMgKGludCk6ICVkIHggT1BKX1VJTlQzMm4iLGxfZGF0YV9zaXplKTsqLwotCQlsX3RpbGVjLT5kYXRhX3NpemUgPSBsX3RpbGVjLT5kYXRhX3NpemVfbmVlZGVkOwotCQlsX3RpbGVjLT5vd25zRGF0YSA9IE9QSl9UUlVFOwotCX0KLQllbHNlIGlmIChsX3RpbGVjLT5kYXRhX3NpemVfbmVlZGVkID4gbF90aWxlYy0+ZGF0YV9zaXplKSB7Ci0JCU9QSl9JTlQzMiAqIG5ld19kYXRhID0gKE9QSl9JTlQzMiAqKSBvcGpfcmVhbGxvYyhsX3RpbGVjLT5kYXRhLCBsX3RpbGVjLT5kYXRhX3NpemVfbmVlZGVkKTsKLQkJLyogb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGhhbmRsZSB0aWxlIGRhdGFuIik7ICovCi0JCS8qIGZwcmludGYoc3RkZXJyLCAiTm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIHRpbGUgZGF0YSIpOyAqLwotCQlpZiAoISBuZXdfZGF0YSkgewotCQkJb3BqX2ZyZWUobF90aWxlYy0+ZGF0YSk7Ci0JCQlsX3RpbGVjLT5kYXRhID0gTlVMTDsKLQkJCWxfdGlsZWMtPmRhdGFfc2l6ZSA9IDA7Ci0JCQlsX3RpbGVjLT5kYXRhX3NpemVfbmVlZGVkID0gMDsKLQkJCWxfdGlsZWMtPm93bnNEYXRhID0gT1BKX0ZBTFNFOwotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCQlsX3RpbGVjLT5kYXRhID0gbmV3X2RhdGE7Ci0JCS8qZnByaW50ZihzdGRlcnIsICJ0UmVhbGxvY2F0ZSBkYXRhIG9mIHRpbGVjIChpbnQpOiBmcm9tICVkIHRvICVkIHggT1BKX1VJTlQzMm4iLCBsX3RpbGVjLT5kYXRhX3NpemUsIGxfZGF0YV9zaXplKTsqLwotCQlsX3RpbGVjLT5kYXRhX3NpemUgPSBsX3RpbGVjLT5kYXRhX3NpemVfbmVlZGVkOwotCQlsX3RpbGVjLT5vd25zRGF0YSA9IE9QSl9UUlVFOwotCX0KLQlyZXR1cm4gT1BKX1RSVUU7CisgICAgaWYgKChsX3RpbGVjLT5kYXRhID09IDAwKSB8fAorICAgICAgICAgICAgKChsX3RpbGVjLT5kYXRhX3NpemVfbmVlZGVkID4gbF90aWxlYy0+ZGF0YV9zaXplKSAmJgorICAgICAgICAgICAgIChsX3RpbGVjLT5vd25zRGF0YSA9PSBPUEpfRkFMU0UpKSkgeworICAgICAgICBsX3RpbGVjLT5kYXRhID0gKE9QSl9JTlQzMiAqKSBvcGpfaW1hZ2VfZGF0YV9hbGxvYyhsX3RpbGVjLT5kYXRhX3NpemVfbmVlZGVkKTsKKyAgICAgICAgaWYgKCFsX3RpbGVjLT5kYXRhICYmIGxfdGlsZWMtPmRhdGFfc2l6ZV9uZWVkZWQgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICAvKmZwcmludGYoc3RkZXJyLCAidEFsbG9jYXRlIGRhdGEgb2YgdGlsZWMgKGludCk6ICVkIHggT1BKX1VJTlQzMm4iLGxfZGF0YV9zaXplKTsqLworICAgICAgICBsX3RpbGVjLT5kYXRhX3NpemUgPSBsX3RpbGVjLT5kYXRhX3NpemVfbmVlZGVkOworICAgICAgICBsX3RpbGVjLT5vd25zRGF0YSA9IE9QSl9UUlVFOworICAgIH0gZWxzZSBpZiAobF90aWxlYy0+ZGF0YV9zaXplX25lZWRlZCA+IGxfdGlsZWMtPmRhdGFfc2l6ZSkgeworICAgICAgICAvKiBXZSBkb24ndCBuZWVkIHRvIGtlZXAgb2xkIGRhdGEgKi8KKyAgICAgICAgb3BqX2ltYWdlX2RhdGFfZnJlZShsX3RpbGVjLT5kYXRhKTsKKyAgICAgICAgbF90aWxlYy0+ZGF0YSA9IChPUEpfSU5UMzIgKikgb3BqX2ltYWdlX2RhdGFfYWxsb2MobF90aWxlYy0+ZGF0YV9zaXplX25lZWRlZCk7CisgICAgICAgIGlmICghIGxfdGlsZWMtPmRhdGEpIHsKKyAgICAgICAgICAgIGxfdGlsZWMtPmRhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICBsX3RpbGVjLT5kYXRhX3NpemVfbmVlZGVkID0gMDsKKyAgICAgICAgICAgIGxfdGlsZWMtPm93bnNEYXRhID0gT1BKX0ZBTFNFOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICAvKmZwcmludGYoc3RkZXJyLCAidFJlYWxsb2NhdGUgZGF0YSBvZiB0aWxlYyAoaW50KTogZnJvbSAlZCB0byAlZCB4IE9QSl9VSU5UMzJuIiwgbF90aWxlYy0+ZGF0YV9zaXplLCBsX2RhdGFfc2l6ZSk7Ki8KKyAgICAgICAgbF90aWxlYy0+ZGF0YV9zaXplID0gbF90aWxlYy0+ZGF0YV9zaXplX25lZWRlZDsKKyAgICAgICAgbF90aWxlYy0+b3duc0RhdGEgPSBPUEpfVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi1zdGF0aWMgSU5MSU5FIE9QSl9CT09MIG9wal90Y2RfaW5pdF90aWxlKG9wal90Y2RfdCAqcF90Y2QsIE9QSl9VSU5UMzIgcF90aWxlX25vLCBPUEpfQk9PTCBpc0VuY29kZXIsIE9QSl9GTE9BVDMyIGZyYWN0aW9uLCBPUEpfU0laRV9UIHNpemVvZl9ibG9jaywgb3BqX2V2ZW50X21ncl90KiBtYW5hZ2VyKQorc3RhdGljIElOTElORSBPUEpfQk9PTCBvcGpfdGNkX2luaXRfdGlsZShvcGpfdGNkX3QgKnBfdGNkLCBPUEpfVUlOVDMyIHBfdGlsZV9ubywKKyAgICAgICAgT1BKX0JPT0wgaXNFbmNvZGVyLCBPUEpfRkxPQVQzMiBmcmFjdGlvbiwgT1BKX1NJWkVfVCBzaXplb2ZfYmxvY2ssCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCogbWFuYWdlcikKIHsKLQlPUEpfVUlOVDMyICgqbF9nYWluX3B0cikoT1BKX1VJTlQzMikgPSAwMDsKLQlPUEpfVUlOVDMyIGNvbXBubywgcmVzbm8sIGJhbmRubywgcHJlY25vLCBjYmxrbm87Ci0Jb3BqX3RjcF90ICogbF90Y3AgPSAwMDsKLQlvcGpfY3BfdCAqIGxfY3AgPSAwMDsKLQlvcGpfdGNkX3RpbGVfdCAqIGxfdGlsZSA9IDAwOwotCW9wal90Y2NwX3QgKmxfdGNjcCA9IDAwOwotCW9wal90Y2RfdGlsZWNvbXBfdCAqbF90aWxlYyA9IDAwOwotCW9wal9pbWFnZV9jb21wX3QgKiBsX2ltYWdlX2NvbXAgPSAwMDsKLQlvcGpfdGNkX3Jlc29sdXRpb25fdCAqbF9yZXMgPSAwMDsKLQlvcGpfdGNkX2JhbmRfdCAqbF9iYW5kID0gMDA7Ci0Jb3BqX3N0ZXBzaXplX3QgKiBsX3N0ZXBfc2l6ZSA9IDAwOwotCW9wal90Y2RfcHJlY2luY3RfdCAqbF9jdXJyZW50X3ByZWNpbmN0ID0gMDA7Ci0Jb3BqX2ltYWdlX3QgKmxfaW1hZ2UgPSAwMDsKLQlPUEpfVUlOVDMyIHAscTsKLQlPUEpfVUlOVDMyIGxfbGV2ZWxfbm87Ci0JT1BKX1VJTlQzMiBsX3BkeCwgbF9wZHk7Ci0JT1BKX1VJTlQzMiBsX2dhaW47Ci0JT1BKX0lOVDMyIGxfeDBiLCBsX3kwYjsKLQlPUEpfVUlOVDMyIGxfdHgwLCBsX3R5MDsKLQkvKiBleHRlbnQgb2YgcHJlY2luY3RzICwgdG9wIGxlZnQsIGJvdHRvbSByaWdodCoqLwotCU9QSl9JTlQzMiBsX3RsX3ByY194X3N0YXJ0LCBsX3RsX3ByY195X3N0YXJ0LCBsX2JyX3ByY194X2VuZCwgbF9icl9wcmNfeV9lbmQ7Ci0JLyogbnVtYmVyIG9mIHByZWNpbmN0IGZvciBhIHJlc29sdXRpb24gKi8KLQlPUEpfVUlOVDMyIGxfbmJfcHJlY2luY3RzOwotCS8qIHJvb20gbmVlZGVkIHRvIHN0b3JlIGxfbmJfcHJlY2luY3QgcHJlY2luY3QgZm9yIGEgcmVzb2x1dGlvbiAqLwotCU9QSl9VSU5UMzIgbF9uYl9wcmVjaW5jdF9zaXplOwotCS8qIG51bWJlciBvZiBjb2RlIGJsb2NrcyBmb3IgYSBwcmVjaW5jdCovCi0JT1BKX1VJTlQzMiBsX25iX2NvZGVfYmxvY2tzOwotCS8qIHJvb20gbmVlZGVkIHRvIHN0b3JlIGxfbmJfY29kZV9ibG9ja3MgY29kZSBibG9ja3MgZm9yIGEgcHJlY2luY3QqLwotCU9QSl9VSU5UMzIgbF9uYl9jb2RlX2Jsb2Nrc19zaXplOwotCS8qIHNpemUgb2YgZGF0YSBmb3IgYSB0aWxlICovCi0JT1BKX1VJTlQzMiBsX2RhdGFfc2l6ZTsKLQkKLQlsX2NwID0gcF90Y2QtPmNwOwotCWxfdGNwID0gJihsX2NwLT50Y3BzW3BfdGlsZV9ub10pOwotCWxfdGlsZSA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzOwotCWxfdGNjcCA9IGxfdGNwLT50Y2NwczsKLQlsX3RpbGVjID0gbF90aWxlLT5jb21wczsKLQlsX2ltYWdlID0gcF90Y2QtPmltYWdlOwotCWxfaW1hZ2VfY29tcCA9IHBfdGNkLT5pbWFnZS0+Y29tcHM7Ci0JCi0JcCA9IHBfdGlsZV9ubyAlIGxfY3AtPnR3OyAgICAgICAvKiB0aWxlIGNvb3JkaW5hdGVzICovCi0JcSA9IHBfdGlsZV9ubyAvIGxfY3AtPnR3OwotCS8qZnByaW50ZihzdGRlcnIsICJUaWxlIGNvb3JkaW5hdGUgPSAlZCwlZFxuIiwgcCwgcSk7Ki8KLQkKLQkvKiA0IGJvcmRlcnMgb2YgdGhlIHRpbGUgcmVzY2FsZSBvbiB0aGUgaW1hZ2UgaWYgbmVjZXNzYXJ5ICovCi0JbF90eDAgPSBsX2NwLT50eDAgKyBwICogbF9jcC0+dGR4OyAvKiBjYW4ndCBiZSBncmVhdGVyIHRoYW4gbF9pbWFnZS0+eDEgc28gd29uJ3Qgb3ZlcmZsb3cgKi8KLQlsX3RpbGUtPngwID0gKE9QSl9JTlQzMilvcGpfdWludF9tYXgobF90eDAsIGxfaW1hZ2UtPngwKTsKLQlsX3RpbGUtPngxID0gKE9QSl9JTlQzMilvcGpfdWludF9taW4ob3BqX3VpbnRfYWRkcyhsX3R4MCwgbF9jcC0+dGR4KSwgbF9pbWFnZS0+eDEpOwotCWlmIChsX3RpbGUtPngwIDwgMCB8fCBsX3RpbGUtPngxIDwgMCkgewotCQlyZXR1cm4gT1BKX0ZBTFNFOwotCX0KKyAgICBPUEpfVUlOVDMyKCpsX2dhaW5fcHRyKShPUEpfVUlOVDMyKSA9IDAwOworICAgIE9QSl9VSU5UMzIgY29tcG5vLCByZXNubywgYmFuZG5vLCBwcmVjbm8sIGNibGtubzsKKyAgICBvcGpfdGNwX3QgKiBsX3RjcCA9IDAwOworICAgIG9wal9jcF90ICogbF9jcCA9IDAwOworICAgIG9wal90Y2RfdGlsZV90ICogbF90aWxlID0gMDA7CisgICAgb3BqX3RjY3BfdCAqbF90Y2NwID0gMDA7CisgICAgb3BqX3RjZF90aWxlY29tcF90ICpsX3RpbGVjID0gMDA7CisgICAgb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1hZ2VfY29tcCA9IDAwOworICAgIG9wal90Y2RfcmVzb2x1dGlvbl90ICpsX3JlcyA9IDAwOworICAgIG9wal90Y2RfYmFuZF90ICpsX2JhbmQgPSAwMDsKKyAgICBvcGpfc3RlcHNpemVfdCAqIGxfc3RlcF9zaXplID0gMDA7CisgICAgb3BqX3RjZF9wcmVjaW5jdF90ICpsX2N1cnJlbnRfcHJlY2luY3QgPSAwMDsKKyAgICBvcGpfaW1hZ2VfdCAqbF9pbWFnZSA9IDAwOworICAgIE9QSl9VSU5UMzIgcCwgcTsKKyAgICBPUEpfVUlOVDMyIGxfbGV2ZWxfbm87CisgICAgT1BKX1VJTlQzMiBsX3BkeCwgbF9wZHk7CisgICAgT1BKX1VJTlQzMiBsX2dhaW47CisgICAgT1BKX0lOVDMyIGxfeDBiLCBsX3kwYjsKKyAgICBPUEpfVUlOVDMyIGxfdHgwLCBsX3R5MDsKKyAgICAvKiBleHRlbnQgb2YgcHJlY2luY3RzICwgdG9wIGxlZnQsIGJvdHRvbSByaWdodCoqLworICAgIE9QSl9JTlQzMiBsX3RsX3ByY194X3N0YXJ0LCBsX3RsX3ByY195X3N0YXJ0LCBsX2JyX3ByY194X2VuZCwgbF9icl9wcmNfeV9lbmQ7CisgICAgLyogbnVtYmVyIG9mIHByZWNpbmN0IGZvciBhIHJlc29sdXRpb24gKi8KKyAgICBPUEpfVUlOVDMyIGxfbmJfcHJlY2luY3RzOworICAgIC8qIHJvb20gbmVlZGVkIHRvIHN0b3JlIGxfbmJfcHJlY2luY3QgcHJlY2luY3QgZm9yIGEgcmVzb2x1dGlvbiAqLworICAgIE9QSl9VSU5UMzIgbF9uYl9wcmVjaW5jdF9zaXplOworICAgIC8qIG51bWJlciBvZiBjb2RlIGJsb2NrcyBmb3IgYSBwcmVjaW5jdCovCisgICAgT1BKX1VJTlQzMiBsX25iX2NvZGVfYmxvY2tzOworICAgIC8qIHJvb20gbmVlZGVkIHRvIHN0b3JlIGxfbmJfY29kZV9ibG9ja3MgY29kZSBibG9ja3MgZm9yIGEgcHJlY2luY3QqLworICAgIE9QSl9VSU5UMzIgbF9uYl9jb2RlX2Jsb2Nrc19zaXplOworICAgIC8qIHNpemUgb2YgZGF0YSBmb3IgYSB0aWxlICovCisgICAgT1BKX1VJTlQzMiBsX2RhdGFfc2l6ZTsKIAotCWxfdHkwID0gbF9jcC0+dHkwICsgcSAqIGxfY3AtPnRkeTsgLyogY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIGxfaW1hZ2UtPnkxIHNvIHdvbid0IG92ZXJmbG93ICovCi0JbF90aWxlLT55MCA9IChPUEpfSU5UMzIpb3BqX3VpbnRfbWF4KGxfdHkwLCBsX2ltYWdlLT55MCk7Ci0JbF90aWxlLT55MSA9IChPUEpfSU5UMzIpb3BqX3VpbnRfbWluKG9wal91aW50X2FkZHMobF90eTAsIGxfY3AtPnRkeSksIGxfaW1hZ2UtPnkxKTsKLQlpZiAobF90aWxlLT55MCA8IDAgfHwgbF90aWxlLT55MSA8IDApIHsKLQkJcmV0dXJuIE9QSl9GQUxTRTsKLQl9CisgICAgbF9jcCA9IHBfdGNkLT5jcDsKKyAgICBsX3RjcCA9ICYobF9jcC0+dGNwc1twX3RpbGVfbm9dKTsKKyAgICBsX3RpbGUgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlczsKKyAgICBsX3RjY3AgPSBsX3RjcC0+dGNjcHM7CisgICAgbF90aWxlYyA9IGxfdGlsZS0+Y29tcHM7CisgICAgbF9pbWFnZSA9IHBfdGNkLT5pbWFnZTsKKyAgICBsX2ltYWdlX2NvbXAgPSBwX3RjZC0+aW1hZ2UtPmNvbXBzOwogCi0JLyogdGVzdGNhc2UgMTg4OC5wZGYuYXNhbi4zNS45ODggKi8KLQlpZiAobF90Y2NwLT5udW1yZXNvbHV0aW9ucyA9PSAwKSB7Ci0JCW9wal9ldmVudF9tc2cobWFuYWdlciwgRVZUX0VSUk9SLCAidGlsZXMgcmVxdWlyZSBhdCBsZWFzdCBvbmUgcmVzb2x1dGlvblxuIik7Ci0JCXJldHVybiBPUEpfRkFMU0U7Ci0JfQotCS8qZnByaW50ZihzdGRlcnIsICJUaWxlIGJvcmRlciA9ICVkLCVkLCVkLCVkXG4iLCBsX3RpbGUtPngwLCBsX3RpbGUtPnkwLGxfdGlsZS0+eDEsbF90aWxlLT55MSk7Ki8KLQkKLQkvKnRpbGUtPm51bWNvbXBzID0gaW1hZ2UtPm51bWNvbXBzOyAqLwotCWZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgbF90aWxlLT5udW1jb21wczsgKytjb21wbm8pIHsKLQkJLypmcHJpbnRmKHN0ZGVyciwgImNvbXBubyA9ICVkLyVkXG4iLCBjb21wbm8sIGxfdGlsZS0+bnVtY29tcHMpOyovCi0JCWxfaW1hZ2VfY29tcC0+cmVzbm9fZGVjb2RlZCA9IDA7Ci0JCS8qIGJvcmRlciBvZiBlYWNoIGxfdGlsZSBjb21wb25lbnQgKGdsb2JhbCkgKi8KLQkJbF90aWxlYy0+eDAgPSBvcGpfaW50X2NlaWxkaXYobF90aWxlLT54MCwgKE9QSl9JTlQzMilsX2ltYWdlX2NvbXAtPmR4KTsKLQkJbF90aWxlYy0+eTAgPSBvcGpfaW50X2NlaWxkaXYobF90aWxlLT55MCwgKE9QSl9JTlQzMilsX2ltYWdlX2NvbXAtPmR5KTsKLQkJbF90aWxlYy0+eDEgPSBvcGpfaW50X2NlaWxkaXYobF90aWxlLT54MSwgKE9QSl9JTlQzMilsX2ltYWdlX2NvbXAtPmR4KTsKLQkJbF90aWxlYy0+eTEgPSBvcGpfaW50X2NlaWxkaXYobF90aWxlLT55MSwgKE9QSl9JTlQzMilsX2ltYWdlX2NvbXAtPmR5KTsKLQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0VGlsZSBjb21wbyBib3JkZXIgPSAlZCwlZCwlZCwlZFxuIiwgbF90aWxlYy0+eDAsIGxfdGlsZWMtPnkwLGxfdGlsZWMtPngxLGxfdGlsZWMtPnkxKTsqLwotCQlpZiAobF90aWxlYy0+eDAgPj0gbF90aWxlYy0+eDEgfHwgbF90aWxlYy0+eTAgPj0gbF90aWxlYy0+eTEpIHsKLQkJCW9wal9ldmVudF9tc2cobWFuYWdlciwgRVZUX0VSUk9SLCAiSW52YWxpZCB0aWxlIGRhdGFcbiIpOwotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCQkvKiBjb21wdXRlIGxfZGF0YV9zaXplIHdpdGggb3ZlcmZsb3cgY2hlY2sgKi8KLQkJbF9kYXRhX3NpemUgPSAoT1BKX1VJTlQzMikobF90aWxlYy0+eDEgLSBsX3RpbGVjLT54MCk7Ci0JCWlmICgoKChPUEpfVUlOVDMyKS0xKSAvIGxfZGF0YV9zaXplKSA8IChPUEpfVUlOVDMyKShsX3RpbGVjLT55MSAtIGxfdGlsZWMtPnkwKSkgewotCQkJb3BqX2V2ZW50X21zZyhtYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgdGlsZSBkYXRhXG4iKTsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQkJbF9kYXRhX3NpemUgPSBsX2RhdGFfc2l6ZSAqIChPUEpfVUlOVDMyKShsX3RpbGVjLT55MSAtIGxfdGlsZWMtPnkwKTsKLQkJCi0JCWlmICgoKChPUEpfVUlOVDMyKS0xKSAvIChPUEpfVUlOVDMyKXNpemVvZihPUEpfVUlOVDMyKSkgPCBsX2RhdGFfc2l6ZSkgewotCQkJb3BqX2V2ZW50X21zZyhtYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgdGlsZSBkYXRhXG4iKTsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQkJbF9kYXRhX3NpemUgPSBsX2RhdGFfc2l6ZSAqIChPUEpfVUlOVDMyKXNpemVvZihPUEpfVUlOVDMyKTsKLQkJbF90aWxlYy0+bnVtcmVzb2x1dGlvbnMgPSBsX3RjY3AtPm51bXJlc29sdXRpb25zOwotCQlpZiAobF90Y2NwLT5udW1yZXNvbHV0aW9ucyA8IGxfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWMubV9yZWR1Y2UpIHsKLQkJCWxfdGlsZWMtPm1pbmltdW1fbnVtX3Jlc29sdXRpb25zID0gMTsKLQkJfQotCQllbHNlIHsKLQkJCWxfdGlsZWMtPm1pbmltdW1fbnVtX3Jlc29sdXRpb25zID0gbF90Y2NwLT5udW1yZXNvbHV0aW9ucyAtIGxfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9kZWMubV9yZWR1Y2U7Ci0JCX0KLQkJCi0JCWxfdGlsZWMtPmRhdGFfc2l6ZV9uZWVkZWQgPSBsX2RhdGFfc2l6ZTsKLQkJaWYgKHBfdGNkLT5tX2lzX2RlY29kZXIgJiYgIW9wal9hbGxvY190aWxlX2NvbXBvbmVudF9kYXRhKGxfdGlsZWMpKSB7Ci0JCQlvcGpfZXZlbnRfbXNnKG1hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aWxlIGRhdGFcbiIpOwotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCQkKLQkJbF9kYXRhX3NpemUgPSBsX3RpbGVjLT5udW1yZXNvbHV0aW9ucyAqIChPUEpfVUlOVDMyKXNpemVvZihvcGpfdGNkX3Jlc29sdXRpb25fdCk7Ci0JCQotCQlpZiAobF90aWxlYy0+cmVzb2x1dGlvbnMgPT0gMDApIHsKLQkJCWxfdGlsZWMtPnJlc29sdXRpb25zID0gKG9wal90Y2RfcmVzb2x1dGlvbl90ICopIG9wal9tYWxsb2MobF9kYXRhX3NpemUpOwotCQkJaWYgKCEgbF90aWxlYy0+cmVzb2x1dGlvbnMgKSB7Ci0JCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJCX0KLQkJCS8qZnByaW50ZihzdGRlcnIsICJcdEFsbG9jYXRlIHJlc29sdXRpb25zIG9mIHRpbGVjIChvcGpfdGNkX3Jlc29sdXRpb25fdCk6ICVkXG4iLGxfZGF0YV9zaXplKTsqLwotCQkJbF90aWxlYy0+cmVzb2x1dGlvbnNfc2l6ZSA9IGxfZGF0YV9zaXplOwotCQkJbWVtc2V0KGxfdGlsZWMtPnJlc29sdXRpb25zLDAsbF9kYXRhX3NpemUpOwotCQl9Ci0JCWVsc2UgaWYgKGxfZGF0YV9zaXplID4gbF90aWxlYy0+cmVzb2x1dGlvbnNfc2l6ZSkgewotCQkJb3BqX3RjZF9yZXNvbHV0aW9uX3QqIG5ld19yZXNvbHV0aW9ucyA9IChvcGpfdGNkX3Jlc29sdXRpb25fdCAqKSBvcGpfcmVhbGxvYyhsX3RpbGVjLT5yZXNvbHV0aW9ucywgbF9kYXRhX3NpemUpOwotCQkJaWYgKCEgbmV3X3Jlc29sdXRpb25zKSB7Ci0JCQkJb3BqX2V2ZW50X21zZyhtYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgdGlsZSByZXNvbHV0aW9uc1xuIik7Ci0JCQkJb3BqX2ZyZWUobF90aWxlYy0+cmVzb2x1dGlvbnMpOwotCQkJCWxfdGlsZWMtPnJlc29sdXRpb25zID0gTlVMTDsKLQkJCQlsX3RpbGVjLT5yZXNvbHV0aW9uc19zaXplID0gMDsKLQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJfQotCQkJbF90aWxlYy0+cmVzb2x1dGlvbnMgPSBuZXdfcmVzb2x1dGlvbnM7Ci0JCQkvKmZwcmludGYoc3RkZXJyLCAiXHRSZWFsbG9jYXRlIGRhdGEgb2YgdGlsZWMgKGludCk6IGZyb20gJWQgdG8gJWQgeCBPUEpfVUlOVDMyXG4iLCBsX3RpbGVjLT5yZXNvbHV0aW9uc19zaXplLCBsX2RhdGFfc2l6ZSk7Ki8KLQkJCW1lbXNldCgoKE9QSl9CWVRFKikgbF90aWxlYy0+cmVzb2x1dGlvbnMpK2xfdGlsZWMtPnJlc29sdXRpb25zX3NpemUsMCxsX2RhdGFfc2l6ZSAtIGxfdGlsZWMtPnJlc29sdXRpb25zX3NpemUpOwotCQkJbF90aWxlYy0+cmVzb2x1dGlvbnNfc2l6ZSA9IGxfZGF0YV9zaXplOwotCQl9Ci0JCQotCQlsX2xldmVsX25vID0gbF90aWxlYy0+bnVtcmVzb2x1dGlvbnMgLSAxOwotCQlsX3JlcyA9IGxfdGlsZWMtPnJlc29sdXRpb25zOwotCQlsX3N0ZXBfc2l6ZSA9IGxfdGNjcC0+c3RlcHNpemVzOwotCQlpZiAobF90Y2NwLT5xbWZiaWQgPT0gMCkgewotCQkJbF9nYWluX3B0ciA9ICZvcGpfZHd0X2dldGdhaW5fcmVhbDsKLQkJfQotCQllbHNlIHsKLQkJCWxfZ2Fpbl9wdHIgID0gJm9wal9kd3RfZ2V0Z2FpbjsKLQkJfQotCQkvKmZwcmludGYoc3RkZXJyLCAiXHRsZXZlbF9ubz0lZFxuIixsX2xldmVsX25vKTsqLwotCQkKLQkJZm9yIChyZXNubyA9IDA7IHJlc25vIDwgbF90aWxlYy0+bnVtcmVzb2x1dGlvbnM7ICsrcmVzbm8pIHsKLQkJCS8qZnByaW50ZihzdGRlcnIsICJcdFx0cmVzbm8gPSAlZC8lZFxuIiwgcmVzbm8sIGxfdGlsZWMtPm51bXJlc29sdXRpb25zKTsqLwotCQkJT1BKX0lOVDMyIHRsY2JneHN0YXJ0LCB0bGNiZ3lzdGFydCAvKiwgYnJjYmd4ZW5kLCBicmNiZ3llbmQqLzsKLQkJCU9QSl9VSU5UMzIgY2Jnd2lkdGhleHBuLCBjYmdoZWlnaHRleHBuOwotCQkJT1BKX1VJTlQzMiBjYmxrd2lkdGhleHBuLCBjYmxraGVpZ2h0ZXhwbjsKLQkJCQotCQkJLyogYm9yZGVyIGZvciBlYWNoIHJlc29sdXRpb24gbGV2ZWwgKGdsb2JhbCkgKi8KLQkJCWxfcmVzLT54MCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90aWxlYy0+eDAsIChPUEpfSU5UMzIpbF9sZXZlbF9ubyk7Ci0JCQlsX3Jlcy0+eTAgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGlsZWMtPnkwLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOwotCQkJbF9yZXMtPngxID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RpbGVjLT54MSwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKLQkJCWxfcmVzLT55MSA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90aWxlYy0+eTEsIChPUEpfSU5UMzIpbF9sZXZlbF9ubyk7Ci0JCQkvKmZwcmludGYoc3RkZXJyLCAiXHRcdFx0cmVzX3gwPSAlZCwgcmVzX3kwID0lZCwgcmVzX3gxPSVkLCByZXNfeTE9JWRcbiIsIGxfcmVzLT54MCwgbF9yZXMtPnkwLCBsX3Jlcy0+eDEsIGxfcmVzLT55MSk7Ki8KLQkJCS8qIHAuIDM1LCB0YWJsZSBBLTIzLCBJU08vSUVDIEZESVMxNTQ0NDQtMSA6IDIwMDAgKDE4IGF1Z3VzdCAyMDAwKSAqLwotCQkJbF9wZHggPSBsX3RjY3AtPnByY3dbcmVzbm9dOwotCQkJbF9wZHkgPSBsX3RjY3AtPnByY2hbcmVzbm9dOwotCQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0XHRcdHBkeD0lZCwgcGR5PSVkXG4iLCBsX3BkeCwgbF9wZHkpOyovCi0JCQkvKiBwLiA2NCwgQi42LCBJU08vSUVDIEZESVMxNTQ0NC0xIDogMjAwMCAoMTggYXVndXN0IDIwMDApICAqLwotCQkJbF90bF9wcmNfeF9zdGFydCA9IG9wal9pbnRfZmxvb3JkaXZwb3cyKGxfcmVzLT54MCwgKE9QSl9JTlQzMilsX3BkeCkgPDwgbF9wZHg7Ci0JCQlsX3RsX3ByY195X3N0YXJ0ID0gb3BqX2ludF9mbG9vcmRpdnBvdzIobF9yZXMtPnkwLCAoT1BKX0lOVDMyKWxfcGR5KSA8PCBsX3BkeTsKLQkJCWxfYnJfcHJjX3hfZW5kID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3Jlcy0+eDEsIChPUEpfSU5UMzIpbF9wZHgpIDw8IGxfcGR4OwotCQkJbF9icl9wcmNfeV9lbmQgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfcmVzLT55MSwgKE9QSl9JTlQzMilsX3BkeSkgPDwgbF9wZHk7Ci0JCQkvKmZwcmludGYoc3RkZXJyLCAiXHRcdFx0cHJjX3hfc3RhcnQ9JWQsIHByY195X3N0YXJ0PSVkLCBicl9wcmNfeF9lbmQ9JWQsIGJyX3ByY195X2VuZD0lZCBcbiIsIGxfdGxfcHJjX3hfc3RhcnQsIGxfdGxfcHJjX3lfc3RhcnQsIGxfYnJfcHJjX3hfZW5kICxsX2JyX3ByY195X2VuZCApOyovCi0JCQkKLQkJCWxfcmVzLT5wdyA9IChsX3Jlcy0+eDAgPT0gbF9yZXMtPngxKSA/IDAgOiAoT1BKX1VJTlQzMikoKGxfYnJfcHJjX3hfZW5kIC0gbF90bF9wcmNfeF9zdGFydCkgPj4gbF9wZHgpOwotCQkJbF9yZXMtPnBoID0gKGxfcmVzLT55MCA9PSBsX3Jlcy0+eTEpID8gMCA6IChPUEpfVUlOVDMyKSgobF9icl9wcmNfeV9lbmQgLSBsX3RsX3ByY195X3N0YXJ0KSA+PiBsX3BkeSk7Ci0JCQkvKmZwcmludGYoc3RkZXJyLCAiXHRcdFx0cmVzX3B3PSVkLCByZXNfcGg9JWRcbiIsIGxfcmVzLT5wdywgbF9yZXMtPnBoICk7Ki8KLQkJCQotCQkJaWYgKGxfcmVzLT5wdyAmJiAoKE9QSl9VSU5UMzIpLTEpIC8gbF9yZXMtPnB3IDwgbF9yZXMtPnBoKSB7Ci0JCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJCX0KLQkJCWxfbmJfcHJlY2luY3RzID0gbF9yZXMtPnB3ICogbF9yZXMtPnBoOworICAgIHAgPSBwX3RpbGVfbm8gJSBsX2NwLT50dzsgICAgICAgLyogdGlsZSBjb29yZGluYXRlcyAqLworICAgIHEgPSBwX3RpbGVfbm8gLyBsX2NwLT50dzsKKyAgICAvKmZwcmludGYoc3RkZXJyLCAiVGlsZSBjb29yZGluYXRlID0gJWQsJWRcbiIsIHAsIHEpOyovCiAKLQkJCWlmICgoKE9QSl9VSU5UMzIpLTEpIC8gKE9QSl9VSU5UMzIpc2l6ZW9mKG9wal90Y2RfcHJlY2luY3RfdCkgPCBsX25iX3ByZWNpbmN0cykgewotCQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCQl9Ci0JCQlsX25iX3ByZWNpbmN0X3NpemUgPSBsX25iX3ByZWNpbmN0cyAqIChPUEpfVUlOVDMyKXNpemVvZihvcGpfdGNkX3ByZWNpbmN0X3QpOwotCQkJaWYgKHJlc25vID09IDApIHsKLQkJCQl0bGNiZ3hzdGFydCA9IGxfdGxfcHJjX3hfc3RhcnQ7Ci0JCQkJdGxjYmd5c3RhcnQgPSBsX3RsX3ByY195X3N0YXJ0OwotCQkJCS8qYnJjYmd4ZW5kID0gbF9icl9wcmNfeF9lbmQ7Ki8KLQkJCQkvKiBicmNiZ3llbmQgPSBsX2JyX3ByY195X2VuZDsqLwotCQkJCWNiZ3dpZHRoZXhwbiA9IGxfcGR4OwotCQkJCWNiZ2hlaWdodGV4cG4gPSBsX3BkeTsKLQkJCQlsX3Jlcy0+bnVtYmFuZHMgPSAxOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGxjYmd4c3RhcnQgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGxfcHJjX3hfc3RhcnQsIDEpOwotCQkJCXRsY2JneXN0YXJ0ID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RsX3ByY195X3N0YXJ0LCAxKTsKLQkJCQkvKmJyY2JneGVuZCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF9icl9wcmNfeF9lbmQsIDEpOyovCi0JCQkJLypicmNiZ3llbmQgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfYnJfcHJjX3lfZW5kLCAxKTsqLwotCQkJCWNiZ3dpZHRoZXhwbiA9IGxfcGR4IC0gMTsKLQkJCQljYmdoZWlnaHRleHBuID0gbF9wZHkgLSAxOwotCQkJCWxfcmVzLT5udW1iYW5kcyA9IDM7Ci0JCQl9Ci0JCQkKLQkJCWNibGt3aWR0aGV4cG4gPSBvcGpfdWludF9taW4obF90Y2NwLT5jYmxrdywgY2Jnd2lkdGhleHBuKTsKLQkJCWNibGtoZWlnaHRleHBuID0gb3BqX3VpbnRfbWluKGxfdGNjcC0+Y2Jsa2gsIGNiZ2hlaWdodGV4cG4pOwotCQkJbF9iYW5kID0gbF9yZXMtPmJhbmRzOwotCQkJCi0JCQlmb3IgKGJhbmRubyA9IDA7IGJhbmRubyA8IGxfcmVzLT5udW1iYW5kczsgKytiYW5kbm8pIHsKLQkJCQlPUEpfSU5UMzIgbnVtYnBzOwotCQkJCS8qZnByaW50ZihzdGRlcnIsICJcdFx0XHRiYW5kX25vPSVkLyVkXG4iLCBiYW5kbm8sIGxfcmVzLT5udW1iYW5kcyApOyovCi0JCQkJCi0JCQkJaWYgKHJlc25vID09IDApIHsKLQkJCQkJbF9iYW5kLT5iYW5kbm8gPSAwIDsKLQkJCQkJbF9iYW5kLT54MCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90aWxlYy0+eDAsIChPUEpfSU5UMzIpbF9sZXZlbF9ubyk7Ci0JCQkJCWxfYmFuZC0+eTAgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGlsZWMtPnkwLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOwotCQkJCQlsX2JhbmQtPngxID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RpbGVjLT54MSwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKLQkJCQkJbF9iYW5kLT55MSA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90aWxlYy0+eTEsIChPUEpfSU5UMzIpbF9sZXZlbF9ubyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlsX2JhbmQtPmJhbmRubyA9IGJhbmRubyArIDE7Ci0JCQkJCS8qIHgwYiA9IDEgaWYgYmFuZG5vID0gMSBvciAzICovCi0JCQkJCWxfeDBiID0gbF9iYW5kLT5iYW5kbm8mMTsKLQkJCQkJLyogeTBiID0gMSBpZiBiYW5kbm8gPSAyIG9yIDMgKi8KLQkJCQkJbF95MGIgPSAoT1BKX0lOVDMyKSgobF9iYW5kLT5iYW5kbm8pPj4xKTsKLQkJCQkJLyogbF9iYW5kIGJvcmRlciAoZ2xvYmFsKSAqLwotCQkJCQlsX2JhbmQtPngwID0gb3BqX2ludDY0X2NlaWxkaXZwb3cyKGxfdGlsZWMtPngwIC0gKChPUEpfSU5UNjQpbF94MGIgPDwgbF9sZXZlbF9ubyksIChPUEpfSU5UMzIpKGxfbGV2ZWxfbm8gKyAxKSk7Ci0JCQkJCWxfYmFuZC0+eTAgPSBvcGpfaW50NjRfY2VpbGRpdnBvdzIobF90aWxlYy0+eTAgLSAoKE9QSl9JTlQ2NClsX3kwYiA8PCBsX2xldmVsX25vKSwgKE9QSl9JTlQzMikobF9sZXZlbF9ubyArIDEpKTsKLQkJCQkJbF9iYW5kLT54MSA9IG9wal9pbnQ2NF9jZWlsZGl2cG93MihsX3RpbGVjLT54MSAtICgoT1BKX0lOVDY0KWxfeDBiIDw8IGxfbGV2ZWxfbm8pLCAoT1BKX0lOVDMyKShsX2xldmVsX25vICsgMSkpOwotCQkJCQlsX2JhbmQtPnkxID0gb3BqX2ludDY0X2NlaWxkaXZwb3cyKGxfdGlsZWMtPnkxIC0gKChPUEpfSU5UNjQpbF95MGIgPDwgbF9sZXZlbF9ubyksIChPUEpfSU5UMzIpKGxfbGV2ZWxfbm8gKyAxKSk7Ci0JCQkJfQotCQkJCQotCQkJCS8qKiBhdm9pZCBhbiBpZiB3aXRoIHN0b3JpbmcgZnVuY3Rpb24gcG9pbnRlciAqLwotCQkJCWxfZ2FpbiA9ICgqbF9nYWluX3B0cikgKGxfYmFuZC0+YmFuZG5vKTsKLQkJCQludW1icHMgPSAoT1BKX0lOVDMyKShsX2ltYWdlX2NvbXAtPnByZWMgKyBsX2dhaW4pOwotCQkJCWxfYmFuZC0+c3RlcHNpemUgPSAoT1BKX0ZMT0FUMzIpKCgoMS4wICsgbF9zdGVwX3NpemUtPm1hbnQgLyAyMDQ4LjApICogcG93KDIuMCwgKE9QSl9JTlQzMikgKG51bWJwcyAtIGxfc3RlcF9zaXplLT5leHBuKSkpKSAqIGZyYWN0aW9uOwotCQkJCWxfYmFuZC0+bnVtYnBzID0gbF9zdGVwX3NpemUtPmV4cG4gKyAoT1BKX0lOVDMyKWxfdGNjcC0+bnVtZ2JpdHMgLSAxOyAgICAgIC8qIFdIWSAtMSA/ICovCi0JCQkJCi0JCQkJaWYgKCEgbF9iYW5kLT5wcmVjaW5jdHMpIHsKLQkJCQkJbF9iYW5kLT5wcmVjaW5jdHMgPSAob3BqX3RjZF9wcmVjaW5jdF90ICopIG9wal9tYWxsb2MoIC8qMyAqICovIGxfbmJfcHJlY2luY3Rfc2l6ZSk7Ci0JCQkJCWlmICghIGxfYmFuZC0+cHJlY2luY3RzKSB7Ci0JCQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJCQl9Ci0JCQkJCS8qZnByaW50ZihzdGRlcnIsICJcdFx0XHRcdEFsbG9jYXRlIHByZWNpbmN0cyBvZiBhIGJhbmQgKG9wal90Y2RfcHJlY2luY3RfdCk6ICVkXG4iLGxfbmJfcHJlY2luY3Rfc2l6ZSk7ICAgICAqLwotCQkJCQltZW1zZXQobF9iYW5kLT5wcmVjaW5jdHMsMCxsX25iX3ByZWNpbmN0X3NpemUpOwotCQkJCQlsX2JhbmQtPnByZWNpbmN0c19kYXRhX3NpemUgPSBsX25iX3ByZWNpbmN0X3NpemU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGxfYmFuZC0+cHJlY2luY3RzX2RhdGFfc2l6ZSA8IGxfbmJfcHJlY2luY3Rfc2l6ZSkgewotCQkJCQkKLQkJCQkJb3BqX3RjZF9wcmVjaW5jdF90ICogbmV3X3ByZWNpbmN0cyA9IChvcGpfdGNkX3ByZWNpbmN0X3QgKikgb3BqX3JlYWxsb2MobF9iYW5kLT5wcmVjaW5jdHMsLyozICogKi8gbF9uYl9wcmVjaW5jdF9zaXplKTsKLQkJCQkJaWYgKCEgbmV3X3ByZWNpbmN0cykgewotCQkJCQkJb3BqX2V2ZW50X21zZyhtYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBoYW5kbGUgYmFuZCBwcmVjaW50c1xuIik7Ci0JCQkJCQlvcGpfZnJlZShsX2JhbmQtPnByZWNpbmN0cyk7Ci0JCQkJCQlsX2JhbmQtPnByZWNpbmN0cyA9IE5VTEw7Ci0JCQkJCQlsX2JhbmQtPnByZWNpbmN0c19kYXRhX3NpemUgPSAwOwotCQkJCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJCQkJfQotCQkJCQlsX2JhbmQtPnByZWNpbmN0cyA9IG5ld19wcmVjaW5jdHM7Ci0JCQkJCS8qZnByaW50ZihzdGRlcnIsICJcdFx0XHRcdFJlYWxsb2NhdGUgcHJlY2luY3RzIG9mIGEgYmFuZCAob3BqX3RjZF9wcmVjaW5jdF90KTogZnJvbSAlZCB0byAlZFxuIixsX2JhbmQtPnByZWNpbmN0c19kYXRhX3NpemUsIGxfbmJfcHJlY2luY3Rfc2l6ZSk7Ki8KLQkJCQkJbWVtc2V0KCgoT1BKX0JZVEUgKikgbF9iYW5kLT5wcmVjaW5jdHMpICsgbF9iYW5kLT5wcmVjaW5jdHNfZGF0YV9zaXplLDAsbF9uYl9wcmVjaW5jdF9zaXplIC0gbF9iYW5kLT5wcmVjaW5jdHNfZGF0YV9zaXplKTsKLQkJCQkJbF9iYW5kLT5wcmVjaW5jdHNfZGF0YV9zaXplID0gbF9uYl9wcmVjaW5jdF9zaXplOwotCQkJCX0KLQkJCQkKLQkJCQlsX2N1cnJlbnRfcHJlY2luY3QgPSBsX2JhbmQtPnByZWNpbmN0czsKLQkJCQlmb3IgKHByZWNubyA9IDA7IHByZWNubyA8IGxfbmJfcHJlY2luY3RzOyArK3ByZWNubykgewotCQkJCQlPUEpfSU5UMzIgdGxjYmxreHN0YXJ0LCB0bGNibGt5c3RhcnQsIGJyY2Jsa3hlbmQsIGJyY2Jsa3llbmQ7Ci0JCQkJCU9QSl9JTlQzMiBjYmd4c3RhcnQgPSB0bGNiZ3hzdGFydCArIChPUEpfSU5UMzIpKHByZWNubyAlIGxfcmVzLT5wdykgKiAoMSA8PCBjYmd3aWR0aGV4cG4pOwotCQkJCQlPUEpfSU5UMzIgY2JneXN0YXJ0ID0gdGxjYmd5c3RhcnQgKyAoT1BKX0lOVDMyKShwcmVjbm8gLyBsX3Jlcy0+cHcpICogKDEgPDwgY2JnaGVpZ2h0ZXhwbik7Ci0JCQkJCU9QSl9JTlQzMiBjYmd4ZW5kID0gY2JneHN0YXJ0ICsgKDEgPDwgY2Jnd2lkdGhleHBuKTsKLQkJCQkJT1BKX0lOVDMyIGNiZ3llbmQgPSBjYmd5c3RhcnQgKyAoMSA8PCBjYmdoZWlnaHRleHBuKTsKLQkJCQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0IHByZWNubz0lZDsgYmFuZG5vPSVkLCByZXNubz0lZDsgY29tcG5vPSVkXG4iLCBwcmVjbm8sIGJhbmRubyAsIHJlc25vLCBjb21wbm8pOyovCi0JCQkJCS8qZnByaW50ZihzdGRlcnIsICJcdCB0bGNiZ3hzdGFydCg9JWQpICsgKHByZWNubyg9JWQpIHBlcmNlbnQgcmVzLT5wdyg9JWQpKSAqICgxIDw8IGNiZ3dpZHRoZXhwbig9JWQpKSBcbiIsdGxjYmd4c3RhcnQscHJlY25vLGxfcmVzLT5wdyxjYmd3aWR0aGV4cG4pOyovCi0JCQkJCQotCQkJCQkvKiBwcmVjaW5jdCBzaXplIChnbG9iYWwpICovCi0JCQkJCS8qZnByaW50ZihzdGRlcnIsICJcdCBjYmd4c3RhcnQ9JWQsIGxfYmFuZC0+eDAgPSAlZCBcbiIsY2JneHN0YXJ0LCBsX2JhbmQtPngwKTsqLwotCQkJCQkKLQkJCQkJbF9jdXJyZW50X3ByZWNpbmN0LT54MCA9IG9wal9pbnRfbWF4KGNiZ3hzdGFydCwgbF9iYW5kLT54MCk7Ci0JCQkJCWxfY3VycmVudF9wcmVjaW5jdC0+eTAgPSBvcGpfaW50X21heChjYmd5c3RhcnQsIGxfYmFuZC0+eTApOwotCQkJCQlsX2N1cnJlbnRfcHJlY2luY3QtPngxID0gb3BqX2ludF9taW4oY2JneGVuZCwgbF9iYW5kLT54MSk7Ci0JCQkJCWxfY3VycmVudF9wcmVjaW5jdC0+eTEgPSBvcGpfaW50X21pbihjYmd5ZW5kLCBsX2JhbmQtPnkxKTsKLQkJCQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0IHByY194MD0lZDsgcHJjX3kwPSVkLCBwcmNfeDE9JWQ7IHByY195MT0lZFxuIixsX2N1cnJlbnRfcHJlY2luY3QtPngwLCBsX2N1cnJlbnRfcHJlY2luY3QtPnkwICxsX2N1cnJlbnRfcHJlY2luY3QtPngxLCBsX2N1cnJlbnRfcHJlY2luY3QtPnkxKTsqLwotCQkJCQkKLQkJCQkJdGxjYmxreHN0YXJ0ID0gb3BqX2ludF9mbG9vcmRpdnBvdzIobF9jdXJyZW50X3ByZWNpbmN0LT54MCwgKE9QSl9JTlQzMiljYmxrd2lkdGhleHBuKSA8PCBjYmxrd2lkdGhleHBuOwotCQkJCQkvKmZwcmludGYoc3RkZXJyLCAiXHQgdGxjYmxreHN0YXJ0ID0lZFxuIix0bGNibGt4c3RhcnQgKTsqLwotCQkJCQl0bGNibGt5c3RhcnQgPSBvcGpfaW50X2Zsb29yZGl2cG93MihsX2N1cnJlbnRfcHJlY2luY3QtPnkwLCAoT1BKX0lOVDMyKWNibGtoZWlnaHRleHBuKSA8PCBjYmxraGVpZ2h0ZXhwbjsKLQkJCQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0IHRsY2Jsa3lzdGFydCA9JWRcbiIsdGxjYmxreXN0YXJ0ICk7Ki8KLQkJCQkJYnJjYmxreGVuZCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF9jdXJyZW50X3ByZWNpbmN0LT54MSwgKE9QSl9JTlQzMiljYmxrd2lkdGhleHBuKSA8PCBjYmxrd2lkdGhleHBuOwotCQkJCQkvKmZwcmludGYoc3RkZXJyLCAiXHQgYnJjYmxreGVuZCA9JWRcbiIsYnJjYmxreGVuZCApOyovCi0JCQkJCWJyY2Jsa3llbmQgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfY3VycmVudF9wcmVjaW5jdC0+eTEsIChPUEpfSU5UMzIpY2Jsa2hlaWdodGV4cG4pIDw8IGNibGtoZWlnaHRleHBuOwotCQkJCQkvKmZwcmludGYoc3RkZXJyLCAiXHQgYnJjYmxreWVuZCA9JWRcbiIsYnJjYmxreWVuZCApOyovCi0JCQkJCWxfY3VycmVudF9wcmVjaW5jdC0+Y3cgPSAoT1BKX1VJTlQzMikoKGJyY2Jsa3hlbmQgLSB0bGNibGt4c3RhcnQpID4+IGNibGt3aWR0aGV4cG4pOwotCQkJCQlsX2N1cnJlbnRfcHJlY2luY3QtPmNoID0gKE9QSl9VSU5UMzIpKChicmNibGt5ZW5kIC0gdGxjYmxreXN0YXJ0KSA+PiBjYmxraGVpZ2h0ZXhwbik7Ci0JCQkJCQotCQkJCQlpZiAobF9jdXJyZW50X3ByZWNpbmN0LT5jdyAmJiAoKE9QSl9VSU5UMzIpLTEpIC8gbF9jdXJyZW50X3ByZWNpbmN0LT5jdyA8IGxfY3VycmVudF9wcmVjaW5jdC0+Y2gpIHsKLQkJCQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCQkJCX0KLQkJCQkJbF9uYl9jb2RlX2Jsb2NrcyA9IGxfY3VycmVudF9wcmVjaW5jdC0+Y3cgKiBsX2N1cnJlbnRfcHJlY2luY3QtPmNoOwotCQkJCQkvKmZwcmludGYoc3RkZXJyLCAiXHRcdFx0XHQgcHJlY2luY3RfY3cgPSAlZCB4IHJlY2luY3RfY2ggPSAlZFxuIixsX2N1cnJlbnRfcHJlY2luY3QtPmN3LCBsX2N1cnJlbnRfcHJlY2luY3QtPmNoKTsgICAgICAqLwotCQkJCQkKLQkJCQkJaWYgKCgoT1BKX1VJTlQzMiktMSkgLyAoT1BKX1VJTlQzMilzaXplb2ZfYmxvY2sgPCBsX25iX2NvZGVfYmxvY2tzKSB7Ci0JCQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJCQl9Ci0JCQkJCWxfbmJfY29kZV9ibG9ja3Nfc2l6ZSA9IGxfbmJfY29kZV9ibG9ja3MgKiAoT1BKX1VJTlQzMilzaXplb2ZfYmxvY2s7Ci0JCQkJCQotCQkJCQlpZiAoISBsX2N1cnJlbnRfcHJlY2luY3QtPmNibGtzLmJsb2NrcykgewotCQkJCQkJbF9jdXJyZW50X3ByZWNpbmN0LT5jYmxrcy5ibG9ja3MgPSBvcGpfbWFsbG9jKGxfbmJfY29kZV9ibG9ja3Nfc2l6ZSk7Ci0JCQkJCQlpZiAoISBsX2N1cnJlbnRfcHJlY2luY3QtPmNibGtzLmJsb2NrcyApIHsKLQkJCQkJCQlyZXR1cm4gT1BKX0ZBTFNFOwotCQkJCQkJfQotCQkJCQkJLypmcHJpbnRmKHN0ZGVyciwgIlx0XHRcdFx0QWxsb2NhdGUgY2Jsa3Mgb2YgYSBwcmVjaW5jdCAob3BqX3RjZF9jYmxrX2RlY190KTogJWRcbiIsbF9uYl9jb2RlX2Jsb2Nrc19zaXplKTsqLwotCQkJCQkJCi0JCQkJCQltZW1zZXQobF9jdXJyZW50X3ByZWNpbmN0LT5jYmxrcy5ibG9ja3MsMCxsX25iX2NvZGVfYmxvY2tzX3NpemUpOwotCQkJCQkJCi0JCQkJCQlsX2N1cnJlbnRfcHJlY2luY3QtPmJsb2NrX3NpemUgPSBsX25iX2NvZGVfYmxvY2tzX3NpemU7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAobF9uYl9jb2RlX2Jsb2Nrc19zaXplID4gbF9jdXJyZW50X3ByZWNpbmN0LT5ibG9ja19zaXplKSB7Ci0JCQkJCQl2b2lkICpuZXdfYmxvY2tzID0gb3BqX3JlYWxsb2MobF9jdXJyZW50X3ByZWNpbmN0LT5jYmxrcy5ibG9ja3MsIGxfbmJfY29kZV9ibG9ja3Nfc2l6ZSk7Ci0JCQkJCQlpZiAoISBuZXdfYmxvY2tzKSB7Ci0JCQkJCQkJb3BqX2ZyZWUobF9jdXJyZW50X3ByZWNpbmN0LT5jYmxrcy5ibG9ja3MpOwotCQkJCQkJCWxfY3VycmVudF9wcmVjaW5jdC0+Y2Jsa3MuYmxvY2tzID0gTlVMTDsKLQkJCQkJCQlsX2N1cnJlbnRfcHJlY2luY3QtPmJsb2NrX3NpemUgPSAwOwotCQkJCQkJCW9wal9ldmVudF9tc2cobWFuYWdlciwgRVZUX0VSUk9SLCAiTm90IGVub3VnaCBtZW1vcnkgZm9yIGN1cnJlbnQgcHJlY2luY3QgY29kZWJsb2NrIGVsZW1lbnRcbiIpOwotCQkJCQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCQkJCQl9Ci0JCQkJCQlsX2N1cnJlbnRfcHJlY2luY3QtPmNibGtzLmJsb2NrcyA9IG5ld19ibG9ja3M7Ci0JCQkJCQkvKmZwcmludGYoc3RkZXJyLCAiXHRcdFx0XHRSZWFsbG9jYXRlIGNibGtzIG9mIGEgcHJlY2luY3QgKG9wal90Y2RfY2Jsa19kZWNfdCk6IGZyb20gJWQgdG8gJWRcbiIsbF9jdXJyZW50X3ByZWNpbmN0LT5ibG9ja19zaXplLCBsX25iX2NvZGVfYmxvY2tzX3NpemUpOyAgICAgKi8KLQkJCQkJCQotCQkJCQkJbWVtc2V0KCgoT1BKX0JZVEUgKikgbF9jdXJyZW50X3ByZWNpbmN0LT5jYmxrcy5ibG9ja3MpICsgbF9jdXJyZW50X3ByZWNpbmN0LT5ibG9ja19zaXplCi0JCQkJCQkJCQkgLDAKLQkJCQkJCQkJCSAsbF9uYl9jb2RlX2Jsb2Nrc19zaXplIC0gbF9jdXJyZW50X3ByZWNpbmN0LT5ibG9ja19zaXplKTsKLQkJCQkJCQotCQkJCQkJbF9jdXJyZW50X3ByZWNpbmN0LT5ibG9ja19zaXplID0gbF9uYl9jb2RlX2Jsb2Nrc19zaXplOwotCQkJCQl9Ci0JCQkJCQotCQkJCQlpZiAoISBsX2N1cnJlbnRfcHJlY2luY3QtPmluY2x0cmVlKSB7Ci0JCQkJCQlsX2N1cnJlbnRfcHJlY2luY3QtPmluY2x0cmVlID0gb3BqX3RndF9jcmVhdGUobF9jdXJyZW50X3ByZWNpbmN0LT5jdywgbF9jdXJyZW50X3ByZWNpbmN0LT5jaCwgbWFuYWdlcik7Ci0JCQkJCX0KLQkJCQkJZWxzZXsKLQkJCQkJCWxfY3VycmVudF9wcmVjaW5jdC0+aW5jbHRyZWUgPSBvcGpfdGd0X2luaXQobF9jdXJyZW50X3ByZWNpbmN0LT5pbmNsdHJlZSwgbF9jdXJyZW50X3ByZWNpbmN0LT5jdywgbF9jdXJyZW50X3ByZWNpbmN0LT5jaCwgbWFuYWdlcik7Ci0JCQkJCX0KKyAgICAvKiA0IGJvcmRlcnMgb2YgdGhlIHRpbGUgcmVzY2FsZSBvbiB0aGUgaW1hZ2UgaWYgbmVjZXNzYXJ5ICovCisgICAgbF90eDAgPSBsX2NwLT50eDAgKyBwICoKKyAgICAgICAgICAgIGxfY3AtPnRkeDsgLyogY2FuJ3QgYmUgZ3JlYXRlciB0aGFuIGxfaW1hZ2UtPngxIHNvIHdvbid0IG92ZXJmbG93ICovCisgICAgbF90aWxlLT54MCA9IChPUEpfSU5UMzIpb3BqX3VpbnRfbWF4KGxfdHgwLCBsX2ltYWdlLT54MCk7CisgICAgbF90aWxlLT54MSA9IChPUEpfSU5UMzIpb3BqX3VpbnRfbWluKG9wal91aW50X2FkZHMobF90eDAsIGxfY3AtPnRkeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfaW1hZ2UtPngxKTsKKyAgICAvKiBhbGwgdGhvc2UgT1BKX1VJTlQzMiBhcmUgY2FzdGVkIHRvIE9QSl9JTlQzMiwgbGV0J3MgZG8gc29tZSBzYW5pdHkgY2hlY2sgKi8KKyAgICBpZiAoKGxfdGlsZS0+eDAgPCAwKSB8fCAobF90aWxlLT54MSA8PSBsX3RpbGUtPngwKSkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKG1hbmFnZXIsIEVWVF9FUlJPUiwgIlRpbGUgWCBjb29yZGluYXRlcyBhcmUgbm90IHN1cHBvcnRlZFxuIik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGxfdHkwID0gbF9jcC0+dHkwICsgcSAqCisgICAgICAgICAgICBsX2NwLT50ZHk7IC8qIGNhbid0IGJlIGdyZWF0ZXIgdGhhbiBsX2ltYWdlLT55MSBzbyB3b24ndCBvdmVyZmxvdyAqLworICAgIGxfdGlsZS0+eTAgPSAoT1BKX0lOVDMyKW9wal91aW50X21heChsX3R5MCwgbF9pbWFnZS0+eTApOworICAgIGxfdGlsZS0+eTEgPSAoT1BKX0lOVDMyKW9wal91aW50X21pbihvcGpfdWludF9hZGRzKGxfdHkwLCBsX2NwLT50ZHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2ltYWdlLT55MSk7CisgICAgLyogYWxsIHRob3NlIE9QSl9VSU5UMzIgYXJlIGNhc3RlZCB0byBPUEpfSU5UMzIsIGxldCdzIGRvIHNvbWUgc2FuaXR5IGNoZWNrICovCisgICAgaWYgKChsX3RpbGUtPnkwIDwgMCkgfHwgKGxfdGlsZS0+eTEgPD0gbF90aWxlLT55MCkpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhtYW5hZ2VyLCBFVlRfRVJST1IsICJUaWxlIFkgY29vcmRpbmF0ZXMgYXJlIG5vdCBzdXBwb3J0ZWRcbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotCQkJCQlpZiAoISBsX2N1cnJlbnRfcHJlY2luY3QtPmluY2x0cmVlKSAgICAgewotCQkJCQkJb3BqX2V2ZW50X21zZyhtYW5hZ2VyLCBFVlRfV0FSTklORywgIk5vIGluY2x0cmVlIGNyZWF0ZWQuXG4iKTsKLQkJCQkJCS8qcmV0dXJuIE9QSl9GQUxTRTsqLwotCQkJCQl9CiAKLQkJCQkJaWYgKCEgbF9jdXJyZW50X3ByZWNpbmN0LT5pbXNidHJlZSkgewotCQkJCQkJbF9jdXJyZW50X3ByZWNpbmN0LT5pbXNidHJlZSA9IG9wal90Z3RfY3JlYXRlKGxfY3VycmVudF9wcmVjaW5jdC0+Y3csIGxfY3VycmVudF9wcmVjaW5jdC0+Y2gsIG1hbmFnZXIpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbF9jdXJyZW50X3ByZWNpbmN0LT5pbXNidHJlZSA9IG9wal90Z3RfaW5pdChsX2N1cnJlbnRfcHJlY2luY3QtPmltc2J0cmVlLCBsX2N1cnJlbnRfcHJlY2luY3QtPmN3LCBsX2N1cnJlbnRfcHJlY2luY3QtPmNoLCBtYW5hZ2VyKTsKLQkJCQkJfQorICAgIC8qIHRlc3RjYXNlIDE4ODgucGRmLmFzYW4uMzUuOTg4ICovCisgICAgaWYgKGxfdGNjcC0+bnVtcmVzb2x1dGlvbnMgPT0gMCkgeworICAgICAgICBvcGpfZXZlbnRfbXNnKG1hbmFnZXIsIEVWVF9FUlJPUiwgInRpbGVzIHJlcXVpcmUgYXQgbGVhc3Qgb25lIHJlc29sdXRpb25cbiIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICAvKmZwcmludGYoc3RkZXJyLCAiVGlsZSBib3JkZXIgPSAlZCwlZCwlZCwlZFxuIiwgbF90aWxlLT54MCwgbF90aWxlLT55MCxsX3RpbGUtPngxLGxfdGlsZS0+eTEpOyovCiAKLQkJCQkJaWYgKCEgbF9jdXJyZW50X3ByZWNpbmN0LT5pbXNidHJlZSkgewotCQkJCQkJb3BqX2V2ZW50X21zZyhtYW5hZ2VyLCBFVlRfV0FSTklORywgIk5vIGltc2J0cmVlIGNyZWF0ZWQuXG4iKTsKLQkJCQkJCS8qcmV0dXJuIE9QSl9GQUxTRTsqLwotCQkJCQl9CisgICAgLyp0aWxlLT5udW1jb21wcyA9IGltYWdlLT5udW1jb21wczsgKi8KKyAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IGxfdGlsZS0+bnVtY29tcHM7ICsrY29tcG5vKSB7CisgICAgICAgIC8qZnByaW50ZihzdGRlcnIsICJjb21wbm8gPSAlZC8lZFxuIiwgY29tcG5vLCBsX3RpbGUtPm51bWNvbXBzKTsqLworICAgICAgICBsX2ltYWdlX2NvbXAtPnJlc25vX2RlY29kZWQgPSAwOworICAgICAgICAvKiBib3JkZXIgb2YgZWFjaCBsX3RpbGUgY29tcG9uZW50IChnbG9iYWwpICovCisgICAgICAgIGxfdGlsZWMtPngwID0gb3BqX2ludF9jZWlsZGl2KGxfdGlsZS0+eDAsIChPUEpfSU5UMzIpbF9pbWFnZV9jb21wLT5keCk7CisgICAgICAgIGxfdGlsZWMtPnkwID0gb3BqX2ludF9jZWlsZGl2KGxfdGlsZS0+eTAsIChPUEpfSU5UMzIpbF9pbWFnZV9jb21wLT5keSk7CisgICAgICAgIGxfdGlsZWMtPngxID0gb3BqX2ludF9jZWlsZGl2KGxfdGlsZS0+eDEsIChPUEpfSU5UMzIpbF9pbWFnZV9jb21wLT5keCk7CisgICAgICAgIGxfdGlsZWMtPnkxID0gb3BqX2ludF9jZWlsZGl2KGxfdGlsZS0+eTEsIChPUEpfSU5UMzIpbF9pbWFnZV9jb21wLT5keSk7CisgICAgICAgIGxfdGlsZWMtPmNvbXBubyA9IGNvbXBubzsKKyAgICAgICAgLypmcHJpbnRmKHN0ZGVyciwgIlx0VGlsZSBjb21wbyBib3JkZXIgPSAlZCwlZCwlZCwlZFxuIiwgbF90aWxlYy0+eDAsIGxfdGlsZWMtPnkwLGxfdGlsZWMtPngxLGxfdGlsZWMtPnkxKTsqLwogCi0JCQkJCWZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgbF9uYl9jb2RlX2Jsb2NrczsgKytjYmxrbm8pIHsKLQkJCQkJCU9QSl9JTlQzMiBjYmxreHN0YXJ0ID0gdGxjYmxreHN0YXJ0ICsgKE9QSl9JTlQzMikoY2Jsa25vICUgbF9jdXJyZW50X3ByZWNpbmN0LT5jdykgKiAoMSA8PCBjYmxrd2lkdGhleHBuKTsKLQkJCQkJCU9QSl9JTlQzMiBjYmxreXN0YXJ0ID0gdGxjYmxreXN0YXJ0ICsgKE9QSl9JTlQzMikoY2Jsa25vIC8gbF9jdXJyZW50X3ByZWNpbmN0LT5jdykgKiAoMSA8PCBjYmxraGVpZ2h0ZXhwbik7Ci0JCQkJCQlPUEpfSU5UMzIgY2Jsa3hlbmQgPSBjYmxreHN0YXJ0ICsgKDEgPDwgY2Jsa3dpZHRoZXhwbik7Ci0JCQkJCQlPUEpfSU5UMzIgY2Jsa3llbmQgPSBjYmxreXN0YXJ0ICsgKDEgPDwgY2Jsa2hlaWdodGV4cG4pOwotCQkJCQkJCi0JCQkJCQlpZiAoaXNFbmNvZGVyKSB7Ci0JCQkJCQkJb3BqX3RjZF9jYmxrX2VuY190KiBsX2NvZGVfYmxvY2sgPSBsX2N1cnJlbnRfcHJlY2luY3QtPmNibGtzLmVuYyArIGNibGtubzsKLQkJCQkJCQkKLQkJCQkJCQlpZiAoISBvcGpfdGNkX2NvZGVfYmxvY2tfZW5jX2FsbG9jYXRlKGxfY29kZV9ibG9jaykpIHsKLQkJCQkJCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJCQkJCQl9Ci0JCQkJCQkJLyogY29kZS1ibG9jayBzaXplIChnbG9iYWwpICovCi0JCQkJCQkJbF9jb2RlX2Jsb2NrLT54MCA9IG9wal9pbnRfbWF4KGNibGt4c3RhcnQsIGxfY3VycmVudF9wcmVjaW5jdC0+eDApOwotCQkJCQkJCWxfY29kZV9ibG9jay0+eTAgPSBvcGpfaW50X21heChjYmxreXN0YXJ0LCBsX2N1cnJlbnRfcHJlY2luY3QtPnkwKTsKLQkJCQkJCQlsX2NvZGVfYmxvY2stPngxID0gb3BqX2ludF9taW4oY2Jsa3hlbmQsIGxfY3VycmVudF9wcmVjaW5jdC0+eDEpOwotCQkJCQkJCWxfY29kZV9ibG9jay0+eTEgPSBvcGpfaW50X21pbihjYmxreWVuZCwgbF9jdXJyZW50X3ByZWNpbmN0LT55MSk7Ci0JCQkJCQkJCi0JCQkJCQkJaWYgKCEgb3BqX3RjZF9jb2RlX2Jsb2NrX2VuY19hbGxvY2F0ZV9kYXRhKGxfY29kZV9ibG9jaykpIHsKLQkJCQkJCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCW9wal90Y2RfY2Jsa19kZWNfdCogbF9jb2RlX2Jsb2NrID0gbF9jdXJyZW50X3ByZWNpbmN0LT5jYmxrcy5kZWMgKyBjYmxrbm87Ci0JCQkJCQkJCi0JCQkJCQkJaWYgKCEgb3BqX3RjZF9jb2RlX2Jsb2NrX2RlY19hbGxvY2F0ZShsX2NvZGVfYmxvY2spKSB7Ci0JCQkJCQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCQkJCQkJfQotCQkJCQkJCS8qIGNvZGUtYmxvY2sgc2l6ZSAoZ2xvYmFsKSAqLwotCQkJCQkJCWxfY29kZV9ibG9jay0+eDAgPSBvcGpfaW50X21heChjYmxreHN0YXJ0LCBsX2N1cnJlbnRfcHJlY2luY3QtPngwKTsKLQkJCQkJCQlsX2NvZGVfYmxvY2stPnkwID0gb3BqX2ludF9tYXgoY2Jsa3lzdGFydCwgbF9jdXJyZW50X3ByZWNpbmN0LT55MCk7Ci0JCQkJCQkJbF9jb2RlX2Jsb2NrLT54MSA9IG9wal9pbnRfbWluKGNibGt4ZW5kLCBsX2N1cnJlbnRfcHJlY2luY3QtPngxKTsKLQkJCQkJCQlsX2NvZGVfYmxvY2stPnkxID0gb3BqX2ludF9taW4oY2Jsa3llbmQsIGxfY3VycmVudF9wcmVjaW5jdC0+eTEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCSsrbF9jdXJyZW50X3ByZWNpbmN0OwotCQkJCX0gLyogcHJlY25vICovCi0JCQkJKytsX2JhbmQ7Ci0JCQkJKytsX3N0ZXBfc2l6ZTsKLQkJCX0gLyogYmFuZG5vICovCi0JCQkrK2xfcmVzOwotCQkJLS1sX2xldmVsX25vOwotCQl9IC8qIHJlc25vICovCi0JCSsrbF90Y2NwOwotCQkrK2xfdGlsZWM7Ci0JCSsrbF9pbWFnZV9jb21wOwotCX0gLyogY29tcG5vICovCi0JcmV0dXJuIE9QSl9UUlVFOworICAgICAgICBsX3RpbGVjLT5udW1yZXNvbHV0aW9ucyA9IGxfdGNjcC0+bnVtcmVzb2x1dGlvbnM7CisgICAgICAgIGlmIChsX3RjY3AtPm51bXJlc29sdXRpb25zIDwgbF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2RlYy5tX3JlZHVjZSkgeworICAgICAgICAgICAgbF90aWxlYy0+bWluaW11bV9udW1fcmVzb2x1dGlvbnMgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbF90aWxlYy0+bWluaW11bV9udW1fcmVzb2x1dGlvbnMgPSBsX3RjY3AtPm51bXJlc29sdXRpb25zIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2RlYy5tX3JlZHVjZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0VuY29kZXIpIHsKKyAgICAgICAgICAgIE9QSl9TSVpFX1QgbF90aWxlX2RhdGFfc2l6ZTsKKworICAgICAgICAgICAgaWYgKGxfdGlsZWMtPngwID49IGxfdGlsZWMtPngxIHx8IGxfdGlsZWMtPnkwID49IGxfdGlsZWMtPnkxKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhtYW5hZ2VyLCBFVlRfRVJST1IsICJJbnZhbGlkIHRpbGUgZGF0YVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY29tcHV0ZSBsX2RhdGFfc2l6ZSB3aXRoIG92ZXJmbG93IGNoZWNrICovCisgICAgICAgICAgICBPUEpfU0laRV9UIHcgPSAoT1BKX1NJWkVfVCkobF90aWxlYy0+eDEgLSBsX3RpbGVjLT54MCk7CisgICAgICAgICAgICBPUEpfU0laRV9UIGggPSAoT1BKX1NJWkVfVCkobF90aWxlYy0+eTEgLSBsX3RpbGVjLT55MCk7CisKKyAgICAgICAgICAgIC8qIGlzc3VlIDczMywgbF9kYXRhX3NpemUgPT0gMFUsIHByb2JhYmx5IHNvbWV0aGluZyB3cm9uZyBzaG91bGQgYmUgY2hlY2tlZCBiZWZvcmUgZ2V0dGluZyBoZXJlICovCisgICAgICAgICAgICBpZiAoaCA+IDAgJiYgdyA+IFNJWkVfTUFYIC8gaCkgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cobWFuYWdlciwgRVZUX0VSUk9SLCAiU2l6ZSBvZiB0aWxlIGRhdGEgZXhjZWVkcyBzeXN0ZW0gbGltaXRzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbF90aWxlX2RhdGFfc2l6ZSA9IHcgKiBoOworCisgICAgICAgICAgICBpZiAoU0laRV9NQVggLyBzaXplb2YoT1BKX1VJTlQzMikgPCBsX3RpbGVfZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhtYW5hZ2VyLCBFVlRfRVJST1IsICJTaXplIG9mIHRpbGUgZGF0YSBleGNlZWRzIHN5c3RlbSBsaW1pdHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsX3RpbGVfZGF0YV9zaXplID0gbF90aWxlX2RhdGFfc2l6ZSAqIHNpemVvZihPUEpfVUlOVDMyKTsKKworICAgICAgICAgICAgbF90aWxlYy0+ZGF0YV9zaXplX25lZWRlZCA9IGxfdGlsZV9kYXRhX3NpemU7CisgICAgICAgIH0KKworICAgICAgICBsX2RhdGFfc2l6ZSA9IGxfdGlsZWMtPm51bXJlc29sdXRpb25zICogKE9QSl9VSU5UMzIpc2l6ZW9mKAorICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCk7CisKKyAgICAgICAgb3BqX2ltYWdlX2RhdGFfZnJlZShsX3RpbGVjLT5kYXRhX3dpbik7CisgICAgICAgIGxfdGlsZWMtPmRhdGFfd2luID0gTlVMTDsKKyAgICAgICAgbF90aWxlYy0+d2luX3gwID0gMDsKKyAgICAgICAgbF90aWxlYy0+d2luX3kwID0gMDsKKyAgICAgICAgbF90aWxlYy0+d2luX3gxID0gMDsKKyAgICAgICAgbF90aWxlYy0+d2luX3kxID0gMDsKKworICAgICAgICBpZiAobF90aWxlYy0+cmVzb2x1dGlvbnMgPT0gMDApIHsKKyAgICAgICAgICAgIGxfdGlsZWMtPnJlc29sdXRpb25zID0gKG9wal90Y2RfcmVzb2x1dGlvbl90ICopIG9wal9tYWxsb2MobF9kYXRhX3NpemUpOworICAgICAgICAgICAgaWYgKCEgbF90aWxlYy0+cmVzb2x1dGlvbnMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLypmcHJpbnRmKHN0ZGVyciwgIlx0QWxsb2NhdGUgcmVzb2x1dGlvbnMgb2YgdGlsZWMgKG9wal90Y2RfcmVzb2x1dGlvbl90KTogJWRcbiIsbF9kYXRhX3NpemUpOyovCisgICAgICAgICAgICBsX3RpbGVjLT5yZXNvbHV0aW9uc19zaXplID0gbF9kYXRhX3NpemU7CisgICAgICAgICAgICBtZW1zZXQobF90aWxlYy0+cmVzb2x1dGlvbnMsIDAsIGxfZGF0YV9zaXplKTsKKyAgICAgICAgfSBlbHNlIGlmIChsX2RhdGFfc2l6ZSA+IGxfdGlsZWMtPnJlc29sdXRpb25zX3NpemUpIHsKKyAgICAgICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiBuZXdfcmVzb2x1dGlvbnMgPSAob3BqX3RjZF9yZXNvbHV0aW9uX3QgKikgb3BqX3JlYWxsb2MoCisgICAgICAgICAgICAgICAgICAgIGxfdGlsZWMtPnJlc29sdXRpb25zLCBsX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICBpZiAoISBuZXdfcmVzb2x1dGlvbnMpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKG1hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aWxlIHJlc29sdXRpb25zXG4iKTsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShsX3RpbGVjLT5yZXNvbHV0aW9ucyk7CisgICAgICAgICAgICAgICAgbF90aWxlYy0+cmVzb2x1dGlvbnMgPSBOVUxMOworICAgICAgICAgICAgICAgIGxfdGlsZWMtPnJlc29sdXRpb25zX3NpemUgPSAwOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsX3RpbGVjLT5yZXNvbHV0aW9ucyA9IG5ld19yZXNvbHV0aW9uczsKKyAgICAgICAgICAgIC8qZnByaW50ZihzdGRlcnIsICJcdFJlYWxsb2NhdGUgZGF0YSBvZiB0aWxlYyAoaW50KTogZnJvbSAlZCB0byAlZCB4IE9QSl9VSU5UMzJcbiIsIGxfdGlsZWMtPnJlc29sdXRpb25zX3NpemUsIGxfZGF0YV9zaXplKTsqLworICAgICAgICAgICAgbWVtc2V0KCgoT1BKX0JZVEUqKSBsX3RpbGVjLT5yZXNvbHV0aW9ucykgKyBsX3RpbGVjLT5yZXNvbHV0aW9uc19zaXplLCAwLAorICAgICAgICAgICAgICAgICAgIGxfZGF0YV9zaXplIC0gbF90aWxlYy0+cmVzb2x1dGlvbnNfc2l6ZSk7CisgICAgICAgICAgICBsX3RpbGVjLT5yZXNvbHV0aW9uc19zaXplID0gbF9kYXRhX3NpemU7CisgICAgICAgIH0KKworICAgICAgICBsX2xldmVsX25vID0gbF90aWxlYy0+bnVtcmVzb2x1dGlvbnM7CisgICAgICAgIGxfcmVzID0gbF90aWxlYy0+cmVzb2x1dGlvbnM7CisgICAgICAgIGxfc3RlcF9zaXplID0gbF90Y2NwLT5zdGVwc2l6ZXM7CisgICAgICAgIGlmIChsX3RjY3AtPnFtZmJpZCA9PSAwKSB7CisgICAgICAgICAgICBsX2dhaW5fcHRyID0gJm9wal9kd3RfZ2V0Z2Fpbl9yZWFsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbF9nYWluX3B0ciAgPSAmb3BqX2R3dF9nZXRnYWluOworICAgICAgICB9CisgICAgICAgIC8qZnByaW50ZihzdGRlcnIsICJcdGxldmVsX25vPSVkXG4iLGxfbGV2ZWxfbm8pOyovCisKKyAgICAgICAgZm9yIChyZXNubyA9IDA7IHJlc25vIDwgbF90aWxlYy0+bnVtcmVzb2x1dGlvbnM7ICsrcmVzbm8pIHsKKyAgICAgICAgICAgIC8qZnByaW50ZihzdGRlcnIsICJcdFx0cmVzbm8gPSAlZC8lZFxuIiwgcmVzbm8sIGxfdGlsZWMtPm51bXJlc29sdXRpb25zKTsqLworICAgICAgICAgICAgT1BKX0lOVDMyIHRsY2JneHN0YXJ0LCB0bGNiZ3lzdGFydCAvKiwgYnJjYmd4ZW5kLCBicmNiZ3llbmQqLzsKKyAgICAgICAgICAgIE9QSl9VSU5UMzIgY2Jnd2lkdGhleHBuLCBjYmdoZWlnaHRleHBuOworICAgICAgICAgICAgT1BKX1VJTlQzMiBjYmxrd2lkdGhleHBuLCBjYmxraGVpZ2h0ZXhwbjsKKworICAgICAgICAgICAgLS1sX2xldmVsX25vOworCisgICAgICAgICAgICAvKiBib3JkZXIgZm9yIGVhY2ggcmVzb2x1dGlvbiBsZXZlbCAoZ2xvYmFsKSAqLworICAgICAgICAgICAgbF9yZXMtPngwID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RpbGVjLT54MCwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKKyAgICAgICAgICAgIGxfcmVzLT55MCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90aWxlYy0+eTAsIChPUEpfSU5UMzIpbF9sZXZlbF9ubyk7CisgICAgICAgICAgICBsX3Jlcy0+eDEgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGlsZWMtPngxLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOworICAgICAgICAgICAgbF9yZXMtPnkxID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RpbGVjLT55MSwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKKworICAgICAgICAgICAgLypmcHJpbnRmKHN0ZGVyciwgIlx0XHRcdHJlc194MD0gJWQsIHJlc195MCA9JWQsIHJlc194MT0lZCwgcmVzX3kxPSVkXG4iLCBsX3Jlcy0+eDAsIGxfcmVzLT55MCwgbF9yZXMtPngxLCBsX3Jlcy0+eTEpOyovCisgICAgICAgICAgICAvKiBwLiAzNSwgdGFibGUgQS0yMywgSVNPL0lFQyBGRElTMTU0NDQ0LTEgOiAyMDAwICgxOCBhdWd1c3QgMjAwMCkgKi8KKyAgICAgICAgICAgIGxfcGR4ID0gbF90Y2NwLT5wcmN3W3Jlc25vXTsKKyAgICAgICAgICAgIGxfcGR5ID0gbF90Y2NwLT5wcmNoW3Jlc25vXTsKKyAgICAgICAgICAgIC8qZnByaW50ZihzdGRlcnIsICJcdFx0XHRwZHg9JWQsIHBkeT0lZFxuIiwgbF9wZHgsIGxfcGR5KTsqLworICAgICAgICAgICAgLyogcC4gNjQsIEIuNiwgSVNPL0lFQyBGRElTMTU0NDQtMSA6IDIwMDAgKDE4IGF1Z3VzdCAyMDAwKSAgKi8KKyAgICAgICAgICAgIGxfdGxfcHJjX3hfc3RhcnQgPSBvcGpfaW50X2Zsb29yZGl2cG93MihsX3Jlcy0+eDAsIChPUEpfSU5UMzIpbF9wZHgpIDw8IGxfcGR4OworICAgICAgICAgICAgbF90bF9wcmNfeV9zdGFydCA9IG9wal9pbnRfZmxvb3JkaXZwb3cyKGxfcmVzLT55MCwgKE9QSl9JTlQzMilsX3BkeSkgPDwgbF9wZHk7CisgICAgICAgICAgICBsX2JyX3ByY194X2VuZCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF9yZXMtPngxLCAoT1BKX0lOVDMyKWxfcGR4KSA8PCBsX3BkeDsKKyAgICAgICAgICAgIGxfYnJfcHJjX3lfZW5kID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3Jlcy0+eTEsIChPUEpfSU5UMzIpbF9wZHkpIDw8IGxfcGR5OworICAgICAgICAgICAgLypmcHJpbnRmKHN0ZGVyciwgIlx0XHRcdHByY194X3N0YXJ0PSVkLCBwcmNfeV9zdGFydD0lZCwgYnJfcHJjX3hfZW5kPSVkLCBicl9wcmNfeV9lbmQ9JWQgXG4iLCBsX3RsX3ByY194X3N0YXJ0LCBsX3RsX3ByY195X3N0YXJ0LCBsX2JyX3ByY194X2VuZCAsbF9icl9wcmNfeV9lbmQgKTsqLworCisgICAgICAgICAgICBsX3Jlcy0+cHcgPSAobF9yZXMtPngwID09IGxfcmVzLT54MSkgPyAwVSA6IChPUEpfVUlOVDMyKSgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9icl9wcmNfeF9lbmQgLSBsX3RsX3ByY194X3N0YXJ0KSA+PiBsX3BkeCk7CisgICAgICAgICAgICBsX3Jlcy0+cGggPSAobF9yZXMtPnkwID09IGxfcmVzLT55MSkgPyAwVSA6IChPUEpfVUlOVDMyKSgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9icl9wcmNfeV9lbmQgLSBsX3RsX3ByY195X3N0YXJ0KSA+PiBsX3BkeSk7CisgICAgICAgICAgICAvKmZwcmludGYoc3RkZXJyLCAiXHRcdFx0cmVzX3B3PSVkLCByZXNfcGg9JWRcbiIsIGxfcmVzLT5wdywgbF9yZXMtPnBoICk7Ki8KKworICAgICAgICAgICAgaWYgKChsX3Jlcy0+cHcgIT0gMFUpICYmICgoKChPUEpfVUlOVDMyKSAtIDEpIC8gbF9yZXMtPnB3KSA8IGxfcmVzLT5waCkpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKG1hbmFnZXIsIEVWVF9FUlJPUiwgIlNpemUgb2YgdGlsZSBkYXRhIGV4Y2VlZHMgc3lzdGVtIGxpbWl0c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxfbmJfcHJlY2luY3RzID0gbF9yZXMtPnB3ICogbF9yZXMtPnBoOworCisgICAgICAgICAgICBpZiAoKCgoT1BKX1VJTlQzMikgLSAxKSAvIChPUEpfVUlOVDMyKXNpemVvZihvcGpfdGNkX3ByZWNpbmN0X3QpKSA8CisgICAgICAgICAgICAgICAgICAgIGxfbmJfcHJlY2luY3RzKSB7CisgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhtYW5hZ2VyLCBFVlRfRVJST1IsICJTaXplIG9mIHRpbGUgZGF0YSBleGNlZWRzIHN5c3RlbSBsaW1pdHNcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsX25iX3ByZWNpbmN0X3NpemUgPSBsX25iX3ByZWNpbmN0cyAqIChPUEpfVUlOVDMyKXNpemVvZihvcGpfdGNkX3ByZWNpbmN0X3QpOworCisgICAgICAgICAgICBpZiAocmVzbm8gPT0gMCkgeworICAgICAgICAgICAgICAgIHRsY2JneHN0YXJ0ID0gbF90bF9wcmNfeF9zdGFydDsKKyAgICAgICAgICAgICAgICB0bGNiZ3lzdGFydCA9IGxfdGxfcHJjX3lfc3RhcnQ7CisgICAgICAgICAgICAgICAgLypicmNiZ3hlbmQgPSBsX2JyX3ByY194X2VuZDsqLworICAgICAgICAgICAgICAgIC8qIGJyY2JneWVuZCA9IGxfYnJfcHJjX3lfZW5kOyovCisgICAgICAgICAgICAgICAgY2Jnd2lkdGhleHBuID0gbF9wZHg7CisgICAgICAgICAgICAgICAgY2JnaGVpZ2h0ZXhwbiA9IGxfcGR5OworICAgICAgICAgICAgICAgIGxfcmVzLT5udW1iYW5kcyA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRsY2JneHN0YXJ0ID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RsX3ByY194X3N0YXJ0LCAxKTsKKyAgICAgICAgICAgICAgICB0bGNiZ3lzdGFydCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90bF9wcmNfeV9zdGFydCwgMSk7CisgICAgICAgICAgICAgICAgLypicmNiZ3hlbmQgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfYnJfcHJjX3hfZW5kLCAxKTsqLworICAgICAgICAgICAgICAgIC8qYnJjYmd5ZW5kID0gb3BqX2ludF9jZWlsZGl2cG93MihsX2JyX3ByY195X2VuZCwgMSk7Ki8KKyAgICAgICAgICAgICAgICBjYmd3aWR0aGV4cG4gPSBsX3BkeCAtIDE7CisgICAgICAgICAgICAgICAgY2JnaGVpZ2h0ZXhwbiA9IGxfcGR5IC0gMTsKKyAgICAgICAgICAgICAgICBsX3Jlcy0+bnVtYmFuZHMgPSAzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYmxrd2lkdGhleHBuID0gb3BqX3VpbnRfbWluKGxfdGNjcC0+Y2Jsa3csIGNiZ3dpZHRoZXhwbik7CisgICAgICAgICAgICBjYmxraGVpZ2h0ZXhwbiA9IG9wal91aW50X21pbihsX3RjY3AtPmNibGtoLCBjYmdoZWlnaHRleHBuKTsKKyAgICAgICAgICAgIGxfYmFuZCA9IGxfcmVzLT5iYW5kczsKKworICAgICAgICAgICAgZm9yIChiYW5kbm8gPSAwOyBiYW5kbm8gPCBsX3Jlcy0+bnVtYmFuZHM7ICsrYmFuZG5vLCArK2xfYmFuZCwgKytsX3N0ZXBfc2l6ZSkgeworICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBudW1icHM7CisgICAgICAgICAgICAgICAgLypmcHJpbnRmKHN0ZGVyciwgIlx0XHRcdGJhbmRfbm89JWQvJWRcbiIsIGJhbmRubywgbF9yZXMtPm51bWJhbmRzICk7Ki8KKworICAgICAgICAgICAgICAgIGlmIChyZXNubyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxfYmFuZC0+YmFuZG5vID0gMCA7CisgICAgICAgICAgICAgICAgICAgIGxfYmFuZC0+eDAgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGlsZWMtPngwLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOworICAgICAgICAgICAgICAgICAgICBsX2JhbmQtPnkwID0gb3BqX2ludF9jZWlsZGl2cG93MihsX3RpbGVjLT55MCwgKE9QSl9JTlQzMilsX2xldmVsX25vKTsKKyAgICAgICAgICAgICAgICAgICAgbF9iYW5kLT54MSA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF90aWxlYy0+eDEsIChPUEpfSU5UMzIpbF9sZXZlbF9ubyk7CisgICAgICAgICAgICAgICAgICAgIGxfYmFuZC0+eTEgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfdGlsZWMtPnkxLCAoT1BKX0lOVDMyKWxfbGV2ZWxfbm8pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxfYmFuZC0+YmFuZG5vID0gYmFuZG5vICsgMTsKKyAgICAgICAgICAgICAgICAgICAgLyogeDBiID0gMSBpZiBiYW5kbm8gPSAxIG9yIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgbF94MGIgPSBsX2JhbmQtPmJhbmRubyAmIDE7CisgICAgICAgICAgICAgICAgICAgIC8qIHkwYiA9IDEgaWYgYmFuZG5vID0gMiBvciAzICovCisgICAgICAgICAgICAgICAgICAgIGxfeTBiID0gKE9QSl9JTlQzMikoKGxfYmFuZC0+YmFuZG5vKSA+PiAxKTsKKyAgICAgICAgICAgICAgICAgICAgLyogbF9iYW5kIGJvcmRlciAoZ2xvYmFsKSAqLworICAgICAgICAgICAgICAgICAgICBsX2JhbmQtPngwID0gb3BqX2ludDY0X2NlaWxkaXZwb3cyKGxfdGlsZWMtPngwIC0gKChPUEpfSU5UNjQpbF94MGIgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2xldmVsX25vKSwgKE9QSl9JTlQzMikobF9sZXZlbF9ubyArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgbF9iYW5kLT55MCA9IG9wal9pbnQ2NF9jZWlsZGl2cG93MihsX3RpbGVjLT55MCAtICgoT1BKX0lOVDY0KWxfeTBiIDw8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9sZXZlbF9ubyksIChPUEpfSU5UMzIpKGxfbGV2ZWxfbm8gKyAxKSk7CisgICAgICAgICAgICAgICAgICAgIGxfYmFuZC0+eDEgPSBvcGpfaW50NjRfY2VpbGRpdnBvdzIobF90aWxlYy0+eDEgLSAoKE9QSl9JTlQ2NClsX3gwYiA8PAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbGV2ZWxfbm8pLCAoT1BKX0lOVDMyKShsX2xldmVsX25vICsgMSkpOworICAgICAgICAgICAgICAgICAgICBsX2JhbmQtPnkxID0gb3BqX2ludDY0X2NlaWxkaXZwb3cyKGxfdGlsZWMtPnkxIC0gKChPUEpfSU5UNjQpbF95MGIgPDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2xldmVsX25vKSwgKE9QSl9JTlQzMikobF9sZXZlbF9ubyArIDEpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoaXNFbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIFNraXAgZW1wdHkgYmFuZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wal90Y2RfaXNfYmFuZF9lbXB0eShsX2JhbmQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBEbyBub3QgemVybyBsX2JhbmQtPnByZWNpbnRzIHRvIGF2b2lkIGxlYWtzICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBidXQgbWFrZSBzdXJlIHdlIGRvbid0IHVzZSBpdCBsYXRlciwgc2luY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGl0IHdpbGwgcG9pbnQgdG8gcHJlY2luY3RzIG9mIHByZXZpb3VzIGJhbmRzLi4uICovCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qKiBhdm9pZCBhbiBpZiB3aXRoIHN0b3JpbmcgZnVuY3Rpb24gcG9pbnRlciAqLworICAgICAgICAgICAgICAgIGxfZ2FpbiA9ICgqbF9nYWluX3B0cikobF9iYW5kLT5iYW5kbm8pOworICAgICAgICAgICAgICAgIG51bWJwcyA9IChPUEpfSU5UMzIpKGxfaW1hZ2VfY29tcC0+cHJlYyArIGxfZ2Fpbik7CisgICAgICAgICAgICAgICAgbF9iYW5kLT5zdGVwc2l6ZSA9IChPUEpfRkxPQVQzMikoKCgxLjAgKyBsX3N0ZXBfc2l6ZS0+bWFudCAvIDIwNDguMCkgKiBwb3coMi4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKShudW1icHMgLSBsX3N0ZXBfc2l6ZS0+ZXhwbikpKSkgKiBmcmFjdGlvbjsKKyAgICAgICAgICAgICAgICAvKiBNYiB2YWx1ZSBvZiBFcXVhdGlvbiBFLTIgaW4gIkUuMSBJbnZlcnNlIHF1YW50aXphdGlvbgorICAgICAgICAgICAgICAgICAqIHByb2NlZHVyZSIgb2YgdGhlIHN0YW5kYXJkICovCisgICAgICAgICAgICAgICAgbF9iYW5kLT5udW1icHMgPSBsX3N0ZXBfc2l6ZS0+ZXhwbiArIChPUEpfSU5UMzIpbF90Y2NwLT5udW1nYml0cyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOworCisgICAgICAgICAgICAgICAgaWYgKCFsX2JhbmQtPnByZWNpbmN0cyAmJiAobF9uYl9wcmVjaW5jdHMgPiAwVSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbF9iYW5kLT5wcmVjaW5jdHMgPSAob3BqX3RjZF9wcmVjaW5jdF90ICopIG9wal9tYWxsb2MoLyozICogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9uYl9wcmVjaW5jdF9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEgbF9iYW5kLT5wcmVjaW5jdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cobWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IGVub3VnaCBtZW1vcnkgdG8gaGFuZGxlIGJhbmQgcHJlY2ludHNcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKmZwcmludGYoc3RkZXJyLCAiXHRcdFx0XHRBbGxvY2F0ZSBwcmVjaW5jdHMgb2YgYSBiYW5kIChvcGpfdGNkX3ByZWNpbmN0X3QpOiAlZFxuIixsX25iX3ByZWNpbmN0X3NpemUpOyAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KGxfYmFuZC0+cHJlY2luY3RzLCAwLCBsX25iX3ByZWNpbmN0X3NpemUpOworICAgICAgICAgICAgICAgICAgICBsX2JhbmQtPnByZWNpbmN0c19kYXRhX3NpemUgPSBsX25iX3ByZWNpbmN0X3NpemU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsX2JhbmQtPnByZWNpbmN0c19kYXRhX3NpemUgPCBsX25iX3ByZWNpbmN0X3NpemUpIHsKKworICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3ByZWNpbmN0X3QgKiBuZXdfcHJlY2luY3RzID0gKG9wal90Y2RfcHJlY2luY3RfdCAqKSBvcGpfcmVhbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2JhbmQtPnByZWNpbmN0cywvKjMgKiAqLyBsX25iX3ByZWNpbmN0X3NpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAoISBuZXdfcHJlY2luY3RzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKG1hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGhhbmRsZSBiYW5kIHByZWNpbnRzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfYmFuZC0+cHJlY2luY3RzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfYmFuZC0+cHJlY2luY3RzID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfYmFuZC0+cHJlY2luY3RzX2RhdGFfc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGxfYmFuZC0+cHJlY2luY3RzID0gbmV3X3ByZWNpbmN0czsKKyAgICAgICAgICAgICAgICAgICAgLypmcHJpbnRmKHN0ZGVyciwgIlx0XHRcdFx0UmVhbGxvY2F0ZSBwcmVjaW5jdHMgb2YgYSBiYW5kIChvcGpfdGNkX3ByZWNpbmN0X3QpOiBmcm9tICVkIHRvICVkXG4iLGxfYmFuZC0+cHJlY2luY3RzX2RhdGFfc2l6ZSwgbF9uYl9wcmVjaW5jdF9zaXplKTsqLworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKChPUEpfQllURSAqKSBsX2JhbmQtPnByZWNpbmN0cykgKyBsX2JhbmQtPnByZWNpbmN0c19kYXRhX3NpemUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsX25iX3ByZWNpbmN0X3NpemUgLSBsX2JhbmQtPnByZWNpbmN0c19kYXRhX3NpemUpOworICAgICAgICAgICAgICAgICAgICBsX2JhbmQtPnByZWNpbmN0c19kYXRhX3NpemUgPSBsX25iX3ByZWNpbmN0X3NpemU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbF9jdXJyZW50X3ByZWNpbmN0ID0gbF9iYW5kLT5wcmVjaW5jdHM7CisgICAgICAgICAgICAgICAgZm9yIChwcmVjbm8gPSAwOyBwcmVjbm8gPCBsX25iX3ByZWNpbmN0czsgKytwcmVjbm8pIHsKKyAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHRsY2Jsa3hzdGFydCwgdGxjYmxreXN0YXJ0LCBicmNibGt4ZW5kLCBicmNibGt5ZW5kOworICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgY2JneHN0YXJ0ID0gdGxjYmd4c3RhcnQgKyAoT1BKX0lOVDMyKShwcmVjbm8gJSBsX3Jlcy0+cHcpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IGNiZ3dpZHRoZXhwbik7CisgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBjYmd5c3RhcnQgPSB0bGNiZ3lzdGFydCArIChPUEpfSU5UMzIpKHByZWNubyAvIGxfcmVzLT5wdykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgY2JnaGVpZ2h0ZXhwbik7CisgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBjYmd4ZW5kID0gY2JneHN0YXJ0ICsgKDEgPDwgY2Jnd2lkdGhleHBuKTsKKyAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIGNiZ3llbmQgPSBjYmd5c3RhcnQgKyAoMSA8PCBjYmdoZWlnaHRleHBuKTsKKyAgICAgICAgICAgICAgICAgICAgLypmcHJpbnRmKHN0ZGVyciwgIlx0IHByZWNubz0lZDsgYmFuZG5vPSVkLCByZXNubz0lZDsgY29tcG5vPSVkXG4iLCBwcmVjbm8sIGJhbmRubyAsIHJlc25vLCBjb21wbm8pOyovCisgICAgICAgICAgICAgICAgICAgIC8qZnByaW50ZihzdGRlcnIsICJcdCB0bGNiZ3hzdGFydCg9JWQpICsgKHByZWNubyg9JWQpIHBlcmNlbnQgcmVzLT5wdyg9JWQpKSAqICgxIDw8IGNiZ3dpZHRoZXhwbig9JWQpKSBcbiIsdGxjYmd4c3RhcnQscHJlY25vLGxfcmVzLT5wdyxjYmd3aWR0aGV4cG4pOyovCisKKyAgICAgICAgICAgICAgICAgICAgLyogcHJlY2luY3Qgc2l6ZSAoZ2xvYmFsKSAqLworICAgICAgICAgICAgICAgICAgICAvKmZwcmludGYoc3RkZXJyLCAiXHQgY2JneHN0YXJ0PSVkLCBsX2JhbmQtPngwID0gJWQgXG4iLGNiZ3hzdGFydCwgbF9iYW5kLT54MCk7Ki8KKworICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcHJlY2luY3QtPngwID0gb3BqX2ludF9tYXgoY2JneHN0YXJ0LCBsX2JhbmQtPngwKTsKKyAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3ByZWNpbmN0LT55MCA9IG9wal9pbnRfbWF4KGNiZ3lzdGFydCwgbF9iYW5kLT55MCk7CisgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9wcmVjaW5jdC0+eDEgPSBvcGpfaW50X21pbihjYmd4ZW5kLCBsX2JhbmQtPngxKTsKKyAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3ByZWNpbmN0LT55MSA9IG9wal9pbnRfbWluKGNiZ3llbmQsIGxfYmFuZC0+eTEpOworICAgICAgICAgICAgICAgICAgICAvKmZwcmludGYoc3RkZXJyLCAiXHQgcHJjX3gwPSVkOyBwcmNfeTA9JWQsIHByY194MT0lZDsgcHJjX3kxPSVkXG4iLGxfY3VycmVudF9wcmVjaW5jdC0+eDAsIGxfY3VycmVudF9wcmVjaW5jdC0+eTAgLGxfY3VycmVudF9wcmVjaW5jdC0+eDEsIGxfY3VycmVudF9wcmVjaW5jdC0+eTEpOyovCisKKyAgICAgICAgICAgICAgICAgICAgdGxjYmxreHN0YXJ0ID0gb3BqX2ludF9mbG9vcmRpdnBvdzIobF9jdXJyZW50X3ByZWNpbmN0LT54MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMiljYmxrd2lkdGhleHBuKSA8PCBjYmxrd2lkdGhleHBuOworICAgICAgICAgICAgICAgICAgICAvKmZwcmludGYoc3RkZXJyLCAiXHQgdGxjYmxreHN0YXJ0ID0lZFxuIix0bGNibGt4c3RhcnQgKTsqLworICAgICAgICAgICAgICAgICAgICB0bGNibGt5c3RhcnQgPSBvcGpfaW50X2Zsb29yZGl2cG93MihsX2N1cnJlbnRfcHJlY2luY3QtPnkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0lOVDMyKWNibGtoZWlnaHRleHBuKSA8PCBjYmxraGVpZ2h0ZXhwbjsKKyAgICAgICAgICAgICAgICAgICAgLypmcHJpbnRmKHN0ZGVyciwgIlx0IHRsY2Jsa3lzdGFydCA9JWRcbiIsdGxjYmxreXN0YXJ0ICk7Ki8KKyAgICAgICAgICAgICAgICAgICAgYnJjYmxreGVuZCA9IG9wal9pbnRfY2VpbGRpdnBvdzIobF9jdXJyZW50X3ByZWNpbmN0LT54MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9JTlQzMiljYmxrd2lkdGhleHBuKSA8PCBjYmxrd2lkdGhleHBuOworICAgICAgICAgICAgICAgICAgICAvKmZwcmludGYoc3RkZXJyLCAiXHQgYnJjYmxreGVuZCA9JWRcbiIsYnJjYmxreGVuZCApOyovCisgICAgICAgICAgICAgICAgICAgIGJyY2Jsa3llbmQgPSBvcGpfaW50X2NlaWxkaXZwb3cyKGxfY3VycmVudF9wcmVjaW5jdC0+eTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfSU5UMzIpY2Jsa2hlaWdodGV4cG4pIDw8IGNibGtoZWlnaHRleHBuOworICAgICAgICAgICAgICAgICAgICAvKmZwcmludGYoc3RkZXJyLCAiXHQgYnJjYmxreWVuZCA9JWRcbiIsYnJjYmxreWVuZCApOyovCisgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9wcmVjaW5jdC0+Y3cgPSAoT1BKX1VJTlQzMikoKGJyY2Jsa3hlbmQgLSB0bGNibGt4c3RhcnQpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jsa3dpZHRoZXhwbik7CisgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9wcmVjaW5jdC0+Y2ggPSAoT1BKX1VJTlQzMikoKGJyY2Jsa3llbmQgLSB0bGNibGt5c3RhcnQpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jsa2hlaWdodGV4cG4pOworICAgICAgICAgICAgICAgICAgICBpZiAobF9jdXJyZW50X3ByZWNpbmN0LT5jdyAmJiAoKE9QSl9VSU5UMzIpLTEpIC8gbF9jdXJyZW50X3ByZWNpbmN0LT5jdyA8IGxfY3VycmVudF9wcmVjaW5jdC0+Y2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbF9uYl9jb2RlX2Jsb2NrcyA9IGxfY3VycmVudF9wcmVjaW5jdC0+Y3cgKiBsX2N1cnJlbnRfcHJlY2luY3QtPmNoOworICAgICAgICAgICAgICAgICAgICAvKmZwcmludGYoc3RkZXJyLCAiXHRcdFx0XHQgcHJlY2luY3RfY3cgPSAlZCB4IHJlY2luY3RfY2ggPSAlZFxuIixsX2N1cnJlbnRfcHJlY2luY3QtPmN3LCBsX2N1cnJlbnRfcHJlY2luY3QtPmNoKTsgICAgICAqLworCisgICAgICAgICAgICAgICAgICAgIGlmICgoKE9QSl9VSU5UMzIpLTEpIC8gKE9QSl9VSU5UMzIpc2l6ZW9mX2Jsb2NrIDwgbF9uYl9jb2RlX2Jsb2NrcykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsX25iX2NvZGVfYmxvY2tzX3NpemUgPSBsX25iX2NvZGVfYmxvY2tzICogKE9QSl9VSU5UMzIpc2l6ZW9mX2Jsb2NrOworCisgICAgICAgICAgICAgICAgICAgIGlmICghbF9jdXJyZW50X3ByZWNpbmN0LT5jYmxrcy5ibG9ja3MgJiYgKGxfbmJfY29kZV9ibG9ja3MgPiAwVSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9wcmVjaW5jdC0+Y2Jsa3MuYmxvY2tzID0gb3BqX21hbGxvYyhsX25iX2NvZGVfYmxvY2tzX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbF9jdXJyZW50X3ByZWNpbmN0LT5jYmxrcy5ibG9ja3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLypmcHJpbnRmKHN0ZGVyciwgIlx0XHRcdFx0QWxsb2NhdGUgY2Jsa3Mgb2YgYSBwcmVjaW5jdCAob3BqX3RjZF9jYmxrX2RlY190KTogJWRcbiIsbF9uYl9jb2RlX2Jsb2Nrc19zaXplKTsqLworCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQobF9jdXJyZW50X3ByZWNpbmN0LT5jYmxrcy5ibG9ja3MsIDAsIGxfbmJfY29kZV9ibG9ja3Nfc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9wcmVjaW5jdC0+YmxvY2tfc2l6ZSA9IGxfbmJfY29kZV9ibG9ja3Nfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsX25iX2NvZGVfYmxvY2tzX3NpemUgPiBsX2N1cnJlbnRfcHJlY2luY3QtPmJsb2NrX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKm5ld19ibG9ja3MgPSBvcGpfcmVhbGxvYyhsX2N1cnJlbnRfcHJlY2luY3QtPmNibGtzLmJsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX25iX2NvZGVfYmxvY2tzX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmV3X2Jsb2NrcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY3VycmVudF9wcmVjaW5jdC0+Y2Jsa3MuYmxvY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcHJlY2luY3QtPmNibGtzLmJsb2NrcyA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3ByZWNpbmN0LT5ibG9ja19zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKG1hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgY3VycmVudCBwcmVjaW5jdCBjb2RlYmxvY2sgZWxlbWVudFxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9wcmVjaW5jdC0+Y2Jsa3MuYmxvY2tzID0gbmV3X2Jsb2NrczsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qZnByaW50ZihzdGRlcnIsICJcdFx0XHRcdFJlYWxsb2NhdGUgY2Jsa3Mgb2YgYSBwcmVjaW5jdCAob3BqX3RjZF9jYmxrX2RlY190KTogZnJvbSAlZCB0byAlZFxuIixsX2N1cnJlbnRfcHJlY2luY3QtPmJsb2NrX3NpemUsIGxfbmJfY29kZV9ibG9ja3Nfc2l6ZSk7ICAgICAqLworCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKChPUEpfQllURSAqKSBsX2N1cnJlbnRfcHJlY2luY3QtPmNibGtzLmJsb2NrcykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9wcmVjaW5jdC0+YmxvY2tfc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgbF9uYl9jb2RlX2Jsb2Nrc19zaXplIC0gbF9jdXJyZW50X3ByZWNpbmN0LT5ibG9ja19zaXplKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3ByZWNpbmN0LT5ibG9ja19zaXplID0gbF9uYl9jb2RlX2Jsb2Nrc19zaXplOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCEgbF9jdXJyZW50X3ByZWNpbmN0LT5pbmNsdHJlZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3ByZWNpbmN0LT5pbmNsdHJlZSA9IG9wal90Z3RfY3JlYXRlKGxfY3VycmVudF9wcmVjaW5jdC0+Y3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3ByZWNpbmN0LT5jaCwgbWFuYWdlcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcHJlY2luY3QtPmluY2x0cmVlID0gb3BqX3RndF9pbml0KGxfY3VycmVudF9wcmVjaW5jdC0+aW5jbHRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3ByZWNpbmN0LT5jdywgbF9jdXJyZW50X3ByZWNpbmN0LT5jaCwgbWFuYWdlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoISBsX2N1cnJlbnRfcHJlY2luY3QtPmltc2J0cmVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcHJlY2luY3QtPmltc2J0cmVlID0gb3BqX3RndF9jcmVhdGUobF9jdXJyZW50X3ByZWNpbmN0LT5jdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcHJlY2luY3QtPmNoLCBtYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfY3VycmVudF9wcmVjaW5jdC0+aW1zYnRyZWUgPSBvcGpfdGd0X2luaXQobF9jdXJyZW50X3ByZWNpbmN0LT5pbXNidHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcHJlY2luY3QtPmN3LCBsX2N1cnJlbnRfcHJlY2luY3QtPmNoLCBtYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgbF9uYl9jb2RlX2Jsb2NrczsgKytjYmxrbm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBjYmxreHN0YXJ0ID0gdGxjYmxreHN0YXJ0ICsgKE9QSl9JTlQzMikoY2Jsa25vICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3ByZWNpbmN0LT5jdykgKiAoMSA8PCBjYmxrd2lkdGhleHBuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiBjYmxreXN0YXJ0ID0gdGxjYmxreXN0YXJ0ICsgKE9QSl9JTlQzMikoY2Jsa25vIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3ByZWNpbmN0LT5jdykgKiAoMSA8PCBjYmxraGVpZ2h0ZXhwbik7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgY2Jsa3hlbmQgPSBjYmxreHN0YXJ0ICsgKDEgPDwgY2Jsa3dpZHRoZXhwbik7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgY2Jsa3llbmQgPSBjYmxreXN0YXJ0ICsgKDEgPDwgY2Jsa2hlaWdodGV4cG4pOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNFbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9jYmxrX2VuY190KiBsX2NvZGVfYmxvY2sgPSBsX2N1cnJlbnRfcHJlY2luY3QtPmNibGtzLmVuYyArIGNibGtubzsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal90Y2RfY29kZV9ibG9ja19lbmNfYWxsb2NhdGUobF9jb2RlX2Jsb2NrKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlLWJsb2NrIHNpemUgKGdsb2JhbCkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NvZGVfYmxvY2stPngwID0gb3BqX2ludF9tYXgoY2Jsa3hzdGFydCwgbF9jdXJyZW50X3ByZWNpbmN0LT54MCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jb2RlX2Jsb2NrLT55MCA9IG9wal9pbnRfbWF4KGNibGt5c3RhcnQsIGxfY3VycmVudF9wcmVjaW5jdC0+eTApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY29kZV9ibG9jay0+eDEgPSBvcGpfaW50X21pbihjYmxreGVuZCwgbF9jdXJyZW50X3ByZWNpbmN0LT54MSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jb2RlX2Jsb2NrLT55MSA9IG9wal9pbnRfbWluKGNibGt5ZW5kLCBsX2N1cnJlbnRfcHJlY2luY3QtPnkxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal90Y2RfY29kZV9ibG9ja19lbmNfYWxsb2NhdGVfZGF0YShsX2NvZGVfYmxvY2spKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX2NibGtfZGVjX3QqIGxfY29kZV9ibG9jayA9IGxfY3VycmVudF9wcmVjaW5jdC0+Y2Jsa3MuZGVjICsgY2Jsa25vOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX3RjZF9jb2RlX2Jsb2NrX2RlY19hbGxvY2F0ZShsX2NvZGVfYmxvY2spKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUtYmxvY2sgc2l6ZSAoZ2xvYmFsKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY29kZV9ibG9jay0+eDAgPSBvcGpfaW50X21heChjYmxreHN0YXJ0LCBsX2N1cnJlbnRfcHJlY2luY3QtPngwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NvZGVfYmxvY2stPnkwID0gb3BqX2ludF9tYXgoY2Jsa3lzdGFydCwgbF9jdXJyZW50X3ByZWNpbmN0LT55MCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jb2RlX2Jsb2NrLT54MSA9IG9wal9pbnRfbWluKGNibGt4ZW5kLCBsX2N1cnJlbnRfcHJlY2luY3QtPngxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2NvZGVfYmxvY2stPnkxID0gb3BqX2ludF9taW4oY2Jsa3llbmQsIGxfY3VycmVudF9wcmVjaW5jdC0+eTEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X3ByZWNpbmN0OworICAgICAgICAgICAgICAgIH0gLyogcHJlY25vICovCisgICAgICAgICAgICB9IC8qIGJhbmRubyAqLworICAgICAgICAgICAgKytsX3JlczsKKyAgICAgICAgfSAvKiByZXNubyAqLworICAgICAgICArK2xfdGNjcDsKKyAgICAgICAgKytsX3RpbGVjOworICAgICAgICArK2xfaW1hZ2VfY29tcDsKKyAgICB9IC8qIGNvbXBubyAqLworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAotT1BKX0JPT0wgb3BqX3RjZF9pbml0X2VuY29kZV90aWxlIChvcGpfdGNkX3QgKnBfdGNkLCBPUEpfVUlOVDMyIHBfdGlsZV9ubywgb3BqX2V2ZW50X21ncl90KiBwX21hbmFnZXIpCitPUEpfQk9PTCBvcGpfdGNkX2luaXRfZW5jb2RlX3RpbGUob3BqX3RjZF90ICpwX3RjZCwgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90KiBwX21hbmFnZXIpCiB7Ci0JcmV0dXJuIG9wal90Y2RfaW5pdF90aWxlKHBfdGNkLCBwX3RpbGVfbm8sIE9QSl9UUlVFLCAxLjBGLCBzaXplb2Yob3BqX3RjZF9jYmxrX2VuY190KSwgcF9tYW5hZ2VyKTsKKyAgICByZXR1cm4gb3BqX3RjZF9pbml0X3RpbGUocF90Y2QsIHBfdGlsZV9ubywgT1BKX1RSVUUsIDEuMEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvcGpfdGNkX2NibGtfZW5jX3QpLCBwX21hbmFnZXIpOwogfQogCi1PUEpfQk9PTCBvcGpfdGNkX2luaXRfZGVjb2RlX3RpbGUgKG9wal90Y2RfdCAqcF90Y2QsIE9QSl9VSU5UMzIgcF90aWxlX25vLCBvcGpfZXZlbnRfbWdyX3QqIHBfbWFuYWdlcikKK09QSl9CT09MIG9wal90Y2RfaW5pdF9kZWNvZGVfdGlsZShvcGpfdGNkX3QgKnBfdGNkLCBPUEpfVUlOVDMyIHBfdGlsZV9ubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QqIHBfbWFuYWdlcikKIHsKLQlyZXR1cm4gb3BqX3RjZF9pbml0X3RpbGUocF90Y2QsIHBfdGlsZV9ubywgT1BKX0ZBTFNFLCAwLjVGLCBzaXplb2Yob3BqX3RjZF9jYmxrX2RlY190KSwgcF9tYW5hZ2VyKTsKKyAgICByZXR1cm4gb3BqX3RjZF9pbml0X3RpbGUocF90Y2QsIHBfdGlsZV9ubywgT1BKX0ZBTFNFLCAwLjVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob3BqX3RjZF9jYmxrX2RlY190KSwgcF9tYW5hZ2VyKTsKIH0KIAogLyoqCiAgKiBBbGxvY2F0ZXMgbWVtb3J5IGZvciBhbiBlbmNvZGluZyBjb2RlIGJsb2NrIChidXQgbm90IGRhdGEgbWVtb3J5KS4KICAqLwotc3RhdGljIE9QSl9CT09MIG9wal90Y2RfY29kZV9ibG9ja19lbmNfYWxsb2NhdGUgKG9wal90Y2RfY2Jsa19lbmNfdCAqIHBfY29kZV9ibG9jaykKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX2NvZGVfYmxvY2tfZW5jX2FsbG9jYXRlKG9wal90Y2RfY2Jsa19lbmNfdCAqCisgICAgICAgIHBfY29kZV9ibG9jaykKIHsKLQlpZiAoISBwX2NvZGVfYmxvY2stPmxheWVycykgewotCQkvKiBubyBtZW1zZXQgc2luY2UgZGF0YSAqLwotCQlwX2NvZGVfYmxvY2stPmxheWVycyA9IChvcGpfdGNkX2xheWVyX3QqKSBvcGpfY2FsbG9jKDEwMCwgc2l6ZW9mKG9wal90Y2RfbGF5ZXJfdCkpOwotCQlpZiAoISBwX2NvZGVfYmxvY2stPmxheWVycykgewotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCX0KLQlpZiAoISBwX2NvZGVfYmxvY2stPnBhc3NlcykgewotCQlwX2NvZGVfYmxvY2stPnBhc3NlcyA9IChvcGpfdGNkX3Bhc3NfdCopIG9wal9jYWxsb2MoMTAwLCBzaXplb2Yob3BqX3RjZF9wYXNzX3QpKTsKLQkJaWYgKCEgcF9jb2RlX2Jsb2NrLT5wYXNzZXMpIHsKLQkJCXJldHVybiBPUEpfRkFMU0U7Ci0JCX0KLQl9Ci0JcmV0dXJuIE9QSl9UUlVFOworICAgIGlmICghIHBfY29kZV9ibG9jay0+bGF5ZXJzKSB7CisgICAgICAgIC8qIG5vIG1lbXNldCBzaW5jZSBkYXRhICovCisgICAgICAgIHBfY29kZV9ibG9jay0+bGF5ZXJzID0gKG9wal90Y2RfbGF5ZXJfdCopIG9wal9jYWxsb2MoMTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvcGpfdGNkX2xheWVyX3QpKTsKKyAgICAgICAgaWYgKCEgcF9jb2RlX2Jsb2NrLT5sYXllcnMpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCEgcF9jb2RlX2Jsb2NrLT5wYXNzZXMpIHsKKyAgICAgICAgcF9jb2RlX2Jsb2NrLT5wYXNzZXMgPSAob3BqX3RjZF9wYXNzX3QqKSBvcGpfY2FsbG9jKDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob3BqX3RjZF9wYXNzX3QpKTsKKyAgICAgICAgaWYgKCEgcF9jb2RlX2Jsb2NrLT5wYXNzZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiAvKioKICAqIEFsbG9jYXRlcyBkYXRhIG1lbW9yeSBmb3IgYW4gZW5jb2RpbmcgY29kZSBibG9jay4KICAqLwotc3RhdGljIE9QSl9CT09MIG9wal90Y2RfY29kZV9ibG9ja19lbmNfYWxsb2NhdGVfZGF0YSAob3BqX3RjZF9jYmxrX2VuY190ICogcF9jb2RlX2Jsb2NrKQorc3RhdGljIE9QSl9CT09MIG9wal90Y2RfY29kZV9ibG9ja19lbmNfYWxsb2NhdGVfZGF0YShvcGpfdGNkX2NibGtfZW5jX3QgKgorICAgICAgICBwX2NvZGVfYmxvY2spCiB7Ci0JT1BKX1VJTlQzMiBsX2RhdGFfc2l6ZTsKLQkKLQlsX2RhdGFfc2l6ZSA9IChPUEpfVUlOVDMyKSgocF9jb2RlX2Jsb2NrLT54MSAtIHBfY29kZV9ibG9jay0+eDApICogKHBfY29kZV9ibG9jay0+eTEgLSBwX2NvZGVfYmxvY2stPnkwKSAqIChPUEpfSU5UMzIpc2l6ZW9mKE9QSl9VSU5UMzIpKTsKLQkKLQlpZiAobF9kYXRhX3NpemUgPiBwX2NvZGVfYmxvY2stPmRhdGFfc2l6ZSkgewotCQlpZiAocF9jb2RlX2Jsb2NrLT5kYXRhKSB7Ci0JCQlvcGpfZnJlZShwX2NvZGVfYmxvY2stPmRhdGEgLSAxKTsgLyogYWdhaW4sIHdoeSAtMSAqLwotCQl9Ci0JCXBfY29kZV9ibG9jay0+ZGF0YSA9IChPUEpfQllURSopIG9wal9tYWxsb2MobF9kYXRhX3NpemUrMSk7Ci0JCWlmKCEgcF9jb2RlX2Jsb2NrLT5kYXRhKSB7Ci0JCQlwX2NvZGVfYmxvY2stPmRhdGFfc2l6ZSA9IDBVOwotCQkJcmV0dXJuIE9QSl9GQUxTRTsKLQkJfQotCQlwX2NvZGVfYmxvY2stPmRhdGFfc2l6ZSA9IGxfZGF0YV9zaXplOwotCQkKLQkJcF9jb2RlX2Jsb2NrLT5kYXRhWzBdID0gMDsKLQkJcF9jb2RlX2Jsb2NrLT5kYXRhKz0xOyAgIC8qd2h5ICsxID8qLwotCX0KLQlyZXR1cm4gT1BKX1RSVUU7CisgICAgT1BKX1VJTlQzMiBsX2RhdGFfc2l6ZTsKKworICAgIC8qICsxIGlzIG5lZWRlZCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL3VjbG91dmFpbi9vcGVuanBlZy9pc3N1ZXMvODM1ICovCisgICAgLyogYW5kIGFjdHVhbGx5ICsyIHJlcXVpcmVkIGZvciBodHRwczovL2dpdGh1Yi5jb20vdWNsb3V2YWluL29wZW5qcGVnL2lzc3Vlcy85ODIgKi8KKyAgICAvKiBUT0RPOiBpcyB0aGVyZSBhIHRoZW9yZXRpY2FsIHVwcGVyLWJvdW5kIGZvciB0aGUgY29tcHJlc3NlZCBjb2RlICovCisgICAgLyogYmxvY2sgc2l6ZSA/ICovCisgICAgbF9kYXRhX3NpemUgPSAyICsgKE9QSl9VSU5UMzIpKChwX2NvZGVfYmxvY2stPngxIC0gcF9jb2RlX2Jsb2NrLT54MCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocF9jb2RlX2Jsb2NrLT55MSAtIHBfY29kZV9ibG9jay0+eTApICogKE9QSl9JTlQzMilzaXplb2YoT1BKX1VJTlQzMikpOworCisgICAgaWYgKGxfZGF0YV9zaXplID4gcF9jb2RlX2Jsb2NrLT5kYXRhX3NpemUpIHsKKyAgICAgICAgaWYgKHBfY29kZV9ibG9jay0+ZGF0YSkgeworICAgICAgICAgICAgLyogV2UgcmVmZXIgdG8gZGF0YSAtIDEgc2luY2UgYmVsb3cgd2UgaW5jcmVtZW50ZWQgaXQgKi8KKyAgICAgICAgICAgIG9wal9mcmVlKHBfY29kZV9ibG9jay0+ZGF0YSAtIDEpOworICAgICAgICB9CisgICAgICAgIHBfY29kZV9ibG9jay0+ZGF0YSA9IChPUEpfQllURSopIG9wal9tYWxsb2MobF9kYXRhX3NpemUgKyAxKTsKKyAgICAgICAgaWYgKCEgcF9jb2RlX2Jsb2NrLT5kYXRhKSB7CisgICAgICAgICAgICBwX2NvZGVfYmxvY2stPmRhdGFfc2l6ZSA9IDBVOworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBwX2NvZGVfYmxvY2stPmRhdGFfc2l6ZSA9IGxfZGF0YV9zaXplOworCisgICAgICAgIC8qIFdlIHJlc2VydmUgdGhlIGluaXRpYWwgYnl0ZSBhcyBhIGZha2UgYnl0ZSB0byBhIG5vbi1GRiB2YWx1ZSAqLworICAgICAgICAvKiBhbmQgaW5jcmVtZW50IHRoZSBkYXRhIHBvaW50ZXIsIHNvIHRoYXQgb3BqX21xY19pbml0X2VuYygpICovCisgICAgICAgIC8qIGNhbiBkbyBicCA9IGRhdGEgLSAxLCBhbmQgb3BqX21xY19ieXRlb3V0KCkgY2FuIHNhZmVseSBkZXJlZmVyZW5jZSAqLworICAgICAgICAvKiBpdC4gKi8KKyAgICAgICAgcF9jb2RlX2Jsb2NrLT5kYXRhWzBdID0gMDsKKyAgICAgICAgcF9jb2RlX2Jsb2NrLT5kYXRhICs9IDE7IC8qd2h5ICsxID8qLworICAgIH0KKyAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKKwordm9pZCBvcGpfdGNkX3JlaW5pdF9zZWdtZW50KG9wal90Y2Rfc2VnX3QqIHNlZykKK3sKKyAgICBtZW1zZXQoc2VnLCAwLCBzaXplb2Yob3BqX3RjZF9zZWdfdCkpOwogfQogCiAvKioKICAqIEFsbG9jYXRlcyBtZW1vcnkgZm9yIGEgZGVjb2RpbmcgY29kZSBibG9jay4KICAqLwotc3RhdGljIE9QSl9CT09MIG9wal90Y2RfY29kZV9ibG9ja19kZWNfYWxsb2NhdGUgKG9wal90Y2RfY2Jsa19kZWNfdCAqIHBfY29kZV9ibG9jaykKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX2NvZGVfYmxvY2tfZGVjX2FsbG9jYXRlKG9wal90Y2RfY2Jsa19kZWNfdCAqCisgICAgICAgIHBfY29kZV9ibG9jaykKIHsKLSAgICAgICAgaWYgKCEgcF9jb2RlX2Jsb2NrLT5kYXRhKSB7CisgICAgaWYgKCEgcF9jb2RlX2Jsb2NrLT5zZWdzKSB7CiAKLSAgICAgICAgICAgICAgICBwX2NvZGVfYmxvY2stPmRhdGEgPSAoT1BKX0JZVEUqKSBvcGpfbWFsbG9jKE9QSl9KMktfREVGQVVMVF9DQkxLX0RBVEFfU0laRSk7Ci0gICAgICAgICAgICAgICAgaWYgKCEgcF9jb2RlX2Jsb2NrLT5kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwX2NvZGVfYmxvY2stPmRhdGFfbWF4X3NpemUgPSBPUEpfSjJLX0RFRkFVTFRfQ0JMS19EQVRBX1NJWkU7Ci0gICAgICAgICAgICAgICAgLypmcHJpbnRmKHN0ZGVyciwgIkFsbG9jYXRlIDgxOTIgZWxlbWVudHMgb2YgY29kZV9ibG9jay0+ZGF0YVxuIik7Ki8KKyAgICAgICAgcF9jb2RlX2Jsb2NrLT5zZWdzID0gKG9wal90Y2Rfc2VnX3QgKikgb3BqX2NhbGxvYyhPUEpfSjJLX0RFRkFVTFRfTkJfU0VHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG9wal90Y2Rfc2VnX3QpKTsKKyAgICAgICAgaWYgKCEgcF9jb2RlX2Jsb2NrLT5zZWdzKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIC8qZnByaW50ZihzdGRlcnIsICJBbGxvY2F0ZSAlZCBlbGVtZW50cyBvZiBjb2RlX2Jsb2NrLT5kYXRhXG4iLCBPUEpfSjJLX0RFRkFVTFRfTkJfU0VHUyAqIHNpemVvZihvcGpfdGNkX3NlZ190KSk7Ki8KIAotICAgICAgICAgICAgICAgIHBfY29kZV9ibG9jay0+c2VncyA9IChvcGpfdGNkX3NlZ190ICopIG9wal9jYWxsb2MoT1BKX0oyS19ERUZBVUxUX05CX1NFR1Msc2l6ZW9mKG9wal90Y2Rfc2VnX3QpKTsKLSAgICAgICAgICAgICAgICBpZiAoISBwX2NvZGVfYmxvY2stPnNlZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qZnByaW50ZihzdGRlcnIsICJBbGxvY2F0ZSAlZCBlbGVtZW50cyBvZiBjb2RlX2Jsb2NrLT5kYXRhXG4iLCBPUEpfSjJLX0RFRkFVTFRfTkJfU0VHUyAqIHNpemVvZihvcGpfdGNkX3NlZ190KSk7Ki8KLQotICAgICAgICAgICAgICAgIHBfY29kZV9ibG9jay0+bV9jdXJyZW50X21heF9zZWdzID0gT1BKX0oyS19ERUZBVUxUX05CX1NFR1M7Ci0gICAgICAgICAgICAgICAgLypmcHJpbnRmKHN0ZGVyciwgIm1fY3VycmVudF9tYXhfc2VncyBvZiBjb2RlX2Jsb2NrLT5kYXRhID0gJWRcbiIsIHBfY29kZV9ibG9jay0+bV9jdXJyZW50X21heF9zZWdzKTsqLwotICAgICAgICB9IGVsc2UgewotCQkJCQkvKiBzYW5pdGl6ZSAqLwotCQkJCQlPUEpfQllURSogbF9kYXRhID0gcF9jb2RlX2Jsb2NrLT5kYXRhOwotCQkJCQlPUEpfVUlOVDMyIGxfZGF0YV9tYXhfc2l6ZSA9IHBfY29kZV9ibG9jay0+ZGF0YV9tYXhfc2l6ZTsKLQkJCQkJb3BqX3RjZF9zZWdfdCAqIGxfc2VncyA9IHBfY29kZV9ibG9jay0+c2VnczsKLQkJCQkJT1BKX1VJTlQzMiBsX2N1cnJlbnRfbWF4X3NlZ3MgPSBwX2NvZGVfYmxvY2stPm1fY3VycmVudF9tYXhfc2VnczsKLQotCQkJCQltZW1zZXQocF9jb2RlX2Jsb2NrLCAwLCBzaXplb2Yob3BqX3RjZF9jYmxrX2RlY190KSk7Ci0JCQkJCXBfY29kZV9ibG9jay0+ZGF0YSA9IGxfZGF0YTsKLQkJCQkJcF9jb2RlX2Jsb2NrLT5kYXRhX21heF9zaXplID0gbF9kYXRhX21heF9zaXplOwotCQkJCQlwX2NvZGVfYmxvY2stPnNlZ3MgPSBsX3NlZ3M7Ci0JCQkJCXBfY29kZV9ibG9jay0+bV9jdXJyZW50X21heF9zZWdzID0gbF9jdXJyZW50X21heF9zZWdzOwotCQkJCX0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLU9QSl9VSU5UMzIgb3BqX3RjZF9nZXRfZGVjb2RlZF90aWxlX3NpemUgKCBvcGpfdGNkX3QgKnBfdGNkICkKLXsKKyAgICAgICAgcF9jb2RlX2Jsb2NrLT5tX2N1cnJlbnRfbWF4X3NlZ3MgPSBPUEpfSjJLX0RFRkFVTFRfTkJfU0VHUzsKKyAgICAgICAgLypmcHJpbnRmKHN0ZGVyciwgIm1fY3VycmVudF9tYXhfc2VncyBvZiBjb2RlX2Jsb2NrLT5kYXRhID0gJWRcbiIsIHBfY29kZV9ibG9jay0+bV9jdXJyZW50X21heF9zZWdzKTsqLworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHNhbml0aXplICovCisgICAgICAgIG9wal90Y2Rfc2VnX3QgKiBsX3NlZ3MgPSBwX2NvZGVfYmxvY2stPnNlZ3M7CisgICAgICAgIE9QSl9VSU5UMzIgbF9jdXJyZW50X21heF9zZWdzID0gcF9jb2RlX2Jsb2NrLT5tX2N1cnJlbnRfbWF4X3NlZ3M7CisgICAgICAgIG9wal90Y2Rfc2VnX2RhdGFfY2h1bmtfdCogbF9jaHVua3MgPSBwX2NvZGVfYmxvY2stPmNodW5rczsKKyAgICAgICAgT1BKX1VJTlQzMiBsX251bWNodW5rc2FsbG9jID0gcF9jb2RlX2Jsb2NrLT5udW1jaHVua3NhbGxvYzsKICAgICAgICAgT1BKX1VJTlQzMiBpOwotICAgICAgICBPUEpfVUlOVDMyIGxfZGF0YV9zaXplID0gMDsKLSAgICAgICAgb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1nX2NvbXAgPSAwMDsKLSAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICogbF90aWxlX2NvbXAgPSAwMDsKLSAgICAgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QgKiBsX3JlcyA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfc2l6ZV9jb21wLCBsX3JlbWFpbmluZzsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3RlbXA7CiAKLSAgICAgICAgbF90aWxlX2NvbXAgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+Y29tcHM7Ci0gICAgICAgIGxfaW1nX2NvbXAgPSBwX3RjZC0+aW1hZ2UtPmNvbXBzOworICAgICAgICBvcGpfYWxpZ25lZF9mcmVlKHBfY29kZV9ibG9jay0+ZGVjb2RlZF9kYXRhKTsKKyAgICAgICAgcF9jb2RlX2Jsb2NrLT5kZWNvZGVkX2RhdGEgPSAwMDsKIAotICAgICAgICBmb3IgKGk9MDtpPHBfdGNkLT5pbWFnZS0+bnVtY29tcHM7KytpKSB7Ci0gICAgICAgICAgICAgICAgbF9zaXplX2NvbXAgPSBsX2ltZ19jb21wLT5wcmVjID4+IDM7IC8qKC8gOCkqLwotICAgICAgICAgICAgICAgIGxfcmVtYWluaW5nID0gbF9pbWdfY29tcC0+cHJlYyAmIDc7ICAvKiAoJTgpICovCi0KLSAgICAgICAgICAgICAgICBpZihsX3JlbWFpbmluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgKytsX3NpemVfY29tcDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobF9zaXplX2NvbXAgPT0gMykgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9zaXplX2NvbXAgPSA0OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGxfcmVzID0gbF90aWxlX2NvbXAtPnJlc29sdXRpb25zICsgbF90aWxlX2NvbXAtPm1pbmltdW1fbnVtX3Jlc29sdXRpb25zIC0gMTsKLSAgICAgICAgICAgICAgICBsX3RlbXAgPSAoT1BKX1VJTlQzMikoKGxfcmVzLT54MSAtIGxfcmVzLT54MCkgKiAobF9yZXMtPnkxIC0gbF9yZXMtPnkwKSk7IC8qIHgxKnkxIGNhbid0IG92ZXJmbG93ICovCi0KLSAgICAgICAgICAgICAgICBpZiAobF9zaXplX2NvbXAgJiYgKChPUEpfVUlOVDMyKS0xKSAvIGxfc2l6ZV9jb21wIDwgbF90ZW1wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKE9QSl9VSU5UMzIpLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxfdGVtcCAqPSBsX3NpemVfY29tcDsKLQotICAgICAgICAgICAgICAgIGlmIChsX3RlbXAgPiAoKE9QSl9VSU5UMzIpLTEpIC0gbF9kYXRhX3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoT1BKX1VJTlQzMiktMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbF9kYXRhX3NpemUgKz0gbF90ZW1wOwotCi0gICAgICAgICAgICAgICAgKytsX2ltZ19jb21wOwotICAgICAgICAgICAgICAgICsrbF90aWxlX2NvbXA7CisgICAgICAgIG1lbXNldChwX2NvZGVfYmxvY2ssIDAsIHNpemVvZihvcGpfdGNkX2NibGtfZGVjX3QpKTsKKyAgICAgICAgcF9jb2RlX2Jsb2NrLT5zZWdzID0gbF9zZWdzOworICAgICAgICBwX2NvZGVfYmxvY2stPm1fY3VycmVudF9tYXhfc2VncyA9IGxfY3VycmVudF9tYXhfc2VnczsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGxfY3VycmVudF9tYXhfc2VnczsgKytpKSB7CisgICAgICAgICAgICBvcGpfdGNkX3JlaW5pdF9zZWdtZW50KCZsX3NlZ3NbaV0pOwogICAgICAgICB9CisgICAgICAgIHBfY29kZV9ibG9jay0+Y2h1bmtzID0gbF9jaHVua3M7CisgICAgICAgIHBfY29kZV9ibG9jay0+bnVtY2h1bmtzYWxsb2MgPSBsX251bWNodW5rc2FsbG9jOworICAgIH0KIAotICAgICAgICByZXR1cm4gbF9kYXRhX3NpemU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1PUEpfQk9PTCBvcGpfdGNkX2VuY29kZV90aWxlKCAgIG9wal90Y2RfdCAqcF90Y2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqcF9kZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICogcF9kYXRhX3dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmZvX3QgKnBfY3N0cl9pbmZvKQorT1BKX1VJTlQzMiBvcGpfdGNkX2dldF9kZWNvZGVkX3RpbGVfc2l6ZShvcGpfdGNkX3QgKnBfdGNkLAorICAgICAgICBPUEpfQk9PTCB0YWtlX2ludG9fYWNjb3VudF9wYXJ0aWFsX2RlY29kaW5nKQogeworICAgIE9QSl9VSU5UMzIgaTsKKyAgICBPUEpfVUlOVDMyIGxfZGF0YV9zaXplID0gMDsKKyAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IDAwOworICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqIGxfdGlsZV9jb21wID0gMDA7CisgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QgKiBsX3JlcyA9IDAwOworICAgIE9QSl9VSU5UMzIgbF9zaXplX2NvbXAsIGxfcmVtYWluaW5nOworICAgIE9QSl9VSU5UMzIgbF90ZW1wOwogCi0gICAgICAgIGlmIChwX3RjZC0+Y3VyX3RwX251bSA9PSAwKSB7CisgICAgbF90aWxlX2NvbXAgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+Y29tcHM7CisgICAgbF9pbWdfY29tcCA9IHBfdGNkLT5pbWFnZS0+Y29tcHM7CiAKLSAgICAgICAgICAgICAgICBwX3RjZC0+dGNkX3RpbGVubyA9IHBfdGlsZV9ubzsKLSAgICAgICAgICAgICAgICBwX3RjZC0+dGNwID0gJnBfdGNkLT5jcC0+dGNwc1twX3RpbGVfbm9dOworICAgIGZvciAoaSA9IDA7IGkgPCBwX3RjZC0+aW1hZ2UtPm51bWNvbXBzOyArK2kpIHsKKyAgICAgICAgT1BKX1VJTlQzMiB3LCBoOworICAgICAgICBsX3NpemVfY29tcCA9IGxfaW1nX2NvbXAtPnByZWMgPj4gMzsgLyooLyA4KSovCisgICAgICAgIGxfcmVtYWluaW5nID0gbF9pbWdfY29tcC0+cHJlYyAmIDc7ICAvKiAoJTgpICovCiAKLSAgICAgICAgICAgICAgICAvKiBJTkRFWCA+PiAiUHJlY2luY3RfbmJfWCBldCBQcmVjaW5jdF9uYl9ZIiAqLwotICAgICAgICAgICAgICAgIGlmKHBfY3N0cl9pbmZvKSAgewotICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsX251bV9wYWNrcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKmxfdGlsZWNfaWR4ID0gJnBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5jb21wc1swXTsgICAgICAgIC8qIGJhc2VkIG9uIGNvbXBvbmVudCAwICovCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNjcF90ICpsX3RjY3AgPSBwX3RjZC0+dGNwLT50Y2NwczsgLyogYmFzZWQgb24gY29tcG9uZW50IDAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxfdGlsZWNfaWR4LT5udW1yZXNvbHV0aW9uczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90ICpsX3Jlc19pZHggPSAmbF90aWxlY19pZHgtPnJlc29sdXRpb25zW2ldOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmZvLT50aWxlW3BfdGlsZV9ub10ucHdbaV0gPSAoaW50KWxfcmVzX2lkeC0+cHc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmZvLT50aWxlW3BfdGlsZV9ub10ucGhbaV0gPSAoaW50KWxfcmVzX2lkeC0+cGg7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9udW1fcGFja3MgKz0gbF9yZXNfaWR4LT5wdyAqIGxfcmVzX2lkeC0+cGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmZvLT50aWxlW3BfdGlsZV9ub10ucGR4W2ldID0gKGludClsX3RjY3AtPnByY3dbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmZvLT50aWxlW3BfdGlsZV9ub10ucGR5W2ldID0gKGludClsX3RjY3AtPnByY2hbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dLnBhY2tldCA9IChvcGpfcGFja2V0X2luZm9fdCopIG9wal9jYWxsb2MoKHNpemVfdClwX2NzdHJfaW5mby0+bnVtY29tcHMgKiAoc2l6ZV90KXBfY3N0cl9pbmZvLT5udW1sYXllcnMgKiBsX251bV9wYWNrcywgc2l6ZW9mKG9wal9wYWNrZXRfaW5mb190KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBfY3N0cl9pbmZvLT50aWxlW3BfdGlsZV9ub10ucGFja2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FIGV2ZW50IG1hbmFnZXIgZXJyb3IgY2FsbGJhY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogPDwgSU5ERVggKi8KLQotICAgICAgICAgICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RhcnQoUEdST1VQX0RDX1NISUZUKTsgKi8KLSAgICAgICAgICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLVRJTEUtLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAgICAgICAgICBpZiAoISBvcGpfdGNkX2RjX2xldmVsX3NoaWZ0X2VuY29kZShwX3RjZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RvcChQR1JPVVBfRENfU0hJRlQpOyAqLwotCi0gICAgICAgICAgICAgICAgLyogRklYTUUgX1Byb2ZTdGFydChQR1JPVVBfTUNUKTsgKi8KLSAgICAgICAgICAgICAgICBpZiAoISBvcGpfdGNkX21jdF9lbmNvZGUocF90Y2QpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBGSVhNRSBfUHJvZlN0b3AoUEdST1VQX01DVCk7ICovCi0KLSAgICAgICAgICAgICAgICAvKiBGSVhNRSBfUHJvZlN0YXJ0KFBHUk9VUF9EV1QpOyAqLwotICAgICAgICAgICAgICAgIGlmICghIG9wal90Y2RfZHd0X2VuY29kZShwX3RjZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIEZJWE1FICBfUHJvZlN0b3AoUEdST1VQX0RXVCk7ICovCi0KLSAgICAgICAgICAgICAgICAvKiBGSVhNRSAgX1Byb2ZTdGFydChQR1JPVVBfVDEpOyAqLwotICAgICAgICAgICAgICAgIGlmICghIG9wal90Y2RfdDFfZW5jb2RlKHBfdGNkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLyogRklYTUUgX1Byb2ZTdG9wKFBHUk9VUF9UMSk7ICovCi0KLSAgICAgICAgICAgICAgICAvKiBGSVhNRSBfUHJvZlN0YXJ0KFBHUk9VUF9SQVRFKTsgKi8KLSAgICAgICAgICAgICAgICBpZiAoISBvcGpfdGNkX3JhdGVfYWxsb2NhdGVfZW5jb2RlKHBfdGNkLHBfZGVzdCxwX21heF9sZW5ndGgscF9jc3RyX2luZm8pKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvKiBGSVhNRSBfUHJvZlN0b3AoUEdST1VQX1JBVEUpOyAqLwotCisgICAgICAgIGlmIChsX3JlbWFpbmluZykgeworICAgICAgICAgICAgKytsX3NpemVfY29tcDsKICAgICAgICAgfQotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tVElFUjItLS0tLS0tLS0tLS0tLS0tLS0qLwogCi0gICAgICAgIC8qIElOREVYICovCi0gICAgICAgIGlmIChwX2NzdHJfaW5mbykgewotICAgICAgICAgICAgICAgIHBfY3N0cl9pbmZvLT5pbmRleF93cml0ZSA9IDE7CisgICAgICAgIGlmIChsX3NpemVfY29tcCA9PSAzKSB7CisgICAgICAgICAgICBsX3NpemVfY29tcCA9IDQ7CiAgICAgICAgIH0KLSAgICAgICAgLyogRklYTUUgX1Byb2ZTdGFydChQR1JPVVBfVDIpOyAqLwogCi0gICAgICAgIGlmICghIG9wal90Y2RfdDJfZW5jb2RlKHBfdGNkLHBfZGVzdCxwX2RhdGFfd3JpdHRlbixwX21heF9sZW5ndGgscF9jc3RyX2luZm8pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgbF9yZXMgPSBsX3RpbGVfY29tcC0+cmVzb2x1dGlvbnMgKyBsX3RpbGVfY29tcC0+bWluaW11bV9udW1fcmVzb2x1dGlvbnMgLSAxOworICAgICAgICBpZiAodGFrZV9pbnRvX2FjY291bnRfcGFydGlhbF9kZWNvZGluZyAmJiAhcF90Y2QtPndob2xlX3RpbGVfZGVjb2RpbmcpIHsKKyAgICAgICAgICAgIHcgPSBsX3Jlcy0+d2luX3gxIC0gbF9yZXMtPndpbl94MDsKKyAgICAgICAgICAgIGggPSBsX3Jlcy0+d2luX3kxIC0gbF9yZXMtPndpbl95MDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHcgPSAoT1BKX1VJTlQzMikobF9yZXMtPngxIC0gbF9yZXMtPngwKTsKKyAgICAgICAgICAgIGggPSAoT1BKX1VJTlQzMikobF9yZXMtPnkxIC0gbF9yZXMtPnkwKTsKICAgICAgICAgfQotICAgICAgICAvKiBGSVhNRSBfUHJvZlN0b3AoUEdST1VQX1QyKTsgKi8KKyAgICAgICAgaWYgKGggPiAwICYmIFVJTlRfTUFYIC8gdyA8IGgpIHsKKyAgICAgICAgICAgIHJldHVybiBVSU5UX01BWDsKKyAgICAgICAgfQorICAgICAgICBsX3RlbXAgPSB3ICogaDsKKyAgICAgICAgaWYgKGxfc2l6ZV9jb21wICYmIFVJTlRfTUFYIC8gbF9zaXplX2NvbXAgPCBsX3RlbXApIHsKKyAgICAgICAgICAgIHJldHVybiBVSU5UX01BWDsKKyAgICAgICAgfQorICAgICAgICBsX3RlbXAgKj0gbF9zaXplX2NvbXA7CiAKLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS1DTEVBTi0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgICAgICBpZiAobF90ZW1wID4gVUlOVF9NQVggLSBsX2RhdGFfc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIFVJTlRfTUFYOworICAgICAgICB9CisgICAgICAgIGxfZGF0YV9zaXplICs9IGxfdGVtcDsKKyAgICAgICAgKytsX2ltZ19jb21wOworICAgICAgICArK2xfdGlsZV9jb21wOworICAgIH0KIAotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIGxfZGF0YV9zaXplOwogfQogCi1PUEpfQk9PTCBvcGpfdGNkX2RlY29kZV90aWxlKCAgIG9wal90Y2RfdCAqcF90Y2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpwX3NyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmRleF90ICpwX2NzdHJfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK09QSl9CT09MIG9wal90Y2RfZW5jb2RlX3RpbGUob3BqX3RjZF90ICpwX3RjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpwX2Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqcF9jc3RyX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKQogewotICAgICAgICBPUEpfVUlOVDMyIGxfZGF0YV9yZWFkOworCisgICAgaWYgKHBfdGNkLT5jdXJfdHBfbnVtID09IDApIHsKKwogICAgICAgICBwX3RjZC0+dGNkX3RpbGVubyA9IHBfdGlsZV9ubzsKLSAgICAgICAgcF90Y2QtPnRjcCA9ICYocF90Y2QtPmNwLT50Y3BzW3BfdGlsZV9ub10pOworICAgICAgICBwX3RjZC0+dGNwID0gJnBfdGNkLT5jcC0+dGNwc1twX3RpbGVfbm9dOwogCi0jaWZkZWYgVE9ET19NU0QgLyogRklYTUUgKi8KLSAgICAgICAgLyogSU5ERVggPj4gICovCi0gICAgICAgIGlmKHBfY3N0cl9pbmZvKSB7Ci0gICAgICAgICAgICAgICAgT1BKX1VJTlQzMiByZXNubywgY29tcG5vLCBudW1wcmVjID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IChPUEpfVUlOVDMyKSBwX2NzdHJfaW5mby0+bnVtY29tcHM7IGNvbXBubysrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNwX3QgKnRjcCA9ICZwX3RjZC0+Y3AtPnRjcHNbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNjcF90ICp0Y2NwID0gJnRjcC0+dGNjcHNbY29tcG5vXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqdGlsZWNfaWR4ID0gJnBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5jb21wc1tjb21wbm9dOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChyZXNubyA9IDA7IHJlc25vIDwgdGlsZWNfaWR4LT5udW1yZXNvbHV0aW9uczsgcmVzbm8rKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCAqcmVzX2lkeCA9ICZ0aWxlY19pZHgtPnJlc29sdXRpb25zW3Jlc25vXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jc3RyX2luZm8tPnRpbGVbcF90aWxlX25vXS5wd1tyZXNub10gPSByZXNfaWR4LT5wdzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jc3RyX2luZm8tPnRpbGVbcF90aWxlX25vXS5waFtyZXNub10gPSByZXNfaWR4LT5waDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtcHJlYyArPSByZXNfaWR4LT5wdyAqIHJlc19pZHgtPnBoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dLnBkeFtyZXNub10gPSB0Y2NwLT5wcmN3W3Jlc25vXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jc3RyX2luZm8tPnRpbGVbcF90aWxlX25vXS5wZHlbcmVzbm9dID0gdGNjcC0+cHJjaFtyZXNub107Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBfY3N0cl9pbmZvLT50aWxlW3BfdGlsZV9ub10ucGFja2V0ID0gKG9wal9wYWNrZXRfaW5mb190ICopIG9wal9tYWxsb2MocF9jc3RyX2luZm8tPm51bWxheWVycyAqIG51bXByZWMgKiBzaXplb2Yob3BqX3BhY2tldF9pbmZvX3QpKTsKLSAgICAgICAgICAgICAgICBwX2NzdHJfaW5mby0+cGFja25vID0gMDsKKyAgICAgICAgLyogSU5ERVggPj4gIlByZWNpbmN0X25iX1ggZXQgUHJlY2luY3RfbmJfWSIgKi8KKyAgICAgICAgaWYgKHBfY3N0cl9pbmZvKSAgeworICAgICAgICAgICAgT1BKX1VJTlQzMiBsX251bV9wYWNrcyA9IDA7CisgICAgICAgICAgICBPUEpfVUlOVDMyIGk7CisgICAgICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKmxfdGlsZWNfaWR4ID0KKyAgICAgICAgICAgICAgICAmcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzWzBdOyAgICAgICAgLyogYmFzZWQgb24gY29tcG9uZW50IDAgKi8KKyAgICAgICAgICAgIG9wal90Y2NwX3QgKmxfdGNjcCA9IHBfdGNkLT50Y3AtPnRjY3BzOyAvKiBiYXNlZCBvbiBjb21wb25lbnQgMCAqLworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF90aWxlY19pZHgtPm51bXJlc29sdXRpb25zOyBpKyspIHsKKyAgICAgICAgICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCAqbF9yZXNfaWR4ID0gJmxfdGlsZWNfaWR4LT5yZXNvbHV0aW9uc1tpXTsKKworICAgICAgICAgICAgICAgIHBfY3N0cl9pbmZvLT50aWxlW3BfdGlsZV9ub10ucHdbaV0gPSAoaW50KWxfcmVzX2lkeC0+cHc7CisgICAgICAgICAgICAgICAgcF9jc3RyX2luZm8tPnRpbGVbcF90aWxlX25vXS5waFtpXSA9IChpbnQpbF9yZXNfaWR4LT5waDsKKworICAgICAgICAgICAgICAgIGxfbnVtX3BhY2tzICs9IGxfcmVzX2lkeC0+cHcgKiBsX3Jlc19pZHgtPnBoOworICAgICAgICAgICAgICAgIHBfY3N0cl9pbmZvLT50aWxlW3BfdGlsZV9ub10ucGR4W2ldID0gKGludClsX3RjY3AtPnByY3dbaV07CisgICAgICAgICAgICAgICAgcF9jc3RyX2luZm8tPnRpbGVbcF90aWxlX25vXS5wZHlbaV0gPSAoaW50KWxfdGNjcC0+cHJjaFtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBfY3N0cl9pbmZvLT50aWxlW3BfdGlsZV9ub10ucGFja2V0ID0gKG9wal9wYWNrZXRfaW5mb190Kikgb3BqX2NhbGxvYygoCisgICAgICAgICAgICAgICAgICAgIE9QSl9TSVpFX1QpcF9jc3RyX2luZm8tPm51bWNvbXBzICogKE9QSl9TSVpFX1QpcF9jc3RyX2luZm8tPm51bWxheWVycyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbnVtX3BhY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yob3BqX3BhY2tldF9pbmZvX3QpKTsKKyAgICAgICAgICAgIGlmICghcF9jc3RyX2luZm8tPnRpbGVbcF90aWxlX25vXS5wYWNrZXQpIHsKKyAgICAgICAgICAgICAgICAvKiBGSVhNRSBldmVudCBtYW5hZ2VyIGVycm9yIGNhbGxiYWNrICovCisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvKiA8PCBJTkRFWCAqLwotI2VuZGlmCi0KLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLVRJRVIyLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAgICAgLyogRklYTUUgX1Byb2ZTdGFydChQR1JPVVBfVDIpOyAqLwotICAgICAgICBsX2RhdGFfcmVhZCA9IDA7Ci0gICAgICAgIGlmICghIG9wal90Y2RfdDJfZGVjb2RlKHBfdGNkLCBwX3NyYywgJmxfZGF0YV9yZWFkLCBwX21heF9sZW5ndGgsIHBfY3N0cl9pbmRleCwgcF9tYW5hZ2VyKSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRklYTUUgX1Byb2ZTdG9wKFBHUk9VUF9UMik7ICovCi0KLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS1USUVSMS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotICAgICAgICAvKiBGSVhNRSBfUHJvZlN0YXJ0KFBHUk9VUF9UMSk7ICovCi0gICAgICAgIGlmCi0gICAgICAgICAgICAgICAgKCEgb3BqX3RjZF90MV9kZWNvZGUocF90Y2QpKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotICAgICAgICAvKiBGSVhNRSBfUHJvZlN0b3AoUEdST1VQX1QxKTsgKi8KLQotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS1EV1QtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RhcnQoUEdST1VQX0RXVCk7ICovCi0gICAgICAgIGlmCi0gICAgICAgICAgICAgICAgKCEgb3BqX3RjZF9kd3RfZGVjb2RlKHBfdGNkKSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRklYTUUgX1Byb2ZTdG9wKFBHUk9VUF9EV1QpOyAqLwotCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLU1DVC0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICAvKiBGSVhNRSBfUHJvZlN0YXJ0KFBHUk9VUF9NQ1QpOyAqLwotICAgICAgICBpZgotICAgICAgICAgICAgICAgICghIG9wal90Y2RfbWN0X2RlY29kZShwX3RjZCwgcF9tYW5hZ2VyKSkKLSAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRklYTUUgX1Byb2ZTdG9wKFBHUk9VUF9NQ1QpOyAqLwogCiAgICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RhcnQoUEdST1VQX0RDX1NISUZUKTsgKi8KLSAgICAgICAgaWYKLSAgICAgICAgICAgICAgICAoISBvcGpfdGNkX2RjX2xldmVsX3NoaWZ0X2RlY29kZShwX3RjZCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLVRJTEUtLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICAgICAgaWYgKCEgb3BqX3RjZF9kY19sZXZlbF9zaGlmdF9lbmNvZGUocF90Y2QpKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwogICAgICAgICB9CiAgICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RvcChQR1JPVVBfRENfU0hJRlQpOyAqLwogCisgICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RhcnQoUEdST1VQX01DVCk7ICovCisgICAgICAgIGlmICghIG9wal90Y2RfbWN0X2VuY29kZShwX3RjZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgLyogRklYTUUgX1Byb2ZTdG9wKFBHUk9VUF9NQ1QpOyAqLwogCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tVElMRS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RhcnQoUEdST1VQX0RXVCk7ICovCisgICAgICAgIGlmICghIG9wal90Y2RfZHd0X2VuY29kZShwX3RjZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgLyogRklYTUUgIF9Qcm9mU3RvcChQR1JPVVBfRFdUKTsgKi8KKworICAgICAgICAvKiBGSVhNRSAgX1Byb2ZTdGFydChQR1JPVVBfVDEpOyAqLworICAgICAgICBpZiAoISBvcGpfdGNkX3QxX2VuY29kZShwX3RjZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgLyogRklYTUUgX1Byb2ZTdG9wKFBHUk9VUF9UMSk7ICovCisKKyAgICAgICAgLyogRklYTUUgX1Byb2ZTdGFydChQR1JPVVBfUkFURSk7ICovCisgICAgICAgIGlmICghIG9wal90Y2RfcmF0ZV9hbGxvY2F0ZV9lbmNvZGUocF90Y2QsIHBfZGVzdCwgcF9tYXhfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3N0cl9pbmZvLCBwX21hbmFnZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIC8qIEZJWE1FIF9Qcm9mU3RvcChQR1JPVVBfUkFURSk7ICovCisKKyAgICB9CisgICAgLyotLS0tLS0tLS0tLS0tLVRJRVIyLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIC8qIElOREVYICovCisgICAgaWYgKHBfY3N0cl9pbmZvKSB7CisgICAgICAgIHBfY3N0cl9pbmZvLT5pbmRleF93cml0ZSA9IDE7CisgICAgfQorICAgIC8qIEZJWE1FIF9Qcm9mU3RhcnQoUEdST1VQX1QyKTsgKi8KKworICAgIGlmICghIG9wal90Y2RfdDJfZW5jb2RlKHBfdGNkLCBwX2Rlc3QsIHBfZGF0YV93cml0dGVuLCBwX21heF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jc3RyX2luZm8sIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgLyogRklYTUUgX1Byb2ZTdG9wKFBHUk9VUF9UMik7ICovCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLUNMRUFOLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLU9QSl9CT09MIG9wal90Y2RfdXBkYXRlX3RpbGVfZGF0YSAoIG9wal90Y2RfdCAqcF90Y2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9kZXN0X2xlbmd0aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorT1BKX0JPT0wgb3BqX3RjZF9kZWNvZGVfdGlsZShvcGpfdGNkX3QgKnBfdGNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHdpbl94MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB3aW5feTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgd2luX3gxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHdpbl95MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBudW1jb21wc190b19kZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9QSl9VSU5UMzIgKmNvbXBzX2luZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpwX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmRleF90ICpwX2NzdHJfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewotICAgICAgICBPUEpfVUlOVDMyIGksaixrLGxfZGF0YV9zaXplID0gMDsKLSAgICAgICAgb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1nX2NvbXAgPSAwMDsKLSAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICogbF90aWxlYyA9IDAwOwotICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCAqIGxfcmVzOwotICAgICAgICBPUEpfVUlOVDMyIGxfc2l6ZV9jb21wLCBsX3JlbWFpbmluZzsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3N0cmlkZSwgbF93aWR0aCxsX2hlaWdodDsKKyAgICBPUEpfVUlOVDMyIGxfZGF0YV9yZWFkOworICAgIE9QSl9VSU5UMzIgY29tcG5vOwogCi0gICAgICAgIGxfZGF0YV9zaXplID0gb3BqX3RjZF9nZXRfZGVjb2RlZF90aWxlX3NpemUocF90Y2QpOwotICAgICAgICBpZiAobF9kYXRhX3NpemUgPT0gKE9QSl9VSU5UMzIpLTEgfHwgbF9kYXRhX3NpemUgPiBwX2Rlc3RfbGVuZ3RoKSB7CisgICAgcF90Y2QtPnRjZF90aWxlbm8gPSBwX3RpbGVfbm87CisgICAgcF90Y2QtPnRjcCA9ICYocF90Y2QtPmNwLT50Y3BzW3BfdGlsZV9ub10pOworICAgIHBfdGNkLT53aW5feDAgPSB3aW5feDA7CisgICAgcF90Y2QtPndpbl95MCA9IHdpbl95MDsKKyAgICBwX3RjZC0+d2luX3gxID0gd2luX3gxOworICAgIHBfdGNkLT53aW5feTEgPSB3aW5feTE7CisgICAgcF90Y2QtPndob2xlX3RpbGVfZGVjb2RpbmcgPSBPUEpfVFJVRTsKKworICAgIG9wal9mcmVlKHBfdGNkLT51c2VkX2NvbXBvbmVudCk7CisgICAgcF90Y2QtPnVzZWRfY29tcG9uZW50ID0gTlVMTDsKKworICAgIGlmIChudW1jb21wc190b19kZWNvZGUpIHsKKyAgICAgICAgT1BKX0JPT0wqIHVzZWRfY29tcG9uZW50ID0gKE9QSl9CT09MKikgb3BqX2NhbGxvYyhzaXplb2YoT1BKX0JPT0wpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RjZC0+aW1hZ2UtPm51bWNvbXBzKTsKKyAgICAgICAgaWYgKHVzZWRfY29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBudW1jb21wc190b19kZWNvZGU7IGNvbXBubysrKSB7CisgICAgICAgICAgICB1c2VkX2NvbXBvbmVudFsgY29tcHNfaW5kaWNlc1tjb21wbm9dIF0gPSBPUEpfVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIHBfdGNkLT51c2VkX2NvbXBvbmVudCA9IHVzZWRfY29tcG9uZW50OworICAgIH0KKworICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgcF90Y2QtPmltYWdlLT5udW1jb21wczsgY29tcG5vKyspIHsKKyAgICAgICAgaWYgKHBfdGNkLT51c2VkX2NvbXBvbmVudCAhPSBOVUxMICYmICFwX3RjZC0+dXNlZF9jb21wb25lbnRbY29tcG5vXSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIW9wal90Y2RfaXNfd2hvbGVfdGlsZWNvbXBfZGVjb2RpbmcocF90Y2QsIGNvbXBubykpIHsKKyAgICAgICAgICAgIHBfdGNkLT53aG9sZV90aWxlX2RlY29kaW5nID0gT1BKX0ZBTFNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocF90Y2QtPndob2xlX3RpbGVfZGVjb2RpbmcpIHsKKyAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBwX3RjZC0+aW1hZ2UtPm51bWNvbXBzOyBjb21wbm8rKykgeworICAgICAgICAgICAgb3BqX3RjZF90aWxlY29tcF90KiB0aWxlYyA9ICYocF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzW2NvbXBub10pOworICAgICAgICAgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QgKmxfcmVzID0gJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpbGVjLT5yZXNvbHV0aW9uc1t0aWxlYy0+bWluaW11bV9udW1fcmVzb2x1dGlvbnMgLSAxXSk7CisgICAgICAgICAgICBPUEpfU0laRV9UIGxfZGF0YV9zaXplOworCisgICAgICAgICAgICAvKiBjb21wdXRlIGxfZGF0YV9zaXplIHdpdGggb3ZlcmZsb3cgY2hlY2sgKi8KKyAgICAgICAgICAgIE9QSl9TSVpFX1QgcmVzX3cgPSAoT1BKX1NJWkVfVCkobF9yZXMtPngxIC0gbF9yZXMtPngwKTsKKyAgICAgICAgICAgIE9QSl9TSVpFX1QgcmVzX2ggPSAoT1BKX1NJWkVfVCkobF9yZXMtPnkxIC0gbF9yZXMtPnkwKTsKKworICAgICAgICAgICAgaWYgKHBfdGNkLT51c2VkX2NvbXBvbmVudCAhPSBOVUxMICYmICFwX3RjZC0+dXNlZF9jb21wb25lbnRbY29tcG5vXSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBpc3N1ZSA3MzMsIGxfZGF0YV9zaXplID09IDBVLCBwcm9iYWJseSBzb21ldGhpbmcgd3Jvbmcgc2hvdWxkIGJlIGNoZWNrZWQgYmVmb3JlIGdldHRpbmcgaGVyZSAqLworICAgICAgICAgICAgaWYgKHJlc19oID4gMCAmJiByZXNfdyA+IFNJWkVfTUFYIC8gcmVzX2gpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpemUgb2YgdGlsZSBkYXRhIGV4Y2VlZHMgc3lzdGVtIGxpbWl0c1xuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxfZGF0YV9zaXplID0gcmVzX3cgKiByZXNfaDsKKworICAgICAgICAgICAgaWYgKFNJWkVfTUFYIC8gc2l6ZW9mKE9QSl9VSU5UMzIpIDwgbF9kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpemUgb2YgdGlsZSBkYXRhIGV4Y2VlZHMgc3lzdGVtIGxpbWl0c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxfZGF0YV9zaXplICo9IHNpemVvZihPUEpfVUlOVDMyKTsKKworICAgICAgICAgICAgdGlsZWMtPmRhdGFfc2l6ZV9uZWVkZWQgPSBsX2RhdGFfc2l6ZTsKKworICAgICAgICAgICAgaWYgKCFvcGpfYWxsb2NfdGlsZV9jb21wb25lbnRfZGF0YSh0aWxlYykpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpemUgb2YgdGlsZSBkYXRhIGV4Y2VlZHMgc3lzdGVtIGxpbWl0c1xuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIENvbXB1dGUgcmVzdHJpY3RlZCB0aWxlLWNvbXBvbmVudCBhbmQgdGlsZS1yZXNvbHV0aW9uIGNvb3JkaW5hdGVzICovCisgICAgICAgIC8qIG9mIHRoZSB3aW5kb3cgb2YgaW50ZXJlc3QsIGJ1dCBkZWZlciB0aGUgbWVtb3J5IGFsbG9jYXRpb24gdW50aWwgKi8KKyAgICAgICAgLyogd2Uga25vdyB0aGUgcmVzbm9fZGVjb2RlZCAqLworICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHBfdGNkLT5pbWFnZS0+bnVtY29tcHM7IGNvbXBubysrKSB7CisgICAgICAgICAgICBPUEpfVUlOVDMyIHJlc25vOworICAgICAgICAgICAgb3BqX3RjZF90aWxlY29tcF90KiB0aWxlYyA9ICYocF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzW2NvbXBub10pOworICAgICAgICAgICAgb3BqX2ltYWdlX2NvbXBfdCogaW1hZ2VfY29tcCA9ICYocF90Y2QtPmltYWdlLT5jb21wc1tjb21wbm9dKTsKKworICAgICAgICAgICAgaWYgKHBfdGNkLT51c2VkX2NvbXBvbmVudCAhPSBOVUxMICYmICFwX3RjZC0+dXNlZF9jb21wb25lbnRbY29tcG5vXSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDb21wdXRlIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIGFyZWEgb2YgaW50ZXJlc3QsIGV4cHJlc3NlZCBpbiB0aWxlIGNvb3JkaW5hdGVzICovCisgICAgICAgICAgICAvKiB3aXRoIHRoZSB0aWxlIGNvb3JkaW5hdGVzICovCisgICAgICAgICAgICB0aWxlYy0+d2luX3gwID0gb3BqX3VpbnRfbWF4KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMil0aWxlYy0+eDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal91aW50X2NlaWxkaXYocF90Y2QtPndpbl94MCwgaW1hZ2VfY29tcC0+ZHgpKTsKKyAgICAgICAgICAgIHRpbGVjLT53aW5feTAgPSBvcGpfdWludF9tYXgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfVUlOVDMyKXRpbGVjLT55MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3VpbnRfY2VpbGRpdihwX3RjZC0+d2luX3kwLCBpbWFnZV9jb21wLT5keSkpOworICAgICAgICAgICAgdGlsZWMtPndpbl94MSA9IG9wal91aW50X21pbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9VSU5UMzIpdGlsZWMtPngxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdWludF9jZWlsZGl2KHBfdGNkLT53aW5feDEsIGltYWdlX2NvbXAtPmR4KSk7CisgICAgICAgICAgICB0aWxlYy0+d2luX3kxID0gb3BqX3VpbnRfbWluKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMil0aWxlYy0+eTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal91aW50X2NlaWxkaXYocF90Y2QtPndpbl95MSwgaW1hZ2VfY29tcC0+ZHkpKTsKKyAgICAgICAgICAgIGlmICh0aWxlYy0+d2luX3gxIDwgdGlsZWMtPndpbl94MCB8fAorICAgICAgICAgICAgICAgICAgICB0aWxlYy0+d2luX3kxIDwgdGlsZWMtPndpbl95MCkgeworICAgICAgICAgICAgICAgIC8qIFdlIHNob3VsZCBub3Qgbm9ybWFsbHkgZ28gdGhlcmUuIFRoZSBjaXJjdW1zdGFuY2UgaXMgd2hlbiAqLworICAgICAgICAgICAgICAgIC8qIHRoZSB0aWxlIGNvb3JkaW5hdGVzIGRvIG5vdCBpbnRlcnNlY3QgdGhlIGFyZWEgb2YgaW50ZXJlc3QgKi8KKyAgICAgICAgICAgICAgICAvKiBVcHBlciBsZXZlbCBsb2dpYyBzaG91bGQgbm90IGV2ZW4gdHJ5IHRvIGRlY29kZSB0aGF0IHRpbGUgKi8KKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgdGlsZWMtPndpbl94eHggdmFsdWVzXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKHJlc25vID0gMDsgcmVzbm8gPCB0aWxlYy0+bnVtcmVzb2x1dGlvbnM7ICsrcmVzbm8pIHsKKyAgICAgICAgICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCAqcmVzID0gdGlsZWMtPnJlc29sdXRpb25zICsgcmVzbm87CisgICAgICAgICAgICAgICAgcmVzLT53aW5feDAgPSBvcGpfdWludF9jZWlsZGl2cG93Mih0aWxlYy0+d2luX3gwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZWMtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vKTsKKyAgICAgICAgICAgICAgICByZXMtPndpbl95MCA9IG9wal91aW50X2NlaWxkaXZwb3cyKHRpbGVjLT53aW5feTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWxlYy0+bnVtcmVzb2x1dGlvbnMgLSAxIC0gcmVzbm8pOworICAgICAgICAgICAgICAgIHJlcy0+d2luX3gxID0gb3BqX3VpbnRfY2VpbGRpdnBvdzIodGlsZWMtPndpbl94MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVjLT5udW1yZXNvbHV0aW9ucyAtIDEgLSByZXNubyk7CisgICAgICAgICAgICAgICAgcmVzLT53aW5feTEgPSBvcGpfdWludF9jZWlsZGl2cG93Mih0aWxlYy0+d2luX3kxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZWMtPm51bXJlc29sdXRpb25zIC0gMSAtIHJlc25vKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworI2lmZGVmIFRPRE9fTVNEIC8qIEZJWE1FICovCisgICAgLyogSU5ERVggPj4gICovCisgICAgaWYgKHBfY3N0cl9pbmZvKSB7CisgICAgICAgIE9QSl9VSU5UMzIgcmVzbm8sIGNvbXBubywgbnVtcHJlYyA9IDA7CisgICAgICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgKE9QSl9VSU5UMzIpIHBfY3N0cl9pbmZvLT5udW1jb21wczsgY29tcG5vKyspIHsKKyAgICAgICAgICAgIG9wal90Y3BfdCAqdGNwID0gJnBfdGNkLT5jcC0+dGNwc1swXTsKKyAgICAgICAgICAgIG9wal90Y2NwX3QgKnRjY3AgPSAmdGNwLT50Y2Nwc1tjb21wbm9dOworICAgICAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICp0aWxlY19pZHggPSAmcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzW2NvbXBub107CisgICAgICAgICAgICBmb3IgKHJlc25vID0gMDsgcmVzbm8gPCB0aWxlY19pZHgtPm51bXJlc29sdXRpb25zOyByZXNubysrKSB7CisgICAgICAgICAgICAgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QgKnJlc19pZHggPSAmdGlsZWNfaWR4LT5yZXNvbHV0aW9uc1tyZXNub107CisgICAgICAgICAgICAgICAgcF9jc3RyX2luZm8tPnRpbGVbcF90aWxlX25vXS5wd1tyZXNub10gPSByZXNfaWR4LT5wdzsKKyAgICAgICAgICAgICAgICBwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dLnBoW3Jlc25vXSA9IHJlc19pZHgtPnBoOworICAgICAgICAgICAgICAgIG51bXByZWMgKz0gcmVzX2lkeC0+cHcgKiByZXNfaWR4LT5waDsKKyAgICAgICAgICAgICAgICBwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dLnBkeFtyZXNub10gPSB0Y2NwLT5wcmN3W3Jlc25vXTsKKyAgICAgICAgICAgICAgICBwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dLnBkeVtyZXNub10gPSB0Y2NwLT5wcmNoW3Jlc25vXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwX2NzdHJfaW5mby0+dGlsZVtwX3RpbGVfbm9dLnBhY2tldCA9IChvcGpfcGFja2V0X2luZm9fdCAqKSBvcGpfbWFsbG9jKAorICAgICAgICAgICAgICAgIHBfY3N0cl9pbmZvLT5udW1sYXllcnMgKiBudW1wcmVjICogc2l6ZW9mKG9wal9wYWNrZXRfaW5mb190KSk7CisgICAgICAgIHBfY3N0cl9pbmZvLT5wYWNrbm8gPSAwOworICAgIH0KKyAgICAvKiA8PCBJTkRFWCAqLworI2VuZGlmCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tVElFUjItLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIEZJWE1FIF9Qcm9mU3RhcnQoUEdST1VQX1QyKTsgKi8KKyAgICBsX2RhdGFfcmVhZCA9IDA7CisgICAgaWYgKCEgb3BqX3RjZF90Ml9kZWNvZGUocF90Y2QsIHBfc3JjLCAmbF9kYXRhX3JlYWQsIHBfbWF4X2xlbmd0aCwgcF9jc3RyX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWFuYWdlcikpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgLyogRklYTUUgX1Byb2ZTdG9wKFBHUk9VUF9UMik7ICovCisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLVRJRVIxLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyogRklYTUUgX1Byb2ZTdGFydChQR1JPVVBfVDEpOyAqLworICAgIGlmICghIG9wal90Y2RfdDFfZGVjb2RlKHBfdGNkLCBwX21hbmFnZXIpKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIC8qIEZJWE1FIF9Qcm9mU3RvcChQR1JPVVBfVDEpOyAqLworCisKKyAgICAvKiBGb3Igc3VidGlsZSBkZWNvZGluZywgbm93IHdlIGtub3cgdGhlIHJlc25vX2RlY29kZWQsIHdlIGNhbiBhbGxvY2F0ZSAqLworICAgIC8qIHRoZSB0aWxlIGRhdGEgYnVmZmVyICovCisgICAgaWYgKCFwX3RjZC0+d2hvbGVfdGlsZV9kZWNvZGluZykgeworICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IHBfdGNkLT5pbWFnZS0+bnVtY29tcHM7IGNvbXBubysrKSB7CisgICAgICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QqIHRpbGVjID0gJihwX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+Y29tcHNbY29tcG5vXSk7CisgICAgICAgICAgICBvcGpfaW1hZ2VfY29tcF90KiBpbWFnZV9jb21wID0gJihwX3RjZC0+aW1hZ2UtPmNvbXBzW2NvbXBub10pOworICAgICAgICAgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QgKnJlcyA9IHRpbGVjLT5yZXNvbHV0aW9ucyArIGltYWdlX2NvbXAtPnJlc25vX2RlY29kZWQ7CisgICAgICAgICAgICBPUEpfU0laRV9UIHcgPSByZXMtPndpbl94MSAtIHJlcy0+d2luX3gwOworICAgICAgICAgICAgT1BKX1NJWkVfVCBoID0gcmVzLT53aW5feTEgLSByZXMtPndpbl95MDsKKyAgICAgICAgICAgIE9QSl9TSVpFX1QgbF9kYXRhX3NpemU7CisKKyAgICAgICAgICAgIG9wal9pbWFnZV9kYXRhX2ZyZWUodGlsZWMtPmRhdGFfd2luKTsKKyAgICAgICAgICAgIHRpbGVjLT5kYXRhX3dpbiA9IE5VTEw7CisKKyAgICAgICAgICAgIGlmIChwX3RjZC0+dXNlZF9jb21wb25lbnQgIT0gTlVMTCAmJiAhcF90Y2QtPnVzZWRfY29tcG9uZW50W2NvbXBub10pIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHcgPiAwICYmIGggPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHcgPiBTSVpFX01BWCAvIGgpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2l6ZSBvZiB0aWxlIGRhdGEgZXhjZWVkcyBzeXN0ZW0gbGltaXRzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbF9kYXRhX3NpemUgPSB3ICogaDsKKyAgICAgICAgICAgICAgICBpZiAobF9kYXRhX3NpemUgPiBTSVpFX01BWCAvIHNpemVvZihPUEpfSU5UMzIpKSB7CisgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNpemUgb2YgdGlsZSBkYXRhIGV4Y2VlZHMgc3lzdGVtIGxpbWl0c1xuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxfZGF0YV9zaXplICo9IHNpemVvZihPUEpfSU5UMzIpOworCisgICAgICAgICAgICAgICAgdGlsZWMtPmRhdGFfd2luID0gKE9QSl9JTlQzMiopIG9wal9pbWFnZV9kYXRhX2FsbG9jKGxfZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAodGlsZWMtPmRhdGFfd2luID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2l6ZSBvZiB0aWxlIGRhdGEgZXhjZWVkcyBzeXN0ZW0gbGltaXRzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLS1EV1QtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisgICAgLyogRklYTUUgX1Byb2ZTdGFydChQR1JPVVBfRFdUKTsgKi8KKyAgICBpZgorICAgICghIG9wal90Y2RfZHd0X2RlY29kZShwX3RjZCkpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgLyogRklYTUUgX1Byb2ZTdG9wKFBHUk9VUF9EV1QpOyAqLworCisgICAgLyotLS0tLS0tLS0tLS0tLS0tTUNULS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgLyogRklYTUUgX1Byb2ZTdGFydChQR1JPVVBfTUNUKTsgKi8KKyAgICBpZgorICAgICghIG9wal90Y2RfbWN0X2RlY29kZShwX3RjZCwgcF9tYW5hZ2VyKSkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICAvKiBGSVhNRSBfUHJvZlN0b3AoUEdST1VQX01DVCk7ICovCisKKyAgICAvKiBGSVhNRSBfUHJvZlN0YXJ0KFBHUk9VUF9EQ19TSElGVCk7ICovCisgICAgaWYKKyAgICAoISBvcGpfdGNkX2RjX2xldmVsX3NoaWZ0X2RlY29kZShwX3RjZCkpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgLyogRklYTUUgX1Byb2ZTdG9wKFBHUk9VUF9EQ19TSElGVCk7ICovCisKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tVElMRS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworT1BKX0JPT0wgb3BqX3RjZF91cGRhdGVfdGlsZV9kYXRhKG9wal90Y2RfdCAqcF90Y2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX2Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2Rlc3RfbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgT1BKX1VJTlQzMiBpLCBqLCBrLCBsX2RhdGFfc2l6ZSA9IDA7CisgICAgb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1nX2NvbXAgPSAwMDsKKyAgICBvcGpfdGNkX3RpbGVjb21wX3QgKiBsX3RpbGVjID0gMDA7CisgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QgKiBsX3JlczsKKyAgICBPUEpfVUlOVDMyIGxfc2l6ZV9jb21wLCBsX3JlbWFpbmluZzsKKyAgICBPUEpfVUlOVDMyIGxfc3RyaWRlLCBsX3dpZHRoLCBsX2hlaWdodDsKKworICAgIGxfZGF0YV9zaXplID0gb3BqX3RjZF9nZXRfZGVjb2RlZF90aWxlX3NpemUocF90Y2QsIE9QSl9UUlVFKTsKKyAgICBpZiAobF9kYXRhX3NpemUgPT0gVUlOVF9NQVggfHwgbF9kYXRhX3NpemUgPiBwX2Rlc3RfbGVuZ3RoKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorCisgICAgbF90aWxlYyA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5jb21wczsKKyAgICBsX2ltZ19jb21wID0gcF90Y2QtPmltYWdlLT5jb21wczsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwX3RjZC0+aW1hZ2UtPm51bWNvbXBzOyArK2kpIHsKKyAgICAgICAgY29uc3QgT1BKX0lOVDMyKiBsX3NyY19kYXRhOworICAgICAgICBsX3NpemVfY29tcCA9IGxfaW1nX2NvbXAtPnByZWMgPj4gMzsgLyooLyA4KSovCisgICAgICAgIGxfcmVtYWluaW5nID0gbF9pbWdfY29tcC0+cHJlYyAmIDc7ICAvKiAoJTgpICovCisgICAgICAgIGxfcmVzID0gbF90aWxlYy0+cmVzb2x1dGlvbnMgKyBsX2ltZ19jb21wLT5yZXNub19kZWNvZGVkOworICAgICAgICBpZiAocF90Y2QtPndob2xlX3RpbGVfZGVjb2RpbmcpIHsKKyAgICAgICAgICAgIGxfd2lkdGggPSAoT1BKX1VJTlQzMikobF9yZXMtPngxIC0gbF9yZXMtPngwKTsKKyAgICAgICAgICAgIGxfaGVpZ2h0ID0gKE9QSl9VSU5UMzIpKGxfcmVzLT55MSAtIGxfcmVzLT55MCk7CisgICAgICAgICAgICBsX3N0cmlkZSA9IChPUEpfVUlOVDMyKShsX3RpbGVjLT5yZXNvbHV0aW9uc1tsX3RpbGVjLT5taW5pbXVtX251bV9yZXNvbHV0aW9ucyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxXS54MSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RpbGVjLT5yZXNvbHV0aW9uc1tsX3RpbGVjLT5taW5pbXVtX251bV9yZXNvbHV0aW9ucyAtIDFdLngwKSAtIGxfd2lkdGg7CisgICAgICAgICAgICBsX3NyY19kYXRhID0gbF90aWxlYy0+ZGF0YTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxfd2lkdGggPSBsX3Jlcy0+d2luX3gxIC0gbF9yZXMtPndpbl94MDsKKyAgICAgICAgICAgIGxfaGVpZ2h0ID0gbF9yZXMtPndpbl95MSAtIGxfcmVzLT53aW5feTA7CisgICAgICAgICAgICBsX3N0cmlkZSA9IDA7CisgICAgICAgICAgICBsX3NyY19kYXRhID0gbF90aWxlYy0+ZGF0YV93aW47CiAgICAgICAgIH0KIAotICAgICAgICBsX3RpbGVjID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzOwotICAgICAgICBsX2ltZ19jb21wID0gcF90Y2QtPmltYWdlLT5jb21wczsKLQotICAgICAgICBmb3IgKGk9MDtpPHBfdGNkLT5pbWFnZS0+bnVtY29tcHM7KytpKSB7Ci0gICAgICAgICAgICAgICAgbF9zaXplX2NvbXAgPSBsX2ltZ19jb21wLT5wcmVjID4+IDM7IC8qKC8gOCkqLwotICAgICAgICAgICAgICAgIGxfcmVtYWluaW5nID0gbF9pbWdfY29tcC0+cHJlYyAmIDc7ICAvKiAoJTgpICovCi0gICAgICAgICAgICAgICAgbF9yZXMgPSBsX3RpbGVjLT5yZXNvbHV0aW9ucyArIGxfaW1nX2NvbXAtPnJlc25vX2RlY29kZWQ7Ci0gICAgICAgICAgICAgICAgbF93aWR0aCA9IChPUEpfVUlOVDMyKShsX3Jlcy0+eDEgLSBsX3Jlcy0+eDApOwotICAgICAgICAgICAgICAgIGxfaGVpZ2h0ID0gKE9QSl9VSU5UMzIpKGxfcmVzLT55MSAtIGxfcmVzLT55MCk7Ci0gICAgICAgICAgICAgICAgbF9zdHJpZGUgPSAoT1BKX1VJTlQzMikobF90aWxlYy0+eDEgLSBsX3RpbGVjLT54MCkgLSBsX3dpZHRoOwotCi0gICAgICAgICAgICAgICAgaWYgKGxfcmVtYWluaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICArK2xfc2l6ZV9jb21wOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChsX3NpemVfY29tcCA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3NpemVfY29tcCA9IDQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChsX3NpemVfY29tcCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9DSEFSICogbF9kZXN0X3B0ciA9IChPUEpfQ0hBUiAqKSBwX2Rlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1BKX0lOVDMyICogbF9zcmNfcHRyID0gbF90aWxlYy0+ZGF0YTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2ltZ19jb21wLT5zZ25kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfaGVpZ2h0OysraikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGs9MDtrPGxfd2lkdGg7KytrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKE9QSl9DSEFSKSAoKihsX3NyY19wdHIrKykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3JjX3B0ciArPSBsX3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfaGVpZ2h0OysraikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgICAgIChrPTA7azxsX3dpZHRoOysraykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoobF9kZXN0X3B0cisrKSA9IChPUEpfQ0hBUikgKCgqKGxfc3JjX3B0cisrKSkmMHhmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zcmNfcHRyICs9IGxfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGVzdCA9IChPUEpfQllURSAqKWxfZGVzdF9wdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfSU5UMzIgKiBsX3NyY19wdHIgPSBsX3RpbGVjLT5kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQxNiAqIGxfZGVzdF9wdHIgPSAoT1BKX0lOVDE2ICopIHBfZGVzdDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2ltZ19jb21wLT5zZ25kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfaGVpZ2h0OysraikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGs9MDtrPGxfd2lkdGg7KytrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKE9QSl9JTlQxNikgKCoobF9zcmNfcHRyKyspKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajxsX2hlaWdodDsrK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChrPTA7azxsX3dpZHRoOysraykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoobF9kZXN0X3B0cisrKSA9IChPUEpfSU5UMTYpICgoKihsX3NyY19wdHIrKykpJjB4ZmZmZik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zcmNfcHRyICs9IGxfc3RyaWRlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGVzdCA9IChPUEpfQllURSopIGxfZGVzdF9wdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBsX2Rlc3RfcHRyID0gKE9QSl9JTlQzMiAqKSBwX2Rlc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogbF9zcmNfcHRyID0gbF90aWxlYy0+ZGF0YTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9oZWlnaHQ7KytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGs9MDtrPGxfd2lkdGg7KytrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoobF9kZXN0X3B0cisrKSA9ICgqKGxfc3JjX3B0cisrKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9zdHJpZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kZXN0ID0gKE9QSl9CWVRFKikgbF9kZXN0X3B0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICArK2xfaW1nX2NvbXA7Ci0gICAgICAgICAgICAgICAgKytsX3RpbGVjOworICAgICAgICBpZiAobF9yZW1haW5pbmcpIHsKKyAgICAgICAgICAgICsrbF9zaXplX2NvbXA7CiAgICAgICAgIH0KIAotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgIGlmIChsX3NpemVfY29tcCA9PSAzKSB7CisgICAgICAgICAgICBsX3NpemVfY29tcCA9IDQ7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGxfc2l6ZV9jb21wKSB7CisgICAgICAgIGNhc2UgMTogeworICAgICAgICAgICAgT1BKX0NIQVIgKiBsX2Rlc3RfcHRyID0gKE9QSl9DSEFSICopIHBfZGVzdDsKKyAgICAgICAgICAgIGNvbnN0IE9QSl9JTlQzMiAqIGxfc3JjX3B0ciA9IGxfc3JjX2RhdGE7CisKKyAgICAgICAgICAgIGlmIChsX2ltZ19jb21wLT5zZ25kKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxfaGVpZ2h0OyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGxfd2lkdGg7ICsraykgeworICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKE9QSl9DSEFSKSgqKGxfc3JjX3B0cisrKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbF9zcmNfcHRyICs9IGxfc3RyaWRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxfaGVpZ2h0OyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IGxfd2lkdGg7ICsraykgeworICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKE9QSl9DSEFSKSgoKihsX3NyY19wdHIrKykpICYgMHhmZik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbF9zcmNfcHRyICs9IGxfc3RyaWRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcF9kZXN0ID0gKE9QSl9CWVRFICopbF9kZXN0X3B0cjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOiB7CisgICAgICAgICAgICBjb25zdCBPUEpfSU5UMzIgKiBsX3NyY19wdHIgPSBsX3NyY19kYXRhOworICAgICAgICAgICAgT1BKX0lOVDE2ICogbF9kZXN0X3B0ciA9IChPUEpfSU5UMTYgKikgcF9kZXN0OworCisgICAgICAgICAgICBpZiAobF9pbWdfY29tcC0+c2duZCkgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsX2hlaWdodDsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBsX3dpZHRoOyArK2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQxNiB2YWwgPSAoT1BKX0lOVDE2KSgqKGxfc3JjX3B0cisrKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkobF9kZXN0X3B0ciwgJnZhbCwgc2l6ZW9mKHZhbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbF9kZXN0X3B0ciArKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9zdHJpZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbF9oZWlnaHQ7ICsraikgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgbF93aWR0aDsgKytrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMTYgdmFsID0gKE9QSl9JTlQxNikoKCoobF9zcmNfcHRyKyspKSAmIDB4ZmZmZik7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkobF9kZXN0X3B0ciwgJnZhbCwgc2l6ZW9mKHZhbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbF9kZXN0X3B0ciArKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsX3NyY19wdHIgKz0gbF9zdHJpZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwX2Rlc3QgPSAoT1BKX0JZVEUqKSBsX2Rlc3RfcHRyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6IHsKKyAgICAgICAgICAgIE9QSl9JTlQzMiAqIGxfZGVzdF9wdHIgPSAoT1BKX0lOVDMyICopIHBfZGVzdDsKKyAgICAgICAgICAgIGNvbnN0IE9QSl9JTlQzMiAqIGxfc3JjX3B0ciA9IGxfc3JjX2RhdGE7CisKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsX2hlaWdodDsgKytqKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KGxfZGVzdF9wdHIsIGxfc3JjX3B0ciwgbF93aWR0aCAqIHNpemVvZihPUEpfSU5UMzIpKTsKKyAgICAgICAgICAgICAgICBsX2Rlc3RfcHRyICs9IGxfd2lkdGg7CisgICAgICAgICAgICAgICAgbF9zcmNfcHRyICs9IGxfd2lkdGggKyBsX3N0cmlkZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcF9kZXN0ID0gKE9QSl9CWVRFKikgbF9kZXN0X3B0cjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgICsrbF9pbWdfY29tcDsKKyAgICAgICAgKytsX3RpbGVjOworICAgIH0KKworICAgIHJldHVybiBPUEpfVFJVRTsKIH0KIAogCkBAIC0xNDkyLDc0NyArMTgyNyw5ODMgQEAKIAogc3RhdGljIHZvaWQgb3BqX3RjZF9mcmVlX3RpbGUob3BqX3RjZF90ICpwX3RjZCkKIHsKLSAgICAgICAgT1BKX1VJTlQzMiBjb21wbm8sIHJlc25vLCBiYW5kbm8sIHByZWNubzsKLSAgICAgICAgb3BqX3RjZF90aWxlX3QgKmxfdGlsZSA9IDAwOwotICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKmxfdGlsZV9jb21wID0gMDA7Ci0gICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90ICpsX3JlcyA9IDAwOwotICAgICAgICBvcGpfdGNkX2JhbmRfdCAqbF9iYW5kID0gMDA7Ci0gICAgICAgIG9wal90Y2RfcHJlY2luY3RfdCAqbF9wcmVjaW5jdCA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfcmVzb2x1dGlvbnMsIGxfbmJfcHJlY2luY3RzOwotICAgICAgICB2b2lkICgqIGxfdGNkX2NvZGVfYmxvY2tfZGVhbGxvY2F0ZSkgKG9wal90Y2RfcHJlY2luY3RfdCAqKSA9IDAwOworICAgIE9QSl9VSU5UMzIgY29tcG5vLCByZXNubywgYmFuZG5vLCBwcmVjbm87CisgICAgb3BqX3RjZF90aWxlX3QgKmxfdGlsZSA9IDAwOworICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqbF90aWxlX2NvbXAgPSAwMDsKKyAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCAqbF9yZXMgPSAwMDsKKyAgICBvcGpfdGNkX2JhbmRfdCAqbF9iYW5kID0gMDA7CisgICAgb3BqX3RjZF9wcmVjaW5jdF90ICpsX3ByZWNpbmN0ID0gMDA7CisgICAgT1BKX1VJTlQzMiBsX25iX3Jlc29sdXRpb25zLCBsX25iX3ByZWNpbmN0czsKKyAgICB2b2lkICgqIGxfdGNkX2NvZGVfYmxvY2tfZGVhbGxvY2F0ZSkob3BqX3RjZF9wcmVjaW5jdF90ICopID0gMDA7CiAKLSAgICAgICAgaWYgKCEgcF90Y2QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICBpZiAoISBwX3RjZCkgeworICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAgICAgIGlmICghIHBfdGNkLT50Y2RfaW1hZ2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICBpZiAoISBwX3RjZC0+dGNkX2ltYWdlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgICAgICAgaWYgKHBfdGNkLT5tX2lzX2RlY29kZXIpIHsKLSAgICAgICAgICAgICAgICBsX3RjZF9jb2RlX2Jsb2NrX2RlYWxsb2NhdGUgPSBvcGpfdGNkX2NvZGVfYmxvY2tfZGVjX2RlYWxsb2NhdGU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgbF90Y2RfY29kZV9ibG9ja19kZWFsbG9jYXRlID0gb3BqX3RjZF9jb2RlX2Jsb2NrX2VuY19kZWFsbG9jYXRlOwotICAgICAgICB9CisgICAgaWYgKHBfdGNkLT5tX2lzX2RlY29kZXIpIHsKKyAgICAgICAgbF90Y2RfY29kZV9ibG9ja19kZWFsbG9jYXRlID0gb3BqX3RjZF9jb2RlX2Jsb2NrX2RlY19kZWFsbG9jYXRlOworICAgIH0gZWxzZSB7CisgICAgICAgIGxfdGNkX2NvZGVfYmxvY2tfZGVhbGxvY2F0ZSA9IG9wal90Y2RfY29kZV9ibG9ja19lbmNfZGVhbGxvY2F0ZTsKKyAgICB9CiAKLSAgICAgICAgbF90aWxlID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXM7Ci0gICAgICAgIGlmICghIGxfdGlsZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorICAgIGxfdGlsZSA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzOworICAgIGlmICghIGxfdGlsZSkgeworICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAgICAgIGxfdGlsZV9jb21wID0gbF90aWxlLT5jb21wczsKKyAgICBsX3RpbGVfY29tcCA9IGxfdGlsZS0+Y29tcHM7CiAKLSAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBsX3RpbGUtPm51bWNvbXBzOyArK2NvbXBubykgewotICAgICAgICAgICAgICAgIGxfcmVzID0gbF90aWxlX2NvbXAtPnJlc29sdXRpb25zOwotICAgICAgICAgICAgICAgIGlmIChsX3JlcykgeworICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgbF90aWxlLT5udW1jb21wczsgKytjb21wbm8pIHsKKyAgICAgICAgbF9yZXMgPSBsX3RpbGVfY29tcC0+cmVzb2x1dGlvbnM7CisgICAgICAgIGlmIChsX3JlcykgewogCi0gICAgICAgICAgICAgICAgICAgICAgICBsX25iX3Jlc29sdXRpb25zID0gbF90aWxlX2NvbXAtPnJlc29sdXRpb25zX3NpemUgLyBzaXplb2Yob3BqX3RjZF9yZXNvbHV0aW9uX3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChyZXNubyA9IDA7IHJlc25vIDwgbF9uYl9yZXNvbHV0aW9uczsgKytyZXNubykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2JhbmQgPSBsX3Jlcy0+YmFuZHM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAgICAgKGJhbmRubyA9IDA7IGJhbmRubyA8IDM7ICsrYmFuZG5vKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9wcmVjaW5jdCA9IGxfYmFuZC0+cHJlY2luY3RzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX3ByZWNpbmN0KSB7CisgICAgICAgICAgICBsX25iX3Jlc29sdXRpb25zID0gbF90aWxlX2NvbXAtPnJlc29sdXRpb25zX3NpemUgLyAoT1BKX1VJTlQzMilzaXplb2YoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KTsKKyAgICAgICAgICAgIGZvciAocmVzbm8gPSAwOyByZXNubyA8IGxfbmJfcmVzb2x1dGlvbnM7ICsrcmVzbm8pIHsKKyAgICAgICAgICAgICAgICBsX2JhbmQgPSBsX3Jlcy0+YmFuZHM7CisgICAgICAgICAgICAgICAgZm9yIChiYW5kbm8gPSAwOyBiYW5kbm8gPCAzOyArK2JhbmRubykgeworICAgICAgICAgICAgICAgICAgICBsX3ByZWNpbmN0ID0gbF9iYW5kLT5wcmVjaW5jdHM7CisgICAgICAgICAgICAgICAgICAgIGlmIChsX3ByZWNpbmN0KSB7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbmJfcHJlY2luY3RzID0gbF9iYW5kLT5wcmVjaW5jdHNfZGF0YV9zaXplIC8gc2l6ZW9mKG9wal90Y2RfcHJlY2luY3RfdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHByZWNubyA9IDA7IHByZWNubyA8IGxfbmJfcHJlY2luY3RzOyArK3ByZWNubykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGd0X2Rlc3Ryb3kobF9wcmVjaW5jdC0+aW5jbHRyZWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3ByZWNpbmN0LT5pbmNsdHJlZSA9IDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGd0X2Rlc3Ryb3kobF9wcmVjaW5jdC0+aW1zYnRyZWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3ByZWNpbmN0LT5pbXNidHJlZSA9IDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmxfdGNkX2NvZGVfYmxvY2tfZGVhbGxvY2F0ZSkgKGxfcHJlY2luY3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfcHJlY2luY3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfYmFuZC0+cHJlY2luY3RzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfYmFuZC0+cHJlY2luY3RzID0gMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9iYW5kOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qIGZvciAocmVzbm8gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX3JlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfbmJfcHJlY2luY3RzID0gbF9iYW5kLT5wcmVjaW5jdHNfZGF0YV9zaXplIC8gKE9QSl9VSU5UMzIpc2l6ZW9mKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9wcmVjaW5jdF90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAocHJlY25vID0gMDsgcHJlY25vIDwgbF9uYl9wcmVjaW5jdHM7ICsrcHJlY25vKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RndF9kZXN0cm95KGxfcHJlY2luY3QtPmluY2x0cmVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3ByZWNpbmN0LT5pbmNsdHJlZSA9IDAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Z3RfZGVzdHJveShsX3ByZWNpbmN0LT5pbXNidHJlZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9wcmVjaW5jdC0+aW1zYnRyZWUgPSAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmxfdGNkX2NvZGVfYmxvY2tfZGVhbGxvY2F0ZSkobF9wcmVjaW5jdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX3ByZWNpbmN0OwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZnJlZShsX3RpbGVfY29tcC0+cmVzb2x1dGlvbnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbF90aWxlX2NvbXAtPnJlc29sdXRpb25zID0gMDA7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9iYW5kLT5wcmVjaW5jdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgbF9iYW5kLT5wcmVjaW5jdHMgPSAwMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICArK2xfYmFuZDsKKyAgICAgICAgICAgICAgICB9IC8qIGZvciAocmVzbm8gKi8KKyAgICAgICAgICAgICAgICArK2xfcmVzOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGxfdGlsZV9jb21wLT5vd25zRGF0YSAmJiBsX3RpbGVfY29tcC0+ZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF90aWxlX2NvbXAtPmRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgbF90aWxlX2NvbXAtPmRhdGEgPSAwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfdGlsZV9jb21wLT5vd25zRGF0YSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3RpbGVfY29tcC0+ZGF0YV9zaXplID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfdGlsZV9jb21wLT5kYXRhX3NpemVfbmVlZGVkID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKytsX3RpbGVfY29tcDsKKyAgICAgICAgICAgIG9wal9mcmVlKGxfdGlsZV9jb21wLT5yZXNvbHV0aW9ucyk7CisgICAgICAgICAgICBsX3RpbGVfY29tcC0+cmVzb2x1dGlvbnMgPSAwMDsKICAgICAgICAgfQogCi0gICAgICAgIG9wal9mcmVlKGxfdGlsZS0+Y29tcHMpOwotICAgICAgICBsX3RpbGUtPmNvbXBzID0gMDA7Ci0gICAgICAgIG9wal9mcmVlKHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzKTsKLSAgICAgICAgcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMgPSAwMDsKKyAgICAgICAgaWYgKGxfdGlsZV9jb21wLT5vd25zRGF0YSAmJiBsX3RpbGVfY29tcC0+ZGF0YSkgeworICAgICAgICAgICAgb3BqX2ltYWdlX2RhdGFfZnJlZShsX3RpbGVfY29tcC0+ZGF0YSk7CisgICAgICAgICAgICBsX3RpbGVfY29tcC0+ZGF0YSA9IDAwOworICAgICAgICAgICAgbF90aWxlX2NvbXAtPm93bnNEYXRhID0gMDsKKyAgICAgICAgICAgIGxfdGlsZV9jb21wLT5kYXRhX3NpemUgPSAwOworICAgICAgICAgICAgbF90aWxlX2NvbXAtPmRhdGFfc2l6ZV9uZWVkZWQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgb3BqX2ltYWdlX2RhdGFfZnJlZShsX3RpbGVfY29tcC0+ZGF0YV93aW4pOworCisgICAgICAgICsrbF90aWxlX2NvbXA7CisgICAgfQorCisgICAgb3BqX2ZyZWUobF90aWxlLT5jb21wcyk7CisgICAgbF90aWxlLT5jb21wcyA9IDAwOworICAgIG9wal9mcmVlKHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzKTsKKyAgICBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcyA9IDAwOwogfQogCiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX3QyX2RlY29kZSAob3BqX3RjZF90ICpwX3RjZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfc3JjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV9yZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfc3JjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqcF9jc3RyX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorc3RhdGljIE9QSl9CT09MIG9wal90Y2RfdDJfZGVjb2RlKG9wal90Y2RfdCAqcF90Y2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX3NyY19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfbWF4X3NyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZGV4X3QgKnBfY3N0cl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogewotICAgICAgICBvcGpfdDJfdCAqIGxfdDI7CisgICAgb3BqX3QyX3QgKiBsX3QyOwogCi0gICAgICAgIGxfdDIgPSBvcGpfdDJfY3JlYXRlKHBfdGNkLT5pbWFnZSwgcF90Y2QtPmNwKTsKLSAgICAgICAgaWYgKGxfdDIgPT0gMDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9CisgICAgbF90MiA9IG9wal90Ml9jcmVhdGUocF90Y2QtPmltYWdlLCBwX3RjZC0+Y3ApOworICAgIGlmIChsX3QyID09IDAwKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQogCi0gICAgICAgIGlmICghIG9wal90Ml9kZWNvZGVfcGFja2V0cygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3QyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNkLT50Y2RfdGlsZW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc3JjX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kYXRhX3JlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9tYXhfc3JjX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jc3RyX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWFuYWdlcikpIHsKLSAgICAgICAgICAgICAgICBvcGpfdDJfZGVzdHJveShsX3QyKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICB9Ci0KKyAgICBpZiAoISBvcGpfdDJfZGVjb2RlX3BhY2tldHMoCisgICAgICAgICAgICAgICAgcF90Y2QsCisgICAgICAgICAgICAgICAgbF90MiwKKyAgICAgICAgICAgICAgICBwX3RjZC0+dGNkX3RpbGVubywKKyAgICAgICAgICAgICAgICBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcywKKyAgICAgICAgICAgICAgICBwX3NyY19kYXRhLAorICAgICAgICAgICAgICAgIHBfZGF0YV9yZWFkLAorICAgICAgICAgICAgICAgIHBfbWF4X3NyY19zaXplLAorICAgICAgICAgICAgICAgIHBfY3N0cl9pbmRleCwKKyAgICAgICAgICAgICAgICBwX21hbmFnZXIpKSB7CiAgICAgICAgIG9wal90Ml9kZXN0cm95KGxfdDIpOworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLUNMRUFOLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICBvcGpfdDJfZGVzdHJveShsX3QyKTsKKworICAgIC8qLS0tLS0tLS0tLS0tLS0tQ0xFQU4tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX3QxX2RlY29kZSAoIG9wal90Y2RfdCAqcF90Y2QgKQorc3RhdGljIE9QSl9CT09MIG9wal90Y2RfdDFfZGVjb2RlKG9wal90Y2RfdCAqcF90Y2QsIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKQogewotICAgICAgICBPUEpfVUlOVDMyIGNvbXBubzsKLSAgICAgICAgb3BqX3QxX3QgKiBsX3QxOwotICAgICAgICBvcGpfdGNkX3RpbGVfdCAqIGxfdGlsZSA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzOwotICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QqIGxfdGlsZV9jb21wID0gbF90aWxlLT5jb21wczsKLSAgICAgICAgb3BqX3RjY3BfdCAqIGxfdGNjcCA9IHBfdGNkLT50Y3AtPnRjY3BzOworICAgIE9QSl9VSU5UMzIgY29tcG5vOworICAgIG9wal90Y2RfdGlsZV90ICogbF90aWxlID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXM7CisgICAgb3BqX3RjZF90aWxlY29tcF90KiBsX3RpbGVfY29tcCA9IGxfdGlsZS0+Y29tcHM7CisgICAgb3BqX3RjY3BfdCAqIGxfdGNjcCA9IHBfdGNkLT50Y3AtPnRjY3BzOworICAgIHZvbGF0aWxlIE9QSl9CT09MIHJldCA9IE9QSl9UUlVFOworICAgIE9QSl9CT09MIGNoZWNrX3B0ZXJtID0gT1BKX0ZBTFNFOworICAgIG9wal9tdXRleF90KiBwX21hbmFnZXJfbXV0ZXggPSBOVUxMOworCisgICAgcF9tYW5hZ2VyX211dGV4ID0gb3BqX211dGV4X2NyZWF0ZSgpOworCisgICAgLyogT25seSBlbmFibGUgUFRFUk0gY2hlY2sgaWYgd2UgZGVjb2RlIGFsbCBsYXllcnMgKi8KKyAgICBpZiAocF90Y2QtPnRjcC0+bnVtX2xheWVyc190b19kZWNvZGUgPT0gcF90Y2QtPnRjcC0+bnVtbGF5ZXJzICYmCisgICAgICAgICAgICAobF90Y2NwLT5jYmxrc3R5ICYgSjJLX0NDUF9DQkxLU1RZX1BURVJNKSAhPSAwKSB7CisgICAgICAgIGNoZWNrX3B0ZXJtID0gT1BKX1RSVUU7CisgICAgfQorCisgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBsX3RpbGUtPm51bWNvbXBzOworICAgICAgICAgICAgKytjb21wbm8sICsrbF90aWxlX2NvbXAsICsrbF90Y2NwKSB7CisgICAgICAgIGlmIChwX3RjZC0+dXNlZF9jb21wb25lbnQgIT0gTlVMTCAmJiAhcF90Y2QtPnVzZWRfY29tcG9uZW50W2NvbXBub10pIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgb3BqX3QxX2RlY29kZV9jYmxrcyhwX3RjZCwgJnJldCwgbF90aWxlX2NvbXAsIGxfdGNjcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX21hbmFnZXIsIHBfbWFuYWdlcl9tdXRleCwgY2hlY2tfcHRlcm0pOworICAgICAgICBpZiAoIXJldCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBvcGpfdGhyZWFkX3Bvb2xfd2FpdF9jb21wbGV0aW9uKHBfdGNkLT50aHJlYWRfcG9vbCwgMCk7CisgICAgaWYgKHBfbWFuYWdlcl9tdXRleCkgeworICAgICAgICBvcGpfbXV0ZXhfZGVzdHJveShwX21hbmFnZXJfbXV0ZXgpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQogCiAKLSAgICAgICAgbF90MSA9IG9wal90MV9jcmVhdGUoT1BKX0ZBTFNFKTsKLSAgICAgICAgaWYgKGxfdDEgPT0gMDApIHsKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX2R3dF9kZWNvZGUob3BqX3RjZF90ICpwX3RjZCkKK3sKKyAgICBPUEpfVUlOVDMyIGNvbXBubzsKKyAgICBvcGpfdGNkX3RpbGVfdCAqIGxfdGlsZSA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzOworICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqIGxfdGlsZV9jb21wID0gbF90aWxlLT5jb21wczsKKyAgICBvcGpfdGNjcF90ICogbF90Y2NwID0gcF90Y2QtPnRjcC0+dGNjcHM7CisgICAgb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1nX2NvbXAgPSBwX3RjZC0+aW1hZ2UtPmNvbXBzOworCisgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBsX3RpbGUtPm51bWNvbXBzOworICAgICAgICAgICAgY29tcG5vKyssICsrbF90aWxlX2NvbXAsICsrbF9pbWdfY29tcCwgKytsX3RjY3ApIHsKKyAgICAgICAgaWYgKHBfdGNkLT51c2VkX2NvbXBvbmVudCAhPSBOVUxMICYmICFwX3RjZC0+dXNlZF9jb21wb25lbnRbY29tcG5vXSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobF90Y2NwLT5xbWZiaWQgPT0gMSkgeworICAgICAgICAgICAgaWYgKCEgb3BqX2R3dF9kZWNvZGUocF90Y2QsIGxfdGlsZV9jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9pbWdfY29tcC0+cmVzbm9fZGVjb2RlZCArIDEpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghIG9wal9kd3RfZGVjb2RlX3JlYWwocF90Y2QsIGxfdGlsZV9jb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2ltZ19jb21wLT5yZXNub19kZWNvZGVkICsgMSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgZm9yIChjb21wbm8gPSAwOyBjb21wbm8gPCBsX3RpbGUtPm51bWNvbXBzOyArK2NvbXBubykgewotICAgICAgICAgICAgICAgIC8qIFRoZSArMyBpcyBoZWFkcm9vbSByZXF1aXJlZCBieSB0aGUgdmVjdG9yaXplZCBEV1QgKi8KLSAgICAgICAgICAgICAgICBpZiAoT1BKX0ZBTFNFID09IG9wal90MV9kZWNvZGVfY2Jsa3MobF90MSwgbF90aWxlX2NvbXAsIGxfdGNjcCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90MV9kZXN0cm95KGxfdDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKytsX3RpbGVfY29tcDsKLSAgICAgICAgICAgICAgICArK2xfdGNjcDsKLSAgICAgICAgfQorICAgIH0KIAotICAgICAgICBvcGpfdDFfZGVzdHJveShsX3QxKTsKLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX2R3dF9kZWNvZGUgKCBvcGpfdGNkX3QgKnBfdGNkICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX21jdF9kZWNvZGUob3BqX3RjZF90ICpwX3RjZCwgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpCiB7Ci0gICAgICAgIE9QSl9VSU5UMzIgY29tcG5vOwotICAgICAgICBvcGpfdGNkX3RpbGVfdCAqIGxfdGlsZSA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzOwotICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKiBsX3RpbGVfY29tcCA9IGxfdGlsZS0+Y29tcHM7Ci0gICAgICAgIG9wal90Y2NwX3QgKiBsX3RjY3AgPSBwX3RjZC0+dGNwLT50Y2NwczsKLSAgICAgICAgb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1nX2NvbXAgPSBwX3RjZC0+aW1hZ2UtPmNvbXBzOworICAgIG9wal90Y2RfdGlsZV90ICogbF90aWxlID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXM7CisgICAgb3BqX3RjcF90ICogbF90Y3AgPSBwX3RjZC0+dGNwOworICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqIGxfdGlsZV9jb21wID0gbF90aWxlLT5jb21wczsKKyAgICBPUEpfVUlOVDMyIGxfc2FtcGxlcywgaTsKIAotICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IGxfdGlsZS0+bnVtY29tcHM7IGNvbXBubysrKSB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICBpZiAodGNkLT5jcC0+cmVkdWNlICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRjZC0+aW1hZ2UtPmNvbXBzW2NvbXBub10ucmVzbm9fZGVjb2RlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGUtPmNvbXBzW2NvbXBub10ubnVtcmVzb2x1dGlvbnMgLSB0Y2QtPmNwLT5yZWR1Y2UgLSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRjZC0+aW1hZ2UtPmNvbXBzW2NvbXBub10ucmVzbm9fZGVjb2RlZCA8IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbnVtcmVzMmRlY29kZSA9IHRjZC0+aW1hZ2UtPmNvbXBzW2NvbXBub10ucmVzbm9fZGVjb2RlZCArIDE7Ci0gICAgICAgICAgICAgICAgaWYobnVtcmVzMmRlY29kZSA+IDApewotICAgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICBpZiAobF90Y2NwLT5xbWZiaWQgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgb3BqX2R3dF9kZWNvZGUobF90aWxlX2NvbXAsIGxfaW1nX2NvbXAtPnJlc25vX2RlY29kZWQrMSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfZHd0X2RlY29kZV9yZWFsKGxfdGlsZV9jb21wLCBsX2ltZ19jb21wLT5yZXNub19kZWNvZGVkKzEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgKytsX3RpbGVfY29tcDsKLSAgICAgICAgICAgICAgICArK2xfaW1nX2NvbXA7Ci0gICAgICAgICAgICAgICAgKytsX3RjY3A7Ci0gICAgICAgIH0KLQorICAgIGlmIChsX3RjcC0+bWN0ID09IDAgfHwgcF90Y2QtPnVzZWRfY29tcG9uZW50ICE9IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotc3RhdGljIE9QSl9CT09MIG9wal90Y2RfbWN0X2RlY29kZSAoIG9wal90Y2RfdCAqcF90Y2QsIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKQotewotICAgICAgICBvcGpfdGNkX3RpbGVfdCAqIGxfdGlsZSA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzOwotICAgICAgICBvcGpfdGNwX3QgKiBsX3RjcCA9IHBfdGNkLT50Y3A7Ci0gICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqIGxfdGlsZV9jb21wID0gbF90aWxlLT5jb21wczsKLSAgICAgICAgT1BKX1VJTlQzMiBsX3NhbXBsZXMsaTsKKyAgICB9CiAKLSAgICAgICAgaWYgKCEgbF90Y3AtPm1jdCkgeworICAgIGlmIChwX3RjZC0+d2hvbGVfdGlsZV9kZWNvZGluZykgeworICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCogcmVzX2NvbXAwID0gbF90aWxlLT5jb21wc1swXS5yZXNvbHV0aW9ucyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RpbGVfY29tcC0+bWluaW11bV9udW1fcmVzb2x1dGlvbnMgLSAxOworCisgICAgICAgIC8qIEEgYml0IGluZWZmaWNpZW50OiB3ZSBwcm9jZXNzIG1vcmUgZGF0YSB0aGFuIG5lZWRlZCBpZiAqLworICAgICAgICAvKiByZXNub19kZWNvZGVkIDwgbF90aWxlX2NvbXAtPm1pbmltdW1fbnVtX3Jlc29sdXRpb25zLTEsICovCisgICAgICAgIC8qIGJ1dCB3ZSB3b3VsZCBuZWVkIHRvIHRha2UgaW50byBhY2NvdW50IGEgc3RyaWRlIHRoZW4gKi8KKyAgICAgICAgbF9zYW1wbGVzID0gKE9QSl9VSU5UMzIpKChyZXNfY29tcDAtPngxIC0gcmVzX2NvbXAwLT54MCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc19jb21wMC0+eTEgLSByZXNfY29tcDAtPnkwKSk7CisgICAgICAgIGlmIChsX3RpbGUtPm51bWNvbXBzID49IDMpIHsKKyAgICAgICAgICAgIGlmIChsX3RpbGVfY29tcC0+bWluaW11bV9udW1fcmVzb2x1dGlvbnMgIT0KKyAgICAgICAgICAgICAgICAgICAgbF90aWxlLT5jb21wc1sxXS5taW5pbXVtX251bV9yZXNvbHV0aW9ucyB8fAorICAgICAgICAgICAgICAgICAgICBsX3RpbGVfY29tcC0+bWluaW11bV9udW1fcmVzb2x1dGlvbnMgIT0KKyAgICAgICAgICAgICAgICAgICAgbF90aWxlLT5jb21wc1syXS5taW5pbXVtX251bV9yZXNvbHV0aW9ucykgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGlsZXMgZG9uJ3QgYWxsIGhhdmUgdGhlIHNhbWUgZGltZW5zaW9uLiBTa2lwIHRoZSBNQ1Qgc3RlcC5cbiIpOworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxfdGlsZS0+bnVtY29tcHMgPj0gMykgeworICAgICAgICAgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QqIHJlc19jb21wMSA9IGxfdGlsZS0+Y29tcHNbMV0ucmVzb2x1dGlvbnMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGlsZV9jb21wLT5taW5pbXVtX251bV9yZXNvbHV0aW9ucyAtIDE7CisgICAgICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCogcmVzX2NvbXAyID0gbF90aWxlLT5jb21wc1syXS5yZXNvbHV0aW9ucyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90aWxlX2NvbXAtPm1pbmltdW1fbnVtX3Jlc29sdXRpb25zIC0gMTsKKyAgICAgICAgICAgIC8qIHRlc3RjYXNlIDEzMzYucGRmLmFzYW4uNDcuMzc2ICovCisgICAgICAgICAgICBpZiAocF90Y2QtPmltYWdlLT5jb21wc1swXS5yZXNub19kZWNvZGVkICE9CisgICAgICAgICAgICAgICAgICAgIHBfdGNkLT5pbWFnZS0+Y29tcHNbMV0ucmVzbm9fZGVjb2RlZCB8fAorICAgICAgICAgICAgICAgICAgICBwX3RjZC0+aW1hZ2UtPmNvbXBzWzBdLnJlc25vX2RlY29kZWQgIT0KKyAgICAgICAgICAgICAgICAgICAgcF90Y2QtPmltYWdlLT5jb21wc1syXS5yZXNub19kZWNvZGVkIHx8CisgICAgICAgICAgICAgICAgICAgIChPUEpfU0laRV9UKShyZXNfY29tcDEtPngxIC0gcmVzX2NvbXAxLT54MCkgKgorICAgICAgICAgICAgICAgICAgICAoT1BKX1NJWkVfVCkocmVzX2NvbXAxLT55MSAtIHJlc19jb21wMS0+eTApICE9IGxfc2FtcGxlcyB8fAorICAgICAgICAgICAgICAgICAgICAoT1BKX1NJWkVfVCkocmVzX2NvbXAyLT54MSAtIHJlc19jb21wMi0+eDApICoKKyAgICAgICAgICAgICAgICAgICAgKE9QSl9TSVpFX1QpKHJlc19jb21wMi0+eTEgLSByZXNfY29tcDItPnkwKSAhPSBsX3NhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbGVzIGRvbid0IGFsbCBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbi4gU2tpcCB0aGUgTUNUIHN0ZXAuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QqIHJlc19jb21wMCA9IGxfdGlsZS0+Y29tcHNbMF0ucmVzb2x1dGlvbnMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90Y2QtPmltYWdlLT5jb21wc1swXS5yZXNub19kZWNvZGVkOworCisgICAgICAgIGxfc2FtcGxlcyA9IChyZXNfY29tcDAtPndpbl94MSAtIHJlc19jb21wMC0+d2luX3gwKSAqCisgICAgICAgICAgICAgICAgICAgIChyZXNfY29tcDAtPndpbl95MSAtIHJlc19jb21wMC0+d2luX3kwKTsKKyAgICAgICAgaWYgKGxfdGlsZS0+bnVtY29tcHMgPj0gMykgeworICAgICAgICAgICAgb3BqX3RjZF9yZXNvbHV0aW9uX3QqIHJlc19jb21wMSA9IGxfdGlsZS0+Y29tcHNbMV0ucmVzb2x1dGlvbnMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNkLT5pbWFnZS0+Y29tcHNbMV0ucmVzbm9fZGVjb2RlZDsKKyAgICAgICAgICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiByZXNfY29tcDIgPSBsX3RpbGUtPmNvbXBzWzJdLnJlc29sdXRpb25zICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RjZC0+aW1hZ2UtPmNvbXBzWzJdLnJlc25vX2RlY29kZWQ7CisgICAgICAgICAgICAvKiB0ZXN0Y2FzZSAxMzM2LnBkZi5hc2FuLjQ3LjM3NiAqLworICAgICAgICAgICAgaWYgKHBfdGNkLT5pbWFnZS0+Y29tcHNbMF0ucmVzbm9fZGVjb2RlZCAhPQorICAgICAgICAgICAgICAgICAgICBwX3RjZC0+aW1hZ2UtPmNvbXBzWzFdLnJlc25vX2RlY29kZWQgfHwKKyAgICAgICAgICAgICAgICAgICAgcF90Y2QtPmltYWdlLT5jb21wc1swXS5yZXNub19kZWNvZGVkICE9CisgICAgICAgICAgICAgICAgICAgIHBfdGNkLT5pbWFnZS0+Y29tcHNbMl0ucmVzbm9fZGVjb2RlZCB8fAorICAgICAgICAgICAgICAgICAgICAoT1BKX1NJWkVfVCkocmVzX2NvbXAxLT53aW5feDEgLSByZXNfY29tcDEtPndpbl94MCkgKgorICAgICAgICAgICAgICAgICAgICAoT1BKX1NJWkVfVCkocmVzX2NvbXAxLT53aW5feTEgLSByZXNfY29tcDEtPndpbl95MCkgIT0gbF9zYW1wbGVzIHx8CisgICAgICAgICAgICAgICAgICAgIChPUEpfU0laRV9UKShyZXNfY29tcDItPndpbl94MSAtIHJlc19jb21wMi0+d2luX3gwKSAqCisgICAgICAgICAgICAgICAgICAgIChPUEpfU0laRV9UKShyZXNfY29tcDItPndpbl95MSAtIHJlc19jb21wMi0+d2luX3kwKSAhPSBsX3NhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRpbGVzIGRvbid0IGFsbCBoYXZlIHRoZSBzYW1lIGRpbWVuc2lvbi4gU2tpcCB0aGUgTUNUIHN0ZXAuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxfdGlsZS0+bnVtY29tcHMgPj0gMykgeworICAgICAgICBpZiAobF90Y3AtPm1jdCA9PSAyKSB7CisgICAgICAgICAgICBPUEpfQllURSAqKiBsX2RhdGE7CisKKyAgICAgICAgICAgIGlmICghIGxfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIH0KIAotICAgICAgICBsX3NhbXBsZXMgPSAoT1BKX1VJTlQzMikoKGxfdGlsZV9jb21wLT54MSAtIGxfdGlsZV9jb21wLT54MCkgKiAobF90aWxlX2NvbXAtPnkxIC0gbF90aWxlX2NvbXAtPnkwKSk7CisgICAgICAgICAgICBsX2RhdGEgPSAoT1BKX0JZVEUgKiopIG9wal9tYWxsb2MobF90aWxlLT5udW1jb21wcyAqIHNpemVvZihPUEpfQllURSopKTsKKyAgICAgICAgICAgIGlmICghIGxfZGF0YSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgaWYgKGxfdGlsZS0+bnVtY29tcHMgPj0gMyApewotICAgICAgICAgICAgICAgIC8qIHRlc3RjYXNlIDEzMzYucGRmLmFzYW4uNDcuMzc2ICovCi0gICAgICAgICAgICAgICAgaWYgKChsX3RpbGUtPmNvbXBzWzBdLngxIC0gbF90aWxlLT5jb21wc1swXS54MCkgKiAobF90aWxlLT5jb21wc1swXS55MSAtIGxfdGlsZS0+Y29tcHNbMF0ueTApIDwgKE9QSl9JTlQzMilsX3NhbXBsZXMgfHwKLSAgICAgICAgICAgICAgICAgICAgKGxfdGlsZS0+Y29tcHNbMV0ueDEgLSBsX3RpbGUtPmNvbXBzWzFdLngwKSAqIChsX3RpbGUtPmNvbXBzWzFdLnkxIC0gbF90aWxlLT5jb21wc1sxXS55MCkgPCAoT1BKX0lOVDMyKWxfc2FtcGxlcyB8fAotICAgICAgICAgICAgICAgICAgICAobF90aWxlLT5jb21wc1syXS54MSAtIGxfdGlsZS0+Y29tcHNbMl0ueDApICogKGxfdGlsZS0+Y29tcHNbMl0ueTEgLSBsX3RpbGUtPmNvbXBzWzJdLnkwKSA8IChPUEpfSU5UMzIpbF9zYW1wbGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiVGlsZXMgZG9uJ3QgYWxsIGhhdmUgdGhlIHNhbWUgZGltZW5zaW9uLiBTa2lwIHRoZSBNQ1Qgc3RlcC5cbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsX3RpbGUtPm51bWNvbXBzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAocF90Y2QtPndob2xlX3RpbGVfZGVjb2RpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbF9kYXRhW2ldID0gKE9QSl9CWVRFKikgbF90aWxlX2NvbXAtPmRhdGE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbF9kYXRhW2ldID0gKE9QSl9CWVRFKikgbF90aWxlX2NvbXAtPmRhdGFfd2luOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChsX3RjcC0+bWN0ID09IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICoqIGxfZGF0YTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbF90Y3AtPm1fbWN0X2RlY29kaW5nX21hdHJpeCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGxfZGF0YSA9IChPUEpfQllURSAqKikgb3BqX21hbGxvYyhsX3RpbGUtPm51bWNvbXBzKnNpemVvZihPUEpfQllURSopKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIGxfZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MDtpPGxfdGlsZS0+bnVtY29tcHM7KytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZGF0YVtpXSA9IChPUEpfQllURSopIGxfdGlsZV9jb21wLT5kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfdGlsZV9jb21wOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfbWN0X2RlY29kZV9jdXN0b20oLyogTUNUIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfQllURSopIGxfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIGNvbXBvbmVudHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXBvbmVudHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iIG9mIGNvbXBvbmVudHMgKGkuZS4gc2l6ZSBvZiBwRGF0YSkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGlsZS0+bnVtY29tcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZWxscyBpZiB0aGUgZGF0YSBpcyBzaWduZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNkLT5pbWFnZS0+Y29tcHMtPnNnbmQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfZGF0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfdGNwLT50Y2Nwcy0+cW1mYmlkID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX21jdF9kZWNvZGUoICAgICBsX3RpbGUtPmNvbXBzWzBdLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGlsZS0+Y29tcHNbMV0uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90aWxlLT5jb21wc1syXS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NhbXBsZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX21jdF9kZWNvZGVfcmVhbCgoT1BKX0ZMT0FUMzIqKWxfdGlsZS0+Y29tcHNbMF0uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfRkxPQVQzMiopbF90aWxlLT5jb21wc1sxXS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9GTE9BVDMyKilsX3RpbGUtPmNvbXBzWzJdLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NhbXBsZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbXNnKHBfbWFuYWdlciwgRVZUX0VSUk9SLCAiTnVtYmVyIG9mIGNvbXBvbmVudHMgKCVkKSBpcyBpbmNvbnNpc3RlbnQgd2l0aCBhIE1DVC4gU2tpcCB0aGUgTUNUIHN0ZXAuXG4iLGxfdGlsZS0+bnVtY29tcHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX2RjX2xldmVsX3NoaWZ0X2RlY29kZSAoIG9wal90Y2RfdCAqcF90Y2QgKQotewotICAgICAgICBPUEpfVUlOVDMyIGNvbXBubzsKLSAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICogbF90aWxlX2NvbXAgPSAwMDsKLSAgICAgICAgb3BqX3RjY3BfdCAqIGxfdGNjcCA9IDAwOwotICAgICAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IDAwOwotICAgICAgICBvcGpfdGNkX3Jlc29sdXRpb25fdCogbF9yZXMgPSAwMDsKLSAgICAgICAgb3BqX3RjZF90aWxlX3QgKiBsX3RpbGU7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF93aWR0aCxsX2hlaWdodCxpLGo7Ci0gICAgICAgIE9QSl9JTlQzMiAqIGxfY3VycmVudF9wdHI7Ci0gICAgICAgIE9QSl9JTlQzMiBsX21pbiwgbF9tYXg7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9zdHJpZGU7Ci0KLSAgICAgICAgbF90aWxlID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXM7Ci0gICAgICAgIGxfdGlsZV9jb21wID0gbF90aWxlLT5jb21wczsKLSAgICAgICAgbF90Y2NwID0gcF90Y2QtPnRjcC0+dGNjcHM7Ci0gICAgICAgIGxfaW1nX2NvbXAgPSBwX3RjZC0+aW1hZ2UtPmNvbXBzOwotCi0gICAgICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgbF90aWxlLT5udW1jb21wczsgY29tcG5vKyspIHsKLSAgICAgICAgICAgICAgICBsX3JlcyA9IGxfdGlsZV9jb21wLT5yZXNvbHV0aW9ucyArIGxfaW1nX2NvbXAtPnJlc25vX2RlY29kZWQ7Ci0gICAgICAgICAgICAgICAgbF93aWR0aCA9IChPUEpfVUlOVDMyKShsX3Jlcy0+eDEgLSBsX3Jlcy0+eDApOwotICAgICAgICAgICAgICAgIGxfaGVpZ2h0ID0gKE9QSl9VSU5UMzIpKGxfcmVzLT55MSAtIGxfcmVzLT55MCk7Ci0gICAgICAgICAgICAgICAgbF9zdHJpZGUgPSAoT1BKX1VJTlQzMikobF90aWxlX2NvbXAtPngxIC0gbF90aWxlX2NvbXAtPngwKSAtIGxfd2lkdGg7Ci0KLSAgICAgICAgICAgICAgICBhc3NlcnQobF9oZWlnaHQgPT0gMCB8fCBsX3dpZHRoICsgbF9zdHJpZGUgPD0gbF90aWxlX2NvbXAtPmRhdGFfc2l6ZSAvIGxfaGVpZ2h0KTsgLypNVVBERiovCi0KLSAgICAgICAgICAgICAgICBpZiAobF9pbWdfY29tcC0+c2duZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbF9taW4gPSAtKDEgPDwgKGxfaW1nX2NvbXAtPnByZWMgLSAxKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX21heCA9ICgxIDw8IChsX2ltZ19jb21wLT5wcmVjIC0gMSkpIC0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBsX21pbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX21heCA9ICgxIDw8IGxfaW1nX2NvbXAtPnByZWMpIC0gMTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBsX2N1cnJlbnRfcHRyID0gbF90aWxlX2NvbXAtPmRhdGE7Ci0KLSAgICAgICAgICAgICAgICBpZiAobF90Y2NwLT5xbWZiaWQgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajxsX2hlaWdodDsrK2opIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxfd2lkdGg7ICsraSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsX2N1cnJlbnRfcHRyID0gb3BqX2ludF9jbGFtcCgqbF9jdXJyZW50X3B0ciArIGxfdGNjcC0+bV9kY19sZXZlbF9zaGlmdCwgbF9taW4sIGxfbWF4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfY3VycmVudF9wdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3B0ciArPSBsX3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo9MDtqPGxfaGVpZ2h0OysraikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF93aWR0aDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUMzIgbF92YWx1ZSA9ICooKE9QSl9GTE9BVDMyICopIGxfY3VycmVudF9wdHIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsX2N1cnJlbnRfcHRyID0gb3BqX2ludF9jbGFtcCgoT1BKX0lOVDMyKW9wal9scmludGYobF92YWx1ZSkgKyBsX3RjY3AtPm1fZGNfbGV2ZWxfc2hpZnQsIGxfbWluLCBsX21heCk7IDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfY3VycmVudF9wdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jdXJyZW50X3B0ciArPSBsX3N0cmlkZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICArK2xfaW1nX2NvbXA7Ci0gICAgICAgICAgICAgICAgKytsX3RjY3A7CiAgICAgICAgICAgICAgICAgKytsX3RpbGVfY29tcDsKLSAgICAgICAgfQorICAgICAgICAgICAgfQogCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotCi0KLS8qKgotICogRGVhbGxvY2F0ZXMgdGhlIGVuY29kaW5nIGRhdGEgb2YgdGhlIGdpdmVuIHByZWNpbmN0LgotICovCi1zdGF0aWMgdm9pZCBvcGpfdGNkX2NvZGVfYmxvY2tfZGVjX2RlYWxsb2NhdGUgKG9wal90Y2RfcHJlY2luY3RfdCAqIHBfcHJlY2luY3QpCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgY2Jsa25vICwgbF9uYl9jb2RlX2Jsb2NrczsKLQotICAgICAgICBvcGpfdGNkX2NibGtfZGVjX3QgKiBsX2NvZGVfYmxvY2sgPSBwX3ByZWNpbmN0LT5jYmxrcy5kZWM7Ci0gICAgICAgIGlmIChsX2NvZGVfYmxvY2spIHsKLSAgICAgICAgICAgICAgICAvKmZwcmludGYoc3RkZXJyLCJkZWFsbG9jYXRlIGNvZGVibG9jazp7XG4iKTsqLwotICAgICAgICAgICAgICAgIC8qZnByaW50ZihzdGRlcnIsIlx0IHgwPSVkLCB5MD0lZCwgeDE9JWQsIHkxPSVkXG4iLGxfY29kZV9ibG9jay0+eDAsIGxfY29kZV9ibG9jay0+eTAsIGxfY29kZV9ibG9jay0+eDEsIGxfY29kZV9ibG9jay0+eTEpOyovCi0gICAgICAgICAgICAgICAgLypmcHJpbnRmKHN0ZGVyciwiXHQgbnVtYnBzPSVkLCBudW1sZW5iaXRzPSVkLCBsZW49JWQsIG51bW5ld3Bhc3Nlcz0lZCwgcmVhbF9udW1fc2Vncz0lZCwgbV9jdXJyZW50X21heF9zZWdzPSVkXG4gIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jb2RlX2Jsb2NrLT5udW1icHMsIGxfY29kZV9ibG9jay0+bnVtbGVuYml0cywgbF9jb2RlX2Jsb2NrLT5sZW4sIGxfY29kZV9ibG9jay0+bnVtbmV3cGFzc2VzLCBsX2NvZGVfYmxvY2stPnJlYWxfbnVtX3NlZ3MsIGxfY29kZV9ibG9jay0+bV9jdXJyZW50X21heF9zZWdzICk7Ki8KLQotCi0gICAgICAgICAgICAgICAgbF9uYl9jb2RlX2Jsb2NrcyA9IHBfcHJlY2luY3QtPmJsb2NrX3NpemUgLyBzaXplb2Yob3BqX3RjZF9jYmxrX2RlY190KTsKLSAgICAgICAgICAgICAgICAvKmZwcmludGYoc3RkZXJyLCJuYl9jb2RlX2Jsb2NrcyA9JWRcdH1cbiIsIGxfbmJfY29kZV9ibG9ja3MpOyovCi0KLSAgICAgICAgICAgICAgICBmb3IgKGNibGtubyA9IDA7IGNibGtubyA8IGxfbmJfY29kZV9ibG9ja3M7ICsrY2Jsa25vKSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2NvZGVfYmxvY2stPmRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jb2RlX2Jsb2NrLT5kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jb2RlX2Jsb2NrLT5kYXRhID0gMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2NvZGVfYmxvY2stPnNlZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jb2RlX2Jsb2NrLT5zZWdzICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY29kZV9ibG9jay0+c2VncyA9IDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICArK2xfY29kZV9ibG9jazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvcGpfZnJlZShwX3ByZWNpbmN0LT5jYmxrcy5kZWMpOwotICAgICAgICAgICAgICAgIHBfcHJlY2luY3QtPmNibGtzLmRlYyA9IDAwOwotICAgICAgICB9Ci19Ci0KLS8qKgotICogRGVhbGxvY2F0ZXMgdGhlIGVuY29kaW5nIGRhdGEgb2YgdGhlIGdpdmVuIHByZWNpbmN0LgotICovCi1zdGF0aWMgdm9pZCBvcGpfdGNkX2NvZGVfYmxvY2tfZW5jX2RlYWxsb2NhdGUgKG9wal90Y2RfcHJlY2luY3RfdCAqIHBfcHJlY2luY3QpCi17ICAgICAgIAotICAgICAgICBPUEpfVUlOVDMyIGNibGtubyAsIGxfbmJfY29kZV9ibG9ja3M7Ci0KLSAgICAgICAgb3BqX3RjZF9jYmxrX2VuY190ICogbF9jb2RlX2Jsb2NrID0gcF9wcmVjaW5jdC0+Y2Jsa3MuZW5jOwotICAgICAgICBpZiAobF9jb2RlX2Jsb2NrKSB7Ci0gICAgICAgICAgICAgICAgbF9uYl9jb2RlX2Jsb2NrcyA9IHBfcHJlY2luY3QtPmJsb2NrX3NpemUgLyBzaXplb2Yob3BqX3RjZF9jYmxrX2VuY190KTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBmb3IgICAgIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBsX25iX2NvZGVfYmxvY2tzOyArK2NibGtubykgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsX2NvZGVfYmxvY2stPmRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jb2RlX2Jsb2NrLT5kYXRhIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY29kZV9ibG9jay0+ZGF0YSA9IDAwOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9jb2RlX2Jsb2NrLT5sYXllcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jb2RlX2Jsb2NrLT5sYXllcnMgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9jb2RlX2Jsb2NrLT5sYXllcnMgPSAwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxfY29kZV9ibG9jay0+cGFzc2VzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY29kZV9ibG9jay0+cGFzc2VzICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfY29kZV9ibG9jay0+cGFzc2VzID0gMDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICArK2xfY29kZV9ibG9jazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvcGpfZnJlZShwX3ByZWNpbmN0LT5jYmxrcy5lbmMpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHBfcHJlY2luY3QtPmNibGtzLmVuYyA9IDAwOwotICAgICAgICB9Ci19Ci0KLU9QSl9VSU5UMzIgb3BqX3RjZF9nZXRfZW5jb2RlZF90aWxlX3NpemUgKCBvcGpfdGNkX3QgKnBfdGNkICkKLXsKLSAgICAgICAgT1BKX1VJTlQzMiBpLGxfZGF0YV9zaXplID0gMDsKLSAgICAgICAgb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1nX2NvbXAgPSAwMDsKLSAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICogbF90aWxlYyA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfc2l6ZV9jb21wLCBsX3JlbWFpbmluZzsKLQotICAgICAgICBsX3RpbGVjID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzOwotICAgICAgICBsX2ltZ19jb21wID0gcF90Y2QtPmltYWdlLT5jb21wczsKLSAgICAgICAgZm9yIChpPTA7aTxwX3RjZC0+aW1hZ2UtPm51bWNvbXBzOysraSkgewotICAgICAgICAgICAgICAgIGxfc2l6ZV9jb21wID0gbF9pbWdfY29tcC0+cHJlYyA+PiAzOyAvKigvIDgpKi8KLSAgICAgICAgICAgICAgICBsX3JlbWFpbmluZyA9IGxfaW1nX2NvbXAtPnByZWMgJiA3OyAgLyogKCU4KSAqLwotCi0gICAgICAgICAgICAgICAgaWYgKGxfcmVtYWluaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICArK2xfc2l6ZV9jb21wOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChsX3NpemVfY29tcCA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3NpemVfY29tcCA9IDQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbF9kYXRhX3NpemUgKz0gbF9zaXplX2NvbXAgKiAoT1BKX1VJTlQzMikoKGxfdGlsZWMtPngxIC0gbF90aWxlYy0+eDApICogKGxfdGlsZWMtPnkxIC0gbF90aWxlYy0+eTApKTsKLSAgICAgICAgICAgICAgICArK2xfaW1nX2NvbXA7Ci0gICAgICAgICAgICAgICAgKytsX3RpbGVjOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxfZGF0YV9zaXplOwotfQotICAgICAgICAgICAgICAgIAotc3RhdGljIE9QSl9CT09MIG9wal90Y2RfZGNfbGV2ZWxfc2hpZnRfZW5jb2RlICggb3BqX3RjZF90ICpwX3RjZCApCi17Ci0gICAgICAgIE9QSl9VSU5UMzIgY29tcG5vOwotICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKiBsX3RpbGVfY29tcCA9IDAwOwotICAgICAgICBvcGpfdGNjcF90ICogbF90Y2NwID0gMDA7Ci0gICAgICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gMDA7Ci0gICAgICAgIG9wal90Y2RfdGlsZV90ICogbF90aWxlOwotICAgICAgICBPUEpfVUlOVDMyIGxfbmJfZWxlbSxpOwotICAgICAgICBPUEpfSU5UMzIgKiBsX2N1cnJlbnRfcHRyOwotCi0gICAgICAgIGxfdGlsZSA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzOwotICAgICAgICBsX3RpbGVfY29tcCA9IGxfdGlsZS0+Y29tcHM7Ci0gICAgICAgIGxfdGNjcCA9IHBfdGNkLT50Y3AtPnRjY3BzOwotICAgICAgICBsX2ltZ19jb21wID0gcF90Y2QtPmltYWdlLT5jb21wczsKLQotICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IGxfdGlsZS0+bnVtY29tcHM7IGNvbXBubysrKSB7Ci0gICAgICAgICAgICAgICAgbF9jdXJyZW50X3B0ciA9IGxfdGlsZV9jb21wLT5kYXRhOwotICAgICAgICAgICAgICAgIGxfbmJfZWxlbSA9IChPUEpfVUlOVDMyKSgobF90aWxlX2NvbXAtPngxIC0gbF90aWxlX2NvbXAtPngwKSAqIChsX3RpbGVfY29tcC0+eTEgLSBsX3RpbGVfY29tcC0+eTApKTsKLQotICAgICAgICAgICAgICAgIGlmIChsX3RjY3AtPnFtZmJpZCA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgICAgIChpID0gMDsgaSA8IGxfbmJfZWxlbTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsX2N1cnJlbnRfcHRyIC09IGxfdGNjcC0+bV9kY19sZXZlbF9zaGlmdCA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X3B0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF9uYl9lbGVtOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxfY3VycmVudF9wdHIgPSAoKmxfY3VycmVudF9wdHIgLSBsX3RjY3AtPm1fZGNfbGV2ZWxfc2hpZnQpIDw8IDExIDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX2N1cnJlbnRfcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICsrbF9pbWdfY29tcDsKLSAgICAgICAgICAgICAgICArK2xfdGNjcDsKLSAgICAgICAgICAgICAgICArK2xfdGlsZV9jb21wOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotfQotCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF9tY3RfZW5jb2RlICggb3BqX3RjZF90ICpwX3RjZCApCi17Ci0gICAgICAgIG9wal90Y2RfdGlsZV90ICogbF90aWxlID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXM7Ci0gICAgICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqIGxfdGlsZV9jb21wID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzOwotICAgICAgICBPUEpfVUlOVDMyIHNhbXBsZXMgPSAoT1BKX1VJTlQzMikoKGxfdGlsZV9jb21wLT54MSAtIGxfdGlsZV9jb21wLT54MCkgKiAobF90aWxlX2NvbXAtPnkxIC0gbF90aWxlX2NvbXAtPnkwKSk7Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgT1BKX0JZVEUgKiogbF9kYXRhID0gMDA7Ci0gICAgICAgIG9wal90Y3BfdCAqIGxfdGNwID0gcF90Y2QtPnRjcDsKLQotICAgICAgICBpZighcF90Y2QtPnRjcC0+bWN0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHBfdGNkLT50Y3AtPm1jdCA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCEgcF90Y2QtPnRjcC0+bV9tY3RfY29kaW5nX21hdHJpeCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9UUlVFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICBsX2RhdGEgPSAoT1BKX0JZVEUgKiopIG9wal9tYWxsb2MobF90aWxlLT5udW1jb21wcypzaXplb2YoT1BKX0JZVEUqKSk7Ci0gICAgICAgICAgICAgICAgaWYgKCEgbF9kYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvciAoaT0wO2k8bF90aWxlLT5udW1jb21wczsrK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfZGF0YVtpXSA9IChPUEpfQllURSopIGxfdGlsZV9jb21wLT5kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgKytsX3RpbGVfY29tcDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoISBvcGpfbWN0X2VuY29kZV9jdXN0b20oLyogTUNUIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0JZVEUqKSBwX3RjZC0+dGNwLT5tX21jdF9jb2RpbmdfbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNpemUgb2YgY29tcG9uZW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY29tcG9uZW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYiBvZiBjb21wb25lbnRzIChpLmUuIHNpemUgb2YgcERhdGEpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90aWxlLT5udW1jb21wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZWxscyBpZiB0aGUgZGF0YSBpcyBzaWduZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RjZC0+aW1hZ2UtPmNvbXBzLT5zZ25kKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgb3BqX2ZyZWUobF9kYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgICAgICAgICAgfQotCisgICAgICAgICAgICBpZiAoISBvcGpfbWN0X2RlY29kZV9jdXN0b20oLyogTUNUIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfQllURSopIGxfdGNwLT5tX21jdF9kZWNvZGluZ19tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIG9mIGNvbXBvbmVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXBvbmVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5iIG9mIGNvbXBvbmVudHMgKGkuZS4gc2l6ZSBvZiBwRGF0YSkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGxfdGlsZS0+bnVtY29tcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZWxscyBpZiB0aGUgZGF0YSBpcyBzaWduZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNkLT5pbWFnZS0+Y29tcHMtPnNnbmQpKSB7CiAgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9kYXRhKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChsX3RjcC0+dGNjcHMtPnFtZmJpZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX21jdF9lbmNvZGVfcmVhbChsX3RpbGUtPmNvbXBzWzBdLmRhdGEsIGxfdGlsZS0+Y29tcHNbMV0uZGF0YSwgbF90aWxlLT5jb21wc1syXS5kYXRhLCBzYW1wbGVzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBvcGpfbWN0X2VuY29kZShsX3RpbGUtPmNvbXBzWzBdLmRhdGEsIGxfdGlsZS0+Y29tcHNbMV0uZGF0YSwgbF90aWxlLT5jb21wc1syXS5kYXRhLCBzYW1wbGVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKLX0KLQotc3RhdGljIE9QSl9CT09MIG9wal90Y2RfZHd0X2VuY29kZSAoIG9wal90Y2RfdCAqcF90Y2QgKQotewotICAgICAgICBvcGpfdGNkX3RpbGVfdCAqIGxfdGlsZSA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzOwotICAgICAgICBvcGpfdGNkX3RpbGVjb21wX3QgKiBsX3RpbGVfY29tcCA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5jb21wczsKLSAgICAgICAgb3BqX3RjY3BfdCAqIGxfdGNjcCA9IHBfdGNkLT50Y3AtPnRjY3BzOwotICAgICAgICBPUEpfVUlOVDMyIGNvbXBubzsKLQotICAgICAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IGxfdGlsZS0+bnVtY29tcHM7ICsrY29tcG5vKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxfdGNjcC0+cW1mYmlkID09IDEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghIG9wal9kd3RfZW5jb2RlKGxfdGlsZV9jb21wKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChsX3RjY3AtPnFtZmJpZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISBvcGpfZHd0X2VuY29kZV9yZWFsKGxfdGlsZV9jb21wKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICsrbF90aWxlX2NvbXA7Ci0gICAgICAgICAgICAgICAgKytsX3RjY3A7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT1BKX1RSVUU7Ci19Ci0KLXN0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX3QxX2VuY29kZSAoIG9wal90Y2RfdCAqcF90Y2QgKQotewotICAgICAgICBvcGpfdDFfdCAqIGxfdDE7Ci0gICAgICAgIGNvbnN0IE9QSl9GTE9BVDY0ICogbF9tY3Rfbm9ybXM7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9tY3RfbnVtY29tcHMgPSAwVTsKLSAgICAgICAgb3BqX3RjcF90ICogbF90Y3AgPSBwX3RjZC0+dGNwOwotCi0gICAgICAgIGxfdDEgPSBvcGpfdDFfY3JlYXRlKE9QSl9UUlVFKTsKLSAgICAgICAgaWYgKGxfdDEgPT0gMDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvcGpfZnJlZShsX2RhdGEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxfdGNwLT50Y2Nwcy0+cW1mYmlkID09IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAocF90Y2QtPndob2xlX3RpbGVfZGVjb2RpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgb3BqX21jdF9kZWNvZGUobF90aWxlLT5jb21wc1swXS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RpbGUtPmNvbXBzWzFdLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGlsZS0+Y29tcHNbMl0uZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zYW1wbGVzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvcGpfbWN0X2RlY29kZShsX3RpbGUtPmNvbXBzWzBdLmRhdGFfd2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RpbGUtPmNvbXBzWzFdLmRhdGFfd2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RpbGUtPmNvbXBzWzJdLmRhdGFfd2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3NhbXBsZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHBfdGNkLT53aG9sZV90aWxlX2RlY29kaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG9wal9tY3RfZGVjb2RlX3JlYWwoKE9QSl9GTE9BVDMyKilsX3RpbGUtPmNvbXBzWzBdLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9GTE9BVDMyKilsX3RpbGUtPmNvbXBzWzFdLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9GTE9BVDMyKilsX3RpbGUtPmNvbXBzWzJdLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zYW1wbGVzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBvcGpfbWN0X2RlY29kZV9yZWFsKChPUEpfRkxPQVQzMiopbF90aWxlLT5jb21wc1swXS5kYXRhX3dpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX0ZMT0FUMzIqKWxfdGlsZS0+Y29tcHNbMV0uZGF0YV93aW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9GTE9BVDMyKilsX3RpbGUtPmNvbXBzWzJdLmRhdGFfd2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2FtcGxlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiTnVtYmVyIG9mIGNvbXBvbmVudHMgKCVkKSBpcyBpbmNvbnNpc3RlbnQgd2l0aCBhIE1DVC4gU2tpcCB0aGUgTUNUIHN0ZXAuXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGxfdGlsZS0+bnVtY29tcHMpOworICAgIH0KKworICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworCitzdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF9kY19sZXZlbF9zaGlmdF9kZWNvZGUob3BqX3RjZF90ICpwX3RjZCkKK3sKKyAgICBPUEpfVUlOVDMyIGNvbXBubzsKKyAgICBvcGpfdGNkX3RpbGVjb21wX3QgKiBsX3RpbGVfY29tcCA9IDAwOworICAgIG9wal90Y2NwX3QgKiBsX3RjY3AgPSAwMDsKKyAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IDAwOworICAgIG9wal90Y2RfcmVzb2x1dGlvbl90KiBsX3JlcyA9IDAwOworICAgIG9wal90Y2RfdGlsZV90ICogbF90aWxlOworICAgIE9QSl9VSU5UMzIgbF93aWR0aCwgbF9oZWlnaHQsIGksIGo7CisgICAgT1BKX0lOVDMyICogbF9jdXJyZW50X3B0cjsKKyAgICBPUEpfSU5UMzIgbF9taW4sIGxfbWF4OworICAgIE9QSl9VSU5UMzIgbF9zdHJpZGU7CisKKyAgICBsX3RpbGUgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlczsKKyAgICBsX3RpbGVfY29tcCA9IGxfdGlsZS0+Y29tcHM7CisgICAgbF90Y2NwID0gcF90Y2QtPnRjcC0+dGNjcHM7CisgICAgbF9pbWdfY29tcCA9IHBfdGNkLT5pbWFnZS0+Y29tcHM7CisKKyAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IGxfdGlsZS0+bnVtY29tcHM7CisgICAgICAgICAgICBjb21wbm8rKywgKytsX2ltZ19jb21wLCArK2xfdGNjcCwgKytsX3RpbGVfY29tcCkgeworCisgICAgICAgIGlmIChwX3RjZC0+dXNlZF9jb21wb25lbnQgIT0gTlVMTCAmJiAhcF90Y2QtPnVzZWRfY29tcG9uZW50W2NvbXBub10pIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGxfdGNwLT5tY3QgPT0gMSkgewotICAgICAgICAgICAgICAgIGxfbWN0X251bWNvbXBzID0gM1U7Ci0gICAgICAgICAgICAgICAgLyogaXJyZXZlcnNpYmxlIGVuY29kaW5nICovCi0gICAgICAgICAgICAgICAgaWYgKGxfdGNwLT50Y2Nwcy0+cW1mYmlkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfbWN0X25vcm1zID0gb3BqX21jdF9nZXRfbWN0X25vcm1zX3JlYWwoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX21jdF9ub3JtcyA9IG9wal9tY3RfZ2V0X21jdF9ub3JtcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBsX21jdF9udW1jb21wcyA9IHBfdGNkLT5pbWFnZS0+bnVtY29tcHM7Ci0gICAgICAgICAgICAgICAgbF9tY3Rfbm9ybXMgPSAoY29uc3QgT1BKX0ZMT0FUNjQgKikgKGxfdGNwLT5tY3Rfbm9ybXMpOworICAgICAgICBsX3JlcyA9IGxfdGlsZV9jb21wLT5yZXNvbHV0aW9ucyArIGxfaW1nX2NvbXAtPnJlc25vX2RlY29kZWQ7CisKKyAgICAgICAgaWYgKCFwX3RjZC0+d2hvbGVfdGlsZV9kZWNvZGluZykgeworICAgICAgICAgICAgbF93aWR0aCA9IGxfcmVzLT53aW5feDEgLSBsX3Jlcy0+d2luX3gwOworICAgICAgICAgICAgbF9oZWlnaHQgPSBsX3Jlcy0+d2luX3kxIC0gbF9yZXMtPndpbl95MDsKKyAgICAgICAgICAgIGxfc3RyaWRlID0gMDsKKyAgICAgICAgICAgIGxfY3VycmVudF9wdHIgPSBsX3RpbGVfY29tcC0+ZGF0YV93aW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsX3dpZHRoID0gKE9QSl9VSU5UMzIpKGxfcmVzLT54MSAtIGxfcmVzLT54MCk7CisgICAgICAgICAgICBsX2hlaWdodCA9IChPUEpfVUlOVDMyKShsX3Jlcy0+eTEgLSBsX3Jlcy0+eTApOworICAgICAgICAgICAgbF9zdHJpZGUgPSAoT1BKX1VJTlQzMikoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3RpbGVfY29tcC0+cmVzb2x1dGlvbnNbbF90aWxlX2NvbXAtPm1pbmltdW1fbnVtX3Jlc29sdXRpb25zIC0gMV0ueDEgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbF90aWxlX2NvbXAtPnJlc29sdXRpb25zW2xfdGlsZV9jb21wLT5taW5pbXVtX251bV9yZXNvbHV0aW9ucyAtIDFdLngwKQorICAgICAgICAgICAgICAgICAgICAgICAtIGxfd2lkdGg7CisgICAgICAgICAgICBsX2N1cnJlbnRfcHRyID0gbF90aWxlX2NvbXAtPmRhdGE7CisKKyAgICAgICAgICAgIGFzc2VydChsX2hlaWdodCA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgbF93aWR0aCArIGxfc3RyaWRlIDw9IGxfdGlsZV9jb21wLT5kYXRhX3NpemUgLyBsX2hlaWdodCk7IC8qTVVQREYqLwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCEgb3BqX3QxX2VuY29kZV9jYmxrcyhsX3QxLCBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcyAsIGxfdGNwLCBsX21jdF9ub3JtcywgbF9tY3RfbnVtY29tcHMpKSB7CisgICAgICAgIGlmIChsX2ltZ19jb21wLT5zZ25kKSB7CisgICAgICAgICAgICBsX21pbiA9IC0oMSA8PCAobF9pbWdfY29tcC0+cHJlYyAtIDEpKTsKKyAgICAgICAgICAgIGxfbWF4ID0gKDEgPDwgKGxfaW1nX2NvbXAtPnByZWMgLSAxKSkgLSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbF9taW4gPSAwOworICAgICAgICAgICAgbF9tYXggPSAoT1BKX0lOVDMyKSgoMVUgPDwgbF9pbWdfY29tcC0+cHJlYykgLSAxKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKGxfdGNjcC0+cW1mYmlkID09IDEpIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsX2hlaWdodDsgKytqKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxfd2lkdGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAvKiBUT0RPOiBkbyBhZGRpdGlvbiBvbiBpbnQ2NCA/ICovCisgICAgICAgICAgICAgICAgICAgICpsX2N1cnJlbnRfcHRyID0gb3BqX2ludF9jbGFtcCgqbF9jdXJyZW50X3B0ciArIGxfdGNjcC0+bV9kY19sZXZlbF9zaGlmdCwgbF9taW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX21heCk7CisgICAgICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X3B0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbF9jdXJyZW50X3B0ciArPSBsX3N0cmlkZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsX2hlaWdodDsgKytqKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGxfd2lkdGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBPUEpfRkxPQVQzMiBsX3ZhbHVlID0gKigoT1BKX0ZMT0FUMzIgKikgbF9jdXJyZW50X3B0cik7CisgICAgICAgICAgICAgICAgICAgIGlmIChsX3ZhbHVlID4gSU5UX01BWCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKmxfY3VycmVudF9wdHIgPSBsX21heDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsX3ZhbHVlIDwgSU5UX01JTikgeworICAgICAgICAgICAgICAgICAgICAgICAgKmxfY3VycmVudF9wdHIgPSBsX21pbjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvIGFkZGl0aW9uIG9uIGludDY0IHRvIGF2b2lkIG92ZXJmbG93cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDY0IGxfdmFsdWVfaW50ID0gKE9QSl9JTlQ2NClvcGpfbHJpbnRmKGxfdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgKmxfY3VycmVudF9wdHIgPSAoT1BKX0lOVDMyKW9wal9pbnQ2NF9jbGFtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdmFsdWVfaW50ICsgbF90Y2NwLT5tX2RjX2xldmVsX3NoaWZ0LCBsX21pbiwgbF9tYXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X3B0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbF9jdXJyZW50X3B0ciArPSBsX3N0cmlkZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworCisKKy8qKgorICogRGVhbGxvY2F0ZXMgdGhlIGVuY29kaW5nIGRhdGEgb2YgdGhlIGdpdmVuIHByZWNpbmN0LgorICovCitzdGF0aWMgdm9pZCBvcGpfdGNkX2NvZGVfYmxvY2tfZGVjX2RlYWxsb2NhdGUob3BqX3RjZF9wcmVjaW5jdF90ICogcF9wcmVjaW5jdCkKK3sKKyAgICBPUEpfVUlOVDMyIGNibGtubywgbF9uYl9jb2RlX2Jsb2NrczsKKworICAgIG9wal90Y2RfY2Jsa19kZWNfdCAqIGxfY29kZV9ibG9jayA9IHBfcHJlY2luY3QtPmNibGtzLmRlYzsKKyAgICBpZiAobF9jb2RlX2Jsb2NrKSB7CisgICAgICAgIC8qZnByaW50ZihzdGRlcnIsImRlYWxsb2NhdGUgY29kZWJsb2NrOntcbiIpOyovCisgICAgICAgIC8qZnByaW50ZihzdGRlcnIsIlx0IHgwPSVkLCB5MD0lZCwgeDE9JWQsIHkxPSVkXG4iLGxfY29kZV9ibG9jay0+eDAsIGxfY29kZV9ibG9jay0+eTAsIGxfY29kZV9ibG9jay0+eDEsIGxfY29kZV9ibG9jay0+eTEpOyovCisgICAgICAgIC8qZnByaW50ZihzdGRlcnIsIlx0IG51bWJwcz0lZCwgbnVtbGVuYml0cz0lZCwgbGVuPSVkLCBudW1uZXdwYXNzZXM9JWQsIHJlYWxfbnVtX3NlZ3M9JWQsIG1fY3VycmVudF9tYXhfc2Vncz0lZFxuICIsCisgICAgICAgICAgICAgICAgICAgICAgICBsX2NvZGVfYmxvY2stPm51bWJwcywgbF9jb2RlX2Jsb2NrLT5udW1sZW5iaXRzLCBsX2NvZGVfYmxvY2stPmxlbiwgbF9jb2RlX2Jsb2NrLT5udW1uZXdwYXNzZXMsIGxfY29kZV9ibG9jay0+cmVhbF9udW1fc2VncywgbF9jb2RlX2Jsb2NrLT5tX2N1cnJlbnRfbWF4X3NlZ3MgKTsqLworCisKKyAgICAgICAgbF9uYl9jb2RlX2Jsb2NrcyA9IHBfcHJlY2luY3QtPmJsb2NrX3NpemUgLyAoT1BKX1VJTlQzMilzaXplb2YoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RjZF9jYmxrX2RlY190KTsKKyAgICAgICAgLypmcHJpbnRmKHN0ZGVyciwibmJfY29kZV9ibG9ja3MgPSVkXHR9XG4iLCBsX25iX2NvZGVfYmxvY2tzKTsqLworCisgICAgICAgIGZvciAoY2Jsa25vID0gMDsgY2Jsa25vIDwgbF9uYl9jb2RlX2Jsb2NrczsgKytjYmxrbm8pIHsKKworICAgICAgICAgICAgaWYgKGxfY29kZV9ibG9jay0+c2VncykgeworICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY29kZV9ibG9jay0+c2Vncyk7CisgICAgICAgICAgICAgICAgbF9jb2RlX2Jsb2NrLT5zZWdzID0gMDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsX2NvZGVfYmxvY2stPmNodW5rcykgeworICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY29kZV9ibG9jay0+Y2h1bmtzKTsKKyAgICAgICAgICAgICAgICBsX2NvZGVfYmxvY2stPmNodW5rcyA9IDAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvcGpfYWxpZ25lZF9mcmVlKGxfY29kZV9ibG9jay0+ZGVjb2RlZF9kYXRhKTsKKyAgICAgICAgICAgIGxfY29kZV9ibG9jay0+ZGVjb2RlZF9kYXRhID0gTlVMTDsKKworICAgICAgICAgICAgKytsX2NvZGVfYmxvY2s7CisgICAgICAgIH0KKworICAgICAgICBvcGpfZnJlZShwX3ByZWNpbmN0LT5jYmxrcy5kZWMpOworICAgICAgICBwX3ByZWNpbmN0LT5jYmxrcy5kZWMgPSAwMDsKKyAgICB9Cit9CisKKy8qKgorICogRGVhbGxvY2F0ZXMgdGhlIGVuY29kaW5nIGRhdGEgb2YgdGhlIGdpdmVuIHByZWNpbmN0LgorICovCitzdGF0aWMgdm9pZCBvcGpfdGNkX2NvZGVfYmxvY2tfZW5jX2RlYWxsb2NhdGUob3BqX3RjZF9wcmVjaW5jdF90ICogcF9wcmVjaW5jdCkKK3sKKyAgICBPUEpfVUlOVDMyIGNibGtubywgbF9uYl9jb2RlX2Jsb2NrczsKKworICAgIG9wal90Y2RfY2Jsa19lbmNfdCAqIGxfY29kZV9ibG9jayA9IHBfcHJlY2luY3QtPmNibGtzLmVuYzsKKyAgICBpZiAobF9jb2RlX2Jsb2NrKSB7CisgICAgICAgIGxfbmJfY29kZV9ibG9ja3MgPSBwX3ByZWNpbmN0LT5ibG9ja19zaXplIC8gKE9QSl9VSU5UMzIpc2l6ZW9mKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Y2RfY2Jsa19lbmNfdCk7CisKKyAgICAgICAgZm9yIChjYmxrbm8gPSAwOyBjYmxrbm8gPCBsX25iX2NvZGVfYmxvY2tzOyArK2NibGtubykgIHsKKyAgICAgICAgICAgIGlmIChsX2NvZGVfYmxvY2stPmRhdGEpIHsKKyAgICAgICAgICAgICAgICAvKiBXZSByZWZlciB0byBkYXRhIC0gMSBzaW5jZSBiZWxvdyB3ZSBpbmNyZW1lbnRlZCBpdCAqLworICAgICAgICAgICAgICAgIC8qIGluIG9wal90Y2RfY29kZV9ibG9ja19lbmNfYWxsb2NhdGVfZGF0YSgpICovCisgICAgICAgICAgICAgICAgb3BqX2ZyZWUobF9jb2RlX2Jsb2NrLT5kYXRhIC0gMSk7CisgICAgICAgICAgICAgICAgbF9jb2RlX2Jsb2NrLT5kYXRhID0gMDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsX2NvZGVfYmxvY2stPmxheWVycykgeworICAgICAgICAgICAgICAgIG9wal9mcmVlKGxfY29kZV9ibG9jay0+bGF5ZXJzKTsKKyAgICAgICAgICAgICAgICBsX2NvZGVfYmxvY2stPmxheWVycyA9IDAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobF9jb2RlX2Jsb2NrLT5wYXNzZXMpIHsKKyAgICAgICAgICAgICAgICBvcGpfZnJlZShsX2NvZGVfYmxvY2stPnBhc3Nlcyk7CisgICAgICAgICAgICAgICAgbF9jb2RlX2Jsb2NrLT5wYXNzZXMgPSAwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrbF9jb2RlX2Jsb2NrOworICAgICAgICB9CisKKyAgICAgICAgb3BqX2ZyZWUocF9wcmVjaW5jdC0+Y2Jsa3MuZW5jKTsKKworICAgICAgICBwX3ByZWNpbmN0LT5jYmxrcy5lbmMgPSAwMDsKKyAgICB9Cit9CisKK09QSl9TSVpFX1Qgb3BqX3RjZF9nZXRfZW5jb2RlZF90aWxlX3NpemUob3BqX3RjZF90ICpwX3RjZCkKK3sKKyAgICBPUEpfVUlOVDMyIGk7CisgICAgT1BKX1NJWkVfVCBsX2RhdGFfc2l6ZSA9IDA7CisgICAgb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1nX2NvbXAgPSAwMDsKKyAgICBvcGpfdGNkX3RpbGVjb21wX3QgKiBsX3RpbGVjID0gMDA7CisgICAgT1BKX1VJTlQzMiBsX3NpemVfY29tcCwgbF9yZW1haW5pbmc7CisKKyAgICBsX3RpbGVjID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzOworICAgIGxfaW1nX2NvbXAgPSBwX3RjZC0+aW1hZ2UtPmNvbXBzOworICAgIGZvciAoaSA9IDA7IGkgPCBwX3RjZC0+aW1hZ2UtPm51bWNvbXBzOyArK2kpIHsKKyAgICAgICAgbF9zaXplX2NvbXAgPSBsX2ltZ19jb21wLT5wcmVjID4+IDM7IC8qKC8gOCkqLworICAgICAgICBsX3JlbWFpbmluZyA9IGxfaW1nX2NvbXAtPnByZWMgJiA3OyAgLyogKCU4KSAqLworCisgICAgICAgIGlmIChsX3JlbWFpbmluZykgeworICAgICAgICAgICAgKytsX3NpemVfY29tcDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsX3NpemVfY29tcCA9PSAzKSB7CisgICAgICAgICAgICBsX3NpemVfY29tcCA9IDQ7CisgICAgICAgIH0KKworICAgICAgICBsX2RhdGFfc2l6ZSArPSBsX3NpemVfY29tcCAqICgoT1BKX1NJWkVfVCkobF90aWxlYy0+eDEgLSBsX3RpbGVjLT54MCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1NJWkVfVCkobF90aWxlYy0+eTEgLSBsX3RpbGVjLT55MCkpOworICAgICAgICArK2xfaW1nX2NvbXA7CisgICAgICAgICsrbF90aWxlYzsKKyAgICB9CisKKyAgICByZXR1cm4gbF9kYXRhX3NpemU7Cit9CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX2RjX2xldmVsX3NoaWZ0X2VuY29kZShvcGpfdGNkX3QgKnBfdGNkKQoreworICAgIE9QSl9VSU5UMzIgY29tcG5vOworICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqIGxfdGlsZV9jb21wID0gMDA7CisgICAgb3BqX3RjY3BfdCAqIGxfdGNjcCA9IDAwOworICAgIG9wal9pbWFnZV9jb21wX3QgKiBsX2ltZ19jb21wID0gMDA7CisgICAgb3BqX3RjZF90aWxlX3QgKiBsX3RpbGU7CisgICAgT1BKX1NJWkVfVCBsX25iX2VsZW0sIGk7CisgICAgT1BKX0lOVDMyICogbF9jdXJyZW50X3B0cjsKKworICAgIGxfdGlsZSA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzOworICAgIGxfdGlsZV9jb21wID0gbF90aWxlLT5jb21wczsKKyAgICBsX3RjY3AgPSBwX3RjZC0+dGNwLT50Y2NwczsKKyAgICBsX2ltZ19jb21wID0gcF90Y2QtPmltYWdlLT5jb21wczsKKworICAgIGZvciAoY29tcG5vID0gMDsgY29tcG5vIDwgbF90aWxlLT5udW1jb21wczsgY29tcG5vKyspIHsKKyAgICAgICAgbF9jdXJyZW50X3B0ciA9IGxfdGlsZV9jb21wLT5kYXRhOworICAgICAgICBsX25iX2VsZW0gPSAoT1BKX1NJWkVfVCkobF90aWxlX2NvbXAtPngxIC0gbF90aWxlX2NvbXAtPngwKSAqCisgICAgICAgICAgICAgICAgICAgIChPUEpfU0laRV9UKShsX3RpbGVfY29tcC0+eTEgLSBsX3RpbGVfY29tcC0+eTApOworCisgICAgICAgIGlmIChsX3RjY3AtPnFtZmJpZCA9PSAxKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF9uYl9lbGVtOyArK2kpIHsKKyAgICAgICAgICAgICAgICAqbF9jdXJyZW50X3B0ciAtPSBsX3RjY3AtPm1fZGNfbGV2ZWxfc2hpZnQgOworICAgICAgICAgICAgICAgICsrbF9jdXJyZW50X3B0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsX25iX2VsZW07ICsraSkgeworICAgICAgICAgICAgICAgICpsX2N1cnJlbnRfcHRyID0gKCpsX2N1cnJlbnRfcHRyIC0gbF90Y2NwLT5tX2RjX2xldmVsX3NoaWZ0KSAqICgxIDw8IDExKTsKKyAgICAgICAgICAgICAgICArK2xfY3VycmVudF9wdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICArK2xfaW1nX2NvbXA7CisgICAgICAgICsrbF90Y2NwOworICAgICAgICArK2xfdGlsZV9jb21wOworICAgIH0KKworICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal90Y2RfbWN0X2VuY29kZShvcGpfdGNkX3QgKnBfdGNkKQoreworICAgIG9wal90Y2RfdGlsZV90ICogbF90aWxlID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXM7CisgICAgb3BqX3RjZF90aWxlY29tcF90ICogbF90aWxlX2NvbXAgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+Y29tcHM7CisgICAgT1BKX1NJWkVfVCBzYW1wbGVzID0gKE9QSl9TSVpFX1QpKGxfdGlsZV9jb21wLT54MSAtIGxfdGlsZV9jb21wLT54MCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfU0laRV9UKShsX3RpbGVfY29tcC0+eTEgLSBsX3RpbGVfY29tcC0+eTApOworICAgIE9QSl9VSU5UMzIgaTsKKyAgICBPUEpfQllURSAqKiBsX2RhdGEgPSAwMDsKKyAgICBvcGpfdGNwX3QgKiBsX3RjcCA9IHBfdGNkLT50Y3A7CisKKyAgICBpZiAoIXBfdGNkLT50Y3AtPm1jdCkgeworICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgfQorCisgICAgaWYgKHBfdGNkLT50Y3AtPm1jdCA9PSAyKSB7CisgICAgICAgIGlmICghIHBfdGNkLT50Y3AtPm1fbWN0X2NvZGluZ19tYXRyaXgpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICAgICAgfQorCisgICAgICAgIGxfZGF0YSA9IChPUEpfQllURSAqKikgb3BqX21hbGxvYyhsX3RpbGUtPm51bWNvbXBzICogc2l6ZW9mKE9QSl9CWVRFKikpOworICAgICAgICBpZiAoISBsX2RhdGEpIHsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF90aWxlLT5udW1jb21wczsgKytpKSB7CisgICAgICAgICAgICBsX2RhdGFbaV0gPSAoT1BKX0JZVEUqKSBsX3RpbGVfY29tcC0+ZGF0YTsKKyAgICAgICAgICAgICsrbF90aWxlX2NvbXA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoISBvcGpfbWN0X2VuY29kZV9jdXN0b20oLyogTUNUIGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgKE9QSl9CWVRFKikgcF90Y2QtPnRjcC0+bV9tY3RfY29kaW5nX21hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgLyogc2l6ZSBvZiBjb21wb25lbnRzICovCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgIC8qIGNvbXBvbmVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgbF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAvKiBuYiBvZiBjb21wb25lbnRzIChpLmUuIHNpemUgb2YgcERhdGEpICovCisgICAgICAgICAgICAgICAgICAgIGxfdGlsZS0+bnVtY29tcHMsCisgICAgICAgICAgICAgICAgICAgIC8qIHRlbGxzIGlmIHRoZSBkYXRhIGlzIHNpZ25lZCAqLworICAgICAgICAgICAgICAgICAgICBwX3RjZC0+aW1hZ2UtPmNvbXBzLT5zZ25kKSkgeworICAgICAgICAgICAgb3BqX2ZyZWUobF9kYXRhKTsKKyAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBvcGpfZnJlZShsX2RhdGEpOworICAgIH0gZWxzZSBpZiAobF90Y3AtPnRjY3BzLT5xbWZiaWQgPT0gMCkgeworICAgICAgICBvcGpfbWN0X2VuY29kZV9yZWFsKGxfdGlsZS0+Y29tcHNbMF0uZGF0YSwgbF90aWxlLT5jb21wc1sxXS5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdGlsZS0+Y29tcHNbMl0uZGF0YSwgc2FtcGxlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3BqX21jdF9lbmNvZGUobF90aWxlLT5jb21wc1swXS5kYXRhLCBsX3RpbGUtPmNvbXBzWzFdLmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIGxfdGlsZS0+Y29tcHNbMl0uZGF0YSwgc2FtcGxlcyk7CisgICAgfQorCisgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF9kd3RfZW5jb2RlKG9wal90Y2RfdCAqcF90Y2QpCit7CisgICAgb3BqX3RjZF90aWxlX3QgKiBsX3RpbGUgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlczsKKyAgICBvcGpfdGNkX3RpbGVjb21wX3QgKiBsX3RpbGVfY29tcCA9IHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5jb21wczsKKyAgICBvcGpfdGNjcF90ICogbF90Y2NwID0gcF90Y2QtPnRjcC0+dGNjcHM7CisgICAgT1BKX1VJTlQzMiBjb21wbm87CisKKyAgICBmb3IgKGNvbXBubyA9IDA7IGNvbXBubyA8IGxfdGlsZS0+bnVtY29tcHM7ICsrY29tcG5vKSB7CisgICAgICAgIGlmIChsX3RjY3AtPnFtZmJpZCA9PSAxKSB7CisgICAgICAgICAgICBpZiAoISBvcGpfZHd0X2VuY29kZShsX3RpbGVfY29tcCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGxfdGNjcC0+cW1mYmlkID09IDApIHsKKyAgICAgICAgICAgIGlmICghIG9wal9kd3RfZW5jb2RlX3JlYWwobF90aWxlX2NvbXApKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICsrbF90aWxlX2NvbXA7CisgICAgICAgICsrbF90Y2NwOworICAgIH0KKworICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworc3RhdGljIE9QSl9CT09MIG9wal90Y2RfdDFfZW5jb2RlKG9wal90Y2RfdCAqcF90Y2QpCit7CisgICAgb3BqX3QxX3QgKiBsX3QxOworICAgIGNvbnN0IE9QSl9GTE9BVDY0ICogbF9tY3Rfbm9ybXM7CisgICAgT1BKX1VJTlQzMiBsX21jdF9udW1jb21wcyA9IDBVOworICAgIG9wal90Y3BfdCAqIGxfdGNwID0gcF90Y2QtPnRjcDsKKworICAgIGxfdDEgPSBvcGpfdDFfY3JlYXRlKE9QSl9UUlVFKTsKKyAgICBpZiAobF90MSA9PSAwMCkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIGlmIChsX3RjcC0+bWN0ID09IDEpIHsKKyAgICAgICAgbF9tY3RfbnVtY29tcHMgPSAzVTsKKyAgICAgICAgLyogaXJyZXZlcnNpYmxlIGVuY29kaW5nICovCisgICAgICAgIGlmIChsX3RjcC0+dGNjcHMtPnFtZmJpZCA9PSAwKSB7CisgICAgICAgICAgICBsX21jdF9ub3JtcyA9IG9wal9tY3RfZ2V0X21jdF9ub3Jtc19yZWFsKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsX21jdF9ub3JtcyA9IG9wal9tY3RfZ2V0X21jdF9ub3JtcygpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgbF9tY3RfbnVtY29tcHMgPSBwX3RjZC0+aW1hZ2UtPm51bWNvbXBzOworICAgICAgICBsX21jdF9ub3JtcyA9IChjb25zdCBPUEpfRkxPQVQ2NCAqKShsX3RjcC0+bWN0X25vcm1zKTsKKyAgICB9CisKKyAgICBpZiAoISBvcGpfdDFfZW5jb2RlX2NibGtzKGxfdDEsIHBfdGNkLT50Y2RfaW1hZ2UtPnRpbGVzLCBsX3RjcCwgbF9tY3Rfbm9ybXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX21jdF9udW1jb21wcykpIHsKICAgICAgICAgb3BqX3QxX2Rlc3Ryb3kobF90MSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KIAotICAgICAgICBvcGpfdDFfZGVzdHJveShsX3QxKTsKKyAgICBvcGpfdDFfZGVzdHJveShsX3QxKTsKIAotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCi1zdGF0aWMgT1BKX0JPT0wgb3BqX3RjZF90Ml9lbmNvZGUgKG9wal90Y2RfdCAqcF90Y2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGVzdF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX21heF9kZXN0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfY29kZXN0cmVhbV9pbmZvX3QgKnBfY3N0cl9pbmZvICkKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX3QyX2VuY29kZShvcGpfdGNkX3QgKnBfdGNkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9kZXN0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfZGVzdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqcF9jc3RyX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpCiB7Ci0gICAgICAgIG9wal90Ml90ICogbF90MjsKKyAgICBvcGpfdDJfdCAqIGxfdDI7CiAKLSAgICAgICAgbF90MiA9IG9wal90Ml9jcmVhdGUocF90Y2QtPmltYWdlLCBwX3RjZC0+Y3ApOwotICAgICAgICBpZiAobF90MiA9PSAwMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7Ci0gICAgICAgIH0KKyAgICBsX3QyID0gb3BqX3QyX2NyZWF0ZShwX3RjZC0+aW1hZ2UsIHBfdGNkLT5jcCk7CisgICAgaWYgKGxfdDIgPT0gMDApIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgaWYgKCEgb3BqX3QyX2VuY29kZV9wYWNrZXRzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90Y2QtPnRjZF90aWxlbm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90Y2QtPnRjcC0+bnVtbGF5ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGVzdF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfZGF0YV93cml0dGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfbWF4X2Rlc3Rfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NzdHJfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3RjZC0+dHBfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfdGNkLT50cF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF90Y2QtPmN1cl9waW5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTkFMX1BBU1MpKQotICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3BqX3QyX2Rlc3Ryb3kobF90Mik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgfQotCisgICAgaWYgKCEgb3BqX3QyX2VuY29kZV9wYWNrZXRzKAorICAgICAgICAgICAgICAgIGxfdDIsCisgICAgICAgICAgICAgICAgcF90Y2QtPnRjZF90aWxlbm8sCisgICAgICAgICAgICAgICAgcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMsCisgICAgICAgICAgICAgICAgcF90Y2QtPnRjcC0+bnVtbGF5ZXJzLAorICAgICAgICAgICAgICAgIHBfZGVzdF9kYXRhLAorICAgICAgICAgICAgICAgIHBfZGF0YV93cml0dGVuLAorICAgICAgICAgICAgICAgIHBfbWF4X2Rlc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICBwX2NzdHJfaW5mbywKKyAgICAgICAgICAgICAgICBwX3RjZC0+dHBfbnVtLAorICAgICAgICAgICAgICAgIHBfdGNkLT50cF9wb3MsCisgICAgICAgICAgICAgICAgcF90Y2QtPmN1cl9waW5vLAorICAgICAgICAgICAgICAgIEZJTkFMX1BBU1MsCisgICAgICAgICAgICAgICAgcF9tYW5hZ2VyKSkgewogICAgICAgICBvcGpfdDJfZGVzdHJveShsX3QyKTsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CiAKLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS1DTEVBTi0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgb3BqX3QyX2Rlc3Ryb3kobF90Mik7CisKKyAgICAvKi0tLS0tLS0tLS0tLS0tLUNMRUFOLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgICAgcmV0dXJuIE9QSl9UUlVFOwogfQogCiAKLXN0YXRpYyBPUEpfQk9PTCBvcGpfdGNkX3JhdGVfYWxsb2NhdGVfZW5jb2RlKCAgb3BqX3RjZF90ICpwX3RjZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGVzdF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9tYXhfZGVzdF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqcF9jc3RyX2luZm8gKQorc3RhdGljIE9QSl9CT09MIG9wal90Y2RfcmF0ZV9hbGxvY2F0ZV9lbmNvZGUob3BqX3RjZF90ICpwX3RjZCwKKyAgICAgICAgT1BKX0JZVEUgKiBwX2Rlc3RfZGF0YSwKKyAgICAgICAgT1BKX1VJTlQzMiBwX21heF9kZXN0X3NpemUsCisgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZm9fdCAqcF9jc3RyX2luZm8sCisgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKQogewotICAgICAgICBvcGpfY3BfdCAqIGxfY3AgPSBwX3RjZC0+Y3A7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9uYl93cml0dGVuID0gMDsKKyAgICBvcGpfY3BfdCAqIGxfY3AgPSBwX3RjZC0+Y3A7CisgICAgT1BKX1VJTlQzMiBsX25iX3dyaXR0ZW4gPSAwOwogCi0gICAgICAgIGlmIChwX2NzdHJfaW5mbykgIHsKLSAgICAgICAgICAgICAgICBwX2NzdHJfaW5mby0+aW5kZXhfd3JpdGUgPSAwOwotICAgICAgICB9CisgICAgaWYgKHBfY3N0cl9pbmZvKSAgeworICAgICAgICBwX2NzdHJfaW5mby0+aW5kZXhfd3JpdGUgPSAwOworICAgIH0KIAotICAgICAgICBpZiAobF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX2Rpc3RvX2FsbG9jfHwgbF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX2ZpeGVkX3F1YWxpdHkpICB7Ci0gICAgICAgICAgICAgICAgLyogZml4ZWRfcXVhbGl0eSAqLwotICAgICAgICAgICAgICAgIC8qIE5vcm1hbCBSYXRlL2Rpc3RvcnRpb24gYWxsb2NhdGlvbiAqLwotICAgICAgICAgICAgICAgIGlmICghIG9wal90Y2RfcmF0ZWFsbG9jYXRlKHBfdGNkLCBwX2Rlc3RfZGF0YSwmbF9uYl93cml0dGVuLCBwX21heF9kZXN0X3NpemUsIHBfY3N0cl9pbmZvKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKLSAgICAgICAgICAgICAgICB9CisgICAgaWYgKGxfY3AtPm1fc3BlY2lmaWNfcGFyYW0ubV9lbmMubV9kaXN0b19hbGxvYyB8fAorICAgICAgICAgICAgbF9jcC0+bV9zcGVjaWZpY19wYXJhbS5tX2VuYy5tX2ZpeGVkX3F1YWxpdHkpICB7CisgICAgICAgIC8qIGZpeGVkX3F1YWxpdHkgKi8KKyAgICAgICAgLyogTm9ybWFsIFJhdGUvZGlzdG9ydGlvbiBhbGxvY2F0aW9uICovCisgICAgICAgIGlmICghIG9wal90Y2RfcmF0ZWFsbG9jYXRlKHBfdGNkLCBwX2Rlc3RfZGF0YSwgJmxfbmJfd3JpdHRlbiwgcF9tYXhfZGVzdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2NzdHJfaW5mbywgcF9tYW5hZ2VyKSkgeworICAgICAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKICAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvKiBGaXhlZCBsYXllciBhbGxvY2F0aW9uICovCi0gICAgICAgICAgICAgICAgb3BqX3RjZF9yYXRlYWxsb2NhdGVfZml4ZWQocF90Y2QpOwotICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogRml4ZWQgbGF5ZXIgYWxsb2NhdGlvbiAqLworICAgICAgICBvcGpfdGNkX3JhdGVhbGxvY2F0ZV9maXhlZChwX3RjZCk7CisgICAgfQogCi0gICAgICAgIHJldHVybiBPUEpfVFJVRTsKKyAgICByZXR1cm4gT1BKX1RSVUU7CiB9CiAKIAotT1BKX0JPT0wgb3BqX3RjZF9jb3B5X3RpbGVfZGF0YSAoICAgICAgIG9wal90Y2RfdCAqcF90Y2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICogcF9zcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgcF9zcmNfbGVuZ3RoICkKK09QSl9CT09MIG9wal90Y2RfY29weV90aWxlX2RhdGEob3BqX3RjZF90ICpwX3RjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1NJWkVfVCBwX3NyY19sZW5ndGgpCiB7Ci0gICAgICAgIE9QSl9VSU5UMzIgaSxqLGxfZGF0YV9zaXplID0gMDsKLSAgICAgICAgb3BqX2ltYWdlX2NvbXBfdCAqIGxfaW1nX2NvbXAgPSAwMDsKLSAgICAgICAgb3BqX3RjZF90aWxlY29tcF90ICogbF90aWxlYyA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGxfc2l6ZV9jb21wLCBsX3JlbWFpbmluZzsKLSAgICAgICAgT1BKX1VJTlQzMiBsX25iX2VsZW07CisgICAgT1BKX1VJTlQzMiBpOworICAgIE9QSl9TSVpFX1QgajsKKyAgICBPUEpfU0laRV9UIGxfZGF0YV9zaXplID0gMDsKKyAgICBvcGpfaW1hZ2VfY29tcF90ICogbF9pbWdfY29tcCA9IDAwOworICAgIG9wal90Y2RfdGlsZWNvbXBfdCAqIGxfdGlsZWMgPSAwMDsKKyAgICBPUEpfVUlOVDMyIGxfc2l6ZV9jb21wLCBsX3JlbWFpbmluZzsKKyAgICBPUEpfU0laRV9UIGxfbmJfZWxlbTsKIAotICAgICAgICBsX2RhdGFfc2l6ZSA9IG9wal90Y2RfZ2V0X2VuY29kZWRfdGlsZV9zaXplKHBfdGNkKTsKLSAgICAgICAgaWYgKGxfZGF0YV9zaXplICE9IHBfc3JjX2xlbmd0aCkgewotICAgICAgICAgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgbF9kYXRhX3NpemUgPSBvcGpfdGNkX2dldF9lbmNvZGVkX3RpbGVfc2l6ZShwX3RjZCk7CisgICAgaWYgKGxfZGF0YV9zaXplICE9IHBfc3JjX2xlbmd0aCkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIGxfdGlsZWMgPSBwX3RjZC0+dGNkX2ltYWdlLT50aWxlcy0+Y29tcHM7CisgICAgbF9pbWdfY29tcCA9IHBfdGNkLT5pbWFnZS0+Y29tcHM7CisgICAgZm9yIChpID0gMDsgaSA8IHBfdGNkLT5pbWFnZS0+bnVtY29tcHM7ICsraSkgeworICAgICAgICBsX3NpemVfY29tcCA9IGxfaW1nX2NvbXAtPnByZWMgPj4gMzsgLyooLyA4KSovCisgICAgICAgIGxfcmVtYWluaW5nID0gbF9pbWdfY29tcC0+cHJlYyAmIDc7ICAvKiAoJTgpICovCisgICAgICAgIGxfbmJfZWxlbSA9IChPUEpfU0laRV9UKShsX3RpbGVjLT54MSAtIGxfdGlsZWMtPngwKSAqCisgICAgICAgICAgICAgICAgICAgIChPUEpfU0laRV9UKShsX3RpbGVjLT55MSAtIGxfdGlsZWMtPnkwKTsKKworICAgICAgICBpZiAobF9yZW1haW5pbmcpIHsKKyAgICAgICAgICAgICsrbF9zaXplX2NvbXA7CiAgICAgICAgIH0KIAotICAgICAgICBsX3RpbGVjID0gcF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzOwotICAgICAgICBsX2ltZ19jb21wID0gcF90Y2QtPmltYWdlLT5jb21wczsKLSAgICAgICAgZm9yIChpPTA7aTxwX3RjZC0+aW1hZ2UtPm51bWNvbXBzOysraSkgewotICAgICAgICAgICAgICAgIGxfc2l6ZV9jb21wID0gbF9pbWdfY29tcC0+cHJlYyA+PiAzOyAvKigvIDgpKi8KLSAgICAgICAgICAgICAgICBsX3JlbWFpbmluZyA9IGxfaW1nX2NvbXAtPnByZWMgJiA3OyAgLyogKCU4KSAqLwotICAgICAgICAgICAgICAgIGxfbmJfZWxlbSA9IChPUEpfVUlOVDMyKSgobF90aWxlYy0+eDEgLSBsX3RpbGVjLT54MCkgKiAobF90aWxlYy0+eTEgLSBsX3RpbGVjLT55MCkpOwotCi0gICAgICAgICAgICAgICAgaWYgKGxfcmVtYWluaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICArK2xfc2l6ZV9jb21wOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChsX3NpemVfY29tcCA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsX3NpemVfY29tcCA9IDQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChsX3NpemVfY29tcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0NIQVIgKiBsX3NyY19wdHIgPSAoT1BKX0NIQVIgKikgcF9zcmM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogbF9kZXN0X3B0ciA9IGxfdGlsZWMtPmRhdGE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9pbWdfY29tcC0+c2duZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajxsX25iX2VsZW07KytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoobF9kZXN0X3B0cisrKSA9IChPUEpfSU5UMzIpICgqKGxfc3JjX3B0cisrKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajxsX25iX2VsZW07KytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoobF9kZXN0X3B0cisrKSA9ICgqKGxfc3JjX3B0cisrKSkmMHhmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NyYyA9IChPUEpfQllURSopIGxfc3JjX3B0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiAqIGxfZGVzdF9wdHIgPSBsX3RpbGVjLT5kYXRhOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQxNiAqIGxfc3JjX3B0ciA9IChPUEpfSU5UMTYgKikgcF9zcmM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobF9pbWdfY29tcC0+c2duZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajxsX25iX2VsZW07KytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoobF9kZXN0X3B0cisrKSA9IChPUEpfSU5UMzIpICgqKGxfc3JjX3B0cisrKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqPTA7ajxsX25iX2VsZW07KytqKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoobF9kZXN0X3B0cisrKSA9ICgqKGxfc3JjX3B0cisrKSkmMHhmZmZmOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfc3JjID0gKE9QSl9CWVRFKikgbF9zcmNfcHRyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyICogbF9zcmNfcHRyID0gKE9QSl9JTlQzMiAqKSBwX3NyYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgKiBsX2Rlc3RfcHRyID0gbF90aWxlYy0+ZGF0YTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaj0wO2o8bF9uYl9lbGVtOysraikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKE9QSl9JTlQzMikgKCoobF9zcmNfcHRyKyspKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX3NyYyA9IChPUEpfQllURSopIGxfc3JjX3B0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICArK2xfaW1nX2NvbXA7Ci0gICAgICAgICAgICAgICAgKytsX3RpbGVjOworICAgICAgICBpZiAobF9zaXplX2NvbXAgPT0gMykgeworICAgICAgICAgICAgbF9zaXplX2NvbXAgPSA0OwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgICAgICBzd2l0Y2ggKGxfc2l6ZV9jb21wKSB7CisgICAgICAgIGNhc2UgMTogeworICAgICAgICAgICAgT1BKX0NIQVIgKiBsX3NyY19wdHIgPSAoT1BKX0NIQVIgKikgcF9zcmM7CisgICAgICAgICAgICBPUEpfSU5UMzIgKiBsX2Rlc3RfcHRyID0gbF90aWxlYy0+ZGF0YTsKKworICAgICAgICAgICAgaWYgKGxfaW1nX2NvbXAtPnNnbmQpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbF9uYl9lbGVtOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKE9QSl9JTlQzMikoKihsX3NyY19wdHIrKykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxfbmJfZWxlbTsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgICoobF9kZXN0X3B0cisrKSA9ICgqKGxfc3JjX3B0cisrKSkgJiAweGZmOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcF9zcmMgPSAoT1BKX0JZVEUqKSBsX3NyY19wdHI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogeworICAgICAgICAgICAgT1BKX0lOVDMyICogbF9kZXN0X3B0ciA9IGxfdGlsZWMtPmRhdGE7CisgICAgICAgICAgICBPUEpfSU5UMTYgKiBsX3NyY19wdHIgPSAoT1BKX0lOVDE2ICopIHBfc3JjOworCisgICAgICAgICAgICBpZiAobF9pbWdfY29tcC0+c2duZCkgeworICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsX25iX2VsZW07ICsraikgeworICAgICAgICAgICAgICAgICAgICAqKGxfZGVzdF9wdHIrKykgPSAoT1BKX0lOVDMyKSgqKGxfc3JjX3B0cisrKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbF9uYl9lbGVtOyArK2opIHsKKyAgICAgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKCoobF9zcmNfcHRyKyspKSAmIDB4ZmZmZjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBfc3JjID0gKE9QSl9CWVRFKikgbF9zcmNfcHRyOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6IHsKKyAgICAgICAgICAgIE9QSl9JTlQzMiAqIGxfc3JjX3B0ciA9IChPUEpfSU5UMzIgKikgcF9zcmM7CisgICAgICAgICAgICBPUEpfSU5UMzIgKiBsX2Rlc3RfcHRyID0gbF90aWxlYy0+ZGF0YTsKKworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGxfbmJfZWxlbTsgKytqKSB7CisgICAgICAgICAgICAgICAgKihsX2Rlc3RfcHRyKyspID0gKE9QSl9JTlQzMikoKihsX3NyY19wdHIrKykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwX3NyYyA9IChPUEpfQllURSopIGxfc3JjX3B0cjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgICsrbF9pbWdfY29tcDsKKyAgICAgICAgKytsX3RpbGVjOworICAgIH0KKworICAgIHJldHVybiBPUEpfVFJVRTsKK30KKworT1BKX0JPT0wgb3BqX3RjZF9pc19iYW5kX2VtcHR5KG9wal90Y2RfYmFuZF90KiBiYW5kKQoreworICAgIHJldHVybiAoYmFuZC0+eDEgLSBiYW5kLT54MCA9PSAwKSB8fCAoYmFuZC0+eTEgLSBiYW5kLT55MCA9PSAwKTsKK30KKworT1BKX0JPT0wgb3BqX3RjZF9pc19zdWJiYW5kX2FyZWFfb2ZfaW50ZXJlc3Qob3BqX3RjZF90ICp0Y2QsCisgICAgICAgIE9QSl9VSU5UMzIgY29tcG5vLAorICAgICAgICBPUEpfVUlOVDMyIHJlc25vLAorICAgICAgICBPUEpfVUlOVDMyIGJhbmRubywKKyAgICAgICAgT1BKX1VJTlQzMiBiYW5kX3gwLAorICAgICAgICBPUEpfVUlOVDMyIGJhbmRfeTAsCisgICAgICAgIE9QSl9VSU5UMzIgYmFuZF94MSwKKyAgICAgICAgT1BKX1VJTlQzMiBiYW5kX3kxKQoreworICAgIC8qIE5vdGU6IHRob3NlIHZhbHVlcyBmb3IgZmlsdGVyX21hcmdpbiBhcmUgaW4gcGFydCB0aGUgcmVzdWx0IG9mICovCisgICAgLyogZXhwZXJpbWVudGF0aW9uLiBUaGUgdmFsdWUgMiBmb3IgUU1GQklEPTEgKDV4MyBmaWx0ZXIpIGNhbiBiZSBsaW5rZWQgKi8KKyAgICAvKiB0byB0aGUgbWF4aW11bSBsZWZ0L3JpZ2h0IGV4dGVuc2lvbiBnaXZlbiBpbiB0YWJsZXMgRi4yIGFuZCBGLjMgb2YgdGhlICovCisgICAgLyogc3RhbmRhcmQuIFRoZSB2YWx1ZSAzIGZvciBRTUZCSUQ9MCAoOXg3IGZpbHRlcikgaXMgbW9yZSBzdXNwaWNpb3VzLCAqLworICAgIC8qIHNpbmNlIEYuMiBhbmQgRi4zIHdvdWxkIGxlYWQgdG8gNCBpbnN0ZWFkLCBzbyB0aGUgY3VycmVudCAzIG1pZ2h0IGJlICovCisgICAgLyogbmVlZGVkIHRvIGJlIGJ1bXBlZCB0byA0LCBpbiBjYXNlIGluY29uc2lzdGVuY2llcyBhcmUgZm91bmQgd2hpbGUgKi8KKyAgICAvKiBkZWNvZGluZyBwYXJ0cyBvZiBpcnJldmVyc2libGUgY29kZWQgaW1hZ2VzLiAqLworICAgIC8qIFNlZSBvcGpfZHd0X2RlY29kZV9wYXJ0aWFsXzUzIGFuZCBvcGpfZHd0X2RlY29kZV9wYXJ0aWFsXzk3IGFzIHdlbGwgKi8KKyAgICBPUEpfVUlOVDMyIGZpbHRlcl9tYXJnaW4gPSAodGNkLT50Y3AtPnRjY3BzW2NvbXBub10ucW1mYmlkID09IDEpID8gMiA6IDM7CisgICAgb3BqX3RjZF90aWxlY29tcF90ICp0aWxlYyA9ICYodGNkLT50Y2RfaW1hZ2UtPnRpbGVzLT5jb21wc1tjb21wbm9dKTsKKyAgICBvcGpfaW1hZ2VfY29tcF90KiBpbWFnZV9jb21wID0gJih0Y2QtPmltYWdlLT5jb21wc1tjb21wbm9dKTsKKyAgICAvKiBDb21wdXRlIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIGFyZWEgb2YgaW50ZXJlc3QsIGV4cHJlc3NlZCBpbiB0aWxlIGNvb3JkaW5hdGVzICovCisgICAgLyogd2l0aCB0aGUgdGlsZSBjb29yZGluYXRlcyAqLworICAgIE9QSl9VSU5UMzIgdGN4MCA9IG9wal91aW50X21heCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9VSU5UMzIpdGlsZWMtPngwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdWludF9jZWlsZGl2KHRjZC0+d2luX3gwLCBpbWFnZV9jb21wLT5keCkpOworICAgIE9QSl9VSU5UMzIgdGN5MCA9IG9wal91aW50X21heCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9VSU5UMzIpdGlsZWMtPnkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdWludF9jZWlsZGl2KHRjZC0+d2luX3kwLCBpbWFnZV9jb21wLT5keSkpOworICAgIE9QSl9VSU5UMzIgdGN4MSA9IG9wal91aW50X21pbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9VSU5UMzIpdGlsZWMtPngxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdWludF9jZWlsZGl2KHRjZC0+d2luX3gxLCBpbWFnZV9jb21wLT5keCkpOworICAgIE9QSl9VSU5UMzIgdGN5MSA9IG9wal91aW50X21pbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9VSU5UMzIpdGlsZWMtPnkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdWludF9jZWlsZGl2KHRjZC0+d2luX3kxLCBpbWFnZV9jb21wLT5keSkpOworICAgIC8qIENvbXB1dGUgbnVtYmVyIG9mIGRlY29tcG9zaXRpb24gZm9yIHRoaXMgYmFuZC4gU2VlIHRhYmxlIEYtMSAqLworICAgIE9QSl9VSU5UMzIgbmIgPSAocmVzbm8gPT0gMCkgPworICAgICAgICAgICAgICAgICAgICB0aWxlYy0+bnVtcmVzb2x1dGlvbnMgLSAxIDoKKyAgICAgICAgICAgICAgICAgICAgdGlsZWMtPm51bXJlc29sdXRpb25zIC0gcmVzbm87CisgICAgLyogTWFwIGFib3ZlIHRpbGUtYmFzZWQgY29vcmRpbmF0ZXMgdG8gc3ViLWJhbmQtYmFzZWQgY29vcmRpbmF0ZXMgcGVyICovCisgICAgLyogZXF1YXRpb24gQi0xNSBvZiB0aGUgc3RhbmRhcmQgKi8KKyAgICBPUEpfVUlOVDMyIHgwYiA9IGJhbmRubyAmIDE7CisgICAgT1BKX1VJTlQzMiB5MGIgPSBiYW5kbm8gPj4gMTsKKyAgICBPUEpfVUlOVDMyIHRieDAgPSAobmIgPT0gMCkgPyB0Y3gwIDoKKyAgICAgICAgICAgICAgICAgICAgICAodGN4MCA8PSAoMVUgPDwgKG5iIC0gMSkpICogeDBiKSA/IDAgOgorICAgICAgICAgICAgICAgICAgICAgIG9wal91aW50X2NlaWxkaXZwb3cyKHRjeDAgLSAoMVUgPDwgKG5iIC0gMSkpICogeDBiLCBuYik7CisgICAgT1BKX1VJTlQzMiB0YnkwID0gKG5iID09IDApID8gdGN5MCA6CisgICAgICAgICAgICAgICAgICAgICAgKHRjeTAgPD0gKDFVIDw8IChuYiAtIDEpKSAqIHkwYikgPyAwIDoKKyAgICAgICAgICAgICAgICAgICAgICBvcGpfdWludF9jZWlsZGl2cG93Mih0Y3kwIC0gKDFVIDw8IChuYiAtIDEpKSAqIHkwYiwgbmIpOworICAgIE9QSl9VSU5UMzIgdGJ4MSA9IChuYiA9PSAwKSA/IHRjeDEgOgorICAgICAgICAgICAgICAgICAgICAgICh0Y3gxIDw9ICgxVSA8PCAobmIgLSAxKSkgKiB4MGIpID8gMCA6CisgICAgICAgICAgICAgICAgICAgICAgb3BqX3VpbnRfY2VpbGRpdnBvdzIodGN4MSAtICgxVSA8PCAobmIgLSAxKSkgKiB4MGIsIG5iKTsKKyAgICBPUEpfVUlOVDMyIHRieTEgPSAobmIgPT0gMCkgPyB0Y3kxIDoKKyAgICAgICAgICAgICAgICAgICAgICAodGN5MSA8PSAoMVUgPDwgKG5iIC0gMSkpICogeTBiKSA/IDAgOgorICAgICAgICAgICAgICAgICAgICAgIG9wal91aW50X2NlaWxkaXZwb3cyKHRjeTEgLSAoMVUgPDwgKG5iIC0gMSkpICogeTBiLCBuYik7CisgICAgT1BKX0JPT0wgaW50ZXJzZWN0czsKKworICAgIGlmICh0YngwIDwgZmlsdGVyX21hcmdpbikgeworICAgICAgICB0YngwID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICB0YngwIC09IGZpbHRlcl9tYXJnaW47CisgICAgfQorICAgIGlmICh0YnkwIDwgZmlsdGVyX21hcmdpbikgeworICAgICAgICB0YnkwID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICB0YnkwIC09IGZpbHRlcl9tYXJnaW47CisgICAgfQorICAgIHRieDEgPSBvcGpfdWludF9hZGRzKHRieDEsIGZpbHRlcl9tYXJnaW4pOworICAgIHRieTEgPSBvcGpfdWludF9hZGRzKHRieTEsIGZpbHRlcl9tYXJnaW4pOworCisgICAgaW50ZXJzZWN0cyA9IGJhbmRfeDAgPCB0YngxICYmIGJhbmRfeTAgPCB0YnkxICYmIGJhbmRfeDEgPiB0YngwICYmCisgICAgICAgICAgICAgICAgIGJhbmRfeTEgPiB0YnkwOworCisjaWZkZWYgREVCVUdfVkVSQk9TRQorICAgIHByaW50ZigiY29tcG5vPSV1IHJlc25vPSV1IG5iPSV1IGJhbmRubz0ldSB4MGI9JXUgeTBiPSV1IGJhbmQ9JXUsJXUsJXUsJXUgdGI9JXUsJXUsJXUsJXUgLT4gJXVcbiIsCisgICAgICAgICAgIGNvbXBubywgcmVzbm8sIG5iLCBiYW5kbm8sIHgwYiwgeTBiLAorICAgICAgICAgICBiYW5kX3gwLCBiYW5kX3kwLCBiYW5kX3gxLCBiYW5kX3kxLAorICAgICAgICAgICB0YngwLCB0YnkwLCB0YngxLCB0YnkxLCBpbnRlcnNlY3RzKTsKKyNlbmRpZgorICAgIHJldHVybiBpbnRlcnNlY3RzOworfQorCisvKiogUmV0dXJucyB3aGV0aGVyIGEgdGlsZSBjb21wb25lbmVudCBpcyBmdWxseSBkZWNvZGVkLCB0YWtpbmcgaW50byBhY2NvdW50CisgKiBwX3RjZC0+d2luXyogbWVtYmVycy4KKyAqCisgKiBAcGFyYW0gcF90Y2QgICAgVENEIGhhbmRsZS4KKyAqIEBwYXJhbSBjb21wbm8gQ29tcG9uZW50IG51bWJlcgorICogQHJldHVybiBPUEpfVFJVRSB3aGV0aGVyIHRoZSB0aWxlIGNvbXBvbmVuZW50IGlzIGZ1bGx5IGRlY29kZWQKKyAqLworc3RhdGljIE9QSl9CT09MIG9wal90Y2RfaXNfd2hvbGVfdGlsZWNvbXBfZGVjb2Rpbmcob3BqX3RjZF90ICpwX3RjZCwKKyAgICAgICAgT1BKX1VJTlQzMiBjb21wbm8pCit7CisgICAgb3BqX3RjZF90aWxlY29tcF90KiB0aWxlYyA9ICYocF90Y2QtPnRjZF9pbWFnZS0+dGlsZXMtPmNvbXBzW2NvbXBub10pOworICAgIG9wal9pbWFnZV9jb21wX3QqIGltYWdlX2NvbXAgPSAmKHBfdGNkLT5pbWFnZS0+Y29tcHNbY29tcG5vXSk7CisgICAgLyogQ29tcHV0ZSB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBhcmVhIG9mIGludGVyZXN0LCBleHByZXNzZWQgaW4gdGlsZSBjb29yZGluYXRlcyAqLworICAgIC8qIHdpdGggdGhlIHRpbGUgY29vcmRpbmF0ZXMgKi8KKyAgICBPUEpfVUlOVDMyIHRjeDAgPSBvcGpfdWludF9tYXgoCisgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfVUlOVDMyKXRpbGVjLT54MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3VpbnRfY2VpbGRpdihwX3RjZC0+d2luX3gwLCBpbWFnZV9jb21wLT5keCkpOworICAgIE9QSl9VSU5UMzIgdGN5MCA9IG9wal91aW50X21heCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKE9QSl9VSU5UMzIpdGlsZWMtPnkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfdWludF9jZWlsZGl2KHBfdGNkLT53aW5feTAsIGltYWdlX2NvbXAtPmR5KSk7CisgICAgT1BKX1VJTlQzMiB0Y3gxID0gb3BqX3VpbnRfbWluKAorICAgICAgICAgICAgICAgICAgICAgICAgICAoT1BKX1VJTlQzMil0aWxlYy0+eDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal91aW50X2NlaWxkaXYocF90Y2QtPndpbl94MSwgaW1hZ2VfY29tcC0+ZHgpKTsKKyAgICBPUEpfVUlOVDMyIHRjeTEgPSBvcGpfdWludF9taW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgIChPUEpfVUlOVDMyKXRpbGVjLT55MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3VpbnRfY2VpbGRpdihwX3RjZC0+d2luX3kxLCBpbWFnZV9jb21wLT5keSkpOworCisgICAgT1BKX1VJTlQzMiBzaGlmdCA9IHRpbGVjLT5udW1yZXNvbHV0aW9ucyAtIHRpbGVjLT5taW5pbXVtX251bV9yZXNvbHV0aW9uczsKKyAgICAvKiBUb2xlcmF0ZSBzbWFsbCBtYXJnaW4gd2l0aGluIHRoZSByZWR1Y2VkIHJlc29sdXRpb24gZmFjdG9yIHRvIGNvbnNpZGVyIGlmICovCisgICAgLyogdGhlIHdob2xlIHRpbGUgcGF0aCBtdXN0IGJlIHRha2VuICovCisgICAgcmV0dXJuICh0Y3gwID49IChPUEpfVUlOVDMyKXRpbGVjLT54MCAmJgorICAgICAgICAgICAgdGN5MCA+PSAoT1BKX1VJTlQzMil0aWxlYy0+eTAgJiYKKyAgICAgICAgICAgIHRjeDEgPD0gKE9QSl9VSU5UMzIpdGlsZWMtPngxICYmCisgICAgICAgICAgICB0Y3kxIDw9IChPUEpfVUlOVDMyKXRpbGVjLT55MSAmJgorICAgICAgICAgICAgKHNoaWZ0ID49IDMyIHx8CisgICAgICAgICAgICAgKCgodGN4MCAtIChPUEpfVUlOVDMyKXRpbGVjLT54MCkgPj4gc2hpZnQpID09IDAgJiYKKyAgICAgICAgICAgICAgKCh0Y3kwIC0gKE9QSl9VSU5UMzIpdGlsZWMtPnkwKSA+PiBzaGlmdCkgPT0gMCAmJgorICAgICAgICAgICAgICAoKChPUEpfVUlOVDMyKXRpbGVjLT54MSAtIHRjeDEpID4+IHNoaWZ0KSA9PSAwICYmCisgICAgICAgICAgICAgICgoKE9QSl9VSU5UMzIpdGlsZWMtPnkxIC0gdGN5MSkgPj4gc2hpZnQpID09IDApKSk7CiB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3RjZC5oIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Y2QuaAppbmRleCAwN2Y4Mzc5Li5lMzIxNGMxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3RjZC5oCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGNkLmgKQEAgLTEsNiArMSw2IEBACiAvKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCiAgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCiAgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCiAgKgpAQCAtOCwxMSArOCwxMiBAQAogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQogICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMsIERhdmlkIEphbnNzZW5zCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgWWFubmljayBWZXJzY2h1ZXJlbgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4IAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQogICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZSIAorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGUgogICogQ29weXJpZ2h0IChjKSAyMDEyLCBDUyBTeXN0ZW1lcyBkJ0luZm9ybWF0aW9uLCBGcmFuY2UKKyAqIENvcHlyaWdodCAoYykgMjAxNywgSW50b1BJWCBTQSA8c3VwcG9ydEBpbnRvcGl4LmNvbT4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CkBAIC0zNiw4ICszNyw4IEBACiAgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQogICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KLSNpZm5kZWYgX19UQ0RfSAotI2RlZmluZSBfX1RDRF9ICisjaWZuZGVmIE9QSl9UQ0RfSAorI2RlZmluZSBPUEpfVENEX0gKIC8qKgogQGZpbGUgdGNkLmgKIEBicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBhIHRpbGUgY29kZXIvZGVjb2RlciAoVENEKQpAQCAtNDksMTI0ICs1MCwxNzUgQEAKIC8qKiBAZGVmZ3JvdXAgVENEIFRDRCAtIEltcGxlbWVudGF0aW9uIG9mIGEgdGlsZSBjb2Rlci9kZWNvZGVyICovCiAvKkB7Ki8KIAotLyoqCi1GSVhNRSBET0MKLSovCi10eXBlZGVmIHN0cnVjdCBvcGpfdGNkX3NlZyB7Ci0JT1BKX0JZVEUgKiogZGF0YTsKLQlPUEpfVUlOVDMyIGRhdGFpbmRleDsKLQlPUEpfVUlOVDMyIG51bXBhc3NlczsKLQlPUEpfVUlOVDMyIHJlYWxfbnVtX3Bhc3NlczsKLQlPUEpfVUlOVDMyIGxlbjsKLQlPUEpfVUlOVDMyIG1heHBhc3NlczsKLQlPUEpfVUlOVDMyIG51bW5ld3Bhc3NlczsKLQlPUEpfVUlOVDMyIG5ld2xlbjsKLX0gb3BqX3RjZF9zZWdfdDsKIAogLyoqCiBGSVhNRSBET0MKICovCiB0eXBlZGVmIHN0cnVjdCBvcGpfdGNkX3Bhc3MgewotCU9QSl9VSU5UMzIgcmF0ZTsKLQlPUEpfRkxPQVQ2NCBkaXN0b3J0aW9uZGVjOwotCU9QSl9VSU5UMzIgbGVuOwotCU9QSl9VSU5UMzIgdGVybSA6IDE7CisgICAgT1BKX1VJTlQzMiByYXRlOworICAgIE9QSl9GTE9BVDY0IGRpc3RvcnRpb25kZWM7CisgICAgT1BKX1VJTlQzMiBsZW47CisgICAgT1BKX0JJVEZJRUxEIHRlcm0gOiAxOwogfSBvcGpfdGNkX3Bhc3NfdDsKIAogLyoqCiBGSVhNRSBET0MKICovCiB0eXBlZGVmIHN0cnVjdCBvcGpfdGNkX2xheWVyIHsKLQlPUEpfVUlOVDMyIG51bXBhc3NlczsJCS8qIE51bWJlciBvZiBwYXNzZXMgaW4gdGhlIGxheWVyICovCi0JT1BKX1VJTlQzMiBsZW47CQkJCS8qIGxlbiBvZiBpbmZvcm1hdGlvbiAqLwotCU9QSl9GTE9BVDY0IGRpc3RvOwkJCS8qIGFkZCBmb3IgaW5kZXggKENmci4gTWFyY2VsYSkgKi8KLQlPUEpfQllURSAqZGF0YTsJCQkJLyogZGF0YSAqLworICAgIE9QSl9VSU5UMzIgbnVtcGFzc2VzOyAgICAgICAvKiBOdW1iZXIgb2YgcGFzc2VzIGluIHRoZSBsYXllciAqLworICAgIE9QSl9VSU5UMzIgbGVuOyAgICAgICAgICAgICAvKiBsZW4gb2YgaW5mb3JtYXRpb24gKi8KKyAgICBPUEpfRkxPQVQ2NCBkaXN0bzsgICAgICAgICAgLyogYWRkIGZvciBpbmRleCAoQ2ZyLiBNYXJjZWxhKSAqLworICAgIE9QSl9CWVRFICpkYXRhOyAgICAgICAgICAgICAvKiBkYXRhICovCiB9IG9wal90Y2RfbGF5ZXJfdDsKIAogLyoqCiBGSVhNRSBET0MKICovCiB0eXBlZGVmIHN0cnVjdCBvcGpfdGNkX2NibGtfZW5jIHsKLQlPUEpfQllURSogZGF0YTsgICAgICAgICAgICAgICAvKiBEYXRhICovCi0Jb3BqX3RjZF9sYXllcl90KiBsYXllcnM7ICAgICAgLyogbGF5ZXIgaW5mb3JtYXRpb24gKi8KLQlvcGpfdGNkX3Bhc3NfdCogcGFzc2VzOyAgICAgICAvKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFzc2VzICovCi0JT1BKX0lOVDMyIHgwLCB5MCwgeDEsIHkxOyAgICAgLyogZGltZW5zaW9uIG9mIHRoZSBjb2RlLWJsb2NrcyA6IGxlZnQgdXBwZXIgY29ybmVyICh4MCwgeTApIHJpZ2h0IGxvdyBjb3JuZXIgKHgxLHkxKSAqLwotCU9QSl9VSU5UMzIgbnVtYnBzOwotCU9QSl9VSU5UMzIgbnVtbGVuYml0czsKLQlPUEpfVUlOVDMyIGRhdGFfc2l6ZTsgICAgICAgICAvKiBTaXplIG9mIGFsbG9jYXRlZCBkYXRhIGJ1ZmZlciAqLwotCU9QSl9VSU5UMzIgbnVtcGFzc2VzOyAgICAgICAgIC8qIG51bWJlciBvZiBwYXNzIGFscmVhZHkgZG9uZSBmb3IgdGhlIGNvZGUtYmxvY2tzICovCi0JT1BKX1VJTlQzMiBudW1wYXNzZXNpbmxheWVyczsgLyogbnVtYmVyIG9mIHBhc3NlcyBpbiB0aGUgbGF5ZXIgKi8KLQlPUEpfVUlOVDMyIHRvdGFscGFzc2VzOwkgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgcGFzc2VzICovCisgICAgT1BKX0JZVEUqIGRhdGE7ICAgICAgICAgICAgICAgLyogRGF0YSAqLworICAgIG9wal90Y2RfbGF5ZXJfdCogbGF5ZXJzOyAgICAgIC8qIGxheWVyIGluZm9ybWF0aW9uICovCisgICAgb3BqX3RjZF9wYXNzX3QqIHBhc3NlczsgICAgICAgLyogaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhc3NlcyAqLworICAgIE9QSl9JTlQzMiB4MCwgeTAsIHgxLAorICAgICAgICAgICAgICB5MTsgICAgIC8qIGRpbWVuc2lvbiBvZiB0aGUgY29kZS1ibG9ja3MgOiBsZWZ0IHVwcGVyIGNvcm5lciAoeDAsIHkwKSByaWdodCBsb3cgY29ybmVyICh4MSx5MSkgKi8KKyAgICBPUEpfVUlOVDMyIG51bWJwczsKKyAgICBPUEpfVUlOVDMyIG51bWxlbmJpdHM7CisgICAgT1BKX1VJTlQzMiBkYXRhX3NpemU7ICAgICAgICAgLyogU2l6ZSBvZiBhbGxvY2F0ZWQgZGF0YSBidWZmZXIgKi8KKyAgICBPUEpfVUlOVDMyCisgICAgbnVtcGFzc2VzOyAgICAgICAgIC8qIG51bWJlciBvZiBwYXNzIGFscmVhZHkgZG9uZSBmb3IgdGhlIGNvZGUtYmxvY2tzICovCisgICAgT1BKX1VJTlQzMiBudW1wYXNzZXNpbmxheWVyczsgLyogbnVtYmVyIG9mIHBhc3NlcyBpbiB0aGUgbGF5ZXIgKi8KKyAgICBPUEpfVUlOVDMyIHRvdGFscGFzc2VzOyAgICAgICAvKiB0b3RhbCBudW1iZXIgb2YgcGFzc2VzICovCiB9IG9wal90Y2RfY2Jsa19lbmNfdDsKIAogCisvKiogQ2h1bmsgb2YgY29kZXN0cmVhbSBkYXRhIHRoYXQgaXMgcGFydCBvZiBhIGNvZGUgYmxvY2sgKi8KK3R5cGVkZWYgc3RydWN0IG9wal90Y2Rfc2VnX2RhdGFfY2h1bmsgeworICAgIC8qIFBvaW50IHRvIHRpbGVwYXJ0IGJ1ZmZlci4gV2UgZG9uJ3QgbWFrZSBhIGNvcHkgIQorICAgICAgIFNvIHRoZSB0aWxlcGFydCBidWZmZXIgbXVzdCBiZSBrZXB0IGFsaXZlCisgICAgICAgYXMgbG9uZyBhcyB3ZSBuZWVkIHRvIGRlY29kZSB0aGUgY29kZWJsb2NrcyAqLworICAgIE9QSl9CWVRFICogZGF0YTsKKyAgICBPUEpfVUlOVDMyIGxlbjsgICAgICAgICAgICAgICAgIC8qIFVzYWJsZSBsZW5ndGggb2YgZGF0YSAqLworfSBvcGpfdGNkX3NlZ19kYXRhX2NodW5rX3Q7CisKKy8qKiBTZWdtZW50IG9mIGEgY29kZS1ibG9jay4KKyAqIEEgc2VnbWVudCByZXByZXNlbnQgYSBudW1iZXIgb2YgY29uc2VjdXRpdmUgY29kaW5nIHBhc3Nlcywgd2l0aG91dCB0ZXJtaW5hdGlvbgorICogb2YgTVFDIG9yIFJBVyBiZXR3ZWVuIHRoZW0uICovCit0eXBlZGVmIHN0cnVjdCBvcGpfdGNkX3NlZyB7CisgICAgT1BKX1VJTlQzMiBsZW47ICAgICAgLyogU2l6ZSBvZiBkYXRhIHJlbGF0ZWQgdG8gdGhpcyBzZWdtZW50ICovCisgICAgLyogTnVtYmVyIG9mIHBhc3NlcyBkZWNvZGVkLiBJbmNsdWRpbmcgdGhvc2UgdGhhdCB3ZSBza2lwICovCisgICAgT1BKX1VJTlQzMiBudW1wYXNzZXM7CisgICAgLyogTnVtYmVyIG9mIHBhc3NlcyBhY3R1YWxseSB0byBiZSBkZWNvZGVkLiBUbyBiZSB1c2VkIGZvciBjb2RlLWJsb2NrIGRlY29kaW5nICovCisgICAgT1BKX1VJTlQzMiByZWFsX251bV9wYXNzZXM7CisgICAgLyogTWF4aW11bSBudW1iZXIgb2YgcGFzc2VzIGZvciB0aGlzIHNlZ21lbnQgKi8KKyAgICBPUEpfVUlOVDMyIG1heHBhc3NlczsKKyAgICAvKiBOdW1iZXIgb2YgbmV3IHBhc3NlcyBmb3IgY3VycmVudCBwYWNrZWQuIFRyYW5zaXRvcnkgdmFsdWUgKi8KKyAgICBPUEpfVUlOVDMyIG51bW5ld3Bhc3NlczsKKyAgICAvKiBDb2Rlc3RyZWFtIGxlbmd0aCBmb3IgdGhpcyBzZWdtZW50IGZvciBjdXJyZW50IHBhY2tlZC4gVHJhbnNpdG9yeSB2YWx1ZSAqLworICAgIE9QSl9VSU5UMzIgbmV3bGVuOworfSBvcGpfdGNkX3NlZ190OworCisvKiogQ29kZS1ibG9jayBmb3IgZGVjb2RpbmcgKi8KIHR5cGVkZWYgc3RydWN0IG9wal90Y2RfY2Jsa19kZWMgewotCU9QSl9CWVRFICogZGF0YTsJCQkJLyogRGF0YSAqLwotCW9wal90Y2Rfc2VnX3QqIHNlZ3M7CQkJLyogc2VnbWVudHMgaW5mb3JtYXRpb24gKi8KLQlPUEpfSU5UMzIgeDAsIHkwLCB4MSwgeTE7CQkvKiBwb3NpdGlvbiBvZiB0aGUgY29kZS1ibG9ja3MgOiBsZWZ0IHVwcGVyIGNvcm5lciAoeDAsIHkwKSByaWdodCBsb3cgY29ybmVyICh4MSx5MSkgKi8KLQlPUEpfVUlOVDMyIG51bWJwczsKLQlPUEpfVUlOVDMyIG51bWxlbmJpdHM7Ci0JT1BKX1VJTlQzMiBkYXRhX21heF9zaXplOwkJLyogU2l6ZSBvZiBhbGxvY2F0ZWQgZGF0YSBidWZmZXIgKi8KLQlPUEpfVUlOVDMyIGRhdGFfY3VycmVudF9zaXplOwkvKiBTaXplIG9mIHVzZWQgZGF0YSBidWZmZXIgKi8KLQlPUEpfVUlOVDMyIG51bW5ld3Bhc3NlczsJCS8qIG51bWJlciBvZiBwYXNzIGFkZGVkIHRvIHRoZSBjb2RlLWJsb2NrcyAqLwotCU9QSl9VSU5UMzIgbnVtc2VnczsJCQkJLyogbnVtYmVyIG9mIHNlZ21lbnRzICovCi0JT1BKX1VJTlQzMiByZWFsX251bV9zZWdzOwotCU9QSl9VSU5UMzIgbV9jdXJyZW50X21heF9zZWdzOworICAgIG9wal90Y2Rfc2VnX3QqIHNlZ3M7ICAgICAgICAgICAgLyogc2VnbWVudHMgaW5mb3JtYXRpb24gKi8KKyAgICBvcGpfdGNkX3NlZ19kYXRhX2NodW5rX3QqIGNodW5rczsgLyogQXJyYXkgb2YgY2h1bmtzICovCisgICAgLyogcG9zaXRpb24gb2YgdGhlIGNvZGUtYmxvY2tzIDogbGVmdCB1cHBlciBjb3JuZXIgKHgwLCB5MCkgcmlnaHQgbG93IGNvcm5lciAoeDEseTEpICovCisgICAgT1BKX0lOVDMyIHgwLCB5MCwgeDEsIHkxOworICAgIE9QSl9VSU5UMzIgbnVtYnBzOworICAgIC8qIG51bWJlciBvZiBiaXRzIGZvciBsZW4sIGZvciB0aGUgY3VycmVudCBwYWNrZXQuIFRyYW5zaXRvcnkgdmFsdWUgKi8KKyAgICBPUEpfVUlOVDMyIG51bWxlbmJpdHM7CisgICAgLyogbnVtYmVyIG9mIHBhc3MgYWRkZWQgdG8gdGhlIGNvZGUtYmxvY2tzLCBmb3IgdGhlIGN1cnJlbnQgcGFja2V0LiBUcmFuc2l0b3J5IHZhbHVlICovCisgICAgT1BKX1VJTlQzMiBudW1uZXdwYXNzZXM7CisgICAgLyogbnVtYmVyIG9mIHNlZ21lbnRzLCBpbmNsdWRpbmcgdGhvc2Ugb2YgcGFja2V0IHdlIHNraXAgKi8KKyAgICBPUEpfVUlOVDMyIG51bXNlZ3M7CisgICAgLyogbnVtYmVyIG9mIHNlZ21lbnRzLCB0byBiZSB1c2VkIGZvciBjb2RlIGJsb2NrIGRlY29kaW5nICovCisgICAgT1BKX1VJTlQzMiByZWFsX251bV9zZWdzOworICAgIE9QSl9VSU5UMzIgbV9jdXJyZW50X21heF9zZWdzOyAgLyogYWxsb2NhdGVkIG51bWJlciBvZiBzZWdzW10gaXRlbXMgKi8KKyAgICBPUEpfVUlOVDMyIG51bWNodW5rczsgICAgICAgICAgIC8qIE51bWJlciBvZiB2YWxpZCBjaHVua3MgaXRlbXMgKi8KKyAgICBPUEpfVUlOVDMyIG51bWNodW5rc2FsbG9jOyAgICAgIC8qIE51bWJlciBvZiBjaHVua3MgaXRlbSBhbGxvY2F0ZWQgKi8KKyAgICAvKiBEZWNvZGVkIGNvZGUtYmxvY2suIE9ubHkgdXNlZCBmb3Igc3VidGlsZSBkZWNvZGluZy4gT3RoZXJ3aXNlIHRpbGVjLT5kYXRhIGlzIGRpcmVjdGx5IHVwZGF0ZWQgKi8KKyAgICBPUEpfSU5UMzIqIGRlY29kZWRfZGF0YTsKIH0gb3BqX3RjZF9jYmxrX2RlY190OwogCi0vKioKLUZJWE1FIERPQwotKi8KKy8qKiBQcmVjaW5jdCBzdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0IG9wal90Y2RfcHJlY2luY3QgewotCU9QSl9JTlQzMiB4MCwgeTAsIHgxLCB5MTsJCS8qIGRpbWVuc2lvbiBvZiB0aGUgcHJlY2luY3QgOiBsZWZ0IHVwcGVyIGNvcm5lciAoeDAsIHkwKSByaWdodCBsb3cgY29ybmVyICh4MSx5MSkgKi8KLQlPUEpfVUlOVDMyIGN3LCBjaDsJCQkJLyogbnVtYmVyIG9mIHByZWNpbmN0IGluIHdpZHRoIGFuZCBoZWlnaHQgKi8KLQl1bmlvbnsJCQkJCQkJLyogY29kZS1ibG9ja3MgaW5mb3JtYXRpb24gKi8KLQkJb3BqX3RjZF9jYmxrX2VuY190KiBlbmM7Ci0JCW9wal90Y2RfY2Jsa19kZWNfdCogZGVjOwotCQl2b2lkKiAgICAgICAgICAgICAgIGJsb2NrczsKLQl9IGNibGtzOwotCU9QSl9VSU5UMzIgYmxvY2tfc2l6ZTsJCQkvKiBzaXplIHRha2VuIGJ5IGNibGtzIChpbiBieXRlcykgKi8KLQlvcGpfdGd0X3RyZWVfdCAqaW5jbHRyZWU7CSAgICAvKiBpbmNsdXNpb24gdHJlZSAqLwotCW9wal90Z3RfdHJlZV90ICppbXNidHJlZTsJICAgIC8qIElNU0IgdHJlZSAqLworICAgIC8qIGRpbWVuc2lvbiBvZiB0aGUgcHJlY2luY3QgOiBsZWZ0IHVwcGVyIGNvcm5lciAoeDAsIHkwKSByaWdodCBsb3cgY29ybmVyICh4MSx5MSkgKi8KKyAgICBPUEpfSU5UMzIgeDAsIHkwLCB4MSwgeTE7CisgICAgT1BKX1VJTlQzMiBjdywgY2g7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZS1ibG9ja3MsIGluIHdpZHRoIGFuZCBoZWlnaHQgKi8KKyAgICB1bmlvbiB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUtYmxvY2tzIGluZm9ybWF0aW9uICovCisgICAgICAgIG9wal90Y2RfY2Jsa19lbmNfdCogZW5jOworICAgICAgICBvcGpfdGNkX2NibGtfZGVjX3QqIGRlYzsKKyAgICAgICAgdm9pZCogICAgICAgICAgICAgICBibG9ja3M7CisgICAgfSBjYmxrczsKKyAgICBPUEpfVUlOVDMyIGJsb2NrX3NpemU7ICAgICAgICAgIC8qIHNpemUgdGFrZW4gYnkgY2Jsa3MgKGluIGJ5dGVzKSAqLworICAgIG9wal90Z3RfdHJlZV90ICppbmNsdHJlZTsgICAgICAgLyogaW5jbHVzaW9uIHRyZWUgKi8KKyAgICBvcGpfdGd0X3RyZWVfdCAqaW1zYnRyZWU7ICAgICAgIC8qIElNU0IgdHJlZSAqLwogfSBvcGpfdGNkX3ByZWNpbmN0X3Q7CiAKLS8qKgotRklYTUUgRE9DCi0qLworLyoqIFN1Yi1iYW5kIHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3Qgb3BqX3RjZF9iYW5kIHsKLQlPUEpfSU5UMzIgeDAsIHkwLCB4MSwgeTE7CQkvKiBkaW1lbnNpb24gb2YgdGhlIHN1YmJhbmQgOiBsZWZ0IHVwcGVyIGNvcm5lciAoeDAsIHkwKSByaWdodCBsb3cgY29ybmVyICh4MSx5MSkgKi8KLQlPUEpfVUlOVDMyIGJhbmRubzsKLQlvcGpfdGNkX3ByZWNpbmN0X3QgKnByZWNpbmN0czsJLyogcHJlY2luY3QgaW5mb3JtYXRpb24gKi8KLQlPUEpfVUlOVDMyIHByZWNpbmN0c19kYXRhX3NpemU7CS8qIHNpemUgb2YgZGF0YSB0YWtlbiBieSBwcmVjaW5jdHMgKi8KLQlPUEpfSU5UMzIgbnVtYnBzOwotCU9QSl9GTE9BVDMyIHN0ZXBzaXplOworICAgIC8qIGRpbWVuc2lvbiBvZiB0aGUgc3ViYmFuZCA6IGxlZnQgdXBwZXIgY29ybmVyICh4MCwgeTApIHJpZ2h0IGxvdyBjb3JuZXIgKHgxLHkxKSAqLworICAgIE9QSl9JTlQzMiB4MCwgeTAsIHgxLCB5MTsKKyAgICAvKiBiYW5kIG51bWJlcjogZm9yIGxvd2VzdCByZXNvbHV0aW9uIGxldmVsICgwPUxMKSwgb3RoZXJ3aXNlICgxPUhMLCAyPUxILCAzPUhIKSAqLworICAgIE9QSl9VSU5UMzIgYmFuZG5vOworICAgIC8qIHByZWNpbmN0IGluZm9ybWF0aW9uICovCisgICAgb3BqX3RjZF9wcmVjaW5jdF90ICpwcmVjaW5jdHM7CisgICAgLyogc2l6ZSBvZiBkYXRhIHRha2VuIGJ5IHByZWNpbmN0cyAqLworICAgIE9QSl9VSU5UMzIgcHJlY2luY3RzX2RhdGFfc2l6ZTsKKyAgICBPUEpfSU5UMzIgbnVtYnBzOworICAgIE9QSl9GTE9BVDMyIHN0ZXBzaXplOwogfSBvcGpfdGNkX2JhbmRfdDsKIAotLyoqCi1GSVhNRSBET0MKLSovCisvKiogVGlsZS1jb21wb25lbnQgcmVzb2x1dGlvbiBzdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0IG9wal90Y2RfcmVzb2x1dGlvbiB7Ci0JT1BKX0lOVDMyIHgwLCB5MCwgeDEsIHkxOwkJLyogZGltZW5zaW9uIG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIDogbGVmdCB1cHBlciBjb3JuZXIgKHgwLCB5MCkgcmlnaHQgbG93IGNvcm5lciAoeDEseTEpICovCi0JT1BKX1VJTlQzMiBwdywgcGg7Ci0JT1BKX1VJTlQzMiBudW1iYW5kczsJCQkvKiBudW1iZXIgc3ViLWJhbmQgZm9yIHRoZSByZXNvbHV0aW9uIGxldmVsICovCi0Jb3BqX3RjZF9iYW5kX3QgYmFuZHNbM107CQkvKiBzdWJiYW5kIGluZm9ybWF0aW9uICovCisgICAgLyogZGltZW5zaW9uIG9mIHRoZSByZXNvbHV0aW9uIGxldmVsIDogbGVmdCB1cHBlciBjb3JuZXIgKHgwLCB5MCkgcmlnaHQgbG93IGNvcm5lciAoeDEseTEpICovCisgICAgT1BKX0lOVDMyIHgwLCB5MCwgeDEsIHkxOworICAgIC8qIG51bWJlciBvZiBwcmVjaW5jdHMsIGluIHdpZHRoIGFuZCBoZWlnaHQsIGZvciB0aGlzIHJlc29sdXRpb24gbGV2ZWwgKi8KKyAgICBPUEpfVUlOVDMyIHB3LCBwaDsKKyAgICAvKiBudW1iZXIgb2Ygc3ViLWJhbmRzIGZvciB0aGUgcmVzb2x1dGlvbiBsZXZlbCAoMSBmb3IgbG93ZXN0IHJlc29sdXRpb24gbGV2ZWwsIDMgb3RoZXJ3aXNlKSAqLworICAgIE9QSl9VSU5UMzIgbnVtYmFuZHM7CisgICAgLyogc3ViYmFuZCBpbmZvcm1hdGlvbiAqLworICAgIG9wal90Y2RfYmFuZF90IGJhbmRzWzNdOworCisgICAgLyogZGltZW5zaW9uIG9mIHRoZSByZXNvbHV0aW9uIGxpbWl0ZWQgdG8gd2luZG93IG9mIGludGVyZXN0LiBPbmx5IHZhbGlkIGlmIHRjZC0+d2hvbGVfdGlsZV9kZWNvZGluZyBpcyBzZXQgKi8KKyAgICBPUEpfVUlOVDMyIHdpbl94MDsKKyAgICBPUEpfVUlOVDMyIHdpbl95MDsKKyAgICBPUEpfVUlOVDMyIHdpbl94MTsKKyAgICBPUEpfVUlOVDMyIHdpbl95MTsKIH0gb3BqX3RjZF9yZXNvbHV0aW9uX3Q7CiAKLS8qKgotRklYTUUgRE9DCi0qLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3RjZF90aWxlY29tcAotewotCU9QSl9JTlQzMiB4MCwgeTAsIHgxLCB5MTsgICAgICAgICAgIC8qIGRpbWVuc2lvbiBvZiBjb21wb25lbnQgOiBsZWZ0IHVwcGVyIGNvcm5lciAoeDAsIHkwKSByaWdodCBsb3cgY29ybmVyICh4MSx5MSkgKi8KLQlPUEpfVUlOVDMyIG51bXJlc29sdXRpb25zOyAgICAgICAgICAvKiBudW1iZXIgb2YgcmVzb2x1dGlvbnMgbGV2ZWwgKi8KLQlPUEpfVUlOVDMyIG1pbmltdW1fbnVtX3Jlc29sdXRpb25zOyAvKiBudW1iZXIgb2YgcmVzb2x1dGlvbnMgbGV2ZWwgdG8gZGVjb2RlIChhdCBtYXgpKi8KLQlvcGpfdGNkX3Jlc29sdXRpb25fdCAqcmVzb2x1dGlvbnM7ICAvKiByZXNvbHV0aW9ucyBpbmZvcm1hdGlvbiAqLwotCU9QSl9VSU5UMzIgcmVzb2x1dGlvbnNfc2l6ZTsgICAgICAgIC8qIHNpemUgb2YgZGF0YSBmb3IgcmVzb2x1dGlvbnMgKGluIGJ5dGVzKSAqLwotCU9QSl9JTlQzMiAqZGF0YTsgICAgICAgICAgICAgICAgICAgIC8qIGRhdGEgb2YgdGhlIGNvbXBvbmVudCAqLwotCU9QSl9CT09MICBvd25zRGF0YTsgICAgICAgICAgICAgICAgIC8qIGlmIHRydWUsIHRoZW4gbmVlZCB0byBmcmVlIGFmdGVyIHVzYWdlLCBvdGhlcndpc2UgZG8gbm90IGZyZWUgKi8KLQlPUEpfVUlOVDMyIGRhdGFfc2l6ZV9uZWVkZWQ7ICAgICAgICAvKiB3ZSBtYXkgZWl0aGVyIG5lZWQgdG8gYWxsb2NhdGUgdGhpcyBhbW91bnQgb2YgZGF0YSwgb3IgcmUtdXNlIGltYWdlIGRhdGEgYW5kIGlnbm9yZSB0aGlzIHZhbHVlICovCi0JT1BKX1VJTlQzMiBkYXRhX3NpemU7ICAgICAgICAgICAgICAgLyogc2l6ZSBvZiB0aGUgZGF0YSBvZiB0aGUgY29tcG9uZW50ICovCi0JT1BKX0lOVDMyIG51bXBpeDsgICAgICAgICAgICAgICAgICAgLyogYWRkIGZpeGVkX3F1YWxpdHkgKi8KKy8qKiBUaWxlLWNvbXBvbmVudCBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IG9wal90Y2RfdGlsZWNvbXAgeworICAgIC8qIGRpbWVuc2lvbiBvZiBjb21wb25lbnQgOiBsZWZ0IHVwcGVyIGNvcm5lciAoeDAsIHkwKSByaWdodCBsb3cgY29ybmVyICh4MSx5MSkgKi8KKyAgICBPUEpfSU5UMzIgeDAsIHkwLCB4MSwgeTE7CisgICAgLyogY29tcG9uZW50IG51bWJlciAqLworICAgIE9QSl9VSU5UMzIgY29tcG5vOworICAgIC8qIG51bWJlciBvZiByZXNvbHV0aW9ucyBsZXZlbCAqLworICAgIE9QSl9VSU5UMzIgbnVtcmVzb2x1dGlvbnM7CisgICAgLyogbnVtYmVyIG9mIHJlc29sdXRpb25zIGxldmVsIHRvIGRlY29kZSAoYXQgbWF4KSovCisgICAgT1BKX1VJTlQzMiBtaW5pbXVtX251bV9yZXNvbHV0aW9uczsKKyAgICAvKiByZXNvbHV0aW9ucyBpbmZvcm1hdGlvbiAqLworICAgIG9wal90Y2RfcmVzb2x1dGlvbl90ICpyZXNvbHV0aW9uczsKKyAgICAvKiBzaXplIG9mIGRhdGEgZm9yIHJlc29sdXRpb25zIChpbiBieXRlcykgKi8KKyAgICBPUEpfVUlOVDMyIHJlc29sdXRpb25zX3NpemU7CisKKyAgICAvKiBkYXRhIG9mIHRoZSBjb21wb25lbnQuIEZvciBkZWNvZGluZywgb25seSB2YWxpZCBpZiB0Y2QtPndob2xlX3RpbGVfZGVjb2RpbmcgaXMgc2V0IChzbyBleGNsdXNpdmUgb2YgZGF0YV93aW4gbWVtYmVyKSAqLworICAgIE9QSl9JTlQzMiAqZGF0YTsKKyAgICAvKiBpZiB0cnVlLCB0aGVuIG5lZWQgdG8gZnJlZSBhZnRlciB1c2FnZSwgb3RoZXJ3aXNlIGRvIG5vdCBmcmVlICovCisgICAgT1BKX0JPT0wgIG93bnNEYXRhOworICAgIC8qIHdlIG1heSBlaXRoZXIgbmVlZCB0byBhbGxvY2F0ZSB0aGlzIGFtb3VudCBvZiBkYXRhLCBvciByZS11c2UgaW1hZ2UgZGF0YSBhbmQgaWdub3JlIHRoaXMgdmFsdWUgKi8KKyAgICBzaXplX3QgZGF0YV9zaXplX25lZWRlZDsKKyAgICAvKiBzaXplIG9mIHRoZSBkYXRhIG9mIHRoZSBjb21wb25lbnQgKi8KKyAgICBzaXplX3QgZGF0YV9zaXplOworCisgICAgLyoqIGRhdGEgb2YgdGhlIGNvbXBvbmVudCBsaW1pdGVkIHRvIHdpbmRvdyBvZiBpbnRlcmVzdC4gT25seSB2YWxpZCBmb3IgZGVjb2RpbmcgYW5kIGlmIHRjZC0+d2hvbGVfdGlsZV9kZWNvZGluZyBpcyBOT1Qgc2V0IChzbyBleGNsdXNpdmUgb2YgZGF0YSBtZW1iZXIpICovCisgICAgT1BKX0lOVDMyICpkYXRhX3dpbjsKKyAgICAvKiBkaW1lbnNpb24gb2YgdGhlIGNvbXBvbmVudCBsaW1pdGVkIHRvIHdpbmRvdyBvZiBpbnRlcmVzdC4gT25seSB2YWxpZCBmb3IgZGVjb2RpbmcgYW5kICBpZiB0Y2QtPndob2xlX3RpbGVfZGVjb2RpbmcgaXMgTk9UIHNldCAqLworICAgIE9QSl9VSU5UMzIgd2luX3gwOworICAgIE9QSl9VSU5UMzIgd2luX3kwOworICAgIE9QSl9VSU5UMzIgd2luX3gxOworICAgIE9QSl9VSU5UMzIgd2luX3kxOworCisgICAgLyogYWRkIGZpeGVkX3F1YWxpdHkgKi8KKyAgICBPUEpfSU5UMzIgbnVtcGl4OwogfSBvcGpfdGNkX3RpbGVjb21wX3Q7CiAKIApAQCAtMTc0LDIxICsyMjYsMjEgQEAKIEZJWE1FIERPQwogKi8KIHR5cGVkZWYgc3RydWN0IG9wal90Y2RfdGlsZSB7Ci0JT1BKX0lOVDMyIHgwLCB5MCwgeDEsIHkxOwkJLyogZGltZW5zaW9uIG9mIHRoZSB0aWxlIDogbGVmdCB1cHBlciBjb3JuZXIgKHgwLCB5MCkgcmlnaHQgbG93IGNvcm5lciAoeDEseTEpICovCi0JT1BKX1VJTlQzMiBudW1jb21wczsJCQkvKiBudW1iZXIgb2YgY29tcG9uZW50cyBpbiB0aWxlICovCi0Jb3BqX3RjZF90aWxlY29tcF90ICpjb21wczsJLyogQ29tcG9uZW50cyBpbmZvcm1hdGlvbiAqLwotCU9QSl9JTlQzMiBudW1waXg7CQkJCS8qIGFkZCBmaXhlZF9xdWFsaXR5ICovCi0JT1BKX0ZMT0FUNjQgZGlzdG90aWxlOwkJCS8qIGFkZCBmaXhlZF9xdWFsaXR5ICovCi0JT1BKX0ZMT0FUNjQgZGlzdG9sYXllclsxMDBdOwkvKiBhZGQgZml4ZWRfcXVhbGl0eSAqLwotCU9QSl9VSU5UMzIgcGFja25vOyAgICAgICAgICAgICAgLyogcGFja2V0IG51bWJlciAqLworICAgIC8qIGRpbWVuc2lvbiBvZiB0aGUgdGlsZSA6IGxlZnQgdXBwZXIgY29ybmVyICh4MCwgeTApIHJpZ2h0IGxvdyBjb3JuZXIgKHgxLHkxKSAqLworICAgIE9QSl9JTlQzMiB4MCwgeTAsIHgxLCB5MTsKKyAgICBPUEpfVUlOVDMyIG51bWNvbXBzOyAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb21wb25lbnRzIGluIHRpbGUgKi8KKyAgICBvcGpfdGNkX3RpbGVjb21wX3QgKmNvbXBzOyAgLyogQ29tcG9uZW50cyBpbmZvcm1hdGlvbiAqLworICAgIE9QSl9JTlQzMiBudW1waXg7ICAgICAgICAgICAgICAgLyogYWRkIGZpeGVkX3F1YWxpdHkgKi8KKyAgICBPUEpfRkxPQVQ2NCBkaXN0b3RpbGU7ICAgICAgICAgIC8qIGFkZCBmaXhlZF9xdWFsaXR5ICovCisgICAgT1BKX0ZMT0FUNjQgZGlzdG9sYXllclsxMDBdOyAgICAvKiBhZGQgZml4ZWRfcXVhbGl0eSAqLworICAgIE9QSl9VSU5UMzIgcGFja25vOyAgICAgICAgICAgICAgLyogcGFja2V0IG51bWJlciAqLwogfSBvcGpfdGNkX3RpbGVfdDsKIAogLyoqCiBGSVhNRSBET0MKICovCi10eXBlZGVmIHN0cnVjdCBvcGpfdGNkX2ltYWdlCi17Ci0Jb3BqX3RjZF90aWxlX3QgKnRpbGVzOwkJLyogVGlsZXMgaW5mb3JtYXRpb24gKi8KK3R5cGVkZWYgc3RydWN0IG9wal90Y2RfaW1hZ2UgeworICAgIG9wal90Y2RfdGlsZV90ICp0aWxlczsgICAgICAvKiBUaWxlcyBpbmZvcm1hdGlvbiAqLwogfQogb3BqX3RjZF9pbWFnZV90OwogCkBAIC0xOTYsMzAgKzI0OCw0MCBAQAogLyoqCiBUaWxlIGNvZGVyL2RlY29kZXIKICovCi10eXBlZGVmIHN0cnVjdCBvcGpfdGNkCi17Ci0JLyoqIFBvc2l0aW9uIG9mIHRoZSB0aWxlcGFydCBmbGFnIGluIFByb2dyZXNzaW9uIG9yZGVyKi8KLQlPUEpfSU5UMzIgdHBfcG9zOwotCS8qKiBUaWxlIHBhcnQgbnVtYmVyKi8KLQlPUEpfVUlOVDMyIHRwX251bTsKLQkvKiogQ3VycmVudCB0aWxlIHBhcnQgbnVtYmVyKi8KLQlPUEpfVUlOVDMyIGN1cl90cF9udW07Ci0JLyoqIFRvdGFsIG51bWJlciBvZiB0aWxlcGFydHMgb2YgdGhlIGN1cnJlbnQgdGlsZSovCi0JT1BKX1VJTlQzMiBjdXJfdG90bnVtX3RwOwotCS8qKiBDdXJyZW50IFBhY2tldCBpdGVyYXRvciBudW1iZXIgKi8KLQlPUEpfVUlOVDMyIGN1cl9waW5vOwotCS8qKiBpbmZvIG9uIGVhY2ggaW1hZ2UgdGlsZSAqLwotCW9wal90Y2RfaW1hZ2VfdCAqdGNkX2ltYWdlOwotCS8qKiBpbWFnZSBoZWFkZXIgKi8KLQlvcGpfaW1hZ2VfdCAqaW1hZ2U7Ci0JLyoqIGNvZGluZyBwYXJhbWV0ZXJzICovCi0Jb3BqX2NwX3QgKmNwOwotCS8qKiBjb2RpbmcvZGVjb2RpbmcgcGFyYW1ldGVycyBjb21tb24gdG8gYWxsIHRpbGVzICovCi0Jb3BqX3RjcF90ICp0Y3A7Ci0JLyoqIGN1cnJlbnQgZW5jb2RlZC9kZWNvZGVkIHRpbGUgKi8KLQlPUEpfVUlOVDMyIHRjZF90aWxlbm87Ci0JLyoqIHRlbGwgaWYgdGhlIHRjZCBpcyBhIGRlY29kZXIuICovCi0JT1BKX1VJTlQzMiBtX2lzX2RlY29kZXIgOiAxOwordHlwZWRlZiBzdHJ1Y3Qgb3BqX3RjZCB7CisgICAgLyoqIFBvc2l0aW9uIG9mIHRoZSB0aWxlcGFydCBmbGFnIGluIFByb2dyZXNzaW9uIG9yZGVyKi8KKyAgICBPUEpfSU5UMzIgdHBfcG9zOworICAgIC8qKiBUaWxlIHBhcnQgbnVtYmVyKi8KKyAgICBPUEpfVUlOVDMyIHRwX251bTsKKyAgICAvKiogQ3VycmVudCB0aWxlIHBhcnQgbnVtYmVyKi8KKyAgICBPUEpfVUlOVDMyIGN1cl90cF9udW07CisgICAgLyoqIFRvdGFsIG51bWJlciBvZiB0aWxlcGFydHMgb2YgdGhlIGN1cnJlbnQgdGlsZSovCisgICAgT1BKX1VJTlQzMiBjdXJfdG90bnVtX3RwOworICAgIC8qKiBDdXJyZW50IFBhY2tldCBpdGVyYXRvciBudW1iZXIgKi8KKyAgICBPUEpfVUlOVDMyIGN1cl9waW5vOworICAgIC8qKiBpbmZvIG9uIGVhY2ggaW1hZ2UgdGlsZSAqLworICAgIG9wal90Y2RfaW1hZ2VfdCAqdGNkX2ltYWdlOworICAgIC8qKiBpbWFnZSBoZWFkZXIgKi8KKyAgICBvcGpfaW1hZ2VfdCAqaW1hZ2U7CisgICAgLyoqIGNvZGluZyBwYXJhbWV0ZXJzICovCisgICAgb3BqX2NwX3QgKmNwOworICAgIC8qKiBjb2RpbmcvZGVjb2RpbmcgcGFyYW1ldGVycyBjb21tb24gdG8gYWxsIHRpbGVzICovCisgICAgb3BqX3RjcF90ICp0Y3A7CisgICAgLyoqIGN1cnJlbnQgZW5jb2RlZC9kZWNvZGVkIHRpbGUgKi8KKyAgICBPUEpfVUlOVDMyIHRjZF90aWxlbm87CisgICAgLyoqIHRlbGwgaWYgdGhlIHRjZCBpcyBhIGRlY29kZXIuICovCisgICAgT1BKX0JJVEZJRUxEIG1faXNfZGVjb2RlciA6IDE7CisgICAgLyoqIFRocmVhZCBwb29sICovCisgICAgb3BqX3RocmVhZF9wb29sX3QqIHRocmVhZF9wb29sOworICAgIC8qKiBDb29yZGluYXRlcyBvZiB0aGUgd2luZG93IG9mIGludGVyZXN0LCBpbiBncmlkIHJlZmVyZW5jZSBzcGFjZSAqLworICAgIE9QSl9VSU5UMzIgd2luX3gwOworICAgIE9QSl9VSU5UMzIgd2luX3kwOworICAgIE9QSl9VSU5UMzIgd2luX3gxOworICAgIE9QSl9VSU5UMzIgd2luX3kxOworICAgIC8qKiBPbmx5IHZhbGlkIGZvciBkZWNvZGluZy4gV2hldGhlciB0aGUgd2hvbGUgdGlsZSBpcyBkZWNvZGVkLCBvciBqdXN0IHRoZSByZWdpb24gaW4gd2luX3gwL3dpbl95MC93aW5feDEvd2luX3kxICovCisgICAgT1BKX0JPT0wgICB3aG9sZV90aWxlX2RlY29kaW5nOworICAgIC8qIEFycmF5IG9mIHNpemUgaW1hZ2UtPm51bWNvbXBzIGluZGljYXRpbmcgaWYgYSBjb21wb25lbnQgbXVzdCBiZSBkZWNvZGVkLiBOVUxMIGlmIGFsbCBjb21wb25lbnRzIG11c3QgYmUgZGVjb2RlZCAqLworICAgIE9QSl9CT09MKiB1c2VkX2NvbXBvbmVudDsKIH0gb3BqX3RjZF90OwogCiAvKiogQG5hbWUgRXhwb3J0ZWQgZnVuY3Rpb25zICovCkBAIC0yMjksNyArMjkxLDcgQEAKIC8qKgogRHVtcCB0aGUgY29udGVudCBvZiBhIHRjZCBzdHJ1Y3R1cmUKICovCi0vKnZvaWQgdGNkX2R1bXAoRklMRSAqZmQsIG9wal90Y2RfdCAqdGNkLCBvcGpfdGNkX2ltYWdlX3QgKmltZyk7Ki8gLyogVE9ETyBNU0Qgc2hvdWwgdXNlIHRoZSBuZXcgdjIgc3RydWN0dXJlcyAqLyAKKy8qdm9pZCB0Y2RfZHVtcChGSUxFICpmZCwgb3BqX3RjZF90ICp0Y2QsIG9wal90Y2RfaW1hZ2VfdCAqaW1nKTsqLyAvKiBUT0RPIE1TRCBzaG91bCB1c2UgdGhlIG5ldyB2MiBzdHJ1Y3R1cmVzICovCiAKIC8qKgogQ3JlYXRlIGEgbmV3IFRDRCBoYW5kbGUKQEAgLTI0NiwxMTMgKzMwOCwxMzUgQEAKIAogLyoqCiAgKiBJbml0aWFsaXplIHRoZSB0aWxlIGNvZGVyIGFuZCBtYXkgcmV1c2Ugc29tZSBtZW1vcnkuCi0gKiBAcGFyYW0JcF90Y2QJCVRDRCBoYW5kbGUuCi0gKiBAcGFyYW0JcF9pbWFnZQkJcmF3IGltYWdlLgotICogQHBhcmFtCXBfY3AJCWNvZGluZyBwYXJhbWV0ZXJzLgorICogQHBhcmFtICAgcF90Y2QgICAgICAgVENEIGhhbmRsZS4KKyAqIEBwYXJhbSAgIHBfaW1hZ2UgICAgIHJhdyBpbWFnZS4KKyAqIEBwYXJhbSAgIHBfY3AgICAgICAgIGNvZGluZyBwYXJhbWV0ZXJzLgorICogQHBhcmFtICAgcF90cCAgICAgICAgdGhyZWFkIHBvb2wKICAqCiAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGVuY29kaW5nIHZhbHVlcyBjb3VsZCBiZSBzZXQgKGZhbHNlIG90aGVyd2lzZSkuCiAqLwotT1BKX0JPT0wgb3BqX3RjZF9pbml0KAlvcGpfdGNkX3QgKnBfdGNkLAotCQkJCQkJb3BqX2ltYWdlX3QgKiBwX2ltYWdlLAotCQkJCQkJb3BqX2NwX3QgKiBwX2NwICk7CitPUEpfQk9PTCBvcGpfdGNkX2luaXQob3BqX3RjZF90ICpwX3RjZCwKKyAgICAgICAgICAgICAgICAgICAgICBvcGpfaW1hZ2VfdCAqIHBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgb3BqX2NwX3QgKiBwX2NwLAorICAgICAgICAgICAgICAgICAgICAgIG9wal90aHJlYWRfcG9vbF90KiBwX3RwKTsKIAogLyoqCiAgKiBBbGxvY2F0ZXMgbWVtb3J5IGZvciBkZWNvZGluZyBhIHNwZWNpZmljIHRpbGUuCiAgKgotICogQHBhcmFtCXBfdGNkCQl0aGUgdGlsZSBkZWNvZGVyLgotICogQHBhcmFtCXBfdGlsZV9ubwl0aGUgaW5kZXggb2YgdGhlIHRpbGUgcmVjZWl2ZWQgaW4gc2VxdWVuY2UuIFRoaXMgbm90IG5lY2Vzc2FyaWx5IGxlYWQgdG8gdGhlCisgKiBAcGFyYW0gICBwX3RjZCAgICAgICB0aGUgdGlsZSBkZWNvZGVyLgorICogQHBhcmFtICAgcF90aWxlX25vICAgdGhlIGluZGV4IG9mIHRoZSB0aWxlIHJlY2VpdmVkIGluIHNlcXVlbmNlLiBUaGlzIG5vdCBuZWNlc3NhcmlseSBsZWFkIHRvIHRoZQogICogdGlsZSBhdCBpbmRleCBwX3RpbGVfbm8uCiAgKiBAcGFyYW0gcF9tYW5hZ2VyIHRoZSBldmVudCBtYW5hZ2VyLgogICoKLSAqIEByZXR1cm4JdHJ1ZSBpZiB0aGUgcmVtYWluaW5nIGRhdGEgaXMgc3VmZmljaWVudC4KKyAqIEByZXR1cm4gIHRydWUgaWYgdGhlIHJlbWFpbmluZyBkYXRhIGlzIHN1ZmZpY2llbnQuCiAgKi8KLU9QSl9CT09MIG9wal90Y2RfaW5pdF9kZWNvZGVfdGlsZShvcGpfdGNkX3QgKnBfdGNkLCBPUEpfVUlOVDMyIHBfdGlsZV9ubywgb3BqX2V2ZW50X21ncl90KiBwX21hbmFnZXIpOworT1BKX0JPT0wgb3BqX3RjZF9pbml0X2RlY29kZV90aWxlKG9wal90Y2RfdCAqcF90Y2QsIE9QSl9VSU5UMzIgcF90aWxlX25vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCogcF9tYW5hZ2VyKTsKIAotdm9pZCBvcGpfdGNkX21ha2VsYXllcl9maXhlZChvcGpfdGNkX3QgKnRjZCwgT1BKX1VJTlQzMiBsYXlubywgT1BKX1VJTlQzMiBmaW5hbCk7Cit2b2lkIG9wal90Y2RfbWFrZWxheWVyX2ZpeGVkKG9wal90Y2RfdCAqdGNkLCBPUEpfVUlOVDMyIGxheW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGZpbmFsKTsKIAogdm9pZCBvcGpfdGNkX3JhdGVhbGxvY2F0ZV9maXhlZChvcGpfdGNkX3QgKnRjZCk7CiAKLXZvaWQgb3BqX3RjZF9tYWtlbGF5ZXIoCW9wal90Y2RfdCAqdGNkLAotCQkJCQkJT1BKX1VJTlQzMiBsYXlubywKLQkJCQkJCU9QSl9GTE9BVDY0IHRocmVzaCwKLQkJCQkJCU9QSl9VSU5UMzIgZmluYWwpOwordm9pZCBvcGpfdGNkX21ha2VsYXllcihvcGpfdGNkX3QgKnRjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsYXlubywKKyAgICAgICAgICAgICAgICAgICAgICAgT1BKX0ZMT0FUNjQgdGhyZXNoLAorICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGZpbmFsKTsKIAotT1BKX0JPT0wgb3BqX3RjZF9yYXRlYWxsb2NhdGUoCW9wal90Y2RfdCAqdGNkLAotCQkJCQkJCQlPUEpfQllURSAqZGVzdCwKLQkJCQkJCQkJT1BKX1VJTlQzMiAqIHBfZGF0YV93cml0dGVuLAotCQkJCQkJCQlPUEpfVUlOVDMyIGxlbiwKLQkJCQkJCQkJb3BqX2NvZGVzdHJlYW1faW5mb190ICpjc3RyX2luZm8pOworT1BKX0JPT0wgb3BqX3RjZF9yYXRlYWxsb2NhdGUob3BqX3RjZF90ICp0Y2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2NvZGVzdHJlYW1faW5mb190ICpjc3RyX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcik7CiAKIC8qKgogICogR2V0cyB0aGUgbWF4aW11bSB0aWxlIHNpemUgdGhhdCB3aWxsIGJlIHRha2VuIGJ5IHRoZSB0aWxlIG9uY2UgZGVjb2RlZC4KICAqLwotT1BKX1VJTlQzMiBvcGpfdGNkX2dldF9kZWNvZGVkX3RpbGVfc2l6ZSAob3BqX3RjZF90ICpwX3RjZCApOworT1BKX1VJTlQzMiBvcGpfdGNkX2dldF9kZWNvZGVkX3RpbGVfc2l6ZShvcGpfdGNkX3QgKnBfdGNkLAorICAgICAgICBPUEpfQk9PTCB0YWtlX2ludG9fYWNjb3VudF9wYXJ0aWFsX2RlY29kaW5nKTsKIAogLyoqCiAgKiBFbmNvZGVzIGEgdGlsZSBmcm9tIHRoZSByYXcgaW1hZ2UgaW50byB0aGUgZ2l2ZW4gYnVmZmVyLgotICogQHBhcmFtCXBfdGNkCQkJVGlsZSBDb2RlciBoYW5kbGUKLSAqIEBwYXJhbQlwX3RpbGVfbm8JCUluZGV4IG9mIHRoZSB0aWxlIHRvIGVuY29kZS4KLSAqIEBwYXJhbQlwX2Rlc3QJCQlEZXN0aW5hdGlvbiBidWZmZXIKLSAqIEBwYXJhbQlwX2RhdGFfd3JpdHRlbglwb2ludGVyIHRvIGFuIGludCB0aGF0IGlzIGluY3JlbWVudGVkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhbGx5IHdyaXR0ZW4gb24gcF9kZXN0Ci0gKiBAcGFyYW0JcF9sZW4JCQlNYXhpbXVtIGxlbmd0aCBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCi0gKiBAcGFyYW0JcF9jc3RyX2luZm8JCUNvZGVzdHJlYW0gaW5mb3JtYXRpb24gc3RydWN0dXJlCisgKiBAcGFyYW0gICBwX3RjZCAgICAgICAgICAgVGlsZSBDb2RlciBoYW5kbGUKKyAqIEBwYXJhbSAgIHBfdGlsZV9ubyAgICAgICBJbmRleCBvZiB0aGUgdGlsZSB0byBlbmNvZGUuCisgKiBAcGFyYW0gICBwX2Rlc3QgICAgICAgICAgRGVzdGluYXRpb24gYnVmZmVyCisgKiBAcGFyYW0gICBwX2RhdGFfd3JpdHRlbiAgcG9pbnRlciB0byBhbiBpbnQgdGhhdCBpcyBpbmNyZW1lbnRlZCBieSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWxseSB3cml0dGVuIG9uIHBfZGVzdAorICogQHBhcmFtICAgcF9sZW4gICAgICAgICAgIE1heGltdW0gbGVuZ3RoIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKyAqIEBwYXJhbSAgIHBfY3N0cl9pbmZvICAgICBDb2Rlc3RyZWFtIGluZm9ybWF0aW9uIHN0cnVjdHVyZQorICogQHBhcmFtICAgcF9tYW5hZ2VyICAgICAgIHRoZSB1c2VyIGV2ZW50IG1hbmFnZXIKICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGNvZGluZyBpcyBzdWNjZXNzZnVsLgogKi8KLU9QSl9CT09MIG9wal90Y2RfZW5jb2RlX3RpbGUoICAgb3BqX3RjZF90ICpwX3RjZCwKLQkJCQkJCQkgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCi0JCQkJCQkJICAgIE9QSl9CWVRFICpwX2Rlc3QsCi0JCQkJCQkJICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKLQkJCQkJCQkgICAgT1BKX1VJTlQzMiBwX2xlbiwKLQkJCQkJCQkgICAgc3RydWN0IG9wal9jb2Rlc3RyZWFtX2luZm8gKnBfY3N0cl9pbmZvKTsKK09QSl9CT09MIG9wal90Y2RfZW5jb2RlX3RpbGUob3BqX3RjZF90ICpwX3RjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9CWVRFICpwX2Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgKiBwX2RhdGFfd3JpdHRlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG9wal9jb2Rlc3RyZWFtX2luZm8gKnBfY3N0cl9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcik7CiAKIAogLyoqCiBEZWNvZGUgYSB0aWxlIGZyb20gYSBidWZmZXIgaW50byBhIHJhdyBpbWFnZQogQHBhcmFtIHRjZCBUQ0QgaGFuZGxlCitAcGFyYW0gd2luX3gwIFVwcGVyIGxlZnQgeCBvZiByZWdpb24gdG8gZGVjb2RlIChpbiBncmlkIGNvb3JkaW5hdGVzKQorQHBhcmFtIHdpbl95MCBVcHBlciBsZWZ0IHkgb2YgcmVnaW9uIHRvIGRlY29kZSAoaW4gZ3JpZCBjb29yZGluYXRlcykKK0BwYXJhbSB3aW5feDEgTG93ZXIgcmlnaHQgeCBvZiByZWdpb24gdG8gZGVjb2RlIChpbiBncmlkIGNvb3JkaW5hdGVzKQorQHBhcmFtIHdpbl95MSBMb3dlciByaWdodCB5IG9mIHJlZ2lvbiB0byBkZWNvZGUgKGluIGdyaWQgY29vcmRpbmF0ZXMpCitAcGFyYW0gbnVtY29tcHNfdG9fZGVjb2RlICBTaXplIG9mIHRoZSBjb21wc19pbmRpY2VzIGFycmF5LCBvciAwIGlmIGRlY29kaW5nIGFsbCBjb21wb25lbnRzLgorQHBhcmFtIGNvbXBzX2luZGljZXMgICBBcnJheSBvZiBudW1jb21wcyB2YWx1ZXMgcmVwcmVzZW50aW5nIHRoZSBpbmRpY2VzCisgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBjb21wb25lbnRzIHRvIGRlY29kZSAocmVsYXRpdmUgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzdHJlYW0sIHN0YXJ0aW5nIGF0IDApLiBPciBOVUxMIGlmIGRlY29kaW5nIGFsbCBjb21wb25lbnRzLgogQHBhcmFtIHNyYyBTb3VyY2UgYnVmZmVyCiBAcGFyYW0gbGVuIExlbmd0aCBvZiBzb3VyY2UgYnVmZmVyCiBAcGFyYW0gdGlsZW5vIE51bWJlciB0aGF0IGlkZW50aWZpZXMgb25lIG9mIHRoZSB0aWxlcyB0byBiZSBkZWNvZGVkCiBAcGFyYW0gY3N0cl9pbmZvICBGSVhNRSBET0MKIEBwYXJhbSBtYW5hZ2VyIHRoZSBldmVudCBtYW5hZ2VyLgogKi8KLU9QSl9CT09MIG9wal90Y2RfZGVjb2RlX3RpbGUoICAgb3BqX3RjZF90ICp0Y2QsCi0JCQkJCQkJICAgIE9QSl9CWVRFICpzcmMsCi0JCQkJCQkJICAgIE9QSl9VSU5UMzIgbGVuLAotCQkJCQkJCSAgICBPUEpfVUlOVDMyIHRpbGVubywKLQkJCQkJCQkgICAgb3BqX2NvZGVzdHJlYW1faW5kZXhfdCAqY3N0cl9pbmZvLAotCQkJCQkJCSAgICBvcGpfZXZlbnRfbWdyX3QgKm1hbmFnZXIpOworT1BKX0JPT0wgb3BqX3RjZF9kZWNvZGVfdGlsZShvcGpfdGNkX3QgKnRjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB3aW5feDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgd2luX3kwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHdpbl94MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB3aW5feTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbnVtY29tcHNfdG9fZGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPUEpfVUlOVDMyICpjb21wc19pbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiB0aWxlbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9jb2Rlc3RyZWFtX2luZGV4X3QgKmNzdHJfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICptYW5hZ2VyKTsKIAogCiAvKioKICAqIENvcGllcyB0aWxlIGRhdGEgZnJvbSB0aGUgc3lzdGVtIG9udG8gdGhlIGdpdmVuIG1lbW9yeSBibG9jay4KICAqLwotT1BKX0JPT0wgb3BqX3RjZF91cGRhdGVfdGlsZV9kYXRhICgJb3BqX3RjZF90ICpwX3RjZCwKLQkJCQkJCQkJICAgIE9QSl9CWVRFICogcF9kZXN0LAotCQkJCQkJCQkgICAgT1BKX1VJTlQzMiBwX2Rlc3RfbGVuZ3RoICk7CitPUEpfQk9PTCBvcGpfdGNkX3VwZGF0ZV90aWxlX2RhdGEob3BqX3RjZF90ICpwX3RjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIHBfZGVzdF9sZW5ndGgpOwogCiAvKioKICAqCiAgKi8KLU9QSl9VSU5UMzIgb3BqX3RjZF9nZXRfZW5jb2RlZF90aWxlX3NpemUgKCBvcGpfdGNkX3QgKnBfdGNkICk7CitPUEpfU0laRV9UIG9wal90Y2RfZ2V0X2VuY29kZWRfdGlsZV9zaXplKG9wal90Y2RfdCAqcF90Y2QpOwogCiAvKioKICAqIEluaXRpYWxpemUgdGhlIHRpbGUgY29kZXIgYW5kIG1heSByZXVzZSBzb21lIG1lb3J5LgogICoKLSAqIEBwYXJhbQlwX3RjZAkJVENEIGhhbmRsZS4KLSAqIEBwYXJhbQlwX3RpbGVfbm8JY3VycmVudCB0aWxlIGluZGV4IHRvIGVuY29kZS4KKyAqIEBwYXJhbSAgIHBfdGNkICAgICAgIFRDRCBoYW5kbGUuCisgKiBAcGFyYW0gICBwX3RpbGVfbm8gICBjdXJyZW50IHRpbGUgaW5kZXggdG8gZW5jb2RlLgogICogQHBhcmFtIHBfbWFuYWdlciB0aGUgZXZlbnQgbWFuYWdlci4KICAqCiAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGVuY29kaW5nIHZhbHVlcyBjb3VsZCBiZSBzZXQgKGZhbHNlIG90aGVyd2lzZSkuCiAqLwotT1BKX0JPT0wgb3BqX3RjZF9pbml0X2VuY29kZV90aWxlICgJb3BqX3RjZF90ICpwX3RjZCwKLQkJCQkJCQkJICAgIE9QSl9VSU5UMzIgcF90aWxlX25vLCBvcGpfZXZlbnRfbWdyX3QqIHBfbWFuYWdlciApOworT1BKX0JPT0wgb3BqX3RjZF9pbml0X2VuY29kZV90aWxlKG9wal90Y2RfdCAqcF90Y2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3RpbGVfbm8sIG9wal9ldmVudF9tZ3JfdCogcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBDb3BpZXMgdGlsZSBkYXRhIGZyb20gdGhlIGdpdmVuIG1lbW9yeSBibG9jayBvbnRvIHRoZSBzeXN0ZW0uCiAgKi8KLU9QSl9CT09MIG9wal90Y2RfY29weV90aWxlX2RhdGEgKG9wal90Y2RfdCAqcF90Y2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfQllURSAqIHBfc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX3NyY19sZW5ndGggKTsKK09QSl9CT09MIG9wal90Y2RfY29weV90aWxlX2RhdGEob3BqX3RjZF90ICpwX3RjZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX0JZVEUgKiBwX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1NJWkVfVCBwX3NyY19sZW5ndGgpOwogCiAvKioKICAqIEFsbG9jYXRlcyB0aWxlIGNvbXBvbmVudCBkYXRhCkBAIC0zNjEsOSArNDQ1LDQyIEBACiAgKi8KIE9QSl9CT09MIG9wal9hbGxvY190aWxlX2NvbXBvbmVudF9kYXRhKG9wal90Y2RfdGlsZWNvbXBfdCAqbF90aWxlYyk7CiAKKy8qKiBSZXR1cm5zIHdoZXRoZXIgYSBzdWItYmFuZCBpcyBlbXB0eSAoaS5lLiB3aGV0aGVyIGl0IGhhcyBhIG51bGwgYXJlYSkKKyAqIEBwYXJhbSBiYW5kIFN1Yi1iYW5kIGhhbmRsZS4KKyAqIEByZXR1cm4gT1BKX1RSVUUgd2hldGhlciB0aGUgc3ViLWJhbmQgaXMgZW1wdHkuCisgKi8KK09QSl9CT09MIG9wal90Y2RfaXNfYmFuZF9lbXB0eShvcGpfdGNkX2JhbmRfdCogYmFuZCk7CisKKy8qKiBSZWluaXRpYWxpemUgYSBzZWdtZW50ICovCit2b2lkIG9wal90Y2RfcmVpbml0X3NlZ21lbnQob3BqX3RjZF9zZWdfdCogc2VnKTsKKworCisvKiogUmV0dXJucyB3aGV0aGVyIGEgc3ViLWJhbmQgcmVnaW9uIGNvbnRyaWJ1dGVzIHRvIHRoZSBhcmVhIG9mIGludGVyZXN0CisgKiB0Y2QtPndpbl94MCx0Y2QtPndpbl95MCx0Y2QtPndpbl94MSx0Y2QtPndpbl95MS4KKyAqCisgKiBAcGFyYW0gdGNkICAgIFRDRCBoYW5kbGUuCisgKiBAcGFyYW0gY29tcG5vIENvbXBvbmVudCBudW1iZXIKKyAqIEBwYXJhbSByZXNubyAgUmVzb2x1dGlvbiBudW1iZXIKKyAqIEBwYXJhbSBiYW5kbm8gQmFuZCBudW1iZXIgKCpub3QqIGJhbmQgaW5kZXgsIGllIDAsIDEsIDIgb3IgMykKKyAqIEBwYXJhbSB4MCAgICAgVXBwZXIgbGVmdCB4IGluIHN1YmJhbmQgY29vcmRpbmF0ZXMKKyAqIEBwYXJhbSB5MCAgICAgVXBwZXIgbGVmdCB5IGluIHN1YmJhbmQgY29vcmRpbmF0ZXMKKyAqIEBwYXJhbSB4MSAgICAgTG93ZXIgcmlnaHQgeCBpbiBzdWJiYW5kIGNvb3JkaW5hdGVzCisgKiBAcGFyYW0geTEgICAgIExvd2VyIHJpZ2h0IHkgaW4gc3ViYmFuZCBjb29yZGluYXRlcworICogQHJldHVybiBPUEpfVFJVRSB3aGV0aGVyIHRoZSBzdWItYmFuZCByZWdpb24gY29udHJpYnV0cyB0byB0aGUgYXJlYSBvZgorICogICAgICAgICAgICAgICAgICBpbnRlcmVzdC4KKyAqLworT1BKX0JPT0wgb3BqX3RjZF9pc19zdWJiYW5kX2FyZWFfb2ZfaW50ZXJlc3Qob3BqX3RjZF90ICp0Y2QsCisgICAgICAgIE9QSl9VSU5UMzIgY29tcG5vLAorICAgICAgICBPUEpfVUlOVDMyIHJlc25vLAorICAgICAgICBPUEpfVUlOVDMyIGJhbmRubywKKyAgICAgICAgT1BKX1VJTlQzMiB4MCwKKyAgICAgICAgT1BKX1VJTlQzMiB5MCwKKyAgICAgICAgT1BKX1VJTlQzMiB4MSwKKyAgICAgICAgT1BKX1VJTlQzMiB5MSk7CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKkB9Ki8KIAogLypAfSovCiAKLSNlbmRpZiAvKiBfX1RDRF9IICovCisjZW5kaWYgLyogT1BKX1RDRF9IICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3RndC5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Z3QuYwppbmRleCA1ZTM0YWE5Li4wY2JhZDEyIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3RndC5jCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGd0LmMKQEAgLTEsNiArMSw2IEBACiAvKgotICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMgCi0gKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQgCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCiAgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCiAgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCiAgKgpAQCAtOCwxMCArOCwxMCBAQAogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMTQsIFByb2Zlc3NvciBCZW5vaXQgTWFjcQogICogQ29weXJpZ2h0IChjKSAyMDAxLTIwMDMsIERhdmlkIEphbnNzZW5zCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDItMjAwMywgWWFubmljayBWZXJzY2h1ZXJlbgotICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4IAorICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDcsIEZyYW5jb2lzLU9saXZpZXIgRGV2YXV4CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDMtMjAxNCwgQW50b25pbiBEZXNjYW1wZQogICogQ29weXJpZ2h0IChjKSAyMDA1LCBIZXJ2ZSBEcm9sb24sIEZyZWVJbWFnZSBUZWFtCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDgsIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZSIAorICogQ29weXJpZ2h0IChjKSAyMDA4LCAyMDExLTIwMTIsIENlbnRyZSBOYXRpb25hbCBkJ0V0dWRlcyBTcGF0aWFsZXMgKENORVMpLCBGUgogICogQ29weXJpZ2h0IChjKSAyMDEyLCBDUyBTeXN0ZW1lcyBkJ0luZm9ybWF0aW9uLCBGcmFuY2UKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgpAQCAtMzksODcgKzM5LDkwIEBACiAKICNpbmNsdWRlICJvcGpfaW5jbHVkZXMuaCIKIAotLyogCisvKgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgVGFnLXRyZWUgY29kZXIgaW50ZXJmYWNlCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwogCi1vcGpfdGd0X3RyZWVfdCAqb3BqX3RndF9jcmVhdGUoT1BKX1VJTlQzMiBudW1sZWFmc2gsIE9QSl9VSU5UMzIgbnVtbGVhZnN2LCBvcGpfZXZlbnRfbWdyX3QgKm1hbmFnZXIpIHsKLSAgICAgICAgT1BKX0lOVDMyIG5wbGhbMzJdOwotICAgICAgICBPUEpfSU5UMzIgbnBsdlszMl07Ci0gICAgICAgIG9wal90Z3Rfbm9kZV90ICpub2RlID0gMDA7Ci0gICAgICAgIG9wal90Z3Rfbm9kZV90ICpsX3BhcmVudF9ub2RlID0gMDA7Ci0gICAgICAgIG9wal90Z3Rfbm9kZV90ICpsX3BhcmVudF9ub2RlMCA9IDAwOwotICAgICAgICBvcGpfdGd0X3RyZWVfdCAqdHJlZSA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIE9QSl9JTlQzMiAgaixrOwotICAgICAgICBPUEpfVUlOVDMyIG51bWx2bHM7Ci0gICAgICAgIE9QSl9VSU5UMzIgbjsKK29wal90Z3RfdHJlZV90ICpvcGpfdGd0X2NyZWF0ZShPUEpfVUlOVDMyIG51bWxlYWZzaCwgT1BKX1VJTlQzMiBudW1sZWFmc3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2V2ZW50X21ncl90ICpwX21hbmFnZXIpCit7CisgICAgT1BKX0lOVDMyIG5wbGhbMzJdOworICAgIE9QSl9JTlQzMiBucGx2WzMyXTsKKyAgICBvcGpfdGd0X25vZGVfdCAqbm9kZSA9IDAwOworICAgIG9wal90Z3Rfbm9kZV90ICpsX3BhcmVudF9ub2RlID0gMDA7CisgICAgb3BqX3RndF9ub2RlX3QgKmxfcGFyZW50X25vZGUwID0gMDA7CisgICAgb3BqX3RndF90cmVlX3QgKnRyZWUgPSAwMDsKKyAgICBPUEpfVUlOVDMyIGk7CisgICAgT1BKX0lOVDMyICBqLCBrOworICAgIE9QSl9VSU5UMzIgbnVtbHZsczsKKyAgICBPUEpfVUlOVDMyIG47CiAKLSAgICAgICAgdHJlZSA9IChvcGpfdGd0X3RyZWVfdCAqKSBvcGpfY2FsbG9jKDEsc2l6ZW9mKG9wal90Z3RfdHJlZV90KSk7Ci0gICAgICAgIGlmKCF0cmVlKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhtYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgVGFnLXRyZWVcbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiAwMDsKLSAgICAgICAgfQorICAgIHRyZWUgPSAob3BqX3RndF90cmVlX3QgKikgb3BqX2NhbGxvYygxLCBzaXplb2Yob3BqX3RndF90cmVlX3QpKTsKKyAgICBpZiAoIXRyZWUpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwgIk5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSBUYWctdHJlZVxuIik7CisgICAgICAgIHJldHVybiAwMDsKKyAgICB9CiAKLSAgICAgICAgdHJlZS0+bnVtbGVhZnNoID0gbnVtbGVhZnNoOwotICAgICAgICB0cmVlLT5udW1sZWFmc3YgPSBudW1sZWFmc3Y7CisgICAgdHJlZS0+bnVtbGVhZnNoID0gbnVtbGVhZnNoOworICAgIHRyZWUtPm51bWxlYWZzdiA9IG51bWxlYWZzdjsKIAotICAgICAgICBudW1sdmxzID0gMDsKLSAgICAgICAgbnBsaFswXSA9IChPUEpfSU5UMzIpbnVtbGVhZnNoOwotICAgICAgICBucGx2WzBdID0gKE9QSl9JTlQzMiludW1sZWFmc3Y7Ci0gICAgICAgIHRyZWUtPm51bW5vZGVzID0gMDsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIG4gPSAoT1BKX1VJTlQzMikobnBsaFtudW1sdmxzXSAqIG5wbHZbbnVtbHZsc10pOwotICAgICAgICAgICAgICAgIG5wbGhbbnVtbHZscyArIDFdID0gKG5wbGhbbnVtbHZsc10gKyAxKSAvIDI7Ci0gICAgICAgICAgICAgICAgbnBsdltudW1sdmxzICsgMV0gPSAobnBsdltudW1sdmxzXSArIDEpIC8gMjsKLSAgICAgICAgICAgICAgICB0cmVlLT5udW1ub2RlcyArPSBuOwotICAgICAgICAgICAgICAgICsrbnVtbHZsczsKLSAgICAgICAgfSB3aGlsZSAobiA+IDEpOworICAgIG51bWx2bHMgPSAwOworICAgIG5wbGhbMF0gPSAoT1BKX0lOVDMyKW51bWxlYWZzaDsKKyAgICBucGx2WzBdID0gKE9QSl9JTlQzMiludW1sZWFmc3Y7CisgICAgdHJlZS0+bnVtbm9kZXMgPSAwOworICAgIGRvIHsKKyAgICAgICAgbiA9IChPUEpfVUlOVDMyKShucGxoW251bWx2bHNdICogbnBsdltudW1sdmxzXSk7CisgICAgICAgIG5wbGhbbnVtbHZscyArIDFdID0gKG5wbGhbbnVtbHZsc10gKyAxKSAvIDI7CisgICAgICAgIG5wbHZbbnVtbHZscyArIDFdID0gKG5wbHZbbnVtbHZsc10gKyAxKSAvIDI7CisgICAgICAgIHRyZWUtPm51bW5vZGVzICs9IG47CisgICAgICAgICsrbnVtbHZsczsKKyAgICB9IHdoaWxlIChuID4gMSk7CiAKLSAgICAgICAgLyogQUREICovCi0gICAgICAgIGlmICh0cmVlLT5udW1ub2RlcyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2ZyZWUodHJlZSk7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhtYW5hZ2VyLCBFVlRfV0FSTklORywgInRndF9jcmVhdGUgdHJlZS0+bnVtbm9kZXMgPT0gMCwgbm8gdHJlZSBjcmVhdGVkLlxuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDAwOwotICAgICAgICB9CisgICAgLyogQUREICovCisgICAgaWYgKHRyZWUtPm51bW5vZGVzID09IDApIHsKKyAgICAgICAgb3BqX2ZyZWUodHJlZSk7CisgICAgICAgIHJldHVybiAwMDsKKyAgICB9CiAKLSAgICAgICAgdHJlZS0+bm9kZXMgPSAob3BqX3RndF9ub2RlX3QqKSBvcGpfY2FsbG9jKHRyZWUtPm51bW5vZGVzLCBzaXplb2Yob3BqX3RndF9ub2RlX3QpKTsKLSAgICAgICAgaWYoIXRyZWUtPm5vZGVzKSB7Ci0gICAgICAgICAgICAgICAgb3BqX2V2ZW50X21zZyhtYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgVGFnLXRyZWUgbm9kZXNcbiIpOwotICAgICAgICAgICAgICAgIG9wal9mcmVlKHRyZWUpOwotICAgICAgICAgICAgICAgIHJldHVybiAwMDsKLSAgICAgICAgfQotICAgICAgICB0cmVlLT5ub2Rlc19zaXplID0gdHJlZS0+bnVtbm9kZXMgKiAoT1BKX1VJTlQzMilzaXplb2Yob3BqX3RndF9ub2RlX3QpOworICAgIHRyZWUtPm5vZGVzID0gKG9wal90Z3Rfbm9kZV90Kikgb3BqX2NhbGxvYyh0cmVlLT5udW1ub2RlcywKKyAgICAgICAgICAgICAgICAgIHNpemVvZihvcGpfdGd0X25vZGVfdCkpOworICAgIGlmICghdHJlZS0+bm9kZXMpIHsKKyAgICAgICAgb3BqX2V2ZW50X21zZyhwX21hbmFnZXIsIEVWVF9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAiTm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIFRhZy10cmVlIG5vZGVzXG4iKTsKKyAgICAgICAgb3BqX2ZyZWUodHJlZSk7CisgICAgICAgIHJldHVybiAwMDsKKyAgICB9CisgICAgdHJlZS0+bm9kZXNfc2l6ZSA9IHRyZWUtPm51bW5vZGVzICogKE9QSl9VSU5UMzIpc2l6ZW9mKG9wal90Z3Rfbm9kZV90KTsKIAotICAgICAgICBub2RlID0gdHJlZS0+bm9kZXM7Ci0gICAgICAgIGxfcGFyZW50X25vZGUgPSAmdHJlZS0+bm9kZXNbdHJlZS0+bnVtbGVhZnNoICogdHJlZS0+bnVtbGVhZnN2XTsKLSAgICAgICAgbF9wYXJlbnRfbm9kZTAgPSBsX3BhcmVudF9ub2RlOworICAgIG5vZGUgPSB0cmVlLT5ub2RlczsKKyAgICBsX3BhcmVudF9ub2RlID0gJnRyZWUtPm5vZGVzW3RyZWUtPm51bWxlYWZzaCAqIHRyZWUtPm51bWxlYWZzdl07CisgICAgbF9wYXJlbnRfbm9kZTAgPSBsX3BhcmVudF9ub2RlOwogCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1sdmxzIC0gMTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG5wbHZbaV07ICsraikgewotICAgICAgICAgICAgICAgICAgICAgICAgayA9IG5wbGhbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoLS1rID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+cGFyZW50ID0gbF9wYXJlbnRfbm9kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytub2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS1rID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5wYXJlbnQgPSBsX3BhcmVudF9ub2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbm9kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfcGFyZW50X25vZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGogJiAxKSB8fCBqID09IG5wbHZbaV0gLSAxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFyZW50X25vZGUwID0gbF9wYXJlbnRfbm9kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFyZW50X25vZGUgPSBsX3BhcmVudF9ub2RlMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9wYXJlbnRfbm9kZTAgKz0gbnBsaFtpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtbHZscyAtIDE7ICsraSkgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnBsdltpXTsgKytqKSB7CisgICAgICAgICAgICBrID0gbnBsaFtpXTsKKyAgICAgICAgICAgIHdoaWxlICgtLWsgPj0gMCkgeworICAgICAgICAgICAgICAgIG5vZGUtPnBhcmVudCA9IGxfcGFyZW50X25vZGU7CisgICAgICAgICAgICAgICAgKytub2RlOworICAgICAgICAgICAgICAgIGlmICgtLWsgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBub2RlLT5wYXJlbnQgPSBsX3BhcmVudF9ub2RlOworICAgICAgICAgICAgICAgICAgICArK25vZGU7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsrbF9wYXJlbnRfbm9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoaiAmIDEpIHx8IGogPT0gbnBsdltpXSAtIDEpIHsKKyAgICAgICAgICAgICAgICBsX3BhcmVudF9ub2RlMCA9IGxfcGFyZW50X25vZGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGxfcGFyZW50X25vZGUgPSBsX3BhcmVudF9ub2RlMDsKKyAgICAgICAgICAgICAgICBsX3BhcmVudF9ub2RlMCArPSBucGxoW2ldOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG5vZGUtPnBhcmVudCA9IDA7Ci0gICAgICAgIG9wal90Z3RfcmVzZXQodHJlZSk7Ci0gICAgICAgIHJldHVybiB0cmVlOworICAgIH0KKyAgICBub2RlLT5wYXJlbnQgPSAwOworICAgIG9wal90Z3RfcmVzZXQodHJlZSk7CisgICAgcmV0dXJuIHRyZWU7CiB9CiAKIC8qKgpAQCAtMTMwLDIwNiArMTMzLDIxMiBAQAogICogQHBhcmFtICAgICAgIHBfbnVtX2xlYWZzX3YgICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGFycmF5IG9mIGxlYWZzIG9mIHRoZSB0cmVlCiAgKiBAcmV0dXJuICAgICAgYSBuZXcgdGFnLXRyZWUgaWYgc3VjY2Vzc2Z1bCwgTlVMTCBvdGhlcndpc2UKICovCi1vcGpfdGd0X3RyZWVfdCAqb3BqX3RndF9pbml0KG9wal90Z3RfdHJlZV90ICogcF90cmVlLE9QSl9VSU5UMzIgcF9udW1fbGVhZnNfaCwgT1BKX1VJTlQzMiBwX251bV9sZWFmc192LCBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcikKK29wal90Z3RfdHJlZV90ICpvcGpfdGd0X2luaXQob3BqX3RndF90cmVlX3QgKiBwX3RyZWUsIE9QSl9VSU5UMzIgcF9udW1fbGVhZnNfaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBwX251bV9sZWFmc192LCBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcikKIHsKLSAgICAgICAgT1BKX0lOVDMyIGxfbnBsaFszMl07Ci0gICAgICAgIE9QSl9JTlQzMiBsX25wbHZbMzJdOwotICAgICAgICBvcGpfdGd0X25vZGVfdCAqbF9ub2RlID0gMDA7Ci0gICAgICAgIG9wal90Z3Rfbm9kZV90ICpsX3BhcmVudF9ub2RlID0gMDA7Ci0gICAgICAgIG9wal90Z3Rfbm9kZV90ICpsX3BhcmVudF9ub2RlMCA9IDAwOwotICAgICAgICBPUEpfVUlOVDMyIGk7Ci0gICAgICAgIE9QSl9JTlQzMiBqLGs7Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9udW1fbGV2ZWxzOwotICAgICAgICBPUEpfVUlOVDMyIG47Ci0gICAgICAgIE9QSl9VSU5UMzIgbF9ub2RlX3NpemU7CisgICAgT1BKX0lOVDMyIGxfbnBsaFszMl07CisgICAgT1BKX0lOVDMyIGxfbnBsdlszMl07CisgICAgb3BqX3RndF9ub2RlX3QgKmxfbm9kZSA9IDAwOworICAgIG9wal90Z3Rfbm9kZV90ICpsX3BhcmVudF9ub2RlID0gMDA7CisgICAgb3BqX3RndF9ub2RlX3QgKmxfcGFyZW50X25vZGUwID0gMDA7CisgICAgT1BKX1VJTlQzMiBpOworICAgIE9QSl9JTlQzMiBqLCBrOworICAgIE9QSl9VSU5UMzIgbF9udW1fbGV2ZWxzOworICAgIE9QSl9VSU5UMzIgbjsKKyAgICBPUEpfVUlOVDMyIGxfbm9kZV9zaXplOwogCi0gICAgICAgIGlmICghIHBfdHJlZSl7CisgICAgaWYgKCEgcF90cmVlKSB7CisgICAgICAgIHJldHVybiAwMDsKKyAgICB9CisKKyAgICBpZiAoKHBfdHJlZS0+bnVtbGVhZnNoICE9IHBfbnVtX2xlYWZzX2gpIHx8CisgICAgICAgICAgICAocF90cmVlLT5udW1sZWFmc3YgIT0gcF9udW1fbGVhZnNfdikpIHsKKyAgICAgICAgcF90cmVlLT5udW1sZWFmc2ggPSBwX251bV9sZWFmc19oOworICAgICAgICBwX3RyZWUtPm51bWxlYWZzdiA9IHBfbnVtX2xlYWZzX3Y7CisKKyAgICAgICAgbF9udW1fbGV2ZWxzID0gMDsKKyAgICAgICAgbF9ucGxoWzBdID0gKE9QSl9JTlQzMilwX251bV9sZWFmc19oOworICAgICAgICBsX25wbHZbMF0gPSAoT1BKX0lOVDMyKXBfbnVtX2xlYWZzX3Y7CisgICAgICAgIHBfdHJlZS0+bnVtbm9kZXMgPSAwOworICAgICAgICBkbyB7CisgICAgICAgICAgICBuID0gKE9QSl9VSU5UMzIpKGxfbnBsaFtsX251bV9sZXZlbHNdICogbF9ucGx2W2xfbnVtX2xldmVsc10pOworICAgICAgICAgICAgbF9ucGxoW2xfbnVtX2xldmVscyArIDFdID0gKGxfbnBsaFtsX251bV9sZXZlbHNdICsgMSkgLyAyOworICAgICAgICAgICAgbF9ucGx2W2xfbnVtX2xldmVscyArIDFdID0gKGxfbnBsdltsX251bV9sZXZlbHNdICsgMSkgLyAyOworICAgICAgICAgICAgcF90cmVlLT5udW1ub2RlcyArPSBuOworICAgICAgICAgICAgKytsX251bV9sZXZlbHM7CisgICAgICAgIH0gd2hpbGUgKG4gPiAxKTsKKworICAgICAgICAvKiBBREQgKi8KKyAgICAgICAgaWYgKHBfdHJlZS0+bnVtbm9kZXMgPT0gMCkgeworICAgICAgICAgICAgb3BqX3RndF9kZXN0cm95KHBfdHJlZSk7CisgICAgICAgICAgICByZXR1cm4gMDA7CisgICAgICAgIH0KKyAgICAgICAgbF9ub2RlX3NpemUgPSBwX3RyZWUtPm51bW5vZGVzICogKE9QSl9VSU5UMzIpc2l6ZW9mKG9wal90Z3Rfbm9kZV90KTsKKworICAgICAgICBpZiAobF9ub2RlX3NpemUgPiBwX3RyZWUtPm5vZGVzX3NpemUpIHsKKyAgICAgICAgICAgIG9wal90Z3Rfbm9kZV90KiBuZXdfbm9kZXMgPSAob3BqX3RndF9ub2RlX3QqKSBvcGpfcmVhbGxvYyhwX3RyZWUtPm5vZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfbm9kZV9zaXplKTsKKyAgICAgICAgICAgIGlmICghIG5ld19ub2RlcykgeworICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IGVub3VnaCBtZW1vcnkgdG8gcmVpbml0aWFsaXplIHRoZSB0YWcgdHJlZVxuIik7CisgICAgICAgICAgICAgICAgb3BqX3RndF9kZXN0cm95KHBfdHJlZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIDAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcF90cmVlLT5ub2RlcyA9IG5ld19ub2RlczsKKyAgICAgICAgICAgIG1lbXNldCgoKGNoYXIgKikgcF90cmVlLT5ub2RlcykgKyBwX3RyZWUtPm5vZGVzX3NpemUsIDAsCisgICAgICAgICAgICAgICAgICAgbF9ub2RlX3NpemUgLSBwX3RyZWUtPm5vZGVzX3NpemUpOworICAgICAgICAgICAgcF90cmVlLT5ub2Rlc19zaXplID0gbF9ub2RlX3NpemU7CiAgICAgICAgIH0KKyAgICAgICAgbF9ub2RlID0gcF90cmVlLT5ub2RlczsKKyAgICAgICAgbF9wYXJlbnRfbm9kZSA9ICZwX3RyZWUtPm5vZGVzW3BfdHJlZS0+bnVtbGVhZnNoICogcF90cmVlLT5udW1sZWFmc3ZdOworICAgICAgICBsX3BhcmVudF9ub2RlMCA9IGxfcGFyZW50X25vZGU7CiAKLSAgICAgICAgaWYgKChwX3RyZWUtPm51bWxlYWZzaCAhPSBwX251bV9sZWFmc19oKSB8fCAocF90cmVlLT5udW1sZWFmc3YgIT0gcF9udW1fbGVhZnNfdikpIHsKLSAgICAgICAgICAgICAgICBwX3RyZWUtPm51bWxlYWZzaCA9IHBfbnVtX2xlYWZzX2g7Ci0gICAgICAgICAgICAgICAgcF90cmVlLT5udW1sZWFmc3YgPSBwX251bV9sZWFmc192OwotCi0gICAgICAgICAgICAgICAgbF9udW1fbGV2ZWxzID0gMDsKLSAgICAgICAgICAgICAgICBsX25wbGhbMF0gPSAoT1BKX0lOVDMyKXBfbnVtX2xlYWZzX2g7Ci0gICAgICAgICAgICAgICAgbF9ucGx2WzBdID0gKE9QSl9JTlQzMilwX251bV9sZWFmc192OwotICAgICAgICAgICAgICAgIHBfdHJlZS0+bnVtbm9kZXMgPSAwOwotICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbiA9IChPUEpfVUlOVDMyKShsX25wbGhbbF9udW1fbGV2ZWxzXSAqIGxfbnBsdltsX251bV9sZXZlbHNdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfbnBsaFtsX251bV9sZXZlbHMgKyAxXSA9IChsX25wbGhbbF9udW1fbGV2ZWxzXSArIDEpIC8gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxfbnBsdltsX251bV9sZXZlbHMgKyAxXSA9IChsX25wbHZbbF9udW1fbGV2ZWxzXSArIDEpIC8gMjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBfdHJlZS0+bnVtbm9kZXMgKz0gbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICsrbF9udW1fbGV2ZWxzOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbF9udW1fbGV2ZWxzIC0gMTsgKytpKSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbF9ucGx2W2ldOyArK2opIHsKKyAgICAgICAgICAgICAgICBrID0gbF9ucGxoW2ldOworICAgICAgICAgICAgICAgIHdoaWxlICgtLWsgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBsX25vZGUtPnBhcmVudCA9IGxfcGFyZW50X25vZGU7CisgICAgICAgICAgICAgICAgICAgICsrbF9ub2RlOworICAgICAgICAgICAgICAgICAgICBpZiAoLS1rID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxfbm9kZS0+cGFyZW50ID0gbF9wYXJlbnRfbm9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrbF9ub2RlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrbF9wYXJlbnRfbm9kZTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2hpbGUgKG4gPiAxKTsKLQotICAgICAgICAgICAgICAgIC8qIEFERCAqLwotICAgICAgICAgICAgICAgIGlmIChwX3RyZWUtPm51bW5vZGVzID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Z3RfZGVzdHJveShwX3RyZWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAwOworICAgICAgICAgICAgICAgIGlmICgoaiAmIDEpIHx8IGogPT0gbF9ucGx2W2ldIC0gMSkgeworICAgICAgICAgICAgICAgICAgICBsX3BhcmVudF9ub2RlMCA9IGxfcGFyZW50X25vZGU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbF9wYXJlbnRfbm9kZSA9IGxfcGFyZW50X25vZGUwOworICAgICAgICAgICAgICAgICAgICBsX3BhcmVudF9ub2RlMCArPSBsX25wbGhbaV07CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxfbm9kZV9zaXplID0gcF90cmVlLT5udW1ub2RlcyAqIChPUEpfVUlOVDMyKXNpemVvZihvcGpfdGd0X25vZGVfdCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgaWYgKGxfbm9kZV9zaXplID4gcF90cmVlLT5ub2Rlc19zaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcGpfdGd0X25vZGVfdCogbmV3X25vZGVzID0gKG9wal90Z3Rfbm9kZV90Kikgb3BqX3JlYWxsb2MocF90cmVlLT5ub2RlcywgbF9ub2RlX3NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEgbmV3X25vZGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tc2cocF9tYW5hZ2VyLCBFVlRfRVJST1IsICJOb3QgZW5vdWdoIG1lbW9yeSB0byByZWluaXRpYWxpemUgdGhlIHRhZyB0cmVlXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RndF9kZXN0cm95KHBfdHJlZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBfdHJlZS0+bm9kZXMgPSBuZXdfbm9kZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKChjaGFyICopIHBfdHJlZS0+bm9kZXMpICsgcF90cmVlLT5ub2Rlc19zaXplLCAwICwgbF9ub2RlX3NpemUgLSBwX3RyZWUtPm5vZGVzX3NpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcF90cmVlLT5ub2Rlc19zaXplID0gbF9ub2RlX3NpemU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxfbm9kZSA9IHBfdHJlZS0+bm9kZXM7Ci0gICAgICAgICAgICAgICAgbF9wYXJlbnRfbm9kZSA9ICZwX3RyZWUtPm5vZGVzW3BfdHJlZS0+bnVtbGVhZnNoICogcF90cmVlLT5udW1sZWFmc3ZdOwotICAgICAgICAgICAgICAgIGxfcGFyZW50X25vZGUwID0gbF9wYXJlbnRfbm9kZTsKLQotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsX251bV9sZXZlbHMgLSAxOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBsX25wbHZbaV07ICsraikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrID0gbF9ucGxoW2ldOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoLS1rID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX25vZGUtPnBhcmVudCA9IGxfcGFyZW50X25vZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX25vZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tayA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX25vZGUtPnBhcmVudCA9IGxfcGFyZW50X25vZGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xfbm9kZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsX3BhcmVudF9ub2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChqICYgMSkgfHwgaiA9PSBsX25wbHZbaV0gLSAxKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9wYXJlbnRfbm9kZTAgPSBsX3BhcmVudF9ub2RlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfcGFyZW50X25vZGUgPSBsX3BhcmVudF9ub2RlMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3BhcmVudF9ub2RlMCArPSBsX25wbGhbaV07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbF9ub2RlLT5wYXJlbnQgPSAwOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG9wal90Z3RfcmVzZXQocF90cmVlKTsKKyAgICAgICAgbF9ub2RlLT5wYXJlbnQgPSAwOworICAgIH0KKyAgICBvcGpfdGd0X3Jlc2V0KHBfdHJlZSk7CiAKLSAgICAgICAgcmV0dXJuIHBfdHJlZTsKKyAgICByZXR1cm4gcF90cmVlOwogfQogCiB2b2lkIG9wal90Z3RfZGVzdHJveShvcGpfdGd0X3RyZWVfdCAqcF90cmVlKQogewotICAgICAgICBpZiAoISBwX3RyZWUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICBpZiAoISBwX3RyZWUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgICAgICBpZiAocF90cmVlLT5ub2RlcykgewotICAgICAgICAgICAgICAgIG9wal9mcmVlKHBfdHJlZS0+bm9kZXMpOwotICAgICAgICAgICAgICAgIHBfdHJlZS0+bm9kZXMgPSAwMDsKLSAgICAgICAgfQotICAgICAgICBvcGpfZnJlZShwX3RyZWUpOworICAgIGlmIChwX3RyZWUtPm5vZGVzKSB7CisgICAgICAgIG9wal9mcmVlKHBfdHJlZS0+bm9kZXMpOworICAgICAgICBwX3RyZWUtPm5vZGVzID0gMDA7CisgICAgfQorICAgIG9wal9mcmVlKHBfdHJlZSk7CiB9CiAKLXZvaWQgb3BqX3RndF9yZXNldChvcGpfdGd0X3RyZWVfdCAqcF90cmVlKSB7Ci0gICAgICAgIE9QSl9VSU5UMzIgaTsKLSAgICAgICAgb3BqX3RndF9ub2RlX3QgKiBsX2N1cnJlbnRfbm9kZSA9IDAwOzsKK3ZvaWQgb3BqX3RndF9yZXNldChvcGpfdGd0X3RyZWVfdCAqcF90cmVlKQoreworICAgIE9QSl9VSU5UMzIgaTsKKyAgICBvcGpfdGd0X25vZGVfdCAqIGxfY3VycmVudF9ub2RlID0gMDA7OwogCi0gICAgICAgIGlmICghIHBfdHJlZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQorICAgIGlmICghIHBfdHJlZSkgeworICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAgICAgIGxfY3VycmVudF9ub2RlID0gcF90cmVlLT5ub2RlczsKLSAgICAgICAgZm9yICAgICAoaSA9IDA7IGkgPCBwX3RyZWUtPm51bW5vZGVzOyArK2kpCi0gICAgICAgIHsKLSAgICAgICAgICAgICAgICBsX2N1cnJlbnRfbm9kZS0+dmFsdWUgPSA5OTk7Ci0gICAgICAgICAgICAgICAgbF9jdXJyZW50X25vZGUtPmxvdyA9IDA7Ci0gICAgICAgICAgICAgICAgbF9jdXJyZW50X25vZGUtPmtub3duID0gMDsKLSAgICAgICAgICAgICAgICArK2xfY3VycmVudF9ub2RlOwotICAgICAgICB9CisgICAgbF9jdXJyZW50X25vZGUgPSBwX3RyZWUtPm5vZGVzOworICAgIGZvciAoaSA9IDA7IGkgPCBwX3RyZWUtPm51bW5vZGVzOyArK2kpIHsKKyAgICAgICAgbF9jdXJyZW50X25vZGUtPnZhbHVlID0gOTk5OworICAgICAgICBsX2N1cnJlbnRfbm9kZS0+bG93ID0gMDsKKyAgICAgICAgbF9jdXJyZW50X25vZGUtPmtub3duID0gMDsKKyAgICAgICAgKytsX2N1cnJlbnRfbm9kZTsKKyAgICB9CiB9CiAKLXZvaWQgb3BqX3RndF9zZXR2YWx1ZShvcGpfdGd0X3RyZWVfdCAqdHJlZSwgT1BKX1VJTlQzMiBsZWFmbm8sIE9QSl9JTlQzMiB2YWx1ZSkgewotICAgICAgICBvcGpfdGd0X25vZGVfdCAqbm9kZTsKLSAgICAgICAgbm9kZSA9ICZ0cmVlLT5ub2Rlc1tsZWFmbm9dOwotICAgICAgICB3aGlsZSAobm9kZSAmJiBub2RlLT52YWx1ZSA+IHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgbm9kZS0+dmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBub2RlID0gbm9kZS0+cGFyZW50OwotICAgICAgICB9Cit2b2lkIG9wal90Z3Rfc2V0dmFsdWUob3BqX3RndF90cmVlX3QgKnRyZWUsIE9QSl9VSU5UMzIgbGVhZm5vLCBPUEpfSU5UMzIgdmFsdWUpCit7CisgICAgb3BqX3RndF9ub2RlX3QgKm5vZGU7CisgICAgbm9kZSA9ICZ0cmVlLT5ub2Rlc1tsZWFmbm9dOworICAgIHdoaWxlIChub2RlICYmIG5vZGUtPnZhbHVlID4gdmFsdWUpIHsKKyAgICAgICAgbm9kZS0+dmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgbm9kZSA9IG5vZGUtPnBhcmVudDsKKyAgICB9CiB9CiAKLXZvaWQgb3BqX3RndF9lbmNvZGUob3BqX2Jpb190ICpiaW8sIG9wal90Z3RfdHJlZV90ICp0cmVlLCBPUEpfVUlOVDMyIGxlYWZubywgT1BKX0lOVDMyIHRocmVzaG9sZCkgewotICAgICAgICBvcGpfdGd0X25vZGVfdCAqc3RrWzMxXTsKLSAgICAgICAgb3BqX3RndF9ub2RlX3QgKipzdGtwdHI7Ci0gICAgICAgIG9wal90Z3Rfbm9kZV90ICpub2RlOwotICAgICAgICBPUEpfSU5UMzIgbG93Owordm9pZCBvcGpfdGd0X2VuY29kZShvcGpfYmlvX3QgKmJpbywgb3BqX3RndF90cmVlX3QgKnRyZWUsIE9QSl9VSU5UMzIgbGVhZm5vLAorICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgdGhyZXNob2xkKQoreworICAgIG9wal90Z3Rfbm9kZV90ICpzdGtbMzFdOworICAgIG9wal90Z3Rfbm9kZV90ICoqc3RrcHRyOworICAgIG9wal90Z3Rfbm9kZV90ICpub2RlOworICAgIE9QSl9JTlQzMiBsb3c7CiAKLSAgICAgICAgc3RrcHRyID0gc3RrOwotICAgICAgICBub2RlID0gJnRyZWUtPm5vZGVzW2xlYWZub107Ci0gICAgICAgIHdoaWxlIChub2RlLT5wYXJlbnQpIHsKLSAgICAgICAgICAgICAgICAqc3RrcHRyKysgPSBub2RlOwotICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLT5wYXJlbnQ7CisgICAgc3RrcHRyID0gc3RrOworICAgIG5vZGUgPSAmdHJlZS0+bm9kZXNbbGVhZm5vXTsKKyAgICB3aGlsZSAobm9kZS0+cGFyZW50KSB7CisgICAgICAgICpzdGtwdHIrKyA9IG5vZGU7CisgICAgICAgIG5vZGUgPSBub2RlLT5wYXJlbnQ7CisgICAgfQorCisgICAgbG93ID0gMDsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmIChsb3cgPiBub2RlLT5sb3cpIHsKKyAgICAgICAgICAgIG5vZGUtPmxvdyA9IGxvdzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvdyA9IG5vZGUtPmxvdzsKICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgbG93ID0gMDsKLSAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIGlmIChsb3cgPiBub2RlLT5sb3cpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPmxvdyA9IGxvdzsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbG93ID0gbm9kZS0+bG93OworCisgICAgICAgIHdoaWxlIChsb3cgPCB0aHJlc2hvbGQpIHsKKyAgICAgICAgICAgIGlmIChsb3cgPj0gbm9kZS0+dmFsdWUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW5vZGUtPmtub3duKSB7CisgICAgICAgICAgICAgICAgICAgIG9wal9iaW9fd3JpdGUoYmlvLCAxLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgbm9kZS0+a25vd24gPSAxOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAobG93IDwgdGhyZXNob2xkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobG93ID49IG5vZGUtPnZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbm9kZS0+a25vd24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGpfYmlvX3dyaXRlKGJpbywgMSwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS0+a25vd24gPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2Jpb193cml0ZShiaW8sIDAsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgKytsb3c7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG5vZGUtPmxvdyA9IGxvdzsKLSAgICAgICAgICAgICAgICBpZiAoc3RrcHRyID09IHN0aykKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIG5vZGUgPSAqLS1zdGtwdHI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcGpfYmlvX3dyaXRlKGJpbywgMCwgMSk7CisgICAgICAgICAgICArK2xvdzsKICAgICAgICAgfQorCisgICAgICAgIG5vZGUtPmxvdyA9IGxvdzsKKyAgICAgICAgaWYgKHN0a3B0ciA9PSBzdGspIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSAqLS1zdGtwdHI7CisgICAgfQogfQogCi1PUEpfVUlOVDMyIG9wal90Z3RfZGVjb2RlKG9wal9iaW9fdCAqYmlvLCBvcGpfdGd0X3RyZWVfdCAqdHJlZSwgT1BKX1VJTlQzMiBsZWFmbm8sIE9QSl9JTlQzMiB0aHJlc2hvbGQpIHsKLSAgICAgICAgb3BqX3RndF9ub2RlX3QgKnN0a1szMV07Ci0gICAgICAgIG9wal90Z3Rfbm9kZV90ICoqc3RrcHRyOwotICAgICAgICBvcGpfdGd0X25vZGVfdCAqbm9kZTsKLSAgICAgICAgT1BKX0lOVDMyIGxvdzsKK09QSl9VSU5UMzIgb3BqX3RndF9kZWNvZGUob3BqX2Jpb190ICpiaW8sIG9wal90Z3RfdHJlZV90ICp0cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxlYWZubywgT1BKX0lOVDMyIHRocmVzaG9sZCkKK3sKKyAgICBvcGpfdGd0X25vZGVfdCAqc3RrWzMxXTsKKyAgICBvcGpfdGd0X25vZGVfdCAqKnN0a3B0cjsKKyAgICBvcGpfdGd0X25vZGVfdCAqbm9kZTsKKyAgICBPUEpfSU5UMzIgbG93OwogCi0gICAgICAgIHN0a3B0ciA9IHN0azsKLSAgICAgICAgbm9kZSA9ICZ0cmVlLT5ub2Rlc1tsZWFmbm9dOwotICAgICAgICB3aGlsZSAobm9kZS0+cGFyZW50KSB7Ci0gICAgICAgICAgICAgICAgKnN0a3B0cisrID0gbm9kZTsKLSAgICAgICAgICAgICAgICBub2RlID0gbm9kZS0+cGFyZW50OworICAgIHN0a3B0ciA9IHN0azsKKyAgICBub2RlID0gJnRyZWUtPm5vZGVzW2xlYWZub107CisgICAgd2hpbGUgKG5vZGUtPnBhcmVudCkgeworICAgICAgICAqc3RrcHRyKysgPSBub2RlOworICAgICAgICBub2RlID0gbm9kZS0+cGFyZW50OworICAgIH0KKworICAgIGxvdyA9IDA7CisgICAgZm9yICg7OykgeworICAgICAgICBpZiAobG93ID4gbm9kZS0+bG93KSB7CisgICAgICAgICAgICBub2RlLT5sb3cgPSBsb3c7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb3cgPSBub2RlLT5sb3c7CiAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGxvdyA9IDA7Ci0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgICAgICBpZiAobG93ID4gbm9kZS0+bG93KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub2RlLT5sb3cgPSBsb3c7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvdyA9IG5vZGUtPmxvdzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgd2hpbGUgKGxvdyA8IHRocmVzaG9sZCAmJiBsb3cgPCBub2RlLT52YWx1ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wal9iaW9fcmVhZChiaW8sIDEpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUtPnZhbHVlID0gbG93OwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytsb3c7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5vZGUtPmxvdyA9IGxvdzsKLSAgICAgICAgICAgICAgICBpZiAoc3RrcHRyID09IHN0aykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5vZGUgPSAqLS1zdGtwdHI7CisgICAgICAgIHdoaWxlIChsb3cgPCB0aHJlc2hvbGQgJiYgbG93IDwgbm9kZS0+dmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChvcGpfYmlvX3JlYWQoYmlvLCAxKSkgeworICAgICAgICAgICAgICAgIG5vZGUtPnZhbHVlID0gbG93OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2xvdzsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIChub2RlLT52YWx1ZSA8IHRocmVzaG9sZCkgPyAxIDogMDsKKyAgICAgICAgbm9kZS0+bG93ID0gbG93OworICAgICAgICBpZiAoc3RrcHRyID09IHN0aykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbm9kZSA9ICotLXN0a3B0cjsKKyAgICB9CisKKyAgICByZXR1cm4gKG5vZGUtPnZhbHVlIDwgdGhyZXNob2xkKSA/IDEgOiAwOwogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Z3QuaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGd0LmgKaW5kZXggMTAyMjM4MC4uOTgxODIwOCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90Z3QuaAorKysgYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3RndC5oCkBAIC0xLDYgKzEsNiBAQAogLyoKLSAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzIAotICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkIAorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZAogICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cwogICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgogICoKQEAgLTgsMTEgKzgsMTEgQEAKICAqIENvcHlyaWdodCAoYykgMjAwMi0yMDE0LCBQcm9mZXNzb3IgQmVub2l0IE1hY3EKICAqIENvcHlyaWdodCAoYykgMjAwMS0yMDAzLCBEYXZpZCBKYW5zc2VucwogICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDMsIFlhbm5pY2sgVmVyc2NodWVyZW4KLSAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eCAKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA3LCBGcmFuY29pcy1PbGl2aWVyIERldmF1eAogICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMTQsIEFudG9uaW4gRGVzY2FtcGUKICAqIENvcHlyaWdodCAoYykgMjAwNSwgSGVydmUgRHJvbG9uLCBGcmVlSW1hZ2UgVGVhbQogICogQ29weXJpZ2h0IChjKSAyMDA4LCBKZXJvbWUgRmltZXMsIENvbW11bmljYXRpb25zICYgU3lzdGVtZXMgPGplcm9tZS5maW1lc0BjLXMuZnI+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMTEtMjAxMiwgQ2VudHJlIE5hdGlvbmFsIGQnRXR1ZGVzIFNwYXRpYWxlcyAoQ05FUyksIEZyYW5jZSAKKyAqIENvcHlyaWdodCAoYykgMjAxMS0yMDEyLCBDZW50cmUgTmF0aW9uYWwgZCdFdHVkZXMgU3BhdGlhbGVzIChDTkVTKSwgRnJhbmNlCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIENTIFN5c3RlbWVzIGQnSW5mb3JtYXRpb24sIEZyYW5jZQogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCkBAIC0zOCw4ICszOCw4IEBACiAgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCi0jaWZuZGVmIF9fVEdUX0gKLSNkZWZpbmUgX19UR1RfSAorI2lmbmRlZiBPUEpfVEdUX0gKKyNkZWZpbmUgT1BKX1RHVF9ICiAvKioKIEBmaWxlIHRndC5oCiBAYnJpZWYgSW1wbGVtZW50YXRpb24gb2YgYSB0YWctdHJlZSBjb2RlciAoVEdUKQpAQCAtNjQsMTMgKzY0LDEyIEBACiAvKioKIFRhZyB0cmVlCiAqLwotdHlwZWRlZiBzdHJ1Y3Qgb3BqX3RndF90cmVlCi17Ci0JT1BKX1VJTlQzMiAgbnVtbGVhZnNoOwotCU9QSl9VSU5UMzIgIG51bWxlYWZzdjsKLQlPUEpfVUlOVDMyIG51bW5vZGVzOwotCW9wal90Z3Rfbm9kZV90ICpub2RlczsKLQlPUEpfVUlOVDMyICBub2Rlc19zaXplOwkJLyogbWF4aW11bSBzaXplIHRha2VuIGJ5IG5vZGVzICovCit0eXBlZGVmIHN0cnVjdCBvcGpfdGd0X3RyZWUgeworICAgIE9QSl9VSU5UMzIgIG51bWxlYWZzaDsKKyAgICBPUEpfVUlOVDMyICBudW1sZWFmc3Y7CisgICAgT1BKX1VJTlQzMiBudW1ub2RlczsKKyAgICBvcGpfdGd0X25vZGVfdCAqbm9kZXM7CisgICAgT1BKX1VJTlQzMiAgbm9kZXNfc2l6ZTsgICAgIC8qIG1heGltdW0gc2l6ZSB0YWtlbiBieSBub2RlcyAqLwogfSBvcGpfdGd0X3RyZWVfdDsKIAogCkBAIC04MSwyMSArODAsMjMgQEAKIENyZWF0ZSBhIHRhZy10cmVlCiBAcGFyYW0gbnVtbGVhZnNoIFdpZHRoIG9mIHRoZSBhcnJheSBvZiBsZWFmcyBvZiB0aGUgdHJlZQogQHBhcmFtIG51bWxlYWZzdiBIZWlnaHQgb2YgdGhlIGFycmF5IG9mIGxlYWZzIG9mIHRoZSB0cmVlCitAcGFyYW0gcF9tYW5hZ2VyIHRoZSBldmVudCBtYW5hZ2VyCiBAcmV0dXJuIFJldHVybnMgYSBuZXcgdGFnLXRyZWUgaWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIG90aGVyd2lzZQogKi8KLW9wal90Z3RfdHJlZV90ICpvcGpfdGd0X2NyZWF0ZShPUEpfVUlOVDMyIG51bWxlYWZzaCwgT1BKX1VJTlQzMiBudW1sZWFmc3YsIG9wal9ldmVudF9tZ3JfdCAqbWFuYWdlcik7CitvcGpfdGd0X3RyZWVfdCAqb3BqX3RndF9jcmVhdGUoT1BKX1VJTlQzMiBudW1sZWFmc2gsIE9QSl9VSU5UMzIgbnVtbGVhZnN2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wal9ldmVudF9tZ3JfdCAqcF9tYW5hZ2VyKTsKIAogLyoqCiAgKiBSZWluaXRpYWxpc2VzIGEgdGFnLXRyZWUgZnJvbSBhbiBleGl4dGluZyBvbmUuCiAgKgotICogQHBhcmFtCXBfdHJlZQkJCQl0aGUgdHJlZSB0byByZWluaXRpYWxpemUuCi0gKiBAcGFyYW0JcF9udW1fbGVhZnNfaAkJdGhlIHdpZHRoIG9mIHRoZSBhcnJheSBvZiBsZWFmcyBvZiB0aGUgdHJlZQotICogQHBhcmFtCXBfbnVtX2xlYWZzX3YJCXRoZSBoZWlnaHQgb2YgdGhlIGFycmF5IG9mIGxlYWZzIG9mIHRoZSB0cmVlCisgKiBAcGFyYW0gICBwX3RyZWUgICAgICAgICAgICAgIHRoZSB0cmVlIHRvIHJlaW5pdGlhbGl6ZS4KKyAqIEBwYXJhbSAgIHBfbnVtX2xlYWZzX2ggICAgICAgdGhlIHdpZHRoIG9mIHRoZSBhcnJheSBvZiBsZWFmcyBvZiB0aGUgdHJlZQorICogQHBhcmFtICAgcF9udW1fbGVhZnNfdiAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBhcnJheSBvZiBsZWFmcyBvZiB0aGUgdHJlZQogICogQHBhcmFtIHBfbWFuYWdlciAgICAgICB0aGUgZXZlbnQgbWFuYWdlcgotICogQHJldHVybglhIG5ldyB0YWctdHJlZSBpZiBzdWNjZXNzZnVsLCBOVUxMIG90aGVyd2lzZQorICogQHJldHVybiAgYSBuZXcgdGFnLXRyZWUgaWYgc3VjY2Vzc2Z1bCwgTlVMTCBvdGhlcndpc2UKICovCi1vcGpfdGd0X3RyZWVfdCAqb3BqX3RndF9pbml0KG9wal90Z3RfdHJlZV90ICogcF90cmVlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiAgcF9udW1fbGVhZnNfaCwgCitvcGpfdGd0X3RyZWVfdCAqb3BqX3RndF9pbml0KG9wal90Z3RfdHJlZV90ICogcF90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICBwX251bV9sZWFmc19oLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyICBwX251bV9sZWFmc192LCBvcGpfZXZlbnRfbWdyX3QgKnBfbWFuYWdlcik7CiAvKioKIERlc3Ryb3kgYSB0YWctdHJlZSwgbGliZXJhdGluZyBtZW1vcnkKQEAgLTExMyw4ICsxMTQsOCBAQAogQHBhcmFtIGxlYWZubyBOdW1iZXIgdGhhdCBpZGVudGlmaWVzIHRoZSBsZWFmIHRvIG1vZGlmeQogQHBhcmFtIHZhbHVlIE5ldyB2YWx1ZSBvZiB0aGUgbGVhZgogKi8KLXZvaWQgb3BqX3RndF9zZXR2YWx1ZShvcGpfdGd0X3RyZWVfdCAqdHJlZSwgCi0gICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsZWFmbm8sIAordm9pZCBvcGpfdGd0X3NldHZhbHVlKG9wal90Z3RfdHJlZV90ICp0cmVlLAorICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGVhZm5vLAogICAgICAgICAgICAgICAgICAgICAgIE9QSl9JTlQzMiB2YWx1ZSk7CiAvKioKIEVuY29kZSB0aGUgdmFsdWUgb2YgYSBsZWFmIG9mIHRoZSB0YWctdHJlZSB1cCB0byBhIGdpdmVuIHRocmVzaG9sZApAQCAtMTIzLDkgKzEyNCw5IEBACiBAcGFyYW0gbGVhZm5vIE51bWJlciB0aGF0IGlkZW50aWZpZXMgdGhlIGxlYWYgdG8gZW5jb2RlCiBAcGFyYW0gdGhyZXNob2xkIFRocmVzaG9sZCB0byB1c2Ugd2hlbiBlbmNvZGluZyB2YWx1ZSBvZiB0aGUgbGVhZgogKi8KLXZvaWQgb3BqX3RndF9lbmNvZGUob3BqX2Jpb190ICpiaW8sIAotICAgICAgICAgICAgICAgICAgICBvcGpfdGd0X3RyZWVfdCAqdHJlZSwgCi0gICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGVhZm5vLCAKK3ZvaWQgb3BqX3RndF9lbmNvZGUob3BqX2Jpb190ICpiaW8sCisgICAgICAgICAgICAgICAgICAgIG9wal90Z3RfdHJlZV90ICp0cmVlLAorICAgICAgICAgICAgICAgICAgICBPUEpfVUlOVDMyIGxlYWZubywKICAgICAgICAgICAgICAgICAgICAgT1BKX0lOVDMyIHRocmVzaG9sZCk7CiAvKioKIERlY29kZSB0aGUgdmFsdWUgb2YgYSBsZWFmIG9mIHRoZSB0YWctdHJlZSB1cCB0byBhIGdpdmVuIHRocmVzaG9sZApAQCAtMTM1LDEzICsxMzYsMTMgQEAKIEBwYXJhbSB0aHJlc2hvbGQgVGhyZXNob2xkIHRvIHVzZSB3aGVuIGRlY29kaW5nIHZhbHVlIG9mIHRoZSBsZWFmCiBAcmV0dXJuIFJldHVybnMgMSBpZiB0aGUgbm9kZSdzIHZhbHVlIDwgdGhyZXNob2xkLCByZXR1cm5zIDAgb3RoZXJ3aXNlCiAqLwotT1BKX1VJTlQzMiBvcGpfdGd0X2RlY29kZShvcGpfYmlvX3QgKmJpbywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9wal90Z3RfdHJlZV90ICp0cmVlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgT1BKX1VJTlQzMiBsZWFmbm8sIAorT1BKX1VJTlQzMiBvcGpfdGd0X2RlY29kZShvcGpfYmlvX3QgKmJpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RndF90cmVlX3QgKnRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE9QSl9VSU5UMzIgbGVhZm5vLAogICAgICAgICAgICAgICAgICAgICAgICAgICBPUEpfSU5UMzIgdGhyZXNob2xkKTsKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKkB9Ki8KIAogLypAfSovCiAKLSNlbmRpZiAvKiBfX1RHVF9IICovCisjZW5kaWYgLyogT1BKX1RHVF9IICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3RocmVhZC5jIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90aHJlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjMzYzJjCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90aHJlYWQuYwpAQCAtMCwwICsxLDk1MiBAQAorLyoKKyAqIFRoZSBjb3B5cmlnaHQgaW4gdGhpcyBzb2Z0d2FyZSBpcyBiZWluZyBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgMi1jbGF1c2VzCisgKiBCU0QgTGljZW5zZSwgaW5jbHVkZWQgYmVsb3cuIFRoaXMgc29mdHdhcmUgbWF5IGJlIHN1YmplY3QgdG8gb3RoZXIgdGhpcmQKKyAqIHBhcnR5IGFuZCBjb250cmlidXRvciByaWdodHMsIGluY2x1ZGluZyBwYXRlbnQgcmlnaHRzLCBhbmQgbm8gc3VjaCByaWdodHMKKyAqIGFyZSBncmFudGVkIHVuZGVyIHRoaXMgbGljZW5zZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIEV2ZW4gUm91YXVsdAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTIGBBUyBJUycKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFCisgKiBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpZmRlZiBNVVRFWF93aW4zMgorCisvKiBTb21lIHZlcnNpb25zIG9mIHg4Nl82NC13NjQtbWluZ3czMi1nYyAtbTMyIHJlc29sdmUgSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoKSAqLworLyogYXMgX19zeW5jX3ZhbF9jb21wYXJlX2FuZF9zd2FwXzQgYnV0IGZhaWxzIHRvIGxpbmsgaXQuIEFzIHRoaXMgcHJvdGVjdHMgYWdhaW5zdCAqLworLyogYSByYXRoZXIgdW5saWtlbHkgcmFjZSwgc2tpcCBpdCAqLworI2lmICEoZGVmaW5lZChfX01JTkdXMzJfXykgJiYgZGVmaW5lZChfX2kzODZfXykpCisjZGVmaW5lIEhBVkVfSU5URVJMT0NLRURfQ09NUEFSRV9FWENIQU5HRSAxCisjZW5kaWYKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxwcm9jZXNzLmg+CisKKyNpbmNsdWRlICJvcGpfaW5jbHVkZXMuaCIKKworT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9oYXNfdGhyZWFkX3N1cHBvcnQodm9pZCkKK3sKKyAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK2ludCBPUEpfQ0FMTENPTlYgb3BqX2dldF9udW1fY3B1cyh2b2lkKQoreworICAgIFNZU1RFTV9JTkZPIGluZm87CisgICAgRFdPUkQgZHdOdW07CisgICAgR2V0U3lzdGVtSW5mbygmaW5mbyk7CisgICAgZHdOdW0gPSBpbmZvLmR3TnVtYmVyT2ZQcm9jZXNzb3JzOworICAgIGlmIChkd051bSA8IDEpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAoaW50KWR3TnVtOworfQorCitzdHJ1Y3Qgb3BqX211dGV4X3QgeworICAgIENSSVRJQ0FMX1NFQ1RJT04gY3M7Cit9OworCitvcGpfbXV0ZXhfdCogb3BqX211dGV4X2NyZWF0ZSh2b2lkKQoreworICAgIG9wal9tdXRleF90KiBtdXRleCA9IChvcGpfbXV0ZXhfdCopIG9wal9tYWxsb2Moc2l6ZW9mKG9wal9tdXRleF90KSk7CisgICAgaWYgKCFtdXRleCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkFuZFNwaW5Db3VudCgmKG11dGV4LT5jcyksIDQwMDApOworICAgIHJldHVybiBtdXRleDsKK30KKwordm9pZCBvcGpfbXV0ZXhfbG9jayhvcGpfbXV0ZXhfdCogbXV0ZXgpCit7CisgICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJihtdXRleC0+Y3MpKTsKK30KKwordm9pZCBvcGpfbXV0ZXhfdW5sb2NrKG9wal9tdXRleF90KiBtdXRleCkKK3sKKyAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmKG11dGV4LT5jcykpOworfQorCit2b2lkIG9wal9tdXRleF9kZXN0cm95KG9wal9tdXRleF90KiBtdXRleCkKK3sKKyAgICBpZiAoIW11dGV4KSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCYobXV0ZXgtPmNzKSk7CisgICAgb3BqX2ZyZWUobXV0ZXgpOworfQorCitzdHJ1Y3Qgb3BqX2NvbmRfd2FpdGVyX2xpc3RfdCB7CisgICAgSEFORExFIGhFdmVudDsKKyAgICBzdHJ1Y3Qgb3BqX2NvbmRfd2FpdGVyX2xpc3RfdCogbmV4dDsKK307Cit0eXBlZGVmIHN0cnVjdCBvcGpfY29uZF93YWl0ZXJfbGlzdF90IG9wal9jb25kX3dhaXRlcl9saXN0X3Q7CisKK3N0cnVjdCBvcGpfY29uZF90IHsKKyAgICBvcGpfbXV0ZXhfdCAgICAgICAgICAgICAqaW50ZXJuYWxfbXV0ZXg7CisgICAgb3BqX2NvbmRfd2FpdGVyX2xpc3RfdCAgKndhaXRlcl9saXN0OworfTsKKworc3RhdGljIERXT1JEIFRMU0tleSA9IDA7CitzdGF0aWMgdm9sYXRpbGUgTE9ORyBpblRMU0xvY2tlZFNlY3Rpb24gPSAwOworc3RhdGljIHZvbGF0aWxlIGludCBUTFNLZXlJbml0ID0gT1BKX0ZBTFNFOworCitvcGpfY29uZF90KiBvcGpfY29uZF9jcmVhdGUodm9pZCkKK3sKKyAgICBvcGpfY29uZF90KiBjb25kID0gKG9wal9jb25kX3QqKSBvcGpfbWFsbG9jKHNpemVvZihvcGpfY29uZF90KSk7CisgICAgaWYgKCFjb25kKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIC8qIE1ha2Ugc3VyZSB0aGF0IHRoZSBUTFMga2V5IGlzIGFsbG9jYXRlZCBpbiBhIHRocmVhZC1zYWZlIHdheSAqLworICAgIC8qIFdlIGNhbm5vdCB1c2UgYSBnbG9iYWwgbXV0ZXgvY3JpdGljYWwgc2VjdGlvbiBzaW5jZSBpdHMgY3JlYXRpb24gaXRzZWxmIHdvdWxkIG5vdCBiZSAqLworICAgIC8qIHRocmVhZC1zYWZlLCBzbyB1c2UgSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UgdHJpY2sgKi8KKyAgICB3aGlsZSAoT1BKX1RSVUUpIHsKKworI2lmIEhBVkVfSU5URVJMT0NLRURfQ09NUEFSRV9FWENIQU5HRQorICAgICAgICBpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoJmluVExTTG9ja2VkU2VjdGlvbiwgMSwgMCkgPT0gMCkKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIVRMU0tleUluaXQpIHsKKyAgICAgICAgICAgICAgICBUTFNLZXkgPSBUbHNBbGxvYygpOworICAgICAgICAgICAgICAgIFRMU0tleUluaXQgPSBPUEpfVFJVRTsKKyAgICAgICAgICAgIH0KKyNpZiBIQVZFX0lOVEVSTE9DS0VEX0NPTVBBUkVfRVhDSEFOR0UKKyAgICAgICAgICAgIEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlKCZpblRMU0xvY2tlZFNlY3Rpb24sIDAsIDEpOworI2VuZGlmCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChUTFNLZXkgPT0gVExTX09VVF9PRl9JTkRFWEVTKSB7CisgICAgICAgIG9wal9mcmVlKGNvbmQpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgY29uZC0+aW50ZXJuYWxfbXV0ZXggPSBvcGpfbXV0ZXhfY3JlYXRlKCk7CisgICAgaWYgKGNvbmQtPmludGVybmFsX211dGV4ID09IE5VTEwpIHsKKyAgICAgICAgb3BqX2ZyZWUoY29uZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBjb25kLT53YWl0ZXJfbGlzdCA9IE5VTEw7CisgICAgcmV0dXJuIGNvbmQ7Cit9CisKK3ZvaWQgb3BqX2NvbmRfd2FpdChvcGpfY29uZF90KiBjb25kLCBvcGpfbXV0ZXhfdCogbXV0ZXgpCit7CisgICAgb3BqX2NvbmRfd2FpdGVyX2xpc3RfdCogaXRlbTsKKyAgICBIQU5ETEUgaEV2ZW50ID0gKEhBTkRMRSkgVGxzR2V0VmFsdWUoVExTS2V5KTsKKyAgICBpZiAoaEV2ZW50ID09IE5VTEwpIHsKKyAgICAgICAgaEV2ZW50ID0gQ3JlYXRlRXZlbnQoTlVMTCwgLyogc2VjdXJpdHkgYXR0cmlidXRlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAvKiBtYW51YWwgcmVzZXQgPSBubyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAvKiBpbml0aWFsIHN0YXRlID0gdW5zaWduYWxlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMICAvKiBubyBuYW1lICovKTsKKyAgICAgICAgYXNzZXJ0KGhFdmVudCk7CisKKyAgICAgICAgVGxzU2V0VmFsdWUoVExTS2V5LCBoRXZlbnQpOworICAgIH0KKworICAgIC8qIEluc2VydCB0aGUgd2FpdGVyIGludG8gdGhlIHdhaXRlciBsaXN0IG9mIHRoZSBjb25kaXRpb24gKi8KKyAgICBvcGpfbXV0ZXhfbG9jayhjb25kLT5pbnRlcm5hbF9tdXRleCk7CisKKyAgICBpdGVtID0gKG9wal9jb25kX3dhaXRlcl9saXN0X3QqKW9wal9tYWxsb2Moc2l6ZW9mKG9wal9jb25kX3dhaXRlcl9saXN0X3QpKTsKKyAgICBhc3NlcnQoaXRlbSAhPSBOVUxMKTsKKworICAgIGl0ZW0tPmhFdmVudCA9IGhFdmVudDsKKyAgICBpdGVtLT5uZXh0ID0gY29uZC0+d2FpdGVyX2xpc3Q7CisKKyAgICBjb25kLT53YWl0ZXJfbGlzdCA9IGl0ZW07CisKKyAgICBvcGpfbXV0ZXhfdW5sb2NrKGNvbmQtPmludGVybmFsX211dGV4KTsKKworICAgIC8qIFJlbGVhc2UgdGhlIGNsaWVudCBtdXRleCBiZWZvcmUgd2FpdGluZyBmb3IgdGhlIGV2ZW50IGJlaW5nIHNpZ25hbGVkICovCisgICAgb3BqX211dGV4X3VubG9jayhtdXRleCk7CisKKyAgICAvKiBJZGVhbGx5IHdlIHdvdWxkIGNoZWNrIHRoYXQgd2UgZG8gbm90IGdldCBXQUlUX0ZBSUxFRCBidXQgaXQgaXMgaGFyZCAqLworICAgIC8qIHRvIHJlcG9ydCBhIGZhaWx1cmUuICovCisgICAgV2FpdEZvclNpbmdsZU9iamVjdChoRXZlbnQsIElORklOSVRFKTsKKworICAgIC8qIFJlYWNxdWlyZSB0aGUgY2xpZW50IG11dGV4ICovCisgICAgb3BqX211dGV4X2xvY2sobXV0ZXgpOworfQorCit2b2lkIG9wal9jb25kX3NpZ25hbChvcGpfY29uZF90KiBjb25kKQoreworICAgIG9wal9jb25kX3dhaXRlcl9saXN0X3QqIHBzSXRlcjsKKworICAgIC8qIFNpZ25hbCB0aGUgZmlyc3QgcmVnaXN0ZXJlZCBldmVudCwgYW5kIHJlbW92ZSBpdCBmcm9tIHRoZSBsaXN0ICovCisgICAgb3BqX211dGV4X2xvY2soY29uZC0+aW50ZXJuYWxfbXV0ZXgpOworCisgICAgcHNJdGVyID0gY29uZC0+d2FpdGVyX2xpc3Q7CisgICAgaWYgKHBzSXRlciAhPSBOVUxMKSB7CisgICAgICAgIFNldEV2ZW50KHBzSXRlci0+aEV2ZW50KTsKKyAgICAgICAgY29uZC0+d2FpdGVyX2xpc3QgPSBwc0l0ZXItPm5leHQ7CisgICAgICAgIG9wal9mcmVlKHBzSXRlcik7CisgICAgfQorCisgICAgb3BqX211dGV4X3VubG9jayhjb25kLT5pbnRlcm5hbF9tdXRleCk7Cit9CisKK3ZvaWQgb3BqX2NvbmRfZGVzdHJveShvcGpfY29uZF90KiBjb25kKQoreworICAgIGlmICghY29uZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG9wal9tdXRleF9kZXN0cm95KGNvbmQtPmludGVybmFsX211dGV4KTsKKyAgICBhc3NlcnQoY29uZC0+d2FpdGVyX2xpc3QgPT0gTlVMTCk7CisgICAgb3BqX2ZyZWUoY29uZCk7Cit9CisKK3N0cnVjdCBvcGpfdGhyZWFkX3QgeworICAgIG9wal90aHJlYWRfZm4gdGhyZWFkX2ZuOworICAgIHZvaWQqIHVzZXJfZGF0YTsKKyAgICBIQU5ETEUgaFRocmVhZDsKK307CisKK3Vuc2lnbmVkIGludCBfX3N0ZGNhbGwgb3BqX3RocmVhZF9jYWxsYmFja19hZGFwdGVyKHZvaWQgKmluZm8pCit7CisgICAgb3BqX3RocmVhZF90KiB0aHJlYWQgPSAob3BqX3RocmVhZF90KikgaW5mbzsKKyAgICBIQU5ETEUgaEV2ZW50ID0gTlVMTDsKKworICAgIHRocmVhZC0+dGhyZWFkX2ZuKHRocmVhZC0+dXNlcl9kYXRhKTsKKworICAgIC8qIEZyZWUgdGhlIGhhbmRsZSBwb3NzaWJsZSBhbGxvY2F0ZWQgYnkgYSBjb25kICovCisgICAgd2hpbGUgKE9QSl9UUlVFKSB7CisgICAgICAgIC8qIE1ha2Ugc3VyZSBUTFNLZXkgaXMgbm90IGJlaW5nIGNyZWF0ZWQganVzdCBhdCB0aGF0IG1vbWVudC4uLiAqLworI2lmIEhBVkVfSU5URVJMT0NLRURfQ09NUEFSRV9FWENIQU5HRQorICAgICAgICBpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoJmluVExTTG9ja2VkU2VjdGlvbiwgMSwgMCkgPT0gMCkKKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBpZiAoVExTS2V5SW5pdCkgeworICAgICAgICAgICAgICAgIGhFdmVudCA9IChIQU5ETEUpIFRsc0dldFZhbHVlKFRMU0tleSk7CisgICAgICAgICAgICB9CisjaWYgSEFWRV9JTlRFUkxPQ0tFRF9DT01QQVJFX0VYQ0hBTkdFCisgICAgICAgICAgICBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSgmaW5UTFNMb2NrZWRTZWN0aW9uLCAwLCAxKTsKKyNlbmRpZgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGhFdmVudCkgeworICAgICAgICBDbG9zZUhhbmRsZShoRXZlbnQpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitvcGpfdGhyZWFkX3QqIG9wal90aHJlYWRfY3JlYXRlKG9wal90aHJlYWRfZm4gdGhyZWFkX2ZuLCB2b2lkKiB1c2VyX2RhdGEpCit7CisgICAgb3BqX3RocmVhZF90KiB0aHJlYWQ7CisKKyAgICBhc3NlcnQodGhyZWFkX2ZuKTsKKworICAgIHRocmVhZCA9IChvcGpfdGhyZWFkX3QqKSBvcGpfbWFsbG9jKHNpemVvZihvcGpfdGhyZWFkX3QpKTsKKyAgICBpZiAoIXRocmVhZCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdGhyZWFkLT50aHJlYWRfZm4gPSB0aHJlYWRfZm47CisgICAgdGhyZWFkLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisKKyAgICB0aHJlYWQtPmhUaHJlYWQgPSAoSEFORExFKV9iZWdpbnRocmVhZGV4KE5VTEwsIDAsCisgICAgICAgICAgICAgICAgICAgICAgb3BqX3RocmVhZF9jYWxsYmFja19hZGFwdGVyLCB0aHJlYWQsIDAsIE5VTEwpOworCisgICAgaWYgKHRocmVhZC0+aFRocmVhZCA9PSBOVUxMKSB7CisgICAgICAgIG9wal9mcmVlKHRocmVhZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gdGhyZWFkOworfQorCit2b2lkIG9wal90aHJlYWRfam9pbihvcGpfdGhyZWFkX3QqIHRocmVhZCkKK3sKKyAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KHRocmVhZC0+aFRocmVhZCwgSU5GSU5JVEUpOworICAgIENsb3NlSGFuZGxlKHRocmVhZC0+aFRocmVhZCk7CisKKyAgICBvcGpfZnJlZSh0aHJlYWQpOworfQorCisjZWxpZiBNVVRFWF9wdGhyZWFkCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKy8qIE1vdmVkIGFmdGVyIGFsbCBzeXN0ZW0gaW5jbHVkZXMsIGFuZCBpbiBwYXJ0aWN1bGFyIHB0aHJlYWQuaCwgc28gYXMgdG8gKi8KKy8qIGF2b2lkIHBvaXNvbmluZyBpc3N1aW5nIHdpdGggbWFsbG9jKCkgdXNlIGluIHB0aHJlYWQuaCB3aXRoIHVsaWJjICgjMTAxMykgKi8KKyNpbmNsdWRlICJvcGpfaW5jbHVkZXMuaCIKKworT1BKX0JPT0wgT1BKX0NBTExDT05WIG9wal9oYXNfdGhyZWFkX3N1cHBvcnQodm9pZCkKK3sKKyAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKK2ludCBPUEpfQ0FMTENPTlYgb3BqX2dldF9udW1fY3B1cyh2b2lkKQoreworI2lmZGVmIF9TQ19OUFJPQ0VTU09SU19PTkxOCisgICAgcmV0dXJuIChpbnQpc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIHJldHVybiAxOworI2VuZGlmCit9CisKK3N0cnVjdCBvcGpfbXV0ZXhfdCB7CisgICAgcHRocmVhZF9tdXRleF90IG11dGV4OworfTsKKworb3BqX211dGV4X3QqIG9wal9tdXRleF9jcmVhdGUodm9pZCkKK3sKKyAgICBvcGpfbXV0ZXhfdCogbXV0ZXggPSAob3BqX211dGV4X3QqKSBvcGpfY2FsbG9jKDFVLCBzaXplb2Yob3BqX211dGV4X3QpKTsKKyAgICBpZiAobXV0ZXggIT0gTlVMTCkgeworICAgICAgICBpZiAocHRocmVhZF9tdXRleF9pbml0KCZtdXRleC0+bXV0ZXgsIE5VTEwpICE9IDApIHsKKyAgICAgICAgICAgIG9wal9mcmVlKG11dGV4KTsKKyAgICAgICAgICAgIG11dGV4ID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbXV0ZXg7Cit9CisKK3ZvaWQgb3BqX211dGV4X2xvY2sob3BqX211dGV4X3QqIG11dGV4KQoreworICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmKG11dGV4LT5tdXRleCkpOworfQorCit2b2lkIG9wal9tdXRleF91bmxvY2sob3BqX211dGV4X3QqIG11dGV4KQoreworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCYobXV0ZXgtPm11dGV4KSk7Cit9CisKK3ZvaWQgb3BqX211dGV4X2Rlc3Ryb3kob3BqX211dGV4X3QqIG11dGV4KQoreworICAgIGlmICghbXV0ZXgpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJihtdXRleC0+bXV0ZXgpKTsKKyAgICBvcGpfZnJlZShtdXRleCk7Cit9CisKK3N0cnVjdCBvcGpfY29uZF90IHsKKyAgICBwdGhyZWFkX2NvbmRfdCBjb25kOworfTsKKworb3BqX2NvbmRfdCogb3BqX2NvbmRfY3JlYXRlKHZvaWQpCit7CisgICAgb3BqX2NvbmRfdCogY29uZCA9IChvcGpfY29uZF90Kikgb3BqX21hbGxvYyhzaXplb2Yob3BqX2NvbmRfdCkpOworICAgIGlmICghY29uZCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKHB0aHJlYWRfY29uZF9pbml0KCYoY29uZC0+Y29uZCksIE5VTEwpICE9IDApIHsKKyAgICAgICAgb3BqX2ZyZWUoY29uZCk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gY29uZDsKK30KKwordm9pZCBvcGpfY29uZF93YWl0KG9wal9jb25kX3QqIGNvbmQsIG9wal9tdXRleF90KiBtdXRleCkKK3sKKyAgICBwdGhyZWFkX2NvbmRfd2FpdCgmKGNvbmQtPmNvbmQpLCAmKG11dGV4LT5tdXRleCkpOworfQorCit2b2lkIG9wal9jb25kX3NpZ25hbChvcGpfY29uZF90KiBjb25kKQoreworICAgIGludCByZXQgPSBwdGhyZWFkX2NvbmRfc2lnbmFsKCYoY29uZC0+Y29uZCkpOworICAgICh2b2lkKXJldDsKKyAgICBhc3NlcnQocmV0ID09IDApOworfQorCit2b2lkIG9wal9jb25kX2Rlc3Ryb3kob3BqX2NvbmRfdCogY29uZCkKK3sKKyAgICBpZiAoIWNvbmQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmKGNvbmQtPmNvbmQpKTsKKyAgICBvcGpfZnJlZShjb25kKTsKK30KKworCitzdHJ1Y3Qgb3BqX3RocmVhZF90IHsKKyAgICBvcGpfdGhyZWFkX2ZuIHRocmVhZF9mbjsKKyAgICB2b2lkKiB1c2VyX2RhdGE7CisgICAgcHRocmVhZF90IHRocmVhZDsKK307CisKK3N0YXRpYyB2b2lkKiBvcGpfdGhyZWFkX2NhbGxiYWNrX2FkYXB0ZXIodm9pZCogaW5mbykKK3sKKyAgICBvcGpfdGhyZWFkX3QqIHRocmVhZCA9IChvcGpfdGhyZWFkX3QqKSBpbmZvOworICAgIHRocmVhZC0+dGhyZWFkX2ZuKHRocmVhZC0+dXNlcl9kYXRhKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworb3BqX3RocmVhZF90KiBvcGpfdGhyZWFkX2NyZWF0ZShvcGpfdGhyZWFkX2ZuIHRocmVhZF9mbiwgdm9pZCogdXNlcl9kYXRhKQoreworICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgb3BqX3RocmVhZF90KiB0aHJlYWQ7CisKKyAgICBhc3NlcnQodGhyZWFkX2ZuKTsKKworICAgIHRocmVhZCA9IChvcGpfdGhyZWFkX3QqKSBvcGpfbWFsbG9jKHNpemVvZihvcGpfdGhyZWFkX3QpKTsKKyAgICBpZiAoIXRocmVhZCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgdGhyZWFkLT50aHJlYWRfZm4gPSB0aHJlYWRfZm47CisgICAgdGhyZWFkLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisKKyAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CisgICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7CisgICAgaWYgKHB0aHJlYWRfY3JlYXRlKCYodGhyZWFkLT50aHJlYWQpLCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgb3BqX3RocmVhZF9jYWxsYmFja19hZGFwdGVyLCAodm9pZCAqKSB0aHJlYWQpICE9IDApIHsKKyAgICAgICAgb3BqX2ZyZWUodGhyZWFkKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiB0aHJlYWQ7Cit9CisKK3ZvaWQgb3BqX3RocmVhZF9qb2luKG9wal90aHJlYWRfdCogdGhyZWFkKQoreworICAgIHZvaWQqIHN0YXR1czsKKyAgICBwdGhyZWFkX2pvaW4odGhyZWFkLT50aHJlYWQsICZzdGF0dXMpOworCisgICAgb3BqX2ZyZWUodGhyZWFkKTsKK30KKworI2Vsc2UKKy8qIFN0dWIgaW1wbGVtZW50YXRpb24gKi8KKworI2luY2x1ZGUgIm9wal9pbmNsdWRlcy5oIgorCitPUEpfQk9PTCBPUEpfQ0FMTENPTlYgb3BqX2hhc190aHJlYWRfc3VwcG9ydCh2b2lkKQoreworICAgIHJldHVybiBPUEpfRkFMU0U7Cit9CisKK2ludCBPUEpfQ0FMTENPTlYgb3BqX2dldF9udW1fY3B1cyh2b2lkKQoreworICAgIHJldHVybiAxOworfQorCitvcGpfbXV0ZXhfdCogb3BqX211dGV4X2NyZWF0ZSh2b2lkKQoreworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIG9wal9tdXRleF9sb2NrKG9wal9tdXRleF90KiBtdXRleCkKK3sKKyAgICAodm9pZCkgbXV0ZXg7Cit9CisKK3ZvaWQgb3BqX211dGV4X3VubG9jayhvcGpfbXV0ZXhfdCogbXV0ZXgpCit7CisgICAgKHZvaWQpIG11dGV4OworfQorCit2b2lkIG9wal9tdXRleF9kZXN0cm95KG9wal9tdXRleF90KiBtdXRleCkKK3sKKyAgICAodm9pZCkgbXV0ZXg7Cit9CisKK29wal9jb25kX3QqIG9wal9jb25kX2NyZWF0ZSh2b2lkKQoreworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIG9wal9jb25kX3dhaXQob3BqX2NvbmRfdCogY29uZCwgb3BqX211dGV4X3QqIG11dGV4KQoreworICAgICh2b2lkKSBjb25kOworICAgICh2b2lkKSBtdXRleDsKK30KKwordm9pZCBvcGpfY29uZF9zaWduYWwob3BqX2NvbmRfdCogY29uZCkKK3sKKyAgICAodm9pZCkgY29uZDsKK30KKwordm9pZCBvcGpfY29uZF9kZXN0cm95KG9wal9jb25kX3QqIGNvbmQpCit7CisgICAgKHZvaWQpIGNvbmQ7Cit9CisKK29wal90aHJlYWRfdCogb3BqX3RocmVhZF9jcmVhdGUob3BqX3RocmVhZF9mbiB0aHJlYWRfZm4sIHZvaWQqIHVzZXJfZGF0YSkKK3sKKyAgICAodm9pZCkgdGhyZWFkX2ZuOworICAgICh2b2lkKSB1c2VyX2RhdGE7CisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgb3BqX3RocmVhZF9qb2luKG9wal90aHJlYWRfdCogdGhyZWFkKQoreworICAgICh2b2lkKSB0aHJlYWQ7Cit9CisKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGtleTsKKyAgICB2b2lkKiB2YWx1ZTsKKyAgICBvcGpfdGxzX2ZyZWVfZnVuYyBvcGpfZnJlZV9mdW5jOworfSBvcGpfdGxzX2tleV92YWxfdDsKKworc3RydWN0IG9wal90bHNfdCB7CisgICAgb3BqX3Rsc19rZXlfdmFsX3QqIGtleV92YWw7CisgICAgaW50ICAgICAgICAgICAgICAgIGtleV92YWxfY291bnQ7Cit9OworCitzdGF0aWMgb3BqX3Rsc190KiBvcGpfdGxzX25ldyh2b2lkKQoreworICAgIHJldHVybiAob3BqX3Rsc190Kikgb3BqX2NhbGxvYygxLCBzaXplb2Yob3BqX3Rsc190KSk7Cit9CisKK3N0YXRpYyB2b2lkIG9wal90bHNfZGVzdHJveShvcGpfdGxzX3QqIHRscykKK3sKKyAgICBpbnQgaTsKKyAgICBpZiAoIXRscykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCB0bHMtPmtleV92YWxfY291bnQ7IGkrKykgeworICAgICAgICBpZiAodGxzLT5rZXlfdmFsW2ldLm9wal9mcmVlX2Z1bmMpIHsKKyAgICAgICAgICAgIHRscy0+a2V5X3ZhbFtpXS5vcGpfZnJlZV9mdW5jKHRscy0+a2V5X3ZhbFtpXS52YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgb3BqX2ZyZWUodGxzLT5rZXlfdmFsKTsKKyAgICBvcGpfZnJlZSh0bHMpOworfQorCit2b2lkKiBvcGpfdGxzX2dldChvcGpfdGxzX3QqIHRscywgaW50IGtleSkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGxzLT5rZXlfdmFsX2NvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKHRscy0+a2V5X3ZhbFtpXS5rZXkgPT0ga2V5KSB7CisgICAgICAgICAgICByZXR1cm4gdGxzLT5rZXlfdmFsW2ldLnZhbHVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitPUEpfQk9PTCBvcGpfdGxzX3NldChvcGpfdGxzX3QqIHRscywgaW50IGtleSwgdm9pZCogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBvcGpfdGxzX2ZyZWVfZnVuYyBvcGpfZnJlZV9mdW5jKQoreworICAgIG9wal90bHNfa2V5X3ZhbF90KiBuZXdfa2V5X3ZhbDsKKyAgICBpbnQgaTsKKworICAgIGlmICh0bHMtPmtleV92YWxfY291bnQgPT0gSU5UX01BWCkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgdGxzLT5rZXlfdmFsX2NvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKHRscy0+a2V5X3ZhbFtpXS5rZXkgPT0ga2V5KSB7CisgICAgICAgICAgICBpZiAodGxzLT5rZXlfdmFsW2ldLm9wal9mcmVlX2Z1bmMpIHsKKyAgICAgICAgICAgICAgICB0bHMtPmtleV92YWxbaV0ub3BqX2ZyZWVfZnVuYyh0bHMtPmtleV92YWxbaV0udmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGxzLT5rZXlfdmFsW2ldLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICB0bHMtPmtleV92YWxbaV0ub3BqX2ZyZWVfZnVuYyA9IG9wal9mcmVlX2Z1bmM7CisgICAgICAgICAgICByZXR1cm4gT1BKX1RSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgbmV3X2tleV92YWwgPSAob3BqX3Rsc19rZXlfdmFsX3QqKSBvcGpfcmVhbGxvYyh0bHMtPmtleV92YWwsCisgICAgICAgICAgICAgICAgICAoKHNpemVfdCl0bHMtPmtleV92YWxfY291bnQgKyAxVSkgKiBzaXplb2Yob3BqX3Rsc19rZXlfdmFsX3QpKTsKKyAgICBpZiAoIW5ld19rZXlfdmFsKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIHRscy0+a2V5X3ZhbCA9IG5ld19rZXlfdmFsOworICAgIG5ld19rZXlfdmFsW3Rscy0+a2V5X3ZhbF9jb3VudF0ua2V5ID0ga2V5OworICAgIG5ld19rZXlfdmFsW3Rscy0+a2V5X3ZhbF9jb3VudF0udmFsdWUgPSB2YWx1ZTsKKyAgICBuZXdfa2V5X3ZhbFt0bHMtPmtleV92YWxfY291bnRdLm9wal9mcmVlX2Z1bmMgPSBvcGpfZnJlZV9mdW5jOworICAgIHRscy0+a2V5X3ZhbF9jb3VudCArKzsKKyAgICByZXR1cm4gT1BKX1RSVUU7Cit9CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG9wal9qb2JfZm4gICAgICAgICAgam9iX2ZuOworICAgIHZvaWQgICAgICAgICAgICAgICAqdXNlcl9kYXRhOworfSBvcGpfd29ya2VyX3RocmVhZF9qb2JfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG9wal90aHJlYWRfcG9vbF90ICAgKnRwOworICAgIG9wal90aHJlYWRfdCAgICAgICAgKnRocmVhZDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBtYXJrZWRfYXNfd2FpdGluZzsKKworICAgIG9wal9tdXRleF90ICAgICAgICAgKm11dGV4OworICAgIG9wal9jb25kX3QgICAgICAgICAgKmNvbmQ7Cit9IG9wal93b3JrZXJfdGhyZWFkX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgT1BKV1RTX09LLAorICAgIE9QSldUU19TVE9QLAorICAgIE9QSldUU19FUlJPUgorfSBvcGpfd29ya2VyX3RocmVhZF9zdGF0ZTsKKworc3RydWN0IG9wal9qb2JfbGlzdF90IHsKKyAgICBvcGpfd29ya2VyX3RocmVhZF9qb2JfdCogam9iOworICAgIHN0cnVjdCBvcGpfam9iX2xpc3RfdCogbmV4dDsKK307Cit0eXBlZGVmIHN0cnVjdCBvcGpfam9iX2xpc3RfdCBvcGpfam9iX2xpc3RfdDsKKworc3RydWN0IG9wal93b3JrZXJfdGhyZWFkX2xpc3RfdCB7CisgICAgb3BqX3dvcmtlcl90aHJlYWRfdCogd29ya2VyX3RocmVhZDsKKyAgICBzdHJ1Y3Qgb3BqX3dvcmtlcl90aHJlYWRfbGlzdF90KiBuZXh0OworfTsKK3R5cGVkZWYgc3RydWN0IG9wal93b3JrZXJfdGhyZWFkX2xpc3RfdCBvcGpfd29ya2VyX3RocmVhZF9saXN0X3Q7CisKK3N0cnVjdCBvcGpfdGhyZWFkX3Bvb2xfdCB7CisgICAgb3BqX3dvcmtlcl90aHJlYWRfdCogICAgICAgICAgICAgd29ya2VyX3RocmVhZHM7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyX3RocmVhZHNfY291bnQ7CisgICAgb3BqX2NvbmRfdCogICAgICAgICAgICAgICAgICAgICAgY29uZDsKKyAgICBvcGpfbXV0ZXhfdCogICAgICAgICAgICAgICAgICAgICBtdXRleDsKKyAgICB2b2xhdGlsZSBvcGpfd29ya2VyX3RocmVhZF9zdGF0ZSBzdGF0ZTsKKyAgICBvcGpfam9iX2xpc3RfdCogICAgICAgICAgICAgICAgICBqb2JfcXVldWU7CisgICAgdm9sYXRpbGUgaW50ICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19qb2JzX2NvdW50OworICAgIG9wal93b3JrZXJfdGhyZWFkX2xpc3RfdCogICAgICAgIHdhaXRpbmdfd29ya2VyX3RocmVhZF9saXN0OworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRpbmdfd29ya2VyX3RocmVhZF9jb3VudDsKKyAgICBvcGpfdGxzX3QqICAgICAgICAgICAgICAgICAgICAgICB0bHM7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsaW5nX3RocmVzaG9sZDsKK307CisKK3N0YXRpYyBPUEpfQk9PTCBvcGpfdGhyZWFkX3Bvb2xfc2V0dXAob3BqX3RocmVhZF9wb29sX3QqIHRwLCBpbnQgbnVtX3RocmVhZHMpOworc3RhdGljIG9wal93b3JrZXJfdGhyZWFkX2pvYl90KiBvcGpfdGhyZWFkX3Bvb2xfZ2V0X25leHRfam9iKAorICAgIG9wal90aHJlYWRfcG9vbF90KiB0cCwKKyAgICBvcGpfd29ya2VyX3RocmVhZF90KiB3b3JrZXJfdGhyZWFkLAorICAgIE9QSl9CT09MIHNpZ25hbF9qb2JfZmluaXNoZWQpOworCitvcGpfdGhyZWFkX3Bvb2xfdCogb3BqX3RocmVhZF9wb29sX2NyZWF0ZShpbnQgbnVtX3RocmVhZHMpCit7CisgICAgb3BqX3RocmVhZF9wb29sX3QqIHRwOworCisgICAgdHAgPSAob3BqX3RocmVhZF9wb29sX3QqKSBvcGpfY2FsbG9jKDEsIHNpemVvZihvcGpfdGhyZWFkX3Bvb2xfdCkpOworICAgIGlmICghdHApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHRwLT5zdGF0ZSA9IE9QSldUU19PSzsKKworICAgIGlmIChudW1fdGhyZWFkcyA8PSAwKSB7CisgICAgICAgIHRwLT50bHMgPSBvcGpfdGxzX25ldygpOworICAgICAgICBpZiAoIXRwLT50bHMpIHsKKyAgICAgICAgICAgIG9wal9mcmVlKHRwKTsKKyAgICAgICAgICAgIHRwID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHA7CisgICAgfQorCisgICAgdHAtPm11dGV4ID0gb3BqX211dGV4X2NyZWF0ZSgpOworICAgIGlmICghdHAtPm11dGV4KSB7CisgICAgICAgIG9wal9mcmVlKHRwKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghb3BqX3RocmVhZF9wb29sX3NldHVwKHRwLCBudW1fdGhyZWFkcykpIHsKKyAgICAgICAgb3BqX3RocmVhZF9wb29sX2Rlc3Ryb3kodHApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHRwOworfQorCitzdGF0aWMgdm9pZCBvcGpfd29ya2VyX3RocmVhZF9mdW5jdGlvbih2b2lkKiB1c2VyX2RhdGEpCit7CisgICAgb3BqX3dvcmtlcl90aHJlYWRfdCogd29ya2VyX3RocmVhZDsKKyAgICBvcGpfdGhyZWFkX3Bvb2xfdCogdHA7CisgICAgb3BqX3Rsc190KiB0bHM7CisgICAgT1BKX0JPT0wgam9iX2ZpbmlzaGVkID0gT1BKX0ZBTFNFOworCisgICAgd29ya2VyX3RocmVhZCA9IChvcGpfd29ya2VyX3RocmVhZF90KikgdXNlcl9kYXRhOworICAgIHRwID0gd29ya2VyX3RocmVhZC0+dHA7CisgICAgdGxzID0gb3BqX3Rsc19uZXcoKTsKKworICAgIHdoaWxlIChPUEpfVFJVRSkgeworICAgICAgICBvcGpfd29ya2VyX3RocmVhZF9qb2JfdCogam9iID0gb3BqX3RocmVhZF9wb29sX2dldF9uZXh0X2pvYih0cCwgd29ya2VyX3RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYl9maW5pc2hlZCk7CisgICAgICAgIGlmIChqb2IgPT0gTlVMTCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoam9iLT5qb2JfZm4pIHsKKyAgICAgICAgICAgIGpvYi0+am9iX2ZuKGpvYi0+dXNlcl9kYXRhLCB0bHMpOworICAgICAgICB9CisgICAgICAgIG9wal9mcmVlKGpvYik7CisgICAgICAgIGpvYl9maW5pc2hlZCA9IE9QSl9UUlVFOworICAgIH0KKworICAgIG9wal90bHNfZGVzdHJveSh0bHMpOworfQorCitzdGF0aWMgT1BKX0JPT0wgb3BqX3RocmVhZF9wb29sX3NldHVwKG9wal90aHJlYWRfcG9vbF90KiB0cCwgaW50IG51bV90aHJlYWRzKQoreworICAgIGludCBpOworICAgIE9QSl9CT09MIGJSZXQgPSBPUEpfVFJVRTsKKworICAgIGFzc2VydChudW1fdGhyZWFkcyA+IDApOworCisgICAgdHAtPmNvbmQgPSBvcGpfY29uZF9jcmVhdGUoKTsKKyAgICBpZiAodHAtPmNvbmQgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gT1BKX0ZBTFNFOworICAgIH0KKworICAgIHRwLT53b3JrZXJfdGhyZWFkcyA9IChvcGpfd29ya2VyX3RocmVhZF90Kikgb3BqX2NhbGxvYygoc2l6ZV90KW51bV90aHJlYWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvcGpfd29ya2VyX3RocmVhZF90KSk7CisgICAgaWYgKHRwLT53b3JrZXJfdGhyZWFkcyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIHRwLT53b3JrZXJfdGhyZWFkc19jb3VudCA9IG51bV90aHJlYWRzOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bV90aHJlYWRzOyBpKyspIHsKKyAgICAgICAgdHAtPndvcmtlcl90aHJlYWRzW2ldLnRwID0gdHA7CisKKyAgICAgICAgdHAtPndvcmtlcl90aHJlYWRzW2ldLm11dGV4ID0gb3BqX211dGV4X2NyZWF0ZSgpOworICAgICAgICBpZiAodHAtPndvcmtlcl90aHJlYWRzW2ldLm11dGV4ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHRwLT53b3JrZXJfdGhyZWFkc19jb3VudCA9IGk7CisgICAgICAgICAgICBiUmV0ID0gT1BKX0ZBTFNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB0cC0+d29ya2VyX3RocmVhZHNbaV0uY29uZCA9IG9wal9jb25kX2NyZWF0ZSgpOworICAgICAgICBpZiAodHAtPndvcmtlcl90aHJlYWRzW2ldLmNvbmQgPT0gTlVMTCkgeworICAgICAgICAgICAgb3BqX211dGV4X2Rlc3Ryb3kodHAtPndvcmtlcl90aHJlYWRzW2ldLm11dGV4KTsKKyAgICAgICAgICAgIHRwLT53b3JrZXJfdGhyZWFkc19jb3VudCA9IGk7CisgICAgICAgICAgICBiUmV0ID0gT1BKX0ZBTFNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB0cC0+d29ya2VyX3RocmVhZHNbaV0ubWFya2VkX2FzX3dhaXRpbmcgPSBPUEpfRkFMU0U7CisKKyAgICAgICAgdHAtPndvcmtlcl90aHJlYWRzW2ldLnRocmVhZCA9IG9wal90aHJlYWRfY3JlYXRlKG9wal93b3JrZXJfdGhyZWFkX2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJih0cC0+d29ya2VyX3RocmVhZHNbaV0pKTsKKyAgICAgICAgaWYgKHRwLT53b3JrZXJfdGhyZWFkc1tpXS50aHJlYWQgPT0gTlVMTCkgeworICAgICAgICAgICAgdHAtPndvcmtlcl90aHJlYWRzX2NvdW50ID0gaTsKKyAgICAgICAgICAgIGJSZXQgPSBPUEpfRkFMU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFdhaXQgYWxsIHRocmVhZHMgdG8gYmUgc3RhcnRlZCAqLworICAgIC8qIHByaW50Zigid2FpdGluZyBmb3IgYWxsIHRocmVhZHMgdG8gYmUgc3RhcnRlZFxuIik7ICovCisgICAgb3BqX211dGV4X2xvY2sodHAtPm11dGV4KTsKKyAgICB3aGlsZSAodHAtPndhaXRpbmdfd29ya2VyX3RocmVhZF9jb3VudCA8IG51bV90aHJlYWRzKSB7CisgICAgICAgIG9wal9jb25kX3dhaXQodHAtPmNvbmQsIHRwLT5tdXRleCk7CisgICAgfQorICAgIG9wal9tdXRleF91bmxvY2sodHAtPm11dGV4KTsKKyAgICAvKiBwcmludGYoImFsbCB0aHJlYWRzIHN0YXJ0ZWRcbiIpOyAqLworCisgICAgaWYgKHRwLT5zdGF0ZSA9PSBPUEpXVFNfRVJST1IpIHsKKyAgICAgICAgYlJldCA9IE9QSl9GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gYlJldDsKK30KKworLyoKK3ZvaWQgb3BqX3dhaXRpbmcoKQoreworICAgIHByaW50Zigid2FpdGluZyFcbiIpOworfQorKi8KKworc3RhdGljIG9wal93b3JrZXJfdGhyZWFkX2pvYl90KiBvcGpfdGhyZWFkX3Bvb2xfZ2V0X25leHRfam9iKAorICAgIG9wal90aHJlYWRfcG9vbF90KiB0cCwKKyAgICBvcGpfd29ya2VyX3RocmVhZF90KiB3b3JrZXJfdGhyZWFkLAorICAgIE9QSl9CT09MIHNpZ25hbF9qb2JfZmluaXNoZWQpCit7CisgICAgd2hpbGUgKE9QSl9UUlVFKSB7CisgICAgICAgIG9wal9qb2JfbGlzdF90KiB0b3Bfam9iX2l0ZXI7CisKKyAgICAgICAgb3BqX211dGV4X2xvY2sodHAtPm11dGV4KTsKKworICAgICAgICBpZiAoc2lnbmFsX2pvYl9maW5pc2hlZCkgeworICAgICAgICAgICAgc2lnbmFsX2pvYl9maW5pc2hlZCA9IE9QSl9GQUxTRTsKKyAgICAgICAgICAgIHRwLT5wZW5kaW5nX2pvYnNfY291bnQgLS07CisgICAgICAgICAgICAvKnByaW50ZigidHA9JXAsIHJlbWFpbmluZyBqb2JzOiAlZFxuIiwgdHAsIHRwLT5wZW5kaW5nX2pvYnNfY291bnQpOyovCisgICAgICAgICAgICBpZiAodHAtPnBlbmRpbmdfam9ic19jb3VudCA8PSB0cC0+c2lnbmFsaW5nX3RocmVzaG9sZCkgeworICAgICAgICAgICAgICAgIG9wal9jb25kX3NpZ25hbCh0cC0+Y29uZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAodHAtPnN0YXRlID09IE9QSldUU19TVE9QKSB7CisgICAgICAgICAgICBvcGpfbXV0ZXhfdW5sb2NrKHRwLT5tdXRleCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICB0b3Bfam9iX2l0ZXIgPSB0cC0+am9iX3F1ZXVlOworICAgICAgICBpZiAodG9wX2pvYl9pdGVyKSB7CisgICAgICAgICAgICBvcGpfd29ya2VyX3RocmVhZF9qb2JfdCogam9iOworICAgICAgICAgICAgdHAtPmpvYl9xdWV1ZSA9IHRvcF9qb2JfaXRlci0+bmV4dDsKKworICAgICAgICAgICAgam9iID0gdG9wX2pvYl9pdGVyLT5qb2I7CisgICAgICAgICAgICBvcGpfbXV0ZXhfdW5sb2NrKHRwLT5tdXRleCk7CisgICAgICAgICAgICBvcGpfZnJlZSh0b3Bfam9iX2l0ZXIpOworICAgICAgICAgICAgcmV0dXJuIGpvYjsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG9wal93YWl0aW5nKCk7ICovCisgICAgICAgIGlmICghd29ya2VyX3RocmVhZC0+bWFya2VkX2FzX3dhaXRpbmcpIHsKKyAgICAgICAgICAgIG9wal93b3JrZXJfdGhyZWFkX2xpc3RfdCogaXRlbTsKKworICAgICAgICAgICAgd29ya2VyX3RocmVhZC0+bWFya2VkX2FzX3dhaXRpbmcgPSBPUEpfVFJVRTsKKyAgICAgICAgICAgIHRwLT53YWl0aW5nX3dvcmtlcl90aHJlYWRfY291bnQgKys7CisgICAgICAgICAgICBhc3NlcnQodHAtPndhaXRpbmdfd29ya2VyX3RocmVhZF9jb3VudCA8PSB0cC0+d29ya2VyX3RocmVhZHNfY291bnQpOworCisgICAgICAgICAgICBpdGVtID0gKG9wal93b3JrZXJfdGhyZWFkX2xpc3RfdCopIG9wal9tYWxsb2Moc2l6ZW9mKG9wal93b3JrZXJfdGhyZWFkX2xpc3RfdCkpOworICAgICAgICAgICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHRwLT5zdGF0ZSA9IE9QSldUU19FUlJPUjsKKyAgICAgICAgICAgICAgICBvcGpfY29uZF9zaWduYWwodHAtPmNvbmQpOworCisgICAgICAgICAgICAgICAgb3BqX211dGV4X3VubG9jayh0cC0+bXV0ZXgpOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpdGVtLT53b3JrZXJfdGhyZWFkID0gd29ya2VyX3RocmVhZDsKKyAgICAgICAgICAgIGl0ZW0tPm5leHQgPSB0cC0+d2FpdGluZ193b3JrZXJfdGhyZWFkX2xpc3Q7CisgICAgICAgICAgICB0cC0+d2FpdGluZ193b3JrZXJfdGhyZWFkX2xpc3QgPSBpdGVtOworICAgICAgICB9CisKKyAgICAgICAgLyogcHJpbnRmKCJzaWduYWxpbmcgdGhhdCB3b3JrZXIgdGhyZWFkIGlzIHJlYWR5XG4iKTsgKi8KKyAgICAgICAgb3BqX2NvbmRfc2lnbmFsKHRwLT5jb25kKTsKKworICAgICAgICBvcGpfbXV0ZXhfbG9jayh3b3JrZXJfdGhyZWFkLT5tdXRleCk7CisgICAgICAgIG9wal9tdXRleF91bmxvY2sodHAtPm11dGV4KTsKKworICAgICAgICAvKiBwcmludGYoIndhaXRpbmcgZm9yIGpvYlxuIik7ICovCisgICAgICAgIG9wal9jb25kX3dhaXQod29ya2VyX3RocmVhZC0+Y29uZCwgd29ya2VyX3RocmVhZC0+bXV0ZXgpOworCisgICAgICAgIG9wal9tdXRleF91bmxvY2sod29ya2VyX3RocmVhZC0+bXV0ZXgpOworICAgICAgICAvKiBwcmludGYoImdvdCBqb2JcbiIpOyAqLworICAgIH0KK30KKworT1BKX0JPT0wgb3BqX3RocmVhZF9wb29sX3N1Ym1pdF9qb2Iob3BqX3RocmVhZF9wb29sX3QqIHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BqX2pvYl9mbiBqb2JfZm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyX2RhdGEpCit7CisgICAgb3BqX3dvcmtlcl90aHJlYWRfam9iX3QqIGpvYjsKKyAgICBvcGpfam9iX2xpc3RfdCogaXRlbTsKKworICAgIGlmICh0cC0+bXV0ZXggPT0gTlVMTCkgeworICAgICAgICBqb2JfZm4odXNlcl9kYXRhLCB0cC0+dGxzKTsKKyAgICAgICAgcmV0dXJuIE9QSl9UUlVFOworICAgIH0KKworICAgIGpvYiA9IChvcGpfd29ya2VyX3RocmVhZF9qb2JfdCopb3BqX21hbGxvYyhzaXplb2Yob3BqX3dvcmtlcl90aHJlYWRfam9iX3QpKTsKKyAgICBpZiAoam9iID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE9QSl9GQUxTRTsKKyAgICB9CisgICAgam9iLT5qb2JfZm4gPSBqb2JfZm47CisgICAgam9iLT51c2VyX2RhdGEgPSB1c2VyX2RhdGE7CisKKyAgICBpdGVtID0gKG9wal9qb2JfbGlzdF90Kikgb3BqX21hbGxvYyhzaXplb2Yob3BqX2pvYl9saXN0X3QpKTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSB7CisgICAgICAgIG9wal9mcmVlKGpvYik7CisgICAgICAgIHJldHVybiBPUEpfRkFMU0U7CisgICAgfQorICAgIGl0ZW0tPmpvYiA9IGpvYjsKKworICAgIG9wal9tdXRleF9sb2NrKHRwLT5tdXRleCk7CisKKyAgICB0cC0+c2lnbmFsaW5nX3RocmVzaG9sZCA9IDEwMCAqIHRwLT53b3JrZXJfdGhyZWFkc19jb3VudDsKKyAgICB3aGlsZSAodHAtPnBlbmRpbmdfam9ic19jb3VudCA+IHRwLT5zaWduYWxpbmdfdGhyZXNob2xkKSB7CisgICAgICAgIC8qIHByaW50ZigiJWQgam9icyBlbnF1ZXVlZC4gV2FpdGluZ1xuIiwgdHAtPnBlbmRpbmdfam9ic19jb3VudCk7ICovCisgICAgICAgIG9wal9jb25kX3dhaXQodHAtPmNvbmQsIHRwLT5tdXRleCk7CisgICAgICAgIC8qIHByaW50ZigiLi4uJWQgam9icyBlbnF1ZXVlZC5cbiIsIHRwLT5wZW5kaW5nX2pvYnNfY291bnQpOyAqLworICAgIH0KKworICAgIGl0ZW0tPm5leHQgPSB0cC0+am9iX3F1ZXVlOworICAgIHRwLT5qb2JfcXVldWUgPSBpdGVtOworICAgIHRwLT5wZW5kaW5nX2pvYnNfY291bnQgKys7CisKKyAgICBpZiAodHAtPndhaXRpbmdfd29ya2VyX3RocmVhZF9saXN0KSB7CisgICAgICAgIG9wal93b3JrZXJfdGhyZWFkX3QqIHdvcmtlcl90aHJlYWQ7CisgICAgICAgIG9wal93b3JrZXJfdGhyZWFkX2xpc3RfdCogbmV4dDsKKyAgICAgICAgb3BqX3dvcmtlcl90aHJlYWRfbGlzdF90KiB0b19vcGpfZnJlZTsKKworICAgICAgICB3b3JrZXJfdGhyZWFkID0gdHAtPndhaXRpbmdfd29ya2VyX3RocmVhZF9saXN0LT53b3JrZXJfdGhyZWFkOworCisgICAgICAgIGFzc2VydCh3b3JrZXJfdGhyZWFkLT5tYXJrZWRfYXNfd2FpdGluZyk7CisgICAgICAgIHdvcmtlcl90aHJlYWQtPm1hcmtlZF9hc193YWl0aW5nID0gT1BKX0ZBTFNFOworCisgICAgICAgIG5leHQgPSB0cC0+d2FpdGluZ193b3JrZXJfdGhyZWFkX2xpc3QtPm5leHQ7CisgICAgICAgIHRvX29wal9mcmVlID0gdHAtPndhaXRpbmdfd29ya2VyX3RocmVhZF9saXN0OworICAgICAgICB0cC0+d2FpdGluZ193b3JrZXJfdGhyZWFkX2xpc3QgPSBuZXh0OworICAgICAgICB0cC0+d2FpdGluZ193b3JrZXJfdGhyZWFkX2NvdW50IC0tOworCisgICAgICAgIG9wal9tdXRleF9sb2NrKHdvcmtlcl90aHJlYWQtPm11dGV4KTsKKyAgICAgICAgb3BqX211dGV4X3VubG9jayh0cC0+bXV0ZXgpOworICAgICAgICBvcGpfY29uZF9zaWduYWwod29ya2VyX3RocmVhZC0+Y29uZCk7CisgICAgICAgIG9wal9tdXRleF91bmxvY2sod29ya2VyX3RocmVhZC0+bXV0ZXgpOworCisgICAgICAgIG9wal9mcmVlKHRvX29wal9mcmVlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBvcGpfbXV0ZXhfdW5sb2NrKHRwLT5tdXRleCk7CisgICAgfQorCisgICAgcmV0dXJuIE9QSl9UUlVFOworfQorCit2b2lkIG9wal90aHJlYWRfcG9vbF93YWl0X2NvbXBsZXRpb24ob3BqX3RocmVhZF9wb29sX3QqIHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfcmVtYWluaW5nX2pvYnMpCit7CisgICAgaWYgKHRwLT5tdXRleCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobWF4X3JlbWFpbmluZ19qb2JzIDwgMCkgeworICAgICAgICBtYXhfcmVtYWluaW5nX2pvYnMgPSAwOworICAgIH0KKyAgICBvcGpfbXV0ZXhfbG9jayh0cC0+bXV0ZXgpOworICAgIHRwLT5zaWduYWxpbmdfdGhyZXNob2xkID0gbWF4X3JlbWFpbmluZ19qb2JzOworICAgIHdoaWxlICh0cC0+cGVuZGluZ19qb2JzX2NvdW50ID4gbWF4X3JlbWFpbmluZ19qb2JzKSB7CisgICAgICAgIC8qcHJpbnRmKCJ0cD0lcCwgam9icyBiZWZvcmUgd2FpdCA9ICVkLCBtYXhfcmVtYWluaW5nX2pvYnMgPSAlZFxuIiwgdHAsIHRwLT5wZW5kaW5nX2pvYnNfY291bnQsIG1heF9yZW1haW5pbmdfam9icyk7Ki8KKyAgICAgICAgb3BqX2NvbmRfd2FpdCh0cC0+Y29uZCwgdHAtPm11dGV4KTsKKyAgICAgICAgLypwcmludGYoInRwPSVwLCBqb2JzIGFmdGVyIHdhaXQgPSAlZFxuIiwgdHAsIHRwLT5wZW5kaW5nX2pvYnNfY291bnQpOyovCisgICAgfQorICAgIG9wal9tdXRleF91bmxvY2sodHAtPm11dGV4KTsKK30KKworaW50IG9wal90aHJlYWRfcG9vbF9nZXRfdGhyZWFkX2NvdW50KG9wal90aHJlYWRfcG9vbF90KiB0cCkKK3sKKyAgICByZXR1cm4gdHAtPndvcmtlcl90aHJlYWRzX2NvdW50OworfQorCit2b2lkIG9wal90aHJlYWRfcG9vbF9kZXN0cm95KG9wal90aHJlYWRfcG9vbF90KiB0cCkKK3sKKyAgICBpZiAoIXRwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHRwLT5jb25kKSB7CisgICAgICAgIGludCBpOworICAgICAgICBvcGpfdGhyZWFkX3Bvb2xfd2FpdF9jb21wbGV0aW9uKHRwLCAwKTsKKworICAgICAgICBvcGpfbXV0ZXhfbG9jayh0cC0+bXV0ZXgpOworICAgICAgICB0cC0+c3RhdGUgPSBPUEpXVFNfU1RPUDsKKyAgICAgICAgb3BqX211dGV4X3VubG9jayh0cC0+bXV0ZXgpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0cC0+d29ya2VyX3RocmVhZHNfY291bnQ7IGkrKykgeworICAgICAgICAgICAgb3BqX211dGV4X2xvY2sodHAtPndvcmtlcl90aHJlYWRzW2ldLm11dGV4KTsKKyAgICAgICAgICAgIG9wal9jb25kX3NpZ25hbCh0cC0+d29ya2VyX3RocmVhZHNbaV0uY29uZCk7CisgICAgICAgICAgICBvcGpfbXV0ZXhfdW5sb2NrKHRwLT53b3JrZXJfdGhyZWFkc1tpXS5tdXRleCk7CisgICAgICAgICAgICBvcGpfdGhyZWFkX2pvaW4odHAtPndvcmtlcl90aHJlYWRzW2ldLnRocmVhZCk7CisgICAgICAgICAgICBvcGpfY29uZF9kZXN0cm95KHRwLT53b3JrZXJfdGhyZWFkc1tpXS5jb25kKTsKKyAgICAgICAgICAgIG9wal9tdXRleF9kZXN0cm95KHRwLT53b3JrZXJfdGhyZWFkc1tpXS5tdXRleCk7CisgICAgICAgIH0KKworICAgICAgICBvcGpfZnJlZSh0cC0+d29ya2VyX3RocmVhZHMpOworCisgICAgICAgIHdoaWxlICh0cC0+d2FpdGluZ193b3JrZXJfdGhyZWFkX2xpc3QgIT0gTlVMTCkgeworICAgICAgICAgICAgb3BqX3dvcmtlcl90aHJlYWRfbGlzdF90KiBuZXh0ID0gdHAtPndhaXRpbmdfd29ya2VyX3RocmVhZF9saXN0LT5uZXh0OworICAgICAgICAgICAgb3BqX2ZyZWUodHAtPndhaXRpbmdfd29ya2VyX3RocmVhZF9saXN0KTsKKyAgICAgICAgICAgIHRwLT53YWl0aW5nX3dvcmtlcl90aHJlYWRfbGlzdCA9IG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBvcGpfY29uZF9kZXN0cm95KHRwLT5jb25kKTsKKyAgICB9CisgICAgb3BqX211dGV4X2Rlc3Ryb3kodHAtPm11dGV4KTsKKyAgICBvcGpfdGxzX2Rlc3Ryb3kodHAtPnRscyk7CisgICAgb3BqX2ZyZWUodHApOworfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlib3BlbmpwZWcyMC90aHJlYWQuaCBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg5ZTE5YgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGhyZWFkLmgKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisgKiBUaGUgY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgaXMgYmVpbmcgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIDItY2xhdXNlcworICogQlNEIExpY2Vuc2UsIGluY2x1ZGVkIGJlbG93LiBUaGlzIHNvZnR3YXJlIG1heSBiZSBzdWJqZWN0IHRvIG90aGVyIHRoaXJkCisgKiBwYXJ0eSBhbmQgY29udHJpYnV0b3IgcmlnaHRzLCBpbmNsdWRpbmcgcGF0ZW50IHJpZ2h0cywgYW5kIG5vIHN1Y2ggcmlnaHRzCisgKiBhcmUgZ3JhbnRlZCB1bmRlciB0aGlzIGxpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCBFdmVuIFJvdWF1bHQKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgQVMgSVMnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICogUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBUSFJFQURfSAorI2RlZmluZSBUSFJFQURfSAorCisjaW5jbHVkZSAib3BlbmpwZWcuaCIKKworLyoqCitAZmlsZSB0aHJlYWQuaAorQGJyaWVmIFRocmVhZCBBUEkKKworVGhlIGZ1bmN0aW9ucyBpbiB0aHJlYWQuYyBoYXZlIGZvciBnb2FsIHRvIG1hbmFnZSBtdXRleCwgY29uZGl0aW9ucywgdGhyZWFkCitjcmVhdGlvbiBhbmQgdGhyZWFkIHBvb2xzIHRoYXQgYWNjZXB0IGpvYnMuCisqLworCisvKiogQGRlZmdyb3VwIFRIUkVBRCBUSFJFQUQgLSBNdXRleCwgY29uZGl0aW9ucywgdGhyZWFkcyBhbmQgdGhyZWFkIHBvb2xzICovCisvKkB7Ki8KKworLyoqIEBuYW1lIE11dGV4ICovCisvKkB7Ki8KKworLyoqIE9wYXF1ZSB0eXBlIGZvciBhIG11dGV4ICovCit0eXBlZGVmIHN0cnVjdCBvcGpfbXV0ZXhfdCBvcGpfbXV0ZXhfdDsKKworLyoqIENyZWF0ZXMgYSBtdXRleC4KKyAqIEByZXR1cm4gdGhlIG11dGV4IG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvciAoY2FuIGZvciBleGFtcGxlIGhhcHBlbiBpZiB0aGUgbGlicmFyeQorICogaXMgYnVpbHQgd2l0aG91dCB0aHJlYWQgc3VwcG9ydCkKKyAqLworb3BqX211dGV4X3QqIG9wal9tdXRleF9jcmVhdGUodm9pZCk7CisKKy8qKiBMb2NrL2FjcXVpcmUgdGhlIG11dGV4LgorICogQHBhcmFtIG11dGV4IHRoZSBtdXRleCB0byBhY3F1aXJlLgorICovCit2b2lkIG9wal9tdXRleF9sb2NrKG9wal9tdXRleF90KiBtdXRleCk7CisKKy8qKiBVbmxvY2svcmVsZWFzZSB0aGUgbXV0ZXguCisgKiBAcGFyYW0gbXV0ZXggdGhlIG11dGV4IHRvIHJlbGVhc2UuCisgKi8KK3ZvaWQgb3BqX211dGV4X3VubG9jayhvcGpfbXV0ZXhfdCogbXV0ZXgpOworCisvKiogRGVzdHJveSBhIG11dGV4CisgKiBAcGFyYW0gbXV0ZXggdGhlIG11dGV4IHRvIGRlc3Ryb3kuCisgKi8KK3ZvaWQgb3BqX211dGV4X2Rlc3Ryb3kob3BqX211dGV4X3QqIG11dGV4KTsKKworLypAfSovCisKKy8qKiBAbmFtZSBDb25kaXRpb24gKi8KKy8qQHsqLworCisvKiogT3BhcXVlIHR5cGUgZm9yIGEgY29uZGl0aW9uICovCit0eXBlZGVmIHN0cnVjdCBvcGpfY29uZF90IG9wal9jb25kX3Q7CisKKy8qKiBDcmVhdGVzIGEgY29uZGl0aW9uLgorICogQHJldHVybiB0aGUgY29uZGl0aW9uIG9yIE5VTEwgaW4gY2FzZSBvZiBlcnJvciAoY2FuIGZvciBleGFtcGxlIGhhcHBlbiBpZiB0aGUgbGlicmFyeQorICogaXMgYnVpbHQgd2l0aG91dCB0aHJlYWQgc3VwcG9ydCkKKyAqLworb3BqX2NvbmRfdCogb3BqX2NvbmRfY3JlYXRlKHZvaWQpOworCisvKiogV2FpdCBmb3IgdGhlIGNvbmRpdGlvbiB0byBiZSBzaWduYWxlZC4KKyAqIFRoZSBzZW1hbnRpY3MgaXMgdGhlIHNhbWUgYXMgdGhlIFBPU0lYIHB0aHJlYWRfY29uZF93YWl0LgorICogVGhlIHByb3ZpZGVkIG11dGV4ICptdXN0KiBiZSBhY3F1aXJlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLCBhbmQKKyAqIHJlbGVhc2VkIGFmdGVyd2FyZHMuCisgKiBUaGUgbXV0ZXggd2lsbCBiZSByZWxlYXNlZCBieSB0aGlzIGZ1bmN0aW9uIHdoaWxlIGl0IG11c3Qgd2FpdCBmb3IgdGhlIGNvbmRpdGlvbgorICogYW5kIHJlYWNxdWlyZWQgYWZ0ZXJ3YXJkcy4KKyAqIEluIHNvbWUgcGFydGljdWxhciBzaXR1YXRpb25zLCB0aGUgZnVuY3Rpb24gbWlnaHQgcmV0dXJuIGV2ZW4gaWYgdGhlIGNvbmRpdGlvbiBpcyBub3Qgc2lnbmFsZWQKKyAqIHdpdGggb3BqX2NvbmRfc2lnbmFsKCksIGhlbmNlIHRoZSBuZWVkIHRvIGNoZWNrIHdpdGggYW4gYXBwbGljYXRpb24gbGV2ZWwKKyAqIG1lY2hhbmlzbS4KKyAqCisgKiBXYWl0aW5nIHRocmVhZCA6CisgKiBcY29kZQorICogICAgb3BqX211dGV4X2xvY2sobXV0ZXgpOworICogICAgd2hpbGUoICFzb21lX2FwcGxpY2F0aW9uX2xldmVsX2NvbmRpdGlvbiApCisgKiAgICB7CisgKiAgICAgICAgb3BqX2NvbmRfd2FpdChjb25kLCBtdXRleCk7CisgKiAgICB9CisgKiAgICBvcGpfbXV0ZXhfdW5sb2NrKG11dGV4KTsKKyAqIFxlbmRjb2RlCisgKgorICogU2lnbmFsaW5nIHRocmVhZCA6CisgKiBcY29kZQorICogICAgb3BqX211dGV4X2xvY2sobXV0ZXgpOworICogICAgc29tZV9hcHBsaWNhdGlvbl9sZXZlbF9jb25kaXRpb24gPSBUUlVFOworICogICAgb3BqX2NvbmRfc2lnbmFsKGNvbmQpOworICogICAgb3BqX211dGV4X3VubG9jayhtdXRleCk7CisgKiBcZW5kY29kZQorICoKKyAqIEBwYXJhbSBjb25kIHRoZSBjb25kaXRpb24gdG8gd2FpdC4KKyAqIEBwYXJhbSBtdXRleCB0aGUgbXV0ZXggKGluIGFjcXVpcmVkIHN0YXRlIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24pCisgKi8KK3ZvaWQgb3BqX2NvbmRfd2FpdChvcGpfY29uZF90KiBjb25kLCBvcGpfbXV0ZXhfdCogbXV0ZXgpOworCisvKiogU2lnbmFsIHdhaXRpbmcgdGhyZWFkcyBvbiBhIGNvbmRpdGlvbi4KKyAqIE9uZSBvZiB0aGUgdGhyZWFkIHdhaXRpbmcgd2l0aCBvcGpfY29uZF93YWl0KCkgd2lsbCBiZSB3YWtlbiB1cC4KKyAqIEl0IGlzIHN0cm9uZ2x5IGFkdmlzZWQgdGhhdCB0aGlzIGNhbGwgaXMgZG9uZSB3aXRoIHRoZSBtdXRleCB0aGF0IGlzIHVzZWQKKyAqIGJ5IG9wal9jb25kX3dhaXQoKSwgaW4gYSBhY3F1aXJlZCBzdGF0ZS4KKyAqIEBwYXJhbSBjb25kIHRoZSBjb25kaXRpb24gdG8gc2lnbmFsLgorICovCit2b2lkIG9wal9jb25kX3NpZ25hbChvcGpfY29uZF90KiBjb25kKTsKKworLyoqIERlc3Ryb3kgYSBjb25kaXRpb24KKyAqIEBwYXJhbSBjb25kIHRoZSBjb25kaXRpb24gdG8gZGVzdHJveS4KKyAqLwordm9pZCBvcGpfY29uZF9kZXN0cm95KG9wal9jb25kX3QqIGNvbmQpOworCisvKkB9Ki8KKworLyoqIEBuYW1lIFRocmVhZCAqLworLypAeyovCisKKy8qKiBPcGFxdWUgdHlwZSBmb3IgYSB0aHJlYWQgaGFuZGxlICovCit0eXBlZGVmIHN0cnVjdCBvcGpfdGhyZWFkX3Qgb3BqX3RocmVhZF90OworCisvKiogVXNlciBmdW5jdGlvbiB0byBleGVjdXRlIGluIGEgdGhyZWFkCisgKiBAcGFyYW0gdXNlcl9kYXRhIHVzZXIgZGF0YSBwcm92aWRlZCB3aXRoIG9wal90aHJlYWRfY3JlYXRlKCkKKyAqLwordHlwZWRlZiB2b2lkICgqb3BqX3RocmVhZF9mbikodm9pZCogdXNlcl9kYXRhKTsKKworLyoqIENyZWF0ZXMgYSBuZXcgdGhyZWFkLgorICogQHBhcmFtIHRocmVhZF9mbiBGdW5jdGlvbiB0byBydW4gaW4gdGhlIG5ldyB0aHJlYWQuCisgKiBAcGFyYW0gdXNlcl9kYXRhIHVzZXIgZGF0YSBwcm92aWRlZCB0byB0aGUgdGhyZWFkIGZ1bmN0aW9uLiBNaWdodCBiZSBOVUxMLgorICogQHJldHVybiBhIHRocmVhZCBoYW5kbGUgb3IgTlVMTCBpbiBjYXNlIG9mIGZhaWx1cmUgKGNhbiBmb3IgZXhhbXBsZSBoYXBwZW4gaWYgdGhlIGxpYnJhcnkKKyAqIGlzIGJ1aWx0IHdpdGhvdXQgdGhyZWFkIHN1cHBvcnQpCisgKi8KK29wal90aHJlYWRfdCogb3BqX3RocmVhZF9jcmVhdGUob3BqX3RocmVhZF9mbiB0aHJlYWRfZm4sIHZvaWQqIHVzZXJfZGF0YSk7CisKKy8qKiBXYWl0IGZvciBhIHRocmVhZCB0byBiZSBmaW5pc2hlZCBhbmQgcmVsZWFzZSBhc3NvY2lhdGVkIHJlc291cmNlcyB0byB0aGUKKyAqIHRocmVhZCBoYW5kbGUuCisgKiBAcGFyYW0gdGhyZWFkIHRoZSB0aHJlYWQgdG8gd2FpdCBmb3IgYmVpbmcgZmluaXNoZWQuCisgKi8KK3ZvaWQgb3BqX3RocmVhZF9qb2luKG9wal90aHJlYWRfdCogdGhyZWFkKTsKKworLypAfSovCisKKy8qKiBAbmFtZSBUaHJlYWQgbG9jYWwgc3RvcmFnZSAqLworLypAeyovCisvKiogT3BhcXVlIHR5cGUgZm9yIGEgdGhyZWFkIGxvY2FsIHN0b3JhZ2UgKi8KK3R5cGVkZWYgc3RydWN0IG9wal90bHNfdCBvcGpfdGxzX3Q7CisKKy8qKiBHZXQgYSB0aHJlYWQgbG9jYWwgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvdmlkZWQga2V5LgorICogQHBhcmFtIHRscyB0aHJlYWQgbG9jYWwgc3RvcmFnZSBoYW5kbGUKKyAqIEBwYXJhbSBrZXkga2V5IHdob3NlIHZhbHVlIHRvIHJldHJpZXZlLgorICogQHJldHVybiB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSwgb3IgTlVMTCBpcyBtaXNzaW5nLgorICovCit2b2lkKiBvcGpfdGxzX2dldChvcGpfdGxzX3QqIHRscywgaW50IGtleSk7CisKKy8qKiBUeXBlIG9mIHRoZSBmdW5jdGlvbiB1c2VkIHRvIGZyZWUgYSBUTFMgdmFsdWUgKi8KK3R5cGVkZWYgdm9pZCAoKm9wal90bHNfZnJlZV9mdW5jKSh2b2lkKiB2YWx1ZSk7CisKKy8qKiBTZXQgYSB0aHJlYWQgbG9jYWwgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvdmlkZWQga2V5LgorICogQHBhcmFtIHRscyB0aHJlYWQgbG9jYWwgc3RvcmFnZSBoYW5kbGUKKyAqIEBwYXJhbSBrZXkga2V5IHdob3NlIHZhbHVlIHRvIHNldC4KKyAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byBzZXQgKG1heSBiZSBOVUxMKS4KKyAqIEBwYXJhbSBmcmVlX2Z1bmMgZnVuY3Rpb24gdG8gY2FsbCBjdXJyZW50bHkgaW5zdGFsbGVkIHZhbHVlLgorICogQHJldHVybiBPUEpfVFJVRSBpZiBzdWNjZXNzZnVsLgorICovCitPUEpfQk9PTCBvcGpfdGxzX3NldChvcGpfdGxzX3QqIHRscywgaW50IGtleSwgdm9pZCogdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBvcGpfdGxzX2ZyZWVfZnVuYyBmcmVlX2Z1bmMpOworCisvKkB9Ki8KKworLyoqIEBuYW1lIFRocmVhZCBwb29sICovCisvKkB7Ki8KKworLyoqIE9wYXF1ZSB0eXBlIGZvciBhIHRocmVhZCBwb29sICovCit0eXBlZGVmIHN0cnVjdCBvcGpfdGhyZWFkX3Bvb2xfdCBvcGpfdGhyZWFkX3Bvb2xfdDsKKworLyoqIENyZWF0ZSBhIG5ldyB0aHJlYWQgcG9vbC4KKyAqIG51bV90aHJlYWQgbXVzdCBub21pbmFsbHkgYmUgPj0gMSB0byBjcmVhdGUgYSByZWFsIHRocmVhZCBwb29sLiBJZiBudW1fdGhyZWFkcworICogaXMgbmVnYXRpdmUgb3IgbnVsbCwgdGhlbiBhIGR1bW15IHRocmVhZCBwb29sIHdpbGwgYmUgY3JlYXRlZC4gQWxsIGZ1bmN0aW9ucworICogb3BlcmF0aW5nIG9uIHRoZSB0aHJlYWQgcG9vbCB3aWxsIHdvcmssIGJ1dCBqb2Igc3VibWlzc2lvbiB3aWxsIGJlIHJ1bgorICogc3luY2hyb25vdXNseSBpbiB0aGUgY2FsbGluZyB0aHJlYWQuCisgKgorICogQHBhcmFtIG51bV90aHJlYWRzIHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0byBhbGxvY2F0ZSBmb3IgdGhpcyB0aHJlYWQgcG9vbC4KKyAqIEByZXR1cm4gYSB0aHJlYWQgcG9vbCBoYW5kbGUsIG9yIE5VTEwgaW4gY2FzZSBvZiBmYWlsdXJlIChjYW4gZm9yIGV4YW1wbGUgaGFwcGVuIGlmIHRoZSBsaWJyYXJ5CisgKiBpcyBidWlsdCB3aXRob3V0IHRocmVhZCBzdXBwb3J0KQorICovCitvcGpfdGhyZWFkX3Bvb2xfdCogb3BqX3RocmVhZF9wb29sX2NyZWF0ZShpbnQgbnVtX3RocmVhZHMpOworCisvKiogVXNlciBmdW5jdGlvbiB0byBleGVjdXRlIGluIGEgdGhyZWFkCisgKiBAcGFyYW0gdXNlcl9kYXRhIHVzZXIgZGF0YSBwcm92aWRlZCB3aXRoIG9wal90aHJlYWRfY3JlYXRlKCkKKyAqIEBwYXJhbSB0bHMgaGFuZGxlIHRvIHRocmVhZCBsb2NhbCBzdG9yYWdlCisgKi8KK3R5cGVkZWYgdm9pZCAoKm9wal9qb2JfZm4pKHZvaWQqIHVzZXJfZGF0YSwgb3BqX3Rsc190KiB0bHMpOworCisKKy8qKiBTdWJtaXQgYSBuZXcgam9iIHRvIGJlIHJ1biBieSBvbmUgb2YgdGhlIHRocmVhZCBpbiB0aGUgdGhyZWFkIHBvb2wuCisgKiBUaGUgam9iICggdGhyZWFkX2ZuLCB1c2VyX2RhdGEgKSB3aWxsIGJlIGFkZGVkIGluIHRoZSBxdWV1ZSBvZiBqb2JzIG1hbmFnZWQKKyAqIGJ5IHRoZSB0aHJlYWQgcG9vbCwgYW5kIHJ1biBieSB0aGUgZmlyc3QgdGhyZWFkIHRoYXQgaXMgbm8gbG9uZ2VyIGJ1c3kuCisgKgorICogQHBhcmFtIHRwIHRoZSB0aHJlYWQgcG9vbCBoYW5kbGUuCisgKiBAcGFyYW0gam9iX2ZuIEZ1bmN0aW9uIHRvIHJ1bi4gTXVzdCBub3QgYmUgTlVMTC4KKyAqIEBwYXJhbSB1c2VyX2RhdGEgVXNlciBkYXRhIHByb3ZpZGVkIHRvIHRocmVhZF9mbi4KKyAqIEByZXR1cm4gT1BKX1RSVUUgaWYgdGhlIGpvYiB3YXMgc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZC4KKyAqLworT1BKX0JPT0wgb3BqX3RocmVhZF9wb29sX3N1Ym1pdF9qb2Iob3BqX3RocmVhZF9wb29sX3QqIHRwLCBvcGpfam9iX2ZuIGpvYl9mbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJfZGF0YSk7CisKKy8qKiBXYWl0IHRoYXQgbm8gbW9yZSB0aGFuIG1heF9yZW1haW5pbmdfam9icyBqb2JzIGFyZSByZW1haW5pbmcgaW4gdGhlIHF1ZXVlIG9mCisgKiB0aGUgdGhyZWFkIHBvb2wuIFRoZSBhaW0gb2YgdGhpcyBmdW5jdGlvbiBpcyB0byBhdm9pZCBzdWJtaXR0aW5nIHRvbyBtYW55CisgKiBqb2JzIHdoaWxlIHRoZSB0aHJlYWQgcG9vbCBjYW5ub3QgY29wZSBmYXN0IGVub3VnaCB3aXRoIHRoZW0sIHdoaWNoIHdvdWxkCisgKiByZXN1bHQgcG90ZW50aWFsbHkgaW4gb3V0LW9mLW1lbW9yeSBzaXR1YXRpb25zIHdpdGggdG9vIG1hbnkgam9iIGRlc2NyaXB0aW9ucworICogYmVpbmcgcXVldWVkLgorICoKKyAqIEBwYXJhbSB0cCB0aGUgdGhyZWFkIHBvb2wgaGFuZGxlCisgKiBAcGFyYW0gbWF4X3JlbWFpbmluZ19qb2JzIG1heGltdW0gbnVtYmVyIG9mIGpvYnMgYWxsb3dlZCB0byBiZSBxdWV1ZWQgd2l0aG91dCB3YWl0aW5nLgorICovCit2b2lkIG9wal90aHJlYWRfcG9vbF93YWl0X2NvbXBsZXRpb24ob3BqX3RocmVhZF9wb29sX3QqIHRwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfcmVtYWluaW5nX2pvYnMpOworCisvKiogUmV0dXJuIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRocmVhZCBwb29sLgorICoKKyAqIEBwYXJhbSB0cCB0aGUgdGhyZWFkIHBvb2wgaGFuZGxlLgorICogQHJldHVybiBudW1iZXIgb2YgdGhyZWFkcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRocmVhZCBwb29sLgorICovCitpbnQgb3BqX3RocmVhZF9wb29sX2dldF90aHJlYWRfY291bnQob3BqX3RocmVhZF9wb29sX3QqIHRwKTsKKworLyoqIERlc3Ryb3kgYSB0aHJlYWQgcG9vbC4KKyAqIEBwYXJhbSB0cCB0aGUgdGhyZWFkIHBvb2wgaGFuZGxlLgorICovCit2b2lkIG9wal90aHJlYWRfcG9vbF9kZXN0cm95KG9wal90aHJlYWRfcG9vbF90KiB0cCk7CisKKy8qQH0qLworCisvKkB9Ki8KKworI2VuZGlmIC8qIFRIUkVBRF9IICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3Rsc19rZXlzLmggYi90aGlyZF9wYXJ0eS9saWJvcGVuanBlZzIwL3Rsc19rZXlzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNmODQ3NQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYm9wZW5qcGVnMjAvdGxzX2tleXMuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogVGhlIGNvcHlyaWdodCBpbiB0aGlzIHNvZnR3YXJlIGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAyLWNsYXVzZXMKKyAqIEJTRCBMaWNlbnNlLCBpbmNsdWRlZCBiZWxvdy4gVGhpcyBzb2Z0d2FyZSBtYXkgYmUgc3ViamVjdCB0byBvdGhlciB0aGlyZAorICogcGFydHkgYW5kIGNvbnRyaWJ1dG9yIHJpZ2h0cywgaW5jbHVkaW5nIHBhdGVudCByaWdodHMsIGFuZCBubyBzdWNoIHJpZ2h0cworICogYXJlIGdyYW50ZWQgdW5kZXIgdGhpcyBsaWNlbnNlLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgRXZlbiBSb3VhdWx0CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgYEFTIElTJworICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKKyAqIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgT1BKX1RMU19LRVlTX0gKKyNkZWZpbmUgT1BKX1RMU19LRVlTX0gKKworI2RlZmluZSBPUEpfVExTX0tFWV9UMSAgMAorCisjZW5kaWYgLyogT1BKX1RMU19LRVlfSCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlicG5nMTYvMDAwMC1idWlsZC1jb25maWcucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJwbmcxNi8wMDAwLWJ1aWxkLWNvbmZpZy5wYXRjaAppbmRleCA3YjdiMTU4Li4zMjViNThmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJwbmcxNi8wMDAwLWJ1aWxkLWNvbmZpZy5wYXRjaAorKysgYi90aGlyZF9wYXJ0eS9saWJwbmcxNi8wMDAwLWJ1aWxkLWNvbmZpZy5wYXRjaApAQCAtNSw4ICs1LDggQEAKICAKICAjaW5jbHVkZSAicG5ncHJpdi5oIgogIAotK3ZvaWQqCUZYTUVNX0RlZmF1bHRBbGxvYyhpbnQgYnl0ZV9zaXplLCBpbnQpOwotK3ZvaWQJRlhNRU1fRGVmYXVsdEZyZWUodm9pZCogcG9pbnRlciwgaW50KTsKKyt2b2lkKglGWE1FTV9EZWZhdWx0QWxsb2Moc2l6ZV90IGJ5dGVfc2l6ZSk7Cisrdm9pZAlGWE1FTV9EZWZhdWx0RnJlZSh2b2lkKiBwb2ludGVyKTsKICsKICAjaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkKICAvKiBGcmVlIGEgcG5nX3N0cnVjdCAqLwpAQCAtMTYsNyArMTYsNyBAQAogICAgICAgIGVsc2UKICAjZW5kaWYKIC0gICAgICAgICByZXR1cm4gbWFsbG9jKChzaXplX3Qpc2l6ZSk7IC8qIGNoZWNrZWQgZm9yIHRydW5jYXRpb24gYWJvdmUgKi8KLSsgICAgICAgICByZXR1cm4gRlhNRU1fRGVmYXVsdEFsbG9jKChpbnQpc2l6ZSwgMCk7CisrICAgICAgICAgcmV0dXJuIEZYTUVNX0RlZmF1bHRBbGxvYyhzaXplKTsKICAgICB9CiAgCiAgICAgZWxzZQpAQCAtMjUsMTkgKzI1LDcgQEAKICAjZW5kaWYgLyogVVNFUl9NRU0gKi8KICAKIC0gICBmcmVlKHB0cik7Ci0rICAgRlhNRU1fRGVmYXVsdEZyZWUocHRyLCAwKTsKKysgICBGWE1FTV9EZWZhdWx0RnJlZShwdHIpOwogIH0KICAKICAjaWZkZWYgUE5HX1VTRVJfTUVNX1NVUFBPUlRFRAotZGlmZiBhL3RoaXJkX3BhcnR5L2xpYnBuZzE2L3BuZ3N0cnVjdC5oIGIvdGhpcmRfcGFydHkvbGlicG5nMTYvcG5nc3RydWN0LmgKLS0tLSBhL3RoaXJkX3BhcnR5L2xpYnBuZzE2L3BuZ3N0cnVjdC5oCi0rKysgYi90aGlyZF9wYXJ0eS9saWJwbmcxNi9wbmdzdHJ1Y3QuaAotQEAgLTI3LDcgKzI3LDcgQEAKLSAgICAvKiBXZSBtdXN0IGVuc3VyZSB0aGF0IHpsaWIgdXNlcyAnY29uc3QnIGluIGRlY2xhcmF0aW9ucy4gKi8KLSAjICBkZWZpbmUgWkxJQl9DT05TVAotICNlbmRpZgotLSNpbmNsdWRlICJ6bGliLmgiCi0rI2luY2x1ZGUgInRoaXJkX3BhcnR5L3psaWJfdjEyOC96bGliLmgiCi0gI2lmZGVmIGNvbnN0Ci0gICAgLyogemxpYi5oIHNvbWV0aW1lcyAjZGVmaW5lcyBjb25zdCB0byBub3RoaW5nLCB1bmRvIHRoaXMuICovCi0gIyAgdW5kZWYgY29uc3QKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnBuZzE2LzAwMDQtaW52YWxpZC1pY2MucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJwbmcxNi8wMDA0LWludmFsaWQtaWNjLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNTJjOGUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJwbmcxNi8wMDA0LWludmFsaWQtaWNjLnBhdGNoCkBAIC0wLDAgKzEsODEgQEAKK2RpZmYgLS1naXQgYS9wbmcuYyBiL3BuZy5jCitpbmRleCAzNWUxNGY2M2QuLjAxZDhkOWJhZSAxMDA2NDQKKy0tLSBhL3BuZy5jCisrKysgYi9wbmcuYworQEAgLTE5MzEsOCArMTkzMSw4IEBAIHBuZ19jb2xvcnNwYWNlX3NldF9zUkdCKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29sb3JzcGFjZXJwIGNvbG9yc3BhY2UsCisgc3RhdGljIGNvbnN0IHBuZ19ieXRlIEQ1MF9uQ0lFWFlaWzEyXSA9CisgICAgeyAweDAwLCAweDAwLCAweGY2LCAweGQ2LCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGQzLCAweDJkIH07CisgCistaW50IC8qIFBSSVZBVEUgKi8KKy1wbmdfaWNjX2NoZWNrX2xlbmd0aChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLAorK3N0YXRpYyBpbnQgLyogYm9vbCAqLworK2ljY19jaGVja19sZW5ndGgocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwKKyAgICBwbmdfY29uc3RfY2hhcnAgbmFtZSwgcG5nX3VpbnRfMzIgcHJvZmlsZV9sZW5ndGgpCisgeworICAgIGlmIChwcm9maWxlX2xlbmd0aCA8IDEzMikKK0BAIC0xOTQyLDYgKzE5NDIsNDAgQEAgcG5nX2ljY19jaGVja19sZW5ndGgocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwKKyAgICByZXR1cm4gMTsKKyB9CisgCisrI2lmZGVmIFBOR19SRUFEX2lDQ1BfU1VQUE9SVEVECisraW50IC8qIFBSSVZBVEUgKi8KKytwbmdfaWNjX2NoZWNrX2xlbmd0aChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLAorKyAgICBwbmdfY29uc3RfY2hhcnAgbmFtZSwgcG5nX3VpbnRfMzIgcHJvZmlsZV9sZW5ndGgpCisreworKyAgIGlmICghaWNjX2NoZWNrX2xlbmd0aChwbmdfcHRyLCBjb2xvcnNwYWNlLCBuYW1lLCBwcm9maWxlX2xlbmd0aCkpCisrICAgICAgcmV0dXJuIDA7CisrCisrICAgLyogVGhpcyBuZWVkcyB0byBiZSBoZXJlIGJlY2F1c2UgdGhlICdub3JtYWwnIGNoZWNrIGlzIGluCisrICAgICogcG5nX2RlY29tcHJlc3NfY2h1bmssIHlldCB0aGlzIGhhcHBlbnMgYWZ0ZXIgdGhlIGF0dGVtcHQgdG8KKysgICAgKiBwbmdfbWFsbG9jX2Jhc2UgdGhlIHJlcXVpcmVkIGRhdGEuICBXZSBvbmx5IG5lZWQgdGhpcyBvbiByZWFkOyBvbiB3cml0ZQorKyAgICAqIHRoZSBjYWxsZXIgc3VwcGxpZXMgdGhlIHByb2ZpbGUgYnVmZmVyIHNvIGxpYnBuZyBkb2Vzbid0IGFsbG9jYXRlIGl0LiAgU2VlCisrICAgICogdGhlIGNhbGwgdG8gaWNjX2NoZWNrX2xlbmd0aCBiZWxvdyAodGhlIHdyaXRlIGNhc2UpLgorKyAgICAqLworKyMgIGlmZGVmIFBOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVECisrICAgICAgZWxzZSBpZiAocG5nX3B0ci0+dXNlcl9jaHVua19tYWxsb2NfbWF4ID4gMCAmJgorKyAgICAgICAgICAgICAgIHBuZ19wdHItPnVzZXJfY2h1bmtfbWFsbG9jX21heCA8IHByb2ZpbGVfbGVuZ3RoKQorKyAgICAgICAgIHJldHVybiBwbmdfaWNjX3Byb2ZpbGVfZXJyb3IocG5nX3B0ciwgY29sb3JzcGFjZSwgbmFtZSwgcHJvZmlsZV9sZW5ndGgsCisrICAgICAgICAgICAgICJleGNlZWRzIGFwcGxpY2F0aW9uIGxpbWl0cyIpOworKyMgIGVsaWYgUE5HX1VTRVJfQ0hVTktfTUFMTE9DX01BWCA+IDAKKysgICAgICBlbHNlIGlmIChQTkdfVVNFUl9DSFVOS19NQUxMT0NfTUFYIDwgcHJvZmlsZV9sZW5ndGgpCisrICAgICAgICAgcmV0dXJuIHBuZ19pY2NfcHJvZmlsZV9lcnJvcihwbmdfcHRyLCBjb2xvcnNwYWNlLCBuYW1lLCBwcm9maWxlX2xlbmd0aCwKKysgICAgICAgICAgICAgImV4Y2VlZHMgbGlicG5nIGxpbWl0cyIpOworKyMgIGVsc2UgLyogIVNFVF9VU0VSX0xJTUlUUyAqLworKyAgICAgIC8qIFRoaXMgd2lsbCBnZXQgY29tcGlsZWQgb3V0IG9uIGFsbCAzMi1iaXQgYW5kIGJldHRlciBzeXN0ZW1zLiAqLworKyAgICAgIGVsc2UgaWYgKFBOR19TSVpFX01BWCA8IHByb2ZpbGVfbGVuZ3RoKQorKyAgICAgICAgIHJldHVybiBwbmdfaWNjX3Byb2ZpbGVfZXJyb3IocG5nX3B0ciwgY29sb3JzcGFjZSwgbmFtZSwgcHJvZmlsZV9sZW5ndGgsCisrICAgICAgICAgICAgICJleGNlZWRzIHN5c3RlbSBsaW1pdHMiKTsKKysjICBlbmRpZiAvKiAhU0VUX1VTRVJfTElNSVRTICovCisrCisrICAgcmV0dXJuIDE7CisrfQorKyNlbmRpZiAvKiBSRUFEX2lDQ1AgKi8KKysKKyBpbnQgLyogUFJJVkFURSAqLworIHBuZ19pY2NfY2hlY2tfaGVhZGVyKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29sb3JzcGFjZXJwIGNvbG9yc3BhY2UsCisgICAgcG5nX2NvbnN0X2NoYXJwIG5hbWUsIHBuZ191aW50XzMyIHByb2ZpbGVfbGVuZ3RoLAorQEAgLTIzNzksNyArMjQxMyw3IEBAIHBuZ19jb2xvcnNwYWNlX3NldF9JQ0MocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwKKyAgICBpZiAoKGNvbG9yc3BhY2UtPmZsYWdzICYgUE5HX0NPTE9SU1BBQ0VfSU5WQUxJRCkgIT0gMCkKKyAgICAgICByZXR1cm4gMDsKKyAKKy0gICBpZiAocG5nX2ljY19jaGVja19sZW5ndGgocG5nX3B0ciwgY29sb3JzcGFjZSwgbmFtZSwgcHJvZmlsZV9sZW5ndGgpICE9IDAgJiYKKysgICBpZiAoaWNjX2NoZWNrX2xlbmd0aChwbmdfcHRyLCBjb2xvcnNwYWNlLCBuYW1lLCBwcm9maWxlX2xlbmd0aCkgIT0gMCAmJgorICAgICAgICBwbmdfaWNjX2NoZWNrX2hlYWRlcihwbmdfcHRyLCBjb2xvcnNwYWNlLCBuYW1lLCBwcm9maWxlX2xlbmd0aCwgcHJvZmlsZSwKKyAgICAgICAgICAgY29sb3JfdHlwZSkgIT0gMCAmJgorICAgICAgICBwbmdfaWNjX2NoZWNrX3RhZ190YWJsZShwbmdfcHRyLCBjb2xvcnNwYWNlLCBuYW1lLCBwcm9maWxlX2xlbmd0aCwKK2RpZmYgLS1naXQgYS9wbmdwcml2LmggYi9wbmdwcml2LmgKK2luZGV4IDllYTAyM2ZlYS4uNjMzNjcxMzUyIDEwMDY0NAorLS0tIGEvcG5ncHJpdi5oCisrKysgYi9wbmdwcml2LmgKK0BAIC0xNTQxLDkgKzE1NDEsMTEgQEAgUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfY29sb3JzcGFjZV9zZXRfSUNDLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKKyAgICAvKiBUaGUgJ25hbWUnIGlzIHVzZWQgZm9yIGluZm9ybWF0aW9uIG9ubHkgKi8KKyAKKyAvKiBSb3V0aW5lcyBmb3IgY2hlY2tpbmcgcGFydHMgb2YgYW4gSUNDIHByb2ZpbGUuICovCisrI2lmZGVmIFBOR19SRUFEX2lDQ1BfU1VQUE9SVEVECisgUE5HX0lOVEVSTkFMX0ZVTkNUSU9OKGludCxwbmdfaWNjX2NoZWNrX2xlbmd0aCwocG5nX2NvbnN0X3N0cnVjdHJwIHBuZ19wdHIsCisgICAgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLCBwbmdfY29uc3RfY2hhcnAgbmFtZSwKKyAgICBwbmdfdWludF8zMiBwcm9maWxlX2xlbmd0aCksIFBOR19FTVBUWSk7CisrI2VuZGlmIC8qIFJFQURfaUNDUCAqLworIFBOR19JTlRFUk5BTF9GVU5DVElPTihpbnQscG5nX2ljY19jaGVja19oZWFkZXIsKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLAorICAgIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgcG5nX2NvbnN0X2NoYXJwIG5hbWUsCisgICAgcG5nX3VpbnRfMzIgcHJvZmlsZV9sZW5ndGgsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJwbmcxNi9SRUFETUUucGRmaXVtIGIvdGhpcmRfcGFydHkvbGlicG5nMTYvUkVBRE1FLnBkZml1bQppbmRleCA0N2FmNTJmLi5mYWE1OTU5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJwbmcxNi9SRUFETUUucGRmaXVtCisrKyBiL3RoaXJkX3BhcnR5L2xpYnBuZzE2L1JFQURNRS5wZGZpdW0KQEAgLTE4LDMgKzE4LDQgQEAKIDAwMDAtYnVpbGQtY29uZmlnLnBhdGNoOiBMb2NhbCBidWlsZCBjb25maWd1cmF0aW9uIGNoYW5nZXMuCiAwMDAyLXN0YXRpYy1wbmctZ3QucGF0Y2g6IFVuY29uZGl0aW9uYWxseSB1c2Ugc3RhdGljIHBuZ19ndCgpIGluIHBuZy5jIHRvIGF2b2lkIGNvbXBpbGF0aW9uIHdhcm5pbmcuCiAwMDAzLWNoZWNrLWVycm9ycy1pbi1zZXQtcGNhbC5wYXRjaDogQmFja3BvcnRlZCBnaXRodWIuY29tL2dsZW5ucnAvbGlicG5nL3B1bGwvMTM1CiswMDA0LWludmFsaWQtaWNjLnBhdGNoOiBGaXggZm9yIGxhcmdlIGFsbG9jYXRpb24gZm9yIGludmFsaWQgSUNDIGh0dHBzOi8vZ2l0aHViLmNvbS9nbGVubnJwL2xpYnBuZy9jb21taXQvOTJhN2M3OWRiMmM5NjJkMDQwMDZiMzVlMjYwM2JhOWQ1Y2U3NTU0MQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlicG5nMTYvcG5nLmMgYi90aGlyZF9wYXJ0eS9saWJwbmcxNi9wbmcuYwppbmRleCAzNWUxNGY2Li4wMWQ4ZDliIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJwbmcxNi9wbmcuYworKysgYi90aGlyZF9wYXJ0eS9saWJwbmcxNi9wbmcuYwpAQCAtMTkzMSw4ICsxOTMxLDggQEAKIHN0YXRpYyBjb25zdCBwbmdfYnl0ZSBENTBfbkNJRVhZWlsxMl0gPQogICAgeyAweDAwLCAweDAwLCAweGY2LCAweGQ2LCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGQzLCAweDJkIH07CiAKLWludCAvKiBQUklWQVRFICovCi1wbmdfaWNjX2NoZWNrX2xlbmd0aChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLAorc3RhdGljIGludCAvKiBib29sICovCitpY2NfY2hlY2tfbGVuZ3RoKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29sb3JzcGFjZXJwIGNvbG9yc3BhY2UsCiAgICBwbmdfY29uc3RfY2hhcnAgbmFtZSwgcG5nX3VpbnRfMzIgcHJvZmlsZV9sZW5ndGgpCiB7CiAgICBpZiAocHJvZmlsZV9sZW5ndGggPCAxMzIpCkBAIC0xOTQyLDYgKzE5NDIsNDAgQEAKICAgIHJldHVybiAxOwogfQogCisjaWZkZWYgUE5HX1JFQURfaUNDUF9TVVBQT1JURUQKK2ludCAvKiBQUklWQVRFICovCitwbmdfaWNjX2NoZWNrX2xlbmd0aChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwgcG5nX2NvbG9yc3BhY2VycCBjb2xvcnNwYWNlLAorICAgIHBuZ19jb25zdF9jaGFycCBuYW1lLCBwbmdfdWludF8zMiBwcm9maWxlX2xlbmd0aCkKK3sKKyAgIGlmICghaWNjX2NoZWNrX2xlbmd0aChwbmdfcHRyLCBjb2xvcnNwYWNlLCBuYW1lLCBwcm9maWxlX2xlbmd0aCkpCisgICAgICByZXR1cm4gMDsKKworICAgLyogVGhpcyBuZWVkcyB0byBiZSBoZXJlIGJlY2F1c2UgdGhlICdub3JtYWwnIGNoZWNrIGlzIGluCisgICAgKiBwbmdfZGVjb21wcmVzc19jaHVuaywgeWV0IHRoaXMgaGFwcGVucyBhZnRlciB0aGUgYXR0ZW1wdCB0bworICAgICogcG5nX21hbGxvY19iYXNlIHRoZSByZXF1aXJlZCBkYXRhLiAgV2Ugb25seSBuZWVkIHRoaXMgb24gcmVhZDsgb24gd3JpdGUKKyAgICAqIHRoZSBjYWxsZXIgc3VwcGxpZXMgdGhlIHByb2ZpbGUgYnVmZmVyIHNvIGxpYnBuZyBkb2Vzbid0IGFsbG9jYXRlIGl0LiAgU2VlCisgICAgKiB0aGUgY2FsbCB0byBpY2NfY2hlY2tfbGVuZ3RoIGJlbG93ICh0aGUgd3JpdGUgY2FzZSkuCisgICAgKi8KKyMgIGlmZGVmIFBOR19TRVRfVVNFUl9MSU1JVFNfU1VQUE9SVEVECisgICAgICBlbHNlIGlmIChwbmdfcHRyLT51c2VyX2NodW5rX21hbGxvY19tYXggPiAwICYmCisgICAgICAgICAgICAgICBwbmdfcHRyLT51c2VyX2NodW5rX21hbGxvY19tYXggPCBwcm9maWxlX2xlbmd0aCkKKyAgICAgICAgIHJldHVybiBwbmdfaWNjX3Byb2ZpbGVfZXJyb3IocG5nX3B0ciwgY29sb3JzcGFjZSwgbmFtZSwgcHJvZmlsZV9sZW5ndGgsCisgICAgICAgICAgICAgImV4Y2VlZHMgYXBwbGljYXRpb24gbGltaXRzIik7CisjICBlbGlmIFBOR19VU0VSX0NIVU5LX01BTExPQ19NQVggPiAwCisgICAgICBlbHNlIGlmIChQTkdfVVNFUl9DSFVOS19NQUxMT0NfTUFYIDwgcHJvZmlsZV9sZW5ndGgpCisgICAgICAgICByZXR1cm4gcG5nX2ljY19wcm9maWxlX2Vycm9yKHBuZ19wdHIsIGNvbG9yc3BhY2UsIG5hbWUsIHByb2ZpbGVfbGVuZ3RoLAorICAgICAgICAgICAgICJleGNlZWRzIGxpYnBuZyBsaW1pdHMiKTsKKyMgIGVsc2UgLyogIVNFVF9VU0VSX0xJTUlUUyAqLworICAgICAgLyogVGhpcyB3aWxsIGdldCBjb21waWxlZCBvdXQgb24gYWxsIDMyLWJpdCBhbmQgYmV0dGVyIHN5c3RlbXMuICovCisgICAgICBlbHNlIGlmIChQTkdfU0laRV9NQVggPCBwcm9maWxlX2xlbmd0aCkKKyAgICAgICAgIHJldHVybiBwbmdfaWNjX3Byb2ZpbGVfZXJyb3IocG5nX3B0ciwgY29sb3JzcGFjZSwgbmFtZSwgcHJvZmlsZV9sZW5ndGgsCisgICAgICAgICAgICAgImV4Y2VlZHMgc3lzdGVtIGxpbWl0cyIpOworIyAgZW5kaWYgLyogIVNFVF9VU0VSX0xJTUlUUyAqLworCisgICByZXR1cm4gMTsKK30KKyNlbmRpZiAvKiBSRUFEX2lDQ1AgKi8KKwogaW50IC8qIFBSSVZBVEUgKi8KIHBuZ19pY2NfY2hlY2tfaGVhZGVyKHBuZ19jb25zdF9zdHJ1Y3RycCBwbmdfcHRyLCBwbmdfY29sb3JzcGFjZXJwIGNvbG9yc3BhY2UsCiAgICBwbmdfY29uc3RfY2hhcnAgbmFtZSwgcG5nX3VpbnRfMzIgcHJvZmlsZV9sZW5ndGgsCkBAIC0yMzc5LDcgKzI0MTMsNyBAQAogICAgaWYgKChjb2xvcnNwYWNlLT5mbGFncyAmIFBOR19DT0xPUlNQQUNFX0lOVkFMSUQpICE9IDApCiAgICAgICByZXR1cm4gMDsKIAotICAgaWYgKHBuZ19pY2NfY2hlY2tfbGVuZ3RoKHBuZ19wdHIsIGNvbG9yc3BhY2UsIG5hbWUsIHByb2ZpbGVfbGVuZ3RoKSAhPSAwICYmCisgICBpZiAoaWNjX2NoZWNrX2xlbmd0aChwbmdfcHRyLCBjb2xvcnNwYWNlLCBuYW1lLCBwcm9maWxlX2xlbmd0aCkgIT0gMCAmJgogICAgICAgIHBuZ19pY2NfY2hlY2tfaGVhZGVyKHBuZ19wdHIsIGNvbG9yc3BhY2UsIG5hbWUsIHByb2ZpbGVfbGVuZ3RoLCBwcm9maWxlLAogICAgICAgICAgIGNvbG9yX3R5cGUpICE9IDAgJiYKICAgICAgICBwbmdfaWNjX2NoZWNrX3RhZ190YWJsZShwbmdfcHRyLCBjb2xvcnNwYWNlLCBuYW1lLCBwcm9maWxlX2xlbmd0aCwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnBuZzE2L3BuZ21lbS5jIGIvdGhpcmRfcGFydHkvbGlicG5nMTYvcG5nbWVtLmMKaW5kZXggYjU1MDcxMy4uY2Y4MTVhNiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlicG5nMTYvcG5nbWVtLmMKKysrIGIvdGhpcmRfcGFydHkvbGlicG5nMTYvcG5nbWVtLmMKQEAgLTE5LDggKzE5LDggQEAKIAogI2luY2x1ZGUgInBuZ3ByaXYuaCIKIAotdm9pZCoJRlhNRU1fRGVmYXVsdEFsbG9jKGludCBieXRlX3NpemUsIGludCk7Ci12b2lkCUZYTUVNX0RlZmF1bHRGcmVlKHZvaWQqIHBvaW50ZXIsIGludCk7Cit2b2lkKglGWE1FTV9EZWZhdWx0QWxsb2Moc2l6ZV90IGJ5dGVfc2l6ZSk7Cit2b2lkCUZYTUVNX0RlZmF1bHRGcmVlKHZvaWQqIHBvaW50ZXIpOwogCiAjaWYgZGVmaW5lZChQTkdfUkVBRF9TVVBQT1JURUQpIHx8IGRlZmluZWQoUE5HX1dSSVRFX1NVUFBPUlRFRCkKIC8qIEZyZWUgYSBwbmdfc3RydWN0ICovCkBAIC05NSw3ICs5NSw3IEBACiAKICAgICAgIGVsc2UKICNlbmRpZgotICAgICAgICAgcmV0dXJuIEZYTUVNX0RlZmF1bHRBbGxvYygoaW50KXNpemUsIDApOworICAgICAgICAgcmV0dXJuIEZYTUVNX0RlZmF1bHRBbGxvYyhzaXplKTsKICAgIH0KIAogICAgZWxzZQpAQCAtMjUyLDcgKzI1Miw3IEBACiAgICAgICByZXR1cm47CiAjZW5kaWYgLyogVVNFUl9NRU0gKi8KIAotICAgRlhNRU1fRGVmYXVsdEZyZWUocHRyLCAwKTsKKyAgIEZYTUVNX0RlZmF1bHRGcmVlKHB0cik7CiB9CiAKICNpZmRlZiBQTkdfVVNFUl9NRU1fU1VQUE9SVEVECmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJwbmcxNi9wbmdwcml2LmggYi90aGlyZF9wYXJ0eS9saWJwbmcxNi9wbmdwcml2LmgKaW5kZXggOWVhMDIzZi4uNjMzNjcxMyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlicG5nMTYvcG5ncHJpdi5oCisrKyBiL3RoaXJkX3BhcnR5L2xpYnBuZzE2L3BuZ3ByaXYuaApAQCAtMTU0MSw5ICsxNTQxLDExIEBACiAgICAvKiBUaGUgJ25hbWUnIGlzIHVzZWQgZm9yIGluZm9ybWF0aW9uIG9ubHkgKi8KIAogLyogUm91dGluZXMgZm9yIGNoZWNraW5nIHBhcnRzIG9mIGFuIElDQyBwcm9maWxlLiAqLworI2lmZGVmIFBOR19SRUFEX2lDQ1BfU1VQUE9SVEVECiBQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19pY2NfY2hlY2tfbGVuZ3RoLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKICAgIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgcG5nX2NvbnN0X2NoYXJwIG5hbWUsCiAgICBwbmdfdWludF8zMiBwcm9maWxlX2xlbmd0aCksIFBOR19FTVBUWSk7CisjZW5kaWYgLyogUkVBRF9pQ0NQICovCiBQTkdfSU5URVJOQUxfRlVOQ1RJT04oaW50LHBuZ19pY2NfY2hlY2tfaGVhZGVyLChwbmdfY29uc3Rfc3RydWN0cnAgcG5nX3B0ciwKICAgIHBuZ19jb2xvcnNwYWNlcnAgY29sb3JzcGFjZSwgcG5nX2NvbnN0X2NoYXJwIG5hbWUsCiAgICBwbmdfdWludF8zMiBwcm9maWxlX2xlbmd0aCwKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnBuZzE2L3BuZ3N0cnVjdC5oIGIvdGhpcmRfcGFydHkvbGlicG5nMTYvcG5nc3RydWN0LmgKaW5kZXggMGIzNzJkZS4uYzFmMzVlZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlicG5nMTYvcG5nc3RydWN0LmgKKysrIGIvdGhpcmRfcGFydHkvbGlicG5nMTYvcG5nc3RydWN0LmgKQEAgLTI3LDcgKzI3LDcgQEAKICAgIC8qIFdlIG11c3QgZW5zdXJlIHRoYXQgemxpYiB1c2VzICdjb25zdCcgaW4gZGVjbGFyYXRpb25zLiAqLwogIyAgZGVmaW5lIFpMSUJfQ09OU1QKICNlbmRpZgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L3psaWJfdjEyOC96bGliLmgiCisjaW5jbHVkZSAiemxpYi5oIgogI2lmZGVmIGNvbnN0CiAgICAvKiB6bGliLmggc29tZXRpbWVzICNkZWZpbmVzIGNvbnN0IHRvIG5vdGhpbmcsIHVuZG8gdGhpcy4gKi8KICMgIHVuZGVmIGNvbnN0CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMDAtYnVpbGQtY29uZmlnLnBhdGNoIGIvdGhpcmRfcGFydHkvbGlidGlmZi8wMDAwLWJ1aWxkLWNvbmZpZy5wYXRjaAppbmRleCA2NGU4NmU2Li4yOTg5NjA3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMDAtYnVpbGQtY29uZmlnLnBhdGNoCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAwMC1idWlsZC1jb25maWcucGF0Y2gKQEAgLTY1LDM0ICs2NSwxMCBAQAogIAogIHR5cGVkZWYgc3RydWN0IGpwZWdfZXJyb3JfbWdyIGpwZWdfZXJyb3JfbWdyOwogIHR5cGVkZWYgc3RydWN0IGpwZWdfY29tbW9uX3N0cnVjdCBqcGVnX2NvbW1vbl9zdHJ1Y3Q7Ci1kaWZmIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcGl4YXJsb2cuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3BpeGFybG9nLmMKLS0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3BpeGFybG9nLmMKLSsrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3BpeGFybG9nLmMKLUBAIC05MCw3ICs5MCw3IEBACi0gICovCi0gCi0gI2luY2x1ZGUgInRpZl9wcmVkaWN0LmgiCi0tI2luY2x1ZGUgInpsaWIuaCIKLSsjaW5jbHVkZSAiLi4vemxpYl92MTI4L3psaWIuaCIKLSAKLSAjaW5jbHVkZSA8c3RkaW8uaD4KLSAjaW5jbHVkZSA8c3RkbGliLmg+Ci1kaWZmIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfemlwLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl96aXAuYwotLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfemlwLmMKLSsrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3ppcC5jCi1AQCAtNDcsNyArNDcsNyBAQAotICAqIGxhc3QgZm91bmQgYXQgZnRwOi8vZnRwLnV1Lm5ldC9wdWIvYXJjaGl2aW5nL3ppcC96bGliL3psaWItMC45OS50YXIuZ3ouCi0gICovCi0gI2luY2x1ZGUgInRpZl9wcmVkaWN0LmgiCi0tI2luY2x1ZGUgInpsaWIuaCIKLSsjaW5jbHVkZSAiLi4vemxpYl92MTI4L3psaWIuaCIKLSAKLSAjaW5jbHVkZSA8c3RkaW8uaD4KLSAKIGRpZmYgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmZjb25mLmggYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmZjb25mLmgKIC0tLSAvZGV2L251bGwKICsrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmZmNvbmYuaAotQEAgLTAsMCArMSwyNDggQEAKK0BAIC0wLDAgKzEsMjM5IEBACiArLyogbGlidGlmZi90aWZmY29uZi5oLiAgR2VuZXJhdGVkIGJ5IGNvbmZpZ3VyZS4gICovCiArLyoKICsgIENvbmZpZ3VyYXRpb24gZGVmaW5lcyBmb3IgaW5zdGFsbGVkIGxpYnRpZmYuCkBAIC0xMDIsMjMgKzc4LDEzIEBACiArI2lmbmRlZiBfVElGRkNPTkZfCiArI2RlZmluZSBfVElGRkNPTkZfCiArCi0rI2luY2x1ZGUgImNvcmUvaW5jbHVkZS9meGNydC9meF9zeXN0ZW0uaCIKKysjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKICsKICsvL05PVEU6IFRoZSB0aWZmIGNvZGVjIHJlcXVpcmVzIGFuIEFOU0kgQyBjb21waWxlciBlbnZpcm9ubWVudCBmb3IgYnVpbGRpbmcgYW5kIAotKy8vCQlwcmVzdW1lcyBhbiBBTlNJIEMgZW52aXJvbm1lbnQgZm9yIHVzZS4KKysvLyAgICBwcmVzdW1lcyBhbiBBTlNJIEMgZW52aXJvbm1lbnQgZm9yIHVzZS4KICsKLSsvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAqLwotKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotKyNpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfCi0rIyBkZWZpbmUgT19SRE9OTFkgICAgICAgMHgwMDAwICAvKiBvcGVuIGZvciByZWFkaW5nIG9ubHkgKi8KLSsjIGRlZmluZSBPX1dST05MWSAgICAgICAweDAwMDEgIC8qIG9wZW4gZm9yIHdyaXRpbmcgb25seSAqLwotKyMgZGVmaW5lIE9fUkRXUiAgICAgICAgIDB4MDAwMiAgLyogb3BlbiBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyAqLwotKyMgZGVmaW5lIE9fQ1JFQVQgICAgICAgIDB4MDEwMCAgLyogY3JlYXRlIGFuZCBvcGVuIGZpbGUgKi8KLSsjIGRlZmluZSBPX1RSVU5DICAgICAgICAweDAyMDAgIC8qIG9wZW4gYW5kIHRydW5jYXRlICovCi0rI2Vsc2UKICsjIGRlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKICsjIGRlZmluZSBIQVZFX0ZDTlRMX0ggMQotKyNlbmRpZgogKwogKy8qIENvbXBhdGliaWxpdHkgc3R1ZmYuICovCiArCkBAIC0xMzQsMjIgKzEwMCwyNCBAQAogKy8vZnhfc3lzdGVtLmggYWxyZWFkeSBpbmNsdWRlIHRoZSBzdHJpbmcuaCBpbiBBTlNJQwogKwogKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2VhcmNoLmg+IGhlYWRlciBmaWxlLiAqLwotKy8qI2RlZmluZSBIQVZFX1NFQVJDSF9IIDEgKi8KLSsKLSsvKiBUaGUgc2l6ZSBvZiBhIGBpbnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCi0rLyogQWNjb3JkaW5nIHR5cGVkZWYgaW50CWludDMyX3Q7IGluIHRoZSBmeF9zeXN0ZW0uaCovCi0rI2RlZmluZSBTSVpFT0ZfSU5UIDQKLSsKLSsvKiBTdW5saWFuZy5MaXUgMjAxMTAzMjUuIFdlIHNob3VsZCBjb25maWcgdGhlIGNvcnJlY3QgbG9uZyBzaXplIGZvciB0aWYgCi0rICAgZmF4NGRlY29kZSBvcHRpbWl6ZSBpbiB0aWZfZmF4My5jICAtLSBMaW51eDY0IGRlY29kZSBpc3N1ZS4gCi0rICAgVEVTVERPQzogQnVnICMyMzY2MSAtIHoxLnRpZi4gKi8KLSsjaWYgX0ZYX0NQVV8gPT0gX0ZYX1dJTjY0XyB8fCBfRlhfQ1BVXyA9PSBfRlhfWDY0XyB8fCBfRlhfQ1BVXyA9PSBfRlhfSUE2NF8KLSsvKiBUaGUgc2l6ZSBvZiBgdW5zaWduZWQgbG9uZycsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KLSsjZGVmaW5lIFNJWkVPRl9VTlNJR05FRF9MT05HIDgKLSsjZWxzZQotKyNkZWZpbmUgU0laRU9GX1VOU0lHTkVEX0xPTkcgNAorKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXyAmJiBfTVNDX1ZFUiA+PSAxOTAwCisrLy8gc2VhcmNoLmggaXMgYWx3YXlzIGF2YWlsYWJsZSBpbiBWUyAyMDE1IGFuZCBhYm92ZSwgYW5kIG1heSBiZQorKy8vIGF2YWlsYWJsZSBpbiBlYXJsaWVyIHZlcnNpb25zLgorKyNkZWZpbmUgSEFWRV9TRUFSQ0hfSCAxCiArI2VuZGlmCiArCisrc3RhdGljIGNvbnN0IHNpemVfdCBzaXplT2ZJbnQgPSBzaXplb2YoaW50KTsKKysvKiBUaGUgc2l6ZSBvZiBhIGBpbnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisrI2RlZmluZSBTSVpFT0ZfSU5UIHNpemVPZkludAorKworK3N0YXRpYyBjb25zdCBzaXplX3Qgc2l6ZU9mVUxvbmcgPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisrLyogVGhlIHNpemUgb2YgYHVuc2lnbmVkIGxvbmcnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisrI2RlZmluZSBTSVpFT0ZfVU5TSUdORURfTE9ORyBzaXplT2ZVTG9uZworKworK3N0YXRpYyBjb25zdCBzaXplX3Qgc2l6ZU9mVm9pZFAgPSBzaXplb2Yodm9pZCopOworKy8qIFRoZSBzaXplIG9mIHZvaWQqIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKysjZGVmaW5lIFNJWkVPRl9WT0lEUCBzaXplT2ZWb2lkUAorKwogKy8qIFNpZ25lZCA4LWJpdCB0eXBlICovCiArI2RlZmluZSBUSUZGX0lOVDhfVCBzaWduZWQgY2hhcgogKwpAQCAtMTc0LDcgKzE0Miw3IEBACiArLyogVW5zaWduZWQgMzItYml0IHR5cGUgZm9ybWF0dGVyICovCiArI2RlZmluZSBUSUZGX1VJTlQzMl9GT1JNQVQgIiV1IgogKwotKyNpZmRlZiBfTVNDX1ZFUgkJLy8gd2luZG93cworKyNpZmRlZiBfTVNDX1ZFUiAgIC8vIHdpbmRvd3MKICsKICsvKiBTaWduZWQgNjQtYml0IHR5cGUgZm9ybWF0dGVyICovCiArI2RlZmluZSBUSUZGX0lOVDY0X0ZPUk1BVCAiJUk2NGQiCkBAIC0xODgsOSArMTU2LDkgQEAKICsvKiBVbnNpZ25lZCA2NC1iaXQgdHlwZSAqLwogKyNkZWZpbmUgVElGRl9VSU5UNjRfVCB1bnNpZ25lZCBfX2ludDY0CiArCi0rI2Vsc2UJCQkJCQkvLyBsaW51eC91bml4CisrI2Vsc2UgICAgICAgICAgIC8vIGxpbnV4L3VuaXgKICsKLSsjaWYgMCAvL19GWF9DUFVfID09IF9GWF9YNjRfCS8vIGxpbnV4L3VuaXggNjQKKysjaWYgMCAvL19GWF9DUFVfID09IF9GWF9YNjRfICAvLyBsaW51eC91bml4IDY0CiArCiArLyogU2lnbmVkIDY0LWJpdCB0eXBlIGZvcm1hdHRlciAqLwogKyNkZWZpbmUgVElGRl9JTlQ2NF9GT1JNQVQgIiVsZCIKQEAgLTIwMSw3ICsxNjksNyBAQAogKy8qIFNpZ25lZCA2NC1iaXQgdHlwZSAqLwogKyNkZWZpbmUgVElGRl9JTlQ2NF9UIHNpZ25lZCBsb25nCiArCi0rI2Vsc2UJCQkJCQkvLyBsaW51eC91bml4IDMyCisrI2Vsc2UgICAgICAgICAgIC8vIGxpbnV4L3VuaXggMzIKICsKICsvKiBTaWduZWQgNjQtYml0IHR5cGUgZm9ybWF0dGVyICovCiArI2RlZmluZSBUSUZGX0lOVDY0X0ZPUk1BVCAiJWxsZCIKQEAgLTIxMiw3ICsxODAsNyBAQAogKy8qIFNpZ25lZCA2NC1iaXQgdHlwZSAqLwogKyNkZWZpbmUgVElGRl9JTlQ2NF9UIHNpZ25lZCBsb25nIGxvbmcKICsKLSsjZW5kaWYJCQkJCQkvLyBlbmQgX0ZYX0NQVV8KKysjZW5kaWYgICAgICAgICAgICAvLyBlbmQgX0ZYX0NQVV8KICsKICsvKiBVbnNpZ25lZCA2NC1iaXQgdHlwZSAqLwogKyNkZWZpbmUgVElGRl9VSU5UNjRfVCB1bnNpZ25lZCBsb25nIGxvbmcKQEAgLTI5NSw3ICsyNjMsNyBAQAogKwogKy8qIFN1cHBvcnQgT2xkIEpQRUcgY29tcHJlc3NvbiAocmVhZCBjb250cmliL29qcGVnL1JFQURNRSBmaXJzdCEgQ29tcGlsYXRpb24KICsgICBmYWlscyB3aXRoIHVucGF0Y2hlZCBJSkcgSlBFRyBsaWJyYXJ5KSAqLwotKyNkZWZpbmUgIE9KUEVHX1NVUFBPUlQJMQorKyNkZWZpbmUgIE9KUEVHX1NVUFBPUlQgIDEKICsKICsvKiBTdXBwb3J0IE1hY2ludG9zaCBQYWNrQml0cyBhbGdvcml0aG0gKi8KICsjZGVmaW5lIFBBQ0tCSVRTX1NVUFBPUlQgMQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi8wMDAxLWJ1aWxkLWNvbmZpZy5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAwMS1idWlsZC1jb25maWcucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzOTMxNTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi8wMDAxLWJ1aWxkLWNvbmZpZy5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmZjb25mLmggYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmZjb25mLmgKLWluZGV4IGJjYzBiYzUuLmNhNzQ5ZGEgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmZjb25mLmgKLSsrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmZmNvbmYuaAotQEAgLTM5LDcgKzM5LDExIEBACi0gLy9meF9zeXN0ZW0uaCBhbHJlYWR5IGluY2x1ZGUgdGhlIHN0cmluZy5oIGluIEFOU0lDCi0gCi0gLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzZWFyY2guaD4gaGVhZGVyIGZpbGUuICovCi0tLyojZGVmaW5lIEhBVkVfU0VBUkNIX0ggMSAqLwotKyNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfICYmIF9NU0NfVkVSID49IDE5MDAKLSsvLyBzZWFyY2guaCBpcyBhbHdheXMgYXZhaWxhYmxlIGluIFZTIDIwMTUgYW5kIGFib3ZlLCBhbmQgbWF5IGJlCi0rLy8gYXZhaWxhYmxlIGluIGVhcmxpZXIgdmVyc2lvbnMuCi0rI2RlZmluZSBIQVZFX1NFQVJDSF9IIDEKLSsjZW5kaWYKLSAKLSAvKiBUaGUgc2l6ZSBvZiBhIGBpbnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCi0gLyogQWNjb3JkaW5nIHR5cGVkZWYgaW50CWludDMyX3Q7IGluIHRoZSBmeF9zeXN0ZW0uaCovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMDItQ1ZFLTIwMTUtODY2NS04NjgzLnBhdGNoIGIvdGhpcmRfcGFydHkvbGlidGlmZi8wMDAyLUNWRS0yMDE1LTg2NjUtODY4My5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ3NDBlMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMDItQ1ZFLTIwMTUtODY2NS04NjgzLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLUZyb20gZjk0YTI5YTgyMmY1NTI4ZDIzMzQ1OTI3NjBmYmI3OTM4ZjE1ZWI1NSBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKLUZyb206IGVyb3VhdWx0IDxlcm91YXVsdD4KLURhdGU6IFNhdCwgMjYgRGVjIDIwMTUgMTc6MzI6MDMgKzAwMDAKLVN1YmplY3Q6IFtQQVRDSF0gKiBsaWJ0aWZmL3RpZl9nZXRpbWFnZS5jOiBmaXggb3V0LW9mLWJvdW5kIHJlYWRzIGluCi0gVElGRlJHQkFJbWFnZSBpbnRlcmZhY2UgaW4gY2FzZSBvZiB1bnN1cHBvcnRlZCB2YWx1ZXMgb2YKLSBTYW1wbGVzUGVyUGl4ZWwvRXh0cmFTYW1wbGVzIGZvciBMb2dMVVYgLyBDSUVMYWIuIEFkZCBleHBsaWNpdCBjYWxsIHRvCi0gVElGRlJHQkFJbWFnZU9LKCkgaW4gVElGRlJHQkFJbWFnZUJlZ2luKCkuIEZpeCBDVkUtMjAxNS04NjY1IHJlcG9ydGVkIGJ5Ci0gbGltaW5neGluZyBhbmQgQ1ZFLTIwMTUtODY4MyByZXBvcnRlZCBieSB6emYgb2YgQWxpYmFiYS4KLQotLS0tCi0gQ2hhbmdlTG9nICAgICAgICAgICAgICB8ICA4ICsrKysrKysrCi0gbGlidGlmZi90aWZfZ2V0aW1hZ2UuYyB8IDM1ICsrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tCi0gMiBmaWxlcyBjaGFuZ2VkLCAzMCBpbnNlcnRpb25zKCspLCAxMyBkZWxldGlvbnMoLSkKLQotSW5kZXg6IHRpZmYtNC4wLjMvbGlidGlmZi90aWZfZ2V0aW1hZ2UuYwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tIHRpZmYtNC4wLjMub3JpZy9saWJ0aWZmL3RpZl9nZXRpbWFnZS5jCTIwMTYtMDMtMjMgMTA6MTM6NDIuNzI4MzcxNjYxIC0wNDAwCi0rKysgdGlmZi00LjAuMy9saWJ0aWZmL3RpZl9nZXRpbWFnZS5jCTIwMTYtMDMtMjMgMTA6MTM6NDIuNzI0MzcxNjE0IC0wNDAwCi1AQCAtMTgyLDIwICsxODIsMjIgQEAKLSAJCQkJICAgICJQbGFuYXJjb25maWd1cmF0aW9uIiwgdGQtPnRkX3BsYW5hcmNvbmZpZyk7Ci0gCQkJCXJldHVybiAoMCk7Ci0gCQkJfQotLQkJCWlmKCB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsICE9IDMgKQotKwkJCWlmKCB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsICE9IDMgfHwgY29sb3JjaGFubmVscyAhPSAzICkKLSAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgIHNwcmludGYoZW1zZywKLS0gICAgICAgICAgICAgICAgICAgICAgICAiU29ycnksIGNhbiBub3QgaGFuZGxlIGltYWdlIHdpdGggJXM9JWQiLAotLSAgICAgICAgICAgICAgICAgICAgICAgICJTYW1wbGVzL3BpeGVsIiwgdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCk7Ci0rICAgICAgICAgICAgICAgICAgICAgICAgIlNvcnJ5LCBjYW4gbm90IGhhbmRsZSBpbWFnZSB3aXRoICVzPSVkLCAlcz0lZCIsCi0rICAgICAgICAgICAgICAgICAgICAgICAgIlNhbXBsZXMvcGl4ZWwiLCB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsLAotKyAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvcmNoYW5uZWxzIiwgY29sb3JjaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgIH0KLSAJCQlicmVhazsKLSAJCWNhc2UgUEhPVE9NRVRSSUNfQ0lFTEFCOgotLSAgICAgICAgICAgIGlmKCB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsICE9IDMgfHwgdGQtPnRkX2JpdHNwZXJzYW1wbGUgIT0gOCApCi0rICAgICAgICAgICAgaWYoIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwgIT0gMyB8fCBjb2xvcmNoYW5uZWxzICE9IDMgfHwgdGQtPnRkX2JpdHNwZXJzYW1wbGUgIT0gOCApCi0gICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICBzcHJpbnRmKGVtc2csCi0tICAgICAgICAgICAgICAgICAgICAgICAgIlNvcnJ5LCBjYW4gbm90IGhhbmRsZSBpbWFnZSB3aXRoICVzPSVkIGFuZCAlcz0lZCIsCi0rICAgICAgICAgICAgICAgICAgICAgICAgIlNvcnJ5LCBjYW4gbm90IGhhbmRsZSBpbWFnZSB3aXRoICVzPSVkLCAlcz0lZCBhbmQgJXM9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICJTYW1wbGVzL3BpeGVsIiwgdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCwKLSsgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3JjaGFubmVscyIsIGNvbG9yY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIkJpdHMvc2FtcGxlIiwgdGQtPnRkX2JpdHNwZXJzYW1wbGUpOwotICAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgICB9Ci1AQCAtMjU1LDYgKzI1Nyw5IEBACi0gCWludCBjb2xvcmNoYW5uZWxzOwotIAl1aW50MTYgKnJlZF9vcmlnLCAqZ3JlZW5fb3JpZywgKmJsdWVfb3JpZzsKLSAJaW50IG5fY29sb3I7Ci0rCQotKwlpZiggIVRJRkZSR0JBSW1hZ2VPSyh0aWYsIGVtc2cpICkKLSsJCXJldHVybiAwOwotIAotIAkvKiBJbml0aWFsaXplIHRvIG5vcm1hbCB2YWx1ZXMgKi8KLSAJaW1nLT5yb3dfb2Zmc2V0ID0gMDsKLUBAIC0yNDcwLDI5ICsyNDc1LDMzIEBACi0gCQljYXNlIFBIT1RPTUVUUklDX1JHQjoKLSAJCQlzd2l0Y2ggKGltZy0+Yml0c3BlcnNhbXBsZSkgewotIAkJCQljYXNlIDg6Ci0tCQkJCQlpZiAoaW1nLT5hbHBoYSA9PSBFWFRSQVNBTVBMRV9BU1NPQ0FMUEhBKQotKwkJCQkJaWYgKGltZy0+YWxwaGEgPT0gRVhUUkFTQU1QTEVfQVNTT0NBTFBIQSAmJgotKwkJCQkJCWltZy0+c2FtcGxlc3BlcnBpeGVsID49IDQpCi0gCQkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0UkdCQUFjb250aWc4Yml0dGlsZTsKLS0JCQkJCWVsc2UgaWYgKGltZy0+YWxwaGEgPT0gRVhUUkFTQU1QTEVfVU5BU1NBTFBIQSkKLSsJCQkJCWVsc2UgaWYgKGltZy0+YWxwaGEgPT0gRVhUUkFTQU1QTEVfVU5BU1NBTFBIQSAmJgotKwkJCQkJCQkgaW1nLT5zYW1wbGVzcGVycGl4ZWwgPj0gNCkKLSAJCQkJCXsKLSAJCQkJCQlpZiAoQnVpbGRNYXBVYVRvQWEoaW1nKSkKLSAJCQkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0UkdCVUFjb250aWc4Yml0dGlsZTsKLSAJCQkJCX0KLS0JCQkJCWVsc2UKLSsJCQkJCWVsc2UgaWYoIGltZy0+c2FtcGxlc3BlcnBpeGVsID49IDMgKQotIAkJCQkJCWltZy0+cHV0LmNvbnRpZyA9IHB1dFJHQmNvbnRpZzhiaXR0aWxlOwotIAkJCQkJYnJlYWs7Ci0gCQkJCWNhc2UgMTY6Ci0tCQkJCQlpZiAoaW1nLT5hbHBoYSA9PSBFWFRSQVNBTVBMRV9BU1NPQ0FMUEhBKQotKwkJCQkJaWYgKGltZy0+YWxwaGEgPT0gRVhUUkFTQU1QTEVfQVNTT0NBTFBIQSAmJgotKwkJCQkJCWltZy0+c2FtcGxlc3BlcnBpeGVsID49NCApCi0gCQkJCQl7Ci0gCQkJCQkJaWYgKEJ1aWxkTWFwQml0ZGVwdGgxNlRvOChpbWcpKQotIAkJCQkJCQlpbWctPnB1dC5jb250aWcgPSBwdXRSR0JBQWNvbnRpZzE2Yml0dGlsZTsKLSAJCQkJCX0KLS0JCQkJCWVsc2UgaWYgKGltZy0+YWxwaGEgPT0gRVhUUkFTQU1QTEVfVU5BU1NBTFBIQSkKLSsJCQkJCWVsc2UgaWYgKGltZy0+YWxwaGEgPT0gRVhUUkFTQU1QTEVfVU5BU1NBTFBIQSAmJgotKwkJCQkJCQkgaW1nLT5zYW1wbGVzcGVycGl4ZWwgPj00ICkKLSAJCQkJCXsKLSAJCQkJCQlpZiAoQnVpbGRNYXBCaXRkZXB0aDE2VG84KGltZykgJiYKLSAJCQkJCQkgICAgQnVpbGRNYXBVYVRvQWEoaW1nKSkKLSAJCQkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0UkdCVUFjb250aWcxNmJpdHRpbGU7Ci0gCQkJCQl9Ci0tCQkJCQllbHNlCi0rCQkJCQllbHNlIGlmKCBpbWctPnNhbXBsZXNwZXJwaXhlbCA+PTMgKQotIAkJCQkJewotIAkJCQkJCWlmIChCdWlsZE1hcEJpdGRlcHRoMTZUbzgoaW1nKSkKLSAJCQkJCQkJaW1nLT5wdXQuY29udGlnID0gcHV0UkdCY29udGlnMTZiaXR0aWxlOwotQEAgLTI1MDEsNyArMjUxMCw3IEBACi0gCQkJfQotIAkJCWJyZWFrOwotIAkJY2FzZSBQSE9UT01FVFJJQ19TRVBBUkFURUQ6Ci0tCQkJaWYgKGJ1aWxkTWFwKGltZykpIHsKLSsJCQlpZiAoaW1nLT5zYW1wbGVzcGVycGl4ZWwgPj00ICYmIGJ1aWxkTWFwKGltZykpIHsKLSAJCQkJaWYgKGltZy0+Yml0c3BlcnNhbXBsZSA9PSA4KSB7Ci0gCQkJCQlpZiAoIWltZy0+TWFwKQotIAkJCQkJCWltZy0+cHV0LmNvbnRpZyA9IHB1dFJHQmNvbnRpZzhiaXRDTVlLdGlsZTsKLUBAIC0yNTk3LDcgKzI2MDYsNyBAQAotIAkJCX0KLSAJCQlicmVhazsKLSAJCWNhc2UgUEhPVE9NRVRSSUNfQ0lFTEFCOgotLQkJCWlmIChidWlsZE1hcChpbWcpKSB7Ci0rCQkJaWYgKGltZy0+c2FtcGxlc3BlcnBpeGVsID09IDMgJiYgYnVpbGRNYXAoaW1nKSkgewotIAkJCQlpZiAoaW1nLT5iaXRzcGVyc2FtcGxlID09IDgpCi0gCQkJCQlpbWctPnB1dC5jb250aWcgPSBpbml0Q0lFTGFiQ29udmVyc2lvbihpbWcpOwotIAkJCQlicmVhazsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAwMy1DVkUtMjAxNS04NzgxLTg3ODItODc4My5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAwMy1DVkUtMjAxNS04NzgxLTg3ODItODc4My5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRlZDY3ZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMDMtQ1ZFLTIwMTUtODc4MS04NzgyLTg3ODMucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotRnJvbSBhYWFiNWMzYzlkMmEyYzY5ODRmMjNjY2JjNzk3MDI2MTA0MzliYzY1IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQotRnJvbTogZXJvdWF1bHQgPGVyb3VhdWx0PgotRGF0ZTogU3VuLCAyNyBEZWMgMjAxNSAxNjoyNToxMSArMDAwMAotU3ViamVjdDogW1BBVENIXSAqIGxpYnRpZmYvdGlmX2x1di5jOiBmaXggcG90ZW50aWFsIG91dC1vZi1ib3VuZCB3cml0ZXMgaW4KLSBkZWNvZGUgZnVuY3Rpb25zIGluIG5vbiBkZWJ1ZyBidWlsZHMgYnkgcmVwbGFjaW5nIGFzc2VydCgpcyBieSByZWd1bGFyIGlmCi0gY2hlY2tzIChidWd6aWxsYSAjMjUyMikuIEZpeCBwb3RlbnRpYWwgb3V0LW9mLWJvdW5kIHJlYWRzIGluIGNhc2Ugb2Ygc2hvcnQKLSBpbnB1dCBkYXRhLgotCi0tLS0KLSBDaGFuZ2VMb2cgICAgICAgICB8ICA3ICsrKysrKysKLSBsaWJ0aWZmL3RpZl9sdXYuYyB8IDU1ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0KLSAyIGZpbGVzIGNoYW5nZWQsIDUxIGluc2VydGlvbnMoKyksIDExIGRlbGV0aW9ucygtKQotCi1JbmRleDogdGlmZi00LjAuMy9saWJ0aWZmL3RpZl9sdXYuYwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tIHRpZmYtNC4wLjMub3JpZy9saWJ0aWZmL3RpZl9sdXYuYwkyMDE2LTAzLTIzIDEwOjEzOjU2Ljg2ODU0MDk2MyAtMDQwMAotKysrIHRpZmYtNC4wLjMvbGlidGlmZi90aWZfbHV2LmMJMjAxNi0wMy0yMyAxMDoxMzo1Ni44NjQ1NDA5MTQgLTA0MDAKLUBAIC0yMDIsNyArMjAyLDExIEBACi0gCWlmIChzcC0+dXNlcl9kYXRhZm10ID09IFNHSUxPR0RBVEFGTVRfMTZCSVQpCi0gCQl0cCA9IChpbnQxNiopIG9wOwotIAllbHNlIHsKLS0JCWFzc2VydChzcC0+dGJ1ZmxlbiA+PSBucGl4ZWxzKTsKLSsJCWlmKHNwLT50YnVmbGVuIDwgbnBpeGVscykgewotKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCi0rCQkJCQkJICJUcmFuc2xhdGlvbiBidWZmZXIgdG9vIHNob3J0Iik7Ci0rCQkJcmV0dXJuICgwKTsKLSsJCX0KLSAJCXRwID0gKGludDE2Kikgc3AtPnRidWY7Ci0gCX0KLSAJX1RJRkZtZW1zZXQoKHZvaWQqKSB0cCwgMCwgbnBpeGVscypzaXplb2YgKHRwWzBdKSk7Ci1AQCAtMjExLDkgKzIxNSwxMSBAQAotIAljYyA9IHRpZi0+dGlmX3Jhd2NjOwotIAkvKiBnZXQgZWFjaCBieXRlIHN0cmluZyAqLwotIAlmb3IgKHNoZnQgPSAyKjg7IChzaGZ0IC09IDgpID49IDA7ICkgewotLQkJZm9yIChpID0gMDsgaSA8IG5waXhlbHMgJiYgY2MgPiAwOyApCi0rCQlmb3IgKGkgPSAwOyBpIDwgbnBpeGVscyAmJiBjYyA+IDA7ICkgewotIAkJCWlmICgqYnAgPj0gMTI4KSB7CQkvKiBydW4gKi8KLS0JCQkJcmMgPSAqYnArKyArICgyLTEyOCk7ICAgLyogVE9ETzogcG90ZW50aWFsIGlucHV0IGJ1ZmZlciBvdmVycnVuIHdoZW4gZGVjb2RpbmcgY29ycnVwdCBvciB0cnVuY2F0ZWQgZGF0YSAqLwotKwkJCQlpZiggY2MgPCAyICkKLSsJCQkJCWJyZWFrOwotKwkJCQlyYyA9ICpicCsrICsgKDItMTI4KTsKLSAJCQkJYiA9IChpbnQxNikoKmJwKysgPDwgc2hmdCk7Ci0gCQkJCWNjIC09IDI7Ci0gCQkJCXdoaWxlIChyYy0tICYmIGkgPCBucGl4ZWxzKQotQEAgLTIyMyw2ICsyMjksNyBAQAotIAkJCQl3aGlsZSAoLS1jYyAmJiByYy0tICYmIGkgPCBucGl4ZWxzKQotIAkJCQkJdHBbaSsrXSB8PSAoaW50MTYpKmJwKysgPDwgc2hmdDsKLSAJCQl9Ci0rCQl9Ci0gCQlpZiAoaSAhPSBucGl4ZWxzKSB7Ci0gI2lmIGRlZmluZWQoX19XSU4zMl9fKSAmJiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykpCi0gCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKLUBAIC0yNjgsMTMgKzI3NSwxNyBAQAotIAlpZiAoc3AtPnVzZXJfZGF0YWZtdCA9PSBTR0lMT0dEQVRBRk1UX1JBVykKLSAJCXRwID0gKHVpbnQzMiAqKW9wOwotIAllbHNlIHsKLS0JCWFzc2VydChzcC0+dGJ1ZmxlbiA+PSBucGl4ZWxzKTsKLSsJCWlmKHNwLT50YnVmbGVuIDwgbnBpeGVscykgewotKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCi0rCQkJCQkJICJUcmFuc2xhdGlvbiBidWZmZXIgdG9vIHNob3J0Iik7Ci0rCQkJcmV0dXJuICgwKTsKLSsJCX0KLSAJCXRwID0gKHVpbnQzMiAqKSBzcC0+dGJ1ZjsKLSAJfQotIAkvKiBjb3B5IHRvIGFycmF5IG9mIHVpbnQzMiAqLwotIAlicCA9ICh1bnNpZ25lZCBjaGFyKikgdGlmLT50aWZfcmF3Y3A7Ci0gCWNjID0gdGlmLT50aWZfcmF3Y2M7Ci0tCWZvciAoaSA9IDA7IGkgPCBucGl4ZWxzICYmIGNjID4gMDsgaSsrKSB7Ci0rCWZvciAoaSA9IDA7IGkgPCBucGl4ZWxzICYmIGNjID49IDM7IGkrKykgewotIAkJdHBbaV0gPSBicFswXSA8PCAxNiB8IGJwWzFdIDw8IDggfCBicFsyXTsKLSAJCWJwICs9IDM7Ci0gCQljYyAtPSAzOwotQEAgLTMyNSw3ICszMzYsMTEgQEAKLSAJaWYgKHNwLT51c2VyX2RhdGFmbXQgPT0gU0dJTE9HREFUQUZNVF9SQVcpCi0gCQl0cCA9ICh1aW50MzIqKSBvcDsKLSAJZWxzZSB7Ci0tCQlhc3NlcnQoc3AtPnRidWZsZW4gPj0gbnBpeGVscyk7Ci0rCQlpZihzcC0+dGJ1ZmxlbiA8IG5waXhlbHMpIHsKLSsJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAotKwkJCQkJCSAiVHJhbnNsYXRpb24gYnVmZmVyIHRvbyBzaG9ydCIpOwotKwkJCXJldHVybiAoMCk7Ci0rCQl9Ci0gCQl0cCA9ICh1aW50MzIqKSBzcC0+dGJ1ZjsKLSAJfQotIAlfVElGRm1lbXNldCgodm9pZCopIHRwLCAwLCBucGl4ZWxzKnNpemVvZiAodHBbMF0pKTsKLUBAIC0zMzQsMTEgKzM0OSwxMyBAQAotIAljYyA9IHRpZi0+dGlmX3Jhd2NjOwotIAkvKiBnZXQgZWFjaCBieXRlIHN0cmluZyAqLwotIAlmb3IgKHNoZnQgPSA0Kjg7IChzaGZ0IC09IDgpID49IDA7ICkgewotLQkJZm9yIChpID0gMDsgaSA8IG5waXhlbHMgJiYgY2MgPiAwOyApCi0rCQlmb3IgKGkgPSAwOyBpIDwgbnBpeGVscyAmJiBjYyA+IDA7ICkgewotIAkJCWlmICgqYnAgPj0gMTI4KSB7CQkvKiBydW4gKi8KLSsJCQkJaWYoIGNjIDwgMiApCi0rCQkJCQlicmVhazsKLSAJCQkJcmMgPSAqYnArKyArICgyLTEyOCk7Ci0gCQkJCWIgPSAodWludDMyKSpicCsrIDw8IHNoZnQ7Ci0tCQkJCWNjIC09IDI7ICAgICAgICAgICAgICAgIC8qIFRPRE86IHBvdGVudGlhbCBpbnB1dCBidWZmZXIgb3ZlcnJ1biB3aGVuIGRlY29kaW5nIGNvcnJ1cHQgb3IgdHJ1bmNhdGVkIGRhdGEgKi8KLSsJCQkJY2MgLT0gMjsKLSAJCQkJd2hpbGUgKHJjLS0gJiYgaSA8IG5waXhlbHMpCi0gCQkJCQl0cFtpKytdIHw9IGI7Ci0gCQkJfSBlbHNlIHsJCQkvKiBub24tcnVuICovCi1AQCAtMzQ2LDYgKzM2Myw3IEBACi0gCQkJCXdoaWxlICgtLWNjICYmIHJjLS0gJiYgaSA8IG5waXhlbHMpCi0gCQkJCQl0cFtpKytdIHw9ICh1aW50MzIpKmJwKysgPDwgc2hmdDsKLSAJCQl9Ci0rCQl9Ci0gCQlpZiAoaSAhPSBucGl4ZWxzKSB7Ci0gI2lmIGRlZmluZWQoX19XSU4zMl9fKSAmJiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykpCi0gCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKLUBAIC00MDcsNiArNDI1LDcgQEAKLSBzdGF0aWMgaW50Ci0gTG9nTDE2RW5jb2RlKFRJRkYqIHRpZiwgdWludDgqIGJwLCB0bXNpemVfdCBjYywgdWludDE2IHMpCi0gewotKwlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJMb2dMMTZFbmNvZGUiOwotIAlMb2dMdXZTdGF0ZSogc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKLSAJaW50IHNoZnQ7Ci0gCXRtc2l6ZV90IGk7Ci1AQCAtNDI3LDcgKzQ0NiwxMSBAQAotIAkJdHAgPSAoaW50MTYqKSBicDsKLSAJZWxzZSB7Ci0gCQl0cCA9IChpbnQxNiopIHNwLT50YnVmOwotLQkJYXNzZXJ0KHNwLT50YnVmbGVuID49IG5waXhlbHMpOwotKwkJaWYoc3AtPnRidWZsZW4gPCBucGl4ZWxzKSB7Ci0rCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKLSsJCQkJCQkgIlRyYW5zbGF0aW9uIGJ1ZmZlciB0b28gc2hvcnQiKTsKLSsJCQlyZXR1cm4gKDApOwotKwkJfQotIAkJKCpzcC0+dGZ1bmMpKHNwLCBicCwgbnBpeGVscyk7Ci0gCX0KLSAJLyogY29tcHJlc3MgZWFjaCBieXRlIHN0cmluZyAqLwotQEAgLTUwMCw2ICs1MjMsNyBAQAotIHN0YXRpYyBpbnQKLSBMb2dMdXZFbmNvZGUyNChUSUZGKiB0aWYsIHVpbnQ4KiBicCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKQotIHsKLSsJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiTG9nTHV2RW5jb2RlMjQiOwotIAlMb2dMdXZTdGF0ZSogc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKLSAJdG1zaXplX3QgaTsKLSAJdG1zaXplX3QgbnBpeGVsczsKLUBAIC01MTUsNyArNTM5LDExIEBACi0gCQl0cCA9ICh1aW50MzIqKSBicDsKLSAJZWxzZSB7Ci0gCQl0cCA9ICh1aW50MzIqKSBzcC0+dGJ1ZjsKLS0JCWFzc2VydChzcC0+dGJ1ZmxlbiA+PSBucGl4ZWxzKTsKLSsJCWlmKHNwLT50YnVmbGVuIDwgbnBpeGVscykgewotKwkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCi0rCQkJCQkJICJUcmFuc2xhdGlvbiBidWZmZXIgdG9vIHNob3J0Iik7Ci0rCQkJcmV0dXJuICgwKTsKLSsJCX0KLSAJCSgqc3AtPnRmdW5jKShzcCwgYnAsIG5waXhlbHMpOwotIAl9Ci0gCS8qIHdyaXRlIG91dCBlbmNvZGVkIHBpeGVscyAqLwotQEAgLTU0Nyw2ICs1NzUsNyBAQAotIHN0YXRpYyBpbnQKLSBMb2dMdXZFbmNvZGUzMihUSUZGKiB0aWYsIHVpbnQ4KiBicCwgdG1zaXplX3QgY2MsIHVpbnQxNiBzKQotIHsKLSsJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiTG9nTHV2RW5jb2RlMzIiOwotIAlMb2dMdXZTdGF0ZSogc3AgPSBFbmNvZGVyU3RhdGUodGlmKTsKLSAJaW50IHNoZnQ7Ci0gCXRtc2l6ZV90IGk7Ci1AQCAtNTY4LDcgKzU5NywxMSBAQAotIAkJdHAgPSAodWludDMyKikgYnA7Ci0gCWVsc2UgewotIAkJdHAgPSAodWludDMyKikgc3AtPnRidWY7Ci0tCQlhc3NlcnQoc3AtPnRidWZsZW4gPj0gbnBpeGVscyk7Ci0rCQlpZihzcC0+dGJ1ZmxlbiA8IG5waXhlbHMpIHsKLSsJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAotKwkJCQkJCSAiVHJhbnNsYXRpb24gYnVmZmVyIHRvbyBzaG9ydCIpOwotKwkJCXJldHVybiAoMCk7Ci0rCQl9Ci0gCQkoKnNwLT50ZnVuYykoc3AsIGJwLCBucGl4ZWxzKTsKLSAJfQotIAkvKiBjb21wcmVzcyBlYWNoIGJ5dGUgc3RyaW5nICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMDQtQ1ZFLTIwMTUtODc4NC5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAwNC1DVkUtMjAxNS04Nzg0LnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDQxNWRlLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAwNC1DVkUtMjAxNS04Nzg0LnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotRnJvbSBiMTgwMTJkYWU1NTJmODVkY2M1YzU3ZDNiZjRlOTk3YTE1YjFjYzFjIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQotRnJvbTogZXJvdWF1bHQgPGVyb3VhdWx0PgotRGF0ZTogU3VuLCAyNyBEZWMgMjAxNSAxNjo1NToyMCArMDAwMAotU3ViamVjdDogW1BBVENIXSAqIGxpYnRpZmYvdGlmX25leHQuYzogZml4IHBvdGVudGlhbCBvdXQtb2YtYm91bmQgd3JpdGUgaW4KLSBOZVhURGVjb2RlKCkgdHJpZ2dlcmVkIGJ5IGh0dHA6Ly9sY2FtdHVmLmNvcmVkdW1wLmN4L2FmbC92dWxucy9saWJ0aWZmNS50aWYKLSAoYnVnemlsbGEgIzI1MDgpCi0KLS0tLQotIENoYW5nZUxvZyAgICAgICAgICB8ICA2ICsrKysrKwotIGxpYnRpZmYvdGlmX25leHQuYyB8IDEwICsrKysrKysrLS0KLSAyIGZpbGVzIGNoYW5nZWQsIDE0IGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25zKC0pCi0KLWRpZmYgLS1naXQgYS9saWJ0aWZmL3RpZl9uZXh0LmMgYi9saWJ0aWZmL3RpZl9uZXh0LmMKLWluZGV4IGRkNjY5Y2MuLjBhNWI2MzUgMTAwNjQ0Ci0tLS0gYS9saWJ0aWZmL3RpZl9uZXh0LmMKLSsrKyBiL2xpYnRpZmYvdGlmX25leHQuYwotQEAgLTM3LDcgKzM3LDcgQEAKLSAJY2FzZSAwOglvcFswXSAgPSAodW5zaWduZWQgY2hhcikgKCh2KSA8PCA2KTsgYnJlYWs7CVwKLSAJY2FzZSAxOglvcFswXSB8PSAodikgPDwgNDsgYnJlYWs7CVwKLSAJY2FzZSAyOglvcFswXSB8PSAodikgPDwgMjsgYnJlYWs7CVwKLS0JY2FzZSAzOgkqb3ArKyB8PSAodik7CSAgIGJyZWFrOwlcCi0rCWNhc2UgMzoJKm9wKysgfD0gKHYpOwkgICBvcF9vZmZzZXQrKzsgYnJlYWs7CVwKLSAJfQkJCQkJXAotIH0KLSAKLUBAIC0xMDYsNiArMTA2LDcgQEAgTmVYVERlY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IG9jYywgdWludDE2IHMpCi0gCQkJdWludDMyIGltYWdld2lkdGggPSB0aWYtPnRpZl9kaXIudGRfaW1hZ2V3aWR0aDsKLSAgICAgICAgICAgICBpZiggaXNUaWxlZCh0aWYpICkKLSAgICAgICAgICAgICAgICAgaW1hZ2V3aWR0aCA9IHRpZi0+dGlmX2Rpci50ZF90aWxld2lkdGg7Ci0rICAgICAgICAgICAgdG1zaXplX3Qgb3Bfb2Zmc2V0ID0gMDsKLSAKLSAJCQkvKgotIAkJCSAqIFRoZSBzY2FubGluZSBpcyBjb21wb3NlZCBvZiBhIHNlcXVlbmNlIG9mIGNvbnN0YW50Ci1AQCAtMTIyLDEwICsxMjMsMTUgQEAgTmVYVERlY29kZShUSUZGKiB0aWYsIHVpbnQ4KiBidWYsIHRtc2l6ZV90IG9jYywgdWludDE2IHMpCi0gCQkJCSAqIGJvdW5kcywgcG90ZW50aWFsbHkgcmVzdWx0aW5nIGluIGEgc2VjdXJpdHkKLSAJCQkJICogaXNzdWUuCi0gCQkJCSAqLwotLQkJCQl3aGlsZSAobi0tID4gMCAmJiBucGl4ZWxzIDwgaW1hZ2V3aWR0aCkKLSsJCQkJd2hpbGUgKG4tLSA+IDAgJiYgbnBpeGVscyA8IGltYWdld2lkdGggJiYgb3Bfb2Zmc2V0IDwgc2NhbmxpbmUpCi0gCQkJCQlTRVRQSVhFTChvcCwgZ3JleSk7Ci0gCQkJCWlmIChucGl4ZWxzID49IGltYWdld2lkdGgpCi0gCQkJCQlicmVhazsKLSsgICAgICAgICAgICAgICAgaWYgKG9wX29mZnNldCA+PSBzY2FubGluZSApIHsKLSsgICAgICAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJJbnZhbGlkIGRhdGEgZm9yIHNjYW5saW5lICVsZCIsCi0rICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIHRpZi0+dGlmX3Jvdyk7Ci0rICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOwotKyAgICAgICAgICAgICAgICB9Ci0gCQkJCWlmIChjYyA9PSAwKQotIAkJCQkJZ290byBiYWQ7Ci0gCQkJCW4gPSAqYnArKywgY2MtLTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAwNS1MZWFrLVRJRkZGZXRjaFN0cmlwVGhpbmcucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMDUtTGVhay1USUZGRmV0Y2hTdHJpcFRoaW5nLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjliMTY4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAwNS1MZWFrLVRJRkZGZXRjaFN0cmlwVGhpbmcucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi1kaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZGlycmVhZC5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZGlycmVhZC5jCi1pbmRleCBhMGRjNjhiLi41ZWYzMjY0IDEwMDY0NAotLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZGlycmVhZC5jCi0rKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kaXJyZWFkLmMKLUBAIC01MzcyLDYgKzUzNzIsOCBAQCBUSUZGRmV0Y2hTdHJpcFRoaW5nKFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkaXIsIHVpbnQzMiBuc3RyaXBzLCB1aW50NjQqKiBscHApCi0gCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZGZXRjaFN0cmlwVGhpbmciOwotIAllbnVtIFRJRkZSZWFkRGlyRW50cnlFcnIgZXJyOwotIAl1aW50NjQqIGRhdGE7Ci0rCV9USUZGZnJlZSgqbHBwKTsKLSsJKmxwcCA9IDA7Ci0gCWVycj1USUZGUmVhZERpckVudHJ5TG9uZzhBcnJheSh0aWYsZGlyLCZkYXRhKTsKLSAJaWYgKGVyciE9VElGRlJlYWREaXJFbnRyeUVyck9rKQotIAl7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMDYtSGVhcEJ1ZmZlck92ZXJmbG93LUNob3BVcFNpbmdsZVVuY29tcHJlc3NlZFN0cmlwLnBhdGNoIGIvdGhpcmRfcGFydHkvbGlidGlmZi8wMDA2LUhlYXBCdWZmZXJPdmVyZmxvdy1DaG9wVXBTaW5nbGVVbmNvbXByZXNzZWRTdHJpcC5wYXRjaAppbmRleCA1ODNmMDY4Li41ZDQ0ZmIxIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMDYtSGVhcEJ1ZmZlck92ZXJmbG93LUNob3BVcFNpbmdsZVVuY29tcHJlc3NlZFN0cmlwLnBhdGNoCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAwNi1IZWFwQnVmZmVyT3ZlcmZsb3ctQ2hvcFVwU2luZ2xlVW5jb21wcmVzc2VkU3RyaXAucGF0Y2gKQEAgLTEsOSArMSw5IEBACi1kaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3RpZmYuY3BwIGIvY29yZS9meGNvZGVjL2NvZGVjL2Z4X2NvZGVjX3RpZmYuY3BwCitkaWZmIC0tZ2l0IGEvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY190aWZmbW9kdWxlLmNwcCBiL2NvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfdGlmZm1vZHVsZS5jcHAKIGluZGV4IDA5Y2ZlYTQuLjIwZmRhNjMgMTAwNjQ0Ci0tLS0gYS9jb3JlL2Z4Y29kZWMvY29kZWMvZnhfY29kZWNfdGlmZi5jcHAKLSsrKyBiL2NvcmUvZnhjb2RlYy9jb2RlYy9meF9jb2RlY190aWZmLmNwcAorLS0tIGEvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY190aWZmbW9kdWxlLmNwcAorKysrIGIvY29yZS9meGNvZGVjL2NvZGVjL2Njb2RlY190aWZmbW9kdWxlLmNwcAogQEAgLTc5LDYgKzc5LDEwIEBAIGludCBfVElGRm1lbWNtcChjb25zdCB2b2lkKiBwdHIxLCBjb25zdCB2b2lkKiBwdHIyLCB0bXNpemVfdCBzaXplKSB7Ci0gICByZXR1cm4gRlhTWVNfbWVtY21wKHB0cjEsIHB0cjIsIChzaXplX3Qpc2l6ZSk7CisgICByZXR1cm4gbWVtY21wKHB0cjEsIHB0cjIsIChzaXplX3Qpc2l6ZSk7CiAgfQogIAogK2ludCBfVElGRklmTXVsdGlwbGljYXRpb25PdmVyZmxvdyh0bXNpemVfdCBvcDEsIHRtc2l6ZV90IG9wMikgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi8wMDA3LXVuaW5pdGlhbGl6ZWQtdmFsdWUucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMDctdW5pbml0aWFsaXplZC12YWx1ZS5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZlOTgwNi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMDctdW5pbml0aWFsaXplZC12YWx1ZS5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kaXJyZWFkLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kaXJyZWFkLmMKLWluZGV4IDVlZjMyNjQuLmJjNDEwMjEgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kaXJyZWFkLmMKLSsrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2RpcnJlYWQuYwotQEAgLTQ0NDMsNyArNDQ0Myw3IEBAIFRJRkZGZXRjaERpcmVjdG9yeShUSUZGKiB0aWYsIHVpbnQ2NCBkaXJvZmYsIFRJRkZEaXJFbnRyeSoqIHBkaXIsCi0gCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZGZXRjaERpcmVjdG9yeSI7Ci0gCi0gCXZvaWQqIG9yaWdkaXI7Ci0tCXVpbnQxNiBkaXJjb3VudDE2OwotKwl1aW50MTYgZGlyY291bnQxNiA9IDA7Ci0gCXVpbnQzMiBkaXJzaXplOwotIAlUSUZGRGlyRW50cnkqIGRpcjsKLSAJdWludDgqIG1hOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi8wMDA5LUhlYXBCdWZmZXJPdmVyZmxvdy1QaXhhckxvZ0RlY29kZS5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAwOS1IZWFwQnVmZmVyT3ZlcmZsb3ctUGl4YXJMb2dEZWNvZGUucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZGJlMmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi8wMDA5LUhlYXBCdWZmZXJPdmVyZmxvdy1QaXhhckxvZ0RlY29kZS5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9waXhhcmxvZy5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcGl4YXJsb2cuYwotaW5kZXggYjkzYjRjNy4uMDY3NGZhNCAxMDA2NDQKLS0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3BpeGFybG9nLmMKLSsrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3BpeGFybG9nLmMKLUBAIC00NTcsNiArNDU3LDcgQEAgaG9yaXpvbnRhbEFjY3VtdWxhdGU4YWJncih1aW50MTYgKndwLCBpbnQgbiwgaW50IHN0cmlkZSwgdW5zaWduZWQgY2hhciAqb3AsCi0gdHlwZWRlZglzdHJ1Y3QgewotIAlUSUZGUHJlZGljdG9yU3RhdGUJcHJlZGljdDsKLSAJel9zdHJlYW0JCXN0cmVhbTsKLSsJdG1zaXplX3QJCXRidWZfc2l6ZTsgLyogb25seSBzZXQvdXNlZCBvbiByZWFkaW5nIGZvciBub3cgKi8KLSAJdWludDE2CQkJKnRidWY7IAotIAl1aW50MTYJCQlzdHJpZGU7Ci0gCWludAkJCXN0YXRlOwotQEAgLTY5Miw2ICs2OTMsNyBAQCBQaXhhckxvZ1NldHVwRGVjb2RlKFRJRkYqIHRpZikKLSAJc3AtPnRidWYgPSAodWludDE2ICopIF9USUZGbWFsbG9jKHRidWZfc2l6ZSk7Ci0gCWlmIChzcC0+dGJ1ZiA9PSBOVUxMKQotIAkJcmV0dXJuICgwKTsKLSsJc3AtPnRidWZfc2l6ZSA9IHRidWZfc2l6ZTsKLSAJaWYgKHNwLT51c2VyX2RhdGFmbXQgPT0gUElYQVJMT0dEQVRBRk1UX1VOS05PV04pCi0gCQlzcC0+dXNlcl9kYXRhZm10ID0gUGl4YXJMb2dHdWVzc0RhdGFGbXQodGQpOwotIAlpZiAoc3AtPnVzZXJfZGF0YWZtdCA9PSBQSVhBUkxPR0RBVEFGTVRfVU5LTk9XTikgewotQEAgLTc4MSw2ICs3ODMsMTIgQEAgUGl4YXJMb2dEZWNvZGUoVElGRiogdGlmLCB1aW50OCogb3AsIHRtc2l6ZV90IG9jYywgdWludDE2IHMpCi0gCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiWkxpYiBjYW5ub3QgZGVhbCB3aXRoIGJ1ZmZlcnMgdGhpcyBzaXplIik7Ci0gCQlyZXR1cm4gKDApOwotIAl9Ci0rCS8qIENoZWNrIHRoYXQgd2Ugd2lsbCBub3QgZmlsbCBtb3JlIHRoYW4gd2hhdCB3YXMgYWxsb2NhdGVkICovCi0rCWlmICgodG1zaXplX3Qpc3AtPnN0cmVhbS5hdmFpbF9vdXQgPiBzcC0+dGJ1Zl9zaXplKQotKwl7Ci0rCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAic3AtPnN0cmVhbS5hdmFpbF9vdXQgPiBzcC0+dGJ1Zl9zaXplIik7Ci0rCQlyZXR1cm4gKDApOwotKwl9Ci0gCWRvIHsKLSAJCWludCBzdGF0ZSA9IGluZmxhdGUoJnNwLT5zdHJlYW0sIFpfUEFSVElBTF9GTFVTSCk7Ci0gCQlpZiAoc3RhdGUgPT0gWl9TVFJFQU1fRU5EKSB7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMTAtZml4LWxlYWstaW1hZ2ViZWdpbi5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAxMC1maXgtbGVhay1pbWFnZWJlZ2luLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWFhZjkxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAxMC1maXgtbGVhay1pbWFnZWJlZ2luLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2dldGltYWdlLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9nZXRpbWFnZS5jCi1pbmRleCA4NTIzNzkzLi45N2ZhOTRkIDEwMDY0NAotLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZ2V0aW1hZ2UuYwotKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZ2V0aW1hZ2UuYwotQEAgLTQ3OCwxMCArNDc4LDcgQEAgVElGRlJHQkFJbWFnZUJlZ2luKFRJRkZSR0JBSW1hZ2UqIGltZywgVElGRiogdGlmLCBpbnQgc3RvcCwgY2hhciBlbXNnWzEwMjRdKQotICAgICAgICByZXR1cm4gMTsKLSAKLSAgIGZhaWxfcmV0dXJuOgotLSAgICAgICAgX1RJRkZmcmVlKCBpbWctPnJlZGNtYXAgKTsKLS0gICAgICAgIF9USUZGZnJlZSggaW1nLT5ncmVlbmNtYXAgKTsKLS0gICAgICAgIF9USUZGZnJlZSggaW1nLT5ibHVlY21hcCApOwotLSAgICAgICAgaW1nLT5yZWRjbWFwID0gaW1nLT5ncmVlbmNtYXAgPSBpbWctPmJsdWVjbWFwID0gTlVMTDsKLSsgICAgICAgIFRJRkZSR0JBSW1hZ2VFbmQoaW1nKTsKLSAgICAgICAgIHJldHVybiAwOwotIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAxMS1maXgtbGVhay1pbWFnZWJlZ2luMi5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAxMS1maXgtbGVhay1pbWFnZWJlZ2luMi5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmODJjOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMTEtZml4LWxlYWstaW1hZ2ViZWdpbjIucGF0Y2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1kaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZ2V0aW1hZ2UuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2dldGltYWdlLmMKLWluZGV4IDk3ZmE5NGQuLjFjZjZhYzYgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9nZXRpbWFnZS5jCi0rKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9nZXRpbWFnZS5jCi1AQCAtMjY3LDYgKzI2NywxMyBAQCBUSUZGUkdCQUltYWdlQmVnaW4oVElGRlJHQkFJbWFnZSogaW1nLCBUSUZGKiB0aWYsIGludCBzdG9wLCBjaGFyIGVtc2dbMTAyNF0pCi0gICAgICAgIGltZy0+cmVkY21hcCA9IE5VTEw7Ci0gICAgICAgIGltZy0+Z3JlZW5jbWFwID0gTlVMTDsKLSAgICAgICAgaW1nLT5ibHVlY21hcCA9IE5VTEw7Ci0rICAgICAgIGltZy0+TWFwID0gTlVMTDsKLSsgICAgICAgaW1nLT5CV21hcCA9IE5VTEw7Ci0rICAgICAgIGltZy0+UEFMbWFwID0gTlVMTDsKLSsgICAgICAgaW1nLT55Y2JjciA9IE5VTEw7Ci0rICAgICAgIGltZy0+Y2llbGFiID0gTlVMTDsKLSsgICAgICAgaW1nLT5VYVRvQWEgPSBOVUxMOwotKyAgICAgICBpbWctPkJpdGRlcHRoMTZUbzggPSBOVUxMOwotICAgICAgICBpbWctPnJlcV9vcmllbnRhdGlvbiA9IE9SSUVOVEFUSU9OX0JPVExFRlQ7ICAgICAvKiBJdCBpcyB0aGUgZGVmYXVsdCAqLwotIAotICAgICAgICBpbWctPnRpZiA9IHRpZjsKLUBAIC00NTIsMTMgKzQ1OSw2IEBAIFRJRkZSR0JBSW1hZ2VCZWdpbihUSUZGUkdCQUltYWdlKiBpbWcsIFRJRkYqIHRpZiwgaW50IHN0b3AsIGNoYXIgZW1zZ1sxMDI0XSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaG90b1RhZywgaW1nLT5waG90b21ldHJpYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZ290byBmYWlsX3JldHVybjsKLSAgICAgICAgfQotLSAgICAgICBpbWctPk1hcCA9IE5VTEw7Ci0tICAgICAgIGltZy0+QldtYXAgPSBOVUxMOwotLSAgICAgICBpbWctPlBBTG1hcCA9IE5VTEw7Ci0tICAgICAgIGltZy0+eWNiY3IgPSBOVUxMOwotLSAgICAgICBpbWctPmNpZWxhYiA9IE5VTEw7Ci0tICAgICAgIGltZy0+VWFUb0FhID0gTlVMTDsKLS0gICAgICAgaW1nLT5CaXRkZXB0aDE2VG84ID0gTlVMTDsKLSAgICAgICAgVElGRkdldEZpZWxkKHRpZiwgVElGRlRBR19JTUFHRVdJRFRILCAmaW1nLT53aWR0aCk7Ci0gICAgICAgIFRJRkZHZXRGaWVsZCh0aWYsIFRJRkZUQUdfSU1BR0VMRU5HVEgsICZpbWctPmhlaWdodCk7Ci0gICAgICAgIFRJRkZHZXRGaWVsZERlZmF1bHRlZCh0aWYsIFRJRkZUQUdfT1JJRU5UQVRJT04sICZpbWctPm9yaWVudGF0aW9uKTsKLUBAIC00NzgsNyArNDc4LDcgQEAgVElGRlJHQkFJbWFnZUJlZ2luKFRJRkZSR0JBSW1hZ2UqIGltZywgVElGRiogdGlmLCBpbnQgc3RvcCwgY2hhciBlbXNnWzEwMjRdKQotICAgICAgICByZXR1cm4gMTsKLSAKLSAgIGZhaWxfcmV0dXJuOgotLSAgICAgICAgVElGRlJHQkFJbWFnZUVuZChpbWcpOwotKyAgICAgICAgVElGRlJHQkFJbWFnZUVuZCggaW1nICk7Ci0gICAgICAgICByZXR1cm4gMDsKLSB9Ci0gClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi8wMDEyLWluaXRpYWxpemUtdGlmLXJhd2RhdGEucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMTItaW5pdGlhbGl6ZS10aWYtcmF3ZGF0YS5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU0M2I4OS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMTItaW5pdGlhbGl6ZS10aWYtcmF3ZGF0YS5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9yZWFkLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9yZWFkLmMKLWluZGV4IDVjYjQxOWJkNC4uNTQ4YjFmNWVhIDEwMDY0NAotLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcmVhZC5jCi0rKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9yZWFkLmMKLUBAIC05MzYsNiArOTM2LDkgQEAgVElGRlJlYWRCdWZmZXJTZXR1cChUSUZGKiB0aWYsIHZvaWQqIGJwLCB0bXNpemVfdCBzaXplKQotIAkJICAgIHJldHVybiAoMCk7Ci0gCQl9Ci0gCQl0aWYtPnRpZl9yYXdkYXRhID0gKHVpbnQ4KikgX1RJRkZtYWxsb2ModGlmLT50aWZfcmF3ZGF0YXNpemUpOwotKwkJaWYgKHRpZi0+dGlmX3Jhd2RhdGEpCi0rCQkJbWVtc2V0KHRpZi0+dGlmX3Jhd2RhdGEsIDAsIHRpZi0+dGlmX3Jhd2RhdGFzaXplKTsKLSsKLSAJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfTVlCVUZGRVI7Ci0gCX0KLSAJaWYgKHRpZi0+dGlmX3Jhd2RhdGEgPT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi8wMDEzLXZhbGlkYXRlLXJlZmJsYWNrd2hpdGUucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMTMtdmFsaWRhdGUtcmVmYmxhY2t3aGl0ZS5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMxNGZiZC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMTMtdmFsaWRhdGUtcmVmYmxhY2t3aGl0ZS5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kaXIuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2Rpci5jCi1pbmRleCA3MzIxMmMwMmQuLjE2Y2UzZDNjZSAxMDA2NDQKLS0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2Rpci5jCi0rKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kaXIuYwotQEAgLTQyNiw2ICs0MjYsMTQgQEAgX1RJRkZWU2V0RmllbGQoVElGRiogdGlmLCB1aW50MzIgdGFnLCB2YV9saXN0IGFwKQotIAljYXNlIFRJRkZUQUdfUkVGRVJFTkNFQkxBQ0tXSElURToKLSAJCS8qIFhYWCBzaG91bGQgY2hlY2sgZm9yIG51bGwgcmFuZ2UgKi8KLSAJCV9USUZGc2V0RmxvYXRBcnJheSgmdGQtPnRkX3JlZmJsYWNrd2hpdGUsIHZhX2FyZyhhcCwgZmxvYXQqKSwgNik7Ci0rCQlmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgewotKwkJCWlmIChpc25hbih0ZC0+dGRfcmVmYmxhY2t3aGl0ZVtpXSkpIHsKLSsJCQkJaWYgKGkgJSAyID09IDApCi0rCQkJCQl0ZC0+dGRfcmVmYmxhY2t3aGl0ZVtpXSA9IDA7Ci0rCQkJCWVsc2UKLSsJCQkJCXRkLT50ZF9yZWZibGFja3doaXRlW2ldID0gcG93KDIsIHRkLT50ZF9iaXRzcGVyc2FtcGxlKSAtIDE7Ci0rCQkJfQotKwkJfQotIAkJYnJlYWs7Ci0gCWNhc2UgVElGRlRBR19JTktOQU1FUzoKLSAJCXYgPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi8wMDE0LWNhc3QtdG8tdW5zaWduZWQtaW4tcHV0YWdyZXl0aWxlLnBhdGNoIGIvdGhpcmRfcGFydHkvbGlidGlmZi8wMDE0LWNhc3QtdG8tdW5zaWduZWQtaW4tcHV0YWdyZXl0aWxlLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDMzNmIxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAxNC1jYXN0LXRvLXVuc2lnbmVkLWluLXB1dGFncmV5dGlsZS5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9nZXRpbWFnZS5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZ2V0aW1hZ2UuYwotaW5kZXggMWNmNmFjNmI0Li4yODYxY2RkMWUgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9nZXRpbWFnZS5jCi0rKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9nZXRpbWFnZS5jCi1AQCAtMTI4MSw3ICsxMjgxLDcgQEAgREVDTEFSRUNvbnRpZ1B1dEZ1bmMocHV0YWdyZXl0aWxlKQotICAgICB3aGlsZSAoaC0tID4gMCkgewotICAgICAgICBmb3IgKHggPSB3OyB4LS0gPiAwOykKLSAgICAgICAgIHsKLS0gICAgICAgICAgICAqY3ArKyA9IEJXbWFwWypwcF1bMF0gJiAoKihwcCsxKSA8PCAyNCB8IH5BMSk7Ci0rICAgICAgICAgICAgKmNwKysgPSBCV21hcFsqcHBdWzBdICYgKCh1aW50MzIpKihwcCsxKSA8PCAyNCB8IH5BMSk7Ci0gICAgICAgICAgICAgcHAgKz0gc2FtcGxlc3BlcnBpeGVsOwotICAgICAgICAgfQotICAgICAgICBjcCArPSB0b3NrZXc7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMTUtZml4LWxlYWtzLWluLXRpZl9vanBlZy5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAxNS1maXgtbGVha3MtaW4tdGlmX29qcGVnLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWQzYTQwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAxNS1maXgtbGVha3MtaW4tdGlmX29qcGVnLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX29qcGVnLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9vanBlZy5jCi1pbmRleCBjYzU0NDljZDYuLmY2OWIwMDE0OCAxMDA2NDQKLS0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX29qcGVnLmMKLSsrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX29qcGVnLmMKLUBAIC0xNzkwLDcgKzE3OTAsMTAgQEAgT0pQRUdSZWFkSGVhZGVySW5mb1NlY1RhYmxlc1FUYWJsZShUSUZGKiB0aWYpCi0gICAgICAgICAgICAgICAgICAgICAgICBUSUZGU2Vla0ZpbGUodGlmLHNwLT5xdGFibGVfb2Zmc2V0W21dLFNFRUtfU0VUKTsgCi0gICAgICAgICAgICAgICAgICAgICAgICBwPVRJRkZSZWFkRmlsZSh0aWYsJm9iW3NpemVvZih1aW50MzIpKzVdLDY0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwIT02NCkKLSsgICAgICAgICAgICAgICAgICAgICAgIHsKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RJRkZmcmVlKG9iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDApOwotKyAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc3AtPnF0YWJsZVttXT1vYjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwLT5zb2ZfdHFbbV09bTsKLSAgICAgICAgICAgICAgICB9Ci1AQCAtMTg1NCw3ICsxODU3LDEwIEBAIE9KUEVHUmVhZEhlYWRlckluZm9TZWNUYWJsZXNEY1RhYmxlKFRJRkYqIHRpZikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmJbc2l6ZW9mKHVpbnQzMikrNStuXT1vW25dOwotICAgICAgICAgICAgICAgICAgICAgICAgcD1USUZGUmVhZEZpbGUodGlmLCYocmJbc2l6ZW9mKHVpbnQzMikrMjFdKSxxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwIT1xKQotKyAgICAgICAgICAgICAgICAgICAgICAgewotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVElGRmZyZWUocmIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oMCk7Ci0rICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcC0+ZGN0YWJsZVttXT1yYjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwLT5zb3NfdGRhW21dPShtPDw0KTsKLSAgICAgICAgICAgICAgICB9Ci1AQCAtMTkxOCw3ICsxOTI0LDEwIEBAIE9KUEVHUmVhZEhlYWRlckluZm9TZWNUYWJsZXNBY1RhYmxlKFRJRkYqIHRpZikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmJbc2l6ZW9mKHVpbnQzMikrNStuXT1vW25dOwotICAgICAgICAgICAgICAgICAgICAgICAgcD1USUZGUmVhZEZpbGUodGlmLCYocmJbc2l6ZW9mKHVpbnQzMikrMjFdKSxxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwIT1xKQotKyAgICAgICAgICAgICAgICAgICAgICAgewotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVElGRmZyZWUocmIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4oMCk7Ci0rICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcC0+YWN0YWJsZVttXT1yYjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwLT5zb3NfdGRhW21dPShzcC0+c29zX3RkYVttXXxtKTsKLSAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMTYtZml4LWxlYWstaW4tcGl4YXJsb2dzZXR1cGRlY29kZS5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAxNi1maXgtbGVhay1pbi1waXhhcmxvZ3NldHVwZGVjb2RlLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDllNjc2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAxNi1maXgtbGVhay1pbi1waXhhcmxvZ3NldHVwZGVjb2RlLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3BpeGFybG9nLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9waXhhcmxvZy5jCi1pbmRleCAyOTUzNWQzMWUuLjgwMDA2ZDViMSAxMDA2NDQKLS0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3BpeGFybG9nLmMKLSsrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3BpeGFybG9nLmMKLUBAIC02OTcsNiArNjk3LDkgQEAgUGl4YXJMb2dTZXR1cERlY29kZShUSUZGKiB0aWYpCi0gICAgICAgIGlmIChzcC0+dXNlcl9kYXRhZm10ID09IFBJWEFSTE9HREFUQUZNVF9VTktOT1dOKQotICAgICAgICAgICAgICAgIHNwLT51c2VyX2RhdGFmbXQgPSBQaXhhckxvZ0d1ZXNzRGF0YUZtdCh0ZCk7Ci0gICAgICAgIGlmIChzcC0+dXNlcl9kYXRhZm10ID09IFBJWEFSTE9HREFUQUZNVF9VTktOT1dOKSB7Ci0rICAgICAgICAgICAgICAgX1RJRkZmcmVlKHNwLT50YnVmKTsKLSsgICAgICAgICAgICAgICBzcC0+dGJ1ZiA9IE5VTEw7Ci0rICAgICAgICAgICAgICAgc3AtPnRidWZfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICJQaXhhckxvZyBjb21wcmVzc2lvbiBjYW4ndCBoYW5kbGUgYml0cyBkZXB0aC9kYXRhIGZvcm1hdCBjb21iaW5hdGlvbiAoZGVwdGg6ICVkKSIsIAotICAgICAgICAgICAgICAgICAgICAgICAgdGQtPnRkX2JpdHNwZXJzYW1wbGUpOwotQEAgLTcwNCw2ICs3MDcsOSBAQCBQaXhhckxvZ1NldHVwRGVjb2RlKFRJRkYqIHRpZikKLSAgICAgICAgfQotIAotICAgICAgICBpZiAoaW5mbGF0ZUluaXQoJnNwLT5zdHJlYW0pICE9IFpfT0spIHsKLSsgICAgICAgICAgICAgICBfVElGRmZyZWUoc3AtPnRidWYpOwotKyAgICAgICAgICAgICAgIHNwLT50YnVmID0gTlVMTDsKLSsgICAgICAgICAgICAgICBzcC0+dGJ1Zl9zaXplID0gMDsKLSAgICAgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiJXMiLCBzcC0+c3RyZWFtLm1zZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKLSAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAxNy1zYWZlX3NrZXdzX2luX2d0VGlsZUNvbnRpZy5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAxNy1zYWZlX3NrZXdzX2luX2d0VGlsZUNvbnRpZy5wYXRjaAppbmRleCAxMGM1MDc3Li5hZDZkMzNkIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMTctc2FmZV9za2V3c19pbl9ndFRpbGVDb250aWcucGF0Y2gKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi8wMDE3LXNhZmVfc2tld3NfaW5fZ3RUaWxlQ29udGlnLnBhdGNoCkBAIC0xLDUgKzEsNSBAQAogZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2dldGltYWdlLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9nZXRpbWFnZS5jCi1pbmRleCAyODYxY2RkMWUuLjVlZDFiN2EzNyAxMDA2NDQKK2luZGV4IDg0Y2MxZDFhNy4uODJlMTkxNjRlIDEwMDY0NAogLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZ2V0aW1hZ2UuYwogKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZ2V0aW1hZ2UuYwogQEAgLTMxLDYgKzMxLDcgQEAKQEAgLTEwLDcgKzEwLDcgQEAKICAKICBzdGF0aWMgaW50IGd0VGlsZUNvbnRpZyhUSUZGUkdCQUltYWdlKiwgdWludDMyKiwgdWludDMyLCB1aW50MzIpOwogIHN0YXRpYyBpbnQgZ3RUaWxlU2VwYXJhdGUoVElGRlJHQkFJbWFnZSosIHVpbnQzMiosIHVpbnQzMiwgdWludDMyKTsKLUBAIC02MTIsNiArNjEzLDcgQEAgZ3RUaWxlQ29udGlnKFRJRkZSR0JBSW1hZ2UqIGltZywgdWludDMyKiByYXN0ZXIsIHVpbnQzMiB3LCB1aW50MzIgaCkKK0BAIC02MjksNiArNjI4LDcgQEAgZ3RUaWxlQ29udGlnKFRJRkZSR0JBSW1hZ2UqIGltZywgdWludDMyKiByYXN0ZXIsIHVpbnQzMiB3LCB1aW50MzIgaCkKICAgICAgdWludDMyIHR3LCB0aDsKICAgICAgdW5zaWduZWQgY2hhciogYnVmOwogICAgICBpbnQzMiBmcm9tc2tldywgdG9za2V3OwpAQCAtMTgsMjIgKzE4LDIzIEBACiAgICAgIHVpbnQzMiBucm93OwogICAgICBpbnQgcmV0ID0gMSwgZmxpcDsKICAgICAgdWludDMyIHRoaXNfdHcsIHRvY29sOwotQEAgLTYzMSwxOSArNjMzLDM3IEBAIGd0VGlsZUNvbnRpZyhUSUZGUkdCQUltYWdlKiBpbWcsIHVpbnQzMiogcmFzdGVyLCB1aW50MzIgdywgdWludDMyIGgpCitAQCAtNjQ5LDE5ICs2NDcsMzcgQEAgZ3RUaWxlQ29udGlnKFRJRkZSR0JBSW1hZ2UqIGltZywgdWludDMyKiByYXN0ZXIsIHVpbnQzMiB3LCB1aW50MzIgaCkKICAgICAgZmxpcCA9IHNldG9yaWVudGF0aW9uKGltZyk7CiAgICAgIGlmIChmbGlwICYgRkxJUF9WRVJUSUNBTExZKSB7Ci0gICAgICAgICAgICB5ID0gaCAtIDE7Ci0tICAgICAgICAgICB0b3NrZXcgPSAtKGludDMyKSh0dyArIHcpOwotKyAgICAgICAgICAgc2FmZXNrZXcgPSAwOwotKyAgICAgICAgICAgc2FmZXNrZXcgLT0gdHc7Ci0rICAgICAgICAgICBzYWZlc2tldyAtPSB3OworIAkgICAgeSA9IGggLSAxOworLQkgICAgdG9za2V3ID0gLShpbnQzMikodHcgKyB3KTsKKysJICAgIHNhZmVza2V3ID0gMDsKKysJICAgIHNhZmVza2V3IC09IHR3OworKwkgICAgc2FmZXNrZXcgLT0gdzsKICAgICAgfQogICAgICBlbHNlIHsKLSAgICAgICAgICAgIHkgPSAwOwotLSAgICAgICAgICAgdG9za2V3ID0gLShpbnQzMikodHcgLSB3KTsKLSsgICAgICAgICAgIHNhZmVza2V3ID0gMDsKLSsgICAgICAgICAgIHNhZmVza2V3IC09IHR3OwotKyAgICAgICAgICAgc2FmZXNrZXcgKz13OworIAkgICAgeSA9IDA7CistCSAgICB0b3NrZXcgPSAtKGludDMyKSh0dyAtIHcpOworKwkgICAgc2FmZXNrZXcgPSAwOworKwkgICAgc2FmZXNrZXcgLT0gdHc7CisrCSAgICBzYWZlc2tldyArPXc7CiAgICAgIH0KKyAgICAgIAogKyAgICBpZihzYWZlc2tldyA+IElOVF9NQVggfHwgc2FmZXNrZXcgPCBJTlRfTUlOKXsKICsgICAgICAgX1RJRkZmcmVlKGJ1Zik7CiArICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUodGlmKSwgIiVzIiwgIkludmFsaWQgc2tldyIpOwpAQCAtNDEsOSArNDIsOCBAQAogKyAgICB9CiArICAgIHRvc2tldyA9IHNhZmVza2V3OwogKwotICAgICAgCiAgICAgIC8qCi0gICAgICAqIExlZnRtb3N0IHRpbGUgaXMgY2xpcHBlZCBvbiBsZWZ0IHNpZGUgaWYgY29sX29mZnNldCA+IDAuCisgICAgICAqCUxlZnRtb3N0IHRpbGUgaXMgY2xpcHBlZCBvbiBsZWZ0IHNpZGUgaWYgY29sX29mZnNldCA+IDAuCiAgICAgICAqLwogICAgICBsZWZ0bW9zdF9mcm9tc2tldyA9IGltZy0+Y29sX29mZnNldCAlIHR3OwogICAgICBsZWZ0bW9zdF90dyA9IHR3IC0gbGVmdG1vc3RfZnJvbXNrZXc7CkBAIC01OSwzMCArNTksMzAgQEAKICAgICAgZm9yIChyb3cgPSAwOyByb3cgPCBoOyByb3cgKz0gbnJvdykKICAgICAgewogICAgICAgICAgcm93c3RvcmVhZCA9IHRoIC0gKHJvdyArIGltZy0+cm93X29mZnNldCkgJSB0aDsKLUBAIC02NjgsOSArNjg4LDI0IEBAIGd0VGlsZUNvbnRpZyhUSUZGUkdCQUltYWdlKiBpbWcsIHVpbnQzMiogcmFzdGVyLCB1aW50MzIgdywgdWludDMyIGgpCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBSaWdodG1vc3QgdGlsZSBpcyBjbGlwcGVkIG9uIHJpZ2h0IHNpZGUuCi0gICAgICAgICAgICAgICAgICovCi0tICAgICAgICAgICAgICAgZnJvbXNrZXcgPSB0dyAtICh3IC0gdG9jb2wpOwotKyAgICAgICAgICAgICAgIHNhZmVza2V3ID0gdHc7Ci0rICAgICAgICAgICAgICAgc2FmZXNrZXcgLT0gdzsKLSsgICAgICAgICAgICAgICBzYWZlc2tldyArPSB0b2NvbDsKLSsgICAgICAgICAgICAgICBpZihzYWZlc2tldyA+IElOVF9NQVggfHwgc2FmZXNrZXcgPCBJTlRfTUlOKXsKLSsgICAgICAgICAgICAgICAgICAgICAgIF9USUZGZnJlZShidWYpOwotKyAgICAgICAgICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZSh0aWYpLCAiJXMiLCAiSW52YWxpZCBza2V3Iik7Ci0rICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOwotKyAgICAgICAgICAgICAgIH0KLSsgICAgICAgICAgICAgICBmcm9tc2tldyA9IHNhZmVza2V3OwotICAgICAgICAgICAgICAgIHRoaXNfdHcgPSB0dyAtIGZyb21za2V3OwotLSAgICAgICAgICAgICAgIHRoaXNfdG9za2V3ID0gdG9za2V3ICsgZnJvbXNrZXc7Ci0rICAgICAgICAgICAgICAgc2FmZXNrZXcgPSB0b3NrZXc7Ci0rICAgICAgICAgICAgICAgc2FmZXNrZXcgKz0gZnJvbXNrZXc7Ci0rICAgICAgICAgICAgICAgaWYoc2FmZXNrZXcgPiBJTlRfTUFYIHx8IHNhZmVza2V3IDwgSU5UX01JTil7Ci0rICAgICAgICAgICAgICAgICAgICAgICBfVElGRmZyZWUoYnVmKTsKLSsgICAgICAgICAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUodGlmKSwgIiVzIiwgIkludmFsaWQgc2tldyIpOwotKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKLSsgICAgICAgICAgICAgICB9Ci0rICAgICAgICAgICAgICAgdGhpc190b3NrZXcgPSBzYWZlc2tldzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICgqcHV0KShpbWcsIHJhc3Rlcit5KncrdG9jb2wsIHRvY29sLCB5LCB0aGlzX3R3LCBucm93LCBmcm9tc2tldywgdGhpc190b3NrZXcsIGJ1ZiArIHBvcyk7Ci0gICAgICAgICAgICB0b2NvbCArPSB0aGlzX3R3OworQEAgLTcwNCw5ICs2ODQsMjQgQEAgZ3RUaWxlQ29udGlnKFRJRkZSR0JBSW1hZ2UqIGltZywgdWludDMyKiByYXN0ZXIsIHVpbnQzMiB3LCB1aW50MzIgaCkKKyAJCS8qCisgCQkgKiBSaWdodG1vc3QgdGlsZSBpcyBjbGlwcGVkIG9uIHJpZ2h0IHNpZGUuCisgCQkgKi8KKy0JCWZyb21za2V3ID0gdHcgLSAodyAtIHRvY29sKTsKKysJCXNhZmVza2V3ID0gdHc7CisrCQlzYWZlc2tldyAtPSB3OworKwkJc2FmZXNrZXcgKz0gdG9jb2w7CisrCQlpZihzYWZlc2tldyA+IElOVF9NQVggfHwgc2FmZXNrZXcgPCBJTlRfTUlOKXsKKysJCSAgICAgICAgX1RJRkZmcmVlKGJ1Zik7CisrCQkgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUodGlmKSwgIiVzIiwgIkludmFsaWQgc2tldyIpOworKwkJICAgICAgICByZXR1cm4gKDApOworKwkJfQorKwkJZnJvbXNrZXcgPSBzYWZlc2tldzsKKyAJCXRoaXNfdHcgPSB0dyAtIGZyb21za2V3OworLQkJdGhpc190b3NrZXcgPSB0b3NrZXcgKyBmcm9tc2tldzsKKysJCXNhZmVza2V3ID0gdG9za2V3OworKwkJc2FmZXNrZXcgKz0gZnJvbXNrZXc7CisrCQlpZihzYWZlc2tldyA+IElOVF9NQVggfHwgc2FmZXNrZXcgPCBJTlRfTUlOKXsKKysJCSAgICAgICAgX1RJRkZmcmVlKGJ1Zik7CisrCQkgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUodGlmKSwgIiVzIiwgIkludmFsaWQgc2tldyIpOworKwkJICAgICAgICByZXR1cm4gKDApOworKwkJfQorKwkJdGhpc190b3NrZXcgPSBzYWZlc2tldzsKKyAJICAgIH0KKyAJICAgICgqcHV0KShpbWcsIHJhc3Rlcit5KncrdG9jb2wsIHRvY29sLCB5LCB0aGlzX3R3LCBucm93LCBmcm9tc2tldywgdGhpc190b3NrZXcsIGJ1ZiArIHBvcyk7CisgCSAgICB0b2NvbCArPSB0aGlzX3R3OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi8wMDE4LWZpeC1sZWFrLWluLVByZWRpY3RvclNldHVwRGVjb2RlLnBhdGNoIGIvdGhpcmRfcGFydHkvbGlidGlmZi8wMDE4LWZpeC1sZWFrLWluLVByZWRpY3RvclNldHVwRGVjb2RlLnBhdGNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMThkZjc3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAxOC1maXgtbGVhay1pbi1QcmVkaWN0b3JTZXR1cERlY29kZS5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9waXhhcmxvZy5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcGl4YXJsb2cuYwotaW5kZXggODAwMDZkNWIxLi4yOTUzNWQzMWUgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9waXhhcmxvZy5jCi0rKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9waXhhcmxvZy5jCi1AQCAtNjk3LDkgKzY5Nyw2IEBAIFBpeGFyTG9nU2V0dXBEZWNvZGUoVElGRiogdGlmKQotICAgICAgICBpZiAoc3AtPnVzZXJfZGF0YWZtdCA9PSBQSVhBUkxPR0RBVEFGTVRfVU5LTk9XTikKLSAgICAgICAgICAgICAgICBzcC0+dXNlcl9kYXRhZm10ID0gUGl4YXJMb2dHdWVzc0RhdGFGbXQodGQpOwotICAgICAgICBpZiAoc3AtPnVzZXJfZGF0YWZtdCA9PSBQSVhBUkxPR0RBVEFGTVRfVU5LTk9XTikgewotLSAgICAgICAgICAgICAgIF9USUZGZnJlZShzcC0+dGJ1Zik7Ci0tICAgICAgICAgICAgICAgc3AtPnRidWYgPSBOVUxMOwotLSAgICAgICAgICAgICAgIHNwLT50YnVmX3NpemUgPSAwOwotICAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAiUGl4YXJMb2cgY29tcHJlc3Npb24gY2FuJ3QgaGFuZGxlIGJpdHMgZGVwdGgvZGF0YSBmb3JtYXQgY29tYmluYXRpb24gKGRlcHRoOiAlZCkiLCAKLSAgICAgICAgICAgICAgICAgICAgICAgIHRkLT50ZF9iaXRzcGVyc2FtcGxlKTsKLUBAIC03MDcsOSArNzA0LDYgQEAgUGl4YXJMb2dTZXR1cERlY29kZShUSUZGKiB0aWYpCi0gICAgICAgIH0KLSAKLSAgICAgICAgaWYgKGluZmxhdGVJbml0KCZzcC0+c3RyZWFtKSAhPSBaX09LKSB7Ci0tICAgICAgICAgICAgICAgX1RJRkZmcmVlKHNwLT50YnVmKTsKLS0gICAgICAgICAgICAgICBzcC0+dGJ1ZiA9IE5VTEw7Ci0tICAgICAgICAgICAgICAgc3AtPnRidWZfc2l6ZSA9IDA7Ci0gICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIiVzIiwgc3AtPnN0cmVhbS5tc2cpOwotICAgICAgICAgICAgICAgIHJldHVybiAoMCk7Ci0gICAgICAgIH0gZWxzZSB7Ci1kaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcHJlZGljdC5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcHJlZGljdC5jCi1pbmRleCAxMzg4ZGRlNTkuLjg5NzU2NzJhZSAxMDA2NDQKLS0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3ByZWRpY3QuYwotKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcHJlZGljdC5jCi1AQCAtMTA5LDcgKzEwOSwxMCBAQCBQcmVkaWN0b3JTZXR1cERlY29kZShUSUZGKiB0aWYpCi0gICAgICAgIFRJRkZEaXJlY3RvcnkqIHRkID0gJnRpZi0+dGlmX2RpcjsKLSAKLSAgICAgICAgaWYgKCEoKnNwLT5zZXR1cGRlY29kZSkodGlmKSB8fCAhUHJlZGljdG9yU2V0dXAodGlmKSkKLSsgICAgICAgewotKyAgICAgICAgICAgICAgICgqdGlmLT50aWZfY2xlYW51cCkodGlmKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSsgICAgICAgfQotIAotICAgICAgICBpZiAoc3AtPnByZWRpY3RvciA9PSAyKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh0ZC0+dGRfYml0c3BlcnNhbXBsZSkgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi8wMDE5LWZpeC1pbnZhbGlkLXJlYWRzLVRJRkZGZXRjaE5vcm1hbFRhZy5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAxOS1maXgtaW52YWxpZC1yZWFkcy1USUZGRmV0Y2hOb3JtYWxUYWcucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYmI3ZWYuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi8wMDE5LWZpeC1pbnZhbGlkLXJlYWRzLVRJRkZGZXRjaE5vcm1hbFRhZy5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kaXJyZWFkLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kaXJyZWFkLmMKLWluZGV4IGJjNDEwMjE4NC4uMGUzZjhjY2Q0IDEwMDY0NAotLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZGlycmVhZC5jCi0rKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kaXJyZWFkLmMKLUBAIC00OTgzLDYgKzQ5ODMsMTEgQEAgVElGRkZldGNoTm9ybWFsVGFnKFRJRkYqIHRpZiwgVElGRkRpckVudHJ5KiBkcCwgaW50IHJlY292ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtOwotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGRwLT50ZGlyX2NvdW50ID4gMCAmJiBkYXRhW2RwLT50ZGlyX2NvdW50LTFdICE9ICdcMCcgKQotKyAgICAgICAgICAgICAgICAgICAgICAgIHsKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsIkFTQ0lJIHZhbHVlIGZvciB0YWcgXCIlc1wiIGRvZXMgbm90IGVuZCBpbiBudWxsIGJ5dGUuIEZvcmNpbmcgaXQgdG8gYmUgbnVsbCIsZmlwLT5maWVsZF9uYW1lKTsKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtkcC0+dGRpcl9jb3VudC0xXSA9ICdcMCc7Ci0rICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbT1USUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZywodWludDE2KShkcC0+dGRpcl9jb3VudCksZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSE9MCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RJRkZmcmVlKGRhdGEpOwotQEAgLTUxNTUsNiArNTE2MCwxMSBAQCBUSUZGRmV0Y2hOb3JtYWxUYWcoVElGRiogdGlmLCBUSUZGRGlyRW50cnkqIGRwLCBpbnQgcmVjb3ZlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG07Ci0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGRwLT50ZGlyX2NvdW50ID4gMCAmJiBkYXRhW2RwLT50ZGlyX2NvdW50LTFdICE9ICdcMCcgKQotKyAgICAgICAgICAgICAgICAgICAgewotKyAgICAgICAgICAgICAgICAgICAgICAgIFRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJBU0NJSSB2YWx1ZSBmb3IgdGFnIFwiJXNcIiBkb2VzIG5vdCBlbmQgaW4gbnVsbCBieXRlLiBGb3JjaW5nIGl0IHRvIGJlIG51bGwiLGZpcC0+ZmllbGRfbmFtZSk7Ci0rICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtkcC0+dGRpcl9jb3VudC0xXSA9ICdcMCc7Ci0rICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbT1USUZGU2V0RmllbGQodGlmLGRwLT50ZGlyX3RhZywodWludDMyKShkcC0+dGRpcl9jb3VudCksZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEhPTApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVElGRmZyZWUoZGF0YSk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMjAtdW5yZWFzb25hYmxlLXRkLWJpdHNwZXJzYW1wbGUucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMjAtdW5yZWFzb25hYmxlLXRkLWJpdHNwZXJzYW1wbGUucGF0Y2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZDVlMzQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi8wMDIwLXVucmVhc29uYWJsZS10ZC1iaXRzcGVyc2FtcGxlLnBhdGNoCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2RpcnJlYWQuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2RpcnJlYWQuYwotaW5kZXggMGUzZjhjY2Q0Li5lMDQwM2FlZjMgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kaXJyZWFkLmMKLSsrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2RpcnJlYWQuYwotQEAgLTM3NTQsNiArMzc1NCwxNyBAQCBUSUZGUmVhZERpcmVjdG9yeShUSUZGKiB0aWYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlwID8gZmlwLT5maWVsZF9uYW1lIDogInVua25vd24gdGFnbmFtZSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICAgfQotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbG9yTWFwIG9yIFRyYW5zZmVyRnVuY3Rpb24gZm9yIGhpZ2ggYml0ICovCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVwdGhzIGRvIG5vdCBtYWtlIG11Y2ggc2Vuc2UgYW5kIGNvdWxkIGJlICovCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlZCBhcyBhIGRlbmlhbCBvZiBzZXJ2aWNlIHZlY3RvciAqLwotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aWYtPnRpZl9kaXIudGRfYml0c3BlcnNhbXBsZSA+IDI0KQotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsCi0rICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSWdub3JpbmcgJXMgYmVjYXVzZSBCaXRzUGVyU2FtcGxlPSVkPjI0IiwKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcCA/IGZpcC0+ZmllbGRfbmFtZSA6ICJ1bmtub3duIHRhZ25hbWUiLAotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGUpOwotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRwZXJzYW1wbGU9KDFMPDx0aWYtPnRpZl9kaXIudGRfYml0c3BlcnNhbXBsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChkcC0+dGRpcl90YWc9PVRJRkZUQUdfVFJBTlNGRVJGVU5DVElPTikmJihkcC0+dGRpcl9jb3VudD09KHVpbnQ2NCljb3VudHBlcnNhbXBsZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi8wMDIxLWZpeC1sZWFrcy1vanBlZ3JlYWRlcmluZm9zZWN0YWJsZXMucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMjEtZml4LWxlYWtzLW9qcGVncmVhZGVyaW5mb3NlY3RhYmxlcy5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiNGJkOC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMjEtZml4LWxlYWtzLW9qcGVncmVhZGVyaW5mb3NlY3RhYmxlcy5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLWRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9vanBlZy5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfb2pwZWcuYwotaW5kZXggZjY5YjAwMTQ4Li4yNzZkNTYyZGYgMTAwNjQ0Ci0tLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9vanBlZy5jCi0rKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9vanBlZy5jCi1AQCAtMTc5NCw2ICsxNzk0LDggQEAgT0pQRUdSZWFkSGVhZGVySW5mb1NlY1RhYmxlc1FUYWJsZShUSUZGKiB0aWYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9USUZGZnJlZShvYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSsgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcC0+cXRhYmxlW21dIT0wKQotKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVElGRmZyZWUoc3AtPnF0YWJsZVttXSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcC0+cXRhYmxlW21dPW9iOwotICAgICAgICAgICAgICAgICAgICAgICAgc3AtPnNvZl90cVttXT1tOwotICAgICAgICAgICAgICAgIH0KLUBAIC0xODYxLDYgKzE4NjMsOCBAQCBPSlBFR1JlYWRIZWFkZXJJbmZvU2VjVGFibGVzRGNUYWJsZShUSUZGKiB0aWYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9USUZGZnJlZShyYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSsgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcC0+ZGN0YWJsZVttXSE9MCkKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RJRkZmcmVlKHNwLT5kY3RhYmxlW21dKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwLT5kY3RhYmxlW21dPXJiOwotICAgICAgICAgICAgICAgICAgICAgICAgc3AtPnNvc190ZGFbbV09KG08PDQpOwotICAgICAgICAgICAgICAgIH0KLUBAIC0xOTI4LDYgKzE5MzIsOCBAQCBPSlBFR1JlYWRIZWFkZXJJbmZvU2VjVGFibGVzQWNUYWJsZShUSUZGKiB0aWYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9USUZGZnJlZShyYik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybigwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSsgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcC0+YWN0YWJsZVttXSkKLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RJRkZmcmVlKHNwLT5hY3RhYmxlW21dKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwLT5hY3RhYmxlW21dPXJiOwotICAgICAgICAgICAgICAgICAgICAgICAgc3AtPnNvc190ZGFbbV09KHNwLT5zb3NfdGRhW21dfG0pOwotICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAyNS11cHN0cmVhbS1PT00tZ3RUaWxlQ29udGlnLnBhdGNoIGIvdGhpcmRfcGFydHkvbGlidGlmZi8wMDI1LXVwc3RyZWFtLU9PTS1ndFRpbGVDb250aWcucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRkM2Q3MAotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAyNS11cHN0cmVhbS1PT00tZ3RUaWxlQ29udGlnLnBhdGNoCkBAIC0wLDAgKzEsNDYwIEBACitkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZ2V0aW1hZ2UuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2dldGltYWdlLmMKK2luZGV4IDUzYzkzOGE4OS4uMDNjOWE4MWZiIDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZ2V0aW1hZ2UuYworKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZ2V0aW1hZ2UuYworQEAgLTYyNyw3ICs2MjcsNyBAQCBndFRpbGVDb250aWcoVElGRlJHQkFJbWFnZSogaW1nLCB1aW50MzIqIHJhc3RlciwgdWludDMyIHcsIHVpbnQzMiBoKQorICAgICB1aW50MzIgY29sLCByb3csIHksIHJvd3N0b3JlYWQ7CisgICAgIHRtc2l6ZV90IHBvczsKKyAgICAgdWludDMyIHR3LCB0aDsKKy0gICAgdW5zaWduZWQgY2hhciogYnVmOworKyAgICB1bnNpZ25lZCBjaGFyKiBidWYgPSBOVUxMOworICAgICBpbnQzMiBmcm9tc2tldywgdG9za2V3OworICAgICBpbnQ2NCBzYWZlc2tldzsKKyAgICAgdWludDMyIG5yb3c7CitAQCAtNjM2LDEzICs2MzYsMTQgQEAgZ3RUaWxlQ29udGlnKFRJRkZSR0JBSW1hZ2UqIGltZywgdWludDMyKiByYXN0ZXIsIHVpbnQzMiB3LCB1aW50MzIgaCkKKyAgICAgaW50MzIgdGhpc190b3NrZXcsIGxlZnRtb3N0X3Rvc2tldzsKKyAgICAgaW50MzIgbGVmdG1vc3RfZnJvbXNrZXc7CisgICAgIHVpbnQzMiBsZWZ0bW9zdF90dzsKKysgICAgdG1zaXplX3QgYnVmc2l6ZTsKKyAKKy0gICAgYnVmID0gKHVuc2lnbmVkIGNoYXIqKSBfVElGRm1hbGxvYyhUSUZGVGlsZVNpemUodGlmKSk7CistICAgIGlmIChidWYgPT0gMCkgeworLSAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUodGlmKSwgIiVzIiwgIk5vIHNwYWNlIGZvciB0aWxlIGJ1ZmZlciIpOworLSAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisrICAgIGJ1ZnNpemUgPSBUSUZGVGlsZVNpemUodGlmKTsKKysgICAgaWYgKGJ1ZnNpemUgPT0gMCkgeworKyAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZSh0aWYpLCAiJXMiLCAiTm8gc3BhY2UgZm9yIHRpbGUgYnVmZmVyIik7CisrICAgICAgICByZXR1cm4gKDApOworICAgICB9CistICAgIF9USUZGbWVtc2V0KGJ1ZiwgMCwgVElGRlRpbGVTaXplKHRpZikpOworKworICAgICBUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX1RJTEVXSURUSCwgJnR3KTsKKyAgICAgVElGRkdldEZpZWxkKHRpZiwgVElGRlRBR19USUxFTEVOR1RILCAmdGgpOworIAorQEAgLTY5MSw4ICs2OTIsOSBAQCBndFRpbGVDb250aWcoVElGRlJHQkFJbWFnZSogaW1nLCB1aW50MzIqIHJhc3RlciwgdWludDMyIHcsIHVpbnQzMiBoKQorICAgICAgICBjb2wgPSBpbWctPmNvbF9vZmZzZXQ7CisgICAgICAgIHdoaWxlICh0b2NvbCA8IHcpCisgICAgICAgICB7CistICAgICAgICAgICBpZiAoVElGRlJlYWRUaWxlKHRpZiwgYnVmLCBjb2wsICAKKy0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93K2ltZy0+cm93X29mZnNldCwgMCwgMCk9PSh0bXNpemVfdCkoLTEpICYmIGltZy0+c3RvcG9uZXJyKQorKyAgICAgICAgICAgaWYgKF9USUZGUmVhZFRpbGVBbmRBbGxvY0J1ZmZlcih0aWYsICh2b2lkKiopICZidWYsIGJ1ZnNpemUsIGNvbCwKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93K2ltZy0+cm93X29mZnNldCwgMCwgMCk9PSh0bXNpemVfdCkoLTEpICYmCisrICAgICAgICAgICAgICAgIChidWYgPT0gTlVMTCB8fCBpbWctPnN0b3BvbmVycikpCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICByZXQgPSAwOworICAgICAgICAgICAgICAgICBicmVhazsKK0BAIC03NzIsMTEgKzc3NCwxMSBAQCBndFRpbGVTZXBhcmF0ZShUSUZGUkdCQUltYWdlKiBpbWcsIHVpbnQzMiogcmFzdGVyLCB1aW50MzIgdywgdWludDMyIGgpCisgICAgICAgIHVpbnQzMiBjb2wsIHJvdywgeSwgcm93c3RvcmVhZDsKKyAgICAgICAgdG1zaXplX3QgcG9zOworICAgICAgICB1aW50MzIgdHcsIHRoOworLSAgICAgICB1bnNpZ25lZCBjaGFyKiBidWY7CistICAgICAgIHVuc2lnbmVkIGNoYXIqIHAwOworLSAgICAgICB1bnNpZ25lZCBjaGFyKiBwMTsKKy0gICAgICAgdW5zaWduZWQgY2hhciogcDI7CistICAgICAgIHVuc2lnbmVkIGNoYXIqIHBhOworKyAgICAgICB1bnNpZ25lZCBjaGFyKiBidWYgPSBOVUxMOworKyAgICAgICB1bnNpZ25lZCBjaGFyKiBwMCA9IE5VTEw7CisrICAgICAgIHVuc2lnbmVkIGNoYXIqIHAxID0gTlVMTDsKKysgICAgICAgdW5zaWduZWQgY2hhciogcDIgPSBOVUxMOworKyAgICAgICB1bnNpZ25lZCBjaGFyKiBwYSA9IE5VTEw7CisgICAgICAgIHRtc2l6ZV90IHRpbGVzaXplOworICAgICAgICB0bXNpemVfdCBidWZzaXplOworICAgICAgICBpbnQzMiBmcm9tc2tldywgdG9za2V3OworQEAgLTc5NSwxNiArNzk3LDcgQEAgZ3RUaWxlU2VwYXJhdGUoVElGRlJHQkFJbWFnZSogaW1nLCB1aW50MzIqIHJhc3RlciwgdWludDMyIHcsIHVpbnQzMiBoKQorICAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUodGlmKSwgIkludGVnZXIgb3ZlcmZsb3cgaW4gJXMiLCAiZ3RUaWxlU2VwYXJhdGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKDApOworICAgICAgICB9CistICAgICAgIGJ1ZiA9ICh1bnNpZ25lZCBjaGFyKikgX1RJRkZtYWxsb2MoYnVmc2l6ZSk7CistICAgICAgIGlmIChidWYgPT0gMCkgeworLSAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUodGlmKSwgIiVzIiwgIk5vIHNwYWNlIGZvciB0aWxlIGJ1ZmZlciIpOworLSAgICAgICAgICAgICAgIHJldHVybiAoMCk7CistICAgICAgIH0KKy0gICAgICAgX1RJRkZtZW1zZXQoYnVmLCAwLCBidWZzaXplKTsKKy0gICAgICAgcDAgPSBidWY7CistICAgICAgIHAxID0gcDAgKyB0aWxlc2l6ZTsKKy0gICAgICAgcDIgPSBwMSArIHRpbGVzaXplOworLSAgICAgICBwYSA9IChhbHBoYT8ocDIrdGlsZXNpemUpOk5VTEwpOworKworICAgICAgICBUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX1RJTEVXSURUSCwgJnR3KTsKKyAgICAgICAgVElGRkdldEZpZWxkKHRpZiwgVElGRlRBR19USUxFTEVOR1RILCAmdGgpOworIAorQEAgLTgyNCw3ICs4MTcsNiBAQCBndFRpbGVTZXBhcmF0ZShUSUZGUkdCQUltYWdlKiBpbWcsIHVpbnQzMiogcmFzdGVyLCB1aW50MzIgdywgdWludDMyIGgpCisgICAgICAgICAgIGNhc2UgUEhPVE9NRVRSSUNfTUlOSVNCTEFDSzoKKyAgICAgICAgICAgY2FzZSBQSE9UT01FVFJJQ19QQUxFVFRFOgorICAgICAgICAgICAgIGNvbG9yY2hhbm5lbHMgPSAxOworLSAgICAgICAgICAgIHAyID0gcDEgPSBwMDsKKyAgICAgICAgICAgICBicmVhazsKKyAKKyAgICAgICAgICAgZGVmYXVsdDoKK0BAIC04NDksNyArODQxLDMwIEBAIGd0VGlsZVNlcGFyYXRlKFRJRkZSR0JBSW1hZ2UqIGltZywgdWludDMyKiByYXN0ZXIsIHVpbnQzMiB3LCB1aW50MzIgaCkKKyAgICAgICAgICAgICAgICBjb2wgPSBpbWctPmNvbF9vZmZzZXQ7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRvY29sIDwgdykKKyAgICAgICAgICAgICAgICB7CistICAgICAgICAgICAgICAgICAgICAgICBpZiAoVElGRlJlYWRUaWxlKHRpZiwgcDAsIGNvbCwgIAorKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBidWYgPT0gTlVMTCApCisrICAgICAgICAgICAgICAgICAgICAgICAgeworKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX1RJRkZSZWFkVGlsZUFuZEFsbG9jQnVmZmVyKAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZiwgKHZvaWQqKikgJmJ1ZiwgYnVmc2l6ZSwgY29sLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdytpbWctPnJvd19vZmZzZXQsMCwwKT09KHRtc2l6ZV90KSgtMSkKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChidWYgPT0gTlVMTCB8fCBpbWctPnN0b3BvbmVycikpCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAwOworKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisrICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAwID0gYnVmOworKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggY29sb3JjaGFubmVscyA9PSAxICkKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDIgPSBwMSA9IHAwOworKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGEgPSAoYWxwaGE/KHAwKzMqdGlsZXNpemUpOk5VTEwpOworKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisrICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDEgPSBwMCArIHRpbGVzaXplOworKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDIgPSBwMSArIHRpbGVzaXplOworKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGEgPSAoYWxwaGE/KHAyK3RpbGVzaXplKTpOVUxMKTsKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKysgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRJRkZSZWFkVGlsZSh0aWYsIHAwLCBjb2wsICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3craW1nLT5yb3dfb2Zmc2V0LDAsMCk9PSh0bXNpemVfdCkoLTEpICYmIGltZy0+c3RvcG9uZXJyKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAwOworQEAgLTk0MCwxMyArOTU1LDE0IEBAIGd0U3RyaXBDb250aWcoVElGRlJHQkFJbWFnZSogaW1nLCB1aW50MzIqIHJhc3RlciwgdWludDMyIHcsIHVpbnQzMiBoKQorICAgICAgICB0aWxlQ29udGlnUm91dGluZSBwdXQgPSBpbWctPnB1dC5jb250aWc7CisgICAgICAgIHVpbnQzMiByb3csIHksIG5yb3csIG5yb3dzdWIsIHJvd3N0b3JlYWQ7CisgICAgICAgIHRtc2l6ZV90IHBvczsKKy0gICAgICAgdW5zaWduZWQgY2hhciogYnVmOworKyAgICAgICB1bnNpZ25lZCBjaGFyKiBidWYgPSBOVUxMOworICAgICAgICB1aW50MzIgcm93c3BlcnN0cmlwOworICAgICAgICB1aW50MTYgc3Vic2FtcGxpbmdob3Isc3Vic2FtcGxpbmd2ZXI7CisgICAgICAgIHVpbnQzMiBpbWFnZXdpZHRoID0gaW1nLT53aWR0aDsKKyAgICAgICAgdG1zaXplX3Qgc2NhbmxpbmU7CisgICAgICAgIGludDMyIGZyb21za2V3LCB0b3NrZXc7CisgICAgICAgIGludCByZXQgPSAxLCBmbGlwOworKyAgICAgICB0bXNpemVfdCBtYXhzdHJpcHNpemU7CisgCisgICAgICAgIFRJRkZHZXRGaWVsZERlZmF1bHRlZCh0aWYsIFRJRkZUQUdfWUNCQ1JTVUJTQU1QTElORywgJnN1YnNhbXBsaW5naG9yLCAmc3Vic2FtcGxpbmd2ZXIpOworICAgICAgICBpZiggc3Vic2FtcGxpbmd2ZXIgPT0gMCApIHsKK0BAIC05NTQsMTIgKzk3MCw3IEBAIGd0U3RyaXBDb250aWcoVElGRlJHQkFJbWFnZSogaW1nLCB1aW50MzIqIHJhc3RlciwgdWludDMyIHcsIHVpbnQzMiBoKQorICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KKyAKKy0gICAgICAgYnVmID0gKHVuc2lnbmVkIGNoYXIqKSBfVElGRm1hbGxvYyhUSUZGU3RyaXBTaXplKHRpZikpOworLSAgICAgICBpZiAoYnVmID09IDApIHsKKy0gICAgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKHRpZiksICJObyBzcGFjZSBmb3Igc3RyaXAgYnVmZmVyIik7CistICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKKy0gICAgICAgfQorLSAgICAgICBfVElGRm1lbXNldChidWYsIDAsIFRJRkZTdHJpcFNpemUodGlmKSk7CisrICAgICAgIG1heHN0cmlwc2l6ZSA9IFRJRkZTdHJpcFNpemUodGlmKTsKKyAKKyAgICAgICAgZmxpcCA9IHNldG9yaWVudGF0aW9uKGltZyk7CisgICAgICAgIGlmIChmbGlwICYgRkxJUF9WRVJUSUNBTExZKSB7CitAQCAtOTgxLDExICs5OTIsMTIgQEAgZ3RTdHJpcENvbnRpZyhUSUZGUkdCQUltYWdlKiBpbWcsIHVpbnQzMiogcmFzdGVyLCB1aW50MzIgdywgdWludDMyIGgpCisgICAgICAgICAgICAgICAgbnJvd3N1YiA9IG5yb3c7CisgICAgICAgICAgICAgICAgaWYgKChucm93c3ViJXN1YnNhbXBsaW5ndmVyKSE9MCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5yb3dzdWIrPXN1YnNhbXBsaW5ndmVyLW5yb3dzdWIlc3Vic2FtcGxpbmd2ZXI7CistICAgICAgICAgICAgICAgaWYgKFRJRkZSZWFkRW5jb2RlZFN0cmlwKHRpZiwKKysgICAgICAgICAgICAgICBpZiAoX1RJRkZSZWFkRW5jb2RlZFN0cmlwQW5kQWxsb2NCdWZmZXIodGlmLAorICAgICAgICAgICAgICAgICAgICBUSUZGQ29tcHV0ZVN0cmlwKHRpZixyb3craW1nLT5yb3dfb2Zmc2V0LCAwKSwKKy0gICAgICAgICAgICAgICAgICAgYnVmLAorKyAgICAgICAgICAgICAgICAgICAodm9pZCoqKSgmYnVmKSwKKysgICAgICAgICAgICAgICAgICAgbWF4c3RyaXBzaXplLAorICAgICAgICAgICAgICAgICAgICAoKHJvdyArIGltZy0+cm93X29mZnNldCklcm93c3BlcnN0cmlwICsgbnJvd3N1YikgKiBzY2FubGluZSk9PSh0bXNpemVfdCkoLTEpCistICAgICAgICAgICAgICAgICAgICYmIGltZy0+c3RvcG9uZXJyKQorKyAgICAgICAgICAgICAgICAgICAmJiAoYnVmID09IE5VTEwgfHwgaW1nLT5zdG9wb25lcnIpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKK0BAIC0xMDI5LDggKzEwNDEsOCBAQCBndFN0cmlwU2VwYXJhdGUoVElGRlJHQkFJbWFnZSogaW1nLCB1aW50MzIqIHJhc3RlciwgdWludDMyIHcsIHVpbnQzMiBoKQorIHsKKyAgICAgICAgVElGRiogdGlmID0gaW1nLT50aWY7CisgICAgICAgIHRpbGVTZXBhcmF0ZVJvdXRpbmUgcHV0ID0gaW1nLT5wdXQuc2VwYXJhdGU7CistICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZjsKKy0gICAgICAgdW5zaWduZWQgY2hhciAqcDAsICpwMSwgKnAyLCAqcGE7CisrICAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiA9IE5VTEw7CisrICAgICAgIHVuc2lnbmVkIGNoYXIgKnAwID0gTlVMTCwgKnAxID0gTlVMTCwgKnAyID0gTlVMTCwgKnBhID0gTlVMTDsKKyAgICAgICAgdWludDMyIHJvdywgeSwgbnJvdywgcm93c3RvcmVhZDsKKyAgICAgICAgdG1zaXplX3QgcG9zOworICAgICAgICB0bXNpemVfdCBzY2FubGluZTsKK0BAIC0xMDQ5LDE1ICsxMDYxLDYgQEAgZ3RTdHJpcFNlcGFyYXRlKFRJRkZSR0JBSW1hZ2UqIGltZywgdWludDMyKiByYXN0ZXIsIHVpbnQzMiB3LCB1aW50MzIgaCkKKyAgICAgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKHRpZiksICJJbnRlZ2VyIG92ZXJmbG93IGluICVzIiwgImd0U3RyaXBTZXBhcmF0ZSIpOworICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KKy0gICAgICAgcDAgPSBidWYgPSAodW5zaWduZWQgY2hhciAqKV9USUZGbWFsbG9jKGJ1ZnNpemUpOworLSAgICAgICBpZiAoYnVmID09IDApIHsKKy0gICAgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKHRpZiksICJObyBzcGFjZSBmb3IgdGlsZSBidWZmZXIiKTsKKy0gICAgICAgICAgICAgICByZXR1cm4gKDApOworLSAgICAgICB9CistICAgICAgIF9USUZGbWVtc2V0KGJ1ZiwgMCwgYnVmc2l6ZSk7CistICAgICAgIHAxID0gcDAgKyBzdHJpcHNpemU7CistICAgICAgIHAyID0gcDEgKyBzdHJpcHNpemU7CistICAgICAgIHBhID0gKGFscGhhPyhwMitzdHJpcHNpemUpOk5VTEwpOworIAorICAgICAgICBmbGlwID0gc2V0b3JpZW50YXRpb24oaW1nKTsKKyAgICAgICAgaWYgKGZsaXAgJiBGTElQX1ZFUlRJQ0FMTFkpIHsKK0BAIC0xMDc1LDcgKzEwNzgsNiBAQCBndFN0cmlwU2VwYXJhdGUoVElGRlJHQkFJbWFnZSogaW1nLCB1aW50MzIqIHJhc3RlciwgdWludDMyIHcsIHVpbnQzMiBoKQorICAgICAgICAgICBjYXNlIFBIT1RPTUVUUklDX01JTklTQkxBQ0s6CisgICAgICAgICAgIGNhc2UgUEhPVE9NRVRSSUNfUEFMRVRURToKKyAgICAgICAgICAgICBjb2xvcmNoYW5uZWxzID0gMTsKKy0gICAgICAgICAgICBwMiA9IHAxID0gcDA7CisgICAgICAgICAgICAgYnJlYWs7CisgCisgICAgICAgICAgIGRlZmF1bHQ6CitAQCAtMTA5MSw3ICsxMDkzLDMxIEBAIGd0U3RyaXBTZXBhcmF0ZShUSUZGUkdCQUltYWdlKiBpbWcsIHVpbnQzMiogcmFzdGVyLCB1aW50MzIgdywgdWludDMyIGgpCisgICAgICAgICAgICAgICAgcm93c3RvcmVhZCA9IHJvd3NwZXJzdHJpcCAtIChyb3cgKyBpbWctPnJvd19vZmZzZXQpICUgcm93c3BlcnN0cmlwOworICAgICAgICAgICAgICAgIG5yb3cgPSAocm93ICsgcm93c3RvcmVhZCA+IGggPyBoIC0gcm93IDogcm93c3RvcmVhZCk7CisgICAgICAgICAgICAgICAgb2Zmc2V0X3JvdyA9IHJvdyArIGltZy0+cm93X29mZnNldDsKKy0gICAgICAgICAgICAgICBpZiAoVElGRlJlYWRFbmNvZGVkU3RyaXAodGlmLCBUSUZGQ29tcHV0ZVN0cmlwKHRpZiwgb2Zmc2V0X3JvdywgMCksCisrICAgICAgICAgICAgICAgIGlmKCBidWYgPT0gTlVMTCApCisrICAgICAgICAgICAgICAgIHsKKysgICAgICAgICAgICAgICAgICAgIGlmIChfVElGRlJlYWRFbmNvZGVkU3RyaXBBbmRBbGxvY0J1ZmZlcigKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlmLCBUSUZGQ29tcHV0ZVN0cmlwKHRpZiwgb2Zmc2V0X3JvdywgMCksCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiopICZidWYsIGJ1ZnNpemUsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocm93ICsgaW1nLT5yb3dfb2Zmc2V0KSVyb3dzcGVyc3RyaXAgKyBucm93KSAqIHNjYW5saW5lKT09KHRtc2l6ZV90KSgtMSkKKysgICAgICAgICAgICAgICAgICAgICAgICAmJiAoYnVmID09IE5VTEwgfHwgaW1nLT5zdG9wb25lcnIpKQorKyAgICAgICAgICAgICAgICAgICAgeworKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAwOworKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKysgICAgICAgICAgICAgICAgICAgIH0KKysgICAgICAgICAgICAgICAgICAgIHAwID0gYnVmOworKyAgICAgICAgICAgICAgICAgICAgaWYoIGNvbG9yY2hhbm5lbHMgPT0gMSApCisrICAgICAgICAgICAgICAgICAgICB7CisrICAgICAgICAgICAgICAgICAgICAgICAgcDIgPSBwMSA9IHAwOworKyAgICAgICAgICAgICAgICAgICAgICAgIHBhID0gKGFscGhhPyhwMCszKnN0cmlwc2l6ZSk6TlVMTCk7CisrICAgICAgICAgICAgICAgICAgICB9CisrICAgICAgICAgICAgICAgICAgICBlbHNlCisrICAgICAgICAgICAgICAgICAgICB7CisrICAgICAgICAgICAgICAgICAgICAgICAgcDEgPSBwMCArIHN0cmlwc2l6ZTsKKysgICAgICAgICAgICAgICAgICAgICAgICBwMiA9IHAxICsgc3RyaXBzaXplOworKyAgICAgICAgICAgICAgICAgICAgICAgIHBhID0gKGFscGhhPyhwMitzdHJpcHNpemUpOk5VTEwpOworKyAgICAgICAgICAgICAgICAgICAgfQorKyAgICAgICAgICAgICAgICB9CisrICAgICAgICAgICAgICAgZWxzZSBpZiAoVElGRlJlYWRFbmNvZGVkU3RyaXAodGlmLCBUSUZGQ29tcHV0ZVN0cmlwKHRpZiwgb2Zmc2V0X3JvdywgMCksCisgICAgICAgICAgICAgICAgICAgIHAwLCAoKHJvdyArIGltZy0+cm93X29mZnNldCklcm93c3BlcnN0cmlwICsgbnJvdykgKiBzY2FubGluZSk9PSh0bXNpemVfdCkoLTEpCisgICAgICAgICAgICAgICAgICAgICYmIGltZy0+c3RvcG9uZXJyKQorICAgICAgICAgICAgICAgIHsKK2RpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9yZWFkLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9yZWFkLmMKK2luZGV4IGNjNGY1ZDJmNi4uYWQwYTc3OGMwIDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcmVhZC5jCisrKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9yZWFkLmMKK0BAIC00NDIsMTggKzQ0MiwxNyBAQCBUSUZGUmVhZFNjYW5saW5lKFRJRkYqIHRpZiwgdm9pZCogYnVmLCB1aW50MzIgcm93LCB1aW50MTYgc2FtcGxlKQorIH0KKyAKKyAvKgorLSAqIFJlYWQgYSBzdHJpcCBvZiBkYXRhIGFuZCBkZWNvbXByZXNzIHRoZSBzcGVjaWZpZWQKKy0gKiBhbW91bnQgaW50byB0aGUgdXNlci1zdXBwbGllZCBidWZmZXIuCisrICogQ2FsY3VsYXRlIHRoZSBzdHJpcCBzaXplIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIG9mCisrICogcm93cyBpbiB0aGUgc3RyaXAgKGNoZWNrIGZvciB0cnVuY2F0ZWQgbGFzdCBzdHJpcCBvbiBhbnkKKysgKiBvZiB0aGUgc2VwYXJhdGlvbnMpLgorICAqLworLXRtc2l6ZV90CistVElGRlJlYWRFbmNvZGVkU3RyaXAoVElGRiogdGlmLCB1aW50MzIgc3RyaXAsIHZvaWQqIGJ1ZiwgdG1zaXplX3Qgc2l6ZSkKKytzdGF0aWMgdG1zaXplX3QgVElGRlJlYWRFbmNvZGVkU3RyaXBHZXRTdHJpcFNpemUoVElGRiogdGlmLCB1aW50MzIgc3RyaXAsIHVpbnQxNiogcHBsYW5lKQorIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRlJlYWRFbmNvZGVkU3RyaXAiOworICAgICAgICBUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisgICAgICAgIHVpbnQzMiByb3dzcGVyc3RyaXA7CisgICAgICAgIHVpbnQzMiBzdHJpcHNwZXJwbGFuZTsKKyAgICAgICAgdWludDMyIHN0cmlwaW5wbGFuZTsKKy0gICAgICAgdWludDE2IHBsYW5lOworICAgICAgICB1aW50MzIgcm93czsKKyAgICAgICAgdG1zaXplX3Qgc3RyaXBzaXplOworICAgICAgICBpZiAoIVRJRkZDaGVja1JlYWQodGlmLDApKQorQEAgLTQ2NSwyMyArNDY0LDM3IEBAIFRJRkZSZWFkRW5jb2RlZFN0cmlwKFRJRkYqIHRpZiwgdWludDMyIHN0cmlwLCB2b2lkKiBidWYsIHRtc2l6ZV90IHNpemUpCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKXRkLT50ZF9uc3RyaXBzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4oKHRtc2l6ZV90KSgtMSkpOworICAgICAgICB9CistICAgICAgIC8qCistICAgICAgICAqIENhbGN1bGF0ZSB0aGUgc3RyaXAgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZgorLSAgICAgICAgKiByb3dzIGluIHRoZSBzdHJpcCAoY2hlY2sgZm9yIHRydW5jYXRlZCBsYXN0IHN0cmlwIG9uIGFueQorLSAgICAgICAgKiBvZiB0aGUgc2VwYXJhdGlvbnMpLgorLSAgICAgICAgKi8KKysKKyAgICAgICAgcm93c3BlcnN0cmlwPXRkLT50ZF9yb3dzcGVyc3RyaXA7CisgICAgICAgIGlmIChyb3dzcGVyc3RyaXA+dGQtPnRkX2ltYWdlbGVuZ3RoKQorICAgICAgICAgICAgICAgIHJvd3NwZXJzdHJpcD10ZC0+dGRfaW1hZ2VsZW5ndGg7CisgICAgICAgIHN0cmlwc3BlcnBsYW5lPSBUSUZGaG93bWFueV8zMl9tYXh1aW50X2NvbXBhdCh0ZC0+dGRfaW1hZ2VsZW5ndGgsIHJvd3NwZXJzdHJpcCk7CisgICAgICAgIHN0cmlwaW5wbGFuZT0oc3RyaXAlc3RyaXBzcGVycGxhbmUpOworLSAgICAgICBwbGFuZT0odWludDE2KShzdHJpcC9zdHJpcHNwZXJwbGFuZSk7CisrICAgICAgIGlmKCBwcGxhbmUgKSAqcHBsYW5lPSh1aW50MTYpKHN0cmlwL3N0cmlwc3BlcnBsYW5lKTsKKyAgICAgICAgcm93cz10ZC0+dGRfaW1hZ2VsZW5ndGgtc3RyaXBpbnBsYW5lKnJvd3NwZXJzdHJpcDsKKyAgICAgICAgaWYgKHJvd3M+cm93c3BlcnN0cmlwKQorICAgICAgICAgICAgICAgIHJvd3M9cm93c3BlcnN0cmlwOworICAgICAgICBzdHJpcHNpemU9VElGRlZTdHJpcFNpemUodGlmLHJvd3MpOworICAgICAgICBpZiAoc3RyaXBzaXplPT0wKQorICAgICAgICAgICAgICAgIHJldHVybigodG1zaXplX3QpKC0xKSk7CisrICAgIHJldHVybiBzdHJpcHNpemU7CisrfQorKworKy8qCisrICogUmVhZCBhIHN0cmlwIG9mIGRhdGEgYW5kIGRlY29tcHJlc3MgdGhlIHNwZWNpZmllZAorKyAqIGFtb3VudCBpbnRvIHRoZSB1c2VyLXN1cHBsaWVkIGJ1ZmZlci4KKysgKi8KKyt0bXNpemVfdAorK1RJRkZSZWFkRW5jb2RlZFN0cmlwKFRJRkYqIHRpZiwgdWludDMyIHN0cmlwLCB2b2lkKiBidWYsIHRtc2l6ZV90IHNpemUpCisreworKyAgc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRlJlYWRFbmNvZGVkU3RyaXAiOworKyAgVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOworKyAgdG1zaXplX3Qgc3RyaXBzaXplOworKyAgdWludDE2IHBsYW5lOworKworKyAgc3RyaXBzaXplPVRJRkZSZWFkRW5jb2RlZFN0cmlwR2V0U3RyaXBTaXplKHRpZiwgc3RyaXAsICZwbGFuZSk7CisrICBpZiAoc3RyaXBzaXplPT0oKHRtc2l6ZV90KSgtMSkpKQorKyAgICAgIHJldHVybigodG1zaXplX3QpKC0xKSk7CisgCisgICAgIC8qIHNob3J0Y3V0IHRvIGF2b2lkIGFuIGV4dHJhIG1lbWNweSgpICovCisgICAgIGlmKCB0ZC0+dGRfY29tcHJlc3Npb24gPT0gQ09NUFJFU1NJT05fTk9ORSAmJgorQEAgLTUxMCw2ICs1MjMsNTAgQEAgVElGRlJlYWRFbmNvZGVkU3RyaXAoVElGRiogdGlmLCB1aW50MzIgc3RyaXAsIHZvaWQqIGJ1ZiwgdG1zaXplX3Qgc2l6ZSkKKyAgICAgICAgcmV0dXJuKHN0cmlwc2l6ZSk7CisgfQorIAorKy8qIFZhcmlhbnQgb2YgVElGRlJlYWRFbmNvZGVkU3RyaXAoKSB0aGF0IGRvZXMgCisrICogKiBpZiAqYnVmID09IE5VTEwsICpidWYgPSBfVElGRm1hbGxvYyhidWZzaXpldG9hbGxvYykgb25seSBhZnRlciBUSUZGRmlsbFN0cmlwKCkgaGFzCisrICogICBzdWNlZWRlZC4gVGhpcyBhdm9pZCBleGNlc3NpdmUgbWVtb3J5IGFsbG9jYXRpb24gaW4gY2FzZSBvZiB0cnVuY2F0ZWQKKysgKiAgIGZpbGUuCisrICogKiBjYWxscyByZWd1bGFyIFRJRkZSZWFkRW5jb2RlZFN0cmlwKCkgaWYgKmJ1ZiAhPSBOVUxMCisrICovCisrdG1zaXplX3QKKytfVElGRlJlYWRFbmNvZGVkU3RyaXBBbmRBbGxvY0J1ZmZlcihUSUZGKiB0aWYsIHVpbnQzMiBzdHJpcCwKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYnVmLCB0bXNpemVfdCBidWZzaXpldG9hbGxvYywKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXNpemVfdCBzaXplX3RvX3JlYWQpCisreworKyAgICB0bXNpemVfdCB0aGlzX3N0cmlwc2l6ZTsKKysgICAgdWludDE2IHBsYW5lOworKworKyAgICBpZiggKmJ1ZiAhPSBOVUxMICkKKysgICAgeworKyAgICAgICAgcmV0dXJuIFRJRkZSZWFkRW5jb2RlZFN0cmlwKHRpZiwgc3RyaXAsICpidWYsIHNpemVfdG9fcmVhZCk7CisrICAgIH0KKysKKysgICAgdGhpc19zdHJpcHNpemU9VElGRlJlYWRFbmNvZGVkU3RyaXBHZXRTdHJpcFNpemUodGlmLCBzdHJpcCwgJnBsYW5lKTsKKysgICAgaWYgKHRoaXNfc3RyaXBzaXplPT0oKHRtc2l6ZV90KSgtMSkpKQorKyAgICAgICAgICAgIHJldHVybigodG1zaXplX3QpKC0xKSk7CisrCisrICAgIGlmICgoc2l6ZV90b19yZWFkIT0odG1zaXplX3QpKC0xKSkmJihzaXplX3RvX3JlYWQ8dGhpc19zdHJpcHNpemUpKQorKyAgICAgICAgICAgIHRoaXNfc3RyaXBzaXplPXNpemVfdG9fcmVhZDsKKysgICAgaWYgKCFUSUZGRmlsbFN0cmlwKHRpZixzdHJpcCkpCisrICAgICAgICAgICAgcmV0dXJuKCh0bXNpemVfdCkoLTEpKTsKKysKKysgICAgKmJ1ZiA9IF9USUZGbWFsbG9jKGJ1ZnNpemV0b2FsbG9jKTsKKysgICAgaWYgKCpidWYgPT0gTlVMTCkgeworKyAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUodGlmKSwgIk5vIHNwYWNlIGZvciBzdHJpcCBidWZmZXIiKTsKKysgICAgICAgICAgICByZXR1cm4oKHRtc2l6ZV90KSgtMSkpOworKyAgICB9CisrICAgIF9USUZGbWVtc2V0KCpidWYsIDAsIGJ1ZnNpemV0b2FsbG9jKTsKKysKKysgICAgaWYgKCgqdGlmLT50aWZfZGVjb2Rlc3RyaXApKHRpZiwqYnVmLHRoaXNfc3RyaXBzaXplLHBsYW5lKTw9MCkKKysgICAgICAgICAgICByZXR1cm4oKHRtc2l6ZV90KSgtMSkpOworKyAgICAoKnRpZi0+dGlmX3Bvc3RkZWNvZGUpKHRpZiwqYnVmLHRoaXNfc3RyaXBzaXplKTsKKysgICAgcmV0dXJuKHRoaXNfc3RyaXBzaXplKTsKKysKKysKKyt9CisrCisrCisgc3RhdGljIHRtc2l6ZV90CisgVElGRlJlYWRSYXdTdHJpcDEoVElGRiogdGlmLCB1aW50MzIgc3RyaXAsIHZvaWQqIGJ1ZiwgdG1zaXplX3Qgc2l6ZSwKKyAgICAgY29uc3QgY2hhciogbW9kdWxlKQorQEAgLTkzOSw2ICs5OTYsNzggQEAgVElGRlJlYWRFbmNvZGVkVGlsZShUSUZGKiB0aWYsIHVpbnQzMiB0aWxlLCB2b2lkKiBidWYsIHRtc2l6ZV90IHNpemUpCisgICAgICAgICAgICAgICAgcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisgfQorIAorKy8qIFZhcmlhbnQgb2YgVElGRlJlYWRUaWxlKCkgdGhhdCBkb2VzIAorKyAqICogaWYgKmJ1ZiA9PSBOVUxMLCAqYnVmID0gX1RJRkZtYWxsb2MoYnVmc2l6ZXRvYWxsb2MpIG9ubHkgYWZ0ZXIgVElGRkZpbGxUaWxlKCkgaGFzCisrICogICBzdWNlZWRlZC4gVGhpcyBhdm9pZCBleGNlc3NpdmUgbWVtb3J5IGFsbG9jYXRpb24gaW4gY2FzZSBvZiB0cnVuY2F0ZWQKKysgKiAgIGZpbGUuCisrICogKiBjYWxscyByZWd1bGFyIFRJRkZSZWFkRW5jb2RlZFRpbGUoKSBpZiAqYnVmICE9IE5VTEwKKysgKi8KKyt0bXNpemVfdAorK19USUZGUmVhZFRpbGVBbmRBbGxvY0J1ZmZlcihUSUZGKiB0aWYsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipidWYsIHRtc2l6ZV90IGJ1ZnNpemV0b2FsbG9jLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgeCwgdWludDMyIHksIHVpbnQzMiB6LCB1aW50MTYgcykKKyt7CisrICAgIGlmICghVElGRkNoZWNrUmVhZCh0aWYsIDEpIHx8ICFUSUZGQ2hlY2tUaWxlKHRpZiwgeCwgeSwgeiwgcykpCisrICAgICAgICAgICAgcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisrICAgIHJldHVybiAoX1RJRkZSZWFkRW5jb2RlZFRpbGVBbmRBbGxvY0J1ZmZlcih0aWYsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSUZGQ29tcHV0ZVRpbGUodGlmLCB4LCB5LCB6LCBzKSwKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgYnVmc2l6ZXRvYWxsb2MsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG1zaXplX3QpKC0xKSkpOworK30KKysKKysvKiBWYXJpYW50IG9mIFRJRkZSZWFkRW5jb2RlZFRpbGUoKSB0aGF0IGRvZXMgCisrICogKiBpZiAqYnVmID09IE5VTEwsICpidWYgPSBfVElGRm1hbGxvYyhidWZzaXpldG9hbGxvYykgb25seSBhZnRlciBUSUZGRmlsbFRpbGUoKSBoYXMKKysgKiAgIHN1Y2VlZGVkLiBUaGlzIGF2b2lkIGV4Y2Vzc2l2ZSBtZW1vcnkgYWxsb2NhdGlvbiBpbiBjYXNlIG9mIHRydW5jYXRlZAorKyAqICAgZmlsZS4KKysgKiAqIGNhbGxzIHJlZ3VsYXIgVElGRlJlYWRFbmNvZGVkVGlsZSgpIGlmICpidWYgIT0gTlVMTAorKyAqLworK3Rtc2l6ZV90CisrX1RJRkZSZWFkRW5jb2RlZFRpbGVBbmRBbGxvY0J1ZmZlcihUSUZGKiB0aWYsIHVpbnQzMiB0aWxlLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipidWYsIHRtc2l6ZV90IGJ1ZnNpemV0b2FsbG9jLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtc2l6ZV90IHNpemVfdG9fcmVhZCkKKyt7CisrICAgIHN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIl9USUZGUmVhZEVuY29kZWRUaWxlQW5kQWxsb2NCdWZmZXIiOworKyAgICBUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisrICAgIHRtc2l6ZV90IHRpbGVzaXplID0gdGlmLT50aWZfdGlsZXNpemU7CisrCisrICAgIGlmKCAqYnVmICE9IE5VTEwgKQorKyAgICB7CisrICAgICAgICByZXR1cm4gVElGRlJlYWRFbmNvZGVkVGlsZSh0aWYsIHRpbGUsICpidWYsIHNpemVfdG9fcmVhZCk7CisrICAgIH0KKysKKysgICAgaWYgKCFUSUZGQ2hlY2tSZWFkKHRpZiwgMSkpCisrICAgICAgICAgICAgcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisrICAgIGlmICh0aWxlID49IHRkLT50ZF9uc3RyaXBzKSB7CisrICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKysgICAgICAgICAgICAgICAgIiVsdTogVGlsZSBvdXQgb2YgcmFuZ2UsIG1heCAlbHUiLAorKyAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgdGlsZSwgKHVuc2lnbmVkIGxvbmcpIHRkLT50ZF9uc3RyaXBzKTsKKysgICAgICAgICAgICByZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKysgICAgfQorKworKyAgICBpZiAoIVRJRkZGaWxsVGlsZSh0aWYsdGlsZSkpCisrICAgICAgICAgICAgcmV0dXJuKCh0bXNpemVfdCkoLTEpKTsKKysKKysgICAgKmJ1ZiA9IF9USUZGbWFsbG9jKGJ1ZnNpemV0b2FsbG9jKTsKKysgICAgaWYgKCpidWYgPT0gTlVMTCkgeworKyAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUodGlmKSwKKysgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIHNwYWNlIGZvciB0aWxlIGJ1ZmZlciIpOworKyAgICAgICAgICAgIHJldHVybigodG1zaXplX3QpKC0xKSk7CisrICAgIH0KKysgICAgX1RJRkZtZW1zZXQoKmJ1ZiwgMCwgYnVmc2l6ZXRvYWxsb2MpOworKworKyAgICBpZiAoc2l6ZV90b19yZWFkID09ICh0bXNpemVfdCkoLTEpKQorKyAgICAgICAgc2l6ZV90b19yZWFkID0gdGlsZXNpemU7CisrICAgIGVsc2UgaWYgKHNpemVfdG9fcmVhZCA+IHRpbGVzaXplKQorKyAgICAgICAgc2l6ZV90b19yZWFkID0gdGlsZXNpemU7CisrICAgIGlmKCAoKnRpZi0+dGlmX2RlY29kZXRpbGUpKHRpZiwKKysgICAgICAgICh1aW50OCopICpidWYsIHNpemVfdG9fcmVhZCwgKHVpbnQxNikodGlsZS90ZC0+dGRfc3RyaXBzcGVyaW1hZ2UpKSkgeworKyAgICAgICAgKCp0aWYtPnRpZl9wb3N0ZGVjb2RlKSh0aWYsICh1aW50OCopICpidWYsIHNpemVfdG9fcmVhZCk7CisrICAgICAgICByZXR1cm4gKHNpemVfdG9fcmVhZCk7CisrICAgIH0gZWxzZQorKyAgICAgICAgcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisrfQorKworKworIHN0YXRpYyB0bXNpemVfdAorIFRJRkZSZWFkUmF3VGlsZTEoVElGRiogdGlmLCB1aW50MzIgdGlsZSwgdm9pZCogYnVmLCB0bXNpemVfdCBzaXplLCBjb25zdCBjaGFyKiBtb2R1bGUpCisgeworZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmZmlvcC5oIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZmaW9wLmgKK2luZGV4IDdlNDE1Yzc1MC4uNmZiNDdkZTViIDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZmaW9wLmgKKysrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmZmlvcC5oCitAQCAtMzY0LDYgKzM2NCwyMCBAQCBleHRlcm4gdm9pZCogX1RJRkZDaGVja1JlYWxsb2MoVElGRiosIHZvaWQqLCB0bXNpemVfdCwgdG1zaXplX3QsIGNvbnN0IGNoYXIqKTsKKyBleHRlcm4gZG91YmxlIF9USUZGVUludDY0VG9Eb3VibGUodWludDY0KTsKKyBleHRlcm4gZmxvYXQgX1RJRkZVSW50NjRUb0Zsb2F0KHVpbnQ2NCk7CisgCisrZXh0ZXJuIHRtc2l6ZV90CisrX1RJRkZSZWFkRW5jb2RlZFN0cmlwQW5kQWxsb2NCdWZmZXIoVElGRiogdGlmLCB1aW50MzIgc3RyaXAsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmJ1ZiwgdG1zaXplX3QgYnVmc2l6ZXRvYWxsb2MsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1zaXplX3Qgc2l6ZV90b19yZWFkKTsKKytleHRlcm4gdG1zaXplX3QKKytfVElGRlJlYWRFbmNvZGVkVGlsZUFuZEFsbG9jQnVmZmVyKFRJRkYqIHRpZiwgdWludDMyIHRpbGUsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmJ1ZiwgdG1zaXplX3QgYnVmc2l6ZXRvYWxsb2MsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1zaXplX3Qgc2l6ZV90b19yZWFkKTsKKytleHRlcm4gdG1zaXplX3QKKytfVElGRlJlYWRUaWxlQW5kQWxsb2NCdWZmZXIoVElGRiogdGlmLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYnVmLCB0bXNpemVfdCBidWZzaXpldG9hbGxvYywKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHgsIHVpbnQzMiB5LCB1aW50MzIgeiwgdWludDE2IHMpOworKworKworIGV4dGVybiBpbnQgVElGRkluaXREdW1wTW9kZShUSUZGKiwgaW50KTsKKyAjaWZkZWYgUEFDS0JJVFNfU1VQUE9SVAorIGV4dGVybiBpbnQgVElGRkluaXRQYWNrQml0cyhUSUZGKiwgaW50KTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAyNi11cHN0cmVhbS1udWxsLWRlcmVmZXJlbmNlLnBhdGNoIGIvdGhpcmRfcGFydHkvbGlidGlmZi8wMDI2LXVwc3RyZWFtLW51bGwtZGVyZWZlcmVuY2UucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyNjQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAyNi11cHN0cmVhbS1udWxsLWRlcmVmZXJlbmNlLnBhdGNoCkBAIC0wLDAgKzEsMjIgQEAKK2RpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9nZXRpbWFnZS5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZ2V0aW1hZ2UuYworaW5kZXggMDNjOWE4MWZiLi5kMzdmNzI5YzQgMTAwNjQ0CistLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9nZXRpbWFnZS5jCisrKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9nZXRpbWFnZS5jCitAQCAtNjgxLDcgKzY4MSw3IEBAIGd0VGlsZUNvbnRpZyhUSUZGUkdCQUltYWdlKiBpbWcsIHVpbnQzMiogcmFzdGVyLCB1aW50MzIgdywgdWludDMyIGgpCisgICAgICAgIHJldHVybiAoMCk7CisgICAgIH0KKyAgICAgbGVmdG1vc3RfdG9za2V3ID0gc2FmZXNrZXc7CistICAgIGZvciAocm93ID0gMDsgcm93IDwgaDsgcm93ICs9IG5yb3cpCisrICAgIGZvciAocm93ID0gMDsgcmV0ICE9IDAgJiYgcm93IDwgaDsgcm93ICs9IG5yb3cpCisgICAgIHsKKyAgICAgICAgIHJvd3N0b3JlYWQgPSB0aCAtIChyb3cgKyBpbWctPnJvd19vZmZzZXQpICUgdGg7CisgICAgICAgIG5yb3cgPSAocm93ICsgcm93c3RvcmVhZCA+IGggPyBoIC0gcm93IDogcm93c3RvcmVhZCk7CitAQCAtODMwLDcgKzgzMCw3IEBAIGd0VGlsZVNlcGFyYXRlKFRJRkZSR0JBSW1hZ2UqIGltZywgdWludDMyKiByYXN0ZXIsIHVpbnQzMiB3LCB1aW50MzIgaCkKKyAgICAgICAgbGVmdG1vc3RfZnJvbXNrZXcgPSBpbWctPmNvbF9vZmZzZXQgJSB0dzsKKyAgICAgICAgbGVmdG1vc3RfdHcgPSB0dyAtIGxlZnRtb3N0X2Zyb21za2V3OworICAgICAgICBsZWZ0bW9zdF90b3NrZXcgPSB0b3NrZXcgKyBsZWZ0bW9zdF9mcm9tc2tldzsKKy0gICAgICAgZm9yIChyb3cgPSAwOyByb3cgPCBoOyByb3cgKz0gbnJvdykKKysgICAgICAgZm9yIChyb3cgPSAwOyByZXQgIT0gMCAmJiByb3cgPCBoOyByb3cgKz0gbnJvdykKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHJvd3N0b3JlYWQgPSB0aCAtIChyb3cgKyBpbWctPnJvd19vZmZzZXQpICUgdGg7CisgICAgICAgICAgICAgICAgbnJvdyA9IChyb3cgKyByb3dzdG9yZWFkID4gaCA/IGggLSByb3cgOiByb3dzdG9yZWFkKTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAyNy1idWlsZC1jb25maWcucGF0Y2ggYi90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMjctYnVpbGQtY29uZmlnLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMWEyMDUKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmLzAwMjctYnVpbGQtY29uZmlnLnBhdGNoCkBAIC0wLDAgKzEsNDAgQEAKK2RpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmZjb25mLmggYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmZjb25mLmgKK2luZGV4IDJhODhjYjc1Zi4uNGQyZDdjOWQ5IDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZmY29uZi5oCisrKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmZjb25mLmgKK0BAIC0zNSwxNyArMzUsMjYgQEAKKyAjZGVmaW5lIEhBVkVfU0VBUkNIX0ggMQorICNlbmRpZgorIAorLXN0YXRpYyBjb25zdCBzaXplX3Qgc2l6ZU9mSW50ID0gc2l6ZW9mKGludCk7CistLyogVGhlIHNpemUgb2YgYSBgaW50JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLSNkZWZpbmUgU0laRU9GX0lOVCBzaXplT2ZJbnQKKy0KKy1zdGF0aWMgY29uc3Qgc2l6ZV90IHNpemVPZlVMb25nID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworKy8qIFRoZSBzaXplIG9mIGEgYGludCcuICovCisrLyogQWNjb3JkaW5nIHR5cGVkZWYgaW50ICBpbnQzMl90OyBpbiB0aGUgZnhfc3lzdGVtLmgqLworKyNkZWZpbmUgU0laRU9GX0lOVCA0CisrCisrLyogU3VubGlhbmcuTGl1IDIwMTEwMzI1LiBXZSBzaG91bGQgY29uZmlnIHRoZSBjb3JyZWN0IGxvbmcgc2l6ZSBmb3IgdGlmIAorKyAgIGZheDRkZWNvZGUgb3B0aW1pemUgaW4gdGlmX2ZheDMuYyAgLS0gTGludXg2NCBkZWNvZGUgaXNzdWUuIAorKyAgIFRFU1RET0M6IEJ1ZyAjMjM2NjEgLSB6MS50aWYuICovCisrI2lmIF9GWF9DUFVfID09IF9GWF9YNjRfIHx8IF9GWF9DUFVfID09IF9GWF9JQTY0XworIC8qIFRoZSBzaXplIG9mIGB1bnNpZ25lZCBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLSNkZWZpbmUgU0laRU9GX1VOU0lHTkVEX0xPTkcgc2l6ZU9mVUxvbmcKKysjZGVmaW5lIFNJWkVPRl9VTlNJR05FRF9MT05HIDgKKysjZWxzZQorKyNkZWZpbmUgU0laRU9GX1VOU0lHTkVEX0xPTkcgNAorKyNlbmRpZgorIAorLXN0YXRpYyBjb25zdCBzaXplX3Qgc2l6ZU9mVm9pZFAgPSBzaXplb2Yodm9pZCopOworLS8qIFRoZSBzaXplIG9mIHZvaWQqIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy0jZGVmaW5lIFNJWkVPRl9WT0lEUCBzaXplT2ZWb2lkUAorKy8qIFRoZSBzaXplIG9mIHZvaWQqLiAqLworKyNpZmRlZiBfX0xQNjRfXworKyNkZWZpbmUgU0laRU9GX1ZPSURQIDgKKysjZWxzZQorKyNkZWZpbmUgU0laRU9GX1ZPSURQIDQKKysjZW5kaWYKKyAKKyAvKiBTaWduZWQgOC1iaXQgdHlwZSAqLworICNkZWZpbmUgVElGRl9JTlQ4X1Qgc2lnbmVkIGNoYXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAyOC1uc3RyaXBzLU9PTS5wYXRjaCBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvMDAyOC1uc3RyaXBzLU9PTS5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmRiNjZlCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi8wMDI4LW5zdHJpcHMtT09NLnBhdGNoCkBAIC0wLDAgKzEsMjYgQEAKK2RpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kaXJyZWFkLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kaXJyZWFkLmMKK2luZGV4IDc3MmViYWY3ZC4uYWI5MzhlYWM5IDEwMDY0NAorLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZGlycmVhZC5jCisrKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kaXJyZWFkLmMKK0BAIC00MSw2ICs0MSw3IEBACisgCisgI2luY2x1ZGUgInRpZmZpb3AuaCIKKyAjaW5jbHVkZSA8ZmxvYXQuaD4KKysjaW5jbHVkZSA8bGltaXRzLmg+CisgCisgI2RlZmluZSBJR05PUkUgMCAgICAgICAgICAvKiB0YWcgcGxhY2Vob2xkZXIgdXNlZCBiZWxvdyAqLworICNkZWZpbmUgRkFJTEVEX0ZJSSAgICAoKHVpbnQzMikgLTEpCitAQCAtMzYzOCw2ICszNjM5LDEzIEBAIFRJRkZSZWFkRGlyZWN0b3J5KFRJRkYqIHRpZikKKyAJCSAgICBpc1RpbGVkKHRpZikgPyAidGlsZXMiIDogInN0cmlwcyIpOworIAkJZ290byBiYWQ7CisgCX0KKysJaWYgKHRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzID4gSU5UX01BWCkgeworKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKysJCSAgICAiQ2Fubm90IGhhbmRsZSAldSBudW1iZXIgb2YgJXMiLAorKwkJICAgIHRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzLAorKwkJICAgIGlzVGlsZWQodGlmKSA/ICJ0aWxlcyIgOiAic3RyaXBzIik7CisrCQlnb3RvIGJhZDsKKysJfQorIAl0aWYtPnRpZl9kaXIudGRfc3RyaXBzcGVyaW1hZ2UgPSB0aWYtPnRpZl9kaXIudGRfbnN0cmlwczsKKyAJaWYgKHRpZi0+dGlmX2Rpci50ZF9wbGFuYXJjb25maWcgPT0gUExBTkFSQ09ORklHX1NFUEFSQVRFKQorIAkJdGlmLT50aWZfZGlyLnRkX3N0cmlwc3BlcmltYWdlIC89IHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWw7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL1JFQURNRS5wZGZpdW0gYi90aGlyZF9wYXJ0eS9saWJ0aWZmL1JFQURNRS5wZGZpdW0KaW5kZXggZTQ0MzZkMi4uYTM3MGE0OSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi9SRUFETUUucGRmaXVtCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvUkVBRE1FLnBkZml1bQpAQCAtMSw2ICsxLDYgQEAKIE5hbWU6IExpYlRJRkYKLVVSTDogaHR0cDovL3d3dy5yZW1vdGVzZW5zaW5nLm9yZy9saWJ0aWZmLwotVmVyc2lvbjogNC4wLjYKK1VSTDogaHR0cDovL3d3dy5zaW1wbGVzeXN0ZW1zLm9yZy9saWJ0aWZmLworVmVyc2lvbjogNC4wLjgKIFNlY3VyaXR5IENyaXRpY2FsOiB5ZXMKIExpY2Vuc2U6IEJTRAogCkBAIC0xMSwyMyArMTEsMTAgQEAKIAogMDAwMC1idWlsZC1jb25maWcucGF0Y2g6IExvY2FsIGJ1aWxkIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4KIDAwMDEtYnVpbGQtY29uZmlnLnBhdGNoOiBFbmFibGUgSEFWRV9TRUFSQ0hfSCBpbiB0aWZmY29uZi5oIGZvciBWUyAyMDE1Ci0wMDAyLUNWRS0yMDE1LTg2NjUtODY4My5wYXRjaDogU2VjdXJpdHkgZml4ZXMKLTAwMDMtQ1ZFLTIwMTUtODc4MS04NzgyLTg3ODMucGF0Y2g6IFNlY3VyaXR5IGZpeGVzCi0wMDA0LUNWRS0yMDE1LTg3ODQucGF0Y2g6IFNlY3VyaXR5IGZpeGVzCi0wMDA1LUxlYWstVElGRkZldGNoU3RyaXBUaGluZy5wYXRjaDogRml4IGEgbWVtb3J5IGxlYWsKIDAwMDYtSGVhcEJ1ZmZlck92ZXJmbG93LUNob3BVcFNpbmdsZVVuY29tcHJlc3NlZFN0cmlwLnBhdGNoOiBGaXggYSBoZWFwIGJ1ZmZlciBvdmVyZmxvdwotMDAwNy11bmluaXRpYWxpemVkLXZhbHVlLnBhdGNoOiBGaXggcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCBkaXJjb3VudCB2YWx1ZQogMDAwOC1IZWFwQnVmZmVyT3ZlcmZsb3ctQ2hvcFVwU2luZ2xlVW5jb21wcmVzc2VkU3RyaXAucGF0Y2g6IEZpeCBhIGhlYXAgYnVmZmVyIG92ZXJmbG93Ci0wMDA5LUhlYXBCdWZmZXJPdmVyZmxvdy1QaXhhckxvZ0RlY29kZS5wYXRjaDogRml4IGEgaGVhcCBidWZmZXIgb3ZlcmZsb3cKLTAwMTAtZml4LWxlYWstaW1hZ2ViZWdpbjogRml4IGEgbGVhayB3aGVuIFRJRkZSR0JBSW1hZ2VCZWdpbiBmYWlscwotMDAxMS1maXgtbGVhay1pbWFnZWJlZ2luMjogQXBwbHkgdXBzdHJlYW0gZml4IHJlbGF0ZWQgdG8gb3VyIHByZXZpb3VzIHBhdGNoCi0wMDEyLWluaXRpYWxpemUtdGlmLXJhd2RhdGEucGF0Y2g6IEluaXRpYWxpemUgdGlmX3Jhd2RhdGEgdG8gZ3VhcmQgYWdhaW5zdCB1bml0aWFsaXplZCBhY2Nlc3MKLTAwMTMtdmFsaWRhdGUtcmVmYmxhY2t3aGl0ZS5wYXRjaDogTWFrZSBzdXJlIHRoZSByZWZibGFja3doaXRlIHZhbHVlcyBhcmVuJ3QgbmFuLgotMDAxNC1jYXN0LXRvLXVuc2lnbmVkLWluLXB1dGFncmV5dGlsZS5wYXRjaDogY2FzdGluZyB0byBhdm9pZCB1bmRlZmluZWQgc2hpZnRzLgotMDAxNS1maXgtbGVha3MtaW4tdGlmX29qcGVnLnBhdGNoOiBmaXggZGlyZWN0IGxlYWtzIGluIHRpZl9vanBlZy5jIG1ldGhvZHMKLTAwMTYtZml4LWxlYWstaW4tcGl4YXJsb2dzZXR1cGRlY29kZS5wYXRjaDogRnJlZSBzcC0+dGJ1ZiBpZiBzZXR1cCBmYWlscwogMDAxNy1zYWZlX3NrZXdzX2luX2d0VGlsZUNvbnRpZy5wYXRjaDogcmV0dXJuIGVycm9yIGlmIHRvL2Zyb20gc2tld3Mgb3ZlcmZsb3cgZnJvbSBpbnQzMi4KLTAwMTgtZml4LWxlYWstaW4tUHJlZGljdG9yU2V0dXBEZWNvZGUucGF0Y2g6IGNhbGwgdGlmLT50aWZfY2xlYW51cCBpZiB0aGUgc2V0dXAgZmFpbHMuCi0wMDE5LWZpeC1pbnZhbGlkLXJlYWRzLVRJRkZGZXRjaE5vcm1hbFRhZy5wYXRjaDogdXBzdHJlYW0gc2VjdXJpdHkgZml4IGluIHRpZl9kaXJyZWFkLgotMDAyMC11bnJlYXNvbmFibGUtdGQtYml0c3BlcnNhbXBsZS5wYXRjaDogdXBzdHJlYW0gcGF0Y2ggaWdub3JpbmcgbGFyZ2UgdGRfYml0c3BlcnNhbXBsZS4KLTAwMjEtZml4LWxlYWtzLW9qcGVncmVhZGVyaW5mb3NlY3RhYmxlcy5wYXRjaDogbW9yZSBkaXJlY3QgbGVhayBmaXhlcyBpbiB0aWZfb2pwZWcuYy4KKzAwMjUtdXBzdHJlYW0tT09NLWd0VGlsZUNvbnRpZzogYWxsb2NhdGVzIHRoZSBkZWNvZGVkIGJ1ZmZlciBvbmx5IGFmdGVyIGEgZmlyc3Qgc3VjY2Vzc2Z1bCBUSUZGRmlsbFN0cmlwLgorMDAyNi11cHN0cmVhbS1udWxsLWRlcmVmZXJlbmNlOiBwcm9wZXJseSBldml0IHdoZW4gc3RvcG9uZXJyIGlzIHNldCBhbmQgYXZvaWQgbnVsbCBkZXJlZmVyZW5jZXMuCiswMDI3LWJ1aWxkLWNvbmZpZy5wYXRjaDogI2RlZmluZSB2YXJpYWJsZXMgc28gdGhlaXIgdmFsdWUgY2FuIGJlIHVzZWQgYnkgI2lmLgorMDAyOC1uc3RyaXBzLU9PTS5wYXRjaDogcmV0dXJuIGVycm9yIGZvciBleGNlc3MgbnVtYmVyIG9mIHRpbGVzL3N0cmlwcy4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2F1eC5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfYXV4LmMKaW5kZXggYmM0ZWEwMS4uNzQ1MzJjOCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfYXV4LmMKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfYXV4LmMKQEAgLTEsNCArMSw0IEBACi0vKiAkSWQ6IHRpZl9hdXguYyx2IDEuMjYgMjAxMC0wNy0wMSAxNTozMzoyOCBkcm9uIEV4cCAkICovCisvKiAkSWQ6IHRpZl9hdXguYyx2IDEuMjkgMjAxNi0xMS0xMSAyMDo0NTo1MyBlcm91YXVsdCBFeHAgJCAqLwogCiAvKgogICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2FtIExlZmZsZXIKQEAgLTEwMCw3ICsxMDAsOCBAQAogCiAJbiA9ICgodG1zaXplX3QpMSk8PHRkLT50ZF9iaXRzcGVyc2FtcGxlOwogCW5ieXRlcyA9IG4gKiBzaXplb2YgKHVpbnQxNik7Ci0JaWYgKCEodGZbMF0gPSAodWludDE2ICopX1RJRkZtYWxsb2MobmJ5dGVzKSkpCisgICAgICAgIHRmWzBdID0gKHVpbnQxNiAqKV9USUZGbWFsbG9jKG5ieXRlcyk7CisJaWYgKHRmWzBdID09IE5VTEwpCiAJCXJldHVybiAwOwogCXRmWzBdWzBdID0gMDsKIAlmb3IgKGkgPSAxOyBpIDwgbjsgaSsrKSB7CkBAIC0xMDksMTAgKzExMCwxMiBAQAogCX0KIAogCWlmICh0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsIC0gdGQtPnRkX2V4dHJhc2FtcGxlcyA+IDEpIHsKLQkJaWYgKCEodGZbMV0gPSAodWludDE2ICopX1RJRkZtYWxsb2MobmJ5dGVzKSkpCisgICAgICAgICAgICAgICAgdGZbMV0gPSAodWludDE2ICopX1RJRkZtYWxsb2MobmJ5dGVzKTsKKwkJaWYodGZbMV0gPT0gTlVMTCkKIAkJCWdvdG8gYmFkOwogCQlfVElGRm1lbWNweSh0ZlsxXSwgdGZbMF0sIG5ieXRlcyk7Ci0JCWlmICghKHRmWzJdID0gKHVpbnQxNiAqKV9USUZGbWFsbG9jKG5ieXRlcykpKQorICAgICAgICAgICAgICAgIHRmWzJdID0gKHVpbnQxNiAqKV9USUZGbWFsbG9jKG5ieXRlcyk7CisJCWlmICh0ZlsyXSA9PSBOVUxMKQogCQkJZ290byBiYWQ7CiAJCV9USUZGbWVtY3B5KHRmWzJdLCB0ZlswXSwgbmJ5dGVzKTsKIAl9CkBAIC0xMzQsNyArMTM3LDggQEAKIHsKIAlpbnQgaTsKIAotCWlmICghKHRkLT50ZF9yZWZibGFja3doaXRlID0gKGZsb2F0ICopX1RJRkZtYWxsb2MoNipzaXplb2YgKGZsb2F0KSkpKQorICAgICAgICB0ZC0+dGRfcmVmYmxhY2t3aGl0ZSA9IChmbG9hdCAqKV9USUZGbWFsbG9jKDYqc2l6ZW9mIChmbG9hdCkpOworCWlmICh0ZC0+dGRfcmVmYmxhY2t3aGl0ZSA9PSBOVUxMKQogCQlyZXR1cm4gMDsKICAgICAgICAgaWYgKHRkLT50ZF9waG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19ZQ0JDUikgewogCQkvKgpAQCAtMTYzLDcgKzE2Nyw3IEBACiAgKiB2YWx1ZSBpZiB0aGUgdGFnIGlzIG5vdCBwcmVzZW50IGluIHRoZSBkaXJlY3RvcnkuCiAgKgogICogTkI6CVdlIHVzZSB0aGUgdmFsdWUgaW4gdGhlIGRpcmVjdG9yeSwgcmF0aGVyIHRoYW4KLSAqCWV4cGxjaXQgdmFsdWVzIHNvIHRoYXQgZGVmYXVsdHMgZXhpc3Qgb25seSBvbmUKKyAqCWV4cGxpY2l0IHZhbHVlcyBzbyB0aGF0IGRlZmF1bHRzIGV4aXN0IG9ubHkgb25lCiAgKglwbGFjZSBpbiB0aGUgbGlicmFyeSAtLSBpbiBUSUZGRGVmYXVsdERpcmVjdG9yeS4KICAqLwogaW50CkBAIC0yMDgsMTEgKzIxMiwxOCBAQAogCQkqdmFfYXJnKGFwLCB1aW50MTYgKikgPSB0ZC0+dGRfcmVzb2x1dGlvbnVuaXQ7CiAJCXJldHVybiAoMSk7CiAJY2FzZSBUSUZGVEFHX1BSRURJQ1RPUjoKLSAgICAgICAgICAgICAgICB7Ci0JCQlUSUZGUHJlZGljdG9yU3RhdGUqIHNwID0gKFRJRkZQcmVkaWN0b3JTdGF0ZSopIHRpZi0+dGlmX2RhdGE7Ci0JCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9ICh1aW50MTYpIHNwLT5wcmVkaWN0b3I7Ci0JCQlyZXR1cm4gMTsKLSAgICAgICAgICAgICAgICB9CisgICAgeworICAgICAgICBUSUZGUHJlZGljdG9yU3RhdGUqIHNwID0gKFRJRkZQcmVkaWN0b3JTdGF0ZSopIHRpZi0+dGlmX2RhdGE7CisgICAgICAgIGlmKCBzcCA9PSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIHRpZi0+dGlmX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBnZXQgXCJQcmVkaWN0b3JcIiB0YWcgYXMgcGx1Z2luIGlzIG5vdCBjb25maWd1cmVkIik7CisgICAgICAgICAgICAqdmFfYXJnKGFwLCB1aW50MTYqKSA9IDA7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICAqdmFfYXJnKGFwLCB1aW50MTYqKSA9ICh1aW50MTYpIHNwLT5wcmVkaWN0b3I7CisgICAgICAgIHJldHVybiAxOworICAgIH0KIAljYXNlIFRJRkZUQUdfRE9UUkFOR0U6CiAJCSp2YV9hcmcoYXAsIHVpbnQxNiAqKSA9IDA7CiAJCSp2YV9hcmcoYXAsIHVpbnQxNiAqKSA9ICgxPDx0ZC0+dGRfYml0c3BlcnNhbXBsZSktMTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2Nsb3NlLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9jbG9zZS5jCmluZGV4IDEzZDJiYWIuLmEwY2I2NjEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2Nsb3NlLmMKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfY2xvc2UuYwpAQCAtMSw0ICsxLDQgQEAKLS8qICRJZDogdGlmX2Nsb3NlLmMsdiAxLjE5IDIwMTAtMDMtMTAgMTg6NTY6NDggYmZyaWVzZW4gRXhwICQgKi8KKy8qICRJZDogdGlmX2Nsb3NlLmMsdiAxLjIxIDIwMTYtMDEtMjMgMjE6MjA6MzQgZXJvdWF1bHQgRXhwICQgKi8KIAogLyoKICAqIENvcHlyaWdodCAoYykgMTk4OC0xOTk3IFNhbSBMZWZmbGVyCkBAIC0zNiw3ICszNiw3IEBACiAKIC8qKgogICogQXV4aWxpYXJ5IGZ1bmN0aW9uIHRvIGZyZWUgdGhlIFRJRkYgc3RydWN0dXJlLiBHaXZlbiBzdHJ1Y3R1cmUgd2lsbCBiZQotICogY29tcGxldGV0bHkgZnJlZWQsIHNvIHlvdSBzaG91bGQgc2F2ZSBvcGVuZWQgZmlsZSBoYW5kbGUgYW5kIHBvaW50ZXIKKyAqIGNvbXBsZXRlbHkgZnJlZWQsIHNvIHlvdSBzaG91bGQgc2F2ZSBvcGVuZWQgZmlsZSBoYW5kbGUgYW5kIHBvaW50ZXIKICAqIHRvIHRoZSBjbG9zZSBwcm9jZWR1cmUgaW4gZXh0ZXJuYWwgdmFyaWFibGVzIGJlZm9yZSBjYWxsaW5nCiAgKiBfVElGRkNsZWFudXAoKSwgaWYgeW91IHdpbGwgbmVlZCB0aGVzZSBvbmVzIHRvIGNsb3NlIHRoZSBmaWxlLgogICogCkBAIC02MiwxMSArNjIsMTEgQEAKICAgICAgICAgICovCiAJd2hpbGUoIHRpZi0+dGlmX2NsaWVudGluZm8gKQogCXsKLQkJVElGRkNsaWVudEluZm9MaW5rICpsaW5rID0gdGlmLT50aWZfY2xpZW50aW5mbzsKKwkJVElGRkNsaWVudEluZm9MaW5rICpwc0xpbmsgPSB0aWYtPnRpZl9jbGllbnRpbmZvOwogCi0JCXRpZi0+dGlmX2NsaWVudGluZm8gPSBsaW5rLT5uZXh0OwotCQlfVElGRmZyZWUoIGxpbmstPm5hbWUgKTsKLQkJX1RJRkZmcmVlKCBsaW5rICk7CisJCXRpZi0+dGlmX2NsaWVudGluZm8gPSBwc0xpbmstPm5leHQ7CisJCV9USUZGZnJlZSggcHNMaW5rLT5uYW1lICk7CisJCV9USUZGZnJlZSggcHNMaW5rICk7CiAJfQogCiAJaWYgKHRpZi0+dGlmX3Jhd2RhdGEgJiYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfTVlCVUZGRVIpKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfY29sb3IuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2NvbG9yLmMKaW5kZXggYmU0ODUwYy4uOGI4NDE4YyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfY29sb3IuYworKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9jb2xvci5jCkBAIC0xLDQgKzEsNCBAQAotLyogJElkOiB0aWZfY29sb3IuYyx2IDEuMTkgMjAxMC0xMi0xNCAwMjoyMjo0MiBmYXhndXkgRXhwICQgKi8KKy8qICRJZDogdGlmX2NvbG9yLmMsdiAxLjIzIDIwMTctMDUtMTMgMTg6MTc6MzQgZXJvdWF1bHQgRXhwICQgKi8KIAogLyoKICAqIENvcHlyaWdodCAoYykgMTk4OC0xOTk3IFNhbSBMZWZmbGVyCkBAIC0xMjYsMzcgKzEyNiwzNyBAQAogCQkgICAgY29uc3QgVElGRkRpc3BsYXkgKmRpc3BsYXksIGZsb2F0ICpyZWZXaGl0ZSkKIHsKIAlpbnQgaTsKLQlkb3VibGUgZ2FtbWE7CisJZG91YmxlIGRmR2FtbWE7CiAKIAljaWVsYWItPnJhbmdlID0gQ0lFTEFCVE9SR0JfVEFCTEVfUkFOR0U7CiAKIAlfVElGRm1lbWNweSgmY2llbGFiLT5kaXNwbGF5LCBkaXNwbGF5LCBzaXplb2YoVElGRkRpc3BsYXkpKTsKIAogCS8qIFJlZCAqLwotCWdhbW1hID0gMS4wIC8gY2llbGFiLT5kaXNwbGF5LmRfZ2FtbWFSIDsKKwlkZkdhbW1hID0gMS4wIC8gY2llbGFiLT5kaXNwbGF5LmRfZ2FtbWFSIDsKIAljaWVsYWItPnJzdGVwID0KIAkJKGNpZWxhYi0+ZGlzcGxheS5kX1lDUiAtIGNpZWxhYi0+ZGlzcGxheS5kX1kwUikJLyBjaWVsYWItPnJhbmdlOwogCWZvcihpID0gMDsgaSA8PSBjaWVsYWItPnJhbmdlOyBpKyspIHsKIAkJY2llbGFiLT5ZcjJyW2ldID0gY2llbGFiLT5kaXNwbGF5LmRfVnJ3cgotCQkgICAgKiAoKGZsb2F0KXBvdygoZG91YmxlKWkgLyBjaWVsYWItPnJhbmdlLCBnYW1tYSkpOworCQkgICAgKiAoKGZsb2F0KXBvdygoZG91YmxlKWkgLyBjaWVsYWItPnJhbmdlLCBkZkdhbW1hKSk7CiAJfQogCiAJLyogR3JlZW4gKi8KLQlnYW1tYSA9IDEuMCAvIGNpZWxhYi0+ZGlzcGxheS5kX2dhbW1hRyA7CisJZGZHYW1tYSA9IDEuMCAvIGNpZWxhYi0+ZGlzcGxheS5kX2dhbW1hRyA7CiAJY2llbGFiLT5nc3RlcCA9CiAJICAgIChjaWVsYWItPmRpc3BsYXkuZF9ZQ1IgLSBjaWVsYWItPmRpc3BsYXkuZF9ZMFIpIC8gY2llbGFiLT5yYW5nZTsKIAlmb3IoaSA9IDA7IGkgPD0gY2llbGFiLT5yYW5nZTsgaSsrKSB7CiAJCWNpZWxhYi0+WWcyZ1tpXSA9IGNpZWxhYi0+ZGlzcGxheS5kX1Zyd2cKLQkJICAgICogKChmbG9hdClwb3coKGRvdWJsZSlpIC8gY2llbGFiLT5yYW5nZSwgZ2FtbWEpKTsKKwkJICAgICogKChmbG9hdClwb3coKGRvdWJsZSlpIC8gY2llbGFiLT5yYW5nZSwgZGZHYW1tYSkpOwogCX0KIAogCS8qIEJsdWUgKi8KLQlnYW1tYSA9IDEuMCAvIGNpZWxhYi0+ZGlzcGxheS5kX2dhbW1hQiA7CisJZGZHYW1tYSA9IDEuMCAvIGNpZWxhYi0+ZGlzcGxheS5kX2dhbW1hQiA7CiAJY2llbGFiLT5ic3RlcCA9CiAJICAgIChjaWVsYWItPmRpc3BsYXkuZF9ZQ1IgLSBjaWVsYWItPmRpc3BsYXkuZF9ZMFIpIC8gY2llbGFiLT5yYW5nZTsKIAlmb3IoaSA9IDA7IGkgPD0gY2llbGFiLT5yYW5nZTsgaSsrKSB7CiAJCWNpZWxhYi0+WWIyYltpXSA9IGNpZWxhYi0+ZGlzcGxheS5kX1Zyd2IKLQkJICAgICogKChmbG9hdClwb3coKGRvdWJsZSlpIC8gY2llbGFiLT5yYW5nZSwgZ2FtbWEpKTsKKwkJICAgICogKChmbG9hdClwb3coKGRvdWJsZSlpIC8gY2llbGFiLT5yYW5nZSwgZGZHYW1tYSkpOwogCX0KIAogCS8qIEluaXQgcmVmZXJlbmNlIHdoaXRlIHBvaW50ICovCkBAIC0xNzUsNyArMTc1LDcgQEAKICNkZWZpbmUJU0hJRlQJCQkxNgogI2RlZmluZQlGSVgoeCkJCQkoKGludDMyKSgoeCkgKiAoMUw8PFNISUZUKSArIDAuNSkpCiAjZGVmaW5lCU9ORV9IQUxGCQkoKGludDMyKSgxPDwoU0hJRlQtMSkpKQotI2RlZmluZQlDb2RlMlYoYywgUkIsIFJXLCBDUikJKCgoKGMpLShpbnQzMikoUkIpKSooZmxvYXQpKENSKSkvKGZsb2F0KSgoKFJXKS0oUkIpKSA/ICgoUlcpLShSQikpIDogMSkpCisjZGVmaW5lCUNvZGUyVihjLCBSQiwgUlcsIENSKQkoKCgoYyktKGludDMyKShSQikpKihmbG9hdCkoQ1IpKS8oZmxvYXQpKCgoUlcpLShSQikhPTApID8gKChSVyktKFJCKSkgOiAxKSkKICNkZWZpbmUJQ0xBTVAoZixtaW4sbWF4KQkoKGYpPChtaW4pPyhtaW4pOihmKT4obWF4KT8obWF4KTooZikpCiAjZGVmaW5lIEhJQ0xBTVAoZixtYXgpCQkoKGYpPihtYXgpPyhtYXgpOihmKSkKIApAQCAtMTg2LDcgKzE4Niw5IEBACiAJaW50MzIgaTsKIAogCS8qIFhYWDogT25seSA4LWJpdCBZQ2JDciBpbnB1dCBzdXBwb3J0ZWQgZm9yIG5vdyAqLwotCVkgPSBISUNMQU1QKFksIDI1NSksIENiID0gQ0xBTVAoQ2IsIDAsIDI1NSksIENyID0gQ0xBTVAoQ3IsIDAsIDI1NSk7CisJWSA9IEhJQ0xBTVAoWSwgMjU1KTsKKwlDYiA9IENMQU1QKENiLCAwLCAyNTUpOworCUNyID0gQ0xBTVAoQ3IsIDAsIDI1NSk7CiAKIAlpID0geWNiY3ItPllfdGFiW1ldICsgeWNiY3ItPkNyX3JfdGFiW0NyXTsKIAkqciA9IENMQU1QKGksIDAsIDI1NSk7CkBAIC0xOTcsNiArMTk5LDIzIEBACiAJKmIgPSBDTEFNUChpLCAwLCAyNTUpOwogfQogCisvKiBDbGFtcCBmdW5jdGlvbiBmb3Igc2FuaXRpemF0aW9uIHB1cnBvc2VzLiBOb3JtYWxseSBjbGFtcGluZyBzaG91bGQgbm90ICovCisvKiBvY2N1ciBmb3Igd2VsbCBiZWhhdmVkIGNocm9tYSBhbmQgcmVmQmxhY2tXaGl0ZSBjb2VmZmljaWVudHMgKi8KK3N0YXRpYyBmbG9hdCBDTEFNUHcoZmxvYXQgdiwgZmxvYXQgdm1pbiwgZmxvYXQgdm1heCkKK3sKKyAgICBpZiggdiA8IHZtaW4gKQorICAgIHsKKyAgICAgICAgLyogcHJpbnRmKCIlZiBjbGFtcGVkIHRvICVmXG4iLCB2LCB2bWluKTsgKi8KKyAgICAgICAgcmV0dXJuIHZtaW47CisgICAgfQorICAgIGlmKCB2ID4gdm1heCApCisgICAgeworICAgICAgICAvKiBwcmludGYoIiVmIGNsYW1wZWQgdG8gJWZcbiIsIHYsIHZtYXgpOyAqLworICAgICAgICByZXR1cm4gdm1heDsKKyAgICB9CisgICAgcmV0dXJuIHY7Cit9CisKIC8qCiAgKiBJbml0aWFsaXplIHRoZSBZQ2JDci0+UkdCIGNvbnZlcnNpb24gdGFibGVzLiAgVGhlIGNvbnZlcnNpb24KICAqIGlzIGRvbmUgYWNjb3JkaW5nIHRvIHRoZSA2LjAgc3BlYzoKQEAgLTIzNiwxMCArMjU1LDEwIEBACiAgICAgeWNiY3ItPkNiX2dfdGFiID0geWNiY3ItPkNyX2dfdGFiICsgMjU2OwogICAgIHljYmNyLT5ZX3RhYiA9IHljYmNyLT5DYl9nX3RhYiArIDI1NjsKIAotICAgIHsgZmxvYXQgZjEgPSAyLTIqTHVtYVJlZDsJCWludDMyIEQxID0gRklYKGYxKTsKLSAgICAgIGZsb2F0IGYyID0gTHVtYVJlZCpmMS9MdW1hR3JlZW47CWludDMyIEQyID0gLUZJWChmMik7Ci0gICAgICBmbG9hdCBmMyA9IDItMipMdW1hQmx1ZTsJCWludDMyIEQzID0gRklYKGYzKTsKLSAgICAgIGZsb2F0IGY0ID0gTHVtYUJsdWUqZjMvTHVtYUdyZWVuOwlpbnQzMiBENCA9IC1GSVgoZjQpOworICAgIHsgZmxvYXQgZjEgPSAyLTIqTHVtYVJlZDsJCWludDMyIEQxID0gRklYKENMQU1QKGYxLDAuMEYsMi4wRikpOworICAgICAgZmxvYXQgZjIgPSBMdW1hUmVkKmYxL0x1bWFHcmVlbjsJaW50MzIgRDIgPSAtRklYKENMQU1QKGYyLDAuMEYsMi4wRikpOworICAgICAgZmxvYXQgZjMgPSAyLTIqTHVtYUJsdWU7CQlpbnQzMiBEMyA9IEZJWChDTEFNUChmMywwLjBGLDIuMEYpKTsKKyAgICAgIGZsb2F0IGY0ID0gTHVtYUJsdWUqZjMvTHVtYUdyZWVuOwlpbnQzMiBENCA9IC1GSVgoQ0xBTVAoZjQsMC4wRiwyLjBGKSk7CiAgICAgICBpbnQgeDsKIAogI3VuZGVmIEx1bWFCbHVlCkBAIC0yNTQsMTcgKzI3MywyMCBAQAogICAgICAgICogY29uc3RydWN0aW5nIHRhYmxlcyBpbmRleGVkIGJ5IHRoZSByYXcgcGl4ZWwgZGF0YS4KICAgICAgICAqLwogICAgICAgZm9yIChpID0gMCwgeCA9IC0xMjg7IGkgPCAyNTY7IGkrKywgeCsrKSB7Ci0JICAgIGludDMyIENyID0gKGludDMyKUNvZGUyVih4LCByZWZCbGFja1doaXRlWzRdIC0gMTI4LjBGLAotCQkJICAgIHJlZkJsYWNrV2hpdGVbNV0gLSAxMjguMEYsIDEyNyk7Ci0JICAgIGludDMyIENiID0gKGludDMyKUNvZGUyVih4LCByZWZCbGFja1doaXRlWzJdIC0gMTI4LjBGLAotCQkJICAgIHJlZkJsYWNrV2hpdGVbM10gLSAxMjguMEYsIDEyNyk7CisJICAgIGludDMyIENyID0gKGludDMyKUNMQU1QdyhDb2RlMlYoeCwgcmVmQmxhY2tXaGl0ZVs0XSAtIDEyOC4wRiwKKwkJCSAgICByZWZCbGFja1doaXRlWzVdIC0gMTI4LjBGLCAxMjcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMjguMEYgKiA2NCwgMTI4LjBGICogNjQpOworCSAgICBpbnQzMiBDYiA9IChpbnQzMilDTEFNUHcoQ29kZTJWKHgsIHJlZkJsYWNrV2hpdGVbMl0gLSAxMjguMEYsCisJCQkgICAgcmVmQmxhY2tXaGl0ZVszXSAtIDEyOC4wRiwgMTI3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTI4LjBGICogNjQsIDEyOC4wRiAqIDY0KTsKIAogCSAgICB5Y2Jjci0+Q3Jfcl90YWJbaV0gPSAoaW50MzIpKChEMSpDciArIE9ORV9IQUxGKT4+U0hJRlQpOwogCSAgICB5Y2Jjci0+Q2JfYl90YWJbaV0gPSAoaW50MzIpKChEMypDYiArIE9ORV9IQUxGKT4+U0hJRlQpOwogCSAgICB5Y2Jjci0+Q3JfZ190YWJbaV0gPSBEMipDcjsKIAkgICAgeWNiY3ItPkNiX2dfdGFiW2ldID0gRDQqQ2IgKyBPTkVfSEFMRjsKIAkgICAgeWNiY3ItPllfdGFiW2ldID0KLQkJICAgIChpbnQzMilDb2RlMlYoeCArIDEyOCwgcmVmQmxhY2tXaGl0ZVswXSwgcmVmQmxhY2tXaGl0ZVsxXSwgMjU1KTsKKwkJICAgIChpbnQzMilDTEFNUHcoQ29kZTJWKHggKyAxMjgsIHJlZkJsYWNrV2hpdGVbMF0sIHJlZkJsYWNrV2hpdGVbMV0sIDI1NSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEyOC4wRiAqIDY0LCAxMjguMEYgKiA2NCk7CiAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9jb21wcmVzcy5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfY29tcHJlc3MuYwppbmRleCAyMGU3MmZkLi5iNTcxZDE5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9jb21wcmVzcy5jCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2NvbXByZXNzLmMKQEAgLTEsNCArMSw0IEBACi0vKiAkSWQ6IHRpZl9jb21wcmVzcy5jLHYgMS4yMiAyMDEwLTAzLTEwIDE4OjU2OjQ4IGJmcmllc2VuIEV4cCAkICovCisvKiAkSWQ6IHRpZl9jb21wcmVzcy5jLHYgMS4yNSAyMDE2LTEwLTI1IDIwOjA0OjIyIGVyb3VhdWx0IEV4cCAkICovCiAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgpAQCAtODIsMTAgKzgyLDEwIEBACiAJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB0aWYtPnRpZl9uYW1lLAogCQkJICAgICAiQ29tcHJlc3Npb24gc2NoZW1lICV1ICVzIGRlY29kaW5nIGlzIG5vdCBpbXBsZW1lbnRlZCIsCiAJCQkgICAgIHRpZi0+dGlmX2Rpci50ZF9jb21wcmVzc2lvbiwgbWV0aG9kKTsKLQlyZXR1cm4gKC0xKTsKKwlyZXR1cm4gKDApOwogfQogCi1pbnQKK3N0YXRpYyBpbnQKIF9USUZGTm9GaXh1cFRhZ3MoVElGRiogdGlmKQogewogCSh2b2lkKSB0aWY7CkBAIC0yMjcsNyArMjI3LDcgQEAKIAljb2RlY190KiBjZDsKIAljb2RlY190KiogcGNkOwogCi0JZm9yIChwY2QgPSAmcmVnaXN0ZXJlZENPREVDUzsgKGNkID0gKnBjZCk7IHBjZCA9ICZjZC0+bmV4dCkKKwlmb3IgKHBjZCA9ICZyZWdpc3RlcmVkQ09ERUNTOyAoY2QgPSAqcGNkKSAhPSBOVUxMOyBwY2QgPSAmY2QtPm5leHQpCiAJCWlmIChjZC0+aW5mbyA9PSBjKSB7CiAJCQkqcGNkID0gY2QtPm5leHQ7CiAJCQlfVElGRmZyZWUoY2QpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZGlyLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kaXIuYwppbmRleCAxNmNlM2QzLi5hODgzOTQ5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kaXIuYworKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kaXIuYwpAQCAtMSw0ICsxLDQgQEAKLS8qICRJZDogdGlmX2Rpci5jLHYgMS4xMjEgMjAxNS0wNS0zMSAyMzoxMTo0MyBiZnJpZXNlbiBFeHAgJCAqLworLyogJElkOiB0aWZfZGlyLmMsdiAxLjEzMCAyMDE3LTA1LTE3IDIxOjU0OjA1IGVyb3VhdWx0IEV4cCAkICovCiAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgpAQCAtMzEsNiArMzEsNyBAQAogICogKGFuZCBhbHNvIHNvbWUgbWlzY2VsbGFuZW91cyBzdHVmZikKICAqLwogI2luY2x1ZGUgInRpZmZpb3AuaCIKKyNpbmNsdWRlIDxmbG9hdC5oPgogCiAvKgogICogVGhlc2UgYXJlIHVzZWQgaW4gdGhlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGNvZGUuLi4KQEAgLTQzLDggKzQ0LDEwIEBACiBzdGF0aWMgdm9pZAogc2V0Qnl0ZUFycmF5KHZvaWQqKiB2cHAsIHZvaWQqIHZwLCBzaXplX3Qgbm1lbWIsIHNpemVfdCBlbGVtX3NpemUpCiB7Ci0JaWYgKCp2cHApCi0JCV9USUZGZnJlZSgqdnBwKSwgKnZwcCA9IDA7CisJaWYgKCp2cHApIHsKKwkJX1RJRkZmcmVlKCp2cHApOworCQkqdnBwID0gMDsKKwl9CiAJaWYgKHZwKSB7CiAJCXRtc2l6ZV90IGJ5dGVzID0gKHRtc2l6ZV90KShubWVtYiAqIGVsZW1fc2l6ZSk7CiAJCWlmIChlbGVtX3NpemUgJiYgYnl0ZXMgLyBlbGVtX3NpemUgPT0gbm1lbWIpCkBAIC01NywxMyArNjAsMTMgQEAKICAgICB7IHNldEJ5dGVBcnJheSh2cHAsIHZwLCBuLCAxKTsgfQogdm9pZCBfVElGRnNldFN0cmluZyhjaGFyKiogY3BwLCBjaGFyKiBjcCkKICAgICB7IHNldEJ5dGVBcnJheSgodm9pZCoqKSBjcHAsICh2b2lkKikgY3AsIHN0cmxlbihjcCkrMSwgMSk7IH0KLXZvaWQgX1RJRkZzZXROU3RyaW5nKGNoYXIqKiBjcHAsIGNoYXIqIGNwLCB1aW50MzIgbikKK3N0YXRpYyB2b2lkIF9USUZGc2V0TlN0cmluZyhjaGFyKiogY3BwLCBjaGFyKiBjcCwgdWludDMyIG4pCiAgICAgeyBzZXRCeXRlQXJyYXkoKHZvaWQqKikgY3BwLCAodm9pZCopIGNwLCBuLCAxKTsgfQogdm9pZCBfVElGRnNldFNob3J0QXJyYXkodWludDE2Kiogd3BwLCB1aW50MTYqIHdwLCB1aW50MzIgbikKICAgICB7IHNldEJ5dGVBcnJheSgodm9pZCoqKSB3cHAsICh2b2lkKikgd3AsIG4sIHNpemVvZiAodWludDE2KSk7IH0KIHZvaWQgX1RJRkZzZXRMb25nQXJyYXkodWludDMyKiogbHBwLCB1aW50MzIqIGxwLCB1aW50MzIgbikKICAgICB7IHNldEJ5dGVBcnJheSgodm9pZCoqKSBscHAsICh2b2lkKikgbHAsIG4sIHNpemVvZiAodWludDMyKSk7IH0KLXZvaWQgX1RJRkZzZXRMb25nOEFycmF5KHVpbnQ2NCoqIGxwcCwgdWludDY0KiBscCwgdWludDMyIG4pCitzdGF0aWMgdm9pZCBfVElGRnNldExvbmc4QXJyYXkodWludDY0KiogbHBwLCB1aW50NjQqIGxwLCB1aW50MzIgbikKICAgICB7IHNldEJ5dGVBcnJheSgodm9pZCoqKSBscHAsICh2b2lkKikgbHAsIG4sIHNpemVvZiAodWludDY0KSk7IH0KIHZvaWQgX1RJRkZzZXRGbG9hdEFycmF5KGZsb2F0KiogZnBwLCBmbG9hdCogZnAsIHVpbnQzMiBuKQogICAgIHsgc2V0Qnl0ZUFycmF5KCh2b2lkKiopIGZwcCwgKHZvaWQqKSBmcCwgbiwgc2l6ZW9mIChmbG9hdCkpOyB9CkBAIC0xNTIsNiArMTU1LDE1IEBACiAJcmV0dXJuICgwKTsKIH0KIAorc3RhdGljIGZsb2F0IFRJRkZDbGFtcERvdWJsZVRvRmxvYXQoIGRvdWJsZSB2YWwgKQoreworICAgIGlmKCB2YWwgPiBGTFRfTUFYICkKKyAgICAgICAgcmV0dXJuIEZMVF9NQVg7CisgICAgaWYoIHZhbCA8IC1GTFRfTUFYICkKKyAgICAgICAgcmV0dXJuIC1GTFRfTUFYOworICAgIHJldHVybiAoZmxvYXQpdmFsOworfQorCiBzdGF0aWMgaW50CiBfVElGRlZTZXRGaWVsZChUSUZGKiB0aWYsIHVpbnQzMiB0YWcsIHZhX2xpc3QgYXApCiB7CkBAIC0xNzAsNyArMTgyLDcgQEAKIAkgKiBXZSB3YW50IHRvIGZvcmNlIHRoZSBjdXN0b20gY29kZSB0byBiZSB1c2VkIGZvciBjdXN0b20KIAkgKiBmaWVsZHMgZXZlbiBpZiB0aGUgdGFnIGhhcHBlbnMgdG8gbWF0Y2ggYSB3ZWxsIGtub3duIAogCSAqIG9uZSAtIGltcG9ydGFudCBmb3IgcmVpbnRlcnByZXRlZCBoYW5kbGluZyBvZiBzdGFuZGFyZAotCSAqIHRhZyB2YWx1ZXMgaW4gY3VzdG9tIGRpcmVjdG9yaWVzIChpZS4gRVhJRikgCisJICogdGFnIHZhbHVlcyBpbiBjdXN0b20gZGlyZWN0b3JpZXMgKGkuZS4gRVhJRikgCiAJICovCiAJaWYgKGZpcC0+ZmllbGRfYml0ID09IEZJRUxEX0NVU1RPTSkgewogCQlzdGFuZGFyZF90YWcgPSAwOwpAQCAtMjU0LDYgKzI2NiwyOCBAQAogCQl2ID0gKHVpbnQxNikgdmFfYXJnKGFwLCB1aW50MTZfdmFwKTsKIAkJaWYgKHYgPT0gMCkKIAkJCWdvdG8gYmFkdmFsdWU7CisgICAgICAgIGlmKCB2ICE9IHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTZWUgaHR0cDovL2J1Z3ppbGxhLm1hcHRvb2xzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjUwMCAqLworICAgICAgICAgICAgaWYoIHRkLT50ZF9zbWluc2FtcGxldmFsdWUgIT0gTlVMTCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICJTYW1wbGVzUGVyUGl4ZWwgdGFnIHZhbHVlIGlzIGNoYW5naW5nLCAiCisgICAgICAgICAgICAgICAgICAgICJidXQgU01pblNhbXBsZVZhbHVlIHRhZyB3YXMgcmVhZCB3aXRoIGEgZGlmZmVyZW50IHZhbHVlLiBDYW5jZWxsaW5nIGl0Iik7CisgICAgICAgICAgICAgICAgVElGRkNsckZpZWxkQml0KHRpZixGSUVMRF9TTUlOU0FNUExFVkFMVUUpOworICAgICAgICAgICAgICAgIF9USUZGZnJlZSh0ZC0+dGRfc21pbnNhbXBsZXZhbHVlKTsKKyAgICAgICAgICAgICAgICB0ZC0+dGRfc21pbnNhbXBsZXZhbHVlID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCB0ZC0+dGRfc21heHNhbXBsZXZhbHVlICE9IE5VTEwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAiU2FtcGxlc1BlclBpeGVsIHRhZyB2YWx1ZSBpcyBjaGFuZ2luZywgIgorICAgICAgICAgICAgICAgICAgICAiYnV0IFNNYXhTYW1wbGVWYWx1ZSB0YWcgd2FzIHJlYWQgd2l0aCBhIGRpZmZlcmVudCB2YWx1ZS4gQ2FuY2VsbGluZyBpdCIpOworICAgICAgICAgICAgICAgIFRJRkZDbHJGaWVsZEJpdCh0aWYsRklFTERfU01BWFNBTVBMRVZBTFVFKTsKKyAgICAgICAgICAgICAgICBfVElGRmZyZWUodGQtPnRkX3NtYXhzYW1wbGV2YWx1ZSk7CisgICAgICAgICAgICAgICAgdGQtPnRkX3NtYXhzYW1wbGV2YWx1ZSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAkJdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCA9ICh1aW50MTYpIHY7CiAJCWJyZWFrOwogCWNhc2UgVElGRlRBR19ST1dTUEVSU1RSSVA6CkBAIC0yODgsMTMgKzMyMiwxMyBAQAogICAgICAgICBkYmx2YWwgPSB2YV9hcmcoYXAsIGRvdWJsZSk7CiAgICAgICAgIGlmKCBkYmx2YWwgPCAwICkKICAgICAgICAgICAgIGdvdG8gYmFkdmFsdWVkb3VibGU7Ci0JCXRkLT50ZF94cmVzb2x1dGlvbiA9IChmbG9hdCkgZGJsdmFsOworCQl0ZC0+dGRfeHJlc29sdXRpb24gPSBUSUZGQ2xhbXBEb3VibGVUb0Zsb2F0KCBkYmx2YWwgKTsKIAkJYnJlYWs7CiAJY2FzZSBUSUZGVEFHX1lSRVNPTFVUSU9OOgogICAgICAgICBkYmx2YWwgPSB2YV9hcmcoYXAsIGRvdWJsZSk7CiAgICAgICAgIGlmKCBkYmx2YWwgPCAwICkKICAgICAgICAgICAgIGdvdG8gYmFkdmFsdWVkb3VibGU7Ci0JCXRkLT50ZF95cmVzb2x1dGlvbiA9IChmbG9hdCkgZGJsdmFsOworCQl0ZC0+dGRfeXJlc29sdXRpb24gPSBUSUZGQ2xhbXBEb3VibGVUb0Zsb2F0KCBkYmx2YWwgKTsKIAkJYnJlYWs7CiAJY2FzZSBUSUZGVEFHX1BMQU5BUkNPTkZJRzoKIAkJdiA9ICh1aW50MTYpIHZhX2FyZyhhcCwgdWludDE2X3ZhcCk7CkBAIC0zMDMsMTAgKzMzNywxMCBAQAogCQl0ZC0+dGRfcGxhbmFyY29uZmlnID0gKHVpbnQxNikgdjsKIAkJYnJlYWs7CiAJY2FzZSBUSUZGVEFHX1hQT1NJVElPTjoKLQkJdGQtPnRkX3hwb3NpdGlvbiA9IChmbG9hdCkgdmFfYXJnKGFwLCBkb3VibGUpOworCQl0ZC0+dGRfeHBvc2l0aW9uID0gVElGRkNsYW1wRG91YmxlVG9GbG9hdCggdmFfYXJnKGFwLCBkb3VibGUpICk7CiAJCWJyZWFrOwogCWNhc2UgVElGRlRBR19ZUE9TSVRJT046Ci0JCXRkLT50ZF95cG9zaXRpb24gPSAoZmxvYXQpIHZhX2FyZyhhcCwgZG91YmxlKTsKKwkJdGQtPnRkX3lwb3NpdGlvbiA9IFRJRkZDbGFtcERvdWJsZVRvRmxvYXQoIHZhX2FyZyhhcCwgZG91YmxlKSApOwogCQlicmVhazsKIAljYXNlIFRJRkZUQUdfUkVTT0xVVElPTlVOSVQ6CiAJCXYgPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOwpAQCAtNDAyLDcgKzQzNiw3IEBACiAJCWlmICgodGlmLT50aWZfZmxhZ3MgJiBUSUZGX0lOU1VCSUZEKSA9PSAwKSB7CiAJCQl0ZC0+dGRfbnN1YmlmZCA9ICh1aW50MTYpIHZhX2FyZyhhcCwgdWludDE2X3ZhcCk7CiAJCQlfVElGRnNldExvbmc4QXJyYXkoJnRkLT50ZF9zdWJpZmQsICh1aW50NjQqKSB2YV9hcmcoYXAsIHVpbnQ2NCopLAotCQkJICAgIChsb25nKSB0ZC0+dGRfbnN1YmlmZCk7CisJCQkgICAgKHVpbnQzMikgdGQtPnRkX25zdWJpZmQpOwogCQl9IGVsc2UgewogCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKIAkJCQkgICAgICIlczogU29ycnksIGNhbm5vdCBuZXN0IFN1YklGRHMiLApAQCAtNDIxLDE5ICs0NTUsMTEgQEAKIAkJdiA9ICh0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsIC0gdGQtPnRkX2V4dHJhc2FtcGxlcykgPiAxID8gMyA6IDE7CiAJCWZvciAoaSA9IDA7IGkgPCB2OyBpKyspCiAJCQlfVElGRnNldFNob3J0QXJyYXkoJnRkLT50ZF90cmFuc2ZlcmZ1bmN0aW9uW2ldLAotCQkJICAgIHZhX2FyZyhhcCwgdWludDE2KiksIDFMPDx0ZC0+dGRfYml0c3BlcnNhbXBsZSk7CisJCQkgICAgdmFfYXJnKGFwLCB1aW50MTYqKSwgMVU8PHRkLT50ZF9iaXRzcGVyc2FtcGxlKTsKIAkJYnJlYWs7CiAJY2FzZSBUSUZGVEFHX1JFRkVSRU5DRUJMQUNLV0hJVEU6CiAJCS8qIFhYWCBzaG91bGQgY2hlY2sgZm9yIG51bGwgcmFuZ2UgKi8KIAkJX1RJRkZzZXRGbG9hdEFycmF5KCZ0ZC0+dGRfcmVmYmxhY2t3aGl0ZSwgdmFfYXJnKGFwLCBmbG9hdCopLCA2KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKLQkJCWlmIChpc25hbih0ZC0+dGRfcmVmYmxhY2t3aGl0ZVtpXSkpIHsKLQkJCQlpZiAoaSAlIDIgPT0gMCkKLQkJCQkJdGQtPnRkX3JlZmJsYWNrd2hpdGVbaV0gPSAwOwotCQkJCWVsc2UKLQkJCQkJdGQtPnRkX3JlZmJsYWNrd2hpdGVbaV0gPSBwb3coMiwgdGQtPnRkX2JpdHNwZXJzYW1wbGUpIC0gMTsKLQkJCX0KLQkJfQogCQlicmVhazsKIAljYXNlIFRJRkZUQUdfSU5LTkFNRVM6CiAJCXYgPSAodWludDE2KSB2YV9hcmcoYXAsIHVpbnQxNl92YXApOwpAQCAtNTg3LDEwICs2MTMsMTAgQEAKIAkJCQkgICBoYW5kbGVkIHRoaXMgd2F5IC4uLiBsaWtlbHkgYmVzdCBpZiB3ZSBtb3ZlIGl0IGludG8KIAkJCQkgICB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZSB3aXRoIGFuIGV4cGxpY2l0IGZpZWxkIGluIAogCQkJCSAgIGxpYnRpZmYgNC4xIGFuZCBhc3NpZ24gaXQgYSBGSUVMRF8gdmFsdWUgKi8KLQkJCQl1aW50MTYgdlsyXTsKLQkJCQl2WzBdID0gKHVpbnQxNil2YV9hcmcoYXAsIGludCk7Ci0JCQkJdlsxXSA9ICh1aW50MTYpdmFfYXJnKGFwLCBpbnQpOwotCQkJCV9USUZGbWVtY3B5KHR2LT52YWx1ZSwgJnYsIDQpOworCQkJCXVpbnQxNiB2MlsyXTsKKwkJCQl2MlswXSA9ICh1aW50MTYpdmFfYXJnKGFwLCBpbnQpOworCQkJCXYyWzFdID0gKHVpbnQxNil2YV9hcmcoYXAsIGludCk7CisJCQkJX1RJRkZtZW1jcHkodHYtPnZhbHVlLCAmdjIsIDQpOwogCQkJfQogCiAJCQllbHNlIGlmIChmaXAtPmZpZWxkX3Bhc3Njb3VudApAQCAtNjA4LDY2ICs2MzQsNjYgQEAKIAkJCQljYXNlIFRJRkZfQllURToKIAkJCQljYXNlIFRJRkZfVU5ERUZJTkVEOgogCQkJCQl7Ci0JCQkJCQl1aW50OCB2ID0gKHVpbnQ4KXZhX2FyZyhhcCwgaW50KTsKLQkJCQkJCV9USUZGbWVtY3B5KHZhbCwgJnYsIHR2X3NpemUpOworCQkJCQkJdWludDggdjIgPSAodWludDgpdmFfYXJnKGFwLCBpbnQpOworCQkJCQkJX1RJRkZtZW1jcHkodmFsLCAmdjIsIHR2X3NpemUpOwogCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgVElGRl9TQllURToKIAkJCQkJewotCQkJCQkJaW50OCB2ID0gKGludDgpdmFfYXJnKGFwLCBpbnQpOwotCQkJCQkJX1RJRkZtZW1jcHkodmFsLCAmdiwgdHZfc2l6ZSk7CisJCQkJCQlpbnQ4IHYyID0gKGludDgpdmFfYXJnKGFwLCBpbnQpOworCQkJCQkJX1RJRkZtZW1jcHkodmFsLCAmdjIsIHR2X3NpemUpOwogCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgVElGRl9TSE9SVDoKIAkJCQkJewotCQkJCQkJdWludDE2IHYgPSAodWludDE2KXZhX2FyZyhhcCwgaW50KTsKLQkJCQkJCV9USUZGbWVtY3B5KHZhbCwgJnYsIHR2X3NpemUpOworCQkJCQkJdWludDE2IHYyID0gKHVpbnQxNil2YV9hcmcoYXAsIGludCk7CisJCQkJCQlfVElGRm1lbWNweSh2YWwsICZ2MiwgdHZfc2l6ZSk7CiAJCQkJCX0KIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBUSUZGX1NTSE9SVDoKIAkJCQkJewotCQkJCQkJaW50MTYgdiA9IChpbnQxNil2YV9hcmcoYXAsIGludCk7Ci0JCQkJCQlfVElGRm1lbWNweSh2YWwsICZ2LCB0dl9zaXplKTsKKwkJCQkJCWludDE2IHYyID0gKGludDE2KXZhX2FyZyhhcCwgaW50KTsKKwkJCQkJCV9USUZGbWVtY3B5KHZhbCwgJnYyLCB0dl9zaXplKTsKIAkJCQkJfQogCQkJCQlicmVhazsKIAkJCQljYXNlIFRJRkZfTE9ORzoKIAkJCQljYXNlIFRJRkZfSUZEOgogCQkJCQl7Ci0JCQkJCQl1aW50MzIgdiA9IHZhX2FyZyhhcCwgdWludDMyKTsKLQkJCQkJCV9USUZGbWVtY3B5KHZhbCwgJnYsIHR2X3NpemUpOworCQkJCQkJdWludDMyIHYyID0gdmFfYXJnKGFwLCB1aW50MzIpOworCQkJCQkJX1RJRkZtZW1jcHkodmFsLCAmdjIsIHR2X3NpemUpOwogCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgVElGRl9TTE9ORzoKIAkJCQkJewotCQkJCQkJaW50MzIgdiA9IHZhX2FyZyhhcCwgaW50MzIpOwotCQkJCQkJX1RJRkZtZW1jcHkodmFsLCAmdiwgdHZfc2l6ZSk7CisJCQkJCQlpbnQzMiB2MiA9IHZhX2FyZyhhcCwgaW50MzIpOworCQkJCQkJX1RJRkZtZW1jcHkodmFsLCAmdjIsIHR2X3NpemUpOwogCQkJCQl9CiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgVElGRl9MT05HODoKIAkJCQljYXNlIFRJRkZfSUZEODoKIAkJCQkJewotCQkJCQkJdWludDY0IHYgPSB2YV9hcmcoYXAsIHVpbnQ2NCk7Ci0JCQkJCQlfVElGRm1lbWNweSh2YWwsICZ2LCB0dl9zaXplKTsKKwkJCQkJCXVpbnQ2NCB2MiA9IHZhX2FyZyhhcCwgdWludDY0KTsKKwkJCQkJCV9USUZGbWVtY3B5KHZhbCwgJnYyLCB0dl9zaXplKTsKIAkJCQkJfQogCQkJCQlicmVhazsKIAkJCQljYXNlIFRJRkZfU0xPTkc4OgogCQkJCQl7Ci0JCQkJCQlpbnQ2NCB2ID0gdmFfYXJnKGFwLCBpbnQ2NCk7Ci0JCQkJCQlfVElGRm1lbWNweSh2YWwsICZ2LCB0dl9zaXplKTsKKwkJCQkJCWludDY0IHYyID0gdmFfYXJnKGFwLCBpbnQ2NCk7CisJCQkJCQlfVElGRm1lbWNweSh2YWwsICZ2MiwgdHZfc2l6ZSk7CiAJCQkJCX0KIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBUSUZGX1JBVElPTkFMOgogCQkJCWNhc2UgVElGRl9TUkFUSU9OQUw6CiAJCQkJY2FzZSBUSUZGX0ZMT0FUOgogCQkJCQl7Ci0JCQkJCQlmbG9hdCB2ID0gKGZsb2F0KXZhX2FyZyhhcCwgZG91YmxlKTsKLQkJCQkJCV9USUZGbWVtY3B5KHZhbCwgJnYsIHR2X3NpemUpOworCQkJCQkJZmxvYXQgdjIgPSBUSUZGQ2xhbXBEb3VibGVUb0Zsb2F0KHZhX2FyZyhhcCwgZG91YmxlKSk7CisJCQkJCQlfVElGRm1lbWNweSh2YWwsICZ2MiwgdHZfc2l6ZSk7CiAJCQkJCX0KIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBUSUZGX0RPVUJMRToKIAkJCQkJewotCQkJCQkJZG91YmxlIHYgPSB2YV9hcmcoYXAsIGRvdWJsZSk7Ci0JCQkJCQlfVElGRm1lbWNweSh2YWwsICZ2LCB0dl9zaXplKTsKKwkJCQkJCWRvdWJsZSB2MiA9IHZhX2FyZyhhcCwgZG91YmxlKTsKKwkJCQkJCV9USUZGbWVtY3B5KHZhbCwgJnYyLCB0dl9zaXplKTsKIAkJCQkJfQogCQkJCQlicmVhazsKIAkJCQlkZWZhdWx0OgpAQCAtNjgwLDkgKzcwNiw5IEBACiAJfQogCX0KIAlpZiAoc3RhdHVzKSB7Ci0JCWNvbnN0IFRJRkZGaWVsZCogZmlwPVRJRkZGaWVsZFdpdGhUYWcodGlmLHRhZyk7Ci0JCWlmIChmaXApICAgICAgICAgICAgICAgIAotCQkJVElGRlNldEZpZWxkQml0KHRpZiwgZmlwLT5maWVsZF9iaXQpOworCQljb25zdCBUSUZGRmllbGQqIGZpcDI9VElGRkZpZWxkV2l0aFRhZyh0aWYsdGFnKTsKKwkJaWYgKGZpcDIpICAgICAgICAgICAgICAgIAorCQkJVElGRlNldEZpZWxkQml0KHRpZiwgZmlwMi0+ZmllbGRfYml0KTsKIAkJdGlmLT50aWZfZmxhZ3MgfD0gVElGRl9ESVJUWURJUkVDVDsKIAl9CiAKQEAgLTY5MSwzMSArNzE3LDMxIEBACiAJcmV0dXJuIChzdGF0dXMpOwogYmFkdmFsdWU6CiAgICAgICAgIHsKLQkJY29uc3QgVElGRkZpZWxkKiBmaXA9VElGRkZpZWxkV2l0aFRhZyh0aWYsdGFnKTsKKwkJY29uc3QgVElGRkZpZWxkKiBmaXAyPVRJRkZGaWVsZFdpdGhUYWcodGlmLHRhZyk7CiAJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCiAJCSAgICAgIiVzOiBCYWQgdmFsdWUgJXUgZm9yIFwiJXNcIiB0YWciLAogCQkgICAgIHRpZi0+dGlmX25hbWUsIHYsCi0JCSAgICAgZmlwID8gZmlwLT5maWVsZF9uYW1lIDogIlVua25vd24iKTsKKwkJICAgICBmaXAyID8gZmlwMi0+ZmllbGRfbmFtZSA6ICJVbmtub3duIik7CiAJCXZhX2VuZChhcCk7CiAgICAgICAgIH0KIAlyZXR1cm4gKDApOwogYmFkdmFsdWUzMjoKICAgICAgICAgewotCQljb25zdCBUSUZGRmllbGQqIGZpcD1USUZGRmllbGRXaXRoVGFnKHRpZix0YWcpOworCQljb25zdCBUSUZGRmllbGQqIGZpcDI9VElGRkZpZWxkV2l0aFRhZyh0aWYsdGFnKTsKIAkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKIAkJICAgICAiJXM6IEJhZCB2YWx1ZSAldSBmb3IgXCIlc1wiIHRhZyIsCiAJCSAgICAgdGlmLT50aWZfbmFtZSwgdjMyLAotCQkgICAgIGZpcCA/IGZpcC0+ZmllbGRfbmFtZSA6ICJVbmtub3duIik7CisJCSAgICAgZmlwMiA/IGZpcDItPmZpZWxkX25hbWUgOiAiVW5rbm93biIpOwogCQl2YV9lbmQoYXApOwogICAgICAgICB9CiAJcmV0dXJuICgwKTsKIGJhZHZhbHVlZG91YmxlOgogICAgICAgICB7Ci0gICAgICAgIGNvbnN0IFRJRkZGaWVsZCogZmlwPVRJRkZGaWVsZFdpdGhUYWcodGlmLHRhZyk7CisgICAgICAgIGNvbnN0IFRJRkZGaWVsZCogZmlwMj1USUZGRmllbGRXaXRoVGFnKHRpZix0YWcpOwogICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAogICAgICAgICAgICAgICIlczogQmFkIHZhbHVlICVmIGZvciBcIiVzXCIgdGFnIiwKICAgICAgICAgICAgICB0aWYtPnRpZl9uYW1lLCBkYmx2YWwsCi0gICAgICAgICAgICAgZmlwID8gZmlwLT5maWVsZF9uYW1lIDogIlVua25vd24iKTsKKyAgICAgICAgICAgICBmaXAyID8gZmlwMi0+ZmllbGRfbmFtZSA6ICJVbmtub3duIik7CiAgICAgICAgIHZhX2VuZChhcCk7CiAgICAgICAgIH0KICAgICByZXR1cm4gKDApOwpAQCAtODM4LDExICs4NjQsMzcgQEAKIAlpZiggZmlwID09IE5VTEwgKSAvKiBjYW5ub3QgaGFwcGVuIHNpbmNlIFRJRkZHZXRGaWVsZCgpIGFscmVhZHkgY2hlY2tzIGl0ICovCiAJICAgIHJldHVybiAwOwogCQorICAgICAgICBpZiggdGFnID09IFRJRkZUQUdfTlVNQkVST0ZJTktTICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGQtPnRkX2N1c3RvbVZhbHVlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHVpbnQxNiB2YWw7CisgICAgICAgICAgICAgICAgVElGRlRhZ1ZhbHVlICp0diA9IHRkLT50ZF9jdXN0b21WYWx1ZXMgKyBpOworICAgICAgICAgICAgICAgIGlmICh0di0+aW5mby0+ZmllbGRfdGFnICE9IHRhZykKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgdmFsID0gKih1aW50MTYgKil0di0+dmFsdWU7CisgICAgICAgICAgICAgICAgLyogVHJ1bmNhdGUgdG8gU2FtcGxlc1BlclBpeGVsLCBzaW5jZSB0aGUgKi8KKyAgICAgICAgICAgICAgICAvKiBzZXR0aW5nIGNvZGUgZm9yIElOS05BTUVTIGFzc3VtZSB0aGF0IHRoZXJlIGFyZSBTYW1wbGVzUGVyUGl4ZWwgKi8KKyAgICAgICAgICAgICAgICAvKiBpbmtuYW1lcy4gKi8KKyAgICAgICAgICAgICAgICAvKiBGaXhlcyBodHRwOi8vYnVnemlsbGEubWFwdG9vbHMub3JnL3Nob3dfYnVnLmNnaT9pZD0yNTk5ICovCisgICAgICAgICAgICAgICAgaWYoIHZhbCA+IHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwiX1RJRkZWR2V0RmllbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJ1bmNhdGluZyBOdW1iZXJPZklua3MgZnJvbSAldSB0byAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCwgdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCk7CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IHRkLT50ZF9zYW1wbGVzcGVycGl4ZWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICp2YV9hcmcoYXAsIHVpbnQxNiopID0gdmFsOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKwogCS8qCiAJICogV2Ugd2FudCB0byBmb3JjZSB0aGUgY3VzdG9tIGNvZGUgdG8gYmUgdXNlZCBmb3IgY3VzdG9tCiAJICogZmllbGRzIGV2ZW4gaWYgdGhlIHRhZyBoYXBwZW5zIHRvIG1hdGNoIGEgd2VsbCBrbm93biAKIAkgKiBvbmUgLSBpbXBvcnRhbnQgZm9yIHJlaW50ZXJwcmV0ZWQgaGFuZGxpbmcgb2Ygc3RhbmRhcmQKLQkgKiB0YWcgdmFsdWVzIGluIGN1c3RvbSBkaXJlY3RvcmllcyAoaWUuIEVYSUYpIAorCSAqIHRhZyB2YWx1ZXMgaW4gY3VzdG9tIGRpcmVjdG9yaWVzIChpLmUuIEVYSUYpIAogCSAqLwogCWlmIChmaXAtPmZpZWxkX2JpdCA9PSBGSUVMRF9DVVNUT00pIHsKIAkJc3RhbmRhcmRfdGFnID0gMDsKQEAgLTg5Myw3ICs5NDUsNyBAQAogCQkJCSp2YV9hcmcoYXAsIGRvdWJsZSoqKSA9IHRkLT50ZF9zbWluc2FtcGxldmFsdWU7CiAJCQllbHNlCiAJCQl7Ci0JCQkJLyogbGlidGlmZiBoaXN0b3JpYWxseSB0cmVhdHMgdGhpcyBhcyBhIHNpbmdsZSB2YWx1ZS4gKi8KKwkJCQkvKiBsaWJ0aWZmIGhpc3RvcmljYWxseSB0cmVhdHMgdGhpcyBhcyBhIHNpbmdsZSB2YWx1ZS4gKi8KIAkJCQl1aW50MTYgaTsKIAkJCQlkb3VibGUgdiA9IHRkLT50ZF9zbWluc2FtcGxldmFsdWVbMF07CiAJCQkJZm9yIChpPTE7IGkgPCB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsOyArK2kpCkBAIC05MDcsNyArOTU5LDcgQEAKIAkJCQkqdmFfYXJnKGFwLCBkb3VibGUqKikgPSB0ZC0+dGRfc21heHNhbXBsZXZhbHVlOwogCQkJZWxzZQogCQkJewotCQkJCS8qIGxpYnRpZmYgaGlzdG9yaWFsbHkgdHJlYXRzIHRoaXMgYXMgYSBzaW5nbGUgdmFsdWUuICovCisJCQkJLyogbGlidGlmZiBoaXN0b3JpY2FsbHkgdHJlYXRzIHRoaXMgYXMgYSBzaW5nbGUgdmFsdWUuICovCiAJCQkJdWludDE2IGk7CiAJCQkJZG91YmxlIHYgPSB0ZC0+dGRfc21heHNhbXBsZXZhbHVlWzBdOwogCQkJCWZvciAoaT0xOyBpIDwgdGQtPnRkX3NhbXBsZXNwZXJwaXhlbDsgKytpKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZGlyaW5mby5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZGlyaW5mby5jCmluZGV4IDdkYjRiZGIuLjIzYWQwMDIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2RpcmluZm8uYworKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kaXJpbmZvLmMKQEAgLTEsNCArMSw0IEBACi0vKiAkSWQ6IHRpZl9kaXJpbmZvLmMsdiAxLjEyMSAyMDE0LTA1LTA3IDAxOjU4OjQ2IGJmcmllc2VuIEV4cCAkICovCisvKiAkSWQ6IHRpZl9kaXJpbmZvLmMsdiAxLjEyNiAyMDE2LTExLTE4IDAyOjUyOjEzIGJmcmllc2VuIEV4cCAkICovCiAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgpAQCAtMzgsMTQgKzM4LDIyIEBACiAgKiBOT1RFOiBUaGUgc2Vjb25kIGZpZWxkIChmaWVsZF9yZWFkY291bnQpIGFuZCB0aGlyZCBmaWVsZCAoZmllbGRfd3JpdGVjb3VudCkKICAqICAgICAgIHNvbWV0aW1lcyB1c2UgdGhlIHZhbHVlcyBUSUZGX1ZBUklBQkxFICgtMSksIFRJRkZfVkFSSUFCTEUyICgtMykKICAqICAgICAgIGFuZCBUSUZGX1NQUCAoLTIpLiBUaGUgbWFjcm9zIHNob3VsZCBiZSB1c2VkIGJ1dCB3b3VsZCB0aHJvdyBvZmYKLSAqICAgICAgIHRoZSBmb3JtYXR0aW5nIG9mIHRoZSBjb2RlLCBzbyBwbGVhc2UgaW50ZXJwcmV0ZSB0aGUgLTEsIC0yIGFuZCAtMworICogICAgICAgdGhlIGZvcm1hdHRpbmcgb2YgdGhlIGNvZGUsIHNvIHBsZWFzZSBpbnRlcnByZXQgdGhlIC0xLCAtMiBhbmQgLTMKICAqICAgICAgIHZhbHVlcyBhY2NvcmRpbmdseS4KICAqLwogCi1zdGF0aWMgVElGRkZpZWxkQXJyYXkgdGlmZkZpZWxkQXJyYXk7Ci1zdGF0aWMgVElGRkZpZWxkQXJyYXkgZXhpZkZpZWxkQXJyYXk7CisvKiBjb25zdCBvYmplY3Qgc2hvdWxkIGJlIGluaXRpYWxpemVkICovCisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyggcHVzaCApCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGUgOiA0MTMyICkKKyNlbmRpZgorc3RhdGljIGNvbnN0IFRJRkZGaWVsZEFycmF5IHRpZmZGaWVsZEFycmF5Oworc3RhdGljIGNvbnN0IFRJRkZGaWVsZEFycmF5IGV4aWZGaWVsZEFycmF5OworI2lmZGVmIF9NU0NfVkVSCisjcHJhZ21hIHdhcm5pbmcoIHBvcCApCisjZW5kaWYKIAotc3RhdGljIFRJRkZGaWVsZAorc3RhdGljIGNvbnN0IFRJRkZGaWVsZAogdGlmZkZpZWxkc1tdID0gewogCXsgVElGRlRBR19TVUJGSUxFVFlQRSwgMSwgMSwgVElGRl9MT05HLCAwLCBUSUZGX1NFVEdFVF9VSU5UMzIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfU1VCRklMRVRZUEUsIDEsIDAsICJTdWJmaWxlVHlwZSIsIE5VTEwgfSwKIAl7IFRJRkZUQUdfT1NVQkZJTEVUWVBFLCAxLCAxLCBUSUZGX1NIT1JULCAwLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfU1VCRklMRVRZUEUsIDEsIDAsICJPbGRTdWJmaWxlVHlwZSIsIE5VTEwgfSwKQEAgLTk1LDcgKzEwMyw3IEBACiAJeyBUSUZGVEFHX1RJTEVMRU5HVEgsIDEsIDEsIFRJRkZfTE9ORywgMCwgVElGRl9TRVRHRVRfVUlOVDMyLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1RJTEVESU1FTlNJT05TLCAwLCAwLCAiVGlsZUxlbmd0aCIsIE5VTEwgfSwKIAl7IFRJRkZUQUdfVElMRU9GRlNFVFMsIC0xLCAxLCBUSUZGX0xPTkc4LCAwLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfU1RSSVBPRkZTRVRTLCAwLCAwLCAiVGlsZU9mZnNldHMiLCBOVUxMIH0sCiAJeyBUSUZGVEFHX1RJTEVCWVRFQ09VTlRTLCAtMSwgMSwgVElGRl9MT05HOCwgMCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX1NUUklQQllURUNPVU5UUywgMCwgMCwgIlRpbGVCeXRlQ291bnRzIiwgTlVMTCB9LAotCXsgVElGRlRBR19TVUJJRkQsIC0xLCAtMSwgVElGRl9JRkQ4LCAwLCBUSUZGX1NFVEdFVF9DMTZfSUZEOCwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9TVUJJRkQsIDEsIDEsICJTdWJJRkQiLCAmdGlmZkZpZWxkQXJyYXkgfSwKKwl7IFRJRkZUQUdfU1VCSUZELCAtMSwgLTEsIFRJRkZfSUZEOCwgMCwgVElGRl9TRVRHRVRfQzE2X0lGRDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfU1VCSUZELCAxLCAxLCAiU3ViSUZEIiwgKFRJRkZGaWVsZEFycmF5KikgJnRpZmZGaWVsZEFycmF5IH0sCiAJeyBUSUZGVEFHX0lOS1NFVCwgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIklua1NldCIsIE5VTEwgfSwKIAl7IFRJRkZUQUdfSU5LTkFNRVMsIC0xLCAtMSwgVElGRl9BU0NJSSwgMCwgVElGRl9TRVRHRVRfQzE2X0FTQ0lJLCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0lOS05BTUVTLCAxLCAxLCAiSW5rTmFtZXMiLCBOVUxMIH0sCiAJeyBUSUZGVEFHX05VTUJFUk9GSU5LUywgMSwgMSwgVElGRl9TSE9SVCwgMCwgVElGRl9TRVRHRVRfVUlOVDE2LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMSwgMCwgIk51bWJlck9mSW5rcyIsIE5VTEwgfSwKQEAgLTEzNCw3ICsxNDIsNyBAQAogCS8qIGVuZCBQaXhhciB0YWdzICovCiAJeyBUSUZGVEFHX1JJQ0hUSUZGSVBUQywgLTMsIC0zLCBUSUZGX0xPTkcsIDAsIFRJRkZfU0VUR0VUX0MzMl9VSU5UMzIsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiUmljaFRJRkZJUFRDIiwgTlVMTCB9LAogCXsgVElGRlRBR19QSE9UT1NIT1AsIC0zLCAtMywgVElGRl9CWVRFLCAwLCBUSUZGX1NFVEdFVF9DMzJfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiUGhvdG9zaG9wIiwgTlVMTCB9LAotCXsgVElGRlRBR19FWElGSUZELCAxLCAxLCBUSUZGX0lGRDgsIDAsIFRJRkZfU0VUR0VUX0lGRDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiRVhJRklGRE9mZnNldCIsICZleGlmRmllbGRBcnJheSB9LAorCXsgVElGRlRBR19FWElGSUZELCAxLCAxLCBUSUZGX0lGRDgsIDAsIFRJRkZfU0VUR0VUX0lGRDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAwLCAiRVhJRklGRE9mZnNldCIsIChUSUZGRmllbGRBcnJheSopICZleGlmRmllbGRBcnJheSB9LAogCXsgVElGRlRBR19JQ0NQUk9GSUxFLCAtMywgLTMsIFRJRkZfVU5ERUZJTkVELCAwLCBUSUZGX1NFVEdFVF9DMzJfVUlOVDgsIFRJRkZfU0VUR0VUX1VOREVGSU5FRCwgRklFTERfQ1VTVE9NLCAwLCAxLCAiSUNDIFByb2ZpbGUiLCBOVUxMIH0sCiAJeyBUSUZGVEFHX0dQU0lGRCwgMSwgMSwgVElGRl9JRkQ4LCAwLCBUSUZGX1NFVEdFVF9JRkQ4LCBUSUZGX1NFVEdFVF9VTkRFRklORUQsIEZJRUxEX0NVU1RPTSwgMCwgMCwgIkdQU0lGRE9mZnNldCIsIE5VTEwgfSwKIAl7IFRJRkZUQUdfRkFYUkVDVlBBUkFNUywgMSwgMSwgVElGRl9MT05HLCAwLCBUSUZGX1NFVEdFVF9VSU5UMzIsIFRJRkZfU0VUR0VUX1VJTlQzMiwgRklFTERfQ1VTVE9NLCBUUlVFLCBGQUxTRSwgIkZheFJlY3ZQYXJhbXMiLCBOVUxMIH0sCkBAIC0yMTEsNyArMjE5LDcgQEAKIAkvKiBiZWdpbiBwc2V1ZG8gdGFncyAqLwogfTsKIAotc3RhdGljIFRJRkZGaWVsZAorc3RhdGljIGNvbnN0IFRJRkZGaWVsZAogZXhpZkZpZWxkc1tdID0gewogCXsgRVhJRlRBR19FWFBPU1VSRVRJTUUsIDEsIDEsIFRJRkZfUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0RPVUJMRSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJFeHBvc3VyZVRpbWUiLCBOVUxMIH0sCiAJeyBFWElGVEFHX0ZOVU1CRVIsIDEsIDEsIFRJRkZfUkFUSU9OQUwsIDAsIFRJRkZfU0VUR0VUX0RPVUJMRSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJGTnVtYmVyIiwgTlVMTCB9LApAQCAtMjcxLDEzICsyNzksMTMgQEAKIAl7IEVYSUZUQUdfSU1BR0VVTklRVUVJRCwgMzMsIDMzLCBUSUZGX0FTQ0lJLCAwLCBUSUZGX1NFVEdFVF9BU0NJSSwgVElGRl9TRVRHRVRfVU5ERUZJTkVELCBGSUVMRF9DVVNUT00sIDEsIDAsICJJbWFnZVVuaXF1ZUlEIiwgTlVMTCB9CiB9OwogCi1zdGF0aWMgVElGRkZpZWxkQXJyYXkKLXRpZmZGaWVsZEFycmF5ID0geyB0ZmlhdEltYWdlLCAwLCBUSUZGQXJyYXlDb3VudCh0aWZmRmllbGRzKSwgdGlmZkZpZWxkcyB9Owotc3RhdGljIFRJRkZGaWVsZEFycmF5Ci1leGlmRmllbGRBcnJheSA9IHsgdGZpYXRFeGlmLCAwLCBUSUZGQXJyYXlDb3VudChleGlmRmllbGRzKSwgZXhpZkZpZWxkcyB9Oworc3RhdGljIGNvbnN0IFRJRkZGaWVsZEFycmF5Cit0aWZmRmllbGRBcnJheSA9IHsgdGZpYXRJbWFnZSwgMCwgVElGRkFycmF5Q291bnQodGlmZkZpZWxkcyksIChUSUZGRmllbGQqKSB0aWZmRmllbGRzIH07CitzdGF0aWMgY29uc3QgVElGRkZpZWxkQXJyYXkKK2V4aWZGaWVsZEFycmF5ID0geyB0ZmlhdEV4aWYsIDAsIFRJRkZBcnJheUNvdW50KGV4aWZGaWVsZHMpLCAoVElGRkZpZWxkKikgZXhpZkZpZWxkcyB9OwogCiAvKgotICogIFdlIGhhdmUgb3VyIG93biBsb2NhbCBsZmluZCgpIGVxdWl2ZWxlbnQgdG8gYXZvaWQgc3VidGxlIGRpZmZlcmVuY2VzCisgKiAgV2UgaGF2ZSBvdXIgb3duIGxvY2FsIGxmaW5kKCkgZXF1aXZhbGVudCB0byBhdm9pZCBzdWJ0bGUgZGlmZmVyZW5jZXMKICAqICBpbiB0eXBlcyBwYXNzZWQgdG8gbGZpbmQoKSBvbiBkaWZmZXJlbnQgc3lzdGVtcy4gCiAgKi8KIApAQCAtNTIxLDcgKzUyOSw3IEBACiAJcmV0dXJuIHRpZi0+dGlmX2ZvdW5kZmllbGQgPSAocmV0ID8gKnJldCA6IE5VTEwpOwogfQogCi1jb25zdCBUSUZGRmllbGQqCitzdGF0aWMgY29uc3QgVElGRkZpZWxkKgogX1RJRkZGaW5kRmllbGRCeU5hbWUoVElGRiogdGlmLCBjb25zdCBjaGFyICpmaWVsZF9uYW1lLCBUSUZGRGF0YVR5cGUgZHQpCiB7CiAJVElGRkZpZWxkIGtleSA9IHswLCAwLCAwLCBUSUZGX05PVFlQRSwgMCwgMCwgMCwgMCwgMCwgMCwgTlVMTCwgTlVMTH07CkBAIC03MTMsNyArNzIxLDcgQEAKIAkgKiBub3RlIHRoYXQgdGhpcyBuYW1lIGlzIGEgc3BlY2lhbCBzaWduIHRvIFRJRkZDbG9zZSgpIGFuZAogCSAqIF9USUZGU2V0dXBGaWVsZHMoKSB0byBmcmVlIHRoZSBmaWVsZAogCSAqLwotCXNucHJpbnRmKGZsZC0+ZmllbGRfbmFtZSwgMzIsICJUYWcgJWQiLCAoaW50KSB0YWcpOworCSh2b2lkKSBzbnByaW50ZihmbGQtPmZpZWxkX25hbWUsIDMyLCAiVGFnICVkIiwgKGludCkgdGFnKTsKIAogCXJldHVybiBmbGQ7ICAgIAogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZGlycmVhZC5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZGlycmVhZC5jCmluZGV4IGUwNDAzYWUuLmFiOTM4ZWEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2RpcnJlYWQuYworKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kaXJyZWFkLmMKQEAgLTEsNCArMSw0IEBACi0vKiAkSWQ6IHRpZl9kaXJyZWFkLmMsdiAxLjE5MSAyMDE1LTA5LTA1IDIwOjMxOjQxIGJmcmllc2VuIEV4cCAkICovCisvKiAkSWQ6IHRpZl9kaXJyZWFkLmMsdiAxLjIwOCAyMDE3LTA0LTI3IDE1OjQ2OjIyIGVyb3VhdWx0IEV4cCAkICovCiAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgpAQCAtNDAsNiArNDAsOCBAQAogICovCiAKICNpbmNsdWRlICJ0aWZmaW9wLmgiCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KIAogI2RlZmluZSBJR05PUkUgMCAgICAgICAgICAvKiB0YWcgcGxhY2Vob2xkZXIgdXNlZCBiZWxvdyAqLwogI2RlZmluZSBGQUlMRURfRklJICAgICgodWludDMyKSAtMSkKQEAgLTE2Niw2ICsxNjgsOCBAQAogc3RhdGljIHZvaWQgQ2hvcFVwU2luZ2xlVW5jb21wcmVzc2VkU3RyaXAoVElGRiopOwogc3RhdGljIHVpbnQ2NCBUSUZGUmVhZFVJbnQ2NChjb25zdCB1aW50OCAqdmFsdWUpOwogCitzdGF0aWMgaW50IF9USUZGRmlsbFN0cmlsZXNJbnRlcm5hbCggVElGRiAqdGlmLCBpbnQgbG9hZFN0cmlwQnl0ZUNvdW50ICk7CisKIHR5cGVkZWYgdW5pb24gX1VJbnQ2NEFsaWduZWRfdAogewogICAgICAgICBkb3VibGUgZDsKQEAgLTI0MDQsNyArMjQwOCwxNCBAQAogCQkJCW1hPShkb3VibGUqKW9yaWdkYXRhOwogCQkJCW1iPWRhdGE7CiAJCQkJZm9yIChuPTA7IG48Y291bnQ7IG4rKykKLQkJCQkJKm1iKys9KGZsb2F0KSgqbWErKyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwgPSAqbWErKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB2YWwgPiBGTFRfTUFYICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBGTFRfTUFYOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdmFsIDwgLUZMVF9NQVggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IC1GTFRfTUFYOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1iKys9KGZsb2F0KXZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCQkJfQogCQkJYnJlYWs7CiAJfQpAQCAtMjg3MCw3ICsyODgxLDEwIEBACiAJCW0ubCA9IGRpcmVudHJ5LT50ZGlyX29mZnNldC50b2ZmX2xvbmc4OwogCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCiAJCVRJRkZTd2FiQXJyYXlPZkxvbmcobS5pLDIpOwotCWlmIChtLmlbMF09PTApCisgICAgICAgIC8qIE5vdCBjb21wbGV0ZWx5IHN1cmUgd2hhdCB3ZSBzaG91bGQgZG8gd2hlbiBtLmlbMV09PTAsIGJ1dCBzb21lICovCisgICAgICAgIC8qIHNhbml0aXplcnMgZG8gbm90IGxpa2UgZGl2aXNpb24gYnkgMC4wOiAqLworICAgICAgICAvKiBodHRwOi8vYnVnemlsbGEubWFwdG9vbHMub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjQ0ICovCisJaWYgKG0uaVswXT09MCB8fCBtLmlbMV09PTApCiAJCSp2YWx1ZT0wLjA7CiAJZWxzZQogCQkqdmFsdWU9KGRvdWJsZSltLmlbMF0vKGRvdWJsZSltLmlbMV07CkBAIC0yODk4LDcgKzI5MTIsMTAgQEAKIAkJbS5sPWRpcmVudHJ5LT50ZGlyX29mZnNldC50b2ZmX2xvbmc4OwogCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCiAJCVRJRkZTd2FiQXJyYXlPZkxvbmcobS5pLDIpOwotCWlmICgoaW50MzIpbS5pWzBdPT0wKQorICAgICAgICAvKiBOb3QgY29tcGxldGVseSBzdXJlIHdoYXQgd2Ugc2hvdWxkIGRvIHdoZW4gbS5pWzFdPT0wLCBidXQgc29tZSAqLworICAgICAgICAvKiBzYW5pdGl6ZXJzIGRvIG5vdCBsaWtlIGRpdmlzaW9uIGJ5IDAuMDogKi8KKyAgICAgICAgLyogaHR0cDovL2J1Z3ppbGxhLm1hcHRvb2xzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjY0NCAqLworCWlmICgoaW50MzIpbS5pWzBdPT0wIHx8IG0uaVsxXT09MCkKIAkJKnZhbHVlPTAuMDsKIAllbHNlCiAJCSp2YWx1ZT0oZG91YmxlKSgoaW50MzIpbS5pWzBdKS8oZG91YmxlKW0uaVsxXTsKQEAgLTM0NTcsMTIgKzM0NzQsMTIgQEAKIAkgKiB0aGUgZmllbGRzIHRvIGNoZWNrIHR5cGUgYW5kIHRhZyBpbmZvcm1hdGlvbiwKIAkgKiBhbmQgdG8gZXh0cmFjdCBpbmZvIHJlcXVpcmVkIHRvIHNpemUgZGF0YQogCSAqIHN0cnVjdHVyZXMuICBBIHNlY29uZCBwYXNzIGlzIG1hZGUgYWZ0ZXJ3YXJkcwotCSAqIHRvIHJlYWQgaW4gZXZlcnRoaW5nIG5vdCB0YWtlbiBpbiB0aGUgZmlyc3QgcGFzcy4KKwkgKiB0byByZWFkIGluIGV2ZXJ5dGhpbmcgbm90IHRha2VuIGluIHRoZSBmaXJzdCBwYXNzLgogCSAqIEJ1dCB3ZSBtdXN0IHByb2Nlc3MgdGhlIENvbXByZXNzaW9uIHRhZyBmaXJzdAogCSAqIGluIG9yZGVyIHRvIG1lcmdlIGluIGNvZGVjLXByaXZhdGUgdGFnIGRlZmluaXRpb25zIChvdGhlcndpc2UKIAkgKiB3ZSBtYXkgZ2V0IGNvbXBsYWludHMgYWJvdXQgdW5rbm93biB0YWdzKS4gIEhvd2V2ZXIsIHRoZQogCSAqIENvbXByZXNzaW9uIHRhZyBtYXkgYmUgZGVwZW5kZW50IG9uIHRoZSBTYW1wbGVzUGVyUGl4ZWwKLQkgKiB0YWcgdmFsdWUgYmVjYXVzZSBvbGRlciBUSUZGIHNwZWNzIHBlcm1pdGVkIENvbXByZXNzaW9uCisJICogdGFnIHZhbHVlIGJlY2F1c2Ugb2xkZXIgVElGRiBzcGVjcyBwZXJtaXR0ZWQgQ29tcHJlc3Npb24KIAkgKiB0byBiZSB3cml0dGVuIGFzIGEgU2FtcGxlc1BlclBpeGVsLWNvdW50IHRhZyBlbnRyeS4KIAkgKiBUaHVzIGlmIHdlIGRvbid0IGZpcnN0IGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3QgU2FtcGxlc1BlclBpeGVsCiAJICogdGFnIHZhbHVlIHRoZW4gd2UgbWF5IGVuZCB1cCBpZ25vcmluZyB0aGUgQ29tcHJlc3Npb24gdGFnCkBAIC0zNjIyLDEwICszNjM5LDE4IEBACiAJCSAgICBpc1RpbGVkKHRpZikgPyAidGlsZXMiIDogInN0cmlwcyIpOwogCQlnb3RvIGJhZDsKIAl9CisJaWYgKHRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzID4gSU5UX01BWCkgeworCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorCQkgICAgIkNhbm5vdCBoYW5kbGUgJXUgbnVtYmVyIG9mICVzIiwKKwkJICAgIHRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzLAorCQkgICAgaXNUaWxlZCh0aWYpID8gInRpbGVzIiA6ICJzdHJpcHMiKTsKKwkJZ290byBiYWQ7CisJfQogCXRpZi0+dGlmX2Rpci50ZF9zdHJpcHNwZXJpbWFnZSA9IHRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzOwogCWlmICh0aWYtPnRpZl9kaXIudGRfcGxhbmFyY29uZmlnID09IFBMQU5BUkNPTkZJR19TRVBBUkFURSkKIAkJdGlmLT50aWZfZGlyLnRkX3N0cmlwc3BlcmltYWdlIC89IHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWw7CiAJaWYgKCFUSUZGRmllbGRTZXQodGlmLCBGSUVMRF9TVFJJUE9GRlNFVFMpKSB7CisjaWZkZWYgT0pQRUdfU1VQUE9SVAogCQlpZiAoKHRpZi0+dGlmX2Rpci50ZF9jb21wcmVzc2lvbj09Q09NUFJFU1NJT05fT0pQRUcpICYmCiAJCSAgICAoaXNUaWxlZCh0aWYpPT0wKSAmJgogCQkgICAgKHRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzPT0xKSkgewpAQCAtMzYzOCw3ICszNjYzLDkgQEAKIAkJCSAqIEpwZWdJbnRlcmNoYW5nZUZvcm1hdCBzdHJlYW0uCiAJCQkgKi8KIAkJCVRJRkZTZXRGaWVsZEJpdCh0aWYsIEZJRUxEX1NUUklQT0ZGU0VUUyk7Ci0JCX0gZWxzZSB7CisJCX0gZWxzZQorI2VuZGlmCisgICAgICAgIHsKIAkJCU1pc3NpbmdSZXF1aXJlZCh0aWYsCiAJCQkJaXNUaWxlZCh0aWYpID8gIlRpbGVPZmZzZXRzIiA6ICJTdHJpcE9mZnNldHMiKTsKIAkJCWdvdG8gYmFkOwpAQCAtMzY2Myw3ICszNjkwLDcgQEAKIAkJCQkgKiBEYXRhVHlwZSBhbmQgU2FtcGxlRm9ybWF0IHRhZ3MgYXJlIHN1cHBvc2VkIHRvIGJlCiAJCQkJICogd3JpdHRlbiBhcyBvbmUgdmFsdWUvc2FtcGxlLCBidXQgc29tZSB2ZW5kb3JzCiAJCQkJICogaW5jb3JyZWN0bHkgd3JpdGUgb25lIHZhbHVlIG9ubHkgLS0gc28gd2UgYWNjZXB0Ci0JCQkJICogdGhhdCBhcyB3ZWxsICh5ZWNoKS4gT3RoZXIgdmVuZG9ycyB3cml0ZSBjb3JyZWN0CisJCQkJICogdGhhdCBhcyB3ZWxsICh5dWNrKS4gT3RoZXIgdmVuZG9ycyB3cml0ZSBjb3JyZWN0CiAJCQkJICogdmFsdWUgZm9yIE51bWJlck9mU2FtcGxlcywgYnV0IGluY29ycmVjdCBvbmUgZm9yCiAJCQkJICogQml0c1BlclNhbXBsZSBhbmQgZnJpZW5kcywgYW5kIHdlIHdpbGwgcmVhZCB0aGlzCiAJCQkJICogdG9vLgpAQCAtMzY5MCw3ICszNzE3LDcgQEAKIAkJCWNhc2UgVElGRlRBR19TTUFYU0FNUExFVkFMVUU6CiAJCQkJewogCi0JCQkJCWRvdWJsZSAqZGF0YTsKKwkJCQkJZG91YmxlICpkYXRhID0gTlVMTDsKIAkJCQkJZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVycjsKIAkJCQkJdWludDMyIHNhdmVkX2ZsYWdzOwogCQkJCQlpbnQgbTsKQEAgLTM3MTksNiArMzc0NiwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVElGRm1lbWNweSggJih0aWYtPnRpZl9kaXIudGRfc3RyaXBvZmZzZXRfZW50cnkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHAsIHNpemVvZihUSUZGRGlyRW50cnkpICk7CiAjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0aWYtPnRpZl9kaXIudGRfc3RyaXBvZmZzZXQgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpZi0+dGlmX2Rpci50ZF9zdHJpcG9mZnNldCBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFscmVhZHkgYWxsb2NhdGVkLiBMaWtlbHkgZHVwbGljYXRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0cmlwT2Zmc2V0cy9UaWxlT2Zmc2V0cyB0YWciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAJCQkJaWYgKCFUSUZGRmV0Y2hTdHJpcFRoaW5nKHRpZixkcCx0aWYtPnRpZl9kaXIudGRfbnN0cmlwcywmdGlmLT50aWZfZGlyLnRkX3N0cmlwb2Zmc2V0KSkgIAogCQkJCQlnb3RvIGJhZDsKICNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCkBAIC0zNzI5LDcgKzM3NjQsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RJRkZtZW1jcHkoICYodGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50X2VudHJ5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwLCBzaXplb2YoVElGRkRpckVudHJ5KSApOwogI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCWlmICghVElGRkZldGNoU3RyaXBUaGluZyh0aWYsZHAsdGlmLT50aWZfZGlyLnRkX25zdHJpcHMsJnRpZi0+dGlmX2Rpci50ZF9zdHJpcGJ5dGVjb3VudCkpICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRpZi0+dGlmX2Rpci50ZF9zdHJpcGJ5dGVjb3VudCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50IGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxyZWFkeSBhbGxvY2F0ZWQuIExpa2VseSBkdXBsaWNhdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RyaXBCeXRlQ291bnRzL1RpbGVCeXRlQ291bnRzIHRhZyIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFUSUZGRmV0Y2hTdHJpcFRoaW5nKHRpZixkcCx0aWYtPnRpZl9kaXIudGRfbnN0cmlwcywmdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50KSkgIAogCQkJCQlnb3RvIGJhZDsKICNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAJCQkJYnJlYWs7CkBAIC0zNzQxLDcgKzM3ODQsNyBAQAogCQkJCQl1aW50MzIgY291bnRyZXF1aXJlZDsKIAkJCQkJdWludDMyIGluY3JlbWVudHBlcnNhbXBsZTsKIAkJCQkJdWludDE2KiB2YWx1ZT1OVUxMOwotICAgICAgICAgICAgICAgICAgICAvKiBJdCB3b3VsZCBiZSBkYW5nZXJvdXMgdG8gaW5zdGFuY2lhdGUgdGhvc2UgdGFnIHZhbHVlcyAqLworICAgICAgICAgICAgICAgICAgICAvKiBJdCB3b3VsZCBiZSBkYW5nZXJvdXMgdG8gaW5zdGFudGlhdGUgdGhvc2UgdGFnIHZhbHVlcyAqLwogICAgICAgICAgICAgICAgICAgICAvKiBzaW5jZSBpZiB0ZF9iaXRzcGVyc2FtcGxlIGhhcyBub3QgeWV0IGJlZW4gcmVhZCAoZHVlIHRvICovCiAgICAgICAgICAgICAgICAgICAgIC8qIHVub3JkZXJlZCB0YWdzKSwgaXQgY291bGQgYmUgcmVhZCBhZnRlcndhcmRzIHdpdGggYSAqLwogICAgICAgICAgICAgICAgICAgICAvKiB2YWx1ZXMgZ3JlYXRlciB0aGFuIHRoZSBkZWZhdWx0IG9uZSAoMSksIHdoaWNoIG1heSBjYXVzZSAqLwpAQCAtMzc1OSwxMyArMzgwMiwxNCBAQAogCQkJCQkvKiB1c2VkIGFzIGEgZGVuaWFsIG9mIHNlcnZpY2UgdmVjdG9yICovCiAJCQkJCWlmICh0aWYtPnRpZl9kaXIudGRfYml0c3BlcnNhbXBsZSA+IDI0KQogCQkJCQl7CisJCQkJCSAgICBmaXAgPSBUSUZGRmllbGRXaXRoVGFnKHRpZixkcC0+dGRpcl90YWcpOwogCQkJCQkgICAgVElGRldhcm5pbmdFeHQodGlmLT50aWZfY2xpZW50ZGF0YSxtb2R1bGUsCiAJCQkJCQkiSWdub3JpbmcgJXMgYmVjYXVzZSBCaXRzUGVyU2FtcGxlPSVkPjI0IiwKIAkJCQkJCWZpcCA/IGZpcC0+ZmllbGRfbmFtZSA6ICJ1bmtub3duIHRhZ25hbWUiLAogCQkJCQkJdGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGUpOwogCQkJCQkgICAgY29udGludWU7CiAJCQkJCX0KLQkJCQkJY291bnRwZXJzYW1wbGU9KDFMPDx0aWYtPnRpZl9kaXIudGRfYml0c3BlcnNhbXBsZSk7CisJCQkJCWNvdW50cGVyc2FtcGxlPSgxVTw8dGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGUpOwogCQkJCQlpZiAoKGRwLT50ZGlyX3RhZz09VElGRlRBR19UUkFOU0ZFUkZVTkNUSU9OKSYmKGRwLT50ZGlyX2NvdW50PT0odWludDY0KWNvdW50cGVyc2FtcGxlKSkKIAkJCQkJewogCQkJCQkJY291bnRyZXF1aXJlZD1jb3VudHBlcnNhbXBsZTsKQEAgLTQxNTMsNyArNDE5Nyw3IEBACiB9CiAKIC8qCi0gKiBSZWFkIGN1c3RvbSBkaXJlY3RvcnkgZnJvbSB0aGUgYXJiaXRhcnJ5IG9mZnNldC4KKyAqIFJlYWQgY3VzdG9tIGRpcmVjdG9yeSBmcm9tIHRoZSBhcmJpdHJhcnkgb2Zmc2V0LgogICogVGhlIGNvZGUgaXMgdmVyeSBzaW1pbGFyIHRvIFRJRkZSZWFkRGlyZWN0b3J5KCkuCiAgKi8KIGludApAQCAtNDI4MCw4ICs0MzI0LDkgQEAKIAlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CiAJdWludDMyIHN0cmlwOwogCi0gICAgaWYoICFfVElGRkZpbGxTdHJpbGVzKCB0aWYgKSApCi0gICAgICAgIHJldHVybiAtMTsKKyAgICAvKiBEbyBub3QgdHJ5IHRvIGxvYWQgc3RyaXBieXRlY291bnQgYXMgd2Ugd2lsbCBjb21wdXRlIGl0ICovCisgICAgICAgIGlmKCAhX1RJRkZGaWxsU3RyaWxlc0ludGVybmFsKCB0aWYsIDAgKSApCisgICAgICAgICAgICByZXR1cm4gLTE7CiAKIAlpZiAodGQtPnRkX3N0cmlwYnl0ZWNvdW50KQogCQlfVElGRmZyZWUodGQtPnRkX3N0cmlwYnl0ZWNvdW50KTsKQEAgLTQzMDMsNyArNDM0OCw3IEBACiAJCS8qIGNhbGN1bGF0ZSBhbW91bnQgb2Ygc3BhY2UgdXNlZCBieSBpbmRpcmVjdCB2YWx1ZXMgKi8KIAkJZm9yIChkcCA9IGRpciwgbiA9IGRpcmNvdW50OyBuID4gMDsgbi0tLCBkcCsrKQogCQl7Ci0JCQl1aW50MzIgdHlwZXdpZHRoID0gVElGRkRhdGFXaWR0aCgoVElGRkRhdGFUeXBlKSBkcC0+dGRpcl90eXBlKTsKKwkJCXVpbnQzMiB0eXBld2lkdGg7CiAJCQl1aW50NjQgZGF0YXNpemU7CiAJCQl0eXBld2lkdGggPSBUSUZGRGF0YVdpZHRoKChUSUZGRGF0YVR5cGUpIGRwLT50ZGlyX3R5cGUpOwogCQkJaWYgKHR5cGV3aWR0aCA9PSAwKSB7CkBAIC00MzkzLDcgKzQ0MzgsNyBAQAogCiAJdGlmLT50aWZfZGlybnVtYmVyKys7CiAKLQlpZiAodGlmLT50aWZfZGlybnVtYmVyID4gdGlmLT50aWZfZGlybGlzdHNpemUpIHsKKwlpZiAodGlmLT50aWZfZGlybGlzdCA9PSBOVUxMIHx8IHRpZi0+dGlmX2Rpcm51bWJlciA+IHRpZi0+dGlmX2Rpcmxpc3RzaXplKSB7CiAJCXVpbnQ2NCogbmV3X2Rpcmxpc3Q7CiAKIAkJLyoKQEAgLTQ0NTQsNyArNDQ5OSw3IEBACiAJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkZldGNoRGlyZWN0b3J5IjsKIAogCXZvaWQqIG9yaWdkaXI7Ci0JdWludDE2IGRpcmNvdW50MTYgPSAwOworCXVpbnQxNiBkaXJjb3VudDE2OwogCXVpbnQzMiBkaXJzaXplOwogCVRJRkZEaXJFbnRyeSogZGlyOwogCXVpbnQ4KiBtYTsKQEAgLTQ1ODMsNyArNDYyOCw2IEBACiAJCX0KIAkJZWxzZQogCQl7Ci0JCQl0bXNpemVfdCBtOwogCQkJdWludDY0IGRpcmNvdW50NjQ7CiAJCQltPW9mZitzaXplb2YodWludDY0KTsKIAkJCWlmICgobTxvZmYpfHwobTwodG1zaXplX3Qpc2l6ZW9mKHVpbnQ2NCkpfHwobT50aWYtPnRpZl9zaXplKSkgewpAQCAtNDk5NCw3ICs1MDM4LDcgQEAKIAkJCQkJaWYgKGVycj09VElGRlJlYWREaXJFbnRyeUVyck9rKQogCQkJCQl7CiAJCQkJCQlpbnQgbTsKLQkJCQkJCWlmKCBkcC0+dGRpcl9jb3VudCA+IDAgJiYgZGF0YVtkcC0+dGRpcl9jb3VudC0xXSAhPSAnXDAnICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBkcC0+dGRpcl9jb3VudCA+IDAgJiYgZGF0YVtkcC0+dGRpcl9jb3VudC0xXSAhPSAnXDAnICkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSUZGV2FybmluZ0V4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQVNDSUkgdmFsdWUgZm9yIHRhZyBcIiVzXCIgZG9lcyBub3QgZW5kIGluIG51bGwgYnl0ZS4gRm9yY2luZyBpdCB0byBiZSBudWxsIixmaXAtPmZpZWxkX25hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbZHAtPnRkaXJfY291bnQtMV0gPSAnXDAnOwpAQCAtNTE3MSw3ICs1MjE1LDcgQEAKIAkJCQlpZiAoZXJyPT1USUZGUmVhZERpckVudHJ5RXJyT2spCiAJCQkJewogCQkJCQlpbnQgbTsKLQkJCQkJaWYoIGRwLT50ZGlyX2NvdW50ID4gMCAmJiBkYXRhW2RwLT50ZGlyX2NvdW50LTFdICE9ICdcMCcgKQorICAgICAgICAgICAgICAgICAgICBpZiggZHAtPnRkaXJfY291bnQgPiAwICYmIGRhdGFbZHAtPnRkaXJfY291bnQtMV0gIT0gJ1wwJyApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIFRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJBU0NJSSB2YWx1ZSBmb3IgdGFnIFwiJXNcIiBkb2VzIG5vdCBlbmQgaW4gbnVsbCBieXRlLiBGb3JjaW5nIGl0IHRvIGJlIG51bGwiLGZpcC0+ZmllbGRfbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2RwLT50ZGlyX2NvdW50LTFdID0gJ1wwJzsKQEAgLTUzOTMsOCArNTQzNyw2IEBACiAJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkZldGNoU3RyaXBUaGluZyI7CiAJZW51bSBUSUZGUmVhZERpckVudHJ5RXJyIGVycjsKIAl1aW50NjQqIGRhdGE7Ci0JX1RJRkZmcmVlKCpscHApOwotCSpscHAgPSAwOwogCWVycj1USUZGUmVhZERpckVudHJ5TG9uZzhBcnJheSh0aWYsZGlyLCZkYXRhKTsKIAlpZiAoZXJyIT1USUZGUmVhZERpckVudHJ5RXJyT2spCiAJewpAQCAtNTQ5OCw4ICs1NTQwLDcgQEAKIAl1aW50NjQgcm93YmxvY2tieXRlczsKIAl1aW50NjQgc3RyaXBieXRlczsKIAl1aW50MzIgc3RyaXA7Ci0JdWludDY0IG5zdHJpcHM2NDsKLQl1aW50MzIgbnN0cmlwczMyOworCXVpbnQzMiBuc3RyaXBzOwogCXVpbnQzMiByb3dzcGVyc3RyaXA7CiAJdWludDY0KiBuZXdjb3VudHM7CiAJdWludDY0KiBuZXdvZmZzZXRzOwpAQCAtNTUzMCwxOCArNTU3MSwxNyBAQAogCSAgICByZXR1cm47CiAKIAkvKgotCSAqIG5ldmVyIGluY3JlYXNlIHRoZSBudW1iZXIgb2Ygc3RyaXBzIGluIGFuIGltYWdlCisJICogbmV2ZXIgaW5jcmVhc2UgdGhlIG51bWJlciBvZiByb3dzIHBlciBzdHJpcAogCSAqLwogCWlmIChyb3dzcGVyc3RyaXAgPj0gdGQtPnRkX3Jvd3NwZXJzdHJpcCkKIAkJcmV0dXJuOwotCW5zdHJpcHM2NCA9IFRJRkZob3dtYW55XzY0KGJ5dGVjb3VudCwgc3RyaXBieXRlcyk7Ci0JaWYgKChuc3RyaXBzNjQ9PTApfHwobnN0cmlwczY0PjB4RkZGRkZGRkYpKSAvKiBzb21ldGhpbmcgaXMgd29ua3ksIGRvIG5vdGhpbmcuICovCi0JICAgIHJldHVybjsKLQluc3RyaXBzMzIgPSAodWludDMyKW5zdHJpcHM2NDsKKyAgICAgICAgbnN0cmlwcyA9IFRJRkZob3dtYW55XzMyKHRkLT50ZF9pbWFnZWxlbmd0aCwgcm93c3BlcnN0cmlwKTsKKyAgICAgICAgaWYoIG5zdHJpcHMgPT0gMCApCisgICAgICAgICAgICByZXR1cm47CiAKLQluZXdjb3VudHMgPSAodWludDY0KikgX1RJRkZDaGVja01hbGxvYyh0aWYsIG5zdHJpcHMzMiwgc2l6ZW9mICh1aW50NjQpLAorCW5ld2NvdW50cyA9ICh1aW50NjQqKSBfVElGRkNoZWNrTWFsbG9jKHRpZiwgbnN0cmlwcywgc2l6ZW9mICh1aW50NjQpLAogCQkJCSJmb3IgY2hvcHBlZCBcIlN0cmlwQnl0ZUNvdW50c1wiIGFycmF5Iik7Ci0JbmV3b2Zmc2V0cyA9ICh1aW50NjQqKSBfVElGRkNoZWNrTWFsbG9jKHRpZiwgbnN0cmlwczMyLCBzaXplb2YgKHVpbnQ2NCksCisJbmV3b2Zmc2V0cyA9ICh1aW50NjQqKSBfVElGRkNoZWNrTWFsbG9jKHRpZiwgbnN0cmlwcywgc2l6ZW9mICh1aW50NjQpLAogCQkJCSJmb3IgY2hvcHBlZCBcIlN0cmlwT2Zmc2V0c1wiIGFycmF5Iik7CiAJaWYgKG5ld2NvdW50cyA9PSBOVUxMIHx8IG5ld29mZnNldHMgPT0gTlVMTCkgewogCQkvKgpAQCAtNTU1OCwxOCArNTU5OCwxOCBAQAogCSAqIEZpbGwgdGhlIHN0cmlwIGluZm9ybWF0aW9uIGFycmF5cyB3aXRoIG5ldyBieXRlY291bnRzIGFuZCBvZmZzZXRzCiAJICogdGhhdCByZWZsZWN0IHRoZSBicm9rZW4tdXAgZm9ybWF0LgogCSAqLwotCWZvciAoc3RyaXAgPSAwOyBzdHJpcCA8IG5zdHJpcHMzMjsgc3RyaXArKykgeworCWZvciAoc3RyaXAgPSAwOyBzdHJpcCA8IG5zdHJpcHM7IHN0cmlwKyspIHsKIAkJaWYgKHN0cmlwYnl0ZXMgPiBieXRlY291bnQpCiAJCQlzdHJpcGJ5dGVzID0gYnl0ZWNvdW50OwogCQluZXdjb3VudHNbc3RyaXBdID0gc3RyaXBieXRlczsKLQkJbmV3b2Zmc2V0c1tzdHJpcF0gPSBvZmZzZXQ7CisJCW5ld29mZnNldHNbc3RyaXBdID0gc3RyaXBieXRlcyA/IG9mZnNldCA6IDA7CiAJCW9mZnNldCArPSBzdHJpcGJ5dGVzOwogCQlieXRlY291bnQgLT0gc3RyaXBieXRlczsKIAl9CiAJLyoKIAkgKiBSZXBsYWNlIG9sZCBzaW5nbGUgc3RyaXAgaW5mbyB3aXRoIG11bHRpLXN0cmlwIGluZm8uCiAJICovCi0JdGQtPnRkX3N0cmlwc3BlcmltYWdlID0gdGQtPnRkX25zdHJpcHMgPSBuc3RyaXBzMzI7CisJdGQtPnRkX3N0cmlwc3BlcmltYWdlID0gdGQtPnRkX25zdHJpcHMgPSBuc3RyaXBzOwogCVRJRkZTZXRGaWVsZCh0aWYsIFRJRkZUQUdfUk9XU1BFUlNUUklQLCByb3dzcGVyc3RyaXApOwogCiAJX1RJRkZmcmVlKHRkLT50ZF9zdHJpcGJ5dGVjb3VudCk7CkBAIC01NTgxLDYgKzU2MjEsMTEgQEAKIAogaW50IF9USUZGRmlsbFN0cmlsZXMoIFRJRkYgKnRpZiApCiB7CisgICAgcmV0dXJuIF9USUZGRmlsbFN0cmlsZXNJbnRlcm5hbCggdGlmLCAxICk7Cit9CisKK3N0YXRpYyBpbnQgX1RJRkZGaWxsU3RyaWxlc0ludGVybmFsKCBUSUZGICp0aWYsIGludCBsb2FkU3RyaXBCeXRlQ291bnQgKQorewogI2lmIGRlZmluZWQoREVGRVJfU1RSSUxFX0xPQUQpCiAgICAgICAgIHJlZ2lzdGVyIFRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKICAgICAgICAgaW50IHJldHVybl92YWx1ZSA9IDE7CkBAIC01NTk3LDcgKzU2NDIsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybl92YWx1ZSA9IDA7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIVRJRkZGZXRjaFN0cmlwVGhpbmcodGlmLCYodGQtPnRkX3N0cmlwYnl0ZWNvdW50X2VudHJ5KSwKKyAgICAgICAgaWYgKGxvYWRTdHJpcEJ5dGVDb3VudCAmJgorICAgICAgICAgICAgIVRJRkZGZXRjaFN0cmlwVGhpbmcodGlmLCYodGQtPnRkX3N0cmlwYnl0ZWNvdW50X2VudHJ5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkLT50ZF9uc3RyaXBzLCZ0ZC0+dGRfc3RyaXBieXRlY291bnQpKQogICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0dXJuX3ZhbHVlID0gMDsKQEAgLTU2MjIsNiArNTY2OCw3IEBACiAgICAgICAgIHJldHVybiByZXR1cm5fdmFsdWU7CiAjZWxzZSAvKiAhZGVmaW5lZChERUZFUl9TVFJJTEVfTE9BRCkgKi8KICAgICAgICAgKHZvaWQpIHRpZjsKKyAgICAgICAgKHZvaWQpIGxvYWRTdHJpcEJ5dGVDb3VudDsKICAgICAgICAgcmV0dXJuIDE7CiAjZW5kaWYgCiB9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kaXJ3cml0ZS5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZGlyd3JpdGUuYwppbmRleCBhMGZkOGRjLi5mNzMzOTY4IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kaXJ3cml0ZS5jCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2RpcndyaXRlLmMKQEAgLTEsNCArMSw0IEBACi0vKiAkSWQ6IHRpZl9kaXJ3cml0ZS5jLHYgMS43OCAyMDE1LTA1LTMxIDAwOjM4OjQ2IGJmcmllc2VuIEV4cCAkICovCisvKiAkSWQ6IHRpZl9kaXJ3cml0ZS5jLHYgMS44NSAyMDE3LTAxLTExIDE2OjA5OjAyIGVyb3VhdWx0IEV4cCAkICovCiAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgpAQCAtMzAsNiArMzAsNyBAQAogICogRGlyZWN0b3J5IFdyaXRlIFN1cHBvcnQgUm91dGluZXMuCiAgKi8KICNpbmNsdWRlICJ0aWZmaW9wLmgiCisjaW5jbHVkZSA8ZmxvYXQuaD4KIAogI2lmZGVmIEhBVkVfSUVFRUZQCiAjZGVmaW5lIFRJRkZDdnROYXRpdmVUb0lFRUVGbG9hdCh0aWYsIG4sIGZwKQpAQCAtNTQyLDggKzU0MywyMCBAQAogCQkJewogCQkJCWlmICghaXNUaWxlZCh0aWYpKQogCQkJCXsKLQkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdMb25nTG9uZzhBcnJheSh0aWYsJm5kaXIsZGlyLFRJRkZUQUdfU1RSSVBPRkZTRVRTLHRpZi0+dGlmX2Rpci50ZF9uc3RyaXBzLHRpZi0+dGlmX2Rpci50ZF9zdHJpcG9mZnNldCkpCi0JCQkJCQlnb3RvIGJhZDsKKyAgICAgICAgICAgICAgICAgICAgLyogdGRfc3RyaXBvZmZzZXQgbWlnaHQgYmUgTlVMTCBpbiBhbiBvZGQgT0pQRUcgY2FzZS4gU2VlCisgICAgICAgICAgICAgICAgICAgICAqICB0aWZfZGlycmVhZC5jIGFyb3VuZCBsaW5lIDM2MzQuCisgICAgICAgICAgICAgICAgICAgICAqIFhYWDogT0pQRUcgaGFjay4KKyAgICAgICAgICAgICAgICAgICAgICogSWYgYSkgY29tcHJlc3Npb24gaXMgT0pQRUcsIGIpIGl0J3Mgbm90IGEgdGlsZWQgVElGRiwKKyAgICAgICAgICAgICAgICAgICAgICogYW5kIGMpIHRoZSBudW1iZXIgb2Ygc3RyaXBzIGlzIDEsCisgICAgICAgICAgICAgICAgICAgICAqIHRoZW4gd2UgdG9sZXJhdGUgdGhlIGFic2VuY2Ugb2Ygc3RyaXBvZmZzZXRzIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICogYmVjYXVzZSwgcHJlc3VtYWJseSwgYWxsIHJlcXVpcmVkIGRhdGEgaXMgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAqIEpwZWdJbnRlcmNoYW5nZUZvcm1hdCBzdHJlYW0uCisgICAgICAgICAgICAgICAgICAgICAqIFdlIGNhbiBnZXQgaGVyZSB3aGVuIHVzaW5nIHRpZmZzZXQgb24gc3VjaCBhIGZpbGUuCisgICAgICAgICAgICAgICAgICAgICAqIFNlZSBodHRwOi8vYnVnemlsbGEubWFwdG9vbHMub3JnL3Nob3dfYnVnLmNnaT9pZD0yNTAwCisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGlmICh0aWYtPnRpZl9kaXIudGRfc3RyaXBvZmZzZXQgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIVRJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmdMb25nOEFycmF5KHRpZiwmbmRpcixkaXIsVElGRlRBR19TVFJJUE9GRlNFVFMsdGlmLT50aWZfZGlyLnRkX25zdHJpcHMsdGlmLT50aWZfZGlyLnRkX3N0cmlwb2Zmc2V0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkOwogCQkJCX0KIAkJCQllbHNlCiAJCQkJewpAQCAtNjQ1LDcgKzY1OCw3IEBACiAJCQkJCQkJCQlhc3NlcnQoby0+ZmllbGRfcGFzc2NvdW50PT0wKTsKIAkJCQkJCQkJCVRJRkZHZXRGaWVsZCh0aWYsby0+ZmllbGRfdGFnLCZwYik7CiAJCQkJCQkJCQlwYT0odWludDMyKShzdHJsZW4ocGIpKTsKLQkJCQkJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnQXNjaWkodGlmLCZuZGlyLGRpcixvLT5maWVsZF90YWcscGEscGIpKQorCQkJCQkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdBc2NpaSh0aWYsJm5kaXIsZGlyLCh1aW50MTYpby0+ZmllbGRfdGFnLHBhLHBiKSkKIAkJCQkJCQkJCQlnb3RvIGJhZDsKIAkJCQkJCQkJfQogCQkJCQkJCQlicmVhazsKQEAgLTY1Niw3ICs2NjksNyBAQAogCQkJCQkJCQkJYXNzZXJ0KG8tPmZpZWxkX3JlYWRjb3VudD09MSk7CiAJCQkJCQkJCQlhc3NlcnQoby0+ZmllbGRfcGFzc2NvdW50PT0wKTsKIAkJCQkJCQkJCVRJRkZHZXRGaWVsZCh0aWYsby0+ZmllbGRfdGFnLCZwKTsKLQkJCQkJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnQodGlmLCZuZGlyLGRpcixvLT5maWVsZF90YWcscCkpCisJCQkJCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0KHRpZiwmbmRpcixkaXIsKHVpbnQxNilvLT5maWVsZF90YWcscCkpCiAJCQkJCQkJCQkJZ290byBiYWQ7CiAJCQkJCQkJCX0KIAkJCQkJCQkJYnJlYWs7CkBAIC02NjcsNyArNjgwLDcgQEAKIAkJCQkJCQkJCWFzc2VydChvLT5maWVsZF9yZWFkY291bnQ9PTEpOwogCQkJCQkJCQkJYXNzZXJ0KG8tPmZpZWxkX3Bhc3Njb3VudD09MCk7CiAJCQkJCQkJCQlUSUZGR2V0RmllbGQodGlmLG8tPmZpZWxkX3RhZywmcCk7Ci0JCQkJCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmcodGlmLCZuZGlyLGRpcixvLT5maWVsZF90YWcscCkpCisJCQkJCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmcodGlmLCZuZGlyLGRpciwodWludDE2KW8tPmZpZWxkX3RhZyxwKSkKIAkJCQkJCQkJCQlnb3RvIGJhZDsKIAkJCQkJCQkJfQogCQkJCQkJCQlicmVhazsKQEAgLTY3OSw3ICs2OTIsNyBAQAogCQkJCQkJCQkJYXNzZXJ0KG8tPmZpZWxkX3JlYWRjb3VudD09VElGRl9WQVJJQUJMRTIpOwogCQkJCQkJCQkJYXNzZXJ0KG8tPmZpZWxkX3Bhc3Njb3VudD09MSk7CiAJCQkJCQkJCQlUSUZGR2V0RmllbGQodGlmLG8tPmZpZWxkX3RhZywmcGEsJnBiKTsKLQkJCQkJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnVW5kZWZpbmVkQXJyYXkodGlmLCZuZGlyLGRpcixvLT5maWVsZF90YWcscGEscGIpKQorCQkJCQkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdVbmRlZmluZWRBcnJheSh0aWYsJm5kaXIsZGlyLCh1aW50MTYpby0+ZmllbGRfdGFnLHBhLHBiKSkKIAkJCQkJCQkJCQlnb3RvIGJhZDsKIAkJCQkJCQkJfQogCQkJCQkJCQlicmVhazsKQEAgLTY5Myw3MCArNzA2LDcyIEBACiAJCX0KIAkJZm9yIChtPTA7IG08KHVpbnQzMikodGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlQ291bnQpOyBtKyspCiAJCXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNiB0YWcgPSAodWludDE2KXRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uaW5mby0+ZmllbGRfdGFnOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGNvdW50ID0gdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5jb3VudDsKIAkJCXN3aXRjaCAodGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5pbmZvLT5maWVsZF90eXBlKQogCQkJewogCQkJCWNhc2UgVElGRl9BU0NJSToKLQkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdBc2NpaSh0aWYsJm5kaXIsZGlyLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uaW5mby0+ZmllbGRfdGFnLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnQXNjaWkodGlmLCZuZGlyLGRpcix0YWcsY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCiAJCQkJCQlnb3RvIGJhZDsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBUSUZGX1VOREVGSU5FRDoKLQkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdVbmRlZmluZWRBcnJheSh0aWYsJm5kaXIsZGlyLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uaW5mby0+ZmllbGRfdGFnLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnVW5kZWZpbmVkQXJyYXkodGlmLCZuZGlyLGRpcix0YWcsY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCiAJCQkJCQlnb3RvIGJhZDsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBUSUZGX0JZVEU6Ci0JCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnQnl0ZUFycmF5KHRpZiwmbmRpcixkaXIsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5pbmZvLT5maWVsZF90YWcsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5jb3VudCx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLnZhbHVlKSkKKwkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdCeXRlQXJyYXkodGlmLCZuZGlyLGRpcix0YWcsY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCiAJCQkJCQlnb3RvIGJhZDsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBUSUZGX1NCWVRFOgotCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1NieXRlQXJyYXkodGlmLCZuZGlyLGRpcix0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmluZm8tPmZpZWxkX3RhZyx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmNvdW50LHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0udmFsdWUpKQorCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1NieXRlQXJyYXkodGlmLCZuZGlyLGRpcix0YWcsY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCiAJCQkJCQlnb3RvIGJhZDsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBUSUZGX1NIT1JUOgotCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0QXJyYXkodGlmLCZuZGlyLGRpcix0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmluZm8tPmZpZWxkX3RhZyx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmNvdW50LHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0udmFsdWUpKQorCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nob3J0QXJyYXkodGlmLCZuZGlyLGRpcix0YWcsY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCiAJCQkJCQlnb3RvIGJhZDsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBUSUZGX1NTSE9SVDoKLQkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTc2hvcnRBcnJheSh0aWYsJm5kaXIsZGlyLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uaW5mby0+ZmllbGRfdGFnLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU3Nob3J0QXJyYXkodGlmLCZuZGlyLGRpcix0YWcsY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCiAJCQkJCQlnb3RvIGJhZDsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBUSUZGX0xPTkc6Ci0JCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnTG9uZ0FycmF5KHRpZiwmbmRpcixkaXIsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5pbmZvLT5maWVsZF90YWcsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5jb3VudCx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLnZhbHVlKSkKKwkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdMb25nQXJyYXkodGlmLCZuZGlyLGRpcix0YWcsY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCiAJCQkJCQlnb3RvIGJhZDsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBUSUZGX1NMT05HOgotCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nsb25nQXJyYXkodGlmLCZuZGlyLGRpcix0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmluZm8tPmZpZWxkX3RhZyx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmNvdW50LHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0udmFsdWUpKQorCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1Nsb25nQXJyYXkodGlmLCZuZGlyLGRpcix0YWcsY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCiAJCQkJCQlnb3RvIGJhZDsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBUSUZGX0xPTkc4OgotCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmc4QXJyYXkodGlmLCZuZGlyLGRpcix0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmluZm8tPmZpZWxkX3RhZyx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmNvdW50LHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0udmFsdWUpKQorCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ0xvbmc4QXJyYXkodGlmLCZuZGlyLGRpcix0YWcsY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCiAJCQkJCQlnb3RvIGJhZDsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBUSUZGX1NMT05HODoKLQkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTbG9uZzhBcnJheSh0aWYsJm5kaXIsZGlyLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uaW5mby0+ZmllbGRfdGFnLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU2xvbmc4QXJyYXkodGlmLCZuZGlyLGRpcix0YWcsY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCiAJCQkJCQlnb3RvIGJhZDsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBUSUZGX1JBVElPTkFMOgotCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1JhdGlvbmFsQXJyYXkodGlmLCZuZGlyLGRpcix0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmluZm8tPmZpZWxkX3RhZyx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmNvdW50LHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0udmFsdWUpKQorCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ1JhdGlvbmFsQXJyYXkodGlmLCZuZGlyLGRpcix0YWcsY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCiAJCQkJCQlnb3RvIGJhZDsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBUSUZGX1NSQVRJT05BTDoKLQkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdTcmF0aW9uYWxBcnJheSh0aWYsJm5kaXIsZGlyLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uaW5mby0+ZmllbGRfdGFnLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnU3JhdGlvbmFsQXJyYXkodGlmLCZuZGlyLGRpcix0YWcsY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCiAJCQkJCQlnb3RvIGJhZDsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBUSUZGX0ZMT0FUOgotCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ0Zsb2F0QXJyYXkodGlmLCZuZGlyLGRpcix0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmluZm8tPmZpZWxkX3RhZyx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLmNvdW50LHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0udmFsdWUpKQorCQkJCQlpZiAoIVRJRkZXcml0ZURpcmVjdG9yeVRhZ0Zsb2F0QXJyYXkodGlmLCZuZGlyLGRpcix0YWcsY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCiAJCQkJCQlnb3RvIGJhZDsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBUSUZGX0RPVUJMRToKLQkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdEb3VibGVBcnJheSh0aWYsJm5kaXIsZGlyLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uaW5mby0+ZmllbGRfdGFnLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnRG91YmxlQXJyYXkodGlmLCZuZGlyLGRpcix0YWcsY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCiAJCQkJCQlnb3RvIGJhZDsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBUSUZGX0lGRDoKLQkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdJZmRBcnJheSh0aWYsJm5kaXIsZGlyLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uaW5mby0+ZmllbGRfdGFnLHRpZi0+dGlmX2Rpci50ZF9jdXN0b21WYWx1ZXNbbV0uY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCisJCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnSWZkQXJyYXkodGlmLCZuZGlyLGRpcix0YWcsY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCiAJCQkJCQlnb3RvIGJhZDsKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBUSUZGX0lGRDg6Ci0JCQkJCWlmICghVElGRldyaXRlRGlyZWN0b3J5VGFnSWZkSWZkOEFycmF5KHRpZiwmbmRpcixkaXIsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5pbmZvLT5maWVsZF90YWcsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS5jb3VudCx0aWYtPnRpZl9kaXIudGRfY3VzdG9tVmFsdWVzW21dLnZhbHVlKSkKKwkJCQkJaWYgKCFUSUZGV3JpdGVEaXJlY3RvcnlUYWdJZmRJZmQ4QXJyYXkodGlmLCZuZGlyLGRpcix0YWcsY291bnQsdGlmLT50aWZfZGlyLnRkX2N1c3RvbVZhbHVlc1ttXS52YWx1ZSkpCiAJCQkJCQlnb3RvIGJhZDsKIAkJCQkJYnJlYWs7CiAJCQkJZGVmYXVsdDoKQEAgLTc3OCw3ICs3OTMsNyBAQAogCQkJCWdvdG8gYmFkOwogCQl9CiAJCWVsc2UKLQkJCXRpZi0+dGlmX2Rpcm9mZj0oVElGRlNlZWtGaWxlKHRpZiwwLFNFRUtfRU5EKSsxKSYofjEpOworCQkJdGlmLT50aWZfZGlyb2ZmPShUSUZGU2Vla0ZpbGUodGlmLDAsU0VFS19FTkQpKzEpJih+KCh0b2ZmX3QpMSkpOwogCQlpZiAocGRpcm9mZiE9TlVMTCkKIAkJCSpwZGlyb2ZmPXRpZi0+dGlmX2Rpcm9mZjsKIAkJaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKQEAgLTgyOCw3ICs4NDMsNyBAQAogCQl1aW50MzIgblRtcDsKIAkJVElGRkRpckVudHJ5KiBvOwogCQluPWRpcm1lbTsKLQkJKih1aW50MTYqKW49bmRpcjsKKwkJKih1aW50MTYqKW49KHVpbnQxNiluZGlyOwogCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9TV0FCKQogCQkJVElGRlN3YWJTaG9ydCgodWludDE2KiluKTsKIAkJbis9MjsKQEAgLTkyNSw2ICs5NDAsNjkgQEAKIAlyZXR1cm4oMCk7CiB9CiAKK3N0YXRpYyBmbG9hdCBUSUZGQ2xhbXBEb3VibGVUb0Zsb2F0KCBkb3VibGUgdmFsICkKK3sKKyAgICBpZiggdmFsID4gRkxUX01BWCApCisgICAgICAgIHJldHVybiBGTFRfTUFYOworICAgIGlmKCB2YWwgPCAtRkxUX01BWCApCisgICAgICAgIHJldHVybiAtRkxUX01BWDsKKyAgICByZXR1cm4gKGZsb2F0KXZhbDsKK30KKworc3RhdGljIGludDggVElGRkNsYW1wRG91YmxlVG9JbnQ4KCBkb3VibGUgdmFsICkKK3sKKyAgICBpZiggdmFsID4gMTI3ICkKKyAgICAgICAgcmV0dXJuIDEyNzsKKyAgICBpZiggdmFsIDwgLTEyOCB8fCB2YWwgIT0gdmFsICkKKyAgICAgICAgcmV0dXJuIC0xMjg7CisgICAgcmV0dXJuIChpbnQ4KXZhbDsKK30KKworc3RhdGljIGludDE2IFRJRkZDbGFtcERvdWJsZVRvSW50MTYoIGRvdWJsZSB2YWwgKQoreworICAgIGlmKCB2YWwgPiAzMjc2NyApCisgICAgICAgIHJldHVybiAzMjc2NzsKKyAgICBpZiggdmFsIDwgLTMyNzY4IHx8IHZhbCAhPSB2YWwgKQorICAgICAgICByZXR1cm4gLTMyNzY4OworICAgIHJldHVybiAoaW50MTYpdmFsOworfQorCitzdGF0aWMgaW50MzIgVElGRkNsYW1wRG91YmxlVG9JbnQzMiggZG91YmxlIHZhbCApCit7CisgICAgaWYoIHZhbCA+IDB4N0ZGRkZGRkYgKQorICAgICAgICByZXR1cm4gMHg3RkZGRkZGRjsKKyAgICBpZiggdmFsIDwgLTB4N0ZGRkZGRkYtMSB8fCB2YWwgIT0gdmFsICkKKyAgICAgICAgcmV0dXJuIC0weDdGRkZGRkZGLTE7CisgICAgcmV0dXJuIChpbnQzMil2YWw7Cit9CisKK3N0YXRpYyB1aW50OCBUSUZGQ2xhbXBEb3VibGVUb1VJbnQ4KCBkb3VibGUgdmFsICkKK3sKKyAgICBpZiggdmFsIDwgMCApCisgICAgICAgIHJldHVybiAwOworICAgIGlmKCB2YWwgPiAyNTUgfHwgdmFsICE9IHZhbCApCisgICAgICAgIHJldHVybiAyNTU7CisgICAgcmV0dXJuICh1aW50OCl2YWw7Cit9CisKK3N0YXRpYyB1aW50MTYgVElGRkNsYW1wRG91YmxlVG9VSW50MTYoIGRvdWJsZSB2YWwgKQoreworICAgIGlmKCB2YWwgPCAwICkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYoIHZhbCA+IDY1NTM1IHx8IHZhbCAhPSB2YWwgKQorICAgICAgICByZXR1cm4gNjU1MzU7CisgICAgcmV0dXJuICh1aW50MTYpdmFsOworfQorCitzdGF0aWMgdWludDMyIFRJRkZDbGFtcERvdWJsZVRvVUludDMyKCBkb3VibGUgdmFsICkKK3sKKyAgICBpZiggdmFsIDwgMCApCisgICAgICAgIHJldHVybiAwOworICAgIGlmKCB2YWwgPiAweEZGRkZGRkZGVSB8fCB2YWwgIT0gdmFsICkKKyAgICAgICAgcmV0dXJuIDB4RkZGRkZGRkZVOworICAgIHJldHVybiAodWludDMyKXZhbDsKK30KKwogc3RhdGljIGludAogVElGRldyaXRlRGlyZWN0b3J5VGFnU2FtcGxlZm9ybWF0QXJyYXkoVElGRiogdGlmLCB1aW50MzIqIG5kaXIsIFRJRkZEaXJFbnRyeSogZGlyLCB1aW50MTYgdGFnLCB1aW50MzIgY291bnQsIGRvdWJsZSogdmFsdWUpCiB7CkBAIC05NDUsNyArMTAyMyw3IEBACiAJCQlpZiAodGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGU8PTMyKQogCQkJewogCQkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQotCQkJCQkoKGZsb2F0Kiljb252KVtpXSA9IChmbG9hdCl2YWx1ZVtpXTsKKwkJCQkJKChmbG9hdCopY29udilbaV0gPSBUSUZGQ2xhbXBEb3VibGVUb0Zsb2F0KHZhbHVlW2ldKTsKIAkJCQlvayA9IFRJRkZXcml0ZURpcmVjdG9yeVRhZ0Zsb2F0QXJyYXkodGlmLG5kaXIsZGlyLHRhZyxjb3VudCwoZmxvYXQqKWNvbnYpOwogCQkJfQogCQkJZWxzZQpAQCAtOTU3LDE5ICsxMDM1LDE5IEBACiAJCQlpZiAodGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGU8PTgpCiAJCQl7CiAJCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCi0JCQkJCSgoaW50OCopY29udilbaV0gPSAoaW50OCl2YWx1ZVtpXTsKKwkJCQkJKChpbnQ4Kiljb252KVtpXSA9IFRJRkZDbGFtcERvdWJsZVRvSW50OCh2YWx1ZVtpXSk7CiAJCQkJb2sgPSBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTYnl0ZUFycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQsKGludDgqKWNvbnYpOwogCQkJfQogCQkJZWxzZSBpZiAodGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGU8PTE2KQogCQkJewogCQkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQotCQkJCQkoKGludDE2Kiljb252KVtpXSA9IChpbnQxNil2YWx1ZVtpXTsKKwkJCQkJKChpbnQxNiopY29udilbaV0gPSBUSUZGQ2xhbXBEb3VibGVUb0ludDE2KHZhbHVlW2ldKTsKIAkJCQlvayA9IFRJRkZXcml0ZURpcmVjdG9yeVRhZ1NzaG9ydEFycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQsKGludDE2Kiljb252KTsKIAkJCX0KIAkJCWVsc2UKIAkJCXsKIAkJCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKLQkJCQkJKChpbnQzMiopY29udilbaV0gPSAoaW50MzIpdmFsdWVbaV07CisJCQkJCSgoaW50MzIqKWNvbnYpW2ldID0gVElGRkNsYW1wRG91YmxlVG9JbnQzMih2YWx1ZVtpXSk7CiAJCQkJb2sgPSBUSUZGV3JpdGVEaXJlY3RvcnlUYWdTbG9uZ0FycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQsKGludDMyKiljb252KTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtOTc3LDE5ICsxMDU1LDE5IEBACiAJCQlpZiAodGlmLT50aWZfZGlyLnRkX2JpdHNwZXJzYW1wbGU8PTgpCiAJCQl7CiAJCQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpCi0JCQkJCSgodWludDgqKWNvbnYpW2ldID0gKHVpbnQ4KXZhbHVlW2ldOworCQkJCQkoKHVpbnQ4Kiljb252KVtpXSA9IFRJRkZDbGFtcERvdWJsZVRvVUludDgodmFsdWVbaV0pOwogCQkJCW9rID0gVElGRldyaXRlRGlyZWN0b3J5VGFnQnl0ZUFycmF5KHRpZixuZGlyLGRpcix0YWcsY291bnQsKHVpbnQ4Kiljb252KTsKIAkJCX0KIAkJCWVsc2UgaWYgKHRpZi0+dGlmX2Rpci50ZF9iaXRzcGVyc2FtcGxlPD0xNikKIAkJCXsKIAkJCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKLQkJCQkJKCh1aW50MTYqKWNvbnYpW2ldID0gKHVpbnQxNil2YWx1ZVtpXTsKKwkJCQkJKCh1aW50MTYqKWNvbnYpW2ldID0gVElGRkNsYW1wRG91YmxlVG9VSW50MTYodmFsdWVbaV0pOwogCQkJCW9rID0gVElGRldyaXRlRGlyZWN0b3J5VGFnU2hvcnRBcnJheSh0aWYsbmRpcixkaXIsdGFnLGNvdW50LCh1aW50MTYqKWNvbnYpOwogCQkJfQogCQkJZWxzZQogCQkJewogCQkJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQotCQkJCQkoKHVpbnQzMiopY29udilbaV0gPSAodWludDMyKXZhbHVlW2ldOworCQkJCQkoKHVpbnQzMiopY29udilbaV0gPSBUSUZGQ2xhbXBEb3VibGVUb1VJbnQzMih2YWx1ZVtpXSk7CiAJCQkJb2sgPSBUSUZGV3JpdGVEaXJlY3RvcnlUYWdMb25nQXJyYXkodGlmLG5kaXIsZGlyLHRhZyxjb3VudCwodWludDMyKiljb252KTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMjA4MCwxNSArMjE1OCwyNSBAQAogc3RhdGljIGludAogVElGRldyaXRlRGlyZWN0b3J5VGFnQ2hlY2tlZFJhdGlvbmFsKFRJRkYqIHRpZiwgdWludDMyKiBuZGlyLCBUSUZGRGlyRW50cnkqIGRpciwgdWludDE2IHRhZywgZG91YmxlIHZhbHVlKQogeworICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGV3JpdGVEaXJlY3RvcnlUYWdDaGVja2VkUmF0aW9uYWwiOwogCXVpbnQzMiBtWzJdOwotCWFzc2VydCh2YWx1ZT49MC4wKTsKIAlhc3NlcnQoc2l6ZW9mKHVpbnQzMik9PTQpOwotCWlmICh2YWx1ZTw9MC4wKQorICAgICAgICBpZiggdmFsdWUgPCAwICkKKyAgICAgICAgeworICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsbW9kdWxlLCJOZWdhdGl2ZSB2YWx1ZSBpcyBpbGxlZ2FsIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCB2YWx1ZSAhPSB2YWx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiTm90LWEtbnVtYmVyIHZhbHVlIGlzIGlsbGVnYWwiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisJZWxzZSBpZiAodmFsdWU9PTAuMCkKIAl7CiAJCW1bMF09MDsKIAkJbVsxXT0xOwogCX0KLQllbHNlIGlmICh2YWx1ZT09KGRvdWJsZSkodWludDMyKXZhbHVlKQorCWVsc2UgaWYgKHZhbHVlIDw9IDB4RkZGRkZGRkZVICYmIHZhbHVlPT0oZG91YmxlKSh1aW50MzIpdmFsdWUpCiAJewogCQltWzBdPSh1aW50MzIpdmFsdWU7CiAJCW1bMV09MTsKQEAgLTIxMjksMjUgKzIyMTcsMjYgQEAKIAl9CiAJZm9yIChuYT12YWx1ZSwgbmI9bSwgbmM9MDsgbmM8Y291bnQ7IG5hKyssIG5iKz0yLCBuYysrKQogCXsKLQkJaWYgKCpuYTw9MC4wKQorCQlpZiAoKm5hPD0wLjAgfHwgKm5hICE9ICpuYSkKIAkJewogCQkJbmJbMF09MDsKIAkJCW5iWzFdPTE7CiAJCX0KLQkJZWxzZSBpZiAoKm5hPT0oZmxvYXQpKHVpbnQzMikoKm5hKSkKKwkJZWxzZSBpZiAoKm5hID49IDAgJiYgKm5hIDw9IChmbG9hdCkweEZGRkZGRkZGVSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICpuYT09KGZsb2F0KSh1aW50MzIpKCpuYSkpCiAJCXsKIAkJCW5iWzBdPSh1aW50MzIpKCpuYSk7CiAJCQluYlsxXT0xOwogCQl9CiAJCWVsc2UgaWYgKCpuYTwxLjApCiAJCXsKLQkJCW5iWzBdPSh1aW50MzIpKCgqbmEpKjB4RkZGRkZGRkYpOworCQkJbmJbMF09KHVpbnQzMikoKGRvdWJsZSkoKm5hKSoweEZGRkZGRkZGKTsKIAkJCW5iWzFdPTB4RkZGRkZGRkY7CiAJCX0KIAkJZWxzZQogCQl7CiAJCQluYlswXT0weEZGRkZGRkZGOwotCQkJbmJbMV09KHVpbnQzMikoMHhGRkZGRkZGRi8oKm5hKSk7CisJCQluYlsxXT0odWludDMyKSgoZG91YmxlKTB4RkZGRkZGRkYvKCpuYSkpOwogCQl9CiAJfQogCWlmICh0aWYtPnRpZl9mbGFncyZUSUZGX1NXQUIpCkBAIC0yMTg0LDEzICsyMjczLDEzIEBACiAJCQl9CiAJCQllbHNlIGlmICgqbmE+LTEuMCkKIAkJCXsKLQkJCQluYlswXT0tKGludDMyKSgoLSpuYSkqMHg3RkZGRkZGRik7CisJCQkJbmJbMF09LShpbnQzMikoKGRvdWJsZSkoLSpuYSkqMHg3RkZGRkZGRik7CiAJCQkJbmJbMV09MHg3RkZGRkZGRjsKIAkJCX0KIAkJCWVsc2UKIAkJCXsKIAkJCQluYlswXT0tMHg3RkZGRkZGRjsKLQkJCQluYlsxXT0oaW50MzIpKDB4N0ZGRkZGRkYvKC0qbmEpKTsKKwkJCQluYlsxXT0oaW50MzIpKChkb3VibGUpMHg3RkZGRkZGRi8oLSpuYSkpOwogCQkJfQogCQl9CiAJCWVsc2UKQEAgLTIyMDIsMTMgKzIyOTEsMTMgQEAKIAkJCX0KIAkJCWVsc2UgaWYgKCpuYTwxLjApCiAJCQl7Ci0JCQkJbmJbMF09KGludDMyKSgoKm5hKSoweDdGRkZGRkZGKTsKKwkJCQluYlswXT0oaW50MzIpKChkb3VibGUpKCpuYSkqMHg3RkZGRkZGRik7CiAJCQkJbmJbMV09MHg3RkZGRkZGRjsKIAkJCX0KIAkJCWVsc2UKIAkJCXsKIAkJCQluYlswXT0weDdGRkZGRkZGOwotCQkJCW5iWzFdPShpbnQzMikoMHg3RkZGRkZGRi8oKm5hKSk7CisJCQkJbmJbMV09KGludDMyKSgoZG91YmxlKTB4N0ZGRkZGRkYvKCpuYSkpOwogCQkJfQogCQl9CiAJfQpAQCAtMjM2OCw3ICsyNDU3LDcgQEAKIHsKIAlzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJUSUZGTGlua0RpcmVjdG9yeSI7CiAKLQl0aWYtPnRpZl9kaXJvZmYgPSAoVElGRlNlZWtGaWxlKHRpZiwwLFNFRUtfRU5EKSsxKSAmfiAxOworCXRpZi0+dGlmX2Rpcm9mZiA9IChUSUZGU2Vla0ZpbGUodGlmLDAsU0VFS19FTkQpKzEpICYgKH4oKHRvZmZfdCkxKSk7CiAKIAkvKgogCSAqIEhhbmRsZSBTdWJJRkRzCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kdW1wbW9kZS5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZHVtcG1vZGUuYwppbmRleCBhOTRjZjBiLi5hNmE5NGMwIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9kdW1wbW9kZS5jCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2R1bXBtb2RlLmMKQEAgLTEsNCArMSw0IEBACi0vKiAkSGVhZGVyOiAvY3ZzL21hcHRvb2xzL2N2c3Jvb3QvbGlidGlmZi9saWJ0aWZmL3RpZl9kdW1wbW9kZS5jLHYgMS4xNCAyMDExLTA0LTAyIDIwOjU0OjA5IGJmcmllc2VuIEV4cCAkICovCisvKiAkSGVhZGVyOiAvY3ZzL21hcHRvb2xzL2N2c3Jvb3QvbGlidGlmZi9saWJ0aWZmL3RpZl9kdW1wbW9kZS5jLHYgMS4xNSAyMDE1LTEyLTEyIDE4OjA0OjI2IGVyb3VhdWx0IEV4cCAkICovCiAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgpAQCAtNjYsNyArNjYsNyBAQAogCQljYyAtPSBuOwogCQlpZiAodGlmLT50aWZfcmF3Y2MgPj0gdGlmLT50aWZfcmF3ZGF0YXNpemUgJiYKIAkJICAgICFUSUZGRmx1c2hEYXRhMSh0aWYpKQotCQkJcmV0dXJuICgtMSk7CisJCQlyZXR1cm4gKDApOwogCX0KIAlyZXR1cm4gKDEpOwogfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZXh0ZW5zaW9uLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9leHRlbnNpb24uYwppbmRleCAxMGFmZDQxLi4zOWZhYjRjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9leHRlbnNpb24uYworKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9leHRlbnNpb24uYwpAQCAtMSw0ICsxLDQgQEAKLS8qICRIZWFkZXI6IC9jdnMvbWFwdG9vbHMvY3Zzcm9vdC9saWJ0aWZmL2xpYnRpZmYvdGlmX2V4dGVuc2lvbi5jLHYgMS43IDIwMTAtMDMtMTAgMTg6NTY6NDggYmZyaWVzZW4gRXhwICQgKi8KKy8qICRIZWFkZXI6IC9jdnMvbWFwdG9vbHMvY3Zzcm9vdC9saWJ0aWZmL2xpYnRpZmYvdGlmX2V4dGVuc2lvbi5jLHYgMS44IDIwMTUtMTItMDYgMTE6MTM6NDMgZXJvdWF1bHQgRXhwICQgKi8KIAogLyoKICAqIENvcHlyaWdodCAoYykgMTk4OC0xOTk3IFNhbSBMZWZmbGVyCkBAIC02NiwxMyArNjYsMTMgQEAKIHZvaWQgKlRJRkZHZXRDbGllbnRJbmZvKCBUSUZGICp0aWYsIGNvbnN0IGNoYXIgKm5hbWUgKQogCiB7Ci0gICAgVElGRkNsaWVudEluZm9MaW5rICpsaW5rID0gdGlmLT50aWZfY2xpZW50aW5mbzsKKyAgICBUSUZGQ2xpZW50SW5mb0xpbmsgKnBzTGluayA9IHRpZi0+dGlmX2NsaWVudGluZm87CiAKLSAgICB3aGlsZSggbGluayAhPSBOVUxMICYmIHN0cmNtcChsaW5rLT5uYW1lLG5hbWUpICE9IDAgKQotICAgICAgICBsaW5rID0gbGluay0+bmV4dDsKKyAgICB3aGlsZSggcHNMaW5rICE9IE5VTEwgJiYgc3RyY21wKHBzTGluay0+bmFtZSxuYW1lKSAhPSAwICkKKyAgICAgICAgcHNMaW5rID0gcHNMaW5rLT5uZXh0OwogCi0gICAgaWYoIGxpbmsgIT0gTlVMTCApCi0gICAgICAgIHJldHVybiBsaW5rLT5kYXRhOworICAgIGlmKCBwc0xpbmsgIT0gTlVMTCApCisgICAgICAgIHJldHVybiBwc0xpbmstPmRhdGE7CiAgICAgZWxzZQogICAgICAgICByZXR1cm4gTlVMTDsKIH0KQEAgLTgwLDE4ICs4MCwxOCBAQAogdm9pZCBUSUZGU2V0Q2xpZW50SW5mbyggVElGRiAqdGlmLCB2b2lkICpkYXRhLCBjb25zdCBjaGFyICpuYW1lICkKIAogewotICAgIFRJRkZDbGllbnRJbmZvTGluayAqbGluayA9IHRpZi0+dGlmX2NsaWVudGluZm87CisgICAgVElGRkNsaWVudEluZm9MaW5rICpwc0xpbmsgPSB0aWYtPnRpZl9jbGllbnRpbmZvOwogCiAgICAgLyoKICAgICAqKiBEbyB3ZSBoYXZlIGFuIGV4aXN0aW5nIGxpbmsgd2l0aCB0aGlzIG5hbWU/ICBJZiBzbywganVzdAogICAgICoqIHNldCBpdC4KICAgICAqLwotICAgIHdoaWxlKCBsaW5rICE9IE5VTEwgJiYgc3RyY21wKGxpbmstPm5hbWUsbmFtZSkgIT0gMCApCi0gICAgICAgIGxpbmsgPSBsaW5rLT5uZXh0OworICAgIHdoaWxlKCBwc0xpbmsgIT0gTlVMTCAmJiBzdHJjbXAocHNMaW5rLT5uYW1lLG5hbWUpICE9IDAgKQorICAgICAgICBwc0xpbmsgPSBwc0xpbmstPm5leHQ7CiAKLSAgICBpZiggbGluayAhPSBOVUxMICkKKyAgICBpZiggcHNMaW5rICE9IE5VTEwgKQogICAgIHsKLSAgICAgICAgbGluay0+ZGF0YSA9IGRhdGE7CisgICAgICAgIHBzTGluay0+ZGF0YSA9IGRhdGE7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTk5LDE1ICs5OSwxNSBAQAogICAgICoqIENyZWF0ZSBhIG5ldyBsaW5rLgogICAgICovCiAKLSAgICBsaW5rID0gKFRJRkZDbGllbnRJbmZvTGluayAqKSBfVElGRm1hbGxvYyhzaXplb2YoVElGRkNsaWVudEluZm9MaW5rKSk7Ci0gICAgYXNzZXJ0IChsaW5rICE9IE5VTEwpOwotICAgIGxpbmstPm5leHQgPSB0aWYtPnRpZl9jbGllbnRpbmZvOwotICAgIGxpbmstPm5hbWUgPSAoY2hhciAqKSBfVElGRm1hbGxvYygodG1zaXplX3QpKHN0cmxlbihuYW1lKSsxKSk7Ci0gICAgYXNzZXJ0IChsaW5rLT5uYW1lICE9IE5VTEwpOwotICAgIHN0cmNweShsaW5rLT5uYW1lLCBuYW1lKTsKLSAgICBsaW5rLT5kYXRhID0gZGF0YTsKKyAgICBwc0xpbmsgPSAoVElGRkNsaWVudEluZm9MaW5rICopIF9USUZGbWFsbG9jKHNpemVvZihUSUZGQ2xpZW50SW5mb0xpbmspKTsKKyAgICBhc3NlcnQgKHBzTGluayAhPSBOVUxMKTsKKyAgICBwc0xpbmstPm5leHQgPSB0aWYtPnRpZl9jbGllbnRpbmZvOworICAgIHBzTGluay0+bmFtZSA9IChjaGFyICopIF9USUZGbWFsbG9jKCh0bXNpemVfdCkoc3RybGVuKG5hbWUpKzEpKTsKKyAgICBhc3NlcnQgKHBzTGluay0+bmFtZSAhPSBOVUxMKTsKKyAgICBzdHJjcHkocHNMaW5rLT5uYW1lLCBuYW1lKTsKKyAgICBwc0xpbmstPmRhdGEgPSBkYXRhOwogCi0gICAgdGlmLT50aWZfY2xpZW50aW5mbyA9IGxpbms7CisgICAgdGlmLT50aWZfY2xpZW50aW5mbyA9IHBzTGluazsKIH0KIC8qCiAgKiBMb2NhbCBWYXJpYWJsZXM6CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9mYXgzLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9mYXgzLmMKaW5kZXggYmJlNzI1NS4uMDg3Y2VkZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZmF4My5jCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2ZheDMuYwpAQCAtMSw0ICsxLDQgQEAKLS8qICRJZDogdGlmX2ZheDMuYyx2IDEuNzUgMjAxNS0wOC0zMCAyMDo0OTo1NSBlcm91YXVsdCBFeHAgJCAqLworLyogJElkOiB0aWZfZmF4My5jLHYgMS44MCAyMDE3LTA0LTI3IDE5OjUwOjAxIGVyb3VhdWx0IEV4cCAkICovCiAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDE5OTAtMTk5NyBTYW0gTGVmZmxlcgpAQCAtMzI5LDM0ICszMjksNjQgQEAKICNpZiBTSVpFT0ZfVU5TSUdORURfTE9ORyA9PSA4CiAjIGRlZmluZSBGSUxMKG4sIGNwKQkJCQkJCQkgICAgXAogICAgIHN3aXRjaCAobikgewkJCQkJCQkgICAgXAotICAgIGNhc2UgMTU6KGNwKVsxNF0gPSAweGZmOyBjYXNlIDE0OihjcClbMTNdID0gMHhmZjsgY2FzZSAxMzogKGNwKVsxMl0gPSAweGZmO1wKLSAgICBjYXNlIDEyOihjcClbMTFdID0gMHhmZjsgY2FzZSAxMTooY3ApWzEwXSA9IDB4ZmY7IGNhc2UgMTA6IChjcClbOV0gPSAweGZmO1wKLSAgICBjYXNlICA5OiAoY3ApWzhdID0gMHhmZjsgY2FzZSAgODogKGNwKVs3XSA9IDB4ZmY7IGNhc2UgIDc6IChjcClbNl0gPSAweGZmO1wKLSAgICBjYXNlICA2OiAoY3ApWzVdID0gMHhmZjsgY2FzZSAgNTogKGNwKVs0XSA9IDB4ZmY7IGNhc2UgIDQ6IChjcClbM10gPSAweGZmO1wKLSAgICBjYXNlICAzOiAoY3ApWzJdID0gMHhmZjsgY2FzZSAgMjogKGNwKVsxXSA9IDB4ZmY7CQkJICAgICAgXAotICAgIGNhc2UgIDE6IChjcClbMF0gPSAweGZmOyAoY3ApICs9IChuKTsgY2FzZSAwOiAgOwkJCSAgICAgIFwKKyAgICBjYXNlIDE1OihjcClbMTRdID0gMHhmZjsgLyotZmFsbHRocm91Z2gqLyBcCisgICAgY2FzZSAxNDooY3ApWzEzXSA9IDB4ZmY7IC8qLWZhbGx0aHJvdWdoKi8gXAorICAgIGNhc2UgMTM6KGNwKVsxMl0gPSAweGZmOyAvKi1mYWxsdGhyb3VnaCovIFwKKyAgICBjYXNlIDEyOihjcClbMTFdID0gMHhmZjsgLyotZmFsbHRocm91Z2gqLyBcCisgICAgY2FzZSAxMTooY3ApWzEwXSA9IDB4ZmY7IC8qLWZhbGx0aHJvdWdoKi8gXAorICAgIGNhc2UgMTA6IChjcClbOV0gPSAweGZmOyAvKi1mYWxsdGhyb3VnaCovIFwKKyAgICBjYXNlICA5OiAoY3ApWzhdID0gMHhmZjsgLyotZmFsbHRocm91Z2gqLyBcCisgICAgY2FzZSAgODogKGNwKVs3XSA9IDB4ZmY7IC8qLWZhbGx0aHJvdWdoKi8gXAorICAgIGNhc2UgIDc6IChjcClbNl0gPSAweGZmOyAvKi1mYWxsdGhyb3VnaCovIFwKKyAgICBjYXNlICA2OiAoY3ApWzVdID0gMHhmZjsgLyotZmFsbHRocm91Z2gqLyBcCisgICAgY2FzZSAgNTogKGNwKVs0XSA9IDB4ZmY7IC8qLWZhbGx0aHJvdWdoKi8gXAorICAgIGNhc2UgIDQ6IChjcClbM10gPSAweGZmOyAvKi1mYWxsdGhyb3VnaCovIFwKKyAgICBjYXNlICAzOiAoY3ApWzJdID0gMHhmZjsgLyotZmFsbHRocm91Z2gqLyBcCisgICAgY2FzZSAgMjogKGNwKVsxXSA9IDB4ZmY7IC8qLWZhbGx0aHJvdWdoKi8gXAorICAgIGNhc2UgIDE6IChjcClbMF0gPSAweGZmOyAoY3ApICs9IChuKTsgLyotZmFsbHRocm91Z2gqLyBcCisgICAgY2FzZSAwOiAgOwkJCSAgICAgIFwKICAgICB9CiAjIGRlZmluZSBaRVJPKG4sIGNwKQkJCQkJCQlcCiAgICAgc3dpdGNoIChuKSB7CQkJCQkJCVwKLSAgICBjYXNlIDE1OihjcClbMTRdID0gMDsgY2FzZSAxNDooY3ApWzEzXSA9IDA7IGNhc2UgMTM6IChjcClbMTJdID0gMDsJXAotICAgIGNhc2UgMTI6KGNwKVsxMV0gPSAwOyBjYXNlIDExOihjcClbMTBdID0gMDsgY2FzZSAxMDogKGNwKVs5XSA9IDA7CVwKLSAgICBjYXNlICA5OiAoY3ApWzhdID0gMDsgY2FzZSAgODogKGNwKVs3XSA9IDA7IGNhc2UgIDc6IChjcClbNl0gPSAwOwlcCi0gICAgY2FzZSAgNjogKGNwKVs1XSA9IDA7IGNhc2UgIDU6IChjcClbNF0gPSAwOyBjYXNlICA0OiAoY3ApWzNdID0gMDsJXAotICAgIGNhc2UgIDM6IChjcClbMl0gPSAwOyBjYXNlICAyOiAoY3ApWzFdID0gMDsJCQkJXAotICAgIGNhc2UgIDE6IChjcClbMF0gPSAwOyAoY3ApICs9IChuKTsgY2FzZSAwOiAgOwkJCVwKKyAgICBjYXNlIDE1OihjcClbMTRdID0gMDsgLyotZmFsbHRocm91Z2gqLyBcCisgICAgY2FzZSAxNDooY3ApWzEzXSA9IDA7IC8qLWZhbGx0aHJvdWdoKi8gXAorICAgIGNhc2UgMTM6KGNwKVsxMl0gPSAwOyAvKi1mYWxsdGhyb3VnaCovIFwKKyAgICBjYXNlIDEyOihjcClbMTFdID0gMDsgLyotZmFsbHRocm91Z2gqLyBcCisgICAgY2FzZSAxMTooY3ApWzEwXSA9IDA7IC8qLWZhbGx0aHJvdWdoKi8gXAorICAgIGNhc2UgMTA6IChjcClbOV0gPSAwOyAvKi1mYWxsdGhyb3VnaCovIFwKKyAgICBjYXNlICA5OiAoY3ApWzhdID0gMDsgLyotZmFsbHRocm91Z2gqLyBcCisgICAgY2FzZSAgODogKGNwKVs3XSA9IDA7IC8qLWZhbGx0aHJvdWdoKi8gXAorICAgIGNhc2UgIDc6IChjcClbNl0gPSAwOyAvKi1mYWxsdGhyb3VnaCovIFwKKyAgICBjYXNlICA2OiAoY3ApWzVdID0gMDsgLyotZmFsbHRocm91Z2gqLyBcCisgICAgY2FzZSAgNTogKGNwKVs0XSA9IDA7IC8qLWZhbGx0aHJvdWdoKi8gXAorICAgIGNhc2UgIDQ6IChjcClbM10gPSAwOyAvKi1mYWxsdGhyb3VnaCovIFwKKyAgICBjYXNlICAzOiAoY3ApWzJdID0gMDsgLyotZmFsbHRocm91Z2gqLyBcCisgICAgY2FzZSAgMjogKGNwKVsxXSA9IDA7IC8qLWZhbGx0aHJvdWdoKi8gXAorICAgIGNhc2UgIDE6IChjcClbMF0gPSAwOyAoY3ApICs9IChuKTsgLyotZmFsbHRocm91Z2gqLyBcCisgICAgY2FzZSAwOiAgOwkJCVwKICAgICB9CiAjZWxzZQogIyBkZWZpbmUgRklMTChuLCBjcCkJCQkJCQkJICAgIFwKICAgICBzd2l0Y2ggKG4pIHsJCQkJCQkJICAgIFwKLSAgICBjYXNlIDc6IChjcClbNl0gPSAweGZmOyBjYXNlIDY6IChjcClbNV0gPSAweGZmOyBjYXNlIDU6IChjcClbNF0gPSAweGZmOyBcCi0gICAgY2FzZSA0OiAoY3ApWzNdID0gMHhmZjsgY2FzZSAzOiAoY3ApWzJdID0gMHhmZjsgY2FzZSAyOiAoY3ApWzFdID0gMHhmZjsgXAotICAgIGNhc2UgMTogKGNwKVswXSA9IDB4ZmY7IChjcCkgKz0gKG4pOyBjYXNlIDA6ICA7CQkJICAgIFwKKyAgICBjYXNlIDc6IChjcClbNl0gPSAweGZmOyAvKi1mYWxsdGhyb3VnaCovIFwKKyAgICBjYXNlIDY6IChjcClbNV0gPSAweGZmOyAvKi1mYWxsdGhyb3VnaCovIFwKKyAgICBjYXNlIDU6IChjcClbNF0gPSAweGZmOyAvKi1mYWxsdGhyb3VnaCovIFwKKyAgICBjYXNlIDQ6IChjcClbM10gPSAweGZmOyAvKi1mYWxsdGhyb3VnaCovIFwKKyAgICBjYXNlIDM6IChjcClbMl0gPSAweGZmOyAvKi1mYWxsdGhyb3VnaCovIFwKKyAgICBjYXNlIDI6IChjcClbMV0gPSAweGZmOyAvKi1mYWxsdGhyb3VnaCovIFwKKyAgICBjYXNlIDE6IChjcClbMF0gPSAweGZmOyAoY3ApICs9IChuKTsgIC8qLWZhbGx0aHJvdWdoKi8gXAorICAgIGNhc2UgMDogIDsJCQkgICAgXAogICAgIH0KICMgZGVmaW5lIFpFUk8obiwgY3ApCQkJCQkJCVwKICAgICBzd2l0Y2ggKG4pIHsJCQkJCQkJXAotICAgIGNhc2UgNzogKGNwKVs2XSA9IDA7IGNhc2UgNjogKGNwKVs1XSA9IDA7IGNhc2UgNTogKGNwKVs0XSA9IDA7CVwKLSAgICBjYXNlIDQ6IChjcClbM10gPSAwOyBjYXNlIDM6IChjcClbMl0gPSAwOyBjYXNlIDI6IChjcClbMV0gPSAwOwlcCi0gICAgY2FzZSAxOiAoY3ApWzBdID0gMDsgKGNwKSArPSAobik7IGNhc2UgMDogIDsJCQlcCisgICAgY2FzZSA3OiAoY3ApWzZdID0gMDsgLyotZmFsbHRocm91Z2gqLyBcCisgICAgY2FzZSA2OiAoY3ApWzVdID0gMDsgLyotZmFsbHRocm91Z2gqLyBcCisgICAgY2FzZSA1OiAoY3ApWzRdID0gMDsgLyotZmFsbHRocm91Z2gqLyBcCisgICAgY2FzZSA0OiAoY3ApWzNdID0gMDsgLyotZmFsbHRocm91Z2gqLyBcCisgICAgY2FzZSAzOiAoY3ApWzJdID0gMDsgLyotZmFsbHRocm91Z2gqLyBcCisgICAgY2FzZSAyOiAoY3ApWzFdID0gMDsgLyotZmFsbHRocm91Z2gqLyBcCisgICAgY2FzZSAxOiAoY3ApWzBdID0gMDsgKGNwKSArPSAobik7IC8qLWZhbGx0aHJvdWdoKi8gXAorICAgIGNhc2UgMDogIDsJCQlcCiAgICAgfQogI2VuZGlmCiAKQEAgLTY0NCw3ICs2NzQsOCBAQAogCiAJd2hpbGUgKHNwYW4gPj0gMjYyNCkgewogCQljb25zdCB0YWJsZWVudHJ5KiB0ZSA9ICZ0YWJbNjMgKyAoMjU2MD4+NildOwotCQljb2RlID0gdGUtPmNvZGUsIGxlbmd0aCA9IHRlLT5sZW5ndGg7CisJCWNvZGUgPSB0ZS0+Y29kZTsKKwkJbGVuZ3RoID0gdGUtPmxlbmd0aDsKICNpZmRlZiBGQVgzX0RFQlVHCiAJCURFQlVHX1BSSU5UKCJNYWtlVXAiLCB0ZS0+cnVubGVuKTsKICNlbmRpZgpAQCAtNjU0LDE0ICs2ODUsMTYgQEAKIAlpZiAoc3BhbiA+PSA2NCkgewogCQljb25zdCB0YWJsZWVudHJ5KiB0ZSA9ICZ0YWJbNjMgKyAoc3Bhbj4+NildOwogCQlhc3NlcnQodGUtPnJ1bmxlbiA9PSA2NCooc3Bhbj4+NikpOwotCQljb2RlID0gdGUtPmNvZGUsIGxlbmd0aCA9IHRlLT5sZW5ndGg7CisJCWNvZGUgPSB0ZS0+Y29kZTsKKwkJbGVuZ3RoID0gdGUtPmxlbmd0aDsKICNpZmRlZiBGQVgzX0RFQlVHCiAJCURFQlVHX1BSSU5UKCJNYWtlVXAiLCB0ZS0+cnVubGVuKTsKICNlbmRpZgogCQlfUHV0Qml0cyh0aWYsIGNvZGUsIGxlbmd0aCk7CiAJCXNwYW4gLT0gdGUtPnJ1bmxlbjsKIAl9Ci0JY29kZSA9IHRhYltzcGFuXS5jb2RlLCBsZW5ndGggPSB0YWJbc3Bhbl0ubGVuZ3RoOworCWNvZGUgPSB0YWJbc3Bhbl0uY29kZTsKKwlsZW5ndGggPSB0YWJbc3Bhbl0ubGVuZ3RoOwogI2lmZGVmIEZBWDNfREVCVUcKIAlERUJVR19QUklOVCgiICBUZXJtIiwgdGFiW3NwYW5dLnJ1bmxlbik7CiAjZW5kaWYKQEAgLTY5NywxNCArNzMwLDE2IEBACiAJCQkJYWxpZ24gPSBzcC0+Yml0ICsgKDggLSBhbGlnbik7CiAJCQllbHNlCiAJCQkJYWxpZ24gPSBzcC0+Yml0IC0gYWxpZ247Ci0JCQljb2RlID0gMDsKIAkJCXRwYXJtPWFsaWduOyAKIAkJCV9QdXRCaXRzKHRpZiwgMCwgdHBhcm0pOwogCQl9CiAJfQotCWNvZGUgPSBFT0wsIGxlbmd0aCA9IDEyOwotCWlmIChpczJERW5jb2Rpbmcoc3ApKQotCQljb2RlID0gKGNvZGU8PDEpIHwgKHNwLT50YWcgPT0gRzNfMUQpLCBsZW5ndGgrKzsKKwljb2RlID0gRU9MOworCWxlbmd0aCA9IDEyOworCWlmIChpczJERW5jb2Rpbmcoc3ApKSB7CisJCWNvZGUgPSAoY29kZTw8MSkgfCAoc3AtPnRhZyA9PSBHM18xRCk7CisJCWxlbmd0aCsrOworCX0KIAlfUHV0Qml0cyh0aWYsIGNvZGUsIGxlbmd0aCk7CiAKIAlzcC0+ZGF0YSA9IGRhdGE7CkBAIC04MTUsNyArODUwLDcgQEAKIAkvKgogCSAqIENoZWNrIHBhcnRpYWwgYnl0ZSBvbiBsaHMuCiAJICovCi0JaWYgKGJpdHMgPiAwICYmIChuID0gKGJzICYgNykpKSB7CisJaWYgKGJpdHMgPiAwICYmIChuID0gKGJzICYgNykpICE9IDApIHsKIAkJc3BhbiA9IHplcm9ydW5zWygqYnAgPDwgbikgJiAweGZmXTsKIAkJaWYgKHNwYW4gPiA4LW4pCQkvKiB0YWJsZSB2YWx1ZSB0b28gZ2VuZXJvdXMgKi8KIAkJCXNwYW4gPSA4LW47CkBAIC04MzUsMTIgKzg3MCwxNCBAQAogCQl3aGlsZSAoIWlzQWxpZ25lZChicCwgbG9uZykpIHsKIAkJCWlmICgqYnAgIT0gMHgwMCkKIAkJCQlyZXR1cm4gKHNwYW4gKyB6ZXJvcnVuc1sqYnBdKTsKLQkJCXNwYW4gKz0gOCwgYml0cyAtPSA4OworCQkJc3BhbiArPSA4OworCQkJYml0cyAtPSA4OwogCQkJYnArKzsKIAkJfQogCQlscCA9IChsb25nKikgYnA7CiAJCXdoaWxlICgoYml0cyA+PSAoaW50MzIpKDggKiBzaXplb2YobG9uZykpKSAmJiAoMCA9PSAqbHApKSB7Ci0JCQlzcGFuICs9IDgqc2l6ZW9mIChsb25nKSwgYml0cyAtPSA4KnNpemVvZiAobG9uZyk7CisJCQlzcGFuICs9IDgqc2l6ZW9mIChsb25nKTsKKwkJCWJpdHMgLT0gOCpzaXplb2YgKGxvbmcpOwogCQkJbHArKzsKIAkJfQogCQlicCA9ICh1bnNpZ25lZCBjaGFyKikgbHA7CkBAIC04NTEsNyArODg4LDggQEAKIAl3aGlsZSAoYml0cyA+PSA4KSB7CiAJCWlmICgqYnAgIT0gMHgwMCkJLyogZW5kIG9mIHJ1biAqLwogCQkJcmV0dXJuIChzcGFuICsgemVyb3J1bnNbKmJwXSk7Ci0JCXNwYW4gKz0gOCwgYml0cyAtPSA4OworCQlzcGFuICs9IDg7CisJCWJpdHMgLT0gODsKIAkJYnArKzsKIAl9CiAJLyoKQEAgLTg3NCw3ICs5MTIsNyBAQAogCS8qCiAJICogQ2hlY2sgcGFydGlhbCBieXRlIG9uIGxocy4KIAkgKi8KLQlpZiAoYml0cyA+IDAgJiYgKG4gPSAoYnMgJiA3KSkpIHsKKwlpZiAoYml0cyA+IDAgJiYgKG4gPSAoYnMgJiA3KSkgIT0gMCkgewogCQlzcGFuID0gb25lcnVuc1soKmJwIDw8IG4pICYgMHhmZl07CiAJCWlmIChzcGFuID4gOC1uKQkJLyogdGFibGUgdmFsdWUgdG9vIGdlbmVyb3VzICovCiAJCQlzcGFuID0gOC1uOwpAQCAtODk0LDEyICs5MzIsMTQgQEAKIAkJd2hpbGUgKCFpc0FsaWduZWQoYnAsIGxvbmcpKSB7CiAJCQlpZiAoKmJwICE9IDB4ZmYpCiAJCQkJcmV0dXJuIChzcGFuICsgb25lcnVuc1sqYnBdKTsKLQkJCXNwYW4gKz0gOCwgYml0cyAtPSA4OworCQkJc3BhbiArPSA4OworCQkJYml0cyAtPSA4OwogCQkJYnArKzsKIAkJfQogCQlscCA9IChsb25nKikgYnA7CiAJCXdoaWxlICgoYml0cyA+PSAoaW50MzIpKDggKiBzaXplb2YobG9uZykpKSAmJiAofjAgPT0gKmxwKSkgewotCQkJc3BhbiArPSA4KnNpemVvZiAobG9uZyksIGJpdHMgLT0gOCpzaXplb2YgKGxvbmcpOworCQkJc3BhbiArPSA4KnNpemVvZiAobG9uZyk7CisJCQliaXRzIC09IDgqc2l6ZW9mIChsb25nKTsKIAkJCWxwKys7CiAJCX0KIAkJYnAgPSAodW5zaWduZWQgY2hhciopIGxwOwpAQCAtOTEwLDcgKzk1MCw4IEBACiAJd2hpbGUgKGJpdHMgPj0gOCkgewogCQlpZiAoKmJwICE9IDB4ZmYpCS8qIGVuZCBvZiBydW4gKi8KIAkJCXJldHVybiAoc3BhbiArIG9uZXJ1bnNbKmJwXSk7Ci0JCXNwYW4gKz0gOCwgYml0cyAtPSA4OworCQlzcGFuICs9IDg7CisJCWJpdHMgLT0gODsKIAkJYnArKzsKIAl9CiAJLyoKQEAgLTEwODgsMTQgKzExMjksMTYgQEAKIHN0YXRpYyB2b2lkCiBGYXgzQ2xvc2UoVElGRiogdGlmKQogewotCWlmICgoRmF4M1N0YXRlKHRpZiktPm1vZGUgJiBGQVhNT0RFX05PUlRDKSA9PSAwKSB7CisJaWYgKChGYXgzU3RhdGUodGlmKS0+bW9kZSAmIEZBWE1PREVfTk9SVEMpID09IDAgJiYgdGlmLT50aWZfcmF3Y3ApIHsKIAkJRmF4M0NvZGVjU3RhdGUqIHNwID0gRW5jb2RlclN0YXRlKHRpZik7CiAJCXVuc2lnbmVkIGludCBjb2RlID0gRU9MOwogCQl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gMTI7CiAJCWludCBpOwogCi0JCWlmIChpczJERW5jb2Rpbmcoc3ApKQotCQkJY29kZSA9IChjb2RlPDwxKSB8IChzcC0+dGFnID09IEczXzFEKSwgbGVuZ3RoKys7CisJCWlmIChpczJERW5jb2Rpbmcoc3ApKSB7CisJCQljb2RlID0gKGNvZGU8PDEpIHwgKHNwLT50YWcgPT0gRzNfMUQpOworCQkJbGVuZ3RoKys7CisJCX0KIAkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKIAkJCUZheDNQdXRCaXRzKHRpZiwgY29kZSwgbGVuZ3RoKTsKIAkJRmF4M0ZsdXNoQml0cyh0aWYsIHNwKTsKQEAgLTExODIsNyArMTIyNSw3IEBACiAJCXJldHVybiAoKnNwLT52c2V0cGFyZW50KSh0aWYsIHRhZywgYXApOwogCX0KIAkKLQlpZiAoKGZpcCA9IFRJRkZGaWVsZFdpdGhUYWcodGlmLCB0YWcpKSkKKwlpZiAoKGZpcCA9IFRJRkZGaWVsZFdpdGhUYWcodGlmLCB0YWcpKSAhPSBOVUxMKQogCQlUSUZGU2V0RmllbGRCaXQodGlmLCBmaXAtPmZpZWxkX2JpdCk7CiAJZWxzZQogCQlyZXR1cm4gMDsKQEAgLTEyNDEsMTAgKzEyODQsMTQgQEAKIAkJfSBlbHNlIHsKIAogCQkJZnByaW50ZihmZCwgIiAgR3JvdXAgMyBPcHRpb25zOiIpOwotCQkJaWYgKHNwLT5ncm91cG9wdGlvbnMgJiBHUk9VUDNPUFRfMkRFTkNPRElORykKLQkJCQlmcHJpbnRmKGZkLCAiJXMyLWQgZW5jb2RpbmciLCBzZXApLCBzZXAgPSAiKyI7Ci0JCQlpZiAoc3AtPmdyb3Vwb3B0aW9ucyAmIEdST1VQM09QVF9GSUxMQklUUykKLQkJCQlmcHJpbnRmKGZkLCAiJXNFT0wgcGFkZGluZyIsIHNlcCksIHNlcCA9ICIrIjsKKwkJCWlmIChzcC0+Z3JvdXBvcHRpb25zICYgR1JPVVAzT1BUXzJERU5DT0RJTkcpIHsKKwkJCQlmcHJpbnRmKGZkLCAiJXMyLWQgZW5jb2RpbmciLCBzZXApOworCQkJCXNlcCA9ICIrIjsKKwkJCX0KKwkJCWlmIChzcC0+Z3JvdXBvcHRpb25zICYgR1JPVVAzT1BUX0ZJTExCSVRTKSB7CisJCQkJZnByaW50ZihmZCwgIiVzRU9MIHBhZGRpbmciLCBzZXApOworCQkJCXNlcCA9ICIrIjsKKwkJCX0KIAkJCWlmIChzcC0+Z3JvdXBvcHRpb25zICYgR1JPVVAzT1BUX1VOQ09NUFJFU1NFRCkKIAkJCQlmcHJpbnRmKGZkLCAiJXN1bmNvbXByZXNzZWQgZGF0YSIsIHNlcCk7CiAJCX0KQEAgLTEzMDQsNiArMTM1MSw3IEBACiAJCSAgICAiTm8gc3BhY2UgZm9yIHN0YXRlIGJsb2NrIik7CiAJCXJldHVybiAoMCk7CiAJfQorCV9USUZGbWVtc2V0KHRpZi0+dGlmX2RhdGEsIDAsIHNpemVvZiAoRmF4M0NvZGVjU3RhdGUpKTsKIAogCXNwID0gRmF4M1N0YXRlKHRpZik7CiAgICAgICAgIHNwLT5yd19tb2RlID0gdGlmLT50aWZfbW9kZTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2ZheDMuaCBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2ZheDMuaAppbmRleCBiMGY0NmM5Li44YTQzNTA1IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9mYXgzLmgKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZmF4My5oCkBAIC0xLDQgKzEsNCBAQAotLyogJElkOiB0aWZfZmF4My5oLHYgMS45IDIwMTEtMDMtMTAgMjA6MjM6MDcgZndhcm1lcmRhbSBFeHAgJCAqLworLyogJElkOiB0aWZfZmF4My5oLHYgMS4xMyAyMDE2LTEyLTE0IDE4OjM2OjI3IGZheGd1eSBFeHAgJCAqLwogCiAvKgogICogQ29weXJpZ2h0IChjKSAxOTkwLTE5OTcgU2FtIExlZmZsZXIKQEAgLTM5LDcgKzM5LDcgQEAKIAogLyoKICAqIFRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHJvdXRpbmUgdXNlZCB0byBpbWFnZSBkZWNvZGVkCi0gKiBzcGFucyBvbmUgY2FuIHVzZSB0aGUgcHNlZHVvIHRhZyBUSUZGVEFHX0ZBWEZJTExGVU5DLgorICogc3BhbnMgb25lIGNhbiB1c2UgdGhlIHBzZXVkbyB0YWcgVElGRlRBR19GQVhGSUxMRlVOQy4KICAqIFRoZSByb3V0aW5lIG11c3QgaGF2ZSB0aGUgdHlwZSBzaWduYXR1cmUgZ2l2ZW4gYmVsb3c7CiAgKiBmb3IgZXhhbXBsZToKICAqCkBAIC04MSwxMCArODEsMTIgQEAKICNkZWZpbmUgU19NYWtlVXAgICAxMQogI2RlZmluZSBTX0VPTCAgICAgIDEyCiAKKy8qIFdBUk5JTkc6IGRvIG5vdCBjaGFuZ2UgdGhlIGxheW91dCBvZiB0aGlzIHN0cnVjdHVyZSBhcyB0aGUgSHlsYUZBWCBzb2Z0d2FyZSAqLworLyogcmVhbGx5IGRlcGVuZHMgb24gaXQuIFNlZSBodHRwOi8vYnVnemlsbGEubWFwdG9vbHMub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjM2ICovCiB0eXBlZGVmIHN0cnVjdCB7ICAgICAgICAgICAgICAgIC8qIHN0YXRlIHRhYmxlIGVudHJ5ICovCiAJdW5zaWduZWQgY2hhciBTdGF0ZTsgICAgLyogc2VlIGFib3ZlICovCiAJdW5zaWduZWQgY2hhciBXaWR0aDsgICAgLyogd2lkdGggb2YgY29kZSBpbiBiaXRzICovCi0JdWludDMyIFBhcmFtOyAgICAgICAgICAgLyogdW5zaWduZWQgMzItYml0IHJ1biBsZW5ndGggaW4gYml0cyAqLworCXVpbnQzMiBQYXJhbTsgICAgICAgICAgIC8qIHVuc2lnbmVkIDMyLWJpdCBydW4gbGVuZ3RoIGluIGJpdHMgKGhvbGRzIG9uIDE2IGJpdCBhY3R1YWxseSwgYnV0IGNhbm5vdCBiZSBjaGFuZ2VkLiBTZWUgYWJvdmUgd2FybmluZykgKi8KIH0gVElGRkZheFRhYkVudDsKIAogZXh0ZXJuIGNvbnN0IFRJRkZGYXhUYWJFbnQgVElGRkZheE1haW5UYWJsZVtdOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZ2V0aW1hZ2UuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2dldGltYWdlLmMKaW5kZXggNWVkMWI3YS4uZDM3ZjcyOSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfZ2V0aW1hZ2UuYworKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9nZXRpbWFnZS5jCkBAIC0xLDQgKzEsNCBAQAotLyogJElkOiB0aWZfZ2V0aW1hZ2UuYyx2IDEuOTAgMjAxNS0wNi0xNyAwMTozNDowOCBiZnJpZXNlbiBFeHAgJCAqLworLyogJElkOiB0aWZfZ2V0aW1hZ2UuYyx2IDEuMTA2IDIwMTctMDUtMjAgMTE6Mjk6MDIgZXJvdWF1bHQgRXhwICQgKi8KIAogLyoKICAqIENvcHlyaWdodCAoYykgMTk5MS0xOTk3IFNhbSBMZWZmbGVyCkBAIC05Niw2ICs5NiwxMCBAQAogCQkJICAgIHRkLT50ZF9iaXRzcGVyc2FtcGxlKTsKIAkJCXJldHVybiAoMCk7CiAJfQorICAgICAgICBpZiAodGQtPnRkX3NhbXBsZWZvcm1hdCA9PSBTQU1QTEVGT1JNQVRfSUVFRUZQKSB7CisgICAgICAgICAgICAgICAgc3ByaW50ZihlbXNnLCAiU29ycnksIGNhbiBub3QgaGFuZGxlIGltYWdlcyB3aXRoIElFRUUgZmxvYXRpbmctcG9pbnQgc2FtcGxlcyIpOworICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KIAljb2xvcmNoYW5uZWxzID0gdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCAtIHRkLT50ZF9leHRyYXNhbXBsZXM7CiAJaWYgKCFUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX1BIT1RPTUVUUklDLCAmcGhvdG9tZXRyaWMpKSB7CiAJCXN3aXRjaCAoY29sb3JjaGFubmVscykgewpAQCAtMTgzLDI3ICsxODcsMjUgQEAKIAkJCQkgICAgIlBsYW5hcmNvbmZpZ3VyYXRpb24iLCB0ZC0+dGRfcGxhbmFyY29uZmlnKTsKIAkJCQlyZXR1cm4gKDApOwogCQkJfQotCQkJaWYoIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwgIT0gMyB8fCBjb2xvcmNoYW5uZWxzICE9IDMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNwcmludGYoZW1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICJTb3JyeSwgY2FuIG5vdCBoYW5kbGUgaW1hZ2Ugd2l0aCAlcz0lZCwgJXM9JWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIlNhbXBsZXMvcGl4ZWwiLCB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgImNvbG9yY2hhbm5lbHMiLCBjb2xvcmNoYW5uZWxzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KKwkJCWlmICggdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCAhPSAzIHx8IGNvbG9yY2hhbm5lbHMgIT0gMyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihlbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTb3JyeSwgY2FuIG5vdCBoYW5kbGUgaW1hZ2Ugd2l0aCAlcz0lZCwgJXM9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTYW1wbGVzL3BpeGVsIiwgdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3JjaGFubmVscyIsIGNvbG9yY2hhbm5lbHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIAkJCWJyZWFrOwogCQljYXNlIFBIT1RPTUVUUklDX0NJRUxBQjoKLSAgICAgICAgICAgIGlmKCB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsICE9IDMgfHwgY29sb3JjaGFubmVscyAhPSAzIHx8IHRkLT50ZF9iaXRzcGVyc2FtcGxlICE9IDggKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNwcmludGYoZW1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICJTb3JyeSwgY2FuIG5vdCBoYW5kbGUgaW1hZ2Ugd2l0aCAlcz0lZCwgJXM9JWQgYW5kICVzPSVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJTYW1wbGVzL3BpeGVsIiwgdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvcmNoYW5uZWxzIiwgY29sb3JjaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICJCaXRzL3NhbXBsZSIsIHRkLT50ZF9iaXRzcGVyc2FtcGxlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCAhPSAzIHx8IGNvbG9yY2hhbm5lbHMgIT0gMyB8fCB0ZC0+dGRfYml0c3BlcnNhbXBsZSAhPSA4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKGVtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNvcnJ5LCBjYW4gbm90IGhhbmRsZSBpbWFnZSB3aXRoICVzPSVkLCAlcz0lZCBhbmQgJXM9JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTYW1wbGVzL3BpeGVsIiwgdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3JjaGFubmVscyIsIGNvbG9yY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJpdHMvc2FtcGxlIiwgdGQtPnRkX2JpdHNwZXJzYW1wbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIAkJCWJyZWFrOwotCQlkZWZhdWx0OgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAJCQlzcHJpbnRmKGVtc2csICJTb3JyeSwgY2FuIG5vdCBoYW5kbGUgaW1hZ2Ugd2l0aCAlcz0lZCIsCiAJCQkgICAgcGhvdG9UYWcsIHBob3RvbWV0cmljKTsKIAkJCXJldHVybiAoMCk7CkBAIC0yMTQsMjAgKzIxNiwzNCBAQAogdm9pZAogVElGRlJHQkFJbWFnZUVuZChUSUZGUkdCQUltYWdlKiBpbWcpCiB7Ci0JaWYgKGltZy0+TWFwKQotCQlfVElGRmZyZWUoaW1nLT5NYXApLCBpbWctPk1hcCA9IE5VTEw7Ci0JaWYgKGltZy0+QldtYXApCi0JCV9USUZGZnJlZShpbWctPkJXbWFwKSwgaW1nLT5CV21hcCA9IE5VTEw7Ci0JaWYgKGltZy0+UEFMbWFwKQotCQlfVElGRmZyZWUoaW1nLT5QQUxtYXApLCBpbWctPlBBTG1hcCA9IE5VTEw7Ci0JaWYgKGltZy0+eWNiY3IpCi0JCV9USUZGZnJlZShpbWctPnljYmNyKSwgaW1nLT55Y2JjciA9IE5VTEw7Ci0JaWYgKGltZy0+Y2llbGFiKQotCQlfVElGRmZyZWUoaW1nLT5jaWVsYWIpLCBpbWctPmNpZWxhYiA9IE5VTEw7Ci0JaWYgKGltZy0+VWFUb0FhKQotCQlfVElGRmZyZWUoaW1nLT5VYVRvQWEpLCBpbWctPlVhVG9BYSA9IE5VTEw7Ci0JaWYgKGltZy0+Qml0ZGVwdGgxNlRvOCkKLQkJX1RJRkZmcmVlKGltZy0+Qml0ZGVwdGgxNlRvOCksIGltZy0+Qml0ZGVwdGgxNlRvOCA9IE5VTEw7CisJaWYgKGltZy0+TWFwKSB7CisJCV9USUZGZnJlZShpbWctPk1hcCk7CisJCWltZy0+TWFwID0gTlVMTDsKKwl9CisJaWYgKGltZy0+QldtYXApIHsKKwkJX1RJRkZmcmVlKGltZy0+QldtYXApOworCQlpbWctPkJXbWFwID0gTlVMTDsKKwl9CisJaWYgKGltZy0+UEFMbWFwKSB7CisJCV9USUZGZnJlZShpbWctPlBBTG1hcCk7CisJCWltZy0+UEFMbWFwID0gTlVMTDsKKwl9CisJaWYgKGltZy0+eWNiY3IpIHsKKwkJX1RJRkZmcmVlKGltZy0+eWNiY3IpOworCQlpbWctPnljYmNyID0gTlVMTDsKKwl9CisJaWYgKGltZy0+Y2llbGFiKSB7CisJCV9USUZGZnJlZShpbWctPmNpZWxhYik7CisJCWltZy0+Y2llbGFiID0gTlVMTDsKKwl9CisJaWYgKGltZy0+VWFUb0FhKSB7CisJCV9USUZGZnJlZShpbWctPlVhVG9BYSk7CisJCWltZy0+VWFUb0FhID0gTlVMTDsKKwl9CisJaWYgKGltZy0+Qml0ZGVwdGgxNlRvOCkgeworCQlfVElGRmZyZWUoaW1nLT5CaXRkZXB0aDE2VG84KTsKKwkJaW1nLT5CaXRkZXB0aDE2VG84ID0gTlVMTDsKKwl9CiAKIAlpZiggaW1nLT5yZWRjbWFwICkgewogCQlfVElGRmZyZWUoIGltZy0+cmVkY21hcCApOwpAQCAtMzUxLDcgKzM2Nyw3IEBACiAJCQl9CiAKIAkJCS8qIGNvcHkgdGhlIGNvbG9ybWFwcyBzbyB3ZSBjYW4gbW9kaWZ5IHRoZW0gKi8KLQkJCW5fY29sb3IgPSAoMUwgPDwgaW1nLT5iaXRzcGVyc2FtcGxlKTsKKwkJCW5fY29sb3IgPSAoMVUgPDwgaW1nLT5iaXRzcGVyc2FtcGxlKTsKIAkJCWltZy0+cmVkY21hcCA9ICh1aW50MTYgKikgX1RJRkZtYWxsb2Moc2l6ZW9mKHVpbnQxNikqbl9jb2xvcik7CiAJCQlpbWctPmdyZWVuY21hcCA9ICh1aW50MTYgKikgX1RJRkZtYWxsb2Moc2l6ZW9mKHVpbnQxNikqbl9jb2xvcik7CiAJCQlpbWctPmJsdWVjbWFwID0gKHVpbnQxNiAqKSBfVElGRm1hbGxvYyhzaXplb2YodWludDE2KSpuX2NvbG9yKTsKQEAgLTM2NCw3ICszODAsNyBAQAogCQkJX1RJRkZtZW1jcHkoIGltZy0+Z3JlZW5jbWFwLCBncmVlbl9vcmlnLCBuX2NvbG9yICogMiApOwogCQkJX1RJRkZtZW1jcHkoIGltZy0+Ymx1ZWNtYXAsIGJsdWVfb3JpZywgbl9jb2xvciAqIDIgKTsKIAotCQkJLyogZmFsbCB0aHJ1Li4uICovCisJCQkvKiBmYWxsIHRocm91Z2guLi4gKi8KIAkJY2FzZSBQSE9UT01FVFJJQ19NSU5JU1dISVRFOgogCQljYXNlIFBIT1RPTUVUUklDX01JTklTQkxBQ0s6CiAJCQlpZiAocGxhbmFyY29uZmlnID09IFBMQU5BUkNPTkZJR19DT05USUcKQEAgLTUxMiw3ICs1MjgsNyBAQAogICAgIGludCBvazsKIAogCWlmIChUSUZGUkdCQUltYWdlT0sodGlmLCBlbXNnKSAmJiBUSUZGUkdCQUltYWdlQmVnaW4oJmltZywgdGlmLCBzdG9wLCBlbXNnKSkgewotCQlpbWcucmVxX29yaWVudGF0aW9uID0gb3JpZW50YXRpb247CisJCWltZy5yZXFfb3JpZW50YXRpb24gPSAodWludDE2KW9yaWVudGF0aW9uOwogCQkvKiBYWFggdmVyaWZ5IHJ3aWR0aCBhbmQgcmhlaWdodCBhZ2FpbnN0IHdpZHRoIGFuZCBoZWlnaHQgKi8KIAkJb2sgPSBUSUZGUkdCQUltYWdlR2V0KCZpbWcsIHJhc3RlcisocmhlaWdodC1pbWcuaGVpZ2h0KSpyd2lkdGgsCiAJCQlyd2lkdGgsIGltZy5oZWlnaHQpOwpAQCAtNjExLDcgKzYyNyw3IEBACiAgICAgdWludDMyIGNvbCwgcm93LCB5LCByb3dzdG9yZWFkOwogICAgIHRtc2l6ZV90IHBvczsKICAgICB1aW50MzIgdHcsIHRoOwotICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZjsKKyAgICB1bnNpZ25lZCBjaGFyKiBidWYgPSBOVUxMOwogICAgIGludDMyIGZyb21za2V3LCB0b3NrZXc7CiAgICAgaW50NjQgc2FmZXNrZXc7CiAgICAgdWludDMyIG5yb3c7CkBAIC02MjAsMTMgKzYzNiwxNCBAQAogICAgIGludDMyIHRoaXNfdG9za2V3LCBsZWZ0bW9zdF90b3NrZXc7CiAgICAgaW50MzIgbGVmdG1vc3RfZnJvbXNrZXc7CiAgICAgdWludDMyIGxlZnRtb3N0X3R3OworICAgIHRtc2l6ZV90IGJ1ZnNpemU7CiAKLSAgICBidWYgPSAodW5zaWduZWQgY2hhciopIF9USUZGbWFsbG9jKFRJRkZUaWxlU2l6ZSh0aWYpKTsKLSAgICBpZiAoYnVmID09IDApIHsKLQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZSh0aWYpLCAiJXMiLCAiTm8gc3BhY2UgZm9yIHRpbGUgYnVmZmVyIik7Ci0JCXJldHVybiAoMCk7CisgICAgYnVmc2l6ZSA9IFRJRkZUaWxlU2l6ZSh0aWYpOworICAgIGlmIChidWZzaXplID09IDApIHsKKyAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZSh0aWYpLCAiJXMiLCAiTm8gc3BhY2UgZm9yIHRpbGUgYnVmZmVyIik7CisgICAgICAgIHJldHVybiAoMCk7CiAgICAgfQotICAgIF9USUZGbWVtc2V0KGJ1ZiwgMCwgVElGRlRpbGVTaXplKHRpZikpOworCiAgICAgVElGRkdldEZpZWxkKHRpZiwgVElGRlRBR19USUxFV0lEVEgsICZ0dyk7CiAgICAgVElGRkdldEZpZWxkKHRpZiwgVElGRlRBR19USUxFTEVOR1RILCAmdGgpOwogCkBAIC02NDMsMTQgKzY2MCwxNCBAQAogCSAgICBzYWZlc2tldyAtPSB0dzsKIAkgICAgc2FmZXNrZXcgKz13OwogICAgIH0KKyAgICAgCiAgICAgaWYoc2FmZXNrZXcgPiBJTlRfTUFYIHx8IHNhZmVza2V3IDwgSU5UX01JTil7Ci0gICAgCV9USUZGZnJlZShidWYpOwotICAgIAlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKHRpZiksICIlcyIsICJJbnZhbGlkIHNrZXciKTsKLSAgICAJcmV0dXJuICgwKTsKKyAgICAgICBfVElGRmZyZWUoYnVmKTsKKyAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKHRpZiksICIlcyIsICJJbnZhbGlkIHNrZXciKTsKKyAgICAgICByZXR1cm4gKDApOwogICAgIH0KICAgICB0b3NrZXcgPSBzYWZlc2tldzsKIAotICAgICAKICAgICAvKgogICAgICAqCUxlZnRtb3N0IHRpbGUgaXMgY2xpcHBlZCBvbiBsZWZ0IHNpZGUgaWYgY29sX29mZnNldCA+IDAuCiAgICAgICovCkBAIC02NTksMTIgKzY3NiwxMiBAQAogICAgIHNhZmVza2V3ID0gdG9za2V3OwogICAgIHNhZmVza2V3ICs9IGxlZnRtb3N0X2Zyb21za2V3OwogICAgIGlmKHNhZmVza2V3ID4gSU5UX01BWCB8fCBzYWZlc2tldyA8IElOVF9NSU4pewotICAgIAlfVElGRmZyZWUoYnVmKTsKLSAgICAJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZSh0aWYpLCAiJXMiLCAiSW52YWxpZCBza2V3Iik7Ci0gICAgCXJldHVybiAoMCk7CisgICAgICAgX1RJRkZmcmVlKGJ1Zik7CisgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZSh0aWYpLCAiJXMiLCAiSW52YWxpZCBza2V3Iik7CisgICAgICAgcmV0dXJuICgwKTsKICAgICB9CiAgICAgbGVmdG1vc3RfdG9za2V3ID0gc2FmZXNrZXc7Ci0gICAgZm9yIChyb3cgPSAwOyByb3cgPCBoOyByb3cgKz0gbnJvdykKKyAgICBmb3IgKHJvdyA9IDA7IHJldCAhPSAwICYmIHJvdyA8IGg7IHJvdyArPSBucm93KQogICAgIHsKICAgICAgICAgcm93c3RvcmVhZCA9IHRoIC0gKHJvdyArIGltZy0+cm93X29mZnNldCkgJSB0aDsKICAgICAJbnJvdyA9IChyb3cgKyByb3dzdG9yZWFkID4gaCA/IGggLSByb3cgOiByb3dzdG9yZWFkKTsKQEAgLTY3NSw4ICs2OTIsOSBAQAogCWNvbCA9IGltZy0+Y29sX29mZnNldDsKIAl3aGlsZSAodG9jb2wgPCB3KQogICAgICAgICB7Ci0JICAgIGlmIChUSUZGUmVhZFRpbGUodGlmLCBidWYsIGNvbCwgIAotCQkJICAgICByb3craW1nLT5yb3dfb2Zmc2V0LCAwLCAwKT09KHRtc2l6ZV90KSgtMSkgJiYgaW1nLT5zdG9wb25lcnIpCisJICAgIGlmIChfVElGRlJlYWRUaWxlQW5kQWxsb2NCdWZmZXIodGlmLCAodm9pZCoqKSAmYnVmLCBidWZzaXplLCBjb2wsCisJCQkgICAgIHJvdytpbWctPnJvd19vZmZzZXQsIDAsIDApPT0odG1zaXplX3QpKC0xKSAmJgorICAgICAgICAgICAgICAgIChidWYgPT0gTlVMTCB8fCBpbWctPnN0b3BvbmVycikpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTY5MiwxOCArNzEwLDE4IEBACiAJCXNhZmVza2V3IC09IHc7CiAJCXNhZmVza2V3ICs9IHRvY29sOwogCQlpZihzYWZlc2tldyA+IElOVF9NQVggfHwgc2FmZXNrZXcgPCBJTlRfTUlOKXsKLQkJCV9USUZGZnJlZShidWYpOwotCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZSh0aWYpLCAiJXMiLCAiSW52YWxpZCBza2V3Iik7Ci0JCQlyZXR1cm4gKDApOworCQkgICAgICAgIF9USUZGZnJlZShidWYpOworCQkgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUodGlmKSwgIiVzIiwgIkludmFsaWQgc2tldyIpOworCQkgICAgICAgIHJldHVybiAoMCk7CiAJCX0KIAkJZnJvbXNrZXcgPSBzYWZlc2tldzsKIAkJdGhpc190dyA9IHR3IC0gZnJvbXNrZXc7CiAJCXNhZmVza2V3ID0gdG9za2V3OwogCQlzYWZlc2tldyArPSBmcm9tc2tldzsKIAkJaWYoc2FmZXNrZXcgPiBJTlRfTUFYIHx8IHNhZmVza2V3IDwgSU5UX01JTil7Ci0JCQlfVElGRmZyZWUoYnVmKTsKLQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUodGlmKSwgIiVzIiwgIkludmFsaWQgc2tldyIpOwotCQkJcmV0dXJuICgwKTsKKwkJICAgICAgICBfVElGRmZyZWUoYnVmKTsKKwkJICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKHRpZiksICIlcyIsICJJbnZhbGlkIHNrZXciKTsKKwkJICAgICAgICByZXR1cm4gKDApOwogCQl9CiAJCXRoaXNfdG9za2V3ID0gc2FmZXNrZXc7CiAJICAgIH0KQEAgLTcxOCw3ICs3MzYsNyBAQAogCSAgICB0aGlzX3Rvc2tldyA9IHRvc2tldzsKIAl9CiAKLSAgICAgICAgeSArPSAoZmxpcCAmIEZMSVBfVkVSVElDQUxMWSA/IC0oaW50MzIpIG5yb3cgOiAoaW50MzIpIG5yb3cpOworICAgICAgICB5ICs9ICgoZmxpcCAmIEZMSVBfVkVSVElDQUxMWSkgPyAtKGludDMyKSBucm93IDogKGludDMyKSBucm93KTsKICAgICB9CiAgICAgX1RJRkZmcmVlKGJ1Zik7CiAKQEAgLTczMyw3ICs3NTEsOCBAQAogCQkJICAgIHVpbnQzMiB0ZW1wID0gKmxlZnQ7CiAJCQkgICAgKmxlZnQgPSAqcmlnaHQ7CiAJCQkgICAgKnJpZ2h0ID0gdGVtcDsKLQkJCSAgICBsZWZ0KyssIHJpZ2h0LS07CisJCQkgICAgbGVmdCsrOworCQkJCXJpZ2h0LS07CiAJCSAgICB9CiAJICAgIH0KICAgICB9CkBAIC03NTUsMTggKzc3NCwxOCBAQAogCXVpbnQzMiBjb2wsIHJvdywgeSwgcm93c3RvcmVhZDsKIAl0bXNpemVfdCBwb3M7CiAJdWludDMyIHR3LCB0aDsKLQl1bnNpZ25lZCBjaGFyKiBidWY7Ci0JdW5zaWduZWQgY2hhciogcDA7Ci0JdW5zaWduZWQgY2hhciogcDE7Ci0JdW5zaWduZWQgY2hhciogcDI7Ci0JdW5zaWduZWQgY2hhciogcGE7CisJdW5zaWduZWQgY2hhciogYnVmID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyKiBwMCA9IE5VTEw7CisJdW5zaWduZWQgY2hhciogcDEgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIqIHAyID0gTlVMTDsKKwl1bnNpZ25lZCBjaGFyKiBwYSA9IE5VTEw7CiAJdG1zaXplX3QgdGlsZXNpemU7CiAJdG1zaXplX3QgYnVmc2l6ZTsKIAlpbnQzMiBmcm9tc2tldywgdG9za2V3OwogCWludCBhbHBoYSA9IGltZy0+YWxwaGE7CiAJdWludDMyIG5yb3c7CiAJaW50IHJldCA9IDEsIGZsaXA7Ci0gICAgICAgIGludCBjb2xvcmNoYW5uZWxzOworICAgICAgICB1aW50MTYgY29sb3JjaGFubmVsczsKIAl1aW50MzIgdGhpc190dywgdG9jb2w7CiAJaW50MzIgdGhpc190b3NrZXcsIGxlZnRtb3N0X3Rvc2tldzsKIAlpbnQzMiBsZWZ0bW9zdF9mcm9tc2tldzsKQEAgLTc3OCwxNiArNzk3LDcgQEAKIAkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZSh0aWYpLCAiSW50ZWdlciBvdmVyZmxvdyBpbiAlcyIsICJndFRpbGVTZXBhcmF0ZSIpOwogCQlyZXR1cm4gKDApOwogCX0KLQlidWYgPSAodW5zaWduZWQgY2hhciopIF9USUZGbWFsbG9jKGJ1ZnNpemUpOwotCWlmIChidWYgPT0gMCkgewotCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKHRpZiksICIlcyIsICJObyBzcGFjZSBmb3IgdGlsZSBidWZmZXIiKTsKLQkJcmV0dXJuICgwKTsKLQl9Ci0JX1RJRkZtZW1zZXQoYnVmLCAwLCBidWZzaXplKTsKLQlwMCA9IGJ1ZjsKLQlwMSA9IHAwICsgdGlsZXNpemU7Ci0JcDIgPSBwMSArIHRpbGVzaXplOwotCXBhID0gKGFscGhhPyhwMit0aWxlc2l6ZSk6TlVMTCk7CisKIAlUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX1RJTEVXSURUSCwgJnR3KTsKIAlUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX1RJTEVMRU5HVEgsICZ0aCk7CiAKQEAgLTgwNyw3ICs4MTcsNiBAQAogICAgICAgICAgIGNhc2UgUEhPVE9NRVRSSUNfTUlOSVNCTEFDSzoKICAgICAgICAgICBjYXNlIFBIT1RPTUVUUklDX1BBTEVUVEU6CiAgICAgICAgICAgICBjb2xvcmNoYW5uZWxzID0gMTsKLSAgICAgICAgICAgIHAyID0gcDEgPSBwMDsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgZGVmYXVsdDoKQEAgLTgyMSw3ICs4MzAsNyBAQAogCWxlZnRtb3N0X2Zyb21za2V3ID0gaW1nLT5jb2xfb2Zmc2V0ICUgdHc7CiAJbGVmdG1vc3RfdHcgPSB0dyAtIGxlZnRtb3N0X2Zyb21za2V3OwogCWxlZnRtb3N0X3Rvc2tldyA9IHRvc2tldyArIGxlZnRtb3N0X2Zyb21za2V3OwotCWZvciAocm93ID0gMDsgcm93IDwgaDsgcm93ICs9IG5yb3cpCisJZm9yIChyb3cgPSAwOyByZXQgIT0gMCAmJiByb3cgPCBoOyByb3cgKz0gbnJvdykKIAl7CiAJCXJvd3N0b3JlYWQgPSB0aCAtIChyb3cgKyBpbWctPnJvd19vZmZzZXQpICUgdGg7CiAJCW5yb3cgPSAocm93ICsgcm93c3RvcmVhZCA+IGggPyBoIC0gcm93IDogcm93c3RvcmVhZCk7CkBAIC04MzIsNyArODQxLDMwIEBACiAJCWNvbCA9IGltZy0+Y29sX29mZnNldDsKIAkJd2hpbGUgKHRvY29sIDwgdykKIAkJewotCQkJaWYgKFRJRkZSZWFkVGlsZSh0aWYsIHAwLCBjb2wsICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBidWYgPT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9USUZGUmVhZFRpbGVBbmRBbGxvY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZiwgKHZvaWQqKikgJmJ1ZiwgYnVmc2l6ZSwgY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93K2ltZy0+cm93X29mZnNldCwwLDApPT0odG1zaXplX3QpKC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoYnVmID09IE5VTEwgfHwgaW1nLT5zdG9wb25lcnIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDAgPSBidWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNvbG9yY2hhbm5lbHMgPT0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMiA9IHAxID0gcDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhID0gKGFscGhhPyhwMCszKnRpbGVzaXplKTpOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcDEgPSBwMCArIHRpbGVzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMiA9IHAxICsgdGlsZXNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhID0gKGFscGhhPyhwMit0aWxlc2l6ZSk6TlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJZWxzZSBpZiAoVElGRlJlYWRUaWxlKHRpZiwgcDAsIGNvbCwgIAogCQkJICAgIHJvdytpbWctPnJvd19vZmZzZXQsMCwwKT09KHRtc2l6ZV90KSgtMSkgJiYgaW1nLT5zdG9wb25lcnIpCiAJCQl7CiAJCQkJcmV0ID0gMDsKQEAgLTg4Niw3ICs5MTgsNyBAQAogCQkJdGhpc190b3NrZXcgPSB0b3NrZXc7CiAJCX0KIAotCQl5ICs9IChmbGlwICYgRkxJUF9WRVJUSUNBTExZID8tKGludDMyKSBucm93IDogKGludDMyKSBucm93KTsKKwkJeSArPSAoKGZsaXAgJiBGTElQX1ZFUlRJQ0FMTFkpID8tKGludDMyKSBucm93IDogKGludDMyKSBucm93KTsKIAl9CiAKIAlpZiAoZmxpcCAmIEZMSVBfSE9SSVpPTlRBTExZKSB7CkBAIC05MDAsNyArOTMyLDggQEAKIAkJCQl1aW50MzIgdGVtcCA9ICpsZWZ0OwogCQkJCSpsZWZ0ID0gKnJpZ2h0OwogCQkJCSpyaWdodCA9IHRlbXA7Ci0JCQkJbGVmdCsrLCByaWdodC0tOworCQkJCWxlZnQrKzsKKwkJCQlyaWdodC0tOwogCQkJfQogCQl9CiAJfQpAQCAtOTIyLDEzICs5NTUsMTQgQEAKIAl0aWxlQ29udGlnUm91dGluZSBwdXQgPSBpbWctPnB1dC5jb250aWc7CiAJdWludDMyIHJvdywgeSwgbnJvdywgbnJvd3N1Yiwgcm93c3RvcmVhZDsKIAl0bXNpemVfdCBwb3M7Ci0JdW5zaWduZWQgY2hhciogYnVmOworCXVuc2lnbmVkIGNoYXIqIGJ1ZiA9IE5VTEw7CiAJdWludDMyIHJvd3NwZXJzdHJpcDsKIAl1aW50MTYgc3Vic2FtcGxpbmdob3Isc3Vic2FtcGxpbmd2ZXI7CiAJdWludDMyIGltYWdld2lkdGggPSBpbWctPndpZHRoOwogCXRtc2l6ZV90IHNjYW5saW5lOwogCWludDMyIGZyb21za2V3LCB0b3NrZXc7CiAJaW50IHJldCA9IDEsIGZsaXA7CisJdG1zaXplX3QgbWF4c3RyaXBzaXplOwogCiAJVElGRkdldEZpZWxkRGVmYXVsdGVkKHRpZiwgVElGRlRBR19ZQ0JDUlNVQlNBTVBMSU5HLCAmc3Vic2FtcGxpbmdob3IsICZzdWJzYW1wbGluZ3Zlcik7CiAJaWYoIHN1YnNhbXBsaW5ndmVyID09IDAgKSB7CkBAIC05MzYsMTIgKzk3MCw3IEBACiAJCXJldHVybiAoMCk7CiAJfQogCi0JYnVmID0gKHVuc2lnbmVkIGNoYXIqKSBfVElGRm1hbGxvYyhUSUZGU3RyaXBTaXplKHRpZikpOwotCWlmIChidWYgPT0gMCkgewotCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKHRpZiksICJObyBzcGFjZSBmb3Igc3RyaXAgYnVmZmVyIik7Ci0JCXJldHVybiAoMCk7Ci0JfQotCV9USUZGbWVtc2V0KGJ1ZiwgMCwgVElGRlN0cmlwU2l6ZSh0aWYpKTsKKwltYXhzdHJpcHNpemUgPSBUSUZGU3RyaXBTaXplKHRpZik7CiAKIAlmbGlwID0gc2V0b3JpZW50YXRpb24oaW1nKTsKIAlpZiAoZmxpcCAmIEZMSVBfVkVSVElDQUxMWSkgewpAQCAtOTYzLDExICs5OTIsMTIgQEAKIAkJbnJvd3N1YiA9IG5yb3c7CiAJCWlmICgobnJvd3N1YiVzdWJzYW1wbGluZ3ZlcikhPTApCiAJCQlucm93c3ViKz1zdWJzYW1wbGluZ3Zlci1ucm93c3ViJXN1YnNhbXBsaW5ndmVyOwotCQlpZiAoVElGRlJlYWRFbmNvZGVkU3RyaXAodGlmLAorCQlpZiAoX1RJRkZSZWFkRW5jb2RlZFN0cmlwQW5kQWxsb2NCdWZmZXIodGlmLAogCQkgICAgVElGRkNvbXB1dGVTdHJpcCh0aWYscm93K2ltZy0+cm93X29mZnNldCwgMCksCi0JCSAgICBidWYsCisJCSAgICAodm9pZCoqKSgmYnVmKSwKKwkJICAgIG1heHN0cmlwc2l6ZSwKIAkJICAgICgocm93ICsgaW1nLT5yb3dfb2Zmc2V0KSVyb3dzcGVyc3RyaXAgKyBucm93c3ViKSAqIHNjYW5saW5lKT09KHRtc2l6ZV90KSgtMSkKLQkJICAgICYmIGltZy0+c3RvcG9uZXJyKQorCQkgICAgJiYgKGJ1ZiA9PSBOVUxMIHx8IGltZy0+c3RvcG9uZXJyKSkKIAkJewogCQkJcmV0ID0gMDsKIAkJCWJyZWFrOwpAQCAtOTc2LDcgKzEwMDYsNyBAQAogCQlwb3MgPSAoKHJvdyArIGltZy0+cm93X29mZnNldCkgJSByb3dzcGVyc3RyaXApICogc2NhbmxpbmUgKyBcCiAJCQkoKHRtc2l6ZV90KSBpbWctPmNvbF9vZmZzZXQgKiBpbWctPnNhbXBsZXNwZXJwaXhlbCk7CiAJCSgqcHV0KShpbWcsIHJhc3Rlcit5KncsIDAsIHksIHcsIG5yb3csIGZyb21za2V3LCB0b3NrZXcsIGJ1ZiArIHBvcyk7Ci0JCXkgKz0gKGZsaXAgJiBGTElQX1ZFUlRJQ0FMTFkgPyAtKGludDMyKSBucm93IDogKGludDMyKSBucm93KTsKKwkJeSArPSAoKGZsaXAgJiBGTElQX1ZFUlRJQ0FMTFkpID8gLShpbnQzMikgbnJvdyA6IChpbnQzMikgbnJvdyk7CiAJfQogCiAJaWYgKGZsaXAgJiBGTElQX0hPUklaT05UQUxMWSkgewpAQCAtOTkwLDcgKzEwMjAsOCBAQAogCQkJCXVpbnQzMiB0ZW1wID0gKmxlZnQ7CiAJCQkJKmxlZnQgPSAqcmlnaHQ7CiAJCQkJKnJpZ2h0ID0gdGVtcDsKLQkJCQlsZWZ0KyssIHJpZ2h0LS07CisJCQkJbGVmdCsrOworCQkJCXJpZ2h0LS07CiAJCQl9CiAJCX0KIAl9CkBAIC0xMDEwLDggKzEwNDEsOCBAQAogewogCVRJRkYqIHRpZiA9IGltZy0+dGlmOwogCXRpbGVTZXBhcmF0ZVJvdXRpbmUgcHV0ID0gaW1nLT5wdXQuc2VwYXJhdGU7Ci0JdW5zaWduZWQgY2hhciAqYnVmOwotCXVuc2lnbmVkIGNoYXIgKnAwLCAqcDEsICpwMiwgKnBhOworCXVuc2lnbmVkIGNoYXIgKmJ1ZiA9IE5VTEw7CisJdW5zaWduZWQgY2hhciAqcDAgPSBOVUxMLCAqcDEgPSBOVUxMLCAqcDIgPSBOVUxMLCAqcGEgPSBOVUxMOwogCXVpbnQzMiByb3csIHksIG5yb3csIHJvd3N0b3JlYWQ7CiAJdG1zaXplX3QgcG9zOwogCXRtc2l6ZV90IHNjYW5saW5lOwpAQCAtMTAyMSw3ICsxMDUyLDggQEAKIAl0bXNpemVfdCBidWZzaXplOwogCWludDMyIGZyb21za2V3LCB0b3NrZXc7CiAJaW50IGFscGhhID0gaW1nLT5hbHBoYTsKLQlpbnQgcmV0ID0gMSwgZmxpcCwgY29sb3JjaGFubmVsczsKKwlpbnQgcmV0ID0gMSwgZmxpcDsKKyAgICAgICAgdWludDE2IGNvbG9yY2hhbm5lbHM7CiAKIAlzdHJpcHNpemUgPSBUSUZGU3RyaXBTaXplKHRpZik7ICAKIAlidWZzaXplID0gVElGRlNhZmVNdWx0aXBseSh0bXNpemVfdCxhbHBoYT80OjMsc3RyaXBzaXplKTsKQEAgLTEwMjksMTUgKzEwNjEsNiBAQAogCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKHRpZiksICJJbnRlZ2VyIG92ZXJmbG93IGluICVzIiwgImd0U3RyaXBTZXBhcmF0ZSIpOwogCQlyZXR1cm4gKDApOwogCX0KLQlwMCA9IGJ1ZiA9ICh1bnNpZ25lZCBjaGFyICopX1RJRkZtYWxsb2MoYnVmc2l6ZSk7Ci0JaWYgKGJ1ZiA9PSAwKSB7Ci0JCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUodGlmKSwgIk5vIHNwYWNlIGZvciB0aWxlIGJ1ZmZlciIpOwotCQlyZXR1cm4gKDApOwotCX0KLQlfVElGRm1lbXNldChidWYsIDAsIGJ1ZnNpemUpOwotCXAxID0gcDAgKyBzdHJpcHNpemU7Ci0JcDIgPSBwMSArIHN0cmlwc2l6ZTsKLQlwYSA9IChhbHBoYT8ocDIrc3RyaXBzaXplKTpOVUxMKTsKIAogCWZsaXAgPSBzZXRvcmllbnRhdGlvbihpbWcpOwogCWlmIChmbGlwICYgRkxJUF9WRVJUSUNBTExZKSB7CkBAIC0xMDU1LDcgKzEwNzgsNiBAQAogICAgICAgICAgIGNhc2UgUEhPVE9NRVRSSUNfTUlOSVNCTEFDSzoKICAgICAgICAgICBjYXNlIFBIT1RPTUVUUklDX1BBTEVUVEU6CiAgICAgICAgICAgICBjb2xvcmNoYW5uZWxzID0gMTsKLSAgICAgICAgICAgIHAyID0gcDEgPSBwMDsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgICAgZGVmYXVsdDoKQEAgLTEwNzEsNyArMTA5MywzMSBAQAogCQlyb3dzdG9yZWFkID0gcm93c3BlcnN0cmlwIC0gKHJvdyArIGltZy0+cm93X29mZnNldCkgJSByb3dzcGVyc3RyaXA7CiAJCW5yb3cgPSAocm93ICsgcm93c3RvcmVhZCA+IGggPyBoIC0gcm93IDogcm93c3RvcmVhZCk7CiAJCW9mZnNldF9yb3cgPSByb3cgKyBpbWctPnJvd19vZmZzZXQ7Ci0JCWlmIChUSUZGUmVhZEVuY29kZWRTdHJpcCh0aWYsIFRJRkZDb21wdXRlU3RyaXAodGlmLCBvZmZzZXRfcm93LCAwKSwKKyAgICAgICAgICAgICAgICBpZiggYnVmID09IE5VTEwgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9USUZGUmVhZEVuY29kZWRTdHJpcEFuZEFsbG9jQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpZiwgVElGRkNvbXB1dGVTdHJpcCh0aWYsIG9mZnNldF9yb3csIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKiopICZidWYsIGJ1ZnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChyb3cgKyBpbWctPnJvd19vZmZzZXQpJXJvd3NwZXJzdHJpcCArIG5yb3cpICogc2NhbmxpbmUpPT0odG1zaXplX3QpKC0xKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGJ1ZiA9PSBOVUxMIHx8IGltZy0+c3RvcG9uZXJyKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcDAgPSBidWY7CisgICAgICAgICAgICAgICAgICAgIGlmKCBjb2xvcmNoYW5uZWxzID09IDEgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwMiA9IHAxID0gcDA7CisgICAgICAgICAgICAgICAgICAgICAgICBwYSA9IChhbHBoYT8ocDArMypzdHJpcHNpemUpOk5VTEwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcDEgPSBwMCArIHN0cmlwc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAyID0gcDEgKyBzdHJpcHNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBwYSA9IChhbHBoYT8ocDIrc3RyaXBzaXplKTpOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwkJZWxzZSBpZiAoVElGRlJlYWRFbmNvZGVkU3RyaXAodGlmLCBUSUZGQ29tcHV0ZVN0cmlwKHRpZiwgb2Zmc2V0X3JvdywgMCksCiAJCSAgICBwMCwgKChyb3cgKyBpbWctPnJvd19vZmZzZXQpJXJvd3NwZXJzdHJpcCArIG5yb3cpICogc2NhbmxpbmUpPT0odG1zaXplX3QpKC0xKQogCQkgICAgJiYgaW1nLT5zdG9wb25lcnIpCiAJCXsKQEAgLTExMDksNyArMTE1NSw3IEBACiAJCQkoKHRtc2l6ZV90KSBpbWctPmNvbF9vZmZzZXQgKiBpbWctPnNhbXBsZXNwZXJwaXhlbCk7CiAJCSgqcHV0KShpbWcsIHJhc3Rlcit5KncsIDAsIHksIHcsIG5yb3csIGZyb21za2V3LCB0b3NrZXcsIHAwICsgcG9zLCBwMSArIHBvcywKIAkJICAgIHAyICsgcG9zLCAoYWxwaGE/KHBhK3Bvcyk6TlVMTCkpOwotCQl5ICs9IChmbGlwICYgRkxJUF9WRVJUSUNBTExZID8gLShpbnQzMikgbnJvdyA6IChpbnQzMikgbnJvdyk7CisJCXkgKz0gKChmbGlwICYgRkxJUF9WRVJUSUNBTExZKSA/IC0oaW50MzIpIG5yb3cgOiAoaW50MzIpIG5yb3cpOwogCX0KIAogCWlmIChmbGlwICYgRkxJUF9IT1JJWk9OVEFMTFkpIHsKQEAgLTExMjMsNyArMTE2OSw4IEBACiAJCQkJdWludDMyIHRlbXAgPSAqbGVmdDsKIAkJCQkqbGVmdCA9ICpyaWdodDsKIAkJCQkqcmlnaHQgPSB0ZW1wOwotCQkJCWxlZnQrKywgcmlnaHQtLTsKKwkJCQlsZWZ0Kys7CisJCQkJcmlnaHQtLTsKIAkJCX0KIAkJfQogCX0KQEAgLTExNDcsMTEgKzExOTQsMTUgQEAKICNkZWZpbmUJUkVQRUFUMihvcCkJb3A7IG9wCiAjZGVmaW5lCUNBU0U4KHgsb3ApCQkJXAogICAgIHN3aXRjaCAoeCkgewkJCVwKLSAgICBjYXNlIDc6IG9wOyBjYXNlIDY6IG9wOyBjYXNlIDU6IG9wOwlcCi0gICAgY2FzZSA0OiBvcDsgY2FzZSAzOiBvcDsgY2FzZSAyOiBvcDsJXAorICAgIGNhc2UgNzogb3A7IC8qLWZhbGx0aHJvdWdoKi8gXAorICAgIGNhc2UgNjogb3A7IC8qLWZhbGx0aHJvdWdoKi8gXAorICAgIGNhc2UgNTogb3A7IC8qLWZhbGx0aHJvdWdoKi8gXAorICAgIGNhc2UgNDogb3A7IC8qLWZhbGx0aHJvdWdoKi8gXAorICAgIGNhc2UgMzogb3A7IC8qLWZhbGx0aHJvdWdoKi8gXAorICAgIGNhc2UgMjogb3A7IC8qLWZhbGx0aHJvdWdoKi8gXAogICAgIGNhc2UgMTogb3A7CQkJCVwKICAgICB9Ci0jZGVmaW5lCUNBU0U0KHgsb3ApCXN3aXRjaCAoeCkgeyBjYXNlIDM6IG9wOyBjYXNlIDI6IG9wOyBjYXNlIDE6IG9wOyB9CisjZGVmaW5lCUNBU0U0KHgsb3ApCXN3aXRjaCAoeCkgeyBjYXNlIDM6IG9wOyAvKi1mYWxsdGhyb3VnaCovIGNhc2UgMjogb3A7IC8qLWZhbGx0aHJvdWdoKi8gY2FzZSAxOiBvcDsgfQogI2RlZmluZQlOT1AKIAogI2RlZmluZQlVTlJPTEw4KHcsIG9wMSwgb3AyKSB7CQlcCkBAIC0xNDUxLDcgKzE1MDIsNyBAQAogCQl1aW50OCogbTsKIAkJZm9yICh4ID0gdzsgeC0tID4gMDspIHsKIAkJCWEgPSBwcFszXTsKLQkJCW0gPSBpbWctPlVhVG9BYSsoYTw8OCk7CisJCQltID0gaW1nLT5VYVRvQWErKChzaXplX3QpIGE8PDgpOwogCQkJciA9IG1bcHBbMF1dOwogCQkJZyA9IG1bcHBbMV1dOwogCQkJYiA9IG1bcHBbMl1dOwpAQCAtMTUyMiw3ICsxNTczLDcgQEAKIAkJdWludDgqIG07CiAJCWZvciAoeCA9IHc7IHgtLSA+IDA7KSB7CiAJCQlhID0gaW1nLT5CaXRkZXB0aDE2VG84W3dwWzNdXTsKLQkJCW0gPSBpbWctPlVhVG9BYSsoYTw8OCk7CisJCQltID0gaW1nLT5VYVRvQWErKChzaXplX3QpIGE8PDgpOwogCQkJciA9IG1baW1nLT5CaXRkZXB0aDE2VG84W3dwWzBdXV07CiAJCQlnID0gbVtpbWctPkJpdGRlcHRoMTZUbzhbd3BbMV1dXTsKIAkJCWIgPSBtW2ltZy0+Qml0ZGVwdGgxNlRvOFt3cFsyXV1dOwpAQCAtMTY1Myw3ICsxNzA0LDcgQEAKIAkJdWludDgqIG07CiAJCWZvciAoeCA9IHc7IHgtLSA+IDA7KSB7CiAJCQlhdiA9ICphKys7Ci0JCQltID0gaW1nLT5VYVRvQWErKGF2PDw4KTsKKwkJCW0gPSBpbWctPlVhVG9BYSsoKHNpemVfdCkgYXY8PDgpOwogCQkJcnYgPSBtWypyKytdOwogCQkJZ3YgPSBtWypnKytdOwogCQkJYnYgPSBtWypiKytdOwpAQCAtMTcxNSwxNSArMTc2NiwxNSBAQAogCXVpbnQxNiAqd2EgPSAodWludDE2KikgYTsKIAkodm9pZCkgaW1nOyAodm9pZCkgeTsKIAl3aGlsZSAoaC0tID4gMCkgewotCQl1aW50MzIgcixnLGIsYTsKKwkJdWludDMyIHIyLGcyLGIyLGEyOwogCQl1aW50OCogbTsKIAkJZm9yICh4ID0gdzsgeC0tID4gMDspIHsKLQkJCWEgPSBpbWctPkJpdGRlcHRoMTZUbzhbKndhKytdOwotCQkJbSA9IGltZy0+VWFUb0FhKyhhPDw4KTsKLQkJCXIgPSBtW2ltZy0+Qml0ZGVwdGgxNlRvOFsqd3IrK11dOwotCQkJZyA9IG1baW1nLT5CaXRkZXB0aDE2VG84Wyp3ZysrXV07Ci0JCQliID0gbVtpbWctPkJpdGRlcHRoMTZUbzhbKndiKytdXTsKLQkJCSpjcCsrID0gUEFDSzQocixnLGIsYSk7CisJCQlhMiA9IGltZy0+Qml0ZGVwdGgxNlRvOFsqd2ErK107CisJCQltID0gaW1nLT5VYVRvQWErKChzaXplX3QpIGEyPDw4KTsKKwkJCXIyID0gbVtpbWctPkJpdGRlcHRoMTZUbzhbKndyKytdXTsKKwkJCWcyID0gbVtpbWctPkJpdGRlcHRoMTZUbzhbKndnKytdXTsKKwkJCWIyID0gbVtpbWctPkJpdGRlcHRoMTZUbzhbKndiKytdXTsKKwkJCSpjcCsrID0gUEFDSzQocjIsZzIsYjIsYTIpOwogCQl9CiAJCVNLRVc0KHdyLCB3Zywgd2IsIHdhLCBmcm9tc2tldyk7CiAJCWNwICs9IHRvc2tldzsKQEAgLTE4NzgsMTAgKzE5MjksMTYgQEAKICAgICAgICAgICAgICAgICBZQ2JDcnRvUkdCKGNwM1syXSwgcHBbMTRdKTsKICAgICAgICAgICAgICAgICBZQ2JDcnRvUkdCKGNwM1szXSwgcHBbMTVdKTsKIAotICAgICAgICAgICAgICAgIGNwICs9IDQsIGNwMSArPSA0LCBjcDIgKz0gNCwgY3AzICs9IDQ7CisgICAgICAgICAgICAgICAgY3AgKz0gNDsKKyAgICAgICAgICAgICAgICBjcDEgKz0gNDsKKyAgICAgICAgICAgICAgICBjcDIgKz0gNDsKKyAgICAgICAgICAgICAgICBjcDMgKz0gNDsKICAgICAgICAgICAgICAgICBwcCArPSAxODsKICAgICAgICAgICAgIH0gd2hpbGUgKC0teCk7Ci0gICAgICAgICAgICBjcCArPSBpbmNyLCBjcDEgKz0gaW5jciwgY3AyICs9IGluY3IsIGNwMyArPSBpbmNyOworICAgICAgICAgICAgY3AgKz0gaW5jcjsKKyAgICAgICAgICAgIGNwMSArPSBpbmNyOworICAgICAgICAgICAgY3AyICs9IGluY3I7CisgICAgICAgICAgICBjcDMgKz0gaW5jcjsKICAgICAgICAgICAgIHBwICs9IGZyb21za2V3OwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTE5MzIsNyArMTk4OSwxMCBAQAogICAgICAgICAgICAgaWYgKGggPD0gNCkKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGggLT0gNDsKLSAgICAgICAgICAgIGNwICs9IGluY3IsIGNwMSArPSBpbmNyLCBjcDIgKz0gaW5jciwgY3AzICs9IGluY3I7CisgICAgICAgICAgICBjcCArPSBpbmNyOworICAgICAgICAgICAgY3AxICs9IGluY3I7CisgICAgICAgICAgICBjcDIgKz0gaW5jcjsKKyAgICAgICAgICAgIGNwMyArPSBpbmNyOwogICAgICAgICAgICAgcHAgKz0gZnJvbXNrZXc7CiAgICAgICAgIH0KICAgICB9CkBAIC0xOTY0LDEwICsyMDI0LDEyIEBACiAgICAgICAgICAgICAgICAgWUNiQ3J0b1JHQihjcDFbMl0sIHBwWzZdKTsKICAgICAgICAgICAgICAgICBZQ2JDcnRvUkdCKGNwMVszXSwgcHBbN10pOwogICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGNwICs9IDQsIGNwMSArPSA0OworICAgICAgICAgICAgICAgIGNwICs9IDQ7CisgICAgICAgICAgICAgICAgY3AxICs9IDQ7CiAgICAgICAgICAgICAgICAgcHAgKz0gMTA7CiAgICAgICAgICAgICB9IHdoaWxlICgtLXgpOwotICAgICAgICAgICAgY3AgKz0gaW5jciwgY3AxICs9IGluY3I7CisgICAgICAgICAgICBjcCArPSBpbmNyOworICAgICAgICAgICAgY3AxICs9IGluY3I7CiAgICAgICAgICAgICBwcCArPSBmcm9tc2tldzsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC0yMDEwLDcgKzIwNzIsOCBAQAogICAgICAgICAgICAgaWYgKGggPD0gMikKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGggLT0gMjsKLSAgICAgICAgICAgIGNwICs9IGluY3IsIGNwMSArPSBpbmNyOworICAgICAgICAgICAgY3AgKz0gaW5jcjsKKyAgICAgICAgICAgIGNwMSArPSBpbmNyOwogICAgICAgICAgICAgcHAgKz0gZnJvbXNrZXc7CiAgICAgICAgIH0KICAgICB9CkBAIC0yMDQ1LDkgKzIxMDgsOSBAQAogCSAgICBpbnQzMiBDciA9IHBwWzVdOwogCiAgICAgICAgICAgICBzd2l0Y2goICh3JjMpICkgewotICAgICAgICAgICAgICBjYXNlIDM6IFlDYkNydG9SR0IoY3AgWzJdLCBwcFsyXSk7Ci0gICAgICAgICAgICAgIGNhc2UgMjogWUNiQ3J0b1JHQihjcCBbMV0sIHBwWzFdKTsKLSAgICAgICAgICAgICAgY2FzZSAxOiBZQ2JDcnRvUkdCKGNwIFswXSwgcHBbMF0pOworICAgICAgICAgICAgICBjYXNlIDM6IFlDYkNydG9SR0IoY3AgWzJdLCBwcFsyXSk7IC8qLWZhbGx0aHJvdWdoKi8KKyAgICAgICAgICAgICAgY2FzZSAyOiBZQ2JDcnRvUkdCKGNwIFsxXSwgcHBbMV0pOyAvKi1mYWxsdGhyb3VnaCovCisgICAgICAgICAgICAgIGNhc2UgMTogWUNiQ3J0b1JHQihjcCBbMF0sIHBwWzBdKTsgLyotZmFsbHRocm91Z2gqLwogICAgICAgICAgICAgICBjYXNlIDA6IGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0yMjM3LDYgKzIzMDAsMTEgQEAKIH0KICN1bmRlZiBZQ2JDcnRvUkdCCiAKK3N0YXRpYyBpbnQgaXNJblJlZkJsYWNrV2hpdGVSYW5nZShmbG9hdCBmKQoreworICAgIHJldHVybiBmID49IChmbG9hdCkoLTB4N0ZGRkZGRkYgKyAxMjgpICYmIGYgPD0gKGZsb2F0KTB4N0ZGRkZGRkY7Cit9CisKIHN0YXRpYyBpbnQKIGluaXRZQ2JDckNvbnZlcnNpb24oVElGRlJHQkFJbWFnZSogaW1nKQogewpAQCAtMjI2MSw2ICsyMzI5LDMxIEBACiAJVElGRkdldEZpZWxkRGVmYXVsdGVkKGltZy0+dGlmLCBUSUZGVEFHX1lDQkNSQ09FRkZJQ0lFTlRTLCAmbHVtYSk7CiAJVElGRkdldEZpZWxkRGVmYXVsdGVkKGltZy0+dGlmLCBUSUZGVEFHX1JFRkVSRU5DRUJMQUNLV0hJVEUsCiAJICAgICZyZWZCbGFja1doaXRlKTsKKworICAgICAgICAvKiBEbyBzb21lIHZhbGlkYXRpb24gdG8gYXZvaWQgbGF0ZXIgaXNzdWVzLiBEZXRlY3QgTmFOIGZvciBub3cgKi8KKyAgICAgICAgLyogYW5kIGFsc28gaWYgbHVtYUdyZWVuIGlzIHplcm8gc2luY2Ugd2UgZGl2aWRlIGJ5IGl0IGxhdGVyICovCisgICAgICAgIGlmKCBsdW1hWzBdICE9IGx1bWFbMF0gfHwKKyAgICAgICAgICAgIGx1bWFbMV0gIT0gbHVtYVsxXSB8fAorICAgICAgICAgICAgbHVtYVsxXSA9PSAwLjAgfHwKKyAgICAgICAgICAgIGx1bWFbMl0gIT0gbHVtYVsyXSApCisgICAgICAgIHsKKyAgICAgICAgICAgIFRJRkZFcnJvckV4dChpbWctPnRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAiSW52YWxpZCB2YWx1ZXMgZm9yIFlDYkNyQ29lZmZpY2llbnRzIHRhZyIpOworICAgICAgICAgICAgcmV0dXJuICgwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhaXNJblJlZkJsYWNrV2hpdGVSYW5nZShyZWZCbGFja1doaXRlWzBdKSB8fAorICAgICAgICAgICAgIWlzSW5SZWZCbGFja1doaXRlUmFuZ2UocmVmQmxhY2tXaGl0ZVsxXSkgfHwKKyAgICAgICAgICAgICFpc0luUmVmQmxhY2tXaGl0ZVJhbmdlKHJlZkJsYWNrV2hpdGVbMl0pIHx8CisgICAgICAgICAgICAhaXNJblJlZkJsYWNrV2hpdGVSYW5nZShyZWZCbGFja1doaXRlWzNdKSB8fAorICAgICAgICAgICAgIWlzSW5SZWZCbGFja1doaXRlUmFuZ2UocmVmQmxhY2tXaGl0ZVs0XSkgfHwKKyAgICAgICAgICAgICFpc0luUmVmQmxhY2tXaGl0ZVJhbmdlKHJlZkJsYWNrV2hpdGVbNV0pICkKKyAgICAgICAgeworICAgICAgICAgICAgVElGRkVycm9yRXh0KGltZy0+dGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorICAgICAgICAgICAgICAgICJJbnZhbGlkIHZhbHVlcyBmb3IgUmVmZXJlbmNlQmxhY2tXaGl0ZSB0YWciKTsKKyAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgIH0KKwogCWlmIChUSUZGWUNiQ3JUb1JHQkluaXQoaW1nLT55Y2JjciwgbHVtYSwgcmVmQmxhY2tXaGl0ZSkgPCAwKQogCQlyZXR1cm4oMCk7CiAJcmV0dXJuICgxKTsKQEAgLTIzOTksNyArMjQ5Miw4IEBACiAJaWYgKCFtYWtlYndtYXAoaW1nKSkKIAkgICAgcmV0dXJuICgwKTsKIAkvKiBubyBsb25nZXIgbmVlZCBNYXAsIGZyZWUgaXQgKi8KLQlfVElGRmZyZWUoaW1nLT5NYXApLCBpbWctPk1hcCA9IE5VTEw7CisJX1RJRkZmcmVlKGltZy0+TWFwKTsKKwlpbWctPk1hcCA9IE5VTEw7CiAgICAgfQogICAgIHJldHVybiAoMSk7CiB9CkBAIC0yNTA3LDcgKzI2MDEsNyBAQAogICAgIGNhc2UgUEhPVE9NRVRSSUNfU0VQQVJBVEVEOgogCWlmIChpbWctPmJpdHNwZXJzYW1wbGUgPT0gOCkKIAkgICAgYnJlYWs7Ci0JLyogZmFsbCB0aHJ1Li4uICovCisJLyogZmFsbCB0aHJvdWdoLi4uICovCiAgICAgY2FzZSBQSE9UT01FVFJJQ19NSU5JU0JMQUNLOgogICAgIGNhc2UgUEhPVE9NRVRSSUNfTUlOSVNXSElURToKIAlpZiAoIXNldHVwTWFwKGltZykpCkBAIC0yNzc3LDcgKzI4NzEsNyBAQAogCWZvciAobmE9MDsgbmE8MjU2OyBuYSsrKQogCXsKIAkJZm9yIChudj0wOyBudjwyNTY7IG52KyspCi0JCQkqbSsrPShudipuYSsxMjcpLzI1NTsKKwkJCSptKys9KHVpbnQ4KSgobnYqbmErMTI3KS8yNTUpOwogCX0KIAlyZXR1cm4oMSk7CiB9CkBAIC0yNzk3LDcgKzI4OTEsNyBAQAogCX0KIAltPWltZy0+Qml0ZGVwdGgxNlRvODsKIAlmb3IgKG49MDsgbjw2NTUzNjsgbisrKQotCQkqbSsrPShuKzEyOCkvMjU3OworCQkqbSsrPSh1aW50OCkoKG4rMTI4KS8yNTcpOwogCXJldHVybigxKTsKIH0KIApAQCAtMjgxNCw2ICsyOTA4LDEzIEBACiBUSUZGUmVhZFJHQkFTdHJpcChUSUZGKiB0aWYsIHVpbnQzMiByb3csIHVpbnQzMiAqIHJhc3RlciApCiAKIHsKKyAgICByZXR1cm4gVElGRlJlYWRSR0JBU3RyaXBFeHQodGlmLCByb3csIHJhc3RlciwgMCApOworfQorCitpbnQKK1RJRkZSZWFkUkdCQVN0cmlwRXh0KFRJRkYqIHRpZiwgdWludDMyIHJvdywgdWludDMyICogcmFzdGVyLCBpbnQgc3RvcF9vbl9lcnJvcikKKworewogICAgIGNoYXIgCWVtc2dbMTAyNF0gPSAiIjsKICAgICBUSUZGUkdCQUltYWdlIGltZzsKICAgICBpbnQgCW9rOwpAQCAtMjgzNCw3ICsyOTM1LDcgQEAKIAkJcmV0dXJuICgwKTsKICAgICB9CiAKLSAgICBpZiAoVElGRlJHQkFJbWFnZU9LKHRpZiwgZW1zZykgJiYgVElGRlJHQkFJbWFnZUJlZ2luKCZpbWcsIHRpZiwgMCwgZW1zZykpIHsKKyAgICBpZiAoVElGRlJHQkFJbWFnZU9LKHRpZiwgZW1zZykgJiYgVElGRlJHQkFJbWFnZUJlZ2luKCZpbWcsIHRpZiwgc3RvcF9vbl9lcnJvciwgZW1zZykpIHsKIAogICAgICAgICBpbWcucm93X29mZnNldCA9IHJvdzsKICAgICAgICAgaW1nLmNvbF9vZmZzZXQgPSAwOwpAQCAtMjg2NSw2ICsyOTY2LDEzIEBACiBUSUZGUmVhZFJHQkFUaWxlKFRJRkYqIHRpZiwgdWludDMyIGNvbCwgdWludDMyIHJvdywgdWludDMyICogcmFzdGVyKQogCiB7CisgICAgcmV0dXJuIFRJRkZSZWFkUkdCQVRpbGVFeHQodGlmLCBjb2wsIHJvdywgcmFzdGVyLCAwICk7Cit9CisKKworaW50CitUSUZGUmVhZFJHQkFUaWxlRXh0KFRJRkYqIHRpZiwgdWludDMyIGNvbCwgdWludDMyIHJvdywgdWludDMyICogcmFzdGVyLCBpbnQgc3RvcF9vbl9lcnJvciApCit7CiAgICAgY2hhciAJZW1zZ1sxMDI0XSA9ICIiOwogICAgIFRJRkZSR0JBSW1hZ2UgaW1nOwogICAgIGludCAJb2s7CkBAIC0yODk5LDcgKzMwMDcsNyBAQAogICAgICAqLwogICAgIAogICAgIGlmICghVElGRlJHQkFJbWFnZU9LKHRpZiwgZW1zZykgCi0JfHwgIVRJRkZSR0JBSW1hZ2VCZWdpbigmaW1nLCB0aWYsIDAsIGVtc2cpKSB7CisJfHwgIVRJRkZSR0JBSW1hZ2VCZWdpbigmaW1nLCB0aWYsIHN0b3Bfb25fZXJyb3IsIGVtc2cpKSB7CiAJICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBUSUZGRmlsZU5hbWUodGlmKSwgIiVzIiwgZW1zZyk7CiAJICAgIHJldHVybiggMCApOwogICAgIH0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2pwZWcuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2pwZWcuYwppbmRleCA2NjU5OTA5Li5kZjA2ZTAzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9qcGVnLmMKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfanBlZy5jCkBAIC0xLDQgKzEsNCBAQAotLyogJElkOiB0aWZfanBlZy5jLHYgMS4xMTkgMjAxNS0wOC0xNSAyMDoxMzowNyBiZnJpZXNlbiBFeHAgJCAqLworLyogJElkOiB0aWZfanBlZy5jLHYgMS4xMjcgMjAxNy0wMS0zMSAxMzowMjoyNyBlcm91YXVsdCBFeHAgJCAqLwogCiAvKgogICogQ29weXJpZ2h0IChjKSAxOTk0LTE5OTcgU2FtIExlZmZsZXIKQEAgLTU4LDcgKzU4LDcgQEAKICAgTGlianBlZydzIGptb3JlY2ZnLmggZGVmaW5lcyBJTlQxNiBhbmQgSU5UMzIsIGJ1dCBvbmx5IGlmIFhNRF9IIGlzCiAgIG5vdCBkZWZpbmVkLiAgVW5mb3J0dW5hdGVseSwgdGhlIE1pbkdXIGFuZCBCb3JsYW5kIGNvbXBpbGVycyBpbmNsdWRlCiAgIGEgdHlwZWRlZiBmb3IgSU5UMzIsIHdoaWNoIGNhdXNlcyBhIGNvbmZsaWN0LiAgTVNWQyBkb2VzIG5vdCBpbmNsdWRlCi0gIGEgY29uZmljdGluZyB0eXBlZGVmIGdpdmVuIHRoZSBoZWFkZXJzIHdoaWNoIGFyZSBpbmNsdWRlZC4KKyAgYSBjb25mbGljdGluZyB0eXBlZGVmIGdpdmVuIHRoZSBoZWFkZXJzIHdoaWNoIGFyZSBpbmNsdWRlZC4KICovCiAjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQoX19NSU5HVzMyX18pCiAjIGRlZmluZSBYTURfSCAxCkBAIC03MDUsOSArNzA1LDExIEBACiBKUEVHRml4dXBUYWdzKFRJRkYqIHRpZikKIHsKICNpZmRlZiBDSEVDS19KUEVHX1lDQkNSX1NVQlNBTVBMSU5HCisgICAgICAgIEpQRUdTdGF0ZSogc3AgPSBKU3RhdGUodGlmKTsKIAlpZiAoKHRpZi0+dGlmX2Rpci50ZF9waG90b21ldHJpYz09UEhPVE9NRVRSSUNfWUNCQ1IpJiYKIAkgICAgKHRpZi0+dGlmX2Rpci50ZF9wbGFuYXJjb25maWc9PVBMQU5BUkNPTkZJR19DT05USUcpJiYKLQkgICAgKHRpZi0+dGlmX2Rpci50ZF9zYW1wbGVzcGVycGl4ZWw9PTMpKQorCSAgICAodGlmLT50aWZfZGlyLnRkX3NhbXBsZXNwZXJwaXhlbD09MykgJiYKKyAgICAgICAgICAgICFzcC0+eWNiY3JzYW1wbGluZ19mZXRjaGVkKQogCQlKUEVHRml4dXBUYWdzU3Vic2FtcGxpbmcodGlmKTsKICNlbmRpZgogICAgICAgICAKQEAgLTk0NSw3ICs5NDcsNyBAQAogCWVsc2UKIAl7CiAJCXVpbnQxNiBtOwotCQltPXNraXBsZW5ndGgtZGF0YS0+YnVmZmVyYnl0ZXNsZWZ0OworCQltPSh1aW50MTYpKHNraXBsZW5ndGgtZGF0YS0+YnVmZmVyYnl0ZXNsZWZ0KTsKIAkJaWYgKG08PWRhdGEtPmZpbGVieXRlc2xlZnQpCiAJCXsKIAkJCWRhdGEtPmJ1ZmZlcmJ5dGVzbGVmdD0wOwpAQCAtMTI5MSw3ICsxMjkzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGxpbmVfd29ya19idWYgIT0gTlVMTCApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEluIHRoZSBNSzEgY2FzZSwgd2UgYXdheXMgcmVhZCBpbnRvIGEgMTZiaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBJbiB0aGUgTUsxIGNhc2UsIHdlIGFsd2F5cyByZWFkIGludG8gYSAxNmJpdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJ1ZmZlciwgYW5kIHRoZW4gcGFjayBkb3duIHRvIDEyYml0IG9yIDhiaXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogSW4gNkIgY2FzZSB3ZSBvbmx5IHJlYWQgaW50byAxNiBiaXQgYnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZm9yIDEyYml0IGRhdGEsIHdoaWNoIHdlIG5lZWQgdG8gcmVwYWNrLgpAQCAtMTMxMSwxMCArMTMxMywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQgY2hhciAqKSBidWYpICsgaVBhaXIgKiAzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0FNUExFICppbl9wdHIgPSBsaW5lX3dvcmtfYnVmICsgaVBhaXIgKiAyOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9wdHJbMF0gPSAoaW5fcHRyWzBdICYgMHhmZjApID4+IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9wdHJbMV0gPSAoKGluX3B0clswXSAmIDB4ZikgPDwgNCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICgoaW5fcHRyWzFdICYgMHhmMDApID4+IDgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfcHRyWzJdID0gKChpbl9wdHJbMV0gJiAweGZmKSA+PiAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X3B0clswXSA9ICh1bnNpZ25lZCBjaGFyKSgoaW5fcHRyWzBdICYgMHhmZjApID4+IDQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfcHRyWzFdID0gKHVuc2lnbmVkIGNoYXIpKCgoaW5fcHRyWzBdICYgMHhmKSA8PCA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKChpbl9wdHJbMV0gJiAweGYwMCkgPj4gOCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfcHRyWzJdID0gKHVuc2lnbmVkIGNoYXIpKCgoaW5fcHRyWzFdICYgMHhmZikgPj4gMCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBzcC0+Y2luZm8uZC5kYXRhX3ByZWNpc2lvbiA9PSA4ICkKQEAgLTEzNzUsNyArMTM3Nyw3IEBACiAJKHZvaWQpIHM7CiAKIAkvKiBkYXRhIGlzIGV4cGVjdGVkIHRvIGJlIHJlYWQgaW4gbXVsdGlwbGVzIG9mIGEgc2NhbmxpbmUgKi8KLQlpZiAoIChucm93cyA9IHNwLT5jaW5mby5kLmltYWdlX2hlaWdodCkgKSB7CisJaWYgKCAobnJvd3MgPSBzcC0+Y2luZm8uZC5pbWFnZV9oZWlnaHQpICE9IDAgKSB7CiAKIAkJLyogQ2IsQ3IgYm90aCBoYXZlIHNhbXBsaW5nIGZhY3RvcnMgMSwgc28gdGhpcyBpcyBjb3JyZWN0ICovCiAJCUpESU1FTlNJT04gY2x1bXBzX3Blcl9saW5lID0gc3AtPmNpbmZvLmQuY29tcF9pbmZvWzFdLmRvd25zYW1wbGVkX3dpZHRoOyAgICAgICAgICAgIApAQCAtMTQ3NSwxMCArMTQ3NywxMCBAQAogCQkJCQl7CiAJCQkJCQl1bnNpZ25lZCBjaGFyICpvdXRfcHRyID0gKCh1bnNpZ25lZCBjaGFyICopIGJ1ZikgKyBpUGFpciAqIDM7CiAJCQkJCQlKU0FNUExFICppbl9wdHIgPSAoSlNBTVBMRSAqKSAodG1wYnVmICsgaVBhaXIgKiAyKTsKLQkJCQkJCW91dF9wdHJbMF0gPSAoaW5fcHRyWzBdICYgMHhmZjApID4+IDQ7Ci0JCQkJCQlvdXRfcHRyWzFdID0gKChpbl9wdHJbMF0gJiAweGYpIDw8IDQpCi0JCQkJCQkJfCAoKGluX3B0clsxXSAmIDB4ZjAwKSA+PiA4KTsKLQkJCQkJCW91dF9wdHJbMl0gPSAoKGluX3B0clsxXSAmIDB4ZmYpID4+IDApOworCQkJCQkJb3V0X3B0clswXSA9ICh1bnNpZ25lZCBjaGFyKSgoaW5fcHRyWzBdICYgMHhmZjApID4+IDQpOworCQkJCQkJb3V0X3B0clsxXSA9ICh1bnNpZ25lZCBjaGFyKSgoKGluX3B0clswXSAmIDB4ZikgPDwgNCkKKwkJCQkJCQl8ICgoaW5fcHRyWzFdICYgMHhmMDApID4+IDgpKTsKKwkJCQkJCW91dF9wdHJbMl0gPSAodW5zaWduZWQgY2hhcikoKChpbl9wdHJbMV0gJiAweGZmKSA+PiAwKSk7CiAJCQkJCX0KIAkJCQl9CiAJCQl9CkBAIC0xNjM0LDYgKzE2MzYsMjAgQEAKIAljYXNlIFBIT1RPTUVUUklDX1lDQkNSOgogCQlzcC0+aF9zYW1wbGluZyA9IHRkLT50ZF95Y2JjcnN1YnNhbXBsaW5nWzBdOwogCQlzcC0+dl9zYW1wbGluZyA9IHRkLT50ZF95Y2JjcnN1YnNhbXBsaW5nWzFdOworICAgICAgICAgICAgICAgIGlmKCBzcC0+aF9zYW1wbGluZyA9PSAwIHx8IHNwLT52X3NhbXBsaW5nID09IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZyBob3Jpem9udGFsL3ZlcnRpY2FsIHNhbXBsaW5nIHZhbHVlIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCB0ZC0+dGRfYml0c3BlcnNhbXBsZSA+IDE2ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQml0c1BlclNhbXBsZSAlZCBub3QgYWxsb3dlZCBmb3IgSlBFRyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+dGRfYml0c3BlcnNhbXBsZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoMCk7CisgICAgICAgICAgICAgICAgfQorCiAJCS8qCiAJCSAqIEEgUmVmZXJlbmNlQmxhY2tXaGl0ZSBmaWVsZCAqbXVzdCogYmUgcHJlc2VudCBzaW5jZSB0aGUKIAkJICogZGVmYXVsdCB2YWx1ZSBpcyBpbmFwcHJvcHJpYXRlIGZvciBZQ2JDci4gIEZpbGwgaW4gdGhlCkBAIC0xOTAxLDcgKzE5MTcsNyBAQAogCiAgICAgICAgIGlmKCBzcC0+Y2luZm8uYy5kYXRhX3ByZWNpc2lvbiA9PSAxMiApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGxpbmUxNl9jb3VudCA9IChzcC0+Ynl0ZXNwZXJsaW5lICogMikgLyAzOworICAgICAgICAgICAgbGluZTE2X2NvdW50ID0gKGludCkoKHNwLT5ieXRlc3BlcmxpbmUgKiAyKSAvIDMpOwogICAgICAgICAgICAgbGluZTE2ID0gKHNob3J0ICopIF9USUZGbWFsbG9jKHNpemVvZihzaG9ydCkgKiBsaW5lMTZfY291bnQpOwogICAgICAgICAgICAgaWYgKCFsaW5lMTYpCiAgICAgICAgICAgICB7CkBAIC0yMTQ2LDggKzIxNjIsNyBAQAogCQkJLyogWFhYICovCiAJCQlyZXR1cm4gKDApOwogCQl9Ci0JCV9USUZGc2V0Qnl0ZUFycmF5KCZzcC0+anBlZ3RhYmxlcywgdmFfYXJnKGFwLCB2b2lkKiksCi0JCSAgICAobG9uZykgdjMyKTsKKwkJX1RJRkZzZXRCeXRlQXJyYXkoJnNwLT5qcGVndGFibGVzLCB2YV9hcmcoYXAsIHZvaWQqKSwgdjMyKTsKIAkJc3AtPmpwZWd0YWJsZXNfbGVuZ3RoID0gdjMyOwogCQlUSUZGU2V0RmllbGRCaXQodGlmLCBGSUVMRF9KUEVHVEFCTEVTKTsKIAkJYnJlYWs7CkBAIC0yMTc2LDcgKzIxOTEsNyBAQAogCQlyZXR1cm4gKCpzcC0+dnNldHBhcmVudCkodGlmLCB0YWcsIGFwKTsKIAl9CiAKLQlpZiAoKGZpcCA9IFRJRkZGaWVsZFdpdGhUYWcodGlmLCB0YWcpKSkgeworCWlmICgoZmlwID0gVElGRkZpZWxkV2l0aFRhZyh0aWYsIHRhZykpICE9IE5VTEwpIHsKIAkJVElGRlNldEZpZWxkQml0KHRpZiwgZmlwLT5maWVsZF9iaXQpOwogCX0gZWxzZSB7CiAJCXJldHVybiAoMCk7CkBAIC0yMzAwLDYgKzIzMTUsMTUgQEAKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoIVRJRkZqcGVnX2NyZWF0ZV9jb21wcmVzcyhzcCkpCiAgICAgICAgICAgICByZXR1cm4gKDApOworI2lmbmRlZiBUSUZGX0pQRUdfTUFYX01FTU9SWV9UT19VU0UKKyNkZWZpbmUgVElGRl9KUEVHX01BWF9NRU1PUllfVE9fVVNFICgxMCAqIDEwMjQgKiAxMDI0KQorI2VuZGlmCisgICAgICAgIC8qIEluY3JlYXNlIHRoZSBtYXggbWVtb3J5IHVzYWJsZS4gVGhpcyBoZWxwcyB3aGVuIGNyZWF0aW5nIGZpbGVzICovCisgICAgICAgIC8qIHdpdGggImJpZyIgdGlsZSwgd2l0aG91dCB1c2luZyBsaWJqcGVnIHRlbXBvcmFyeSBmaWxlcy4gKi8KKyAgICAgICAgLyogRm9yIGV4YW1wbGUgYSA1MTJ4NTEyIHRpbGUgd2l0aCAzIGJhbmRzICovCisgICAgICAgIC8qIHJlcXVpcmVzIDEuNSBNQiB3aGljaCBpcyBhYm92ZSBsaWJqcGVnIDFNQiBkZWZhdWx0ICovCisgICAgICAgIGlmKCBzcC0+Y2luZm8uYy5tZW0tPm1heF9tZW1vcnlfdG9fdXNlIDwgVElGRl9KUEVHX01BWF9NRU1PUllfVE9fVVNFICkKKyAgICAgICAgICAgIHNwLT5jaW5mby5jLm1lbS0+bWF4X21lbW9yeV90b191c2UgPSBUSUZGX0pQRUdfTUFYX01FTU9SWV9UT19VU0U7CiAgICAgfQogCiAgICAgc3AtPmNpbmZvX2luaXRpYWxpemVkID0gVFJVRTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX2x1di5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfbHV2LmMKaW5kZXggMDFmMzljMC4uNTlkMGE3NCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfbHV2LmMKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfbHV2LmMKQEAgLTEsNCArMSw0IEBACi0vKiAkSWQ6IHRpZl9sdXYuYyx2IDEuNDAgMjAxNS0wNi0yMSAwMTowOTowOSBiZnJpZXNlbiBFeHAgJCAqLworLyogJElkOiB0aWZfbHV2LmMsdiAxLjQ3IDIwMTctMDUtMTQgMTA6MTc6MjcgZXJvdWF1bHQgRXhwICQgKi8KIAogLyoKICAqIENvcHlyaWdodCAoYykgMTk5NyBHcmVnIFdhcmQgTGFyc29uCkBAIC0xNTgsNiArMTU4LDcgQEAKIHR5cGVkZWYgc3RydWN0IGxvZ0x1dlN0YXRlIExvZ0x1dlN0YXRlOwogCiBzdHJ1Y3QgbG9nTHV2U3RhdGUgeworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBlbmNvZGVyX3N0YXRlOyAgLyogMSBpZiBlbmNvZGVyIGNvcnJlY3RseSBpbml0aWFsaXplZCAqLwogCWludCAgICAgICAgICAgICAgICAgICAgIHVzZXJfZGF0YWZtdDsgICAvKiB1c2VyIGRhdGEgZm9ybWF0ICovCiAJaW50ICAgICAgICAgICAgICAgICAgICAgZW5jb2RlX21ldGg7ICAgIC8qIGVuY29kaW5nIG1ldGhvZCAqLwogCWludCAgICAgICAgICAgICAgICAgICAgIHBpeGVsX3NpemU7ICAgICAvKiBieXRlcyBwZXIgcGl4ZWwgKi8KQEAgLTQwMSw4ICs0MDIsMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKIAogCWFzc2VydChjYyVyb3dsZW4gPT0gMCk7Ci0Jd2hpbGUgKGNjICYmICgqdGlmLT50aWZfZGVjb2Rlcm93KSh0aWYsIGJwLCByb3dsZW4sIHMpKQotCQlicCArPSByb3dsZW4sIGNjIC09IHJvd2xlbjsKKwl3aGlsZSAoY2MgJiYgKCp0aWYtPnRpZl9kZWNvZGVyb3cpKHRpZiwgYnAsIHJvd2xlbiwgcykpIHsKKwkJYnAgKz0gcm93bGVuOworCQljYyAtPSByb3dsZW47CisJfQogCXJldHVybiAoY2MgPT0gMCk7CiB9CiAKQEAgLTQyMCw4ICs0MjMsMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKIAogCWFzc2VydChjYyVyb3dsZW4gPT0gMCk7Ci0Jd2hpbGUgKGNjICYmICgqdGlmLT50aWZfZGVjb2Rlcm93KSh0aWYsIGJwLCByb3dsZW4sIHMpKQotCQlicCArPSByb3dsZW4sIGNjIC09IHJvd2xlbjsKKwl3aGlsZSAoY2MgJiYgKCp0aWYtPnRpZl9kZWNvZGVyb3cpKHRpZiwgYnAsIHJvd2xlbiwgcykpIHsKKwkJYnAgKz0gcm93bGVuOworCQljYyAtPSByb3dsZW47CisJfQogCXJldHVybiAoY2MgPT0gMCk7CiB9CiAKQEAgLTQ2OCw3ICs0NzMsNyBAQAogCQkJCXRpZi0+dGlmX3Jhd2NwID0gb3A7CiAJCQkJdGlmLT50aWZfcmF3Y2MgPSB0aWYtPnRpZl9yYXdkYXRhc2l6ZSAtIG9jYzsKIAkJCQlpZiAoIVRJRkZGbHVzaERhdGExKHRpZikpCi0JCQkJCXJldHVybiAoLTEpOworCQkJCQlyZXR1cm4gKDApOwogCQkJCW9wID0gdGlmLT50aWZfcmF3Y3A7CiAJCQkJb2NjID0gdGlmLT50aWZfcmF3ZGF0YXNpemUgLSB0aWYtPnRpZl9yYXdjYzsKIAkJCX0KQEAgLTUwMCw3ICs1MDUsNyBAQAogCQkJCQl0aWYtPnRpZl9yYXdjcCA9IG9wOwogCQkJCQl0aWYtPnRpZl9yYXdjYyA9IHRpZi0+dGlmX3Jhd2RhdGFzaXplIC0gb2NjOwogCQkJCQlpZiAoIVRJRkZGbHVzaERhdGExKHRpZikpCi0JCQkJCQlyZXR1cm4gKC0xKTsKKwkJCQkJCXJldHVybiAoMCk7CiAJCQkJCW9wID0gdGlmLT50aWZfcmF3Y3A7CiAJCQkJCW9jYyA9IHRpZi0+dGlmX3Jhd2RhdGFzaXplIC0gdGlmLT50aWZfcmF3Y2M7CiAJCQkJfQpAQCAtNTYwLDcgKzU2NSw3IEBACiAJCQl0aWYtPnRpZl9yYXdjcCA9IG9wOwogCQkJdGlmLT50aWZfcmF3Y2MgPSB0aWYtPnRpZl9yYXdkYXRhc2l6ZSAtIG9jYzsKIAkJCWlmICghVElGRkZsdXNoRGF0YTEodGlmKSkKLQkJCQlyZXR1cm4gKC0xKTsKKwkJCQlyZXR1cm4gKDApOwogCQkJb3AgPSB0aWYtPnRpZl9yYXdjcDsKIAkJCW9jYyA9IHRpZi0+dGlmX3Jhd2RhdGFzaXplIC0gdGlmLT50aWZfcmF3Y2M7CiAJCX0KQEAgLTYxOSw3ICs2MjQsNyBAQAogCQkJCXRpZi0+dGlmX3Jhd2NwID0gb3A7CiAJCQkJdGlmLT50aWZfcmF3Y2MgPSB0aWYtPnRpZl9yYXdkYXRhc2l6ZSAtIG9jYzsKIAkJCQlpZiAoIVRJRkZGbHVzaERhdGExKHRpZikpCi0JCQkJCXJldHVybiAoLTEpOworCQkJCQlyZXR1cm4gKDApOwogCQkJCW9wID0gdGlmLT50aWZfcmF3Y3A7CiAJCQkJb2NjID0gdGlmLT50aWZfcmF3ZGF0YXNpemUgLSB0aWYtPnRpZl9yYXdjYzsKIAkJCX0KQEAgLTY1MSw3ICs2NTYsNyBAQAogCQkJCQl0aWYtPnRpZl9yYXdjcCA9IG9wOwogCQkJCQl0aWYtPnRpZl9yYXdjYyA9IHRpZi0+dGlmX3Jhd2RhdGFzaXplIC0gb2NjOwogCQkJCQlpZiAoIVRJRkZGbHVzaERhdGExKHRpZikpCi0JCQkJCQlyZXR1cm4gKC0xKTsKKwkJCQkJCXJldHVybiAoMCk7CiAJCQkJCW9wID0gdGlmLT50aWZfcmF3Y3A7CiAJCQkJCW9jYyA9IHRpZi0+dGlmX3Jhd2RhdGFzaXplIC0gdGlmLT50aWZfcmF3Y2M7CiAJCQkJfQpAQCAtNjg3LDggKzY5MiwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiAwOwogCiAJYXNzZXJ0KGNjJXJvd2xlbiA9PSAwKTsKLQl3aGlsZSAoY2MgJiYgKCp0aWYtPnRpZl9lbmNvZGVyb3cpKHRpZiwgYnAsIHJvd2xlbiwgcykgPT0gMSkKLQkJYnAgKz0gcm93bGVuLCBjYyAtPSByb3dsZW47CisJd2hpbGUgKGNjICYmICgqdGlmLT50aWZfZW5jb2Rlcm93KSh0aWYsIGJwLCByb3dsZW4sIHMpID09IDEpIHsKKwkJYnAgKz0gcm93bGVuOworCQljYyAtPSByb3dsZW47CisJfQogCXJldHVybiAoY2MgPT0gMCk7CiB9CiAKQEAgLTcwNSw4ICs3MTIsMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gMDsKIAogCWFzc2VydChjYyVyb3dsZW4gPT0gMCk7Ci0Jd2hpbGUgKGNjICYmICgqdGlmLT50aWZfZW5jb2Rlcm93KSh0aWYsIGJwLCByb3dsZW4sIHMpID09IDEpCi0JCWJwICs9IHJvd2xlbiwgY2MgLT0gcm93bGVuOworCXdoaWxlIChjYyAmJiAoKnRpZi0+dGlmX2VuY29kZXJvdykodGlmLCBicCwgcm93bGVuLCBzKSA9PSAxKSB7CisJCWJwICs9IHJvd2xlbjsKKwkJY2MgLT0gcm93bGVuOworCX0KIAlyZXR1cm4gKGNjID09IDApOwogfQogCkBAIC0xMjU1LDE1ICsxMjY0LDE2IEBACiAJcmV0dXJuIChTR0lMT0dEQVRBRk1UX1VOS05PV04pOwogfQogCisKKyNkZWZpbmUgVElGRl9TSVpFX1RfTUFYICgoc2l6ZV90KSB+ICgoc2l6ZV90KTApKQorI2RlZmluZSBUSUZGX1RNU0laRV9UX01BWCAodG1zaXplX3QpKFRJRkZfU0laRV9UX01BWCA+PiAxKQorCiBzdGF0aWMgdG1zaXplX3QKIG11bHRpcGx5X21zKHRtc2l6ZV90IG0xLCB0bXNpemVfdCBtMikKIHsKLQl0bXNpemVfdCBieXRlcyA9IG0xICogbTI7Ci0KLQlpZiAobTEgJiYgYnl0ZXMgLyBtMSAhPSBtMikKLQkJYnl0ZXMgPSAwOwotCi0JcmV0dXJuIGJ5dGVzOworICAgICAgICBpZiggbTEgPT0gMCB8fCBtMiA+IFRJRkZfVE1TSVpFX1RfTUFYIC8gbTEgKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBtMSAqIG0yOwogfQogCiBzdGF0aWMgaW50CkBAIC0xMjc2LDYgKzEyODYsMTQgQEAKIAlhc3NlcnQoc3AgIT0gTlVMTCk7CiAJYXNzZXJ0KHRkLT50ZF9waG90b21ldHJpYyA9PSBQSE9UT01FVFJJQ19MT0dMKTsKIAorCWlmKCB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsICE9IDEgKQorCXsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJICAgICAgICAgICAgICJTb3JyeSwgY2FuIG5vdCBoYW5kbGUgTG9nTCBpbWFnZSB3aXRoICVzPSVkIiwKKwkJCSAgICAgIlNhbXBsZXMvcGl4ZWwiLCB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsKTsKKwkJcmV0dXJuIDA7CisJfQorCiAJLyogZm9yIHNvbWUgcmVhc29uLCB3ZSBjYW4ndCBkbyB0aGlzIGluIFRJRkZJbml0TG9nTDE2ICovCiAJaWYgKHNwLT51c2VyX2RhdGFmbXQgPT0gU0dJTE9HREFUQUZNVF9VTktOT1dOKQogCQlzcC0+dXNlcl9kYXRhZm10ID0gTG9nTDE2R3Vlc3NEYXRhRm10KHRkKTsKQEAgLTEyOTYsOCArMTMxNCwxMCBAQAogCX0KICAgICAgICAgaWYoIGlzVGlsZWQodGlmKSApCiAgICAgICAgICAgICBzcC0+dGJ1ZmxlbiA9IG11bHRpcGx5X21zKHRkLT50ZF90aWxld2lkdGgsIHRkLT50ZF90aWxlbGVuZ3RoKTsKLSAgICAgICAgZWxzZQorICAgICAgICBlbHNlIGlmKCB0ZC0+dGRfcm93c3BlcnN0cmlwICE9ICh1aW50MzIpLTEgKQogICAgICAgICAgICAgc3AtPnRidWZsZW4gPSBtdWx0aXBseV9tcyh0ZC0+dGRfaW1hZ2V3aWR0aCwgdGQtPnRkX3Jvd3NwZXJzdHJpcCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNwLT50YnVmbGVuID0gbXVsdGlwbHlfbXModGQtPnRkX2ltYWdld2lkdGgsIHRkLT50ZF9pbWFnZWxlbmd0aCk7CiAJaWYgKG11bHRpcGx5X21zKHNwLT50YnVmbGVuLCBzaXplb2YgKGludDE2KSkgPT0gMCB8fAogCSAgICAoc3AtPnRidWYgPSAodWludDgqKSBfVElGRm1hbGxvYyhzcC0+dGJ1ZmxlbiAqIHNpemVvZiAoaW50MTYpKSkgPT0gTlVMTCkgewogCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiTm8gc3BhY2UgZm9yIFNHSUxvZyB0cmFuc2xhdGlvbiBidWZmZXIiKTsKQEAgLTE1MzYsNiArMTU1Niw3IEBACiAJCSAgICB0ZC0+dGRfcGhvdG9tZXRyaWMsICJtdXN0IGJlIGVpdGhlciBMb2dMVVYgb3IgTG9nTCIpOwogCQlicmVhazsKIAl9CisJc3AtPmVuY29kZXJfc3RhdGUgPSAxOwogCXJldHVybiAoMSk7CiBub3RzdXBwb3J0ZWQ6CiAJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKQEAgLTE1NDcsMTkgKzE1NjgsMjcgQEAKIHN0YXRpYyB2b2lkCiBMb2dMdXZDbG9zZShUSUZGKiB0aWYpCiB7CisgICAgICAgIExvZ0x1dlN0YXRlKiBzcCA9IChMb2dMdXZTdGF0ZSopIHRpZi0+dGlmX2RhdGE7CiAJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOwogCisJYXNzZXJ0KHNwICE9IDApOwogCS8qCiAJICogRm9yIGNvbnNpc3RlbmN5LCB3ZSBhbHdheXMgd2FudCB0byB3cml0ZSBvdXQgdGhlIHNhbWUKIAkgKiBiaXRzcGVyc2FtcGxlIGFuZCBzYW1wbGVmb3JtYXQgZm9yIG91ciBUSUZGIGZpbGUsCiAJICogcmVnYXJkbGVzcyBvZiB0aGUgZGF0YSBmb3JtYXQgYmVpbmcgdXNlZCBieSB0aGUgYXBwbGljYXRpb24uCiAJICogU2luY2UgdGhpcyByb3V0aW5lIGlzIGNhbGxlZCBhZnRlciB0YWdzIGhhdmUgYmVlbiBzZXQgYnV0CiAJICogYmVmb3JlIHRoZXkgaGF2ZSBiZWVuIHJlY29yZGVkIGluIHRoZSBmaWxlLCB3ZSByZXNldCB0aGVtIGhlcmUuCisgICAgICAgICAqIE5vdGU6IHRoaXMgaXMgcmVhbGx5IGEgbmFzdHkgYXBwcm9hY2guIFNlZSBQaXhhckxvZ0Nsb3NlCiAJICovCi0JdGQtPnRkX3NhbXBsZXNwZXJwaXhlbCA9Ci0JICAgICh0ZC0+dGRfcGhvdG9tZXRyaWMgPT0gUEhPVE9NRVRSSUNfTE9HTCkgPyAxIDogMzsKLQl0ZC0+dGRfYml0c3BlcnNhbXBsZSA9IDE2OwotCXRkLT50ZF9zYW1wbGVmb3JtYXQgPSBTQU1QTEVGT1JNQVRfSU5UOworICAgICAgICBpZiggc3AtPmVuY29kZXJfc3RhdGUgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTZWUgUGl4YXJMb2dDbG9zZS4gTWlnaHQgYXZvaWQgaXNzdWVzIHdpdGggdGFncyB3aG9zZSBzaXplIGRlcGVuZHMKKyAgICAgICAgICAgICAqIG9uIHRob3NlIGJlbG93LCBidXQgbm90IGNvbXBsZXRlbHkgc3VyZSB0aGlzIGlzIGVub3VnaC4gKi8KKyAgICAgICAgICAgIHRkLT50ZF9zYW1wbGVzcGVycGl4ZWwgPQorICAgICAgICAgICAgICAgICh0ZC0+dGRfcGhvdG9tZXRyaWMgPT0gUEhPVE9NRVRSSUNfTE9HTCkgPyAxIDogMzsKKyAgICAgICAgICAgIHRkLT50ZF9iaXRzcGVyc2FtcGxlID0gMTY7CisgICAgICAgICAgICB0ZC0+dGRfc2FtcGxlZm9ybWF0ID0gU0FNUExFRk9STUFUX0lOVDsKKyAgICAgICAgfQogfQogCiBzdGF0aWMgdm9pZApAQCAtMTU5OCwxNyArMTYyNywyMSBAQAogCQkgKi8KIAkJc3dpdGNoIChzcC0+dXNlcl9kYXRhZm10KSB7CiAJCWNhc2UgU0dJTE9HREFUQUZNVF9GTE9BVDoKLQkJCWJwcyA9IDMyLCBmbXQgPSBTQU1QTEVGT1JNQVRfSUVFRUZQOworCQkJYnBzID0gMzI7CisJCQlmbXQgPSBTQU1QTEVGT1JNQVRfSUVFRUZQOwogCQkJYnJlYWs7CiAJCWNhc2UgU0dJTE9HREFUQUZNVF8xNkJJVDoKLQkJCWJwcyA9IDE2LCBmbXQgPSBTQU1QTEVGT1JNQVRfSU5UOworCQkJYnBzID0gMTY7CisJCQlmbXQgPSBTQU1QTEVGT1JNQVRfSU5UOwogCQkJYnJlYWs7CiAJCWNhc2UgU0dJTE9HREFUQUZNVF9SQVc6Ci0JCQlicHMgPSAzMiwgZm10ID0gU0FNUExFRk9STUFUX1VJTlQ7CisJCQlicHMgPSAzMjsKKwkJCWZtdCA9IFNBTVBMRUZPUk1BVF9VSU5UOwogCQkJVElGRlNldEZpZWxkKHRpZiwgVElGRlRBR19TQU1QTEVTUEVSUElYRUwsIDEpOwogCQkJYnJlYWs7CiAJCWNhc2UgU0dJTE9HREFUQUZNVF84QklUOgotCQkJYnBzID0gOCwgZm10ID0gU0FNUExFRk9STUFUX1VJTlQ7CisJCQlicHMgPSA4OworCQkJZm10ID0gU0FNUExFRk9STUFUX1VJTlQ7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCB0aWYtPnRpZl9uYW1lLApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfbHp3LmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9sencuYwppbmRleCA5Yjc2ZGQwLi41ZjFhY2Y4IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9sencuYworKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9sencuYwpAQCAtMSw0ICsxLDQgQEAKLS8qICRJZDogdGlmX2x6dy5jLHYgMS40OSAyMDE1LTA4LTMwIDIxOjA3OjQ0IGVyb3VhdWx0IEV4cCAkICovCisvKiAkSWQ6IHRpZl9sencuYyx2IDEuNTUgMjAxNy0wNS0xNyAwOTozODo1OCBlcm91YXVsdCBFeHAgJCAqLwogCiAvKgogICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKQEAgLTI0MCw4ICsyNDAsOCBAQAogCQkgKi8KIAkJY29kZSA9IDI1NTsKIAkJZG8gewotCQkJc3AtPmRlY19jb2RldGFiW2NvZGVdLnZhbHVlID0gY29kZTsKLQkJCXNwLT5kZWNfY29kZXRhYltjb2RlXS5maXJzdGNoYXIgPSBjb2RlOworCQkJc3AtPmRlY19jb2RldGFiW2NvZGVdLnZhbHVlID0gKHVuc2lnbmVkIGNoYXIpY29kZTsKKwkJCXNwLT5kZWNfY29kZXRhYltjb2RlXS5maXJzdGNoYXIgPSAodW5zaWduZWQgY2hhciljb2RlOwogCQkJc3AtPmRlY19jb2RldGFiW2NvZGVdLmxlbmd0aCA9IDE7CiAJCQlzcC0+ZGVjX2NvZGV0YWJbY29kZV0ubmV4dCA9IE5VTEw7CiAJCX0gd2hpbGUgKGNvZGUtLSk7CkBAIC0zMTgsNyArMzE4LDcgQEAKIAlzcC0+ZGVjX3Jlc3RhcnQgPSAwOwogCXNwLT5kZWNfbmJpdHNtYXNrID0gTUFYQ09ERShCSVRTX01JTik7CiAjaWZkZWYgTFpXX0NIRUNLRU9TCi0Jc3AtPmRlY19iaXRzbGVmdCA9ICgodWludDY0KXRpZi0+dGlmX3Jhd2NjKSA8PCAzOworCXNwLT5kZWNfYml0c2xlZnQgPSAwOwogI2VuZGlmCiAJc3AtPmRlY19mcmVlX2VudHAgPSBzcC0+ZGVjX2NvZGV0YWIgKyBDT0RFX0ZJUlNUOwogCS8qCkBAIC00MTEsMTkgKzQxMSwyMyBAQAogCQkvKgogCQkgKiBSZXNpZHVlIHNhdGlzZmllcyBvbmx5IHBhcnQgb2YgdGhlIGRlY29kZSByZXF1ZXN0LgogCQkgKi8KLQkJb3AgKz0gcmVzaWR1ZSwgb2NjIC09IHJlc2lkdWU7CisJCW9wICs9IHJlc2lkdWU7CisJCW9jYyAtPSByZXNpZHVlOwogCQl0cCA9IG9wOwogCQlkbyB7CiAJCQlpbnQgdDsKIAkJCS0tdHA7CiAJCQl0ID0gY29kZXAtPnZhbHVlOwogCQkJY29kZXAgPSBjb2RlcC0+bmV4dDsKLQkJCSp0cCA9IHQ7CisJCQkqdHAgPSAoY2hhcil0OwogCQl9IHdoaWxlICgtLXJlc2lkdWUgJiYgY29kZXApOwogCQlzcC0+ZGVjX3Jlc3RhcnQgPSAwOwogCX0KIAogCWJwID0gKHVuc2lnbmVkIGNoYXIgKil0aWYtPnRpZl9yYXdjcDsKKyNpZmRlZiBMWldfQ0hFQ0tFT1MKKwlzcC0+ZGVjX2JpdHNsZWZ0ID0gKCgodWludDY0KXRpZi0+dGlmX3Jhd2NjKSA8PCAzKTsKKyNlbmRpZgogCW5iaXRzID0gc3AtPmx6d19uYml0czsKIAluZXh0ZGF0YSA9IHNwLT5sendfbmV4dGRhdGE7CiAJbmV4dGJpdHMgPSBzcC0+bHp3X25leHRiaXRzOwpAQCAtNDU0LDcgKzQ1OCw4IEBACiAJCQkJCSAgICAgdGlmLT50aWZfcm93KTsKIAkJCQlyZXR1cm4gKDApOwogCQkJfQotCQkJKm9wKysgPSAoY2hhciljb2RlLCBvY2MtLTsKKwkJCSpvcCsrID0gKGNoYXIpY29kZTsKKwkJCW9jYy0tOwogCQkJb2xkY29kZXAgPSBzcC0+ZGVjX2NvZGV0YWIgKyBjb2RlOwogCQkJY29udGludWU7CiAJCX0KQEAgLTUzMiwxOCArNTM3LDIyIEBACiAJCQkJLS10cDsKIAkJCQl0ID0gY29kZXAtPnZhbHVlOwogCQkJCWNvZGVwID0gY29kZXAtPm5leHQ7Ci0JCQkJKnRwID0gdDsKKwkJCQkqdHAgPSAoY2hhcil0OwogCQkJfSB3aGlsZSAoY29kZXAgJiYgdHAgPiBvcCk7CiAJCQlpZiAoY29kZXApIHsKIAkJCSAgICBjb2RlTG9vcCh0aWYsIG1vZHVsZSk7CiAJCQkgICAgYnJlYWs7CiAJCQl9CiAJCQlhc3NlcnQob2NjID49IGxlbik7Ci0JCQlvcCArPSBsZW4sIG9jYyAtPSBsZW47Ci0JCX0gZWxzZQotCQkJKm9wKysgPSAoY2hhciljb2RlLCBvY2MtLTsKKwkJCW9wICs9IGxlbjsKKwkJCW9jYyAtPSBsZW47CisJCX0gZWxzZSB7CisJCQkqb3ArKyA9IChjaGFyKWNvZGU7CisJCQlvY2MtLTsKKwkJfQogCX0KIAorCXRpZi0+dGlmX3Jhd2NjIC09ICh0bXNpemVfdCkoICh1aW50OCopIGJwIC0gdGlmLT50aWZfcmF3Y3AgKTsKIAl0aWYtPnRpZl9yYXdjcCA9ICh1aW50OCopIGJwOwogCXNwLT5sendfbmJpdHMgPSAodW5zaWduZWQgc2hvcnQpIG5iaXRzOwogCXNwLT5sendfbmV4dGRhdGEgPSBuZXh0ZGF0YTsKQEAgLTYzNSw3ICs2NDQsOCBAQAogCQkvKgogCQkgKiBSZXNpZHVlIHNhdGlzZmllcyBvbmx5IHBhcnQgb2YgdGhlIGRlY29kZSByZXF1ZXN0LgogCQkgKi8KLQkJb3AgKz0gcmVzaWR1ZSwgb2NjIC09IHJlc2lkdWU7CisJCW9wICs9IHJlc2lkdWU7CisJCW9jYyAtPSByZXNpZHVlOwogCQl0cCA9IG9wOwogCQlkbyB7CiAJCQkqLS10cCA9IGNvZGVwLT52YWx1ZTsKQEAgLTY3NSw3ICs2ODUsOCBAQAogCQkJCQkgICAgIHRpZi0+dGlmX3Jvdyk7CiAJCQkJcmV0dXJuICgwKTsKIAkJCX0KLQkJCSpvcCsrID0gY29kZSwgb2NjLS07CisJCQkqb3ArKyA9IChjaGFyKWNvZGU7CisJCQlvY2MtLTsKIAkJCW9sZGNvZGVwID0gc3AtPmRlY19jb2RldGFiICsgY29kZTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC03NDEsMTcgKzc1MiwyMCBAQAogCQkJCWJyZWFrOwogCQkJfQogCQkJYXNzZXJ0KG9jYyA+PSBjb2RlcC0+bGVuZ3RoKTsKLQkJCW9wICs9IGNvZGVwLT5sZW5ndGgsIG9jYyAtPSBjb2RlcC0+bGVuZ3RoOworCQkJb3AgKz0gY29kZXAtPmxlbmd0aDsKKwkJCW9jYyAtPSBjb2RlcC0+bGVuZ3RoOwogCQkJdHAgPSBvcDsKIAkJCWRvIHsKIAkJCQkqLS10cCA9IGNvZGVwLT52YWx1ZTsKIAkJCX0gd2hpbGUoIChjb2RlcCA9IGNvZGVwLT5uZXh0KSAhPSBOVUxMICk7Ci0JCX0gZWxzZQotCQkJKm9wKysgPSBjb2RlLCBvY2MtLTsKKwkJfSBlbHNlIHsKKwkJCSpvcCsrID0gKGNoYXIpY29kZTsKKwkJCW9jYy0tOworCQl9CiAJfQogCiAJdGlmLT50aWZfcmF3Y3AgPSAodWludDgqKSBicDsKLQlzcC0+bHp3X25iaXRzID0gbmJpdHM7CisJc3AtPmx6d19uYml0cyA9ICh1bnNpZ25lZCBzaG9ydCluYml0czsKIAlzcC0+bHp3X25leHRkYXRhID0gbmV4dGRhdGE7CiAJc3AtPmx6d19uZXh0Yml0cyA9IG5leHRiaXRzOwogCXNwLT5kZWNfbmJpdHNtYXNrID0gbmJpdHNtYXNrOwpAQCAtOTAwLDcgKzkxNCw3IEBACiAJbmJpdHMgPSBzcC0+bHp3X25iaXRzOwogCW9wID0gdGlmLT50aWZfcmF3Y3A7CiAJbGltaXQgPSBzcC0+ZW5jX3Jhd2xpbWl0OwotCWVudCA9IHNwLT5lbmNfb2xkY29kZTsKKwllbnQgPSAoaGNvZGVfdClzcC0+ZW5jX29sZGNvZGU7CiAKIAlpZiAoZW50ID09IChoY29kZV90KSAtMSAmJiBjYyA+IDApIHsKIAkJLyoKQEAgLTkzNiw3ICs5NTAsNyBAQAogCQkJCWRpc3AgPSAxOwogCQkJZG8gewogCQkJCS8qCi0JCQkJICogQXZvaWQgcG9pbnRlciBhcml0aG1ldGljICdjdXogb2YKKwkJCQkgKiBBdm9pZCBwb2ludGVyIGFyaXRobWV0aWMgYmVjYXVzZSBvZgogCQkJCSAqIHdyYXBhcm91bmQgcHJvYmxlbXMgd2l0aCBzZWdtZW50cy4KIAkJCQkgKi8KIAkJCQlpZiAoKGggLT0gZGlzcCkgPCAwKQpAQCAtOTU5LDEyICs5NzMsMTMgQEAKIAkJICovCiAJCWlmIChvcCA+IGxpbWl0KSB7CiAJCQl0aWYtPnRpZl9yYXdjYyA9ICh0bXNpemVfdCkob3AgLSB0aWYtPnRpZl9yYXdkYXRhKTsKLQkJCVRJRkZGbHVzaERhdGExKHRpZik7CisJCQlpZiggIVRJRkZGbHVzaERhdGExKHRpZikgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogCQkJb3AgPSB0aWYtPnRpZl9yYXdkYXRhOwogCQl9CiAJCVB1dE5leHRDb2RlKG9wLCBlbnQpOwotCQllbnQgPSBjOwotCQlocC0+Y29kZSA9IGZyZWVfZW50Kys7CisJCWVudCA9IChoY29kZV90KWM7CisJCWhwLT5jb2RlID0gKGhjb2RlX3QpKGZyZWVfZW50KyspOwogCQlocC0+aGFzaCA9IGZjb2RlOwogCQlpZiAoZnJlZV9lbnQgPT0gQ09ERV9NQVgtMSkgewogCQkJLyogdGFibGUgaXMgZnVsbCwgZW1pdCBjbGVhciBjb2RlIGFuZCByZXNldCAqLwpAQCAtMTAyMSw5ICsxMDM2LDkgQEAKIAlzcC0+ZW5jX29sZGNvZGUgPSBlbnQ7CiAJc3AtPmx6d19uZXh0ZGF0YSA9IG5leHRkYXRhOwogCXNwLT5sendfbmV4dGJpdHMgPSBuZXh0Yml0czsKLQlzcC0+bHp3X2ZyZWVfZW50ID0gZnJlZV9lbnQ7Ci0Jc3AtPmx6d19tYXhjb2RlID0gbWF4Y29kZTsKLQlzcC0+bHp3X25iaXRzID0gbmJpdHM7CisJc3AtPmx6d19mcmVlX2VudCA9ICh1bnNpZ25lZCBzaG9ydClmcmVlX2VudDsKKwlzcC0+bHp3X21heGNvZGUgPSAodW5zaWduZWQgc2hvcnQpbWF4Y29kZTsKKwlzcC0+bHp3X25iaXRzID0gKHVuc2lnbmVkIHNob3J0KW5iaXRzOwogCXRpZi0+dGlmX3Jhd2NwID0gb3A7CiAJcmV0dXJuICgxKTsKIH0KQEAgLTEwNDQsMTIgKzEwNTksMzIgQEAKIAogCWlmIChvcCA+IHNwLT5lbmNfcmF3bGltaXQpIHsKIAkJdGlmLT50aWZfcmF3Y2MgPSAodG1zaXplX3QpKG9wIC0gdGlmLT50aWZfcmF3ZGF0YSk7Ci0JCVRJRkZGbHVzaERhdGExKHRpZik7CisJCWlmKCAhVElGRkZsdXNoRGF0YTEodGlmKSApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogCQlvcCA9IHRpZi0+dGlmX3Jhd2RhdGE7CiAJfQogCWlmIChzcC0+ZW5jX29sZGNvZGUgIT0gKGhjb2RlX3QpIC0xKSB7CisgICAgICAgICAgICAgICAgaW50IGZyZWVfZW50ID0gc3AtPmx6d19mcmVlX2VudDsKKwogCQlQdXROZXh0Q29kZShvcCwgc3AtPmVuY19vbGRjb2RlKTsKIAkJc3AtPmVuY19vbGRjb2RlID0gKGhjb2RlX3QpIC0xOworICAgICAgICAgICAgICAgIGZyZWVfZW50ICsrOworCisgICAgICAgICAgICAgICAgaWYgKGZyZWVfZW50ID09IENPREVfTUFYLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRhYmxlIGlzIGZ1bGwsIGVtaXQgY2xlYXIgY29kZSBhbmQgcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG91dGNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB1dE5leHRDb2RlKG9wLCBDT0RFX0NMRUFSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5iaXRzID0gQklUU19NSU47CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAgICAqIElmIHRoZSBuZXh0IGVudHJ5IGlzIGdvaW5nIHRvIGJlIHRvbyBiaWcgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBjb2RlIHNpemUsIHRoZW4gaW5jcmVhc2UgaXQsIGlmIHBvc3NpYmxlLgorICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcmVlX2VudCA+IHNwLT5sendfbWF4Y29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYml0cysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQobmJpdHMgPD0gQklUU19NQVgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KIAl9CiAJUHV0TmV4dENvZGUob3AsIENPREVfRU9JKTsKICAgICAgICAgLyogRXhwbGljaXQgMHhmZiBtYXNraW5nIHRvIG1ha2UgaWNjIC1jaGVjaz1jb252ZXJzaW9ucyBoYXBweSAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfbmV4dC5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfbmV4dC5jCmluZGV4IGIyMDc2YTAuLjA4MjExNzggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX25leHQuYworKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9uZXh0LmMKQEAgLTEsNCArMSw0IEBACi0vKiAkSWQ6IHRpZl9uZXh0LmMsdiAxLjE2IDIwMTQtMTItMjkgMTI6MDk6MTEgZXJvdWF1bHQgRXhwICQgKi8KKy8qICRJZDogdGlmX25leHQuYyx2IDEuMTkgMjAxNi0wOS0wNCAyMTozMjo1NiBlcm91YXVsdCBFeHAgJCAqLwogCiAvKgogICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKQEAgLTcyLDcgKzcyLDggQEAKIAkJcmV0dXJuICgwKTsKIAl9CiAJZm9yIChyb3cgPSBidWY7IGNjID4gMCAmJiBvY2MgPiAwOyBvY2MgLT0gc2NhbmxpbmUsIHJvdyArPSBzY2FubGluZSkgewotCQluID0gKmJwKyssIGNjLS07CisJCW4gPSAqYnArKzsKKwkJY2MtLTsKIAkJc3dpdGNoIChuKSB7CiAJCWNhc2UgTElURVJBTFJPVzoKIAkJCS8qCkBAIC0xMDMsMTAgKzEwNCwxMCBAQAogCQl9CiAJCWRlZmF1bHQ6IHsKIAkJCXVpbnQzMiBucGl4ZWxzID0gMCwgZ3JleTsKKwkJCXRtc2l6ZV90IG9wX29mZnNldCA9IDA7CiAJCQl1aW50MzIgaW1hZ2V3aWR0aCA9IHRpZi0+dGlmX2Rpci50ZF9pbWFnZXdpZHRoOwogICAgICAgICAgICAgaWYoIGlzVGlsZWQodGlmKSApCiAgICAgICAgICAgICAgICAgaW1hZ2V3aWR0aCA9IHRpZi0+dGlmX2Rpci50ZF90aWxld2lkdGg7Ci0gICAgICAgICAgICB0bXNpemVfdCBvcF9vZmZzZXQgPSAwOwogCiAJCQkvKgogCQkJICogVGhlIHNjYW5saW5lIGlzIGNvbXBvc2VkIG9mIGEgc2VxdWVuY2Ugb2YgY29uc3RhbnQKQEAgLTEzNCw3ICsxMzUsOCBAQAogICAgICAgICAgICAgICAgIH0KIAkJCQlpZiAoY2MgPT0gMCkKIAkJCQkJZ290byBiYWQ7Ci0JCQkJbiA9ICpicCsrLCBjYy0tOworCQkJCW4gPSAqYnArKzsKKwkJCQljYy0tOwogCQkJfQogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX29qcGVnLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9vanBlZy5jCmluZGV4IDI3NmQ1NjIuLjYwZTRlY2EgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX29qcGVnLmMKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfb2pwZWcuYwpAQCAtMSw0ICsxLDQgQEAKLS8qICRJZDogdGlmX29qcGVnLmMsdiAxLjYwIDIwMTUtMDUtMzEgMDA6Mzg6NDYgYmZyaWVzZW4gRXhwICQgKi8KKy8qICRJZDogdGlmX29qcGVnLmMsdiAxLjY5IDIwMTctMDQtMjcgMTc6Mjk6MjYgZXJvdWF1bHQgRXhwICQgKi8KIAogLyogV0FSTklORzogVGhlIHR5cGUgb2YgSlBFRyBlbmNhcHN1bGF0aW9uIGRlZmluZWQgYnkgdGhlIFRJRkYgVmVyc2lvbiA2LjAKICAgIHNwZWNpZmljYXRpb24gaXMgbm93IHRvdGFsbHkgb2Jzb2xldGUgYW5kIGRlcHJlY2F0ZWQgZm9yIG5ldyBhcHBsaWNhdGlvbnMgYW5kCkBAIC03NSw3ICs3NSw3IEBACiAgICBPSlBFR1N1YnNhbXBsaW5nQ29ycmVjdCwgbWFraW5nIG5vIG5vdGUgb2YgYW55IG90aGVyIGRhdGEsIHJlcG9ydGluZyBubyB3YXJuaW5ncwogICAgb3IgZXJyb3JzLCB1cCB0byB0aGUgcG9pbnQgd2hlcmUgZWl0aGVyIHRoZXNlIHZhbHVlcyBhcmUgcmVhZCwgb3IgaXQncyBjbGVhciB0aGV5CiAgICBhcmVuJ3QgdGhlcmUuIFRoaXMgbWVhbnMgdGhhdCBzb21lIG9mIHRoZSBkYXRhIGlzIHJlYWQgdHdpY2UsIGJ1dCB3ZSBmZWVsIHNwZWVkCi0gICBpbiBjb3JyZWN0aW5nIHRoZXNlIHZhbHVlcyBpcyBpbXBvcnRhbnQgZW5vdWdoIHRvIHdhcnJhbnQgdGhpcyBzYWNyaWZpY2UuIEFsbHRob3VnaAorICAgaW4gY29ycmVjdGluZyB0aGVzZSB2YWx1ZXMgaXMgaW1wb3J0YW50IGVub3VnaCB0byB3YXJyYW50IHRoaXMgc2FjcmlmaWNlLiBBbHRob3VnaAogICAgdGhlcmUgaXMgY3VycmVudGx5IG5vIGRlZmluZSBvciBvdGhlciBjb25maWd1cmF0aW9uIG1lY2hhbmlzbSB0byBkaXNhYmxlIHRoaXMgYmVoYXZpb3VyLAogICAgdGhlIGFjdHVhbCBoZWFkZXIgc2Nhbm5pbmcgaXMgYnVpbGQgdG8gcm9idXN0bHkgcmVzcG9uZCB3aXRoIGVycm9yIHJlcG9ydCBpZiBpdAogICAgc2hvdWxkIGVuY291bnRlciBhbiB1bmNvcnJlY3RlZCBtaXNtYXRjaCBvZiBzdWJzYW1wbGluZyB2YWx1ZXMuIFNlZQpAQCAtODQsNyArODQsNyBAQAogICAgVGhlIHJlc3RhcnQgaW50ZXJ2YWwgYW5kIHJlc3RhcnQgbWFya2VycyBhcmUgdGhlIG1vc3QgdHJpY2t5IHBhcnQuLi4gVGhlIHJlc3RhcnQKICAgIGludGVydmFsIGNhbiBiZSBzcGVjaWZpZWQgaW4gYSB0YWcuIEl0IGNhbiBhbHNvIGJlIHNldCBpbnNpZGUgdGhlIGlucHV0IEpQRUcgc3RyZWFtLgogICAgSXQgY2FuIGJlIHVzZWQgaW5zaWRlIHRoZSBpbnB1dCBKUEVHIHN0cmVhbS4gSWYgcmVhZGluZyBmcm9tIHN0cmlsZSBkYXRhLCB3ZSd2ZQotICAgY29uc2lzdGVubHkgZGlzY292ZXJlZCB0aGUgbmVlZCB0byBpbnNlcnQgcmVzdGFydCBtYXJrZXJzIGluIGJldHdlZW4gdGhlIGRpZmZlcmVudAorICAgY29uc2lzdGVudGx5IGRpc2NvdmVyZWQgdGhlIG5lZWQgdG8gaW5zZXJ0IHJlc3RhcnQgbWFya2VycyBpbiBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQKICAgIHN0cmlsZXMsIGFzIGlzIGFsc28gcHJvYmFibHkgdGhlIG1vc3QgbGlrZWx5IGludGVycHJldGF0aW9uIG9mIHRoZSBvcmlnaW5hbCBUSUZGIDYuMAogICAgc3BlY2lmaWNhdGlvbi4gV2l0aCBhbGwgdGhpcyBzZXR0aW5nIG9mIGludGVydmFsLCBhbmQgYWN0dWFsIHVzZSBvZiBtYXJrZXJzIHRoYXQgaXMgbm90CiAgICBwcmVkaWN0YWJsZSBhdCB0aGUgdGltZSBvZiB2YWxpZCBKUEVHIGhlYWRlciBhc3NlbWJseSwgdGhlIHJlc3RhcnQgdGhpbmcgbWF5IHR1cm4KQEAgLTExMyw3ICsxMTMsNyBAQAogICAgcGxhbmFyY29uZmlnIGlzIG5vdCBzZXBhcmF0ZSAodmFzdCBtYWpvcml0eSkuIFdlIG1heSBvbmUgZGF5IHVzZSB0aGF0IHRvIGJ1aWxkCiAgICBjb252ZXJ0ZXJzIHRvIEpQRUcsIGFuZC9vciB0byBuZXctc3R5bGUgSlBFRyBjb21wcmVzc2lvbiBpbnNpZGUgVElGRi4KIAotICAgQSBkaXNzYWR2YW50YWdlIGlzIHRoZSBsYWNrIG9mIHJhbmRvbSBhY2Nlc3MgdG8gdGhlIGluZGl2aWR1YWwgc3RyaWxlcy4gVGhpcyBpcyB0aGUKKyAgIEEgZGlzYWR2YW50YWdlIGlzIHRoZSBsYWNrIG9mIHJhbmRvbSBhY2Nlc3MgdG8gdGhlIGluZGl2aWR1YWwgc3RyaWxlcy4gVGhpcyBpcyB0aGUKICAgIHJlYXNvbiBmb3IgbXVjaCBvZiB0aGUgY29tcGxpY2F0ZWQgcmVzdGFydC1hbmQtcG9zaXRpb24gc3R1ZmYgaW5zaWRlIE9KUEVHUHJlRGVjb2RlLgogICAgQXBwbGljYXRpb25zIHdvdWxkIGRvIHdlbGwgYWNjZXNzaW5nIGFsbCBzdHJpbGVzIGluIG9yZGVyLCBhcyB0aGlzIHdpbGwgcmVzdWx0IGluCiAgICBhIHNpbmdsZSBzZXF1ZW50aWFsIHNjYW4gb2YgdGhlIGlucHV0IHN0cmVhbSwgYW5kIG5vIHJlc3RhcnRpbmcgb2YgTGliSnBlZyBkZWNvZGluZwpAQCAtMTM1LDcgKzEzNSw3IEBACiAgKiAJVGhlIGRlZmF1bHQgbW9kZSwgd2l0aG91dCBKUEVHX0VOQ0FQX0VYVEVSTkFMLCBpbXBsZW1lbnRzIHRoZSBjYWxsIGVuY2Fwc3VsYXRvcnMKICAqIAloZXJlLCBpbnRlcm5hbGx5LCB3aXRoIG5vcm1hbCBsb25nanVtcC4KICAqIFNFVEpNUCwgTE9OR0pNUCwgSk1QX0JVRjogT24gc29tZSBtYWNoaW5lcy9lbnZpcm9ubWVudHMgYSBsb25nanVtcCBlcXVpdmFsZW50IGlzCi0gKiAJY29udmluaWVudGx5IGF2YWlsYWJsZSwgYnV0IHN0aWxsIGl0IG1heSBiZSB3b3J0aHdoaWxlIHRvIHVzZSBfc2V0am1wIG9yIHNpZ3NldGptcAorICogCWNvbnZlbmllbnRseSBhdmFpbGFibGUsIGJ1dCBzdGlsbCBpdCBtYXkgYmUgd29ydGh3aGlsZSB0byB1c2UgX3NldGptcCBvciBzaWdzZXRqbXAKICAqIAlpbiBwbGFjZSBvZiBwbGFpbiBzZXRqbXAuIFRoZXNlIG1hY3JvcyB3aWxsIG1ha2UgaXQgZWFzaWVyLiBJdCBpcyB1c2VsZXNzCiAgKiAJdG8gZmlkZGxlIHdpdGggdGhlc2UgaWYgeW91IGRlZmluZSBKUEVHX0VOQ0FQX0VYVEVSTkFMLgogICogT0pQRUdfQlVGRkVSOiBEZWZpbmUgdGhlIHNpemUgb2YgdGhlIGRlc2lyZWQgYnVmZmVyIGhlcmUuIFNob3VsZCBiZSBzbWFsbCBlbm91Z2ggc28gYXMgdG8gZ3VhcmFudGVlCkBAIC0yMDAsNyArMjAwLDcgQEAKICAgTGlianBlZydzIGptb3JlY2ZnLmggZGVmaW5lcyBJTlQxNiBhbmQgSU5UMzIsIGJ1dCBvbmx5IGlmIFhNRF9IIGlzCiAgIG5vdCBkZWZpbmVkLiAgVW5mb3J0dW5hdGVseSwgdGhlIE1pbkdXIGFuZCBCb3JsYW5kIGNvbXBpbGVycyBpbmNsdWRlCiAgIGEgdHlwZWRlZiBmb3IgSU5UMzIsIHdoaWNoIGNhdXNlcyBhIGNvbmZsaWN0LiAgTVNWQyBkb2VzIG5vdCBpbmNsdWRlCi0gIGEgY29uZmljdGluZyB0eXBlZGVmIGdpdmVuIHRoZSBoZWFkZXJzIHdoaWNoIGFyZSBpbmNsdWRlZC4KKyAgYSBjb25mbGljdGluZyB0eXBlZGVmIGdpdmVuIHRoZSBoZWFkZXJzIHdoaWNoIGFyZSBpbmNsdWRlZC4KICovCiAjaWYgZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IGRlZmluZWQoX19NSU5HVzMyX18pCiAjIGRlZmluZSBYTURfSCAxCkBAIC0yNTMsNiArMjUzLDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgewogCVRJRkYqIHRpZjsKKyAgICAgICAgaW50IGRlY29kZXJfb2s7CiAJI2lmbmRlZiBMSUJKUEVHX0VOQ0FQX0VYVEVSTkFMCiAJSk1QX0JVRiBleGl0X2ptcGJ1ZjsKIAkjZW5kaWYKQEAgLTczMSw2ICs3MzIsNyBAQAogCQl9CiAJCXNwLT53cml0ZV9jdXJzdHJpbGUrKzsKIAl9CisJc3AtPmRlY29kZXJfb2sgPSAxOwogCXJldHVybigxKTsKIH0KIApAQCAtNzkzLDggKzc5NSwxNCBAQAogc3RhdGljIGludAogT0pQRUdEZWNvZGUoVElGRiogdGlmLCB1aW50OCogYnVmLCB0bXNpemVfdCBjYywgdWludDE2IHMpCiB7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdPSJPSlBFR0RlY29kZSI7CiAJT0pQRUdTdGF0ZSogc3A9KE9KUEVHU3RhdGUqKXRpZi0+dGlmX2RhdGE7CiAJKHZvaWQpczsKKyAgICAgICAgaWYoICFzcC0+ZGVjb2Rlcl9vayApCisgICAgICAgIHsKKyAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiQ2Fubm90IGRlY29kZTogZGVjb2RlciBub3QgY29ycmVjdGx5IGluaXRpYWxpemVkIik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQogCWlmIChzcC0+bGlianBlZ19qcGVnX3F1ZXJ5X3N0eWxlPT0wKQogCXsKIAkJaWYgKE9KUEVHRGVjb2RlUmF3KHRpZixidWYsY2MpPT0wKQpAQCAtMTA5MCw3ICsxMDk4LDcgQEAKIAkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLG1vZHVsZSwiSW5jb21wYXRpYmxlIHZlcnRpY2FsIHN1YnNhbXBsaW5nIGFuZCBpbWFnZSBzdHJpcC90aWxlIGxlbmd0aCIpOwogCQkJcmV0dXJuKDApOwogCQl9Ci0JCXNwLT5yZXN0YXJ0X2ludGVydmFsPSgoc3AtPnN0cmlsZV93aWR0aCtzcC0+c3Vic2FtcGxpbmdfaG9yKjgtMSkvKHNwLT5zdWJzYW1wbGluZ19ob3IqOCkpKihzcC0+c3RyaWxlX2xlbmd0aC8oc3AtPnN1YnNhbXBsaW5nX3Zlcio4KSk7CisJCXNwLT5yZXN0YXJ0X2ludGVydmFsPSh1aW50MTYpKCgoc3AtPnN0cmlsZV93aWR0aCtzcC0+c3Vic2FtcGxpbmdfaG9yKjgtMSkvKHNwLT5zdWJzYW1wbGluZ19ob3IqOCkpKihzcC0+c3RyaWxlX2xlbmd0aC8oc3AtPnN1YnNhbXBsaW5nX3Zlcio4KSkpOwogCX0KIAlpZiAoT0pQRUdSZWFkSGVhZGVySW5mb1NlYyh0aWYpPT0wKQogCQlyZXR1cm4oMCk7CkBAIC0xMTEyLDcgKzExMjAsNyBAQAogCWFzc2VydChzPDMpOwogCWFzc2VydChzcC0+c29zX2VuZFswXS5sb2chPTApOwogCWFzc2VydChzcC0+c29zX2VuZFtzXS5sb2c9PTApOwotCXNwLT5wbGFuZV9zYW1wbGVfb2Zmc2V0PXMtMTsKKwlzcC0+cGxhbmVfc2FtcGxlX29mZnNldD0odWludDgpKHMtMSk7CiAJd2hpbGUoc3AtPnNvc19lbmRbc3AtPnBsYW5lX3NhbXBsZV9vZmZzZXRdLmxvZz09MCkKIAkJc3AtPnBsYW5lX3NhbXBsZV9vZmZzZXQtLTsKIAlzcC0+aW5fYnVmZmVyX3NvdXJjZT1zcC0+c29zX2VuZFtzcC0+cGxhbmVfc2FtcGxlX29mZnNldF0uaW5fYnVmZmVyX3NvdXJjZTsKQEAgLTEzOTAsNyArMTM5OCw4IEBACiBzdGF0aWMgaW50CiBPSlBFR1JlYWRIZWFkZXJJbmZvU2VjU3RyZWFtRHJpKFRJRkYqIHRpZikKIHsKLQkvKiB0aGlzIGNvdWxkIGVhc2lsbHkgY2F1c2UgdHJvdWJsZSBpbiBzb21lIGNhc2VzLi4uIGJ1dCBubyBzdWNoIGNhc2VzIGhhdmUgb2NjdXJlZCBzb2ZhciAqLworCS8qIFRoaXMgY291bGQgZWFzaWx5IGNhdXNlIHRyb3VibGUgaW4gc29tZSBjYXNlcy4uLiBidXQgbm8gc3VjaCBjYXNlcyBoYXZlCisgICAgICAgICAgIG9jY3VycmVkIHNvIGZhciAqLwogCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdPSJPSlBFR1JlYWRIZWFkZXJJbmZvU2VjU3RyZWFtRHJpIjsKIAlPSlBFR1N0YXRlKiBzcD0oT0pQRUdTdGF0ZSopdGlmLT50aWZfZGF0YTsKIAl1aW50MTYgbTsKQEAgLTE3ODgsMTIgKzE3OTcsMTIgQEAKIAkJCW9iW3NpemVvZih1aW50MzIpKzNdPTY3OwogCQkJb2Jbc2l6ZW9mKHVpbnQzMikrNF09bTsKIAkJCVRJRkZTZWVrRmlsZSh0aWYsc3AtPnF0YWJsZV9vZmZzZXRbbV0sU0VFS19TRVQpOyAKLQkJCXA9VElGRlJlYWRGaWxlKHRpZiwmb2Jbc2l6ZW9mKHVpbnQzMikrNV0sNjQpOworCQkJcD0odWludDMyKVRJRkZSZWFkRmlsZSh0aWYsJm9iW3NpemVvZih1aW50MzIpKzVdLDY0KTsKIAkJCWlmIChwIT02NCkKLQkJCXsKLQkJCQlfVElGRmZyZWUob2IpOworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVElGRmZyZWUob2IpOwogCQkJCXJldHVybigwKTsKLQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIAkJCWlmIChzcC0+cXRhYmxlW21dIT0wKQogCQkJCV9USUZGZnJlZShzcC0+cXRhYmxlW21dKTsKIAkJCXNwLT5xdGFibGVbbV09b2I7CkBAIC0xODM2LDcgKzE4NDUsNyBAQAogCQkJCX0KIAkJCX0KIAkJCVRJRkZTZWVrRmlsZSh0aWYsc3AtPmRjdGFibGVfb2Zmc2V0W21dLFNFRUtfU0VUKTsKLQkJCXA9VElGRlJlYWRGaWxlKHRpZixvLDE2KTsKKwkJCXA9KHVpbnQzMilUSUZGUmVhZEZpbGUodGlmLG8sMTYpOwogCQkJaWYgKHAhPTE2KQogCQkJCXJldHVybigwKTsKIAkJCXE9MDsKQEAgLTE4NTIsMTcgKzE4NjEsMTcgQEAKIAkJCSoodWludDMyKilyYj1yYTsKIAkJCXJiW3NpemVvZih1aW50MzIpXT0yNTU7CiAJCQlyYltzaXplb2YodWludDMyKSsxXT1KUEVHX01BUktFUl9ESFQ7Ci0JCQlyYltzaXplb2YodWludDMyKSsyXT0oKDE5K3EpPj44KTsKKwkJCXJiW3NpemVvZih1aW50MzIpKzJdPSh1aW50OCkoKDE5K3EpPj44KTsKIAkJCXJiW3NpemVvZih1aW50MzIpKzNdPSgoMTkrcSkmMjU1KTsKIAkJCXJiW3NpemVvZih1aW50MzIpKzRdPW07CiAJCQlmb3IgKG49MDsgbjwxNjsgbisrKQogCQkJCXJiW3NpemVvZih1aW50MzIpKzUrbl09b1tuXTsKLQkJCXA9VElGRlJlYWRGaWxlKHRpZiwmKHJiW3NpemVvZih1aW50MzIpKzIxXSkscSk7CisJCQlwPSh1aW50MzIpVElGRlJlYWRGaWxlKHRpZiwmKHJiW3NpemVvZih1aW50MzIpKzIxXSkscSk7CiAJCQlpZiAocCE9cSkKLQkJCXsKLQkJCQlfVElGRmZyZWUocmIpOworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfVElGRmZyZWUocmIpOwogCQkJCXJldHVybigwKTsKLQkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIAkJCWlmIChzcC0+ZGN0YWJsZVttXSE9MCkKIAkJCQlfVElGRmZyZWUoc3AtPmRjdGFibGVbbV0pOwogCQkJc3AtPmRjdGFibGVbbV09cmI7CkBAIC0xOTA1LDcgKzE5MTQsNyBAQAogCQkJCX0KIAkJCX0KIAkJCVRJRkZTZWVrRmlsZSh0aWYsc3AtPmFjdGFibGVfb2Zmc2V0W21dLFNFRUtfU0VUKTsgIAotCQkJcD1USUZGUmVhZEZpbGUodGlmLG8sMTYpOworCQkJcD0odWludDMyKVRJRkZSZWFkRmlsZSh0aWYsbywxNik7CiAJCQlpZiAocCE9MTYpCiAJCQkJcmV0dXJuKDApOwogCQkJcT0wOwpAQCAtMTkyMSwxOCArMTkzMCwxOCBAQAogCQkJKih1aW50MzIqKXJiPXJhOwogCQkJcmJbc2l6ZW9mKHVpbnQzMildPTI1NTsKIAkJCXJiW3NpemVvZih1aW50MzIpKzFdPUpQRUdfTUFSS0VSX0RIVDsKLQkJCXJiW3NpemVvZih1aW50MzIpKzJdPSgoMTkrcSk+PjgpOworCQkJcmJbc2l6ZW9mKHVpbnQzMikrMl09KHVpbnQ4KSgoMTkrcSk+PjgpOwogCQkJcmJbc2l6ZW9mKHVpbnQzMikrM109KCgxOStxKSYyNTUpOwogCQkJcmJbc2l6ZW9mKHVpbnQzMikrNF09KDE2fG0pOwogCQkJZm9yIChuPTA7IG48MTY7IG4rKykKIAkJCQlyYltzaXplb2YodWludDMyKSs1K25dPW9bbl07Ci0JCQlwPVRJRkZSZWFkRmlsZSh0aWYsJihyYltzaXplb2YodWludDMyKSsyMV0pLHEpOworCQkJcD0odWludDMyKVRJRkZSZWFkRmlsZSh0aWYsJihyYltzaXplb2YodWludDMyKSsyMV0pLHEpOwogCQkJaWYgKHAhPXEpCi0JCQl7Ci0JCQkJX1RJRkZmcmVlKHJiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX1RJRkZmcmVlKHJiKTsKIAkJCQlyZXR1cm4oMCk7Ci0JCQl9Ci0JCQlpZiAoc3AtPmFjdGFibGVbbV0pCisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQlpZiAoc3AtPmFjdGFibGVbbV0hPTApCiAJCQkJX1RJRkZmcmVlKHNwLT5hY3RhYmxlW21dKTsKIAkJCXNwLT5hY3RhYmxlW21dPXJiOwogCQkJc3AtPnNvc190ZGFbbV09KHNwLT5zb3NfdGRhW21dfG0pOwpAQCAtMjI5MywxMCArMjMwMiwxMCBAQAogCS8qIFAgKi8KIAlzcC0+b3V0X2J1ZmZlcls0XT04OwogCS8qIFkgKi8KLQlzcC0+b3V0X2J1ZmZlcls1XT0oc3AtPnNvZl95Pj44KTsKKwlzcC0+b3V0X2J1ZmZlcls1XT0odWludDgpKHNwLT5zb2ZfeT4+OCk7CiAJc3AtPm91dF9idWZmZXJbNl09KHNwLT5zb2ZfeSYyNTUpOwogCS8qIFggKi8KLQlzcC0+b3V0X2J1ZmZlcls3XT0oc3AtPnNvZl94Pj44KTsKKwlzcC0+b3V0X2J1ZmZlcls3XT0odWludDgpKHNwLT5zb2ZfeD4+OCk7CiAJc3AtPm91dF9idWZmZXJbOF09KHNwLT5zb2ZfeCYyNTUpOwogCS8qIE5mICovCiAJc3AtPm91dF9idWZmZXJbOV09c3AtPnNhbXBsZXNfcGVyX3BpeGVsX3Blcl9wbGFuZTsKQEAgLTI0MDksNyArMjQxOCwxMiBAQAogc3RhdGljIGludAoganBlZ19jcmVhdGVfZGVjb21wcmVzc19lbmNhcChPSlBFR1N0YXRlKiBzcCwganBlZ19kZWNvbXByZXNzX3N0cnVjdCogY2luZm8pCiB7Ci0JcmV0dXJuKFNFVEpNUChzcC0+ZXhpdF9qbXBidWYpPzA6KGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoY2luZm8pLDEpKTsKKwlpZiggU0VUSk1QKHNwLT5leGl0X2ptcGJ1ZikgKQorCQlyZXR1cm4gMDsKKwllbHNlIHsKKwkJanBlZ19jcmVhdGVfZGVjb21wcmVzcyhjaW5mbyk7CisJCXJldHVybiAxOworCX0KIH0KICNlbmRpZgogCkBAIC0yNDE3LDcgKzI0MzEsMTIgQEAKIHN0YXRpYyBpbnQKIGpwZWdfcmVhZF9oZWFkZXJfZW5jYXAoT0pQRUdTdGF0ZSogc3AsIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvLCB1aW50OCByZXF1aXJlX2ltYWdlKQogewotCXJldHVybihTRVRKTVAoc3AtPmV4aXRfam1wYnVmKT8wOihqcGVnX3JlYWRfaGVhZGVyKGNpbmZvLHJlcXVpcmVfaW1hZ2UpLDEpKTsKKwlpZiggU0VUSk1QKHNwLT5leGl0X2ptcGJ1ZikgKQorCQlyZXR1cm4gMDsKKwllbHNlIHsKKwkJanBlZ19yZWFkX2hlYWRlcihjaW5mbyxyZXF1aXJlX2ltYWdlKTsKKwkJcmV0dXJuIDE7CisJfQogfQogI2VuZGlmCiAKQEAgLTI0MjUsNyArMjQ0NCwxMiBAQAogc3RhdGljIGludAoganBlZ19zdGFydF9kZWNvbXByZXNzX2VuY2FwKE9KUEVHU3RhdGUqIHNwLCBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbykKIHsKLQlyZXR1cm4oU0VUSk1QKHNwLT5leGl0X2ptcGJ1Zik/MDooanBlZ19zdGFydF9kZWNvbXByZXNzKGNpbmZvKSwxKSk7CisJaWYoIFNFVEpNUChzcC0+ZXhpdF9qbXBidWYpICkKKwkJcmV0dXJuIDA7CisJZWxzZSB7CisJCWpwZWdfc3RhcnRfZGVjb21wcmVzcyhjaW5mbyk7CisJCXJldHVybiAxOworCX0KIH0KICNlbmRpZgogCkBAIC0yNDMzLDcgKzI0NTcsMTIgQEAKIHN0YXRpYyBpbnQKIGpwZWdfcmVhZF9zY2FubGluZXNfZW5jYXAoT0pQRUdTdGF0ZSogc3AsIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvLCB2b2lkKiBzY2FubGluZXMsIHVpbnQzMiBtYXhfbGluZXMpCiB7Ci0JcmV0dXJuKFNFVEpNUChzcC0+ZXhpdF9qbXBidWYpPzA6KGpwZWdfcmVhZF9zY2FubGluZXMoY2luZm8sc2NhbmxpbmVzLG1heF9saW5lcyksMSkpOworCWlmKCBTRVRKTVAoc3AtPmV4aXRfam1wYnVmKSApCisJCXJldHVybiAwOworCWVsc2UgeworCQlqcGVnX3JlYWRfc2NhbmxpbmVzKGNpbmZvLHNjYW5saW5lcyxtYXhfbGluZXMpOworCQlyZXR1cm4gMTsKKwl9CiB9CiAjZW5kaWYKIApAQCAtMjQ0MSw3ICsyNDcwLDEyIEBACiBzdGF0aWMgaW50CiBqcGVnX3JlYWRfcmF3X2RhdGFfZW5jYXAoT0pQRUdTdGF0ZSogc3AsIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvLCB2b2lkKiBkYXRhLCB1aW50MzIgbWF4X2xpbmVzKQogewotCXJldHVybihTRVRKTVAoc3AtPmV4aXRfam1wYnVmKT8wOihqcGVnX3JlYWRfcmF3X2RhdGEoY2luZm8sZGF0YSxtYXhfbGluZXMpLDEpKTsKKwlpZiggU0VUSk1QKHNwLT5leGl0X2ptcGJ1ZikgKQorCQlyZXR1cm4gMDsKKwllbHNlIHsKKwkJanBlZ19yZWFkX3Jhd19kYXRhKGNpbmZvLGRhdGEsbWF4X2xpbmVzKTsKKwkJcmV0dXJuIDE7CisJfQogfQogI2VuZGlmCiAKQEAgLTI1MDMsNiArMjUzNywxMCBAQAogCWpwZWdfZW5jYXBfdW53aW5kKHRpZik7CiB9CiAKKyNpZmRlZiBfTVNDX1ZFUgorI3ByYWdtYSB3YXJuaW5nKCBwdXNoICkKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZSA6IDQ3MDIgKSAvKiB1bnJlYWNoYWJsZSBjb2RlICovCisjZW5kaWYKIHN0YXRpYyBib29sZWFuCiBPSlBFR0xpYmpwZWdKcGVnU291cmNlTWdyUmVzeW5jVG9SZXN0YXJ0KGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvLCBpbnQgZGVzaXJlZCkKIHsKQEAgLTI1MTIsNiArMjU1MCw5IEBACiAJanBlZ19lbmNhcF91bndpbmQodGlmKTsKIAlyZXR1cm4oMCk7CiB9CisjaWZkZWYgX01TQ19WRVIKKyNwcmFnbWEgd2FybmluZyggcG9wICkgCisjZW5kaWYKIAogc3RhdGljIHZvaWQKIE9KUEVHTGlianBlZ0pwZWdTb3VyY2VNZ3JUZXJtU291cmNlKGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfb3Blbi5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfb3Blbi5jCmluZGV4IDhjODgzMjguLmE3Mjc5ZTEgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX29wZW4uYworKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9vcGVuLmMKQEAgLTEsNCArMSw0IEBACi0vKiAkSWQ6IHRpZl9vcGVuLmMsdiAxLjQ2IDIwMTAtMTItMDYgMTY6NTQ6NTQgZmF4Z3V5IEV4cCAkICovCisvKiAkSWQ6IHRpZl9vcGVuLmMsdiAxLjQ4IDIwMTYtMTEtMjAgMjI6Mjk6NDcgZXJvdWF1bHQgRXhwICQgKi8KIAogLyoKICAqIENvcHlyaWdodCAoYykgMTk4OC0xOTk3IFNhbSBMZWZmbGVyCkBAIC0xNjgsNyArMTY4LDcgQEAKIAkgKiBUaGUgZm9sbG93aW5nIGZsYWdzIG1heSBiZSB1c2VkIHRvIGNvbnRyb2wgaW50cmluc2ljIGxpYnJhcnkKIAkgKiBiZWhhdmlvdXIgdGhhdCBtYXkgb3IgbWF5IG5vdCBiZSBkZXNpcmFibGUgKHVzdWFsbHkgZm9yCiAJICogY29tcGF0aWJpbGl0eSB3aXRoIHNvbWUgYXBwbGljYXRpb24gdGhhdCBjbGFpbXMgdG8gc3VwcG9ydAotCSAqIFRJRkYgYnV0IG9ubHkgc3VwcG9ydHMgc29tZSBicmFpbmRlYWQgaWRlYSBvZiB3aGF0IHRoZQorCSAqIFRJRkYgYnV0IG9ubHkgc3VwcG9ydHMgc29tZSBicmFpbiBkZWFkIGlkZWEgb2Ygd2hhdCB0aGUKIAkgKiB2ZW5kb3IgdGhpbmtzIFRJRkYgaXMpOgogCSAqCiAJICogJ2wnIHVzZSBsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIgZm9yIGNyZWF0aW5nIGEgZmlsZQpAQCAtMTk4LDggKzE5OCw4IEBACiAJICogVGhlICdMJywgJ0InLCBhbmQgJ0gnIGZsYWdzIGFyZSBpbnRlbmRlZCBmb3IgYXBwbGljYXRpb25zCiAJICogdGhhdCBjYW4gb3B0aW1pemUgb3BlcmF0aW9ucyBvbiBkYXRhIGJ5IHVzaW5nIGEgcGFydGljdWxhcgogCSAqIGJpdCBvcmRlci4gIEJ5IGRlZmF1bHQgdGhlIGxpYnJhcnkgcmV0dXJucyBkYXRhIGluIE1TQjJMU0IKLQkgKiBiaXQgb3JkZXIgZm9yIGNvbXBhdGliaWx0aXkgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiB0aGlzCi0JICogbGlicmFyeS4gIFJldHVybmluZyBkYXRhIGluIHRoZSBiaXQgb3JkZXIgb2YgdGhlIG5hdGl2ZSBjcHUKKwkgKiBiaXQgb3JkZXIgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucyBvZiB0aGlzCisJICogbGlicmFyeS4gIFJldHVybmluZyBkYXRhIGluIHRoZSBiaXQgb3JkZXIgb2YgdGhlIG5hdGl2ZSBDUFUKIAkgKiBtYWtlcyB0aGUgbW9zdCBzZW5zZSBidXQgYWxzbyByZXF1aXJlcyBhcHBsaWNhdGlvbnMgdG8gY2hlY2sKIAkgKiB0aGUgdmFsdWUgb2YgdGhlIEZpbGxPcmRlciB0YWc7IHNvbWV0aGluZyB0aGV5IHByb2JhYmx5IGRvCiAJICogbm90IGRvIHJpZ2h0IG5vdy4KQEAgLTI3OSwxMCArMjc5LDEwIEBACiAJCSAqIFNldHVwIGhlYWRlciBhbmQgd3JpdGUuCiAJCSAqLwogCQkjaWZkZWYgV09SRFNfQklHRU5ESUFOCi0JCXRpZi0+dGlmX2hlYWRlci5jb21tb24udGlmZl9tYWdpYyA9IHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCCisJCXRpZi0+dGlmX2hlYWRlci5jb21tb24udGlmZl9tYWdpYyA9ICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfU1dBQikKIAkJICAgID8gVElGRl9MSVRUTEVFTkRJQU4gOiBUSUZGX0JJR0VORElBTjsKIAkJI2Vsc2UKLQkJdGlmLT50aWZfaGVhZGVyLmNvbW1vbi50aWZmX21hZ2ljID0gdGlmLT50aWZfZmxhZ3MgJiBUSUZGX1NXQUIKKwkJdGlmLT50aWZfaGVhZGVyLmNvbW1vbi50aWZmX21hZ2ljID0gKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQogCQkgICAgPyBUSUZGX0JJR0VORElBTiA6IFRJRkZfTElUVExFRU5ESUFOOwogCQkjZW5kaWYKIAkJaWYgKCEodGlmLT50aWZfZmxhZ3MmVElGRl9CSUdUSUZGKSkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3BhY2tiaXRzLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9wYWNrYml0cy5jCmluZGV4IDllNzcxOTAuLjE4OTA0YjAgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3BhY2tiaXRzLmMKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcGFja2JpdHMuYwpAQCAtMSw0ICsxLDQgQEAKLS8qICRJZDogdGlmX3BhY2tiaXRzLmMsdiAxLjIyIDIwMTItMDYtMjAgMDU6MjU6MzMgZndhcm1lcmRhbSBFeHAgJCAqLworLyogJElkOiB0aWZfcGFja2JpdHMuYyx2IDEuMjYgMjAxNy0wNS0xNCAwMjoyNjowNyBlcm91YXVsdCBFeHAgJCAqLwogCiAvKgogICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKQEAgLTM4LDcgKzM4LDggQEAKIHsKIAkodm9pZCkgczsKIAotCWlmICghKHRpZi0+dGlmX2RhdGEgPSAodWludDgqKV9USUZGbWFsbG9jKHNpemVvZih0bXNpemVfdCkpKSkKKyAgICAgICAgdGlmLT50aWZfZGF0YSA9ICh1aW50OCopX1RJRkZtYWxsb2Moc2l6ZW9mKHRtc2l6ZV90KSk7CisJaWYgKHRpZi0+dGlmX2RhdGEgPT0gTlVMTCkKIAkJcmV0dXJuICgwKTsKIAkvKgogCSAqIENhbGN1bGF0ZSB0aGUgc2NhbmxpbmUvdGlsZS13aWR0aCBzaXplIGluIGJ5dGVzLgpAQCAtODEsNyArODIsOSBAQAogCQkvKgogCQkgKiBGaW5kIHRoZSBsb25nZXN0IHN0cmluZyBvZiBpZGVudGljYWwgYnl0ZXMuCiAJCSAqLwotCQliID0gKmJwKyssIGNjLS0sIG4gPSAxOworCQliID0gKmJwKys7CisJCWNjLS07CisJCW4gPSAxOwogCQlmb3IgKDsgY2MgPiAwICYmIGIgPT0gKmJwOyBjYy0tLCBicCsrKQogCQkJbisrOwogCWFnYWluOgpAQCAtOTYsNyArOTksNyBAQAogCQkJCXNsb3AgPSAobG9uZykob3AgLSBsYXN0bGl0ZXJhbCk7CiAJCQkJdGlmLT50aWZfcmF3Y2MgKz0gKHRtc2l6ZV90KShsYXN0bGl0ZXJhbCAtIHRpZi0+dGlmX3Jhd2NwKTsKIAkJCQlpZiAoIVRJRkZGbHVzaERhdGExKHRpZikpCi0JCQkJCXJldHVybiAoLTEpOworCQkJCQlyZXR1cm4gKDApOwogCQkJCW9wID0gdGlmLT50aWZfcmF3Y3A7CiAJCQkJd2hpbGUgKHNsb3AtLSA+IDApCiAJCQkJCSpvcCsrID0gKmxhc3RsaXRlcmFsKys7CkBAIC0xMDQsNyArMTA3LDcgQEAKIAkJCX0gZWxzZSB7CiAJCQkJdGlmLT50aWZfcmF3Y2MgKz0gKHRtc2l6ZV90KShvcCAtIHRpZi0+dGlmX3Jhd2NwKTsKIAkJCQlpZiAoIVRJRkZGbHVzaERhdGExKHRpZikpCi0JCQkJCXJldHVybiAoLTEpOworCQkJCQlyZXR1cm4gKDApOwogCQkJCW9wID0gdGlmLT50aWZfcmF3Y3A7CiAJCQl9CiAJCX0KQEAgLTIyMiw3ICsyMjUsOCBAQAogCWJwID0gKGNoYXIqKSB0aWYtPnRpZl9yYXdjcDsKIAljYyA9IHRpZi0+dGlmX3Jhd2NjOwogCXdoaWxlIChjYyA+IDAgJiYgb2NjID4gMCkgewotCQluID0gKGxvbmcpICpicCsrLCBjYy0tOworCQluID0gKGxvbmcpICpicCsrOworCQljYy0tOwogCQkvKgogCQkgKiBXYXRjaCBvdXQgZm9yIGNvbXBpbGVycyB0aGF0CiAJCSAqIGRvbid0IHNpZ24gZXh0ZW5kIGNoYXJzLi4uCkBAIC0yNDAsOCArMjQ0LDE1IEBACiAJCQkJICAgICh1bnNpZ25lZCBsb25nKSAoKHRtc2l6ZV90KW4gLSBvY2MpKTsKIAkJCQluID0gKGxvbmcpb2NjOwogCQkJfQorCQkJaWYoIGNjID09IDAgKQorCQkJeworCQkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJICAgICAgICJUZXJtaW5hdGluZyBQYWNrQml0c0RlY29kZSBkdWUgdG8gbGFjayBvZiBkYXRhLiIpOworCQkJCWJyZWFrOworCQkJfQogCQkJb2NjIC09IG47Ci0JCQliID0gKmJwKyssIGNjLS07CisJCQliID0gKmJwKys7CisJCQljYy0tOwogCQkJd2hpbGUgKG4tLSA+IDApCiAJCQkJKm9wKysgPSAodWludDgpIGI7CiAJCX0gZWxzZSB7CQkvKiBjb3B5IG5leHQgbisxIGJ5dGVzIGxpdGVyYWxseSAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcGl4YXJsb2cuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3BpeGFybG9nLmMKaW5kZXggMjk1MzVkMy4uZjIyNjM5NSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcGl4YXJsb2cuYworKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9waXhhcmxvZy5jCkBAIC0xLDQgKzEsNCBAQAotLyogJElkOiB0aWZfcGl4YXJsb2cuYyx2IDEuMzkgMjAxMi0xMi0xMCAxNzoyNzoxMyB0Z2wgRXhwICQgKi8KKy8qICRJZDogdGlmX3BpeGFybG9nLmMsdiAxLjUzIDIwMTctMDUtMTcgMDk6NTM6MDYgZXJvdWF1bHQgRXhwICQgKi8KIAogLyoKICAqIENvcHlyaWdodCAoYykgMTk5Ni0xOTk3IFNhbSBMZWZmbGVyCkBAIC00NSwxNSArNDUsMTUgQEAKICAqIGlucHV0IGlzIGFzc3VtZWQgdG8gYmUgdW5zaWduZWQgbGluZWFyIGNvbG9yIHZhbHVlcyB0aGF0IHJlcHJlc2VudAogICogdGhlIHJhbmdlIDAtMS4gIEluIHRoZSBjYXNlIG9mIElFRUUgdmFsdWVzLCB0aGUgMC0xIHJhbmdlIGlzIGFzc3VtZWQgdG8KICAqIGJlIHRoZSBub3JtYWwgbGluZWFyIGNvbG9yIHJhbmdlLCBpbiBhZGRpdGlvbiBvdmVyIDEgdmFsdWVzIGFyZQotICogYWNjZXB0ZWQgdXAgdG8gYSB2YWx1ZSBvZiBhYm91dCAyNS4wIHRvIGVuY29kZSAiaG90IiBoaWdodGxpZ2h0cyBhbmQgc3VjaC4KKyAqIGFjY2VwdGVkIHVwIHRvIGEgdmFsdWUgb2YgYWJvdXQgMjUuMCB0byBlbmNvZGUgImhvdCIgaGlnaGxpZ2h0cyBhbmQgc3VjaC4KICAqIFRoZSBlbmNvZGluZyBpcyBsb3NzbGVzcyBmb3IgOC1iaXQgdmFsdWVzLCBzbGlnaHRseSBsb3NzeSBmb3IgdGhlCiAgKiBvdGhlciBiaXQgZGVwdGhzLiAgVGhlIGFjdHVhbCBjb2xvciBwcmVjaXNpb24gc2hvdWxkIGJlIGJldHRlcgogICogdGhhbiB0aGUgaHVtYW4gZXllIGNhbiBwZXJjZWl2ZSB3aXRoIGV4dHJhIHJvb20gdG8gYWxsb3cgZm9yCiAgKiBlcnJvciBpbnRyb2R1Y2VkIGJ5IGZ1cnRoZXIgaW1hZ2UgY29tcHV0YXRpb24uICBBcyB3aXRoIGFueSBxdWFudGl6ZWQKICAqIGNvbG9yIGZvcm1hdCwgaXQgaXMgcG9zc2libGUgdG8gcGVyZm9ybSBpbWFnZSBjYWxjdWxhdGlvbnMgd2hpY2gKICAqIGV4cG9zZSB0aGUgcXVhbnRpemF0aW9uIGVycm9yLiBUaGlzIGZvcm1hdCBzaG91bGQgY2VydGFpbmx5IGJlIGxlc3MgCi0gKiBzdXNjZXB0YWJsZSB0byBzdWNoIGVycm9ycyB0aGFuIHN0YW5kYXJkIDgtYml0IGVuY29kaW5ncywgYnV0IG1vcmUKLSAqIHN1c2NlcHRhYmxlIHRoYW4gc3RyYWlnaHQgMTYtYml0IG9yIDMyLWJpdCBlbmNvZGluZ3MuCisgKiBzdXNjZXB0aWJsZSB0byBzdWNoIGVycm9ycyB0aGFuIHN0YW5kYXJkIDgtYml0IGVuY29kaW5ncywgYnV0IG1vcmUKKyAqIHN1c2NlcHRpYmxlIHRoYW4gc3RyYWlnaHQgMTYtYml0IG9yIDMyLWJpdCBlbmNvZGluZ3MuCiAgKgogICogT24gcmVhZGluZyB0aGUgaW50ZXJuYWwgZm9ybWF0IGlzIGNvbnZlcnRlZCB0byB0aGUgZGVzaXJlZCBvdXRwdXQgZm9ybWF0LgogICogVGhlIHByb2dyYW0gY2FuIHJlcXVlc3Qgd2hpY2ggZm9ybWF0IGl0IGRlc2lyZXMgYnkgc2V0dGluZyB0aGUgaW50ZXJuYWwKQEAgLTkwLDcgKzkwLDcgQEAKICAqLwogCiAjaW5jbHVkZSAidGlmX3ByZWRpY3QuaCIKLSNpbmNsdWRlICIuLi96bGliX3YxMjgvemxpYi5oIgorI2luY2x1ZGUgInpsaWIuaCIKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC0yOTYsMzMgKzI5NiwzNSBAQAogc3RhdGljIHZvaWQKIGhvcml6b250YWxBY2N1bXVsYXRlMTEodWludDE2ICp3cCwgaW50IG4sIGludCBzdHJpZGUsIHVpbnQxNiAqb3ApCiB7Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50ICBjciwgY2csIGNiLCBjYSwgbWFzazsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBpbnQgY3IsIGNnLCBjYiwgY2EsIG1hc2s7CiAKICAgICBpZiAobiA+PSBzdHJpZGUpIHsKIAltYXNrID0gQ09ERV9NQVNLOwogCWlmIChzdHJpZGUgPT0gMykgewotCSAgICBvcFswXSA9IGNyID0gd3BbMF07ICBvcFsxXSA9IGNnID0gd3BbMV07ICBvcFsyXSA9IGNiID0gd3BbMl07CisJICAgIG9wWzBdID0gd3BbMF07ICBvcFsxXSA9IHdwWzFdOyAgb3BbMl0gPSB3cFsyXTsKKyAgICAgICAgICAgIGNyID0gd3BbMF07ICBjZyA9IHdwWzFdOyAgY2IgPSB3cFsyXTsKIAkgICAgbiAtPSAzOwogCSAgICB3aGlsZSAobiA+IDApIHsKIAkJd3AgKz0gMzsKIAkJb3AgKz0gMzsKIAkJbiAtPSAzOwotCQlvcFswXSA9IChjciArPSB3cFswXSkgJiBtYXNrOwotCQlvcFsxXSA9IChjZyArPSB3cFsxXSkgJiBtYXNrOwotCQlvcFsyXSA9IChjYiArPSB3cFsyXSkgJiBtYXNrOworCQlvcFswXSA9ICh1aW50MTYpKChjciArPSB3cFswXSkgJiBtYXNrKTsKKwkJb3BbMV0gPSAodWludDE2KSgoY2cgKz0gd3BbMV0pICYgbWFzayk7CisJCW9wWzJdID0gKHVpbnQxNikoKGNiICs9IHdwWzJdKSAmIG1hc2spOwogCSAgICB9CiAJfSBlbHNlIGlmIChzdHJpZGUgPT0gNCkgewotCSAgICBvcFswXSA9IGNyID0gd3BbMF07ICBvcFsxXSA9IGNnID0gd3BbMV07Ci0JICAgIG9wWzJdID0gY2IgPSB3cFsyXTsgIG9wWzNdID0gY2EgPSB3cFszXTsKKwkgICAgb3BbMF0gPSB3cFswXTsgIG9wWzFdID0gd3BbMV07CisJICAgIG9wWzJdID0gd3BbMl07ICBvcFszXSA9IHdwWzNdOworICAgICAgICAgICAgY3IgPSB3cFswXTsgY2cgPSB3cFsxXTsgY2IgPSB3cFsyXTsgY2EgPSB3cFszXTsKIAkgICAgbiAtPSA0OwogCSAgICB3aGlsZSAobiA+IDApIHsKIAkJd3AgKz0gNDsKIAkJb3AgKz0gNDsKIAkJbiAtPSA0OwotCQlvcFswXSA9IChjciArPSB3cFswXSkgJiBtYXNrOwotCQlvcFsxXSA9IChjZyArPSB3cFsxXSkgJiBtYXNrOwotCQlvcFsyXSA9IChjYiArPSB3cFsyXSkgJiBtYXNrOwotCQlvcFszXSA9IChjYSArPSB3cFszXSkgJiBtYXNrOworCQlvcFswXSA9ICh1aW50MTYpKChjciArPSB3cFswXSkgJiBtYXNrKTsKKwkJb3BbMV0gPSAodWludDE2KSgoY2cgKz0gd3BbMV0pICYgbWFzayk7CisJCW9wWzJdID0gKHVpbnQxNikoKGNiICs9IHdwWzJdKSAmIG1hc2spOworCQlvcFszXSA9ICh1aW50MTYpKChjYSArPSB3cFszXSkgJiBtYXNrKTsKIAkgICAgfSAKIAl9IGVsc2UgewogCSAgICBSRVBFQVQoc3RyaWRlLCAqb3AgPSAqd3AmbWFzazsgd3ArKzsgb3ArKykKQEAgLTU1Nyw3ICs1NTksNyBAQAogICAgIGZvciAoaSA9IDA7IGkgPCBsdDJzaXplOyBpKyspICB7CiAJaWYgKChpKmxpbnN0ZXApKihpKmxpbnN0ZXApID4gVG9MaW5lYXJGW2pdKlRvTGluZWFyRltqKzFdKQogCSAgICBqKys7Ci0JRnJvbUxUMltpXSA9IGo7CisJRnJvbUxUMltpXSA9ICh1aW50MTYpajsKICAgICB9CiAKICAgICAvKgpAQCAtNTY5LDE0ICs1NzEsMTQgQEAKICAgICBmb3IgKGkgPSAwOyBpIDwgMTYzODQ7IGkrKykgIHsKIAl3aGlsZSAoKGkvMTYzODMuKSooaS8xNjM4My4pID4gVG9MaW5lYXJGW2pdKlRvTGluZWFyRltqKzFdKQogCSAgICBqKys7Ci0JRnJvbTE0W2ldID0gajsKKwlGcm9tMTRbaV0gPSAodWludDE2KWo7CiAgICAgfQogCiAgICAgaiA9IDA7CiAgICAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSAgewogCXdoaWxlICgoaS8yNTUuKSooaS8yNTUuKSA+IFRvTGluZWFyRltqXSpUb0xpbmVhckZbaisxXSkKIAkgICAgaisrOwotCUZyb204W2ldID0gajsKKwlGcm9tOFtpXSA9ICh1aW50MTYpajsKICAgICB9CiAKICAgICBGbHRzaXplID0gKGZsb2F0KShsdDJzaXplLzIpOwpAQCAtNjM0LDI5ICs2MzYsMjcgQEAKIAlyZXR1cm4gZ3Vlc3M7CiB9CiAKKyNkZWZpbmUgVElGRl9TSVpFX1RfTUFYICgoc2l6ZV90KSB+ICgoc2l6ZV90KTApKQorI2RlZmluZSBUSUZGX1RNU0laRV9UX01BWCAodG1zaXplX3QpKFRJRkZfU0laRV9UX01BWCA+PiAxKQorCiBzdGF0aWMgdG1zaXplX3QKIG11bHRpcGx5X21zKHRtc2l6ZV90IG0xLCB0bXNpemVfdCBtMikKIHsKLQl0bXNpemVfdCBieXRlcyA9IG0xICogbTI7Ci0KLQlpZiAobTEgJiYgYnl0ZXMgLyBtMSAhPSBtMikKLQkJYnl0ZXMgPSAwOwotCi0JcmV0dXJuIGJ5dGVzOworICAgICAgICBpZiggbTEgPT0gMCB8fCBtMiA+IFRJRkZfVE1TSVpFX1RfTUFYIC8gbTEgKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBtMSAqIG0yOwogfQogCiBzdGF0aWMgdG1zaXplX3QKIGFkZF9tcyh0bXNpemVfdCBtMSwgdG1zaXplX3QgbTIpCiB7Ci0JdG1zaXplX3QgYnl0ZXMgPSBtMSArIG0yOwotCiAJLyogaWYgZWl0aGVyIGlucHV0IGlzIHplcm8sIGFzc3VtZSBvdmVyZmxvdyBhbHJlYWR5IG9jY3VycmVkICovCiAJaWYgKG0xID09IDAgfHwgbTIgPT0gMCkKLQkJYnl0ZXMgPSAwOwotCWVsc2UgaWYgKGJ5dGVzIDw9IG0xIHx8IGJ5dGVzIDw9IG0yKQotCQlieXRlcyA9IDA7CisJCXJldHVybiAwOworCWVsc2UgaWYgKG0xID4gVElGRl9UTVNJWkVfVF9NQVggLSBtMikKKwkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gYnl0ZXM7CisJcmV0dXJuIG0xICsgbTI7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTY3Niw2ICs2NzYsMTIgQEAKIAogCWFzc2VydChzcCAhPSBOVUxMKTsKIAorCS8qIFRoaXMgZnVuY3Rpb24gY2FuIHBvc3NpYmx5IGJlIGNhbGxlZCBzZXZlcmFsIHRpbWVzIGJ5ICovCisJLyogUHJlZGljdG9yU2V0dXBEZWNvZGUoKSBpZiB0aGlzIGZ1bmN0aW9uIHN1Y2NlZWRzIGJ1dCAqLworCS8qIFByZWRpY3RvclNldHVwKCkgZmFpbHMgKi8KKwlpZiggKHNwLT5zdGF0ZSAmIFBMU1RBVEVfSU5JVCkgIT0gMCApCisJCXJldHVybiAxOworCiAJLyogTWFrZSBzdXJlIG5vIGJ5dGUgc3dhcHBpbmcgaGFwcGVucyBvbiB0aGUgZGF0YQogCSAqIGFmdGVyIGRlY29tcHJlc3Npb24uICovCiAJdGlmLT50aWZfcG9zdGRlY29kZSA9IF9USUZGTm9Qb3N0RGVjb2RlOyAgCkBAIC02OTcsNiArNzAzLDkgQEAKIAlpZiAoc3AtPnVzZXJfZGF0YWZtdCA9PSBQSVhBUkxPR0RBVEFGTVRfVU5LTk9XTikKIAkJc3AtPnVzZXJfZGF0YWZtdCA9IFBpeGFyTG9nR3Vlc3NEYXRhRm10KHRkKTsKIAlpZiAoc3AtPnVzZXJfZGF0YWZtdCA9PSBQSVhBUkxPR0RBVEFGTVRfVU5LTk9XTikgeworICAgICAgICAgICAgICAgIF9USUZGZnJlZShzcC0+dGJ1Zik7CisgICAgICAgICAgICAgICAgc3AtPnRidWYgPSBOVUxMOworICAgICAgICAgICAgICAgIHNwLT50YnVmX3NpemUgPSAwOwogCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAogCQkJIlBpeGFyTG9nIGNvbXByZXNzaW9uIGNhbid0IGhhbmRsZSBiaXRzIGRlcHRoL2RhdGEgZm9ybWF0IGNvbWJpbmF0aW9uIChkZXB0aDogJWQpIiwgCiAJCQl0ZC0+dGRfYml0c3BlcnNhbXBsZSk7CkBAIC03MDQsNyArNzEzLDEwIEBACiAJfQogCiAJaWYgKGluZmxhdGVJbml0KCZzcC0+c3RyZWFtKSAhPSBaX09LKSB7Ci0JCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICIlcyIsIHNwLT5zdHJlYW0ubXNnKTsKKyAgICAgICAgICAgICAgICBfVElGRmZyZWUoc3AtPnRidWYpOworICAgICAgICAgICAgICAgIHNwLT50YnVmID0gTlVMTDsKKyAgICAgICAgICAgICAgICBzcC0+dGJ1Zl9zaXplID0gMDsKKwkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIiVzIiwgc3AtPnN0cmVhbS5tc2cgPyBzcC0+c3RyZWFtLm1zZyA6ICIobnVsbCkiKTsKIAkJcmV0dXJuICgwKTsKIAl9IGVsc2UgewogCQlzcC0+c3RhdGUgfD0gUExTVEFURV9JTklUOwpAQCAtNzI3LDcgKzczOSw3IEBACiAJYXNzZXJ0KHNpemVvZihzcC0+c3RyZWFtLmF2YWlsX2luKT09NCk7ICAvKiBpZiB0aGlzIGFzc2VydCBnZXRzIHJhaXNlZCwKIAkgICAgd2UgbmVlZCB0byBzaW1wbGlmeSB0aGlzIGNvZGUgdG8gcmVmbGVjdCBhIFpMaWIgdGhhdCBpcyBsaWtlbHkgdXBkYXRlZAogCSAgICB0byBkZWFsIHdpdGggOGJ5dGUgbWVtb3J5IHNpemVzLCB0aG91Z2ggdGhpcyBjb2RlIHdpbGwgcmVzcG9uZAotCSAgICBhcHJvcHJpYXRlbHkgZXZlbiBiZWZvcmUgd2Ugc2ltcGxpZnkgaXQgKi8KKwkgICAgYXBwcm9wcmlhdGVseSBldmVuIGJlZm9yZSB3ZSBzaW1wbGlmeSBpdCAqLwogCXNwLT5zdHJlYW0uYXZhaWxfaW4gPSAodUludCkgdGlmLT50aWZfcmF3Y2M7CiAJaWYgKCh0bXNpemVfdClzcC0+c3RyZWFtLmF2YWlsX2luICE9IHRpZi0+dGlmX3Jhd2NjKQogCXsKQEAgLTc3MiwxMSArNzg0LDE1IEBACiAKIAkodm9pZCkgczsKIAlhc3NlcnQoc3AgIT0gTlVMTCk7CisKKyAgICAgICAgc3AtPnN0cmVhbS5uZXh0X2luID0gdGlmLT50aWZfcmF3Y3A7CisJc3AtPnN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KSB0aWYtPnRpZl9yYXdjYzsKKwogCXNwLT5zdHJlYW0ubmV4dF9vdXQgPSAodW5zaWduZWQgY2hhciAqKSBzcC0+dGJ1ZjsKIAlhc3NlcnQoc2l6ZW9mKHNwLT5zdHJlYW0uYXZhaWxfb3V0KT09NCk7ICAvKiBpZiB0aGlzIGFzc2VydCBnZXRzIHJhaXNlZCwKIAkgICAgd2UgbmVlZCB0byBzaW1wbGlmeSB0aGlzIGNvZGUgdG8gcmVmbGVjdCBhIFpMaWIgdGhhdCBpcyBsaWtlbHkgdXBkYXRlZAogCSAgICB0byBkZWFsIHdpdGggOGJ5dGUgbWVtb3J5IHNpemVzLCB0aG91Z2ggdGhpcyBjb2RlIHdpbGwgcmVzcG9uZAotCSAgICBhcHJvcHJpYXRlbHkgZXZlbiBiZWZvcmUgd2Ugc2ltcGxpZnkgaXQgKi8KKwkgICAgYXBwcm9wcmlhdGVseSBldmVuIGJlZm9yZSB3ZSBzaW1wbGlmeSBpdCAqLwogCXNwLT5zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpIChuc2FtcGxlcyAqIHNpemVvZih1aW50MTYpKTsKIAlpZiAoc3AtPnN0cmVhbS5hdmFpbF9vdXQgIT0gbnNhbXBsZXMgKiBzaXplb2YodWludDE2KSkKIAl7CkBAIC03OTcsMTQgKzgxMywxNCBAQAogCQlpZiAoc3RhdGUgPT0gWl9EQVRBX0VSUk9SKSB7CiAJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAogCQkJICAgICJEZWNvZGluZyBlcnJvciBhdCBzY2FubGluZSAlbHUsICVzIiwKLQkJCSAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfcm93LCBzcC0+c3RyZWFtLm1zZyk7CisJCQkgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3Jvdywgc3AtPnN0cmVhbS5tc2cgPyBzcC0+c3RyZWFtLm1zZyA6ICIobnVsbCkiKTsKIAkJCWlmIChpbmZsYXRlU3luYygmc3AtPnN0cmVhbSkgIT0gWl9PSykKIAkJCQlyZXR1cm4gKDApOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKHN0YXRlICE9IFpfT0spIHsKIAkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJaTGliIGVycm9yOiAlcyIsCi0JCQkgICAgc3AtPnN0cmVhbS5tc2cpOworCQkJICAgIHNwLT5zdHJlYW0ubXNnID8gc3AtPnN0cmVhbS5tc2cgOiAiKG51bGwpIik7CiAJCQlyZXR1cm4gKDApOwogCQl9CiAJfSB3aGlsZSAoc3AtPnN0cmVhbS5hdmFpbF9vdXQgPiAwKTsKQEAgLTgxNyw2ICs4MzMsOSBAQAogCQlyZXR1cm4gKDApOwogCX0KIAorICAgICAgICB0aWYtPnRpZl9yYXdjcCA9IHNwLT5zdHJlYW0ubmV4dF9pbjsKKyAgICAgICAgdGlmLT50aWZfcmF3Y2MgPSBzcC0+c3RyZWFtLmF2YWlsX2luOworCiAJdXAgPSBzcC0+dGJ1ZjsKIAkvKiBTd2FwIGJ5dGVzIGluIHRoZSBkYXRhIGlmIGZyb20gYSBkaWZmZXJlbnQgZW5kaWFuIG1hY2hpbmUuICovCiAJaWYgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9TV0FCKQpAQCAtOTA2LDcgKzkyNSw3IEBACiAJfQogCiAJaWYgKGRlZmxhdGVJbml0KCZzcC0+c3RyZWFtLCBzcC0+cXVhbGl0eSkgIT0gWl9PSykgewotCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiJXMiLCBzcC0+c3RyZWFtLm1zZyk7CisJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICIlcyIsIHNwLT5zdHJlYW0ubXNnID8gc3AtPnN0cmVhbS5tc2cgOiAiKG51bGwpIik7CiAJCXJldHVybiAoMCk7CiAJfSBlbHNlIHsKIAkJc3AtPnN0YXRlIHw9IFBMU1RBVEVfSU5JVDsKQEAgLTkyOSw4ICs5NDgsOCBAQAogCWFzc2VydChzaXplb2Yoc3AtPnN0cmVhbS5hdmFpbF9vdXQpPT00KTsgIC8qIGlmIHRoaXMgYXNzZXJ0IGdldHMgcmFpc2VkLAogCSAgICB3ZSBuZWVkIHRvIHNpbXBsaWZ5IHRoaXMgY29kZSB0byByZWZsZWN0IGEgWkxpYiB0aGF0IGlzIGxpa2VseSB1cGRhdGVkCiAJICAgIHRvIGRlYWwgd2l0aCA4Ynl0ZSBtZW1vcnkgc2l6ZXMsIHRob3VnaCB0aGlzIGNvZGUgd2lsbCByZXNwb25kCi0JICAgIGFwcm9wcmlhdGVseSBldmVuIGJlZm9yZSB3ZSBzaW1wbGlmeSBpdCAqLwotCXNwLT5zdHJlYW0uYXZhaWxfb3V0ID0gdGlmLT50aWZfcmF3ZGF0YXNpemU7CisJICAgIGFwcHJvcHJpYXRlbHkgZXZlbiBiZWZvcmUgd2Ugc2ltcGxpZnkgaXQgKi8KKwlzcC0+c3RyZWFtLmF2YWlsX291dCA9ICh1SW50KXRpZi0+dGlmX3Jhd2RhdGFzaXplOwogCWlmICgodG1zaXplX3Qpc3AtPnN0cmVhbS5hdmFpbF9vdXQgIT0gdGlmLT50aWZfcmF3ZGF0YXNpemUpCiAJewogCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiWkxpYiBjYW5ub3QgZGVhbCB3aXRoIGJ1ZmZlcnMgdGhpcyBzaXplIik7CkBAIC05NjEsOSArOTgwLDkgQEAKIAkJbiAtPSAzOwogCQl3cCArPSAzOwogCQlpcCArPSAzOwotCQlyMSA9IChpbnQzMikgQ0xBTVAoaXBbMF0pOyB3cFswXSA9IChyMS1yMikgJiBtYXNrOyByMiA9IHIxOwotCQlnMSA9IChpbnQzMikgQ0xBTVAoaXBbMV0pOyB3cFsxXSA9IChnMS1nMikgJiBtYXNrOyBnMiA9IGcxOwotCQliMSA9IChpbnQzMikgQ0xBTVAoaXBbMl0pOyB3cFsyXSA9IChiMS1iMikgJiBtYXNrOyBiMiA9IGIxOworCQlyMSA9IChpbnQzMikgQ0xBTVAoaXBbMF0pOyB3cFswXSA9ICh1aW50MTYpKChyMS1yMikgJiBtYXNrKTsgcjIgPSByMTsKKwkJZzEgPSAoaW50MzIpIENMQU1QKGlwWzFdKTsgd3BbMV0gPSAodWludDE2KSgoZzEtZzIpICYgbWFzayk7IGcyID0gZzE7CisJCWIxID0gKGludDMyKSBDTEFNUChpcFsyXSk7IHdwWzJdID0gKHVpbnQxNikoKGIxLWIyKSAmIG1hc2spOyBiMiA9IGIxOwogCSAgICB9CiAJfSBlbHNlIGlmIChzdHJpZGUgPT0gNCkgewogCSAgICByMiA9IHdwWzBdID0gKHVpbnQxNikgQ0xBTVAoaXBbMF0pOwpAQCAtOTc1LDIzICs5OTQsMjAgQEAKIAkJbiAtPSA0OwogCQl3cCArPSA0OwogCQlpcCArPSA0OwotCQlyMSA9IChpbnQzMikgQ0xBTVAoaXBbMF0pOyB3cFswXSA9IChyMS1yMikgJiBtYXNrOyByMiA9IHIxOwotCQlnMSA9IChpbnQzMikgQ0xBTVAoaXBbMV0pOyB3cFsxXSA9IChnMS1nMikgJiBtYXNrOyBnMiA9IGcxOwotCQliMSA9IChpbnQzMikgQ0xBTVAoaXBbMl0pOyB3cFsyXSA9IChiMS1iMikgJiBtYXNrOyBiMiA9IGIxOwotCQlhMSA9IChpbnQzMikgQ0xBTVAoaXBbM10pOyB3cFszXSA9IChhMS1hMikgJiBtYXNrOyBhMiA9IGExOworCQlyMSA9IChpbnQzMikgQ0xBTVAoaXBbMF0pOyB3cFswXSA9ICh1aW50MTYpKChyMS1yMikgJiBtYXNrKTsgcjIgPSByMTsKKwkJZzEgPSAoaW50MzIpIENMQU1QKGlwWzFdKTsgd3BbMV0gPSAodWludDE2KSgoZzEtZzIpICYgbWFzayk7IGcyID0gZzE7CisJCWIxID0gKGludDMyKSBDTEFNUChpcFsyXSk7IHdwWzJdID0gKHVpbnQxNikoKGIxLWIyKSAmIG1hc2spOyBiMiA9IGIxOworCQlhMSA9IChpbnQzMikgQ0xBTVAoaXBbM10pOyB3cFszXSA9ICh1aW50MTYpKChhMS1hMikgJiBtYXNrKTsgYTIgPSBhMTsKIAkgICAgfQogCX0gZWxzZSB7Ci0JICAgIGlwICs9IG4gLSAxOwkvKiBwb2ludCB0byBsYXN0IG9uZSAqLwotCSAgICB3cCArPSBuIC0gMTsJLyogcG9pbnQgdG8gbGFzdCBvbmUgKi8KLQkgICAgbiAtPSBzdHJpZGU7Ci0JICAgIHdoaWxlIChuID4gMCkgewotCQlSRVBFQVQoc3RyaWRlLCB3cFswXSA9ICh1aW50MTYpIENMQU1QKGlwWzBdKTsKLQkJCQl3cFtzdHJpZGVdIC09IHdwWzBdOwotCQkJCXdwW3N0cmlkZV0gJj0gbWFzazsKLQkJCQl3cC0tOyBpcC0tKQotCQluIC09IHN0cmlkZTsKLQkgICAgfQotCSAgICBSRVBFQVQoc3RyaWRlLCB3cFswXSA9ICh1aW50MTYpIENMQU1QKGlwWzBdKTsgd3AtLTsgaXAtLSkKKyAgICAgICAgUkVQRUFUKHN0cmlkZSwgd3BbMF0gPSAodWludDE2KSBDTEFNUChpcFswXSk7IHdwKys7IGlwKyspCisgICAgICAgIG4gLT0gc3RyaWRlOworICAgICAgICB3aGlsZSAobiA+IDApIHsKKyAgICAgICAgICAgIFJFUEVBVChzdHJpZGUsCisgICAgICAgICAgICAgICAgd3BbMF0gPSAodWludDE2KSgoKGludDMyKUNMQU1QKGlwWzBdKS0oaW50MzIpQ0xBTVAoaXBbLXN0cmlkZV0pKSAmIG1hc2spOworICAgICAgICAgICAgICAgIHdwKys7IGlwKyspCisgICAgICAgICAgICBuIC09IHN0cmlkZTsKKyAgICAgICAgfQogCX0KICAgICB9CiB9CkBAIC0xMDE2LDkgKzEwMzIsOSBAQAogCQluIC09IDM7CiAJCXdwICs9IDM7CiAJCWlwICs9IDM7Ci0JCXIxID0gQ0xBTVAoaXBbMF0pOyB3cFswXSA9IChyMS1yMikgJiBtYXNrOyByMiA9IHIxOwotCQlnMSA9IENMQU1QKGlwWzFdKTsgd3BbMV0gPSAoZzEtZzIpICYgbWFzazsgZzIgPSBnMTsKLQkJYjEgPSBDTEFNUChpcFsyXSk7IHdwWzJdID0gKGIxLWIyKSAmIG1hc2s7IGIyID0gYjE7CisJCXIxID0gQ0xBTVAoaXBbMF0pOyB3cFswXSA9ICh1aW50MTYpKChyMS1yMikgJiBtYXNrKTsgcjIgPSByMTsKKwkJZzEgPSBDTEFNUChpcFsxXSk7IHdwWzFdID0gKHVpbnQxNikoKGcxLWcyKSAmIG1hc2spOyBnMiA9IGcxOworCQliMSA9IENMQU1QKGlwWzJdKTsgd3BbMl0gPSAodWludDE2KSgoYjEtYjIpICYgbWFzayk7IGIyID0gYjE7CiAJICAgIH0KIAl9IGVsc2UgaWYgKHN0cmlkZSA9PSA0KSB7CiAJICAgIHIyID0gd3BbMF0gPSBDTEFNUChpcFswXSk7ICBnMiA9IHdwWzFdID0gQ0xBTVAoaXBbMV0pOwpAQCAtMTAyOCwyMyArMTA0NCwyMCBAQAogCQluIC09IDQ7CiAJCXdwICs9IDQ7CiAJCWlwICs9IDQ7Ci0JCXIxID0gQ0xBTVAoaXBbMF0pOyB3cFswXSA9IChyMS1yMikgJiBtYXNrOyByMiA9IHIxOwotCQlnMSA9IENMQU1QKGlwWzFdKTsgd3BbMV0gPSAoZzEtZzIpICYgbWFzazsgZzIgPSBnMTsKLQkJYjEgPSBDTEFNUChpcFsyXSk7IHdwWzJdID0gKGIxLWIyKSAmIG1hc2s7IGIyID0gYjE7Ci0JCWExID0gQ0xBTVAoaXBbM10pOyB3cFszXSA9IChhMS1hMikgJiBtYXNrOyBhMiA9IGExOworCQlyMSA9IENMQU1QKGlwWzBdKTsgd3BbMF0gPSAodWludDE2KSgocjEtcjIpICYgbWFzayk7IHIyID0gcjE7CisJCWcxID0gQ0xBTVAoaXBbMV0pOyB3cFsxXSA9ICh1aW50MTYpKChnMS1nMikgJiBtYXNrKTsgZzIgPSBnMTsKKwkJYjEgPSBDTEFNUChpcFsyXSk7IHdwWzJdID0gKHVpbnQxNikoKGIxLWIyKSAmIG1hc2spOyBiMiA9IGIxOworCQlhMSA9IENMQU1QKGlwWzNdKTsgd3BbM10gPSAodWludDE2KSgoYTEtYTIpICYgbWFzayk7IGEyID0gYTE7CiAJICAgIH0KIAl9IGVsc2UgewotCSAgICBpcCArPSBuIC0gMTsJLyogcG9pbnQgdG8gbGFzdCBvbmUgKi8KLQkgICAgd3AgKz0gbiAtIDE7CS8qIHBvaW50IHRvIGxhc3Qgb25lICovCisgICAgICAgIFJFUEVBVChzdHJpZGUsIHdwWzBdID0gQ0xBTVAoaXBbMF0pOyB3cCsrOyBpcCsrKQogCSAgICBuIC09IHN0cmlkZTsKIAkgICAgd2hpbGUgKG4gPiAwKSB7Ci0JCVJFUEVBVChzdHJpZGUsIHdwWzBdID0gQ0xBTVAoaXBbMF0pOwotCQkJCXdwW3N0cmlkZV0gLT0gd3BbMF07Ci0JCQkJd3Bbc3RyaWRlXSAmPSBtYXNrOwotCQkJCXdwLS07IGlwLS0pCi0JCW4gLT0gc3RyaWRlOwotCSAgICB9Ci0JICAgIFJFUEVBVChzdHJpZGUsIHdwWzBdID0gQ0xBTVAoaXBbMF0pOyB3cC0tOyBpcC0tKQorICAgICAgICAgICAgUkVQRUFUKHN0cmlkZSwKKyAgICAgICAgICAgICAgICB3cFswXSA9ICh1aW50MTYpKChDTEFNUChpcFswXSktQ0xBTVAoaXBbLXN0cmlkZV0pKSAmIG1hc2spOworICAgICAgICAgICAgICAgIHdwKys7IGlwKyspCisgICAgICAgICAgICBuIC09IHN0cmlkZTsKKyAgICAgICAgfQogCX0KICAgICB9CiB9CkBAIC0xMDY3LDkgKzEwODAsOSBAQAogCSAgICBuIC09IDM7CiAJICAgIHdoaWxlIChuID4gMCkgewogCQluIC09IDM7Ci0JCXIxID0gQ0xBTVAoaXBbM10pOyB3cFszXSA9IChyMS1yMikgJiBtYXNrOyByMiA9IHIxOwotCQlnMSA9IENMQU1QKGlwWzRdKTsgd3BbNF0gPSAoZzEtZzIpICYgbWFzazsgZzIgPSBnMTsKLQkJYjEgPSBDTEFNUChpcFs1XSk7IHdwWzVdID0gKGIxLWIyKSAmIG1hc2s7IGIyID0gYjE7CisJCXIxID0gQ0xBTVAoaXBbM10pOyB3cFszXSA9ICh1aW50MTYpKChyMS1yMikgJiBtYXNrKTsgcjIgPSByMTsKKwkJZzEgPSBDTEFNUChpcFs0XSk7IHdwWzRdID0gKHVpbnQxNikoKGcxLWcyKSAmIG1hc2spOyBnMiA9IGcxOworCQliMSA9IENMQU1QKGlwWzVdKTsgd3BbNV0gPSAodWludDE2KSgoYjEtYjIpICYgbWFzayk7IGIyID0gYjE7CiAJCXdwICs9IDM7CiAJCWlwICs9IDM7CiAJICAgIH0KQEAgLTEwNzksMjYgKzEwOTIsMjMgQEAKIAkgICAgbiAtPSA0OwogCSAgICB3aGlsZSAobiA+IDApIHsKIAkJbiAtPSA0OwotCQlyMSA9IENMQU1QKGlwWzRdKTsgd3BbNF0gPSAocjEtcjIpICYgbWFzazsgcjIgPSByMTsKLQkJZzEgPSBDTEFNUChpcFs1XSk7IHdwWzVdID0gKGcxLWcyKSAmIG1hc2s7IGcyID0gZzE7Ci0JCWIxID0gQ0xBTVAoaXBbNl0pOyB3cFs2XSA9IChiMS1iMikgJiBtYXNrOyBiMiA9IGIxOwotCQlhMSA9IENMQU1QKGlwWzddKTsgd3BbN10gPSAoYTEtYTIpICYgbWFzazsgYTIgPSBhMTsKKwkJcjEgPSBDTEFNUChpcFs0XSk7IHdwWzRdID0gKHVpbnQxNikoKHIxLXIyKSAmIG1hc2spOyByMiA9IHIxOworCQlnMSA9IENMQU1QKGlwWzVdKTsgd3BbNV0gPSAodWludDE2KSgoZzEtZzIpICYgbWFzayk7IGcyID0gZzE7CisJCWIxID0gQ0xBTVAoaXBbNl0pOyB3cFs2XSA9ICh1aW50MTYpKChiMS1iMikgJiBtYXNrKTsgYjIgPSBiMTsKKwkJYTEgPSBDTEFNUChpcFs3XSk7IHdwWzddID0gKHVpbnQxNikoKGExLWEyKSAmIG1hc2spOyBhMiA9IGExOwogCQl3cCArPSA0OwogCQlpcCArPSA0OwogCSAgICB9CiAJfSBlbHNlIHsKLQkgICAgd3AgKz0gbiArIHN0cmlkZSAtIDE7CS8qIHBvaW50IHRvIGxhc3Qgb25lICovCi0JICAgIGlwICs9IG4gKyBzdHJpZGUgLSAxOwkvKiBwb2ludCB0byBsYXN0IG9uZSAqLwotCSAgICBuIC09IHN0cmlkZTsKLQkgICAgd2hpbGUgKG4gPiAwKSB7Ci0JCVJFUEVBVChzdHJpZGUsIHdwWzBdID0gQ0xBTVAoaXBbMF0pOwotCQkJCXdwW3N0cmlkZV0gLT0gd3BbMF07Ci0JCQkJd3Bbc3RyaWRlXSAmPSBtYXNrOwotCQkJCXdwLS07IGlwLS0pCi0JCW4gLT0gc3RyaWRlOwotCSAgICB9Ci0JICAgIFJFUEVBVChzdHJpZGUsIHdwWzBdID0gQ0xBTVAoaXBbMF0pOyB3cC0tOyBpcC0tKQotCX0KKyAgICAgICAgUkVQRUFUKHN0cmlkZSwgd3BbMF0gPSBDTEFNUChpcFswXSk7IHdwKys7IGlwKyspCisgICAgICAgIG4gLT0gc3RyaWRlOworICAgICAgICB3aGlsZSAobiA+IDApIHsKKyAgICAgICAgICAgIFJFUEVBVChzdHJpZGUsCisgICAgICAgICAgICAgICAgd3BbMF0gPSAodWludDE2KSgoQ0xBTVAoaXBbMF0pLUNMQU1QKGlwWy1zdHJpZGVdKSkgJiBtYXNrKTsKKyAgICAgICAgICAgICAgICB3cCsrOyBpcCsrKQorICAgICAgICAgICAgbiAtPSBzdHJpZGU7CisgICAgICAgIH0KKyAgICB9CiAgICAgfQogfQogCkBAIC0xMTM5LDYgKzExNDksMTMgQEAKIAl9CiAKIAlsbGVuID0gc3AtPnN0cmlkZSAqIHRkLT50ZF9pbWFnZXdpZHRoOworICAgIC8qIENoZWNrIGFnYWluc3QgdGhlIG51bWJlciBvZiBlbGVtZW50cyAob2Ygc2l6ZSB1aW50MTYpIG9mIHNwLT50YnVmICovCisgICAgaWYoIG4gPiAodG1zaXplX3QpKHRkLT50ZF9yb3dzcGVyc3RyaXAgKiBsbGVuKSApCisgICAgeworICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgIlRvbyBtYW55IGlucHV0IGJ5dGVzIHByb3ZpZGVkIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAogCWZvciAoaSA9IDAsIHVwID0gc3AtPnRidWY7IGkgPCBuOyBpICs9IGxsZW4sIHVwICs9IGxsZW4pIHsKIAkJc3dpdGNoIChzcC0+dXNlcl9kYXRhZm10KSAgewpAQCAtMTE2OSw3ICsxMTg2LDcgQEAKIAlhc3NlcnQoc2l6ZW9mKHNwLT5zdHJlYW0uYXZhaWxfaW4pPT00KTsgIC8qIGlmIHRoaXMgYXNzZXJ0IGdldHMgcmFpc2VkLAogCSAgICB3ZSBuZWVkIHRvIHNpbXBsaWZ5IHRoaXMgY29kZSB0byByZWZsZWN0IGEgWkxpYiB0aGF0IGlzIGxpa2VseSB1cGRhdGVkCiAJICAgIHRvIGRlYWwgd2l0aCA4Ynl0ZSBtZW1vcnkgc2l6ZXMsIHRob3VnaCB0aGlzIGNvZGUgd2lsbCByZXNwb25kCi0JICAgIGFwcm9wcmlhdGVseSBldmVuIGJlZm9yZSB3ZSBzaW1wbGlmeSBpdCAqLworCSAgICBhcHByb3ByaWF0ZWx5IGV2ZW4gYmVmb3JlIHdlIHNpbXBsaWZ5IGl0ICovCiAJc3AtPnN0cmVhbS5hdmFpbF9pbiA9ICh1SW50KSAobiAqIHNpemVvZih1aW50MTYpKTsKIAlpZiAoKHNwLT5zdHJlYW0uYXZhaWxfaW4gLyBzaXplb2YodWludDE2KSkgIT0gKHVJbnQpIG4pCiAJewpAQCAtMTE4MSw3ICsxMTk4LDcgQEAKIAlkbyB7CiAJCWlmIChkZWZsYXRlKCZzcC0+c3RyZWFtLCBaX05PX0ZMVVNIKSAhPSBaX09LKSB7CiAJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLCAiRW5jb2RlciBlcnJvcjogJXMiLAotCQkJICAgIHNwLT5zdHJlYW0ubXNnKTsKKwkJCSAgICBzcC0+c3RyZWFtLm1zZyA/IHNwLT5zdHJlYW0ubXNnIDogIihudWxsKSIpOwogCQkJcmV0dXJuICgwKTsKIAkJfQogCQlpZiAoc3AtPnN0cmVhbS5hdmFpbF9vdXQgPT0gMCkgewpAQCAtMTIyMyw3ICsxMjQwLDcgQEAKIAkJICAgIGJyZWFrOwogCQlkZWZhdWx0OgogCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIlpMaWIgZXJyb3I6ICVzIiwKLQkJCXNwLT5zdHJlYW0ubXNnKTsKKwkJCXNwLT5zdHJlYW0ubXNnID8gc3AtPnN0cmVhbS5tc2cgOiAiKG51bGwpIik7CiAJCSAgICByZXR1cm4gKDApOwogCQl9CiAJfSB3aGlsZSAoc3RhdGUgIT0gWl9TVFJFQU1fRU5EKTsKQEAgLTEyMzMsOSArMTI1MCwxMSBAQAogc3RhdGljIHZvaWQKIFBpeGFyTG9nQ2xvc2UoVElGRiogdGlmKQogeworICAgICAgICBQaXhhckxvZ1N0YXRlKiBzcCA9IChQaXhhckxvZ1N0YXRlKikgdGlmLT50aWZfZGF0YTsKIAlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CiAKLQkvKiBJbiBhIHJlYWxseSBzbmVha3kgKGFuZCByZWFsbHkgaW5jb3JyZWN0LCBhbmQgdW50cnV0aGZ1bGwsIGFuZAorCWFzc2VydChzcCAhPSAwKTsKKwkvKiBJbiBhIHJlYWxseSBzbmVha3kgKGFuZCByZWFsbHkgaW5jb3JyZWN0LCBhbmQgdW50cnV0aGZ1bCwgYW5kCiAJICogdHJvdWJsZXNvbWUsIGFuZCBlcnJvci1wcm9uZSkgbWFuZXV2ZXIgdGhhdCBjb21wbGV0ZWx5IGdvZXMgYWdhaW5zdAogCSAqIHRoZSBzcGlyaXQgb2YgVElGRiwgYW5kIGJyZWFrcyBUSUZGLCBvbiBjbG9zZSwgd2UgY292ZXJ0bHkKIAkgKiBtb2RpZnkgYm90aCBiaXRzcGVyc2FtcGxlIGFuZCBzYW1wbGVmb3JtYXQgaW4gdGhlIGRpcmVjdG9yeSB0bwpAQCAtMTI0Myw4ICsxMjYyLDE5IEBACiAJICogcmVhZGVycyB0aGF0IGRvbid0IGtub3cgYWJvdXQgUGl4YXJMb2csIG9yIGhvdyB0byBzZXQKIAkgKiB0aGUgUElYQVJMT0dEQVRGTVQgcHNldWRvLXRhZy4KIAkgKi8KLQl0ZC0+dGRfYml0c3BlcnNhbXBsZSA9IDg7Ci0JdGQtPnRkX3NhbXBsZWZvcm1hdCA9IFNBTVBMRUZPUk1BVF9VSU5UOworCisgICAgICAgIGlmIChzcC0+c3RhdGUmUExTVEFURV9JTklUKSB7CisgICAgICAgICAgICAvKiBXZSB0ZXN0IHRoZSBzdGF0ZSB0byBhdm9pZCBhbiBpc3N1ZSBzdWNoIGFzIGluCisgICAgICAgICAgICAgKiBodHRwOi8vYnVnemlsbGEubWFwdG9vbHMub3JnL3Nob3dfYnVnLmNnaT9pZD0yNjA0CisgICAgICAgICAgICAgKiBXaGF0IGFwcGVuZHMgaW4gdGhhdCBjYXNlIGlzIHRoYXQgdGhlIGJpdHNwZXJzYW1wbGUgaXMgMSBhbmQKKyAgICAgICAgICAgICAqIGEgVHJhbnNmZXJGdW5jdGlvbiBpcyBzZXQuIFRoZSBzaXplIG9mIHRoZSBUcmFuc2ZlckZ1bmN0aW9uCisgICAgICAgICAgICAgKiBkZXBlbmRzIG9uIDE8PGJpdHNwZXJzYW1wbGUuIFNvIGlmIHdlIGluY3JlYXNlIGl0LCBhbiBhY2Nlc3MKKyAgICAgICAgICAgICAqIG91dCBvZiB0aGUgYnVmZmVyIHdpbGwgaGFwcGVuIGF0IGRpcmVjdG9yeSBmbHVzaGluZy4KKyAgICAgICAgICAgICAqIEFub3RoZXIgb3B0aW9uIHdvdWxkIGJlIHRvIGNsZWFyIHRob3NlIHRhcmdzLiAKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdGQtPnRkX2JpdHNwZXJzYW1wbGUgPSA4OworICAgICAgICAgICAgdGQtPnRkX3NhbXBsZWZvcm1hdCA9IFNBTVBMRUZPUk1BVF9VSU5UOworICAgICAgICB9CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xMjkzLDcgKzEzMjMsNyBAQAogCQkJaWYgKGRlZmxhdGVQYXJhbXMoJnNwLT5zdHJlYW0sCiAJCQkgICAgc3AtPnF1YWxpdHksIFpfREVGQVVMVF9TVFJBVEVHWSkgIT0gWl9PSykgewogCQkJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICJaTGliIGVycm9yOiAlcyIsCi0JCQkJCXNwLT5zdHJlYW0ubXNnKTsKKwkJCQkJc3AtPnN0cmVhbS5tc2cgPyBzcC0+c3RyZWFtLm1zZyA6ICIobnVsbCkiKTsKIAkJCQlyZXR1cm4gKDApOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9wcmVkaWN0LmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9wcmVkaWN0LmMKaW5kZXggODk3NTY3Mi4uN2E2MGEzOSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcHJlZGljdC5jCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3ByZWRpY3QuYwpAQCAtMSw0ICsxLDQgQEAKLS8qICRJZDogdGlmX3ByZWRpY3QuYyx2IDEuMzUgMjAxNS0wOC0zMSAxNTowNTo1NyBlcm91YXVsdCBFeHAgJCAqLworLyogJElkOiB0aWZfcHJlZGljdC5jLHYgMS40MyAyMDE3LTA1LTEwIDE1OjIxOjE2IGVyb3VhdWx0IEV4cCAkICovCiAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgpAQCAtMzQsMTggKzM0LDE4IEBACiAKICNkZWZpbmUJUHJlZGljdG9yU3RhdGUodGlmKQkoKFRJRkZQcmVkaWN0b3JTdGF0ZSopICh0aWYpLT50aWZfZGF0YSkKIAotc3RhdGljIHZvaWQgaG9yQWNjOChUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKTsKLXN0YXRpYyB2b2lkIGhvckFjYzE2KFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpOwotc3RhdGljIHZvaWQgaG9yQWNjMzIoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYyk7Ci1zdGF0aWMgdm9pZCBzd2FiSG9yQWNjMTYoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYyk7Ci1zdGF0aWMgdm9pZCBzd2FiSG9yQWNjMzIoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYyk7Ci1zdGF0aWMgdm9pZCBob3JEaWZmOChUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKTsKLXN0YXRpYyB2b2lkIGhvckRpZmYxNihUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKTsKLXN0YXRpYyB2b2lkIGhvckRpZmYzMihUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKTsKLXN0YXRpYyB2b2lkIHN3YWJIb3JEaWZmMTYoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYyk7Ci1zdGF0aWMgdm9pZCBzd2FiSG9yRGlmZjMyKFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpOwotc3RhdGljIHZvaWQgZnBBY2MoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYyk7Ci1zdGF0aWMgdm9pZCBmcERpZmYoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYyk7CitzdGF0aWMgaW50IGhvckFjYzgoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYyk7CitzdGF0aWMgaW50IGhvckFjYzE2KFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpOworc3RhdGljIGludCBob3JBY2MzMihUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKTsKK3N0YXRpYyBpbnQgc3dhYkhvckFjYzE2KFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpOworc3RhdGljIGludCBzd2FiSG9yQWNjMzIoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYyk7CitzdGF0aWMgaW50IGhvckRpZmY4KFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpOworc3RhdGljIGludCBob3JEaWZmMTYoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYyk7CitzdGF0aWMgaW50IGhvckRpZmYzMihUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKTsKK3N0YXRpYyBpbnQgc3dhYkhvckRpZmYxNihUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKTsKK3N0YXRpYyBpbnQgc3dhYkhvckRpZmYzMihUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKTsKK3N0YXRpYyBpbnQgZnBBY2MoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYyk7CitzdGF0aWMgaW50IGZwRGlmZihUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKTsKIHN0YXRpYyBpbnQgUHJlZGljdG9yRGVjb2RlUm93KFRJRkYqIHRpZiwgdWludDgqIG9wMCwgdG1zaXplX3Qgb2NjMCwgdWludDE2IHMpOwogc3RhdGljIGludCBQcmVkaWN0b3JEZWNvZGVUaWxlKFRJRkYqIHRpZiwgdWludDgqIG9wMCwgdG1zaXplX3Qgb2NjMCwgdWludDE2IHMpOwogc3RhdGljIGludCBQcmVkaWN0b3JFbmNvZGVSb3coVElGRiogdGlmLCB1aW50OCogYnAsIHRtc2l6ZV90IGNjLCB1aW50MTYgcyk7CkBAIC04MCw2ICs4MCwxNSBAQAogCQkJCSAgICB0ZC0+dGRfc2FtcGxlZm9ybWF0KTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZC0+dGRfYml0c3BlcnNhbXBsZSAhPSAxNgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHRkLT50ZF9iaXRzcGVyc2FtcGxlICE9IDI0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdGQtPnRkX2JpdHNwZXJzYW1wbGUgIT0gMzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0ZC0+dGRfYml0c3BlcnNhbXBsZSAhPSA2NCkgeyAvKiBTaG91bGQgNjQgYmUgYWxsb3dlZD8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGbG9hdGluZyBwb2ludCBcIlByZWRpY3RvclwiIG5vdCBzdXBwb3J0ZWQgd2l0aCAlZC1iaXQgc2FtcGxlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC0+dGRfYml0c3BlcnNhbXBsZSk7CisJCQkJcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLApAQCAtMTA4LDExICsxMTcsMTEgQEAKIAlUSUZGUHJlZGljdG9yU3RhdGUqIHNwID0gUHJlZGljdG9yU3RhdGUodGlmKTsKIAlUSUZGRGlyZWN0b3J5KiB0ZCA9ICZ0aWYtPnRpZl9kaXI7CiAKKwkvKiBOb3RlOiB3aGVuIFByZWRpY3RvclNldHVwKCkgZmFpbHMsIHRoZSBlZmZldHMgb2Ygc2V0dXBkZWNvZGUoKSAqLworCS8qIHdpbGwgbm90IGJlICJjYW5jZWxsZWQiIHNvIHNldHVwZGVjb2RlKCkgbWlnaHQgYmUgcm9idXN0IHRvICovCisJLyogYmUgY2FsbGVkIHNldmVyYWwgdGltZXMuICovCiAJaWYgKCEoKnNwLT5zZXR1cGRlY29kZSkodGlmKSB8fCAhUHJlZGljdG9yU2V0dXAodGlmKSkKLQl7Ci0JCSgqdGlmLT50aWZfY2xlYW51cCkodGlmKTsKIAkJcmV0dXJuIDA7Ci0JfQogCiAJaWYgKHNwLT5wcmVkaWN0b3IgPT0gMikgewogCQlzd2l0Y2ggKHRkLT50ZF9iaXRzcGVyc2FtcGxlKSB7CkBAIC0xNzcsNyArMTg2LDcgQEAKIAkJfQogCQkvKgogCQkgKiBBbGxvY2F0ZSBidWZmZXIgdG8ga2VlcCB0aGUgZGVjb2RlZCBieXRlcyBiZWZvcmUKLQkJICogcmVhcnJhbmdpbmcgaW4gdGhlIGlnaHQgb3JkZXIKKwkJICogcmVhcnJhbmdpbmcgaW4gdGhlIHJpZ2h0IG9yZGVyCiAJCSAqLwogCX0KIApAQCAtMjE2LDcgKzIyNSw3IEBACiAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgKiBJZiB0aGUgZGF0YSBpcyBob3Jpem9udGFsbHkgZGlmZmVyZW5jZWQgMTYtYml0IGRhdGEgdGhhdAogICAgICAgICAgICAgICAgICAqIHJlcXVpcmVzIGJ5dGUtc3dhcHBpbmcsIHRoZW4gaXQgbXVzdCBiZSBieXRlIHN3YXBwZWQgYWZ0ZXIKLSAgICAgICAgICAgICAgICAgKiB0aGUgZGlmZmVyZW5jaWF0aW9uIHN0ZXAuICBXZSBkbyB0aGlzIHdpdGggYSBzcGVjaWFsLXB1cnBvc2UKKyAgICAgICAgICAgICAgICAgKiB0aGUgZGlmZmVyZW50aWF0aW9uIHN0ZXAuICBXZSBkbyB0aGlzIHdpdGggYSBzcGVjaWFsLXB1cnBvc2UKICAgICAgICAgICAgICAgICAgKiByb3V0aW5lIGFuZCBvdmVycmlkZSB0aGUgbm9ybWFsIHBvc3QgZGVjb2RpbmcgbG9naWMgdGhhdAogICAgICAgICAgICAgICAgICAqIHRoZSBsaWJyYXJ5IHNldHVwIHdoZW4gdGhlIGRpcmVjdG9yeSB3YXMgcmVhZC4KICAgICAgICAgICAgICAgICAgKi8KQEAgLTI1MywxMSArMjYyLDEyIEBACiAKICNkZWZpbmUgUkVQRUFUNChuLCBvcCkJCVwKICAgICBzd2l0Y2ggKG4pIHsJCVwKLSAgICBkZWZhdWx0OiB7IHRtc2l6ZV90IGk7IGZvciAoaSA9IG4tNDsgaSA+IDA7IGktLSkgeyBvcDsgfSB9IFwKLSAgICBjYXNlIDQ6ICBvcDsJCVwKLSAgICBjYXNlIDM6ICBvcDsJCVwKLSAgICBjYXNlIDI6ICBvcDsJCVwKLSAgICBjYXNlIDE6ICBvcDsJCVwKKyAgICBkZWZhdWx0OiB7IFwKKyAgICAgICAgdG1zaXplX3QgaTsgZm9yIChpID0gbi00OyBpID4gMDsgaS0tKSB7IG9wOyB9IH0gIC8qLWZhbGx0aHJvdWdoKi8gIFwKKyAgICBjYXNlIDQ6ICBvcDsgLyotZmFsbHRocm91Z2gqLyBcCisgICAgY2FzZSAzOiAgb3A7IC8qLWZhbGx0aHJvdWdoKi8gXAorICAgIGNhc2UgMjogIG9wOyAvKi1mYWxsdGhyb3VnaCovIFwKKyAgICBjYXNlIDE6ICBvcDsgLyotZmFsbHRocm91Z2gqLyBcCiAgICAgY2FzZSAwOiAgOwkJCVwKICAgICB9CiAKQEAgLTI2NywxMyArMjc3LDE5IEBACiAvKiAtIHdoZW4gc3RvcmluZyBpbnRvIHRoZSBieXRlIHN0cmVhbSwgd2UgZXhwbGljaXRseSBtYXNrIHdpdGggMHhmZiBzbyAqLwogLyogICBhcyB0byBtYWtlIGljYyAtY2hlY2s9Y29udmVyc2lvbnMgaGFwcHkgKG5vdCBuZWNlc3NhcnkgYnkgdGhlIHN0YW5kYXJkKSAqLwogCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogaG9yQWNjOChUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKQogewogCXRtc2l6ZV90IHN0cmlkZSA9IFByZWRpY3RvclN0YXRlKHRpZiktPnN0cmlkZTsKIAogCXVuc2lnbmVkIGNoYXIqIGNwID0gKHVuc2lnbmVkIGNoYXIqKSBjcDA7Ci0JYXNzZXJ0KChjYyVzdHJpZGUpPT0wKTsKKyAgICBpZigoY2Mlc3RyaWRlKSE9MCkKKyAgICB7CisgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCAiaG9yQWNjOCIsCisgICAgICAgICAgICAgICAgICAgICAiJXMiLCAiKGNjJXN0cmlkZSkhPTAiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCiAJaWYgKGNjID4gc3RyaWRlKSB7CiAJCS8qCiAJCSAqIFBpcGVsaW5lIHRoZSBtb3N0IGNvbW1vbiBjYXNlcy4KQEAgLTMxNSwyNiArMzMxLDMyIEBACiAJCQl9IHdoaWxlIChjYz4wKTsKIAkJfQogCX0KKwlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIHN3YWJIb3JBY2MxNihUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKQogewogCXVpbnQxNiogd3AgPSAodWludDE2KikgY3AwOwogCXRtc2l6ZV90IHdjID0gY2MgLyAyOwogCiAgICAgICAgIFRJRkZTd2FiQXJyYXlPZlNob3J0KHdwLCB3Yyk7Ci0gICAgICAgIGhvckFjYzE2KHRpZiwgY3AwLCBjYyk7CisgICAgICAgIHJldHVybiBob3JBY2MxNih0aWYsIGNwMCwgY2MpOwogfQogCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogaG9yQWNjMTYoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYykKIHsKIAl0bXNpemVfdCBzdHJpZGUgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpLT5zdHJpZGU7CiAJdWludDE2KiB3cCA9ICh1aW50MTYqKSBjcDA7CiAJdG1zaXplX3Qgd2MgPSBjYyAvIDI7CiAKLQlhc3NlcnQoKGNjJSgyKnN0cmlkZSkpPT0wKTsKKyAgICBpZigoY2MlKDIqc3RyaWRlKSkhPTApCisgICAgeworICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgImhvckFjYzE2IiwKKyAgICAgICAgICAgICAgICAgICAgICIlcyIsICJjYyUoMipzdHJpZGUpKSE9MCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKIAlpZiAod2MgPiBzdHJpZGUpIHsKIAkJd2MgLT0gc3RyaWRlOwpAQCAtMzQzLDI2ICszNjUsMzIgQEAKIAkJCXdjIC09IHN0cmlkZTsKIAkJfSB3aGlsZSAod2MgPiAwKTsKIAl9CisJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiBzd2FiSG9yQWNjMzIoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYykKIHsKIAl1aW50MzIqIHdwID0gKHVpbnQzMiopIGNwMDsKIAl0bXNpemVfdCB3YyA9IGNjIC8gNDsKIAogICAgICAgICBUSUZGU3dhYkFycmF5T2ZMb25nKHdwLCB3Yyk7Ci0JaG9yQWNjMzIodGlmLCBjcDAsIGNjKTsKKwlyZXR1cm4gaG9yQWNjMzIodGlmLCBjcDAsIGNjKTsKIH0KIAotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIGhvckFjYzMyKFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpCiB7CiAJdG1zaXplX3Qgc3RyaWRlID0gUHJlZGljdG9yU3RhdGUodGlmKS0+c3RyaWRlOwogCXVpbnQzMiogd3AgPSAodWludDMyKikgY3AwOwogCXRtc2l6ZV90IHdjID0gY2MgLyA0OwogCi0JYXNzZXJ0KChjYyUoNCpzdHJpZGUpKT09MCk7CisgICAgaWYoKGNjJSg0KnN0cmlkZSkpIT0wKQorICAgIHsKKyAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsICJob3JBY2MzMiIsCisgICAgICAgICAgICAgICAgICAgICAiJXMiLCAiY2MlKDQqc3RyaWRlKSkhPTAiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCiAJaWYgKHdjID4gc3RyaWRlKSB7CiAJCXdjIC09IHN0cmlkZTsKQEAgLTM3MSwxMiArMzk5LDEzIEBACiAJCQl3YyAtPSBzdHJpZGU7CiAJCX0gd2hpbGUgKHdjID4gMCk7CiAJfQorCXJldHVybiAxOwogfQogCiAvKgogICogRmxvYXRpbmcgcG9pbnQgcHJlZGljdG9yIGFjY3VtdWxhdGlvbiByb3V0aW5lLgogICovCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogZnBBY2MoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYykKIHsKIAl0bXNpemVfdCBzdHJpZGUgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpLT5zdHJpZGU7CkBAIC0zODQsMTIgKzQxMywxOCBAQAogCXRtc2l6ZV90IHdjID0gY2MgLyBicHM7CiAJdG1zaXplX3QgY291bnQgPSBjYzsKIAl1aW50OCAqY3AgPSAodWludDggKikgY3AwOwotCXVpbnQ4ICp0bXAgPSAodWludDggKilfVElGRm1hbGxvYyhjYyk7CisJdWludDggKnRtcDsKIAotCWFzc2VydCgoY2MlKGJwcypzdHJpZGUpKT09MCk7CisgICAgaWYoY2MlKGJwcypzdHJpZGUpIT0wKQorICAgIHsKKyAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsICJmcEFjYyIsCisgICAgICAgICAgICAgICAgICAgICAiJXMiLCAiY2MlKGJwcypzdHJpZGUpKSE9MCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKKyAgICB0bXAgPSAodWludDggKilfVElGRm1hbGxvYyhjYyk7CiAJaWYgKCF0bXApCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAKIAl3aGlsZSAoY291bnQgPiBzdHJpZGUpIHsKIAkJUkVQRUFUNChzdHJpZGUsIGNwW3N0cmlkZV0gPQpAQCAtNDExLDYgKzQ0Niw3IEBACiAJCX0KIAl9CiAJX1RJRkZmcmVlKHRtcCk7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qCkBAIC00MjYsOCArNDYyLDcgQEAKIAlhc3NlcnQoc3AtPmRlY29kZXBmdW5jICE9IE5VTEwpOyAgCiAKIAlpZiAoKCpzcC0+ZGVjb2Rlcm93KSh0aWYsIG9wMCwgb2NjMCwgcykpIHsKLQkJKCpzcC0+ZGVjb2RlcGZ1bmMpKHRpZiwgb3AwLCBvY2MwKTsKLQkJcmV0dXJuIDE7CisJCXJldHVybiAoKnNwLT5kZWNvZGVwZnVuYykodGlmLCBvcDAsIG9jYzApOwogCX0gZWxzZQogCQlyZXR1cm4gMDsKIH0KQEAgLTQ1MCwxMCArNDg1LDE2IEBACiAJaWYgKCgqc3AtPmRlY29kZXRpbGUpKHRpZiwgb3AwLCBvY2MwLCBzKSkgewogCQl0bXNpemVfdCByb3dzaXplID0gc3AtPnJvd3NpemU7CiAJCWFzc2VydChyb3dzaXplID4gMCk7Ci0JCWFzc2VydCgob2NjMCVyb3dzaXplKT09MCk7CisJCWlmKChvY2MwJXJvd3NpemUpICE9MCkKKyAgICAgICAgeworICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsICJQcmVkaWN0b3JEZWNvZGVUaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXMiLCAib2NjMCVyb3dzaXplICE9IDAiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CiAJCWFzc2VydChzcC0+ZGVjb2RlcGZ1bmMgIT0gTlVMTCk7CiAJCXdoaWxlIChvY2MwID4gMCkgewotCQkJKCpzcC0+ZGVjb2RlcGZ1bmMpKHRpZiwgb3AwLCByb3dzaXplKTsKKwkJCWlmKCAhKCpzcC0+ZGVjb2RlcGZ1bmMpKHRpZiwgb3AwLCByb3dzaXplKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAJCQlvY2MwIC09IHJvd3NpemU7CiAJCQlvcDAgKz0gcm93c2l6ZTsKIAkJfQpAQCAtNDYyLDE0ICs1MDMsMTkgQEAKIAkJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiBob3JEaWZmOChUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKQogewogCVRJRkZQcmVkaWN0b3JTdGF0ZSogc3AgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpOwogCXRtc2l6ZV90IHN0cmlkZSA9IHNwLT5zdHJpZGU7CiAJdW5zaWduZWQgY2hhciogY3AgPSAodW5zaWduZWQgY2hhciopIGNwMDsKIAotCWFzc2VydCgoY2Mlc3RyaWRlKT09MCk7CisgICAgaWYoKGNjJXN0cmlkZSkhPTApCisgICAgeworICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgImhvckRpZmY4IiwKKyAgICAgICAgICAgICAgICAgICAgICIlcyIsICIoY2Mlc3RyaWRlKSE9MCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKIAlpZiAoY2MgPiBzdHJpZGUpIHsKIAkJY2MgLT0gc3RyaWRlOwpAQCAtNTA3LDkgKzU1MywxMCBAQAogCQkJfSB3aGlsZSAoKGNjIC09IHN0cmlkZSkgPiAwKTsKIAkJfQogCX0KKwlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIGhvckRpZmYxNihUSUZGKiB0aWYsIHVpbnQ4KiBjcDAsIHRtc2l6ZV90IGNjKQogewogCVRJRkZQcmVkaWN0b3JTdGF0ZSogc3AgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpOwpAQCAtNTE3LDcgKzU2NCwxMiBAQAogCXVpbnQxNiAqd3AgPSAodWludDE2KikgY3AwOwogCXRtc2l6ZV90IHdjID0gY2MvMjsKIAotCWFzc2VydCgoY2MlKDIqc3RyaWRlKSk9PTApOworICAgIGlmKChjYyUoMipzdHJpZGUpKSE9MCkKKyAgICB7CisgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCAiaG9yRGlmZjgiLAorICAgICAgICAgICAgICAgICAgICAgIiVzIiwgIihjYyUoMipzdHJpZGUpKSE9MCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKIAlpZiAod2MgPiBzdHJpZGUpIHsKIAkJd2MgLT0gc3RyaWRlOwpAQCAtNTI3LDIwICs1NzksMjMgQEAKIAkJCXdjIC09IHN0cmlkZTsKIAkJfSB3aGlsZSAod2MgPiAwKTsKIAl9CisJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiBzd2FiSG9yRGlmZjE2KFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpCiB7CiAgICAgdWludDE2KiB3cCA9ICh1aW50MTYqKSBjcDA7CiAgICAgdG1zaXplX3Qgd2MgPSBjYyAvIDI7CiAKLSAgICBob3JEaWZmMTYodGlmLCBjcDAsIGNjKTsKKyAgICBpZiggIWhvckRpZmYxNih0aWYsIGNwMCwgY2MpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKICAgICBUSUZGU3dhYkFycmF5T2ZTaG9ydCh3cCwgd2MpOworICAgIHJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogaG9yRGlmZjMyKFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpCiB7CiAJVElGRlByZWRpY3RvclN0YXRlKiBzcCA9IFByZWRpY3RvclN0YXRlKHRpZik7CkBAIC01NDgsNyArNjAzLDEyIEBACiAJdWludDMyICp3cCA9ICh1aW50MzIqKSBjcDA7CiAJdG1zaXplX3Qgd2MgPSBjYy80OwogCi0JYXNzZXJ0KChjYyUoNCpzdHJpZGUpKT09MCk7CisgICAgaWYoKGNjJSg0KnN0cmlkZSkpIT0wKQorICAgIHsKKyAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsICJob3JEaWZmMzIiLAorICAgICAgICAgICAgICAgICAgICAgIiVzIiwgIihjYyUoNCpzdHJpZGUpKSE9MCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAKIAlpZiAod2MgPiBzdHJpZGUpIHsKIAkJd2MgLT0gc3RyaWRlOwpAQCAtNTU4LDIzICs2MTgsMjYgQEAKIAkJCXdjIC09IHN0cmlkZTsKIAkJfSB3aGlsZSAod2MgPiAwKTsKIAl9CisJcmV0dXJuIDE7CiB9CiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiBzd2FiSG9yRGlmZjMyKFRJRkYqIHRpZiwgdWludDgqIGNwMCwgdG1zaXplX3QgY2MpCiB7CiAgICAgdWludDMyKiB3cCA9ICh1aW50MzIqKSBjcDA7CiAgICAgdG1zaXplX3Qgd2MgPSBjYyAvIDQ7CiAKLSAgICBob3JEaWZmMzIodGlmLCBjcDAsIGNjKTsKKyAgICBpZiggIWhvckRpZmYzMih0aWYsIGNwMCwgY2MpICkKKyAgICAgICAgcmV0dXJuIDA7CiAKICAgICBUSUZGU3dhYkFycmF5T2ZMb25nKHdwLCB3Yyk7CisgICAgcmV0dXJuIDE7CiB9CiAKIC8qCiAgKiBGbG9hdGluZyBwb2ludCBwcmVkaWN0b3IgZGlmZmVyZW5jaW5nIHJvdXRpbmUuCiAgKi8KLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiBmcERpZmYoVElGRiogdGlmLCB1aW50OCogY3AwLCB0bXNpemVfdCBjYykKIHsKIAl0bXNpemVfdCBzdHJpZGUgPSBQcmVkaWN0b3JTdGF0ZSh0aWYpLT5zdHJpZGU7CkBAIC01ODIsMTIgKzY0NSwxOCBAQAogCXRtc2l6ZV90IHdjID0gY2MgLyBicHM7CiAJdG1zaXplX3QgY291bnQ7CiAJdWludDggKmNwID0gKHVpbnQ4ICopIGNwMDsKLQl1aW50OCAqdG1wID0gKHVpbnQ4ICopX1RJRkZtYWxsb2MoY2MpOworCXVpbnQ4ICp0bXA7CiAKLQlhc3NlcnQoKGNjJShicHMqc3RyaWRlKSk9PTApOworICAgIGlmKChjYyUoYnBzKnN0cmlkZSkpIT0wKQorICAgIHsKKyAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsICJmcERpZmYiLAorICAgICAgICAgICAgICAgICAgICAgIiVzIiwgIihjYyUoYnBzKnN0cmlkZSkpIT0wIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAorICAgIHRtcCA9ICh1aW50OCAqKV9USUZGbWFsbG9jKGNjKTsKIAlpZiAoIXRtcCkKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAogCV9USUZGbWVtY3B5KHRtcCwgY3AwLCBjYyk7CiAJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgd2M7IGNvdW50KyspIHsKQEAgLTYwNyw2ICs2NzYsNyBAQAogCWNwICs9IGNjIC0gc3RyaWRlIC0gMTsKIAlmb3IgKGNvdW50ID0gY2M7IGNvdW50ID4gc3RyaWRlOyBjb3VudCAtPSBzdHJpZGUpCiAJCVJFUEVBVDQoc3RyaWRlLCBjcFtzdHJpZGVdID0gKHVuc2lnbmVkIGNoYXIpKChjcFtzdHJpZGVdIC0gY3BbMF0pJjB4ZmYpOyBjcC0tKQorICAgIHJldHVybiAxOwogfQogCiBzdGF0aWMgaW50CkBAIC02MTksNyArNjg5LDggQEAKIAlhc3NlcnQoc3AtPmVuY29kZXJvdyAhPSBOVUxMKTsKIAogCS8qIFhYWCBob3Jpem9udGFsIGRpZmZlcmVuY2luZyBhbHRlcnMgdXNlcidzIGRhdGEgWFhYICovCi0JKCpzcC0+ZW5jb2RlcGZ1bmMpKHRpZiwgYnAsIGNjKTsKKwlpZiggISgqc3AtPmVuY29kZXBmdW5jKSh0aWYsIGJwLCBjYykgKQorICAgICAgICByZXR1cm4gMDsKIAlyZXR1cm4gKCpzcC0+ZW5jb2Rlcm93KSh0aWYsIGJwLCBjYywgcyk7CiB9CiAKQEAgLTY1NCw3ICs3MjUsMTMgQEAKIAogCXJvd3NpemUgPSBzcC0+cm93c2l6ZTsKIAlhc3NlcnQocm93c2l6ZSA+IDApOwotCWFzc2VydCgoY2MwJXJvd3NpemUpPT0wKTsKKwlpZigoY2MwJXJvd3NpemUpIT0wKQorICAgIHsKKyAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsICJQcmVkaWN0b3JFbmNvZGVUaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICIlcyIsICIoY2MwJXJvd3NpemUpIT0wIik7CisgICAgICAgIF9USUZGZnJlZSggd29ya2luZ19jb3B5ICk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAl3aGlsZSAoY2MgPiAwKSB7CiAJCSgqc3AtPmVuY29kZXBmdW5jKSh0aWYsIGJwLCByb3dzaXplKTsKIAkJY2MgLT0gcm93c2l6ZTsKQEAgLTcwMyw3ICs3ODAsNyBAQAogCiAJc3dpdGNoICh0YWcpIHsKIAljYXNlIFRJRkZUQUdfUFJFRElDVE9SOgotCQkqdmFfYXJnKGFwLCB1aW50MTYqKSA9IHNwLT5wcmVkaWN0b3I7CisJCSp2YV9hcmcoYXAsIHVpbnQxNiopID0gKHVpbnQxNilzcC0+cHJlZGljdG9yOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gKCpzcC0+dmdldHBhcmVudCkodGlmLCB0YWcsIGFwKTsKQEAgLTcyNCw3ICs4MDEsNyBAQAogCQkJY2FzZSAyOiBmcHJpbnRmKGZkLCAiaG9yaXpvbnRhbCBkaWZmZXJlbmNpbmcgIik7IGJyZWFrOwogCQkJY2FzZSAzOiBmcHJpbnRmKGZkLCAiZmxvYXRpbmcgcG9pbnQgcHJlZGljdG9yICIpOyBicmVhazsKIAkJfQotCQlmcHJpbnRmKGZkLCAiJXUgKDB4JXgpXG4iLCBzcC0+cHJlZGljdG9yLCBzcC0+cHJlZGljdG9yKTsKKwkJZnByaW50ZihmZCwgIiVkICgweCV4KVxuIiwgc3AtPnByZWRpY3Rvciwgc3AtPnByZWRpY3Rvcik7CiAJfQogCWlmIChzcC0+cHJpbnRkaXIpCiAJCSgqc3AtPnByaW50ZGlyKSh0aWYsIGZkLCBmbGFncyk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9wcmVkaWN0LmggYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9wcmVkaWN0LmgKaW5kZXggZGM3MTQ0Yy4uNmM2OGUyMSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcHJlZGljdC5oCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3ByZWRpY3QuaApAQCAtMSw0ICsxLDQgQEAKLS8qICRJZDogdGlmX3ByZWRpY3QuaCx2IDEuOCAyMDEwLTAzLTEwIDE4OjU2OjQ5IGJmcmllc2VuIEV4cCAkICovCisvKiAkSWQ6IHRpZl9wcmVkaWN0LmgsdiAxLjkgMjAxNi0xMC0zMSAxNzoyNDoyNiBlcm91YXVsdCBFeHAgJCAqLwogCiAvKgogICogQ29weXJpZ2h0IChjKSAxOTk1LTE5OTcgU2FtIExlZmZsZXIKQEAgLTMwLDYgKzMwLDggQEAKICAqIGBgTGlicmFyeS1wcml2YXRlJycgU3VwcG9ydCBmb3IgdGhlIFByZWRpY3RvciBUYWcKICAqLwogCit0eXBlZGVmIGludCAoKlRJRkZFbmNvZGVEZWNvZGVNZXRob2QpKFRJRkYqIHRpZiwgdWludDgqIGJ1ZiwgdG1zaXplX3Qgc2l6ZSk7CisKIC8qCiAgKiBDb2RlY3MgdGhhdCB3YW50IHRvIHN1cHBvcnQgdGhlIFByZWRpY3RvciB0YWcgbXVzdCBwbGFjZQogICogdGhpcyBzdHJ1Y3R1cmUgZmlyc3QgaW4gdGhlaXIgcHJpdmF0ZSBzdGF0ZSBibG9jayBzbyB0aGF0CkBAIC00MywxMiArNDUsMTIgQEAKIAlUSUZGQ29kZU1ldGhvZCAgZW5jb2Rlcm93OwkvKiBwYXJlbnQgY29kZWMgZW5jb2RlL2RlY29kZSByb3cgKi8KIAlUSUZGQ29kZU1ldGhvZCAgZW5jb2Rlc3RyaXA7CS8qIHBhcmVudCBjb2RlYyBlbmNvZGUvZGVjb2RlIHN0cmlwICovCiAJVElGRkNvZGVNZXRob2QgIGVuY29kZXRpbGU7CS8qIHBhcmVudCBjb2RlYyBlbmNvZGUvZGVjb2RlIHRpbGUgKi8gCi0JVElGRlBvc3RNZXRob2QgIGVuY29kZXBmdW5jOwkvKiBob3Jpem9udGFsIGRpZmZlcmVuY2VyICovCisJVElGRkVuY29kZURlY29kZU1ldGhvZCAgZW5jb2RlcGZ1bmM7CS8qIGhvcml6b250YWwgZGlmZmVyZW5jZXIgKi8KIAogCVRJRkZDb2RlTWV0aG9kICBkZWNvZGVyb3c7CS8qIHBhcmVudCBjb2RlYyBlbmNvZGUvZGVjb2RlIHJvdyAqLwogCVRJRkZDb2RlTWV0aG9kICBkZWNvZGVzdHJpcDsJLyogcGFyZW50IGNvZGVjIGVuY29kZS9kZWNvZGUgc3RyaXAgKi8KIAlUSUZGQ29kZU1ldGhvZCAgZGVjb2RldGlsZTsJLyogcGFyZW50IGNvZGVjIGVuY29kZS9kZWNvZGUgdGlsZSAqLyAKLQlUSUZGUG9zdE1ldGhvZCAgZGVjb2RlcGZ1bmM7CS8qIGhvcml6b250YWwgYWNjdW11bGF0b3IgKi8KKwlUSUZGRW5jb2RlRGVjb2RlTWV0aG9kICBkZWNvZGVwZnVuYzsJLyogaG9yaXpvbnRhbCBhY2N1bXVsYXRvciAqLwogCiAJVElGRlZHZXRNZXRob2QgIHZnZXRwYXJlbnQ7CS8qIHN1cGVyLWNsYXNzIG1ldGhvZCAqLwogCVRJRkZWU2V0TWV0aG9kICB2c2V0cGFyZW50OwkvKiBzdXBlci1jbGFzcyBtZXRob2QgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3ByaW50LmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9wcmludC5jCmluZGV4IDdiMWE0MjIuLjI0ZDRiOTggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3ByaW50LmMKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcHJpbnQuYwpAQCAtMSw0ICsxLDQgQEAKLS8qICRJZDogdGlmX3ByaW50LmMsdiAxLjYyIDIwMTUtMDgtMTkgMDI6MzE6MDQgYmZyaWVzZW4gRXhwICQgKi8KKy8qICRJZDogdGlmX3ByaW50LmMsdiAxLjY1IDIwMTYtMTEtMjAgMjI6MzE6MjIgZXJvdWF1bHQgRXhwICQgKi8KIAogLyoKICAqIENvcHlyaWdodCAoYykgMTk4OC0xOTk3IFNhbSBMZWZmbGVyCkBAIC0zNyw3ICszNyw3IEBACiBzdGF0aWMgdm9pZAogX1RJRkZwcmludEFzY2lpQm91bmRlZChGSUxFKiBmZCwgY29uc3QgY2hhciogY3AsIHNpemVfdCBtYXhfY2hhcnMpOwogCi1zdGF0aWMgY29uc3QgY2hhciAqcGhvdG9OYW1lc1tdID0geworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBwaG90b05hbWVzW10gPSB7CiAgICAgIm1pbi1pcy13aGl0ZSIsCQkJCS8qIFBIT1RPTUVUUklDX01JTklTV0hJVEUgKi8KICAgICAibWluLWlzLWJsYWNrIiwJCQkJLyogUEhPVE9NRVRSSUNfTUlOSVNCTEFDSyAqLwogICAgICJSR0IgY29sb3IiLAkJCQkvKiBQSE9UT01FVFJJQ19SR0IgKi8KQEAgLTUyLDcgKzUyLDcgQEAKIH07CiAjZGVmaW5lCU5QSE9UT05BTUVTCShzaXplb2YgKHBob3RvTmFtZXMpIC8gc2l6ZW9mIChwaG90b05hbWVzWzBdKSkKIAotc3RhdGljIGNvbnN0IGNoYXIgKm9yaWVudE5hbWVzW10gPSB7CitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG9yaWVudE5hbWVzW10gPSB7CiAgICAgIjAgKDB4MCkiLAogICAgICJyb3cgMCB0b3AsIGNvbCAwIGxocyIsCQkJLyogT1JJRU5UQVRJT05fVE9QTEVGVCAqLwogICAgICJyb3cgMCB0b3AsIGNvbCAwIHJocyIsCQkJLyogT1JJRU5UQVRJT05fVE9QUklHSFQgKi8KQEAgLTIzNyw3ICsyMzcsNiBAQAogewogCVRJRkZEaXJlY3RvcnkgKnRkID0gJnRpZi0+dGlmX2RpcjsKIAljaGFyICpzZXA7Ci0JdWludDE2IGk7CiAJbG9uZyBsLCBuOwogCiAjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKQEAgLTI2Myw3ICsyNjIsNyBAQAogCQlpZiAodGQtPnRkX3N1YmZpbGV0eXBlICYgRklMRVRZUEVfTUFTSykKIAkJCWZwcmludGYoZmQsICIlc3RyYW5zcGFyZW5jeSBtYXNrIiwgc2VwKTsKIAkJZnByaW50ZihmZCwgIiAoJWx1ID0gMHglbHgpXG4iLAotCQkgICAgKGxvbmcpIHRkLT50ZF9zdWJmaWxldHlwZSwgKGxvbmcpIHRkLT50ZF9zdWJmaWxldHlwZSk7CisJCSAgICAodW5zaWduZWQgbG9uZykgdGQtPnRkX3N1YmZpbGV0eXBlLCAobG9uZykgdGQtPnRkX3N1YmZpbGV0eXBlKTsKIAl9CiAJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfSU1BR0VESU1FTlNJT05TKSkgewogCQlmcHJpbnRmKGZkLCAiICBJbWFnZSBXaWR0aDogJWx1IEltYWdlIExlbmd0aDogJWx1IiwKQEAgLTM2NSw2ICszNjQsNyBAQAogCQl9CiAJfQogCWlmIChUSUZGRmllbGRTZXQodGlmLEZJRUxEX0VYVFJBU0FNUExFUykgJiYgdGQtPnRkX2V4dHJhc2FtcGxlcykgeworCQl1aW50MTYgaTsKIAkJZnByaW50ZihmZCwgIiAgRXh0cmEgU2FtcGxlczogJXU8IiwgdGQtPnRkX2V4dHJhc2FtcGxlcyk7CiAJCXNlcCA9ICIiOwogCQlmb3IgKGkgPSAwOyBpIDwgdGQtPnRkX2V4dHJhc2FtcGxlczsgaSsrKSB7CkBAIC0zODksNiArMzg5LDcgQEAKIAl9CiAJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfSU5LTkFNRVMpKSB7CiAJCWNoYXIqIGNwOworCQl1aW50MTYgaTsKIAkJZnByaW50ZihmZCwgIiAgSW5rIE5hbWVzOiAiKTsKIAkJaSA9IHRkLT50ZF9zYW1wbGVzcGVycGl4ZWw7CiAJCXNlcCA9ICIiOwpAQCAtNDgxLDYgKzQ4Miw3IEBACiAJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfTUFYU0FNUExFVkFMVUUpKQogCQlmcHJpbnRmKGZkLCAiICBNYXggU2FtcGxlIFZhbHVlOiAldVxuIiwgdGQtPnRkX21heHNhbXBsZXZhbHVlKTsKIAlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9TTUlOU0FNUExFVkFMVUUpKSB7CisJCWludCBpOwogCQlpbnQgY291bnQgPSAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1BFUlNBTVBMRSkgPyB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsIDogMTsKIAkJZnByaW50ZihmZCwgIiAgU01pbiBTYW1wbGUgVmFsdWU6Iik7CiAJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQpAQCAtNDg4LDYgKzQ5MCw3IEBACiAJCWZwcmludGYoZmQsICJcbiIpOwogCX0KIAlpZiAoVElGRkZpZWxkU2V0KHRpZixGSUVMRF9TTUFYU0FNUExFVkFMVUUpKSB7CisJCWludCBpOwogCQlpbnQgY291bnQgPSAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX1BFUlNBTVBMRSkgPyB0ZC0+dGRfc2FtcGxlc3BlcnBpeGVsIDogMTsKIAkJZnByaW50ZihmZCwgIiAgU01heCBTYW1wbGUgVmFsdWU6Iik7CiAJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKQpAQCAtNTE4LDcgKzUyMSw3IEBACiAJCQlmcHJpbnRmKGZkLCAiXG4iKTsKIAkJCW4gPSAxTDw8dGQtPnRkX2JpdHNwZXJzYW1wbGU7CiAJCQlmb3IgKGwgPSAwOyBsIDwgbjsgbCsrKQotCQkJCWZwcmludGYoZmQsICIgICAlNWx1OiAlNXUgJTV1ICU1dVxuIiwKKwkJCQlmcHJpbnRmKGZkLCAiICAgJTVsZDogJTV1ICU1dSAlNXVcbiIsCiAJCQkJICAgIGwsCiAJCQkJICAgIHRkLT50ZF9jb2xvcm1hcFswXVtsXSwKIAkJCQkgICAgdGQtPnRkX2NvbG9ybWFwWzFdW2xdLApAQCAtNTI3LDYgKzUzMCw3IEBACiAJCQlmcHJpbnRmKGZkLCAiKHByZXNlbnQpXG4iKTsKIAl9CiAJaWYgKFRJRkZGaWVsZFNldCh0aWYsRklFTERfUkVGQkxBQ0tXSElURSkpIHsKKwkJaW50IGk7CiAJCWZwcmludGYoZmQsICIgIFJlZmVyZW5jZSBCbGFjay9XaGl0ZTpcbiIpOwogCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKQogCQlmcHJpbnRmKGZkLCAiICAgICUyZDogJTVnICU1Z1xuIiwgaSwKQEAgLTUzOSw3ICs1NDMsOCBAQAogCQkJZnByaW50ZihmZCwgIlxuIik7CiAJCQluID0gMUw8PHRkLT50ZF9iaXRzcGVyc2FtcGxlOwogCQkJZm9yIChsID0gMDsgbCA8IG47IGwrKykgewotCQkJCWZwcmludGYoZmQsICIgICAgJTJsdTogJTV1IiwKKwkJCQl1aW50MTYgaTsKKwkJCQlmcHJpbnRmKGZkLCAiICAgICUybGQ6ICU1dSIsCiAJCQkJICAgIGwsIHRkLT50ZF90cmFuc2ZlcmZ1bmN0aW9uWzBdW2xdKTsKIAkJCQlmb3IgKGkgPSAxOyBpIDwgdGQtPnRkX3NhbXBsZXNwZXJwaXhlbDsgaSsrKQogCQkJCQlmcHJpbnRmKGZkLCAiICU1dSIsCkBAIC01NTAsNiArNTU1LDcgQEAKIAkJCWZwcmludGYoZmQsICIocHJlc2VudClcbiIpOwogCX0KIAlpZiAoVElGRkZpZWxkU2V0KHRpZiwgRklFTERfU1VCSUZEKSAmJiAodGQtPnRkX3N1YmlmZCkpIHsKKwkJdWludDE2IGk7CiAJCWZwcmludGYoZmQsICIgIFN1YklGRCBPZmZzZXRzOiIpOwogCQlmb3IgKGkgPSAwOyBpIDwgdGQtPnRkX25zdWJpZmQ7IGkrKykKICNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQpAQCAtNjU1LDcgKzY2MSw3IEBACiAJCXVpbnQzMiBzOwogCiAJCWZwcmludGYoZmQsICIgICVsdSAlczpcbiIsCi0JCSAgICAobG9uZykgdGQtPnRkX25zdHJpcHMsCisJCSAgICAodW5zaWduZWQgbG9uZykgdGQtPnRkX25zdHJpcHMsCiAJCSAgICBpc1RpbGVkKHRpZikgPyAiVGlsZXMiIDogIlN0cmlwcyIpOwogCQlmb3IgKHMgPSAwOyBzIDwgdGQtPnRkX25zdHJpcHM7IHMrKykKICNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcmVhZC5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfcmVhZC5jCmluZGV4IDU0OGIxZjUuLmFkMGE3NzggMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3JlYWQuYworKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9yZWFkLmMKQEAgLTEsNCArMSw0IEBACi0vKiAkSWQ6IHRpZl9yZWFkLmMsdiAxLjQ1IDIwMTUtMDYtMDcgMjI6MzU6NDAgYmZyaWVzZW4gRXhwICQgKi8KKy8qICRJZDogdGlmX3JlYWQuYyx2IDEuNTkgMjAxNy0wNS0xMyAxNTozNDowNiBlcm91YXVsdCBFeHAgJCAqLwogCiAvKgogICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKQEAgLTMxLDYgKzMxLDkgQEAKICNpbmNsdWRlICJ0aWZmaW9wLmgiCiAjaW5jbHVkZSA8c3RkaW8uaD4KIAorI2RlZmluZSBUSUZGX1NJWkVfVF9NQVggKChzaXplX3QpIH4gKChzaXplX3QpMCkpCisjZGVmaW5lIFRJRkZfVE1TSVpFX1RfTUFYICh0bXNpemVfdCkoVElGRl9TSVpFX1RfTUFYID4+IDEpCisKIGludCBUSUZGRmlsbFN0cmlwKFRJRkYqIHRpZiwgdWludDMyIHN0cmlwKTsKIGludCBUSUZGRmlsbFRpbGUoVElGRiogdGlmLCB1aW50MzIgdGlsZSk7CiBzdGF0aWMgaW50IFRJRkZTdGFydFN0cmlwKFRJRkYqIHRpZiwgdWludDMyIHN0cmlwKTsKQEAgLTM4LDEwICs0MSwxMjcgQEAKIHN0YXRpYyBpbnQgVElGRkNoZWNrUmVhZChUSUZGKiwgaW50KTsKIHN0YXRpYyB0bXNpemVfdAogVElGRlJlYWRSYXdTdHJpcDEoVElGRiogdGlmLCB1aW50MzIgc3RyaXAsIHZvaWQqIGJ1ZiwgdG1zaXplX3Qgc2l6ZSxjb25zdCBjaGFyKiBtb2R1bGUpOworc3RhdGljIHRtc2l6ZV90CitUSUZGUmVhZFJhd1RpbGUxKFRJRkYqIHRpZiwgdWludDMyIHRpbGUsIHZvaWQqIGJ1ZiwgdG1zaXplX3Qgc2l6ZSwgY29uc3QgY2hhciogbW9kdWxlKTsKIAogI2RlZmluZSBOT1NUUklQICgodWludDMyKSgtMSkpICAgICAgIC8qIHVuZGVmaW5lZCBzdGF0ZSAqLwogI2RlZmluZSBOT1RJTEUgKCh1aW50MzIpKC0xKSkgICAgICAgICAvKiB1bmRlZmluZWQgc3RhdGUgKi8KIAorI2RlZmluZSBJTklUSUFMX1RIUkVTSE9MRCAoMTAyNCAqIDEwMjQpCisjZGVmaW5lIFRIUkVTSE9MRF9NVUxUSVBMSUVSIDEwCisjZGVmaW5lIE1BWF9USFJFU0hPTEQgKFRIUkVTSE9MRF9NVUxUSVBMSUVSICogVEhSRVNIT0xEX01VTFRJUExJRVIgKiBUSFJFU0hPTERfTVVMVElQTElFUiAqIElOSVRJQUxfVEhSRVNIT0xEKQorCisvKiBSZWFkICdzaXplJyBieXRlcyBpbiB0aWZfcmF3ZGF0YSBidWZmZXIgc3RhcnRpbmcgYXQgb2Zmc2V0ICdyYXdkYXRhX29mZnNldCcKKyAqIFJldHVybnMgMSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIDAgb3RoZXJ3aXNlLiAqLworc3RhdGljIGludCBUSUZGUmVhZEFuZFJlYWxsb2MoIFRJRkYqIHRpZiwgdG1zaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXNpemVfdCByYXdkYXRhX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfc3RyaXAsIHVpbnQzMiBzdHJpcF9vcl90aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1vZHVsZSApCit7CisjaWYgU0laRU9GX1ZPSURQID09IDggfHwgU0laRU9GX1NJWkVfVCA9PSA4CisgICAgICAgIHRtc2l6ZV90IHRocmVzaG9sZCA9IElOSVRJQUxfVEhSRVNIT0xEOworI2VuZGlmCisgICAgICAgIHRtc2l6ZV90IGFscmVhZHlfcmVhZCA9IDA7CisKKyAgICAgICAgLyogT24gNjQgYml0IHByb2Nlc3NlcywgcmVhZCBmaXJzdCBhIG1heGltdW0gb2YgMSBNQiwgdGhlbiAxMCBNQiwgZXRjICovCisgICAgICAgIC8qIHNvIGFzIHRvIGF2b2lkIGFsbG9jYXRpbmcgdG9vIG11Y2ggbWVtb3J5IGluIGNhc2UgdGhlIGZpbGUgaXMgdG9vICovCisgICAgICAgIC8qIHNob3J0LiBXZSBjb3VsZCBhc2sgZm9yIHRoZSBmaWxlIHNpemUsIGJ1dCB0aGlzIG1pZ2h0IGJlICovCisgICAgICAgIC8qIGV4cGVuc2l2ZSB3aXRoIHNvbWUgSS9PIGxheWVycyAodGhpbmsgb2YgcmVhZGluZyBhIGd6aXBwZWQgZmlsZSkgKi8KKyAgICAgICAgLyogUmVzdHJpY3QgdG8gNjQgYml0IHByb2Nlc3Nlcywgc28gYXMgdG8gYXZvaWQgcmVhbGxvY3MoKSAqLworICAgICAgICAvKiBvbiAzMiBiaXQgcHJvY2Vzc2VzIHdoZXJlIHZpcnR1YWwgbWVtb3J5IGlzIHNjYXJjZS4gICovCisgICAgICAgIHdoaWxlKCBhbHJlYWR5X3JlYWQgPCBzaXplICkKKyAgICAgICAgeworICAgICAgICAgICAgdG1zaXplX3QgYnl0ZXNfcmVhZDsKKyAgICAgICAgICAgIHRtc2l6ZV90IHRvX3JlYWQgPSBzaXplIC0gYWxyZWFkeV9yZWFkOworI2lmIFNJWkVPRl9WT0lEUCA9PSA4IHx8IFNJWkVPRl9TSVpFX1QgPT0gOAorICAgICAgICAgICAgaWYoIHRvX3JlYWQgPj0gdGhyZXNob2xkICYmIHRocmVzaG9sZCA8IE1BWF9USFJFU0hPTEQgJiYKKyAgICAgICAgICAgICAgICBhbHJlYWR5X3JlYWQgKyB0b19yZWFkICsgcmF3ZGF0YV9vZmZzZXQgPiB0aWYtPnRpZl9yYXdkYXRhc2l6ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG9fcmVhZCA9IHRocmVzaG9sZDsKKyAgICAgICAgICAgICAgICB0aHJlc2hvbGQgKj0gVEhSRVNIT0xEX01VTFRJUExJRVI7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIGlmIChhbHJlYWR5X3JlYWQgKyB0b19yZWFkICsgcmF3ZGF0YV9vZmZzZXQgPiB0aWYtPnRpZl9yYXdkYXRhc2l6ZSkgeworICAgICAgICAgICAgICAgIHVpbnQ4KiBuZXdfcmF3ZGF0YTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9NWUJVRkZFUikgIT0gMCk7CisgICAgICAgICAgICAgICAgdGlmLT50aWZfcmF3ZGF0YXNpemUgPSAodG1zaXplX3QpVElGRnJvdW5kdXBfNjQoCisgICAgICAgICAgICAgICAgICAgICAgICAodWludDY0KWFscmVhZHlfcmVhZCArIHRvX3JlYWQgKyByYXdkYXRhX29mZnNldCwgMTAyNCk7CisgICAgICAgICAgICAgICAgaWYgKHRpZi0+dGlmX3Jhd2RhdGFzaXplPT0wKSB7CisgICAgICAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGJ1ZmZlciBzaXplIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZXdfcmF3ZGF0YSA9ICh1aW50OCopIF9USUZGcmVhbGxvYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfcmF3ZGF0YSwgdGlmLT50aWZfcmF3ZGF0YXNpemUpOworICAgICAgICAgICAgICAgIGlmKCBuZXdfcmF3ZGF0YSA9PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiTm8gc3BhY2UgZm9yIGRhdGEgYnVmZmVyIGF0IHNjYW5saW5lICVsdSIsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfcm93KTsKKyAgICAgICAgICAgICAgICAgICAgX1RJRkZmcmVlKHRpZi0+dGlmX3Jhd2RhdGEpOworICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9yYXdkYXRhID0gMDsKKyAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfcmF3ZGF0YXNpemUgPSAwOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGlmLT50aWZfcmF3ZGF0YSA9IG5ld19yYXdkYXRhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBieXRlc19yZWFkID0gVElGRlJlYWRGaWxlKHRpZiwKKyAgICAgICAgICAgICAgICB0aWYtPnRpZl9yYXdkYXRhICsgcmF3ZGF0YV9vZmZzZXQgKyBhbHJlYWR5X3JlYWQsIHRvX3JlYWQpOworICAgICAgICAgICAgYWxyZWFkeV9yZWFkICs9IGJ5dGVzX3JlYWQ7CisgICAgICAgICAgICBpZiAoYnl0ZXNfcmVhZCAhPSB0b19yZWFkKSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KCB0aWYtPnRpZl9yYXdkYXRhICsgcmF3ZGF0YV9vZmZzZXQgKyBhbHJlYWR5X3JlYWQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICB0aWYtPnRpZl9yYXdkYXRhc2l6ZSAtIHJhd2RhdGFfb2Zmc2V0IC0gYWxyZWFkeV9yZWFkICk7CisjaWYgZGVmaW5lZChfX1dJTjMyX18pICYmIChkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSkKKyAgICAgICAgICAgICAgICBpZiggaXNfc3RyaXAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJSZWFkIGVycm9yIGF0IHNjYW5saW5lICVsdTsgZ290ICVJNjR1IGJ5dGVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJUk2NHUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIF9faW50NjQpIGFscmVhZHlfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgX19pbnQ2NCkgc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiUmVhZCBlcnJvciBhdCByb3cgJWx1LCBjb2wgJWx1LCB0aWxlICVsdTsgIgorICAgICAgICAgICAgICAgICAgICAgICAgImdvdCAlSTY0dSBieXRlcywgZXhwZWN0ZWQgJUk2NHUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgc3RyaXBfb3JfdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgX19pbnQ2NCkgYWxyZWFkeV9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBfX2ludDY0KSBzaXplKTsKKyAgICAgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgICAgIGlmKCBpc19zdHJpcCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIlJlYWQgZXJyb3IgYXQgc2NhbmxpbmUgJWx1OyBnb3QgJWxsdSBieXRlcywgIgorICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkICVsbHUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgYWxyZWFkeV9yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIlJlYWQgZXJyb3IgYXQgcm93ICVsdSwgY29sICVsdSwgdGlsZSAlbHU7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJnb3QgJWxsdSBieXRlcywgZXhwZWN0ZWQgJWxsdSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykgdGlmLT50aWZfY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBzdHJpcF9vcl90aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIGFscmVhZHlfcmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzaXplKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMTsKK30KKworCiBzdGF0aWMgaW50CiBUSUZGRmlsbFN0cmlwUGFydGlhbCggVElGRiAqdGlmLCBpbnQgc3RyaXAsIHRtc2l6ZV90IHJlYWRfYWhlYWQsIGludCByZXN0YXJ0ICkKIHsKQEAgLTQ5LDcgKzE2OSw4IEBACiAJcmVnaXN0ZXIgVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOwogICAgICAgICB0bXNpemVfdCB1bnVzZWRfZGF0YTsKICAgICAgICAgdWludDY0IHJlYWRfb2Zmc2V0OwotICAgICAgICB0bXNpemVfdCBjYywgdG9fcmVhZDsKKyAgICAgICAgdG1zaXplX3QgdG9fcmVhZDsKKyAgICAgICAgdG1zaXplX3QgcmVhZF9haGVhZF9tb2Q7CiAgICAgICAgIC8qIHRtc2l6ZV90IGJ5dGVjb3VudG07ICovCiAgICAgICAgIAogICAgICAgICBpZiAoIV9USUZGRmlsbFN0cmlsZXMoIHRpZiApIHx8ICF0aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnQpCkBAIC02Miw3ICsxODMsMTQgQEAKICAgICAgICAgICovCiAKICAgICAgICAgLyogYnl0ZWNvdW50bT0odG1zaXplX3QpIHRkLT50ZF9zdHJpcGJ5dGVjb3VudFtzdHJpcF07ICovCi0gICAgICAgIGlmIChyZWFkX2FoZWFkKjIgPiB0aWYtPnRpZl9yYXdkYXRhc2l6ZSkgeworCisgICAgICAgIC8qIE5vdCBjb21wbGV0ZWx5IHN1cmUgd2hlcmUgdGhlICogMiBjb21lcyBmcm9tLCBidXQgcHJvYmFibHkgZm9yICovCisgICAgICAgIC8qIGFuIGV4cG9uZW50aW9uYWwgZ3Jvd3RoIHN0cmF0ZWd5IG9mIHRpZl9yYXdkYXRhc2l6ZSAqLworICAgICAgICBpZiggcmVhZF9haGVhZCA8IFRJRkZfVE1TSVpFX1RfTUFYIC8gMiApCisgICAgICAgICAgICAgICAgcmVhZF9haGVhZF9tb2QgPSByZWFkX2FoZWFkICogMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlYWRfYWhlYWRfbW9kID0gcmVhZF9haGVhZDsKKyAgICAgICAgaWYgKHJlYWRfYWhlYWRfbW9kID4gdGlmLT50aWZfcmF3ZGF0YXNpemUpIHsKICAgICAgICAgICAgICAgICBhc3NlcnQoIHJlc3RhcnQgKTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICB0aWYtPnRpZl9jdXJzdHJpcCA9IE5PU1RSSVA7CkBAIC03Miw4ICsyMDAsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSBzdHJpcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKDApOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIVRJRkZSZWFkQnVmZmVyU2V0dXAodGlmLCAwLCByZWFkX2FoZWFkKjIpKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgwKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmKCByZXN0YXJ0ICkKQEAgLTExMyw3ICsyMzksMTAgQEAKICAgICAgICAgLyoKICAgICAgICAgKiogSG93IG11Y2ggZG8gd2Ugd2FudCB0byByZWFkPwogICAgICAgICAqLwotICAgICAgICB0b19yZWFkID0gdGlmLT50aWZfcmF3ZGF0YXNpemUgLSB1bnVzZWRfZGF0YTsKKyAgICAgICAgaWYoIHJlYWRfYWhlYWRfbW9kID4gdGlmLT50aWZfcmF3ZGF0YXNpemUgKQorICAgICAgICAgICAgICAgIHRvX3JlYWQgPSByZWFkX2FoZWFkX21vZCAtIHVudXNlZF9kYXRhOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdG9fcmVhZCA9IHRpZi0+dGlmX3Jhd2RhdGFzaXplIC0gdW51c2VkX2RhdGE7CiAgICAgICAgIGlmKCAodWludDY0KSB0b19yZWFkID4gdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXSAKICAgICAgICAgICAgIC0gdGlmLT50aWZfcmF3ZGF0YW9mZiAtIHRpZi0+dGlmX3Jhd2RhdGFsb2FkZWQgKQogICAgICAgICB7CkBAIC0xMjIsMjUgKzI1MSwxNCBAQAogICAgICAgICB9CiAKIAlhc3NlcnQoKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQlVGRkVSTU1BUCk9PTApOwotICAgICAgICBjYyA9IFRJRkZSZWFkRmlsZSh0aWYsIHRpZi0+dGlmX3Jhd2RhdGEgKyB1bnVzZWRfZGF0YSwgdG9fcmVhZCk7Ci0KLSAgICAgICAgaWYgKGNjICE9IHRvX3JlYWQpIHsKLSNpZiBkZWZpbmVkKF9fV0lOMzJfXykgJiYgKGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pKQotICAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWFkIGVycm9yIGF0IHNjYW5saW5lICVsdTsgZ290ICVJNjR1IGJ5dGVzLCBleHBlY3RlZCAlSTY0dSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSB0aWYtPnRpZl9yb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBfX2ludDY0KSBjYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIF9faW50NjQpIHRvX3JlYWQpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVhZCBlcnJvciBhdCBzY2FubGluZSAlbHU7IGdvdCAlbGx1IGJ5dGVzLCBleHBlY3RlZCAlbGx1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgY2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHRvX3JlYWQpOwotI2VuZGlmCisgICAgICAgIGlmKCAhVElGRlJlYWRBbmRSZWFsbG9jKCB0aWYsIHRvX3JlYWQsIHVudXNlZF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgLyogaXNfc3RyaXAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIC8qIHN0cmlwX29yX3RpbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSkgKQorICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgdGlmLT50aWZfcmF3ZGF0YW9mZiA9IHRpZi0+dGlmX3Jhd2RhdGFvZmYgKyB0aWYtPnRpZl9yYXdkYXRhbG9hZGVkIC0gdW51c2VkX2RhdGEgOwogICAgICAgICB0aWYtPnRpZl9yYXdkYXRhbG9hZGVkID0gdW51c2VkX2RhdGEgKyB0b19yZWFkOwogCkBAIC0xNTksNyArMjc3LDEwIEBACiAgICAgICAgIGlmKCByZXN0YXJ0ICkKICAgICAgICAgICAgICAgICByZXR1cm4gVElGRlN0YXJ0U3RyaXAodGlmLCBzdHJpcCk7CiAgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgICAgIHRpZi0+dGlmX3Jhd2NjID0gdGlmLT50aWZfcmF3ZGF0YWxvYWRlZDsKICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQogfQogCiAvKgpAQCAtMjE0LDcgKzMzNSwxOCBAQAogICAgICAgICAKICAgICAgICAgaWYoICF3aG9sZV9zdHJpcCApCiAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkX2FoZWFkID0gdGlmLT50aWZfc2NhbmxpbmVzaXplICogMTYgKyA1MDAwOworICAgICAgICAgICAgICAgIC8qIDE2IGlzIGZvciBZQ2JDciBtb2RlIHdoZXJlIHdlIG1heSBuZWVkIHRvIHJlYWQgMTYgKi8KKyAgICAgICAgICAgICAgICAvKiBsaW5lcyBhdCBhIHRpbWUgdG8gZ2V0IGEgZGVjb21wcmVzc2VkIGxpbmUsIGFuZCA1MDAwICovCisgICAgICAgICAgICAgICAgLyogaXMgc29tZSBjb25zdGFudCB2YWx1ZSwgZm9yIGV4YW1wbGUgZm9yIEpQRUcgdGFibGVzICovCisgICAgICAgICAgICAgICAgaWYoIHRpZi0+dGlmX3NjYW5saW5lc2l6ZSA8IFRJRkZfVE1TSVpFX1RfTUFYIC8gMTYgJiYKKyAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfc2NhbmxpbmVzaXplICogMTYgPCBUSUZGX1RNU0laRV9UX01BWCAtIDUwMDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfYWhlYWQgPSB0aWYtPnRpZl9zY2FubGluZXNpemUgKiAxNiArIDUwMDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWFkX2FoZWFkID0gdGlmLT50aWZfc2NhbmxpbmVzaXplOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8qCkBAIC0zMTAsMTggKzQ0MiwxNyBAQAogfQogCiAvKgotICogUmVhZCBhIHN0cmlwIG9mIGRhdGEgYW5kIGRlY29tcHJlc3MgdGhlIHNwZWNpZmllZAotICogYW1vdW50IGludG8gdGhlIHVzZXItc3VwcGxpZWQgYnVmZmVyLgorICogQ2FsY3VsYXRlIHRoZSBzdHJpcCBzaXplIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIG9mCisgKiByb3dzIGluIHRoZSBzdHJpcCAoY2hlY2sgZm9yIHRydW5jYXRlZCBsYXN0IHN0cmlwIG9uIGFueQorICogb2YgdGhlIHNlcGFyYXRpb25zKS4KICAqLwotdG1zaXplX3QKLVRJRkZSZWFkRW5jb2RlZFN0cmlwKFRJRkYqIHRpZiwgdWludDMyIHN0cmlwLCB2b2lkKiBidWYsIHRtc2l6ZV90IHNpemUpCitzdGF0aWMgdG1zaXplX3QgVElGRlJlYWRFbmNvZGVkU3RyaXBHZXRTdHJpcFNpemUoVElGRiogdGlmLCB1aW50MzIgc3RyaXAsIHVpbnQxNiogcHBsYW5lKQogewogCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZSZWFkRW5jb2RlZFN0cmlwIjsKIAlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CiAJdWludDMyIHJvd3NwZXJzdHJpcDsKIAl1aW50MzIgc3RyaXBzcGVycGxhbmU7CiAJdWludDMyIHN0cmlwaW5wbGFuZTsKLQl1aW50MTYgcGxhbmU7CiAJdWludDMyIHJvd3M7CiAJdG1zaXplX3Qgc3RyaXBzaXplOwogCWlmICghVElGRkNoZWNrUmVhZCh0aWYsMCkpCkBAIC0zMzMsMjMgKzQ2NCw1NSBAQAogCQkgICAgKHVuc2lnbmVkIGxvbmcpdGQtPnRkX25zdHJpcHMpOwogCQlyZXR1cm4oKHRtc2l6ZV90KSgtMSkpOwogCX0KLQkvKgotCSAqIENhbGN1bGF0ZSB0aGUgc3RyaXAgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZgotCSAqIHJvd3MgaW4gdGhlIHN0cmlwIChjaGVjayBmb3IgdHJ1bmNhdGVkIGxhc3Qgc3RyaXAgb24gYW55Ci0JICogb2YgdGhlIHNlcGFyYXRpb25zKS4KLQkgKi8KKwogCXJvd3NwZXJzdHJpcD10ZC0+dGRfcm93c3BlcnN0cmlwOwogCWlmIChyb3dzcGVyc3RyaXA+dGQtPnRkX2ltYWdlbGVuZ3RoKQogCQlyb3dzcGVyc3RyaXA9dGQtPnRkX2ltYWdlbGVuZ3RoOwotCXN0cmlwc3BlcnBsYW5lPSgodGQtPnRkX2ltYWdlbGVuZ3RoK3Jvd3NwZXJzdHJpcC0xKS9yb3dzcGVyc3RyaXApOworCXN0cmlwc3BlcnBsYW5lPSBUSUZGaG93bWFueV8zMl9tYXh1aW50X2NvbXBhdCh0ZC0+dGRfaW1hZ2VsZW5ndGgsIHJvd3NwZXJzdHJpcCk7CiAJc3RyaXBpbnBsYW5lPShzdHJpcCVzdHJpcHNwZXJwbGFuZSk7Ci0JcGxhbmU9KHN0cmlwL3N0cmlwc3BlcnBsYW5lKTsKKwlpZiggcHBsYW5lICkgKnBwbGFuZT0odWludDE2KShzdHJpcC9zdHJpcHNwZXJwbGFuZSk7CiAJcm93cz10ZC0+dGRfaW1hZ2VsZW5ndGgtc3RyaXBpbnBsYW5lKnJvd3NwZXJzdHJpcDsKIAlpZiAocm93cz5yb3dzcGVyc3RyaXApCiAJCXJvd3M9cm93c3BlcnN0cmlwOwogCXN0cmlwc2l6ZT1USUZGVlN0cmlwU2l6ZSh0aWYscm93cyk7CiAJaWYgKHN0cmlwc2l6ZT09MCkKIAkJcmV0dXJuKCh0bXNpemVfdCkoLTEpKTsKKyAgICByZXR1cm4gc3RyaXBzaXplOworfQorCisvKgorICogUmVhZCBhIHN0cmlwIG9mIGRhdGEgYW5kIGRlY29tcHJlc3MgdGhlIHNwZWNpZmllZAorICogYW1vdW50IGludG8gdGhlIHVzZXItc3VwcGxpZWQgYnVmZmVyLgorICovCit0bXNpemVfdAorVElGRlJlYWRFbmNvZGVkU3RyaXAoVElGRiogdGlmLCB1aW50MzIgc3RyaXAsIHZvaWQqIGJ1ZiwgdG1zaXplX3Qgc2l6ZSkKK3sKKyAgc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRlJlYWRFbmNvZGVkU3RyaXAiOworICBUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisgIHRtc2l6ZV90IHN0cmlwc2l6ZTsKKyAgdWludDE2IHBsYW5lOworCisgIHN0cmlwc2l6ZT1USUZGUmVhZEVuY29kZWRTdHJpcEdldFN0cmlwU2l6ZSh0aWYsIHN0cmlwLCAmcGxhbmUpOworICBpZiAoc3RyaXBzaXplPT0oKHRtc2l6ZV90KSgtMSkpKQorICAgICAgcmV0dXJuKCh0bXNpemVfdCkoLTEpKTsKKworICAgIC8qIHNob3J0Y3V0IHRvIGF2b2lkIGFuIGV4dHJhIG1lbWNweSgpICovCisgICAgaWYoIHRkLT50ZF9jb21wcmVzc2lvbiA9PSBDT01QUkVTU0lPTl9OT05FICYmCisgICAgICAgIHNpemUhPSh0bXNpemVfdCkoLTEpICYmIHNpemUgPj0gc3RyaXBzaXplICYmCisgICAgICAgICFpc01hcHBlZCh0aWYpICYmCisgICAgICAgICgodGlmLT50aWZfZmxhZ3MmVElGRl9OT1JFQURSQVcpPT0wKSApCisgICAgeworICAgICAgICBpZiAoVElGRlJlYWRSYXdTdHJpcDEodGlmLCBzdHJpcCwgYnVmLCBzdHJpcHNpemUsIG1vZHVsZSkgIT0gc3RyaXBzaXplKQorICAgICAgICAgICAgcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisKKyAgICAgICAgaWYgKCFpc0ZpbGxPcmRlcih0aWYsIHRkLT50ZF9maWxsb3JkZXIpICYmCisgICAgICAgICAgICAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX05PQklUUkVWKSA9PSAwKQorICAgICAgICAgICAgVElGRlJldmVyc2VCaXRzKGJ1ZixzdHJpcHNpemUpOworCisgICAgICAgICgqdGlmLT50aWZfcG9zdGRlY29kZSkodGlmLGJ1ZixzdHJpcHNpemUpOworICAgICAgICByZXR1cm4gKHN0cmlwc2l6ZSk7CisgICAgfQorCiAJaWYgKChzaXplIT0odG1zaXplX3QpKC0xKSkmJihzaXplPHN0cmlwc2l6ZSkpCiAJCXN0cmlwc2l6ZT1zaXplOwogCWlmICghVElGRkZpbGxTdHJpcCh0aWYsc3RyaXApKQpAQCAtMzYwLDYgKzUyMyw1MCBAQAogCXJldHVybihzdHJpcHNpemUpOwogfQogCisvKiBWYXJpYW50IG9mIFRJRkZSZWFkRW5jb2RlZFN0cmlwKCkgdGhhdCBkb2VzIAorICogKiBpZiAqYnVmID09IE5VTEwsICpidWYgPSBfVElGRm1hbGxvYyhidWZzaXpldG9hbGxvYykgb25seSBhZnRlciBUSUZGRmlsbFN0cmlwKCkgaGFzCisgKiAgIHN1Y2VlZGVkLiBUaGlzIGF2b2lkIGV4Y2Vzc2l2ZSBtZW1vcnkgYWxsb2NhdGlvbiBpbiBjYXNlIG9mIHRydW5jYXRlZAorICogICBmaWxlLgorICogKiBjYWxscyByZWd1bGFyIFRJRkZSZWFkRW5jb2RlZFN0cmlwKCkgaWYgKmJ1ZiAhPSBOVUxMCisgKi8KK3Rtc2l6ZV90CitfVElGRlJlYWRFbmNvZGVkU3RyaXBBbmRBbGxvY0J1ZmZlcihUSUZGKiB0aWYsIHVpbnQzMiBzdHJpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipidWYsIHRtc2l6ZV90IGJ1ZnNpemV0b2FsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1zaXplX3Qgc2l6ZV90b19yZWFkKQoreworICAgIHRtc2l6ZV90IHRoaXNfc3RyaXBzaXplOworICAgIHVpbnQxNiBwbGFuZTsKKworICAgIGlmKCAqYnVmICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRJRkZSZWFkRW5jb2RlZFN0cmlwKHRpZiwgc3RyaXAsICpidWYsIHNpemVfdG9fcmVhZCk7CisgICAgfQorCisgICAgdGhpc19zdHJpcHNpemU9VElGRlJlYWRFbmNvZGVkU3RyaXBHZXRTdHJpcFNpemUodGlmLCBzdHJpcCwgJnBsYW5lKTsKKyAgICBpZiAodGhpc19zdHJpcHNpemU9PSgodG1zaXplX3QpKC0xKSkpCisgICAgICAgICAgICByZXR1cm4oKHRtc2l6ZV90KSgtMSkpOworCisgICAgaWYgKChzaXplX3RvX3JlYWQhPSh0bXNpemVfdCkoLTEpKSYmKHNpemVfdG9fcmVhZDx0aGlzX3N0cmlwc2l6ZSkpCisgICAgICAgICAgICB0aGlzX3N0cmlwc2l6ZT1zaXplX3RvX3JlYWQ7CisgICAgaWYgKCFUSUZGRmlsbFN0cmlwKHRpZixzdHJpcCkpCisgICAgICAgICAgICByZXR1cm4oKHRtc2l6ZV90KSgtMSkpOworCisgICAgKmJ1ZiA9IF9USUZGbWFsbG9jKGJ1ZnNpemV0b2FsbG9jKTsKKyAgICBpZiAoKmJ1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgVElGRkZpbGVOYW1lKHRpZiksICJObyBzcGFjZSBmb3Igc3RyaXAgYnVmZmVyIik7CisgICAgICAgICAgICByZXR1cm4oKHRtc2l6ZV90KSgtMSkpOworICAgIH0KKyAgICBfVElGRm1lbXNldCgqYnVmLCAwLCBidWZzaXpldG9hbGxvYyk7CisKKyAgICBpZiAoKCp0aWYtPnRpZl9kZWNvZGVzdHJpcCkodGlmLCpidWYsdGhpc19zdHJpcHNpemUscGxhbmUpPD0wKQorICAgICAgICAgICAgcmV0dXJuKCh0bXNpemVfdCkoLTEpKTsKKyAgICAoKnRpZi0+dGlmX3Bvc3RkZWNvZGUpKHRpZiwqYnVmLHRoaXNfc3RyaXBzaXplKTsKKyAgICByZXR1cm4odGhpc19zdHJpcHNpemUpOworCisKK30KKworCiBzdGF0aWMgdG1zaXplX3QKIFRJRkZSZWFkUmF3U3RyaXAxKFRJRkYqIHRpZiwgdWludDMyIHN0cmlwLCB2b2lkKiBidWYsIHRtc2l6ZV90IHNpemUsCiAgICAgY29uc3QgY2hhciogbW9kdWxlKQpAQCAtMzk3LDE2ICs2MDQsMjUgQEAKIAkJCXJldHVybiAoKHRtc2l6ZV90KSgtMSkpOwogCQl9CiAJfSBlbHNlIHsKLQkJdG1zaXplX3QgbWEsbWI7CisJCXRtc2l6ZV90IG1hID0gMDsKIAkJdG1zaXplX3QgbjsKLQkJbWE9KHRtc2l6ZV90KXRkLT50ZF9zdHJpcG9mZnNldFtzdHJpcF07Ci0JCW1iPW1hK3NpemU7Ci0JCWlmICgoKHVpbnQ2NCltYSE9dGQtPnRkX3N0cmlwb2Zmc2V0W3N0cmlwXSl8fChtYT50aWYtPnRpZl9zaXplKSkKLQkJCW49MDsKLQkJZWxzZSBpZiAoKG1iPG1hKXx8KG1iPHNpemUpfHwobWI+dGlmLT50aWZfc2l6ZSkpCi0JCQluPXRpZi0+dGlmX3NpemUtbWE7Ci0JCWVsc2UKLQkJCW49c2l6ZTsKKwkJaWYgKCh0ZC0+dGRfc3RyaXBvZmZzZXRbc3RyaXBdID4gKHVpbnQ2NClUSUZGX1RNU0laRV9UX01BWCl8fAorICAgICAgICAgICAgICAgICAgICAoKG1hPSh0bXNpemVfdCl0ZC0+dGRfc3RyaXBvZmZzZXRbc3RyaXBdKT50aWYtPnRpZl9zaXplKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG49MDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggbWEgPiBUSUZGX1RNU0laRV9UX01BWCAtIHNpemUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbj0wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXNpemVfdCBtYj1tYStzaXplOworICAgICAgICAgICAgICAgICAgICBpZiAobWI+dGlmLT50aWZfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuPXRpZi0+dGlmX3NpemUtbWE7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuPXNpemU7CisgICAgICAgICAgICAgICAgfQogCQlpZiAobiE9c2l6ZSkgewogI2lmIGRlZmluZWQoX19XSU4zMl9fKSAmJiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykpCiAJCQlUSUZGRXJyb3JFeHQodGlmLT50aWZfY2xpZW50ZGF0YSwgbW9kdWxlLApAQCAtNDMxLDYgKzY0Nyw0MyBAQAogCXJldHVybiAoc2l6ZSk7CiB9CiAKK3N0YXRpYyB0bXNpemVfdAorVElGRlJlYWRSYXdTdHJpcE9yVGlsZTIoVElGRiogdGlmLCB1aW50MzIgc3RyaXBfb3JfdGlsZSwgaW50IGlzX3N0cmlwLAorICAgICAgICAgICAgICAgICAgICAgICAgdG1zaXplX3Qgc2l6ZSwgY29uc3QgY2hhciogbW9kdWxlKQoreworICAgICAgICBUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisKKyAgICAgICAgYXNzZXJ0KCAhaXNNYXBwZWQodGlmKSApOworICAgICAgICBhc3NlcnQoKHRpZi0+dGlmX2ZsYWdzJlRJRkZfTk9SRUFEUkFXKT09MCk7CisKKyAgICAgICAgaWYgKCFTZWVrT0sodGlmLCB0ZC0+dGRfc3RyaXBvZmZzZXRbc3RyaXBfb3JfdGlsZV0pKSB7CisgICAgICAgICAgICBpZiggaXNfc3RyaXAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICJTZWVrIGVycm9yIGF0IHNjYW5saW5lICVsdSwgc3RyaXAgJWx1IiwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHN0cmlwX29yX3RpbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICJTZWVrIGVycm9yIGF0IHJvdyAlbHUsIGNvbCAlbHUsIHRpbGUgJWx1IiwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX3JvdywKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHRpZi0+dGlmX2NvbCwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpIHN0cmlwX29yX3RpbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiggIVRJRkZSZWFkQW5kUmVhbGxvYyggdGlmLCBzaXplLCAwLCBpc19zdHJpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwX29yX3RpbGUsIG1vZHVsZSApICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKHNpemUpOworfQorCiAvKgogICogUmVhZCBhIHN0cmlwIG9mIGRhdGEgZnJvbSB0aGUgZmlsZS4KICAqLwpAQCAtNDkyLDkgKzc0NSw5IEBACiAJc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlW10gPSAiVElGRkZpbGxTdHJpcCI7CiAJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOwogCi0gICAgaWYgKCFfVElGRkZpbGxTdHJpbGVzKCB0aWYgKSB8fCAhdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50KQotICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgCisgICAgICAgIGlmICghX1RJRkZGaWxsU3RyaWxlcyggdGlmICkgfHwgIXRpZi0+dGlmX2Rpci50ZF9zdHJpcGJ5dGVjb3VudCkKKyAgICAgICAgICAgIHJldHVybiAwOworCiAJaWYgKCh0aWYtPnRpZl9mbGFncyZUSUZGX05PUkVBRFJBVyk9PTApCiAJewogCQl1aW50NjQgYnl0ZWNvdW50ID0gdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3N0cmlwXTsKQEAgLTUxMiw2ICs3NjUsMzkgQEAKICNlbmRpZgogCQkJcmV0dXJuICgwKTsKIAkJfQorCisJCS8qIFRvIGF2b2lkIGV4Y2Vzc2l2ZSBtZW1vcnkgYWxsb2NhdGlvbnM6ICovCisJCS8qIEJ5dGUgY291bnQgc2hvdWxkIG5vcm1hbGx5IG5vdCBiZSBsYXJnZXIgdGhhbiBhIG51bWJlciBvZiAqLworCQkvKiB0aW1lcyB0aGUgdW5jb21wcmVzc2VkIHNpemUgcGx1cyBzb21lIG1hcmdpbiAqLworICAgICAgICAgICAgICAgIGlmKCBieXRlY291bnQgPiAxMDI0ICogMTAyNCApCisgICAgICAgICAgICAgICAgeworCQkJLyogMTAgYW5kIDQwOTYgYXJlIGp1c3QgdmFsdWVzIHRoYXQgY291bGQgYmUgYWRqdXN0ZWQuICovCisJCQkvKiBIb3BlZnVsbHkgdGhleSBhcmUgc2FmZSBlbm91Z2ggZm9yIGFsbCBjb2RlY3MgKi8KKwkJCXRtc2l6ZV90IHN0cmlwc2l6ZSA9IFRJRkZTdHJpcFNpemUodGlmKTsKKwkJCWlmKCBzdHJpcHNpemUgIT0gMCAmJgorCQkJICAgIChieXRlY291bnQgLSA0MDk2KSAvIDEwID4gKHVpbnQ2NClzdHJpcHNpemUgICkKKwkJCXsKKwkJCQl1aW50NjQgbmV3Ynl0ZWNvdW50ID0gKHVpbnQ2NClzdHJpcHNpemUgKiAxMCArIDQwOTY7CisJCQkJaWYoIChpbnQ2NCluZXdieXRlY291bnQgPj0gMCApCisJCQkJeworI2lmIGRlZmluZWQoX19XSU4zMl9fKSAmJiAoZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfX01JTkdXMzJfXykpCisJCQkJCVRJRkZXYXJuaW5nRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJICAiVG9vIGxhcmdlIHN0cmlwIGJ5dGUgY291bnQgJUk2NHUsIHN0cmlwICVsdS4gTGltaXRpbmcgdG8gJUk2NHUiLAorCQkJCQkgICAgICh1bnNpZ25lZCBfX2ludDY0KSBieXRlY291bnQsCisJCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHN0cmlwLAorCQkJCQkgICAgICh1bnNpZ25lZCBfX2ludDY0KSBuZXdieXRlY291bnQpOworI2Vsc2UKKwkJCQkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwKKwkJCQkJICAiVG9vIGxhcmdlIHN0cmlwIGJ5dGUgY291bnQgJWxsdSwgc3RyaXAgJWx1LiBMaW1pdGluZyB0byAlbGx1IiwKKwkJCQkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBieXRlY291bnQsCisJCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIHN0cmlwLAorCQkJCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG5ld2J5dGVjb3VudCk7CisjZW5kaWYKKwkJCQkJYnl0ZWNvdW50ID0gbmV3Ynl0ZWNvdW50OworCQkJCX0KKwkJCX0KKwkJfQorCiAJCWlmIChpc01hcHBlZCh0aWYpICYmCiAJCSAgICAoaXNGaWxsT3JkZXIodGlmLCB0ZC0+dGRfZmlsbG9yZGVyKQogCQkgICAgfHwgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9OT0JJVFJFVikpKSB7CkBAIC02MDEsMTcgKzg4NywzNiBAQAogCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpIHN0cmlwKTsKIAkJCQkJcmV0dXJuICgwKTsKIAkJCQl9Ci0JCQkJaWYgKCFUSUZGUmVhZEJ1ZmZlclNldHVwKHRpZiwgMCwgYnl0ZWNvdW50bSkpCi0JCQkJCXJldHVybiAoMCk7CiAJCQl9CiAJCQlpZiAodGlmLT50aWZfZmxhZ3MmVElGRl9CVUZGRVJNTUFQKSB7CiAJCQkJdGlmLT50aWZfY3Vyc3RyaXAgPSBOT1NUUklQOwotCQkJCWlmICghVElGRlJlYWRCdWZmZXJTZXR1cCh0aWYsIDAsIGJ5dGVjb3VudG0pKQotCQkJCQlyZXR1cm4gKDApOworCQkJCXRpZi0+dGlmX3Jhd2RhdGEgPSBOVUxMOworCQkJCXRpZi0+dGlmX3Jhd2RhdGFzaXplID0gMDsKKwkJCQl0aWYtPnRpZl9mbGFncyAmPSB+VElGRl9CVUZGRVJNTUFQOwogCQkJfQotCQkJaWYgKFRJRkZSZWFkUmF3U3RyaXAxKHRpZiwgc3RyaXAsIHRpZi0+dGlmX3Jhd2RhdGEsCi0JCQkJYnl0ZWNvdW50bSwgbW9kdWxlKSAhPSBieXRlY291bnRtKQotCQkJCXJldHVybiAoMCk7CisKKwkJCWlmKCBpc01hcHBlZCh0aWYpICkKKwkJCXsKKwkJCQlpZiAoYnl0ZWNvdW50bSA+IHRpZi0+dGlmX3Jhd2RhdGFzaXplICYmCisJCQkJICAgICFUSUZGUmVhZEJ1ZmZlclNldHVwKHRpZiwgMCwgYnl0ZWNvdW50bSkpCisJCQkJeworCQkJCQlyZXR1cm4gKDApOworCQkJCX0KKwkJCQlpZiAoVElGRlJlYWRSYXdTdHJpcDEodGlmLCBzdHJpcCwgdGlmLT50aWZfcmF3ZGF0YSwKKwkJCQkgICAgYnl0ZWNvdW50bSwgbW9kdWxlKSAhPSBieXRlY291bnRtKQorCQkJCXsKKwkJCQkJcmV0dXJuICgwKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJaWYgKFRJRkZSZWFkUmF3U3RyaXBPclRpbGUyKHRpZiwgc3RyaXAsIDEsCisJCQkJICAgIGJ5dGVjb3VudG0sIG1vZHVsZSkgIT0gYnl0ZWNvdW50bSkKKwkJCQl7CisJCQkJCXJldHVybiAoMCk7CisJCQkJfQorCQkJfQorCiAKICAgICAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX3Jhd2RhdGFvZmYgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfcmF3ZGF0YWxvYWRlZCA9IGJ5dGVjb3VudG07CkBAIC02NjEsNiArOTY2LDI0IEBACiAJCSAgICAodW5zaWduZWQgbG9uZykgdGlsZSwgKHVuc2lnbmVkIGxvbmcpIHRkLT50ZF9uc3RyaXBzKTsKIAkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CiAJfQorCisgICAgLyogc2hvcnRjdXQgdG8gYXZvaWQgYW4gZXh0cmEgbWVtY3B5KCkgKi8KKyAgICBpZiggdGQtPnRkX2NvbXByZXNzaW9uID09IENPTVBSRVNTSU9OX05PTkUgJiYKKyAgICAgICAgc2l6ZSE9KHRtc2l6ZV90KSgtMSkgJiYgc2l6ZSA+PSB0aWxlc2l6ZSAmJgorICAgICAgICAhaXNNYXBwZWQodGlmKSAmJgorICAgICAgICAoKHRpZi0+dGlmX2ZsYWdzJlRJRkZfTk9SRUFEUkFXKT09MCkgKQorICAgIHsKKyAgICAgICAgaWYgKFRJRkZSZWFkUmF3VGlsZTEodGlmLCB0aWxlLCBidWYsIHRpbGVzaXplLCBtb2R1bGUpICE9IHRpbGVzaXplKQorICAgICAgICAgICAgcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisKKyAgICAgICAgaWYgKCFpc0ZpbGxPcmRlcih0aWYsIHRkLT50ZF9maWxsb3JkZXIpICYmCisgICAgICAgICAgICAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX05PQklUUkVWKSA9PSAwKQorICAgICAgICAgICAgVElGRlJldmVyc2VCaXRzKGJ1Zix0aWxlc2l6ZSk7CisKKyAgICAgICAgKCp0aWYtPnRpZl9wb3N0ZGVjb2RlKSh0aWYsYnVmLHRpbGVzaXplKTsKKyAgICAgICAgcmV0dXJuICh0aWxlc2l6ZSk7CisgICAgfQorCiAJaWYgKHNpemUgPT0gKHRtc2l6ZV90KSgtMSkpCiAJCXNpemUgPSB0aWxlc2l6ZTsKIAllbHNlIGlmIChzaXplID4gdGlsZXNpemUpCkBAIC02NzMsNiArOTk2LDc4IEBACiAJCXJldHVybiAoKHRtc2l6ZV90KSgtMSkpOwogfQogCisvKiBWYXJpYW50IG9mIFRJRkZSZWFkVGlsZSgpIHRoYXQgZG9lcyAKKyAqICogaWYgKmJ1ZiA9PSBOVUxMLCAqYnVmID0gX1RJRkZtYWxsb2MoYnVmc2l6ZXRvYWxsb2MpIG9ubHkgYWZ0ZXIgVElGRkZpbGxUaWxlKCkgaGFzCisgKiAgIHN1Y2VlZGVkLiBUaGlzIGF2b2lkIGV4Y2Vzc2l2ZSBtZW1vcnkgYWxsb2NhdGlvbiBpbiBjYXNlIG9mIHRydW5jYXRlZAorICogICBmaWxlLgorICogKiBjYWxscyByZWd1bGFyIFRJRkZSZWFkRW5jb2RlZFRpbGUoKSBpZiAqYnVmICE9IE5VTEwKKyAqLwordG1zaXplX3QKK19USUZGUmVhZFRpbGVBbmRBbGxvY0J1ZmZlcihUSUZGKiB0aWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKmJ1ZiwgdG1zaXplX3QgYnVmc2l6ZXRvYWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHgsIHVpbnQzMiB5LCB1aW50MzIgeiwgdWludDE2IHMpCit7CisgICAgaWYgKCFUSUZGQ2hlY2tSZWFkKHRpZiwgMSkgfHwgIVRJRkZDaGVja1RpbGUodGlmLCB4LCB5LCB6LCBzKSkKKyAgICAgICAgICAgIHJldHVybiAoKHRtc2l6ZV90KSgtMSkpOworICAgIHJldHVybiAoX1RJRkZSZWFkRW5jb2RlZFRpbGVBbmRBbGxvY0J1ZmZlcih0aWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRJRkZDb21wdXRlVGlsZSh0aWYsIHgsIHksIHosIHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGJ1ZnNpemV0b2FsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG1zaXplX3QpKC0xKSkpOworfQorCisvKiBWYXJpYW50IG9mIFRJRkZSZWFkRW5jb2RlZFRpbGUoKSB0aGF0IGRvZXMgCisgKiAqIGlmICpidWYgPT0gTlVMTCwgKmJ1ZiA9IF9USUZGbWFsbG9jKGJ1ZnNpemV0b2FsbG9jKSBvbmx5IGFmdGVyIFRJRkZGaWxsVGlsZSgpIGhhcworICogICBzdWNlZWRlZC4gVGhpcyBhdm9pZCBleGNlc3NpdmUgbWVtb3J5IGFsbG9jYXRpb24gaW4gY2FzZSBvZiB0cnVuY2F0ZWQKKyAqICAgZmlsZS4KKyAqICogY2FsbHMgcmVndWxhciBUSUZGUmVhZEVuY29kZWRUaWxlKCkgaWYgKmJ1ZiAhPSBOVUxMCisgKi8KK3Rtc2l6ZV90CitfVElGRlJlYWRFbmNvZGVkVGlsZUFuZEFsbG9jQnVmZmVyKFRJRkYqIHRpZiwgdWludDMyIHRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYnVmLCB0bXNpemVfdCBidWZzaXpldG9hbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtc2l6ZV90IHNpemVfdG9fcmVhZCkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciBtb2R1bGVbXSA9ICJfVElGRlJlYWRFbmNvZGVkVGlsZUFuZEFsbG9jQnVmZmVyIjsKKyAgICBUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CisgICAgdG1zaXplX3QgdGlsZXNpemUgPSB0aWYtPnRpZl90aWxlc2l6ZTsKKworICAgIGlmKCAqYnVmICE9IE5VTEwgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFRJRkZSZWFkRW5jb2RlZFRpbGUodGlmLCB0aWxlLCAqYnVmLCBzaXplX3RvX3JlYWQpOworICAgIH0KKworICAgIGlmICghVElGRkNoZWNrUmVhZCh0aWYsIDEpKQorICAgICAgICAgICAgcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisgICAgaWYgKHRpbGUgPj0gdGQtPnRkX25zdHJpcHMpIHsKKyAgICAgICAgICAgIFRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsCisgICAgICAgICAgICAgICAgIiVsdTogVGlsZSBvdXQgb2YgcmFuZ2UsIG1heCAlbHUiLAorICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKSB0aWxlLCAodW5zaWduZWQgbG9uZykgdGQtPnRkX25zdHJpcHMpOworICAgICAgICAgICAgcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisgICAgfQorCisgICAgaWYgKCFUSUZGRmlsbFRpbGUodGlmLHRpbGUpKQorICAgICAgICAgICAgcmV0dXJuKCh0bXNpemVfdCkoLTEpKTsKKworICAgICpidWYgPSBfVElGRm1hbGxvYyhidWZzaXpldG9hbGxvYyk7CisgICAgaWYgKCpidWYgPT0gTlVMTCkgeworICAgICAgICAgICAgVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIFRJRkZGaWxlTmFtZSh0aWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJObyBzcGFjZSBmb3IgdGlsZSBidWZmZXIiKTsKKyAgICAgICAgICAgIHJldHVybigodG1zaXplX3QpKC0xKSk7CisgICAgfQorICAgIF9USUZGbWVtc2V0KCpidWYsIDAsIGJ1ZnNpemV0b2FsbG9jKTsKKworICAgIGlmIChzaXplX3RvX3JlYWQgPT0gKHRtc2l6ZV90KSgtMSkpCisgICAgICAgIHNpemVfdG9fcmVhZCA9IHRpbGVzaXplOworICAgIGVsc2UgaWYgKHNpemVfdG9fcmVhZCA+IHRpbGVzaXplKQorICAgICAgICBzaXplX3RvX3JlYWQgPSB0aWxlc2l6ZTsKKyAgICBpZiggKCp0aWYtPnRpZl9kZWNvZGV0aWxlKSh0aWYsCisgICAgICAgICh1aW50OCopICpidWYsIHNpemVfdG9fcmVhZCwgKHVpbnQxNikodGlsZS90ZC0+dGRfc3RyaXBzcGVyaW1hZ2UpKSkgeworICAgICAgICAoKnRpZi0+dGlmX3Bvc3RkZWNvZGUpKHRpZiwgKHVpbnQ4KikgKmJ1Ziwgc2l6ZV90b19yZWFkKTsKKyAgICAgICAgcmV0dXJuIChzaXplX3RvX3JlYWQpOworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKK30KKworCiBzdGF0aWMgdG1zaXplX3QKIFRJRkZSZWFkUmF3VGlsZTEoVElGRiogdGlmLCB1aW50MzIgdGlsZSwgdm9pZCogYnVmLCB0bXNpemVfdCBzaXplLCBjb25zdCBjaGFyKiBtb2R1bGUpCiB7CkBAIC03MTcsNyArMTExMiw3IEBACiAJCXRtc2l6ZV90IG47CiAJCW1hPSh0bXNpemVfdCl0ZC0+dGRfc3RyaXBvZmZzZXRbdGlsZV07CiAJCW1iPW1hK3NpemU7Ci0JCWlmICgoKHVpbnQ2NCltYSE9dGQtPnRkX3N0cmlwb2Zmc2V0W3RpbGVdKXx8KG1hPnRpZi0+dGlmX3NpemUpKQorCQlpZiAoKHRkLT50ZF9zdHJpcG9mZnNldFt0aWxlXSA+ICh1aW50NjQpVElGRl9UTVNJWkVfVF9NQVgpfHwobWE+dGlmLT50aWZfc2l6ZSkpCiAJCQluPTA7CiAJCWVsc2UgaWYgKChtYjxtYSl8fChtYjxzaXplKXx8KG1iPnRpZi0+dGlmX3NpemUpKQogCQkJbj10aWYtPnRpZl9zaXplLW1hOwpAQCAtNzk1LDkgKzExOTAsOSBAQAogCXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZVtdID0gIlRJRkZGaWxsVGlsZSI7CiAJVElGRkRpcmVjdG9yeSAqdGQgPSAmdGlmLT50aWZfZGlyOwogCi0gICAgaWYgKCFfVElGRkZpbGxTdHJpbGVzKCB0aWYgKSB8fCAhdGlmLT50aWZfZGlyLnRkX3N0cmlwYnl0ZWNvdW50KQotICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgCisgICAgICAgIGlmICghX1RJRkZGaWxsU3RyaWxlcyggdGlmICkgfHwgIXRpZi0+dGlmX2Rpci50ZF9zdHJpcGJ5dGVjb3VudCkKKyAgICAgICAgICAgIHJldHVybiAwOworCiAJaWYgKCh0aWYtPnRpZl9mbGFncyZUSUZGX05PUkVBRFJBVyk9PTApCiAJewogCQl1aW50NjQgYnl0ZWNvdW50ID0gdGQtPnRkX3N0cmlwYnl0ZWNvdW50W3RpbGVdOwpAQCAtODc2LDE4ICsxMjcxLDM2IEBACiAJCQkJCSAgICAodW5zaWduZWQgbG9uZykgdGlsZSk7CiAJCQkJCXJldHVybiAoMCk7CiAJCQkJfQotCQkJCWlmICghVElGRlJlYWRCdWZmZXJTZXR1cCh0aWYsIDAsIGJ5dGVjb3VudG0pKQotCQkJCQlyZXR1cm4gKDApOwogCQkJfQogCQkJaWYgKHRpZi0+dGlmX2ZsYWdzJlRJRkZfQlVGRkVSTU1BUCkgewogCQkJCXRpZi0+dGlmX2N1cnRpbGUgPSBOT1RJTEU7Ci0JCQkJaWYgKCFUSUZGUmVhZEJ1ZmZlclNldHVwKHRpZiwgMCwgYnl0ZWNvdW50bSkpCi0JCQkJCXJldHVybiAoMCk7CisJCQkJdGlmLT50aWZfcmF3ZGF0YSA9IE5VTEw7CisJCQkJdGlmLT50aWZfcmF3ZGF0YXNpemUgPSAwOworCQkJCXRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX0JVRkZFUk1NQVA7CiAJCQl9CiAKLQkJCWlmIChUSUZGUmVhZFJhd1RpbGUxKHRpZiwgdGlsZSwgdGlmLT50aWZfcmF3ZGF0YSwKLQkJCSAgICBieXRlY291bnRtLCBtb2R1bGUpICE9IGJ5dGVjb3VudG0pCi0JCQkJcmV0dXJuICgwKTsKKwkJCWlmKCBpc01hcHBlZCh0aWYpICkKKwkJCXsKKwkJCQlpZiAoYnl0ZWNvdW50bSA+IHRpZi0+dGlmX3Jhd2RhdGFzaXplICYmCisJCQkJICAgICFUSUZGUmVhZEJ1ZmZlclNldHVwKHRpZiwgMCwgYnl0ZWNvdW50bSkpCisJCQkJeworCQkJCQlyZXR1cm4gKDApOworCQkJCX0KKwkJCQlpZiAoVElGRlJlYWRSYXdUaWxlMSh0aWYsIHRpbGUsIHRpZi0+dGlmX3Jhd2RhdGEsCisJCQkJICAgIGJ5dGVjb3VudG0sIG1vZHVsZSkgIT0gYnl0ZWNvdW50bSkKKwkJCQl7CisJCQkJCXJldHVybiAoMCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmIChUSUZGUmVhZFJhd1N0cmlwT3JUaWxlMih0aWYsIHRpbGUsIDAsCisJCQkJICAgIGJ5dGVjb3VudG0sIG1vZHVsZSkgIT0gYnl0ZWNvdW50bSkKKwkJCQl7CisJCQkJCXJldHVybiAoMCk7CisJCQkJfQorCQkJfQorCiAKICAgICAgICAgICAgICAgICAgICAgICAgIHRpZi0+dGlmX3Jhd2RhdGFvZmYgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgdGlmLT50aWZfcmF3ZGF0YWxvYWRlZCA9IGJ5dGVjb3VudG07CkBAIC05MzUsMTAgKzEzNDgsOSBAQAogCQkJCSAiSW52YWxpZCBidWZmZXIgc2l6ZSIpOwogCQkgICAgcmV0dXJuICgwKTsKIAkJfQotCQl0aWYtPnRpZl9yYXdkYXRhID0gKHVpbnQ4KikgX1RJRkZtYWxsb2ModGlmLT50aWZfcmF3ZGF0YXNpemUpOwotCQlpZiAodGlmLT50aWZfcmF3ZGF0YSkKLQkJCW1lbXNldCh0aWYtPnRpZl9yYXdkYXRhLCAwLCB0aWYtPnRpZl9yYXdkYXRhc2l6ZSk7Ci0KKwkJLyogSW5pdGlhbGl6ZSB0byB6ZXJvIHRvIGF2b2lkIHVuaW5pdGlhbGl6ZWQgYnVmZmVycyBpbiBjYXNlIG9mICovCisgICAgICAgICAgICAgICAgLyogc2hvcnQgcmVhZHMgKGh0dHA6Ly9idWd6aWxsYS5tYXB0b29scy5vcmcvc2hvd19idWcuY2dpP2lkPTI2NTEpICovCisJCXRpZi0+dGlmX3Jhd2RhdGEgPSAodWludDgqKSBfVElGRmNhbGxvYygxLCB0aWYtPnRpZl9yYXdkYXRhc2l6ZSk7CiAJCXRpZi0+dGlmX2ZsYWdzIHw9IFRJRkZfTVlCVUZGRVI7CiAJfQogCWlmICh0aWYtPnRpZl9yYXdkYXRhID09IE5VTEwpIHsKQEAgLTk2MCw4ICsxMzcyLDggQEAKIHsKIAlUSUZGRGlyZWN0b3J5ICp0ZCA9ICZ0aWYtPnRpZl9kaXI7CiAKLSAgICBpZiAoIV9USUZGRmlsbFN0cmlsZXMoIHRpZiApIHx8ICF0aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnQpCi0gICAgICAgIHJldHVybiAwOworICAgICAgICBpZiAoIV9USUZGRmlsbFN0cmlsZXMoIHRpZiApIHx8ICF0aWYtPnRpZl9kaXIudGRfc3RyaXBieXRlY291bnQpCisgICAgICAgICAgICByZXR1cm4gMDsKIAogCWlmICgodGlmLT50aWZfZmxhZ3MgJiBUSUZGX0NPREVSU0VUVVApID09IDApIHsKIAkJaWYgKCEoKnRpZi0+dGlmX3NldHVwZGVjb2RlKSh0aWYpKQpAQCAtOTgwLDcgKzEzOTIsMTAgQEAKIAllbHNlCiAJewogCQl0aWYtPnRpZl9yYXdjcCA9IHRpZi0+dGlmX3Jhd2RhdGE7Ci0JCXRpZi0+dGlmX3Jhd2NjID0gKHRtc2l6ZV90KXRkLT50ZF9zdHJpcGJ5dGVjb3VudFtzdHJpcF07CisJCWlmKCB0aWYtPnRpZl9yYXdkYXRhbG9hZGVkID4gMCApCisJCQl0aWYtPnRpZl9yYXdjYyA9IHRpZi0+dGlmX3Jhd2RhdGFsb2FkZWQ7CisJCWVsc2UKKwkJCXRpZi0+dGlmX3Jhd2NjID0gKHRtc2l6ZV90KXRkLT50ZF9zdHJpcGJ5dGVjb3VudFtzdHJpcF07CiAJfQogCXJldHVybiAoKCp0aWYtPnRpZl9wcmVkZWNvZGUpKHRpZiwKIAkJCSh1aW50MTYpKHN0cmlwIC8gdGQtPnRkX3N0cmlwc3BlcmltYWdlKSkpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfc3RyaXAuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3N0cmlwLmMKaW5kZXggNmNhYzcxZC4uNmU5ZjJlZiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfc3RyaXAuYworKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9zdHJpcC5jCkBAIC0xLDQgKzEsNCBAQAotLyogJElkOiB0aWZfc3RyaXAuYyx2IDEuMzYgMjAxNS0wNi0wNyAyMjozNTo0MCBiZnJpZXNlbiBFeHAgJCAqLworLyogJElkOiB0aWZfc3RyaXAuYyx2IDEuMzggMjAxNi0xMi0wMyAxMTowMjoxNSBlcm91YXVsdCBFeHAgJCAqLwogCiAvKgogICogQ29weXJpZ2h0IChjKSAxOTkxLTE5OTcgU2FtIExlZmZsZXIKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3N3YWIuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3N3YWIuYwppbmRleCBmMzdlMzNmLi4yMTFkYzU3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl9zd2FiLmMKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfc3dhYi5jCkBAIC0xLDQgKzEsNCBAQAotLyogJElkOiB0aWZfc3dhYi5jLHYgMS4xMyAyMDEwLTAzLTEwIDE4OjU2OjQ5IGJmcmllc2VuIEV4cCAkICovCisvKiAkSWQ6IHRpZl9zd2FiLmMsdiAxLjE0IDIwMTYtMDktMDQgMjE6MzI6NTYgZXJvdWF1bHQgRXhwICQgKi8KIAogLyoKICAqIENvcHlyaWdodCAoYykgMTk4OC0xOTk3IFNhbSBMZWZmbGVyCkBAIC0yOTYsOCArMjk2LDEwIEBACiAJCWNwWzddID0gVElGRkJpdFJldlRhYmxlW2NwWzddXTsKIAkJY3AgKz0gODsKIAl9Ci0Jd2hpbGUgKG4tLSA+IDApCi0JCSpjcCA9IFRJRkZCaXRSZXZUYWJsZVsqY3BdLCBjcCsrOworCXdoaWxlIChuLS0gPiAwKSB7CisJCSpjcCA9IFRJRkZCaXRSZXZUYWJsZVsqY3BdOworCQljcCsrOworCX0KIH0KIAogLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl90aHVuZGVyLmMgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl90aHVuZGVyLmMKaW5kZXggMzkwODkxYy4uMTgzMTk5ZCAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfdGh1bmRlci5jCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3RodW5kZXIuYwpAQCAtMSw0ICsxLDQgQEAKLS8qICRJZDogdGlmX3RodW5kZXIuYyx2IDEuMTIgMjAxMS0wNC0wMiAyMDo1NDowOSBiZnJpZXNlbiBFeHAgJCAqLworLyogJElkOiB0aWZfdGh1bmRlci5jLHYgMS4xMyAyMDE2LTA5LTA0IDIxOjMyOjU2IGVyb3VhdWx0IEV4cCAkICovCiAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgpAQCAtMTAwLDcgKzEwMCw4IEBACiAJd2hpbGUgKGNjID4gMCAmJiBucGl4ZWxzIDwgbWF4cGl4ZWxzKSB7CiAJCWludCBuLCBkZWx0YTsKIAotCQluID0gKmJwKyssIGNjLS07CisJCW4gPSAqYnArKzsKKwkJY2MtLTsKIAkJc3dpdGNoIChuICYgVEhVTkRFUl9DT0RFKSB7CiAJCWNhc2UgVEhVTkRFUl9SVU46CQkvKiBwaXhlbCBydW4gKi8KIAkJCS8qCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl93cml0ZS5jIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZfd3JpdGUuYwppbmRleCA3OTk2YzMxLi40YzIxNmVjIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl93cml0ZS5jCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3dyaXRlLmMKQEAgLTEsNCArMSw0IEBACi0vKiAkSWQ6IHRpZl93cml0ZS5jLHYgMS40MiAyMDE1LTA2LTA3IDIzOjAwOjIzIGJmcmllc2VuIEV4cCAkICovCisvKiAkSWQ6IHRpZl93cml0ZS5jLHYgMS40NiAyMDE2LTEyLTAzIDIxOjU3OjQ0IGVyb3VhdWx0IEV4cCAkICovCiAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgpAQCAtMjU4LDYgKzI1OCwyMyBAQAogICAgIHRpZi0+dGlmX3Jhd2NwID0gdGlmLT50aWZfcmF3ZGF0YTsKIAogCXRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX1BPU1RFTkNPREU7CisKKyAgICAvKiBzaG9ydGN1dCB0byBhdm9pZCBhbiBleHRyYSBtZW1jcHkoKSAqLworICAgIGlmKCB0ZC0+dGRfY29tcHJlc3Npb24gPT0gQ09NUFJFU1NJT05fTk9ORSApCisgICAgeworICAgICAgICAvKiBzd2FiIGlmIG5lZWRlZCAtIG5vdGUgdGhhdCBzb3VyY2UgYnVmZmVyIHdpbGwgYmUgYWx0ZXJlZCAqLworICAgICAgICB0aWYtPnRpZl9wb3N0ZGVjb2RlKCB0aWYsICh1aW50OCopIGRhdGEsIGNjICk7CisKKyAgICAgICAgaWYgKCFpc0ZpbGxPcmRlcih0aWYsIHRkLT50ZF9maWxsb3JkZXIpICYmCisgICAgICAgICAgICAodGlmLT50aWZfZmxhZ3MgJiBUSUZGX05PQklUUkVWKSA9PSAwKQorICAgICAgICAgICAgVElGRlJldmVyc2VCaXRzKCh1aW50OCopIGRhdGEsIGNjKTsKKworICAgICAgICBpZiAoY2MgPiAwICYmCisgICAgICAgICAgICAhVElGRkFwcGVuZFRvU3RyaXAodGlmLCBzdHJpcCwgKHVpbnQ4KikgZGF0YSwgY2MpKQorICAgICAgICAgICAgcmV0dXJuICgodG1zaXplX3QpIC0xKTsKKyAgICAgICAgcmV0dXJuIChjYyk7CisgICAgfQorCiAJc2FtcGxlID0gKHVpbnQxNikoc3RyaXAgLyB0ZC0+dGRfc3RyaXBzcGVyaW1hZ2UpOwogCWlmICghKCp0aWYtPnRpZl9wcmVlbmNvZGUpKHRpZiwgc2FtcGxlKSkKIAkJcmV0dXJuICgodG1zaXplX3QpIC0xKTsKQEAgLTI2Niw3ICsyODMsNyBAQAogCXRpZi0+dGlmX3Bvc3RkZWNvZGUoIHRpZiwgKHVpbnQ4KikgZGF0YSwgY2MgKTsKIAogCWlmICghKCp0aWYtPnRpZl9lbmNvZGVzdHJpcCkodGlmLCAodWludDgqKSBkYXRhLCBjYywgc2FtcGxlKSkKLQkJcmV0dXJuICgwKTsKKwkJcmV0dXJuICgodG1zaXplX3QpIC0xKTsKIAlpZiAoISgqdGlmLT50aWZfcG9zdGVuY29kZSkodGlmKSkKIAkJcmV0dXJuICgodG1zaXplX3QpIC0xKTsKIAlpZiAoIWlzRmlsbE9yZGVyKHRpZiwgdGQtPnRkX2ZpbGxvcmRlcikgJiYKQEAgLTQzMSw5ICs0NDgsNyBAQAogCQl0aWYtPnRpZl9mbGFncyB8PSBUSUZGX0NPREVSU0VUVVA7CiAJfQogCXRpZi0+dGlmX2ZsYWdzICY9IH5USUZGX1BPU1RFTkNPREU7Ci0Jc2FtcGxlID0gKHVpbnQxNikodGlsZS90ZC0+dGRfc3RyaXBzcGVyaW1hZ2UpOwotCWlmICghKCp0aWYtPnRpZl9wcmVlbmNvZGUpKHRpZiwgc2FtcGxlKSkKLQkJcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisKIAkvKgogCSAqIENsYW1wIHdyaXRlIGFtb3VudCB0byB0aGUgdGlsZSBzaXplLiAgVGhpcyBpcyBtb3N0bHkKIAkgKiBkb25lIHNvIHRoYXQgY2FsbGVycyBjYW4gcGFzcyBpbiBzb21lIGxhcmdlIG51bWJlcgpAQCAtNDQyLDIyICs0NTcsNDEgQEAKIAlpZiAoIGNjIDwgMSB8fCBjYyA+IHRpZi0+dGlmX3RpbGVzaXplKQogCQljYyA9IHRpZi0+dGlmX3RpbGVzaXplOwogCisgICAgLyogc2hvcnRjdXQgdG8gYXZvaWQgYW4gZXh0cmEgbWVtY3B5KCkgKi8KKyAgICBpZiggdGQtPnRkX2NvbXByZXNzaW9uID09IENPTVBSRVNTSU9OX05PTkUgKQorICAgIHsKICAgICAgICAgLyogc3dhYiBpZiBuZWVkZWQgLSBub3RlIHRoYXQgc291cmNlIGJ1ZmZlciB3aWxsIGJlIGFsdGVyZWQgKi8KLQl0aWYtPnRpZl9wb3N0ZGVjb2RlKCB0aWYsICh1aW50OCopIGRhdGEsIGNjICk7CisgICAgICAgIHRpZi0+dGlmX3Bvc3RkZWNvZGUoIHRpZiwgKHVpbnQ4KikgZGF0YSwgY2MgKTsKIAotCWlmICghKCp0aWYtPnRpZl9lbmNvZGV0aWxlKSh0aWYsICh1aW50OCopIGRhdGEsIGNjLCBzYW1wbGUpKQotCQlyZXR1cm4gKDApOwotCWlmICghKCp0aWYtPnRpZl9wb3N0ZW5jb2RlKSh0aWYpKQotCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKLQlpZiAoIWlzRmlsbE9yZGVyKHRpZiwgdGQtPnRkX2ZpbGxvcmRlcikgJiYKLQkgICAgKHRpZi0+dGlmX2ZsYWdzICYgVElGRl9OT0JJVFJFVikgPT0gMCkKLQkJVElGRlJldmVyc2VCaXRzKCh1aW50OCopdGlmLT50aWZfcmF3ZGF0YSwgdGlmLT50aWZfcmF3Y2MpOwotCWlmICh0aWYtPnRpZl9yYXdjYyA+IDAgJiYgIVRJRkZBcHBlbmRUb1N0cmlwKHRpZiwgdGlsZSwKLQkgICAgdGlmLT50aWZfcmF3ZGF0YSwgdGlmLT50aWZfcmF3Y2MpKQotCQlyZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKLQl0aWYtPnRpZl9yYXdjYyA9IDA7Ci0JdGlmLT50aWZfcmF3Y3AgPSB0aWYtPnRpZl9yYXdkYXRhOwotCXJldHVybiAoY2MpOworICAgICAgICBpZiAoIWlzRmlsbE9yZGVyKHRpZiwgdGQtPnRkX2ZpbGxvcmRlcikgJiYKKyAgICAgICAgICAgICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfTk9CSVRSRVYpID09IDApCisgICAgICAgICAgICBUSUZGUmV2ZXJzZUJpdHMoKHVpbnQ4KikgZGF0YSwgY2MpOworCisgICAgICAgIGlmIChjYyA+IDAgJiYKKyAgICAgICAgICAgICFUSUZGQXBwZW5kVG9TdHJpcCh0aWYsIHRpbGUsICh1aW50OCopIGRhdGEsIGNjKSkKKyAgICAgICAgICAgIHJldHVybiAoKHRtc2l6ZV90KSAtMSk7CisgICAgICAgIHJldHVybiAoY2MpOworICAgIH0KKworICAgIHNhbXBsZSA9ICh1aW50MTYpKHRpbGUvdGQtPnRkX3N0cmlwc3BlcmltYWdlKTsKKyAgICBpZiAoISgqdGlmLT50aWZfcHJlZW5jb2RlKSh0aWYsIHNhbXBsZSkpCisgICAgICAgIHJldHVybiAoKHRtc2l6ZV90KSgtMSkpOworICAgIC8qIHN3YWIgaWYgbmVlZGVkIC0gbm90ZSB0aGF0IHNvdXJjZSBidWZmZXIgd2lsbCBiZSBhbHRlcmVkICovCisgICAgdGlmLT50aWZfcG9zdGRlY29kZSggdGlmLCAodWludDgqKSBkYXRhLCBjYyApOworCisgICAgaWYgKCEoKnRpZi0+dGlmX2VuY29kZXRpbGUpKHRpZiwgKHVpbnQ4KikgZGF0YSwgY2MsIHNhbXBsZSkpCisgICAgICAgICAgICByZXR1cm4gKCh0bXNpemVfdCkgLTEpOworICAgIGlmICghKCp0aWYtPnRpZl9wb3N0ZW5jb2RlKSh0aWYpKQorICAgICAgICAgICAgcmV0dXJuICgodG1zaXplX3QpKC0xKSk7CisgICAgaWYgKCFpc0ZpbGxPcmRlcih0aWYsIHRkLT50ZF9maWxsb3JkZXIpICYmCisgICAgICAgICh0aWYtPnRpZl9mbGFncyAmIFRJRkZfTk9CSVRSRVYpID09IDApCisgICAgICAgICAgICBUSUZGUmV2ZXJzZUJpdHMoKHVpbnQ4Kil0aWYtPnRpZl9yYXdkYXRhLCB0aWYtPnRpZl9yYXdjYyk7CisgICAgaWYgKHRpZi0+dGlmX3Jhd2NjID4gMCAmJiAhVElGRkFwcGVuZFRvU3RyaXAodGlmLCB0aWxlLAorICAgICAgICB0aWYtPnRpZl9yYXdkYXRhLCB0aWYtPnRpZl9yYXdjYykpCisgICAgICAgICAgICByZXR1cm4gKCh0bXNpemVfdCkoLTEpKTsKKyAgICB0aWYtPnRpZl9yYXdjYyA9IDA7CisgICAgdGlmLT50aWZfcmF3Y3AgPSB0aWYtPnRpZl9yYXdkYXRhOworICAgIHJldHVybiAoY2MpOwogfQogCiAvKgpAQCAtNzY0LDcgKzc5OCwxNCBAQAogCQlpZiAoIVRJRkZBcHBlbmRUb1N0cmlwKHRpZiwKIAkJICAgIGlzVGlsZWQodGlmKSA/IHRpZi0+dGlmX2N1cnRpbGUgOiB0aWYtPnRpZl9jdXJzdHJpcCwKIAkJICAgIHRpZi0+dGlmX3Jhd2RhdGEsIHRpZi0+dGlmX3Jhd2NjKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogV2UgdXBkYXRlIHRob3NlIHZhcmlhYmxlcyBldmVuIGluIGNhc2Ugb2YgZXJyb3Igc2luY2UgdGhlcmUncyAqLworICAgICAgICAgICAgLyogY29kZSB0aGF0IGRvZXNuJ3QgcmVhbGx5IGNoZWNrIHRoZSByZXR1cm4gY29kZSBvZiB0aGlzICovCisgICAgICAgICAgICAvKiBmdW5jdGlvbiAqLworICAgICAgICAgICAgdGlmLT50aWZfcmF3Y2MgPSAwOworICAgICAgICAgICAgdGlmLT50aWZfcmF3Y3AgPSB0aWYtPnRpZl9yYXdkYXRhOwogCQkJcmV0dXJuICgwKTsKKyAgICAgICAgfQogCQl0aWYtPnRpZl9yYXdjYyA9IDA7CiAJCXRpZi0+dGlmX3Jhd2NwID0gdGlmLT50aWZfcmF3ZGF0YTsKIAl9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZl96aXAuYyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3ppcC5jCmluZGV4IGIzYWM5YjkuLjQyOTQzZmIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3ppcC5jCisrKyBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmX3ppcC5jCkBAIC0xLDQgKzEsNCBAQAotLyogJElkOiB0aWZfemlwLmMsdiAxLjMzIDIwMTQtMTItMjUgMTg6Mjk6MTEgZXJvdWF1bHQgRXhwICQgKi8KKy8qICRJZDogdGlmX3ppcC5jLHYgMS4zNyAyMDE3LTA1LTEwIDE1OjIxOjE2IGVyb3VhdWx0IEV4cCAkICovCiAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDE5OTUtMTk5NyBTYW0gTGVmZmxlcgpAQCAtNDcsNyArNDcsNyBAQAogICogbGFzdCBmb3VuZCBhdCBmdHA6Ly9mdHAudXUubmV0L3B1Yi9hcmNoaXZpbmcvemlwL3psaWIvemxpYi0wLjk5LnRhci5nei4KICAqLwogI2luY2x1ZGUgInRpZl9wcmVkaWN0LmgiCi0jaW5jbHVkZSAiLi4vemxpYl92MTI4L3psaWIuaCIKKyNpbmNsdWRlICJ6bGliLmgiCiAKICNpbmNsdWRlIDxzdGRpby5oPgogCkBAIC0xMDcsNyArMTA3LDExIEBACiAJICAgIHNwLT5zdGF0ZSA9IDA7CiAJfQogCi0JaWYgKGluZmxhdGVJbml0KCZzcC0+c3RyZWFtKSAhPSBaX09LKSB7CisJLyogVGhpcyBmdW5jdGlvbiBjYW4gcG9zc2libHkgYmUgY2FsbGVkIHNldmVyYWwgdGltZXMgYnkgKi8KKwkvKiBQcmVkaWN0b3JTZXR1cERlY29kZSgpIGlmIHRoaXMgZnVuY3Rpb24gc3VjY2VlZHMgYnV0ICovCisJLyogUHJlZGljdG9yU2V0dXAoKSBmYWlscyAqLworCWlmICgoc3AtPnN0YXRlICYgWlNUQVRFX0lOSVRfREVDT0RFKSA9PSAwICYmCisJICAgIGluZmxhdGVJbml0KCZzcC0+c3RyZWFtKSAhPSBaX09LKSB7CiAJCVRJRkZFcnJvckV4dCh0aWYtPnRpZl9jbGllbnRkYXRhLCBtb2R1bGUsICIlcyIsIFNBRkVfTVNHKHNwKSk7CiAJCXJldHVybiAoMCk7CiAJfSBlbHNlIHsKQEAgLTEzNSw3ICsxMzksNyBAQAogCWFzc2VydChzaXplb2Yoc3AtPnN0cmVhbS5hdmFpbF9pbik9PTQpOyAgLyogaWYgdGhpcyBhc3NlcnQgZ2V0cyByYWlzZWQsCiAJICAgIHdlIG5lZWQgdG8gc2ltcGxpZnkgdGhpcyBjb2RlIHRvIHJlZmxlY3QgYSBaTGliIHRoYXQgaXMgbGlrZWx5IHVwZGF0ZWQKIAkgICAgdG8gZGVhbCB3aXRoIDhieXRlIG1lbW9yeSBzaXplcywgdGhvdWdoIHRoaXMgY29kZSB3aWxsIHJlc3BvbmQKLQkgICAgYXByb3ByaWF0ZWx5IGV2ZW4gYmVmb3JlIHdlIHNpbXBsaWZ5IGl0ICovCisJICAgIGFwcHJvcHJpYXRlbHkgZXZlbiBiZWZvcmUgd2Ugc2ltcGxpZnkgaXQgKi8KIAlzcC0+c3RyZWFtLmF2YWlsX2luID0gKHVJbnQpIHRpZi0+dGlmX3Jhd2NjOwogCWlmICgodG1zaXplX3Qpc3AtPnN0cmVhbS5hdmFpbF9pbiAhPSB0aWYtPnRpZl9yYXdjYykKIAl7CkBAIC0xNjIsNyArMTY2LDcgQEAKIAlhc3NlcnQoc2l6ZW9mKHNwLT5zdHJlYW0uYXZhaWxfb3V0KT09NCk7ICAvKiBpZiB0aGlzIGFzc2VydCBnZXRzIHJhaXNlZCwKIAkgICAgd2UgbmVlZCB0byBzaW1wbGlmeSB0aGlzIGNvZGUgdG8gcmVmbGVjdCBhIFpMaWIgdGhhdCBpcyBsaWtlbHkgdXBkYXRlZAogCSAgICB0byBkZWFsIHdpdGggOGJ5dGUgbWVtb3J5IHNpemVzLCB0aG91Z2ggdGhpcyBjb2RlIHdpbGwgcmVzcG9uZAotCSAgICBhcHJvcHJpYXRlbHkgZXZlbiBiZWZvcmUgd2Ugc2ltcGxpZnkgaXQgKi8KKwkgICAgYXBwcm9wcmlhdGVseSBldmVuIGJlZm9yZSB3ZSBzaW1wbGlmeSBpdCAqLwogCXNwLT5zdHJlYW0uYXZhaWxfb3V0ID0gKHVJbnQpIG9jYzsKIAlpZiAoKHRtc2l6ZV90KXNwLT5zdHJlYW0uYXZhaWxfb3V0ICE9IG9jYykKIAl7CkBAIC0yMzksOCArMjQzLDggQEAKIAlhc3NlcnQoc2l6ZW9mKHNwLT5zdHJlYW0uYXZhaWxfb3V0KT09NCk7ICAvKiBpZiB0aGlzIGFzc2VydCBnZXRzIHJhaXNlZCwKIAkgICAgd2UgbmVlZCB0byBzaW1wbGlmeSB0aGlzIGNvZGUgdG8gcmVmbGVjdCBhIFpMaWIgdGhhdCBpcyBsaWtlbHkgdXBkYXRlZAogCSAgICB0byBkZWFsIHdpdGggOGJ5dGUgbWVtb3J5IHNpemVzLCB0aG91Z2ggdGhpcyBjb2RlIHdpbGwgcmVzcG9uZAotCSAgICBhcHJvcHJpYXRlbHkgZXZlbiBiZWZvcmUgd2Ugc2ltcGxpZnkgaXQgKi8KLQlzcC0+c3RyZWFtLmF2YWlsX291dCA9IHRpZi0+dGlmX3Jhd2RhdGFzaXplOworCSAgICBhcHByb3ByaWF0ZWx5IGV2ZW4gYmVmb3JlIHdlIHNpbXBsaWZ5IGl0ICovCisJc3AtPnN0cmVhbS5hdmFpbF9vdXQgPSAodUludCl0aWYtPnRpZl9yYXdkYXRhc2l6ZTsKIAlpZiAoKHRtc2l6ZV90KXNwLT5zdHJlYW0uYXZhaWxfb3V0ICE9IHRpZi0+dGlmX3Jhd2RhdGFzaXplKQogCXsKIAkJVElGRkVycm9yRXh0KHRpZi0+dGlmX2NsaWVudGRhdGEsIG1vZHVsZSwgIlpMaWIgY2Fubm90IGRlYWwgd2l0aCBidWZmZXJzIHRoaXMgc2l6ZSIpOwpAQCAtMjY2LDcgKzI3MCw3IEBACiAJYXNzZXJ0KHNpemVvZihzcC0+c3RyZWFtLmF2YWlsX2luKT09NCk7ICAvKiBpZiB0aGlzIGFzc2VydCBnZXRzIHJhaXNlZCwKIAkgICAgd2UgbmVlZCB0byBzaW1wbGlmeSB0aGlzIGNvZGUgdG8gcmVmbGVjdCBhIFpMaWIgdGhhdCBpcyBsaWtlbHkgdXBkYXRlZAogCSAgICB0byBkZWFsIHdpdGggOGJ5dGUgbWVtb3J5IHNpemVzLCB0aG91Z2ggdGhpcyBjb2RlIHdpbGwgcmVzcG9uZAotCSAgICBhcHJvcHJpYXRlbHkgZXZlbiBiZWZvcmUgd2Ugc2ltcGxpZnkgaXQgKi8KKwkgICAgYXBwcm9wcmlhdGVseSBldmVuIGJlZm9yZSB3ZSBzaW1wbGlmeSBpdCAqLwogCXNwLT5zdHJlYW0uYXZhaWxfaW4gPSAodUludCkgY2M7CiAJaWYgKCh0bXNpemVfdClzcC0+c3RyZWFtLmF2YWlsX2luICE9IGNjKQogCXsKQEAgLTQ2MCw3ICs0NjQsNyBAQAogCQkgICAgICJObyBzcGFjZSBmb3IgWklQIHN0YXRlIGJsb2NrIik7CiAJcmV0dXJuICgwKTsKIH0KLSNlbmRpZiAvKiBaSVBfU1VQT1JUICovCisjZW5kaWYgLyogWklQX1NVUFBPUlQgKi8KIAogLyogdmltOiBzZXQgdHM9OCBzdHM9OCBzdz04IG5vZXQ6ICovCiAvKgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZmLmggYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmYuaAppbmRleCBiYzQ2YWNkLi5mYjM5NjM0IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmYuaAorKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmYuaApAQCAtMSw0ICsxLDQgQEAKLS8qICRJZDogdGlmZi5oLHYgMS42OSAyMDE0LTA0LTAyIDE3OjIzOjA2IGZ3YXJtZXJkYW0gRXhwICQgKi8KKy8qICRJZDogdGlmZi5oLHYgMS43MCAyMDE2LTAxLTIzIDIxOjIwOjM0IGVyb3VhdWx0IEV4cCAkICovCiAKIC8qCiAgKiBDb3B5cmlnaHQgKGMpIDE5ODgtMTk5NyBTYW0gTGVmZmxlcgpAQCAtMjc5LDcgKzI3OSw3IEBACiAjZGVmaW5lICAgICBQUkVESUNUT1JfRkxPQVRJTkdQT0lOVAkzCS8qIGZsb2F0aW5nIHBvaW50IHByZWRpY3RvciAqLwogI2RlZmluZQlUSUZGVEFHX1dISVRFUE9JTlQJCTMxOAkvKiBpbWFnZSB3aGl0ZSBwb2ludCAqLwogI2RlZmluZQlUSUZGVEFHX1BSSU1BUllDSFJPTUFUSUNJVElFUwkzMTkJLyogIXByaW1hcnkgY2hyb21hdGljaXRpZXMgKi8KLSNkZWZpbmUJVElGRlRBR19DT0xPUk1BUAkJMzIwCS8qIFJHQiBtYXAgZm9yIHBhbGxldHRlIGltYWdlICovCisjZGVmaW5lCVRJRkZUQUdfQ09MT1JNQVAJCTMyMAkvKiBSR0IgbWFwIGZvciBwYWxldHRlIGltYWdlICovCiAjZGVmaW5lCVRJRkZUQUdfSEFMRlRPTkVISU5UUwkJMzIxCS8qICFoaWdobGlnaHQrc2hhZG93IGluZm8gKi8KICNkZWZpbmUJVElGRlRBR19USUxFV0lEVEgJCTMyMgkvKiAhdGlsZSB3aWR0aCBpbiBwaXhlbHMgKi8KICNkZWZpbmUJVElGRlRBR19USUxFTEVOR1RICQkzMjMJLyogIXRpbGUgaGVpZ2h0IGluIHBpeGVscyAqLwpAQCAtMzU4LDcgKzM1OCw3IEBACiAjZGVmaW5lCVRJRkZUQUdfSlBFR1JFU1RBUlRJTlRFUlZBTAk1MTUJLyogIXJlc3RhcnQgaW50ZXJ2YWwgbGVuZ3RoICovCiAjZGVmaW5lCVRJRkZUQUdfSlBFR0xPU1NMRVNTUFJFRElDVE9SUwk1MTcJLyogIWxvc3NsZXNzIHByb2MgcHJlZGljdG9yICovCiAjZGVmaW5lCVRJRkZUQUdfSlBFR1BPSU5UVFJBTlNGT1JNCTUxOAkvKiAhbG9zc2xlc3MgcG9pbnQgdHJhbnNmb3JtICovCi0jZGVmaW5lCVRJRkZUQUdfSlBFR1FUQUJMRVMJCTUxOQkvKiAhUSBtYXRyaWNlIG9mZnNldHMgKi8KKyNkZWZpbmUJVElGRlRBR19KUEVHUVRBQkxFUwkJNTE5CS8qICFRIG1hdHJpeCBvZmZzZXRzICovCiAjZGVmaW5lCVRJRkZUQUdfSlBFR0RDVEFCTEVTCQk1MjAJLyogIURDVCB0YWJsZSBvZmZzZXRzICovCiAjZGVmaW5lCVRJRkZUQUdfSlBFR0FDVEFCTEVTCQk1MjEJLyogIUFDIGNvZWZmaWNpZW50IG9mZnNldHMgKi8KICNkZWZpbmUJVElGRlRBR19ZQ0JDUkNPRUZGSUNJRU5UUwk1MjkJLyogIVJHQiAtPiBZQ2JDciB0cmFuc2Zvcm0gKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmZmNvbmYuaCBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmZmNvbmYuaAppbmRleCAyNmRlMTYzLi41MGU0NThmIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmZjb25mLmgKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZmY29uZi5oCkBAIC0xMiwxOCArMTIsOCBAQAogLy9OT1RFOiBUaGUgdGlmZiBjb2RlYyByZXF1aXJlcyBhbiBBTlNJIEMgY29tcGlsZXIgZW52aXJvbm1lbnQgZm9yIGJ1aWxkaW5nIGFuZCAKIC8vCQlwcmVzdW1lcyBhbiBBTlNJIEMgZW52aXJvbm1lbnQgZm9yIHVzZS4KIAotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gKi8KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwotI2lmIF9GWF9PU18gPT0gX0ZYX1dJTjMyX01PQklMRV8KLSMgZGVmaW5lIE9fUkRPTkxZICAgICAgIDB4MDAwMCAgLyogb3BlbiBmb3IgcmVhZGluZyBvbmx5ICovCi0jIGRlZmluZSBPX1dST05MWSAgICAgICAweDAwMDEgIC8qIG9wZW4gZm9yIHdyaXRpbmcgb25seSAqLwotIyBkZWZpbmUgT19SRFdSICAgICAgICAgMHgwMDAyICAvKiBvcGVuIGZvciByZWFkaW5nIGFuZCB3cml0aW5nICovCi0jIGRlZmluZSBPX0NSRUFUICAgICAgICAweDAxMDAgIC8qIGNyZWF0ZSBhbmQgb3BlbiBmaWxlICovCi0jIGRlZmluZSBPX1RSVU5DICAgICAgICAweDAyMDAgIC8qIG9wZW4gYW5kIHRydW5jYXRlICovCi0jZWxzZQogIyBkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCiAjIGRlZmluZSBIQVZFX0ZDTlRMX0ggMQotI2VuZGlmCiAKIC8qIENvbXBhdGliaWxpdHkgc3R1ZmYuICovCiAKQEAgLTM5LDI2ICsyOSwzMyBAQAogLy9meF9zeXN0ZW0uaCBhbHJlYWR5IGluY2x1ZGUgdGhlIHN0cmluZy5oIGluIEFOU0lDCiAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2VhcmNoLmg+IGhlYWRlciBmaWxlLiAqLwotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18gJiYgX01TQ19WRVIgPj0gMTkwMAorI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfICYmIF9NU0NfVkVSID49IDE5MDAKIC8vIHNlYXJjaC5oIGlzIGFsd2F5cyBhdmFpbGFibGUgaW4gVlMgMjAxNSBhbmQgYWJvdmUsIGFuZCBtYXkgYmUKIC8vIGF2YWlsYWJsZSBpbiBlYXJsaWVyIHZlcnNpb25zLgogI2RlZmluZSBIQVZFX1NFQVJDSF9IIDEKICNlbmRpZgogCi0vKiBUaGUgc2l6ZSBvZiBhIGBpbnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCi0vKiBBY2NvcmRpbmcgdHlwZWRlZiBpbnQJaW50MzJfdDsgaW4gdGhlIGZ4X3N5c3RlbS5oKi8KKy8qIFRoZSBzaXplIG9mIGEgYGludCcuICovCisvKiBBY2NvcmRpbmcgdHlwZWRlZiBpbnQgIGludDMyX3Q7IGluIHRoZSBmeF9zeXN0ZW0uaCovCiAjZGVmaW5lIFNJWkVPRl9JTlQgNAogCiAvKiBTdW5saWFuZy5MaXUgMjAxMTAzMjUuIFdlIHNob3VsZCBjb25maWcgdGhlIGNvcnJlY3QgbG9uZyBzaXplIGZvciB0aWYgCiAgICBmYXg0ZGVjb2RlIG9wdGltaXplIGluIHRpZl9mYXgzLmMgIC0tIExpbnV4NjQgZGVjb2RlIGlzc3VlLiAKICAgIFRFU1RET0M6IEJ1ZyAjMjM2NjEgLSB6MS50aWYuICovCi0jaWYgX0ZYX0NQVV8gPT0gX0ZYX1dJTjY0XyB8fCBfRlhfQ1BVXyA9PSBfRlhfWDY0XyB8fCBfRlhfQ1BVXyA9PSBfRlhfSUE2NF8KKyNpZiBfRlhfQ1BVXyA9PSBfRlhfWDY0XyB8fCBfRlhfQ1BVXyA9PSBfRlhfSUE2NF8KIC8qIFRoZSBzaXplIG9mIGB1bnNpZ25lZCBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLwogI2RlZmluZSBTSVpFT0ZfVU5TSUdORURfTE9ORyA4CiAjZWxzZQogI2RlZmluZSBTSVpFT0ZfVU5TSUdORURfTE9ORyA0CiAjZW5kaWYKIAorLyogVGhlIHNpemUgb2Ygdm9pZCouICovCisjaWZkZWYgX19MUDY0X18KKyNkZWZpbmUgU0laRU9GX1ZPSURQIDgKKyNlbHNlCisjZGVmaW5lIFNJWkVPRl9WT0lEUCA0CisjZW5kaWYKKwogLyogU2lnbmVkIDgtYml0IHR5cGUgKi8KICNkZWZpbmUgVElGRl9JTlQ4X1Qgc2lnbmVkIGNoYXIKIApkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZmaW8uaCBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmZmlvLmgKaW5kZXggMDU2YWVkMi4uZjFkMmZkYyAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZmaW8uaAorKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmZpby5oCkBAIC0xLDQgKzEsNCBAQAotLyogJElkOiB0aWZmaW8uaCx2IDEuOTEgMjAxMi0wNy0yOSAxNTo0NToyOSB0Z2wgRXhwICQgKi8KKy8qICRJZDogdGlmZmlvLmgsdiAxLjk0IDIwMTctMDEtMTEgMTk6MDI6NDkgZXJvdWF1bHQgRXhwICQgKi8KIAogLyoKICAqIENvcHlyaWdodCAoYykgMTk4OC0xOTk3IFNhbSBMZWZmbGVyCkBAIC0yMDgsNyArMjA4LDcgQEAKIAl1aW50MTYgb3JpZW50YXRpb247ICAgICAgICAgICAgICAgICAgICAgLyogaW1hZ2Ugb3JpZW50YXRpb24gKi8KIAl1aW50MTYgcmVxX29yaWVudGF0aW9uOyAgICAgICAgICAgICAgICAgLyogcmVxdWVzdGVkIG9yaWVudGF0aW9uICovCiAJdWludDE2IHBob3RvbWV0cmljOyAgICAgICAgICAgICAgICAgICAgIC8qIGltYWdlIHBob3RvbWV0cmljIGludGVycCAqLwotCXVpbnQxNiogcmVkY21hcDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb2xvcm1hcCBwYWxsZXRlICovCisJdWludDE2KiByZWRjbWFwOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbG9ybWFwIHBhbGV0dGUgKi8KIAl1aW50MTYqIGdyZWVuY21hcDsKIAl1aW50MTYqIGJsdWVjbWFwOwogCS8qIGdldCBpbWFnZSBkYXRhIHJvdXRpbmUgKi8KQEAgLTIyNSw3ICsyMjUsNyBAQAogCVRJRkZZQ2JDclRvUkdCKiB5Y2JjcjsgICAgICAgICAgICAgICAgICAvKiBZQ2JDciBjb252ZXJzaW9uIHN0YXRlICovCiAJVElGRkNJRUxhYlRvUkdCKiBjaWVsYWI7ICAgICAgICAgICAgICAgIC8qIENJRSBMKmEqYiBjb252ZXJzaW9uIHN0YXRlICovCiAKLQl1aW50OCogVWFUb0FhOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVW5hc3NvY2lhdGVkIGFscGhhIHRvIGFzc29jaWF0ZWQgYWxwaGEgY29udmVydGlvbiBMVVQgKi8KKwl1aW50OCogVWFUb0FhOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVW5hc3NvY2lhdGVkIGFscGhhIHRvIGFzc29jaWF0ZWQgYWxwaGEgY29udmVyc2lvbiBMVVQgKi8KIAl1aW50OCogQml0ZGVwdGgxNlRvODsgICAgICAgICAgICAgICAgICAgLyogTFVUIGZvciBjb252ZXJzaW9uIGZyb20gMTZiaXQgdG8gOGJpdCB2YWx1ZXMgKi8KIAogCWludCByb3dfb2Zmc2V0OwpAQCAtMjkzLDYgKzI5Myw3IEBACiAgKi8KIAogZXh0ZXJuIHZvaWQqIF9USUZGbWFsbG9jKHRtc2l6ZV90IHMpOworZXh0ZXJuIHZvaWQqIF9USUZGY2FsbG9jKHRtc2l6ZV90IG5tZW1iLCB0bXNpemVfdCBzaXopOwogZXh0ZXJuIHZvaWQqIF9USUZGcmVhbGxvYyh2b2lkKiBwLCB0bXNpemVfdCBzKTsKIGV4dGVybiB2b2lkIF9USUZGbWVtc2V0KHZvaWQqIHAsIGludCB2LCB0bXNpemVfdCBjKTsKIGV4dGVybiB2b2lkIF9USUZGbWVtY3B5KHZvaWQqIGQsIGNvbnN0IHZvaWQqIHMsIHRtc2l6ZV90IGMpOwpAQCAtNDMxLDYgKzQzMiw4IEBACiAKIGV4dGVybiBpbnQgVElGRlJlYWRSR0JBU3RyaXAoVElGRiosIHVpbnQzMiwgdWludDMyICogKTsKIGV4dGVybiBpbnQgVElGRlJlYWRSR0JBVGlsZShUSUZGKiwgdWludDMyLCB1aW50MzIsIHVpbnQzMiAqICk7CitleHRlcm4gaW50IFRJRkZSZWFkUkdCQVN0cmlwRXh0KFRJRkYqLCB1aW50MzIsIHVpbnQzMiAqLCBpbnQgc3RvcF9vbl9lcnJvciApOworZXh0ZXJuIGludCBUSUZGUmVhZFJHQkFUaWxlRXh0KFRJRkYqLCB1aW50MzIsIHVpbnQzMiwgdWludDMyICosIGludCBzdG9wX29uX2Vycm9yICk7CiBleHRlcm4gaW50IFRJRkZSR0JBSW1hZ2VPSyhUSUZGKiwgY2hhciBbMTAyNF0pOwogZXh0ZXJuIGludCBUSUZGUkdCQUltYWdlQmVnaW4oVElGRlJHQkFJbWFnZSosIFRJRkYqLCBpbnQsIGNoYXIgWzEwMjRdKTsKIGV4dGVybiBpbnQgVElGRlJHQkFJbWFnZUdldChUSUZGUkdCQUltYWdlKiwgdWludDMyKiwgdWludDMyLCB1aW50MzIpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvbGlidGlmZi90aWZmaW9wLmggYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmZpb3AuaAppbmRleCBmNGIyZWE0Li42ZmI0N2RlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmZpb3AuaAorKysgYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmZpb3AuaApAQCAtMSw0ICsxLDQgQEAKLS8qICRJZDogdGlmZmlvcC5oLHYgMS44NyAyMDE1LTA4LTIzIDE3OjQ5OjAxIGJmcmllc2VuIEV4cCAkICovCisvKiAkSWQ6IHRpZmZpb3AuaCx2IDEuOTAgMjAxNi0xMi0wMiAyMTo1Njo1NiBlcm91YXVsdCBFeHAgJCAqLwogCiAvKgogICogQ29weXJpZ2h0IChjKSAxOTg4LTE5OTcgU2FtIExlZmZsZXIKQEAgLTg1LDcgKzg1LDcgQEAKIAogLyoKICAqIFR5cGVkZWZzIGZvciBgYG1ldGhvZCBwb2ludGVycycnIHVzZWQgaW50ZXJuYWxseS4KLSAqIHRoZXNlIGFyZSBkZXByaWNpYXRlZCBhbmQgcHJvdmlkZWQgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAqIHRoZXNlIGFyZSBkZXByZWNhdGVkIGFuZCBwcm92aWRlZCBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAqLwogdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHRpZGF0YXZhbF90OyAgICAvKiBpbnRlcm5hbCBpbWFnZSBkYXRhIHZhbHVlIHR5cGUgKi8KIHR5cGVkZWYgdGlkYXRhdmFsX3QqIHRpZGF0YV90OyAgICAgICAgLyogcmVmZXJlbmNlIHRvIGludGVybmFsIGltYWdlIGRhdGEgKi8KQEAgLTEwNCwzMyArMTA0LDMzIEBACiAJaW50ICAgICAgICAgICAgICAgICAgdGlmX2ZkOyAgICAgICAgICAgLyogb3BlbiBmaWxlIGRlc2NyaXB0b3IgKi8KIAlpbnQgICAgICAgICAgICAgICAgICB0aWZfbW9kZTsgICAgICAgICAvKiBvcGVuIG1vZGUgKE9fKikgKi8KIAl1aW50MzIgICAgICAgICAgICAgICB0aWZfZmxhZ3M7Ci0JI2RlZmluZSBUSUZGX0ZJTExPUkRFUiAgIDB4MDAwMDMgLyogbmF0dXJhbCBiaXQgZmlsbCBvcmRlciBmb3IgbWFjaGluZSAqLwotCSNkZWZpbmUgVElGRl9ESVJUWUhFQURFUiAweDAwMDA0IC8qIGhlYWRlciBtdXN0IGJlIHdyaXR0ZW4gb24gY2xvc2UgKi8KLQkjZGVmaW5lIFRJRkZfRElSVFlESVJFQ1QgMHgwMDAwOCAvKiBjdXJyZW50IGRpcmVjdG9yeSBtdXN0IGJlIHdyaXR0ZW4gKi8KLQkjZGVmaW5lIFRJRkZfQlVGRkVSU0VUVVAgMHgwMDAxMCAvKiBkYXRhIGJ1ZmZlcnMgc2V0dXAgKi8KLQkjZGVmaW5lIFRJRkZfQ09ERVJTRVRVUCAgMHgwMDAyMCAvKiBlbmNvZGVyL2RlY29kZXIgc2V0dXAgZG9uZSAqLwotCSNkZWZpbmUgVElGRl9CRUVOV1JJVElORyAweDAwMDQwIC8qIHdyaXR0ZW4gMSsgc2NhbmxpbmVzIHRvIGZpbGUgKi8KLQkjZGVmaW5lIFRJRkZfU1dBQiAgICAgICAgMHgwMDA4MCAvKiBieXRlIHN3YXAgZmlsZSBpbmZvcm1hdGlvbiAqLwotCSNkZWZpbmUgVElGRl9OT0JJVFJFViAgICAweDAwMTAwIC8qIGluaGliaXQgYml0IHJldmVyc2FsIGxvZ2ljICovCi0JI2RlZmluZSBUSUZGX01ZQlVGRkVSICAgIDB4MDAyMDAgLyogbXkgcmF3IGRhdGEgYnVmZmVyOyBmcmVlIG9uIGNsb3NlICovCi0JI2RlZmluZSBUSUZGX0lTVElMRUQgICAgIDB4MDA0MDAgLyogZmlsZSBpcyB0aWxlLCBub3Qgc3RyaXAtIGJhc2VkICovCi0JI2RlZmluZSBUSUZGX01BUFBFRCAgICAgIDB4MDA4MDAgLyogZmlsZSBpcyBtYXBwZWQgaW50byBtZW1vcnkgKi8KLQkjZGVmaW5lIFRJRkZfUE9TVEVOQ09ERSAgMHgwMTAwMCAvKiBuZWVkIGNhbGwgdG8gcG9zdGVuY29kZSByb3V0aW5lICovCi0JI2RlZmluZSBUSUZGX0lOU1VCSUZEICAgIDB4MDIwMDAgLyogY3VycmVudGx5IHdyaXRpbmcgYSBzdWJpZmQgKi8KLQkjZGVmaW5lIFRJRkZfVVBTQU1QTEVEICAgMHgwNDAwMCAvKiBsaWJyYXJ5IGlzIGRvaW5nIGRhdGEgdXAtc2FtcGxpbmcgKi8KLQkjZGVmaW5lIFRJRkZfU1RSSVBDSE9QICAgMHgwODAwMCAvKiBlbmFibGUgc3RyaXAgY2hvcHBpbmcgc3VwcG9ydCAqLwotCSNkZWZpbmUgVElGRl9IRUFERVJPTkxZICAweDEwMDAwIC8qIHJlYWQgaGVhZGVyIG9ubHksIGRvIG5vdCBwcm9jZXNzIHRoZSBmaXJzdCBkaXJlY3RvcnkgKi8KLQkjZGVmaW5lIFRJRkZfTk9SRUFEUkFXICAgMHgyMDAwMCAvKiBza2lwIHJlYWRpbmcgb2YgcmF3IHVuY29tcHJlc3NlZCBpbWFnZSBkYXRhICovCi0JI2RlZmluZSBUSUZGX0lOQ1VTVE9NSUZEIDB4NDAwMDAgLyogY3VycmVudGx5IHdyaXRpbmcgYSBjdXN0b20gSUZEICovCi0JI2RlZmluZSBUSUZGX0JJR1RJRkYgICAgIDB4ODAwMDAgLyogcmVhZC93cml0ZSBiaWd0aWZmICovCi0gICAgICAgICNkZWZpbmUgVElGRl9CVUY0V1JJVEUgIDB4MTAwMDAwIC8qIHJhd2NjIGJ5dGVzIGFyZSBmb3Igd3JpdGluZyAqLwotICAgICAgICAjZGVmaW5lIFRJRkZfRElSVFlTVFJJUCAweDIwMDAwMCAvKiBzdHJpcG9mZnNldHMvc3RyaXBieXRlY291bnQgZGlydHkqLwotICAgICAgICAjZGVmaW5lIFRJRkZfUEVSU0FNUExFICAweDQwMDAwMCAvKiBnZXQvc2V0IHBlciBzYW1wbGUgdGFncyBhcyBhcnJheXMgKi8KLSAgICAgICAgI2RlZmluZSBUSUZGX0JVRkZFUk1NQVAgMHg4MDAwMDAgLyogcmVhZCBidWZmZXIgKHRpZl9yYXdkYXRhKSBwb2ludHMgaW50byBtbWFwKCkgbWVtb3J5ICovCisJI2RlZmluZSBUSUZGX0ZJTExPUkRFUiAgIDB4MDAwMDNVIC8qIG5hdHVyYWwgYml0IGZpbGwgb3JkZXIgZm9yIG1hY2hpbmUgKi8KKwkjZGVmaW5lIFRJRkZfRElSVFlIRUFERVIgMHgwMDAwNFUgLyogaGVhZGVyIG11c3QgYmUgd3JpdHRlbiBvbiBjbG9zZSAqLworCSNkZWZpbmUgVElGRl9ESVJUWURJUkVDVCAweDAwMDA4VSAvKiBjdXJyZW50IGRpcmVjdG9yeSBtdXN0IGJlIHdyaXR0ZW4gKi8KKwkjZGVmaW5lIFRJRkZfQlVGRkVSU0VUVVAgMHgwMDAxMFUgLyogZGF0YSBidWZmZXJzIHNldHVwICovCisJI2RlZmluZSBUSUZGX0NPREVSU0VUVVAgIDB4MDAwMjBVIC8qIGVuY29kZXIvZGVjb2RlciBzZXR1cCBkb25lICovCisJI2RlZmluZSBUSUZGX0JFRU5XUklUSU5HIDB4MDAwNDBVIC8qIHdyaXR0ZW4gMSsgc2NhbmxpbmVzIHRvIGZpbGUgKi8KKwkjZGVmaW5lIFRJRkZfU1dBQiAgICAgICAgMHgwMDA4MFUgLyogYnl0ZSBzd2FwIGZpbGUgaW5mb3JtYXRpb24gKi8KKwkjZGVmaW5lIFRJRkZfTk9CSVRSRVYgICAgMHgwMDEwMFUgLyogaW5oaWJpdCBiaXQgcmV2ZXJzYWwgbG9naWMgKi8KKwkjZGVmaW5lIFRJRkZfTVlCVUZGRVIgICAgMHgwMDIwMFUgLyogbXkgcmF3IGRhdGEgYnVmZmVyOyBmcmVlIG9uIGNsb3NlICovCisJI2RlZmluZSBUSUZGX0lTVElMRUQgICAgIDB4MDA0MDBVIC8qIGZpbGUgaXMgdGlsZSwgbm90IHN0cmlwLSBiYXNlZCAqLworCSNkZWZpbmUgVElGRl9NQVBQRUQgICAgICAweDAwODAwVSAvKiBmaWxlIGlzIG1hcHBlZCBpbnRvIG1lbW9yeSAqLworCSNkZWZpbmUgVElGRl9QT1NURU5DT0RFICAweDAxMDAwVSAvKiBuZWVkIGNhbGwgdG8gcG9zdGVuY29kZSByb3V0aW5lICovCisJI2RlZmluZSBUSUZGX0lOU1VCSUZEICAgIDB4MDIwMDBVIC8qIGN1cnJlbnRseSB3cml0aW5nIGEgc3ViaWZkICovCisJI2RlZmluZSBUSUZGX1VQU0FNUExFRCAgIDB4MDQwMDBVIC8qIGxpYnJhcnkgaXMgZG9pbmcgZGF0YSB1cC1zYW1wbGluZyAqLworCSNkZWZpbmUgVElGRl9TVFJJUENIT1AgICAweDA4MDAwVSAvKiBlbmFibGUgc3RyaXAgY2hvcHBpbmcgc3VwcG9ydCAqLworCSNkZWZpbmUgVElGRl9IRUFERVJPTkxZICAweDEwMDAwVSAvKiByZWFkIGhlYWRlciBvbmx5LCBkbyBub3QgcHJvY2VzcyB0aGUgZmlyc3QgZGlyZWN0b3J5ICovCisJI2RlZmluZSBUSUZGX05PUkVBRFJBVyAgIDB4MjAwMDBVIC8qIHNraXAgcmVhZGluZyBvZiByYXcgdW5jb21wcmVzc2VkIGltYWdlIGRhdGEgKi8KKwkjZGVmaW5lIFRJRkZfSU5DVVNUT01JRkQgMHg0MDAwMFUgLyogY3VycmVudGx5IHdyaXRpbmcgYSBjdXN0b20gSUZEICovCisJI2RlZmluZSBUSUZGX0JJR1RJRkYgICAgIDB4ODAwMDBVIC8qIHJlYWQvd3JpdGUgYmlndGlmZiAqLworICAgICAgICAjZGVmaW5lIFRJRkZfQlVGNFdSSVRFICAweDEwMDAwMFUgLyogcmF3Y2MgYnl0ZXMgYXJlIGZvciB3cml0aW5nICovCisgICAgICAgICNkZWZpbmUgVElGRl9ESVJUWVNUUklQIDB4MjAwMDAwVSAvKiBzdHJpcG9mZnNldHMvc3RyaXBieXRlY291bnQgZGlydHkqLworICAgICAgICAjZGVmaW5lIFRJRkZfUEVSU0FNUExFICAweDQwMDAwMFUgLyogZ2V0L3NldCBwZXIgc2FtcGxlIHRhZ3MgYXMgYXJyYXlzICovCisgICAgICAgICNkZWZpbmUgVElGRl9CVUZGRVJNTUFQIDB4ODAwMDAwVSAvKiByZWFkIGJ1ZmZlciAodGlmX3Jhd2RhdGEpIHBvaW50cyBpbnRvIG1tYXAoKSBtZW1vcnkgKi8KIAl1aW50NjQgICAgICAgICAgICAgICB0aWZfZGlyb2ZmOyAgICAgICAvKiBmaWxlIG9mZnNldCBvZiBjdXJyZW50IGRpcmVjdG9yeSAqLwogCXVpbnQ2NCAgICAgICAgICAgICAgIHRpZl9uZXh0ZGlyb2ZmOyAgIC8qIGZpbGUgb2Zmc2V0IG9mIGZvbGxvd2luZyBkaXJlY3RvcnkgKi8KIAl1aW50NjQqICAgICAgICAgICAgICB0aWZfZGlybGlzdDsgICAgICAvKiBsaXN0IG9mIG9mZnNldHMgdG8gYWxyZWFkeSBzZWVuIGRpcmVjdG9yaWVzIHRvIHByZXZlbnQgSUZEIGxvb3BpbmcgKi8KLQl1aW50MTYgICAgICAgICAgICAgICB0aWZfZGlybGlzdHNpemU7ICAvKiBudW1iZXIgb2YgZW50aXJlcyBpbiBvZmZzZXQgbGlzdCAqLworCXVpbnQxNiAgICAgICAgICAgICAgIHRpZl9kaXJsaXN0c2l6ZTsgIC8qIG51bWJlciBvZiBlbnRyaWVzIGluIG9mZnNldCBsaXN0ICovCiAJdWludDE2ICAgICAgICAgICAgICAgdGlmX2Rpcm51bWJlcjsgICAgLyogbnVtYmVyIG9mIGFscmVhZHkgc2VlbiBkaXJlY3RvcmllcyAqLwogCVRJRkZEaXJlY3RvcnkgICAgICAgIHRpZl9kaXI7ICAgICAgICAgIC8qIGludGVybmFsIHJlcCBvZiBjdXJyZW50IGRpcmVjdG9yeSAqLwogCVRJRkZEaXJlY3RvcnkgICAgICAgIHRpZl9jdXN0b21kaXI7ICAgIC8qIGN1c3RvbSBJRkRzIGFyZSBzZXBhcmF0ZWQgZnJvbSB0aGUgbWFpbiBvbmVzICovCkBAIC0yNDksNiArMjQ5LDEwIEBACiAjZGVmaW5lIFRJRkZob3dtYW55XzMyKHgsIHkpICgoKHVpbnQzMil4IDwgKDB4ZmZmZmZmZmYgLSAodWludDMyKSh5LTEpKSkgPyBcCiAJCQkgICAoKCgodWludDMyKSh4KSkrKCgodWludDMyKSh5KSktMSkpLygodWludDMyKSh5KSkpIDogXAogCQkJICAgMFUpCisvKiBWYXJpYW50IG9mIFRJRkZob3dtYW55XzMyKCkgdGhhdCBkb2Vzbid0IHJldHVybiAwIGlmIHggY2xvc2UgdG8gTUFYVUlOVC4gKi8KKy8qIENhdXRpb246IFRJRkZob3dtYW55XzMyX21heHVpbnRfY29tcGF0KHgseSkqeSBtaWdodCBvdmVyZmxvdyAqLworI2RlZmluZSBUSUZGaG93bWFueV8zMl9tYXh1aW50X2NvbXBhdCh4LCB5KSBcCisJCQkgICAoKCh1aW50MzIpKHgpIC8gKHVpbnQzMikoeSkpICsgKCgoKHVpbnQzMikoeCkgJSAodWludDMyKSh5KSkgIT0gMCkgPyAxIDogMCkpCiAjZGVmaW5lIFRJRkZob3dtYW55OF8zMih4KSAoKCh4KSYweDA3KT8oKHVpbnQzMikoeCk+PjMpKzE6KHVpbnQzMikoeCk+PjMpCiAjZGVmaW5lIFRJRkZyb3VuZHVwXzMyKHgsIHkpIChUSUZGaG93bWFueV8zMih4LHkpKih5KSkKICNkZWZpbmUgVElGRmhvd21hbnlfNjQoeCwgeSkgKCgoKHVpbnQ2NCkoeCkpKygoKHVpbnQ2NCkoeSkpLTEpKS8oKHVpbnQ2NCkoeSkpKQpAQCAtMzYwLDYgKzM2NCwyMCBAQAogZXh0ZXJuIGRvdWJsZSBfVElGRlVJbnQ2NFRvRG91YmxlKHVpbnQ2NCk7CiBleHRlcm4gZmxvYXQgX1RJRkZVSW50NjRUb0Zsb2F0KHVpbnQ2NCk7CiAKK2V4dGVybiB0bXNpemVfdAorX1RJRkZSZWFkRW5jb2RlZFN0cmlwQW5kQWxsb2NCdWZmZXIoVElGRiogdGlmLCB1aW50MzIgc3RyaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYnVmLCB0bXNpemVfdCBidWZzaXpldG9hbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtc2l6ZV90IHNpemVfdG9fcmVhZCk7CitleHRlcm4gdG1zaXplX3QKK19USUZGUmVhZEVuY29kZWRUaWxlQW5kQWxsb2NCdWZmZXIoVElGRiogdGlmLCB1aW50MzIgdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipidWYsIHRtc2l6ZV90IGJ1ZnNpemV0b2FsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1zaXplX3Qgc2l6ZV90b19yZWFkKTsKK2V4dGVybiB0bXNpemVfdAorX1RJRkZSZWFkVGlsZUFuZEFsbG9jQnVmZmVyKFRJRkYqIHRpZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYnVmLCB0bXNpemVfdCBidWZzaXpldG9hbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgeCwgdWludDMyIHksIHVpbnQzMiB6LCB1aW50MTYgcyk7CisKKwogZXh0ZXJuIGludCBUSUZGSW5pdER1bXBNb2RlKFRJRkYqLCBpbnQpOwogI2lmZGVmIFBBQ0tCSVRTX1NVUFBPUlQKIGV4dGVybiBpbnQgVElGRkluaXRQYWNrQml0cyhUSUZGKiwgaW50KTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmZnZlcnMuaCBiL3RoaXJkX3BhcnR5L2xpYnRpZmYvdGlmZnZlcnMuaAppbmRleCBlOTY1ODE0Li44OTBlNDMzIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9saWJ0aWZmL3RpZmZ2ZXJzLmgKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi90aWZmdmVycy5oCkBAIC0xLDQgKzEsNCBAQAotI2RlZmluZSBUSUZGTElCX1ZFUlNJT05fU1RSICJMSUJUSUZGLCBWZXJzaW9uIDQuMC42XG5Db3B5cmlnaHQgKGMpIDE5ODgtMTk5NiBTYW0gTGVmZmxlclxuQ29weXJpZ2h0IChjKSAxOTkxLTE5OTYgU2lsaWNvbiBHcmFwaGljcywgSW5jLiIKKyNkZWZpbmUgVElGRkxJQl9WRVJTSU9OX1NUUiAiTElCVElGRiwgVmVyc2lvbiA0LjAuOFxuQ29weXJpZ2h0IChjKSAxOTg4LTE5OTYgU2FtIExlZmZsZXJcbkNvcHlyaWdodCAoYykgMTk5MS0xOTk2IFNpbGljb24gR3JhcGhpY3MsIEluYy4iCiAvKgogICogVGhpcyBkZWZpbmUgY2FuIGJlIHVzZWQgaW4gY29kZSB0aGF0IHJlcXVpcmVzCiAgKiBjb21waWxhdGlvbi1yZWxhdGVkIGRlZmluaXRpb25zIHNwZWNpZmljIHRvIGEKQEAgLTYsNCArNiw0IEBACiAgKiB2ZXJzaW9uIGNoZWNraW5nIHNob3VsZCBiZSBkb25lIGJhc2VkIG9uIHRoZQogICogc3RyaW5nIHJldHVybmVkIGJ5IFRJRkZHZXRWZXJzaW9uLgogICovCi0jZGVmaW5lIFRJRkZMSUJfVkVSU0lPTiAyMDE1MDkxMgorI2RlZmluZSBUSUZGTElCX1ZFUlNJT04gMjAxNzA1MjEKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdXZjb2RlLmggYi90aGlyZF9wYXJ0eS9saWJ0aWZmL3V2Y29kZS5oCmluZGV4IDUwZjExZDcuLjYyODZjZmIgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2xpYnRpZmYvdXZjb2RlLmgKKysrIGIvdGhpcmRfcGFydHkvbGlidGlmZi91dmNvZGUuaApAQCAtMyw3ICszLDcgQEAKICNkZWZpbmUgVVZfTkRJVlMJMTYyODkKICNkZWZpbmUgVVZfVlNUQVJUCShmbG9hdCkwLjAxNjk0MAogI2RlZmluZSBVVl9OVlMJCTE2Mwotc3RhdGljIHN0cnVjdCB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAlmbG9hdAl1c3RhcnQ7CiAJc2hvcnQJbnVzLCBuY3VtOwogfQl1dl9yb3dbVVZfTlZTXSA9IHsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3BkZml1bWFnZzIzLmJwIGIvdGhpcmRfcGFydHkvcGRmaXVtYWdnMjMuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MGU1OTQuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvcGRmaXVtYWdnMjMuYnAKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYnBkZml1bWFnZzIzIiwKLSAgICBkZWZhdWx0czogWyJwZGZpdW0tZGVmYXVsdHMiXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAvLyBNYXNrIHNvbWUgd2FybmluZ3MuIFRoZXNlIGFyZSBiZW5pZ24sIGJ1dCB3ZSBwcm9iYWJseSB3YW50IHRvIGZpeCB0aGVtCi0gICAgICAgIC8vIHVwc3RyZWFtIGF0IHNvbWUgcG9pbnQuCi0gICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAotICAgICAgICAiLVduby11bnVzZWQtZnVuY3Rpb24iLAotICAgIF0sCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJhZ2cyMy9hZ2dfY3VydmVzLmNwcCIsCi0gICAgICAgICJhZ2cyMy9hZ2dfcGF0aF9zdG9yYWdlLmNwcCIsCi0gICAgICAgICJhZ2cyMy9hZ2dfcmFzdGVyaXplcl9zY2FubGluZV9hYS5jcHAiLAotICAgICAgICAiYWdnMjMvYWdnX3ZjZ2VuX2Rhc2guY3BwIiwKLSAgICAgICAgImFnZzIzL2FnZ192Y2dlbl9zdHJva2UuY3BwIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvcGRmaXVtYmlnaW50LmJwIGIvdGhpcmRfcGFydHkvcGRmaXVtYmlnaW50LmJwCmluZGV4IDUzNmIxMTUuLmZiZDkyYTkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L3BkZml1bWJpZ2ludC5icAorKysgYi90aGlyZF9wYXJ0eS9wZGZpdW1iaWdpbnQuYnAKQEAgLTEsNiArMSw2IEBACiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnBkZml1bWJpZ2ludCIsCi0gICAgZGVmYXVsdHM6IFsicGRmaXVtLWRlZmF1bHRzIl0sCisgICAgZGVmYXVsdHM6IFsicGRmaXVtLXRoaXJkLXBhcnR5Il0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJiaWdpbnQvQmlnSW50ZWdlci5jYyIsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9wZGZpdW1meF9hZ2cuYnAgYi90aGlyZF9wYXJ0eS9wZGZpdW1meF9hZ2cuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1ZmE2NwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3BkZml1bWZ4X2FnZy5icApAQCAtMCwwICsxLDIwIEBACitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnBkZml1bWZ4X2FnZyIsCisgICAgZGVmYXVsdHM6IFsicGRmaXVtLXRoaXJkLXBhcnR5Il0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1Xbm8tdW51c2VkLWZ1bmN0aW9uIgorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlicGRmaXVtZnhjcnQiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJhZ2cyMy9hZ2dfY3VydmVzLmNwcCIsCisgICAgICAgICJhZ2cyMy9hZ2dfcGF0aF9zdG9yYWdlLmNwcCIsCisgICAgICAgICJhZ2cyMy9hZ2dfcmFzdGVyaXplcl9zY2FubGluZV9hYS5jcHAiLAorICAgICAgICAiYWdnMjMvYWdnX3ZjZ2VuX2Rhc2guY3BwIiwKKyAgICAgICAgImFnZzIzL2FnZ192Y2dlbl9zdHJva2UuY3BwIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvcGRmaXVtZnhfbGlib3BlbmpwZWcuYnAgYi90aGlyZF9wYXJ0eS9wZGZpdW1meF9saWJvcGVuanBlZy5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmI1OTRkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkvcGRmaXVtZnhfbGlib3BlbmpwZWcuYnAKQEAgLTAsMCArMSwyNyBAQAorY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJwZGZpdW1meF9saWJvcGVuanBlZyIsCisgICAgZGVmYXVsdHM6IFsicGRmaXVtLXRoaXJkLXBhcnR5Il0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJsaWJvcGVuanBlZzIwL2Jpby5jIiwKKyAgICAgICAgImxpYm9wZW5qcGVnMjAvY2lvLmMiLAorICAgICAgICAibGlib3BlbmpwZWcyMC9kd3QuYyIsCisgICAgICAgICJsaWJvcGVuanBlZzIwL2V2ZW50LmMiLAorICAgICAgICAibGlib3BlbmpwZWcyMC9mdW5jdGlvbl9saXN0LmMiLAorICAgICAgICAibGlib3BlbmpwZWcyMC9pbWFnZS5jIiwKKyAgICAgICAgImxpYm9wZW5qcGVnMjAvaW52ZXJ0LmMiLAorICAgICAgICAibGlib3BlbmpwZWcyMC9qMmsuYyIsCisgICAgICAgICJsaWJvcGVuanBlZzIwL2pwMi5jIiwKKyAgICAgICAgImxpYm9wZW5qcGVnMjAvbWN0LmMiLAorICAgICAgICAibGlib3BlbmpwZWcyMC9tcWMuYyIsCisgICAgICAgICJsaWJvcGVuanBlZzIwL29wZW5qcGVnLmMiLAorICAgICAgICAibGlib3BlbmpwZWcyMC9vcGpfY2xvY2suYyIsCisgICAgICAgICJsaWJvcGVuanBlZzIwL3BpLmMiLAorICAgICAgICAibGlib3BlbmpwZWcyMC9zcGFyc2VfYXJyYXkuYyIsCisgICAgICAgICJsaWJvcGVuanBlZzIwL3QxLmMiLAorICAgICAgICAibGlib3BlbmpwZWcyMC90Mi5jIiwKKyAgICAgICAgImxpYm9wZW5qcGVnMjAvdGNkLmMiLAorICAgICAgICAibGlib3BlbmpwZWcyMC90Z3QuYyIsCisgICAgICAgICJsaWJvcGVuanBlZzIwL3RocmVhZC5jIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvcGRmaXVtanBlZy5icCBiL3RoaXJkX3BhcnR5L3BkZml1bWpwZWcuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMTNlN2EuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvcGRmaXVtanBlZy5icAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGlicGRmaXVtanBlZyIsCi0gICAgZGVmYXVsdHM6IFsicGRmaXVtLWRlZmF1bHRzIl0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgLy8gTWFzayBzb21lIHdhcm5pbmdzLiBUaGVzZSBhcmUgYmVuaWduLCBidXQgd2UgcHJvYmFibHkgd2FudCB0byBmaXggdGhlbQotICAgICAgICAvLyB1cHN0cmVhbSBhdCBzb21lIHBvaW50LgotICAgICAgICAiLVduby1zaGlmdC1uZWdhdGl2ZS12YWx1ZSIsCi0gICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAotICAgIF0sCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJsaWJqcGVnL2ZwZGZhcGlfamNhcGltaW4uYyIsCi0gICAgICAgICJsaWJqcGVnL2ZwZGZhcGlfamNhcGlzdGQuYyIsCi0gICAgICAgICJsaWJqcGVnL2ZwZGZhcGlfamNjb2VmY3QuYyIsCi0gICAgICAgICJsaWJqcGVnL2ZwZGZhcGlfamNjb2xvci5jIiwKLSAgICAgICAgImxpYmpwZWcvZnBkZmFwaV9qY2RjdG1nci5jIiwKLSAgICAgICAgImxpYmpwZWcvZnBkZmFwaV9qY2h1ZmYuYyIsCi0gICAgICAgICJsaWJqcGVnL2ZwZGZhcGlfamNpbml0LmMiLAotICAgICAgICAibGlianBlZy9mcGRmYXBpX2pjbWFpbmN0LmMiLAotICAgICAgICAibGlianBlZy9mcGRmYXBpX2pjbWFya2VyLmMiLAotICAgICAgICAibGlianBlZy9mcGRmYXBpX2pjbWFzdGVyLmMiLAotICAgICAgICAibGlianBlZy9mcGRmYXBpX2pjb21hcGkuYyIsCi0gICAgICAgICJsaWJqcGVnL2ZwZGZhcGlfamNwYXJhbS5jIiwKLSAgICAgICAgImxpYmpwZWcvZnBkZmFwaV9qY3BodWZmLmMiLAotICAgICAgICAibGlianBlZy9mcGRmYXBpX2pjcHJlcGN0LmMiLAotICAgICAgICAibGlianBlZy9mcGRmYXBpX2pjc2FtcGxlLmMiLAotICAgICAgICAibGlianBlZy9mcGRmYXBpX2pjdHJhbnMuYyIsCi0gICAgICAgICJsaWJqcGVnL2ZwZGZhcGlfamRhcGltaW4uYyIsCi0gICAgICAgICJsaWJqcGVnL2ZwZGZhcGlfamRhcGlzdGQuYyIsCi0gICAgICAgICJsaWJqcGVnL2ZwZGZhcGlfamRjb2VmY3QuYyIsCi0gICAgICAgICJsaWJqcGVnL2ZwZGZhcGlfamRjb2xvci5jIiwKLSAgICAgICAgImxpYmpwZWcvZnBkZmFwaV9qZGRjdG1nci5jIiwKLSAgICAgICAgImxpYmpwZWcvZnBkZmFwaV9qZGh1ZmYuYyIsCi0gICAgICAgICJsaWJqcGVnL2ZwZGZhcGlfamRpbnB1dC5jIiwKLSAgICAgICAgImxpYmpwZWcvZnBkZmFwaV9qZG1haW5jdC5jIiwKLSAgICAgICAgImxpYmpwZWcvZnBkZmFwaV9qZG1hcmtlci5jIiwKLSAgICAgICAgImxpYmpwZWcvZnBkZmFwaV9qZG1hc3Rlci5jIiwKLSAgICAgICAgImxpYmpwZWcvZnBkZmFwaV9qZG1lcmdlLmMiLAotICAgICAgICAibGlianBlZy9mcGRmYXBpX2pkcGh1ZmYuYyIsCi0gICAgICAgICJsaWJqcGVnL2ZwZGZhcGlfamRwb3N0Y3QuYyIsCi0gICAgICAgICJsaWJqcGVnL2ZwZGZhcGlfamRzYW1wbGUuYyIsCi0gICAgICAgICJsaWJqcGVnL2ZwZGZhcGlfamR0cmFucy5jIiwKLSAgICAgICAgImxpYmpwZWcvZnBkZmFwaV9qZXJyb3IuYyIsCi0gICAgICAgICJsaWJqcGVnL2ZwZGZhcGlfamZkY3Rmc3QuYyIsCi0gICAgICAgICJsaWJqcGVnL2ZwZGZhcGlfamZkY3RpbnQuYyIsCi0gICAgICAgICJsaWJqcGVnL2ZwZGZhcGlfamlkY3Rmc3QuYyIsCi0gICAgICAgICJsaWJqcGVnL2ZwZGZhcGlfamlkY3RpbnQuYyIsCi0gICAgICAgICJsaWJqcGVnL2ZwZGZhcGlfamlkY3RyZWQuYyIsCi0gICAgICAgICJsaWJqcGVnL2ZwZGZhcGlfam1lbW1nci5jIiwKLSAgICAgICAgImxpYmpwZWcvZnBkZmFwaV9qbWVtbm9icy5jIiwKLSAgICAgICAgImxpYmpwZWcvZnBkZmFwaV9qdXRpbHMuYyIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3BkZml1bWxjbXMuYnAgYi90aGlyZF9wYXJ0eS9wZGZpdW1sY21zLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWFiN2ViLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3BkZml1bWxjbXMuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1jY19saWJyYXJ5X3N0YXRpYyB7Ci0gICAgbmFtZTogImxpYnBkZml1bWxjbXMiLAotICAgIGRlZmF1bHRzOiBbInBkZml1bS1kZWZhdWx0cyJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgIC8vIE1hc2sgc29tZSB3YXJuaW5ncy4gVGhlc2UgYXJlIGJlbmlnbiwgYnV0IHdlIHByb2JhYmx5IHdhbnQgdG8gZml4IHRoZW0KLSAgICAgICAgLy8gdXBzdHJlYW0gYXQgc29tZSBwb2ludC4KLSAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCi0gICAgICAgICItV25vLW1pc3NpbmctYnJhY2VzIiwKLSAgICAgICAgIi1Xbm8tdW51c2VkLWZ1bmN0aW9uIiwKLSAgICBdLAotCi0gICAgc3JjczogWwotICAgICAgICAibGNtczItMi42L3NyYy9jbXNjYW0wMi5jIiwKLSAgICAgICAgImxjbXMyLTIuNi9zcmMvY21zY2dhdHMuYyIsCi0gICAgICAgICJsY21zMi0yLjYvc3JjL2Ntc2NudnJ0LmMiLAotICAgICAgICAibGNtczItMi42L3NyYy9jbXNlcnIuYyIsCi0gICAgICAgICJsY21zMi0yLjYvc3JjL2Ntc2dhbW1hLmMiLAotICAgICAgICAibGNtczItMi42L3NyYy9jbXNnbXQuYyIsCi0gICAgICAgICJsY21zMi0yLjYvc3JjL2Ntc2hhbGYuYyIsCi0gICAgICAgICJsY21zMi0yLjYvc3JjL2Ntc2ludHJwLmMiLAotICAgICAgICAibGNtczItMi42L3NyYy9jbXNpbzAuYyIsCi0gICAgICAgICJsY21zMi0yLjYvc3JjL2Ntc2lvMS5jIiwKLSAgICAgICAgImxjbXMyLTIuNi9zcmMvY21zbHV0LmMiLAotICAgICAgICAibGNtczItMi42L3NyYy9jbXNtZDUuYyIsCi0gICAgICAgICJsY21zMi0yLjYvc3JjL2Ntc210cnguYyIsCi0gICAgICAgICJsY21zMi0yLjYvc3JjL2Ntc25hbWVkLmMiLAotICAgICAgICAibGNtczItMi42L3NyYy9jbXNvcHQuYyIsCi0gICAgICAgICJsY21zMi0yLjYvc3JjL2Ntc3BhY2suYyIsCi0gICAgICAgICJsY21zMi0yLjYvc3JjL2Ntc3Bjcy5jIiwKLSAgICAgICAgImxjbXMyLTIuNi9zcmMvY21zcGx1Z2luLmMiLAotICAgICAgICAibGNtczItMi42L3NyYy9jbXNwczIuYyIsCi0gICAgICAgICJsY21zMi0yLjYvc3JjL2Ntc3NhbXAuYyIsCi0gICAgICAgICJsY21zMi0yLjYvc3JjL2Ntc3NtLmMiLAotICAgICAgICAibGNtczItMi42L3NyYy9jbXN0eXBlcy5jIiwKLSAgICAgICAgImxjbXMyLTIuNi9zcmMvY21zdmlydC5jIiwKLSAgICAgICAgImxjbXMyLTIuNi9zcmMvY21zd3RwbnQuYyIsCi0gICAgICAgICJsY21zMi0yLjYvc3JjL2Ntc3hmb3JtLmMiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9wZGZpdW1sY21zMi5icCBiL3RoaXJkX3BhcnR5L3BkZml1bWxjbXMyLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NTI4N2IKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS9wZGZpdW1sY21zMi5icApAQCAtMCwwICsxLDM3IEBACitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnBkZml1bWxjbXMyIiwKKyAgICBkZWZhdWx0czogWyJwZGZpdW0tdGhpcmQtcGFydHkiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1taXNzaW5nLWJyYWNlcyIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImxjbXMvc3JjL2Ntc2FscGhhLmMiLAorICAgICAgICAibGNtcy9zcmMvY21zY2FtMDIuYyIsCisgICAgICAgICJsY21zL3NyYy9jbXNjZ2F0cy5jIiwKKyAgICAgICAgImxjbXMvc3JjL2Ntc2NudnJ0LmMiLAorICAgICAgICAibGNtcy9zcmMvY21zZXJyLmMiLAorICAgICAgICAibGNtcy9zcmMvY21zZ2FtbWEuYyIsCisgICAgICAgICJsY21zL3NyYy9jbXNnbXQuYyIsCisgICAgICAgICJsY21zL3NyYy9jbXNoYWxmLmMiLAorICAgICAgICAibGNtcy9zcmMvY21zaW50cnAuYyIsCisgICAgICAgICJsY21zL3NyYy9jbXNpbzAuYyIsCisgICAgICAgICJsY21zL3NyYy9jbXNpbzEuYyIsCisgICAgICAgICJsY21zL3NyYy9jbXNsdXQuYyIsCisgICAgICAgICJsY21zL3NyYy9jbXNtZDUuYyIsCisgICAgICAgICJsY21zL3NyYy9jbXNtdHJ4LmMiLAorICAgICAgICAibGNtcy9zcmMvY21zbmFtZWQuYyIsCisgICAgICAgICJsY21zL3NyYy9jbXNvcHQuYyIsCisgICAgICAgICJsY21zL3NyYy9jbXNwYWNrLmMiLAorICAgICAgICAibGNtcy9zcmMvY21zcGNzLmMiLAorICAgICAgICAibGNtcy9zcmMvY21zcGx1Z2luLmMiLAorICAgICAgICAibGNtcy9zcmMvY21zcHMyLmMiLAorICAgICAgICAibGNtcy9zcmMvY21zc2FtcC5jIiwKKyAgICAgICAgImxjbXMvc3JjL2Ntc3NtLmMiLAorICAgICAgICAibGNtcy9zcmMvY21zdHlwZXMuYyIsCisgICAgICAgICJsY21zL3NyYy9jbXN2aXJ0LmMiLAorICAgICAgICAibGNtcy9zcmMvY21zd3RwbnQuYyIsCisgICAgICAgICJsY21zL3NyYy9jbXN4Zm9ybS5jIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvcGRmaXVtb3BlbmpwZWcuYnAgYi90aGlyZF9wYXJ0eS9wZGZpdW1vcGVuanBlZy5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc2MzA2Zi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9wZGZpdW1vcGVuanBlZy5icAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGlicGRmaXVtb3BlbmpwZWciLAotICAgIGRlZmF1bHRzOiBbInBkZml1bS1kZWZhdWx0cyJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgIC8vIE1hc2sgc29tZSB3YXJuaW5ncy4gVGhlc2UgYXJlIGJlbmlnbiwgYnV0IHdlIHByb2JhYmx5IHdhbnQgdG8gZml4IHRoZW0KLSAgICAgICAgLy8gdXBzdHJlYW0gYXQgc29tZSBwb2ludC4KLSAgICAgICAgIi1Xbm8tc2lnbi1jb21wYXJlIiwKLSAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCi0gICAgXSwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgImxpYm9wZW5qcGVnMjAvYmlvLmMiLAotICAgICAgICAibGlib3BlbmpwZWcyMC9jaW8uYyIsCi0gICAgICAgICJsaWJvcGVuanBlZzIwL2R3dC5jIiwKLSAgICAgICAgImxpYm9wZW5qcGVnMjAvZXZlbnQuYyIsCi0gICAgICAgICJsaWJvcGVuanBlZzIwL2Z1bmN0aW9uX2xpc3QuYyIsCi0gICAgICAgICJsaWJvcGVuanBlZzIwL2ltYWdlLmMiLAotICAgICAgICAibGlib3BlbmpwZWcyMC9pbnZlcnQuYyIsCi0gICAgICAgICJsaWJvcGVuanBlZzIwL2oyay5jIiwKLSAgICAgICAgImxpYm9wZW5qcGVnMjAvanAyLmMiLAotICAgICAgICAibGlib3BlbmpwZWcyMC9tY3QuYyIsCi0gICAgICAgICJsaWJvcGVuanBlZzIwL21xYy5jIiwKLSAgICAgICAgImxpYm9wZW5qcGVnMjAvb3BlbmpwZWcuYyIsCi0gICAgICAgICJsaWJvcGVuanBlZzIwL29wal9jbG9jay5jIiwKLSAgICAgICAgImxpYm9wZW5qcGVnMjAvcGkuYyIsCi0gICAgICAgICJsaWJvcGVuanBlZzIwL3Jhdy5jIiwKLSAgICAgICAgImxpYm9wZW5qcGVnMjAvdDEuYyIsCi0gICAgICAgICJsaWJvcGVuanBlZzIwL3QyLmMiLAotICAgICAgICAibGlib3BlbmpwZWcyMC90Y2QuYyIsCi0gICAgICAgICJsaWJvcGVuanBlZzIwL3RndC5jIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvcGRmaXVtcGRmaXVtYmFzZS5icCBiL3RoaXJkX3BhcnR5L3BkZml1bXBkZml1bWJhc2UuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM3MmVlYgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3BkZml1bXBkZml1bWJhc2UuYnAKQEAgLTAsMCArMSwxMSBAQAorY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJwZGZpdW1wZGZpdW1iYXNlIiwKKyAgICBkZWZhdWx0czogWyJwZGZpdW0tdGhpcmQtcGFydHkiXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImJhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvYWRkcmVzc19zcGFjZV9yYW5kb21pemF0aW9uLmNjIiwKKyAgICAgICAgImJhc2UvYWxsb2NhdG9yL3BhcnRpdGlvbl9hbGxvY2F0b3IvcGFnZV9hbGxvY2F0b3IuY2MiLAorICAgICAgICAiYmFzZS9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jYXRvci9wYXJ0aXRpb25fYWxsb2MuY2MiLAorICAgICAgICAiYmFzZS9hbGxvY2F0b3IvcGFydGl0aW9uX2FsbG9jYXRvci9zcGluX2xvY2suY2MiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9wZGZpdW16bGliLmJwIGIvdGhpcmRfcGFydHkvcGRmaXVtemxpYi5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZkNjBjMy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9wZGZpdW16bGliLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJwZGZpdW16bGliIiwKLSAgICBkZWZhdWx0czogWyJwZGZpdW0tZGVmYXVsdHMiXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAvLyBNYXNrIHNvbWUgd2FybmluZ3MuIFRoZXNlIGFyZSBiZW5pZ24sIGJ1dCB3ZSBwcm9iYWJseSB3YW50IHRvIGZpeCB0aGVtCi0gICAgICAgIC8vIHVwc3RyZWFtIGF0IHNvbWUgcG9pbnQuCi0gICAgICAgICItV25vLXNoaWZ0LW5lZ2F0aXZlLXZhbHVlIiwKLSAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCi0gICAgXSwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgInpsaWJfdjEyOC9hZGxlcjMyLmMiLAotICAgICAgICAiemxpYl92MTI4L2NvbXByZXNzLmMiLAotICAgICAgICAiemxpYl92MTI4L2NyYzMyLmMiLAotICAgICAgICAiemxpYl92MTI4L2RlZmxhdGUuYyIsCi0gICAgICAgICJ6bGliX3YxMjgvZ3pjbG9zZS5jIiwKLSAgICAgICAgInpsaWJfdjEyOC9nemxpYi5jIiwKLSAgICAgICAgInpsaWJfdjEyOC9nenJlYWQuYyIsCi0gICAgICAgICJ6bGliX3YxMjgvZ3p3cml0ZS5jIiwKLSAgICAgICAgInpsaWJfdjEyOC9pbmZiYWNrLmMiLAotICAgICAgICAiemxpYl92MTI4L2luZmZhc3QuYyIsCi0gICAgICAgICJ6bGliX3YxMjgvaW5mbGF0ZS5jIiwKLSAgICAgICAgInpsaWJfdjEyOC9pbmZ0cmVlcy5jIiwKLSAgICAgICAgInpsaWJfdjEyOC90cmVlcy5jIiwKLSAgICAgICAgInpsaWJfdjEyOC91bmNvbXByLmMiLAotICAgICAgICAiemxpYl92MTI4L3p1dGlsLmMiLAotICAgIF0sCi19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9weW1vY2svT1dORVJTIGIvdGhpcmRfcGFydHkvcHltb2NrL09XTkVSUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk0NjU2MC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS9weW1vY2svT1dORVJTCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc2JjQGNocm9taXVtLm9yZwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkveWFzbS9CVUlMRC5nbiBiL3RoaXJkX3BhcnR5L3lhc20vQlVJTEQuZ24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkYmY5MQotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3lhc20vQlVJTEQuZ24KQEAgLTAsMCArMSw1NjkgQEAKKyMgQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKyMgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworIyBUaGUgeWFzbSBidWlsZCBwcm9jZXNzIGNyZWF0ZXMgYSBzbGV3IG9mIHNtYWxsIEMgc3VicHJvZ3JhbXMgdGhhdAorIyBkeW5hbWljYWxseSBnZW5lcmF0ZSBmaWxlcyBhdCB2YXJpb3VzIHBvaW50IGluIHRoZSBidWlsZCBwcm9jZXNzLiAgVGhpcyBtYWtlcworIyB0aGUgYnVpbGQgaW50ZWdyYXRpb24gbW9kZXJhdGVseSBjb21wbGV4LgorIworIyBUaGVyZSBhcmUgdGhyZWUgY2xhc3NlcyBvZiBkeW5hbWljYWxseSBnZW5lcmF0ZWQgZmlsZXM6CisjICAgMSkgQyBzb3VyY2UgZmlsZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkIChlZy4sIGxjM2JpZC5jKQorIyAgIDIpIEMgc291cmNlIGZpbGVzIHRoYXQgYXJlICNpbmNsdWRlZCBieSBzdGF0aWMgQyBzb3VyY2VzIChlZy4sIGxpY2Vuc2UuYykKKyMgICAzKSBJbnRlcm1lZGlhdGUgZmlsZXMgdGhhdCBhcmUgdXNlZCBhcyBpbnB1dCBieSBvdGhlciBzdWJwcm9ncmFtcyB0bworIyAgICAgIGZ1cnRoZXIgZ2VuZXJhdGUgZmlsZXMgaW4gY2F0ZWdvcnkgIzEgb3IgIzIuICAoZWcuLCB2ZXJzaW9uLm1hYykKKyMKKyMgVGhpcyBzdHJ1Y3R1cmUgaXMgcmVwcmVzZW50ZWQgd2l0aCB0aGUgZm9sbG93aW5nIHRhcmdldHM6CisjICAgMSkgeWFzbSAtLSBTb3VyY2VzLCBmbGFncyBmb3IgdGhlIG1haW4geWFzbSBleGVjdXRhYmxlLiBBbHNvIGhhcyBtb3N0IG9mCisjICAgICAgICAgICAgICBvZiB0aGUgYWN0aW9ucyBhbmQgcnVsZXMgdGhhdCBpbnZva2UgdGhlIHN1YnByb2dyYW1zLgorIyAgIDIpIHlhc21fY29uZmlnIC0tIEdlbmVyYWwgYnVpbGQgY29uZmlndXJhdGlvbiBpbmNsdWRpbmcgc2V0dGluZyBhCisjICAgICAgICAgICAgICBpbnB1dHMgbGlzdGluZyB0aGUgY2hlY2tlZCBpbiB2ZXJzaW9uIG9mIGZpbGVzCisjICAgICAgICAgICAgICBnZW5lcmF0ZWQgYnkgbWFudWFsbHkgcnVubmluZyBjb25maWd1cmUuIFRoZXNlIG1hbnVhbGx5CisjICAgICAgICAgICAgICBnZW5lcmF0ZWQgZmlsZXMgYXJlIHVzZWQgYnkgYWxsIGJpbmFyaWVzLgorIyAgIDMpIHlhc21fdXRpbHMgLS0gT2JqZWN0IGZpbGVzIHdpdGggbWVtb3J5IG1hbmFnZW1lbnQgYW5kIGhhc2hpbmcgdXRpbGl0aWVzCisjICAgICAgICAgICAgICBzaGFyZWQgYmV0d2VlbiB5YXNtIGFuZCB0aGUgZ2VucGVyZiBzdWJwcm9ncmFtLgorIyAgIDQpIGdlbm1hY3JvLCBnZW5tb2R1bGUsIGV0Yy4gLS0gT25lIGV4ZWN1dGFibGUgdGFyZ2V0IGZvciBlYWNoIHN1YnByb2dyYW0uCisjICAgNSkgZ2VuZXJhdGVfbGljZW5zZSwgZ2VuZXJhdGVfbW9kdWxlLCBldGMuIC0tIEFjdGlvbnMgdGhhdCBpbnZva2UgcHJvZ3JhbXMKKyMgICAgICAgICAgICAgIGJ1aWx0IGluICM0IHRvIGdlbmVyYXRlIC5jIGZpbGVzLgorIyAgIDYpIGNvbXBpbGVfZ3BlcmYsIGNvbXBpbGVfcmUyYywgZXRjLiAtLSBBY3Rpb25zIHRoYXQgaW52b2tlIHByb2dyYW1zIHRoYXQKKyMgICAgICAgICAgICAgIHR1cm4gaW50ZXJtZWRpYXRlIGZpbGVzIGludG8gLmMgZmlsZXMuCisKK2ltcG9ydCgiLy9idWlsZC9jb25maWcvY29tcGlsZXIvY29tcGlsZXIuZ25pIikKKworY29uZmlnc190b19kZWxldGUgPSBbXQorY29uZmlnc190b19hZGQgPSBbXQoraWYgKGlzX2RlYnVnKSB7CisgIGNvbmZpZ3NfdG9fZGVsZXRlICs9IFsKKyAgICAjIEJ1aWxkIHdpdGggZnVsbCBvcHRpbWl6YXRpb25zIGV2ZW4gb24gZGVidWcgY29uZmlndXJhdGlvbnMsIGJlY2F1c2Ugc29tZQorICAgICMgeWFzbSBidWlsZCBzdGVwcyAoaGlnaGJkX3NhZDRkX3NzZTIuYXNtKSBjYW4gdGFrZSB+MzMgc2Vjb25kcyBvciBtb3JlIGluCisgICAgIyBkZWJ1ZyBjb21wb25lbnQgYnVpbGRzIG9uIFdpbmRvd3MuIEVuYWJsaW5nIGNvbXBpbGVyIG9wdGltaXphdGlvbnMgc2F2ZXMKKyAgICAjICB+NSBzZWNvbmRzLgorICAgICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpkZWZhdWx0X29wdGltaXphdGlvbiIsCisKKyAgICAjIERvbid0IGRlZmluZSBfREVCVUcuIE1vZGVzdCBzYXZpbmdzLCBidXQgZ29vZCBmb3IgY29uc2lzdGVuY3kuCisgICAgIi8vYnVpbGQvY29uZmlnOmRlYnVnIiwKKyAgXQorICBjb25maWdzX3RvX2FkZCArPSBbCisgICAgIi8vYnVpbGQvY29uZmlnOnJlbGVhc2UiLAorICAgICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpvcHRpbWl6ZV9tYXgiLAorICBdCisgIGlmIChpc193aW4pIHsKKyAgICAjIFRoaXMgc3dpdGNoZXMgdG8gdXNpbmcgdGhlIHJlbGVhc2UgQ1JULiBPbiBkZWJ1ZyBjb21wb25lbnQgYnVpbGRzIG9mCisgICAgIyBoaWdoYmRfc2FkNGRfc3NlMi5hc20gb24gV2luZG93cyB0aGlzIHNhdmVzIGFib3V0IDE1IHMuCisgICAgY29uZmlnc190b19kZWxldGUgKz0gWyAiLy9idWlsZC9jb25maWcvd2luOmRlZmF1bHRfY3J0IiBdCisgICAgY29uZmlnc190b19hZGQgKz0gWyAiLy9idWlsZC9jb25maWcvd2luOnJlbGVhc2VfY3J0IiBdCisgIH0KK30KKworaWYgKGN1cnJlbnRfdG9vbGNoYWluID09IGhvc3RfdG9vbGNoYWluKSB7CisgICMgVmFyaW91cyBmaWxlcyByZWZlcmVuY2VkIGJ5IG11bHRpcGxlIHRhcmdldHMuIHlhc21fZ2VuX2luY2x1ZGVfZGlyIHdhcyBtb3ZlZAorICAjIGZyb20gJHRhcmdldF9nZW5fZGlyL2luY2x1ZGUgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggeDg2aW5zbl9nYXMuYyBhbmQKKyAgIyB4ODZpbnNuX25hc20uYy4gVGhlc2UgZmlsZXMgd2VyZSBwcmV2aW91c2x5IGdlbmVyYXRlZCBkdXJpbmcgdGhlIGJ1aWxkIGJ1dAorICAjIGFyZSBub3cgc2hpcHBlZCBwcmUtZ2VuZXJhdGVkIGJ5IHlhc20uCisgIHlhc21fZ2VuX2luY2x1ZGVfZGlyID0gIiR0YXJnZXRfZ2VuX2Rpci9nZW5faW5jbHVkZSIKKyAgY29uZmlnX21ha2VmaWxlID0gInNvdXJjZS9jb25maWcvTWFrZWZpbGUiCisgIHZlcnNpb25fZmlsZSA9ICJ2ZXJzaW9uLm1hYyIKKworICBpbXBvcnQoIi8vYnVpbGQvY29tcGlsZWRfYWN0aW9uLmduaSIpCisKKyAgY29uZmlnKCJ5YXNtX2NvbmZpZyIpIHsKKyAgICBpbmNsdWRlX2RpcnMgPSBbCisgICAgICAic291cmNlL2NvbmZpZy8kaG9zdF9vcyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbSIsCisgICAgXQorICAgIGRlZmluZXMgPSBbICJIQVZFX0NPTkZJR19IIiBdCisgICAgaWYgKGlzX3Bvc2l4KSB7CisgICAgICBjZmxhZ3MgPSBbICItc3RkPWdudTk5IiBdCisgICAgfQorICB9CisKKyAgZXhlY3V0YWJsZSgiZ2VubWFjcm8iKSB7CisgICAgc291cmNlcyA9IFsKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL3Rvb2xzL2dlbm1hY3JvL2dlbm1hY3JvLmMiLAorICAgIF0KKyAgICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KKyAgICBjb25maWdzICs9IFsKKyAgICAgICI6eWFzbV9jb25maWciLAorICAgICAgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOm5vX2Nocm9taXVtX2NvZGUiLAorICAgIF0KKyAgICBkZXBzID0gWworICAgICAgIi8vYnVpbGQvY29uZmlnOmV4ZV9hbmRfc2hsaWJfZGVwcyIsCisKKyAgICAgICMgRGVmYXVsdCBtYW5pZmVzdCBvbiBXaW5kb3dzIChhIG5vLW9wIGVsc2V3aGVyZSkuCisgICAgICAiLy9idWlsZC93aW46ZGVmYXVsdF9leGVfbWFuaWZlc3QiLAorICAgIF0KKyAgfQorCisgIGV4ZWN1dGFibGUoImdlbm1vZHVsZSIpIHsKKyAgICBzb3VyY2VzID0gWworICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbGlieWFzbS9nZW5tb2R1bGUuYyIsCisgICAgXQorICAgIGNvbmZpZ3MgLT0gWyAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6Y2hyb21pdW1fY29kZSIgXQorICAgIGNvbmZpZ3MgKz0gWworICAgICAgIjp5YXNtX2NvbmZpZyIsCisgICAgICAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6bm9fY2hyb21pdW1fY29kZSIsCisgICAgXQorICAgIGRlcHMgPSBbCisgICAgICAiLy9idWlsZC9jb25maWc6ZXhlX2FuZF9zaGxpYl9kZXBzIiwKKworICAgICAgIyBEZWZhdWx0IG1hbmlmZXN0IG9uIFdpbmRvd3MgKGEgbm8tb3AgZWxzZXdoZXJlKS4KKyAgICAgICIvL2J1aWxkL3dpbjpkZWZhdWx0X2V4ZV9tYW5pZmVzdCIsCisgICAgXQorICB9CisKKyAgZXhlY3V0YWJsZSgiZ2VucGVyZiIpIHsKKyAgICBzb3VyY2VzID0gWworICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vdG9vbHMvZ2VucGVyZi9nZW5wZXJmLmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vdG9vbHMvZ2VucGVyZi9wZXJmZWN0LmMiLAorICAgIF0KKworICAgIGNvbmZpZ3MgLT0gWyAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6Y2hyb21pdW1fY29kZSIgXQorICAgIGNvbmZpZ3MgKz0gWworICAgICAgIjp5YXNtX2NvbmZpZyIsCisgICAgICAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6bm9fY2hyb21pdW1fY29kZSIsCisgICAgXQorCisgICAgIyBNdXN0IGJlIGNvbXBhdGlibGUgd2l0aCB5YXNtX3V0aWxzL3lhc20KKyAgICBjb25maWdzIC09IGNvbmZpZ3NfdG9fZGVsZXRlCisgICAgY29uZmlncyArPSBjb25maWdzX3RvX2FkZAorCisgICAgZGVwcyA9IFsKKyAgICAgICI6eWFzbV91dGlscyIsCisgICAgICAiLy9idWlsZC9jb25maWc6ZXhlX2FuZF9zaGxpYl9kZXBzIiwKKworICAgICAgIyBEZWZhdWx0IG1hbmlmZXN0IG9uIFdpbmRvd3MgKGEgbm8tb3AgZWxzZXdoZXJlKS4KKyAgICAgICIvL2J1aWxkL3dpbjpkZWZhdWx0X2V4ZV9tYW5pZmVzdCIsCisgICAgXQorICB9CisKKyAgIyBVc2VkIGJ5IGJvdGggeWFzbSBhbmQgZ2VucGVyZiBiaW5hcmllcy4KKyAgc3RhdGljX2xpYnJhcnkoInlhc21fdXRpbHMiKSB7CisgICAgc291cmNlcyA9IFsKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL2xpYnlhc20vcGhhc2guYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9saWJ5YXNtL3htYWxsb2MuYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9saWJ5YXNtL3hzdHJkdXAuYyIsCisgICAgXQorCisgICAgY29uZmlncyAtPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpjaHJvbWl1bV9jb2RlIiBdCisgICAgY29uZmlncyArPSBbCisgICAgICAiOnlhc21fY29uZmlnIiwKKyAgICAgICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpub19jaHJvbWl1bV9jb2RlIiwKKyAgICBdCisKKyAgICAjIE11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHlhc20KKyAgICBjb25maWdzIC09IGNvbmZpZ3NfdG9fZGVsZXRlCisgICAgY29uZmlncyArPSBjb25maWdzX3RvX2FkZAorICB9CisKKyAgZXhlY3V0YWJsZSgiZ2Vuc3RyaW5nIikgeworICAgIHNvdXJjZXMgPSBbCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9nZW5zdHJpbmcuYyIsCisgICAgXQorICAgIGNvbmZpZ3MgLT0gWyAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6Y2hyb21pdW1fY29kZSIgXQorICAgIGNvbmZpZ3MgKz0gWworICAgICAgIjp5YXNtX2NvbmZpZyIsCisgICAgICAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6bm9fY2hyb21pdW1fY29kZSIsCisgICAgXQorICAgIGRlcHMgPSBbCisgICAgICAiLy9idWlsZC9jb25maWc6ZXhlX2FuZF9zaGxpYl9kZXBzIiwKKworICAgICAgIyBEZWZhdWx0IG1hbmlmZXN0IG9uIFdpbmRvd3MgKGEgbm8tb3AgZWxzZXdoZXJlKS4KKyAgICAgICIvL2J1aWxkL3dpbjpkZWZhdWx0X2V4ZV9tYW5pZmVzdCIsCisgICAgXQorICB9CisKKyAgZXhlY3V0YWJsZSgiZ2VudmVyc2lvbiIpIHsKKyAgICBzb3VyY2VzID0gWworICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbW9kdWxlcy9wcmVwcm9jcy9uYXNtL2dlbnZlcnNpb24uYyIsCisgICAgXQorICAgIGNvbmZpZ3MgLT0gWyAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6Y2hyb21pdW1fY29kZSIgXQorICAgIGNvbmZpZ3MgKz0gWworICAgICAgIjp5YXNtX2NvbmZpZyIsCisgICAgICAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6bm9fY2hyb21pdW1fY29kZSIsCisgICAgXQorICAgIGRlcHMgPSBbCisgICAgICAiLy9idWlsZC9jb25maWc6ZXhlX2FuZF9zaGxpYl9kZXBzIiwKKworICAgICAgIyBEZWZhdWx0IG1hbmlmZXN0IG9uIFdpbmRvd3MgKGEgbm8tb3AgZWxzZXdoZXJlKS4KKyAgICAgICIvL2J1aWxkL3dpbjpkZWZhdWx0X2V4ZV9tYW5pZmVzdCIsCisgICAgXQorICB9CisKKyAgY29uZmlnKCJyZTJjX3dhcm5pbmdzIikgeworICAgICMgcmUyYyBpcyBtaXNzaW5nIENMT1NFVk9QIGZyb20gb25lIHN3aXRjaC4KKyAgICBpZiAoaXNfY2xhbmcpIHsKKyAgICAgIGNmbGFncyA9IFsKKyAgICAgICAgIyByZTJjIGlzIG1pc3NpbmcgQ0xPU0VWT1AgZnJvbSBvbmUgc3dpdGNoLgorICAgICAgICAiLVduby1zd2l0Y2giLAorCisgICAgICAgICMgcmUyYyBjb250YWlucyBtYW55IHN0YXRpYyBmdW5jdGlvbnMgaW4gaGVhZGVycyAoYmVjYXVzZSBpdCdzCisgICAgICAgICMgYSBDIGxpYnJhcnkgcHJlZGF0aW5nIEM5OS4pCisgICAgICAgICItV25vLXVudXNlZC1mdW5jdGlvbiIsCisgICAgICBdCisgICAgfQorICB9CisKKyAgZXhlY3V0YWJsZSgicmUyYyIpIHsKKyAgICBzb3VyY2VzID0gWworICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vdG9vbHMvcmUyYy9hY3Rpb25zLmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vdG9vbHMvcmUyYy9jb2RlLmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vdG9vbHMvcmUyYy9kZmEuYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS90b29scy9yZTJjL21haW4uYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS90b29scy9yZTJjL21ib19nZXRvcHQuYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS90b29scy9yZTJjL3BhcnNlci5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL3Rvb2xzL3JlMmMvc2Nhbm5lci5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL3Rvb2xzL3JlMmMvc3Vic3RyLmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vdG9vbHMvcmUyYy90cmFuc2xhdGUuYyIsCisgICAgXQorCisgICAgY29uZmlncyAtPSBbICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpjaHJvbWl1bV9jb2RlIiBdCisgICAgY29uZmlncyArPSBbCisgICAgICAiOnlhc21fY29uZmlnIiwKKyAgICAgICIvL2J1aWxkL2NvbmZpZy9jb21waWxlcjpub19jaHJvbWl1bV9jb2RlIiwKKworICAgICAgIyBNdXN0IGJlIGFmdGVyIG5vX2Nocm9taXVtX2NvZGUgZm9yIHdhcm5pbmcgZmxhZ3MgdG8gYmUgb3JkZXJlZAorICAgICAgIyBjb3JyZWN0bHkuCisgICAgICAiOnJlMmNfd2FybmluZ3MiLAorICAgIF0KKyAgICBkZXBzID0gWworICAgICAgIi8vYnVpbGQvY29uZmlnOmV4ZV9hbmRfc2hsaWJfZGVwcyIsCisKKyAgICAgICMgRGVmYXVsdCBtYW5pZmVzdCBvbiBXaW5kb3dzIChhIG5vLW9wIGVsc2V3aGVyZSkuCisgICAgICAiLy9idWlsZC93aW46ZGVmYXVsdF9leGVfbWFuaWZlc3QiLAorICAgIF0KKyAgfQorCisgIGNvbmZpZygieWFzbV93YXJuaW5ncyIpIHsKKyAgICBpZiAoaXNfY2xhbmcpIHsKKyAgICAgIGNmbGFncyA9IFsKKyAgICAgICAgIyByZWczMjY0dHlwZSBpbiB4ODZleHByLmMgaXMgdW51c2VkLgorICAgICAgICAiLVduby11bnVzZWQtbG9jYWwtdHlwZWRlZiIsCisgICAgICBdCisgICAgfSBlbHNlIGlmIChpc19saW51eCkgeworICAgICAgY2ZsYWdzID0gWworICAgICAgICAjIGRvc2V4ZV9vYmpmbXRfb3V0cHV0IGlnbm9yZXMgdGhlIHJldHVybiB2YWx1ZSBvZiBmdHJ1bmNhdGUuCisgICAgICAgICItV25vLXVudXNlZC1yZXN1bHQiLAorICAgICAgXQorICAgIH0KKyAgfQorCisgIGV4ZWN1dGFibGUoInlhc20iKSB7CisgICAgc291cmNlcyA9IFsKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL2Zyb250ZW5kcy95YXNtL3lhc20tb3B0aW9ucy5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL2Zyb250ZW5kcy95YXNtL3lhc20uYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9saWJ5YXNtL2Fzc29jZGF0LmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbGlieWFzbS9iYy1hbGlnbi5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL2xpYnlhc20vYmMtZGF0YS5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL2xpYnlhc20vYmMtaW5jYmluLmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbGlieWFzbS9iYy1vcmcuYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9saWJ5YXNtL2JjLXJlc2VydmUuYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9saWJ5YXNtL2JpdHZlY3QuYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9saWJ5YXNtL2J5dGVjb2RlLmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbGlieWFzbS9lcnJ3YXJuLmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbGlieWFzbS9leHByLmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbGlieWFzbS9maWxlLmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbGlieWFzbS9mbG9hdG51bS5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL2xpYnlhc20vaGFtdC5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL2xpYnlhc20vaW5zbi5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL2xpYnlhc20vaW50bnVtLmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbGlieWFzbS9pbnR0cmVlLmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbGlieWFzbS9saW5lbWFwLmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbGlieWFzbS9tZDUuYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9saWJ5YXNtL21lcmdlc29ydC5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL2xpYnlhc20vc2VjdGlvbi5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL2xpYnlhc20vc3RyY2FzZWNtcC5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL2xpYnlhc20vc3Ryc2VwLmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbGlieWFzbS9zeW1yZWMuYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9saWJ5YXNtL3ZhbHBhcmFtLmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbGlieWFzbS92YWx1ZS5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL21vZHVsZXMvYXJjaC9sYzNiL2xjM2JhcmNoLmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbW9kdWxlcy9hcmNoL2xjM2IvbGMzYmJjLmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbW9kdWxlcy9hcmNoL3g4Ni94ODZhcmNoLmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbW9kdWxlcy9hcmNoL3g4Ni94ODZiYy5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL21vZHVsZXMvYXJjaC94ODYveDg2ZXhwci5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL21vZHVsZXMvYXJjaC94ODYveDg2aWQuYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9tb2R1bGVzL2RiZ2ZtdHMvY29kZXZpZXcvY3YtZGJnZm10LmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbW9kdWxlcy9kYmdmbXRzL2NvZGV2aWV3L2N2LXN5bWxpbmUuYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9tb2R1bGVzL2RiZ2ZtdHMvY29kZXZpZXcvY3YtdHlwZS5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL21vZHVsZXMvZGJnZm10cy9kd2FyZjIvZHdhcmYyLWFyYW5nZXMuYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9tb2R1bGVzL2RiZ2ZtdHMvZHdhcmYyL2R3YXJmMi1kYmdmbXQuYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9tb2R1bGVzL2RiZ2ZtdHMvZHdhcmYyL2R3YXJmMi1pbmZvLmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbW9kdWxlcy9kYmdmbXRzL2R3YXJmMi9kd2FyZjItbGluZS5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL21vZHVsZXMvZGJnZm10cy9udWxsL251bGwtZGJnZm10LmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbW9kdWxlcy9kYmdmbXRzL3N0YWJzL3N0YWJzLWRiZ2ZtdC5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL21vZHVsZXMvbGlzdGZtdHMvbmFzbS9uYXNtLWxpc3RmbXQuYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9tb2R1bGVzL29iamZtdHMvYmluL2Jpbi1vYmpmbXQuYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9tb2R1bGVzL29iamZtdHMvY29mZi9jb2ZmLW9iamZtdC5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL21vZHVsZXMvb2JqZm10cy9jb2ZmL3dpbjY0LWV4Y2VwdC5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL21vZHVsZXMvb2JqZm10cy9kYmcvZGJnLW9iamZtdC5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL21vZHVsZXMvb2JqZm10cy9lbGYvZWxmLW9iamZtdC5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL21vZHVsZXMvb2JqZm10cy9lbGYvZWxmLXg4Ni1hbWQ2NC5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL21vZHVsZXMvb2JqZm10cy9lbGYvZWxmLXg4Ni14MzIuYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9tb2R1bGVzL29iamZtdHMvZWxmL2VsZi14ODYteDg2LmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbW9kdWxlcy9vYmpmbXRzL2VsZi9lbGYuYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9tb2R1bGVzL29iamZtdHMvbWFjaG8vbWFjaG8tb2JqZm10LmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbW9kdWxlcy9vYmpmbXRzL3JkZi9yZGYtb2JqZm10LmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbW9kdWxlcy9vYmpmbXRzL3hkZi94ZGYtb2JqZm10LmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbW9kdWxlcy9wYXJzZXJzL2dhcy9nYXMtcGFyc2UtaW50ZWwuYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9tb2R1bGVzL3BhcnNlcnMvZ2FzL2dhcy1wYXJzZS5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL21vZHVsZXMvcGFyc2Vycy9nYXMvZ2FzLXBhcnNlci5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL21vZHVsZXMvcGFyc2Vycy9uYXNtL25hc20tcGFyc2UuYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9tb2R1bGVzL3BhcnNlcnMvbmFzbS9uYXNtLXBhcnNlci5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL21vZHVsZXMvcHJlcHJvY3MvY3BwL2NwcC1wcmVwcm9jLmMiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbW9kdWxlcy9wcmVwcm9jcy9nYXMvZ2FzLWV2YWwuYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9tb2R1bGVzL3ByZXByb2NzL2dhcy9nYXMtcHJlcHJvYy5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL21vZHVsZXMvcHJlcHJvY3MvbmFzbS9uYXNtLWV2YWwuYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9tb2R1bGVzL3ByZXByb2NzL25hc20vbmFzbS1wcC5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL21vZHVsZXMvcHJlcHJvY3MvbmFzbS9uYXNtLXByZXByb2MuYyIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9tb2R1bGVzL3ByZXByb2NzL25hc20vbmFzbWxpYi5jIiwKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL21vZHVsZXMvcHJlcHJvY3MvcmF3L3Jhdy1wcmVwcm9jLmMiLAorCisgICAgICAjIEZpbGVzIGdlbmVyYXRlZCBieSBjb21waWxlX2dwZXJmCisgICAgICAiJHRhcmdldF9nZW5fZGlyL3g4NmNwdS5jIiwKKyAgICAgICIkdGFyZ2V0X2dlbl9kaXIveDg2cmVndG1vZC5jIiwKKworICAgICAgIyBGaWxlcyBnZW5lcmF0ZWQgYnkgY29tcGlsZV9yZTJjCisgICAgICAiJHRhcmdldF9nZW5fZGlyL2dhcy10b2tlbi5jIiwKKyAgICAgICIkdGFyZ2V0X2dlbl9kaXIvbmFzbS10b2tlbi5jIiwKKworICAgICAgIyBGaWxlIGdlbmVyYXRlZCBieSBjb21waWxlX3JlMmNfbGMzYgorICAgICAgIiR0YXJnZXRfZ2VuX2Rpci9sYzNiaWQuYyIsCisKKyAgICAgICMgRmlsZSBnZW5lcmF0ZWQgYnkgZ2VuZXJhdGVfbW9kdWxlCisgICAgICAiJHRhcmdldF9nZW5fZGlyL21vZHVsZS5jIiwKKyAgICBdCisKKyAgICBjb25maWdzIC09IFsgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOmNocm9taXVtX2NvZGUiIF0KKyAgICBjb25maWdzICs9IFsKKyAgICAgICI6eWFzbV9jb25maWciLAorICAgICAgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOm5vX2Nocm9taXVtX2NvZGUiLAorICAgICAgIi8vYnVpbGQvY29uZmlnL2NvbXBpbGVyOm5vX2luY29tcGF0aWJsZV9wb2ludGVyX3dhcm5pbmdzIiwKKworICAgICAgIyBNdXN0IGJlIGFmdGVyIG5vX2Nocm9taXVtX2NvZGUgZm9yIHdhcm5pbmcgZmxhZ3MgdG8gYmUgb3JkZXJlZAorICAgICAgIyBjb3JyZWN0bHkuCisgICAgICAiOnlhc21fd2FybmluZ3MiLAorICAgIF0KKworICAgICMgRGlzYWJsZSBXUE8gZm9yIHlhc206IGNyYnVnLmNvbS82MDQ4MDgKKyAgICBpZiAoaXNfb2ZmaWNpYWxfYnVpbGQgJiYgZnVsbF93cG9fb25fb2ZmaWNpYWwpIHsKKyAgICAgIGNvbmZpZ3MgLT0gWyAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6ZGVmYXVsdF9vcHRpbWl6YXRpb24iIF0KKyAgICAgIGNvbmZpZ3MgKz0gWyAiLy9idWlsZC9jb25maWcvY29tcGlsZXI6b3B0aW1pemVfbm9fd3BvIiBdCisgICAgfSBlbHNlIHsKKyAgICAgIGNvbmZpZ3MgLT0gY29uZmlnc190b19kZWxldGUKKyAgICAgIGNvbmZpZ3MgKz0gY29uZmlnc190b19hZGQKKyAgICB9CisKKyAgICAjIFlhc20gZ2VuZXJhdGVzIGEgYnVuY2ggb2YgLmMgZmlsZXMgd2hpY2ggaXRzIHNvdXJjZSBmaWxlICNpbmNsdWRlLiBUaGVzZQorICAgICMgYXJlIHBsYWNlZCBpbiB8eWFzbV9nZW5faW5jbHVkZV9kaXJ8LgorICAgIGluY2x1ZGVfZGlycyA9IFsgeWFzbV9nZW5faW5jbHVkZV9kaXIgXQorCisgICAgaWYgKCFpc193aW4pIHsKKyAgICAgIGNmbGFncyA9IFsKKyAgICAgICAgIi1zdGQ9Yzg5IiwKKyAgICAgICAgIi1wZWRhbnRpYyIsCisgICAgICBdCisgICAgfQorCisgICAgIyBUT0RPKGFqd29uZyk6IFRoaXMgc2hvdWxkIHRha2UgbW9zdCBvZiB0aGUgZ2VuZXJhdGVkIG91dHB1dCBhcworICAgICMgaW5wdXRzLgorICAgIGRlcHMgPSBbCisgICAgICAiOmNvbXBpbGVfZ3BlcmYiLAorICAgICAgIjpjb21waWxlX2dwZXJmX2Zvcl9pbmNsdWRlIiwKKyAgICAgICI6Y29tcGlsZV9uYXNtX21hY3JvcyIsCisgICAgICAiOmNvbXBpbGVfbmFzbV92ZXJzaW9uIiwKKyAgICAgICI6Y29tcGlsZV9yZTJjIiwKKyAgICAgICI6Y29tcGlsZV9yZTJjX2xjM2IiLAorICAgICAgIjpjb21waWxlX3dpbjY0X2dhcyIsCisgICAgICAiOmNvbXBpbGVfd2luNjRfbmFzbSIsCisgICAgICAiOmdlbmVyYXRlX2xpY2Vuc2UiLAorICAgICAgIjpnZW5lcmF0ZV9tb2R1bGUiLAorICAgICAgIjpnZW5lcmF0ZV92ZXJzaW9uIiwKKyAgICAgICI6eWFzbV91dGlscyIsCisgICAgICAiLy9idWlsZC9jb25maWc6ZXhlX2FuZF9zaGxpYl9kZXBzIiwKKworICAgICAgIyBEZWZhdWx0IG1hbmlmZXN0IG9uIFdpbmRvd3MgKGEgbm8tb3AgZWxzZXdoZXJlKS4KKyAgICAgICIvL2J1aWxkL3dpbjpkZWZhdWx0X2V4ZV9tYW5pZmVzdCIsCisgICAgXQorICB9CisKKyAgY29tcGlsZWRfYWN0aW9uX2ZvcmVhY2goImNvbXBpbGVfZ3BlcmYiKSB7CisgICAgdG9vbCA9ICI6Z2VucGVyZiIKKyAgICBzb3VyY2VzID0gWworICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbW9kdWxlcy9hcmNoL3g4Ni94ODZjcHUuZ3BlcmYiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbW9kdWxlcy9hcmNoL3g4Ni94ODZyZWd0bW9kLmdwZXJmIiwKKyAgICBdCisKKyAgICBvdXRwdXRzID0gWworICAgICAgIiR0YXJnZXRfZ2VuX2Rpci97e3NvdXJjZV9uYW1lX3BhcnR9fS5jIiwKKyAgICBdCisgICAgYXJncyA9IFsKKyAgICAgICJ7e3NvdXJjZX19IiwKKyAgICAgIHJlYmFzZV9wYXRoKHRhcmdldF9nZW5fZGlyLCByb290X2J1aWxkX2RpcikgKyAiL3t7c291cmNlX25hbWVfcGFydH19LmMiLAorICAgIF0KKyAgfQorCisgICMgVGhpcyBkaWZmZXJzIGZyb20gfGNvbXBpbGVfZ3BlcmZ8IGluIHdoZXJlIGl0IHBsYWNlcyBpdCBvdXRwdXQgZmlsZXMuCisgIGNvbXBpbGVkX2FjdGlvbl9mb3JlYWNoKCJjb21waWxlX2dwZXJmX2Zvcl9pbmNsdWRlIikgeworICAgIHRvb2wgPSAiOmdlbnBlcmYiCisgICAgc291cmNlcyA9IFsKKyAgICAgICMgTWFrZSBzdXJlIHRoZSBnZW5lcmF0ZWQgZ3BlcmYgZmlsZXMgaW4gJHRhcmdldF9nZW5fZGlyIGFyZSBzeW5jZWQgd2l0aAorICAgICAgIyB0aGUgb3V0cHV0cyBmb3IgdGhlIHJlbGF0ZWQgZ2VuZXJhdGVfKl9pbnNuIGFjdGlvbnMgaW4gdGhlCisgICAgICAjIGdlbmVyYXRlX2ZpbGVzIHRhcmdldCBiZWxvdy4KKyAgICAgICMKKyAgICAgICMgVGhlIG91dHB1dCBmb3IgdGhlc2UgdHdvIGFyZSAjaW5jbHVkZWQgYnkKKyAgICAgICMgICBzb3VyY2UvcGF0Y2hlZC15YXNtL21vZHVsZXMvYXJjaC94ODYveDg2aWQuYworICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20veDg2aW5zbl9nYXMuZ3BlcmYiLAorICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20veDg2aW5zbl9uYXNtLmdwZXJmIiwKKyAgICBdCisKKyAgICBvdXRwdXRzID0gWworICAgICAgIiR5YXNtX2dlbl9pbmNsdWRlX2Rpci97e3NvdXJjZV9uYW1lX3BhcnR9fS5jIiwKKyAgICBdCisgICAgYXJncyA9IFsKKyAgICAgICJ7e3NvdXJjZX19IiwKKyAgICAgIHJlYmFzZV9wYXRoKHlhc21fZ2VuX2luY2x1ZGVfZGlyLCByb290X2J1aWxkX2RpcikgKworICAgICAgICAgICIve3tzb3VyY2VfbmFtZV9wYXJ0fX0uYyIsCisgICAgXQorICB9CisKKyAgdGVtcGxhdGUoImNvbXBpbGVfbWFjcm8iKSB7CisgICAgY29tcGlsZWRfYWN0aW9uKHRhcmdldF9uYW1lKSB7CisgICAgICB0b29sID0gIjpnZW5tYWNybyIKKworICAgICAgIyBPdXRwdXQgI2luY2x1ZGVkIGJ5IHNvdXJjZS9wYXRjaGVkLXlhc20vZnJvbnRlbmRzL3lhc20veWFzbS5jLgorICAgICAgaW5wdXRzID0gaW52b2tlci5zb3VyY2VzCisgICAgICBvdXRwdXRzID0gaW52b2tlci5vdXRwdXRzCisgICAgICBhcmdzID0gWworICAgICAgICByZWJhc2VfcGF0aChvdXRwdXRzWzBdLCByb290X2J1aWxkX2RpciksCisgICAgICAgIGludm9rZXIubWFjcm9fdmFybmFtZSwKKyAgICAgICAgcmViYXNlX3BhdGgoaW5wdXRzWzBdLCByb290X2J1aWxkX2RpciksCisgICAgICBdCisgICAgICBpZiAoZGVmaW5lZChpbnZva2VyLmRlcHMpKSB7CisgICAgICAgIGRlcHMgPSBpbnZva2VyLmRlcHMKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBjb21waWxlX21hY3JvKCJjb21waWxlX25hc21fbWFjcm9zIikgeworICAgICMgT3V0cHV0ICNpbmNsdWRlZCBieQorICAgICMgICBzb3VyY2UvcGF0Y2hlZC15YXNtL21vZHVsZXMvcHJlcHJvY3MvbmFzbS9uYXNtLXBhcnNlci5jCisgICAgc291cmNlcyA9IFsKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL21vZHVsZXMvcGFyc2Vycy9uYXNtL25hc20tc3RkLm1hYyIsCisgICAgXQorICAgIG91dHB1dHMgPSBbCisgICAgICAiJHlhc21fZ2VuX2luY2x1ZGVfZGlyL25hc20tbWFjcm9zLmMiLAorICAgIF0KKyAgICBtYWNyb192YXJuYW1lID0gIm5hc21fc3RhbmRhcmRfbWFjIgorICB9CisKKyAgY29tcGlsZV9tYWNybygiY29tcGlsZV9uYXNtX3ZlcnNpb24iKSB7CisgICAgIyBPdXRwdXQgI2luY2x1ZGVkIGJ5CisgICAgIyAgIHNvdXJjZS9wYXRjaGVkLXlhc20vbW9kdWxlcy9wcmVwcm9jcy9uYXNtL25hc20tcHJlcHJvYy5jCisgICAgc291cmNlcyA9IFsKKyAgICAgICIkdGFyZ2V0X2dlbl9kaXIvJHZlcnNpb25fZmlsZSIsCisgICAgXQorICAgIG91dHB1dHMgPSBbCisgICAgICAiJHlhc21fZ2VuX2luY2x1ZGVfZGlyL25hc20tdmVyc2lvbi5jIiwKKyAgICBdCisgICAgbWFjcm9fdmFybmFtZSA9ICJuYXNtX3ZlcnNpb25fbWFjIgorICAgIGRlcHMgPSBbCisgICAgICAiOmdlbmVyYXRlX3ZlcnNpb24iLAorICAgIF0KKyAgfQorCisgIGNvbXBpbGVfbWFjcm8oImNvbXBpbGVfd2luNjRfZ2FzIikgeworICAgICMgT3V0cHV0ICNpbmNsdWRlZCBieSBzb3VyY2UvcGF0Y2hlZC15YXNtL2Zyb250ZW5kcy95YXNtL3lhc20uYy4KKyAgICBzb3VyY2VzID0gWworICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbW9kdWxlcy9vYmpmbXRzL2NvZmYvd2luNjQtZ2FzLm1hYyIsCisgICAgXQorICAgIG91dHB1dHMgPSBbCisgICAgICAiJHlhc21fZ2VuX2luY2x1ZGVfZGlyL3dpbjY0LWdhcy5jIiwKKyAgICBdCisgICAgbWFjcm9fdmFybmFtZSA9ICJ3aW42NF9nYXNfc3RkbWFjIgorICB9CisKKyAgY29tcGlsZV9tYWNybygiY29tcGlsZV93aW42NF9uYXNtIikgeworICAgICMgT3V0cHV0ICNpbmNsdWRlZCBieSBzb3VyY2UvcGF0Y2hlZC15YXNtL2Zyb250ZW5kcy95YXNtL3lhc20uYy4KKyAgICBzb3VyY2VzID0gWworICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vbW9kdWxlcy9vYmpmbXRzL2NvZmYvd2luNjQtbmFzbS5tYWMiLAorICAgIF0KKyAgICBvdXRwdXRzID0gWworICAgICAgIiR5YXNtX2dlbl9pbmNsdWRlX2Rpci93aW42NC1uYXNtLmMiLAorICAgIF0KKyAgICBtYWNyb192YXJuYW1lID0gIndpbjY0X25hc21fc3RkbWFjIgorICB9CisKKyAgY29tcGlsZWRfYWN0aW9uX2ZvcmVhY2goImNvbXBpbGVfcmUyYyIpIHsKKyAgICB0b29sID0gIjpyZTJjIgorICAgIHNvdXJjZXMgPSBbCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9tb2R1bGVzL3BhcnNlcnMvZ2FzL2dhcy10b2tlbi5yZSIsCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9tb2R1bGVzL3BhcnNlcnMvbmFzbS9uYXNtLXRva2VuLnJlIiwKKyAgICBdCisgICAgb3V0cHV0cyA9IFsKKyAgICAgICIkdGFyZ2V0X2dlbl9kaXIve3tzb3VyY2VfbmFtZV9wYXJ0fX0uYyIsCisgICAgXQorICAgIGFyZ3MgPSBbCisgICAgICAiLWIiLAorICAgICAgIi1vIiwKKyAgICAgIHJlYmFzZV9wYXRoKHRhcmdldF9nZW5fZGlyLCByb290X2J1aWxkX2RpcikgKyAiL3t7c291cmNlX25hbWVfcGFydH19LmMiLAorICAgICAgInt7c291cmNlfX0iLAorICAgIF0KKyAgfQorCisgICMgVGhpcyBjYWxsIGRvZXNuJ3QgZml0IGludG8gdGhlIHJlMmMgdGVtcGxhdGUgYWJvdmUuCisgIGNvbXBpbGVkX2FjdGlvbigiY29tcGlsZV9yZTJjX2xjM2IiKSB7CisgICAgdG9vbCA9ICI6cmUyYyIKKyAgICBpbnB1dHMgPSBbCisgICAgICAic291cmNlL3BhdGNoZWQteWFzbS9tb2R1bGVzL2FyY2gvbGMzYi9sYzNiaWQucmUiLAorICAgIF0KKyAgICBvdXRwdXRzID0gWworICAgICAgIiR0YXJnZXRfZ2VuX2Rpci9sYzNiaWQuYyIsCisgICAgXQorICAgIGFyZ3MgPSBbCisgICAgICAiLXMiLAorICAgICAgIi1vIiwKKyAgICAgIHJlYmFzZV9wYXRoKG91dHB1dHNbMF0sIHJvb3RfYnVpbGRfZGlyKSwKKyAgICAgIHJlYmFzZV9wYXRoKGlucHV0c1swXSwgcm9vdF9idWlsZF9kaXIpLAorICAgIF0KKyAgfQorCisgIGNvbXBpbGVkX2FjdGlvbigiZ2VuZXJhdGVfbGljZW5zZSIpIHsKKyAgICB0b29sID0gIjpnZW5zdHJpbmciCisKKyAgICAjIE91dHB1dCAjaW5jbHVkZWQgYnkgc291cmNlL3BhdGNoZWQteWFzbS9mcm9udGVuZHMveWFzbS95YXNtLmMuCisgICAgaW5wdXRzID0gWworICAgICAgInNvdXJjZS9wYXRjaGVkLXlhc20vQ09QWUlORyIsCisgICAgXQorICAgIG91dHB1dHMgPSBbCisgICAgICAiJHlhc21fZ2VuX2luY2x1ZGVfZGlyL2xpY2Vuc2UuYyIsCisgICAgXQorICAgIGFyZ3MgPSBbCisgICAgICAibGljZW5zZV9tc2ciLAorICAgICAgcmViYXNlX3BhdGgob3V0cHV0c1swXSwgcm9vdF9idWlsZF9kaXIpLAorICAgICAgcmViYXNlX3BhdGgoaW5wdXRzWzBdLCByb290X2J1aWxkX2RpciksCisgICAgXQorICB9CisKKyAgY29tcGlsZWRfYWN0aW9uKCJnZW5lcmF0ZV9tb2R1bGUiKSB7CisgICAgdG9vbCA9ICI6Z2VubW9kdWxlIgorICAgIGlucHV0cyA9IFsKKyAgICAgICJzb3VyY2UvcGF0Y2hlZC15YXNtL2xpYnlhc20vbW9kdWxlLmluIiwKKyAgICAgIGNvbmZpZ19tYWtlZmlsZSwKKyAgICBdCisgICAgb3V0cHV0cyA9IFsKKyAgICAgICIkdGFyZ2V0X2dlbl9kaXIvbW9kdWxlLmMiLAorICAgIF0KKyAgICBhcmdzID0gWworICAgICAgcmViYXNlX3BhdGgoaW5wdXRzWzBdLCByb290X2J1aWxkX2RpciksCisgICAgICByZWJhc2VfcGF0aChjb25maWdfbWFrZWZpbGUsIHJvb3RfYnVpbGRfZGlyKSwKKyAgICAgIHJlYmFzZV9wYXRoKG91dHB1dHNbMF0sIHJvb3RfYnVpbGRfZGlyKSwKKyAgICBdCisgIH0KKworICBjb21waWxlZF9hY3Rpb24oImdlbmVyYXRlX3ZlcnNpb24iKSB7CisgICAgdG9vbCA9ICI6Z2VudmVyc2lvbiIKKyAgICBvdXRwdXRzID0gWworICAgICAgIiR0YXJnZXRfZ2VuX2Rpci8kdmVyc2lvbl9maWxlIiwKKyAgICBdCisgICAgYXJncyA9IFsgcmViYXNlX3BhdGgob3V0cHV0c1swXSwgcm9vdF9idWlsZF9kaXIpIF0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkveWFzbS9DSFJPTUlVTS5kaWZmIGIvdGhpcmRfcGFydHkveWFzbS9DSFJPTUlVTS5kaWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMDM2ZjIKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS95YXNtL0NIUk9NSVVNLmRpZmYKQEAgLTAsMCArMSw4MSBAQAorZGlmZiAtLWdpdCBhL2Zyb250ZW5kcy90YXNtL3Rhc20uYyBiL2Zyb250ZW5kcy90YXNtL3Rhc20uYworaW5kZXggNTg5NTRiNi4uNTY4ZjQ3OCAxMDA2NDQKKy0tLSBhL2Zyb250ZW5kcy90YXNtL3Rhc20uYworKysrIGIvZnJvbnRlbmRzL3Rhc20vdGFzbS5jCitAQCAtMjI4LDcgKzIyOCw2IEBAIHN0YXRpYyBvcHRfb3B0aW9uIG9wdGlvbnNbXSA9CisgLyogdmVyc2lvbiBtZXNzYWdlICovCisgLypAb2JzZXJ2ZXJAKi8gc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb25fbXNnW10gPSB7CisgICAgIFBBQ0tBR0VfU1RSSU5HLAorLSAgICAiQ29tcGlsZWQgb24gIiBfX0RBVEVfXyAiLiIsCisgICAgICJDb3B5cmlnaHQgKGMpIDIwMDEtMjAxMCBQZXRlciBKb2huc29uIGFuZCBvdGhlciBZYXNtIGRldmVsb3BlcnMuIiwKKyAgICAgIlJ1biB5YXNtIC0tbGljZW5zZSBmb3IgbGljZW5zaW5nIG92ZXJ2aWV3IGFuZCBzdW1tYXJ5LiIKKyB9OworZGlmZiAtLWdpdCBhL2Zyb250ZW5kcy95YXNtL3lhc20uYyBiL2Zyb250ZW5kcy95YXNtL3lhc20uYworaW5kZXggZmY0YzU5ZS4uMDE1YWU4ZCAxMDA2NDQKKy0tLSBhL2Zyb250ZW5kcy95YXNtL3lhc20uYworKysrIGIvZnJvbnRlbmRzL3lhc20veWFzbS5jCitAQCAtMjE3LDcgKzIxNyw2IEBAIHN0YXRpYyBvcHRfb3B0aW9uIG9wdGlvbnNbXSA9CisgLyogdmVyc2lvbiBtZXNzYWdlICovCisgLypAb2JzZXJ2ZXJAKi8gc3RhdGljIGNvbnN0IGNoYXIgKnZlcnNpb25fbXNnW10gPSB7CisgICAgIFBBQ0tBR0VfU1RSSU5HLAorLSAgICAiQ29tcGlsZWQgb24gIiBfX0RBVEVfXyAiLiIsCisgICAgICJDb3B5cmlnaHQgKGMpIDIwMDEtMjAxNCBQZXRlciBKb2huc29uIGFuZCBvdGhlciBZYXNtIGRldmVsb3BlcnMuIiwKKyAgICAgIlJ1biB5YXNtIC0tbGljZW5zZSBmb3IgbGljZW5zaW5nIG92ZXJ2aWV3IGFuZCBzdW1tYXJ5LiIKKyB9OworZGlmZiAtLWdpdCBhL2xpYnlhc20vZ2VubW9kdWxlLmMgYi9saWJ5YXNtL2dlbm1vZHVsZS5jCitpbmRleCA4NjdkOTNhLi4wMjdlMmZlIDEwMDY0NAorLS0tIGEvbGlieWFzbS9nZW5tb2R1bGUuYworKysrIGIvbGlieWFzbS9nZW5tb2R1bGUuYworQEAgLTU4LDkgKzU4LDE0IEBAIG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKKyAgICAgaW5jbHVkZSAqaW5jOworICAgICBpbnQgaXNhbSA9IDA7CisgICAgIGludCBsaW5lY29udCA9IDA7CistCistICAgIGlmIChhcmdjICE9IDMpIHsKKy0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIDxtb2R1bGUuaW4+IDxNYWtlZmlsZVsuYW1dPlxuIiwgYXJndlswXSk7CisrICAgIGNoYXIgKm91dGZpbGU7CisrCisrICAgIGlmIChhcmdjID09IDMpIHsKKysgICAgICAgIG91dGZpbGUgPSBPVVRQVVQ7CisrICAgIH0gZWxzZSBpZiAoYXJnYyA9PSA0KSB7CisrICAgICAgICBvdXRmaWxlID0gYXJndlszXTsKKysgICAgfSBlbHNlIHsKKysgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIDxtb2R1bGUuaW4+IDxNYWtlZmlsZVsuYW1dPiBbPG91dGZpbGU+XVxuIiwgYXJndlswXSk7CisgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICB9CisgCitAQCAtMTY3LDEwICsxNzIsMTAgQEAga2VlcGdvaW5nOgorICAgICAgICAgZmNsb3NlKGluKTsKKyAgICAgfQorIAorLSAgICBvdXQgPSBmb3BlbihPVVRQVVQsICJ3dCIpOworKyAgICBvdXQgPSBmb3BlbihvdXRmaWxlLCAid3QiKTsKKyAKKyAgICAgaWYgKCFvdXQpIHsKKy0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IG9wZW4gYCVzJy5cbiIsIE9VVFBVVCk7CisrICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIGAlcycuXG4iLCBvdXRmaWxlKTsKKyAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgIH0KKyAKK0BAIC0xODEsNyArMTg2LDcgQEAga2VlcGdvaW5nOgorICAgICBpZiAoIWluKSB7CisgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIGAlcycuXG4iLCBhcmd2WzFdKTsKKyAgICAgICAgIGZjbG9zZShvdXQpOworLSAgICAgICAgcmVtb3ZlKE9VVFBVVCk7CisrICAgICAgICByZW1vdmUob3V0ZmlsZSk7CisgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICB9CisgCitkaWZmIC0tZ2l0IGEvdG9vbHMvZ2VucGVyZi9wZXJmZWN0LmMgYi90b29scy9nZW5wZXJmL3BlcmZlY3QuYworaW5kZXggYTlhMTRjMC4uZTQ1ZjljNSAxMDA2NDQKKy0tLSBhL3Rvb2xzL2dlbnBlcmYvcGVyZmVjdC5jCisrKysgYi90b29scy9nZW5wZXJmL3BlcmZlY3QuYworQEAgLTU2Myw3ICs1NjMsNyBAQCBzdGF0aWMgaW50IHBlcmZlY3QoCisgICAgICAgICBpZiAoIWF1Z21lbnQodGFiYiwgdGFiaCwgdGFicSwgYmxlbiwgc2NyYW1ibGUsIHNtYXgsICZ0YWJiW2ldLCBua2V5cywgCisgICAgICAgICAgICAgICAgICAgICAgaSsxLCBmb3JtKSkKKyAgICAgICAgIHsKKy0gICAgICAgICAgZnByaW50ZihzdGRlcnIsICJmYWlsIHRvIG1hcCBncm91cCBvZiBzaXplICVsZCBmb3IgdGFiIHNpemUgJWxkXG4iLCBqLCBibGVuKTsKKysgICAgICAgICAgLyogRG8gbm90IHByaW50IGFuIGVycm9yLiBUaGUgY2FsbGVyIG1heSByZXRyeSB3aXRoIGEgbGFyZ2VyIHRhYmxlLiAqLworICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICB9CisgCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS95YXNtL1JFQURNRS5wZGZpdW0gYi90aGlyZF9wYXJ0eS95YXNtL1JFQURNRS5wZGZpdW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFkYTMxMgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3lhc20vUkVBRE1FLnBkZml1bQpAQCAtMCwwICsxLDEyNiBAQAorTmFtZTogeWFzbQorVVJMOiBodHRwOi8vd3d3LnRvcnRhbGwubmV0L3Byb2plY3RzL3lhc20vCitWZXJzaW9uOiAxLjMuMAorTGljZW5zZTogMi1jbGF1c2Ugb3IgMy1jbGF1c2UgQlNEIGxpY2Vuc2VkLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgYml0dmVjdCwgd2hpY2ggaXMgdHJpcGxlLWxpY2Vuc2VkIHVuZGVyIHRoZSBBcnRpc3RpYyBsaWNlbnNlLCBHUEwsIGFuZCBMR1BMCitMaWNlbnNlIEZpbGU6IHNvdXJjZS9wYXRjaGVkLXlhc20vQ09QWUlORworTGljZW5zZSBBbmRyb2lkIENvbXBhdGlibGU6IHllcworU2VjdXJpdHkgQ3JpdGljYWw6IG5vCisKK1NvdXJjZTogaHR0cDovL3d3dy50b3J0YWxsLm5ldC9wcm9qZWN0cy95YXNtL3JlbGVhc2VzL3lhc20tMS4zLjAudGFyLmd6CitTSEEtNTEyOiA1NzJkM2I0NTU2OGIxMGY1OGU0OGYxMTg4YzJkNmJjYmRkMTY0MjljOGFmYWNjYzhjNmQzNzg1OWI0NTYzNWUxCisgICAgICAgICAwNjg4NWQ2NzllNDFkMGJlZTc4YzIzODIyMTA4YzdhZTc1YWE3NDc1ZWVkNWJhNTgwNTdlMGE2ZmUxYjY4NjQ1CisKK1dpdGggdGhlc2UgcGF0Y2hlcyBhcHBsaWVkOgorKiBDSFJPTUlVTS5kaWZmOiBDb21iaW5lZCBwYXRjaCBmcm9tIENocm9taXVtLgorICBTZWUgQ2hyb21pdW0ncyB0aGlyZF9wYXJ0eS95YXNtL1JFQURNRS5jaHJvbWl1bSBmb3IgZGV0YWlscy4KKworCitTZWUgYWxzbyB0aGUgQlVJTEQuZ24gZmlsZSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgeWFzbSBidWlsZCBwcm9jZXNzLgorCitJbnN0cnVjdGlvbnMgZm9yIHJlY3JlYXRpbmcgdGhlIEJVSUxELmduIGZpbGUuCisgIDEpIFVwZGF0ZSB5YXNtIGFuZCByZS1hcHBseSB0aGUgcGF0Y2hlcy4KKworICAyKSBNYWtlIGEgY29weSBvZiBzb3VyY2UgaW4gYSBkaWZmZXJlbnQgZGlyZWN0b3J5IChlLmcuLCAvdG1wL3lhc21fYnVpbGQpIGFuZAorICAgICBydW4gY29uZmlndXJlLiBVc2luZyBhbm90aGVyIGRpcmVjdG9yeSB3aWxsIGtlZXAgdGhlIHNvdXJjZSB0cmVlIGNsZWFuLiBBbgorICAgICBvdXQtb2YtdHJlZSBidWlsZCBkb2VzIG5vdCBhcHBlYXIgdG8gd29yayByZWxpYWJseSBhcyBvZiB5YXNtIDEuMy4wLgorCisgIDMpIE5leHQsIGNhcHR1cmUgYWxsIHRoZSBvdXRwdXQgZnJvbSBhIGJ1aWxkIG9mIHlhc20uICBXZSB3aWxsIHVzZSB0aGUgYnVpbGQKKyAgICAgbG9nIGFzIGEgcmVmZXJlbmNlIGZvciBCVUlMRC5nbi4KKworICAgICAgIG1ha2UgeWFzbSA+IHlhc21fYnVpbGRfbG9nIDI+IHlhc21fYnVpbGRfZXJyCisKKyAgNCkgQ2hlY2sgeWFzbV9idWlsZF9lcnIgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgYW5vbWFsaWVzIGJleW9uZCB5YXNtJ3MKKyAgICAgY29tcGlsZXIgd2FybmluZ3MuCisKKyAgNSkgR3JhYiB0aGUgZ2VuZXJhdGVkIGxpYnlhc20tc3RkaW50LmggYW5kIGNvbmZpZy5oIGFuZCBwdXQgaW50byB0aGUgY29ycmVjdAorICAgICBwbGF0Zm9ybSBsb2NhdGlvbi4KKworICAgICAgIHNyYy90aGlyZF9wYXJ0eS95YXNtL3NvdXJjZS9jb25maWcvW3BsYXRmb3JtXQorCisgICAgIEZvciBhbmRyb2lkIHBsYXRmb3JtLCBjb3B5IHRoZSBmaWxlcyBnZW5lcmF0ZWQgZm9yIGxpbnV4LCBidXQgbWFrZSBzdXJlCisgICAgIHRoYXQgRU5BQkxFX05MUyBpcyBub3QgZGVmaW5lZCB0byBhbGxvdyBtYWMgaG9zdCBjb21waWxlcyB0byB3b3JrLiAgRm9yCisgICAgIGlvcywgY29weSB0aGUgZmlsZXMgZnJvbSBtYWMuICBGb3Igd2luLCBjb3B5IHRoZSBsaWJ5YXNtLXN0ZGludC5oIGZyb20KKyAgICAgbGludXggYW5kIGZpeCB1cCBjb25maWcuaC4KKworICAgICBGaW5kIHRoZSBZQVNNX01PRFVMRVMgbGluZSBpbiB0aGUgZ2VuZXJhdGVkIE1ha2VmaWxlIGFuZCB1cGRhdGUKKyAgICAgc3JjL3RoaXJkX3BhcnR5L3lhc20vc291cmNlL2NvbmZpZy9NYWtlZmlsZS4gSXQgaXMgbmVlZGVkIGJ5IHRoZQorICAgICAiZ2VubW9kdWxlIiBzdWJwcm9ncmFtIGFzIGlucHV0IGZvciBjcmVhdGluZyB0aGUgYXZhaWxhYmxlIG1vZHVsZXMgbGlzdC4KKworICA2KSBNYWtlIHN1cmUgYWxsIHRoZSBzdWJwcm9ncmFtcyBhcmUgcmVwcmVzZW50ZWQgaW4gQlVJTEQuZ24uCisKKyAgICAgICBncmVwIC13IGdjYyB5YXNtX2J1aWxkX2xvZyAgfAorICAgICAgIGdyZXAgLXYgJyAtREhBVkVfQ09ORklHX0ggJworCisgICAgIFRoZSB5YXNtIGJ1aWxkIGNyZWF0ZXMgYSBidW5jaCBvZiBzdWJwcm9ncmFtcyB0aGF0IGluLXR1cm4gZ2VuZXJhdGUKKyAgICAgbW9yZSAuYyBmaWxlcyBpbiB0aGUgYnVpbGQuIEx1Y2tpbHkgdGhlIGNvbW1hbmRzIHRvIGdlbmVyYXRlIHRoZQorICAgICBzdWJwcm9ncmFtIGRvIG5vdCBoYXZlIC1ESEFWRV9DT05GSUdfSCBhcyBhIGNmbGFnLgorCisgICAgIEZyb20gdGhpcyBsaXN0LCBtYWtlIHN1cmUgYWxsIHRoZSBzdWJwcm9ncmFtcyB0aGF0IGFyZSBidWlsZCBoYXZlCisgICAgIGFwcHJvcHJpYXRlIHRhcmdldHMgaW4gdGhlIEJVSUxELmduLgorCisgICAgIFlvdSB3aWxsIG5vdGljZSwgd2hlbiB5b3UgZ2V0IHRvIHRoZSBuZXh0IHN0ZXAsIHRoYXQgdGhlcmUgYXJlIHNvbWUKKyAgICAgLmMgc291cmNlIGZpbGVzIHRoYXQgYXJlIGNvbXBpbGVkIGJvdGggZm9yIHlhc20sIGFuZCBmb3IgZ2VucGVyZi4KKworICAgICBUaG9zZSBzaG91bGQgZ28gaW50byB0aGUgeWFzbV91dGlscyB0YXJnZXQgc28gdGhhdCB0aGV5IGNhbiBiZSBzaGFyZWQgYnkKKyAgICAgdGhlIGdlbnBlcmYgYW5kIHlhc20gdGFyZ2V0cy4gRmluZCB0aGUgZmlsZXMgdXNlZCBieSBnZW5wZXJmIGJ5IGFwcGVuZGluZworCisgICAgICAgfCBncmVwICdncC0nCisKKyAgICAgdG8gdGhlIGNvbW1hbmQgYWJvdmUuIFRoZW4gZ3JlcCBmb3IgdGhlbSB3aXRob3V0IHRoZSAnZ3AtJyBwcmVmaXggdG8gc2VlIGlmCisgICAgIHRoZXkgYXJlIHVzZWQgaW4geWFzbSBhcyB3ZWxsLgorCisgIDcpIEZpbmQgYWxsIHRoZSBzb3VyY2UgZmlsZXMgdXNlZCB0byBidWlsZCB5YXNtIHByb3Blci4KKworICAgICAgIGdyZXAgLXcgZ2NjIHlhc21fYnVpbGRfbG9nICB8CisgICAgICAgZ3JlcCAnIC1ESEFWRV9DT05GSUdfSCAnIHwKKyAgICAgICBzZWQgLWUgJ3MvWyZcXF0qJC8vJyB8ICAjIFJlbW92ZSBhbnkgdHJhaWxpbmcgJyYmJ3MgYW5kICdcJ3MuCisgICAgICAgYXdrICd7cHJpbnQgJE5GIH0nIHwKKyAgICAgICBzZWQgLWUgInMvJ1wuXC8nXGAvLyIgfCAgIyBSZW1vdmVzIHNvbWUgZ2FyYmFnZSBmcm9tIHRoZSBidWlsZCBsaW5lLgorICAgICAgIHNvcnQgLXUgfAorICAgICAgIHNlZCAtZSAncy9cKC4qXCkvICAgICAgInNvdXJjZVwvcGF0Y2hlZC15YXNtXC9cMSIsLycKKworICAgICBSZXZlcnNpbmcgdGhlIC1ESEFWRV9DT05GSUdfSCBmaWx0ZXIgZnJvbSB0aGUgY29tbWFuZCBhYm92ZSBzaG91bGQKKyAgICAgbGlzdCB0aGUgY29tcGlsZSBsaW5lcyBmb3IgeWFzbSBwcm9wZXIuCisKKyAgICAgVGhpcyBzaG91bGQgZ2V0IHlvdSBjbG9zZSwgYnV0IHlvdSB3aWxsIG5lZWQgdG8gbWFudWFsbHkgZXhhbWluZSB0aGlzCisgICAgIGxpc3QuICBIb3dldmVyLCBzb21lIG9mIHRoZSBidWlsdCBwcm9kdWN0cyBhcmUgc3RpbGwgaW5jbHVkZWQgaW4gdGhlCisgICAgIGNvbW1hbmQgYWJvdmUuICBHZW5lcmFsbHksIGlmIHRoZSBzb3VyY2UgZmlsZSBpcyBpbiB0aGUgcm9vdCBkaXJlY3RvcnksCisgICAgIGl0J3MgYSBnZW5lcmF0ZWQgZmlsZS4gIEFsc28gcmVtb3ZlIHRoZSBzb3VyY2VzIGluIHRoZSB5YXNtX3V0aWxzIHRhcmdldC4KKworICAgICBJbnNwZWN0IHRoZSBjdXJyZW50IEJVSUxELmduIGZvciBhIGxpc3Qgb2YgdGhlIHN1YnByb2dyYW1zIGFuZCB0aGVpcgorICAgICBvdXRwdXRzLgorCisgICAgIFVwZGF0ZSB0aGUgc291cmNlcyBsaXN0IGluIHRoZSB5YXNtIHRhcmdldCBhY2NvcmRpbmdseS4gIFJlYWQgc3RlcCAjOQorICAgICBhcyB3ZWxsIGlmIHlvdSB1cGRhdGUgdGhlIHNvdXJjZSBsaXN0IHRvIGF2b2lkIHByb2JsZW1zLgorCisgIDgpIFVwZGF0ZSB0aGUgYWN0aW9ucyBmb3IgZWFjaCBvZiB0aGUgc3VicHJvZ3JhbXMuCisKKyAgICAgSGVyZSBpcyB0aGUgcmVhbCBmdW4uICBGb3IgZWFjaCBzdWJwcm9ncmFtIGNyZWF0ZWQsIHlvdSB3aWxsIG5lZWQgdG8KKyAgICAgdXBkYXRlIHRoZSBhY3Rpb25zIGFuZCBydWxlcyBpbiBCVUlMRC5nbiB0aGF0IGludm9rZSB0aGUgc3VicHJvZ3JhbSB0bworICAgICBnZW5lcmF0ZSB0aGUgZmlsZXMgbmVlZGVkIGJ5IHRoZSByZXN0IG9mIHRoZSBidWlsZC4KKworICAgICBJIGRvbid0IGhhdmUgYW55IGdvb2Qgc3VjY2luY3QgaW5zdHJ1Y3Rpb25zIGZvciB0aGlzLiAgR3JlcCB0aGUgYnVpbGQKKyAgICAgbG9nIGZvciBlYWNoIHN1YnByb2dyYW0gaW52b2NhdGlvbiAoZWcuLCAiLi9nZW52ZXJzaW9uIiksIGxvb2sgYXQKKyAgICAgaXRzIGNvbW1hbmQgaW5wdXRzIGFuZCBvdXRwdXQsIHRoZW4gdmVyaWZ5IG91ciBCVUlMRC5nbiBkb2VzIHNvbWV0aGluZworICAgICBzaW1pbGFyLgorCisgICAgIFRoZSBnb29kIG5ld3MgaXMgdGhpbmdzIGxpa2VseSBvbmx5IGxpbmsgb3IgY29tcGlsZSBpZiB0aGlzIGlzIGRvbmUKKyAgICAgcmlnaHQgc28geW91J2xsIGtub3cgaWYgdGhlcmUgaXMgYSBwcm9ibGVtLgorCisgICAgIEFnYWluLCByZWZlciB0byB0aGUgZXhpc3RpbmcgQlVJTEQuZ24gZm9yIGEgZ3VpZGUgdG8gaG93IHRoZSBnZW5lcmF0ZWQKKyAgICAgZmlsZXMgYXJlIHVzZWQuCisKKyAgICAgSGVyZSBhcmUgYSBmZXcgZ290Y2hhczoKKyAgICAgICAxKSBnZW5tb2R1bGUsIGJ5IGRlZmF1bHQsIHdyaXRlcyBtb2R1bGUuYyBpbnRvIHRoZSBjdXJyZW50CisgICAgICAgICAgZGlyZWN0b3J5LiAgVGhpcyBkb2VzIG5vdCBwbGF5IG5pY2VseSB3aXRoIGduLiAgV2UgaGF2ZSBhIHBhdGNoCisgICAgICAgICAgdG8gYWxsb3cgc3BlY2lmeWluZyBhIHNwZWNpZmljIG91dHB1dCBmaWxlLgorCisgICAgICAgMikgTW9zdCBvZiB0aGUgZ2VuZXJhdGVkIGZpbGVzLCBldmVuIHRob3VnaCB0aGV5IGFyZSAuYyBmaWxlcywgYXJlCisgICAgICAgICAgI2luY2x1ZGVkIGJ5IG90aGVyIGZpbGVzIGluIHRoZSBidWlsZC4gIE1ha2Ugc3VyZSB0aGV5IGVuZCB1cAorICAgICAgICAgIGluIHlhc21fZ2VuX2luY2x1ZGVfZGlyLgorCisgICAgICAgMykgU29tZSBvZiB0aGUgZ2VucGVyZiBvdXRwdXQgaXMgI2luY2x1ZGVkIHdoaWxlIG90aGVycyBuZWVkIHRvIGJlCisgICAgICAgICAgY29tcGlsZWQgZGlyZWN0bHkuICBUaGF0IGlzIHdoeSB0aGVyZSBhcmUgMiBkaWZmZXJlbnQgcnVsZXMgZm9yCisgICAgICAgICAgLmdwZXJmIGZpbGVzIGluIHR3byB0YXJnZXRzLgorCisgIDkpIElmIGFsbCB0aGF0J3MgaXMgZmluaXNoZWQsIGF0dGVtcHQgdG8gYnVpbGQuLi4uYW5kIGNyb3NzIHlvdXIgZmluZ2Vycy4KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3lhc20vcnVuX3lhc20ucHkgYi90aGlyZF9wYXJ0eS95YXNtL3J1bl95YXNtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZDc5Y2MKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS95YXNtL3J1bl95YXNtLnB5CkBAIC0wLDAgKzEsNTEgQEAKKyMgQ29weXJpZ2h0IDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKyMgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworIiIiQSB3cmFwcGVyIHRvIHJ1biB5YXNtLgorCitJdHMgbWFpbiBqb2IgaXMgdG8gcHJvdmlkZSBhIFB5dGhvbiB3cmFwcGVyIGZvciBHTiBpbnRlZ3JhdGlvbiwgYW5kIHRvIHdyaXRlCit0aGUgbWFrZWZpbGUtc3R5bGUgb3V0cHV0IHlhc20gZ2VuZXJhdGVzIGluIHN0ZG91dCB0byBhIC5kIGZpbGUgZm9yIGRlcGVuZGVuY3kKK21hbmFnZW1lbnQgb2YgLmluYyBmaWxlcy4KKworUnVuIHdpdGg6CisgIHB5dGhvbiBydW5feWFzbS5weSA8eWFzbV9iaW5hcnlfcGF0aD4gPGFsbCBvdGhlciB5YXNtIGFyZ3M+CisKK05vdGUgdGhhdCA8YWxsIG90aGVyIHlhc20gYXJncz4gbXVzdCBpbmNsdWRlIGFuIGV4cGxpY2l0IG91dHB1dCBmaWxlICgtbykuIFRoaXMKK3NjcmlwdCB3aWxsIGFwcGVuZCBhICIuZCIgdG8gdGhpcyBhbmQgd3JpdGUgdGhlIGRlcGVuZGVuY2llcyB0aGVyZS4gVGhpcyBzY3JpcHQKK3dpbGwgYWRkICItTSIgdG8gY2F1c2UgeWFzbSB0byB3cml0ZSB0aGUgZGVwcyB0byBzdGRvdXQsIHNvIHlvdSBkb24ndCBuZWVkIHRvCitzcGVjaWZ5IHRoYXQuCisiIiIKKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgc3lzCitpbXBvcnQgc3VicHJvY2VzcworCisjIEV4dHJhY3QgdGhlIG91dHB1dCBmaWxlIG5hbWUgZnJvbSB0aGUgeWFzbSBjb21tYW5kIGxpbmUgc28gd2UgY2FuIGdlbmVyYXRlIGEKKyMgLmQgZmlsZSB3aXRoIHRoZSBzYW1lIGJhc2UgbmFtZS4KK3BhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKK3BhcnNlci5hZGRfYXJndW1lbnQoIi1vIiwgZGVzdD0ib2JqZmlsZSIpCitvcHRpb25zLCBfID0gcGFyc2VyLnBhcnNlX2tub3duX2FyZ3MoKQorCitvYmpmaWxlID0gb3B0aW9ucy5vYmpmaWxlCitkZXBmaWxlID0gb2JqZmlsZSArICcuZCcKKworIyBBc3NlbWJsZS4KK3Jlc3VsdF9jb2RlID0gc3VicHJvY2Vzcy5jYWxsKHN5cy5hcmd2WzE6XSkKK2lmIHJlc3VsdF9jb2RlICE9IDA6CisgIHN5cy5leGl0KHJlc3VsdF9jb2RlKQorCisjIE5vdyBnZW5lcmF0ZSB0aGUgLmQgZmlsZSBsaXN0aW5nIHRoZSBkZXBlbmRlbmNpZXMuIFRoZSAtTSBvcHRpb24gbWFrZXMgeWFzbQorIyB3cml0ZSB0aGUgTWFrZWZpbGUtc3R5bGUgZGVwZW5kZW5jaWVzIHRvIHN0ZG91dCwgYnV0IGl0IHNlZW1zIHRoYXQgaW5oaWJpdHMKKyMgZ2VuZXJhdGluZyBhbnkgY29tcGlsZWQgb3V0cHV0IHNvIHdlIG5lZWQgdG8gZG8gdGhpcyBpbiBhIHNlcGFyYXRlIHBhc3MuCisjIEhvd2V2ZXIsIG91dHB1dHRpbmcgZGVwcyBzZWVtcyBmYXN0ZXIgdGhhbiBhY3R1YWxseSBhc3NlbWJsaW5nLCBhbmQgeWFzbSBpcworIyBzbyBmYXN0IGFueXdheSB0aGlzIGlzIG5vdCBhIGJpZyBkZWFsLgorIworIyBUaGlzIGd1YXJhbnRlZXMgcHJvcGVyIGRlcGVuZGVuY3kgbWFuYWdlbWVudCBmb3IgYXNzZW1ibHkgZmlsZXMuIE90aGVyd2lzZSwKKyMgd2Ugd291bGQgaGF2ZSB0byByZXF1aXJlIHBlb3BsZSB0byBtYW51YWxseSBzcGVjaWZ5IHRoZSAuaW5jIGZpbGVzIHRoZXkKKyMgZGVwZW5kIG9uIGluIHRoZSBidWlsZCBmaWxlLCB3aGljaCB3aWxsIHN1cmVseSBiZSB3cm9uZyBvciBvdXQtb2YtZGF0ZSBpbgorIyBzb21lIGNhc2VzLgorZGVwcyA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KHN5cy5hcmd2WzE6XSArIFsnLU0nXSkKK3dpdGggb3BlbihkZXBmaWxlLCAid2IiKSBhcyBmOgorICBmLndyaXRlKGRlcHMpCisKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3lhc20vc291cmNlL2NvbmZpZy9NYWtlZmlsZSBiL3RoaXJkX3BhcnR5L3lhc20vc291cmNlL2NvbmZpZy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWRjMzRkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkveWFzbS9zb3VyY2UvY29uZmlnL01ha2VmaWxlCkBAIC0wLDAgKzEsOSBAQAorIyBUaGUgWUFTTV9NT0RVTEVTIGxpbmUgYmVsb3cgaXMgZXh0cmFjdGVkIGZyb20gdGhlIE1ha2VmaWxlIGdlbmVyYXRlZCBieSB0aGUKKyMgY29uZmlndXJlIHNjcmlwdC4KK1lBU01fTU9EVUxFUyA9IGFyY2hfeDg2IGFyY2hfbGMzYiBsaXN0Zm10X25hc20gcGFyc2VyX2dhcyBwYXJzZXJfZ251IFwKKwlwYXJzZXJfbmFzbSBwYXJzZXJfdGFzbSBwcmVwcm9jX25hc20gcHJlcHJvY190YXNtIHByZXByb2NfcmF3IFwKKwlwcmVwcm9jX2NwcCBwcmVwcm9jX2dhcyBkYmdmbXRfY3Y4IGRiZ2ZtdF9kd2FyZjIgZGJnZm10X251bGwgXAorCWRiZ2ZtdF9zdGFicyBvYmpmbXRfZGJnIG9iamZtdF9iaW4gb2JqZm10X2Rvc2V4ZSBvYmpmbXRfZWxmIFwKKwlvYmpmbXRfZWxmMzIgb2JqZm10X2VsZjY0IG9iamZtdF9lbGZ4MzIgb2JqZm10X2NvZmYgXAorCW9iamZtdF9tYWNobyBvYmpmbXRfbWFjaG8zMiBvYmpmbXRfbWFjaG82NCBvYmpmbXRfcmRmIFwKKwlvYmpmbXRfd2luMzIgb2JqZm10X3dpbjY0IG9iamZtdF94NjQgb2JqZm10X3hkZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkveWFzbS9zb3VyY2UvY29uZmlnL2FuZHJvaWQvY29uZmlnLmggYi90aGlyZF9wYXJ0eS95YXNtL3NvdXJjZS9jb25maWcvYW5kcm9pZC9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWI1YWI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkveWFzbS9zb3VyY2UvY29uZmlnL2FuZHJvaWQvY29uZmlnLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGZyb20gY29uZmlnLmguaW4gYnkgY29uZmlndXJlLiAgKi8KKy8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmFjIGJ5IGF1dG9oZWFkZXIuICAqLworCisvKiBDb21tYW5kIG5hbWUgdG8gcnVuIEMgcHJlcHJvY2Vzc29yICovCisjZGVmaW5lIENQUF9QUk9HICJjYyAtRSIKKworLyogKi8KKy8qICN1bmRlZiBFTkFCTEVfTkxTICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYWJvcnQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0FCT1JUIDEKKworLyogKi8KKy8qICN1bmRlZiBIQVZFX0NBVEdFVFMgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIE1hYyBPUyBYIGZ1bmN0aW9uIENGTG9jYWxlQ29weUN1cnJlbnQgaW4gdGhlCisgICBDb3JlRm91bmRhdGlvbiBmcmFtZXdvcmsuICovCisvKiAjdW5kZWYgSEFWRV9DRkxPQ0FMRUNPUFlDVVJSRU5UICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBNYWMgT1MgWCBmdW5jdGlvbiBDRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlIGluCisgICB0aGUgQ29yZUZvdW5kYXRpb24gZnJhbWV3b3JrLiAqLworLyogI3VuZGVmIEhBVkVfQ0ZQUkVGRVJFTkNFU0NPUFlBUFBWQUxVRSAqLworCisvKiBEZWZpbmUgaWYgdGhlIEdOVSBkY2dldHRleHQoKSBmdW5jdGlvbiBpcyBhbHJlYWR5IHByZXNlbnQgb3IgcHJlaW5zdGFsbGVkLgorICAgKi8KKyNkZWZpbmUgSEFWRV9EQ0dFVFRFWFQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRpcmVjdC5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX0RJUkVDVF9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZnRydW5jYXRlJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9GVFJVTkNBVEUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGN3ZCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfR0VUQ1dEIDEKKworLyogKi8KKyNkZWZpbmUgSEFWRV9HRVRURVhUIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEdOVSBDIExpYnJhcnkgKi8KKyNkZWZpbmUgSEFWRV9HTlVfQ19MSUJSQVJZIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBpY29udigpIGZ1bmN0aW9uIGFuZCBpdCB3b3Jrcy4gKi8KKy8qICN1bmRlZiBIQVZFX0lDT05WICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCisKKy8qICovCisvKiAjdW5kZWYgSEFWRV9MQ19NRVNTQUdFUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpYmdlbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9MSUJHRU5fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtZXJnZXNvcnQnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfTUVSR0VTT1JUICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcG9wZW4nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1BPUEVOIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RESU5UX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCisKKy8qICovCisvKiAjdW5kZWYgSEFWRV9TVFBDUFkgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJjYXNlY21wJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TVFJDQVNFQ01QIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJjbXBpJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX1NUUkNNUEkgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJpY21wJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX1NUUklDTVAgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NUUklOR19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJuY2FzZWNtcCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU1RSTkNBU0VDTVAgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnNlcCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU1RSU0VQIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHRvYXNjaWknIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1RPQVNDSUkgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9VTklTVERfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdnNucHJpbnRmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9WU05QUklOVEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9zdHJpY21wJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX19TVFJJQ01QICovCisKKy8qIE5hbWUgb2YgcGFja2FnZSAqLworI2RlZmluZSBQQUNLQUdFICJ5YXNtIgorCisvKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KKyNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImJ1Zy15YXNtQHRvcnRhbGwubmV0IgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfTkFNRSAieWFzbSIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1NUUklORyAieWFzbSAxLjMuMCIKKworLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgInlhc20iCisKKy8qIERlZmluZSB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfVVJMICIiCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiMS4zLjAiCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBDIGNvbXBpbGVyIHN1cHBvcnRzIGZ1bmN0aW9uIHByb3RvdHlwZXMuICovCisjZGVmaW5lIFBST1RPVFlQRVMgMQorCisvKiBUaGUgc2l6ZSBvZiBgY2hhcicsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy8qICN1bmRlZiBTSVpFT0ZfQ0hBUiAqLworCisvKiBUaGUgc2l6ZSBvZiBgaW50JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9JTlQgKi8KKworLyogVGhlIHNpemUgb2YgYGxvbmcnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisvKiAjdW5kZWYgU0laRU9GX0xPTkcgKi8KKworLyogVGhlIHNpemUgb2YgYHNob3J0JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9TSE9SVCAqLworCisvKiBUaGUgc2l6ZSBvZiBgdm9pZConLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisvKiAjdW5kZWYgU0laRU9GX1ZPSURQICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworI2RlZmluZSBTVERDX0hFQURFUlMgMQorCisvKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCisjZGVmaW5lIFZFUlNJT04gIjEuMy4wIgorCisvKiBEZWZpbmUgaWYgdXNpbmcgdGhlIGRtYWxsb2MgZGVidWdnaW5nIG1hbGxvYyBwYWNrYWdlICovCisvKiAjdW5kZWYgV0lUSF9ETUFMTE9DICovCisKKy8qIERlZmluZSBsaWtlIFBST1RPVFlQRVM7IHRoaXMgY2FuIGJlIHVzZWQgYnkgc3lzdGVtIGhlYWRlcnMuICovCisjZGVmaW5lIF9fUFJPVE9UWVBFUyAxCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiBgY29uc3QnIGRvZXMgbm90IGNvbmZvcm0gdG8gQU5TSSBDLiAqLworLyogI3VuZGVmIGNvbnN0ICovCisKKy8qIERlZmluZSB0byBgX19pbmxpbmVfXycgb3IgYF9faW5saW5lJyBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlcgorICAgY2FsbHMgaXQsIG9yIHRvIG5vdGhpbmcgaWYgJ2lubGluZScgaXMgbm90IHN1cHBvcnRlZCB1bmRlciBhbnkgbmFtZS4gICovCisjaWZuZGVmIF9fY3BsdXNwbHVzCisvKiAjdW5kZWYgaW5saW5lICovCisjZW5kaWYKKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworLyogI3VuZGVmIHNpemVfdCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkveWFzbS9zb3VyY2UvY29uZmlnL2FuZHJvaWQvbGlieWFzbS1zdGRpbnQuaCBiL3RoaXJkX3BhcnR5L3lhc20vc291cmNlL2NvbmZpZy9hbmRyb2lkL2xpYnlhc20tc3RkaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjljZTY5NgotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3lhc20vc291cmNlL2NvbmZpZy9hbmRyb2lkL2xpYnlhc20tc3RkaW50LmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9ZQVNNX0xJQllBU01fU1RESU5UX0gKKyNkZWZpbmUgX1lBU01fTElCWUFTTV9TVERJTlRfSCAxCisjaWZuZGVmIF9HRU5FUkFURURfU1RESU5UX0gKKyNkZWZpbmUgX0dFTkVSQVRFRF9TVERJTlRfSCAieWFzbSAxLjMuMCIKKy8qIGdlbmVyYXRlZCB1c2luZyBnY2MgLXN0ZD1nbnU5OSAqLworI2RlZmluZSBfU1RESU5UX0hBVkVfU1RESU5UX0ggMQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3lhc20vc291cmNlL2NvbmZpZy9pb3MvY29uZmlnLmggYi90aGlyZF9wYXJ0eS95YXNtL3NvdXJjZS9jb25maWcvaW9zL2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNjk1ZDYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS95YXNtL3NvdXJjZS9jb25maWcvaW9zL2NvbmZpZy5oCkBAIC0wLDAgKzEsMTczIEBACisvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZy5oLmluIGJ5IGNvbmZpZ3VyZS4gICovCisvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogQ29tbWFuZCBuYW1lIHRvIHJ1biBDIHByZXByb2Nlc3NvciAqLworI2RlZmluZSBDUFBfUFJPRyAiY2MgLUUiCisKKy8qICovCisvKiAjdW5kZWYgRU5BQkxFX05MUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFib3J0JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9BQk9SVCAxCisKKy8qICovCisvKiAjdW5kZWYgSEFWRV9DQVRHRVRTICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBNYWMgT1MgWCBmdW5jdGlvbiBDRkxvY2FsZUNvcHlDdXJyZW50IGluIHRoZQorICAgQ29yZUZvdW5kYXRpb24gZnJhbWV3b3JrLiAqLworI2RlZmluZSBIQVZFX0NGTE9DQUxFQ09QWUNVUlJFTlQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgTWFjIE9TIFggZnVuY3Rpb24gQ0ZQcmVmZXJlbmNlc0NvcHlBcHBWYWx1ZSBpbgorICAgdGhlIENvcmVGb3VuZGF0aW9uIGZyYW1ld29yay4gKi8KKyNkZWZpbmUgSEFWRV9DRlBSRUZFUkVOQ0VTQ09QWUFQUFZBTFVFIDEKKworLyogRGVmaW5lIGlmIHRoZSBHTlUgZGNnZXR0ZXh0KCkgZnVuY3Rpb24gaXMgYWxyZWFkeSBwcmVzZW50IG9yIHByZWluc3RhbGxlZC4KKyAgICovCisvKiAjdW5kZWYgSEFWRV9EQ0dFVFRFWFQgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkaXJlY3QuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9ESVJFQ1RfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZ0cnVuY2F0ZScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRlRSVU5DQVRFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRjd2QnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0dFVENXRCAxCisKKy8qICovCisvKiAjdW5kZWYgSEFWRV9HRVRURVhUICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBHTlUgQyBMaWJyYXJ5ICovCisvKiAjdW5kZWYgSEFWRV9HTlVfQ19MSUJSQVJZICovCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgaWNvbnYoKSBmdW5jdGlvbiBhbmQgaXQgd29ya3MuICovCisjZGVmaW5lIEhBVkVfSUNPTlYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQorCisvKiAqLworLyogI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaWJnZW4uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfTElCR0VOX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWVyZ2Vzb3J0JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9NRVJHRVNPUlQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBvcGVuJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9QT1BFTiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NURElOVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RETElCX0ggMQorCisvKiAqLworLyogI3VuZGVmIEhBVkVfU1RQQ1BZICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyY2FzZWNtcCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU1RSQ0FTRUNNUCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyY21waScgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9TVFJDTVBJICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyaWNtcCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9TVFJJQ01QICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RybmNhc2VjbXAnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NUUk5DQVNFQ01QIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJzZXAnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NUUlNFUCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0b2FzY2lpJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9UT0FTQ0lJIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZzbnByaW50ZicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfVlNOUFJJTlRGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfc3RyaWNtcCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9fU1RSSUNNUCAqLworCisvKiBOYW1lIG9mIHBhY2thZ2UgKi8KKyNkZWZpbmUgUEFDS0FHRSAieWFzbSIKKworLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCisjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICJidWcteWFzbUB0b3J0YWxsLm5ldCIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX05BTUUgInlhc20iCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgInlhc20gMS4zLjAiCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJ5YXNtIgorCisvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1VSTCAiIgorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjEuMy4wIgorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgQyBjb21waWxlciBzdXBwb3J0cyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLworI2RlZmluZSBQUk9UT1RZUEVTIDEKKworLyogVGhlIHNpemUgb2YgYGNoYXInLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisvKiAjdW5kZWYgU0laRU9GX0NIQVIgKi8KKworLyogVGhlIHNpemUgb2YgYGludCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy8qICN1bmRlZiBTSVpFT0ZfSU5UICovCisKKy8qIFRoZSBzaXplIG9mIGBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9MT05HICovCisKKy8qIFRoZSBzaXplIG9mIGBzaG9ydCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy8qICN1bmRlZiBTSVpFT0ZfU0hPUlQgKi8KKworLyogVGhlIHNpemUgb2YgYHZvaWQqJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9WT0lEUCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKKworLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLworI2RlZmluZSBWRVJTSU9OICIxLjMuMCIKKworLyogRGVmaW5lIGlmIHVzaW5nIHRoZSBkbWFsbG9jIGRlYnVnZ2luZyBtYWxsb2MgcGFja2FnZSAqLworLyogI3VuZGVmIFdJVEhfRE1BTExPQyAqLworCisvKiBEZWZpbmUgbGlrZSBQUk9UT1RZUEVTOyB0aGlzIGNhbiBiZSB1c2VkIGJ5IHN5c3RlbSBoZWFkZXJzLiAqLworI2RlZmluZSBfX1BST1RPVFlQRVMgMQorCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgYGNvbnN0JyBkb2VzIG5vdCBjb25mb3JtIHRvIEFOU0kgQy4gKi8KKy8qICN1bmRlZiBjb25zdCAqLworCisvKiBEZWZpbmUgdG8gYF9faW5saW5lX18nIG9yIGBfX2lubGluZScgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIKKyAgIGNhbGxzIGl0LCBvciB0byBub3RoaW5nIGlmICdpbmxpbmUnIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgYW55IG5hbWUuICAqLworI2lmbmRlZiBfX2NwbHVzcGx1cworLyogI3VuZGVmIGlubGluZSAqLworI2VuZGlmCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKy8qICN1bmRlZiBzaXplX3QgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3lhc20vc291cmNlL2NvbmZpZy9pb3MvbGlieWFzbS1zdGRpbnQuaCBiL3RoaXJkX3BhcnR5L3lhc20vc291cmNlL2NvbmZpZy9pb3MvbGlieWFzbS1zdGRpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzgwZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkveWFzbS9zb3VyY2UvY29uZmlnL2lvcy9saWJ5YXNtLXN0ZGludC5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfWUFTTV9MSUJZQVNNX1NURElOVF9ICisjZGVmaW5lIF9ZQVNNX0xJQllBU01fU1RESU5UX0ggMQorI2lmbmRlZiBfR0VORVJBVEVEX1NURElOVF9ICisjZGVmaW5lIF9HRU5FUkFURURfU1RESU5UX0ggInlhc20gMS4zLjAiCisvKiBnZW5lcmF0ZWQgdXNpbmcgZ2NjICovCisjZGVmaW5lIF9TVERJTlRfSEFWRV9TVERJTlRfSCAxCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkveWFzbS9zb3VyY2UvY29uZmlnL2xpbnV4L2NvbmZpZy5oIGIvdGhpcmRfcGFydHkveWFzbS9zb3VyY2UvY29uZmlnL2xpbnV4L2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYTFmNmEKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS95YXNtL3NvdXJjZS9jb25maWcvbGludXgvY29uZmlnLmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGZyb20gY29uZmlnLmguaW4gYnkgY29uZmlndXJlLiAgKi8KKy8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmFjIGJ5IGF1dG9oZWFkZXIuICAqLworCisvKiBDb21tYW5kIG5hbWUgdG8gcnVuIEMgcHJlcHJvY2Vzc29yICovCisjZGVmaW5lIENQUF9QUk9HICJjYyAtRSIKKworLyogKi8KKyNkZWZpbmUgRU5BQkxFX05MUyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYWJvcnQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0FCT1JUIDEKKworLyogKi8KKy8qICN1bmRlZiBIQVZFX0NBVEdFVFMgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIE1hYyBPUyBYIGZ1bmN0aW9uIENGTG9jYWxlQ29weUN1cnJlbnQgaW4gdGhlCisgICBDb3JlRm91bmRhdGlvbiBmcmFtZXdvcmsuICovCisvKiAjdW5kZWYgSEFWRV9DRkxPQ0FMRUNPUFlDVVJSRU5UICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBNYWMgT1MgWCBmdW5jdGlvbiBDRlByZWZlcmVuY2VzQ29weUFwcFZhbHVlIGluCisgICB0aGUgQ29yZUZvdW5kYXRpb24gZnJhbWV3b3JrLiAqLworLyogI3VuZGVmIEhBVkVfQ0ZQUkVGRVJFTkNFU0NPUFlBUFBWQUxVRSAqLworCisvKiBEZWZpbmUgaWYgdGhlIEdOVSBkY2dldHRleHQoKSBmdW5jdGlvbiBpcyBhbHJlYWR5IHByZXNlbnQgb3IgcHJlaW5zdGFsbGVkLgorICAgKi8KKyNkZWZpbmUgSEFWRV9EQ0dFVFRFWFQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRpcmVjdC5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX0RJUkVDVF9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZnRydW5jYXRlJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9GVFJVTkNBVEUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGN3ZCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfR0VUQ1dEIDEKKworLyogKi8KKyNkZWZpbmUgSEFWRV9HRVRURVhUIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIEdOVSBDIExpYnJhcnkgKi8KKyNkZWZpbmUgSEFWRV9HTlVfQ19MSUJSQVJZIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSBpY29udigpIGZ1bmN0aW9uIGFuZCBpdCB3b3Jrcy4gKi8KKy8qICN1bmRlZiBIQVZFX0lDT05WICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8aW50dHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfSU5UVFlQRVNfSCAxCisKKy8qICovCisvKiAjdW5kZWYgSEFWRV9MQ19NRVNTQUdFUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGxpYmdlbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9MSUJHRU5fSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtZXJnZXNvcnQnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfTUVSR0VTT1JUICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcG9wZW4nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1BPUEVOIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RESU5UX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCisKKy8qICovCisvKiAjdW5kZWYgSEFWRV9TVFBDUFkgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJjYXNlY21wJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TVFJDQVNFQ01QIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJjbXBpJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX1NUUkNNUEkgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJpY21wJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX1NUUklDTVAgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NUUklOR19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJuY2FzZWNtcCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU1RSTkNBU0VDTVAgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnNlcCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU1RSU0VQIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHRvYXNjaWknIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1RPQVNDSUkgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9VTklTVERfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdnNucHJpbnRmJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9WU05QUklOVEYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYF9zdHJpY21wJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX19TVFJJQ01QICovCisKKy8qIE5hbWUgb2YgcGFja2FnZSAqLworI2RlZmluZSBQQUNLQUdFICJ5YXNtIgorCisvKiBEZWZpbmUgdG8gdGhlIGFkZHJlc3Mgd2hlcmUgYnVnIHJlcG9ydHMgZm9yIHRoaXMgcGFja2FnZSBzaG91bGQgYmUgc2VudC4gKi8KKyNkZWZpbmUgUEFDS0FHRV9CVUdSRVBPUlQgImJ1Zy15YXNtQHRvcnRhbGwubmV0IgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfTkFNRSAieWFzbSIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1NUUklORyAieWFzbSAxLjMuMCIKKworLyogRGVmaW5lIHRvIHRoZSBvbmUgc3ltYm9sIHNob3J0IG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1RBUk5BTUUgInlhc20iCisKKy8qIERlZmluZSB0byB0aGUgaG9tZSBwYWdlIGZvciB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfVVJMICIiCisKKy8qIERlZmluZSB0byB0aGUgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfVkVSU0lPTiAiMS4zLjAiCisKKy8qIERlZmluZSB0byAxIGlmIHRoZSBDIGNvbXBpbGVyIHN1cHBvcnRzIGZ1bmN0aW9uIHByb3RvdHlwZXMuICovCisjZGVmaW5lIFBST1RPVFlQRVMgMQorCisvKiBUaGUgc2l6ZSBvZiBgY2hhcicsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy8qICN1bmRlZiBTSVpFT0ZfQ0hBUiAqLworCisvKiBUaGUgc2l6ZSBvZiBgaW50JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9JTlQgKi8KKworLyogVGhlIHNpemUgb2YgYGxvbmcnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisvKiAjdW5kZWYgU0laRU9GX0xPTkcgKi8KKworLyogVGhlIHNpemUgb2YgYHNob3J0JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9TSE9SVCAqLworCisvKiBUaGUgc2l6ZSBvZiBgdm9pZConLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisvKiAjdW5kZWYgU0laRU9GX1ZPSURQICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworI2RlZmluZSBTVERDX0hFQURFUlMgMQorCisvKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCisjZGVmaW5lIFZFUlNJT04gIjEuMy4wIgorCisvKiBEZWZpbmUgaWYgdXNpbmcgdGhlIGRtYWxsb2MgZGVidWdnaW5nIG1hbGxvYyBwYWNrYWdlICovCisvKiAjdW5kZWYgV0lUSF9ETUFMTE9DICovCisKKy8qIERlZmluZSBsaWtlIFBST1RPVFlQRVM7IHRoaXMgY2FuIGJlIHVzZWQgYnkgc3lzdGVtIGhlYWRlcnMuICovCisjZGVmaW5lIF9fUFJPVE9UWVBFUyAxCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiBgY29uc3QnIGRvZXMgbm90IGNvbmZvcm0gdG8gQU5TSSBDLiAqLworLyogI3VuZGVmIGNvbnN0ICovCisKKy8qIERlZmluZSB0byBgX19pbmxpbmVfXycgb3IgYF9faW5saW5lJyBpZiB0aGF0J3Mgd2hhdCB0aGUgQyBjb21waWxlcgorICAgY2FsbHMgaXQsIG9yIHRvIG5vdGhpbmcgaWYgJ2lubGluZScgaXMgbm90IHN1cHBvcnRlZCB1bmRlciBhbnkgbmFtZS4gICovCisjaWZuZGVmIF9fY3BsdXNwbHVzCisvKiAjdW5kZWYgaW5saW5lICovCisjZW5kaWYKKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworLyogI3VuZGVmIHNpemVfdCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkveWFzbS9zb3VyY2UvY29uZmlnL2xpbnV4L2xpYnlhc20tc3RkaW50LmggYi90aGlyZF9wYXJ0eS95YXNtL3NvdXJjZS9jb25maWcvbGludXgvbGlieWFzbS1zdGRpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWNlNjk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkveWFzbS9zb3VyY2UvY29uZmlnL2xpbnV4L2xpYnlhc20tc3RkaW50LmgKQEAgLTAsMCArMSw5IEBACisjaWZuZGVmIF9ZQVNNX0xJQllBU01fU1RESU5UX0gKKyNkZWZpbmUgX1lBU01fTElCWUFTTV9TVERJTlRfSCAxCisjaWZuZGVmIF9HRU5FUkFURURfU1RESU5UX0gKKyNkZWZpbmUgX0dFTkVSQVRFRF9TVERJTlRfSCAieWFzbSAxLjMuMCIKKy8qIGdlbmVyYXRlZCB1c2luZyBnY2MgLXN0ZD1nbnU5OSAqLworI2RlZmluZSBfU1RESU5UX0hBVkVfU1RESU5UX0ggMQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3lhc20vc291cmNlL2NvbmZpZy9tYWMvY29uZmlnLmggYi90aGlyZF9wYXJ0eS95YXNtL3NvdXJjZS9jb25maWcvbWFjL2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNjk1ZDYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS95YXNtL3NvdXJjZS9jb25maWcvbWFjL2NvbmZpZy5oCkBAIC0wLDAgKzEsMTczIEBACisvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZy5oLmluIGJ5IGNvbmZpZ3VyZS4gICovCisvKiBjb25maWcuaC5pbi4gIEdlbmVyYXRlZCBmcm9tIGNvbmZpZ3VyZS5hYyBieSBhdXRvaGVhZGVyLiAgKi8KKworLyogQ29tbWFuZCBuYW1lIHRvIHJ1biBDIHByZXByb2Nlc3NvciAqLworI2RlZmluZSBDUFBfUFJPRyAiY2MgLUUiCisKKy8qICovCisvKiAjdW5kZWYgRU5BQkxFX05MUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFib3J0JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9BQk9SVCAxCisKKy8qICovCisvKiAjdW5kZWYgSEFWRV9DQVRHRVRTICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBNYWMgT1MgWCBmdW5jdGlvbiBDRkxvY2FsZUNvcHlDdXJyZW50IGluIHRoZQorICAgQ29yZUZvdW5kYXRpb24gZnJhbWV3b3JrLiAqLworI2RlZmluZSBIQVZFX0NGTE9DQUxFQ09QWUNVUlJFTlQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgTWFjIE9TIFggZnVuY3Rpb24gQ0ZQcmVmZXJlbmNlc0NvcHlBcHBWYWx1ZSBpbgorICAgdGhlIENvcmVGb3VuZGF0aW9uIGZyYW1ld29yay4gKi8KKyNkZWZpbmUgSEFWRV9DRlBSRUZFUkVOQ0VTQ09QWUFQUFZBTFVFIDEKKworLyogRGVmaW5lIGlmIHRoZSBHTlUgZGNnZXR0ZXh0KCkgZnVuY3Rpb24gaXMgYWxyZWFkeSBwcmVzZW50IG9yIHByZWluc3RhbGxlZC4KKyAgICovCisvKiAjdW5kZWYgSEFWRV9EQ0dFVFRFWFQgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkaXJlY3QuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9ESVJFQ1RfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZ0cnVuY2F0ZScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRlRSVU5DQVRFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRjd2QnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0dFVENXRCAxCisKKy8qICovCisvKiAjdW5kZWYgSEFWRV9HRVRURVhUICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBHTlUgQyBMaWJyYXJ5ICovCisvKiAjdW5kZWYgSEFWRV9HTlVfQ19MSUJSQVJZICovCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgaWNvbnYoKSBmdW5jdGlvbiBhbmQgaXQgd29ya3MuICovCisjZGVmaW5lIEhBVkVfSUNPTlYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQorCisvKiAqLworLyogI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaWJnZW4uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfTElCR0VOX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWVyZ2Vzb3J0JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9NRVJHRVNPUlQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBvcGVuJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9QT1BFTiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NURElOVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RETElCX0ggMQorCisvKiAqLworLyogI3VuZGVmIEhBVkVfU1RQQ1BZICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyY2FzZWNtcCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU1RSQ0FTRUNNUCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyY21waScgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9TVFJDTVBJICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyaWNtcCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9TVFJJQ01QICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RybmNhc2VjbXAnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NUUk5DQVNFQ01QIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJzZXAnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NUUlNFUCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0b2FzY2lpJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9UT0FTQ0lJIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZzbnByaW50ZicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfVlNOUFJJTlRGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfc3RyaWNtcCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9fU1RSSUNNUCAqLworCisvKiBOYW1lIG9mIHBhY2thZ2UgKi8KKyNkZWZpbmUgUEFDS0FHRSAieWFzbSIKKworLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCisjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICJidWcteWFzbUB0b3J0YWxsLm5ldCIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX05BTUUgInlhc20iCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgInlhc20gMS4zLjAiCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJ5YXNtIgorCisvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1VSTCAiIgorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjEuMy4wIgorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgQyBjb21waWxlciBzdXBwb3J0cyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLworI2RlZmluZSBQUk9UT1RZUEVTIDEKKworLyogVGhlIHNpemUgb2YgYGNoYXInLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisvKiAjdW5kZWYgU0laRU9GX0NIQVIgKi8KKworLyogVGhlIHNpemUgb2YgYGludCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy8qICN1bmRlZiBTSVpFT0ZfSU5UICovCisKKy8qIFRoZSBzaXplIG9mIGBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9MT05HICovCisKKy8qIFRoZSBzaXplIG9mIGBzaG9ydCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy8qICN1bmRlZiBTSVpFT0ZfU0hPUlQgKi8KKworLyogVGhlIHNpemUgb2YgYHZvaWQqJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9WT0lEUCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKKworLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLworI2RlZmluZSBWRVJTSU9OICIxLjMuMCIKKworLyogRGVmaW5lIGlmIHVzaW5nIHRoZSBkbWFsbG9jIGRlYnVnZ2luZyBtYWxsb2MgcGFja2FnZSAqLworLyogI3VuZGVmIFdJVEhfRE1BTExPQyAqLworCisvKiBEZWZpbmUgbGlrZSBQUk9UT1RZUEVTOyB0aGlzIGNhbiBiZSB1c2VkIGJ5IHN5c3RlbSBoZWFkZXJzLiAqLworI2RlZmluZSBfX1BST1RPVFlQRVMgMQorCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgYGNvbnN0JyBkb2VzIG5vdCBjb25mb3JtIHRvIEFOU0kgQy4gKi8KKy8qICN1bmRlZiBjb25zdCAqLworCisvKiBEZWZpbmUgdG8gYF9faW5saW5lX18nIG9yIGBfX2lubGluZScgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIKKyAgIGNhbGxzIGl0LCBvciB0byBub3RoaW5nIGlmICdpbmxpbmUnIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgYW55IG5hbWUuICAqLworI2lmbmRlZiBfX2NwbHVzcGx1cworLyogI3VuZGVmIGlubGluZSAqLworI2VuZGlmCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKy8qICN1bmRlZiBzaXplX3QgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3lhc20vc291cmNlL2NvbmZpZy9tYWMvbGlieWFzbS1zdGRpbnQuaCBiL3RoaXJkX3BhcnR5L3lhc20vc291cmNlL2NvbmZpZy9tYWMvbGlieWFzbS1zdGRpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzgwZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkveWFzbS9zb3VyY2UvY29uZmlnL21hYy9saWJ5YXNtLXN0ZGludC5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfWUFTTV9MSUJZQVNNX1NURElOVF9ICisjZGVmaW5lIF9ZQVNNX0xJQllBU01fU1RESU5UX0ggMQorI2lmbmRlZiBfR0VORVJBVEVEX1NURElOVF9ICisjZGVmaW5lIF9HRU5FUkFURURfU1RESU5UX0ggInlhc20gMS4zLjAiCisvKiBnZW5lcmF0ZWQgdXNpbmcgZ2NjICovCisjZGVmaW5lIF9TVERJTlRfSEFWRV9TVERJTlRfSCAxCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkveWFzbS9zb3VyY2UvY29uZmlnL29wZW5ic2QvY29uZmlnLmggYi90aGlyZF9wYXJ0eS95YXNtL3NvdXJjZS9jb25maWcvb3BlbmJzZC9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjc0Mjg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkveWFzbS9zb3VyY2UvY29uZmlnL29wZW5ic2QvY29uZmlnLmgKQEAgLTAsMCArMSwxNjUgQEAKKy8qIGNvbmZpZy5oLiAgR2VuZXJhdGVkIGZyb20gY29uZmlnLmguaW4gYnkgY29uZmlndXJlLiAgKi8KKy8qIGNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGZyb20gY29uZmlndXJlLmFjIGJ5IGF1dG9oZWFkZXIuICAqLworCisvKiBDb21tYW5kIG5hbWUgdG8gcnVuIEMgcHJlcHJvY2Vzc29yICovCisjZGVmaW5lIENQUF9QUk9HICJjYyAtRSIKKworLyogKi8KKy8qICN1bmRlZiBFTkFCTEVfTkxTICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYWJvcnQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0FCT1JUIDEKKworLyogKi8KKy8qICN1bmRlZiBIQVZFX0NBVEdFVFMgKi8KKworLyogRGVmaW5lIGlmIHRoZSBHTlUgZGNnZXR0ZXh0KCkgZnVuY3Rpb24gaXMgYWxyZWFkeSBwcmVzZW50IG9yIHByZWluc3RhbGxlZC4KKyAgICovCisvKiAjdW5kZWYgSEFWRV9EQ0dFVFRFWFQgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkaXJlY3QuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9ESVJFQ1RfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZ0cnVuY2F0ZScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRlRSVU5DQVRFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRjd2QnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0dFVENXRCAxCisKKy8qICovCisvKiAjdW5kZWYgSEFWRV9HRVRURVhUICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBHTlUgQyBMaWJyYXJ5ICovCisvKiAjdW5kZWYgSEFWRV9HTlVfQ19MSUJSQVJZICovCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgaWNvbnYoKSBmdW5jdGlvbiBhbmQgaXQgd29ya3MuICovCisvKiAjdW5kZWYgSEFWRV9JQ09OViAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQorCisvKiAqLworLyogI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaWJnZW4uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfTElCR0VOX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWVyZ2Vzb3J0JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9NRVJHRVNPUlQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBvcGVuJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9QT1BFTiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NURElOVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RETElCX0ggMQorCisvKiAqLworLyogI3VuZGVmIEhBVkVfU1RQQ1BZICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyY2FzZWNtcCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU1RSQ0FTRUNNUCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyY21waScgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9TVFJDTVBJICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyaWNtcCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9TVFJJQ01QICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RybmNhc2VjbXAnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NUUk5DQVNFQ01QIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJzZXAnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NUUlNFUCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0b2FzY2lpJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9UT0FTQ0lJIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfVU5JU1REX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZzbnByaW50ZicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfVlNOUFJJTlRGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfc3RyaWNtcCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9fU1RSSUNNUCAqLworCisvKiBOYW1lIG9mIHBhY2thZ2UgKi8KKyNkZWZpbmUgUEFDS0FHRSAieWFzbSIKKworLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCisjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICJidWcteWFzbUB0b3J0YWxsLm5ldCIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX05BTUUgInlhc20iCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgInlhc20gMS4yLjAiCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJ5YXNtIgorCisvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1VSTCAiIgorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjEuMi4wIgorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgQyBjb21waWxlciBzdXBwb3J0cyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLworI2RlZmluZSBQUk9UT1RZUEVTIDEKKworLyogVGhlIHNpemUgb2YgYGNoYXInLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisvKiAjdW5kZWYgU0laRU9GX0NIQVIgKi8KKworLyogVGhlIHNpemUgb2YgYGludCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy8qICN1bmRlZiBTSVpFT0ZfSU5UICovCisKKy8qIFRoZSBzaXplIG9mIGBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9MT05HICovCisKKy8qIFRoZSBzaXplIG9mIGBzaG9ydCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy8qICN1bmRlZiBTSVpFT0ZfU0hPUlQgKi8KKworLyogVGhlIHNpemUgb2YgYHZvaWQqJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9WT0lEUCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKKworLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLworI2RlZmluZSBWRVJTSU9OICIxLjIuMCIKKworLyogRGVmaW5lIGlmIHVzaW5nIHRoZSBkbWFsbG9jIGRlYnVnZ2luZyBtYWxsb2MgcGFja2FnZSAqLworLyogI3VuZGVmIFdJVEhfRE1BTExPQyAqLworCisvKiBEZWZpbmUgbGlrZSBQUk9UT1RZUEVTOyB0aGlzIGNhbiBiZSB1c2VkIGJ5IHN5c3RlbSBoZWFkZXJzLiAqLworI2RlZmluZSBfX1BST1RPVFlQRVMgMQorCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgYGNvbnN0JyBkb2VzIG5vdCBjb25mb3JtIHRvIEFOU0kgQy4gKi8KKy8qICN1bmRlZiBjb25zdCAqLworCisvKiBEZWZpbmUgdG8gYF9faW5saW5lX18nIG9yIGBfX2lubGluZScgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIKKyAgIGNhbGxzIGl0LCBvciB0byBub3RoaW5nIGlmICdpbmxpbmUnIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgYW55IG5hbWUuICAqLworI2lmbmRlZiBfX2NwbHVzcGx1cworLyogI3VuZGVmIGlubGluZSAqLworI2VuZGlmCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKy8qICN1bmRlZiBzaXplX3QgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3lhc20vc291cmNlL2NvbmZpZy9vcGVuYnNkL2xpYnlhc20tc3RkaW50LmggYi90aGlyZF9wYXJ0eS95YXNtL3NvdXJjZS9jb25maWcvb3BlbmJzZC9saWJ5YXNtLXN0ZGludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NzUyMTQKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS95YXNtL3NvdXJjZS9jb25maWcvb3BlbmJzZC9saWJ5YXNtLXN0ZGludC5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfWUFTTV9MSUJZQVNNX1NURElOVF9ICisjZGVmaW5lIF9ZQVNNX0xJQllBU01fU1RESU5UX0ggMQorI2lmbmRlZiBfR0VORVJBVEVEX1NURElOVF9ICisjZGVmaW5lIF9HRU5FUkFURURfU1RESU5UX0ggInlhc20gMS4xLjAiCisvKiBnZW5lcmF0ZWQgdXNpbmcgZ2NjIC1zdGQ9Z251OTkgKi8KKyNkZWZpbmUgX1NURElOVF9IQVZFX1NURElOVF9IIDEKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS95YXNtL3NvdXJjZS9jb25maWcvd2luL2NvbmZpZy5oIGIvdGhpcmRfcGFydHkveWFzbS9zb3VyY2UvY29uZmlnL3dpbi9jb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmMwODFkCi0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkveWFzbS9zb3VyY2UvY29uZmlnL3dpbi9jb25maWcuaApAQCAtMCwwICsxLDE3MyBAQAorLyogY29uZmlnLmguICBHZW5lcmF0ZWQgZnJvbSBjb25maWcuaC5pbiBieSBjb25maWd1cmUuICAqLworLyogY29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuYWMgYnkgYXV0b2hlYWRlci4gICovCisKKy8qIENvbW1hbmQgbmFtZSB0byBydW4gQyBwcmVwcm9jZXNzb3IgKi8KKyNkZWZpbmUgQ1BQX1BST0cgImNjIC1FIgorCisvKiAqLworLyogI3VuZGVmIEVOQUJMRV9OTFMgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhYm9ydCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfQUJPUlQgMQorCisvKiAqLworLyogI3VuZGVmIEhBVkVfQ0FUR0VUUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgTWFjIE9TIFggZnVuY3Rpb24gQ0ZMb2NhbGVDb3B5Q3VycmVudCBpbiB0aGUKKyAgIENvcmVGb3VuZGF0aW9uIGZyYW1ld29yay4gKi8KKy8qICN1bmRlZiBIQVZFX0NGTE9DQUxFQ09QWUNVUlJFTlQgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIE1hYyBPUyBYIGZ1bmN0aW9uIENGUHJlZmVyZW5jZXNDb3B5QXBwVmFsdWUgaQorICAgdGhlIENvcmVGb3VuZGF0aW9uIGZyYW1ld29yay4gKi8KKy8qICN1bmRlZiBIQVZFX0NGUFJFRkVSRU5DRVNDT1BZQVBQVkFMVUUgKi8KKworLyogRGVmaW5lIGlmIHRoZSBHTlUgZGNnZXR0ZXh0KCkgZnVuY3Rpb24gaXMgYWxyZWFkeSBwcmVzZW50IG9yIHByZWluc3RhbGxlZC4KKyAgICovCisjZGVmaW5lIEhBVkVfRENHRVRURVhUIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkaXJlY3QuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfRElSRUNUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZ0cnVuY2F0ZScgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9GVFJVTkNBVEUgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRjd2QnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0dFVENXRCAxCisKKy8qICovCisjZGVmaW5lIEhBVkVfR0VUVEVYVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBHTlUgQyBMaWJyYXJ5ICovCisvKiAjdW5kZWYgSEFWRV9HTlVfQ19MSUJSQVJZICovCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgaWNvbnYoKSBmdW5jdGlvbiBhbmQgaXQgd29ya3MuICovCisvKiAjdW5kZWYgSEFWRV9JQ09OViAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQorCisvKiAqLworLyogI3VuZGVmIEhBVkVfTENfTUVTU0FHRVMgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaWJnZW4uaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9MSUJHRU5fSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWVyZ2Vzb3J0JyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX01FUkdFU09SVCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBvcGVuJyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX1BPUEVOICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NURElOVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RETElCX0ggMQorCisvKiAqLworLyogI3VuZGVmIEhBVkVfU1RQQ1BZICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyY2FzZWNtcCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9TVFJDQVNFQ01QICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyY21waScgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9TVFJDTVBJICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyaWNtcCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9TVFJJQ01QICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX1NUUklOR1NfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RybmNhc2VjbXAnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NUUk5DQVNFQ01QIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJzZXAnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfU1RSU0VQICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0b2FzY2lpJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9UT0FTQ0lJIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1bmlzdGQuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9VTklTVERfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHZzbnByaW50ZicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfVlNOUFJJTlRGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfc3RyaWNtcCcgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9fU1RSSUNNUCAqLworCisvKiBOYW1lIG9mIHBhY2thZ2UgKi8KKyNkZWZpbmUgUEFDS0FHRSAieWFzbSIKKworLyogRGVmaW5lIHRvIHRoZSBhZGRyZXNzIHdoZXJlIGJ1ZyByZXBvcnRzIGZvciB0aGlzIHBhY2thZ2Ugc2hvdWxkIGJlIHNlbnQuICovCisjZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICJidWcteWFzbUB0b3J0YWxsLm5ldCIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX05BTUUgInlhc20iCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgInlhc20gMS4zLjAiCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJ5YXNtIgorCisvKiBEZWZpbmUgdG8gdGhlIGhvbWUgcGFnZSBmb3IgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1VSTCAiIgorCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX1ZFUlNJT04gIjEuMy4wIgorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgQyBjb21waWxlciBzdXBwb3J0cyBmdW5jdGlvbiBwcm90b3R5cGVzLiAqLworI2RlZmluZSBQUk9UT1RZUEVTIDEKKworLyogVGhlIHNpemUgb2YgYGNoYXInLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisvKiAjdW5kZWYgU0laRU9GX0NIQVIgKi8KKworLyogVGhlIHNpemUgb2YgYGludCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy8qICN1bmRlZiBTSVpFT0ZfSU5UICovCisKKy8qIFRoZSBzaXplIG9mIGBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9MT05HICovCisKKy8qIFRoZSBzaXplIG9mIGBzaG9ydCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKy8qICN1bmRlZiBTSVpFT0ZfU0hPUlQgKi8KKworLyogVGhlIHNpemUgb2YgYHZvaWQqJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworLyogI3VuZGVmIFNJWkVPRl9WT0lEUCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KKyNkZWZpbmUgU1REQ19IRUFERVJTIDEKKworLyogVmVyc2lvbiBudW1iZXIgb2YgcGFja2FnZSAqLworI2RlZmluZSBWRVJTSU9OICIxLjMuMCIKKworLyogRGVmaW5lIGlmIHVzaW5nIHRoZSBkbWFsbG9jIGRlYnVnZ2luZyBtYWxsb2MgcGFja2FnZSAqLworLyogI3VuZGVmIFdJVEhfRE1BTExPQyAqLworCisvKiBEZWZpbmUgbGlrZSBQUk9UT1RZUEVTOyB0aGlzIGNhbiBiZSB1c2VkIGJ5IHN5c3RlbSBoZWFkZXJzLiAqLworI2RlZmluZSBfX1BST1RPVFlQRVMgMQorCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgYGNvbnN0JyBkb2VzIG5vdCBjb25mb3JtIHRvIEFOU0kgQy4gKi8KKy8qICN1bmRlZiBjb25zdCAqLworCisvKiBEZWZpbmUgdG8gYF9faW5saW5lX18nIG9yIGBfX2lubGluZScgaWYgdGhhdCdzIHdoYXQgdGhlIEMgY29tcGlsZXIKKyAgIGNhbGxzIGl0LCBvciB0byBub3RoaW5nIGlmICdpbmxpbmUnIGlzIG5vdCBzdXBwb3J0ZWQgdW5kZXIgYW55IG5hbWUuICAqLworI2lmbmRlZiBfX2NwbHVzcGx1cworLyogI3VuZGVmIGlubGluZSAqLworI2VuZGlmCisKKy8qIERlZmluZSB0byBgdW5zaWduZWQgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKy8qICN1bmRlZiBzaXplX3QgKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3lhc20vc291cmNlL2NvbmZpZy93aW4vbGlieWFzbS1zdGRpbnQuaCBiL3RoaXJkX3BhcnR5L3lhc20vc291cmNlL2NvbmZpZy93aW4vbGlieWFzbS1zdGRpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWNlNjk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkveWFzbS9zb3VyY2UvY29uZmlnL3dpbi9saWJ5YXNtLXN0ZGludC5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfWUFTTV9MSUJZQVNNX1NURElOVF9ICisjZGVmaW5lIF9ZQVNNX0xJQllBU01fU1RESU5UX0ggMQorI2lmbmRlZiBfR0VORVJBVEVEX1NURElOVF9ICisjZGVmaW5lIF9HRU5FUkFURURfU1RESU5UX0ggInlhc20gMS4zLjAiCisvKiBnZW5lcmF0ZWQgdXNpbmcgZ2NjIC1zdGQ9Z251OTkgKi8KKyNkZWZpbmUgX1NURElOVF9IQVZFX1NURElOVF9IIDEKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS95YXNtL3lhc21fYXNzZW1ibGUuZ25pIGIvdGhpcmRfcGFydHkveWFzbS95YXNtX2Fzc2VtYmxlLmduaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2Q1NTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGhpcmRfcGFydHkveWFzbS95YXNtX2Fzc2VtYmxlLmduaQpAQCAtMCwwICsxLDE5NiBAQAorIyBDb3B5cmlnaHQgMjAxNCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjIFRoaXMgcHJvdmlkZXMgdGhlIHlhc21fYXNzZW1ibGUoKSB0ZW1wbGF0ZSB3aGljaCB1c2VzIFlBU00gdG8gYXNzZW1ibGUKKyMgYXNzZW1ibHkgZmlsZXMuCisjCisjIEZpbGVzIHRvIGJlIGFzc2VtYmxlZCB3aXRoIFlBU00gc2hvdWxkIGhhdmUgYW4gZXh0ZW5zaW9uIG9mIC5hc20uCisjCisjIFBhcmFtZXRlcnMKKyMKKyMgICB5YXNtX2ZsYWdzIChvcHRpb25hbCkKKyMgICAgICAgW2xpc3Qgb2Ygc3RyaW5nc10gUGFzcyBhZGRpdGlvbmFsIGZsYWdzIGludG8gWUFTTS4gVGhlc2UgYXJlIGFwcGVuZGVkCisjICAgICAgIHRvIHRoZSBjb21tYW5kIGxpbmUuIE5vdGUgdGhhdCB0aGUgdGFyZ2V0IG1hY2hpbmUgdHlwZSBhbmQgc3lzdGVtIGlzCisjICAgICAgIGFscmVhZHkgc2V0IHVwIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRvb2xjaGFpbiBzbyB5b3UgZG9uJ3QgbmVlZCB0bworIyAgICAgICBzcGVjaWZ5IHRoZXNlIHRoaW5ncyAoc2VlIGJlbG93KS4KKyMKKyMgICAgICAgRXhhbXBsZTogeWFzbV9mbGFncyA9IFsgIi0tZm9yY2Utc3RyaWN0IiBdCisjCisjICAgaW5jbHVkZV9kaXJzIChvcHRpb25hbCkKKyMgICAgICAgW2xpc3Qgb2YgZGlyIG5hbWVzXSBMaXN0IG9mIGFkZGl0aW9uYWwgaW5jbHVkZSBkaXJzLiBOb3RlIHRoYXQgdGhlCisjICAgICAgIHNvdXJjZSByb290IGFuZCB0aGUgcm9vdCBnZW5lcmF0ZWQgZmlsZSBkaXIgaXMgYWx3YXlzIGFkZGVkLCBqdXN0IGxpa2UKKyMgICAgICAgb3VyIEMrKyBidWlsZCBzZXRzIHVwLgorIworIyAgICAgICBFeGFtcGxlOiBpbmNsdWRlX2RpcnMgPSBbICIvL3NvbWUvb3RoZXIvcGF0aCIsIHRhcmdldF9nZW5fZGlyIF0KKyMKKyMgICBkZWZpbmVzIChvcHRpb25hbCkKKyMgICAgICAgW2xpc3Qgb2Ygc3RyaW5nc10gTGlzdCBvZiBkZWZpbmVzLCBhcyB3aXRoIHRoZSBuYXRpdmUgY29kZSBkZWZpbmVzLgorIworIyAgICAgICBFeGFtcGxlOiBkZWZpbmVzID0gWyAiRk9PIiwgIkJBUj0xIiBdCisjCisjICAgaW5wdXRzLCBkZXBzLCB2aXNpYmlsaXR5ICAob3B0aW9uYWwpCisjICAgICAgIFRoZXNlIGhhdmUgdGhlIHNhbWUgbWVhbmluZyBhcyBpbiBhbiBhY3Rpb24uCisjCisjIEV4YW1wbGUKKyMKKyMgICB5YXNtX2Fzc2VtYmxlKCJteV95YXNtX3RhcmdldCIpIHsKKyMgICAgIHNvdXJjZXMgPSBbCisjICAgICAgICJ1bHRyYV9vcHRpbWl6ZWRfYXdlc29tZS5hc20iLAorIyAgICAgXQorIyAgICAgaW5jbHVkZV9kaXJzID0gWyAiYXNzZW1ibHlfaW5jbHVkZSIgXQorIyAgIH0KKworaWYgKGlzX21hYyB8fCBpc19pb3MpIHsKKyAgaWYgKGN1cnJlbnRfY3B1ID09ICJ4ODYiKSB7CisgICAgX3lhc21fZmxhZ3MgPSBbCisgICAgICAiLWZtYWNobzMyIiwKKyAgICAgICItbSIsCisgICAgICAieDg2IiwKKyAgICBdCisgIH0gZWxzZSBpZiAoY3VycmVudF9jcHUgPT0gIng2NCIpIHsKKyAgICBfeWFzbV9mbGFncyA9IFsKKyAgICAgICItZm1hY2hvNjQiLAorICAgICAgIi1tIiwKKyAgICAgICJhbWQ2NCIsCisgICAgXQorICB9Cit9IGVsc2UgaWYgKGlzX3Bvc2l4KSB7CisgIGlmIChjdXJyZW50X2NwdSA9PSAieDg2IikgeworICAgIF95YXNtX2ZsYWdzID0gWworICAgICAgIi1mZWxmMzIiLAorICAgICAgIi1tIiwKKyAgICAgICJ4ODYiLAorICAgIF0KKyAgfSBlbHNlIGlmIChjdXJyZW50X2NwdSA9PSAieDY0IikgeworICAgIF95YXNtX2ZsYWdzID0gWworICAgICAgIi1EUElDIiwKKyAgICAgICItZmVsZjY0IiwKKyAgICAgICItbSIsCisgICAgICAiYW1kNjQiLAorICAgIF0KKyAgfQorfSBlbHNlIGlmIChpc193aW4pIHsKKyAgaWYgKGN1cnJlbnRfY3B1ID09ICJ4ODYiKSB7CisgICAgX3lhc21fZmxhZ3MgPSBbCisgICAgICAiLURQUkVGSVgiLAorICAgICAgIi1md2luMzIiLAorICAgICAgIi1tIiwKKyAgICAgICJ4ODYiLAorICAgIF0KKyAgfSBlbHNlIGlmIChjdXJyZW50X2NwdSA9PSAieDY0IikgeworICAgIF95YXNtX2ZsYWdzID0gWworICAgICAgIi1md2luNjQiLAorICAgICAgIi1tIiwKKyAgICAgICJhbWQ2NCIsCisgICAgXQorICB9Cit9CisKK2lmIChpc193aW4pIHsKKyAgYXNtX29ial9leHRlbnNpb24gPSAib2JqIgorfSBlbHNlIHsKKyAgYXNtX29ial9leHRlbnNpb24gPSAibyIKK30KKwordGVtcGxhdGUoInlhc21fYXNzZW1ibGUiKSB7CisgIGFzc2VydChkZWZpbmVkKGludm9rZXIuc291cmNlcyksICJOZWVkIHNvdXJjZXMgZGVmaW5lZCBmb3IgJHRhcmdldF9uYW1lIikKKworICAjIE9ubHkgZGVwZW5kIG9uIFlBU00gb24geDg2IHN5c3RlbXMuIEZvcmNlIGNvbXBpbGF0aW9uIG9mIC5hc20gZmlsZXMgZm9yCisgICMgQVJNIHRvIGZhaWwuCisgIGFzc2VydChjdXJyZW50X2NwdSA9PSAieDg2IiB8fCBjdXJyZW50X2NwdSA9PSAieDY0IikKKworICBhY3Rpb25fbmFtZSA9ICIke3RhcmdldF9uYW1lfV9hY3Rpb24iCisgIHNvdXJjZV9zZXRfbmFtZSA9IHRhcmdldF9uYW1lCisKKyAgYWN0aW9uX2ZvcmVhY2goYWN0aW9uX25hbWUpIHsKKyAgICAjIE9ubHkgdGhlIHNvdXJjZSBzZXQgY2FuIGRlcGVuZCBvbiB0aGlzLgorICAgIHZpc2liaWxpdHkgPSBbICI6JHNvdXJjZV9zZXRfbmFtZSIgXQorCisgICAgc2NyaXB0ID0gIi8vdGhpcmRfcGFydHkveWFzbS9ydW5feWFzbS5weSIKKyAgICBzb3VyY2VzID0gaW52b2tlci5zb3VyY2VzCisKKyAgICBpZiAoZGVmaW5lZChpbnZva2VyLmlucHV0cykpIHsKKyAgICAgIGlucHV0cyA9IGludm9rZXIuaW5wdXRzCisgICAgfQorCisgICAgIyBFeGVjdXRhYmxlIChmaXJzdCBpbiB0aGUgYXJncykuIFRoZSBiaW5hcnkgbWlnaHQgYmUgaW4gdGhlIHJvb3QgYnVpbGQgZGlyCisgICAgIyAobm8gY3Jvc3MtY29tcGlsaW5nKSBvciBpbiBhIHRvb2xjaGFpbi1zcGVjaWZpYyBzdWJkaXJlY3Rvcnkgb2YgdGhhdAorICAgICMgKHdoZW4gY3Jvc3MtY29tcGlsaW5nKS4KKyAgICB5YXNtX2xhYmVsID0gIi8vdGhpcmRfcGFydHkveWFzbSgkaG9zdF90b29sY2hhaW4pIgorICAgIGFyZ3MgPSBbICIuLyIgKyAgIyBGb3JjZSBjdXJyZW50IGRpci4KKyAgICAgICAgICAgICByZWJhc2VfcGF0aChnZXRfbGFiZWxfaW5mbyh5YXNtX2xhYmVsLCAicm9vdF9vdXRfZGlyIikgKyAiL3lhc20iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RfYnVpbGRfZGlyKSBdCisKKyAgICAjIERlcHMuCisgICAgZGVwcyA9IFsKKyAgICAgIHlhc21fbGFiZWwsCisgICAgXQorICAgIGlmIChkZWZpbmVkKGludm9rZXIuZGVwcykpIHsKKyAgICAgIGRlcHMgKz0gaW52b2tlci5kZXBzCisgICAgfQorCisgICAgIyBGbGFncy4KKyAgICBhcmdzICs9IF95YXNtX2ZsYWdzCisgICAgaWYgKGRlZmluZWQoaW52b2tlci55YXNtX2ZsYWdzKSkgeworICAgICAgYXJncyArPSBpbnZva2VyLnlhc21fZmxhZ3MKKyAgICB9CisKKyAgICAjIFVzZXIgZGVmaW5lZCBpbmNsdWRlIGRpcnMgZ28gZmlyc3QuCisgICAgaWYgKGRlZmluZWQoaW52b2tlci5pbmNsdWRlX2RpcnMpKSB7CisgICAgICBmb3JlYWNoKGluY2x1ZGUsIGludm9rZXIuaW5jbHVkZV9kaXJzKSB7CisgICAgICAgIGFyZ3MgKz0gWyAiLUkiICsgcmViYXNlX3BhdGgoaW5jbHVkZSwgcm9vdF9idWlsZF9kaXIpIF0KKyAgICAgIH0KKyAgICB9CisKKyAgICAjIERlZmF1bHQgeWFzbSBpbmNsdWRlIGRpcnMuIE1ha2UgaXQgbWF0Y2ggdGhlIG5hdGl2ZSBidWlsZCAoc291cmNlIHJvb3QgYW5kCisgICAgIyByb290IGdlbmVyYXRlZCBjb2RlIGRpcmVjdG9yeSkuCisgICAgIyBUaGlzIGdvZXMgdG8gdGhlIGVuZCBvZiBpbmNsdWRlIGxpc3QuCisgICAgYXJncyArPSBbCisgICAgICAiLUkuIiwKKworICAgICAgIyBVc2luZyAiLy8uIiB3aWxsIHByb2R1Y2UgYSByZWxhdGl2ZSBwYXRoICIuLi8uLiIgd2hpY2ggbG9va3MgYmV0dGVyIHRoYW4KKyAgICAgICMgIi4uLy4uLyIgd2hpY2ggd2lsbCByZXN1bHQgZnJvbSB1c2luZyAiLy8iIGFzIHRoZSBiYXNlIChhbHRob3VnaCBib3RoCisgICAgICAjIHdvcmspLiBUaGlzIGlzIGJlY2F1c2UgcmViYXNlX3BhdGggd2lsbCB0ZXJtaW5hdGUgdGhlIHJlc3VsdCBpbiBhCisgICAgICAjIHNsYXNoIGlmIHRoZSBpbnB1dCBlbmRzIGluIGEgc2xhc2guCisgICAgICAiLUkiICsgcmViYXNlX3BhdGgoIi8vLiIsIHJvb3RfYnVpbGRfZGlyKSwKKyAgICAgICItSSIgKyByZWJhc2VfcGF0aChyb290X2dlbl9kaXIsIHJvb3RfYnVpbGRfZGlyKSwKKyAgICBdCisKKyAgICAjIEV4dHJhIGRlZmluZXMuCisgICAgaWYgKGRlZmluZWQoaW52b2tlci5kZWZpbmVzKSkgeworICAgICAgZm9yZWFjaChkZWYsIGludm9rZXIuZGVmaW5lcykgeworICAgICAgICBhcmdzICs9IFsgIi1EJGRlZiIgXQorICAgICAgfQorICAgIH0KKworICAgICMgT3V0cHV0IGZpbGUuCisgICAgb3V0cHV0cyA9IFsKKyAgICAgICIkdGFyZ2V0X291dF9kaXIvJHNvdXJjZV9zZXRfbmFtZS97e3NvdXJjZV9uYW1lX3BhcnR9fS5vIiwKKyAgICBdCisgICAgYXJncyArPSBbCisgICAgICAiLW8iLAorICAgICAgcmViYXNlX3BhdGgob3V0cHV0c1swXSwgcm9vdF9idWlsZF9kaXIpLAorICAgICAgInt7c291cmNlfX0iLAorICAgIF0KKworICAgICMgVGhlIHdyYXBwZXIgc2NyaXB0IHJ1bl95YXNtIHdpbGwgd3JpdGUgdGhlIGRlcGZpbGUgdG8gdGhlIHNhbWUgbmFtZSBhcworICAgICMgdGhlIG91dHB1dCBidXQgd2l0aCAuZCBhcHBlbmRlZCAobGlrZSBnY2Mgd2lsbCkuCisgICAgZGVwZmlsZSA9IG91dHB1dHNbMF0gKyAiLmQiCisgIH0KKworICAjIEdhdGhlciB0aGUgLm8gZmlsZXMgaW50byBhIGxpbmthYmxlIHRoaW5nLiBUaGlzIGRvZXNuJ3QgYWN0dWFsbHkgbGluaworICAjIGFueXRoaW5nIChhIHNvdXJjZSBzZXQganVzdCBjb21waWxlcyBmaWxlcyB0byBsaW5rIGxhdGVyKSwgYnV0IHdpbGwgcGFzcworICAjIHRoZSBvYmplY3QgZmlsZXMgZ2VuZXJhdGVkIGJ5IHRoZSBhY3Rpb24gdXAgdGhlIGRlcGVuZGVuY3kgY2hhaW4uCisgIHN0YXRpY19saWJyYXJ5KHNvdXJjZV9zZXRfbmFtZSkgeworICAgIGlmIChkZWZpbmVkKGludm9rZXIudmlzaWJpbGl0eSkpIHsKKyAgICAgIHZpc2liaWxpdHkgPSBpbnZva2VyLnZpc2liaWxpdHkKKyAgICB9CisKKyAgICBzb3VyY2VzID0gZ2V0X3RhcmdldF9vdXRwdXRzKCI6JGFjdGlvbl9uYW1lIikKKworICAgIGRlcHMgPSBbCisgICAgICAiOiRhY3Rpb25fbmFtZSIsCisgICAgXQorICB9Cit9CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS96bGliX3YxMjgvYWRsZXIzMi5jIGIvdGhpcmRfcGFydHkvemxpYl92MTI4L2FkbGVyMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJhODRjZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS96bGliX3YxMjgvYWRsZXIzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qIGFkbGVyMzIuYyAtLSBjb21wdXRlIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZiBhIGRhdGEgc3RyZWFtCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMSBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyogQCgjKSAkSWQkICovCi0KLSNpbmNsdWRlICJ6dXRpbC5oIgotCi0jZGVmaW5lIGxvY2FsIHN0YXRpYwotCi1sb2NhbCB1TG9uZyBhZGxlcjMyX2NvbWJpbmVfIE9GKCh1TG9uZyBhZGxlcjEsIHVMb25nIGFkbGVyMiwgel9vZmY2NF90IGxlbjIpKTsKLQotI2RlZmluZSBCQVNFIDY1NTIxICAgICAgLyogbGFyZ2VzdCBwcmltZSBzbWFsbGVyIHRoYW4gNjU1MzYgKi8KLSNkZWZpbmUgTk1BWCA1NTUyCi0vKiBOTUFYIGlzIHRoZSBsYXJnZXN0IG4gc3VjaCB0aGF0IDI1NW4obisxKS8yICsgKG4rMSkoQkFTRS0xKSA8PSAyXjMyLTEgKi8KLQotI2RlZmluZSBETzEoYnVmLGkpICB7YWRsZXIgKz0gKGJ1ZilbaV07IHN1bTIgKz0gYWRsZXI7fQotI2RlZmluZSBETzIoYnVmLGkpICBETzEoYnVmLGkpOyBETzEoYnVmLGkrMSk7Ci0jZGVmaW5lIERPNChidWYsaSkgIERPMihidWYsaSk7IERPMihidWYsaSsyKTsKLSNkZWZpbmUgRE84KGJ1ZixpKSAgRE80KGJ1ZixpKTsgRE80KGJ1ZixpKzQpOwotI2RlZmluZSBETzE2KGJ1ZikgICBETzgoYnVmLDApOyBETzgoYnVmLDgpOwotCi0vKiB1c2UgTk9fRElWSURFIGlmIHlvdXIgcHJvY2Vzc29yIGRvZXMgbm90IGRvIGRpdmlzaW9uIGluIGhhcmR3YXJlIC0tCi0gICB0cnkgaXQgYm90aCB3YXlzIHRvIHNlZSB3aGljaCBpcyBmYXN0ZXIgKi8KLSNpZmRlZiBOT19ESVZJREUKLS8qIG5vdGUgdGhhdCB0aGlzIGFzc3VtZXMgQkFTRSBpcyA2NTUyMSwgd2hlcmUgNjU1MzYgJSA2NTUyMSA9PSAxNQotICAgKHRoYW5rIHlvdSB0byBKb2huIFJlaXNlciBmb3IgcG9pbnRpbmcgdGhpcyBvdXQpICovCi0jICBkZWZpbmUgQ0hPUChhKSBcCi0gICAgZG8geyBcCi0gICAgICAgIHVuc2lnbmVkIGxvbmcgdG1wID0gYSA+PiAxNjsgXAotICAgICAgICBhICY9IDB4ZmZmZlVMOyBcCi0gICAgICAgIGEgKz0gKHRtcCA8PCA0KSAtIHRtcDsgXAotICAgIH0gd2hpbGUgKDApCi0jICBkZWZpbmUgTU9EMjgoYSkgXAotICAgIGRvIHsgXAotICAgICAgICBDSE9QKGEpOyBcCi0gICAgICAgIGlmIChhID49IEJBU0UpIGEgLT0gQkFTRTsgXAotICAgIH0gd2hpbGUgKDApCi0jICBkZWZpbmUgTU9EKGEpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgQ0hPUChhKTsgXAotICAgICAgICBNT0QyOChhKTsgXAotICAgIH0gd2hpbGUgKDApCi0jICBkZWZpbmUgTU9ENjMoYSkgXAotICAgIGRvIHsgLyogdGhpcyBhc3N1bWVzIGEgaXMgbm90IG5lZ2F0aXZlICovIFwKLSAgICAgICAgel9vZmY2NF90IHRtcCA9IGEgPj4gMzI7IFwKLSAgICAgICAgYSAmPSAweGZmZmZmZmZmTDsgXAotICAgICAgICBhICs9ICh0bXAgPDwgOCkgLSAodG1wIDw8IDUpICsgdG1wOyBcCi0gICAgICAgIHRtcCA9IGEgPj4gMTY7IFwKLSAgICAgICAgYSAmPSAweGZmZmZMOyBcCi0gICAgICAgIGEgKz0gKHRtcCA8PCA0KSAtIHRtcDsgXAotICAgICAgICB0bXAgPSBhID4+IDE2OyBcCi0gICAgICAgIGEgJj0gMHhmZmZmTDsgXAotICAgICAgICBhICs9ICh0bXAgPDwgNCkgLSB0bXA7IFwKLSAgICAgICAgaWYgKGEgPj0gQkFTRSkgYSAtPSBCQVNFOyBcCi0gICAgfSB3aGlsZSAoMCkKLSNlbHNlCi0jICBkZWZpbmUgTU9EKGEpIGEgJT0gQkFTRQotIyAgZGVmaW5lIE1PRDI4KGEpIGEgJT0gQkFTRQotIyAgZGVmaW5lIE1PRDYzKGEpIGEgJT0gQkFTRQotI2VuZGlmCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLXVMb25nIFpFWFBPUlQgYWRsZXIzMigKLSAgICB1TG9uZyBhZGxlciwKLSAgICBjb25zdCBCeXRlZiAqYnVmLAotICAgIHVJbnQgbGVuKQotewotICAgIHVuc2lnbmVkIGxvbmcgc3VtMjsKLSAgICB1bnNpZ25lZCBuOwotCi0gICAgLyogc3BsaXQgQWRsZXItMzIgaW50byBjb21wb25lbnQgc3VtcyAqLwotICAgIHN1bTIgPSAoYWRsZXIgPj4gMTYpICYgMHhmZmZmOwotICAgIGFkbGVyICY9IDB4ZmZmZjsKLQotICAgIC8qIGluIGNhc2UgdXNlciBsaWtlcyBkb2luZyBhIGJ5dGUgYXQgYSB0aW1lLCBrZWVwIGl0IGZhc3QgKi8KLSAgICBpZiAobGVuID09IDEpIHsKLSAgICAgICAgYWRsZXIgKz0gYnVmWzBdOwotICAgICAgICBpZiAoYWRsZXIgPj0gQkFTRSkKLSAgICAgICAgICAgIGFkbGVyIC09IEJBU0U7Ci0gICAgICAgIHN1bTIgKz0gYWRsZXI7Ci0gICAgICAgIGlmIChzdW0yID49IEJBU0UpCi0gICAgICAgICAgICBzdW0yIC09IEJBU0U7Ci0gICAgICAgIHJldHVybiBhZGxlciB8IChzdW0yIDw8IDE2KTsKLSAgICB9Ci0KLSAgICAvKiBpbml0aWFsIEFkbGVyLTMyIHZhbHVlIChkZWZlcnJlZCBjaGVjayBmb3IgbGVuID09IDEgc3BlZWQpICovCi0gICAgaWYgKGJ1ZiA9PSBaX05VTEwpCi0gICAgICAgIHJldHVybiAxTDsKLQotICAgIC8qIGluIGNhc2Ugc2hvcnQgbGVuZ3RocyBhcmUgcHJvdmlkZWQsIGtlZXAgaXQgc29tZXdoYXQgZmFzdCAqLwotICAgIGlmIChsZW4gPCAxNikgewotICAgICAgICB3aGlsZSAobGVuLS0pIHsKLSAgICAgICAgICAgIGFkbGVyICs9ICpidWYrKzsKLSAgICAgICAgICAgIHN1bTIgKz0gYWRsZXI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFkbGVyID49IEJBU0UpCi0gICAgICAgICAgICBhZGxlciAtPSBCQVNFOwotICAgICAgICBNT0QyOChzdW0yKTsgICAgICAgICAgICAvKiBvbmx5IGFkZGVkIHNvIG1hbnkgQkFTRSdzICovCi0gICAgICAgIHJldHVybiBhZGxlciB8IChzdW0yIDw8IDE2KTsKLSAgICB9Ci0KLSAgICAvKiBkbyBsZW5ndGggTk1BWCBibG9ja3MgLS0gcmVxdWlyZXMganVzdCBvbmUgbW9kdWxvIG9wZXJhdGlvbiAqLwotICAgIHdoaWxlIChsZW4gPj0gTk1BWCkgewotICAgICAgICBsZW4gLT0gTk1BWDsKLSAgICAgICAgbiA9IE5NQVggLyAxNjsgICAgICAgICAgLyogTk1BWCBpcyBkaXZpc2libGUgYnkgMTYgKi8KLSAgICAgICAgZG8gewotICAgICAgICAgICAgRE8xNihidWYpOyAgICAgICAgICAvKiAxNiBzdW1zIHVucm9sbGVkICovCi0gICAgICAgICAgICBidWYgKz0gMTY7Ci0gICAgICAgIH0gd2hpbGUgKC0tbik7Ci0gICAgICAgIE1PRChhZGxlcik7Ci0gICAgICAgIE1PRChzdW0yKTsKLSAgICB9Ci0KLSAgICAvKiBkbyByZW1haW5pbmcgYnl0ZXMgKGxlc3MgdGhhbiBOTUFYLCBzdGlsbCBqdXN0IG9uZSBtb2R1bG8pICovCi0gICAgaWYgKGxlbikgeyAgICAgICAgICAgICAgICAgIC8qIGF2b2lkIG1vZHVsb3MgaWYgbm9uZSByZW1haW5pbmcgKi8KLSAgICAgICAgd2hpbGUgKGxlbiA+PSAxNikgewotICAgICAgICAgICAgbGVuIC09IDE2OwotICAgICAgICAgICAgRE8xNihidWYpOwotICAgICAgICAgICAgYnVmICs9IDE2OwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChsZW4tLSkgewotICAgICAgICAgICAgYWRsZXIgKz0gKmJ1ZisrOwotICAgICAgICAgICAgc3VtMiArPSBhZGxlcjsKLSAgICAgICAgfQotICAgICAgICBNT0QoYWRsZXIpOwotICAgICAgICBNT0Qoc3VtMik7Ci0gICAgfQotCi0gICAgLyogcmV0dXJuIHJlY29tYmluZWQgc3VtcyAqLwotICAgIHJldHVybiBhZGxlciB8IChzdW0yIDw8IDE2KTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotbG9jYWwgdUxvbmcgYWRsZXIzMl9jb21iaW5lXygKLSAgICB1TG9uZyBhZGxlcjEsCi0gICAgdUxvbmcgYWRsZXIyLAotICAgIHpfb2ZmNjRfdCBsZW4yKQotewotICAgIHVuc2lnbmVkIGxvbmcgc3VtMTsKLSAgICB1bnNpZ25lZCBsb25nIHN1bTI7Ci0gICAgdW5zaWduZWQgcmVtOwotCi0gICAgLyogZm9yIG5lZ2F0aXZlIGxlbiwgcmV0dXJuIGludmFsaWQgYWRsZXIzMiBhcyBhIGNsdWUgZm9yIGRlYnVnZ2luZyAqLwotICAgIGlmIChsZW4yIDwgMCkKLSAgICAgICAgcmV0dXJuIDB4ZmZmZmZmZmZVTDsKLQotICAgIC8qIHRoZSBkZXJpdmF0aW9uIG9mIHRoaXMgZm9ybXVsYSBpcyBsZWZ0IGFzIGFuIGV4ZXJjaXNlIGZvciB0aGUgcmVhZGVyICovCi0gICAgTU9ENjMobGVuMik7ICAgICAgICAgICAgICAgIC8qIGFzc3VtZXMgbGVuMiA+PSAwICovCi0gICAgcmVtID0gKHVuc2lnbmVkKWxlbjI7Ci0gICAgc3VtMSA9IGFkbGVyMSAmIDB4ZmZmZjsKLSAgICBzdW0yID0gcmVtICogc3VtMTsKLSAgICBNT0Qoc3VtMik7Ci0gICAgc3VtMSArPSAoYWRsZXIyICYgMHhmZmZmKSArIEJBU0UgLSAxOwotICAgIHN1bTIgKz0gKChhZGxlcjEgPj4gMTYpICYgMHhmZmZmKSArICgoYWRsZXIyID4+IDE2KSAmIDB4ZmZmZikgKyBCQVNFIC0gcmVtOwotICAgIGlmIChzdW0xID49IEJBU0UpIHN1bTEgLT0gQkFTRTsKLSAgICBpZiAoc3VtMSA+PSBCQVNFKSBzdW0xIC09IEJBU0U7Ci0gICAgaWYgKHN1bTIgPj0gKEJBU0UgPDwgMSkpIHN1bTIgLT0gKEJBU0UgPDwgMSk7Ci0gICAgaWYgKHN1bTIgPj0gQkFTRSkgc3VtMiAtPSBCQVNFOwotICAgIHJldHVybiBzdW0xIHwgKHN1bTIgPDwgMTYpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi11TG9uZyBaRVhQT1JUIGFkbGVyMzJfY29tYmluZSgKLSAgICB1TG9uZyBhZGxlcjEsCi0gICAgdUxvbmcgYWRsZXIyLAotICAgIHpfb2ZmX3QgbGVuMikKLXsKLSAgICByZXR1cm4gYWRsZXIzMl9jb21iaW5lXyhhZGxlcjEsIGFkbGVyMiwgbGVuMik7Ci19Ci0KLXVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lNjQoCi0gICAgdUxvbmcgYWRsZXIxLAotICAgIHVMb25nIGFkbGVyMiwKLSAgICB6X29mZjY0X3QgbGVuMikKLXsKLSAgICByZXR1cm4gYWRsZXIzMl9jb21iaW5lXyhhZGxlcjEsIGFkbGVyMiwgbGVuMik7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS96bGliX3YxMjgvY29tcHJlc3MuYyBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9jb21wcmVzcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzE0ZmJjLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9jb21wcmVzcy5jCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyogY29tcHJlc3MuYyAtLSBjb21wcmVzcyBhIG1lbW9yeSBidWZmZXIKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1IEplYW4tbG91cCBHYWlsbHkuCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyogQCgjKSAkSWQkICovCi0KLSNkZWZpbmUgWkxJQl9JTlRFUk5BTAotI2luY2x1ZGUgInpsaWIuaCIKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiBUaGUgbGV2ZWwKLSAgIHBhcmFtZXRlciBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyBpbiBkZWZsYXRlSW5pdC4gIHNvdXJjZUxlbiBpcyB0aGUgYnl0ZQotICAgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZQotICAgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGF0IGxlYXN0IDAuMSUgbGFyZ2VyIHRoYW4gc291cmNlTGVuIHBsdXMKLSAgIDEyIGJ5dGVzLiBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZSBjb21wcmVzc2VkIGJ1ZmZlci4KLQotICAgICBjb21wcmVzczIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCi0gICBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIsCi0gICBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgbGV2ZWwgcGFyYW1ldGVyIGlzIGludmFsaWQuCi0qLwotaW50IFpFWFBPUlQgY29tcHJlc3MyICgKLSAgICBCeXRlZiAqZGVzdCwKLSAgICB1TG9uZ2YgKmRlc3RMZW4sCi0gICAgY29uc3QgQnl0ZWYgKnNvdXJjZSwKLSAgICB1TG9uZyBzb3VyY2VMZW4sCi0gICAgaW50IGxldmVsKQotewotICAgIHpfc3RyZWFtIHN0cmVhbTsKLSAgICBpbnQgZXJyOwotCi0gICAgc3RyZWFtLm5leHRfaW4gPSAoel9jb25zdCBCeXRlZiAqKXNvdXJjZTsKLSAgICBzdHJlYW0uYXZhaWxfaW4gPSAodUludClzb3VyY2VMZW47Ci0jaWZkZWYgTUFYU0VHXzY0SwotICAgIC8qIENoZWNrIGZvciBzb3VyY2UgPiA2NEsgb24gMTYtYml0IG1hY2hpbmU6ICovCi0gICAgaWYgKCh1TG9uZylzdHJlYW0uYXZhaWxfaW4gIT0gc291cmNlTGVuKSByZXR1cm4gWl9CVUZfRVJST1I7Ci0jZW5kaWYKLSAgICBzdHJlYW0ubmV4dF9vdXQgPSBkZXN0OwotICAgIHN0cmVhbS5hdmFpbF9vdXQgPSAodUludCkqZGVzdExlbjsKLSAgICBpZiAoKHVMb25nKXN0cmVhbS5hdmFpbF9vdXQgIT0gKmRlc3RMZW4pIHJldHVybiBaX0JVRl9FUlJPUjsKLQotICAgIHN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOwotICAgIHN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKLSAgICBzdHJlYW0ub3BhcXVlID0gKHZvaWRwZikwOwotCi0gICAgZXJyID0gZGVmbGF0ZUluaXQoJnN0cmVhbSwgbGV2ZWwpOwotICAgIGlmIChlcnIgIT0gWl9PSykgcmV0dXJuIGVycjsKLQotICAgIGVyciA9IGRlZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOwotICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EKSB7Ci0gICAgICAgIGRlZmxhdGVFbmQoJnN0cmVhbSk7Ci0gICAgICAgIHJldHVybiBlcnIgPT0gWl9PSyA/IFpfQlVGX0VSUk9SIDogZXJyOwotICAgIH0KLSAgICAqZGVzdExlbiA9IHN0cmVhbS50b3RhbF9vdXQ7Ci0KLSAgICBlcnIgPSBkZWZsYXRlRW5kKCZzdHJlYW0pOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICovCi1pbnQgWkVYUE9SVCBjb21wcmVzcyAoCi0gICAgQnl0ZWYgKmRlc3QsCi0gICAgdUxvbmdmICpkZXN0TGVuLAotICAgIGNvbnN0IEJ5dGVmICpzb3VyY2UsCi0gICAgdUxvbmcgc291cmNlTGVuKQotewotICAgIHJldHVybiBjb21wcmVzczIoZGVzdCwgZGVzdExlbiwgc291cmNlLCBzb3VyY2VMZW4sIFpfREVGQVVMVF9DT01QUkVTU0lPTik7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICBJZiB0aGUgZGVmYXVsdCBtZW1MZXZlbCBvciB3aW5kb3dCaXRzIGZvciBkZWZsYXRlSW5pdCgpIGlzIGNoYW5nZWQsIHRoZW4KLSAgIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgdXBkYXRlZC4KLSAqLwotdUxvbmcgWkVYUE9SVCBjb21wcmVzc0JvdW5kICgKLSAgICB1TG9uZyBzb3VyY2VMZW4pCi17Ci0gICAgcmV0dXJuIHNvdXJjZUxlbiArIChzb3VyY2VMZW4gPj4gMTIpICsgKHNvdXJjZUxlbiA+PiAxNCkgKwotICAgICAgICAgICAoc291cmNlTGVuID4+IDI1KSArIDEzOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvemxpYl92MTI4L2NyYzMyLmMgYi90aGlyZF9wYXJ0eS96bGliX3YxMjgvY3JjMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAwNzJjOS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS96bGliX3YxMjgvY3JjMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDQyNSArMCwwIEBACi0vKiBjcmMzMi5jIC0tIGNvbXB1dGUgdGhlIENSQy0zMiBvZiBhIGRhdGEgc3RyZWFtCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwNiwgMjAxMCwgMjAxMSwgMjAxMiBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKgotICogVGhhbmtzIHRvIFJvZG5leSBCcm93biA8cmJyb3duNjRAY3NjLmNvbS5hdT4gZm9yIGhpcyBjb250cmlidXRpb24gb2YgZmFzdGVyCi0gKiBDUkMgbWV0aG9kczogZXhjbHVzaXZlLW9yaW5nIDMyIGJpdHMgb2YgZGF0YSBhdCBhIHRpbWUsIGFuZCBwcmUtY29tcHV0aW5nCi0gKiB0YWJsZXMgZm9yIHVwZGF0aW5nIHRoZSBzaGlmdCByZWdpc3RlciBpbiBvbmUgc3RlcCB3aXRoIHRocmVlIGV4Y2x1c2l2ZS1vcnMKLSAqIGluc3RlYWQgb2YgZm91ciBzdGVwcyB3aXRoIGZvdXIgZXhjbHVzaXZlLW9ycy4gIFRoaXMgcmVzdWx0cyBpbiBhYm91dCBhCi0gKiBmYWN0b3Igb2YgdHdvIGluY3JlYXNlIGluIHNwZWVkIG9uIGEgUG93ZXIgUEMgRzQgKFBQQzc0NTUpIHVzaW5nIGdjYyAtTzMuCi0gKi8KLQotLyogQCgjKSAkSWQkICovCi0KLS8qCi0gIE5vdGUgb24gdGhlIHVzZSBvZiBEWU5BTUlDX0NSQ19UQUJMRTogdGhlcmUgaXMgbm8gbXV0ZXggb3Igc2VtYXBob3JlCi0gIHByb3RlY3Rpb24gb24gdGhlIHN0YXRpYyB2YXJpYWJsZXMgdXNlZCB0byBjb250cm9sIHRoZSBmaXJzdC11c2UgZ2VuZXJhdGlvbgotICBvZiB0aGUgY3JjIHRhYmxlcy4gIFRoZXJlZm9yZSwgaWYgeW91ICNkZWZpbmUgRFlOQU1JQ19DUkNfVEFCTEUsIHlvdSBzaG91bGQKLSAgZmlyc3QgY2FsbCBnZXRfY3JjX3RhYmxlKCkgdG8gaW5pdGlhbGl6ZSB0aGUgdGFibGVzIGJlZm9yZSBhbGxvd2luZyBtb3JlIHRoYW4KLSAgb25lIHRocmVhZCB0byB1c2UgY3JjMzIoKS4KLQotICBEWU5BTUlDX0NSQ19UQUJMRSBhbmQgTUFLRUNSQ0ggY2FuIGJlICNkZWZpbmVkIHRvIHdyaXRlIG91dCBjcmMzMi5oLgotICovCi0KLSNpZmRlZiBNQUtFQ1JDSAotIyAgaW5jbHVkZSA8c3RkaW8uaD4KLSMgIGlmbmRlZiBEWU5BTUlDX0NSQ19UQUJMRQotIyAgICBkZWZpbmUgRFlOQU1JQ19DUkNfVEFCTEUKLSMgIGVuZGlmIC8qICFEWU5BTUlDX0NSQ19UQUJMRSAqLwotI2VuZGlmIC8qIE1BS0VDUkNIICovCi0KLSNpbmNsdWRlICJ6dXRpbC5oIiAgICAgIC8qIGZvciBTVERDIGFuZCBGQVIgZGVmaW5pdGlvbnMgKi8KLQotI2RlZmluZSBsb2NhbCBzdGF0aWMKLQotLyogRGVmaW5pdGlvbnMgZm9yIGRvaW5nIHRoZSBjcmMgZm91ciBkYXRhIGJ5dGVzIGF0IGEgdGltZS4gKi8KLSNpZiAhZGVmaW5lZChOT0JZRk9VUikgJiYgZGVmaW5lZChaX1U0KQotIyAgZGVmaW5lIEJZRk9VUgotI2VuZGlmCi0jaWZkZWYgQllGT1VSCi0gICBsb2NhbCB1bnNpZ25lZCBsb25nIGNyYzMyX2xpdHRsZSBPRigodW5zaWduZWQgbG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICosIHVuc2lnbmVkKSk7Ci0gICBsb2NhbCB1bnNpZ25lZCBsb25nIGNyYzMyX2JpZyBPRigodW5zaWduZWQgbG9uZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICosIHVuc2lnbmVkKSk7Ci0jICBkZWZpbmUgVEJMUyA4Ci0jZWxzZQotIyAgZGVmaW5lIFRCTFMgMQotI2VuZGlmIC8qIEJZRk9VUiAqLwotCi0vKiBMb2NhbCBmdW5jdGlvbnMgZm9yIGNyYyBjb25jYXRlbmF0aW9uICovCi1sb2NhbCB1bnNpZ25lZCBsb25nIGdmMl9tYXRyaXhfdGltZXMgT0YoKHVuc2lnbmVkIGxvbmcgKm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyB2ZWMpKTsKLWxvY2FsIHZvaWQgZ2YyX21hdHJpeF9zcXVhcmUgT0YoKHVuc2lnbmVkIGxvbmcgKnNxdWFyZSwgdW5zaWduZWQgbG9uZyAqbWF0KSk7Ci1sb2NhbCB1TG9uZyBjcmMzMl9jb21iaW5lXyBPRigodUxvbmcgY3JjMSwgdUxvbmcgY3JjMiwgel9vZmY2NF90IGxlbjIpKTsKLQotCi0jaWZkZWYgRFlOQU1JQ19DUkNfVEFCTEUKLQotbG9jYWwgdm9sYXRpbGUgaW50IGNyY190YWJsZV9lbXB0eSA9IDE7Ci1sb2NhbCB6X2NyY190IEZBUiBjcmNfdGFibGVbVEJMU11bMjU2XTsKLWxvY2FsIHZvaWQgbWFrZV9jcmNfdGFibGUgT0YoKHZvaWQpKTsKLSNpZmRlZiBNQUtFQ1JDSAotICAgbG9jYWwgdm9pZCB3cml0ZV90YWJsZSBPRigoRklMRSAqLCBjb25zdCB6X2NyY190IEZBUiAqKSk7Ci0jZW5kaWYgLyogTUFLRUNSQ0ggKi8KLS8qCi0gIEdlbmVyYXRlIHRhYmxlcyBmb3IgYSBieXRlLXdpc2UgMzItYml0IENSQyBjYWxjdWxhdGlvbiBvbiB0aGUgcG9seW5vbWlhbDoKLSAgeF4zMit4XjI2K3heMjMreF4yMit4XjE2K3heMTIreF4xMSt4XjEwK3heOCt4XjcreF41K3heNCt4XjIreCsxLgotCi0gIFBvbHlub21pYWxzIG92ZXIgR0YoMikgYXJlIHJlcHJlc2VudGVkIGluIGJpbmFyeSwgb25lIGJpdCBwZXIgY29lZmZpY2llbnQsCi0gIHdpdGggdGhlIGxvd2VzdCBwb3dlcnMgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0LiAgVGhlbiBhZGRpbmcgcG9seW5vbWlhbHMKLSAgaXMganVzdCBleGNsdXNpdmUtb3IsIGFuZCBtdWx0aXBseWluZyBhIHBvbHlub21pYWwgYnkgeCBpcyBhIHJpZ2h0IHNoaWZ0IGJ5Ci0gIG9uZS4gIElmIHdlIGNhbGwgdGhlIGFib3ZlIHBvbHlub21pYWwgcCwgYW5kIHJlcHJlc2VudCBhIGJ5dGUgYXMgdGhlCi0gIHBvbHlub21pYWwgcSwgYWxzbyB3aXRoIHRoZSBsb3dlc3QgcG93ZXIgaW4gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IChzbyB0aGUKLSAgYnl0ZSAweGIxIGlzIHRoZSBwb2x5bm9taWFsIHheNyt4XjMreCsxKSwgdGhlbiB0aGUgQ1JDIGlzIChxKnheMzIpIG1vZCBwLAotICB3aGVyZSBhIG1vZCBiIG1lYW5zIHRoZSByZW1haW5kZXIgYWZ0ZXIgZGl2aWRpbmcgYSBieSBiLgotCi0gIFRoaXMgY2FsY3VsYXRpb24gaXMgZG9uZSB1c2luZyB0aGUgc2hpZnQtcmVnaXN0ZXIgbWV0aG9kIG9mIG11bHRpcGx5aW5nIGFuZAotICB0YWtpbmcgdGhlIHJlbWFpbmRlci4gIFRoZSByZWdpc3RlciBpcyBpbml0aWFsaXplZCB0byB6ZXJvLCBhbmQgZm9yIGVhY2gKLSAgaW5jb21pbmcgYml0LCB4XjMyIGlzIGFkZGVkIG1vZCBwIHRvIHRoZSByZWdpc3RlciBpZiB0aGUgYml0IGlzIGEgb25lICh3aGVyZQotICB4XjMyIG1vZCBwIGlzIHAreF4zMiA9IHheMjYrLi4uKzEpLCBhbmQgdGhlIHJlZ2lzdGVyIGlzIG11bHRpcGxpZWQgbW9kIHAgYnkKLSAgeCAod2hpY2ggaXMgc2hpZnRpbmcgcmlnaHQgYnkgb25lIGFuZCBhZGRpbmcgeF4zMiBtb2QgcCBpZiB0aGUgYml0IHNoaWZ0ZWQKLSAgb3V0IGlzIGEgb25lKS4gIFdlIHN0YXJ0IHdpdGggdGhlIGhpZ2hlc3QgcG93ZXIgKGxlYXN0IHNpZ25pZmljYW50IGJpdCkgb2YKLSAgcSBhbmQgcmVwZWF0IGZvciBhbGwgZWlnaHQgYml0cyBvZiBxLgotCi0gIFRoZSBmaXJzdCB0YWJsZSBpcyBzaW1wbHkgdGhlIENSQyBvZiBhbGwgcG9zc2libGUgZWlnaHQgYml0IHZhbHVlcy4gIFRoaXMgaXMKLSAgYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gZ2VuZXJhdGUgQ1JDcyBvbiBkYXRhIGEgYnl0ZSBhdCBhIHRpbWUgZm9yIGFsbAotICBjb21iaW5hdGlvbnMgb2YgQ1JDIHJlZ2lzdGVyIHZhbHVlcyBhbmQgaW5jb21pbmcgYnl0ZXMuICBUaGUgcmVtYWluaW5nIHRhYmxlcwotICBhbGxvdyBmb3Igd29yZC1hdC1hLXRpbWUgQ1JDIGNhbGN1bGF0aW9uIGZvciBib3RoIGJpZy1lbmRpYW4gYW5kIGxpdHRsZS0KLSAgZW5kaWFuIG1hY2hpbmVzLCB3aGVyZSBhIHdvcmQgaXMgZm91ciBieXRlcy4KLSovCi1sb2NhbCB2b2lkIG1ha2VfY3JjX3RhYmxlKCkKLXsKLSAgICB6X2NyY190IGM7Ci0gICAgaW50IG4sIGs7Ci0gICAgel9jcmNfdCBwb2x5OyAgICAgICAgICAgICAgICAgICAgICAgLyogcG9seW5vbWlhbCBleGNsdXNpdmUtb3IgcGF0dGVybiAqLwotICAgIC8qIHRlcm1zIG9mIHBvbHlub21pYWwgZGVmaW5pbmcgdGhpcyBjcmMgKGV4Y2VwdCB4XjMyKTogKi8KLSAgICBzdGF0aWMgdm9sYXRpbGUgaW50IGZpcnN0ID0gMTsgICAgICAvKiBmbGFnIHRvIGxpbWl0IGNvbmN1cnJlbnQgbWFraW5nICovCi0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcFtdID0gezAsMSwyLDQsNSw3LDgsMTAsMTEsMTIsMTYsMjIsMjMsMjZ9OwotCi0gICAgLyogU2VlIGlmIGFub3RoZXIgdGFzayBpcyBhbHJlYWR5IGRvaW5nIHRoaXMgKG5vdCB0aHJlYWQtc2FmZSwgYnV0IGJldHRlcgotICAgICAgIHRoYW4gbm90aGluZyAtLSBzaWduaWZpY2FudGx5IHJlZHVjZXMgZHVyYXRpb24gb2YgdnVsbmVyYWJpbGl0eSBpbgotICAgICAgIGNhc2UgdGhlIGFkdmljZSBhYm91dCBEWU5BTUlDX0NSQ19UQUJMRSBpcyBpZ25vcmVkKSAqLwotICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IDA7Ci0KLSAgICAgICAgLyogbWFrZSBleGNsdXNpdmUtb3IgcGF0dGVybiBmcm9tIHBvbHlub21pYWwgKDB4ZWRiODgzMjBVTCkgKi8KLSAgICAgICAgcG9seSA9IDA7Ci0gICAgICAgIGZvciAobiA9IDA7IG4gPCAoaW50KShzaXplb2YocCkvc2l6ZW9mKHVuc2lnbmVkIGNoYXIpKTsgbisrKQotICAgICAgICAgICAgcG9seSB8PSAoel9jcmNfdCkxIDw8ICgzMSAtIHBbbl0pOwotCi0gICAgICAgIC8qIGdlbmVyYXRlIGEgY3JjIGZvciBldmVyeSA4LWJpdCB2YWx1ZSAqLwotICAgICAgICBmb3IgKG4gPSAwOyBuIDwgMjU2OyBuKyspIHsKLSAgICAgICAgICAgIGMgPSAoel9jcmNfdCluOwotICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IDg7IGsrKykKLSAgICAgICAgICAgICAgICBjID0gYyAmIDEgPyBwb2x5IF4gKGMgPj4gMSkgOiBjID4+IDE7Ci0gICAgICAgICAgICBjcmNfdGFibGVbMF1bbl0gPSBjOwotICAgICAgICB9Ci0KLSNpZmRlZiBCWUZPVVIKLSAgICAgICAgLyogZ2VuZXJhdGUgY3JjIGZvciBlYWNoIHZhbHVlIGZvbGxvd2VkIGJ5IG9uZSwgdHdvLCBhbmQgdGhyZWUgemVyb3MsCi0gICAgICAgICAgIGFuZCB0aGVuIHRoZSBieXRlIHJldmVyc2FsIG9mIHRob3NlIGFzIHdlbGwgYXMgdGhlIGZpcnN0IHRhYmxlICovCi0gICAgICAgIGZvciAobiA9IDA7IG4gPCAyNTY7IG4rKykgewotICAgICAgICAgICAgYyA9IGNyY190YWJsZVswXVtuXTsKLSAgICAgICAgICAgIGNyY190YWJsZVs0XVtuXSA9IFpTV0FQMzIoYyk7Ci0gICAgICAgICAgICBmb3IgKGsgPSAxOyBrIDwgNDsgaysrKSB7Ci0gICAgICAgICAgICAgICAgYyA9IGNyY190YWJsZVswXVtjICYgMHhmZl0gXiAoYyA+PiA4KTsKLSAgICAgICAgICAgICAgICBjcmNfdGFibGVba11bbl0gPSBjOwotICAgICAgICAgICAgICAgIGNyY190YWJsZVtrICsgNF1bbl0gPSBaU1dBUDMyKGMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0jZW5kaWYgLyogQllGT1VSICovCi0KLSAgICAgICAgY3JjX3RhYmxlX2VtcHR5ID0gMDsKLSAgICB9Ci0gICAgZWxzZSB7ICAgICAgLyogbm90IGZpcnN0ICovCi0gICAgICAgIC8qIHdhaXQgZm9yIHRoZSBvdGhlciBndXkgdG8gZmluaXNoIChub3QgZWZmaWNpZW50LCBidXQgcmFyZSkgKi8KLSAgICAgICAgd2hpbGUgKGNyY190YWJsZV9lbXB0eSkKLSAgICAgICAgICAgIDsKLSAgICB9Ci0KLSNpZmRlZiBNQUtFQ1JDSAotICAgIC8qIHdyaXRlIG91dCBDUkMgdGFibGVzIHRvIGNyYzMyLmggKi8KLSAgICB7Ci0gICAgICAgIEZJTEUgKm91dDsKLQotICAgICAgICBvdXQgPSBmb3BlbigiY3JjMzIuaCIsICJ3Iik7Ci0gICAgICAgIGlmIChvdXQgPT0gTlVMTCkgcmV0dXJuOwotICAgICAgICBmcHJpbnRmKG91dCwgIi8qIGNyYzMyLmggLS0gdGFibGVzIGZvciByYXBpZCBDUkMgY2FsY3VsYXRpb25cbiIpOwotICAgICAgICBmcHJpbnRmKG91dCwgIiAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGNyYzMyLmNcbiAqL1xuXG4iKTsKLSAgICAgICAgZnByaW50ZihvdXQsICJsb2NhbCBjb25zdCB6X2NyY190IEZBUiAiKTsKLSAgICAgICAgZnByaW50ZihvdXQsICJjcmNfdGFibGVbVEJMU11bMjU2XSA9XG57XG4gIHtcbiIpOwotICAgICAgICB3cml0ZV90YWJsZShvdXQsIGNyY190YWJsZVswXSk7Ci0jICBpZmRlZiBCWUZPVVIKLSAgICAgICAgZnByaW50ZihvdXQsICIjaWZkZWYgQllGT1VSXG4iKTsKLSAgICAgICAgZm9yIChrID0gMTsgayA8IDg7IGsrKykgewotICAgICAgICAgICAgZnByaW50ZihvdXQsICIgIH0sXG4gIHtcbiIpOwotICAgICAgICAgICAgd3JpdGVfdGFibGUob3V0LCBjcmNfdGFibGVba10pOwotICAgICAgICB9Ci0gICAgICAgIGZwcmludGYob3V0LCAiI2VuZGlmXG4iKTsKLSMgIGVuZGlmIC8qIEJZRk9VUiAqLwotICAgICAgICBmcHJpbnRmKG91dCwgIiAgfVxufTtcbiIpOwotICAgICAgICBmY2xvc2Uob3V0KTsKLSAgICB9Ci0jZW5kaWYgLyogTUFLRUNSQ0ggKi8KLX0KLQotI2lmZGVmIE1BS0VDUkNICi1sb2NhbCB2b2lkIHdyaXRlX3RhYmxlKAotICAgIEZJTEUgKm91dCwKLSAgICBjb25zdCB6X2NyY190IEZBUiAqdGFibGUpCi17Ci0gICAgaW50IG47Ci0KLSAgICBmb3IgKG4gPSAwOyBuIDwgMjU2OyBuKyspCi0gICAgICAgIGZwcmludGYob3V0LCAiJXMweCUwOGx4VUwlcyIsIG4gJSA1ID8gIiIgOiAiICAgICIsCi0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKHRhYmxlW25dKSwKLSAgICAgICAgICAgICAgICBuID09IDI1NSA/ICJcbiIgOiAobiAlIDUgPT0gNCA/ICIsXG4iIDogIiwgIikpOwotfQotI2VuZGlmIC8qIE1BS0VDUkNIICovCi0KLSNlbHNlIC8qICFEWU5BTUlDX0NSQ19UQUJMRSAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBUYWJsZXMgb2YgQ1JDLTMycyBvZiBhbGwgc2luZ2xlLWJ5dGUgdmFsdWVzLCBtYWRlIGJ5IG1ha2VfY3JjX3RhYmxlKCkuCi0gKi8KLSNpbmNsdWRlICJjcmMzMi5oIgotI2VuZGlmIC8qIERZTkFNSUNfQ1JDX1RBQkxFICovCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgYnkgYXNtIHZlcnNpb25zIG9mIGNyYzMyKCkKLSAqLwotY29uc3Qgel9jcmNfdCBGQVIgKiBaRVhQT1JUIGdldF9jcmNfdGFibGUoKQotewotI2lmZGVmIERZTkFNSUNfQ1JDX1RBQkxFCi0gICAgaWYgKGNyY190YWJsZV9lbXB0eSkKLSAgICAgICAgbWFrZV9jcmNfdGFibGUoKTsKLSNlbmRpZiAvKiBEWU5BTUlDX0NSQ19UQUJMRSAqLwotICAgIHJldHVybiAoY29uc3Qgel9jcmNfdCBGQVIgKiljcmNfdGFibGU7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgRE8xIGNyYyA9IGNyY190YWJsZVswXVsoKGludCljcmMgXiAoKmJ1ZisrKSkgJiAweGZmXSBeIChjcmMgPj4gOCkKLSNkZWZpbmUgRE84IERPMTsgRE8xOyBETzE7IERPMTsgRE8xOyBETzE7IERPMTsgRE8xCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLXVuc2lnbmVkIGxvbmcgWkVYUE9SVCBjcmMzMigKLSAgICB1bnNpZ25lZCBsb25nIGNyYywKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqYnVmLAotICAgIHVJbnQgbGVuKQotewotICAgIGlmIChidWYgPT0gWl9OVUxMKSByZXR1cm4gMFVMOwotCi0jaWZkZWYgRFlOQU1JQ19DUkNfVEFCTEUKLSAgICBpZiAoY3JjX3RhYmxlX2VtcHR5KQotICAgICAgICBtYWtlX2NyY190YWJsZSgpOwotI2VuZGlmIC8qIERZTkFNSUNfQ1JDX1RBQkxFICovCi0KLSNpZmRlZiBCWUZPVVIKLSAgICBpZiAoc2l6ZW9mKHZvaWQgKikgPT0gc2l6ZW9mKHB0cmRpZmZfdCkpIHsKLSAgICAgICAgel9jcmNfdCBlbmRpYW47Ci0KLSAgICAgICAgZW5kaWFuID0gMTsKLSAgICAgICAgaWYgKCooKHVuc2lnbmVkIGNoYXIgKikoJmVuZGlhbikpKQotICAgICAgICAgICAgcmV0dXJuIGNyYzMyX2xpdHRsZShjcmMsIGJ1ZiwgbGVuKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIGNyYzMyX2JpZyhjcmMsIGJ1ZiwgbGVuKTsKLSAgICB9Ci0jZW5kaWYgLyogQllGT1VSICovCi0gICAgY3JjID0gY3JjIF4gMHhmZmZmZmZmZlVMOwotICAgIHdoaWxlIChsZW4gPj0gOCkgewotICAgICAgICBETzg7Ci0gICAgICAgIGxlbiAtPSA4OwotICAgIH0KLSAgICBpZiAobGVuKSBkbyB7Ci0gICAgICAgIERPMTsKLSAgICB9IHdoaWxlICgtLWxlbik7Ci0gICAgcmV0dXJuIGNyYyBeIDB4ZmZmZmZmZmZVTDsKLX0KLQotI2lmZGVmIEJZRk9VUgotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0jZGVmaW5lIERPTElUNCBjIF49ICpidWY0Kys7IFwKLSAgICAgICAgYyA9IGNyY190YWJsZVszXVtjICYgMHhmZl0gXiBjcmNfdGFibGVbMl1bKGMgPj4gOCkgJiAweGZmXSBeIFwKLSAgICAgICAgICAgIGNyY190YWJsZVsxXVsoYyA+PiAxNikgJiAweGZmXSBeIGNyY190YWJsZVswXVtjID4+IDI0XQotI2RlZmluZSBET0xJVDMyIERPTElUNDsgRE9MSVQ0OyBET0xJVDQ7IERPTElUNDsgRE9MSVQ0OyBET0xJVDQ7IERPTElUNDsgRE9MSVQ0Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWxvY2FsIHVuc2lnbmVkIGxvbmcgY3JjMzJfbGl0dGxlKAotICAgIHVuc2lnbmVkIGxvbmcgY3JjLAotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICpidWYsCi0gICAgdW5zaWduZWQgbGVuKQotewotICAgIHJlZ2lzdGVyIHpfY3JjX3QgYzsKLSAgICByZWdpc3RlciBjb25zdCB6X2NyY190IEZBUiAqYnVmNDsKLQotICAgIGMgPSAoel9jcmNfdCljcmM7Ci0gICAgYyA9IH5jOwotICAgIHdoaWxlIChsZW4gJiYgKChwdHJkaWZmX3QpYnVmICYgMykpIHsKLSAgICAgICAgYyA9IGNyY190YWJsZVswXVsoYyBeICpidWYrKykgJiAweGZmXSBeIChjID4+IDgpOwotICAgICAgICBsZW4tLTsKLSAgICB9Ci0KLSAgICBidWY0ID0gKGNvbnN0IHpfY3JjX3QgRkFSICopKGNvbnN0IHZvaWQgRkFSICopYnVmOwotICAgIHdoaWxlIChsZW4gPj0gMzIpIHsKLSAgICAgICAgRE9MSVQzMjsKLSAgICAgICAgbGVuIC09IDMyOwotICAgIH0KLSAgICB3aGlsZSAobGVuID49IDQpIHsKLSAgICAgICAgRE9MSVQ0OwotICAgICAgICBsZW4gLT0gNDsKLSAgICB9Ci0gICAgYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICopYnVmNDsKLQotICAgIGlmIChsZW4pIGRvIHsKLSAgICAgICAgYyA9IGNyY190YWJsZVswXVsoYyBeICpidWYrKykgJiAweGZmXSBeIChjID4+IDgpOwotICAgIH0gd2hpbGUgKC0tbGVuKTsKLSAgICBjID0gfmM7Ci0gICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKWM7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLSNkZWZpbmUgRE9CSUc0IGMgXj0gKisrYnVmNDsgXAotICAgICAgICBjID0gY3JjX3RhYmxlWzRdW2MgJiAweGZmXSBeIGNyY190YWJsZVs1XVsoYyA+PiA4KSAmIDB4ZmZdIF4gXAotICAgICAgICAgICAgY3JjX3RhYmxlWzZdWyhjID4+IDE2KSAmIDB4ZmZdIF4gY3JjX3RhYmxlWzddW2MgPj4gMjRdCi0jZGVmaW5lIERPQklHMzIgRE9CSUc0OyBET0JJRzQ7IERPQklHNDsgRE9CSUc0OyBET0JJRzQ7IERPQklHNDsgRE9CSUc0OyBET0JJRzQKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotbG9jYWwgdW5zaWduZWQgbG9uZyBjcmMzMl9iaWcoCi0gICAgdW5zaWduZWQgbG9uZyBjcmMsCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKmJ1ZiwKLSAgICB1bnNpZ25lZCBsZW4pCi17Ci0gICAgcmVnaXN0ZXIgel9jcmNfdCBjOwotICAgIHJlZ2lzdGVyIGNvbnN0IHpfY3JjX3QgRkFSICpidWY0OwotCi0gICAgYyA9IFpTV0FQMzIoKHpfY3JjX3QpY3JjKTsKLSAgICBjID0gfmM7Ci0gICAgd2hpbGUgKGxlbiAmJiAoKHB0cmRpZmZfdClidWYgJiAzKSkgewotICAgICAgICBjID0gY3JjX3RhYmxlWzRdWyhjID4+IDI0KSBeICpidWYrK10gXiAoYyA8PCA4KTsKLSAgICAgICAgbGVuLS07Ci0gICAgfQotCi0gICAgYnVmNCA9IChjb25zdCB6X2NyY190IEZBUiAqKShjb25zdCB2b2lkIEZBUiAqKWJ1ZjsKLSAgICBidWY0LS07Ci0gICAgd2hpbGUgKGxlbiA+PSAzMikgewotICAgICAgICBET0JJRzMyOwotICAgICAgICBsZW4gLT0gMzI7Ci0gICAgfQotICAgIHdoaWxlIChsZW4gPj0gNCkgewotICAgICAgICBET0JJRzQ7Ci0gICAgICAgIGxlbiAtPSA0OwotICAgIH0KLSAgICBidWY0Kys7Ci0gICAgYnVmID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICopYnVmNDsKLQotICAgIGlmIChsZW4pIGRvIHsKLSAgICAgICAgYyA9IGNyY190YWJsZVs0XVsoYyA+PiAyNCkgXiAqYnVmKytdIF4gKGMgPDwgOCk7Ci0gICAgfSB3aGlsZSAoLS1sZW4pOwotICAgIGMgPSB+YzsKLSAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpKFpTV0FQMzIoYykpOwotfQotCi0jZW5kaWYgLyogQllGT1VSICovCi0KLSNkZWZpbmUgR0YyX0RJTSAzMiAgICAgIC8qIGRpbWVuc2lvbiBvZiBHRigyKSB2ZWN0b3JzIChsZW5ndGggb2YgQ1JDKSAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1sb2NhbCB1bnNpZ25lZCBsb25nIGdmMl9tYXRyaXhfdGltZXMoCi0gICAgdW5zaWduZWQgbG9uZyAqbWF0LAotICAgIHVuc2lnbmVkIGxvbmcgdmVjKQotewotICAgIHVuc2lnbmVkIGxvbmcgc3VtOwotCi0gICAgc3VtID0gMDsKLSAgICB3aGlsZSAodmVjKSB7Ci0gICAgICAgIGlmICh2ZWMgJiAxKQotICAgICAgICAgICAgc3VtIF49ICptYXQ7Ci0gICAgICAgIHZlYyA+Pj0gMTsKLSAgICAgICAgbWF0Kys7Ci0gICAgfQotICAgIHJldHVybiBzdW07Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWxvY2FsIHZvaWQgZ2YyX21hdHJpeF9zcXVhcmUoCi0gICAgdW5zaWduZWQgbG9uZyAqc3F1YXJlLAotICAgIHVuc2lnbmVkIGxvbmcgKm1hdCkKLXsKLSAgICBpbnQgbjsKLQotICAgIGZvciAobiA9IDA7IG4gPCBHRjJfRElNOyBuKyspCi0gICAgICAgIHNxdWFyZVtuXSA9IGdmMl9tYXRyaXhfdGltZXMobWF0LCBtYXRbbl0pOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1sb2NhbCB1TG9uZyBjcmMzMl9jb21iaW5lXygKLSAgICB1TG9uZyBjcmMxLAotICAgIHVMb25nIGNyYzIsCi0gICAgel9vZmY2NF90IGxlbjIpCi17Ci0gICAgaW50IG47Ci0gICAgdW5zaWduZWQgbG9uZyByb3c7Ci0gICAgdW5zaWduZWQgbG9uZyBldmVuW0dGMl9ESU1dOyAgICAvKiBldmVuLXBvd2VyLW9mLXR3byB6ZXJvcyBvcGVyYXRvciAqLwotICAgIHVuc2lnbmVkIGxvbmcgb2RkW0dGMl9ESU1dOyAgICAgLyogb2RkLXBvd2VyLW9mLXR3byB6ZXJvcyBvcGVyYXRvciAqLwotCi0gICAgLyogZGVnZW5lcmF0ZSBjYXNlIChhbHNvIGRpc2FsbG93IG5lZ2F0aXZlIGxlbmd0aHMpICovCi0gICAgaWYgKGxlbjIgPD0gMCkKLSAgICAgICAgcmV0dXJuIGNyYzE7Ci0KLSAgICAvKiBwdXQgb3BlcmF0b3IgZm9yIG9uZSB6ZXJvIGJpdCBpbiBvZGQgKi8KLSAgICBvZGRbMF0gPSAweGVkYjg4MzIwVUw7ICAgICAgICAgIC8qIENSQy0zMiBwb2x5bm9taWFsICovCi0gICAgcm93ID0gMTsKLSAgICBmb3IgKG4gPSAxOyBuIDwgR0YyX0RJTTsgbisrKSB7Ci0gICAgICAgIG9kZFtuXSA9IHJvdzsKLSAgICAgICAgcm93IDw8PSAxOwotICAgIH0KLQotICAgIC8qIHB1dCBvcGVyYXRvciBmb3IgdHdvIHplcm8gYml0cyBpbiBldmVuICovCi0gICAgZ2YyX21hdHJpeF9zcXVhcmUoZXZlbiwgb2RkKTsKLQotICAgIC8qIHB1dCBvcGVyYXRvciBmb3IgZm91ciB6ZXJvIGJpdHMgaW4gb2RkICovCi0gICAgZ2YyX21hdHJpeF9zcXVhcmUob2RkLCBldmVuKTsKLQotICAgIC8qIGFwcGx5IGxlbjIgemVyb3MgdG8gY3JjMSAoZmlyc3Qgc3F1YXJlIHdpbGwgcHV0IHRoZSBvcGVyYXRvciBmb3Igb25lCi0gICAgICAgemVybyBieXRlLCBlaWdodCB6ZXJvIGJpdHMsIGluIGV2ZW4pICovCi0gICAgZG8gewotICAgICAgICAvKiBhcHBseSB6ZXJvcyBvcGVyYXRvciBmb3IgdGhpcyBiaXQgb2YgbGVuMiAqLwotICAgICAgICBnZjJfbWF0cml4X3NxdWFyZShldmVuLCBvZGQpOwotICAgICAgICBpZiAobGVuMiAmIDEpCi0gICAgICAgICAgICBjcmMxID0gZ2YyX21hdHJpeF90aW1lcyhldmVuLCBjcmMxKTsKLSAgICAgICAgbGVuMiA+Pj0gMTsKLQotICAgICAgICAvKiBpZiBubyBtb3JlIGJpdHMgc2V0LCB0aGVuIGRvbmUgKi8KLSAgICAgICAgaWYgKGxlbjIgPT0gMCkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8qIGFub3RoZXIgaXRlcmF0aW9uIG9mIHRoZSBsb29wIHdpdGggb2RkIGFuZCBldmVuIHN3YXBwZWQgKi8KLSAgICAgICAgZ2YyX21hdHJpeF9zcXVhcmUob2RkLCBldmVuKTsKLSAgICAgICAgaWYgKGxlbjIgJiAxKQotICAgICAgICAgICAgY3JjMSA9IGdmMl9tYXRyaXhfdGltZXMob2RkLCBjcmMxKTsKLSAgICAgICAgbGVuMiA+Pj0gMTsKLQotICAgICAgICAvKiBpZiBubyBtb3JlIGJpdHMgc2V0LCB0aGVuIGRvbmUgKi8KLSAgICB9IHdoaWxlIChsZW4yICE9IDApOwotCi0gICAgLyogcmV0dXJuIGNvbWJpbmVkIGNyYyAqLwotICAgIGNyYzEgXj0gY3JjMjsKLSAgICByZXR1cm4gY3JjMTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lKAotICAgIHVMb25nIGNyYzEsCi0gICAgdUxvbmcgY3JjMiwKLSAgICB6X29mZl90IGxlbjIpCi17Ci0gICAgcmV0dXJuIGNyYzMyX2NvbWJpbmVfKGNyYzEsIGNyYzIsIGxlbjIpOwotfQotCi11TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmU2NCgKLSAgICB1TG9uZyBjcmMxLAotICAgIHVMb25nIGNyYzIsCi0gICAgel9vZmY2NF90IGxlbjIpCi17Ci0gICAgcmV0dXJuIGNyYzMyX2NvbWJpbmVfKGNyYzEsIGNyYzIsIGxlbjIpOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvemxpYl92MTI4L2NyYzMyLmggYi90aGlyZF9wYXJ0eS96bGliX3YxMjgvY3JjMzIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwYzc3OC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS96bGliX3YxMjgvY3JjMzIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0MSArMCwwIEBACi0vKiBjcmMzMi5oIC0tIHRhYmxlcyBmb3IgcmFwaWQgQ1JDIGNhbGN1bGF0aW9uCi0gKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjcmMzMi5jCi0gKi8KLQotbG9jYWwgY29uc3Qgel9jcmNfdCBGQVIgY3JjX3RhYmxlW1RCTFNdWzI1Nl0gPQotewotICB7Ci0gICAgMHgwMDAwMDAwMFVMLCAweDc3MDczMDk2VUwsIDB4ZWUwZTYxMmNVTCwgMHg5OTA5NTFiYVVMLCAweDA3NmRjNDE5VUwsCi0gICAgMHg3MDZhZjQ4ZlVMLCAweGU5NjNhNTM1VUwsIDB4OWU2NDk1YTNVTCwgMHgwZWRiODgzMlVMLCAweDc5ZGNiOGE0VUwsCi0gICAgMHhlMGQ1ZTkxZVVMLCAweDk3ZDJkOTg4VUwsIDB4MDliNjRjMmJVTCwgMHg3ZWIxN2NiZFVMLCAweGU3YjgyZDA3VUwsCi0gICAgMHg5MGJmMWQ5MVVMLCAweDFkYjcxMDY0VUwsIDB4NmFiMDIwZjJVTCwgMHhmM2I5NzE0OFVMLCAweDg0YmU0MWRlVUwsCi0gICAgMHgxYWRhZDQ3ZFVMLCAweDZkZGRlNGViVUwsIDB4ZjRkNGI1NTFVTCwgMHg4M2QzODVjN1VMLCAweDEzNmM5ODU2VUwsCi0gICAgMHg2NDZiYThjMFVMLCAweGZkNjJmOTdhVUwsIDB4OGE2NWM5ZWNVTCwgMHgxNDAxNWM0ZlVMLCAweDYzMDY2Y2Q5VUwsCi0gICAgMHhmYTBmM2Q2M1VMLCAweDhkMDgwZGY1VUwsIDB4M2I2ZTIwYzhVTCwgMHg0YzY5MTA1ZVVMLCAweGQ1NjA0MWU0VUwsCi0gICAgMHhhMjY3NzE3MlVMLCAweDNjMDNlNGQxVUwsIDB4NGIwNGQ0NDdVTCwgMHhkMjBkODVmZFVMLCAweGE1MGFiNTZiVUwsCi0gICAgMHgzNWI1YThmYVVMLCAweDQyYjI5ODZjVUwsIDB4ZGJiYmM5ZDZVTCwgMHhhY2JjZjk0MFVMLCAweDMyZDg2Y2UzVUwsCi0gICAgMHg0NWRmNWM3NVVMLCAweGRjZDYwZGNmVUwsIDB4YWJkMTNkNTlVTCwgMHgyNmQ5MzBhY1VMLCAweDUxZGUwMDNhVUwsCi0gICAgMHhjOGQ3NTE4MFVMLCAweGJmZDA2MTE2VUwsIDB4MjFiNGY0YjVVTCwgMHg1NmIzYzQyM1VMLCAweGNmYmE5NTk5VUwsCi0gICAgMHhiOGJkYTUwZlVMLCAweDI4MDJiODllVUwsIDB4NWYwNTg4MDhVTCwgMHhjNjBjZDliMlVMLCAweGIxMGJlOTI0VUwsCi0gICAgMHgyZjZmN2M4N1VMLCAweDU4Njg0YzExVUwsIDB4YzE2MTFkYWJVTCwgMHhiNjY2MmQzZFVMLCAweDc2ZGM0MTkwVUwsCi0gICAgMHgwMWRiNzEwNlVMLCAweDk4ZDIyMGJjVUwsIDB4ZWZkNTEwMmFVTCwgMHg3MWIxODU4OVVMLCAweDA2YjZiNTFmVUwsCi0gICAgMHg5ZmJmZTRhNVVMLCAweGU4YjhkNDMzVUwsIDB4NzgwN2M5YTJVTCwgMHgwZjAwZjkzNFVMLCAweDk2MDlhODhlVUwsCi0gICAgMHhlMTBlOTgxOFVMLCAweDdmNmEwZGJiVUwsIDB4MDg2ZDNkMmRVTCwgMHg5MTY0NmM5N1VMLCAweGU2NjM1YzAxVUwsCi0gICAgMHg2YjZiNTFmNFVMLCAweDFjNmM2MTYyVUwsIDB4ODU2NTMwZDhVTCwgMHhmMjYyMDA0ZVVMLCAweDZjMDY5NWVkVUwsCi0gICAgMHgxYjAxYTU3YlVMLCAweDgyMDhmNGMxVUwsIDB4ZjUwZmM0NTdVTCwgMHg2NWIwZDljNlVMLCAweDEyYjdlOTUwVUwsCi0gICAgMHg4YmJlYjhlYVVMLCAweGZjYjk4ODdjVUwsIDB4NjJkZDFkZGZVTCwgMHgxNWRhMmQ0OVVMLCAweDhjZDM3Y2YzVUwsCi0gICAgMHhmYmQ0NGM2NVVMLCAweDRkYjI2MTU4VUwsIDB4M2FiNTUxY2VVTCwgMHhhM2JjMDA3NFVMLCAweGQ0YmIzMGUyVUwsCi0gICAgMHg0YWRmYTU0MVVMLCAweDNkZDg5NWQ3VUwsIDB4YTRkMWM0NmRVTCwgMHhkM2Q2ZjRmYlVMLCAweDQzNjllOTZhVUwsCi0gICAgMHgzNDZlZDlmY1VMLCAweGFkNjc4ODQ2VUwsIDB4ZGE2MGI4ZDBVTCwgMHg0NDA0MmQ3M1VMLCAweDMzMDMxZGU1VUwsCi0gICAgMHhhYTBhNGM1ZlVMLCAweGRkMGQ3Y2M5VUwsIDB4NTAwNTcxM2NVTCwgMHgyNzAyNDFhYVVMLCAweGJlMGIxMDEwVUwsCi0gICAgMHhjOTBjMjA4NlVMLCAweDU3NjhiNTI1VUwsIDB4MjA2Zjg1YjNVTCwgMHhiOTY2ZDQwOVVMLCAweGNlNjFlNDlmVUwsCi0gICAgMHg1ZWRlZjkwZVVMLCAweDI5ZDljOTk4VUwsIDB4YjBkMDk4MjJVTCwgMHhjN2Q3YThiNFVMLCAweDU5YjMzZDE3VUwsCi0gICAgMHgyZWI0MGQ4MVVMLCAweGI3YmQ1YzNiVUwsIDB4YzBiYTZjYWRVTCwgMHhlZGI4ODMyMFVMLCAweDlhYmZiM2I2VUwsCi0gICAgMHgwM2I2ZTIwY1VMLCAweDc0YjFkMjlhVUwsIDB4ZWFkNTQ3MzlVTCwgMHg5ZGQyNzdhZlVMLCAweDA0ZGIyNjE1VUwsCi0gICAgMHg3M2RjMTY4M1VMLCAweGUzNjMwYjEyVUwsIDB4OTQ2NDNiODRVTCwgMHgwZDZkNmEzZVVMLCAweDdhNmE1YWE4VUwsCi0gICAgMHhlNDBlY2YwYlVMLCAweDkzMDlmZjlkVUwsIDB4MGEwMGFlMjdVTCwgMHg3ZDA3OWViMVVMLCAweGYwMGY5MzQ0VUwsCi0gICAgMHg4NzA4YTNkMlVMLCAweDFlMDFmMjY4VUwsIDB4NjkwNmMyZmVVTCwgMHhmNzYyNTc1ZFVMLCAweDgwNjU2N2NiVUwsCi0gICAgMHgxOTZjMzY3MVVMLCAweDZlNmIwNmU3VUwsIDB4ZmVkNDFiNzZVTCwgMHg4OWQzMmJlMFVMLCAweDEwZGE3YTVhVUwsCi0gICAgMHg2N2RkNGFjY1VMLCAweGY5YjlkZjZmVUwsIDB4OGViZWVmZjlVTCwgMHgxN2I3YmU0M1VMLCAweDYwYjA4ZWQ1VUwsCi0gICAgMHhkNmQ2YTNlOFVMLCAweGExZDE5MzdlVUwsIDB4MzhkOGMyYzRVTCwgMHg0ZmRmZjI1MlVMLCAweGQxYmI2N2YxVUwsCi0gICAgMHhhNmJjNTc2N1VMLCAweDNmYjUwNmRkVUwsIDB4NDhiMjM2NGJVTCwgMHhkODBkMmJkYVVMLCAweGFmMGExYjRjVUwsCi0gICAgMHgzNjAzNGFmNlVMLCAweDQxMDQ3YTYwVUwsIDB4ZGY2MGVmYzNVTCwgMHhhODY3ZGY1NVVMLCAweDMxNmU4ZWVmVUwsCi0gICAgMHg0NjY5YmU3OVVMLCAweGNiNjFiMzhjVUwsIDB4YmM2NjgzMWFVTCwgMHgyNTZmZDJhMFVMLCAweDUyNjhlMjM2VUwsCi0gICAgMHhjYzBjNzc5NVVMLCAweGJiMGI0NzAzVUwsIDB4MjIwMjE2YjlVTCwgMHg1NTA1MjYyZlVMLCAweGM1YmEzYmJlVUwsCi0gICAgMHhiMmJkMGIyOFVMLCAweDJiYjQ1YTkyVUwsIDB4NWNiMzZhMDRVTCwgMHhjMmQ3ZmZhN1VMLCAweGI1ZDBjZjMxVUwsCi0gICAgMHgyY2Q5OWU4YlVMLCAweDViZGVhZTFkVUwsIDB4OWI2NGMyYjBVTCwgMHhlYzYzZjIyNlVMLCAweDc1NmFhMzljVUwsCi0gICAgMHgwMjZkOTMwYVVMLCAweDljMDkwNmE5VUwsIDB4ZWIwZTM2M2ZVTCwgMHg3MjA3Njc4NVVMLCAweDA1MDA1NzEzVUwsCi0gICAgMHg5NWJmNGE4MlVMLCAweGUyYjg3YTE0VUwsIDB4N2JiMTJiYWVVTCwgMHgwY2I2MWIzOFVMLCAweDkyZDI4ZTliVUwsCi0gICAgMHhlNWQ1YmUwZFVMLCAweDdjZGNlZmI3VUwsIDB4MGJkYmRmMjFVTCwgMHg4NmQzZDJkNFVMLCAweGYxZDRlMjQyVUwsCi0gICAgMHg2OGRkYjNmOFVMLCAweDFmZGE4MzZlVUwsIDB4ODFiZTE2Y2RVTCwgMHhmNmI5MjY1YlVMLCAweDZmYjA3N2UxVUwsCi0gICAgMHgxOGI3NDc3N1VMLCAweDg4MDg1YWU2VUwsIDB4ZmYwZjZhNzBVTCwgMHg2NjA2M2JjYVVMLCAweDExMDEwYjVjVUwsCi0gICAgMHg4ZjY1OWVmZlVMLCAweGY4NjJhZTY5VUwsIDB4NjE2YmZmZDNVTCwgMHgxNjZjY2Y0NVVMLCAweGEwMGFlMjc4VUwsCi0gICAgMHhkNzBkZDJlZVVMLCAweDRlMDQ4MzU0VUwsIDB4MzkwM2IzYzJVTCwgMHhhNzY3MjY2MVVMLCAweGQwNjAxNmY3VUwsCi0gICAgMHg0OTY5NDc0ZFVMLCAweDNlNmU3N2RiVUwsIDB4YWVkMTZhNGFVTCwgMHhkOWQ2NWFkY1VMLCAweDQwZGYwYjY2VUwsCi0gICAgMHgzN2Q4M2JmMFVMLCAweGE5YmNhZTUzVUwsIDB4ZGViYjllYzVVTCwgMHg0N2IyY2Y3ZlVMLCAweDMwYjVmZmU5VUwsCi0gICAgMHhiZGJkZjIxY1VMLCAweGNhYmFjMjhhVUwsIDB4NTNiMzkzMzBVTCwgMHgyNGI0YTNhNlVMLCAweGJhZDAzNjA1VUwsCi0gICAgMHhjZGQ3MDY5M1VMLCAweDU0ZGU1NzI5VUwsIDB4MjNkOTY3YmZVTCwgMHhiMzY2N2EyZVVMLCAweGM0NjE0YWI4VUwsCi0gICAgMHg1ZDY4MWIwMlVMLCAweDJhNmYyYjk0VUwsIDB4YjQwYmJlMzdVTCwgMHhjMzBjOGVhMVVMLCAweDVhMDVkZjFiVUwsCi0gICAgMHgyZDAyZWY4ZFVMCi0jaWZkZWYgQllGT1VSCi0gIH0sCi0gIHsKLSAgICAweDAwMDAwMDAwVUwsIDB4MTkxYjMxNDFVTCwgMHgzMjM2NjI4MlVMLCAweDJiMmQ1M2MzVUwsIDB4NjQ2Y2M1MDRVTCwKLSAgICAweDdkNzdmNDQ1VUwsIDB4NTY1YWE3ODZVTCwgMHg0ZjQxOTZjN1VMLCAweGM4ZDk4YTA4VUwsIDB4ZDFjMmJiNDlVTCwKLSAgICAweGZhZWZlODhhVUwsIDB4ZTNmNGQ5Y2JVTCwgMHhhY2I1NGYwY1VMLCAweGI1YWU3ZTRkVUwsIDB4OWU4MzJkOGVVTCwKLSAgICAweDg3OTgxY2NmVUwsIDB4NGFjMjEyNTFVTCwgMHg1M2Q5MjMxMFVMLCAweDc4ZjQ3MGQzVUwsIDB4NjFlZjQxOTJVTCwKLSAgICAweDJlYWVkNzU1VUwsIDB4MzdiNWU2MTRVTCwgMHgxYzk4YjVkN1VMLCAweDA1ODM4NDk2VUwsIDB4ODIxYjk4NTlVTCwKLSAgICAweDliMDBhOTE4VUwsIDB4YjAyZGZhZGJVTCwgMHhhOTM2Y2I5YVVMLCAweGU2Nzc1ZDVkVUwsIDB4ZmY2YzZjMWNVTCwKLSAgICAweGQ0NDEzZmRmVUwsIDB4Y2Q1YTBlOWVVTCwgMHg5NTg0MjRhMlVMLCAweDhjOWYxNWUzVUwsIDB4YTdiMjQ2MjBVTCwKLSAgICAweGJlYTk3NzYxVUwsIDB4ZjFlOGUxYTZVTCwgMHhlOGYzZDBlN1VMLCAweGMzZGU4MzI0VUwsIDB4ZGFjNWIyNjVVTCwKLSAgICAweDVkNWRhZWFhVUwsIDB4NDQ0NjlmZWJVTCwgMHg2ZjZiY2MyOFVMLCAweDc2NzBmZDY5VUwsIDB4MzkzMTZiYWVVTCwKLSAgICAweDIwMmE1YWVmVUwsIDB4MGIwNzA5MmNVTCwgMHgxMjFjMzg2ZFVMLCAweGRmNDYzNmYzVUwsIDB4YzY1ZDA3YjJVTCwKLSAgICAweGVkNzA1NDcxVUwsIDB4ZjQ2YjY1MzBVTCwgMHhiYjJhZjNmN1VMLCAweGEyMzFjMmI2VUwsIDB4ODkxYzkxNzVVTCwKLSAgICAweDkwMDdhMDM0VUwsIDB4MTc5ZmJjZmJVTCwgMHgwZTg0OGRiYVVMLCAweDI1YTlkZTc5VUwsIDB4M2NiMmVmMzhVTCwKLSAgICAweDczZjM3OWZmVUwsIDB4NmFlODQ4YmVVTCwgMHg0MWM1MWI3ZFVMLCAweDU4ZGUyYTNjVUwsIDB4ZjA3OTRmMDVVTCwKLSAgICAweGU5NjI3ZTQ0VUwsIDB4YzI0ZjJkODdVTCwgMHhkYjU0MWNjNlVMLCAweDk0MTU4YTAxVUwsIDB4OGQwZWJiNDBVTCwKLSAgICAweGE2MjNlODgzVUwsIDB4YmYzOGQ5YzJVTCwgMHgzOGEwYzUwZFVMLCAweDIxYmJmNDRjVUwsIDB4MGE5NmE3OGZVTCwKLSAgICAweDEzOGQ5NmNlVUwsIDB4NWNjYzAwMDlVTCwgMHg0NWQ3MzE0OFVMLCAweDZlZmE2MjhiVUwsIDB4NzdlMTUzY2FVTCwKLSAgICAweGJhYmI1ZDU0VUwsIDB4YTNhMDZjMTVVTCwgMHg4ODhkM2ZkNlVMLCAweDkxOTYwZTk3VUwsIDB4ZGVkNzk4NTBVTCwKLSAgICAweGM3Y2NhOTExVUwsIDB4ZWNlMWZhZDJVTCwgMHhmNWZhY2I5M1VMLCAweDcyNjJkNzVjVUwsIDB4NmI3OWU2MWRVTCwKLSAgICAweDQwNTRiNWRlVUwsIDB4NTk0Zjg0OWZVTCwgMHgxNjBlMTI1OFVMLCAweDBmMTUyMzE5VUwsIDB4MjQzODcwZGFVTCwKLSAgICAweDNkMjM0MTliVUwsIDB4NjVmZDZiYTdVTCwgMHg3Y2U2NWFlNlVMLCAweDU3Y2IwOTI1VUwsIDB4NGVkMDM4NjRVTCwKLSAgICAweDAxOTFhZWEzVUwsIDB4MTg4YTlmZTJVTCwgMHgzM2E3Y2MyMVVMLCAweDJhYmNmZDYwVUwsIDB4YWQyNGUxYWZVTCwKLSAgICAweGI0M2ZkMGVlVUwsIDB4OWYxMjgzMmRVTCwgMHg4NjA5YjI2Y1VMLCAweGM5NDgyNGFiVUwsIDB4ZDA1MzE1ZWFVTCwKLSAgICAweGZiN2U0NjI5VUwsIDB4ZTI2NTc3NjhVTCwgMHgyZjNmNzlmNlVMLCAweDM2MjQ0OGI3VUwsIDB4MWQwOTFiNzRVTCwKLSAgICAweDA0MTIyYTM1VUwsIDB4NGI1M2JjZjJVTCwgMHg1MjQ4OGRiM1VMLCAweDc5NjVkZTcwVUwsIDB4NjA3ZWVmMzFVTCwKLSAgICAweGU3ZTZmM2ZlVUwsIDB4ZmVmZGMyYmZVTCwgMHhkNWQwOTE3Y1VMLCAweGNjY2JhMDNkVUwsIDB4ODM4YTM2ZmFVTCwKLSAgICAweDlhOTEwN2JiVUwsIDB4YjFiYzU0NzhVTCwgMHhhOGE3NjUzOVVMLCAweDNiODM5ODRiVUwsIDB4MjI5OGE5MGFVTCwKLSAgICAweDA5YjVmYWM5VUwsIDB4MTBhZWNiODhVTCwgMHg1ZmVmNWQ0ZlVMLCAweDQ2ZjQ2YzBlVUwsIDB4NmRkOTNmY2RVTCwKLSAgICAweDc0YzIwZThjVUwsIDB4ZjM1YTEyNDNVTCwgMHhlYTQxMjMwMlVMLCAweGMxNmM3MGMxVUwsIDB4ZDg3NzQxODBVTCwKLSAgICAweDk3MzZkNzQ3VUwsIDB4OGUyZGU2MDZVTCwgMHhhNTAwYjVjNVVMLCAweGJjMWI4NDg0VUwsIDB4NzE0MThhMWFVTCwKLSAgICAweDY4NWFiYjViVUwsIDB4NDM3N2U4OThVTCwgMHg1YTZjZDlkOVVMLCAweDE1MmQ0ZjFlVUwsIDB4MGMzNjdlNWZVTCwKLSAgICAweDI3MWIyZDljVUwsIDB4M2UwMDFjZGRVTCwgMHhiOTk4MDAxMlVMLCAweGEwODMzMTUzVUwsIDB4OGJhZTYyOTBVTCwKLSAgICAweDkyYjU1M2QxVUwsIDB4ZGRmNGM1MTZVTCwgMHhjNGVmZjQ1N1VMLCAweGVmYzJhNzk0VUwsIDB4ZjZkOTk2ZDVVTCwKLSAgICAweGFlMDdiY2U5VUwsIDB4YjcxYzhkYThVTCwgMHg5YzMxZGU2YlVMLCAweDg1MmFlZjJhVUwsIDB4Y2E2Yjc5ZWRVTCwKLSAgICAweGQzNzA0OGFjVUwsIDB4Zjg1ZDFiNmZVTCwgMHhlMTQ2MmEyZVVMLCAweDY2ZGUzNmUxVUwsIDB4N2ZjNTA3YTBVTCwKLSAgICAweDU0ZTg1NDYzVUwsIDB4NGRmMzY1MjJVTCwgMHgwMmIyZjNlNVVMLCAweDFiYTljMmE0VUwsIDB4MzA4NDkxNjdVTCwKLSAgICAweDI5OWZhMDI2VUwsIDB4ZTRjNWFlYjhVTCwgMHhmZGRlOWZmOVVMLCAweGQ2ZjNjYzNhVUwsIDB4Y2ZlOGZkN2JVTCwKLSAgICAweDgwYTk2YmJjVUwsIDB4OTliMjVhZmRVTCwgMHhiMjlmMDkzZVVMLCAweGFiODQzODdmVUwsIDB4MmMxYzI0YjBVTCwKLSAgICAweDM1MDcxNWYxVUwsIDB4MWUyYTQ2MzJVTCwgMHgwNzMxNzc3M1VMLCAweDQ4NzBlMWI0VUwsIDB4NTE2YmQwZjVVTCwKLSAgICAweDdhNDY4MzM2VUwsIDB4NjM1ZGIyNzdVTCwgMHhjYmZhZDc0ZVVMLCAweGQyZTFlNjBmVUwsIDB4ZjljY2I1Y2NVTCwKLSAgICAweGUwZDc4NDhkVUwsIDB4YWY5NjEyNGFVTCwgMHhiNjhkMjMwYlVMLCAweDlkYTA3MGM4VUwsIDB4ODRiYjQxODlVTCwKLSAgICAweDAzMjM1ZDQ2VUwsIDB4MWEzODZjMDdVTCwgMHgzMTE1M2ZjNFVMLCAweDI4MGUwZTg1VUwsIDB4Njc0Zjk4NDJVTCwKLSAgICAweDdlNTRhOTAzVUwsIDB4NTU3OWZhYzBVTCwgMHg0YzYyY2I4MVVMLCAweDgxMzhjNTFmVUwsIDB4OTgyM2Y0NWVVTCwKLSAgICAweGIzMGVhNzlkVUwsIDB4YWExNTk2ZGNVTCwgMHhlNTU0MDAxYlVMLCAweGZjNGYzMTVhVUwsIDB4ZDc2MjYyOTlVTCwKLSAgICAweGNlNzk1M2Q4VUwsIDB4NDllMTRmMTdVTCwgMHg1MGZhN2U1NlVMLCAweDdiZDcyZDk1VUwsIDB4NjJjYzFjZDRVTCwKLSAgICAweDJkOGQ4YTEzVUwsIDB4MzQ5NmJiNTJVTCwgMHgxZmJiZTg5MVVMLCAweDA2YTBkOWQwVUwsIDB4NWU3ZWYzZWNVTCwKLSAgICAweDQ3NjVjMmFkVUwsIDB4NmM0ODkxNmVVTCwgMHg3NTUzYTAyZlVMLCAweDNhMTIzNmU4VUwsIDB4MjMwOTA3YTlVTCwKLSAgICAweDA4MjQ1NDZhVUwsIDB4MTEzZjY1MmJVTCwgMHg5NmE3NzllNFVMLCAweDhmYmM0OGE1VUwsIDB4YTQ5MTFiNjZVTCwKLSAgICAweGJkOGEyYTI3VUwsIDB4ZjJjYmJjZTBVTCwgMHhlYmQwOGRhMVVMLCAweGMwZmRkZTYyVUwsIDB4ZDllNmVmMjNVTCwKLSAgICAweDE0YmNlMWJkVUwsIDB4MGRhN2QwZmNVTCwgMHgyNjhhODMzZlVMLCAweDNmOTFiMjdlVUwsIDB4NzBkMDI0YjlVTCwKLSAgICAweDY5Y2IxNWY4VUwsIDB4NDJlNjQ2M2JVTCwgMHg1YmZkNzc3YVVMLCAweGRjNjU2YmI1VUwsIDB4YzU3ZTVhZjRVTCwKLSAgICAweGVlNTMwOTM3VUwsIDB4Zjc0ODM4NzZVTCwgMHhiODA5YWViMVVMLCAweGExMTI5ZmYwVUwsIDB4OGEzZmNjMzNVTCwKLSAgICAweDkzMjRmZDcyVUwKLSAgfSwKLSAgewotICAgIDB4MDAwMDAwMDBVTCwgMHgwMWMyNmEzN1VMLCAweDAzODRkNDZlVUwsIDB4MDI0NmJlNTlVTCwgMHgwNzA5YThkY1VMLAotICAgIDB4MDZjYmMyZWJVTCwgMHgwNDhkN2NiMlVMLCAweDA1NGYxNjg1VUwsIDB4MGUxMzUxYjhVTCwgMHgwZmQxM2I4ZlVMLAotICAgIDB4MGQ5Nzg1ZDZVTCwgMHgwYzU1ZWZlMVVMLCAweDA5MWFmOTY0VUwsIDB4MDhkODkzNTNVTCwgMHgwYTllMmQwYVVMLAotICAgIDB4MGI1YzQ3M2RVTCwgMHgxYzI2YTM3MFVMLCAweDFkZTRjOTQ3VUwsIDB4MWZhMjc3MWVVTCwgMHgxZTYwMWQyOVVMLAotICAgIDB4MWIyZjBiYWNVTCwgMHgxYWVkNjE5YlVMLCAweDE4YWJkZmMyVUwsIDB4MTk2OWI1ZjVVTCwgMHgxMjM1ZjJjOFVMLAotICAgIDB4MTNmNzk4ZmZVTCwgMHgxMWIxMjZhNlVMLCAweDEwNzM0YzkxVUwsIDB4MTUzYzVhMTRVTCwgMHgxNGZlMzAyM1VMLAotICAgIDB4MTZiODhlN2FVTCwgMHgxNzdhZTQ0ZFVMLCAweDM4NGQ0NmUwVUwsIDB4Mzk4ZjJjZDdVTCwgMHgzYmM5OTI4ZVVMLAotICAgIDB4M2EwYmY4YjlVTCwgMHgzZjQ0ZWUzY1VMLCAweDNlODY4NDBiVUwsIDB4M2NjMDNhNTJVTCwgMHgzZDAyNTA2NVVMLAotICAgIDB4MzY1ZTE3NThVTCwgMHgzNzljN2Q2ZlVMLCAweDM1ZGFjMzM2VUwsIDB4MzQxOGE5MDFVTCwgMHgzMTU3YmY4NFVMLAotICAgIDB4MzA5NWQ1YjNVTCwgMHgzMmQzNmJlYVVMLCAweDMzMTEwMWRkVUwsIDB4MjQ2YmU1OTBVTCwgMHgyNWE5OGZhN1VMLAotICAgIDB4MjdlZjMxZmVVTCwgMHgyNjJkNWJjOVVMLCAweDIzNjI0ZDRjVUwsIDB4MjJhMDI3N2JVTCwgMHgyMGU2OTkyMlVMLAotICAgIDB4MjEyNGYzMTVVTCwgMHgyYTc4YjQyOFVMLCAweDJiYmFkZTFmVUwsIDB4MjlmYzYwNDZVTCwgMHgyODNlMGE3MVVMLAotICAgIDB4MmQ3MTFjZjRVTCwgMHgyY2IzNzZjM1VMLCAweDJlZjVjODlhVUwsIDB4MmYzN2EyYWRVTCwgMHg3MDlhOGRjMFVMLAotICAgIDB4NzE1OGU3ZjdVTCwgMHg3MzFlNTlhZVVMLCAweDcyZGMzMzk5VUwsIDB4Nzc5MzI1MWNVTCwgMHg3NjUxNGYyYlVMLAotICAgIDB4NzQxN2YxNzJVTCwgMHg3NWQ1OWI0NVVMLCAweDdlODlkYzc4VUwsIDB4N2Y0YmI2NGZVTCwgMHg3ZDBkMDgxNlVMLAotICAgIDB4N2NjZjYyMjFVTCwgMHg3OTgwNzRhNFVMLCAweDc4NDIxZTkzVUwsIDB4N2EwNGEwY2FVTCwgMHg3YmM2Y2FmZFVMLAotICAgIDB4NmNiYzJlYjBVTCwgMHg2ZDdlNDQ4N1VMLCAweDZmMzhmYWRlVUwsIDB4NmVmYTkwZTlVTCwgMHg2YmI1ODY2Y1VMLAotICAgIDB4NmE3N2VjNWJVTCwgMHg2ODMxNTIwMlVMLCAweDY5ZjMzODM1VUwsIDB4NjJhZjdmMDhVTCwgMHg2MzZkMTUzZlVMLAotICAgIDB4NjEyYmFiNjZVTCwgMHg2MGU5YzE1MVVMLCAweDY1YTZkN2Q0VUwsIDB4NjQ2NGJkZTNVTCwgMHg2NjIyMDNiYVVMLAotICAgIDB4NjdlMDY5OGRVTCwgMHg0OGQ3Y2IyMFVMLCAweDQ5MTVhMTE3VUwsIDB4NGI1MzFmNGVVTCwgMHg0YTkxNzU3OVVMLAotICAgIDB4NGZkZTYzZmNVTCwgMHg0ZTFjMDljYlVMLCAweDRjNWFiNzkyVUwsIDB4NGQ5OGRkYTVVTCwgMHg0NmM0OWE5OFVMLAotICAgIDB4NDcwNmYwYWZVTCwgMHg0NTQwNGVmNlVMLCAweDQ0ODIyNGMxVUwsIDB4NDFjZDMyNDRVTCwgMHg0MDBmNTg3M1VMLAotICAgIDB4NDI0OWU2MmFVTCwgMHg0MzhiOGMxZFVMLCAweDU0ZjE2ODUwVUwsIDB4NTUzMzAyNjdVTCwgMHg1Nzc1YmMzZVVMLAotICAgIDB4NTZiN2Q2MDlVTCwgMHg1M2Y4YzA4Y1VMLCAweDUyM2FhYWJiVUwsIDB4NTA3YzE0ZTJVTCwgMHg1MWJlN2VkNVVMLAotICAgIDB4NWFlMjM5ZThVTCwgMHg1YjIwNTNkZlVMLCAweDU5NjZlZDg2VUwsIDB4NThhNDg3YjFVTCwgMHg1ZGViOTEzNFVMLAotICAgIDB4NWMyOWZiMDNVTCwgMHg1ZTZmNDU1YVVMLCAweDVmYWQyZjZkVUwsIDB4ZTEzNTFiODBVTCwgMHhlMGY3NzFiN1VMLAotICAgIDB4ZTJiMWNmZWVVTCwgMHhlMzczYTVkOVVMLCAweGU2M2NiMzVjVUwsIDB4ZTdmZWQ5NmJVTCwgMHhlNWI4NjczMlVMLAotICAgIDB4ZTQ3YTBkMDVVTCwgMHhlZjI2NGEzOFVMLCAweGVlZTQyMDBmVUwsIDB4ZWNhMjllNTZVTCwgMHhlZDYwZjQ2MVVMLAotICAgIDB4ZTgyZmUyZTRVTCwgMHhlOWVkODhkM1VMLCAweGViYWIzNjhhVUwsIDB4ZWE2OTVjYmRVTCwgMHhmZDEzYjhmMFVMLAotICAgIDB4ZmNkMWQyYzdVTCwgMHhmZTk3NmM5ZVVMLCAweGZmNTUwNmE5VUwsIDB4ZmExYTEwMmNVTCwgMHhmYmQ4N2ExYlVMLAotICAgIDB4Zjk5ZWM0NDJVTCwgMHhmODVjYWU3NVVMLCAweGYzMDBlOTQ4VUwsIDB4ZjJjMjgzN2ZVTCwgMHhmMDg0M2QyNlVMLAotICAgIDB4ZjE0NjU3MTFVTCwgMHhmNDA5NDE5NFVMLCAweGY1Y2IyYmEzVUwsIDB4Zjc4ZDk1ZmFVTCwgMHhmNjRmZmZjZFVMLAotICAgIDB4ZDk3ODVkNjBVTCwgMHhkOGJhMzc1N1VMLCAweGRhZmM4OTBlVUwsIDB4ZGIzZWUzMzlVTCwgMHhkZTcxZjViY1VMLAotICAgIDB4ZGZiMzlmOGJVTCwgMHhkZGY1MjFkMlVMLCAweGRjMzc0YmU1VUwsIDB4ZDc2YjBjZDhVTCwgMHhkNmE5NjZlZlVMLAotICAgIDB4ZDRlZmQ4YjZVTCwgMHhkNTJkYjI4MVVMLCAweGQwNjJhNDA0VUwsIDB4ZDFhMGNlMzNVTCwgMHhkM2U2NzA2YVVMLAotICAgIDB4ZDIyNDFhNWRVTCwgMHhjNTVlZmUxMFVMLCAweGM0OWM5NDI3VUwsIDB4YzZkYTJhN2VVTCwgMHhjNzE4NDA0OVVMLAotICAgIDB4YzI1NzU2Y2NVTCwgMHhjMzk1M2NmYlVMLCAweGMxZDM4MmEyVUwsIDB4YzAxMWU4OTVVTCwgMHhjYjRkYWZhOFVMLAotICAgIDB4Y2E4ZmM1OWZVTCwgMHhjOGM5N2JjNlVMLCAweGM5MGIxMWYxVUwsIDB4Y2M0NDA3NzRVTCwgMHhjZDg2NmQ0M1VMLAotICAgIDB4Y2ZjMGQzMWFVTCwgMHhjZTAyYjkyZFVMLCAweDkxYWY5NjQwVUwsIDB4OTA2ZGZjNzdVTCwgMHg5MjJiNDIyZVVMLAotICAgIDB4OTNlOTI4MTlVTCwgMHg5NmE2M2U5Y1VMLCAweDk3NjQ1NGFiVUwsIDB4OTUyMmVhZjJVTCwgMHg5NGUwODBjNVVMLAotICAgIDB4OWZiY2M3ZjhVTCwgMHg5ZTdlYWRjZlVMLCAweDljMzgxMzk2VUwsIDB4OWRmYTc5YTFVTCwgMHg5OGI1NmYyNFVMLAotICAgIDB4OTk3NzA1MTNVTCwgMHg5YjMxYmI0YVVMLCAweDlhZjNkMTdkVUwsIDB4OGQ4OTM1MzBVTCwgMHg4YzRiNWYwN1VMLAotICAgIDB4OGUwZGUxNWVVTCwgMHg4ZmNmOGI2OVVMLCAweDhhODA5ZGVjVUwsIDB4OGI0MmY3ZGJVTCwgMHg4OTA0NDk4MlVMLAotICAgIDB4ODhjNjIzYjVVTCwgMHg4MzlhNjQ4OFVMLCAweDgyNTgwZWJmVUwsIDB4ODAxZWIwZTZVTCwgMHg4MWRjZGFkMVVMLAotICAgIDB4ODQ5M2NjNTRVTCwgMHg4NTUxYTY2M1VMLCAweDg3MTcxODNhVUwsIDB4ODZkNTcyMGRVTCwgMHhhOWUyZDBhMFVMLAotICAgIDB4YTgyMGJhOTdVTCwgMHhhYTY2MDRjZVVMLCAweGFiYTQ2ZWY5VUwsIDB4YWVlYjc4N2NVTCwgMHhhZjI5MTI0YlVMLAotICAgIDB4YWQ2ZmFjMTJVTCwgMHhhY2FkYzYyNVVMLCAweGE3ZjE4MTE4VUwsIDB4YTYzM2ViMmZVTCwgMHhhNDc1NTU3NlVMLAotICAgIDB4YTViNzNmNDFVTCwgMHhhMGY4MjljNFVMLCAweGExM2E0M2YzVUwsIDB4YTM3Y2ZkYWFVTCwgMHhhMmJlOTc5ZFVMLAotICAgIDB4YjVjNDczZDBVTCwgMHhiNDA2MTllN1VMLCAweGI2NDBhN2JlVUwsIDB4Yjc4MmNkODlVTCwgMHhiMmNkZGIwY1VMLAotICAgIDB4YjMwZmIxM2JVTCwgMHhiMTQ5MGY2MlVMLCAweGIwOGI2NTU1VUwsIDB4YmJkNzIyNjhVTCwgMHhiYTE1NDg1ZlVMLAotICAgIDB4Yjg1M2Y2MDZVTCwgMHhiOTkxOWMzMVVMLCAweGJjZGU4YWI0VUwsIDB4YmQxY2UwODNVTCwgMHhiZjVhNWVkYVVMLAotICAgIDB4YmU5ODM0ZWRVTAotICB9LAotICB7Ci0gICAgMHgwMDAwMDAwMFVMLCAweGI4YmM2NzY1VUwsIDB4YWEwOWM4OGJVTCwgMHgxMmI1YWZlZVVMLCAweDhmNjI5NzU3VUwsCi0gICAgMHgzN2RlZjAzMlVMLCAweDI1NmI1ZmRjVUwsIDB4OWRkNzM4YjlVTCwgMHhjNWI0MjhlZlVMLCAweDdkMDg0ZjhhVUwsCi0gICAgMHg2ZmJkZTA2NFVMLCAweGQ3MDE4NzAxVUwsIDB4NGFkNmJmYjhVTCwgMHhmMjZhZDhkZFVMLCAweGUwZGY3NzMzVUwsCi0gICAgMHg1ODYzMTA1NlVMLCAweDUwMTk1NzlmVUwsIDB4ZThhNTMwZmFVTCwgMHhmYTEwOWYxNFVMLCAweDQyYWNmODcxVUwsCi0gICAgMHhkZjdiYzBjOFVMLCAweDY3YzdhN2FkVUwsIDB4NzU3MjA4NDNVTCwgMHhjZGNlNmYyNlVMLCAweDk1YWQ3ZjcwVUwsCi0gICAgMHgyZDExMTgxNVVMLCAweDNmYTRiN2ZiVUwsIDB4ODcxOGQwOWVVTCwgMHgxYWNmZTgyN1VMLCAweGEyNzM4ZjQyVUwsCi0gICAgMHhiMGM2MjBhY1VMLCAweDA4N2E0N2M5VUwsIDB4YTAzMmFmM2VVTCwgMHgxODhlYzg1YlVMLCAweDBhM2I2N2I1VUwsCi0gICAgMHhiMjg3MDBkMFVMLCAweDJmNTAzODY5VUwsIDB4OTdlYzVmMGNVTCwgMHg4NTU5ZjBlMlVMLCAweDNkZTU5Nzg3VUwsCi0gICAgMHg2NTg2ODdkMVVMLCAweGRkM2FlMGI0VUwsIDB4Y2Y4ZjRmNWFVTCwgMHg3NzMzMjgzZlVMLCAweGVhZTQxMDg2VUwsCi0gICAgMHg1MjU4NzdlM1VMLCAweDQwZWRkODBkVUwsIDB4Zjg1MWJmNjhVTCwgMHhmMDJiZjhhMVVMLCAweDQ4OTc5ZmM0VUwsCi0gICAgMHg1YTIyMzAyYVVMLCAweGUyOWU1NzRmVUwsIDB4N2Y0OTZmZjZVTCwgMHhjN2Y1MDg5M1VMLCAweGQ1NDBhNzdkVUwsCi0gICAgMHg2ZGZjYzAxOFVMLCAweDM1OWZkMDRlVUwsIDB4OGQyM2I3MmJVTCwgMHg5Zjk2MThjNVVMLCAweDI3MmE3ZmEwVUwsCi0gICAgMHhiYWZkNDcxOVVMLCAweDAyNDEyMDdjVUwsIDB4MTBmNDhmOTJVTCwgMHhhODQ4ZThmN1VMLCAweDliMTQ1ODNkVUwsCi0gICAgMHgyM2E4M2Y1OFVMLCAweDMxMWQ5MGI2VUwsIDB4ODlhMWY3ZDNVTCwgMHgxNDc2Y2Y2YVVMLCAweGFjY2FhODBmVUwsCi0gICAgMHhiZTdmMDdlMVVMLCAweDA2YzM2MDg0VUwsIDB4NWVhMDcwZDJVTCwgMHhlNjFjMTdiN1VMLCAweGY0YTliODU5VUwsCi0gICAgMHg0YzE1ZGYzY1VMLCAweGQxYzJlNzg1VUwsIDB4Njk3ZTgwZTBVTCwgMHg3YmNiMmYwZVVMLCAweGMzNzc0ODZiVUwsCi0gICAgMHhjYjBkMGZhMlVMLCAweDczYjE2OGM3VUwsIDB4NjEwNGM3MjlVTCwgMHhkOWI4YTA0Y1VMLCAweDQ0NmY5OGY1VUwsCi0gICAgMHhmY2QzZmY5MFVMLCAweGVlNjY1MDdlVUwsIDB4NTZkYTM3MWJVTCwgMHgwZWI5Mjc0ZFVMLCAweGI2MDU0MDI4VUwsCi0gICAgMHhhNGIwZWZjNlVMLCAweDFjMGM4OGEzVUwsIDB4ODFkYmIwMWFVTCwgMHgzOTY3ZDc3ZlVMLCAweDJiZDI3ODkxVUwsCi0gICAgMHg5MzZlMWZmNFVMLCAweDNiMjZmNzAzVUwsIDB4ODM5YTkwNjZVTCwgMHg5MTJmM2Y4OFVMLCAweDI5OTM1OGVkVUwsCi0gICAgMHhiNDQ0NjA1NFVMLCAweDBjZjgwNzMxVUwsIDB4MWU0ZGE4ZGZVTCwgMHhhNmYxY2ZiYVVMLCAweGZlOTJkZmVjVUwsCi0gICAgMHg0NjJlYjg4OVVMLCAweDU0OWIxNzY3VUwsIDB4ZWMyNzcwMDJVTCwgMHg3MWYwNDhiYlVMLCAweGM5NGMyZmRlVUwsCi0gICAgMHhkYmY5ODAzMFVMLCAweDYzNDVlNzU1VUwsIDB4NmIzZmEwOWNVTCwgMHhkMzgzYzdmOVVMLCAweGMxMzY2ODE3VUwsCi0gICAgMHg3OThhMGY3MlVMLCAweGU0NWQzN2NiVUwsIDB4NWNlMTUwYWVVTCwgMHg0ZTU0ZmY0MFVMLCAweGY2ZTg5ODI1VUwsCi0gICAgMHhhZThiODg3M1VMLCAweDE2MzdlZjE2VUwsIDB4MDQ4MjQwZjhVTCwgMHhiYzNlMjc5ZFVMLCAweDIxZTkxZjI0VUwsCi0gICAgMHg5OTU1Nzg0MVVMLCAweDhiZTBkN2FmVUwsIDB4MzM1Y2IwY2FVTCwgMHhlZDU5YjYzYlVMLCAweDU1ZTVkMTVlVUwsCi0gICAgMHg0NzUwN2ViMFVMLCAweGZmZWMxOWQ1VUwsIDB4NjIzYjIxNmNVTCwgMHhkYTg3NDYwOVVMLCAweGM4MzJlOWU3VUwsCi0gICAgMHg3MDhlOGU4MlVMLCAweDI4ZWQ5ZWQ0VUwsIDB4OTA1MWY5YjFVTCwgMHg4MmU0NTY1ZlVMLCAweDNhNTgzMTNhVUwsCi0gICAgMHhhNzhmMDk4M1VMLCAweDFmMzM2ZWU2VUwsIDB4MGQ4NmMxMDhVTCwgMHhiNTNhYTY2ZFVMLCAweGJkNDBlMWE0VUwsCi0gICAgMHgwNWZjODZjMVVMLCAweDE3NDkyOTJmVUwsIDB4YWZmNTRlNGFVTCwgMHgzMjIyNzZmM1VMLCAweDhhOWUxMTk2VUwsCi0gICAgMHg5ODJiYmU3OFVMLCAweDIwOTdkOTFkVUwsIDB4NzhmNGM5NGJVTCwgMHhjMDQ4YWUyZVVMLCAweGQyZmQwMWMwVUwsCi0gICAgMHg2YTQxNjZhNVVMLCAweGY3OTY1ZTFjVUwsIDB4NGYyYTM5NzlVTCwgMHg1ZDlmOTY5N1VMLCAweGU1MjNmMWYyVUwsCi0gICAgMHg0ZDZiMTkwNVVMLCAweGY1ZDc3ZTYwVUwsIDB4ZTc2MmQxOGVVTCwgMHg1ZmRlYjZlYlVMLCAweGMyMDk4ZTUyVUwsCi0gICAgMHg3YWI1ZTkzN1VMLCAweDY4MDA0NmQ5VUwsIDB4ZDBiYzIxYmNVTCwgMHg4OGRmMzFlYVVMLCAweDMwNjM1NjhmVUwsCi0gICAgMHgyMmQ2Zjk2MVVMLCAweDlhNmE5ZTA0VUwsIDB4MDdiZGE2YmRVTCwgMHhiZjAxYzFkOFVMLCAweGFkYjQ2ZTM2VUwsCi0gICAgMHgxNTA4MDk1M1VMLCAweDFkNzI0ZTlhVUwsIDB4YTVjZTI5ZmZVTCwgMHhiNzdiODYxMVVMLCAweDBmYzdlMTc0VUwsCi0gICAgMHg5MjEwZDljZFVMLCAweDJhYWNiZWE4VUwsIDB4MzgxOTExNDZVTCwgMHg4MGE1NzYyM1VMLCAweGQ4YzY2Njc1VUwsCi0gICAgMHg2MDdhMDExMFVMLCAweDcyY2ZhZWZlVUwsIDB4Y2E3M2M5OWJVTCwgMHg1N2E0ZjEyMlVMLCAweGVmMTg5NjQ3VUwsCi0gICAgMHhmZGFkMzlhOVVMLCAweDQ1MTE1ZWNjVUwsIDB4NzY0ZGVlMDZVTCwgMHhjZWYxODk2M1VMLCAweGRjNDQyNjhkVUwsCi0gICAgMHg2NGY4NDFlOFVMLCAweGY5MmY3OTUxVUwsIDB4NDE5MzFlMzRVTCwgMHg1MzI2YjFkYVVMLCAweGViOWFkNmJmVUwsCi0gICAgMHhiM2Y5YzZlOVVMLCAweDBiNDVhMThjVUwsIDB4MTlmMDBlNjJVTCwgMHhhMTRjNjkwN1VMLCAweDNjOWI1MWJlVUwsCi0gICAgMHg4NDI3MzZkYlVMLCAweDk2OTI5OTM1VUwsIDB4MmUyZWZlNTBVTCwgMHgyNjU0Yjk5OVVMLCAweDllZThkZWZjVUwsCi0gICAgMHg4YzVkNzExMlVMLCAweDM0ZTExNjc3VUwsIDB4YTkzNjJlY2VVTCwgMHgxMThhNDlhYlVMLCAweDAzM2ZlNjQ1VUwsCi0gICAgMHhiYjgzODEyMFVMLCAweGUzZTA5MTc2VUwsIDB4NWI1Y2Y2MTNVTCwgMHg0OWU5NTlmZFVMLCAweGYxNTUzZTk4VUwsCi0gICAgMHg2YzgyMDYyMVVMLCAweGQ0M2U2MTQ0VUwsIDB4YzY4YmNlYWFVTCwgMHg3ZTM3YTljZlVMLCAweGQ2N2Y0MTM4VUwsCi0gICAgMHg2ZWMzMjY1ZFVMLCAweDdjNzY4OWIzVUwsIDB4YzRjYWVlZDZVTCwgMHg1OTFkZDY2ZlVMLCAweGUxYTFiMTBhVUwsCi0gICAgMHhmMzE0MWVlNFVMLCAweDRiYTg3OTgxVUwsIDB4MTNjYjY5ZDdVTCwgMHhhYjc3MGViMlVMLCAweGI5YzJhMTVjVUwsCi0gICAgMHgwMTdlYzYzOVVMLCAweDljYTlmZTgwVUwsIDB4MjQxNTk5ZTVVTCwgMHgzNmEwMzYwYlVMLCAweDhlMWM1MTZlVUwsCi0gICAgMHg4NjY2MTZhN1VMLCAweDNlZGE3MWMyVUwsIDB4MmM2ZmRlMmNVTCwgMHg5NGQzYjk0OVVMLCAweDA5MDQ4MWYwVUwsCi0gICAgMHhiMWI4ZTY5NVVMLCAweGEzMGQ0OTdiVUwsIDB4MWJiMTJlMWVVTCwgMHg0M2QyM2U0OFVMLCAweGZiNmU1OTJkVUwsCi0gICAgMHhlOWRiZjZjM1VMLCAweDUxNjc5MWE2VUwsIDB4Y2NiMGE5MWZVTCwgMHg3NDBjY2U3YVVMLCAweDY2Yjk2MTk0VUwsCi0gICAgMHhkZTA1MDZmMVVMCi0gIH0sCi0gIHsKLSAgICAweDAwMDAwMDAwVUwsIDB4OTYzMDA3NzdVTCwgMHgyYzYxMGVlZVVMLCAweGJhNTEwOTk5VUwsIDB4MTljNDZkMDdVTCwKLSAgICAweDhmZjQ2YTcwVUwsIDB4MzVhNTYzZTlVTCwgMHhhMzk1NjQ5ZVVMLCAweDMyODhkYjBlVUwsIDB4YTRiOGRjNzlVTCwKLSAgICAweDFlZTlkNWUwVUwsIDB4ODhkOWQyOTdVTCwgMHgyYjRjYjYwOVVMLCAweGJkN2NiMTdlVUwsIDB4MDcyZGI4ZTdVTCwKLSAgICAweDkxMWRiZjkwVUwsIDB4NjQxMGI3MWRVTCwgMHhmMjIwYjA2YVVMLCAweDQ4NzFiOWYzVUwsIDB4ZGU0MWJlODRVTCwKLSAgICAweDdkZDRkYTFhVUwsIDB4ZWJlNGRkNmRVTCwgMHg1MWI1ZDRmNFVMLCAweGM3ODVkMzgzVUwsIDB4NTY5ODZjMTNVTCwKLSAgICAweGMwYTg2YjY0VUwsIDB4N2FmOTYyZmRVTCwgMHhlY2M5NjU4YVVMLCAweDRmNWMwMTE0VUwsIDB4ZDk2YzA2NjNVTCwKLSAgICAweDYzM2QwZmZhVUwsIDB4ZjUwZDA4OGRVTCwgMHhjODIwNmUzYlVMLCAweDVlMTA2OTRjVUwsIDB4ZTQ0MTYwZDVVTCwKLSAgICAweDcyNzE2N2EyVUwsIDB4ZDFlNDAzM2NVTCwgMHg0N2Q0MDQ0YlVMLCAweGZkODUwZGQyVUwsIDB4NmJiNTBhYTVVTCwKLSAgICAweGZhYThiNTM1VUwsIDB4NmM5OGIyNDJVTCwgMHhkNmM5YmJkYlVMLCAweDQwZjliY2FjVUwsIDB4ZTM2Y2Q4MzJVTCwKLSAgICAweDc1NWNkZjQ1VUwsIDB4Y2YwZGQ2ZGNVTCwgMHg1OTNkZDFhYlVMLCAweGFjMzBkOTI2VUwsIDB4M2EwMGRlNTFVTCwKLSAgICAweDgwNTFkN2M4VUwsIDB4MTY2MWQwYmZVTCwgMHhiNWY0YjQyMVVMLCAweDIzYzRiMzU2VUwsIDB4OTk5NWJhY2ZVTCwKLSAgICAweDBmYTViZGI4VUwsIDB4OWViODAyMjhVTCwgMHgwODg4MDU1ZlVMLCAweGIyZDkwY2M2VUwsIDB4MjRlOTBiYjFVTCwKLSAgICAweDg3N2M2ZjJmVUwsIDB4MTE0YzY4NThVTCwgMHhhYjFkNjFjMVVMLCAweDNkMmQ2NmI2VUwsIDB4OTA0MWRjNzZVTCwKLSAgICAweDA2NzFkYjAxVUwsIDB4YmMyMGQyOThVTCwgMHgyYTEwZDVlZlVMLCAweDg5ODViMTcxVUwsIDB4MWZiNWI2MDZVTCwKLSAgICAweGE1ZTRiZjlmVUwsIDB4MzNkNGI4ZThVTCwgMHhhMmM5MDc3OFVMLCAweDM0ZjkwMDBmVUwsIDB4OGVhODA5OTZVTCwKLSAgICAweDE4OTgwZWUxVUwsIDB4YmIwZDZhN2ZVTCwgMHgyZDNkNmQwOFVMLCAweDk3NmM2NDkxVUwsIDB4MDE1YzYzZTZVTCwKLSAgICAweGY0NTE2YjZiVUwsIDB4NjI2MTZjMWNVTCwgMHhkODMwNjU4NVVMLCAweDRlMDA2MmYyVUwsIDB4ZWQ5NTA2NmNVTCwKLSAgICAweDdiYTUwMTFiVUwsIDB4YzFmNDA4ODJVTCwgMHg1N2M0MGZmNVVMLCAweGM2ZDliMDY1VUwsIDB4NTBlOWI3MTJVTCwKLSAgICAweGVhYjhiZThiVUwsIDB4N2M4OGI5ZmNVTCwgMHhkZjFkZGQ2MlVMLCAweDQ5MmRkYTE1VUwsIDB4ZjM3Y2QzOGNVTCwKLSAgICAweDY1NGNkNGZiVUwsIDB4NTg2MWIyNGRVTCwgMHhjZTUxYjUzYVVMLCAweDc0MDBiY2EzVUwsIDB4ZTIzMGJiZDRVTCwKLSAgICAweDQxYTVkZjRhVUwsIDB4ZDc5NWQ4M2RVTCwgMHg2ZGM0ZDFhNFVMLCAweGZiZjRkNmQzVUwsIDB4NmFlOTY5NDNVTCwKLSAgICAweGZjZDk2ZTM0VUwsIDB4NDY4ODY3YWRVTCwgMHhkMGI4NjBkYVVMLCAweDczMmQwNDQ0VUwsIDB4ZTUxZDAzMzNVTCwKLSAgICAweDVmNGMwYWFhVUwsIDB4Yzk3YzBkZGRVTCwgMHgzYzcxMDU1MFVMLCAweGFhNDEwMjI3VUwsIDB4MTAxMDBiYmVVTCwKLSAgICAweDg2MjAwY2M5VUwsIDB4MjViNTY4NTdVTCwgMHhiMzg1NmYyMFVMLCAweDA5ZDQ2NmI5VUwsIDB4OWZlNDYxY2VVTCwKLSAgICAweDBlZjlkZTVlVUwsIDB4OThjOWQ5MjlVTCwgMHgyMjk4ZDBiMFVMLCAweGI0YThkN2M3VUwsIDB4MTczZGIzNTlVTCwKLSAgICAweDgxMGRiNDJlVUwsIDB4M2I1Y2JkYjdVTCwgMHhhZDZjYmFjMFVMLCAweDIwODNiOGVkVUwsIDB4YjZiM2JmOWFVTCwKLSAgICAweDBjZTJiNjAzVUwsIDB4OWFkMmIxNzRVTCwgMHgzOTQ3ZDVlYVVMLCAweGFmNzdkMjlkVUwsIDB4MTUyNmRiMDRVTCwKLSAgICAweDgzMTZkYzczVUwsIDB4MTIwYjYzZTNVTCwgMHg4NDNiNjQ5NFVMLCAweDNlNmE2ZDBkVUwsIDB4YTg1YTZhN2FVTCwKLSAgICAweDBiY2YwZWU0VUwsIDB4OWRmZjA5OTNVTCwgMHgyN2FlMDAwYVVMLCAweGIxOWUwNzdkVUwsIDB4NDQ5MzBmZjBVTCwKLSAgICAweGQyYTMwODg3VUwsIDB4NjhmMjAxMWVVTCwgMHhmZWMyMDY2OVVMLCAweDVkNTc2MmY3VUwsIDB4Y2I2NzY1ODBVTCwKLSAgICAweDcxMzY2YzE5VUwsIDB4ZTcwNjZiNmVVTCwgMHg3NjFiZDRmZVVMLCAweGUwMmJkMzg5VUwsIDB4NWE3YWRhMTBVTCwKLSAgICAweGNjNGFkZDY3VUwsIDB4NmZkZmI5ZjlVTCwgMHhmOWVmYmU4ZVVMLCAweDQzYmViNzE3VUwsIDB4ZDU4ZWIwNjBVTCwKLSAgICAweGU4YTNkNmQ2VUwsIDB4N2U5M2QxYTFVTCwgMHhjNGMyZDgzOFVMLCAweDUyZjJkZjRmVUwsIDB4ZjE2N2JiZDFVTCwKLSAgICAweDY3NTdiY2E2VUwsIDB4ZGQwNmI1M2ZVTCwgMHg0YjM2YjI0OFVMLCAweGRhMmIwZGQ4VUwsIDB4NGMxYjBhYWZVTCwKLSAgICAweGY2NGEwMzM2VUwsIDB4NjA3YTA0NDFVTCwgMHhjM2VmNjBkZlVMLCAweDU1ZGY2N2E4VUwsIDB4ZWY4ZTZlMzFVTCwKLSAgICAweDc5YmU2OTQ2VUwsIDB4OGNiMzYxY2JVTCwgMHgxYTgzNjZiY1VMLCAweGEwZDI2ZjI1VUwsIDB4MzZlMjY4NTJVTCwKLSAgICAweDk1NzcwY2NjVUwsIDB4MDM0NzBiYmJVTCwgMHhiOTE2MDIyMlVMLCAweDJmMjYwNTU1VUwsIDB4YmUzYmJhYzVVTCwKLSAgICAweDI4MGJiZGIyVUwsIDB4OTI1YWI0MmJVTCwgMHgwNDZhYjM1Y1VMLCAweGE3ZmZkN2MyVUwsIDB4MzFjZmQwYjVVTCwKLSAgICAweDhiOWVkOTJjVUwsIDB4MWRhZWRlNWJVTCwgMHhiMGMyNjQ5YlVMLCAweDI2ZjI2M2VjVUwsIDB4OWNhMzZhNzVVTCwKLSAgICAweDBhOTM2ZDAyVUwsIDB4YTkwNjA5OWNVTCwgMHgzZjM2MGVlYlVMLCAweDg1NjcwNzcyVUwsIDB4MTM1NzAwMDVVTCwKLSAgICAweDgyNGFiZjk1VUwsIDB4MTQ3YWI4ZTJVTCwgMHhhZTJiYjE3YlVMLCAweDM4MWJiNjBjVUwsIDB4OWI4ZWQyOTJVTCwKLSAgICAweDBkYmVkNWU1VUwsIDB4YjdlZmRjN2NVTCwgMHgyMWRmZGIwYlVMLCAweGQ0ZDJkMzg2VUwsIDB4NDJlMmQ0ZjFVTCwKLSAgICAweGY4YjNkZDY4VUwsIDB4NmU4M2RhMWZVTCwgMHhjZDE2YmU4MVVMLCAweDViMjZiOWY2VUwsIDB4ZTE3N2IwNmZVTCwKLSAgICAweDc3NDdiNzE4VUwsIDB4ZTY1YTA4ODhVTCwgMHg3MDZhMGZmZlVMLCAweGNhM2IwNjY2VUwsIDB4NWMwYjAxMTFVTCwKLSAgICAweGZmOWU2NThmVUwsIDB4NjlhZTYyZjhVTCwgMHhkM2ZmNmI2MVVMLCAweDQ1Y2Y2YzE2VUwsIDB4NzhlMjBhYTBVTCwKLSAgICAweGVlZDIwZGQ3VUwsIDB4NTQ4MzA0NGVVTCwgMHhjMmIzMDMzOVVMLCAweDYxMjY2N2E3VUwsIDB4ZjcxNjYwZDBVTCwKLSAgICAweDRkNDc2OTQ5VUwsIDB4ZGI3NzZlM2VVTCwgMHg0YTZhZDFhZVVMLCAweGRjNWFkNmQ5VUwsIDB4NjYwYmRmNDBVTCwKLSAgICAweGYwM2JkODM3VUwsIDB4NTNhZWJjYTlVTCwgMHhjNTllYmJkZVVMLCAweDdmY2ZiMjQ3VUwsIDB4ZTlmZmI1MzBVTCwKLSAgICAweDFjZjJiZGJkVUwsIDB4OGFjMmJhY2FVTCwgMHgzMDkzYjM1M1VMLCAweGE2YTNiNDI0VUwsIDB4MDUzNmQwYmFVTCwKLSAgICAweDkzMDZkN2NkVUwsIDB4Mjk1N2RlNTRVTCwgMHhiZjY3ZDkyM1VMLCAweDJlN2E2NmIzVUwsIDB4Yjg0YTYxYzRVTCwKLSAgICAweDAyMWI2ODVkVUwsIDB4OTQyYjZmMmFVTCwgMHgzN2JlMGJiNFVMLCAweGExOGUwY2MzVUwsIDB4MWJkZjA1NWFVTCwKLSAgICAweDhkZWYwMjJkVUwKLSAgfSwKLSAgewotICAgIDB4MDAwMDAwMDBVTCwgMHg0MTMxMWIxOVVMLCAweDgyNjIzNjMyVUwsIDB4YzM1MzJkMmJVTCwgMHgwNGM1NmM2NFVMLAotICAgIDB4NDVmNDc3N2RVTCwgMHg4NmE3NWE1NlVMLCAweGM3OTY0MTRmVUwsIDB4MDg4YWQ5YzhVTCwgMHg0OWJiYzJkMVVMLAotICAgIDB4OGFlOGVmZmFVTCwgMHhjYmQ5ZjRlM1VMLCAweDBjNGZiNWFjVUwsIDB4NGQ3ZWFlYjVVTCwgMHg4ZTJkODM5ZVVMLAotICAgIDB4Y2YxYzk4ODdVTCwgMHg1MTEyYzI0YVVMLCAweDEwMjNkOTUzVUwsIDB4ZDM3MGY0NzhVTCwgMHg5MjQxZWY2MVVMLAotICAgIDB4NTVkN2FlMmVVTCwgMHgxNGU2YjUzN1VMLCAweGQ3YjU5ODFjVUwsIDB4OTY4NDgzMDVVTCwgMHg1OTk4MWI4MlVMLAotICAgIDB4MThhOTAwOWJVTCwgMHhkYmZhMmRiMFVMLCAweDlhY2IzNmE5VUwsIDB4NWQ1ZDc3ZTZVTCwgMHgxYzZjNmNmZlVMLAotICAgIDB4ZGYzZjQxZDRVTCwgMHg5ZTBlNWFjZFVMLCAweGEyMjQ4NDk1VUwsIDB4ZTMxNTlmOGNVTCwgMHgyMDQ2YjJhN1VMLAotICAgIDB4NjE3N2E5YmVVTCwgMHhhNmUxZThmMVVMLCAweGU3ZDBmM2U4VUwsIDB4MjQ4M2RlYzNVTCwgMHg2NWIyYzVkYVVMLAotICAgIDB4YWFhZTVkNWRVTCwgMHhlYjlmNDY0NFVMLCAweDI4Y2M2YjZmVUwsIDB4NjlmZDcwNzZVTCwgMHhhZTZiMzEzOVVMLAotICAgIDB4ZWY1YTJhMjBVTCwgMHgyYzA5MDcwYlVMLCAweDZkMzgxYzEyVUwsIDB4ZjMzNjQ2ZGZVTCwgMHhiMjA3NWRjNlVMLAotICAgIDB4NzE1NDcwZWRVTCwgMHgzMDY1NmJmNFVMLCAweGY3ZjMyYWJiVUwsIDB4YjZjMjMxYTJVTCwgMHg3NTkxMWM4OVVMLAotICAgIDB4MzRhMDA3OTBVTCwgMHhmYmJjOWYxN1VMLCAweGJhOGQ4NDBlVUwsIDB4NzlkZWE5MjVVTCwgMHgzOGVmYjIzY1VMLAotICAgIDB4ZmY3OWYzNzNVTCwgMHhiZTQ4ZTg2YVVMLCAweDdkMWJjNTQxVUwsIDB4M2MyYWRlNThVTCwgMHgwNTRmNzlmMFVMLAotICAgIDB4NDQ3ZTYyZTlVTCwgMHg4NzJkNGZjMlVMLCAweGM2MWM1NGRiVUwsIDB4MDE4YTE1OTRVTCwgMHg0MGJiMGU4ZFVMLAotICAgIDB4ODNlODIzYTZVTCwgMHhjMmQ5MzhiZlVMLCAweDBkYzVhMDM4VUwsIDB4NGNmNGJiMjFVTCwgMHg4ZmE3OTYwYVVMLAotICAgIDB4Y2U5NjhkMTNVTCwgMHgwOTAwY2M1Y1VMLCAweDQ4MzFkNzQ1VUwsIDB4OGI2MmZhNmVVTCwgMHhjYTUzZTE3N1VMLAotICAgIDB4NTQ1ZGJiYmFVTCwgMHgxNTZjYTBhM1VMLCAweGQ2M2Y4ZDg4VUwsIDB4OTcwZTk2OTFVTCwgMHg1MDk4ZDdkZVVMLAotICAgIDB4MTFhOWNjYzdVTCwgMHhkMmZhZTFlY1VMLCAweDkzY2JmYWY1VUwsIDB4NWNkNzYyNzJVTCwgMHgxZGU2Nzk2YlVMLAotICAgIDB4ZGViNTU0NDBVTCwgMHg5Zjg0NGY1OVVMLCAweDU4MTIwZTE2VUwsIDB4MTkyMzE1MGZVTCwgMHhkYTcwMzgyNFVMLAotICAgIDB4OWI0MTIzM2RVTCwgMHhhNzZiZmQ2NVVMLCAweGU2NWFlNjdjVUwsIDB4MjUwOWNiNTdVTCwgMHg2NDM4ZDA0ZVVMLAotICAgIDB4YTNhZTkxMDFVTCwgMHhlMjlmOGExOFVMLCAweDIxY2NhNzMzVUwsIDB4NjBmZGJjMmFVTCwgMHhhZmUxMjRhZFVMLAotICAgIDB4ZWVkMDNmYjRVTCwgMHgyZDgzMTI5ZlVMLCAweDZjYjIwOTg2VUwsIDB4YWIyNDQ4YzlVTCwgMHhlYTE1NTNkMFVMLAotICAgIDB4Mjk0NjdlZmJVTCwgMHg2ODc3NjVlMlVMLCAweGY2NzkzZjJmVUwsIDB4Yjc0ODI0MzZVTCwgMHg3NDFiMDkxZFVMLAotICAgIDB4MzUyYTEyMDRVTCwgMHhmMmJjNTM0YlVMLCAweGIzOGQ0ODUyVUwsIDB4NzBkZTY1NzlVTCwgMHgzMWVmN2U2MFVMLAotICAgIDB4ZmVmM2U2ZTdVTCwgMHhiZmMyZmRmZVVMLCAweDdjOTFkMGQ1VUwsIDB4M2RhMGNiY2NVTCwgMHhmYTM2OGE4M1VMLAotICAgIDB4YmIwNzkxOWFVTCwgMHg3ODU0YmNiMVVMLCAweDM5NjVhN2E4VUwsIDB4NGI5ODgzM2JVTCwgMHgwYWE5OTgyMlVMLAotICAgIDB4YzlmYWI1MDlVTCwgMHg4OGNiYWUxMFVMLCAweDRmNWRlZjVmVUwsIDB4MGU2Y2Y0NDZVTCwgMHhjZDNmZDk2ZFVMLAotICAgIDB4OGMwZWMyNzRVTCwgMHg0MzEyNWFmM1VMLCAweDAyMjM0MWVhVUwsIDB4YzE3MDZjYzFVTCwgMHg4MDQxNzdkOFVMLAotICAgIDB4NDdkNzM2OTdVTCwgMHgwNmU2MmQ4ZVVMLCAweGM1YjUwMGE1VUwsIDB4ODQ4NDFiYmNVTCwgMHgxYThhNDE3MVVMLAotICAgIDB4NWJiYjVhNjhVTCwgMHg5OGU4Nzc0M1VMLCAweGQ5ZDk2YzVhVUwsIDB4MWU0ZjJkMTVVTCwgMHg1ZjdlMzYwY1VMLAotICAgIDB4OWMyZDFiMjdVTCwgMHhkZDFjMDAzZVVMLCAweDEyMDA5OGI5VUwsIDB4NTMzMTgzYTBVTCwgMHg5MDYyYWU4YlVMLAotICAgIDB4ZDE1M2I1OTJVTCwgMHgxNmM1ZjRkZFVMLCAweDU3ZjRlZmM0VUwsIDB4OTRhN2MyZWZVTCwgMHhkNTk2ZDlmNlVMLAotICAgIDB4ZTliYzA3YWVVTCwgMHhhODhkMWNiN1VMLCAweDZiZGUzMTljVUwsIDB4MmFlZjJhODVVTCwgMHhlZDc5NmJjYVVMLAotICAgIDB4YWM0ODcwZDNVTCwgMHg2ZjFiNWRmOFVMLCAweDJlMmE0NmUxVUwsIDB4ZTEzNmRlNjZVTCwgMHhhMDA3YzU3ZlVMLAotICAgIDB4NjM1NGU4NTRVTCwgMHgyMjY1ZjM0ZFVMLCAweGU1ZjNiMjAyVUwsIDB4YTRjMmE5MWJVTCwgMHg2NzkxODQzMFVMLAotICAgIDB4MjZhMDlmMjlVTCwgMHhiOGFlYzVlNFVMLCAweGY5OWZkZWZkVUwsIDB4M2FjY2YzZDZVTCwgMHg3YmZkZThjZlVMLAotICAgIDB4YmM2YmE5ODBVTCwgMHhmZDVhYjI5OVVMLCAweDNlMDk5ZmIyVUwsIDB4N2YzODg0YWJVTCwgMHhiMDI0MWMyY1VMLAotICAgIDB4ZjExNTA3MzVVTCwgMHgzMjQ2MmExZVVMLCAweDczNzczMTA3VUwsIDB4YjRlMTcwNDhVTCwgMHhmNWQwNmI1MVVMLAotICAgIDB4MzY4MzQ2N2FVTCwgMHg3N2IyNWQ2M1VMLCAweDRlZDdmYWNiVUwsIDB4MGZlNmUxZDJVTCwgMHhjY2I1Y2NmOVVMLAotICAgIDB4OGQ4NGQ3ZTBVTCwgMHg0YTEyOTZhZlVMLCAweDBiMjM4ZGI2VUwsIDB4Yzg3MGEwOWRVTCwgMHg4OTQxYmI4NFVMLAotICAgIDB4NDY1ZDIzMDNVTCwgMHgwNzZjMzgxYVVMLCAweGM0M2YxNTMxVUwsIDB4ODUwZTBlMjhVTCwgMHg0Mjk4NGY2N1VMLAotICAgIDB4MDNhOTU0N2VVTCwgMHhjMGZhNzk1NVVMLCAweDgxY2I2MjRjVUwsIDB4MWZjNTM4ODFVTCwgMHg1ZWY0MjM5OFVMLAotICAgIDB4OWRhNzBlYjNVTCwgMHhkYzk2MTVhYVVMLCAweDFiMDA1NGU1VUwsIDB4NWEzMTRmZmNVTCwgMHg5OTYyNjJkN1VMLAotICAgIDB4ZDg1Mzc5Y2VVTCwgMHgxNzRmZTE0OVVMLCAweDU2N2VmYTUwVUwsIDB4OTUyZGQ3N2JVTCwgMHhkNDFjY2M2MlVMLAotICAgIDB4MTM4YThkMmRVTCwgMHg1MmJiOTYzNFVMLCAweDkxZThiYjFmVUwsIDB4ZDBkOWEwMDZVTCwgMHhlY2YzN2U1ZVVMLAotICAgIDB4YWRjMjY1NDdVTCwgMHg2ZTkxNDg2Y1VMLCAweDJmYTA1Mzc1VUwsIDB4ZTgzNjEyM2FVTCwgMHhhOTA3MDkyM1VMLAotICAgIDB4NmE1NDI0MDhVTCwgMHgyYjY1M2YxMVVMLCAweGU0NzlhNzk2VUwsIDB4YTU0OGJjOGZVTCwgMHg2NjFiOTFhNFVMLAotICAgIDB4MjcyYThhYmRVTCwgMHhlMGJjY2JmMlVMLCAweGExOGRkMGViVUwsIDB4NjJkZWZkYzBVTCwgMHgyM2VmZTZkOVVMLAotICAgIDB4YmRlMWJjMTRVTCwgMHhmY2QwYTcwZFVMLCAweDNmODM4YTI2VUwsIDB4N2ViMjkxM2ZVTCwgMHhiOTI0ZDA3MFVMLAotICAgIDB4ZjgxNWNiNjlVTCwgMHgzYjQ2ZTY0MlVMLCAweDdhNzdmZDViVUwsIDB4YjU2YjY1ZGNVTCwgMHhmNDVhN2VjNVVMLAotICAgIDB4MzcwOTUzZWVVTCwgMHg3NjM4NDhmN1VMLCAweGIxYWUwOWI4VUwsIDB4ZjA5ZjEyYTFVTCwgMHgzM2NjM2Y4YVVMLAotICAgIDB4NzJmZDI0OTNVTAotICB9LAotICB7Ci0gICAgMHgwMDAwMDAwMFVMLCAweDM3NmFjMjAxVUwsIDB4NmVkNDg0MDNVTCwgMHg1OWJlNDYwMlVMLCAweGRjYTgwOTA3VUwsCi0gICAgMHhlYmMyY2IwNlVMLCAweGIyN2M4ZDA0VUwsIDB4ODUxNjRmMDVVTCwgMHhiODUxMTMwZVVMLCAweDhmM2JkMTBmVUwsCi0gICAgMHhkNjg1OTcwZFVMLCAweGUxZWY1NTBjVUwsIDB4NjRmOTFhMDlVTCwgMHg1MzkzZDgwOFVMLCAweDBhMmQ5ZTBhVUwsCi0gICAgMHgzZDQ3NWMwYlVMLCAweDcwYTMyNjFjVUwsIDB4NDdjOWU0MWRVTCwgMHgxZTc3YTIxZlVMLCAweDI5MWQ2MDFlVUwsCi0gICAgMHhhYzBiMmYxYlVMLCAweDliNjFlZDFhVUwsIDB4YzJkZmFiMThVTCwgMHhmNWI1NjkxOVVMLCAweGM4ZjIzNTEyVUwsCi0gICAgMHhmZjk4ZjcxM1VMLCAweGE2MjZiMTExVUwsIDB4OTE0YzczMTBVTCwgMHgxNDVhM2MxNVVMLCAweDIzMzBmZTE0VUwsCi0gICAgMHg3YThlYjgxNlVMLCAweDRkZTQ3YTE3VUwsIDB4ZTA0NjRkMzhVTCwgMHhkNzJjOGYzOVVMLCAweDhlOTJjOTNiVUwsCi0gICAgMHhiOWY4MGIzYVVMLCAweDNjZWU0NDNmVUwsIDB4MGI4NDg2M2VVTCwgMHg1MjNhYzAzY1VMLCAweDY1NTAwMjNkVUwsCi0gICAgMHg1ODE3NWUzNlVMLCAweDZmN2Q5YzM3VUwsIDB4MzZjM2RhMzVVTCwgMHgwMWE5MTgzNFVMLCAweDg0YmY1NzMxVUwsCi0gICAgMHhiM2Q1OTUzMFVMLCAweGVhNmJkMzMyVUwsIDB4ZGQwMTExMzNVTCwgMHg5MGU1NmIyNFVMLCAweGE3OGZhOTI1VUwsCi0gICAgMHhmZTMxZWYyN1VMLCAweGM5NWIyZDI2VUwsIDB4NGM0ZDYyMjNVTCwgMHg3YjI3YTAyMlVMLCAweDIyOTllNjIwVUwsCi0gICAgMHgxNWYzMjQyMVVMLCAweDI4YjQ3ODJhVUwsIDB4MWZkZWJhMmJVTCwgMHg0NjYwZmMyOVVMLCAweDcxMGEzZTI4VUwsCi0gICAgMHhmNDFjNzEyZFVMLCAweGMzNzZiMzJjVUwsIDB4OWFjOGY1MmVVTCwgMHhhZGEyMzcyZlVMLCAweGMwOGQ5YTcwVUwsCi0gICAgMHhmN2U3NTg3MVVMLCAweGFlNTkxZTczVUwsIDB4OTkzM2RjNzJVTCwgMHgxYzI1OTM3N1VMLCAweDJiNGY1MTc2VUwsCi0gICAgMHg3MmYxMTc3NFVMLCAweDQ1OWJkNTc1VUwsIDB4NzhkYzg5N2VVTCwgMHg0ZmI2NGI3ZlVMLCAweDE2MDgwZDdkVUwsCi0gICAgMHgyMTYyY2Y3Y1VMLCAweGE0NzQ4MDc5VUwsIDB4OTMxZTQyNzhVTCwgMHhjYWEwMDQ3YVVMLCAweGZkY2FjNjdiVUwsCi0gICAgMHhiMDJlYmM2Y1VMLCAweDg3NDQ3ZTZkVUwsIDB4ZGVmYTM4NmZVTCwgMHhlOTkwZmE2ZVVMLCAweDZjODZiNTZiVUwsCi0gICAgMHg1YmVjNzc2YVVMLCAweDAyNTIzMTY4VUwsIDB4MzUzOGYzNjlVTCwgMHgwODdmYWY2MlVMLCAweDNmMTU2ZDYzVUwsCi0gICAgMHg2NmFiMmI2MVVMLCAweDUxYzFlOTYwVUwsIDB4ZDRkN2E2NjVVTCwgMHhlM2JkNjQ2NFVMLCAweGJhMDMyMjY2VUwsCi0gICAgMHg4ZDY5ZTA2N1VMLCAweDIwY2JkNzQ4VUwsIDB4MTdhMTE1NDlVTCwgMHg0ZTFmNTM0YlVMLCAweDc5NzU5MTRhVUwsCi0gICAgMHhmYzYzZGU0ZlVMLCAweGNiMDkxYzRlVUwsIDB4OTJiNzVhNGNVTCwgMHhhNWRkOTg0ZFVMLCAweDk4OWFjNDQ2VUwsCi0gICAgMHhhZmYwMDY0N1VMLCAweGY2NGU0MDQ1VUwsIDB4YzEyNDgyNDRVTCwgMHg0NDMyY2Q0MVVMLCAweDczNTgwZjQwVUwsCi0gICAgMHgyYWU2NDk0MlVMLCAweDFkOGM4YjQzVUwsIDB4NTA2OGYxNTRVTCwgMHg2NzAyMzM1NVVMLCAweDNlYmM3NTU3VUwsCi0gICAgMHgwOWQ2Yjc1NlVMLCAweDhjYzBmODUzVUwsIDB4YmJhYTNhNTJVTCwgMHhlMjE0N2M1MFVMLCAweGQ1N2ViZTUxVUwsCi0gICAgMHhlODM5ZTI1YVVMLCAweGRmNTMyMDViVUwsIDB4ODZlZDY2NTlVTCwgMHhiMTg3YTQ1OFVMLCAweDM0OTFlYjVkVUwsCi0gICAgMHgwM2ZiMjk1Y1VMLCAweDVhNDU2ZjVlVUwsIDB4NmQyZmFkNWZVTCwgMHg4MDFiMzVlMVVMLCAweGI3NzFmN2UwVUwsCi0gICAgMHhlZWNmYjFlMlVMLCAweGQ5YTU3M2UzVUwsIDB4NWNiMzNjZTZVTCwgMHg2YmQ5ZmVlN1VMLCAweDMyNjdiOGU1VUwsCi0gICAgMHgwNTBkN2FlNFVMLCAweDM4NGEyNmVmVUwsIDB4MGYyMGU0ZWVVTCwgMHg1NjllYTJlY1VMLCAweDYxZjQ2MGVkVUwsCi0gICAgMHhlNGUyMmZlOFVMLCAweGQzODhlZGU5VUwsIDB4OGEzNmFiZWJVTCwgMHhiZDVjNjllYVVMLCAweGYwYjgxM2ZkVUwsCi0gICAgMHhjN2QyZDFmY1VMLCAweDllNmM5N2ZlVUwsIDB4YTkwNjU1ZmZVTCwgMHgyYzEwMWFmYVVMLCAweDFiN2FkOGZiVUwsCi0gICAgMHg0MmM0OWVmOVVMLCAweDc1YWU1Y2Y4VUwsIDB4NDhlOTAwZjNVTCwgMHg3ZjgzYzJmMlVMLCAweDI2M2Q4NGYwVUwsCi0gICAgMHgxMTU3NDZmMVVMLCAweDk0NDEwOWY0VUwsIDB4YTMyYmNiZjVVTCwgMHhmYTk1OGRmN1VMLCAweGNkZmY0ZmY2VUwsCi0gICAgMHg2MDVkNzhkOVVMLCAweDU3MzdiYWQ4VUwsIDB4MGU4OWZjZGFVTCwgMHgzOWUzM2VkYlVMLCAweGJjZjU3MWRlVUwsCi0gICAgMHg4YjlmYjNkZlVMLCAweGQyMjFmNWRkVUwsIDB4ZTU0YjM3ZGNVTCwgMHhkODBjNmJkN1VMLCAweGVmNjZhOWQ2VUwsCi0gICAgMHhiNmQ4ZWZkNFVMLCAweDgxYjIyZGQ1VUwsIDB4MDRhNDYyZDBVTCwgMHgzM2NlYTBkMVVMLCAweDZhNzBlNmQzVUwsCi0gICAgMHg1ZDFhMjRkMlVMLCAweDEwZmU1ZWM1VUwsIDB4Mjc5NDljYzRVTCwgMHg3ZTJhZGFjNlVMLCAweDQ5NDAxOGM3VUwsCi0gICAgMHhjYzU2NTdjMlVMLCAweGZiM2M5NWMzVUwsIDB4YTI4MmQzYzFVTCwgMHg5NWU4MTFjMFVMLCAweGE4YWY0ZGNiVUwsCi0gICAgMHg5ZmM1OGZjYVVMLCAweGM2N2JjOWM4VUwsIDB4ZjExMTBiYzlVTCwgMHg3NDA3NDRjY1VMLCAweDQzNmQ4NmNkVUwsCi0gICAgMHgxYWQzYzBjZlVMLCAweDJkYjkwMmNlVUwsIDB4NDA5NmFmOTFVTCwgMHg3N2ZjNmQ5MFVMLCAweDJlNDIyYjkyVUwsCi0gICAgMHgxOTI4ZTk5M1VMLCAweDljM2VhNjk2VUwsIDB4YWI1NDY0OTdVTCwgMHhmMmVhMjI5NVVMLCAweGM1ODBlMDk0VUwsCi0gICAgMHhmOGM3YmM5ZlVMLCAweGNmYWQ3ZTllVUwsIDB4OTYxMzM4OWNVTCwgMHhhMTc5ZmE5ZFVMLCAweDI0NmZiNTk4VUwsCi0gICAgMHgxMzA1Nzc5OVVMLCAweDRhYmIzMTliVUwsIDB4N2RkMWYzOWFVTCwgMHgzMDM1ODk4ZFVMLCAweDA3NWY0YjhjVUwsCi0gICAgMHg1ZWUxMGQ4ZVVMLCAweDY5OGJjZjhmVUwsIDB4ZWM5ZDgwOGFVTCwgMHhkYmY3NDI4YlVMLCAweDgyNDkwNDg5VUwsCi0gICAgMHhiNTIzYzY4OFVMLCAweDg4NjQ5YTgzVUwsIDB4YmYwZTU4ODJVTCwgMHhlNmIwMWU4MFVMLCAweGQxZGFkYzgxVUwsCi0gICAgMHg1NGNjOTM4NFVMLCAweDYzYTY1MTg1VUwsIDB4M2ExODE3ODdVTCwgMHgwZDcyZDU4NlVMLCAweGEwZDBlMmE5VUwsCi0gICAgMHg5N2JhMjBhOFVMLCAweGNlMDQ2NmFhVUwsIDB4Zjk2ZWE0YWJVTCwgMHg3Yzc4ZWJhZVVMLCAweDRiMTIyOWFmVUwsCi0gICAgMHgxMmFjNmZhZFVMLCAweDI1YzZhZGFjVUwsIDB4MTg4MWYxYTdVTCwgMHgyZmViMzNhNlVMLCAweDc2NTU3NWE0VUwsCi0gICAgMHg0MTNmYjdhNVVMLCAweGM0MjlmOGEwVUwsIDB4ZjM0MzNhYTFVTCwgMHhhYWZkN2NhM1VMLCAweDlkOTdiZWEyVUwsCi0gICAgMHhkMDczYzRiNVVMLCAweGU3MTkwNmI0VUwsIDB4YmVhNzQwYjZVTCwgMHg4OWNkODJiN1VMLCAweDBjZGJjZGIyVUwsCi0gICAgMHgzYmIxMGZiM1VMLCAweDYyMGY0OWIxVUwsIDB4NTU2NThiYjBVTCwgMHg2ODIyZDdiYlVMLCAweDVmNDgxNWJhVUwsCi0gICAgMHgwNmY2NTNiOFVMLCAweDMxOWM5MWI5VUwsIDB4YjQ4YWRlYmNVTCwgMHg4M2UwMWNiZFVMLCAweGRhNWU1YWJmVUwsCi0gICAgMHhlZDM0OThiZVVMCi0gIH0sCi0gIHsKLSAgICAweDAwMDAwMDAwVUwsIDB4NjU2N2JjYjhVTCwgMHg4YmM4MDlhYVVMLCAweGVlYWZiNTEyVUwsIDB4NTc5NzYyOGZVTCwKLSAgICAweDMyZjBkZTM3VUwsIDB4ZGM1ZjZiMjVVTCwgMHhiOTM4ZDc5ZFVMLCAweGVmMjhiNGM1VUwsIDB4OGE0ZjA4N2RVTCwKLSAgICAweDY0ZTBiZDZmVUwsIDB4MDE4NzAxZDdVTCwgMHhiOGJmZDY0YVVMLCAweGRkZDg2YWYyVUwsIDB4MzM3N2RmZTBVTCwKLSAgICAweDU2MTA2MzU4VUwsIDB4OWY1NzE5NTBVTCwgMHhmYTMwYTVlOFVMLCAweDE0OWYxMGZhVUwsIDB4NzFmOGFjNDJVTCwKLSAgICAweGM4YzA3YmRmVUwsIDB4YWRhN2M3NjdVTCwgMHg0MzA4NzI3NVVMLCAweDI2NmZjZWNkVUwsIDB4NzA3ZmFkOTVVTCwKLSAgICAweDE1MTgxMTJkVUwsIDB4ZmJiN2E0M2ZVTCwgMHg5ZWQwMTg4N1VMLCAweDI3ZThjZjFhVUwsIDB4NDI4ZjczYTJVTCwKLSAgICAweGFjMjBjNmIwVUwsIDB4Yzk0NzdhMDhVTCwgMHgzZWFmMzJhMFVMLCAweDViYzg4ZTE4VUwsIDB4YjU2NzNiMGFVTCwKLSAgICAweGQwMDA4N2IyVUwsIDB4NjkzODUwMmZVTCwgMHgwYzVmZWM5N1VMLCAweGUyZjA1OTg1VUwsIDB4ODc5N2U1M2RVTCwKLSAgICAweGQxODc4NjY1VUwsIDB4YjRlMDNhZGRVTCwgMHg1YTRmOGZjZlVMLCAweDNmMjgzMzc3VUwsIDB4ODYxMGU0ZWFVTCwKLSAgICAweGUzNzc1ODUyVUwsIDB4MGRkOGVkNDBVTCwgMHg2OGJmNTFmOFVMLCAweGExZjgyYmYwVUwsIDB4YzQ5Zjk3NDhVTCwKLSAgICAweDJhMzAyMjVhVUwsIDB4NGY1NzllZTJVTCwgMHhmNjZmNDk3ZlVMLCAweDkzMDhmNWM3VUwsIDB4N2RhNzQwZDVVTCwKLSAgICAweDE4YzBmYzZkVUwsIDB4NGVkMDlmMzVVTCwgMHgyYmI3MjM4ZFVMLCAweGM1MTg5NjlmVUwsIDB4YTA3ZjJhMjdVTCwKLSAgICAweDE5NDdmZGJhVUwsIDB4N2MyMDQxMDJVTCwgMHg5MjhmZjQxMFVMLCAweGY3ZTg0OGE4VUwsIDB4M2Q1ODE0OWJVTCwKLSAgICAweDU4M2ZhODIzVUwsIDB4YjY5MDFkMzFVTCwgMHhkM2Y3YTE4OVVMLCAweDZhY2Y3NjE0VUwsIDB4MGZhOGNhYWNVTCwKLSAgICAweGUxMDc3ZmJlVUwsIDB4ODQ2MGMzMDZVTCwgMHhkMjcwYTA1ZVVMLCAweGI3MTcxY2U2VUwsIDB4NTliOGE5ZjRVTCwKLSAgICAweDNjZGYxNTRjVUwsIDB4ODVlN2MyZDFVTCwgMHhlMDgwN2U2OVVMLCAweDBlMmZjYjdiVUwsIDB4NmI0ODc3YzNVTCwKLSAgICAweGEyMGYwZGNiVUwsIDB4Yzc2OGIxNzNVTCwgMHgyOWM3MDQ2MVVMLCAweDRjYTBiOGQ5VUwsIDB4ZjU5ODZmNDRVTCwKLSAgICAweDkwZmZkM2ZjVUwsIDB4N2U1MDY2ZWVVTCwgMHgxYjM3ZGE1NlVMLCAweDRkMjdiOTBlVUwsIDB4Mjg0MDA1YjZVTCwKLSAgICAweGM2ZWZiMGE0VUwsIDB4YTM4ODBjMWNVTCwgMHgxYWIwZGI4MVVMLCAweDdmZDc2NzM5VUwsIDB4OTE3OGQyMmJVTCwKLSAgICAweGY0MWY2ZTkzVUwsIDB4MDNmNzI2M2JVTCwgMHg2NjkwOWE4M1VMLCAweDg4M2YyZjkxVUwsIDB4ZWQ1ODkzMjlVTCwKLSAgICAweDU0NjA0NGI0VUwsIDB4MzEwN2Y4MGNVTCwgMHhkZmE4NGQxZVVMLCAweGJhY2ZmMWE2VUwsIDB4ZWNkZjkyZmVVTCwKLSAgICAweDg5YjgyZTQ2VUwsIDB4NjcxNzliNTRVTCwgMHgwMjcwMjdlY1VMLCAweGJiNDhmMDcxVUwsIDB4ZGUyZjRjYzlVTCwKLSAgICAweDMwODBmOWRiVUwsIDB4NTVlNzQ1NjNVTCwgMHg5Y2EwM2Y2YlVMLCAweGY5Yzc4M2QzVUwsIDB4MTc2ODM2YzFVTCwKLSAgICAweDcyMGY4YTc5VUwsIDB4Y2IzNzVkZTRVTCwgMHhhZTUwZTE1Y1VMLCAweDQwZmY1NDRlVUwsIDB4MjU5OGU4ZjZVTCwKLSAgICAweDczODg4YmFlVUwsIDB4MTZlZjM3MTZVTCwgMHhmODQwODIwNFVMLCAweDlkMjczZWJjVUwsIDB4MjQxZmU5MjFVTCwKLSAgICAweDQxNzg1NTk5VUwsIDB4YWZkN2UwOGJVTCwgMHhjYWIwNWMzM1VMLCAweDNiYjY1OWVkVUwsIDB4NWVkMWU1NTVVTCwKLSAgICAweGIwN2U1MDQ3VUwsIDB4ZDUxOWVjZmZVTCwgMHg2YzIxM2I2MlVMLCAweDA5NDY4N2RhVUwsIDB4ZTdlOTMyYzhVTCwKLSAgICAweDgyOGU4ZTcwVUwsIDB4ZDQ5ZWVkMjhVTCwgMHhiMWY5NTE5MFVMLCAweDVmNTZlNDgyVUwsIDB4M2EzMTU4M2FVTCwKLSAgICAweDgzMDk4ZmE3VUwsIDB4ZTY2ZTMzMWZVTCwgMHgwOGMxODYwZFVMLCAweDZkYTYzYWI1VUwsIDB4YTRlMTQwYmRVTCwKLSAgICAweGMxODZmYzA1VUwsIDB4MmYyOTQ5MTdVTCwgMHg0YTRlZjVhZlVMLCAweGYzNzYyMjMyVUwsIDB4OTYxMTllOGFVTCwKLSAgICAweDc4YmUyYjk4VUwsIDB4MWRkOTk3MjBVTCwgMHg0YmM5ZjQ3OFVMLCAweDJlYWU0OGMwVUwsIDB4YzAwMWZkZDJVTCwKLSAgICAweGE1NjY0MTZhVUwsIDB4MWM1ZTk2ZjdVTCwgMHg3OTM5MmE0ZlVMLCAweDk3OTY5ZjVkVUwsIDB4ZjJmMTIzZTVVTCwKLSAgICAweDA1MTk2YjRkVUwsIDB4NjA3ZWQ3ZjVVTCwgMHg4ZWQxNjJlN1VMLCAweGViYjZkZTVmVUwsIDB4NTI4ZTA5YzJVTCwKLSAgICAweDM3ZTliNTdhVUwsIDB4ZDk0NjAwNjhVTCwgMHhiYzIxYmNkMFVMLCAweGVhMzFkZjg4VUwsIDB4OGY1NjYzMzBVTCwKLSAgICAweDYxZjlkNjIyVUwsIDB4MDQ5ZTZhOWFVTCwgMHhiZGE2YmQwN1VMLCAweGQ4YzEwMWJmVUwsIDB4MzY2ZWI0YWRVTCwKLSAgICAweDUzMDkwODE1VUwsIDB4OWE0ZTcyMWRVTCwgMHhmZjI5Y2VhNVVMLCAweDExODY3YmI3VUwsIDB4NzRlMWM3MGZVTCwKLSAgICAweGNkZDkxMDkyVUwsIDB4YThiZWFjMmFVTCwgMHg0NjExMTkzOFVMLCAweDIzNzZhNTgwVUwsIDB4NzU2NmM2ZDhVTCwKLSAgICAweDEwMDE3YTYwVUwsIDB4ZmVhZWNmNzJVTCwgMHg5YmM5NzNjYVVMLCAweDIyZjFhNDU3VUwsIDB4NDc5NjE4ZWZVTCwKLSAgICAweGE5MzlhZGZkVUwsIDB4Y2M1ZTExNDVVTCwgMHgwNmVlNGQ3NlVMLCAweDYzODlmMWNlVUwsIDB4OGQyNjQ0ZGNVTCwKLSAgICAweGU4NDFmODY0VUwsIDB4NTE3OTJmZjlVTCwgMHgzNDFlOTM0MVVMLCAweGRhYjEyNjUzVUwsIDB4YmZkNjlhZWJVTCwKLSAgICAweGU5YzZmOWIzVUwsIDB4OGNhMTQ1MGJVTCwgMHg2MjBlZjAxOVVMLCAweDA3Njk0Y2ExVUwsIDB4YmU1MTliM2NVTCwKLSAgICAweGRiMzYyNzg0VUwsIDB4MzU5OTkyOTZVTCwgMHg1MGZlMmUyZVVMLCAweDk5Yjk1NDI2VUwsIDB4ZmNkZWU4OWVVTCwKLSAgICAweDEyNzE1ZDhjVUwsIDB4NzcxNmUxMzRVTCwgMHhjZTJlMzZhOVVMLCAweGFiNDk4YTExVUwsIDB4NDVlNjNmMDNVTCwKLSAgICAweDIwODE4M2JiVUwsIDB4NzY5MWUwZTNVTCwgMHgxM2Y2NWM1YlVMLCAweGZkNTllOTQ5VUwsIDB4OTgzZTU1ZjFVTCwKLSAgICAweDIxMDY4MjZjVUwsIDB4NDQ2MTNlZDRVTCwgMHhhYWNlOGJjNlVMLCAweGNmYTkzNzdlVUwsIDB4Mzg0MTdmZDZVTCwKLSAgICAweDVkMjZjMzZlVUwsIDB4YjM4OTc2N2NVTCwgMHhkNmVlY2FjNFVMLCAweDZmZDYxZDU5VUwsIDB4MGFiMWExZTFVTCwKLSAgICAweGU0MWUxNGYzVUwsIDB4ODE3OWE4NGJVTCwgMHhkNzY5Y2IxM1VMLCAweGIyMGU3N2FiVUwsIDB4NWNhMWMyYjlVTCwKLSAgICAweDM5YzY3ZTAxVUwsIDB4ODBmZWE5OWNVTCwgMHhlNTk5MTUyNFVMLCAweDBiMzZhMDM2VUwsIDB4NmU1MTFjOGVVTCwKLSAgICAweGE3MTY2Njg2VUwsIDB4YzI3MWRhM2VVTCwgMHgyY2RlNmYyY1VMLCAweDQ5YjlkMzk0VUwsIDB4ZjA4MTA0MDlVTCwKLSAgICAweDk1ZTZiOGIxVUwsIDB4N2I0OTBkYTNVTCwgMHgxZTJlYjExYlVMLCAweDQ4M2VkMjQzVUwsIDB4MmQ1OTZlZmJVTCwKLSAgICAweGMzZjZkYmU5VUwsIDB4YTY5MTY3NTFVTCwgMHgxZmE5YjBjY1VMLCAweDdhY2UwYzc0VUwsIDB4OTQ2MWI5NjZVTCwKLSAgICAweGYxMDYwNWRlVUwKLSNlbmRpZgotICB9Ci19OwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvemxpYl92MTI4L2RlZmxhdGUuYyBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9kZWZsYXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZmUyMzMuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvemxpYl92MTI4L2RlZmxhdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE5NjYgKzAsMCBAQAotLyogZGVmbGF0ZS5jIC0tIGNvbXByZXNzIGRhdGEgdXNpbmcgdGhlIGRlZmxhdGlvbiBhbGdvcml0aG0KLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKgotICogIEFMR09SSVRITQotICoKLSAqICAgICAgVGhlICJkZWZsYXRpb24iIHByb2Nlc3MgZGVwZW5kcyBvbiBiZWluZyBhYmxlIHRvIGlkZW50aWZ5IHBvcnRpb25zCi0gKiAgICAgIG9mIHRoZSBpbnB1dCB0ZXh0IHdoaWNoIGFyZSBpZGVudGljYWwgdG8gZWFybGllciBpbnB1dCAod2l0aGluIGEKLSAqICAgICAgc2xpZGluZyB3aW5kb3cgdHJhaWxpbmcgYmVoaW5kIHRoZSBpbnB1dCBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkKS4KLSAqCi0gKiAgICAgIFRoZSBtb3N0IHN0cmFpZ2h0Zm9yd2FyZCB0ZWNobmlxdWUgdHVybnMgb3V0IHRvIGJlIHRoZSBmYXN0ZXN0IGZvcgotICogICAgICBtb3N0IGlucHV0IGZpbGVzOiB0cnkgYWxsIHBvc3NpYmxlIG1hdGNoZXMgYW5kIHNlbGVjdCB0aGUgbG9uZ2VzdC4KLSAqICAgICAgVGhlIGtleSBmZWF0dXJlIG9mIHRoaXMgYWxnb3JpdGhtIGlzIHRoYXQgaW5zZXJ0aW9ucyBpbnRvIHRoZSBzdHJpbmcKLSAqICAgICAgZGljdGlvbmFyeSBhcmUgdmVyeSBzaW1wbGUgYW5kIHRodXMgZmFzdCwgYW5kIGRlbGV0aW9ucyBhcmUgYXZvaWRlZAotICogICAgICBjb21wbGV0ZWx5LiBJbnNlcnRpb25zIGFyZSBwZXJmb3JtZWQgYXQgZWFjaCBpbnB1dCBjaGFyYWN0ZXIsIHdoZXJlYXMKLSAqICAgICAgc3RyaW5nIG1hdGNoZXMgYXJlIHBlcmZvcm1lZCBvbmx5IHdoZW4gdGhlIHByZXZpb3VzIG1hdGNoIGVuZHMuIFNvIGl0Ci0gKiAgICAgIGlzIHByZWZlcmFibGUgdG8gc3BlbmQgbW9yZSB0aW1lIGluIG1hdGNoZXMgdG8gYWxsb3cgdmVyeSBmYXN0IHN0cmluZwotICogICAgICBpbnNlcnRpb25zIGFuZCBhdm9pZCBkZWxldGlvbnMuIFRoZSBtYXRjaGluZyBhbGdvcml0aG0gZm9yIHNtYWxsCi0gKiAgICAgIHN0cmluZ3MgaXMgaW5zcGlyZWQgZnJvbSB0aGF0IG9mIFJhYmluICYgS2FycC4gQSBicnV0ZSBmb3JjZSBhcHByb2FjaAotICogICAgICBpcyB1c2VkIHRvIGZpbmQgbG9uZ2VyIHN0cmluZ3Mgd2hlbiBhIHNtYWxsIG1hdGNoIGhhcyBiZWVuIGZvdW5kLgotICogICAgICBBIHNpbWlsYXIgYWxnb3JpdGhtIGlzIHVzZWQgaW4gY29taWMgKGJ5IEphbi1NYXJrIFdhbXMpIGFuZCBmcmVlemUKLSAqICAgICAgKGJ5IExlb25pZCBCcm91a2hpcykuCi0gKiAgICAgICAgIEEgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdXNlZCBhIG1vcmUgc29waGlzdGljYXRlZCBhbGdvcml0aG0KLSAqICAgICAgKGJ5IEZpYWxhIGFuZCBHcmVlbmUpIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gcnVuIGluIGxpbmVhciBhbW9ydGl6ZWQKLSAqICAgICAgdGltZSwgYnV0IGhhcyBhIGxhcmdlciBhdmVyYWdlIGNvc3QsIHVzZXMgbW9yZSBtZW1vcnkgYW5kIGlzIHBhdGVudGVkLgotICogICAgICBIb3dldmVyIHRoZSBGJkcgYWxnb3JpdGhtIG1heSBiZSBmYXN0ZXIgZm9yIHNvbWUgaGlnaGx5IHJlZHVuZGFudAotICogICAgICBmaWxlcyBpZiB0aGUgcGFyYW1ldGVyIG1heF9jaGFpbl9sZW5ndGggKGRlc2NyaWJlZCBiZWxvdykgaXMgdG9vIGxhcmdlLgotICoKLSAqICBBQ0tOT1dMRURHRU1FTlRTCi0gKgotICogICAgICBUaGUgaWRlYSBvZiBsYXp5IGV2YWx1YXRpb24gb2YgbWF0Y2hlcyBpcyBkdWUgdG8gSmFuLU1hcmsgV2FtcywgYW5kCi0gKiAgICAgIEkgZm91bmQgaXQgaW4gJ2ZyZWV6ZScgd3JpdHRlbiBieSBMZW9uaWQgQnJvdWtoaXMuCi0gKiAgICAgIFRoYW5rcyB0byBtYW55IHBlb3BsZSBmb3IgYnVnIHJlcG9ydHMgYW5kIHRlc3RpbmcuCi0gKgotICogIFJFRkVSRU5DRVMKLSAqCi0gKiAgICAgIERldXRzY2gsIEwuUC4sIkRFRkxBVEUgQ29tcHJlc3NlZCBEYXRhIEZvcm1hdCBTcGVjaWZpY2F0aW9uIi4KLSAqICAgICAgQXZhaWxhYmxlIGluIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzE5NTEKLSAqCi0gKiAgICAgIEEgZGVzY3JpcHRpb24gb2YgdGhlIFJhYmluIGFuZCBLYXJwIGFsZ29yaXRobSBpcyBnaXZlbiBpbiB0aGUgYm9vawotICogICAgICAgICAiQWxnb3JpdGhtcyIgYnkgUi4gU2VkZ2V3aWNrLCBBZGRpc29uLVdlc2xleSwgcDI1Mi4KLSAqCi0gKiAgICAgIEZpYWxhLEUuUi4sIGFuZCBHcmVlbmUsRC5ILgotICogICAgICAgICBEYXRhIENvbXByZXNzaW9uIHdpdGggRmluaXRlIFdpbmRvd3MsIENvbW0uQUNNLCAzMiw0ICgxOTg5KSA0OTAtNTk1Ci0gKgotICovCi0KLS8qIEAoIykgJElkJCAqLwotCi0jaW5jbHVkZSAiZGVmbGF0ZS5oIgotCi1jb25zdCBjaGFyIGRlZmxhdGVfY29weXJpZ2h0W10gPQotICAgIiBkZWZsYXRlIDEuMi44IENvcHlyaWdodCAxOTk1LTIwMTMgSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlciAiOwotLyoKLSAgSWYgeW91IHVzZSB0aGUgemxpYiBsaWJyYXJ5IGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaXMgd2VsY29tZQotICBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB5b3VyIHByb2R1Y3QuIElmIGZvciBzb21lIHJlYXNvbiB5b3UgY2Fubm90Ci0gIGluY2x1ZGUgc3VjaCBhbiBhY2tub3dsZWRnbWVudCwgSSB3b3VsZCBhcHByZWNpYXRlIHRoYXQgeW91IGtlZXAgdGhpcwotICBjb3B5cmlnaHQgc3RyaW5nIGluIHRoZSBleGVjdXRhYmxlIG9mIHlvdXIgcHJvZHVjdC4KLSAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqICBGdW5jdGlvbiBwcm90b3R5cGVzLgotICovCi10eXBlZGVmIGVudW0gewotICAgIG5lZWRfbW9yZSwgICAgICAvKiBibG9jayBub3QgY29tcGxldGVkLCBuZWVkIG1vcmUgaW5wdXQgb3IgbW9yZSBvdXRwdXQgKi8KLSAgICBibG9ja19kb25lLCAgICAgLyogYmxvY2sgZmx1c2ggcGVyZm9ybWVkICovCi0gICAgZmluaXNoX3N0YXJ0ZWQsIC8qIGZpbmlzaCBzdGFydGVkLCBuZWVkIG9ubHkgbW9yZSBvdXRwdXQgYXQgbmV4dCBkZWZsYXRlICovCi0gICAgZmluaXNoX2RvbmUgICAgIC8qIGZpbmlzaCBkb25lLCBhY2NlcHQgbm8gbW9yZSBpbnB1dCBvciBvdXRwdXQgKi8KLX0gYmxvY2tfc3RhdGU7Ci0KLXR5cGVkZWYgYmxvY2tfc3RhdGUgKCpjb21wcmVzc19mdW5jKSBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKSk7Ci0vKiBDb21wcmVzc2lvbiBmdW5jdGlvbi4gUmV0dXJucyB0aGUgYmxvY2sgc3RhdGUgYWZ0ZXIgdGhlIGNhbGwuICovCi0KLWxvY2FsIHZvaWQgZmlsbF93aW5kb3cgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKLWxvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfc3RvcmVkIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgZmx1c2gpKTsKLWxvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfZmFzdCAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgZmx1c2gpKTsKLSNpZm5kZWYgRkFTVEVTVAotbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9zbG93ICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGludCBmbHVzaCkpOwotI2VuZGlmCi1sb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX3JsZSAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKSk7Ci1sb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX2h1ZmYgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IGZsdXNoKSk7Ci1sb2NhbCB2b2lkIGxtX2luaXQgICAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Ci1sb2NhbCB2b2lkIHB1dFNob3J0TVNCICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCB1SW50IGIpKTsKLWxvY2FsIHZvaWQgZmx1c2hfcGVuZGluZyAgT0YoKHpfc3RyZWFtcCBzdHJtKSk7Ci1sb2NhbCBpbnQgcmVhZF9idWYgICAgICAgIE9GKCh6X3N0cmVhbXAgc3RybSwgQnl0ZWYgKmJ1ZiwgdW5zaWduZWQgc2l6ZSkpOwotI2lmZGVmIEFTTVYKLSAgICAgIHZvaWQgbWF0Y2hfaW5pdCBPRigodm9pZCkpOyAvKiBhc20gY29kZSBpbml0aWFsaXphdGlvbiAqLwotICAgICAgdUludCBsb25nZXN0X21hdGNoICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgSVBvcyBjdXJfbWF0Y2gpKTsKLSNlbHNlCi1sb2NhbCB1SW50IGxvbmdlc3RfbWF0Y2ggIE9GKChkZWZsYXRlX3N0YXRlICpzLCBJUG9zIGN1cl9tYXRjaCkpOwotI2VuZGlmCi0KLSNpZmRlZiBERUJVRwotbG9jYWwgIHZvaWQgY2hlY2tfbWF0Y2ggT0YoKGRlZmxhdGVfc3RhdGUgKnMsIElQb3Mgc3RhcnQsIElQb3MgbWF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkpOwotI2VuZGlmCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogTG9jYWwgZGF0YQotICovCi0KLSNkZWZpbmUgTklMIDAKLS8qIFRhaWwgb2YgaGFzaCBjaGFpbnMgKi8KLQotI2lmbmRlZiBUT09fRkFSCi0jICBkZWZpbmUgVE9PX0ZBUiA0MDk2Ci0jZW5kaWYKLS8qIE1hdGNoZXMgb2YgbGVuZ3RoIDMgYXJlIGRpc2NhcmRlZCBpZiB0aGVpciBkaXN0YW5jZSBleGNlZWRzIFRPT19GQVIgKi8KLQotLyogVmFsdWVzIGZvciBtYXhfbGF6eV9tYXRjaCwgZ29vZF9tYXRjaCBhbmQgbWF4X2NoYWluX2xlbmd0aCwgZGVwZW5kaW5nIG9uCi0gKiB0aGUgZGVzaXJlZCBwYWNrIGxldmVsICgwLi45KS4gVGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBoYXZlIGJlZW4gdHVuZWQgdG8KLSAqIGV4Y2x1ZGUgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBmb3IgcGF0aG9sb2dpY2FsIGZpbGVzLiBCZXR0ZXIgdmFsdWVzIG1heSBiZQotICogZm91bmQgZm9yIHNwZWNpZmljIGZpbGVzLgotICovCi10eXBlZGVmIHN0cnVjdCBjb25maWdfcyB7Ci0gICB1c2ggZ29vZF9sZW5ndGg7IC8qIHJlZHVjZSBsYXp5IHNlYXJjaCBhYm92ZSB0aGlzIG1hdGNoIGxlbmd0aCAqLwotICAgdXNoIG1heF9sYXp5OyAgICAvKiBkbyBub3QgcGVyZm9ybSBsYXp5IHNlYXJjaCBhYm92ZSB0aGlzIG1hdGNoIGxlbmd0aCAqLwotICAgdXNoIG5pY2VfbGVuZ3RoOyAvKiBxdWl0IHNlYXJjaCBhYm92ZSB0aGlzIG1hdGNoIGxlbmd0aCAqLwotICAgdXNoIG1heF9jaGFpbjsKLSAgIGNvbXByZXNzX2Z1bmMgZnVuYzsKLX0gY29uZmlnOwotCi0jaWZkZWYgRkFTVEVTVAotbG9jYWwgY29uc3QgY29uZmlnIGNvbmZpZ3VyYXRpb25fdGFibGVbMl0gPSB7Ci0vKiAgICAgIGdvb2QgbGF6eSBuaWNlIGNoYWluICovCi0vKiAwICovIHswLCAgICAwLCAgMCwgICAgMCwgZGVmbGF0ZV9zdG9yZWR9LCAgLyogc3RvcmUgb25seSAqLwotLyogMSAqLyB7NCwgICAgNCwgIDgsICAgIDQsIGRlZmxhdGVfZmFzdH19OyAvKiBtYXggc3BlZWQsIG5vIGxhenkgbWF0Y2hlcyAqLwotI2Vsc2UKLWxvY2FsIGNvbnN0IGNvbmZpZyBjb25maWd1cmF0aW9uX3RhYmxlWzEwXSA9IHsKLS8qICAgICAgZ29vZCBsYXp5IG5pY2UgY2hhaW4gKi8KLS8qIDAgKi8gezAsICAgIDAsICAwLCAgICAwLCBkZWZsYXRlX3N0b3JlZH0sICAvKiBzdG9yZSBvbmx5ICovCi0vKiAxICovIHs0LCAgICA0LCAgOCwgICAgNCwgZGVmbGF0ZV9mYXN0fSwgLyogbWF4IHNwZWVkLCBubyBsYXp5IG1hdGNoZXMgKi8KLS8qIDIgKi8gezQsICAgIDUsIDE2LCAgICA4LCBkZWZsYXRlX2Zhc3R9LAotLyogMyAqLyB7NCwgICAgNiwgMzIsICAgMzIsIGRlZmxhdGVfZmFzdH0sCi0KLS8qIDQgKi8gezQsICAgIDQsIDE2LCAgIDE2LCBkZWZsYXRlX3Nsb3d9LCAgLyogbGF6eSBtYXRjaGVzICovCi0vKiA1ICovIHs4LCAgIDE2LCAzMiwgICAzMiwgZGVmbGF0ZV9zbG93fSwKLS8qIDYgKi8gezgsICAgMTYsIDEyOCwgMTI4LCBkZWZsYXRlX3Nsb3d9LAotLyogNyAqLyB7OCwgICAzMiwgMTI4LCAyNTYsIGRlZmxhdGVfc2xvd30sCi0vKiA4ICovIHszMiwgMTI4LCAyNTgsIDEwMjQsIGRlZmxhdGVfc2xvd30sCi0vKiA5ICovIHszMiwgMjU4LCAyNTgsIDQwOTYsIGRlZmxhdGVfc2xvd319OyAvKiBtYXggY29tcHJlc3Npb24gKi8KLSNlbmRpZgotCi0vKiBOb3RlOiB0aGUgZGVmbGF0ZSgpIGNvZGUgcmVxdWlyZXMgbWF4X2xhenkgPj0gTUlOX01BVENIIGFuZCBtYXhfY2hhaW4gPj0gNAotICogRm9yIGRlZmxhdGVfZmFzdCgpIChsZXZlbHMgPD0gMykgZ29vZCBpcyBpZ25vcmVkIGFuZCBsYXp5IGhhcyBhIGRpZmZlcmVudAotICogbWVhbmluZy4KLSAqLwotCi0jZGVmaW5lIEVRVUFMIDAKLS8qIHJlc3VsdCBvZiBtZW1jbXAgZm9yIGVxdWFsIHN0cmluZ3MgKi8KLQotI2lmbmRlZiBOT19EVU1NWV9ERUNMCi1zdHJ1Y3Qgc3RhdGljX3RyZWVfZGVzY19zIHtpbnQgZHVtbXk7fTsgLyogZm9yIGJ1Z2d5IGNvbXBpbGVycyAqLwotI2VuZGlmCi0KLS8qIHJhbmsgWl9CTE9DSyBiZXR3ZWVuIFpfTk9fRkxVU0ggYW5kIFpfUEFSVElBTF9GTFVTSCAqLwotI2RlZmluZSBSQU5LKGYpICgoKGYpIDw8IDEpIC0gKChmKSA+IDQgPyA5IDogMCkpCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogVXBkYXRlIGEgaGFzaCB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBpbnB1dCBieXRlCi0gKiBJTiAgYXNzZXJ0aW9uOiBhbGwgY2FsbHMgdG8gdG8gVVBEQVRFX0hBU0ggYXJlIG1hZGUgd2l0aCBjb25zZWN1dGl2ZQotICogICAgaW5wdXQgY2hhcmFjdGVycywgc28gdGhhdCBhIHJ1bm5pbmcgaGFzaCBrZXkgY2FuIGJlIGNvbXB1dGVkIGZyb20gdGhlCi0gKiAgICBwcmV2aW91cyBrZXkgaW5zdGVhZCBvZiBjb21wbGV0ZSByZWNhbGN1bGF0aW9uIGVhY2ggdGltZS4KLSAqLwotI2RlZmluZSBVUERBVEVfSEFTSChzLGgsYykgKGggPSAoKChoKTw8cy0+aGFzaF9zaGlmdCkgXiAoYykpICYgcy0+aGFzaF9tYXNrKQotCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogSW5zZXJ0IHN0cmluZyBzdHIgaW4gdGhlIGRpY3Rpb25hcnkgYW5kIHNldCBtYXRjaF9oZWFkIHRvIHRoZSBwcmV2aW91cyBoZWFkCi0gKiBvZiB0aGUgaGFzaCBjaGFpbiAodGhlIG1vc3QgcmVjZW50IHN0cmluZyB3aXRoIHNhbWUgaGFzaCBrZXkpLiBSZXR1cm4KLSAqIHRoZSBwcmV2aW91cyBsZW5ndGggb2YgdGhlIGhhc2ggY2hhaW4uCi0gKiBJZiB0aGlzIGZpbGUgaXMgY29tcGlsZWQgd2l0aCAtREZBU1RFU1QsIHRoZSBjb21wcmVzc2lvbiBsZXZlbCBpcyBmb3JjZWQKLSAqIHRvIDEsIGFuZCBubyBoYXNoIGNoYWlucyBhcmUgbWFpbnRhaW5lZC4KLSAqIElOICBhc3NlcnRpb246IGFsbCBjYWxscyB0byB0byBJTlNFUlRfU1RSSU5HIGFyZSBtYWRlIHdpdGggY29uc2VjdXRpdmUKLSAqICAgIGlucHV0IGNoYXJhY3RlcnMgYW5kIHRoZSBmaXJzdCBNSU5fTUFUQ0ggYnl0ZXMgb2Ygc3RyIGFyZSB2YWxpZAotICogICAgKGV4Y2VwdCBmb3IgdGhlIGxhc3QgTUlOX01BVENILTEgYnl0ZXMgb2YgdGhlIGlucHV0IGZpbGUpLgotICovCi0jaWZkZWYgRkFTVEVTVAotI2RlZmluZSBJTlNFUlRfU1RSSU5HKHMsIHN0ciwgbWF0Y2hfaGVhZCkgXAotICAgKFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbKHN0cikgKyAoTUlOX01BVENILTEpXSksIFwKLSAgICBtYXRjaF9oZWFkID0gcy0+aGVhZFtzLT5pbnNfaF0sIFwKLSAgICBzLT5oZWFkW3MtPmluc19oXSA9IChQb3MpKHN0cikpCi0jZWxzZQotI2RlZmluZSBJTlNFUlRfU1RSSU5HKHMsIHN0ciwgbWF0Y2hfaGVhZCkgXAotICAgKFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbKHN0cikgKyAoTUlOX01BVENILTEpXSksIFwKLSAgICBtYXRjaF9oZWFkID0gcy0+cHJldlsoc3RyKSAmIHMtPndfbWFza10gPSBzLT5oZWFkW3MtPmluc19oXSwgXAotICAgIHMtPmhlYWRbcy0+aW5zX2hdID0gKFBvcykoc3RyKSkKLSNlbmRpZgotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEluaXRpYWxpemUgdGhlIGhhc2ggdGFibGUgKGF2b2lkaW5nIDY0SyBvdmVyZmxvdyBmb3IgMTYgYml0IHN5c3RlbXMpLgotICogcHJldltdIHdpbGwgYmUgaW5pdGlhbGl6ZWQgb24gdGhlIGZseS4KLSAqLwotI2RlZmluZSBDTEVBUl9IQVNIKHMpIFwKLSAgICBzLT5oZWFkW3MtPmhhc2hfc2l6ZS0xXSA9IE5JTDsgXAotICAgIHptZW16ZXJvKChCeXRlZiAqKXMtPmhlYWQsICh1bnNpZ25lZCkocy0+aGFzaF9zaXplLTEpKnNpemVvZigqcy0+aGVhZCkpOwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQgWkVYUE9SVCBkZWZsYXRlSW5pdF8oCi0gICAgel9zdHJlYW1wIHN0cm0sCi0gICAgaW50IGxldmVsLAotICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sCi0gICAgaW50IHN0cmVhbV9zaXplKQotewotICAgIHJldHVybiBkZWZsYXRlSW5pdDJfKHN0cm0sIGxldmVsLCBaX0RFRkxBVEVELCBNQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgWl9ERUZBVUxUX1NUUkFURUdZLCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSk7Ci0gICAgLyogVG8gZG86IGlnbm9yZSBzdHJtLT5uZXh0X2luIGlmIHdlIHVzZSBpdCBhcyB3aW5kb3cgKi8KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotaW50IFpFWFBPUlQgZGVmbGF0ZUluaXQyXygKLSAgICB6X3N0cmVhbXAgc3RybSwKLSAgICBpbnQgIGxldmVsLAotICAgIGludCAgbWV0aG9kLAotICAgIGludCAgd2luZG93Qml0cywKLSAgICBpbnQgIG1lbUxldmVsLAotICAgIGludCAgc3RyYXRlZ3ksCi0gICAgY29uc3QgY2hhciAqdmVyc2lvbiwKLSAgICBpbnQgc3RyZWFtX3NpemUpCi17Ci0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLSAgICBpbnQgd3JhcCA9IDE7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgbXlfdmVyc2lvbltdID0gWkxJQl9WRVJTSU9OOwotCi0gICAgdXNoZiAqb3ZlcmxheTsKLSAgICAvKiBXZSBvdmVybGF5IHBlbmRpbmdfYnVmIGFuZCBkX2J1ZitsX2J1Zi4gVGhpcyB3b3JrcyBzaW5jZSB0aGUgYXZlcmFnZQotICAgICAqIG91dHB1dCBzaXplIGZvciAobGVuZ3RoLGRpc3RhbmNlKSBjb2RlcyBpcyA8PSAyNCBiaXRzLgotICAgICAqLwotCi0gICAgaWYgKHZlcnNpb24gPT0gWl9OVUxMIHx8IHZlcnNpb25bMF0gIT0gbXlfdmVyc2lvblswXSB8fAotICAgICAgICBzdHJlYW1fc2l6ZSAhPSBzaXplb2Yoel9zdHJlYW0pKSB7Ci0gICAgICAgIHJldHVybiBaX1ZFUlNJT05fRVJST1I7Ci0gICAgfQotICAgIGlmIChzdHJtID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotCi0gICAgc3RybS0+bXNnID0gWl9OVUxMOwotICAgIGlmIChzdHJtLT56YWxsb2MgPT0gKGFsbG9jX2Z1bmMpMCkgewotI2lmZGVmIFpfU09MTwotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0jZWxzZQotICAgICAgICBzdHJtLT56YWxsb2MgPSB6Y2FsbG9jOwotICAgICAgICBzdHJtLT5vcGFxdWUgPSAodm9pZHBmKTA7Ci0jZW5kaWYKLSAgICB9Ci0gICAgaWYgKHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCkKLSNpZmRlZiBaX1NPTE8KLSAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotI2Vsc2UKLSAgICAgICAgc3RybS0+emZyZWUgPSB6Y2ZyZWU7Ci0jZW5kaWYKLQotI2lmZGVmIEZBU1RFU1QKLSAgICBpZiAobGV2ZWwgIT0gMCkgbGV2ZWwgPSAxOwotI2Vsc2UKLSAgICBpZiAobGV2ZWwgPT0gWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSBsZXZlbCA9IDY7Ci0jZW5kaWYKLQotICAgIGlmICh3aW5kb3dCaXRzIDwgMCkgeyAvKiBzdXBwcmVzcyB6bGliIHdyYXBwZXIgKi8KLSAgICAgICAgd3JhcCA9IDA7Ci0gICAgICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0czsKLSAgICB9Ci0jaWZkZWYgR1pJUAotICAgIGVsc2UgaWYgKHdpbmRvd0JpdHMgPiAxNSkgewotICAgICAgICB3cmFwID0gMjsgICAgICAgLyogd3JpdGUgZ3ppcCB3cmFwcGVyIGluc3RlYWQgKi8KLSAgICAgICAgd2luZG93Qml0cyAtPSAxNjsKLSAgICB9Ci0jZW5kaWYKLSAgICBpZiAobWVtTGV2ZWwgPCAxIHx8IG1lbUxldmVsID4gTUFYX01FTV9MRVZFTCB8fCBtZXRob2QgIT0gWl9ERUZMQVRFRCB8fAotICAgICAgICB3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUgfHwgbGV2ZWwgPCAwIHx8IGxldmVsID4gOSB8fAotICAgICAgICBzdHJhdGVneSA8IDAgfHwgc3RyYXRlZ3kgPiBaX0ZJWEVEKSB7Ci0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICB9Ci0gICAgaWYgKHdpbmRvd0JpdHMgPT0gOCkgd2luZG93Qml0cyA9IDk7ICAvKiB1bnRpbCAyNTYtYnl0ZSB3aW5kb3cgYnVnIGZpeGVkICovCi0gICAgcyA9IChkZWZsYXRlX3N0YXRlICopIFpBTExPQyhzdHJtLCAxLCBzaXplb2YoZGVmbGF0ZV9zdGF0ZSkpOwotICAgIGlmIChzID09IFpfTlVMTCkgcmV0dXJuIFpfTUVNX0VSUk9SOwotICAgIHN0cm0tPnN0YXRlID0gKHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSBGQVIgKilzOwotICAgIHMtPnN0cm0gPSBzdHJtOwotCi0gICAgcy0+d3JhcCA9IHdyYXA7Ci0gICAgcy0+Z3poZWFkID0gWl9OVUxMOwotICAgIHMtPndfYml0cyA9IHdpbmRvd0JpdHM7Ci0gICAgcy0+d19zaXplID0gMSA8PCBzLT53X2JpdHM7Ci0gICAgcy0+d19tYXNrID0gcy0+d19zaXplIC0gMTsKLQotICAgIHMtPmhhc2hfYml0cyA9IG1lbUxldmVsICsgNzsKLSAgICBzLT5oYXNoX3NpemUgPSAxIDw8IHMtPmhhc2hfYml0czsKLSAgICBzLT5oYXNoX21hc2sgPSBzLT5oYXNoX3NpemUgLSAxOwotICAgIHMtPmhhc2hfc2hpZnQgPSAgKChzLT5oYXNoX2JpdHMrTUlOX01BVENILTEpL01JTl9NQVRDSCk7Ci0KLSAgICBzLT53aW5kb3cgPSAoQnl0ZWYgKikgWkFMTE9DKHN0cm0sIHMtPndfc2l6ZSwgMipzaXplb2YoQnl0ZSkpOwotICAgIHMtPnByZXYgICA9IChQb3NmICopICBaQUxMT0Moc3RybSwgcy0+d19zaXplLCBzaXplb2YoUG9zKSk7Ci0gICAgcy0+aGVhZCAgID0gKFBvc2YgKikgIFpBTExPQyhzdHJtLCBzLT5oYXNoX3NpemUsIHNpemVvZihQb3MpKTsKLQotICAgIHMtPmhpZ2hfd2F0ZXIgPSAwOyAgICAgIC8qIG5vdGhpbmcgd3JpdHRlbiB0byBzLT53aW5kb3cgeWV0ICovCi0KLSAgICBzLT5saXRfYnVmc2l6ZSA9IDEgPDwgKG1lbUxldmVsICsgNik7IC8qIDE2SyBlbGVtZW50cyBieSBkZWZhdWx0ICovCi0KLSAgICBvdmVybGF5ID0gKHVzaGYgKikgWkFMTE9DKHN0cm0sIHMtPmxpdF9idWZzaXplLCBzaXplb2YodXNoKSsyKTsKLSAgICBzLT5wZW5kaW5nX2J1ZiA9ICh1Y2hmICopIG92ZXJsYXk7Ci0gICAgcy0+cGVuZGluZ19idWZfc2l6ZSA9ICh1bGcpcy0+bGl0X2J1ZnNpemUgKiAoc2l6ZW9mKHVzaCkrMkwpOwotCi0gICAgaWYgKHMtPndpbmRvdyA9PSBaX05VTEwgfHwgcy0+cHJldiA9PSBaX05VTEwgfHwgcy0+aGVhZCA9PSBaX05VTEwgfHwKLSAgICAgICAgcy0+cGVuZGluZ19idWYgPT0gWl9OVUxMKSB7Ci0gICAgICAgIHMtPnN0YXR1cyA9IEZJTklTSF9TVEFURTsKLSAgICAgICAgc3RybS0+bXNnID0gRVJSX01TRyhaX01FTV9FUlJPUik7Ci0gICAgICAgIGRlZmxhdGVFbmQgKHN0cm0pOwotICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7Ci0gICAgfQotICAgIHMtPmRfYnVmID0gb3ZlcmxheSArIHMtPmxpdF9idWZzaXplL3NpemVvZih1c2gpOwotICAgIHMtPmxfYnVmID0gcy0+cGVuZGluZ19idWYgKyAoMStzaXplb2YodXNoKSkqcy0+bGl0X2J1ZnNpemU7Ci0KLSAgICBzLT5sZXZlbCA9IGxldmVsOwotICAgIHMtPnN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0gICAgcy0+bWV0aG9kID0gKEJ5dGUpbWV0aG9kOwotCi0gICAgcmV0dXJuIGRlZmxhdGVSZXNldChzdHJtKTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotaW50IFpFWFBPUlQgZGVmbGF0ZVNldERpY3Rpb25hcnkgKAotICAgIHpfc3RyZWFtcCBzdHJtLAotICAgIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5LAotICAgIHVJbnQgIGRpY3RMZW5ndGgpCi17Ci0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLSAgICB1SW50IHN0ciwgbjsKLSAgICBpbnQgd3JhcDsKLSAgICB1bnNpZ25lZCBhdmFpbDsKLSAgICB6X2NvbnN0IHVuc2lnbmVkIGNoYXIgKm5leHQ7Ci0KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMIHx8IGRpY3Rpb25hcnkgPT0gWl9OVUxMKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgcyA9IHN0cm0tPnN0YXRlOwotICAgIHdyYXAgPSBzLT53cmFwOwotICAgIGlmICh3cmFwID09IDIgfHwgKHdyYXAgPT0gMSAmJiBzLT5zdGF0dXMgIT0gSU5JVF9TVEFURSkgfHwgcy0+bG9va2FoZWFkKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0KLSAgICAvKiB3aGVuIHVzaW5nIHpsaWIgd3JhcHBlcnMsIGNvbXB1dGUgQWRsZXItMzIgZm9yIHByb3ZpZGVkIGRpY3Rpb25hcnkgKi8KLSAgICBpZiAod3JhcCA9PSAxKQotICAgICAgICBzdHJtLT5hZGxlciA9IGFkbGVyMzIoc3RybS0+YWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOwotICAgIHMtPndyYXAgPSAwOyAgICAgICAgICAgICAgICAgICAgLyogYXZvaWQgY29tcHV0aW5nIEFkbGVyLTMyIGluIHJlYWRfYnVmICovCi0KLSAgICAvKiBpZiBkaWN0aW9uYXJ5IHdvdWxkIGZpbGwgd2luZG93LCBqdXN0IHJlcGxhY2UgdGhlIGhpc3RvcnkgKi8KLSAgICBpZiAoZGljdExlbmd0aCA+PSBzLT53X3NpemUpIHsKLSAgICAgICAgaWYgKHdyYXAgPT0gMCkgeyAgICAgICAgICAgIC8qIGFscmVhZHkgZW1wdHkgb3RoZXJ3aXNlICovCi0gICAgICAgICAgICBDTEVBUl9IQVNIKHMpOwotICAgICAgICAgICAgcy0+c3Ryc3RhcnQgPSAwOwotICAgICAgICAgICAgcy0+YmxvY2tfc3RhcnQgPSAwTDsKLSAgICAgICAgICAgIHMtPmluc2VydCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZGljdGlvbmFyeSArPSBkaWN0TGVuZ3RoIC0gcy0+d19zaXplOyAgLyogdXNlIHRoZSB0YWlsICovCi0gICAgICAgIGRpY3RMZW5ndGggPSBzLT53X3NpemU7Ci0gICAgfQotCi0gICAgLyogaW5zZXJ0IGRpY3Rpb25hcnkgaW50byB3aW5kb3cgYW5kIGhhc2ggKi8KLSAgICBhdmFpbCA9IHN0cm0tPmF2YWlsX2luOwotICAgIG5leHQgPSBzdHJtLT5uZXh0X2luOwotICAgIHN0cm0tPmF2YWlsX2luID0gZGljdExlbmd0aDsKLSAgICBzdHJtLT5uZXh0X2luID0gKHpfY29uc3QgQnl0ZWYgKilkaWN0aW9uYXJ5OwotICAgIGZpbGxfd2luZG93KHMpOwotICAgIHdoaWxlIChzLT5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7Ci0gICAgICAgIHN0ciA9IHMtPnN0cnN0YXJ0OwotICAgICAgICBuID0gcy0+bG9va2FoZWFkIC0gKE1JTl9NQVRDSC0xKTsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOwotI2lmbmRlZiBGQVNURVNUCi0gICAgICAgICAgICBzLT5wcmV2W3N0ciAmIHMtPndfbWFza10gPSBzLT5oZWFkW3MtPmluc19oXTsKLSNlbmRpZgotICAgICAgICAgICAgcy0+aGVhZFtzLT5pbnNfaF0gPSAoUG9zKXN0cjsKLSAgICAgICAgICAgIHN0cisrOwotICAgICAgICB9IHdoaWxlICgtLW4pOwotICAgICAgICBzLT5zdHJzdGFydCA9IHN0cjsKLSAgICAgICAgcy0+bG9va2FoZWFkID0gTUlOX01BVENILTE7Ci0gICAgICAgIGZpbGxfd2luZG93KHMpOwotICAgIH0KLSAgICBzLT5zdHJzdGFydCArPSBzLT5sb29rYWhlYWQ7Ci0gICAgcy0+YmxvY2tfc3RhcnQgPSAobG9uZylzLT5zdHJzdGFydDsKLSAgICBzLT5pbnNlcnQgPSBzLT5sb29rYWhlYWQ7Ci0gICAgcy0+bG9va2FoZWFkID0gMDsKLSAgICBzLT5tYXRjaF9sZW5ndGggPSBzLT5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSC0xOwotICAgIHMtPm1hdGNoX2F2YWlsYWJsZSA9IDA7Ci0gICAgc3RybS0+bmV4dF9pbiA9IG5leHQ7Ci0gICAgc3RybS0+YXZhaWxfaW4gPSBhdmFpbDsKLSAgICBzLT53cmFwID0gd3JhcDsKLSAgICByZXR1cm4gWl9PSzsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotaW50IFpFWFBPUlQgZGVmbGF0ZVJlc2V0S2VlcCAoCi0gICAgel9zdHJlYW1wIHN0cm0pCi17Ci0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLQotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwgfHwKLSAgICAgICAgc3RybS0+emFsbG9jID09IChhbGxvY19mdW5jKTAgfHwgc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKSB7Ci0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICB9Ci0KLSAgICBzdHJtLT50b3RhbF9pbiA9IHN0cm0tPnRvdGFsX291dCA9IDA7Ci0gICAgc3RybS0+bXNnID0gWl9OVUxMOyAvKiB1c2UgemZyZWUgaWYgd2UgZXZlciBhbGxvY2F0ZSBtc2cgZHluYW1pY2FsbHkgKi8KLSAgICBzdHJtLT5kYXRhX3R5cGUgPSBaX1VOS05PV047Ci0KLSAgICBzID0gKGRlZmxhdGVfc3RhdGUgKilzdHJtLT5zdGF0ZTsKLSAgICBzLT5wZW5kaW5nID0gMDsKLSAgICBzLT5wZW5kaW5nX291dCA9IHMtPnBlbmRpbmdfYnVmOwotCi0gICAgaWYgKHMtPndyYXAgPCAwKSB7Ci0gICAgICAgIHMtPndyYXAgPSAtcy0+d3JhcDsgLyogd2FzIG1hZGUgbmVnYXRpdmUgYnkgZGVmbGF0ZSguLi4sIFpfRklOSVNIKTsgKi8KLSAgICB9Ci0gICAgcy0+c3RhdHVzID0gcy0+d3JhcCA/IElOSVRfU1RBVEUgOiBCVVNZX1NUQVRFOwotICAgIHN0cm0tPmFkbGVyID0KLSNpZmRlZiBHWklQCi0gICAgICAgIHMtPndyYXAgPT0gMiA/IGNyYzMyKDBMLCBaX05VTEwsIDApIDoKLSNlbmRpZgotICAgICAgICBhZGxlcjMyKDBMLCBaX05VTEwsIDApOwotICAgIHMtPmxhc3RfZmx1c2ggPSBaX05PX0ZMVVNIOwotCi0gICAgX3RyX2luaXQocyk7Ci0KLSAgICByZXR1cm4gWl9PSzsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotaW50IFpFWFBPUlQgZGVmbGF0ZVJlc2V0ICgKLSAgICB6X3N0cmVhbXAgc3RybSkKLXsKLSAgICBpbnQgcmV0OwotCi0gICAgcmV0ID0gZGVmbGF0ZVJlc2V0S2VlcChzdHJtKTsKLSAgICBpZiAocmV0ID09IFpfT0spCi0gICAgICAgIGxtX2luaXQoc3RybS0+c3RhdGUpOwotICAgIHJldHVybiByZXQ7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLWludCBaRVhQT1JUIGRlZmxhdGVTZXRIZWFkZXIgKHN0cm0sIGhlYWQpCi0gICAgel9zdHJlYW1wIHN0cm07Ci0gICAgZ3pfaGVhZGVycCBoZWFkOwotewotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBpZiAoc3RybS0+c3RhdGUtPndyYXAgIT0gMikgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIHN0cm0tPnN0YXRlLT5nemhlYWQgPSBoZWFkOwotICAgIHJldHVybiBaX09LOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQgWkVYUE9SVCBkZWZsYXRlUGVuZGluZyAoCi0Jel9zdHJlYW1wIHN0cm0sCi0gICAgdW5zaWduZWQgKnBlbmRpbmcsCi0gICAgaW50ICpiaXRzKQotewotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBpZiAocGVuZGluZyAhPSBaX05VTEwpCi0gICAgICAgICpwZW5kaW5nID0gc3RybS0+c3RhdGUtPnBlbmRpbmc7Ci0gICAgaWYgKGJpdHMgIT0gWl9OVUxMKQotICAgICAgICAqYml0cyA9IHN0cm0tPnN0YXRlLT5iaV92YWxpZDsKLSAgICByZXR1cm4gWl9PSzsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotaW50IFpFWFBPUlQgZGVmbGF0ZVByaW1lIChzdHJtLCBiaXRzLCB2YWx1ZSkKLSAgICB6X3N0cmVhbXAgc3RybTsKLSAgICBpbnQgYml0czsKLSAgICBpbnQgdmFsdWU7Ci17Ci0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLSAgICBpbnQgcHV0OwotCi0gICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIHMgPSBzdHJtLT5zdGF0ZTsKLSAgICBpZiAoKEJ5dGVmICopKHMtPmRfYnVmKSA8IHMtPnBlbmRpbmdfb3V0ICsgKChCdWZfc2l6ZSArIDcpID4+IDMpKQotICAgICAgICByZXR1cm4gWl9CVUZfRVJST1I7Ci0gICAgZG8gewotICAgICAgICBwdXQgPSBCdWZfc2l6ZSAtIHMtPmJpX3ZhbGlkOwotICAgICAgICBpZiAocHV0ID4gYml0cykKLSAgICAgICAgICAgIHB1dCA9IGJpdHM7Ci0gICAgICAgIHMtPmJpX2J1ZiB8PSAodXNoKSgodmFsdWUgJiAoKDEgPDwgcHV0KSAtIDEpKSA8PCBzLT5iaV92YWxpZCk7Ci0gICAgICAgIHMtPmJpX3ZhbGlkICs9IHB1dDsKLSAgICAgICAgX3RyX2ZsdXNoX2JpdHMocyk7Ci0gICAgICAgIHZhbHVlID4+PSBwdXQ7Ci0gICAgICAgIGJpdHMgLT0gcHV0OwotICAgIH0gd2hpbGUgKGJpdHMpOwotICAgIHJldHVybiBaX09LOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQgWkVYUE9SVCBkZWZsYXRlUGFyYW1zKAotICAgIHpfc3RyZWFtcCBzdHJtLAotICAgIGludCBsZXZlbCwKLSAgICBpbnQgc3RyYXRlZ3kpCi17Ci0gICAgZGVmbGF0ZV9zdGF0ZSAqczsKLSAgICBjb21wcmVzc19mdW5jIGZ1bmM7Ci0gICAgaW50IGVyciA9IFpfT0s7Ci0KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgcyA9IHN0cm0tPnN0YXRlOwotCi0jaWZkZWYgRkFTVEVTVAotICAgIGlmIChsZXZlbCAhPSAwKSBsZXZlbCA9IDE7Ci0jZWxzZQotICAgIGlmIChsZXZlbCA9PSBaX0RFRkFVTFRfQ09NUFJFU1NJT04pIGxldmVsID0gNjsKLSNlbmRpZgotICAgIGlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPiA5IHx8IHN0cmF0ZWd5IDwgMCB8fCBzdHJhdGVneSA+IFpfRklYRUQpIHsKLSAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIH0KLSAgICBmdW5jID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0uZnVuYzsKLQotICAgIGlmICgoc3RyYXRlZ3kgIT0gcy0+c3RyYXRlZ3kgfHwgZnVuYyAhPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5mdW5jKSAmJgotICAgICAgICBzdHJtLT50b3RhbF9pbiAhPSAwKSB7Ci0gICAgICAgIC8qIEZsdXNoIHRoZSBsYXN0IGJ1ZmZlcjogKi8KLSAgICAgICAgZXJyID0gZGVmbGF0ZShzdHJtLCBaX0JMT0NLKTsKLSAgICAgICAgaWYgKGVyciA9PSBaX0JVRl9FUlJPUiAmJiBzLT5wZW5kaW5nID09IDApCi0gICAgICAgICAgICBlcnIgPSBaX09LOwotICAgIH0KLSAgICBpZiAocy0+bGV2ZWwgIT0gbGV2ZWwpIHsKLSAgICAgICAgcy0+bGV2ZWwgPSBsZXZlbDsKLSAgICAgICAgcy0+bWF4X2xhenlfbWF0Y2ggICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLm1heF9sYXp5OwotICAgICAgICBzLT5nb29kX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtsZXZlbF0uZ29vZF9sZW5ndGg7Ci0gICAgICAgIHMtPm5pY2VfbWF0Y2ggICAgICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW2xldmVsXS5uaWNlX2xlbmd0aDsKLSAgICAgICAgcy0+bWF4X2NoYWluX2xlbmd0aCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbbGV2ZWxdLm1heF9jaGFpbjsKLSAgICB9Ci0gICAgcy0+c3RyYXRlZ3kgPSBzdHJhdGVneTsKLSAgICByZXR1cm4gZXJyOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQgWkVYUE9SVCBkZWZsYXRlVHVuZSgKLSAgICB6X3N0cmVhbXAgc3RybSwKLSAgICBpbnQgZ29vZF9sZW5ndGgsCi0gICAgaW50IG1heF9sYXp5LAotICAgIGludCBuaWNlX2xlbmd0aCwKLSAgICBpbnQgbWF4X2NoYWluKQotewotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgcyA9IHN0cm0tPnN0YXRlOwotICAgIHMtPmdvb2RfbWF0Y2ggPSBnb29kX2xlbmd0aDsKLSAgICBzLT5tYXhfbGF6eV9tYXRjaCA9IG1heF9sYXp5OwotICAgIHMtPm5pY2VfbWF0Y2ggPSBuaWNlX2xlbmd0aDsKLSAgICBzLT5tYXhfY2hhaW5fbGVuZ3RoID0gbWF4X2NoYWluOwotICAgIHJldHVybiBaX09LOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBGb3IgdGhlIGRlZmF1bHQgd2luZG93Qml0cyBvZiAxNSBhbmQgbWVtTGV2ZWwgb2YgOCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zCi0gKiBhIGNsb3NlIHRvIGV4YWN0LCBhcyB3ZWxsIGFzIHNtYWxsLCB1cHBlciBib3VuZCBvbiB0aGUgY29tcHJlc3NlZCBzaXplLgotICogVGhleSBhcmUgY29kZWQgYXMgY29uc3RhbnRzIGhlcmUgZm9yIGEgcmVhc29uLS1pZiB0aGUgI2RlZmluZSdzIGFyZQotICogY2hhbmdlZCwgdGhlbiB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIGNoYW5nZWQgYXMgd2VsbC4gIFRoZSByZXR1cm4KLSAqIHZhbHVlIGZvciAxNSBhbmQgOCBvbmx5IHdvcmtzIGZvciB0aG9zZSBleGFjdCBzZXR0aW5ncy4KLSAqCi0gKiBGb3IgYW55IHNldHRpbmcgb3RoZXIgdGhhbiB0aG9zZSBkZWZhdWx0cyBmb3Igd2luZG93Qml0cyBhbmQgbWVtTGV2ZWwsCi0gKiB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYSBjb25zZXJ2YXRpdmUgd29yc3QgY2FzZSBmb3IgdGhlIG1heGltdW0gZXhwYW5zaW9uCi0gKiByZXN1bHRpbmcgZnJvbSB1c2luZyBmaXhlZCBibG9ja3MgaW5zdGVhZCBvZiBzdG9yZWQgYmxvY2tzLCB3aGljaCBkZWZsYXRlCi0gKiBjYW4gZW1pdCBvbiBjb21wcmVzc2VkIGRhdGEgZm9yIHNvbWUgY29tYmluYXRpb25zIG9mIHRoZSBwYXJhbWV0ZXJzLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gY291bGQgYmUgbW9yZSBzb3BoaXN0aWNhdGVkIHRvIHByb3ZpZGUgY2xvc2VyIHVwcGVyIGJvdW5kcyBmb3IKLSAqIGV2ZXJ5IGNvbWJpbmF0aW9uIG9mIHdpbmRvd0JpdHMgYW5kIG1lbUxldmVsLiAgQnV0IGV2ZW4gdGhlIGNvbnNlcnZhdGl2ZQotICogdXBwZXIgYm91bmQgb2YgYWJvdXQgMTQlIGV4cGFuc2lvbiBkb2VzIG5vdCBzZWVtIG9uZXJvdXMgZm9yIG91dHB1dCBidWZmZXIKLSAqIGFsbG9jYXRpb24uCi0gKi8KLXVMb25nIFpFWFBPUlQgZGVmbGF0ZUJvdW5kKAotICAgIHpfc3RyZWFtcCBzdHJtLAotICAgIHVMb25nIHNvdXJjZUxlbikKLXsKLSAgICBkZWZsYXRlX3N0YXRlICpzOwotICAgIHVMb25nIGNvbXBsZW4sIHdyYXBsZW47Ci0gICAgQnl0ZWYgKnN0cjsKLQotICAgIC8qIGNvbnNlcnZhdGl2ZSB1cHBlciBib3VuZCBmb3IgY29tcHJlc3NlZCBkYXRhICovCi0gICAgY29tcGxlbiA9IHNvdXJjZUxlbiArCi0gICAgICAgICAgICAgICgoc291cmNlTGVuICsgNykgPj4gMykgKyAoKHNvdXJjZUxlbiArIDYzKSA+PiA2KSArIDU7Ci0KLSAgICAvKiBpZiBjYW4ndCBnZXQgcGFyYW1ldGVycywgcmV0dXJuIGNvbnNlcnZhdGl2ZSBib3VuZCBwbHVzIHpsaWIgd3JhcHBlciAqLwotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpCi0gICAgICAgIHJldHVybiBjb21wbGVuICsgNjsKLQotICAgIC8qIGNvbXB1dGUgd3JhcHBlciBsZW5ndGggKi8KLSAgICBzID0gc3RybS0+c3RhdGU7Ci0gICAgc3dpdGNoIChzLT53cmFwKSB7Ci0gICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJhdyBkZWZsYXRlICovCi0gICAgICAgIHdyYXBsZW4gPSAwOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogemxpYiB3cmFwcGVyICovCi0gICAgICAgIHdyYXBsZW4gPSA2ICsgKHMtPnN0cnN0YXJ0ID8gNCA6IDApOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ3ppcCB3cmFwcGVyICovCi0gICAgICAgIHdyYXBsZW4gPSAxODsKLSAgICAgICAgaWYgKHMtPmd6aGVhZCAhPSBaX05VTEwpIHsgICAgICAgICAgLyogdXNlci1zdXBwbGllZCBnemlwIGhlYWRlciAqLwotICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+ZXh0cmEgIT0gWl9OVUxMKQotICAgICAgICAgICAgICAgIHdyYXBsZW4gKz0gMiArIHMtPmd6aGVhZC0+ZXh0cmFfbGVuOwotICAgICAgICAgICAgc3RyID0gcy0+Z3poZWFkLT5uYW1lOwotICAgICAgICAgICAgaWYgKHN0ciAhPSBaX05VTEwpCi0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICB3cmFwbGVuKys7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoKnN0cisrKTsKLSAgICAgICAgICAgIHN0ciA9IHMtPmd6aGVhZC0+Y29tbWVudDsKLSAgICAgICAgICAgIGlmIChzdHIgIT0gWl9OVUxMKQotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgd3JhcGxlbisrOwotICAgICAgICAgICAgICAgIH0gd2hpbGUgKCpzdHIrKyk7Ci0gICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjKQotICAgICAgICAgICAgICAgIHdyYXBsZW4gKz0gMjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIGNvbXBpbGVyIGhhcHBpbmVzcyAqLwotICAgICAgICB3cmFwbGVuID0gNjsKLSAgICB9Ci0KLSAgICAvKiBpZiBub3QgZGVmYXVsdCBwYXJhbWV0ZXJzLCByZXR1cm4gY29uc2VydmF0aXZlIGJvdW5kICovCi0gICAgaWYgKHMtPndfYml0cyAhPSAxNSB8fCBzLT5oYXNoX2JpdHMgIT0gOCArIDcpCi0gICAgICAgIHJldHVybiBjb21wbGVuICsgd3JhcGxlbjsKLQotICAgIC8qIGRlZmF1bHQgc2V0dGluZ3M6IHJldHVybiB0aWdodCBib3VuZCBmb3IgdGhhdCBjYXNlICovCi0gICAgcmV0dXJuIHNvdXJjZUxlbiArIChzb3VyY2VMZW4gPj4gMTIpICsgKHNvdXJjZUxlbiA+PiAxNCkgKwotICAgICAgICAgICAoc291cmNlTGVuID4+IDI1KSArIDEzIC0gNiArIHdyYXBsZW47Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFB1dCBhIHNob3J0IGluIHRoZSBwZW5kaW5nIGJ1ZmZlci4gVGhlIDE2LWJpdCB2YWx1ZSBpcyBwdXQgaW4gTVNCIG9yZGVyLgotICogSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHN0YXRlIGlzIGNvcnJlY3QgYW5kIHRoZXJlIGlzIGVub3VnaCByb29tIGluCi0gKiBwZW5kaW5nX2J1Zi4KLSAqLwotbG9jYWwgdm9pZCBwdXRTaG9ydE1TQiAoCi0gICAgZGVmbGF0ZV9zdGF0ZSAqcywKLSAgICB1SW50IGIpCi17Ci0gICAgcHV0X2J5dGUocywgKEJ5dGUpKGIgPj4gOCkpOwotICAgIHB1dF9ieXRlKHMsIChCeXRlKShiICYgMHhmZikpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBGbHVzaCBhcyBtdWNoIHBlbmRpbmcgb3V0cHV0IGFzIHBvc3NpYmxlLiBBbGwgZGVmbGF0ZSgpIG91dHB1dCBnb2VzCi0gKiB0aHJvdWdoIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0Ci0gKiB0byBhdm9pZCBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+bmV4dF9vdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGludG8gaXQuCi0gKiAoU2VlIGFsc28gcmVhZF9idWYoKSkuCi0gKi8KLWxvY2FsIHZvaWQgZmx1c2hfcGVuZGluZygKLSAgICB6X3N0cmVhbXAgc3RybSkKLXsKLSAgICB1bnNpZ25lZCBsZW47Ci0gICAgZGVmbGF0ZV9zdGF0ZSAqcyA9IHN0cm0tPnN0YXRlOwotCi0gICAgX3RyX2ZsdXNoX2JpdHMocyk7Ci0gICAgbGVuID0gcy0+cGVuZGluZzsKLSAgICBpZiAobGVuID4gc3RybS0+YXZhaWxfb3V0KSBsZW4gPSBzdHJtLT5hdmFpbF9vdXQ7Ci0gICAgaWYgKGxlbiA9PSAwKSByZXR1cm47Ci0KLSAgICB6bWVtY3B5KHN0cm0tPm5leHRfb3V0LCBzLT5wZW5kaW5nX291dCwgbGVuKTsKLSAgICBzdHJtLT5uZXh0X291dCAgKz0gbGVuOwotICAgIHMtPnBlbmRpbmdfb3V0ICArPSBsZW47Ci0gICAgc3RybS0+dG90YWxfb3V0ICs9IGxlbjsKLSAgICBzdHJtLT5hdmFpbF9vdXQgIC09IGxlbjsKLSAgICBzLT5wZW5kaW5nIC09IGxlbjsKLSAgICBpZiAocy0+cGVuZGluZyA9PSAwKSB7Ci0gICAgICAgIHMtPnBlbmRpbmdfb3V0ID0gcy0+cGVuZGluZ19idWY7Ci0gICAgfQotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi1pbnQgWkVYUE9SVCBkZWZsYXRlICgKLSAgICB6X3N0cmVhbXAgc3RybSwKLSAgICBpbnQgZmx1c2gpCi17Ci0gICAgaW50IG9sZF9mbHVzaDsgLyogdmFsdWUgb2YgZmx1c2ggcGFyYW0gZm9yIHByZXZpb3VzIGRlZmxhdGUgY2FsbCAqLwotICAgIGRlZmxhdGVfc3RhdGUgKnM7Ci0KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMIHx8Ci0gICAgICAgIGZsdXNoID4gWl9CTE9DSyB8fCBmbHVzaCA8IDApIHsKLSAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIH0KLSAgICBzID0gc3RybS0+c3RhdGU7Ci0KLSAgICBpZiAoc3RybS0+bmV4dF9vdXQgPT0gWl9OVUxMIHx8Ci0gICAgICAgIChzdHJtLT5uZXh0X2luID09IFpfTlVMTCAmJiBzdHJtLT5hdmFpbF9pbiAhPSAwKSB8fAotICAgICAgICAocy0+c3RhdHVzID09IEZJTklTSF9TVEFURSAmJiBmbHVzaCAhPSBaX0ZJTklTSCkpIHsKLSAgICAgICAgRVJSX1JFVFVSTihzdHJtLCBaX1NUUkVBTV9FUlJPUik7Ci0gICAgfQotICAgIGlmIChzdHJtLT5hdmFpbF9vdXQgPT0gMCkgRVJSX1JFVFVSTihzdHJtLCBaX0JVRl9FUlJPUik7Ci0KLSAgICBzLT5zdHJtID0gc3RybTsgLyoganVzdCBpbiBjYXNlICovCi0gICAgb2xkX2ZsdXNoID0gcy0+bGFzdF9mbHVzaDsKLSAgICBzLT5sYXN0X2ZsdXNoID0gZmx1c2g7Ci0KLSAgICAvKiBXcml0ZSB0aGUgaGVhZGVyICovCi0gICAgaWYgKHMtPnN0YXR1cyA9PSBJTklUX1NUQVRFKSB7Ci0jaWZkZWYgR1pJUAotICAgICAgICBpZiAocy0+d3JhcCA9PSAyKSB7Ci0gICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKDBMLCBaX05VTEwsIDApOwotICAgICAgICAgICAgcHV0X2J5dGUocywgMzEpOwotICAgICAgICAgICAgcHV0X2J5dGUocywgMTM5KTsKLSAgICAgICAgICAgIHB1dF9ieXRlKHMsIDgpOwotICAgICAgICAgICAgaWYgKHMtPmd6aGVhZCA9PSBaX05VTEwpIHsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAwKTsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCBzLT5sZXZlbCA9PSA5ID8gMiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMtPmxldmVsIDwgMiA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQgOiAwKSk7Ci0gICAgICAgICAgICAgICAgcHV0X2J5dGUocywgT1NfQ09ERSk7Ci0gICAgICAgICAgICAgICAgcy0+c3RhdHVzID0gQlVTWV9TVEFURTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChzLT5nemhlYWQtPnRleHQgPyAxIDogMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5nemhlYWQtPmhjcmMgPyAyIDogMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5nemhlYWQtPmV4dHJhID09IFpfTlVMTCA/IDAgOiA0KSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmd6aGVhZC0+bmFtZSA9PSBaX05VTEwgPyAwIDogOCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5nemhlYWQtPmNvbW1lbnQgPT0gWl9OVUxMID8gMCA6IDE2KQotICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkocy0+Z3poZWFkLT50aW1lICYgMHhmZikpOwotICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgocy0+Z3poZWFkLT50aW1lID4+IDgpICYgMHhmZikpOwotICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgocy0+Z3poZWFkLT50aW1lID4+IDE2KSAmIDB4ZmYpKTsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHMtPmd6aGVhZC0+dGltZSA+PiAyNCkgJiAweGZmKSk7Ci0gICAgICAgICAgICAgICAgcHV0X2J5dGUocywgcy0+bGV2ZWwgPT0gOSA/IDIgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzLT5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLT5sZXZlbCA8IDIgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0IDogMCkpOwotICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHMtPmd6aGVhZC0+b3MgJiAweGZmKTsKLSAgICAgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5leHRyYSAhPSBaX05VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgcy0+Z3poZWFkLT5leHRyYV9sZW4gJiAweGZmKTsKLSAgICAgICAgICAgICAgICAgICAgcHV0X2J5dGUocywgKHMtPmd6aGVhZC0+ZXh0cmFfbGVuID4+IDgpICYgMHhmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMpCi0gICAgICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHMtPnBlbmRpbmdfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnBlbmRpbmcpOwotICAgICAgICAgICAgICAgIHMtPmd6aW5kZXggPSAwOwotICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IEVYVFJBX1NUQVRFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAgICB7Ci0gICAgICAgICAgICB1SW50IGhlYWRlciA9IChaX0RFRkxBVEVEICsgKChzLT53X2JpdHMtOCk8PDQpKSA8PCA4OwotICAgICAgICAgICAgdUludCBsZXZlbF9mbGFnczsKLQotICAgICAgICAgICAgaWYgKHMtPnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMtPmxldmVsIDwgMikKLSAgICAgICAgICAgICAgICBsZXZlbF9mbGFncyA9IDA7Ci0gICAgICAgICAgICBlbHNlIGlmIChzLT5sZXZlbCA8IDYpCi0gICAgICAgICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAxOwotICAgICAgICAgICAgZWxzZSBpZiAocy0+bGV2ZWwgPT0gNikKLSAgICAgICAgICAgICAgICBsZXZlbF9mbGFncyA9IDI7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbGV2ZWxfZmxhZ3MgPSAzOwotICAgICAgICAgICAgaGVhZGVyIHw9IChsZXZlbF9mbGFncyA8PCA2KTsKLSAgICAgICAgICAgIGlmIChzLT5zdHJzdGFydCAhPSAwKSBoZWFkZXIgfD0gUFJFU0VUX0RJQ1Q7Ci0gICAgICAgICAgICBoZWFkZXIgKz0gMzEgLSAoaGVhZGVyICUgMzEpOwotCi0gICAgICAgICAgICBzLT5zdGF0dXMgPSBCVVNZX1NUQVRFOwotICAgICAgICAgICAgcHV0U2hvcnRNU0IocywgaGVhZGVyKTsKLQotICAgICAgICAgICAgLyogU2F2ZSB0aGUgYWRsZXIzMiBvZiB0aGUgcHJlc2V0IGRpY3Rpb25hcnk6ICovCi0gICAgICAgICAgICBpZiAocy0+c3Ryc3RhcnQgIT0gMCkgewotICAgICAgICAgICAgICAgIHB1dFNob3J0TVNCKHMsICh1SW50KShzdHJtLT5hZGxlciA+PiAxNikpOwotICAgICAgICAgICAgICAgIHB1dFNob3J0TVNCKHMsICh1SW50KShzdHJtLT5hZGxlciAmIDB4ZmZmZikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOwotICAgICAgICB9Ci0gICAgfQotI2lmZGVmIEdaSVAKLSAgICBpZiAocy0+c3RhdHVzID09IEVYVFJBX1NUQVRFKSB7Ci0gICAgICAgIGlmIChzLT5nemhlYWQtPmV4dHJhICE9IFpfTlVMTCkgewotICAgICAgICAgICAgdUludCBiZWcgPSBzLT5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqLwotCi0gICAgICAgICAgICB3aGlsZSAocy0+Z3ppbmRleCA8IChzLT5nemhlYWQtPmV4dHJhX2xlbiAmIDB4ZmZmZikpIHsKLSAgICAgICAgICAgICAgICBpZiAocy0+cGVuZGluZyA9PSBzLT5wZW5kaW5nX2J1Zl9zaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMgJiYgcy0+cGVuZGluZyA+IGJlZykKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHMtPnBlbmRpbmdfYnVmICsgYmVnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wZW5kaW5nIC0gYmVnKTsKLSAgICAgICAgICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKLSAgICAgICAgICAgICAgICAgICAgYmVnID0gcy0+cGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgPT0gcy0+cGVuZGluZ19idWZfc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCBzLT5nemhlYWQtPmV4dHJhW3MtPmd6aW5kZXhdKTsKLSAgICAgICAgICAgICAgICBzLT5nemluZGV4Kys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjICYmIHMtPnBlbmRpbmcgPiBiZWcpCi0gICAgICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMihzdHJtLT5hZGxlciwgcy0+cGVuZGluZ19idWYgKyBiZWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wZW5kaW5nIC0gYmVnKTsKLSAgICAgICAgICAgIGlmIChzLT5nemluZGV4ID09IHMtPmd6aGVhZC0+ZXh0cmFfbGVuKSB7Ci0gICAgICAgICAgICAgICAgcy0+Z3ppbmRleCA9IDA7Ci0gICAgICAgICAgICAgICAgcy0+c3RhdHVzID0gTkFNRV9TVEFURTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzLT5zdGF0dXMgPSBOQU1FX1NUQVRFOwotICAgIH0KLSAgICBpZiAocy0+c3RhdHVzID09IE5BTUVfU1RBVEUpIHsKLSAgICAgICAgaWYgKHMtPmd6aGVhZC0+bmFtZSAhPSBaX05VTEwpIHsKLSAgICAgICAgICAgIHVJbnQgYmVnID0gcy0+cGVuZGluZzsgIC8qIHN0YXJ0IG9mIGJ5dGVzIHRvIHVwZGF0ZSBjcmMgKi8KLSAgICAgICAgICAgIGludCB2YWw7Ci0KLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpZiAocy0+cGVuZGluZyA9PSBzLT5wZW5kaW5nX2J1Zl9zaXplKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzLT5nemhlYWQtPmhjcmMgJiYgcy0+cGVuZGluZyA+IGJlZykKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHMtPnBlbmRpbmdfYnVmICsgYmVnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wZW5kaW5nIC0gYmVnKTsKLSAgICAgICAgICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKLSAgICAgICAgICAgICAgICAgICAgYmVnID0gcy0+cGVuZGluZzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgPT0gcy0+cGVuZGluZ19idWZfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZhbCA9IHMtPmd6aGVhZC0+bmFtZVtzLT5nemluZGV4KytdOwotICAgICAgICAgICAgICAgIHB1dF9ieXRlKHMsIHZhbCk7Ci0gICAgICAgICAgICB9IHdoaWxlICh2YWwgIT0gMCk7Ci0gICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjICYmIHMtPnBlbmRpbmcgPiBiZWcpCi0gICAgICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBjcmMzMihzdHJtLT5hZGxlciwgcy0+cGVuZGluZ19idWYgKyBiZWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5wZW5kaW5nIC0gYmVnKTsKLSAgICAgICAgICAgIGlmICh2YWwgPT0gMCkgewotICAgICAgICAgICAgICAgIHMtPmd6aW5kZXggPSAwOwotICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcy0+c3RhdHVzID0gQ09NTUVOVF9TVEFURTsKLSAgICB9Ci0gICAgaWYgKHMtPnN0YXR1cyA9PSBDT01NRU5UX1NUQVRFKSB7Ci0gICAgICAgIGlmIChzLT5nemhlYWQtPmNvbW1lbnQgIT0gWl9OVUxMKSB7Ci0gICAgICAgICAgICB1SW50IGJlZyA9IHMtPnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovCi0gICAgICAgICAgICBpbnQgdmFsOwotCi0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgPT0gcy0+cGVuZGluZ19idWZfc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAocy0+Z3poZWFkLT5oY3JjICYmIHMtPnBlbmRpbmcgPiBiZWcpCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBzLT5wZW5kaW5nX2J1ZiArIGJlZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGVuZGluZyAtIGJlZyk7Ci0gICAgICAgICAgICAgICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7Ci0gICAgICAgICAgICAgICAgICAgIGJlZyA9IHMtPnBlbmRpbmc7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzLT5wZW5kaW5nID09IHMtPnBlbmRpbmdfYnVmX3NpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2YWwgPSBzLT5nemhlYWQtPmNvbW1lbnRbcy0+Z3ppbmRleCsrXTsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCB2YWwpOwotICAgICAgICAgICAgfSB3aGlsZSAodmFsICE9IDApOwotICAgICAgICAgICAgaWYgKHMtPmd6aGVhZC0+aGNyYyAmJiBzLT5wZW5kaW5nID4gYmVnKQotICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gY3JjMzIoc3RybS0+YWRsZXIsIHMtPnBlbmRpbmdfYnVmICsgYmVnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cGVuZGluZyAtIGJlZyk7Ci0gICAgICAgICAgICBpZiAodmFsID09IDApCi0gICAgICAgICAgICAgICAgcy0+c3RhdHVzID0gSENSQ19TVEFURTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzLT5zdGF0dXMgPSBIQ1JDX1NUQVRFOwotICAgIH0KLSAgICBpZiAocy0+c3RhdHVzID09IEhDUkNfU1RBVEUpIHsKLSAgICAgICAgaWYgKHMtPmd6aGVhZC0+aGNyYykgewotICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgKyAyID4gcy0+cGVuZGluZ19idWZfc2l6ZSkKLSAgICAgICAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pOwotICAgICAgICAgICAgaWYgKHMtPnBlbmRpbmcgKyAyIDw9IHMtPnBlbmRpbmdfYnVmX3NpemUpIHsKLSAgICAgICAgICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoc3RybS0+YWRsZXIgJiAweGZmKSk7Ci0gICAgICAgICAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzdHJtLT5hZGxlciA+PiA4KSAmIDB4ZmYpKTsKLSAgICAgICAgICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKDBMLCBaX05VTEwsIDApOwotICAgICAgICAgICAgICAgIHMtPnN0YXR1cyA9IEJVU1lfU1RBVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcy0+c3RhdHVzID0gQlVTWV9TVEFURTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIC8qIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUgKi8KLSAgICBpZiAocy0+cGVuZGluZyAhPSAwKSB7Ci0gICAgICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7Ci0gICAgICAgIGlmIChzdHJtLT5hdmFpbF9vdXQgPT0gMCkgewotICAgICAgICAgICAgLyogU2luY2UgYXZhaWxfb3V0IGlzIDAsIGRlZmxhdGUgd2lsbCBiZSBjYWxsZWQgYWdhaW4gd2l0aAotICAgICAgICAgICAgICogbW9yZSBvdXRwdXQgc3BhY2UsIGJ1dCBwb3NzaWJseSB3aXRoIGJvdGggcGVuZGluZyBhbmQKLSAgICAgICAgICAgICAqIGF2YWlsX2luIGVxdWFsIHRvIHplcm8uIFRoZXJlIHdvbid0IGJlIGFueXRoaW5nIHRvIGRvLAotICAgICAgICAgICAgICogYnV0IHRoaXMgaXMgbm90IGFuIGVycm9yIHNpdHVhdGlvbiBzbyBtYWtlIHN1cmUgd2UKLSAgICAgICAgICAgICAqIHJldHVybiBPSyBpbnN0ZWFkIG9mIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwgb2YgZGVmbGF0ZToKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcy0+bGFzdF9mbHVzaCA9IC0xOwotICAgICAgICAgICAgcmV0dXJuIFpfT0s7Ci0gICAgICAgIH0KLQotICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gZG8gYW5kIGF2b2lkIGR1cGxpY2F0ZSBjb25zZWN1dGl2ZQotICAgICAqIGZsdXNoZXMuIEZvciByZXBlYXRlZCBhbmQgdXNlbGVzcyBjYWxscyB3aXRoIFpfRklOSVNILCB3ZSBrZWVwCi0gICAgICogcmV0dXJuaW5nIFpfU1RSRUFNX0VORCBpbnN0ZWFkIG9mIFpfQlVGX0VSUk9SLgotICAgICAqLwotICAgIH0gZWxzZSBpZiAoc3RybS0+YXZhaWxfaW4gPT0gMCAmJiBSQU5LKGZsdXNoKSA8PSBSQU5LKG9sZF9mbHVzaCkgJiYKLSAgICAgICAgICAgICAgIGZsdXNoICE9IFpfRklOSVNIKSB7Ci0gICAgICAgIEVSUl9SRVRVUk4oc3RybSwgWl9CVUZfRVJST1IpOwotICAgIH0KLQotICAgIC8qIFVzZXIgbXVzdCBub3QgcHJvdmlkZSBtb3JlIGlucHV0IGFmdGVyIHRoZSBmaXJzdCBGSU5JU0g6ICovCi0gICAgaWYgKHMtPnN0YXR1cyA9PSBGSU5JU0hfU1RBVEUgJiYgc3RybS0+YXZhaWxfaW4gIT0gMCkgewotICAgICAgICBFUlJfUkVUVVJOKHN0cm0sIFpfQlVGX0VSUk9SKTsKLSAgICB9Ci0KLSAgICAvKiBTdGFydCBhIG5ldyBibG9jayBvciBjb250aW51ZSB0aGUgY3VycmVudCBvbmUuCi0gICAgICovCi0gICAgaWYgKHN0cm0tPmF2YWlsX2luICE9IDAgfHwgcy0+bG9va2FoZWFkICE9IDAgfHwKLSAgICAgICAgKGZsdXNoICE9IFpfTk9fRkxVU0ggJiYgcy0+c3RhdHVzICE9IEZJTklTSF9TVEFURSkpIHsKLSAgICAgICAgYmxvY2tfc3RhdGUgYnN0YXRlOwotCi0gICAgICAgIGJzdGF0ZSA9IHMtPnN0cmF0ZWd5ID09IFpfSFVGRk1BTl9PTkxZID8gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSA6Ci0gICAgICAgICAgICAgICAgICAgIChzLT5zdHJhdGVneSA9PSBaX1JMRSA/IGRlZmxhdGVfcmxlKHMsIGZsdXNoKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAoKihjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5mdW5jKSkocywgZmx1c2gpKTsKLQotICAgICAgICBpZiAoYnN0YXRlID09IGZpbmlzaF9zdGFydGVkIHx8IGJzdGF0ZSA9PSBmaW5pc2hfZG9uZSkgewotICAgICAgICAgICAgcy0+c3RhdHVzID0gRklOSVNIX1NUQVRFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChic3RhdGUgPT0gbmVlZF9tb3JlIHx8IGJzdGF0ZSA9PSBmaW5pc2hfc3RhcnRlZCkgewotICAgICAgICAgICAgaWYgKHN0cm0tPmF2YWlsX291dCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcy0+bGFzdF9mbHVzaCA9IC0xOyAvKiBhdm9pZCBCVUZfRVJST1IgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBaX09LOwotICAgICAgICAgICAgLyogSWYgZmx1c2ggIT0gWl9OT19GTFVTSCAmJiBhdmFpbF9vdXQgPT0gMCwgdGhlIG5leHQgY2FsbAotICAgICAgICAgICAgICogb2YgZGVmbGF0ZSBzaG91bGQgdXNlIHRoZSBzYW1lIGZsdXNoIHBhcmFtZXRlciB0byBtYWtlIHN1cmUKLSAgICAgICAgICAgICAqIHRoYXQgdGhlIGZsdXNoIGlzIGNvbXBsZXRlLiBTbyB3ZSBkb24ndCBoYXZlIHRvIG91dHB1dCBhbgotICAgICAgICAgICAgICogZW1wdHkgYmxvY2sgaGVyZSwgdGhpcyB3aWxsIGJlIGRvbmUgYXQgbmV4dCBjYWxsLiBUaGlzIGFsc28KLSAgICAgICAgICAgICAqIGVuc3VyZXMgdGhhdCBmb3IgYSB2ZXJ5IHNtYWxsIG91dHB1dCBidWZmZXIsIHdlIGVtaXQgYXQgbW9zdAotICAgICAgICAgICAgICogb25lIGVtcHR5IGJsb2NrLgotICAgICAgICAgICAgICovCi0gICAgICAgIH0KLSAgICAgICAgaWYgKGJzdGF0ZSA9PSBibG9ja19kb25lKSB7Ci0gICAgICAgICAgICBpZiAoZmx1c2ggPT0gWl9QQVJUSUFMX0ZMVVNIKSB7Ci0gICAgICAgICAgICAgICAgX3RyX2FsaWduKHMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChmbHVzaCAhPSBaX0JMT0NLKSB7IC8qIEZVTExfRkxVU0ggb3IgU1lOQ19GTFVTSCAqLwotICAgICAgICAgICAgICAgIF90cl9zdG9yZWRfYmxvY2socywgKGNoYXIqKTAsIDBMLCAwKTsKLSAgICAgICAgICAgICAgICAvKiBGb3IgYSBmdWxsIGZsdXNoLCB0aGlzIGVtcHR5IGJsb2NrIHdpbGwgYmUgcmVjb2duaXplZAotICAgICAgICAgICAgICAgICAqIGFzIGEgc3BlY2lhbCBtYXJrZXIgYnkgaW5mbGF0ZV9zeW5jKCkuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfRlVMTF9GTFVTSCkgewotICAgICAgICAgICAgICAgICAgICBDTEVBUl9IQVNIKHMpOyAgICAgICAgICAgICAvKiBmb3JnZXQgaGlzdG9yeSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0ID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHMtPmJsb2NrX3N0YXJ0ID0gMEw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzLT5pbnNlcnQgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKLSAgICAgICAgICAgIGlmIChzdHJtLT5hdmFpbF9vdXQgPT0gMCkgewotICAgICAgICAgICAgICBzLT5sYXN0X2ZsdXNoID0gLTE7IC8qIGF2b2lkIEJVRl9FUlJPUiBhdCBuZXh0IGNhbGwsIHNlZSBhYm92ZSAqLwotICAgICAgICAgICAgICByZXR1cm4gWl9PSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBBc3NlcnQoc3RybS0+YXZhaWxfb3V0ID4gMCwgImJ1ZzIiKTsKLQotICAgIGlmIChmbHVzaCAhPSBaX0ZJTklTSCkgcmV0dXJuIFpfT0s7Ci0gICAgaWYgKHMtPndyYXAgPD0gMCkgcmV0dXJuIFpfU1RSRUFNX0VORDsKLQotICAgIC8qIFdyaXRlIHRoZSB0cmFpbGVyICovCi0jaWZkZWYgR1pJUAotICAgIGlmIChzLT53cmFwID09IDIpIHsKLSAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKHN0cm0tPmFkbGVyICYgMHhmZikpOwotICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHN0cm0tPmFkbGVyID4+IDgpICYgMHhmZikpOwotICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSkoKHN0cm0tPmFkbGVyID4+IDE2KSAmIDB4ZmYpKTsKLSAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzdHJtLT5hZGxlciA+PiAyNCkgJiAweGZmKSk7Ci0gICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKShzdHJtLT50b3RhbF9pbiAmIDB4ZmYpKTsKLSAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzdHJtLT50b3RhbF9pbiA+PiA4KSAmIDB4ZmYpKTsKLSAgICAgICAgcHV0X2J5dGUocywgKEJ5dGUpKChzdHJtLT50b3RhbF9pbiA+PiAxNikgJiAweGZmKSk7Ci0gICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKSgoc3RybS0+dG90YWxfaW4gPj4gMjQpICYgMHhmZikpOwotICAgIH0KLSAgICBlbHNlCi0jZW5kaWYKLSAgICB7Ci0gICAgICAgIHB1dFNob3J0TVNCKHMsICh1SW50KShzdHJtLT5hZGxlciA+PiAxNikpOwotICAgICAgICBwdXRTaG9ydE1TQihzLCAodUludCkoc3RybS0+YWRsZXIgJiAweGZmZmYpKTsKLSAgICB9Ci0gICAgZmx1c2hfcGVuZGluZyhzdHJtKTsKLSAgICAvKiBJZiBhdmFpbF9vdXQgaXMgemVybywgdGhlIGFwcGxpY2F0aW9uIHdpbGwgY2FsbCBkZWZsYXRlIGFnYWluCi0gICAgICogdG8gZmx1c2ggdGhlIHJlc3QuCi0gICAgICovCi0gICAgaWYgKHMtPndyYXAgPiAwKSBzLT53cmFwID0gLXMtPndyYXA7IC8qIHdyaXRlIHRoZSB0cmFpbGVyIG9ubHkgb25jZSEgKi8KLSAgICByZXR1cm4gcy0+cGVuZGluZyAhPSAwID8gWl9PSyA6IFpfU1RSRUFNX0VORDsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotaW50IFpFWFBPUlQgZGVmbGF0ZUVuZCAoCi0gICAgel9zdHJlYW1wIHN0cm0pCi17Ci0gICAgaW50IHN0YXR1czsKLQotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLQotICAgIHN0YXR1cyA9IHN0cm0tPnN0YXRlLT5zdGF0dXM7Ci0gICAgaWYgKHN0YXR1cyAhPSBJTklUX1NUQVRFICYmCi0gICAgICAgIHN0YXR1cyAhPSBFWFRSQV9TVEFURSAmJgotICAgICAgICBzdGF0dXMgIT0gTkFNRV9TVEFURSAmJgotICAgICAgICBzdGF0dXMgIT0gQ09NTUVOVF9TVEFURSAmJgotICAgICAgICBzdGF0dXMgIT0gSENSQ19TVEFURSAmJgotICAgICAgICBzdGF0dXMgIT0gQlVTWV9TVEFURSAmJgotICAgICAgICBzdGF0dXMgIT0gRklOSVNIX1NUQVRFKSB7Ci0gICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgfQotCi0gICAgLyogRGVhbGxvY2F0ZSBpbiByZXZlcnNlIG9yZGVyIG9mIGFsbG9jYXRpb25zOiAqLwotICAgIFRSWV9GUkVFKHN0cm0sIHN0cm0tPnN0YXRlLT5wZW5kaW5nX2J1Zik7Ci0gICAgVFJZX0ZSRUUoc3RybSwgc3RybS0+c3RhdGUtPmhlYWQpOwotICAgIFRSWV9GUkVFKHN0cm0sIHN0cm0tPnN0YXRlLT5wcmV2KTsKLSAgICBUUllfRlJFRShzdHJtLCBzdHJtLT5zdGF0ZS0+d2luZG93KTsKLQotICAgIFpGUkVFKHN0cm0sIHN0cm0tPnN0YXRlKTsKLSAgICBzdHJtLT5zdGF0ZSA9IFpfTlVMTDsKLQotICAgIHJldHVybiBzdGF0dXMgPT0gQlVTWV9TVEFURSA/IFpfREFUQV9FUlJPUiA6IFpfT0s7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHkgdGhlIHNvdXJjZSBzdGF0ZSB0byB0aGUgZGVzdGluYXRpb24gc3RhdGUuCi0gKiBUbyBzaW1wbGlmeSB0aGUgc291cmNlLCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIDE2LWJpdCBNU0RPUyAod2hpY2gKLSAqIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggbWVtb3J5IGFueXdheSB0byBkdXBsaWNhdGUgY29tcHJlc3Npb24gc3RhdGVzKS4KLSAqLwotaW50IFpFWFBPUlQgZGVmbGF0ZUNvcHkgKAotICAgIHpfc3RyZWFtcCBkZXN0LAotICAgIHpfc3RyZWFtcCBzb3VyY2UpCi17Ci0jaWZkZWYgTUFYU0VHXzY0SwotICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSNlbHNlCi0gICAgZGVmbGF0ZV9zdGF0ZSAqZHM7Ci0gICAgZGVmbGF0ZV9zdGF0ZSAqc3M7Ci0gICAgdXNoZiAqb3ZlcmxheTsKLQotCi0gICAgaWYgKHNvdXJjZSA9PSBaX05VTEwgfHwgZGVzdCA9PSBaX05VTEwgfHwgc291cmNlLT5zdGF0ZSA9PSBaX05VTEwpIHsKLSAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIH0KLQotICAgIHNzID0gc291cmNlLT5zdGF0ZTsKLQotICAgIHptZW1jcHkoKHZvaWRwZilkZXN0LCAodm9pZHBmKXNvdXJjZSwgc2l6ZW9mKHpfc3RyZWFtKSk7Ci0KLSAgICBkcyA9IChkZWZsYXRlX3N0YXRlICopIFpBTExPQyhkZXN0LCAxLCBzaXplb2YoZGVmbGF0ZV9zdGF0ZSkpOwotICAgIGlmIChkcyA9PSBaX05VTEwpIHJldHVybiBaX01FTV9FUlJPUjsKLSAgICBkZXN0LT5zdGF0ZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICopIGRzOwotICAgIHptZW1jcHkoKHZvaWRwZilkcywgKHZvaWRwZilzcywgc2l6ZW9mKGRlZmxhdGVfc3RhdGUpKTsKLSAgICBkcy0+c3RybSA9IGRlc3Q7Ci0KLSAgICBkcy0+d2luZG93ID0gKEJ5dGVmICopIFpBTExPQyhkZXN0LCBkcy0+d19zaXplLCAyKnNpemVvZihCeXRlKSk7Ci0gICAgZHMtPnByZXYgICA9IChQb3NmICopICBaQUxMT0MoZGVzdCwgZHMtPndfc2l6ZSwgc2l6ZW9mKFBvcykpOwotICAgIGRzLT5oZWFkICAgPSAoUG9zZiAqKSAgWkFMTE9DKGRlc3QsIGRzLT5oYXNoX3NpemUsIHNpemVvZihQb3MpKTsKLSAgICBvdmVybGF5ID0gKHVzaGYgKikgWkFMTE9DKGRlc3QsIGRzLT5saXRfYnVmc2l6ZSwgc2l6ZW9mKHVzaCkrMik7Ci0gICAgZHMtPnBlbmRpbmdfYnVmID0gKHVjaGYgKikgb3ZlcmxheTsKLQotICAgIGlmIChkcy0+d2luZG93ID09IFpfTlVMTCB8fCBkcy0+cHJldiA9PSBaX05VTEwgfHwgZHMtPmhlYWQgPT0gWl9OVUxMIHx8Ci0gICAgICAgIGRzLT5wZW5kaW5nX2J1ZiA9PSBaX05VTEwpIHsKLSAgICAgICAgZGVmbGF0ZUVuZCAoZGVzdCk7Ci0gICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKLSAgICB9Ci0gICAgLyogZm9sbG93aW5nIHptZW1jcHkgZG8gbm90IHdvcmsgZm9yIDE2LWJpdCBNU0RPUyAqLwotICAgIHptZW1jcHkoZHMtPndpbmRvdywgc3MtPndpbmRvdywgZHMtPndfc2l6ZSAqIDIgKiBzaXplb2YoQnl0ZSkpOwotICAgIHptZW1jcHkoKHZvaWRwZilkcy0+cHJldiwgKHZvaWRwZilzcy0+cHJldiwgZHMtPndfc2l6ZSAqIHNpemVvZihQb3MpKTsKLSAgICB6bWVtY3B5KCh2b2lkcGYpZHMtPmhlYWQsICh2b2lkcGYpc3MtPmhlYWQsIGRzLT5oYXNoX3NpemUgKiBzaXplb2YoUG9zKSk7Ci0gICAgem1lbWNweShkcy0+cGVuZGluZ19idWYsIHNzLT5wZW5kaW5nX2J1ZiwgKHVJbnQpZHMtPnBlbmRpbmdfYnVmX3NpemUpOwotCi0gICAgZHMtPnBlbmRpbmdfb3V0ID0gZHMtPnBlbmRpbmdfYnVmICsgKHNzLT5wZW5kaW5nX291dCAtIHNzLT5wZW5kaW5nX2J1Zik7Ci0gICAgZHMtPmRfYnVmID0gb3ZlcmxheSArIGRzLT5saXRfYnVmc2l6ZS9zaXplb2YodXNoKTsKLSAgICBkcy0+bF9idWYgPSBkcy0+cGVuZGluZ19idWYgKyAoMStzaXplb2YodXNoKSkqZHMtPmxpdF9idWZzaXplOwotCi0gICAgZHMtPmxfZGVzYy5keW5fdHJlZSA9IGRzLT5keW5fbHRyZWU7Ci0gICAgZHMtPmRfZGVzYy5keW5fdHJlZSA9IGRzLT5keW5fZHRyZWU7Ci0gICAgZHMtPmJsX2Rlc2MuZHluX3RyZWUgPSBkcy0+YmxfdHJlZTsKLQotICAgIHJldHVybiBaX09LOwotI2VuZGlmIC8qIE1BWFNFR182NEsgKi8KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBSZWFkIGEgbmV3IGJ1ZmZlciBmcm9tIHRoZSBjdXJyZW50IGlucHV0IHN0cmVhbSwgdXBkYXRlIHRoZSBhZGxlcjMyCi0gKiBhbmQgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQuICBBbGwgZGVmbGF0ZSgpIGlucHV0IGdvZXMgdGhyb3VnaAotICogdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXQgdG8gYXZvaWQKLSAqIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5uZXh0X2luIGJ1ZmZlciBhbmQgY29weWluZyBmcm9tIGl0LgotICogKFNlZSBhbHNvIGZsdXNoX3BlbmRpbmcoKSkuCi0gKi8KLWxvY2FsIGludCByZWFkX2J1ZigKLSAgICB6X3N0cmVhbXAgc3RybSwKLSAgICBCeXRlZiAqYnVmLAotICAgIHVuc2lnbmVkIHNpemUpCi17Ci0gICAgdW5zaWduZWQgbGVuID0gc3RybS0+YXZhaWxfaW47Ci0KLSAgICBpZiAobGVuID4gc2l6ZSkgbGVuID0gc2l6ZTsKLSAgICBpZiAobGVuID09IDApIHJldHVybiAwOwotCi0gICAgc3RybS0+YXZhaWxfaW4gIC09IGxlbjsKLQotICAgIHptZW1jcHkoYnVmLCBzdHJtLT5uZXh0X2luLCBsZW4pOwotICAgIGlmIChzdHJtLT5zdGF0ZS0+d3JhcCA9PSAxKSB7Ci0gICAgICAgIHN0cm0tPmFkbGVyID0gYWRsZXIzMihzdHJtLT5hZGxlciwgYnVmLCBsZW4pOwotICAgIH0KLSNpZmRlZiBHWklQCi0gICAgZWxzZSBpZiAoc3RybS0+c3RhdGUtPndyYXAgPT0gMikgewotICAgICAgICBzdHJtLT5hZGxlciA9IGNyYzMyKHN0cm0tPmFkbGVyLCBidWYsIGxlbik7Ci0gICAgfQotI2VuZGlmCi0gICAgc3RybS0+bmV4dF9pbiAgKz0gbGVuOwotICAgIHN0cm0tPnRvdGFsX2luICs9IGxlbjsKLQotICAgIHJldHVybiAoaW50KWxlbjsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBJbml0aWFsaXplIHRoZSAibG9uZ2VzdCBtYXRjaCIgcm91dGluZXMgZm9yIGEgbmV3IHpsaWIgc3RyZWFtCi0gKi8KLWxvY2FsIHZvaWQgbG1faW5pdCAoCi0gICAgZGVmbGF0ZV9zdGF0ZSAqcykKLXsKLSAgICBzLT53aW5kb3dfc2l6ZSA9ICh1bGcpMkwqcy0+d19zaXplOwotCi0gICAgQ0xFQVJfSEFTSChzKTsKLQotICAgIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6Ci0gICAgICovCi0gICAgcy0+bWF4X2xhenlfbWF0Y2ggICA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy0+bGV2ZWxdLm1heF9sYXp5OwotICAgIHMtPmdvb2RfbWF0Y2ggICAgICAgPSBjb25maWd1cmF0aW9uX3RhYmxlW3MtPmxldmVsXS5nb29kX2xlbmd0aDsKLSAgICBzLT5uaWNlX21hdGNoICAgICAgID0gY29uZmlndXJhdGlvbl90YWJsZVtzLT5sZXZlbF0ubmljZV9sZW5ndGg7Ci0gICAgcy0+bWF4X2NoYWluX2xlbmd0aCA9IGNvbmZpZ3VyYXRpb25fdGFibGVbcy0+bGV2ZWxdLm1heF9jaGFpbjsKLQotICAgIHMtPnN0cnN0YXJ0ID0gMDsKLSAgICBzLT5ibG9ja19zdGFydCA9IDBMOwotICAgIHMtPmxvb2thaGVhZCA9IDA7Ci0gICAgcy0+aW5zZXJ0ID0gMDsKLSAgICBzLT5tYXRjaF9sZW5ndGggPSBzLT5wcmV2X2xlbmd0aCA9IE1JTl9NQVRDSC0xOwotICAgIHMtPm1hdGNoX2F2YWlsYWJsZSA9IDA7Ci0gICAgcy0+aW5zX2ggPSAwOwotI2lmbmRlZiBGQVNURVNUCi0jaWZkZWYgQVNNVgotICAgIG1hdGNoX2luaXQoKTsgLyogaW5pdGlhbGl6ZSB0aGUgYXNtIGNvZGUgKi8KLSNlbmRpZgotI2VuZGlmCi19Ci0KLSNpZm5kZWYgRkFTVEVTVAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBTZXQgbWF0Y2hfc3RhcnQgdG8gdGhlIGxvbmdlc3QgbWF0Y2ggc3RhcnRpbmcgYXQgdGhlIGdpdmVuIHN0cmluZyBhbmQKLSAqIHJldHVybiBpdHMgbGVuZ3RoLiBNYXRjaGVzIHNob3J0ZXIgb3IgZXF1YWwgdG8gcHJldl9sZW5ndGggYXJlIGRpc2NhcmRlZCwKLSAqIGluIHdoaWNoIGNhc2UgdGhlIHJlc3VsdCBpcyBlcXVhbCB0byBwcmV2X2xlbmd0aCBhbmQgbWF0Y2hfc3RhcnQgaXMKLSAqIGdhcmJhZ2UuCi0gKiBJTiBhc3NlcnRpb25zOiBjdXJfbWF0Y2ggaXMgdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW4gZm9yIHRoZSBjdXJyZW50Ci0gKiAgIHN0cmluZyAoc3Ryc3RhcnQpIGFuZCBpdHMgZGlzdGFuY2UgaXMgPD0gTUFYX0RJU1QsIGFuZCBwcmV2X2xlbmd0aCA+PSAxCi0gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIG5vdCBncmVhdGVyIHRoYW4gcy0+bG9va2FoZWFkLgotICovCi0jaWZuZGVmIEFTTVYKLS8qIEZvciA4MHg4NiBhbmQgNjgweDAsIGFuIG9wdGltaXplZCB2ZXJzaW9uIHdpbGwgYmUgcHJvdmlkZWQgaW4gbWF0Y2guYXNtIG9yCi0gKiBtYXRjaC5TLiBUaGUgY29kZSB3aWxsIGJlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50LgotICovCi1sb2NhbCB1SW50IGxvbmdlc3RfbWF0Y2goCi0gICAgZGVmbGF0ZV9zdGF0ZSAqcywKLSAgICBJUG9zIGN1cl9tYXRjaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8KLXsKLSAgICB1bnNpZ25lZCBjaGFpbl9sZW5ndGggPSBzLT5tYXhfY2hhaW5fbGVuZ3RoOy8qIG1heCBoYXNoIGNoYWluIGxlbmd0aCAqLwotICAgIHJlZ2lzdGVyIEJ5dGVmICpzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQ7IC8qIGN1cnJlbnQgc3RyaW5nICovCi0gICAgcmVnaXN0ZXIgQnl0ZWYgKm1hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2hlZCBzdHJpbmcgKi8KLSAgICByZWdpc3RlciBpbnQgbGVuOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IG1hdGNoICovCi0gICAgaW50IGJlc3RfbGVuID0gcy0+cHJldl9sZW5ndGg7ICAgICAgICAgICAgICAvKiBiZXN0IG1hdGNoIGxlbmd0aCBzbyBmYXIgKi8KLSAgICBpbnQgbmljZV9tYXRjaCA9IHMtPm5pY2VfbWF0Y2g7ICAgICAgICAgICAgIC8qIHN0b3AgaWYgbWF0Y2ggbG9uZyBlbm91Z2ggKi8KLSAgICBJUG9zIGxpbWl0ID0gcy0+c3Ryc3RhcnQgPiAoSVBvcylNQVhfRElTVChzKSA/Ci0gICAgICAgIHMtPnN0cnN0YXJ0IC0gKElQb3MpTUFYX0RJU1QocykgOiBOSUw7Ci0gICAgLyogU3RvcCB3aGVuIGN1cl9tYXRjaCBiZWNvbWVzIDw9IGxpbWl0LiBUbyBzaW1wbGlmeSB0aGUgY29kZSwKLSAgICAgKiB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nIG9mIHdpbmRvdyBpbmRleCAwLgotICAgICAqLwotICAgIFBvc2YgKnByZXYgPSBzLT5wcmV2OwotICAgIHVJbnQgd21hc2sgPSBzLT53X21hc2s7Ci0KLSNpZmRlZiBVTkFMSUdORURfT0sKLSAgICAvKiBDb21wYXJlIHR3byBieXRlcyBhdCBhIHRpbWUuIE5vdGU6IHRoaXMgaXMgbm90IGFsd2F5cyBiZW5lZmljaWFsLgotICAgICAqIFRyeSB3aXRoIGFuZCB3aXRob3V0IC1EVU5BTElHTkVEX09LIHRvIGNoZWNrLgotICAgICAqLwotICAgIHJlZ2lzdGVyIEJ5dGVmICpzdHJlbmQgPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIE1BWF9NQVRDSCAtIDE7Ci0gICAgcmVnaXN0ZXIgdXNoIHNjYW5fc3RhcnQgPSAqKHVzaGYqKXNjYW47Ci0gICAgcmVnaXN0ZXIgdXNoIHNjYW5fZW5kICAgPSAqKHVzaGYqKShzY2FuK2Jlc3RfbGVuLTEpOwotI2Vsc2UKLSAgICByZWdpc3RlciBCeXRlZiAqc3RyZW5kID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQgKyBNQVhfTUFUQ0g7Ci0gICAgcmVnaXN0ZXIgQnl0ZSBzY2FuX2VuZDEgID0gc2NhbltiZXN0X2xlbi0xXTsKLSAgICByZWdpc3RlciBCeXRlIHNjYW5fZW5kICAgPSBzY2FuW2Jlc3RfbGVuXTsKLSNlbmRpZgotCi0gICAgLyogVGhlIGNvZGUgaXMgb3B0aW1pemVkIGZvciBIQVNIX0JJVFMgPj0gOCBhbmQgTUFYX01BVENILTIgbXVsdGlwbGUgb2YgMTYuCi0gICAgICogSXQgaXMgZWFzeSB0byBnZXQgcmlkIG9mIHRoaXMgb3B0aW1pemF0aW9uIGlmIG5lY2Vzc2FyeS4KLSAgICAgKi8KLSAgICBBc3NlcnQocy0+aGFzaF9iaXRzID49IDggJiYgTUFYX01BVENIID09IDI1OCwgIkNvZGUgdG9vIGNsZXZlciIpOwotCi0gICAgLyogRG8gbm90IHdhc3RlIHRvbyBtdWNoIHRpbWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgZ29vZCBtYXRjaDogKi8KLSAgICBpZiAocy0+cHJldl9sZW5ndGggPj0gcy0+Z29vZF9tYXRjaCkgewotICAgICAgICBjaGFpbl9sZW5ndGggPj49IDI7Ci0gICAgfQotICAgIC8qIERvIG5vdCBsb29rIGZvciBtYXRjaGVzIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4gVGhpcyBpcyBuZWNlc3NhcnkKLSAgICAgKiB0byBtYWtlIGRlZmxhdGUgZGV0ZXJtaW5pc3RpYy4KLSAgICAgKi8KLSAgICBpZiAoKHVJbnQpbmljZV9tYXRjaCA+IHMtPmxvb2thaGVhZCkgbmljZV9tYXRjaCA9IHMtPmxvb2thaGVhZDsKLQotICAgIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsICJuZWVkIGxvb2thaGVhZCIpOwotCi0gICAgZG8gewotICAgICAgICBBc3NlcnQoY3VyX21hdGNoIDwgcy0+c3Ryc3RhcnQsICJubyBmdXR1cmUiKTsKLSAgICAgICAgbWF0Y2ggPSBzLT53aW5kb3cgKyBjdXJfbWF0Y2g7Ci0KLSAgICAgICAgLyogU2tpcCB0byBuZXh0IG1hdGNoIGlmIHRoZSBtYXRjaCBsZW5ndGggY2Fubm90IGluY3JlYXNlCi0gICAgICAgICAqIG9yIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDIuICBOb3RlIHRoYXQgdGhlIGNoZWNrcyBiZWxvdwotICAgICAgICAgKiBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IG9jY3VyIG9jY2FzaW9uYWxseSBmb3IgcGVyZm9ybWFuY2UKLSAgICAgICAgICogcmVhc29ucy4gIFRoZXJlZm9yZSB1bmluaXRpYWxpemVkIG1lbW9yeSB3aWxsIGJlIGFjY2Vzc2VkLCBhbmQKLSAgICAgICAgICogY29uZGl0aW9uYWwganVtcHMgd2lsbCBiZSBtYWRlIHRoYXQgZGVwZW5kIG9uIHRob3NlIHZhbHVlcy4KLSAgICAgICAgICogSG93ZXZlciB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaCBpcyBsaW1pdGVkIHRvIHRoZSBsb29rYWhlYWQsIHNvCi0gICAgICAgICAqIHRoZSBvdXRwdXQgb2YgZGVmbGF0ZSBpcyBub3QgYWZmZWN0ZWQgYnkgdGhlIHVuaW5pdGlhbGl6ZWQgdmFsdWVzLgotICAgICAgICAgKi8KLSNpZiAoZGVmaW5lZChVTkFMSUdORURfT0spICYmIE1BWF9NQVRDSCA9PSAyNTgpCi0gICAgICAgIC8qIFRoaXMgY29kZSBhc3N1bWVzIHNpemVvZih1bnNpZ25lZCBzaG9ydCkgPT0gMi4gRG8gbm90IHVzZQotICAgICAgICAgKiBVTkFMSUdORURfT0sgaWYgeW91ciBjb21waWxlciB1c2VzIGEgZGlmZmVyZW50IHNpemUuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoKih1c2hmKikobWF0Y2grYmVzdF9sZW4tMSkgIT0gc2Nhbl9lbmQgfHwKLSAgICAgICAgICAgICoodXNoZiopbWF0Y2ggIT0gc2Nhbl9zdGFydCkgY29udGludWU7Ci0KLSAgICAgICAgLyogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXkgYXJlCi0gICAgICAgICAqIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdCB0aGUgaGFzaCBrZXlzCi0gICAgICAgICAqIGFyZSBlcXVhbCBhbmQgdGhhdCBIQVNIX0JJVFMgPj0gOC4gQ29tcGFyZSAyIGJ5dGVzIGF0IGEgdGltZSBhdAotICAgICAgICAgKiBzdHJzdGFydCszLCArNSwgLi4uIHVwIHRvIHN0cnN0YXJ0KzI1Ny4gV2UgY2hlY2sgZm9yIGluc3VmZmljaWVudAotICAgICAgICAgKiBsb29rYWhlYWQgb25seSBldmVyeSA0dGggY29tcGFyaXNvbjsgdGhlIDEyOHRoIGNoZWNrIHdpbGwgYmUgbWFkZQotICAgICAgICAgKiBhdCBzdHJzdGFydCsyNTcuIElmIE1BWF9NQVRDSC0yIGlzIG5vdCBhIG11bHRpcGxlIG9mIDgsIGl0IGlzCi0gICAgICAgICAqIG5lY2Vzc2FyeSB0byBwdXQgbW9yZSBndWFyZCBieXRlcyBhdCB0aGUgZW5kIG9mIHRoZSB3aW5kb3csIG9yCi0gICAgICAgICAqIHRvIGNoZWNrIG1vcmUgb2Z0ZW4gZm9yIGluc3VmZmljaWVudCBsb29rYWhlYWQuCi0gICAgICAgICAqLwotICAgICAgICBBc3NlcnQoc2NhblsyXSA9PSBtYXRjaFsyXSwgInNjYW5bMl0/Iik7Ci0gICAgICAgIHNjYW4rKywgbWF0Y2grKzsKLSAgICAgICAgZG8gewotICAgICAgICB9IHdoaWxlICgqKHVzaGYqKShzY2FuKz0yKSA9PSAqKHVzaGYqKShtYXRjaCs9MikgJiYKLSAgICAgICAgICAgICAgICAgKih1c2hmKikoc2Nhbis9MikgPT0gKih1c2hmKikobWF0Y2grPTIpICYmCi0gICAgICAgICAgICAgICAgICoodXNoZiopKHNjYW4rPTIpID09ICoodXNoZiopKG1hdGNoKz0yKSAmJgotICAgICAgICAgICAgICAgICAqKHVzaGYqKShzY2FuKz0yKSA9PSAqKHVzaGYqKShtYXRjaCs9MikgJiYKLSAgICAgICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7Ci0gICAgICAgIC8qIFRoZSBmdW5ueSAiZG8ge30iIGdlbmVyYXRlcyBiZXR0ZXIgY29kZSBvbiBtb3N0IGNvbXBpbGVycyAqLwotCi0gICAgICAgIC8qIEhlcmUsIHNjYW4gPD0gd2luZG93K3N0cnN0YXJ0KzI1NyAqLwotICAgICAgICBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVuc2lnbmVkKShzLT53aW5kb3dfc2l6ZS0xKSwgIndpbGQgc2NhbiIpOwotICAgICAgICBpZiAoKnNjYW4gPT0gKm1hdGNoKSBzY2FuKys7Ci0KLSAgICAgICAgbGVuID0gKE1BWF9NQVRDSCAtIDEpIC0gKGludCkoc3RyZW5kLXNjYW4pOwotICAgICAgICBzY2FuID0gc3RyZW5kIC0gKE1BWF9NQVRDSC0xKTsKLQotI2Vsc2UgLyogVU5BTElHTkVEX09LICovCi0KLSAgICAgICAgaWYgKG1hdGNoW2Jlc3RfbGVuXSAgICE9IHNjYW5fZW5kICB8fAotICAgICAgICAgICAgbWF0Y2hbYmVzdF9sZW4tMV0gIT0gc2Nhbl9lbmQxIHx8Ci0gICAgICAgICAgICAqbWF0Y2ggICAgICAgICAgICAhPSAqc2NhbiAgICAgfHwKLSAgICAgICAgICAgICorK21hdGNoICAgICAgICAgICE9IHNjYW5bMV0pICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLyogVGhlIGNoZWNrIGF0IGJlc3RfbGVuLTEgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBpdCB3aWxsIGJlIG1hZGUKLSAgICAgICAgICogYWdhaW4gbGF0ZXIuIChUaGlzIGhldXJpc3RpYyBpcyBub3QgYWx3YXlzIGEgd2luLikKLSAgICAgICAgICogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXkKLSAgICAgICAgICogYXJlIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdAotICAgICAgICAgKiB0aGUgaGFzaCBrZXlzIGFyZSBlcXVhbCBhbmQgdGhhdCBIQVNIX0JJVFMgPj0gOC4KLSAgICAgICAgICovCi0gICAgICAgIHNjYW4gKz0gMiwgbWF0Y2grKzsKLSAgICAgICAgQXNzZXJ0KCpzY2FuID09ICptYXRjaCwgIm1hdGNoWzJdPyIpOwotCi0gICAgICAgIC8qIFdlIGNoZWNrIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgZXZlcnkgOHRoIGNvbXBhcmlzb247Ci0gICAgICAgICAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LgotICAgICAgICAgKi8KLSAgICAgICAgZG8gewotICAgICAgICB9IHdoaWxlICgqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKLSAgICAgICAgICAgICAgICAgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCi0gICAgICAgICAgICAgICAgICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgotICAgICAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKLSAgICAgICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7Ci0KLSAgICAgICAgQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1bnNpZ25lZCkocy0+d2luZG93X3NpemUtMSksICJ3aWxkIHNjYW4iKTsKLQotICAgICAgICBsZW4gPSBNQVhfTUFUQ0ggLSAoaW50KShzdHJlbmQgLSBzY2FuKTsKLSAgICAgICAgc2NhbiA9IHN0cmVuZCAtIE1BWF9NQVRDSDsKLQotI2VuZGlmIC8qIFVOQUxJR05FRF9PSyAqLwotCi0gICAgICAgIGlmIChsZW4gPiBiZXN0X2xlbikgewotICAgICAgICAgICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7Ci0gICAgICAgICAgICBiZXN0X2xlbiA9IGxlbjsKLSAgICAgICAgICAgIGlmIChsZW4gPj0gbmljZV9tYXRjaCkgYnJlYWs7Ci0jaWZkZWYgVU5BTElHTkVEX09LCi0gICAgICAgICAgICBzY2FuX2VuZCA9ICoodXNoZiopKHNjYW4rYmVzdF9sZW4tMSk7Ci0jZWxzZQotICAgICAgICAgICAgc2Nhbl9lbmQxICA9IHNjYW5bYmVzdF9sZW4tMV07Ci0gICAgICAgICAgICBzY2FuX2VuZCAgID0gc2NhbltiZXN0X2xlbl07Ci0jZW5kaWYKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKChjdXJfbWF0Y2ggPSBwcmV2W2N1cl9tYXRjaCAmIHdtYXNrXSkgPiBsaW1pdAotICAgICAgICAgICAgICYmIC0tY2hhaW5fbGVuZ3RoICE9IDApOwotCi0gICAgaWYgKCh1SW50KWJlc3RfbGVuIDw9IHMtPmxvb2thaGVhZCkgcmV0dXJuICh1SW50KWJlc3RfbGVuOwotICAgIHJldHVybiBzLT5sb29rYWhlYWQ7Ci19Ci0jZW5kaWYgLyogQVNNViAqLwotCi0jZWxzZSAvKiBGQVNURVNUICovCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogT3B0aW1pemVkIHZlcnNpb24gZm9yIEZBU1RFU1Qgb25seQotICovCi1sb2NhbCB1SW50IGxvbmdlc3RfbWF0Y2goCi0gICAgZGVmbGF0ZV9zdGF0ZSAqcywKLSAgICBJUG9zIGN1cl9tYXRjaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgbWF0Y2ggKi8KLXsKLSAgICByZWdpc3RlciBCeXRlZiAqc2NhbiA9IHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0OyAvKiBjdXJyZW50IHN0cmluZyAqLwotICAgIHJlZ2lzdGVyIEJ5dGVmICptYXRjaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoZWQgc3RyaW5nICovCi0gICAgcmVnaXN0ZXIgaW50IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqLwotICAgIHJlZ2lzdGVyIEJ5dGVmICpzdHJlbmQgPSBzLT53aW5kb3cgKyBzLT5zdHJzdGFydCArIE1BWF9NQVRDSDsKLQotICAgIC8qIFRoZSBjb2RlIGlzIG9wdGltaXplZCBmb3IgSEFTSF9CSVRTID49IDggYW5kIE1BWF9NQVRDSC0yIG11bHRpcGxlIG9mIDE2LgotICAgICAqIEl0IGlzIGVhc3kgdG8gZ2V0IHJpZCBvZiB0aGlzIG9wdGltaXphdGlvbiBpZiBuZWNlc3NhcnkuCi0gICAgICovCi0gICAgQXNzZXJ0KHMtPmhhc2hfYml0cyA+PSA4ICYmIE1BWF9NQVRDSCA9PSAyNTgsICJDb2RlIHRvbyBjbGV2ZXIiKTsKLQotICAgIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplLU1JTl9MT09LQUhFQUQsICJuZWVkIGxvb2thaGVhZCIpOwotCi0gICAgQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCAibm8gZnV0dXJlIik7Ci0KLSAgICBtYXRjaCA9IHMtPndpbmRvdyArIGN1cl9tYXRjaDsKLQotICAgIC8qIFJldHVybiBmYWlsdXJlIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDI6Ci0gICAgICovCi0gICAgaWYgKG1hdGNoWzBdICE9IHNjYW5bMF0gfHwgbWF0Y2hbMV0gIT0gc2NhblsxXSkgcmV0dXJuIE1JTl9NQVRDSC0xOwotCi0gICAgLyogVGhlIGNoZWNrIGF0IGJlc3RfbGVuLTEgY2FuIGJlIHJlbW92ZWQgYmVjYXVzZSBpdCB3aWxsIGJlIG1hZGUKLSAgICAgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKQotICAgICAqIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY29tcGFyZSBzY2FuWzJdIGFuZCBtYXRjaFsyXSBzaW5jZSB0aGV5Ci0gICAgICogYXJlIGFsd2F5cyBlcXVhbCB3aGVuIHRoZSBvdGhlciBieXRlcyBtYXRjaCwgZ2l2ZW4gdGhhdAotICAgICAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LgotICAgICAqLwotICAgIHNjYW4gKz0gMiwgbWF0Y2ggKz0gMjsKLSAgICBBc3NlcnQoKnNjYW4gPT0gKm1hdGNoLCAibWF0Y2hbMl0/Iik7Ci0KLSAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uOwotICAgICAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LgotICAgICAqLwotICAgIGRvIHsKLSAgICB9IHdoaWxlICgqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKLSAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKLSAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKLSAgICAgICAgICAgICAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKLSAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKLQotICAgIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7Ci0KLSAgICBsZW4gPSBNQVhfTUFUQ0ggLSAoaW50KShzdHJlbmQgLSBzY2FuKTsKLQotICAgIGlmIChsZW4gPCBNSU5fTUFUQ0gpIHJldHVybiBNSU5fTUFUQ0ggLSAxOwotCi0gICAgcy0+bWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7Ci0gICAgcmV0dXJuICh1SW50KWxlbiA8PSBzLT5sb29rYWhlYWQgPyAodUludClsZW4gOiBzLT5sb29rYWhlYWQ7Ci19Ci0KLSNlbmRpZiAvKiBGQVNURVNUICovCi0KLSNpZmRlZiBERUJVRwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDaGVjayB0aGF0IHRoZSBtYXRjaCBhdCBtYXRjaF9zdGFydCBpcyBpbmRlZWQgYSBtYXRjaC4KLSAqLwotbG9jYWwgdm9pZCBjaGVja19tYXRjaCgKLSAgICBkZWZsYXRlX3N0YXRlICpzLAotICAgIElQb3Mgc3RhcnQsIElQb3MgbWF0Y2gsCi0gICAgaW50IGxlbmd0aCkKLXsKLSAgICAvKiBjaGVjayB0aGF0IHRoZSBtYXRjaCBpcyBpbmRlZWQgYSBtYXRjaCAqLwotICAgIGlmICh6bWVtY21wKHMtPndpbmRvdyArIG1hdGNoLAotICAgICAgICAgICAgICAgIHMtPndpbmRvdyArIHN0YXJ0LCBsZW5ndGgpICE9IEVRVUFMKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiIHN0YXJ0ICV1LCBtYXRjaCAldSwgbGVuZ3RoICVkXG4iLAotICAgICAgICAgICAgICAgIHN0YXJ0LCBtYXRjaCwgbGVuZ3RoKTsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlYyVjIiwgcy0+d2luZG93W21hdGNoKytdLCBzLT53aW5kb3dbc3RhcnQrK10pOwotICAgICAgICB9IHdoaWxlICgtLWxlbmd0aCAhPSAwKTsKLSAgICAgICAgel9lcnJvcigiaW52YWxpZCBtYXRjaCIpOwotICAgIH0KLSAgICBpZiAoel92ZXJib3NlID4gMSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiXFxbJWQsJWRdIiwgc3RhcnQtbWF0Y2gsIGxlbmd0aCk7Ci0gICAgICAgIGRvIHsgcHV0YyhzLT53aW5kb3dbc3RhcnQrK10sIHN0ZGVycik7IH0gd2hpbGUgKC0tbGVuZ3RoICE9IDApOwotICAgIH0KLX0KLSNlbHNlCi0jICBkZWZpbmUgY2hlY2tfbWF0Y2gocywgc3RhcnQsIG1hdGNoLCBsZW5ndGgpCi0jZW5kaWYgLyogREVCVUcgKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBGaWxsIHRoZSB3aW5kb3cgd2hlbiB0aGUgbG9va2FoZWFkIGJlY29tZXMgaW5zdWZmaWNpZW50LgotICogVXBkYXRlcyBzdHJzdGFydCBhbmQgbG9va2FoZWFkLgotICoKLSAqIElOIGFzc2VydGlvbjogbG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRAotICogT1VUIGFzc2VydGlvbnM6IHN0cnN0YXJ0IDw9IHdpbmRvd19zaXplLU1JTl9MT09LQUhFQUQKLSAqICAgIEF0IGxlYXN0IG9uZSBieXRlIGhhcyBiZWVuIHJlYWQsIG9yIGF2YWlsX2luID09IDA7IHJlYWRzIGFyZQotICogICAgcGVyZm9ybWVkIGZvciBhdCBsZWFzdCB0d28gYnl0ZXMgKHJlcXVpcmVkIGZvciB0aGUgemlwIHRyYW5zbGF0ZV9lb2wKLSAqICAgIG9wdGlvbiAtLSBub3Qgc3VwcG9ydGVkIGhlcmUpLgotICovCi1sb2NhbCB2b2lkIGZpbGxfd2luZG93KAotICAgIGRlZmxhdGVfc3RhdGUgKnMpCi17Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgbiwgbTsKLSAgICByZWdpc3RlciBQb3NmICpwOwotICAgIHVuc2lnbmVkIG1vcmU7ICAgIC8qIEFtb3VudCBvZiBmcmVlIHNwYWNlIGF0IHRoZSBlbmQgb2YgdGhlIHdpbmRvdy4gKi8KLSAgICB1SW50IHdzaXplID0gcy0+d19zaXplOwotCi0gICAgQXNzZXJ0KHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQsICJhbHJlYWR5IGVub3VnaCBsb29rYWhlYWQiKTsKLQotICAgIGRvIHsKLSAgICAgICAgbW9yZSA9ICh1bnNpZ25lZCkocy0+d2luZG93X3NpemUgLSh1bGcpcy0+bG9va2FoZWFkIC0odWxnKXMtPnN0cnN0YXJ0KTsKLQotICAgICAgICAvKiBEZWFsIHdpdGggIUAjJCUgNjRLIGxpbWl0OiAqLwotICAgICAgICBpZiAoc2l6ZW9mKGludCkgPD0gMikgewotICAgICAgICAgICAgaWYgKG1vcmUgPT0gMCAmJiBzLT5zdHJzdGFydCA9PSAwICYmIHMtPmxvb2thaGVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbW9yZSA9IHdzaXplOwotCi0gICAgICAgICAgICB9IGVsc2UgaWYgKG1vcmUgPT0gKHVuc2lnbmVkKSgtMSkpIHsKLSAgICAgICAgICAgICAgICAvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWYKLSAgICAgICAgICAgICAgICAgKiBzdHJzdGFydCA9PSAwICYmIGxvb2thaGVhZCA9PSAxIChpbnB1dCBkb25lIGEgYnl0ZSBhdCB0aW1lKQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIG1vcmUtLTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIElmIHRoZSB3aW5kb3cgaXMgYWxtb3N0IGZ1bGwgYW5kIHRoZXJlIGlzIGluc3VmZmljaWVudCBsb29rYWhlYWQsCi0gICAgICAgICAqIG1vdmUgdGhlIHVwcGVyIGhhbGYgdG8gdGhlIGxvd2VyIG9uZSB0byBtYWtlIHJvb20gaW4gdGhlIHVwcGVyIGhhbGYuCi0gICAgICAgICAqLwotICAgICAgICBpZiAocy0+c3Ryc3RhcnQgPj0gd3NpemUrTUFYX0RJU1QocykpIHsKLQotICAgICAgICAgICAgem1lbWNweShzLT53aW5kb3csIHMtPndpbmRvdyt3c2l6ZSwgKHVuc2lnbmVkKXdzaXplKTsKLSAgICAgICAgICAgIHMtPm1hdGNoX3N0YXJ0IC09IHdzaXplOwotICAgICAgICAgICAgcy0+c3Ryc3RhcnQgICAgLT0gd3NpemU7IC8qIHdlIG5vdyBoYXZlIHN0cnN0YXJ0ID49IE1BWF9ESVNUICovCi0gICAgICAgICAgICBzLT5ibG9ja19zdGFydCAtPSAobG9uZykgd3NpemU7Ci0KLSAgICAgICAgICAgIC8qIFNsaWRlIHRoZSBoYXNoIHRhYmxlIChjb3VsZCBiZSBhdm9pZGVkIHdpdGggMzIgYml0IHZhbHVlcwotICAgICAgICAgICAgICAgYXQgdGhlIGV4cGVuc2Ugb2YgbWVtb3J5IHVzYWdlKS4gV2Ugc2xpZGUgZXZlbiB3aGVuIGxldmVsID09IDAKLSAgICAgICAgICAgICAgIHRvIGtlZXAgdGhlIGhhc2ggdGFibGUgY29uc2lzdGVudCBpZiB3ZSBzd2l0Y2ggYmFjayB0byBsZXZlbCA+IDAKLSAgICAgICAgICAgICAgIGxhdGVyLiAoVXNpbmcgbGV2ZWwgMCBwZXJtYW5lbnRseSBpcyBub3QgYW4gb3B0aW1hbCB1c2FnZSBvZgotICAgICAgICAgICAgICAgemxpYiwgc28gd2UgZG9uJ3QgY2FyZSBhYm91dCB0aGlzIHBhdGhvbG9naWNhbCBjYXNlLikKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgbiA9IHMtPmhhc2hfc2l6ZTsKLSAgICAgICAgICAgIHAgPSAmcy0+aGVhZFtuXTsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBtID0gKi0tcDsKLSAgICAgICAgICAgICAgICAqcCA9IChQb3MpKG0gPj0gd3NpemUgPyBtLXdzaXplIDogTklMKTsKLSAgICAgICAgICAgIH0gd2hpbGUgKC0tbik7Ci0KLSAgICAgICAgICAgIG4gPSB3c2l6ZTsKLSNpZm5kZWYgRkFTVEVTVAotICAgICAgICAgICAgcCA9ICZzLT5wcmV2W25dOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIG0gPSAqLS1wOwotICAgICAgICAgICAgICAgICpwID0gKFBvcykobSA+PSB3c2l6ZSA/IG0td3NpemUgOiBOSUwpOwotICAgICAgICAgICAgICAgIC8qIElmIG4gaXMgbm90IG9uIGFueSBoYXNoIGNoYWluLCBwcmV2W25dIGlzIGdhcmJhZ2UgYnV0Ci0gICAgICAgICAgICAgICAgICogaXRzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgdXNlZC4KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIH0gd2hpbGUgKC0tbik7Ci0jZW5kaWYKLSAgICAgICAgICAgIG1vcmUgKz0gd3NpemU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHMtPnN0cm0tPmF2YWlsX2luID09IDApIGJyZWFrOwotCi0gICAgICAgIC8qIElmIHRoZXJlIHdhcyBubyBzbGlkaW5nOgotICAgICAgICAgKiAgICBzdHJzdGFydCA8PSBXU0laRStNQVhfRElTVC0xICYmIGxvb2thaGVhZCA8PSBNSU5fTE9PS0FIRUFEIC0gMSAmJgotICAgICAgICAgKiAgICBtb3JlID09IHdpbmRvd19zaXplIC0gbG9va2FoZWFkIC0gc3Ryc3RhcnQKLSAgICAgICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIChNSU5fTE9PS0FIRUFELTEgKyBXU0laRSArIE1BWF9ESVNULTEpCi0gICAgICAgICAqID0+IG1vcmUgPj0gd2luZG93X3NpemUgLSAyKldTSVpFICsgMgotICAgICAgICAgKiBJbiB0aGUgQklHX01FTSBvciBNTUFQIGNhc2UgKG5vdCB5ZXQgc3VwcG9ydGVkKSwKLSAgICAgICAgICogICB3aW5kb3dfc2l6ZSA9PSBpbnB1dF9zaXplICsgTUlOX0xPT0tBSEVBRCAgJiYKLSAgICAgICAgICogICBzdHJzdGFydCArIHMtPmxvb2thaGVhZCA8PSBpbnB1dF9zaXplID0+IG1vcmUgPj0gTUlOX0xPT0tBSEVBRC4KLSAgICAgICAgICogT3RoZXJ3aXNlLCB3aW5kb3dfc2l6ZSA9PSAyKldTSVpFIHNvIG1vcmUgPj0gMi4KLSAgICAgICAgICogSWYgdGhlcmUgd2FzIHNsaWRpbmcsIG1vcmUgPj0gV1NJWkUuIFNvIGluIGFsbCBjYXNlcywgbW9yZSA+PSAyLgotICAgICAgICAgKi8KLSAgICAgICAgQXNzZXJ0KG1vcmUgPj0gMiwgIm1vcmUgPCAyIik7Ci0KLSAgICAgICAgbiA9IHJlYWRfYnVmKHMtPnN0cm0sIHMtPndpbmRvdyArIHMtPnN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkLCBtb3JlKTsKLSAgICAgICAgcy0+bG9va2FoZWFkICs9IG47Ci0KLSAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgaGFzaCB2YWx1ZSBub3cgdGhhdCB3ZSBoYXZlIHNvbWUgaW5wdXQ6ICovCi0gICAgICAgIGlmIChzLT5sb29rYWhlYWQgKyBzLT5pbnNlcnQgPj0gTUlOX01BVENIKSB7Ci0gICAgICAgICAgICB1SW50IHN0ciA9IHMtPnN0cnN0YXJ0IC0gcy0+aW5zZXJ0OwotICAgICAgICAgICAgcy0+aW5zX2ggPSBzLT53aW5kb3dbc3RyXTsKLSAgICAgICAgICAgIFVQREFURV9IQVNIKHMsIHMtPmluc19oLCBzLT53aW5kb3dbc3RyICsgMV0pOwotI2lmIE1JTl9NQVRDSCAhPSAzCi0gICAgICAgICAgICBDYWxsIFVQREFURV9IQVNIKCkgTUlOX01BVENILTMgbW9yZSB0aW1lcwotI2VuZGlmCi0gICAgICAgICAgICB3aGlsZSAocy0+aW5zZXJ0KSB7Ci0gICAgICAgICAgICAgICAgVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOwotI2lmbmRlZiBGQVNURVNUCi0gICAgICAgICAgICAgICAgcy0+cHJldltzdHIgJiBzLT53X21hc2tdID0gcy0+aGVhZFtzLT5pbnNfaF07Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBzLT5oZWFkW3MtPmluc19oXSA9IChQb3Mpc3RyOwotICAgICAgICAgICAgICAgIHN0cisrOwotICAgICAgICAgICAgICAgIHMtPmluc2VydC0tOwotICAgICAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgKyBzLT5pbnNlcnQgPCBNSU5fTUFUQ0gpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIElmIHRoZSB3aG9sZSBpbnB1dCBoYXMgbGVzcyB0aGFuIE1JTl9NQVRDSCBieXRlcywgaW5zX2ggaXMgZ2FyYmFnZSwKLSAgICAgICAgICogYnV0IHRoaXMgaXMgbm90IGltcG9ydGFudCBzaW5jZSBvbmx5IGxpdGVyYWwgYnl0ZXMgd2lsbCBiZSBlbWl0dGVkLgotICAgICAgICAgKi8KLQotICAgIH0gd2hpbGUgKHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgcy0+c3RybS0+YXZhaWxfaW4gIT0gMCk7Ci0KLSAgICAvKiBJZiB0aGUgV0lOX0lOSVQgYnl0ZXMgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBkYXRhIGhhdmUgbmV2ZXIgYmVlbgotICAgICAqIHdyaXR0ZW4sIHRoZW4gemVybyB0aG9zZSBieXRlcyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgcmVwb3J0cyBvZgotICAgICAqIHRoZSB1c2Ugb2YgdW5pbml0aWFsaXplZCAob3IgdW5pbml0aWFsaXNlZCBhcyBKdWxpYW4gd3JpdGVzKSBieXRlcyBieQotICAgICAqIHRoZSBsb25nZXN0IG1hdGNoIHJvdXRpbmVzLiAgVXBkYXRlIHRoZSBoaWdoIHdhdGVyIG1hcmsgZm9yIHRoZSBuZXh0Ci0gICAgICogdGltZSB0aHJvdWdoIGhlcmUuICBXSU5fSU5JVCBpcyBzZXQgdG8gTUFYX01BVENIIHNpbmNlIHRoZSBsb25nZXN0IG1hdGNoCi0gICAgICogcm91dGluZXMgYWxsb3cgc2Nhbm5pbmcgdG8gc3Ryc3RhcnQgKyBNQVhfTUFUQ0gsIGlnbm9yaW5nIGxvb2thaGVhZC4KLSAgICAgKi8KLSAgICBpZiAocy0+aGlnaF93YXRlciA8IHMtPndpbmRvd19zaXplKSB7Ci0gICAgICAgIHVsZyBjdXJyID0gcy0+c3Ryc3RhcnQgKyAodWxnKShzLT5sb29rYWhlYWQpOwotICAgICAgICB1bGcgaW5pdDsKLQotICAgICAgICBpZiAocy0+aGlnaF93YXRlciA8IGN1cnIpIHsKLSAgICAgICAgICAgIC8qIFByZXZpb3VzIGhpZ2ggd2F0ZXIgbWFyayBiZWxvdyBjdXJyZW50IGRhdGEgLS0gemVybyBXSU5fSU5JVAotICAgICAgICAgICAgICogYnl0ZXMgb3IgdXAgdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGluaXQgPSBzLT53aW5kb3dfc2l6ZSAtIGN1cnI7Ci0gICAgICAgICAgICBpZiAoaW5pdCA+IFdJTl9JTklUKQotICAgICAgICAgICAgICAgIGluaXQgPSBXSU5fSU5JVDsKLSAgICAgICAgICAgIHptZW16ZXJvKHMtPndpbmRvdyArIGN1cnIsICh1bnNpZ25lZClpbml0KTsKLSAgICAgICAgICAgIHMtPmhpZ2hfd2F0ZXIgPSBjdXJyICsgaW5pdDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzLT5oaWdoX3dhdGVyIDwgKHVsZyljdXJyICsgV0lOX0lOSVQpIHsKLSAgICAgICAgICAgIC8qIEhpZ2ggd2F0ZXIgbWFyayBhdCBvciBhYm92ZSBjdXJyZW50IGRhdGEsIGJ1dCBiZWxvdyBjdXJyZW50IGRhdGEKLSAgICAgICAgICAgICAqIHBsdXMgV0lOX0lOSVQgLS0gemVybyBvdXQgdG8gY3VycmVudCBkYXRhIHBsdXMgV0lOX0lOSVQsIG9yIHVwCi0gICAgICAgICAgICAgKiB0byBlbmQgb2Ygd2luZG93LCB3aGljaGV2ZXIgaXMgbGVzcy4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaW5pdCA9ICh1bGcpY3VyciArIFdJTl9JTklUIC0gcy0+aGlnaF93YXRlcjsKLSAgICAgICAgICAgIGlmIChpbml0ID4gcy0+d2luZG93X3NpemUgLSBzLT5oaWdoX3dhdGVyKQotICAgICAgICAgICAgICAgIGluaXQgPSBzLT53aW5kb3dfc2l6ZSAtIHMtPmhpZ2hfd2F0ZXI7Ci0gICAgICAgICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBzLT5oaWdoX3dhdGVyLCAodW5zaWduZWQpaW5pdCk7Ci0gICAgICAgICAgICBzLT5oaWdoX3dhdGVyICs9IGluaXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBc3NlcnQoKHVsZylzLT5zdHJzdGFydCA8PSBzLT53aW5kb3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQsCi0gICAgICAgICAgICJub3QgZW5vdWdoIHJvb20gZm9yIHNlYXJjaCIpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEZsdXNoIHRoZSBjdXJyZW50IGJsb2NrLCB3aXRoIGdpdmVuIGVuZC1vZi1maWxlIGZsYWcuCi0gKiBJTiBhc3NlcnRpb246IHN0cnN0YXJ0IGlzIHNldCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IG1hdGNoLgotICovCi0jZGVmaW5lIEZMVVNIX0JMT0NLX09OTFkocywgbGFzdCkgeyBcCi0gICBfdHJfZmx1c2hfYmxvY2socywgKHMtPmJsb2NrX3N0YXJ0ID49IDBMID8gXAotICAgICAgICAgICAgICAgICAgIChjaGFyZiAqKSZzLT53aW5kb3dbKHVuc2lnbmVkKXMtPmJsb2NrX3N0YXJ0XSA6IFwKLSAgICAgICAgICAgICAgICAgICAoY2hhcmYgKilaX05VTEwpLCBcCi0gICAgICAgICAgICAgICAgKHVsZykoKGxvbmcpcy0+c3Ryc3RhcnQgLSBzLT5ibG9ja19zdGFydCksIFwKLSAgICAgICAgICAgICAgICAobGFzdCkpOyBcCi0gICBzLT5ibG9ja19zdGFydCA9IHMtPnN0cnN0YXJ0OyBcCi0gICBmbHVzaF9wZW5kaW5nKHMtPnN0cm0pOyBcCi0gICBUcmFjZXYoKHN0ZGVyciwiW0ZMVVNIXSIpKTsgXAotfQotCi0vKiBTYW1lIGJ1dCBmb3JjZSBwcmVtYXR1cmUgZXhpdCBpZiBuZWNlc3NhcnkuICovCi0jZGVmaW5lIEZMVVNIX0JMT0NLKHMsIGxhc3QpIHsgXAotICAgRkxVU0hfQkxPQ0tfT05MWShzLCBsYXN0KTsgXAotICAgaWYgKHMtPnN0cm0tPmF2YWlsX291dCA9PSAwKSByZXR1cm4gKGxhc3QpID8gZmluaXNoX3N0YXJ0ZWQgOiBuZWVkX21vcmU7IFwKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDb3B5IHdpdGhvdXQgY29tcHJlc3Npb24gYXMgbXVjaCBhcyBwb3NzaWJsZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIHJldHVybgotICogdGhlIGN1cnJlbnQgYmxvY2sgc3RhdGUuCi0gKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGluc2VydCBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBzaW5jZQotICogdW5jb21wcmVzc2libGUgZGF0YSBpcyBwcm9iYWJseSBub3QgdXNlZnVsLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQKLSAqIG9ubHkgZm9yIHRoZSBsZXZlbD0wIGNvbXByZXNzaW9uIG9wdGlvbi4KLSAqIE5PVEU6IHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9wdGltaXplZCB0byBhdm9pZCBleHRyYSBjb3B5aW5nIGZyb20KLSAqIHdpbmRvdyB0byBwZW5kaW5nX2J1Zi4KLSAqLwotbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9zdG9yZWQoCi0gICAgZGVmbGF0ZV9zdGF0ZSAqcywKLSAgICBpbnQgZmx1c2gpCi17Ci0gICAgLyogU3RvcmVkIGJsb2NrcyBhcmUgbGltaXRlZCB0byAweGZmZmYgYnl0ZXMsIHBlbmRpbmdfYnVmIGlzIGxpbWl0ZWQKLSAgICAgKiB0byBwZW5kaW5nX2J1Zl9zaXplLCBhbmQgZWFjaCBzdG9yZWQgYmxvY2sgaGFzIGEgNSBieXRlIGhlYWRlcjoKLSAgICAgKi8KLSAgICB1bGcgbWF4X2Jsb2NrX3NpemUgPSAweGZmZmY7Ci0gICAgdWxnIG1heF9zdGFydDsKLQotICAgIGlmIChtYXhfYmxvY2tfc2l6ZSA+IHMtPnBlbmRpbmdfYnVmX3NpemUgLSA1KSB7Ci0gICAgICAgIG1heF9ibG9ja19zaXplID0gcy0+cGVuZGluZ19idWZfc2l6ZSAtIDU7Ci0gICAgfQotCi0gICAgLyogQ29weSBhcyBtdWNoIGFzIHBvc3NpYmxlIGZyb20gaW5wdXQgdG8gb3V0cHV0OiAqLwotICAgIGZvciAoOzspIHsKLSAgICAgICAgLyogRmlsbCB0aGUgd2luZG93IGFzIG11Y2ggYXMgcG9zc2libGU6ICovCi0gICAgICAgIGlmIChzLT5sb29rYWhlYWQgPD0gMSkgewotCi0gICAgICAgICAgICBBc3NlcnQocy0+c3Ryc3RhcnQgPCBzLT53X3NpemUrTUFYX0RJU1QocykgfHwKLSAgICAgICAgICAgICAgICAgICBzLT5ibG9ja19zdGFydCA+PSAobG9uZylzLT53X3NpemUsICJzbGlkZSB0b28gbGF0ZSIpOwotCi0gICAgICAgICAgICBmaWxsX3dpbmRvdyhzKTsKLSAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCAmJiBmbHVzaCA9PSBaX05PX0ZMVVNIKSByZXR1cm4gbmVlZF9tb3JlOwotCi0gICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqLwotICAgICAgICB9Ci0gICAgICAgIEFzc2VydChzLT5ibG9ja19zdGFydCA+PSAwTCwgImJsb2NrIGdvbmUiKTsKLQotICAgICAgICBzLT5zdHJzdGFydCArPSBzLT5sb29rYWhlYWQ7Ci0gICAgICAgIHMtPmxvb2thaGVhZCA9IDA7Ci0KLSAgICAgICAgLyogRW1pdCBhIHN0b3JlZCBibG9jayBpZiBwZW5kaW5nX2J1ZiB3aWxsIGJlIGZ1bGw6ICovCi0gICAgICAgIG1heF9zdGFydCA9IHMtPmJsb2NrX3N0YXJ0ICsgbWF4X2Jsb2NrX3NpemU7Ci0gICAgICAgIGlmIChzLT5zdHJzdGFydCA9PSAwIHx8ICh1bGcpcy0+c3Ryc3RhcnQgPj0gbWF4X3N0YXJ0KSB7Ci0gICAgICAgICAgICAvKiBzdHJzdGFydCA9PSAwIGlzIHBvc3NpYmxlIHdoZW4gd3JhcGFyb3VuZCBvbiAxNi1iaXQgbWFjaGluZSAqLwotICAgICAgICAgICAgcy0+bG9va2FoZWFkID0gKHVJbnQpKHMtPnN0cnN0YXJ0IC0gbWF4X3N0YXJ0KTsKLSAgICAgICAgICAgIHMtPnN0cnN0YXJ0ID0gKHVJbnQpbWF4X3N0YXJ0OwotICAgICAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7Ci0gICAgICAgIH0KLSAgICAgICAgLyogRmx1c2ggaWYgd2UgbWF5IGhhdmUgdG8gc2xpZGUsIG90aGVyd2lzZSBibG9ja19zdGFydCBtYXkgYmVjb21lCi0gICAgICAgICAqIG5lZ2F0aXZlIGFuZCB0aGUgZGF0YSB3aWxsIGJlIGdvbmU6Ci0gICAgICAgICAqLwotICAgICAgICBpZiAocy0+c3Ryc3RhcnQgLSAodUludClzLT5ibG9ja19zdGFydCA+PSBNQVhfRElTVChzKSkgewotICAgICAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcy0+aW5zZXJ0ID0gMDsKLSAgICBpZiAoZmx1c2ggPT0gWl9GSU5JU0gpIHsKLSAgICAgICAgRkxVU0hfQkxPQ0socywgMSk7Ci0gICAgICAgIHJldHVybiBmaW5pc2hfZG9uZTsKLSAgICB9Ci0gICAgaWYgKChsb25nKXMtPnN0cnN0YXJ0ID4gcy0+YmxvY2tfc3RhcnQpCi0gICAgICAgIEZMVVNIX0JMT0NLKHMsIDApOwotICAgIHJldHVybiBibG9ja19kb25lOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvbXByZXNzIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm4gdGhlIGN1cnJlbnQKLSAqIGJsb2NrIHN0YXRlLgotICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGxhenkgZXZhbHVhdGlvbiBvZiBtYXRjaGVzIGFuZCBpbnNlcnRzCi0gKiBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBvbmx5IGZvciB1bm1hdGNoZWQgc3RyaW5ncyBvciBmb3Igc2hvcnQKLSAqIG1hdGNoZXMuIEl0IGlzIHVzZWQgb25seSBmb3IgdGhlIGZhc3QgY29tcHJlc3Npb24gb3B0aW9ucy4KLSAqLwotbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9mYXN0KAotICAgIGRlZmxhdGVfc3RhdGUgKnMsCi0gICAgaW50IGZsdXNoKQotewotICAgIElQb3MgaGFzaF9oZWFkOyAgICAgICAvKiBoZWFkIG9mIHRoZSBoYXNoIGNoYWluICovCi0gICAgaW50IGJmbHVzaDsgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLwotCi0gICAgZm9yICg7OykgewotICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHQKLSAgICAgICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXMKLSAgICAgICAgICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlCi0gICAgICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guCi0gICAgICAgICAqLwotICAgICAgICBpZiAocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkgewotICAgICAgICAgICAgZmlsbF93aW5kb3cocyk7Ci0gICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PSBaX05PX0ZMVVNIKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5lZWRfbW9yZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCkgYnJlYWs7IC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCi0gICAgICAgIH0KLQotICAgICAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlCi0gICAgICAgICAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOgotICAgICAgICAgKi8KLSAgICAgICAgaGFzaF9oZWFkID0gTklMOwotICAgICAgICBpZiAocy0+bG9va2FoZWFkID49IE1JTl9NQVRDSCkgewotICAgICAgICAgICAgSU5TRVJUX1NUUklORyhzLCBzLT5zdHJzdGFydCwgaGFzaF9oZWFkKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2gsIGRpc2NhcmRpbmcgdGhvc2UgPD0gcHJldl9sZW5ndGguCi0gICAgICAgICAqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbHdheXMgbWF0Y2hfbGVuZ3RoIDwgTUlOX01BVENICi0gICAgICAgICAqLwotICAgICAgICBpZiAoaGFzaF9oZWFkICE9IE5JTCAmJiBzLT5zdHJzdGFydCAtIGhhc2hfaGVhZCA8PSBNQVhfRElTVChzKSkgewotICAgICAgICAgICAgLyogVG8gc2ltcGxpZnkgdGhlIGNvZGUsIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmcKLSAgICAgICAgICAgICAqIG9mIHdpbmRvdyBpbmRleCAwIChpbiBwYXJ0aWN1bGFyIHdlIGhhdmUgdG8gYXZvaWQgYSBtYXRjaAotICAgICAgICAgICAgICogb2YgdGhlIHN0cmluZyB3aXRoIGl0c2VsZiBhdCB0aGUgc3RhcnQgb2YgdGhlIGlucHV0IGZpbGUpLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoIChzLCBoYXNoX2hlYWQpOwotICAgICAgICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi8KLSAgICAgICAgfQotICAgICAgICBpZiAocy0+bWF0Y2hfbGVuZ3RoID49IE1JTl9NQVRDSCkgewotICAgICAgICAgICAgY2hlY2tfbWF0Y2gocywgcy0+c3Ryc3RhcnQsIHMtPm1hdGNoX3N0YXJ0LCBzLT5tYXRjaF9sZW5ndGgpOwotCi0gICAgICAgICAgICBfdHJfdGFsbHlfZGlzdChzLCBzLT5zdHJzdGFydCAtIHMtPm1hdGNoX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENILCBiZmx1c2gpOwotCi0gICAgICAgICAgICBzLT5sb29rYWhlYWQgLT0gcy0+bWF0Y2hfbGVuZ3RoOwotCi0gICAgICAgICAgICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoCi0gICAgICAgICAgICAgKiBpcyBub3QgdG9vIGxhcmdlLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLgotICAgICAgICAgICAgICovCi0jaWZuZGVmIEZBU1RFU1QKLSAgICAgICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPD0gcy0+bWF4X2luc2VydF9sZW5ndGggJiYKLSAgICAgICAgICAgICAgICBzLT5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7Ci0gICAgICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoLS07IC8qIHN0cmluZyBhdCBzdHJzdGFydCBhbHJlYWR5IGluIHRhYmxlICovCi0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICBzLT5zdHJzdGFydCsrOwotICAgICAgICAgICAgICAgICAgICBJTlNFUlRfU1RSSU5HKHMsIHMtPnN0cnN0YXJ0LCBoYXNoX2hlYWQpOwotICAgICAgICAgICAgICAgICAgICAvKiBzdHJzdGFydCBuZXZlciBleGNlZWRzIFdTSVpFLU1BWF9NQVRDSCwgc28gdGhlcmUgYXJlCi0gICAgICAgICAgICAgICAgICAgICAqIGFsd2F5cyBNSU5fTUFUQ0ggYnl0ZXMgYWhlYWQuCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tcy0+bWF0Y2hfbGVuZ3RoICE9IDApOwotICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7Ci0gICAgICAgICAgICB9IGVsc2UKLSNlbmRpZgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHMtPnN0cnN0YXJ0ICs9IHMtPm1hdGNoX2xlbmd0aDsKLSAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSAwOwotICAgICAgICAgICAgICAgIHMtPmluc19oID0gcy0+d2luZG93W3MtPnN0cnN0YXJ0XTsKLSAgICAgICAgICAgICAgICBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3MtPnN0cnN0YXJ0KzFdKTsKLSNpZiBNSU5fTUFUQ0ggIT0gMwotICAgICAgICAgICAgICAgIENhbGwgVVBEQVRFX0hBU0goKSBNSU5fTUFUQ0gtMyBtb3JlIHRpbWVzCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAvKiBJZiBsb29rYWhlYWQgPCBNSU5fTUFUQ0gsIGluc19oIGlzIGdhcmJhZ2UsIGJ1dCBpdCBkb2VzIG5vdAotICAgICAgICAgICAgICAgICAqIG1hdHRlciBzaW5jZSBpdCB3aWxsIGJlIHJlY29tcHV0ZWQgYXQgbmV4dCBkZWZsYXRlIGNhbGwuCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovCi0gICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIiVjIiwgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSkpOwotICAgICAgICAgICAgX3RyX3RhbGx5X2xpdCAocywgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSwgYmZsdXNoKTsKLSAgICAgICAgICAgIHMtPmxvb2thaGVhZC0tOwotICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmZsdXNoKSBGTFVTSF9CTE9DSyhzLCAwKTsKLSAgICB9Ci0gICAgcy0+aW5zZXJ0ID0gcy0+c3Ryc3RhcnQgPCBNSU5fTUFUQ0gtMSA/IHMtPnN0cnN0YXJ0IDogTUlOX01BVENILTE7Ci0gICAgaWYgKGZsdXNoID09IFpfRklOSVNIKSB7Ci0gICAgICAgIEZMVVNIX0JMT0NLKHMsIDEpOwotICAgICAgICByZXR1cm4gZmluaXNoX2RvbmU7Ci0gICAgfQotICAgIGlmIChzLT5sYXN0X2xpdCkKLSAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7Ci0gICAgcmV0dXJuIGJsb2NrX2RvbmU7Ci19Ci0KLSNpZm5kZWYgRkFTVEVTVAotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBTYW1lIGFzIGFib3ZlLCBidXQgYWNoaWV2ZXMgYmV0dGVyIGNvbXByZXNzaW9uLiBXZSB1c2UgYSBsYXp5Ci0gKiBldmFsdWF0aW9uIGZvciBtYXRjaGVzOiBhIG1hdGNoIGlzIGZpbmFsbHkgYWRvcHRlZCBvbmx5IGlmIHRoZXJlIGlzCi0gKiBubyBiZXR0ZXIgbWF0Y2ggYXQgdGhlIG5leHQgd2luZG93IHBvc2l0aW9uLgotICovCi1sb2NhbCBibG9ja19zdGF0ZSBkZWZsYXRlX3Nsb3coCi0gICAgZGVmbGF0ZV9zdGF0ZSAqcywKLSAgICBpbnQgZmx1c2gpCi17Ci0gICAgSVBvcyBoYXNoX2hlYWQ7ICAgICAgICAgIC8qIGhlYWQgb2YgaGFzaCBjaGFpbiAqLwotICAgIGludCBiZmx1c2g7ICAgICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi8KLQotICAgIC8qIFByb2Nlc3MgdGhlIGlucHV0IGJsb2NrLiAqLwotICAgIGZvciAoOzspIHsKLSAgICAgICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0Ci0gICAgICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0IGZpbGUuIFdlIG5lZWQgTUFYX01BVENIIGJ5dGVzCi0gICAgICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZQotICAgICAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHsKLSAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOwotICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgZmx1c2ggPT0gWl9OT19GTFVTSCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZWVkX21vcmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyogSW5zZXJ0IHRoZSBzdHJpbmcgd2luZG93W3N0cnN0YXJ0IC4uIHN0cnN0YXJ0KzJdIGluIHRoZQotICAgICAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjoKLSAgICAgICAgICovCi0gICAgICAgIGhhc2hfaGVhZCA9IE5JTDsKLSAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHsKLSAgICAgICAgICAgIElOU0VSVF9TVFJJTkcocywgcy0+c3Ryc3RhcnQsIGhhc2hfaGVhZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLgotICAgICAgICAgKi8KLSAgICAgICAgcy0+cHJldl9sZW5ndGggPSBzLT5tYXRjaF9sZW5ndGgsIHMtPnByZXZfbWF0Y2ggPSBzLT5tYXRjaF9zdGFydDsKLSAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gTUlOX01BVENILTE7Ci0KLSAgICAgICAgaWYgKGhhc2hfaGVhZCAhPSBOSUwgJiYgcy0+cHJldl9sZW5ndGggPCBzLT5tYXhfbGF6eV9tYXRjaCAmJgotICAgICAgICAgICAgcy0+c3Ryc3RhcnQgLSBoYXNoX2hlYWQgPD0gTUFYX0RJU1QocykpIHsKLSAgICAgICAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nCi0gICAgICAgICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2gKLSAgICAgICAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaCAocywgaGFzaF9oZWFkKTsKLSAgICAgICAgICAgIC8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovCi0KLSAgICAgICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPD0gNSAmJiAocy0+c3RyYXRlZ3kgPT0gWl9GSUxURVJFRAotI2lmIFRPT19GQVIgPD0gMzI3NjcKLSAgICAgICAgICAgICAgICB8fCAocy0+bWF0Y2hfbGVuZ3RoID09IE1JTl9NQVRDSCAmJgotICAgICAgICAgICAgICAgICAgICBzLT5zdHJzdGFydCAtIHMtPm1hdGNoX3N0YXJ0ID4gVE9PX0ZBUikKLSNlbmRpZgotICAgICAgICAgICAgICAgICkpIHsKLQotICAgICAgICAgICAgICAgIC8qIElmIHByZXZfbWF0Y2ggaXMgYWxzbyBNSU5fTUFUQ0gsIG1hdGNoX3N0YXJ0IGlzIGdhcmJhZ2UKLSAgICAgICAgICAgICAgICAgKiBidXQgd2Ugd2lsbCBpZ25vcmUgdGhlIGN1cnJlbnQgbWF0Y2ggYW55d2F5LgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHMtPm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudAotICAgICAgICAgKiBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHMtPnByZXZfbGVuZ3RoID49IE1JTl9NQVRDSCAmJiBzLT5tYXRjaF9sZW5ndGggPD0gcy0+cHJldl9sZW5ndGgpIHsKLSAgICAgICAgICAgIHVJbnQgbWF4X2luc2VydCA9IHMtPnN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkIC0gTUlOX01BVENIOwotICAgICAgICAgICAgLyogRG8gbm90IGluc2VydCBzdHJpbmdzIGluIGhhc2ggdGFibGUgYmV5b25kIHRoaXMuICovCi0KLSAgICAgICAgICAgIGNoZWNrX21hdGNoKHMsIHMtPnN0cnN0YXJ0LTEsIHMtPnByZXZfbWF0Y2gsIHMtPnByZXZfbGVuZ3RoKTsKLQotICAgICAgICAgICAgX3RyX3RhbGx5X2Rpc3Qocywgcy0+c3Ryc3RhcnQgLTEgLSBzLT5wcmV2X21hdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cHJldl9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7Ci0KLSAgICAgICAgICAgIC8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLgotICAgICAgICAgICAgICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuIElmIHRoZXJlIGlzIG5vdAotICAgICAgICAgICAgICogZW5vdWdoIGxvb2thaGVhZCwgdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIG5vdCBpbnNlcnRlZCBpbgotICAgICAgICAgICAgICogdGhlIGhhc2ggdGFibGUuCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHMtPmxvb2thaGVhZCAtPSBzLT5wcmV2X2xlbmd0aC0xOwotICAgICAgICAgICAgcy0+cHJldl9sZW5ndGggLT0gMjsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpZiAoKytzLT5zdHJzdGFydCA8PSBtYXhfaW5zZXJ0KSB7Ci0gICAgICAgICAgICAgICAgICAgIElOU0VSVF9TVFJJTkcocywgcy0+c3Ryc3RhcnQsIGhhc2hfaGVhZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSB3aGlsZSAoLS1zLT5wcmV2X2xlbmd0aCAhPSAwKTsKLSAgICAgICAgICAgIHMtPm1hdGNoX2F2YWlsYWJsZSA9IDA7Ci0gICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBNSU5fTUFUQ0gtMTsKLSAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7Ci0KLSAgICAgICAgICAgIGlmIChiZmx1c2gpIEZMVVNIX0JMT0NLKHMsIDApOwotCi0gICAgICAgIH0gZWxzZSBpZiAocy0+bWF0Y2hfYXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uLCBvdXRwdXQgYQotICAgICAgICAgICAgICogc2luZ2xlIGxpdGVyYWwuIElmIHRoZXJlIHdhcyBhIG1hdGNoIGJ1dCB0aGUgY3VycmVudCBtYXRjaAotICAgICAgICAgICAgICogaXMgbG9uZ2VyLCB0cnVuY2F0ZSB0aGUgcHJldmlvdXMgbWF0Y2ggdG8gYSBzaW5nbGUgbGl0ZXJhbC4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpOwotICAgICAgICAgICAgX3RyX3RhbGx5X2xpdChzLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0sIGJmbHVzaCk7Ci0gICAgICAgICAgICBpZiAoYmZsdXNoKSB7Ci0gICAgICAgICAgICAgICAgRkxVU0hfQkxPQ0tfT05MWShzLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7Ci0gICAgICAgICAgICBzLT5sb29rYWhlYWQtLTsKLSAgICAgICAgICAgIGlmIChzLT5zdHJtLT5hdmFpbF9vdXQgPT0gMCkgcmV0dXJuIG5lZWRfbW9yZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8qIFRoZXJlIGlzIG5vIHByZXZpb3VzIG1hdGNoIHRvIGNvbXBhcmUgd2l0aCwgd2FpdCBmb3IKLSAgICAgICAgICAgICAqIHRoZSBuZXh0IHN0ZXAgdG8gZGVjaWRlLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBzLT5tYXRjaF9hdmFpbGFibGUgPSAxOwotICAgICAgICAgICAgcy0+c3Ryc3RhcnQrKzsKLSAgICAgICAgICAgIHMtPmxvb2thaGVhZC0tOwotICAgICAgICB9Ci0gICAgfQotICAgIEFzc2VydCAoZmx1c2ggIT0gWl9OT19GTFVTSCwgIm5vIGZsdXNoPyIpOwotICAgIGlmIChzLT5tYXRjaF9hdmFpbGFibGUpIHsKLSAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpOwotICAgICAgICBfdHJfdGFsbHlfbGl0KHMsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSwgYmZsdXNoKTsKLSAgICAgICAgcy0+bWF0Y2hfYXZhaWxhYmxlID0gMDsKLSAgICB9Ci0gICAgcy0+aW5zZXJ0ID0gcy0+c3Ryc3RhcnQgPCBNSU5fTUFUQ0gtMSA/IHMtPnN0cnN0YXJ0IDogTUlOX01BVENILTE7Ci0gICAgaWYgKGZsdXNoID09IFpfRklOSVNIKSB7Ci0gICAgICAgIEZMVVNIX0JMT0NLKHMsIDEpOwotICAgICAgICByZXR1cm4gZmluaXNoX2RvbmU7Ci0gICAgfQotICAgIGlmIChzLT5sYXN0X2xpdCkKLSAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7Ci0gICAgcmV0dXJuIGJsb2NrX2RvbmU7Ci19Ci0jZW5kaWYgLyogRkFTVEVTVCAqLwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEZvciBaX1JMRSwgc2ltcGx5IGxvb2sgZm9yIHJ1bnMgb2YgYnl0ZXMsIGdlbmVyYXRlIG1hdGNoZXMgb25seSBvZiBkaXN0YW5jZQotICogb25lLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS4gIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mCi0gKiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBaX1JMRS4pCi0gKi8KLWxvY2FsIGJsb2NrX3N0YXRlIGRlZmxhdGVfcmxlKAotICAgIGRlZmxhdGVfc3RhdGUgKnMsCi0gICAgaW50IGZsdXNoKQotewotICAgIGludCBiZmx1c2g7ICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLwotICAgIHVJbnQgcHJldjsgICAgICAgICAgICAgIC8qIGJ5dGUgYXQgZGlzdGFuY2Ugb25lIHRvIG1hdGNoICovCi0gICAgQnl0ZWYgKnNjYW4sICpzdHJlbmQ7ICAgLyogc2NhbiBnb2VzIHVwIHRvIHN0cmVuZCBmb3IgbGVuZ3RoIG9mIHJ1biAqLwotCi0gICAgZm9yICg7OykgewotICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHQKLSAgICAgICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXMKLSAgICAgICAgICogZm9yIHRoZSBsb25nZXN0IHJ1biwgcGx1cyBvbmUgZm9yIHRoZSB1bnJvbGxlZCBsb29wLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8PSBNQVhfTUFUQ0gpIHsKLSAgICAgICAgICAgIGZpbGxfd2luZG93KHMpOwotICAgICAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA8PSBNQVhfTUFUQ0ggJiYgZmx1c2ggPT0gWl9OT19GTFVTSCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZWVkX21vcmU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocy0+bG9va2FoZWFkID09IDApIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyogU2VlIGhvdyBtYW55IHRpbWVzIHRoZSBwcmV2aW91cyBieXRlIHJlcGVhdHMgKi8KLSAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gMDsKLSAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA+PSBNSU5fTUFUQ0ggJiYgcy0+c3Ryc3RhcnQgPiAwKSB7Ci0gICAgICAgICAgICBzY2FuID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQgLSAxOwotICAgICAgICAgICAgcHJldiA9ICpzY2FuOwotICAgICAgICAgICAgaWYgKHByZXYgPT0gKisrc2NhbiAmJiBwcmV2ID09ICorK3NjYW4gJiYgcHJldiA9PSAqKytzY2FuKSB7Ci0gICAgICAgICAgICAgICAgc3RyZW5kID0gcy0+d2luZG93ICsgcy0+c3Ryc3RhcnQgKyBNQVhfTUFUQ0g7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIH0gd2hpbGUgKHByZXYgPT0gKisrc2NhbiAmJiBwcmV2ID09ICorK3NjYW4gJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ID09ICorK3NjYW4gJiYgcHJldiA9PSAqKytzY2FuICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9PSAqKytzY2FuICYmIHByZXYgPT0gKisrc2NhbiAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIHByZXYgPT0gKisrc2NhbiAmJiBwcmV2ID09ICorK3NjYW4gJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTsKLSAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBNQVhfTUFUQ0ggLSAoaW50KShzdHJlbmQgLSBzY2FuKTsKLSAgICAgICAgICAgICAgICBpZiAocy0+bWF0Y2hfbGVuZ3RoID4gcy0+bG9va2FoZWFkKQotICAgICAgICAgICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSBzLT5sb29rYWhlYWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBc3NlcnQoc2NhbiA8PSBzLT53aW5kb3crKHVJbnQpKHMtPndpbmRvd19zaXplLTEpLCAid2lsZCBzY2FuIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBFbWl0IG1hdGNoIGlmIGhhdmUgcnVuIG9mIE1JTl9NQVRDSCBvciBsb25nZXIsIGVsc2UgZW1pdCBsaXRlcmFsICovCi0gICAgICAgIGlmIChzLT5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7Ci0gICAgICAgICAgICBjaGVja19tYXRjaChzLCBzLT5zdHJzdGFydCwgcy0+c3Ryc3RhcnQgLSAxLCBzLT5tYXRjaF9sZW5ndGgpOwotCi0gICAgICAgICAgICBfdHJfdGFsbHlfZGlzdChzLCAxLCBzLT5tYXRjaF9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7Ci0KLSAgICAgICAgICAgIHMtPmxvb2thaGVhZCAtPSBzLT5tYXRjaF9sZW5ndGg7Ci0gICAgICAgICAgICBzLT5zdHJzdGFydCArPSBzLT5tYXRjaF9sZW5ndGg7Ci0gICAgICAgICAgICBzLT5tYXRjaF9sZW5ndGggPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogTm8gbWF0Y2gsIG91dHB1dCBhIGxpdGVyYWwgYnl0ZSAqLwotICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTsKLSAgICAgICAgICAgIF90cl90YWxseV9saXQgKHMsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0sIGJmbHVzaCk7Ci0gICAgICAgICAgICBzLT5sb29rYWhlYWQtLTsKLSAgICAgICAgICAgIHMtPnN0cnN0YXJ0Kys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJmbHVzaCkgRkxVU0hfQkxPQ0socywgMCk7Ci0gICAgfQotICAgIHMtPmluc2VydCA9IDA7Ci0gICAgaWYgKGZsdXNoID09IFpfRklOSVNIKSB7Ci0gICAgICAgIEZMVVNIX0JMT0NLKHMsIDEpOwotICAgICAgICByZXR1cm4gZmluaXNoX2RvbmU7Ci0gICAgfQotICAgIGlmIChzLT5sYXN0X2xpdCkKLSAgICAgICAgRkxVU0hfQkxPQ0socywgMCk7Ci0gICAgcmV0dXJuIGJsb2NrX2RvbmU7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogRm9yIFpfSFVGRk1BTl9PTkxZLCBkbyBub3QgbG9vayBmb3IgbWF0Y2hlcy4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuCi0gKiAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBIdWZmbWFuLikKLSAqLwotbG9jYWwgYmxvY2tfc3RhdGUgZGVmbGF0ZV9odWZmKAotICAgIGRlZmxhdGVfc3RhdGUgKnMsCi0gICAgaW50IGZsdXNoKQotewotICAgIGludCBiZmx1c2g7ICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLwotCi0gICAgZm9yICg7OykgewotICAgICAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgbGl0ZXJhbCB0byB3cml0ZS4gKi8KLSAgICAgICAgaWYgKHMtPmxvb2thaGVhZCA9PSAwKSB7Ci0gICAgICAgICAgICBmaWxsX3dpbmRvdyhzKTsKLSAgICAgICAgICAgIGlmIChzLT5sb29rYWhlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgIGlmIChmbHVzaCA9PSBaX05PX0ZMVVNIKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmVlZF9tb3JlOwotICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgIC8qIGZsdXNoIHRoZSBjdXJyZW50IGJsb2NrICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBPdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi8KLSAgICAgICAgcy0+bWF0Y2hfbGVuZ3RoID0gMDsKLSAgICAgICAgVHJhY2V2digoc3RkZXJyLCIlYyIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTsKLSAgICAgICAgX3RyX3RhbGx5X2xpdCAocywgcy0+d2luZG93W3MtPnN0cnN0YXJ0XSwgYmZsdXNoKTsKLSAgICAgICAgcy0+bG9va2FoZWFkLS07Ci0gICAgICAgIHMtPnN0cnN0YXJ0Kys7Ci0gICAgICAgIGlmIChiZmx1c2gpIEZMVVNIX0JMT0NLKHMsIDApOwotICAgIH0KLSAgICBzLT5pbnNlcnQgPSAwOwotICAgIGlmIChmbHVzaCA9PSBaX0ZJTklTSCkgewotICAgICAgICBGTFVTSF9CTE9DSyhzLCAxKTsKLSAgICAgICAgcmV0dXJuIGZpbmlzaF9kb25lOwotICAgIH0KLSAgICBpZiAocy0+bGFzdF9saXQpCi0gICAgICAgIEZMVVNIX0JMT0NLKHMsIDApOwotICAgIHJldHVybiBibG9ja19kb25lOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvemxpYl92MTI4L2RlZmxhdGUuaCBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9kZWZsYXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMDI5OWUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvemxpYl92MTI4L2RlZmxhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKiBkZWZsYXRlLmggLS0gaW50ZXJuYWwgY29tcHJlc3Npb24gc3RhdGUKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDEyIEplYW4tbG91cCBHYWlsbHkKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcwotICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCi0gICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCi0gKi8KLQotLyogQCgjKSAkSWQkICovCi0KLSNpZm5kZWYgREVGTEFURV9ICi0jZGVmaW5lIERFRkxBVEVfSAotCi0jaW5jbHVkZSAienV0aWwuaCIKLQotLyogZGVmaW5lIE5PX0daSVAgd2hlbiBjb21waWxpbmcgaWYgeW91IHdhbnQgdG8gZGlzYWJsZSBnemlwIGhlYWRlciBhbmQKLSAgIHRyYWlsZXIgY3JlYXRpb24gYnkgZGVmbGF0ZSgpLiAgTk9fR1pJUCB3b3VsZCBiZSB1c2VkIHRvIGF2b2lkIGxpbmtpbmcgaW4KLSAgIHRoZSBjcmMgY29kZSB3aGVuIGl0IGlzIG5vdCBuZWVkZWQuICBGb3Igc2hhcmVkIGxpYnJhcmllcywgZ3ppcCBlbmNvZGluZwotICAgc2hvdWxkIGJlIGxlZnQgZW5hYmxlZC4gKi8KLSNpZm5kZWYgTk9fR1pJUAotIyAgZGVmaW5lIEdaSVAKLSNlbmRpZgotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLgotICovCi0KLSNkZWZpbmUgTEVOR1RIX0NPREVTIDI5Ci0vKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi8KLQotI2RlZmluZSBMSVRFUkFMUyAgMjU2Ci0vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi8KLQotI2RlZmluZSBMX0NPREVTIChMSVRFUkFMUysxK0xFTkdUSF9DT0RFUykKLS8qIG51bWJlciBvZiBMaXRlcmFsIG9yIExlbmd0aCBjb2RlcywgaW5jbHVkaW5nIHRoZSBFTkRfQkxPQ0sgY29kZSAqLwotCi0jZGVmaW5lIERfQ09ERVMgICAzMAotLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovCi0KLSNkZWZpbmUgQkxfQ09ERVMgIDE5Ci0vKiBudW1iZXIgb2YgY29kZXMgdXNlZCB0byB0cmFuc2ZlciB0aGUgYml0IGxlbmd0aHMgKi8KLQotI2RlZmluZSBIRUFQX1NJWkUgKDIqTF9DT0RFUysxKQotLyogbWF4aW11bSBoZWFwIHNpemUgKi8KLQotI2RlZmluZSBNQVhfQklUUyAxNQotLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovCi0KLSNkZWZpbmUgQnVmX3NpemUgMTYKLS8qIHNpemUgb2YgYml0IGJ1ZmZlciBpbiBiaV9idWYgKi8KLQotI2RlZmluZSBJTklUX1NUQVRFICAgIDQyCi0jZGVmaW5lIEVYVFJBX1NUQVRFICAgNjkKLSNkZWZpbmUgTkFNRV9TVEFURSAgICA3MwotI2RlZmluZSBDT01NRU5UX1NUQVRFIDkxCi0jZGVmaW5lIEhDUkNfU1RBVEUgICAxMDMKLSNkZWZpbmUgQlVTWV9TVEFURSAgIDExMwotI2RlZmluZSBGSU5JU0hfU1RBVEUgNjY2Ci0vKiBTdHJlYW0gc3RhdHVzICovCi0KLQotLyogRGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHNpbmdsZSB2YWx1ZSBhbmQgaXRzIGNvZGUgc3RyaW5nLiAqLwotdHlwZWRlZiBzdHJ1Y3QgY3RfZGF0YV9zIHsKLSAgICB1bmlvbiB7Ci0gICAgICAgIHVzaCAgZnJlcTsgICAgICAgLyogZnJlcXVlbmN5IGNvdW50ICovCi0gICAgICAgIHVzaCAgY29kZTsgICAgICAgLyogYml0IHN0cmluZyAqLwotICAgIH0gZmM7Ci0gICAgdW5pb24gewotICAgICAgICB1c2ggIGRhZDsgICAgICAgIC8qIGZhdGhlciBub2RlIGluIEh1ZmZtYW4gdHJlZSAqLwotICAgICAgICB1c2ggIGxlbjsgICAgICAgIC8qIGxlbmd0aCBvZiBiaXQgc3RyaW5nICovCi0gICAgfSBkbDsKLX0gRkFSIGN0X2RhdGE7Ci0KLSNkZWZpbmUgRnJlcSBmYy5mcmVxCi0jZGVmaW5lIENvZGUgZmMuY29kZQotI2RlZmluZSBEYWQgIGRsLmRhZAotI2RlZmluZSBMZW4gIGRsLmxlbgotCi10eXBlZGVmIHN0cnVjdCBzdGF0aWNfdHJlZV9kZXNjX3MgIHN0YXRpY190cmVlX2Rlc2M7Ci0KLXR5cGVkZWYgc3RydWN0IHRyZWVfZGVzY19zIHsKLSAgICBjdF9kYXRhICpkeW5fdHJlZTsgICAgICAgICAgIC8qIHRoZSBkeW5hbWljIHRyZWUgKi8KLSAgICBpbnQgICAgIG1heF9jb2RlOyAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLwotICAgIHN0YXRpY190cmVlX2Rlc2MgKnN0YXRfZGVzYzsgLyogdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIHRyZWUgKi8KLX0gRkFSIHRyZWVfZGVzYzsKLQotdHlwZWRlZiB1c2ggUG9zOwotdHlwZWRlZiBQb3MgRkFSIFBvc2Y7Ci10eXBlZGVmIHVuc2lnbmVkIElQb3M7Ci0KLS8qIEEgUG9zIGlzIGFuIGluZGV4IGluIHRoZSBjaGFyYWN0ZXIgd2luZG93LiBXZSB1c2Ugc2hvcnQgaW5zdGVhZCBvZiBpbnQgdG8KLSAqIHNhdmUgc3BhY2UgaW4gdGhlIHZhcmlvdXMgdGFibGVzLiBJUG9zIGlzIHVzZWQgb25seSBmb3IgcGFyYW1ldGVyIHBhc3NpbmcuCi0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgewotICAgIHpfc3RyZWFtcCBzdHJtOyAgICAgIC8qIHBvaW50ZXIgYmFjayB0byB0aGlzIHpsaWIgc3RyZWFtICovCi0gICAgaW50ICAgc3RhdHVzOyAgICAgICAgLyogYXMgdGhlIG5hbWUgaW1wbGllcyAqLwotICAgIEJ5dGVmICpwZW5kaW5nX2J1ZjsgIC8qIG91dHB1dCBzdGlsbCBwZW5kaW5nICovCi0gICAgdWxnICAgcGVuZGluZ19idWZfc2l6ZTsgLyogc2l6ZSBvZiBwZW5kaW5nX2J1ZiAqLwotICAgIEJ5dGVmICpwZW5kaW5nX291dDsgIC8qIG5leHQgcGVuZGluZyBieXRlIHRvIG91dHB1dCB0byB0aGUgc3RyZWFtICovCi0gICAgdUludCAgIHBlbmRpbmc7ICAgICAgLyogbmIgb2YgYnl0ZXMgaW4gdGhlIHBlbmRpbmcgYnVmZmVyICovCi0gICAgaW50ICAgd3JhcDsgICAgICAgICAgLyogYml0IDAgdHJ1ZSBmb3IgemxpYiwgYml0IDEgdHJ1ZSBmb3IgZ3ppcCAqLwotICAgIGd6X2hlYWRlcnAgIGd6aGVhZDsgIC8qIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHRvIHdyaXRlICovCi0gICAgdUludCAgIGd6aW5kZXg7ICAgICAgLyogd2hlcmUgaW4gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQgKi8KLSAgICBCeXRlICBtZXRob2Q7ICAgICAgICAvKiBjYW4gb25seSBiZSBERUZMQVRFRCAqLwotICAgIGludCAgIGxhc3RfZmx1c2g7ICAgIC8qIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwgKi8KLQotICAgICAgICAgICAgICAgIC8qIHVzZWQgYnkgZGVmbGF0ZS5jOiAqLwotCi0gICAgdUludCAgd19zaXplOyAgICAgICAgLyogTFo3NyB3aW5kb3cgc2l6ZSAoMzJLIGJ5IGRlZmF1bHQpICovCi0gICAgdUludCAgd19iaXRzOyAgICAgICAgLyogbG9nMih3X3NpemUpICAoOC4uMTYpICovCi0gICAgdUludCAgd19tYXNrOyAgICAgICAgLyogd19zaXplIC0gMSAqLwotCi0gICAgQnl0ZWYgKndpbmRvdzsKLSAgICAvKiBTbGlkaW5nIHdpbmRvdy4gSW5wdXQgYnl0ZXMgYXJlIHJlYWQgaW50byB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHdpbmRvdywKLSAgICAgKiBhbmQgbW92ZSB0byB0aGUgZmlyc3QgaGFsZiBsYXRlciB0byBrZWVwIGEgZGljdGlvbmFyeSBvZiBhdCBsZWFzdCB3U2l6ZQotICAgICAqIGJ5dGVzLiBXaXRoIHRoaXMgb3JnYW5pemF0aW9uLCBtYXRjaGVzIGFyZSBsaW1pdGVkIHRvIGEgZGlzdGFuY2Ugb2YKLSAgICAgKiB3U2l6ZS1NQVhfTUFUQ0ggYnl0ZXMsIGJ1dCB0aGlzIGVuc3VyZXMgdGhhdCBJTyBpcyBhbHdheXMKLSAgICAgKiBwZXJmb3JtZWQgd2l0aCBhIGxlbmd0aCBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS4gQWxzbywgaXQgbGltaXRzCi0gICAgICogdGhlIHdpbmRvdyBzaXplIHRvIDY0Sywgd2hpY2ggaXMgcXVpdGUgdXNlZnVsIG9uIE1TRE9TLgotICAgICAqIFRvIGRvOiB1c2UgdGhlIHVzZXIgaW5wdXQgYnVmZmVyIGFzIHNsaWRpbmcgd2luZG93LgotICAgICAqLwotCi0gICAgdWxnIHdpbmRvd19zaXplOwotICAgIC8qIEFjdHVhbCBzaXplIG9mIHdpbmRvdzogMip3U2l6ZSwgZXhjZXB0IHdoZW4gdGhlIHVzZXIgaW5wdXQgYnVmZmVyCi0gICAgICogaXMgZGlyZWN0bHkgdXNlZCBhcyBzbGlkaW5nIHdpbmRvdy4KLSAgICAgKi8KLQotICAgIFBvc2YgKnByZXY7Ci0gICAgLyogTGluayB0byBvbGRlciBzdHJpbmcgd2l0aCBzYW1lIGhhc2ggaW5kZXguIFRvIGxpbWl0IHRoZSBzaXplIG9mIHRoaXMKLSAgICAgKiBhcnJheSB0byA2NEssIHRoaXMgbGluayBpcyBtYWludGFpbmVkIG9ubHkgZm9yIHRoZSBsYXN0IDMySyBzdHJpbmdzLgotICAgICAqIEFuIGluZGV4IGluIHRoaXMgYXJyYXkgaXMgdGh1cyBhIHdpbmRvdyBpbmRleCBtb2R1bG8gMzJLLgotICAgICAqLwotCi0gICAgUG9zZiAqaGVhZDsgLyogSGVhZHMgb2YgdGhlIGhhc2ggY2hhaW5zIG9yIE5JTC4gKi8KLQotICAgIHVJbnQgIGluc19oOyAgICAgICAgICAvKiBoYXNoIGluZGV4IG9mIHN0cmluZyB0byBiZSBpbnNlcnRlZCAqLwotICAgIHVJbnQgIGhhc2hfc2l6ZTsgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gaGFzaCB0YWJsZSAqLwotICAgIHVJbnQgIGhhc2hfYml0czsgICAgICAvKiBsb2cyKGhhc2hfc2l6ZSkgKi8KLSAgICB1SW50ICBoYXNoX21hc2s7ICAgICAgLyogaGFzaF9zaXplLTEgKi8KLQotICAgIHVJbnQgIGhhc2hfc2hpZnQ7Ci0gICAgLyogTnVtYmVyIG9mIGJpdHMgYnkgd2hpY2ggaW5zX2ggbXVzdCBiZSBzaGlmdGVkIGF0IGVhY2ggaW5wdXQKLSAgICAgKiBzdGVwLiBJdCBtdXN0IGJlIHN1Y2ggdGhhdCBhZnRlciBNSU5fTUFUQ0ggc3RlcHMsIHRoZSBvbGRlc3QKLSAgICAgKiBieXRlIG5vIGxvbmdlciB0YWtlcyBwYXJ0IGluIHRoZSBoYXNoIGtleSwgdGhhdCBpczoKLSAgICAgKiAgIGhhc2hfc2hpZnQgKiBNSU5fTUFUQ0ggPj0gaGFzaF9iaXRzCi0gICAgICovCi0KLSAgICBsb25nIGJsb2NrX3N0YXJ0OwotICAgIC8qIFdpbmRvdyBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IG91dHB1dCBibG9jay4gR2V0cwotICAgICAqIG5lZ2F0aXZlIHdoZW4gdGhlIHdpbmRvdyBpcyBtb3ZlZCBiYWNrd2FyZHMuCi0gICAgICovCi0KLSAgICB1SW50IG1hdGNoX2xlbmd0aDsgICAgICAgICAgIC8qIGxlbmd0aCBvZiBiZXN0IG1hdGNoICovCi0gICAgSVBvcyBwcmV2X21hdGNoOyAgICAgICAgICAgICAvKiBwcmV2aW91cyBtYXRjaCAqLwotICAgIGludCBtYXRjaF9hdmFpbGFibGU7ICAgICAgICAgLyogc2V0IGlmIHByZXZpb3VzIG1hdGNoIGV4aXN0cyAqLwotICAgIHVJbnQgc3Ryc3RhcnQ7ICAgICAgICAgICAgICAgLyogc3RhcnQgb2Ygc3RyaW5nIHRvIGluc2VydCAqLwotICAgIHVJbnQgbWF0Y2hfc3RhcnQ7ICAgICAgICAgICAgLyogc3RhcnQgb2YgbWF0Y2hpbmcgc3RyaW5nICovCi0gICAgdUludCBsb29rYWhlYWQ7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgdmFsaWQgYnl0ZXMgYWhlYWQgaW4gd2luZG93ICovCi0KLSAgICB1SW50IHByZXZfbGVuZ3RoOwotICAgIC8qIExlbmd0aCBvZiB0aGUgYmVzdCBtYXRjaCBhdCBwcmV2aW91cyBzdGVwLiBNYXRjaGVzIG5vdCBncmVhdGVyIHRoYW4gdGhpcwotICAgICAqIGFyZSBkaXNjYXJkZWQuIFRoaXMgaXMgdXNlZCBpbiB0aGUgbGF6eSBtYXRjaCBldmFsdWF0aW9uLgotICAgICAqLwotCi0gICAgdUludCBtYXhfY2hhaW5fbGVuZ3RoOwotICAgIC8qIFRvIHNwZWVkIHVwIGRlZmxhdGlvbiwgaGFzaCBjaGFpbnMgYXJlIG5ldmVyIHNlYXJjaGVkIGJleW9uZCB0aGlzCi0gICAgICogbGVuZ3RoLiAgQSBoaWdoZXIgbGltaXQgaW1wcm92ZXMgY29tcHJlc3Npb24gcmF0aW8gYnV0IGRlZ3JhZGVzIHRoZQotICAgICAqIHNwZWVkLgotICAgICAqLwotCi0gICAgdUludCBtYXhfbGF6eV9tYXRjaDsKLSAgICAvKiBBdHRlbXB0IHRvIGZpbmQgYSBiZXR0ZXIgbWF0Y2ggb25seSB3aGVuIHRoZSBjdXJyZW50IG1hdGNoIGlzIHN0cmljdGx5Ci0gICAgICogc21hbGxlciB0aGFuIHRoaXMgdmFsdWUuIFRoaXMgbWVjaGFuaXNtIGlzIHVzZWQgb25seSBmb3IgY29tcHJlc3Npb24KLSAgICAgKiBsZXZlbHMgPj0gNC4KLSAgICAgKi8KLSMgICBkZWZpbmUgbWF4X2luc2VydF9sZW5ndGggIG1heF9sYXp5X21hdGNoCi0gICAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBub3QKLSAgICAgKiBncmVhdGVyIHRoYW4gdGhpcyBsZW5ndGguIFRoaXMgc2F2ZXMgdGltZSBidXQgZGVncmFkZXMgY29tcHJlc3Npb24uCi0gICAgICogbWF4X2luc2VydF9sZW5ndGggaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvbiBsZXZlbHMgPD0gMy4KLSAgICAgKi8KLQotICAgIGludCBsZXZlbDsgICAgLyogY29tcHJlc3Npb24gbGV2ZWwgKDEuLjkpICovCi0gICAgaW50IHN0cmF0ZWd5OyAvKiBmYXZvciBvciBmb3JjZSBIdWZmbWFuIGNvZGluZyovCi0KLSAgICB1SW50IGdvb2RfbWF0Y2g7Ci0gICAgLyogVXNlIGEgZmFzdGVyIHNlYXJjaCB3aGVuIHRoZSBwcmV2aW91cyBtYXRjaCBpcyBsb25nZXIgdGhhbiB0aGlzICovCi0KLSAgICBpbnQgbmljZV9tYXRjaDsgLyogU3RvcCBzZWFyY2hpbmcgd2hlbiBjdXJyZW50IG1hdGNoIGV4Y2VlZHMgdGhpcyAqLwotCi0gICAgICAgICAgICAgICAgLyogdXNlZCBieSB0cmVlcy5jOiAqLwotICAgIC8qIERpZG4ndCB1c2UgY3RfZGF0YSB0eXBlZGVmIGJlbG93IHRvIHN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmcgKi8KLSAgICBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9sdHJlZVtIRUFQX1NJWkVdOyAgIC8qIGxpdGVyYWwgYW5kIGxlbmd0aCB0cmVlICovCi0gICAgc3RydWN0IGN0X2RhdGFfcyBkeW5fZHRyZWVbMipEX0NPREVTKzFdOyAvKiBkaXN0YW5jZSB0cmVlICovCi0gICAgc3RydWN0IGN0X2RhdGFfcyBibF90cmVlWzIqQkxfQ09ERVMrMV07ICAvKiBIdWZmbWFuIHRyZWUgZm9yIGJpdCBsZW5ndGhzICovCi0KLSAgICBzdHJ1Y3QgdHJlZV9kZXNjX3MgbF9kZXNjOyAgICAgICAgICAgICAgIC8qIGRlc2MuIGZvciBsaXRlcmFsIHRyZWUgKi8KLSAgICBzdHJ1Y3QgdHJlZV9kZXNjX3MgZF9kZXNjOyAgICAgICAgICAgICAgIC8qIGRlc2MuIGZvciBkaXN0YW5jZSB0cmVlICovCi0gICAgc3RydWN0IHRyZWVfZGVzY19zIGJsX2Rlc2M7ICAgICAgICAgICAgICAvKiBkZXNjLiBmb3IgYml0IGxlbmd0aCB0cmVlICovCi0KLSAgICB1c2ggYmxfY291bnRbTUFYX0JJVFMrMV07Ci0gICAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovCi0KLSAgICBpbnQgaGVhcFsyKkxfQ09ERVMrMV07ICAgICAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovCi0gICAgaW50IGhlYXBfbGVuOyAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgaGVhcCAqLwotICAgIGludCBoZWFwX21heDsgICAgICAgICAgICAgICAvKiBlbGVtZW50IG9mIGxhcmdlc3QgZnJlcXVlbmN5ICovCi0gICAgLyogVGhlIHNvbnMgb2YgaGVhcFtuXSBhcmUgaGVhcFsyKm5dIGFuZCBoZWFwWzIqbisxXS4gaGVhcFswXSBpcyBub3QgdXNlZC4KLSAgICAgKiBUaGUgc2FtZSBoZWFwIGFycmF5IGlzIHVzZWQgdG8gYnVpbGQgYWxsIHRyZWVzLgotICAgICAqLwotCi0gICAgdWNoIGRlcHRoWzIqTF9DT0RFUysxXTsKLSAgICAvKiBEZXB0aCBvZiBlYWNoIHN1YnRyZWUgdXNlZCBhcyB0aWUgYnJlYWtlciBmb3IgdHJlZXMgb2YgZXF1YWwgZnJlcXVlbmN5Ci0gICAgICovCi0KLSAgICB1Y2hmICpsX2J1ZjsgICAgICAgICAgLyogYnVmZmVyIGZvciBsaXRlcmFscyBvciBsZW5ndGhzICovCi0KLSAgICB1SW50ICBsaXRfYnVmc2l6ZTsKLSAgICAvKiBTaXplIG9mIG1hdGNoIGJ1ZmZlciBmb3IgbGl0ZXJhbHMvbGVuZ3Rocy4gIFRoZXJlIGFyZSA0IHJlYXNvbnMgZm9yCi0gICAgICogbGltaXRpbmcgbGl0X2J1ZnNpemUgdG8gNjRLOgotICAgICAqICAgLSBmcmVxdWVuY2llcyBjYW4gYmUga2VwdCBpbiAxNiBiaXQgY291bnRlcnMKLSAgICAgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIHRoZSBmaXJzdCBibG9jaywgYWxsIGlucHV0Ci0gICAgICogICAgIGRhdGEgaXMgc3RpbGwgaW4gdGhlIHdpbmRvdyBzbyB3ZSBjYW4gc3RpbGwgZW1pdCBhIHN0b3JlZCBibG9jayBldmVuCi0gICAgICogICAgIHdoZW4gaW5wdXQgY29tZXMgZnJvbSBzdGFuZGFyZCBpbnB1dC4gIChUaGlzIGNhbiBhbHNvIGJlIGRvbmUgZm9yCi0gICAgICogICAgIGFsbCBibG9ja3MgaWYgbGl0X2J1ZnNpemUgaXMgbm90IGdyZWF0ZXIgdGhhbiAzMksuKQotICAgICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgYSBmaWxlIHNtYWxsZXIgdGhhbiA2NEssIHdlIGNhbgotICAgICAqICAgICBldmVuIGVtaXQgYSBzdG9yZWQgZmlsZSBpbnN0ZWFkIG9mIGEgc3RvcmVkIGJsb2NrIChzYXZpbmcgNSBieXRlcykuCi0gICAgICogICAgIFRoaXMgaXMgYXBwbGljYWJsZSBvbmx5IGZvciB6aXAgKG5vdCBnemlwIG9yIHpsaWIpLgotICAgICAqICAgLSBjcmVhdGluZyBuZXcgSHVmZm1hbiB0cmVlcyBsZXNzIGZyZXF1ZW50bHkgbWF5IG5vdCBwcm92aWRlIGZhc3QKLSAgICAgKiAgICAgYWRhcHRhdGlvbiB0byBjaGFuZ2VzIGluIHRoZSBpbnB1dCBkYXRhIHN0YXRpc3RpY3MuIChUYWtlIGZvcgotICAgICAqICAgICBleGFtcGxlIGEgYmluYXJ5IGZpbGUgd2l0aCBwb29ybHkgY29tcHJlc3NpYmxlIGNvZGUgZm9sbG93ZWQgYnkKLSAgICAgKiAgICAgYSBoaWdobHkgY29tcHJlc3NpYmxlIHN0cmluZyB0YWJsZS4pIFNtYWxsZXIgYnVmZmVyIHNpemVzIGdpdmUKLSAgICAgKiAgICAgZmFzdCBhZGFwdGF0aW9uIGJ1dCBoYXZlIG9mIGNvdXJzZSB0aGUgb3ZlcmhlYWQgb2YgdHJhbnNtaXR0aW5nCi0gICAgICogICAgIHRyZWVzIG1vcmUgZnJlcXVlbnRseS4KLSAgICAgKiAgIC0gSSBjYW4ndCBjb3VudCBhYm92ZSA0Ci0gICAgICovCi0KLSAgICB1SW50IGxhc3RfbGl0OyAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi8KLQotICAgIHVzaGYgKmRfYnVmOwotICAgIC8qIEJ1ZmZlciBmb3IgZGlzdGFuY2VzLiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgZF9idWYgYW5kIGxfYnVmIGhhdmUKLSAgICAgKiB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuIFRvIHVzZSBkaWZmZXJlbnQgbGVuZ3RocywgYW4gZXh0cmEgZmxhZwotICAgICAqIGFycmF5IHdvdWxkIGJlIG5lY2Vzc2FyeS4KLSAgICAgKi8KLQotICAgIHVsZyBvcHRfbGVuOyAgICAgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggb3B0aW1hbCB0cmVlcyAqLwotICAgIHVsZyBzdGF0aWNfbGVuOyAgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggc3RhdGljIHRyZWVzICovCi0gICAgdUludCBtYXRjaGVzOyAgICAgICAvKiBudW1iZXIgb2Ygc3RyaW5nIG1hdGNoZXMgaW4gY3VycmVudCBibG9jayAqLwotICAgIHVJbnQgaW5zZXJ0OyAgICAgICAgLyogYnl0ZXMgYXQgZW5kIG9mIHdpbmRvdyBsZWZ0IHRvIGluc2VydCAqLwotCi0jaWZkZWYgREVCVUcKLSAgICB1bGcgY29tcHJlc3NlZF9sZW47IC8qIHRvdGFsIGJpdCBsZW5ndGggb2YgY29tcHJlc3NlZCBmaWxlIG1vZCAyXjMyICovCi0gICAgdWxnIGJpdHNfc2VudDsgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGNvbXByZXNzZWQgZGF0YSBzZW50IG1vZCAyXjMyICovCi0jZW5kaWYKLQotICAgIHVzaCBiaV9idWY7Ci0gICAgLyogT3V0cHV0IGJ1ZmZlci4gYml0cyBhcmUgaW5zZXJ0ZWQgc3RhcnRpbmcgYXQgdGhlIGJvdHRvbSAobGVhc3QKLSAgICAgKiBzaWduaWZpY2FudCBiaXRzKS4KLSAgICAgKi8KLSAgICBpbnQgYmlfdmFsaWQ7Ci0gICAgLyogTnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYmlfYnVmLiAgQWxsIGJpdHMgYWJvdmUgdGhlIGxhc3QgdmFsaWQgYml0Ci0gICAgICogYXJlIGFsd2F5cyB6ZXJvLgotICAgICAqLwotCi0gICAgdWxnIGhpZ2hfd2F0ZXI7Ci0gICAgLyogSGlnaCB3YXRlciBtYXJrIG9mZnNldCBpbiB3aW5kb3cgZm9yIGluaXRpYWxpemVkIGJ5dGVzIC0tIGJ5dGVzIGFib3ZlCi0gICAgICogdGhpcyBhcmUgc2V0IHRvIHplcm8gaW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGNoZWNrIHdhcm5pbmdzIHdoZW4KLSAgICAgKiBsb25nZXN0IG1hdGNoIHJvdXRpbmVzIGFjY2VzcyBieXRlcyBwYXN0IHRoZSBpbnB1dC4gIFRoaXMgaXMgdGhlbgotICAgICAqIHVwZGF0ZWQgdG8gdGhlIG5ldyBoaWdoIHdhdGVyIG1hcmsuCi0gICAgICovCi0KLX0gRkFSIGRlZmxhdGVfc3RhdGU7Ci0KLS8qIE91dHB1dCBhIGJ5dGUgb24gdGhlIHN0cmVhbS4KLSAqIElOIGFzc2VydGlvbjogdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gcGVuZGluZ19idWYuCi0gKi8KLSNkZWZpbmUgcHV0X2J5dGUocywgYykge3MtPnBlbmRpbmdfYnVmW3MtPnBlbmRpbmcrK10gPSAoYyk7fQotCi0KLSNkZWZpbmUgTUlOX0xPT0tBSEVBRCAoTUFYX01BVENIK01JTl9NQVRDSCsxKQotLyogTWluaW11bSBhbW91bnQgb2YgbG9va2FoZWFkLCBleGNlcHQgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4KLSAqIFNlZSBkZWZsYXRlLmMgZm9yIGNvbW1lbnRzIGFib3V0IHRoZSBNSU5fTUFUQ0grMS4KLSAqLwotCi0jZGVmaW5lIE1BWF9ESVNUKHMpICAoKHMpLT53X3NpemUtTUlOX0xPT0tBSEVBRCkKLS8qIEluIG9yZGVyIHRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBwYXJ0aWN1bGFybHkgb24gMTYgYml0IG1hY2hpbmVzLCBtYXRjaAotICogZGlzdGFuY2VzIGFyZSBsaW1pdGVkIHRvIE1BWF9ESVNUIGluc3RlYWQgb2YgV1NJWkUuCi0gKi8KLQotI2RlZmluZSBXSU5fSU5JVCBNQVhfTUFUQ0gKLS8qIE51bWJlciBvZiBieXRlcyBhZnRlciBlbmQgb2YgZGF0YSBpbiB3aW5kb3cgdG8gaW5pdGlhbGl6ZSBpbiBvcmRlciB0byBhdm9pZAotICAgbWVtb3J5IGNoZWNrZXIgZXJyb3JzIGZyb20gbG9uZ2VzdCBtYXRjaCByb3V0aW5lcyAqLwotCi0gICAgICAgIC8qIGluIHRyZWVzLmMgKi8KLXZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfaW5pdCBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOwotaW50IFpMSUJfSU5URVJOQUwgX3RyX3RhbGx5IE9GKChkZWZsYXRlX3N0YXRlICpzLCB1bnNpZ25lZCBkaXN0LCB1bnNpZ25lZCBsYykpOwotdm9pZCBaTElCX0lOVEVSTkFMIF90cl9mbHVzaF9ibG9jayBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY2hhcmYgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVsZyBzdG9yZWRfbGVuLCBpbnQgbGFzdCkpOwotdm9pZCBaTElCX0lOVEVSTkFMIF90cl9mbHVzaF9iaXRzIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Ci12b2lkIFpMSUJfSU5URVJOQUwgX3RyX2FsaWduIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Ci12b2lkIFpMSUJfSU5URVJOQUwgX3RyX3N0b3JlZF9ibG9jayBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY2hhcmYgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVsZyBzdG9yZWRfbGVuLCBpbnQgbGFzdCkpOwotCi0jZGVmaW5lIGRfY29kZShkaXN0KSBcCi0gICAoKGRpc3QpIDwgMjU2ID8gX2Rpc3RfY29kZVtkaXN0XSA6IF9kaXN0X2NvZGVbMjU2KygoZGlzdCk+PjcpXSkKLS8qIE1hcHBpbmcgZnJvbSBhIGRpc3RhbmNlIHRvIGEgZGlzdGFuY2UgY29kZS4gZGlzdCBpcyB0aGUgZGlzdGFuY2UgLSAxIGFuZAotICogbXVzdCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMuIF9kaXN0X2NvZGVbMjU2XSBhbmQgX2Rpc3RfY29kZVsyNTddIGFyZSBuZXZlcgotICogdXNlZC4KLSAqLwotCi0jaWZuZGVmIERFQlVHCi0vKiBJbmxpbmUgdmVyc2lvbnMgb2YgX3RyX3RhbGx5IGZvciBzcGVlZDogKi8KLQotI2lmIGRlZmluZWQoR0VOX1RSRUVTX0gpIHx8ICFkZWZpbmVkKFNUREMpCi0gIGV4dGVybiB1Y2ggWkxJQl9JTlRFUk5BTCBfbGVuZ3RoX2NvZGVbXTsKLSAgZXh0ZXJuIHVjaCBaTElCX0lOVEVSTkFMIF9kaXN0X2NvZGVbXTsKLSNlbHNlCi0gIGV4dGVybiBjb25zdCB1Y2ggWkxJQl9JTlRFUk5BTCBfbGVuZ3RoX2NvZGVbXTsKLSAgZXh0ZXJuIGNvbnN0IHVjaCBaTElCX0lOVEVSTkFMIF9kaXN0X2NvZGVbXTsKLSNlbmRpZgotCi0jIGRlZmluZSBfdHJfdGFsbHlfbGl0KHMsIGMsIGZsdXNoKSBcCi0gIHsgdWNoIGNjID0gKGMpOyBcCi0gICAgcy0+ZF9idWZbcy0+bGFzdF9saXRdID0gMDsgXAotICAgIHMtPmxfYnVmW3MtPmxhc3RfbGl0KytdID0gY2M7IFwKLSAgICBzLT5keW5fbHRyZWVbY2NdLkZyZXErKzsgXAotICAgIGZsdXNoID0gKHMtPmxhc3RfbGl0ID09IHMtPmxpdF9idWZzaXplLTEpOyBcCi0gICB9Ci0jIGRlZmluZSBfdHJfdGFsbHlfZGlzdChzLCBkaXN0YW5jZSwgbGVuZ3RoLCBmbHVzaCkgXAotICB7IHVjaCBsZW4gPSAobGVuZ3RoKTsgXAotICAgIHVzaCBkaXN0ID0gKGRpc3RhbmNlKTsgXAotICAgIHMtPmRfYnVmW3MtPmxhc3RfbGl0XSA9IGRpc3Q7IFwKLSAgICBzLT5sX2J1ZltzLT5sYXN0X2xpdCsrXSA9IGxlbjsgXAotICAgIGRpc3QtLTsgXAotICAgIHMtPmR5bl9sdHJlZVtfbGVuZ3RoX2NvZGVbbGVuXStMSVRFUkFMUysxXS5GcmVxKys7IFwKLSAgICBzLT5keW5fZHRyZWVbZF9jb2RlKGRpc3QpXS5GcmVxKys7IFwKLSAgICBmbHVzaCA9IChzLT5sYXN0X2xpdCA9PSBzLT5saXRfYnVmc2l6ZS0xKTsgXAotICB9Ci0jZWxzZQotIyBkZWZpbmUgX3RyX3RhbGx5X2xpdChzLCBjLCBmbHVzaCkgZmx1c2ggPSBfdHJfdGFsbHkocywgMCwgYykKLSMgZGVmaW5lIF90cl90YWxseV9kaXN0KHMsIGRpc3RhbmNlLCBsZW5ndGgsIGZsdXNoKSBcCi0gICAgICAgICAgICAgIGZsdXNoID0gX3RyX3RhbGx5KHMsIGRpc3RhbmNlLCBsZW5ndGgpCi0jZW5kaWYKLQotI2VuZGlmIC8qIERFRkxBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvemxpYl92MTI4L2d6Y2xvc2UuYyBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9nemNsb3NlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMDEwYjguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvemxpYl92MTI4L2d6Y2xvc2UuYworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qIGd6Y2xvc2UuYyAtLSB6bGliIGd6Y2xvc2UoKSBmdW5jdGlvbgotICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDEwIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0jaW5jbHVkZSAiZ3pndXRzLmgiCi0KLS8qIGd6Y2xvc2UoKSBpcyBpbiBhIHNlcGFyYXRlIGZpbGUgc28gdGhhdCBpdCBpcyBsaW5rZWQgaW4gb25seSBpZiBpdCBpcyB1c2VkLgotICAgVGhhdCB3YXkgdGhlIG90aGVyIGd6Y2xvc2UgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIGluc3RlYWQgdG8gYXZvaWQgbGlua2luZyBpbgotICAgdW5uZWVkZWQgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbiByb3V0aW5lcy4gKi8KLWludCBaRVhQT1JUIGd6Y2xvc2UoCi0gICAgZ3pGaWxlIGZpbGUpCi17Ci0jaWZuZGVmIE5PX0daQ09NUFJFU1MKLSAgICBnel9zdGF0ZXAgc3RhdGU7Ci0KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7Ci0KLSAgICByZXR1cm4gc3RhdGUtPm1vZGUgPT0gR1pfUkVBRCA/IGd6Y2xvc2VfcihmaWxlKSA6IGd6Y2xvc2VfdyhmaWxlKTsKLSNlbHNlCi0gICAgcmV0dXJuIGd6Y2xvc2VfcihmaWxlKTsKLSNlbmRpZgotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvemxpYl92MTI4L2d6Z3V0cy5oIGIvdGhpcmRfcGFydHkvemxpYl92MTI4L2d6Z3V0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmMzYjY3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9nemd1dHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNyArMCwwIEBACi0vKiBnemd1dHMuaCAtLSB6bGliIGludGVybmFsIGhlYWRlciBkZWZpbml0aW9ucyBmb3IgZ3oqIG9wZXJhdGlvbnMKLSAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAxMCwgMjAxMSwgMjAxMiwgMjAxMyBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotI2lmZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UKLSMgIGlmbmRlZiBfTEFSR0VGSUxFX1NPVVJDRQotIyAgICBkZWZpbmUgX0xBUkdFRklMRV9TT1VSQ0UgMQotIyAgZW5kaWYKLSMgIGlmZGVmIF9GSUxFX09GRlNFVF9CSVRTCi0jICAgIHVuZGVmIF9GSUxFX09GRlNFVF9CSVRTCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBIQVZFX0hJRERFTgotIyAgZGVmaW5lIFpMSUJfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSAoImhpZGRlbiIpKSkKLSNlbHNlCi0jICBkZWZpbmUgWkxJQl9JTlRFUk5BTAotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgInpsaWIuaCIKLSNpZmRlZiBTVERDCi0jICBpbmNsdWRlIDxzdHJpbmcuaD4KLSMgIGluY2x1ZGUgPHN0ZGxpYi5oPgotIyAgaW5jbHVkZSA8bGltaXRzLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxmY250bC5oPgotCi0jaWZkZWYgX1dJTjMyCi0jICBpbmNsdWRlIDxzdGRkZWYuaD4KLSNlbHNlCi0jICBpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX1RVUkJPQ19fKSB8fCBkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9XSU4zMikKLSMgIGluY2x1ZGUgPGlvLmg+Ci0jZW5kaWYKLQotI2lmZGVmIFdJTkFQSV9GQU1JTFkKLSMgIGRlZmluZSBvcGVuIF9vcGVuCi0jICBkZWZpbmUgcmVhZCBfcmVhZAotIyAgZGVmaW5lIHdyaXRlIF93cml0ZQotIyAgZGVmaW5lIGNsb3NlIF9jbG9zZQotI2VuZGlmCi0KLSNpZmRlZiBOT19ERUZMQVRFICAgICAgIC8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGRlZmluaXRpb24gKi8KLSMgIGRlZmluZSBOT19HWkNPTVBSRVNTCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoU1REQzk5KSB8fCAoZGVmaW5lZChfX1RVUkJPQ19fKSAmJiBfX1RVUkJPQ19fID49IDB4NTUwKQotIyAgaWZuZGVmIEhBVkVfVlNOUFJJTlRGCi0jICAgIGRlZmluZSBIQVZFX1ZTTlBSSU5URgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0NZR1dJTl9fKQotIyAgaWZuZGVmIEhBVkVfVlNOUFJJTlRGCi0jICAgIGRlZmluZSBIQVZFX1ZTTlBSSU5URgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChNU0RPUykgJiYgZGVmaW5lZChfX0JPUkxBTkRDX18pICYmIChCT1JMQU5EQyA+IDB4NDEwKQotIyAgaWZuZGVmIEhBVkVfVlNOUFJJTlRGCi0jICAgIGRlZmluZSBIQVZFX1ZTTlBSSU5URgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfVlNOUFJJTlRGCi0jICBpZmRlZiBNU0RPUwotLyogdnNucHJpbnRmIG1heSBleGlzdCBvbiBzb21lIE1TLURPUyBjb21waWxlcnMgKERKR1BQPyksCi0gICBidXQgZm9yIG5vdyB3ZSBqdXN0IGFzc3VtZSBpdCBkb2Vzbid0LiAqLwotIyAgICBkZWZpbmUgTk9fdnNucHJpbnRmCi0jICBlbmRpZgotIyAgaWZkZWYgX19UVVJCT0NfXwotIyAgICBkZWZpbmUgTk9fdnNucHJpbnRmCi0jICBlbmRpZgotIyAgaWZkZWYgV0lOMzIKLS8qIEluIFdpbjMyLCB2c25wcmludGYgaXMgYXZhaWxhYmxlIGFzIHRoZSAibm9uLUFOU0kiIF92c25wcmludGYuICovCi0jICAgIGlmICFkZWZpbmVkKHZzbnByaW50ZikgJiYgIWRlZmluZWQoTk9fdnNucHJpbnRmKQotIyAgICAgIGlmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCAoIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSIDwgMTUwMCApCi0jICAgICAgICAgZGVmaW5lIHZzbnByaW50ZiBfdnNucHJpbnRmCi0jICAgICAgZW5kaWYKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jICBpZmRlZiBfX1NBU0MKLSMgICAgZGVmaW5lIE5PX3ZzbnByaW50ZgotIyAgZW5kaWYKLSMgIGlmZGVmIFZNUwotIyAgICBkZWZpbmUgTk9fdnNucHJpbnRmCi0jICBlbmRpZgotIyAgaWZkZWYgX19PUzQwMF9fCi0jICAgIGRlZmluZSBOT192c25wcmludGYKLSMgIGVuZGlmCi0jICBpZmRlZiBfX01WU19fCi0jICAgIGRlZmluZSBOT192c25wcmludGYKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogdW5saWtlIHNucHJpbnRmICh3aGljaCBpcyByZXF1aXJlZCBpbiBDOTksIHlldCBzdGlsbCBub3Qgc3VwcG9ydGVkIGJ5Ci0gICBNaWNyb3NvZnQgbW9yZSB0aGFuIGEgZGVjYWRlIGxhdGVyISksIF9zbnByaW50ZiBkb2VzIG5vdCBndWFyYW50ZWUgbnVsbAotICAgdGVybWluYXRpb24gb2YgdGhlIHJlc3VsdCAtLSBob3dldmVyIHRoaXMgaXMgb25seSB1c2VkIGluIGd6bGliLmMgd2hlcmUKLSAgIHRoZSByZXN1bHQgaXMgYXNzdXJlZCB0byBmaXQgaW4gdGhlIHNwYWNlIHByb3ZpZGVkICovCi0jaWZkZWYgX01TQ19WRVIKLSMgIGRlZmluZSBzbnByaW50ZiBfc25wcmludGYKLSNlbmRpZgotCi0jaWZuZGVmIGxvY2FsCi0jICBkZWZpbmUgbG9jYWwgc3RhdGljCi0jZW5kaWYKLS8qIGNvbXBpbGUgd2l0aCAtRGxvY2FsIGlmIHlvdXIgZGVidWdnZXIgY2FuJ3QgZmluZCBzdGF0aWMgc3ltYm9scyAqLwotCi0vKiBneiogZnVuY3Rpb25zIGFsd2F5cyB1c2UgbGlicmFyeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyAqLwotI2lmbmRlZiBTVERDCi0gIGV4dGVybiB2b2lkcCAgbWFsbG9jIE9GKCh1SW50IHNpemUpKTsKLSAgZXh0ZXJuIHZvaWQgICBmcmVlICAgT0YoKHZvaWRwZiBwdHIpKTsKLSNlbmRpZgotCi1leHRlcm4gdm9pZCogRlhNRU1fRGVmYXVsdEFsbG9jKHNpemVfdCwgaW50KTsKLWV4dGVybiB2b2lkIEZYTUVNX0RlZmF1bHRGcmVlKHZvaWQqLCBpbnQpOwotCi0jZGVmaW5lIG1hbGxvYyhzaXplKSBGWE1FTV9EZWZhdWx0QWxsb2Moc2l6ZSwgMCkKLSNkZWZpbmUgZnJlZShwdHIpIEZYTUVNX0RlZmF1bHRGcmVlKHB0ciwgMCkKLQotLyogZ2V0IGVycm5vIGFuZCBzdHJlcnJvciBkZWZpbml0aW9uICovCi0jaWYgZGVmaW5lZCBVTkRFUl9DRQotIyAgaW5jbHVkZSA8d2luZG93cy5oPgotIyAgZGVmaW5lIHpzdHJlcnJvcigpIGd6X3N0cndpbmVycm9yKChEV09SRClHZXRMYXN0RXJyb3IoKSkKLSNlbHNlCi0jICBpZm5kZWYgTk9fU1RSRVJST1IKLSMgICAgaW5jbHVkZSA8ZXJybm8uaD4KLSMgICAgZGVmaW5lIHpzdHJlcnJvcigpIHN0cmVycm9yKGVycm5vKQotIyAgZWxzZQotIyAgICBkZWZpbmUgenN0cmVycm9yKCkgInN0ZGlvIGVycm9yIChjb25zdWx0IGVycm5vKSIKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogcHJvdmlkZSBwcm90b3R5cGVzIGZvciB0aGVzZSB3aGVuIGJ1aWxkaW5nIHpsaWIgd2l0aG91dCBMRlMgKi8KLSNpZiAhZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKSB8fCBfTEZTNjRfTEFSR0VGSUxFLTAgPT0gMAotICAgIFpFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuNjQgT0YoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci0gICAgWkVYVEVSTiB6X29mZjY0X3QgWkVYUE9SVCBnenNlZWs2NCBPRigoZ3pGaWxlLCB6X29mZjY0X3QsIGludCkpOwotICAgIFpFWFRFUk4gel9vZmY2NF90IFpFWFBPUlQgZ3p0ZWxsNjQgT0YoKGd6RmlsZSkpOwotICAgIFpFWFRFUk4gel9vZmY2NF90IFpFWFBPUlQgZ3pvZmZzZXQ2NCBPRigoZ3pGaWxlKSk7Ci0jZW5kaWYKLQotLyogZGVmYXVsdCBtZW1MZXZlbCAqLwotI2lmIE1BWF9NRU1fTEVWRUwgPj0gOAotIyAgZGVmaW5lIERFRl9NRU1fTEVWRUwgOAotI2Vsc2UKLSMgIGRlZmluZSBERUZfTUVNX0xFVkVMICBNQVhfTUVNX0xFVkVMCi0jZW5kaWYKLQotLyogZGVmYXVsdCBpL28gYnVmZmVyIHNpemUgLS0gZG91YmxlIHRoaXMgZm9yIG91dHB1dCB3aGVuIHJlYWRpbmcgKHRoaXMgYW5kCi0gICB0d2ljZSB0aGlzIG11c3QgYmUgYWJsZSB0byBmaXQgaW4gYW4gdW5zaWduZWQgdHlwZSkgKi8KLSNkZWZpbmUgR1pCVUZTSVpFIDgxOTIKLQotLyogZ3ppcCBtb2RlcywgYWxzbyBwcm92aWRlIGEgbGl0dGxlIGludGVncml0eSBjaGVjayBvbiB0aGUgcGFzc2VkIHN0cnVjdHVyZSAqLwotI2RlZmluZSBHWl9OT05FIDAKLSNkZWZpbmUgR1pfUkVBRCA3MjQ3Ci0jZGVmaW5lIEdaX1dSSVRFIDMxMTUzCi0jZGVmaW5lIEdaX0FQUEVORCAxICAgICAvKiBtb2RlIHNldCB0byBHWl9XUklURSBhZnRlciB0aGUgZmlsZSBpcyBvcGVuZWQgKi8KLQotLyogdmFsdWVzIGZvciBnel9zdGF0ZSBob3cgKi8KLSNkZWZpbmUgTE9PSyAwICAgICAgLyogbG9vayBmb3IgYSBnemlwIGhlYWRlciAqLwotI2RlZmluZSBDT1BZIDEgICAgICAvKiBjb3B5IGlucHV0IGRpcmVjdGx5ICovCi0jZGVmaW5lIEdaSVAgMiAgICAgIC8qIGRlY29tcHJlc3MgYSBnemlwIHN0cmVhbSAqLwotCi0vKiBpbnRlcm5hbCBnemlwIGZpbGUgc3RhdGUgZGF0YSBzdHJ1Y3R1cmUgKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgICAgICAgLyogZXhwb3NlZCBjb250ZW50cyBmb3IgZ3pnZXRjKCkgbWFjcm8gKi8KLSAgICBzdHJ1Y3QgZ3pGaWxlX3MgeDsgICAgICAvKiAieCIgZm9yIGV4cG9zZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB4LmhhdmU6IG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYXQgeC5uZXh0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogeC5uZXh0OiBuZXh0IG91dHB1dCBkYXRhIHRvIGRlbGl2ZXIgb3Igd3JpdGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB4LnBvczogY3VycmVudCBwb3NpdGlvbiBpbiB1bmNvbXByZXNzZWQgZGF0YSAqLwotICAgICAgICAvKiB1c2VkIGZvciBib3RoIHJlYWRpbmcgYW5kIHdyaXRpbmcgKi8KLSAgICBpbnQgbW9kZTsgICAgICAgICAgICAgICAvKiBzZWUgZ3ppcCBtb2RlcyBhYm92ZSAqLwotICAgIGludCBmZDsgICAgICAgICAgICAgICAgIC8qIGZpbGUgZGVzY3JpcHRvciAqLwotICAgIGNoYXIgKnBhdGg7ICAgICAgICAgICAgIC8qIHBhdGggb3IgZmQgZm9yIGVycm9yIG1lc3NhZ2VzICovCi0gICAgdW5zaWduZWQgc2l6ZTsgICAgICAgICAgLyogYnVmZmVyIHNpemUsIHplcm8gaWYgbm90IGFsbG9jYXRlZCB5ZXQgKi8KLSAgICB1bnNpZ25lZCB3YW50OyAgICAgICAgICAvKiByZXF1ZXN0ZWQgYnVmZmVyIHNpemUsIGRlZmF1bHQgaXMgR1pCVUZTSVpFICovCi0gICAgdW5zaWduZWQgY2hhciAqaW47ICAgICAgLyogaW5wdXQgYnVmZmVyICovCi0gICAgdW5zaWduZWQgY2hhciAqb3V0OyAgICAgLyogb3V0cHV0IGJ1ZmZlciAoZG91YmxlLXNpemVkIHdoZW4gcmVhZGluZykgKi8KLSAgICBpbnQgZGlyZWN0OyAgICAgICAgICAgICAvKiAwIGlmIHByb2Nlc3NpbmcgZ3ppcCwgMSBpZiB0cmFuc3BhcmVudCAqLwotICAgICAgICAvKiBqdXN0IGZvciByZWFkaW5nICovCi0gICAgaW50IGhvdzsgICAgICAgICAgICAgICAgLyogMDogZ2V0IGhlYWRlciwgMTogY29weSwgMjogZGVjb21wcmVzcyAqLwotICAgIHpfb2ZmNjRfdCBzdGFydDsgICAgICAgIC8qIHdoZXJlIHRoZSBnemlwIGRhdGEgc3RhcnRlZCwgZm9yIHJld2luZGluZyAqLwotICAgIGludCBlb2Y7ICAgICAgICAgICAgICAgIC8qIHRydWUgaWYgZW5kIG9mIGlucHV0IGZpbGUgcmVhY2hlZCAqLwotICAgIGludCBwYXN0OyAgICAgICAgICAgICAgIC8qIHRydWUgaWYgcmVhZCByZXF1ZXN0ZWQgcGFzdCBlbmQgKi8KLSAgICAgICAgLyoganVzdCBmb3Igd3JpdGluZyAqLwotICAgIGludCBsZXZlbDsgICAgICAgICAgICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICovCi0gICAgaW50IHN0cmF0ZWd5OyAgICAgICAgICAgLyogY29tcHJlc3Npb24gc3RyYXRlZ3kgKi8KLSAgICAgICAgLyogc2VlayByZXF1ZXN0ICovCi0gICAgel9vZmY2NF90IHNraXA7ICAgICAgICAgLyogYW1vdW50IHRvIHNraXAgKGFscmVhZHkgcmV3b3VuZCBpZiBiYWNrd2FyZHMpICovCi0gICAgaW50IHNlZWs7ICAgICAgICAgICAgICAgLyogdHJ1ZSBpZiBzZWVrIHJlcXVlc3QgcGVuZGluZyAqLwotICAgICAgICAvKiBlcnJvciBpbmZvcm1hdGlvbiAqLwotICAgIGludCBlcnI7ICAgICAgICAgICAgICAgIC8qIGVycm9yIGNvZGUgKi8KLSAgICBjaGFyICptc2c7ICAgICAgICAgICAgICAvKiBlcnJvciBtZXNzYWdlICovCi0gICAgICAgIC8qIHpsaWIgaW5mbGF0ZSBvciBkZWZsYXRlIHN0cmVhbSAqLwotICAgIHpfc3RyZWFtIHN0cm07ICAgICAgICAgIC8qIHN0cmVhbSBzdHJ1Y3R1cmUgaW4tcGxhY2UgKG5vdCBhIHBvaW50ZXIpICovCi19IGd6X3N0YXRlOwotdHlwZWRlZiBnel9zdGF0ZSBGQVIgKmd6X3N0YXRlcDsKLQotLyogc2hhcmVkIGZ1bmN0aW9ucyAqLwotdm9pZCBaTElCX0lOVEVSTkFMIGd6X2Vycm9yIE9GKChnel9zdGF0ZXAsIGludCwgY29uc3QgY2hhciAqKSk7Ci0jaWYgZGVmaW5lZCBVTkRFUl9DRQotY2hhciBaTElCX0lOVEVSTkFMICpnel9zdHJ3aW5lcnJvciBPRigoRFdPUkQgZXJyb3IpKTsKLSNlbmRpZgotCi0vKiBHVF9PRkYoeCksIHdoZXJlIHggaXMgYW4gdW5zaWduZWQgdmFsdWUsIGlzIHRydWUgaWYgeCA+IG1heGltdW0gel9vZmY2NF90Ci0gICB2YWx1ZSAtLSBuZWVkZWQgd2hlbiBjb21wYXJpbmcgdW5zaWduZWQgdG8gel9vZmY2NF90LCB3aGljaCBpcyBzaWduZWQKLSAgIChwb3NzaWJsZSB6X29mZjY0X3QgdHlwZXMgb2ZmX3QsIG9mZjY0X3QsIGFuZCBsb25nIGFyZSBhbGwgc2lnbmVkKSAqLwotI2lmZGVmIElOVF9NQVgKLSMgIGRlZmluZSBHVF9PRkYoeCkgKHNpemVvZihpbnQpID09IHNpemVvZih6X29mZjY0X3QpICYmICh4KSA+IElOVF9NQVgpCi0jZWxzZQotdW5zaWduZWQgWkxJQl9JTlRFUk5BTCBnel9pbnRtYXggT0YoKHZvaWQpKTsKLSMgIGRlZmluZSBHVF9PRkYoeCkgKHNpemVvZihpbnQpID09IHNpemVvZih6X29mZjY0X3QpICYmICh4KSA+IGd6X2ludG1heCgpKQotI2VuZGlmCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS96bGliX3YxMjgvZ3psaWIuYyBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9nemxpYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGIxNzY0Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9nemxpYi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjM0ICswLDAgQEAKLS8qIGd6bGliLmMgLS0gemxpYiBmdW5jdGlvbnMgY29tbW9uIHRvIHJlYWRpbmcgYW5kIHdyaXRpbmcgZ3ppcCBmaWxlcwotICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDEwLCAyMDExLCAyMDEyLCAyMDEzIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0jaW5jbHVkZSAiZ3pndXRzLmgiCi0KLSNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19CT1JMQU5EQ19fKQotIyAgZGVmaW5lIExTRUVLIF9sc2Vla2k2NAotI2Vsc2UKLSNpZiBkZWZpbmVkKF9MQVJHRUZJTEU2NF9TT1VSQ0UpICYmIF9MRlM2NF9MQVJHRUZJTEUtMAotIyAgZGVmaW5lIExTRUVLIGxzZWVrNjQKLSNlbHNlCi0jICBkZWZpbmUgTFNFRUsgbHNlZWsKLSNlbmRpZgotI2VuZGlmCi0KLS8qIExvY2FsIGZ1bmN0aW9ucyAqLwotbG9jYWwgdm9pZCBnel9yZXNldCBPRigoZ3pfc3RhdGVwKSk7Ci1sb2NhbCBnekZpbGUgZ3pfb3BlbiBPRigoY29uc3Qgdm9pZCAqLCBpbnQsIGNvbnN0IGNoYXIgKikpOwotCi0jaWYgZGVmaW5lZCBVTkRFUl9DRQotCi0vKiBNYXAgdGhlIFdpbmRvd3MgZXJyb3IgbnVtYmVyIGluIEVSUk9SIHRvIGEgbG9jYWxlLWRlcGVuZGVudCBlcnJvciBtZXNzYWdlCi0gICBzdHJpbmcgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gaXQuICBUeXBpY2FsbHksIHRoZSB2YWx1ZXMgZm9yIEVSUk9SIGNvbWUKLSAgIGZyb20gR2V0TGFzdEVycm9yLgotCi0gICBUaGUgc3RyaW5nIHBvaW50ZWQgdG8gc2hhbGwgbm90IGJlIG1vZGlmaWVkIGJ5IHRoZSBhcHBsaWNhdGlvbiwgYnV0IG1heSBiZQotICAgb3ZlcndyaXR0ZW4gYnkgYSBzdWJzZXF1ZW50IGNhbGwgdG8gZ3pfc3Ryd2luZXJyb3IKLQotICAgVGhlIGd6X3N0cndpbmVycm9yIGZ1bmN0aW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgY3VycmVudCBzZXR0aW5nIG9mCi0gICBHZXRMYXN0RXJyb3IuICovCi1jaGFyIFpMSUJfSU5URVJOQUwgKmd6X3N0cndpbmVycm9yICgKLSAgICAgRFdPUkQgZXJyb3IpCi17Ci0gICAgc3RhdGljIGNoYXIgYnVmWzEwMjRdOwotCi0gICAgd2NoYXJfdCAqbXNnYnVmOwotICAgIERXT1JEIGxhc3RlcnIgPSBHZXRMYXN0RXJyb3IoKTsKLSAgICBEV09SRCBjaGFycyA9IEZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfRlJPTV9TWVNURU0KLSAgICAgICAgfCBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIsCi0gICAgICAgIE5VTEwsCi0gICAgICAgIGVycm9yLAotICAgICAgICAwLCAvKiBEZWZhdWx0IGxhbmd1YWdlICovCi0gICAgICAgIChMUFZPSUQpJm1zZ2J1ZiwKLSAgICAgICAgMCwKLSAgICAgICAgTlVMTCk7Ci0gICAgaWYgKGNoYXJzICE9IDApIHsKLSAgICAgICAgLyogSWYgdGhlcmUgaXMgYW4gXHJcbiBhcHBlbmRlZCwgemFwIGl0LiAgKi8KLSAgICAgICAgaWYgKGNoYXJzID49IDIKLSAgICAgICAgICAgICYmIG1zZ2J1ZltjaGFycyAtIDJdID09ICdccicgJiYgbXNnYnVmW2NoYXJzIC0gMV0gPT0gJ1xuJykgewotICAgICAgICAgICAgY2hhcnMgLT0gMjsKLSAgICAgICAgICAgIG1zZ2J1ZltjaGFyc10gPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNoYXJzID4gc2l6ZW9mIChidWYpIC0gMSkgewotICAgICAgICAgICAgY2hhcnMgPSBzaXplb2YgKGJ1ZikgLSAxOwotICAgICAgICAgICAgbXNnYnVmW2NoYXJzXSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICB3Y3N0b21icyhidWYsIG1zZ2J1ZiwgY2hhcnMgKyAxKTsKLSAgICAgICAgTG9jYWxGcmVlKG1zZ2J1Zik7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBzcHJpbnRmKGJ1ZiwgInVua25vd24gd2luMzIgZXJyb3IgKCVsZCkiLCBlcnJvcik7Ci0gICAgfQotCi0gICAgU2V0TGFzdEVycm9yKGxhc3RlcnIpOwotICAgIHJldHVybiBidWY7Ci19Ci0KLSNlbmRpZiAvKiBVTkRFUl9DRSAqLwotCi0vKiBSZXNldCBnemlwIGZpbGUgc3RhdGUgKi8KLWxvY2FsIHZvaWQgZ3pfcmVzZXQoCi0gICAgZ3pfc3RhdGVwIHN0YXRlKQotewotICAgIHN0YXRlLT54LmhhdmUgPSAwOyAgICAgICAgICAgICAgLyogbm8gb3V0cHV0IGRhdGEgYXZhaWxhYmxlICovCi0gICAgaWYgKHN0YXRlLT5tb2RlID09IEdaX1JFQUQpIHsgICAvKiBmb3IgcmVhZGluZyAuLi4gKi8KLSAgICAgICAgc3RhdGUtPmVvZiA9IDA7ICAgICAgICAgICAgIC8qIG5vdCBhdCBlbmQgb2YgZmlsZSAqLwotICAgICAgICBzdGF0ZS0+cGFzdCA9IDA7ICAgICAgICAgICAgLyogaGF2ZSBub3QgcmVhZCBwYXN0IGVuZCB5ZXQgKi8KLSAgICAgICAgc3RhdGUtPmhvdyA9IExPT0s7ICAgICAgICAgIC8qIGxvb2sgZm9yIGd6aXAgaGVhZGVyICovCi0gICAgfQotICAgIHN0YXRlLT5zZWVrID0gMDsgICAgICAgICAgICAgICAgLyogbm8gc2VlayByZXF1ZXN0IHBlbmRpbmcgKi8KLSAgICBnel9lcnJvcihzdGF0ZSwgWl9PSywgTlVMTCk7ICAgIC8qIGNsZWFyIGVycm9yICovCi0gICAgc3RhdGUtPngucG9zID0gMDsgICAgICAgICAgICAgICAvKiBubyB1bmNvbXByZXNzZWQgZGF0YSB5ZXQgKi8KLSAgICBzdGF0ZS0+c3RybS5hdmFpbF9pbiA9IDA7ICAgICAgIC8qIG5vIGlucHV0IGRhdGEgeWV0ICovCi19Ci0KLS8qIE9wZW4gYSBnemlwIGZpbGUgZWl0aGVyIGJ5IG5hbWUgb3IgZmlsZSBkZXNjcmlwdG9yLiAqLwotbG9jYWwgZ3pGaWxlIGd6X29wZW4oCi0gICAgY29uc3Qgdm9pZCAqcGF0aCwKLSAgICBpbnQgZmQsCi0gICAgY29uc3QgY2hhciAqbW9kZSkKLXsKLSAgICBnel9zdGF0ZXAgc3RhdGU7Ci0gICAgc2l6ZV90IGxlbjsKLSAgICBpbnQgb2ZsYWc7Ci0jaWZkZWYgT19DTE9FWEVDCi0gICAgaW50IGNsb2V4ZWMgPSAwOwotI2VuZGlmCi0jaWZkZWYgT19FWENMCi0gICAgaW50IGV4Y2x1c2l2ZSA9IDA7Ci0jZW5kaWYKLQotICAgIC8qIGNoZWNrIGlucHV0ICovCi0gICAgaWYgKHBhdGggPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0KLSAgICAvKiBhbGxvY2F0ZSBnekZpbGUgc3RydWN0dXJlIHRvIHJldHVybiAqLwotICAgIHN0YXRlID0gKGd6X3N0YXRlcCltYWxsb2Moc2l6ZW9mKGd6X3N0YXRlKSk7Ci0gICAgaWYgKHN0YXRlID09IE5VTEwpCi0gICAgICAgIHJldHVybiBOVUxMOwotICAgIHN0YXRlLT5zaXplID0gMDsgICAgICAgICAgICAvKiBubyBidWZmZXJzIGFsbG9jYXRlZCB5ZXQgKi8KLSAgICBzdGF0ZS0+d2FudCA9IEdaQlVGU0laRTsgICAgLyogcmVxdWVzdGVkIGJ1ZmZlciBzaXplICovCi0gICAgc3RhdGUtPm1zZyA9IE5VTEw7ICAgICAgICAgIC8qIG5vIGVycm9yIG1lc3NhZ2UgeWV0ICovCi0KLSAgICAvKiBpbnRlcnByZXQgbW9kZSAqLwotICAgIHN0YXRlLT5tb2RlID0gR1pfTk9ORTsKLSAgICBzdGF0ZS0+bGV2ZWwgPSBaX0RFRkFVTFRfQ09NUFJFU1NJT047Ci0gICAgc3RhdGUtPnN0cmF0ZWd5ID0gWl9ERUZBVUxUX1NUUkFURUdZOwotICAgIHN0YXRlLT5kaXJlY3QgPSAwOwotICAgIHdoaWxlICgqbW9kZSkgewotICAgICAgICBpZiAoKm1vZGUgPj0gJzAnICYmICptb2RlIDw9ICc5JykKLSAgICAgICAgICAgIHN0YXRlLT5sZXZlbCA9ICptb2RlIC0gJzAnOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBzd2l0Y2ggKCptb2RlKSB7Ci0gICAgICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEdaX1JFQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0jaWZuZGVmIE5PX0daQ09NUFJFU1MKLSAgICAgICAgICAgIGNhc2UgJ3cnOgotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gR1pfV1JJVEU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdhJzoKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEdaX0FQUEVORDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSNlbmRpZgotICAgICAgICAgICAgY2FzZSAnKyc6ICAgICAgIC8qIGNhbid0IHJlYWQgYW5kIHdyaXRlIGF0IHRoZSBzYW1lIHRpbWUgKi8KLSAgICAgICAgICAgICAgICBmcmVlKHN0YXRlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgICAgIGNhc2UgJ2InOiAgICAgICAvKiBpZ25vcmUgLS0gd2lsbCByZXF1ZXN0IGJpbmFyeSBhbnl3YXkgKi8KLSAgICAgICAgICAgICAgICBicmVhazsKLSNpZmRlZiBPX0NMT0VYRUMKLSAgICAgICAgICAgIGNhc2UgJ2UnOgotICAgICAgICAgICAgICAgIGNsb2V4ZWMgPSAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0jaWZkZWYgT19FWENMCi0gICAgICAgICAgICBjYXNlICd4JzoKLSAgICAgICAgICAgICAgICBleGNsdXNpdmUgPSAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgICAgICBjYXNlICdmJzoKLSAgICAgICAgICAgICAgICBzdGF0ZS0+c3RyYXRlZ3kgPSBaX0ZJTFRFUkVEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAnaCc6Ci0gICAgICAgICAgICAgICAgc3RhdGUtPnN0cmF0ZWd5ID0gWl9IVUZGTUFOX09OTFk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdSJzoKLSAgICAgICAgICAgICAgICBzdGF0ZS0+c3RyYXRlZ3kgPSBaX1JMRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgJ0YnOgotICAgICAgICAgICAgICAgIHN0YXRlLT5zdHJhdGVneSA9IFpfRklYRUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlICdUJzoKLSAgICAgICAgICAgICAgICBzdGF0ZS0+ZGlyZWN0ID0gMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAvKiBjb3VsZCBjb25zaWRlciBhcyBhbiBlcnJvciwgYnV0IGp1c3QgaWdub3JlICovCi0gICAgICAgICAgICAgICAgOwotICAgICAgICAgICAgfQotICAgICAgICBtb2RlKys7Ci0gICAgfQotCi0gICAgLyogbXVzdCBwcm92aWRlIGFuICJyIiwgInciLCBvciAiYSIgKi8KLSAgICBpZiAoc3RhdGUtPm1vZGUgPT0gR1pfTk9ORSkgewotICAgICAgICBmcmVlKHN0YXRlKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgLyogY2FuJ3QgZm9yY2UgdHJhbnNwYXJlbnQgcmVhZCAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBHWl9SRUFEKSB7Ci0gICAgICAgIGlmIChzdGF0ZS0+ZGlyZWN0KSB7Ci0gICAgICAgICAgICBmcmVlKHN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIHN0YXRlLT5kaXJlY3QgPSAxOyAgICAgIC8qIGZvciBlbXB0eSBmaWxlICovCi0gICAgfQotCi0gICAgLyogc2F2ZSB0aGUgcGF0aCBuYW1lIGZvciBlcnJvciBtZXNzYWdlcyAqLwotI2lmZGVmIF9XSU4zMgotICAgIGlmIChmZCA9PSAtMikgewotICAgICAgICBsZW4gPSB3Y3N0b21icyhOVUxMLCBwYXRoLCAwKTsKLSAgICAgICAgaWYgKGxlbiA9PSAoc2l6ZV90KS0xKQotICAgICAgICAgICAgbGVuID0gMDsKLSAgICB9Ci0gICAgZWxzZQotI2VuZGlmCi0gICAgICAgIGxlbiA9IHN0cmxlbigoY29uc3QgY2hhciAqKXBhdGgpOwotICAgIHN0YXRlLT5wYXRoID0gKGNoYXIgKiltYWxsb2MobGVuICsgMSk7Ci0gICAgaWYgKHN0YXRlLT5wYXRoID09IE5VTEwpIHsKLSAgICAgICAgZnJlZShzdGF0ZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSNpZmRlZiBfV0lOMzIKLSAgICBpZiAoZmQgPT0gLTIpCi0gICAgICAgIGlmIChsZW4pCi0gICAgICAgICAgICB3Y3N0b21icyhzdGF0ZS0+cGF0aCwgcGF0aCwgbGVuICsgMSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICooc3RhdGUtPnBhdGgpID0gMDsKLSAgICBlbHNlCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChOT19zbnByaW50ZikgJiYgIWRlZmluZWQoTk9fdnNucHJpbnRmKQotICAgICAgICBzbnByaW50ZihzdGF0ZS0+cGF0aCwgbGVuICsgMSwgIiVzIiwgKGNvbnN0IGNoYXIgKilwYXRoKTsKLSNlbHNlCi0gICAgICAgIHN0cmNweShzdGF0ZS0+cGF0aCwgcGF0aCk7Ci0jZW5kaWYKLQotICAgIC8qIGNvbXB1dGUgdGhlIGZsYWdzIGZvciBvcGVuKCkgKi8KLSAgICBvZmxhZyA9Ci0jaWZkZWYgT19MQVJHRUZJTEUKLSAgICAgICAgT19MQVJHRUZJTEUgfAotI2VuZGlmCi0jaWZkZWYgT19CSU5BUlkKLSAgICAgICAgT19CSU5BUlkgfAotI2VuZGlmCi0jaWZkZWYgT19DTE9FWEVDCi0gICAgICAgIChjbG9leGVjID8gT19DTE9FWEVDIDogMCkgfAotI2VuZGlmCi0gICAgICAgIChzdGF0ZS0+bW9kZSA9PSBHWl9SRUFEID8KLSAgICAgICAgIE9fUkRPTkxZIDoKLSAgICAgICAgIChPX1dST05MWSB8IE9fQ1JFQVQgfAotI2lmZGVmIE9fRVhDTAotICAgICAgICAgIChleGNsdXNpdmUgPyBPX0VYQ0wgOiAwKSB8Ci0jZW5kaWYKLSAgICAgICAgICAoc3RhdGUtPm1vZGUgPT0gR1pfV1JJVEUgPwotICAgICAgICAgICBPX1RSVU5DIDoKLSAgICAgICAgICAgT19BUFBFTkQpKSk7Ci0KLSAgICAvKiBvcGVuIHRoZSBmaWxlIHdpdGggdGhlIGFwcHJvcHJpYXRlIGZsYWdzIChvciBqdXN0IHVzZSBmZCkgKi8KLSAgICBzdGF0ZS0+ZmQgPSBmZCA+IC0xID8gZmQgOiAoCi0jaWZkZWYgX1dJTjMyCi0gICAgICAgIGZkID09IC0yID8gX3dvcGVuKHBhdGgsIG9mbGFnLCAwNjY2KSA6Ci0jZW5kaWYKLSAgICAgICAgb3BlbigoY29uc3QgY2hhciAqKXBhdGgsIG9mbGFnLCAwNjY2KSk7Ci0gICAgaWYgKHN0YXRlLT5mZCA9PSAtMSkgewotICAgICAgICBmcmVlKHN0YXRlLT5wYXRoKTsKLSAgICAgICAgZnJlZShzdGF0ZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoc3RhdGUtPm1vZGUgPT0gR1pfQVBQRU5EKQotICAgICAgICBzdGF0ZS0+bW9kZSA9IEdaX1dSSVRFOyAgICAgICAgIC8qIHNpbXBsaWZ5IGxhdGVyIGNoZWNrcyAqLwotCi0gICAgLyogc2F2ZSB0aGUgY3VycmVudCBwb3NpdGlvbiBmb3IgcmV3aW5kaW5nIChvbmx5IGlmIHJlYWRpbmcpICovCi0gICAgaWYgKHN0YXRlLT5tb2RlID09IEdaX1JFQUQpIHsKLSAgICAgICAgc3RhdGUtPnN0YXJ0ID0gTFNFRUsoc3RhdGUtPmZkLCAwLCBTRUVLX0NVUik7Ci0gICAgICAgIGlmIChzdGF0ZS0+c3RhcnQgPT0gLTEpIHN0YXRlLT5zdGFydCA9IDA7Ci0gICAgfQotCi0gICAgLyogaW5pdGlhbGl6ZSBzdHJlYW0gKi8KLSAgICBnel9yZXNldChzdGF0ZSk7Ci0KLSAgICAvKiByZXR1cm4gc3RyZWFtICovCi0gICAgcmV0dXJuIChnekZpbGUpc3RhdGU7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLWd6RmlsZSBaRVhQT1JUIGd6b3BlbigKLSAgICBjb25zdCBjaGFyICpwYXRoLAotICAgIGNvbnN0IGNoYXIgKm1vZGUpCi17Ci0gICAgcmV0dXJuIGd6X29wZW4ocGF0aCwgLTEsIG1vZGUpOwotfQotCi0vKiAtLSBzZWUgemxpYi5oIC0tICovCi1nekZpbGUgWkVYUE9SVCBnem9wZW42NCgKLSAgICBjb25zdCBjaGFyICpwYXRoLAotICAgIGNvbnN0IGNoYXIgKm1vZGUpCi17Ci0gICAgcmV0dXJuIGd6X29wZW4ocGF0aCwgLTEsIG1vZGUpOwotfQotCi0vKiAtLSBzZWUgemxpYi5oIC0tICovCi1nekZpbGUgWkVYUE9SVCBnemRvcGVuKAotICAgIGludCBmZCwKLSAgICBjb25zdCBjaGFyICptb2RlKQotewotICAgIGNoYXIgKnBhdGg7ICAgICAgICAgLyogaWRlbnRpZmllciBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KLSAgICBnekZpbGUgZ3o7Ci0KLSAgICBpZiAoZmQgPT0gLTEgfHwgKHBhdGggPSAoY2hhciAqKW1hbGxvYyg3ICsgMyAqIHNpemVvZihpbnQpKSkgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0jaWYgIWRlZmluZWQoTk9fc25wcmludGYpICYmICFkZWZpbmVkKE5PX3ZzbnByaW50ZikKLSAgICBzbnByaW50ZihwYXRoLCA3ICsgMyAqIHNpemVvZihpbnQpLCAiPGZkOiVkPiIsIGZkKTsgLyogZm9yIGRlYnVnZ2luZyAqLwotI2Vsc2UKLSAgICBzcHJpbnRmKHBhdGgsICI8ZmQ6JWQ+IiwgZmQpOyAgIC8qIGZvciBkZWJ1Z2dpbmcgKi8KLSNlbmRpZgotICAgIGd6ID0gZ3pfb3BlbihwYXRoLCBmZCwgbW9kZSk7Ci0gICAgZnJlZShwYXRoKTsKLSAgICByZXR1cm4gZ3o7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLSNpZmRlZiBfV0lOMzIKLWd6RmlsZSBaRVhQT1JUIGd6b3Blbl93KAotICAgIGNvbnN0IHdjaGFyX3QgKnBhdGgsCi0gICAgY29uc3QgY2hhciAqbW9kZSkKLXsKLSAgICByZXR1cm4gZ3pfb3BlbihwYXRoLCAtMiwgbW9kZSk7Ci19Ci0jZW5kaWYKLQotLyogLS0gc2VlIHpsaWIuaCAtLSAqLwotaW50IFpFWFBPUlQgZ3pidWZmZXIoCi0gICAgZ3pGaWxlIGZpbGUsCi0gICAgdW5zaWduZWQgc2l6ZSkKLXsKLSAgICBnel9zdGF0ZXAgc3RhdGU7Ci0KLSAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlIGFuZCBjaGVjayBpbnRlZ3JpdHkgKi8KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7Ci0gICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIG1ha2Ugc3VyZSB3ZSBoYXZlbid0IGFscmVhZHkgYWxsb2NhdGVkIG1lbW9yeSAqLwotICAgIGlmIChzdGF0ZS0+c2l6ZSAhPSAwKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAvKiBjaGVjayBhbmQgc2V0IHJlcXVlc3RlZCBzaXplICovCi0gICAgaWYgKHNpemUgPCAyKQotICAgICAgICBzaXplID0gMjsgICAgICAgICAgICAgICAvKiBuZWVkIHR3byBieXRlcyB0byBjaGVjayBtYWdpYyBoZWFkZXIgKi8KLSAgICBzdGF0ZS0+d2FudCA9IHNpemU7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLWludCBaRVhQT1JUIGd6cmV3aW5kKAotICAgIGd6RmlsZSBmaWxlKQotewotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLQotICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7Ci0KLSAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHJlYWRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9SRUFEIHx8Ci0gICAgICAgICAgICAoc3RhdGUtPmVyciAhPSBaX09LICYmIHN0YXRlLT5lcnIgIT0gWl9CVUZfRVJST1IpKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAvKiBiYWNrIHVwIGFuZCBzdGFydCBvdmVyICovCi0gICAgaWYgKExTRUVLKHN0YXRlLT5mZCwgc3RhdGUtPnN0YXJ0LCBTRUVLX1NFVCkgPT0gLTEpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBnel9yZXNldChzdGF0ZSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLXpfb2ZmNjRfdCBaRVhQT1JUIGd6c2VlazY0KAotICAgIGd6RmlsZSBmaWxlLAotICAgIHpfb2ZmNjRfdCBvZmZzZXQsCi0gICAgaW50IHdoZW5jZSkKLXsKLSAgICB1bnNpZ25lZCBuOwotICAgIHpfb2ZmNjRfdCByZXQ7Ci0gICAgZ3pfc3RhdGVwIHN0YXRlOwotCi0gICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSBhbmQgY2hlY2sgaW50ZWdyaXR5ICovCi0gICAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOwotICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9SRUFEICYmIHN0YXRlLT5tb2RlICE9IEdaX1dSSVRFKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAvKiBjaGVjayB0aGF0IHRoZXJlJ3Mgbm8gZXJyb3IgKi8KLSAgICBpZiAoc3RhdGUtPmVyciAhPSBaX09LICYmIHN0YXRlLT5lcnIgIT0gWl9CVUZfRVJST1IpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIGNhbiBvbmx5IHNlZWsgZnJvbSBzdGFydCBvciByZWxhdGl2ZSB0byBjdXJyZW50IHBvc2l0aW9uICovCi0gICAgaWYgKHdoZW5jZSAhPSBTRUVLX1NFVCAmJiB3aGVuY2UgIT0gU0VFS19DVVIpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIG5vcm1hbGl6ZSBvZmZzZXQgdG8gYSBTRUVLX0NVUiBzcGVjaWZpY2F0aW9uICovCi0gICAgaWYgKHdoZW5jZSA9PSBTRUVLX1NFVCkKLSAgICAgICAgb2Zmc2V0IC09IHN0YXRlLT54LnBvczsKLSAgICBlbHNlIGlmIChzdGF0ZS0+c2VlaykKLSAgICAgICAgb2Zmc2V0ICs9IHN0YXRlLT5za2lwOwotICAgIHN0YXRlLT5zZWVrID0gMDsKLQotICAgIC8qIGlmIHdpdGhpbiByYXcgYXJlYSB3aGlsZSByZWFkaW5nLCBqdXN0IGdvIHRoZXJlICovCi0gICAgaWYgKHN0YXRlLT5tb2RlID09IEdaX1JFQUQgJiYgc3RhdGUtPmhvdyA9PSBDT1BZICYmCi0gICAgICAgICAgICBzdGF0ZS0+eC5wb3MgKyBvZmZzZXQgPj0gMCkgewotICAgICAgICByZXQgPSBMU0VFSyhzdGF0ZS0+ZmQsIG9mZnNldCAtIHN0YXRlLT54LmhhdmUsIFNFRUtfQ1VSKTsKLSAgICAgICAgaWYgKHJldCA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgc3RhdGUtPnguaGF2ZSA9IDA7Ci0gICAgICAgIHN0YXRlLT5lb2YgPSAwOwotICAgICAgICBzdGF0ZS0+cGFzdCA9IDA7Ci0gICAgICAgIHN0YXRlLT5zZWVrID0gMDsKLSAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfT0ssIE5VTEwpOwotICAgICAgICBzdGF0ZS0+c3RybS5hdmFpbF9pbiA9IDA7Ci0gICAgICAgIHN0YXRlLT54LnBvcyArPSBvZmZzZXQ7Ci0gICAgICAgIHJldHVybiBzdGF0ZS0+eC5wb3M7Ci0gICAgfQotCi0gICAgLyogY2FsY3VsYXRlIHNraXAgYW1vdW50LCByZXdpbmRpbmcgaWYgbmVlZGVkIGZvciBiYWNrIHNlZWsgd2hlbiByZWFkaW5nICovCi0gICAgaWYgKG9mZnNldCA8IDApIHsKLSAgICAgICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQpICAgICAgICAgLyogd3JpdGluZyAtLSBjYW4ndCBnbyBiYWNrd2FyZHMgKi8KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgb2Zmc2V0ICs9IHN0YXRlLT54LnBvczsKLSAgICAgICAgaWYgKG9mZnNldCA8IDApICAgICAgICAgICAgICAgICAgICAgLyogYmVmb3JlIHN0YXJ0IG9mIGZpbGUhICovCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGlmIChnenJld2luZChmaWxlKSA9PSAtMSkgICAgICAgICAgIC8qIHJld2luZCwgdGhlbiBza2lwIHRvIG9mZnNldCAqLwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIGlmIHJlYWRpbmcsIHNraXAgd2hhdCdzIGluIG91dHB1dCBidWZmZXIgKG9uZSBsZXNzIGd6Z2V0YygpIGNoZWNrKSAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBHWl9SRUFEKSB7Ci0gICAgICAgIG4gPSBHVF9PRkYoc3RhdGUtPnguaGF2ZSkgfHwgKHpfb2ZmNjRfdClzdGF0ZS0+eC5oYXZlID4gb2Zmc2V0ID8KLSAgICAgICAgICAgICh1bnNpZ25lZClvZmZzZXQgOiBzdGF0ZS0+eC5oYXZlOwotICAgICAgICBzdGF0ZS0+eC5oYXZlIC09IG47Ci0gICAgICAgIHN0YXRlLT54Lm5leHQgKz0gbjsKLSAgICAgICAgc3RhdGUtPngucG9zICs9IG47Ci0gICAgICAgIG9mZnNldCAtPSBuOwotICAgIH0KLQotICAgIC8qIHJlcXVlc3Qgc2tpcCAoaWYgbm90IHplcm8pICovCi0gICAgaWYgKG9mZnNldCkgewotICAgICAgICBzdGF0ZS0+c2VlayA9IDE7Ci0gICAgICAgIHN0YXRlLT5za2lwID0gb2Zmc2V0OwotICAgIH0KLSAgICByZXR1cm4gc3RhdGUtPngucG9zICsgb2Zmc2V0OwotfQotCi0vKiAtLSBzZWUgemxpYi5oIC0tICovCi16X29mZl90IFpFWFBPUlQgZ3pzZWVrKAotICAgIGd6RmlsZSBmaWxlLAotICAgIHpfb2ZmX3Qgb2Zmc2V0LAotICAgIGludCB3aGVuY2UpCi17Ci0gICAgel9vZmY2NF90IHJldDsKLQotICAgIHJldCA9IGd6c2VlazY0KGZpbGUsICh6X29mZjY0X3Qpb2Zmc2V0LCB3aGVuY2UpOwotICAgIHJldHVybiByZXQgPT0gKHpfb2ZmX3QpcmV0ID8gKHpfb2ZmX3QpcmV0IDogLTE7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLXpfb2ZmNjRfdCBaRVhQT1JUIGd6dGVsbDY0KAotICAgIGd6RmlsZSBmaWxlKQotewotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLQotICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgYW5kIGNoZWNrIGludGVncml0eSAqLwotICAgIGlmIChmaWxlID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKLSAgICBpZiAoc3RhdGUtPm1vZGUgIT0gR1pfUkVBRCAmJiBzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgLyogcmV0dXJuIHBvc2l0aW9uICovCi0gICAgcmV0dXJuIHN0YXRlLT54LnBvcyArIChzdGF0ZS0+c2VlayA/IHN0YXRlLT5za2lwIDogMCk7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLXpfb2ZmX3QgWkVYUE9SVCBnenRlbGwoCi0gICAgZ3pGaWxlIGZpbGUpCi17Ci0gICAgel9vZmY2NF90IHJldDsKLQotICAgIHJldCA9IGd6dGVsbDY0KGZpbGUpOwotICAgIHJldHVybiByZXQgPT0gKHpfb2ZmX3QpcmV0ID8gKHpfb2ZmX3QpcmV0IDogLTE7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLXpfb2ZmNjRfdCBaRVhQT1JUIGd6b2Zmc2V0NjQoCi0gICAgZ3pGaWxlIGZpbGUpCi17Ci0gICAgel9vZmY2NF90IG9mZnNldDsKLSAgICBnel9zdGF0ZXAgc3RhdGU7Ci0KLSAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlIGFuZCBjaGVjayBpbnRlZ3JpdHkgKi8KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7Ci0gICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIGNvbXB1dGUgYW5kIHJldHVybiBlZmZlY3RpdmUgb2Zmc2V0IGluIGZpbGUgKi8KLSAgICBvZmZzZXQgPSBMU0VFSyhzdGF0ZS0+ZmQsIDAsIFNFRUtfQ1VSKTsKLSAgICBpZiAob2Zmc2V0ID09IC0xKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgaWYgKHN0YXRlLT5tb2RlID09IEdaX1JFQUQpICAgICAgICAgICAgIC8qIHJlYWRpbmcgKi8KLSAgICAgICAgb2Zmc2V0IC09IHN0YXRlLT5zdHJtLmF2YWlsX2luOyAgICAgLyogZG9uJ3QgY291bnQgYnVmZmVyZWQgaW5wdXQgKi8KLSAgICByZXR1cm4gb2Zmc2V0OwotfQotCi0vKiAtLSBzZWUgemxpYi5oIC0tICovCi16X29mZl90IFpFWFBPUlQgZ3pvZmZzZXQoCi0gICAgZ3pGaWxlIGZpbGUpCi17Ci0gICAgel9vZmY2NF90IHJldDsKLQotICAgIHJldCA9IGd6b2Zmc2V0NjQoZmlsZSk7Ci0gICAgcmV0dXJuIHJldCA9PSAoel9vZmZfdClyZXQgPyAoel9vZmZfdClyZXQgOiAtMTsKLX0KLQotLyogLS0gc2VlIHpsaWIuaCAtLSAqLwotaW50IFpFWFBPUlQgZ3plb2YoCi0gICAgZ3pGaWxlIGZpbGUpCi17Ci0gICAgZ3pfc3RhdGVwIHN0YXRlOwotCi0gICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSBhbmQgY2hlY2sgaW50ZWdyaXR5ICovCi0gICAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7Ci0gICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLyogcmV0dXJuIGVuZC1vZi1maWxlIHN0YXRlICovCi0gICAgcmV0dXJuIHN0YXRlLT5tb2RlID09IEdaX1JFQUQgPyBzdGF0ZS0+cGFzdCA6IDA7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLWNvbnN0IGNoYXIgKiBaRVhQT1JUIGd6ZXJyb3IoCi0gICAgZ3pGaWxlIGZpbGUsCi0gICAgaW50ICplcnJudW0pCi17Ci0gICAgZ3pfc3RhdGVwIHN0YXRlOwotCi0gICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSBhbmQgY2hlY2sgaW50ZWdyaXR5ICovCi0gICAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7Ci0gICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgJiYgc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLyogcmV0dXJuIGVycm9yIGluZm9ybWF0aW9uICovCi0gICAgaWYgKGVycm51bSAhPSBOVUxMKQotICAgICAgICAqZXJybnVtID0gc3RhdGUtPmVycjsKLSAgICByZXR1cm4gc3RhdGUtPmVyciA9PSBaX01FTV9FUlJPUiA/ICJvdXQgb2YgbWVtb3J5IiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGUtPm1zZyA9PSBOVUxMID8gIiIgOiBzdGF0ZS0+bXNnKTsKLX0KLQotLyogLS0gc2VlIHpsaWIuaCAtLSAqLwotdm9pZCBaRVhQT1JUIGd6Y2xlYXJlcnIoCi0gICAgZ3pGaWxlIGZpbGUpCi17Ci0gICAgZ3pfc3RhdGVwIHN0YXRlOwotCi0gICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSBhbmQgY2hlY2sgaW50ZWdyaXR5ICovCi0gICAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuOwotICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOwotICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9SRUFEICYmIHN0YXRlLT5tb2RlICE9IEdaX1dSSVRFKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvKiBjbGVhciBlcnJvciBhbmQgZW5kLW9mLWZpbGUgKi8KLSAgICBpZiAoc3RhdGUtPm1vZGUgPT0gR1pfUkVBRCkgewotICAgICAgICBzdGF0ZS0+ZW9mID0gMDsKLSAgICAgICAgc3RhdGUtPnBhc3QgPSAwOwotICAgIH0KLSAgICBnel9lcnJvcihzdGF0ZSwgWl9PSywgTlVMTCk7Ci19Ci0KLS8qIENyZWF0ZSBhbiBlcnJvciBtZXNzYWdlIGluIGFsbG9jYXRlZCBtZW1vcnkgYW5kIHNldCBzdGF0ZS0+ZXJyIGFuZAotICAgc3RhdGUtPm1zZyBhY2NvcmRpbmdseS4gIEZyZWUgYW55IHByZXZpb3VzIGVycm9yIG1lc3NhZ2UgYWxyZWFkeSB0aGVyZS4gIERvCi0gICBub3QgdHJ5IHRvIGZyZWUgb3IgYWxsb2NhdGUgc3BhY2UgaWYgdGhlIGVycm9yIGlzIFpfTUVNX0VSUk9SIChvdXQgb2YKLSAgIG1lbW9yeSkuICBTaW1wbHkgc2F2ZSB0aGUgZXJyb3IgbWVzc2FnZSBhcyBhIHN0YXRpYyBzdHJpbmcuICBJZiB0aGVyZSBpcyBhbgotICAgYWxsb2NhdGlvbiBmYWlsdXJlIGNvbnN0cnVjdGluZyB0aGUgZXJyb3IgbWVzc2FnZSwgdGhlbiBjb252ZXJ0IHRoZSBlcnJvciB0bwotICAgb3V0IG9mIG1lbW9yeS4gKi8KLXZvaWQgWkxJQl9JTlRFUk5BTCBnel9lcnJvcigKLSAgICBnel9zdGF0ZXAgc3RhdGUsCi0gICAgaW50IGVyciwKLSAgICBjb25zdCBjaGFyICptc2cpCi17Ci0gICAgLyogZnJlZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBtZXNzYWdlIGFuZCBjbGVhciAqLwotICAgIGlmIChzdGF0ZS0+bXNnICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHN0YXRlLT5lcnIgIT0gWl9NRU1fRVJST1IpCi0gICAgICAgICAgICBmcmVlKHN0YXRlLT5tc2cpOwotICAgICAgICBzdGF0ZS0+bXNnID0gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBpZiBmYXRhbCwgc2V0IHN0YXRlLT54LmhhdmUgdG8gMCBzbyB0aGF0IHRoZSBnemdldGMoKSBtYWNybyBmYWlscyAqLwotICAgIGlmIChlcnIgIT0gWl9PSyAmJiBlcnIgIT0gWl9CVUZfRVJST1IpCi0gICAgICAgIHN0YXRlLT54LmhhdmUgPSAwOwotCi0gICAgLyogc2V0IGVycm9yIGNvZGUsIGFuZCBpZiBubyBtZXNzYWdlLCB0aGVuIGRvbmUgKi8KLSAgICBzdGF0ZS0+ZXJyID0gZXJyOwotICAgIGlmIChtc2cgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLyogZm9yIGFuIG91dCBvZiBtZW1vcnkgZXJyb3IsIHJldHVybiBsaXRlcmFsIHN0cmluZyB3aGVuIHJlcXVlc3RlZCAqLwotICAgIGlmIChlcnIgPT0gWl9NRU1fRVJST1IpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8qIGNvbnN0cnVjdCBlcnJvciBtZXNzYWdlIHdpdGggcGF0aCAqLwotICAgIGlmICgoc3RhdGUtPm1zZyA9IChjaGFyICopbWFsbG9jKHN0cmxlbihzdGF0ZS0+cGF0aCkgKyBzdHJsZW4obXNnKSArIDMpKSA9PQotICAgICAgICAgICAgTlVMTCkgewotICAgICAgICBzdGF0ZS0+ZXJyID0gWl9NRU1fRVJST1I7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0jaWYgIWRlZmluZWQoTk9fc25wcmludGYpICYmICFkZWZpbmVkKE5PX3ZzbnByaW50ZikKLSAgICBzbnByaW50ZihzdGF0ZS0+bXNnLCBzdHJsZW4oc3RhdGUtPnBhdGgpICsgc3RybGVuKG1zZykgKyAzLAotICAgICAgICAgICAgICIlcyVzJXMiLCBzdGF0ZS0+cGF0aCwgIjogIiwgbXNnKTsKLSNlbHNlCi0gICAgc3RyY3B5KHN0YXRlLT5tc2csIHN0YXRlLT5wYXRoKTsKLSAgICBzdHJjYXQoc3RhdGUtPm1zZywgIjogIik7Ci0gICAgc3RyY2F0KHN0YXRlLT5tc2csIG1zZyk7Ci0jZW5kaWYKLSAgICByZXR1cm47Ci19Ci0KLSNpZm5kZWYgSU5UX01BWAotLyogcG9ydGFibHkgcmV0dXJuIG1heGltdW0gdmFsdWUgZm9yIGFuIGludCAod2hlbiBsaW1pdHMuaCBwcmVzdW1lZCBub3QKLSAgIGF2YWlsYWJsZSkgLS0gd2UgbmVlZCB0byBkbyB0aGlzIHRvIGNvdmVyIGNhc2VzIHdoZXJlIDIncyBjb21wbGVtZW50IG5vdAotICAgdXNlZCwgc2luY2UgQyBzdGFuZGFyZCBwZXJtaXRzIDEncyBjb21wbGVtZW50IGFuZCBzaWduLWJpdCByZXByZXNlbnRhdGlvbnMsCi0gICBvdGhlcndpc2Ugd2UgY291bGQganVzdCB1c2UgKCh1bnNpZ25lZCktMSkgPj4gMSAqLwotdW5zaWduZWQgWkxJQl9JTlRFUk5BTCBnel9pbnRtYXgoKQotewotICAgIHVuc2lnbmVkIHAsIHE7Ci0KLSAgICBwID0gMTsKLSAgICBkbyB7Ci0gICAgICAgIHEgPSBwOwotICAgICAgICBwIDw8PSAxOwotICAgICAgICBwKys7Ci0gICAgfSB3aGlsZSAocCA+IHEpOwotICAgIHJldHVybiBxID4+IDE7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9nenJlYWQuYyBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9nenJlYWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2MmEzMi4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS96bGliX3YxMjgvZ3pyZWFkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1OTQgKzAsMCBAQAotLyogZ3pyZWFkLmMgLS0gemxpYiBmdW5jdGlvbnMgZm9yIHJlYWRpbmcgZ3ppcCBmaWxlcwotICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDEwLCAyMDExLCAyMDEyLCAyMDEzIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0jaW5jbHVkZSAiZ3pndXRzLmgiCi0KLS8qIExvY2FsIGZ1bmN0aW9ucyAqLwotbG9jYWwgaW50IGd6X2xvYWQgT0YoKGd6X3N0YXRlcCwgdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCwgdW5zaWduZWQgKikpOwotbG9jYWwgaW50IGd6X2F2YWlsIE9GKChnel9zdGF0ZXApKTsKLWxvY2FsIGludCBnel9sb29rIE9GKChnel9zdGF0ZXApKTsKLWxvY2FsIGludCBnel9kZWNvbXAgT0YoKGd6X3N0YXRlcCkpOwotbG9jYWwgaW50IGd6X2ZldGNoIE9GKChnel9zdGF0ZXApKTsKLWxvY2FsIGludCBnel9za2lwIE9GKChnel9zdGF0ZXAsIHpfb2ZmNjRfdCkpOwotCi0vKiBVc2UgcmVhZCgpIHRvIGxvYWQgYSBidWZmZXIgLS0gcmV0dXJuIC0xIG9uIGVycm9yLCBvdGhlcndpc2UgMC4gIFJlYWQgZnJvbQotICAgc3RhdGUtPmZkLCBhbmQgdXBkYXRlIHN0YXRlLT5lb2YsIHN0YXRlLT5lcnIsIGFuZCBzdGF0ZS0+bXNnIGFzIGFwcHJvcHJpYXRlLgotICAgVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBsb29wIG9uIHJlYWQoKSwgc2luY2UgcmVhZCgpIGlzIG5vdCBndWFyYW50ZWVkIHRvCi0gICByZWFkIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgZGVzY3JpcHRvci4gKi8KLWxvY2FsIGludCBnel9sb2FkKAotICAgIGd6X3N0YXRlcCBzdGF0ZSwKLSAgICB1bnNpZ25lZCBjaGFyICpidWYsCi0gICAgdW5zaWduZWQgbGVuLAotICAgIHVuc2lnbmVkICpoYXZlKQotewotICAgIGludCByZXQ7Ci0KLSAgICAqaGF2ZSA9IDA7Ci0gICAgZG8gewotICAgICAgICByZXQgPSByZWFkKHN0YXRlLT5mZCwgYnVmICsgKmhhdmUsIGxlbiAtICpoYXZlKTsKLSAgICAgICAgaWYgKHJldCA8PSAwKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICpoYXZlICs9IHJldDsKLSAgICB9IHdoaWxlICgqaGF2ZSA8IGxlbik7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfRVJSTk8sIHpzdHJlcnJvcigpKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAocmV0ID09IDApCi0gICAgICAgIHN0YXRlLT5lb2YgPSAxOwotICAgIHJldHVybiAwOwotfQotCi0vKiBMb2FkIHVwIGlucHV0IGJ1ZmZlciBhbmQgc2V0IGVvZiBmbGFnIGlmIGxhc3QgZGF0YSBsb2FkZWQgLS0gcmV0dXJuIC0xIG9uCi0gICBlcnJvciwgMCBvdGhlcndpc2UuICBOb3RlIHRoYXQgdGhlIGVvZiBmbGFnIGlzIHNldCB3aGVuIHRoZSBlbmQgb2YgdGhlIGlucHV0Ci0gICBmaWxlIGlzIHJlYWNoZWQsIGV2ZW4gdGhvdWdoIHRoZXJlIG1heSBiZSB1bnVzZWQgZGF0YSBpbiB0aGUgYnVmZmVyLiAgT25jZQotICAgdGhhdCBkYXRhIGhhcyBiZWVuIHVzZWQsIG5vIG1vcmUgYXR0ZW1wdHMgd2lsbCBiZSBtYWRlIHRvIHJlYWQgdGhlIGZpbGUuCi0gICBJZiBzdHJtLT5hdmFpbF9pbiAhPSAwLCB0aGVuIHRoZSBjdXJyZW50IGRhdGEgaXMgbW92ZWQgdG8gdGhlIGJlZ2lubmluZyBvZgotICAgdGhlIGlucHV0IGJ1ZmZlciwgYW5kIHRoZW4gdGhlIHJlbWFpbmRlciBvZiB0aGUgYnVmZmVyIGlzIGxvYWRlZCB3aXRoIHRoZQotICAgYXZhaWxhYmxlIGRhdGEgZnJvbSB0aGUgaW5wdXQgZmlsZS4gKi8KLWxvY2FsIGludCBnel9hdmFpbCgKLSAgICBnel9zdGF0ZXAgc3RhdGUpCi17Ci0gICAgdW5zaWduZWQgZ290OwotICAgIHpfc3RyZWFtcCBzdHJtID0gJihzdGF0ZS0+c3RybSk7Ci0KLSAgICBpZiAoc3RhdGUtPmVyciAhPSBaX09LICYmIHN0YXRlLT5lcnIgIT0gWl9CVUZfRVJST1IpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBpZiAoc3RhdGUtPmVvZiA9PSAwKSB7Ci0gICAgICAgIGlmIChzdHJtLT5hdmFpbF9pbikgeyAgICAgICAvKiBjb3B5IHdoYXQncyB0aGVyZSB0byB0aGUgc3RhcnQgKi8KLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnAgPSBzdGF0ZS0+aW47Ci0gICAgICAgICAgICB1bnNpZ25lZCBjb25zdCBjaGFyICpxID0gc3RybS0+bmV4dF9pbjsKLSAgICAgICAgICAgIHVuc2lnbmVkIG4gPSBzdHJtLT5hdmFpbF9pbjsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAqcCsrID0gKnErKzsKLSAgICAgICAgICAgIH0gd2hpbGUgKC0tbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGd6X2xvYWQoc3RhdGUsIHN0YXRlLT5pbiArIHN0cm0tPmF2YWlsX2luLAotICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+c2l6ZSAtIHN0cm0tPmF2YWlsX2luLCAmZ290KSA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgc3RybS0+YXZhaWxfaW4gKz0gZ290OwotICAgICAgICBzdHJtLT5uZXh0X2luID0gc3RhdGUtPmluOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogTG9vayBmb3IgZ3ppcCBoZWFkZXIsIHNldCB1cCBmb3IgaW5mbGF0ZSBvciBjb3B5LiAgc3RhdGUtPnguaGF2ZSBtdXN0IGJlIDAuCi0gICBJZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIGluLCBhbGxvY2F0ZSByZXF1aXJlZCBtZW1vcnkuICBzdGF0ZS0+aG93IHdpbGwgYmUKLSAgIGxlZnQgdW5jaGFuZ2VkIGlmIHRoZXJlIGlzIG5vIG1vcmUgaW5wdXQgZGF0YSBhdmFpbGFibGUsIHdpbGwgYmUgc2V0IHRvIENPUFkKLSAgIGlmIHRoZXJlIGlzIG5vIGd6aXAgaGVhZGVyIGFuZCBkaXJlY3QgY29weWluZyB3aWxsIGJlIHBlcmZvcm1lZCwgb3IgaXQgd2lsbAotICAgYmUgc2V0IHRvIEdaSVAgZm9yIGRlY29tcHJlc3Npb24uICBJZiBkaXJlY3QgY29weWluZywgdGhlbiBsZWZ0b3ZlciBpbnB1dAotICAgZGF0YSBmcm9tIHRoZSBpbnB1dCBidWZmZXIgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIG91dHB1dCBidWZmZXIuICBJbiB0aGF0Ci0gICBjYXNlLCBhbGwgZnVydGhlciBmaWxlIHJlYWRzIHdpbGwgYmUgZGlyZWN0bHkgdG8gZWl0aGVyIHRoZSBvdXRwdXQgYnVmZmVyIG9yCi0gICBhIHVzZXIgYnVmZmVyLiAgSWYgZGVjb21wcmVzc2luZywgdGhlIGluZmxhdGUgc3RhdGUgd2lsbCBiZSBpbml0aWFsaXplZC4KLSAgIGd6X2xvb2soKSB3aWxsIHJldHVybiAwIG9uIHN1Y2Nlc3Mgb3IgLTEgb24gZmFpbHVyZS4gKi8KLWxvY2FsIGludCBnel9sb29rKAotICAgIGd6X3N0YXRlcCBzdGF0ZSkKLXsKLSAgICB6X3N0cmVhbXAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOwotCi0gICAgLyogYWxsb2NhdGUgcmVhZCBidWZmZXJzIGFuZCBpbmZsYXRlIG1lbW9yeSAqLwotICAgIGlmIChzdGF0ZS0+c2l6ZSA9PSAwKSB7Ci0gICAgICAgIC8qIGFsbG9jYXRlIGJ1ZmZlcnMgKi8KLSAgICAgICAgc3RhdGUtPmluID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2Moc3RhdGUtPndhbnQpOwotICAgICAgICBzdGF0ZS0+b3V0ID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2Moc3RhdGUtPndhbnQgPDwgMSk7Ci0gICAgICAgIGlmIChzdGF0ZS0+aW4gPT0gTlVMTCB8fCBzdGF0ZS0+b3V0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+b3V0ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgZnJlZShzdGF0ZS0+b3V0KTsKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+aW4gIT0gTlVMTCkKLSAgICAgICAgICAgICAgICBmcmVlKHN0YXRlLT5pbik7Ci0gICAgICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9NRU1fRVJST1IsICJvdXQgb2YgbWVtb3J5Iik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdGUtPnNpemUgPSBzdGF0ZS0+d2FudDsKLQotICAgICAgICAvKiBhbGxvY2F0ZSBpbmZsYXRlIG1lbW9yeSAqLwotICAgICAgICBzdGF0ZS0+c3RybS56YWxsb2MgPSBaX05VTEw7Ci0gICAgICAgIHN0YXRlLT5zdHJtLnpmcmVlID0gWl9OVUxMOwotICAgICAgICBzdGF0ZS0+c3RybS5vcGFxdWUgPSBaX05VTEw7Ci0gICAgICAgIHN0YXRlLT5zdHJtLmF2YWlsX2luID0gMDsKLSAgICAgICAgc3RhdGUtPnN0cm0ubmV4dF9pbiA9IFpfTlVMTDsKLSAgICAgICAgaWYgKGluZmxhdGVJbml0MigmKHN0YXRlLT5zdHJtKSwgMTUgKyAxNikgIT0gWl9PSykgeyAgICAvKiBndW56aXAgKi8KLSAgICAgICAgICAgIGZyZWUoc3RhdGUtPm91dCk7Ci0gICAgICAgICAgICBmcmVlKHN0YXRlLT5pbik7Ci0gICAgICAgICAgICBzdGF0ZS0+c2l6ZSA9IDA7Ci0gICAgICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9NRU1fRVJST1IsICJvdXQgb2YgbWVtb3J5Iik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBnZXQgYXQgbGVhc3QgdGhlIG1hZ2ljIGJ5dGVzIGluIHRoZSBpbnB1dCBidWZmZXIgKi8KLSAgICBpZiAoc3RybS0+YXZhaWxfaW4gPCAyKSB7Ci0gICAgICAgIGlmIChnel9hdmFpbChzdGF0ZSkgPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGlmIChzdHJtLT5hdmFpbF9pbiA9PSAwKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogbG9vayBmb3IgZ3ppcCBtYWdpYyBieXRlcyAtLSBpZiB0aGVyZSwgZG8gZ3ppcCBkZWNvZGluZyAobm90ZTogdGhlcmUgaXMKLSAgICAgICBhIGxvZ2ljYWwgZGlsZW1tYSBoZXJlIHdoZW4gY29uc2lkZXJpbmcgdGhlIGNhc2Ugb2YgYSBwYXJ0aWFsbHkgd3JpdHRlbgotICAgICAgIGd6aXAgZmlsZSwgdG8gd2l0LCBpZiBhIHNpbmdsZSAzMSBieXRlIGlzIHdyaXR0ZW4sIHRoZW4gd2UgY2Fubm90IHRlbGwKLSAgICAgICB3aGV0aGVyIHRoaXMgaXMgYSBzaW5nbGUtYnl0ZSBmaWxlLCBvciBqdXN0IGEgcGFydGlhbGx5IHdyaXR0ZW4gZ3ppcAotICAgICAgIGZpbGUgLS0gZm9yIGhlcmUgd2UgYXNzdW1lIHRoYXQgaWYgYSBnemlwIGZpbGUgaXMgYmVpbmcgd3JpdHRlbiwgdGhlbgotICAgICAgIHRoZSBoZWFkZXIgd2lsbCBiZSB3cml0dGVuIGluIGEgc2luZ2xlIG9wZXJhdGlvbiwgc28gdGhhdCByZWFkaW5nIGEKLSAgICAgICBzaW5nbGUgYnl0ZSBpcyBzdWZmaWNpZW50IGluZGljYXRpb24gdGhhdCBpdCBpcyBub3QgYSBnemlwIGZpbGUpICovCi0gICAgaWYgKHN0cm0tPmF2YWlsX2luID4gMSAmJgotICAgICAgICAgICAgc3RybS0+bmV4dF9pblswXSA9PSAzMSAmJiBzdHJtLT5uZXh0X2luWzFdID09IDEzOSkgewotICAgICAgICBpbmZsYXRlUmVzZXQoc3RybSk7Ci0gICAgICAgIHN0YXRlLT5ob3cgPSBHWklQOwotICAgICAgICBzdGF0ZS0+ZGlyZWN0ID0gMDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogbm8gZ3ppcCBoZWFkZXIgLS0gaWYgd2Ugd2VyZSBkZWNvZGluZyBnemlwIGJlZm9yZSwgdGhlbiB0aGlzIGlzIHRyYWlsaW5nCi0gICAgICAgZ2FyYmFnZS4gIElnbm9yZSB0aGUgdHJhaWxpbmcgZ2FyYmFnZSBhbmQgZmluaXNoLiAqLwotICAgIGlmIChzdGF0ZS0+ZGlyZWN0ID09IDApIHsKLSAgICAgICAgc3RybS0+YXZhaWxfaW4gPSAwOwotICAgICAgICBzdGF0ZS0+ZW9mID0gMTsKLSAgICAgICAgc3RhdGUtPnguaGF2ZSA9IDA7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIGRvaW5nIHJhdyBpL28sIGNvcHkgYW55IGxlZnRvdmVyIGlucHV0IHRvIG91dHB1dCAtLSB0aGlzIGFzc3VtZXMgdGhhdAotICAgICAgIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGxhcmdlciB0aGFuIHRoZSBpbnB1dCBidWZmZXIsIHdoaWNoIGFsc28gYXNzdXJlcwotICAgICAgIHNwYWNlIGZvciBnenVuZ2V0YygpICovCi0gICAgc3RhdGUtPngubmV4dCA9IHN0YXRlLT5vdXQ7Ci0gICAgaWYgKHN0cm0tPmF2YWlsX2luKSB7Ci0gICAgICAgIG1lbWNweShzdGF0ZS0+eC5uZXh0LCBzdHJtLT5uZXh0X2luLCBzdHJtLT5hdmFpbF9pbik7Ci0gICAgICAgIHN0YXRlLT54LmhhdmUgPSBzdHJtLT5hdmFpbF9pbjsKLSAgICAgICAgc3RybS0+YXZhaWxfaW4gPSAwOwotICAgIH0KLSAgICBzdGF0ZS0+aG93ID0gQ09QWTsKLSAgICBzdGF0ZS0+ZGlyZWN0ID0gMTsKLSAgICByZXR1cm4gMDsKLX0KLQotLyogRGVjb21wcmVzcyBmcm9tIGlucHV0IHRvIHRoZSBwcm92aWRlZCBuZXh0X291dCBhbmQgYXZhaWxfb3V0IGluIHRoZSBzdGF0ZS4KLSAgIE9uIHJldHVybiwgc3RhdGUtPnguaGF2ZSBhbmQgc3RhdGUtPngubmV4dCBwb2ludCB0byB0aGUganVzdCBkZWNvbXByZXNzZWQKLSAgIGRhdGEuICBJZiB0aGUgZ3ppcCBzdHJlYW0gY29tcGxldGVzLCBzdGF0ZS0+aG93IGlzIHJlc2V0IHRvIExPT0sgdG8gbG9vayBmb3IKLSAgIHRoZSBuZXh0IGd6aXAgc3RyZWFtIG9yIHJhdyBkYXRhLCBvbmNlIHN0YXRlLT54LmhhdmUgaXMgZGVwbGV0ZWQuICBSZXR1cm5zIDAKLSAgIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuICovCi1sb2NhbCBpbnQgZ3pfZGVjb21wKAotICAgIGd6X3N0YXRlcCBzdGF0ZSkKLXsKLSAgICBpbnQgcmV0ID0gWl9PSzsKLSAgICB1bnNpZ25lZCBoYWQ7Ci0gICAgel9zdHJlYW1wIHN0cm0gPSAmKHN0YXRlLT5zdHJtKTsKLQotICAgIC8qIGZpbGwgb3V0cHV0IGJ1ZmZlciB1cCB0byBlbmQgb2YgZGVmbGF0ZSBzdHJlYW0gKi8KLSAgICBoYWQgPSBzdHJtLT5hdmFpbF9vdXQ7Ci0gICAgZG8gewotICAgICAgICAvKiBnZXQgbW9yZSBpbnB1dCBmb3IgaW5mbGF0ZSgpICovCi0gICAgICAgIGlmIChzdHJtLT5hdmFpbF9pbiA9PSAwICYmIGd6X2F2YWlsKHN0YXRlKSA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgaWYgKHN0cm0tPmF2YWlsX2luID09IDApIHsKLSAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX0JVRl9FUlJPUiwgInVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogZGVjb21wcmVzcyBhbmQgaGFuZGxlIGVycm9ycyAqLwotICAgICAgICByZXQgPSBpbmZsYXRlKHN0cm0sIFpfTk9fRkxVU0gpOwotICAgICAgICBpZiAocmV0ID09IFpfU1RSRUFNX0VSUk9SIHx8IHJldCA9PSBaX05FRURfRElDVCkgewotICAgICAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfU1RSRUFNX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgImludGVybmFsIGVycm9yOiBpbmZsYXRlIHN0cmVhbSBjb3JydXB0Iik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJldCA9PSBaX01FTV9FUlJPUikgewotICAgICAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfTUVNX0VSUk9SLCAib3V0IG9mIG1lbW9yeSIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXQgPT0gWl9EQVRBX0VSUk9SKSB7ICAgICAgICAgICAgICAvKiBkZWZsYXRlIHN0cmVhbSBpbnZhbGlkICovCi0gICAgICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9EQVRBX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID09IE5VTEwgPyAiY29tcHJlc3NlZCBkYXRhIGVycm9yIiA6IHN0cm0tPm1zZyk7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChzdHJtLT5hdmFpbF9vdXQgJiYgcmV0ICE9IFpfU1RSRUFNX0VORCk7Ci0KLSAgICAvKiB1cGRhdGUgYXZhaWxhYmxlIG91dHB1dCAqLwotICAgIHN0YXRlLT54LmhhdmUgPSBoYWQgLSBzdHJtLT5hdmFpbF9vdXQ7Ci0gICAgc3RhdGUtPngubmV4dCA9IHN0cm0tPm5leHRfb3V0IC0gc3RhdGUtPnguaGF2ZTsKLQotICAgIC8qIGlmIHRoZSBnemlwIHN0cmVhbSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LCBsb29rIGZvciBhbm90aGVyICovCi0gICAgaWYgKHJldCA9PSBaX1NUUkVBTV9FTkQpCi0gICAgICAgIHN0YXRlLT5ob3cgPSBMT09LOwotCi0gICAgLyogZ29vZCBkZWNvbXByZXNzaW9uICovCi0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIEZldGNoIGRhdGEgYW5kIHB1dCBpdCBpbiB0aGUgb3V0cHV0IGJ1ZmZlci4gIEFzc3VtZXMgc3RhdGUtPnguaGF2ZSBpcyAwLgotICAgRGF0YSBpcyBlaXRoZXIgY29waWVkIGZyb20gdGhlIGlucHV0IGZpbGUgb3IgZGVjb21wcmVzc2VkIGZyb20gdGhlIGlucHV0Ci0gICBmaWxlIGRlcGVuZGluZyBvbiBzdGF0ZS0+aG93LiAgSWYgc3RhdGUtPmhvdyBpcyBMT09LLCB0aGVuIGEgZ3ppcCBoZWFkZXIgaXMKLSAgIGxvb2tlZCBmb3IgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gY29weSBvciBkZWNvbXByZXNzLiAgUmV0dXJucyAtMSBvbiBlcnJvciwKLSAgIG90aGVyd2lzZSAwLiAgZ3pfZmV0Y2goKSB3aWxsIGxlYXZlIHN0YXRlLT5ob3cgYXMgQ09QWSBvciBHWklQIHVubGVzcyB0aGUKLSAgIGVuZCBvZiB0aGUgaW5wdXQgZmlsZSBoYXMgYmVlbiByZWFjaGVkIGFuZCBhbGwgZGF0YSBoYXMgYmVlbiBwcm9jZXNzZWQuICAqLwotbG9jYWwgaW50IGd6X2ZldGNoKAotICAgIGd6X3N0YXRlcCBzdGF0ZSkKLXsKLSAgICB6X3N0cmVhbXAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOwotCi0gICAgZG8gewotICAgICAgICBzd2l0Y2goc3RhdGUtPmhvdykgewotICAgICAgICBjYXNlIExPT0s6ICAgICAgLyogLT4gTE9PSywgQ09QWSAob25seSBpZiBuZXZlciBHWklQKSwgb3IgR1pJUCAqLwotICAgICAgICAgICAgaWYgKGd6X2xvb2soc3RhdGUpID09IC0xKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+aG93ID09IExPT0spCi0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDT1BZOiAgICAgIC8qIC0+IENPUFkgKi8KLSAgICAgICAgICAgIGlmIChnel9sb2FkKHN0YXRlLCBzdGF0ZS0+b3V0LCBzdGF0ZS0+c2l6ZSA8PCAxLCAmKHN0YXRlLT54LmhhdmUpKQotICAgICAgICAgICAgICAgICAgICA9PSAtMSkKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICBzdGF0ZS0+eC5uZXh0ID0gc3RhdGUtPm91dDsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICBjYXNlIEdaSVA6ICAgICAgLyogLT4gR1pJUCBvciBMT09LIChpZiBlbmQgb2YgZ3ppcCBzdHJlYW0pICovCi0gICAgICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPSBzdGF0ZS0+c2l6ZSA8PCAxOwotICAgICAgICAgICAgc3RybS0+bmV4dF9vdXQgPSBzdGF0ZS0+b3V0OwotICAgICAgICAgICAgaWYgKGd6X2RlY29tcChzdGF0ZSkgPT0gLTEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfSB3aGlsZSAoc3RhdGUtPnguaGF2ZSA9PSAwICYmICghc3RhdGUtPmVvZiB8fCBzdHJtLT5hdmFpbF9pbikpOwotICAgIHJldHVybiAwOwotfQotCi0vKiBTa2lwIGxlbiB1bmNvbXByZXNzZWQgYnl0ZXMgb2Ygb3V0cHV0LiAgUmV0dXJuIC0xIG9uIGVycm9yLCAwIG9uIHN1Y2Nlc3MuICovCi1sb2NhbCBpbnQgZ3pfc2tpcCgKLSAgICBnel9zdGF0ZXAgc3RhdGUsCi0gICAgel9vZmY2NF90IGxlbikKLXsKLSAgICB1bnNpZ25lZCBuOwotCi0gICAgLyogc2tpcCBvdmVyIGxlbiBieXRlcyBvciByZWFjaCBlbmQtb2YtZmlsZSwgd2hpY2hldmVyIGNvbWVzIGZpcnN0ICovCi0gICAgd2hpbGUgKGxlbikKLSAgICAgICAgLyogc2tpcCBvdmVyIHdoYXRldmVyIGlzIGluIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgaWYgKHN0YXRlLT54LmhhdmUpIHsKLSAgICAgICAgICAgIG4gPSBHVF9PRkYoc3RhdGUtPnguaGF2ZSkgfHwgKHpfb2ZmNjRfdClzdGF0ZS0+eC5oYXZlID4gbGVuID8KLSAgICAgICAgICAgICAgICAodW5zaWduZWQpbGVuIDogc3RhdGUtPnguaGF2ZTsKLSAgICAgICAgICAgIHN0YXRlLT54LmhhdmUgLT0gbjsKLSAgICAgICAgICAgIHN0YXRlLT54Lm5leHQgKz0gbjsKLSAgICAgICAgICAgIHN0YXRlLT54LnBvcyArPSBuOwotICAgICAgICAgICAgbGVuIC09IG47Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBvdXRwdXQgYnVmZmVyIGVtcHR5IC0tIHJldHVybiBpZiB3ZSdyZSBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCAqLwotICAgICAgICBlbHNlIGlmIChzdGF0ZS0+ZW9mICYmIHN0YXRlLT5zdHJtLmF2YWlsX2luID09IDApCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvKiBuZWVkIG1vcmUgZGF0YSB0byBza2lwIC0tIGxvYWQgdXAgb3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8qIGdldCBtb3JlIG91dHB1dCwgbG9va2luZyBmb3IgaGVhZGVyIGlmIHJlcXVpcmVkICovCi0gICAgICAgICAgICBpZiAoZ3pfZmV0Y2goc3RhdGUpID09IC0xKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKiAtLSBzZWUgemxpYi5oIC0tICovCi1pbnQgWkVYUE9SVCBnenJlYWQoCi0gICAgZ3pGaWxlIGZpbGUsCi0gICAgdm9pZHAgYnVmLAotICAgIHVuc2lnbmVkIGxlbikKLXsKLSAgICB1bnNpZ25lZCBnb3QsIG47Ci0gICAgZ3pfc3RhdGVwIHN0YXRlOwotICAgIHpfc3RyZWFtcCBzdHJtOwotCi0gICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLwotICAgIGlmIChmaWxlID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKLSAgICBzdHJtID0gJihzdGF0ZS0+c3RybSk7Ci0KLSAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHJlYWRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyAoc2VyaW91cykgZXJyb3IgKi8KLSAgICBpZiAoc3RhdGUtPm1vZGUgIT0gR1pfUkVBRCB8fAotICAgICAgICAgICAgKHN0YXRlLT5lcnIgIT0gWl9PSyAmJiBzdGF0ZS0+ZXJyICE9IFpfQlVGX0VSUk9SKSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgLyogc2luY2UgYW4gaW50IGlzIHJldHVybmVkLCBtYWtlIHN1cmUgbGVuIGZpdHMgaW4gb25lLCBvdGhlcndpc2UgcmV0dXJuCi0gICAgICAgd2l0aCBhbiBlcnJvciAodGhpcyBhdm9pZHMgdGhlIGZsYXcgaW4gdGhlIGludGVyZmFjZSkgKi8KLSAgICBpZiAoKGludClsZW4gPCAwKSB7Ci0gICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX0RBVEFfRVJST1IsICJyZXF1ZXN0ZWQgbGVuZ3RoIGRvZXMgbm90IGZpdCBpbiBpbnQiKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIGlmIGxlbiBpcyB6ZXJvLCBhdm9pZCB1bm5lY2Vzc2FyeSBvcGVyYXRpb25zICovCi0gICAgaWYgKGxlbiA9PSAwKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIHByb2Nlc3MgYSBza2lwIHJlcXVlc3QgKi8KLSAgICBpZiAoc3RhdGUtPnNlZWspIHsKLSAgICAgICAgc3RhdGUtPnNlZWsgPSAwOwotICAgICAgICBpZiAoZ3pfc2tpcChzdGF0ZSwgc3RhdGUtPnNraXApID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIGdldCBsZW4gYnl0ZXMgdG8gYnVmLCBvciBsZXNzIHRoYW4gbGVuIGlmIGF0IHRoZSBlbmQgKi8KLSAgICBnb3QgPSAwOwotICAgIGRvIHsKLSAgICAgICAgLyogZmlyc3QganVzdCB0cnkgY29weWluZyBkYXRhIGZyb20gdGhlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgaWYgKHN0YXRlLT54LmhhdmUpIHsKLSAgICAgICAgICAgIG4gPSBzdGF0ZS0+eC5oYXZlID4gbGVuID8gbGVuIDogc3RhdGUtPnguaGF2ZTsKLSAgICAgICAgICAgIG1lbWNweShidWYsIHN0YXRlLT54Lm5leHQsIG4pOwotICAgICAgICAgICAgc3RhdGUtPngubmV4dCArPSBuOwotICAgICAgICAgICAgc3RhdGUtPnguaGF2ZSAtPSBuOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogb3V0cHV0IGJ1ZmZlciBlbXB0eSAtLSByZXR1cm4gaWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgKi8KLSAgICAgICAgZWxzZSBpZiAoc3RhdGUtPmVvZiAmJiBzdHJtLT5hdmFpbF9pbiA9PSAwKSB7Ci0gICAgICAgICAgICBzdGF0ZS0+cGFzdCA9IDE7ICAgICAgICAvKiB0cmllZCB0byByZWFkIHBhc3QgZW5kICovCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIG5lZWQgb3V0cHV0IGRhdGEgLS0gZm9yIHNtYWxsIGxlbiBvciBuZXcgc3RyZWFtIGxvYWQgdXAgb3VyIG91dHB1dAotICAgICAgICAgICBidWZmZXIgKi8KLSAgICAgICAgZWxzZSBpZiAoc3RhdGUtPmhvdyA9PSBMT09LIHx8IGxlbiA8IChzdGF0ZS0+c2l6ZSA8PCAxKSkgewotICAgICAgICAgICAgLyogZ2V0IG1vcmUgb3V0cHV0LCBsb29raW5nIGZvciBoZWFkZXIgaWYgcmVxdWlyZWQgKi8KLSAgICAgICAgICAgIGlmIChnel9mZXRjaChzdGF0ZSkgPT0gLTEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgY29udGludWU7ICAgICAgIC8qIG5vIHByb2dyZXNzIHlldCAtLSBnbyBiYWNrIHRvIGNvcHkgYWJvdmUgKi8KLSAgICAgICAgICAgIC8qIHRoZSBjb3B5IGFib3ZlIGFzc3VyZXMgdGhhdCB3ZSB3aWxsIGxlYXZlIHdpdGggc3BhY2UgaW4gdGhlCi0gICAgICAgICAgICAgICBvdXRwdXQgYnVmZmVyLCBhbGxvd2luZyBhdCBsZWFzdCBvbmUgZ3p1bmdldGMoKSB0byBzdWNjZWVkICovCi0gICAgICAgIH0KLQotICAgICAgICAvKiBsYXJnZSBsZW4gLS0gcmVhZCBkaXJlY3RseSBpbnRvIHVzZXIgYnVmZmVyICovCi0gICAgICAgIGVsc2UgaWYgKHN0YXRlLT5ob3cgPT0gQ09QWSkgeyAgICAgIC8qIHJlYWQgZGlyZWN0bHkgKi8KLSAgICAgICAgICAgIGlmIChnel9sb2FkKHN0YXRlLCAodW5zaWduZWQgY2hhciAqKWJ1ZiwgbGVuLCAmbikgPT0gLTEpCi0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogbGFyZ2UgbGVuIC0tIGRlY29tcHJlc3MgZGlyZWN0bHkgaW50byB1c2VyIGJ1ZmZlciAqLwotICAgICAgICBlbHNlIHsgIC8qIHN0YXRlLT5ob3cgPT0gR1pJUCAqLwotICAgICAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gbGVuOwotICAgICAgICAgICAgc3RybS0+bmV4dF9vdXQgPSAodW5zaWduZWQgY2hhciAqKWJ1ZjsKLSAgICAgICAgICAgIGlmIChnel9kZWNvbXAoc3RhdGUpID09IC0xKQotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIG4gPSBzdGF0ZS0+eC5oYXZlOwotICAgICAgICAgICAgc3RhdGUtPnguaGF2ZSA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiB1cGRhdGUgcHJvZ3Jlc3MgKi8KLSAgICAgICAgbGVuIC09IG47Ci0gICAgICAgIGJ1ZiA9IChjaGFyICopYnVmICsgbjsKLSAgICAgICAgZ290ICs9IG47Ci0gICAgICAgIHN0YXRlLT54LnBvcyArPSBuOwotICAgIH0gd2hpbGUgKGxlbik7Ci0KLSAgICAvKiByZXR1cm4gbnVtYmVyIG9mIGJ5dGVzIHJlYWQgaW50byB1c2VyIGJ1ZmZlciAod2lsbCBmaXQgaW4gaW50KSAqLwotICAgIHJldHVybiAoaW50KWdvdDsKLX0KLQotLyogLS0gc2VlIHpsaWIuaCAtLSAqLwotI2lmZGVmIFpfUFJFRklYX1NFVAotIyAgdW5kZWYgel9nemdldGMKLSNlbHNlCi0jICB1bmRlZiBnemdldGMKLSNlbmRpZgotaW50IFpFWFBPUlQgZ3pnZXRjKAotICAgIGd6RmlsZSBmaWxlKQotewotICAgIGludCByZXQ7Ci0gICAgdW5zaWduZWQgY2hhciBidWZbMV07Ci0gICAgZ3pfc3RhdGVwIHN0YXRlOwotCi0gICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLwotICAgIGlmIChmaWxlID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKLQotICAgIC8qIGNoZWNrIHRoYXQgd2UncmUgcmVhZGluZyBhbmQgdGhhdCB0aGVyZSdzIG5vIChzZXJpb3VzKSBlcnJvciAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9SRUFEIHx8Ci0gICAgICAgIChzdGF0ZS0+ZXJyICE9IFpfT0sgJiYgc3RhdGUtPmVyciAhPSBaX0JVRl9FUlJPUikpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIHRyeSBvdXRwdXQgYnVmZmVyIChubyBuZWVkIHRvIGNoZWNrIGZvciBza2lwIHJlcXVlc3QpICovCi0gICAgaWYgKHN0YXRlLT54LmhhdmUpIHsKLSAgICAgICAgc3RhdGUtPnguaGF2ZS0tOwotICAgICAgICBzdGF0ZS0+eC5wb3MrKzsKLSAgICAgICAgcmV0dXJuICooc3RhdGUtPngubmV4dCkrKzsKLSAgICB9Ci0KLSAgICAvKiBub3RoaW5nIHRoZXJlIC0tIHRyeSBnenJlYWQoKSAqLwotICAgIHJldCA9IGd6cmVhZChmaWxlLCBidWYsIDEpOwotICAgIHJldHVybiByZXQgPCAxID8gLTEgOiBidWZbMF07Ci19Ci0KLWludCBaRVhQT1JUIGd6Z2V0Y18oCi1nekZpbGUgZmlsZSkKLXsKLSAgICByZXR1cm4gZ3pnZXRjKGZpbGUpOwotfQotCi0vKiAtLSBzZWUgemxpYi5oIC0tICovCi1pbnQgWkVYUE9SVCBnenVuZ2V0YygKLSAgICBpbnQgYywKLSAgICBnekZpbGUgZmlsZSkKLXsKLSAgICBnel9zdGF0ZXAgc3RhdGU7Ci0KLSAgICAvKiBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCi0gICAgaWYgKGZpbGUgPT0gTlVMTCkKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIHN0YXRlID0gKGd6X3N0YXRlcClmaWxlOwotCi0gICAgLyogY2hlY2sgdGhhdCB3ZSdyZSByZWFkaW5nIGFuZCB0aGF0IHRoZXJlJ3Mgbm8gKHNlcmlvdXMpIGVycm9yICovCi0gICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1JFQUQgfHwKLSAgICAgICAgKHN0YXRlLT5lcnIgIT0gWl9PSyAmJiBzdGF0ZS0+ZXJyICE9IFpfQlVGX0VSUk9SKSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgLyogcHJvY2VzcyBhIHNraXAgcmVxdWVzdCAqLwotICAgIGlmIChzdGF0ZS0+c2VlaykgewotICAgICAgICBzdGF0ZS0+c2VlayA9IDA7Ci0gICAgICAgIGlmIChnel9za2lwKHN0YXRlLCBzdGF0ZS0+c2tpcCkgPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogY2FuJ3QgcHVzaCBFT0YgKi8KLSAgICBpZiAoYyA8IDApCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIGlmIG91dHB1dCBidWZmZXIgZW1wdHksIHB1dCBieXRlIGF0IGVuZCAoYWxsb3dzIG1vcmUgcHVzaGluZykgKi8KLSAgICBpZiAoc3RhdGUtPnguaGF2ZSA9PSAwKSB7Ci0gICAgICAgIHN0YXRlLT54LmhhdmUgPSAxOwotICAgICAgICBzdGF0ZS0+eC5uZXh0ID0gc3RhdGUtPm91dCArIChzdGF0ZS0+c2l6ZSA8PCAxKSAtIDE7Ci0gICAgICAgIHN0YXRlLT54Lm5leHRbMF0gPSBjOwotICAgICAgICBzdGF0ZS0+eC5wb3MtLTsKLSAgICAgICAgc3RhdGUtPnBhc3QgPSAwOwotICAgICAgICByZXR1cm4gYzsKLSAgICB9Ci0KLSAgICAvKiBpZiBubyByb29tLCBnaXZlIHVwIChtdXN0IGhhdmUgYWxyZWFkeSBkb25lIGEgZ3p1bmdldGMoKSkgKi8KLSAgICBpZiAoc3RhdGUtPnguaGF2ZSA9PSAoc3RhdGUtPnNpemUgPDwgMSkpIHsKLSAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfREFUQV9FUlJPUiwgIm91dCBvZiByb29tIHRvIHB1c2ggY2hhcmFjdGVycyIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogc2xpZGUgb3V0cHV0IGRhdGEgaWYgbmVlZGVkIGFuZCBpbnNlcnQgYnl0ZSBiZWZvcmUgZXhpc3RpbmcgZGF0YSAqLwotICAgIGlmIChzdGF0ZS0+eC5uZXh0ID09IHN0YXRlLT5vdXQpIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciAqc3JjID0gc3RhdGUtPm91dCArIHN0YXRlLT54LmhhdmU7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlc3QgPSBzdGF0ZS0+b3V0ICsgKHN0YXRlLT5zaXplIDw8IDEpOwotICAgICAgICB3aGlsZSAoc3JjID4gc3RhdGUtPm91dCkKLSAgICAgICAgICAgICotLWRlc3QgPSAqLS1zcmM7Ci0gICAgICAgIHN0YXRlLT54Lm5leHQgPSBkZXN0OwotICAgIH0KLSAgICBzdGF0ZS0+eC5oYXZlKys7Ci0gICAgc3RhdGUtPngubmV4dC0tOwotICAgIHN0YXRlLT54Lm5leHRbMF0gPSBjOwotICAgIHN0YXRlLT54LnBvcy0tOwotICAgIHN0YXRlLT5wYXN0ID0gMDsKLSAgICByZXR1cm4gYzsKLX0KLQotLyogLS0gc2VlIHpsaWIuaCAtLSAqLwotY2hhciAqIFpFWFBPUlQgZ3pnZXRzKAotICAgIGd6RmlsZSBmaWxlLAotICAgIGNoYXIgKmJ1ZiwKLSAgICBpbnQgbGVuKQotewotICAgIHVuc2lnbmVkIGxlZnQsIG47Ci0gICAgY2hhciAqc3RyOwotICAgIHVuc2lnbmVkIGNoYXIgKmVvbDsKLSAgICBnel9zdGF0ZXAgc3RhdGU7Ci0KLSAgICAvKiBjaGVjayBwYXJhbWV0ZXJzIGFuZCBnZXQgaW50ZXJuYWwgc3RydWN0dXJlICovCi0gICAgaWYgKGZpbGUgPT0gTlVMTCB8fCBidWYgPT0gTlVMTCB8fCBsZW4gPCAxKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKLQotICAgIC8qIGNoZWNrIHRoYXQgd2UncmUgcmVhZGluZyBhbmQgdGhhdCB0aGVyZSdzIG5vIChzZXJpb3VzKSBlcnJvciAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9SRUFEIHx8Ci0gICAgICAgIChzdGF0ZS0+ZXJyICE9IFpfT0sgJiYgc3RhdGUtPmVyciAhPSBaX0JVRl9FUlJPUikpCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLyogcHJvY2VzcyBhIHNraXAgcmVxdWVzdCAqLwotICAgIGlmIChzdGF0ZS0+c2VlaykgewotICAgICAgICBzdGF0ZS0+c2VlayA9IDA7Ci0gICAgICAgIGlmIChnel9za2lwKHN0YXRlLCBzdGF0ZS0+c2tpcCkgPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICAvKiBjb3B5IG91dHB1dCBieXRlcyB1cCB0byBuZXcgbGluZSBvciBsZW4gLSAxLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QgLS0KLSAgICAgICBhcHBlbmQgYSB0ZXJtaW5hdGluZyB6ZXJvIHRvIHRoZSBzdHJpbmcgKHdlIGRvbid0IGNoZWNrIGZvciBhIHplcm8gaW4KLSAgICAgICB0aGUgY29udGVudHMsIGxldCB0aGUgdXNlciB3b3JyeSBhYm91dCB0aGF0KSAqLwotICAgIHN0ciA9IGJ1ZjsKLSAgICBsZWZ0ID0gKHVuc2lnbmVkKWxlbiAtIDE7Ci0gICAgaWYgKGxlZnQpIGRvIHsKLSAgICAgICAgLyogYXNzdXJlIHRoYXQgc29tZXRoaW5nIGlzIGluIHRoZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIGlmIChzdGF0ZS0+eC5oYXZlID09IDAgJiYgZ3pfZmV0Y2goc3RhdGUpID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgIC8qIGVycm9yICovCi0gICAgICAgIGlmIChzdGF0ZS0+eC5oYXZlID09IDApIHsgICAgICAgLyogZW5kIG9mIGZpbGUgKi8KLSAgICAgICAgICAgIHN0YXRlLT5wYXN0ID0gMTsgICAgICAgICAgICAvKiByZWFkIHBhc3QgZW5kICovCi0gICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIHdoYXQgd2UgaGF2ZSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyogbG9vayBmb3IgZW5kLW9mLWxpbmUgaW4gY3VycmVudCBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIG4gPSBzdGF0ZS0+eC5oYXZlID4gbGVmdCA/IGxlZnQgOiBzdGF0ZS0+eC5oYXZlOwotICAgICAgICBlb2wgPSAodW5zaWduZWQgY2hhciAqKW1lbWNocihzdGF0ZS0+eC5uZXh0LCAnXG4nLCBuKTsKLSAgICAgICAgaWYgKGVvbCAhPSBOVUxMKQotICAgICAgICAgICAgbiA9ICh1bnNpZ25lZCkoZW9sIC0gc3RhdGUtPngubmV4dCkgKyAxOwotCi0gICAgICAgIC8qIGNvcHkgdGhyb3VnaCBlbmQtb2YtbGluZSwgb3IgcmVtYWluZGVyIGlmIG5vdCBmb3VuZCAqLwotICAgICAgICBtZW1jcHkoYnVmLCBzdGF0ZS0+eC5uZXh0LCBuKTsKLSAgICAgICAgc3RhdGUtPnguaGF2ZSAtPSBuOwotICAgICAgICBzdGF0ZS0+eC5uZXh0ICs9IG47Ci0gICAgICAgIHN0YXRlLT54LnBvcyArPSBuOwotICAgICAgICBsZWZ0IC09IG47Ci0gICAgICAgIGJ1ZiArPSBuOwotICAgIH0gd2hpbGUgKGxlZnQgJiYgZW9sID09IE5VTEwpOwotCi0gICAgLyogcmV0dXJuIHRlcm1pbmF0ZWQgc3RyaW5nLCBvciBpZiBub3RoaW5nLCBlbmQgb2YgZmlsZSAqLwotICAgIGlmIChidWYgPT0gc3RyKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBidWZbMF0gPSAwOwotICAgIHJldHVybiBzdHI7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLWludCBaRVhQT1JUIGd6ZGlyZWN0KAotICAgIGd6RmlsZSBmaWxlKQotewotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLQotICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gMDsKLSAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKLQotICAgIC8qIGlmIHRoZSBzdGF0ZSBpcyBub3Qga25vd24sIGJ1dCB3ZSBjYW4gZmluZCBvdXQsIHRoZW4gZG8gc28gKHRoaXMgaXMKLSAgICAgICBtYWlubHkgZm9yIHJpZ2h0IGFmdGVyIGEgZ3pvcGVuKCkgb3IgZ3pkb3BlbigpKSAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBHWl9SRUFEICYmIHN0YXRlLT5ob3cgPT0gTE9PSyAmJiBzdGF0ZS0+eC5oYXZlID09IDApCi0gICAgICAgICh2b2lkKWd6X2xvb2soc3RhdGUpOwotCi0gICAgLyogcmV0dXJuIDEgaWYgdHJhbnNwYXJlbnQsIDAgaWYgcHJvY2Vzc2luZyBhIGd6aXAgc3RyZWFtICovCi0gICAgcmV0dXJuIHN0YXRlLT5kaXJlY3Q7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLWludCBaRVhQT1JUIGd6Y2xvc2VfcigKLSAgICBnekZpbGUgZmlsZSkKLXsKLSAgICBpbnQgcmV0LCBlcnI7Ci0gICAgZ3pfc3RhdGVwIHN0YXRlOwotCi0gICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLwotICAgIGlmIChmaWxlID09IE5VTEwpCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKLQotICAgIC8qIGNoZWNrIHRoYXQgd2UncmUgcmVhZGluZyAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9SRUFEKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0KLSAgICAvKiBmcmVlIG1lbW9yeSBhbmQgY2xvc2UgZmlsZSAqLwotICAgIGlmIChzdGF0ZS0+c2l6ZSkgewotICAgICAgICBpbmZsYXRlRW5kKCYoc3RhdGUtPnN0cm0pKTsKLSAgICAgICAgZnJlZShzdGF0ZS0+b3V0KTsKLSAgICAgICAgZnJlZShzdGF0ZS0+aW4pOwotICAgIH0KLSAgICBlcnIgPSBzdGF0ZS0+ZXJyID09IFpfQlVGX0VSUk9SID8gWl9CVUZfRVJST1IgOiBaX09LOwotICAgIGd6X2Vycm9yKHN0YXRlLCBaX09LLCBOVUxMKTsKLSAgICBmcmVlKHN0YXRlLT5wYXRoKTsKLSAgICByZXQgPSBjbG9zZShzdGF0ZS0+ZmQpOwotICAgIGZyZWUoc3RhdGUpOwotICAgIHJldHVybiByZXQgPyBaX0VSUk5PIDogZXJyOwotfQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvemxpYl92MTI4L2d6d3JpdGUuYyBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9nendyaXRlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MTA3MDguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvemxpYl92MTI4L2d6d3JpdGUuYworKysgL2Rldi9udWxsCkBAIC0xLDU3NiArMCwwIEBACi0vKiBnendyaXRlLmMgLS0gemxpYiBmdW5jdGlvbnMgZm9yIHdyaXRpbmcgZ3ppcCBmaWxlcwotICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDEwLCAyMDExLCAyMDEyLCAyMDEzIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0jaW5jbHVkZSAiZ3pndXRzLmgiCi0KLS8qIExvY2FsIGZ1bmN0aW9ucyAqLwotbG9jYWwgaW50IGd6X2luaXQgT0YoKGd6X3N0YXRlcCkpOwotbG9jYWwgaW50IGd6X2NvbXAgT0YoKGd6X3N0YXRlcCwgaW50KSk7Ci1sb2NhbCBpbnQgZ3pfemVybyBPRigoZ3pfc3RhdGVwLCB6X29mZjY0X3QpKTsKLQotLyogSW5pdGlhbGl6ZSBzdGF0ZSBmb3Igd3JpdGluZyBhIGd6aXAgZmlsZS4gIE1hcmsgaW5pdGlhbGl6YXRpb24gYnkgc2V0dGluZwotICAgc3RhdGUtPnNpemUgdG8gbm9uLXplcm8uICBSZXR1cm4gLTEgb24gZmFpbHVyZSBvciAwIG9uIHN1Y2Nlc3MuICovCi1sb2NhbCBpbnQgZ3pfaW5pdCgKLSAgICBnel9zdGF0ZXAgc3RhdGUpCi17Ci0gICAgaW50IHJldDsKLSAgICB6X3N0cmVhbXAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOwotCi0gICAgLyogYWxsb2NhdGUgaW5wdXQgYnVmZmVyICovCi0gICAgc3RhdGUtPmluID0gKHVuc2lnbmVkIGNoYXIgKiltYWxsb2Moc3RhdGUtPndhbnQpOwotICAgIGlmIChzdGF0ZS0+aW4gPT0gTlVMTCkgewotICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9NRU1fRVJST1IsICJvdXQgb2YgbWVtb3J5Iik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiBvbmx5IG5lZWQgb3V0cHV0IGJ1ZmZlciBhbmQgZGVmbGF0ZSBzdGF0ZSBpZiBjb21wcmVzc2luZyAqLwotICAgIGlmICghc3RhdGUtPmRpcmVjdCkgewotICAgICAgICAvKiBhbGxvY2F0ZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIHN0YXRlLT5vdXQgPSAodW5zaWduZWQgY2hhciAqKW1hbGxvYyhzdGF0ZS0+d2FudCk7Ci0gICAgICAgIGlmIChzdGF0ZS0+b3V0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIGZyZWUoc3RhdGUtPmluKTsKLSAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX01FTV9FUlJPUiwgIm91dCBvZiBtZW1vcnkiKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIGFsbG9jYXRlIGRlZmxhdGUgbWVtb3J5LCBzZXQgdXAgZm9yIGd6aXAgY29tcHJlc3Npb24gKi8KLSAgICAgICAgc3RybS0+emFsbG9jID0gWl9OVUxMOwotICAgICAgICBzdHJtLT56ZnJlZSA9IFpfTlVMTDsKLSAgICAgICAgc3RybS0+b3BhcXVlID0gWl9OVUxMOwotICAgICAgICByZXQgPSBkZWZsYXRlSW5pdDIoc3RybSwgc3RhdGUtPmxldmVsLCBaX0RFRkxBVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX1dCSVRTICsgMTYsIERFRl9NRU1fTEVWRUwsIHN0YXRlLT5zdHJhdGVneSk7Ci0gICAgICAgIGlmIChyZXQgIT0gWl9PSykgewotICAgICAgICAgICAgZnJlZShzdGF0ZS0+b3V0KTsKLSAgICAgICAgICAgIGZyZWUoc3RhdGUtPmluKTsKLSAgICAgICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX01FTV9FUlJPUiwgIm91dCBvZiBtZW1vcnkiKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIG1hcmsgc3RhdGUgYXMgaW5pdGlhbGl6ZWQgKi8KLSAgICBzdGF0ZS0+c2l6ZSA9IHN0YXRlLT53YW50OwotCi0gICAgLyogaW5pdGlhbGl6ZSB3cml0ZSBidWZmZXIgaWYgY29tcHJlc3NpbmcgKi8KLSAgICBpZiAoIXN0YXRlLT5kaXJlY3QpIHsKLSAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gc3RhdGUtPnNpemU7Ci0gICAgICAgIHN0cm0tPm5leHRfb3V0ID0gc3RhdGUtPm91dDsKLSAgICAgICAgc3RhdGUtPngubmV4dCA9IHN0cm0tPm5leHRfb3V0OwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyogQ29tcHJlc3Mgd2hhdGV2ZXIgaXMgYXQgYXZhaWxfaW4gYW5kIG5leHRfaW4gYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQgZmlsZS4KLSAgIFJldHVybiAtMSBpZiB0aGVyZSBpcyBhbiBlcnJvciB3cml0aW5nIHRvIHRoZSBvdXRwdXQgZmlsZSwgb3RoZXJ3aXNlIDAuCi0gICBmbHVzaCBpcyBhc3N1bWVkIHRvIGJlIGEgdmFsaWQgZGVmbGF0ZSgpIGZsdXNoIHZhbHVlLiAgSWYgZmx1c2ggaXMgWl9GSU5JU0gsCi0gICB0aGVuIHRoZSBkZWZsYXRlKCkgc3RhdGUgaXMgcmVzZXQgdG8gc3RhcnQgYSBuZXcgZ3ppcCBzdHJlYW0uICBJZiBnei0+ZGlyZWN0Ci0gICBpcyB0cnVlLCB0aGVuIHNpbXBseSB3cml0ZSB0byB0aGUgb3V0cHV0IGZpbGUgd2l0aG91dCBjb21wcmVzc2luZywgYW5kCi0gICBpZ25vcmUgZmx1c2guICovCi1sb2NhbCBpbnQgZ3pfY29tcCgKLSAgICBnel9zdGF0ZXAgc3RhdGUsCi0gICAgaW50IGZsdXNoKQotewotICAgIGludCByZXQsIGdvdDsKLSAgICB1bnNpZ25lZCBoYXZlOwotICAgIHpfc3RyZWFtcCBzdHJtID0gJihzdGF0ZS0+c3RybSk7Ci0KLSAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aHJvdWdoICovCi0gICAgaWYgKHN0YXRlLT5zaXplID09IDAgJiYgZ3pfaW5pdChzdGF0ZSkgPT0gLTEpCi0gICAgICAgIHJldHVybiAtMTsKLQotICAgIC8qIHdyaXRlIGRpcmVjdGx5IGlmIHJlcXVlc3RlZCAqLwotICAgIGlmIChzdGF0ZS0+ZGlyZWN0KSB7Ci0gICAgICAgIGdvdCA9IHdyaXRlKHN0YXRlLT5mZCwgc3RybS0+bmV4dF9pbiwgc3RybS0+YXZhaWxfaW4pOwotICAgICAgICBpZiAoZ290IDwgMCB8fCAodW5zaWduZWQpZ290ICE9IHN0cm0tPmF2YWlsX2luKSB7Ci0gICAgICAgICAgICBnel9lcnJvcihzdGF0ZSwgWl9FUlJOTywgenN0cmVycm9yKCkpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHN0cm0tPmF2YWlsX2luID0gMDsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogcnVuIGRlZmxhdGUoKSBvbiBwcm92aWRlZCBpbnB1dCB1bnRpbCBpdCBwcm9kdWNlcyBubyBtb3JlIG91dHB1dCAqLwotICAgIHJldCA9IFpfT0s7Ci0gICAgZG8gewotICAgICAgICAvKiB3cml0ZSBvdXQgY3VycmVudCBidWZmZXIgY29udGVudHMgaWYgZnVsbCwgb3IgaWYgZmx1c2hpbmcsIGJ1dCBpZgotICAgICAgICAgICBkb2luZyBaX0ZJTklTSCB0aGVuIGRvbid0IHdyaXRlIHVudGlsIHdlIGdldCB0byBaX1NUUkVBTV9FTkQgKi8KLSAgICAgICAgaWYgKHN0cm0tPmF2YWlsX291dCA9PSAwIHx8IChmbHVzaCAhPSBaX05PX0ZMVVNIICYmCi0gICAgICAgICAgICAoZmx1c2ggIT0gWl9GSU5JU0ggfHwgcmV0ID09IFpfU1RSRUFNX0VORCkpKSB7Ci0gICAgICAgICAgICBoYXZlID0gKHVuc2lnbmVkKShzdHJtLT5uZXh0X291dCAtIHN0YXRlLT54Lm5leHQpOwotICAgICAgICAgICAgaWYgKGhhdmUgJiYgKChnb3QgPSB3cml0ZShzdGF0ZS0+ZmQsIHN0YXRlLT54Lm5leHQsIGhhdmUpKSA8IDAgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpZ290ICE9IGhhdmUpKSB7Ci0gICAgICAgICAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfRVJSTk8sIHpzdHJlcnJvcigpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RybS0+YXZhaWxfb3V0ID09IDApIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5hdmFpbF9vdXQgPSBzdGF0ZS0+c2l6ZTsKLSAgICAgICAgICAgICAgICBzdHJtLT5uZXh0X291dCA9IHN0YXRlLT5vdXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZS0+eC5uZXh0ID0gc3RybS0+bmV4dF9vdXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBjb21wcmVzcyAqLwotICAgICAgICBoYXZlID0gc3RybS0+YXZhaWxfb3V0OwotICAgICAgICByZXQgPSBkZWZsYXRlKHN0cm0sIGZsdXNoKTsKLSAgICAgICAgaWYgKHJldCA9PSBaX1NUUkVBTV9FUlJPUikgewotICAgICAgICAgICAgZ3pfZXJyb3Ioc3RhdGUsIFpfU1RSRUFNX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICJpbnRlcm5hbCBlcnJvcjogZGVmbGF0ZSBzdHJlYW0gY29ycnVwdCIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGhhdmUgLT0gc3RybS0+YXZhaWxfb3V0OwotICAgIH0gd2hpbGUgKGhhdmUpOwotCi0gICAgLyogaWYgdGhhdCBjb21wbGV0ZWQgYSBkZWZsYXRlIHN0cmVhbSwgYWxsb3cgYW5vdGhlciB0byBzdGFydCAqLwotICAgIGlmIChmbHVzaCA9PSBaX0ZJTklTSCkKLSAgICAgICAgZGVmbGF0ZVJlc2V0KHN0cm0pOwotCi0gICAgLyogYWxsIGRvbmUsIG5vIGVycm9ycyAqLwotICAgIHJldHVybiAwOwotfQotCi0vKiBDb21wcmVzcyBsZW4gemVyb3MgdG8gb3V0cHV0LiAgUmV0dXJuIC0xIG9uIGVycm9yLCAwIG9uIHN1Y2Nlc3MuICovCi1sb2NhbCBpbnQgZ3pfemVybygKLSAgICBnel9zdGF0ZXAgc3RhdGUsCi0gICAgel9vZmY2NF90IGxlbikKLXsKLSAgICBpbnQgZmlyc3Q7Ci0gICAgdW5zaWduZWQgbjsKLSAgICB6X3N0cmVhbXAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOwotCi0gICAgLyogY29uc3VtZSB3aGF0ZXZlcidzIGxlZnQgaW4gdGhlIGlucHV0IGJ1ZmZlciAqLwotICAgIGlmIChzdHJtLT5hdmFpbF9pbiAmJiBnel9jb21wKHN0YXRlLCBaX05PX0ZMVVNIKSA9PSAtMSkKLSAgICAgICAgcmV0dXJuIC0xOwotCi0gICAgLyogY29tcHJlc3MgbGVuIHplcm9zIChsZW4gZ3VhcmFudGVlZCA+IDApICovCi0gICAgZmlyc3QgPSAxOwotICAgIHdoaWxlIChsZW4pIHsKLSAgICAgICAgbiA9IEdUX09GRihzdGF0ZS0+c2l6ZSkgfHwgKHpfb2ZmNjRfdClzdGF0ZS0+c2l6ZSA+IGxlbiA/Ci0gICAgICAgICAgICAodW5zaWduZWQpbGVuIDogc3RhdGUtPnNpemU7Ci0gICAgICAgIGlmIChmaXJzdCkgewotICAgICAgICAgICAgbWVtc2V0KHN0YXRlLT5pbiwgMCwgbik7Ci0gICAgICAgICAgICBmaXJzdCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgc3RybS0+YXZhaWxfaW4gPSBuOwotICAgICAgICBzdHJtLT5uZXh0X2luID0gc3RhdGUtPmluOwotICAgICAgICBzdGF0ZS0+eC5wb3MgKz0gbjsKLSAgICAgICAgaWYgKGd6X2NvbXAoc3RhdGUsIFpfTk9fRkxVU0gpID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICBsZW4gLT0gbjsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLWludCBaRVhQT1JUIGd6d3JpdGUoCi0gICAgZ3pGaWxlIGZpbGUsCi0gICAgdm9pZHBjIGJ1ZiwKLSAgICB1bnNpZ25lZCBsZW4pCi17Ci0gICAgdW5zaWduZWQgcHV0ID0gbGVuOwotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLSAgICB6X3N0cmVhbXAgc3RybTsKLQotICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gMDsKLSAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKLSAgICBzdHJtID0gJihzdGF0ZS0+c3RybSk7Ci0KLSAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHdyaXRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSB8fCBzdGF0ZS0+ZXJyICE9IFpfT0spCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLyogc2luY2UgYW4gaW50IGlzIHJldHVybmVkLCBtYWtlIHN1cmUgbGVuIGZpdHMgaW4gb25lLCBvdGhlcndpc2UgcmV0dXJuCi0gICAgICAgd2l0aCBhbiBlcnJvciAodGhpcyBhdm9pZHMgdGhlIGZsYXcgaW4gdGhlIGludGVyZmFjZSkgKi8KLSAgICBpZiAoKGludClsZW4gPCAwKSB7Ci0gICAgICAgIGd6X2Vycm9yKHN0YXRlLCBaX0RBVEFfRVJST1IsICJyZXF1ZXN0ZWQgbGVuZ3RoIGRvZXMgbm90IGZpdCBpbiBpbnQiKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogaWYgbGVuIGlzIHplcm8sIGF2b2lkIHVubmVjZXNzYXJ5IG9wZXJhdGlvbnMgKi8KLSAgICBpZiAobGVuID09IDApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLyogYWxsb2NhdGUgbWVtb3J5IGlmIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaCAqLwotICAgIGlmIChzdGF0ZS0+c2l6ZSA9PSAwICYmIGd6X2luaXQoc3RhdGUpID09IC0xKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIGNoZWNrIGZvciBzZWVrIHJlcXVlc3QgKi8KLSAgICBpZiAoc3RhdGUtPnNlZWspIHsKLSAgICAgICAgc3RhdGUtPnNlZWsgPSAwOwotICAgICAgICBpZiAoZ3pfemVybyhzdGF0ZSwgc3RhdGUtPnNraXApID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogZm9yIHNtYWxsIGxlbiwgY29weSB0byBpbnB1dCBidWZmZXIsIG90aGVyd2lzZSBjb21wcmVzcyBkaXJlY3RseSAqLwotICAgIGlmIChsZW4gPCBzdGF0ZS0+c2l6ZSkgewotICAgICAgICAvKiBjb3B5IHRvIGlucHV0IGJ1ZmZlciwgY29tcHJlc3Mgd2hlbiBmdWxsICovCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIGhhdmUsIGNvcHk7Ci0KLSAgICAgICAgICAgIGlmIChzdHJtLT5hdmFpbF9pbiA9PSAwKQotICAgICAgICAgICAgICAgIHN0cm0tPm5leHRfaW4gPSBzdGF0ZS0+aW47Ci0gICAgICAgICAgICBoYXZlID0gKHVuc2lnbmVkKSgoc3RybS0+bmV4dF9pbiArIHN0cm0tPmF2YWlsX2luKSAtIHN0YXRlLT5pbik7Ci0gICAgICAgICAgICBjb3B5ID0gc3RhdGUtPnNpemUgLSBoYXZlOwotICAgICAgICAgICAgaWYgKGNvcHkgPiBsZW4pCi0gICAgICAgICAgICAgICAgY29weSA9IGxlbjsKLSAgICAgICAgICAgIG1lbWNweShzdGF0ZS0+aW4gKyBoYXZlLCBidWYsIGNvcHkpOwotICAgICAgICAgICAgc3RybS0+YXZhaWxfaW4gKz0gY29weTsKLSAgICAgICAgICAgIHN0YXRlLT54LnBvcyArPSBjb3B5OwotICAgICAgICAgICAgYnVmID0gKGNvbnN0IGNoYXIgKilidWYgKyBjb3B5OwotICAgICAgICAgICAgbGVuIC09IGNvcHk7Ci0gICAgICAgICAgICBpZiAobGVuICYmIGd6X2NvbXAoc3RhdGUsIFpfTk9fRkxVU0gpID09IC0xKQotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9IHdoaWxlIChsZW4pOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgLyogY29uc3VtZSB3aGF0ZXZlcidzIGxlZnQgaW4gdGhlIGlucHV0IGJ1ZmZlciAqLwotICAgICAgICBpZiAoc3RybS0+YXZhaWxfaW4gJiYgZ3pfY29tcChzdGF0ZSwgWl9OT19GTFVTSCkgPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gMDsKLQotICAgICAgICAvKiBkaXJlY3RseSBjb21wcmVzcyB1c2VyIGJ1ZmZlciB0byBmaWxlICovCi0gICAgICAgIHN0cm0tPmF2YWlsX2luID0gbGVuOwotICAgICAgICBzdHJtLT5uZXh0X2luID0gKHpfY29uc3QgQnl0ZWYgKilidWY7Ci0gICAgICAgIHN0YXRlLT54LnBvcyArPSBsZW47Ci0gICAgICAgIGlmIChnel9jb21wKHN0YXRlLCBaX05PX0ZMVVNIKSA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIGlucHV0IHdhcyBhbGwgYnVmZmVyZWQgb3IgY29tcHJlc3NlZCAocHV0IHdpbGwgZml0IGluIGludCkgKi8KLSAgICByZXR1cm4gKGludClwdXQ7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLWludCBaRVhQT1JUIGd6cHV0YygKLSAgICBnekZpbGUgZmlsZSwKLSAgICBpbnQgYykKLXsKLSAgICB1bnNpZ25lZCBoYXZlOwotICAgIHVuc2lnbmVkIGNoYXIgYnVmWzFdOwotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLSAgICB6X3N0cmVhbXAgc3RybTsKLQotICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7Ci0gICAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOwotCi0gICAgLyogY2hlY2sgdGhhdCB3ZSdyZSB3cml0aW5nIGFuZCB0aGF0IHRoZXJlJ3Mgbm8gZXJyb3IgKi8KLSAgICBpZiAoc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUgfHwgc3RhdGUtPmVyciAhPSBaX09LKQotICAgICAgICByZXR1cm4gLTE7Ci0KLSAgICAvKiBjaGVjayBmb3Igc2VlayByZXF1ZXN0ICovCi0gICAgaWYgKHN0YXRlLT5zZWVrKSB7Ci0gICAgICAgIHN0YXRlLT5zZWVrID0gMDsKLSAgICAgICAgaWYgKGd6X3plcm8oc3RhdGUsIHN0YXRlLT5za2lwKSA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKiB0cnkgd3JpdGluZyB0byBpbnB1dCBidWZmZXIgZm9yIHNwZWVkIChzdGF0ZS0+c2l6ZSA9PSAwIGlmIGJ1ZmZlciBub3QKLSAgICAgICBpbml0aWFsaXplZCkgKi8KLSAgICBpZiAoc3RhdGUtPnNpemUpIHsKLSAgICAgICAgaWYgKHN0cm0tPmF2YWlsX2luID09IDApCi0gICAgICAgICAgICBzdHJtLT5uZXh0X2luID0gc3RhdGUtPmluOwotICAgICAgICBoYXZlID0gKHVuc2lnbmVkKSgoc3RybS0+bmV4dF9pbiArIHN0cm0tPmF2YWlsX2luKSAtIHN0YXRlLT5pbik7Ci0gICAgICAgIGlmIChoYXZlIDwgc3RhdGUtPnNpemUpIHsKLSAgICAgICAgICAgIHN0YXRlLT5pbltoYXZlXSA9IGM7Ci0gICAgICAgICAgICBzdHJtLT5hdmFpbF9pbisrOwotICAgICAgICAgICAgc3RhdGUtPngucG9zKys7Ci0gICAgICAgICAgICByZXR1cm4gYyAmIDB4ZmY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBubyByb29tIGluIGJ1ZmZlciBvciBub3QgaW5pdGlhbGl6ZWQsIHVzZSBnel93cml0ZSgpICovCi0gICAgYnVmWzBdID0gYzsKLSAgICBpZiAoZ3p3cml0ZShmaWxlLCBidWYsIDEpICE9IDEpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICByZXR1cm4gYyAmIDB4ZmY7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLWludCBaRVhQT1JUIGd6cHV0cygKLSAgICBnekZpbGUgZmlsZSwKLSAgICBjb25zdCBjaGFyICpzdHIpCi17Ci0gICAgaW50IHJldDsKLSAgICB1bnNpZ25lZCBsZW47Ci0KLSAgICAvKiB3cml0ZSBzdHJpbmcgKi8KLSAgICBsZW4gPSAodW5zaWduZWQpc3RybGVuKHN0cik7Ci0gICAgcmV0ID0gZ3p3cml0ZShmaWxlLCBzdHIsIGxlbik7Ci0gICAgcmV0dXJuIHJldCA9PSAwICYmIGxlbiAhPSAwID8gLTEgOiByZXQ7Ci19Ci0KLSNpZiBkZWZpbmVkKFNUREMpIHx8IGRlZmluZWQoWl9IQVZFX1NUREFSR19IKQotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCi0vKiAtLSBzZWUgemxpYi5oIC0tICovCi1pbnQgWkVYUE9SVFZBIGd6dnByaW50ZihnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHZhKQotewotICAgIGludCBzaXplLCBsZW47Ci0gICAgZ3pfc3RhdGVwIHN0YXRlOwotICAgIHpfc3RyZWFtcCBzdHJtOwotCi0gICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLwotICAgIGlmIChmaWxlID09IE5VTEwpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKLSAgICBzdHJtID0gJihzdGF0ZS0+c3RybSk7Ci0KLSAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHdyaXRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSB8fCBzdGF0ZS0+ZXJyICE9IFpfT0spCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLyogbWFrZSBzdXJlIHdlIGhhdmUgc29tZSBidWZmZXIgc3BhY2UgKi8KLSAgICBpZiAoc3RhdGUtPnNpemUgPT0gMCAmJiBnel9pbml0KHN0YXRlKSA9PSAtMSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBjaGVjayBmb3Igc2VlayByZXF1ZXN0ICovCi0gICAgaWYgKHN0YXRlLT5zZWVrKSB7Ci0gICAgICAgIHN0YXRlLT5zZWVrID0gMDsKLSAgICAgICAgaWYgKGd6X3plcm8oc3RhdGUsIHN0YXRlLT5za2lwKSA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIGNvbnN1bWUgd2hhdGV2ZXIncyBsZWZ0IGluIHRoZSBpbnB1dCBidWZmZXIgKi8KLSAgICBpZiAoc3RybS0+YXZhaWxfaW4gJiYgZ3pfY29tcChzdGF0ZSwgWl9OT19GTFVTSCkgPT0gLTEpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLyogZG8gdGhlIHByaW50ZigpIGludG8gdGhlIGlucHV0IGJ1ZmZlciwgcHV0IGxlbmd0aCBpbiBsZW4gKi8KLSAgICBzaXplID0gKGludCkoc3RhdGUtPnNpemUpOwotICAgIHN0YXRlLT5pbltzaXplIC0gMV0gPSAwOwotI2lmZGVmIE5PX3ZzbnByaW50ZgotIyAgaWZkZWYgSEFTX3ZzcHJpbnRmX3ZvaWQKLSAgICAodm9pZCl2c3ByaW50ZigoY2hhciAqKShzdGF0ZS0+aW4pLCBmb3JtYXQsIHZhKTsKLSAgICBmb3IgKGxlbiA9IDA7IGxlbiA8IHNpemU7IGxlbisrKQotICAgICAgICBpZiAoc3RhdGUtPmluW2xlbl0gPT0gMCkgYnJlYWs7Ci0jICBlbHNlCi0gICAgbGVuID0gdnNwcmludGYoKGNoYXIgKikoc3RhdGUtPmluKSwgZm9ybWF0LCB2YSk7Ci0jICBlbmRpZgotI2Vsc2UKLSMgIGlmZGVmIEhBU192c25wcmludGZfdm9pZAotICAgICh2b2lkKXZzbnByaW50ZigoY2hhciAqKShzdGF0ZS0+aW4pLCBzaXplLCBmb3JtYXQsIHZhKTsKLSAgICBsZW4gPSBzdHJsZW4oKGNoYXIgKikoc3RhdGUtPmluKSk7Ci0jICBlbHNlCi0gICAgbGVuID0gdnNucHJpbnRmKChjaGFyICopKHN0YXRlLT5pbiksIHNpemUsIGZvcm1hdCwgdmEpOwotIyAgZW5kaWYKLSNlbmRpZgotCi0gICAgLyogY2hlY2sgdGhhdCBwcmludGYoKSByZXN1bHRzIGZpdCBpbiBidWZmZXIgKi8KLSAgICBpZiAobGVuIDw9IDAgfHwgbGVuID49IChpbnQpc2l6ZSB8fCBzdGF0ZS0+aW5bc2l6ZSAtIDFdICE9IDApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLyogdXBkYXRlIGJ1ZmZlciBhbmQgcG9zaXRpb24sIGRlZmVyIGNvbXByZXNzaW9uIHVudGlsIG5lZWRlZCAqLwotICAgIHN0cm0tPmF2YWlsX2luID0gKHVuc2lnbmVkKWxlbjsKLSAgICBzdHJtLT5uZXh0X2luID0gc3RhdGUtPmluOwotICAgIHN0YXRlLT54LnBvcyArPSBsZW47Ci0gICAgcmV0dXJuIGxlbjsKLX0KLQotaW50IFpFWFBPUlRWQSBnenByaW50ZihnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0gICAgdmFfbGlzdCB2YTsKLSAgICBpbnQgcmV0OwotCi0gICAgdmFfc3RhcnQodmEsIGZvcm1hdCk7Ci0gICAgcmV0ID0gZ3p2cHJpbnRmKGZpbGUsIGZvcm1hdCwgdmEpOwotICAgIHZhX2VuZCh2YSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotI2Vsc2UgLyogIVNUREMgJiYgIVpfSEFWRV9TVERBUkdfSCAqLwotCi0vKiAtLSBzZWUgemxpYi5oIC0tICovCi1pbnQgWkVYUE9SVFZBIGd6cHJpbnRmICgKLSAgICBnekZpbGUgZmlsZSwKLSAgICBjb25zdCBjaGFyICpmb3JtYXQsCi0gICAgaW50IGExLCBpbnQgYTIsIGludCBhMywgaW50IGE0LCBpbnQgYTUsIGludCBhNiwgaW50IGE3LCBpbnQgYTgsIGludCBhOSwgaW50IGExMCwKLSAgICAgICAgaW50IGExMSwgaW50IGExMiwgaW50IGExMywgaW50IGExNCwgaW50IGExNSwgaW50IGExNiwgaW50IGExNywgaW50IGExOCwgaW50IGExOSwgaW50IGEyMCkKLXsKLSAgICBpbnQgc2l6ZSwgbGVuOwotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLSAgICB6X3N0cmVhbXAgc3RybTsKLQotICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7Ci0gICAgc3RybSA9ICYoc3RhdGUtPnN0cm0pOwotCi0gICAgLyogY2hlY2sgdGhhdCBjYW4gcmVhbGx5IHBhc3MgcG9pbnRlciBpbiBpbnRzICovCi0gICAgaWYgKHNpemVvZihpbnQpICE9IHNpemVvZih2b2lkICopKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIGNoZWNrIHRoYXQgd2UncmUgd3JpdGluZyBhbmQgdGhhdCB0aGVyZSdzIG5vIGVycm9yICovCi0gICAgaWYgKHN0YXRlLT5tb2RlICE9IEdaX1dSSVRFIHx8IHN0YXRlLT5lcnIgIT0gWl9PSykKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBtYWtlIHN1cmUgd2UgaGF2ZSBzb21lIGJ1ZmZlciBzcGFjZSAqLwotICAgIGlmIChzdGF0ZS0+c2l6ZSA9PSAwICYmIGd6X2luaXQoc3RhdGUpID09IC0xKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIC8qIGNoZWNrIGZvciBzZWVrIHJlcXVlc3QgKi8KLSAgICBpZiAoc3RhdGUtPnNlZWspIHsKLSAgICAgICAgc3RhdGUtPnNlZWsgPSAwOwotICAgICAgICBpZiAoZ3pfemVybyhzdGF0ZSwgc3RhdGUtPnNraXApID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyogY29uc3VtZSB3aGF0ZXZlcidzIGxlZnQgaW4gdGhlIGlucHV0IGJ1ZmZlciAqLwotICAgIGlmIChzdHJtLT5hdmFpbF9pbiAmJiBnel9jb21wKHN0YXRlLCBaX05PX0ZMVVNIKSA9PSAtMSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICAvKiBkbyB0aGUgcHJpbnRmKCkgaW50byB0aGUgaW5wdXQgYnVmZmVyLCBwdXQgbGVuZ3RoIGluIGxlbiAqLwotICAgIHNpemUgPSAoaW50KShzdGF0ZS0+c2l6ZSk7Ci0gICAgc3RhdGUtPmluW3NpemUgLSAxXSA9IDA7Ci0jaWZkZWYgTk9fc25wcmludGYKLSMgIGlmZGVmIEhBU19zcHJpbnRmX3ZvaWQKLSAgICBzcHJpbnRmKChjaGFyICopKHN0YXRlLT5pbiksIGZvcm1hdCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LAotICAgICAgICAgICAgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKTsKLSAgICBmb3IgKGxlbiA9IDA7IGxlbiA8IHNpemU7IGxlbisrKQotICAgICAgICBpZiAoc3RhdGUtPmluW2xlbl0gPT0gMCkgYnJlYWs7Ci0jICBlbHNlCi0gICAgbGVuID0gc3ByaW50ZigoY2hhciAqKShzdGF0ZS0+aW4pLCBmb3JtYXQsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwKLSAgICAgICAgICAgICAgICAgIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LCBhMTksIGEyMCk7Ci0jICBlbmRpZgotI2Vsc2UKLSMgIGlmZGVmIEhBU19zbnByaW50Zl92b2lkCi0gICAgc25wcmludGYoKGNoYXIgKikoc3RhdGUtPmluKSwgc2l6ZSwgZm9ybWF0LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsCi0gICAgICAgICAgICAgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsIGExOSwgYTIwKTsKLSAgICBsZW4gPSBzdHJsZW4oKGNoYXIgKikoc3RhdGUtPmluKSk7Ci0jICBlbHNlCi0gICAgbGVuID0gc25wcmludGYoKGNoYXIgKikoc3RhdGUtPmluKSwgc2l6ZSwgZm9ybWF0LCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LAotICAgICAgICAgICAgICAgICAgIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgsCi0gICAgICAgICAgICAgICAgICAgYTE5LCBhMjApOwotIyAgZW5kaWYKLSNlbmRpZgotCi0gICAgLyogY2hlY2sgdGhhdCBwcmludGYoKSByZXN1bHRzIGZpdCBpbiBidWZmZXIgKi8KLSAgICBpZiAobGVuIDw9IDAgfHwgbGVuID49IChpbnQpc2l6ZSB8fCBzdGF0ZS0+aW5bc2l6ZSAtIDFdICE9IDApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgLyogdXBkYXRlIGJ1ZmZlciBhbmQgcG9zaXRpb24sIGRlZmVyIGNvbXByZXNzaW9uIHVudGlsIG5lZWRlZCAqLwotICAgIHN0cm0tPmF2YWlsX2luID0gKHVuc2lnbmVkKWxlbjsKLSAgICBzdHJtLT5uZXh0X2luID0gc3RhdGUtPmluOwotICAgIHN0YXRlLT54LnBvcyArPSBsZW47Ci0gICAgcmV0dXJuIGxlbjsKLX0KLQotI2VuZGlmCi0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLWludCBaRVhQT1JUIGd6Zmx1c2goCi0gICAgZ3pGaWxlIGZpbGUsCi0gICAgaW50IGZsdXNoKQotewotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLQotICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7Ci0KLSAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHdyaXRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSB8fCBzdGF0ZS0+ZXJyICE9IFpfT0spCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLQotICAgIC8qIGNoZWNrIGZsdXNoIHBhcmFtZXRlciAqLwotICAgIGlmIChmbHVzaCA8IDAgfHwgZmx1c2ggPiBaX0ZJTklTSCkKLSAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotCi0gICAgLyogY2hlY2sgZm9yIHNlZWsgcmVxdWVzdCAqLwotICAgIGlmIChzdGF0ZS0+c2VlaykgewotICAgICAgICBzdGF0ZS0+c2VlayA9IDA7Ci0gICAgICAgIGlmIChnel96ZXJvKHN0YXRlLCBzdGF0ZS0+c2tpcCkgPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLyogY29tcHJlc3MgcmVtYWluaW5nIGRhdGEgd2l0aCByZXF1ZXN0ZWQgZmx1c2ggKi8KLSAgICBnel9jb21wKHN0YXRlLCBmbHVzaCk7Ci0gICAgcmV0dXJuIHN0YXRlLT5lcnI7Ci19Ci0KLS8qIC0tIHNlZSB6bGliLmggLS0gKi8KLWludCBaRVhQT1JUIGd6c2V0cGFyYW1zKAotICAgIGd6RmlsZSBmaWxlLAotICAgIGludCBsZXZlbCwKLSAgICBpbnQgc3RyYXRlZ3kpCi17Ci0gICAgZ3pfc3RhdGVwIHN0YXRlOwotICAgIHpfc3RyZWFtcCBzdHJtOwotCi0gICAgLyogZ2V0IGludGVybmFsIHN0cnVjdHVyZSAqLwotICAgIGlmIChmaWxlID09IE5VTEwpCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBzdGF0ZSA9IChnel9zdGF0ZXApZmlsZTsKLSAgICBzdHJtID0gJihzdGF0ZS0+c3RybSk7Ci0KLSAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHdyaXRpbmcgYW5kIHRoYXQgdGhlcmUncyBubyBlcnJvciAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBHWl9XUklURSB8fCBzdGF0ZS0+ZXJyICE9IFpfT0spCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLQotICAgIC8qIGlmIG5vIGNoYW5nZSBpcyByZXF1ZXN0ZWQsIHRoZW4gZG8gbm90aGluZyAqLwotICAgIGlmIChsZXZlbCA9PSBzdGF0ZS0+bGV2ZWwgJiYgc3RyYXRlZ3kgPT0gc3RhdGUtPnN0cmF0ZWd5KQotICAgICAgICByZXR1cm4gWl9PSzsKLQotICAgIC8qIGNoZWNrIGZvciBzZWVrIHJlcXVlc3QgKi8KLSAgICBpZiAoc3RhdGUtPnNlZWspIHsKLSAgICAgICAgc3RhdGUtPnNlZWsgPSAwOwotICAgICAgICBpZiAoZ3pfemVybyhzdGF0ZSwgc3RhdGUtPnNraXApID09IC0xKQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qIGNoYW5nZSBjb21wcmVzc2lvbiBwYXJhbWV0ZXJzIGZvciBzdWJzZXF1ZW50IGlucHV0ICovCi0gICAgaWYgKHN0YXRlLT5zaXplKSB7Ci0gICAgICAgIC8qIGZsdXNoIHByZXZpb3VzIGlucHV0IHdpdGggcHJldmlvdXMgcGFyYW1ldGVycyBiZWZvcmUgY2hhbmdpbmcgKi8KLSAgICAgICAgaWYgKHN0cm0tPmF2YWlsX2luICYmIGd6X2NvbXAoc3RhdGUsIFpfUEFSVElBTF9GTFVTSCkgPT0gLTEpCi0gICAgICAgICAgICByZXR1cm4gc3RhdGUtPmVycjsKLSAgICAgICAgZGVmbGF0ZVBhcmFtcyhzdHJtLCBsZXZlbCwgc3RyYXRlZ3kpOwotICAgIH0KLSAgICBzdGF0ZS0+bGV2ZWwgPSBsZXZlbDsKLSAgICBzdGF0ZS0+c3RyYXRlZ3kgPSBzdHJhdGVneTsKLSAgICByZXR1cm4gWl9PSzsKLX0KLQotLyogLS0gc2VlIHpsaWIuaCAtLSAqLwotaW50IFpFWFBPUlQgZ3pjbG9zZV93KAotICAgIGd6RmlsZSBmaWxlKQotewotICAgIGludCByZXQgPSBaX09LOwotICAgIGd6X3N0YXRlcCBzdGF0ZTsKLQotICAgIC8qIGdldCBpbnRlcm5hbCBzdHJ1Y3R1cmUgKi8KLSAgICBpZiAoZmlsZSA9PSBOVUxMKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoZ3pfc3RhdGVwKWZpbGU7Ci0KLSAgICAvKiBjaGVjayB0aGF0IHdlJ3JlIHdyaXRpbmcgKi8KLSAgICBpZiAoc3RhdGUtPm1vZGUgIT0gR1pfV1JJVEUpCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLQotICAgIC8qIGNoZWNrIGZvciBzZWVrIHJlcXVlc3QgKi8KLSAgICBpZiAoc3RhdGUtPnNlZWspIHsKLSAgICAgICAgc3RhdGUtPnNlZWsgPSAwOwotICAgICAgICBpZiAoZ3pfemVybyhzdGF0ZSwgc3RhdGUtPnNraXApID09IC0xKQotICAgICAgICAgICAgcmV0ID0gc3RhdGUtPmVycjsKLSAgICB9Ci0KLSAgICAvKiBmbHVzaCwgZnJlZSBtZW1vcnksIGFuZCBjbG9zZSBmaWxlICovCi0gICAgaWYgKGd6X2NvbXAoc3RhdGUsIFpfRklOSVNIKSA9PSAtMSkKLSAgICAgICAgcmV0ID0gc3RhdGUtPmVycjsKLSAgICBpZiAoc3RhdGUtPnNpemUpIHsKLSAgICAgICAgaWYgKCFzdGF0ZS0+ZGlyZWN0KSB7Ci0gICAgICAgICAgICAodm9pZClkZWZsYXRlRW5kKCYoc3RhdGUtPnN0cm0pKTsKLSAgICAgICAgICAgIGZyZWUoc3RhdGUtPm91dCk7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZShzdGF0ZS0+aW4pOwotICAgIH0KLSAgICBnel9lcnJvcihzdGF0ZSwgWl9PSywgTlVMTCk7Ci0gICAgZnJlZShzdGF0ZS0+cGF0aCk7Ci0gICAgaWYgKGNsb3NlKHN0YXRlLT5mZCkgPT0gLTEpCi0gICAgICAgIHJldCA9IFpfRVJSTk87Ci0gICAgZnJlZShzdGF0ZSk7Ci0gICAgcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9pbmZiYWNrLmMgYi90aGlyZF9wYXJ0eS96bGliX3YxMjgvaW5mYmFjay5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTdiYmQ2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9pbmZiYWNrLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NDAgKzAsMCBAQAotLyogaW5mYmFjay5jIC0tIGluZmxhdGUgdXNpbmcgYSBjYWxsLWJhY2sgaW50ZXJmYWNlCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMSBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyoKLSAgIFRoaXMgY29kZSBpcyBsYXJnZWx5IGNvcGllZCBmcm9tIGluZmxhdGUuYy4gIE5vcm1hbGx5IGVpdGhlciBpbmZiYWNrLm8gb3IKLSAgIGluZmxhdGUubyB3b3VsZCBiZSBsaW5rZWQgaW50byBhbiBhcHBsaWNhdGlvbi0tbm90IGJvdGguICBUaGUgaW50ZXJmYWNlCi0gICB3aXRoIGluZmZhc3QuYyBpcyByZXRhaW5lZCBzbyB0aGF0IG9wdGltaXplZCBhc3NlbWJsZXItY29kZWQgdmVyc2lvbnMgb2YKLSAgIGluZmxhdGVfZmFzdCgpIGNhbiBiZSB1c2VkIHdpdGggZWl0aGVyIGluZmxhdGUuYyBvciBpbmZiYWNrLmMuCi0gKi8KLQotI2luY2x1ZGUgInp1dGlsLmgiCi0jaW5jbHVkZSAiaW5mdHJlZXMuaCIKLSNpbmNsdWRlICJpbmZsYXRlLmgiCi0jaW5jbHVkZSAiaW5mZmFzdC5oIgotCi0vKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCi1sb2NhbCB2b2lkIGZpeGVkdGFibGVzIE9GKChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlKSk7Ci0KLS8qCi0gICBzdHJtIHByb3ZpZGVzIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBpbiB6YWxsb2MgYW5kIHpmcmVlLCBvcgotICAgWl9OVUxMIHRvIHVzZSB0aGUgbGlicmFyeSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCi0KLSAgIHdpbmRvd0JpdHMgaXMgaW4gdGhlIHJhbmdlIDguLjE1LCBhbmQgd2luZG93IGlzIGEgdXNlci1zdXBwbGllZAotICAgd2luZG93IGFuZCBvdXRwdXQgYnVmZmVyIHRoYXQgaXMgMioqd2luZG93Qml0cyBieXRlcy4KLSAqLwotaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tJbml0XygKLXpfc3RyZWFtcCBzdHJtLAotaW50IHdpbmRvd0JpdHMsCi11bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93LAotY29uc3QgY2hhciAqdmVyc2lvbiwKLWludCBzdHJlYW1fc2l6ZSkKLXsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotCi0gICAgaWYgKHZlcnNpb24gPT0gWl9OVUxMIHx8IHZlcnNpb25bMF0gIT0gWkxJQl9WRVJTSU9OWzBdIHx8Ci0gICAgICAgIHN0cmVhbV9zaXplICE9IChpbnQpKHNpemVvZih6X3N0cmVhbSkpKQotICAgICAgICByZXR1cm4gWl9WRVJTSU9OX0VSUk9SOwotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCB3aW5kb3cgPT0gWl9OVUxMIHx8Ci0gICAgICAgIHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSkKLSAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsgICAgICAgICAgICAgICAgIC8qIGluIGNhc2Ugd2UgcmV0dXJuIGFuIGVycm9yICovCi0gICAgaWYgKHN0cm0tPnphbGxvYyA9PSAoYWxsb2NfZnVuYykwKSB7Ci0jaWZkZWYgWl9TT0xPCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSNlbHNlCi0gICAgICAgIHN0cm0tPnphbGxvYyA9IHpjYWxsb2M7Ci0gICAgICAgIHN0cm0tPm9wYXF1ZSA9ICh2b2lkcGYpMDsKLSNlbmRpZgotICAgIH0KLSAgICBpZiAoc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKQotI2lmZGVmIFpfU09MTwotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0jZWxzZQotICAgIHN0cm0tPnpmcmVlID0gemNmcmVlOwotI2VuZGlmCi0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopWkFMTE9DKHN0cm0sIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSkpOwotICAgIGlmIChzdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX01FTV9FUlJPUjsKLSAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6IGFsbG9jYXRlZFxuIikpOwotICAgIHN0cm0tPnN0YXRlID0gKHN0cnVjdCBpbnRlcm5hbF9zdGF0ZSBGQVIgKilzdGF0ZTsKLSAgICBzdGF0ZS0+ZG1heCA9IDMyNzY4VTsKLSAgICBzdGF0ZS0+d2JpdHMgPSB3aW5kb3dCaXRzOwotICAgIHN0YXRlLT53c2l6ZSA9IDFVIDw8IHdpbmRvd0JpdHM7Ci0gICAgc3RhdGUtPndpbmRvdyA9IHdpbmRvdzsKLSAgICBzdGF0ZS0+d25leHQgPSAwOwotICAgIHN0YXRlLT53aGF2ZSA9IDA7Ci0gICAgcmV0dXJuIFpfT0s7Ci19Ci0KLS8qCi0gICBSZXR1cm4gc3RhdGUgd2l0aCBsZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kaW5nIHRhYmxlcyBhbmQgaW5kZXggc2l6ZXMgc2V0IHRvCi0gICBmaXhlZCBjb2RlIGRlY29kaW5nLiAgTm9ybWFsbHkgdGhpcyByZXR1cm5zIGZpeGVkIHRhYmxlcyBmcm9tIGluZmZpeGVkLmguCi0gICBJZiBCVUlMREZJWEVEIGlzIGRlZmluZWQsIHRoZW4gaW5zdGVhZCB0aGlzIHJvdXRpbmUgYnVpbGRzIHRoZSB0YWJsZXMgdGhlCi0gICBmaXJzdCB0aW1lIGl0J3MgY2FsbGVkLCBhbmQgcmV0dXJucyB0aG9zZSB0YWJsZXMgdGhlIGZpcnN0IHRpbWUgYW5kCi0gICB0aGVyZWFmdGVyLiAgVGhpcyByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBjb2RlIGJ5IGFib3V0IDJLIGJ5dGVzLCBpbgotICAgZXhjaGFuZ2UgZm9yIGEgbGl0dGxlIGV4ZWN1dGlvbiB0aW1lLiAgSG93ZXZlciwgQlVJTERGSVhFRCBzaG91bGQgbm90IGJlCi0gICB1c2VkIGZvciB0aHJlYWRlZCBhcHBsaWNhdGlvbnMsIHNpbmNlIHRoZSByZXdyaXRpbmcgb2YgdGhlIHRhYmxlcyBhbmQgdmlyZ2luCi0gICBtYXkgbm90IGJlIHRocmVhZC1zYWZlLgotICovCi1sb2NhbCB2b2lkIGZpeGVkdGFibGVzKAotc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZSkKLXsKLSNpZmRlZiBCVUlMREZJWEVECi0gICAgc3RhdGljIGludCB2aXJnaW4gPSAxOwotICAgIHN0YXRpYyBjb2RlICpsZW5maXgsICpkaXN0Zml4OwotICAgIHN0YXRpYyBjb2RlIGZpeGVkWzU0NF07Ci0KLSAgICAvKiBidWlsZCBmaXhlZCBodWZmbWFuIHRhYmxlcyBpZiBmaXJzdCBjYWxsIChtYXkgbm90IGJlIHRocmVhZCBzYWZlKSAqLwotICAgIGlmICh2aXJnaW4pIHsKLSAgICAgICAgdW5zaWduZWQgc3ltLCBiaXRzOwotICAgICAgICBzdGF0aWMgY29kZSAqbmV4dDsKLQotICAgICAgICAvKiBsaXRlcmFsL2xlbmd0aCB0YWJsZSAqLwotICAgICAgICBzeW0gPSAwOwotICAgICAgICB3aGlsZSAoc3ltIDwgMTQ0KSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA4OwotICAgICAgICB3aGlsZSAoc3ltIDwgMjU2KSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA5OwotICAgICAgICB3aGlsZSAoc3ltIDwgMjgwKSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA3OwotICAgICAgICB3aGlsZSAoc3ltIDwgMjg4KSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA4OwotICAgICAgICBuZXh0ID0gZml4ZWQ7Ci0gICAgICAgIGxlbmZpeCA9IG5leHQ7Ci0gICAgICAgIGJpdHMgPSA5OwotICAgICAgICBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLT5sZW5zLCAyODgsICYobmV4dCksICYoYml0cyksIHN0YXRlLT53b3JrKTsKLQotICAgICAgICAvKiBkaXN0YW5jZSB0YWJsZSAqLwotICAgICAgICBzeW0gPSAwOwotICAgICAgICB3aGlsZSAoc3ltIDwgMzIpIHN0YXRlLT5sZW5zW3N5bSsrXSA9IDU7Ci0gICAgICAgIGRpc3RmaXggPSBuZXh0OwotICAgICAgICBiaXRzID0gNTsKLSAgICAgICAgaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUtPmxlbnMsIDMyLCAmKG5leHQpLCAmKGJpdHMpLCBzdGF0ZS0+d29yayk7Ci0KLSAgICAgICAgLyogZG8gdGhpcyBqdXN0IG9uY2UgKi8KLSAgICAgICAgdmlyZ2luID0gMDsKLSAgICB9Ci0jZWxzZSAvKiAhQlVJTERGSVhFRCAqLwotIyAgIGluY2x1ZGUgImluZmZpeGVkLmgiCi0jZW5kaWYgLyogQlVJTERGSVhFRCAqLwotICAgIHN0YXRlLT5sZW5jb2RlID0gbGVuZml4OwotICAgIHN0YXRlLT5sZW5iaXRzID0gOTsKLSAgICBzdGF0ZS0+ZGlzdGNvZGUgPSBkaXN0Zml4OwotICAgIHN0YXRlLT5kaXN0Yml0cyA9IDU7Ci19Ci0KLS8qIE1hY3JvcyBmb3IgaW5mbGF0ZUJhY2soKTogKi8KLQotLyogTG9hZCByZXR1cm5lZCBzdGF0ZSBmcm9tIGluZmxhdGVfZmFzdCgpICovCi0jZGVmaW5lIExPQUQoKSBcCi0gICAgZG8geyBcCi0gICAgICAgIHB1dCA9IHN0cm0tPm5leHRfb3V0OyBcCi0gICAgICAgIGxlZnQgPSBzdHJtLT5hdmFpbF9vdXQ7IFwKLSAgICAgICAgbmV4dCA9IHN0cm0tPm5leHRfaW47IFwKLSAgICAgICAgaGF2ZSA9IHN0cm0tPmF2YWlsX2luOyBcCi0gICAgICAgIGhvbGQgPSBzdGF0ZS0+aG9sZDsgXAotICAgICAgICBiaXRzID0gc3RhdGUtPmJpdHM7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBTZXQgc3RhdGUgZnJvbSByZWdpc3RlcnMgZm9yIGluZmxhdGVfZmFzdCgpICovCi0jZGVmaW5lIFJFU1RPUkUoKSBcCi0gICAgZG8geyBcCi0gICAgICAgIHN0cm0tPm5leHRfb3V0ID0gcHV0OyBcCi0gICAgICAgIHN0cm0tPmF2YWlsX291dCA9IGxlZnQ7IFwKLSAgICAgICAgc3RybS0+bmV4dF9pbiA9IG5leHQ7IFwKLSAgICAgICAgc3RybS0+YXZhaWxfaW4gPSBoYXZlOyBcCi0gICAgICAgIHN0YXRlLT5ob2xkID0gaG9sZDsgXAotICAgICAgICBzdGF0ZS0+Yml0cyA9IGJpdHM7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBDbGVhciB0aGUgaW5wdXQgYml0IGFjY3VtdWxhdG9yICovCi0jZGVmaW5lIElOSVRCSVRTKCkgXAotICAgIGRvIHsgXAotICAgICAgICBob2xkID0gMDsgXAotICAgICAgICBiaXRzID0gMDsgXAotICAgIH0gd2hpbGUgKDApCi0KLS8qIEFzc3VyZSB0aGF0IHNvbWUgaW5wdXQgaXMgYXZhaWxhYmxlLiAgSWYgaW5wdXQgaXMgcmVxdWVzdGVkLCBidXQgZGVuaWVkLAotICAgdGhlbiByZXR1cm4gYSBaX0JVRl9FUlJPUiBmcm9tIGluZmxhdGVCYWNrKCkuICovCi0jZGVmaW5lIFBVTEwoKSBcCi0gICAgZG8geyBcCi0gICAgICAgIGlmIChoYXZlID09IDApIHsgXAotICAgICAgICAgICAgaGF2ZSA9IGluKGluX2Rlc2MsICZuZXh0KTsgXAotICAgICAgICAgICAgaWYgKGhhdmUgPT0gMCkgeyBcCi0gICAgICAgICAgICAgICAgbmV4dCA9IFpfTlVMTDsgXAotICAgICAgICAgICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOyBcCi0gICAgICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7IFwKLSAgICAgICAgICAgIH0gXAotICAgICAgICB9IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBHZXQgYSBieXRlIG9mIGlucHV0IGludG8gdGhlIGJpdCBhY2N1bXVsYXRvciwgb3IgcmV0dXJuIGZyb20gaW5mbGF0ZUJhY2soKQotICAgd2l0aCBhbiBlcnJvciBpZiB0aGVyZSBpcyBubyBpbnB1dCBhdmFpbGFibGUuICovCi0jZGVmaW5lIFBVTExCWVRFKCkgXAotICAgIGRvIHsgXAotICAgICAgICBQVUxMKCk7IFwKLSAgICAgICAgaGF2ZS0tOyBcCi0gICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKCpuZXh0KyspIDw8IGJpdHM7IFwKLSAgICAgICAgYml0cyArPSA4OyBcCi0gICAgfSB3aGlsZSAoMCkKLQotLyogQXNzdXJlIHRoYXQgdGhlcmUgYXJlIGF0IGxlYXN0IG4gYml0cyBpbiB0aGUgYml0IGFjY3VtdWxhdG9yLiAgSWYgdGhlcmUgaXMKLSAgIG5vdCBlbm91Z2ggYXZhaWxhYmxlIGlucHV0IHRvIGRvIHRoYXQsIHRoZW4gcmV0dXJuIGZyb20gaW5mbGF0ZUJhY2soKSB3aXRoCi0gICBhbiBlcnJvci4gKi8KLSNkZWZpbmUgTkVFREJJVFMobikgXAotICAgIGRvIHsgXAotICAgICAgICB3aGlsZSAoYml0cyA8ICh1bnNpZ25lZCkobikpIFwKLSAgICAgICAgICAgIFBVTExCWVRFKCk7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBSZXR1cm4gdGhlIGxvdyBuIGJpdHMgb2YgdGhlIGJpdCBhY2N1bXVsYXRvciAobiA8IDE2KSAqLwotI2RlZmluZSBCSVRTKG4pIFwKLSAgICAoKHVuc2lnbmVkKWhvbGQgJiAoKDFVIDw8IChuKSkgLSAxKSkKLQotLyogUmVtb3ZlIG4gYml0cyBmcm9tIHRoZSBiaXQgYWNjdW11bGF0b3IgKi8KLSNkZWZpbmUgRFJPUEJJVFMobikgXAotICAgIGRvIHsgXAotICAgICAgICBob2xkID4+PSAobik7IFwKLSAgICAgICAgYml0cyAtPSAodW5zaWduZWQpKG4pOyBcCi0gICAgfSB3aGlsZSAoMCkKLQotLyogUmVtb3ZlIHplcm8gdG8gc2V2ZW4gYml0cyBhcyBuZWVkZWQgdG8gZ28gdG8gYSBieXRlIGJvdW5kYXJ5ICovCi0jZGVmaW5lIEJZVEVCSVRTKCkgXAotICAgIGRvIHsgXAotICAgICAgICBob2xkID4+PSBiaXRzICYgNzsgXAotICAgICAgICBiaXRzIC09IGJpdHMgJiA3OyBcCi0gICAgfSB3aGlsZSAoMCkKLQotLyogQXNzdXJlIHRoYXQgc29tZSBvdXRwdXQgc3BhY2UgaXMgYXZhaWxhYmxlLCBieSB3cml0aW5nIG91dCB0aGUgd2luZG93Ci0gICBpZiBpdCdzIGZ1bGwuICBJZiB0aGUgd3JpdGUgZmFpbHMsIHJldHVybiBmcm9tIGluZmxhdGVCYWNrKCkgd2l0aCBhCi0gICBaX0JVRl9FUlJPUi4gKi8KLSNkZWZpbmUgUk9PTSgpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgaWYgKGxlZnQgPT0gMCkgeyBcCi0gICAgICAgICAgICBwdXQgPSBzdGF0ZS0+d2luZG93OyBcCi0gICAgICAgICAgICBsZWZ0ID0gc3RhdGUtPndzaXplOyBcCi0gICAgICAgICAgICBzdGF0ZS0+d2hhdmUgPSBsZWZ0OyBcCi0gICAgICAgICAgICBpZiAob3V0KG91dF9kZXNjLCBwdXQsIGxlZnQpKSB7IFwKLSAgICAgICAgICAgICAgICByZXQgPSBaX0JVRl9FUlJPUjsgXAotICAgICAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOyBcCi0gICAgICAgICAgICB9IFwKLSAgICAgICAgfSBcCi0gICAgfSB3aGlsZSAoMCkKLQotLyoKLSAgIHN0cm0gcHJvdmlkZXMgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucyBhbmQgd2luZG93IGJ1ZmZlciBvbiBpbnB1dCwKLSAgIGFuZCBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgdW51c2VkIGlucHV0IG9uIHJldHVybi4gIEZvciBaX0RBVEFfRVJST1IKLSAgIHJldHVybnMsIHN0cm0gd2lsbCBhbHNvIHByb3ZpZGUgYW4gZXJyb3IgbWVzc2FnZS4KLQotICAgaW4oKSBhbmQgb3V0KCkgYXJlIHRoZSBjYWxsLWJhY2sgaW5wdXQgYW5kIG91dHB1dCBmdW5jdGlvbnMuICBXaGVuCi0gICBpbmZsYXRlQmFjaygpIG5lZWRzIG1vcmUgaW5wdXQsIGl0IGNhbGxzIGluKCkuICBXaGVuIGluZmxhdGVCYWNrKCkgaGFzCi0gICBmaWxsZWQgdGhlIHdpbmRvdyB3aXRoIG91dHB1dCwgb3Igd2hlbiBpdCBjb21wbGV0ZXMgd2l0aCBkYXRhIGluIHRoZQotICAgd2luZG93LCBpdCBjYWxscyBvdXQoKSB0byB3cml0ZSBvdXQgdGhlIGRhdGEuICBUaGUgYXBwbGljYXRpb24gbXVzdCBub3QKLSAgIGNoYW5nZSB0aGUgcHJvdmlkZWQgaW5wdXQgdW50aWwgaW4oKSBpcyBjYWxsZWQgYWdhaW4gb3IgaW5mbGF0ZUJhY2soKQotICAgcmV0dXJucy4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IG5vdCBjaGFuZ2UgdGhlIHdpbmRvdy9vdXRwdXQgYnVmZmVyIHVudGlsCi0gICBpbmZsYXRlQmFjaygpIHJldHVybnMuCi0KLSAgIGluKCkgYW5kIG91dCgpIGFyZSBjYWxsZWQgd2l0aCBhIGRlc2NyaXB0b3IgcGFyYW1ldGVyIHByb3ZpZGVkIGluIHRoZQotICAgaW5mbGF0ZUJhY2soKSBjYWxsLiAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGEgc3RydWN0dXJlIHRoYXQgcHJvdmlkZXMgdGhlCi0gICBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBkbyB0aGUgcmVhZCBvciB3cml0ZSwgYXMgd2VsbCBhcyBhY2N1bXVsYXRlZAotICAgaW5mb3JtYXRpb24gb24gdGhlIGlucHV0IGFuZCBvdXRwdXQgc3VjaCBhcyB0b3RhbHMgYW5kIGNoZWNrIHZhbHVlcy4KLQotICAgaW4oKSBzaG91bGQgcmV0dXJuIHplcm8gb24gZmFpbHVyZS4gIG91dCgpIHNob3VsZCByZXR1cm4gbm9uLXplcm8gb24KLSAgIGZhaWx1cmUuICBJZiBlaXRoZXIgaW4oKSBvciBvdXQoKSBmYWlscywgdGhhbiBpbmZsYXRlQmFjaygpIHJldHVybnMgYQotICAgWl9CVUZfRVJST1IuICBzdHJtLT5uZXh0X2luIGNhbiBiZSBjaGVja2VkIGZvciBaX05VTEwgdG8gc2VlIHdoZXRoZXIgaXQKLSAgIHdhcyBpbigpIG9yIG91dCgpIHRoYXQgY2F1c2VkIGluIHRoZSBlcnJvci4gIE90aGVyd2lzZSwgIGluZmxhdGVCYWNrKCkKLSAgIHJldHVybnMgWl9TVFJFQU1fRU5EIG9uIHN1Y2Nlc3MsIFpfREFUQV9FUlJPUiBmb3IgYW4gZGVmbGF0ZSBmb3JtYXQKLSAgIGVycm9yLCBvciBaX01FTV9FUlJPUiBpZiBpdCBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgc3RhdGUuCi0gICBpbmZsYXRlQmFjaygpIGNhbiBhbHNvIHJldHVybiBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgaW5wdXQgcGFyYW1ldGVycwotICAgYXJlIG5vdCBjb3JyZWN0LCBpLmUuIHN0cm0gaXMgWl9OVUxMIG9yIHRoZSBzdGF0ZSB3YXMgbm90IGluaXRpYWxpemVkLgotICovCi1pbnQgWkVYUE9SVCBpbmZsYXRlQmFjaygKLXpfc3RyZWFtcCBzdHJtLAotaW5fZnVuYyBpbiwKLXZvaWQgRkFSICppbl9kZXNjLAotb3V0X2Z1bmMgb3V0LAotdm9pZCBGQVIgKm91dF9kZXNjKQotewotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Ci0gICAgel9jb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqbmV4dDsgICAgLyogbmV4dCBpbnB1dCAqLwotICAgIHVuc2lnbmVkIGNoYXIgRkFSICpwdXQ7ICAgICAvKiBuZXh0IG91dHB1dCAqLwotICAgIHVuc2lnbmVkIGhhdmUsIGxlZnQ7ICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqLwotICAgIHVuc2lnbmVkIGxvbmcgaG9sZDsgICAgICAgICAvKiBiaXQgYnVmZmVyICovCi0gICAgdW5zaWduZWQgYml0czsgICAgICAgICAgICAgIC8qIGJpdHMgaW4gYml0IGJ1ZmZlciAqLwotICAgIHVuc2lnbmVkIGNvcHk7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi8KLSAgICB1bnNpZ25lZCBjaGFyIEZBUiAqZnJvbTsgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBieXRlcyBmcm9tICovCi0gICAgY29kZSBoZXJlOyAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgZGVjb2RpbmcgdGFibGUgZW50cnkgKi8KLSAgICBjb2RlIGxhc3Q7ICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovCi0gICAgdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAgIC8qIGxlbmd0aCB0byBjb3B5IGZvciByZXBlYXRzLCBiaXRzIHRvIGRyb3AgKi8KLSAgICBpbnQgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi8KLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgb3JkZXJbMTldID0gLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGhzICovCi0gICAgICAgIHsxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1fTsKLQotICAgIC8qIENoZWNrIHRoYXQgdGhlIHN0cm0gZXhpc3RzIGFuZCB0aGF0IHRoZSBzdGF0ZSB3YXMgaW5pdGlhbGl6ZWQgKi8KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7Ci0KLSAgICAvKiBSZXNldCB0aGUgc3RhdGUgKi8KLSAgICBzdHJtLT5tc2cgPSBaX05VTEw7Ci0gICAgc3RhdGUtPm1vZGUgPSBUWVBFOwotICAgIHN0YXRlLT5sYXN0ID0gMDsKLSAgICBzdGF0ZS0+d2hhdmUgPSAwOwotICAgIG5leHQgPSBzdHJtLT5uZXh0X2luOwotICAgIGhhdmUgPSBuZXh0ICE9IFpfTlVMTCA/IHN0cm0tPmF2YWlsX2luIDogMDsKLSAgICBob2xkID0gMDsKLSAgICBiaXRzID0gMDsKLSAgICBwdXQgPSBzdGF0ZS0+d2luZG93OwotICAgIGxlZnQgPSBzdGF0ZS0+d3NpemU7Ci0KLSAgICAvKiBJbmZsYXRlIHVudGlsIGVuZCBvZiBibG9jayBtYXJrZWQgYXMgbGFzdCAqLwotICAgIGZvciAoOzspCi0gICAgICAgIHN3aXRjaCAoc3RhdGUtPm1vZGUpIHsKLSAgICAgICAgY2FzZSBUWVBFOgotICAgICAgICAgICAgLyogZGV0ZXJtaW5lIGFuZCBkaXNwYXRjaCBibG9jayB0eXBlICovCi0gICAgICAgICAgICBpZiAoc3RhdGUtPmxhc3QpIHsKLSAgICAgICAgICAgICAgICBCWVRFQklUUygpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRE9ORTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE5FRURCSVRTKDMpOwotICAgICAgICAgICAgc3RhdGUtPmxhc3QgPSBCSVRTKDEpOwotICAgICAgICAgICAgRFJPUEJJVFMoMSk7Ci0gICAgICAgICAgICBzd2l0Y2ggKEJJVFMoMikpIHsKLSAgICAgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0b3JlZCBibG9jayAqLwotICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gU1RPUkVEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICBmaXhlZHRhYmxlcyhzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgZml4ZWQgY29kZXMgYmxvY2slc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sYXN0ID8gIiAobGFzdCkiIDogIiIpKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTjsgICAgICAgICAgICAgIC8qIGRlY29kZSBjb2RlcyAqLwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZHluYW1pYyBibG9jayAqLwotICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgIGR5bmFtaWMgY29kZXMgYmxvY2slc1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sYXN0ID8gIiAobGFzdCkiIDogIiIpKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRBQkxFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgYmxvY2sgdHlwZSI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEUk9QQklUUygyKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgU1RPUkVEOgotICAgICAgICAgICAgLyogZ2V0IGFuZCB2ZXJpZnkgc3RvcmVkIGJsb2NrIGxlbmd0aCAqLwotICAgICAgICAgICAgQllURUJJVFMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqLwotICAgICAgICAgICAgTkVFREJJVFMoMzIpOwotICAgICAgICAgICAgaWYgKChob2xkICYgMHhmZmZmKSAhPSAoKGhvbGQgPj4gMTYpIF4gMHhmZmZmKSkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgc3RvcmVkIGJsb2NrIGxlbmd0aHMiOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZClob2xkICYgMHhmZmZmOwotICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBzdG9yZWQgbGVuZ3RoICV1XG4iLAotICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoKSk7Ci0gICAgICAgICAgICBJTklUQklUUygpOwotCi0gICAgICAgICAgICAvKiBjb3B5IHN0b3JlZCBibG9jayBmcm9tIGlucHV0IHRvIG91dHB1dCAqLwotICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5sZW5ndGggIT0gMCkgewotICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOwotICAgICAgICAgICAgICAgIFBVTEwoKTsKLSAgICAgICAgICAgICAgICBST09NKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSBjb3B5ID0gaGF2ZTsKLSAgICAgICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIGNvcHkgPSBsZWZ0OwotICAgICAgICAgICAgICAgIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsKLSAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7Ci0gICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OwotICAgICAgICAgICAgICAgIGxlZnQgLT0gY29weTsKLSAgICAgICAgICAgICAgICBwdXQgKz0gY29weTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIC09IGNvcHk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHN0b3JlZCBlbmRcbiIpKTsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVEFCTEU6Ci0gICAgICAgICAgICAvKiBnZXQgZHluYW1pYyB0YWJsZSBlbnRyaWVzIGRlc2NyaXB0b3IgKi8KLSAgICAgICAgICAgIE5FRURCSVRTKDE0KTsKLSAgICAgICAgICAgIHN0YXRlLT5ubGVuID0gQklUUyg1KSArIDI1NzsKLSAgICAgICAgICAgIERST1BCSVRTKDUpOwotICAgICAgICAgICAgc3RhdGUtPm5kaXN0ID0gQklUUyg1KSArIDE7Ci0gICAgICAgICAgICBEUk9QQklUUyg1KTsKLSAgICAgICAgICAgIHN0YXRlLT5uY29kZSA9IEJJVFMoNCkgKyA0OwotICAgICAgICAgICAgRFJPUEJJVFMoNCk7Ci0jaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5ECi0gICAgICAgICAgICBpZiAoc3RhdGUtPm5sZW4gPiAyODYgfHwgc3RhdGUtPm5kaXN0ID4gMzApIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ0b28gbWFueSBsZW5ndGggb3IgZGlzdGFuY2Ugc3ltYm9scyI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgdGFibGUgc2l6ZXMgb2tcbiIpKTsKLQotICAgICAgICAgICAgLyogZ2V0IGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAobm90IGEgdHlwbykgKi8KLSAgICAgICAgICAgIHN0YXRlLT5oYXZlID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IHN0YXRlLT5uY29kZSkgewotICAgICAgICAgICAgICAgIE5FRURCSVRTKDMpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW29yZGVyW3N0YXRlLT5oYXZlKytdXSA9ICh1bnNpZ25lZCBzaG9ydClCSVRTKDMpOwotICAgICAgICAgICAgICAgIERST1BCSVRTKDMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgMTkpCi0gICAgICAgICAgICAgICAgc3RhdGUtPmxlbnNbb3JkZXJbc3RhdGUtPmhhdmUrK11dID0gMDsKLSAgICAgICAgICAgIHN0YXRlLT5uZXh0ID0gc3RhdGUtPmNvZGVzOwotICAgICAgICAgICAgc3RhdGUtPmxlbmNvZGUgPSAoY29kZSBjb25zdCBGQVIgKikoc3RhdGUtPm5leHQpOwotICAgICAgICAgICAgc3RhdGUtPmxlbmJpdHMgPSA3OwotICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShDT0RFUywgc3RhdGUtPmxlbnMsIDE5LCAmKHN0YXRlLT5uZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bGVuYml0cyksIHN0YXRlLT53b3JrKTsKLSAgICAgICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQiOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBjb2RlIGxlbmd0aHMgb2tcbiIpKTsKLQotICAgICAgICAgICAgLyogZ2V0IGxlbmd0aCBhbmQgZGlzdGFuY2UgY29kZSBjb2RlIGxlbmd0aHMgKi8KLSAgICAgICAgICAgIHN0YXRlLT5oYXZlID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IHN0YXRlLT5ubGVuICsgc3RhdGUtPm5kaXN0KSB7Ci0gICAgICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUtPmxlbmNvZGVbQklUUyhzdGF0ZS0+bGVuYml0cyldOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaGVyZS52YWwgPCAxNikgewotICAgICAgICAgICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOwotICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSsrXSA9IGhlcmUudmFsOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhlcmUudmFsID09IDE2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyhoZXJlLmJpdHMgKyAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmhhdmUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgYml0IGxlbmd0aCByZXBlYXQiOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gKHVuc2lnbmVkKShzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSAtIDFdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgPSAzICsgQklUUygyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhlcmUudmFsID09IDE3KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyhoZXJlLmJpdHMgKyAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBORUVEQklUUyhoZXJlLmJpdHMgKyA3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDExICsgQklUUyg3KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIERST1BCSVRTKDcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSArIGNvcHkgPiBzdGF0ZS0+bmxlbiArIHN0YXRlLT5uZGlzdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb3B5LS0pCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSsrXSA9ICh1bnNpZ25lZCBzaG9ydClsZW47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBoYW5kbGUgZXJyb3IgYnJlYWtzIGluIHdoaWxlICovCi0gICAgICAgICAgICBpZiAoc3RhdGUtPm1vZGUgPT0gQkFEKSBicmVhazsKLQotICAgICAgICAgICAgLyogY2hlY2sgZm9yIGVuZC1vZi1ibG9jayBjb2RlIChiZXR0ZXIgaGF2ZSBvbmUpICovCi0gICAgICAgICAgICBpZiAoc3RhdGUtPmxlbnNbMjU2XSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrIjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgLS0gbm90ZTogZG8gbm90IGNoYW5nZSB0aGUgbGVuYml0cyBvciBkaXN0Yml0cwotICAgICAgICAgICAgICAgdmFsdWVzIGhlcmUgKDkgYW5kIDYpIHdpdGhvdXQgcmVhZGluZyB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaAotICAgICAgICAgICAgICAgY29uY2VybmluZyB0aGUgRU5PVUdIIGNvbnN0YW50cywgd2hpY2ggZGVwZW5kIG9uIHRob3NlIHZhbHVlcyAqLwotICAgICAgICAgICAgc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7Ci0gICAgICAgICAgICBzdGF0ZS0+bGVuY29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7Ci0gICAgICAgICAgICBzdGF0ZS0+bGVuYml0cyA9IDk7Ci0gICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKExFTlMsIHN0YXRlLT5sZW5zLCBzdGF0ZS0+bmxlbiwgJihzdGF0ZS0+bmV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPmxlbmJpdHMpLCBzdGF0ZS0+d29yayk7Ci0gICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0IjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXRlLT5kaXN0Y29kZSA9IChjb2RlIGNvbnN0IEZBUiAqKShzdGF0ZS0+bmV4dCk7Ci0gICAgICAgICAgICBzdGF0ZS0+ZGlzdGJpdHMgPSA2OwotICAgICAgICAgICAgcmV0ID0gaW5mbGF0ZV90YWJsZShESVNUUywgc3RhdGUtPmxlbnMgKyBzdGF0ZS0+bmxlbiwgc3RhdGUtPm5kaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPm5leHQpLCAmKHN0YXRlLT5kaXN0Yml0cyksIHN0YXRlLT53b3JrKTsKLSAgICAgICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlcyBzZXQiOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICBjb2RlcyBva1xuIikpOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU47Ci0KLSAgICAgICAgY2FzZSBMRU46Ci0gICAgICAgICAgICAvKiB1c2UgaW5mbGF0ZV9mYXN0KCkgaWYgd2UgaGF2ZSBlbm91Z2ggaW5wdXQgYW5kIG91dHB1dCAqLwotICAgICAgICAgICAgaWYgKGhhdmUgPj0gNiAmJiBsZWZ0ID49IDI1OCkgewotICAgICAgICAgICAgICAgIFJFU1RPUkUoKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPndoYXZlIDwgc3RhdGUtPndzaXplKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+d2hhdmUgPSBzdGF0ZS0+d3NpemUgLSBsZWZ0OwotICAgICAgICAgICAgICAgIGluZmxhdGVfZmFzdChzdHJtLCBzdGF0ZS0+d3NpemUpOwotICAgICAgICAgICAgICAgIExPQUQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogZ2V0IGEgbGl0ZXJhbCwgbGVuZ3RoLCBvciBlbmQtb2YtYmxvY2sgY29kZSAqLwotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+bGVuY29kZVtCSVRTKHN0YXRlLT5sZW5iaXRzKV07Ci0gICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkoaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKLSAgICAgICAgICAgICAgICBQVUxMQllURSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGhlcmUub3AgJiYgKGhlcmUub3AgJiAweGYwKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbGFzdCA9IGhlcmU7Ci0gICAgICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUtPmxlbmNvZGVbbGFzdC52YWwgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApID4+IGxhc3QuYml0cyldOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShsYXN0LmJpdHMgKyBoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBEUk9QQklUUyhsYXN0LmJpdHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKLSAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPSAodW5zaWduZWQpaGVyZS52YWw7Ci0KLSAgICAgICAgICAgIC8qIHByb2Nlc3MgbGl0ZXJhbCAqLwotICAgICAgICAgICAgaWYgKGhlcmUub3AgPT0gMCkgewotICAgICAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgaGVyZS52YWwgPj0gMHgyMCAmJiBoZXJlLnZhbCA8IDB4N2YgPwotICAgICAgICAgICAgICAgICAgICAgICAgImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAnJWMnXG4iIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgMHglMDJ4XG4iLCBoZXJlLnZhbCkpOwotICAgICAgICAgICAgICAgIFJPT00oKTsKLSAgICAgICAgICAgICAgICAqcHV0KysgPSAodW5zaWduZWQgY2hhcikoc3RhdGUtPmxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgbGVmdC0tOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBwcm9jZXNzIGVuZCBvZiBibG9jayAqLwotICAgICAgICAgICAgaWYgKGhlcmUub3AgJiAzMikgewotICAgICAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXG4iKSk7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBpbnZhbGlkIGNvZGUgKi8KLSAgICAgICAgICAgIGlmIChoZXJlLm9wICYgNjQpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBsZW5ndGggY29kZSAtLSBnZXQgZXh0cmEgYml0cywgaWYgYW55ICovCi0gICAgICAgICAgICBzdGF0ZS0+ZXh0cmEgPSAodW5zaWduZWQpKGhlcmUub3ApICYgMTU7Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPmV4dHJhICE9IDApIHsKLSAgICAgICAgICAgICAgICBORUVEQklUUyhzdGF0ZS0+ZXh0cmEpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggKz0gQklUUyhzdGF0ZS0+ZXh0cmEpOwotICAgICAgICAgICAgICAgIERST1BCSVRTKHN0YXRlLT5leHRyYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxuIiwgc3RhdGUtPmxlbmd0aCkpOwotCi0gICAgICAgICAgICAvKiBnZXQgZGlzdGFuY2UgY29kZSAqLwotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+ZGlzdGNvZGVbQklUUyhzdGF0ZS0+ZGlzdGJpdHMpXTsKLSAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOwotICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGhlcmUub3AgJiAweGYwKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbGFzdCA9IGhlcmU7Ci0gICAgICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUtPmRpc3Rjb2RlW2xhc3QudmFsICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSA+PiBsYXN0LmJpdHMpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkobGFzdC5iaXRzICsgaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRFJPUEJJVFMobGFzdC5iaXRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7Ci0gICAgICAgICAgICBpZiAoaGVyZS5vcCAmIDY0KSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSBjb2RlIjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXRlLT5vZmZzZXQgPSAodW5zaWduZWQpaGVyZS52YWw7Ci0KLSAgICAgICAgICAgIC8qIGdldCBkaXN0YW5jZSBleHRyYSBiaXRzLCBpZiBhbnkgKi8KLSAgICAgICAgICAgIHN0YXRlLT5leHRyYSA9ICh1bnNpZ25lZCkoaGVyZS5vcCkgJiAxNTsKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+ZXh0cmEgIT0gMCkgewotICAgICAgICAgICAgICAgIE5FRURCSVRTKHN0YXRlLT5leHRyYSk7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm9mZnNldCArPSBCSVRTKHN0YXRlLT5leHRyYSk7Ci0gICAgICAgICAgICAgICAgRFJPUEJJVFMoc3RhdGUtPmV4dHJhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0ZS0+b2Zmc2V0ID4gc3RhdGUtPndzaXplIC0gKHN0YXRlLT53aGF2ZSA8IHN0YXRlLT53c2l6ZSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IDogMCkpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XG4iLCBzdGF0ZS0+b2Zmc2V0KSk7Ci0KLSAgICAgICAgICAgIC8qIGNvcHkgbWF0Y2ggZnJvbSB3aW5kb3cgdG8gb3V0cHV0ICovCi0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgUk9PTSgpOwotICAgICAgICAgICAgICAgIGNvcHkgPSBzdGF0ZS0+d3NpemUgLSBzdGF0ZS0+b2Zmc2V0OwotICAgICAgICAgICAgICAgIGlmIChjb3B5IDwgbGVmdCkgewotICAgICAgICAgICAgICAgICAgICBmcm9tID0gcHV0ICsgY29weTsKLSAgICAgICAgICAgICAgICAgICAgY29weSA9IGxlZnQgLSBjb3B5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZnJvbSA9IHB1dCAtIHN0YXRlLT5vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvcHkgPSBsZWZ0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY29weSA+IHN0YXRlLT5sZW5ndGgpIGNvcHkgPSBzdGF0ZS0+bGVuZ3RoOwotICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggLT0gY29weTsKLSAgICAgICAgICAgICAgICBsZWZ0IC09IGNvcHk7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICAqcHV0KysgPSAqZnJvbSsrOwotICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tY29weSk7Ci0gICAgICAgICAgICB9IHdoaWxlIChzdGF0ZS0+bGVuZ3RoICE9IDApOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBET05FOgotICAgICAgICAgICAgLyogaW5mbGF0ZSBzdHJlYW0gdGVybWluYXRlZCBwcm9wZXJseSAtLSB3cml0ZSBsZWZ0b3ZlciBvdXRwdXQgKi8KLSAgICAgICAgICAgIHJldCA9IFpfU1RSRUFNX0VORDsKLSAgICAgICAgICAgIGlmIChsZWZ0IDwgc3RhdGUtPndzaXplKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG91dChvdXRfZGVzYywgc3RhdGUtPndpbmRvdywgc3RhdGUtPndzaXplIC0gbGVmdCkpCi0gICAgICAgICAgICAgICAgICAgIHJldCA9IFpfQlVGX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7Ci0KLSAgICAgICAgY2FzZSBCQUQ6Ci0gICAgICAgICAgICByZXQgPSBaX0RBVEFfRVJST1I7Ci0gICAgICAgICAgICBnb3RvIGluZl9sZWF2ZTsKLQotICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAvKiBjYW4ndCBoYXBwZW4sIGJ1dCBtYWtlcyBjb21waWxlcnMgaGFwcHkgKi8KLSAgICAgICAgICAgIHJldCA9IFpfU1RSRUFNX0VSUk9SOwotICAgICAgICAgICAgZ290byBpbmZfbGVhdmU7Ci0gICAgICAgIH0KLQotICAgIC8qIFJldHVybiB1bnVzZWQgaW5wdXQgKi8KLSAgaW5mX2xlYXZlOgotICAgIHN0cm0tPm5leHRfaW4gPSBuZXh0OwotICAgIHN0cm0tPmF2YWlsX2luID0gaGF2ZTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1pbnQgWkVYUE9SVCBpbmZsYXRlQmFja0VuZCgKLXpfc3RyZWFtcCBzdHJtKQotewotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwgfHwgc3RybS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgWkZSRUUoc3RybSwgc3RybS0+c3RhdGUpOwotICAgIHN0cm0tPnN0YXRlID0gWl9OVUxMOwotICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogZW5kXG4iKSk7Ci0gICAgcmV0dXJuIFpfT0s7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS96bGliX3YxMjgvaW5mZmFzdC5jIGIvdGhpcmRfcGFydHkvemxpYl92MTI4L2luZmZhc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZjZmZhZS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS96bGliX3YxMjgvaW5mZmFzdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8qIGluZmZhc3QuYyAtLSBmYXN0IGRlY29kaW5nCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwOCwgMjAxMCwgMjAxMyBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotI2luY2x1ZGUgInp1dGlsLmgiCi0jaW5jbHVkZSAiaW5mdHJlZXMuaCIKLSNpbmNsdWRlICJpbmZsYXRlLmgiCi0jaW5jbHVkZSAiaW5mZmFzdC5oIgotCi0jaWZuZGVmIEFTTUlORgotCi0vKiBBbGxvdyBtYWNoaW5lIGRlcGVuZGVudCBvcHRpbWl6YXRpb24gZm9yIHBvc3QtaW5jcmVtZW50IG9yIHByZS1pbmNyZW1lbnQuCi0gICBCYXNlZCBvbiB0ZXN0aW5nIHRvIGRhdGUsCi0gICBQcmUtaW5jcmVtZW50IHByZWZlcnJlZCBmb3I6Ci0gICAtIFBvd2VyUEMgRzMgKEFkbGVyKQotICAgLSBNSVBTIFI1MDAwIChSYW5kZXJzLVBlaHJzb24pCi0gICBQb3N0LWluY3JlbWVudCBwcmVmZXJyZWQgZm9yOgotICAgLSBub25lCi0gICBObyBtZWFzdXJhYmxlIGRpZmZlcmVuY2U6Ci0gICAtIFBlbnRpdW0gSUlJIChBbmRlcnNvbikKLSAgIC0gTTY4MDYwIChOaWtsKQotICovCi0jaWZkZWYgUE9TVElOQwotIyAgZGVmaW5lIE9GRiAwCi0jICBkZWZpbmUgUFVQKGEpICooYSkrKwotI2Vsc2UKLSMgIGRlZmluZSBPRkYgMQotIyAgZGVmaW5lIFBVUChhKSAqKysoYSkKLSNlbmRpZgotCi0vKgotICAgRGVjb2RlIGxpdGVyYWwsIGxlbmd0aCwgYW5kIGRpc3RhbmNlIGNvZGVzIGFuZCB3cml0ZSBvdXQgdGhlIHJlc3VsdGluZwotICAgbGl0ZXJhbCBhbmQgbWF0Y2ggYnl0ZXMgdW50aWwgZWl0aGVyIG5vdCBlbm91Z2ggaW5wdXQgb3Igb3V0cHV0IGlzCi0gICBhdmFpbGFibGUsIGFuIGVuZC1vZi1ibG9jayBpcyBlbmNvdW50ZXJlZCwgb3IgYSBkYXRhIGVycm9yIGlzIGVuY291bnRlcmVkLgotICAgV2hlbiBsYXJnZSBlbm91Z2ggaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBzdXBwbGllZCB0byBpbmZsYXRlKCksIGZvcgotICAgZXhhbXBsZSwgYSAxNksgaW5wdXQgYnVmZmVyIGFuZCBhIDY0SyBvdXRwdXQgYnVmZmVyLCBtb3JlIHRoYW4gOTUlIG9mIHRoZQotICAgaW5mbGF0ZSBleGVjdXRpb24gdGltZSBpcyBzcGVudCBpbiB0aGlzIHJvdXRpbmUuCi0KLSAgIEVudHJ5IGFzc3VtcHRpb25zOgotCi0gICAgICAgIHN0YXRlLT5tb2RlID09IExFTgotICAgICAgICBzdHJtLT5hdmFpbF9pbiA+PSA2Ci0gICAgICAgIHN0cm0tPmF2YWlsX291dCA+PSAyNTgKLSAgICAgICAgc3RhcnQgPj0gc3RybS0+YXZhaWxfb3V0Ci0gICAgICAgIHN0YXRlLT5iaXRzIDwgOAotCi0gICBPbiByZXR1cm4sIHN0YXRlLT5tb2RlIGlzIG9uZSBvZjoKLQotICAgICAgICBMRU4gLS0gcmFuIG91dCBvZiBlbm91Z2ggb3V0cHV0IHNwYWNlIG9yIGVub3VnaCBhdmFpbGFibGUgaW5wdXQKLSAgICAgICAgVFlQRSAtLSByZWFjaGVkIGVuZCBvZiBibG9jayBjb2RlLCBpbmZsYXRlKCkgdG8gaW50ZXJwcmV0IG5leHQgYmxvY2sKLSAgICAgICAgQkFEIC0tIGVycm9yIGluIGJsb2NrIGRhdGEKLQotICAgTm90ZXM6Ci0KLSAgICAtIFRoZSBtYXhpbXVtIGlucHV0IGJpdHMgdXNlZCBieSBhIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIDE1IGJpdHMgZm9yIHRoZQotICAgICAgbGVuZ3RoIGNvZGUsIDUgYml0cyBmb3IgdGhlIGxlbmd0aCBleHRyYSwgMTUgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGNvZGUsCi0gICAgICBhbmQgMTMgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGV4dHJhLiAgVGhpcyB0b3RhbHMgNDggYml0cywgb3Igc2l4IGJ5dGVzLgotICAgICAgVGhlcmVmb3JlIGlmIHN0cm0tPmF2YWlsX2luID49IDYsIHRoZW4gdGhlcmUgaXMgZW5vdWdoIGlucHV0IHRvIGF2b2lkCi0gICAgICBjaGVja2luZyBmb3IgYXZhaWxhYmxlIGlucHV0IHdoaWxlIGRlY29kaW5nLgotCi0gICAgLSBUaGUgbWF4aW11bSBieXRlcyB0aGF0IGEgc2luZ2xlIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGNhbiBvdXRwdXQgaXMgMjU4Ci0gICAgICBieXRlcywgd2hpY2ggaXMgdGhlIG1heGltdW0gbGVuZ3RoIHRoYXQgY2FuIGJlIGNvZGVkLiAgaW5mbGF0ZV9mYXN0KCkKLSAgICAgIHJlcXVpcmVzIHN0cm0tPmF2YWlsX291dCA+PSAyNTggZm9yIGVhY2ggbG9vcCB0byBhdm9pZCBjaGVja2luZyBmb3IKLSAgICAgIG91dHB1dCBzcGFjZS4KLSAqLwotdm9pZCBaTElCX0lOVEVSTkFMIGluZmxhdGVfZmFzdCgKLXpfc3RyZWFtcCBzdHJtLAotdW5zaWduZWQgc3RhcnQpICAgICAgICAgLyogaW5mbGF0ZSgpJ3Mgc3RhcnRpbmcgdmFsdWUgZm9yIHN0cm0tPmF2YWlsX291dCAqLwotewotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Ci0gICAgel9jb25zdCB1bnNpZ25lZCBjaGFyIEZBUiAqaW47ICAgICAgLyogbG9jYWwgc3RybS0+bmV4dF9pbiAqLwotICAgIHpfY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKmxhc3Q7ICAgIC8qIGhhdmUgZW5vdWdoIGlucHV0IHdoaWxlIGluIDwgbGFzdCAqLwotICAgIHVuc2lnbmVkIGNoYXIgRkFSICpvdXQ7ICAgICAvKiBsb2NhbCBzdHJtLT5uZXh0X291dCAqLwotICAgIHVuc2lnbmVkIGNoYXIgRkFSICpiZWc7ICAgICAvKiBpbmZsYXRlKCkncyBpbml0aWFsIHN0cm0tPm5leHRfb3V0ICovCi0gICAgdW5zaWduZWQgY2hhciBGQVIgKmVuZDsgICAgIC8qIHdoaWxlIG91dCA8IGVuZCwgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSAqLwotI2lmZGVmIElORkxBVEVfU1RSSUNUCi0gICAgdW5zaWduZWQgZG1heDsgICAgICAgICAgICAgIC8qIG1heGltdW0gZGlzdGFuY2UgZnJvbSB6bGliIGhlYWRlciAqLwotI2VuZGlmCi0gICAgdW5zaWduZWQgd3NpemU7ICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqLwotICAgIHVuc2lnbmVkIHdoYXZlOyAgICAgICAgICAgICAvKiB2YWxpZCBieXRlcyBpbiB0aGUgd2luZG93ICovCi0gICAgdW5zaWduZWQgd25leHQ7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqLwotICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3c7ICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIHdzaXplICE9IDAgKi8KLSAgICB1bnNpZ25lZCBsb25nIGhvbGQ7ICAgICAgICAgLyogbG9jYWwgc3RybS0+aG9sZCAqLwotICAgIHVuc2lnbmVkIGJpdHM7ICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLT5iaXRzICovCi0gICAgY29kZSBjb25zdCBGQVIgKmxjb2RlOyAgICAgIC8qIGxvY2FsIHN0cm0tPmxlbmNvZGUgKi8KLSAgICBjb2RlIGNvbnN0IEZBUiAqZGNvZGU7ICAgICAgLyogbG9jYWwgc3RybS0+ZGlzdGNvZGUgKi8KLSAgICB1bnNpZ25lZCBsbWFzazsgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgbGVuZ3RoIGNvZGVzICovCi0gICAgdW5zaWduZWQgZG1hc2s7ICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGRpc3RhbmNlIGNvZGVzICovCi0gICAgY29kZSBoZXJlOyAgICAgICAgICAgICAgICAgIC8qIHJldHJpZXZlZCB0YWJsZSBlbnRyeSAqLwotICAgIHVuc2lnbmVkIG9wOyAgICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMsIG9wZXJhdGlvbiwgZXh0cmEgYml0cywgb3IgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIHdpbmRvdyBwb3NpdGlvbiwgd2luZG93IGJ5dGVzIHRvIGNvcHkgKi8KLSAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoLCB1bnVzZWQgYnl0ZXMgKi8KLSAgICB1bnNpZ25lZCBkaXN0OyAgICAgICAgICAgICAgLyogbWF0Y2ggZGlzdGFuY2UgKi8KLSAgICB1bnNpZ25lZCBjaGFyIEZBUiAqZnJvbTsgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBmcm9tICovCi0KLSAgICAvKiBjb3B5IHN0YXRlIHRvIGxvY2FsIHZhcmlhYmxlcyAqLwotICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOwotICAgIGluID0gc3RybS0+bmV4dF9pbiAtIE9GRjsKLSAgICBsYXN0ID0gaW4gKyAoc3RybS0+YXZhaWxfaW4gLSA1KTsKLSAgICBvdXQgPSBzdHJtLT5uZXh0X291dCAtIE9GRjsKLSAgICBiZWcgPSBvdXQgLSAoc3RhcnQgLSBzdHJtLT5hdmFpbF9vdXQpOwotICAgIGVuZCA9IG91dCArIChzdHJtLT5hdmFpbF9vdXQgLSAyNTcpOwotI2lmZGVmIElORkxBVEVfU1RSSUNUCi0gICAgZG1heCA9IHN0YXRlLT5kbWF4OwotI2VuZGlmCi0gICAgd3NpemUgPSBzdGF0ZS0+d3NpemU7Ci0gICAgd2hhdmUgPSBzdGF0ZS0+d2hhdmU7Ci0gICAgd25leHQgPSBzdGF0ZS0+d25leHQ7Ci0gICAgd2luZG93ID0gc3RhdGUtPndpbmRvdzsKLSAgICBob2xkID0gc3RhdGUtPmhvbGQ7Ci0gICAgYml0cyA9IHN0YXRlLT5iaXRzOwotICAgIGxjb2RlID0gc3RhdGUtPmxlbmNvZGU7Ci0gICAgZGNvZGUgPSBzdGF0ZS0+ZGlzdGNvZGU7Ci0gICAgbG1hc2sgPSAoMVUgPDwgc3RhdGUtPmxlbmJpdHMpIC0gMTsKLSAgICBkbWFzayA9ICgxVSA8PCBzdGF0ZS0+ZGlzdGJpdHMpIC0gMTsKLQotICAgIC8qIGRlY29kZSBsaXRlcmFscyBhbmQgbGVuZ3RoL2Rpc3RhbmNlcyB1bnRpbCBlbmQtb2YtYmxvY2sgb3Igbm90IGVub3VnaAotICAgICAgIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlICovCi0gICAgZG8gewotICAgICAgICBpZiAoYml0cyA8IDE1KSB7Ci0gICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOwotICAgICAgICAgICAgYml0cyArPSA4OwotICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKLSAgICAgICAgICAgIGJpdHMgKz0gODsKLSAgICAgICAgfQotICAgICAgICBoZXJlID0gbGNvZGVbaG9sZCAmIGxtYXNrXTsKLSAgICAgIGRvbGVuOgotICAgICAgICBvcCA9ICh1bnNpZ25lZCkoaGVyZS5iaXRzKTsKLSAgICAgICAgaG9sZCA+Pj0gb3A7Ci0gICAgICAgIGJpdHMgLT0gb3A7Ci0gICAgICAgIG9wID0gKHVuc2lnbmVkKShoZXJlLm9wKTsKLSAgICAgICAgaWYgKG9wID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgKi8KLSAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgaGVyZS52YWwgPj0gMHgyMCAmJiBoZXJlLnZhbCA8IDB4N2YgPwotICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcbiIgOgotICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxuIiwgaGVyZS52YWwpKTsKLSAgICAgICAgICAgIFBVUChvdXQpID0gKHVuc2lnbmVkIGNoYXIpKGhlcmUudmFsKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgLyogbGVuZ3RoIGJhc2UgKi8KLSAgICAgICAgICAgIGxlbiA9ICh1bnNpZ25lZCkoaGVyZS52YWwpOwotICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi8KLSAgICAgICAgICAgIGlmIChvcCkgewotICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKLSAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsZW4gKz0gKHVuc2lnbmVkKWhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpOwotICAgICAgICAgICAgICAgIGhvbGQgPj49IG9wOwotICAgICAgICAgICAgICAgIGJpdHMgLT0gb3A7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGxlbmd0aCAldVxuIiwgbGVuKSk7Ci0gICAgICAgICAgICBpZiAoYml0cyA8IDE1KSB7Ci0gICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKLSAgICAgICAgICAgICAgICBiaXRzICs9IDg7Ci0gICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKLSAgICAgICAgICAgICAgICBiaXRzICs9IDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBoZXJlID0gZGNvZGVbaG9sZCAmIGRtYXNrXTsKLSAgICAgICAgICBkb2Rpc3Q6Ci0gICAgICAgICAgICBvcCA9ICh1bnNpZ25lZCkoaGVyZS5iaXRzKTsKLSAgICAgICAgICAgIGhvbGQgPj49IG9wOwotICAgICAgICAgICAgYml0cyAtPSBvcDsKLSAgICAgICAgICAgIG9wID0gKHVuc2lnbmVkKShoZXJlLm9wKTsKLSAgICAgICAgICAgIGlmIChvcCAmIDE2KSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhc2UgKi8KLSAgICAgICAgICAgICAgICBkaXN0ID0gKHVuc2lnbmVkKShoZXJlLnZhbCk7Ci0gICAgICAgICAgICAgICAgb3AgJj0gMTU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyAqLwotICAgICAgICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgaG9sZCArPSAodW5zaWduZWQgbG9uZykoUFVQKGluKSkgPDwgYml0czsKLSAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwotICAgICAgICAgICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBob2xkICs9ICh1bnNpZ25lZCBsb25nKShQVVAoaW4pKSA8PCBiaXRzOwotICAgICAgICAgICAgICAgICAgICAgICAgYml0cyArPSA4OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRpc3QgKz0gKHVuc2lnbmVkKWhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpOwotI2lmZGVmIElORkxBVEVfU1RSSUNUCi0gICAgICAgICAgICAgICAgaWYgKGRpc3QgPiBkbWF4KSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgIGhvbGQgPj49IG9wOwotICAgICAgICAgICAgICAgIGJpdHMgLT0gb3A7Ci0gICAgICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxuIiwgZGlzdCkpOwotICAgICAgICAgICAgICAgIG9wID0gKHVuc2lnbmVkKShvdXQgLSBiZWcpOyAgICAgLyogbWF4IGRpc3RhbmNlIGluIG91dHB1dCAqLwotICAgICAgICAgICAgICAgIGlmIChkaXN0ID4gb3ApIHsgICAgICAgICAgICAgICAgLyogc2VlIGlmIGNvcHkgZnJvbSB3aW5kb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgb3AgPSBkaXN0IC0gb3A7ICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJhY2sgaW4gd2luZG93ICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChvcCA+IHdoYXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPnNhbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0jaWZkZWYgSU5GTEFURV9BTExPV19JTlZBTElEX0RJU1RBTkNFX1RPT0ZBUl9BUlJSCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuIDw9IG9wIC0gd2hhdmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWxlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4gLT0gb3AgLSB3aGF2ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wID4gd2hhdmUpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tID0gb3V0IC0gZGlzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZyb20gPSB3aW5kb3cgLSBPRkY7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3bmV4dCA9PSAwKSB7ICAgICAgICAgICAvKiB2ZXJ5IGNvbW1vbiBjYXNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHdzaXplIC0gb3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAod25leHQgPCBvcCkgeyAgICAgIC8qIHdyYXAgYXJvdW5kIHdpbmRvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSArIHduZXh0IC0gb3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvcCAtPSB3bmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSBlbmQgb2Ygd2luZG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IHdpbmRvdyAtIE9GRjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod25leHQgPCBsZW4pIHsgIC8qIHNvbWUgZnJvbSBzdGFydCBvZiB3aW5kb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AgPSB3bmV4dDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OyAgICAgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbnRpZ3VvdXMgaW4gd2luZG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBmcm9tICs9IHduZXh0IC0gb3A7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSA9IG91dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGxlbiA+IDIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOwotICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSAzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxlbiA+IDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZyb20gPSBvdXQgLSBkaXN0OyAgICAgICAgICAvKiBjb3B5IGRpcmVjdCBmcm9tIG91dHB1dCAqLwotICAgICAgICAgICAgICAgICAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgLyogbWluaW11bSBsZW5ndGggaXMgdGhyZWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFBVUChvdXQpID0gUFVQKGZyb20pOwotICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAtPSAzOwotICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChsZW4gPiAyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxlbikgewotICAgICAgICAgICAgICAgICAgICAgICAgUFVQKG91dCkgPSBQVVAoZnJvbSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVVAob3V0KSA9IFBVUChmcm9tKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PSAwKSB7ICAgICAgICAgIC8qIDJuZCBsZXZlbCBkaXN0YW5jZSBjb2RlICovCi0gICAgICAgICAgICAgICAgaGVyZSA9IGRjb2RlW2hlcmUudmFsICsgKGhvbGQgJiAoKDFVIDw8IG9wKSAtIDEpKV07Ci0gICAgICAgICAgICAgICAgZ290byBkb2Rpc3Q7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGRpc3RhbmNlIGNvZGUiOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChvcCAmIDY0KSA9PSAwKSB7ICAgICAgICAgICAgICAvKiAybmQgbGV2ZWwgbGVuZ3RoIGNvZGUgKi8KLSAgICAgICAgICAgIGhlcmUgPSBsY29kZVtoZXJlLnZhbCArIChob2xkICYgKCgxVSA8PCBvcCkgLSAxKSldOwotICAgICAgICAgICAgZ290byBkb2xlbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChvcCAmIDMyKSB7ICAgICAgICAgICAgICAgICAgICAgLyogZW5kLW9mLWJsb2NrICovCi0gICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xuIikpOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUiOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0gd2hpbGUgKGluIDwgbGFzdCAmJiBvdXQgPCBlbmQpOwotCi0gICAgLyogcmV0dXJuIHVudXNlZCBieXRlcyAob24gZW50cnksIGJpdHMgPCA4LCBzbyBpbiB3b24ndCBnbyB0b28gZmFyIGJhY2spICovCi0gICAgbGVuID0gYml0cyA+PiAzOwotICAgIGluIC09IGxlbjsKLSAgICBiaXRzIC09IGxlbiA8PCAzOwotICAgIGhvbGQgJj0gKDFVIDw8IGJpdHMpIC0gMTsKLQotICAgIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmV0dXJuICovCi0gICAgc3RybS0+bmV4dF9pbiA9IGluICsgT0ZGOwotICAgIHN0cm0tPm5leHRfb3V0ID0gb3V0ICsgT0ZGOwotICAgIHN0cm0tPmF2YWlsX2luID0gKHVuc2lnbmVkKShpbiA8IGxhc3QgPyA1ICsgKGxhc3QgLSBpbikgOiA1IC0gKGluIC0gbGFzdCkpOwotICAgIHN0cm0tPmF2YWlsX291dCA9ICh1bnNpZ25lZCkob3V0IDwgZW5kID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NyArIChlbmQgLSBvdXQpIDogMjU3IC0gKG91dCAtIGVuZCkpOwotICAgIHN0YXRlLT5ob2xkID0gaG9sZDsKLSAgICBzdGF0ZS0+Yml0cyA9IGJpdHM7Ci0gICAgcmV0dXJuOwotfQotCi0vKgotICAgaW5mbGF0ZV9mYXN0KCkgc3BlZWR1cHMgdGhhdCB0dXJuZWQgb3V0IHNsb3dlciAob24gYSBQb3dlclBDIEczIDc1MENYZSk6Ci0gICAtIFVzaW5nIGJpdCBmaWVsZHMgZm9yIGNvZGUgc3RydWN0dXJlCi0gICAtIERpZmZlcmVudCBvcCBkZWZpbml0aW9uIHRvIGF2b2lkICYgZm9yIGV4dHJhIGJpdHMgKGRvICYgZm9yIHRhYmxlIGJpdHMpCi0gICAtIFRocmVlIHNlcGFyYXRlIGRlY29kaW5nIGRvLWxvb3BzIGZvciBkaXJlY3QsIHdpbmRvdywgYW5kIHduZXh0ID09IDAKLSAgIC0gU3BlY2lhbCBjYXNlIGZvciBkaXN0YW5jZSA+IDEgY29waWVzIHRvIGRvIG92ZXJsYXBwZWQgbG9hZCBhbmQgc3RvcmUgY29weQotICAgLSBFeHBsaWNpdCBicmFuY2ggcHJlZGljdGlvbnMgKGJhc2VkIG9uIG1lYXN1cmVkIGJyYW5jaCBwcm9iYWJpbGl0aWVzKQotICAgLSBEZWZlcnJpbmcgbWF0Y2ggY29weSBhbmQgaW50ZXJzcGVyc2VkIGl0IHdpdGggZGVjb2Rpbmcgc3Vic2VxdWVudCBjb2RlcwotICAgLSBTd2FwcGluZyBsaXRlcmFsL2xlbmd0aCBlbHNlCi0gICAtIFN3YXBwaW5nIHdpbmRvdy9kaXJlY3QgZWxzZQotICAgLSBMYXJnZXIgdW5yb2xsZWQgY29weSBsb29wcyAodGhyZWUgaXMgYWJvdXQgcmlnaHQpCi0gICAtIE1vdmluZyBsZW4gLT0gMyBzdGF0ZW1lbnQgaW50byBtaWRkbGUgb2YgbG9vcAotICovCi0KLSNlbmRpZiAvKiAhQVNNSU5GICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS96bGliX3YxMjgvaW5mZmFzdC5oIGIvdGhpcmRfcGFydHkvemxpYl92MTI4L2luZmZhc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVjMWFhNC4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS96bGliX3YxMjgvaW5mZmFzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLyogaW5mZmFzdC5oIC0tIGhlYWRlciB0byB1c2UgaW5mZmFzdC5jCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAwMywgMjAxMCBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4gSXQgaXMKLSAgIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5IGFuZCBpcwotICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgotICovCi0KLXZvaWQgWkxJQl9JTlRFUk5BTCBpbmZsYXRlX2Zhc3QgT0YoKHpfc3RyZWFtcCBzdHJtLCB1bnNpZ25lZCBzdGFydCkpOwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvemxpYl92MTI4L2luZmZpeGVkLmggYi90aGlyZF9wYXJ0eS96bGliX3YxMjgvaW5mZml4ZWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYyODMyNy4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS96bGliX3YxMjgvaW5mZml4ZWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLSAgICAvKiBpbmZmaXhlZC5oIC0tIHRhYmxlIGZvciBkZWNvZGluZyBmaXhlZCBjb2RlcwotICAgICAqIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IG1ha2VmaXhlZCgpLgotICAgICAqLwotCi0gICAgLyogV0FSTklORzogdGhpcyBmaWxlIHNob3VsZCAqbm90KiBiZSB1c2VkIGJ5IGFwcGxpY2F0aW9ucy4KLSAgICAgICBJdCBpcyBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGxpYnJhcnkgYW5kIGlzCi0gICAgICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLgotICAgICAqLwotCi0gICAgc3RhdGljIGNvbnN0IGNvZGUgbGVuZml4WzUxMl0gPSB7Ci0gICAgICAgIHs5Niw3LDB9LHswLDgsODB9LHswLDgsMTZ9LHsyMCw4LDExNX0sezE4LDcsMzF9LHswLDgsMTEyfSx7MCw4LDQ4fSwKLSAgICAgICAgezAsOSwxOTJ9LHsxNiw3LDEwfSx7MCw4LDk2fSx7MCw4LDMyfSx7MCw5LDE2MH0sezAsOCwwfSx7MCw4LDEyOH0sCi0gICAgICAgIHswLDgsNjR9LHswLDksMjI0fSx7MTYsNyw2fSx7MCw4LDg4fSx7MCw4LDI0fSx7MCw5LDE0NH0sezE5LDcsNTl9LAotICAgICAgICB7MCw4LDEyMH0sezAsOCw1Nn0sezAsOSwyMDh9LHsxNyw3LDE3fSx7MCw4LDEwNH0sezAsOCw0MH0sezAsOSwxNzZ9LAotICAgICAgICB7MCw4LDh9LHswLDgsMTM2fSx7MCw4LDcyfSx7MCw5LDI0MH0sezE2LDcsNH0sezAsOCw4NH0sezAsOCwyMH0sCi0gICAgICAgIHsyMSw4LDIyN30sezE5LDcsNDN9LHswLDgsMTE2fSx7MCw4LDUyfSx7MCw5LDIwMH0sezE3LDcsMTN9LHswLDgsMTAwfSwKLSAgICAgICAgezAsOCwzNn0sezAsOSwxNjh9LHswLDgsNH0sezAsOCwxMzJ9LHswLDgsNjh9LHswLDksMjMyfSx7MTYsNyw4fSwKLSAgICAgICAgezAsOCw5Mn0sezAsOCwyOH0sezAsOSwxNTJ9LHsyMCw3LDgzfSx7MCw4LDEyNH0sezAsOCw2MH0sezAsOSwyMTZ9LAotICAgICAgICB7MTgsNywyM30sezAsOCwxMDh9LHswLDgsNDR9LHswLDksMTg0fSx7MCw4LDEyfSx7MCw4LDE0MH0sezAsOCw3Nn0sCi0gICAgICAgIHswLDksMjQ4fSx7MTYsNywzfSx7MCw4LDgyfSx7MCw4LDE4fSx7MjEsOCwxNjN9LHsxOSw3LDM1fSx7MCw4LDExNH0sCi0gICAgICAgIHswLDgsNTB9LHswLDksMTk2fSx7MTcsNywxMX0sezAsOCw5OH0sezAsOCwzNH0sezAsOSwxNjR9LHswLDgsMn0sCi0gICAgICAgIHswLDgsMTMwfSx7MCw4LDY2fSx7MCw5LDIyOH0sezE2LDcsN30sezAsOCw5MH0sezAsOCwyNn0sezAsOSwxNDh9LAotICAgICAgICB7MjAsNyw2N30sezAsOCwxMjJ9LHswLDgsNTh9LHswLDksMjEyfSx7MTgsNywxOX0sezAsOCwxMDZ9LHswLDgsNDJ9LAotICAgICAgICB7MCw5LDE4MH0sezAsOCwxMH0sezAsOCwxMzh9LHswLDgsNzR9LHswLDksMjQ0fSx7MTYsNyw1fSx7MCw4LDg2fSwKLSAgICAgICAgezAsOCwyMn0sezY0LDgsMH0sezE5LDcsNTF9LHswLDgsMTE4fSx7MCw4LDU0fSx7MCw5LDIwNH0sezE3LDcsMTV9LAotICAgICAgICB7MCw4LDEwMn0sezAsOCwzOH0sezAsOSwxNzJ9LHswLDgsNn0sezAsOCwxMzR9LHswLDgsNzB9LHswLDksMjM2fSwKLSAgICAgICAgezE2LDcsOX0sezAsOCw5NH0sezAsOCwzMH0sezAsOSwxNTZ9LHsyMCw3LDk5fSx7MCw4LDEyNn0sezAsOCw2Mn0sCi0gICAgICAgIHswLDksMjIwfSx7MTgsNywyN30sezAsOCwxMTB9LHswLDgsNDZ9LHswLDksMTg4fSx7MCw4LDE0fSx7MCw4LDE0Mn0sCi0gICAgICAgIHswLDgsNzh9LHswLDksMjUyfSx7OTYsNywwfSx7MCw4LDgxfSx7MCw4LDE3fSx7MjEsOCwxMzF9LHsxOCw3LDMxfSwKLSAgICAgICAgezAsOCwxMTN9LHswLDgsNDl9LHswLDksMTk0fSx7MTYsNywxMH0sezAsOCw5N30sezAsOCwzM30sezAsOSwxNjJ9LAotICAgICAgICB7MCw4LDF9LHswLDgsMTI5fSx7MCw4LDY1fSx7MCw5LDIyNn0sezE2LDcsNn0sezAsOCw4OX0sezAsOCwyNX0sCi0gICAgICAgIHswLDksMTQ2fSx7MTksNyw1OX0sezAsOCwxMjF9LHswLDgsNTd9LHswLDksMjEwfSx7MTcsNywxN30sezAsOCwxMDV9LAotICAgICAgICB7MCw4LDQxfSx7MCw5LDE3OH0sezAsOCw5fSx7MCw4LDEzN30sezAsOCw3M30sezAsOSwyNDJ9LHsxNiw3LDR9LAotICAgICAgICB7MCw4LDg1fSx7MCw4LDIxfSx7MTYsOCwyNTh9LHsxOSw3LDQzfSx7MCw4LDExN30sezAsOCw1M30sezAsOSwyMDJ9LAotICAgICAgICB7MTcsNywxM30sezAsOCwxMDF9LHswLDgsMzd9LHswLDksMTcwfSx7MCw4LDV9LHswLDgsMTMzfSx7MCw4LDY5fSwKLSAgICAgICAgezAsOSwyMzR9LHsxNiw3LDh9LHswLDgsOTN9LHswLDgsMjl9LHswLDksMTU0fSx7MjAsNyw4M30sezAsOCwxMjV9LAotICAgICAgICB7MCw4LDYxfSx7MCw5LDIxOH0sezE4LDcsMjN9LHswLDgsMTA5fSx7MCw4LDQ1fSx7MCw5LDE4Nn0sezAsOCwxM30sCi0gICAgICAgIHswLDgsMTQxfSx7MCw4LDc3fSx7MCw5LDI1MH0sezE2LDcsM30sezAsOCw4M30sezAsOCwxOX0sezIxLDgsMTk1fSwKLSAgICAgICAgezE5LDcsMzV9LHswLDgsMTE1fSx7MCw4LDUxfSx7MCw5LDE5OH0sezE3LDcsMTF9LHswLDgsOTl9LHswLDgsMzV9LAotICAgICAgICB7MCw5LDE2Nn0sezAsOCwzfSx7MCw4LDEzMX0sezAsOCw2N30sezAsOSwyMzB9LHsxNiw3LDd9LHswLDgsOTF9LAotICAgICAgICB7MCw4LDI3fSx7MCw5LDE1MH0sezIwLDcsNjd9LHswLDgsMTIzfSx7MCw4LDU5fSx7MCw5LDIxNH0sezE4LDcsMTl9LAotICAgICAgICB7MCw4LDEwN30sezAsOCw0M30sezAsOSwxODJ9LHswLDgsMTF9LHswLDgsMTM5fSx7MCw4LDc1fSx7MCw5LDI0Nn0sCi0gICAgICAgIHsxNiw3LDV9LHswLDgsODd9LHswLDgsMjN9LHs2NCw4LDB9LHsxOSw3LDUxfSx7MCw4LDExOX0sezAsOCw1NX0sCi0gICAgICAgIHswLDksMjA2fSx7MTcsNywxNX0sezAsOCwxMDN9LHswLDgsMzl9LHswLDksMTc0fSx7MCw4LDd9LHswLDgsMTM1fSwKLSAgICAgICAgezAsOCw3MX0sezAsOSwyMzh9LHsxNiw3LDl9LHswLDgsOTV9LHswLDgsMzF9LHswLDksMTU4fSx7MjAsNyw5OX0sCi0gICAgICAgIHswLDgsMTI3fSx7MCw4LDYzfSx7MCw5LDIyMn0sezE4LDcsMjd9LHswLDgsMTExfSx7MCw4LDQ3fSx7MCw5LDE5MH0sCi0gICAgICAgIHswLDgsMTV9LHswLDgsMTQzfSx7MCw4LDc5fSx7MCw5LDI1NH0sezk2LDcsMH0sezAsOCw4MH0sezAsOCwxNn0sCi0gICAgICAgIHsyMCw4LDExNX0sezE4LDcsMzF9LHswLDgsMTEyfSx7MCw4LDQ4fSx7MCw5LDE5M30sezE2LDcsMTB9LHswLDgsOTZ9LAotICAgICAgICB7MCw4LDMyfSx7MCw5LDE2MX0sezAsOCwwfSx7MCw4LDEyOH0sezAsOCw2NH0sezAsOSwyMjV9LHsxNiw3LDZ9LAotICAgICAgICB7MCw4LDg4fSx7MCw4LDI0fSx7MCw5LDE0NX0sezE5LDcsNTl9LHswLDgsMTIwfSx7MCw4LDU2fSx7MCw5LDIwOX0sCi0gICAgICAgIHsxNyw3LDE3fSx7MCw4LDEwNH0sezAsOCw0MH0sezAsOSwxNzd9LHswLDgsOH0sezAsOCwxMzZ9LHswLDgsNzJ9LAotICAgICAgICB7MCw5LDI0MX0sezE2LDcsNH0sezAsOCw4NH0sezAsOCwyMH0sezIxLDgsMjI3fSx7MTksNyw0M30sezAsOCwxMTZ9LAotICAgICAgICB7MCw4LDUyfSx7MCw5LDIwMX0sezE3LDcsMTN9LHswLDgsMTAwfSx7MCw4LDM2fSx7MCw5LDE2OX0sezAsOCw0fSwKLSAgICAgICAgezAsOCwxMzJ9LHswLDgsNjh9LHswLDksMjMzfSx7MTYsNyw4fSx7MCw4LDkyfSx7MCw4LDI4fSx7MCw5LDE1M30sCi0gICAgICAgIHsyMCw3LDgzfSx7MCw4LDEyNH0sezAsOCw2MH0sezAsOSwyMTd9LHsxOCw3LDIzfSx7MCw4LDEwOH0sezAsOCw0NH0sCi0gICAgICAgIHswLDksMTg1fSx7MCw4LDEyfSx7MCw4LDE0MH0sezAsOCw3Nn0sezAsOSwyNDl9LHsxNiw3LDN9LHswLDgsODJ9LAotICAgICAgICB7MCw4LDE4fSx7MjEsOCwxNjN9LHsxOSw3LDM1fSx7MCw4LDExNH0sezAsOCw1MH0sezAsOSwxOTd9LHsxNyw3LDExfSwKLSAgICAgICAgezAsOCw5OH0sezAsOCwzNH0sezAsOSwxNjV9LHswLDgsMn0sezAsOCwxMzB9LHswLDgsNjZ9LHswLDksMjI5fSwKLSAgICAgICAgezE2LDcsN30sezAsOCw5MH0sezAsOCwyNn0sezAsOSwxNDl9LHsyMCw3LDY3fSx7MCw4LDEyMn0sezAsOCw1OH0sCi0gICAgICAgIHswLDksMjEzfSx7MTgsNywxOX0sezAsOCwxMDZ9LHswLDgsNDJ9LHswLDksMTgxfSx7MCw4LDEwfSx7MCw4LDEzOH0sCi0gICAgICAgIHswLDgsNzR9LHswLDksMjQ1fSx7MTYsNyw1fSx7MCw4LDg2fSx7MCw4LDIyfSx7NjQsOCwwfSx7MTksNyw1MX0sCi0gICAgICAgIHswLDgsMTE4fSx7MCw4LDU0fSx7MCw5LDIwNX0sezE3LDcsMTV9LHswLDgsMTAyfSx7MCw4LDM4fSx7MCw5LDE3M30sCi0gICAgICAgIHswLDgsNn0sezAsOCwxMzR9LHswLDgsNzB9LHswLDksMjM3fSx7MTYsNyw5fSx7MCw4LDk0fSx7MCw4LDMwfSwKLSAgICAgICAgezAsOSwxNTd9LHsyMCw3LDk5fSx7MCw4LDEyNn0sezAsOCw2Mn0sezAsOSwyMjF9LHsxOCw3LDI3fSx7MCw4LDExMH0sCi0gICAgICAgIHswLDgsNDZ9LHswLDksMTg5fSx7MCw4LDE0fSx7MCw4LDE0Mn0sezAsOCw3OH0sezAsOSwyNTN9LHs5Niw3LDB9LAotICAgICAgICB7MCw4LDgxfSx7MCw4LDE3fSx7MjEsOCwxMzF9LHsxOCw3LDMxfSx7MCw4LDExM30sezAsOCw0OX0sezAsOSwxOTV9LAotICAgICAgICB7MTYsNywxMH0sezAsOCw5N30sezAsOCwzM30sezAsOSwxNjN9LHswLDgsMX0sezAsOCwxMjl9LHswLDgsNjV9LAotICAgICAgICB7MCw5LDIyN30sezE2LDcsNn0sezAsOCw4OX0sezAsOCwyNX0sezAsOSwxNDd9LHsxOSw3LDU5fSx7MCw4LDEyMX0sCi0gICAgICAgIHswLDgsNTd9LHswLDksMjExfSx7MTcsNywxN30sezAsOCwxMDV9LHswLDgsNDF9LHswLDksMTc5fSx7MCw4LDl9LAotICAgICAgICB7MCw4LDEzN30sezAsOCw3M30sezAsOSwyNDN9LHsxNiw3LDR9LHswLDgsODV9LHswLDgsMjF9LHsxNiw4LDI1OH0sCi0gICAgICAgIHsxOSw3LDQzfSx7MCw4LDExN30sezAsOCw1M30sezAsOSwyMDN9LHsxNyw3LDEzfSx7MCw4LDEwMX0sezAsOCwzN30sCi0gICAgICAgIHswLDksMTcxfSx7MCw4LDV9LHswLDgsMTMzfSx7MCw4LDY5fSx7MCw5LDIzNX0sezE2LDcsOH0sezAsOCw5M30sCi0gICAgICAgIHswLDgsMjl9LHswLDksMTU1fSx7MjAsNyw4M30sezAsOCwxMjV9LHswLDgsNjF9LHswLDksMjE5fSx7MTgsNywyM30sCi0gICAgICAgIHswLDgsMTA5fSx7MCw4LDQ1fSx7MCw5LDE4N30sezAsOCwxM30sezAsOCwxNDF9LHswLDgsNzd9LHswLDksMjUxfSwKLSAgICAgICAgezE2LDcsM30sezAsOCw4M30sezAsOCwxOX0sezIxLDgsMTk1fSx7MTksNywzNX0sezAsOCwxMTV9LHswLDgsNTF9LAotICAgICAgICB7MCw5LDE5OX0sezE3LDcsMTF9LHswLDgsOTl9LHswLDgsMzV9LHswLDksMTY3fSx7MCw4LDN9LHswLDgsMTMxfSwKLSAgICAgICAgezAsOCw2N30sezAsOSwyMzF9LHsxNiw3LDd9LHswLDgsOTF9LHswLDgsMjd9LHswLDksMTUxfSx7MjAsNyw2N30sCi0gICAgICAgIHswLDgsMTIzfSx7MCw4LDU5fSx7MCw5LDIxNX0sezE4LDcsMTl9LHswLDgsMTA3fSx7MCw4LDQzfSx7MCw5LDE4M30sCi0gICAgICAgIHswLDgsMTF9LHswLDgsMTM5fSx7MCw4LDc1fSx7MCw5LDI0N30sezE2LDcsNX0sezAsOCw4N30sezAsOCwyM30sCi0gICAgICAgIHs2NCw4LDB9LHsxOSw3LDUxfSx7MCw4LDExOX0sezAsOCw1NX0sezAsOSwyMDd9LHsxNyw3LDE1fSx7MCw4LDEwM30sCi0gICAgICAgIHswLDgsMzl9LHswLDksMTc1fSx7MCw4LDd9LHswLDgsMTM1fSx7MCw4LDcxfSx7MCw5LDIzOX0sezE2LDcsOX0sCi0gICAgICAgIHswLDgsOTV9LHswLDgsMzF9LHswLDksMTU5fSx7MjAsNyw5OX0sezAsOCwxMjd9LHswLDgsNjN9LHswLDksMjIzfSwKLSAgICAgICAgezE4LDcsMjd9LHswLDgsMTExfSx7MCw4LDQ3fSx7MCw5LDE5MX0sezAsOCwxNX0sezAsOCwxNDN9LHswLDgsNzl9LAotICAgICAgICB7MCw5LDI1NX0KLSAgICB9OwotCi0gICAgc3RhdGljIGNvbnN0IGNvZGUgZGlzdGZpeFszMl0gPSB7Ci0gICAgICAgIHsxNiw1LDF9LHsyMyw1LDI1N30sezE5LDUsMTd9LHsyNyw1LDQwOTd9LHsxNyw1LDV9LHsyNSw1LDEwMjV9LAotICAgICAgICB7MjEsNSw2NX0sezI5LDUsMTYzODV9LHsxNiw1LDN9LHsyNCw1LDUxM30sezIwLDUsMzN9LHsyOCw1LDgxOTN9LAotICAgICAgICB7MTgsNSw5fSx7MjYsNSwyMDQ5fSx7MjIsNSwxMjl9LHs2NCw1LDB9LHsxNiw1LDJ9LHsyMyw1LDM4NX0sCi0gICAgICAgIHsxOSw1LDI1fSx7MjcsNSw2MTQ1fSx7MTcsNSw3fSx7MjUsNSwxNTM3fSx7MjEsNSw5N30sezI5LDUsMjQ1Nzd9LAotICAgICAgICB7MTYsNSw0fSx7MjQsNSw3Njl9LHsyMCw1LDQ5fSx7MjgsNSwxMjI4OX0sezE4LDUsMTN9LHsyNiw1LDMwNzN9LAotICAgICAgICB7MjIsNSwxOTN9LHs2NCw1LDB9Ci0gICAgfTsKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9pbmZsYXRlLmMgYi90aGlyZF9wYXJ0eS96bGliX3YxMjgvaW5mbGF0ZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzVlNDQ4Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9pbmZsYXRlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTEzICswLDAgQEAKLS8qIGluZmxhdGUuYyAtLSB6bGliIGRlY29tcHJlc3Npb24KLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDEyIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKgotICogQ2hhbmdlIGhpc3Rvcnk6Ci0gKgotICogMS4yLmJldGEwICAgIDI0IE5vdiAyMDAyCi0gKiAtIEZpcnN0IHZlcnNpb24gLS0gY29tcGxldGUgcmV3cml0ZSBvZiBpbmZsYXRlIHRvIHNpbXBsaWZ5IGNvZGUsIGF2b2lkCi0gKiAgIGNyZWF0aW9uIG9mIHdpbmRvdyB3aGVuIG5vdCBuZWVkZWQsIG1pbmltaXplIHVzZSBvZiB3aW5kb3cgd2hlbiBpdCBpcwotICogICBuZWVkZWQsIG1ha2UgaW5mZmFzdC5jIGV2ZW4gZmFzdGVyLCBpbXBsZW1lbnQgZ3ppcCBkZWNvZGluZywgYW5kIHRvCi0gKiAgIGltcHJvdmUgY29kZSByZWFkYWJpbGl0eSBhbmQgc3R5bGUgb3ZlciB0aGUgcHJldmlvdXMgemxpYiBpbmZsYXRlIGNvZGUKLSAqCi0gKiAxLjIuYmV0YTEgICAgMjUgTm92IDIwMDIKLSAqIC0gVXNlIHBvaW50ZXJzIGZvciBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCBjaGVja2luZyBpbiBpbmZmYXN0LmMKLSAqIC0gUmVtb3ZlIGlucHV0IGFuZCBvdXRwdXQgY291bnRlcnMgaW4gaW5mZmFzdC5jCi0gKiAtIENoYW5nZSBpbmZmYXN0LmMgZW50cnkgYW5kIGxvb3AgZnJvbSBhdmFpbF9pbiA+PSA3IHRvID49IDYKLSAqIC0gUmVtb3ZlIHVubmVjZXNzYXJ5IHNlY29uZCBieXRlIHB1bGwgZnJvbSBsZW5ndGggZXh0cmEgaW4gaW5mZmFzdC5jCi0gKiAtIFVucm9sbCBkaXJlY3QgY29weSB0byB0aHJlZSBjb3BpZXMgcGVyIGxvb3AgaW4gaW5mZmFzdC5jCi0gKgotICogMS4yLmJldGEyICAgIDQgRGVjIDIwMDIKLSAqIC0gQ2hhbmdlIGV4dGVybmFsIHJvdXRpbmUgbmFtZXMgdG8gcmVkdWNlIHBvdGVudGlhbCBjb25mbGljdHMKLSAqIC0gQ29ycmVjdCBmaWxlbmFtZSB0byBpbmZmaXhlZC5oIGZvciBmaXhlZCB0YWJsZXMgaW4gaW5mbGF0ZS5jCi0gKiAtIE1ha2UgaGJ1ZltdIHVuc2lnbmVkIGNoYXIgdG8gbWF0Y2ggcGFyYW1ldGVyIHR5cGUgaW4gaW5mbGF0ZS5jCi0gKiAtIENoYW5nZSBzdHJtLT5uZXh0X291dFstc3RhdGUtPm9mZnNldF0gdG8gKihzdHJtLT5uZXh0X291dCAtIHN0YXRlLT5vZmZzZXQpCi0gKiAgIHRvIGF2b2lkIG5lZ2F0aW9uIHByb2JsZW0gb24gQWxwaGFzICg2NCBiaXQpIGluIGluZmxhdGUuYwotICoKLSAqIDEuMi5iZXRhMyAgICAyMiBEZWMgMjAwMgotICogLSBBZGQgY29tbWVudHMgb24gc3RhdGUtPmJpdHMgYXNzZXJ0aW9uIGluIGluZmZhc3QuYwotICogLSBBZGQgY29tbWVudHMgb24gb3AgZmllbGQgaW4gaW5mdHJlZXMuaAotICogLSBGaXggYnVnIGluIHJldXNlIG9mIGFsbG9jYXRlZCB3aW5kb3cgYWZ0ZXIgaW5mbGF0ZVJlc2V0KCkKLSAqIC0gUmVtb3ZlIGJpdCBmaWVsZHMtLWJhY2sgdG8gYnl0ZSBzdHJ1Y3R1cmUgZm9yIHNwZWVkCi0gKiAtIFJlbW92ZSBkaXN0YW5jZSBleHRyYSA9PSAwIGNoZWNrIGluIGluZmxhdGVfZmFzdCgpLS1vbmx5IGhlbHBzIGZvciBsZW5ndGhzCi0gKiAtIENoYW5nZSBwb3N0LWluY3JlbWVudHMgdG8gcHJlLWluY3JlbWVudHMgaW4gaW5mbGF0ZV9mYXN0KCksIFBQQyBiaWFzZWQ/Ci0gKiAtIEFkZCBjb21waWxlIHRpbWUgb3B0aW9uLCBQT1NUSU5DLCB0byB1c2UgcG9zdC1pbmNyZW1lbnRzIGluc3RlYWQgKEludGVsPykKLSAqIC0gTWFrZSBNQVRDSCBjb3B5IGluIGluZmxhdGUoKSBtdWNoIGZhc3RlciBmb3Igd2hlbiBpbmZsYXRlX2Zhc3QoKSBub3QgdXNlZAotICogLSBVc2UgbG9jYWwgY29waWVzIG9mIHN0cmVhbSBuZXh0IGFuZCBhdmFpbCB2YWx1ZXMsIGFzIHdlbGwgYXMgbG9jYWwgYml0Ci0gKiAgIGJ1ZmZlciBhbmQgYml0IGNvdW50IGluIGluZmxhdGUoKS0tZm9yIHNwZWVkIHdoZW4gaW5mbGF0ZV9mYXN0KCkgbm90IHVzZWQKLSAqCi0gKiAxLjIuYmV0YTQgICAgMSBKYW4gMjAwMwotICogLSBTcGxpdCBwdHIgLSAyNTcgc3RhdGVtZW50cyBpbiBpbmZsYXRlX3RhYmxlKCkgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MKLSAqIC0gTW92ZSBhIGNvbW1lbnQgb24gb3V0cHV0IGJ1ZmZlciBzaXplcyBmcm9tIGluZmZhc3QuYyB0byBpbmZsYXRlLmMKLSAqIC0gQWRkIGNvbW1lbnRzIGluIGluZmZhc3QuYyB0byBpbnRyb2R1Y2UgdGhlIGluZmxhdGVfZmFzdCgpIHJvdXRpbmUKLSAqIC0gUmVhcnJhbmdlIHdpbmRvdyBjb3BpZXMgaW4gaW5mbGF0ZV9mYXN0KCkgZm9yIHNwZWVkIGFuZCBzaW1wbGlmaWNhdGlvbgotICogLSBVbnJvbGwgbGFzdCBjb3B5IGZvciB3aW5kb3cgbWF0Y2ggaW4gaW5mbGF0ZV9mYXN0KCkKLSAqIC0gVXNlIGxvY2FsIGNvcGllcyBvZiB3aW5kb3cgdmFyaWFibGVzIGluIGluZmxhdGVfZmFzdCgpIGZvciBzcGVlZAotICogLSBQdWxsIG91dCBjb21tb24gd25leHQgPT0gMCBjYXNlIGZvciBzcGVlZCBpbiBpbmZsYXRlX2Zhc3QoKQotICogLSBNYWtlIG9wIGFuZCBsZW4gaW4gaW5mbGF0ZV9mYXN0KCkgdW5zaWduZWQgZm9yIGNvbnNpc3RlbmN5Ci0gKiAtIEFkZCBGQVIgdG8gbGNvZGUgYW5kIGRjb2RlIGRlY2xhcmF0aW9ucyBpbiBpbmZsYXRlX2Zhc3QoKQotICogLSBTaW1wbGlmaWVkIGJhZCBkaXN0YW5jZSBjaGVjayBpbiBpbmZsYXRlX2Zhc3QoKQotICogLSBBZGRlZCBpbmZsYXRlQmFja0luaXQoKSwgaW5mbGF0ZUJhY2soKSwgYW5kIGluZmxhdGVCYWNrRW5kKCkgaW4gbmV3Ci0gKiAgIHNvdXJjZSBmaWxlIGluZmJhY2suYyB0byBwcm92aWRlIGEgY2FsbC1iYWNrIGludGVyZmFjZSB0byBpbmZsYXRlIGZvcgotICogICBwcm9ncmFtcyBsaWtlIGd6aXAgYW5kIHVuemlwIC0tIHVzZXMgd2luZG93IGFzIG91dHB1dCBidWZmZXIgdG8gYXZvaWQKLSAqICAgd2luZG93IGNvcHlpbmcKLSAqCi0gKiAxLjIuYmV0YTUgICAgMSBKYW4gMjAwMwotICogLSBJbXByb3ZlZCBpbmZsYXRlQmFjaygpIGludGVyZmFjZSB0byBhbGxvdyB0aGUgY2FsbGVyIHRvIHByb3ZpZGUgaW5pdGlhbAotICogICBpbnB1dCBpbiBzdHJtLgotICogLSBGaXhlZCBzdG9yZWQgYmxvY2tzIGJ1ZyBpbiBpbmZsYXRlQmFjaygpCi0gKgotICogMS4yLmJldGE2ICAgIDQgSmFuIDIwMDMKLSAqIC0gQWRkZWQgY29tbWVudHMgaW4gaW5mZmFzdC5jIG9uIGVmZmVjdGl2ZW5lc3Mgb2YgUE9TVElOQwotICogLSBUeXBlY2FzdGluZyBhbGwgYXJvdW5kIHRvIHJlZHVjZSBjb21waWxlciB3YXJuaW5ncwotICogLSBDaGFuZ2VkIGxvb3BzIGZyb20gd2hpbGUgKDEpIG9yIGRvIHt9IHdoaWxlICgxKSB0byBmb3IgKDs7KSwgYWdhaW4gdG8KLSAqICAgbWFrZSBjb21waWxlcnMgaGFwcHkKLSAqIC0gQ2hhbmdlZCB0eXBlIG9mIHdpbmRvdyBpbiBpbmZsYXRlQmFja0luaXQoKSB0byB1bnNpZ25lZCBjaGFyICoKLSAqCi0gKiAxLjIuYmV0YTcgICAgMjcgSmFuIDIwMDMKLSAqIC0gQ2hhbmdlZCBtYW55IHR5cGVzIHRvIHVuc2lnbmVkIG9yIHVuc2lnbmVkIHNob3J0IHRvIGF2b2lkIHdhcm5pbmdzCi0gKiAtIEFkZGVkIGluZmxhdGVDb3B5KCkgZnVuY3Rpb24KLSAqCi0gKiAxLjIuMCAgICAgICAgOSBNYXIgMjAwMwotICogLSBDaGFuZ2VkIGluZmxhdGVCYWNrKCkgaW50ZXJmYWNlIHRvIHByb3ZpZGUgc2VwYXJhdGUgb3BhcXVlIGRlc2NyaXB0b3JzCi0gKiAgIGZvciB0aGUgaW4oKSBhbmQgb3V0KCkgZnVuY3Rpb25zCi0gKiAtIENoYW5nZWQgaW5mbGF0ZUJhY2soKSBhcmd1bWVudCBhbmQgaW5fZnVuYyB0eXBlZGVmIHRvIHN3YXAgdGhlIGxlbmd0aAotICogICBhbmQgYnVmZmVyIGFkZHJlc3MgcmV0dXJuIHZhbHVlcyBmb3IgdGhlIGlucHV0IGZ1bmN0aW9uCi0gKiAtIENoZWNrIG5leHRfaW4gYW5kIG5leHRfb3V0IGZvciBaX05VTEwgb24gZW50cnkgdG8gaW5mbGF0ZSgpCi0gKgotICogVGhlIGhpc3RvcnkgZm9yIHZlcnNpb25zIGFmdGVyIDEuMi4wIGFyZSBpbiBDaGFuZ2VMb2cgaW4gemxpYiBkaXN0cmlidXRpb24uCi0gKi8KLQotI2luY2x1ZGUgInp1dGlsLmgiCi0jaW5jbHVkZSAiaW5mdHJlZXMuaCIKLSNpbmNsdWRlICJpbmZsYXRlLmgiCi0jaW5jbHVkZSAiaW5mZmFzdC5oIgotCi0jaWZkZWYgTUFLRUZJWEVECi0jICBpZm5kZWYgQlVJTERGSVhFRAotIyAgICBkZWZpbmUgQlVJTERGSVhFRAotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBmdW5jdGlvbiBwcm90b3R5cGVzICovCi1sb2NhbCB2b2lkIGZpeGVkdGFibGVzIE9GKChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlKSk7Ci1sb2NhbCBpbnQgdXBkYXRld2luZG93IE9GKCh6X3N0cmVhbXAgc3RybSwgY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKmVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNvcHkpKTsKLSNpZmRlZiBCVUlMREZJWEVECi0gICB2b2lkIG1ha2VmaXhlZCBPRigodm9pZCkpOwotI2VuZGlmCi1sb2NhbCB1bnNpZ25lZCBzeW5jc2VhcmNoIE9GKCh1bnNpZ25lZCBGQVIgKmhhdmUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsZW4pKTsKLQotaW50IFpFWFBPUlQgaW5mbGF0ZVJlc2V0S2VlcCgKLXpfc3RyZWFtcCBzdHJtKQotewotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Ci0KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7Ci0gICAgc3RybS0+dG90YWxfaW4gPSBzdHJtLT50b3RhbF9vdXQgPSBzdGF0ZS0+dG90YWwgPSAwOwotICAgIHN0cm0tPm1zZyA9IFpfTlVMTDsKLSAgICBpZiAoc3RhdGUtPndyYXApICAgICAgICAvKiB0byBzdXBwb3J0IGlsbC1jb25jZWl2ZWQgSmF2YSB0ZXN0IHN1aXRlICovCi0gICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPndyYXAgJiAxOwotICAgIHN0YXRlLT5tb2RlID0gSEVBRDsKLSAgICBzdGF0ZS0+bGFzdCA9IDA7Ci0gICAgc3RhdGUtPmhhdmVkaWN0ID0gMDsKLSAgICBzdGF0ZS0+ZG1heCA9IDMyNzY4VTsKLSAgICBzdGF0ZS0+aGVhZCA9IFpfTlVMTDsKLSAgICBzdGF0ZS0+aG9sZCA9IDA7Ci0gICAgc3RhdGUtPmJpdHMgPSAwOwotICAgIHN0YXRlLT5sZW5jb2RlID0gc3RhdGUtPmRpc3Rjb2RlID0gc3RhdGUtPm5leHQgPSBzdGF0ZS0+Y29kZXM7Ci0gICAgc3RhdGUtPnNhbmUgPSAxOwotICAgIHN0YXRlLT5iYWNrID0gLTE7Ci0gICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiByZXNldFxuIikpOwotICAgIHJldHVybiBaX09LOwotfQotCi1pbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQoCi16X3N0cmVhbXAgc3RybSkKLXsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotCi0gICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOwotICAgIHN0YXRlLT53c2l6ZSA9IDA7Ci0gICAgc3RhdGUtPndoYXZlID0gMDsKLSAgICBzdGF0ZS0+d25leHQgPSAwOwotICAgIHJldHVybiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pOwotfQotCi1pbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQyKAotel9zdHJlYW1wIHN0cm0sCi1pbnQgd2luZG93Qml0cykKLXsKLSAgICBpbnQgd3JhcDsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotCi0gICAgLyogZ2V0IHRoZSBzdGF0ZSAqLwotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKLQotICAgIC8qIGV4dHJhY3Qgd3JhcCByZXF1ZXN0IGZyb20gd2luZG93Qml0cyBwYXJhbWV0ZXIgKi8KLSAgICBpZiAod2luZG93Qml0cyA8IDApIHsKLSAgICAgICAgd3JhcCA9IDA7Ci0gICAgICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0czsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIHdyYXAgPSAod2luZG93Qml0cyA+PiA0KSArIDE7Ci0jaWZkZWYgR1VOWklQCi0gICAgICAgIGlmICh3aW5kb3dCaXRzIDwgNDgpCi0gICAgICAgICAgICB3aW5kb3dCaXRzICY9IDE1OwotI2VuZGlmCi0gICAgfQotCi0gICAgLyogc2V0IG51bWJlciBvZiB3aW5kb3cgYml0cywgZnJlZSB3aW5kb3cgaWYgZGlmZmVyZW50ICovCi0gICAgaWYgKHdpbmRvd0JpdHMgJiYgKHdpbmRvd0JpdHMgPCA4IHx8IHdpbmRvd0JpdHMgPiAxNSkpCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBpZiAoc3RhdGUtPndpbmRvdyAhPSBaX05VTEwgJiYgc3RhdGUtPndiaXRzICE9ICh1bnNpZ25lZCl3aW5kb3dCaXRzKSB7Ci0gICAgICAgIFpGUkVFKHN0cm0sIHN0YXRlLT53aW5kb3cpOwotICAgICAgICBzdGF0ZS0+d2luZG93ID0gWl9OVUxMOwotICAgIH0KLQotICAgIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmVzZXQgdGhlIHJlc3Qgb2YgaXQgKi8KLSAgICBzdGF0ZS0+d3JhcCA9IHdyYXA7Ci0gICAgc3RhdGUtPndiaXRzID0gKHVuc2lnbmVkKXdpbmRvd0JpdHM7Ci0gICAgcmV0dXJuIGluZmxhdGVSZXNldChzdHJtKTsKLX0KLQotaW50IFpFWFBPUlQgaW5mbGF0ZUluaXQyXygKLXpfc3RyZWFtcCBzdHJtLAotaW50IHdpbmRvd0JpdHMsCi1jb25zdCBjaGFyICp2ZXJzaW9uLAotaW50IHN0cmVhbV9zaXplKQotewotICAgIGludCByZXQ7Ci0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLQotICAgIGlmICh2ZXJzaW9uID09IFpfTlVMTCB8fCB2ZXJzaW9uWzBdICE9IFpMSUJfVkVSU0lPTlswXSB8fAotICAgICAgICBzdHJlYW1fc2l6ZSAhPSAoaW50KShzaXplb2Yoel9zdHJlYW0pKSkKLSAgICAgICAgcmV0dXJuIFpfVkVSU0lPTl9FUlJPUjsKLSAgICBpZiAoc3RybSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBzdHJtLT5tc2cgPSBaX05VTEw7ICAgICAgICAgICAgICAgICAvKiBpbiBjYXNlIHdlIHJldHVybiBhbiBlcnJvciAqLwotICAgIGlmIChzdHJtLT56YWxsb2MgPT0gKGFsbG9jX2Z1bmMpMCkgewotI2lmZGVmIFpfU09MTwotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0jZWxzZQotICAgICAgICBzdHJtLT56YWxsb2MgPSB6Y2FsbG9jOwotICAgICAgICBzdHJtLT5vcGFxdWUgPSAodm9pZHBmKTA7Ci0jZW5kaWYKLSAgICB9Ci0gICAgaWYgKHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCkKLSNpZmRlZiBaX1NPTE8KLSAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotI2Vsc2UKLSAgICAgICAgc3RybS0+emZyZWUgPSB6Y2ZyZWU7Ci0jZW5kaWYKLSAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKikKLSAgICAgICAgICAgIFpBTExPQyhzdHJtLCAxLCBzaXplb2Yoc3RydWN0IGluZmxhdGVfc3RhdGUpKTsKLSAgICBpZiAoc3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7Ci0gICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiBhbGxvY2F0ZWRcbiIpKTsKLSAgICBzdHJtLT5zdGF0ZSA9IChzdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgRkFSICopc3RhdGU7Ci0gICAgc3RhdGUtPndpbmRvdyA9IFpfTlVMTDsKLSAgICByZXQgPSBpbmZsYXRlUmVzZXQyKHN0cm0sIHdpbmRvd0JpdHMpOwotICAgIGlmIChyZXQgIT0gWl9PSykgewotICAgICAgICBaRlJFRShzdHJtLCBzdGF0ZSk7Ci0gICAgICAgIHN0cm0tPnN0YXRlID0gWl9OVUxMOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1pbnQgWkVYUE9SVCBpbmZsYXRlSW5pdF8oCi16X3N0cmVhbXAgc3RybSwKLWNvbnN0IGNoYXIgKnZlcnNpb24sCi1pbnQgc3RyZWFtX3NpemUpCi17Ci0gICAgcmV0dXJuIGluZmxhdGVJbml0Ml8oc3RybSwgREVGX1dCSVRTLCB2ZXJzaW9uLCBzdHJlYW1fc2l6ZSk7Ci19Ci0KLWludCBaRVhQT1JUIGluZmxhdGVQcmltZSgKLXpfc3RyZWFtcCBzdHJtLAotaW50IGJpdHMsCi1pbnQgdmFsdWUpCi17Ci0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLQotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLSAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKLSAgICBpZiAoYml0cyA8IDApIHsKLSAgICAgICAgc3RhdGUtPmhvbGQgPSAwOwotICAgICAgICBzdGF0ZS0+Yml0cyA9IDA7Ci0gICAgICAgIHJldHVybiBaX09LOwotICAgIH0KLSAgICBpZiAoYml0cyA+IDE2IHx8IHN0YXRlLT5iaXRzICsgYml0cyA+IDMyKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgdmFsdWUgJj0gKDFMIDw8IGJpdHMpIC0gMTsKLSAgICBzdGF0ZS0+aG9sZCArPSB2YWx1ZSA8PCBzdGF0ZS0+Yml0czsKLSAgICBzdGF0ZS0+Yml0cyArPSBiaXRzOwotICAgIHJldHVybiBaX09LOwotfQotCi0vKgotICAgUmV0dXJuIHN0YXRlIHdpdGggbGVuZ3RoIGFuZCBkaXN0YW5jZSBkZWNvZGluZyB0YWJsZXMgYW5kIGluZGV4IHNpemVzIHNldCB0bwotICAgZml4ZWQgY29kZSBkZWNvZGluZy4gIE5vcm1hbGx5IHRoaXMgcmV0dXJucyBmaXhlZCB0YWJsZXMgZnJvbSBpbmZmaXhlZC5oLgotICAgSWYgQlVJTERGSVhFRCBpcyBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhpcyByb3V0aW5lIGJ1aWxkcyB0aGUgdGFibGVzIHRoZQotICAgZmlyc3QgdGltZSBpdCdzIGNhbGxlZCwgYW5kIHJldHVybnMgdGhvc2UgdGFibGVzIHRoZSBmaXJzdCB0aW1lIGFuZAotICAgdGhlcmVhZnRlci4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29kZSBieSBhYm91dCAySyBieXRlcywgaW4KLSAgIGV4Y2hhbmdlIGZvciBhIGxpdHRsZSBleGVjdXRpb24gdGltZS4gIEhvd2V2ZXIsIEJVSUxERklYRUQgc2hvdWxkIG5vdCBiZQotICAgdXNlZCBmb3IgdGhyZWFkZWQgYXBwbGljYXRpb25zLCBzaW5jZSB0aGUgcmV3cml0aW5nIG9mIHRoZSB0YWJsZXMgYW5kIHZpcmdpbgotICAgbWF5IG5vdCBiZSB0aHJlYWQtc2FmZS4KLSAqLwotbG9jYWwgdm9pZCBmaXhlZHRhYmxlcygKLXN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGUpCi17Ci0jaWZkZWYgQlVJTERGSVhFRAotICAgIHN0YXRpYyBpbnQgdmlyZ2luID0gMTsKLSAgICBzdGF0aWMgY29kZSAqbGVuZml4LCAqZGlzdGZpeDsKLSAgICBzdGF0aWMgY29kZSBmaXhlZFs1NDRdOwotCi0gICAgLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0YWJsZXMgaWYgZmlyc3QgY2FsbCAobWF5IG5vdCBiZSB0aHJlYWQgc2FmZSkgKi8KLSAgICBpZiAodmlyZ2luKSB7Ci0gICAgICAgIHVuc2lnbmVkIHN5bSwgYml0czsKLSAgICAgICAgc3RhdGljIGNvZGUgKm5leHQ7Ci0KLSAgICAgICAgLyogbGl0ZXJhbC9sZW5ndGggdGFibGUgKi8KLSAgICAgICAgc3ltID0gMDsKLSAgICAgICAgd2hpbGUgKHN5bSA8IDE0NCkgc3RhdGUtPmxlbnNbc3ltKytdID0gODsKLSAgICAgICAgd2hpbGUgKHN5bSA8IDI1Nikgc3RhdGUtPmxlbnNbc3ltKytdID0gOTsKLSAgICAgICAgd2hpbGUgKHN5bSA8IDI4MCkgc3RhdGUtPmxlbnNbc3ltKytdID0gNzsKLSAgICAgICAgd2hpbGUgKHN5bSA8IDI4OCkgc3RhdGUtPmxlbnNbc3ltKytdID0gODsKLSAgICAgICAgbmV4dCA9IGZpeGVkOwotICAgICAgICBsZW5maXggPSBuZXh0OwotICAgICAgICBiaXRzID0gOTsKLSAgICAgICAgaW5mbGF0ZV90YWJsZShMRU5TLCBzdGF0ZS0+bGVucywgMjg4LCAmKG5leHQpLCAmKGJpdHMpLCBzdGF0ZS0+d29yayk7Ci0KLSAgICAgICAgLyogZGlzdGFuY2UgdGFibGUgKi8KLSAgICAgICAgc3ltID0gMDsKLSAgICAgICAgd2hpbGUgKHN5bSA8IDMyKSBzdGF0ZS0+bGVuc1tzeW0rK10gPSA1OwotICAgICAgICBkaXN0Zml4ID0gbmV4dDsKLSAgICAgICAgYml0cyA9IDU7Ci0gICAgICAgIGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLT5sZW5zLCAzMiwgJihuZXh0KSwgJihiaXRzKSwgc3RhdGUtPndvcmspOwotCi0gICAgICAgIC8qIGRvIHRoaXMganVzdCBvbmNlICovCi0gICAgICAgIHZpcmdpbiA9IDA7Ci0gICAgfQotI2Vsc2UgLyogIUJVSUxERklYRUQgKi8KLSMgICBpbmNsdWRlICJpbmZmaXhlZC5oIgotI2VuZGlmIC8qIEJVSUxERklYRUQgKi8KLSAgICBzdGF0ZS0+bGVuY29kZSA9IGxlbmZpeDsKLSAgICBzdGF0ZS0+bGVuYml0cyA9IDk7Ci0gICAgc3RhdGUtPmRpc3Rjb2RlID0gZGlzdGZpeDsKLSAgICBzdGF0ZS0+ZGlzdGJpdHMgPSA1OwotfQotCi0jaWZkZWYgTUFLRUZJWEVECi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotLyoKLSAgIFdyaXRlIG91dCB0aGUgaW5mZml4ZWQuaCB0aGF0IGlzICNpbmNsdWRlJ2QgYWJvdmUuICBEZWZpbmluZyBNQUtFRklYRUQgYWxzbwotICAgZGVmaW5lcyBCVUlMREZJWEVELCBzbyB0aGUgdGFibGVzIGFyZSBidWlsdCBvbiB0aGUgZmx5LiAgbWFrZWZpeGVkKCkgd3JpdGVzCi0gICB0aG9zZSB0YWJsZXMgdG8gc3Rkb3V0LCB3aGljaCB3b3VsZCBiZSBwaXBlZCB0byBpbmZmaXhlZC5oLiAgQSBzbWFsbCBwcm9ncmFtCi0gICBjYW4gc2ltcGx5IGNhbGwgbWFrZWZpeGVkIHRvIGRvIHRoaXM6Ci0KLSAgICB2b2lkIG1ha2VmaXhlZCh2b2lkKTsKLQotICAgIGludCBtYWluKHZvaWQpCi0gICAgewotICAgICAgICBtYWtlZml4ZWQoKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICBUaGVuIHRoYXQgY2FuIGJlIGxpbmtlZCB3aXRoIHpsaWIgYnVpbHQgd2l0aCBNQUtFRklYRUQgZGVmaW5lZCBhbmQgcnVuOgotCi0gICAgYS5vdXQgPiBpbmZmaXhlZC5oCi0gKi8KLXZvaWQgbWFrZWZpeGVkKCkKLXsKLSAgICB1bnNpZ25lZCBsb3csIHNpemU7Ci0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgc3RhdGU7Ci0KLSAgICBmaXhlZHRhYmxlcygmc3RhdGUpOwotICAgIHB1dHMoIiAgICAvKiBpbmZmaXhlZC5oIC0tIHRhYmxlIGZvciBkZWNvZGluZyBmaXhlZCBjb2RlcyIpOwotICAgIHB1dHMoIiAgICAgKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBtYWtlZml4ZWQoKS4iKTsKLSAgICBwdXRzKCIgICAgICovIik7Ci0gICAgcHV0cygiIik7Ci0gICAgcHV0cygiICAgIC8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIik7Ci0gICAgcHV0cygiICAgICAgIEl0IGlzIHBhcnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbGlicmFyeSBhbmQgaXMiKTsKLSAgICBwdXRzKCIgICAgICAgc3ViamVjdCB0byBjaGFuZ2UuIEFwcGxpY2F0aW9ucyBzaG91bGQgb25seSB1c2UgemxpYi5oLiIpOwotICAgIHB1dHMoIiAgICAgKi8iKTsKLSAgICBwdXRzKCIiKTsKLSAgICBzaXplID0gMVUgPDwgOTsKLSAgICBwcmludGYoIiAgICBzdGF0aWMgY29uc3QgY29kZSBsZW5maXhbJXVdID0geyIsIHNpemUpOwotICAgIGxvdyA9IDA7Ci0gICAgZm9yICg7OykgewotICAgICAgICBpZiAoKGxvdyAlIDcpID09IDApIHByaW50ZigiXG4gICAgICAgICIpOwotICAgICAgICBwcmludGYoInsldSwldSwlZH0iLCAobG93ICYgMTI3KSA9PSA5OSA/IDY0IDogc3RhdGUubGVuY29kZVtsb3ddLm9wLAotICAgICAgICAgICAgICAgc3RhdGUubGVuY29kZVtsb3ddLmJpdHMsIHN0YXRlLmxlbmNvZGVbbG93XS52YWwpOwotICAgICAgICBpZiAoKytsb3cgPT0gc2l6ZSkgYnJlYWs7Ci0gICAgICAgIHB1dGNoYXIoJywnKTsKLSAgICB9Ci0gICAgcHV0cygiXG4gICAgfTsiKTsKLSAgICBzaXplID0gMVUgPDwgNTsKLSAgICBwcmludGYoIlxuICAgIHN0YXRpYyBjb25zdCBjb2RlIGRpc3RmaXhbJXVdID0geyIsIHNpemUpOwotICAgIGxvdyA9IDA7Ci0gICAgZm9yICg7OykgewotICAgICAgICBpZiAoKGxvdyAlIDYpID09IDApIHByaW50ZigiXG4gICAgICAgICIpOwotICAgICAgICBwcmludGYoInsldSwldSwlZH0iLCBzdGF0ZS5kaXN0Y29kZVtsb3ddLm9wLCBzdGF0ZS5kaXN0Y29kZVtsb3ddLmJpdHMsCi0gICAgICAgICAgICAgICBzdGF0ZS5kaXN0Y29kZVtsb3ddLnZhbCk7Ci0gICAgICAgIGlmICgrK2xvdyA9PSBzaXplKSBicmVhazsKLSAgICAgICAgcHV0Y2hhcignLCcpOwotICAgIH0KLSAgICBwdXRzKCJcbiAgICB9OyIpOwotfQotI2VuZGlmIC8qIE1BS0VGSVhFRCAqLwotCi0vKgotICAgVXBkYXRlIHRoZSB3aW5kb3cgd2l0aCB0aGUgbGFzdCB3c2l6ZSAobm9ybWFsbHkgMzJLKSBieXRlcyB3cml0dGVuIGJlZm9yZQotICAgcmV0dXJuaW5nLiAgSWYgd2luZG93IGRvZXMgbm90IGV4aXN0IHlldCwgY3JlYXRlIGl0LiAgVGhpcyBpcyBvbmx5IGNhbGxlZAotICAgd2hlbiBhIHdpbmRvdyBpcyBhbHJlYWR5IGluIHVzZSwgb3Igd2hlbiBvdXRwdXQgaGFzIGJlZW4gd3JpdHRlbiBkdXJpbmcgdGhpcwotICAgaW5mbGF0ZSBjYWxsLCBidXQgdGhlIGVuZCBvZiB0aGUgZGVmbGF0ZSBzdHJlYW0gaGFzIG5vdCBiZWVuIHJlYWNoZWQgeWV0LgotICAgSXQgaXMgYWxzbyBjYWxsZWQgdG8gY3JlYXRlIGEgd2luZG93IGZvciBkaWN0aW9uYXJ5IGRhdGEgd2hlbiBhIGRpY3Rpb25hcnkKLSAgIGlzIGxvYWRlZC4KLQotICAgUHJvdmlkaW5nIG91dHB1dCBidWZmZXJzIGxhcmdlciB0aGFuIDMySyB0byBpbmZsYXRlKCkgc2hvdWxkIHByb3ZpZGUgYSBzcGVlZAotICAgYWR2YW50YWdlLCBzaW5jZSBvbmx5IHRoZSBsYXN0IDMySyBvZiBvdXRwdXQgaXMgY29waWVkIHRvIHRoZSBzbGlkaW5nIHdpbmRvdwotICAgdXBvbiByZXR1cm4gZnJvbSBpbmZsYXRlKCksIGFuZCBzaW5jZSBhbGwgZGlzdGFuY2VzIGFmdGVyIHRoZSBmaXJzdCAzMksgb2YKLSAgIG91dHB1dCB3aWxsIGZhbGwgaW4gdGhlIG91dHB1dCBkYXRhLCBtYWtpbmcgbWF0Y2ggY29waWVzIHNpbXBsZXIgYW5kIGZhc3Rlci4KLSAgIFRoZSBhZHZhbnRhZ2UgbWF5IGJlIGRlcGVuZGVudCBvbiB0aGUgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yJ3MgZGF0YSBjYWNoZXMuCi0gKi8KLWxvY2FsIGludCB1cGRhdGV3aW5kb3coCi16X3N0cmVhbXAgc3RybSwKLWNvbnN0IEJ5dGVmICplbmQsCi11bnNpZ25lZCBjb3B5KQotewotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Ci0gICAgdW5zaWduZWQgZGlzdDsKLQotICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOwotCi0gICAgLyogaWYgaXQgaGFzbid0IGJlZW4gZG9uZSBhbHJlYWR5LCBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlIHdpbmRvdyAqLwotICAgIGlmIChzdGF0ZS0+d2luZG93ID09IFpfTlVMTCkgewotICAgICAgICBzdGF0ZS0+d2luZG93ID0gKHVuc2lnbmVkIGNoYXIgRkFSICopCi0gICAgICAgICAgICAgICAgICAgICAgICBaQUxMT0Moc3RybSwgMVUgPDwgc3RhdGUtPndiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZih1bnNpZ25lZCBjaGFyKSk7Ci0gICAgICAgIGlmIChzdGF0ZS0+d2luZG93ID09IFpfTlVMTCkgcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgLyogaWYgd2luZG93IG5vdCBpbiB1c2UgeWV0LCBpbml0aWFsaXplICovCi0gICAgaWYgKHN0YXRlLT53c2l6ZSA9PSAwKSB7Ci0gICAgICAgIHN0YXRlLT53c2l6ZSA9IDFVIDw8IHN0YXRlLT53Yml0czsKLSAgICAgICAgc3RhdGUtPnduZXh0ID0gMDsKLSAgICAgICAgc3RhdGUtPndoYXZlID0gMDsKLSAgICB9Ci0KLSAgICAvKiBjb3B5IHN0YXRlLT53c2l6ZSBvciBsZXNzIG91dHB1dCBieXRlcyBpbnRvIHRoZSBjaXJjdWxhciB3aW5kb3cgKi8KLSAgICBpZiAoY29weSA+PSBzdGF0ZS0+d3NpemUpIHsKLSAgICAgICAgem1lbWNweShzdGF0ZS0+d2luZG93LCBlbmQgLSBzdGF0ZS0+d3NpemUsIHN0YXRlLT53c2l6ZSk7Ci0gICAgICAgIHN0YXRlLT53bmV4dCA9IDA7Ci0gICAgICAgIHN0YXRlLT53aGF2ZSA9IHN0YXRlLT53c2l6ZTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGRpc3QgPSBzdGF0ZS0+d3NpemUgLSBzdGF0ZS0+d25leHQ7Ci0gICAgICAgIGlmIChkaXN0ID4gY29weSkgZGlzdCA9IGNvcHk7Ci0gICAgICAgIHptZW1jcHkoc3RhdGUtPndpbmRvdyArIHN0YXRlLT53bmV4dCwgZW5kIC0gY29weSwgZGlzdCk7Ci0gICAgICAgIGNvcHkgLT0gZGlzdDsKLSAgICAgICAgaWYgKGNvcHkpIHsKLSAgICAgICAgICAgIHptZW1jcHkoc3RhdGUtPndpbmRvdywgZW5kIC0gY29weSwgY29weSk7Ci0gICAgICAgICAgICBzdGF0ZS0+d25leHQgPSBjb3B5OwotICAgICAgICAgICAgc3RhdGUtPndoYXZlID0gc3RhdGUtPndzaXplOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgc3RhdGUtPnduZXh0ICs9IGRpc3Q7Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPnduZXh0ID09IHN0YXRlLT53c2l6ZSkgc3RhdGUtPnduZXh0ID0gMDsKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+d2hhdmUgPCBzdGF0ZS0+d3NpemUpIHN0YXRlLT53aGF2ZSArPSBkaXN0OwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi0vKiBNYWNyb3MgZm9yIGluZmxhdGUoKTogKi8KLQotLyogY2hlY2sgZnVuY3Rpb24gdG8gdXNlIGFkbGVyMzIoKSBmb3IgemxpYiBvciBjcmMzMigpIGZvciBnemlwICovCi0jaWZkZWYgR1VOWklQCi0jICBkZWZpbmUgVVBEQVRFKGNoZWNrLCBidWYsIGxlbikgXAotICAgIChzdGF0ZS0+ZmxhZ3MgPyBjcmMzMihjaGVjaywgYnVmLCBsZW4pIDogYWRsZXIzMihjaGVjaywgYnVmLCBsZW4pKQotI2Vsc2UKLSMgIGRlZmluZSBVUERBVEUoY2hlY2ssIGJ1ZiwgbGVuKSBhZGxlcjMyKGNoZWNrLCBidWYsIGxlbikKLSNlbmRpZgotCi0vKiBjaGVjayBtYWNyb3MgZm9yIGhlYWRlciBjcmMgKi8KLSNpZmRlZiBHVU5aSVAKLSMgIGRlZmluZSBDUkMyKGNoZWNrLCB3b3JkKSBcCi0gICAgZG8geyBcCi0gICAgICAgIGhidWZbMF0gPSAodW5zaWduZWQgY2hhcikod29yZCk7IFwKLSAgICAgICAgaGJ1ZlsxXSA9ICh1bnNpZ25lZCBjaGFyKSgod29yZCkgPj4gOCk7IFwKLSAgICAgICAgY2hlY2sgPSBjcmMzMihjaGVjaywgaGJ1ZiwgMik7IFwKLSAgICB9IHdoaWxlICgwKQotCi0jICBkZWZpbmUgQ1JDNChjaGVjaywgd29yZCkgXAotICAgIGRvIHsgXAotICAgICAgICBoYnVmWzBdID0gKHVuc2lnbmVkIGNoYXIpKHdvcmQpOyBcCi0gICAgICAgIGhidWZbMV0gPSAodW5zaWduZWQgY2hhcikoKHdvcmQpID4+IDgpOyBcCi0gICAgICAgIGhidWZbMl0gPSAodW5zaWduZWQgY2hhcikoKHdvcmQpID4+IDE2KTsgXAotICAgICAgICBoYnVmWzNdID0gKHVuc2lnbmVkIGNoYXIpKCh3b3JkKSA+PiAyNCk7IFwKLSAgICAgICAgY2hlY2sgPSBjcmMzMihjaGVjaywgaGJ1ZiwgNCk7IFwKLSAgICB9IHdoaWxlICgwKQotI2VuZGlmCi0KLS8qIExvYWQgcmVnaXN0ZXJzIHdpdGggc3RhdGUgaW4gaW5mbGF0ZSgpIGZvciBzcGVlZCAqLwotI2RlZmluZSBMT0FEKCkgXAotICAgIGRvIHsgXAotICAgICAgICBwdXQgPSBzdHJtLT5uZXh0X291dDsgXAotICAgICAgICBsZWZ0ID0gc3RybS0+YXZhaWxfb3V0OyBcCi0gICAgICAgIG5leHQgPSBzdHJtLT5uZXh0X2luOyBcCi0gICAgICAgIGhhdmUgPSBzdHJtLT5hdmFpbF9pbjsgXAotICAgICAgICBob2xkID0gc3RhdGUtPmhvbGQ7IFwKLSAgICAgICAgYml0cyA9IHN0YXRlLT5iaXRzOyBcCi0gICAgfSB3aGlsZSAoMCkKLQotLyogUmVzdG9yZSBzdGF0ZSBmcm9tIHJlZ2lzdGVycyBpbiBpbmZsYXRlKCkgKi8KLSNkZWZpbmUgUkVTVE9SRSgpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgc3RybS0+bmV4dF9vdXQgPSBwdXQ7IFwKLSAgICAgICAgc3RybS0+YXZhaWxfb3V0ID0gbGVmdDsgXAotICAgICAgICBzdHJtLT5uZXh0X2luID0gbmV4dDsgXAotICAgICAgICBzdHJtLT5hdmFpbF9pbiA9IGhhdmU7IFwKLSAgICAgICAgc3RhdGUtPmhvbGQgPSBob2xkOyBcCi0gICAgICAgIHN0YXRlLT5iaXRzID0gYml0czsgXAotICAgIH0gd2hpbGUgKDApCi0KLS8qIENsZWFyIHRoZSBpbnB1dCBiaXQgYWNjdW11bGF0b3IgKi8KLSNkZWZpbmUgSU5JVEJJVFMoKSBcCi0gICAgZG8geyBcCi0gICAgICAgIGhvbGQgPSAwOyBcCi0gICAgICAgIGJpdHMgPSAwOyBcCi0gICAgfSB3aGlsZSAoMCkKLQotLyogR2V0IGEgYnl0ZSBvZiBpbnB1dCBpbnRvIHRoZSBiaXQgYWNjdW11bGF0b3IsIG9yIHJldHVybiBmcm9tIGluZmxhdGUoKQotICAgaWYgdGhlcmUgaXMgbm8gaW5wdXQgYXZhaWxhYmxlLiAqLwotI2RlZmluZSBQVUxMQllURSgpIFwKLSAgICBkbyB7IFwKLSAgICAgICAgaWYgKGhhdmUgPT0gMCkgZ290byBpbmZfbGVhdmU7IFwKLSAgICAgICAgaGF2ZS0tOyBcCi0gICAgICAgIGhvbGQgKz0gKHVuc2lnbmVkIGxvbmcpKCpuZXh0KyspIDw8IGJpdHM7IFwKLSAgICAgICAgYml0cyArPSA4OyBcCi0gICAgfSB3aGlsZSAoMCkKLQotLyogQXNzdXJlIHRoYXQgdGhlcmUgYXJlIGF0IGxlYXN0IG4gYml0cyBpbiB0aGUgYml0IGFjY3VtdWxhdG9yLiAgSWYgdGhlcmUgaXMKLSAgIG5vdCBlbm91Z2ggYXZhaWxhYmxlIGlucHV0IHRvIGRvIHRoYXQsIHRoZW4gcmV0dXJuIGZyb20gaW5mbGF0ZSgpLiAqLwotI2RlZmluZSBORUVEQklUUyhuKSBcCi0gICAgZG8geyBcCi0gICAgICAgIHdoaWxlIChiaXRzIDwgKHVuc2lnbmVkKShuKSkgXAotICAgICAgICAgICAgUFVMTEJZVEUoKTsgXAotICAgIH0gd2hpbGUgKDApCi0KLS8qIFJldHVybiB0aGUgbG93IG4gYml0cyBvZiB0aGUgYml0IGFjY3VtdWxhdG9yIChuIDwgMTYpICovCi0jZGVmaW5lIEJJVFMobikgXAotICAgICgodW5zaWduZWQpaG9sZCAmICgoMVUgPDwgKG4pKSAtIDEpKQotCi0vKiBSZW1vdmUgbiBiaXRzIGZyb20gdGhlIGJpdCBhY2N1bXVsYXRvciAqLwotI2RlZmluZSBEUk9QQklUUyhuKSBcCi0gICAgZG8geyBcCi0gICAgICAgIGhvbGQgPj49IChuKTsgXAotICAgICAgICBiaXRzIC09ICh1bnNpZ25lZCkobik7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKiBSZW1vdmUgemVybyB0byBzZXZlbiBiaXRzIGFzIG5lZWRlZCB0byBnbyB0byBhIGJ5dGUgYm91bmRhcnkgKi8KLSNkZWZpbmUgQllURUJJVFMoKSBcCi0gICAgZG8geyBcCi0gICAgICAgIGhvbGQgPj49IGJpdHMgJiA3OyBcCi0gICAgICAgIGJpdHMgLT0gYml0cyAmIDc7IFwKLSAgICB9IHdoaWxlICgwKQotCi0vKgotICAgaW5mbGF0ZSgpIHVzZXMgYSBzdGF0ZSBtYWNoaW5lIHRvIHByb2Nlc3MgYXMgbXVjaCBpbnB1dCBkYXRhIGFuZCBnZW5lcmF0ZSBhcwotICAgbXVjaCBvdXRwdXQgZGF0YSBhcyBwb3NzaWJsZSBiZWZvcmUgcmV0dXJuaW5nLiAgVGhlIHN0YXRlIG1hY2hpbmUgaXMKLSAgIHN0cnVjdHVyZWQgcm91Z2hseSBhcyBmb2xsb3dzOgotCi0gICAgZm9yICg7Oykgc3dpdGNoIChzdGF0ZSkgewotICAgIC4uLgotICAgIGNhc2UgU1RBVEVuOgotICAgICAgICBpZiAobm90IGVub3VnaCBpbnB1dCBkYXRhIG9yIG91dHB1dCBzcGFjZSB0byBtYWtlIHByb2dyZXNzKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAuLi4gbWFrZSBwcm9ncmVzcyAuLi4KLSAgICAgICAgc3RhdGUgPSBTVEFURW07Ci0gICAgICAgIGJyZWFrOwotICAgIC4uLgotICAgIH0KLQotICAgc28gd2hlbiBpbmZsYXRlKCkgaXMgY2FsbGVkIGFnYWluLCB0aGUgc2FtZSBjYXNlIGlzIGF0dGVtcHRlZCBhZ2FpbiwgYW5kCi0gICBpZiB0aGUgYXBwcm9wcmlhdGUgcmVzb3VyY2VzIGFyZSBwcm92aWRlZCwgdGhlIG1hY2hpbmUgcHJvY2VlZHMgdG8gdGhlCi0gICBuZXh0IHN0YXRlLiAgVGhlIE5FRURCSVRTKCkgbWFjcm8gaXMgdXN1YWxseSB0aGUgd2F5IHRoZSBzdGF0ZSBldmFsdWF0ZXMKLSAgIHdoZXRoZXIgaXQgY2FuIHByb2NlZWQgb3Igc2hvdWxkIHJldHVybi4gIE5FRURCSVRTKCkgZG9lcyB0aGUgcmV0dXJuIGlmCi0gICB0aGUgcmVxdWVzdGVkIGJpdHMgYXJlIG5vdCBhdmFpbGFibGUuICBUaGUgdHlwaWNhbCB1c2Ugb2YgdGhlIEJJVFMgbWFjcm9zCi0gICBpczoKLQotICAgICAgICBORUVEQklUUyhuKTsKLSAgICAgICAgLi4uIGRvIHNvbWV0aGluZyB3aXRoIEJJVFMobikgLi4uCi0gICAgICAgIERST1BCSVRTKG4pOwotCi0gICB3aGVyZSBORUVEQklUUyhuKSBlaXRoZXIgcmV0dXJucyBmcm9tIGluZmxhdGUoKSBpZiB0aGVyZSBpc24ndCBlbm91Z2gKLSAgIGlucHV0IGxlZnQgdG8gbG9hZCBuIGJpdHMgaW50byB0aGUgYWNjdW11bGF0b3IsIG9yIGl0IGNvbnRpbnVlcy4gIEJJVFMobikKLSAgIGdpdmVzIHRoZSBsb3cgbiBiaXRzIGluIHRoZSBhY2N1bXVsYXRvci4gIFdoZW4gZG9uZSwgRFJPUEJJVFMobikgZHJvcHMKLSAgIHRoZSBsb3cgbiBiaXRzIG9mZiB0aGUgYWNjdW11bGF0b3IuICBJTklUQklUUygpIGNsZWFycyB0aGUgYWNjdW11bGF0b3IKLSAgIGFuZCBzZXRzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGJpdHMgdG8gemVyby4gIEJZVEVCSVRTKCkgZGlzY2FyZHMganVzdAotICAgZW5vdWdoIGJpdHMgdG8gcHV0IHRoZSBhY2N1bXVsYXRvciBvbiBhIGJ5dGUgYm91bmRhcnkuICBBZnRlciBCWVRFQklUUygpCi0gICBhbmQgYSBORUVEQklUUyg4KSwgdGhlbiBCSVRTKDgpIHdvdWxkIHJldHVybiB0aGUgbmV4dCBieXRlIGluIHRoZSBzdHJlYW0uCi0KLSAgIE5FRURCSVRTKG4pIHVzZXMgUFVMTEJZVEUoKSB0byBnZXQgYW4gYXZhaWxhYmxlIGJ5dGUgb2YgaW5wdXQsIG9yIHRvIHJldHVybgotICAgaWYgdGhlcmUgaXMgbm8gaW5wdXQgYXZhaWxhYmxlLiAgVGhlIGRlY29kaW5nIG9mIHZhcmlhYmxlIGxlbmd0aCBjb2RlcyB1c2VzCi0gICBQVUxMQllURSgpIGRpcmVjdGx5IGluIG9yZGVyIHRvIHB1bGwganVzdCBlbm91Z2ggYnl0ZXMgdG8gZGVjb2RlIHRoZSBuZXh0Ci0gICBjb2RlLCBhbmQgbm8gbW9yZS4KLQotICAgU29tZSBzdGF0ZXMgbG9vcCB1bnRpbCB0aGV5IGdldCBlbm91Z2ggaW5wdXQsIG1ha2luZyBzdXJlIHRoYXQgZW5vdWdoCi0gICBzdGF0ZSBpbmZvcm1hdGlvbiBpcyBtYWludGFpbmVkIHRvIGNvbnRpbnVlIHRoZSBsb29wIHdoZXJlIGl0IGxlZnQgb2ZmCi0gICBpZiBORUVEQklUUygpIHJldHVybnMgaW4gdGhlIGxvb3AuICBGb3IgZXhhbXBsZSwgd2FudCwgbmVlZCwgYW5kIGtlZXAKLSAgIHdvdWxkIGFsbCBoYXZlIHRvIGFjdHVhbGx5IGJlIHBhcnQgb2YgdGhlIHNhdmVkIHN0YXRlIGluIGNhc2UgTkVFREJJVFMoKQotICAgcmV0dXJuczoKLQotICAgIGNhc2UgU1RBVEV3OgotICAgICAgICB3aGlsZSAod2FudCA8IG5lZWQpIHsKLSAgICAgICAgICAgIE5FRURCSVRTKG4pOwotICAgICAgICAgICAga2VlcFt3YW50KytdID0gQklUUyhuKTsKLSAgICAgICAgICAgIERST1BCSVRTKG4pOwotICAgICAgICB9Ci0gICAgICAgIHN0YXRlID0gU1RBVEV4OwotICAgIGNhc2UgU1RBVEV4OgotCi0gICBBcyBzaG93biBhYm92ZSwgaWYgdGhlIG5leHQgc3RhdGUgaXMgYWxzbyB0aGUgbmV4dCBjYXNlLCB0aGVuIHRoZSBicmVhawotICAgaXMgb21pdHRlZC4KLQotICAgQSBzdGF0ZSBtYXkgYWxzbyByZXR1cm4gaWYgdGhlcmUgaXMgbm90IGVub3VnaCBvdXRwdXQgc3BhY2UgYXZhaWxhYmxlIHRvCi0gICBjb21wbGV0ZSB0aGF0IHN0YXRlLiAgVGhvc2Ugc3RhdGVzIGFyZSBjb3B5aW5nIHN0b3JlZCBkYXRhLCB3cml0aW5nIGEKLSAgIGxpdGVyYWwgYnl0ZSwgYW5kIGNvcHlpbmcgYSBtYXRjaGluZyBzdHJpbmcuCi0KLSAgIFdoZW4gcmV0dXJuaW5nLCBhICJnb3RvIGluZl9sZWF2ZSIgaXMgdXNlZCB0byB1cGRhdGUgdGhlIHRvdGFsIGNvdW50ZXJzLAotICAgdXBkYXRlIHRoZSBjaGVjayB2YWx1ZSwgYW5kIGRldGVybWluZSB3aGV0aGVyIGFueSBwcm9ncmVzcyBoYXMgYmVlbiBtYWRlCi0gICBkdXJpbmcgdGhhdCBpbmZsYXRlKCkgY2FsbCBpbiBvcmRlciB0byByZXR1cm4gdGhlIHByb3BlciByZXR1cm4gY29kZS4KLSAgIFByb2dyZXNzIGlzIGRlZmluZWQgYXMgYSBjaGFuZ2UgaW4gZWl0aGVyIHN0cm0tPmF2YWlsX2luIG9yIHN0cm0tPmF2YWlsX291dC4KLSAgIFdoZW4gdGhlcmUgaXMgYSB3aW5kb3csIGdvdG8gaW5mX2xlYXZlIHdpbGwgdXBkYXRlIHRoZSB3aW5kb3cgd2l0aCB0aGUgbGFzdAotICAgb3V0cHV0IHdyaXR0ZW4uICBJZiBhIGdvdG8gaW5mX2xlYXZlIG9jY3VycyBpbiB0aGUgbWlkZGxlIG9mIGRlY29tcHJlc3Npb24KLSAgIGFuZCB0aGVyZSBpcyBubyB3aW5kb3cgY3VycmVudGx5LCBnb3RvIGluZl9sZWF2ZSB3aWxsIGNyZWF0ZSBvbmUgYW5kIGNvcHkKLSAgIG91dHB1dCB0byB0aGUgd2luZG93IGZvciB0aGUgbmV4dCBjYWxsIG9mIGluZmxhdGUoKS4KLQotICAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgdGhlIGZsdXNoIHBhcmFtZXRlciBvZiBpbmZsYXRlKCkgb25seSBhZmZlY3RzIHRoZQotICAgcmV0dXJuIGNvZGUgKHBlciB6bGliLmgpLiAgaW5mbGF0ZSgpIGFsd2F5cyB3cml0ZXMgYXMgbXVjaCBhcyBwb3NzaWJsZSB0bwotICAgc3RybS0+bmV4dF9vdXQsIGdpdmVuIHRoZSBzcGFjZSBhdmFpbGFibGUgYW5kIHRoZSBwcm92aWRlZCBpbnB1dC0tdGhlIGVmZmVjdAotICAgZG9jdW1lbnRlZCBpbiB6bGliLmggb2YgWl9TWU5DX0ZMVVNILiAgRnVydGhlcm1vcmUsIGluZmxhdGUoKSBhbHdheXMgZGVmZXJzCi0gICB0aGUgYWxsb2NhdGlvbiBvZiBhbmQgY29weWluZyBpbnRvIGEgc2xpZGluZyB3aW5kb3cgdW50aWwgbmVjZXNzYXJ5LCB3aGljaAotICAgcHJvdmlkZXMgdGhlIGVmZmVjdCBkb2N1bWVudGVkIGluIHpsaWIuaCBmb3IgWl9GSU5JU0ggd2hlbiB0aGUgZW50aXJlIGlucHV0Ci0gICBzdHJlYW0gYXZhaWxhYmxlLiAgU28gdGhlIG9ubHkgdGhpbmcgdGhlIGZsdXNoIHBhcmFtZXRlciBhY3R1YWxseSBkb2VzIGlzOgotICAgd2hlbiBmbHVzaCBpcyBzZXQgdG8gWl9GSU5JU0gsIGluZmxhdGUoKSBjYW5ub3QgcmV0dXJuIFpfT0suICBJbnN0ZWFkIGl0Ci0gICB3aWxsIHJldHVybiBaX0JVRl9FUlJPUiBpZiBpdCBoYXMgbm90IHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLgotICovCi0KLWludCBaRVhQT1JUIGluZmxhdGUoCi16X3N0cmVhbXAgc3RybSwKLWludCBmbHVzaCkKLXsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotICAgIHpfY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKm5leHQ7ICAgIC8qIG5leHQgaW5wdXQgKi8KLSAgICB1bnNpZ25lZCBjaGFyIEZBUiAqcHV0OyAgICAgLyogbmV4dCBvdXRwdXQgKi8KLSAgICB1bnNpZ25lZCBoYXZlLCBsZWZ0OyAgICAgICAgLyogYXZhaWxhYmxlIGlucHV0IGFuZCBvdXRwdXQgKi8KLSAgICB1bnNpZ25lZCBsb25nIGhvbGQ7ICAgICAgICAgLyogYml0IGJ1ZmZlciAqLwotICAgIHVuc2lnbmVkIGJpdHM7ICAgICAgICAgICAgICAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8KLSAgICB1bnNpZ25lZCBpbiwgb3V0OyAgICAgICAgICAgLyogc2F2ZSBzdGFydGluZyBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqLwotICAgIHVuc2lnbmVkIGNvcHk7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi8KLSAgICB1bnNpZ25lZCBjaGFyIEZBUiAqZnJvbTsgICAgLyogd2hlcmUgdG8gY29weSBtYXRjaCBieXRlcyBmcm9tICovCi0gICAgY29kZSBoZXJlOyAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgZGVjb2RpbmcgdGFibGUgZW50cnkgKi8KLSAgICBjb2RlIGxhc3Q7ICAgICAgICAgICAgICAgICAgLyogcGFyZW50IHRhYmxlIGVudHJ5ICovCi0gICAgdW5zaWduZWQgbGVuOyAgICAgICAgICAgICAgIC8qIGxlbmd0aCB0byBjb3B5IGZvciByZXBlYXRzLCBiaXRzIHRvIGRyb3AgKi8KLSAgICBpbnQgcmV0OyAgICAgICAgICAgICAgICAgICAgLyogcmV0dXJuIGNvZGUgKi8KLSNpZmRlZiBHVU5aSVAKLSAgICB1bnNpZ25lZCBjaGFyIGhidWZbNF07ICAgICAgLyogYnVmZmVyIGZvciBnemlwIGhlYWRlciBjcmMgY2FsY3VsYXRpb24gKi8KLSNlbmRpZgotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBvcmRlclsxOV0gPSAvKiBwZXJtdXRhdGlvbiBvZiBjb2RlIGxlbmd0aHMgKi8KLSAgICAgICAgezE2LCAxNywgMTgsIDAsIDgsIDcsIDksIDYsIDEwLCA1LCAxMSwgNCwgMTIsIDMsIDEzLCAyLCAxNCwgMSwgMTV9OwotCi0gICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCB8fCBzdHJtLT5uZXh0X291dCA9PSBaX05VTEwgfHwKLSAgICAgICAgKHN0cm0tPm5leHRfaW4gPT0gWl9OVUxMICYmIHN0cm0tPmF2YWlsX2luICE9IDApKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0KLSAgICBzdGF0ZSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKilzdHJtLT5zdGF0ZTsKLSAgICBpZiAoc3RhdGUtPm1vZGUgPT0gVFlQRSkgc3RhdGUtPm1vZGUgPSBUWVBFRE87ICAgICAgLyogc2tpcCBjaGVjayAqLwotICAgIExPQUQoKTsKLSAgICBpbiA9IGhhdmU7Ci0gICAgb3V0ID0gbGVmdDsKLSAgICByZXQgPSBaX09LOwotICAgIGZvciAoOzspCi0gICAgICAgIHN3aXRjaCAoc3RhdGUtPm1vZGUpIHsKLSAgICAgICAgY2FzZSBIRUFEOgotICAgICAgICAgICAgaWYgKHN0YXRlLT53cmFwID09IDApIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IFRZUEVETzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE5FRURCSVRTKDE2KTsKLSNpZmRlZiBHVU5aSVAKLSAgICAgICAgICAgIGlmICgoc3RhdGUtPndyYXAgJiAyKSAmJiBob2xkID09IDB4OGIxZikgeyAgLyogZ3ppcCBoZWFkZXIgKi8KLSAgICAgICAgICAgICAgICBzdGF0ZS0+Y2hlY2sgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKLSAgICAgICAgICAgICAgICBDUkMyKHN0YXRlLT5jaGVjaywgaG9sZCk7Ci0gICAgICAgICAgICAgICAgSU5JVEJJVFMoKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEZMQUdTOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGUtPmZsYWdzID0gMDsgICAgICAgICAgIC8qIGV4cGVjdCB6bGliIGhlYWRlciAqLwotICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKLSAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+ZG9uZSA9IC0xOwotICAgICAgICAgICAgaWYgKCEoc3RhdGUtPndyYXAgJiAxKSB8fCAgIC8qIGNoZWNrIGlmIHpsaWIgaGVhZGVyIGFsbG93ZWQgKi8KLSNlbHNlCi0gICAgICAgICAgICBpZiAoCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAoKEJJVFMoOCkgPDwgOCkgKyAoaG9sZCA+PiA4KSkgJSAzMSkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImluY29ycmVjdCBoZWFkZXIgY2hlY2siOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKEJJVFMoNCkgIT0gWl9ERUZMQVRFRCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInVua25vd24gY29tcHJlc3Npb24gbWV0aG9kIjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERST1BCSVRTKDQpOwotICAgICAgICAgICAgbGVuID0gQklUUyg0KSArIDg7Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPndiaXRzID09IDApCi0gICAgICAgICAgICAgICAgc3RhdGUtPndiaXRzID0gbGVuOwotICAgICAgICAgICAgZWxzZSBpZiAobGVuID4gc3RhdGUtPndiaXRzKSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCB3aW5kb3cgc2l6ZSI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZS0+ZG1heCA9IDFVIDw8IGxlbjsKLSAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICB6bGliIGhlYWRlciBva1xuIikpOwotICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+Y2hlY2sgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBob2xkICYgMHgyMDAgPyBESUNUSUQgOiBUWVBFOwotICAgICAgICAgICAgSU5JVEJJVFMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotI2lmZGVmIEdVTlpJUAotICAgICAgICBjYXNlIEZMQUdTOgotICAgICAgICAgICAgTkVFREJJVFMoMTYpOwotICAgICAgICAgICAgc3RhdGUtPmZsYWdzID0gKGludCkoaG9sZCk7Ci0gICAgICAgICAgICBpZiAoKHN0YXRlLT5mbGFncyAmIDB4ZmYpICE9IFpfREVGTEFURUQpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJ1bmtub3duIGNvbXByZXNzaW9uIG1ldGhvZCI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHhlMDAwKSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikidW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0IjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwpCi0gICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPnRleHQgPSAoaW50KSgoaG9sZCA+PiA4KSAmIDEpOwotICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkgQ1JDMihzdGF0ZS0+Y2hlY2ssIGhvbGQpOwotICAgICAgICAgICAgSU5JVEJJVFMoKTsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVElNRTsKLSAgICAgICAgY2FzZSBUSU1FOgotICAgICAgICAgICAgTkVFREJJVFMoMzIpOwotICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKLSAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+dGltZSA9IGhvbGQ7Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKSBDUkM0KHN0YXRlLT5jaGVjaywgaG9sZCk7Ci0gICAgICAgICAgICBJTklUQklUUygpOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBPUzsKLSAgICAgICAgY2FzZSBPUzoKLSAgICAgICAgICAgIE5FRURCSVRTKDE2KTsKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+aGVhZCAhPSBaX05VTEwpIHsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+eGZsYWdzID0gKGludCkoaG9sZCAmIDB4ZmYpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5vcyA9IChpbnQpKGhvbGQgPj4gOCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKSBDUkMyKHN0YXRlLT5jaGVjaywgaG9sZCk7Ci0gICAgICAgICAgICBJTklUQklUUygpOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBFWExFTjsKLSAgICAgICAgY2FzZSBFWExFTjoKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDA0MDApIHsKLSAgICAgICAgICAgICAgICBORUVEQklUUygxNik7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9ICh1bnNpZ25lZCkoaG9sZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmV4dHJhX2xlbiA9ICh1bnNpZ25lZClob2xkOwotICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDAyMDApIENSQzIoc3RhdGUtPmNoZWNrLCBob2xkKTsKLSAgICAgICAgICAgICAgICBJTklUQklUUygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKQotICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5leHRyYSA9IFpfTlVMTDsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRVhUUkE7Ci0gICAgICAgIGNhc2UgRVhUUkE6Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwNDAwKSB7Ci0gICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSBjb3B5ID0gaGF2ZTsKLSAgICAgICAgICAgICAgICBpZiAoY29weSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+ZXh0cmEgIT0gWl9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBzdGF0ZS0+aGVhZC0+ZXh0cmFfbGVuIC0gc3RhdGUtPmxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHptZW1jcHkoc3RhdGUtPmhlYWQtPmV4dHJhICsgbGVuLCBuZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4gKyBjb3B5ID4gc3RhdGUtPmhlYWQtPmV4dHJhX21heCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5leHRyYV9tYXggLSBsZW4gOiBjb3B5KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKQotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmNoZWNrID0gY3JjMzIoc3RhdGUtPmNoZWNrLCBuZXh0LCBjb3B5KTsKLSAgICAgICAgICAgICAgICAgICAgaGF2ZSAtPSBjb3B5OwotICAgICAgICAgICAgICAgICAgICBuZXh0ICs9IGNvcHk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggLT0gY29weTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5sZW5ndGgpIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9IDA7Ci0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IE5BTUU7Ci0gICAgICAgIGNhc2UgTkFNRToKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDA4MDApIHsKLSAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PSAwKSBnb3RvIGluZl9sZWF2ZTsKLSAgICAgICAgICAgICAgICBjb3B5ID0gMDsKLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgIGxlbiA9ICh1bnNpZ25lZCkobmV4dFtjb3B5KytdKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5uYW1lICE9IFpfTlVMTCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPCBzdGF0ZS0+aGVhZC0+bmFtZV9tYXgpCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+bmFtZVtzdGF0ZS0+bGVuZ3RoKytdID0gbGVuOwotICAgICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmNoZWNrID0gY3JjMzIoc3RhdGUtPmNoZWNrLCBuZXh0LCBjb3B5KTsKLSAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7Ci0gICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OwotICAgICAgICAgICAgICAgIGlmIChsZW4pIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKQotICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5uYW1lID0gWl9OVUxMOwotICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCA9IDA7Ci0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IENPTU1FTlQ7Ci0gICAgICAgIGNhc2UgQ09NTUVOVDoKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+ZmxhZ3MgJiAweDEwMDApIHsKLSAgICAgICAgICAgICAgICBpZiAoaGF2ZSA9PSAwKSBnb3RvIGluZl9sZWF2ZTsKLSAgICAgICAgICAgICAgICBjb3B5ID0gMDsKLSAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgIGxlbiA9ICh1bnNpZ25lZCkobmV4dFtjb3B5KytdKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oZWFkICE9IFpfTlVMTCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5jb21tZW50ICE9IFpfTlVMTCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGggPCBzdGF0ZS0+aGVhZC0+Y29tbV9tYXgpCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+aGVhZC0+Y29tbWVudFtzdGF0ZS0+bGVuZ3RoKytdID0gbGVuOwotICAgICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5mbGFncyAmIDB4MDIwMCkKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmNoZWNrID0gY3JjMzIoc3RhdGUtPmNoZWNrLCBuZXh0LCBjb3B5KTsKLSAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7Ci0gICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OwotICAgICAgICAgICAgICAgIGlmIChsZW4pIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKQotICAgICAgICAgICAgICAgIHN0YXRlLT5oZWFkLT5jb21tZW50ID0gWl9OVUxMOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBIQ1JDOwotICAgICAgICBjYXNlIEhDUkM6Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPmZsYWdzICYgMHgwMjAwKSB7Ci0gICAgICAgICAgICAgICAgTkVFREJJVFMoMTYpOwotICAgICAgICAgICAgICAgIGlmIChob2xkICE9IChzdGF0ZS0+Y2hlY2sgJiAweGZmZmYpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImhlYWRlciBjcmMgbWlzbWF0Y2giOwotICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIElOSVRCSVRTKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPmhlYWQgIT0gWl9OVUxMKSB7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmhjcmMgPSAoaW50KSgoc3RhdGUtPmZsYWdzID4+IDkpICYgMSk7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPmhlYWQtPmRvbmUgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+Y2hlY2sgPSBjcmMzMigwTCwgWl9OVUxMLCAwKTsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKLSAgICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgIGNhc2UgRElDVElEOgotICAgICAgICAgICAgTkVFREJJVFMoMzIpOwotICAgICAgICAgICAgc3RybS0+YWRsZXIgPSBzdGF0ZS0+Y2hlY2sgPSBaU1dBUDMyKGhvbGQpOwotICAgICAgICAgICAgSU5JVEJJVFMoKTsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRElDVDsKLSAgICAgICAgY2FzZSBESUNUOgotICAgICAgICAgICAgaWYgKHN0YXRlLT5oYXZlZGljdCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgUkVTVE9SRSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBaX05FRURfRElDVDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0gYWRsZXIzMigwTCwgWl9OVUxMLCAwKTsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKLSAgICAgICAgY2FzZSBUWVBFOgotICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfQkxPQ0sgfHwgZmx1c2ggPT0gWl9UUkVFUykgZ290byBpbmZfbGVhdmU7Ci0gICAgICAgIGNhc2UgVFlQRURPOgotICAgICAgICAgICAgaWYgKHN0YXRlLT5sYXN0KSB7Ci0gICAgICAgICAgICAgICAgQllURUJJVFMoKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IENIRUNLOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTkVFREJJVFMoMyk7Ci0gICAgICAgICAgICBzdGF0ZS0+bGFzdCA9IEJJVFMoMSk7Ci0gICAgICAgICAgICBEUk9QQklUUygxKTsKLSAgICAgICAgICAgIHN3aXRjaCAoQklUUygyKSkgewotICAgICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGJsb2NrICovCi0gICAgICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgc3RvcmVkIGJsb2NrJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBTVE9SRUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmaXhlZCBibG9jayAqLwotICAgICAgICAgICAgICAgIGZpeGVkdGFibGVzKHN0YXRlKTsKLSAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBmaXhlZCBjb2RlcyBibG9jayVzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3QgPyAiIChsYXN0KSIgOiAiIikpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOXzsgICAgICAgICAgICAgLyogZGVjb2RlIGNvZGVzICovCi0gICAgICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfVFJFRVMpIHsKLSAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMik7Ci0gICAgICAgICAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICBkeW5hbWljIGNvZGVzIGJsb2NrJXNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bGFzdCA/ICIgKGxhc3QpIiA6ICIiKSk7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUQUJMRTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJsb2NrIHR5cGUiOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRFJPUEJJVFMoMik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVE9SRUQ6Ci0gICAgICAgICAgICBCWVRFQklUUygpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICovCi0gICAgICAgICAgICBORUVEQklUUygzMik7Ci0gICAgICAgICAgICBpZiAoKGhvbGQgJiAweGZmZmYpICE9ICgoaG9sZCA+PiAxNikgXiAweGZmZmYpKSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocyI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoID0gKHVuc2lnbmVkKWhvbGQgJiAweGZmZmY7Ci0gICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHN0b3JlZCBsZW5ndGggJXVcbiIsCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5ndGgpKTsKLSAgICAgICAgICAgIElOSVRCSVRTKCk7Ci0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IENPUFlfOwotICAgICAgICAgICAgaWYgKGZsdXNoID09IFpfVFJFRVMpIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICBjYXNlIENPUFlfOgotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBDT1BZOwotICAgICAgICBjYXNlIENPUFk6Ci0gICAgICAgICAgICBjb3B5ID0gc3RhdGUtPmxlbmd0aDsKLSAgICAgICAgICAgIGlmIChjb3B5KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBoYXZlKSBjb3B5ID0gaGF2ZTsKLSAgICAgICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIGNvcHkgPSBsZWZ0OwotICAgICAgICAgICAgICAgIGlmIChjb3B5ID09IDApIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICAgICAgICAgIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsKLSAgICAgICAgICAgICAgICBoYXZlIC09IGNvcHk7Ci0gICAgICAgICAgICAgICAgbmV4dCArPSBjb3B5OwotICAgICAgICAgICAgICAgIGxlZnQgLT0gY29weTsKLSAgICAgICAgICAgICAgICBwdXQgKz0gY29weTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoIC09IGNvcHk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIHN0b3JlZCBlbmRcbiIpKTsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRBQkxFOgotICAgICAgICAgICAgTkVFREJJVFMoMTQpOwotICAgICAgICAgICAgc3RhdGUtPm5sZW4gPSBCSVRTKDUpICsgMjU3OwotICAgICAgICAgICAgRFJPUEJJVFMoNSk7Ci0gICAgICAgICAgICBzdGF0ZS0+bmRpc3QgPSBCSVRTKDUpICsgMTsKLSAgICAgICAgICAgIERST1BCSVRTKDUpOwotICAgICAgICAgICAgc3RhdGUtPm5jb2RlID0gQklUUyg0KSArIDQ7Ci0gICAgICAgICAgICBEUk9QQklUUyg0KTsKLSNpZm5kZWYgUEtaSVBfQlVHX1dPUktBUk9VTkQKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+bmxlbiA+IDI4NiB8fCBzdGF0ZS0+bmRpc3QgPiAzMCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopInRvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzIjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgVHJhY2V2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xuIikpOwotICAgICAgICAgICAgc3RhdGUtPmhhdmUgPSAwOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBMRU5MRU5TOwotICAgICAgICBjYXNlIExFTkxFTlM6Ci0gICAgICAgICAgICB3aGlsZSAoc3RhdGUtPmhhdmUgPCBzdGF0ZS0+bmNvZGUpIHsKLSAgICAgICAgICAgICAgICBORUVEQklUUygzKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuc1tvcmRlcltzdGF0ZS0+aGF2ZSsrXV0gPSAodW5zaWduZWQgc2hvcnQpQklUUygzKTsKLSAgICAgICAgICAgICAgICBEUk9QQklUUygzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdoaWxlIChzdGF0ZS0+aGF2ZSA8IDE5KQotICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW29yZGVyW3N0YXRlLT5oYXZlKytdXSA9IDA7Ci0gICAgICAgICAgICBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKLSAgICAgICAgICAgIHN0YXRlLT5sZW5jb2RlID0gKGNvbnN0IGNvZGUgRkFSICopKHN0YXRlLT5uZXh0KTsKLSAgICAgICAgICAgIHN0YXRlLT5sZW5iaXRzID0gNzsKLSAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoQ09ERVMsIHN0YXRlLT5sZW5zLCAxOSwgJihzdGF0ZS0+bmV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RhdGUtPmxlbmJpdHMpLCBzdGF0ZS0+d29yayk7Ci0gICAgICAgICAgICBpZiAocmV0KSB7Ci0gICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0IjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgY29kZSBsZW5ndGhzIG9rXG4iKSk7Ci0gICAgICAgICAgICBzdGF0ZS0+aGF2ZSA9IDA7Ci0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IENPREVMRU5TOwotICAgICAgICBjYXNlIENPREVMRU5TOgotICAgICAgICAgICAgd2hpbGUgKHN0YXRlLT5oYXZlIDwgc3RhdGUtPm5sZW4gKyBzdGF0ZS0+bmRpc3QpIHsKLSAgICAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+bGVuY29kZVtCSVRTKHN0YXRlLT5sZW5iaXRzKV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodW5zaWduZWQpKGhlcmUuYml0cykgPD0gYml0cykgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChoZXJlLnZhbCA8IDE2KSB7Ci0gICAgICAgICAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gaGVyZS52YWw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoaGVyZS52YWwgPT0gMTYpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+aGF2ZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBsZW4gPSBzdGF0ZS0+bGVuc1tzdGF0ZS0+aGF2ZSAtIDFdOwotICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IDMgKyBCSVRTKDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoMik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaGVyZS52YWwgPT0gMTcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMyArIEJJVFMoMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBEUk9QQklUUygzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5FRURCSVRTKGhlcmUuYml0cyArIDcpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoaGVyZS5iaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb3B5ID0gMTEgKyBCSVRTKDcpOwotICAgICAgICAgICAgICAgICAgICAgICAgRFJPUEJJVFMoNyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLT5oYXZlICsgY29weSA+IHN0YXRlLT5ubGVuICsgc3RhdGUtPm5kaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0IjsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvcHktLSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5sZW5zW3N0YXRlLT5oYXZlKytdID0gKHVuc2lnbmVkIHNob3J0KWxlbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIGhhbmRsZSBlcnJvciBicmVha3MgaW4gd2hpbGUgKi8KLSAgICAgICAgICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBCQUQpIGJyZWFrOwotCi0gICAgICAgICAgICAvKiBjaGVjayBmb3IgZW5kLW9mLWJsb2NrIGNvZGUgKGJldHRlciBoYXZlIG9uZSkgKi8KLSAgICAgICAgICAgIGlmIChzdGF0ZS0+bGVuc1syNTZdID09IDApIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2siOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBidWlsZCBjb2RlIHRhYmxlcyAtLSBub3RlOiBkbyBub3QgY2hhbmdlIHRoZSBsZW5iaXRzIG9yIGRpc3RiaXRzCi0gICAgICAgICAgICAgICB2YWx1ZXMgaGVyZSAoOSBhbmQgNikgd2l0aG91dCByZWFkaW5nIHRoZSBjb21tZW50cyBpbiBpbmZ0cmVlcy5oCi0gICAgICAgICAgICAgICBjb25jZXJuaW5nIHRoZSBFTk9VR0ggY29uc3RhbnRzLCB3aGljaCBkZXBlbmQgb24gdGhvc2UgdmFsdWVzICovCi0gICAgICAgICAgICBzdGF0ZS0+bmV4dCA9IHN0YXRlLT5jb2RlczsKLSAgICAgICAgICAgIHN0YXRlLT5sZW5jb2RlID0gKGNvbnN0IGNvZGUgRkFSICopKHN0YXRlLT5uZXh0KTsKLSAgICAgICAgICAgIHN0YXRlLT5sZW5iaXRzID0gOTsKLSAgICAgICAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUtPmxlbnMsIHN0YXRlLT5ubGVuLCAmKHN0YXRlLT5uZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bGVuYml0cyksIHN0YXRlLT53b3JrKTsKLSAgICAgICAgICAgIGlmIChyZXQpIHsKLSAgICAgICAgICAgICAgICBzdHJtLT5tc2cgPSAoY2hhciAqKSJpbnZhbGlkIGxpdGVyYWwvbGVuZ3RocyBzZXQiOwotICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGUtPmRpc3Rjb2RlID0gKGNvbnN0IGNvZGUgRkFSICopKHN0YXRlLT5uZXh0KTsKLSAgICAgICAgICAgIHN0YXRlLT5kaXN0Yml0cyA9IDY7Ci0gICAgICAgICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS0+bGVucyArIHN0YXRlLT5ubGVuLCBzdGF0ZS0+bmRpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGF0ZS0+bmV4dCksICYoc3RhdGUtPmRpc3RiaXRzKSwgc3RhdGUtPndvcmspOwotICAgICAgICAgICAgaWYgKHJldCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2VzIHNldCI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgIGNvZGVzIG9rXG4iKSk7Ci0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTl87Ci0gICAgICAgICAgICBpZiAoZmx1c2ggPT0gWl9UUkVFUykgZ290byBpbmZfbGVhdmU7Ci0gICAgICAgIGNhc2UgTEVOXzoKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOwotICAgICAgICBjYXNlIExFTjoKLSAgICAgICAgICAgIGlmIChoYXZlID49IDYgJiYgbGVmdCA+PSAyNTgpIHsKLSAgICAgICAgICAgICAgICBSRVNUT1JFKCk7Ci0gICAgICAgICAgICAgICAgaW5mbGF0ZV9mYXN0KHN0cm0sIG91dCk7Ci0gICAgICAgICAgICAgICAgTE9BRCgpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBUWVBFKQotICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+YmFjayA9IC0xOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdGUtPmJhY2sgPSAwOwotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+bGVuY29kZVtCSVRTKHN0YXRlLT5sZW5iaXRzKV07Ci0gICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkoaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKLSAgICAgICAgICAgICAgICBQVUxMQllURSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGhlcmUub3AgJiYgKGhlcmUub3AgJiAweGYwKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbGFzdCA9IGhlcmU7Ci0gICAgICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUtPmxlbmNvZGVbbGFzdC52YWwgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApID4+IGxhc3QuYml0cyldOwotICAgICAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShsYXN0LmJpdHMgKyBoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBQVUxMQllURSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBEUk9QQklUUyhsYXN0LmJpdHMpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5iYWNrICs9IGxhc3QuYml0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIERST1BCSVRTKGhlcmUuYml0cyk7Ci0gICAgICAgICAgICBzdGF0ZS0+YmFjayArPSBoZXJlLmJpdHM7Ci0gICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoID0gKHVuc2lnbmVkKWhlcmUudmFsOwotICAgICAgICAgICAgaWYgKChpbnQpKGhlcmUub3ApID09IDApIHsKLSAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID8KLSAgICAgICAgICAgICAgICAgICAgICAgICJpbmZsYXRlOiAgICAgICAgIGxpdGVyYWwgJyVjJ1xuIiA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsIDB4JTAyeFxuIiwgaGVyZS52YWwpKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExJVDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChoZXJlLm9wICYgMzIpIHsKLSAgICAgICAgICAgICAgICBUcmFjZXZ2KChzdGRlcnIsICJpbmZsYXRlOiAgICAgICAgIGVuZCBvZiBibG9ja1xuIikpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5iYWNrID0gLTE7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBUWVBFOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGhlcmUub3AgJiA2NCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZS0+ZXh0cmEgPSAodW5zaWduZWQpKGhlcmUub3ApICYgMTU7Ci0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IExFTkVYVDsKLSAgICAgICAgY2FzZSBMRU5FWFQ6Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPmV4dHJhKSB7Ci0gICAgICAgICAgICAgICAgTkVFREJJVFMoc3RhdGUtPmV4dHJhKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bGVuZ3RoICs9IEJJVFMoc3RhdGUtPmV4dHJhKTsKLSAgICAgICAgICAgICAgICBEUk9QQklUUyhzdGF0ZS0+ZXh0cmEpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5iYWNrICs9IHN0YXRlLT5leHRyYTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRyYWNldnYoKHN0ZGVyciwgImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XG4iLCBzdGF0ZS0+bGVuZ3RoKSk7Ci0gICAgICAgICAgICBzdGF0ZS0+d2FzID0gc3RhdGUtPmxlbmd0aDsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gRElTVDsKLSAgICAgICAgY2FzZSBESVNUOgotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIGhlcmUgPSBzdGF0ZS0+ZGlzdGNvZGVbQklUUyhzdGF0ZS0+ZGlzdGJpdHMpXTsKLSAgICAgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKShoZXJlLmJpdHMpIDw9IGJpdHMpIGJyZWFrOwotICAgICAgICAgICAgICAgIFBVTExCWVRFKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGhlcmUub3AgJiAweGYwKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgbGFzdCA9IGhlcmU7Ci0gICAgICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgICAgICBoZXJlID0gc3RhdGUtPmRpc3Rjb2RlW2xhc3QudmFsICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQklUUyhsYXN0LmJpdHMgKyBsYXN0Lm9wKSA+PiBsYXN0LmJpdHMpXTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkobGFzdC5iaXRzICsgaGVyZS5iaXRzKSA8PSBiaXRzKSBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgUFVMTEJZVEUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgRFJPUEJJVFMobGFzdC5iaXRzKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+YmFjayArPSBsYXN0LmJpdHM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEUk9QQklUUyhoZXJlLmJpdHMpOwotICAgICAgICAgICAgc3RhdGUtPmJhY2sgKz0gaGVyZS5iaXRzOwotICAgICAgICAgICAgaWYgKGhlcmUub3AgJiA2NCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgY29kZSI7Ci0gICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0ZS0+b2Zmc2V0ID0gKHVuc2lnbmVkKWhlcmUudmFsOwotICAgICAgICAgICAgc3RhdGUtPmV4dHJhID0gKHVuc2lnbmVkKShoZXJlLm9wKSAmIDE1OwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBESVNURVhUOwotICAgICAgICBjYXNlIERJU1RFWFQ6Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPmV4dHJhKSB7Ci0gICAgICAgICAgICAgICAgTkVFREJJVFMoc3RhdGUtPmV4dHJhKTsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+b2Zmc2V0ICs9IEJJVFMoc3RhdGUtPmV4dHJhKTsKLSAgICAgICAgICAgICAgICBEUk9QQklUUyhzdGF0ZS0+ZXh0cmEpOwotICAgICAgICAgICAgICAgIHN0YXRlLT5iYWNrICs9IHN0YXRlLT5leHRyYTsKLSAgICAgICAgICAgIH0KLSNpZmRlZiBJTkZMQVRFX1NUUklDVAotICAgICAgICAgICAgaWYgKHN0YXRlLT5vZmZzZXQgPiBzdGF0ZS0+ZG1heCkgewotICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrIjsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IEJBRDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgVHJhY2V2digoc3RkZXJyLCAiaW5mbGF0ZTogICAgICAgICBkaXN0YW5jZSAldVxuIiwgc3RhdGUtPm9mZnNldCkpOwotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBNQVRDSDsKLSAgICAgICAgY2FzZSBNQVRDSDoKLSAgICAgICAgICAgIGlmIChsZWZ0ID09IDApIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICAgICAgY29weSA9IG91dCAtIGxlZnQ7Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPm9mZnNldCA+IGNvcHkpIHsgICAgICAgICAvKiBjb3B5IGZyb20gd2luZG93ICovCi0gICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT5vZmZzZXQgLSBjb3B5OwotICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPndoYXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS0+c2FuZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2siOwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUgotICAgICAgICAgICAgICAgICAgICBUcmFjZSgoc3RkZXJyLCAiaW5mbGF0ZS5jIHRvbyBmYXJcbiIpKTsKLSAgICAgICAgICAgICAgICAgICAgY29weSAtPSBzdGF0ZS0+d2hhdmU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPmxlbmd0aCkgY29weSA9IHN0YXRlLT5sZW5ndGg7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gbGVmdCkgY29weSA9IGxlZnQ7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgLT0gY29weTsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCAtPSBjb3B5OwotICAgICAgICAgICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqcHV0KysgPSAwOwotICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUtPmxlbmd0aCA9PSAwKSBzdGF0ZS0+bW9kZSA9IExFTjsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS0+d25leHQpIHsKLSAgICAgICAgICAgICAgICAgICAgY29weSAtPSBzdGF0ZS0+d25leHQ7Ci0gICAgICAgICAgICAgICAgICAgIGZyb20gPSBzdGF0ZS0+d2luZG93ICsgKHN0YXRlLT53c2l6ZSAtIGNvcHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIGZyb20gPSBzdGF0ZS0+d2luZG93ICsgKHN0YXRlLT53bmV4dCAtIGNvcHkpOwotICAgICAgICAgICAgICAgIGlmIChjb3B5ID4gc3RhdGUtPmxlbmd0aCkgY29weSA9IHN0YXRlLT5sZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IGZyb20gb3V0cHV0ICovCi0gICAgICAgICAgICAgICAgZnJvbSA9IHB1dCAtIHN0YXRlLT5vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgY29weSA9IHN0YXRlLT5sZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY29weSA+IGxlZnQpIGNvcHkgPSBsZWZ0OwotICAgICAgICAgICAgbGVmdCAtPSBjb3B5OwotICAgICAgICAgICAgc3RhdGUtPmxlbmd0aCAtPSBjb3B5OwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICpwdXQrKyA9ICpmcm9tKys7Ci0gICAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpOwotICAgICAgICAgICAgaWYgKHN0YXRlLT5sZW5ndGggPT0gMCkgc3RhdGUtPm1vZGUgPSBMRU47Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMSVQ6Ci0gICAgICAgICAgICBpZiAobGVmdCA9PSAwKSBnb3RvIGluZl9sZWF2ZTsKLSAgICAgICAgICAgICpwdXQrKyA9ICh1bnNpZ25lZCBjaGFyKShzdGF0ZS0+bGVuZ3RoKTsKLSAgICAgICAgICAgIGxlZnQtLTsKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ0hFQ0s6Ci0gICAgICAgICAgICBpZiAoc3RhdGUtPndyYXApIHsKLSAgICAgICAgICAgICAgICBORUVEQklUUygzMik7Ci0gICAgICAgICAgICAgICAgb3V0IC09IGxlZnQ7Ci0gICAgICAgICAgICAgICAgc3RybS0+dG90YWxfb3V0ICs9IG91dDsKLSAgICAgICAgICAgICAgICBzdGF0ZS0+dG90YWwgKz0gb3V0OwotICAgICAgICAgICAgICAgIGlmIChvdXQpCi0gICAgICAgICAgICAgICAgICAgIHN0cm0tPmFkbGVyID0gc3RhdGUtPmNoZWNrID0KLSAgICAgICAgICAgICAgICAgICAgICAgIFVQREFURShzdGF0ZS0+Y2hlY2ssIHB1dCAtIG91dCwgb3V0KTsKLSAgICAgICAgICAgICAgICBvdXQgPSBsZWZ0OwotICAgICAgICAgICAgICAgIGlmICgoCi0jaWZkZWYgR1VOWklQCi0gICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+ZmxhZ3MgPyBob2xkIDoKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgWlNXQVAzMihob2xkKSkgIT0gc3RhdGUtPmNoZWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cm0tPm1zZyA9IChjaGFyICopImluY29ycmVjdCBkYXRhIGNoZWNrIjsKLSAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBCQUQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBJTklUQklUUygpOwotICAgICAgICAgICAgICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICBjaGVjayBtYXRjaGVzIHRyYWlsZXJcbiIpKTsKLSAgICAgICAgICAgIH0KLSNpZmRlZiBHVU5aSVAKLSAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gTEVOR1RIOwotICAgICAgICBjYXNlIExFTkdUSDoKLSAgICAgICAgICAgIGlmIChzdGF0ZS0+d3JhcCAmJiBzdGF0ZS0+ZmxhZ3MpIHsKLSAgICAgICAgICAgICAgICBORUVEQklUUygzMik7Ci0gICAgICAgICAgICAgICAgaWYgKGhvbGQgIT0gKHN0YXRlLT50b3RhbCAmIDB4ZmZmZmZmZmZVTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3RybS0+bXNnID0gKGNoYXIgKikiaW5jb3JyZWN0IGxlbmd0aCBjaGVjayI7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tb2RlID0gQkFEOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSU5JVEJJVFMoKTsKLSAgICAgICAgICAgICAgICBUcmFjZXYoKHN0ZGVyciwgImluZmxhdGU6ICAgbGVuZ3RoIG1hdGNoZXMgdHJhaWxlclxuIikpOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICBzdGF0ZS0+bW9kZSA9IERPTkU7Ci0gICAgICAgIGNhc2UgRE9ORToKLSAgICAgICAgICAgIHJldCA9IFpfU1RSRUFNX0VORDsKLSAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICBjYXNlIEJBRDoKLSAgICAgICAgICAgIHJldCA9IFpfREFUQV9FUlJPUjsKLSAgICAgICAgICAgIGdvdG8gaW5mX2xlYXZlOwotICAgICAgICBjYXNlIE1FTToKLSAgICAgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKLSAgICAgICAgY2FzZSBTWU5DOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAvKgotICAgICAgIFJldHVybiBmcm9tIGluZmxhdGUoKSwgdXBkYXRpbmcgdGhlIHRvdGFsIGNvdW50cyBhbmQgdGhlIGNoZWNrIHZhbHVlLgotICAgICAgIElmIHRoZXJlIHdhcyBubyBwcm9ncmVzcyBkdXJpbmcgdGhlIGluZmxhdGUoKSBjYWxsLCByZXR1cm4gYSBidWZmZXIKLSAgICAgICBlcnJvci4gIENhbGwgdXBkYXRld2luZG93KCkgdG8gY3JlYXRlIGFuZC9vciB1cGRhdGUgdGhlIHdpbmRvdyBzdGF0ZS4KLSAgICAgICBOb3RlOiBhIG1lbW9yeSBlcnJvciBmcm9tIGluZmxhdGUoKSBpcyBub24tcmVjb3ZlcmFibGUuCi0gICAgICovCi0gIGluZl9sZWF2ZToKLSAgICBSRVNUT1JFKCk7Ci0gICAgaWYgKHN0YXRlLT53c2l6ZSB8fCAob3V0ICE9IHN0cm0tPmF2YWlsX291dCAmJiBzdGF0ZS0+bW9kZSA8IEJBRCAmJgotICAgICAgICAgICAgKHN0YXRlLT5tb2RlIDwgQ0hFQ0sgfHwgZmx1c2ggIT0gWl9GSU5JU0gpKSkKLSAgICAgICAgaWYgKHVwZGF0ZXdpbmRvdyhzdHJtLCBzdHJtLT5uZXh0X291dCwgb3V0IC0gc3RybS0+YXZhaWxfb3V0KSkgewotICAgICAgICAgICAgc3RhdGUtPm1vZGUgPSBNRU07Ci0gICAgICAgICAgICByZXR1cm4gWl9NRU1fRVJST1I7Ci0gICAgICAgIH0KLSAgICBpbiAtPSBzdHJtLT5hdmFpbF9pbjsKLSAgICBvdXQgLT0gc3RybS0+YXZhaWxfb3V0OwotICAgIHN0cm0tPnRvdGFsX2luICs9IGluOwotICAgIHN0cm0tPnRvdGFsX291dCArPSBvdXQ7Ci0gICAgc3RhdGUtPnRvdGFsICs9IG91dDsKLSAgICBpZiAoc3RhdGUtPndyYXAgJiYgb3V0KQotICAgICAgICBzdHJtLT5hZGxlciA9IHN0YXRlLT5jaGVjayA9Ci0gICAgICAgICAgICBVUERBVEUoc3RhdGUtPmNoZWNrLCBzdHJtLT5uZXh0X291dCAtIG91dCwgb3V0KTsKLSAgICBzdHJtLT5kYXRhX3R5cGUgPSBzdGF0ZS0+Yml0cyArIChzdGF0ZS0+bGFzdCA/IDY0IDogMCkgKwotICAgICAgICAgICAgICAgICAgICAgIChzdGF0ZS0+bW9kZSA9PSBUWVBFID8gMTI4IDogMCkgKwotICAgICAgICAgICAgICAgICAgICAgIChzdGF0ZS0+bW9kZSA9PSBMRU5fIHx8IHN0YXRlLT5tb2RlID09IENPUFlfID8gMjU2IDogMCk7Ci0gICAgaWYgKCgoaW4gPT0gMCAmJiBvdXQgPT0gMCkgfHwgZmx1c2ggPT0gWl9GSU5JU0gpICYmIHJldCA9PSBaX09LKQotICAgICAgICByZXQgPSBaX0JVRl9FUlJPUjsKLSAgICByZXR1cm4gcmV0OwotfQotCi1pbnQgWkVYUE9SVCBpbmZsYXRlRW5kKAotel9zdHJlYW1wIHN0cm0pCi17Ci0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMIHx8IHN0cm0tPnpmcmVlID09IChmcmVlX2Z1bmMpMCkKLSAgICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOwotICAgIGlmIChzdGF0ZS0+d2luZG93ICE9IFpfTlVMTCkgWkZSRUUoc3RybSwgc3RhdGUtPndpbmRvdyk7Ci0gICAgWkZSRUUoc3RybSwgc3RybS0+c3RhdGUpOwotICAgIHN0cm0tPnN0YXRlID0gWl9OVUxMOwotICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogZW5kXG4iKSk7Ci0gICAgcmV0dXJuIFpfT0s7Ci19Ci0KLWludCBaRVhQT1JUIGluZmxhdGVHZXREaWN0aW9uYXJ5KAotel9zdHJlYW1wIHN0cm0sCi1CeXRlZiAqZGljdGlvbmFyeSwKLXVJbnQgKmRpY3RMZW5ndGgpCi17Ci0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLQotICAgIC8qIGNoZWNrIHN0YXRlICovCi0gICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOwotCi0gICAgLyogY29weSBkaWN0aW9uYXJ5ICovCi0gICAgaWYgKHN0YXRlLT53aGF2ZSAmJiBkaWN0aW9uYXJ5ICE9IFpfTlVMTCkgewotICAgICAgICB6bWVtY3B5KGRpY3Rpb25hcnksIHN0YXRlLT53aW5kb3cgKyBzdGF0ZS0+d25leHQsCi0gICAgICAgICAgICAgICAgc3RhdGUtPndoYXZlIC0gc3RhdGUtPnduZXh0KTsKLSAgICAgICAgem1lbWNweShkaWN0aW9uYXJ5ICsgc3RhdGUtPndoYXZlIC0gc3RhdGUtPnduZXh0LAotICAgICAgICAgICAgICAgIHN0YXRlLT53aW5kb3csIHN0YXRlLT53bmV4dCk7Ci0gICAgfQotICAgIGlmIChkaWN0TGVuZ3RoICE9IFpfTlVMTCkKLSAgICAgICAgKmRpY3RMZW5ndGggPSBzdGF0ZS0+d2hhdmU7Ci0gICAgcmV0dXJuIFpfT0s7Ci19Ci0KLWludCBaRVhQT1JUIGluZmxhdGVTZXREaWN0aW9uYXJ5KAotel9zdHJlYW1wIHN0cm0sCi1jb25zdCBCeXRlZiAqZGljdGlvbmFyeSwKLXVJbnQgZGljdExlbmd0aCkKLXsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotICAgIHVuc2lnbmVkIGxvbmcgZGljdGlkOwotICAgIGludCByZXQ7Ci0KLSAgICBkaWN0aWQgPSAwOwotICAgIC8qIGNoZWNrIHN0YXRlICovCi0gICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOwotICAgIGlmIChzdGF0ZS0+d3JhcCAhPSAwICYmIHN0YXRlLT5tb2RlICE9IERJQ1QpCi0gICAgICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjsKLQotICAgIC8qIGNoZWNrIGZvciBjb3JyZWN0IGRpY3Rpb25hcnkgaWRlbnRpZmllciAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSA9PSBESUNUKSB7Ci0gICAgICAgIGRpY3RpZCA9IGFkbGVyMzIoMEwsIFpfTlVMTCwgMCk7Ci0gICAgICAgIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoKTsKLSAgICAgICAgaWYgKGRpY3RpZCAhPSBzdGF0ZS0+Y2hlY2spCi0gICAgICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOwotICAgIH0KLQotICAgIC8qIGNvcHkgZGljdGlvbmFyeSB0byB3aW5kb3cgdXNpbmcgdXBkYXRld2luZG93KCksIHdoaWNoIHdpbGwgYW1lbmQgdGhlCi0gICAgICAgZXhpc3RpbmcgZGljdGlvbmFyeSBpZiBhcHByb3ByaWF0ZSAqLwotICAgIHJldCA9IHVwZGF0ZXdpbmRvdyhzdHJtLCBkaWN0aW9uYXJ5ICsgZGljdExlbmd0aCwgZGljdExlbmd0aCk7Ci0gICAgaWYgKHJldCkgewotICAgICAgICBzdGF0ZS0+bW9kZSA9IE1FTTsKLSAgICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SOwotICAgIH0KLSAgICBzdGF0ZS0+aGF2ZWRpY3QgPSAxOwotICAgIFRyYWNldigoc3RkZXJyLCAiaW5mbGF0ZTogICBkaWN0aW9uYXJ5IHNldFxuIikpOwotICAgIHJldHVybiBaX09LOwotfQotCi1pbnQgWkVYUE9SVCBpbmZsYXRlR2V0SGVhZGVyKAotel9zdHJlYW1wIHN0cm0sCi1nel9oZWFkZXJwIGhlYWQpCi17Ci0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLQotICAgIC8qIGNoZWNrIHN0YXRlICovCi0gICAgaWYgKHN0cm0gPT0gWl9OVUxMIHx8IHN0cm0tPnN0YXRlID09IFpfTlVMTCkgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOwotICAgIHN0YXRlID0gKHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqKXN0cm0tPnN0YXRlOwotICAgIGlmICgoc3RhdGUtPndyYXAgJiAyKSA9PSAwKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0KLSAgICAvKiBzYXZlIGhlYWRlciBzdHJ1Y3R1cmUgKi8KLSAgICBzdGF0ZS0+aGVhZCA9IGhlYWQ7Ci0gICAgaGVhZC0+ZG9uZSA9IDA7Ci0gICAgcmV0dXJuIFpfT0s7Ci19Ci0KLS8qCi0gICBTZWFyY2ggYnVmWzAuLmxlbi0xXSBmb3IgdGhlIHBhdHRlcm46IDAsIDAsIDB4ZmYsIDB4ZmYuICBSZXR1cm4gd2hlbiBmb3VuZAotICAgb3Igd2hlbiBvdXQgb2YgaW5wdXQuICBXaGVuIGNhbGxlZCwgKmhhdmUgaXMgdGhlIG51bWJlciBvZiBwYXR0ZXJuIGJ5dGVzCi0gICBmb3VuZCBpbiBvcmRlciBzbyBmYXIsIGluIDAuLjMuICBPbiByZXR1cm4gKmhhdmUgaXMgdXBkYXRlZCB0byB0aGUgbmV3Ci0gICBzdGF0ZS4gIElmIG9uIHJldHVybiAqaGF2ZSBlcXVhbHMgZm91ciwgdGhlbiB0aGUgcGF0dGVybiB3YXMgZm91bmQgYW5kIHRoZQotICAgcmV0dXJuIHZhbHVlIGlzIGhvdyBtYW55IGJ5dGVzIHdlcmUgcmVhZCBpbmNsdWRpbmcgdGhlIGxhc3QgYnl0ZSBvZiB0aGUKLSAgIHBhdHRlcm4uICBJZiAqaGF2ZSBpcyBsZXNzIHRoYW4gZm91ciwgdGhlbiB0aGUgcGF0dGVybiBoYXMgbm90IGJlZW4gZm91bmQKLSAgIHlldCBhbmQgdGhlIHJldHVybiB2YWx1ZSBpcyBsZW4uICBJbiB0aGUgbGF0dGVyIGNhc2UsIHN5bmNzZWFyY2goKSBjYW4gYmUKLSAgIGNhbGxlZCBhZ2FpbiB3aXRoIG1vcmUgZGF0YSBhbmQgdGhlICpoYXZlIHN0YXRlLiAgKmhhdmUgaXMgaW5pdGlhbGl6ZWQgdG8KLSAgIHplcm8gZm9yIHRoZSBmaXJzdCBjYWxsLgotICovCi1sb2NhbCB1bnNpZ25lZCBzeW5jc2VhcmNoKAotdW5zaWduZWQgRkFSICpoYXZlLAotY29uc3QgdW5zaWduZWQgY2hhciBGQVIgKmJ1ZiwKLXVuc2lnbmVkIGxlbikKLXsKLSAgICB1bnNpZ25lZCBnb3Q7Ci0gICAgdW5zaWduZWQgbmV4dDsKLQotICAgIGdvdCA9ICpoYXZlOwotICAgIG5leHQgPSAwOwotICAgIHdoaWxlIChuZXh0IDwgbGVuICYmIGdvdCA8IDQpIHsKLSAgICAgICAgaWYgKChpbnQpKGJ1ZltuZXh0XSkgPT0gKGdvdCA8IDIgPyAwIDogMHhmZikpCi0gICAgICAgICAgICBnb3QrKzsKLSAgICAgICAgZWxzZSBpZiAoYnVmW25leHRdKQotICAgICAgICAgICAgZ290ID0gMDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgZ290ID0gNCAtIGdvdDsKLSAgICAgICAgbmV4dCsrOwotICAgIH0KLSAgICAqaGF2ZSA9IGdvdDsKLSAgICByZXR1cm4gbmV4dDsKLX0KLQotaW50IFpFWFBPUlQgaW5mbGF0ZVN5bmMoCi16X3N0cmVhbXAgc3RybSkKLXsKLSAgICB1bnNpZ25lZCBsZW47ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIHRvIGxvb2sgYXQgb3IgbG9va2VkIGF0ICovCi0gICAgdW5zaWduZWQgbG9uZyBpbiwgb3V0OyAgICAgIC8qIHRlbXBvcmFyeSB0byBzYXZlIHRvdGFsX2luIGFuZCB0b3RhbF9vdXQgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGJ1Zls0XTsgICAgICAgLyogdG8gcmVzdG9yZSBiaXQgYnVmZmVyIHRvIGJ5dGUgc3RyaW5nICovCi0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLQotICAgIC8qIGNoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7Ci0gICAgaWYgKHN0cm0tPmF2YWlsX2luID09IDAgJiYgc3RhdGUtPmJpdHMgPCA4KSByZXR1cm4gWl9CVUZfRVJST1I7Ci0KLSAgICAvKiBpZiBmaXJzdCB0aW1lLCBzdGFydCBzZWFyY2ggaW4gYml0IGJ1ZmZlciAqLwotICAgIGlmIChzdGF0ZS0+bW9kZSAhPSBTWU5DKSB7Ci0gICAgICAgIHN0YXRlLT5tb2RlID0gU1lOQzsKLSAgICAgICAgc3RhdGUtPmhvbGQgPDw9IHN0YXRlLT5iaXRzICYgNzsKLSAgICAgICAgc3RhdGUtPmJpdHMgLT0gc3RhdGUtPmJpdHMgJiA3OwotICAgICAgICBsZW4gPSAwOwotICAgICAgICB3aGlsZSAoc3RhdGUtPmJpdHMgPj0gOCkgewotICAgICAgICAgICAgYnVmW2xlbisrXSA9ICh1bnNpZ25lZCBjaGFyKShzdGF0ZS0+aG9sZCk7Ci0gICAgICAgICAgICBzdGF0ZS0+aG9sZCA+Pj0gODsKLSAgICAgICAgICAgIHN0YXRlLT5iaXRzIC09IDg7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdGUtPmhhdmUgPSAwOwotICAgICAgICBzeW5jc2VhcmNoKCYoc3RhdGUtPmhhdmUpLCBidWYsIGxlbik7Ci0gICAgfQotCi0gICAgLyogc2VhcmNoIGF2YWlsYWJsZSBpbnB1dCAqLwotICAgIGxlbiA9IHN5bmNzZWFyY2goJihzdGF0ZS0+aGF2ZSksIHN0cm0tPm5leHRfaW4sIHN0cm0tPmF2YWlsX2luKTsKLSAgICBzdHJtLT5hdmFpbF9pbiAtPSBsZW47Ci0gICAgc3RybS0+bmV4dF9pbiArPSBsZW47Ci0gICAgc3RybS0+dG90YWxfaW4gKz0gbGVuOwotCi0gICAgLyogcmV0dXJuIG5vIGpveSBvciBzZXQgdXAgdG8gcmVzdGFydCBpbmZsYXRlKCkgb24gYSBuZXcgYmxvY2sgKi8KLSAgICBpZiAoc3RhdGUtPmhhdmUgIT0gNCkgcmV0dXJuIFpfREFUQV9FUlJPUjsKLSAgICBpbiA9IHN0cm0tPnRvdGFsX2luOyAgb3V0ID0gc3RybS0+dG90YWxfb3V0OwotICAgIGluZmxhdGVSZXNldChzdHJtKTsKLSAgICBzdHJtLT50b3RhbF9pbiA9IGluOyAgc3RybS0+dG90YWxfb3V0ID0gb3V0OwotICAgIHN0YXRlLT5tb2RlID0gVFlQRTsKLSAgICByZXR1cm4gWl9PSzsKLX0KLQotLyoKLSAgIFJldHVybnMgdHJ1ZSBpZiBpbmZsYXRlIGlzIGN1cnJlbnRseSBhdCB0aGUgZW5kIG9mIGEgYmxvY2sgZ2VuZXJhdGVkIGJ5Ci0gICBaX1NZTkNfRkxVU0ggb3IgWl9GVUxMX0ZMVVNILiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgb25lIFBQUAotICAgaW1wbGVtZW50YXRpb24gdG8gcHJvdmlkZSBhbiBhZGRpdGlvbmFsIHNhZmV0eSBjaGVjay4gUFBQIHVzZXMKLSAgIFpfU1lOQ19GTFVTSCBidXQgcmVtb3ZlcyB0aGUgbGVuZ3RoIGJ5dGVzIG9mIHRoZSByZXN1bHRpbmcgZW1wdHkgc3RvcmVkCi0gICBibG9jay4gV2hlbiBkZWNvbXByZXNzaW5nLCBQUFAgY2hlY2tzIHRoYXQgYXQgdGhlIGVuZCBvZiBpbnB1dCBwYWNrZXQsCi0gICBpbmZsYXRlIGlzIHdhaXRpbmcgZm9yIHRoZXNlIGxlbmd0aCBieXRlcy4KLSAqLwotaW50IFpFWFBPUlQgaW5mbGF0ZVN5bmNQb2ludCgKLXpfc3RyZWFtcCBzdHJtKQotewotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Ci0KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7Ci0gICAgcmV0dXJuIHN0YXRlLT5tb2RlID09IFNUT1JFRCAmJiBzdGF0ZS0+Yml0cyA9PSAwOwotfQotCi1pbnQgWkVYUE9SVCBpbmZsYXRlQ29weSgKLXpfc3RyZWFtcCBkZXN0LAotel9zdHJlYW1wIHNvdXJjZSkKLXsKLSAgICBzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKnN0YXRlOwotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqY29weTsKLSAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93OwotICAgIHVuc2lnbmVkIHdzaXplOwotCi0gICAgLyogY2hlY2sgaW5wdXQgKi8KLSAgICBpZiAoZGVzdCA9PSBaX05VTEwgfHwgc291cmNlID09IFpfTlVMTCB8fCBzb3VyY2UtPnN0YXRlID09IFpfTlVMTCB8fAotICAgICAgICBzb3VyY2UtPnphbGxvYyA9PSAoYWxsb2NfZnVuYykwIHx8IHNvdXJjZS0+emZyZWUgPT0gKGZyZWVfZnVuYykwKQotICAgICAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc291cmNlLT5zdGF0ZTsKLQotICAgIC8qIGFsbG9jYXRlIHNwYWNlICovCi0gICAgY29weSA9IChzdHJ1Y3QgaW5mbGF0ZV9zdGF0ZSBGQVIgKikKLSAgICAgICAgICAgWkFMTE9DKHNvdXJjZSwgMSwgc2l6ZW9mKHN0cnVjdCBpbmZsYXRlX3N0YXRlKSk7Ci0gICAgaWYgKGNvcHkgPT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7Ci0gICAgd2luZG93ID0gWl9OVUxMOwotICAgIGlmIChzdGF0ZS0+d2luZG93ICE9IFpfTlVMTCkgewotICAgICAgICB3aW5kb3cgPSAodW5zaWduZWQgY2hhciBGQVIgKikKLSAgICAgICAgICAgICAgICAgWkFMTE9DKHNvdXJjZSwgMVUgPDwgc3RhdGUtPndiaXRzLCBzaXplb2YodW5zaWduZWQgY2hhcikpOwotICAgICAgICBpZiAod2luZG93ID09IFpfTlVMTCkgewotICAgICAgICAgICAgWkZSRUUoc291cmNlLCBjb3B5KTsKLSAgICAgICAgICAgIHJldHVybiBaX01FTV9FUlJPUjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIGNvcHkgc3RhdGUgKi8KLSAgICB6bWVtY3B5KCh2b2lkcGYpZGVzdCwgKHZvaWRwZilzb3VyY2UsIHNpemVvZih6X3N0cmVhbSkpOwotICAgIHptZW1jcHkoKHZvaWRwZiljb3B5LCAodm9pZHBmKXN0YXRlLCBzaXplb2Yoc3RydWN0IGluZmxhdGVfc3RhdGUpKTsKLSAgICBpZiAoc3RhdGUtPmxlbmNvZGUgPj0gc3RhdGUtPmNvZGVzICYmCi0gICAgICAgIHN0YXRlLT5sZW5jb2RlIDw9IHN0YXRlLT5jb2RlcyArIEVOT1VHSCAtIDEpIHsKLSAgICAgICAgY29weS0+bGVuY29kZSA9IGNvcHktPmNvZGVzICsgKHN0YXRlLT5sZW5jb2RlIC0gc3RhdGUtPmNvZGVzKTsKLSAgICAgICAgY29weS0+ZGlzdGNvZGUgPSBjb3B5LT5jb2RlcyArIChzdGF0ZS0+ZGlzdGNvZGUgLSBzdGF0ZS0+Y29kZXMpOwotICAgIH0KLSAgICBjb3B5LT5uZXh0ID0gY29weS0+Y29kZXMgKyAoc3RhdGUtPm5leHQgLSBzdGF0ZS0+Y29kZXMpOwotICAgIGlmICh3aW5kb3cgIT0gWl9OVUxMKSB7Ci0gICAgICAgIHdzaXplID0gMVUgPDwgc3RhdGUtPndiaXRzOwotICAgICAgICB6bWVtY3B5KHdpbmRvdywgc3RhdGUtPndpbmRvdywgd3NpemUpOwotICAgIH0KLSAgICBjb3B5LT53aW5kb3cgPSB3aW5kb3c7Ci0gICAgZGVzdC0+c3RhdGUgPSAoc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqKWNvcHk7Ci0gICAgcmV0dXJuIFpfT0s7Ci19Ci0KLWludCBaRVhQT1JUIGluZmxhdGVVbmRlcm1pbmUoCi16X3N0cmVhbXAgc3RybSwKLWludCBzdWJ2ZXJ0KQotewotICAgIHN0cnVjdCBpbmZsYXRlX3N0YXRlIEZBUiAqc3RhdGU7Ci0KLSAgICBpZiAoc3RybSA9PSBaX05VTEwgfHwgc3RybS0+c3RhdGUgPT0gWl9OVUxMKSByZXR1cm4gWl9TVFJFQU1fRVJST1I7Ci0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7Ci0gICAgc3RhdGUtPnNhbmUgPSAhc3VidmVydDsKLSNpZmRlZiBJTkZMQVRFX0FMTE9XX0lOVkFMSURfRElTVEFOQ0VfVE9PRkFSX0FSUlIKLSAgICByZXR1cm4gWl9PSzsKLSNlbHNlCi0gICAgc3RhdGUtPnNhbmUgPSAxOwotICAgIHJldHVybiBaX0RBVEFfRVJST1I7Ci0jZW5kaWYKLX0KLQotbG9uZyBaRVhQT1JUIGluZmxhdGVNYXJrKAotel9zdHJlYW1wIHN0cm0pCi17Ci0gICAgc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICpzdGF0ZTsKLQotICAgIGlmIChzdHJtID09IFpfTlVMTCB8fCBzdHJtLT5zdGF0ZSA9PSBaX05VTEwpIHJldHVybiAtMUwgPDwgMTY7Ci0gICAgc3RhdGUgPSAoc3RydWN0IGluZmxhdGVfc3RhdGUgRkFSICopc3RybS0+c3RhdGU7Ci0gICAgcmV0dXJuICgobG9uZykoc3RhdGUtPmJhY2spIDw8IDE2KSArCi0gICAgICAgIChzdGF0ZS0+bW9kZSA9PSBDT1BZID8gc3RhdGUtPmxlbmd0aCA6Ci0gICAgICAgICAgICAoc3RhdGUtPm1vZGUgPT0gTUFUQ0ggPyBzdGF0ZS0+d2FzIC0gc3RhdGUtPmxlbmd0aCA6IDApKTsKLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9pbmZsYXRlLmggYi90aGlyZF9wYXJ0eS96bGliX3YxMjgvaW5mbGF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWY0OTg2Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9pbmZsYXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyogaW5mbGF0ZS5oIC0tIGludGVybmFsIGluZmxhdGUgc3RhdGUgZGVmaW5pdGlvbgotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDkgTWFyayBBZGxlcgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCi0gICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKLSAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KLSAqLwotCi0vKiBkZWZpbmUgTk9fR1pJUCB3aGVuIGNvbXBpbGluZyBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIGd6aXAgaGVhZGVyIGFuZAotICAgdHJhaWxlciBkZWNvZGluZyBieSBpbmZsYXRlKCkuICBOT19HWklQIHdvdWxkIGJlIHVzZWQgdG8gYXZvaWQgbGlua2luZyBpbgotICAgdGhlIGNyYyBjb2RlIHdoZW4gaXQgaXMgbm90IG5lZWRlZC4gIEZvciBzaGFyZWQgbGlicmFyaWVzLCBnemlwIGRlY29kaW5nCi0gICBzaG91bGQgYmUgbGVmdCBlbmFibGVkLiAqLwotI2lmbmRlZiBOT19HWklQCi0jICBkZWZpbmUgR1VOWklQCi0jZW5kaWYKLQotLyogUG9zc2libGUgaW5mbGF0ZSBtb2RlcyBiZXR3ZWVuIGluZmxhdGUoKSBjYWxscyAqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBIRUFELCAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtYWdpYyBoZWFkZXIgKi8KLSAgICBGTEFHUywgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtZXRob2QgYW5kIGZsYWdzIChnemlwKSAqLwotICAgIFRJTUUsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1vZGlmaWNhdGlvbiB0aW1lIChnemlwKSAqLwotICAgIE9TLCAgICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGZsYWdzIGFuZCBvcGVyYXRpbmcgc3lzdGVtIChnemlwKSAqLwotICAgIEVYTEVOLCAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGxlbmd0aCAoZ3ppcCkgKi8KLSAgICBFWFRSQSwgICAgICAvKiBpOiB3YWl0aW5nIGZvciBleHRyYSBieXRlcyAoZ3ppcCkgKi8KLSAgICBOQU1FLCAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBlbmQgb2YgZmlsZSBuYW1lIChnemlwKSAqLwotICAgIENPTU1FTlQsICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBjb21tZW50IChnemlwKSAqLwotICAgIEhDUkMsICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGhlYWRlciBjcmMgKGd6aXApICovCi0gICAgRElDVElELCAgICAgLyogaTogd2FpdGluZyBmb3IgZGljdGlvbmFyeSBjaGVjayB2YWx1ZSAqLwotICAgIERJQ1QsICAgICAgIC8qIHdhaXRpbmcgZm9yIGluZmxhdGVTZXREaWN0aW9uYXJ5KCkgY2FsbCAqLwotICAgICAgICBUWVBFLCAgICAgICAvKiBpOiB3YWl0aW5nIGZvciB0eXBlIGJpdHMsIGluY2x1ZGluZyBsYXN0LWZsYWcgYml0ICovCi0gICAgICAgIFRZUEVETywgICAgIC8qIGk6IHNhbWUsIGJ1dCBza2lwIGNoZWNrIHRvIGV4aXQgaW5mbGF0ZSBvbiBuZXcgYmxvY2sgKi8KLSAgICAgICAgU1RPUkVELCAgICAgLyogaTogd2FpdGluZyBmb3Igc3RvcmVkIHNpemUgKGxlbmd0aCBhbmQgY29tcGxlbWVudCkgKi8KLSAgICAgICAgQ09QWV8sICAgICAgLyogaS9vOiBzYW1lIGFzIENPUFkgYmVsb3csIGJ1dCBvbmx5IGZpcnN0IHRpbWUgaW4gKi8KLSAgICAgICAgQ09QWSwgICAgICAgLyogaS9vOiB3YWl0aW5nIGZvciBpbnB1dCBvciBvdXRwdXQgdG8gY29weSBzdG9yZWQgYmxvY2sgKi8KLSAgICAgICAgVEFCTEUsICAgICAgLyogaTogd2FpdGluZyBmb3IgZHluYW1pYyBibG9jayB0YWJsZSBsZW5ndGhzICovCi0gICAgICAgIExFTkxFTlMsICAgIC8qIGk6IHdhaXRpbmcgZm9yIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqLwotICAgICAgICBDT0RFTEVOUywgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0IGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi8KLSAgICAgICAgICAgIExFTl8sICAgICAgIC8qIGk6IHNhbWUgYXMgTEVOIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovCi0gICAgICAgICAgICBMRU4sICAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGgvbGl0L2VvYiBjb2RlICovCi0gICAgICAgICAgICBMRU5FWFQsICAgICAvKiBpOiB3YWl0aW5nIGZvciBsZW5ndGggZXh0cmEgYml0cyAqLwotICAgICAgICAgICAgRElTVCwgICAgICAgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgY29kZSAqLwotICAgICAgICAgICAgRElTVEVYVCwgICAgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgZXh0cmEgYml0cyAqLwotICAgICAgICAgICAgTUFUQ0gsICAgICAgLyogbzogd2FpdGluZyBmb3Igb3V0cHV0IHNwYWNlIHRvIGNvcHkgc3RyaW5nICovCi0gICAgICAgICAgICBMSVQsICAgICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gd3JpdGUgbGl0ZXJhbCAqLwotICAgIENIRUNLLCAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBjaGVjayB2YWx1ZSAqLwotICAgIExFTkdUSCwgICAgIC8qIGk6IHdhaXRpbmcgZm9yIDMyLWJpdCBsZW5ndGggKGd6aXApICovCi0gICAgRE9ORSwgICAgICAgLyogZmluaXNoZWQgY2hlY2ssIGRvbmUgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi8KLSAgICBCQUQsICAgICAgICAvKiBnb3QgYSBkYXRhIGVycm9yIC0tIHJlbWFpbiBoZXJlIHVudGlsIHJlc2V0ICovCi0gICAgTUVNLCAgICAgICAgLyogZ290IGFuIGluZmxhdGUoKSBtZW1vcnkgZXJyb3IgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi8KLSAgICBTWU5DICAgICAgICAvKiBsb29raW5nIGZvciBzeW5jaHJvbml6YXRpb24gYnl0ZXMgdG8gcmVzdGFydCBpbmZsYXRlKCkgKi8KLX0gaW5mbGF0ZV9tb2RlOwotCi0vKgotICAgIFN0YXRlIHRyYW5zaXRpb25zIGJldHdlZW4gYWJvdmUgbW9kZXMgLQotCi0gICAgKG1vc3QgbW9kZXMgY2FuIGdvIHRvIEJBRCBvciBNRU0gb24gZXJyb3IgLS0gbm90IHNob3duIGZvciBjbGFyaXR5KQotCi0gICAgUHJvY2VzcyBoZWFkZXI6Ci0gICAgICAgIEhFQUQgLT4gKGd6aXApIG9yICh6bGliKSBvciAocmF3KQotICAgICAgICAoZ3ppcCkgLT4gRkxBR1MgLT4gVElNRSAtPiBPUyAtPiBFWExFTiAtPiBFWFRSQSAtPiBOQU1FIC0+IENPTU1FTlQgLT4KLSAgICAgICAgICAgICAgICAgIEhDUkMgLT4gVFlQRQotICAgICAgICAoemxpYikgLT4gRElDVElEIG9yIFRZUEUKLSAgICAgICAgRElDVElEIC0+IERJQ1QgLT4gVFlQRQotICAgICAgICAocmF3KSAtPiBUWVBFRE8KLSAgICBSZWFkIGRlZmxhdGUgYmxvY2tzOgotICAgICAgICAgICAgVFlQRSAtPiBUWVBFRE8gLT4gU1RPUkVEIG9yIFRBQkxFIG9yIExFTl8gb3IgQ0hFQ0sKLSAgICAgICAgICAgIFNUT1JFRCAtPiBDT1BZXyAtPiBDT1BZIC0+IFRZUEUKLSAgICAgICAgICAgIFRBQkxFIC0+IExFTkxFTlMgLT4gQ09ERUxFTlMgLT4gTEVOXwotICAgICAgICAgICAgTEVOXyAtPiBMRU4KLSAgICBSZWFkIGRlZmxhdGUgY29kZXMgaW4gZml4ZWQgb3IgZHluYW1pYyBibG9jazoKLSAgICAgICAgICAgICAgICBMRU4gLT4gTEVORVhUIG9yIExJVCBvciBUWVBFCi0gICAgICAgICAgICAgICAgTEVORVhUIC0+IERJU1QgLT4gRElTVEVYVCAtPiBNQVRDSCAtPiBMRU4KLSAgICAgICAgICAgICAgICBMSVQgLT4gTEVOCi0gICAgUHJvY2VzcyB0cmFpbGVyOgotICAgICAgICBDSEVDSyAtPiBMRU5HVEggLT4gRE9ORQotICovCi0KLS8qIHN0YXRlIG1haW50YWluZWQgYmV0d2VlbiBpbmZsYXRlKCkgY2FsbHMuICBBcHByb3hpbWF0ZWx5IDEwSyBieXRlcy4gKi8KLXN0cnVjdCBpbmZsYXRlX3N0YXRlIHsKLSAgICBpbmZsYXRlX21vZGUgbW9kZTsgICAgICAgICAgLyogY3VycmVudCBpbmZsYXRlIG1vZGUgKi8KLSAgICBpbnQgbGFzdDsgICAgICAgICAgICAgICAgICAgLyogdHJ1ZSBpZiBwcm9jZXNzaW5nIGxhc3QgYmxvY2sgKi8KLSAgICBpbnQgd3JhcDsgICAgICAgICAgICAgICAgICAgLyogYml0IDAgdHJ1ZSBmb3IgemxpYiwgYml0IDEgdHJ1ZSBmb3IgZ3ppcCAqLwotICAgIGludCBoYXZlZGljdDsgICAgICAgICAgICAgICAvKiB0cnVlIGlmIGRpY3Rpb25hcnkgcHJvdmlkZWQgKi8KLSAgICBpbnQgZmxhZ3M7ICAgICAgICAgICAgICAgICAgLyogZ3ppcCBoZWFkZXIgbWV0aG9kIGFuZCBmbGFncyAoMCBpZiB6bGliKSAqLwotICAgIHVuc2lnbmVkIGRtYXg7ICAgICAgICAgICAgICAvKiB6bGliIGhlYWRlciBtYXggZGlzdGFuY2UgKElORkxBVEVfU1RSSUNUKSAqLwotICAgIHVuc2lnbmVkIGxvbmcgY2hlY2s7ICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBjaGVjayB2YWx1ZSAqLwotICAgIHVuc2lnbmVkIGxvbmcgdG90YWw7ICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBvdXRwdXQgY291bnQgKi8KLSAgICBnel9oZWFkZXJwIGhlYWQ7ICAgICAgICAgICAgLyogd2hlcmUgdG8gc2F2ZSBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiAqLwotICAgICAgICAvKiBzbGlkaW5nIHdpbmRvdyAqLwotICAgIHVuc2lnbmVkIHdiaXRzOyAgICAgICAgICAgICAvKiBsb2cgYmFzZSAyIG9mIHJlcXVlc3RlZCB3aW5kb3cgc2l6ZSAqLwotICAgIHVuc2lnbmVkIHdzaXplOyAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi8KLSAgICB1bnNpZ25lZCB3aGF2ZTsgICAgICAgICAgICAgLyogdmFsaWQgYnl0ZXMgaW4gdGhlIHdpbmRvdyAqLwotICAgIHVuc2lnbmVkIHduZXh0OyAgICAgICAgICAgICAvKiB3aW5kb3cgd3JpdGUgaW5kZXggKi8KLSAgICB1bnNpZ25lZCBjaGFyIEZBUiAqd2luZG93OyAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiBuZWVkZWQgKi8KLSAgICAgICAgLyogYml0IGFjY3VtdWxhdG9yICovCi0gICAgdW5zaWduZWQgbG9uZyBob2xkOyAgICAgICAgIC8qIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqLwotICAgIHVuc2lnbmVkIGJpdHM7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0cyBpbiAiaW4iICovCi0gICAgICAgIC8qIGZvciBzdHJpbmcgYW5kIHN0b3JlZCBibG9jayBjb3B5aW5nICovCi0gICAgdW5zaWduZWQgbGVuZ3RoOyAgICAgICAgICAgIC8qIGxpdGVyYWwgb3IgbGVuZ3RoIG9mIGRhdGEgdG8gY29weSAqLwotICAgIHVuc2lnbmVkIG9mZnNldDsgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIHRvIGNvcHkgc3RyaW5nIGZyb20gKi8KLSAgICAgICAgLyogZm9yIHRhYmxlIGFuZCBjb2RlIGRlY29kaW5nICovCi0gICAgdW5zaWduZWQgZXh0cmE7ICAgICAgICAgICAgIC8qIGV4dHJhIGJpdHMgbmVlZGVkICovCi0gICAgICAgIC8qIGZpeGVkIGFuZCBkeW5hbWljIGNvZGUgdGFibGVzICovCi0gICAgY29kZSBjb25zdCBGQVIgKmxlbmNvZGU7ICAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBsZW5ndGgvbGl0ZXJhbCBjb2RlcyAqLwotICAgIGNvZGUgY29uc3QgRkFSICpkaXN0Y29kZTsgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKi8KLSAgICB1bnNpZ25lZCBsZW5iaXRzOyAgICAgICAgICAgLyogaW5kZXggYml0cyBmb3IgbGVuY29kZSAqLwotICAgIHVuc2lnbmVkIGRpc3RiaXRzOyAgICAgICAgICAvKiBpbmRleCBiaXRzIGZvciBkaXN0Y29kZSAqLwotICAgICAgICAvKiBkeW5hbWljIHRhYmxlIGJ1aWxkaW5nICovCi0gICAgdW5zaWduZWQgbmNvZGU7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi8KLSAgICB1bnNpZ25lZCBubGVuOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi8KLSAgICB1bnNpZ25lZCBuZGlzdDsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqLwotICAgIHVuc2lnbmVkIGhhdmU7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZSBsZW5ndGhzIGluIGxlbnNbXSAqLwotICAgIGNvZGUgRkFSICpuZXh0OyAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiBjb2Rlc1tdICovCi0gICAgdW5zaWduZWQgc2hvcnQgbGVuc1szMjBdOyAgIC8qIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBjb2RlIGxlbmd0aHMgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB3b3JrWzI4OF07ICAgLyogd29yayBhcmVhIGZvciBjb2RlIHRhYmxlIGJ1aWxkaW5nICovCi0gICAgY29kZSBjb2Rlc1tFTk9VR0hdOyAgICAgICAgIC8qIHNwYWNlIGZvciBjb2RlIHRhYmxlcyAqLwotICAgIGludCBzYW5lOyAgICAgICAgICAgICAgICAgICAvKiBpZiBmYWxzZSwgYWxsb3cgaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyICovCi0gICAgaW50IGJhY2s7ICAgICAgICAgICAgICAgICAgIC8qIGJpdHMgYmFjayBvZiBsYXN0IHVucHJvY2Vzc2VkIGxlbmd0aC9saXQgKi8KLSAgICB1bnNpZ25lZCB3YXM7ICAgICAgICAgICAgICAgLyogaW5pdGlhbCBsZW5ndGggb2YgbWF0Y2ggKi8KLX07CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS96bGliX3YxMjgvaW5mdHJlZXMuYyBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9pbmZ0cmVlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWJhMTMyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9pbmZ0cmVlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8qIGluZnRyZWVzLmMgLS0gZ2VuZXJhdGUgSHVmZm1hbiB0cmVlcyBmb3IgZWZmaWNpZW50IGRlY29kaW5nCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMyBNYXJrIEFkbGVyCi0gKiBGb3IgY29uZGl0aW9ucyBvZiBkaXN0cmlidXRpb24gYW5kIHVzZSwgc2VlIGNvcHlyaWdodCBub3RpY2UgaW4gemxpYi5oCi0gKi8KLQotI2luY2x1ZGUgInp1dGlsLmgiCi0jaW5jbHVkZSAiaW5mdHJlZXMuaCIKLQotI2RlZmluZSBNQVhCSVRTIDE1Ci0KLWNvbnN0IGNoYXIgaW5mbGF0ZV9jb3B5cmlnaHRbXSA9Ci0gICAiIGluZmxhdGUgMS4yLjggQ29weXJpZ2h0IDE5OTUtMjAxMyBNYXJrIEFkbGVyICI7Ci0vKgotICBJZiB5b3UgdXNlIHRoZSB6bGliIGxpYnJhcnkgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpcyB3ZWxjb21lCi0gIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHlvdXIgcHJvZHVjdC4gSWYgZm9yIHNvbWUgcmVhc29uIHlvdSBjYW5ub3QKLSAgaW5jbHVkZSBzdWNoIGFuIGFja25vd2xlZGdtZW50LCBJIHdvdWxkIGFwcHJlY2lhdGUgdGhhdCB5b3Uga2VlcCB0aGlzCi0gIGNvcHlyaWdodCBzdHJpbmcgaW4gdGhlIGV4ZWN1dGFibGUgb2YgeW91ciBwcm9kdWN0LgotICovCi0KLS8qCi0gICBCdWlsZCBhIHNldCBvZiB0YWJsZXMgdG8gZGVjb2RlIHRoZSBwcm92aWRlZCBjYW5vbmljYWwgSHVmZm1hbiBjb2RlLgotICAgVGhlIGNvZGUgbGVuZ3RocyBhcmUgbGVuc1swLi5jb2Rlcy0xXS4gIFRoZSByZXN1bHQgc3RhcnRzIGF0ICp0YWJsZSwKLSAgIHdob3NlIGluZGljZXMgYXJlIDAuLjJeYml0cy0xLiAgd29yayBpcyBhIHdyaXRhYmxlIGFycmF5IG9mIGF0IGxlYXN0Ci0gICBsZW5zIHNob3J0cywgd2hpY2ggaXMgdXNlZCBhcyBhIHdvcmsgYXJlYS4gIHR5cGUgaXMgdGhlIHR5cGUgb2YgY29kZQotICAgdG8gYmUgZ2VuZXJhdGVkLCBDT0RFUywgTEVOUywgb3IgRElTVFMuICBPbiByZXR1cm4sIHplcm8gaXMgc3VjY2VzcywKLSAgIC0xIGlzIGFuIGludmFsaWQgY29kZSwgYW5kICsxIG1lYW5zIHRoYXQgRU5PVUdIIGlzbid0IGVub3VnaC4gIHRhYmxlCi0gICBvbiByZXR1cm4gcG9pbnRzIHRvIHRoZSBuZXh0IGF2YWlsYWJsZSBlbnRyeSdzIGFkZHJlc3MuICBiaXRzIGlzIHRoZQotICAgcmVxdWVzdGVkIHJvb3QgdGFibGUgaW5kZXggYml0cywgYW5kIG9uIHJldHVybiBpdCBpcyB0aGUgYWN0dWFsIHJvb3QKLSAgIHRhYmxlIGluZGV4IGJpdHMuICBJdCB3aWxsIGRpZmZlciBpZiB0aGUgcmVxdWVzdCBpcyBncmVhdGVyIHRoYW4gdGhlCi0gICBsb25nZXN0IGNvZGUgb3IgaWYgaXQgaXMgbGVzcyB0aGFuIHRoZSBzaG9ydGVzdCBjb2RlLgotICovCi1pbnQgWkxJQl9JTlRFUk5BTCBpbmZsYXRlX3RhYmxlKAotY29kZXR5cGUgdHlwZSwKLXVuc2lnbmVkIHNob3J0IEZBUiAqbGVucywKLXVuc2lnbmVkIGNvZGVzLAotY29kZSBGQVIgKiBGQVIgKnRhYmxlLAotdW5zaWduZWQgRkFSICpiaXRzLAotdW5zaWduZWQgc2hvcnQgRkFSICp3b3JrKQotewotICAgIHVuc2lnbmVkIGxlbjsgICAgICAgICAgICAgICAvKiBhIGNvZGUncyBsZW5ndGggaW4gYml0cyAqLwotICAgIHVuc2lnbmVkIHN5bTsgICAgICAgICAgICAgICAvKiBpbmRleCBvZiBjb2RlIHN5bWJvbHMgKi8KLSAgICB1bnNpZ25lZCBtaW4sIG1heDsgICAgICAgICAgLyogbWluaW11bSBhbmQgbWF4aW11bSBjb2RlIGxlbmd0aHMgKi8KLSAgICB1bnNpZ25lZCByb290OyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHJvb3QgdGFibGUgKi8KLSAgICB1bnNpZ25lZCBjdXJyOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIGN1cnJlbnQgdGFibGUgKi8KLSAgICB1bnNpZ25lZCBkcm9wOyAgICAgICAgICAgICAgLyogY29kZSBiaXRzIHRvIGRyb3AgZm9yIHN1Yi10YWJsZSAqLwotICAgIGludCBsZWZ0OyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgcHJlZml4IGNvZGVzIGF2YWlsYWJsZSAqLwotICAgIHVuc2lnbmVkIHVzZWQ7ICAgICAgICAgICAgICAvKiBjb2RlIGVudHJpZXMgaW4gdGFibGUgdXNlZCAqLwotICAgIHVuc2lnbmVkIGh1ZmY7ICAgICAgICAgICAgICAvKiBIdWZmbWFuIGNvZGUgKi8KLSAgICB1bnNpZ25lZCBpbmNyOyAgICAgICAgICAgICAgLyogZm9yIGluY3JlbWVudGluZyBjb2RlLCBpbmRleCAqLwotICAgIHVuc2lnbmVkIGZpbGw7ICAgICAgICAgICAgICAvKiBpbmRleCBmb3IgcmVwbGljYXRpbmcgZW50cmllcyAqLwotICAgIHVuc2lnbmVkIGxvdzsgICAgICAgICAgICAgICAvKiBsb3cgYml0cyBmb3IgY3VycmVudCByb290IGVudHJ5ICovCi0gICAgdW5zaWduZWQgbWFzazsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGxvdyByb290IGJpdHMgKi8KLSAgICBjb2RlIGhlcmU7ICAgICAgICAgICAgICAgICAgLyogdGFibGUgZW50cnkgZm9yIGR1cGxpY2F0aW9uICovCi0gICAgY29kZSBGQVIgKm5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIHRhYmxlICovCi0gICAgY29uc3QgdW5zaWduZWQgc2hvcnQgRkFSICpiYXNlOyAgICAgLyogYmFzZSB2YWx1ZSB0YWJsZSB0byB1c2UgKi8KLSAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBGQVIgKmV4dHJhOyAgICAvKiBleHRyYSBiaXRzIHRhYmxlIHRvIHVzZSAqLwotICAgIGludCBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYmFzZSBhbmQgZXh0cmEgZm9yIHN5bWJvbCA+IGVuZCAqLwotICAgIHVuc2lnbmVkIHNob3J0IGNvdW50W01BWEJJVFMrMV07ICAgIC8qIG51bWJlciBvZiBjb2RlcyBvZiBlYWNoIGxlbmd0aCAqLwotICAgIHVuc2lnbmVkIHNob3J0IG9mZnNbTUFYQklUUysxXTsgICAgIC8qIG9mZnNldHMgaW4gdGFibGUgZm9yIGVhY2ggbGVuZ3RoICovCi0gICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGxiYXNlWzMxXSA9IHsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGJhc2UgKi8KLSAgICAgICAgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMywgMTUsIDE3LCAxOSwgMjMsIDI3LCAzMSwKLSAgICAgICAgMzUsIDQzLCA1MSwgNTksIDY3LCA4MywgOTksIDExNSwgMTMxLCAxNjMsIDE5NSwgMjI3LCAyNTgsIDAsIDB9OwotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBsZXh0WzMxXSA9IHsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGV4dHJhICovCi0gICAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LAotICAgICAgICAxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAxNiwgNzIsIDc4fTsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgZGJhc2VbMzJdID0geyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBiYXNlICovCi0gICAgICAgIDEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MywKLSAgICAgICAgMjU3LCAzODUsIDUxMywgNzY5LCAxMDI1LCAxNTM3LCAyMDQ5LCAzMDczLCA0MDk3LCA2MTQ1LAotICAgICAgICA4MTkzLCAxMjI4OSwgMTYzODUsIDI0NTc3LCAwLCAwfTsKLSAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgZGV4dFszMl0gPSB7IC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGV4dHJhICovCi0gICAgICAgIDE2LCAxNiwgMTYsIDE2LCAxNywgMTcsIDE4LCAxOCwgMTksIDE5LCAyMCwgMjAsIDIxLCAyMSwgMjIsIDIyLAotICAgICAgICAyMywgMjMsIDI0LCAyNCwgMjUsIDI1LCAyNiwgMjYsIDI3LCAyNywKLSAgICAgICAgMjgsIDI4LCAyOSwgMjksIDY0LCA2NH07Ci0KLSAgICAvKgotICAgICAgIFByb2Nlc3MgYSBzZXQgb2YgY29kZSBsZW5ndGhzIHRvIGNyZWF0ZSBhIGNhbm9uaWNhbCBIdWZmbWFuIGNvZGUuICBUaGUKLSAgICAgICBjb2RlIGxlbmd0aHMgYXJlIGxlbnNbMC4uY29kZXMtMV0uICBFYWNoIGxlbmd0aCBjb3JyZXNwb25kcyB0byB0aGUKLSAgICAgICBzeW1ib2xzIDAuLmNvZGVzLTEuICBUaGUgSHVmZm1hbiBjb2RlIGlzIGdlbmVyYXRlZCBieSBmaXJzdCBzb3J0aW5nIHRoZQotICAgICAgIHN5bWJvbHMgYnkgbGVuZ3RoIGZyb20gc2hvcnQgdG8gbG9uZywgYW5kIHJldGFpbmluZyB0aGUgc3ltYm9sIG9yZGVyCi0gICAgICAgZm9yIGNvZGVzIHdpdGggZXF1YWwgbGVuZ3Rocy4gIFRoZW4gdGhlIGNvZGUgc3RhcnRzIHdpdGggYWxsIHplcm8gYml0cwotICAgICAgIGZvciB0aGUgZmlyc3QgY29kZSBvZiB0aGUgc2hvcnRlc3QgbGVuZ3RoLCBhbmQgdGhlIGNvZGVzIGFyZSBpbnRlZ2VyCi0gICAgICAgaW5jcmVtZW50cyBmb3IgdGhlIHNhbWUgbGVuZ3RoLCBhbmQgemVyb3MgYXJlIGFwcGVuZGVkIGFzIHRoZSBsZW5ndGgKLSAgICAgICBpbmNyZWFzZXMuICBGb3IgdGhlIGRlZmxhdGUgZm9ybWF0LCB0aGVzZSBiaXRzIGFyZSBzdG9yZWQgYmFja3dhcmRzCi0gICAgICAgZnJvbSB0aGVpciBtb3JlIG5hdHVyYWwgaW50ZWdlciBpbmNyZW1lbnQgb3JkZXJpbmcsIGFuZCBzbyB3aGVuIHRoZQotICAgICAgIGRlY29kaW5nIHRhYmxlcyBhcmUgYnVpbHQgaW4gdGhlIGxhcmdlIGxvb3AgYmVsb3csIHRoZSBpbnRlZ2VyIGNvZGVzCi0gICAgICAgYXJlIGluY3JlbWVudGVkIGJhY2t3YXJkcy4KLQotICAgICAgIFRoaXMgcm91dGluZSBhc3N1bWVzLCBidXQgZG9lcyBub3QgY2hlY2ssIHRoYXQgYWxsIG9mIHRoZSBlbnRyaWVzIGluCi0gICAgICAgbGVuc1tdIGFyZSBpbiB0aGUgcmFuZ2UgMC4uTUFYQklUUy4gIFRoZSBjYWxsZXIgbXVzdCBhc3N1cmUgdGhpcy4KLSAgICAgICAxLi5NQVhCSVRTIGlzIGludGVycHJldGVkIGFzIHRoYXQgY29kZSBsZW5ndGguICB6ZXJvIG1lYW5zIHRoYXQgdGhhdAotICAgICAgIHN5bWJvbCBkb2VzIG5vdCBvY2N1ciBpbiB0aGlzIGNvZGUuCi0KLSAgICAgICBUaGUgY29kZXMgYXJlIHNvcnRlZCBieSBjb21wdXRpbmcgYSBjb3VudCBvZiBjb2RlcyBmb3IgZWFjaCBsZW5ndGgsCi0gICAgICAgY3JlYXRpbmcgZnJvbSB0aGF0IGEgdGFibGUgb2Ygc3RhcnRpbmcgaW5kaWNlcyBmb3IgZWFjaCBsZW5ndGggaW4gdGhlCi0gICAgICAgc29ydGVkIHRhYmxlLCBhbmQgdGhlbiBlbnRlcmluZyB0aGUgc3ltYm9scyBpbiBvcmRlciBpbiB0aGUgc29ydGVkCi0gICAgICAgdGFibGUuICBUaGUgc29ydGVkIHRhYmxlIGlzIHdvcmtbXSwgd2l0aCB0aGF0IHNwYWNlIGJlaW5nIHByb3ZpZGVkIGJ5Ci0gICAgICAgdGhlIGNhbGxlci4KLQotICAgICAgIFRoZSBsZW5ndGggY291bnRzIGFyZSB1c2VkIGZvciBvdGhlciBwdXJwb3NlcyBhcyB3ZWxsLCBpLmUuIGZpbmRpbmcKLSAgICAgICB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGggY29kZXMsIGRldGVybWluaW5nIGlmIHRoZXJlIGFyZSBhbnkKLSAgICAgICBjb2RlcyBhdCBhbGwsIGNoZWNraW5nIGZvciBhIHZhbGlkIHNldCBvZiBsZW5ndGhzLCBhbmQgbG9va2luZyBhaGVhZAotICAgICAgIGF0IGxlbmd0aCBjb3VudHMgdG8gZGV0ZXJtaW5lIHN1Yi10YWJsZSBzaXplcyB3aGVuIGJ1aWxkaW5nIHRoZQotICAgICAgIGRlY29kaW5nIHRhYmxlcy4KLSAgICAgKi8KLQotICAgIC8qIGFjY3VtdWxhdGUgbGVuZ3RocyBmb3IgY29kZXMgKGFzc3VtZXMgbGVuc1tdIGFsbCBpbiAwLi5NQVhCSVRTKSAqLwotICAgIGZvciAobGVuID0gMDsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKQotICAgICAgICBjb3VudFtsZW5dID0gMDsKLSAgICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykKLSAgICAgICAgY291bnRbbGVuc1tzeW1dXSsrOwotCi0gICAgLyogYm91bmQgY29kZSBsZW5ndGhzLCBmb3JjZSByb290IHRvIGJlIHdpdGhpbiBjb2RlIGxlbmd0aHMgKi8KLSAgICByb290ID0gKmJpdHM7Ci0gICAgZm9yIChtYXggPSBNQVhCSVRTOyBtYXggPj0gMTsgbWF4LS0pCi0gICAgICAgIGlmIChjb3VudFttYXhdICE9IDApIGJyZWFrOwotICAgIGlmIChyb290ID4gbWF4KSByb290ID0gbWF4OwotICAgIGlmIChtYXggPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgIC8qIG5vIHN5bWJvbHMgdG8gY29kZSBhdCBhbGwgKi8KLSAgICAgICAgaGVyZS5vcCA9ICh1bnNpZ25lZCBjaGFyKTY0OyAgICAvKiBpbnZhbGlkIGNvZGUgbWFya2VyICovCi0gICAgICAgIGhlcmUuYml0cyA9ICh1bnNpZ25lZCBjaGFyKTE7Ci0gICAgICAgIGhlcmUudmFsID0gKHVuc2lnbmVkIHNob3J0KTA7Ci0gICAgICAgICooKnRhYmxlKSsrID0gaGVyZTsgICAgICAgICAgICAgLyogbWFrZSBhIHRhYmxlIHRvIGZvcmNlIGFuIGVycm9yICovCi0gICAgICAgICooKnRhYmxlKSsrID0gaGVyZTsKLSAgICAgICAgKmJpdHMgPSAxOwotICAgICAgICByZXR1cm4gMDsgICAgIC8qIG5vIHN5bWJvbHMsIGJ1dCB3YWl0IGZvciBkZWNvZGluZyB0byByZXBvcnQgZXJyb3IgKi8KLSAgICB9Ci0gICAgZm9yIChtaW4gPSAxOyBtaW4gPCBtYXg7IG1pbisrKQotICAgICAgICBpZiAoY291bnRbbWluXSAhPSAwKSBicmVhazsKLSAgICBpZiAocm9vdCA8IG1pbikgcm9vdCA9IG1pbjsKLQotICAgIC8qIGNoZWNrIGZvciBhbiBvdmVyLXN1YnNjcmliZWQgb3IgaW5jb21wbGV0ZSBzZXQgb2YgbGVuZ3RocyAqLwotICAgIGxlZnQgPSAxOwotICAgIGZvciAobGVuID0gMTsgbGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7Ci0gICAgICAgIGxlZnQgPDw9IDE7Ci0gICAgICAgIGxlZnQgLT0gY291bnRbbGVuXTsKLSAgICAgICAgaWYgKGxlZnQgPCAwKSByZXR1cm4gLTE7ICAgICAgICAvKiBvdmVyLXN1YnNjcmliZWQgKi8KLSAgICB9Ci0gICAgaWYgKGxlZnQgPiAwICYmICh0eXBlID09IENPREVTIHx8IG1heCAhPSAxKSkKLSAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAvKiBpbmNvbXBsZXRlIHNldCAqLwotCi0gICAgLyogZ2VuZXJhdGUgb2Zmc2V0cyBpbnRvIHN5bWJvbCB0YWJsZSBmb3IgZWFjaCBsZW5ndGggZm9yIHNvcnRpbmcgKi8KLSAgICBvZmZzWzFdID0gMDsKLSAgICBmb3IgKGxlbiA9IDE7IGxlbiA8IE1BWEJJVFM7IGxlbisrKQotICAgICAgICBvZmZzW2xlbiArIDFdID0gb2Zmc1tsZW5dICsgY291bnRbbGVuXTsKLQotICAgIC8qIHNvcnQgc3ltYm9scyBieSBsZW5ndGgsIGJ5IHN5bWJvbCBvcmRlciB3aXRoaW4gZWFjaCBsZW5ndGggKi8KLSAgICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykKLSAgICAgICAgaWYgKGxlbnNbc3ltXSAhPSAwKSB3b3JrW29mZnNbbGVuc1tzeW1dXSsrXSA9ICh1bnNpZ25lZCBzaG9ydClzeW07Ci0KLSAgICAvKgotICAgICAgIENyZWF0ZSBhbmQgZmlsbCBpbiBkZWNvZGluZyB0YWJsZXMuICBJbiB0aGlzIGxvb3AsIHRoZSB0YWJsZSBiZWluZwotICAgICAgIGZpbGxlZCBpcyBhdCBuZXh0IGFuZCBoYXMgY3VyciBpbmRleCBiaXRzLiAgVGhlIGNvZGUgYmVpbmcgdXNlZCBpcyBodWZmCi0gICAgICAgd2l0aCBsZW5ndGggbGVuLiAgVGhhdCBjb2RlIGlzIGNvbnZlcnRlZCB0byBhbiBpbmRleCBieSBkcm9wcGluZyBkcm9wCi0gICAgICAgYml0cyBvZmYgb2YgdGhlIGJvdHRvbS4gIEZvciBjb2RlcyB3aGVyZSBsZW4gaXMgbGVzcyB0aGFuIGRyb3AgKyBjdXJyLAotICAgICAgIHRob3NlIHRvcCBkcm9wICsgY3VyciAtIGxlbiBiaXRzIGFyZSBpbmNyZW1lbnRlZCB0aHJvdWdoIGFsbCB2YWx1ZXMgdG8KLSAgICAgICBmaWxsIHRoZSB0YWJsZSB3aXRoIHJlcGxpY2F0ZWQgZW50cmllcy4KLQotICAgICAgIHJvb3QgaXMgdGhlIG51bWJlciBvZiBpbmRleCBiaXRzIGZvciB0aGUgcm9vdCB0YWJsZS4gIFdoZW4gbGVuIGV4Y2VlZHMKLSAgICAgICByb290LCBzdWItdGFibGVzIGFyZSBjcmVhdGVkIHBvaW50ZWQgdG8gYnkgdGhlIHJvb3QgZW50cnkgd2l0aCBhbiBpbmRleAotICAgICAgIG9mIHRoZSBsb3cgcm9vdCBiaXRzIG9mIGh1ZmYuICBUaGlzIGlzIHNhdmVkIGluIGxvdyB0byBjaGVjayBmb3Igd2hlbiBhCi0gICAgICAgbmV3IHN1Yi10YWJsZSBzaG91bGQgYmUgc3RhcnRlZC4gIGRyb3AgaXMgemVybyB3aGVuIHRoZSByb290IHRhYmxlIGlzCi0gICAgICAgYmVpbmcgZmlsbGVkLCBhbmQgZHJvcCBpcyByb290IHdoZW4gc3ViLXRhYmxlcyBhcmUgYmVpbmcgZmlsbGVkLgotCi0gICAgICAgV2hlbiBhIG5ldyBzdWItdGFibGUgaXMgbmVlZGVkLCBpdCBpcyBuZWNlc3NhcnkgdG8gbG9vayBhaGVhZCBpbiB0aGUKLSAgICAgICBjb2RlIGxlbmd0aHMgdG8gZGV0ZXJtaW5lIHdoYXQgc2l6ZSBzdWItdGFibGUgaXMgbmVlZGVkLiAgVGhlIGxlbmd0aAotICAgICAgIGNvdW50cyBhcmUgdXNlZCBmb3IgdGhpcywgYW5kIHNvIGNvdW50W10gaXMgZGVjcmVtZW50ZWQgYXMgY29kZXMgYXJlCi0gICAgICAgZW50ZXJlZCBpbiB0aGUgdGFibGVzLgotCi0gICAgICAgdXNlZCBrZWVwcyB0cmFjayBvZiBob3cgbWFueSB0YWJsZSBlbnRyaWVzIGhhdmUgYmVlbiBhbGxvY2F0ZWQgZnJvbSB0aGUKLSAgICAgICBwcm92aWRlZCAqdGFibGUgc3BhY2UuICBJdCBpcyBjaGVja2VkIGZvciBMRU5TIGFuZCBESVNUIHRhYmxlcyBhZ2FpbnN0Ci0gICAgICAgdGhlIGNvbnN0YW50cyBFTk9VR0hfTEVOUyBhbmQgRU5PVUdIX0RJU1RTIHRvIGd1YXJkIGFnYWluc3QgY2hhbmdlcyBpbgotICAgICAgIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSBjb25zdGFudHMuICBTZWUgdGhlIGNvbW1lbnRzIGluIGluZnRyZWVzLmgKLSAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotICAgICAgIHN5bSBpbmNyZW1lbnRzIHRocm91Z2ggYWxsIHN5bWJvbHMsIGFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzIHdoZW4KLSAgICAgICBhbGwgY29kZXMgb2YgbGVuZ3RoIG1heCwgaS5lLiBhbGwgY29kZXMsIGhhdmUgYmVlbiBwcm9jZXNzZWQuICBUaGlzCi0gICAgICAgcm91dGluZSBwZXJtaXRzIGluY29tcGxldGUgY29kZXMsIHNvIGFub3RoZXIgbG9vcCBhZnRlciB0aGlzIG9uZSBmaWxscwotICAgICAgIGluIHRoZSByZXN0IG9mIHRoZSBkZWNvZGluZyB0YWJsZXMgd2l0aCBpbnZhbGlkIGNvZGUgbWFya2Vycy4KLSAgICAgKi8KLQotICAgIC8qIHNldCB1cCBmb3IgY29kZSB0eXBlICovCi0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBDT0RFUzoKLSAgICAgICAgYmFzZSA9IGV4dHJhID0gd29yazsgICAgLyogZHVtbXkgdmFsdWUtLW5vdCB1c2VkICovCi0gICAgICAgIGVuZCA9IDE5OwotICAgICAgICBicmVhazsKLSAgICBjYXNlIExFTlM6Ci0gICAgICAgIGJhc2UgPSBsYmFzZTsKLSAgICAgICAgYmFzZSAtPSAyNTc7Ci0gICAgICAgIGV4dHJhID0gbGV4dDsKLSAgICAgICAgZXh0cmEgLT0gMjU3OwotICAgICAgICBlbmQgPSAyNTY7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6ICAgICAgICAgICAgLyogRElTVFMgKi8KLSAgICAgICAgYmFzZSA9IGRiYXNlOwotICAgICAgICBleHRyYSA9IGRleHQ7Ci0gICAgICAgIGVuZCA9IC0xOwotICAgIH0KLQotICAgIC8qIGluaXRpYWxpemUgc3RhdGUgZm9yIGxvb3AgKi8KLSAgICBodWZmID0gMDsgICAgICAgICAgICAgICAgICAgLyogc3RhcnRpbmcgY29kZSAqLwotICAgIHN5bSA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIHN5bWJvbCAqLwotICAgIGxlbiA9IG1pbjsgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIGxlbmd0aCAqLwotICAgIG5leHQgPSAqdGFibGU7ICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIHRvIGZpbGwgaW4gKi8KLSAgICBjdXJyID0gcm9vdDsgICAgICAgICAgICAgICAgLyogY3VycmVudCB0YWJsZSBpbmRleCBiaXRzICovCi0gICAgZHJvcCA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgYml0cyB0byBkcm9wIGZyb20gY29kZSBmb3IgaW5kZXggKi8KLSAgICBsb3cgPSAodW5zaWduZWQpKC0xKTsgICAgICAgLyogdHJpZ2dlciBuZXcgc3ViLXRhYmxlIHdoZW4gbGVuID4gcm9vdCAqLwotICAgIHVzZWQgPSAxVSA8PCByb290OyAgICAgICAgICAvKiB1c2Ugcm9vdCB0YWJsZSBlbnRyaWVzICovCi0gICAgbWFzayA9IHVzZWQgLSAxOyAgICAgICAgICAgIC8qIG1hc2sgZm9yIGNvbXBhcmluZyBsb3cgKi8KLQotICAgIC8qIGNoZWNrIGF2YWlsYWJsZSB0YWJsZSBzcGFjZSAqLwotICAgIGlmICgodHlwZSA9PSBMRU5TICYmIHVzZWQgPiBFTk9VR0hfTEVOUykgfHwKLSAgICAgICAgKHR5cGUgPT0gRElTVFMgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUykpCi0gICAgICAgIHJldHVybiAxOwotCi0gICAgLyogcHJvY2VzcyBhbGwgY29kZXMgYW5kIG1ha2UgdGFibGUgZW50cmllcyAqLwotICAgIGZvciAoOzspIHsKLSAgICAgICAgLyogY3JlYXRlIHRhYmxlIGVudHJ5ICovCi0gICAgICAgIGhlcmUuYml0cyA9ICh1bnNpZ25lZCBjaGFyKShsZW4gLSBkcm9wKTsKLSAgICAgICAgaWYgKChpbnQpKHdvcmtbc3ltXSkgPCBlbmQpIHsKLSAgICAgICAgICAgIGhlcmUub3AgPSAodW5zaWduZWQgY2hhcikwOwotICAgICAgICAgICAgaGVyZS52YWwgPSB3b3JrW3N5bV07Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoKGludCkod29ya1tzeW1dKSA+IGVuZCkgewotICAgICAgICAgICAgaGVyZS5vcCA9ICh1bnNpZ25lZCBjaGFyKShleHRyYVt3b3JrW3N5bV1dKTsKLSAgICAgICAgICAgIGhlcmUudmFsID0gYmFzZVt3b3JrW3N5bV1dOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaGVyZS5vcCA9ICh1bnNpZ25lZCBjaGFyKSgzMiArIDY0KTsgICAgICAgICAvKiBlbmQgb2YgYmxvY2sgKi8KLSAgICAgICAgICAgIGhlcmUudmFsID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIHJlcGxpY2F0ZSBmb3IgdGhvc2UgaW5kaWNlcyB3aXRoIGxvdyBsZW4gYml0cyBlcXVhbCB0byBodWZmICovCi0gICAgICAgIGluY3IgPSAxVSA8PCAobGVuIC0gZHJvcCk7Ci0gICAgICAgIGZpbGwgPSAxVSA8PCBjdXJyOwotICAgICAgICBtaW4gPSBmaWxsOyAgICAgICAgICAgICAgICAgLyogc2F2ZSBvZmZzZXQgdG8gbmV4dCB0YWJsZSAqLwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBmaWxsIC09IGluY3I7Ci0gICAgICAgICAgICBuZXh0WyhodWZmID4+IGRyb3ApICsgZmlsbF0gPSBoZXJlOwotICAgICAgICB9IHdoaWxlIChmaWxsICE9IDApOwotCi0gICAgICAgIC8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGxlbi1iaXQgY29kZSBodWZmICovCi0gICAgICAgIGluY3IgPSAxVSA8PCAobGVuIC0gMSk7Ci0gICAgICAgIHdoaWxlIChodWZmICYgaW5jcikKLSAgICAgICAgICAgIGluY3IgPj49IDE7Ci0gICAgICAgIGlmIChpbmNyICE9IDApIHsKLSAgICAgICAgICAgIGh1ZmYgJj0gaW5jciAtIDE7Ci0gICAgICAgICAgICBodWZmICs9IGluY3I7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgaHVmZiA9IDA7Ci0KLSAgICAgICAgLyogZ28gdG8gbmV4dCBzeW1ib2wsIHVwZGF0ZSBjb3VudCwgbGVuICovCi0gICAgICAgIHN5bSsrOwotICAgICAgICBpZiAoLS0oY291bnRbbGVuXSkgPT0gMCkgewotICAgICAgICAgICAgaWYgKGxlbiA9PSBtYXgpIGJyZWFrOwotICAgICAgICAgICAgbGVuID0gbGVuc1t3b3JrW3N5bV1dOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogY3JlYXRlIG5ldyBzdWItdGFibGUgaWYgbmVlZGVkICovCi0gICAgICAgIGlmIChsZW4gPiByb290ICYmIChodWZmICYgbWFzaykgIT0gbG93KSB7Ci0gICAgICAgICAgICAvKiBpZiBmaXJzdCB0aW1lLCB0cmFuc2l0aW9uIHRvIHN1Yi10YWJsZXMgKi8KLSAgICAgICAgICAgIGlmIChkcm9wID09IDApCi0gICAgICAgICAgICAgICAgZHJvcCA9IHJvb3Q7Ci0KLSAgICAgICAgICAgIC8qIGluY3JlbWVudCBwYXN0IGxhc3QgdGFibGUgKi8KLSAgICAgICAgICAgIG5leHQgKz0gbWluOyAgICAgICAgICAgIC8qIGhlcmUgbWluIGlzIDEgPDwgY3VyciAqLwotCi0gICAgICAgICAgICAvKiBkZXRlcm1pbmUgbGVuZ3RoIG9mIG5leHQgdGFibGUgKi8KLSAgICAgICAgICAgIGN1cnIgPSBsZW4gLSBkcm9wOwotICAgICAgICAgICAgbGVmdCA9IChpbnQpKDEgPDwgY3Vycik7Ci0gICAgICAgICAgICB3aGlsZSAoY3VyciArIGRyb3AgPCBtYXgpIHsKLSAgICAgICAgICAgICAgICBsZWZ0IC09IGNvdW50W2N1cnIgKyBkcm9wXTsKLSAgICAgICAgICAgICAgICBpZiAobGVmdCA8PSAwKSBicmVhazsKLSAgICAgICAgICAgICAgICBjdXJyKys7Ci0gICAgICAgICAgICAgICAgbGVmdCA8PD0gMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyogY2hlY2sgZm9yIGVub3VnaCBzcGFjZSAqLwotICAgICAgICAgICAgdXNlZCArPSAxVSA8PCBjdXJyOwotICAgICAgICAgICAgaWYgKCh0eXBlID09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fAotICAgICAgICAgICAgICAgICh0eXBlID09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKQotICAgICAgICAgICAgICAgIHJldHVybiAxOwotCi0gICAgICAgICAgICAvKiBwb2ludCBlbnRyeSBpbiByb290IHRhYmxlIHRvIHN1Yi10YWJsZSAqLwotICAgICAgICAgICAgbG93ID0gaHVmZiAmIG1hc2s7Ci0gICAgICAgICAgICAoKnRhYmxlKVtsb3ddLm9wID0gKHVuc2lnbmVkIGNoYXIpY3VycjsKLSAgICAgICAgICAgICgqdGFibGUpW2xvd10uYml0cyA9ICh1bnNpZ25lZCBjaGFyKXJvb3Q7Ci0gICAgICAgICAgICAoKnRhYmxlKVtsb3ddLnZhbCA9ICh1bnNpZ25lZCBzaG9ydCkobmV4dCAtICp0YWJsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBmaWxsIGluIHJlbWFpbmluZyB0YWJsZSBlbnRyeSBpZiBjb2RlIGlzIGluY29tcGxldGUgKGd1YXJhbnRlZWQgdG8gaGF2ZQotICAgICAgIGF0IG1vc3Qgb25lIHJlbWFpbmluZyBlbnRyeSwgc2luY2UgaWYgdGhlIGNvZGUgaXMgaW5jb21wbGV0ZSwgdGhlCi0gICAgICAgbWF4aW11bSBjb2RlIGxlbmd0aCB0aGF0IHdhcyBhbGxvd2VkIHRvIGdldCB0aGlzIGZhciBpcyBvbmUgYml0KSAqLwotICAgIGlmIChodWZmICE9IDApIHsKLSAgICAgICAgaGVyZS5vcCA9ICh1bnNpZ25lZCBjaGFyKTY0OyAgICAgICAgICAgIC8qIGludmFsaWQgY29kZSBtYXJrZXIgKi8KLSAgICAgICAgaGVyZS5iaXRzID0gKHVuc2lnbmVkIGNoYXIpKGxlbiAtIGRyb3ApOwotICAgICAgICBoZXJlLnZhbCA9ICh1bnNpZ25lZCBzaG9ydCkwOwotICAgICAgICBuZXh0W2h1ZmZdID0gaGVyZTsKLSAgICB9Ci0KLSAgICAvKiBzZXQgcmV0dXJuIHBhcmFtZXRlcnMgKi8KLSAgICAqdGFibGUgKz0gdXNlZDsKLSAgICAqYml0cyA9IHJvb3Q7Ci0gICAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS96bGliX3YxMjgvaW5mdHJlZXMuaCBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9pbmZ0cmVlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWE1M2EwLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3psaWJfdjEyOC9pbmZ0cmVlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyogaW5mdHJlZXMuaCAtLSBoZWFkZXIgdG8gdXNlIGluZnRyZWVzLmMKLSAqIENvcHlyaWdodCAoQykgMTk5NS0yMDA1LCAyMDEwIE1hcmsgQWRsZXIKLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBXQVJOSU5HOiB0aGlzIGZpbGUgc2hvdWxkICpub3QqIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zLiBJdCBpcwotICAgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYW5kIGlzCi0gICBzdWJqZWN0IHRvIGNoYW5nZS4gQXBwbGljYXRpb25zIHNob3VsZCBvbmx5IHVzZSB6bGliLmguCi0gKi8KLQotLyogU3RydWN0dXJlIGZvciBkZWNvZGluZyB0YWJsZXMuICBFYWNoIGVudHJ5IHByb3ZpZGVzIGVpdGhlciB0aGUKLSAgIGluZm9ybWF0aW9uIG5lZWRlZCB0byBkbyB0aGUgb3BlcmF0aW9uIHJlcXVlc3RlZCBieSB0aGUgY29kZSB0aGF0Ci0gICBpbmRleGVkIHRoYXQgdGFibGUgZW50cnksIG9yIGl0IHByb3ZpZGVzIGEgcG9pbnRlciB0byBhbm90aGVyCi0gICB0YWJsZSB0aGF0IGluZGV4ZXMgbW9yZSBiaXRzIG9mIHRoZSBjb2RlLiAgb3AgaW5kaWNhdGVzIHdoZXRoZXIKLSAgIHRoZSBlbnRyeSBpcyBhIHBvaW50ZXIgdG8gYW5vdGhlciB0YWJsZSwgYSBsaXRlcmFsLCBhIGxlbmd0aCBvcgotICAgZGlzdGFuY2UsIGFuIGVuZC1vZi1ibG9jaywgb3IgYW4gaW52YWxpZCBjb2RlLiAgRm9yIGEgdGFibGUKLSAgIHBvaW50ZXIsIHRoZSBsb3cgZm91ciBiaXRzIG9mIG9wIGlzIHRoZSBudW1iZXIgb2YgaW5kZXggYml0cyBvZgotICAgdGhhdCB0YWJsZS4gIEZvciBhIGxlbmd0aCBvciBkaXN0YW5jZSwgdGhlIGxvdyBmb3VyIGJpdHMgb2Ygb3AKLSAgIGlzIHRoZSBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBnZXQgYWZ0ZXIgdGhlIGNvZGUuICBiaXRzIGlzCi0gICB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhpcyBjb2RlIG9yIHBhcnQgb2YgdGhlIGNvZGUgdG8gZHJvcCBvZmYKLSAgIG9mIHRoZSBiaXQgYnVmZmVyLiAgdmFsIGlzIHRoZSBhY3R1YWwgYnl0ZSB0byBvdXRwdXQgaW4gdGhlIGNhc2UKLSAgIG9mIGEgbGl0ZXJhbCwgdGhlIGJhc2UgbGVuZ3RoIG9yIGRpc3RhbmNlLCBvciB0aGUgb2Zmc2V0IGZyb20KLSAgIHRoZSBjdXJyZW50IHRhYmxlIHRvIHRoZSBuZXh0IHRhYmxlLiAgRWFjaCBlbnRyeSBpcyBmb3VyIGJ5dGVzLiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAgIHVuc2lnbmVkIGNoYXIgb3A7ICAgICAgICAgICAvKiBvcGVyYXRpb24sIGV4dHJhIGJpdHMsIHRhYmxlIGJpdHMgKi8KLSAgICB1bnNpZ25lZCBjaGFyIGJpdHM7ICAgICAgICAgLyogYml0cyBpbiB0aGlzIHBhcnQgb2YgdGhlIGNvZGUgKi8KLSAgICB1bnNpZ25lZCBzaG9ydCB2YWw7ICAgICAgICAgLyogb2Zmc2V0IGluIHRhYmxlIG9yIGNvZGUgdmFsdWUgKi8KLX0gY29kZTsKLQotLyogb3AgdmFsdWVzIGFzIHNldCBieSBpbmZsYXRlX3RhYmxlKCk6Ci0gICAgMDAwMDAwMDAgLSBsaXRlcmFsCi0gICAgMDAwMHR0dHQgLSB0YWJsZSBsaW5rLCB0dHR0ICE9IDAgaXMgdGhlIG51bWJlciBvZiB0YWJsZSBpbmRleCBiaXRzCi0gICAgMDAwMWVlZWUgLSBsZW5ndGggb3IgZGlzdGFuY2UsIGVlZWUgaXMgdGhlIG51bWJlciBvZiBleHRyYSBiaXRzCi0gICAgMDExMDAwMDAgLSBlbmQgb2YgYmxvY2sKLSAgICAwMTAwMDAwMCAtIGludmFsaWQgY29kZQotICovCi0KLS8qIE1heGltdW0gc2l6ZSBvZiB0aGUgZHluYW1pYyB0YWJsZS4gIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjb2RlIHN0cnVjdHVyZXMgaXMKLSAgIDE0NDQsIHdoaWNoIGlzIHRoZSBzdW0gb2YgODUyIGZvciBsaXRlcmFsL2xlbmd0aCBjb2RlcyBhbmQgNTkyIGZvciBkaXN0YW5jZQotICAgY29kZXMuICBUaGVzZSB2YWx1ZXMgd2VyZSBmb3VuZCBieSBleGhhdXN0aXZlIHNlYXJjaGVzIHVzaW5nIHRoZSBwcm9ncmFtCi0gICBleGFtcGxlcy9lbm91Z2guYyBmb3VuZCBpbiB0aGUgemxpYiBkaXN0cmlidHV0aW9uLiAgVGhlIGFyZ3VtZW50cyB0byB0aGF0Ci0gICBwcm9ncmFtIGFyZSB0aGUgbnVtYmVyIG9mIHN5bWJvbHMsIHRoZSBpbml0aWFsIHJvb3QgdGFibGUgc2l6ZSwgYW5kIHRoZQotICAgbWF4aW11bSBiaXQgbGVuZ3RoIG9mIGEgY29kZS4gICJlbm91Z2ggMjg2IDkgMTUiIGZvciBsaXRlcmFsL2xlbmd0aCBjb2RlcwotICAgcmV0dXJucyByZXR1cm5zIDg1MiwgYW5kICJlbm91Z2ggMzAgNiAxNSIgZm9yIGRpc3RhbmNlIGNvZGVzIHJldHVybnMgNTkyLgotICAgVGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplICg5IG9yIDYpIGlzIGZvdW5kIGluIHRoZSBmaWZ0aCBhcmd1bWVudCBvZiB0aGUKLSAgIGluZmxhdGVfdGFibGUoKSBjYWxscyBpbiBpbmZsYXRlLmMgYW5kIGluZmJhY2suYy4gIElmIHRoZSByb290IHRhYmxlIHNpemUgaXMKLSAgIGNoYW5nZWQsIHRoZW4gdGhlc2UgbWF4aW11bSBzaXplcyB3b3VsZCBiZSBuZWVkIHRvIGJlIHJlY2FsY3VsYXRlZCBhbmQKLSAgIHVwZGF0ZWQuICovCi0jZGVmaW5lIEVOT1VHSF9MRU5TIDg1MgotI2RlZmluZSBFTk9VR0hfRElTVFMgNTkyCi0jZGVmaW5lIEVOT1VHSCAoRU5PVUdIX0xFTlMrRU5PVUdIX0RJU1RTKQotCi0vKiBUeXBlIG9mIGNvZGUgdG8gYnVpbGQgZm9yIGluZmxhdGVfdGFibGUoKSAqLwotdHlwZWRlZiBlbnVtIHsKLSAgICBDT0RFUywKLSAgICBMRU5TLAotICAgIERJU1RTCi19IGNvZGV0eXBlOwotCi1pbnQgWkxJQl9JTlRFUk5BTCBpbmZsYXRlX3RhYmxlIE9GKChjb2RldHlwZSB0eXBlLCB1bnNpZ25lZCBzaG9ydCBGQVIgKmxlbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNvZGVzLCBjb2RlIEZBUiAqIEZBUiAqdGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZBUiAqYml0cywgdW5zaWduZWQgc2hvcnQgRkFSICp3b3JrKSk7CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS96bGliX3YxMjgvdHJlZXMuYyBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC90cmVlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWZkOTUyLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3psaWJfdjEyOC90cmVlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIyNiArMCwwIEBACi0vKiB0cmVlcy5jIC0tIG91dHB1dCBkZWZsYXRlZCBkYXRhIHVzaW5nIEh1ZmZtYW4gY29kaW5nCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMiBKZWFuLWxvdXAgR2FpbGx5Ci0gKiBkZXRlY3RfZGF0YV90eXBlKCkgZnVuY3Rpb24gcHJvdmlkZWQgZnJlZWx5IGJ5IENvc21pbiBUcnV0YSwgMjAwNgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qCi0gKiAgQUxHT1JJVEhNCi0gKgotICogICAgICBUaGUgImRlZmxhdGlvbiIgcHJvY2VzcyB1c2VzIHNldmVyYWwgSHVmZm1hbiB0cmVlcy4gVGhlIG1vcmUKLSAqICAgICAgY29tbW9uIHNvdXJjZSB2YWx1ZXMgYXJlIHJlcHJlc2VudGVkIGJ5IHNob3J0ZXIgYml0IHNlcXVlbmNlcy4KLSAqCi0gKiAgICAgIEVhY2ggY29kZSB0cmVlIGlzIHN0b3JlZCBpbiBhIGNvbXByZXNzZWQgZm9ybSB3aGljaCBpcyBpdHNlbGYKLSAqIGEgSHVmZm1hbiBlbmNvZGluZyBvZiB0aGUgbGVuZ3RocyBvZiBhbGwgdGhlIGNvZGUgc3RyaW5ncyAoaW4KLSAqIGFzY2VuZGluZyBvcmRlciBieSBzb3VyY2UgdmFsdWVzKS4gIFRoZSBhY3R1YWwgY29kZSBzdHJpbmdzIGFyZQotICogcmVjb25zdHJ1Y3RlZCBmcm9tIHRoZSBsZW5ndGhzIGluIHRoZSBpbmZsYXRlIHByb2Nlc3MsIGFzIGRlc2NyaWJlZAotICogaW4gdGhlIGRlZmxhdGUgc3BlY2lmaWNhdGlvbi4KLSAqCi0gKiAgUkVGRVJFTkNFUwotICoKLSAqICAgICAgRGV1dHNjaCwgTC5QLiwiJ0RlZmxhdGUnIENvbXByZXNzZWQgRGF0YSBGb3JtYXQgU3BlY2lmaWNhdGlvbiIuCi0gKiAgICAgIEF2YWlsYWJsZSBpbiBmdHAudXUubmV0Oi9wdWIvYXJjaGl2aW5nL3ppcC9kb2MvZGVmbGF0ZS0xLjEuZG9jCi0gKgotICogICAgICBTdG9yZXIsIEphbWVzIEEuCi0gKiAgICAgICAgICBEYXRhIENvbXByZXNzaW9uOiAgTWV0aG9kcyBhbmQgVGhlb3J5LCBwcC4gNDktNTAuCi0gKiAgICAgICAgICBDb21wdXRlciBTY2llbmNlIFByZXNzLCAxOTg4LiAgSVNCTiAwLTcxNjctODE1Ni01LgotICoKLSAqICAgICAgU2VkZ2V3aWNrLCBSLgotICogICAgICAgICAgQWxnb3JpdGhtcywgcDI5MC4KLSAqICAgICAgICAgIEFkZGlzb24tV2VzbGV5LCAxOTgzLiBJU0JOIDAtMjAxLTA2NjcyLTYuCi0gKi8KLQotLyogQCgjKSAkSWQkICovCi0KLS8qICNkZWZpbmUgR0VOX1RSRUVTX0ggKi8KLQotI2luY2x1ZGUgImRlZmxhdGUuaCIKLQotI2lmZGVmIERFQlVHCi0jICBpbmNsdWRlIDxjdHlwZS5oPgotI2VuZGlmCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogQ29uc3RhbnRzCi0gKi8KLQotI2RlZmluZSBNQVhfQkxfQklUUyA3Ci0vKiBCaXQgbGVuZ3RoIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQkxfQklUUyBiaXRzICovCi0KLSNkZWZpbmUgRU5EX0JMT0NLIDI1NgotLyogZW5kIG9mIGJsb2NrIGxpdGVyYWwgY29kZSAqLwotCi0jZGVmaW5lIFJFUF8zXzYgICAgICAxNgotLyogcmVwZWF0IHByZXZpb3VzIGJpdCBsZW5ndGggMy02IHRpbWVzICgyIGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqLwotCi0jZGVmaW5lIFJFUFpfM18xMCAgICAxNwotLyogcmVwZWF0IGEgemVybyBsZW5ndGggMy0xMCB0aW1lcyAgKDMgYml0cyBvZiByZXBlYXQgY291bnQpICovCi0KLSNkZWZpbmUgUkVQWl8xMV8xMzggIDE4Ci0vKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAxMS0xMzggdGltZXMgICg3IGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqLwotCi1sb2NhbCBjb25zdCBpbnQgZXh0cmFfbGJpdHNbTEVOR1RIX0NPREVTXSAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGxlbmd0aCBjb2RlICovCi0gICA9IHswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDB9OwotCi1sb2NhbCBjb25zdCBpbnQgZXh0cmFfZGJpdHNbRF9DT0RFU10gLyogZXh0cmEgYml0cyBmb3IgZWFjaCBkaXN0YW5jZSBjb2RlICovCi0gICA9IHswLDAsMCwwLDEsMSwyLDIsMywzLDQsNCw1LDUsNiw2LDcsNyw4LDgsOSw5LDEwLDEwLDExLDExLDEyLDEyLDEzLDEzfTsKLQotbG9jYWwgY29uc3QgaW50IGV4dHJhX2JsYml0c1tCTF9DT0RFU10vKiBleHRyYSBiaXRzIGZvciBlYWNoIGJpdCBsZW5ndGggY29kZSAqLwotICAgPSB7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwyLDMsN307Ci0KLWxvY2FsIGNvbnN0IHVjaCBibF9vcmRlcltCTF9DT0RFU10KLSAgID0gezE2LDE3LDE4LDAsOCw3LDksNiwxMCw1LDExLDQsMTIsMywxMywyLDE0LDEsMTV9OwotLyogVGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMgYXJlIHNlbnQgaW4gb3JkZXIgb2YgZGVjcmVhc2luZwotICogcHJvYmFiaWxpdHksIHRvIGF2b2lkIHRyYW5zbWl0dGluZyB0aGUgbGVuZ3RocyBmb3IgdW51c2VkIGJpdCBsZW5ndGggY29kZXMuCi0gKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBMb2NhbCBkYXRhLiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQgb25seSBvbmNlLgotICovCi0KLSNkZWZpbmUgRElTVF9DT0RFX0xFTiAgNTEyIC8qIHNlZSBkZWZpbml0aW9uIG9mIGFycmF5IGRpc3RfY29kZSBiZWxvdyAqLwotCi0jaWYgZGVmaW5lZChHRU5fVFJFRVNfSCkgfHwgIWRlZmluZWQoU1REQykKLS8qIG5vbiBBTlNJIGNvbXBpbGVycyBtYXkgbm90IGFjY2VwdCB0cmVlcy5oICovCi0KLWxvY2FsIGN0X2RhdGEgc3RhdGljX2x0cmVlW0xfQ09ERVMrMl07Ci0vKiBUaGUgc3RhdGljIGxpdGVyYWwgdHJlZS4gU2luY2UgdGhlIGJpdCBsZW5ndGhzIGFyZSBpbXBvc2VkLCB0aGVyZSBpcyBubwotICogbmVlZCBmb3IgdGhlIExfQ09ERVMgZXh0cmEgY29kZXMgdXNlZCBkdXJpbmcgaGVhcCBjb25zdHJ1Y3Rpb24uIEhvd2V2ZXIKLSAqIFRoZSBjb2RlcyAyODYgYW5kIDI4NyBhcmUgbmVlZGVkIHRvIGJ1aWxkIGEgY2Fub25pY2FsIHRyZWUgKHNlZSBfdHJfaW5pdAotICogYmVsb3cpLgotICovCi0KLWxvY2FsIGN0X2RhdGEgc3RhdGljX2R0cmVlW0RfQ09ERVNdOwotLyogVGhlIHN0YXRpYyBkaXN0YW5jZSB0cmVlLiAoQWN0dWFsbHkgYSB0cml2aWFsIHRyZWUgc2luY2UgYWxsIGNvZGVzIHVzZQotICogNSBiaXRzLikKLSAqLwotCi11Y2ggX2Rpc3RfY29kZVtESVNUX0NPREVfTEVOXTsKLS8qIERpc3RhbmNlIGNvZGVzLiBUaGUgZmlyc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBkaXN0YW5jZXMKLSAqIDMgLi4gMjU4LCB0aGUgbGFzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIHRvcCA4IGJpdHMgb2YKLSAqIHRoZSAxNSBiaXQgZGlzdGFuY2VzLgotICovCi0KLXVjaCBfbGVuZ3RoX2NvZGVbTUFYX01BVENILU1JTl9NQVRDSCsxXTsKLS8qIGxlbmd0aCBjb2RlIGZvciBlYWNoIG5vcm1hbGl6ZWQgbWF0Y2ggbGVuZ3RoICgwID09IE1JTl9NQVRDSCkgKi8KLQotbG9jYWwgaW50IGJhc2VfbGVuZ3RoW0xFTkdUSF9DT0RFU107Ci0vKiBGaXJzdCBub3JtYWxpemVkIGxlbmd0aCBmb3IgZWFjaCBjb2RlICgwID0gTUlOX01BVENIKSAqLwotCi1sb2NhbCBpbnQgYmFzZV9kaXN0W0RfQ09ERVNdOwotLyogRmlyc3Qgbm9ybWFsaXplZCBkaXN0YW5jZSBmb3IgZWFjaCBjb2RlICgwID0gZGlzdGFuY2Ugb2YgMSkgKi8KLQotI2Vsc2UKLSMgIGluY2x1ZGUgInRyZWVzLmgiCi0jZW5kaWYgLyogR0VOX1RSRUVTX0ggKi8KLQotc3RydWN0IHN0YXRpY190cmVlX2Rlc2NfcyB7Ci0gICAgY29uc3QgY3RfZGF0YSAqc3RhdGljX3RyZWU7ICAvKiBzdGF0aWMgdHJlZSBvciBOVUxMICovCi0gICAgY29uc3QgaW50ZiAqZXh0cmFfYml0czsgICAgICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGNvZGUgb3IgTlVMTCAqLwotICAgIGludCAgICAgZXh0cmFfYmFzZTsgICAgICAgICAgLyogYmFzZSBpbmRleCBmb3IgZXh0cmFfYml0cyAqLwotICAgIGludCAgICAgZWxlbXM7ICAgICAgICAgICAgICAgLyogbWF4IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdHJlZSAqLwotICAgIGludCAgICAgbWF4X2xlbmd0aDsgICAgICAgICAgLyogbWF4IGJpdCBsZW5ndGggZm9yIHRoZSBjb2RlcyAqLwotfTsKLQotbG9jYWwgc3RhdGljX3RyZWVfZGVzYyAgc3RhdGljX2xfZGVzYyA9Ci17c3RhdGljX2x0cmVlLCBleHRyYV9sYml0cywgTElURVJBTFMrMSwgTF9DT0RFUywgTUFYX0JJVFN9OwotCi1sb2NhbCBzdGF0aWNfdHJlZV9kZXNjICBzdGF0aWNfZF9kZXNjID0KLXtzdGF0aWNfZHRyZWUsIGV4dHJhX2RiaXRzLCAwLCAgICAgICAgICBEX0NPREVTLCBNQVhfQklUU307Ci0KLWxvY2FsIHN0YXRpY190cmVlX2Rlc2MgIHN0YXRpY19ibF9kZXNjID0KLXsoY29uc3QgY3RfZGF0YSAqKTAsIGV4dHJhX2JsYml0cywgMCwgICBCTF9DT0RFUywgTUFYX0JMX0JJVFN9OwotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIExvY2FsIChzdGF0aWMpIHJvdXRpbmVzIGluIHRoaXMgZmlsZS4KLSAqLwotCi1sb2NhbCB2b2lkIHRyX3N0YXRpY19pbml0IE9GKCh2b2lkKSk7Ci1sb2NhbCB2b2lkIGluaXRfYmxvY2sgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Ci1sb2NhbCB2b2lkIHBxZG93bmhlYXAgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCBjdF9kYXRhICp0cmVlLCBpbnQgaykpOwotbG9jYWwgdm9pZCBnZW5fYml0bGVuICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgdHJlZV9kZXNjICpkZXNjKSk7Ci1sb2NhbCB2b2lkIGdlbl9jb2RlcyAgICAgIE9GKChjdF9kYXRhICp0cmVlLCBpbnQgbWF4X2NvZGUsIHVzaGYgKmJsX2NvdW50KSk7Ci1sb2NhbCB2b2lkIGJ1aWxkX3RyZWUgICAgIE9GKChkZWZsYXRlX3N0YXRlICpzLCB0cmVlX2Rlc2MgKmRlc2MpKTsKLWxvY2FsIHZvaWQgc2Nhbl90cmVlICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGN0X2RhdGEgKnRyZWUsIGludCBtYXhfY29kZSkpOwotbG9jYWwgdm9pZCBzZW5kX3RyZWUgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgY3RfZGF0YSAqdHJlZSwgaW50IG1heF9jb2RlKSk7Ci1sb2NhbCBpbnQgIGJ1aWxkX2JsX3RyZWUgIE9GKChkZWZsYXRlX3N0YXRlICpzKSk7Ci1sb2NhbCB2b2lkIHNlbmRfYWxsX3RyZWVzIE9GKChkZWZsYXRlX3N0YXRlICpzLCBpbnQgbGNvZGVzLCBpbnQgZGNvZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsY29kZXMpKTsKLWxvY2FsIHZvaWQgY29tcHJlc3NfYmxvY2sgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGNvbnN0IGN0X2RhdGEgKmx0cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3RfZGF0YSAqZHRyZWUpKTsKLWxvY2FsIGludCAgZGV0ZWN0X2RhdGFfdHlwZSBPRigoZGVmbGF0ZV9zdGF0ZSAqcykpOwotbG9jYWwgdW5zaWduZWQgYmlfcmV2ZXJzZSBPRigodW5zaWduZWQgdmFsdWUsIGludCBsZW5ndGgpKTsKLWxvY2FsIHZvaWQgYmlfd2luZHVwICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKLWxvY2FsIHZvaWQgYmlfZmx1c2ggICAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMpKTsKLWxvY2FsIHZvaWQgY29weV9ibG9jayAgICAgT0YoKGRlZmxhdGVfc3RhdGUgKnMsIGNoYXJmICpidWYsIHVuc2lnbmVkIGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWFkZXIpKTsKLQotI2lmZGVmIEdFTl9UUkVFU19ICi1sb2NhbCB2b2lkIGdlbl90cmVlc19oZWFkZXIgT0YoKHZvaWQpKTsKLSNlbmRpZgotCi0jaWZuZGVmIERFQlVHCi0jICBkZWZpbmUgc2VuZF9jb2RlKHMsIGMsIHRyZWUpIHNlbmRfYml0cyhzLCB0cmVlW2NdLkNvZGUsIHRyZWVbY10uTGVuKQotICAgLyogU2VuZCBhIGNvZGUgb2YgdGhlIGdpdmVuIHRyZWUuIGMgYW5kIHRyZWUgbXVzdCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMgKi8KLQotI2Vsc2UgLyogREVCVUcgKi8KLSMgIGRlZmluZSBzZW5kX2NvZGUocywgYywgdHJlZSkgXAotICAgICB7IGlmICh6X3ZlcmJvc2U+MikgZnByaW50ZihzdGRlcnIsIlxuY2QgJTNkICIsKGMpKTsgXAotICAgICAgIHNlbmRfYml0cyhzLCB0cmVlW2NdLkNvZGUsIHRyZWVbY10uTGVuKTsgfQotI2VuZGlmCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogT3V0cHV0IGEgc2hvcnQgTFNCIGZpcnN0IG9uIHRoZSBzdHJlYW0uCi0gKiBJTiBhc3NlcnRpb246IHRoZXJlIGlzIGVub3VnaCByb29tIGluIHBlbmRpbmdCdWYuCi0gKi8KLSNkZWZpbmUgcHV0X3Nob3J0KHMsIHcpIHsgXAotICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh3KSAmIDB4ZmYpKTsgXAotICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh1c2gpKHcpID4+IDgpKTsgXAotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFNlbmQgYSB2YWx1ZSBvbiBhIGdpdmVuIG51bWJlciBvZiBiaXRzLgotICogSU4gYXNzZXJ0aW9uOiBsZW5ndGggPD0gMTYgYW5kIHZhbHVlIGZpdHMgaW4gbGVuZ3RoIGJpdHMuCi0gKi8KLSNpZmRlZiBERUJVRwotbG9jYWwgdm9pZCBzZW5kX2JpdHMgICAgICBPRigoZGVmbGF0ZV9zdGF0ZSAqcywgaW50IHZhbHVlLCBpbnQgbGVuZ3RoKSk7Ci0KLWxvY2FsIHZvaWQgc2VuZF9iaXRzKAotICAgIGRlZmxhdGVfc3RhdGUgKnMsCi0gICAgaW50IHZhbHVlLCAgLyogdmFsdWUgdG8gc2VuZCAqLwotICAgIGludCBsZW5ndGgpIC8qIG51bWJlciBvZiBiaXRzICovCi17Ci0gICAgVHJhY2V2digoc3RkZXJyLCIgbCAlMmQgdiAlNHggIiwgbGVuZ3RoLCB2YWx1ZSkpOwotICAgIEFzc2VydChsZW5ndGggPiAwICYmIGxlbmd0aCA8PSAxNSwgImludmFsaWQgbGVuZ3RoIik7Ci0gICAgcy0+Yml0c19zZW50ICs9ICh1bGcpbGVuZ3RoOwotCi0gICAgLyogSWYgbm90IGVub3VnaCByb29tIGluIGJpX2J1ZiwgdXNlICh2YWxpZCkgYml0cyBmcm9tIGJpX2J1ZiBhbmQKLSAgICAgKiAoMTYgLSBiaV92YWxpZCkgYml0cyBmcm9tIHZhbHVlLCBsZWF2aW5nICh3aWR0aCAtICgxNi1iaV92YWxpZCkpCi0gICAgICogdW51c2VkIGJpdHMgaW4gdmFsdWUuCi0gICAgICovCi0gICAgaWYgKHMtPmJpX3ZhbGlkID4gKGludClCdWZfc2l6ZSAtIGxlbmd0aCkgewotICAgICAgICBzLT5iaV9idWYgfD0gKHVzaCl2YWx1ZSA8PCBzLT5iaV92YWxpZDsKLSAgICAgICAgcHV0X3Nob3J0KHMsIHMtPmJpX2J1Zik7Ci0gICAgICAgIHMtPmJpX2J1ZiA9ICh1c2gpdmFsdWUgPj4gKEJ1Zl9zaXplIC0gcy0+YmlfdmFsaWQpOwotICAgICAgICBzLT5iaV92YWxpZCArPSBsZW5ndGggLSBCdWZfc2l6ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBzLT5iaV9idWYgfD0gKHVzaCl2YWx1ZSA8PCBzLT5iaV92YWxpZDsKLSAgICAgICAgcy0+YmlfdmFsaWQgKz0gbGVuZ3RoOwotICAgIH0KLX0KLSNlbHNlIC8qICFERUJVRyAqLwotCi0jZGVmaW5lIHNlbmRfYml0cyhzLCB2YWx1ZSwgbGVuZ3RoKSBcCi17IGludCBsZW4gPSBsZW5ndGg7XAotICBpZiAocy0+YmlfdmFsaWQgPiAoaW50KUJ1Zl9zaXplIC0gbGVuKSB7XAotICAgIGludCB2YWwgPSB2YWx1ZTtcCi0gICAgcy0+YmlfYnVmIHw9ICh1c2gpdmFsIDw8IHMtPmJpX3ZhbGlkO1wKLSAgICBwdXRfc2hvcnQocywgcy0+YmlfYnVmKTtcCi0gICAgcy0+YmlfYnVmID0gKHVzaCl2YWwgPj4gKEJ1Zl9zaXplIC0gcy0+YmlfdmFsaWQpO1wKLSAgICBzLT5iaV92YWxpZCArPSBsZW4gLSBCdWZfc2l6ZTtcCi0gIH0gZWxzZSB7XAotICAgIHMtPmJpX2J1ZiB8PSAodXNoKSh2YWx1ZSkgPDwgcy0+YmlfdmFsaWQ7XAotICAgIHMtPmJpX3ZhbGlkICs9IGxlbjtcCi0gIH1cCi19Ci0jZW5kaWYgLyogREVCVUcgKi8KLQotCi0vKiB0aGUgYXJndW1lbnRzIG11c3Qgbm90IGhhdmUgc2lkZSBlZmZlY3RzICovCi0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogSW5pdGlhbGl6ZSB0aGUgdmFyaW91cyAnY29uc3RhbnQnIHRhYmxlcy4KLSAqLwotbG9jYWwgdm9pZCB0cl9zdGF0aWNfaW5pdCgpCi17Ci0jaWYgZGVmaW5lZChHRU5fVFJFRVNfSCkgfHwgIWRlZmluZWQoU1REQykKLSAgICBzdGF0aWMgaW50IHN0YXRpY19pbml0X2RvbmUgPSAwOwotICAgIGludCBuOyAgICAgICAgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovCi0gICAgaW50IGJpdHM7ICAgICAvKiBiaXQgY291bnRlciAqLwotICAgIGludCBsZW5ndGg7ICAgLyogbGVuZ3RoIHZhbHVlICovCi0gICAgaW50IGNvZGU7ICAgICAvKiBjb2RlIHZhbHVlICovCi0gICAgaW50IGRpc3Q7ICAgICAvKiBkaXN0YW5jZSBpbmRleCAqLwotICAgIHVzaCBibF9jb3VudFtNQVhfQklUUysxXTsKLSAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi8KLQotICAgIGlmIChzdGF0aWNfaW5pdF9kb25lKSByZXR1cm47Ci0KLSAgICAvKiBGb3Igc29tZSBlbWJlZGRlZCB0YXJnZXRzLCBnbG9iYWwgdmFyaWFibGVzIGFyZSBub3QgaW5pdGlhbGl6ZWQ6ICovCi0jaWZkZWYgTk9fSU5JVF9HTE9CQUxfUE9JTlRFUlMKLSAgICBzdGF0aWNfbF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2x0cmVlOwotICAgIHN0YXRpY19sX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2xiaXRzOwotICAgIHN0YXRpY19kX2Rlc2Muc3RhdGljX3RyZWUgPSBzdGF0aWNfZHRyZWU7Ci0gICAgc3RhdGljX2RfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfZGJpdHM7Ci0gICAgc3RhdGljX2JsX2Rlc2MuZXh0cmFfYml0cyA9IGV4dHJhX2JsYml0czsKLSNlbmRpZgotCi0gICAgLyogSW5pdGlhbGl6ZSB0aGUgbWFwcGluZyBsZW5ndGggKDAuLjI1NSkgLT4gbGVuZ3RoIGNvZGUgKDAuLjI4KSAqLwotICAgIGxlbmd0aCA9IDA7Ci0gICAgZm9yIChjb2RlID0gMDsgY29kZSA8IExFTkdUSF9DT0RFUy0xOyBjb2RlKyspIHsKLSAgICAgICAgYmFzZV9sZW5ndGhbY29kZV0gPSBsZW5ndGg7Ci0gICAgICAgIGZvciAobiA9IDA7IG4gPCAoMTw8ZXh0cmFfbGJpdHNbY29kZV0pOyBuKyspIHsKLSAgICAgICAgICAgIF9sZW5ndGhfY29kZVtsZW5ndGgrK10gPSAodWNoKWNvZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQXNzZXJ0IChsZW5ndGggPT0gMjU2LCAidHJfc3RhdGljX2luaXQ6IGxlbmd0aCAhPSAyNTYiKTsKLSAgICAvKiBOb3RlIHRoYXQgdGhlIGxlbmd0aCAyNTUgKG1hdGNoIGxlbmd0aCAyNTgpIGNhbiBiZSByZXByZXNlbnRlZAotICAgICAqIGluIHR3byBkaWZmZXJlbnQgd2F5czogY29kZSAyODQgKyA1IGJpdHMgb3IgY29kZSAyODUsIHNvIHdlCi0gICAgICogb3ZlcndyaXRlIGxlbmd0aF9jb2RlWzI1NV0gdG8gdXNlIHRoZSBiZXN0IGVuY29kaW5nOgotICAgICAqLwotICAgIF9sZW5ndGhfY29kZVtsZW5ndGgtMV0gPSAodWNoKWNvZGU7Ci0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIGRpc3QgKDAuLjMySykgLT4gZGlzdCBjb2RlICgwLi4yOSkgKi8KLSAgICBkaXN0ID0gMDsKLSAgICBmb3IgKGNvZGUgPSAwIDsgY29kZSA8IDE2OyBjb2RlKyspIHsKLSAgICAgICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdDsKLSAgICAgICAgZm9yIChuID0gMDsgbiA8ICgxPDxleHRyYV9kYml0c1tjb2RlXSk7IG4rKykgewotICAgICAgICAgICAgX2Rpc3RfY29kZVtkaXN0KytdID0gKHVjaCljb2RlOwotICAgICAgICB9Ci0gICAgfQotICAgIEFzc2VydCAoZGlzdCA9PSAyNTYsICJ0cl9zdGF0aWNfaW5pdDogZGlzdCAhPSAyNTYiKTsKLSAgICBkaXN0ID4+PSA3OyAvKiBmcm9tIG5vdyBvbiwgYWxsIGRpc3RhbmNlcyBhcmUgZGl2aWRlZCBieSAxMjggKi8KLSAgICBmb3IgKCA7IGNvZGUgPCBEX0NPREVTOyBjb2RlKyspIHsKLSAgICAgICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdCA8PCA3OwotICAgICAgICBmb3IgKG4gPSAwOyBuIDwgKDE8PChleHRyYV9kYml0c1tjb2RlXS03KSk7IG4rKykgewotICAgICAgICAgICAgX2Rpc3RfY29kZVsyNTYgKyBkaXN0KytdID0gKHVjaCljb2RlOwotICAgICAgICB9Ci0gICAgfQotICAgIEFzc2VydCAoZGlzdCA9PSAyNTYsICJ0cl9zdGF0aWNfaW5pdDogMjU2K2Rpc3QgIT0gNTEyIik7Ci0KLSAgICAvKiBDb25zdHJ1Y3QgdGhlIGNvZGVzIG9mIHRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlICovCi0gICAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSBibF9jb3VudFtiaXRzXSA9IDA7Ci0gICAgbiA9IDA7Ci0gICAgd2hpbGUgKG4gPD0gMTQzKSBzdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA4LCBibF9jb3VudFs4XSsrOwotICAgIHdoaWxlIChuIDw9IDI1NSkgc3RhdGljX2x0cmVlW24rK10uTGVuID0gOSwgYmxfY291bnRbOV0rKzsKLSAgICB3aGlsZSAobiA8PSAyNzkpIHN0YXRpY19sdHJlZVtuKytdLkxlbiA9IDcsIGJsX2NvdW50WzddKys7Ci0gICAgd2hpbGUgKG4gPD0gMjg3KSBzdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA4LCBibF9jb3VudFs4XSsrOwotICAgIC8qIENvZGVzIDI4NiBhbmQgMjg3IGRvIG5vdCBleGlzdCwgYnV0IHdlIG11c3QgaW5jbHVkZSB0aGVtIGluIHRoZQotICAgICAqIHRyZWUgY29uc3RydWN0aW9uIHRvIGdldCBhIGNhbm9uaWNhbCBIdWZmbWFuIHRyZWUgKGxvbmdlc3QgY29kZQotICAgICAqIGFsbCBvbmVzKQotICAgICAqLwotICAgIGdlbl9jb2RlcygoY3RfZGF0YSAqKXN0YXRpY19sdHJlZSwgTF9DT0RFUysxLCBibF9jb3VudCk7Ci0KLSAgICAvKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUgaXMgdHJpdmlhbDogKi8KLSAgICBmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgbisrKSB7Ci0gICAgICAgIHN0YXRpY19kdHJlZVtuXS5MZW4gPSA1OwotICAgICAgICBzdGF0aWNfZHRyZWVbbl0uQ29kZSA9IGJpX3JldmVyc2UoKHVuc2lnbmVkKW4sIDUpOwotICAgIH0KLSAgICBzdGF0aWNfaW5pdF9kb25lID0gMTsKLQotIyAgaWZkZWYgR0VOX1RSRUVTX0gKLSAgICBnZW5fdHJlZXNfaGVhZGVyKCk7Ci0jICBlbmRpZgotI2VuZGlmIC8qIGRlZmluZWQoR0VOX1RSRUVTX0gpIHx8ICFkZWZpbmVkKFNUREMpICovCi19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogR2VuZXJlcmF0ZSB0aGUgZmlsZSB0cmVlcy5oIGRlc2NyaWJpbmcgdGhlIHN0YXRpYyB0cmVlcy4KLSAqLwotI2lmZGVmIEdFTl9UUkVFU19ICi0jICBpZm5kZWYgREVCVUcKLSMgICAgaW5jbHVkZSA8c3RkaW8uaD4KLSMgIGVuZGlmCi0KLSMgIGRlZmluZSBTRVBBUkFUT1IoaSwgbGFzdCwgd2lkdGgpIFwKLSAgICAgICgoaSkgPT0gKGxhc3QpPyAiXG59O1xuXG4iIDogICAgXAotICAgICAgICgoaSkgJSAod2lkdGgpID09ICh3aWR0aCktMSA/ICIsXG4iIDogIiwgIikpCi0KLXZvaWQgZ2VuX3RyZWVzX2hlYWRlcigpCi17Ci0gICAgRklMRSAqaGVhZGVyID0gZm9wZW4oInRyZWVzLmgiLCAidyIpOwotICAgIGludCBpOwotCi0gICAgQXNzZXJ0IChoZWFkZXIgIT0gTlVMTCwgIkNhbid0IG9wZW4gdHJlZXMuaCIpOwotICAgIGZwcmludGYoaGVhZGVyLAotICAgICAgICAgICAgIi8qIGhlYWRlciBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2l0aCAtREdFTl9UUkVFU19IICovXG5cbiIpOwotCi0gICAgZnByaW50ZihoZWFkZXIsICJsb2NhbCBjb25zdCBjdF9kYXRhIHN0YXRpY19sdHJlZVtMX0NPREVTKzJdID0ge1xuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IExfQ09ERVMrMjsgaSsrKSB7Ci0gICAgICAgIGZwcmludGYoaGVhZGVyLCAie3slM3V9LHslM3V9fSVzIiwgc3RhdGljX2x0cmVlW2ldLkNvZGUsCi0gICAgICAgICAgICAgICAgc3RhdGljX2x0cmVlW2ldLkxlbiwgU0VQQVJBVE9SKGksIExfQ09ERVMrMSwgNSkpOwotICAgIH0KLQotICAgIGZwcmludGYoaGVhZGVyLCAibG9jYWwgY29uc3QgY3RfZGF0YSBzdGF0aWNfZHRyZWVbRF9DT0RFU10gPSB7XG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgRF9DT0RFUzsgaSsrKSB7Ci0gICAgICAgIGZwcmludGYoaGVhZGVyLCAie3slMnV9LHslMnV9fSVzIiwgc3RhdGljX2R0cmVlW2ldLkNvZGUsCi0gICAgICAgICAgICAgICAgc3RhdGljX2R0cmVlW2ldLkxlbiwgU0VQQVJBVE9SKGksIERfQ09ERVMtMSwgNSkpOwotICAgIH0KLQotICAgIGZwcmludGYoaGVhZGVyLCAiY29uc3QgdWNoIFpMSUJfSU5URVJOQUwgX2Rpc3RfY29kZVtESVNUX0NPREVfTEVOXSA9IHtcbiIpOwotICAgIGZvciAoaSA9IDA7IGkgPCBESVNUX0NPREVfTEVOOyBpKyspIHsKLSAgICAgICAgZnByaW50ZihoZWFkZXIsICIlMnUlcyIsIF9kaXN0X2NvZGVbaV0sCi0gICAgICAgICAgICAgICAgU0VQQVJBVE9SKGksIERJU1RfQ09ERV9MRU4tMSwgMjApKTsKLSAgICB9Ci0KLSAgICBmcHJpbnRmKGhlYWRlciwKLSAgICAgICAgImNvbnN0IHVjaCBaTElCX0lOVEVSTkFMIF9sZW5ndGhfY29kZVtNQVhfTUFUQ0gtTUlOX01BVENIKzFdPSB7XG4iKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX01BVENILU1JTl9NQVRDSCsxOyBpKyspIHsKLSAgICAgICAgZnByaW50ZihoZWFkZXIsICIlMnUlcyIsIF9sZW5ndGhfY29kZVtpXSwKLSAgICAgICAgICAgICAgICBTRVBBUkFUT1IoaSwgTUFYX01BVENILU1JTl9NQVRDSCwgMjApKTsKLSAgICB9Ci0KLSAgICBmcHJpbnRmKGhlYWRlciwgImxvY2FsIGNvbnN0IGludCBiYXNlX2xlbmd0aFtMRU5HVEhfQ09ERVNdID0ge1xuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IExFTkdUSF9DT0RFUzsgaSsrKSB7Ci0gICAgICAgIGZwcmludGYoaGVhZGVyLCAiJTF1JXMiLCBiYXNlX2xlbmd0aFtpXSwKLSAgICAgICAgICAgICAgICBTRVBBUkFUT1IoaSwgTEVOR1RIX0NPREVTLTEsIDIwKSk7Ci0gICAgfQotCi0gICAgZnByaW50ZihoZWFkZXIsICJsb2NhbCBjb25zdCBpbnQgYmFzZV9kaXN0W0RfQ09ERVNdID0ge1xuIik7Ci0gICAgZm9yIChpID0gMDsgaSA8IERfQ09ERVM7IGkrKykgewotICAgICAgICBmcHJpbnRmKGhlYWRlciwgIiU1dSVzIiwgYmFzZV9kaXN0W2ldLAotICAgICAgICAgICAgICAgIFNFUEFSQVRPUihpLCBEX0NPREVTLTEsIDEwKSk7Ci0gICAgfQotCi0gICAgZmNsb3NlKGhlYWRlcik7Ci19Ci0jZW5kaWYgLyogR0VOX1RSRUVTX0ggKi8KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBJbml0aWFsaXplIHRoZSB0cmVlIGRhdGEgc3RydWN0dXJlcyBmb3IgYSBuZXcgemxpYiBzdHJlYW0uCi0gKi8KLXZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfaW5pdCgKLSAgICBkZWZsYXRlX3N0YXRlICpzKQotewotICAgIHRyX3N0YXRpY19pbml0KCk7Ci0KLSAgICBzLT5sX2Rlc2MuZHluX3RyZWUgPSBzLT5keW5fbHRyZWU7Ci0gICAgcy0+bF9kZXNjLnN0YXRfZGVzYyA9ICZzdGF0aWNfbF9kZXNjOwotCi0gICAgcy0+ZF9kZXNjLmR5bl90cmVlID0gcy0+ZHluX2R0cmVlOwotICAgIHMtPmRfZGVzYy5zdGF0X2Rlc2MgPSAmc3RhdGljX2RfZGVzYzsKLQotICAgIHMtPmJsX2Rlc2MuZHluX3RyZWUgPSBzLT5ibF90cmVlOwotICAgIHMtPmJsX2Rlc2Muc3RhdF9kZXNjID0gJnN0YXRpY19ibF9kZXNjOwotCi0gICAgcy0+YmlfYnVmID0gMDsKLSAgICBzLT5iaV92YWxpZCA9IDA7Ci0jaWZkZWYgREVCVUcKLSAgICBzLT5jb21wcmVzc2VkX2xlbiA9IDBMOwotICAgIHMtPmJpdHNfc2VudCA9IDBMOwotI2VuZGlmCi0KLSAgICAvKiBJbml0aWFsaXplIHRoZSBmaXJzdCBibG9jayBvZiB0aGUgZmlyc3QgZmlsZTogKi8KLSAgICBpbml0X2Jsb2NrKHMpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEluaXRpYWxpemUgYSBuZXcgYmxvY2suCi0gKi8KLWxvY2FsIHZvaWQgaW5pdF9ibG9jaygKLSAgICBkZWZsYXRlX3N0YXRlICpzKQotewotICAgIGludCBuOyAvKiBpdGVyYXRlcyBvdmVyIHRyZWUgZWxlbWVudHMgKi8KLQotICAgIC8qIEluaXRpYWxpemUgdGhlIHRyZWVzLiAqLwotICAgIGZvciAobiA9IDA7IG4gPCBMX0NPREVTOyAgbisrKSBzLT5keW5fbHRyZWVbbl0uRnJlcSA9IDA7Ci0gICAgZm9yIChuID0gMDsgbiA8IERfQ09ERVM7ICBuKyspIHMtPmR5bl9kdHJlZVtuXS5GcmVxID0gMDsKLSAgICBmb3IgKG4gPSAwOyBuIDwgQkxfQ09ERVM7IG4rKykgcy0+YmxfdHJlZVtuXS5GcmVxID0gMDsKLQotICAgIHMtPmR5bl9sdHJlZVtFTkRfQkxPQ0tdLkZyZXEgPSAxOwotICAgIHMtPm9wdF9sZW4gPSBzLT5zdGF0aWNfbGVuID0gMEw7Ci0gICAgcy0+bGFzdF9saXQgPSBzLT5tYXRjaGVzID0gMDsKLX0KLQotI2RlZmluZSBTTUFMTEVTVCAxCi0vKiBJbmRleCB3aXRoaW4gdGhlIGhlYXAgYXJyYXkgb2YgbGVhc3QgZnJlcXVlbnQgbm9kZSBpbiB0aGUgSHVmZm1hbiB0cmVlICovCi0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBSZW1vdmUgdGhlIHNtYWxsZXN0IGVsZW1lbnQgZnJvbSB0aGUgaGVhcCBhbmQgcmVjcmVhdGUgdGhlIGhlYXAgd2l0aAotICogb25lIGxlc3MgZWxlbWVudC4gVXBkYXRlcyBoZWFwIGFuZCBoZWFwX2xlbi4KLSAqLwotI2RlZmluZSBwcXJlbW92ZShzLCB0cmVlLCB0b3ApIFwKLXtcCi0gICAgdG9wID0gcy0+aGVhcFtTTUFMTEVTVF07IFwKLSAgICBzLT5oZWFwW1NNQUxMRVNUXSA9IHMtPmhlYXBbcy0+aGVhcF9sZW4tLV07IFwKLSAgICBwcWRvd25oZWFwKHMsIHRyZWUsIFNNQUxMRVNUKTsgXAotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvbXBhcmVzIHRvIHN1YnRyZWVzLCB1c2luZyB0aGUgdHJlZSBkZXB0aCBhcyB0aWUgYnJlYWtlciB3aGVuCi0gKiB0aGUgc3VidHJlZXMgaGF2ZSBlcXVhbCBmcmVxdWVuY3kuIFRoaXMgbWluaW1pemVzIHRoZSB3b3JzdCBjYXNlIGxlbmd0aC4KLSAqLwotI2RlZmluZSBzbWFsbGVyKHRyZWUsIG4sIG0sIGRlcHRoKSBcCi0gICAodHJlZVtuXS5GcmVxIDwgdHJlZVttXS5GcmVxIHx8IFwKLSAgICh0cmVlW25dLkZyZXEgPT0gdHJlZVttXS5GcmVxICYmIGRlcHRoW25dIDw9IGRlcHRoW21dKSkKLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBSZXN0b3JlIHRoZSBoZWFwIHByb3BlcnR5IGJ5IG1vdmluZyBkb3duIHRoZSB0cmVlIHN0YXJ0aW5nIGF0IG5vZGUgaywKLSAqIGV4Y2hhbmdpbmcgYSBub2RlIHdpdGggdGhlIHNtYWxsZXN0IG9mIGl0cyB0d28gc29ucyBpZiBuZWNlc3NhcnksIHN0b3BwaW5nCi0gKiB3aGVuIHRoZSBoZWFwIHByb3BlcnR5IGlzIHJlLWVzdGFibGlzaGVkIChlYWNoIGZhdGhlciBzbWFsbGVyIHRoYW4gaXRzCi0gKiB0d28gc29ucykuCi0gKi8KLWxvY2FsIHZvaWQgcHFkb3duaGVhcCgKLSAgICBkZWZsYXRlX3N0YXRlICpzLAotICAgIGN0X2RhdGEgKnRyZWUsICAvKiB0aGUgdHJlZSB0byByZXN0b3JlICovCi0gICAgaW50IGspICAgICAgICAgICAgICAgLyogbm9kZSB0byBtb3ZlIGRvd24gKi8KLXsKLSAgICBpbnQgdiA9IHMtPmhlYXBba107Ci0gICAgaW50IGogPSBrIDw8IDE7ICAvKiBsZWZ0IHNvbiBvZiBrICovCi0gICAgd2hpbGUgKGogPD0gcy0+aGVhcF9sZW4pIHsKLSAgICAgICAgLyogU2V0IGogdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSB0d28gc29uczogKi8KLSAgICAgICAgaWYgKGogPCBzLT5oZWFwX2xlbiAmJgotICAgICAgICAgICAgc21hbGxlcih0cmVlLCBzLT5oZWFwW2orMV0sIHMtPmhlYXBbal0sIHMtPmRlcHRoKSkgewotICAgICAgICAgICAgaisrOwotICAgICAgICB9Ci0gICAgICAgIC8qIEV4aXQgaWYgdiBpcyBzbWFsbGVyIHRoYW4gYm90aCBzb25zICovCi0gICAgICAgIGlmIChzbWFsbGVyKHRyZWUsIHYsIHMtPmhlYXBbal0sIHMtPmRlcHRoKSkgYnJlYWs7Ci0KLSAgICAgICAgLyogRXhjaGFuZ2UgdiB3aXRoIHRoZSBzbWFsbGVzdCBzb24gKi8KLSAgICAgICAgcy0+aGVhcFtrXSA9IHMtPmhlYXBbal07ICBrID0gajsKLQotICAgICAgICAvKiBBbmQgY29udGludWUgZG93biB0aGUgdHJlZSwgc2V0dGluZyBqIHRvIHRoZSBsZWZ0IHNvbiBvZiBrICovCi0gICAgICAgIGogPDw9IDE7Ci0gICAgfQotICAgIHMtPmhlYXBba10gPSB2OwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgZm9yIGEgdHJlZSBhbmQgdXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoCi0gKiBmb3IgdGhlIGN1cnJlbnQgYmxvY2suCi0gKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQsIGhlYXBbaGVhcF9tYXhdIGFuZAotICogICAgYWJvdmUgYXJlIHRoZSB0cmVlIG5vZGVzIHNvcnRlZCBieSBpbmNyZWFzaW5nIGZyZXF1ZW5jeS4KLSAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGQgbGVuIGlzIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoLCB0aGUKLSAqICAgICBhcnJheSBibF9jb3VudCBjb250YWlucyB0aGUgZnJlcXVlbmNpZXMgZm9yIGVhY2ggYml0IGxlbmd0aC4KLSAqICAgICBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcyBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXMKLSAqICAgICBub3QgbnVsbC4KLSAqLwotbG9jYWwgdm9pZCBnZW5fYml0bGVuKAotICAgIGRlZmxhdGVfc3RhdGUgKnMsCi0gICAgdHJlZV9kZXNjICpkZXNjKSAgICAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovCi17Ci0gICAgY3RfZGF0YSAqdHJlZSAgICAgICAgPSBkZXNjLT5keW5fdHJlZTsKLSAgICBpbnQgbWF4X2NvZGUgICAgICAgICA9IGRlc2MtPm1heF9jb2RlOwotICAgIGNvbnN0IGN0X2RhdGEgKnN0cmVlID0gZGVzYy0+c3RhdF9kZXNjLT5zdGF0aWNfdHJlZTsKLSAgICBjb25zdCBpbnRmICpleHRyYSAgICA9IGRlc2MtPnN0YXRfZGVzYy0+ZXh0cmFfYml0czsKLSAgICBpbnQgYmFzZSAgICAgICAgICAgICA9IGRlc2MtPnN0YXRfZGVzYy0+ZXh0cmFfYmFzZTsKLSAgICBpbnQgbWF4X2xlbmd0aCAgICAgICA9IGRlc2MtPnN0YXRfZGVzYy0+bWF4X2xlbmd0aDsKLSAgICBpbnQgaDsgICAgICAgICAgICAgIC8qIGhlYXAgaW5kZXggKi8KLSAgICBpbnQgbiwgbTsgICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciB0aGUgdHJlZSBlbGVtZW50cyAqLwotICAgIGludCBiaXRzOyAgICAgICAgICAgLyogYml0IGxlbmd0aCAqLwotICAgIGludCB4Yml0czsgICAgICAgICAgLyogZXh0cmEgYml0cyAqLwotICAgIHVzaCBmOyAgICAgICAgICAgICAgLyogZnJlcXVlbmN5ICovCi0gICAgaW50IG92ZXJmbG93ID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aCBiaXQgbGVuZ3RoIHRvbyBsYXJnZSAqLwotCi0gICAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSBzLT5ibF9jb3VudFtiaXRzXSA9IDA7Ci0KLSAgICAvKiBJbiBhIGZpcnN0IHBhc3MsIGNvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgKHdoaWNoIG1heQotICAgICAqIG92ZXJmbG93IGluIHRoZSBjYXNlIG9mIHRoZSBiaXQgbGVuZ3RoIHRyZWUpLgotICAgICAqLwotICAgIHRyZWVbcy0+aGVhcFtzLT5oZWFwX21heF1dLkxlbiA9IDA7IC8qIHJvb3Qgb2YgdGhlIGhlYXAgKi8KLQotICAgIGZvciAoaCA9IHMtPmhlYXBfbWF4KzE7IGggPCBIRUFQX1NJWkU7IGgrKykgewotICAgICAgICBuID0gcy0+aGVhcFtoXTsKLSAgICAgICAgYml0cyA9IHRyZWVbdHJlZVtuXS5EYWRdLkxlbiArIDE7Ci0gICAgICAgIGlmIChiaXRzID4gbWF4X2xlbmd0aCkgYml0cyA9IG1heF9sZW5ndGgsIG92ZXJmbG93Kys7Ci0gICAgICAgIHRyZWVbbl0uTGVuID0gKHVzaCliaXRzOwotICAgICAgICAvKiBXZSBvdmVyd3JpdGUgdHJlZVtuXS5EYWQgd2hpY2ggaXMgbm8gbG9uZ2VyIG5lZWRlZCAqLwotCi0gICAgICAgIGlmIChuID4gbWF4X2NvZGUpIGNvbnRpbnVlOyAvKiBub3QgYSBsZWFmIG5vZGUgKi8KLQotICAgICAgICBzLT5ibF9jb3VudFtiaXRzXSsrOwotICAgICAgICB4Yml0cyA9IDA7Ci0gICAgICAgIGlmIChuID49IGJhc2UpIHhiaXRzID0gZXh0cmFbbi1iYXNlXTsKLSAgICAgICAgZiA9IHRyZWVbbl0uRnJlcTsKLSAgICAgICAgcy0+b3B0X2xlbiArPSAodWxnKWYgKiAoYml0cyArIHhiaXRzKTsKLSAgICAgICAgaWYgKHN0cmVlKSBzLT5zdGF0aWNfbGVuICs9ICh1bGcpZiAqIChzdHJlZVtuXS5MZW4gKyB4Yml0cyk7Ci0gICAgfQotICAgIGlmIChvdmVyZmxvdyA9PSAwKSByZXR1cm47Ci0KLSAgICBUcmFjZSgoc3RkZXJyLCJcbmJpdCBsZW5ndGggb3ZlcmZsb3dcbiIpKTsKLSAgICAvKiBUaGlzIGhhcHBlbnMgZm9yIGV4YW1wbGUgb24gb2JqMiBhbmQgcGljIG9mIHRoZSBDYWxnYXJ5IGNvcnB1cyAqLwotCi0gICAgLyogRmluZCB0aGUgZmlyc3QgYml0IGxlbmd0aCB3aGljaCBjb3VsZCBpbmNyZWFzZTogKi8KLSAgICBkbyB7Ci0gICAgICAgIGJpdHMgPSBtYXhfbGVuZ3RoLTE7Ci0gICAgICAgIHdoaWxlIChzLT5ibF9jb3VudFtiaXRzXSA9PSAwKSBiaXRzLS07Ci0gICAgICAgIHMtPmJsX2NvdW50W2JpdHNdLS07ICAgICAgLyogbW92ZSBvbmUgbGVhZiBkb3duIHRoZSB0cmVlICovCi0gICAgICAgIHMtPmJsX2NvdW50W2JpdHMrMV0gKz0gMjsgLyogbW92ZSBvbmUgb3ZlcmZsb3cgaXRlbSBhcyBpdHMgYnJvdGhlciAqLwotICAgICAgICBzLT5ibF9jb3VudFttYXhfbGVuZ3RoXS0tOwotICAgICAgICAvKiBUaGUgYnJvdGhlciBvZiB0aGUgb3ZlcmZsb3cgaXRlbSBhbHNvIG1vdmVzIG9uZSBzdGVwIHVwLAotICAgICAgICAgKiBidXQgdGhpcyBkb2VzIG5vdCBhZmZlY3QgYmxfY291bnRbbWF4X2xlbmd0aF0KLSAgICAgICAgICovCi0gICAgICAgIG92ZXJmbG93IC09IDI7Ci0gICAgfSB3aGlsZSAob3ZlcmZsb3cgPiAwKTsKLQotICAgIC8qIE5vdyByZWNvbXB1dGUgYWxsIGJpdCBsZW5ndGhzLCBzY2FubmluZyBpbiBpbmNyZWFzaW5nIGZyZXF1ZW5jeS4KLSAgICAgKiBoIGlzIHN0aWxsIGVxdWFsIHRvIEhFQVBfU0laRS4gKEl0IGlzIHNpbXBsZXIgdG8gcmVjb25zdHJ1Y3QgYWxsCi0gICAgICogbGVuZ3RocyBpbnN0ZWFkIG9mIGZpeGluZyBvbmx5IHRoZSB3cm9uZyBvbmVzLiBUaGlzIGlkZWEgaXMgdGFrZW4KLSAgICAgKiBmcm9tICdhcicgd3JpdHRlbiBieSBIYXJ1aGlrbyBPa3VtdXJhLikKLSAgICAgKi8KLSAgICBmb3IgKGJpdHMgPSBtYXhfbGVuZ3RoOyBiaXRzICE9IDA7IGJpdHMtLSkgewotICAgICAgICBuID0gcy0+YmxfY291bnRbYml0c107Ci0gICAgICAgIHdoaWxlIChuICE9IDApIHsKLSAgICAgICAgICAgIG0gPSBzLT5oZWFwWy0taF07Ci0gICAgICAgICAgICBpZiAobSA+IG1heF9jb2RlKSBjb250aW51ZTsKLSAgICAgICAgICAgIGlmICgodW5zaWduZWQpIHRyZWVbbV0uTGVuICE9ICh1bnNpZ25lZCkgYml0cykgewotICAgICAgICAgICAgICAgIFRyYWNlKChzdGRlcnIsImNvZGUgJWQgYml0cyAlZC0+JWRcbiIsIG0sIHRyZWVbbV0uTGVuLCBiaXRzKSk7Ci0gICAgICAgICAgICAgICAgcy0+b3B0X2xlbiArPSAoKGxvbmcpYml0cyAtIChsb25nKXRyZWVbbV0uTGVuKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihsb25nKXRyZWVbbV0uRnJlcTsKLSAgICAgICAgICAgICAgICB0cmVlW21dLkxlbiA9ICh1c2gpYml0czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG4tLTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBHZW5lcmF0ZSB0aGUgY29kZXMgZm9yIGEgZ2l2ZW4gdHJlZSBhbmQgYml0IGNvdW50cyAod2hpY2ggbmVlZCBub3QgYmUKLSAqIG9wdGltYWwpLgotICogSU4gYXNzZXJ0aW9uOiB0aGUgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGJpdCBsZW5ndGggc3RhdGlzdGljcyBmb3IKLSAqIHRoZSBnaXZlbiB0cmVlIGFuZCB0aGUgZmllbGQgbGVuIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuCi0gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgZmllbGQgY29kZSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzIG9mIG5vbgotICogICAgIHplcm8gY29kZSBsZW5ndGguCi0gKi8KLWxvY2FsIHZvaWQgZ2VuX2NvZGVzICgKLSAgICBjdF9kYXRhICp0cmVlLCAgICAgICAgICAgICAvKiB0aGUgdHJlZSB0byBkZWNvcmF0ZSAqLwotICAgIGludCBtYXhfY29kZSwgICAgICAgICAgICAgIC8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLwotICAgIHVzaGYgKmJsX2NvdW50KSAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlcyBhdCBlYWNoIGJpdCBsZW5ndGggKi8KLXsKLSAgICB1c2ggbmV4dF9jb2RlW01BWF9CSVRTKzFdOyAvKiBuZXh0IGNvZGUgdmFsdWUgZm9yIGVhY2ggYml0IGxlbmd0aCAqLwotICAgIHVzaCBjb2RlID0gMDsgICAgICAgICAgICAgIC8qIHJ1bm5pbmcgY29kZSB2YWx1ZSAqLwotICAgIGludCBiaXRzOyAgICAgICAgICAgICAgICAgIC8qIGJpdCBpbmRleCAqLwotICAgIGludCBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgaW5kZXggKi8KLQotICAgIC8qIFRoZSBkaXN0cmlidXRpb24gY291bnRzIGFyZSBmaXJzdCB1c2VkIHRvIGdlbmVyYXRlIHRoZSBjb2RlIHZhbHVlcwotICAgICAqIHdpdGhvdXQgYml0IHJldmVyc2FsLgotICAgICAqLwotICAgIGZvciAoYml0cyA9IDE7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykgewotICAgICAgICBuZXh0X2NvZGVbYml0c10gPSBjb2RlID0gKGNvZGUgKyBibF9jb3VudFtiaXRzLTFdKSA8PCAxOwotICAgIH0KLSAgICAvKiBDaGVjayB0aGF0IHRoZSBiaXQgY291bnRzIGluIGJsX2NvdW50IGFyZSBjb25zaXN0ZW50LiBUaGUgbGFzdCBjb2RlCi0gICAgICogbXVzdCBiZSBhbGwgb25lcy4KLSAgICAgKi8KLSAgICBBc3NlcnQgKGNvZGUgKyBibF9jb3VudFtNQVhfQklUU10tMSA9PSAoMTw8TUFYX0JJVFMpLTEsCi0gICAgICAgICAgICAiaW5jb25zaXN0ZW50IGJpdCBjb3VudHMiKTsKLSAgICBUcmFjZXYoKHN0ZGVyciwiXG5nZW5fY29kZXM6IG1heF9jb2RlICVkICIsIG1heF9jb2RlKSk7Ci0KLSAgICBmb3IgKG4gPSAwOyAgbiA8PSBtYXhfY29kZTsgbisrKSB7Ci0gICAgICAgIGludCBsZW4gPSB0cmVlW25dLkxlbjsKLSAgICAgICAgaWYgKGxlbiA9PSAwKSBjb250aW51ZTsKLSAgICAgICAgLyogTm93IHJldmVyc2UgdGhlIGJpdHMgKi8KLSAgICAgICAgdHJlZVtuXS5Db2RlID0gYmlfcmV2ZXJzZShuZXh0X2NvZGVbbGVuXSsrLCBsZW4pOwotCi0gICAgICAgIFRyYWNlY3YodHJlZSAhPSBzdGF0aWNfbHRyZWUsIChzdGRlcnIsIlxubiAlM2QgJWMgbCAlMmQgYyAlNHggKCV4KSAiLAotICAgICAgICAgICAgIG4sIChpc2dyYXBoKG4pID8gbiA6ICcgJyksIGxlbiwgdHJlZVtuXS5Db2RlLCBuZXh0X2NvZGVbbGVuXS0xKSk7Ci0gICAgfQotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvbnN0cnVjdCBvbmUgSHVmZm1hbiB0cmVlIGFuZCBhc3NpZ25zIHRoZSBjb2RlIGJpdCBzdHJpbmdzIGFuZCBsZW5ndGhzLgotICogVXBkYXRlIHRoZSB0b3RhbCBiaXQgbGVuZ3RoIGZvciB0aGUgY3VycmVudCBibG9jay4KLSAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkIGZyZXEgaXMgc2V0IGZvciBhbGwgdHJlZSBlbGVtZW50cy4KLSAqIE9VVCBhc3NlcnRpb25zOiB0aGUgZmllbGRzIGxlbiBhbmQgY29kZSBhcmUgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgKLSAqICAgICBhbmQgY29ycmVzcG9uZGluZyBjb2RlLiBUaGUgbGVuZ3RoIG9wdF9sZW4gaXMgdXBkYXRlZDsgc3RhdGljX2xlbiBpcwotICogICAgIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcyBub3QgbnVsbC4gVGhlIGZpZWxkIG1heF9jb2RlIGlzIHNldC4KLSAqLwotbG9jYWwgdm9pZCBidWlsZF90cmVlKAotICAgIGRlZmxhdGVfc3RhdGUgKnMsCi0gICAgdHJlZV9kZXNjICpkZXNjKSAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovCi17Ci0gICAgY3RfZGF0YSAqdHJlZSAgICAgICAgID0gZGVzYy0+ZHluX3RyZWU7Ci0gICAgY29uc3QgY3RfZGF0YSAqc3RyZWUgID0gZGVzYy0+c3RhdF9kZXNjLT5zdGF0aWNfdHJlZTsKLSAgICBpbnQgZWxlbXMgICAgICAgICAgICAgPSBkZXNjLT5zdGF0X2Rlc2MtPmVsZW1zOwotICAgIGludCBuLCBtOyAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgaGVhcCBlbGVtZW50cyAqLwotICAgIGludCBtYXhfY29kZSA9IC0xOyAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi8KLSAgICBpbnQgbm9kZTsgICAgICAgICAgLyogbmV3IG5vZGUgYmVpbmcgY3JlYXRlZCAqLwotCi0gICAgLyogQ29uc3RydWN0IHRoZSBpbml0aWFsIGhlYXAsIHdpdGggbGVhc3QgZnJlcXVlbnQgZWxlbWVudCBpbgotICAgICAqIGhlYXBbU01BTExFU1RdLiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLgotICAgICAqIGhlYXBbMF0gaXMgbm90IHVzZWQuCi0gICAgICovCi0gICAgcy0+aGVhcF9sZW4gPSAwLCBzLT5oZWFwX21heCA9IEhFQVBfU0laRTsKLQotICAgIGZvciAobiA9IDA7IG4gPCBlbGVtczsgbisrKSB7Ci0gICAgICAgIGlmICh0cmVlW25dLkZyZXEgIT0gMCkgewotICAgICAgICAgICAgcy0+aGVhcFsrKyhzLT5oZWFwX2xlbildID0gbWF4X2NvZGUgPSBuOwotICAgICAgICAgICAgcy0+ZGVwdGhbbl0gPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJlZVtuXS5MZW4gPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogVGhlIHBremlwIGZvcm1hdCByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBkaXN0YW5jZSBjb2RlIGV4aXN0cywKLSAgICAgKiBhbmQgdGhhdCBhdCBsZWFzdCBvbmUgYml0IHNob3VsZCBiZSBzZW50IGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmUKLSAgICAgKiBwb3NzaWJsZSBjb2RlLiBTbyB0byBhdm9pZCBzcGVjaWFsIGNoZWNrcyBsYXRlciBvbiB3ZSBmb3JjZSBhdCBsZWFzdAotICAgICAqIHR3byBjb2RlcyBvZiBub24gemVybyBmcmVxdWVuY3kuCi0gICAgICovCi0gICAgd2hpbGUgKHMtPmhlYXBfbGVuIDwgMikgewotICAgICAgICBub2RlID0gcy0+aGVhcFsrKyhzLT5oZWFwX2xlbildID0gKG1heF9jb2RlIDwgMiA/ICsrbWF4X2NvZGUgOiAwKTsKLSAgICAgICAgdHJlZVtub2RlXS5GcmVxID0gMTsKLSAgICAgICAgcy0+ZGVwdGhbbm9kZV0gPSAwOwotICAgICAgICBzLT5vcHRfbGVuLS07IGlmIChzdHJlZSkgcy0+c3RhdGljX2xlbiAtPSBzdHJlZVtub2RlXS5MZW47Ci0gICAgICAgIC8qIG5vZGUgaXMgMCBvciAxIHNvIGl0IGRvZXMgbm90IGhhdmUgZXh0cmEgYml0cyAqLwotICAgIH0KLSAgICBkZXNjLT5tYXhfY29kZSA9IG1heF9jb2RlOwotCi0gICAgLyogVGhlIGVsZW1lbnRzIGhlYXBbaGVhcF9sZW4vMisxIC4uIGhlYXBfbGVuXSBhcmUgbGVhdmVzIG9mIHRoZSB0cmVlLAotICAgICAqIGVzdGFibGlzaCBzdWItaGVhcHMgb2YgaW5jcmVhc2luZyBsZW5ndGhzOgotICAgICAqLwotICAgIGZvciAobiA9IHMtPmhlYXBfbGVuLzI7IG4gPj0gMTsgbi0tKSBwcWRvd25oZWFwKHMsIHRyZWUsIG4pOwotCi0gICAgLyogQ29uc3RydWN0IHRoZSBIdWZmbWFuIHRyZWUgYnkgcmVwZWF0ZWRseSBjb21iaW5pbmcgdGhlIGxlYXN0IHR3bwotICAgICAqIGZyZXF1ZW50IG5vZGVzLgotICAgICAqLwotICAgIG5vZGUgPSBlbGVtczsgICAgICAgICAgICAgIC8qIG5leHQgaW50ZXJuYWwgbm9kZSBvZiB0aGUgdHJlZSAqLwotICAgIGRvIHsKLSAgICAgICAgcHFyZW1vdmUocywgdHJlZSwgbik7ICAvKiBuID0gbm9kZSBvZiBsZWFzdCBmcmVxdWVuY3kgKi8KLSAgICAgICAgbSA9IHMtPmhlYXBbU01BTExFU1RdOyAvKiBtID0gbm9kZSBvZiBuZXh0IGxlYXN0IGZyZXF1ZW5jeSAqLwotCi0gICAgICAgIHMtPmhlYXBbLS0ocy0+aGVhcF9tYXgpXSA9IG47IC8qIGtlZXAgdGhlIG5vZGVzIHNvcnRlZCBieSBmcmVxdWVuY3kgKi8KLSAgICAgICAgcy0+aGVhcFstLShzLT5oZWFwX21heCldID0gbTsKLQotICAgICAgICAvKiBDcmVhdGUgYSBuZXcgbm9kZSBmYXRoZXIgb2YgbiBhbmQgbSAqLwotICAgICAgICB0cmVlW25vZGVdLkZyZXEgPSB0cmVlW25dLkZyZXEgKyB0cmVlW21dLkZyZXE7Ci0gICAgICAgIHMtPmRlcHRoW25vZGVdID0gKHVjaCkoKHMtPmRlcHRoW25dID49IHMtPmRlcHRoW21dID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZGVwdGhbbl0gOiBzLT5kZXB0aFttXSkgKyAxKTsKLSAgICAgICAgdHJlZVtuXS5EYWQgPSB0cmVlW21dLkRhZCA9ICh1c2gpbm9kZTsKLSNpZmRlZiBEVU1QX0JMX1RSRUUKLSAgICAgICAgaWYgKHRyZWUgPT0gcy0+YmxfdHJlZSkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIlxubm9kZSAlZCglZCksIHNvbnMgJWQoJWQpICVkKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIG5vZGUsIHRyZWVbbm9kZV0uRnJlcSwgbiwgdHJlZVtuXS5GcmVxLCBtLCB0cmVlW21dLkZyZXEpOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgLyogYW5kIGluc2VydCB0aGUgbmV3IG5vZGUgaW4gdGhlIGhlYXAgKi8KLSAgICAgICAgcy0+aGVhcFtTTUFMTEVTVF0gPSBub2RlKys7Ci0gICAgICAgIHBxZG93bmhlYXAocywgdHJlZSwgU01BTExFU1QpOwotCi0gICAgfSB3aGlsZSAocy0+aGVhcF9sZW4gPj0gMik7Ci0KLSAgICBzLT5oZWFwWy0tKHMtPmhlYXBfbWF4KV0gPSBzLT5oZWFwW1NNQUxMRVNUXTsKLQotICAgIC8qIEF0IHRoaXMgcG9pbnQsIHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQuIFdlIGNhbiBub3cKLSAgICAgKiBnZW5lcmF0ZSB0aGUgYml0IGxlbmd0aHMuCi0gICAgICovCi0gICAgZ2VuX2JpdGxlbihzLCAodHJlZV9kZXNjICopZGVzYyk7Ci0KLSAgICAvKiBUaGUgZmllbGQgbGVuIGlzIG5vdyBzZXQsIHdlIGNhbiBnZW5lcmF0ZSB0aGUgYml0IGNvZGVzICovCi0gICAgZ2VuX2NvZGVzICgoY3RfZGF0YSAqKXRyZWUsIG1heF9jb2RlLCBzLT5ibF9jb3VudCk7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogU2NhbiBhIGxpdGVyYWwgb3IgZGlzdGFuY2UgdHJlZSB0byBkZXRlcm1pbmUgdGhlIGZyZXF1ZW5jaWVzIG9mIHRoZSBjb2RlcwotICogaW4gdGhlIGJpdCBsZW5ndGggdHJlZS4KLSAqLwotbG9jYWwgdm9pZCBzY2FuX3RyZWUgKAotICAgIGRlZmxhdGVfc3RhdGUgKnMsCi0gICAgY3RfZGF0YSAqdHJlZSwgICAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovCi0gICAgaW50IG1heF9jb2RlKSAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi8KLXsKLSAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovCi0gICAgaW50IHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqLwotICAgIGludCBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi8KLSAgICBpbnQgbmV4dGxlbiA9IHRyZWVbMF0uTGVuOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovCi0gICAgaW50IGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi8KLSAgICBpbnQgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovCi0gICAgaW50IG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqLwotCi0gICAgaWYgKG5leHRsZW4gPT0gMCkgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOwotICAgIHRyZWVbbWF4X2NvZGUrMV0uTGVuID0gKHVzaCkweGZmZmY7IC8qIGd1YXJkICovCi0KLSAgICBmb3IgKG4gPSAwOyBuIDw9IG1heF9jb2RlOyBuKyspIHsKLSAgICAgICAgY3VybGVuID0gbmV4dGxlbjsgbmV4dGxlbiA9IHRyZWVbbisxXS5MZW47Ci0gICAgICAgIGlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PSBuZXh0bGVuKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkgewotICAgICAgICAgICAgcy0+YmxfdHJlZVtjdXJsZW5dLkZyZXEgKz0gY291bnQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoY3VybGVuICE9IDApIHsKLSAgICAgICAgICAgIGlmIChjdXJsZW4gIT0gcHJldmxlbikgcy0+YmxfdHJlZVtjdXJsZW5dLkZyZXErKzsKLSAgICAgICAgICAgIHMtPmJsX3RyZWVbUkVQXzNfNl0uRnJlcSsrOwotICAgICAgICB9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7Ci0gICAgICAgICAgICBzLT5ibF90cmVlW1JFUFpfM18xMF0uRnJlcSsrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcy0+YmxfdHJlZVtSRVBaXzExXzEzOF0uRnJlcSsrOwotICAgICAgICB9Ci0gICAgICAgIGNvdW50ID0gMDsgcHJldmxlbiA9IGN1cmxlbjsKLSAgICAgICAgaWYgKG5leHRsZW4gPT0gMCkgewotICAgICAgICAgICAgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOwotICAgICAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PSBuZXh0bGVuKSB7Ci0gICAgICAgICAgICBtYXhfY291bnQgPSA2LCBtaW5fY291bnQgPSAzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWF4X2NvdW50ID0gNywgbWluX2NvdW50ID0gNDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBTZW5kIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIGluIGNvbXByZXNzZWQgZm9ybSwgdXNpbmcgdGhlIGNvZGVzIGluCi0gKiBibF90cmVlLgotICovCi1sb2NhbCB2b2lkIHNlbmRfdHJlZSAoCi0gICAgZGVmbGF0ZV9zdGF0ZSAqcywKLSAgICBjdF9kYXRhICp0cmVlLCAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovCi0gICAgaW50IG1heF9jb2RlKSAgICAgICAvKiBhbmQgaXRzIGxhcmdlc3QgY29kZSBvZiBub24gemVybyBmcmVxdWVuY3kgKi8KLXsKLSAgICBpbnQgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovCi0gICAgaW50IHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqLwotICAgIGludCBjdXJsZW47ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi8KLSAgICBpbnQgbmV4dGxlbiA9IHRyZWVbMF0uTGVuOyAvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovCi0gICAgaW50IGNvdW50ID0gMDsgICAgICAgICAgICAgLyogcmVwZWF0IGNvdW50IG9mIHRoZSBjdXJyZW50IGNvZGUgKi8KLSAgICBpbnQgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovCi0gICAgaW50IG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqLwotCi0gICAgLyogdHJlZVttYXhfY29kZSsxXS5MZW4gPSAtMTsgKi8gIC8qIGd1YXJkIGFscmVhZHkgc2V0ICovCi0gICAgaWYgKG5leHRsZW4gPT0gMCkgbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOwotCi0gICAgZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7Ci0gICAgICAgIGN1cmxlbiA9IG5leHRsZW47IG5leHRsZW4gPSB0cmVlW24rMV0uTGVuOwotICAgICAgICBpZiAoKytjb3VudCA8IG1heF9jb3VudCAmJiBjdXJsZW4gPT0gbmV4dGxlbikgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHsKLSAgICAgICAgICAgIGRvIHsgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy0+YmxfdHJlZSk7IH0gd2hpbGUgKC0tY291bnQgIT0gMCk7Ci0KLSAgICAgICAgfSBlbHNlIGlmIChjdXJsZW4gIT0gMCkgewotICAgICAgICAgICAgaWYgKGN1cmxlbiAhPSBwcmV2bGVuKSB7Ci0gICAgICAgICAgICAgICAgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy0+YmxfdHJlZSk7IGNvdW50LS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBc3NlcnQoY291bnQgPj0gMyAmJiBjb3VudCA8PSA2LCAiIDNfNj8iKTsKLSAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBfM182LCBzLT5ibF90cmVlKTsgc2VuZF9iaXRzKHMsIGNvdW50LTMsIDIpOwotCi0gICAgICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHsKLSAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBaXzNfMTAsIHMtPmJsX3RyZWUpOyBzZW5kX2JpdHMocywgY291bnQtMywgMyk7Ci0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNlbmRfY29kZShzLCBSRVBaXzExXzEzOCwgcy0+YmxfdHJlZSk7IHNlbmRfYml0cyhzLCBjb3VudC0xMSwgNyk7Ci0gICAgICAgIH0KLSAgICAgICAgY291bnQgPSAwOyBwcmV2bGVuID0gY3VybGVuOwotICAgICAgICBpZiAobmV4dGxlbiA9PSAwKSB7Ci0gICAgICAgICAgICBtYXhfY291bnQgPSAxMzgsIG1pbl9jb3VudCA9IDM7Ci0gICAgICAgIH0gZWxzZSBpZiAoY3VybGVuID09IG5leHRsZW4pIHsKLSAgICAgICAgICAgIG1heF9jb3VudCA9IDYsIG1pbl9jb3VudCA9IDM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtYXhfY291bnQgPSA3LCBtaW5fY291bnQgPSA0OwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGZvciB0aGUgYml0IGxlbmd0aHMgYW5kIHJldHVybiB0aGUgaW5kZXggaW4KLSAqIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLgotICovCi1sb2NhbCBpbnQgYnVpbGRfYmxfdHJlZSgKLSAgICBkZWZsYXRlX3N0YXRlICpzKQotewotICAgIGludCBtYXhfYmxpbmRleDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi8KLQotICAgIC8qIERldGVybWluZSB0aGUgYml0IGxlbmd0aCBmcmVxdWVuY2llcyBmb3IgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi8KLSAgICBzY2FuX3RyZWUocywgKGN0X2RhdGEgKilzLT5keW5fbHRyZWUsIHMtPmxfZGVzYy5tYXhfY29kZSk7Ci0gICAgc2Nhbl90cmVlKHMsIChjdF9kYXRhICopcy0+ZHluX2R0cmVlLCBzLT5kX2Rlc2MubWF4X2NvZGUpOwotCi0gICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZTogKi8KLSAgICBidWlsZF90cmVlKHMsICh0cmVlX2Rlc2MgKikoJihzLT5ibF9kZXNjKSkpOwotICAgIC8qIG9wdF9sZW4gbm93IGluY2x1ZGVzIHRoZSBsZW5ndGggb2YgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLCBleGNlcHQKLSAgICAgKiB0aGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aHMgY29kZXMgYW5kIHRoZSA1KzUrNCBiaXRzIGZvciB0aGUgY291bnRzLgotICAgICAqLwotCi0gICAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYml0IGxlbmd0aCBjb2RlcyB0byBzZW5kLiBUaGUgcGt6aXAgZm9ybWF0Ci0gICAgICogcmVxdWlyZXMgdGhhdCBhdCBsZWFzdCA0IGJpdCBsZW5ndGggY29kZXMgYmUgc2VudC4gKGFwcG5vdGUudHh0IHNheXMKLSAgICAgKiAzIGJ1dCB0aGUgYWN0dWFsIHZhbHVlIHVzZWQgaXMgNC4pCi0gICAgICovCi0gICAgZm9yIChtYXhfYmxpbmRleCA9IEJMX0NPREVTLTE7IG1heF9ibGluZGV4ID49IDM7IG1heF9ibGluZGV4LS0pIHsKLSAgICAgICAgaWYgKHMtPmJsX3RyZWVbYmxfb3JkZXJbbWF4X2JsaW5kZXhdXS5MZW4gIT0gMCkgYnJlYWs7Ci0gICAgfQotICAgIC8qIFVwZGF0ZSBvcHRfbGVuIHRvIGluY2x1ZGUgdGhlIGJpdCBsZW5ndGggdHJlZSBhbmQgY291bnRzICovCi0gICAgcy0+b3B0X2xlbiArPSAzKihtYXhfYmxpbmRleCsxKSArIDUrNSs0OwotICAgIFRyYWNldigoc3RkZXJyLCAiXG5keW4gdHJlZXM6IGR5biAlbGQsIHN0YXQgJWxkIiwKLSAgICAgICAgICAgIHMtPm9wdF9sZW4sIHMtPnN0YXRpY19sZW4pKTsKLQotICAgIHJldHVybiBtYXhfYmxpbmRleDsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBTZW5kIHRoZSBoZWFkZXIgZm9yIGEgYmxvY2sgdXNpbmcgZHluYW1pYyBIdWZmbWFuIHRyZWVzOiB0aGUgY291bnRzLCB0aGUKLSAqIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGggY29kZXMsIHRoZSBsaXRlcmFsIHRyZWUgYW5kIHRoZSBkaXN0YW5jZSB0cmVlLgotICogSU4gYXNzZXJ0aW9uOiBsY29kZXMgPj0gMjU3LCBkY29kZXMgPj0gMSwgYmxjb2RlcyA+PSA0LgotICovCi1sb2NhbCB2b2lkIHNlbmRfYWxsX3RyZWVzKAotICAgIGRlZmxhdGVfc3RhdGUgKnMsCi0gICAgaW50IGxjb2RlcywgaW50IGRjb2RlcywgaW50IGJsY29kZXMpIC8qIG51bWJlciBvZiBjb2RlcyBmb3IgZWFjaCB0cmVlICovCi17Ci0gICAgaW50IHJhbms7ICAgICAgICAgICAgICAgICAgICAvKiBpbmRleCBpbiBibF9vcmRlciAqLwotCi0gICAgQXNzZXJ0IChsY29kZXMgPj0gMjU3ICYmIGRjb2RlcyA+PSAxICYmIGJsY29kZXMgPj0gNCwgIm5vdCBlbm91Z2ggY29kZXMiKTsKLSAgICBBc3NlcnQgKGxjb2RlcyA8PSBMX0NPREVTICYmIGRjb2RlcyA8PSBEX0NPREVTICYmIGJsY29kZXMgPD0gQkxfQ09ERVMsCi0gICAgICAgICAgICAidG9vIG1hbnkgY29kZXMiKTsKLSAgICBUcmFjZXYoKHN0ZGVyciwgIlxuYmwgY291bnRzOiAiKSk7Ci0gICAgc2VuZF9iaXRzKHMsIGxjb2Rlcy0yNTcsIDUpOyAvKiBub3QgKzI1NSBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi8KLSAgICBzZW5kX2JpdHMocywgZGNvZGVzLTEsICAgNSk7Ci0gICAgc2VuZF9iaXRzKHMsIGJsY29kZXMtNCwgIDQpOyAvKiBub3QgLTMgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovCi0gICAgZm9yIChyYW5rID0gMDsgcmFuayA8IGJsY29kZXM7IHJhbmsrKykgewotICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxuYmwgY29kZSAlMmQgIiwgYmxfb3JkZXJbcmFua10pKTsKLSAgICAgICAgc2VuZF9iaXRzKHMsIHMtPmJsX3RyZWVbYmxfb3JkZXJbcmFua11dLkxlbiwgMyk7Ci0gICAgfQotICAgIFRyYWNldigoc3RkZXJyLCAiXG5ibCB0cmVlOiBzZW50ICVsZCIsIHMtPmJpdHNfc2VudCkpOwotCi0gICAgc2VuZF90cmVlKHMsIChjdF9kYXRhICopcy0+ZHluX2x0cmVlLCBsY29kZXMtMSk7IC8qIGxpdGVyYWwgdHJlZSAqLwotICAgIFRyYWNldigoc3RkZXJyLCAiXG5saXQgdHJlZTogc2VudCAlbGQiLCBzLT5iaXRzX3NlbnQpKTsKLQotICAgIHNlbmRfdHJlZShzLCAoY3RfZGF0YSAqKXMtPmR5bl9kdHJlZSwgZGNvZGVzLTEpOyAvKiBkaXN0YW5jZSB0cmVlICovCi0gICAgVHJhY2V2KChzdGRlcnIsICJcbmRpc3QgdHJlZTogc2VudCAlbGQiLCBzLT5iaXRzX3NlbnQpKTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBTZW5kIGEgc3RvcmVkIGJsb2NrCi0gKi8KLXZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfc3RvcmVkX2Jsb2NrKAotICAgIGRlZmxhdGVfc3RhdGUgKnMsCi0gICAgY2hhcmYgKmJ1ZiwgICAgICAgLyogaW5wdXQgYmxvY2sgKi8KLSAgICB1bGcgc3RvcmVkX2xlbiwgICAvKiBsZW5ndGggb2YgaW5wdXQgYmxvY2sgKi8KLSAgICBpbnQgbGFzdCkgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovCi17Ci0gICAgc2VuZF9iaXRzKHMsIChTVE9SRURfQkxPQ0s8PDEpK2xhc3QsIDMpOyAgICAvKiBzZW5kIGJsb2NrIHR5cGUgKi8KLSNpZmRlZiBERUJVRwotICAgIHMtPmNvbXByZXNzZWRfbGVuID0gKHMtPmNvbXByZXNzZWRfbGVuICsgMyArIDcpICYgKHVsZyl+N0w7Ci0gICAgcy0+Y29tcHJlc3NlZF9sZW4gKz0gKHN0b3JlZF9sZW4gKyA0KSA8PCAzOwotI2VuZGlmCi0gICAgY29weV9ibG9jayhzLCBidWYsICh1bnNpZ25lZClzdG9yZWRfbGVuLCAxKTsgLyogd2l0aCBoZWFkZXIgKi8KLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBGbHVzaCB0aGUgYml0cyBpbiB0aGUgYml0IGJ1ZmZlciB0byBwZW5kaW5nIG91dHB1dCAobGVhdmVzIGF0IG1vc3QgNyBiaXRzKQotICovCi12b2lkIFpMSUJfSU5URVJOQUwgX3RyX2ZsdXNoX2JpdHMoCi0gICAgZGVmbGF0ZV9zdGF0ZSAqcykKLXsKLSAgICBiaV9mbHVzaChzKTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBTZW5kIG9uZSBlbXB0eSBzdGF0aWMgYmxvY2sgdG8gZ2l2ZSBlbm91Z2ggbG9va2FoZWFkIGZvciBpbmZsYXRlLgotICogVGhpcyB0YWtlcyAxMCBiaXRzLCBvZiB3aGljaCA3IG1heSByZW1haW4gaW4gdGhlIGJpdCBidWZmZXIuCi0gKi8KLXZvaWQgWkxJQl9JTlRFUk5BTCBfdHJfYWxpZ24oCi0gICAgZGVmbGF0ZV9zdGF0ZSAqcykKLXsKLSAgICBzZW5kX2JpdHMocywgU1RBVElDX1RSRUVTPDwxLCAzKTsKLSAgICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBzdGF0aWNfbHRyZWUpOwotI2lmZGVmIERFQlVHCi0gICAgcy0+Y29tcHJlc3NlZF9sZW4gKz0gMTBMOyAvKiAzIGZvciBibG9jayB0eXBlLCA3IGZvciBFT0IgKi8KLSNlbmRpZgotICAgIGJpX2ZsdXNoKHMpOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZyBmb3IgdGhlIGN1cnJlbnQgYmxvY2s6IGR5bmFtaWMgdHJlZXMsIHN0YXRpYwotICogdHJlZXMgb3Igc3RvcmUsIGFuZCBvdXRwdXQgdGhlIGVuY29kZWQgYmxvY2sgdG8gdGhlIHppcCBmaWxlLgotICovCi12b2lkIFpMSUJfSU5URVJOQUwgX3RyX2ZsdXNoX2Jsb2NrKAotICAgIGRlZmxhdGVfc3RhdGUgKnMsCi0gICAgY2hhcmYgKmJ1ZiwgICAgICAgLyogaW5wdXQgYmxvY2ssIG9yIE5VTEwgaWYgdG9vIG9sZCAqLwotICAgIHVsZyBzdG9yZWRfbGVuLCAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqLwotICAgIGludCBsYXN0KSAgICAgICAgIC8qIG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGZvciBhIGZpbGUgKi8KLXsKLSAgICB1bGcgb3B0X2xlbmIsIHN0YXRpY19sZW5iOyAvKiBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGluIGJ5dGVzICovCi0gICAgaW50IG1heF9ibGluZGV4ID0gMDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi8KLQotICAgIC8qIEJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzIHVubGVzcyBhIHN0b3JlZCBibG9jayBpcyBmb3JjZWQgKi8KLSAgICBpZiAocy0+bGV2ZWwgPiAwKSB7Ci0KLSAgICAgICAgLyogQ2hlY2sgaWYgdGhlIGZpbGUgaXMgYmluYXJ5IG9yIHRleHQgKi8KLSAgICAgICAgaWYgKHMtPnN0cm0tPmRhdGFfdHlwZSA9PSBaX1VOS05PV04pCi0gICAgICAgICAgICBzLT5zdHJtLT5kYXRhX3R5cGUgPSBkZXRlY3RfZGF0YV90eXBlKHMpOwotCi0gICAgICAgIC8qIENvbnN0cnVjdCB0aGUgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgdHJlZXMgKi8KLSAgICAgICAgYnVpbGRfdHJlZShzLCAodHJlZV9kZXNjICopKCYocy0+bF9kZXNjKSkpOwotICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxubGl0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkIiwgcy0+b3B0X2xlbiwKLSAgICAgICAgICAgICAgICBzLT5zdGF0aWNfbGVuKSk7Ci0KLSAgICAgICAgYnVpbGRfdHJlZShzLCAodHJlZV9kZXNjICopKCYocy0+ZF9kZXNjKSkpOwotICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxuZGlzdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZCIsIHMtPm9wdF9sZW4sCi0gICAgICAgICAgICAgICAgcy0+c3RhdGljX2xlbikpOwotICAgICAgICAvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2YKLSAgICAgICAgICogdGhlIGNvbXByZXNzZWQgYmxvY2sgZGF0YSwgZXhjbHVkaW5nIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucy4KLSAgICAgICAgICovCi0KLSAgICAgICAgLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXgKLSAgICAgICAgICogaW4gYmxfb3JkZXIgb2YgdGhlIGxhc3QgYml0IGxlbmd0aCBjb2RlIHRvIHNlbmQuCi0gICAgICAgICAqLwotICAgICAgICBtYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUocyk7Ci0KLSAgICAgICAgLyogRGV0ZXJtaW5lIHRoZSBiZXN0IGVuY29kaW5nLiBDb21wdXRlIHRoZSBibG9jayBsZW5ndGhzIGluIGJ5dGVzLiAqLwotICAgICAgICBvcHRfbGVuYiA9IChzLT5vcHRfbGVuKzMrNyk+PjM7Ci0gICAgICAgIHN0YXRpY19sZW5iID0gKHMtPnN0YXRpY19sZW4rMys3KT4+MzsKLQotICAgICAgICBUcmFjZXYoKHN0ZGVyciwgIlxub3B0ICVsdSglbHUpIHN0YXQgJWx1KCVsdSkgc3RvcmVkICVsdSBsaXQgJXUgIiwKLSAgICAgICAgICAgICAgICBvcHRfbGVuYiwgcy0+b3B0X2xlbiwgc3RhdGljX2xlbmIsIHMtPnN0YXRpY19sZW4sIHN0b3JlZF9sZW4sCi0gICAgICAgICAgICAgICAgcy0+bGFzdF9saXQpKTsKLQotICAgICAgICBpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpIG9wdF9sZW5iID0gc3RhdGljX2xlbmI7Ci0KLSAgICB9IGVsc2UgewotICAgICAgICBBc3NlcnQoYnVmICE9IChjaGFyKikwLCAibG9zdCBidWYiKTsKLSAgICAgICAgb3B0X2xlbmIgPSBzdGF0aWNfbGVuYiA9IHN0b3JlZF9sZW4gKyA1OyAvKiBmb3JjZSBhIHN0b3JlZCBibG9jayAqLwotICAgIH0KLQotI2lmZGVmIEZPUkNFX1NUT1JFRAotICAgIGlmIChidWYgIT0gKGNoYXIqKTApIHsgLyogZm9yY2Ugc3RvcmVkIGJsb2NrICovCi0jZWxzZQotICAgIGlmIChzdG9yZWRfbGVuKzQgPD0gb3B0X2xlbmIgJiYgYnVmICE9IChjaGFyKikwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgIC8qIDQ6IHR3byB3b3JkcyBmb3IgdGhlIGxlbmd0aHMgKi8KLSNlbmRpZgotICAgICAgICAvKiBUaGUgdGVzdCBidWYgIT0gTlVMTCBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBMSVRfQlVGU0laRSA+IFdTSVpFLgotICAgICAgICAgKiBPdGhlcndpc2Ugd2UgY2FuJ3QgaGF2ZSBwcm9jZXNzZWQgbW9yZSB0aGFuIFdTSVpFIGlucHV0IGJ5dGVzIHNpbmNlCi0gICAgICAgICAqIHRoZSBsYXN0IGJsb2NrIGZsdXNoLCBiZWNhdXNlIGNvbXByZXNzaW9uIHdvdWxkIGhhdmUgYmVlbgotICAgICAgICAgKiBzdWNjZXNzZnVsLiBJZiBMSVRfQlVGU0laRSA8PSBXU0laRSwgaXQgaXMgbmV2ZXIgdG9vIGxhdGUgdG8KLSAgICAgICAgICogdHJhbnNmb3JtIGEgYmxvY2sgaW50byBhIHN0b3JlZCBibG9jay4KLSAgICAgICAgICovCi0gICAgICAgIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KTsKLQotI2lmZGVmIEZPUkNFX1NUQVRJQwotICAgIH0gZWxzZSBpZiAoc3RhdGljX2xlbmIgPj0gMCkgeyAvKiBmb3JjZSBzdGF0aWMgdHJlZXMgKi8KLSNlbHNlCi0gICAgfSBlbHNlIGlmIChzLT5zdHJhdGVneSA9PSBaX0ZJWEVEIHx8IHN0YXRpY19sZW5iID09IG9wdF9sZW5iKSB7Ci0jZW5kaWYKLSAgICAgICAgc2VuZF9iaXRzKHMsIChTVEFUSUNfVFJFRVM8PDEpK2xhc3QsIDMpOwotICAgICAgICBjb21wcmVzc19ibG9jayhzLCAoY29uc3QgY3RfZGF0YSAqKXN0YXRpY19sdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGN0X2RhdGEgKilzdGF0aWNfZHRyZWUpOwotI2lmZGVmIERFQlVHCi0gICAgICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IDMgKyBzLT5zdGF0aWNfbGVuOwotI2VuZGlmCi0gICAgfSBlbHNlIHsKLSAgICAgICAgc2VuZF9iaXRzKHMsIChEWU5fVFJFRVM8PDEpK2xhc3QsIDMpOwotICAgICAgICBzZW5kX2FsbF90cmVlcyhzLCBzLT5sX2Rlc2MubWF4X2NvZGUrMSwgcy0+ZF9kZXNjLm1heF9jb2RlKzEsCi0gICAgICAgICAgICAgICAgICAgICAgIG1heF9ibGluZGV4KzEpOwotICAgICAgICBjb21wcmVzc19ibG9jayhzLCAoY29uc3QgY3RfZGF0YSAqKXMtPmR5bl9sdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGN0X2RhdGEgKilzLT5keW5fZHRyZWUpOwotI2lmZGVmIERFQlVHCi0gICAgICAgIHMtPmNvbXByZXNzZWRfbGVuICs9IDMgKyBzLT5vcHRfbGVuOwotI2VuZGlmCi0gICAgfQotICAgIEFzc2VydCAocy0+Y29tcHJlc3NlZF9sZW4gPT0gcy0+Yml0c19zZW50LCAiYmFkIGNvbXByZXNzZWQgc2l6ZSIpOwotICAgIC8qIFRoZSBhYm92ZSBjaGVjayBpcyBtYWRlIG1vZCAyXjMyLCBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gNTEyIE1CCi0gICAgICogYW5kIHVMb25nIGltcGxlbWVudGVkIG9uIDMyIGJpdHMuCi0gICAgICovCi0gICAgaW5pdF9ibG9jayhzKTsKLQotICAgIGlmIChsYXN0KSB7Ci0gICAgICAgIGJpX3dpbmR1cChzKTsKLSNpZmRlZiBERUJVRwotICAgICAgICBzLT5jb21wcmVzc2VkX2xlbiArPSA3OyAgLyogYWxpZ24gb24gYnl0ZSBib3VuZGFyeSAqLwotI2VuZGlmCi0gICAgfQotICAgIFRyYWNldigoc3RkZXJyLCJcbmNvbXBybGVuICVsdSglbHUpICIsIHMtPmNvbXByZXNzZWRfbGVuPj4zLAotICAgICAgICAgICBzLT5jb21wcmVzc2VkX2xlbi03Kmxhc3QpKTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBTYXZlIHRoZSBtYXRjaCBpbmZvIGFuZCB0YWxseSB0aGUgZnJlcXVlbmN5IGNvdW50cy4gUmV0dXJuIHRydWUgaWYKLSAqIHRoZSBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZC4KLSAqLwotaW50IFpMSUJfSU5URVJOQUwgX3RyX3RhbGx5ICgKLSAgICBkZWZsYXRlX3N0YXRlICpzLAotICAgIHVuc2lnbmVkIGRpc3QsICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqLwotICAgIHVuc2lnbmVkIGxjKSAgICAvKiBtYXRjaCBsZW5ndGgtTUlOX01BVENIIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0PT0wKSAqLwotewotICAgIHMtPmRfYnVmW3MtPmxhc3RfbGl0XSA9ICh1c2gpZGlzdDsKLSAgICBzLT5sX2J1ZltzLT5sYXN0X2xpdCsrXSA9ICh1Y2gpbGM7Ci0gICAgaWYgKGRpc3QgPT0gMCkgewotICAgICAgICAvKiBsYyBpcyB0aGUgdW5tYXRjaGVkIGNoYXIgKi8KLSAgICAgICAgcy0+ZHluX2x0cmVlW2xjXS5GcmVxKys7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcy0+bWF0Y2hlcysrOwotICAgICAgICAvKiBIZXJlLCBsYyBpcyB0aGUgbWF0Y2ggbGVuZ3RoIC0gTUlOX01BVENIICovCi0gICAgICAgIGRpc3QtLTsgICAgICAgICAgICAgLyogZGlzdCA9IG1hdGNoIGRpc3RhbmNlIC0gMSAqLwotICAgICAgICBBc3NlcnQoKHVzaClkaXN0IDwgKHVzaClNQVhfRElTVChzKSAmJgotICAgICAgICAgICAgICAgKHVzaClsYyA8PSAodXNoKShNQVhfTUFUQ0gtTUlOX01BVENIKSAmJgotICAgICAgICAgICAgICAgKHVzaClkX2NvZGUoZGlzdCkgPCAodXNoKURfQ09ERVMsICAiX3RyX3RhbGx5OiBiYWQgbWF0Y2giKTsKLQotICAgICAgICBzLT5keW5fbHRyZWVbX2xlbmd0aF9jb2RlW2xjXStMSVRFUkFMUysxXS5GcmVxKys7Ci0gICAgICAgIHMtPmR5bl9kdHJlZVtkX2NvZGUoZGlzdCldLkZyZXErKzsKLSAgICB9Ci0KLSNpZmRlZiBUUlVOQ0FURV9CTE9DSwotICAgIC8qIFRyeSB0byBndWVzcyBpZiBpdCBpcyBwcm9maXRhYmxlIHRvIHN0b3AgdGhlIGN1cnJlbnQgYmxvY2sgaGVyZSAqLwotICAgIGlmICgocy0+bGFzdF9saXQgJiAweDFmZmYpID09IDAgJiYgcy0+bGV2ZWwgPiAyKSB7Ci0gICAgICAgIC8qIENvbXB1dGUgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBjb21wcmVzc2VkIGxlbmd0aCAqLwotICAgICAgICB1bGcgb3V0X2xlbmd0aCA9ICh1bGcpcy0+bGFzdF9saXQqOEw7Ci0gICAgICAgIHVsZyBpbl9sZW5ndGggPSAodWxnKSgobG9uZylzLT5zdHJzdGFydCAtIHMtPmJsb2NrX3N0YXJ0KTsKLSAgICAgICAgaW50IGRjb2RlOwotICAgICAgICBmb3IgKGRjb2RlID0gMDsgZGNvZGUgPCBEX0NPREVTOyBkY29kZSsrKSB7Ci0gICAgICAgICAgICBvdXRfbGVuZ3RoICs9ICh1bGcpcy0+ZHluX2R0cmVlW2Rjb2RlXS5GcmVxICoKLSAgICAgICAgICAgICAgICAoNUwrZXh0cmFfZGJpdHNbZGNvZGVdKTsKLSAgICAgICAgfQotICAgICAgICBvdXRfbGVuZ3RoID4+PSAzOwotICAgICAgICBUcmFjZXYoKHN0ZGVyciwiXG5sYXN0X2xpdCAldSwgaW4gJWxkLCBvdXQgfiVsZCglbGQlJSkgIiwKLSAgICAgICAgICAgICAgIHMtPmxhc3RfbGl0LCBpbl9sZW5ndGgsIG91dF9sZW5ndGgsCi0gICAgICAgICAgICAgICAxMDBMIC0gb3V0X2xlbmd0aCoxMDBML2luX2xlbmd0aCkpOwotICAgICAgICBpZiAocy0+bWF0Y2hlcyA8IHMtPmxhc3RfbGl0LzIgJiYgb3V0X2xlbmd0aCA8IGluX2xlbmd0aC8yKSByZXR1cm4gMTsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gKHMtPmxhc3RfbGl0ID09IHMtPmxpdF9idWZzaXplLTEpOwotICAgIC8qIFdlIGF2b2lkIGVxdWFsaXR5IHdpdGggbGl0X2J1ZnNpemUgYmVjYXVzZSBvZiB3cmFwYXJvdW5kIGF0IDY0SwotICAgICAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQgYmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvCi0gICAgICogNjRLLTEgYnl0ZXMuCi0gICAgICovCi19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogU2VuZCB0aGUgYmxvY2sgZGF0YSBjb21wcmVzc2VkIHVzaW5nIHRoZSBnaXZlbiBIdWZmbWFuIHRyZWVzCi0gKi8KLWxvY2FsIHZvaWQgY29tcHJlc3NfYmxvY2soCi0gICAgZGVmbGF0ZV9zdGF0ZSAqcywKLSAgICBjb25zdCBjdF9kYXRhICpsdHJlZSwgLyogbGl0ZXJhbCB0cmVlICovCi0gICAgY29uc3QgY3RfZGF0YSAqZHRyZWUpIC8qIGRpc3RhbmNlIHRyZWUgKi8KLXsKLSAgICB1bnNpZ25lZCBkaXN0OyAgICAgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovCi0gICAgaW50IGxjOyAgICAgICAgICAgICAvKiBtYXRjaCBsZW5ndGggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3QgPT0gMCkgKi8KLSAgICB1bnNpZ25lZCBseCA9IDA7ICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi8KLSAgICB1bnNpZ25lZCBjb2RlOyAgICAgIC8qIHRoZSBjb2RlIHRvIHNlbmQgKi8KLSAgICBpbnQgZXh0cmE7ICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzIHRvIHNlbmQgKi8KLQotICAgIGlmIChzLT5sYXN0X2xpdCAhPSAwKSBkbyB7Ci0gICAgICAgIGRpc3QgPSBzLT5kX2J1ZltseF07Ci0gICAgICAgIGxjID0gcy0+bF9idWZbbHgrK107Ci0gICAgICAgIGlmIChkaXN0ID09IDApIHsKLSAgICAgICAgICAgIHNlbmRfY29kZShzLCBsYywgbHRyZWUpOyAvKiBzZW5kIGEgbGl0ZXJhbCBieXRlICovCi0gICAgICAgICAgICBUcmFjZWN2KGlzZ3JhcGgobGMpLCAoc3RkZXJyLCIgJyVjJyAiLCBsYykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLyogSGVyZSwgbGMgaXMgdGhlIG1hdGNoIGxlbmd0aCAtIE1JTl9NQVRDSCAqLwotICAgICAgICAgICAgY29kZSA9IF9sZW5ndGhfY29kZVtsY107Ci0gICAgICAgICAgICBzZW5kX2NvZGUocywgY29kZStMSVRFUkFMUysxLCBsdHJlZSk7IC8qIHNlbmQgdGhlIGxlbmd0aCBjb2RlICovCi0gICAgICAgICAgICBleHRyYSA9IGV4dHJhX2xiaXRzW2NvZGVdOwotICAgICAgICAgICAgaWYgKGV4dHJhICE9IDApIHsKLSAgICAgICAgICAgICAgICBsYyAtPSBiYXNlX2xlbmd0aFtjb2RlXTsKLSAgICAgICAgICAgICAgICBzZW5kX2JpdHMocywgbGMsIGV4dHJhKTsgICAgICAgLyogc2VuZCB0aGUgZXh0cmEgbGVuZ3RoIGJpdHMgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRpc3QtLTsgLyogZGlzdCBpcyBub3cgdGhlIG1hdGNoIGRpc3RhbmNlIC0gMSAqLwotICAgICAgICAgICAgY29kZSA9IGRfY29kZShkaXN0KTsKLSAgICAgICAgICAgIEFzc2VydCAoY29kZSA8IERfQ09ERVMsICJiYWQgZF9jb2RlIik7Ci0KLSAgICAgICAgICAgIHNlbmRfY29kZShzLCBjb2RlLCBkdHJlZSk7ICAgICAgIC8qIHNlbmQgdGhlIGRpc3RhbmNlIGNvZGUgKi8KLSAgICAgICAgICAgIGV4dHJhID0gZXh0cmFfZGJpdHNbY29kZV07Ci0gICAgICAgICAgICBpZiAoZXh0cmEgIT0gMCkgewotICAgICAgICAgICAgICAgIGRpc3QgLT0gYmFzZV9kaXN0W2NvZGVdOwotICAgICAgICAgICAgICAgIHNlbmRfYml0cyhzLCBkaXN0LCBleHRyYSk7ICAgLyogc2VuZCB0aGUgZXh0cmEgZGlzdGFuY2UgYml0cyAqLwotICAgICAgICAgICAgfQotICAgICAgICB9IC8qIGxpdGVyYWwgb3IgbWF0Y2ggcGFpciA/ICovCi0KLSAgICAgICAgLyogQ2hlY2sgdGhhdCB0aGUgb3ZlcmxheSBiZXR3ZWVuIHBlbmRpbmdfYnVmIGFuZCBkX2J1ZitsX2J1ZiBpcyBvazogKi8KLSAgICAgICAgQXNzZXJ0KCh1SW50KShzLT5wZW5kaW5nKSA8IHMtPmxpdF9idWZzaXplICsgMipseCwKLSAgICAgICAgICAgICAgICJwZW5kaW5nQnVmIG92ZXJmbG93Iik7Ci0KLSAgICB9IHdoaWxlIChseCA8IHMtPmxhc3RfbGl0KTsKLQotICAgIHNlbmRfY29kZShzLCBFTkRfQkxPQ0ssIGx0cmVlKTsKLX0KLQotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKiBDaGVjayBpZiB0aGUgZGF0YSB0eXBlIGlzIFRFWFQgb3IgQklOQVJZLCB1c2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobToKLSAqIC0gVEVYVCBpZiB0aGUgdHdvIGNvbmRpdGlvbnMgYmVsb3cgYXJlIHNhdGlzZmllZDoKLSAqICAgIGEpIFRoZXJlIGFyZSBubyBub24tcG9ydGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIGJlbG9uZ2luZyB0byB0aGUKLSAqICAgICAgICJibGFjayBsaXN0IiAoMC4uNiwgMTQuLjI1LCAyOC4uMzEpLgotICogICAgYikgVGhlcmUgaXMgYXQgbGVhc3Qgb25lIHByaW50YWJsZSBjaGFyYWN0ZXIgYmVsb25naW5nIHRvIHRoZQotICogICAgICAgIndoaXRlIGxpc3QiICg5IHtUQUJ9LCAxMCB7TEZ9LCAxMyB7Q1J9LCAzMi4uMjU1KS4KLSAqIC0gQklOQVJZIG90aGVyd2lzZS4KLSAqIC0gVGhlIGZvbGxvd2luZyBwYXJ0aWFsbHktcG9ydGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIGZvcm0gYQotICogICAiZ3JheSBsaXN0IiB0aGF0IGlzIGlnbm9yZWQgaW4gdGhpcyBkZXRlY3Rpb24gYWxnb3JpdGhtOgotICogICAoNyB7QkVMfSwgOCB7QlN9LCAxMSB7VlR9LCAxMiB7RkZ9LCAyNiB7U1VCfSwgMjcge0VTQ30pLgotICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIEZyZXEgb2YgZHluX2x0cmVlIGFyZSBzZXQuCi0gKi8KLWxvY2FsIGludCBkZXRlY3RfZGF0YV90eXBlKAotICAgIGRlZmxhdGVfc3RhdGUgKnMpCi17Ci0gICAgLyogYmxhY2tfbWFzayBpcyB0aGUgYml0IG1hc2sgb2YgYmxhY2stbGlzdGVkIGJ5dGVzCi0gICAgICogc2V0IGJpdHMgMC4uNiwgMTQuLjI1LCBhbmQgMjguLjMxCi0gICAgICogMHhmM2ZmYzA3ZiA9IGJpbmFyeSAxMTExMDAxMTExMTExMTExMTEwMDAwMDAwMTExMTExMQotICAgICAqLwotICAgIHVuc2lnbmVkIGxvbmcgYmxhY2tfbWFzayA9IDB4ZjNmZmMwN2ZVTDsKLSAgICBpbnQgbjsKLQotICAgIC8qIENoZWNrIGZvciBub24tdGV4dHVhbCAoImJsYWNrLWxpc3RlZCIpIGJ5dGVzLiAqLwotICAgIGZvciAobiA9IDA7IG4gPD0gMzE7IG4rKywgYmxhY2tfbWFzayA+Pj0gMSkKLSAgICAgICAgaWYgKChibGFja19tYXNrICYgMSkgJiYgKHMtPmR5bl9sdHJlZVtuXS5GcmVxICE9IDApKQotICAgICAgICAgICAgcmV0dXJuIFpfQklOQVJZOwotCi0gICAgLyogQ2hlY2sgZm9yIHRleHR1YWwgKCJ3aGl0ZS1saXN0ZWQiKSBieXRlcy4gKi8KLSAgICBpZiAocy0+ZHluX2x0cmVlWzldLkZyZXEgIT0gMCB8fCBzLT5keW5fbHRyZWVbMTBdLkZyZXEgIT0gMAotICAgICAgICAgICAgfHwgcy0+ZHluX2x0cmVlWzEzXS5GcmVxICE9IDApCi0gICAgICAgIHJldHVybiBaX1RFWFQ7Ci0gICAgZm9yIChuID0gMzI7IG4gPCBMSVRFUkFMUzsgbisrKQotICAgICAgICBpZiAocy0+ZHluX2x0cmVlW25dLkZyZXEgIT0gMCkKLSAgICAgICAgICAgIHJldHVybiBaX1RFWFQ7Ci0KLSAgICAvKiBUaGVyZSBhcmUgbm8gImJsYWNrLWxpc3RlZCIgb3IgIndoaXRlLWxpc3RlZCIgYnl0ZXM6Ci0gICAgICogdGhpcyBzdHJlYW0gZWl0aGVyIGlzIGVtcHR5IG9yIGhhcyB0b2xlcmF0ZWQgKCJncmF5LWxpc3RlZCIpIGJ5dGVzIG9ubHkuCi0gICAgICovCi0gICAgcmV0dXJuIFpfQklOQVJZOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIFJldmVyc2UgdGhlIGZpcnN0IGxlbiBiaXRzIG9mIGEgY29kZSwgdXNpbmcgc3RyYWlnaHRmb3J3YXJkIGNvZGUgKGEgZmFzdGVyCi0gKiBtZXRob2Qgd291bGQgdXNlIGEgdGFibGUpCi0gKiBJTiBhc3NlcnRpb246IDEgPD0gbGVuIDw9IDE1Ci0gKi8KLWxvY2FsIHVuc2lnbmVkIGJpX3JldmVyc2UoCi0gICAgdW5zaWduZWQgY29kZSwgLyogdGhlIHZhbHVlIHRvIGludmVydCAqLwotICAgIGludCBsZW4pICAgICAgIC8qIGl0cyBiaXQgbGVuZ3RoICovCi17Ci0gICAgcmVnaXN0ZXIgdW5zaWduZWQgcmVzID0gMDsKLSAgICBkbyB7Ci0gICAgICAgIHJlcyB8PSBjb2RlICYgMTsKLSAgICAgICAgY29kZSA+Pj0gMSwgcmVzIDw8PSAxOwotICAgIH0gd2hpbGUgKC0tbGVuID4gMCk7Ci0gICAgcmV0dXJuIHJlcyA+PiAxOwotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIEZsdXNoIHRoZSBiaXQgYnVmZmVyLCBrZWVwaW5nIGF0IG1vc3QgNyBiaXRzIGluIGl0LgotICovCi1sb2NhbCB2b2lkIGJpX2ZsdXNoKAotICAgIGRlZmxhdGVfc3RhdGUgKnMpCi17Ci0gICAgaWYgKHMtPmJpX3ZhbGlkID09IDE2KSB7Ci0gICAgICAgIHB1dF9zaG9ydChzLCBzLT5iaV9idWYpOwotICAgICAgICBzLT5iaV9idWYgPSAwOwotICAgICAgICBzLT5iaV92YWxpZCA9IDA7Ci0gICAgfSBlbHNlIGlmIChzLT5iaV92YWxpZCA+PSA4KSB7Ci0gICAgICAgIHB1dF9ieXRlKHMsIChCeXRlKXMtPmJpX2J1Zik7Ci0gICAgICAgIHMtPmJpX2J1ZiA+Pj0gODsKLSAgICAgICAgcy0+YmlfdmFsaWQgLT0gODsKLSAgICB9Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogRmx1c2ggdGhlIGJpdCBidWZmZXIgYW5kIGFsaWduIHRoZSBvdXRwdXQgb24gYSBieXRlIGJvdW5kYXJ5Ci0gKi8KLWxvY2FsIHZvaWQgYmlfd2luZHVwKAotICAgIGRlZmxhdGVfc3RhdGUgKnMpCi17Ci0gICAgaWYgKHMtPmJpX3ZhbGlkID4gOCkgewotICAgICAgICBwdXRfc2hvcnQocywgcy0+YmlfYnVmKTsKLSAgICB9IGVsc2UgaWYgKHMtPmJpX3ZhbGlkID4gMCkgewotICAgICAgICBwdXRfYnl0ZShzLCAoQnl0ZSlzLT5iaV9idWYpOwotICAgIH0KLSAgICBzLT5iaV9idWYgPSAwOwotICAgIHMtPmJpX3ZhbGlkID0gMDsKLSNpZmRlZiBERUJVRwotICAgIHMtPmJpdHNfc2VudCA9IChzLT5iaXRzX3NlbnQrNykgJiB+NzsKLSNlbmRpZgotfQotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqIENvcHkgYSBzdG9yZWQgYmxvY2ssIHN0b3JpbmcgZmlyc3QgdGhlIGxlbmd0aCBhbmQgaXRzCi0gKiBvbmUncyBjb21wbGVtZW50IGlmIHJlcXVlc3RlZC4KLSAqLwotbG9jYWwgdm9pZCBjb3B5X2Jsb2NrKAotICAgIGRlZmxhdGVfc3RhdGUgKnMsCi0gICAgY2hhcmYgICAgKmJ1ZiwgICAgLyogdGhlIGlucHV0IGRhdGEgKi8KLSAgICB1bnNpZ25lZCBsZW4sICAgICAvKiBpdHMgbGVuZ3RoICovCi0gICAgaW50ICAgICAgaGVhZGVyKSAgLyogdHJ1ZSBpZiBibG9jayBoZWFkZXIgbXVzdCBiZSB3cml0dGVuICovCi17Ci0gICAgYmlfd2luZHVwKHMpOyAgICAgICAgLyogYWxpZ24gb24gYnl0ZSBib3VuZGFyeSAqLwotCi0gICAgaWYgKGhlYWRlcikgewotICAgICAgICBwdXRfc2hvcnQocywgKHVzaClsZW4pOwotICAgICAgICBwdXRfc2hvcnQocywgKHVzaCl+bGVuKTsKLSNpZmRlZiBERUJVRwotICAgICAgICBzLT5iaXRzX3NlbnQgKz0gMioxNjsKLSNlbmRpZgotICAgIH0KLSNpZmRlZiBERUJVRwotICAgIHMtPmJpdHNfc2VudCArPSAodWxnKWxlbjw8MzsKLSNlbmRpZgotICAgIHdoaWxlIChsZW4tLSkgewotICAgICAgICBwdXRfYnl0ZShzLCAqYnVmKyspOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3psaWJfdjEyOC90cmVlcy5oIGIvdGhpcmRfcGFydHkvemxpYl92MTI4L3RyZWVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhMDliNTguLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvemxpYl92MTI4L3RyZWVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyogR0VORVJBVEVEIEZJTEUgKi8KLS8qIGhlYWRlciBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgd2l0aCAtREdFTl9UUkVFU19IICovCi0KLWxvY2FsIGNvbnN0IGN0X2RhdGEgc3RhdGljX2x0cmVlW0xfQ09ERVMrMl0gPSB7Ci17eyAxMn0seyAgOH19LCB7ezE0MH0seyAgOH19LCB7eyA3Nn0seyAgOH19LCB7ezIwNH0seyAgOH19LCB7eyA0NH0seyAgOH19LAote3sxNzJ9LHsgIDh9fSwge3sxMDh9LHsgIDh9fSwge3syMzZ9LHsgIDh9fSwge3sgMjh9LHsgIDh9fSwge3sxNTZ9LHsgIDh9fSwKLXt7IDkyfSx7ICA4fX0sIHt7MjIwfSx7ICA4fX0sIHt7IDYwfSx7ICA4fX0sIHt7MTg4fSx7ICA4fX0sIHt7MTI0fSx7ICA4fX0sCi17ezI1Mn0seyAgOH19LCB7eyAgMn0seyAgOH19LCB7ezEzMH0seyAgOH19LCB7eyA2Nn0seyAgOH19LCB7ezE5NH0seyAgOH19LAote3sgMzR9LHsgIDh9fSwge3sxNjJ9LHsgIDh9fSwge3sgOTh9LHsgIDh9fSwge3syMjZ9LHsgIDh9fSwge3sgMTh9LHsgIDh9fSwKLXt7MTQ2fSx7ICA4fX0sIHt7IDgyfSx7ICA4fX0sIHt7MjEwfSx7ICA4fX0sIHt7IDUwfSx7ICA4fX0sIHt7MTc4fSx7ICA4fX0sCi17ezExNH0seyAgOH19LCB7ezI0Mn0seyAgOH19LCB7eyAxMH0seyAgOH19LCB7ezEzOH0seyAgOH19LCB7eyA3NH0seyAgOH19LAote3syMDJ9LHsgIDh9fSwge3sgNDJ9LHsgIDh9fSwge3sxNzB9LHsgIDh9fSwge3sxMDZ9LHsgIDh9fSwge3syMzR9LHsgIDh9fSwKLXt7IDI2fSx7ICA4fX0sIHt7MTU0fSx7ICA4fX0sIHt7IDkwfSx7ICA4fX0sIHt7MjE4fSx7ICA4fX0sIHt7IDU4fSx7ICA4fX0sCi17ezE4Nn0seyAgOH19LCB7ezEyMn0seyAgOH19LCB7ezI1MH0seyAgOH19LCB7eyAgNn0seyAgOH19LCB7ezEzNH0seyAgOH19LAote3sgNzB9LHsgIDh9fSwge3sxOTh9LHsgIDh9fSwge3sgMzh9LHsgIDh9fSwge3sxNjZ9LHsgIDh9fSwge3sxMDJ9LHsgIDh9fSwKLXt7MjMwfSx7ICA4fX0sIHt7IDIyfSx7ICA4fX0sIHt7MTUwfSx7ICA4fX0sIHt7IDg2fSx7ICA4fX0sIHt7MjE0fSx7ICA4fX0sCi17eyA1NH0seyAgOH19LCB7ezE4Mn0seyAgOH19LCB7ezExOH0seyAgOH19LCB7ezI0Nn0seyAgOH19LCB7eyAxNH0seyAgOH19LAote3sxNDJ9LHsgIDh9fSwge3sgNzh9LHsgIDh9fSwge3syMDZ9LHsgIDh9fSwge3sgNDZ9LHsgIDh9fSwge3sxNzR9LHsgIDh9fSwKLXt7MTEwfSx7ICA4fX0sIHt7MjM4fSx7ICA4fX0sIHt7IDMwfSx7ICA4fX0sIHt7MTU4fSx7ICA4fX0sIHt7IDk0fSx7ICA4fX0sCi17ezIyMn0seyAgOH19LCB7eyA2Mn0seyAgOH19LCB7ezE5MH0seyAgOH19LCB7ezEyNn0seyAgOH19LCB7ezI1NH0seyAgOH19LAote3sgIDF9LHsgIDh9fSwge3sxMjl9LHsgIDh9fSwge3sgNjV9LHsgIDh9fSwge3sxOTN9LHsgIDh9fSwge3sgMzN9LHsgIDh9fSwKLXt7MTYxfSx7ICA4fX0sIHt7IDk3fSx7ICA4fX0sIHt7MjI1fSx7ICA4fX0sIHt7IDE3fSx7ICA4fX0sIHt7MTQ1fSx7ICA4fX0sCi17eyA4MX0seyAgOH19LCB7ezIwOX0seyAgOH19LCB7eyA0OX0seyAgOH19LCB7ezE3N30seyAgOH19LCB7ezExM30seyAgOH19LAote3syNDF9LHsgIDh9fSwge3sgIDl9LHsgIDh9fSwge3sxMzd9LHsgIDh9fSwge3sgNzN9LHsgIDh9fSwge3syMDF9LHsgIDh9fSwKLXt7IDQxfSx7ICA4fX0sIHt7MTY5fSx7ICA4fX0sIHt7MTA1fSx7ICA4fX0sIHt7MjMzfSx7ICA4fX0sIHt7IDI1fSx7ICA4fX0sCi17ezE1M30seyAgOH19LCB7eyA4OX0seyAgOH19LCB7ezIxN30seyAgOH19LCB7eyA1N30seyAgOH19LCB7ezE4NX0seyAgOH19LAote3sxMjF9LHsgIDh9fSwge3syNDl9LHsgIDh9fSwge3sgIDV9LHsgIDh9fSwge3sxMzN9LHsgIDh9fSwge3sgNjl9LHsgIDh9fSwKLXt7MTk3fSx7ICA4fX0sIHt7IDM3fSx7ICA4fX0sIHt7MTY1fSx7ICA4fX0sIHt7MTAxfSx7ICA4fX0sIHt7MjI5fSx7ICA4fX0sCi17eyAyMX0seyAgOH19LCB7ezE0OX0seyAgOH19LCB7eyA4NX0seyAgOH19LCB7ezIxM30seyAgOH19LCB7eyA1M30seyAgOH19LAote3sxODF9LHsgIDh9fSwge3sxMTd9LHsgIDh9fSwge3syNDV9LHsgIDh9fSwge3sgMTN9LHsgIDh9fSwge3sxNDF9LHsgIDh9fSwKLXt7IDc3fSx7ICA4fX0sIHt7MjA1fSx7ICA4fX0sIHt7IDQ1fSx7ICA4fX0sIHt7MTczfSx7ICA4fX0sIHt7MTA5fSx7ICA4fX0sCi17ezIzN30seyAgOH19LCB7eyAyOX0seyAgOH19LCB7ezE1N30seyAgOH19LCB7eyA5M30seyAgOH19LCB7ezIyMX0seyAgOH19LAote3sgNjF9LHsgIDh9fSwge3sxODl9LHsgIDh9fSwge3sxMjV9LHsgIDh9fSwge3syNTN9LHsgIDh9fSwge3sgMTl9LHsgIDl9fSwKLXt7Mjc1fSx7ICA5fX0sIHt7MTQ3fSx7ICA5fX0sIHt7NDAzfSx7ICA5fX0sIHt7IDgzfSx7ICA5fX0sIHt7MzM5fSx7ICA5fX0sCi17ezIxMX0seyAgOX19LCB7ezQ2N30seyAgOX19LCB7eyA1MX0seyAgOX19LCB7ezMwN30seyAgOX19LCB7ezE3OX0seyAgOX19LAote3s0MzV9LHsgIDl9fSwge3sxMTV9LHsgIDl9fSwge3szNzF9LHsgIDl9fSwge3syNDN9LHsgIDl9fSwge3s0OTl9LHsgIDl9fSwKLXt7IDExfSx7ICA5fX0sIHt7MjY3fSx7ICA5fX0sIHt7MTM5fSx7ICA5fX0sIHt7Mzk1fSx7ICA5fX0sIHt7IDc1fSx7ICA5fX0sCi17ezMzMX0seyAgOX19LCB7ezIwM30seyAgOX19LCB7ezQ1OX0seyAgOX19LCB7eyA0M30seyAgOX19LCB7ezI5OX0seyAgOX19LAote3sxNzF9LHsgIDl9fSwge3s0Mjd9LHsgIDl9fSwge3sxMDd9LHsgIDl9fSwge3szNjN9LHsgIDl9fSwge3syMzV9LHsgIDl9fSwKLXt7NDkxfSx7ICA5fX0sIHt7IDI3fSx7ICA5fX0sIHt7MjgzfSx7ICA5fX0sIHt7MTU1fSx7ICA5fX0sIHt7NDExfSx7ICA5fX0sCi17eyA5MX0seyAgOX19LCB7ezM0N30seyAgOX19LCB7ezIxOX0seyAgOX19LCB7ezQ3NX0seyAgOX19LCB7eyA1OX0seyAgOX19LAote3szMTV9LHsgIDl9fSwge3sxODd9LHsgIDl9fSwge3s0NDN9LHsgIDl9fSwge3sxMjN9LHsgIDl9fSwge3szNzl9LHsgIDl9fSwKLXt7MjUxfSx7ICA5fX0sIHt7NTA3fSx7ICA5fX0sIHt7ICA3fSx7ICA5fX0sIHt7MjYzfSx7ICA5fX0sIHt7MTM1fSx7ICA5fX0sCi17ezM5MX0seyAgOX19LCB7eyA3MX0seyAgOX19LCB7ezMyN30seyAgOX19LCB7ezE5OX0seyAgOX19LCB7ezQ1NX0seyAgOX19LAote3sgMzl9LHsgIDl9fSwge3syOTV9LHsgIDl9fSwge3sxNjd9LHsgIDl9fSwge3s0MjN9LHsgIDl9fSwge3sxMDN9LHsgIDl9fSwKLXt7MzU5fSx7ICA5fX0sIHt7MjMxfSx7ICA5fX0sIHt7NDg3fSx7ICA5fX0sIHt7IDIzfSx7ICA5fX0sIHt7Mjc5fSx7ICA5fX0sCi17ezE1MX0seyAgOX19LCB7ezQwN30seyAgOX19LCB7eyA4N30seyAgOX19LCB7ezM0M30seyAgOX19LCB7ezIxNX0seyAgOX19LAote3s0NzF9LHsgIDl9fSwge3sgNTV9LHsgIDl9fSwge3szMTF9LHsgIDl9fSwge3sxODN9LHsgIDl9fSwge3s0Mzl9LHsgIDl9fSwKLXt7MTE5fSx7ICA5fX0sIHt7Mzc1fSx7ICA5fX0sIHt7MjQ3fSx7ICA5fX0sIHt7NTAzfSx7ICA5fX0sIHt7IDE1fSx7ICA5fX0sCi17ezI3MX0seyAgOX19LCB7ezE0M30seyAgOX19LCB7ezM5OX0seyAgOX19LCB7eyA3OX0seyAgOX19LCB7ezMzNX0seyAgOX19LAote3syMDd9LHsgIDl9fSwge3s0NjN9LHsgIDl9fSwge3sgNDd9LHsgIDl9fSwge3szMDN9LHsgIDl9fSwge3sxNzV9LHsgIDl9fSwKLXt7NDMxfSx7ICA5fX0sIHt7MTExfSx7ICA5fX0sIHt7MzY3fSx7ICA5fX0sIHt7MjM5fSx7ICA5fX0sIHt7NDk1fSx7ICA5fX0sCi17eyAzMX0seyAgOX19LCB7ezI4N30seyAgOX19LCB7ezE1OX0seyAgOX19LCB7ezQxNX0seyAgOX19LCB7eyA5NX0seyAgOX19LAote3szNTF9LHsgIDl9fSwge3syMjN9LHsgIDl9fSwge3s0Nzl9LHsgIDl9fSwge3sgNjN9LHsgIDl9fSwge3szMTl9LHsgIDl9fSwKLXt7MTkxfSx7ICA5fX0sIHt7NDQ3fSx7ICA5fX0sIHt7MTI3fSx7ICA5fX0sIHt7MzgzfSx7ICA5fX0sIHt7MjU1fSx7ICA5fX0sCi17ezUxMX0seyAgOX19LCB7eyAgMH0seyAgN319LCB7eyA2NH0seyAgN319LCB7eyAzMn0seyAgN319LCB7eyA5Nn0seyAgN319LAote3sgMTZ9LHsgIDd9fSwge3sgODB9LHsgIDd9fSwge3sgNDh9LHsgIDd9fSwge3sxMTJ9LHsgIDd9fSwge3sgIDh9LHsgIDd9fSwKLXt7IDcyfSx7ICA3fX0sIHt7IDQwfSx7ICA3fX0sIHt7MTA0fSx7ICA3fX0sIHt7IDI0fSx7ICA3fX0sIHt7IDg4fSx7ICA3fX0sCi17eyA1Nn0seyAgN319LCB7ezEyMH0seyAgN319LCB7eyAgNH0seyAgN319LCB7eyA2OH0seyAgN319LCB7eyAzNn0seyAgN319LAote3sxMDB9LHsgIDd9fSwge3sgMjB9LHsgIDd9fSwge3sgODR9LHsgIDd9fSwge3sgNTJ9LHsgIDd9fSwge3sxMTZ9LHsgIDd9fSwKLXt7ICAzfSx7ICA4fX0sIHt7MTMxfSx7ICA4fX0sIHt7IDY3fSx7ICA4fX0sIHt7MTk1fSx7ICA4fX0sIHt7IDM1fSx7ICA4fX0sCi17ezE2M30seyAgOH19LCB7eyA5OX0seyAgOH19LCB7ezIyN30seyAgOH19Ci19OwotCi1sb2NhbCBjb25zdCBjdF9kYXRhIHN0YXRpY19kdHJlZVtEX0NPREVTXSA9IHsKLXt7IDB9LHsgNX19LCB7ezE2fSx7IDV9fSwge3sgOH0seyA1fX0sIHt7MjR9LHsgNX19LCB7eyA0fSx7IDV9fSwKLXt7MjB9LHsgNX19LCB7ezEyfSx7IDV9fSwge3syOH0seyA1fX0sIHt7IDJ9LHsgNX19LCB7ezE4fSx7IDV9fSwKLXt7MTB9LHsgNX19LCB7ezI2fSx7IDV9fSwge3sgNn0seyA1fX0sIHt7MjJ9LHsgNX19LCB7ezE0fSx7IDV9fSwKLXt7MzB9LHsgNX19LCB7eyAxfSx7IDV9fSwge3sxN30seyA1fX0sIHt7IDl9LHsgNX19LCB7ezI1fSx7IDV9fSwKLXt7IDV9LHsgNX19LCB7ezIxfSx7IDV9fSwge3sxM30seyA1fX0sIHt7Mjl9LHsgNX19LCB7eyAzfSx7IDV9fSwKLXt7MTl9LHsgNX19LCB7ezExfSx7IDV9fSwge3syN30seyA1fX0sIHt7IDd9LHsgNX19LCB7ezIzfSx7IDV9fQotfTsKLQotY29uc3QgdWNoIFpMSUJfSU5URVJOQUwgX2Rpc3RfY29kZVtESVNUX0NPREVfTEVOXSA9IHsKLSAwLCAgMSwgIDIsICAzLCAgNCwgIDQsICA1LCAgNSwgIDYsICA2LCAgNiwgIDYsICA3LCAgNywgIDcsICA3LCAgOCwgIDgsICA4LCAgOCwKLSA4LCAgOCwgIDgsICA4LCAgOSwgIDksICA5LCAgOSwgIDksICA5LCAgOSwgIDksIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwKLTEwLCAxMCwgMTAsIDEwLCAxMCwgMTAsIDEwLCAxMCwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwgMTEsIDExLCAxMSwKLTExLCAxMSwgMTEsIDExLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwKLTEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTIsIDEyLCAxMywgMTMsIDEzLCAxMywKLTEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywKLTEzLCAxMywgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLTE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLTE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwKLTE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLTE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLTE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwKLTE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAxNSwgMTUsIDE1LCAgMCwgIDAsIDE2LCAxNywKLTE4LCAxOCwgMTksIDE5LCAyMCwgMjAsIDIwLCAyMCwgMjEsIDIxLCAyMSwgMjEsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwKLTIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwKLTI0LCAyNCwgMjQsIDI0LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwKLTI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwKLTI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywKLTI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywKLTI3LCAyNywgMjcsIDI3LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwKLTI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwKLTI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwKLTI4LCAyOCwgMjgsIDI4LCAyOCwgMjgsIDI4LCAyOCwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwKLTI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwKLTI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwKLTI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjksIDI5LCAyOSwgMjkKLX07Ci0KLWNvbnN0IHVjaCBaTElCX0lOVEVSTkFMIF9sZW5ndGhfY29kZVtNQVhfTUFUQ0gtTUlOX01BVENIKzFdPSB7Ci0gMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOCwgIDksICA5LCAxMCwgMTAsIDExLCAxMSwgMTIsIDEyLCAxMiwgMTIsCi0xMywgMTMsIDEzLCAxMywgMTQsIDE0LCAxNCwgMTQsIDE1LCAxNSwgMTUsIDE1LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsCi0xNywgMTcsIDE3LCAxNywgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTgsIDE4LCAxOCwgMTksIDE5LCAxOSwgMTksCi0xOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsIDIwLCAyMCwgMjAsCi0yMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjEsIDIxLCAyMSwgMjIsIDIyLCAyMiwgMjIsCi0yMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMiwgMjIsIDIyLCAyMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsCi0yMywgMjMsIDIzLCAyMywgMjMsIDIzLCAyMywgMjMsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsCi0yNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsIDI0LCAyNCwgMjQsCi0yNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsCi0yNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNSwgMjUsIDI1LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsCi0yNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsIDI2LCAyNiwgMjYsCi0yNiwgMjYsIDI2LCAyNiwgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsCi0yNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyNywgMjcsIDI3LCAyOAotfTsKLQotbG9jYWwgY29uc3QgaW50IGJhc2VfbGVuZ3RoW0xFTkdUSF9DT0RFU10gPSB7Ci0wLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCAxMCwgMTIsIDE0LCAxNiwgMjAsIDI0LCAyOCwgMzIsIDQwLCA0OCwgNTYsCi02NCwgODAsIDk2LCAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMAotfTsKLQotbG9jYWwgY29uc3QgaW50IGJhc2VfZGlzdFtEX0NPREVTXSA9IHsKLSAgICAwLCAgICAgMSwgICAgIDIsICAgICAzLCAgICAgNCwgICAgIDYsICAgICA4LCAgICAxMiwgICAgMTYsICAgIDI0LAotICAgMzIsICAgIDQ4LCAgICA2NCwgICAgOTYsICAgMTI4LCAgIDE5MiwgICAyNTYsICAgMzg0LCAgIDUxMiwgICA3NjgsCi0gMTAyNCwgIDE1MzYsICAyMDQ4LCAgMzA3MiwgIDQwOTYsICA2MTQ0LCAgODE5MiwgMTIyODgsIDE2Mzg0LCAyNDU3NgotfTsKLQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvemxpYl92MTI4L3VuY29tcHIuYyBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC91bmNvbXByLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzY2I4ZmUuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvemxpYl92MTI4L3VuY29tcHIuYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qIHVuY29tcHIuYyAtLSBkZWNvbXByZXNzIGEgbWVtb3J5IGJ1ZmZlcgotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDMsIDIwMTAgSmVhbi1sb3VwIEdhaWxseS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBAKCMpICRJZCQgKi8KLQotI2RlZmluZSBaTElCX0lOVEVSTkFMCi0jaW5jbHVkZSAiemxpYi5oIgotCi0vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAgRGVjb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gIHNvdXJjZUxlbiBpcwotICAgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiBVcG9uIGVudHJ5LCBkZXN0TGVuIGlzIHRoZSB0b3RhbAotICAgc2l6ZSBvZiB0aGUgZGVzdGluYXRpb24gYnVmZmVyLCB3aGljaCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIHRoZQotICAgZW50aXJlIHVuY29tcHJlc3NlZCBkYXRhLiAoVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG11c3QgaGF2ZQotICAgYmVlbiBzYXZlZCBwcmV2aW91c2x5IGJ5IHRoZSBjb21wcmVzc29yIGFuZCB0cmFuc21pdHRlZCB0byB0aGUgZGVjb21wcmVzc29yCi0gICBieSBzb21lIG1lY2hhbmlzbSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIGNvbXByZXNzaW9uIGxpYnJhcnkuKQotICAgVXBvbiBleGl0LCBkZXN0TGVuIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgY29tcHJlc3NlZCBidWZmZXIuCi0KLSAgICAgdW5jb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAotICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0Ci0gICBidWZmZXIsIG9yIFpfREFUQV9FUlJPUiBpZiB0aGUgaW5wdXQgZGF0YSB3YXMgY29ycnVwdGVkLgotKi8KLWludCBaRVhQT1JUIHVuY29tcHJlc3MgKAotICAgIEJ5dGVmICpkZXN0LAotICAgIHVMb25nZiAqZGVzdExlbiwKLSAgICBjb25zdCBCeXRlZiAqc291cmNlLAotICAgIHVMb25nIHNvdXJjZUxlbikKLXsKLSAgICB6X3N0cmVhbSBzdHJlYW07Ci0gICAgaW50IGVycjsKLQotICAgIHN0cmVhbS5uZXh0X2luID0gKHpfY29uc3QgQnl0ZWYgKilzb3VyY2U7Ci0gICAgc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpc291cmNlTGVuOwotICAgIC8qIENoZWNrIGZvciBzb3VyY2UgPiA2NEsgb24gMTYtYml0IG1hY2hpbmU6ICovCi0gICAgaWYgKCh1TG9uZylzdHJlYW0uYXZhaWxfaW4gIT0gc291cmNlTGVuKSByZXR1cm4gWl9CVUZfRVJST1I7Ci0KLSAgICBzdHJlYW0ubmV4dF9vdXQgPSBkZXN0OwotICAgIHN0cmVhbS5hdmFpbF9vdXQgPSAodUludCkqZGVzdExlbjsKLSAgICBpZiAoKHVMb25nKXN0cmVhbS5hdmFpbF9vdXQgIT0gKmRlc3RMZW4pIHJldHVybiBaX0JVRl9FUlJPUjsKLQotICAgIHN0cmVhbS56YWxsb2MgPSAoYWxsb2NfZnVuYykwOwotICAgIHN0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpMDsKLQotICAgIGVyciA9IGluZmxhdGVJbml0KCZzdHJlYW0pOwotICAgIGlmIChlcnIgIT0gWl9PSykgcmV0dXJuIGVycjsKLQotICAgIGVyciA9IGluZmxhdGUoJnN0cmVhbSwgWl9GSU5JU0gpOwotICAgIGlmIChlcnIgIT0gWl9TVFJFQU1fRU5EKSB7Ci0gICAgICAgIGluZmxhdGVFbmQoJnN0cmVhbSk7Ci0gICAgICAgIGlmIChlcnIgPT0gWl9ORUVEX0RJQ1QgfHwgKGVyciA9PSBaX0JVRl9FUlJPUiAmJiBzdHJlYW0uYXZhaWxfaW4gPT0gMCkpCi0gICAgICAgICAgICByZXR1cm4gWl9EQVRBX0VSUk9SOwotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICAqZGVzdExlbiA9IHN0cmVhbS50b3RhbF9vdXQ7Ci0KLSAgICBlcnIgPSBpbmZsYXRlRW5kKCZzdHJlYW0pOwotICAgIHJldHVybiBlcnI7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS96bGliX3YxMjgvemNvbmYuaCBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC96Y29uZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzA4YTM3Li4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3psaWJfdjEyOC96Y29uZi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTE5ICswLDAgQEAKLS8qIHpjb25mLmggLS0gY29uZmlndXJhdGlvbiBvZiB0aGUgemxpYiBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5LgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIEAoIykgJElkJCAqLwotCi0jaWZuZGVmIFpDT05GX0gKLSNkZWZpbmUgWkNPTkZfSAotCi0vKgotICogSWYgeW91ICpyZWFsbHkqIG5lZWQgYSB1bmlxdWUgcHJlZml4IGZvciBhbGwgdHlwZXMgYW5kIGxpYnJhcnkgZnVuY3Rpb25zLAotICogY29tcGlsZSB3aXRoIC1EWl9QUkVGSVguIFRoZSAic3RhbmRhcmQiIHpsaWIgc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGhvdXQgaXQuCi0gKiBFdmVuIGJldHRlciB0aGFuIGNvbXBpbGluZyB3aXRoIC1EWl9QUkVGSVggd291bGQgYmUgdG8gdXNlIGNvbmZpZ3VyZSB0byBzZXQKLSAqIHRoaXMgcGVybWFuZW50bHkgaW4gemNvbmYuaCB1c2luZyAiLi9jb25maWd1cmUgLS16cHJlZml4Ii4KLSAqLwotI2lmZGVmIFpfUFJFRklYICAgICAvKiBtYXkgYmUgc2V0IHRvICNpZiAxIGJ5IC4vY29uZmlndXJlICovCi0jICBkZWZpbmUgWl9QUkVGSVhfU0VUCi0KLS8qIGFsbCBsaW5rZWQgc3ltYm9scyAqLwotIyAgZGVmaW5lIF9kaXN0X2NvZGUgICAgICAgICAgICB6X19kaXN0X2NvZGUKLSMgIGRlZmluZSBfbGVuZ3RoX2NvZGUgICAgICAgICAgel9fbGVuZ3RoX2NvZGUKLSMgIGRlZmluZSBfdHJfYWxpZ24gICAgICAgICAgICAgel9fdHJfYWxpZ24KLSMgIGRlZmluZSBfdHJfZmx1c2hfYml0cyAgICAgICAgel9fdHJfZmx1c2hfYml0cwotIyAgZGVmaW5lIF90cl9mbHVzaF9ibG9jayAgICAgICB6X190cl9mbHVzaF9ibG9jawotIyAgZGVmaW5lIF90cl9pbml0ICAgICAgICAgICAgICB6X190cl9pbml0Ci0jICBkZWZpbmUgX3RyX3N0b3JlZF9ibG9jayAgICAgIHpfX3RyX3N0b3JlZF9ibG9jawotIyAgZGVmaW5lIF90cl90YWxseSAgICAgICAgICAgICB6X190cl90YWxseQotIyAgZGVmaW5lIGFkbGVyMzIgICAgICAgICAgICAgICB6X2FkbGVyMzIKLSMgIGRlZmluZSBhZGxlcjMyX2NvbWJpbmUgICAgICAgel9hZGxlcjMyX2NvbWJpbmUKLSMgIGRlZmluZSBhZGxlcjMyX2NvbWJpbmU2NCAgICAgel9hZGxlcjMyX2NvbWJpbmU2NAotIyAgaWZuZGVmIFpfU09MTwotIyAgICBkZWZpbmUgY29tcHJlc3MgICAgICAgICAgICAgIHpfY29tcHJlc3MKLSMgICAgZGVmaW5lIGNvbXByZXNzMiAgICAgICAgICAgICB6X2NvbXByZXNzMgotIyAgICBkZWZpbmUgY29tcHJlc3NCb3VuZCAgICAgICAgIHpfY29tcHJlc3NCb3VuZAotIyAgZW5kaWYKLSMgIGRlZmluZSBjcmMzMiAgICAgICAgICAgICAgICAgel9jcmMzMgotIyAgZGVmaW5lIGNyYzMyX2NvbWJpbmUgICAgICAgICB6X2NyYzMyX2NvbWJpbmUKLSMgIGRlZmluZSBjcmMzMl9jb21iaW5lNjQgICAgICAgel9jcmMzMl9jb21iaW5lNjQKLSMgIGRlZmluZSBkZWZsYXRlICAgICAgICAgICAgICAgel9kZWZsYXRlCi0jICBkZWZpbmUgZGVmbGF0ZUJvdW5kICAgICAgICAgIHpfZGVmbGF0ZUJvdW5kCi0jICBkZWZpbmUgZGVmbGF0ZUNvcHkgICAgICAgICAgIHpfZGVmbGF0ZUNvcHkKLSMgIGRlZmluZSBkZWZsYXRlRW5kICAgICAgICAgICAgel9kZWZsYXRlRW5kCi0jICBkZWZpbmUgZGVmbGF0ZUluaXQyXyAgICAgICAgIHpfZGVmbGF0ZUluaXQyXwotIyAgZGVmaW5lIGRlZmxhdGVJbml0XyAgICAgICAgICB6X2RlZmxhdGVJbml0XwotIyAgZGVmaW5lIGRlZmxhdGVQYXJhbXMgICAgICAgICB6X2RlZmxhdGVQYXJhbXMKLSMgIGRlZmluZSBkZWZsYXRlUGVuZGluZyAgICAgICAgel9kZWZsYXRlUGVuZGluZwotIyAgZGVmaW5lIGRlZmxhdGVQcmltZSAgICAgICAgICB6X2RlZmxhdGVQcmltZQotIyAgZGVmaW5lIGRlZmxhdGVSZXNldCAgICAgICAgICB6X2RlZmxhdGVSZXNldAotIyAgZGVmaW5lIGRlZmxhdGVSZXNldEtlZXAgICAgICB6X2RlZmxhdGVSZXNldEtlZXAKLSMgIGRlZmluZSBkZWZsYXRlU2V0RGljdGlvbmFyeSAgel9kZWZsYXRlU2V0RGljdGlvbmFyeQotIyAgZGVmaW5lIGRlZmxhdGVTZXRIZWFkZXIgICAgICB6X2RlZmxhdGVTZXRIZWFkZXIKLSMgIGRlZmluZSBkZWZsYXRlVHVuZSAgICAgICAgICAgel9kZWZsYXRlVHVuZQotIyAgZGVmaW5lIGRlZmxhdGVfY29weXJpZ2h0ICAgICB6X2RlZmxhdGVfY29weXJpZ2h0Ci0jICBkZWZpbmUgZ2V0X2NyY190YWJsZSAgICAgICAgIHpfZ2V0X2NyY190YWJsZQotIyAgaWZuZGVmIFpfU09MTwotIyAgICBkZWZpbmUgZ3pfZXJyb3IgICAgICAgICAgICAgIHpfZ3pfZXJyb3IKLSMgICAgZGVmaW5lIGd6X2ludG1heCAgICAgICAgICAgICB6X2d6X2ludG1heAotIyAgICBkZWZpbmUgZ3pfc3Ryd2luZXJyb3IgICAgICAgIHpfZ3pfc3Ryd2luZXJyb3IKLSMgICAgZGVmaW5lIGd6YnVmZmVyICAgICAgICAgICAgICB6X2d6YnVmZmVyCi0jICAgIGRlZmluZSBnemNsZWFyZXJyICAgICAgICAgICAgel9nemNsZWFyZXJyCi0jICAgIGRlZmluZSBnemNsb3NlICAgICAgICAgICAgICAgel9nemNsb3NlCi0jICAgIGRlZmluZSBnemNsb3NlX3IgICAgICAgICAgICAgel9nemNsb3NlX3IKLSMgICAgZGVmaW5lIGd6Y2xvc2VfdyAgICAgICAgICAgICB6X2d6Y2xvc2VfdwotIyAgICBkZWZpbmUgZ3pkaXJlY3QgICAgICAgICAgICAgIHpfZ3pkaXJlY3QKLSMgICAgZGVmaW5lIGd6ZG9wZW4gICAgICAgICAgICAgICB6X2d6ZG9wZW4KLSMgICAgZGVmaW5lIGd6ZW9mICAgICAgICAgICAgICAgICB6X2d6ZW9mCi0jICAgIGRlZmluZSBnemVycm9yICAgICAgICAgICAgICAgel9nemVycm9yCi0jICAgIGRlZmluZSBnemZsdXNoICAgICAgICAgICAgICAgel9nemZsdXNoCi0jICAgIGRlZmluZSBnemdldGMgICAgICAgICAgICAgICAgel9nemdldGMKLSMgICAgZGVmaW5lIGd6Z2V0Y18gICAgICAgICAgICAgICB6X2d6Z2V0Y18KLSMgICAgZGVmaW5lIGd6Z2V0cyAgICAgICAgICAgICAgICB6X2d6Z2V0cwotIyAgICBkZWZpbmUgZ3pvZmZzZXQgICAgICAgICAgICAgIHpfZ3pvZmZzZXQKLSMgICAgZGVmaW5lIGd6b2Zmc2V0NjQgICAgICAgICAgICB6X2d6b2Zmc2V0NjQKLSMgICAgZGVmaW5lIGd6b3BlbiAgICAgICAgICAgICAgICB6X2d6b3BlbgotIyAgICBkZWZpbmUgZ3pvcGVuNjQgICAgICAgICAgICAgIHpfZ3pvcGVuNjQKLSMgICAgaWZkZWYgX1dJTjMyCi0jICAgICAgZGVmaW5lIGd6b3Blbl93ICAgICAgICAgICAgICB6X2d6b3Blbl93Ci0jICAgIGVuZGlmCi0jICAgIGRlZmluZSBnenByaW50ZiAgICAgICAgICAgICAgel9nenByaW50ZgotIyAgICBkZWZpbmUgZ3p2cHJpbnRmICAgICAgICAgICAgIHpfZ3p2cHJpbnRmCi0jICAgIGRlZmluZSBnenB1dGMgICAgICAgICAgICAgICAgel9nenB1dGMKLSMgICAgZGVmaW5lIGd6cHV0cyAgICAgICAgICAgICAgICB6X2d6cHV0cwotIyAgICBkZWZpbmUgZ3pyZWFkICAgICAgICAgICAgICAgIHpfZ3pyZWFkCi0jICAgIGRlZmluZSBnenJld2luZCAgICAgICAgICAgICAgel9nenJld2luZAotIyAgICBkZWZpbmUgZ3pzZWVrICAgICAgICAgICAgICAgIHpfZ3pzZWVrCi0jICAgIGRlZmluZSBnenNlZWs2NCAgICAgICAgICAgICAgel9nenNlZWs2NAotIyAgICBkZWZpbmUgZ3pzZXRwYXJhbXMgICAgICAgICAgIHpfZ3pzZXRwYXJhbXMKLSMgICAgZGVmaW5lIGd6dGVsbCAgICAgICAgICAgICAgICB6X2d6dGVsbAotIyAgICBkZWZpbmUgZ3p0ZWxsNjQgICAgICAgICAgICAgIHpfZ3p0ZWxsNjQKLSMgICAgZGVmaW5lIGd6dW5nZXRjICAgICAgICAgICAgICB6X2d6dW5nZXRjCi0jICAgIGRlZmluZSBnendyaXRlICAgICAgICAgICAgICAgel9nendyaXRlCi0jICBlbmRpZgotIyAgZGVmaW5lIGluZmxhdGUgICAgICAgICAgICAgICB6X2luZmxhdGUKLSMgIGRlZmluZSBpbmZsYXRlQmFjayAgICAgICAgICAgel9pbmZsYXRlQmFjawotIyAgZGVmaW5lIGluZmxhdGVCYWNrRW5kICAgICAgICB6X2luZmxhdGVCYWNrRW5kCi0jICBkZWZpbmUgaW5mbGF0ZUJhY2tJbml0XyAgICAgIHpfaW5mbGF0ZUJhY2tJbml0XwotIyAgZGVmaW5lIGluZmxhdGVDb3B5ICAgICAgICAgICB6X2luZmxhdGVDb3B5Ci0jICBkZWZpbmUgaW5mbGF0ZUVuZCAgICAgICAgICAgIHpfaW5mbGF0ZUVuZAotIyAgZGVmaW5lIGluZmxhdGVHZXRIZWFkZXIgICAgICB6X2luZmxhdGVHZXRIZWFkZXIKLSMgIGRlZmluZSBpbmZsYXRlSW5pdDJfICAgICAgICAgel9pbmZsYXRlSW5pdDJfCi0jICBkZWZpbmUgaW5mbGF0ZUluaXRfICAgICAgICAgIHpfaW5mbGF0ZUluaXRfCi0jICBkZWZpbmUgaW5mbGF0ZU1hcmsgICAgICAgICAgIHpfaW5mbGF0ZU1hcmsKLSMgIGRlZmluZSBpbmZsYXRlUHJpbWUgICAgICAgICAgel9pbmZsYXRlUHJpbWUKLSMgIGRlZmluZSBpbmZsYXRlUmVzZXQgICAgICAgICAgel9pbmZsYXRlUmVzZXQKLSMgIGRlZmluZSBpbmZsYXRlUmVzZXQyICAgICAgICAgel9pbmZsYXRlUmVzZXQyCi0jICBkZWZpbmUgaW5mbGF0ZVNldERpY3Rpb25hcnkgIHpfaW5mbGF0ZVNldERpY3Rpb25hcnkKLSMgIGRlZmluZSBpbmZsYXRlR2V0RGljdGlvbmFyeSAgel9pbmZsYXRlR2V0RGljdGlvbmFyeQotIyAgZGVmaW5lIGluZmxhdGVTeW5jICAgICAgICAgICB6X2luZmxhdGVTeW5jCi0jICBkZWZpbmUgaW5mbGF0ZVN5bmNQb2ludCAgICAgIHpfaW5mbGF0ZVN5bmNQb2ludAotIyAgZGVmaW5lIGluZmxhdGVVbmRlcm1pbmUgICAgICB6X2luZmxhdGVVbmRlcm1pbmUKLSMgIGRlZmluZSBpbmZsYXRlUmVzZXRLZWVwICAgICAgel9pbmZsYXRlUmVzZXRLZWVwCi0jICBkZWZpbmUgaW5mbGF0ZV9jb3B5cmlnaHQgICAgIHpfaW5mbGF0ZV9jb3B5cmlnaHQKLSMgIGRlZmluZSBpbmZsYXRlX2Zhc3QgICAgICAgICAgel9pbmZsYXRlX2Zhc3QKLSMgIGRlZmluZSBpbmZsYXRlX3RhYmxlICAgICAgICAgel9pbmZsYXRlX3RhYmxlCi0jICBpZm5kZWYgWl9TT0xPCi0jICAgIGRlZmluZSB1bmNvbXByZXNzICAgICAgICAgICAgel91bmNvbXByZXNzCi0jICBlbmRpZgotIyAgZGVmaW5lIHpFcnJvciAgICAgICAgICAgICAgICB6X3pFcnJvcgotIyAgaWZuZGVmIFpfU09MTwotIyAgICBkZWZpbmUgemNhbGxvYyAgICAgICAgICAgICAgIHpfemNhbGxvYwotIyAgICBkZWZpbmUgemNmcmVlICAgICAgICAgICAgICAgIHpfemNmcmVlCi0jICBlbmRpZgotIyAgZGVmaW5lIHpsaWJDb21waWxlRmxhZ3MgICAgICB6X3psaWJDb21waWxlRmxhZ3MKLSMgIGRlZmluZSB6bGliVmVyc2lvbiAgICAgICAgICAgel96bGliVmVyc2lvbgotCi0vKiBhbGwgemxpYiB0eXBlZGVmcyBpbiB6bGliLmggYW5kIHpjb25mLmggKi8KLSMgIGRlZmluZSBCeXRlICAgICAgICAgICAgICAgICAgel9CeXRlCi0jICBkZWZpbmUgQnl0ZWYgICAgICAgICAgICAgICAgIHpfQnl0ZWYKLSMgIGRlZmluZSBhbGxvY19mdW5jICAgICAgICAgICAgel9hbGxvY19mdW5jCi0jICBkZWZpbmUgY2hhcmYgICAgICAgICAgICAgICAgIHpfY2hhcmYKLSMgIGRlZmluZSBmcmVlX2Z1bmMgICAgICAgICAgICAgel9mcmVlX2Z1bmMKLSMgIGlmbmRlZiBaX1NPTE8KLSMgICAgZGVmaW5lIGd6RmlsZSAgICAgICAgICAgICAgICB6X2d6RmlsZQotIyAgZW5kaWYKLSMgIGRlZmluZSBnel9oZWFkZXIgICAgICAgICAgICAgel9nel9oZWFkZXIKLSMgIGRlZmluZSBnel9oZWFkZXJwICAgICAgICAgICAgel9nel9oZWFkZXJwCi0jICBkZWZpbmUgaW5fZnVuYyAgICAgICAgICAgICAgIHpfaW5fZnVuYwotIyAgZGVmaW5lIGludGYgICAgICAgICAgICAgICAgICB6X2ludGYKLSMgIGRlZmluZSBvdXRfZnVuYyAgICAgICAgICAgICAgel9vdXRfZnVuYwotIyAgZGVmaW5lIHVJbnQgICAgICAgICAgICAgICAgICB6X3VJbnQKLSMgIGRlZmluZSB1SW50ZiAgICAgICAgICAgICAgICAgel91SW50ZgotIyAgZGVmaW5lIHVMb25nICAgICAgICAgICAgICAgICB6X3VMb25nCi0jICBkZWZpbmUgdUxvbmdmICAgICAgICAgICAgICAgIHpfdUxvbmdmCi0jICBkZWZpbmUgdm9pZHAgICAgICAgICAgICAgICAgIHpfdm9pZHAKLSMgIGRlZmluZSB2b2lkcGMgICAgICAgICAgICAgICAgel92b2lkcGMKLSMgIGRlZmluZSB2b2lkcGYgICAgICAgICAgICAgICAgel92b2lkcGYKLQotLyogYWxsIHpsaWIgc3RydWN0cyBpbiB6bGliLmggYW5kIHpjb25mLmggKi8KLSMgIGRlZmluZSBnel9oZWFkZXJfcyAgICAgICAgICAgel9nel9oZWFkZXJfcwotIyAgZGVmaW5lIGludGVybmFsX3N0YXRlICAgICAgICB6X2ludGVybmFsX3N0YXRlCi0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX01TRE9TX18pICYmICFkZWZpbmVkKE1TRE9TKQotIyAgZGVmaW5lIE1TRE9TCi0jZW5kaWYKLSNpZiAoZGVmaW5lZChPU18yKSB8fCBkZWZpbmVkKF9fT1MyX18pKSAmJiAhZGVmaW5lZChPUzIpCi0jICBkZWZpbmUgT1MyCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9XSU5ET1dTKSAmJiAhZGVmaW5lZChXSU5ET1dTKQotIyAgZGVmaW5lIFdJTkRPV1MKLSNlbmRpZgotI2lmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9XSU4zMl9XQ0UpIHx8IGRlZmluZWQoX19XSU4zMl9fKQotIyAgaWZuZGVmIFdJTjMyCi0jICAgIGRlZmluZSBXSU4zMgotIyAgZW5kaWYKLSNlbmRpZgotI2lmIChkZWZpbmVkKE1TRE9TKSB8fCBkZWZpbmVkKE9TMikgfHwgZGVmaW5lZChXSU5ET1dTKSkgJiYgIWRlZmluZWQoV0lOMzIpCi0jICBpZiAhZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19GTEFUX18pICYmICFkZWZpbmVkKF9fMzg2X18pCi0jICAgIGlmbmRlZiBTWVMxNkJJVAotIyAgICAgIGRlZmluZSBTWVMxNkJJVAotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0vKgotICogQ29tcGlsZSB3aXRoIC1ETUFYU0VHXzY0SyBpZiB0aGUgYWxsb2MgZnVuY3Rpb24gY2Fubm90IGFsbG9jYXRlIG1vcmUKLSAqIHRoYW4gNjRrIGJ5dGVzIGF0IGEgdGltZSAobmVlZGVkIG9uIHN5c3RlbXMgd2l0aCAxNi1iaXQgaW50KS4KLSAqLwotI2lmZGVmIFNZUzE2QklUCi0jICBkZWZpbmUgTUFYU0VHXzY0SwotI2VuZGlmCi0jaWZkZWYgTVNET1MKLSMgIGRlZmluZSBVTkFMSUdORURfT0sKLSNlbmRpZgotCi0jaWZkZWYgX19TVERDX1ZFUlNJT05fXwotIyAgaWZuZGVmIFNUREMKLSMgICAgZGVmaW5lIFNUREMKLSMgIGVuZGlmCi0jICBpZiBfX1NURENfVkVSU0lPTl9fID49IDE5OTkwMUwKLSMgICAgaWZuZGVmIFNUREM5OQotIyAgICAgIGRlZmluZSBTVERDOTkKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChfX1NURENfXykgfHwgZGVmaW5lZChfX2NwbHVzcGx1cykpCi0jICBkZWZpbmUgU1REQwotI2VuZGlmCi0jaWYgIWRlZmluZWQoU1REQykgJiYgKGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKSkKLSMgIGRlZmluZSBTVERDCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChNU0RPUykgfHwgZGVmaW5lZChXSU5ET1dTKSB8fCBkZWZpbmVkKFdJTjMyKSkKLSMgIGRlZmluZSBTVERDCi0jZW5kaWYKLSNpZiAhZGVmaW5lZChTVERDKSAmJiAoZGVmaW5lZChPUzIpIHx8IGRlZmluZWQoX19IT1NfQUlYX18pKQotIyAgZGVmaW5lIFNUREMKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX09TNDAwX18pICYmICFkZWZpbmVkKFNUREMpICAgIC8qIGlTZXJpZXMgKGZvcm1lcmx5IEFTLzQwMCkuICovCi0jICBkZWZpbmUgU1REQwotI2VuZGlmCi0KLSNpZm5kZWYgU1REQwotIyAgaWZuZGVmIGNvbnN0IC8qIGNhbm5vdCB1c2UgIWRlZmluZWQoU1REQykgJiYgIWRlZmluZWQoY29uc3QpIG9uIE1hYyAqLwotIyAgICBkZWZpbmUgY29uc3QgICAgICAgLyogbm90ZTogbmVlZCBhIG1vcmUgZ2VudGxlIHNvbHV0aW9uIGhlcmUgKi8KLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoWkxJQl9DT05TVCkgJiYgIWRlZmluZWQoel9jb25zdCkKLSMgIGRlZmluZSB6X2NvbnN0IGNvbnN0Ci0jZWxzZQotIyAgZGVmaW5lIHpfY29uc3QKLSNlbmRpZgotCi0vKiBTb21lIE1hYyBjb21waWxlcnMgbWVyZ2UgYWxsIC5oIGZpbGVzIGluY29ycmVjdGx5OiAqLwotI2lmIGRlZmluZWQoX19NV0VSS1NfXyl8fGRlZmluZWQoYXBwbGVjKXx8ZGVmaW5lZChUSElOS19DKXx8ZGVmaW5lZChfX1NDX18pCi0jICBkZWZpbmUgTk9fRFVNTVlfREVDTAotI2VuZGlmCi0KLS8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqLwotI2lmbmRlZiBNQVhfTUVNX0xFVkVMCi0jICBpZmRlZiBNQVhTRUdfNjRLCi0jICAgIGRlZmluZSBNQVhfTUVNX0xFVkVMIDgKLSMgIGVsc2UKLSMgICAgZGVmaW5lIE1BWF9NRU1fTEVWRUwgOQotIyAgZW5kaWYKLSNlbmRpZgotCi0vKiBNYXhpbXVtIHZhbHVlIGZvciB3aW5kb3dCaXRzIGluIGRlZmxhdGVJbml0MiBhbmQgaW5mbGF0ZUluaXQyLgotICogV0FSTklORzogcmVkdWNpbmcgTUFYX1dCSVRTIG1ha2VzIG1pbmlnemlwIHVuYWJsZSB0byBleHRyYWN0IC5neiBmaWxlcwotICogY3JlYXRlZCBieSBnemlwLiAoRmlsZXMgY3JlYXRlZCBieSBtaW5pZ3ppcCBjYW4gc3RpbGwgYmUgZXh0cmFjdGVkIGJ5Ci0gKiBnemlwLikKLSAqLwotI2lmbmRlZiBNQVhfV0JJVFMKLSMgIGRlZmluZSBNQVhfV0JJVFMgICAxNSAvKiAzMksgTFo3NyB3aW5kb3cgKi8KLSNlbmRpZgotCi0vKiBUaGUgbWVtb3J5IHJlcXVpcmVtZW50cyBmb3IgZGVmbGF0ZSBhcmUgKGluIGJ5dGVzKToKLSAgICAgICAgICAgICgxIDw8ICh3aW5kb3dCaXRzKzIpKSArICAoMSA8PCAobWVtTGV2ZWwrOSkpCi0gdGhhdCBpczogMTI4SyBmb3Igd2luZG93Qml0cz0xNSAgKyAgMTI4SyBmb3IgbWVtTGV2ZWwgPSA4ICAoZGVmYXVsdCB2YWx1ZXMpCi0gcGx1cyBhIGZldyBraWxvYnl0ZXMgZm9yIHNtYWxsIG9iamVjdHMuIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byByZWR1Y2UKLSB0aGUgZGVmYXVsdCBtZW1vcnkgcmVxdWlyZW1lbnRzIGZyb20gMjU2SyB0byAxMjhLLCBjb21waWxlIHdpdGgKLSAgICAgbWFrZSBDRkxBR1M9Ii1PIC1ETUFYX1dCSVRTPTE0IC1ETUFYX01FTV9MRVZFTD03IgotIE9mIGNvdXJzZSB0aGlzIHdpbGwgZ2VuZXJhbGx5IGRlZ3JhZGUgY29tcHJlc3Npb24gKHRoZXJlJ3Mgbm8gZnJlZSBsdW5jaCkuCi0KLSAgIFRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGZvciBpbmZsYXRlIGFyZSAoaW4gYnl0ZXMpIDEgPDwgd2luZG93Qml0cwotIHRoYXQgaXMsIDMySyBmb3Igd2luZG93Qml0cz0xNSAoZGVmYXVsdCB2YWx1ZSkgcGx1cyBhIGZldyBraWxvYnl0ZXMKLSBmb3Igc21hbGwgb2JqZWN0cy4KLSovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFR5cGUgZGVjbGFyYXRpb25zICovCi0KLSNpZm5kZWYgT0YgLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLwotIyAgaWZkZWYgU1REQwotIyAgICBkZWZpbmUgT0YoYXJncykgIGFyZ3MKLSMgIGVsc2UKLSMgICAgZGVmaW5lIE9GKGFyZ3MpICAoKQotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIFpfQVJHIC8qIGZ1bmN0aW9uIHByb3RvdHlwZXMgZm9yIHN0ZGFyZyAqLwotIyAgaWYgZGVmaW5lZChTVERDKSB8fCBkZWZpbmVkKFpfSEFWRV9TVERBUkdfSCkKLSMgICAgZGVmaW5lIFpfQVJHKGFyZ3MpICBhcmdzCi0jICBlbHNlCi0jICAgIGRlZmluZSBaX0FSRyhhcmdzKSAgKCkKLSMgIGVuZGlmCi0jZW5kaWYKLQotLyogVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBmb3IgRkFSIGFyZSBuZWVkZWQgb25seSBmb3IgTVNET1MgbWl4ZWQKLSAqIG1vZGVsIHByb2dyYW1taW5nIChzbWFsbCBvciBtZWRpdW0gbW9kZWwgd2l0aCBzb21lIGZhciBhbGxvY2F0aW9ucykuCi0gKiBUaGlzIHdhcyB0ZXN0ZWQgb25seSB3aXRoIE1TQzsgZm9yIG90aGVyIE1TRE9TIGNvbXBpbGVycyB5b3UgbWF5IGhhdmUKLSAqIHRvIGRlZmluZSBOT19NRU1DUFkgaW4genV0aWwuaC4gIElmIHlvdSBkb24ndCBuZWVkIHRoZSBtaXhlZCBtb2RlbCwKLSAqIGp1c3QgZGVmaW5lIEZBUiB0byBiZSBlbXB0eS4KLSAqLwotI2lmZGVmIFNZUzE2QklUCi0jICBpZiBkZWZpbmVkKE1fSTg2U00pIHx8IGRlZmluZWQoTV9JODZNTSkKLSAgICAgLyogTVNDIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLwotIyAgICBkZWZpbmUgU01BTExfTUVESVVNCi0jICAgIGlmZGVmIF9NU0NfVkVSCi0jICAgICAgZGVmaW5lIEZBUiBfZmFyCi0jICAgIGVsc2UKLSMgICAgICBkZWZpbmUgRkFSIGZhcgotIyAgICBlbmRpZgotIyAgZW5kaWYKLSMgIGlmIChkZWZpbmVkKF9fU01BTExfXykgfHwgZGVmaW5lZChfX01FRElVTV9fKSkKLSAgICAgLyogVHVyYm8gQyBzbWFsbCBvciBtZWRpdW0gbW9kZWwgKi8KLSMgICAgZGVmaW5lIFNNQUxMX01FRElVTQotIyAgICBpZmRlZiBfX0JPUkxBTkRDX18KLSMgICAgICBkZWZpbmUgRkFSIF9mYXIKLSMgICAgZWxzZQotIyAgICAgIGRlZmluZSBGQVIgZmFyCi0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFdJTkRPV1MpIHx8IGRlZmluZWQoV0lOMzIpCi0gICAvKiBJZiBidWlsZGluZyBvciB1c2luZyB6bGliIGFzIGEgRExMLCBkZWZpbmUgWkxJQl9ETEwuCi0gICAgKiBUaGlzIGlzIG5vdCBtYW5kYXRvcnksIGJ1dCBpdCBvZmZlcnMgYSBsaXR0bGUgcGVyZm9ybWFuY2UgaW5jcmVhc2UuCi0gICAgKi8KLSMgIGlmZGVmIFpMSUJfRExMCi0jICAgIGlmIGRlZmluZWQoV0lOMzIpICYmICghZGVmaW5lZChfX0JPUkxBTkRDX18pIHx8IChfX0JPUkxBTkRDX18gPj0gMHg1MDApKQotIyAgICAgIGlmZGVmIFpMSUJfSU5URVJOQUwKLSMgICAgICAgIGRlZmluZSBaRVhURVJOIGV4dGVybiBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSMgICAgICBlbHNlCi0jICAgICAgICBkZWZpbmUgWkVYVEVSTiBleHRlcm4gX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0jICAgICAgZW5kaWYKLSMgICAgZW5kaWYKLSMgIGVuZGlmICAvKiBaTElCX0RMTCAqLwotICAgLyogSWYgYnVpbGRpbmcgb3IgdXNpbmcgemxpYiB3aXRoIHRoZSBXSU5BUEkvV0lOQVBJViBjYWxsaW5nIGNvbnZlbnRpb24sCi0gICAgKiBkZWZpbmUgWkxJQl9XSU5BUEkuCi0gICAgKiBDYXV0aW9uOiB0aGUgc3RhbmRhcmQgWkxJQjEuRExMIGlzIE5PVCBjb21waWxlZCB1c2luZyBaTElCX1dJTkFQSS4KLSAgICAqLwotIyAgaWZkZWYgWkxJQl9XSU5BUEkKLSMgICAgaWZkZWYgRkFSCi0jICAgICAgdW5kZWYgRkFSCi0jICAgIGVuZGlmCi0jICAgIGluY2x1ZGUgPHdpbmRvd3MuaD4KLSAgICAgLyogTm8gbmVlZCBmb3IgX2V4cG9ydCwgdXNlIFpMSUIuREVGIGluc3RlYWQuICovCi0gICAgIC8qIEZvciBjb21wbGV0ZSBXaW5kb3dzIGNvbXBhdGliaWxpdHksIHVzZSBXSU5BUEksIG5vdCBfX3N0ZGNhbGwuICovCi0jICAgIGRlZmluZSBaRVhQT1JUIFdJTkFQSQotIyAgICBpZmRlZiBXSU4zMgotIyAgICAgIGRlZmluZSBaRVhQT1JUVkEgV0lOQVBJVgotIyAgICBlbHNlCi0jICAgICAgZGVmaW5lIFpFWFBPUlRWQSBGQVIgQ0RFQ0wKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQgKF9fQkVPU19fKQotIyAgaWZkZWYgWkxJQl9ETEwKLSMgICAgaWZkZWYgWkxJQl9JTlRFUk5BTAotIyAgICAgIGRlZmluZSBaRVhQT1JUICAgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0jICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSMgICAgZWxzZQotIyAgICAgIGRlZmluZSBaRVhQT1JUICAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0jICAgICAgZGVmaW5lIFpFWFBPUlRWQSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBaRVhURVJOCi0jICBkZWZpbmUgWkVYVEVSTiBleHRlcm4KLSNlbmRpZgotI2lmbmRlZiBaRVhQT1JUCi0jICBkZWZpbmUgWkVYUE9SVAotI2VuZGlmCi0jaWZuZGVmIFpFWFBPUlRWQQotIyAgZGVmaW5lIFpFWFBPUlRWQQotI2VuZGlmCi0KLSNpZm5kZWYgRkFSCi0jICBkZWZpbmUgRkFSCi0jZW5kaWYKLQotI2lmICFkZWZpbmVkKF9fTUFDVFlQRVNfXykKLXR5cGVkZWYgdW5zaWduZWQgY2hhciAgQnl0ZTsgIC8qIDggYml0cyAqLwotI2VuZGlmCi10eXBlZGVmIHVuc2lnbmVkIGludCAgIHVJbnQ7ICAvKiAxNiBiaXRzIG9yIG1vcmUgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgdUxvbmc7IC8qIDMyIGJpdHMgb3IgbW9yZSAqLwotCi0jaWZkZWYgU01BTExfTUVESVVNCi0gICAvKiBCb3JsYW5kIEMvQysrIGFuZCBzb21lIG9sZCBNU0MgdmVyc2lvbnMgaWdub3JlIEZBUiBpbnNpZGUgdHlwZWRlZiAqLwotIyAgZGVmaW5lIEJ5dGVmIEJ5dGUgRkFSCi0jZWxzZQotICAgdHlwZWRlZiBCeXRlICBGQVIgQnl0ZWY7Ci0jZW5kaWYKLXR5cGVkZWYgY2hhciAgRkFSIGNoYXJmOwotdHlwZWRlZiBpbnQgICBGQVIgaW50ZjsKLXR5cGVkZWYgdUludCAgRkFSIHVJbnRmOwotdHlwZWRlZiB1TG9uZyBGQVIgdUxvbmdmOwotCi0jaWZkZWYgU1REQwotICAgdHlwZWRlZiB2b2lkIGNvbnN0ICp2b2lkcGM7Ci0gICB0eXBlZGVmIHZvaWQgRkFSICAgKnZvaWRwZjsKLSAgIHR5cGVkZWYgdm9pZCAgICAgICAqdm9pZHA7Ci0jZWxzZQotICAgdHlwZWRlZiBCeXRlIGNvbnN0ICp2b2lkcGM7Ci0gICB0eXBlZGVmIEJ5dGUgRkFSICAgKnZvaWRwZjsKLSAgIHR5cGVkZWYgQnl0ZSAgICAgICAqdm9pZHA7Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFpfVTQpICYmICFkZWZpbmVkKFpfU09MTykgJiYgZGVmaW5lZChTVERDKQotIyAgaW5jbHVkZSA8bGltaXRzLmg+Ci0jICBpZiAoVUlOVF9NQVggPT0gMHhmZmZmZmZmZlVMKQotIyAgICBkZWZpbmUgWl9VNCB1bnNpZ25lZAotIyAgZWxpZiAoVUxPTkdfTUFYID09IDB4ZmZmZmZmZmZVTCkKLSMgICAgZGVmaW5lIFpfVTQgdW5zaWduZWQgbG9uZwotIyAgZWxpZiAoVVNIUlRfTUFYID09IDB4ZmZmZmZmZmZVTCkKLSMgICAgZGVmaW5lIFpfVTQgdW5zaWduZWQgc2hvcnQKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIFpfVTQKLSAgIHR5cGVkZWYgWl9VNCB6X2NyY190OwotI2Vsc2UKLSAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyB6X2NyY190OwotI2VuZGlmCi0KLSNpZiAwCQkJCS8qIFN1bmxpYW5nLkxpdSAyMDEwMDkwOCBzeW5jIHRoZSBjb25maWcgdG8gdGhlIG9sZCByZXZpc2lvbiwgb3RoZXJ3aXNlLCBldmMgY29tcGlsZSBmYWlsZWQuICovCi0jaWZkZWYgSEFWRV9VTklTVERfSCAgICAvKiBtYXkgYmUgc2V0IHRvICNpZiAxIGJ5IC4vY29uZmlndXJlICovCi0jICBkZWZpbmUgWl9IQVZFX1VOSVNURF9ICi0jZW5kaWYKLSNlbmRpZiAvKiAwICovCi0KLSNpZmRlZiBIQVZFX1NUREFSR19IICAgIC8qIG1heSBiZSBzZXQgdG8gI2lmIDEgYnkgLi9jb25maWd1cmUgKi8KLSMgIGRlZmluZSBaX0hBVkVfU1REQVJHX0gKLSNlbmRpZgotCi0jaWYgMAkJCQkvKiBTdW5saWFuZy5MaXUgMjAxMDA5MDggc3luYyB0aGUgY29uZmlnIHRvIHRoZSBvbGQgcmV2aXNpb24sIG90aGVyd2lzZSwgZXZjIGNvbXBpbGUgZmFpbGVkLiAqLwotI2lmZGVmIFNUREMKLSMgIGlmbmRlZiBaX1NPTE8KLSMgICAgaW5jbHVkZSA8c3lzL3R5cGVzLmg+ICAgICAgLyogZm9yIG9mZl90ICovCi0jICBlbmRpZgotI2VuZGlmCi0jZW5kaWYgLyogMCAqLwotCi0jaWYgZGVmaW5lZChTVERDKSB8fCBkZWZpbmVkKFpfSEFWRV9TVERBUkdfSCkKLSMgIGlmbmRlZiBaX1NPTE8KLSMgICAgaW5jbHVkZSA8c3RkYXJnLmg+ICAgICAgICAgLyogZm9yIHZhX2xpc3QgKi8KLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIF9XSU4zMgotIyAgaWZuZGVmIFpfU09MTwotIyAgICBpbmNsdWRlIDxzdGRkZWYuaD4gICAgICAgICAvKiBmb3Igd2NoYXJfdCAqLwotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWYgMAkJCQkvKiBTdW5saWFuZy5MaXUgMjAxMDA5MDggc3luYyB0aGUgY29uZmlnIHRvIHRoZSBvbGQgcmV2aXNpb24sIG90aGVyd2lzZSwgZXZjIGNvbXBpbGUgZmFpbGVkLiAqLwotLyogYSBsaXR0bGUgdHJpY2sgdG8gYWNjb21tb2RhdGUgYm90aCAiI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIiBhbmQKLSAqICIjZGVmaW5lIF9MQVJHRUZJTEU2NF9TT1VSQ0UgMSIgYXMgcmVxdWVzdGluZyA2NC1iaXQgb3BlcmF0aW9ucywgKGV2ZW4KLSAqIHRob3VnaCB0aGUgZm9ybWVyIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIExGUyBkb2N1bWVudCksIGJ1dCBjb25zaWRlcmluZwotICogYm90aCAiI3VuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UiIGFuZCAiI2RlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIDAiIGFzCi0gKiBlcXVpdmFsZW50bHkgcmVxdWVzdGluZyBubyA2NC1iaXQgb3BlcmF0aW9ucwotICovCi0jaWYgZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKSAmJiAtX0xBUkdFRklMRTY0X1NPVVJDRSAtIC0xID09IDEKLSMgIHVuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UKLSNlbmRpZgotI2VuZGlmIC8qIDAgKi8KLQotI2lmIGRlZmluZWQoX19XQVRDT01DX18pICYmICFkZWZpbmVkKFpfSEFWRV9VTklTVERfSCkKLSMgIGRlZmluZSBaX0hBVkVfVU5JU1REX0gKLSNlbmRpZgotI2lmbmRlZiBaX1NPTE8KLSNpZiAwCQkJCS8qIFN1bmxpYW5nLkxpdSAyMDEwMDkwOCBzeW5jIHRoZSBjb25maWcgdG8gdGhlIG9sZCByZXZpc2lvbiwgb3RoZXJ3aXNlLCBldmMgY29tcGlsZSBmYWlsZWQuICovCi0jICBpZiBkZWZpbmVkKFpfSEFWRV9VTklTVERfSCkgfHwgZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKQotIyAgICBpbmNsdWRlIDx1bmlzdGQuaD4gICAgICAgICAvKiBmb3IgU0VFS18qLCBvZmZfdCwgYW5kIF9MRlM2NF9MQVJHRUZJTEUgKi8KLSMgICAgaWZkZWYgVk1TCi0jICAgICAgaW5jbHVkZSA8dW5peGlvLmg+ICAgICAgIC8qIGZvciBvZmZfdCAqLwotIyAgICBlbmRpZgotIyAgICBpZm5kZWYgel9vZmZfdAotIyAgICAgIGRlZmluZSB6X29mZl90IG9mZl90Ci0jICAgIGVuZGlmCi0jICBlbmRpZgotI2VuZGlmIC8qIDAgKi8KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfTEZTNjRfTEFSR0VGSUxFKSAmJiBfTEZTNjRfTEFSR0VGSUxFLTAKLSMgIGRlZmluZSBaX0xGUzY0Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoX0xBUkdFRklMRTY0X1NPVVJDRSkgJiYgZGVmaW5lZChaX0xGUzY0KQotIyAgZGVmaW5lIFpfTEFSR0U2NAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9GSUxFX09GRlNFVF9CSVRTKSAmJiBfRklMRV9PRkZTRVRfQklUUy0wID09IDY0ICYmIGRlZmluZWQoWl9MRlM2NCkKLSMgIGRlZmluZSBaX1dBTlQ2NAotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChTRUVLX1NFVCkgJiYgIWRlZmluZWQoWl9TT0xPKQotIyAgZGVmaW5lIFNFRUtfU0VUICAgICAgICAwICAgICAgIC8qIFNlZWsgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZS4gICovCi0jICBkZWZpbmUgU0VFS19DVVIgICAgICAgIDEgICAgICAgLyogU2VlayBmcm9tIGN1cnJlbnQgcG9zaXRpb24uICAqLwotIyAgZGVmaW5lIFNFRUtfRU5EICAgICAgICAyICAgICAgIC8qIFNldCBmaWxlIHBvaW50ZXIgdG8gRU9GIHBsdXMgIm9mZnNldCIgKi8KLSNlbmRpZgotCi0jaWZuZGVmIHpfb2ZmX3QKLSMgIGRlZmluZSB6X29mZl90IGxvbmcKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkKFpfTEFSR0U2NCkKLSMgIGRlZmluZSB6X29mZjY0X3Qgb2ZmNjRfdAotI2Vsc2UKLSMgIGlmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoWl9TT0xPKQotIyAgICBkZWZpbmUgel9vZmY2NF90IF9faW50NjQKLSMgIGVsc2UKLSMgICAgZGVmaW5lIHpfb2ZmNjRfdCB6X29mZl90Ci0jICBlbmRpZgotI2VuZGlmCi0KLS8qIE1WUyBsaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCBleHRlcm5hbCBuYW1lcyBsYXJnZXIgdGhhbiA4IGJ5dGVzICovCi0jaWYgZGVmaW5lZChfX01WU19fKQotICAjcHJhZ21hIG1hcChkZWZsYXRlSW5pdF8sIkRFSU4iKQotICAjcHJhZ21hIG1hcChkZWZsYXRlSW5pdDJfLCJERUlOMiIpCi0gICNwcmFnbWEgbWFwKGRlZmxhdGVFbmQsIkRFRU5EIikKLSAgI3ByYWdtYSBtYXAoZGVmbGF0ZUJvdW5kLCJERUJORCIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVJbml0XywiSU5JTiIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVJbml0Ml8sIklOSU4yIikKLSAgI3ByYWdtYSBtYXAoaW5mbGF0ZUVuZCwiSU5FTkQiKQotICAjcHJhZ21hIG1hcChpbmZsYXRlU3luYywiSU5TWSIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVTZXREaWN0aW9uYXJ5LCJJTlNFREkiKQotICAjcHJhZ21hIG1hcChjb21wcmVzc0JvdW5kLCJDTUJORCIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVfdGFibGUsIklOVEFCTCIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVfZmFzdCwiSU5GQSIpCi0gICNwcmFnbWEgbWFwKGluZmxhdGVfY29weXJpZ2h0LCJJTkNPUFkiKQotI2VuZGlmCi0KLSNlbmRpZiAvKiBaQ09ORl9IICovCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS96bGliX3YxMjgvemxpYi5oIGIvdGhpcmRfcGFydHkvemxpYl92MTI4L3psaWIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ1ODEyYS4uMDAwMDAwMAotLS0gYS90aGlyZF9wYXJ0eS96bGliX3YxMjgvemxpYi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgzOSArMCwwIEBACi0vKiB6bGliLmggLS0gaW50ZXJmYWNlIG9mIHRoZSAnemxpYicgZ2VuZXJhbCBwdXJwb3NlIGNvbXByZXNzaW9uIGxpYnJhcnkKLSAgdmVyc2lvbiAxLjIuOCwgQXByaWwgMjh0aCwgMjAxMwotCi0gIENvcHlyaWdodCAoQykgMTk5NS0yMDEzIEplYW4tbG91cCBHYWlsbHkgYW5kIE1hcmsgQWRsZXIKLQotICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAotICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCi0gIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0KLSAgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKLSAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgotCi0gIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci0gICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQotICAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgotICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCi0gIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCi0KLSAgSmVhbi1sb3VwIEdhaWxseSAgICAgICAgTWFyayBBZGxlcgotICBqbG91cEBnemlwLm9yZyAgICAgICAgICBtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1Ci0KLQotICBUaGUgZGF0YSBmb3JtYXQgdXNlZCBieSB0aGUgemxpYiBsaWJyYXJ5IGlzIGRlc2NyaWJlZCBieSBSRkNzIChSZXF1ZXN0IGZvcgotICBDb21tZW50cykgMTk1MCB0byAxOTUyIGluIHRoZSBmaWxlcyBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMxOTUwCi0gICh6bGliIGZvcm1hdCksIHJmYzE5NTEgKGRlZmxhdGUgZm9ybWF0KSBhbmQgcmZjMTk1MiAoZ3ppcCBmb3JtYXQpLgotKi8KLQotI2lmbmRlZiBaTElCX0gKLSNkZWZpbmUgWkxJQl9ICi0KLSNpZmRlZiBfTVNDX1ZFUgotI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwotI2VuZGlmCi0KLSNkZWZpbmUgZGVmbGF0ZV9jb3B5cmlnaHQgRlBERkFQSV9kZWZsYXRlX2NvcHlyaWdodAotI2RlZmluZSBhZGxlcjMyIEZQREZBUElfYWRsZXIzMgotI2RlZmluZSBjb21wcmVzczIgRlBERkFQSV9jb21wcmVzczIKLSNkZWZpbmUgY29tcHJlc3MgRlBERkFQSV9jb21wcmVzcwotI2RlZmluZSBjb21wcmVzc0JvdW5kIEZQREZBUElfY29tcHJlc3NCb3VuZAotI2RlZmluZSBnZXRfY3JjX3RhYmxlIEZQREZBUElfZ2V0X2NyY190YWJsZQotI2RlZmluZSBjcmMzMiBGUERGQVBJX2NyYzMyCi0jZGVmaW5lIGRlZmxhdGVJbml0XyBGUERGQVBJX2RlZmxhdGVJbml0XwotI2RlZmluZSBkZWZsYXRlSW5pdDJfIEZQREZBUElfZGVmbGF0ZUluaXQyXwotI2RlZmluZSBkZWZsYXRlU2V0RGljdGlvbmFyeSBGUERGQVBJX2RlZmxhdGVTZXREaWN0aW9uYXJ5Ci0jZGVmaW5lIGRlZmxhdGVSZXNldCBGUERGQVBJX2RlZmxhdGVSZXNldAotI2RlZmluZSBkZWZsYXRlUGVuZGluZyBGUERGQVBJX2RlZmxhdGVQZW5kaW5nCi0jZGVmaW5lIGRlZmxhdGVQcmltZSBGUERGQVBJX2RlZmxhdGVQcmltZQotI2RlZmluZSBkZWZsYXRlUGFyYW1zIEZQREZBUElfZGVmbGF0ZVBhcmFtcwotI2RlZmluZSBkZWZsYXRlQm91bmQgRlBERkFQSV9kZWZsYXRlQm91bmQKLSNkZWZpbmUgZGVmbGF0ZVNldEhlYWRlciBGUERGQVBJX2RlZmxhdGVTZXRIZWFkZXIKLSNkZWZpbmUgZGVmbGF0ZVR1bmUgRlBERkFQSV9kZWZsYXRlVHVuZQotI2RlZmluZSBkZWZsYXRlIEZQREZBUElfZGVmbGF0ZQotI2RlZmluZSBkZWZsYXRlRW5kIEZQREZBUElfZGVmbGF0ZUVuZAotI2RlZmluZSBkZWZsYXRlQ29weSBGUERGQVBJX2RlZmxhdGVDb3B5Ci0jZGVmaW5lIGluZmxhdGVCYWNrSW5pdF8gRlBERkFQSV9pbmZsYXRlQmFja0luaXRfCi0jZGVmaW5lIGluZmxhdGVCYWNrIEZQREZBUElfaW5mbGF0ZUJhY2sKLSNkZWZpbmUgaW5mbGF0ZUJhY2tFbmQgRlBERkFQSV9pbmZsYXRlQmFja0VuZAotI2RlZmluZSBpbmZsYXRlUmVzZXQgRlBERkFQSV9pbmZsYXRlUmVzZXQKLSNkZWZpbmUgaW5mbGF0ZUluaXQyXyBGUERGQVBJX2luZmxhdGVJbml0Ml8KLSNkZWZpbmUgaW5mbGF0ZUluaXRfIEZQREZBUElfaW5mbGF0ZUluaXRfCi0jZGVmaW5lIGluZmxhdGUgRlBERkFQSV9pbmZsYXRlCi0jZGVmaW5lIGluZmxhdGVFbmQgRlBERkFQSV9pbmZsYXRlRW5kCi0jZGVmaW5lIGluZmxhdGVTZXREaWN0aW9uYXJ5IEZQREZBUElfaW5mbGF0ZVNldERpY3Rpb25hcnkKLSNkZWZpbmUgaW5mbGF0ZVN5bmMgRlBERkFQSV9pbmZsYXRlU3luYwotI2RlZmluZSBpbmZsYXRlU3luY1BvaW50IEZQREZBUElfaW5mbGF0ZVN5bmNQb2ludAotI2RlZmluZSBpbmZsYXRlQ29weSBGUERGQVBJX2luZmxhdGVDb3B5Ci0jZGVmaW5lIHVuY29tcHJlc3MgRlBERkFQSV91bmNvbXByZXNzCi0jZGVmaW5lIHpsaWJWZXJzaW9uIEZQREZBUElfemxpYlZlcnNpb24KLSNkZWZpbmUgemxpYkNvbXBpbGVGbGFncyBGUERGQVBJX3psaWJDb21waWxlRmxhZ3MKLSNkZWZpbmUgekVycm9yIEZQREZBUElfekVycm9yCi0jZGVmaW5lIHpfZXJybXNnIEZQREZBUElfel9lcnJtc2cKLSNkZWZpbmUgemNmcmVlIEZQREZBUElfemNmcmVlCi0jZGVmaW5lIHpjYWxsb2MgRlBERkFQSV96Y2FsbG9jCi0jZGVmaW5lIGluZmxhdGVfZmFzdCBGUERGQVBJX2luZmxhdGVfZmFzdAotI2RlZmluZSBpbmZsYXRlX3RhYmxlIEZQREZBUElfaW5mbGF0ZV90YWJsZQotI2RlZmluZSBpbmZsYXRlX2NvcHlyaWdodCBGUERGQVBJX2luZmxhdGVfY29weXJpZ2h0Ci0jZGVmaW5lIF9sZW5ndGhfY29kZSBGUERGQVBJX2xlbmd0aF9jb2RlCi0jZGVmaW5lIF90cl9mbHVzaF9ibG9jayBGUERGQVBJX3RyX2ZsdXNoX2Jsb2NrCi0jZGVmaW5lIF9kaXN0X2NvZGUgRlBERkFQSV9kaXN0X2NvZGUKLSNkZWZpbmUgX3RyX3N0b3JlZF9ibG9jayBGUERGQVBJX3RyX3N0b3JlZF9ibG9jawotI2RlZmluZSBfdHJfaW5pdCBGUERGQVBJX3RyX2luaXQKLSNkZWZpbmUgX3RyX2FsaWduIEZQREZBUElfdHJfYWxpZ24KLSNkZWZpbmUgX3RyX3RhbGx5IEZQREZBUElfdHJfdGFsbHkKLSNkZWZpbmUgX3RyX2ZsdXNoX2JpdHMgRlBERkFQSV90cl9mbHVzaF9iaXRzCi0jZGVmaW5lIGFkbGVyMzJfY29tYmluZSBGUERGQVBJX2FkbGVyMzJfY29tYmluZQotI2RlZmluZSBpbmZsYXRlUHJpbWUgRlBERkFQSV9pbmZsYXRlUHJpbWUKLSNkZWZpbmUgaW5mbGF0ZUdldERpY3Rpb25hcnkgRlBERkFQSV9pbmZsYXRlR2V0RGljdGlvbmFyeQotI2RlZmluZSBpbmZsYXRlR2V0SGVhZGVyIEZQREZBUElfaW5mbGF0ZUdldEhlYWRlcgotI2RlZmluZSBjcmMzMl9jb21iaW5lIEZQREZBUElfY3JjMzJfY29tYmluZQotI2RlZmluZSBpbmZsYXRlUmVzZXQyIEZQREZBUElfaW5mbGF0ZVJlc2V0MgotI2RlZmluZSBpbmZsYXRlVW5kZXJtaW5lIEZQREZBUElfaW5mbGF0ZVVuZGVybWluZQotI2RlZmluZSBpbmZsYXRlTWFyayBGUERGQVBJX2luZmxhdGVNYXJrCi0jZGVmaW5lIGFkbGVyMzJfY29tYmluZTY0IEZQREZBUElfYWRsZXIzMl9jb21iaW5lNjQKLSNkZWZpbmUgaW5mbGF0ZVJlc2V0S2VlcCBGUERGQVBJX2luZmxhdGVSZXNldEtlZXAKLSNkZWZpbmUgZGVmbGF0ZVJlc2V0S2VlcCBGUERGQVBJX2RlZmxhdGVSZXNldEtlZXAKLQotI2luY2x1ZGUgInpjb25mLmgiCi0KLS8qIFN1bmxpYW5nLkxpdSAyMDEwMDkwOCBzeW5jIHRoZSBjb25maWcgdG8gdGhlIG9sZCByZXZpc2lvbi4gTk9fR1pJUCAqLwotI2RlZmluZSBOT19HWklQCQkvKiBYWVEgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIFpMSUJfVkVSU0lPTiAiMS4yLjgiCi0jZGVmaW5lIFpMSUJfVkVSTlVNIDB4MTI4MAotI2RlZmluZSBaTElCX1ZFUl9NQUpPUiAxCi0jZGVmaW5lIFpMSUJfVkVSX01JTk9SIDIKLSNkZWZpbmUgWkxJQl9WRVJfUkVWSVNJT04gOAotI2RlZmluZSBaTElCX1ZFUl9TVUJSRVZJU0lPTiAwCi0KLS8qCi0gICAgVGhlICd6bGliJyBjb21wcmVzc2lvbiBsaWJyYXJ5IHByb3ZpZGVzIGluLW1lbW9yeSBjb21wcmVzc2lvbiBhbmQKLSAgZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMsIGluY2x1ZGluZyBpbnRlZ3JpdHkgY2hlY2tzIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YS4KLSAgVGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5IHN1cHBvcnRzIG9ubHkgb25lIGNvbXByZXNzaW9uIG1ldGhvZCAoZGVmbGF0aW9uKQotICBidXQgb3RoZXIgYWxnb3JpdGhtcyB3aWxsIGJlIGFkZGVkIGxhdGVyIGFuZCB3aWxsIGhhdmUgdGhlIHNhbWUgc3RyZWFtCi0gIGludGVyZmFjZS4KLQotICAgIENvbXByZXNzaW9uIGNhbiBiZSBkb25lIGluIGEgc2luZ2xlIHN0ZXAgaWYgdGhlIGJ1ZmZlcnMgYXJlIGxhcmdlIGVub3VnaCwKLSAgb3IgY2FuIGJlIGRvbmUgYnkgcmVwZWF0ZWQgY2FsbHMgb2YgdGhlIGNvbXByZXNzaW9uIGZ1bmN0aW9uLiAgSW4gdGhlIGxhdHRlcgotICBjYXNlLCB0aGUgYXBwbGljYXRpb24gbXVzdCBwcm92aWRlIG1vcmUgaW5wdXQgYW5kL29yIGNvbnN1bWUgdGhlIG91dHB1dAotICAocHJvdmlkaW5nIG1vcmUgb3V0cHV0IHNwYWNlKSBiZWZvcmUgZWFjaCBjYWxsLgotCi0gICAgVGhlIGNvbXByZXNzZWQgZGF0YSBmb3JtYXQgdXNlZCBieSBkZWZhdWx0IGJ5IHRoZSBpbi1tZW1vcnkgZnVuY3Rpb25zIGlzCi0gIHRoZSB6bGliIGZvcm1hdCwgd2hpY2ggaXMgYSB6bGliIHdyYXBwZXIgZG9jdW1lbnRlZCBpbiBSRkMgMTk1MCwgd3JhcHBlZAotICBhcm91bmQgYSBkZWZsYXRlIHN0cmVhbSwgd2hpY2ggaXMgaXRzZWxmIGRvY3VtZW50ZWQgaW4gUkZDIDE5NTEuCi0KLSAgICBUaGUgbGlicmFyeSBhbHNvIHN1cHBvcnRzIHJlYWRpbmcgYW5kIHdyaXRpbmcgZmlsZXMgaW4gZ3ppcCAoLmd6KSBmb3JtYXQKLSAgd2l0aCBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGF0IG9mIHN0ZGlvIHVzaW5nIHRoZSBmdW5jdGlvbnMgdGhhdCBzdGFydAotICB3aXRoICJneiIuICBUaGUgZ3ppcCBmb3JtYXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIHpsaWIgZm9ybWF0LiAgZ3ppcCBpcyBhCi0gIGd6aXAgd3JhcHBlciwgZG9jdW1lbnRlZCBpbiBSRkMgMTk1Miwgd3JhcHBlZCBhcm91bmQgYSBkZWZsYXRlIHN0cmVhbS4KLQotICAgIFRoaXMgbGlicmFyeSBjYW4gb3B0aW9uYWxseSByZWFkIGFuZCB3cml0ZSBnemlwIHN0cmVhbXMgaW4gbWVtb3J5IGFzIHdlbGwuCi0KLSAgICBUaGUgemxpYiBmb3JtYXQgd2FzIGRlc2lnbmVkIHRvIGJlIGNvbXBhY3QgYW5kIGZhc3QgZm9yIHVzZSBpbiBtZW1vcnkKLSAgYW5kIG9uIGNvbW11bmljYXRpb25zIGNoYW5uZWxzLiAgVGhlIGd6aXAgZm9ybWF0IHdhcyBkZXNpZ25lZCBmb3Igc2luZ2xlLQotICBmaWxlIGNvbXByZXNzaW9uIG9uIGZpbGUgc3lzdGVtcywgaGFzIGEgbGFyZ2VyIGhlYWRlciB0aGFuIHpsaWIgdG8gbWFpbnRhaW4KLSAgZGlyZWN0b3J5IGluZm9ybWF0aW9uLCBhbmQgdXNlcyBhIGRpZmZlcmVudCwgc2xvd2VyIGNoZWNrIG1ldGhvZCB0aGFuIHpsaWIuCi0KLSAgICBUaGUgbGlicmFyeSBkb2VzIG5vdCBpbnN0YWxsIGFueSBzaWduYWwgaGFuZGxlci4gIFRoZSBkZWNvZGVyIGNoZWNrcwotICB0aGUgY29uc2lzdGVuY3kgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSwgc28gdGhlIGxpYnJhcnkgc2hvdWxkIG5ldmVyIGNyYXNoCi0gIGV2ZW4gaW4gY2FzZSBvZiBjb3JydXB0ZWQgaW5wdXQuCi0qLwotCi10eXBlZGVmIHZvaWRwZiAoKmFsbG9jX2Z1bmMpIE9GKCh2b2lkcGYgb3BhcXVlLCB1SW50IGl0ZW1zLCB1SW50IHNpemUpKTsKLXR5cGVkZWYgdm9pZCAgICgqZnJlZV9mdW5jKSAgT0YoKHZvaWRwZiBvcGFxdWUsIHZvaWRwZiBhZGRyZXNzKSk7Ci0KLXN0cnVjdCBpbnRlcm5hbF9zdGF0ZTsKLQotdHlwZWRlZiBzdHJ1Y3Qgel9zdHJlYW1fcyB7Ci0gICAgel9jb25zdCBCeXRlZiAqbmV4dF9pbjsgICAgIC8qIG5leHQgaW5wdXQgYnl0ZSAqLwotICAgIHVJbnQgICAgIGF2YWlsX2luOyAgLyogbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBhdCBuZXh0X2luICovCi0gICAgdUxvbmcgICAgdG90YWxfaW47ICAvKiB0b3RhbCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgcmVhZCBzbyBmYXIgKi8KLQotICAgIEJ5dGVmICAgICpuZXh0X291dDsgLyogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovCi0gICAgdUludCAgICAgYXZhaWxfb3V0OyAvKiByZW1haW5pbmcgZnJlZSBzcGFjZSBhdCBuZXh0X291dCAqLwotICAgIHVMb25nICAgIHRvdGFsX291dDsgLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi8KLQotICAgIHpfY29uc3QgY2hhciAqbXNnOyAgLyogbGFzdCBlcnJvciBtZXNzYWdlLCBOVUxMIGlmIG5vIGVycm9yICovCi0gICAgc3RydWN0IGludGVybmFsX3N0YXRlIEZBUiAqc3RhdGU7IC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqLwotCi0gICAgYWxsb2NfZnVuYyB6YWxsb2M7ICAvKiB1c2VkIHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLwotICAgIGZyZWVfZnVuYyAgemZyZWU7ICAgLyogdXNlZCB0byBmcmVlIHRoZSBpbnRlcm5hbCBzdGF0ZSAqLwotICAgIHZvaWRwZiAgICAgb3BhcXVlOyAgLyogcHJpdmF0ZSBkYXRhIG9iamVjdCBwYXNzZWQgdG8gemFsbG9jIGFuZCB6ZnJlZSAqLwotCi0gICAgaW50ICAgICBkYXRhX3R5cGU7ICAvKiBiZXN0IGd1ZXNzIGFib3V0IHRoZSBkYXRhIHR5cGU6IGJpbmFyeSBvciB0ZXh0ICovCi0gICAgdUxvbmcgICBhZGxlcjsgICAgICAvKiBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqLwotICAgIHVMb25nICAgcmVzZXJ2ZWQ7ICAgLyogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgKi8KLX0gel9zdHJlYW07Ci0KLXR5cGVkZWYgel9zdHJlYW0gRkFSICp6X3N0cmVhbXA7Ci0KLS8qCi0gICAgIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHBhc3NlZCB0byBhbmQgZnJvbSB6bGliIHJvdXRpbmVzLiAgU2VlIFJGQyAxOTUyCi0gIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIG1lYW5pbmdzIG9mIHRoZXNlIGZpZWxkcy4KLSovCi10eXBlZGVmIHN0cnVjdCBnel9oZWFkZXJfcyB7Ci0gICAgaW50ICAgICB0ZXh0OyAgICAgICAvKiB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0ICovCi0gICAgdUxvbmcgICB0aW1lOyAgICAgICAvKiBtb2RpZmljYXRpb24gdGltZSAqLwotICAgIGludCAgICAgeGZsYWdzOyAgICAgLyogZXh0cmEgZmxhZ3MgKG5vdCB1c2VkIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi8KLSAgICBpbnQgICAgIG9zOyAgICAgICAgIC8qIG9wZXJhdGluZyBzeXN0ZW0gKi8KLSAgICBCeXRlZiAgICpleHRyYTsgICAgIC8qIHBvaW50ZXIgdG8gZXh0cmEgZmllbGQgb3IgWl9OVUxMIGlmIG5vbmUgKi8KLSAgICB1SW50ICAgIGV4dHJhX2xlbjsgIC8qIGV4dHJhIGZpZWxkIGxlbmd0aCAodmFsaWQgaWYgZXh0cmEgIT0gWl9OVUxMKSAqLwotICAgIHVJbnQgICAgZXh0cmFfbWF4OyAgLyogc3BhY2UgYXQgZXh0cmEgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi8KLSAgICBCeXRlZiAgICpuYW1lOyAgICAgIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGZpbGUgbmFtZSBvciBaX05VTEwgKi8KLSAgICB1SW50ICAgIG5hbWVfbWF4OyAgIC8qIHNwYWNlIGF0IG5hbWUgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi8KLSAgICBCeXRlZiAgICpjb21tZW50OyAgIC8qIHBvaW50ZXIgdG8gemVyby10ZXJtaW5hdGVkIGNvbW1lbnQgb3IgWl9OVUxMICovCi0gICAgdUludCAgICBjb21tX21heDsgICAvKiBzcGFjZSBhdCBjb21tZW50IChvbmx5IHdoZW4gcmVhZGluZyBoZWFkZXIpICovCi0gICAgaW50ICAgICBoY3JjOyAgICAgICAvKiB0cnVlIGlmIHRoZXJlIHdhcyBvciB3aWxsIGJlIGEgaGVhZGVyIGNyYyAqLwotICAgIGludCAgICAgZG9uZTsgICAgICAgLyogdHJ1ZSB3aGVuIGRvbmUgcmVhZGluZyBnemlwIGhlYWRlciAobm90IHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gd3JpdGluZyBhIGd6aXAgZmlsZSkgKi8KLX0gZ3pfaGVhZGVyOwotCi10eXBlZGVmIGd6X2hlYWRlciBGQVIgKmd6X2hlYWRlcnA7Ci0KLS8qCi0gICAgIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbiB3aGVuIGF2YWlsX2luIGhhcyBkcm9wcGVkCi0gICB0byB6ZXJvLiAgSXQgbXVzdCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dCB3aGVuIGF2YWlsX291dCBoYXMgZHJvcHBlZAotICAgdG8gemVyby4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGluaXRpYWxpemUgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIGJlZm9yZQotICAgY2FsbGluZyB0aGUgaW5pdCBmdW5jdGlvbi4gIEFsbCBvdGhlciBmaWVsZHMgYXJlIHNldCBieSB0aGUgY29tcHJlc3Npb24KLSAgIGxpYnJhcnkgYW5kIG11c3Qgbm90IGJlIHVwZGF0ZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgotCi0gICAgIFRoZSBvcGFxdWUgdmFsdWUgcHJvdmlkZWQgYnkgdGhlIGFwcGxpY2F0aW9uIHdpbGwgYmUgcGFzc2VkIGFzIHRoZSBmaXJzdAotICAgcGFyYW1ldGVyIGZvciBjYWxscyBvZiB6YWxsb2MgYW5kIHpmcmVlLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBjdXN0b20KLSAgIG1lbW9yeSBtYW5hZ2VtZW50LiAgVGhlIGNvbXByZXNzaW9uIGxpYnJhcnkgYXR0YWNoZXMgbm8gbWVhbmluZyB0byB0aGUKLSAgIG9wYXF1ZSB2YWx1ZS4KLQotICAgICB6YWxsb2MgbXVzdCByZXR1cm4gWl9OVUxMIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5IGZvciB0aGUgb2JqZWN0LgotICAgSWYgemxpYiBpcyB1c2VkIGluIGEgbXVsdGktdGhyZWFkZWQgYXBwbGljYXRpb24sIHphbGxvYyBhbmQgemZyZWUgbXVzdCBiZQotICAgdGhyZWFkIHNhZmUuCi0KLSAgICAgT24gMTYtYml0IHN5c3RlbXMsIHRoZSBmdW5jdGlvbnMgemFsbG9jIGFuZCB6ZnJlZSBtdXN0IGJlIGFibGUgdG8gYWxsb2NhdGUKLSAgIGV4YWN0bHkgNjU1MzYgYnl0ZXMsIGJ1dCB3aWxsIG5vdCBiZSByZXF1aXJlZCB0byBhbGxvY2F0ZSBtb3JlIHRoYW4gdGhpcyBpZgotICAgdGhlIHN5bWJvbCBNQVhTRUdfNjRLIGlzIGRlZmluZWQgKHNlZSB6Y29uZi5oKS4gIFdBUk5JTkc6IE9uIE1TRE9TLCBwb2ludGVycwotICAgcmV0dXJuZWQgYnkgemFsbG9jIGZvciBvYmplY3RzIG9mIGV4YWN0bHkgNjU1MzYgYnl0ZXMgKm11c3QqIGhhdmUgdGhlaXIKLSAgIG9mZnNldCBub3JtYWxpemVkIHRvIHplcm8uICBUaGUgZGVmYXVsdCBhbGxvY2F0aW9uIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IHRoaXMKLSAgIGxpYnJhcnkgZW5zdXJlcyB0aGlzIChzZWUgenV0aWwuYykuICBUbyByZWR1Y2UgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgYXZvaWQKLSAgIGFueSBhbGxvY2F0aW9uIG9mIDY0SyBvYmplY3RzLCBhdCB0aGUgZXhwZW5zZSBvZiBjb21wcmVzc2lvbiByYXRpbywgY29tcGlsZQotICAgdGhlIGxpYnJhcnkgd2l0aCAtRE1BWF9XQklUUz0xNCAoc2VlIHpjb25mLmgpLgotCi0gICAgIFRoZSBmaWVsZHMgdG90YWxfaW4gYW5kIHRvdGFsX291dCBjYW4gYmUgdXNlZCBmb3Igc3RhdGlzdGljcyBvciBwcm9ncmVzcwotICAgcmVwb3J0cy4gIEFmdGVyIGNvbXByZXNzaW9uLCB0b3RhbF9pbiBob2xkcyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUKLSAgIHVuY29tcHJlc3NlZCBkYXRhIGFuZCBtYXkgYmUgc2F2ZWQgZm9yIHVzZSBpbiB0aGUgZGVjb21wcmVzc29yIChwYXJ0aWN1bGFybHkKLSAgIGlmIHRoZSBkZWNvbXByZXNzb3Igd2FudHMgdG8gZGVjb21wcmVzcyBldmVyeXRoaW5nIGluIGEgc2luZ2xlIHN0ZXApLgotKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogY29uc3RhbnRzICovCi0KLSNkZWZpbmUgWl9OT19GTFVTSCAgICAgIDAKLSNkZWZpbmUgWl9QQVJUSUFMX0ZMVVNIIDEKLSNkZWZpbmUgWl9TWU5DX0ZMVVNIICAgIDIKLSNkZWZpbmUgWl9GVUxMX0ZMVVNIICAgIDMKLSNkZWZpbmUgWl9GSU5JU0ggICAgICAgIDQKLSNkZWZpbmUgWl9CTE9DSyAgICAgICAgIDUKLSNkZWZpbmUgWl9UUkVFUyAgICAgICAgIDYKLS8qIEFsbG93ZWQgZmx1c2ggdmFsdWVzOyBzZWUgZGVmbGF0ZSgpIGFuZCBpbmZsYXRlKCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KLQotI2RlZmluZSBaX09LICAgICAgICAgICAgMAotI2RlZmluZSBaX1NUUkVBTV9FTkQgICAgMQotI2RlZmluZSBaX05FRURfRElDVCAgICAgMgotI2RlZmluZSBaX0VSUk5PICAgICAgICAoLTEpCi0jZGVmaW5lIFpfU1RSRUFNX0VSUk9SICgtMikKLSNkZWZpbmUgWl9EQVRBX0VSUk9SICAgKC0zKQotI2RlZmluZSBaX01FTV9FUlJPUiAgICAoLTQpCi0jZGVmaW5lIFpfQlVGX0VSUk9SICAgICgtNSkKLSNkZWZpbmUgWl9WRVJTSU9OX0VSUk9SICgtNikKLS8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXMKLSAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy4KLSAqLwotCi0jZGVmaW5lIFpfTk9fQ09NUFJFU1NJT04gICAgICAgICAwCi0jZGVmaW5lIFpfQkVTVF9TUEVFRCAgICAgICAgICAgICAxCi0jZGVmaW5lIFpfQkVTVF9DT01QUkVTU0lPTiAgICAgICA5Ci0jZGVmaW5lIFpfREVGQVVMVF9DT01QUkVTU0lPTiAgKC0xKQotLyogY29tcHJlc3Npb24gbGV2ZWxzICovCi0KLSNkZWZpbmUgWl9GSUxURVJFRCAgICAgICAgICAgIDEKLSNkZWZpbmUgWl9IVUZGTUFOX09OTFkgICAgICAgIDIKLSNkZWZpbmUgWl9STEUgICAgICAgICAgICAgICAgIDMKLSNkZWZpbmUgWl9GSVhFRCAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgWl9ERUZBVUxUX1NUUkFURUdZICAgIDAKLS8qIGNvbXByZXNzaW9uIHN0cmF0ZWd5OyBzZWUgZGVmbGF0ZUluaXQyKCkgYmVsb3cgZm9yIGRldGFpbHMgKi8KLQotI2RlZmluZSBaX0JJTkFSWSAgIDAKLSNkZWZpbmUgWl9URVhUICAgICAxCi0jZGVmaW5lIFpfQVNDSUkgICAgWl9URVhUICAgLyogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCAxLjIuMiBhbmQgZWFybGllciAqLwotI2RlZmluZSBaX1VOS05PV04gIDIKLS8qIFBvc3NpYmxlIHZhbHVlcyBvZiB0aGUgZGF0YV90eXBlIGZpZWxkICh0aG91Z2ggc2VlIGluZmxhdGUoKSkgKi8KLQotI2RlZmluZSBaX0RFRkxBVEVEICAgOAotLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICh0aGUgb25seSBvbmUgc3VwcG9ydGVkIGluIHRoaXMgdmVyc2lvbikgKi8KLQotI2RlZmluZSBaX05VTEwgIDAgIC8qIGZvciBpbml0aWFsaXppbmcgemFsbG9jLCB6ZnJlZSwgb3BhcXVlICovCi0KLSNkZWZpbmUgemxpYl92ZXJzaW9uIHpsaWJWZXJzaW9uKCkKLS8qIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbnMgPCAxLjAuMiAqLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJhc2ljIGZ1bmN0aW9ucyAqLwotCi1aRVhURVJOIGNvbnN0IGNoYXIgKiBaRVhQT1JUIHpsaWJWZXJzaW9uIE9GKCh2b2lkKSk7Ci0vKiBUaGUgYXBwbGljYXRpb24gY2FuIGNvbXBhcmUgemxpYlZlcnNpb24gYW5kIFpMSUJfVkVSU0lPTiBmb3IgY29uc2lzdGVuY3kuCi0gICBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGRpZmZlcnMsIHRoZSBsaWJyYXJ5IGNvZGUgYWN0dWFsbHkgdXNlZCBpcyBub3QKLSAgIGNvbXBhdGlibGUgd2l0aCB0aGUgemxpYi5oIGhlYWRlciBmaWxlIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uLiAgVGhpcyBjaGVjawotICAgaXMgYXV0b21hdGljYWxseSBtYWRlIGJ5IGRlZmxhdGVJbml0IGFuZCBpbmZsYXRlSW5pdC4KLSAqLwotCi0vKgotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdCBPRigoel9zdHJlYW1wIHN0cm0sIGludCBsZXZlbCkpOwotCi0gICAgIEluaXRpYWxpemVzIHRoZSBpbnRlcm5hbCBzdHJlYW0gc3RhdGUgZm9yIGNvbXByZXNzaW9uLiAgVGhlIGZpZWxkcwotICAgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIGJ5IHRoZSBjYWxsZXIuICBJZgotICAgemFsbG9jIGFuZCB6ZnJlZSBhcmUgc2V0IHRvIFpfTlVMTCwgZGVmbGF0ZUluaXQgdXBkYXRlcyB0aGVtIHRvIHVzZSBkZWZhdWx0Ci0gICBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KLQotICAgICBUaGUgY29tcHJlc3Npb24gbGV2ZWwgbXVzdCBiZSBaX0RFRkFVTFRfQ09NUFJFU1NJT04sIG9yIGJldHdlZW4gMCBhbmQgOToKLSAgIDEgZ2l2ZXMgYmVzdCBzcGVlZCwgOSBnaXZlcyBiZXN0IGNvbXByZXNzaW9uLCAwIGdpdmVzIG5vIGNvbXByZXNzaW9uIGF0IGFsbAotICAgKHRoZSBpbnB1dCBkYXRhIGlzIHNpbXBseSBjb3BpZWQgYSBibG9jayBhdCBhIHRpbWUpLiAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OCi0gICByZXF1ZXN0cyBhIGRlZmF1bHQgY29tcHJvbWlzZSBiZXR3ZWVuIHNwZWVkIGFuZCBjb21wcmVzc2lvbiAoY3VycmVudGx5Ci0gICBlcXVpdmFsZW50IHRvIGxldmVsIDYpLgotCi0gICAgIGRlZmxhdGVJbml0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgbWVtb3J5LCBaX1NUUkVBTV9FUlJPUiBpZiBsZXZlbCBpcyBub3QgYSB2YWxpZCBjb21wcmVzc2lvbiBsZXZlbCwgb3IKLSAgIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgemxpYiBsaWJyYXJ5IHZlcnNpb24gKHpsaWJfdmVyc2lvbikgaXMgaW5jb21wYXRpYmxlCi0gICB3aXRoIHRoZSB2ZXJzaW9uIGFzc3VtZWQgYnkgdGhlIGNhbGxlciAoWkxJQl9WRVJTSU9OKS4gIG1zZyBpcyBzZXQgdG8gbnVsbAotICAgaWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4gIGRlZmxhdGVJbml0IGRvZXMgbm90IHBlcmZvcm0gYW55IGNvbXByZXNzaW9uOgotICAgdGhpcyB3aWxsIGJlIGRvbmUgYnkgZGVmbGF0ZSgpLgotKi8KLQotCi1aRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGUgT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgZmx1c2gpKTsKLS8qCi0gICAgZGVmbGF0ZSBjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0Ci0gIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gIEl0IG1heSBpbnRyb2R1Y2UKLSAgc29tZSBvdXRwdXQgbGF0ZW5jeSAocmVhZGluZyBpbnB1dCB3aXRob3V0IHByb2R1Y2luZyBhbnkgb3V0cHV0KSBleGNlcHQgd2hlbgotICBmb3JjZWQgdG8gZmx1c2guCi0KLSAgICBUaGUgZGV0YWlsZWQgc2VtYW50aWNzIGFyZSBhcyBmb2xsb3dzLiAgZGVmbGF0ZSBwZXJmb3JtcyBvbmUgb3IgYm90aCBvZiB0aGUKLSAgZm9sbG93aW5nIGFjdGlvbnM6Ci0KLSAgLSBDb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IG5leHRfaW4gYW5kIHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbgotICAgIGFjY29yZGluZ2x5LiAgSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAotICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgbmV4dF9pbiBhbmQgYXZhaWxfaW4gYXJlIHVwZGF0ZWQgYW5kCi0gICAgcHJvY2Vzc2luZyB3aWxsIHJlc3VtZSBhdCB0aGlzIHBvaW50IGZvciB0aGUgbmV4dCBjYWxsIG9mIGRlZmxhdGUoKS4KLQotICAtIFByb3ZpZGUgbW9yZSBvdXRwdXQgc3RhcnRpbmcgYXQgbmV4dF9vdXQgYW5kIHVwZGF0ZSBuZXh0X291dCBhbmQgYXZhaWxfb3V0Ci0gICAgYWNjb3JkaW5nbHkuICBUaGlzIGFjdGlvbiBpcyBmb3JjZWQgaWYgdGhlIHBhcmFtZXRlciBmbHVzaCBpcyBub24gemVyby4KLSAgICBGb3JjaW5nIGZsdXNoIGZyZXF1ZW50bHkgZGVncmFkZXMgdGhlIGNvbXByZXNzaW9uIHJhdGlvLCBzbyB0aGlzIHBhcmFtZXRlcgotICAgIHNob3VsZCBiZSBzZXQgb25seSB3aGVuIG5lY2Vzc2FyeSAoaW4gaW50ZXJhY3RpdmUgYXBwbGljYXRpb25zKS4gIFNvbWUKLSAgICBvdXRwdXQgbWF5IGJlIHByb3ZpZGVkIGV2ZW4gaWYgZmx1c2ggaXMgbm90IHNldC4KLQotICAgIEJlZm9yZSB0aGUgY2FsbCBvZiBkZWZsYXRlKCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKLSAgb25lIG9mIHRoZSBhY3Rpb25zIGlzIHBvc3NpYmxlLCBieSBwcm92aWRpbmcgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtaW5nIG1vcmUKLSAgb3V0cHV0LCBhbmQgdXBkYXRpbmcgYXZhaWxfaW4gb3IgYXZhaWxfb3V0IGFjY29yZGluZ2x5OyBhdmFpbF9vdXQgc2hvdWxkCi0gIG5ldmVyIGJlIHplcm8gYmVmb3JlIHRoZSBjYWxsLiAgVGhlIGFwcGxpY2F0aW9uIGNhbiBjb25zdW1lIHRoZSBjb21wcmVzc2VkCi0gIG91dHB1dCB3aGVuIGl0IHdhbnRzLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwgKGF2YWlsX291dAotICA9PSAwKSwgb3IgYWZ0ZXIgZWFjaCBjYWxsIG9mIGRlZmxhdGUoKS4gIElmIGRlZmxhdGUgcmV0dXJucyBaX09LIGFuZCB3aXRoCi0gIHplcm8gYXZhaWxfb3V0LCBpdCBtdXN0IGJlIGNhbGxlZCBhZ2FpbiBhZnRlciBtYWtpbmcgcm9vbSBpbiB0aGUgb3V0cHV0Ci0gIGJ1ZmZlciBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlIG1vcmUgb3V0cHV0IHBlbmRpbmcuCi0KLSAgICBOb3JtYWxseSB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byBaX05PX0ZMVVNILCB3aGljaCBhbGxvd3MgZGVmbGF0ZSB0bwotICBkZWNpZGUgaG93IG11Y2ggZGF0YSB0byBhY2N1bXVsYXRlIGJlZm9yZSBwcm9kdWNpbmcgb3V0cHV0LCBpbiBvcmRlciB0bwotICBtYXhpbWl6ZSBjb21wcmVzc2lvbi4KLQotICAgIElmIHRoZSBwYXJhbWV0ZXIgZmx1c2ggaXMgc2V0IHRvIFpfU1lOQ19GTFVTSCwgYWxsIHBlbmRpbmcgb3V0cHV0IGlzCi0gIGZsdXNoZWQgdG8gdGhlIG91dHB1dCBidWZmZXIgYW5kIHRoZSBvdXRwdXQgaXMgYWxpZ25lZCBvbiBhIGJ5dGUgYm91bmRhcnksIHNvCi0gIHRoYXQgdGhlIGRlY29tcHJlc3NvciBjYW4gZ2V0IGFsbCBpbnB1dCBkYXRhIGF2YWlsYWJsZSBzbyBmYXIuICAoSW4KLSAgcGFydGljdWxhciBhdmFpbF9pbiBpcyB6ZXJvIGFmdGVyIHRoZSBjYWxsIGlmIGVub3VnaCBvdXRwdXQgc3BhY2UgaGFzIGJlZW4KLSAgcHJvdmlkZWQgYmVmb3JlIHRoZSBjYWxsLikgRmx1c2hpbmcgbWF5IGRlZ3JhZGUgY29tcHJlc3Npb24gZm9yIHNvbWUKLSAgY29tcHJlc3Npb24gYWxnb3JpdGhtcyBhbmQgc28gaXQgc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIG5lY2Vzc2FyeS4gIFRoaXMKLSAgY29tcGxldGVzIHRoZSBjdXJyZW50IGRlZmxhdGUgYmxvY2sgYW5kIGZvbGxvd3MgaXQgd2l0aCBhbiBlbXB0eSBzdG9yZWQgYmxvY2sKLSAgdGhhdCBpcyB0aHJlZSBiaXRzIHBsdXMgZmlsbGVyIGJpdHMgdG8gdGhlIG5leHQgYnl0ZSwgZm9sbG93ZWQgYnkgZm91ciBieXRlcwotICAoMDAgMDAgZmYgZmYpLgotCi0gICAgSWYgZmx1c2ggaXMgc2V0IHRvIFpfUEFSVElBTF9GTFVTSCwgYWxsIHBlbmRpbmcgb3V0cHV0IGlzIGZsdXNoZWQgdG8gdGhlCi0gIG91dHB1dCBidWZmZXIsIGJ1dCB0aGUgb3V0cHV0IGlzIG5vdCBhbGlnbmVkIHRvIGEgYnl0ZSBib3VuZGFyeS4gIEFsbCBvZiB0aGUKLSAgaW5wdXQgZGF0YSBzbyBmYXIgd2lsbCBiZSBhdmFpbGFibGUgdG8gdGhlIGRlY29tcHJlc3NvciwgYXMgZm9yIFpfU1lOQ19GTFVTSC4KLSAgVGhpcyBjb21wbGV0ZXMgdGhlIGN1cnJlbnQgZGVmbGF0ZSBibG9jayBhbmQgZm9sbG93cyBpdCB3aXRoIGFuIGVtcHR5IGZpeGVkCi0gIGNvZGVzIGJsb2NrIHRoYXQgaXMgMTAgYml0cyBsb25nLiAgVGhpcyBhc3N1cmVzIHRoYXQgZW5vdWdoIGJ5dGVzIGFyZSBvdXRwdXQKLSAgaW4gb3JkZXIgZm9yIHRoZSBkZWNvbXByZXNzb3IgdG8gZmluaXNoIHRoZSBibG9jayBiZWZvcmUgdGhlIGVtcHR5IGZpeGVkIGNvZGUKLSAgYmxvY2suCi0KLSAgICBJZiBmbHVzaCBpcyBzZXQgdG8gWl9CTE9DSywgYSBkZWZsYXRlIGJsb2NrIGlzIGNvbXBsZXRlZCBhbmQgZW1pdHRlZCwgYXMKLSAgZm9yIFpfU1lOQ19GTFVTSCwgYnV0IHRoZSBvdXRwdXQgaXMgbm90IGFsaWduZWQgb24gYSBieXRlIGJvdW5kYXJ5LCBhbmQgdXAgdG8KLSAgc2V2ZW4gYml0cyBvZiB0aGUgY3VycmVudCBibG9jayBhcmUgaGVsZCB0byBiZSB3cml0dGVuIGFzIHRoZSBuZXh0IGJ5dGUgYWZ0ZXIKLSAgdGhlIG5leHQgZGVmbGF0ZSBibG9jayBpcyBjb21wbGV0ZWQuICBJbiB0aGlzIGNhc2UsIHRoZSBkZWNvbXByZXNzb3IgbWF5IG5vdAotICBiZSBwcm92aWRlZCBlbm91Z2ggYml0cyBhdCB0aGlzIHBvaW50IGluIG9yZGVyIHRvIGNvbXBsZXRlIGRlY29tcHJlc3Npb24gb2YKLSAgdGhlIGRhdGEgcHJvdmlkZWQgc28gZmFyIHRvIHRoZSBjb21wcmVzc29yLiAgSXQgbWF5IG5lZWQgdG8gd2FpdCBmb3IgdGhlIG5leHQKLSAgYmxvY2sgdG8gYmUgZW1pdHRlZC4gIFRoaXMgaXMgZm9yIGFkdmFuY2VkIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8gY29udHJvbAotICB0aGUgZW1pc3Npb24gb2YgZGVmbGF0ZSBibG9ja3MuCi0KLSAgICBJZiBmbHVzaCBpcyBzZXQgdG8gWl9GVUxMX0ZMVVNILCBhbGwgb3V0cHV0IGlzIGZsdXNoZWQgYXMgd2l0aAotICBaX1NZTkNfRkxVU0gsIGFuZCB0aGUgY29tcHJlc3Npb24gc3RhdGUgaXMgcmVzZXQgc28gdGhhdCBkZWNvbXByZXNzaW9uIGNhbgotICByZXN0YXJ0IGZyb20gdGhpcyBwb2ludCBpZiBwcmV2aW91cyBjb21wcmVzc2VkIGRhdGEgaGFzIGJlZW4gZGFtYWdlZCBvciBpZgotICByYW5kb20gYWNjZXNzIGlzIGRlc2lyZWQuICBVc2luZyBaX0ZVTExfRkxVU0ggdG9vIG9mdGVuIGNhbiBzZXJpb3VzbHkgZGVncmFkZQotICBjb21wcmVzc2lvbi4KLQotICAgIElmIGRlZmxhdGUgcmV0dXJucyB3aXRoIGF2YWlsX291dCA9PSAwLCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGFnYWluCi0gIHdpdGggdGhlIHNhbWUgdmFsdWUgb2YgdGhlIGZsdXNoIHBhcmFtZXRlciBhbmQgbW9yZSBvdXRwdXQgc3BhY2UgKHVwZGF0ZWQKLSAgYXZhaWxfb3V0KSwgdW50aWwgdGhlIGZsdXNoIGlzIGNvbXBsZXRlIChkZWZsYXRlIHJldHVybnMgd2l0aCBub24temVybwotICBhdmFpbF9vdXQpLiAgSW4gdGhlIGNhc2Ugb2YgYSBaX0ZVTExfRkxVU0ggb3IgWl9TWU5DX0ZMVVNILCBtYWtlIHN1cmUgdGhhdAotICBhdmFpbF9vdXQgaXMgZ3JlYXRlciB0aGFuIHNpeCB0byBhdm9pZCByZXBlYXRlZCBmbHVzaCBtYXJrZXJzIGR1ZSB0bwotICBhdmFpbF9vdXQgPT0gMCBvbiByZXR1cm4uCi0KLSAgICBJZiB0aGUgcGFyYW1ldGVyIGZsdXNoIGlzIHNldCB0byBaX0ZJTklTSCwgcGVuZGluZyBpbnB1dCBpcyBwcm9jZXNzZWQsCi0gIHBlbmRpbmcgb3V0cHV0IGlzIGZsdXNoZWQgYW5kIGRlZmxhdGUgcmV0dXJucyB3aXRoIFpfU1RSRUFNX0VORCBpZiB0aGVyZSB3YXMKLSAgZW5vdWdoIG91dHB1dCBzcGFjZTsgaWYgZGVmbGF0ZSByZXR1cm5zIHdpdGggWl9PSywgdGhpcyBmdW5jdGlvbiBtdXN0IGJlCi0gIGNhbGxlZCBhZ2FpbiB3aXRoIFpfRklOSVNIIGFuZCBtb3JlIG91dHB1dCBzcGFjZSAodXBkYXRlZCBhdmFpbF9vdXQpIGJ1dCBubwotICBtb3JlIGlucHV0IGRhdGEsIHVudGlsIGl0IHJldHVybnMgd2l0aCBaX1NUUkVBTV9FTkQgb3IgYW4gZXJyb3IuICBBZnRlcgotICBkZWZsYXRlIGhhcyByZXR1cm5lZCBaX1NUUkVBTV9FTkQsIHRoZSBvbmx5IHBvc3NpYmxlIG9wZXJhdGlvbnMgb24gdGhlIHN0cmVhbQotICBhcmUgZGVmbGF0ZVJlc2V0IG9yIGRlZmxhdGVFbmQuCi0KLSAgICBaX0ZJTklTSCBjYW4gYmUgdXNlZCBpbW1lZGlhdGVseSBhZnRlciBkZWZsYXRlSW5pdCBpZiBhbGwgdGhlIGNvbXByZXNzaW9uCi0gIGlzIHRvIGJlIGRvbmUgaW4gYSBzaW5nbGUgc3RlcC4gIEluIHRoaXMgY2FzZSwgYXZhaWxfb3V0IG11c3QgYmUgYXQgbGVhc3QgdGhlCi0gIHZhbHVlIHJldHVybmVkIGJ5IGRlZmxhdGVCb3VuZCAoc2VlIGJlbG93KS4gIFRoZW4gZGVmbGF0ZSBpcyBndWFyYW50ZWVkIHRvCi0gIHJldHVybiBaX1NUUkVBTV9FTkQuICBJZiBub3QgZW5vdWdoIG91dHB1dCBzcGFjZSBpcyBwcm92aWRlZCwgZGVmbGF0ZSB3aWxsCi0gIG5vdCByZXR1cm4gWl9TVFJFQU1fRU5ELCBhbmQgaXQgbXVzdCBiZSBjYWxsZWQgYWdhaW4gYXMgZGVzY3JpYmVkIGFib3ZlLgotCi0gICAgZGVmbGF0ZSgpIHNldHMgc3RybS0+YWRsZXIgdG8gdGhlIGFkbGVyMzIgY2hlY2tzdW0gb2YgYWxsIGlucHV0IHJlYWQKLSAgc28gZmFyICh0aGF0IGlzLCB0b3RhbF9pbiBieXRlcykuCi0KLSAgICBkZWZsYXRlKCkgbWF5IHVwZGF0ZSBzdHJtLT5kYXRhX3R5cGUgaWYgaXQgY2FuIG1ha2UgYSBnb29kIGd1ZXNzIGFib3V0Ci0gIHRoZSBpbnB1dCBkYXRhIHR5cGUgKFpfQklOQVJZIG9yIFpfVEVYVCkuICBJbiBkb3VidCwgdGhlIGRhdGEgaXMgY29uc2lkZXJlZAotICBiaW5hcnkuICBUaGlzIGZpZWxkIGlzIG9ubHkgZm9yIGluZm9ybWF0aW9uIHB1cnBvc2VzIGFuZCBkb2VzIG5vdCBhZmZlY3QgdGhlCi0gIGNvbXByZXNzaW9uIGFsZ29yaXRobSBpbiBhbnkgbWFubmVyLgotCi0gICAgZGVmbGF0ZSgpIHJldHVybnMgWl9PSyBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQKLSAgcHJvY2Vzc2VkIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgWl9TVFJFQU1fRU5EIGlmIGFsbCBpbnB1dCBoYXMgYmVlbgotICBjb25zdW1lZCBhbmQgYWxsIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCAob25seSB3aGVuIGZsdXNoIGlzIHNldCB0bwotICBaX0ZJTklTSCksIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKLSAgaWYgbmV4dF9pbiBvciBuZXh0X291dCB3YXMgWl9OVUxMKSwgWl9CVUZfRVJST1IgaWYgbm8gcHJvZ3Jlc3MgaXMgcG9zc2libGUKLSAgKGZvciBleGFtcGxlIGF2YWlsX2luIG9yIGF2YWlsX291dCB3YXMgemVybykuICBOb3RlIHRoYXQgWl9CVUZfRVJST1IgaXMgbm90Ci0gIGZhdGFsLCBhbmQgZGVmbGF0ZSgpIGNhbiBiZSBjYWxsZWQgYWdhaW4gd2l0aCBtb3JlIGlucHV0IGFuZCBtb3JlIG91dHB1dAotICBzcGFjZSB0byBjb250aW51ZSBjb21wcmVzc2luZy4KLSovCi0KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlRW5kIE9GKCh6X3N0cmVhbXAgc3RybSkpOwotLyoKLSAgICAgQWxsIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgZm9yIHRoaXMgc3RyZWFtIGFyZSBmcmVlZC4KLSAgIFRoaXMgZnVuY3Rpb24gZGlzY2FyZHMgYW55IHVucHJvY2Vzc2VkIGlucHV0IGFuZCBkb2VzIG5vdCBmbHVzaCBhbnkgcGVuZGluZwotICAgb3V0cHV0LgotCi0gICAgIGRlZmxhdGVFbmQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZQotICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgc3RyZWFtIHdhcyBmcmVlZAotICAgcHJlbWF0dXJlbHkgKHNvbWUgaW5wdXQgb3Igb3V0cHV0IHdhcyBkaXNjYXJkZWQpLiAgSW4gdGhlIGVycm9yIGNhc2UsIG1zZwotICAgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYSBzdGF0aWMgc3RyaW5nICh3aGljaCBtdXN0IG5vdCBiZQotICAgZGVhbGxvY2F0ZWQpLgotKi8KLQotCi0vKgotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdCBPRigoel9zdHJlYW1wIHN0cm0pKTsKLQotICAgICBJbml0aWFsaXplcyB0aGUgaW50ZXJuYWwgc3RyZWFtIHN0YXRlIGZvciBkZWNvbXByZXNzaW9uLiAgVGhlIGZpZWxkcwotICAgbmV4dF9pbiwgYXZhaWxfaW4sIHphbGxvYywgemZyZWUgYW5kIG9wYXF1ZSBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSBieQotICAgdGhlIGNhbGxlci4gIElmIG5leHRfaW4gaXMgbm90IFpfTlVMTCBhbmQgYXZhaWxfaW4gaXMgbGFyZ2UgZW5vdWdoICh0aGUKLSAgIGV4YWN0IHZhbHVlIGRlcGVuZHMgb24gdGhlIGNvbXByZXNzaW9uIG1ldGhvZCksIGluZmxhdGVJbml0IGRldGVybWluZXMgdGhlCi0gICBjb21wcmVzc2lvbiBtZXRob2QgZnJvbSB0aGUgemxpYiBoZWFkZXIgYW5kIGFsbG9jYXRlcyBhbGwgZGF0YSBzdHJ1Y3R1cmVzCi0gICBhY2NvcmRpbmdseTsgb3RoZXJ3aXNlIHRoZSBhbGxvY2F0aW9uIHdpbGwgYmUgZGVmZXJyZWQgdG8gdGhlIGZpcnN0IGNhbGwgb2YKLSAgIGluZmxhdGUuICBJZiB6YWxsb2MgYW5kIHpmcmVlIGFyZSBzZXQgdG8gWl9OVUxMLCBpbmZsYXRlSW5pdCB1cGRhdGVzIHRoZW0gdG8KLSAgIHVzZSBkZWZhdWx0IGFsbG9jYXRpb24gZnVuY3Rpb25zLgotCi0gICAgIGluZmxhdGVJbml0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgbWVtb3J5LCBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZQotICAgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBwYXJhbWV0ZXJzIGFyZQotICAgaW52YWxpZCwgc3VjaCBhcyBhIG51bGwgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlLiAgbXNnIGlzIHNldCB0byBudWxsIGlmCi0gICB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgaW5mbGF0ZUluaXQgZG9lcyBub3QgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbgotICAgYXBhcnQgZnJvbSBwb3NzaWJseSByZWFkaW5nIHRoZSB6bGliIGhlYWRlciBpZiBwcmVzZW50OiBhY3R1YWwgZGVjb21wcmVzc2lvbgotICAgd2lsbCBiZSBkb25lIGJ5IGluZmxhdGUoKS4gIChTbyBuZXh0X2luIGFuZCBhdmFpbF9pbiBtYXkgYmUgbW9kaWZpZWQsIGJ1dAotICAgbmV4dF9vdXQgYW5kIGF2YWlsX291dCBhcmUgdW51c2VkIGFuZCB1bmNoYW5nZWQuKSBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbgotICAgb2YgaW5mbGF0ZUluaXQoKSBkb2VzIG5vdCBwcm9jZXNzIGFueSBoZWFkZXIgaW5mb3JtYXRpb24gLS0gdGhhdCBpcyBkZWZlcnJlZAotICAgdW50aWwgaW5mbGF0ZSgpIGlzIGNhbGxlZC4KLSovCi0KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGZsdXNoKSk7Ci0vKgotICAgIGluZmxhdGUgZGVjb21wcmVzc2VzIGFzIG11Y2ggZGF0YSBhcyBwb3NzaWJsZSwgYW5kIHN0b3BzIHdoZW4gdGhlIGlucHV0Ci0gIGJ1ZmZlciBiZWNvbWVzIGVtcHR5IG9yIHRoZSBvdXRwdXQgYnVmZmVyIGJlY29tZXMgZnVsbC4gIEl0IG1heSBpbnRyb2R1Y2UKLSAgc29tZSBvdXRwdXQgbGF0ZW5jeSAocmVhZGluZyBpbnB1dCB3aXRob3V0IHByb2R1Y2luZyBhbnkgb3V0cHV0KSBleGNlcHQgd2hlbgotICBmb3JjZWQgdG8gZmx1c2guCi0KLSAgVGhlIGRldGFpbGVkIHNlbWFudGljcyBhcmUgYXMgZm9sbG93cy4gIGluZmxhdGUgcGVyZm9ybXMgb25lIG9yIGJvdGggb2YgdGhlCi0gIGZvbGxvd2luZyBhY3Rpb25zOgotCi0gIC0gRGVjb21wcmVzcyBtb3JlIGlucHV0IHN0YXJ0aW5nIGF0IG5leHRfaW4gYW5kIHVwZGF0ZSBuZXh0X2luIGFuZCBhdmFpbF9pbgotICAgIGFjY29yZGluZ2x5LiAgSWYgbm90IGFsbCBpbnB1dCBjYW4gYmUgcHJvY2Vzc2VkIChiZWNhdXNlIHRoZXJlIGlzIG5vdAotICAgIGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyKSwgbmV4dF9pbiBpcyB1cGRhdGVkIGFuZCBwcm9jZXNzaW5nIHdpbGwKLSAgICByZXN1bWUgYXQgdGhpcyBwb2ludCBmb3IgdGhlIG5leHQgY2FsbCBvZiBpbmZsYXRlKCkuCi0KLSAgLSBQcm92aWRlIG1vcmUgb3V0cHV0IHN0YXJ0aW5nIGF0IG5leHRfb3V0IGFuZCB1cGRhdGUgbmV4dF9vdXQgYW5kIGF2YWlsX291dAotICAgIGFjY29yZGluZ2x5LiAgaW5mbGF0ZSgpIHByb3ZpZGVzIGFzIG11Y2ggb3V0cHV0IGFzIHBvc3NpYmxlLCB1bnRpbCB0aGVyZSBpcwotICAgIG5vIG1vcmUgaW5wdXQgZGF0YSBvciBubyBtb3JlIHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyIChzZWUgYmVsb3cgYWJvdXQKLSAgICB0aGUgZmx1c2ggcGFyYW1ldGVyKS4KLQotICAgIEJlZm9yZSB0aGUgY2FsbCBvZiBpbmZsYXRlKCksIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgYXQgbGVhc3QKLSAgb25lIG9mIHRoZSBhY3Rpb25zIGlzIHBvc3NpYmxlLCBieSBwcm92aWRpbmcgbW9yZSBpbnB1dCBhbmQvb3IgY29uc3VtaW5nIG1vcmUKLSAgb3V0cHV0LCBhbmQgdXBkYXRpbmcgdGhlIG5leHRfKiBhbmQgYXZhaWxfKiB2YWx1ZXMgYWNjb3JkaW5nbHkuICBUaGUKLSAgYXBwbGljYXRpb24gY2FuIGNvbnN1bWUgdGhlIHVuY29tcHJlc3NlZCBvdXRwdXQgd2hlbiBpdCB3YW50cywgZm9yIGV4YW1wbGUKLSAgd2hlbiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsIChhdmFpbF9vdXQgPT0gMCksIG9yIGFmdGVyIGVhY2ggY2FsbCBvZgotICBpbmZsYXRlKCkuICBJZiBpbmZsYXRlIHJldHVybnMgWl9PSyBhbmQgd2l0aCB6ZXJvIGF2YWlsX291dCwgaXQgbXVzdCBiZQotICBjYWxsZWQgYWdhaW4gYWZ0ZXIgbWFraW5nIHJvb20gaW4gdGhlIG91dHB1dCBidWZmZXIgYmVjYXVzZSB0aGVyZSBtaWdodCBiZQotICBtb3JlIG91dHB1dCBwZW5kaW5nLgotCi0gICAgVGhlIGZsdXNoIHBhcmFtZXRlciBvZiBpbmZsYXRlKCkgY2FuIGJlIFpfTk9fRkxVU0gsIFpfU1lOQ19GTFVTSCwgWl9GSU5JU0gsCi0gIFpfQkxPQ0ssIG9yIFpfVFJFRVMuICBaX1NZTkNfRkxVU0ggcmVxdWVzdHMgdGhhdCBpbmZsYXRlKCkgZmx1c2ggYXMgbXVjaAotICBvdXRwdXQgYXMgcG9zc2libGUgdG8gdGhlIG91dHB1dCBidWZmZXIuICBaX0JMT0NLIHJlcXVlc3RzIHRoYXQgaW5mbGF0ZSgpCi0gIHN0b3AgaWYgYW5kIHdoZW4gaXQgZ2V0cyB0byB0aGUgbmV4dCBkZWZsYXRlIGJsb2NrIGJvdW5kYXJ5LiAgV2hlbiBkZWNvZGluZwotICB0aGUgemxpYiBvciBnemlwIGZvcm1hdCwgdGhpcyB3aWxsIGNhdXNlIGluZmxhdGUoKSB0byByZXR1cm4gaW1tZWRpYXRlbHkKLSAgYWZ0ZXIgdGhlIGhlYWRlciBhbmQgYmVmb3JlIHRoZSBmaXJzdCBibG9jay4gIFdoZW4gZG9pbmcgYSByYXcgaW5mbGF0ZSwKLSAgaW5mbGF0ZSgpIHdpbGwgZ28gYWhlYWQgYW5kIHByb2Nlc3MgdGhlIGZpcnN0IGJsb2NrLCBhbmQgd2lsbCByZXR1cm4gd2hlbiBpdAotICBnZXRzIHRvIHRoZSBlbmQgb2YgdGhhdCBibG9jaywgb3Igd2hlbiBpdCBydW5zIG91dCBvZiBkYXRhLgotCi0gICAgVGhlIFpfQkxPQ0sgb3B0aW9uIGFzc2lzdHMgaW4gYXBwZW5kaW5nIHRvIG9yIGNvbWJpbmluZyBkZWZsYXRlIHN0cmVhbXMuCi0gIEFsc28gdG8gYXNzaXN0IGluIHRoaXMsIG9uIHJldHVybiBpbmZsYXRlKCkgd2lsbCBzZXQgc3RybS0+ZGF0YV90eXBlIHRvIHRoZQotICBudW1iZXIgb2YgdW51c2VkIGJpdHMgaW4gdGhlIGxhc3QgYnl0ZSB0YWtlbiBmcm9tIHN0cm0tPm5leHRfaW4sIHBsdXMgNjQgaWYKLSAgaW5mbGF0ZSgpIGlzIGN1cnJlbnRseSBkZWNvZGluZyB0aGUgbGFzdCBibG9jayBpbiB0aGUgZGVmbGF0ZSBzdHJlYW0sIHBsdXMKLSAgMTI4IGlmIGluZmxhdGUoKSByZXR1cm5lZCBpbW1lZGlhdGVseSBhZnRlciBkZWNvZGluZyBhbiBlbmQtb2YtYmxvY2sgY29kZSBvcgotICBkZWNvZGluZyB0aGUgY29tcGxldGUgaGVhZGVyIHVwIHRvIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBkZWZsYXRlCi0gIHN0cmVhbS4gIFRoZSBlbmQtb2YtYmxvY2sgd2lsbCBub3QgYmUgaW5kaWNhdGVkIHVudGlsIGFsbCBvZiB0aGUgdW5jb21wcmVzc2VkCi0gIGRhdGEgZnJvbSB0aGF0IGJsb2NrIGhhcyBiZWVuIHdyaXR0ZW4gdG8gc3RybS0+bmV4dF9vdXQuICBUaGUgbnVtYmVyIG9mCi0gIHVudXNlZCBiaXRzIG1heSBpbiBnZW5lcmFsIGJlIGdyZWF0ZXIgdGhhbiBzZXZlbiwgZXhjZXB0IHdoZW4gYml0IDcgb2YKLSAgZGF0YV90eXBlIGlzIHNldCwgaW4gd2hpY2ggY2FzZSB0aGUgbnVtYmVyIG9mIHVudXNlZCBiaXRzIHdpbGwgYmUgbGVzcyB0aGFuCi0gIGVpZ2h0LiAgZGF0YV90eXBlIGlzIHNldCBhcyBub3RlZCBoZXJlIGV2ZXJ5IHRpbWUgaW5mbGF0ZSgpIHJldHVybnMgZm9yIGFsbAotICBmbHVzaCBvcHRpb25zLCBhbmQgc28gY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgY3VycmVudGx5Ci0gIGNvbnN1bWVkIGlucHV0IGluIGJpdHMuCi0KLSAgICBUaGUgWl9UUkVFUyBvcHRpb24gYmVoYXZlcyBhcyBaX0JMT0NLIGRvZXMsIGJ1dCBpdCBhbHNvIHJldHVybnMgd2hlbiB0aGUKLSAgZW5kIG9mIGVhY2ggZGVmbGF0ZSBibG9jayBoZWFkZXIgaXMgcmVhY2hlZCwgYmVmb3JlIGFueSBhY3R1YWwgZGF0YSBpbiB0aGF0Ci0gIGJsb2NrIGlzIGRlY29kZWQuICBUaGlzIGFsbG93cyB0aGUgY2FsbGVyIHRvIGRldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoZQotICBkZWZsYXRlIGJsb2NrIGhlYWRlciBmb3IgbGF0ZXIgdXNlIGluIHJhbmRvbSBhY2Nlc3Mgd2l0aGluIGEgZGVmbGF0ZSBibG9jay4KLSAgMjU2IGlzIGFkZGVkIHRvIHRoZSB2YWx1ZSBvZiBzdHJtLT5kYXRhX3R5cGUgd2hlbiBpbmZsYXRlKCkgcmV0dXJucwotICBpbW1lZGlhdGVseSBhZnRlciByZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBkZWZsYXRlIGJsb2NrIGhlYWRlci4KLQotICAgIGluZmxhdGUoKSBzaG91bGQgbm9ybWFsbHkgYmUgY2FsbGVkIHVudGlsIGl0IHJldHVybnMgWl9TVFJFQU1fRU5EIG9yIGFuCi0gIGVycm9yLiAgSG93ZXZlciBpZiBhbGwgZGVjb21wcmVzc2lvbiBpcyB0byBiZSBwZXJmb3JtZWQgaW4gYSBzaW5nbGUgc3RlcCAoYQotICBzaW5nbGUgY2FsbCBvZiBpbmZsYXRlKSwgdGhlIHBhcmFtZXRlciBmbHVzaCBzaG91bGQgYmUgc2V0IHRvIFpfRklOSVNILiAgSW4KLSAgdGhpcyBjYXNlIGFsbCBwZW5kaW5nIGlucHV0IGlzIHByb2Nlc3NlZCBhbmQgYWxsIHBlbmRpbmcgb3V0cHV0IGlzIGZsdXNoZWQ7Ci0gIGF2YWlsX291dCBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBob2xkIGFsbCBvZiB0aGUgdW5jb21wcmVzc2VkIGRhdGEgZm9yIHRoZQotICBvcGVyYXRpb24gdG8gY29tcGxldGUuICAoVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG1heSBoYXZlIGJlZW4KLSAgc2F2ZWQgYnkgdGhlIGNvbXByZXNzb3IgZm9yIHRoaXMgcHVycG9zZS4pIFRoZSB1c2Ugb2YgWl9GSU5JU0ggaXMgbm90Ci0gIHJlcXVpcmVkIHRvIHBlcmZvcm0gYW4gaW5mbGF0aW9uIGluIG9uZSBzdGVwLiAgSG93ZXZlciBpdCBtYXkgYmUgdXNlZCB0bwotICBpbmZvcm0gaW5mbGF0ZSB0aGF0IGEgZmFzdGVyIGFwcHJvYWNoIGNhbiBiZSB1c2VkIGZvciB0aGUgc2luZ2xlIGluZmxhdGUoKQotICBjYWxsLiAgWl9GSU5JU0ggYWxzbyBpbmZvcm1zIGluZmxhdGUgdG8gbm90IG1haW50YWluIGEgc2xpZGluZyB3aW5kb3cgaWYgdGhlCi0gIHN0cmVhbSBjb21wbGV0ZXMsIHdoaWNoIHJlZHVjZXMgaW5mbGF0ZSdzIG1lbW9yeSBmb290cHJpbnQuICBJZiB0aGUgc3RyZWFtCi0gIGRvZXMgbm90IGNvbXBsZXRlLCBlaXRoZXIgYmVjYXVzZSBub3QgYWxsIG9mIHRoZSBzdHJlYW0gaXMgcHJvdmlkZWQgb3Igbm90Ci0gIGVub3VnaCBvdXRwdXQgc3BhY2UgaXMgcHJvdmlkZWQsIHRoZW4gYSBzbGlkaW5nIHdpbmRvdyB3aWxsIGJlIGFsbG9jYXRlZCBhbmQKLSAgaW5mbGF0ZSgpIGNhbiBiZSBjYWxsZWQgYWdhaW4gdG8gY29udGludWUgdGhlIG9wZXJhdGlvbiBhcyBpZiBaX05PX0ZMVVNIIGhhZAotICBiZWVuIHVzZWQuCi0KLSAgICAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgaW5mbGF0ZSgpIGFsd2F5cyBmbHVzaGVzIGFzIG11Y2ggb3V0cHV0IGFzCi0gIHBvc3NpYmxlIHRvIHRoZSBvdXRwdXQgYnVmZmVyLCBhbmQgYWx3YXlzIHVzZXMgdGhlIGZhc3RlciBhcHByb2FjaCBvbiB0aGUKLSAgZmlyc3QgY2FsbC4gIFNvIHRoZSBlZmZlY3RzIG9mIHRoZSBmbHVzaCBwYXJhbWV0ZXIgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBhcmUKLSAgb24gdGhlIHJldHVybiB2YWx1ZSBvZiBpbmZsYXRlKCkgYXMgbm90ZWQgYmVsb3csIHdoZW4gaW5mbGF0ZSgpIHJldHVybnMgZWFybHkKLSAgd2hlbiBaX0JMT0NLIG9yIFpfVFJFRVMgaXMgdXNlZCwgYW5kIHdoZW4gaW5mbGF0ZSgpIGF2b2lkcyB0aGUgYWxsb2NhdGlvbiBvZgotICBtZW1vcnkgZm9yIGEgc2xpZGluZyB3aW5kb3cgd2hlbiBaX0ZJTklTSCBpcyB1c2VkLgotCi0gICAgIElmIGEgcHJlc2V0IGRpY3Rpb25hcnkgaXMgbmVlZGVkIGFmdGVyIHRoaXMgY2FsbCAoc2VlIGluZmxhdGVTZXREaWN0aW9uYXJ5Ci0gIGJlbG93KSwgaW5mbGF0ZSBzZXRzIHN0cm0tPmFkbGVyIHRvIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZiB0aGUgZGljdGlvbmFyeQotICBjaG9zZW4gYnkgdGhlIGNvbXByZXNzb3IgYW5kIHJldHVybnMgWl9ORUVEX0RJQ1Q7IG90aGVyd2lzZSBpdCBzZXRzCi0gIHN0cm0tPmFkbGVyIHRvIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZiBhbGwgb3V0cHV0IHByb2R1Y2VkIHNvIGZhciAodGhhdCBpcywKLSAgdG90YWxfb3V0IGJ5dGVzKSBhbmQgcmV0dXJucyBaX09LLCBaX1NUUkVBTV9FTkQgb3IgYW4gZXJyb3IgY29kZSBhcyBkZXNjcmliZWQKLSAgYmVsb3cuICBBdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0sIGluZmxhdGUoKSBjaGVja3MgdGhhdCBpdHMgY29tcHV0ZWQgYWRsZXIzMgotICBjaGVja3N1bSBpcyBlcXVhbCB0byB0aGF0IHNhdmVkIGJ5IHRoZSBjb21wcmVzc29yIGFuZCByZXR1cm5zIFpfU1RSRUFNX0VORAotICBvbmx5IGlmIHRoZSBjaGVja3N1bSBpcyBjb3JyZWN0LgotCi0gICAgaW5mbGF0ZSgpIGNhbiBkZWNvbXByZXNzIGFuZCBjaGVjayBlaXRoZXIgemxpYi13cmFwcGVkIG9yIGd6aXAtd3JhcHBlZAotICBkZWZsYXRlIGRhdGEuICBUaGUgaGVhZGVyIHR5cGUgaXMgZGV0ZWN0ZWQgYXV0b21hdGljYWxseSwgaWYgcmVxdWVzdGVkIHdoZW4KLSAgaW5pdGlhbGl6aW5nIHdpdGggaW5mbGF0ZUluaXQyKCkuICBBbnkgaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSBnemlwCi0gIGhlYWRlciBpcyBub3QgcmV0YWluZWQsIHNvIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdGhhdCBpbmZvcm1hdGlvbiBzaG91bGQKLSAgaW5zdGVhZCB1c2UgcmF3IGluZmxhdGUsIHNlZSBpbmZsYXRlSW5pdDIoKSBiZWxvdywgb3IgaW5mbGF0ZUJhY2soKSBhbmQKLSAgcGVyZm9ybSB0aGVpciBvd24gcHJvY2Vzc2luZyBvZiB0aGUgZ3ppcCBoZWFkZXIgYW5kIHRyYWlsZXIuICBXaGVuIHByb2Nlc3NpbmcKLSAgZ3ppcC13cmFwcGVkIGRlZmxhdGUgZGF0YSwgc3RybS0+YWRsZXIzMiBpcyBzZXQgdG8gdGhlIENSQy0zMiBvZiB0aGUgb3V0cHV0Ci0gIHByb2R1Y3RlZCBzbyBmYXIuICBUaGUgQ1JDLTMyIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgZ3ppcCB0cmFpbGVyLgotCi0gICAgaW5mbGF0ZSgpIHJldHVybnMgWl9PSyBpZiBzb21lIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgKG1vcmUgaW5wdXQgcHJvY2Vzc2VkCi0gIG9yIG1vcmUgb3V0cHV0IHByb2R1Y2VkKSwgWl9TVFJFQU1fRU5EIGlmIHRoZSBlbmQgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSBoYXMKLSAgYmVlbiByZWFjaGVkIGFuZCBhbGwgdW5jb21wcmVzc2VkIG91dHB1dCBoYXMgYmVlbiBwcm9kdWNlZCwgWl9ORUVEX0RJQ1QgaWYgYQotICBwcmVzZXQgZGljdGlvbmFyeSBpcyBuZWVkZWQgYXQgdGhpcyBwb2ludCwgWl9EQVRBX0VSUk9SIGlmIHRoZSBpbnB1dCBkYXRhIHdhcwotICBjb3JydXB0ZWQgKGlucHV0IHN0cmVhbSBub3QgY29uZm9ybWluZyB0byB0aGUgemxpYiBmb3JtYXQgb3IgaW5jb3JyZWN0IGNoZWNrCi0gIHZhbHVlKSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdHJ1Y3R1cmUgd2FzIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUKLSAgbmV4dF9pbiBvciBuZXh0X291dCB3YXMgWl9OVUxMKSwgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5LAotICBaX0JVRl9FUlJPUiBpZiBubyBwcm9ncmVzcyBpcyBwb3NzaWJsZSBvciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZQotICBvdXRwdXQgYnVmZmVyIHdoZW4gWl9GSU5JU0ggaXMgdXNlZC4gIE5vdGUgdGhhdCBaX0JVRl9FUlJPUiBpcyBub3QgZmF0YWwsIGFuZAotICBpbmZsYXRlKCkgY2FuIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIG1vcmUgaW5wdXQgYW5kIG1vcmUgb3V0cHV0IHNwYWNlIHRvCi0gIGNvbnRpbnVlIGRlY29tcHJlc3NpbmcuICBJZiBaX0RBVEFfRVJST1IgaXMgcmV0dXJuZWQsIHRoZSBhcHBsaWNhdGlvbiBtYXkKLSAgdGhlbiBjYWxsIGluZmxhdGVTeW5jKCkgdG8gbG9vayBmb3IgYSBnb29kIGNvbXByZXNzaW9uIGJsb2NrIGlmIGEgcGFydGlhbAotICByZWNvdmVyeSBvZiB0aGUgZGF0YSBpcyBkZXNpcmVkLgotKi8KLQotCi1aRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVFbmQgT0YoKHpfc3RyZWFtcCBzdHJtKSk7Ci0vKgotICAgICBBbGwgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhpcyBzdHJlYW0gYXJlIGZyZWVkLgotICAgVGhpcyBmdW5jdGlvbiBkaXNjYXJkcyBhbnkgdW5wcm9jZXNzZWQgaW5wdXQgYW5kIGRvZXMgbm90IGZsdXNoIGFueSBwZW5kaW5nCi0gICBvdXRwdXQuCi0KLSAgICAgaW5mbGF0ZUVuZCByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHN0cmVhbSBzdGF0ZQotICAgd2FzIGluY29uc2lzdGVudC4gIEluIHRoZSBlcnJvciBjYXNlLCBtc2cgbWF5IGJlIHNldCBidXQgdGhlbiBwb2ludHMgdG8gYQotICAgc3RhdGljIHN0cmluZyAod2hpY2ggbXVzdCBub3QgYmUgZGVhbGxvY2F0ZWQpLgotKi8KLQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBBZHZhbmNlZCBmdW5jdGlvbnMgKi8KLQotLyoKLSAgICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgbmVlZGVkIG9ubHkgaW4gc29tZSBzcGVjaWFsIGFwcGxpY2F0aW9ucy4KLSovCi0KLS8qCi1aRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVJbml0MiBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHdpbmRvd0JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBtZW1MZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHN0cmF0ZWd5KSk7Ci0KLSAgICAgVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgZGVmbGF0ZUluaXQgd2l0aCBtb3JlIGNvbXByZXNzaW9uIG9wdGlvbnMuICBUaGUKLSAgIGZpZWxkcyBuZXh0X2luLCB6YWxsb2MsIHpmcmVlIGFuZCBvcGFxdWUgbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgYnkgdGhlCi0gICBjYWxsZXIuCi0KLSAgICAgVGhlIG1ldGhvZCBwYXJhbWV0ZXIgaXMgdGhlIGNvbXByZXNzaW9uIG1ldGhvZC4gIEl0IG11c3QgYmUgWl9ERUZMQVRFRCBpbgotICAgdGhpcyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LgotCi0gICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSB3aW5kb3cgc2l6ZQotICAgKHRoZSBzaXplIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlcikuICBJdCBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIDguLjE1IGZvciB0aGlzCi0gICB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LiAgTGFyZ2VyIHZhbHVlcyBvZiB0aGlzIHBhcmFtZXRlciByZXN1bHQgaW4gYmV0dGVyCi0gICBjb21wcmVzc2lvbiBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZgotICAgZGVmbGF0ZUluaXQgaXMgdXNlZCBpbnN0ZWFkLgotCi0gICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgLTguLi0xNSBmb3IgcmF3IGRlZmxhdGUuICBJbiB0aGlzIGNhc2UsIC13aW5kb3dCaXRzCi0gICBkZXRlcm1pbmVzIHRoZSB3aW5kb3cgc2l6ZS4gIGRlZmxhdGUoKSB3aWxsIHRoZW4gZ2VuZXJhdGUgcmF3IGRlZmxhdGUgZGF0YQotICAgd2l0aCBubyB6bGliIGhlYWRlciBvciB0cmFpbGVyLCBhbmQgd2lsbCBub3QgY29tcHV0ZSBhbiBhZGxlcjMyIGNoZWNrIHZhbHVlLgotCi0gICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgZ3JlYXRlciB0aGFuIDE1IGZvciBvcHRpb25hbCBnemlwIGVuY29kaW5nLiAgQWRkCi0gICAxNiB0byB3aW5kb3dCaXRzIHRvIHdyaXRlIGEgc2ltcGxlIGd6aXAgaGVhZGVyIGFuZCB0cmFpbGVyIGFyb3VuZCB0aGUKLSAgIGNvbXByZXNzZWQgZGF0YSBpbnN0ZWFkIG9mIGEgemxpYiB3cmFwcGVyLiAgVGhlIGd6aXAgaGVhZGVyIHdpbGwgaGF2ZSBubwotICAgZmlsZSBuYW1lLCBubyBleHRyYSBkYXRhLCBubyBjb21tZW50LCBubyBtb2RpZmljYXRpb24gdGltZSAoc2V0IHRvIHplcm8pLCBubwotICAgaGVhZGVyIGNyYywgYW5kIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHdpbGwgYmUgc2V0IHRvIDI1NSAodW5rbm93bikuICBJZiBhCi0gICBnemlwIHN0cmVhbSBpcyBiZWluZyB3cml0dGVuLCBzdHJtLT5hZGxlciBpcyBhIGNyYzMyIGluc3RlYWQgb2YgYW4gYWRsZXIzMi4KLQotICAgICBUaGUgbWVtTGV2ZWwgcGFyYW1ldGVyIHNwZWNpZmllcyBob3cgbXVjaCBtZW1vcnkgc2hvdWxkIGJlIGFsbG9jYXRlZAotICAgZm9yIHRoZSBpbnRlcm5hbCBjb21wcmVzc2lvbiBzdGF0ZS4gIG1lbUxldmVsPTEgdXNlcyBtaW5pbXVtIG1lbW9yeSBidXQgaXMKLSAgIHNsb3cgYW5kIHJlZHVjZXMgY29tcHJlc3Npb24gcmF0aW87IG1lbUxldmVsPTkgdXNlcyBtYXhpbXVtIG1lbW9yeSBmb3IKLSAgIG9wdGltYWwgc3BlZWQuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA4LiAgU2VlIHpjb25mLmggZm9yIHRvdGFsIG1lbW9yeSB1c2FnZQotICAgYXMgYSBmdW5jdGlvbiBvZiB3aW5kb3dCaXRzIGFuZCBtZW1MZXZlbC4KLQotICAgICBUaGUgc3RyYXRlZ3kgcGFyYW1ldGVyIGlzIHVzZWQgdG8gdHVuZSB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtLiAgVXNlIHRoZQotICAgdmFsdWUgWl9ERUZBVUxUX1NUUkFURUdZIGZvciBub3JtYWwgZGF0YSwgWl9GSUxURVJFRCBmb3IgZGF0YSBwcm9kdWNlZCBieSBhCi0gICBmaWx0ZXIgKG9yIHByZWRpY3RvciksIFpfSFVGRk1BTl9PTkxZIHRvIGZvcmNlIEh1ZmZtYW4gZW5jb2Rpbmcgb25seSAobm8KLSAgIHN0cmluZyBtYXRjaCksIG9yIFpfUkxFIHRvIGxpbWl0IG1hdGNoIGRpc3RhbmNlcyB0byBvbmUgKHJ1bi1sZW5ndGgKLSAgIGVuY29kaW5nKS4gIEZpbHRlcmVkIGRhdGEgY29uc2lzdHMgbW9zdGx5IG9mIHNtYWxsIHZhbHVlcyB3aXRoIGEgc29tZXdoYXQKLSAgIHJhbmRvbSBkaXN0cmlidXRpb24uICBJbiB0aGlzIGNhc2UsIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG0gaXMgdHVuZWQgdG8KLSAgIGNvbXByZXNzIHRoZW0gYmV0dGVyLiAgVGhlIGVmZmVjdCBvZiBaX0ZJTFRFUkVEIGlzIHRvIGZvcmNlIG1vcmUgSHVmZm1hbgotICAgY29kaW5nIGFuZCBsZXNzIHN0cmluZyBtYXRjaGluZzsgaXQgaXMgc29tZXdoYXQgaW50ZXJtZWRpYXRlIGJldHdlZW4KLSAgIFpfREVGQVVMVF9TVFJBVEVHWSBhbmQgWl9IVUZGTUFOX09OTFkuICBaX1JMRSBpcyBkZXNpZ25lZCB0byBiZSBhbG1vc3QgYXMKLSAgIGZhc3QgYXMgWl9IVUZGTUFOX09OTFksIGJ1dCBnaXZlIGJldHRlciBjb21wcmVzc2lvbiBmb3IgUE5HIGltYWdlIGRhdGEuICBUaGUKLSAgIHN0cmF0ZWd5IHBhcmFtZXRlciBvbmx5IGFmZmVjdHMgdGhlIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBub3QgdGhlCi0gICBjb3JyZWN0bmVzcyBvZiB0aGUgY29tcHJlc3NlZCBvdXRwdXQgZXZlbiBpZiBpdCBpcyBub3Qgc2V0IGFwcHJvcHJpYXRlbHkuCi0gICBaX0ZJWEVEIHByZXZlbnRzIHRoZSB1c2Ugb2YgZHluYW1pYyBIdWZmbWFuIGNvZGVzLCBhbGxvd2luZyBmb3IgYSBzaW1wbGVyCi0gICBkZWNvZGVyIGZvciBzcGVjaWFsIGFwcGxpY2F0aW9ucy4KLQotICAgICBkZWZsYXRlSW5pdDIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfTUVNX0VSUk9SIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoCi0gICBtZW1vcnksIFpfU1RSRUFNX0VSUk9SIGlmIGFueSBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoc3VjaCBhcyBhbiBpbnZhbGlkCi0gICBtZXRob2QpLCBvciBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uICh6bGliX3ZlcnNpb24pIGlzCi0gICBpbmNvbXBhdGlibGUgd2l0aCB0aGUgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIgKFpMSUJfVkVSU0lPTikuICBtc2cgaXMKLSAgIHNldCB0byBudWxsIGlmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UuICBkZWZsYXRlSW5pdDIgZG9lcyBub3QgcGVyZm9ybSBhbnkKLSAgIGNvbXByZXNzaW9uOiB0aGlzIHdpbGwgYmUgZG9uZSBieSBkZWZsYXRlKCkuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVTZXREaWN0aW9uYXJ5IE9GKCh6X3N0cmVhbXAgc3RybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpkaWN0aW9uYXJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUludCAgZGljdExlbmd0aCkpOwotLyoKLSAgICAgSW5pdGlhbGl6ZXMgdGhlIGNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gYnl0ZSBzZXF1ZW5jZQotICAgd2l0aG91dCBwcm9kdWNpbmcgYW55IGNvbXByZXNzZWQgb3V0cHV0LiAgV2hlbiB1c2luZyB0aGUgemxpYiBmb3JtYXQsIHRoaXMKLSAgIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGRlZmxhdGVJbml0LCBkZWZsYXRlSW5pdDIgb3IKLSAgIGRlZmxhdGVSZXNldCwgYW5kIGJlZm9yZSBhbnkgY2FsbCBvZiBkZWZsYXRlLiAgV2hlbiBkb2luZyByYXcgZGVmbGF0ZSwgdGhpcwotICAgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgZWl0aGVyIGJlZm9yZSBhbnkgY2FsbCBvZiBkZWZsYXRlLCBvciBpbW1lZGlhdGVseQotICAgYWZ0ZXIgdGhlIGNvbXBsZXRpb24gb2YgYSBkZWZsYXRlIGJsb2NrLCBpLmUuIGFmdGVyIGFsbCBpbnB1dCBoYXMgYmVlbgotICAgY29uc3VtZWQgYW5kIGFsbCBvdXRwdXQgaGFzIGJlZW4gZGVsaXZlcmVkIHdoZW4gdXNpbmcgYW55IG9mIHRoZSBmbHVzaAotICAgb3B0aW9ucyBaX0JMT0NLLCBaX1BBUlRJQUxfRkxVU0gsIFpfU1lOQ19GTFVTSCwgb3IgWl9GVUxMX0ZMVVNILiAgVGhlCi0gICBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCB1c2UgZXhhY3RseSB0aGUgc2FtZSBkaWN0aW9uYXJ5IChzZWUKLSAgIGluZmxhdGVTZXREaWN0aW9uYXJ5KS4KLQotICAgICBUaGUgZGljdGlvbmFyeSBzaG91bGQgY29uc2lzdCBvZiBzdHJpbmdzIChieXRlIHNlcXVlbmNlcykgdGhhdCBhcmUgbGlrZWx5Ci0gICB0byBiZSBlbmNvdW50ZXJlZCBsYXRlciBpbiB0aGUgZGF0YSB0byBiZSBjb21wcmVzc2VkLCB3aXRoIHRoZSBtb3N0IGNvbW1vbmx5Ci0gICB1c2VkIHN0cmluZ3MgcHJlZmVyYWJseSBwdXQgdG93YXJkcyB0aGUgZW5kIG9mIHRoZSBkaWN0aW9uYXJ5LiAgVXNpbmcgYQotICAgZGljdGlvbmFyeSBpcyBtb3N0IHVzZWZ1bCB3aGVuIHRoZSBkYXRhIHRvIGJlIGNvbXByZXNzZWQgaXMgc2hvcnQgYW5kIGNhbiBiZQotICAgcHJlZGljdGVkIHdpdGggZ29vZCBhY2N1cmFjeTsgdGhlIGRhdGEgY2FuIHRoZW4gYmUgY29tcHJlc3NlZCBiZXR0ZXIgdGhhbgotICAgd2l0aCB0aGUgZGVmYXVsdCBlbXB0eSBkaWN0aW9uYXJ5LgotCi0gICAgIERlcGVuZGluZyBvbiB0aGUgc2l6ZSBvZiB0aGUgY29tcHJlc3Npb24gZGF0YSBzdHJ1Y3R1cmVzIHNlbGVjdGVkIGJ5Ci0gICBkZWZsYXRlSW5pdCBvciBkZWZsYXRlSW5pdDIsIGEgcGFydCBvZiB0aGUgZGljdGlvbmFyeSBtYXkgaW4gZWZmZWN0IGJlCi0gICBkaXNjYXJkZWQsIGZvciBleGFtcGxlIGlmIHRoZSBkaWN0aW9uYXJ5IGlzIGxhcmdlciB0aGFuIHRoZSB3aW5kb3cgc2l6ZQotICAgcHJvdmlkZWQgaW4gZGVmbGF0ZUluaXQgb3IgZGVmbGF0ZUluaXQyLiAgVGh1cyB0aGUgc3RyaW5ncyBtb3N0IGxpa2VseSB0byBiZQotICAgdXNlZnVsIHNob3VsZCBiZSBwdXQgYXQgdGhlIGVuZCBvZiB0aGUgZGljdGlvbmFyeSwgbm90IGF0IHRoZSBmcm9udC4gIEluCi0gICBhZGRpdGlvbiwgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZGVmbGF0ZSB3aWxsIHVzZSBhdCBtb3N0IHRoZSB3aW5kb3cKLSAgIHNpemUgbWludXMgMjYyIGJ5dGVzIG9mIHRoZSBwcm92aWRlZCBkaWN0aW9uYXJ5LgotCi0gICAgIFVwb24gcmV0dXJuIG9mIHRoaXMgZnVuY3Rpb24sIHN0cm0tPmFkbGVyIGlzIHNldCB0byB0aGUgYWRsZXIzMiB2YWx1ZQotICAgb2YgdGhlIGRpY3Rpb25hcnk7IHRoZSBkZWNvbXByZXNzb3IgbWF5IGxhdGVyIHVzZSB0aGlzIHZhbHVlIHRvIGRldGVybWluZQotICAgd2hpY2ggZGljdGlvbmFyeSBoYXMgYmVlbiB1c2VkIGJ5IHRoZSBjb21wcmVzc29yLiAgKFRoZSBhZGxlcjMyIHZhbHVlCi0gICBhcHBsaWVzIHRvIHRoZSB3aG9sZSBkaWN0aW9uYXJ5IGV2ZW4gaWYgb25seSBhIHN1YnNldCBvZiB0aGUgZGljdGlvbmFyeSBpcwotICAgYWN0dWFsbHkgdXNlZCBieSB0aGUgY29tcHJlc3Nvci4pIElmIGEgcmF3IGRlZmxhdGUgd2FzIHJlcXVlc3RlZCwgdGhlbiB0aGUKLSAgIGFkbGVyMzIgdmFsdWUgaXMgbm90IGNvbXB1dGVkIGFuZCBzdHJtLT5hZGxlciBpcyBub3Qgc2V0LgotCi0gICAgIGRlZmxhdGVTZXREaWN0aW9uYXJ5IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiBhCi0gICBwYXJhbWV0ZXIgaXMgaW52YWxpZCAoZS5nLiAgZGljdGlvbmFyeSBiZWluZyBaX05VTEwpIG9yIHRoZSBzdHJlYW0gc3RhdGUgaXMKLSAgIGluY29uc2lzdGVudCAoZm9yIGV4YW1wbGUgaWYgZGVmbGF0ZSBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBmb3IgdGhpcyBzdHJlYW0KLSAgIG9yIGlmIG5vdCBhdCBhIGJsb2NrIGJvdW5kYXJ5IGZvciByYXcgZGVmbGF0ZSkuICBkZWZsYXRlU2V0RGljdGlvbmFyeSBkb2VzCi0gICBub3QgcGVyZm9ybSBhbnkgY29tcHJlc3Npb246IHRoaXMgd2lsbCBiZSBkb25lIGJ5IGRlZmxhdGUoKS4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUNvcHkgT0YoKHpfc3RyZWFtcCBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgel9zdHJlYW1wIHNvdXJjZSkpOwotLyoKLSAgICAgU2V0cyB0aGUgZGVzdGluYXRpb24gc3RyZWFtIGFzIGEgY29tcGxldGUgY29weSBvZiB0aGUgc291cmNlIHN0cmVhbS4KLQotICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiBzZXZlcmFsIGNvbXByZXNzaW9uIHN0cmF0ZWdpZXMgd2lsbCBiZQotICAgdHJpZWQsIGZvciBleGFtcGxlIHdoZW4gdGhlcmUgYXJlIHNldmVyYWwgd2F5cyBvZiBwcmUtcHJvY2Vzc2luZyB0aGUgaW5wdXQKLSAgIGRhdGEgd2l0aCBhIGZpbHRlci4gIFRoZSBzdHJlYW1zIHRoYXQgd2lsbCBiZSBkaXNjYXJkZWQgc2hvdWxkIHRoZW4gYmUgZnJlZWQKLSAgIGJ5IGNhbGxpbmcgZGVmbGF0ZUVuZC4gIE5vdGUgdGhhdCBkZWZsYXRlQ29weSBkdXBsaWNhdGVzIHRoZSBpbnRlcm5hbAotICAgY29tcHJlc3Npb24gc3RhdGUgd2hpY2ggY2FuIGJlIHF1aXRlIGxhcmdlLCBzbyB0aGlzIHN0cmF0ZWd5IGlzIHNsb3cgYW5kIGNhbgotICAgY29uc3VtZSBsb3RzIG9mIG1lbW9yeS4KLQotICAgICBkZWZsYXRlQ29weSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAotICAgZW5vdWdoIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudAotICAgKHN1Y2ggYXMgemFsbG9jIGJlaW5nIFpfTlVMTCkuICBtc2cgaXMgbGVmdCB1bmNoYW5nZWQgaW4gYm90aCBzb3VyY2UgYW5kCi0gICBkZXN0aW5hdGlvbi4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVJlc2V0IE9GKCh6X3N0cmVhbXAgc3RybSkpOwotLyoKLSAgICAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGRlZmxhdGVFbmQgZm9sbG93ZWQgYnkgZGVmbGF0ZUluaXQsCi0gICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLiAgVGhlCi0gICBzdHJlYW0gd2lsbCBrZWVwIHRoZSBzYW1lIGNvbXByZXNzaW9uIGxldmVsIGFuZCBhbnkgb3RoZXIgYXR0cmlidXRlcyB0aGF0Ci0gICBtYXkgaGF2ZSBiZWVuIHNldCBieSBkZWZsYXRlSW5pdDIuCi0KLSAgICAgZGVmbGF0ZVJlc2V0IHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCi0gICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudCAoc3VjaCBhcyB6YWxsb2Mgb3Igc3RhdGUgYmVpbmcgWl9OVUxMKS4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZVBhcmFtcyBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmF0ZWd5KSk7Ci0vKgotICAgICBEeW5hbWljYWxseSB1cGRhdGUgdGhlIGNvbXByZXNzaW9uIGxldmVsIGFuZCBjb21wcmVzc2lvbiBzdHJhdGVneS4gIFRoZQotICAgaW50ZXJwcmV0YXRpb24gb2YgbGV2ZWwgYW5kIHN0cmF0ZWd5IGlzIGFzIGluIGRlZmxhdGVJbml0Mi4gIFRoaXMgY2FuIGJlCi0gICB1c2VkIHRvIHN3aXRjaCBiZXR3ZWVuIGNvbXByZXNzaW9uIGFuZCBzdHJhaWdodCBjb3B5IG9mIHRoZSBpbnB1dCBkYXRhLCBvcgotICAgdG8gc3dpdGNoIHRvIGEgZGlmZmVyZW50IGtpbmQgb2YgaW5wdXQgZGF0YSByZXF1aXJpbmcgYSBkaWZmZXJlbnQgc3RyYXRlZ3kuCi0gICBJZiB0aGUgY29tcHJlc3Npb24gbGV2ZWwgaXMgY2hhbmdlZCwgdGhlIGlucHV0IGF2YWlsYWJsZSBzbyBmYXIgaXMKLSAgIGNvbXByZXNzZWQgd2l0aCB0aGUgb2xkIGxldmVsIChhbmQgbWF5IGJlIGZsdXNoZWQpOyB0aGUgbmV3IGxldmVsIHdpbGwgdGFrZQotICAgZWZmZWN0IG9ubHkgYXQgdGhlIG5leHQgY2FsbCBvZiBkZWZsYXRlKCkuCi0KLSAgICAgQmVmb3JlIHRoZSBjYWxsIG9mIGRlZmxhdGVQYXJhbXMsIHRoZSBzdHJlYW0gc3RhdGUgbXVzdCBiZSBzZXQgYXMgZm9yCi0gICBhIGNhbGwgb2YgZGVmbGF0ZSgpLCBzaW5jZSB0aGUgY3VycmVudGx5IGF2YWlsYWJsZSBpbnB1dCBtYXkgaGF2ZSB0byBiZQotICAgY29tcHJlc3NlZCBhbmQgZmx1c2hlZC4gIEluIHBhcnRpY3VsYXIsIHN0cm0tPmF2YWlsX291dCBtdXN0IGJlIG5vbi16ZXJvLgotCi0gICAgIGRlZmxhdGVQYXJhbXMgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKLSAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IG9yIGlmIGEgcGFyYW1ldGVyIHdhcyBpbnZhbGlkLCBaX0JVRl9FUlJPUiBpZgotICAgc3RybS0+YXZhaWxfb3V0IHdhcyB6ZXJvLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlVHVuZSBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ29vZF9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2xhenksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmljZV9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2NoYWluKSk7Ci0vKgotICAgICBGaW5lIHR1bmUgZGVmbGF0ZSdzIGludGVybmFsIGNvbXByZXNzaW9uIHBhcmFtZXRlcnMuICBUaGlzIHNob3VsZCBvbmx5IGJlCi0gICB1c2VkIGJ5IHNvbWVvbmUgd2hvIHVuZGVyc3RhbmRzIHRoZSBhbGdvcml0aG0gdXNlZCBieSB6bGliJ3MgZGVmbGF0ZSBmb3IKLSAgIHNlYXJjaGluZyBmb3IgdGhlIGJlc3QgbWF0Y2hpbmcgc3RyaW5nLCBhbmQgZXZlbiB0aGVuIG9ubHkgYnkgdGhlIG1vc3QKLSAgIGZhbmF0aWMgb3B0aW1pemVyIHRyeWluZyB0byBzcXVlZXplIG91dCB0aGUgbGFzdCBjb21wcmVzc2VkIGJpdCBmb3IgdGhlaXIKLSAgIHNwZWNpZmljIGlucHV0IGRhdGEuICBSZWFkIHRoZSBkZWZsYXRlLmMgc291cmNlIGNvZGUgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZQotICAgbWF4X2xhenksIGdvb2RfbGVuZ3RoLCBuaWNlX2xlbmd0aCwgYW5kIG1heF9jaGFpbiBwYXJhbWV0ZXJzLgotCi0gICAgIGRlZmxhdGVUdW5lKCkgY2FuIGJlIGNhbGxlZCBhZnRlciBkZWZsYXRlSW5pdCgpIG9yIGRlZmxhdGVJbml0MigpLCBhbmQKLSAgIHJldHVybnMgWl9PSyBvbiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBmb3IgYW4gaW52YWxpZCBkZWZsYXRlIHN0cmVhbS4KLSAqLwotCi1aRVhURVJOIHVMb25nIFpFWFBPUlQgZGVmbGF0ZUJvdW5kIE9GKCh6X3N0cmVhbXAgc3RybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMb25nIHNvdXJjZUxlbikpOwotLyoKLSAgICAgZGVmbGF0ZUJvdW5kKCkgcmV0dXJucyBhbiB1cHBlciBib3VuZCBvbiB0aGUgY29tcHJlc3NlZCBzaXplIGFmdGVyCi0gICBkZWZsYXRpb24gb2Ygc291cmNlTGVuIGJ5dGVzLiAgSXQgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgZGVmbGF0ZUluaXQoKSBvcgotICAgZGVmbGF0ZUluaXQyKCksIGFuZCBhZnRlciBkZWZsYXRlU2V0SGVhZGVyKCksIGlmIHVzZWQuICBUaGlzIHdvdWxkIGJlIHVzZWQKLSAgIHRvIGFsbG9jYXRlIGFuIG91dHB1dCBidWZmZXIgZm9yIGRlZmxhdGlvbiBpbiBhIHNpbmdsZSBwYXNzLCBhbmQgc28gd291bGQgYmUKLSAgIGNhbGxlZCBiZWZvcmUgZGVmbGF0ZSgpLiAgSWYgdGhhdCBmaXJzdCBkZWZsYXRlKCkgY2FsbCBpcyBwcm92aWRlZCB0aGUKLSAgIHNvdXJjZUxlbiBpbnB1dCBieXRlcywgYW4gb3V0cHV0IGJ1ZmZlciBhbGxvY2F0ZWQgdG8gdGhlIHNpemUgcmV0dXJuZWQgYnkKLSAgIGRlZmxhdGVCb3VuZCgpLCBhbmQgdGhlIGZsdXNoIHZhbHVlIFpfRklOSVNILCB0aGVuIGRlZmxhdGUoKSBpcyBndWFyYW50ZWVkCi0gICB0byByZXR1cm4gWl9TVFJFQU1fRU5ELiAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgY29tcHJlc3NlZCBzaXplIHRvCi0gICBiZSBsYXJnZXIgdGhhbiB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZGVmbGF0ZUJvdW5kKCkgaWYgZmx1c2ggb3B0aW9ucyBvdGhlcgotICAgdGhhbiBaX0ZJTklTSCBvciBaX05PX0ZMVVNIIGFyZSB1c2VkLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlUGVuZGluZyBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqcGVuZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYml0cykpOwotLyoKLSAgICAgZGVmbGF0ZVBlbmRpbmcoKSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgYW5kIGJpdHMgb2Ygb3V0cHV0IHRoYXQgaGF2ZQotICAgYmVlbiBnZW5lcmF0ZWQsIGJ1dCBub3QgeWV0IHByb3ZpZGVkIGluIHRoZSBhdmFpbGFibGUgb3V0cHV0LiAgVGhlIGJ5dGVzIG5vdAotICAgcHJvdmlkZWQgd291bGQgYmUgZHVlIHRvIHRoZSBhdmFpbGFibGUgb3V0cHV0IHNwYWNlIGhhdmluZyBiZWluZyBjb25zdW1lZC4KLSAgIFRoZSBudW1iZXIgb2YgYml0cyBvZiBvdXRwdXQgbm90IHByb3ZpZGVkIGFyZSBiZXR3ZWVuIDAgYW5kIDcsIHdoZXJlIHRoZXkKLSAgIGF3YWl0IG1vcmUgYml0cyB0byBqb2luIHRoZW0gaW4gb3JkZXIgdG8gZmlsbCBvdXQgYSBmdWxsIGJ5dGUuICBJZiBwZW5kaW5nCi0gICBvciBiaXRzIGFyZSBaX05VTEwsIHRoZW4gdGhvc2UgdmFsdWVzIGFyZSBub3Qgc2V0LgotCi0gICAgIGRlZmxhdGVQZW5kaW5nIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCi0gICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KLSAqLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVQcmltZSBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSk7Ci0vKgotICAgICBkZWZsYXRlUHJpbWUoKSBpbnNlcnRzIGJpdHMgaW4gdGhlIGRlZmxhdGUgb3V0cHV0IHN0cmVhbS4gIFRoZSBpbnRlbnQKLSAgIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IG9mZiB0aGUgZGVmbGF0ZSBvdXRwdXQgd2l0aCB0aGUgYml0cwotICAgbGVmdG92ZXIgZnJvbSBhIHByZXZpb3VzIGRlZmxhdGUgc3RyZWFtIHdoZW4gYXBwZW5kaW5nIHRvIGl0LiAgQXMgc3VjaCwgdGhpcwotICAgZnVuY3Rpb24gY2FuIG9ubHkgYmUgdXNlZCBmb3IgcmF3IGRlZmxhdGUsIGFuZCBtdXN0IGJlIHVzZWQgYmVmb3JlIHRoZSBmaXJzdAotICAgZGVmbGF0ZSgpIGNhbGwgYWZ0ZXIgYSBkZWZsYXRlSW5pdDIoKSBvciBkZWZsYXRlUmVzZXQoKS4gIGJpdHMgbXVzdCBiZSBsZXNzCi0gICB0aGFuIG9yIGVxdWFsIHRvIDE2LCBhbmQgdGhhdCBtYW55IG9mIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHZhbHVlCi0gICB3aWxsIGJlIGluc2VydGVkIGluIHRoZSBvdXRwdXQuCi0KLSAgICAgZGVmbGF0ZVByaW1lIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgcm9vbSBpbiB0aGUgaW50ZXJuYWwgYnVmZmVyIHRvIGluc2VydCB0aGUgYml0cywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlCi0gICBzb3VyY2Ugc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGRlZmxhdGVTZXRIZWFkZXIgT0YoKHpfc3RyZWFtcCBzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnel9oZWFkZXJwIGhlYWQpKTsKLS8qCi0gICAgIGRlZmxhdGVTZXRIZWFkZXIoKSBwcm92aWRlcyBnemlwIGhlYWRlciBpbmZvcm1hdGlvbiBmb3Igd2hlbiBhIGd6aXAKLSAgIHN0cmVhbSBpcyByZXF1ZXN0ZWQgYnkgZGVmbGF0ZUluaXQyKCkuICBkZWZsYXRlU2V0SGVhZGVyKCkgbWF5IGJlIGNhbGxlZAotICAgYWZ0ZXIgZGVmbGF0ZUluaXQyKCkgb3IgZGVmbGF0ZVJlc2V0KCkgYW5kIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCBvZgotICAgZGVmbGF0ZSgpLiAgVGhlIHRleHQsIHRpbWUsIG9zLCBleHRyYSBmaWVsZCwgbmFtZSwgYW5kIGNvbW1lbnQgaW5mb3JtYXRpb24KLSAgIGluIHRoZSBwcm92aWRlZCBnel9oZWFkZXIgc3RydWN0dXJlIGFyZSB3cml0dGVuIHRvIHRoZSBnemlwIGhlYWRlciAoeGZsYWcgaXMKLSAgIGlnbm9yZWQgLS0gdGhlIGV4dHJhIGZsYWdzIGFyZSBzZXQgYWNjb3JkaW5nIHRvIHRoZSBjb21wcmVzc2lvbiBsZXZlbCkuICBUaGUKLSAgIGNhbGxlciBtdXN0IGFzc3VyZSB0aGF0LCBpZiBub3QgWl9OVUxMLCBuYW1lIGFuZCBjb21tZW50IGFyZSB0ZXJtaW5hdGVkIHdpdGgKLSAgIGEgemVybyBieXRlLCBhbmQgdGhhdCBpZiBleHRyYSBpcyBub3QgWl9OVUxMLCB0aGF0IGV4dHJhX2xlbiBieXRlcyBhcmUKLSAgIGF2YWlsYWJsZSB0aGVyZS4gIElmIGhjcmMgaXMgdHJ1ZSwgYSBnemlwIGhlYWRlciBjcmMgaXMgaW5jbHVkZWQuICBOb3RlIHRoYXQKLSAgIHRoZSBjdXJyZW50IHZlcnNpb25zIG9mIHRoZSBjb21tYW5kLWxpbmUgdmVyc2lvbiBvZiBnemlwICh1cCB0aHJvdWdoIHZlcnNpb24KLSAgIDEuMy54KSBkbyBub3Qgc3VwcG9ydCBoZWFkZXIgY3JjJ3MsIGFuZCB3aWxsIHJlcG9ydCB0aGF0IGl0IGlzIGEgIm11bHRpLXBhcnQKLSAgIGd6aXAgZmlsZSIgYW5kIGdpdmUgdXAuCi0KLSAgICAgSWYgZGVmbGF0ZVNldEhlYWRlciBpcyBub3QgdXNlZCwgdGhlIGRlZmF1bHQgZ3ppcCBoZWFkZXIgaGFzIHRleHQgZmFsc2UsCi0gICB0aGUgdGltZSBzZXQgdG8gemVybywgYW5kIG9zIHNldCB0byAyNTUsIHdpdGggbm8gZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQKLSAgIGZpZWxkcy4gIFRoZSBnemlwIGhlYWRlciBpcyByZXR1cm5lZCB0byB0aGUgZGVmYXVsdCBzdGF0ZSBieSBkZWZsYXRlUmVzZXQoKS4KLQotICAgICBkZWZsYXRlU2V0SGVhZGVyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBvciBaX1NUUkVBTV9FUlJPUiBpZiB0aGUgc291cmNlCi0gICBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KLSovCi0KLS8qCi1aRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0MiBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICB3aW5kb3dCaXRzKSk7Ci0KLSAgICAgVGhpcyBpcyBhbm90aGVyIHZlcnNpb24gb2YgaW5mbGF0ZUluaXQgd2l0aCBhbiBleHRyYSBwYXJhbWV0ZXIuICBUaGUKLSAgIGZpZWxkcyBuZXh0X2luLCBhdmFpbF9pbiwgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIG11c3QgYmUgaW5pdGlhbGl6ZWQKLSAgIGJlZm9yZSBieSB0aGUgY2FsbGVyLgotCi0gICAgIFRoZSB3aW5kb3dCaXRzIHBhcmFtZXRlciBpcyB0aGUgYmFzZSB0d28gbG9nYXJpdGhtIG9mIHRoZSBtYXhpbXVtIHdpbmRvdwotICAgc2l6ZSAodGhlIHNpemUgb2YgdGhlIGhpc3RvcnkgYnVmZmVyKS4gIEl0IHNob3VsZCBiZSBpbiB0aGUgcmFuZ2UgOC4uMTUgZm9yCi0gICB0aGlzIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAxNSBpZiBpbmZsYXRlSW5pdCBpcyB1c2VkCi0gICBpbnN0ZWFkLiAgd2luZG93Qml0cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgd2luZG93Qml0cyB2YWx1ZQotICAgcHJvdmlkZWQgdG8gZGVmbGF0ZUluaXQyKCkgd2hpbGUgY29tcHJlc3NpbmcsIG9yIGl0IG11c3QgYmUgZXF1YWwgdG8gMTUgaWYKLSAgIGRlZmxhdGVJbml0MigpIHdhcyBub3QgdXNlZC4gIElmIGEgY29tcHJlc3NlZCBzdHJlYW0gd2l0aCBhIGxhcmdlciB3aW5kb3cKLSAgIHNpemUgaXMgZ2l2ZW4gYXMgaW5wdXQsIGluZmxhdGUoKSB3aWxsIHJldHVybiB3aXRoIHRoZSBlcnJvciBjb2RlCi0gICBaX0RBVEFfRVJST1IgaW5zdGVhZCBvZiB0cnlpbmcgdG8gYWxsb2NhdGUgYSBsYXJnZXIgd2luZG93LgotCi0gICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgemVybyB0byByZXF1ZXN0IHRoYXQgaW5mbGF0ZSB1c2UgdGhlIHdpbmRvdyBzaXplIGluCi0gICB0aGUgemxpYiBoZWFkZXIgb2YgdGhlIGNvbXByZXNzZWQgc3RyZWFtLgotCi0gICAgIHdpbmRvd0JpdHMgY2FuIGFsc28gYmUgLTguLi0xNSBmb3IgcmF3IGluZmxhdGUuICBJbiB0aGlzIGNhc2UsIC13aW5kb3dCaXRzCi0gICBkZXRlcm1pbmVzIHRoZSB3aW5kb3cgc2l6ZS4gIGluZmxhdGUoKSB3aWxsIHRoZW4gcHJvY2VzcyByYXcgZGVmbGF0ZSBkYXRhLAotICAgbm90IGxvb2tpbmcgZm9yIGEgemxpYiBvciBnemlwIGhlYWRlciwgbm90IGdlbmVyYXRpbmcgYSBjaGVjayB2YWx1ZSwgYW5kIG5vdAotICAgbG9va2luZyBmb3IgYW55IGNoZWNrIHZhbHVlcyBmb3IgY29tcGFyaXNvbiBhdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uICBUaGlzCi0gICBpcyBmb3IgdXNlIHdpdGggb3RoZXIgZm9ybWF0cyB0aGF0IHVzZSB0aGUgZGVmbGF0ZSBjb21wcmVzc2VkIGRhdGEgZm9ybWF0Ci0gICBzdWNoIGFzIHppcC4gIFRob3NlIGZvcm1hdHMgcHJvdmlkZSB0aGVpciBvd24gY2hlY2sgdmFsdWVzLiAgSWYgYSBjdXN0b20KLSAgIGZvcm1hdCBpcyBkZXZlbG9wZWQgdXNpbmcgdGhlIHJhdyBkZWZsYXRlIGZvcm1hdCBmb3IgY29tcHJlc3NlZCBkYXRhLCBpdCBpcwotICAgcmVjb21tZW5kZWQgdGhhdCBhIGNoZWNrIHZhbHVlIHN1Y2ggYXMgYW4gYWRsZXIzMiBvciBhIGNyYzMyIGJlIGFwcGxpZWQgdG8KLSAgIHRoZSB1bmNvbXByZXNzZWQgZGF0YSBhcyBpcyBkb25lIGluIHRoZSB6bGliLCBnemlwLCBhbmQgemlwIGZvcm1hdHMuICBGb3IKLSAgIG1vc3QgYXBwbGljYXRpb25zLCB0aGUgemxpYiBmb3JtYXQgc2hvdWxkIGJlIHVzZWQgYXMgaXMuICBOb3RlIHRoYXQgY29tbWVudHMKLSAgIGFib3ZlIG9uIHRoZSB1c2UgaW4gZGVmbGF0ZUluaXQyKCkgYXBwbGllcyB0byB0aGUgbWFnbml0dWRlIG9mIHdpbmRvd0JpdHMuCi0KLSAgICAgd2luZG93Qml0cyBjYW4gYWxzbyBiZSBncmVhdGVyIHRoYW4gMTUgZm9yIG9wdGlvbmFsIGd6aXAgZGVjb2RpbmcuICBBZGQKLSAgIDMyIHRvIHdpbmRvd0JpdHMgdG8gZW5hYmxlIHpsaWIgYW5kIGd6aXAgZGVjb2Rpbmcgd2l0aCBhdXRvbWF0aWMgaGVhZGVyCi0gICBkZXRlY3Rpb24sIG9yIGFkZCAxNiB0byBkZWNvZGUgb25seSB0aGUgZ3ppcCBmb3JtYXQgKHRoZSB6bGliIGZvcm1hdCB3aWxsCi0gICByZXR1cm4gYSBaX0RBVEFfRVJST1IpLiAgSWYgYSBnemlwIHN0cmVhbSBpcyBiZWluZyBkZWNvZGVkLCBzdHJtLT5hZGxlciBpcyBhCi0gICBjcmMzMiBpbnN0ZWFkIG9mIGFuIGFkbGVyMzIuCi0KLSAgICAgaW5mbGF0ZUluaXQyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgbWVtb3J5LCBaX1ZFUlNJT05fRVJST1IgaWYgdGhlIHpsaWIgbGlicmFyeSB2ZXJzaW9uIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZQotICAgdmVyc2lvbiBhc3N1bWVkIGJ5IHRoZSBjYWxsZXIsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBwYXJhbWV0ZXJzIGFyZQotICAgaW52YWxpZCwgc3VjaCBhcyBhIG51bGwgcG9pbnRlciB0byB0aGUgc3RydWN0dXJlLiAgbXNnIGlzIHNldCB0byBudWxsIGlmCi0gICB0aGVyZSBpcyBubyBlcnJvciBtZXNzYWdlLiAgaW5mbGF0ZUluaXQyIGRvZXMgbm90IHBlcmZvcm0gYW55IGRlY29tcHJlc3Npb24KLSAgIGFwYXJ0IGZyb20gcG9zc2libHkgcmVhZGluZyB0aGUgemxpYiBoZWFkZXIgaWYgcHJlc2VudDogYWN0dWFsIGRlY29tcHJlc3Npb24KLSAgIHdpbGwgYmUgZG9uZSBieSBpbmZsYXRlKCkuICAoU28gbmV4dF9pbiBhbmQgYXZhaWxfaW4gbWF5IGJlIG1vZGlmaWVkLCBidXQKLSAgIG5leHRfb3V0IGFuZCBhdmFpbF9vdXQgYXJlIHVudXNlZCBhbmQgdW5jaGFuZ2VkLikgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24KLSAgIG9mIGluZmxhdGVJbml0MigpIGRvZXMgbm90IHByb2Nlc3MgYW55IGhlYWRlciBpbmZvcm1hdGlvbiAtLSB0aGF0IGlzCi0gICBkZWZlcnJlZCB1bnRpbCBpbmZsYXRlKCkgaXMgY2FsbGVkLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlU2V0RGljdGlvbmFyeSBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqZGljdGlvbmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgIGRpY3RMZW5ndGgpKTsKLS8qCi0gICAgIEluaXRpYWxpemVzIHRoZSBkZWNvbXByZXNzaW9uIGRpY3Rpb25hcnkgZnJvbSB0aGUgZ2l2ZW4gdW5jb21wcmVzc2VkIGJ5dGUKLSAgIHNlcXVlbmNlLiAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBhIGNhbGwgb2YgaW5mbGF0ZSwKLSAgIGlmIHRoYXQgY2FsbCByZXR1cm5lZCBaX05FRURfRElDVC4gIFRoZSBkaWN0aW9uYXJ5IGNob3NlbiBieSB0aGUgY29tcHJlc3NvcgotICAgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgYWRsZXIzMiB2YWx1ZSByZXR1cm5lZCBieSB0aGF0IGNhbGwgb2YgaW5mbGF0ZS4KLSAgIFRoZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3IgbXVzdCB1c2UgZXhhY3RseSB0aGUgc2FtZSBkaWN0aW9uYXJ5IChzZWUKLSAgIGRlZmxhdGVTZXREaWN0aW9uYXJ5KS4gIEZvciByYXcgaW5mbGF0ZSwgdGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGF0IGFueQotICAgdGltZSB0byBzZXQgdGhlIGRpY3Rpb25hcnkuICBJZiB0aGUgcHJvdmlkZWQgZGljdGlvbmFyeSBpcyBzbWFsbGVyIHRoYW4gdGhlCi0gICB3aW5kb3cgYW5kIHRoZXJlIGlzIGFscmVhZHkgZGF0YSBpbiB0aGUgd2luZG93LCB0aGVuIHRoZSBwcm92aWRlZCBkaWN0aW9uYXJ5Ci0gICB3aWxsIGFtZW5kIHdoYXQncyB0aGVyZS4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGluc3VyZSB0aGF0IHRoZSBkaWN0aW9uYXJ5Ci0gICB0aGF0IHdhcyB1c2VkIGZvciBjb21wcmVzc2lvbiBpcyBwcm92aWRlZC4KLQotICAgICBpbmZsYXRlU2V0RGljdGlvbmFyeSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9TVFJFQU1fRVJST1IgaWYgYQotICAgcGFyYW1ldGVyIGlzIGludmFsaWQgKGUuZy4gIGRpY3Rpb25hcnkgYmVpbmcgWl9OVUxMKSBvciB0aGUgc3RyZWFtIHN0YXRlIGlzCi0gICBpbmNvbnNpc3RlbnQsIFpfREFUQV9FUlJPUiBpZiB0aGUgZ2l2ZW4gZGljdGlvbmFyeSBkb2Vzbid0IG1hdGNoIHRoZQotICAgZXhwZWN0ZWQgb25lIChpbmNvcnJlY3QgYWRsZXIzMiB2YWx1ZSkuICBpbmZsYXRlU2V0RGljdGlvbmFyeSBkb2VzIG5vdAotICAgcGVyZm9ybSBhbnkgZGVjb21wcmVzc2lvbjogdGhpcyB3aWxsIGJlIGRvbmUgYnkgc3Vic2VxdWVudCBjYWxscyBvZgotICAgaW5mbGF0ZSgpLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlR2V0RGljdGlvbmFyeSBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlZiAqZGljdGlvbmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVJbnQgICpkaWN0TGVuZ3RoKSk7Ci0vKgotICAgICBSZXR1cm5zIHRoZSBzbGlkaW5nIGRpY3Rpb25hcnkgYmVpbmcgbWFpbnRhaW5lZCBieSBpbmZsYXRlLiAgZGljdExlbmd0aCBpcwotICAgc2V0IHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGRpY3Rpb25hcnksIGFuZCB0aGF0IG1hbnkgYnl0ZXMgYXJlIGNvcGllZAotICAgdG8gZGljdGlvbmFyeS4gIGRpY3Rpb25hcnkgbXVzdCBoYXZlIGVub3VnaCBzcGFjZSwgd2hlcmUgMzI3NjggYnl0ZXMgaXMKLSAgIGFsd2F5cyBlbm91Z2guICBJZiBpbmZsYXRlR2V0RGljdGlvbmFyeSgpIGlzIGNhbGxlZCB3aXRoIGRpY3Rpb25hcnkgZXF1YWwgdG8KLSAgIFpfTlVMTCwgdGhlbiBvbmx5IHRoZSBkaWN0aW9uYXJ5IGxlbmd0aCBpcyByZXR1cm5lZCwgYW5kIG5vdGhpbmcgaXMgY29waWVkLgotICAgU2ltaWxhcnksIGlmIGRpY3RMZW5ndGggaXMgWl9OVUxMLCB0aGVuIGl0IGlzIG5vdCBzZXQuCi0KLSAgICAgaW5mbGF0ZUdldERpY3Rpb25hcnkgcmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZQotICAgc3RyZWFtIHN0YXRlIGlzIGluY29uc2lzdGVudC4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVN5bmMgT0YoKHpfc3RyZWFtcCBzdHJtKSk7Ci0vKgotICAgICBTa2lwcyBpbnZhbGlkIGNvbXByZXNzZWQgZGF0YSB1bnRpbCBhIHBvc3NpYmxlIGZ1bGwgZmx1c2ggcG9pbnQgKHNlZSBhYm92ZQotICAgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiBkZWZsYXRlIHdpdGggWl9GVUxMX0ZMVVNIKSBjYW4gYmUgZm91bmQsIG9yIHVudGlsIGFsbAotICAgYXZhaWxhYmxlIGlucHV0IGlzIHNraXBwZWQuICBObyBvdXRwdXQgaXMgcHJvdmlkZWQuCi0KLSAgICAgaW5mbGF0ZVN5bmMgc2VhcmNoZXMgZm9yIGEgMDAgMDAgRkYgRkYgcGF0dGVybiBpbiB0aGUgY29tcHJlc3NlZCBkYXRhLgotICAgQWxsIGZ1bGwgZmx1c2ggcG9pbnRzIGhhdmUgdGhpcyBwYXR0ZXJuLCBidXQgbm90IGFsbCBvY2N1cnJlbmNlcyBvZiB0aGlzCi0gICBwYXR0ZXJuIGFyZSBmdWxsIGZsdXNoIHBvaW50cy4KLQotICAgICBpbmZsYXRlU3luYyByZXR1cm5zIFpfT0sgaWYgYSBwb3NzaWJsZSBmdWxsIGZsdXNoIHBvaW50IGhhcyBiZWVuIGZvdW5kLAotICAgWl9CVUZfRVJST1IgaWYgbm8gbW9yZSBpbnB1dCB3YXMgcHJvdmlkZWQsIFpfREFUQV9FUlJPUiBpZiBubyBmbHVzaCBwb2ludAotICAgaGFzIGJlZW4gZm91bmQsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gc3RydWN0dXJlIHdhcyBpbmNvbnNpc3RlbnQuCi0gICBJbiB0aGUgc3VjY2VzcyBjYXNlLCB0aGUgYXBwbGljYXRpb24gbWF5IHNhdmUgdGhlIGN1cnJlbnQgY3VycmVudCB2YWx1ZSBvZgotICAgdG90YWxfaW4gd2hpY2ggaW5kaWNhdGVzIHdoZXJlIHZhbGlkIGNvbXByZXNzZWQgZGF0YSB3YXMgZm91bmQuICBJbiB0aGUKLSAgIGVycm9yIGNhc2UsIHRoZSBhcHBsaWNhdGlvbiBtYXkgcmVwZWF0ZWRseSBjYWxsIGluZmxhdGVTeW5jLCBwcm92aWRpbmcgbW9yZQotICAgaW5wdXQgZWFjaCB0aW1lLCB1bnRpbCBzdWNjZXNzIG9yIGVuZCBvZiB0aGUgaW5wdXQgZGF0YS4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUNvcHkgT0YoKHpfc3RyZWFtcCBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgel9zdHJlYW1wIHNvdXJjZSkpOwotLyoKLSAgICAgU2V0cyB0aGUgZGVzdGluYXRpb24gc3RyZWFtIGFzIGEgY29tcGxldGUgY29weSBvZiB0aGUgc291cmNlIHN0cmVhbS4KLQotICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiByYW5kb21seSBhY2Nlc3NpbmcgYSBsYXJnZSBzdHJlYW0uICBUaGUKLSAgIGZpcnN0IHBhc3MgdGhyb3VnaCB0aGUgc3RyZWFtIGNhbiBwZXJpb2RpY2FsbHkgcmVjb3JkIHRoZSBpbmZsYXRlIHN0YXRlLAotICAgYWxsb3dpbmcgcmVzdGFydGluZyBpbmZsYXRlIGF0IHRob3NlIHBvaW50cyB3aGVuIHJhbmRvbWx5IGFjY2Vzc2luZyB0aGUKLSAgIHN0cmVhbS4KLQotICAgICBpbmZsYXRlQ29weSByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAotICAgZW5vdWdoIG1lbW9yeSwgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudAotICAgKHN1Y2ggYXMgemFsbG9jIGJlaW5nIFpfTlVMTCkuICBtc2cgaXMgbGVmdCB1bmNoYW5nZWQgaW4gYm90aCBzb3VyY2UgYW5kCi0gICBkZXN0aW5hdGlvbi4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVJlc2V0IE9GKCh6X3N0cmVhbXAgc3RybSkpOwotLyoKLSAgICAgVGhpcyBmdW5jdGlvbiBpcyBlcXVpdmFsZW50IHRvIGluZmxhdGVFbmQgZm9sbG93ZWQgYnkgaW5mbGF0ZUluaXQsCi0gICBidXQgZG9lcyBub3QgZnJlZSBhbmQgcmVhbGxvY2F0ZSBhbGwgdGhlIGludGVybmFsIGRlY29tcHJlc3Npb24gc3RhdGUuICBUaGUKLSAgIHN0cmVhbSB3aWxsIGtlZXAgYXR0cmlidXRlcyB0aGF0IG1heSBoYXZlIGJlZW4gc2V0IGJ5IGluZmxhdGVJbml0Mi4KLQotICAgICBpbmZsYXRlUmVzZXQgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKLSAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50IChzdWNoIGFzIHphbGxvYyBvciBzdGF0ZSBiZWluZyBaX05VTEwpLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlUmVzZXQyIE9GKCh6X3N0cmVhbXAgc3RybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbmRvd0JpdHMpKTsKLS8qCi0gICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlIHNhbWUgYXMgaW5mbGF0ZVJlc2V0LCBidXQgaXQgYWxzbyBwZXJtaXRzIGNoYW5naW5nCi0gICB0aGUgd3JhcCBhbmQgd2luZG93IHNpemUgcmVxdWVzdHMuICBUaGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgaW50ZXJwcmV0ZWQKLSAgIHRoZSBzYW1lIGFzIGl0IGlzIGZvciBpbmZsYXRlSW5pdDIuCi0KLSAgICAgaW5mbGF0ZVJlc2V0MiByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQotICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQgKHN1Y2ggYXMgemFsbG9jIG9yIHN0YXRlIGJlaW5nIFpfTlVMTCksIG9yIGlmCi0gICB0aGUgd2luZG93Qml0cyBwYXJhbWV0ZXIgaXMgaW52YWxpZC4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZVByaW1lIE9GKCh6X3N0cmVhbXAgc3RybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpKTsKLS8qCi0gICAgIFRoaXMgZnVuY3Rpb24gaW5zZXJ0cyBiaXRzIGluIHRoZSBpbmZsYXRlIGlucHV0IHN0cmVhbS4gIFRoZSBpbnRlbnQgaXMKLSAgIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN0YXJ0IGluZmxhdGluZyBhdCBhIGJpdCBwb3NpdGlvbiBpbiB0aGUKLSAgIG1pZGRsZSBvZiBhIGJ5dGUuICBUaGUgcHJvdmlkZWQgYml0cyB3aWxsIGJlIHVzZWQgYmVmb3JlIGFueSBieXRlcyBhcmUgdXNlZAotICAgZnJvbSBuZXh0X2luLiAgVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIHdpdGggcmF3IGluZmxhdGUsIGFuZAotICAgc2hvdWxkIGJlIHVzZWQgYmVmb3JlIHRoZSBmaXJzdCBpbmZsYXRlKCkgY2FsbCBhZnRlciBpbmZsYXRlSW5pdDIoKSBvcgotICAgaW5mbGF0ZVJlc2V0KCkuICBiaXRzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE2LCBhbmQgdGhhdCBtYW55IG9mIHRoZQotICAgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cyBvZiB2YWx1ZSB3aWxsIGJlIGluc2VydGVkIGluIHRoZSBpbnB1dC4KLQotICAgICBJZiBiaXRzIGlzIG5lZ2F0aXZlLCB0aGVuIHRoZSBpbnB1dCBzdHJlYW0gYml0IGJ1ZmZlciBpcyBlbXB0aWVkLiAgVGhlbgotICAgaW5mbGF0ZVByaW1lKCkgY2FuIGJlIGNhbGxlZCBhZ2FpbiB0byBwdXQgYml0cyBpbiB0aGUgYnVmZmVyLiAgVGhpcyBpcyB1c2VkCi0gICB0byBjbGVhciBvdXQgYml0cyBsZWZ0b3ZlciBhZnRlciBmZWVkaW5nIGluZmxhdGUgYSBibG9jayBkZXNjcmlwdGlvbiBwcmlvcgotICAgdG8gZmVlZGluZyBpbmZsYXRlIGNvZGVzLgotCi0gICAgIGluZmxhdGVQcmltZSByZXR1cm5zIFpfT0sgaWYgc3VjY2Vzcywgb3IgWl9TVFJFQU1fRVJST1IgaWYgdGhlIHNvdXJjZQotICAgc3RyZWFtIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCi0qLwotCi1aRVhURVJOIGxvbmcgWkVYUE9SVCBpbmZsYXRlTWFyayBPRigoel9zdHJlYW1wIHN0cm0pKTsKLS8qCi0gICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0d28gdmFsdWVzLCBvbmUgaW4gdGhlIGxvd2VyIDE2IGJpdHMgb2YgdGhlIHJldHVybgotICAgdmFsdWUsIGFuZCB0aGUgb3RoZXIgaW4gdGhlIHJlbWFpbmluZyB1cHBlciBiaXRzLCBvYnRhaW5lZCBieSBzaGlmdGluZyB0aGUKLSAgIHJldHVybiB2YWx1ZSBkb3duIDE2IGJpdHMuICBJZiB0aGUgdXBwZXIgdmFsdWUgaXMgLTEgYW5kIHRoZSBsb3dlciB2YWx1ZSBpcwotICAgemVybywgdGhlbiBpbmZsYXRlKCkgaXMgY3VycmVudGx5IGRlY29kaW5nIGluZm9ybWF0aW9uIG91dHNpZGUgb2YgYSBibG9jay4KLSAgIElmIHRoZSB1cHBlciB2YWx1ZSBpcyAtMSBhbmQgdGhlIGxvd2VyIHZhbHVlIGlzIG5vbi16ZXJvLCB0aGVuIGluZmxhdGUgaXMgaW4KLSAgIHRoZSBtaWRkbGUgb2YgYSBzdG9yZWQgYmxvY2ssIHdpdGggdGhlIGxvd2VyIHZhbHVlIGVxdWFsaW5nIHRoZSBudW1iZXIgb2YKLSAgIGJ5dGVzIGZyb20gdGhlIGlucHV0IHJlbWFpbmluZyB0byBjb3B5LiAgSWYgdGhlIHVwcGVyIHZhbHVlIGlzIG5vdCAtMSwgdGhlbgotICAgaXQgaXMgdGhlIG51bWJlciBvZiBiaXRzIGJhY2sgZnJvbSB0aGUgY3VycmVudCBiaXQgcG9zaXRpb24gaW4gdGhlIGlucHV0IG9mCi0gICB0aGUgY29kZSAobGl0ZXJhbCBvciBsZW5ndGgvZGlzdGFuY2UgcGFpcikgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4gIEluCi0gICB0aGF0IGNhc2UgdGhlIGxvd2VyIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWxyZWFkeSBlbWl0dGVkIGZvciB0aGF0Ci0gICBjb2RlLgotCi0gICAgIEEgY29kZSBpcyBiZWluZyBwcm9jZXNzZWQgaWYgaW5mbGF0ZSBpcyB3YWl0aW5nIGZvciBtb3JlIGlucHV0IHRvIGNvbXBsZXRlCi0gICBkZWNvZGluZyBvZiB0aGUgY29kZSwgb3IgaWYgaXQgaGFzIGNvbXBsZXRlZCBkZWNvZGluZyBidXQgaXMgd2FpdGluZyBmb3IKLSAgIG1vcmUgb3V0cHV0IHNwYWNlIHRvIHdyaXRlIHRoZSBsaXRlcmFsIG9yIG1hdGNoIGRhdGEuCi0KLSAgICAgaW5mbGF0ZU1hcmsoKSBpcyB1c2VkIHRvIG1hcmsgbG9jYXRpb25zIGluIHRoZSBpbnB1dCBkYXRhIGZvciByYW5kb20KLSAgIGFjY2Vzcywgd2hpY2ggbWF5IGJlIGF0IGJpdCBwb3NpdGlvbnMsIGFuZCB0byBub3RlIHRob3NlIGNhc2VzIHdoZXJlIHRoZQotICAgb3V0cHV0IG9mIGEgY29kZSBtYXkgc3BhbiBib3VuZGFyaWVzIG9mIHJhbmRvbSBhY2Nlc3MgYmxvY2tzLiAgVGhlIGN1cnJlbnQKLSAgIGxvY2F0aW9uIGluIHRoZSBpbnB1dCBzdHJlYW0gY2FuIGJlIGRldGVybWluZWQgZnJvbSBhdmFpbF9pbiBhbmQgZGF0YV90eXBlCi0gICBhcyBub3RlZCBpbiB0aGUgZGVzY3JpcHRpb24gZm9yIHRoZSBaX0JMT0NLIGZsdXNoIHBhcmFtZXRlciBmb3IgaW5mbGF0ZS4KLQotICAgICBpbmZsYXRlTWFyayByZXR1cm5zIHRoZSB2YWx1ZSBub3RlZCBhYm92ZSBvciAtMSA8PCAxNiBpZiB0aGUgcHJvdmlkZWQKLSAgIHNvdXJjZSBzdHJlYW0gc3RhdGUgd2FzIGluY29uc2lzdGVudC4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUdldEhlYWRlciBPRigoel9zdHJlYW1wIHN0cm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd6X2hlYWRlcnAgaGVhZCkpOwotLyoKLSAgICAgaW5mbGF0ZUdldEhlYWRlcigpIHJlcXVlc3RzIHRoYXQgZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gYmUgc3RvcmVkIGluIHRoZQotICAgcHJvdmlkZWQgZ3pfaGVhZGVyIHN0cnVjdHVyZS4gIGluZmxhdGVHZXRIZWFkZXIoKSBtYXkgYmUgY2FsbGVkIGFmdGVyCi0gICBpbmZsYXRlSW5pdDIoKSBvciBpbmZsYXRlUmVzZXQoKSwgYW5kIGJlZm9yZSB0aGUgZmlyc3QgY2FsbCBvZiBpbmZsYXRlKCkuCi0gICBBcyBpbmZsYXRlKCkgcHJvY2Vzc2VzIHRoZSBnemlwIHN0cmVhbSwgaGVhZC0+ZG9uZSBpcyB6ZXJvIHVudGlsIHRoZSBoZWFkZXIKLSAgIGlzIGNvbXBsZXRlZCwgYXQgd2hpY2ggdGltZSBoZWFkLT5kb25lIGlzIHNldCB0byBvbmUuICBJZiBhIHpsaWIgc3RyZWFtIGlzCi0gICBiZWluZyBkZWNvZGVkLCB0aGVuIGhlYWQtPmRvbmUgaXMgc2V0IHRvIC0xIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgd2lsbCBiZQotICAgbm8gZ3ppcCBoZWFkZXIgaW5mb3JtYXRpb24gZm9ydGhjb21pbmcuICBOb3RlIHRoYXQgWl9CTE9DSyBvciBaX1RSRUVTIGNhbiBiZQotICAgdXNlZCB0byBmb3JjZSBpbmZsYXRlKCkgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGFmdGVyIGhlYWRlciBwcm9jZXNzaW5nIGlzCi0gICBjb21wbGV0ZSBhbmQgYmVmb3JlIGFueSBhY3R1YWwgZGF0YSBpcyBkZWNvbXByZXNzZWQuCi0KLSAgICAgVGhlIHRleHQsIHRpbWUsIHhmbGFncywgYW5kIG9zIGZpZWxkcyBhcmUgZmlsbGVkIGluIHdpdGggdGhlIGd6aXAgaGVhZGVyCi0gICBjb250ZW50cy4gIGhjcmMgaXMgc2V0IHRvIHRydWUgaWYgdGhlcmUgaXMgYSBoZWFkZXIgQ1JDLiAgKFRoZSBoZWFkZXIgQ1JDCi0gICB3YXMgdmFsaWQgaWYgZG9uZSBpcyBzZXQgdG8gb25lLikgSWYgZXh0cmEgaXMgbm90IFpfTlVMTCwgdGhlbiBleHRyYV9tYXgKLSAgIGNvbnRhaW5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSB0byBleHRyYS4gIE9uY2UgZG9uZSBpcyB0cnVlLAotICAgZXh0cmFfbGVuIGNvbnRhaW5zIHRoZSBhY3R1YWwgZXh0cmEgZmllbGQgbGVuZ3RoLCBhbmQgZXh0cmEgY29udGFpbnMgdGhlCi0gICBleHRyYSBmaWVsZCwgb3IgdGhhdCBmaWVsZCB0cnVuY2F0ZWQgaWYgZXh0cmFfbWF4IGlzIGxlc3MgdGhhbiBleHRyYV9sZW4uCi0gICBJZiBuYW1lIGlzIG5vdCBaX05VTEwsIHRoZW4gdXAgdG8gbmFtZV9tYXggY2hhcmFjdGVycyBhcmUgd3JpdHRlbiB0aGVyZSwKLSAgIHRlcm1pbmF0ZWQgd2l0aCBhIHplcm8gdW5sZXNzIHRoZSBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIG5hbWVfbWF4LiAgSWYKLSAgIGNvbW1lbnQgaXMgbm90IFpfTlVMTCwgdGhlbiB1cCB0byBjb21tX21heCBjaGFyYWN0ZXJzIGFyZSB3cml0dGVuIHRoZXJlLAotICAgdGVybWluYXRlZCB3aXRoIGEgemVybyB1bmxlc3MgdGhlIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gY29tbV9tYXguICBXaGVuIGFueQotICAgb2YgZXh0cmEsIG5hbWUsIG9yIGNvbW1lbnQgYXJlIG5vdCBaX05VTEwgYW5kIHRoZSByZXNwZWN0aXZlIGZpZWxkIGlzIG5vdAotICAgcHJlc2VudCBpbiB0aGUgaGVhZGVyLCB0aGVuIHRoYXQgZmllbGQgaXMgc2V0IHRvIFpfTlVMTCB0byBzaWduYWwgaXRzCi0gICBhYnNlbmNlLiAgVGhpcyBhbGxvd3MgdGhlIHVzZSBvZiBkZWZsYXRlU2V0SGVhZGVyKCkgd2l0aCB0aGUgcmV0dXJuZWQKLSAgIHN0cnVjdHVyZSB0byBkdXBsaWNhdGUgdGhlIGhlYWRlci4gIEhvd2V2ZXIgaWYgdGhvc2UgZmllbGRzIGFyZSBzZXQgdG8KLSAgIGFsbG9jYXRlZCBtZW1vcnksIHRoZW4gdGhlIGFwcGxpY2F0aW9uIHdpbGwgbmVlZCB0byBzYXZlIHRob3NlIHBvaW50ZXJzCi0gICBlbHNld2hlcmUgc28gdGhhdCB0aGV5IGNhbiBiZSBldmVudHVhbGx5IGZyZWVkLgotCi0gICAgIElmIGluZmxhdGVHZXRIZWFkZXIgaXMgbm90IHVzZWQsIHRoZW4gdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBpcyBzaW1wbHkKLSAgIGRpc2NhcmRlZC4gIFRoZSBoZWFkZXIgaXMgYWx3YXlzIGNoZWNrZWQgZm9yIHZhbGlkaXR5LCBpbmNsdWRpbmcgdGhlIGhlYWRlcgotICAgQ1JDIGlmIHByZXNlbnQuICBpbmZsYXRlUmVzZXQoKSB3aWxsIHJlc2V0IHRoZSBwcm9jZXNzIHRvIGRpc2NhcmQgdGhlIGhlYWRlcgotICAgaW5mb3JtYXRpb24uICBUaGUgYXBwbGljYXRpb24gd291bGQgbmVlZCB0byBjYWxsIGluZmxhdGVHZXRIZWFkZXIoKSBhZ2FpbiB0bwotICAgcmV0cmlldmUgdGhlIGhlYWRlciBmcm9tIHRoZSBuZXh0IGd6aXAgc3RyZWFtLgotCi0gICAgIGluZmxhdGVHZXRIZWFkZXIgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzb3VyY2UKLSAgIHN0cmVhbSBzdGF0ZSB3YXMgaW5jb25zaXN0ZW50LgotKi8KLQotLyoKLVpFWFRFUk4gaW50IFpFWFBPUlQgaW5mbGF0ZUJhY2tJbml0IE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IHdpbmRvd0JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBGQVIgKndpbmRvdykpOwotCi0gICAgIEluaXRpYWxpemUgdGhlIGludGVybmFsIHN0cmVhbSBzdGF0ZSBmb3IgZGVjb21wcmVzc2lvbiB1c2luZyBpbmZsYXRlQmFjaygpCi0gICBjYWxscy4gIFRoZSBmaWVsZHMgemFsbG9jLCB6ZnJlZSBhbmQgb3BhcXVlIGluIHN0cm0gbXVzdCBiZSBpbml0aWFsaXplZAotICAgYmVmb3JlIHRoZSBjYWxsLiAgSWYgemFsbG9jIGFuZCB6ZnJlZSBhcmUgWl9OVUxMLCB0aGVuIHRoZSBkZWZhdWx0IGxpYnJhcnktCi0gICBkZXJpdmVkIG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzIGFyZSB1c2VkLiAgd2luZG93Qml0cyBpcyB0aGUgYmFzZSB0d28KLSAgIGxvZ2FyaXRobSBvZiB0aGUgd2luZG93IHNpemUsIGluIHRoZSByYW5nZSA4Li4xNS4gIHdpbmRvdyBpcyBhIGNhbGxlcgotICAgc3VwcGxpZWQgYnVmZmVyIG9mIHRoYXQgc2l6ZS4gIEV4Y2VwdCBmb3Igc3BlY2lhbCBhcHBsaWNhdGlvbnMgd2hlcmUgaXQgaXMKLSAgIGFzc3VyZWQgdGhhdCBkZWZsYXRlIHdhcyB1c2VkIHdpdGggc21hbGwgd2luZG93IHNpemVzLCB3aW5kb3dCaXRzIG11c3QgYmUgMTUKLSAgIGFuZCBhIDMySyBieXRlIHdpbmRvdyBtdXN0IGJlIHN1cHBsaWVkIHRvIGJlIGFibGUgdG8gZGVjb21wcmVzcyBnZW5lcmFsCi0gICBkZWZsYXRlIHN0cmVhbXMuCi0KLSAgICAgU2VlIGluZmxhdGVCYWNrKCkgZm9yIHRoZSB1c2FnZSBvZiB0aGVzZSByb3V0aW5lcy4KLQotICAgICBpbmZsYXRlQmFja0luaXQgd2lsbCByZXR1cm4gWl9PSyBvbiBzdWNjZXNzLCBaX1NUUkVBTV9FUlJPUiBpZiBhbnkgb2YKLSAgIHRoZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLCBaX01FTV9FUlJPUiBpZiB0aGUgaW50ZXJuYWwgc3RhdGUgY291bGQgbm90IGJlCi0gICBhbGxvY2F0ZWQsIG9yIFpfVkVSU0lPTl9FUlJPUiBpZiB0aGUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBkb2VzIG5vdCBtYXRjaAotICAgdGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlciBmaWxlLgotKi8KLQotdHlwZWRlZiB1bnNpZ25lZCAoKmluX2Z1bmMpIE9GKCh2b2lkIEZBUiAqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6X2NvbnN0IHVuc2lnbmVkIGNoYXIgRkFSICogRkFSICopKTsKLXR5cGVkZWYgaW50ICgqb3V0X2Z1bmMpIE9GKCh2b2lkIEZBUiAqLCB1bnNpZ25lZCBjaGFyIEZBUiAqLCB1bnNpZ25lZCkpOwotCi1aRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVCYWNrIE9GKCh6X3N0cmVhbXAgc3RybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluX2Z1bmMgaW4sIHZvaWQgRkFSICppbl9kZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2Z1bmMgb3V0LCB2b2lkIEZBUiAqb3V0X2Rlc2MpKTsKLS8qCi0gICAgIGluZmxhdGVCYWNrKCkgZG9lcyBhIHJhdyBpbmZsYXRlIHdpdGggYSBzaW5nbGUgY2FsbCB1c2luZyBhIGNhbGwtYmFjawotICAgaW50ZXJmYWNlIGZvciBpbnB1dCBhbmQgb3V0cHV0LiAgVGhpcyBpcyBwb3RlbnRpYWxseSBtb3JlIGVmZmljaWVudCB0aGFuCi0gICBpbmZsYXRlKCkgZm9yIGZpbGUgaS9vIGFwcGxpY2F0aW9ucywgaW4gdGhhdCBpdCBhdm9pZHMgY29weWluZyBiZXR3ZWVuIHRoZQotICAgb3V0cHV0IGFuZCB0aGUgc2xpZGluZyB3aW5kb3cgYnkgc2ltcGx5IG1ha2luZyB0aGUgd2luZG93IGl0c2VsZiB0aGUgb3V0cHV0Ci0gICBidWZmZXIuICBpbmZsYXRlKCkgY2FuIGJlIGZhc3RlciBvbiBtb2Rlcm4gQ1BVcyB3aGVuIHVzZWQgd2l0aCBsYXJnZQotICAgYnVmZmVycy4gIGluZmxhdGVCYWNrKCkgdHJ1c3RzIHRoZSBhcHBsaWNhdGlvbiB0byBub3QgY2hhbmdlIHRoZSBvdXRwdXQKLSAgIGJ1ZmZlciBwYXNzZWQgYnkgdGhlIG91dHB1dCBmdW5jdGlvbiwgYXQgbGVhc3QgdW50aWwgaW5mbGF0ZUJhY2soKSByZXR1cm5zLgotCi0gICAgIGluZmxhdGVCYWNrSW5pdCgpIG11c3QgYmUgY2FsbGVkIGZpcnN0IHRvIGFsbG9jYXRlIHRoZSBpbnRlcm5hbCBzdGF0ZQotICAgYW5kIHRvIGluaXRpYWxpemUgdGhlIHN0YXRlIHdpdGggdGhlIHVzZXItcHJvdmlkZWQgd2luZG93IGJ1ZmZlci4KLSAgIGluZmxhdGVCYWNrKCkgbWF5IHRoZW4gYmUgdXNlZCBtdWx0aXBsZSB0aW1lcyB0byBpbmZsYXRlIGEgY29tcGxldGUsIHJhdwotICAgZGVmbGF0ZSBzdHJlYW0gd2l0aCBlYWNoIGNhbGwuICBpbmZsYXRlQmFja0VuZCgpIGlzIHRoZW4gY2FsbGVkIHRvIGZyZWUgdGhlCi0gICBhbGxvY2F0ZWQgc3RhdGUuCi0KLSAgICAgQSByYXcgZGVmbGF0ZSBzdHJlYW0gaXMgb25lIHdpdGggbm8gemxpYiBvciBnemlwIGhlYWRlciBvciB0cmFpbGVyLgotICAgVGhpcyByb3V0aW5lIHdvdWxkIG5vcm1hbGx5IGJlIHVzZWQgaW4gYSB1dGlsaXR5IHRoYXQgcmVhZHMgemlwIG9yIGd6aXAKLSAgIGZpbGVzIGFuZCB3cml0ZXMgb3V0IHVuY29tcHJlc3NlZCBmaWxlcy4gIFRoZSB1dGlsaXR5IHdvdWxkIGRlY29kZSB0aGUKLSAgIGhlYWRlciBhbmQgcHJvY2VzcyB0aGUgdHJhaWxlciBvbiBpdHMgb3duLCBoZW5jZSB0aGlzIHJvdXRpbmUgZXhwZWN0cyBvbmx5Ci0gICB0aGUgcmF3IGRlZmxhdGUgc3RyZWFtIHRvIGRlY29tcHJlc3MuICBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBub3JtYWwKLSAgIGJlaGF2aW9yIG9mIGluZmxhdGUoKSwgd2hpY2ggZXhwZWN0cyBlaXRoZXIgYSB6bGliIG9yIGd6aXAgaGVhZGVyIGFuZAotICAgdHJhaWxlciBhcm91bmQgdGhlIGRlZmxhdGUgc3RyZWFtLgotCi0gICAgIGluZmxhdGVCYWNrKCkgdXNlcyB0d28gc3Vicm91dGluZXMgc3VwcGxpZWQgYnkgdGhlIGNhbGxlciB0aGF0IGFyZSB0aGVuCi0gICBjYWxsZWQgYnkgaW5mbGF0ZUJhY2soKSBmb3IgaW5wdXQgYW5kIG91dHB1dC4gIGluZmxhdGVCYWNrKCkgY2FsbHMgdGhvc2UKLSAgIHJvdXRpbmVzIHVudGlsIGl0IHJlYWRzIGEgY29tcGxldGUgZGVmbGF0ZSBzdHJlYW0gYW5kIHdyaXRlcyBvdXQgYWxsIG9mIHRoZQotICAgdW5jb21wcmVzc2VkIGRhdGEsIG9yIHVudGlsIGl0IGVuY291bnRlcnMgYW4gZXJyb3IuICBUaGUgZnVuY3Rpb24ncwotICAgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHR5cGVzIGFyZSBkZWZpbmVkIGFib3ZlIGluIHRoZSBpbl9mdW5jIGFuZCBvdXRfZnVuYwotICAgdHlwZWRlZnMuICBpbmZsYXRlQmFjaygpIHdpbGwgY2FsbCBpbihpbl9kZXNjLCAmYnVmKSB3aGljaCBzaG91bGQgcmV0dXJuIHRoZQotICAgbnVtYmVyIG9mIGJ5dGVzIG9mIHByb3ZpZGVkIGlucHV0LCBhbmQgYSBwb2ludGVyIHRvIHRoYXQgaW5wdXQgaW4gYnVmLiAgSWYKLSAgIHRoZXJlIGlzIG5vIGlucHV0IGF2YWlsYWJsZSwgaW4oKSBtdXN0IHJldHVybiB6ZXJvLS1idWYgaXMgaWdub3JlZCBpbiB0aGF0Ci0gICBjYXNlLS1hbmQgaW5mbGF0ZUJhY2soKSB3aWxsIHJldHVybiBhIGJ1ZmZlciBlcnJvci4gIGluZmxhdGVCYWNrKCkgd2lsbCBjYWxsCi0gICBvdXQob3V0X2Rlc2MsIGJ1ZiwgbGVuKSB0byB3cml0ZSB0aGUgdW5jb21wcmVzc2VkIGRhdGEgYnVmWzAuLmxlbi0xXS4gIG91dCgpCi0gICBzaG91bGQgcmV0dXJuIHplcm8gb24gc3VjY2Vzcywgb3Igbm9uLXplcm8gb24gZmFpbHVyZS4gIElmIG91dCgpIHJldHVybnMKLSAgIG5vbi16ZXJvLCBpbmZsYXRlQmFjaygpIHdpbGwgcmV0dXJuIHdpdGggYW4gZXJyb3IuICBOZWl0aGVyIGluKCkgbm9yIG91dCgpCi0gICBhcmUgcGVybWl0dGVkIHRvIGNoYW5nZSB0aGUgY29udGVudHMgb2YgdGhlIHdpbmRvdyBwcm92aWRlZCB0bwotICAgaW5mbGF0ZUJhY2tJbml0KCksIHdoaWNoIGlzIGFsc28gdGhlIGJ1ZmZlciB0aGF0IG91dCgpIHVzZXMgdG8gd3JpdGUgZnJvbS4KLSAgIFRoZSBsZW5ndGggd3JpdHRlbiBieSBvdXQoKSB3aWxsIGJlIGF0IG1vc3QgdGhlIHdpbmRvdyBzaXplLiAgQW55IG5vbi16ZXJvCi0gICBhbW91bnQgb2YgaW5wdXQgbWF5IGJlIHByb3ZpZGVkIGJ5IGluKCkuCi0KLSAgICAgRm9yIGNvbnZlbmllbmNlLCBpbmZsYXRlQmFjaygpIGNhbiBiZSBwcm92aWRlZCBpbnB1dCBvbiB0aGUgZmlyc3QgY2FsbCBieQotICAgc2V0dGluZyBzdHJtLT5uZXh0X2luIGFuZCBzdHJtLT5hdmFpbF9pbi4gIElmIHRoYXQgaW5wdXQgaXMgZXhoYXVzdGVkLCB0aGVuCi0gICBpbigpIHdpbGwgYmUgY2FsbGVkLiAgVGhlcmVmb3JlIHN0cm0tPm5leHRfaW4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUKLSAgIGNhbGxpbmcgaW5mbGF0ZUJhY2soKS4gIElmIHN0cm0tPm5leHRfaW4gaXMgWl9OVUxMLCB0aGVuIGluKCkgd2lsbCBiZSBjYWxsZWQKLSAgIGltbWVkaWF0ZWx5IGZvciBpbnB1dC4gIElmIHN0cm0tPm5leHRfaW4gaXMgbm90IFpfTlVMTCwgdGhlbiBzdHJtLT5hdmFpbF9pbgotICAgbXVzdCBhbHNvIGJlIGluaXRpYWxpemVkLCBhbmQgdGhlbiBpZiBzdHJtLT5hdmFpbF9pbiBpcyBub3QgemVybywgaW5wdXQgd2lsbAotICAgaW5pdGlhbGx5IGJlIHRha2VuIGZyb20gc3RybS0+bmV4dF9pblswIC4uICBzdHJtLT5hdmFpbF9pbiAtIDFdLgotCi0gICAgIFRoZSBpbl9kZXNjIGFuZCBvdXRfZGVzYyBwYXJhbWV0ZXJzIG9mIGluZmxhdGVCYWNrKCkgaXMgcGFzc2VkIGFzIHRoZQotICAgZmlyc3QgcGFyYW1ldGVyIG9mIGluKCkgYW5kIG91dCgpIHJlc3BlY3RpdmVseSB3aGVuIHRoZXkgYXJlIGNhbGxlZC4gIFRoZXNlCi0gICBkZXNjcmlwdG9ycyBjYW4gYmUgb3B0aW9uYWxseSB1c2VkIHRvIHBhc3MgYW55IGluZm9ybWF0aW9uIHRoYXQgdGhlIGNhbGxlci0KLSAgIHN1cHBsaWVkIGluKCkgYW5kIG91dCgpIGZ1bmN0aW9ucyBuZWVkIHRvIGRvIHRoZWlyIGpvYi4KLQotICAgICBPbiByZXR1cm4sIGluZmxhdGVCYWNrKCkgd2lsbCBzZXQgc3RybS0+bmV4dF9pbiBhbmQgc3RybS0+YXZhaWxfaW4gdG8KLSAgIHBhc3MgYmFjayBhbnkgdW51c2VkIGlucHV0IHRoYXQgd2FzIHByb3ZpZGVkIGJ5IHRoZSBsYXN0IGluKCkgY2FsbC4gIFRoZQotICAgcmV0dXJuIHZhbHVlcyBvZiBpbmZsYXRlQmFjaygpIGNhbiBiZSBaX1NUUkVBTV9FTkQgb24gc3VjY2VzcywgWl9CVUZfRVJST1IKLSAgIGlmIGluKCkgb3Igb3V0KCkgcmV0dXJuZWQgYW4gZXJyb3IsIFpfREFUQV9FUlJPUiBpZiB0aGVyZSB3YXMgYSBmb3JtYXQgZXJyb3IKLSAgIGluIHRoZSBkZWZsYXRlIHN0cmVhbSAoaW4gd2hpY2ggY2FzZSBzdHJtLT5tc2cgaXMgc2V0IHRvIGluZGljYXRlIHRoZSBuYXR1cmUKLSAgIG9mIHRoZSBlcnJvciksIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0gd2FzIG5vdCBwcm9wZXJseSBpbml0aWFsaXplZC4KLSAgIEluIHRoZSBjYXNlIG9mIFpfQlVGX0VSUk9SLCBhbiBpbnB1dCBvciBvdXRwdXQgZXJyb3IgY2FuIGJlIGRpc3Rpbmd1aXNoZWQKLSAgIHVzaW5nIHN0cm0tPm5leHRfaW4gd2hpY2ggd2lsbCBiZSBaX05VTEwgb25seSBpZiBpbigpIHJldHVybmVkIGFuIGVycm9yLiAgSWYKLSAgIHN0cm0tPm5leHRfaW4gaXMgbm90IFpfTlVMTCwgdGhlbiB0aGUgWl9CVUZfRVJST1Igd2FzIGR1ZSB0byBvdXQoKSByZXR1cm5pbmcKLSAgIG5vbi16ZXJvLiAgKGluKCkgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGJlZm9yZSBvdXQoKSwgc28gc3RybS0+bmV4dF9pbiBpcwotICAgYXNzdXJlZCB0byBiZSBkZWZpbmVkIGlmIG91dCgpIHJldHVybnMgbm9uLXplcm8uKSBOb3RlIHRoYXQgaW5mbGF0ZUJhY2soKQotICAgY2Fubm90IHJldHVybiBaX09LLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0VuZCBPRigoel9zdHJlYW1wIHN0cm0pKTsKLS8qCi0gICAgIEFsbCBtZW1vcnkgYWxsb2NhdGVkIGJ5IGluZmxhdGVCYWNrSW5pdCgpIGlzIGZyZWVkLgotCi0gICAgIGluZmxhdGVCYWNrRW5kKCkgcmV0dXJucyBaX09LIG9uIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBzdHJlYW0KLSAgIHN0YXRlIHdhcyBpbmNvbnNpc3RlbnQuCi0qLwotCi1aRVhURVJOIHVMb25nIFpFWFBPUlQgemxpYkNvbXBpbGVGbGFncyBPRigodm9pZCkpOwotLyogUmV0dXJuIGZsYWdzIGluZGljYXRpbmcgY29tcGlsZS10aW1lIG9wdGlvbnMuCi0KLSAgICBUeXBlIHNpemVzLCB0d28gYml0cyBlYWNoLCAwMCA9IDE2IGJpdHMsIDAxID0gMzIsIDEwID0gNjQsIDExID0gb3RoZXI6Ci0gICAgIDEuMDogc2l6ZSBvZiB1SW50Ci0gICAgIDMuMjogc2l6ZSBvZiB1TG9uZwotICAgICA1LjQ6IHNpemUgb2Ygdm9pZHBmIChwb2ludGVyKQotICAgICA3LjY6IHNpemUgb2Ygel9vZmZfdAotCi0gICAgQ29tcGlsZXIsIGFzc2VtYmxlciwgYW5kIGRlYnVnIG9wdGlvbnM6Ci0gICAgIDg6IERFQlVHCi0gICAgIDk6IEFTTVYgb3IgQVNNSU5GIC0tIHVzZSBBU00gY29kZQotICAgICAxMDogWkxJQl9XSU5BUEkgLS0gZXhwb3J0ZWQgZnVuY3Rpb25zIHVzZSB0aGUgV0lOQVBJIGNhbGxpbmcgY29udmVudGlvbgotICAgICAxMTogMCAocmVzZXJ2ZWQpCi0KLSAgICBPbmUtdGltZSB0YWJsZSBidWlsZGluZyAoc21hbGxlciBjb2RlLCBidXQgbm90IHRocmVhZC1zYWZlIGlmIHRydWUpOgotICAgICAxMjogQlVJTERGSVhFRCAtLSBidWlsZCBzdGF0aWMgYmxvY2sgZGVjb2RpbmcgdGFibGVzIHdoZW4gbmVlZGVkCi0gICAgIDEzOiBEWU5BTUlDX0NSQ19UQUJMRSAtLSBidWlsZCBDUkMgY2FsY3VsYXRpb24gdGFibGVzIHdoZW4gbmVlZGVkCi0gICAgIDE0LDE1OiAwIChyZXNlcnZlZCkKLQotICAgIExpYnJhcnkgY29udGVudCAoaW5kaWNhdGVzIG1pc3NpbmcgZnVuY3Rpb25hbGl0eSk6Ci0gICAgIDE2OiBOT19HWkNPTVBSRVNTIC0tIGd6KiBmdW5jdGlvbnMgY2Fubm90IGNvbXByZXNzICh0byBhdm9pZCBsaW5raW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmxhdGUgY29kZSB3aGVuIG5vdCBuZWVkZWQpCi0gICAgIDE3OiBOT19HWklQIC0tIGRlZmxhdGUgY2FuJ3Qgd3JpdGUgZ3ppcCBzdHJlYW1zLCBhbmQgaW5mbGF0ZSBjYW4ndCBkZXRlY3QKLSAgICAgICAgICAgICAgICAgICAgYW5kIGRlY29kZSBnemlwIHN0cmVhbXMgKHRvIGF2b2lkIGxpbmtpbmcgY3JjIGNvZGUpCi0gICAgIDE4LTE5OiAwIChyZXNlcnZlZCkKLQotICAgIE9wZXJhdGlvbiB2YXJpYXRpb25zIChjaGFuZ2VzIGluIGxpYnJhcnkgZnVuY3Rpb25hbGl0eSk6Ci0gICAgIDIwOiBQS1pJUF9CVUdfV09SS0FST1VORCAtLSBzbGlnaHRseSBtb3JlIHBlcm1pc3NpdmUgaW5mbGF0ZQotICAgICAyMTogRkFTVEVTVCAtLSBkZWZsYXRlIGFsZ29yaXRobSB3aXRoIG9ubHkgb25lLCBsb3dlc3QgY29tcHJlc3Npb24gbGV2ZWwKLSAgICAgMjIsMjM6IDAgKHJlc2VydmVkKQotCi0gICAgVGhlIHNwcmludGYgdmFyaWFudCB1c2VkIGJ5IGd6cHJpbnRmICh6ZXJvIGlzIGJlc3QpOgotICAgICAyNDogMCA9IHZzKiwgMSA9IHMqIC0tIDEgbWVhbnMgbGltaXRlZCB0byAyMCBhcmd1bWVudHMgYWZ0ZXIgdGhlIGZvcm1hdAotICAgICAyNTogMCA9ICpucHJpbnRmLCAxID0gKnByaW50ZiAtLSAxIG1lYW5zIGd6cHJpbnRmKCkgbm90IHNlY3VyZSEKLSAgICAgMjY6IDAgPSByZXR1cm5zIHZhbHVlLCAxID0gdm9pZCAtLSAxIG1lYW5zIGluZmVycmVkIHN0cmluZyBsZW5ndGggcmV0dXJuZWQKLQotICAgIFJlbWFpbmRlcjoKLSAgICAgMjctMzE6IDAgKHJlc2VydmVkKQotICovCi0KLSNpZm5kZWYgWl9TT0xPCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHV0aWxpdHkgZnVuY3Rpb25zICovCi0KLS8qCi0gICAgIFRoZSBmb2xsb3dpbmcgdXRpbGl0eSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIG9uIHRvcCBvZiB0aGUgYmFzaWMKLSAgIHN0cmVhbS1vcmllbnRlZCBmdW5jdGlvbnMuICBUbyBzaW1wbGlmeSB0aGUgaW50ZXJmYWNlLCBzb21lIGRlZmF1bHQgb3B0aW9ucwotICAgYXJlIGFzc3VtZWQgKGNvbXByZXNzaW9uIGxldmVsIGFuZCBtZW1vcnkgdXNhZ2UsIHN0YW5kYXJkIG1lbW9yeSBhbGxvY2F0aW9uCi0gICBmdW5jdGlvbnMpLiAgVGhlIHNvdXJjZSBjb2RlIG9mIHRoZXNlIHV0aWxpdHkgZnVuY3Rpb25zIGNhbiBiZSBtb2RpZmllZCBpZgotICAgeW91IG5lZWQgc3BlY2lhbCBvcHRpb25zLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBjb21wcmVzcyBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZWYgKnNvdXJjZSwgdUxvbmcgc291cmNlTGVuKSk7Ci0vKgotICAgICBDb21wcmVzc2VzIHRoZSBzb3VyY2UgYnVmZmVyIGludG8gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gIHNvdXJjZUxlbiBpcwotICAgdGhlIGJ5dGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgYnVmZmVyLiAgVXBvbiBlbnRyeSwgZGVzdExlbiBpcyB0aGUgdG90YWwgc2l6ZQotICAgb2YgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBhdCBsZWFzdCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkKLSAgIGNvbXByZXNzQm91bmQoc291cmNlTGVuKS4gIFVwb24gZXhpdCwgZGVzdExlbiBpcyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlCi0gICBjb21wcmVzc2VkIGJ1ZmZlci4KLQotICAgICBjb21wcmVzcyByZXR1cm5zIFpfT0sgaWYgc3VjY2VzcywgWl9NRU1fRVJST1IgaWYgdGhlcmUgd2FzIG5vdAotICAgZW5vdWdoIG1lbW9yeSwgWl9CVUZfRVJST1IgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgb3V0cHV0Ci0gICBidWZmZXIuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGNvbXByZXNzMiBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVmICpzb3VyY2UsIHVMb25nIHNvdXJjZUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwpKTsKLS8qCi0gICAgIENvbXByZXNzZXMgdGhlIHNvdXJjZSBidWZmZXIgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLiAgVGhlIGxldmVsCi0gICBwYXJhbWV0ZXIgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgaW4gZGVmbGF0ZUluaXQuICBzb3VyY2VMZW4gaXMgdGhlIGJ5dGUKLSAgIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsIHNpemUgb2YgdGhlCi0gICBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgYXQgbGVhc3QgdGhlIHZhbHVlIHJldHVybmVkIGJ5Ci0gICBjb21wcmVzc0JvdW5kKHNvdXJjZUxlbikuICBVcG9uIGV4aXQsIGRlc3RMZW4gaXMgdGhlIGFjdHVhbCBzaXplIG9mIHRoZQotICAgY29tcHJlc3NlZCBidWZmZXIuCi0KLSAgICAgY29tcHJlc3MyIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaAotICAgbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQgYnVmZmVyLAotICAgWl9TVFJFQU1fRVJST1IgaWYgdGhlIGxldmVsIHBhcmFtZXRlciBpcyBpbnZhbGlkLgotKi8KLQotWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNvbXByZXNzQm91bmQgT0YoKHVMb25nIHNvdXJjZUxlbikpOwotLyoKLSAgICAgY29tcHJlc3NCb3VuZCgpIHJldHVybnMgYW4gdXBwZXIgYm91bmQgb24gdGhlIGNvbXByZXNzZWQgc2l6ZSBhZnRlcgotICAgY29tcHJlc3MoKSBvciBjb21wcmVzczIoKSBvbiBzb3VyY2VMZW4gYnl0ZXMuICBJdCB3b3VsZCBiZSB1c2VkIGJlZm9yZSBhCi0gICBjb21wcmVzcygpIG9yIGNvbXByZXNzMigpIGNhbGwgdG8gYWxsb2NhdGUgdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgdW5jb21wcmVzcyBPRigoQnl0ZWYgKmRlc3QsICAgdUxvbmdmICpkZXN0TGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlZiAqc291cmNlLCB1TG9uZyBzb3VyY2VMZW4pKTsKLS8qCi0gICAgIERlY29tcHJlc3NlcyB0aGUgc291cmNlIGJ1ZmZlciBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuICBzb3VyY2VMZW4gaXMKLSAgIHRoZSBieXRlIGxlbmd0aCBvZiB0aGUgc291cmNlIGJ1ZmZlci4gIFVwb24gZW50cnksIGRlc3RMZW4gaXMgdGhlIHRvdGFsIHNpemUKLSAgIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIsIHdoaWNoIG11c3QgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIGVudGlyZQotICAgdW5jb21wcmVzc2VkIGRhdGEuICAoVGhlIHNpemUgb2YgdGhlIHVuY29tcHJlc3NlZCBkYXRhIG11c3QgaGF2ZSBiZWVuIHNhdmVkCi0gICBwcmV2aW91c2x5IGJ5IHRoZSBjb21wcmVzc29yIGFuZCB0cmFuc21pdHRlZCB0byB0aGUgZGVjb21wcmVzc29yIGJ5IHNvbWUKLSAgIG1lY2hhbmlzbSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0aGlzIGNvbXByZXNzaW9uIGxpYnJhcnkuKSBVcG9uIGV4aXQsIGRlc3RMZW4KLSAgIGlzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgdW5jb21wcmVzc2VkIGJ1ZmZlci4KLQotICAgICB1bmNvbXByZXNzIHJldHVybnMgWl9PSyBpZiBzdWNjZXNzLCBaX01FTV9FUlJPUiBpZiB0aGVyZSB3YXMgbm90Ci0gICBlbm91Z2ggbWVtb3J5LCBaX0JVRl9FUlJPUiBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCByb29tIGluIHRoZSBvdXRwdXQKLSAgIGJ1ZmZlciwgb3IgWl9EQVRBX0VSUk9SIGlmIHRoZSBpbnB1dCBkYXRhIHdhcyBjb3JydXB0ZWQgb3IgaW5jb21wbGV0ZS4gIEluCi0gICB0aGUgY2FzZSB3aGVyZSB0aGVyZSBpcyBub3QgZW5vdWdoIHJvb20sIHVuY29tcHJlc3MoKSB3aWxsIGZpbGwgdGhlIG91dHB1dAotICAgYnVmZmVyIHdpdGggdGhlIHVuY29tcHJlc3NlZCBkYXRhIHVwIHRvIHRoYXQgcG9pbnQuCi0qLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBnemlwIGZpbGUgYWNjZXNzIGZ1bmN0aW9ucyAqLwotCi0vKgotICAgICBUaGlzIGxpYnJhcnkgc3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZyBmaWxlcyBpbiBnemlwICguZ3opIGZvcm1hdCB3aXRoCi0gICBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGF0IG9mIHN0ZGlvLCB1c2luZyB0aGUgZnVuY3Rpb25zIHRoYXQgc3RhcnQgd2l0aAotICAgImd6Ii4gIFRoZSBnemlwIGZvcm1hdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgemxpYiBmb3JtYXQuICBnemlwIGlzIGEgZ3ppcAotICAgd3JhcHBlciwgZG9jdW1lbnRlZCBpbiBSRkMgMTk1Miwgd3JhcHBlZCBhcm91bmQgYSBkZWZsYXRlIHN0cmVhbS4KLSovCi0KLXR5cGVkZWYgc3RydWN0IGd6RmlsZV9zICpnekZpbGU7ICAgIC8qIHNlbWktb3BhcXVlIGd6aXAgZmlsZSBkZXNjcmlwdG9yICovCi0KLS8qCi1aRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6b3BlbiBPRigoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbW9kZSkpOwotCi0gICAgIE9wZW5zIGEgZ3ppcCAoLmd6KSBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuICBUaGUgbW9kZSBwYXJhbWV0ZXIgaXMgYXMKLSAgIGluIGZvcGVuICgicmIiIG9yICJ3YiIpIGJ1dCBjYW4gYWxzbyBpbmNsdWRlIGEgY29tcHJlc3Npb24gbGV2ZWwgKCJ3YjkiKSBvcgotICAgYSBzdHJhdGVneTogJ2YnIGZvciBmaWx0ZXJlZCBkYXRhIGFzIGluICJ3YjZmIiwgJ2gnIGZvciBIdWZmbWFuLW9ubHkKLSAgIGNvbXByZXNzaW9uIGFzIGluICJ3YjFoIiwgJ1InIGZvciBydW4tbGVuZ3RoIGVuY29kaW5nIGFzIGluICJ3YjFSIiwgb3IgJ0YnCi0gICBmb3IgZml4ZWQgY29kZSBjb21wcmVzc2lvbiBhcyBpbiAid2I5RiIuICAoU2VlIHRoZSBkZXNjcmlwdGlvbiBvZgotICAgZGVmbGF0ZUluaXQyIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdHJhdGVneSBwYXJhbWV0ZXIuKSAgJ1QnIHdpbGwKLSAgIHJlcXVlc3QgdHJhbnNwYXJlbnQgd3JpdGluZyBvciBhcHBlbmRpbmcgd2l0aCBubyBjb21wcmVzc2lvbiBhbmQgbm90IHVzaW5nCi0gICB0aGUgZ3ppcCBmb3JtYXQuCi0KLSAgICAgImEiIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgInciIHRvIHJlcXVlc3QgdGhhdCB0aGUgZ3ppcCBzdHJlYW0gdGhhdCB3aWxsCi0gICBiZSB3cml0dGVuIGJlIGFwcGVuZGVkIHRvIHRoZSBmaWxlLiAgIisiIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLCBzaW5jZQotICAgcmVhZGluZyBhbmQgd3JpdGluZyB0byB0aGUgc2FtZSBnemlwIGZpbGUgaXMgbm90IHN1cHBvcnRlZC4gIFRoZSBhZGRpdGlvbiBvZgotICAgIngiIHdoZW4gd3JpdGluZyB3aWxsIGNyZWF0ZSB0aGUgZmlsZSBleGNsdXNpdmVseSwgd2hpY2ggZmFpbHMgaWYgdGhlIGZpbGUKLSAgIGFscmVhZHkgZXhpc3RzLiAgT24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgaXQsIHRoZSBhZGRpdGlvbiBvZiAiZSIgd2hlbgotICAgcmVhZGluZyBvciB3cml0aW5nIHdpbGwgc2V0IHRoZSBmbGFnIHRvIGNsb3NlIHRoZSBmaWxlIG9uIGFuIGV4ZWN2ZSgpIGNhbGwuCi0KLSAgICAgVGhlc2UgZnVuY3Rpb25zLCBhcyB3ZWxsIGFzIGd6aXAsIHdpbGwgcmVhZCBhbmQgZGVjb2RlIGEgc2VxdWVuY2Ugb2YgZ3ppcAotICAgc3RyZWFtcyBpbiBhIGZpbGUuICBUaGUgYXBwZW5kIGZ1bmN0aW9uIG9mIGd6b3BlbigpIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZQotICAgc3VjaCBhIGZpbGUuICAoQWxzbyBzZWUgZ3pmbHVzaCgpIGZvciBhbm90aGVyIHdheSB0byBkbyB0aGlzLikgIFdoZW4KLSAgIGFwcGVuZGluZywgZ3pvcGVuIGRvZXMgbm90IHRlc3Qgd2hldGhlciB0aGUgZmlsZSBiZWdpbnMgd2l0aCBhIGd6aXAgc3RyZWFtLAotICAgbm9yIGRvZXMgaXQgbG9vayBmb3IgdGhlIGVuZCBvZiB0aGUgZ3ppcCBzdHJlYW1zIHRvIGJlZ2luIGFwcGVuZGluZy4gIGd6b3BlbgotICAgd2lsbCBzaW1wbHkgYXBwZW5kIGEgZ3ppcCBzdHJlYW0gdG8gdGhlIGV4aXN0aW5nIGZpbGUuCi0KLSAgICAgZ3pvcGVuIGNhbiBiZSB1c2VkIHRvIHJlYWQgYSBmaWxlIHdoaWNoIGlzIG5vdCBpbiBnemlwIGZvcm1hdDsgaW4gdGhpcwotICAgY2FzZSBnenJlYWQgd2lsbCBkaXJlY3RseSByZWFkIGZyb20gdGhlIGZpbGUgd2l0aG91dCBkZWNvbXByZXNzaW9uLiAgV2hlbgotICAgcmVhZGluZywgdGhpcyB3aWxsIGJlIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkgYnkgbG9va2luZyBmb3IgdGhlIG1hZ2ljIHR3by0KLSAgIGJ5dGUgZ3ppcCBoZWFkZXIuCi0KLSAgICAgZ3pvcGVuIHJldHVybnMgTlVMTCBpZiB0aGUgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkLCBpZiB0aGVyZSB3YXMKLSAgIGluc3VmZmljaWVudCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGd6RmlsZSBzdGF0ZSwgb3IgaWYgYW4gaW52YWxpZCBtb2RlIHdhcwotICAgc3BlY2lmaWVkIChhbiAncicsICd3Jywgb3IgJ2EnIHdhcyBub3QgcHJvdmlkZWQsIG9yICcrJyB3YXMgcHJvdmlkZWQpLgotICAgZXJybm8gY2FuIGJlIGNoZWNrZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZWFzb24gZ3pvcGVuIGZhaWxlZCB3YXMgdGhhdCB0aGUKLSAgIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZC4KLSovCi0KLVpFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pkb3BlbiBPRigoaW50IGZkLCBjb25zdCBjaGFyICptb2RlKSk7Ci0vKgotICAgICBnemRvcGVuIGFzc29jaWF0ZXMgYSBnekZpbGUgd2l0aCB0aGUgZmlsZSBkZXNjcmlwdG9yIGZkLiAgRmlsZSBkZXNjcmlwdG9ycwotICAgYXJlIG9idGFpbmVkIGZyb20gY2FsbHMgbGlrZSBvcGVuLCBkdXAsIGNyZWF0LCBwaXBlIG9yIGZpbGVubyAoaWYgdGhlIGZpbGUKLSAgIGhhcyBiZWVuIHByZXZpb3VzbHkgb3BlbmVkIHdpdGggZm9wZW4pLiAgVGhlIG1vZGUgcGFyYW1ldGVyIGlzIGFzIGluIGd6b3Blbi4KLQotICAgICBUaGUgbmV4dCBjYWxsIG9mIGd6Y2xvc2Ugb24gdGhlIHJldHVybmVkIGd6RmlsZSB3aWxsIGFsc28gY2xvc2UgdGhlIGZpbGUKLSAgIGRlc2NyaXB0b3IgZmQsIGp1c3QgbGlrZSBmY2xvc2UoZmRvcGVuKGZkLCBtb2RlKSkgY2xvc2VzIHRoZSBmaWxlIGRlc2NyaXB0b3IKLSAgIGZkLiAgSWYgeW91IHdhbnQgdG8ga2VlcCBmZCBvcGVuLCB1c2UgZmQgPSBkdXAoZmRfa2VlcCk7IGd6ID0gZ3pkb3BlbihmZCwKLSAgIG1vZGUpOy4gIFRoZSBkdXBsaWNhdGVkIGRlc2NyaXB0b3Igc2hvdWxkIGJlIHNhdmVkIHRvIGF2b2lkIGEgbGVhaywgc2luY2UKLSAgIGd6ZG9wZW4gZG9lcyBub3QgY2xvc2UgZmQgaWYgaXQgZmFpbHMuICBJZiB5b3UgYXJlIHVzaW5nIGZpbGVubygpIHRvIGdldCB0aGUKLSAgIGZpbGUgZGVzY3JpcHRvciBmcm9tIGEgRklMRSAqLCB0aGVuIHlvdSB3aWxsIGhhdmUgdG8gdXNlIGR1cCgpIHRvIGF2b2lkCi0gICBkb3VibGUtY2xvc2UoKWluZyB0aGUgZmlsZSBkZXNjcmlwdG9yLiAgQm90aCBnemNsb3NlKCkgYW5kIGZjbG9zZSgpIHdpbGwKLSAgIGNsb3NlIHRoZSBhc3NvY2lhdGVkIGZpbGUgZGVzY3JpcHRvciwgc28gdGhleSBuZWVkIHRvIGhhdmUgZGlmZmVyZW50IGZpbGUKLSAgIGRlc2NyaXB0b3JzLgotCi0gICAgIGd6ZG9wZW4gcmV0dXJucyBOVUxMIGlmIHRoZXJlIHdhcyBpbnN1ZmZpY2llbnQgbWVtb3J5IHRvIGFsbG9jYXRlIHRoZQotICAgZ3pGaWxlIHN0YXRlLCBpZiBhbiBpbnZhbGlkIG1vZGUgd2FzIHNwZWNpZmllZCAoYW4gJ3InLCAndycsIG9yICdhJyB3YXMgbm90Ci0gICBwcm92aWRlZCwgb3IgJysnIHdhcyBwcm92aWRlZCksIG9yIGlmIGZkIGlzIC0xLiAgVGhlIGZpbGUgZGVzY3JpcHRvciBpcyBub3QKLSAgIHVzZWQgdW50aWwgdGhlIG5leHQgZ3oqIHJlYWQsIHdyaXRlLCBzZWVrLCBvciBjbG9zZSBvcGVyYXRpb24sIHNvIGd6ZG9wZW4KLSAgIHdpbGwgbm90IGRldGVjdCBpZiBmZCBpcyBpbnZhbGlkICh1bmxlc3MgZmQgaXMgLTEpLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBnemJ1ZmZlciBPRigoZ3pGaWxlIGZpbGUsIHVuc2lnbmVkIHNpemUpKTsKLS8qCi0gICAgIFNldCB0aGUgaW50ZXJuYWwgYnVmZmVyIHNpemUgdXNlZCBieSB0aGlzIGxpYnJhcnkncyBmdW5jdGlvbnMuICBUaGUKLSAgIGRlZmF1bHQgYnVmZmVyIHNpemUgaXMgODE5MiBieXRlcy4gIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYWZ0ZXIKLSAgIGd6b3BlbigpIG9yIGd6ZG9wZW4oKSwgYW5kIGJlZm9yZSBhbnkgb3RoZXIgY2FsbHMgdGhhdCByZWFkIG9yIHdyaXRlIHRoZQotICAgZmlsZS4gIFRoZSBidWZmZXIgbWVtb3J5IGFsbG9jYXRpb24gaXMgYWx3YXlzIGRlZmVycmVkIHRvIHRoZSBmaXJzdCByZWFkIG9yCi0gICB3cml0ZS4gIFR3byBidWZmZXJzIGFyZSBhbGxvY2F0ZWQsIGVpdGhlciBib3RoIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSB3aGVuCi0gICB3cml0aW5nLCBvciBvbmUgb2YgdGhlIHNwZWNpZmllZCBzaXplIGFuZCB0aGUgb3RoZXIgdHdpY2UgdGhhdCBzaXplIHdoZW4KLSAgIHJlYWRpbmcuICBBIGxhcmdlciBidWZmZXIgc2l6ZSBvZiwgZm9yIGV4YW1wbGUsIDY0SyBvciAxMjhLIGJ5dGVzIHdpbGwKLSAgIG5vdGljZWFibHkgaW5jcmVhc2UgdGhlIHNwZWVkIG9mIGRlY29tcHJlc3Npb24gKHJlYWRpbmcpLgotCi0gICAgIFRoZSBuZXcgYnVmZmVyIHNpemUgYWxzbyBhZmZlY3RzIHRoZSBtYXhpbXVtIGxlbmd0aCBmb3IgZ3pwcmludGYoKS4KLQotICAgICBnemJ1ZmZlcigpIHJldHVybnMgMCBvbiBzdWNjZXNzLCBvciAtMSBvbiBmYWlsdXJlLCBzdWNoIGFzIGJlaW5nIGNhbGxlZAotICAgdG9vIGxhdGUuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGd6c2V0cGFyYW1zIE9GKChnekZpbGUgZmlsZSwgaW50IGxldmVsLCBpbnQgc3RyYXRlZ3kpKTsKLS8qCi0gICAgIER5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgY29tcHJlc3Npb24gbGV2ZWwgb3Igc3RyYXRlZ3kuICBTZWUgdGhlIGRlc2NyaXB0aW9uCi0gICBvZiBkZWZsYXRlSW5pdDIgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZXNlIHBhcmFtZXRlcnMuCi0KLSAgICAgZ3pzZXRwYXJhbXMgcmV0dXJucyBaX09LIGlmIHN1Y2Nlc3MsIG9yIFpfU1RSRUFNX0VSUk9SIGlmIHRoZSBmaWxlIHdhcyBub3QKLSAgIG9wZW5lZCBmb3Igd3JpdGluZy4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZ3pyZWFkIE9GKChnekZpbGUgZmlsZSwgdm9pZHAgYnVmLCB1bnNpZ25lZCBsZW4pKTsKLS8qCi0gICAgIFJlYWRzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4gIElmCi0gICB0aGUgaW5wdXQgZmlsZSBpcyBub3QgaW4gZ3ppcCBmb3JtYXQsIGd6cmVhZCBjb3BpZXMgdGhlIGdpdmVuIG51bWJlciBvZgotICAgYnl0ZXMgaW50byB0aGUgYnVmZmVyIGRpcmVjdGx5IGZyb20gdGhlIGZpbGUuCi0KLSAgICAgQWZ0ZXIgcmVhY2hpbmcgdGhlIGVuZCBvZiBhIGd6aXAgc3RyZWFtIGluIHRoZSBpbnB1dCwgZ3pyZWFkIHdpbGwgY29udGludWUKLSAgIHRvIHJlYWQsIGxvb2tpbmcgZm9yIGFub3RoZXIgZ3ppcCBzdHJlYW0uICBBbnkgbnVtYmVyIG9mIGd6aXAgc3RyZWFtcyBtYXkgYmUKLSAgIGNvbmNhdGVuYXRlZCBpbiB0aGUgaW5wdXQgZmlsZSwgYW5kIHdpbGwgYWxsIGJlIGRlY29tcHJlc3NlZCBieSBnenJlYWQoKS4KLSAgIElmIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgZ3ppcCBzdHJlYW0gaXMgZW5jb3VudGVyZWQgYWZ0ZXIgYSBnemlwIHN0cmVhbSwKLSAgIHRoYXQgcmVtYWluaW5nIHRyYWlsaW5nIGdhcmJhZ2UgaXMgaWdub3JlZCAoYW5kIG5vIGVycm9yIGlzIHJldHVybmVkKS4KLQotICAgICBnenJlYWQgY2FuIGJlIHVzZWQgdG8gcmVhZCBhIGd6aXAgZmlsZSB0aGF0IGlzIGJlaW5nIGNvbmN1cnJlbnRseSB3cml0dGVuLgotICAgVXBvbiByZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBpbnB1dCwgZ3pyZWFkIHdpbGwgcmV0dXJuIHdpdGggdGhlIGF2YWlsYWJsZQotICAgZGF0YS4gIElmIHRoZSBlcnJvciBjb2RlIHJldHVybmVkIGJ5IGd6ZXJyb3IgaXMgWl9PSyBvciBaX0JVRl9FUlJPUiwgdGhlbgotICAgZ3pjbGVhcmVyciBjYW4gYmUgdXNlZCB0byBjbGVhciB0aGUgZW5kIG9mIGZpbGUgaW5kaWNhdG9yIGluIG9yZGVyIHRvIHBlcm1pdAotICAgZ3pyZWFkIHRvIGJlIHRyaWVkIGFnYWluLiAgWl9PSyBpbmRpY2F0ZXMgdGhhdCBhIGd6aXAgc3RyZWFtIHdhcyBjb21wbGV0ZWQKLSAgIG9uIHRoZSBsYXN0IGd6cmVhZC4gIFpfQlVGX0VSUk9SIGluZGljYXRlcyB0aGF0IHRoZSBpbnB1dCBmaWxlIGVuZGVkIGluIHRoZQotICAgbWlkZGxlIG9mIGEgZ3ppcCBzdHJlYW0uICBOb3RlIHRoYXQgZ3pyZWFkIGRvZXMgbm90IHJldHVybiAtMSBpbiB0aGUgZXZlbnQKLSAgIG9mIGFuIGluY29tcGxldGUgZ3ppcCBzdHJlYW0uICBUaGlzIGVycm9yIGlzIGRlZmVycmVkIHVudGlsIGd6Y2xvc2UoKSwgd2hpY2gKLSAgIHdpbGwgcmV0dXJuIFpfQlVGX0VSUk9SIGlmIHRoZSBsYXN0IGd6cmVhZCBlbmRlZCBpbiB0aGUgbWlkZGxlIG9mIGEgZ3ppcAotICAgc3RyZWFtLiAgQWx0ZXJuYXRpdmVseSwgZ3plcnJvciBjYW4gYmUgdXNlZCBiZWZvcmUgZ3pjbG9zZSB0byBkZXRlY3QgdGhpcwotICAgY2FzZS4KLQotICAgICBnenJlYWQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyBhY3R1YWxseSByZWFkLCBsZXNzIHRoYW4KLSAgIGxlbiBmb3IgZW5kIG9mIGZpbGUsIG9yIC0xIGZvciBlcnJvci4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZ3p3cml0ZSBPRigoZ3pGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWRwYyBidWYsIHVuc2lnbmVkIGxlbikpOwotLyoKLSAgICAgV3JpdGVzIHRoZSBnaXZlbiBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzIGludG8gdGhlIGNvbXByZXNzZWQgZmlsZS4KLSAgIGd6d3JpdGUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuY29tcHJlc3NlZCBieXRlcyB3cml0dGVuIG9yIDAgaW4gY2FzZSBvZgotICAgZXJyb3IuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUVkEgZ3pwcmludGYgWl9BUkcoKGd6RmlsZSBmaWxlLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikpOwotLyoKLSAgICAgQ29udmVydHMsIGZvcm1hdHMsIGFuZCB3cml0ZXMgdGhlIGFyZ3VtZW50cyB0byB0aGUgY29tcHJlc3NlZCBmaWxlIHVuZGVyCi0gICBjb250cm9sIG9mIHRoZSBmb3JtYXQgc3RyaW5nLCBhcyBpbiBmcHJpbnRmLiAgZ3pwcmludGYgcmV0dXJucyB0aGUgbnVtYmVyIG9mCi0gICB1bmNvbXByZXNzZWQgYnl0ZXMgYWN0dWFsbHkgd3JpdHRlbiwgb3IgMCBpbiBjYXNlIG9mIGVycm9yLiAgVGhlIG51bWJlciBvZgotICAgdW5jb21wcmVzc2VkIGJ5dGVzIHdyaXR0ZW4gaXMgbGltaXRlZCB0byA4MTkxLCBvciBvbmUgbGVzcyB0aGFuIHRoZSBidWZmZXIKLSAgIHNpemUgZ2l2ZW4gdG8gZ3pidWZmZXIoKS4gIFRoZSBjYWxsZXIgc2hvdWxkIGFzc3VyZSB0aGF0IHRoaXMgbGltaXQgaXMgbm90Ci0gICBleGNlZWRlZC4gIElmIGl0IGlzIGV4Y2VlZGVkLCB0aGVuIGd6cHJpbnRmKCkgd2lsbCByZXR1cm4gYW4gZXJyb3IgKDApIHdpdGgKLSAgIG5vdGhpbmcgd3JpdHRlbi4gIEluIHRoaXMgY2FzZSwgdGhlcmUgbWF5IGFsc28gYmUgYSBidWZmZXIgb3ZlcmZsb3cgd2l0aAotICAgdW5wcmVkaWN0YWJsZSBjb25zZXF1ZW5jZXMsIHdoaWNoIGlzIHBvc3NpYmxlIG9ubHkgaWYgemxpYiB3YXMgY29tcGlsZWQgd2l0aAotICAgdGhlIGluc2VjdXJlIGZ1bmN0aW9ucyBzcHJpbnRmKCkgb3IgdnNwcmludGYoKSBiZWNhdXNlIHRoZSBzZWN1cmUgc25wcmludGYoKQotICAgb3IgdnNucHJpbnRmKCkgZnVuY3Rpb25zIHdlcmUgbm90IGF2YWlsYWJsZS4gIFRoaXMgY2FuIGJlIGRldGVybWluZWQgdXNpbmcKLSAgIHpsaWJDb21waWxlRmxhZ3MoKS4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZ3pwdXRzIE9GKChnekZpbGUgZmlsZSwgY29uc3QgY2hhciAqcykpOwotLyoKLSAgICAgV3JpdGVzIHRoZSBnaXZlbiBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHRoZSBjb21wcmVzc2VkIGZpbGUsIGV4Y2x1ZGluZwotICAgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyLgotCi0gICAgIGd6cHV0cyByZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuLCBvciAtMSBpbiBjYXNlIG9mIGVycm9yLgotKi8KLQotWkVYVEVSTiBjaGFyICogWkVYUE9SVCBnemdldHMgT0YoKGd6RmlsZSBmaWxlLCBjaGFyICpidWYsIGludCBsZW4pKTsKLS8qCi0gICAgIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZSB1bnRpbCBsZW4tMSBjaGFyYWN0ZXJzIGFyZSByZWFkLCBvciBhCi0gICBuZXdsaW5lIGNoYXJhY3RlciBpcyByZWFkIGFuZCB0cmFuc2ZlcnJlZCB0byBidWYsIG9yIGFuIGVuZC1vZi1maWxlCi0gICBjb25kaXRpb24gaXMgZW5jb3VudGVyZWQuICBJZiBhbnkgY2hhcmFjdGVycyBhcmUgcmVhZCBvciBpZiBsZW4gPT0gMSwgdGhlCi0gICBzdHJpbmcgaXMgdGVybWluYXRlZCB3aXRoIGEgbnVsbCBjaGFyYWN0ZXIuICBJZiBubyBjaGFyYWN0ZXJzIGFyZSByZWFkIGR1ZQotICAgdG8gYW4gZW5kLW9mLWZpbGUgb3IgbGVuIDwgMSwgdGhlbiB0aGUgYnVmZmVyIGlzIGxlZnQgdW50b3VjaGVkLgotCi0gICAgIGd6Z2V0cyByZXR1cm5zIGJ1ZiB3aGljaCBpcyBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcsIG9yIGl0IHJldHVybnMgTlVMTAotICAgZm9yIGVuZC1vZi1maWxlIG9yIGluIGNhc2Ugb2YgZXJyb3IuICBJZiB0aGVyZSB3YXMgYW4gZXJyb3IsIHRoZSBjb250ZW50cyBhdAotICAgYnVmIGFyZSBpbmRldGVybWluYXRlLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBnenB1dGMgT0YoKGd6RmlsZSBmaWxlLCBpbnQgYykpOwotLyoKLSAgICAgV3JpdGVzIGMsIGNvbnZlcnRlZCB0byBhbiB1bnNpZ25lZCBjaGFyLCBpbnRvIHRoZSBjb21wcmVzc2VkIGZpbGUuICBnenB1dGMKLSAgIHJldHVybnMgdGhlIHZhbHVlIHRoYXQgd2FzIHdyaXR0ZW4sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUIGd6Z2V0YyBPRigoZ3pGaWxlIGZpbGUpKTsKLS8qCi0gICAgIFJlYWRzIG9uZSBieXRlIGZyb20gdGhlIGNvbXByZXNzZWQgZmlsZS4gIGd6Z2V0YyByZXR1cm5zIHRoaXMgYnl0ZSBvciAtMQotICAgaW4gY2FzZSBvZiBlbmQgb2YgZmlsZSBvciBlcnJvci4gIFRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgYSBtYWNybyBmb3Igc3BlZWQuCi0gICBBcyBzdWNoLCBpdCBkb2VzIG5vdCBkbyBhbGwgb2YgdGhlIGNoZWNraW5nIHRoZSBvdGhlciBmdW5jdGlvbnMgZG8uICBJLmUuCi0gICBpdCBkb2VzIG5vdCBjaGVjayB0byBzZWUgaWYgZmlsZSBpcyBOVUxMLCBub3Igd2hldGhlciB0aGUgc3RydWN0dXJlIGZpbGUKLSAgIHBvaW50cyB0byBoYXMgYmVlbiBjbG9iYmVyZWQgb3Igbm90LgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBnenVuZ2V0YyBPRigoaW50IGMsIGd6RmlsZSBmaWxlKSk7Ci0vKgotICAgICBQdXNoIG9uZSBjaGFyYWN0ZXIgYmFjayBvbnRvIHRoZSBzdHJlYW0gdG8gYmUgcmVhZCBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICBvbiB0aGUgbmV4dCByZWFkLiAgQXQgbGVhc3Qgb25lIGNoYXJhY3RlciBvZiBwdXNoLWJhY2sgaXMgYWxsb3dlZC4KLSAgIGd6dW5nZXRjKCkgcmV0dXJucyB0aGUgY2hhcmFjdGVyIHB1c2hlZCwgb3IgLTEgb24gZmFpbHVyZS4gIGd6dW5nZXRjKCkgd2lsbAotICAgZmFpbCBpZiBjIGlzIC0xLCBhbmQgbWF5IGZhaWwgaWYgYSBjaGFyYWN0ZXIgaGFzIGJlZW4gcHVzaGVkIGJ1dCBub3QgcmVhZAotICAgeWV0LiAgSWYgZ3p1bmdldGMgaXMgdXNlZCBpbW1lZGlhdGVseSBhZnRlciBnem9wZW4gb3IgZ3pkb3BlbiwgYXQgbGVhc3QgdGhlCi0gICBvdXRwdXQgYnVmZmVyIHNpemUgb2YgcHVzaGVkIGNoYXJhY3RlcnMgaXMgYWxsb3dlZC4gIChTZWUgZ3pidWZmZXIgYWJvdmUuKQotICAgVGhlIHB1c2hlZCBjaGFyYWN0ZXIgd2lsbCBiZSBkaXNjYXJkZWQgaWYgdGhlIHN0cmVhbSBpcyByZXBvc2l0aW9uZWQgd2l0aAotICAgZ3pzZWVrKCkgb3IgZ3pyZXdpbmQoKS4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZ3pmbHVzaCBPRigoZ3pGaWxlIGZpbGUsIGludCBmbHVzaCkpOwotLyoKLSAgICAgRmx1c2hlcyBhbGwgcGVuZGluZyBvdXRwdXQgaW50byB0aGUgY29tcHJlc3NlZCBmaWxlLiAgVGhlIHBhcmFtZXRlciBmbHVzaAotICAgaXMgYXMgaW4gdGhlIGRlZmxhdGUoKSBmdW5jdGlvbi4gIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHpsaWIgZXJyb3IgbnVtYmVyCi0gICAoc2VlIGZ1bmN0aW9uIGd6ZXJyb3IgYmVsb3cpLiAgZ3pmbHVzaCBpcyBvbmx5IHBlcm1pdHRlZCB3aGVuIHdyaXRpbmcuCi0KLSAgICAgSWYgdGhlIGZsdXNoIHBhcmFtZXRlciBpcyBaX0ZJTklTSCwgdGhlIHJlbWFpbmluZyBkYXRhIGlzIHdyaXR0ZW4gYW5kIHRoZQotICAgZ3ppcCBzdHJlYW0gaXMgY29tcGxldGVkIGluIHRoZSBvdXRwdXQuICBJZiBnendyaXRlKCkgaXMgY2FsbGVkIGFnYWluLCBhIG5ldwotICAgZ3ppcCBzdHJlYW0gd2lsbCBiZSBzdGFydGVkIGluIHRoZSBvdXRwdXQuICBnenJlYWQoKSBpcyBhYmxlIHRvIHJlYWQgc3VjaAotICAgY29uY2F0ZW50ZWQgZ3ppcCBzdHJlYW1zLgotCi0gICAgIGd6Zmx1c2ggc2hvdWxkIGJlIGNhbGxlZCBvbmx5IHdoZW4gc3RyaWN0bHkgbmVjZXNzYXJ5IGJlY2F1c2UgaXQgd2lsbAotICAgZGVncmFkZSBjb21wcmVzc2lvbiBpZiBjYWxsZWQgdG9vIG9mdGVuLgotKi8KLQotLyoKLVpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6c2VlayBPRigoZ3pGaWxlIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHpfb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSk7Ci0KLSAgICAgU2V0cyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gZm9yIHRoZSBuZXh0IGd6cmVhZCBvciBnendyaXRlIG9uIHRoZSBnaXZlbgotICAgY29tcHJlc3NlZCBmaWxlLiAgVGhlIG9mZnNldCByZXByZXNlbnRzIGEgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZQotICAgdW5jb21wcmVzc2VkIGRhdGEgc3RyZWFtLiAgVGhlIHdoZW5jZSBwYXJhbWV0ZXIgaXMgZGVmaW5lZCBhcyBpbiBsc2VlaygyKTsKLSAgIHRoZSB2YWx1ZSBTRUVLX0VORCBpcyBub3Qgc3VwcG9ydGVkLgotCi0gICAgIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3IgcmVhZGluZywgdGhpcyBmdW5jdGlvbiBpcyBlbXVsYXRlZCBidXQgY2FuIGJlCi0gICBleHRyZW1lbHkgc2xvdy4gIElmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZywgb25seSBmb3J3YXJkIHNlZWtzIGFyZQotICAgc3VwcG9ydGVkOyBnenNlZWsgdGhlbiBjb21wcmVzc2VzIGEgc2VxdWVuY2Ugb2YgemVyb2VzIHVwIHRvIHRoZSBuZXcKLSAgIHN0YXJ0aW5nIHBvc2l0aW9uLgotCi0gICAgIGd6c2VlayByZXR1cm5zIHRoZSByZXN1bHRpbmcgb2Zmc2V0IGxvY2F0aW9uIGFzIG1lYXN1cmVkIGluIGJ5dGVzIGZyb20KLSAgIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0sIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IsIGluCi0gICBwYXJ0aWN1bGFyIGlmIHRoZSBmaWxlIGlzIG9wZW5lZCBmb3Igd3JpdGluZyBhbmQgdGhlIG5ldyBzdGFydGluZyBwb3NpdGlvbgotICAgd291bGQgYmUgYmVmb3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCAgICBnenJld2luZCBPRigoZ3pGaWxlIGZpbGUpKTsKLS8qCi0gICAgIFJld2luZHMgdGhlIGdpdmVuIGZpbGUuIFRoaXMgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgZm9yIHJlYWRpbmcuCi0KLSAgICAgZ3pyZXdpbmQoZmlsZSkgaXMgZXF1aXZhbGVudCB0byAoaW50KWd6c2VlayhmaWxlLCAwTCwgU0VFS19TRVQpCi0qLwotCi0vKgotWkVYVEVSTiB6X29mZl90IFpFWFBPUlQgICAgZ3p0ZWxsIE9GKChnekZpbGUgZmlsZSkpOwotCi0gICAgIFJldHVybnMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBnenJlYWQgb3IgZ3p3cml0ZSBvbiB0aGUgZ2l2ZW4KLSAgIGNvbXByZXNzZWQgZmlsZS4gIFRoaXMgcG9zaXRpb24gcmVwcmVzZW50cyBhIG51bWJlciBvZiBieXRlcyBpbiB0aGUKLSAgIHVuY29tcHJlc3NlZCBkYXRhIHN0cmVhbSwgYW5kIGlzIHplcm8gd2hlbiBzdGFydGluZywgZXZlbiBpZiBhcHBlbmRpbmcgb3IKLSAgIHJlYWRpbmcgYSBnemlwIHN0cmVhbSBmcm9tIHRoZSBtaWRkbGUgb2YgYSBmaWxlIHVzaW5nIGd6ZG9wZW4oKS4KLQotICAgICBnenRlbGwoZmlsZSkgaXMgZXF1aXZhbGVudCB0byBnenNlZWsoZmlsZSwgMEwsIFNFRUtfQ1VSKQotKi8KLQotLyoKLVpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6b2Zmc2V0IE9GKChnekZpbGUgZmlsZSkpOwotCi0gICAgIFJldHVybnMgdGhlIGN1cnJlbnQgb2Zmc2V0IGluIHRoZSBmaWxlIGJlaW5nIHJlYWQgb3Igd3JpdHRlbi4gIFRoaXMgb2Zmc2V0Ci0gICBpbmNsdWRlcyB0aGUgY291bnQgb2YgYnl0ZXMgdGhhdCBwcmVjZWRlIHRoZSBnemlwIHN0cmVhbSwgZm9yIGV4YW1wbGUgd2hlbgotICAgYXBwZW5kaW5nIG9yIHdoZW4gdXNpbmcgZ3pkb3BlbigpIGZvciByZWFkaW5nLiAgV2hlbiByZWFkaW5nLCB0aGUgb2Zmc2V0Ci0gICBkb2VzIG5vdCBpbmNsdWRlIGFzIHlldCB1bnVzZWQgYnVmZmVyZWQgaW5wdXQuICBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSB1c2VkCi0gICBmb3IgYSBwcm9ncmVzcyBpbmRpY2F0b3IuICBPbiBlcnJvciwgZ3pvZmZzZXQoKSByZXR1cm5zIC0xLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBnemVvZiBPRigoZ3pGaWxlIGZpbGUpKTsKLS8qCi0gICAgIFJldHVybnMgdHJ1ZSAoMSkgaWYgdGhlIGVuZC1vZi1maWxlIGluZGljYXRvciBoYXMgYmVlbiBzZXQgd2hpbGUgcmVhZGluZywKLSAgIGZhbHNlICgwKSBvdGhlcndpc2UuICBOb3RlIHRoYXQgdGhlIGVuZC1vZi1maWxlIGluZGljYXRvciBpcyBzZXQgb25seSBpZiB0aGUKLSAgIHJlYWQgdHJpZWQgdG8gZ28gcGFzdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCwgYnV0IGNhbWUgdXAgc2hvcnQuICBUaGVyZWZvcmUsCi0gICBqdXN0IGxpa2UgZmVvZigpLCBnemVvZigpIG1heSByZXR1cm4gZmFsc2UgZXZlbiBpZiB0aGVyZSBpcyBubyBtb3JlIGRhdGEgdG8KLSAgIHJlYWQsIGluIHRoZSBldmVudCB0aGF0IHRoZSBsYXN0IHJlYWQgcmVxdWVzdCB3YXMgZm9yIHRoZSBleGFjdCBudW1iZXIgb2YKLSAgIGJ5dGVzIHJlbWFpbmluZyBpbiB0aGUgaW5wdXQgZmlsZS4gIFRoaXMgd2lsbCBoYXBwZW4gaWYgdGhlIGlucHV0IGZpbGUgc2l6ZQotICAgaXMgYW4gZXhhY3QgbXVsdGlwbGUgb2YgdGhlIGJ1ZmZlciBzaXplLgotCi0gICAgIElmIGd6ZW9mKCkgcmV0dXJucyB0cnVlLCB0aGVuIHRoZSByZWFkIGZ1bmN0aW9ucyB3aWxsIHJldHVybiBubyBtb3JlIGRhdGEsCi0gICB1bmxlc3MgdGhlIGVuZC1vZi1maWxlIGluZGljYXRvciBpcyByZXNldCBieSBnemNsZWFyZXJyKCkgYW5kIHRoZSBpbnB1dCBmaWxlCi0gICBoYXMgZ3Jvd24gc2luY2UgdGhlIHByZXZpb3VzIGVuZCBvZiBmaWxlIHdhcyBkZXRlY3RlZC4KLSovCi0KLVpFWFRFUk4gaW50IFpFWFBPUlQgZ3pkaXJlY3QgT0YoKGd6RmlsZSBmaWxlKSk7Ci0vKgotICAgICBSZXR1cm5zIHRydWUgKDEpIGlmIGZpbGUgaXMgYmVpbmcgY29waWVkIGRpcmVjdGx5IHdoaWxlIHJlYWRpbmcsIG9yIGZhbHNlCi0gICAoMCkgaWYgZmlsZSBpcyBhIGd6aXAgc3RyZWFtIGJlaW5nIGRlY29tcHJlc3NlZC4KLQotICAgICBJZiB0aGUgaW5wdXQgZmlsZSBpcyBlbXB0eSwgZ3pkaXJlY3QoKSB3aWxsIHJldHVybiB0cnVlLCBzaW5jZSB0aGUgaW5wdXQKLSAgIGRvZXMgbm90IGNvbnRhaW4gYSBnemlwIHN0cmVhbS4KLQotICAgICBJZiBnemRpcmVjdCgpIGlzIHVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgZ3pvcGVuKCkgb3IgZ3pkb3BlbigpIGl0IHdpbGwKLSAgIGNhdXNlIGJ1ZmZlcnMgdG8gYmUgYWxsb2NhdGVkIHRvIGFsbG93IHJlYWRpbmcgdGhlIGZpbGUgdG8gZGV0ZXJtaW5lIGlmIGl0Ci0gICBpcyBhIGd6aXAgZmlsZS4gIFRoZXJlZm9yZSBpZiBnemJ1ZmZlcigpIGlzIHVzZWQsIGl0IHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlCi0gICBnemRpcmVjdCgpLgotCi0gICAgIFdoZW4gd3JpdGluZywgZ3pkaXJlY3QoKSByZXR1cm5zIHRydWUgKDEpIGlmIHRyYW5zcGFyZW50IHdyaXRpbmcgd2FzCi0gICByZXF1ZXN0ZWQgKCJ3VCIgZm9yIHRoZSBnem9wZW4oKSBtb2RlKSwgb3IgZmFsc2UgKDApIG90aGVyd2lzZS4gIChOb3RlOgotICAgZ3pkaXJlY3QoKSBpcyBub3QgbmVlZGVkIHdoZW4gd3JpdGluZy4gIFRyYW5zcGFyZW50IHdyaXRpbmcgbXVzdCBiZQotICAgZXhwbGljaXRseSByZXF1ZXN0ZWQsIHNvIHRoZSBhcHBsaWNhdGlvbiBhbHJlYWR5IGtub3dzIHRoZSBhbnN3ZXIuICBXaGVuCi0gICBsaW5raW5nIHN0YXRpY2FsbHksIHVzaW5nIGd6ZGlyZWN0KCkgd2lsbCBpbmNsdWRlIGFsbCBvZiB0aGUgemxpYiBjb2RlIGZvcgotICAgZ3ppcCBmaWxlIHJlYWRpbmcgYW5kIGRlY29tcHJlc3Npb24sIHdoaWNoIG1heSBub3QgYmUgZGVzaXJlZC4pCi0qLwotCi1aRVhURVJOIGludCBaRVhQT1JUICAgIGd6Y2xvc2UgT0YoKGd6RmlsZSBmaWxlKSk7Ci0vKgotICAgICBGbHVzaGVzIGFsbCBwZW5kaW5nIG91dHB1dCBpZiBuZWNlc3NhcnksIGNsb3NlcyB0aGUgY29tcHJlc3NlZCBmaWxlIGFuZAotICAgZGVhbGxvY2F0ZXMgdGhlIChkZSljb21wcmVzc2lvbiBzdGF0ZS4gIE5vdGUgdGhhdCBvbmNlIGZpbGUgaXMgY2xvc2VkLCB5b3UKLSAgIGNhbm5vdCBjYWxsIGd6ZXJyb3Igd2l0aCBmaWxlLCBzaW5jZSBpdHMgc3RydWN0dXJlcyBoYXZlIGJlZW4gZGVhbGxvY2F0ZWQuCi0gICBnemNsb3NlIG11c3Qgbm90IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBmaWxlLCBqdXN0IGFzIGZyZWUKLSAgIG11c3Qgbm90IGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBvbiB0aGUgc2FtZSBhbGxvY2F0aW9uLgotCi0gICAgIGd6Y2xvc2Ugd2lsbCByZXR1cm4gWl9TVFJFQU1fRVJST1IgaWYgZmlsZSBpcyBub3QgdmFsaWQsIFpfRVJSTk8gb24gYQotICAgZmlsZSBvcGVyYXRpb24gZXJyb3IsIFpfTUVNX0VSUk9SIGlmIG91dCBvZiBtZW1vcnksIFpfQlVGX0VSUk9SIGlmIHRoZQotICAgbGFzdCByZWFkIGVuZGVkIGluIHRoZSBtaWRkbGUgb2YgYSBnemlwIHN0cmVhbSwgb3IgWl9PSyBvbiBzdWNjZXNzLgotKi8KLQotWkVYVEVSTiBpbnQgWkVYUE9SVCBnemNsb3NlX3IgT0YoKGd6RmlsZSBmaWxlKSk7Ci1aRVhURVJOIGludCBaRVhQT1JUIGd6Y2xvc2VfdyBPRigoZ3pGaWxlIGZpbGUpKTsKLS8qCi0gICAgIFNhbWUgYXMgZ3pjbG9zZSgpLCBidXQgZ3pjbG9zZV9yKCkgaXMgb25seSBmb3IgdXNlIHdoZW4gcmVhZGluZywgYW5kCi0gICBnemNsb3NlX3coKSBpcyBvbmx5IGZvciB1c2Ugd2hlbiB3cml0aW5nIG9yIGFwcGVuZGluZy4gIFRoZSBhZHZhbnRhZ2UgdG8KLSAgIHVzaW5nIHRoZXNlIGluc3RlYWQgb2YgZ3pjbG9zZSgpIGlzIHRoYXQgdGhleSBhdm9pZCBsaW5raW5nIGluIHpsaWIKLSAgIGNvbXByZXNzaW9uIG9yIGRlY29tcHJlc3Npb24gY29kZSB0aGF0IGlzIG5vdCB1c2VkIHdoZW4gb25seSByZWFkaW5nIG9yIG9ubHkKLSAgIHdyaXRpbmcgcmVzcGVjdGl2ZWx5LiAgSWYgZ3pjbG9zZSgpIGlzIHVzZWQsIHRoZW4gYm90aCBjb21wcmVzc2lvbiBhbmQKLSAgIGRlY29tcHJlc3Npb24gY29kZSB3aWxsIGJlIGluY2x1ZGVkIHRoZSBhcHBsaWNhdGlvbiB3aGVuIGxpbmtpbmcgdG8gYSBzdGF0aWMKLSAgIHpsaWIgbGlicmFyeS4KLSovCi0KLVpFWFRFUk4gY29uc3QgY2hhciAqIFpFWFBPUlQgZ3plcnJvciBPRigoZ3pGaWxlIGZpbGUsIGludCAqZXJybnVtKSk7Ci0vKgotICAgICBSZXR1cm5zIHRoZSBlcnJvciBtZXNzYWdlIGZvciB0aGUgbGFzdCBlcnJvciB3aGljaCBvY2N1cnJlZCBvbiB0aGUgZ2l2ZW4KLSAgIGNvbXByZXNzZWQgZmlsZS4gIGVycm51bSBpcyBzZXQgdG8gemxpYiBlcnJvciBudW1iZXIuICBJZiBhbiBlcnJvciBvY2N1cnJlZAotICAgaW4gdGhlIGZpbGUgc3lzdGVtIGFuZCBub3QgaW4gdGhlIGNvbXByZXNzaW9uIGxpYnJhcnksIGVycm51bSBpcyBzZXQgdG8KLSAgIFpfRVJSTk8gYW5kIHRoZSBhcHBsaWNhdGlvbiBtYXkgY29uc3VsdCBlcnJubyB0byBnZXQgdGhlIGV4YWN0IGVycm9yIGNvZGUuCi0KLSAgICAgVGhlIGFwcGxpY2F0aW9uIG11c3Qgbm90IG1vZGlmeSB0aGUgcmV0dXJuZWQgc3RyaW5nLiAgRnV0dXJlIGNhbGxzIHRvCi0gICB0aGlzIGZ1bmN0aW9uIG1heSBpbnZhbGlkYXRlIHRoZSBwcmV2aW91c2x5IHJldHVybmVkIHN0cmluZy4gIElmIGZpbGUgaXMKLSAgIGNsb3NlZCwgdGhlbiB0aGUgc3RyaW5nIHByZXZpb3VzbHkgcmV0dXJuZWQgYnkgZ3plcnJvciB3aWxsIG5vIGxvbmdlciBiZQotICAgYXZhaWxhYmxlLgotCi0gICAgIGd6ZXJyb3IoKSBzaG91bGQgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBlcnJvcnMgZnJvbSBlbmQtb2YtZmlsZSBmb3IgdGhvc2UKLSAgIGZ1bmN0aW9ucyBhYm92ZSB0aGF0IGRvIG5vdCBkaXN0aW5ndWlzaCB0aG9zZSBjYXNlcyBpbiB0aGVpciByZXR1cm4gdmFsdWVzLgotKi8KLQotWkVYVEVSTiB2b2lkIFpFWFBPUlQgZ3pjbGVhcmVyciBPRigoZ3pGaWxlIGZpbGUpKTsKLS8qCi0gICAgIENsZWFycyB0aGUgZXJyb3IgYW5kIGVuZC1vZi1maWxlIGZsYWdzIGZvciBmaWxlLiAgVGhpcyBpcyBhbmFsb2dvdXMgdG8gdGhlCi0gICBjbGVhcmVycigpIGZ1bmN0aW9uIGluIHN0ZGlvLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNvbnRpbnVpbmcgdG8gcmVhZCBhIGd6aXAKLSAgIGZpbGUgdGhhdCBpcyBiZWluZyB3cml0dGVuIGNvbmN1cnJlbnRseS4KLSovCi0KLSNlbmRpZiAvKiAhWl9TT0xPICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoZWNrc3VtIGZ1bmN0aW9ucyAqLwotCi0vKgotICAgICBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCByZWxhdGVkIHRvIGNvbXByZXNzaW9uIGJ1dCBhcmUgZXhwb3J0ZWQKLSAgIGFueXdheSBiZWNhdXNlIHRoZXkgbWlnaHQgYmUgdXNlZnVsIGluIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgY29tcHJlc3Npb24KLSAgIGxpYnJhcnkuCi0qLwotCi1aRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMiBPRigodUxvbmcgYWRsZXIsIGNvbnN0IEJ5dGVmICpidWYsIHVJbnQgbGVuKSk7Ci0vKgotICAgICBVcGRhdGUgYSBydW5uaW5nIEFkbGVyLTMyIGNoZWNrc3VtIHdpdGggdGhlIGJ5dGVzIGJ1ZlswLi5sZW4tMV0gYW5kCi0gICByZXR1cm4gdGhlIHVwZGF0ZWQgY2hlY2tzdW0uICBJZiBidWYgaXMgWl9OVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlCi0gICByZXF1aXJlZCBpbml0aWFsIHZhbHVlIGZvciB0aGUgY2hlY2tzdW0uCi0KLSAgICAgQW4gQWRsZXItMzIgY2hlY2tzdW0gaXMgYWxtb3N0IGFzIHJlbGlhYmxlIGFzIGEgQ1JDMzIgYnV0IGNhbiBiZSBjb21wdXRlZAotICAgbXVjaCBmYXN0ZXIuCi0KLSAgIFVzYWdlIGV4YW1wbGU6Ci0KLSAgICAgdUxvbmcgYWRsZXIgPSBhZGxlcjMyKDBMLCBaX05VTEwsIDApOwotCi0gICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7Ci0gICAgICAgYWRsZXIgPSBhZGxlcjMyKGFkbGVyLCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgIH0KLSAgICAgaWYgKGFkbGVyICE9IG9yaWdpbmFsX2FkbGVyKSBlcnJvcigpOwotKi8KLQotLyoKLVpFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmUgT0YoKHVMb25nIGFkbGVyMSwgdUxvbmcgYWRsZXIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgel9vZmZfdCBsZW4yKSk7Ci0KLSAgICAgQ29tYmluZSB0d28gQWRsZXItMzIgY2hlY2tzdW1zIGludG8gb25lLiAgRm9yIHR3byBzZXF1ZW5jZXMgb2YgYnl0ZXMsIHNlcTEKLSAgIGFuZCBzZXEyIHdpdGggbGVuZ3RocyBsZW4xIGFuZCBsZW4yLCBBZGxlci0zMiBjaGVja3N1bXMgd2VyZSBjYWxjdWxhdGVkIGZvcgotICAgZWFjaCwgYWRsZXIxIGFuZCBhZGxlcjIuICBhZGxlcjMyX2NvbWJpbmUoKSByZXR1cm5zIHRoZSBBZGxlci0zMiBjaGVja3N1bSBvZgotICAgc2VxMSBhbmQgc2VxMiBjb25jYXRlbmF0ZWQsIHJlcXVpcmluZyBvbmx5IGFkbGVyMSwgYWRsZXIyLCBhbmQgbGVuMi4gIE5vdGUKLSAgIHRoYXQgdGhlIHpfb2ZmX3QgdHlwZSAobGlrZSBvZmZfdCkgaXMgYSBzaWduZWQgaW50ZWdlci4gIElmIGxlbjIgaXMKLSAgIG5lZ2F0aXZlLCB0aGUgcmVzdWx0IGhhcyBubyBtZWFuaW5nIG9yIHV0aWxpdHkuCi0qLwotCi1aRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzIgICBPRigodUxvbmcgY3JjLCBjb25zdCBCeXRlZiAqYnVmLCB1SW50IGxlbikpOwotLyoKLSAgICAgVXBkYXRlIGEgcnVubmluZyBDUkMtMzIgd2l0aCB0aGUgYnl0ZXMgYnVmWzAuLmxlbi0xXSBhbmQgcmV0dXJuIHRoZQotICAgdXBkYXRlZCBDUkMtMzIuICBJZiBidWYgaXMgWl9OVUxMLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVpcmVkCi0gICBpbml0aWFsIHZhbHVlIGZvciB0aGUgY3JjLiAgUHJlLSBhbmQgcG9zdC1jb25kaXRpb25pbmcgKG9uZSdzIGNvbXBsZW1lbnQpIGlzCi0gICBwZXJmb3JtZWQgd2l0aGluIHRoaXMgZnVuY3Rpb24gc28gaXQgc2hvdWxkbid0IGJlIGRvbmUgYnkgdGhlIGFwcGxpY2F0aW9uLgotCi0gICBVc2FnZSBleGFtcGxlOgotCi0gICAgIHVMb25nIGNyYyA9IGNyYzMyKDBMLCBaX05VTEwsIDApOwotCi0gICAgIHdoaWxlIChyZWFkX2J1ZmZlcihidWZmZXIsIGxlbmd0aCkgIT0gRU9GKSB7Ci0gICAgICAgY3JjID0gY3JjMzIoY3JjLCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgIH0KLSAgICAgaWYgKGNyYyAhPSBvcmlnaW5hbF9jcmMpIGVycm9yKCk7Ci0qLwotCi0vKgotWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGNyYzMyX2NvbWJpbmUgT0YoKHVMb25nIGNyYzEsIHVMb25nIGNyYzIsIHpfb2ZmX3QgbGVuMikpOwotCi0gICAgIENvbWJpbmUgdHdvIENSQy0zMiBjaGVjayB2YWx1ZXMgaW50byBvbmUuICBGb3IgdHdvIHNlcXVlbmNlcyBvZiBieXRlcywKLSAgIHNlcTEgYW5kIHNlcTIgd2l0aCBsZW5ndGhzIGxlbjEgYW5kIGxlbjIsIENSQy0zMiBjaGVjayB2YWx1ZXMgd2VyZQotICAgY2FsY3VsYXRlZCBmb3IgZWFjaCwgY3JjMSBhbmQgY3JjMi4gIGNyYzMyX2NvbWJpbmUoKSByZXR1cm5zIHRoZSBDUkMtMzIKLSAgIGNoZWNrIHZhbHVlIG9mIHNlcTEgYW5kIHNlcTIgY29uY2F0ZW5hdGVkLCByZXF1aXJpbmcgb25seSBjcmMxLCBjcmMyLCBhbmQKLSAgIGxlbjIuCi0qLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZhcmlvdXMgaGFja3MsIGRvbid0IGxvb2sgOikgKi8KLQotLyogZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0IGFyZSBtYWNyb3MgdG8gYWxsb3cgY2hlY2tpbmcgdGhlIHpsaWIgdmVyc2lvbgotICogYW5kIHRoZSBjb21waWxlcidzIHZpZXcgb2Ygel9zdHJlYW06Ci0gKi8KLVpFWFRFUk4gaW50IFpFWFBPUlQgZGVmbGF0ZUluaXRfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IGxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOwotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlSW5pdF8gT0YoKHpfc3RyZWFtcCBzdHJtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOwotWkVYVEVSTiBpbnQgWkVYUE9SVCBkZWZsYXRlSW5pdDJfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50ICBsZXZlbCwgaW50ICBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5kb3dCaXRzLCBpbnQgbWVtTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJhdGVneSwgY29uc3QgY2hhciAqdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVhbV9zaXplKSk7Ci1aRVhURVJOIGludCBaRVhQT1JUIGluZmxhdGVJbml0Ml8gT0YoKHpfc3RyZWFtcCBzdHJtLCBpbnQgIHdpbmRvd0JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sIGludCBzdHJlYW1fc2l6ZSkpOwotWkVYVEVSTiBpbnQgWkVYUE9SVCBpbmZsYXRlQmFja0luaXRfIE9GKCh6X3N0cmVhbXAgc3RybSwgaW50IHdpbmRvd0JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgRkFSICp3aW5kb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1fc2l6ZSkpOwotI2RlZmluZSBkZWZsYXRlSW5pdChzdHJtLCBsZXZlbCkgXAotICAgICAgICBkZWZsYXRlSW5pdF8oKHN0cm0pLCAobGV2ZWwpLCBaTElCX1ZFUlNJT04sIChpbnQpc2l6ZW9mKHpfc3RyZWFtKSkKLSNkZWZpbmUgaW5mbGF0ZUluaXQoc3RybSkgXAotICAgICAgICBpbmZsYXRlSW5pdF8oKHN0cm0pLCBaTElCX1ZFUlNJT04sIChpbnQpc2l6ZW9mKHpfc3RyZWFtKSkKLSNkZWZpbmUgZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBtZXRob2QsIHdpbmRvd0JpdHMsIG1lbUxldmVsLCBzdHJhdGVneSkgXAotICAgICAgICBkZWZsYXRlSW5pdDJfKChzdHJtKSwobGV2ZWwpLChtZXRob2QpLCh3aW5kb3dCaXRzKSwobWVtTGV2ZWwpLFwKLSAgICAgICAgICAgICAgICAgICAgICAoc3RyYXRlZ3kpLCBaTElCX1ZFUlNJT04sIChpbnQpc2l6ZW9mKHpfc3RyZWFtKSkKLSNkZWZpbmUgaW5mbGF0ZUluaXQyKHN0cm0sIHdpbmRvd0JpdHMpIFwKLSAgICAgICAgaW5mbGF0ZUluaXQyXygoc3RybSksICh3aW5kb3dCaXRzKSwgWkxJQl9WRVJTSU9OLCBcCi0gICAgICAgICAgICAgICAgICAgICAgKGludClzaXplb2Yoel9zdHJlYW0pKQotI2RlZmluZSBpbmZsYXRlQmFja0luaXQoc3RybSwgd2luZG93Qml0cywgd2luZG93KSBcCi0gICAgICAgIGluZmxhdGVCYWNrSW5pdF8oKHN0cm0pLCAod2luZG93Qml0cyksICh3aW5kb3cpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgWkxJQl9WRVJTSU9OLCAoaW50KXNpemVvZih6X3N0cmVhbSkpCi0KLSNpZm5kZWYgWl9TT0xPCi0KLS8qIGd6Z2V0YygpIG1hY3JvIGFuZCBpdHMgc3VwcG9ydGluZyBmdW5jdGlvbiBhbmQgZXhwb3NlZCBkYXRhIHN0cnVjdHVyZS4gIE5vdGUKLSAqIHRoYXQgdGhlIHJlYWwgaW50ZXJuYWwgc3RhdGUgaXMgbXVjaCBsYXJnZXIgdGhhbiB0aGUgZXhwb3NlZCBzdHJ1Y3R1cmUuCi0gKiBUaGlzIGFiYnJldmlhdGVkIHN0cnVjdHVyZSBleHBvc2VzIGp1c3QgZW5vdWdoIGZvciB0aGUgZ3pnZXRjKCkgbWFjcm8uICBUaGUKLSAqIHVzZXIgc2hvdWxkIG5vdCBtZXNzIHdpdGggdGhlc2UgZXhwb3NlZCBlbGVtZW50cywgc2luY2UgdGhlaXIgbmFtZXMgb3IKLSAqIGJlaGF2aW9yIGNvdWxkIGNoYW5nZSBpbiB0aGUgZnV0dXJlLCBwZXJoYXBzIGV2ZW4gY2FwcmljaW91c2x5LiAgVGhleSBjYW4KLSAqIG9ubHkgYmUgdXNlZCBieSB0aGUgZ3pnZXRjKCkgbWFjcm8uICBZb3UgaGF2ZSBiZWVuIHdhcm5lZC4KLSAqLwotc3RydWN0IGd6RmlsZV9zIHsKLSAgICB1bnNpZ25lZCBoYXZlOwotICAgIHVuc2lnbmVkIGNoYXIgKm5leHQ7Ci0gICAgel9vZmY2NF90IHBvczsKLX07Ci1aRVhURVJOIGludCBaRVhQT1JUIGd6Z2V0Y18gT0YoKGd6RmlsZSBmaWxlKSk7ICAvKiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCi0jaWZkZWYgWl9QUkVGSVhfU0VUCi0jICB1bmRlZiB6X2d6Z2V0YwotIyAgZGVmaW5lIHpfZ3pnZXRjKGcpIFwKLSAgICAgICAgICAoKGcpLT5oYXZlID8gKChnKS0+aGF2ZS0tLCAoZyktPnBvcysrLCAqKChnKS0+bmV4dCkrKykgOiBnemdldGMoZykpCi0jZWxzZQotIyAgZGVmaW5lIGd6Z2V0YyhnKSBcCi0gICAgICAgICAgKChnKS0+aGF2ZSA/ICgoZyktPmhhdmUtLSwgKGcpLT5wb3MrKywgKigoZyktPm5leHQpKyspIDogZ3pnZXRjKGcpKQotI2VuZGlmCi0KLS8qIHByb3ZpZGUgNjQtYml0IG9mZnNldCBmdW5jdGlvbnMgaWYgX0xBUkdFRklMRTY0X1NPVVJDRSBkZWZpbmVkLCBhbmQvb3IKLSAqIGNoYW5nZSB0aGUgcmVndWxhciBmdW5jdGlvbnMgdG8gNjQgYml0cyBpZiBfRklMRV9PRkZTRVRfQklUUyBpcyA2NCAoaWYKLSAqIGJvdGggYXJlIHRydWUsIHRoZSBhcHBsaWNhdGlvbiBnZXRzIHRoZSAqNjQgZnVuY3Rpb25zLCBhbmQgdGhlIHJlZ3VsYXIKLSAqIGZ1bmN0aW9ucyBhcmUgY2hhbmdlZCB0byA2NCBiaXRzKSAtLSBpbiBjYXNlIHRoZXNlIGFyZSBzZXQgb24gc3lzdGVtcwotICogd2l0aG91dCBsYXJnZSBmaWxlIHN1cHBvcnQsIF9MRlM2NF9MQVJHRUZJTEUgbXVzdCBhbHNvIGJlIHRydWUKLSAqLwotI2lmZGVmIFpfTEFSR0U2NAotICAgWkVYVEVSTiBnekZpbGUgWkVYUE9SVCBnem9wZW42NCBPRigoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLSAgIFpFWFRFUk4gel9vZmY2NF90IFpFWFBPUlQgZ3pzZWVrNjQgT0YoKGd6RmlsZSwgel9vZmY2NF90LCBpbnQpKTsKLSAgIFpFWFRFUk4gel9vZmY2NF90IFpFWFBPUlQgZ3p0ZWxsNjQgT0YoKGd6RmlsZSkpOwotICAgWkVYVEVSTiB6X29mZjY0X3QgWkVYUE9SVCBnem9mZnNldDY0IE9GKChnekZpbGUpKTsKLSAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmU2NCBPRigodUxvbmcsIHVMb25nLCB6X29mZjY0X3QpKTsKLSAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgel9vZmY2NF90KSk7Ci0jZW5kaWYKLQotI2lmICFkZWZpbmVkKFpMSUJfSU5URVJOQUwpICYmIGRlZmluZWQoWl9XQU5UNjQpCi0jICBpZmRlZiBaX1BSRUZJWF9TRVQKLSMgICAgZGVmaW5lIHpfZ3pvcGVuIHpfZ3pvcGVuNjQKLSMgICAgZGVmaW5lIHpfZ3pzZWVrIHpfZ3pzZWVrNjQKLSMgICAgZGVmaW5lIHpfZ3p0ZWxsIHpfZ3p0ZWxsNjQKLSMgICAgZGVmaW5lIHpfZ3pvZmZzZXQgel9nem9mZnNldDY0Ci0jICAgIGRlZmluZSB6X2FkbGVyMzJfY29tYmluZSB6X2FkbGVyMzJfY29tYmluZTY0Ci0jICAgIGRlZmluZSB6X2NyYzMyX2NvbWJpbmUgel9jcmMzMl9jb21iaW5lNjQKLSMgIGVsc2UKLSMgICAgZGVmaW5lIGd6b3BlbiBnem9wZW42NAotIyAgICBkZWZpbmUgZ3pzZWVrIGd6c2VlazY0Ci0jICAgIGRlZmluZSBnenRlbGwgZ3p0ZWxsNjQKLSMgICAgZGVmaW5lIGd6b2Zmc2V0IGd6b2Zmc2V0NjQKLSMgICAgdW5kZWYgYWRsZXIzMl9jb21iaW5lCi0jICAgIHVuZGVmIGNyYzMyX2NvbWJpbmUKLSMgICAgZGVmaW5lIGFkbGVyMzJfY29tYmluZSBhZGxlcjMyX2NvbWJpbmU2NAotIyAgICBkZWZpbmUgY3JjMzJfY29tYmluZSBjcmMzMl9jb21iaW5lNjQKLSMgIGVuZGlmCi0jICBpZm5kZWYgWl9MQVJHRTY0Ci0gICAgIFpFWFRFUk4gZ3pGaWxlIFpFWFBPUlQgZ3pvcGVuNjQgT0YoKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSk7Ci0gICAgIFpFWFRFUk4gb2ZmNjRfdCBaRVhQT1JUIGd6c2VlazY0IE9GKChnekZpbGUsIG9mZjY0X3QsIGludCkpOwotICAgICBaRVhURVJOIG9mZjY0X3QgWkVYUE9SVCBnenRlbGw2NCBPRigoZ3pGaWxlKSk7Ci0gICAgIFpFWFRFUk4gel9vZmY2NF90IFpFWFBPUlQgZ3pvZmZzZXQ2NCBPRigoZ3pGaWxlKSk7Ci0gICAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBhZGxlcjMyX2NvbWJpbmU2NCBPRigodUxvbmcsIHVMb25nLCBvZmY2NF90KSk7Ci0gICAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgb2ZmNjRfdCkpOwotIyAgZW5kaWYKLSNlbHNlCi0gICBaRVhURVJOIGd6RmlsZSBaRVhQT1JUIGd6b3BlbiBPRigoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopKTsKLSAgIFpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6c2VlayBPRigoZ3pGaWxlLCB6X29mZl90LCBpbnQpKTsKLSAgIFpFWFRFUk4gel9vZmZfdCBaRVhQT1JUIGd6dGVsbCBPRigoZ3pGaWxlKSk7Ci0gICBaRVhURVJOIHpfb2ZmX3QgWkVYUE9SVCBnem9mZnNldCBPRigoZ3pGaWxlKSk7Ci0gICBaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lIE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmX3QpKTsKLSAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lIE9GKCh1TG9uZywgdUxvbmcsIHpfb2ZmX3QpKTsKLSNlbmRpZgotCi0jZWxzZSAvKiBaX1NPTE8gKi8KLQotICAgWkVYVEVSTiB1TG9uZyBaRVhQT1JUIGFkbGVyMzJfY29tYmluZSBPRigodUxvbmcsIHVMb25nLCB6X29mZl90KSk7Ci0gICBaRVhURVJOIHVMb25nIFpFWFBPUlQgY3JjMzJfY29tYmluZSBPRigodUxvbmcsIHVMb25nLCB6X29mZl90KSk7Ci0KLSNlbmRpZiAvKiAhWl9TT0xPICovCi0KLS8qIGhhY2sgZm9yIGJ1Z2d5IGNvbXBpbGVycyAqLwotI2lmICFkZWZpbmVkKFpVVElMX0gpICYmICFkZWZpbmVkKE5PX0RVTU1ZX0RFQ0wpCi0gICAgc3RydWN0IGludGVybmFsX3N0YXRlIHtpbnQgZHVtbXk7fTsKLSNlbmRpZgotCi0vKiB1bmRvY3VtZW50ZWQgZnVuY3Rpb25zICovCi1aRVhURVJOIGNvbnN0IGNoYXIgICAqIFpFWFBPUlQgekVycm9yICAgICAgICAgICBPRigoaW50KSk7Ci1aRVhURVJOIGludCAgICAgICAgICAgIFpFWFBPUlQgaW5mbGF0ZVN5bmNQb2ludCBPRigoel9zdHJlYW1wKSk7Ci1aRVhURVJOIGNvbnN0IHpfY3JjX3QgRkFSICogWkVYUE9SVCBnZXRfY3JjX3RhYmxlICAgIE9GKCh2b2lkKSk7Ci1aRVhURVJOIGludCAgICAgICAgICAgIFpFWFBPUlQgaW5mbGF0ZVVuZGVybWluZSBPRigoel9zdHJlYW1wLCBpbnQpKTsKLVpFWFRFUk4gaW50ICAgICAgICAgICAgWkVYUE9SVCBpbmZsYXRlUmVzZXRLZWVwIE9GKCh6X3N0cmVhbXApKTsKLVpFWFRFUk4gaW50ICAgICAgICAgICAgWkVYUE9SVCBkZWZsYXRlUmVzZXRLZWVwIE9GKCh6X3N0cmVhbXApKTsKLSNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoWl9TT0xPKQotWkVYVEVSTiBnekZpbGUgICAgICAgICBaRVhQT1JUIGd6b3Blbl93IE9GKChjb25zdCB3Y2hhcl90ICpwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptb2RlKSk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFNUREMpIHx8IGRlZmluZWQoWl9IQVZFX1NUREFSR19IKQotIyAgaWZuZGVmIFpfU09MTwotWkVYVEVSTiBpbnQgICAgICAgICAgICBaRVhQT1JUVkEgZ3p2cHJpbnRmIFpfQVJHKChnekZpbGUgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YV9saXN0IHZhKSk7Ci0jICBlbmRpZgotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAvKiBaTElCX0ggKi8KZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L3psaWJfdjEyOC96dXRpbC5jIGIvdGhpcmRfcGFydHkvemxpYl92MTI4L3p1dGlsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYTAwNzkuLjAwMDAwMDAKLS0tIGEvdGhpcmRfcGFydHkvemxpYl92MTI4L3p1dGlsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDEgKzAsMCBAQAotLyogenV0aWwuYyAtLSB0YXJnZXQgZGVwZW5kZW50IHV0aWxpdHkgZnVuY3Rpb25zIGZvciB0aGUgY29tcHJlc3Npb24gbGlicmFyeQotICogQ29weXJpZ2h0IChDKSAxOTk1LTIwMDUsIDIwMTAsIDIwMTEsIDIwMTIgSmVhbi1sb3VwIEdhaWxseS4KLSAqIEZvciBjb25kaXRpb25zIG9mIGRpc3RyaWJ1dGlvbiBhbmQgdXNlLCBzZWUgY29weXJpZ2h0IG5vdGljZSBpbiB6bGliLmgKLSAqLwotCi0vKiBAKCMpICRJZCQgKi8KLQotI2luY2x1ZGUgInp1dGlsLmgiCi0jaWZuZGVmIFpfU09MTwotIyAgaW5jbHVkZSAiZ3pndXRzLmgiCi0jZW5kaWYKLQotI2lmbmRlZiBOT19EVU1NWV9ERUNMCi1zdHJ1Y3QgaW50ZXJuYWxfc3RhdGUgICAgICB7aW50IGR1bW15O307IC8qIGZvciBidWdneSBjb21waWxlcnMgKi8KLSNlbmRpZgotCi16X2NvbnN0IGNoYXIgKiBjb25zdCB6X2Vycm1zZ1sxMF0gPSB7Ci0ibmVlZCBkaWN0aW9uYXJ5IiwgICAgIC8qIFpfTkVFRF9ESUNUICAgICAgIDIgICovCi0ic3RyZWFtIGVuZCIsICAgICAgICAgIC8qIFpfU1RSRUFNX0VORCAgICAgIDEgICovCi0iIiwgICAgICAgICAgICAgICAgICAgIC8qIFpfT0sgICAgICAgICAgICAgIDAgICovCi0iZmlsZSBlcnJvciIsICAgICAgICAgIC8qIFpfRVJSTk8gICAgICAgICAoLTEpICovCi0ic3RyZWFtIGVycm9yIiwgICAgICAgIC8qIFpfU1RSRUFNX0VSUk9SICAoLTIpICovCi0iZGF0YSBlcnJvciIsICAgICAgICAgIC8qIFpfREFUQV9FUlJPUiAgICAoLTMpICovCi0iaW5zdWZmaWNpZW50IG1lbW9yeSIsIC8qIFpfTUVNX0VSUk9SICAgICAoLTQpICovCi0iYnVmZmVyIGVycm9yIiwgICAgICAgIC8qIFpfQlVGX0VSUk9SICAgICAoLTUpICovCi0iaW5jb21wYXRpYmxlIHZlcnNpb24iLC8qIFpfVkVSU0lPTl9FUlJPUiAoLTYpICovCi0iIn07Ci0KLQotY29uc3QgY2hhciAqIFpFWFBPUlQgemxpYlZlcnNpb24oKQotewotICAgIHJldHVybiBaTElCX1ZFUlNJT047Ci19Ci0KLXVMb25nIFpFWFBPUlQgemxpYkNvbXBpbGVGbGFncygpCi17Ci0gICAgdUxvbmcgZmxhZ3M7Ci0KLSAgICBmbGFncyA9IDA7Ci0gICAgc3dpdGNoICgoaW50KShzaXplb2YodUludCkpKSB7Ci0gICAgY2FzZSAyOiAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OiAgICAgZmxhZ3MgKz0gMTsgICAgIGJyZWFrOwotICAgIGNhc2UgODogICAgIGZsYWdzICs9IDI7ICAgICBicmVhazsKLSAgICBkZWZhdWx0OiAgICBmbGFncyArPSAzOwotICAgIH0KLSAgICBzd2l0Y2ggKChpbnQpKHNpemVvZih1TG9uZykpKSB7Ci0gICAgY2FzZSAyOiAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OiAgICAgZmxhZ3MgKz0gMSA8PCAyOyAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OiAgICAgZmxhZ3MgKz0gMiA8PCAyOyAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDogICAgZmxhZ3MgKz0gMyA8PCAyOwotICAgIH0KLSAgICBzd2l0Y2ggKChpbnQpKHNpemVvZih2b2lkcGYpKSkgewotICAgIGNhc2UgMjogICAgIGJyZWFrOwotICAgIGNhc2UgNDogICAgIGZsYWdzICs9IDEgPDwgNDsgICAgICAgIGJyZWFrOwotICAgIGNhc2UgODogICAgIGZsYWdzICs9IDIgPDwgNDsgICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6ICAgIGZsYWdzICs9IDMgPDwgNDsKLSAgICB9Ci0gICAgc3dpdGNoICgoaW50KShzaXplb2Yoel9vZmZfdCkpKSB7Ci0gICAgY2FzZSAyOiAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OiAgICAgZmxhZ3MgKz0gMSA8PCA2OyAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OiAgICAgZmxhZ3MgKz0gMiA8PCA2OyAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDogICAgZmxhZ3MgKz0gMyA8PCA2OwotICAgIH0KLSNpZmRlZiBERUJVRwotICAgIGZsYWdzICs9IDEgPDwgODsKLSNlbmRpZgotI2lmIGRlZmluZWQoQVNNVikgfHwgZGVmaW5lZChBU01JTkYpCi0gICAgZmxhZ3MgKz0gMSA8PCA5OwotI2VuZGlmCi0jaWZkZWYgWkxJQl9XSU5BUEkKLSAgICBmbGFncyArPSAxIDw8IDEwOwotI2VuZGlmCi0jaWZkZWYgQlVJTERGSVhFRAotICAgIGZsYWdzICs9IDEgPDwgMTI7Ci0jZW5kaWYKLSNpZmRlZiBEWU5BTUlDX0NSQ19UQUJMRQotICAgIGZsYWdzICs9IDEgPDwgMTM7Ci0jZW5kaWYKLSNpZmRlZiBOT19HWkNPTVBSRVNTCi0gICAgZmxhZ3MgKz0gMUwgPDwgMTY7Ci0jZW5kaWYKLSNpZmRlZiBOT19HWklQCi0gICAgZmxhZ3MgKz0gMUwgPDwgMTc7Ci0jZW5kaWYKLSNpZmRlZiBQS1pJUF9CVUdfV09SS0FST1VORAotICAgIGZsYWdzICs9IDFMIDw8IDIwOwotI2VuZGlmCi0jaWZkZWYgRkFTVEVTVAotICAgIGZsYWdzICs9IDFMIDw8IDIxOwotI2VuZGlmCi0jaWYgZGVmaW5lZChTVERDKSB8fCBkZWZpbmVkKFpfSEFWRV9TVERBUkdfSCkKLSMgIGlmZGVmIE5PX3ZzbnByaW50ZgotICAgIGZsYWdzICs9IDFMIDw8IDI1OwotIyAgICBpZmRlZiBIQVNfdnNwcmludGZfdm9pZAotICAgIGZsYWdzICs9IDFMIDw8IDI2OwotIyAgICBlbmRpZgotIyAgZWxzZQotIyAgICBpZmRlZiBIQVNfdnNucHJpbnRmX3ZvaWQKLSAgICBmbGFncyArPSAxTCA8PCAyNjsKLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZWxzZQotICAgIGZsYWdzICs9IDFMIDw8IDI0OwotIyAgaWZkZWYgTk9fc25wcmludGYKLSAgICBmbGFncyArPSAxTCA8PCAyNTsKLSMgICAgaWZkZWYgSEFTX3NwcmludGZfdm9pZAotICAgIGZsYWdzICs9IDFMIDw8IDI2OwotIyAgICBlbmRpZgotIyAgZWxzZQotIyAgICBpZmRlZiBIQVNfc25wcmludGZfdm9pZAotICAgIGZsYWdzICs9IDFMIDw8IDI2OwotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotICAgIHJldHVybiBmbGFnczsKLX0KLQotI2lmZGVmIERFQlVHCi0KLSMgIGlmbmRlZiB2ZXJib3NlCi0jICAgIGRlZmluZSB2ZXJib3NlIDAKLSMgIGVuZGlmCi1pbnQgWkxJQl9JTlRFUk5BTCB6X3ZlcmJvc2UgPSB2ZXJib3NlOwotCi12b2lkIFpMSUJfSU5URVJOQUwgel9lcnJvciAoCi0gICAgY2hhciAqbSkKLXsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBtKTsKLSAgICBleGl0KDEpOwotfQotI2VuZGlmCi0KLS8qIGV4cG9ydGVkIHRvIGFsbG93IGNvbnZlcnNpb24gb2YgZXJyb3IgY29kZSB0byBzdHJpbmcgZm9yIGNvbXByZXNzKCkgYW5kCi0gKiB1bmNvbXByZXNzKCkKLSAqLwotY29uc3QgY2hhciAqIFpFWFBPUlQgekVycm9yKAotICAgIGludCBlcnIpCi17Ci0gICAgcmV0dXJuIEVSUl9NU0coZXJyKTsKLX0KLQotI2lmIGRlZmluZWQoX1dJTjMyX1dDRSkKLSAgICAvKiBUaGUgTWljcm9zb2Z0IEMgUnVuLVRpbWUgTGlicmFyeSBmb3IgV2luZG93cyBDRSBkb2Vzbid0IGhhdmUKLSAgICAgKiBlcnJuby4gIFdlIGRlZmluZSBpdCBhcyBhIGdsb2JhbCB2YXJpYWJsZSB0byBzaW1wbGlmeSBwb3J0aW5nLgotICAgICAqIEl0cyB2YWx1ZSBpcyBhbHdheXMgMCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLgotICAgICAqLwotCS8qIGRvZXMgbm90IGV4aXN0IG9uIFdDRS4gWFlROiBhbmQgd2UgZG9uJ3QgbmVlZCBpdCEgKi8KLSAgICAvKmludCBlcnJubyA9IDA7Ki8KLSNlbmRpZgotCi0jaWZuZGVmIEhBVkVfTUVNQ1BZCi0KLXZvaWQgWkxJQl9JTlRFUk5BTCB6bWVtY3B5KAotICAgIEJ5dGVmKiBkZXN0LAotICAgIGNvbnN0IEJ5dGVmKiBzb3VyY2UsCi0gICAgdUludCAgbGVuKQotewotICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuOwotICAgIGRvIHsKLSAgICAgICAgKmRlc3QrKyA9ICpzb3VyY2UrKzsgLyogPz8/IHRvIGJlIHVucm9sbGVkICovCi0gICAgfSB3aGlsZSAoLS1sZW4gIT0gMCk7Ci19Ci0KLWludCBaTElCX0lOVEVSTkFMIHptZW1jbXAoCi0gICAgY29uc3QgQnl0ZWYqIHMxLAotICAgIGNvbnN0IEJ5dGVmKiBzMiwKLSAgICB1SW50ICBsZW4pCi17Ci0gICAgdUludCBqOwotCi0gICAgZm9yIChqID0gMDsgaiA8IGxlbjsgaisrKSB7Ci0gICAgICAgIGlmIChzMVtqXSAhPSBzMltqXSkgcmV0dXJuIDIqKHMxW2pdID4gczJbal0pLTE7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi12b2lkIFpMSUJfSU5URVJOQUwgem1lbXplcm8oCi0gICAgQnl0ZWYqIGRlc3QsCi0gICAgdUludCAgbGVuKQotewotICAgIGlmIChsZW4gPT0gMCkgcmV0dXJuOwotICAgIGRvIHsKLSAgICAgICAgKmRlc3QrKyA9IDA7ICAvKiA/Pz8gdG8gYmUgdW5yb2xsZWQgKi8KLSAgICB9IHdoaWxlICgtLWxlbiAhPSAwKTsKLX0KLSNlbmRpZgotCi0jaWYgMAotI2lmbmRlZiBaX1NPTE8KLQotI2lmZGVmIFNZUzE2QklUCi0KLSNpZmRlZiBfX1RVUkJPQ19fCi0vKiBUdXJibyBDIGluIDE2LWJpdCBtb2RlICovCi0KLSMgIGRlZmluZSBNWV9aQ0FMTE9DCi0KLS8qIFR1cmJvIEMgbWFsbG9jKCkgZG9lcyBub3QgYWxsb3cgZHluYW1pYyBhbGxvY2F0aW9uIG9mIDY0SyBieXRlcwotICogYW5kIGZhcm1hbGxvYyg2NEspIHJldHVybnMgYSBwb2ludGVyIHdpdGggYW4gb2Zmc2V0IG9mIDgsIHNvIHdlCi0gKiBtdXN0IGZpeCB0aGUgcG9pbnRlci4gV2FybmluZzogdGhlIHBvaW50ZXIgbXVzdCBiZSBwdXQgYmFjayB0byBpdHMKLSAqIG9yaWdpbmFsIGZvcm0gaW4gb3JkZXIgdG8gZnJlZSBpdCwgdXNlIHpjZnJlZSgpLgotICovCi0KLSNkZWZpbmUgTUFYX1BUUiAxMAotLyogMTAqNjRLID0gNjQwSyAqLwotCi1sb2NhbCBpbnQgbmV4dF9wdHIgPSAwOwotCi10eXBlZGVmIHN0cnVjdCBwdHJfdGFibGVfcyB7Ci0gICAgdm9pZHBmIG9yZ19wdHI7Ci0gICAgdm9pZHBmIG5ld19wdHI7Ci19IHB0cl90YWJsZTsKLQotbG9jYWwgcHRyX3RhYmxlIHRhYmxlW01BWF9QVFJdOwotLyogVGhpcyB0YWJsZSBpcyB1c2VkIHRvIHJlbWVtYmVyIHRoZSBvcmlnaW5hbCBmb3JtIG9mIHBvaW50ZXJzCi0gKiB0byBsYXJnZSBidWZmZXJzICg2NEspLiBTdWNoIHBvaW50ZXJzIGFyZSBub3JtYWxpemVkIHdpdGggYSB6ZXJvIG9mZnNldC4KLSAqIFNpbmNlIE1TRE9TIGlzIG5vdCBhIHByZWVtcHRpdmUgbXVsdGl0YXNraW5nIE9TLCB0aGlzIHRhYmxlIGlzIG5vdAotICogcHJvdGVjdGVkIGZyb20gY29uY3VycmVudCBhY2Nlc3MuIFRoaXMgaGFjayBkb2Vzbid0IHdvcmsgYW55d2F5IG9uCi0gKiBhIHByb3RlY3RlZCBzeXN0ZW0gbGlrZSBPUy8yLiBVc2UgTWljcm9zb2Z0IEMgaW5zdGVhZC4KLSAqLwotCi12b2lkcGYgWkxJQl9JTlRFUk5BTCB6Y2FsbG9jICh2b2lkcGYgb3BhcXVlLCB1bnNpZ25lZCBpdGVtcywgdW5zaWduZWQgc2l6ZSkKLXsKLSAgICB2b2lkcGYgYnVmID0gb3BhcXVlOyAvKiBqdXN0IHRvIG1ha2Ugc29tZSBjb21waWxlcnMgaGFwcHkgKi8KLSAgICB1bGcgYnNpemUgPSAodWxnKWl0ZW1zKnNpemU7Ci0KLSAgICAvKiBJZiB3ZSBhbGxvY2F0ZSBsZXNzIHRoYW4gNjU1MjAgYnl0ZXMsIHdlIGFzc3VtZSB0aGF0IGZhcm1hbGxvYwotICAgICAqIHdpbGwgcmV0dXJuIGEgdXNhYmxlIHBvaW50ZXIgd2hpY2ggZG9lc24ndCBoYXZlIHRvIGJlIG5vcm1hbGl6ZWQuCi0gICAgICovCi0gICAgaWYgKGJzaXplIDwgNjU1MjBMKSB7Ci0gICAgICAgIGJ1ZiA9IGZhcm1hbGxvYyhic2l6ZSk7Ci0gICAgICAgIGlmICgqKHVzaCopJmJ1ZiAhPSAwKSByZXR1cm4gYnVmOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ1ZiA9IGZhcm1hbGxvYyhic2l6ZSArIDE2TCk7Ci0gICAgfQotICAgIGlmIChidWYgPT0gTlVMTCB8fCBuZXh0X3B0ciA+PSBNQVhfUFRSKSByZXR1cm4gTlVMTDsKLSAgICB0YWJsZVtuZXh0X3B0cl0ub3JnX3B0ciA9IGJ1ZjsKLQotICAgIC8qIE5vcm1hbGl6ZSB0aGUgcG9pbnRlciB0byBzZWc6MCAqLwotICAgICooKHVzaCopJmJ1ZisxKSArPSAoKHVzaCkoKHVjaCopYnVmLTApICsgMTUpID4+IDQ7Ci0gICAgKih1c2gqKSZidWYgPSAwOwotICAgIHRhYmxlW25leHRfcHRyKytdLm5ld19wdHIgPSBidWY7Ci0gICAgcmV0dXJuIGJ1ZjsKLX0KLQotdm9pZCBaTElCX0lOVEVSTkFMIHpjZnJlZSAodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHB0cikKLXsKLSAgICBpbnQgbjsKLSAgICBpZiAoKih1c2gqKSZwdHIgIT0gMCkgeyAvKiBvYmplY3QgPCA2NEsgKi8KLSAgICAgICAgZmFyZnJlZShwdHIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIC8qIEZpbmQgdGhlIG9yaWdpbmFsIHBvaW50ZXIgKi8KLSAgICBmb3IgKG4gPSAwOyBuIDwgbmV4dF9wdHI7IG4rKykgewotICAgICAgICBpZiAocHRyICE9IHRhYmxlW25dLm5ld19wdHIpIGNvbnRpbnVlOwotCi0gICAgICAgIGZhcmZyZWUodGFibGVbbl0ub3JnX3B0cik7Ci0gICAgICAgIHdoaWxlICgrK24gPCBuZXh0X3B0cikgewotICAgICAgICAgICAgdGFibGVbbi0xXSA9IHRhYmxlW25dOwotICAgICAgICB9Ci0gICAgICAgIG5leHRfcHRyLS07Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcHRyID0gb3BhcXVlOyAvKiBqdXN0IHRvIG1ha2Ugc29tZSBjb21waWxlcnMgaGFwcHkgKi8KLSAgICBBc3NlcnQoMCwgInpjZnJlZTogcHRyIG5vdCBmb3VuZCIpOwotfQotCi0jZW5kaWYgLyogX19UVVJCT0NfXyAqLwotCi0KLSNpZmRlZiBNX0k4NgotLyogTWljcm9zb2Z0IEMgaW4gMTYtYml0IG1vZGUgKi8KLQotIyAgZGVmaW5lIE1ZX1pDQUxMT0MKLQotI2lmICghZGVmaW5lZChfTVNDX1ZFUikgfHwgKF9NU0NfVkVSIDw9IDYwMCkpCi0jICBkZWZpbmUgX2hhbGxvYyAgaGFsbG9jCi0jICBkZWZpbmUgX2hmcmVlICAgaGZyZWUKLSNlbmRpZgotCi12b2lkcGYgWkxJQl9JTlRFUk5BTCB6Y2FsbG9jICh2b2lkcGYgb3BhcXVlLCB1SW50IGl0ZW1zLCB1SW50IHNpemUpCi17Ci0gICAgaWYgKG9wYXF1ZSkgb3BhcXVlID0gMDsgLyogdG8gbWFrZSBjb21waWxlciBoYXBweSAqLwotICAgIHJldHVybiBfaGFsbG9jKChsb25nKWl0ZW1zLCBzaXplKTsKLX0KLQotdm9pZCBaTElCX0lOVEVSTkFMIHpjZnJlZSAodm9pZHBmIG9wYXF1ZSwgdm9pZHBmIHB0cikKLXsKLSAgICBpZiAob3BhcXVlKSBvcGFxdWUgPSAwOyAvKiB0byBtYWtlIGNvbXBpbGVyIGhhcHB5ICovCi0gICAgX2hmcmVlKHB0cik7Ci19Ci0KLSNlbmRpZiAvKiBNX0k4NiAqLwotCi0jZW5kaWYgLyogU1lTMTZCSVQgKi8KLQotCi0jaWZuZGVmIE1ZX1pDQUxMT0MgLyogQW55IHN5c3RlbSB3aXRob3V0IGEgc3BlY2lhbCBhbGxvYyBmdW5jdGlvbiAqLwotCi0jaWZuZGVmIFNUREMKLWV4dGVybiB2b2lkcCAgbWFsbG9jIE9GKCh1SW50IHNpemUpKTsKLWV4dGVybiB2b2lkcCAgY2FsbG9jIE9GKCh1SW50IGl0ZW1zLCB1SW50IHNpemUpKTsKLWV4dGVybiB2b2lkICAgZnJlZSAgIE9GKCh2b2lkcGYgcHRyKSk7Ci0jZW5kaWYKLQotdm9pZHBmIFpMSUJfSU5URVJOQUwgemNhbGxvYyAob3BhcXVlLCBpdGVtcywgc2l6ZSkKLSAgICB2b2lkcGYgb3BhcXVlOwotICAgIHVuc2lnbmVkIGl0ZW1zOwotICAgIHVuc2lnbmVkIHNpemU7Ci17Ci0gICAgaWYgKG9wYXF1ZSkgaXRlbXMgKz0gc2l6ZSAtIHNpemU7IC8qIG1ha2UgY29tcGlsZXIgaGFwcHkgKi8KLSAgICByZXR1cm4gc2l6ZW9mKHVJbnQpID4gMiA/ICh2b2lkcGYpbWFsbG9jKGl0ZW1zICogc2l6ZSkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWRwZiljYWxsb2MoaXRlbXMsIHNpemUpOwotfQotCi12b2lkIFpMSUJfSU5URVJOQUwgemNmcmVlIChvcGFxdWUsIHB0cikKLSAgICB2b2lkcGYgb3BhcXVlOwotICAgIHZvaWRwZiBwdHI7Ci17Ci0gICAgZnJlZShwdHIpOwotICAgIGlmIChvcGFxdWUpIHJldHVybjsgLyogbWFrZSBjb21waWxlciBoYXBweSAqLwotfQotCi0jZW5kaWYgLyogTVlfWkNBTExPQyAqLwotCi0jZW5kaWYgLyogIVpfU09MTyAqLwotI2VuZGlmCS8qIDAgKi8KLQotZXh0ZXJuIHZvaWQqIEZYTUVNX0RlZmF1bHRBbGxvYyhzaXplX3QsIGludCk7Ci1leHRlcm4gdm9pZCBGWE1FTV9EZWZhdWx0RnJlZSh2b2lkKiwgaW50KTsKLQotLyogWFlRIDIwMDctMS0xOSAqLwotdm9pZHBmIHpjYWxsb2Modm9pZHBmIG9wYXF1ZSwgdW5zaWduZWQgaXRlbXMsIHVuc2lnbmVkIHNpemUpCi17Ci0JcmV0dXJuIEZYTUVNX0RlZmF1bHRBbGxvYyhpdGVtcyAqIHNpemUsIDApOwotfQotCi12b2lkIHpjZnJlZSh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgcHRyKQotewotCUZYTUVNX0RlZmF1bHRGcmVlKHB0ciwgMCk7Ci19CmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS96bGliX3YxMjgvenV0aWwuaCBiL3RoaXJkX3BhcnR5L3psaWJfdjEyOC96dXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2IxMGUxLi4wMDAwMDAwCi0tLSBhL3RoaXJkX3BhcnR5L3psaWJfdjEyOC96dXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qIHp1dGlsLmggLS0gaW50ZXJuYWwgaW50ZXJmYWNlIGFuZCBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21wcmVzc2lvbiBsaWJyYXJ5Ci0gKiBDb3B5cmlnaHQgKEMpIDE5OTUtMjAxMyBKZWFuLWxvdXAgR2FpbGx5LgotICogRm9yIGNvbmRpdGlvbnMgb2YgZGlzdHJpYnV0aW9uIGFuZCB1c2UsIHNlZSBjb3B5cmlnaHQgbm90aWNlIGluIHpsaWIuaAotICovCi0KLS8qIFdBUk5JTkc6IHRoaXMgZmlsZSBzaG91bGQgKm5vdCogYmUgdXNlZCBieSBhcHBsaWNhdGlvbnMuIEl0IGlzCi0gICBwYXJ0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY29tcHJlc3Npb24gbGlicmFyeSBhbmQgaXMKLSAgIHN1YmplY3QgdG8gY2hhbmdlLiBBcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgdXNlIHpsaWIuaC4KLSAqLwotCi0vKiBAKCMpICRJZCQgKi8KLQotI2lmbmRlZiBaVVRJTF9ICi0jZGVmaW5lIFpVVElMX0gKLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0KLSNpZmRlZiBIQVZFX0hJRERFTgotIyAgZGVmaW5lIFpMSUJfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSAoImhpZGRlbiIpKSkKLSNlbHNlCi0jICBkZWZpbmUgWkxJQl9JTlRFUk5BTAotI2VuZGlmCi0KLSNpbmNsdWRlICJ6bGliLmgiCi0KLSNpZiBkZWZpbmVkKFNUREMpICYmICFkZWZpbmVkKFpfU09MTykKLSMgIGlmICEoZGVmaW5lZChfV0lOMzJfV0NFKSAmJiBkZWZpbmVkKF9NU0NfVkVSKSkKLSMgICAgaW5jbHVkZSA8c3RkZGVmLmg+Ci0jICBlbmRpZgotIyAgaW5jbHVkZSA8c3RyaW5nLmg+Ci0jICBpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaWZkZWYgWl9TT0xPCi0gICB0eXBlZGVmIGxvbmcgcHRyZGlmZl90OyAgLyogZ3Vlc3MgLS0gd2lsbCBiZSBjYXVnaHQgaWYgZ3Vlc3MgaXMgd3JvbmcgKi8KLSNlbmRpZgotCi0jaWZuZGVmIGxvY2FsCi0jICBkZWZpbmUgbG9jYWwgc3RhdGljCi0jZW5kaWYKLS8qIGNvbXBpbGUgd2l0aCAtRGxvY2FsIGlmIHlvdXIgZGVidWdnZXIgY2FuJ3QgZmluZCBzdGF0aWMgc3ltYm9scyAqLwotCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgIHVjaDsKLXR5cGVkZWYgdWNoIEZBUiB1Y2hmOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB1c2g7Ci10eXBlZGVmIHVzaCBGQVIgdXNoZjsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyAgdWxnOwotCi1leHRlcm4gel9jb25zdCBjaGFyICogY29uc3Qgel9lcnJtc2dbMTBdOyAvKiBpbmRleGVkIGJ5IDItemxpYl9lcnJvciAqLwotLyogKHNpemUgZ2l2ZW4gdG8gYXZvaWQgc2lsbHkgd2FybmluZ3Mgd2l0aCBWaXN1YWwgQysrKSAqLwotCi0jZGVmaW5lIEVSUl9NU0coZXJyKSB6X2Vycm1zZ1taX05FRURfRElDVC0oZXJyKV0KLQotI2RlZmluZSBFUlJfUkVUVVJOKHN0cm0sZXJyKSBcCi0gIHJldHVybiAoc3RybS0+bXNnID0gRVJSX01TRyhlcnIpLCAoZXJyKSkKLS8qIFRvIGJlIHVzZWQgb25seSB3aGVuIHRoZSBzdGF0ZSBpcyBrbm93biB0byBiZSB2YWxpZCAqLwotCi0gICAgICAgIC8qIGNvbW1vbiBjb25zdGFudHMgKi8KLQotI2lmbmRlZiBERUZfV0JJVFMKLSMgIGRlZmluZSBERUZfV0JJVFMgTUFYX1dCSVRTCi0jZW5kaWYKLS8qIGRlZmF1bHQgd2luZG93Qml0cyBmb3IgZGVjb21wcmVzc2lvbi4gTUFYX1dCSVRTIGlzIGZvciBjb21wcmVzc2lvbiBvbmx5ICovCi0KLSNpZiBNQVhfTUVNX0xFVkVMID49IDgKLSMgIGRlZmluZSBERUZfTUVNX0xFVkVMIDgKLSNlbHNlCi0jICBkZWZpbmUgREVGX01FTV9MRVZFTCAgTUFYX01FTV9MRVZFTAotI2VuZGlmCi0vKiBkZWZhdWx0IG1lbUxldmVsICovCi0KLSNkZWZpbmUgU1RPUkVEX0JMT0NLIDAKLSNkZWZpbmUgU1RBVElDX1RSRUVTIDEKLSNkZWZpbmUgRFlOX1RSRUVTICAgIDIKLS8qIFRoZSB0aHJlZSBraW5kcyBvZiBibG9jayB0eXBlICovCi0KLSNkZWZpbmUgTUlOX01BVENIICAzCi0jZGVmaW5lIE1BWF9NQVRDSCAgMjU4Ci0vKiBUaGUgbWluaW11bSBhbmQgbWF4aW11bSBtYXRjaCBsZW5ndGhzICovCi0KLSNkZWZpbmUgUFJFU0VUX0RJQ1QgMHgyMCAvKiBwcmVzZXQgZGljdGlvbmFyeSBmbGFnIGluIHpsaWIgaGVhZGVyICovCi0KLSAgICAgICAgLyogdGFyZ2V0IGRlcGVuZGVuY2llcyAqLwotCi0jaWYgZGVmaW5lZChNU0RPUykgfHwgKGRlZmluZWQoV0lORE9XUykgJiYgIWRlZmluZWQoV0lOMzIpKQotIyAgZGVmaW5lIE9TX0NPREUgIDB4MDAKLSMgIGlmbmRlZiBaX1NPTE8KLSMgICAgaWYgZGVmaW5lZChfX1RVUkJPQ19fKSB8fCBkZWZpbmVkKF9fQk9STEFORENfXykKLSMgICAgICBpZiAoX19TVERDX18gPT0gMSkgJiYgKGRlZmluZWQoX19MQVJHRV9fKSB8fCBkZWZpbmVkKF9fQ09NUEFDVF9fKSkKLSAgICAgICAgIC8qIEFsbG93IGNvbXBpbGF0aW9uIHdpdGggQU5TSSBrZXl3b3JkcyBvbmx5IGVuYWJsZWQgKi8KLSAgICAgICAgIHZvaWQgX0NkZWNsIGZhcmZyZWUoIHZvaWQgKmJsb2NrICk7Ci0gICAgICAgICB2b2lkICpfQ2RlY2wgZmFybWFsbG9jKCB1bnNpZ25lZCBsb25nIG5ieXRlcyApOwotIyAgICAgIGVsc2UKLSMgICAgICAgIGluY2x1ZGUgPGFsbG9jLmg+Ci0jICAgICAgZW5kaWYKLSMgICAgZWxzZSAvKiBNU0Mgb3IgREpHUFAgKi8KLSMgICAgICBpbmNsdWRlIDxtYWxsb2MuaD4KLSMgICAgZW5kaWYKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIEFNSUdBCi0jICBkZWZpbmUgT1NfQ09ERSAgMHgwMQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFZBWEMpIHx8IGRlZmluZWQoVk1TKQotIyAgZGVmaW5lIE9TX0NPREUgIDB4MDIKLSMgIGRlZmluZSBGX09QRU4obmFtZSwgbW9kZSkgXAotICAgICBGWFNZU19mb3BlbigobmFtZSksIChtb2RlKSwgIm1iYz02MCIsICJjdHg9c3RtIiwgInJmbT1maXgiLCAibXJzPTUxMiIpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQVRBUkkpIHx8IGRlZmluZWQoYXRhcmlzdCkKLSMgIGRlZmluZSBPU19DT0RFICAweDA1Ci0jZW5kaWYKLQotI2lmZGVmIE9TMgotIyAgZGVmaW5lIE9TX0NPREUgIDB4MDYKLSMgIGlmIGRlZmluZWQoTV9JODYpICYmICFkZWZpbmVkKFpfU09MTykKLSMgICAgaW5jbHVkZSA8bWFsbG9jLmg+Ci0jICBlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKE1BQ09TKSB8fCBkZWZpbmVkKFRBUkdFVF9PU19NQUMpCi0jICBkZWZpbmUgT1NfQ09ERSAgMHgwNwotIyAgaWZuZGVmIFpfU09MTwotIyAgICBpZiBkZWZpbmVkKF9fTVdFUktTX18pICYmIF9fZGVzdF9vcyAhPSBfX2JlX29zICYmIF9fZGVzdF9vcyAhPSBfX3dpbjMyX29zCi0jICAgICAgaW5jbHVkZSA8dW5peC5oPiAvKiBmb3IgZmRvcGVuICovCi0jICAgIGVsc2UKLSMgICAgICBpZm5kZWYgZmRvcGVuCi0jICAgICAgICBkZWZpbmUgZmRvcGVuKGZkLG1vZGUpIE5VTEwgLyogTm8gZmRvcGVuKCkgKi8KLSMgICAgICBlbmRpZgotIyAgICBlbmRpZgotIyAgZW5kaWYKLSNlbmRpZgotCi0jaWZkZWYgVE9QUzIwCi0jICBkZWZpbmUgT1NfQ09ERSAgMHgwYQotI2VuZGlmCi0KLSNpZmRlZiBXSU4zMgotIyAgaWZuZGVmIF9fQ1lHV0lOX18gIC8qIEN5Z3dpbiBpcyBVbml4LCBub3QgV2luMzIgKi8KLSMgICAgZGVmaW5lIE9TX0NPREUgIDB4MGIKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmZGVmIF9fNTBTRVJJRVMgLyogUHJpbWUvUFJJTU9TICovCi0jICBkZWZpbmUgT1NfQ09ERSAgMHgwZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9CRU9TXykgfHwgZGVmaW5lZChSSVNDT1MpCi0jICBkZWZpbmUgZmRvcGVuKGZkLG1vZGUpIE5VTEwgLyogTm8gZmRvcGVuKCkgKi8KLSNlbmRpZgotCi0jaWYgKGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+IDYwMCkpICYmICFkZWZpbmVkIF9fSU5URVJJWAotIyAgaWYgZGVmaW5lZChfV0lOMzJfV0NFKQotIyAgICBkZWZpbmUgZmRvcGVuKGZkLG1vZGUpIE5VTEwgLyogTm8gZmRvcGVuKCkgKi8KLSMgICAgaWZuZGVmIF9QVFJESUZGX1RfREVGSU5FRAotICAgICAgIHR5cGVkZWYgaW50IHB0cmRpZmZfdDsKLSMgICAgICBkZWZpbmUgX1BUUkRJRkZfVF9ERUZJTkVECi0jICAgIGVuZGlmCi0jICBlbHNlCi0jICAgIGRlZmluZSBmZG9wZW4oZmQsdHlwZSkgIF9mZG9wZW4oZmQsdHlwZSkKLSMgIGVuZGlmCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19CT1JMQU5EQ19fKSAmJiAhZGVmaW5lZChNU0RPUykKLSAgI3ByYWdtYSB3YXJuIC04MDA0Ci0gICNwcmFnbWEgd2FybiAtODAwOAotICAjcHJhZ21hIHdhcm4gLTgwNjYKLSNlbmRpZgotCi0vKiBwcm92aWRlIHByb3RvdHlwZXMgZm9yIHRoZXNlIHdoZW4gYnVpbGRpbmcgemxpYiB3aXRob3V0IExGUyAqLwotI2lmICFkZWZpbmVkKF9XSU4zMikgJiYgXAotICAgICghZGVmaW5lZChfTEFSR0VGSUxFNjRfU09VUkNFKSB8fCBfTEZTNjRfTEFSR0VGSUxFLTAgPT0gMCkKLSAgICBaRVhURVJOIHVMb25nIFpFWFBPUlQgYWRsZXIzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgel9vZmZfdCkpOwotICAgIFpFWFRFUk4gdUxvbmcgWkVYUE9SVCBjcmMzMl9jb21iaW5lNjQgT0YoKHVMb25nLCB1TG9uZywgel9vZmZfdCkpOwotI2VuZGlmCi0KLSAgICAgICAgLyogY29tbW9uIGRlZmF1bHRzICovCi0KLSNpZm5kZWYgT1NfQ09ERQotIyAgZGVmaW5lIE9TX0NPREUgIDB4MDMgIC8qIGFzc3VtZSBVbml4ICovCi0jZW5kaWYKLQotI2lmbmRlZiBGX09QRU4KLSMgIGRlZmluZSBGX09QRU4obmFtZSwgbW9kZSkgRlhTWVNfZm9wZW4oKG5hbWUpLCAobW9kZSkpCi0jZW5kaWYKLQotICAgICAgICAgLyogZnVuY3Rpb25zICovCi0KLSNpZiBkZWZpbmVkKHB5cikgfHwgZGVmaW5lZChaX1NPTE8pCi0jICBkZWZpbmUgTk9fTUVNQ1BZCi0jZW5kaWYKLSNpZiBkZWZpbmVkKFNNQUxMX01FRElVTSkgJiYgIWRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9fU0NfXykKLSAvKiBVc2Ugb3VyIG93biBmdW5jdGlvbnMgZm9yIHNtYWxsIGFuZCBtZWRpdW0gbW9kZWwgd2l0aCBNU0MgPD0gNS4wLgotICAqIFlvdSBtYXkgaGF2ZSB0byB1c2UgdGhlIHNhbWUgc3RyYXRlZ3kgZm9yIEJvcmxhbmQgQyAodW50ZXN0ZWQpLgotICAqIFRoZSBfX1NDX18gY2hlY2sgaXMgZm9yIFN5bWFudGVjLgotICAqLwotIyAgZGVmaW5lIE5PX01FTUNQWQotI2VuZGlmCi0jaWYgZGVmaW5lZChTVERDKSAmJiAhZGVmaW5lZChIQVZFX01FTUNQWSkgJiYgIWRlZmluZWQoTk9fTUVNQ1BZKQotIyAgZGVmaW5lIEhBVkVfTUVNQ1BZCi0jZW5kaWYKLSNpZmRlZiBIQVZFX01FTUNQWQotIyAgaWZkZWYgU01BTExfTUVESVVNIC8qIE1TRE9TIHNtYWxsIG9yIG1lZGl1bSBtb2RlbCAqLwotIyAgICBkZWZpbmUgem1lbWNweSBfZm1lbWNweQotIyAgICBkZWZpbmUgem1lbWNtcCBfZm1lbWNtcAotIyAgICBkZWZpbmUgem1lbXplcm8oZGVzdCwgbGVuKSBfZm1lbXNldChkZXN0LCAwLCBsZW4pCi0jICBlbHNlCi0jICAgIGRlZmluZSB6bWVtY3B5IEZYU1lTX21lbWNweQotIyAgICBkZWZpbmUgem1lbWNtcCBGWFNZU19tZW1jbXAKLSMgICAgZGVmaW5lIHptZW16ZXJvKGRlc3QsIGxlbikgRlhTWVNfbWVtc2V0KGRlc3QsIDAsIGxlbikKLSMgIGVuZGlmCi0jZWxzZQotICAgdm9pZCBaTElCX0lOVEVSTkFMIHptZW1jcHkgT0YoKEJ5dGVmKiBkZXN0LCBjb25zdCBCeXRlZiogc291cmNlLCB1SW50IGxlbikpOwotICAgaW50IFpMSUJfSU5URVJOQUwgem1lbWNtcCBPRigoY29uc3QgQnl0ZWYqIHMxLCBjb25zdCBCeXRlZiogczIsIHVJbnQgbGVuKSk7Ci0gICB2b2lkIFpMSUJfSU5URVJOQUwgem1lbXplcm8gT0YoKEJ5dGVmKiBkZXN0LCB1SW50IGxlbikpOwotI2VuZGlmCi0KLS8qIERpYWdub3N0aWMgZnVuY3Rpb25zICovCi0jaWZkZWYgREVCVUcKLSMgIGluY2x1ZGUgPHN0ZGlvLmg+Ci0gICBleHRlcm4gaW50IFpMSUJfSU5URVJOQUwgel92ZXJib3NlOwotICAgZXh0ZXJuIHZvaWQgWkxJQl9JTlRFUk5BTCB6X2Vycm9yIE9GKChjaGFyICptKSk7Ci0jICBkZWZpbmUgQXNzZXJ0KGNvbmQsbXNnKSB7aWYoIShjb25kKSkgel9lcnJvcihtc2cpO30KLSMgIGRlZmluZSBUcmFjZSh4KSB7aWYgKHpfdmVyYm9zZT49MCkgRlhTWVNfZnByaW50ZiB4IDt9Ci0jICBkZWZpbmUgVHJhY2V2KHgpIHtpZiAoel92ZXJib3NlPjApIEZYU1lTX2ZwcmludGYgeCA7fQotIyAgZGVmaW5lIFRyYWNldnYoeCkge2lmICh6X3ZlcmJvc2U+MSkgRlhTWVNfZnByaW50ZiB4IDt9Ci0jICBkZWZpbmUgVHJhY2VjKGMseCkge2lmICh6X3ZlcmJvc2U+MCAmJiAoYykpIEZYU1lTX2ZwcmludGYgeCA7fQotIyAgZGVmaW5lIFRyYWNlY3YoYyx4KSB7aWYgKHpfdmVyYm9zZT4xICYmIChjKSkgRlhTWVNfZnByaW50ZiB4IDt9Ci0jZWxzZQotIyAgZGVmaW5lIEFzc2VydChjb25kLG1zZykKLSMgIGRlZmluZSBUcmFjZSh4KQotIyAgZGVmaW5lIFRyYWNldih4KQotIyAgZGVmaW5lIFRyYWNldnYoeCkKLSMgIGRlZmluZSBUcmFjZWMoYyx4KQotIyAgZGVmaW5lIFRyYWNlY3YoYyx4KQotI2VuZGlmCi0KLSNpZm5kZWYgWl9TT0xPCi0gICB2b2lkcGYgWkxJQl9JTlRFUk5BTCB6Y2FsbG9jIE9GKCh2b2lkcGYgb3BhcXVlLCB1bnNpZ25lZCBpdGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNpemUpKTsKLSAgIHZvaWQgWkxJQl9JTlRFUk5BTCB6Y2ZyZWUgIE9GKCh2b2lkcGYgb3BhcXVlLCB2b2lkcGYgcHRyKSk7Ci0jZW5kaWYKLQotI2RlZmluZSBaQUxMT0Moc3RybSwgaXRlbXMsIHNpemUpIFwKLSAgICAgICAgICAgKCooKHN0cm0pLT56YWxsb2MpKSgoc3RybSktPm9wYXF1ZSwgKGl0ZW1zKSwgKHNpemUpKQotI2RlZmluZSBaRlJFRShzdHJtLCBhZGRyKSAgKCooKHN0cm0pLT56ZnJlZSkpKChzdHJtKS0+b3BhcXVlLCAodm9pZHBmKShhZGRyKSkKLSNkZWZpbmUgVFJZX0ZSRUUocywgcCkge2lmIChwKSBaRlJFRShzLCBwKTt9Ci0KLS8qIFJldmVyc2UgdGhlIGJ5dGVzIGluIGEgMzItYml0IHZhbHVlICovCi0jZGVmaW5lIFpTV0FQMzIocSkgKCgoKHEpID4+IDI0KSAmIDB4ZmYpICsgKCgocSkgPj4gOCkgJiAweGZmMDApICsgXAotICAgICAgICAgICAgICAgICAgICAoKChxKSAmIDB4ZmYwMCkgPDwgOCkgKyAoKChxKSAmIDB4ZmYpIDw8IDI0KSkKLQotI2VuZGlmIC8qIFpVVElMX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL2RybWVtb3J5L0RyTWVtb3J5LVdpbmRvd3Mtc2Z4LmV4ZSBiL3Rvb2xzL2RybWVtb3J5L0RyTWVtb3J5LVdpbmRvd3Mtc2Z4LmV4ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QzOTkyYi4uMDAwMDAwMAotLS0gYS90b29scy9kcm1lbW9yeS9Eck1lbW9yeS1XaW5kb3dzLXNmeC5leGUKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZmEvREVQUyBiL3hmYS9ERVBTCmluZGV4IDRhYWQ3ZWYuLjJkZDRlZjMgMTAwNjQ0Ci0tLSBhL3hmYS9ERVBTCisrKyBiL3hmYS9ERVBTCkBAIC0xLDYgKzEsNSBAQAogaW5jbHVkZV9ydWxlcyA9IFsKLSAgJytjb3JlL2ZwZGZhcGkvcGFyc2VyJywKLSAgJytjb3JlL2Z4Y3J0JywKLSAgJytjb3JlL2Z4Z2UnLAorICAnK2NvcmUnLAorICAnK2Z4YmFyY29kZScsCiAgICcrdGhpcmRfcGFydHkvYmlnaW50JwogXQpkaWZmIC0tZ2l0IGEveGZhL1JFQURNRS5tZCBiL3hmYS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc0NjBhNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9SRUFETUUubWQKQEAgLTAsMCArMSw0IEBACitYRkEgc3RhbmRzIGZvciBYTUwgRm9ybXMgQXJjaGl0ZWN0dXJlLgorCitodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9YRkEKKwpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9jZmRlX2RhdGEuaCBiL3hmYS9mZGUvY2ZkZV9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRjYTYzZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9mZGUvY2ZkZV9kYXRhLmgKQEAgLTAsMCArMSw0NiBAQAorLy8gQ29weXJpZ2h0IDIwMTggUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GREVfQ0ZERV9EQVRBX0hfCisjZGVmaW5lIFhGQV9GREVfQ0ZERV9EQVRBX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisKK2VudW0gY2xhc3MgRkRFX1RleHRBbGlnbm1lbnQgOiB1aW50OF90IHsKKyAga1RvcExlZnQgPSAwLAorICBrQ2VudGVyTGVmdCwKKyAga0NlbnRlciwKKyAga0NlbnRlclJpZ2h0Cit9OworCitzdHJ1Y3QgRkRFX1RleHRTdHlsZSB7CisgIEZERV9UZXh0U3R5bGUoKQorICAgICAgOiBzaW5nbGVfbGluZV8oZmFsc2UpLCBsaW5lX3dyYXBfKGZhbHNlKSwgbGFzdF9saW5lX2hlaWdodF8oZmFsc2UpIHt9CisgIH5GREVfVGV4dFN0eWxlKCkge30KKworICB2b2lkIFJlc2V0KCkgeworICAgIHNpbmdsZV9saW5lXyA9IGZhbHNlOworICAgIGxpbmVfd3JhcF8gPSBmYWxzZTsKKyAgICBsYXN0X2xpbmVfaGVpZ2h0XyA9IGZhbHNlOworICB9CisKKyAgYm9vbCBzaW5nbGVfbGluZV87CisgIGJvb2wgbGluZV93cmFwXzsKKyAgYm9vbCBsYXN0X2xpbmVfaGVpZ2h0XzsKK307CisKK3N0cnVjdCBGREVfVFRPUElFQ0UgeworICBGREVfVFRPUElFQ0UoKTsKKyAgRkRFX1RUT1BJRUNFKGNvbnN0IEZERV9UVE9QSUVDRSYgdGhhdCk7CisgIH5GREVfVFRPUElFQ0UoKTsKKworICBpbnQzMl90IGlTdGFydENoYXI7CisgIGludDMyX3QgaUNoYXJzOworICB1aW50MzJfdCBkd0NoYXJTdHlsZXM7CisgIENGWF9SZWN0RiBydFBpZWNlOworfTsKKworI2VuZGlmICAvLyBYRkFfRkRFX0NGREVfREFUQV9IXwpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9jZmRlX3BhdGguY3BwIGIveGZhL2ZkZS9jZmRlX3BhdGguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTZjZjVjLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY2ZkZV9wYXRoLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZmRlL2NmZGVfcGF0aC5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgotI2luY2x1ZGUgInhmYS9mZGUvZmRlX29iamVjdC5oIgotCi12b2lkIENGREVfUGF0aDo6Q2xvc2VGaWd1cmUoKSB7Ci0gIG1fUGF0aC5DbG9zZVBhdGgoKTsKLX0KLQotYm9vbCBDRkRFX1BhdGg6OkZpZ3VyZUNsb3NlZCgpIGNvbnN0IHsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8RlhfUEFUSFBPSU5UPiYgcG9pbnRzID0gbV9QYXRoLkdldFBvaW50cygpOwotICByZXR1cm4gcG9pbnRzLmVtcHR5KCkgPyB0cnVlIDogcG9pbnRzLmJhY2soKS5tX0Nsb3NlRmlndXJlOwotfQotCi12b2lkIENGREVfUGF0aDo6TW92ZVRvKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIG1fUGF0aC5BcHBlbmRQb2ludChwb2ludCwgRlhQVF9UWVBFOjpNb3ZlVG8sIGZhbHNlKTsKLX0KLQotdm9pZCBDRkRFX1BhdGg6OkxpbmVUbyhjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewotICBtX1BhdGguQXBwZW5kUG9pbnQocG9pbnQsIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7Ci19Ci0KLXZvaWQgQ0ZERV9QYXRoOjpCZXppZXJUbyhjb25zdCBDRlhfUG9pbnRGJiBwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwMykgewotICBtX1BhdGguQXBwZW5kUG9pbnQocDEsIEZYUFRfVFlQRTo6QmV6aWVyVG8sIGZhbHNlKTsKLSAgbV9QYXRoLkFwcGVuZFBvaW50KHAyLCBGWFBUX1RZUEU6OkJlemllclRvLCBmYWxzZSk7Ci0gIG1fUGF0aC5BcHBlbmRQb2ludChwMywgRlhQVF9UWVBFOjpCZXppZXJUbywgZmFsc2UpOwotfQotCi12b2lkIENGREVfUGF0aDo6QXJjVG8oYm9vbCBiU3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsCi0gICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZW5kQW5nbGUpIHsKLSAgRlhfRkxPQVQgcnggPSByZWN0LndpZHRoIC8gMjsKLSAgRlhfRkxPQVQgcnkgPSByZWN0LmhlaWdodCAvIDI7Ci0gIEZYX0ZMT0FUIGN4ID0gcmVjdC5sZWZ0ICsgcng7Ci0gIEZYX0ZMT0FUIGN5ID0gcmVjdC50b3AgKyByeTsKLSAgRlhfRkxPQVQgYWxwaGEgPQotICAgICAgRlhTWVNfYXRhbjIocnggKiBGWFNZU19zaW4oc3RhcnRBbmdsZSksIHJ5ICogRlhTWVNfY29zKHN0YXJ0QW5nbGUpKTsKLSAgRlhfRkxPQVQgYmV0YSA9Ci0gICAgICBGWFNZU19hdGFuMihyeCAqIEZYU1lTX3NpbihlbmRBbmdsZSksIHJ5ICogRlhTWVNfY29zKGVuZEFuZ2xlKSk7Ci0gIGlmIChGWFNZU19mYWJzKGJldGEgLSBhbHBoYSkgPiBGWF9QSSkgewotICAgIGlmIChiZXRhID4gYWxwaGEpCi0gICAgICBiZXRhIC09IDIgKiBGWF9QSTsKLSAgICBlbHNlCi0gICAgICBhbHBoYSAtPSAyICogRlhfUEk7Ci0gIH0KLQotICBGWF9GTE9BVCBoYWxmX2RlbHRhID0gKGJldGEgLSBhbHBoYSkgLyAyOwotICBGWF9GTE9BVCBiY3AgPSA0LjBmIC8gMyAqICgxIC0gRlhTWVNfY29zKGhhbGZfZGVsdGEpKSAvIEZYU1lTX3NpbihoYWxmX2RlbHRhKTsKLSAgRlhfRkxPQVQgc2luX2FscGhhID0gRlhTWVNfc2luKGFscGhhKTsKLSAgRlhfRkxPQVQgc2luX2JldGEgPSBGWFNZU19zaW4oYmV0YSk7Ci0gIEZYX0ZMT0FUIGNvc19hbHBoYSA9IEZYU1lTX2NvcyhhbHBoYSk7Ci0gIEZYX0ZMT0FUIGNvc19iZXRhID0gRlhTWVNfY29zKGJldGEpOwotICBpZiAoYlN0YXJ0KQotICAgIE1vdmVUbyhDRlhfUG9pbnRGKGN4ICsgcnggKiBjb3NfYWxwaGEsIGN5ICsgcnkgKiBzaW5fYWxwaGEpKTsKLQotICBCZXppZXJUbyhDRlhfUG9pbnRGKGN4ICsgcnggKiAoY29zX2FscGhhIC0gYmNwICogc2luX2FscGhhKSwKLSAgICAgICAgICAgICAgICAgICAgICBjeSArIHJ5ICogKHNpbl9hbHBoYSArIGJjcCAqIGNvc19hbHBoYSkpLAotICAgICAgICAgICBDRlhfUG9pbnRGKGN4ICsgcnggKiAoY29zX2JldGEgKyBiY3AgKiBzaW5fYmV0YSksCi0gICAgICAgICAgICAgICAgICAgICAgY3kgKyByeSAqIChzaW5fYmV0YSAtIGJjcCAqIGNvc19iZXRhKSksCi0gICAgICAgICAgIENGWF9Qb2ludEYoY3ggKyByeCAqIGNvc19iZXRhLCBjeSArIHJ5ICogc2luX2JldGEpKTsKLX0KLQotdm9pZCBDRkRFX1BhdGg6OkFkZEJlemllcihjb25zdCBzdGQ6OnZlY3RvcjxDRlhfUG9pbnRGPiYgcG9pbnRzKSB7Ci0gIGlmIChwb2ludHMuc2l6ZSgpICE9IDQpCi0gICAgcmV0dXJuOwotCi0gIE1vdmVUbyhwb2ludHNbMF0pOwotICBCZXppZXJUbyhwb2ludHNbMV0sIHBvaW50c1syXSwgcG9pbnRzWzNdKTsKLX0KLQotdm9pZCBDRkRFX1BhdGg6OkFkZEJlemllcnMoY29uc3Qgc3RkOjp2ZWN0b3I8Q0ZYX1BvaW50Rj4mIHBvaW50cykgewotICBpbnQzMl90IGlDb3VudCA9IHBvaW50cy5zaXplKCk7Ci0gIGlmIChpQ291bnQgPCA0KQotICAgIHJldHVybjsKLQotICBjb25zdCBDRlhfUG9pbnRGKiBwID0gcG9pbnRzLmRhdGEoKTsKLSAgY29uc3QgQ0ZYX1BvaW50RiogcEVuZCA9IHAgKyBpQ291bnQ7Ci0gIE1vdmVUbyhwWzBdKTsKLSAgZm9yICgrK3A7IHAgPD0gcEVuZCAtIDM7IHAgKz0gMykKLSAgICBCZXppZXJUbyhwWzBdLCBwWzFdLCBwWzJdKTsKLX0KLQotdm9pZCBDRkRFX1BhdGg6OkdldEN1cnZlVGFuZ2VudHMoY29uc3Qgc3RkOjp2ZWN0b3I8Q0ZYX1BvaW50Rj4mIHBvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENGWF9Qb2ludEY+KiB0YW5nZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNsb3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZUZW5zaW9uKSBjb25zdCB7Ci0gIGludDMyX3QgaUNvdW50ID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90Pihwb2ludHMpOwotICB0YW5nZW50cy0+cmVzaXplKGlDb3VudCk7Ci0gIGlmIChpQ291bnQgPCAzKQotICAgIHJldHVybjsKLQotICBGWF9GTE9BVCBmQ29lZmZpY2llbnQgPSBmVGVuc2lvbiAvIDMuMGY7Ci0gIGNvbnN0IENGWF9Qb2ludEYqIHBQb2ludHMgPSBwb2ludHMuZGF0YSgpOwotICBDRlhfUG9pbnRGKiBwVGFuZ2VudHMgPSB0YW5nZW50cy0+ZGF0YSgpOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7ICsraSkgewotICAgIGludDMyX3QgciA9IGkgKyAxOwotICAgIGludDMyX3QgcyA9IGkgLSAxOwotICAgIGlmIChyID49IGlDb3VudCkKLSAgICAgIHIgPSBiQ2xvc2VkID8gKHIgLSBpQ291bnQpIDogKGlDb3VudCAtIDEpOwotICAgIGlmIChzIDwgMCkKLSAgICAgIHMgPSBiQ2xvc2VkID8gKHMgKyBpQ291bnQpIDogMDsKLQotICAgIHBUYW5nZW50c1tpXS54ICs9IChmQ29lZmZpY2llbnQgKiAocFBvaW50c1tyXS54IC0gcFBvaW50c1tzXS54KSk7Ci0gICAgcFRhbmdlbnRzW2ldLnkgKz0gKGZDb2VmZmljaWVudCAqIChwUG9pbnRzW3JdLnkgLSBwUG9pbnRzW3NdLnkpKTsKLSAgfQotfQotCi12b2lkIENGREVfUGF0aDo6QWRkQ3VydmUoY29uc3Qgc3RkOjp2ZWN0b3I8Q0ZYX1BvaW50Rj4mIHBvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJDbG9zZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRlbnNpb24pIHsKLSAgaW50MzJfdCBpTGFzdCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4ocG9pbnRzKSAtIDE7Ci0gIGlmIChpTGFzdCA8IDEpCi0gICAgcmV0dXJuOwotCi0gIHN0ZDo6dmVjdG9yPENGWF9Qb2ludEY+IHRhbmdlbnRzOwotICBHZXRDdXJ2ZVRhbmdlbnRzKHBvaW50cywgJnRhbmdlbnRzLCBiQ2xvc2VkLCBmVGVuc2lvbik7Ci0gIGNvbnN0IENGWF9Qb2ludEYqIHBQb2ludHMgPSBwb2ludHMuZGF0YSgpOwotICBDRlhfUG9pbnRGKiBwVGFuZ2VudHMgPSB0YW5nZW50cy5kYXRhKCk7Ci0gIE1vdmVUbyhwUG9pbnRzWzBdKTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxhc3Q7ICsraSkgewotICAgIEJlemllclRvKENGWF9Qb2ludEYocFBvaW50c1tpXS54ICsgcFRhbmdlbnRzW2ldLngsCi0gICAgICAgICAgICAgICAgICAgICAgICBwUG9pbnRzW2ldLnkgKyBwVGFuZ2VudHNbaV0ueSksCi0gICAgICAgICAgICAgQ0ZYX1BvaW50RihwUG9pbnRzW2kgKyAxXS54IC0gcFRhbmdlbnRzW2kgKyAxXS54LAotICAgICAgICAgICAgICAgICAgICAgICAgcFBvaW50c1tpICsgMV0ueSAtIHBUYW5nZW50c1tpICsgMV0ueSksCi0gICAgICAgICAgICAgQ0ZYX1BvaW50RihwUG9pbnRzW2kgKyAxXS54LCBwUG9pbnRzW2kgKyAxXS55KSk7Ci0gIH0KLSAgaWYgKGJDbG9zZWQpIHsKLSAgICBCZXppZXJUbyhDRlhfUG9pbnRGKHBQb2ludHNbaUxhc3RdLnggKyBwVGFuZ2VudHNbaUxhc3RdLngsCi0gICAgICAgICAgICAgICAgICAgICAgICBwUG9pbnRzW2lMYXN0XS55ICsgcFRhbmdlbnRzW2lMYXN0XS55KSwKLSAgICAgICAgICAgICBDRlhfUG9pbnRGKHBQb2ludHNbMF0ueCAtIHBUYW5nZW50c1swXS54LAotICAgICAgICAgICAgICAgICAgICAgICAgcFBvaW50c1swXS55IC0gcFRhbmdlbnRzWzBdLnkpLAotICAgICAgICAgICAgIENGWF9Qb2ludEYocFBvaW50c1swXS54LCBwUG9pbnRzWzBdLnkpKTsKLSAgICBDbG9zZUZpZ3VyZSgpOwotICB9Ci19Ci0KLXZvaWQgQ0ZERV9QYXRoOjpBZGRFbGxpcHNlKGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgewotICBGWF9GTE9BVCBmU3RhcnRBbmdsZSA9IDA7Ci0gIEZYX0ZMT0FUIGZFbmRBbmdsZSA9IEZYX1BJIC8gMjsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7Ci0gICAgQXJjVG8oaSA9PSAwLCByZWN0LCBmU3RhcnRBbmdsZSwgZkVuZEFuZ2xlKTsKLSAgICBmU3RhcnRBbmdsZSArPSBGWF9QSSAvIDI7Ci0gICAgZkVuZEFuZ2xlICs9IEZYX1BJIC8gMjsKLSAgfQotICBDbG9zZUZpZ3VyZSgpOwotfQotCi12b2lkIENGREVfUGF0aDo6QWRkTGluZShjb25zdCBDRlhfUG9pbnRGJiBwdDEsIGNvbnN0IENGWF9Qb2ludEYmIHB0MikgewotICBzdGQ6OnZlY3RvcjxGWF9QQVRIUE9JTlQ+JiBwb2ludHMgPSBtX1BhdGguR2V0UG9pbnRzKCk7Ci0gIGlmIChwb2ludHMuZW1wdHkoKSB8fCBGWFNZU19mYWJzKHBvaW50cy5iYWNrKCkubV9Qb2ludC54IC0gcHQxLngpID4gMC4wMDEgfHwKLSAgICAgIEZYU1lTX2ZhYnMocG9pbnRzLmJhY2soKS5tX1BvaW50LnkgLSBwdDEueSkgPiAwLjAwMSkgewotICAgIE1vdmVUbyhwdDEpOwotICB9Ci0gIExpbmVUbyhwdDIpOwotfQotCi12b2lkIENGREVfUGF0aDo6QWRkUGF0aChjb25zdCBDRkRFX1BhdGgqIHBTcmMsIGJvb2wgYkNvbm5lY3QpIHsKLSAgaWYgKCFwU3JjKQotICAgIHJldHVybjsKLQotICBpZiAocFNyYy0+bV9QYXRoLkdldFBvaW50cygpLmVtcHR5KCkpCi0gICAgcmV0dXJuOwotICBpZiAoYkNvbm5lY3QpCi0gICAgTGluZVRvKHBTcmMtPm1fUGF0aC5HZXRQb2ludCgwKSk7Ci0KLSAgbV9QYXRoLkFwcGVuZCgmcFNyYy0+bV9QYXRoLCBudWxscHRyKTsKLX0KLQotdm9pZCBDRkRFX1BhdGg6OkFkZFBvbHlnb24oY29uc3Qgc3RkOjp2ZWN0b3I8Q0ZYX1BvaW50Rj4mIHBvaW50cykgewotICBzaXplX3QgaUNvdW50ID0gcG9pbnRzLnNpemUoKTsKLSAgaWYgKGlDb3VudCA8IDIpCi0gICAgcmV0dXJuOwotCi0gIEFkZExpbmVzKHBvaW50cyk7Ci0gIGNvbnN0IENGWF9Qb2ludEYqIHAgPSBwb2ludHMuZGF0YSgpOwotICBpZiAoRlhTWVNfZmFicyhwWzBdLnggLSBwW2lDb3VudCAtIDFdLngpIDwgMC4wMWYgfHwKLSAgICAgIEZYU1lTX2ZhYnMocFswXS55IC0gcFtpQ291bnQgLSAxXS55KSA8IDAuMDFmKSB7Ci0gICAgTGluZVRvKHBbMF0pOwotICB9Ci0gIENsb3NlRmlndXJlKCk7Ci19Ci0KLXZvaWQgQ0ZERV9QYXRoOjpBZGRMaW5lcyhjb25zdCBzdGQ6OnZlY3RvcjxDRlhfUG9pbnRGPiYgcG9pbnRzKSB7Ci0gIHNpemVfdCBpQ291bnQgPSBwb2ludHMuc2l6ZSgpOwotICBpZiAoaUNvdW50IDwgMikKLSAgICByZXR1cm47Ci0KLSAgY29uc3QgQ0ZYX1BvaW50RiogcCA9IHBvaW50cy5kYXRhKCk7Ci0gIGNvbnN0IENGWF9Qb2ludEYqIHBFbmQgPSBwICsgaUNvdW50OwotICBNb3ZlVG8ocFswXSk7Ci0gIGZvciAoKytwOyBwIDwgcEVuZDsgKytwKQotICAgIExpbmVUbygqcCk7Ci19Ci0KLXZvaWQgQ0ZERV9QYXRoOjpBZGRSZWN0YW5nbGUoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7Ci0gIE1vdmVUbyhyZWN0LlRvcExlZnQoKSk7Ci0gIExpbmVUbyhyZWN0LlRvcFJpZ2h0KCkpOwotICBMaW5lVG8ocmVjdC5Cb3R0b21SaWdodCgpKTsKLSAgTGluZVRvKHJlY3QuQm90dG9tTGVmdCgpKTsKLSAgQ2xvc2VGaWd1cmUoKTsKLX0KLQotQ0ZYX1JlY3RGIENGREVfUGF0aDo6R2V0QkJveCgpIGNvbnN0IHsKLSAgQ0ZYX0Zsb2F0UmVjdCByZWN0ID0gbV9QYXRoLkdldEJvdW5kaW5nQm94KCk7Ci0gIENGWF9SZWN0RiBiYm94ID0gQ0ZYX1JlY3RGKHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSk7Ci0gIGJib3guTm9ybWFsaXplKCk7Ci0gIHJldHVybiBiYm94OwotfQotCi1DRlhfUmVjdEYgQ0ZERV9QYXRoOjpHZXRCQm94KEZYX0ZMT0FUIGZMaW5lV2lkdGgsIEZYX0ZMT0FUIGZNaXRlckxpbWl0KSBjb25zdCB7Ci0gIENGWF9GbG9hdFJlY3QgcmVjdCA9IG1fUGF0aC5HZXRCb3VuZGluZ0JveChmTGluZVdpZHRoLCBmTWl0ZXJMaW1pdCk7Ci0gIENGWF9SZWN0RiBiYm94ID0gQ0ZYX1JlY3RGKHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QuV2lkdGgoKSwgcmVjdC5IZWlnaHQoKSk7Ci0gIGJib3guTm9ybWFsaXplKCk7Ci0gIHJldHVybiBiYm94OwotfQpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9jZmRlX3BhdGguaCBiL3hmYS9mZGUvY2ZkZV9wYXRoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZmY0ZDMuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jZmRlX3BhdGguaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRkRFX0NGREVfUEFUSF9IXwotI2RlZmluZSBYRkFfRkRFX0NGREVfUEFUSF9IXwotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmgiCi0KLWNsYXNzIENGREVfUGF0aCB7Ci0gcHVibGljOgotICB2b2lkIENsb3NlRmlndXJlKCk7Ci0KLSAgdm9pZCBBZGRCZXppZXIoY29uc3Qgc3RkOjp2ZWN0b3I8Q0ZYX1BvaW50Rj4mIHBvaW50cyk7Ci0gIHZvaWQgQWRkQmV6aWVycyhjb25zdCBzdGQ6OnZlY3RvcjxDRlhfUG9pbnRGPiYgcG9pbnRzKTsKLSAgdm9pZCBBZGRDdXJ2ZShjb25zdCBzdGQ6OnZlY3RvcjxDRlhfUG9pbnRGPiYgcG9pbnRzLAotICAgICAgICAgICAgICAgIGJvb2wgYkNsb3NlZCwKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVGVuc2lvbiA9IDAuNWYpOwotICB2b2lkIEFkZEVsbGlwc2UoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KTsKLSAgdm9pZCBBZGRMaW5lcyhjb25zdCBzdGQ6OnZlY3RvcjxDRlhfUG9pbnRGPiYgcG9pbnRzKTsKLSAgdm9pZCBBZGRMaW5lKGNvbnN0IENGWF9Qb2ludEYmIHB0MSwgY29uc3QgQ0ZYX1BvaW50RiYgcHQyKTsKLSAgdm9pZCBBZGRQYXRoKGNvbnN0IENGREVfUGF0aCogcFNyYywgYm9vbCBiQ29ubmVjdCk7Ci0gIHZvaWQgQWRkUG9seWdvbihjb25zdCBzdGQ6OnZlY3RvcjxDRlhfUG9pbnRGPiYgcG9pbnRzKTsKLSAgdm9pZCBBZGRSZWN0YW5nbGUoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KTsKLQotICBDRlhfUmVjdEYgR2V0QkJveCgpIGNvbnN0OwotICBDRlhfUmVjdEYgR2V0QkJveChGWF9GTE9BVCBmTGluZVdpZHRoLCBGWF9GTE9BVCBmTWl0ZXJMaW1pdCkgY29uc3Q7Ci0KLSAgYm9vbCBGaWd1cmVDbG9zZWQoKSBjb25zdDsKLSAgdm9pZCBCZXppZXJUbyhjb25zdCBDRlhfUG9pbnRGJiBwMSwKLSAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwMiwKLSAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwMyk7Ci0gIHZvaWQgQXJjVG8oYm9vbCBiU3RhcnQsCi0gICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LAotICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0QW5nbGUsCi0gICAgICAgICAgICAgRlhfRkxPQVQgZW5kQW5nbGUpOwotICB2b2lkIE1vdmVUbyhjb25zdCBDRlhfUG9pbnRGJiBwKTsKLSAgdm9pZCBMaW5lVG8oY29uc3QgQ0ZYX1BvaW50RiYgcCk7Ci0KLSAgdm9pZCBHZXRDdXJ2ZVRhbmdlbnRzKGNvbnN0IHN0ZDo6dmVjdG9yPENGWF9Qb2ludEY+JiBwb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDRlhfUG9pbnRGPiogdGFuZ2VudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGJDbG9zZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVGVuc2lvbikgY29uc3Q7Ci0gIENGWF9QYXRoRGF0YSBtX1BhdGg7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GREVfQ0ZERV9QQVRIX0hfCmRpZmYgLS1naXQgYS94ZmEvZmRlL2NmZGVfdGV4dGVkaXRlbmdpbmUuY3BwIGIveGZhL2ZkZS9jZmRlX3RleHRlZGl0ZW5naW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDg1YThkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2ZkZS9jZmRlX3RleHRlZGl0ZW5naW5lLmNwcApAQCAtMCwwICsxLDEyMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9mZGUvY2ZkZV90ZXh0ZWRpdGVuZ2luZS5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgInhmYS9mZGUvY2ZkZV90ZXh0b3V0LmgiCisjaW5jbHVkZSAieGZhL2ZkZS9jZmRlX3dvcmRicmVha19kYXRhLmgiCisjaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9jZmdhc19nZWZvbnQuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIHNpemVfdCBrTWF4RWRpdE9wZXJhdGlvbnMgPSAxMjg7Citjb25zdGV4cHIgc2l6ZV90IGtHYXBTaXplID0gMTI4OworY29uc3RleHByIHNpemVfdCBrUGFnZVdpZHRoTWF4ID0gMHhmZmZmOworCitjbGFzcyBJbnNlcnRPcGVyYXRpb24gOiBwdWJsaWMgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6T3BlcmF0aW9uIHsKKyBwdWJsaWM6CisgIEluc2VydE9wZXJhdGlvbihDRkRFX1RleHRFZGl0RW5naW5lKiBlbmdpbmUsCisgICAgICAgICAgICAgICAgICBzaXplX3Qgc3RhcnRfaWR4LAorICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgYWRkZWRfdGV4dCkKKyAgICAgIDogZW5naW5lXyhlbmdpbmUpLCBzdGFydF9pZHhfKHN0YXJ0X2lkeCksIGFkZGVkX3RleHRfKGFkZGVkX3RleHQpIHt9CisKKyAgfkluc2VydE9wZXJhdGlvbigpIG92ZXJyaWRlIHt9CisKKyAgdm9pZCBSZWRvKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGVuZ2luZV8tPkluc2VydChzdGFydF9pZHhfLCBhZGRlZF90ZXh0XywKKyAgICAgICAgICAgICAgICAgICAgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6UmVjb3JkT3BlcmF0aW9uOjprU2tpcFJlY29yZCk7CisgIH0KKworICB2b2lkIFVuZG8oKSBjb25zdCBvdmVycmlkZSB7CisgICAgZW5naW5lXy0+RGVsZXRlKHN0YXJ0X2lkeF8sIGFkZGVkX3RleHRfLkdldExlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICBDRkRFX1RleHRFZGl0RW5naW5lOjpSZWNvcmRPcGVyYXRpb246OmtTa2lwUmVjb3JkKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgVW5vd25lZFB0cjxDRkRFX1RleHRFZGl0RW5naW5lPiBlbmdpbmVfOworICBzaXplX3Qgc3RhcnRfaWR4XzsKKyAgV2lkZVN0cmluZyBhZGRlZF90ZXh0XzsKK307CisKK2NsYXNzIERlbGV0ZU9wZXJhdGlvbiA6IHB1YmxpYyBDRkRFX1RleHRFZGl0RW5naW5lOjpPcGVyYXRpb24geworIHB1YmxpYzoKKyAgRGVsZXRlT3BlcmF0aW9uKENGREVfVGV4dEVkaXRFbmdpbmUqIGVuZ2luZSwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCBzdGFydF9pZHgsCisgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiByZW1vdmVkX3RleHQpCisgICAgICA6IGVuZ2luZV8oZW5naW5lKSwgc3RhcnRfaWR4XyhzdGFydF9pZHgpLCByZW1vdmVkX3RleHRfKHJlbW92ZWRfdGV4dCkge30KKworICB+RGVsZXRlT3BlcmF0aW9uKCkgb3ZlcnJpZGUge30KKworICB2b2lkIFJlZG8oKSBjb25zdCBvdmVycmlkZSB7CisgICAgZW5naW5lXy0+RGVsZXRlKHN0YXJ0X2lkeF8sIHJlbW92ZWRfdGV4dF8uR2V0TGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICAgIENGREVfVGV4dEVkaXRFbmdpbmU6OlJlY29yZE9wZXJhdGlvbjo6a1NraXBSZWNvcmQpOworICB9CisKKyAgdm9pZCBVbmRvKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGVuZ2luZV8tPkluc2VydChzdGFydF9pZHhfLCByZW1vdmVkX3RleHRfLAorICAgICAgICAgICAgICAgICAgICBDRkRFX1RleHRFZGl0RW5naW5lOjpSZWNvcmRPcGVyYXRpb246OmtTa2lwUmVjb3JkKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgVW5vd25lZFB0cjxDRkRFX1RleHRFZGl0RW5naW5lPiBlbmdpbmVfOworICBzaXplX3Qgc3RhcnRfaWR4XzsKKyAgV2lkZVN0cmluZyByZW1vdmVkX3RleHRfOworfTsKKworY2xhc3MgUmVwbGFjZU9wZXJhdGlvbiA6IHB1YmxpYyBDRkRFX1RleHRFZGl0RW5naW5lOjpPcGVyYXRpb24geworIHB1YmxpYzoKKyAgUmVwbGFjZU9wZXJhdGlvbihDRkRFX1RleHRFZGl0RW5naW5lKiBlbmdpbmUsCisgICAgICAgICAgICAgICAgICAgc2l6ZV90IHN0YXJ0X2lkeCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiByZW1vdmVkX3RleHQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgYWRkZWRfdGV4dCkKKyAgICAgIDogaW5zZXJ0X29wXyhlbmdpbmUsIHN0YXJ0X2lkeCwgYWRkZWRfdGV4dCksCisgICAgICAgIGRlbGV0ZV9vcF8oZW5naW5lLCBzdGFydF9pZHgsIHJlbW92ZWRfdGV4dCkge30KKworICB+UmVwbGFjZU9wZXJhdGlvbigpIG92ZXJyaWRlIHt9CisKKyAgdm9pZCBSZWRvKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGRlbGV0ZV9vcF8uUmVkbygpOworICAgIGluc2VydF9vcF8uUmVkbygpOworICB9CisKKyAgdm9pZCBVbmRvKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGluc2VydF9vcF8uVW5kbygpOworICAgIGRlbGV0ZV9vcF8uVW5kbygpOworICB9CisKKyBwcml2YXRlOgorICBJbnNlcnRPcGVyYXRpb24gaW5zZXJ0X29wXzsKKyAgRGVsZXRlT3BlcmF0aW9uIGRlbGV0ZV9vcF87Cit9OworCitib29sIENoZWNrU3RhdGVDaGFuZ2VGb3JXb3JkQnJlYWsoV29yZEJyZWFrUHJvcGVydHkgZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkQnJlYWtQcm9wZXJ0eSB0bykgeworICBBU1NFUlQoc3RhdGljX2Nhc3Q8aW50Pihmcm9tKSA8IDEzKTsKKworICByZXR1cm4gISEoZ3NfRlhfV29yZEJyZWFrX1RhYmxlW3N0YXRpY19jYXN0PGludD4oZnJvbSldICYKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQxNl90PigxIDw8IHN0YXRpY19jYXN0PGludD4odG8pKSk7Cit9CisKK1dvcmRCcmVha1Byb3BlcnR5IEdldFdvcmRCcmVha1Byb3BlcnR5KHdjaGFyX3Qgd2NDb2RlUG9pbnQpIHsKKyAgdWludDhfdCBkd1Byb3BlcnR5ID0gZ3NfRlhfV29yZEJyZWFrX0NvZGVQb2ludFByb3BlcnRpZXNbd2NDb2RlUG9pbnQgPj4gMV07CisgIHJldHVybiBzdGF0aWNfY2FzdDxXb3JkQnJlYWtQcm9wZXJ0eT4oKHdjQ29kZVBvaW50ICYgMSkgPyAoZHdQcm9wZXJ0eSAmIDB4MEYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZHdQcm9wZXJ0eSA+PiA0KSk7Cit9CisKK2ludCBHZXRCcmVha0ZsYWdzRm9yKFdvcmRCcmVha1Byb3BlcnR5IGN1cnJlbnQsIFdvcmRCcmVha1Byb3BlcnR5IG5leHQpIHsKKyAgaWYgKGN1cnJlbnQgPT0gV29yZEJyZWFrUHJvcGVydHk6OmtNaWRMZXR0ZXIpIHsKKyAgICBpZiAobmV4dCA9PSBXb3JkQnJlYWtQcm9wZXJ0eTo6a0FMZXR0ZXIpCisgICAgICByZXR1cm4gMTsKKyAgfSBlbHNlIGlmIChjdXJyZW50ID09IFdvcmRCcmVha1Byb3BlcnR5OjprTWlkTnVtKSB7CisgICAgaWYgKG5leHQgPT0gV29yZEJyZWFrUHJvcGVydHk6OmtOdW1lcmljKQorICAgICAgcmV0dXJuIDI7CisgIH0gZWxzZSBpZiAoY3VycmVudCA9PSBXb3JkQnJlYWtQcm9wZXJ0eTo6a01pZE51bUxldCkgeworICAgIGlmIChuZXh0ID09IFdvcmRCcmVha1Byb3BlcnR5OjprQUxldHRlcikKKyAgICAgIHJldHVybiAxOworICAgIGlmIChuZXh0ID09IFdvcmRCcmVha1Byb3BlcnR5OjprTnVtZXJpYykKKyAgICAgIHJldHVybiAyOworICB9CisgIHJldHVybiAwOworfQorCitib29sIEJyZWFrRmxhZ3NDaGFuZ2VkKGludCBmbGFncywgV29yZEJyZWFrUHJvcGVydHkgcHJldmlvdXMpIHsKKyAgcmV0dXJuIChmbGFncyAhPSAxIHx8IHByZXZpb3VzICE9IFdvcmRCcmVha1Byb3BlcnR5OjprQUxldHRlcikgJiYKKyAgICAgICAgIChmbGFncyAhPSAyIHx8IHByZXZpb3VzICE9IFdvcmRCcmVha1Byb3BlcnR5OjprTnVtZXJpYyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitDRkRFX1RleHRFZGl0RW5naW5lOjpDRkRFX1RleHRFZGl0RW5naW5lKCkKKyAgICA6IGZvbnRfY29sb3JfKDB4ZmYwMDAwMDApLAorICAgICAgZm9udF9zaXplXygxMC4wZiksCisgICAgICBsaW5lX3NwYWNpbmdfKDEwLjBmKSwKKyAgICAgIHRleHRfbGVuZ3RoXygwKSwKKyAgICAgIGdhcF9wb3NpdGlvbl8oMCksCisgICAgICBnYXBfc2l6ZV8oa0dhcFNpemUpLAorICAgICAgYXZhaWxhYmxlX3dpZHRoXyhrUGFnZVdpZHRoTWF4KSwKKyAgICAgIGNoYXJhY3Rlcl9saW1pdF8oc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSksCisgICAgICB2aXNpYmxlX2xpbmVfY291bnRfKDEpLAorICAgICAgbmV4dF9vcGVyYXRpb25faW5kZXhfdG9fdW5kb18oa01heEVkaXRPcGVyYXRpb25zIC0gMSksCisgICAgICBuZXh0X29wZXJhdGlvbl9pbmRleF90b19pbnNlcnRfKDApLAorICAgICAgbWF4X2VkaXRfb3BlcmF0aW9uc18oa01heEVkaXRPcGVyYXRpb25zKSwKKyAgICAgIGNoYXJhY3Rlcl9hbGlnbm1lbnRfKENGWF9UeHRMaW5lQWxpZ25tZW50X0xlZnQpLAorICAgICAgaGFzX2NoYXJhY3Rlcl9saW1pdF8oZmFsc2UpLAorICAgICAgaXNfY29tYl90ZXh0XyhmYWxzZSksCisgICAgICBpc19kaXJ0eV8oZmFsc2UpLAorICAgICAgdmFsaWRhdGlvbl9lbmFibGVkXyhmYWxzZSksCisgICAgICBpc19tdWx0aWxpbmVfKGZhbHNlKSwKKyAgICAgIGlzX2xpbmV3cmFwX2VuYWJsZWRfKGZhbHNlKSwKKyAgICAgIGxpbWl0X2hvcml6b250YWxfYXJlYV8oZmFsc2UpLAorICAgICAgbGltaXRfdmVydGljYWxfYXJlYV8oZmFsc2UpLAorICAgICAgcGFzc3dvcmRfbW9kZV8oZmFsc2UpLAorICAgICAgcGFzc3dvcmRfYWxpYXNfKEwnKicpLAorICAgICAgaGFzX3NlbGVjdGlvbl8oZmFsc2UpLAorICAgICAgc2VsZWN0aW9uXyh7MCwgMH0pIHsKKyAgY29udGVudF8ucmVzaXplKGdhcF9zaXplXyk7CisgIG9wZXJhdGlvbl9idWZmZXJfLnJlc2l6ZShtYXhfZWRpdF9vcGVyYXRpb25zXyk7CisKKyAgdGV4dF9icmVha18uU2V0Rm9udFNpemUoZm9udF9zaXplXyk7CisgIHRleHRfYnJlYWtfLlNldExpbmVCcmVha1RvbGVyYW5jZSgyLjBmKTsKKyAgdGV4dF9icmVha18uU2V0VGFiV2lkdGgoMzYpOworfQorCitDRkRFX1RleHRFZGl0RW5naW5lOjp+Q0ZERV9UZXh0RWRpdEVuZ2luZSgpIHt9CisKK3ZvaWQgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6Q2xlYXIoKSB7CisgIHRleHRfbGVuZ3RoXyA9IDA7CisgIGdhcF9wb3NpdGlvbl8gPSAwOworICBnYXBfc2l6ZV8gPSBrR2FwU2l6ZTsKKworICBjb250ZW50Xy5jbGVhcigpOworICBjb250ZW50Xy5yZXNpemUoZ2FwX3NpemVfKTsKKworICBDbGVhclNlbGVjdGlvbigpOworICBDbGVhck9wZXJhdGlvblJlY29yZHMoKTsKK30KKwordm9pZCBDRkRFX1RleHRFZGl0RW5naW5lOjpTZXRNYXhFZGl0T3BlcmF0aW9uc0ZvclRlc3Rpbmcoc2l6ZV90IG1heCkgeworICBtYXhfZWRpdF9vcGVyYXRpb25zXyA9IG1heDsKKyAgb3BlcmF0aW9uX2J1ZmZlcl8ucmVzaXplKG1heCk7CisKKyAgQ2xlYXJPcGVyYXRpb25SZWNvcmRzKCk7Cit9CisKK3ZvaWQgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6QWRqdXN0R2FwKHNpemVfdCBpZHgsIHNpemVfdCBsZW5ndGgpIHsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBjaGFyX3NpemUgPSBzaXplb2YoV2lkZVN0cmluZzo6Q2hhclR5cGUpOworCisgIC8vIE1vdmUgdGhlIGdhcCwgaWYgbmVjZXNzYXJ5LgorICBpZiAoaWR4IDwgZ2FwX3Bvc2l0aW9uXykgeworICAgIG1lbW1vdmUoY29udGVudF8uZGF0YSgpICsgaWR4ICsgZ2FwX3NpemVfLCBjb250ZW50Xy5kYXRhKCkgKyBpZHgsCisgICAgICAgICAgICAoZ2FwX3Bvc2l0aW9uXyAtIGlkeCkgKiBjaGFyX3NpemUpOworICAgIGdhcF9wb3NpdGlvbl8gPSBpZHg7CisgIH0gZWxzZSBpZiAoaWR4ID4gZ2FwX3Bvc2l0aW9uXykgeworICAgIG1lbW1vdmUoY29udGVudF8uZGF0YSgpICsgZ2FwX3Bvc2l0aW9uXywKKyAgICAgICAgICAgIGNvbnRlbnRfLmRhdGEoKSArIGdhcF9wb3NpdGlvbl8gKyBnYXBfc2l6ZV8sCisgICAgICAgICAgICAoaWR4IC0gZ2FwX3Bvc2l0aW9uXykgKiBjaGFyX3NpemUpOworICAgIGdhcF9wb3NpdGlvbl8gPSBpZHg7CisgIH0KKworICAvLyBJZiB0aGUgZ2FwIGlzIHRvbyBzbWFsbCwgbWFrZSBpdCBiaWdnZXIuCisgIGlmIChsZW5ndGggPj0gZ2FwX3NpemVfKSB7CisgICAgc2l6ZV90IG5ld19nYXBfc2l6ZSA9IGxlbmd0aCArIGtHYXBTaXplOworICAgIGNvbnRlbnRfLnJlc2l6ZSh0ZXh0X2xlbmd0aF8gKyBuZXdfZ2FwX3NpemUpOworCisgICAgbWVtbW92ZShjb250ZW50Xy5kYXRhKCkgKyBnYXBfcG9zaXRpb25fICsgbmV3X2dhcF9zaXplLAorICAgICAgICAgICAgY29udGVudF8uZGF0YSgpICsgZ2FwX3Bvc2l0aW9uXyArIGdhcF9zaXplXywKKyAgICAgICAgICAgICh0ZXh0X2xlbmd0aF8gLSBnYXBfcG9zaXRpb25fKSAqIGNoYXJfc2l6ZSk7CisKKyAgICBnYXBfc2l6ZV8gPSBuZXdfZ2FwX3NpemU7CisgIH0KK30KKworc2l6ZV90IENGREVfVGV4dEVkaXRFbmdpbmU6OkNvdW50Q2hhcnNFeGNlZWRpbmdTaXplKGNvbnN0IFdpZGVTdHJpbmcmIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV90b19jaGVjaykgeworICBpZiAoIWxpbWl0X2hvcml6b250YWxfYXJlYV8gJiYgIWxpbWl0X3ZlcnRpY2FsX2FyZWFfKQorICAgIHJldHVybiAwOworCisgIGF1dG8gdGV4dF9vdXQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZERV9UZXh0T3V0PigpOworICB0ZXh0X291dC0+U2V0TGluZVNwYWNlKGxpbmVfc3BhY2luZ18pOworICB0ZXh0X291dC0+U2V0Rm9udChmb250Xyk7CisgIHRleHRfb3V0LT5TZXRGb250U2l6ZShmb250X3NpemVfKTsKKworICBGREVfVGV4dFN0eWxlIHN0eWxlOworICBzdHlsZS5zaW5nbGVfbGluZV8gPSAhaXNfbXVsdGlsaW5lXzsKKworICBDRlhfUmVjdEYgdGV4dF9yZWN0OworICBpZiAoaXNfbGluZXdyYXBfZW5hYmxlZF8pIHsKKyAgICBzdHlsZS5saW5lX3dyYXBfID0gdHJ1ZTsKKyAgICB0ZXh0X3JlY3Qud2lkdGggPSBhdmFpbGFibGVfd2lkdGhfOworICB9IGVsc2UgeworICAgIHRleHRfcmVjdC53aWR0aCA9IGtQYWdlV2lkdGhNYXg7CisgIH0KKyAgdGV4dF9vdXQtPlNldFN0eWxlcyhzdHlsZSk7CisKKyAgc2l6ZV90IGxlbmd0aCA9IHRleHQuR2V0TGVuZ3RoKCk7CisgIFdpZGVTdHJpbmdWaWV3IHRlbXAodGV4dC5jX3N0cigpLCBsZW5ndGgpOworCisgIGZsb2F0IHZlcnRpY2FsX2hlaWdodCA9IGxpbmVfc3BhY2luZ18gKiB2aXNpYmxlX2xpbmVfY291bnRfOworICBzaXplX3QgY2hhcnNfZXhjZWVkaW5nX3NpemUgPSAwOworICAvLyBUT0RPKGRzaW5jbGFpcik6IENhbiB0aGlzIGdldCBjaGFuZ2VkIHRvIGEgYmluYXJ5IHNlYXJjaD8KKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fdG9fY2hlY2s7IGkrKykgeworICAgIC8vIFRoaXMgZG9lcyBhIGxvdCBvZiBzdHJpbmcgY29weWluZyAuLi4uCisgICAgLy8gVE9ETyhkc2luY2xhaXIpOiBtYWtlIENhbGNMb2dpY1NpemUgdGFrZSBhIFdpZGVTdHJpbmdDIGluc3RlYWQuCisgICAgdGV4dF9vdXQtPkNhbGNMb2dpY1NpemUoV2lkZVN0cmluZyh0ZW1wKSwgdGV4dF9yZWN0KTsKKworICAgIGlmIChsaW1pdF9ob3Jpem9udGFsX2FyZWFfICYmIHRleHRfcmVjdC53aWR0aCA8PSBhdmFpbGFibGVfd2lkdGhfKQorICAgICAgYnJlYWs7CisgICAgaWYgKGxpbWl0X3ZlcnRpY2FsX2FyZWFfICYmIHRleHRfcmVjdC5oZWlnaHQgPD0gdmVydGljYWxfaGVpZ2h0KQorICAgICAgYnJlYWs7CisKKyAgICAtLWxlbmd0aDsKKyAgICB0ZW1wID0gdGVtcC5NaWQoMCwgbGVuZ3RoKTsKKyAgICArK2NoYXJzX2V4Y2VlZGluZ19zaXplOworICB9CisKKyAgcmV0dXJuIGNoYXJzX2V4Y2VlZGluZ19zaXplOworfQorCit2b2lkIENGREVfVGV4dEVkaXRFbmdpbmU6Okluc2VydChzaXplX3QgaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlY29yZE9wZXJhdGlvbiBhZGRfb3BlcmF0aW9uKSB7CisgIGlmIChpZHggPiB0ZXh0X2xlbmd0aF8pCisgICAgaWR4ID0gdGV4dF9sZW5ndGhfOworCisgIHNpemVfdCBsZW5ndGggPSB0ZXh0LkdldExlbmd0aCgpOworICBpZiAobGVuZ3RoID09IDApCisgICAgcmV0dXJuOworCisgIC8vIElmIHdlJ3JlIGdvaW5nIHRvIGJlIHRvbyBiaWcgd2UgaW5zZXJ0IHdoYXQgd2UgY2FuIGFuZCBub3RpZnkgdGhlCisgIC8vIGRlbGVnYXRlIHdlJ3ZlIGZpbGxlZCB0aGUgdGV4dCBhZnRlciB0aGUgaW5zZXJ0IGlzIGRvbmUuCisgIGJvb2wgZXhjZWVkZWRfbGltaXQgPSBmYWxzZTsKKyAgaWYgKGhhc19jaGFyYWN0ZXJfbGltaXRfICYmIHRleHRfbGVuZ3RoXyArIGxlbmd0aCA+IGNoYXJhY3Rlcl9saW1pdF8pIHsKKyAgICBleGNlZWRlZF9saW1pdCA9IHRydWU7CisgICAgbGVuZ3RoID0gY2hhcmFjdGVyX2xpbWl0XyAtIHRleHRfbGVuZ3RoXzsKKyAgfQorCisgIEFkanVzdEdhcChpZHgsIGxlbmd0aCk7CisKKyAgaWYgKHZhbGlkYXRpb25fZW5hYmxlZF8gfHwgbGltaXRfaG9yaXpvbnRhbF9hcmVhXyB8fCBsaW1pdF92ZXJ0aWNhbF9hcmVhXykgeworICAgIFdpZGVTdHJpbmcgc3RyOworICAgIGlmIChnYXBfcG9zaXRpb25fID4gMCkKKyAgICAgIHN0ciArPSBXaWRlU3RyaW5nVmlldyhjb250ZW50Xy5kYXRhKCksIGdhcF9wb3NpdGlvbl8pOworCisgICAgc3RyICs9IHRleHQ7CisKKyAgICBpZiAodGV4dF9sZW5ndGhfIC0gZ2FwX3Bvc2l0aW9uXyA+IDApIHsKKyAgICAgIHN0ciArPSBXaWRlU3RyaW5nVmlldyhjb250ZW50Xy5kYXRhKCkgKyBnYXBfcG9zaXRpb25fICsgZ2FwX3NpemVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfbGVuZ3RoXyAtIGdhcF9wb3NpdGlvbl8pOworICAgIH0KKworICAgIGlmICh2YWxpZGF0aW9uX2VuYWJsZWRfICYmIGRlbGVnYXRlXyAmJiAhZGVsZWdhdGVfLT5PblZhbGlkYXRlKHN0cikpIHsKKyAgICAgIC8vIFRPRE8oZHNpbmNsYWlyKTogTm90aWZ5IGRlbGVnYXRlIG9mIHZhbGlkYXRpb24gZmFpbHVyZT8KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiB3ZSd2ZSBsaW1pdGVkIHRoZSBob3Jpem9udGFsL3ZlcnRpY2FsIGFyZWEsIGFuZCBpZiBzbyBkZXRlcm1pbmUKKyAgICAvLyBob3cgbWFueSBvZiBvdXIgY2hhcmFjdGVycyB3b3VsZCBiZSBvdXRzaWRlIHRoZSBhcmVhLgorICAgIHNpemVfdCBjaGFyc19leGNlZWRpbmcgPSBDb3VudENoYXJzRXhjZWVkaW5nU2l6ZShzdHIsIGxlbmd0aCk7CisgICAgaWYgKGNoYXJzX2V4Y2VlZGluZyA+IDApIHsKKyAgICAgIC8vIElmIG5vbmUgb2YgdGhlIGNoYXJhY3RlcnMgd2lsbCBmaXQsIG5vdGlmeSBhbmQgZXhpdC4KKyAgICAgIGlmIChjaGFyc19leGNlZWRpbmcgPT0gbGVuZ3RoKSB7CisgICAgICAgIGlmIChkZWxlZ2F0ZV8pCisgICAgICAgICAgZGVsZWdhdGVfLT5Ob3RpZnlUZXh0RnVsbCgpOworICAgICAgICByZXR1cm47CisgICAgICB9CisKKyAgICAgIC8vIFNvbWUsIGJ1dCBub3QgYWxsLCBjaGFycyB3aWxsIGZpdCwgaW5zZXJ0IHRoZW0gYW5kIHRoZW4gbm90aWZ5CisgICAgICAvLyB3ZSdyZSBmdWxsLgorICAgICAgZXhjZWVkZWRfbGltaXQgPSB0cnVlOworICAgICAgbGVuZ3RoIC09IGNoYXJzX2V4Y2VlZGluZzsKKyAgICB9CisgIH0KKworICBpZiAoYWRkX29wZXJhdGlvbiA9PSBSZWNvcmRPcGVyYXRpb246OmtJbnNlcnRSZWNvcmQpIHsKKyAgICBBZGRPcGVyYXRpb25SZWNvcmQoCisgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxJbnNlcnRPcGVyYXRpb24+KHRoaXMsIGdhcF9wb3NpdGlvbl8sIHRleHQpKTsKKyAgfQorCisgIFdpZGVTdHJpbmcgcHJldmlvdXNfdGV4dDsKKyAgaWYgKGRlbGVnYXRlXykKKyAgICBwcmV2aW91c190ZXh0ID0gR2V0VGV4dCgpOworCisgIC8vIENvcHkgdGhlIG5ldyB0ZXh0IGludG8gdGhlIGdhcC4KKyAgc3RhdGljIGNvbnN0IHNpemVfdCBjaGFyX3NpemUgPSBzaXplb2YoV2lkZVN0cmluZzo6Q2hhclR5cGUpOworICBtZW1jcHkoY29udGVudF8uZGF0YSgpICsgZ2FwX3Bvc2l0aW9uXywgdGV4dC5jX3N0cigpLCBsZW5ndGggKiBjaGFyX3NpemUpOworICBnYXBfcG9zaXRpb25fICs9IGxlbmd0aDsKKyAgZ2FwX3NpemVfIC09IGxlbmd0aDsKKyAgdGV4dF9sZW5ndGhfICs9IGxlbmd0aDsKKworICBpc19kaXJ0eV8gPSB0cnVlOworCisgIC8vIEluc2VydGluZyB0ZXh0IHJlc2V0cyB0aGUgc2VsZWN0aW9uLgorICBDbGVhclNlbGVjdGlvbigpOworCisgIGlmIChkZWxlZ2F0ZV8pIHsKKyAgICBpZiAoZXhjZWVkZWRfbGltaXQpCisgICAgICBkZWxlZ2F0ZV8tPk5vdGlmeVRleHRGdWxsKCk7CisKKyAgICBkZWxlZ2F0ZV8tPk9uVGV4dENoYW5nZWQocHJldmlvdXNfdGV4dCk7CisgIH0KK30KKwordm9pZCBDRkRFX1RleHRFZGl0RW5naW5lOjpBZGRPcGVyYXRpb25SZWNvcmQoc3RkOjp1bmlxdWVfcHRyPE9wZXJhdGlvbj4gb3ApIHsKKyAgc2l6ZV90IGxhc3RfaW5zZXJ0X3Bvc2l0aW9uID0gbmV4dF9vcGVyYXRpb25faW5kZXhfdG9faW5zZXJ0XyA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1heF9lZGl0X29wZXJhdGlvbnNfIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXh0X29wZXJhdGlvbl9pbmRleF90b19pbnNlcnRfIC0gMTsKKworICAvLyBJZiBvdXIgdW5kbyByZWNvcmQgaXMgbm90IHRoZSBsYXN0IHRoaW5nIHdlIGluc2VydGVkIHRoZW4gd2UgbmVlZCB0bworICAvLyByZW1vdmUgYWxsIHRoZSB1bmRvIHJlY29yZHMgYmV0d2VlbiBvdXIgaW5zZXJ0IHBvc2l0aW9uIGFuZCB0aGUgdW5kbyBtYXJrZXIKKyAgLy8gYW5kIG1ha2UgdGhhdCBvdXIgbmV3IGluc2VydCBwb3NpdGlvbi4KKyAgaWYgKG5leHRfb3BlcmF0aW9uX2luZGV4X3RvX3VuZG9fICE9IGxhc3RfaW5zZXJ0X3Bvc2l0aW9uKSB7CisgICAgaWYgKG5leHRfb3BlcmF0aW9uX2luZGV4X3RvX3VuZG9fID4gbGFzdF9pbnNlcnRfcG9zaXRpb24pIHsKKyAgICAgIC8vIE91ciBVbmRvIHBvc2l0aW9uIGlzIGFoZWFkIG9mIHVzLCB3aGljaCBtZWFucyB3ZSBuZWVkIHRvIGNsZWFyIG91dCB0aGUKKyAgICAgIC8vIGhlYWQgb2YgdGhlIHF1ZXVlLgorICAgICAgd2hpbGUgKGxhc3RfaW5zZXJ0X3Bvc2l0aW9uICE9IDApIHsKKyAgICAgICAgb3BlcmF0aW9uX2J1ZmZlcl9bbGFzdF9pbnNlcnRfcG9zaXRpb25dLnJlc2V0KCk7CisgICAgICAgIC0tbGFzdF9pbnNlcnRfcG9zaXRpb247CisgICAgICB9CisgICAgICBvcGVyYXRpb25fYnVmZmVyX1swXS5yZXNldCgpOworCisgICAgICAvLyBNb3ZpbmcgdGhpcyB3aWxsIGxldCB1cyB0aGVuIGNsZWFyIG91dCB0aGUgZW5kLCBzZXR0aW5nIHRoZSB1bmRvCisgICAgICAvLyBwb3NpdGlvbiB0byBiZWZvcmUgdGhlIGluc2VydCBwb3NpdGlvbi4KKyAgICAgIGxhc3RfaW5zZXJ0X3Bvc2l0aW9uID0gbWF4X2VkaXRfb3BlcmF0aW9uc18gLSAxOworICAgIH0KKworICAgIC8vIENsZWFyIG91dCB0aGUgdmVjdG9yIGZyb20gdW5kbyBwb3NpdGlvbiB0byBvdXIgc2V0IGluc2VydCBwb3NpdGlvbi4KKyAgICB3aGlsZSAobmV4dF9vcGVyYXRpb25faW5kZXhfdG9fdW5kb18gIT0gbGFzdF9pbnNlcnRfcG9zaXRpb24pIHsKKyAgICAgIG9wZXJhdGlvbl9idWZmZXJfW2xhc3RfaW5zZXJ0X3Bvc2l0aW9uXS5yZXNldCgpOworICAgICAgLS1sYXN0X2luc2VydF9wb3NpdGlvbjsKKyAgICB9CisgIH0KKworICAvLyBXZSdyZSBub3cgcG9pbnRpbmcgYXQgdGhlIG5leHQgdGhpbmcgd2Ugd2FudCB0byBVbmRvLCBzbyBpbnNlcnQgYXQgdGhlCisgIC8vIG5leHQgcG9zaXRpb24gaW4gdGhlIHF1ZXVlLgorICArK2xhc3RfaW5zZXJ0X3Bvc2l0aW9uOworICBpZiAobGFzdF9pbnNlcnRfcG9zaXRpb24gPj0gbWF4X2VkaXRfb3BlcmF0aW9uc18pCisgICAgbGFzdF9pbnNlcnRfcG9zaXRpb24gPSAwOworCisgIG9wZXJhdGlvbl9idWZmZXJfW2xhc3RfaW5zZXJ0X3Bvc2l0aW9uXSA9IHN0ZDo6bW92ZShvcCk7CisgIG5leHRfb3BlcmF0aW9uX2luZGV4X3RvX2luc2VydF8gPQorICAgICAgKGxhc3RfaW5zZXJ0X3Bvc2l0aW9uICsgMSkgJSBtYXhfZWRpdF9vcGVyYXRpb25zXzsKKyAgbmV4dF9vcGVyYXRpb25faW5kZXhfdG9fdW5kb18gPSBsYXN0X2luc2VydF9wb3NpdGlvbjsKK30KKwordm9pZCBDRkRFX1RleHRFZGl0RW5naW5lOjpDbGVhck9wZXJhdGlvblJlY29yZHMoKSB7CisgIGZvciAoYXV0byYgcmVjb3JkIDogb3BlcmF0aW9uX2J1ZmZlcl8pCisgICAgcmVjb3JkLnJlc2V0KCk7CisKKyAgbmV4dF9vcGVyYXRpb25faW5kZXhfdG9fdW5kb18gPSBtYXhfZWRpdF9vcGVyYXRpb25zXyAtIDE7CisgIG5leHRfb3BlcmF0aW9uX2luZGV4X3RvX2luc2VydF8gPSAwOworfQorCitzaXplX3QgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6R2V0SW5kZXhCZWZvcmUoc2l6ZV90IHBvcykgeworICBpbnQzMl90IGJpZGlfbGV2ZWw7CisgIENGWF9SZWN0RiByZWN0OworICAvLyBQb3NzaWJsZSB8TGF5b3V0fCB0cmlnZ2VyZWQgYnkgfEdldENoYXJhY3RlckluZm98LgorICBzdGQ6OnRpZShiaWRpX2xldmVsLCByZWN0KSA9IEdldENoYXJhY3RlckluZm8ocG9zKTsKKyAgcmV0dXJuIEZYX0lzT2RkKGJpZGlfbGV2ZWwpID8gR2V0SW5kZXhSaWdodChwb3MpIDogR2V0SW5kZXhMZWZ0KHBvcyk7Cit9CisKK3NpemVfdCBDRkRFX1RleHRFZGl0RW5naW5lOjpHZXRJbmRleExlZnQoc2l6ZV90IHBvcykgY29uc3QgeworICBpZiAocG9zID09IDApCisgICAgcmV0dXJuIDA7CisgIC0tcG9zOworCisgIHdjaGFyX3QgY2ggPSBHZXRDaGFyKHBvcyk7CisgIHdoaWxlIChwb3MgIT0gMCkgeworICAgIC8vIFdlIHdhbnQgdG8gYmUgb24gdGhlIGxvY2F0aW9uIGp1c3QgYmVmb3JlIHRoZSBcciBvciBcbgorICAgIGNoID0gR2V0Q2hhcihwb3MgLSAxKTsKKyAgICBpZiAoY2ggIT0gJ1xyJyAmJiBjaCAhPSAnXG4nKQorICAgICAgYnJlYWs7CisKKyAgICAtLXBvczsKKyAgfQorICByZXR1cm4gcG9zOworfQorCitzaXplX3QgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6R2V0SW5kZXhSaWdodChzaXplX3QgcG9zKSBjb25zdCB7CisgIGlmIChwb3MgPj0gdGV4dF9sZW5ndGhfKQorICAgIHJldHVybiB0ZXh0X2xlbmd0aF87CisgICsrcG9zOworCisgIHdjaGFyX3QgY2ggPSBHZXRDaGFyKHBvcyk7CisgIC8vIFdlIHdhbnQgdG8gYmUgb24gdGhlIGxvY2F0aW9uIGFmdGVyIHRoZSBcclxuLgorICB3aGlsZSAocG9zIDwgdGV4dF9sZW5ndGhfICYmIChjaCA9PSAnXHInIHx8IGNoID09ICdcbicpKSB7CisgICAgKytwb3M7CisgICAgY2ggPSBHZXRDaGFyKHBvcyk7CisgIH0KKworICByZXR1cm4gcG9zOworfQorCitzaXplX3QgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6R2V0SW5kZXhVcChzaXplX3QgcG9zKSBjb25zdCB7CisgIHNpemVfdCBsaW5lX3N0YXJ0ID0gR2V0SW5kZXhBdFN0YXJ0T2ZMaW5lKHBvcyk7CisgIGlmIChsaW5lX3N0YXJ0ID09IDApCisgICAgcmV0dXJuIHBvczsKKworICAvLyBEZXRlcm1pbmUgaG93IGZhciBhbG9uZyB0aGUgbGluZSB3ZSB3ZXJlLgorICBzaXplX3QgZGlzdCA9IHBvcyAtIGxpbmVfc3RhcnQ7CisKKyAgLy8gTW92ZSB0byB0aGUgZW5kIG9mIHRoZSBwcmVjZWRpbmcgbGluZS4KKyAgd2NoYXJfdCBjaDsKKyAgZG8geworICAgIC0tbGluZV9zdGFydDsKKyAgICBjaCA9IEdldENoYXIobGluZV9zdGFydCk7CisgIH0gd2hpbGUgKGxpbmVfc3RhcnQgIT0gMCAmJiAoY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXG4nKSk7CisKKyAgaWYgKGxpbmVfc3RhcnQgPT0gMCkKKyAgICByZXR1cm4gZGlzdDsKKworICAvLyBHZXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIHByaW9yIHRvIHRoZSBjdXJyZW50IGxpbmUuCisgIHNpemVfdCBwcmlvcl9zdGFydCA9IEdldEluZGV4QXRTdGFydE9mTGluZShsaW5lX3N0YXJ0KTsKKworICAvLyBQcmlvciBsaW5lIGlzIHNob3J0ZXIgdGhlbiBuZXh0IGxpbmUsIGFuZCB3ZSdyZSBwYXN0IHRoZSBlbmQgb2YgdGhhdCBsaW5lCisgIC8vIHJldHVybiB0aGUgZW5kIG9mIGxpbmUuCisgIGlmIChwcmlvcl9zdGFydCArIGRpc3QgPiBsaW5lX3N0YXJ0KQorICAgIHJldHVybiBHZXRJbmRleEF0RW5kT2ZMaW5lKGxpbmVfc3RhcnQpOworCisgIHJldHVybiBwcmlvcl9zdGFydCArIGRpc3Q7Cit9CisKK3NpemVfdCBDRkRFX1RleHRFZGl0RW5naW5lOjpHZXRJbmRleERvd24oc2l6ZV90IHBvcykgY29uc3QgeworICBzaXplX3QgbGluZV9lbmQgPSBHZXRJbmRleEF0RW5kT2ZMaW5lKHBvcyk7CisgIGlmIChsaW5lX2VuZCA9PSB0ZXh0X2xlbmd0aF8pCisgICAgcmV0dXJuIHBvczsKKworICB3Y2hhcl90IGNoOworICBkbyB7CisgICAgKytsaW5lX2VuZDsKKyAgICBjaCA9IEdldENoYXIobGluZV9lbmQpOworICB9IHdoaWxlIChsaW5lX2VuZCA8IHRleHRfbGVuZ3RoXyAmJiAoY2ggPT0gJ1xyJyB8fCBjaCA9PSAnXG4nKSk7CisKKyAgaWYgKGxpbmVfZW5kID09IHRleHRfbGVuZ3RoXykKKyAgICByZXR1cm4gbGluZV9lbmQ7CisKKyAgLy8gRGV0ZXJtaW5lIGhvdyBmYXIgYWxvbmcgdGhlIGxpbmUgd2UgYXJlLgorICBzaXplX3QgZGlzdCA9IHBvcyAtIEdldEluZGV4QXRTdGFydE9mTGluZShwb3MpOworCisgIC8vIENoZWNrIGlmIG5leHQgbGluZSBpcyBzaG9ydGVyIHRoZW4gY3VycmVudCBsaW5lLiBJZiBzbywgcmV0dXJuIGVuZAorICAvLyBvZiBuZXh0IGxpbmUuCisgIHNpemVfdCBuZXh0X2xpbmVfZW5kID0gR2V0SW5kZXhBdEVuZE9mTGluZShsaW5lX2VuZCk7CisgIGlmIChsaW5lX2VuZCArIGRpc3QgPiBuZXh0X2xpbmVfZW5kKQorICAgIHJldHVybiBuZXh0X2xpbmVfZW5kOworCisgIHJldHVybiBsaW5lX2VuZCArIGRpc3Q7Cit9CisKK3NpemVfdCBDRkRFX1RleHRFZGl0RW5naW5lOjpHZXRJbmRleEF0U3RhcnRPZkxpbmUoc2l6ZV90IHBvcykgY29uc3QgeworICBpZiAocG9zID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgd2NoYXJfdCBjaCA9IEdldENoYXIocG9zKTsKKyAgLy8gV2hhdCB0byBkby4KKyAgaWYgKGNoID09ICdccicgfHwgY2ggPT0gJ1xuJykKKyAgICByZXR1cm4gcG9zOworCisgIGRvIHsKKyAgICAvLyBXZSB3YW50IHRvIGJlIG9uIHRoZSBsb2NhdGlvbiBqdXN0IGFmdGVyIHRoZSBcclxuCisgICAgY2ggPSBHZXRDaGFyKHBvcyAtIDEpOworICAgIGlmIChjaCA9PSAnXHInIHx8IGNoID09ICdcbicpCisgICAgICBicmVhazsKKworICAgIC0tcG9zOworICB9IHdoaWxlIChwb3MgPiAwKTsKKworICByZXR1cm4gcG9zOworfQorCitzaXplX3QgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6R2V0SW5kZXhBdEVuZE9mTGluZShzaXplX3QgcG9zKSBjb25zdCB7CisgIGlmIChwb3MgPj0gdGV4dF9sZW5ndGhfKQorICAgIHJldHVybiB0ZXh0X2xlbmd0aF87CisKKyAgd2NoYXJfdCBjaCA9IEdldENoYXIocG9zKTsKKyAgLy8gTm90IHF1aXRlIHN1cmUgd2hpY2ggd2F5IHRvIGdvIGhlcmU/CisgIGlmIChjaCA9PSAnXHInIHx8IGNoID09ICdcbicpCisgICAgcmV0dXJuIHBvczsKKworICAvLyBXZSB3YW50IHRvIGJlIG9uIHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3QgXHIgb3IgXG4uCisgIGRvIHsKKyAgICArK3BvczsKKyAgICBjaCA9IEdldENoYXIocG9zKTsKKyAgfSB3aGlsZSAocG9zIDwgdGV4dF9sZW5ndGhfICYmIChjaCAhPSAnXHInICYmIGNoICE9ICdcbicpKTsKKworICByZXR1cm4gcG9zOworfQorCit2b2lkIENGREVfVGV4dEVkaXRFbmdpbmU6OkxpbWl0SG9yaXpvbnRhbFNjcm9sbChib29sIHZhbCkgeworICBDbGVhck9wZXJhdGlvblJlY29yZHMoKTsKKyAgbGltaXRfaG9yaXpvbnRhbF9hcmVhXyA9IHZhbDsKK30KKwordm9pZCBDRkRFX1RleHRFZGl0RW5naW5lOjpMaW1pdFZlcnRpY2FsU2Nyb2xsKGJvb2wgdmFsKSB7CisgIENsZWFyT3BlcmF0aW9uUmVjb3JkcygpOworICBsaW1pdF92ZXJ0aWNhbF9hcmVhXyA9IHZhbDsKK30KKworYm9vbCBDRkRFX1RleHRFZGl0RW5naW5lOjpDYW5VbmRvKCkgY29uc3QgeworICByZXR1cm4gb3BlcmF0aW9uX2J1ZmZlcl9bbmV4dF9vcGVyYXRpb25faW5kZXhfdG9fdW5kb19dICE9IG51bGxwdHIgJiYKKyAgICAgICAgIG5leHRfb3BlcmF0aW9uX2luZGV4X3RvX3VuZG9fICE9IG5leHRfb3BlcmF0aW9uX2luZGV4X3RvX2luc2VydF87Cit9CisKK2Jvb2wgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6Q2FuUmVkbygpIGNvbnN0IHsKKyAgc2l6ZV90IGlkeCA9IChuZXh0X29wZXJhdGlvbl9pbmRleF90b191bmRvXyArIDEpICUgbWF4X2VkaXRfb3BlcmF0aW9uc187CisgIHJldHVybiBpZHggIT0gbmV4dF9vcGVyYXRpb25faW5kZXhfdG9faW5zZXJ0XyAmJgorICAgICAgICAgb3BlcmF0aW9uX2J1ZmZlcl9baWR4XSAhPSBudWxscHRyOworfQorCitib29sIENGREVfVGV4dEVkaXRFbmdpbmU6OlJlZG8oKSB7CisgIGlmICghQ2FuUmVkbygpKQorICAgIHJldHVybiBmYWxzZTsKKworICBuZXh0X29wZXJhdGlvbl9pbmRleF90b191bmRvXyA9CisgICAgICAobmV4dF9vcGVyYXRpb25faW5kZXhfdG9fdW5kb18gKyAxKSAlIG1heF9lZGl0X29wZXJhdGlvbnNfOworICBvcGVyYXRpb25fYnVmZmVyX1tuZXh0X29wZXJhdGlvbl9pbmRleF90b191bmRvX10tPlJlZG8oKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6VW5kbygpIHsKKyAgaWYgKCFDYW5VbmRvKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG9wZXJhdGlvbl9idWZmZXJfW25leHRfb3BlcmF0aW9uX2luZGV4X3RvX3VuZG9fXS0+VW5kbygpOworICBuZXh0X29wZXJhdGlvbl9pbmRleF90b191bmRvXyA9IG5leHRfb3BlcmF0aW9uX2luZGV4X3RvX3VuZG9fID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtYXhfZWRpdF9vcGVyYXRpb25zXyAtIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXh0X29wZXJhdGlvbl9pbmRleF90b191bmRvXyAtIDE7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENGREVfVGV4dEVkaXRFbmdpbmU6OkxheW91dCgpIHsKKyAgaWYgKCFpc19kaXJ0eV8pCisgICAgcmV0dXJuOworCisgIGlzX2RpcnR5XyA9IGZhbHNlOworICBSZWJ1aWxkUGllY2VzKCk7Cit9CisKK0NGWF9SZWN0RiBDRkRFX1RleHRFZGl0RW5naW5lOjpHZXRDb250ZW50c0JvdW5kaW5nQm94KCkgeworICAvLyBMYXlvdXQgaWYgbmVjZXNzYXJ5LgorICBMYXlvdXQoKTsKKyAgcmV0dXJuIGNvbnRlbnRzX2JvdW5kaW5nX2JveF87Cit9CisKK3ZvaWQgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6U2V0QXZhaWxhYmxlV2lkdGgoc2l6ZV90IHdpZHRoKSB7CisgIGlmICh3aWR0aCA9PSBhdmFpbGFibGVfd2lkdGhfKQorICAgIHJldHVybjsKKworICBDbGVhck9wZXJhdGlvblJlY29yZHMoKTsKKworICBhdmFpbGFibGVfd2lkdGhfID0gd2lkdGg7CisgIGlmIChpc19saW5ld3JhcF9lbmFibGVkXykKKyAgICB0ZXh0X2JyZWFrXy5TZXRMaW5lV2lkdGgod2lkdGgpOworICBpZiAoaXNfY29tYl90ZXh0XykKKyAgICBTZXRDb21iVGV4dFdpZHRoKCk7CisKKyAgaXNfZGlydHlfID0gdHJ1ZTsKK30KKwordm9pZCBDRkRFX1RleHRFZGl0RW5naW5lOjpTZXRIYXNDaGFyYWN0ZXJMaW1pdChib29sIGxpbWl0KSB7CisgIGlmIChoYXNfY2hhcmFjdGVyX2xpbWl0XyA9PSBsaW1pdCkKKyAgICByZXR1cm47CisKKyAgaGFzX2NoYXJhY3Rlcl9saW1pdF8gPSBsaW1pdDsKKyAgaWYgKGlzX2NvbWJfdGV4dF8pCisgICAgU2V0Q29tYlRleHRXaWR0aCgpOworCisgIGlzX2RpcnR5XyA9IHRydWU7Cit9CisKK3ZvaWQgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6U2V0Q2hhcmFjdGVyTGltaXQoc2l6ZV90IGxpbWl0KSB7CisgIGlmIChjaGFyYWN0ZXJfbGltaXRfID09IGxpbWl0KQorICAgIHJldHVybjsKKworICBDbGVhck9wZXJhdGlvblJlY29yZHMoKTsKKworICBjaGFyYWN0ZXJfbGltaXRfID0gbGltaXQ7CisgIGlmIChpc19jb21iX3RleHRfKQorICAgIFNldENvbWJUZXh0V2lkdGgoKTsKKworICBpc19kaXJ0eV8gPSB0cnVlOworfQorCit2b2lkIENGREVfVGV4dEVkaXRFbmdpbmU6OlNldEZvbnQoUmV0YWluUHRyPENGR0FTX0dFRm9udD4gZm9udCkgeworICBpZiAoZm9udF8gPT0gZm9udCkKKyAgICByZXR1cm47CisKKyAgZm9udF8gPSBmb250OworICB0ZXh0X2JyZWFrXy5TZXRGb250KGZvbnRfKTsKKyAgaXNfZGlydHlfID0gdHJ1ZTsKK30KKworUmV0YWluUHRyPENGR0FTX0dFRm9udD4gQ0ZERV9UZXh0RWRpdEVuZ2luZTo6R2V0Rm9udCgpIGNvbnN0IHsKKyAgcmV0dXJuIGZvbnRfOworfQorCit2b2lkIENGREVfVGV4dEVkaXRFbmdpbmU6OlNldEZvbnRTaXplKGZsb2F0IHNpemUpIHsKKyAgaWYgKGZvbnRfc2l6ZV8gPT0gc2l6ZSkKKyAgICByZXR1cm47CisKKyAgZm9udF9zaXplXyA9IHNpemU7CisgIHRleHRfYnJlYWtfLlNldEZvbnRTaXplKGZvbnRfc2l6ZV8pOworICBpc19kaXJ0eV8gPSB0cnVlOworfQorCit2b2lkIENGREVfVGV4dEVkaXRFbmdpbmU6OlNldFRhYldpZHRoKGZsb2F0IHdpZHRoKSB7CisgIGludDMyX3Qgb2xkX3RhYl93aWR0aCA9IHRleHRfYnJlYWtfLkdldFRhYldpZHRoKCk7CisgIHRleHRfYnJlYWtfLlNldFRhYldpZHRoKHdpZHRoKTsKKyAgaWYgKG9sZF90YWJfd2lkdGggPT0gdGV4dF9icmVha18uR2V0VGFiV2lkdGgoKSkKKyAgICByZXR1cm47CisKKyAgaXNfZGlydHlfID0gdHJ1ZTsKK30KKworZmxvYXQgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6R2V0Rm9udEFzY2VudCgpIGNvbnN0IHsKKyAgcmV0dXJuIChzdGF0aWNfY2FzdDxmbG9hdD4oZm9udF8tPkdldEFzY2VudCgpKSAqIGZvbnRfc2l6ZV8pIC8gMTAwMDsKK30KKwordm9pZCBDRkRFX1RleHRFZGl0RW5naW5lOjpTZXRBbGlnbm1lbnQodWludDMyX3QgYWxpZ25tZW50KSB7CisgIGlmIChhbGlnbm1lbnQgPT0gY2hhcmFjdGVyX2FsaWdubWVudF8pCisgICAgcmV0dXJuOworCisgIGNoYXJhY3Rlcl9hbGlnbm1lbnRfID0gYWxpZ25tZW50OworICB0ZXh0X2JyZWFrXy5TZXRBbGlnbm1lbnQoYWxpZ25tZW50KTsKKyAgaXNfZGlydHlfID0gdHJ1ZTsKK30KKwordm9pZCBDRkRFX1RleHRFZGl0RW5naW5lOjpTZXRWaXNpYmxlTGluZUNvdW50KHNpemVfdCBjb3VudCkgeworICBpZiAodmlzaWJsZV9saW5lX2NvdW50XyA9PSBjb3VudCkKKyAgICByZXR1cm47CisKKyAgdmlzaWJsZV9saW5lX2NvdW50XyA9IHN0ZDo6bWF4KHN0YXRpY19jYXN0PHNpemVfdD4oMSksIGNvdW50KTsKKyAgaXNfZGlydHlfID0gdHJ1ZTsKK30KKwordm9pZCBDRkRFX1RleHRFZGl0RW5naW5lOjpFbmFibGVNdWx0aUxpbmUoYm9vbCB2YWwpIHsKKyAgaWYgKGlzX211bHRpbGluZV8gPT0gdmFsKQorICAgIHJldHVybjsKKworICBpc19tdWx0aWxpbmVfID0gdHJ1ZTsKKworICB1aW50MzJfdCBzdHlsZSA9IHRleHRfYnJlYWtfLkdldExheW91dFN0eWxlcygpOworICBpZiAoaXNfbXVsdGlsaW5lXykKKyAgICBzdHlsZSAmPSB+RlhfTEFZT1VUU1RZTEVfU2luZ2xlTGluZTsKKyAgZWxzZQorICAgIHN0eWxlIHw9IEZYX0xBWU9VVFNUWUxFX1NpbmdsZUxpbmU7CisgIHRleHRfYnJlYWtfLlNldExheW91dFN0eWxlcyhzdHlsZSk7CisgIGlzX2RpcnR5XyA9IHRydWU7Cit9CisKK3ZvaWQgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6RW5hYmxlTGluZVdyYXAoYm9vbCB2YWwpIHsKKyAgaWYgKGlzX2xpbmV3cmFwX2VuYWJsZWRfID09IHZhbCkKKyAgICByZXR1cm47CisKKyAgaXNfbGluZXdyYXBfZW5hYmxlZF8gPSB2YWw7CisgIHRleHRfYnJlYWtfLlNldExpbmVXaWR0aChpc19saW5ld3JhcF9lbmFibGVkXyA/IGF2YWlsYWJsZV93aWR0aF8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoga1BhZ2VXaWR0aE1heCk7CisgIGlzX2RpcnR5XyA9IHRydWU7Cit9CisKK3ZvaWQgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6U2V0Q29tYlRleHQoYm9vbCBlbmFibGUpIHsKKyAgaWYgKGlzX2NvbWJfdGV4dF8gPT0gZW5hYmxlKQorICAgIHJldHVybjsKKworICBpc19jb21iX3RleHRfID0gZW5hYmxlOworCisgIHVpbnQzMl90IHN0eWxlID0gdGV4dF9icmVha18uR2V0TGF5b3V0U3R5bGVzKCk7CisgIGlmIChlbmFibGUpIHsKKyAgICBzdHlsZSB8PSBGWF9MQVlPVVRTVFlMRV9Db21iVGV4dDsKKyAgICBTZXRDb21iVGV4dFdpZHRoKCk7CisgIH0gZWxzZSB7CisgICAgc3R5bGUgJj0gfkZYX0xBWU9VVFNUWUxFX0NvbWJUZXh0OworICB9CisgIHRleHRfYnJlYWtfLlNldExheW91dFN0eWxlcyhzdHlsZSk7CisgIGlzX2RpcnR5XyA9IHRydWU7Cit9CisKK3ZvaWQgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6U2V0Q29tYlRleHRXaWR0aCgpIHsKKyAgc2l6ZV90IHdpZHRoID0gYXZhaWxhYmxlX3dpZHRoXzsKKyAgaWYgKGhhc19jaGFyYWN0ZXJfbGltaXRfKQorICAgIHdpZHRoIC89IGNoYXJhY3Rlcl9saW1pdF87CisKKyAgdGV4dF9icmVha18uU2V0Q29tYldpZHRoKHdpZHRoKTsKK30KKwordm9pZCBDRkRFX1RleHRFZGl0RW5naW5lOjpTZWxlY3RBbGwoKSB7CisgIGlmICh0ZXh0X2xlbmd0aF8gPT0gMCkKKyAgICByZXR1cm47CisKKyAgaGFzX3NlbGVjdGlvbl8gPSB0cnVlOworICBzZWxlY3Rpb25fLnN0YXJ0X2lkeCA9IDA7CisgIHNlbGVjdGlvbl8uY291bnQgPSB0ZXh0X2xlbmd0aF87Cit9CisKK3ZvaWQgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6Q2xlYXJTZWxlY3Rpb24oKSB7CisgIGhhc19zZWxlY3Rpb25fID0gZmFsc2U7CisgIHNlbGVjdGlvbl8uc3RhcnRfaWR4ID0gMDsKKyAgc2VsZWN0aW9uXy5jb3VudCA9IDA7Cit9CisKK3ZvaWQgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6U2V0U2VsZWN0aW9uKHNpemVfdCBzdGFydF9pZHgsIHNpemVfdCBjb3VudCkgeworICBpZiAoY291bnQgPT0gMCkgeworICAgIENsZWFyU2VsZWN0aW9uKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHN0YXJ0X2lkeCA+IHRleHRfbGVuZ3RoXykKKyAgICByZXR1cm47CisgIGlmIChzdGFydF9pZHggKyBjb3VudCA+IHRleHRfbGVuZ3RoXykKKyAgICBjb3VudCA9IHRleHRfbGVuZ3RoXyAtIHN0YXJ0X2lkeDsKKworICBoYXNfc2VsZWN0aW9uXyA9IHRydWU7CisgIHNlbGVjdGlvbl8uc3RhcnRfaWR4ID0gc3RhcnRfaWR4OworICBzZWxlY3Rpb25fLmNvdW50ID0gY291bnQ7Cit9CisKK1dpZGVTdHJpbmcgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6R2V0U2VsZWN0ZWRUZXh0KCkgY29uc3QgeworICBpZiAoIWhhc19zZWxlY3Rpb25fKQorICAgIHJldHVybiBMIiI7CisKKyAgV2lkZVN0cmluZyB0ZXh0OworICBpZiAoc2VsZWN0aW9uXy5zdGFydF9pZHggPCBnYXBfcG9zaXRpb25fKSB7CisgICAgLy8gRnVsbHkgb24gbGVmdCBvZiBnYXAuCisgICAgaWYgKHNlbGVjdGlvbl8uc3RhcnRfaWR4ICsgc2VsZWN0aW9uXy5jb3VudCA8IGdhcF9wb3NpdGlvbl8pIHsKKyAgICAgIHRleHQgKz0gV2lkZVN0cmluZ1ZpZXcoY29udGVudF8uZGF0YSgpICsgc2VsZWN0aW9uXy5zdGFydF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbl8uY291bnQpOworICAgICAgcmV0dXJuIHRleHQ7CisgICAgfQorCisgICAgLy8gUHJlLWdhcCB0ZXh0CisgICAgdGV4dCArPSBXaWRlU3RyaW5nVmlldyhjb250ZW50Xy5kYXRhKCkgKyBzZWxlY3Rpb25fLnN0YXJ0X2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhcF9wb3NpdGlvbl8gLSBzZWxlY3Rpb25fLnN0YXJ0X2lkeCk7CisKKyAgICBpZiAoc2VsZWN0aW9uXy5jb3VudCAtIChnYXBfcG9zaXRpb25fIC0gc2VsZWN0aW9uXy5zdGFydF9pZHgpID4gMCkgeworICAgICAgLy8gUG9zdC1nYXAgdGV4dAorICAgICAgdGV4dCArPSBXaWRlU3RyaW5nVmlldygKKyAgICAgICAgICBjb250ZW50Xy5kYXRhKCkgKyBnYXBfcG9zaXRpb25fICsgZ2FwX3NpemVfLAorICAgICAgICAgIHNlbGVjdGlvbl8uY291bnQgLSAoZ2FwX3Bvc2l0aW9uXyAtIHNlbGVjdGlvbl8uc3RhcnRfaWR4KSk7CisgICAgfQorCisgICAgcmV0dXJuIHRleHQ7CisgIH0KKworICAvLyBGdWxseSByaWdodCBvZiBnYXAKKyAgdGV4dCArPSBXaWRlU3RyaW5nVmlldyhjb250ZW50Xy5kYXRhKCkgKyBnYXBfc2l6ZV8gKyBzZWxlY3Rpb25fLnN0YXJ0X2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25fLmNvdW50KTsKKyAgcmV0dXJuIHRleHQ7Cit9CisKK1dpZGVTdHJpbmcgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6RGVsZXRlU2VsZWN0ZWRUZXh0KAorICAgIFJlY29yZE9wZXJhdGlvbiBhZGRfb3BlcmF0aW9uKSB7CisgIGlmICghaGFzX3NlbGVjdGlvbl8pCisgICAgcmV0dXJuIEwiIjsKKworICByZXR1cm4gRGVsZXRlKHNlbGVjdGlvbl8uc3RhcnRfaWR4LCBzZWxlY3Rpb25fLmNvdW50LCBhZGRfb3BlcmF0aW9uKTsKK30KKworV2lkZVN0cmluZyBDRkRFX1RleHRFZGl0RW5naW5lOjpEZWxldGUoc2l6ZV90IHN0YXJ0X2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmRPcGVyYXRpb24gYWRkX29wZXJhdGlvbikgeworICBpZiAoc3RhcnRfaWR4ID49IHRleHRfbGVuZ3RoXykKKyAgICByZXR1cm4gTCIiOworCisgIGxlbmd0aCA9IHN0ZDo6bWluKGxlbmd0aCwgdGV4dF9sZW5ndGhfIC0gc3RhcnRfaWR4KTsKKyAgQWRqdXN0R2FwKHN0YXJ0X2lkeCArIGxlbmd0aCwgMCk7CisKKyAgV2lkZVN0cmluZyByZXQ7CisgIHJldCArPSBXaWRlU3RyaW5nVmlldyhjb250ZW50Xy5kYXRhKCkgKyBzdGFydF9pZHgsIGxlbmd0aCk7CisKKyAgaWYgKGFkZF9vcGVyYXRpb24gPT0gUmVjb3JkT3BlcmF0aW9uOjprSW5zZXJ0UmVjb3JkKSB7CisgICAgQWRkT3BlcmF0aW9uUmVjb3JkKAorICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8RGVsZXRlT3BlcmF0aW9uPih0aGlzLCBzdGFydF9pZHgsIHJldCkpOworICB9CisKKyAgV2lkZVN0cmluZyBwcmV2aW91c190ZXh0ID0gR2V0VGV4dCgpOworCisgIGdhcF9wb3NpdGlvbl8gPSBzdGFydF9pZHg7CisgIGdhcF9zaXplXyArPSBsZW5ndGg7CisKKyAgdGV4dF9sZW5ndGhfIC09IGxlbmd0aDsKKyAgQ2xlYXJTZWxlY3Rpb24oKTsKKworICBpZiAoZGVsZWdhdGVfKQorICAgIGRlbGVnYXRlXy0+T25UZXh0Q2hhbmdlZChwcmV2aW91c190ZXh0KTsKKworICByZXR1cm4gcmV0OworfQorCit2b2lkIENGREVfVGV4dEVkaXRFbmdpbmU6OlJlcGxhY2VTZWxlY3RlZFRleHQoY29uc3QgV2lkZVN0cmluZyYgcmVwKSB7CisgIHNpemVfdCBzdGFydF9pZHggPSBzZWxlY3Rpb25fLnN0YXJ0X2lkeDsKKworICBXaWRlU3RyaW5nIHR4dCA9IERlbGV0ZVNlbGVjdGVkVGV4dChSZWNvcmRPcGVyYXRpb246OmtTa2lwUmVjb3JkKTsKKyAgSW5zZXJ0KGdhcF9wb3NpdGlvbl8sIHJlcCwgUmVjb3JkT3BlcmF0aW9uOjprU2tpcFJlY29yZCk7CisKKyAgQWRkT3BlcmF0aW9uUmVjb3JkKAorICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPFJlcGxhY2VPcGVyYXRpb24+KHRoaXMsIHN0YXJ0X2lkeCwgdHh0LCByZXApKTsKK30KKworV2lkZVN0cmluZyBDRkRFX1RleHRFZGl0RW5naW5lOjpHZXRUZXh0KCkgY29uc3QgeworICBXaWRlU3RyaW5nIHN0cjsKKyAgaWYgKGdhcF9wb3NpdGlvbl8gPiAwKQorICAgIHN0ciArPSBXaWRlU3RyaW5nVmlldyhjb250ZW50Xy5kYXRhKCksIGdhcF9wb3NpdGlvbl8pOworICBpZiAodGV4dF9sZW5ndGhfIC0gZ2FwX3Bvc2l0aW9uXyA+IDApIHsKKyAgICBzdHIgKz0gV2lkZVN0cmluZ1ZpZXcoY29udGVudF8uZGF0YSgpICsgZ2FwX3Bvc2l0aW9uXyArIGdhcF9zaXplXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9sZW5ndGhfIC0gZ2FwX3Bvc2l0aW9uXyk7CisgIH0KKyAgcmV0dXJuIHN0cjsKK30KKworc2l6ZV90IENGREVfVGV4dEVkaXRFbmdpbmU6OkdldExlbmd0aCgpIGNvbnN0IHsKKyAgcmV0dXJuIHRleHRfbGVuZ3RoXzsKK30KKword2NoYXJfdCBDRkRFX1RleHRFZGl0RW5naW5lOjpHZXRDaGFyKHNpemVfdCBpZHgpIGNvbnN0IHsKKyAgaWYgKGlkeCA+PSB0ZXh0X2xlbmd0aF8pCisgICAgcmV0dXJuIEwnXDAnOworICBpZiAocGFzc3dvcmRfbW9kZV8pCisgICAgcmV0dXJuIHBhc3N3b3JkX2FsaWFzXzsKKworICByZXR1cm4gaWR4IDwgZ2FwX3Bvc2l0aW9uXworICAgICAgICAgICAgID8gY29udGVudF9baWR4XQorICAgICAgICAgICAgIDogY29udGVudF9bZ2FwX3Bvc2l0aW9uXyArIGdhcF9zaXplXyArIChpZHggLSBnYXBfcG9zaXRpb25fKV07Cit9CisKK3NpemVfdCBDRkRFX1RleHRFZGl0RW5naW5lOjpHZXRXaWR0aE9mQ2hhcihzaXplX3QgaWR4KSB7CisgIC8vIFJlY2FsY3VsYXRlIHRoZSB3aWR0aHMgaWYgbmVjZXNzYXJ5LgorICBMYXlvdXQoKTsKKyAgcmV0dXJuIGlkeCA8IGNoYXJfd2lkdGhzXy5zaXplKCkgPyBjaGFyX3dpZHRoc19baWR4XSA6IDA7Cit9CisKK3NpemVfdCBDRkRFX1RleHRFZGl0RW5naW5lOjpHZXRJbmRleEZvclBvaW50KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIC8vIFJlY2FsY3VsYXRlIHRoZSB3aWR0aHMgaWYgbmVjZXNzYXJ5LgorICBMYXlvdXQoKTsKKworICBhdXRvIHN0YXJ0X2l0ID0gdGV4dF9waWVjZV9pbmZvXy5iZWdpbigpOworICBmb3IgKDsgc3RhcnRfaXQgPCB0ZXh0X3BpZWNlX2luZm9fLmVuZCgpOyArK3N0YXJ0X2l0KSB7CisgICAgaWYgKHN0YXJ0X2l0LT5ydFBpZWNlLnRvcCA8PSBwb2ludC55ICYmCisgICAgICAgIHBvaW50LnkgPCBzdGFydF9pdC0+cnRQaWVjZS5ib3R0b20oKSkKKyAgICAgIGJyZWFrOworICB9CisgIC8vIFdlIGRpZG4ndCBmaW5kIHRoZSBwb2ludCBiZWZvcmUgZ2V0dGluZyB0byB0aGUgZW5kIG9mIHRoZSB0ZXh0LCByZXR1cm4KKyAgLy8gZW5kIG9mIHRleHQuCisgIGlmIChzdGFydF9pdCA9PSB0ZXh0X3BpZWNlX2luZm9fLmVuZCgpKQorICAgIHJldHVybiB0ZXh0X2xlbmd0aF87CisKKyAgYXV0byBlbmRfaXQgPSBzdGFydF9pdDsKKyAgZm9yICg7IGVuZF9pdCA8IHRleHRfcGllY2VfaW5mb18uZW5kKCk7ICsrZW5kX2l0KSB7CisgICAgLy8gV2UndmUgbW92ZWQgcGFzdCB3aGVyZSB0aGUgcG9pbnQgc2hvdWxkIGJlIGFuZCBkaWRuJ3QgZmluZCBhbnl0aGluZy4KKyAgICAvLyBSZXR1cm4gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHBpZWNlIGFzIHRoZSBsb2NhdGlvbi4KKyAgICBpZiAoZW5kX2l0LT5ydFBpZWNlLmJvdHRvbSgpIDw9IHBvaW50LnkgfHwgcG9pbnQueSA8IGVuZF9pdC0+cnRQaWVjZS50b3ApCisgICAgICBicmVhazsKKyAgfQorICAvLyBNYWtlIHN1cmUgdGhlIGVuZCBpdGVyYXRvciBpcyBwb2ludGluZyB0byBvdXIgdGV4dCBwaWVjZXMuCisgIGlmIChlbmRfaXQgPT0gdGV4dF9waWVjZV9pbmZvXy5lbmQoKSkKKyAgICAtLWVuZF9pdDsKKworICBzaXplX3Qgc3RhcnRfaXRfaWR4ID0gc3RhcnRfaXQtPm5TdGFydDsKKyAgZm9yICg7IHN0YXJ0X2l0IDw9IGVuZF9pdDsgKytzdGFydF9pdCkgeworICAgIGlmICghc3RhcnRfaXQtPnJ0UGllY2UuQ29udGFpbnMocG9pbnQpKQorICAgICAgY29udGludWU7CisKKyAgICBzdGQ6OnZlY3RvcjxDRlhfUmVjdEY+IHJlY3RzID0gR2V0Q2hhclJlY3RzKCpzdGFydF9pdCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWN0cy5zaXplKCk7ICsraSkgeworICAgICAgaWYgKCFyZWN0c1tpXS5Db250YWlucyhwb2ludCkpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgc2l6ZV90IHBvcyA9IHN0YXJ0X2l0LT5uU3RhcnQgKyBpOworICAgICAgaWYgKHBvcyA+PSB0ZXh0X2xlbmd0aF8pCisgICAgICAgIHJldHVybiB0ZXh0X2xlbmd0aF87CisKKyAgICAgIHdjaGFyX3Qgd2NoID0gR2V0Q2hhcihwb3MpOworICAgICAgaWYgKHdjaCA9PSBMJ1xuJyB8fCB3Y2ggPT0gTCdccicpIHsKKyAgICAgICAgaWYgKHdjaCA9PSBMJ1xuJyAmJiBwb3MgPiAwICYmIEdldENoYXIocG9zIC0gMSkgPT0gTCdccicpCisgICAgICAgICAgLS1wb3M7CisgICAgICAgIHJldHVybiBwb3M7CisgICAgICB9CisKKyAgICAgIC8vIFRPRE8oZHNpbmNsYWlyKTogT2xkIGNvZGUgaGFkIGEgYmVmb3JlIGZsYWcgc2V0IGJhc2VkIG9uIGJpZGk/CisgICAgICByZXR1cm4gcG9zOworICAgIH0KKyAgfQorCisgIGlmIChzdGFydF9pdCA9PSB0ZXh0X3BpZWNlX2luZm9fLmVuZCgpKQorICAgIHJldHVybiBzdGFydF9pdF9pZHg7CisgIGlmIChzdGFydF9pdCA9PSBlbmRfaXQpCisgICAgcmV0dXJuIHN0YXJ0X2l0LT5uU3RhcnQ7CisKKyAgLy8gV2UgZGlkbid0IGZpbmQgdGhlIHBvaW50IGJlZm9yZSBnb2luZyBvdmVyIGFsbCBvZiB0aGUgcGllY2VzLCB3ZSB3YW50IHRvCisgIC8vIHJldHVybiB0aGUgc3RhcnQgb2YgdGhlIHBpZWNlIGFmdGVyIHRoZSBwb2ludC4KKyAgcmV0dXJuIGVuZF9pdC0+blN0YXJ0OworfQorCitzdGQ6OnZlY3RvcjxDRlhfUmVjdEY+IENGREVfVGV4dEVkaXRFbmdpbmU6OkdldENoYXJSZWN0cygKKyAgICBjb25zdCBGREVfVEVYVEVESVRQSUVDRSYgcGllY2UpIHsKKyAgaWYgKHBpZWNlLm5Db3VudCA8IDEpCisgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPENGWF9SZWN0Rj4oKTsKKworICBGWF9UWFRSVU4gdHI7CisgIHRyLnBFZHRFbmdpbmUgPSB0aGlzOworICB0ci5wSWRlbnRpdHkgPSAmcGllY2U7CisgIHRyLmlMZW5ndGggPSBwaWVjZS5uQ291bnQ7CisgIHRyLnBGb250ID0gZm9udF87CisgIHRyLmZGb250U2l6ZSA9IGZvbnRfc2l6ZV87CisgIHRyLmR3U3R5bGVzID0gdGV4dF9icmVha18uR2V0TGF5b3V0U3R5bGVzKCk7CisgIHRyLmR3Q2hhclN0eWxlcyA9IHBpZWNlLmR3Q2hhclN0eWxlczsKKyAgdHIucFJlY3QgPSAmcGllY2UucnRQaWVjZTsKKyAgcmV0dXJuIHRleHRfYnJlYWtfLkdldENoYXJSZWN0cygmdHIsIGZhbHNlKTsKK30KKworc3RkOjp2ZWN0b3I8RlhURVhUX0NIQVJQT1M+IENGREVfVGV4dEVkaXRFbmdpbmU6OkdldERpc3BsYXlQb3MoCisgICAgY29uc3QgRkRFX1RFWFRFRElUUElFQ0UmIHBpZWNlKSB7CisgIGlmIChwaWVjZS5uQ291bnQgPCAxKQorICAgIHJldHVybiBzdGQ6OnZlY3RvcjxGWFRFWFRfQ0hBUlBPUz4oKTsKKworICBGWF9UWFRSVU4gdHI7CisgIHRyLnBFZHRFbmdpbmUgPSB0aGlzOworICB0ci5wSWRlbnRpdHkgPSAmcGllY2U7CisgIHRyLmlMZW5ndGggPSBwaWVjZS5uQ291bnQ7CisgIHRyLnBGb250ID0gZm9udF87CisgIHRyLmZGb250U2l6ZSA9IGZvbnRfc2l6ZV87CisgIHRyLmR3U3R5bGVzID0gdGV4dF9icmVha18uR2V0TGF5b3V0U3R5bGVzKCk7CisgIHRyLmR3Q2hhclN0eWxlcyA9IHBpZWNlLmR3Q2hhclN0eWxlczsKKyAgdHIucFJlY3QgPSAmcGllY2UucnRQaWVjZTsKKworICBzdGQ6OnZlY3RvcjxGWFRFWFRfQ0hBUlBPUz4gZGF0YSh0ZXh0X2JyZWFrXy5HZXREaXNwbGF5UG9zKCZ0ciwgbnVsbHB0cikpOworICB0ZXh0X2JyZWFrXy5HZXREaXNwbGF5UG9zKCZ0ciwgZGF0YS5kYXRhKCkpOworICByZXR1cm4gZGF0YTsKK30KKwordm9pZCBDRkRFX1RleHRFZGl0RW5naW5lOjpSZWJ1aWxkUGllY2VzKCkgeworICB0ZXh0X2JyZWFrXy5FbmRCcmVhayhDRlhfQnJlYWtUeXBlOjpQYXJhZ3JhcGgpOworICB0ZXh0X2JyZWFrXy5DbGVhckJyZWFrUGllY2VzKCk7CisKKyAgY2hhcl93aWR0aHNfLmNsZWFyKCk7CisgIHRleHRfcGllY2VfaW5mb18uY2xlYXIoKTsKKworICAvLyBNdXN0IGhhdmUgYSBmb250IHNldCBpbiBvcmRlciB0byBicmVhayB0aGUgdGV4dC4KKyAgaWYgKHRleHRfbGVuZ3RoXyA9PSAwIHx8ICFmb250XykKKyAgICByZXR1cm47CisKKyAgYm9vbCBpbml0aWFsaXplZF9ib3VuZGluZ19ib3ggPSBmYWxzZTsKKyAgY29udGVudHNfYm91bmRpbmdfYm94XyA9IENGWF9SZWN0RigpOworICBzaXplX3QgY3VycmVudF9waWVjZV9zdGFydCA9IDA7CisgIGZsb2F0IGN1cnJlbnRfbGluZV9zdGFydCA9IDA7CisKKyAgYXV0byBpdGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGREVfVGV4dEVkaXRFbmdpbmU6Okl0ZXJhdG9yPih0aGlzKTsKKyAgd2hpbGUgKCFpdGVyLT5Jc0VPRihmYWxzZSkpIHsKKyAgICBpdGVyLT5OZXh0KGZhbHNlKTsKKworICAgIENGWF9CcmVha1R5cGUgYnJlYWtfc3RhdHVzID0gdGV4dF9icmVha18uQXBwZW5kQ2hhcigKKyAgICAgICAgcGFzc3dvcmRfbW9kZV8gPyBwYXNzd29yZF9hbGlhc18gOiBpdGVyLT5HZXRDaGFyKCkpOworICAgIGlmIChpdGVyLT5Jc0VPRihmYWxzZSkgJiYgQ0ZYX0JyZWFrVHlwZU5vbmVPclBpZWNlKGJyZWFrX3N0YXR1cykpCisgICAgICBicmVha19zdGF0dXMgPSB0ZXh0X2JyZWFrXy5FbmRCcmVhayhDRlhfQnJlYWtUeXBlOjpQYXJhZ3JhcGgpOworCisgICAgaWYgKENGWF9CcmVha1R5cGVOb25lT3JQaWVjZShicmVha19zdGF0dXMpKQorICAgICAgY29udGludWU7CisgICAgaW50MzJfdCBwaWVjZV9jb3VudCA9IHRleHRfYnJlYWtfLkNvdW50QnJlYWtQaWVjZXMoKTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwaWVjZV9jb3VudDsgKytpKSB7CisgICAgICBjb25zdCBDRlhfQnJlYWtQaWVjZSogcGllY2UgPSB0ZXh0X2JyZWFrXy5HZXRCcmVha1BpZWNlVW5zdGFibGUoaSk7CisKKyAgICAgIEZERV9URVhURURJVFBJRUNFIHR4dEVkdFBpZWNlOworICAgICAgbWVtc2V0KCZ0eHRFZHRQaWVjZSwgMCwgc2l6ZW9mKEZERV9URVhURURJVFBJRUNFKSk7CisKKyAgICAgIHR4dEVkdFBpZWNlLm5CaWRpTGV2ZWwgPSBwaWVjZS0+bV9pQmlkaUxldmVsOworICAgICAgdHh0RWR0UGllY2UubkNvdW50ID0gcGllY2UtPkdldExlbmd0aCgpOworICAgICAgdHh0RWR0UGllY2UublN0YXJ0ID0gY3VycmVudF9waWVjZV9zdGFydDsKKyAgICAgIHR4dEVkdFBpZWNlLmR3Q2hhclN0eWxlcyA9IHBpZWNlLT5tX2R3Q2hhclN0eWxlczsKKyAgICAgIGlmIChGWF9Jc09kZChwaWVjZS0+bV9pQmlkaUxldmVsKSkKKyAgICAgICAgdHh0RWR0UGllY2UuZHdDaGFyU3R5bGVzIHw9IEZYX1RYVENIQVJTVFlMRV9PZGRCaWRpTGV2ZWw7CisKKyAgICAgIHR4dEVkdFBpZWNlLnJ0UGllY2UubGVmdCA9IHBpZWNlLT5tX2lTdGFydFBvcyAvIDIwMDAwLjBmOworICAgICAgdHh0RWR0UGllY2UucnRQaWVjZS50b3AgPSBjdXJyZW50X2xpbmVfc3RhcnQ7CisgICAgICB0eHRFZHRQaWVjZS5ydFBpZWNlLndpZHRoID0gcGllY2UtPm1faVdpZHRoIC8gMjAwMDAuMGY7CisgICAgICB0eHRFZHRQaWVjZS5ydFBpZWNlLmhlaWdodCA9IGxpbmVfc3BhY2luZ187CisgICAgICB0ZXh0X3BpZWNlX2luZm9fLnB1c2hfYmFjayh0eHRFZHRQaWVjZSk7CisKKyAgICAgIGlmIChpbml0aWFsaXplZF9ib3VuZGluZ19ib3gpIHsKKyAgICAgICAgY29udGVudHNfYm91bmRpbmdfYm94Xy5Vbmlvbih0eHRFZHRQaWVjZS5ydFBpZWNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnRlbnRzX2JvdW5kaW5nX2JveF8gPSB0eHRFZHRQaWVjZS5ydFBpZWNlOworICAgICAgICBpbml0aWFsaXplZF9ib3VuZGluZ19ib3ggPSB0cnVlOworICAgICAgfQorCisgICAgICBjdXJyZW50X3BpZWNlX3N0YXJ0ICs9IHR4dEVkdFBpZWNlLm5Db3VudDsKKyAgICAgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IHR4dEVkdFBpZWNlLm5Db3VudDsgKytrKQorICAgICAgICBjaGFyX3dpZHRoc18ucHVzaF9iYWNrKHBpZWNlLT5HZXRDaGFyKGspLT5tX2lDaGFyV2lkdGgpOworICAgIH0KKworICAgIGN1cnJlbnRfbGluZV9zdGFydCArPSBsaW5lX3NwYWNpbmdfOworICAgIHRleHRfYnJlYWtfLkNsZWFyQnJlYWtQaWVjZXMoKTsKKyAgfQorCisgIGZsb2F0IGRlbHRhID0gMC4wOworICBib29sIGJvdW5kc19zbWFsbGVyID0gY29udGVudHNfYm91bmRpbmdfYm94Xy53aWR0aCA8IGF2YWlsYWJsZV93aWR0aF87CisgIGlmIChJc0FsaWduZWRSaWdodCgpICYmIGJvdW5kc19zbWFsbGVyKSB7CisgICAgZGVsdGEgPSBhdmFpbGFibGVfd2lkdGhfIC0gY29udGVudHNfYm91bmRpbmdfYm94Xy53aWR0aDsKKyAgfSBlbHNlIGlmIChJc0FsaWduZWRDZW50ZXIoKSAmJiBib3VuZHNfc21hbGxlcikgeworICAgIC8vIFRPRE8oZHNpbmNsYWlyKTogT2xkIGNvZGUgdXNlZCBDb21iVGV4dCBoZXJlIGFuZCBzZXQgdGhlIHNwYWNlIHRvCisgICAgLy8gc29tZXRoaW5nIHVucmVsYXRlZCB0byB0aGUgYXZhaWxhYmxlIHdpZHRoIC4uLi4gRmlndXJlIG91dCBpZiB0aGlzIGlzCisgICAgLy8gbmVlZGVkIGFuZCB3aGF0IGl0IHNob3VsZCBkby4KKyAgICAvLyBpZiAoaXNfY29tYl90ZXh0XykgeworICAgIC8vIH0gZWxzZSB7CisgICAgZGVsdGEgPSAoYXZhaWxhYmxlX3dpZHRoXyAtIGNvbnRlbnRzX2JvdW5kaW5nX2JveF8ud2lkdGgpIC8gMi4wZjsKKyAgICAvLyB9CisgIH0KKworICBpZiAoZGVsdGEgIT0gMC4wKSB7CisgICAgZmxvYXQgb2Zmc2V0ID0gZGVsdGEgLSBjb250ZW50c19ib3VuZGluZ19ib3hfLmxlZnQ7CisgICAgZm9yIChhdXRvJiBpbmZvIDogdGV4dF9waWVjZV9pbmZvXykKKyAgICAgIGluZm8ucnRQaWVjZS5PZmZzZXQob2Zmc2V0LCAwLjBmKTsKKyAgICBjb250ZW50c19ib3VuZGluZ19ib3hfLk9mZnNldChvZmZzZXQsIDAuMGYpOworICB9CisKKyAgLy8gU2hyaW5rIHRoZSBsYXN0IHBpZWNlIGRvd24gdG8gdGhlIGZvbnRfc2l6ZS4KKyAgY29udGVudHNfYm91bmRpbmdfYm94Xy5oZWlnaHQgLT0gbGluZV9zcGFjaW5nXyAtIGZvbnRfc2l6ZV87CisgIHRleHRfcGllY2VfaW5mb18uYmFjaygpLnJ0UGllY2UuaGVpZ2h0ID0gZm9udF9zaXplXzsKK30KKworc3RkOjpwYWlyPGludDMyX3QsIENGWF9SZWN0Rj4gQ0ZERV9UZXh0RWRpdEVuZ2luZTo6R2V0Q2hhcmFjdGVySW5mbygKKyAgICBpbnQzMl90IHN0YXJ0X2lkeCkgeworICBBU1NFUlQoc3RhcnRfaWR4ID49IDApOworICBBU1NFUlQoc3RhdGljX2Nhc3Q8c2l6ZV90PihzdGFydF9pZHgpIDw9IHRleHRfbGVuZ3RoXyk7CisKKyAgLy8gTWFrZSBzdXJlIHRoZSBjdXJyZW50IGF2YWlsYWJsZSBkYXRhIGlzIGZyZXNoLgorICBMYXlvdXQoKTsKKworICBhdXRvIGl0ID0gdGV4dF9waWVjZV9pbmZvXy5iZWdpbigpOworICBmb3IgKDsgaXQgIT0gdGV4dF9waWVjZV9pbmZvXy5lbmQoKTsgKytpdCkgeworICAgIGlmIChpdC0+blN0YXJ0IDw9IHN0YXJ0X2lkeCAmJiBzdGFydF9pZHggPCBpdC0+blN0YXJ0ICsgaXQtPm5Db3VudCkKKyAgICAgIGJyZWFrOworICB9CisgIGlmIChpdCA9PSB0ZXh0X3BpZWNlX2luZm9fLmVuZCgpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiB7MCwgQ0ZYX1JlY3RGKCl9OworICB9CisKKyAgcmV0dXJuIHtpdC0+bkJpZGlMZXZlbCwgR2V0Q2hhclJlY3RzKCppdClbc3RhcnRfaWR4IC0gaXQtPm5TdGFydF19OworfQorCitzdGQ6OnZlY3RvcjxDRlhfUmVjdEY+IENGREVfVGV4dEVkaXRFbmdpbmU6OkdldENoYXJhY3RlclJlY3RzSW5SYW5nZSgKKyAgICBpbnQzMl90IHN0YXJ0X2lkeCwKKyAgICBpbnQzMl90IGNvdW50KSB7CisgIC8vIE1ha2Ugc3VyZSB0aGUgY3VycmVudCBhdmFpbGFibGUgZGF0YSBpcyBmcmVzaC4KKyAgTGF5b3V0KCk7CisKKyAgYXV0byBpdCA9IHRleHRfcGllY2VfaW5mb18uYmVnaW4oKTsKKyAgZm9yICg7IGl0ICE9IHRleHRfcGllY2VfaW5mb18uZW5kKCk7ICsraXQpIHsKKyAgICBpZiAoaXQtPm5TdGFydCA8PSBzdGFydF9pZHggJiYgc3RhcnRfaWR4IDwgaXQtPm5TdGFydCArIGl0LT5uQ291bnQpCisgICAgICBicmVhazsKKyAgfQorICBpZiAoaXQgPT0gdGV4dF9waWVjZV9pbmZvXy5lbmQoKSkKKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8Q0ZYX1JlY3RGPigpOworCisgIGludDMyX3QgZW5kX2lkeCA9IHN0YXJ0X2lkeCArIGNvdW50IC0gMTsKKyAgc3RkOjp2ZWN0b3I8Q0ZYX1JlY3RGPiByZWN0czsKKyAgd2hpbGUgKGl0ICE9IHRleHRfcGllY2VfaW5mb18uZW5kKCkpIHsKKyAgICAvLyBJZiB3ZSBlbmQgaW5zaWRlIHRoZSBjdXJyZW50IHBpZWNlLCBleHRyYWN0IHdoYXQgd2UgbmVlZCBhbmQgd2UncmUgZG9uZS4KKyAgICBpZiAoaXQtPm5TdGFydCA8PSBlbmRfaWR4ICYmIGVuZF9pZHggPCBpdC0+blN0YXJ0ICsgaXQtPm5Db3VudCkgeworICAgICAgc3RkOjp2ZWN0b3I8Q0ZYX1JlY3RGPiBhcnIgPSBHZXRDaGFyUmVjdHMoKml0KTsKKyAgICAgIENGWF9SZWN0RiBwaWVjZSA9IGFyclswXTsKKyAgICAgIHBpZWNlLlVuaW9uKGFycltlbmRfaWR4IC0gaXQtPm5TdGFydF0pOworICAgICAgcmVjdHMucHVzaF9iYWNrKHBpZWNlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICByZWN0cy5wdXNoX2JhY2soaXQtPnJ0UGllY2UpOworICAgICsraXQ7CisgIH0KKworICByZXR1cm4gcmVjdHM7Cit9CisKK3N0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4gQ0ZERV9UZXh0RWRpdEVuZ2luZTo6Qm91bmRzRm9yV29yZEF0KAorICAgIHNpemVfdCBpZHgpIGNvbnN0IHsKKyAgaWYgKGlkeCA+IHRleHRfbGVuZ3RoXykKKyAgICByZXR1cm4gezAsIDB9OworCisgIENGREVfVGV4dEVkaXRFbmdpbmU6Okl0ZXJhdG9yIGl0ZXIodGhpcyk7CisgIGl0ZXIuU2V0QXQoaWR4KTsKKworICBzaXplX3Qgc3RhcnRfaWR4ID0gaXRlci5GaW5kTmV4dEJyZWFrUG9zKHRydWUpOworICBzaXplX3QgZW5kX2lkeCA9IGl0ZXIuRmluZE5leHRCcmVha1BvcyhmYWxzZSk7CisgIHJldHVybiB7c3RhcnRfaWR4LCBlbmRfaWR4IC0gc3RhcnRfaWR4ICsgMX07Cit9CisKK0NGREVfVGV4dEVkaXRFbmdpbmU6Okl0ZXJhdG9yOjpJdGVyYXRvcihjb25zdCBDRkRFX1RleHRFZGl0RW5naW5lKiBlbmdpbmUpCisgICAgOiBlbmdpbmVfKGVuZ2luZSksIGN1cnJlbnRfcG9zaXRpb25fKC0xKSB7fQorCitDRkRFX1RleHRFZGl0RW5naW5lOjpJdGVyYXRvcjo6fkl0ZXJhdG9yKCkge30KKwordm9pZCBDRkRFX1RleHRFZGl0RW5naW5lOjpJdGVyYXRvcjo6TmV4dChib29sIGJQcmV2KSB7CisgIGlmIChiUHJldiAmJiBjdXJyZW50X3Bvc2l0aW9uXyA9PSAtMSkKKyAgICByZXR1cm47CisgIGlmICghYlByZXYgJiYgY3VycmVudF9wb3NpdGlvbl8gPiAtMSAmJgorICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihjdXJyZW50X3Bvc2l0aW9uXykgPT0gZW5naW5lXy0+R2V0TGVuZ3RoKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoYlByZXYpCisgICAgLS1jdXJyZW50X3Bvc2l0aW9uXzsKKyAgZWxzZQorICAgICsrY3VycmVudF9wb3NpdGlvbl87Cit9CisKK3djaGFyX3QgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6SXRlcmF0b3I6OkdldENoYXIoKSBjb25zdCB7CisgIHJldHVybiBlbmdpbmVfLT5HZXRDaGFyKGN1cnJlbnRfcG9zaXRpb25fKTsKK30KKwordm9pZCBDRkRFX1RleHRFZGl0RW5naW5lOjpJdGVyYXRvcjo6U2V0QXQoc2l6ZV90IG5JbmRleCkgeworICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihuSW5kZXgpID49IGVuZ2luZV8tPkdldExlbmd0aCgpKQorICAgIGN1cnJlbnRfcG9zaXRpb25fID0gZW5naW5lXy0+R2V0TGVuZ3RoKCk7CisgIGVsc2UKKyAgICBjdXJyZW50X3Bvc2l0aW9uXyA9IG5JbmRleDsKK30KKworYm9vbCBDRkRFX1RleHRFZGl0RW5naW5lOjpJdGVyYXRvcjo6SXNFT0YoYm9vbCBiUHJldikgY29uc3QgeworICByZXR1cm4gYlByZXYgPyBjdXJyZW50X3Bvc2l0aW9uXyA9PSAtMQorICAgICAgICAgICAgICAgOiBjdXJyZW50X3Bvc2l0aW9uXyA+IC0xICYmCisgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KGN1cnJlbnRfcG9zaXRpb25fKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgIGVuZ2luZV8tPkdldExlbmd0aCgpOworfQorCitzaXplX3QgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6SXRlcmF0b3I6OkZpbmROZXh0QnJlYWtQb3MoYm9vbCBiUHJldikgeworICBpZiAoSXNFT0YoYlByZXYpKQorICAgIHJldHVybiBjdXJyZW50X3Bvc2l0aW9uXyA+IC0xID8gY3VycmVudF9wb3NpdGlvbl8gOiAwOworCisgIFdvcmRCcmVha1Byb3BlcnR5IGVQcmVUeXBlID0gV29yZEJyZWFrUHJvcGVydHk6OmtOb25lOworICBpZiAoIUlzRU9GKCFiUHJldikpIHsKKyAgICBOZXh0KCFiUHJldik7CisgICAgZVByZVR5cGUgPSBHZXRXb3JkQnJlYWtQcm9wZXJ0eShHZXRDaGFyKCkpOworICAgIE5leHQoYlByZXYpOworICB9CisKKyAgV29yZEJyZWFrUHJvcGVydHkgZUN1clR5cGUgPSBHZXRXb3JkQnJlYWtQcm9wZXJ0eShHZXRDaGFyKCkpOworICBib29sIGJGaXJzdCA9IHRydWU7CisgIHdoaWxlICghSXNFT0YoYlByZXYpKSB7CisgICAgTmV4dChiUHJldik7CisKKyAgICBXb3JkQnJlYWtQcm9wZXJ0eSBlTmV4dFR5cGUgPSBHZXRXb3JkQnJlYWtQcm9wZXJ0eShHZXRDaGFyKCkpOworICAgIGJvb2wgd0JyZWFrID0gQ2hlY2tTdGF0ZUNoYW5nZUZvcldvcmRCcmVhayhlQ3VyVHlwZSwgZU5leHRUeXBlKTsKKyAgICBpZiAod0JyZWFrKSB7CisgICAgICBpZiAoSXNFT0YoYlByZXYpKSB7CisgICAgICAgIE5leHQoIWJQcmV2KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoYkZpcnN0KSB7CisgICAgICAgIGludDMyX3QgbkZsYWdzID0gR2V0QnJlYWtGbGFnc0ZvcihlQ3VyVHlwZSwgZU5leHRUeXBlKTsKKyAgICAgICAgaWYgKG5GbGFncyA+IDApIHsKKyAgICAgICAgICBpZiAoQnJlYWtGbGFnc0NoYW5nZWQobkZsYWdzLCBlUHJlVHlwZSkpIHsKKyAgICAgICAgICAgIE5leHQoIWJQcmV2KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBOZXh0KGJQcmV2KTsKKyAgICAgICAgICB3QnJlYWsgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHdCcmVhaykgeworICAgICAgICBpbnQzMl90IG5GbGFncyA9IEdldEJyZWFrRmxhZ3NGb3IoZU5leHRUeXBlLCBlQ3VyVHlwZSk7CisgICAgICAgIGlmIChuRmxhZ3MgPD0gMCkgeworICAgICAgICAgIE5leHQoIWJQcmV2KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIE5leHQoYlByZXYpOworICAgICAgICBlTmV4dFR5cGUgPSBHZXRXb3JkQnJlYWtQcm9wZXJ0eShHZXRDaGFyKCkpOworICAgICAgICBpZiAoQnJlYWtGbGFnc0NoYW5nZWQobkZsYWdzLCBlTmV4dFR5cGUpKSB7CisgICAgICAgICAgTmV4dCghYlByZXYpOworICAgICAgICAgIE5leHQoIWJQcmV2KTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBlQ3VyVHlwZSA9IGVOZXh0VHlwZTsKKyAgICBiRmlyc3QgPSBmYWxzZTsKKyAgfQorICByZXR1cm4gY3VycmVudF9wb3NpdGlvbl8gPiAtMSA/IGN1cnJlbnRfcG9zaXRpb25fIDogMDsKK30KZGlmZiAtLWdpdCBhL3hmYS9mZGUvY2ZkZV90ZXh0ZWRpdGVuZ2luZS5oIGIveGZhL2ZkZS9jZmRlX3RleHRlZGl0ZW5naW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThmNzdlZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9mZGUvY2ZkZV90ZXh0ZWRpdGVuZ2luZS5oCkBAIC0wLDAgKzEsMjM5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZERV9DRkRFX1RFWFRFRElURU5HSU5FX0hfCisjZGVmaW5lIFhGQV9GREVfQ0ZERV9URVhURURJVEVOR0lORV9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9meF9kaWIuaCIKKyNpbmNsdWRlICJ4ZmEvZmdhcy9sYXlvdXQvY2Z4X3R4dGJyZWFrLmgiCisKK2NsYXNzIENGR0FTX0dFRm9udDsKKworc3RydWN0IEZERV9URVhURURJVFBJRUNFIHsKKyAgRkRFX1RFWFRFRElUUElFQ0UoKTsKKyAgRkRFX1RFWFRFRElUUElFQ0UoY29uc3QgRkRFX1RFWFRFRElUUElFQ0UmIHRoYXQpOworICB+RkRFX1RFWFRFRElUUElFQ0UoKTsKKworICBDRlhfUmVjdEYgcnRQaWVjZTsKKyAgaW50MzJfdCBuU3RhcnQgPSAwOworICBpbnQzMl90IG5Db3VudCA9IDA7CisgIGludDMyX3QgbkJpZGlMZXZlbCA9IDA7CisgIHVpbnQzMl90IGR3Q2hhclN0eWxlcyA9IDA7Cit9OworCitpbmxpbmUgRkRFX1RFWFRFRElUUElFQ0U6OkZERV9URVhURURJVFBJRUNFKCkgPSBkZWZhdWx0OworaW5saW5lIEZERV9URVhURURJVFBJRUNFOjpGREVfVEVYVEVESVRQSUVDRShjb25zdCBGREVfVEVYVEVESVRQSUVDRSYgdGhhdCkgPQorICAgIGRlZmF1bHQ7CitpbmxpbmUgRkRFX1RFWFRFRElUUElFQ0U6On5GREVfVEVYVEVESVRQSUVDRSgpID0gZGVmYXVsdDsKKworY2xhc3MgQ0ZERV9UZXh0RWRpdEVuZ2luZSB7CisgcHVibGljOgorICBjbGFzcyBJdGVyYXRvciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgSXRlcmF0b3IoY29uc3QgQ0ZERV9UZXh0RWRpdEVuZ2luZSogZW5naW5lKTsKKyAgICB+SXRlcmF0b3IoKTsKKworICAgIHZvaWQgTmV4dChib29sIGJQcmV2KTsKKyAgICB3Y2hhcl90IEdldENoYXIoKSBjb25zdDsKKyAgICB2b2lkIFNldEF0KHNpemVfdCBuSW5kZXgpOworICAgIHNpemVfdCBGaW5kTmV4dEJyZWFrUG9zKGJvb2wgYlByZXYpOworICAgIGJvb2wgSXNFT0YoYm9vbCBiUHJldikgY29uc3Q7CisKKyAgIHByaXZhdGU6CisgICAgVW5vd25lZFB0cjxjb25zdCBDRkRFX1RleHRFZGl0RW5naW5lPiBlbmdpbmVfOworICAgIGludDMyX3QgY3VycmVudF9wb3NpdGlvbl87CisgIH07CisKKyAgY2xhc3MgT3BlcmF0aW9uIHsKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5PcGVyYXRpb24oKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCB2b2lkIFJlZG8oKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCB2b2lkIFVuZG8oKSBjb25zdCA9IDA7CisgIH07CisKKyAgY2xhc3MgRGVsZWdhdGUgeworICAgcHVibGljOgorICAgIHZpcnR1YWwgfkRlbGVnYXRlKCkgPSBkZWZhdWx0OworICAgIHZpcnR1YWwgdm9pZCBOb3RpZnlUZXh0RnVsbCgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgT25DYXJldENoYW5nZWQoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIE9uVGV4dENoYW5nZWQoY29uc3QgV2lkZVN0cmluZyYgcHJldlRleHQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgT25TZWxDaGFuZ2VkKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBPblZhbGlkYXRlKGNvbnN0IFdpZGVTdHJpbmcmIHdzVGV4dCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBTZXRTY3JvbGxPZmZzZXQoZmxvYXQgZlNjcm9sbE9mZnNldCkgPSAwOworICB9OworCisgIGVudW0gY2xhc3MgUmVjb3JkT3BlcmF0aW9uIHsKKyAgICBrSW5zZXJ0UmVjb3JkLAorICAgIGtTa2lwUmVjb3JkLAorICB9OworCisgIENGREVfVGV4dEVkaXRFbmdpbmUoKTsKKyAgfkNGREVfVGV4dEVkaXRFbmdpbmUoKTsKKworICB2b2lkIFNldERlbGVnYXRlKERlbGVnYXRlKiBkZWxlZ2F0ZSkgeyBkZWxlZ2F0ZV8gPSBkZWxlZ2F0ZTsgfQorICB2b2lkIENsZWFyKCk7CisKKyAgdm9pZCBJbnNlcnQoc2l6ZV90IGlkeCwKKyAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgdGV4dCwKKyAgICAgICAgICAgICAgUmVjb3JkT3BlcmF0aW9uIGFkZF9vcGVyYXRpb24gPSBSZWNvcmRPcGVyYXRpb246OmtJbnNlcnRSZWNvcmQpOworICBXaWRlU3RyaW5nIERlbGV0ZSgKKyAgICAgIHNpemVfdCBzdGFydF9pZHgsCisgICAgICBzaXplX3QgbGVuZ3RoLAorICAgICAgUmVjb3JkT3BlcmF0aW9uIGFkZF9vcGVyYXRpb24gPSBSZWNvcmRPcGVyYXRpb246OmtJbnNlcnRSZWNvcmQpOworICBXaWRlU3RyaW5nIEdldFRleHQoKSBjb25zdDsKKyAgc2l6ZV90IEdldExlbmd0aCgpIGNvbnN0OworCisgIC8vIE5vbi1jb25zdCBzbyB3ZSBjYW4gZm9yY2UgYSBsYXlvdXQuCisgIENGWF9SZWN0RiBHZXRDb250ZW50c0JvdW5kaW5nQm94KCk7CisgIHZvaWQgU2V0QXZhaWxhYmxlV2lkdGgoc2l6ZV90IHdpZHRoKTsKKworICB2b2lkIFNldEZvbnQoUmV0YWluUHRyPENGR0FTX0dFRm9udD4gZm9udCk7CisgIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+IEdldEZvbnQoKSBjb25zdDsKKyAgdm9pZCBTZXRGb250U2l6ZShmbG9hdCBzaXplKTsKKyAgZmxvYXQgR2V0Rm9udFNpemUoKSBjb25zdCB7IHJldHVybiBmb250X3NpemVfOyB9CisgIHZvaWQgU2V0Rm9udENvbG9yKEZYX0FSR0IgY29sb3IpIHsgZm9udF9jb2xvcl8gPSBjb2xvcjsgfQorICBGWF9BUkdCIEdldEZvbnRDb2xvcigpIGNvbnN0IHsgcmV0dXJuIGZvbnRfY29sb3JfOyB9CisgIGZsb2F0IEdldEZvbnRBc2NlbnQoKSBjb25zdDsKKworICB2b2lkIFNldEFsaWdubWVudCh1aW50MzJfdCBhbGlnbm1lbnQpOworICBmbG9hdCBHZXRMaW5lU3BhY2UoKSBjb25zdCB7IHJldHVybiBsaW5lX3NwYWNpbmdfOyB9CisgIHZvaWQgU2V0TGluZVNwYWNlKGZsb2F0IHNwYWNlKSB7IGxpbmVfc3BhY2luZ18gPSBzcGFjZTsgfQorICB2b2lkIFNldEFsaWFzQ2hhcih3Y2hhcl90IGFsaWFzKSB7IHBhc3N3b3JkX2FsaWFzXyA9IGFsaWFzOyB9CisgIHZvaWQgU2V0SGFzQ2hhcmFjdGVyTGltaXQoYm9vbCBsaW1pdCk7CisgIHZvaWQgU2V0Q2hhcmFjdGVyTGltaXQoc2l6ZV90IGxpbWl0KTsKKyAgdm9pZCBTZXRDb21iVGV4dChib29sIGVuYWJsZSk7CisgIHZvaWQgU2V0VGFiV2lkdGgoZmxvYXQgd2lkdGgpOworICB2b2lkIFNldFZpc2libGVMaW5lQ291bnQoc2l6ZV90IGxpbmVzKTsKKworICB2b2lkIEVuYWJsZVZhbGlkYXRpb24oYm9vbCB2YWwpIHsgdmFsaWRhdGlvbl9lbmFibGVkXyA9IHZhbDsgfQorICB2b2lkIEVuYWJsZVBhc3N3b3JkTW9kZShib29sIHZhbCkgeyBwYXNzd29yZF9tb2RlXyA9IHZhbDsgfQorICB2b2lkIEVuYWJsZU11bHRpTGluZShib29sIHZhbCk7CisgIHZvaWQgRW5hYmxlTGluZVdyYXAoYm9vbCB2YWwpOworICB2b2lkIExpbWl0SG9yaXpvbnRhbFNjcm9sbChib29sIHZhbCk7CisgIHZvaWQgTGltaXRWZXJ0aWNhbFNjcm9sbChib29sIHZhbCk7CisKKyAgYm9vbCBDYW5VbmRvKCkgY29uc3Q7CisgIGJvb2wgQ2FuUmVkbygpIGNvbnN0OworICBib29sIFJlZG8oKTsKKyAgYm9vbCBVbmRvKCk7CisgIHZvaWQgQ2xlYXJPcGVyYXRpb25SZWNvcmRzKCk7CisKKyAgLy8gVGhpcyBpcyBub3QgY29uc3QgaXQgY2FuIHRyaWdnZXIgYSB8TGF5b3V0fC4KKyAgc2l6ZV90IEdldEluZGV4QmVmb3JlKHNpemVfdCBwb3MpOworICBzaXplX3QgR2V0SW5kZXhMZWZ0KHNpemVfdCBwb3MpIGNvbnN0OworICBzaXplX3QgR2V0SW5kZXhSaWdodChzaXplX3QgcG9zKSBjb25zdDsKKyAgc2l6ZV90IEdldEluZGV4VXAoc2l6ZV90IHBvcykgY29uc3Q7CisgIHNpemVfdCBHZXRJbmRleERvd24oc2l6ZV90IHBvcykgY29uc3Q7CisgIHNpemVfdCBHZXRJbmRleEF0U3RhcnRPZkxpbmUoc2l6ZV90IHBvcykgY29uc3Q7CisgIHNpemVfdCBHZXRJbmRleEF0RW5kT2ZMaW5lKHNpemVfdCBwb3MpIGNvbnN0OworCisgIHZvaWQgU2VsZWN0QWxsKCk7CisgIHZvaWQgU2V0U2VsZWN0aW9uKHNpemVfdCBzdGFydF9pZHgsIHNpemVfdCBjb3VudCk7CisgIHZvaWQgQ2xlYXJTZWxlY3Rpb24oKTsKKyAgYm9vbCBIYXNTZWxlY3Rpb24oKSBjb25zdCB7IHJldHVybiBoYXNfc2VsZWN0aW9uXzsgfQorICAvLyBSZXR1cm5zIDxzdGFydF9pZHgsIGNvdW50PiBvZiB0aGUgc2VsZWN0aW9uLgorICBzdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+IEdldFNlbGVjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4ge3NlbGVjdGlvbl8uc3RhcnRfaWR4LCBzZWxlY3Rpb25fLmNvdW50fTsKKyAgfQorICBXaWRlU3RyaW5nIEdldFNlbGVjdGVkVGV4dCgpIGNvbnN0OworICBXaWRlU3RyaW5nIERlbGV0ZVNlbGVjdGVkVGV4dCgKKyAgICAgIFJlY29yZE9wZXJhdGlvbiBhZGRfb3BlcmF0aW9uID0gUmVjb3JkT3BlcmF0aW9uOjprSW5zZXJ0UmVjb3JkKTsKKyAgdm9pZCBSZXBsYWNlU2VsZWN0ZWRUZXh0KGNvbnN0IFdpZGVTdHJpbmcmIHN0cik7CisKKyAgdm9pZCBMYXlvdXQoKTsKKworICB3Y2hhcl90IEdldENoYXIoc2l6ZV90IGlkeCkgY29uc3Q7CisgIC8vIE5vbi1jb25zdCBzbyB3ZSBjYW4gZm9yY2UgYSBMYXlvdXQoKSBpZiBuZWVkZWQuCisgIHNpemVfdCBHZXRXaWR0aE9mQ2hhcihzaXplX3QgaWR4KTsKKyAgLy8gTm9uLWNvbnN0IHNvIHdlIGNhbiBmb3JjZSBhIExheW91dCgpIGlmIG5lZWRlZC4KKyAgc2l6ZV90IEdldEluZGV4Rm9yUG9pbnQoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOworICAvLyA8c3RhcnRfaWR4LCBjb3VudD4KKyAgc3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PiBCb3VuZHNGb3JXb3JkQXQoc2l6ZV90IGlkeCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyA8YmlkaSBsZXZlbCwgY2hhcmFjdGVyIHJlY3Q+CisgIHN0ZDo6cGFpcjxpbnQzMl90LCBDRlhfUmVjdEY+IEdldENoYXJhY3RlckluZm8oaW50MzJfdCBzdGFydF9pZHgpOworICBzdGQ6OnZlY3RvcjxDRlhfUmVjdEY+IEdldENoYXJhY3RlclJlY3RzSW5SYW5nZShpbnQzMl90IHN0YXJ0X2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCk7CisKKyAgQ0ZYX1R4dEJyZWFrKiBHZXRUZXh0QnJlYWsoKSB7IHJldHVybiAmdGV4dF9icmVha187IH0KKworICBjb25zdCBzdGQ6OnZlY3RvcjxGREVfVEVYVEVESVRQSUVDRT4mIEdldFRleHRQaWVjZXMoKSB7CisgICAgLy8gRm9yY2UgYSBsYXlvdXQgaWYgbmVlZGVkLgorICAgIExheW91dCgpOworICAgIHJldHVybiB0ZXh0X3BpZWNlX2luZm9fOworICB9CisKKyAgc3RkOjp2ZWN0b3I8RlhURVhUX0NIQVJQT1M+IEdldERpc3BsYXlQb3MoY29uc3QgRkRFX1RFWFRFRElUUElFQ0UmIGluZm8pOworCisgIHZvaWQgU2V0TWF4RWRpdE9wZXJhdGlvbnNGb3JUZXN0aW5nKHNpemVfdCBtYXgpOworCisgcHJpdmF0ZToKKyAgdm9pZCBTZXRDb21iVGV4dFdpZHRoKCk7CisgIHZvaWQgQWRqdXN0R2FwKHNpemVfdCBpZHgsIHNpemVfdCBsZW5ndGgpOworICB2b2lkIFJlYnVpbGRQaWVjZXMoKTsKKyAgc2l6ZV90IENvdW50Q2hhcnNFeGNlZWRpbmdTaXplKGNvbnN0IFdpZGVTdHJpbmcmIHN0ciwgc2l6ZV90IG51bV90b19jaGVjayk7CisgIHZvaWQgQWRkT3BlcmF0aW9uUmVjb3JkKHN0ZDo6dW5pcXVlX3B0cjxPcGVyYXRpb24+IG9wKTsKKworICBib29sIElzQWxpZ25lZFJpZ2h0KCkgY29uc3QgeworICAgIHJldHVybiAhIShjaGFyYWN0ZXJfYWxpZ25tZW50XyAmIENGWF9UeHRMaW5lQWxpZ25tZW50X0xlZnQpOworICB9CisKKyAgYm9vbCBJc0FsaWduZWRDZW50ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuICEhKGNoYXJhY3Rlcl9hbGlnbm1lbnRfICYgQ0ZYX1R4dExpbmVBbGlnbm1lbnRfQ2VudGVyKTsKKyAgfQorICBzdGQ6OnZlY3RvcjxDRlhfUmVjdEY+IEdldENoYXJSZWN0cyhjb25zdCBGREVfVEVYVEVESVRQSUVDRSYgcGllY2UpOworCisgIHN0cnVjdCBTZWxlY3Rpb24geworICAgIHNpemVfdCBzdGFydF9pZHg7CisgICAgc2l6ZV90IGNvdW50OworICB9OworCisgIENGWF9SZWN0RiBjb250ZW50c19ib3VuZGluZ19ib3hfOworICBVbm93bmVkUHRyPERlbGVnYXRlPiBkZWxlZ2F0ZV87CisgIHN0ZDo6dmVjdG9yPEZERV9URVhURURJVFBJRUNFPiB0ZXh0X3BpZWNlX2luZm9fOworICBzdGQ6OnZlY3RvcjxzaXplX3Q+IGNoYXJfd2lkdGhzXzsKKyAgQ0ZYX1R4dEJyZWFrIHRleHRfYnJlYWtfOworICBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBmb250XzsKKyAgRlhfQVJHQiBmb250X2NvbG9yXzsKKyAgZmxvYXQgZm9udF9zaXplXzsKKyAgZmxvYXQgbGluZV9zcGFjaW5nXzsKKyAgc3RkOjp2ZWN0b3I8V2lkZVN0cmluZzo6Q2hhclR5cGU+IGNvbnRlbnRfOworICBzaXplX3QgdGV4dF9sZW5ndGhfOworICBzaXplX3QgZ2FwX3Bvc2l0aW9uXzsKKyAgc2l6ZV90IGdhcF9zaXplXzsKKyAgc2l6ZV90IGF2YWlsYWJsZV93aWR0aF87CisgIHNpemVfdCBjaGFyYWN0ZXJfbGltaXRfOworICBzaXplX3QgdmlzaWJsZV9saW5lX2NvdW50XzsKKyAgLy8gUmluZyBidWZmZXIgb2YgZWRpdCBvcGVyYXRpb25zCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxPcGVyYXRpb24+PiBvcGVyYXRpb25fYnVmZmVyXzsKKyAgLy8gTmV4dCBlZGl0IG9wZXJhdGlvbiB0byB1bmRvLgorICBzaXplX3QgbmV4dF9vcGVyYXRpb25faW5kZXhfdG9fdW5kb187CisgIC8vIE5leHQgaW5kZXggdG8gaW5zZXJ0IGFuIGVkaXQgb3BlcmF0aW9uIGludG8uCisgIHNpemVfdCBuZXh0X29wZXJhdGlvbl9pbmRleF90b19pbnNlcnRfOworICBzaXplX3QgbWF4X2VkaXRfb3BlcmF0aW9uc187CisgIHVpbnQzMl90IGNoYXJhY3Rlcl9hbGlnbm1lbnRfOworICBib29sIGhhc19jaGFyYWN0ZXJfbGltaXRfOworICBib29sIGlzX2NvbWJfdGV4dF87CisgIGJvb2wgaXNfZGlydHlfOworICBib29sIHZhbGlkYXRpb25fZW5hYmxlZF87CisgIGJvb2wgaXNfbXVsdGlsaW5lXzsKKyAgYm9vbCBpc19saW5ld3JhcF9lbmFibGVkXzsKKyAgYm9vbCBsaW1pdF9ob3Jpem9udGFsX2FyZWFfOworICBib29sIGxpbWl0X3ZlcnRpY2FsX2FyZWFfOworICBib29sIHBhc3N3b3JkX21vZGVfOworICB3Y2hhcl90IHBhc3N3b3JkX2FsaWFzXzsKKyAgYm9vbCBoYXNfc2VsZWN0aW9uXzsKKyAgU2VsZWN0aW9uIHNlbGVjdGlvbl87Cit9OworCisjZW5kaWYgIC8vIFhGQV9GREVfQ0ZERV9URVhURURJVEVOR0lORV9IXwpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9jZmRlX3RleHRlZGl0ZW5naW5lX3VuaXR0ZXN0LmNwcCBiL3hmYS9mZGUvY2ZkZV90ZXh0ZWRpdGVuZ2luZV91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyZTYxYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9mZGUvY2ZkZV90ZXh0ZWRpdGVuZ2luZV91bml0dGVzdC5jcHAKQEAgLTAsMCArMSw2OTcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInhmYS9mZGUvY2ZkZV90ZXh0ZWRpdGVuZ2luZS5oIgorCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy90ZXN0X3N1cHBvcnQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9jZmdhc19nZWZvbnQuaCIKKworY2xhc3MgQ0ZERV9UZXh0RWRpdEVuZ2luZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICBjbGFzcyBEZWxlZ2F0ZSA6IHB1YmxpYyBDRkRFX1RleHRFZGl0RW5naW5lOjpEZWxlZ2F0ZSB7CisgICBwdWJsaWM6CisgICAgdm9pZCBSZXNldCgpIHsKKyAgICAgIHRleHRfaXNfZnVsbCA9IGZhbHNlOworICAgICAgZmFpbF92YWxpZGF0aW9uID0gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBOb3RpZnlUZXh0RnVsbCgpIG92ZXJyaWRlIHsgdGV4dF9pc19mdWxsID0gdHJ1ZTsgfQorCisgICAgdm9pZCBPbkNhcmV0Q2hhbmdlZCgpIG92ZXJyaWRlIHt9CisgICAgdm9pZCBPblRleHRDaGFuZ2VkKGNvbnN0IFdpZGVTdHJpbmcmIHByZXZUZXh0KSBvdmVycmlkZSB7fQorICAgIHZvaWQgT25TZWxDaGFuZ2VkKCkgb3ZlcnJpZGUge30KKyAgICBib29sIE9uVmFsaWRhdGUoY29uc3QgV2lkZVN0cmluZyYgd3NUZXh0KSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gIWZhaWxfdmFsaWRhdGlvbjsKKyAgICB9CisgICAgdm9pZCBTZXRTY3JvbGxPZmZzZXQoZmxvYXQgZlNjcm9sbE9mZnNldCkgb3ZlcnJpZGUge30KKworICAgIGJvb2wgZmFpbF92YWxpZGF0aW9uID0gZmFsc2U7CisgICAgYm9vbCB0ZXh0X2lzX2Z1bGwgPSBmYWxzZTsKKyAgfTsKKworICBDRkRFX1RleHRFZGl0RW5naW5lVGVzdCgpIHt9CisgIH5DRkRFX1RleHRFZGl0RW5naW5lVGVzdCgpIG92ZXJyaWRlIHt9CisKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBmb250XyA9CisgICAgICAgIENGR0FTX0dFRm9udDo6TG9hZEZvbnQoTCJBcmlhbCBCbGFjayIsIDAsIDAsIEdldEdsb2JhbEZvbnRNYW5hZ2VyKCkpOworICAgIEFTU0VSVChmb250Xy5HZXQoKSAhPSBudWxscHRyKTsKKworICAgIGVuZ2luZV8gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZERV9UZXh0RWRpdEVuZ2luZT4oKTsKKyAgICBlbmdpbmVfLT5TZXRGb250KGZvbnRfKTsKKyAgICBlbmdpbmVfLT5TZXRGb250U2l6ZSgxMi4wZik7CisgIH0KKworICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeyBlbmdpbmVfLnJlc2V0KCk7IH0KKworICBDRkRFX1RleHRFZGl0RW5naW5lKiBlbmdpbmUoKSBjb25zdCB7IHJldHVybiBlbmdpbmVfLmdldCgpOyB9CisKKyBwcml2YXRlOgorICBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBmb250XzsKKyAgc3RkOjp1bmlxdWVfcHRyPENGREVfVGV4dEVkaXRFbmdpbmU+IGVuZ2luZV87Cit9OworCitURVNUX0YoQ0ZERV9UZXh0RWRpdEVuZ2luZVRlc3QsIEluc2VydCkgeworICBFWFBFQ1RfU1RSRVEoTCIiLCBlbmdpbmUoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworCisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCIiKTsKKyAgRVhQRUNUX1NUUkVRKEwiIiwgZW5naW5lKCktPkdldFRleHQoKS5jX3N0cigpKTsKKyAgRVhQRUNUX0VRKDBVLCBlbmdpbmUoKS0+R2V0TGVuZ3RoKCkpOworCisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJIZWxsbyIpOworICBFWFBFQ1RfU1RSRVEoTCJIZWxsbyIsIGVuZ2luZSgpLT5HZXRUZXh0KCkuY19zdHIoKSk7CisgIEVYUEVDVF9FUSg1VSwgZW5naW5lKCktPkdldExlbmd0aCgpKTsKKworICBlbmdpbmUoKS0+SW5zZXJ0KDUsIEwiIFdvcmxkIik7CisgIEVYUEVDVF9TVFJFUShMIkhlbGxvIFdvcmxkIiwgZW5naW5lKCktPkdldFRleHQoKS5jX3N0cigpKTsKKyAgRVhQRUNUX0VRKDExVSwgZW5naW5lKCktPkdldExlbmd0aCgpKTsKKworICBlbmdpbmUoKS0+SW5zZXJ0KDUsIEwiIE5ldyIpOworICBFWFBFQ1RfU1RSRVEoTCJIZWxsbyBOZXcgV29ybGQiLCBlbmdpbmUoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworCisgIGVuZ2luZSgpLT5JbnNlcnQoMTAwLCBMIiBDYXQiKTsKKyAgRVhQRUNUX1NUUkVRKEwiSGVsbG8gTmV3IFdvcmxkIENhdCIsIGVuZ2luZSgpLT5HZXRUZXh0KCkuY19zdHIoKSk7CisKKyAgZW5naW5lKCktPkNsZWFyKCk7CisKKyAgZW5naW5lKCktPlNldEhhc0NoYXJhY3RlckxpbWl0KHRydWUpOworICBlbmdpbmUoKS0+U2V0Q2hhcmFjdGVyTGltaXQoNSk7CisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJIZWxsbyIpOworCisgIC8vIE5vIGRlbGVnYXRlCisgIGVuZ2luZSgpLT5JbnNlcnQoNSwgTCIgV29ybGQiKTsKKyAgRVhQRUNUX1NUUkVRKEwiSGVsbG8iLCBlbmdpbmUoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworCisgIGVuZ2luZSgpLT5TZXRDaGFyYWN0ZXJMaW1pdCg4KTsKKyAgZW5naW5lKCktPkluc2VydCg1LCBMIiBXb3JsZCIpOworICBFWFBFQ1RfU1RSRVEoTCJIZWxsbyBXbyIsIGVuZ2luZSgpLT5HZXRUZXh0KCkuY19zdHIoKSk7CisKKyAgZW5naW5lKCktPkNsZWFyKCk7CisKKyAgLy8gV2l0aCBEZWxlZ2F0ZQorICBhdXRvIGRlbGVnYXRlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGREVfVGV4dEVkaXRFbmdpbmVUZXN0OjpEZWxlZ2F0ZT4oKTsKKyAgZW5naW5lKCktPlNldERlbGVnYXRlKGRlbGVnYXRlLmdldCgpKTsKKworICBlbmdpbmUoKS0+U2V0Q2hhcmFjdGVyTGltaXQoNSk7CisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJIZWxsbyIpOworCisgIC8vIEluc2VydCB3aGVuIGZ1bGwuCisgIGVuZ2luZSgpLT5JbnNlcnQoNSwgTCIgV29ybGQiKTsKKyAgRVhQRUNUX1RSVUUoZGVsZWdhdGUtPnRleHRfaXNfZnVsbCk7CisgIEVYUEVDVF9TVFJFUShMIkhlbGxvIiwgZW5naW5lKCktPkdldFRleHQoKS5jX3N0cigpKTsKKyAgZGVsZWdhdGUtPlJlc2V0KCk7CisKKyAgZW5naW5lKCktPlNldENoYXJhY3RlckxpbWl0KDgpOworICBlbmdpbmUoKS0+SW5zZXJ0KDUsIEwiIFdvcmxkIik7CisgIEVYUEVDVF9UUlVFKGRlbGVnYXRlLT50ZXh0X2lzX2Z1bGwpOworICBFWFBFQ1RfU1RSRVEoTCJIZWxsbyBXbyIsIGVuZ2luZSgpLT5HZXRUZXh0KCkuY19zdHIoKSk7CisgIGRlbGVnYXRlLT5SZXNldCgpOworICBlbmdpbmUoKS0+U2V0SGFzQ2hhcmFjdGVyTGltaXQoZmFsc2UpOworCisgIGVuZ2luZSgpLT5DbGVhcigpOworICBlbmdpbmUoKS0+SW5zZXJ0KDAsIEwiSGVsbG8iKTsKKworICAvLyBJbnNlcnQgSW52YWxpZCB0ZXh0CisgIGRlbGVnYXRlLT5mYWlsX3ZhbGlkYXRpb24gPSB0cnVlOworICBlbmdpbmUoKS0+RW5hYmxlVmFsaWRhdGlvbih0cnVlKTsKKyAgZW5naW5lKCktPkluc2VydCg1LCBMIiBXb3JsZCIpOworICBFWFBFQ1RfU1RSRVEoTCJIZWxsbyIsIGVuZ2luZSgpLT5HZXRUZXh0KCkuY19zdHIoKSk7CisKKyAgZGVsZWdhdGUtPmZhaWxfdmFsaWRhdGlvbiA9IGZhbHNlOworICBlbmdpbmUoKS0+SW5zZXJ0KDUsIEwiIFdvcmxkIik7CisgIEVYUEVDVF9TVFJFUShMIkhlbGxvIFdvcmxkIiwgZW5naW5lKCktPkdldFRleHQoKS5jX3N0cigpKTsKKyAgZW5naW5lKCktPkVuYWJsZVZhbGlkYXRpb24oZmFsc2UpOworCisgIGVuZ2luZSgpLT5DbGVhcigpOworCisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJIZWxsb1xuV29ybGQiKTsKKyAgRVhQRUNUX0ZBTFNFKGRlbGVnYXRlLT50ZXh0X2lzX2Z1bGwpOworICBFWFBFQ1RfU1RSRVEoTCJIZWxsb1xuV29ybGQiLCBlbmdpbmUoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworICBkZWxlZ2F0ZS0+UmVzZXQoKTsKKyAgZW5naW5lKCktPkNsZWFyKCk7CisKKyAgLy8gSW5zZXJ0IHdpdGggbGltaXRlZCBhcmVhIGFuZCBvdmVyLWZpbGwKKyAgZW5naW5lKCktPkxpbWl0SG9yaXpvbnRhbFNjcm9sbCh0cnVlKTsKKyAgZW5naW5lKCktPlNldEF2YWlsYWJsZVdpZHRoKDYwLjBmKTsgIC8vIEZpdHMgJ0hlbGxvIFdvJy4KKyAgZW5naW5lKCktPkluc2VydCgwLCBMIkhlbGxvIik7CisgIEVYUEVDVF9GQUxTRShkZWxlZ2F0ZS0+dGV4dF9pc19mdWxsKTsKKyAgZW5naW5lKCktPkluc2VydCg1LCBMIiBXb3JsZCIpOworICBFWFBFQ1RfVFJVRShkZWxlZ2F0ZS0+dGV4dF9pc19mdWxsKTsKKyAgRVhQRUNUX1NUUkVRKEwiSGVsbG8gV28iLCBlbmdpbmUoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworICBlbmdpbmUoKS0+TGltaXRIb3Jpem9udGFsU2Nyb2xsKGZhbHNlKTsKKworICBkZWxlZ2F0ZS0+UmVzZXQoKTsKKyAgZW5naW5lKCktPkNsZWFyKCk7CisKKyAgZW5naW5lKCktPlNldExpbmVTcGFjZSgxMi4wZik7CisgIGVuZ2luZSgpLT5MaW1pdFZlcnRpY2FsU2Nyb2xsKHRydWUpOworICAvLyBEZWZhdWx0IGlzIG9uZSBsaW5lIG9mIHRleHQuCisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJIZWxsbyIpOworICBFWFBFQ1RfRkFMU0UoZGVsZWdhdGUtPnRleHRfaXNfZnVsbCk7CisgIGVuZ2luZSgpLT5JbnNlcnQoNSwgTCIgV29cbnJsZCIpOworICBFWFBFQ1RfVFJVRShkZWxlZ2F0ZS0+dGV4dF9pc19mdWxsKTsKKyAgRVhQRUNUX1NUUkVRKEwiSGVsbG8gV29cbiIsIGVuZ2luZSgpLT5HZXRUZXh0KCkuY19zdHIoKSk7CisgIGVuZ2luZSgpLT5MaW1pdFZlcnRpY2FsU2Nyb2xsKGZhbHNlKTsKKworICBlbmdpbmUoKS0+U2V0RGVsZWdhdGUobnVsbHB0cik7Cit9CisKK1RFU1RfRihDRkRFX1RleHRFZGl0RW5naW5lVGVzdCwgRGVsZXRlKSB7CisgIEVYUEVDVF9TVFJFUShMIiIsIGVuZ2luZSgpLT5EZWxldGUoMCwgNTApLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoTCIiLCBlbmdpbmUoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworCisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJIZWxsbyBXb3JsZCIpOworICBFWFBFQ1RfU1RSRVEoTCIgV29ybGQiLCBlbmdpbmUoKS0+RGVsZXRlKDUsIDYpLmNfc3RyKCkpOworICBFWFBFQ1RfU1RSRVEoTCJIZWxsbyIsIGVuZ2luZSgpLT5HZXRUZXh0KCkuY19zdHIoKSk7CisKKyAgZW5naW5lKCktPkNsZWFyKCk7CisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJIZWxsbyBXb3JsZCIpOworICBFWFBFQ1RfU1RSRVEoTCIgIiwgZW5naW5lKCktPkRlbGV0ZSg1LCAxKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKEwiSGVsbG9Xb3JsZCIsIGVuZ2luZSgpLT5HZXRUZXh0KCkuY19zdHIoKSk7CisKKyAgRVhQRUNUX1NUUkVRKEwiZWxsb1dvcmxkIiwgZW5naW5lKCktPkRlbGV0ZSgxLCA1MCkuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUShMIkgiLCBlbmdpbmUoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworfQorCitURVNUX0YoQ0ZERV9UZXh0RWRpdEVuZ2luZVRlc3QsIENsZWFyKSB7CisgIEVYUEVDVF9TVFJFUShMIiIsIGVuZ2luZSgpLT5HZXRUZXh0KCkuY19zdHIoKSk7CisKKyAgZW5naW5lKCktPkNsZWFyKCk7CisgIEVYUEVDVF9TVFJFUShMIiIsIGVuZ2luZSgpLT5HZXRUZXh0KCkuY19zdHIoKSk7CisKKyAgZW5naW5lKCktPkluc2VydCgwLCBMIkhlbGxvIFdvcmxkIik7CisgIEVYUEVDVF9TVFJFUShMIkhlbGxvIFdvcmxkIiwgZW5naW5lKCktPkdldFRleHQoKS5jX3N0cigpKTsKKworICBlbmdpbmUoKS0+Q2xlYXIoKTsKKyAgRVhQRUNUX1NUUkVRKEwiIiwgZW5naW5lKCktPkdldFRleHQoKS5jX3N0cigpKTsKKyAgRVhQRUNUX0VRKDBVLCBlbmdpbmUoKS0+R2V0TGVuZ3RoKCkpOworfQorCitURVNUX0YoQ0ZERV9UZXh0RWRpdEVuZ2luZVRlc3QsIEdldENoYXIpIHsKKyAgLy8gT3V0IG9mIGJvdW5kcy4KKyAgRVhQRUNUX0VRKEwnXDAnLCBlbmdpbmUoKS0+R2V0Q2hhcigwKSk7CisKKyAgZW5naW5lKCktPkluc2VydCgwLCBMIkhlbGxvIFdvcmxkIik7CisgIEVYUEVDVF9FUShMJ0gnLCBlbmdpbmUoKS0+R2V0Q2hhcigwKSk7CisgIEVYUEVDVF9FUShMJ2QnLCBlbmdpbmUoKS0+R2V0Q2hhcihlbmdpbmUoKS0+R2V0TGVuZ3RoKCkgLSAxKSk7CisgIEVYUEVDVF9FUShMJyAnLCBlbmdpbmUoKS0+R2V0Q2hhcig1KSk7CisKKyAgZW5naW5lKCktPkluc2VydCg1LCBMIiBBIik7CisgIEVYUEVDVF9TVFJFUShMIkhlbGxvIEEgV29ybGQiLCBlbmdpbmUoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworICBFWFBFQ1RfRVEoTCdXJywgZW5naW5lKCktPkdldENoYXIoOCkpOworCisgIGVuZ2luZSgpLT5FbmFibGVQYXNzd29yZE1vZGUodHJ1ZSk7CisgIEVYUEVDVF9FUShMJyonLCBlbmdpbmUoKS0+R2V0Q2hhcig4KSk7CisKKyAgZW5naW5lKCktPlNldEFsaWFzQ2hhcihMJysnKTsKKyAgRVhQRUNUX0VRKEwnKycsIGVuZ2luZSgpLT5HZXRDaGFyKDgpKTsKK30KKworVEVTVF9GKENGREVfVGV4dEVkaXRFbmdpbmVUZXN0LCBHZXRXaWR0aE9mQ2hhcikgeworICAvLyBPdXQgb2YgQm91bmRzLgorICBFWFBFQ1RfRVEoMFUsIGVuZ2luZSgpLT5HZXRXaWR0aE9mQ2hhcigwKSk7CisKKyAgZW5naW5lKCktPkluc2VydCgwLCBMIkhlbGxvIFdvcmxkIik7CisgIEVYUEVDVF9FUSgxOTk5MjBVLCBlbmdpbmUoKS0+R2V0V2lkdGhPZkNoYXIoMCkpOworICBFWFBFQ1RfRVEoMTU5ODQwVSwgZW5naW5lKCktPkdldFdpZHRoT2ZDaGFyKDEpKTsKKworICBlbmdpbmUoKS0+SW5zZXJ0KDAsIEwiXHQiKTsKKyAgRVhQRUNUX0VRKDBVLCBlbmdpbmUoKS0+R2V0V2lkdGhPZkNoYXIoMCkpOworfQorCitURVNUX0YoQ0ZERV9UZXh0RWRpdEVuZ2luZVRlc3QsIEdldERpc3BsYXlQb3MpIHsKKyAgRVhQRUNUX0VRKDBVLCBlbmdpbmUoKS0+R2V0RGlzcGxheVBvcyhGREVfVEVYVEVESVRQSUVDRSgpKS5zaXplKCkpOworfQorCitURVNUX0YoQ0ZERV9UZXh0RWRpdEVuZ2luZVRlc3QsIFNlbGVjdGlvbikgeworICBFWFBFQ1RfRkFMU0UoZW5naW5lKCktPkhhc1NlbGVjdGlvbigpKTsKKyAgZW5naW5lKCktPlNlbGVjdEFsbCgpOworICBFWFBFQ1RfRkFMU0UoZW5naW5lKCktPkhhc1NlbGVjdGlvbigpKTsKKworICBlbmdpbmUoKS0+SW5zZXJ0KDAsIEwiSGVsbG8gV29ybGQiKTsKKyAgRVhQRUNUX1NUUkVRKEwiIiwgZW5naW5lKCktPkRlbGV0ZVNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIEVYUEVDVF9GQUxTRShlbmdpbmUoKS0+SGFzU2VsZWN0aW9uKCkpOworICBlbmdpbmUoKS0+U2VsZWN0QWxsKCk7CisgIEVYUEVDVF9UUlVFKGVuZ2luZSgpLT5IYXNTZWxlY3Rpb24oKSk7CisgIEVYUEVDVF9TVFJFUShMIkhlbGxvIFdvcmxkIiwgZW5naW5lKCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIGVuZ2luZSgpLT5DbGVhclNlbGVjdGlvbigpOworICBFWFBFQ1RfRkFMU0UoZW5naW5lKCktPkhhc1NlbGVjdGlvbigpKTsKKyAgRVhQRUNUX1NUUkVRKEwiIiwgZW5naW5lKCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIGVuZ2luZSgpLT5TZWxlY3RBbGwoKTsKKyAgc2l6ZV90IHN0YXJ0X2lkeDsKKyAgc2l6ZV90IGNvdW50OworICBzdGQ6OnRpZShzdGFydF9pZHgsIGNvdW50KSA9IGVuZ2luZSgpLT5HZXRTZWxlY3Rpb24oKTsKKyAgRVhQRUNUX0VRKDBVLCBzdGFydF9pZHgpOworICBFWFBFQ1RfRVEoMTFVLCBjb3VudCk7CisKKyAgLy8gU2VsZWN0aW9uIGJlZm9yZSBnYXAuCisgIEVYUEVDVF9TVFJFUShMIkhlbGxvIFdvcmxkIiwgZW5naW5lKCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworICBFWFBFQ1RfVFJVRShlbmdpbmUoKS0+SGFzU2VsZWN0aW9uKCkpOworICBFWFBFQ1RfU1RSRVEoTCJIZWxsbyBXb3JsZCIsIGVuZ2luZSgpLT5HZXRUZXh0KCkuY19zdHIoKSk7CisKKyAgZW5naW5lKCktPkluc2VydCg1LCBMIiBBIik7CisgIEVYUEVDVF9GQUxTRShlbmdpbmUoKS0+SGFzU2VsZWN0aW9uKCkpOworICBFWFBFQ1RfU1RSRVEoTCIiLCBlbmdpbmUoKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgLy8gU2VsZWN0aW9uIG92ZXIgdGhlIGdhcC4KKyAgZW5naW5lKCktPlNlbGVjdEFsbCgpOworICBFWFBFQ1RfVFJVRShlbmdpbmUoKS0+SGFzU2VsZWN0aW9uKCkpOworICBFWFBFQ1RfU1RSRVEoTCJIZWxsbyBBIFdvcmxkIiwgZW5naW5lKCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworICBlbmdpbmUoKS0+Q2xlYXIoKTsKKworICBlbmdpbmUoKS0+SW5zZXJ0KDAsIEwiSGVsbG8gV29ybGQiKTsKKyAgZW5naW5lKCktPlNlbGVjdEFsbCgpOworCisgIEVYUEVDVF9TVFJFUShMIkhlbGxvIFdvcmxkIiwgZW5naW5lKCktPkRlbGV0ZVNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworICBFWFBFQ1RfRkFMU0UoZW5naW5lKCktPkhhc1NlbGVjdGlvbigpKTsKKyAgRVhQRUNUX1NUUkVRKEwiIiwgZW5naW5lKCktPkdldFRleHQoKS5jX3N0cigpKTsKKworICBlbmdpbmUoKS0+SW5zZXJ0KDAsIEwiSGVsbG8gV29ybGQiKTsKKyAgZW5naW5lKCktPlNldFNlbGVjdGlvbig1LCA1KTsKKyAgRVhQRUNUX1NUUkVRKEwiIFdvcmwiLCBlbmdpbmUoKS0+RGVsZXRlU2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisgIEVYUEVDVF9GQUxTRShlbmdpbmUoKS0+SGFzU2VsZWN0aW9uKCkpOworICBFWFBFQ1RfU1RSRVEoTCJIZWxsb2QiLCBlbmdpbmUoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworCisgIGVuZ2luZSgpLT5DbGVhcigpOworICBlbmdpbmUoKS0+SW5zZXJ0KDAsIEwiSGVsbG8gV29ybGQiKTsKKyAgZW5naW5lKCktPlNlbGVjdEFsbCgpOworICBlbmdpbmUoKS0+UmVwbGFjZVNlbGVjdGVkVGV4dChMIkdvb2RieWUgRXZlcnlib2R5Iik7CisgIEVYUEVDVF9GQUxTRShlbmdpbmUoKS0+SGFzU2VsZWN0aW9uKCkpOworICBFWFBFQ1RfU1RSRVEoTCJHb29kYnllIEV2ZXJ5Ym9keSIsIGVuZ2luZSgpLT5HZXRUZXh0KCkuY19zdHIoKSk7CisKKyAgZW5naW5lKCktPkNsZWFyKCk7CisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJIZWxsbyBXb3JsZCIpOworICBlbmdpbmUoKS0+U2V0U2VsZWN0aW9uKDEsIDQpOworICBlbmdpbmUoKS0+UmVwbGFjZVNlbGVjdGVkVGV4dChMImksIik7CisgIEVYUEVDVF9GQUxTRShlbmdpbmUoKS0+SGFzU2VsZWN0aW9uKCkpOworICBFWFBFQ1RfU1RSRVEoTCJIaSwgV29ybGQiLCBlbmdpbmUoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworCisgIC8vIFNlbGVjdGlvbiBmdWxseSBhZnRlciBnYXAuCisgIGVuZ2luZSgpLT5DbGVhcigpOworICBlbmdpbmUoKS0+SW5zZXJ0KDAsIEwiSGVsbG8iKTsKKyAgZW5naW5lKCktPkluc2VydCgwLCBMIkEgIik7CisgIGVuZ2luZSgpLT5TZXRTZWxlY3Rpb24oMywgNik7CisgIEVYUEVDVF9TVFJFUShMImVsbG8iLCBlbmdpbmUoKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgZW5naW5lKCktPkNsZWFyKCk7CisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJIZWxsbyBXb3JsZCIpOworICBlbmdpbmUoKS0+Q2xlYXJTZWxlY3Rpb24oKTsKKyAgZW5naW5lKCktPkRlbGV0ZVNlbGVjdGVkVGV4dCgpOworICBFWFBFQ1RfU1RSRVEoTCJIZWxsbyBXb3JsZCIsIGVuZ2luZSgpLT5HZXRUZXh0KCkuY19zdHIoKSk7Cit9CisKK1RFU1RfRihDRkRFX1RleHRFZGl0RW5naW5lVGVzdCwgVW5kb1JlZG8pIHsKKyAgRVhQRUNUX0ZBTFNFKGVuZ2luZSgpLT5DYW5VbmRvKCkpOworICBFWFBFQ1RfRkFMU0UoZW5naW5lKCktPkNhblJlZG8oKSk7CisgIEVYUEVDVF9GQUxTRShlbmdpbmUoKS0+VW5kbygpKTsKKyAgRVhQRUNUX0ZBTFNFKGVuZ2luZSgpLT5SZWRvKCkpOworCisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJIZWxsbyIpOworICBFWFBFQ1RfVFJVRShlbmdpbmUoKS0+Q2FuVW5kbygpKTsKKyAgRVhQRUNUX0ZBTFNFKGVuZ2luZSgpLT5DYW5SZWRvKCkpOworICBFWFBFQ1RfVFJVRShlbmdpbmUoKS0+VW5kbygpKTsKKyAgRVhQRUNUX1NUUkVRKEwiIiwgZW5naW5lKCktPkdldFRleHQoKS5jX3N0cigpKTsKKyAgRVhQRUNUX0ZBTFNFKGVuZ2luZSgpLT5DYW5VbmRvKCkpOworICBFWFBFQ1RfVFJVRShlbmdpbmUoKS0+Q2FuUmVkbygpKTsKKyAgRVhQRUNUX1RSVUUoZW5naW5lKCktPlJlZG8oKSk7CisgIEVYUEVDVF9TVFJFUShMIkhlbGxvIiwgZW5naW5lKCktPkdldFRleHQoKS5jX3N0cigpKTsKKyAgRVhQRUNUX1RSVUUoZW5naW5lKCktPkNhblVuZG8oKSk7CisgIEVYUEVDVF9GQUxTRShlbmdpbmUoKS0+Q2FuUmVkbygpKTsKKworICBlbmdpbmUoKS0+Q2xlYXIoKTsKKyAgRVhQRUNUX0ZBTFNFKGVuZ2luZSgpLT5DYW5VbmRvKCkpOworICBFWFBFQ1RfRkFMU0UoZW5naW5lKCktPkNhblJlZG8oKSk7CisKKyAgZW5naW5lKCktPkluc2VydCgwLCBMIkhlbGxvIFdvcmxkIik7CisgIGVuZ2luZSgpLT5TZWxlY3RBbGwoKTsKKyAgZW5naW5lKCktPkRlbGV0ZVNlbGVjdGVkVGV4dCgpOworICBFWFBFQ1RfU1RSRVEoTCIiLCBlbmdpbmUoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworICBFWFBFQ1RfVFJVRShlbmdpbmUoKS0+Q2FuVW5kbygpKTsKKyAgRVhQRUNUX1RSVUUoZW5naW5lKCktPlVuZG8oKSk7CisgIEVYUEVDVF9TVFJFUShMIkhlbGxvIFdvcmxkIiwgZW5naW5lKCktPkdldFRleHQoKS5jX3N0cigpKTsKKyAgRVhQRUNUX1RSVUUoZW5naW5lKCktPkNhblJlZG8oKSk7CisgIEVYUEVDVF9UUlVFKGVuZ2luZSgpLT5SZWRvKCkpOworICBFWFBFQ1RfU1RSRVEoTCIiLCBlbmdpbmUoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworICBFWFBFQ1RfVFJVRShlbmdpbmUoKS0+Q2FuVW5kbygpKTsKKyAgRVhQRUNUX0ZBTFNFKGVuZ2luZSgpLT5DYW5SZWRvKCkpOworCisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJIZWxsbyBXb3JsZCIpOworICBlbmdpbmUoKS0+U2VsZWN0QWxsKCk7CisgIGVuZ2luZSgpLT5SZXBsYWNlU2VsZWN0ZWRUZXh0KEwiR29vZGJ5ZSBGcmllbmQiKTsKKyAgRVhQRUNUX1NUUkVRKEwiR29vZGJ5ZSBGcmllbmQiLCBlbmdpbmUoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworICBFWFBFQ1RfVFJVRShlbmdpbmUoKS0+Q2FuVW5kbygpKTsKKyAgRVhQRUNUX1RSVUUoZW5naW5lKCktPlVuZG8oKSk7CisgIEVYUEVDVF9TVFJFUShMIkhlbGxvIFdvcmxkIiwgZW5naW5lKCktPkdldFRleHQoKS5jX3N0cigpKTsKKyAgRVhQRUNUX1RSVUUoZW5naW5lKCktPkNhblJlZG8oKSk7CisgIEVYUEVDVF9UUlVFKGVuZ2luZSgpLT5SZWRvKCkpOworICBFWFBFQ1RfU1RSRVEoTCJHb29kYnllIEZyaWVuZCIsIGVuZ2luZSgpLT5HZXRUZXh0KCkuY19zdHIoKSk7CisKKyAgZW5naW5lKCktPkNsZWFyKCk7CisgIGVuZ2luZSgpLT5TZXRNYXhFZGl0T3BlcmF0aW9uc0ZvclRlc3RpbmcoMyk7CisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJGaXJzdCAiKTsKKyAgZW5naW5lKCktPkluc2VydChlbmdpbmUoKS0+R2V0TGVuZ3RoKCksIEwiU2Vjb25kICIpOworICBlbmdpbmUoKS0+SW5zZXJ0KGVuZ2luZSgpLT5HZXRMZW5ndGgoKSwgTCJUaGlyZCIpOworCisgIEVYUEVDVF9UUlVFKGVuZ2luZSgpLT5DYW5VbmRvKCkpOworICBFWFBFQ1RfVFJVRShlbmdpbmUoKS0+VW5kbygpKTsKKyAgRVhQRUNUX1NUUkVRKEwiRmlyc3QgU2Vjb25kICIsIGVuZ2luZSgpLT5HZXRUZXh0KCkuY19zdHIoKSk7CisgIEVYUEVDVF9UUlVFKGVuZ2luZSgpLT5DYW5VbmRvKCkpOworICBFWFBFQ1RfVFJVRShlbmdpbmUoKS0+VW5kbygpKTsKKyAgRVhQRUNUX0ZBTFNFKAorICAgICAgZW5naW5lKCktPkNhblVuZG8oKSk7ICAvLyBDYW4ndCB1bmRvIEZpcnN0OyB1bmRvIGJ1ZmZlciB0b28gc21hbGwuCisgIEVYUEVDVF9TVFJFUShMIkZpcnN0ICIsIGVuZ2luZSgpLT5HZXRUZXh0KCkuY19zdHIoKSk7CisKKyAgRVhQRUNUX1RSVUUoZW5naW5lKCktPkNhblJlZG8oKSk7CisgIEVYUEVDVF9UUlVFKGVuZ2luZSgpLT5SZWRvKCkpOworICBFWFBFQ1RfVFJVRShlbmdpbmUoKS0+Q2FuUmVkbygpKTsKKyAgRVhQRUNUX1RSVUUoZW5naW5lKCktPlJlZG8oKSk7CisgIEVYUEVDVF9GQUxTRShlbmdpbmUoKS0+Q2FuUmVkbygpKTsKKyAgRVhQRUNUX1NUUkVRKEwiRmlyc3QgU2Vjb25kIFRoaXJkIiwgZW5naW5lKCktPkdldFRleHQoKS5jX3N0cigpKTsKKworICBlbmdpbmUoKS0+Q2xlYXIoKTsKKworICBlbmdpbmUoKS0+U2V0TWF4RWRpdE9wZXJhdGlvbnNGb3JUZXN0aW5nKDQpOworCisgIC8vIEdvIGJleW9uZCB0aGUgbWF4IG9wZXJhdGlvbnMgbGltaXQuCisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJIIik7CisgIGVuZ2luZSgpLT5JbnNlcnQoMSwgTCJlIik7CisgIGVuZ2luZSgpLT5JbnNlcnQoMiwgTCJsIik7CisgIGVuZ2luZSgpLT5JbnNlcnQoMywgTCJsIik7CisgIGVuZ2luZSgpLT5JbnNlcnQoNCwgTCJvIik7CisgIGVuZ2luZSgpLT5JbnNlcnQoNSwgTCIgV29ybGQiKTsKKyAgRVhQRUNUX1NUUkVRKEwiSGVsbG8gV29ybGQiLCBlbmdpbmUoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworCisgIC8vIERvIEEsIHVuZG8uIERvIEIsIHVuZG8uIFJlZG8gc2hvdWxkIGNhdXNlIEIuCisgIGVuZ2luZSgpLT5EZWxldGUoNCwgMyk7CisgIEVYUEVDVF9TVFJFUShMIkhlbGxvcmxkIiwgZW5naW5lKCktPkdldFRleHQoKS5jX3N0cigpKTsKKyAgRVhQRUNUX1RSVUUoZW5naW5lKCktPlVuZG8oKSk7CisgIEVYUEVDVF9TVFJFUShMIkhlbGxvIFdvcmxkIiwgZW5naW5lKCktPkdldFRleHQoKS5jX3N0cigpKTsKKyAgZW5naW5lKCktPkRlbGV0ZSg1LCA2KTsKKyAgRVhQRUNUX1NUUkVRKEwiSGVsbG8iLCBlbmdpbmUoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworICBFWFBFQ1RfVFJVRShlbmdpbmUoKS0+VW5kbygpKTsKKyAgRVhQRUNUX1NUUkVRKEwiSGVsbG8gV29ybGQiLCBlbmdpbmUoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworICBFWFBFQ1RfVFJVRShlbmdpbmUoKS0+UmVkbygpKTsKKyAgRVhQRUNUX1NUUkVRKEwiSGVsbG8iLCBlbmdpbmUoKS0+R2V0VGV4dCgpLmNfc3RyKCkpOworCisgIC8vIFVuZG8gZG93biB0byB0aGUgbGltaXQuCisgIEVYUEVDVF9UUlVFKGVuZ2luZSgpLT5VbmRvKCkpOworICBFWFBFQ1RfU1RSRVEoTCJIZWxsbyBXb3JsZCIsIGVuZ2luZSgpLT5HZXRUZXh0KCkuY19zdHIoKSk7CisgIEVYUEVDVF9UUlVFKGVuZ2luZSgpLT5VbmRvKCkpOworICBFWFBFQ1RfU1RSRVEoTCJIZWxsbyIsIGVuZ2luZSgpLT5HZXRUZXh0KCkuY19zdHIoKSk7CisgIEVYUEVDVF9UUlVFKGVuZ2luZSgpLT5VbmRvKCkpOworICBFWFBFQ1RfU1RSRVEoTCJIZWxsIiwgZW5naW5lKCktPkdldFRleHQoKS5jX3N0cigpKTsKKyAgRVhQRUNUX0ZBTFNFKGVuZ2luZSgpLT5VbmRvKCkpOworICBFWFBFQ1RfU1RSRVEoTCJIZWxsIiwgZW5naW5lKCktPkdldFRleHQoKS5jX3N0cigpKTsKK30KKworVEVTVF9GKENGREVfVGV4dEVkaXRFbmdpbmVUZXN0LCBHZXRJbmRleEZvclBvaW50KSB7CisgIGVuZ2luZSgpLT5TZXRGb250U2l6ZSgxMC4wZik7CisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJIZWxsbyBXb3JsZCIpOworICBFWFBFQ1RfRVEoMFUsIGVuZ2luZSgpLT5HZXRJbmRleEZvclBvaW50KHswLjBmLCAwLjBmfSkpOworICBFWFBFQ1RfRVEoMTFVLCBlbmdpbmUoKS0+R2V0SW5kZXhGb3JQb2ludCh7OTk5OTk5LjBmLCA5OTk5OTk5LjBmfSkpOworICBFWFBFQ1RfRVEoMVUsIGVuZ2luZSgpLT5HZXRJbmRleEZvclBvaW50KHsxMC4wZiwgNS4wZn0pKTsKK30KKworVEVTVF9GKENGREVfVGV4dEVkaXRFbmdpbmVUZXN0LCBCb3VuZHNGb3JXb3JkQXQpIHsKKyAgc2l6ZV90IHN0YXJ0X2lkeDsKKyAgc2l6ZV90IGNvdW50OworCisgIHN0ZDo6dGllKHN0YXJ0X2lkeCwgY291bnQpID0gZW5naW5lKCktPkJvdW5kc0ZvcldvcmRBdCgxMDApOworICBFWFBFQ1RfRVEoMFUsIHN0YXJ0X2lkeCk7CisgIEVYUEVDVF9FUSgwVSwgY291bnQpOworICBlbmdpbmUoKS0+U2V0U2VsZWN0aW9uKHN0YXJ0X2lkeCwgY291bnQpOworICBFWFBFQ1RfU1RSRVEoTCIiLCBlbmdpbmUoKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgZW5naW5lKCktPkNsZWFyKCk7CisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJIZWxsbyIpOworICBzdGQ6OnRpZShzdGFydF9pZHgsIGNvdW50KSA9IGVuZ2luZSgpLT5Cb3VuZHNGb3JXb3JkQXQoMCk7CisgIEVYUEVDVF9FUSgwVSwgc3RhcnRfaWR4KTsKKyAgRVhQRUNUX0VRKDVVLCBjb3VudCk7CisgIGVuZ2luZSgpLT5TZXRTZWxlY3Rpb24oc3RhcnRfaWR4LCBjb3VudCk7CisgIEVYUEVDVF9TVFJFUShMIkhlbGxvIiwgZW5naW5lKCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIGVuZ2luZSgpLT5DbGVhcigpOworICBlbmdpbmUoKS0+SW5zZXJ0KDAsIEwiSGVsbG8gV29ybGQiKTsKKyAgc3RkOjp0aWUoc3RhcnRfaWR4LCBjb3VudCkgPSBlbmdpbmUoKS0+Qm91bmRzRm9yV29yZEF0KDEwMCk7CisgIEVYUEVDVF9FUSgwVSwgc3RhcnRfaWR4KTsKKyAgRVhQRUNUX0VRKDBVLCBjb3VudCk7CisgIGVuZ2luZSgpLT5TZXRTZWxlY3Rpb24oc3RhcnRfaWR4LCBjb3VudCk7CisgIEVYUEVDVF9TVFJFUShMIiIsIGVuZ2luZSgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKworICBzdGQ6OnRpZShzdGFydF9pZHgsIGNvdW50KSA9IGVuZ2luZSgpLT5Cb3VuZHNGb3JXb3JkQXQoMCk7CisgIEVYUEVDVF9FUSgwVSwgc3RhcnRfaWR4KTsKKyAgRVhQRUNUX0VRKDVVLCBjb3VudCk7CisgIGVuZ2luZSgpLT5TZXRTZWxlY3Rpb24oc3RhcnRfaWR4LCBjb3VudCk7CisgIEVYUEVDVF9TVFJFUShMIkhlbGxvIiwgZW5naW5lKCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIHN0ZDo6dGllKHN0YXJ0X2lkeCwgY291bnQpID0gZW5naW5lKCktPkJvdW5kc0ZvcldvcmRBdCgxKTsKKyAgRVhQRUNUX0VRKDBVLCBzdGFydF9pZHgpOworICBFWFBFQ1RfRVEoNVUsIGNvdW50KTsKKyAgZW5naW5lKCktPlNldFNlbGVjdGlvbihzdGFydF9pZHgsIGNvdW50KTsKKyAgRVhQRUNUX1NUUkVRKEwiSGVsbG8iLCBlbmdpbmUoKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgc3RkOjp0aWUoc3RhcnRfaWR4LCBjb3VudCkgPSBlbmdpbmUoKS0+Qm91bmRzRm9yV29yZEF0KDQpOworICBFWFBFQ1RfRVEoMFUsIHN0YXJ0X2lkeCk7CisgIEVYUEVDVF9FUSg1VSwgY291bnQpOworICBlbmdpbmUoKS0+U2V0U2VsZWN0aW9uKHN0YXJ0X2lkeCwgY291bnQpOworICBFWFBFQ1RfU1RSRVEoTCJIZWxsbyIsIGVuZ2luZSgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKworICAvLyBTZWxlY3QgdGhlIHNwYWNlCisgIHN0ZDo6dGllKHN0YXJ0X2lkeCwgY291bnQpID0gZW5naW5lKCktPkJvdW5kc0ZvcldvcmRBdCg1KTsKKyAgRVhQRUNUX0VRKDVVLCBzdGFydF9pZHgpOworICBFWFBFQ1RfRVEoMVUsIGNvdW50KTsKKyAgZW5naW5lKCktPlNldFNlbGVjdGlvbihzdGFydF9pZHgsIGNvdW50KTsKKyAgRVhQRUNUX1NUUkVRKEwiICIsIGVuZ2luZSgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKworICBzdGQ6OnRpZShzdGFydF9pZHgsIGNvdW50KSA9IGVuZ2luZSgpLT5Cb3VuZHNGb3JXb3JkQXQoNik7CisgIEVYUEVDVF9FUSg2VSwgc3RhcnRfaWR4KTsKKyAgRVhQRUNUX0VRKDVVLCBjb3VudCk7CisgIGVuZ2luZSgpLT5TZXRTZWxlY3Rpb24oc3RhcnRfaWR4LCBjb3VudCk7CisgIEVYUEVDVF9TVFJFUShMIldvcmxkIiwgZW5naW5lKCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIGVuZ2luZSgpLT5DbGVhcigpOworICBlbmdpbmUoKS0+SW5zZXJ0KDAsIEwiMTIzIDQ1NiA3ODkiKTsKKyAgc3RkOjp0aWUoc3RhcnRfaWR4LCBjb3VudCkgPSBlbmdpbmUoKS0+Qm91bmRzRm9yV29yZEF0KDUpOworICBlbmdpbmUoKS0+U2V0U2VsZWN0aW9uKHN0YXJ0X2lkeCwgY291bnQpOworICBFWFBFQ1RfU1RSRVEoTCI0NTYiLCBlbmdpbmUoKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgZW5naW5lKCktPkNsZWFyKCk7CisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCIxMjNkZWY3ODkiKTsKKyAgc3RkOjp0aWUoc3RhcnRfaWR4LCBjb3VudCkgPSBlbmdpbmUoKS0+Qm91bmRzRm9yV29yZEF0KDUpOworICBlbmdpbmUoKS0+U2V0U2VsZWN0aW9uKHN0YXJ0X2lkeCwgY291bnQpOworICBFWFBFQ1RfU1RSRVEoTCIxMjNkZWY3ODkiLCBlbmdpbmUoKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgZW5naW5lKCktPkNsZWFyKCk7CisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJhYmM0NTZnaGkiKTsKKyAgc3RkOjp0aWUoc3RhcnRfaWR4LCBjb3VudCkgPSBlbmdpbmUoKS0+Qm91bmRzRm9yV29yZEF0KDUpOworICBlbmdpbmUoKS0+U2V0U2VsZWN0aW9uKHN0YXJ0X2lkeCwgY291bnQpOworICBFWFBFQ1RfU1RSRVEoTCJhYmM0NTZnaGkiLCBlbmdpbmUoKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgZW5naW5lKCktPkNsZWFyKCk7CisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJoZWxsbywgd29ybGQiKTsKKyAgc3RkOjp0aWUoc3RhcnRfaWR4LCBjb3VudCkgPSBlbmdpbmUoKS0+Qm91bmRzRm9yV29yZEF0KDApOworICBlbmdpbmUoKS0+U2V0U2VsZWN0aW9uKHN0YXJ0X2lkeCwgY291bnQpOworICBFWFBFQ1RfU1RSRVEoTCJoZWxsbyIsIGVuZ2luZSgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKworICBlbmdpbmUoKS0+Q2xlYXIoKTsKKyAgZW5naW5lKCktPkluc2VydCgwLCBMImhlbGxvLCB3b3JsZCIpOworICBzdGQ6OnRpZShzdGFydF9pZHgsIGNvdW50KSA9IGVuZ2luZSgpLT5Cb3VuZHNGb3JXb3JkQXQoNSk7CisgIGVuZ2luZSgpLT5TZXRTZWxlY3Rpb24oc3RhcnRfaWR4LCBjb3VudCk7CisgIEVYUEVDVF9TVFJFUShMIiwiLCBlbmdpbmUoKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgZW5naW5lKCktPkNsZWFyKCk7CisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJucC1jb21wbGV0ZSIpOworICBzdGQ6OnRpZShzdGFydF9pZHgsIGNvdW50KSA9IGVuZ2luZSgpLT5Cb3VuZHNGb3JXb3JkQXQoNik7CisgIGVuZ2luZSgpLT5TZXRTZWxlY3Rpb24oc3RhcnRfaWR4LCBjb3VudCk7CisgIEVYUEVDVF9TVFJFUShMImNvbXBsZXRlIiwgZW5naW5lKCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIGVuZ2luZSgpLT5DbGVhcigpOworICBlbmdpbmUoKS0+SW5zZXJ0KDAsIEwiKDEyMykgNDU2LTc4OTAiKTsKKyAgc3RkOjp0aWUoc3RhcnRfaWR4LCBjb3VudCkgPSBlbmdpbmUoKS0+Qm91bmRzRm9yV29yZEF0KDApOworICBlbmdpbmUoKS0+U2V0U2VsZWN0aW9uKHN0YXJ0X2lkeCwgY291bnQpOworICBFWFBFQ1RfU1RSRVEoTCIoIiwgZW5naW5lKCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIHN0ZDo6dGllKHN0YXJ0X2lkeCwgY291bnQpID0gZW5naW5lKCktPkJvdW5kc0ZvcldvcmRBdCgxKTsKKyAgZW5naW5lKCktPlNldFNlbGVjdGlvbihzdGFydF9pZHgsIGNvdW50KTsKKyAgRVhQRUNUX1NUUkVRKEwiMTIzIiwgZW5naW5lKCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIHN0ZDo6dGllKHN0YXJ0X2lkeCwgY291bnQpID0gZW5naW5lKCktPkJvdW5kc0ZvcldvcmRBdCg3KTsKKyAgZW5naW5lKCktPlNldFNlbGVjdGlvbihzdGFydF9pZHgsIGNvdW50KTsKKyAgRVhQRUNUX1NUUkVRKEwiNDU2IiwgZW5naW5lKCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIHN0ZDo6dGllKHN0YXJ0X2lkeCwgY291bnQpID0gZW5naW5lKCktPkJvdW5kc0ZvcldvcmRBdCgxMSk7CisgIGVuZ2luZSgpLT5TZXRTZWxlY3Rpb24oc3RhcnRfaWR4LCBjb3VudCk7CisgIEVYUEVDVF9TVFJFUShMIjc4OTAiLCBlbmdpbmUoKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgLy8gVGVzdHMgZnJvbToKKyAgLy8gaHR0cDovL3VuaWNvZGUub3JnL1B1YmxpYy9VTklEQVRBL2F1eGlsaWFyeS9Xb3JkQnJlYWtUZXN0Lmh0bWwjc2FtcGxlcworICBzdHJ1Y3QgYm91bmRzIHsKKyAgICBzaXplX3Qgc3RhcnQ7CisgICAgc2l6ZV90IGVuZDsKKyAgfTsKKyAgc3RydWN0IHsKKyAgICBjb25zdCB3Y2hhcl90KiBzdHI7CisgICAgc3RkOjp2ZWN0b3I8Y29uc3Qgd2NoYXJfdCo+IHJlc3VsdHM7CisgIH0gdGVzdHNbXSA9IHsKKyAgICAgIC8vIHtMIlxyXG5hXG5cdTAzMDgiLCB7TCJcclxuIiwgTCJhIiwgTCJcbiIsIEwiXHUwMzA4In19LAorICAgICAgLy8ge0wiYVx1MDMwOCIsIHtMImFcdTAzMDgifX0sCisgICAgICAvLyB7TCIgXHUyMDBkXHUwNjQ2Iiwge0wiIFx1MjAwZCIsIEwiXHUwNjQ2In19LAorICAgICAgLy8ge0wiXHUwNjQ2XHUyMDBkICIsIHtMIlx1MDY0Nlx1MjAwZCIsIEwiICJ9fSwKKyAgICAgIHtMIkFBQSIsIHtMIkFBQSJ9fSwKKyAgICAgIHtMIkE6QSIsIHtMIkE6QSJ9fSwKKyAgICAgIHtMIkE6OkEiLCB7TCJBIiwgTCI6IiwgTCI6IiwgTCJBIn19LAorICAgICAgLy8ge0wiXHUwNWQwJyIsIHtMIlx1MDVkMCcifX0sCisgICAgICAvLyB7TCJcdTA1ZDBcIlx1MDVkMCIsIHtMIlx1MDVkMFwiXHUwNWQwIn19LAorICAgICAge0wiQTAwQSIsIHtMIkEwMEEifX0sCisgICAgICB7TCIwLDAiLCB7TCIwLDAifX0sCisgICAgICB7TCIwLCwwIiwge0wiMCIsIEwiLCIsIEwiLCIsIEwiMCJ9fSwKKyAgICAgIHtMIlx1MzAzMVx1MzAzMSIsIHtMIlx1MzAzMVx1MzAzMSJ9fSwKKyAgICAgIHtMIkFfMF9cdTMwMzFfIiwge0wiQV8wX1x1MzAzMV8ifX0sCisgICAgICB7TCJBX19BIiwge0wiQV9fQSJ9fSwKKyAgICAgIC8vIHtMIlx1MjAwZFx1MjY0MCIsIHtMIlx1MjAwZFx1MjY0MCJ9fSwKKyAgICAgIC8vIHtMImFcdTAzMDhcdTIwMGJcdTAzMDhiIiwge0wiYVx1MDMwOFx1MjAwYlx1MDMwOGIifX0sCisgIH07CisKKyAgZm9yIChhdXRvIHQgOiB0ZXN0cykgeworICAgIGVuZ2luZSgpLT5DbGVhcigpOworICAgIGVuZ2luZSgpLT5JbnNlcnQoMCwgdC5zdHIpOworCisgICAgc2l6ZV90IGlkeCA9IDA7CisgICAgZm9yIChjb25zdCBhdXRvKiByZXMgOiB0LnJlc3VsdHMpIHsKKyAgICAgIHN0ZDo6dGllKHN0YXJ0X2lkeCwgY291bnQpID0gZW5naW5lKCktPkJvdW5kc0ZvcldvcmRBdChpZHgpOworICAgICAgZW5naW5lKCktPlNldFNlbGVjdGlvbihzdGFydF9pZHgsIGNvdW50KTsKKyAgICAgIEVYUEVDVF9TVFJFUShyZXMsIGVuZ2luZSgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKQorICAgICAgICAgIDw8ICJJbnB1dDogJyIgPDwgdC5zdHIgPDwgIiciOworICAgICAgaWR4ICs9IGNvdW50OworICAgIH0KKyAgfQorfQorCitURVNUX0YoQ0ZERV9UZXh0RWRpdEVuZ2luZVRlc3QsIEN1cnNvck1vdmVtZW50KSB7CisgIGVuZ2luZSgpLT5DbGVhcigpOworICBlbmdpbmUoKS0+SW5zZXJ0KDAsIEwiSGVsbG8iKTsKKworICBFWFBFQ1RfRVEoMFUsIGVuZ2luZSgpLT5HZXRJbmRleExlZnQoMCkpOworICBFWFBFQ1RfRVEoNVUsIGVuZ2luZSgpLT5HZXRJbmRleFJpZ2h0KDUpKTsKKyAgRVhQRUNUX0VRKDJVLCBlbmdpbmUoKS0+R2V0SW5kZXhVcCgyKSk7CisgIEVYUEVDVF9FUSgyVSwgZW5naW5lKCktPkdldEluZGV4RG93bigyKSk7CisgIEVYUEVDVF9FUSgxVSwgZW5naW5lKCktPkdldEluZGV4TGVmdCgyKSk7CisgIEVYUEVDVF9FUSgxVSwgZW5naW5lKCktPkdldEluZGV4QmVmb3JlKDIpKTsKKyAgRVhQRUNUX0VRKDNVLCBlbmdpbmUoKS0+R2V0SW5kZXhSaWdodCgyKSk7CisgIEVYUEVDVF9FUSgwVSwgZW5naW5lKCktPkdldEluZGV4QXRTdGFydE9mTGluZSgyKSk7CisgIEVYUEVDVF9FUSg1VSwgZW5naW5lKCktPkdldEluZGV4QXRFbmRPZkxpbmUoMikpOworCisgIGVuZ2luZSgpLT5DbGVhcigpOworICBlbmdpbmUoKS0+SW5zZXJ0KDAsIEwiVGhlIGJvb2sgaXMgXCLZhdiv2K7ZhCDYpdmE2YkgQysrXCIiKTsKKyAgRVhQRUNUX0VRKDJVLCBlbmdpbmUoKS0+R2V0SW5kZXhCZWZvcmUoMykpOyAgICAvLyBCZWZvcmUgaXMgdG8gbGVmdC4KKyAgRVhQRUNUX0VRKDE2VSwgZW5naW5lKCktPkdldEluZGV4QmVmb3JlKDE1KSk7ICAvLyBCZWZvcmUgaXMgdG8gcmlnaHQuCisgIEVYUEVDVF9FUSgyMlUsIGVuZ2luZSgpLT5HZXRJbmRleEJlZm9yZSgyMykpOyAgLy8gQmVmb3JlIGlzIHRvIGxlZnQuCisKKyAgZW5naW5lKCktPkNsZWFyKCk7CisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJIZWxsb1xyXG5Xb3JsZFxyXG5UZXN0Iik7CisgIC8vIE1vdmUgdG8gZW5kIG9mIEhlbGxvIGZyb20gc3RhcnQgb2YgV29ybGQuCisgIGVuZ2luZSgpLT5TZXRTZWxlY3Rpb24oZW5naW5lKCktPkdldEluZGV4QmVmb3JlKDdVKSwgNyk7CisgIEVYUEVDVF9TVFJFUShMIlxyXG5Xb3JsZCIsIGVuZ2luZSgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKworICAvLyBTZWNvbmQgbGV0dGVyIGluIEhlbGxvIGZyb20gc2Vjb25kIGxldHRlciBpbiBXb3JsZC4KKyAgZW5naW5lKCktPlNldFNlbGVjdGlvbihlbmdpbmUoKS0+R2V0SW5kZXhVcCg4VSksIDIpOworICBFWFBFQ1RfU1RSRVEoTCJlbCIsIGVuZ2luZSgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKworICAvLyBTZWNvbmQgbGV0dGVyIGluIFdvcmxkIGZyb20gc2Vjb25kIGxldHRlciBpbiBUZXN0LgorICBlbmdpbmUoKS0+U2V0U2VsZWN0aW9uKGVuZ2luZSgpLT5HZXRJbmRleFVwKDE1VSksIDIpOworICBFWFBFQ1RfU1RSRVEoTCJvciIsIGVuZ2luZSgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKworICAvLyBTZWNvbmQgbGV0dGVyIGluIFdvcmxkIGZyb20gc2Vjb25kIGxldHRlciBpbiBIZWxsby4KKyAgZW5naW5lKCktPlNldFNlbGVjdGlvbihlbmdpbmUoKS0+R2V0SW5kZXhEb3duKDFVKSwgMik7CisgIEVYUEVDVF9TVFJFUShMIm9yIiwgZW5naW5lKCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIC8vIFNlY29uZCBsZXR0ZXIgaW4gVGVzdCBmcm9tIHNlY29uZCBsZXR0ZXIgaW4gV29ybGQuCisgIGVuZ2luZSgpLT5TZXRTZWxlY3Rpb24oZW5naW5lKCktPkdldEluZGV4RG93big4VSksIDIpOworICBFWFBFQ1RfU1RSRVEoTCJlcyIsIGVuZ2luZSgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKworICBzaXplX3Qgc3RhcnRfaWR4ID0gZW5naW5lKCktPkdldEluZGV4QXRTdGFydE9mTGluZSg4VSk7CisgIHNpemVfdCBlbmRfaWR4ID0gZW5naW5lKCktPkdldEluZGV4QXRFbmRPZkxpbmUoOFUpOworICBlbmdpbmUoKS0+U2V0U2VsZWN0aW9uKHN0YXJ0X2lkeCwgZW5kX2lkeCAtIHN0YXJ0X2lkeCk7CisgIEVYUEVDVF9TVFJFUShMIldvcmxkIiwgZW5naW5lKCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIC8vIE1vdmUgcGFzdCBcclxuIHRvIGJlZm9yZSBXLgorICBlbmdpbmUoKS0+U2V0U2VsZWN0aW9uKGVuZ2luZSgpLT5HZXRJbmRleFJpZ2h0KDVVKSwgNSk7CisgIEVYUEVDVF9TVFJFUShMIldvcmxkIiwgZW5naW5lKCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIGVuZ2luZSgpLT5DbGVhcigpOworICBlbmdpbmUoKS0+SW5zZXJ0KDAsIEwiU2hvcnRcbkFuZCBhIHZlcnkgbG9uZyBsaW5lIik7CisgIGVuZ2luZSgpLT5TZXRTZWxlY3Rpb24oZW5naW5lKCktPkdldEluZGV4VXAoMTRVKSwgMTEpOworICBFWFBFQ1RfU1RSRVEoTCJcbkFuZCBhIHZlcnkiLCBlbmdpbmUoKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgZW5naW5lKCktPkNsZWFyKCk7CisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJBIFZlcnkgbG9uZyBsaW5lXG5TaG9ydCIpOworICBFWFBFQ1RfRVEoZW5naW5lKCktPkdldExlbmd0aCgpLCBlbmdpbmUoKS0+R2V0SW5kZXhEb3duKDhVKSk7CisKKyAgZW5naW5lKCktPkNsZWFyKCk7CisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJIZWxsb1xyV29ybGRcclRlc3QiKTsKKyAgLy8gTW92ZSB0byBlbmQgb2YgSGVsbG8gZnJvbSBzdGFydCBvZiBXb3JsZC4KKyAgZW5naW5lKCktPlNldFNlbGVjdGlvbihlbmdpbmUoKS0+R2V0SW5kZXhCZWZvcmUoNlUpLCA2KTsKKyAgRVhQRUNUX1NUUkVRKEwiXHJXb3JsZCIsIGVuZ2luZSgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKworICAvLyBTZWNvbmQgbGV0dGVyIGluIEhlbGxvIGZyb20gc2Vjb25kIGxldHRlciBpbiBXb3JsZC4KKyAgZW5naW5lKCktPlNldFNlbGVjdGlvbihlbmdpbmUoKS0+R2V0SW5kZXhVcCg3VSksIDIpOworICBFWFBFQ1RfU1RSRVEoTCJlbCIsIGVuZ2luZSgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKworICAvLyBTZWNvbmQgbGV0dGVyIGluIFdvcmxkIGZyb20gc2Vjb25kIGxldHRlciBpbiBUZXN0LgorICBlbmdpbmUoKS0+U2V0U2VsZWN0aW9uKGVuZ2luZSgpLT5HZXRJbmRleFVwKDEzVSksIDIpOworICBFWFBFQ1RfU1RSRVEoTCJvciIsIGVuZ2luZSgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKworICAvLyBTZWNvbmQgbGV0dGVyIGluIFdvcmxkIGZyb20gc2Vjb25kIGxldHRlciBpbiBIZWxsby4KKyAgZW5naW5lKCktPlNldFNlbGVjdGlvbihlbmdpbmUoKS0+R2V0SW5kZXhEb3duKDFVKSwgMik7CisgIEVYUEVDVF9TVFJFUShMIm9yIiwgZW5naW5lKCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIC8vIFNlY29uZCBsZXR0ZXIgaW4gVGVzdCBmcm9tIHNlY29uZCBsZXR0ZXIgaW4gV29ybGQuCisgIGVuZ2luZSgpLT5TZXRTZWxlY3Rpb24oZW5naW5lKCktPkdldEluZGV4RG93big3VSksIDIpOworICBFWFBFQ1RfU1RSRVEoTCJlcyIsIGVuZ2luZSgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKworICBzdGFydF9pZHggPSBlbmdpbmUoKS0+R2V0SW5kZXhBdFN0YXJ0T2ZMaW5lKDdVKTsKKyAgZW5kX2lkeCA9IGVuZ2luZSgpLT5HZXRJbmRleEF0RW5kT2ZMaW5lKDdVKTsKKyAgZW5naW5lKCktPlNldFNlbGVjdGlvbihzdGFydF9pZHgsIGVuZF9pZHggLSBzdGFydF9pZHgpOworICBFWFBFQ1RfU1RSRVEoTCJXb3JsZCIsIGVuZ2luZSgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKworICAvLyBNb3ZlIHBhc3QgXHIgdG8gYmVmb3JlIFcuCisgIGVuZ2luZSgpLT5TZXRTZWxlY3Rpb24oZW5naW5lKCktPkdldEluZGV4UmlnaHQoNVUpLCA1KTsKKyAgRVhQRUNUX1NUUkVRKEwiV29ybGQiLCBlbmdpbmUoKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7CisKKyAgZW5naW5lKCktPkNsZWFyKCk7CisgIGVuZ2luZSgpLT5JbnNlcnQoMCwgTCJIZWxsb1xuV29ybGRcblRlc3QiKTsKKyAgLy8gTW92ZSB0byBlbmQgb2YgSGVsbG8gZnJvbSBzdGFydCBvZiBXb3JsZC4KKyAgZW5naW5lKCktPlNldFNlbGVjdGlvbihlbmdpbmUoKS0+R2V0SW5kZXhCZWZvcmUoNlUpLCA2KTsKKyAgRVhQRUNUX1NUUkVRKEwiXG5Xb3JsZCIsIGVuZ2luZSgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKworICAvLyBTZWNvbmQgbGV0dGVyIGluIEhlbGxvIGZyb20gc2Vjb25kIGxldHRlciBpbiBXb3JsZC4KKyAgZW5naW5lKCktPlNldFNlbGVjdGlvbihlbmdpbmUoKS0+R2V0SW5kZXhVcCg3VSksIDIpOworICBFWFBFQ1RfU1RSRVEoTCJlbCIsIGVuZ2luZSgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKworICAvLyBTZWNvbmQgbGV0dGVyIGluIFdvcmxkIGZyb20gc2Vjb25kIGxldHRlciBpbiBUZXN0LgorICBlbmdpbmUoKS0+U2V0U2VsZWN0aW9uKGVuZ2luZSgpLT5HZXRJbmRleFVwKDEzVSksIDIpOworICBFWFBFQ1RfU1RSRVEoTCJvciIsIGVuZ2luZSgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKworICAvLyBTZWNvbmQgbGV0dGVyIGluIFdvcmxkIGZyb20gc2Vjb25kIGxldHRlciBpbiBIZWxsby4KKyAgZW5naW5lKCktPlNldFNlbGVjdGlvbihlbmdpbmUoKS0+R2V0SW5kZXhEb3duKDFVKSwgMik7CisgIEVYUEVDVF9TVFJFUShMIm9yIiwgZW5naW5lKCktPkdldFNlbGVjdGVkVGV4dCgpLmNfc3RyKCkpOworCisgIC8vIFNlY29uZCBsZXR0ZXIgaW4gVGVzdCBmcm9tIHNlY29uZCBsZXR0ZXIgaW4gV29ybGQuCisgIGVuZ2luZSgpLT5TZXRTZWxlY3Rpb24oZW5naW5lKCktPkdldEluZGV4RG93big3VSksIDIpOworICBFWFBFQ1RfU1RSRVEoTCJlcyIsIGVuZ2luZSgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKworICBzdGFydF9pZHggPSBlbmdpbmUoKS0+R2V0SW5kZXhBdFN0YXJ0T2ZMaW5lKDdVKTsKKyAgZW5kX2lkeCA9IGVuZ2luZSgpLT5HZXRJbmRleEF0RW5kT2ZMaW5lKDdVKTsKKyAgZW5naW5lKCktPlNldFNlbGVjdGlvbihzdGFydF9pZHgsIGVuZF9pZHggLSBzdGFydF9pZHgpOworICBFWFBFQ1RfU1RSRVEoTCJXb3JsZCIsIGVuZ2luZSgpLT5HZXRTZWxlY3RlZFRleHQoKS5jX3N0cigpKTsKKworICAvLyBNb3ZlIHBhc3QgXHIgdG8gYmVmb3JlIFcuCisgIGVuZ2luZSgpLT5TZXRTZWxlY3Rpb24oZW5naW5lKCktPkdldEluZGV4UmlnaHQoNVUpLCA1KTsKKyAgRVhQRUNUX1NUUkVRKEwiV29ybGQiLCBlbmdpbmUoKS0+R2V0U2VsZWN0ZWRUZXh0KCkuY19zdHIoKSk7Cit9CmRpZmYgLS1naXQgYS94ZmEvZmRlL2NmZGVfdGV4dG91dC5jcHAgYi94ZmEvZmRlL2NmZGVfdGV4dG91dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTllN2FlNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9mZGUvY2ZkZV90ZXh0b3V0LmNwcApAQCAtMCwwICsxLDU2OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2ZkZS9jZmRlX3RleHRvdXQuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mb250LmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisjaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9jZmdhc19nZWZvbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZmdhcy9sYXlvdXQvY2Z4X3R4dGJyZWFrLmgiCisKK25hbWVzcGFjZSB7CisKK2Jvb2wgVGV4dEFsaWdubWVudFZlcnRpY2FsbHlDZW50ZXJlZChjb25zdCBGREVfVGV4dEFsaWdubWVudCBhbGlnbikgeworICByZXR1cm4gYWxpZ24gPT0gRkRFX1RleHRBbGlnbm1lbnQ6OmtDZW50ZXJMZWZ0IHx8CisgICAgICAgICBhbGlnbiA9PSBGREVfVGV4dEFsaWdubWVudDo6a0NlbnRlciB8fAorICAgICAgICAgYWxpZ24gPT0gRkRFX1RleHRBbGlnbm1lbnQ6OmtDZW50ZXJSaWdodDsKK30KKworYm9vbCBJc1RleHRBbGlnbm1lbnRUb3AoY29uc3QgRkRFX1RleHRBbGlnbm1lbnQgYWxpZ24pIHsKKyAgcmV0dXJuIGFsaWduID09IEZERV9UZXh0QWxpZ25tZW50OjprVG9wTGVmdDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworYm9vbCBDRkRFX1RleHRPdXQ6OkRyYXdTdHJpbmcoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRkdBU19HRUZvbnQ+JiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZkZvbnRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgeworICBBU1NFUlQocEZvbnQgJiYgcENoYXJQb3MgJiYgaUNvdW50ID4gMCk7CisKKyAgQ0ZYX0ZvbnQqIHBGeEZvbnQgPSBwRm9udC0+R2V0RGV2Rm9udCgpOworICBpZiAoRm9udFN0eWxlSXNJdGFsaWMocEZvbnQtPkdldEZvbnRTdHlsZXMoKSkgJiYgIXBGeEZvbnQtPklzSXRhbGljKCkpIHsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7ICsraSkgeworICAgICAgc3RhdGljIGNvbnN0IGZsb2F0IG1jID0gMC4yNjc5NDlmOworICAgICAgZmxvYXQqIHBBTSA9IHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeDsKKyAgICAgIHBBTVsyXSA9IG1jICogcEFNWzBdICsgcEFNWzJdOworICAgICAgcEFNWzNdID0gbWMgKiBwQU1bMV0gKyBwQU1bM107CisgICAgICArK3BDaGFyUG9zOworICAgIH0KKyAgfQorCisjaWYgX0ZYX1BMQVRGT1JNXyAhPSBfRlhfUExBVEZPUk1fV0lORE9XU18KKyAgdWludDMyX3QgZHdGb250U3R5bGUgPSBwRm9udC0+R2V0Rm9udFN0eWxlcygpOworICBDRlhfRm9udCBGeEZvbnQ7CisgIGF1dG8gU3Vic3RGeEZvbnQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX1N1YnN0Rm9udD4oKTsKKyAgU3Vic3RGeEZvbnQtPm1fV2VpZ2h0ID0gRm9udFN0eWxlSXNCb2xkKGR3Rm9udFN0eWxlKSA/IDcwMCA6IDQwMDsKKyAgU3Vic3RGeEZvbnQtPm1fSXRhbGljQW5nbGUgPSBGb250U3R5bGVJc0l0YWxpYyhkd0ZvbnRTdHlsZSkgPyAtMTIgOiAwOworICBTdWJzdEZ4Rm9udC0+bV9XZWlnaHRDSksgPSBTdWJzdEZ4Rm9udC0+bV9XZWlnaHQ7CisgIFN1YnN0RnhGb250LT5tX2JJdGFsaWNDSksgPSBGb250U3R5bGVJc0l0YWxpYyhkd0ZvbnRTdHlsZSk7CisgIEZ4Rm9udC5TZXRTdWJzdEZvbnQoc3RkOjptb3ZlKFN1YnN0RnhGb250KSk7CisjZW5kaWYgIC8vIF9GWF9QTEFURk9STV8gIT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisKKyAgUmV0YWluUHRyPENGR0FTX0dFRm9udD4gcEN1ckZvbnQ7CisgIEZYVEVYVF9DSEFSUE9TKiBwQ3VyQ1AgPSBudWxscHRyOworICBpbnQzMl90IGlDdXJDb3VudCA9IDA7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgKytpKSB7CisgICAgUmV0YWluUHRyPENGR0FTX0dFRm9udD4gcFNURm9udCA9CisgICAgICAgIHBGb250LT5HZXRTdWJzdEZvbnQoc3RhdGljX2Nhc3Q8aW50MzJfdD4ocENoYXJQb3MtPm1fR2x5cGhJbmRleCkpOworICAgIHBDaGFyUG9zLT5tX0dseXBoSW5kZXggJj0gMHgwMEZGRkZGRjsKKyAgICBwQ2hhclBvcy0+bV9iRm9udFN0eWxlID0gZmFsc2U7CisgICAgaWYgKHBDdXJGb250ICE9IHBTVEZvbnQpIHsKKyAgICAgIGlmIChwQ3VyRm9udCkgeworICAgICAgICBwRnhGb250ID0gcEN1ckZvbnQtPkdldERldkZvbnQoKTsKKworICAgICAgICBDRlhfRm9udCogZm9udDsKKyNpZiBfRlhfUExBVEZPUk1fICE9IF9GWF9QTEFURk9STV9XSU5ET1dTXworICAgICAgICBGeEZvbnQuU2V0RmFjZShwRnhGb250LT5HZXRGYWNlKCkpOworICAgICAgICBmb250ID0gJkZ4Rm9udDsKKyNlbHNlCisgICAgICAgIGZvbnQgPSBwRnhGb250OworI2VuZGlmICAvLyBfRlhfUExBVEZPUk1fICE9IF9GWF9QTEFURk9STV9XSU5ET1dTXworCisgICAgICAgIGRldmljZS0+RHJhd05vcm1hbFRleHQoaUN1ckNvdW50LCBwQ3VyQ1AsIGZvbnQsIC1mRm9udFNpemUsIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOworICAgICAgfQorICAgICAgcEN1ckZvbnQgPSBwU1RGb250OworICAgICAgcEN1ckNQID0gcENoYXJQb3M7CisgICAgICBpQ3VyQ291bnQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICArK2lDdXJDb3VudDsKKyAgICB9CisgICAgKytwQ2hhclBvczsKKyAgfQorCisgIGJvb2wgYlJldCA9IHRydWU7CisgIGlmIChwQ3VyRm9udCAmJiBpQ3VyQ291bnQpIHsKKyAgICBwRnhGb250ID0gcEN1ckZvbnQtPkdldERldkZvbnQoKTsKKyAgICBDRlhfRm9udCogZm9udDsKKyNpZiBfRlhfUExBVEZPUk1fICE9IF9GWF9QTEFURk9STV9XSU5ET1dTXworICAgIEZ4Rm9udC5TZXRGYWNlKHBGeEZvbnQtPkdldEZhY2UoKSk7CisgICAgZm9udCA9ICZGeEZvbnQ7CisjZWxzZQorICAgIGZvbnQgPSBwRnhGb250OworI2VuZGlmICAvLyBfRlhfUExBVEZPUk1fICE9IF9GWF9QTEFURk9STV9XSU5ET1dTXworCisgICAgYlJldCA9IGRldmljZS0+RHJhd05vcm1hbFRleHQoaUN1ckNvdW50LCBwQ3VyQ1AsIGZvbnQsIC1mRm9udFNpemUsIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOworICB9CisKKyNpZiBfRlhfUExBVEZPUk1fICE9IF9GWF9QTEFURk9STV9XSU5ET1dTXworICBGeEZvbnQuU2V0RmFjZShudWxscHRyKTsKKyNlbmRpZiAgLy8gX0ZYX1BMQVRGT1JNXyAhPSBfRlhfUExBVEZPUk1fV0lORE9XU18KKworICByZXR1cm4gYlJldDsKK30KKworRkRFX1RUT1BJRUNFOjpGREVfVFRPUElFQ0UoKSA9IGRlZmF1bHQ7CisKK0ZERV9UVE9QSUVDRTo6RkRFX1RUT1BJRUNFKGNvbnN0IEZERV9UVE9QSUVDRSYgdGhhdCkgPSBkZWZhdWx0OworCitGREVfVFRPUElFQ0U6On5GREVfVFRPUElFQ0UoKSA9IGRlZmF1bHQ7CisKK0NGREVfVGV4dE91dDo6Q0ZERV9UZXh0T3V0KCkKKyAgICA6IG1fcFR4dEJyZWFrKHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfVHh0QnJlYWs+KCkpLAorICAgICAgbV9wRm9udChudWxscHRyKSwKKyAgICAgIG1fZkZvbnRTaXplKDEyLjBmKSwKKyAgICAgIG1fZkxpbmVTcGFjZShtX2ZGb250U2l6ZSksCisgICAgICBtX2ZMaW5lUG9zKDAuMGYpLAorICAgICAgbV9mVG9sZXJhbmNlKDAuMGYpLAorICAgICAgbV9pQWxpZ25tZW50KEZERV9UZXh0QWxpZ25tZW50OjprVG9wTGVmdCksCisgICAgICBtX1R4dENvbG9yKDB4RkYwMDAwMDApLAorICAgICAgbV9kd1R4dEJrU3R5bGVzKDApLAorICAgICAgbV90dG9MaW5lcyg1KSwKKyAgICAgIG1faUN1ckxpbmUoMCksCisgICAgICBtX2lDdXJQaWVjZSgwKSwKKyAgICAgIG1faVRvdGFsTGluZXMoMCkge30KKworQ0ZERV9UZXh0T3V0Ojp+Q0ZERV9UZXh0T3V0KCkge30KKwordm9pZCBDRkRFX1RleHRPdXQ6OlNldEZvbnQoY29uc3QgUmV0YWluUHRyPENGR0FTX0dFRm9udD4mIHBGb250KSB7CisgIEFTU0VSVChwRm9udCk7CisgIG1fcEZvbnQgPSBwRm9udDsKKyAgbV9wVHh0QnJlYWstPlNldEZvbnQocEZvbnQpOworfQorCit2b2lkIENGREVfVGV4dE91dDo6U2V0Rm9udFNpemUoZmxvYXQgZkZvbnRTaXplKSB7CisgIEFTU0VSVChmRm9udFNpemUgPiAwKTsKKyAgbV9mRm9udFNpemUgPSBmRm9udFNpemU7CisgIG1fcFR4dEJyZWFrLT5TZXRGb250U2l6ZShmRm9udFNpemUpOworfQorCit2b2lkIENGREVfVGV4dE91dDo6U2V0U3R5bGVzKGNvbnN0IEZERV9UZXh0U3R5bGUmIGR3U3R5bGVzKSB7CisgIG1fU3R5bGVzID0gZHdTdHlsZXM7CisKKyAgbV9kd1R4dEJrU3R5bGVzID0gMDsKKyAgaWYgKG1fU3R5bGVzLnNpbmdsZV9saW5lXykKKyAgICBtX2R3VHh0QmtTdHlsZXMgfD0gRlhfTEFZT1VUU1RZTEVfU2luZ2xlTGluZTsKKworICBtX3BUeHRCcmVhay0+U2V0TGF5b3V0U3R5bGVzKG1fZHdUeHRCa1N0eWxlcyk7Cit9CisKK3ZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRBbGlnbm1lbnQoRkRFX1RleHRBbGlnbm1lbnQgaUFsaWdubWVudCkgeworICBtX2lBbGlnbm1lbnQgPSBpQWxpZ25tZW50OworCisgIGludDMyX3QgdHh0QnJlYWtBbGlnbm1lbnQgPSAwOworICBzd2l0Y2ggKG1faUFsaWdubWVudCkgeworICAgIGNhc2UgRkRFX1RleHRBbGlnbm1lbnQ6OmtDZW50ZXI6CisgICAgICB0eHRCcmVha0FsaWdubWVudCA9IENGWF9UeHRMaW5lQWxpZ25tZW50X0NlbnRlcjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRkRFX1RleHRBbGlnbm1lbnQ6OmtDZW50ZXJSaWdodDoKKyAgICAgIHR4dEJyZWFrQWxpZ25tZW50ID0gQ0ZYX1R4dExpbmVBbGlnbm1lbnRfUmlnaHQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZERV9UZXh0QWxpZ25tZW50OjprQ2VudGVyTGVmdDoKKyAgICBjYXNlIEZERV9UZXh0QWxpZ25tZW50OjprVG9wTGVmdDoKKyAgICAgIHR4dEJyZWFrQWxpZ25tZW50ID0gQ0ZYX1R4dExpbmVBbGlnbm1lbnRfTGVmdDsKKyAgICAgIGJyZWFrOworICB9CisgIG1fcFR4dEJyZWFrLT5TZXRBbGlnbm1lbnQodHh0QnJlYWtBbGlnbm1lbnQpOworfQorCit2b2lkIENGREVfVGV4dE91dDo6U2V0TGluZVNwYWNlKGZsb2F0IGZMaW5lU3BhY2UpIHsKKyAgQVNTRVJUKGZMaW5lU3BhY2UgPiAxLjBmKTsKKyAgbV9mTGluZVNwYWNlID0gZkxpbmVTcGFjZTsKK30KKwordm9pZCBDRkRFX1RleHRPdXQ6OlNldExpbmVCcmVha1RvbGVyYW5jZShmbG9hdCBmVG9sZXJhbmNlKSB7CisgIG1fZlRvbGVyYW5jZSA9IGZUb2xlcmFuY2U7CisgIG1fcFR4dEJyZWFrLT5TZXRMaW5lQnJlYWtUb2xlcmFuY2UobV9mVG9sZXJhbmNlKTsKK30KKwordm9pZCBDRkRFX1RleHRPdXQ6OkNhbGNMb2dpY1NpemUoY29uc3QgV2lkZVN0cmluZyYgc3RyLCBDRlhfU2l6ZUYmIHNpemUpIHsKKyAgQ0ZYX1JlY3RGIHJ0VGV4dCgwLjBmLCAwLjBmLCBzaXplLndpZHRoLCBzaXplLmhlaWdodCk7CisgIENhbGNMb2dpY1NpemUoc3RyLCBydFRleHQpOworICBzaXplID0gcnRUZXh0LlNpemUoKTsKK30KKwordm9pZCBDRkRFX1RleHRPdXQ6OkNhbGNMb2dpY1NpemUoY29uc3QgV2lkZVN0cmluZyYgc3RyLCBDRlhfUmVjdEYmIHJlY3QpIHsKKyAgaWYgKHN0ci5Jc0VtcHR5KCkpIHsKKyAgICByZWN0LndpZHRoID0gMC4wZjsKKyAgICByZWN0LmhlaWdodCA9IDAuMGY7CisgICAgcmV0dXJuOworICB9CisKKyAgQVNTRVJUKG1fcEZvbnQgJiYgbV9mRm9udFNpemUgPj0gMS4wZik7CisKKyAgaWYgKCFtX1N0eWxlcy5zaW5nbGVfbGluZV8pIHsKKyAgICBpZiAocmVjdC5XaWR0aCgpIDwgMS4wZikKKyAgICAgIHJlY3Qud2lkdGggPSBtX2ZGb250U2l6ZSAqIDEwMDAuMGY7CisKKyAgICBtX3BUeHRCcmVhay0+U2V0TGluZVdpZHRoKHJlY3QuV2lkdGgoKSk7CisgIH0KKworICBtX2lUb3RhbExpbmVzID0gMDsKKyAgZmxvYXQgZldpZHRoID0gMC4wZjsKKyAgZmxvYXQgZkhlaWdodCA9IDAuMGY7CisgIGZsb2F0IGZTdGFydFBvcyA9IHJlY3QucmlnaHQoKTsKKyAgQ0ZYX0JyZWFrVHlwZSBkd0JyZWFrU3RhdHVzID0gQ0ZYX0JyZWFrVHlwZTo6Tm9uZTsKKyAgYm9vbCBicmVha19jaGFyX2lzX3NldCA9IGZhbHNlOworICBmb3IgKGNvbnN0IHdjaGFyX3QmIHdjaCA6IHN0cikgeworICAgIGlmICghYnJlYWtfY2hhcl9pc19zZXQgJiYgKHdjaCA9PSBMJ1xuJyB8fCB3Y2ggPT0gTCdccicpKSB7CisgICAgICBicmVha19jaGFyX2lzX3NldCA9IHRydWU7CisgICAgICBtX3BUeHRCcmVhay0+U2V0UGFyYWdyYXBoQnJlYWtDaGFyKHdjaCk7CisgICAgfQorICAgIGR3QnJlYWtTdGF0dXMgPSBtX3BUeHRCcmVhay0+QXBwZW5kQ2hhcih3Y2gpOworICAgIGlmICghQ0ZYX0JyZWFrVHlwZU5vbmVPclBpZWNlKGR3QnJlYWtTdGF0dXMpKQorICAgICAgUmV0cmlldmVMaW5lV2lkdGgoZHdCcmVha1N0YXR1cywgZlN0YXJ0UG9zLCBmV2lkdGgsIGZIZWlnaHQpOworICB9CisKKyAgZHdCcmVha1N0YXR1cyA9IG1fcFR4dEJyZWFrLT5FbmRCcmVhayhDRlhfQnJlYWtUeXBlOjpQYXJhZ3JhcGgpOworICBpZiAoIUNGWF9CcmVha1R5cGVOb25lT3JQaWVjZShkd0JyZWFrU3RhdHVzKSkKKyAgICBSZXRyaWV2ZUxpbmVXaWR0aChkd0JyZWFrU3RhdHVzLCBmU3RhcnRQb3MsIGZXaWR0aCwgZkhlaWdodCk7CisKKyAgbV9wVHh0QnJlYWstPlJlc2V0KCk7CisgIGZsb2F0IGZJbmMgPSByZWN0LkhlaWdodCgpIC0gZkhlaWdodDsKKyAgaWYgKFRleHRBbGlnbm1lbnRWZXJ0aWNhbGx5Q2VudGVyZWQobV9pQWxpZ25tZW50KSkKKyAgICBmSW5jIC89IDIuMGY7CisgIGVsc2UgaWYgKElzVGV4dEFsaWdubWVudFRvcChtX2lBbGlnbm1lbnQpKQorICAgIGZJbmMgPSAwLjBmOworCisgIHJlY3QubGVmdCArPSBmU3RhcnRQb3M7CisgIHJlY3QudG9wICs9IGZJbmM7CisgIHJlY3Qud2lkdGggPSBzdGQ6Om1pbihmV2lkdGgsIHJlY3QuV2lkdGgoKSk7CisgIHJlY3QuaGVpZ2h0ID0gZkhlaWdodDsKKyAgaWYgKG1fU3R5bGVzLmxhc3RfbGluZV9oZWlnaHRfKQorICAgIHJlY3QuaGVpZ2h0IC09IG1fZkxpbmVTcGFjZSAtIG1fZkZvbnRTaXplOworfQorCitib29sIENGREVfVGV4dE91dDo6UmV0cmlldmVMaW5lV2lkdGgoQ0ZYX0JyZWFrVHlwZSBkd0JyZWFrU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0JiBmU3RhcnRQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQmIGZXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCYgZkhlaWdodCkgeworICBpZiAoQ0ZYX0JyZWFrVHlwZU5vbmVPclBpZWNlKGR3QnJlYWtTdGF0dXMpKQorICAgIHJldHVybiBmYWxzZTsKKworICBmbG9hdCBmTGluZVN0ZXAgPSAobV9mTGluZVNwYWNlID4gbV9mRm9udFNpemUpID8gbV9mTGluZVNwYWNlIDogbV9mRm9udFNpemU7CisgIGZsb2F0IGZMaW5lV2lkdGggPSAwLjBmOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX3BUeHRCcmVhay0+Q291bnRCcmVha1BpZWNlcygpOyBpKyspIHsKKyAgICBjb25zdCBDRlhfQnJlYWtQaWVjZSogcFBpZWNlID0gbV9wVHh0QnJlYWstPkdldEJyZWFrUGllY2VVbnN0YWJsZShpKTsKKyAgICBmTGluZVdpZHRoICs9IHN0YXRpY19jYXN0PGZsb2F0PihwUGllY2UtPm1faVdpZHRoKSAvIDIwMDAwLjBmOworICAgIGZTdGFydFBvcyA9CisgICAgICAgIHN0ZDo6bWluKGZTdGFydFBvcywgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBQaWVjZS0+bV9pU3RhcnRQb3MpIC8gMjAwMDAuMGYpOworICB9CisgIG1fcFR4dEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7CisKKyAgaWYgKGR3QnJlYWtTdGF0dXMgPT0gQ0ZYX0JyZWFrVHlwZTo6UGFyYWdyYXBoKQorICAgIG1fcFR4dEJyZWFrLT5SZXNldCgpOworICBpZiAoIW1fU3R5bGVzLmxpbmVfd3JhcF8gJiYgZHdCcmVha1N0YXR1cyA9PSBDRlhfQnJlYWtUeXBlOjpMaW5lKSB7CisgICAgZldpZHRoICs9IGZMaW5lV2lkdGg7CisgIH0gZWxzZSB7CisgICAgZldpZHRoID0gc3RkOjptYXgoZldpZHRoLCBmTGluZVdpZHRoKTsKKyAgICBmSGVpZ2h0ICs9IGZMaW5lU3RlcDsKKyAgfQorICArK21faVRvdGFsTGluZXM7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENGREVfVGV4dE91dDo6RHJhd0xvZ2ljVGV4dChDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7CisgIEFTU0VSVChtX3BGb250ICYmIG1fZkZvbnRTaXplID49IDEuMGYpOworCisgIGlmIChzdHIuSXNFbXB0eSgpKQorICAgIHJldHVybjsKKyAgaWYgKHJlY3Qud2lkdGggPCBtX2ZGb250U2l6ZSB8fCByZWN0LmhlaWdodCA8IG1fZkZvbnRTaXplKQorICAgIHJldHVybjsKKworICBmbG9hdCBmTGluZVdpZHRoID0gcmVjdC53aWR0aDsKKyAgbV9wVHh0QnJlYWstPlNldExpbmVXaWR0aChmTGluZVdpZHRoKTsKKyAgbV90dG9MaW5lcy5jbGVhcigpOworICBtX3dzVGV4dC5jbGVhcigpOworCisgIExvYWRUZXh0KFdpZGVTdHJpbmcoc3RyKSwgcmVjdCk7CisgIFJlbG9hZChyZWN0KTsKKyAgRG9BbGlnbm1lbnQocmVjdCk7CisKKyAgaWYgKCFkZXZpY2UgfHwgbV90dG9MaW5lcy5lbXB0eSgpKQorICAgIHJldHVybjsKKworICBDRlhfUmVjdEYgcnRDbGlwID0gbV9NYXRyaXguVHJhbnNmb3JtUmVjdChDRlhfUmVjdEYoKSk7CisgIGRldmljZS0+U2F2ZVN0YXRlKCk7CisgIGlmIChydENsaXAuV2lkdGgoKSA+IDAuMGYgJiYgcnRDbGlwLkhlaWdodCgpID4gMC4wZikKKyAgICBkZXZpY2UtPlNldENsaXBfUmVjdChydENsaXApOworCisgIGZvciAoYXV0byYgbGluZSA6IG1fdHRvTGluZXMpIHsKKyAgICBpbnQzMl90IGlQaWVjZXMgPSBsaW5lLkdldFNpemUoKTsKKyAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpUGllY2VzOyBqKyspIHsKKyAgICAgIEZERV9UVE9QSUVDRSogcFBpZWNlID0gbGluZS5HZXRQdHJBdChqKTsKKyAgICAgIGlmICghcFBpZWNlKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgaW50MzJfdCBpQ291bnQgPSBHZXREaXNwbGF5UG9zKHBQaWVjZSk7CisgICAgICBpZiAoaUNvdW50ID4gMCkgeworICAgICAgICBDRkRFX1RleHRPdXQ6OkRyYXdTdHJpbmcoZGV2aWNlLCBtX1R4dENvbG9yLCBtX3BGb250LCBtX0NoYXJQb3MuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaUNvdW50LCBtX2ZGb250U2l6ZSwgJm1fTWF0cml4KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgZGV2aWNlLT5SZXN0b3JlU3RhdGUoZmFsc2UpOworfQorCit2b2lkIENGREVfVGV4dE91dDo6TG9hZFRleHQoY29uc3QgV2lkZVN0cmluZyYgc3RyLCBjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsKKyAgQVNTRVJUKCFzdHIuSXNFbXB0eSgpKTsKKworICBtX3dzVGV4dCA9IHN0cjsKKworICBpZiAocGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxzaXplX3Q+KG1fQ2hhcldpZHRocykgPCBzdHIuR2V0TGVuZ3RoKCkpCisgICAgbV9DaGFyV2lkdGhzLnJlc2l6ZShzdHIuR2V0TGVuZ3RoKCksIDApOworCisgIGZsb2F0IGZMaW5lU3RlcCA9IChtX2ZMaW5lU3BhY2UgPiBtX2ZGb250U2l6ZSkgPyBtX2ZMaW5lU3BhY2UgOiBtX2ZGb250U2l6ZTsKKyAgZmxvYXQgZkxpbmVTdG9wID0gcmVjdC5ib3R0b20oKTsKKyAgbV9mTGluZVBvcyA9IHJlY3QudG9wOworICBpbnQzMl90IGlTdGFydENoYXIgPSAwOworICBpbnQzMl90IGlQaWVjZVdpZHRocyA9IDA7CisgIENGWF9CcmVha1R5cGUgZHdCcmVha1N0YXR1czsKKyAgYm9vbCBiUmV0ID0gZmFsc2U7CisgIGZvciAoY29uc3QgYXV0byYgd2NoIDogc3RyKSB7CisgICAgZHdCcmVha1N0YXR1cyA9IG1fcFR4dEJyZWFrLT5BcHBlbmRDaGFyKHdjaCk7CisgICAgaWYgKENGWF9CcmVha1R5cGVOb25lT3JQaWVjZShkd0JyZWFrU3RhdHVzKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgYm9vbCBiRW5kb2ZMaW5lID0KKyAgICAgICAgUmV0cmlldmVQaWVjZXMoZHdCcmVha1N0YXR1cywgaVN0YXJ0Q2hhciwgaVBpZWNlV2lkdGhzLCBmYWxzZSwgcmVjdCk7CisgICAgaWYgKGJFbmRvZkxpbmUgJiYKKyAgICAgICAgKG1fU3R5bGVzLmxpbmVfd3JhcF8gfHwgZHdCcmVha1N0YXR1cyA9PSBDRlhfQnJlYWtUeXBlOjpQYXJhZ3JhcGggfHwKKyAgICAgICAgIGR3QnJlYWtTdGF0dXMgPT0gQ0ZYX0JyZWFrVHlwZTo6UGFnZSkpIHsKKyAgICAgIGlQaWVjZVdpZHRocyA9IDA7CisgICAgICArK21faUN1ckxpbmU7CisgICAgICBtX2ZMaW5lUG9zICs9IGZMaW5lU3RlcDsKKyAgICB9CisgICAgaWYgKG1fZkxpbmVQb3MgKyBmTGluZVN0ZXAgPiBmTGluZVN0b3ApIHsKKyAgICAgIGludDMyX3QgaUN1ckxpbmUgPSBiRW5kb2ZMaW5lID8gbV9pQ3VyTGluZSAtIDEgOiBtX2lDdXJMaW5lOworICAgICAgbV90dG9MaW5lc1tpQ3VyTGluZV0uU2V0TmV3UmVsb2FkKHRydWUpOworICAgICAgYlJldCA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBkd0JyZWFrU3RhdHVzID0gbV9wVHh0QnJlYWstPkVuZEJyZWFrKENGWF9CcmVha1R5cGU6OlBhcmFncmFwaCk7CisgIGlmICghQ0ZYX0JyZWFrVHlwZU5vbmVPclBpZWNlKGR3QnJlYWtTdGF0dXMpICYmICFiUmV0KQorICAgIFJldHJpZXZlUGllY2VzKGR3QnJlYWtTdGF0dXMsIGlTdGFydENoYXIsIGlQaWVjZVdpZHRocywgZmFsc2UsIHJlY3QpOworCisgIG1fcFR4dEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7CisgIG1fcFR4dEJyZWFrLT5SZXNldCgpOworfQorCitib29sIENGREVfVGV4dE91dDo6UmV0cmlldmVQaWVjZXMoQ0ZYX0JyZWFrVHlwZSBkd0JyZWFrU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTdGFydENoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVBpZWNlV2lkdGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJlbG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsKKyAgZmxvYXQgZkxpbmVTdGVwID0gKG1fZkxpbmVTcGFjZSA+IG1fZkZvbnRTaXplKSA/IG1fZkxpbmVTcGFjZSA6IG1fZkZvbnRTaXplOworICBib29sIGJOZWVkUmVsb2FkID0gZmFsc2U7CisgIGludDMyX3QgaUxpbmVXaWR0aCA9IEZYU1lTX3JvdW5kKHJlY3QuV2lkdGgoKSAqIDIwMDAwLjBmKTsKKyAgaW50MzJfdCBpQ291bnQgPSBtX3BUeHRCcmVhay0+Q291bnRCcmVha1BpZWNlcygpOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgIGNvbnN0IENGWF9CcmVha1BpZWNlKiBwUGllY2UgPSBtX3BUeHRCcmVhay0+R2V0QnJlYWtQaWVjZVVuc3RhYmxlKGkpOworICAgIGludDMyX3QgaVBpZWNlQ2hhcnMgPSBwUGllY2UtPkdldExlbmd0aCgpOworICAgIGludDMyX3QgaUNoYXIgPSBpU3RhcnRDaGFyOworICAgIGludDMyX3QgaVdpZHRoID0gMDsKKyAgICBpbnQzMl90IGogPSAwOworICAgIGZvciAoOyBqIDwgaVBpZWNlQ2hhcnM7IGorKykgeworICAgICAgY29uc3QgQ0ZYX0NoYXIqIHBUQyA9IHBQaWVjZS0+R2V0Q2hhcihqKTsKKyAgICAgIGludDMyX3QgaUN1ckNoYXJXaWR0aCA9IHBUQy0+bV9pQ2hhcldpZHRoID4gMCA/IHBUQy0+bV9pQ2hhcldpZHRoIDogMDsKKyAgICAgIGlmIChtX1N0eWxlcy5zaW5nbGVfbGluZV8gfHwgIW1fU3R5bGVzLmxpbmVfd3JhcF8pIHsKKyAgICAgICAgaWYgKGlMaW5lV2lkdGggLSBpUGllY2VXaWR0aHMgLSBpV2lkdGggPCBpQ3VyQ2hhcldpZHRoKSB7CisgICAgICAgICAgYk5lZWRSZWxvYWQgPSB0cnVlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpV2lkdGggKz0gaUN1ckNoYXJXaWR0aDsKKyAgICAgIG1fQ2hhcldpZHRoc1tpQ2hhcisrXSA9IGlDdXJDaGFyV2lkdGg7CisgICAgfQorCisgICAgaWYgKGogPT0gMCAmJiAhYlJlbG9hZCkgeworICAgICAgbV90dG9MaW5lc1ttX2lDdXJMaW5lXS5TZXROZXdSZWxvYWQodHJ1ZSk7CisgICAgfSBlbHNlIGlmIChqID4gMCkgeworICAgICAgRkRFX1RUT1BJRUNFIHR0b1BpZWNlOworICAgICAgdHRvUGllY2UuaVN0YXJ0Q2hhciA9IGlTdGFydENoYXI7CisgICAgICB0dG9QaWVjZS5pQ2hhcnMgPSBqOworICAgICAgdHRvUGllY2UuZHdDaGFyU3R5bGVzID0gcFBpZWNlLT5tX2R3Q2hhclN0eWxlczsKKyAgICAgIHR0b1BpZWNlLnJ0UGllY2UgPSBDRlhfUmVjdEYoCisgICAgICAgICAgcmVjdC5sZWZ0ICsgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBQaWVjZS0+bV9pU3RhcnRQb3MpIC8gMjAwMDAuMGYsCisgICAgICAgICAgbV9mTGluZVBvcywgaVdpZHRoIC8gMjAwMDAuMGYsIGZMaW5lU3RlcCk7CisKKyAgICAgIGlmIChGWF9Jc09kZChwUGllY2UtPm1faUJpZGlMZXZlbCkpCisgICAgICAgIHR0b1BpZWNlLmR3Q2hhclN0eWxlcyB8PSBGWF9UWFRDSEFSU1RZTEVfT2RkQmlkaUxldmVsOworCisgICAgICBBcHBlbmRQaWVjZSh0dG9QaWVjZSwgYk5lZWRSZWxvYWQsIChiUmVsb2FkICYmIGkgPT0gaUNvdW50IC0gMSkpOworICAgIH0KKyAgICBpU3RhcnRDaGFyICs9IGlQaWVjZUNoYXJzOworICAgIGlQaWVjZVdpZHRocyArPSBpV2lkdGg7CisgIH0KKyAgbV9wVHh0QnJlYWstPkNsZWFyQnJlYWtQaWVjZXMoKTsKKworICByZXR1cm4gbV9TdHlsZXMuc2luZ2xlX2xpbmVfIHx8IG1fU3R5bGVzLmxpbmVfd3JhcF8gfHwgYk5lZWRSZWxvYWQgfHwKKyAgICAgICAgIGR3QnJlYWtTdGF0dXMgPT0gQ0ZYX0JyZWFrVHlwZTo6UGFyYWdyYXBoOworfQorCit2b2lkIENGREVfVGV4dE91dDo6QXBwZW5kUGllY2UoY29uc3QgRkRFX1RUT1BJRUNFJiB0dG9QaWVjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJOZWVkUmVsb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkVuZCkgeworICBpZiAobV9pQ3VyTGluZSA+PSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fdHRvTGluZXMpKSB7CisgICAgQ0ZERV9UVE9MaW5lIHR0b0xpbmU7CisgICAgdHRvTGluZS5TZXROZXdSZWxvYWQoYk5lZWRSZWxvYWQpOworCisgICAgbV9pQ3VyUGllY2UgPSB0dG9MaW5lLkFkZFBpZWNlKG1faUN1clBpZWNlLCB0dG9QaWVjZSk7CisgICAgbV90dG9MaW5lcy5wdXNoX2JhY2sodHRvTGluZSk7CisgICAgbV9pQ3VyTGluZSA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV90dG9MaW5lcykgLSAxOworICB9IGVsc2UgeworICAgIENGREVfVFRPTGluZSogcExpbmUgPSAmbV90dG9MaW5lc1ttX2lDdXJMaW5lXTsKKyAgICBwTGluZS0+U2V0TmV3UmVsb2FkKGJOZWVkUmVsb2FkKTsKKworICAgIG1faUN1clBpZWNlID0gcExpbmUtPkFkZFBpZWNlKG1faUN1clBpZWNlLCB0dG9QaWVjZSk7CisgICAgaWYgKGJFbmQpIHsKKyAgICAgIGludDMyX3QgaVBpZWNlcyA9IHBMaW5lLT5HZXRTaXplKCk7CisgICAgICBpZiAobV9pQ3VyUGllY2UgPCBpUGllY2VzKQorICAgICAgICBwTGluZS0+UmVtb3ZlTGFzdChpUGllY2VzIC0gbV9pQ3VyUGllY2UgLSAxKTsKKyAgICB9CisgIH0KKyAgaWYgKCFiRW5kICYmIGJOZWVkUmVsb2FkKQorICAgIG1faUN1clBpZWNlID0gMDsKK30KKwordm9pZCBDRkRFX1RleHRPdXQ6OlJlbG9hZChjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsKKyAgaW50IGkgPSAwOworICBmb3IgKGF1dG8mIGxpbmUgOiBtX3R0b0xpbmVzKSB7CisgICAgaWYgKGxpbmUuR2V0TmV3UmVsb2FkKCkpIHsKKyAgICAgIG1faUN1ckxpbmUgPSBpOworICAgICAgbV9pQ3VyUGllY2UgPSAwOworICAgICAgUmVsb2FkTGluZVBpZWNlKCZsaW5lLCByZWN0KTsKKyAgICB9CisgICAgKytpOworICB9Cit9CisKK3ZvaWQgQ0ZERV9UZXh0T3V0OjpSZWxvYWRMaW5lUGllY2UoQ0ZERV9UVE9MaW5lKiBwTGluZSwgY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7CisgIGNvbnN0IHdjaGFyX3QqIHB3c1N0ciA9IG1fd3NUZXh0LmNfc3RyKCk7CisgIGludDMyX3QgaVBpZWNlV2lkdGhzID0gMDsKKworICBGREVfVFRPUElFQ0UqIHBQaWVjZSA9IHBMaW5lLT5HZXRQdHJBdCgwKTsKKyAgaW50MzJfdCBpU3RhcnRDaGFyID0gcFBpZWNlLT5pU3RhcnRDaGFyOworICBpbnQzMl90IGlQaWVjZUNvdW50ID0gcExpbmUtPkdldFNpemUoKTsKKyAgaW50MzJfdCBpUGllY2VJbmRleCA9IDA7CisgIENGWF9CcmVha1R5cGUgZHdCcmVha1N0YXR1cyA9IENGWF9CcmVha1R5cGU6Ok5vbmU7CisgIG1fZkxpbmVQb3MgPSBwUGllY2UtPnJ0UGllY2UudG9wOworICB3aGlsZSAoaVBpZWNlSW5kZXggPCBpUGllY2VDb3VudCkgeworICAgIGludDMyX3QgaVN0YXIgPSBpU3RhcnRDaGFyOworICAgIGludDMyX3QgaUVuZCA9IHBQaWVjZS0+aUNoYXJzICsgaVN0YXI7CisgICAgd2hpbGUgKGlTdGFyIDwgaUVuZCkgeworICAgICAgZHdCcmVha1N0YXR1cyA9IG1fcFR4dEJyZWFrLT5BcHBlbmRDaGFyKCoocHdzU3RyICsgaVN0YXIpKTsKKyAgICAgIGlmICghQ0ZYX0JyZWFrVHlwZU5vbmVPclBpZWNlKGR3QnJlYWtTdGF0dXMpKQorICAgICAgICBSZXRyaWV2ZVBpZWNlcyhkd0JyZWFrU3RhdHVzLCBpU3RhcnRDaGFyLCBpUGllY2VXaWR0aHMsIHRydWUsIHJlY3QpOworCisgICAgICArK2lTdGFyOworICAgIH0KKyAgICArK2lQaWVjZUluZGV4OworICAgIHBQaWVjZSA9IHBMaW5lLT5HZXRQdHJBdChpUGllY2VJbmRleCk7CisgIH0KKworICBkd0JyZWFrU3RhdHVzID0gbV9wVHh0QnJlYWstPkVuZEJyZWFrKENGWF9CcmVha1R5cGU6OlBhcmFncmFwaCk7CisgIGlmICghQ0ZYX0JyZWFrVHlwZU5vbmVPclBpZWNlKGR3QnJlYWtTdGF0dXMpKQorICAgIFJldHJpZXZlUGllY2VzKGR3QnJlYWtTdGF0dXMsIGlTdGFydENoYXIsIGlQaWVjZVdpZHRocywgdHJ1ZSwgcmVjdCk7CisKKyAgbV9wVHh0QnJlYWstPlJlc2V0KCk7Cit9CisKK3ZvaWQgQ0ZERV9UZXh0T3V0OjpEb0FsaWdubWVudChjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsKKyAgaWYgKG1fdHRvTGluZXMuZW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgRkRFX1RUT1BJRUNFKiBwRmlyc3RQaWVjZSA9IG1fdHRvTGluZXMuYmFjaygpLkdldFB0ckF0KDApOworICBpZiAoIXBGaXJzdFBpZWNlKQorICAgIHJldHVybjsKKworICBmbG9hdCBmSW5jID0gcmVjdC5ib3R0b20oKSAtIHBGaXJzdFBpZWNlLT5ydFBpZWNlLmJvdHRvbSgpOworICBpZiAoVGV4dEFsaWdubWVudFZlcnRpY2FsbHlDZW50ZXJlZChtX2lBbGlnbm1lbnQpKQorICAgIGZJbmMgLz0gMi4wZjsKKyAgZWxzZSBpZiAoSXNUZXh0QWxpZ25tZW50VG9wKG1faUFsaWdubWVudCkpCisgICAgZkluYyA9IDAuMGY7CisKKyAgaWYgKGZJbmMgPCAxLjBmKQorICAgIHJldHVybjsKKworICBmb3IgKGF1dG8mIGxpbmUgOiBtX3R0b0xpbmVzKSB7CisgICAgaW50MzJfdCBpUGllY2VzID0gbGluZS5HZXRTaXplKCk7CisgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVBpZWNlczsgaisrKQorICAgICAgbGluZS5HZXRQdHJBdChqKS0+cnRQaWVjZS50b3AgKz0gZkluYzsKKyAgfQorfQorCitpbnQzMl90IENGREVfVGV4dE91dDo6R2V0RGlzcGxheVBvcyhGREVfVFRPUElFQ0UqIHBQaWVjZSkgeworICBBU1NFUlQocFBpZWNlLT5pQ2hhcnMgPj0gMCk7CisKKyAgaWYgKHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9DaGFyUG9zKSA8IHBQaWVjZS0+aUNoYXJzKQorICAgIG1fQ2hhclBvcy5yZXNpemUocFBpZWNlLT5pQ2hhcnMsIEZYVEVYVF9DSEFSUE9TKCkpOworCisgIEZYX1RYVFJVTiB0cjsKKyAgdHIud3NTdHIgPSBtX3dzVGV4dCArIHBQaWVjZS0+aVN0YXJ0Q2hhcjsKKyAgdHIucFdpZHRocyA9ICZtX0NoYXJXaWR0aHNbcFBpZWNlLT5pU3RhcnRDaGFyXTsKKyAgdHIuaUxlbmd0aCA9IHBQaWVjZS0+aUNoYXJzOworICB0ci5wRm9udCA9IG1fcEZvbnQ7CisgIHRyLmZGb250U2l6ZSA9IG1fZkZvbnRTaXplOworICB0ci5kd1N0eWxlcyA9IG1fZHdUeHRCa1N0eWxlczsKKyAgdHIuZHdDaGFyU3R5bGVzID0gcFBpZWNlLT5kd0NoYXJTdHlsZXM7CisgIHRyLnBSZWN0ID0gJnBQaWVjZS0+cnRQaWVjZTsKKworICByZXR1cm4gbV9wVHh0QnJlYWstPkdldERpc3BsYXlQb3MoJnRyLCBtX0NoYXJQb3MuZGF0YSgpKTsKK30KKworQ0ZERV9UZXh0T3V0OjpDRkRFX1RUT0xpbmU6OkNGREVfVFRPTGluZSgpIDogbV9iTmV3UmVsb2FkKGZhbHNlKSB7fQorCitDRkRFX1RleHRPdXQ6OkNGREVfVFRPTGluZTo6Q0ZERV9UVE9MaW5lKGNvbnN0IENGREVfVFRPTGluZSYgdHRvTGluZSkKKyAgICA6IG1fcGllY2VzKDUpIHsKKyAgbV9iTmV3UmVsb2FkID0gdHRvTGluZS5tX2JOZXdSZWxvYWQ7CisgIG1fcGllY2VzID0gdHRvTGluZS5tX3BpZWNlczsKK30KKworQ0ZERV9UZXh0T3V0OjpDRkRFX1RUT0xpbmU6On5DRkRFX1RUT0xpbmUoKSB7fQorCitpbnQzMl90IENGREVfVGV4dE91dDo6Q0ZERV9UVE9MaW5lOjpBZGRQaWVjZShpbnQzMl90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkRFX1RUT1BJRUNFJiB0dG9QaWVjZSkgeworICBpZiAoaW5kZXggPj0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX3BpZWNlcykpIHsKKyAgICBtX3BpZWNlcy5wdXNoX2JhY2sodHRvUGllY2UpOworICAgIHJldHVybiBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fcGllY2VzKTsKKyAgfQorICBtX3BpZWNlc1tpbmRleF0gPSB0dG9QaWVjZTsKKyAgcmV0dXJuIGluZGV4OworfQorCitpbnQzMl90IENGREVfVGV4dE91dDo6Q0ZERV9UVE9MaW5lOjpHZXRTaXplKCkgY29uc3QgeworICByZXR1cm4gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX3BpZWNlcyk7Cit9CisKK0ZERV9UVE9QSUVDRSogQ0ZERV9UZXh0T3V0OjpDRkRFX1RUT0xpbmU6OkdldFB0ckF0KGludDMyX3QgaW5kZXgpIHsKKyAgcmV0dXJuIHBkZml1bTo6SW5kZXhJbkJvdW5kcyhtX3BpZWNlcywgaW5kZXgpID8gJm1fcGllY2VzW2luZGV4XSA6IG51bGxwdHI7Cit9CisKK3ZvaWQgQ0ZERV9UZXh0T3V0OjpDRkRFX1RUT0xpbmU6OlJlbW92ZUxhc3QoaW50MzJfdCBpY291bnQpIHsKKyAgaWYgKGljb3VudCA8IDApCisgICAgcmV0dXJuOworICBtX3BpZWNlcy5lcmFzZSgKKyAgICAgIG1fcGllY2VzLmVuZCgpIC0KKyAgICAgICAgICBzdGQ6Om1pbihpY291bnQsIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9waWVjZXMpKSwKKyAgICAgIG1fcGllY2VzLmVuZCgpKTsKK30KZGlmZiAtLWdpdCBhL3hmYS9mZGUvY2ZkZV90ZXh0b3V0LmggYi94ZmEvZmRlL2NmZGVfdGV4dG91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNjg3OGUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZmRlL2NmZGVfdGV4dG91dC5oCkBAIC0wLDAgKzEsMTEwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZERV9DRkRFX1RFWFRPVVRfSF8KKyNkZWZpbmUgWEZBX0ZERV9DRkRFX1RFWFRPVVRfSF8KKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9jaGFyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9kZWZhdWx0cmVuZGVyZGV2aWNlLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCisjaW5jbHVkZSAieGZhL2ZkZS9jZmRlX2RhdGEuaCIKKworY2xhc3MgQ0ZERV9SZW5kZXJEZXZpY2U7CitjbGFzcyBDRkdBU19HRUZvbnQ7CitjbGFzcyBDRlhfUmVuZGVyRGV2aWNlOworY2xhc3MgQ0ZYX1R4dEJyZWFrOworCitjbGFzcyBDRkRFX1RleHRPdXQgeworIHB1YmxpYzoKKyAgc3RhdGljIGJvb2wgRHJhd1N0cmluZyhDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiYgcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZGb250U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKKworICBDRkRFX1RleHRPdXQoKTsKKyAgfkNGREVfVGV4dE91dCgpOworCisgIHZvaWQgU2V0Rm9udChjb25zdCBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiYgcEZvbnQpOworICB2b2lkIFNldEZvbnRTaXplKGZsb2F0IGZGb250U2l6ZSk7CisgIHZvaWQgU2V0VGV4dENvbG9yKEZYX0FSR0IgY29sb3IpIHsgbV9UeHRDb2xvciA9IGNvbG9yOyB9CisgIHZvaWQgU2V0U3R5bGVzKGNvbnN0IEZERV9UZXh0U3R5bGUmIGR3U3R5bGVzKTsKKyAgdm9pZCBTZXRBbGlnbm1lbnQoRkRFX1RleHRBbGlnbm1lbnQgaUFsaWdubWVudCk7CisgIHZvaWQgU2V0TGluZVNwYWNlKGZsb2F0IGZMaW5lU3BhY2UpOworICB2b2lkIFNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsgbV9NYXRyaXggPSBtYXRyaXg7IH0KKyAgdm9pZCBTZXRMaW5lQnJlYWtUb2xlcmFuY2UoZmxvYXQgZlRvbGVyYW5jZSk7CisKKyAgdm9pZCBDYWxjTG9naWNTaXplKGNvbnN0IFdpZGVTdHJpbmcmIHN0ciwgQ0ZYX1NpemVGJiBzaXplKTsKKyAgdm9pZCBDYWxjTG9naWNTaXplKGNvbnN0IFdpZGVTdHJpbmcmIHN0ciwgQ0ZYX1JlY3RGJiByZWN0KTsKKyAgdm9pZCBEcmF3TG9naWNUZXh0KENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBzdHIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QpOworICBpbnQzMl90IEdldFRvdGFsTGluZXMoKSBjb25zdCB7IHJldHVybiBtX2lUb3RhbExpbmVzOyB9CisKKyBwcml2YXRlOgorICBjbGFzcyBDRkRFX1RUT0xpbmUgeworICAgcHVibGljOgorICAgIENGREVfVFRPTGluZSgpOworICAgIENGREVfVFRPTGluZShjb25zdCBDRkRFX1RUT0xpbmUmIHR0b0xpbmUpOworICAgIH5DRkRFX1RUT0xpbmUoKTsKKworICAgIGJvb2wgR2V0TmV3UmVsb2FkKCkgY29uc3QgeyByZXR1cm4gbV9iTmV3UmVsb2FkOyB9CisgICAgdm9pZCBTZXROZXdSZWxvYWQoYm9vbCByZWxvYWQpIHsgbV9iTmV3UmVsb2FkID0gcmVsb2FkOyB9CisgICAgaW50MzJfdCBBZGRQaWVjZShpbnQzMl90IGluZGV4LCBjb25zdCBGREVfVFRPUElFQ0UmIHR0b1BpZWNlKTsKKyAgICBpbnQzMl90IEdldFNpemUoKSBjb25zdDsKKyAgICBGREVfVFRPUElFQ0UqIEdldFB0ckF0KGludDMyX3QgaW5kZXgpOworICAgIHZvaWQgUmVtb3ZlTGFzdChpbnQzMl90IGlDb3VudCk7CisKKyAgIHByaXZhdGU6CisgICAgYm9vbCBtX2JOZXdSZWxvYWQ7CisgICAgc3RkOjpkZXF1ZTxGREVfVFRPUElFQ0U+IG1fcGllY2VzOworICB9OworCisgIGJvb2wgUmV0cmlldmVMaW5lV2lkdGgoQ0ZYX0JyZWFrVHlwZSBkd0JyZWFrU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0JiBmU3RhcnRQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQmIGZXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCYgZkhlaWdodCk7CisgIHZvaWQgTG9hZFRleHQoY29uc3QgV2lkZVN0cmluZyYgc3RyLCBjb25zdCBDRlhfUmVjdEYmIHJlY3QpOworCisgIHZvaWQgUmVsb2FkKGNvbnN0IENGWF9SZWN0RiYgcmVjdCk7CisgIHZvaWQgUmVsb2FkTGluZVBpZWNlKENGREVfVFRPTGluZSogcExpbmUsIGNvbnN0IENGWF9SZWN0RiYgcmVjdCk7CisgIGJvb2wgUmV0cmlldmVQaWVjZXMoQ0ZYX0JyZWFrVHlwZSBkd0JyZWFrU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTdGFydENoYXIsCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVBpZWNlV2lkdGhzLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJlbG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QpOworICB2b2lkIEFwcGVuZFBpZWNlKGNvbnN0IEZERV9UVE9QSUVDRSYgdHRvUGllY2UsIGJvb2wgYk5lZWRSZWxvYWQsIGJvb2wgYkVuZCk7CisgIHZvaWQgRG9BbGlnbm1lbnQoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KTsKKyAgaW50MzJfdCBHZXREaXNwbGF5UG9zKEZERV9UVE9QSUVDRSogcFBpZWNlKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1R4dEJyZWFrPiBtX3BUeHRCcmVhazsKKyAgUmV0YWluUHRyPENGR0FTX0dFRm9udD4gbV9wRm9udDsKKyAgZmxvYXQgbV9mRm9udFNpemU7CisgIGZsb2F0IG1fZkxpbmVTcGFjZTsKKyAgZmxvYXQgbV9mTGluZVBvczsKKyAgZmxvYXQgbV9mVG9sZXJhbmNlOworICBGREVfVGV4dEFsaWdubWVudCBtX2lBbGlnbm1lbnQ7CisgIEZERV9UZXh0U3R5bGUgbV9TdHlsZXM7CisgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IG1fQ2hhcldpZHRoczsKKyAgRlhfQVJHQiBtX1R4dENvbG9yOworICB1aW50MzJfdCBtX2R3VHh0QmtTdHlsZXM7CisgIFdpZGVTdHJpbmcgbV93c1RleHQ7CisgIENGWF9NYXRyaXggbV9NYXRyaXg7CisgIHN0ZDo6ZGVxdWU8Q0ZERV9UVE9MaW5lPiBtX3R0b0xpbmVzOworICBpbnQzMl90IG1faUN1ckxpbmU7CisgIGludDMyX3QgbV9pQ3VyUGllY2U7CisgIGludDMyX3QgbV9pVG90YWxMaW5lczsKKyAgc3RkOjp2ZWN0b3I8RlhURVhUX0NIQVJQT1M+IG1fQ2hhclBvczsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZERV9DRkRFX1RFWFRPVVRfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZGUvY2ZkZV90eHRlZHRidWYuY3BwIGIveGZhL2ZkZS9jZmRlX3R4dGVkdGJ1Zi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMmUwZDEuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jZmRlX3R4dGVkdGJ1Zi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZkZS9jZmRlX3R4dGVkdGJ1Zi5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgotCi1uYW1lc3BhY2UgewotCi1jb25zdCBpbnQga0RlZmF1bHRDaHVua1NpemUgPSAxMDI0OwotCi19ICAvLyBuYW1lc3BhY2UKLQotQ0ZERV9UeHRFZHRCdWY6OkNGREVfVHh0RWR0QnVmKCkgOiBtX2NodW5rU2l6ZShrRGVmYXVsdENodW5rU2l6ZSksIG1fblRvdGFsKDApIHsKLSAgbV9jaHVua3MucHVzaF9iYWNrKE5ld0NodW5rKCkpOwotfQotCi1DRkRFX1R4dEVkdEJ1Zjo6fkNGREVfVHh0RWR0QnVmKCkge30KLQotaW50MzJfdCBDRkRFX1R4dEVkdEJ1Zjo6R2V0Q2h1bmtTaXplKCkgY29uc3QgewotICByZXR1cm4gbV9jaHVua1NpemU7Ci19Ci0KLWludDMyX3QgQ0ZERV9UeHRFZHRCdWY6OkdldFRleHRMZW5ndGgoKSBjb25zdCB7Ci0gIHJldHVybiBtX25Ub3RhbDsKLX0KLQotdm9pZCBDRkRFX1R4dEVkdEJ1Zjo6U2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7Ci0gIEFTU0VSVCghd3NUZXh0LklzRW1wdHkoKSk7Ci0KLSAgQ2xlYXIoZmFsc2UpOwotICBpbnQzMl90IG5UZXh0TGVuZ3RoID0gd3NUZXh0LkdldExlbmd0aCgpOwotICBpbnQzMl90IG5OZWVkQ291bnQgPQotICAgICAgKChuVGV4dExlbmd0aCAtIDEpIC8gR2V0Q2h1bmtTaXplKCkgKyAxKSAtIG1fY2h1bmtzLnNpemUoKTsKLSAgaW50MzJfdCBpID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IG5OZWVkQ291bnQ7IGkrKykKLSAgICBtX2NodW5rcy5wdXNoX2JhY2soTmV3Q2h1bmsoKSk7Ci0KLSAgaW50MzJfdCBuVG90YWxDb3VudCA9IG1fY2h1bmtzLnNpemUoKTsKLSAgY29uc3QgRlhfV0NIQVIqIGxwU3JjQnVmID0gd3NUZXh0LmNfc3RyKCk7Ci0gIGludDMyX3QgbkxlYXZlID0gblRleHRMZW5ndGg7Ci0gIGludDMyX3QgbkNvcHllZExlbmd0aCA9IEdldENodW5rU2l6ZSgpOwotICBmb3IgKGkgPSAwOyBpIDwgblRvdGFsQ291bnQgJiYgbkxlYXZlID4gMDsgaSsrKSB7Ci0gICAgaWYgKG5MZWF2ZSA8IG5Db3B5ZWRMZW5ndGgpIHsKLSAgICAgIG5Db3B5ZWRMZW5ndGggPSBuTGVhdmU7Ci0gICAgfQotCi0gICAgQ2h1bmtIZWFkZXIqIGNodW5rID0gbV9jaHVua3NbaV0uZ2V0KCk7Ci0gICAgRlhTWVNfbWVtY3B5KGNodW5rLT53Q2hhcnMuZ2V0KCksIGxwU3JjQnVmLAotICAgICAgICAgICAgICAgICBuQ29weWVkTGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gICAgbkxlYXZlIC09IG5Db3B5ZWRMZW5ndGg7Ci0gICAgbHBTcmNCdWYgKz0gbkNvcHllZExlbmd0aDsKLSAgICBjaHVuay0+blVzZWQgPSBuQ29weWVkTGVuZ3RoOwotICB9Ci0gIG1fblRvdGFsID0gblRleHRMZW5ndGg7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENGREVfVHh0RWR0QnVmOjpHZXRUZXh0KCkgY29uc3QgewotICByZXR1cm4gR2V0UmFuZ2UoMCwgbV9uVG90YWwpOwotfQotCi1GWF9XQ0hBUiBDRkRFX1R4dEVkdEJ1Zjo6R2V0Q2hhckJ5SW5kZXgoaW50MzJfdCBuSW5kZXgpIGNvbnN0IHsKLSAgQVNTRVJUKG5JbmRleCA+PSAwICYmIG5JbmRleCA8IEdldFRleHRMZW5ndGgoKSk7Ci0KLSAgQ2h1bmtIZWFkZXIqIHBDaHVua0hlYWRlciA9IG51bGxwdHI7Ci0gIGludDMyX3QgblRvdGFsID0gMDsKLSAgZm9yIChjb25zdCBhdXRvJiBjaHVuayA6IG1fY2h1bmtzKSB7Ci0gICAgcENodW5rSGVhZGVyID0gY2h1bmsuZ2V0KCk7Ci0gICAgblRvdGFsICs9IHBDaHVua0hlYWRlci0+blVzZWQ7Ci0gICAgaWYgKG5Ub3RhbCA+IG5JbmRleCkKLSAgICAgIGJyZWFrOwotICB9Ci0gIEFTU0VSVChwQ2h1bmtIZWFkZXIpOwotCi0gIEZYX1dDSEFSKiBidWYgPSBwQ2h1bmtIZWFkZXItPndDaGFycy5nZXQoKTsKLSAgcmV0dXJuIGJ1ZltwQ2h1bmtIZWFkZXItPm5Vc2VkIC0gKG5Ub3RhbCAtIG5JbmRleCldOwotfQotCi1DRlhfV2lkZVN0cmluZyBDRkRFX1R4dEVkdEJ1Zjo6R2V0UmFuZ2UoaW50MzJfdCBuQmVnaW4sIGludDMyX3Qgbkxlbmd0aCkgY29uc3QgewotICBpZiAobkxlbmd0aCA9PSAwIHx8IEdldFRleHRMZW5ndGgoKSA9PSAwKQotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotCi0gIEFTU0VSVChuQmVnaW4gPj0gMCAmJiBuTGVuZ3RoID4gMCAmJiBuQmVnaW4gPCBHZXRUZXh0TGVuZ3RoKCkgJiYKLSAgICAgICAgIG5CZWdpbiArIG5MZW5ndGggPD0gR2V0VGV4dExlbmd0aCgpKTsKLQotICBpbnQzMl90IGNodW5rSW5kZXggPSAwOwotICBpbnQzMl90IGNoYXJJbmRleCA9IDA7Ci0gIHN0ZDo6dGllKGNodW5rSW5kZXgsIGNoYXJJbmRleCkgPSBJbmRleDJDUChuQmVnaW4pOwotCi0gIGludDMyX3QgbkxlYXZlID0gbkxlbmd0aDsKLSAgaW50MzJfdCBuQ291bnQgPSBtX2NodW5rcy5zaXplKCk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0OwotICBGWF9XQ0hBUiogbHBEc3RCdWYgPSB3c1RleHQuR2V0QnVmZmVyKG5MZW5ndGgpOwotICBpbnQzMl90IG5DaHVua0luZGV4ID0gY2h1bmtJbmRleDsKLQotICBDaHVua0hlYWRlciogY2h1bmtIZWFkZXIgPSBtX2NodW5rc1tuQ2h1bmtJbmRleF0uZ2V0KCk7Ci0gIGludDMyX3QgbkNvcHlMZW5ndGggPSBjaHVua0hlYWRlci0+blVzZWQgLSBjaGFySW5kZXg7Ci0gIEZYX1dDSEFSKiBscFNyY0J1ZiA9IGNodW5rSGVhZGVyLT53Q2hhcnMuZ2V0KCkgKyBjaGFySW5kZXg7Ci0gIHdoaWxlIChuTGVhdmUgPiAwKSB7Ci0gICAgaWYgKG5MZWF2ZSA8PSBuQ29weUxlbmd0aCkgewotICAgICAgbkNvcHlMZW5ndGggPSBuTGVhdmU7Ci0gICAgfQotICAgIEZYU1lTX21lbWNweShscERzdEJ1ZiwgbHBTcmNCdWYsIG5Db3B5TGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gICAgbkNodW5rSW5kZXgrKzsKLSAgICBpZiAobkNodW5rSW5kZXggPj0gbkNvdW50KSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2h1bmtIZWFkZXIgPSBtX2NodW5rc1tuQ2h1bmtJbmRleF0uZ2V0KCk7Ci0gICAgbHBTcmNCdWYgPSBjaHVua0hlYWRlci0+d0NoYXJzLmdldCgpOwotICAgIG5MZWF2ZSAtPSBuQ29weUxlbmd0aDsKLSAgICBscERzdEJ1ZiArPSBuQ29weUxlbmd0aDsKLSAgICBuQ29weUxlbmd0aCA9IGNodW5rSGVhZGVyLT5uVXNlZDsKLSAgfQotICB3c1RleHQuUmVsZWFzZUJ1ZmZlcigpOwotCi0gIHJldHVybiB3c1RleHQ7Ci19Ci0KLXZvaWQgQ0ZERV9UeHRFZHRCdWY6Okluc2VydChpbnQzMl90IG5Qb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW5ndGgpIHsKLSAgQVNTRVJUKG5Qb3MgPj0gMCAmJiBuUG9zIDw9IG1fblRvdGFsKTsKLSAgQVNTRVJUKG5MZW5ndGggPiAwKTsKLQotICBpbnQzMl90IGNodW5rSW5kZXggPSAwOwotICBpbnQzMl90IGNoYXJJbmRleCA9IDA7Ci0gIHN0ZDo6dGllKGNodW5rSW5kZXgsIGNoYXJJbmRleCkgPSBJbmRleDJDUChuUG9zKTsKLQotICBpbnQzMl90IG5MZW5ndGhUZW1wID0gbkxlbmd0aDsKLSAgaWYgKGNoYXJJbmRleCAhPSAwKSB7Ci0gICAgYXV0byBuZXdDaHVuayA9IE5ld0NodW5rKCk7Ci0KLSAgICBDaHVua0hlYWRlciogY2h1bmsgPSBtX2NodW5rc1tjaHVua0luZGV4XS5nZXQoKTsKLSAgICBpbnQzMl90IG5Db3B5ID0gY2h1bmstPm5Vc2VkIC0gY2hhckluZGV4OwotCi0gICAgRlhTWVNfbWVtY3B5KG5ld0NodW5rLT53Q2hhcnMuZ2V0KCksIGNodW5rLT53Q2hhcnMuZ2V0KCkgKyBjaGFySW5kZXgsCi0gICAgICAgICAgICAgICAgIG5Db3B5ICogc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gICAgY2h1bmstPm5Vc2VkIC09IG5Db3B5OwotICAgIGNodW5rSW5kZXgrKzsKLQotICAgIG5ld0NodW5rLT5uVXNlZCA9IG5Db3B5OwotICAgIG1fY2h1bmtzLmluc2VydChtX2NodW5rcy5iZWdpbigpICsgY2h1bmtJbmRleCwgc3RkOjptb3ZlKG5ld0NodW5rKSk7Ci0gICAgY2hhckluZGV4ID0gMDsKLSAgfQotCi0gIGlmIChjaHVua0luZGV4ICE9IDApIHsKLSAgICBDaHVua0hlYWRlciogY2h1bmsgPSBtX2NodW5rc1tjaHVua0luZGV4IC0gMV0uZ2V0KCk7Ci0gICAgaWYgKGNodW5rLT5uVXNlZCAhPSBHZXRDaHVua1NpemUoKSkgewotICAgICAgY2h1bmtJbmRleC0tOwotICAgICAgaW50MzJfdCBuRnJlZSA9IEdldENodW5rU2l6ZSgpIC0gY2h1bmstPm5Vc2VkOwotICAgICAgaW50MzJfdCBuQ29weSA9IHN0ZDo6bWluKG5MZW5ndGhUZW1wLCBuRnJlZSk7Ci0gICAgICBGWFNZU19tZW1jcHkoY2h1bmstPndDaGFycy5nZXQoKSArIGNodW5rLT5uVXNlZCwgbHBUZXh0LAotICAgICAgICAgICAgICAgICAgIG5Db3B5ICogc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gICAgICBscFRleHQgKz0gbkNvcHk7Ci0gICAgICBuTGVuZ3RoVGVtcCAtPSBuQ29weTsKLSAgICAgIGNodW5rLT5uVXNlZCArPSBuQ29weTsKLSAgICAgIGNodW5rSW5kZXgrKzsKLSAgICB9Ci0gIH0KLQotICB3aGlsZSAobkxlbmd0aFRlbXAgPiAwKSB7Ci0gICAgYXV0byBjaHVuayA9IE5ld0NodW5rKCk7Ci0KLSAgICBpbnQzMl90IG5Db3B5ID0gc3RkOjptaW4obkxlbmd0aFRlbXAsIEdldENodW5rU2l6ZSgpKTsKLSAgICBGWFNZU19tZW1jcHkoY2h1bmstPndDaGFycy5nZXQoKSwgbHBUZXh0LCBuQ29weSAqIHNpemVvZihGWF9XQ0hBUikpOwotICAgIGxwVGV4dCArPSBuQ29weTsKLSAgICBuTGVuZ3RoVGVtcCAtPSBuQ29weTsKLSAgICBjaHVuay0+blVzZWQgPSBuQ29weTsKLSAgICBtX2NodW5rcy5pbnNlcnQobV9jaHVua3MuYmVnaW4oKSArIGNodW5rSW5kZXgsIHN0ZDo6bW92ZShjaHVuaykpOwotICAgIGNodW5rSW5kZXgrKzsKLSAgfQotICBtX25Ub3RhbCArPSBuTGVuZ3RoOwotfQotCi12b2lkIENGREVfVHh0RWR0QnVmOjpEZWxldGUoaW50MzJfdCBuSW5kZXgsIGludDMyX3Qgbkxlbmd0aCkgewotICBBU1NFUlQobkxlbmd0aCA+IDAgJiYgbkluZGV4ID49IDAgJiYgbkluZGV4ICsgbkxlbmd0aCA8PSBtX25Ub3RhbCk7Ci0KLSAgaW50MzJfdCBlbmRDaHVua0luZGV4ID0gMDsKLSAgaW50MzJfdCBlbmRDaGFySW5kZXggPSAwOwotICBzdGQ6OnRpZShlbmRDaHVua0luZGV4LCBlbmRDaGFySW5kZXgpID0gSW5kZXgyQ1AobkluZGV4ICsgbkxlbmd0aCAtIDEpOwotICBtX25Ub3RhbCAtPSBuTGVuZ3RoOwotCi0gIENodW5rSGVhZGVyKiBjaHVuayA9IG1fY2h1bmtzW2VuZENodW5rSW5kZXhdLmdldCgpOwotICBpbnQzMl90IG5GaXJzdFBhcnQgPSBlbmRDaGFySW5kZXggKyAxOwotICBpbnQzMl90IG5Nb3ZlUGFydCA9IGNodW5rLT5uVXNlZCAtIG5GaXJzdFBhcnQ7Ci0gIGlmIChuTW92ZVBhcnQgIT0gMCkgewotICAgIGludDMyX3QgbkRlbGV0ZSA9IHN0ZDo6bWluKG5GaXJzdFBhcnQsIG5MZW5ndGgpOwotICAgIEZYU1lTX21lbW1vdmUoY2h1bmstPndDaGFycy5nZXQoKSArIG5GaXJzdFBhcnQgLSBuRGVsZXRlLAotICAgICAgICAgICAgICAgICAgY2h1bmstPndDaGFycy5nZXQoKSArIG5GaXJzdFBhcnQsCi0gICAgICAgICAgICAgICAgICBuTW92ZVBhcnQgKiBzaXplb2YoRlhfV0NIQVIpKTsKLSAgICBjaHVuay0+blVzZWQgLT0gbkRlbGV0ZTsKLSAgICBuTGVuZ3RoIC09IG5EZWxldGU7Ci0gICAgZW5kQ2h1bmtJbmRleC0tOwotICB9Ci0KLSAgd2hpbGUgKG5MZW5ndGggPiAwKSB7Ci0gICAgQ2h1bmtIZWFkZXIqIGN1ckNodW5rID0gbV9jaHVua3NbZW5kQ2h1bmtJbmRleF0uZ2V0KCk7Ci0gICAgaW50MzJfdCBuRGVsZXRlZCA9IHN0ZDo6bWluKGN1ckNodW5rLT5uVXNlZCwgbkxlbmd0aCk7Ci0gICAgY3VyQ2h1bmstPm5Vc2VkIC09IG5EZWxldGVkOwotICAgIGlmIChjdXJDaHVuay0+blVzZWQgPT0gMCkKLSAgICAgIG1fY2h1bmtzLmVyYXNlKG1fY2h1bmtzLmJlZ2luKCkgKyBlbmRDaHVua0luZGV4KTsKLQotICAgIG5MZW5ndGggLT0gbkRlbGV0ZWQ7Ci0gICAgZW5kQ2h1bmtJbmRleC0tOwotICB9Ci19Ci0KLXZvaWQgQ0ZERV9UeHRFZHRCdWY6OkNsZWFyKGJvb2wgYlJlbGVhc2UpIHsKLSAgaWYgKGJSZWxlYXNlKSB7Ci0gICAgbV9jaHVua3MuY2xlYXIoKTsKLSAgfSBlbHNlIHsKLSAgICBzaXplX3QgaSA9IDA7Ci0gICAgd2hpbGUgKGkgPCBtX2NodW5rcy5zaXplKCkpCi0gICAgICBtX2NodW5rc1tpKytdLT5uVXNlZCA9IDA7Ci0gIH0KLSAgbV9uVG90YWwgPSAwOwotfQotCi12b2lkIENGREVfVHh0RWR0QnVmOjpTZXRDaHVua1NpemVGb3JUZXN0aW5nKHNpemVfdCBzaXplKSB7Ci0gIEFTU0VSVChzaXplID4gMCk7Ci0KLSAgbV9jaHVua1NpemUgPSBzaXplOwotICBtX2NodW5rcy5jbGVhcigpOwotICBtX2NodW5rcy5wdXNoX2JhY2soTmV3Q2h1bmsoKSk7Ci19Ci0KLXN0ZDo6dHVwbGU8aW50MzJfdCwgaW50MzJfdD4gQ0ZERV9UeHRFZHRCdWY6OkluZGV4MkNQKGludDMyX3QgbkluZGV4KSBjb25zdCB7Ci0gIEFTU0VSVChuSW5kZXggPD0gR2V0VGV4dExlbmd0aCgpKTsKLQotICBpZiAobkluZGV4ID09IG1fblRvdGFsKSB7Ci0gICAgcmV0dXJuIHN0ZDo6dHVwbGU8aW50MzJfdCwgaW50MzJfdD4obV9jaHVua3Muc2l6ZSgpIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NodW5rcy5iYWNrKCktPm5Vc2VkKTsKLSAgfQotCi0gIGludDMyX3QgY2h1bmtJbmRleCA9IDA7Ci0gIGludDMyX3QgblRvdGFsID0gMDsKLSAgZm9yIChhdXRvJiBjaHVuayA6IG1fY2h1bmtzKSB7Ci0gICAgblRvdGFsICs9IGNodW5rLT5uVXNlZDsKLSAgICBpZiAoblRvdGFsID4gbkluZGV4KQotICAgICAgYnJlYWs7Ci0gICAgY2h1bmtJbmRleCsrOwotICB9Ci0KLSAgaW50MzJfdCBjaGFySW5kZXggPSBtX2NodW5rc1tjaHVua0luZGV4XS0+blVzZWQgLSAoblRvdGFsIC0gbkluZGV4KTsKLSAgcmV0dXJuIHN0ZDo6dHVwbGU8aW50MzJfdCwgaW50MzJfdD4oY2h1bmtJbmRleCwgY2hhckluZGV4KTsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPENGREVfVHh0RWR0QnVmOjpDaHVua0hlYWRlcj4gQ0ZERV9UeHRFZHRCdWY6Ok5ld0NodW5rKCkgewotICBhdXRvIGNodW5rID0gcGRmaXVtOjpNYWtlVW5pcXVlPENodW5rSGVhZGVyPigpOwotICBjaHVuay0+d0NoYXJzLnJlc2V0KEZYX0FsbG9jKEZYX1dDSEFSLCBHZXRDaHVua1NpemUoKSkpOwotICBjaHVuay0+blVzZWQgPSAwOwotICByZXR1cm4gY2h1bms7Ci19Ci0KLUNGREVfVHh0RWR0QnVmOjpDaHVua0hlYWRlcjo6Q2h1bmtIZWFkZXIoKSB7fQotCi1DRkRFX1R4dEVkdEJ1Zjo6Q2h1bmtIZWFkZXI6On5DaHVua0hlYWRlcigpIHt9Ci0KLUNGREVfVHh0RWR0QnVmOjpJdGVyYXRvcjo6SXRlcmF0b3IoQ0ZERV9UeHRFZHRCdWYqIHBCdWYsIEZYX1dDSEFSIHdjQWxpYXMpCi0gICAgOiBtX3BCdWYocEJ1ZiksCi0gICAgICBtX25DdXJDaHVuaygwKSwKLSAgICAgIG1fbkN1ckluZGV4KDApLAotICAgICAgbV9uSW5kZXgoMCksCi0gICAgICBtX0FsaWFzKHdjQWxpYXMpIHsKLSAgQVNTRVJUKG1fcEJ1Zik7Ci19Ci0KLUNGREVfVHh0RWR0QnVmOjpJdGVyYXRvcjo6fkl0ZXJhdG9yKCkge30KLQotYm9vbCBDRkRFX1R4dEVkdEJ1Zjo6SXRlcmF0b3I6Ok5leHQoYm9vbCBiUHJldikgewotICBpZiAoYlByZXYpIHsKLSAgICBpZiAobV9uSW5kZXggPT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIEFTU0VSVChtX25DdXJDaHVuayA8IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9wQnVmLT5tX2NodW5rcykpOwotCi0gICAgQ2h1bmtIZWFkZXIqIGNodW5rID0gbnVsbHB0cjsKLSAgICBpZiAobV9uQ3VySW5kZXggPiAwKSB7Ci0gICAgICBtX25DdXJJbmRleC0tOwotICAgIH0gZWxzZSB7Ci0gICAgICB3aGlsZSAobV9uQ3VyQ2h1bmsgPiAwKSB7Ci0gICAgICAgIC0tbV9uQ3VyQ2h1bms7Ci0gICAgICAgIGNodW5rID0gbV9wQnVmLT5tX2NodW5rc1ttX25DdXJDaHVua10uZ2V0KCk7Ci0gICAgICAgIGlmIChjaHVuay0+blVzZWQgPiAwKSB7Ci0gICAgICAgICAgbV9uQ3VySW5kZXggPSBjaHVuay0+blVzZWQgLSAxOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIEFTU0VSVChtX25DdXJDaHVuayA+PSAwKTsKLSAgICBtX25JbmRleC0tOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIGlmIChtX25JbmRleCA+PSAobV9wQnVmLT5tX25Ub3RhbCAtIDEpKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQVNTRVJUKG1fbkN1ckNodW5rIDwgcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX3BCdWYtPm1fY2h1bmtzKSk7Ci0gICAgaWYgKG1fcEJ1Zi0+bV9jaHVua3NbbV9uQ3VyQ2h1bmtdLT5uVXNlZCAhPSAobV9uQ3VySW5kZXggKyAxKSkgewotICAgICAgbV9uQ3VySW5kZXgrKzsKLSAgICB9IGVsc2UgewotICAgICAgaW50MzJfdCBuRW5kID0gbV9wQnVmLT5tX2NodW5rcy5zaXplKCkgLSAxOwotICAgICAgd2hpbGUgKG1fbkN1ckNodW5rIDwgbkVuZCkgewotICAgICAgICBtX25DdXJDaHVuaysrOwotICAgICAgICBDaHVua0hlYWRlciogY2h1bmtUZW1wID0gbV9wQnVmLT5tX2NodW5rc1ttX25DdXJDaHVua10uZ2V0KCk7Ci0gICAgICAgIGlmIChjaHVua1RlbXAtPm5Vc2VkID4gMCkgewotICAgICAgICAgIG1fbkN1ckluZGV4ID0gMDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBtX25JbmRleCsrOwotICAgIHJldHVybiB0cnVlOwotICB9Ci19Ci0KLXZvaWQgQ0ZERV9UeHRFZHRCdWY6Okl0ZXJhdG9yOjpTZXRBdChpbnQzMl90IG5JbmRleCkgewotICBBU1NFUlQobkluZGV4ID49IDAgJiYgbkluZGV4IDwgbV9wQnVmLT5tX25Ub3RhbCk7Ci0KLSAgc3RkOjp0aWUobV9uQ3VyQ2h1bmssIG1fbkN1ckluZGV4KSA9IG1fcEJ1Zi0+SW5kZXgyQ1AobkluZGV4KTsKLSAgbV9uSW5kZXggPSBuSW5kZXg7Ci19Ci0KLWludDMyX3QgQ0ZERV9UeHRFZHRCdWY6Okl0ZXJhdG9yOjpHZXRBdCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fbkluZGV4OwotfQotCi1GWF9XQ0hBUiBDRkRFX1R4dEVkdEJ1Zjo6SXRlcmF0b3I6OkdldENoYXIoKSB7Ci0gIEFTU0VSVChtX25JbmRleCA+PSAwICYmIG1fbkluZGV4IDwgbV9wQnVmLT5tX25Ub3RhbCk7Ci0gIGlmIChtX0FsaWFzID09IDAgfHwgbV9uSW5kZXggPT0gKG1fcEJ1Zi0+bV9uVG90YWwgLSAxKSkgewotICAgIEZYX1dDSEFSKiBidWYgPSBtX3BCdWYtPm1fY2h1bmtzW21fbkN1ckNodW5rXS0+d0NoYXJzLmdldCgpOwotICAgIHJldHVybiBidWZbbV9uQ3VySW5kZXhdOwotICB9Ci0gIHJldHVybiBtX0FsaWFzOwotfQotCi1ib29sIENGREVfVHh0RWR0QnVmOjpJdGVyYXRvcjo6SXNFT0YoYm9vbCBiVGFpbCkgY29uc3QgewotICByZXR1cm4gYlRhaWwgPyBtX25JbmRleCA9PSAobV9wQnVmLT5HZXRUZXh0TGVuZ3RoKCkgLSAyKSA6IG1fbkluZGV4ID09IDA7Ci19Ci0KLUlGWF9DaGFySXRlciogQ0ZERV9UeHRFZHRCdWY6Okl0ZXJhdG9yOjpDbG9uZSgpIHsKLSAgQ0ZERV9UeHRFZHRCdWY6Okl0ZXJhdG9yKiBwSXRlciA9IG5ldyBDRkRFX1R4dEVkdEJ1Zjo6SXRlcmF0b3IobV9wQnVmKTsKLSAgcEl0ZXItPm1fbkN1ckNodW5rID0gbV9uQ3VyQ2h1bms7Ci0gIHBJdGVyLT5tX25DdXJJbmRleCA9IG1fbkN1ckluZGV4OwotICBwSXRlci0+bV9uSW5kZXggPSBtX25JbmRleDsKLSAgcEl0ZXItPm1fQWxpYXMgPSBtX0FsaWFzOwotICByZXR1cm4gcEl0ZXI7Ci19CmRpZmYgLS1naXQgYS94ZmEvZmRlL2NmZGVfdHh0ZWR0YnVmLmggYi94ZmEvZmRlL2NmZGVfdHh0ZWR0YnVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZWVlNTYuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jZmRlX3R4dGVkdGJ1Zi5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GREVfQ0ZERV9UWFRFRFRCVUZfSF8KLSNkZWZpbmUgWEZBX0ZERV9DRkRFX1RYVEVEVEJVRl9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHR1cGxlPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotI2luY2x1ZGUgInhmYS9mZGUvaWZ4X2NoYXJpdGVyLmgiCi0KLWNsYXNzIElGWF9QYXVzZTsKLQotY2xhc3MgQ0ZERV9UeHRFZHRCdWYgewotIHB1YmxpYzoKLSAgY2xhc3MgSXRlcmF0b3IgOiBwdWJsaWMgSUZYX0NoYXJJdGVyIHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBJdGVyYXRvcihDRkRFX1R4dEVkdEJ1ZiogcEJ1ZiwgRlhfV0NIQVIgd2NBbGlhcyA9IDApOwotICAgIH5JdGVyYXRvcigpIG92ZXJyaWRlOwotCi0gICAgYm9vbCBOZXh0KGJvb2wgYlByZXYgPSBmYWxzZSkgb3ZlcnJpZGU7Ci0gICAgRlhfV0NIQVIgR2V0Q2hhcigpIG92ZXJyaWRlOwotCi0gICAgdm9pZCBTZXRBdChpbnQzMl90IG5JbmRleCkgb3ZlcnJpZGU7Ci0gICAgaW50MzJfdCBHZXRBdCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgYm9vbCBJc0VPRihib29sIGJUYWlsID0gdHJ1ZSkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgSUZYX0NoYXJJdGVyKiBDbG9uZSgpIG92ZXJyaWRlOwotCi0gICBwcml2YXRlOgotICAgIENGREVfVHh0RWR0QnVmKiBtX3BCdWY7Ci0gICAgaW50MzJfdCBtX25DdXJDaHVuazsKLSAgICBpbnQzMl90IG1fbkN1ckluZGV4OwotICAgIGludDMyX3QgbV9uSW5kZXg7Ci0gICAgRlhfV0NIQVIgbV9BbGlhczsKLSAgfTsKLQotICBDRkRFX1R4dEVkdEJ1ZigpOwotICB+Q0ZERV9UeHRFZHRCdWYoKTsKLQotICBpbnQzMl90IEdldENodW5rU2l6ZSgpIGNvbnN0OwotICBpbnQzMl90IEdldFRleHRMZW5ndGgoKSBjb25zdDsKLQotICB2b2lkIFNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7Ci0gIENGWF9XaWRlU3RyaW5nIEdldFRleHQoKSBjb25zdDsKLQotICBGWF9XQ0hBUiBHZXRDaGFyQnlJbmRleChpbnQzMl90IG5JbmRleCkgY29uc3Q7Ci0gIENGWF9XaWRlU3RyaW5nIEdldFJhbmdlKGludDMyX3QgbkJlZ2luLCBpbnQzMl90IG5Db3VudCkgY29uc3Q7Ci0KLSAgdm9pZCBJbnNlcnQoaW50MzJfdCBuUG9zLCBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LCBpbnQzMl90IG5MZW5ndGgpOwotICB2b2lkIERlbGV0ZShpbnQzMl90IG5JbmRleCwgaW50MzJfdCBuTGVuZ3RoKTsKLSAgdm9pZCBDbGVhcihib29sIGJSZWxlYXNlKTsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBJdGVyYXRvcjsKLSAgZnJpZW5kIGNsYXNzIENGREVfVHh0RWR0QnVmVGVzdDsKLQotICBjbGFzcyBDaHVua0hlYWRlciB7Ci0gICBwdWJsaWM6Ci0gICAgQ2h1bmtIZWFkZXIoKTsKLSAgICB+Q2h1bmtIZWFkZXIoKTsKLQotICAgIGludDMyX3QgblVzZWQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPEZYX1dDSEFSLCBGeEZyZWVEZWxldGVyPiB3Q2hhcnM7Ci0gIH07Ci0KLSAgdm9pZCBTZXRDaHVua1NpemVGb3JUZXN0aW5nKHNpemVfdCBzaXplKTsKLSAgc3RkOjp0dXBsZTxpbnQzMl90LCBpbnQzMl90PiBJbmRleDJDUChpbnQzMl90IG5JbmRleCkgY29uc3Q7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDaHVua0hlYWRlcj4gTmV3Q2h1bmsoKTsKLQotICBzaXplX3QgbV9jaHVua1NpemU7Ci0gIGludDMyX3QgbV9uVG90YWw7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDaHVua0hlYWRlcj4+IG1fY2h1bmtzOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRkRFX0NGREVfVFhURURUQlVGX0hfCmRpZmYgLS1naXQgYS94ZmEvZmRlL2NmZGVfdHh0ZWR0YnVmX3VuaXR0ZXN0LmNwcCBiL3hmYS9mZGUvY2ZkZV90eHRlZHRidWZfdW5pdHRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzU2NDA5Li4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY2ZkZV90eHRlZHRidWZfdW5pdHRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgInhmYS9mZGUvY2ZkZV90eHRlZHRidWYuaCIKLQotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgInRlc3RpbmcvdGVzdF9zdXBwb3J0LmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotCi1jbGFzcyBDRkRFX1R4dEVkdEJ1ZlRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgewotICAgIGJ1Zl8gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZERV9UeHRFZHRCdWY+KCk7Ci0gICAgYnVmXy0+U2V0Q2h1bmtTaXplRm9yVGVzdGluZyg1KTsKLSAgfQotICBzaXplX3QgQ2h1bmtDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGJ1Zl8tPm1fY2h1bmtzLnNpemUoKTsgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRkRFX1R4dEVkdEJ1Zj4gYnVmXzsKLX07Ci0KLVRFU1RfRihDRkRFX1R4dEVkdEJ1ZlRlc3QsIFNldFRleHRMZXNzVGhlbkNodW5rU2l6ZSkgewotICBidWZfLT5TZXRUZXh0KEwiSGkiKTsKLSAgRVhQRUNUX0VRKDFVTCwgQ2h1bmtDb3VudCgpKTsKLSAgRVhQRUNUX0VRKDIsIGJ1Zl8tPkdldFRleHRMZW5ndGgoKSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgcmVzID0gYnVmXy0+R2V0VGV4dCgpOwotICBFWFBFQ1RfRVEoMiwgcmVzLkdldExlbmd0aCgpKTsKLSAgRVhQRUNUX0VRKEwiSGkiLCByZXMpOwotfQotCi1URVNUX0YoQ0ZERV9UeHRFZHRCdWZUZXN0LCBJbnNlcnRBcHBlbmRDaHVuaykgewotICBidWZfLT5TZXRUZXh0KEwiSGkiKTsKLQotICBDRlhfV2lkZVN0cmluZyBlbmQgPSBMIiBXb3JsZCI7Ci0gIGJ1Zl8tPkluc2VydCgyLCBlbmQuY19zdHIoKSwgZW5kLkdldExlbmd0aCgpKTsKLSAgRVhQRUNUX0VRKDNVTCwgQ2h1bmtDb3VudCgpKTsKLSAgRVhQRUNUX0VRKDgsIGJ1Zl8tPkdldFRleHRMZW5ndGgoKSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgcmVzID0gYnVmXy0+R2V0VGV4dCgpOwotICBFWFBFQ1RfRVEoOCwgcmVzLkdldExlbmd0aCgpKTsKLSAgRVhQRUNUX0VRKEwiSGkgV29ybGQiLCByZXMpOwotfQotCi1URVNUX0YoQ0ZERV9UeHRFZHRCdWZUZXN0LCBJbnNlcnRQcmVwZW5kQ2h1bmspIHsKLSAgYnVmXy0+U2V0VGV4dChMIkhpIik7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgZW5kID0gTCJXb3JsZCAiOwotICBidWZfLT5JbnNlcnQoMCwgZW5kLmNfc3RyKCksIGVuZC5HZXRMZW5ndGgoKSk7Ci0gIEVYUEVDVF9FUSgzVUwsIENodW5rQ291bnQoKSk7Ci0gIEVYUEVDVF9FUSg4LCBidWZfLT5HZXRUZXh0TGVuZ3RoKCkpOwotCi0gIENGWF9XaWRlU3RyaW5nIHJlcyA9IGJ1Zl8tPkdldFRleHQoKTsKLSAgRVhQRUNUX0VRKEwiV29ybGQgSGkiLCByZXMpOwotICBFWFBFQ1RfRVEoOCwgcmVzLkdldExlbmd0aCgpKTsKLX0KLQotVEVTVF9GKENGREVfVHh0RWR0QnVmVGVzdCwgSW5zZXJ0QmV0d2VlbkNodW5rcykgewotICBidWZfLT5TZXRUZXh0KEwiSGVsbG8gV29ybGQiKTsKLSAgRVhQRUNUX0VRKDNVTCwgQ2h1bmtDb3VudCgpKTsKLQotICBDRlhfV2lkZVN0cmluZyBpbnN0ID0gTCJ0aGVyZSAiOwotICBidWZfLT5JbnNlcnQoNiwgaW5zdC5jX3N0cigpLCBpbnN0LkdldExlbmd0aCgpKTsKLSAgRVhQRUNUX0VRKDVVTCwgQ2h1bmtDb3VudCgpKTsKLSAgRVhQRUNUX0VRKDE3LCBidWZfLT5HZXRUZXh0TGVuZ3RoKCkpOwotCi0gIENGWF9XaWRlU3RyaW5nIHJlcyA9IGJ1Zl8tPkdldFRleHQoKTsKLSAgRVhQRUNUX0VRKEwiSGVsbG8gdGhlcmUgV29ybGQiLCByZXMpOwotICBFWFBFQ1RfRVEoMTcsIHJlcy5HZXRMZW5ndGgoKSk7Ci19Ci0KLVRFU1RfRihDRkRFX1R4dEVkdEJ1ZlRlc3QsIFNldFRleHQpIHsKLSAgYnVmXy0+U2V0VGV4dChMIkhlbGxvIFdvcmxkIik7Ci0gIEVYUEVDVF9FUSgxMSwgYnVmXy0+R2V0VGV4dExlbmd0aCgpKTsKLQotICBidWZfLT5TZXRUZXh0KEwiSGkiKTsKLSAgLy8gRG9uJ3QgcmVtb3ZlIGNodW5rcyBvbiBzZXR0aW5nIHNob3J0ZXIgdGV4dC4KLSAgRVhQRUNUX0VRKDNVTCwgQ2h1bmtDb3VudCgpKTsKLSAgRVhQRUNUX0VRKDIsIGJ1Zl8tPkdldFRleHRMZW5ndGgoKSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgcmVzID0gYnVmXy0+R2V0VGV4dCgpOwotICBFWFBFQ1RfRVEoTCJIaSIsIHJlcyk7Ci0gIEVYUEVDVF9FUSgyLCByZXMuR2V0TGVuZ3RoKCkpOwotfQotCi1URVNUX0YoQ0ZERV9UeHRFZHRCdWZUZXN0LCBEZWxldGVNaWRkbGVUZXh0KSB7Ci0gIGJ1Zl8tPlNldFRleHQoTCJIZWxsbyB0aGVyZSBXb3JsZCIpOwotICBidWZfLT5EZWxldGUoNiwgNik7Ci0gIEVYUEVDVF9FUSg0VUwsIENodW5rQ291bnQoKSk7Ci0gIEVYUEVDVF9FUSgxMSwgYnVmXy0+R2V0VGV4dExlbmd0aCgpKTsKLQotICBDRlhfV2lkZVN0cmluZyByZXMgPSBidWZfLT5HZXRUZXh0KCk7Ci0gIEVYUEVDVF9FUShMIkhlbGxvIFdvcmxkIiwgcmVzKTsKLSAgRVhQRUNUX0VRKDExLCByZXMuR2V0TGVuZ3RoKCkpOwotfQotCi1URVNUX0YoQ0ZERV9UeHRFZHRCdWZUZXN0LCBEZWxldGVFbmRUZXh0KSB7Ci0gIGJ1Zl8tPlNldFRleHQoTCJIZWxsbyBXb3JsZCIpOwotICBidWZfLT5EZWxldGUoNSwgNik7Ci0gIEVYUEVDVF9FUSgxVUwsIENodW5rQ291bnQoKSk7Ci0gIEVYUEVDVF9FUSg1LCBidWZfLT5HZXRUZXh0TGVuZ3RoKCkpOwotCi0gIENGWF9XaWRlU3RyaW5nIHJlcyA9IGJ1Zl8tPkdldFRleHQoKTsKLSAgRVhQRUNUX0VRKEwiSGVsbG8iLCByZXMpOwotICBFWFBFQ1RfRVEoNSwgcmVzLkdldExlbmd0aCgpKTsKLX0KLQotVEVTVF9GKENGREVfVHh0RWR0QnVmVGVzdCwgRGVsZXRlU3RhcnRUZXh0KSB7Ci0gIGJ1Zl8tPlNldFRleHQoTCJIZWxsbyBXb3JsZCIpOwotICBidWZfLT5EZWxldGUoMCwgNik7Ci0gIEVYUEVDVF9FUSgyVUwsIENodW5rQ291bnQoKSk7Ci0gIEVYUEVDVF9FUSg1LCBidWZfLT5HZXRUZXh0TGVuZ3RoKCkpOwotCi0gIENGWF9XaWRlU3RyaW5nIHJlcyA9IGJ1Zl8tPkdldFRleHQoKTsKLSAgRVhQRUNUX0VRKEwiV29ybGQiLCByZXMpOwotICBFWFBFQ1RfRVEoNSwgcmVzLkdldExlbmd0aCgpKTsKLX0KLQotVEVTVF9GKENGREVfVHh0RWR0QnVmVGVzdCwgRGVsZXRlQWxsVGV4dCkgewotICBidWZfLT5TZXRUZXh0KEwiSGVsbG8gV29ybGQiKTsKLSAgYnVmXy0+RGVsZXRlKDAsIDExKTsKLSAgRVhQRUNUX0VRKDBVTCwgQ2h1bmtDb3VudCgpKTsKLSAgRVhQRUNUX0VRKDAsIGJ1Zl8tPkdldFRleHRMZW5ndGgoKSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgcmVzID0gYnVmXy0+R2V0VGV4dCgpOwotICBFWFBFQ1RfRVEoTCIiLCByZXMpOwotICBFWFBFQ1RfRVEoMCwgcmVzLkdldExlbmd0aCgpKTsKLX0KLQotVEVTVF9GKENGREVfVHh0RWR0QnVmVGVzdCwgQ2xlYXJXaXRoUmVsZWFzZSkgewotICBidWZfLT5TZXRUZXh0KEwiSGVsbG8gV29ybGQiKTsKLSAgYnVmXy0+Q2xlYXIodHJ1ZSk7Ci0gIEVYUEVDVF9FUSgwVUwsIENodW5rQ291bnQoKSk7Ci0gIEVYUEVDVF9FUSgwLCBidWZfLT5HZXRUZXh0TGVuZ3RoKCkpOwotCi0gIENGWF9XaWRlU3RyaW5nIHJlcyA9IGJ1Zl8tPkdldFRleHQoKTsKLSAgRVhQRUNUX0VRKEwiIiwgcmVzKTsKLSAgRVhQRUNUX0VRKDAsIHJlcy5HZXRMZW5ndGgoKSk7Ci19Ci0KLVRFU1RfRihDRkRFX1R4dEVkdEJ1ZlRlc3QsIENsZWFyV2l0aG91dFJlbGVhc2UpIHsKLSAgYnVmXy0+U2V0VGV4dChMIkhlbGxvIFdvcmxkIik7Ci0gIGJ1Zl8tPkNsZWFyKGZhbHNlKTsKLSAgRVhQRUNUX0VRKDNVTCwgQ2h1bmtDb3VudCgpKTsKLSAgRVhQRUNUX0VRKDAsIGJ1Zl8tPkdldFRleHRMZW5ndGgoKSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgcmVzID0gYnVmXy0+R2V0VGV4dCgpOwotICBFWFBFQ1RfRVEoTCIiLCByZXMpOwotICBFWFBFQ1RfRVEoMCwgcmVzLkdldExlbmd0aCgpKTsKLX0KLQotVEVTVF9GKENGREVfVHh0RWR0QnVmVGVzdCwgR2V0Q2hhckJ5SW5kZXgpIHsKLSAgYnVmXy0+U2V0VGV4dChMIkhlbGxvIHdvcmxkIik7Ci0gIEVYUEVDVF9FUShMImUiLCBDRlhfV2lkZVN0cmluZyhidWZfLT5HZXRDaGFyQnlJbmRleCgxKSkpOwotICBFWFBFQ1RfRVEoTCJvIiwgQ0ZYX1dpZGVTdHJpbmcoYnVmXy0+R2V0Q2hhckJ5SW5kZXgoNykpKTsKLX0KLQotVEVTVF9GKENGREVfVHh0RWR0QnVmVGVzdCwgR2V0UmFuZ2UpIHsKLSAgYnVmXy0+U2V0VGV4dChMIkhlbGxvIFdvcmxkIik7Ci0gIEVYUEVDVF9FUShMIiIsIGJ1Zl8tPkdldFJhbmdlKDEsIDApKTsKLSAgRVhQRUNUX0VRKEwiZWxsbyIsIGJ1Zl8tPkdldFJhbmdlKDEsIDQpKTsKLSAgRVhQRUNUX0VRKEwibG8gV28iLCBidWZfLT5HZXRSYW5nZSgzLCA1KSk7Ci19Ci0KLSNpZm5kZWYgTkRFQlVHCi11c2luZyBDRkRFX1R4dEVkdEJ1ZlRlc3REZWF0aFRlc3QgPSBDRkRFX1R4dEVkdEJ1ZlRlc3Q7Ci0KLVRFU1RfRihDRkRFX1R4dEVkdEJ1ZlRlc3REZWF0aFRlc3QsIEluc2VydEJhZEluZGV4ZXMpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgaW5zdCA9IEwidGhlcmUgIjsKLQotICBidWZfLT5TZXRUZXh0KEwiSGkiKTsKLSAgRVhQRUNUX0RFQVRIKGJ1Zl8tPkluc2VydCgtNCwgaW5zdC5jX3N0cigpLCBpbnN0LkdldExlbmd0aCgpKSwgIkFzc2VydGlvbiIpOwotICBFWFBFQ1RfREVBVEgoYnVmXy0+SW5zZXJ0KDk5OTksIGluc3QuY19zdHIoKSwgaW5zdC5HZXRMZW5ndGgoKSksICJBc3NlcnRpb24iKTsKLSAgRVhQRUNUX0RFQVRIKGJ1Zl8tPkluc2VydCgxLCBpbnN0LmNfc3RyKCksIC02KSwgIkFzc2VydGlvbiIpOwotfQotCi1URVNUX0YoQ0ZERV9UeHRFZHRCdWZUZXN0RGVhdGhUZXN0LCBEZWxldGVXaXRoQmFkSWR4KSB7Ci0gIGJ1Zl8tPlNldFRleHQoTCJIaSIpOwotICBFWFBFQ1RfREVBVEgoYnVmXy0+RGVsZXRlKC0xMCwgNCksICJBc3NlcnRpb24iKTsKLSAgRVhQRUNUX0RFQVRIKGJ1Zl8tPkRlbGV0ZSgxLCAtNSksICJBc3NlcnRpb24iKTsKLSAgRVhQRUNUX0RFQVRIKGJ1Zl8tPkRlbGV0ZSg1LCAxKSwgIkFzc2VydGlvbiIpOwotICBFWFBFQ1RfREVBVEgoYnVmXy0+RGVsZXRlKDAsIDEwMDAwKSwgIkFzc2VydGlvbiIpOwotfQotCi1URVNUX0YoQ0ZERV9UeHRFZHRCdWZUZXN0RGVhdGhUZXN0LCBHZXRDaGFyQnlJbmRleCkgewotICBidWZfLT5TZXRUZXh0KEwiSGkiKTsKLSAgRVhQRUNUX0RFQVRIKGJ1Zl8tPkdldENoYXJCeUluZGV4KC0xKSwgIkFzc2VydGlvbiIpOwotICBFWFBFQ1RfREVBVEgoYnVmXy0+R2V0Q2hhckJ5SW5kZXgoMTAwKSwgIkFzc2VydGlvbiIpOwotfQotCi1URVNUX0YoQ0ZERV9UeHRFZHRCdWZUZXN0RGVhdGhUZXN0LCBHZXRSYW5nZSkgewotICBidWZfLT5TZXRUZXh0KEwiSGkiKTsKLSAgRVhQRUNUX0RFQVRIKGJ1Zl8tPkdldFJhbmdlKDEsIC0xKSwgIkFzc2VydGlvbiIpOwotICBFWFBFQ1RfREVBVEgoYnVmXy0+R2V0UmFuZ2UoLTEsIDEpLCAiQXNzZXJ0aW9uIik7Ci0gIEVYUEVDVF9ERUFUSChidWZfLT5HZXRSYW5nZSgxMCwgMSksICJBc3NlcnRpb24iKTsKLSAgRVhQRUNUX0RFQVRIKGJ1Zl8tPkdldFJhbmdlKDEsIDEwMCksICJBc3NlcnRpb24iKTsKLX0KLQotI2VuZGlmICAvLyBOREVCVUcKZGlmZiAtLWdpdCBhL3hmYS9mZGUvY2ZkZV90eHRlZHRkb3JlY29yZF9kZWxldGVyYW5nZS5jcHAgYi94ZmEvZmRlL2NmZGVfdHh0ZWR0ZG9yZWNvcmRfZGVsZXRlcmFuZ2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjYzODdlLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY2ZkZV90eHRlZHRkb3JlY29yZF9kZWxldGVyYW5nZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZmRlL2NmZGVfdHh0ZWR0ZG9yZWNvcmRfZGVsZXRlcmFuZ2UuaCIKLQotI2luY2x1ZGUgInhmYS9mZGUvY2ZkZV90eHRlZHRlbmdpbmUuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfZWRpdC5oIgotCi1DRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlOjpDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlKAotICAgIENGREVfVHh0RWR0RW5naW5lKiBwRW5naW5lLAotICAgIGludDMyX3QgbkluZGV4LAotICAgIGludDMyX3QgbkNhcmV0LAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JhbmdlLAotICAgIGJvb2wgYlNlbCkKLSAgICA6IG1fcEVuZ2luZShwRW5naW5lKSwKLSAgICAgIG1fYlNlbChiU2VsKSwKLSAgICAgIG1fbkluZGV4KG5JbmRleCksCi0gICAgICBtX25DYXJldChuQ2FyZXQpLAotICAgICAgbV93c1JhbmdlKHdzUmFuZ2UpIHsKLSAgQVNTRVJUKHBFbmdpbmUpOwotfQotCi1DRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlOjp+Q0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZSgpIHt9Ci0KLWJvb2wgQ0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZTo6VW5kbygpIGNvbnN0IHsKLSAgaWYgKG1fcEVuZ2luZS0+SXNTZWxlY3QoKSkKLSAgICBtX3BFbmdpbmUtPkNsZWFyU2VsZWN0aW9uKCk7Ci0KLSAgbV9wRW5naW5lLT5Jbm5lcl9JbnNlcnQobV9uSW5kZXgsIG1fd3NSYW5nZS5jX3N0cigpLCBtX3dzUmFuZ2UuR2V0TGVuZ3RoKCkpOwotICBpZiAobV9iU2VsKQotICAgIG1fcEVuZ2luZS0+QWRkU2VsUmFuZ2UobV9uSW5kZXgsIG1fd3NSYW5nZS5HZXRMZW5ndGgoKSk7Ci0KLSAgRkRFX1RYVEVEVFBBUkFNUyYgUGFyYW0gPSBtX3BFbmdpbmUtPm1fUGFyYW07Ci0gIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvLm5DaGFuZ2VUeXBlID0gRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfSW5zZXJ0OwotICBtX3BFbmdpbmUtPm1fQ2hhbmdlSW5mby53c0RlbGV0ZSA9IG1fd3NSYW5nZTsKLSAgUGFyYW0ucEV2ZW50U2luay0+T25UZXh0Q2hhbmdlZChtX3BFbmdpbmUtPm1fQ2hhbmdlSW5mbyk7Ci0gIG1fcEVuZ2luZS0+U2V0Q2FyZXRQb3MobV9uQ2FyZXQsIHRydWUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlOjpSZWRvKCkgY29uc3QgewotICBtX3BFbmdpbmUtPklubmVyX0RlbGV0ZVJhbmdlKG1fbkluZGV4LCBtX3dzUmFuZ2UuR2V0TGVuZ3RoKCkpOwotICBpZiAobV9iU2VsKQotICAgIG1fcEVuZ2luZS0+UmVtb3ZlU2VsUmFuZ2UobV9uSW5kZXgsIG1fd3NSYW5nZS5HZXRMZW5ndGgoKSk7Ci0KLSAgRkRFX1RYVEVEVFBBUkFNUyYgUGFyYW0gPSBtX3BFbmdpbmUtPm1fUGFyYW07Ci0gIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvLm5DaGFuZ2VUeXBlID0gRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfSW5zZXJ0OwotICBtX3BFbmdpbmUtPm1fQ2hhbmdlSW5mby53c0RlbGV0ZSA9IG1fd3NSYW5nZTsKLSAgUGFyYW0ucEV2ZW50U2luay0+T25UZXh0Q2hhbmdlZChtX3BFbmdpbmUtPm1fQ2hhbmdlSW5mbyk7Ci0gIG1fcEVuZ2luZS0+U2V0Q2FyZXRQb3MobV9uSW5kZXgsIHRydWUpOwotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9mZGUvY2ZkZV90eHRlZHRkb3JlY29yZF9kZWxldGVyYW5nZS5oIGIveGZhL2ZkZS9jZmRlX3R4dGVkdGRvcmVjb3JkX2RlbGV0ZXJhbmdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZDc5NTUuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jZmRlX3R4dGVkdGRvcmVjb3JkX2RlbGV0ZXJhbmdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZERV9DRkRFX1RYVEVEVERPUkVDT1JEX0RFTEVURVJBTkdFX0hfCi0jZGVmaW5lIFhGQV9GREVfQ0ZERV9UWFRFRFRET1JFQ09SRF9ERUxFVEVSQU5HRV9IXwotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotI2luY2x1ZGUgInhmYS9mZGUvaWZkZV90eHRlZHRkb3JlY29yZC5oIgotCi1jbGFzcyBDRkRFX1R4dEVkdEVuZ2luZTsKLQotY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZSA6IHB1YmxpYyBJRkRFX1R4dEVkdERvUmVjb3JkIHsKLSBwdWJsaWM6Ci0gIENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2UoQ0ZERV9UeHRFZHRFbmdpbmUqIHBFbmdpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2FyZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2VsID0gZmFsc2UpOwotICB+Q0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZSgpIG92ZXJyaWRlOwotCi0gIGJvb2wgVW5kbygpIGNvbnN0IG92ZXJyaWRlOwotICBib29sIFJlZG8oKSBjb25zdCBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIENGREVfVHh0RWR0RW5naW5lKiBtX3BFbmdpbmU7Ci0gIGJvb2wgbV9iU2VsOwotICBpbnQzMl90IG1fbkluZGV4OwotICBpbnQzMl90IG1fbkNhcmV0OwotICBDRlhfV2lkZVN0cmluZyBtX3dzUmFuZ2U7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GREVfQ0ZERV9UWFRFRFRET1JFQ09SRF9ERUxFVEVSQU5HRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9jZmRlX3R4dGVkdGRvcmVjb3JkX2luc2VydC5jcHAgYi94ZmEvZmRlL2NmZGVfdHh0ZWR0ZG9yZWNvcmRfaW5zZXJ0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwYjE1ZC4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL2NmZGVfdHh0ZWR0ZG9yZWNvcmRfaW5zZXJ0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9mZGUvY2ZkZV90eHRlZHRkb3JlY29yZF9pbnNlcnQuaCIKLQotI2luY2x1ZGUgInhmYS9mZGUvY2ZkZV90eHRlZHRlbmdpbmUuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfZWRpdC5oIgotCi1DRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydDo6Q0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQoCi0gICAgQ0ZERV9UeHRFZHRFbmdpbmUqIHBFbmdpbmUsCi0gICAgaW50MzJfdCBuQ2FyZXQsCi0gICAgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwKLSAgICBpbnQzMl90IG5MZW5ndGgpCi0gICAgOiBtX3BFbmdpbmUocEVuZ2luZSksIG1fbkNhcmV0KG5DYXJldCkgewotICBBU1NFUlQocEVuZ2luZSk7Ci0gIEZYX1dDSEFSKiBscEJ1ZmZlciA9IG1fd3NJbnNlcnQuR2V0QnVmZmVyKG5MZW5ndGgpOwotICBGWFNZU19tZW1jcHkobHBCdWZmZXIsIGxwVGV4dCwgbkxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOwotICBtX3dzSW5zZXJ0LlJlbGVhc2VCdWZmZXIoKTsKLX0KLQotQ0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQ6On5DRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydCgpIHt9Ci0KLWJvb2wgQ0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQ6OlVuZG8oKSBjb25zdCB7Ci0gIGlmIChtX3BFbmdpbmUtPklzU2VsZWN0KCkpCi0gICAgbV9wRW5naW5lLT5DbGVhclNlbGVjdGlvbigpOwotCi0gIG1fcEVuZ2luZS0+SW5uZXJfRGVsZXRlUmFuZ2UobV9uQ2FyZXQsIG1fd3NJbnNlcnQuR2V0TGVuZ3RoKCkpOwotICBGREVfVFhURURUUEFSQU1TJiBQYXJhbSA9IG1fcEVuZ2luZS0+bV9QYXJhbTsKLSAgbV9wRW5naW5lLT5tX0NoYW5nZUluZm8ubkNoYW5nZVR5cGUgPSBGREVfVFhURURUX1RFWFRDSEFOR0VfVFlQRV9EZWxldGU7Ci0gIG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvLndzRGVsZXRlID0gbV93c0luc2VydDsKLSAgUGFyYW0ucEV2ZW50U2luay0+T25UZXh0Q2hhbmdlZChtX3BFbmdpbmUtPm1fQ2hhbmdlSW5mbyk7Ci0gIG1fcEVuZ2luZS0+U2V0Q2FyZXRQb3MobV9uQ2FyZXQsIHRydWUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydDo6UmVkbygpIGNvbnN0IHsKLSAgbV9wRW5naW5lLT5Jbm5lcl9JbnNlcnQobV9uQ2FyZXQsIG1fd3NJbnNlcnQuY19zdHIoKSwgbV93c0luc2VydC5HZXRMZW5ndGgoKSk7Ci0gIEZERV9UWFRFRFRQQVJBTVMmIFBhcmFtID0gbV9wRW5naW5lLT5tX1BhcmFtOwotICBtX3BFbmdpbmUtPm1fQ2hhbmdlSW5mby5uQ2hhbmdlVHlwZSA9IEZERV9UWFRFRFRfVEVYVENIQU5HRV9UWVBFX0luc2VydDsKLSAgbV9wRW5naW5lLT5tX0NoYW5nZUluZm8ud3NEZWxldGUgPSBtX3dzSW5zZXJ0OwotICBQYXJhbS5wRXZlbnRTaW5rLT5PblRleHRDaGFuZ2VkKG1fcEVuZ2luZS0+bV9DaGFuZ2VJbmZvKTsKLSAgbV9wRW5naW5lLT5TZXRDYXJldFBvcyhtX25DYXJldCwgZmFsc2UpOwotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9mZGUvY2ZkZV90eHRlZHRkb3JlY29yZF9pbnNlcnQuaCBiL3hmYS9mZGUvY2ZkZV90eHRlZHRkb3JlY29yZF9pbnNlcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgwNDUzZS4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL2NmZGVfdHh0ZWR0ZG9yZWNvcmRfaW5zZXJ0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZERV9DRkRFX1RYVEVEVERPUkVDT1JEX0lOU0VSVF9IXwotI2RlZmluZSBYRkFfRkRFX0NGREVfVFhURURURE9SRUNPUkRfSU5TRVJUX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9pZmRlX3R4dGVkdGRvcmVjb3JkLmgiCi0KLWNsYXNzIENGREVfVHh0RWR0RW5naW5lOwotCi1jbGFzcyBDRkRFX1R4dEVkdERvUmVjb3JkX0luc2VydCA6IHB1YmxpYyBJRkRFX1R4dEVkdERvUmVjb3JkIHsKLSBwdWJsaWM6Ci0gIENGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0KENGREVfVHh0RWR0RW5naW5lKiBwRW5naW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5DYXJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoKTsKLSAgfkNGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0KCkgb3ZlcnJpZGU7Ci0KLSAgYm9vbCBVbmRvKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGJvb2wgUmVkbygpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgQ0ZERV9UeHRFZHRFbmdpbmUqIG1fcEVuZ2luZTsKLSAgaW50MzJfdCBtX25DYXJldDsKLSAgQ0ZYX1dpZGVTdHJpbmcgbV93c0luc2VydDsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZERV9DRkRFX1RYVEVEVERPUkVDT1JEX0lOU0VSVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9jZmRlX3R4dGVkdGVuZ2luZS5jcHAgYi94ZmEvZmRlL2NmZGVfdHh0ZWR0ZW5naW5lLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYxZjZhYi4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL2NmZGVfdHh0ZWR0ZW5naW5lLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0ODAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZkZS9jZmRlX3R4dGVkdGVuZ2luZS5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotI2luY2x1ZGUgInhmYS9mZGUvY2ZkZV90eHRlZHRidWYuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2NmZGVfdHh0ZWR0ZG9yZWNvcmRfZGVsZXRlcmFuZ2UuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2NmZGVfdHh0ZWR0ZG9yZWNvcmRfaW5zZXJ0LmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jZmRlX3R4dGVkdHBhZ2UuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2NmZGVfdHh0ZWR0cGFyYWcuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2lmeF9jaGFyaXRlci5oIgotI2luY2x1ZGUgInhmYS9mZGUvdHRvL2ZkZV90ZXh0b3V0LmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvbGF5b3V0L2ZnYXNfdGV4dGJyZWFrLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX2VkaXQuaCIKLQotbmFtZXNwYWNlIHsKLQotY29uc3QgdWludDMyX3Qga1BhZ2VXaWR0aE1heCA9IDB4ZmZmZjsKLWNvbnN0IHVpbnQzMl90IGtVbmljb2RlUGFyYWdyYXBoU2VwYXJhdG9yID0gMHgyMDI5OwotCi19ICAvLyBuYW1lc3BhY2UKLQotRkRFX1RYVEVEVFBBUkFNUzo6RkRFX1RYVEVEVFBBUkFNUygpCi0gICAgOiBmUGxhdGVXaWR0aCgwKSwKLSAgICAgIGZQbGF0ZUhlaWdodCgwKSwKLSAgICAgIG5MaW5lQ291bnQoMCksCi0gICAgICBkd0xheW91dFN0eWxlcygwKSwKLSAgICAgIGR3QWxpZ25tZW50KDApLAotICAgICAgZHdNb2RlKDApLAotICAgICAgZkZvbnRTaXplKDEwLjBmKSwKLSAgICAgIGR3Rm9udENvbG9yKDB4ZmYwMDAwMDApLAotICAgICAgZkxpbmVTcGFjZSgxMC4wZiksCi0gICAgICBmVGFiV2lkdGgoMzYpLAotICAgICAgYlRhYkVxdWlkaXN0YW50KGZhbHNlKSwKLSAgICAgIHdEZWZDaGFyKDB4RkVGRiksCi0gICAgICB3TGluZUJyZWFrQ2hhcignXG4nKSwKLSAgICAgIG5DaGFyUm90YXRpb24oMCksCi0gICAgICBuTGluZUVuZCgwKSwKLSAgICAgIG5Ib3J6U2NhbGUoMTAwKSwKLSAgICAgIGZDaGFyU3BhY2UoMCksCi0gICAgICBwRXZlbnRTaW5rKG51bGxwdHIpIHt9Ci0KLUZERV9UWFRFRFRQQVJBTVM6On5GREVfVFhURURUUEFSQU1TKCkge30KLQotRkRFX1RYVEVEVF9URVhUQ0hBTkdFX0lORk86OkZERV9UWFRFRFRfVEVYVENIQU5HRV9JTkZPKCkge30KLQotRkRFX1RYVEVEVF9URVhUQ0hBTkdFX0lORk86On5GREVfVFhURURUX1RFWFRDSEFOR0VfSU5GTygpIHt9Ci0KLUNGREVfVHh0RWR0RW5naW5lOjpDRkRFX1R4dEVkdEVuZ2luZSgpCi0gICAgOiBtX3BUeHRCdWYobmV3IENGREVfVHh0RWR0QnVmKCkpLAotICAgICAgbV9uUGFnZUxpbmVDb3VudCgyMCksCi0gICAgICBtX25MaW5lQ291bnQoMCksCi0gICAgICBtX25BbmNob3JQb3MoLTEpLAotICAgICAgbV9uTGF5b3V0UG9zKDApLAotICAgICAgbV9mQ2FyZXRQb3NSZXNlcnZlKDAuMCksCi0gICAgICBtX25DYXJldCgwKSwKLSAgICAgIG1fYkJlZm9yZSh0cnVlKSwKLSAgICAgIG1fbkNhcmV0UGFnZSgwKSwKLSAgICAgIG1fZHdGaW5kRmxhZ3MoMCksCi0gICAgICBtX2JMb2NrKGZhbHNlKSwKLSAgICAgIG1fbkxpbWl0KDApLAotICAgICAgbV93Y0FsaWFzQ2hhcihMJyonKSwKLSAgICAgIG1fbkZpcnN0TGluZUVuZChGREVfVFhURURJVF9MSU5FRU5EX0F1dG8pLAotICAgICAgbV9iQXV0b0xpbmVFbmQodHJ1ZSksCi0gICAgICBtX3dMaW5lRW5kKGtVbmljb2RlUGFyYWdyYXBoU2VwYXJhdG9yKSB7Ci0gIG1fYkF1dG9MaW5lRW5kID0gKG1fUGFyYW0ubkxpbmVFbmQgPT0gRkRFX1RYVEVESVRfTElORUVORF9BdXRvKTsKLX0KLQotQ0ZERV9UeHRFZHRFbmdpbmU6On5DRkRFX1R4dEVkdEVuZ2luZSgpIHsKLSAgUmVtb3ZlQWxsUGFyYWdzKCk7Ci0gIFJlbW92ZUFsbFBhZ2VzKCk7Ci0gIG1fUGFyYW0ucEV2ZW50U2luayA9IG51bGxwdHI7Ci0gIENsZWFyU2VsZWN0aW9uKCk7Ci19Ci0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlNldEVkaXRQYXJhbXMoY29uc3QgRkRFX1RYVEVEVFBBUkFNUyYgcGFyYW1zKSB7Ci0gIGlmICghbV9wVGV4dEJyZWFrKQotICAgIG1fcFRleHRCcmVhayA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfVHh0QnJlYWs+KEZYX1RYVEJSRUFLUE9MSUNZX05vbmUpOwotCi0gIG1fUGFyYW0gPSBwYXJhbXM7Ci0gIG1fd0xpbmVFbmQgPSBwYXJhbXMud0xpbmVCcmVha0NoYXI7Ci0gIG1fYkF1dG9MaW5lRW5kID0gKG1fUGFyYW0ubkxpbmVFbmQgPT0gRkRFX1RYVEVESVRfTElORUVORF9BdXRvKTsKLSAgVXBkYXRlVHh0QnJlYWsoKTsKLX0KLQotRkRFX1RYVEVEVFBBUkFNUyogQ0ZERV9UeHRFZHRFbmdpbmU6OkdldEVkaXRQYXJhbXMoKSB7Ci0gIHJldHVybiAmbV9QYXJhbTsKLX0KLQotaW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6Q291bnRQYWdlcygpIGNvbnN0IHsKLSAgaWYgKG1fbkxpbmVDb3VudCA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuICgobV9uTGluZUNvdW50IC0gMSkgLyBtX25QYWdlTGluZUNvdW50KSArIDE7Ci19Ci0KLUlGREVfVHh0RWR0UGFnZSogQ0ZERV9UeHRFZHRFbmdpbmU6OkdldFBhZ2UoaW50MzJfdCBuSW5kZXgpIHsKLSAgaWYgKG1fUGFnZVB0ckFycmF5LkdldFNpemUoKSA8PSBuSW5kZXgpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICByZXR1cm4gbV9QYWdlUHRyQXJyYXlbbkluZGV4XTsKLX0KLQotdm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6U2V0VGV4dEJ5U3RyZWFtKAotICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiYgcFN0cmVhbSkgewotICBSZXNldEVuZ2luZSgpOwotICBpbnQzMl90IG5JbmRleCA9IDA7Ci0gIGlmIChwU3RyZWFtICYmIHBTdHJlYW0tPkdldExlbmd0aCgpKSB7Ci0gICAgaW50MzJfdCBuU3RyZWFtTGVuZ3RoID0gcFN0cmVhbS0+R2V0TGVuZ3RoKCk7Ci0gICAgYm9vbCBiVmFsaWQgPSB0cnVlOwotICAgIGlmIChtX25MaW1pdCA+IDAgJiYgblN0cmVhbUxlbmd0aCA+IG1fbkxpbWl0KSB7Ci0gICAgICBiVmFsaWQgPSBmYWxzZTsKLSAgICB9Ci0gICAgYm9vbCBiUHJlSXNDUiA9IGZhbHNlOwotICAgIGlmIChiVmFsaWQpIHsKLSAgICAgIHVpbnQ4X3QgYm9tWzRdOwotICAgICAgaW50MzJfdCBuUG9zID0gcFN0cmVhbS0+R2V0Qk9NKGJvbSk7Ci0gICAgICBwU3RyZWFtLT5TZWVrKEZYX1NUUkVBTVNFRUtfQmVnaW4sIG5Qb3MpOwotICAgICAgaW50MzJfdCBuUGxhdGVTaXplID0gc3RkOjptaW4oblN0cmVhbUxlbmd0aCwgbV9wVHh0QnVmLT5HZXRDaHVua1NpemUoKSk7Ci0gICAgICBGWF9XQ0hBUiogbHB3c3RyID0gRlhfQWxsb2MoRlhfV0NIQVIsIG5QbGF0ZVNpemUpOwotICAgICAgYm9vbCBiRW9zID0gZmFsc2U7Ci0gICAgICB3aGlsZSAoIWJFb3MpIHsKLSAgICAgICAgaW50MzJfdCBuUmVhZCA9IHBTdHJlYW0tPlJlYWRTdHJpbmcobHB3c3RyLCBuUGxhdGVTaXplLCBiRW9zKTsKLSAgICAgICAgYlByZUlzQ1IgPSBSZXBsYWNlUGFyYWdFbmQobHB3c3RyLCBuUmVhZCwgYlByZUlzQ1IpOwotICAgICAgICBtX3BUeHRCdWYtPkluc2VydChuSW5kZXgsIGxwd3N0ciwgblJlYWQpOwotICAgICAgICBuSW5kZXggKz0gblJlYWQ7Ci0gICAgICB9Ci0gICAgICBGWF9GcmVlKGxwd3N0cik7Ci0gICAgfQotICB9Ci0gIG1fcFR4dEJ1Zi0+SW5zZXJ0KG5JbmRleCwgJm1fd0xpbmVFbmQsIDEpOwotICBSZWJ1aWxkUGFyYWdyYXBocygpOwotfQotCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsKLSAgUmVzZXRFbmdpbmUoKTsKLSAgaW50MzJfdCBuTGVuZ3RoID0gd3NUZXh0LkdldExlbmd0aCgpOwotICBpZiAobkxlbmd0aCA+IDApIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7Ci0gICAgRlhfV0NIQVIqIGxwQnVmZmVyID0gd3NUZW1wLkdldEJ1ZmZlcihuTGVuZ3RoKTsKLSAgICBGWFNZU19tZW1jcHkobHBCdWZmZXIsIHdzVGV4dC5jX3N0cigpLCBuTGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gICAgUmVwbGFjZVBhcmFnRW5kKGxwQnVmZmVyLCBuTGVuZ3RoLCBmYWxzZSk7Ci0gICAgd3NUZW1wLlJlbGVhc2VCdWZmZXIobkxlbmd0aCk7Ci0gICAgaWYgKG1fbkxpbWl0ID4gMCAmJiBuTGVuZ3RoID4gbV9uTGltaXQpIHsKLSAgICAgIHdzVGVtcC5EZWxldGUobV9uTGltaXQsIG5MZW5ndGggLSBtX25MaW1pdCk7Ci0gICAgICBuTGVuZ3RoID0gbV9uTGltaXQ7Ci0gICAgfQotICAgIG1fcFR4dEJ1Zi0+U2V0VGV4dCh3c1RlbXApOwotICB9Ci0gIG1fcFR4dEJ1Zi0+SW5zZXJ0KG5MZW5ndGgsICZtX3dMaW5lRW5kLCAxKTsKLSAgUmVidWlsZFBhcmFncmFwaHMoKTsKLX0KLQotaW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0VGV4dExlbmd0aCgpIGNvbnN0IHsKLSAgcmV0dXJuIEdldFRleHRCdWZMZW5ndGgoKTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldFRleHQoaW50MzJfdCBuU3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCkgY29uc3QgewotICBpbnQzMl90IG5UZXh0QnVmTGVuZ3RoID0gR2V0VGV4dEJ1Zkxlbmd0aCgpOwotICBpZiAobkNvdW50ID09IC0xKQotICAgIG5Db3VudCA9IG5UZXh0QnVmTGVuZ3RoIC0gblN0YXJ0OwotCi0gIENGWF9XaWRlU3RyaW5nIHdzVGV4dCA9IG1fcFR4dEJ1Zi0+R2V0UmFuZ2UoblN0YXJ0LCBuQ291bnQpOwotICBSZWNvdmVyUGFyYWdFbmQod3NUZXh0KTsKLSAgcmV0dXJuIHdzVGV4dDsKLX0KLQotdm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6Q2xlYXJUZXh0KCkgewotICBEZWxldGVSYW5nZSgwLCAtMSk7Ci19Ci0KLWludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldENhcmV0UmVjdChDRlhfUmVjdEYmIHJ0Q2FyZXQpIGNvbnN0IHsKLSAgcnRDYXJldCA9IG1fcnRDYXJldDsKLSAgcmV0dXJuIG1fbkNhcmV0OwotfQotCi1pbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpHZXRDYXJldFBvcygpIGNvbnN0IHsKLSAgaWYgKElzTG9ja2VkKCkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gbV9uQ2FyZXQgKyAobV9iQmVmb3JlID8gMCA6IDEpOwotfQotCi1pbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpTZXRDYXJldFBvcyhpbnQzMl90IG5JbmRleCwgYm9vbCBiQmVmb3JlKSB7Ci0gIGlmIChJc0xvY2tlZCgpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgQVNTRVJUKG5JbmRleCA+PSAwICYmIG5JbmRleCA8PSBHZXRUZXh0QnVmTGVuZ3RoKCkpOwotICBpZiAobV9QYWdlUHRyQXJyYXkuR2V0U2l6ZSgpIDw9IG1fbkNhcmV0UGFnZSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIG1fYkJlZm9yZSA9IGJCZWZvcmU7Ci0gIG1fbkNhcmV0ID0gbkluZGV4OwotICBNb3ZlUGFnZTJDaGFyKG1fbkNhcmV0KTsKLSAgR2V0Q2FyZXRSZWN0KG1fcnRDYXJldCwgbV9uQ2FyZXRQYWdlLCBtX25DYXJldCwgbV9iQmVmb3JlKTsKLSAgaWYgKCFtX2JCZWZvcmUpIHsKLSAgICBtX25DYXJldCsrOwotICAgIG1fYkJlZm9yZSA9IHRydWU7Ci0gIH0KLSAgbV9mQ2FyZXRQb3NSZXNlcnZlID0gbV9ydENhcmV0LmxlZnQ7Ci0gIG1fUGFyYW0ucEV2ZW50U2luay0+T25DYXJldENoYW5nZWQoKTsKLSAgbV9uQW5jaG9yUG9zID0gLTE7Ci0gIHJldHVybiBtX25DYXJldDsKLX0KLQotaW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6TW92ZUNhcmV0UG9zKEZERV9UWFRFRFRNT1ZFQ0FSRVQgZU1vdmVDYXJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTaGlmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJDdHJsKSB7Ci0gIGlmIChJc0xvY2tlZCgpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKG1fUGFnZVB0ckFycmF5LkdldFNpemUoKSA8PSBtX25DYXJldFBhZ2UpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBib29sIGJTZWxDaGFuZ2UgPSBmYWxzZTsKLSAgaWYgKElzU2VsZWN0KCkpIHsKLSAgICBDbGVhclNlbGVjdGlvbigpOwotICAgIGJTZWxDaGFuZ2UgPSB0cnVlOwotICB9Ci0gIGlmIChiU2hpZnQpIHsKLSAgICBpZiAobV9uQW5jaG9yUG9zID09IC0xKSB7Ci0gICAgICBtX25BbmNob3JQb3MgPSBtX25DYXJldDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgbV9uQW5jaG9yUG9zID0gLTE7Ci0gIH0KLQotICBzd2l0Y2ggKGVNb3ZlQ2FyZXQpIHsKLSAgICBjYXNlIE1DX0xlZnQ6IHsKLSAgICAgIGJvb2wgYkJlZm9yZSA9IHRydWU7Ci0gICAgICBpbnQzMl90IG5JbmRleCA9IE1vdmVCYWNrd2FyZChiQmVmb3JlKTsKLSAgICAgIGlmIChuSW5kZXggPj0gMCkgewotICAgICAgICBVcGRhdGVDYXJldFJlY3QobkluZGV4LCBiQmVmb3JlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DX1JpZ2h0OiB7Ci0gICAgICBib29sIGJCZWZvcmUgPSB0cnVlOwotICAgICAgaW50MzJfdCBuSW5kZXggPSBNb3ZlRm9yd2FyZChiQmVmb3JlKTsKLSAgICAgIGlmIChuSW5kZXggPj0gMCkgewotICAgICAgICBVcGRhdGVDYXJldFJlY3QobkluZGV4LCBiQmVmb3JlKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DX1VwOiB7Ci0gICAgICBDRlhfUG9pbnRGIHB0Q2FyZXQ7Ci0gICAgICBpZiAoTW92ZVVwKHB0Q2FyZXQpKSB7Ci0gICAgICAgIFVwZGF0ZUNhcmV0SW5kZXgocHRDYXJldCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBNQ19Eb3duOiB7Ci0gICAgICBDRlhfUG9pbnRGIHB0Q2FyZXQ7Ci0gICAgICBpZiAoTW92ZURvd24ocHRDYXJldCkpIHsKLSAgICAgICAgVXBkYXRlQ2FyZXRJbmRleChwdENhcmV0KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE1DX1dvcmRCYWNrd2FyZDoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTUNfV29yZEZvcndhcmQ6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1DX0xpbmVTdGFydDoKLSAgICAgIE1vdmVMaW5lU3RhcnQoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTUNfTGluZUVuZDoKLSAgICAgIE1vdmVMaW5lRW5kKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1DX1BhcmFnU3RhcnQ6Ci0gICAgICBNb3ZlUGFyYWdTdGFydCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNQ19QYXJhZ0VuZDoKLSAgICAgIE1vdmVQYXJhZ0VuZCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNQ19QYWdlRG93bjoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTUNfUGFnZVVwOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNQ19Ib21lOgotICAgICAgTW92ZUhvbWUoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTUNfRW5kOgotICAgICAgTW92ZUVuZCgpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0gIGlmIChiU2hpZnQgJiYgbV9uQW5jaG9yUG9zICE9IC0xICYmIChtX25BbmNob3JQb3MgIT0gbV9uQ2FyZXQpKSB7Ci0gICAgQWRkU2VsUmFuZ2Uoc3RkOjptaW4obV9uQW5jaG9yUG9zLCBtX25DYXJldCksCi0gICAgICAgICAgICAgICAgRlhTWVNfYWJzKG1fbkFuY2hvclBvcyAtIG1fbkNhcmV0KSk7Ci0gICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5PblNlbENoYW5nZWQoKTsKLSAgfQotICBpZiAoYlNlbENoYW5nZSkKLSAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uU2VsQ2hhbmdlZCgpOwotCi0gIHJldHVybiBtX25DYXJldDsKLX0KLQotdm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6TG9jaygpIHsKLSAgbV9iTG9jayA9IHRydWU7Ci19Ci0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlVubG9jaygpIHsKLSAgbV9iTG9jayA9IGZhbHNlOwotfQotCi1ib29sIENGREVfVHh0RWR0RW5naW5lOjpJc0xvY2tlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fYkxvY2s7Ci19Ci0KLWludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6Okluc2VydChpbnQzMl90IG5TdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbkxlbmd0aCkgewotICBpZiAoSXNMb2NrZWQoKSkgewotICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9Mb2NrZWQ7Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOwotICBGWF9XQ0hBUiogbHBCdWZmZXIgPSB3c1RlbXAuR2V0QnVmZmVyKG5MZW5ndGgpOwotICBGWFNZU19tZW1jcHkobHBCdWZmZXIsIGxwVGV4dCwgbkxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOwotICBSZXBsYWNlUGFyYWdFbmQobHBCdWZmZXIsIG5MZW5ndGgsIGZhbHNlKTsKLSAgd3NUZW1wLlJlbGVhc2VCdWZmZXIobkxlbmd0aCk7Ci0gIGJvb2wgYlBhcnQgPSBmYWxzZTsKLSAgaWYgKG1fbkxpbWl0ID4gMCkgewotICAgIGludDMyX3QgblRvdGFsTGVuZ3RoID0gR2V0VGV4dEJ1Zkxlbmd0aCgpOwotICAgIGludDMyX3QgbkNvdW50ID0gbV9TZWxSYW5nZVB0ckFyci5HZXRTaXplKCk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvdW50OyBpKyspIHsKLSAgICAgIEZERV9UWFRFRFRTRUxSQU5HRSogbHBTZWxSYW5nZSA9IG1fU2VsUmFuZ2VQdHJBcnIuR2V0QXQoaSk7Ci0gICAgICBuVG90YWxMZW5ndGggLT0gbHBTZWxSYW5nZS0+bkNvdW50OwotICAgIH0KLSAgICBpbnQzMl90IG5FeHBlY3RMZW5ndGggPSBuVG90YWxMZW5ndGggKyBuTGVuZ3RoOwotICAgIGlmIChuVG90YWxMZW5ndGggPT0gbV9uTGltaXQpIHsKLSAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9GdWxsOwotICAgIH0KLSAgICBpZiAobkV4cGVjdExlbmd0aCA+IG1fbkxpbWl0KSB7Ci0gICAgICBuTGVuZ3RoIC09IChuRXhwZWN0TGVuZ3RoIC0gbV9uTGltaXQpOwotICAgICAgYlBhcnQgPSB0cnVlOwotICAgIH0KLSAgfQotICBpZiAoKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9MaW1pdEFyZWFfVmVydCkgfHwKLSAgICAgIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTGltaXRBcmVhX0hvcnopKSB7Ci0gICAgaW50MzJfdCBuVGVtcCA9IG5MZW5ndGg7Ci0gICAgaWYgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9QYXNzd29yZCkgewotICAgICAgd2hpbGUgKG5MZW5ndGggPiAwKSB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dCA9IEdldFByZUluc2VydFRleHQobV9uQ2FyZXQsIGxwQnVmZmVyLCBuTGVuZ3RoKTsKLSAgICAgICAgaW50MzJfdCBuVG90YWwgPSB3c1RleHQuR2V0TGVuZ3RoKCk7Ci0gICAgICAgIEZYX1dDSEFSKiBscEJ1ZiA9IHdzVGV4dC5HZXRCdWZmZXIoblRvdGFsKTsKLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgblRvdGFsOyBpKyspIHsKLSAgICAgICAgICBscEJ1ZltpXSA9IG1fd2NBbGlhc0NoYXI7Ci0gICAgICAgIH0KLSAgICAgICAgd3NUZXh0LlJlbGVhc2VCdWZmZXIoblRvdGFsKTsKLSAgICAgICAgaWYgKElzRml0QXJlYSh3c1RleHQpKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbkxlbmd0aC0tOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB3aGlsZSAobkxlbmd0aCA+IDApIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0ID0gR2V0UHJlSW5zZXJ0VGV4dChtX25DYXJldCwgbHBCdWZmZXIsIG5MZW5ndGgpOwotICAgICAgICBpZiAoSXNGaXRBcmVhKHdzVGV4dCkpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBuTGVuZ3RoLS07Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChuTGVuZ3RoID09IDApIHsKLSAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9GdWxsOwotICAgIH0KLSAgICBpZiAobkxlbmd0aCA8IG5UZW1wKSB7Ci0gICAgICBiUGFydCA9IHRydWU7Ci0gICAgfQotICB9Ci0gIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfVmFsaWRhdGUpIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQgPSBHZXRQcmVJbnNlcnRUZXh0KG1fbkNhcmV0LCBscEJ1ZmZlciwgbkxlbmd0aCk7Ci0gICAgaWYgKCFtX1BhcmFtLnBFdmVudFNpbmstPk9uVmFsaWRhdGUod3NUZXh0KSkKLSAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9JbnZhbGlkYXRlOwotICB9Ci0gIGlmIChJc1NlbGVjdCgpKSB7Ci0gICAgRGVsZXRlU2VsZWN0KCk7Ci0gIH0KLSAgbV9QYXJhbS5wRXZlbnRTaW5rLT5PbkFkZERvUmVjb3JkKAotICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENGREVfVHh0RWR0RG9SZWNvcmRfSW5zZXJ0Pih0aGlzLCBtX25DYXJldCwgbHBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5MZW5ndGgpKTsKLQotICBtX0NoYW5nZUluZm8ud3NQcmV2VGV4dCA9IEdldFRleHQoMCwgLTEpOwotICBJbm5lcl9JbnNlcnQobV9uQ2FyZXQsIGxwQnVmZmVyLCBuTGVuZ3RoKTsKLSAgbV9DaGFuZ2VJbmZvLm5DaGFuZ2VUeXBlID0gRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfSW5zZXJ0OwotICBtX0NoYW5nZUluZm8ud3NJbnNlcnQgPSBDRlhfV2lkZVN0cmluZyhscEJ1ZmZlciwgbkxlbmd0aCk7Ci0gIG5TdGFydCA9IG1fbkNhcmV0OwotICBuU3RhcnQgKz0gbkxlbmd0aDsKLSAgRlhfV0NIQVIgd0NoYXIgPSBtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5TdGFydCAtIDEpOwotICBib29sIGJCZWZvcmUgPSB0cnVlOwotICBpZiAod0NoYXIgIT0gTCdcbicgJiYgd0NoYXIgIT0gTCdccicpIHsKLSAgICBuU3RhcnQtLTsKLSAgICBiQmVmb3JlID0gZmFsc2U7Ci0gIH0KLSAgU2V0Q2FyZXRQb3MoblN0YXJ0LCBiQmVmb3JlKTsKLSAgbV9QYXJhbS5wRXZlbnRTaW5rLT5PblRleHRDaGFuZ2VkKG1fQ2hhbmdlSW5mbyk7Ci0gIHJldHVybiBiUGFydCA/IEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX1BhcnQgOiBGREVfVFhURURUX01PRElGWV9SRVRfU19Ob3JtYWw7Ci19Ci0KLWludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkRlbGV0ZShpbnQzMl90IG5TdGFydCwgYm9vbCBiQmFja3NwYWNlKSB7Ci0gIGlmIChJc0xvY2tlZCgpKSB7Ci0gICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0xvY2tlZDsKLSAgfQotICBpZiAoSXNTZWxlY3QoKSkgewotICAgIERlbGV0ZVNlbGVjdCgpOwotICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfU19Ob3JtYWw7Ci0gIH0KLQotICBpbnQzMl90IG5Db3VudCA9IDE7Ci0gIGlmIChiQmFja3NwYWNlKSB7Ci0gICAgaWYgKG5TdGFydCA9PSAwKSB7Ci0gICAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfQm91bmRhcnk7Ci0gICAgfQotICAgIGlmIChuU3RhcnQgPiAyICYmIG1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgoblN0YXJ0IC0gMSkgPT0gTCdcbicgJiYKLSAgICAgICAgbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuU3RhcnQgLSAyKSA9PSBMJ1xyJykgewotICAgICAgblN0YXJ0LS07Ci0gICAgICBuQ291bnQrKzsKLSAgICB9Ci0gICAgblN0YXJ0LS07Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKG5TdGFydCA9PSBHZXRUZXh0QnVmTGVuZ3RoKCkpIHsKLSAgICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9GdWxsOwotICAgIH0KLSAgICBpZiAoKG5TdGFydCArIDEgPCBHZXRUZXh0QnVmTGVuZ3RoKCkpICYmCi0gICAgICAgIChtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5TdGFydCkgPT0gTCdccicpICYmCi0gICAgICAgIChtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5TdGFydCArIDEpID09IEwnXG4nKSkgewotICAgICAgbkNvdW50Kys7Ci0gICAgfQotICB9Ci0gIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfVmFsaWRhdGUpIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQgPSBHZXRQcmVEZWxldGVUZXh0KG5TdGFydCwgbkNvdW50KTsKLSAgICBpZiAoIW1fUGFyYW0ucEV2ZW50U2luay0+T25WYWxpZGF0ZSh3c1RleHQpKQotICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0ludmFsaWRhdGU7Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NSYW5nZSA9IG1fcFR4dEJ1Zi0+R2V0UmFuZ2UoblN0YXJ0LCBuQ291bnQpOwotICBtX1BhcmFtLnBFdmVudFNpbmstPk9uQWRkRG9SZWNvcmQoCi0gICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZERV9UeHRFZHREb1JlY29yZF9EZWxldGVSYW5nZT4odGhpcywgblN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbkNhcmV0LCB3c1JhbmdlKSk7Ci0KLSAgbV9DaGFuZ2VJbmZvLm5DaGFuZ2VUeXBlID0gRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfRGVsZXRlOwotICBtX0NoYW5nZUluZm8ud3NEZWxldGUgPSBHZXRUZXh0KG5TdGFydCwgbkNvdW50KTsKLSAgSW5uZXJfRGVsZXRlUmFuZ2UoblN0YXJ0LCBuQ291bnQpOwotICBTZXRDYXJldFBvcyhuU3RhcnQgKyAoKCFiQmFja3NwYWNlICYmIG5TdGFydCA+IDApID8gLTEgOiAwKSwKLSAgICAgICAgICAgICAgKGJCYWNrc3BhY2UgfHwgblN0YXJ0ID09IDApKTsKLSAgbV9QYXJhbS5wRXZlbnRTaW5rLT5PblRleHRDaGFuZ2VkKG1fQ2hhbmdlSW5mbyk7Ci0gIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfU19Ob3JtYWw7Ci19Ci0KLWludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkRlbGV0ZVJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCkgewotICBpZiAoSXNMb2NrZWQoKSkKLSAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfTG9ja2VkOwotICBpZiAobkNvdW50ID09IC0xKQotICAgIG5Db3VudCA9IEdldFRleHRCdWZMZW5ndGgoKTsKLSAgaWYgKG5Db3VudCA9PSAwKQotICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfU19Ob3JtYWw7Ci0gIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfVmFsaWRhdGUpIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQgPSBHZXRQcmVEZWxldGVUZXh0KG5TdGFydCwgbkNvdW50KTsKLSAgICBpZiAoIW1fUGFyYW0ucEV2ZW50U2luay0+T25WYWxpZGF0ZSh3c1RleHQpKQotICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0ludmFsaWRhdGU7Ci0gIH0KLSAgRGVsZXRlUmFuZ2VfRG9SZWNvcmQoblN0YXJ0LCBuQ291bnQpOwotICBtX1BhcmFtLnBFdmVudFNpbmstPk9uVGV4dENoYW5nZWQobV9DaGFuZ2VJbmZvKTsKLSAgU2V0Q2FyZXRQb3MoblN0YXJ0LCB0cnVlKTsKLSAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX05vcm1hbDsKLX0KLQotaW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6UmVwbGFjZShpbnQzMl90IG5TdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NSZXBsYWNlKSB7Ci0gIGlmIChJc0xvY2tlZCgpKQotICAgIHJldHVybiBGREVfVFhURURUX01PRElGWV9SRVRfRl9Mb2NrZWQ7Ci0gIGlmIChuU3RhcnQgPCAwIHx8IChuU3RhcnQgKyBuTGVuZ3RoID4gR2V0VGV4dEJ1Zkxlbmd0aCgpKSkKLSAgICByZXR1cm4gRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfQm91bmRhcnk7Ci0gIGlmIChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfVmFsaWRhdGUpIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQgPSBHZXRQcmVSZXBsYWNlVGV4dCgKLSAgICAgICAgblN0YXJ0LCBuTGVuZ3RoLCB3c1JlcGxhY2UuY19zdHIoKSwgd3NSZXBsYWNlLkdldExlbmd0aCgpKTsKLSAgICBpZiAoIW1fUGFyYW0ucEV2ZW50U2luay0+T25WYWxpZGF0ZSh3c1RleHQpKQotICAgICAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0ludmFsaWRhdGU7Ci0gIH0KLSAgaWYgKElzU2VsZWN0KCkpCi0gICAgQ2xlYXJTZWxlY3Rpb24oKTsKLQotICBtX0NoYW5nZUluZm8ubkNoYW5nZVR5cGUgPSBGREVfVFhURURUX1RFWFRDSEFOR0VfVFlQRV9SZXBsYWNlOwotICBtX0NoYW5nZUluZm8ud3NEZWxldGUgPSBHZXRUZXh0KG5TdGFydCwgbkxlbmd0aCk7Ci0gIGlmIChuTGVuZ3RoID4gMCkKLSAgICBJbm5lcl9EZWxldGVSYW5nZShuU3RhcnQsIG5MZW5ndGgpOwotCi0gIGludDMyX3QgblRleHRMZW5ndGggPSB3c1JlcGxhY2UuR2V0TGVuZ3RoKCk7Ci0gIGlmIChuVGV4dExlbmd0aCA+IDApCi0gICAgSW5uZXJfSW5zZXJ0KG5TdGFydCwgd3NSZXBsYWNlLmNfc3RyKCksIG5UZXh0TGVuZ3RoKTsKLQotICBtX0NoYW5nZUluZm8ud3NJbnNlcnQgPSBDRlhfV2lkZVN0cmluZyh3c1JlcGxhY2UuY19zdHIoKSwgblRleHRMZW5ndGgpOwotICBuU3RhcnQgKz0gblRleHRMZW5ndGg7Ci0gIEZYX1dDSEFSIHdDaGFyID0gbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuU3RhcnQgLSAxKTsKLSAgYm9vbCBiQmVmb3JlID0gdHJ1ZTsKLSAgaWYgKHdDaGFyICE9IEwnXG4nICYmIHdDaGFyICE9IEwnXHInKSB7Ci0gICAgblN0YXJ0LS07Ci0gICAgYkJlZm9yZSA9IGZhbHNlOwotICB9Ci0gIFNldENhcmV0UG9zKG5TdGFydCwgYkJlZm9yZSk7Ci0gIG1fUGFyYW0ucEV2ZW50U2luay0+T25QYWdlVW5sb2FkKG1fbkNhcmV0UGFnZSk7Ci0gIG1fUGFyYW0ucEV2ZW50U2luay0+T25QYWdlTG9hZChtX25DYXJldFBhZ2UpOwotICBtX1BhcmFtLnBFdmVudFNpbmstPk9uVGV4dENoYW5nZWQobV9DaGFuZ2VJbmZvKTsKLSAgcmV0dXJuIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX05vcm1hbDsKLX0KLQotdm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6U2V0TGltaXQoaW50MzJfdCBuTGltaXQpIHsKLSAgbV9uTGltaXQgPSBuTGltaXQ7Ci19Ci0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlNldEFsaWFzQ2hhcihGWF9XQ0hBUiB3Y0FsaWFzKSB7Ci0gIG1fd2NBbGlhc0NoYXIgPSB3Y0FsaWFzOwotfQotCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpSZW1vdmVTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQpIHsKLSAgRkRFX1RYVEVEVFNFTFJBTkdFKiBscFRlbXAgPSBudWxscHRyOwotICBpbnQzMl90IG5SYW5nZUNvdW50ID0gbV9TZWxSYW5nZVB0ckFyci5HZXRTaXplKCk7Ci0gIGludDMyX3QgaSA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBuUmFuZ2VDb3VudDsgaSsrKSB7Ci0gICAgbHBUZW1wID0gbV9TZWxSYW5nZVB0ckFycltpXTsKLSAgICBpZiAobHBUZW1wLT5uU3RhcnQgPT0gblN0YXJ0ICYmIGxwVGVtcC0+bkNvdW50ID09IG5Db3VudCkgewotICAgICAgZGVsZXRlIGxwVGVtcDsKLSAgICAgIG1fU2VsUmFuZ2VQdHJBcnIuUmVtb3ZlQXQoaSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OkFkZFNlbFJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCkgewotICBpZiAobkNvdW50ID09IC0xKSB7Ci0gICAgbkNvdW50ID0gR2V0VGV4dExlbmd0aCgpIC0gblN0YXJ0OwotICB9Ci0gIGludDMyX3QgblNpemUgPSBtX1NlbFJhbmdlUHRyQXJyLkdldFNpemUoKTsKLSAgaWYgKG5TaXplIDw9IDApIHsKLSAgICBGREVfVFhURURUU0VMUkFOR0UqIGxwU2VsUmFuZ2UgPSBuZXcgRkRFX1RYVEVEVFNFTFJBTkdFOwotICAgIGxwU2VsUmFuZ2UtPm5TdGFydCA9IG5TdGFydDsKLSAgICBscFNlbFJhbmdlLT5uQ291bnQgPSBuQ291bnQ7Ci0gICAgbV9TZWxSYW5nZVB0ckFyci5BZGQobHBTZWxSYW5nZSk7Ci0gICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5PblNlbENoYW5nZWQoKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgRkRFX1RYVEVEVFNFTFJBTkdFKiBscFRlbXAgPSBudWxscHRyOwotICBscFRlbXAgPSBtX1NlbFJhbmdlUHRyQXJyW25TaXplIC0gMV07Ci0gIGlmIChuU3RhcnQgPj0gbHBUZW1wLT5uU3RhcnQgKyBscFRlbXAtPm5Db3VudCkgewotICAgIEZERV9UWFRFRFRTRUxSQU5HRSogbHBTZWxSYW5nZSA9IG5ldyBGREVfVFhURURUU0VMUkFOR0U7Ci0gICAgbHBTZWxSYW5nZS0+blN0YXJ0ID0gblN0YXJ0OwotICAgIGxwU2VsUmFuZ2UtPm5Db3VudCA9IG5Db3VudDsKLSAgICBtX1NlbFJhbmdlUHRyQXJyLkFkZChscFNlbFJhbmdlKTsKLSAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uU2VsQ2hhbmdlZCgpOwotICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IG5FbmQgPSBuU3RhcnQgKyBuQ291bnQgLSAxOwotICBib29sIGJCZWdpbiA9IGZhbHNlOwotICBpbnQzMl90IG5SYW5nZUJnbiA9IDA7Ci0gIGludDMyX3QgblJhbmdlQ250ID0gMDsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgblNpemU7IGkrKykgewotICAgIGxwVGVtcCA9IG1fU2VsUmFuZ2VQdHJBcnJbaV07Ci0gICAgaW50MzJfdCBuVGVtcEJnbiA9IGxwVGVtcC0+blN0YXJ0OwotICAgIGludDMyX3QgblRlbXBFbmQgPSBuVGVtcEJnbiArIGxwVGVtcC0+bkNvdW50IC0gMTsKLSAgICBpZiAoYkJlZ2luKSB7Ci0gICAgICBpZiAobkVuZCA8IG5UZW1wQmduKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSBlbHNlIGlmIChuU3RhcnQgPj0gblRlbXBCZ24gJiYgblN0YXJ0IDw9IG5UZW1wRW5kKSB7Ci0gICAgICAgIG5SYW5nZUNudCsrOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIG5SYW5nZUNudCsrOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoblN0YXJ0IDw9IG5UZW1wRW5kKSB7Ci0gICAgICAgIG5SYW5nZUJnbiA9IGk7Ci0gICAgICAgIGlmIChuRW5kIDwgblRlbXBCZ24pIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBuUmFuZ2VDbnQgPSAxOwotICAgICAgICBiQmVnaW4gPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgfQotICBpZiAoblJhbmdlQ250ID09IDApIHsKLSAgICBGREVfVFhURURUU0VMUkFOR0UqIGxwU2VsUmFuZ2UgPSBuZXcgRkRFX1RYVEVEVFNFTFJBTkdFOwotICAgIGxwU2VsUmFuZ2UtPm5TdGFydCA9IG5TdGFydDsKLSAgICBscFNlbFJhbmdlLT5uQ291bnQgPSBuQ291bnQ7Ci0gICAgbV9TZWxSYW5nZVB0ckFyci5JbnNlcnRBdChuUmFuZ2VCZ24sIGxwU2VsUmFuZ2UpOwotICB9IGVsc2UgewotICAgIGxwVGVtcCA9IG1fU2VsUmFuZ2VQdHJBcnJbblJhbmdlQmduXTsKLSAgICBscFRlbXAtPm5TdGFydCA9IG5TdGFydDsKLSAgICBscFRlbXAtPm5Db3VudCA9IG5Db3VudDsKLSAgICBuUmFuZ2VDbnQtLTsKLSAgICBuUmFuZ2VCZ24rKzsKLSAgICB3aGlsZSAoblJhbmdlQ250LS0pIHsKLSAgICAgIGRlbGV0ZSBtX1NlbFJhbmdlUHRyQXJyW25SYW5nZUJnbl07Ci0gICAgICBtX1NlbFJhbmdlUHRyQXJyLlJlbW92ZUF0KG5SYW5nZUJnbik7Ci0gICAgfQotICB9Ci0gIG1fUGFyYW0ucEV2ZW50U2luay0+T25TZWxDaGFuZ2VkKCk7Ci19Ci0KLWludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkNvdW50U2VsUmFuZ2VzKCkgY29uc3QgewotICByZXR1cm4gbV9TZWxSYW5nZVB0ckFyci5HZXRTaXplKCk7Ci19Ci0KLWludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldFNlbFJhbmdlKGludDMyX3QgbkluZGV4LCBpbnQzMl90KiBuU3RhcnQpIGNvbnN0IHsKLSAgaWYgKG5TdGFydCkKLSAgICAqblN0YXJ0ID0gbV9TZWxSYW5nZVB0ckFycltuSW5kZXhdLT5uU3RhcnQ7Ci0gIHJldHVybiBtX1NlbFJhbmdlUHRyQXJyW25JbmRleF0tPm5Db3VudDsKLX0KLQotdm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6Q2xlYXJTZWxlY3Rpb24oKSB7Ci0gIGludDMyX3QgbkNvdW50ID0gbV9TZWxSYW5nZVB0ckFyci5HZXRTaXplKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbkNvdW50OyArK2kpCi0gICAgZGVsZXRlIG1fU2VsUmFuZ2VQdHJBcnJbaV07Ci0gIG1fU2VsUmFuZ2VQdHJBcnIuUmVtb3ZlQWxsKCk7Ci0gIGlmIChuQ291bnQgJiYgbV9QYXJhbS5wRXZlbnRTaW5rKQotICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25TZWxDaGFuZ2VkKCk7Ci19Ci0KLWJvb2wgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlZG8oY29uc3QgSUZERV9UeHRFZHREb1JlY29yZCogcERvUmVjb3JkKSB7Ci0gIGlmIChJc0xvY2tlZCgpKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHBEb1JlY29yZC0+UmVkbygpOwotfQotCi1ib29sIENGREVfVHh0RWR0RW5naW5lOjpVbmRvKGNvbnN0IElGREVfVHh0RWR0RG9SZWNvcmQqIHBEb1JlY29yZCkgewotICBpZiAoSXNMb2NrZWQoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiBwRG9SZWNvcmQtPlVuZG8oKTsKLX0KLQotaW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6U3RhcnRMYXlvdXQoKSB7Ci0gIExvY2soKTsKLSAgUmVtb3ZlQWxsUGFnZXMoKTsKLSAgbV9uTGF5b3V0UG9zID0gMDsKLSAgbV9uTGluZUNvdW50ID0gMDsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkRvTGF5b3V0KElGWF9QYXVzZSogcFBhdXNlKSB7Ci0gIGludDMyX3QgbkNvdW50ID0gbV9QYXJhZ1B0ckFycmF5LkdldFNpemUoKTsKLSAgQ0ZERV9UeHRFZHRQYXJhZyogcFBhcmFnID0gbnVsbHB0cjsKLSAgaW50MzJfdCBuTGluZUNvdW50ID0gMDsKLSAgZm9yICg7IG1fbkxheW91dFBvcyA8IG5Db3VudDsgbV9uTGF5b3V0UG9zKyspIHsKLSAgICBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbbV9uTGF5b3V0UG9zXTsKLSAgICBwUGFyYWctPkNhbGNMaW5lcygpOwotICAgIG5MaW5lQ291bnQgKz0gcFBhcmFnLT5HZXRMaW5lQ291bnQoKTsKLSAgICBpZiAobkxpbmVDb3VudCA+IG1fblBhZ2VMaW5lQ291bnQgJiYgcFBhdXNlICYmIHBQYXVzZS0+TmVlZFRvUGF1c2VOb3coKSkgewotICAgICAgbV9uTGluZUNvdW50ICs9IG5MaW5lQ291bnQ7Ci0gICAgICByZXR1cm4gKCsrbV9uTGF5b3V0UG9zICogMTAwKSAvIG5Db3VudDsKLSAgICB9Ci0gIH0KLSAgbV9uTGluZUNvdW50ICs9IG5MaW5lQ291bnQ7Ci0gIHJldHVybiAxMDA7Ci19Ci0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OkVuZExheW91dCgpIHsKLSAgVXBkYXRlUGFnZXMoKTsKLSAgaW50MzJfdCBuTGVuZ3RoID0gR2V0VGV4dExlbmd0aCgpOwotICBpZiAobV9uQ2FyZXQgPiBuTGVuZ3RoKQotICAgIG1fbkNhcmV0ID0gbkxlbmd0aDsKLQotICBpbnQzMl90IG5JbmRleCA9IG1fbkNhcmV0OwotICBpZiAoIW1fYkJlZm9yZSkKLSAgICBuSW5kZXgtLTsKLQotICBtX3J0Q2FyZXQgPSBDRlhfUmVjdEYoMCwgMCwgMSwgbV9QYXJhbS5mRm9udFNpemUpOwotICBVbmxvY2soKTsKLX0KLQotQ0ZERV9UeHRFZHRCdWYqIENGREVfVHh0RWR0RW5naW5lOjpHZXRUZXh0QnVmKCkgY29uc3QgewotICByZXR1cm4gbV9wVHh0QnVmLmdldCgpOwotfQotCi1pbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpHZXRUZXh0QnVmTGVuZ3RoKCkgY29uc3QgewotICByZXR1cm4gbV9wVHh0QnVmLT5HZXRUZXh0TGVuZ3RoKCkgLSAxOwotfQotCi1DRlhfVHh0QnJlYWsqIENGREVfVHh0RWR0RW5naW5lOjpHZXRUZXh0QnJlYWsoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BUZXh0QnJlYWsuZ2V0KCk7Ci19Ci0KLWludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldExpbmVDb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fbkxpbmVDb3VudDsKLX0KLQotaW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0UGFnZUxpbmVDb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fblBhZ2VMaW5lQ291bnQ7Ci19Ci0KLWludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6OkNvdW50UGFyYWdzKCkgY29uc3QgewotICByZXR1cm4gbV9QYXJhZ1B0ckFycmF5LkdldFNpemUoKTsKLX0KLQotQ0ZERV9UeHRFZHRQYXJhZyogQ0ZERV9UeHRFZHRFbmdpbmU6OkdldFBhcmFnKGludDMyX3QgblBhcmFnSW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fUGFyYWdQdHJBcnJheVtuUGFyYWdJbmRleF07Ci19Ci0KLUlGWF9DaGFySXRlciogQ0ZERV9UeHRFZHRFbmdpbmU6OkNyZWF0ZUNoYXJJdGVyKCkgewotICBpZiAoIW1fcFR4dEJ1ZikKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIG5ldyBDRkRFX1R4dEVkdEJ1Zjo6SXRlcmF0b3IobV9wVHh0QnVmLmdldCgpKTsKLX0KLQotaW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6TGluZTJQYXJhZyhpbnQzMl90IG5TdGFydFBhcmFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdGFydExpbmVvZlBhcmFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MaW5lSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5TdGFydExpbmUpIGNvbnN0IHsKLSAgaW50MzJfdCBuTGluZVRvdGFsID0gblN0YXJ0TGluZW9mUGFyYWc7Ci0gIGludDMyX3QgbkNvdW50ID0gbV9QYXJhZ1B0ckFycmF5LkdldFNpemUoKTsKLSAgQ0ZERV9UeHRFZHRQYXJhZyogcFBhcmFnID0gbnVsbHB0cjsKLSAgaW50MzJfdCBpID0gblN0YXJ0UGFyYWc7Ci0gIGZvciAoOyBpIDwgbkNvdW50OyBpKyspIHsKLSAgICBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbaV07Ci0gICAgbkxpbmVUb3RhbCArPSBwUGFyYWctPkdldExpbmVDb3VudCgpOwotICAgIGlmIChuTGluZVRvdGFsID4gbkxpbmVJbmRleCkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIG5TdGFydExpbmUgPSBuTGluZVRvdGFsIC0gcFBhcmFnLT5HZXRMaW5lQ291bnQoKTsKLSAgcmV0dXJuIGk7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENGREVfVHh0RWR0RW5naW5lOjpHZXRQcmVEZWxldGVUZXh0KGludDMyX3QgbkluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoKSB7Ci0gIENGWF9XaWRlU3RyaW5nIHdzVGV4dCA9IEdldFRleHQoMCwgR2V0VGV4dEJ1Zkxlbmd0aCgpKTsKLSAgd3NUZXh0LkRlbGV0ZShuSW5kZXgsIG5MZW5ndGgpOwotICByZXR1cm4gd3NUZXh0OwotfQotCi1DRlhfV2lkZVN0cmluZyBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0UHJlSW5zZXJ0VGV4dChpbnQzMl90IG5JbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBscFRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5MZW5ndGgpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0ID0gR2V0VGV4dCgwLCBHZXRUZXh0QnVmTGVuZ3RoKCkpOwotICBpbnQzMl90IG5TZWxJbmRleCA9IDA7Ci0gIGludDMyX3QgblNlbExlbmd0aCA9IDA7Ci0gIGludDMyX3QgblNlbENvdW50ID0gQ291bnRTZWxSYW5nZXMoKTsKLSAgd2hpbGUgKG5TZWxDb3VudC0tKSB7Ci0gICAgblNlbExlbmd0aCA9IEdldFNlbFJhbmdlKG5TZWxDb3VudCwgJm5TZWxJbmRleCk7Ci0gICAgd3NUZXh0LkRlbGV0ZShuU2VsSW5kZXgsIG5TZWxMZW5ndGgpOwotICAgIG5JbmRleCA9IG5TZWxJbmRleDsKLSAgfQotICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7Ci0gIGludDMyX3Qgbk9sZExlbmd0aCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsKLSAgY29uc3QgRlhfV0NIQVIqIHBPbGRCdWZmZXIgPSB3c1RleHQuY19zdHIoKTsKLSAgRlhfV0NIQVIqIGxwQnVmZmVyID0gd3NUZW1wLkdldEJ1ZmZlcihuT2xkTGVuZ3RoICsgbkxlbmd0aCk7Ci0gIEZYU1lTX21lbWNweShscEJ1ZmZlciwgcE9sZEJ1ZmZlciwgKG5JbmRleCkgKiBzaXplb2YoRlhfV0NIQVIpKTsKLSAgRlhTWVNfbWVtY3B5KGxwQnVmZmVyICsgbkluZGV4LCBscFRleHQsIG5MZW5ndGggKiBzaXplb2YoRlhfV0NIQVIpKTsKLSAgRlhTWVNfbWVtY3B5KGxwQnVmZmVyICsgbkluZGV4ICsgbkxlbmd0aCwgcE9sZEJ1ZmZlciArIG5JbmRleCwKLSAgICAgICAgICAgICAgIChuT2xkTGVuZ3RoIC0gbkluZGV4KSAqIHNpemVvZihGWF9XQ0hBUikpOwotICB3c1RlbXAuUmVsZWFzZUJ1ZmZlcihuT2xkTGVuZ3RoICsgbkxlbmd0aCk7Ci0gIHdzVGV4dCA9IHdzVGVtcDsKLSAgcmV0dXJuIHdzVGV4dDsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ0ZERV9UeHRFZHRFbmdpbmU6OkdldFByZVJlcGxhY2VUZXh0KGludDMyX3QgbkluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbk9yaWdpbkxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbkxlbmd0aCkgewotICBDRlhfV2lkZVN0cmluZyB3c1RleHQgPSBHZXRUZXh0KDAsIEdldFRleHRCdWZMZW5ndGgoKSk7Ci0gIGludDMyX3QgblNlbEluZGV4ID0gMDsKLSAgaW50MzJfdCBuU2VsTGVuZ3RoID0gMDsKLSAgaW50MzJfdCBuU2VsQ291bnQgPSBDb3VudFNlbFJhbmdlcygpOwotICB3aGlsZSAoblNlbENvdW50LS0pIHsKLSAgICBuU2VsTGVuZ3RoID0gR2V0U2VsUmFuZ2UoblNlbENvdW50LCAmblNlbEluZGV4KTsKLSAgICB3c1RleHQuRGVsZXRlKG5TZWxJbmRleCwgblNlbExlbmd0aCk7Ci0gIH0KLSAgd3NUZXh0LkRlbGV0ZShuSW5kZXgsIG5PcmlnaW5MZW5ndGgpOwotICBpbnQzMl90IGkgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgbkxlbmd0aDsgaSsrKQotICAgIHdzVGV4dC5JbnNlcnQobkluZGV4KyssIGxwVGV4dFtpXSk7Ci0KLSAgcmV0dXJuIHdzVGV4dDsKLX0KLQotdm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6SW5uZXJfSW5zZXJ0KGludDMyX3QgblN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBscFRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoKSB7Ci0gIEFTU0VSVChuTGVuZ3RoID4gMCk7Ci0gIEZERV9UWFRFRFRQQVJBR1BPUyBQYXJhZ1BvczsKLSAgVGV4dFBvczJQYXJhZ1BvcyhuU3RhcnQsIFBhcmFnUG9zKTsKLSAgbV9QYXJhbS5wRXZlbnRTaW5rLT5PblBhZ2VVbmxvYWQobV9uQ2FyZXRQYWdlKTsKLSAgaW50MzJfdCBuUGFyYWdDb3VudCA9IG1fUGFyYWdQdHJBcnJheS5HZXRTaXplKCk7Ci0gIGludDMyX3QgaSA9IDA7Ci0gIGZvciAoaSA9IFBhcmFnUG9zLm5QYXJhZ0luZGV4ICsgMTsgaSA8IG5QYXJhZ0NvdW50OyBpKyspCi0gICAgbV9QYXJhZ1B0ckFycmF5W2ldLT5JbmNyZW1lbnRTdGFydEluZGV4KG5MZW5ndGgpOwotCi0gIENGREVfVHh0RWR0UGFyYWcqIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtQYXJhZ1Bvcy5uUGFyYWdJbmRleF07Ci0gIGludDMyX3QgblJlc2VydmVMaW5lQ291bnQgPSBwUGFyYWctPkdldExpbmVDb3VudCgpOwotICBpbnQzMl90IG5SZXNlcnZlQ2hhclN0YXJ0ID0gcFBhcmFnLT5HZXRTdGFydEluZGV4KCk7Ci0gIGludDMyX3QgbkxlYXZlUGFydCA9IFBhcmFnUG9zLm5DaGFySW5kZXg7Ci0gIGludDMyX3QgbkN1dFBhcnQgPSBwUGFyYWctPkdldFRleHRMZW5ndGgoKSAtIFBhcmFnUG9zLm5DaGFySW5kZXg7Ci0gIGludDMyX3QgblRleHRTdGFydCA9IDA7Ci0gIEZYX1dDSEFSIHdDdXJDaGFyID0gTCcgJzsKLSAgY29uc3QgRlhfV0NIQVIqIGxwUG9zID0gbHBUZXh0OwotICBib29sIGJGaXJzdCA9IHRydWU7Ci0gIGludDMyX3QgblBhcmFnSW5kZXggPSBQYXJhZ1Bvcy5uUGFyYWdJbmRleDsKLSAgZm9yIChpID0gMDsgaSA8IG5MZW5ndGg7IGkrKywgbHBQb3MrKykgewotICAgIHdDdXJDaGFyID0gKmxwUG9zOwotICAgIGlmICh3Q3VyQ2hhciA9PSBtX3dMaW5lRW5kKSB7Ci0gICAgICBpZiAoYkZpcnN0KSB7Ci0gICAgICAgIHBQYXJhZy0+U2V0VGV4dExlbmd0aChuTGVhdmVQYXJ0ICsgKGkgLSBuVGV4dFN0YXJ0ICsgMSkpOwotICAgICAgICBwUGFyYWctPlNldExpbmVDb3VudCgtMSk7Ci0gICAgICAgIG5SZXNlcnZlQ2hhclN0YXJ0ICs9IHBQYXJhZy0+R2V0VGV4dExlbmd0aCgpOwotICAgICAgICBiRmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBQYXJhZyA9IG5ldyBDRkRFX1R4dEVkdFBhcmFnKHRoaXMpOwotICAgICAgICBwUGFyYWctPlNldExpbmVDb3VudCgtMSk7Ci0gICAgICAgIHBQYXJhZy0+U2V0VGV4dExlbmd0aChpIC0gblRleHRTdGFydCArIDEpOwotICAgICAgICBwUGFyYWctPlNldFN0YXJ0SW5kZXgoblJlc2VydmVDaGFyU3RhcnQpOwotICAgICAgICBtX1BhcmFnUHRyQXJyYXkuSW5zZXJ0QXQoKytuUGFyYWdJbmRleCwgcFBhcmFnKTsKLSAgICAgICAgblJlc2VydmVDaGFyU3RhcnQgKz0gcFBhcmFnLT5HZXRUZXh0TGVuZ3RoKCk7Ci0gICAgICB9Ci0gICAgICBuVGV4dFN0YXJ0ID0gaSArIDE7Ci0gICAgfQotICB9Ci0gIGlmIChiRmlyc3QpIHsKLSAgICBwUGFyYWctPkluY3JlbWVudFRleHRMZW5ndGgobkxlbmd0aCk7Ci0gICAgcFBhcmFnLT5TZXRMaW5lQ291bnQoLTEpOwotICAgIGJGaXJzdCA9IGZhbHNlOwotICB9IGVsc2UgewotICAgIHBQYXJhZyA9IG5ldyBDRkRFX1R4dEVkdFBhcmFnKHRoaXMpOwotICAgIHBQYXJhZy0+U2V0TGluZUNvdW50KC0xKTsKLSAgICBwUGFyYWctPlNldFRleHRMZW5ndGgobkxlbmd0aCAtIG5UZXh0U3RhcnQgKyBuQ3V0UGFydCk7Ci0gICAgcFBhcmFnLT5TZXRTdGFydEluZGV4KG5SZXNlcnZlQ2hhclN0YXJ0KTsKLSAgICBtX1BhcmFnUHRyQXJyYXkuSW5zZXJ0QXQoKytuUGFyYWdJbmRleCwgcFBhcmFnKTsKLSAgfQotICBtX3BUeHRCdWYtPkluc2VydChuU3RhcnQsIGxwVGV4dCwgbkxlbmd0aCk7Ci0gIGludDMyX3QgblRvdGFsTGluZUNvdW50ID0gMDsKLSAgZm9yIChpID0gUGFyYWdQb3MublBhcmFnSW5kZXg7IGkgPD0gblBhcmFnSW5kZXg7IGkrKykgewotICAgIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtpXTsKLSAgICBwUGFyYWctPkNhbGNMaW5lcygpOwotICAgIG5Ub3RhbExpbmVDb3VudCArPSBwUGFyYWctPkdldExpbmVDb3VudCgpOwotICB9Ci0gIG1fbkxpbmVDb3VudCArPSBuVG90YWxMaW5lQ291bnQgLSBuUmVzZXJ2ZUxpbmVDb3VudDsKLSAgbV9QYXJhbS5wRXZlbnRTaW5rLT5PblBhZ2VMb2FkKG1fbkNhcmV0UGFnZSk7Ci0gIFVwZGF0ZVBhZ2VzKCk7Ci19Ci0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OklubmVyX0RlbGV0ZVJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCkgewotICBpZiAobkNvdW50ID09IC0xKSB7Ci0gICAgbkNvdW50ID0gbV9wVHh0QnVmLT5HZXRUZXh0TGVuZ3RoKCkgLSBuU3RhcnQ7Ci0gIH0KLSAgaW50MzJfdCBuRW5kID0gblN0YXJ0ICsgbkNvdW50IC0gMTsKLSAgQVNTRVJUKG5TdGFydCA+PSAwICYmIG5FbmQgPCBtX3BUeHRCdWYtPkdldFRleHRMZW5ndGgoKSk7Ci0gIG1fUGFyYW0ucEV2ZW50U2luay0+T25QYWdlVW5sb2FkKG1fbkNhcmV0UGFnZSk7Ci0gIEZERV9UWFRFRFRQQVJBR1BPUyBQYXJhZ1Bvc0JnbiwgUGFyYWdQb3NFbmQ7Ci0gIFRleHRQb3MyUGFyYWdQb3MoblN0YXJ0LCBQYXJhZ1Bvc0Jnbik7Ci0gIFRleHRQb3MyUGFyYWdQb3MobkVuZCwgUGFyYWdQb3NFbmQpOwotICBDRkRFX1R4dEVkdFBhcmFnKiBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbUGFyYWdQb3NFbmQublBhcmFnSW5kZXhdOwotICBib29sIGJMYXN0UGFyYWcgPSBmYWxzZTsKLSAgaWYgKFBhcmFnUG9zRW5kLm5DaGFySW5kZXggPT0gcFBhcmFnLT5HZXRUZXh0TGVuZ3RoKCkgLSAxKSB7Ci0gICAgaWYgKFBhcmFnUG9zRW5kLm5QYXJhZ0luZGV4IDwgbV9QYXJhZ1B0ckFycmF5LkdldFNpemUoKSAtIDEpIHsKLSAgICAgIFBhcmFnUG9zRW5kLm5QYXJhZ0luZGV4Kys7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJMYXN0UGFyYWcgPSB0cnVlOwotICAgIH0KLSAgfQotICBpbnQzMl90IG5Ub3RhbExpbmVDb3VudCA9IDA7Ci0gIGludDMyX3QgblRvdGFsQ2hhckNvdW50ID0gMDsKLSAgaW50MzJfdCBpID0gMDsKLSAgZm9yIChpID0gUGFyYWdQb3NCZ24ublBhcmFnSW5kZXg7IGkgPD0gUGFyYWdQb3NFbmQublBhcmFnSW5kZXg7IGkrKykgewotICAgIENGREVfVHh0RWR0UGFyYWcqIHBUZXh0UGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbaV07Ci0gICAgcFRleHRQYXJhZy0+Q2FsY0xpbmVzKCk7Ci0gICAgblRvdGFsTGluZUNvdW50ICs9IHBUZXh0UGFyYWctPkdldExpbmVDb3VudCgpOwotICAgIG5Ub3RhbENoYXJDb3VudCArPSBwVGV4dFBhcmFnLT5HZXRUZXh0TGVuZ3RoKCk7Ci0gIH0KLSAgbV9wVHh0QnVmLT5EZWxldGUoblN0YXJ0LCBuQ291bnQpOwotICBpbnQzMl90IG5OZXh0UGFyYWdJbmRleCA9IChQYXJhZ1Bvc0Jnbi5uQ2hhckluZGV4ID09IDAgJiYgYkxhc3RQYXJhZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQYXJhZ1Bvc0Jnbi5uUGFyYWdJbmRleAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChQYXJhZ1Bvc0Jnbi5uUGFyYWdJbmRleCArIDEpOwotICBmb3IgKGkgPSBuTmV4dFBhcmFnSW5kZXg7IGkgPD0gUGFyYWdQb3NFbmQublBhcmFnSW5kZXg7IGkrKykgewotICAgIGRlbGV0ZSBtX1BhcmFnUHRyQXJyYXlbbk5leHRQYXJhZ0luZGV4XTsKLSAgICBtX1BhcmFnUHRyQXJyYXkuUmVtb3ZlQXQobk5leHRQYXJhZ0luZGV4KTsKLSAgfQotICBpZiAoIShiTGFzdFBhcmFnICYmIFBhcmFnUG9zQmduLm5DaGFySW5kZXggPT0gMCkpIHsKLSAgICBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbUGFyYWdQb3NCZ24ublBhcmFnSW5kZXhdOwotICAgIHBQYXJhZy0+U2V0VGV4dExlbmd0aChuVG90YWxDaGFyQ291bnQgLSBuQ291bnQpOwotICAgIHBQYXJhZy0+Q2FsY0xpbmVzKCk7Ci0gICAgblRvdGFsTGluZUNvdW50IC09IHBQYXJhZy0+R2V0VGV4dExlbmd0aCgpOwotICB9Ci0gIGludDMyX3QgblBhcmFnQ291bnQgPSBtX1BhcmFnUHRyQXJyYXkuR2V0U2l6ZSgpOwotICBmb3IgKGkgPSBuTmV4dFBhcmFnSW5kZXg7IGkgPCBuUGFyYWdDb3VudDsgaSsrKQotICAgIG1fUGFyYWdQdHJBcnJheVtpXS0+RGVjcmVtZW50U3RhcnRJbmRleChuQ291bnQpOwotCi0gIG1fbkxpbmVDb3VudCAtPSBuVG90YWxMaW5lQ291bnQ7Ci0gIFVwZGF0ZVBhZ2VzKCk7Ci0gIGludDMyX3QgblBhZ2VDb3VudCA9IENvdW50UGFnZXMoKTsKLSAgaWYgKG1fbkNhcmV0UGFnZSA+PSBuUGFnZUNvdW50KSB7Ci0gICAgbV9uQ2FyZXRQYWdlID0gblBhZ2VDb3VudCAtIDE7Ci0gIH0KLSAgbV9QYXJhbS5wRXZlbnRTaW5rLT5PblBhZ2VMb2FkKG1fbkNhcmV0UGFnZSk7Ci19Ci0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OkRlbGV0ZVJhbmdlX0RvUmVjb3JkKGludDMyX3QgblN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZWwpIHsKLSAgQVNTRVJUKG5TdGFydCA+PSAwKTsKLSAgaWYgKG5Db3VudCA9PSAtMSkgewotICAgIG5Db3VudCA9IEdldFRleHRMZW5ndGgoKSAtIG5TdGFydDsKLSAgfQotICBBU1NFUlQoKG5TdGFydCArIG5Db3VudCkgPD0gbV9wVHh0QnVmLT5HZXRUZXh0TGVuZ3RoKCkpOwotCi0gIENGWF9XaWRlU3RyaW5nIHdzUmFuZ2UgPSBtX3BUeHRCdWYtPkdldFJhbmdlKG5TdGFydCwgbkNvdW50KTsKLSAgbV9QYXJhbS5wRXZlbnRTaW5rLT5PbkFkZERvUmVjb3JkKAotICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENGREVfVHh0RWR0RG9SZWNvcmRfRGVsZXRlUmFuZ2U+KAotICAgICAgICAgIHRoaXMsIG5TdGFydCwgbV9uQ2FyZXQsIHdzUmFuZ2UsIGJTZWwpKTsKLQotICBtX0NoYW5nZUluZm8ubkNoYW5nZVR5cGUgPSBGREVfVFhURURUX1RFWFRDSEFOR0VfVFlQRV9EZWxldGU7Ci0gIG1fQ2hhbmdlSW5mby53c0RlbGV0ZSA9IEdldFRleHQoblN0YXJ0LCBuQ291bnQpOwotICBJbm5lcl9EZWxldGVSYW5nZShuU3RhcnQsIG5Db3VudCk7Ci19Ci0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlc2V0RW5naW5lKCkgewotICBSZW1vdmVBbGxQYWdlcygpOwotICBSZW1vdmVBbGxQYXJhZ3MoKTsKLSAgQ2xlYXJTZWxlY3Rpb24oKTsKLSAgbV9uQ2FyZXQgPSAwOwotICBtX3BUeHRCdWYtPkNsZWFyKGZhbHNlKTsKLSAgbV9uQ2FyZXQgPSAwOwotfQotCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpSZWJ1aWxkUGFyYWdyYXBocygpIHsKLSAgUmVtb3ZlQWxsUGFyYWdzKCk7Ci0gIEZYX1dDSEFSIHdDaGFyID0gTCcgJzsKLSAgaW50MzJfdCBuUGFyYWdTdGFydCA9IDA7Ci0gIGludDMyX3QgbkluZGV4ID0gMDsKLSAgc3RkOjp1bmlxdWVfcHRyPElGWF9DaGFySXRlcj4gcEl0ZXIoCi0gICAgICBuZXcgQ0ZERV9UeHRFZHRCdWY6Okl0ZXJhdG9yKG1fcFR4dEJ1Zi5nZXQoKSkpOwotICBwSXRlci0+U2V0QXQoMCk7Ci0gIGRvIHsKLSAgICB3Q2hhciA9IHBJdGVyLT5HZXRDaGFyKCk7Ci0gICAgbkluZGV4ID0gcEl0ZXItPkdldEF0KCk7Ci0gICAgaWYgKHdDaGFyID09IG1fd0xpbmVFbmQpIHsKLSAgICAgIENGREVfVHh0RWR0UGFyYWcqIHBQYXJhZyA9IG5ldyBDRkRFX1R4dEVkdFBhcmFnKHRoaXMpOwotICAgICAgcFBhcmFnLT5TZXRTdGFydEluZGV4KG5QYXJhZ1N0YXJ0KTsKLSAgICAgIHBQYXJhZy0+U2V0VGV4dExlbmd0aChuSW5kZXggLSBuUGFyYWdTdGFydCArIDEpOwotICAgICAgcFBhcmFnLT5TZXRMaW5lQ291bnQoLTEpOwotICAgICAgbV9QYXJhZ1B0ckFycmF5LkFkZChwUGFyYWcpOwotICAgICAgblBhcmFnU3RhcnQgPSBuSW5kZXggKyAxOwotICAgIH0KLSAgfSB3aGlsZSAocEl0ZXItPk5leHQoKSk7Ci19Ci0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlbW92ZUFsbFBhcmFncygpIHsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9QYXJhZ1B0ckFycmF5LkdldFNpemUoKTsgKytpKQotICAgIGRlbGV0ZSBtX1BhcmFnUHRyQXJyYXlbaV07Ci0gIG1fUGFyYWdQdHJBcnJheS5SZW1vdmVBbGwoKTsKLX0KLQotdm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6UmVtb3ZlQWxsUGFnZXMoKSB7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fUGFnZVB0ckFycmF5LkdldFNpemUoKTsgaSsrKQotICAgIGRlbGV0ZSBtX1BhZ2VQdHJBcnJheVtpXTsKLSAgbV9QYWdlUHRyQXJyYXkuUmVtb3ZlQWxsKCk7Ci19Ci0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlVwZGF0ZVBhcmFncygpIHsKLSAgaW50MzJfdCBuQ291bnQgPSBtX1BhcmFnUHRyQXJyYXkuR2V0U2l6ZSgpOwotICBpZiAobkNvdW50ID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ0ZERV9UeHRFZHRQYXJhZyogcFBhcmFnID0gbnVsbHB0cjsKLSAgaW50MzJfdCBuTGluZUNvdW50ID0gMDsKLSAgaW50MzJfdCBpID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7Ci0gICAgcFBhcmFnID0gbV9QYXJhZ1B0ckFycmF5W2ldOwotICAgIGlmIChwUGFyYWctPkdldExpbmVDb3VudCgpID09IC0xKQotICAgICAgcFBhcmFnLT5DYWxjTGluZXMoKTsKLQotICAgIG5MaW5lQ291bnQgKz0gcFBhcmFnLT5HZXRMaW5lQ291bnQoKTsKLSAgfQotICBtX25MaW5lQ291bnQgPSBuTGluZUNvdW50OwotfQotCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpVcGRhdGVQYWdlcygpIHsKLSAgaWYgKG1fbkxpbmVDb3VudCA9PSAwKQotICAgIHJldHVybjsKLQotICBpbnQzMl90IG5QYWdlQ291bnQgPSAobV9uTGluZUNvdW50IC0gMSkgLyAobV9uUGFnZUxpbmVDb3VudCkgKyAxOwotICBpbnQzMl90IG5TaXplID0gbV9QYWdlUHRyQXJyYXkuR2V0U2l6ZSgpOwotICBpZiAoblNpemUgPT0gblBhZ2VDb3VudCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKG5TaXplID4gblBhZ2VDb3VudCkgewotICAgIGZvciAoaW50MzJfdCBpID0gblNpemUgLSAxOyBpID49IG5QYWdlQ291bnQ7IGktLSkgewotICAgICAgZGVsZXRlIG1fUGFnZVB0ckFycmF5W2ldOwotICAgICAgbV9QYWdlUHRyQXJyYXkuUmVtb3ZlQXQoaSk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotICBpZiAoblNpemUgPCBuUGFnZUNvdW50KSB7Ci0gICAgZm9yIChpbnQzMl90IGkgPSBuU2l6ZTsgaSA8IG5QYWdlQ291bnQ7IGkrKykKLSAgICAgIG1fUGFnZVB0ckFycmF5LkFkZChJRkRFX1R4dEVkdFBhZ2U6OkNyZWF0ZSh0aGlzLCBpKSk7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlVwZGF0ZVR4dEJyZWFrKCkgewotICB1aW50MzJfdCBkd1N0eWxlID0gbV9wVGV4dEJyZWFrLT5HZXRMYXlvdXRTdHlsZXMoKTsKLSAgaWYgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9NdWx0aUxpbmVzKSB7Ci0gICAgZHdTdHlsZSAmPSB+RlhfVFhUTEFZT1VUU1RZTEVfU2luZ2xlTGluZTsKLSAgfSBlbHNlIHsKLSAgICBkd1N0eWxlIHw9IEZYX1RYVExBWU9VVFNUWUxFX1NpbmdsZUxpbmU7Ci0gIH0KLSAgZHdTdHlsZSAmPSB+RlhfVFhUTEFZT1VUU1RZTEVfVmVydGljYWxMYXlvdXQ7Ci0gIGR3U3R5bGUgJj0gfkZYX1RYVExBWU9VVFNUWUxFX1JldmVyc2VMaW5lOwotICBkd1N0eWxlICY9IH5GWF9UWFRMQVlPVVRTVFlMRV9SVExSZWFkaW5nT3JkZXI7Ci0KLSAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfQ29tYlRleHQpIHsKLSAgICBkd1N0eWxlIHw9IEZYX1RYVExBWU9VVFNUWUxFX0NvbWJUZXh0OwotICB9IGVsc2UgewotICAgIGR3U3R5bGUgJj0gfkZYX1RYVExBWU9VVFNUWUxFX0NvbWJUZXh0OwotICB9Ci0KLSAgZHdTdHlsZSAmPSB+RlhfVFhUTEFZT1VUU1RZTEVfVmVydGljYWxDaGFyczsKLSAgZHdTdHlsZSAmPSB+RlhfVFhUTEFZT1VUU1RZTEVfRXhwYW5kVGFiOwotICBkd1N0eWxlICY9IH5GWF9UWFRMQVlPVVRTVFlMRV9BcmFiaWNDb250ZXh0OwotICBkd1N0eWxlICY9IH5GWF9UWFRMQVlPVVRTVFlMRV9BcmFiaWNTaGFwZXM7Ci0KLSAgbV9wVGV4dEJyZWFrLT5TZXRMYXlvdXRTdHlsZXMoZHdTdHlsZSk7Ci0gIHVpbnQzMl90IGR3QWxpZ21lbnQgPSAwOwotICBpZiAobV9QYXJhbS5kd0FsaWdubWVudCAmIEZERV9URVhURURJVEFMSUdOX0p1c3RpZmllZCkgewotICAgIGR3QWxpZ21lbnQgfD0gRlhfVFhUTElORUFMSUdOTUVOVF9KdXN0aWZpZWQ7Ci0gIH0KLSAgaWYgKG1fUGFyYW0uZHdBbGlnbm1lbnQgJiBGREVfVEVYVEVESVRBTElHTl9DZW50ZXIpIHsKLSAgICBkd0FsaWdtZW50IHw9IEZYX1RYVExJTkVBTElHTk1FTlRfQ2VudGVyOwotICB9IGVsc2UgaWYgKG1fUGFyYW0uZHdBbGlnbm1lbnQgJiBGREVfVEVYVEVESVRBTElHTl9SaWdodCkgewotICAgIGR3QWxpZ21lbnQgfD0gRlhfVFhUTElORUFMSUdOTUVOVF9SaWdodDsKLSAgfQotICBtX3BUZXh0QnJlYWstPlNldEFsaWdubWVudChkd0FsaWdtZW50KTsKLQotICBpZiAobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX0F1dG9MaW5lV3JhcCkgewotICAgIG1fcFRleHRCcmVhay0+U2V0TGluZVdpZHRoKG1fUGFyYW0uZlBsYXRlV2lkdGgpOwotICB9IGVsc2UgewotICAgIG1fcFRleHRCcmVhay0+U2V0TGluZVdpZHRoKGtQYWdlV2lkdGhNYXgpOwotICB9Ci0KLSAgbV9uUGFnZUxpbmVDb3VudCA9IG1fUGFyYW0ubkxpbmVDb3VudDsKLSAgaWYgKG1fUGFyYW0uZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfQ29tYlRleHQpIHsKLSAgICBGWF9GTE9BVCBmQ29tYldpZHRoID0gbV9QYXJhbS5mUGxhdGVXaWR0aDsKLSAgICBpZiAobV9uTGltaXQgPiAwKSB7Ci0gICAgICBmQ29tYldpZHRoIC89IG1fbkxpbWl0OwotICAgIH0KLSAgICBtX3BUZXh0QnJlYWstPlNldENvbWJXaWR0aChmQ29tYldpZHRoKTsKLSAgfQotICBtX3BUZXh0QnJlYWstPlNldEZvbnQobV9QYXJhbS5wRm9udCk7Ci0gIG1fcFRleHRCcmVhay0+U2V0Rm9udFNpemUobV9QYXJhbS5mRm9udFNpemUpOwotICBtX3BUZXh0QnJlYWstPlNldFRhYldpZHRoKG1fUGFyYW0uZlRhYldpZHRoLCBtX1BhcmFtLmJUYWJFcXVpZGlzdGFudCk7Ci0gIG1fcFRleHRCcmVhay0+U2V0RGVmYXVsdENoYXIobV9QYXJhbS53RGVmQ2hhcik7Ci0gIG1fcFRleHRCcmVhay0+U2V0UGFyYWdyYXBoQnJlYWtDaGFyKG1fUGFyYW0ud0xpbmVCcmVha0NoYXIpOwotICBtX3BUZXh0QnJlYWstPlNldENoYXJSb3RhdGlvbihtX1BhcmFtLm5DaGFyUm90YXRpb24pOwotICBtX3BUZXh0QnJlYWstPlNldExpbmVCcmVha1RvbGVyYW5jZShtX1BhcmFtLmZGb250U2l6ZSAqIDAuMmYpOwotICBtX3BUZXh0QnJlYWstPlNldEhvcml6b250YWxTY2FsZShtX1BhcmFtLm5Ib3J6U2NhbGUpOwotICBtX3BUZXh0QnJlYWstPlNldENoYXJTcGFjZShtX1BhcmFtLmZDaGFyU3BhY2UpOwotfQotCi1ib29sIENGREVfVHh0RWR0RW5naW5lOjpSZXBsYWNlUGFyYWdFbmQoRlhfV0NIQVIqJiBscFRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgbkxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJQcmVJc0NSKSB7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5MZW5ndGg7IGkrKykgewotICAgIEZYX1dDSEFSIHdjID0gbHBUZXh0W2ldOwotICAgIHN3aXRjaCAod2MpIHsKLSAgICAgIGNhc2UgTCdccic6IHsKLSAgICAgICAgbHBUZXh0W2ldID0gbV93TGluZUVuZDsKLSAgICAgICAgYlByZUlzQ1IgPSB0cnVlOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgTCdcbic6IHsKLSAgICAgICAgaWYgKGJQcmVJc0NSID09IHRydWUpIHsKLSAgICAgICAgICBpbnQzMl90IG5OZXh0ID0gaSArIDE7Ci0gICAgICAgICAgaWYgKG5OZXh0IDwgbkxlbmd0aCkgewotICAgICAgICAgICAgRlhTWVNfbWVtbW92ZShscFRleHQgKyBpLCBscFRleHQgKyBuTmV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKG5MZW5ndGggLSBuTmV4dCkgKiBzaXplb2YoRlhfV0NIQVIpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaS0tOwotICAgICAgICAgIG5MZW5ndGgtLTsKLSAgICAgICAgICBiUHJlSXNDUiA9IGZhbHNlOwotICAgICAgICAgIGlmIChtX2JBdXRvTGluZUVuZCkgewotICAgICAgICAgICAgbV9uRmlyc3RMaW5lRW5kID0gRkRFX1RYVEVESVRfTElORUVORF9DUkxGOwotICAgICAgICAgICAgbV9iQXV0b0xpbmVFbmQgPSBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbHBUZXh0W2ldID0gbV93TGluZUVuZDsKLSAgICAgICAgICBpZiAobV9iQXV0b0xpbmVFbmQpIHsKLSAgICAgICAgICAgIG1fbkZpcnN0TGluZUVuZCA9IEZERV9UWFRFRElUX0xJTkVFTkRfTEY7Ci0gICAgICAgICAgICBtX2JBdXRvTGluZUVuZCA9IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgaWYgKGJQcmVJc0NSICYmIG1fYkF1dG9MaW5lRW5kKSB7Ci0gICAgICAgICAgbV9uRmlyc3RMaW5lRW5kID0gRkRFX1RYVEVESVRfTElORUVORF9DUjsKLSAgICAgICAgICBtX2JBdXRvTGluZUVuZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGJQcmVJc0NSID0gZmFsc2U7Ci0gICAgICB9IGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gYlByZUlzQ1I7Ci19Ci0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlJlY292ZXJQYXJhZ0VuZChDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSBjb25zdCB7Ci0gIEZYX1dDSEFSIHdjID0gKG1fbkZpcnN0TGluZUVuZCA9PSBGREVfVFhURURJVF9MSU5FRU5EX0NSKSA/IEwnXG4nIDogTCdccic7Ci0gIGlmIChtX25GaXJzdExpbmVFbmQgPT0gRkRFX1RYVEVESVRfTElORUVORF9DUkxGKSB7Ci0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4gUG9zQXJyOwotICAgIGludDMyX3Qgbkxlbmd0aCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsKLSAgICBpbnQzMl90IGkgPSAwOwotICAgIEZYX1dDSEFSKiBscFBvcyA9IGNvbnN0X2Nhc3Q8RlhfV0NIQVIqPih3c1RleHQuY19zdHIoKSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5MZW5ndGg7IGkrKywgbHBQb3MrKykgewotICAgICAgaWYgKCpscFBvcyA9PSBtX3dMaW5lRW5kKSB7Ci0gICAgICAgICpscFBvcyA9IHdjOwotICAgICAgICBQb3NBcnIuQWRkKGkpOwotICAgICAgfQotICAgIH0KLSAgICBjb25zdCBGWF9XQ0hBUiogbHBTcmNCdWYgPSB3c1RleHQuY19zdHIoKTsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7Ci0gICAgaW50MzJfdCBuQ291bnQgPSBQb3NBcnIuR2V0U2l6ZSgpOwotICAgIEZYX1dDSEFSKiBscERzdEJ1ZiA9IHdzVGVtcC5HZXRCdWZmZXIobkxlbmd0aCArIG5Db3VudCk7Ci0gICAgaW50MzJfdCBuRHN0UG9zID0gMDsKLSAgICBpbnQzMl90IG5TcmNQb3MgPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgewotICAgICAgaW50MzJfdCBuUG9zID0gUG9zQXJyW2ldOwotICAgICAgaW50MzJfdCBuQ29weUxlbiA9IG5Qb3MgLSBuU3JjUG9zICsgMTsKLSAgICAgIEZYU1lTX21lbWNweShscERzdEJ1ZiArIG5Ec3RQb3MsIGxwU3JjQnVmICsgblNyY1BvcywKLSAgICAgICAgICAgICAgICAgICBuQ29weUxlbiAqIHNpemVvZihGWF9XQ0hBUikpOwotICAgICAgbkRzdFBvcyArPSBuQ29weUxlbjsKLSAgICAgIG5TcmNQb3MgKz0gbkNvcHlMZW47Ci0gICAgICBscERzdEJ1ZltuRHN0UG9zXSA9IEwnXG4nOwotICAgICAgbkRzdFBvcysrOwotICAgIH0KLSAgICBpZiAoblNyY1BvcyA8IG5MZW5ndGgpIHsKLSAgICAgIEZYU1lTX21lbWNweShscERzdEJ1ZiArIG5Ec3RQb3MsIGxwU3JjQnVmICsgblNyY1BvcywKLSAgICAgICAgICAgICAgICAgICAobkxlbmd0aCAtIG5TcmNQb3MpICogc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gICAgfQotICAgIHdzVGVtcC5SZWxlYXNlQnVmZmVyKG5MZW5ndGggKyBuQ291bnQpOwotICAgIHdzVGV4dCA9IHdzVGVtcDsKLSAgfSBlbHNlIHsKLSAgICBpbnQzMl90IG5MZW5ndGggPSB3c1RleHQuR2V0TGVuZ3RoKCk7Ci0gICAgRlhfV0NIQVIqIGxwQnVmID0gY29uc3RfY2FzdDxGWF9XQ0hBUio+KHdzVGV4dC5jX3N0cigpKTsKLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuTGVuZ3RoOyBpKyssIGxwQnVmKyspIHsKLSAgICAgIGlmICgqbHBCdWYgPT0gbV93TGluZUVuZCkKLSAgICAgICAgKmxwQnVmID0gd2M7Ci0gICAgfQotICB9Ci19Ci0KLWludDMyX3QgQ0ZERV9UeHRFZHRFbmdpbmU6Ok1vdmVQYWdlMkNoYXIoaW50MzJfdCBuSW5kZXgpIHsKLSAgQVNTRVJUKG5JbmRleCA+PSAwKTsKLSAgQVNTRVJUKG5JbmRleCA8PSBtX3BUeHRCdWYtPkdldFRleHRMZW5ndGgoKSk7Ci0gIGlmIChtX25DYXJldFBhZ2UgPj0gMCkgewotICAgIElGREVfVHh0RWR0UGFnZSogcFBhZ2UgPSBtX1BhZ2VQdHJBcnJheVttX25DYXJldFBhZ2VdOwotICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25QYWdlTG9hZChtX25DYXJldFBhZ2UpOwotICAgIGludDMyX3QgblBhZ2VDaGFyU3RhcnQgPSBwUGFnZS0+R2V0Q2hhclN0YXJ0KCk7Ci0gICAgaW50MzJfdCBuUGFnZUNoYXJDb3VudCA9IHBQYWdlLT5HZXRDaGFyQ291bnQoKTsKLSAgICBpZiAobkluZGV4ID49IG5QYWdlQ2hhclN0YXJ0ICYmIG5JbmRleCA8IG5QYWdlQ2hhclN0YXJ0ICsgblBhZ2VDaGFyQ291bnQpIHsKLSAgICAgIG1fUGFyYW0ucEV2ZW50U2luay0+T25QYWdlVW5sb2FkKG1fbkNhcmV0UGFnZSk7Ci0gICAgICByZXR1cm4gbV9uQ2FyZXRQYWdlOwotICAgIH0KLSAgICBtX1BhcmFtLnBFdmVudFNpbmstPk9uUGFnZVVubG9hZChtX25DYXJldFBhZ2UpOwotICB9Ci0gIENGREVfVHh0RWR0UGFyYWcqIHBQYXJhZyA9IG51bGxwdHI7Ci0gIGludDMyX3QgbkxpbmVDb3VudCA9IDA7Ci0gIGludDMyX3QgblBhcmFnQ291bnQgPSBtX1BhcmFnUHRyQXJyYXkuR2V0U2l6ZSgpOwotICBpbnQzMl90IGkgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgblBhcmFnQ291bnQ7IGkrKykgewotICAgIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtpXTsKLSAgICBpZiAocFBhcmFnLT5HZXRTdGFydEluZGV4KCkgPD0gbkluZGV4ICYmCi0gICAgICAgIG5JbmRleCA8IChwUGFyYWctPkdldFN0YXJ0SW5kZXgoKSArIHBQYXJhZy0+R2V0VGV4dExlbmd0aCgpKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIG5MaW5lQ291bnQgKz0gcFBhcmFnLT5HZXRMaW5lQ291bnQoKTsKLSAgfQotICBwUGFyYWctPkxvYWRQYXJhZygpOwotICBpbnQzMl90IG5MaW5lU3RhcnQgPSAtMTsKLSAgaW50MzJfdCBuTGluZUNoYXJDb3VudCA9IC0xOwotICBmb3IgKGkgPSAwOyBpIDwgcFBhcmFnLT5HZXRMaW5lQ291bnQoKTsgaSsrKSB7Ci0gICAgcFBhcmFnLT5HZXRMaW5lUmFuZ2UoaSwgbkxpbmVTdGFydCwgbkxpbmVDaGFyQ291bnQpOwotICAgIGlmIChuTGluZVN0YXJ0IDw9IG5JbmRleCAmJiBuSW5kZXggPCAobkxpbmVTdGFydCArIG5MaW5lQ2hhckNvdW50KSkKLSAgICAgIGJyZWFrOwotICB9Ci0gIEFTU0VSVChpIDwgcFBhcmFnLT5HZXRMaW5lQ291bnQoKSk7Ci0gIG5MaW5lQ291bnQgKz0gKGkgKyAxKTsKLSAgbV9uQ2FyZXRQYWdlID0gKG5MaW5lQ291bnQgLSAxKSAvIG1fblBhZ2VMaW5lQ291bnQgKyAxIC0gMTsKLSAgcFBhcmFnLT5VbmxvYWRQYXJhZygpOwotICByZXR1cm4gbV9uQ2FyZXRQYWdlOwotfQotCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpUZXh0UG9zMlBhcmFnUG9zKGludDMyX3QgbkluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfVFhURURUUEFSQUdQT1MmIFBhcmFnUG9zKSBjb25zdCB7Ci0gIEFTU0VSVChuSW5kZXggPj0gMCAmJiBuSW5kZXggPCBtX3BUeHRCdWYtPkdldFRleHRMZW5ndGgoKSk7Ci0gIGludDMyX3QgbkNvdW50ID0gbV9QYXJhZ1B0ckFycmF5LkdldFNpemUoKTsKLSAgaW50MzJfdCBuQmduID0gMDsKLSAgaW50MzJfdCBuTWlkID0gMDsKLSAgaW50MzJfdCBuRW5kID0gbkNvdW50IC0gMTsKLSAgd2hpbGUgKG5FbmQgPiBuQmduKSB7Ci0gICAgbk1pZCA9IChuQmduICsgbkVuZCkgLyAyOwotICAgIENGREVfVHh0RWR0UGFyYWcqIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtuTWlkXTsKLSAgICBpZiAobkluZGV4IDwgcFBhcmFnLT5HZXRTdGFydEluZGV4KCkpCi0gICAgICBuRW5kID0gbk1pZCAtIDE7Ci0gICAgZWxzZSBpZiAobkluZGV4ID49IChwUGFyYWctPkdldFN0YXJ0SW5kZXgoKSArIHBQYXJhZy0+R2V0VGV4dExlbmd0aCgpKSkKLSAgICAgIG5CZ24gPSBuTWlkICsgMTsKLSAgICBlbHNlCi0gICAgICBicmVhazsKLSAgfQotICBpZiAobkJnbiA9PSBuRW5kKQotICAgIG5NaWQgPSBuQmduOwotCi0gIEFTU0VSVChuSW5kZXggPj0gbV9QYXJhZ1B0ckFycmF5W25NaWRdLT5HZXRTdGFydEluZGV4KCkgJiYKLSAgICAgICAgIChuSW5kZXggPCBtX1BhcmFnUHRyQXJyYXlbbk1pZF0tPkdldFN0YXJ0SW5kZXgoKSArCi0gICAgICAgICAgICAgICAgICAgICAgIG1fUGFyYWdQdHJBcnJheVtuTWlkXS0+R2V0VGV4dExlbmd0aCgpKSk7Ci0gIFBhcmFnUG9zLm5QYXJhZ0luZGV4ID0gbk1pZDsKLSAgUGFyYWdQb3MubkNoYXJJbmRleCA9IG5JbmRleCAtIG1fUGFyYWdQdHJBcnJheVtuTWlkXS0+R2V0U3RhcnRJbmRleCgpOwotfQotCi1pbnQzMl90IENGREVfVHh0RWR0RW5naW5lOjpNb3ZlRm9yd2FyZChib29sJiBiQmVmb3JlKSB7Ci0gIGlmIChtX25DYXJldCA9PSBtX3BUeHRCdWYtPkdldFRleHRMZW5ndGgoKSAtIDEpCi0gICAgcmV0dXJuIC0xOwotCi0gIGludDMyX3QgbkNhcmV0ID0gbV9uQ2FyZXQ7Ci0gIGlmICgobkNhcmV0ICsgMSA8IG1fcFR4dEJ1Zi0+R2V0VGV4dExlbmd0aCgpKSAmJgotICAgICAgKG1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgobkNhcmV0KSA9PSBMJ1xyJykgJiYKLSAgICAgIChtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5DYXJldCArIDEpID09IEwnXG4nKSkgewotICAgIG5DYXJldCsrOwotICB9Ci0gIG5DYXJldCsrOwotICBiQmVmb3JlID0gdHJ1ZTsKLSAgcmV0dXJuIG5DYXJldDsKLX0KLQotaW50MzJfdCBDRkRFX1R4dEVkdEVuZ2luZTo6TW92ZUJhY2t3YXJkKGJvb2wmIGJCZWZvcmUpIHsKLSAgaWYgKG1fbkNhcmV0ID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGludDMyX3QgbkNhcmV0ID0gbV9uQ2FyZXQ7Ci0gIGlmIChuQ2FyZXQgPiAyICYmIG1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgobkNhcmV0IC0gMSkgPT0gTCdcbicgJiYKLSAgICAgIG1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgobkNhcmV0IC0gMikgPT0gTCdccicpIHsKLSAgICBuQ2FyZXQtLTsKLSAgfQotICBuQ2FyZXQtLTsKLSAgYkJlZm9yZSA9IHRydWU7Ci0gIHJldHVybiBuQ2FyZXQ7Ci19Ci0KLWJvb2wgQ0ZERV9UeHRFZHRFbmdpbmU6Ok1vdmVVcChDRlhfUG9pbnRGJiBwdENhcmV0KSB7Ci0gIElGREVfVHh0RWR0UGFnZSogcFBhZ2UgPSBHZXRQYWdlKG1fbkNhcmV0UGFnZSk7Ci0gIGNvbnN0IENGWF9SZWN0RiYgcnRDb250ZW50ID0gcFBhZ2UtPkdldENvbnRlbnRzQm94KCk7Ci0gIHB0Q2FyZXQueCA9IG1fZkNhcmV0UG9zUmVzZXJ2ZTsKLSAgcHRDYXJldC55ID0gbV9ydENhcmV0LnRvcCArIG1fcnRDYXJldC5oZWlnaHQgLyAyIC0gbV9QYXJhbS5mTGluZVNwYWNlOwotICBpZiAocHRDYXJldC55IDwgcnRDb250ZW50LnRvcCkgewotICAgIGlmIChtX25DYXJldFBhZ2UgPT0gMCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBwdENhcmV0LnkgLT0gcnRDb250ZW50LnRvcDsKLSAgICBtX25DYXJldFBhZ2UtLTsKLSAgICBJRkRFX1R4dEVkdFBhZ2UqIHBDdXJQYWdlID0gR2V0UGFnZShtX25DYXJldFBhZ2UpOwotICAgIHB0Q2FyZXQueSArPSBwQ3VyUGFnZS0+R2V0Q29udGVudHNCb3goKS5ib3R0b20oKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENGREVfVHh0RWR0RW5naW5lOjpNb3ZlRG93bihDRlhfUG9pbnRGJiBwdENhcmV0KSB7Ci0gIElGREVfVHh0RWR0UGFnZSogcFBhZ2UgPSBHZXRQYWdlKG1fbkNhcmV0UGFnZSk7Ci0gIGNvbnN0IENGWF9SZWN0RiYgcnRDb250ZW50ID0gcFBhZ2UtPkdldENvbnRlbnRzQm94KCk7Ci0gIHB0Q2FyZXQueCA9IG1fZkNhcmV0UG9zUmVzZXJ2ZTsKLSAgcHRDYXJldC55ID0gbV9ydENhcmV0LnRvcCArIG1fcnRDYXJldC5oZWlnaHQgLyAyICsgbV9QYXJhbS5mTGluZVNwYWNlOwotICBpZiAocHRDYXJldC55ID49IHJ0Q29udGVudC5ib3R0b20oKSkgewotICAgIGlmIChtX25DYXJldFBhZ2UgPT0gQ291bnRQYWdlcygpIC0gMSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBwdENhcmV0LnkgLT0gcnRDb250ZW50LmJvdHRvbSgpOwotICAgIG1fbkNhcmV0UGFnZSsrOwotICAgIElGREVfVHh0RWR0UGFnZSogcEN1clBhZ2UgPSBHZXRQYWdlKG1fbkNhcmV0UGFnZSk7Ci0gICAgcHRDYXJldC55ICs9IHBDdXJQYWdlLT5HZXRDb250ZW50c0JveCgpLnRvcDsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDRkRFX1R4dEVkdEVuZ2luZTo6TW92ZUxpbmVTdGFydCgpIHsKLSAgaW50MzJfdCBuSW5kZXggPSBtX2JCZWZvcmUgPyBtX25DYXJldCA6IG1fbkNhcmV0IC0gMTsKLSAgRkRFX1RYVEVEVFBBUkFHUE9TIFBhcmFnUG9zOwotICBUZXh0UG9zMlBhcmFnUG9zKG5JbmRleCwgUGFyYWdQb3MpOwotICBDRkRFX1R4dEVkdFBhcmFnKiBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbUGFyYWdQb3MublBhcmFnSW5kZXhdOwotICBwUGFyYWctPkxvYWRQYXJhZygpOwotICBpbnQzMl90IG5MaW5lQ291bnQgPSBwUGFyYWctPkdldExpbmVDb3VudCgpOwotICBpbnQzMl90IGkgPSAwOwotICBpbnQzMl90IG5TdGFydCA9IDA7Ci0gIGludDMyX3QgbkNvdW50ID0gMDsKLSAgZm9yICg7IGkgPCBuTGluZUNvdW50OyBpKyspIHsKLSAgICBwUGFyYWctPkdldExpbmVSYW5nZShpLCBuU3RhcnQsIG5Db3VudCk7Ci0gICAgaWYgKG5JbmRleCA+PSBuU3RhcnQgJiYgbkluZGV4IDwgblN0YXJ0ICsgbkNvdW50KSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgVXBkYXRlQ2FyZXRSZWN0KG5TdGFydCwgdHJ1ZSk7Ci0gIHBQYXJhZy0+VW5sb2FkUGFyYWcoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0ZERV9UeHRFZHRFbmdpbmU6Ok1vdmVMaW5lRW5kKCkgewotICBpbnQzMl90IG5JbmRleCA9IG1fYkJlZm9yZSA/IG1fbkNhcmV0IDogbV9uQ2FyZXQgLSAxOwotICBGREVfVFhURURUUEFSQUdQT1MgUGFyYWdQb3M7Ci0gIFRleHRQb3MyUGFyYWdQb3MobkluZGV4LCBQYXJhZ1Bvcyk7Ci0gIENGREVfVHh0RWR0UGFyYWcqIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtQYXJhZ1Bvcy5uUGFyYWdJbmRleF07Ci0gIHBQYXJhZy0+TG9hZFBhcmFnKCk7Ci0gIGludDMyX3QgbkxpbmVDb3VudCA9IHBQYXJhZy0+R2V0TGluZUNvdW50KCk7Ci0gIGludDMyX3QgaSA9IDA7Ci0gIGludDMyX3QgblN0YXJ0ID0gMDsKLSAgaW50MzJfdCBuQ291bnQgPSAwOwotICBmb3IgKDsgaSA8IG5MaW5lQ291bnQ7IGkrKykgewotICAgIHBQYXJhZy0+R2V0TGluZVJhbmdlKGksIG5TdGFydCwgbkNvdW50KTsKLSAgICBpZiAobkluZGV4ID49IG5TdGFydCAmJiBuSW5kZXggPCBuU3RhcnQgKyBuQ291bnQpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBuSW5kZXggPSBuU3RhcnQgKyBuQ291bnQgLSAxOwotICBBU1NFUlQobkluZGV4IDw9IEdldFRleHRCdWZMZW5ndGgoKSk7Ci0gIEZYX1dDSEFSIHdDaGFyID0gbV9wVHh0QnVmLT5HZXRDaGFyQnlJbmRleChuSW5kZXgpOwotICBib29sIGJCZWZvcmUgPSBmYWxzZTsKLSAgaWYgKG5JbmRleCA8PSBHZXRUZXh0QnVmTGVuZ3RoKCkpIHsKLSAgICBpZiAod0NoYXIgPT0gTCdccicpIHsKLSAgICAgIGJCZWZvcmUgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAod0NoYXIgPT0gTCdcbicgJiYgbkluZGV4ID4gblN0YXJ0KSB7Ci0gICAgICBiQmVmb3JlID0gdHJ1ZTsKLSAgICAgIG5JbmRleC0tOwotICAgICAgd0NoYXIgPSBtX3BUeHRCdWYtPkdldENoYXJCeUluZGV4KG5JbmRleCk7Ci0gICAgICBpZiAod0NoYXIgIT0gTCdccicpIHsKLSAgICAgICAgbkluZGV4Kys7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIFVwZGF0ZUNhcmV0UmVjdChuSW5kZXgsIGJCZWZvcmUpOwotICBwUGFyYWctPlVubG9hZFBhcmFnKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENGREVfVHh0RWR0RW5naW5lOjpNb3ZlUGFyYWdTdGFydCgpIHsKLSAgaW50MzJfdCBuSW5kZXggPSBtX2JCZWZvcmUgPyBtX25DYXJldCA6IG1fbkNhcmV0IC0gMTsKLSAgRkRFX1RYVEVEVFBBUkFHUE9TIFBhcmFnUG9zOwotICBUZXh0UG9zMlBhcmFnUG9zKG5JbmRleCwgUGFyYWdQb3MpOwotICBDRkRFX1R4dEVkdFBhcmFnKiBwUGFyYWcgPSBtX1BhcmFnUHRyQXJyYXlbUGFyYWdQb3MublBhcmFnSW5kZXhdOwotICBVcGRhdGVDYXJldFJlY3QocFBhcmFnLT5HZXRTdGFydEluZGV4KCksIHRydWUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDRkRFX1R4dEVkdEVuZ2luZTo6TW92ZVBhcmFnRW5kKCkgewotICBpbnQzMl90IG5JbmRleCA9IG1fYkJlZm9yZSA/IG1fbkNhcmV0IDogbV9uQ2FyZXQgLSAxOwotICBGREVfVFhURURUUEFSQUdQT1MgUGFyYWdQb3M7Ci0gIFRleHRQb3MyUGFyYWdQb3MobkluZGV4LCBQYXJhZ1Bvcyk7Ci0gIENGREVfVHh0RWR0UGFyYWcqIHBQYXJhZyA9IG1fUGFyYWdQdHJBcnJheVtQYXJhZ1Bvcy5uUGFyYWdJbmRleF07Ci0gIG5JbmRleCA9IHBQYXJhZy0+R2V0U3RhcnRJbmRleCgpICsgcFBhcmFnLT5HZXRUZXh0TGVuZ3RoKCkgLSAxOwotICBGWF9XQ0hBUiB3Q2hhciA9IG1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgobkluZGV4KTsKLSAgaWYgKHdDaGFyID09IEwnXG4nICYmIG5JbmRleCA+IDApIHsKLSAgICBuSW5kZXgtLTsKLSAgICB3Q2hhciA9IG1fcFR4dEJ1Zi0+R2V0Q2hhckJ5SW5kZXgobkluZGV4KTsKLSAgICBpZiAod0NoYXIgIT0gTCdccicpIHsKLSAgICAgIG5JbmRleCsrOwotICAgIH0KLSAgfQotICBVcGRhdGVDYXJldFJlY3QobkluZGV4LCB0cnVlKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0ZERV9UeHRFZHRFbmdpbmU6Ok1vdmVIb21lKCkgewotICBVcGRhdGVDYXJldFJlY3QoMCwgdHJ1ZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENGREVfVHh0RWR0RW5naW5lOjpNb3ZlRW5kKCkgewotICBVcGRhdGVDYXJldFJlY3QoR2V0VGV4dEJ1Zkxlbmd0aCgpLCB0cnVlKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0ZERV9UeHRFZHRFbmdpbmU6OklzRml0QXJlYShDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRkRFX1RleHRPdXQ+IHBUZXh0T3V0KG5ldyBDRkRFX1RleHRPdXQpOwotICBwVGV4dE91dC0+U2V0TGluZVNwYWNlKG1fUGFyYW0uZkxpbmVTcGFjZSk7Ci0gIHBUZXh0T3V0LT5TZXRGb250KG1fUGFyYW0ucEZvbnQpOwotICBwVGV4dE91dC0+U2V0Rm9udFNpemUobV9QYXJhbS5mRm9udFNpemUpOwotICB1aW50MzJfdCBkd1N0eWxlID0gMDsKLSAgaWYgKCEobV9QYXJhbS5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX011bHRpTGluZXMpKQotICAgIGR3U3R5bGUgfD0gRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7Ci0KLSAgQ0ZYX1JlY3RGIHJjVGV4dDsKLSAgaWYgKG1fUGFyYW0uZHdNb2RlICYgRkRFX1RFWFRFRElUTU9ERV9BdXRvTGluZVdyYXApIHsKLSAgICBkd1N0eWxlIHw9IEZERV9UVE9TVFlMRV9MaW5lV3JhcDsKLSAgICByY1RleHQud2lkdGggPSBtX1BhcmFtLmZQbGF0ZVdpZHRoOwotICB9IGVsc2UgewotICAgIHJjVGV4dC53aWR0aCA9IDY1NTM1OwotICB9Ci0gIHBUZXh0T3V0LT5TZXRTdHlsZXMoZHdTdHlsZSk7Ci0gIHdzVGV4dCArPSBMIlxuIjsKLSAgcFRleHRPdXQtPkNhbGNMb2dpY1NpemUod3NUZXh0LmNfc3RyKCksIHdzVGV4dC5HZXRMZW5ndGgoKSwgcmNUZXh0KTsKLSAgd3NUZXh0LkRlbGV0ZSh3c1RleHQuR2V0TGVuZ3RoKCkgLSAxKTsKLSAgaWYgKChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTGltaXRBcmVhX0hvcnopICYmCi0gICAgICAocmNUZXh0LndpZHRoID4gbV9QYXJhbS5mUGxhdGVXaWR0aCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKChtX1BhcmFtLmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfTGltaXRBcmVhX1ZlcnQpICYmCi0gICAgICAocmNUZXh0LmhlaWdodCA+IG1fUGFyYW0uZkxpbmVTcGFjZSAqIG1fUGFyYW0ubkxpbmVDb3VudCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ0ZERV9UeHRFZHRFbmdpbmU6OlVwZGF0ZUNhcmV0UmVjdChpbnQzMl90IG5JbmRleCwgYm9vbCBiQmVmb3JlKSB7Ci0gIE1vdmVQYWdlMkNoYXIobkluZGV4KTsKLSAgR2V0Q2FyZXRSZWN0KG1fcnRDYXJldCwgbV9uQ2FyZXRQYWdlLCBuSW5kZXgsIGJCZWZvcmUpOwotICBtX25DYXJldCA9IG5JbmRleDsKLSAgbV9iQmVmb3JlID0gYkJlZm9yZTsKLSAgaWYgKCFtX2JCZWZvcmUpIHsKLSAgICBtX25DYXJldCsrOwotICAgIG1fYkJlZm9yZSA9IHRydWU7Ci0gIH0KLSAgbV9mQ2FyZXRQb3NSZXNlcnZlID0gbV9ydENhcmV0LmxlZnQ7Ci0gIG1fUGFyYW0ucEV2ZW50U2luay0+T25DYXJldENoYW5nZWQoKTsKLX0KLQotdm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6R2V0Q2FyZXRSZWN0KENGWF9SZWN0RiYgcnRDYXJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5QYWdlSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuQ2FyZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQmVmb3JlKSB7Ci0gIElGREVfVHh0RWR0UGFnZSogcFBhZ2UgPSBtX1BhZ2VQdHJBcnJheVttX25DYXJldFBhZ2VdOwotICBtX1BhcmFtLnBFdmVudFNpbmstPk9uUGFnZUxvYWQobV9uQ2FyZXRQYWdlKTsKLSAgYm9vbCBiQ29tYlRleHQgPSAhIShtX1BhcmFtLmR3TGF5b3V0U3R5bGVzICYgRkRFX1RFWFRFRElUTEFZT1VUX0NvbWJUZXh0KTsKLSAgaW50MzJfdCBuSW5kZXhJbnBhZ2UgPSBuQ2FyZXQgLSBwUGFnZS0+R2V0Q2hhclN0YXJ0KCk7Ci0gIGlmIChiQmVmb3JlICYmIGJDb21iVGV4dCAmJiBuSW5kZXhJbnBhZ2UgPiAwKSB7Ci0gICAgbkluZGV4SW5wYWdlLS07Ci0gICAgYkJlZm9yZSA9IGZhbHNlOwotICB9Ci0gIGludDMyX3QgbkJJRElMZXZlbCA9IHBQYWdlLT5HZXRDaGFyUmVjdChuSW5kZXhJbnBhZ2UsIHJ0Q2FyZXQsIGJDb21iVGV4dCk7Ci0gIGlmICgoIUZYX0lzT2RkKG5CSURJTGV2ZWwpICYmICFiQmVmb3JlKSB8fAotICAgICAgKEZYX0lzT2RkKG5CSURJTGV2ZWwpICYmIGJCZWZvcmUpKSB7Ci0gICAgcnRDYXJldC5PZmZzZXQocnRDYXJldC53aWR0aCAtIDEuMGYsIDApOwotICB9Ci0gIGlmIChydENhcmV0LndpZHRoID09IDAgJiYgcnRDYXJldC5sZWZ0ID4gMS4wZikKLSAgICBydENhcmV0LmxlZnQgLT0gMS4wZjsKLQotICBydENhcmV0LndpZHRoID0gMS4wZjsKLQotICBtX1BhcmFtLnBFdmVudFNpbmstPk9uUGFnZVVubG9hZChtX25DYXJldFBhZ2UpOwotfQotCi12b2lkIENGREVfVHh0RWR0RW5naW5lOjpVcGRhdGVDYXJldEluZGV4KGNvbnN0IENGWF9Qb2ludEYmIHB0Q2FyZXQpIHsKLSAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IG1fUGFnZVB0ckFycmF5W21fbkNhcmV0UGFnZV07Ci0gIG1fUGFyYW0ucEV2ZW50U2luay0+T25QYWdlTG9hZChtX25DYXJldFBhZ2UpOwotICBtX25DYXJldCA9IHBQYWdlLT5HZXRDaGFySW5kZXgocHRDYXJldCwgbV9iQmVmb3JlKTsKLSAgR2V0Q2FyZXRSZWN0KG1fcnRDYXJldCwgbV9uQ2FyZXRQYWdlLCBtX25DYXJldCwgbV9iQmVmb3JlKTsKLSAgaWYgKCFtX2JCZWZvcmUpIHsKLSAgICBtX25DYXJldCsrOwotICAgIG1fYkJlZm9yZSA9IHRydWU7Ci0gIH0KLSAgbV9QYXJhbS5wRXZlbnRTaW5rLT5PbkNhcmV0Q2hhbmdlZCgpOwotICBtX1BhcmFtLnBFdmVudFNpbmstPk9uUGFnZVVubG9hZChtX25DYXJldFBhZ2UpOwotfQotCi1ib29sIENGREVfVHh0RWR0RW5naW5lOjpJc1NlbGVjdCgpIHsKLSAgcmV0dXJuIG1fU2VsUmFuZ2VQdHJBcnIuR2V0U2l6ZSgpID4gMDsKLX0KLQotdm9pZCBDRkRFX1R4dEVkdEVuZ2luZTo6RGVsZXRlU2VsZWN0KCkgewotICBpbnQzMl90IG5Db3VudFJhbmdlID0gQ291bnRTZWxSYW5nZXMoKTsKLSAgaWYgKG5Db3VudFJhbmdlID4gMCkgewotICAgIGludDMyX3QgblNlbFN0YXJ0ID0gMDsKLSAgICB3aGlsZSAobkNvdW50UmFuZ2UgPiAwKSB7Ci0gICAgICBpbnQzMl90IG5TZWxDb3VudCA9IEdldFNlbFJhbmdlKC0tbkNvdW50UmFuZ2UsICZuU2VsU3RhcnQpOwotICAgICAgZGVsZXRlIG1fU2VsUmFuZ2VQdHJBcnJbbkNvdW50UmFuZ2VdOwotICAgICAgbV9TZWxSYW5nZVB0ckFyci5SZW1vdmVBdChuQ291bnRSYW5nZSk7Ci0gICAgICBEZWxldGVSYW5nZV9Eb1JlY29yZChuU2VsU3RhcnQsIG5TZWxDb3VudCwgdHJ1ZSk7Ci0gICAgfQotICAgIENsZWFyU2VsZWN0aW9uKCk7Ci0gICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5PblRleHRDaGFuZ2VkKG1fQ2hhbmdlSW5mbyk7Ci0gICAgbV9QYXJhbS5wRXZlbnRTaW5rLT5PblNlbENoYW5nZWQoKTsKLSAgICBTZXRDYXJldFBvcyhuU2VsU3RhcnQsIHRydWUpOwotICAgIHJldHVybjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9jZmRlX3R4dGVkdGVuZ2luZS5oIGIveGZhL2ZkZS9jZmRlX3R4dGVkdGVuZ2luZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTE4ZDYzLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY2ZkZV90eHRlZHRlbmdpbmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZERV9DRkRFX1RYVEVEVEVOR0lORV9IXwotI2RlZmluZSBYRkFfRkRFX0NGREVfVFhURURURU5HSU5FX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9pZmRlX3R4dGVkdGVuZ2luZS5oIgotCi1jbGFzcyBDRkRFX1R4dEVkdEJ1ZjsKLWNsYXNzIENGREVfVHh0RWR0UGFyYWc7Ci1jbGFzcyBDRlhfVHh0QnJlYWs7Ci1jbGFzcyBJRkRFX1R4dEVkdERvUmVjb3JkOwotY2xhc3MgSUZYX0NoYXJJdGVyOwotCi1jbGFzcyBDRkRFX1R4dEVkdEVuZ2luZSB7Ci0gcHVibGljOgotICBDRkRFX1R4dEVkdEVuZ2luZSgpOwotICB+Q0ZERV9UeHRFZHRFbmdpbmUoKTsKLQotICB2b2lkIFNldEVkaXRQYXJhbXMoY29uc3QgRkRFX1RYVEVEVFBBUkFNUyYgcGFyYW1zKTsKLSAgRkRFX1RYVEVEVFBBUkFNUyogR2V0RWRpdFBhcmFtcygpOwotCi0gIGludDMyX3QgQ291bnRQYWdlcygpIGNvbnN0OwotICBJRkRFX1R4dEVkdFBhZ2UqIEdldFBhZ2UoaW50MzJfdCBuSW5kZXgpOwotCi0gIHZvaWQgU2V0VGV4dEJ5U3RyZWFtKGNvbnN0IENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiYgcFN0cmVhbSk7Ci0gIHZvaWQgU2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsKLSAgaW50MzJfdCBHZXRUZXh0TGVuZ3RoKCkgY29uc3Q7Ci0gIENGWF9XaWRlU3RyaW5nIEdldFRleHQoaW50MzJfdCBuU3RhcnQsIGludDMyX3QgbkNvdW50KSBjb25zdDsKLSAgdm9pZCBDbGVhclRleHQoKTsKLQotICBpbnQzMl90IEdldENhcmV0UmVjdChDRlhfUmVjdEYmIHJ0Q2FyZXQpIGNvbnN0OwotICBpbnQzMl90IEdldENhcmV0UG9zKCkgY29uc3Q7Ci0gIGludDMyX3QgU2V0Q2FyZXRQb3MoaW50MzJfdCBuSW5kZXgsIGJvb2wgYkJlZm9yZSk7Ci0gIGludDMyX3QgTW92ZUNhcmV0UG9zKEZERV9UWFRFRFRNT1ZFQ0FSRVQgZU1vdmVDYXJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2hpZnQgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ3RybCA9IGZhbHNlKTsKLSAgdm9pZCBMb2NrKCk7Ci0gIHZvaWQgVW5sb2NrKCk7Ci0gIGJvb2wgSXNMb2NrZWQoKSBjb25zdDsKLQotICBpbnQzMl90IEluc2VydChpbnQzMl90IG5TdGFydCwgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwgaW50MzJfdCBuTGVuZ3RoKTsKLSAgaW50MzJfdCBEZWxldGUoaW50MzJfdCBuU3RhcnQsIGJvb2wgYkJhY2tzcGFjZSA9IGZhbHNlKTsKLSAgaW50MzJfdCBEZWxldGVSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQgPSAtMSk7Ci0gIGludDMyX3QgUmVwbGFjZShpbnQzMl90IG5TdGFydCwKLSAgICAgICAgICAgICAgICAgIGludDMyX3Qgbkxlbmd0aCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1JlcGxhY2UpOwotCi0gIHZvaWQgU2V0TGltaXQoaW50MzJfdCBuTGltaXQpOwotICB2b2lkIFNldEFsaWFzQ2hhcihGWF9XQ0hBUiB3Y0FsaWFzKTsKLQotICB2b2lkIFJlbW92ZVNlbFJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCk7Ci0KLSAgdm9pZCBBZGRTZWxSYW5nZShpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQpOwotICBpbnQzMl90IENvdW50U2VsUmFuZ2VzKCkgY29uc3Q7Ci0gIGludDMyX3QgR2V0U2VsUmFuZ2UoaW50MzJfdCBuSW5kZXgsIGludDMyX3QqIG5TdGFydCkgY29uc3Q7Ci0gIHZvaWQgQ2xlYXJTZWxlY3Rpb24oKTsKLQotICBib29sIFJlZG8oY29uc3QgSUZERV9UeHRFZHREb1JlY29yZCogcFJlY29yZCk7Ci0gIGJvb2wgVW5kbyhjb25zdCBJRkRFX1R4dEVkdERvUmVjb3JkKiBwUmVjb3JkKTsKLQotICBpbnQzMl90IFN0YXJ0TGF5b3V0KCk7Ci0gIGludDMyX3QgRG9MYXlvdXQoSUZYX1BhdXNlKiBwUGF1c2UpOwotICB2b2lkIEVuZExheW91dCgpOwotCi0gIGludDMyX3QgQ291bnRQYXJhZ3MoKSBjb25zdDsKLSAgQ0ZERV9UeHRFZHRQYXJhZyogR2V0UGFyYWcoaW50MzJfdCBuUGFyYWdJbmRleCkgY29uc3Q7Ci0gIElGWF9DaGFySXRlciogQ3JlYXRlQ2hhckl0ZXIoKTsKLSAgQ0ZERV9UeHRFZHRCdWYqIEdldFRleHRCdWYoKSBjb25zdDsKLSAgaW50MzJfdCBHZXRUZXh0QnVmTGVuZ3RoKCkgY29uc3Q7Ci0gIENGWF9UeHRCcmVhayogR2V0VGV4dEJyZWFrKCkgY29uc3Q7Ci0gIGludDMyX3QgR2V0TGluZUNvdW50KCkgY29uc3Q7Ci0gIGludDMyX3QgR2V0UGFnZUxpbmVDb3VudCgpIGNvbnN0OwotCi0gIGludDMyX3QgTGluZTJQYXJhZyhpbnQzMl90IG5TdGFydFBhcmFnLAotICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnRMaW5lb2ZQYXJhZywKLSAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkxpbmVJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5TdGFydExpbmUpIGNvbnN0OwotICBGWF9XQ0hBUiBHZXRBbGlhc0NoYXIoKSBjb25zdCB7IHJldHVybiBtX3djQWxpYXNDaGFyOyB9Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgQ0ZERV9UeHRFZHREb1JlY29yZF9JbnNlcnQ7Ci0gIGZyaWVuZCBjbGFzcyBDRkRFX1R4dEVkdERvUmVjb3JkX0RlbGV0ZVJhbmdlOwotICBmcmllbmQgY2xhc3MgQ0ZERV9UeHRFZHRQYWdlOwotCi0gIHN0cnVjdCBGREVfVFhURURUU0VMUkFOR0UgewotICAgIGludDMyX3QgblN0YXJ0OwotICAgIGludDMyX3QgbkNvdW50OwotICB9OwotCi0gIHN0cnVjdCBGREVfVFhURURUUEFSQUdQT1MgewotICAgIGludDMyX3QgblBhcmFnSW5kZXg7Ci0gICAgaW50MzJfdCBuQ2hhckluZGV4OwotICB9OwotCi0gIHZvaWQgSW5uZXJfSW5zZXJ0KGludDMyX3QgblN0YXJ0LCBjb25zdCBGWF9XQ0hBUiogbHBUZXh0LCBpbnQzMl90IG5MZW5ndGgpOwotICBDRlhfV2lkZVN0cmluZyBHZXRQcmVEZWxldGVUZXh0KGludDMyX3QgbkluZGV4LCBpbnQzMl90IG5MZW5ndGgpOwotICBDRlhfV2lkZVN0cmluZyBHZXRQcmVJbnNlcnRUZXh0KGludDMyX3QgbkluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBscFRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0UHJlUmVwbGFjZVRleHQoaW50MzJfdCBuSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgbk9yaWdpbkxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIGxwVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuTGVuZ3RoKTsKLQotICB2b2lkIElubmVyX0RlbGV0ZVJhbmdlKGludDMyX3QgblN0YXJ0LCBpbnQzMl90IG5Db3VudCA9IC0xKTsKLSAgdm9pZCBEZWxldGVSYW5nZV9Eb1JlY29yZChpbnQzMl90IG5TdGFydCwgaW50MzJfdCBuQ291bnQsIGJvb2wgYlNlbCA9IGZhbHNlKTsKLSAgdm9pZCBSZXNldEVuZ2luZSgpOwotICB2b2lkIFJlYnVpbGRQYXJhZ3JhcGhzKCk7Ci0gIHZvaWQgUmVtb3ZlQWxsUGFyYWdzKCk7Ci0gIHZvaWQgUmVtb3ZlQWxsUGFnZXMoKTsKLSAgdm9pZCBVcGRhdGVQYXJhZ3MoKTsKLSAgdm9pZCBVcGRhdGVQYWdlcygpOwotICB2b2lkIFVwZGF0ZVR4dEJyZWFrKCk7Ci0KLSAgYm9vbCBSZXBsYWNlUGFyYWdFbmQoRlhfV0NIQVIqJiBscFRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG5MZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlByZUlzQ1IgPSBmYWxzZSk7Ci0gIHZvaWQgUmVjb3ZlclBhcmFnRW5kKENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIGNvbnN0OwotICBpbnQzMl90IE1vdmVQYWdlMkNoYXIoaW50MzJfdCBuSW5kZXgpOwotICB2b2lkIFRleHRQb3MyUGFyYWdQb3MoaW50MzJfdCBuSW5kZXgsIEZERV9UWFRFRFRQQVJBR1BPUyYgUGFyYWdQb3MpIGNvbnN0OwotICBpbnQzMl90IE1vdmVGb3J3YXJkKGJvb2wmIGJCZWZvcmUpOwotICBpbnQzMl90IE1vdmVCYWNrd2FyZChib29sJiBiQmVmb3JlKTsKLSAgYm9vbCBNb3ZlVXAoQ0ZYX1BvaW50RiYgcHRDYXJldCk7Ci0gIGJvb2wgTW92ZURvd24oQ0ZYX1BvaW50RiYgcHRDYXJldCk7Ci0gIGJvb2wgTW92ZUxpbmVTdGFydCgpOwotICBib29sIE1vdmVMaW5lRW5kKCk7Ci0gIGJvb2wgTW92ZVBhcmFnU3RhcnQoKTsKLSAgYm9vbCBNb3ZlUGFyYWdFbmQoKTsKLSAgYm9vbCBNb3ZlSG9tZSgpOwotICBib29sIE1vdmVFbmQoKTsKLSAgYm9vbCBJc0ZpdEFyZWEoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7Ci0gIHZvaWQgVXBkYXRlQ2FyZXRSZWN0KGludDMyX3QgbkluZGV4LCBib29sIGJCZWZvcmUgPSB0cnVlKTsKLSAgdm9pZCBHZXRDYXJldFJlY3QoQ0ZYX1JlY3RGJiBydENhcmV0LAotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5QYWdlSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNhcmV0LAotICAgICAgICAgICAgICAgICAgICBib29sIGJCZWZvcmUgPSB0cnVlKTsKLSAgdm9pZCBVcGRhdGVDYXJldEluZGV4KGNvbnN0IENGWF9Qb2ludEYmIHB0Q2FyZXQpOwotCi0gIGJvb2wgSXNTZWxlY3QoKTsKLSAgdm9pZCBEZWxldGVTZWxlY3QoKTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZERV9UeHRFZHRCdWY+IG1fcFR4dEJ1ZjsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWF9UeHRCcmVhaz4gbV9wVGV4dEJyZWFrOwotICBGREVfVFhURURUUEFSQU1TIG1fUGFyYW07Ci0gIENGWF9BcnJheVRlbXBsYXRlPElGREVfVHh0RWR0UGFnZSo+IG1fUGFnZVB0ckFycmF5OwotICBDRlhfQXJyYXlUZW1wbGF0ZTxDRkRFX1R4dEVkdFBhcmFnKj4gbV9QYXJhZ1B0ckFycmF5OwotICBDRlhfQXJyYXlUZW1wbGF0ZTxGREVfVFhURURUU0VMUkFOR0UqPiBtX1NlbFJhbmdlUHRyQXJyOwotICBpbnQzMl90IG1fblBhZ2VMaW5lQ291bnQ7Ci0gIGludDMyX3QgbV9uTGluZUNvdW50OwotICBpbnQzMl90IG1fbkFuY2hvclBvczsKLSAgaW50MzJfdCBtX25MYXlvdXRQb3M7Ci0gIEZYX0ZMT0FUIG1fZkNhcmV0UG9zUmVzZXJ2ZTsKLSAgaW50MzJfdCBtX25DYXJldDsKLSAgYm9vbCBtX2JCZWZvcmU7Ci0gIGludDMyX3QgbV9uQ2FyZXRQYWdlOwotICBDRlhfUmVjdEYgbV9ydENhcmV0OwotICB1aW50MzJfdCBtX2R3RmluZEZsYWdzOwotICBib29sIG1fYkxvY2s7Ci0gIGludDMyX3QgbV9uTGltaXQ7Ci0gIEZYX1dDSEFSIG1fd2NBbGlhc0NoYXI7Ci0gIGludDMyX3QgbV9uRmlyc3RMaW5lRW5kOwotICBib29sIG1fYkF1dG9MaW5lRW5kOwotICBGWF9XQ0hBUiBtX3dMaW5lRW5kOwotICBGREVfVFhURURUX1RFWFRDSEFOR0VfSU5GTyBtX0NoYW5nZUluZm87Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GREVfQ0ZERV9UWFRFRFRFTkdJTkVfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZGUvY2ZkZV90eHRlZHRwYWdlLmNwcCBiL3hmYS9mZGUvY2ZkZV90eHRlZHRwYWdlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI1OGIyYi4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL2NmZGVfdHh0ZWR0cGFnZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NzMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZkZS9jZmRlX3R4dGVkdHBhZ2UuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jZmRlX3R4dGVkdGJ1Zi5oIgotI2luY2x1ZGUgInhmYS9mZGUvY2ZkZV90eHRlZHRlbmdpbmUuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2NmZGVfdHh0ZWR0cGFyYWcuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2NmZGVfdHh0ZWR0dGV4dHNldC5oIgotI2luY2x1ZGUgInhmYS9mZGUvY2Z4X3dvcmRicmVhay5oIgotI2luY2x1ZGUgInhmYS9mZGUvaWZkZV90eHRlZHRlbmdpbmUuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2lmZGVfdHh0ZWR0cGFnZS5oIgotCi1uYW1lc3BhY2UgewotCi1jb25zdCBkb3VibGUga1RvbGVyYW5jZSA9IDAuMWY7Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1JRkRFX1R4dEVkdFBhZ2UqIElGREVfVHh0RWR0UGFnZTo6Q3JlYXRlKENGREVfVHh0RWR0RW5naW5lKiBwRW5naW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCkgewotICByZXR1cm4gbmV3IENGREVfVHh0RWR0UGFnZShwRW5naW5lLCBuSW5kZXgpOwotfQotCi1DRkRFX1R4dEVkdFBhZ2U6OkNGREVfVHh0RWR0UGFnZShDRkRFX1R4dEVkdEVuZ2luZSogcEVuZ2luZSwgaW50MzJfdCBuUGFnZUluZGV4KQotICAgIDogbV9wRWRpdEVuZ2luZShwRW5naW5lKSwKLSAgICAgIG1fcEJnblBhcmFnKG51bGxwdHIpLAotICAgICAgbV9wRW5kUGFyYWcobnVsbHB0ciksCi0gICAgICBtX25SZWZDb3VudCgwKSwKLSAgICAgIG1fblBhZ2VTdGFydCgtMSksCi0gICAgICBtX25DaGFyQ291bnQoMCksCi0gICAgICBtX25QYWdlSW5kZXgoblBhZ2VJbmRleCksCi0gICAgICBtX2JMb2FkZWQoZmFsc2UpIHsKLX0KLQotQ0ZERV9UeHRFZHRQYWdlOjp+Q0ZERV9UeHRFZHRQYWdlKCkge30KLQotQ0ZERV9UeHRFZHRFbmdpbmUqIENGREVfVHh0RWR0UGFnZTo6R2V0RW5naW5lKCkgY29uc3QgewotICByZXR1cm4gbV9wRWRpdEVuZ2luZTsKLX0KLQotRkRFX1ZJU1VBTE9CSlRZUEUgQ0ZERV9UeHRFZHRQYWdlOjpHZXRUeXBlKCkgewotICByZXR1cm4gRkRFX1ZJU1VBTE9CSl9UZXh0OwotfQotCi1DRlhfUmVjdEYgQ0ZERV9UeHRFZHRQYWdlOjpHZXRSZWN0KGNvbnN0IEZERV9URVhURURJVFBJRUNFJiBoVmlzdWFsT2JqKSB7Ci0gIHJldHVybiBDRlhfUmVjdEYoKTsKLX0KLQotaW50MzJfdCBDRkRFX1R4dEVkdFBhZ2U6OkdldENoYXJSZWN0KGludDMyX3QgbkluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJCQm94KSBjb25zdCB7Ci0gIEFTU0VSVChtX25SZWZDb3VudCA+IDApOwotICBBU1NFUlQobkluZGV4ID49IDAgJiYgbkluZGV4IDwgbV9uQ2hhckNvdW50KTsKLSAgaWYgKG1fblJlZkNvdW50IDwgMSkKLSAgICByZXR1cm4gMDsKLQotICBmb3IgKGNvbnN0IGF1dG8mIHBpZWNlIDogbV9QaWVjZXMpIHsKLSAgICBpZiAobkluZGV4ID49IHBpZWNlLm5TdGFydCAmJiBuSW5kZXggPCBwaWVjZS5uU3RhcnQgKyBwaWVjZS5uQ291bnQpIHsKLSAgICAgIHN0ZDo6dmVjdG9yPENGWF9SZWN0Rj4gcmVjdEFyciA9IG1fcFRleHRTZXQtPkdldENoYXJSZWN0cygmcGllY2UsIGJCQm94KTsKLSAgICAgIHJlY3QgPSByZWN0QXJyW25JbmRleCAtIHBpZWNlLm5TdGFydF07Ci0gICAgICByZXR1cm4gcGllY2UubkJpZGlMZXZlbDsKLSAgICB9Ci0gIH0KLSAgQVNTRVJUKDApOwotICByZXR1cm4gMDsKLX0KLQotaW50MzJfdCBDRkRFX1R4dEVkdFBhZ2U6OkdldENoYXJJbmRleChjb25zdCBDRlhfUG9pbnRGJiBmUG9pbnQsIGJvb2wmIGJCZWZvcmUpIHsKLSAgQ0ZYX1BvaW50RiBwdEYgPSBmUG9pbnQ7Ci0gIE5vcm1hbGl6ZVB0MlJlY3QocHRGLCBtX3J0UGFnZUNvbnRlbnRzLCBrVG9sZXJhbmNlKTsKLSAgaW50MzJfdCBuQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fUGllY2VzKTsKLSAgQ0ZYX1JlY3RGIHJ0TGluZTsKLSAgaW50MzJfdCBuQmduID0gMDsKLSAgaW50MzJfdCBuRW5kID0gMDsKLSAgYm9vbCBiSW5MaW5lID0gZmFsc2U7Ci0gIGludDMyX3QgaSA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgewotICAgIGNvbnN0IEZERV9URVhURURJVFBJRUNFKiBwUGllY2UgPSAmbV9QaWVjZXNbaV07Ci0gICAgaWYgKCFiSW5MaW5lICYmCi0gICAgICAgIChwUGllY2UtPnJ0UGllY2UudG9wIDw9IHB0Ri55ICYmIHBQaWVjZS0+cnRQaWVjZS5ib3R0b20oKSA+IHB0Ri55KSkgewotICAgICAgbkJnbiA9IG5FbmQgPSBpOwotICAgICAgcnRMaW5lID0gcFBpZWNlLT5ydFBpZWNlOwotICAgICAgYkluTGluZSA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChiSW5MaW5lKSB7Ci0gICAgICBpZiAocFBpZWNlLT5ydFBpZWNlLmJvdHRvbSgpIDw9IHB0Ri55IHx8IHBQaWVjZS0+cnRQaWVjZS50b3AgPiBwdEYueSkgewotICAgICAgICBuRW5kID0gaSAtIDE7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcnRMaW5lLlVuaW9uKHBQaWVjZS0+cnRQaWVjZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIE5vcm1hbGl6ZVB0MlJlY3QocHRGLCBydExpbmUsIGtUb2xlcmFuY2UpOwotICBpbnQzMl90IG5DYXJldCA9IDA7Ci0gIEZERV9URVhURURJVFBJRUNFKiBwUGllY2UgPSBudWxscHRyOwotICBmb3IgKGkgPSBuQmduOyBpIDw9IG5FbmQ7IGkrKykgewotICAgIHBQaWVjZSA9ICZtX1BpZWNlc1tpXTsKLSAgICBuQ2FyZXQgPSBtX25QYWdlU3RhcnQgKyBwUGllY2UtPm5TdGFydDsKLSAgICBpZiAocFBpZWNlLT5ydFBpZWNlLkNvbnRhaW5zKHB0RikpIHsKLSAgICAgIHN0ZDo6dmVjdG9yPENGWF9SZWN0Rj4gcmVjdEFyciA9IG1fcFRleHRTZXQtPkdldENoYXJSZWN0cyhwUGllY2UsIGZhbHNlKTsKLSAgICAgIGludDMyX3QgblJ0Q291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHJlY3RBcnIpOwotICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgblJ0Q291bnQ7IGorKykgewotICAgICAgICBpZiAocmVjdEFycltqXS5Db250YWlucyhwdEYpKSB7Ci0gICAgICAgICAgbkNhcmV0ID0gbV9uUGFnZVN0YXJ0ICsgcFBpZWNlLT5uU3RhcnQgKyBqOwotICAgICAgICAgIGlmIChuQ2FyZXQgPj0gbV9wRWRpdEVuZ2luZS0+R2V0VGV4dEJ1Zkxlbmd0aCgpKSB7Ci0gICAgICAgICAgICBiQmVmb3JlID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBtX3BFZGl0RW5naW5lLT5HZXRUZXh0QnVmTGVuZ3RoKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIEZYX1dDSEFSIHdDaGFyID0gbV9wRWRpdEVuZ2luZS0+R2V0VGV4dEJ1ZigpLT5HZXRDaGFyQnlJbmRleChuQ2FyZXQpOwotICAgICAgICAgIGlmICh3Q2hhciA9PSBMJ1xuJyB8fCB3Q2hhciA9PSBMJ1xyJykgewotICAgICAgICAgICAgaWYgKHdDaGFyID09IEwnXG4nKSB7Ci0gICAgICAgICAgICAgIGlmIChtX3BFZGl0RW5naW5lLT5HZXRUZXh0QnVmKCktPkdldENoYXJCeUluZGV4KG5DYXJldCAtIDEpID09Ci0gICAgICAgICAgICAgICAgICBMJ1xyJykgewotICAgICAgICAgICAgICAgIG5DYXJldC0tOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiQmVmb3JlID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBuQ2FyZXQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChwdEYueCA+ICgocmVjdEFycltqXS5sZWZ0ICsgcmVjdEFycltqXS5yaWdodCgpKSAvIDIpKSB7Ci0gICAgICAgICAgICBiQmVmb3JlID0gRlhfSXNPZGQocFBpZWNlLT5uQmlkaUxldmVsKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYkJlZm9yZSA9ICFGWF9Jc09kZChwUGllY2UtPm5CaWRpTGV2ZWwpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gbkNhcmV0OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGJCZWZvcmUgPSB0cnVlOwotICByZXR1cm4gbkNhcmV0OwotfQotCi1pbnQzMl90IENGREVfVHh0RWR0UGFnZTo6R2V0Q2hhclN0YXJ0KCkgY29uc3QgewotICByZXR1cm4gbV9uUGFnZVN0YXJ0OwotfQotCi1pbnQzMl90IENGREVfVHh0RWR0UGFnZTo6R2V0Q2hhckNvdW50KCkgY29uc3QgewotICByZXR1cm4gbV9uQ2hhckNvdW50OwotfQotCi1pbnQzMl90IENGREVfVHh0RWR0UGFnZTo6R2V0RGlzcGxheVBvcyhjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiYgcENoYXJQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYqIHBCQm94KSBjb25zdCB7Ci0gIHBDaGFyUG9zID0gRlhfQWxsb2MoRlhURVhUX0NIQVJQT1MsIG1fbkNoYXJDb3VudCk7Ci0gIGludDMyX3QgbkNoYXJQb3NDb3VudCA9IDA7Ci0gIEZYVEVYVF9DSEFSUE9TKiBwb3MgPSBwQ2hhclBvczsKLSAgZm9yIChjb25zdCBhdXRvJiBwaWVjZSA6IG1fUGllY2VzKSB7Ci0gICAgaWYgKCFydENsaXAuSW50ZXJzZWN0V2l0aChtX3BUZXh0U2V0LT5HZXRSZWN0KHBpZWNlKSkpCi0gICAgICBjb250aW51ZTsKLQotICAgIGludDMyX3QgbkNvdW50ID0gbV9wVGV4dFNldC0+R2V0RGlzcGxheVBvcyhwaWVjZSwgcG9zLCBmYWxzZSk7Ci0gICAgbkNoYXJQb3NDb3VudCArPSBuQ291bnQ7Ci0gICAgcG9zICs9IG5Db3VudDsKLSAgfQotICBpZiAoKG5DaGFyUG9zQ291bnQgKiA1KSA8IChtX25DaGFyQ291bnQgPDwgMikpIHsKLSAgICBGWFRFWFRfQ0hBUlBPUyogcFRlbXAgPSBGWF9BbGxvYyhGWFRFWFRfQ0hBUlBPUywgbkNoYXJQb3NDb3VudCk7Ci0gICAgRlhTWVNfbWVtY3B5KHBUZW1wLCBwQ2hhclBvcywgc2l6ZW9mKEZYVEVYVF9DSEFSUE9TKSAqIG5DaGFyUG9zQ291bnQpOwotICAgIEZYX0ZyZWUocENoYXJQb3MpOwotICAgIHBDaGFyUG9zID0gcFRlbXA7Ci0gIH0KLSAgcmV0dXJuIG5DaGFyUG9zQ291bnQ7Ci19Ci0KLXZvaWQgQ0ZERV9UeHRFZHRQYWdlOjpDYWxjUmFuZ2VSZWN0QXJyYXkoCi0gICAgaW50MzJfdCBuU3RhcnQsCi0gICAgaW50MzJfdCBuQ291bnQsCi0gICAgc3RkOjp2ZWN0b3I8Q0ZYX1JlY3RGPiogcFJlY3RGQXJyKSBjb25zdCB7Ci0gIGludDMyX3QgbkVuZCA9IG5TdGFydCArIG5Db3VudCAtIDE7Ci0gIGJvb2wgYkluUmFuZ2UgPSBmYWxzZTsKLSAgZm9yIChjb25zdCBhdXRvJiBwaWVjZSA6IG1fUGllY2VzKSB7Ci0gICAgaWYgKCFiSW5SYW5nZSkgewotICAgICAgaWYgKG5TdGFydCA+PSBwaWVjZS5uU3RhcnQgJiYgblN0YXJ0IDwgcGllY2UublN0YXJ0ICsgcGllY2UubkNvdW50KSB7Ci0gICAgICAgIGludDMyX3QgblJhbmdlRW5kID0gcGllY2UubkNvdW50IC0gMTsKLSAgICAgICAgYm9vbCBiRW5kID0gZmFsc2U7Ci0gICAgICAgIGlmIChuRW5kID49IHBpZWNlLm5TdGFydCAmJiBuRW5kIDwgcGllY2UublN0YXJ0ICsgcGllY2UubkNvdW50KSB7Ci0gICAgICAgICAgblJhbmdlRW5kID0gbkVuZCAtIHBpZWNlLm5TdGFydDsKLSAgICAgICAgICBiRW5kID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBzdGQ6OnZlY3RvcjxDRlhfUmVjdEY+IHJjQXJyID0gbV9wVGV4dFNldC0+R2V0Q2hhclJlY3RzKCZwaWVjZSwgZmFsc2UpOwotICAgICAgICBDRlhfUmVjdEYgcmVjdFBpZWNlID0gcmNBcnJbblN0YXJ0IC0gcGllY2UublN0YXJ0XTsKLSAgICAgICAgcmVjdFBpZWNlLlVuaW9uKHJjQXJyW25SYW5nZUVuZF0pOwotICAgICAgICBwUmVjdEZBcnItPnB1c2hfYmFjayhyZWN0UGllY2UpOwotICAgICAgICBpZiAoYkVuZCkKLSAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgYkluUmFuZ2UgPSB0cnVlOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAobkVuZCA+PSBwaWVjZS5uU3RhcnQgJiYgbkVuZCA8IHBpZWNlLm5TdGFydCArIHBpZWNlLm5Db3VudCkgewotICAgICAgICBzdGQ6OnZlY3RvcjxDRlhfUmVjdEY+IHJjQXJyID0gbV9wVGV4dFNldC0+R2V0Q2hhclJlY3RzKCZwaWVjZSwgZmFsc2UpOwotICAgICAgICBDRlhfUmVjdEYgcmVjdFBpZWNlID0gcmNBcnJbMF07Ci0gICAgICAgIHJlY3RQaWVjZS5VbmlvbihyY0FycltuRW5kIC0gcGllY2UublN0YXJ0XSk7Ci0gICAgICAgIHBSZWN0RkFyci0+cHVzaF9iYWNrKHJlY3RQaWVjZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHBSZWN0RkFyci0+cHVzaF9iYWNrKHBpZWNlLnJ0UGllY2UpOwotICAgIH0KLSAgfQotfQotCi1pbnQzMl90IENGREVfVHh0RWR0UGFnZTo6U2VsZWN0V29yZChjb25zdCBDRlhfUG9pbnRGJiBmUG9pbnQsIGludDMyX3QmIG5Db3VudCkgewotICBpZiAobV9uUmVmQ291bnQgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIENGREVfVHh0RWR0QnVmKiBwQnVmID0gbV9wRWRpdEVuZ2luZS0+R2V0VGV4dEJ1ZigpOwotICBib29sIGJCZWZvcmU7Ci0gIGludDMyX3QgbkluZGV4ID0gR2V0Q2hhckluZGV4KGZQb2ludCwgYkJlZm9yZSk7Ci0gIGlmIChuSW5kZXggPT0gbV9wRWRpdEVuZ2luZS0+R2V0VGV4dEJ1Zkxlbmd0aCgpKSB7Ci0gICAgbkluZGV4ID0gbV9wRWRpdEVuZ2luZS0+R2V0VGV4dEJ1Zkxlbmd0aCgpIC0gMTsKLSAgfQotICBpZiAobkluZGV4IDwgMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1dvcmRCcmVhaz4gcEl0ZXIobmV3IENGWF9Xb3JkQnJlYWspOwotICBwSXRlci0+QXR0YWNoKG5ldyBDRkRFX1R4dEVkdEJ1Zjo6SXRlcmF0b3IocEJ1ZikpOwotICBwSXRlci0+U2V0QXQobkluZGV4KTsKLSAgbkNvdW50ID0gcEl0ZXItPkdldFdvcmRMZW5ndGgoKTsKLSAgcmV0dXJuIHBJdGVyLT5HZXRXb3JkUG9zKCk7Ci19Ci0KLWJvb2wgQ0ZERV9UeHRFZHRQYWdlOjpJc0xvYWRlZChjb25zdCBDRlhfUmVjdEYqIHBDbGlwQm94KSB7Ci0gIHJldHVybiBtX2JMb2FkZWQ7Ci19Ci0KLWludDMyX3QgQ0ZERV9UeHRFZHRQYWdlOjpMb2FkUGFnZShjb25zdCBDRlhfUmVjdEYqIHBDbGlwQm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7Ci0gIGlmIChtX25SZWZDb3VudCA+IDApIHsKLSAgICBtX25SZWZDb3VudCsrOwotICAgIHJldHVybiBtX25SZWZDb3VudDsKLSAgfQotICBDRkRFX1R4dEVkdEJ1ZiogcEJ1ZiA9IG1fcEVkaXRFbmdpbmUtPkdldFRleHRCdWYoKTsKLSAgY29uc3QgRkRFX1RYVEVEVFBBUkFNUyogcFBhcmFtcyA9IG1fcEVkaXRFbmdpbmUtPkdldEVkaXRQYXJhbXMoKTsKLSAgRlhfV0NIQVIgd2NBbGlhcyA9IDA7Ci0gIGlmIChwUGFyYW1zLT5kd01vZGUgJiBGREVfVEVYVEVESVRNT0RFX1Bhc3N3b3JkKSB7Ci0gICAgd2NBbGlhcyA9IG1fcEVkaXRFbmdpbmUtPkdldEFsaWFzQ2hhcigpOwotICB9Ci0gIG1fcEl0ZXIucmVzZXQobmV3IENGREVfVHh0RWR0QnVmOjpJdGVyYXRvcihzdGF0aWNfY2FzdDxDRkRFX1R4dEVkdEJ1Zio+KHBCdWYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NBbGlhcykpOwotICBDRlhfVHh0QnJlYWsqIHBCcmVhayA9IG1fcEVkaXRFbmdpbmUtPkdldFRleHRCcmVhaygpOwotICBwQnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsKLSAgcEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7Ci0gIGludDMyX3QgblBhZ2VMaW5lQ291bnQgPSBtX3BFZGl0RW5naW5lLT5HZXRQYWdlTGluZUNvdW50KCk7Ci0gIGludDMyX3QgblN0YXJ0TGluZSA9IG5QYWdlTGluZUNvdW50ICogbV9uUGFnZUluZGV4OwotICBpbnQzMl90IG5FbmRMaW5lID0gc3RkOjptaW4oKG5TdGFydExpbmUgKyBuUGFnZUxpbmVDb3VudCAtIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fcEVkaXRFbmdpbmUtPkdldExpbmVDb3VudCgpIC0gMSkpOwotICBpbnQzMl90IG5QYWdlU3RhcnQsIG5QYWdlRW5kLCBuVGVtcCwgbkJnblBhcmFnLCBuU3RhcnRMaW5lSW5QYXJhZywgbkVuZFBhcmFnLAotICAgICAgbkVuZExpbmVJblBhcmFnOwotICBuQmduUGFyYWcgPSBtX3BFZGl0RW5naW5lLT5MaW5lMlBhcmFnKDAsIDAsIG5TdGFydExpbmUsIG5TdGFydExpbmVJblBhcmFnKTsKLSAgbV9wQmduUGFyYWcgPQotICAgICAgc3RhdGljX2Nhc3Q8Q0ZERV9UeHRFZHRQYXJhZyo+KG1fcEVkaXRFbmdpbmUtPkdldFBhcmFnKG5CZ25QYXJhZykpOwotICBtX3BCZ25QYXJhZy0+TG9hZFBhcmFnKCk7Ci0gIG1fcEJnblBhcmFnLT5HZXRMaW5lUmFuZ2UoblN0YXJ0TGluZSAtIG5TdGFydExpbmVJblBhcmFnLCBuUGFnZVN0YXJ0LCBuVGVtcCk7Ci0gIG5FbmRQYXJhZyA9IG1fcEVkaXRFbmdpbmUtPkxpbmUyUGFyYWcobkJnblBhcmFnLCBuU3RhcnRMaW5lSW5QYXJhZywgbkVuZExpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkVuZExpbmVJblBhcmFnKTsKLSAgbV9wRW5kUGFyYWcgPQotICAgICAgc3RhdGljX2Nhc3Q8Q0ZERV9UeHRFZHRQYXJhZyo+KG1fcEVkaXRFbmdpbmUtPkdldFBhcmFnKG5FbmRQYXJhZykpOwotICBtX3BFbmRQYXJhZy0+TG9hZFBhcmFnKCk7Ci0gIG1fcEVuZFBhcmFnLT5HZXRMaW5lUmFuZ2UobkVuZExpbmUgLSBuRW5kTGluZUluUGFyYWcsIG5QYWdlRW5kLCBuVGVtcCk7Ci0gIG5QYWdlRW5kICs9IChuVGVtcCAtIDEpOwotCi0gIEZYX0ZMT0FUIGZMaW5lU3RhcnQgPSAwLjBmOwotICBGWF9GTE9BVCBmTGluZVN0ZXAgPSBwUGFyYW1zLT5mTGluZVNwYWNlOwotICBGWF9GTE9BVCBmTGluZVBvcyA9IGZMaW5lU3RhcnQ7Ci0gIGlmICghbV9wVGV4dFNldCkKLSAgICBtX3BUZXh0U2V0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGREVfVHh0RWR0VGV4dFNldD4odGhpcyk7Ci0KLSAgbV9QaWVjZXMuY2xlYXIoKTsKLSAgdWludDMyX3QgZHdCcmVha1N0YXR1cyA9IEZYX1RYVEJSRUFLX05vbmU7Ci0gIGludDMyX3QgblBpZWNlU3RhcnQgPSAwOwotCi0gIG1fQ2hhcldpZHRocy5yZXNpemUoblBhZ2VFbmQgLSBuUGFnZVN0YXJ0ICsgMSwgMCk7Ci0gIHBCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOwotICBwQnJlYWstPkNsZWFyQnJlYWtQaWVjZXMoKTsKLSAgbV9uUGFnZVN0YXJ0ID0gblBhZ2VTdGFydDsKLSAgbV9uQ2hhckNvdW50ID0gblBhZ2VFbmQgLSBuUGFnZVN0YXJ0ICsgMTsKLSAgYm9vbCBiUmVsb2FkID0gZmFsc2U7Ci0gIEZYX0ZMT0FUIGZEZWZDaGFyV2lkdGggPSAwOwotICBzdGQ6OnVuaXF1ZV9wdHI8SUZYX0NoYXJJdGVyPiBwSXRlcihtX3BJdGVyLT5DbG9uZSgpKTsKLSAgcEl0ZXItPlNldEF0KG5QYWdlU3RhcnQpOwotICBtX3BJdGVyLT5TZXRBdChuUGFnZVN0YXJ0KTsKLSAgYm9vbCBiRmlyc3RQaWVjZSA9IHRydWU7Ci0gIGRvIHsKLSAgICBpZiAoYlJlbG9hZCkgewotICAgICAgZHdCcmVha1N0YXR1cyA9IHBCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOwotICAgIH0gZWxzZSB7Ci0gICAgICBGWF9XQ0hBUiB3QXBwZW5kID0gcEl0ZXItPkdldENoYXIoKTsKLSAgICAgIGR3QnJlYWtTdGF0dXMgPSBwQnJlYWstPkFwcGVuZENoYXIod0FwcGVuZCk7Ci0gICAgfQotICAgIGlmIChwSXRlci0+R2V0QXQoKSA9PSBuUGFnZUVuZCAmJiBkd0JyZWFrU3RhdHVzIDwgRlhfVFhUQlJFQUtfTGluZUJyZWFrKSB7Ci0gICAgICBkd0JyZWFrU3RhdHVzID0gcEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7Ci0gICAgfQotICAgIGlmIChkd0JyZWFrU3RhdHVzID4gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgewotICAgICAgaW50MzJfdCBuUGllY2VDb3VudCA9IHBCcmVhay0+Q291bnRCcmVha1BpZWNlcygpOwotICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgblBpZWNlQ291bnQ7IGorKykgewotICAgICAgICBjb25zdCBDRlhfVHh0UGllY2UqIHBQaWVjZSA9IHBCcmVhay0+R2V0QnJlYWtQaWVjZShqKTsKLSAgICAgICAgRkRFX1RFWFRFRElUUElFQ0UgVHh0RWR0UGllY2U7Ci0gICAgICAgIEZYU1lTX21lbXNldCgmVHh0RWR0UGllY2UsIDAsIHNpemVvZihGREVfVEVYVEVESVRQSUVDRSkpOwotICAgICAgICBUeHRFZHRQaWVjZS5uQmlkaUxldmVsID0gcFBpZWNlLT5tX2lCaWRpTGV2ZWw7Ci0gICAgICAgIFR4dEVkdFBpZWNlLm5Db3VudCA9IHBQaWVjZS0+R2V0TGVuZ3RoKCk7Ci0gICAgICAgIFR4dEVkdFBpZWNlLm5TdGFydCA9IG5QaWVjZVN0YXJ0OwotICAgICAgICBUeHRFZHRQaWVjZS5kd0NoYXJTdHlsZXMgPSBwUGllY2UtPm1fZHdDaGFyU3R5bGVzOwotICAgICAgICBpZiAoRlhfSXNPZGQocFBpZWNlLT5tX2lCaWRpTGV2ZWwpKSB7Ci0gICAgICAgICAgVHh0RWR0UGllY2UuZHdDaGFyU3R5bGVzIHw9IEZYX1RYVENIQVJTVFlMRV9PZGRCaWRpTGV2ZWw7Ci0gICAgICAgIH0KLSAgICAgICAgRlhfRkxPQVQgZlBhcmFCcmVha1dpZHRoID0gMC4wZjsKLSAgICAgICAgaWYgKHBQaWVjZS0+bV9kd1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsKLSAgICAgICAgICBGWF9XQ0hBUiB3UnRDaGFyID0gcFBhcmFtcy0+d0xpbmVCcmVha0NoYXI7Ci0gICAgICAgICAgaWYgKFR4dEVkdFBpZWNlLm5Db3VudCA+PSAyKSB7Ci0gICAgICAgICAgICBGWF9XQ0hBUiB3Q2hhciA9IHBCdWYtPkdldENoYXJCeUluZGV4KAotICAgICAgICAgICAgICAgIG1fblBhZ2VTdGFydCArIFR4dEVkdFBpZWNlLm5TdGFydCArIFR4dEVkdFBpZWNlLm5Db3VudCAtIDEpOwotICAgICAgICAgICAgRlhfV0NIQVIgd0NoYXJQcmUgPSBwQnVmLT5HZXRDaGFyQnlJbmRleCgKLSAgICAgICAgICAgICAgICBtX25QYWdlU3RhcnQgKyBUeHRFZHRQaWVjZS5uU3RhcnQgKyBUeHRFZHRQaWVjZS5uQ291bnQgLSAyKTsKLSAgICAgICAgICAgIGlmICh3Q2hhciA9PSB3UnRDaGFyKSB7Ci0gICAgICAgICAgICAgIGZQYXJhQnJlYWtXaWR0aCArPSBmRGVmQ2hhcldpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHdDaGFyUHJlID09IHdSdENoYXIpIHsKLSAgICAgICAgICAgICAgZlBhcmFCcmVha1dpZHRoICs9IGZEZWZDaGFyV2lkdGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIGlmIChUeHRFZHRQaWVjZS5uQ291bnQgPj0gMSkgewotICAgICAgICAgICAgRlhfV0NIQVIgd0NoYXIgPSBwQnVmLT5HZXRDaGFyQnlJbmRleCgKLSAgICAgICAgICAgICAgICBtX25QYWdlU3RhcnQgKyBUeHRFZHRQaWVjZS5uU3RhcnQgKyBUeHRFZHRQaWVjZS5uQ291bnQgLSAxKTsKLSAgICAgICAgICAgIGlmICh3Q2hhciA9PSB3UnRDaGFyKSB7Ci0gICAgICAgICAgICAgIGZQYXJhQnJlYWtXaWR0aCArPSBmRGVmQ2hhcldpZHRoOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFR4dEVkdFBpZWNlLnJ0UGllY2UubGVmdCA9IChGWF9GTE9BVClwUGllY2UtPm1faVN0YXJ0UG9zIC8gMjAwMDAuMGY7Ci0gICAgICAgIFR4dEVkdFBpZWNlLnJ0UGllY2UudG9wID0gZkxpbmVQb3M7Ci0gICAgICAgIFR4dEVkdFBpZWNlLnJ0UGllY2Uud2lkdGggPQotICAgICAgICAgICAgKEZYX0ZMT0FUKXBQaWVjZS0+bV9pV2lkdGggLyAyMDAwMC4wZiArIGZQYXJhQnJlYWtXaWR0aDsKLSAgICAgICAgVHh0RWR0UGllY2UucnRQaWVjZS5oZWlnaHQgPSBwUGFyYW1zLT5mTGluZVNwYWNlOwotCi0gICAgICAgIGlmIChiRmlyc3RQaWVjZSkgewotICAgICAgICAgIG1fcnRQYWdlQ29udGVudHMgPSBUeHRFZHRQaWVjZS5ydFBpZWNlOwotICAgICAgICAgIGJGaXJzdFBpZWNlID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbV9ydFBhZ2VDb250ZW50cy5VbmlvbihUeHRFZHRQaWVjZS5ydFBpZWNlKTsKLSAgICAgICAgfQotICAgICAgICBuUGllY2VTdGFydCArPSBUeHRFZHRQaWVjZS5uQ291bnQ7Ci0gICAgICAgIG1fUGllY2VzLnB1c2hfYmFjayhUeHRFZHRQaWVjZSk7Ci0gICAgICAgIGZvciAoaW50MzJfdCBrID0gMDsgayA8IFR4dEVkdFBpZWNlLm5Db3VudDsgaysrKSB7Ci0gICAgICAgICAgQ0ZYX0NoYXIqIHB0YyA9IHBQaWVjZS0+R2V0Q2hhclB0cihrKTsKLSAgICAgICAgICBtX0NoYXJXaWR0aHNbVHh0RWR0UGllY2UublN0YXJ0ICsga10gPSBwdGMtPm1faUNoYXJXaWR0aDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZkxpbmVQb3MgKz0gZkxpbmVTdGVwOwotICAgICAgcEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7Ci0gICAgfQotICAgIGlmIChwSXRlci0+R2V0QXQoKSA9PSBuUGFnZUVuZCAmJiBkd0JyZWFrU3RhdHVzID09IEZYX1RYVEJSRUFLX0xpbmVCcmVhaykgewotICAgICAgYlJlbG9hZCA9IHRydWU7Ci0gICAgICBwSXRlci0+TmV4dCh0cnVlKTsKLSAgICB9Ci0gIH0gd2hpbGUgKHBJdGVyLT5OZXh0KGZhbHNlKSAmJiAocEl0ZXItPkdldEF0KCkgPD0gblBhZ2VFbmQpKTsKLSAgaWYgKG1fcnRQYWdlQ29udGVudHMubGVmdCAhPSAwKSB7Ci0gICAgRlhfRkxPQVQgZkRlbHRhID0gMC4wZjsKLSAgICBpZiAobV9ydFBhZ2VDb250ZW50cy53aWR0aCA8IHBQYXJhbXMtPmZQbGF0ZVdpZHRoKSB7Ci0gICAgICBpZiAocFBhcmFtcy0+ZHdBbGlnbm1lbnQgJiBGREVfVEVYVEVESVRBTElHTl9SaWdodCkgewotICAgICAgICBmRGVsdGEgPSBwUGFyYW1zLT5mUGxhdGVXaWR0aCAtIG1fcnRQYWdlQ29udGVudHMud2lkdGg7Ci0gICAgICB9IGVsc2UgaWYgKHBQYXJhbXMtPmR3QWxpZ25tZW50ICYgRkRFX1RFWFRFRElUQUxJR05fQ2VudGVyKSB7Ci0gICAgICAgIGlmICgocFBhcmFtcy0+ZHdMYXlvdXRTdHlsZXMgJiBGREVfVEVYVEVESVRMQVlPVVRfQ29tYlRleHQpICYmCi0gICAgICAgICAgICBtX25DaGFyQ291bnQgPiAxKSB7Ci0gICAgICAgICAgaW50MzJfdCBuQ291bnQgPSBtX25DaGFyQ291bnQgLSAxOwotICAgICAgICAgIGludDMyX3QgbiA9IChtX3BFZGl0RW5naW5lLT5tX25MaW1pdCAtIG5Db3VudCkgLyAyOwotICAgICAgICAgIGZEZWx0YSA9IChtX3J0UGFnZUNvbnRlbnRzLndpZHRoIC8gbkNvdW50KSAqIG47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZkRlbHRhID0gKHBQYXJhbXMtPmZQbGF0ZVdpZHRoIC0gbV9ydFBhZ2VDb250ZW50cy53aWR0aCkgLyAyOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIEZYX0ZMT0FUIGZPZmZzZXQgPSBtX3J0UGFnZUNvbnRlbnRzLmxlZnQgLSBmRGVsdGE7Ci0gICAgZm9yIChhdXRvJiBwaWVjZSA6IG1fUGllY2VzKQotICAgICAgcGllY2UucnRQaWVjZS5PZmZzZXQoLWZPZmZzZXQsIDAuMGYpOwotCi0gICAgbV9ydFBhZ2VDb250ZW50cy5PZmZzZXQoLWZPZmZzZXQsIDAuMGYpOwotICB9Ci0gIGlmIChtX3BFZGl0RW5naW5lLT5HZXRFZGl0UGFyYW1zKCktPmR3TGF5b3V0U3R5bGVzICYKLSAgICAgIEZERV9URVhURURJVExBWU9VVF9MYXN0TGluZUhlaWdodCkgewotICAgIG1fcnRQYWdlQ29udGVudHMuaGVpZ2h0IC09IHBQYXJhbXMtPmZMaW5lU3BhY2UgLSBwUGFyYW1zLT5mRm9udFNpemU7Ci0gICAgbV9QaWVjZXMuYmFjaygpLnJ0UGllY2UuaGVpZ2h0ID0gcFBhcmFtcy0+ZkZvbnRTaXplOwotICB9Ci0gIG1fblJlZkNvdW50ID0gMTsKLSAgbV9iTG9hZGVkID0gdHJ1ZTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQ0ZERV9UeHRFZHRQYWdlOjpVbmxvYWRQYWdlKGNvbnN0IENGWF9SZWN0RiogcENsaXBCb3gpIHsKLSAgQVNTRVJUKG1fblJlZkNvdW50ID4gMCk7Ci0gIG1fblJlZkNvdW50LS07Ci0gIGlmIChtX25SZWZDb3VudCAhPSAwKQotICAgIHJldHVybjsKLQotICBtX1BpZWNlcy5jbGVhcigpOwotICBtX3BUZXh0U2V0LnJlc2V0KCk7Ci0gIG1fQ2hhcldpZHRocy5jbGVhcigpOwotICBpZiAobV9wQmduUGFyYWcpIHsKLSAgICBtX3BCZ25QYXJhZy0+VW5sb2FkUGFyYWcoKTsKLSAgICBtX3BCZ25QYXJhZyA9IG51bGxwdHI7Ci0gIH0KLSAgaWYgKG1fcEVuZFBhcmFnKSB7Ci0gICAgbV9wRW5kUGFyYWctPlVubG9hZFBhcmFnKCk7Ci0gICAgbV9wRW5kUGFyYWcgPSBudWxscHRyOwotICB9Ci0gIG1fcEl0ZXIucmVzZXQoKTsKLX0KLQotY29uc3QgQ0ZYX1JlY3RGJiBDRkRFX1R4dEVkdFBhZ2U6OkdldENvbnRlbnRzQm94KCkgewotICByZXR1cm4gbV9ydFBhZ2VDb250ZW50czsKLX0KLQotRlhfUE9TSVRJT04gQ0ZERV9UeHRFZHRQYWdlOjpHZXRGaXJzdFBvc2l0aW9uKCkgewotICBpZiAobV9QaWVjZXMuZW1wdHkoKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIChGWF9QT1NJVElPTikxOwotfQotCi1GREVfVEVYVEVESVRQSUVDRSogQ0ZERV9UeHRFZHRQYWdlOjpHZXROZXh0KEZYX1BPU0lUSU9OJiBwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfVmlzdWFsU2V0KiYgcFZpc3VhbFNldCkgewotICBpZiAoIW1fcFRleHRTZXQpIHsKLSAgICBwb3MgPSBudWxscHRyOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIGludDMyX3QgblBvcyA9IChpbnQzMl90KSh1aW50cHRyX3QpcG9zOwotICBwVmlzdWFsU2V0ID0gbV9wVGV4dFNldC5nZXQoKTsKLSAgaWYgKG5Qb3MgKyAxID4gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX1BpZWNlcykpCi0gICAgcG9zID0gbnVsbHB0cjsKLSAgZWxzZQotICAgIHBvcyA9IChGWF9QT1NJVElPTikodWludHB0cl90KShuUG9zICsgMSk7Ci0KLSAgcmV0dXJuICZtX1BpZWNlc1tuUG9zIC0gMV07Ci19Ci0KLUZYX1dDSEFSIENGREVfVHh0RWR0UGFnZTo6R2V0Q2hhcihjb25zdCBGREVfVEVYVEVESVRQSUVDRSogcElkZW50aXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXgpIGNvbnN0IHsKLSAgaW50MzJfdCBuSW5kZXggPSBtX25QYWdlU3RhcnQgKyBwSWRlbnRpdHktPm5TdGFydCArIGluZGV4OwotICBpZiAobkluZGV4ICE9IG1fcEl0ZXItPkdldEF0KCkpCi0gICAgbV9wSXRlci0+U2V0QXQobkluZGV4KTsKLQotICBGWF9XQ0hBUiB3Q2hhciA9IG1fcEl0ZXItPkdldENoYXIoKTsKLSAgbV9wSXRlci0+TmV4dCgpOwotICByZXR1cm4gd0NoYXI7Ci19Ci0KLWludDMyX3QgQ0ZERV9UeHRFZHRQYWdlOjpHZXRXaWR0aChjb25zdCBGREVfVEVYVEVESVRQSUVDRSogcElkZW50aXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXgpIGNvbnN0IHsKLSAgaW50MzJfdCBuV2lkdGggPSBtX0NoYXJXaWR0aHNbcElkZW50aXR5LT5uU3RhcnQgKyBpbmRleF07Ci0gIHJldHVybiBuV2lkdGg7Ci19Ci0KLXZvaWQgQ0ZERV9UeHRFZHRQYWdlOjpOb3JtYWxpemVQdDJSZWN0KENGWF9Qb2ludEYmIHB0RiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRvbGVyYW5jZSkgY29uc3QgewotICBpZiAocnRGLkNvbnRhaW5zKHB0RikpCi0gICAgcmV0dXJuOwotICBpZiAocHRGLnggPCBydEYubGVmdCkKLSAgICBwdEYueCA9IHJ0Ri5sZWZ0OwotICBlbHNlIGlmIChwdEYueCA+PSBydEYucmlnaHQoKSkKLSAgICBwdEYueCA9IHJ0Ri5yaWdodCgpIC0gZlRvbGVyYW5jZTsKLQotICBpZiAocHRGLnkgPCBydEYudG9wKQotICAgIHB0Ri55ID0gcnRGLnRvcDsKLSAgZWxzZSBpZiAocHRGLnkgPj0gcnRGLmJvdHRvbSgpKQotICAgIHB0Ri55ID0gcnRGLmJvdHRvbSgpIC0gZlRvbGVyYW5jZTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9mZGUvY2ZkZV90eHRlZHRwYWdlLmggYi94ZmEvZmRlL2NmZGVfdHh0ZWR0cGFnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2VjN2U3Li4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY2ZkZV90eHRlZHRwYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZERV9DRkRFX1RYVEVEVFBBR0VfSF8KLSNkZWZpbmUgWEZBX0ZERV9DRkRFX1RYVEVEVFBBR0VfSF8KLQotI2luY2x1ZGUgPGRlcXVlPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJ4ZmEvZmRlL2lmZGVfdHh0ZWR0cGFnZS5oIgotI2luY2x1ZGUgInhmYS9mZGUvaWZ4X2NoYXJpdGVyLmgiCi0KLWNsYXNzIENGREVfVHh0RWR0RW5naW5lOwotY2xhc3MgQ0ZERV9UeHRFZHRQYXJhZzsKLWNsYXNzIENGREVfVHh0RWR0VGV4dFNldDsKLQotY2xhc3MgQ0ZERV9UeHRFZHRQYWdlIDogcHVibGljIElGREVfVHh0RWR0UGFnZSB7Ci0gcHVibGljOgotICBDRkRFX1R4dEVkdFBhZ2UoQ0ZERV9UeHRFZHRFbmdpbmUqIHBFbmdpbmUsIGludDMyX3QgbkxpbmVJbmRleCk7Ci0gIH5DRkRFX1R4dEVkdFBhZ2UoKSBvdmVycmlkZTsKLQotICAvLyBJRkRFX1R4dEVkaXRQYWdlOgotICBDRkRFX1R4dEVkdEVuZ2luZSogR2V0RW5naW5lKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGludDMyX3QgR2V0Q2hhclJlY3QoaW50MzJfdCBuSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiByZWN0LAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkJCb3ggPSBmYWxzZSkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGludDMyX3QgR2V0Q2hhckluZGV4KGNvbnN0IENGWF9Qb2ludEYmIGZQb2ludCwgYm9vbCYgYkJlZm9yZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgQ2FsY1JhbmdlUmVjdEFycmF5KGludDMyX3QgblN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q0ZYX1JlY3RGPiogUmVjdEZBcnIpIGNvbnN0IG92ZXJyaWRlOwotICBpbnQzMl90IFNlbGVjdFdvcmQoY29uc3QgQ0ZYX1BvaW50RiYgZlBvaW50LCBpbnQzMl90JiBuQ291bnQpIG92ZXJyaWRlOwotICBpbnQzMl90IEdldENoYXJTdGFydCgpIGNvbnN0IG92ZXJyaWRlOwotICBpbnQzMl90IEdldENoYXJDb3VudCgpIGNvbnN0IG92ZXJyaWRlOwotICBpbnQzMl90IEdldERpc3BsYXlQb3MoY29uc3QgQ0ZYX1JlY3RGJiBydENsaXAsCi0gICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyomIHBDaGFyUG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGKiBwQkJveCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGJvb2wgSXNMb2FkZWQoY29uc3QgQ0ZYX1JlY3RGKiBwQ2xpcEJveCkgb3ZlcnJpZGU7Ci0gIGludDMyX3QgTG9hZFBhZ2UoY29uc3QgQ0ZYX1JlY3RGKiBwQ2xpcEJveCwgSUZYX1BhdXNlKiBwUGF1c2UpIG92ZXJyaWRlOwotICB2b2lkIFVubG9hZFBhZ2UoY29uc3QgQ0ZYX1JlY3RGKiBwQ2xpcEJveCkgb3ZlcnJpZGU7Ci0gIGNvbnN0IENGWF9SZWN0RiYgR2V0Q29udGVudHNCb3goKSBvdmVycmlkZTsKLQotICAvLyBJRkRFX1Zpc3VhbFNldDoKLSAgRkRFX1ZJU1VBTE9CSlRZUEUgR2V0VHlwZSgpIG92ZXJyaWRlOwotICBDRlhfUmVjdEYgR2V0UmVjdChjb25zdCBGREVfVEVYVEVESVRQSUVDRSYgcFBpZWNlKSBvdmVycmlkZTsKLQotICAvLyBJRkRFX0NhbnZhc1NldDoKLSAgRlhfUE9TSVRJT04gR2V0Rmlyc3RQb3NpdGlvbigpIG92ZXJyaWRlOwotICBGREVfVEVYVEVESVRQSUVDRSogR2V0TmV4dChGWF9QT1NJVElPTiYgcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX1Zpc3VhbFNldComIHBWaXN1YWxTZXQpIG92ZXJyaWRlOwotCi0gIC8vIElGWF9UeHRBY2Nlc3M6Ci0gIEZYX1dDSEFSIEdldENoYXIoY29uc3QgRkRFX1RFWFRFRElUUElFQ0UqIHBJZGVudGl0eSwKLSAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4KSBjb25zdCBvdmVycmlkZTsKLSAgaW50MzJfdCBHZXRXaWR0aChjb25zdCBGREVfVEVYVEVESVRQSUVDRSogcElkZW50aXR5LAotICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXgpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBOb3JtYWxpemVQdDJSZWN0KENGWF9Qb2ludEYmIHB0RiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRGLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRvbGVyYW5jZSkgY29uc3Q7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPElGWF9DaGFySXRlcj4gbV9wSXRlcjsKLSAgc3RkOjp1bmlxdWVfcHRyPENGREVfVHh0RWR0VGV4dFNldD4gbV9wVGV4dFNldDsKLSAgQ0ZERV9UeHRFZHRFbmdpbmUqIGNvbnN0IG1fcEVkaXRFbmdpbmU7Ci0gIHN0ZDo6ZGVxdWU8RkRFX1RFWFRFRElUUElFQ0U+IG1fUGllY2VzOwotICBDRkRFX1R4dEVkdFBhcmFnKiBtX3BCZ25QYXJhZzsKLSAgQ0ZERV9UeHRFZHRQYXJhZyogbV9wRW5kUGFyYWc7Ci0gIGludDMyX3QgbV9uUmVmQ291bnQ7Ci0gIGludDMyX3QgbV9uUGFnZVN0YXJ0OwotICBpbnQzMl90IG1fbkNoYXJDb3VudDsKLSAgaW50MzJfdCBtX25QYWdlSW5kZXg7Ci0gIGJvb2wgbV9iTG9hZGVkOwotICBDRlhfUmVjdEYgbV9ydFBhZ2U7Ci0gIENGWF9SZWN0RiBtX3J0UGFnZU1hcmdpbjsKLSAgQ0ZYX1JlY3RGIG1fcnRQYWdlQ29udGVudHM7Ci0gIENGWF9SZWN0RiBtX3J0UGFnZUNhbnZhczsKLSAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gbV9DaGFyV2lkdGhzOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRkRFX0NGREVfVFhURURUUEFHRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9jZmRlX3R4dGVkdHBhcmFnLmNwcCBiL3hmYS9mZGUvY2ZkZV90eHRlZHRwYXJhZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Zjg4YmYuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jZmRlX3R4dGVkdHBhcmFnLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZmRlL2NmZGVfdHh0ZWR0cGFyYWcuaCIKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgInhmYS9mZGUvY2ZkZV90eHRlZHRidWYuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2NmZGVfdHh0ZWR0ZW5naW5lLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9pZmRlX3R4dGVkdGVuZ2luZS5oIgotI2luY2x1ZGUgInhmYS9mZGUvaWZ4X2NoYXJpdGVyLmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvbGF5b3V0L2ZnYXNfdGV4dGJyZWFrLmgiCi0KLUNGREVfVHh0RWR0UGFyYWc6OkNGREVfVHh0RWR0UGFyYWcoQ0ZERV9UeHRFZHRFbmdpbmUqIHBFbmdpbmUpCi0gICAgOiBtX25DaGFyU3RhcnQoMCksCi0gICAgICBtX25DaGFyQ291bnQoMCksCi0gICAgICBtX25MaW5lQ291bnQoMCksCi0gICAgICBtX2xwRGF0YShudWxscHRyKSwKLSAgICAgIG1fcEVuZ2luZShwRW5naW5lKSB7Ci0gIEFTU0VSVChtX3BFbmdpbmUpOwotfQotCi1DRkRFX1R4dEVkdFBhcmFnOjp+Q0ZERV9UeHRFZHRQYXJhZygpIHsKLSAgaWYgKG1fbHBEYXRhKQotICAgIEZYX0ZyZWUobV9scERhdGEpOwotfQotCi12b2lkIENGREVfVHh0RWR0UGFyYWc6OkxvYWRQYXJhZygpIHsKLSAgaWYgKG1fbHBEYXRhKSB7Ci0gICAgbV9scERhdGFbMF0rKzsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ0ZYX1R4dEJyZWFrKiBwVHh0QnJlYWsgPSBtX3BFbmdpbmUtPkdldFRleHRCcmVhaygpOwotICBDRkRFX1R4dEVkdEJ1ZiogcFR4dEJ1ZiA9IG1fcEVuZ2luZS0+R2V0VGV4dEJ1ZigpOwotICBjb25zdCBGREVfVFhURURUUEFSQU1TKiBwUGFyYW0gPSBtX3BFbmdpbmUtPkdldEVkaXRQYXJhbXMoKTsKLSAgRlhfV0NIQVIgd2NBbGlhcyA9IDA7Ci0gIGlmIChwUGFyYW0tPmR3TW9kZSAmIEZERV9URVhURURJVE1PREVfUGFzc3dvcmQpIHsKLSAgICB3Y0FsaWFzID0gbV9wRW5naW5lLT5HZXRBbGlhc0NoYXIoKTsKLSAgfQotICBzdGQ6OnVuaXF1ZV9wdHI8SUZYX0NoYXJJdGVyPiBwSXRlcihuZXcgQ0ZERV9UeHRFZHRCdWY6Okl0ZXJhdG9yKAotICAgICAgc3RhdGljX2Nhc3Q8Q0ZERV9UeHRFZHRCdWYqPihwVHh0QnVmKSwgd2NBbGlhcykpOwotICBwSXRlci0+U2V0QXQobV9uQ2hhclN0YXJ0KTsKLSAgaW50MzJfdCBuRW5kSW5kZXggPSBtX25DaGFyU3RhcnQgKyBtX25DaGFyQ291bnQ7Ci0gIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+IExpbmVCYXNlQXJyOwotICBib29sIGJSZWxvYWQgPSBmYWxzZTsKLSAgdWludDMyX3QgZHdCcmVha1N0YXR1cyA9IEZYX1RYVEJSRUFLX05vbmU7Ci0gIGRvIHsKLSAgICBpZiAoYlJlbG9hZCkgewotICAgICAgZHdCcmVha1N0YXR1cyA9IHBUeHRCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOwotICAgIH0gZWxzZSB7Ci0gICAgICBGWF9XQ0hBUiB3QXBwZW5kID0gcEl0ZXItPkdldENoYXIoKTsKLSAgICAgIGR3QnJlYWtTdGF0dXMgPSBwVHh0QnJlYWstPkFwcGVuZENoYXIod0FwcGVuZCk7Ci0gICAgfQotICAgIGlmIChwSXRlci0+R2V0QXQoKSArIDEgPT0gbkVuZEluZGV4ICYmCi0gICAgICAgIGR3QnJlYWtTdGF0dXMgPCBGWF9UWFRCUkVBS19MaW5lQnJlYWspIHsKLSAgICAgIGR3QnJlYWtTdGF0dXMgPSBwVHh0QnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsKLSAgICB9Ci0gICAgaWYgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7Ci0gICAgICBpbnQzMl90IG5Db3VudCA9IHBUeHRCcmVhay0+Q291bnRCcmVha1BpZWNlcygpOwotICAgICAgaW50MzJfdCBuVG90YWwgPSAwOwotICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbkNvdW50OyBqKyspIHsKLSAgICAgICAgY29uc3QgQ0ZYX1R4dFBpZWNlKiBQaWVjZSA9IHBUeHRCcmVhay0+R2V0QnJlYWtQaWVjZShqKTsKLSAgICAgICAgblRvdGFsICs9IFBpZWNlLT5HZXRMZW5ndGgoKTsKLSAgICAgIH0KLSAgICAgIExpbmVCYXNlQXJyLkFkZChuVG90YWwpOwotICAgICAgcFR4dEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7Ci0gICAgfQotICAgIGlmICgocEl0ZXItPkdldEF0KCkgKyAxID09IG5FbmRJbmRleCkgJiYKLSAgICAgICAgKGR3QnJlYWtTdGF0dXMgPT0gRlhfVFhUQlJFQUtfTGluZUJyZWFrKSkgewotICAgICAgYlJlbG9hZCA9IHRydWU7Ci0gICAgICBwSXRlci0+TmV4dCh0cnVlKTsKLSAgICB9Ci0gIH0gd2hpbGUgKHBJdGVyLT5OZXh0KGZhbHNlKSAmJiAocEl0ZXItPkdldEF0KCkgPCBuRW5kSW5kZXgpKTsKLSAgcFR4dEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7Ci0gIHBUeHRCcmVhay0+Q2xlYXJCcmVha1BpZWNlcygpOwotICBpbnQzMl90IG5MaW5lQ291bnQgPSBMaW5lQmFzZUFyci5HZXRTaXplKCk7Ci0gIG1fbkxpbmVDb3VudCA9IG5MaW5lQ291bnQ7Ci0gIGlmIChtX2xwRGF0YSkgewotICAgIG1fbHBEYXRhID0gRlhfUmVhbGxvYyhpbnQzMl90LCBtX2xwRGF0YSwgbkxpbmVDb3VudCArIDEpOwotICB9IGVsc2UgewotICAgIG1fbHBEYXRhID0gRlhfQWxsb2MoaW50MzJfdCwgbkxpbmVDb3VudCArIDEpOwotICB9Ci0gIGludDMyX3QqIHBJbnRBcnIgPSBtX2xwRGF0YTsKLSAgcEludEFyclswXSA9IDE7Ci0gIG1fbkxpbmVDb3VudCA9IG5MaW5lQ291bnQ7Ci0gIHBJbnRBcnIrKzsKLSAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbkxpbmVDb3VudDsgaisrLCBwSW50QXJyKyspIHsKLSAgICAqcEludEFyciA9IExpbmVCYXNlQXJyW2pdOwotICB9Ci0gIExpbmVCYXNlQXJyLlJlbW92ZUFsbCgpOwotfQotCi12b2lkIENGREVfVHh0RWR0UGFyYWc6OlVubG9hZFBhcmFnKCkgewotICBtX2xwRGF0YVswXS0tOwotICBBU1NFUlQobV9scERhdGFbMF0gPj0gMCk7Ci0gIGlmIChtX2xwRGF0YVswXSA9PSAwKSB7Ci0gICAgRlhfRnJlZShtX2xwRGF0YSk7Ci0gICAgbV9scERhdGEgPSBudWxscHRyOwotICB9Ci19Ci0KLXZvaWQgQ0ZERV9UeHRFZHRQYXJhZzo6Q2FsY0xpbmVzKCkgewotICBDRlhfVHh0QnJlYWsqIHBUeHRCcmVhayA9IG1fcEVuZ2luZS0+R2V0VGV4dEJyZWFrKCk7Ci0gIENGREVfVHh0RWR0QnVmKiBwVHh0QnVmID0gbV9wRW5naW5lLT5HZXRUZXh0QnVmKCk7Ci0gIGludDMyX3QgbkNvdW50ID0gMDsKLSAgdWludDMyX3QgZHdCcmVha1N0YXR1cyA9IEZYX1RYVEJSRUFLX05vbmU7Ci0gIGludDMyX3QgbkVuZEluZGV4ID0gbV9uQ2hhclN0YXJ0ICsgbV9uQ2hhckNvdW50OwotICBzdGQ6OnVuaXF1ZV9wdHI8SUZYX0NoYXJJdGVyPiBwSXRlcigKLSAgICAgIG5ldyBDRkRFX1R4dEVkdEJ1Zjo6SXRlcmF0b3Ioc3RhdGljX2Nhc3Q8Q0ZERV9UeHRFZHRCdWYqPihwVHh0QnVmKSkpOwotICBwSXRlci0+U2V0QXQobV9uQ2hhclN0YXJ0KTsKLSAgYm9vbCBiUmVsb2FkID0gZmFsc2U7Ci0gIGRvIHsKLSAgICBpZiAoYlJlbG9hZCkgewotICAgICAgZHdCcmVha1N0YXR1cyA9IHBUeHRCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOwotICAgIH0gZWxzZSB7Ci0gICAgICBGWF9XQ0hBUiB3QXBwZW5kID0gcEl0ZXItPkdldENoYXIoKTsKLSAgICAgIGR3QnJlYWtTdGF0dXMgPSBwVHh0QnJlYWstPkFwcGVuZENoYXIod0FwcGVuZCk7Ci0gICAgfQotICAgIGlmIChwSXRlci0+R2V0QXQoKSArIDEgPT0gbkVuZEluZGV4ICYmCi0gICAgICAgIGR3QnJlYWtTdGF0dXMgPCBGWF9UWFRCUkVBS19MaW5lQnJlYWspIHsKLSAgICAgIGR3QnJlYWtTdGF0dXMgPSBwVHh0QnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsKLSAgICB9Ci0gICAgaWYgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7Ci0gICAgICBuQ291bnQrKzsKLSAgICAgIHBUeHRCcmVhay0+Q2xlYXJCcmVha1BpZWNlcygpOwotICAgIH0KLSAgICBpZiAoKHBJdGVyLT5HZXRBdCgpICsgMSA9PSBuRW5kSW5kZXgpICYmCi0gICAgICAgIChkd0JyZWFrU3RhdHVzID09IEZYX1RYVEJSRUFLX0xpbmVCcmVhaykpIHsKLSAgICAgIGJSZWxvYWQgPSB0cnVlOwotICAgICAgcEl0ZXItPk5leHQodHJ1ZSk7Ci0gICAgfQotICB9IHdoaWxlIChwSXRlci0+TmV4dChmYWxzZSkgJiYgKHBJdGVyLT5HZXRBdCgpIDwgbkVuZEluZGV4KSk7Ci0gIHBUeHRCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOwotICBwVHh0QnJlYWstPkNsZWFyQnJlYWtQaWVjZXMoKTsKLSAgbV9uTGluZUNvdW50ID0gbkNvdW50OwotfQotCi12b2lkIENGREVfVHh0RWR0UGFyYWc6OkdldExpbmVSYW5nZShpbnQzMl90IG5MaW5lSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuU3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBuQ291bnQpIGNvbnN0IHsKLSAgaW50MzJfdCogcExpbmVCYXNlQXJyID0gbV9scERhdGE7Ci0gIEFTU0VSVChuTGluZUluZGV4IDwgbV9uTGluZUNvdW50KTsKLSAgblN0YXJ0ID0gbV9uQ2hhclN0YXJ0OwotICBwTGluZUJhc2VBcnIrKzsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkxpbmVJbmRleDsgaSsrKSB7Ci0gICAgblN0YXJ0ICs9ICpwTGluZUJhc2VBcnI7Ci0gICAgcExpbmVCYXNlQXJyKys7Ci0gIH0KLSAgbkNvdW50ID0gKnBMaW5lQmFzZUFycjsKLX0KZGlmZiAtLWdpdCBhL3hmYS9mZGUvY2ZkZV90eHRlZHRwYXJhZy5oIGIveGZhL2ZkZS9jZmRlX3R4dGVkdHBhcmFnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MjFmM2IuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jZmRlX3R4dGVkdHBhcmFnLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZERV9DRkRFX1RYVEVEVFBBUkFHX0hfCi0jZGVmaW5lIFhGQV9GREVfQ0ZERV9UWFRFRFRQQVJBR19IXwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLWNsYXNzIENGREVfVHh0RWR0RW5naW5lOwotCi1jbGFzcyBDRkRFX1R4dEVkdFBhcmFnIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENGREVfVHh0RWR0UGFyYWcoQ0ZERV9UeHRFZHRFbmdpbmUqIHBFbmdpbmUpOwotICB+Q0ZERV9UeHRFZHRQYXJhZygpOwotCi0gIGludDMyX3QgR2V0VGV4dExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1fbkNoYXJDb3VudDsgfQotICBpbnQzMl90IEdldFN0YXJ0SW5kZXgoKSBjb25zdCB7IHJldHVybiBtX25DaGFyU3RhcnQ7IH0KLSAgaW50MzJfdCBHZXRMaW5lQ291bnQoKSBjb25zdCB7IHJldHVybiBtX25MaW5lQ291bnQ7IH0KLQotICB2b2lkIFNldFRleHRMZW5ndGgoaW50MzJfdCBsZW4pIHsgbV9uQ2hhckNvdW50ID0gbGVuOyB9Ci0gIHZvaWQgSW5jcmVtZW50VGV4dExlbmd0aChpbnQzMl90IGxlbikgeyBtX25DaGFyQ291bnQgKz0gbGVuOyB9Ci0gIHZvaWQgU2V0U3RhcnRJbmRleChpbnQzMl90IGlkeCkgeyBtX25DaGFyU3RhcnQgPSBpZHg7IH0KLSAgdm9pZCBJbmNyZW1lbnRTdGFydEluZGV4KGludDMyX3QgdmFsKSB7IG1fbkNoYXJTdGFydCArPSB2YWw7IH0KLSAgdm9pZCBEZWNyZW1lbnRTdGFydEluZGV4KGludDMyX3QgdmFsKSB7IG1fbkNoYXJTdGFydCAtPSB2YWw7IH0KLSAgdm9pZCBTZXRMaW5lQ291bnQoaW50MzJfdCBjb3VudCkgeyBtX25MaW5lQ291bnQgPSBjb3VudDsgfQotCi0gIHZvaWQgR2V0TGluZVJhbmdlKGludDMyX3QgbkxpbmVJbmRleCwgaW50MzJfdCYgblN0YXJ0LCBpbnQzMl90JiBuQ291bnQpIGNvbnN0OwotICB2b2lkIExvYWRQYXJhZygpOwotICB2b2lkIFVubG9hZFBhcmFnKCk7Ci0gIHZvaWQgQ2FsY0xpbmVzKCk7Ci0KLSBwcml2YXRlOgotICBpbnQzMl90IG1fbkNoYXJTdGFydDsKLSAgaW50MzJfdCBtX25DaGFyQ291bnQ7Ci0gIGludDMyX3QgbV9uTGluZUNvdW50OwotICBpbnQzMl90KiBtX2xwRGF0YTsKLSAgQ0ZERV9UeHRFZHRFbmdpbmUqIG1fcEVuZ2luZTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZERV9DRkRFX1RYVEVEVFBBUkFHX0hfCmRpZmYgLS1naXQgYS94ZmEvZmRlL2NmZGVfdHh0ZWR0dGV4dHNldC5jcHAgYi94ZmEvZmRlL2NmZGVfdHh0ZWR0dGV4dHNldC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMzJmNzUuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jZmRlX3R4dGVkdHRleHRzZXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZkZS9jZmRlX3R4dGVkdHRleHRzZXQuaCIKLQotI2luY2x1ZGUgInhmYS9mZGUvY2ZkZV90eHRlZHRlbmdpbmUuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2NmZGVfdHh0ZWR0cGFnZS5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2ZvbnQvY2ZnYXNfZ2Vmb250LmgiCi0KLUNGREVfVHh0RWR0VGV4dFNldDo6Q0ZERV9UeHRFZHRUZXh0U2V0KENGREVfVHh0RWR0UGFnZSogcFBhZ2UpCi0gICAgOiBtX3BQYWdlKHBQYWdlKSB7fQotCi1DRkRFX1R4dEVkdFRleHRTZXQ6On5DRkRFX1R4dEVkdFRleHRTZXQoKSB7fQotCi1GREVfVklTVUFMT0JKVFlQRSBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldFR5cGUoKSB7Ci0gIHJldHVybiBGREVfVklTVUFMT0JKX1RleHQ7Ci19Ci0KLUNGWF9SZWN0RiBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldFJlY3QoY29uc3QgRkRFX1RFWFRFRElUUElFQ0UmIHBQaWVjZSkgewotICByZXR1cm4gcFBpZWNlLnJ0UGllY2U7Ci19Ci0KLWludDMyX3QgQ0ZERV9UeHRFZHRUZXh0U2V0OjpHZXRTdHJpbmcoRkRFX1RFWFRFRElUUElFQ0UqIHBQaWVjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgewotICBGWF9XQ0hBUiogcEJ1ZmZlciA9IHdzVGV4dC5HZXRCdWZmZXIocFBpZWNlLT5uQ291bnQpOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwUGllY2UtPm5Db3VudDsgaSsrKQotICAgIHBCdWZmZXJbaV0gPSBtX3BQYWdlLT5HZXRDaGFyKHBQaWVjZSwgaSk7Ci0KLSAgd3NUZXh0LlJlbGVhc2VCdWZmZXIocFBpZWNlLT5uQ291bnQpOwotICByZXR1cm4gcFBpZWNlLT5uQ291bnQ7Ci19Ci0KLUNGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldEZvbnQoKSB7Ci0gIHJldHVybiBtX3BQYWdlLT5HZXRFbmdpbmUoKS0+R2V0RWRpdFBhcmFtcygpLT5wRm9udDsKLX0KLQotRlhfRkxPQVQgQ0ZERV9UeHRFZHRUZXh0U2V0OjpHZXRGb250U2l6ZSgpIHsKLSAgcmV0dXJuIG1fcFBhZ2UtPkdldEVuZ2luZSgpLT5HZXRFZGl0UGFyYW1zKCktPmZGb250U2l6ZTsKLX0KLQotRlhfQVJHQiBDRkRFX1R4dEVkdFRleHRTZXQ6OkdldEZvbnRDb2xvcigpIHsKLSAgcmV0dXJuIG1fcFBhZ2UtPkdldEVuZ2luZSgpLT5HZXRFZGl0UGFyYW1zKCktPmR3Rm9udENvbG9yOwotfQotCi1pbnQzMl90IENGREVfVHh0RWR0VGV4dFNldDo6R2V0RGlzcGxheVBvcyhjb25zdCBGREVfVEVYVEVESVRQSUVDRSYgcGllY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJDaGFyQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nKiBwV1NGb3JtcykgewotICBpbnQzMl90IG5MZW5ndGggPSBwaWVjZS5uQ291bnQ7Ci0gIGlmIChuTGVuZ3RoIDwgMSkKLSAgICByZXR1cm4gMDsKLQotICBDRkRFX1R4dEVkdEVuZ2luZSogcEVuZ2luZSA9Ci0gICAgICBzdGF0aWNfY2FzdDxDRkRFX1R4dEVkdEVuZ2luZSo+KG1fcFBhZ2UtPkdldEVuZ2luZSgpKTsKLSAgY29uc3QgRkRFX1RYVEVEVFBBUkFNUyogcFRleHRQYXJhbXMgPSBwRW5naW5lLT5HZXRFZGl0UGFyYW1zKCk7Ci0gIENGWF9UeHRCcmVhayogcEJyZWFrID0gcEVuZ2luZS0+R2V0VGV4dEJyZWFrKCk7Ci0gIHVpbnQzMl90IGR3TGF5b3V0U3R5bGUgPSBwQnJlYWstPkdldExheW91dFN0eWxlcygpOwotICBGWF9UWFRSVU4gdHI7Ci0gIHRyLnBBY2Nlc3MgPSBtX3BQYWdlOwotICB0ci5wSWRlbnRpdHkgPSAmcGllY2U7Ci0gIHRyLmlMZW5ndGggPSBuTGVuZ3RoOwotICB0ci5wRm9udCA9IHBUZXh0UGFyYW1zLT5wRm9udDsKLSAgdHIuZkZvbnRTaXplID0gcFRleHRQYXJhbXMtPmZGb250U2l6ZTsKLSAgdHIuZHdTdHlsZXMgPSBkd0xheW91dFN0eWxlOwotICB0ci5pQ2hhclJvdGF0aW9uID0gcFRleHRQYXJhbXMtPm5DaGFyUm90YXRpb247Ci0gIHRyLmR3Q2hhclN0eWxlcyA9IHBpZWNlLmR3Q2hhclN0eWxlczsKLSAgdHIucFJlY3QgPSAmcGllY2UucnRQaWVjZTsKLSAgdHIud0xpbmVCcmVha0NoYXIgPSBwVGV4dFBhcmFtcy0+d0xpbmVCcmVha0NoYXI7Ci0gIHJldHVybiBwQnJlYWstPkdldERpc3BsYXlQb3MoJnRyLCBwQ2hhclBvcywgYkNoYXJDb2RlLCBwV1NGb3Jtcyk7Ci19Ci0KLXN0ZDo6dmVjdG9yPENGWF9SZWN0Rj4gQ0ZERV9UeHRFZHRUZXh0U2V0OjpHZXRDaGFyUmVjdHMoCi0gICAgY29uc3QgRkRFX1RFWFRFRElUUElFQ0UqIHBQaWVjZSwKLSAgICBib29sIGJCQm94KSB7Ci0gIGlmICghcFBpZWNlIHx8IHBQaWVjZS0+bkNvdW50IDwgMSkKLSAgICByZXR1cm4gc3RkOjp2ZWN0b3I8Q0ZYX1JlY3RGPigpOwotCi0gIGF1dG8gcEVuZ2luZSA9IHN0YXRpY19jYXN0PENGREVfVHh0RWR0RW5naW5lKj4obV9wUGFnZS0+R2V0RW5naW5lKCkpOwotICBjb25zdCBGREVfVFhURURUUEFSQU1TKiBwVGV4dFBhcmFtcyA9IHBFbmdpbmUtPkdldEVkaXRQYXJhbXMoKTsKLSAgdWludDMyX3QgZHdMYXlvdXRTdHlsZSA9IHBFbmdpbmUtPkdldFRleHRCcmVhaygpLT5HZXRMYXlvdXRTdHlsZXMoKTsKLSAgRlhfVFhUUlVOIHRyOwotICB0ci5wQWNjZXNzID0gbV9wUGFnZTsKLSAgdHIucElkZW50aXR5ID0gcFBpZWNlOwotICB0ci5pTGVuZ3RoID0gcFBpZWNlLT5uQ291bnQ7Ci0gIHRyLnBGb250ID0gcFRleHRQYXJhbXMtPnBGb250OwotICB0ci5mRm9udFNpemUgPSBwVGV4dFBhcmFtcy0+ZkZvbnRTaXplOwotICB0ci5kd1N0eWxlcyA9IGR3TGF5b3V0U3R5bGU7Ci0gIHRyLmlDaGFyUm90YXRpb24gPSBwVGV4dFBhcmFtcy0+bkNoYXJSb3RhdGlvbjsKLSAgdHIuZHdDaGFyU3R5bGVzID0gcFBpZWNlLT5kd0NoYXJTdHlsZXM7Ci0gIHRyLnBSZWN0ID0gJnBQaWVjZS0+cnRQaWVjZTsKLSAgdHIud0xpbmVCcmVha0NoYXIgPSBwVGV4dFBhcmFtcy0+d0xpbmVCcmVha0NoYXI7Ci0gIHJldHVybiBwRW5naW5lLT5HZXRUZXh0QnJlYWsoKS0+R2V0Q2hhclJlY3RzKCZ0ciwgYkJCb3gpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9jZmRlX3R4dGVkdHRleHRzZXQuaCBiL3hmYS9mZGUvY2ZkZV90eHRlZHR0ZXh0c2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYjY1NzguLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jZmRlX3R4dGVkdHRleHRzZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRkRFX0NGREVfVFhURURUVEVYVFNFVF9IXwotI2RlZmluZSBYRkFfRkRFX0NGREVfVFhURURUVEVYVFNFVF9IXwotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAieGZhL2ZkZS9mZGVfdmlzdWFsc2V0LmgiCi0KLWNsYXNzIENGREVfVHh0RWR0UGFnZTsKLQotY2xhc3MgQ0ZERV9UeHRFZHRUZXh0U2V0IDogcHVibGljIElGREVfVGV4dFNldCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDRkRFX1R4dEVkdFRleHRTZXQoQ0ZERV9UeHRFZHRQYWdlKiBwUGFnZSk7Ci0gIH5DRkRFX1R4dEVkdFRleHRTZXQoKSBvdmVycmlkZTsKLQotICAvLyBJRkRFX1Zpc3VhbFNldAotICBGREVfVklTVUFMT0JKVFlQRSBHZXRUeXBlKCkgb3ZlcnJpZGU7Ci0gIENGWF9SZWN0RiBHZXRSZWN0KGNvbnN0IEZERV9URVhURURJVFBJRUNFJiBoVmlzdWFsT2JqKSBvdmVycmlkZTsKLQotICAvLyBJRkRFX1RleHRTZXQKLSAgaW50MzJfdCBHZXRTdHJpbmcoRkRFX1RFWFRFRElUUElFQ0UqIHBQaWVjZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgb3ZlcnJpZGU7Ci0gIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBHZXRGb250KCkgb3ZlcnJpZGU7Ci0gIEZYX0ZMT0FUIEdldEZvbnRTaXplKCkgb3ZlcnJpZGU7Ci0gIEZYX0FSR0IgR2V0Rm9udENvbG9yKCkgb3ZlcnJpZGU7Ci0gIGludDMyX3QgR2V0RGlzcGxheVBvcyhjb25zdCBGREVfVEVYVEVESVRQSUVDRSYgcFBpZWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ2hhckNvZGUgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nKiBwV1NGb3JtcyA9IG51bGxwdHIpIG92ZXJyaWRlOwotICBzdGQ6OnZlY3RvcjxDRlhfUmVjdEY+IEdldENoYXJSZWN0cyhjb25zdCBGREVfVEVYVEVESVRQSUVDRSogcFBpZWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJCQm94KSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIENGREVfVHh0RWR0UGFnZSogY29uc3QgbV9wUGFnZTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZERV9DRkRFX1RYVEVEVFRFWFRTRVRfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZGUvY2ZkZV93b3JkYnJlYWtfZGF0YS5jcHAgYi94ZmEvZmRlL2NmZGVfd29yZGJyZWFrX2RhdGEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNDg2NGIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZmRlL2NmZGVfd29yZGJyZWFrX2RhdGEuY3BwCkBAIC0wLDAgKzEsMjg0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2ZkZS9jZmRlX3dvcmRicmVha19kYXRhLmgiCisKK25hbWVzcGFjZSB7CisKK2VudW0gV29yZEJyZWFrVmFsdWUgOiB1aW50MTZfdCB7CisgIGtXb3JkQnJlYWtWYWx1ZU5vbmUgPSAxIDw8IDAsCisgIGtXb3JkQnJlYWtWYWx1ZUNSID0gMSA8PCAxLAorICBrV29yZEJyZWFrVmFsdWVMRiA9IDEgPDwgMiwKKyAga1dvcmRCcmVha1ZhbHVlTmV3TGluZSA9IDEgPDwgMywKKyAga1dvcmRCcmVha1ZhbHVlRXh0ZW5kID0gMSA8PCA0LAorICBrV29yZEJyZWFrVmFsdWVGb3JtYXQgPSAxIDw8IDUsCisgIGtXb3JkQnJlYWtWYWx1ZUthdGFLYW5hID0gMSA8PCA2LAorICBrV29yZEJyZWFrVmFsdWVBTGV0dGVyID0gMSA8PCA3LAorICBrV29yZEJyZWFrVmFsdWVNaWRMZXR0ZXIgPSAxIDw8IDgsCisgIGtXb3JkQnJlYWtWYWx1ZU1pZE51bSA9IDEgPDwgOSwKKyAga1dvcmRCcmVha1ZhbHVlTWlkTnVtTGV0ID0gMSA8PCAxMCwKKyAga1dvcmRCcmVha1ZhbHVlTnVtZXJpYyA9IDEgPDwgMTEsCisgIGtXb3JkQnJlYWtWYWx1ZUV4dGVuZE51bUxldCA9IDEgPDwgMTIsCit9OworCitzdGF0aWNfYXNzZXJ0KGtXb3JkQnJlYWtWYWx1ZU5vbmUgPT0KKyAgICAgICAgICAgICAgICAgICgxIDw8IHN0YXRpY19jYXN0PGludD4oV29yZEJyZWFrUHJvcGVydHk6OmtOb25lKSksCisgICAgICAgICAgICAgICJXb3JkQnJlYWtWYWx1ZSBtdXN0IG1hdGNoIik7CitzdGF0aWNfYXNzZXJ0KGtXb3JkQnJlYWtWYWx1ZUNSID09CisgICAgICAgICAgICAgICAgICAoMSA8PCBzdGF0aWNfY2FzdDxpbnQ+KFdvcmRCcmVha1Byb3BlcnR5OjprQ1IpKSwKKyAgICAgICAgICAgICAgIldvcmRCcmVha1ZhbHVlIG11c3QgbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoa1dvcmRCcmVha1ZhbHVlTEYgPT0KKyAgICAgICAgICAgICAgICAgICgxIDw8IHN0YXRpY19jYXN0PGludD4oV29yZEJyZWFrUHJvcGVydHk6OmtMRikpLAorICAgICAgICAgICAgICAiV29yZEJyZWFrVmFsdWUgbXVzdCBtYXRjaCIpOworc3RhdGljX2Fzc2VydChrV29yZEJyZWFrVmFsdWVOZXdMaW5lID09CisgICAgICAgICAgICAgICAgICAoMSA8PCBzdGF0aWNfY2FzdDxpbnQ+KFdvcmRCcmVha1Byb3BlcnR5OjprTmV3TGluZSkpLAorICAgICAgICAgICAgICAiV29yZEJyZWFrVmFsdWUgbXVzdCBtYXRjaCIpOworc3RhdGljX2Fzc2VydChrV29yZEJyZWFrVmFsdWVFeHRlbmQgPT0KKyAgICAgICAgICAgICAgICAgICgxIDw8IHN0YXRpY19jYXN0PGludD4oV29yZEJyZWFrUHJvcGVydHk6OmtFeHRlbmQpKSwKKyAgICAgICAgICAgICAgIldvcmRCcmVha1ZhbHVlIG11c3QgbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoa1dvcmRCcmVha1ZhbHVlRm9ybWF0ID09CisgICAgICAgICAgICAgICAgICAoMSA8PCBzdGF0aWNfY2FzdDxpbnQ+KFdvcmRCcmVha1Byb3BlcnR5OjprRm9ybWF0KSksCisgICAgICAgICAgICAgICJXb3JkQnJlYWtWYWx1ZSBtdXN0IG1hdGNoIik7CitzdGF0aWNfYXNzZXJ0KGtXb3JkQnJlYWtWYWx1ZUthdGFLYW5hID09CisgICAgICAgICAgICAgICAgICAoMSA8PCBzdGF0aWNfY2FzdDxpbnQ+KFdvcmRCcmVha1Byb3BlcnR5OjprS2F0YUthbmEpKSwKKyAgICAgICAgICAgICAgIldvcmRCcmVha1ZhbHVlIG11c3QgbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoa1dvcmRCcmVha1ZhbHVlQUxldHRlciA9PQorICAgICAgICAgICAgICAgICAgKDEgPDwgc3RhdGljX2Nhc3Q8aW50PihXb3JkQnJlYWtQcm9wZXJ0eTo6a0FMZXR0ZXIpKSwKKyAgICAgICAgICAgICAgIldvcmRCcmVha1ZhbHVlIG11c3QgbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoa1dvcmRCcmVha1ZhbHVlTWlkTGV0dGVyID09CisgICAgICAgICAgICAgICAgICAoMSA8PCBzdGF0aWNfY2FzdDxpbnQ+KFdvcmRCcmVha1Byb3BlcnR5OjprTWlkTGV0dGVyKSksCisgICAgICAgICAgICAgICJXb3JkQnJlYWtWYWx1ZSBtdXN0IG1hdGNoIik7CitzdGF0aWNfYXNzZXJ0KGtXb3JkQnJlYWtWYWx1ZU1pZE51bSA9PQorICAgICAgICAgICAgICAgICAgKDEgPDwgc3RhdGljX2Nhc3Q8aW50PihXb3JkQnJlYWtQcm9wZXJ0eTo6a01pZE51bSkpLAorICAgICAgICAgICAgICAiV29yZEJyZWFrVmFsdWUgbXVzdCBtYXRjaCIpOworc3RhdGljX2Fzc2VydChrV29yZEJyZWFrVmFsdWVNaWROdW1MZXQgPT0KKyAgICAgICAgICAgICAgICAgICgxIDw8IHN0YXRpY19jYXN0PGludD4oV29yZEJyZWFrUHJvcGVydHk6OmtNaWROdW1MZXQpKSwKKyAgICAgICAgICAgICAgIldvcmRCcmVha1ZhbHVlIG11c3QgbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoa1dvcmRCcmVha1ZhbHVlTnVtZXJpYyA9PQorICAgICAgICAgICAgICAgICAgKDEgPDwgc3RhdGljX2Nhc3Q8aW50PihXb3JkQnJlYWtQcm9wZXJ0eTo6a051bWVyaWMpKSwKKyAgICAgICAgICAgICAgIldvcmRCcmVha1ZhbHVlIG11c3QgbWF0Y2giKTsKK3N0YXRpY19hc3NlcnQoa1dvcmRCcmVha1ZhbHVlRXh0ZW5kTnVtTGV0ID09CisgICAgICAgICAgICAgICAgICAoMSA8PCBzdGF0aWNfY2FzdDxpbnQ+KFdvcmRCcmVha1Byb3BlcnR5OjprRXh0ZW5kTnVtTGV0KSksCisgICAgICAgICAgICAgICJXb3JkQnJlYWtWYWx1ZSBtdXN0IG1hdGNoIik7CisKK30gIC8vIG5hbWVzcGFjZQorCitjb25zdCB1aW50MTZfdCBnc19GWF9Xb3JkQnJlYWtfVGFibGVbXSA9IHsKKyAgICAvLyBXb3JkQnJlYWtQcm9wZXJ0eTo6a05vbmUKKyAgICAweEZGRkYsCisKKyAgICAvLyBXb3JkQnJlYWtQcm9wZXJ0eTo6a0NSCisgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KH4oa1dvcmRCcmVha1ZhbHVlTEYgfCBrV29yZEJyZWFrVmFsdWVDUikpLAorCisgICAgLy8gV29yZEJyZWFrUHJvcGVydHk6OmtMRgorICAgIHN0YXRpY19jYXN0PHVpbnQxNl90Pih+KGtXb3JkQnJlYWtWYWx1ZUxGKSksCisKKyAgICAvLyBXb3JkQnJlYWtQcm9wZXJ0eTo6a05ld0xpbmUKKyAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4ofihrV29yZEJyZWFrVmFsdWVMRikpLAorCisgICAgLy8gV29yZEJyZWFrUHJvcGVydHk6OmtFeHRlbmQKKyAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4ofihrV29yZEJyZWFrVmFsdWVMRikpLAorCisgICAgLy8gV29yZEJyZWFrUHJvcGVyeTo6IGtGb3JtYXQKKyAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4ofihrV29yZEJyZWFrVmFsdWVMRikpLAorCisgICAgLy8gV29yZEJyZWFrUHJvcGVydHk6OmtLYXRhS2FuYQorICAgIHN0YXRpY19jYXN0PHVpbnQxNl90Pih+KGtXb3JkQnJlYWtWYWx1ZUxGIHwga1dvcmRCcmVha1ZhbHVlS2F0YUthbmEgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtXb3JkQnJlYWtWYWx1ZUV4dGVuZE51bUxldCkpLAorCisgICAgLy8gV29yZEJyZWFrUHJvcGVydHk6OmtBTGV0dGVyCisgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KH4oa1dvcmRCcmVha1ZhbHVlTEYgfCBrV29yZEJyZWFrVmFsdWVBTGV0dGVyIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrV29yZEJyZWFrVmFsdWVOdW1lcmljIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrV29yZEJyZWFrVmFsdWVFeHRlbmROdW1MZXQpKSwKKworICAgIC8vIFdvcmRCcmVha1Byb3BlcnR5OjprTWlkTGV0dGVyCisgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KH4oa1dvcmRCcmVha1ZhbHVlTEYpKSwKKworICAgIC8vIFdvcmRCcmVha1Byb3BlcnR5OjprTWlkTnVtCisgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KH4oa1dvcmRCcmVha1ZhbHVlTEYpKSwKKworICAgIC8vIFdvcmRCcmVha1Byb3BlcnR5OjprTWlkTnVtTGV0CisgICAgc3RhdGljX2Nhc3Q8dWludDE2X3Q+KH4oa1dvcmRCcmVha1ZhbHVlTEYpKSwKKworICAgIC8vIFdvcmRCcmVha1Byb3BlcnR5OjprTnVtZXJpYworICAgIHN0YXRpY19jYXN0PHVpbnQxNl90Pih+KGtXb3JkQnJlYWtWYWx1ZUxGIHwga1dvcmRCcmVha1ZhbHVlQUxldHRlciB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga1dvcmRCcmVha1ZhbHVlTnVtZXJpYyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga1dvcmRCcmVha1ZhbHVlRXh0ZW5kTnVtTGV0KSksCisKKyAgICAvLyBXb3JkQnJlYWtQcm9wZXJ0eTo6a0V4dGVuZE51bUxldAorICAgIHN0YXRpY19jYXN0PHVpbnQxNl90Pih+KGtXb3JkQnJlYWtWYWx1ZUxGIHwga1dvcmRCcmVha1ZhbHVlS2F0YUthbmEgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtXb3JkQnJlYWtWYWx1ZUFMZXR0ZXIgfCBrV29yZEJyZWFrVmFsdWVOdW1lcmljIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrV29yZEJyZWFrVmFsdWVFeHRlbmROdW1MZXQpKSwKK307CisKK2NvbnN0IHVpbnQ4X3QgZ3NfRlhfV29yZEJyZWFrX0NvZGVQb2ludFByb3BlcnRpZXNbKDB4RkZGRiAtIDEpIC8gMiArIDFdID0geworICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjMsIDB4MzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwMCwgMHg5MCwgMHhBMCwKKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDg5LCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsIDB4MEMsCisgICAgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHg3MCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHgwOCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHg3MCwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LAorICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsCisgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LAorICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsCisgICAgMHgwMCwgMHg3NywgMHg3NywgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3OCwgMHg3NywgMHg3MCwgMHg3MCwgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4MDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLAorICAgIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDA5LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LAorICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsCisgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHgwNCwgMHgwNCwgMHg0MCwgMHg0NCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKKyAgICAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwKKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDBCLCAweDkwLCAweDc3LCAweDQ3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDcsIDB4NDQsCisgICAgMHg0NCwgMHg0NCwgMHg0NSwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NywgMHg3NCwgMHg0MCwgMHg0NCwgMHg0NCwgMHg3NywKKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDc3LCAweDcwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4NzQsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDA3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsCisgICAgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwKKyAgICAweEJCLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NzcsIDB4MDAsCisgICAgMHg5MCwgMHg3MCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDc0LCAweDQ0LAorICAgIDB4NzQsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4NDQsIDB4NDQsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDQ3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LAorICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDAsIDB4NzQsIDB4NDQsIDB4NDQsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg0NCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwNywgMHg3MCwgMHgwMCwgMHgwMCwKKyAgICAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDA0LCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDA3LAorICAgIDB4NzAsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3MCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHg0NywgMHg0NCwKKyAgICAweDQ0LCAweDQ0LCAweDQwLCAweDA0LCAweDQwLCAweDA0LCAweDQ0LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LAorICAgIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDcsIDB4NzcsIDB4NDQsIDB4MDAsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsCisgICAgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwgMHgwNywgMHg3NywKKyAgICAweDc3LCAweDcwLCAweDAwLCAweDA3LCAweDcwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsIDB4MDcsIDB4NzAsCisgICAgMHg3NywgMHgwMCwgMHg0MCwgMHg0NCwgMHg0NCwgMHg0MCwgMHgwMCwgMHgwNCwgMHg0MCwgMHgwNCwgMHg0NCwgMHgwMCwKKyAgICAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDc3LCAweDcwLCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweEJCLAorICAgIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4NDQsIDB4NzcsIDB4NzQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwNCwgMHg0NCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwNywgMHg3NywgMHgwNywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzAsIDB4NzcsIDB4MDcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4NDcsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4MDQsCisgICAgMHg0NCwgMHgwNCwgMHg0NCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4NDQsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDcsCisgICAgMHg3MCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDAwLCAweDQ3LCAweDQ0LAorICAgIDB4NDQsIDB4NDQsIDB4NDAsIDB4MDQsIDB4NDAsIDB4MDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDQsCisgICAgMHgwMCwgMHgwMCwgMHg3NywgMHgwNywgMHg3NywgMHg0NCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwKKyAgICAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ3LCAweDA3LCAweDc3LAorICAgIDB4NzcsIDB4NzAsIDB4MDAsIDB4NzcsIDB4NzAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDcsIDB4NzAsIDB4NzAsIDB4NzcsCisgICAgMHgwMCwgMHgwNywgMHg3MCwgMHgwMCwgMHg3NywgMHg3MCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDAwLCAweDAwLCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLCAweDQ0LCAweDQwLCAweDQ0LCAweDQ0LCAweDAwLAorICAgIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkIsCisgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDA0LCAweDQ0LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHgwNywgMHg3NywgMHg3NywgMHgwMCwgMHgwNywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHg0NCwKKyAgICAweDQwLCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQwLCAweDc3LCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4NzcsIDB4NDQsIDB4MDAsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywKKyAgICAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4NDcsIDB4NDQsCisgICAgMHg0NCwgMHg0NCwgMHg0MCwgMHg0NCwgMHg0MCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0MCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDc3LCAweDQ0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDQsIDB4MDcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4MDAsIDB4MDcsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDAsIDB4NDQsIDB4NDAsIDB4NDQsIDB4NDQsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg0NCwgMHgwMCwgMHhCQiwKKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4MDAsIDB4NDQsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsCisgICAgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDA3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLAorICAgIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDQsIDB4NDQsIDB4NDQsIDB4NDAsIDB4NDAsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLAorICAgIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4NDQsIDB4NDQsCisgICAgMHg0NCwgMHgwNCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwgMHgwMCwKKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDA0LCAweDQ0LCAweDQ0LCAweDQ0LAorICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDAsIDB4NDQsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsCisgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHgwNCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDAsIDB4NDQsIDB4NDAsIDB4MDQsCisgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwNCwgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDA0LCAweEJCLCAweEJCLCAweEJCLCAweEJCLAorICAgIDB4QkIsIDB4NDQsIDB4NDQsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3MCwgMHg3MCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzAsIDB4NzcsIDB4NzcsIDB4MDAsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDAwLAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwKKyAgICAweDcwLCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDcwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LAorICAgIDB4NzcsIDB4NDQsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsCisgICAgMHg3MCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NDQsCisgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKKyAgICAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLAorICAgIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwKKyAgICAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc0LCAweDcwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsCisgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKKyAgICAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEIwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwKKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQwLCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LAorICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDAsIDB4MDQsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsCisgICAgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4NDQsIDB4NDQsIDB4NDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDQ3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzQsIDB4NDQsIDB4NDQsIDB4NDQsCisgICAgMHg0NCwgMHg0MCwgMHgwMCwgMHg3NywgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwNywgMHg3NywKKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0MCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ3LCAweDc3LCAweDc0LCAweDc3LCAweDc3LCAweDQwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LAorICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHgwMCwKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDcwLCAweDAwLCAweDc3LCAweDcwLCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3MCwgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDU1LAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QUEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QTAsIDB4MDgsCisgICAgMHgzMywgMHg1NSwgMHg1NSwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywKKyAgICAweEMwLCAweDAwLCAweDkwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4NTAsIDB4MDAsIDB4MDAsIDB4NTUsIDB4NTUsIDB4NTUsCisgICAgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LAorICAgIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwNywgMHgwMCwKKyAgICAweDA3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDcwLCAweDcwLCAweDcwLCAweDc3LCAweDc3LCAweDA3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NzcsCisgICAgMHg3NywgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwKKyAgICAweDAwLCAweDA3LCAweDc3LCAweDc0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDcwLAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsCisgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4NDQsCisgICAgMHgwNiwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwNywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDQ2LCAweDYwLCAweDAwLCAweDY2LCAweDY2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjAsIDB4NjYsIDB4NjYsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjAsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LAorICAgIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDQ0LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQ0LCAweDA3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDcwLCAweDA3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg0NywgMHg3NywgMHg0NywgMHg3NywgMHg3NCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LAorICAgIDB4NDQsIDB4NDQsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4QkIsIDB4QkIsIDB4QkIsIDB4QkIsCisgICAgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKKyAgICAweDQ0LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweEJCLCAweEJCLCAweEJCLCAweEJCLAorICAgIDB4QkIsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0LAorICAgIDB4NDQsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwKKyAgICAweDQ0LCAweDQ0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweEJCLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHg3NywgMHg3NCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwKKyAgICAweEJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDQ0LCAweDQwLCAweDA0LAorICAgIDB4NDAsIDB4MDAsIDB4MDAsIDB4NDQsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDAsIDB4NDQsIDB4MDAsCisgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4MDAsIDB4MDcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDA3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDA3LCAweDQ3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzcsIDB4NzcsIDB4NzAsIDB4NzAsCisgICAgMHg3NywgMHgwNywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4MDAsIDB4MDAsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDQsCisgICAgMHg5MCwgMHgwOCwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweEMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4Q0MsIDB4OTAsIDB4QTAsIDB4OTgsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDc3LCAweDc3LCAweDcwLCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwNSwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweDAwLCAweDkwLCAweEEwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4ODksIDB4MDAsIDB4MDAsIDB4MDcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsCisgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwQywgMHgwNywgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDc3LCAweDcwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsIDB4NjYsCisgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKKyAgICAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDY2LCAweDQ0LCAweDc3LCAweDc3LCAweDc3LCAweDc3LAorICAgIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzcsIDB4NzAsCisgICAgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywKKyAgICAweDAwLCAweDc3LCAweDcwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4NTUsIDB4MDAsIDB4MDAsCit9OwpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9jZmRlX3dvcmRicmVha19kYXRhLmggYi94ZmEvZmRlL2NmZGVfd29yZGJyZWFrX2RhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGUyNmNjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2ZkZS9jZmRlX3dvcmRicmVha19kYXRhLmgKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GREVfQ0ZERV9XT1JEQlJFQUtfREFUQV9IXworI2RlZmluZSBYRkFfRkRFX0NGREVfV09SREJSRUFLX0RBVEFfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCitlbnVtIGNsYXNzIFdvcmRCcmVha1Byb3BlcnR5IDogdWludDhfdCB7CisgIGtOb25lID0gMCwKKyAga0NSLAorICBrTEYsCisgIGtOZXdMaW5lLAorICBrRXh0ZW5kLAorICBrRm9ybWF0LAorICBrS2F0YUthbmEsCisgIGtBTGV0dGVyLAorICBrTWlkTGV0dGVyLAorICBrTWlkTnVtLAorICBrTWlkTnVtTGV0LAorICBrTnVtZXJpYywKKyAga0V4dGVuZE51bUxldCwKK307CisKK2V4dGVybiBjb25zdCB1aW50MTZfdCBnc19GWF9Xb3JkQnJlYWtfVGFibGVbXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGdzX0ZYX1dvcmRCcmVha19Db2RlUG9pbnRQcm9wZXJ0aWVzW107CisKKyNlbmRpZiAgLy8gWEZBX0ZERV9DRkRFX1dPUkRCUkVBS19EQVRBX0hfCmRpZmYgLS1naXQgYS94ZmEvZmRlL2NmeF9jaGFyaXRlci5jcHAgYi94ZmEvZmRlL2NmeF9jaGFyaXRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OGVjZDYuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jZnhfY2hhcml0ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZkZS9jZnhfY2hhcml0ZXIuaCIKLQotQ0ZYX0NoYXJJdGVyOjpDRlhfQ2hhckl0ZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkKLSAgICA6IG1fd3NUZXh0KHdzVGV4dCksIG1fbkluZGV4KDApIHsKLSAgQVNTRVJUKCF3c1RleHQuSXNFbXB0eSgpKTsKLX0KLQotQ0ZYX0NoYXJJdGVyOjp+Q0ZYX0NoYXJJdGVyKCkge30KLQotYm9vbCBDRlhfQ2hhckl0ZXI6Ok5leHQoYm9vbCBiUHJldikgewotICBpZiAoYlByZXYpIHsKLSAgICBpZiAobV9uSW5kZXggPD0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBtX25JbmRleC0tOwotICB9IGVsc2UgewotICAgIGlmIChtX25JbmRleCArIDEgPj0gbV93c1RleHQuR2V0TGVuZ3RoKCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgbV9uSW5kZXgrKzsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotRlhfV0NIQVIgQ0ZYX0NoYXJJdGVyOjpHZXRDaGFyKCkgewotICByZXR1cm4gbV93c1RleHQuR2V0QXQobV9uSW5kZXgpOwotfQotCi12b2lkIENGWF9DaGFySXRlcjo6U2V0QXQoaW50MzJfdCBuSW5kZXgpIHsKLSAgaWYgKG5JbmRleCA8IDAgfHwgbkluZGV4ID49IG1fd3NUZXh0LkdldExlbmd0aCgpKQotICAgIHJldHVybjsKLSAgbV9uSW5kZXggPSBuSW5kZXg7Ci19Ci0KLWludDMyX3QgQ0ZYX0NoYXJJdGVyOjpHZXRBdCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fbkluZGV4OwotfQotCi1ib29sIENGWF9DaGFySXRlcjo6SXNFT0YoYm9vbCBiVGFpbCkgY29uc3QgewotICByZXR1cm4gYlRhaWwgPyAobV9uSW5kZXggKyAxID09IG1fd3NUZXh0LkdldExlbmd0aCgpKSA6IChtX25JbmRleCA9PSAwKTsKLX0KLQotSUZYX0NoYXJJdGVyKiBDRlhfQ2hhckl0ZXI6OkNsb25lKCkgewotICBDRlhfQ2hhckl0ZXIqIHBJdGVyID0gbmV3IENGWF9DaGFySXRlcihtX3dzVGV4dCk7Ci0gIHBJdGVyLT5tX25JbmRleCA9IG1fbkluZGV4OwotICByZXR1cm4gcEl0ZXI7Ci19CmRpZmYgLS1naXQgYS94ZmEvZmRlL2NmeF9jaGFyaXRlci5oIGIveGZhL2ZkZS9jZnhfY2hhcml0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEyMmFmMi4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL2NmeF9jaGFyaXRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GREVfQ0ZYX0NIQVJJVEVSX0hfCi0jZGVmaW5lIFhGQV9GREVfQ0ZYX0NIQVJJVEVSX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9pZnhfY2hhcml0ZXIuaCIKLQotY2xhc3MgQ0ZYX0NoYXJJdGVyIDogcHVibGljIElGWF9DaGFySXRlciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDRlhfQ2hhckl0ZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7Ci0gIH5DRlhfQ2hhckl0ZXIoKSBvdmVycmlkZTsKLQotICBib29sIE5leHQoYm9vbCBiUHJldiA9IGZhbHNlKSBvdmVycmlkZTsKLSAgRlhfV0NIQVIgR2V0Q2hhcigpIG92ZXJyaWRlOwotICB2b2lkIFNldEF0KGludDMyX3QgbkluZGV4KSBvdmVycmlkZTsKLSAgaW50MzJfdCBHZXRBdCgpIGNvbnN0IG92ZXJyaWRlOwotICBib29sIElzRU9GKGJvb2wgYlRhaWwgPSB0cnVlKSBjb25zdCBvdmVycmlkZTsKLSAgSUZYX0NoYXJJdGVyKiBDbG9uZSgpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG1fd3NUZXh0OwotICBpbnQzMl90IG1fbkluZGV4OwotfTsKLQotI2VuZGlmICAvLyBYRkFfRkRFX0NGWF9DSEFSSVRFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9jZnhfd29yZGJyZWFrLmNwcCBiL3hmYS9mZGUvY2Z4X3dvcmRicmVhay5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMzdiYTEuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jZnhfd29yZGJyZWFrLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI5NDYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZkZS9jZnhfd29yZGJyZWFrLmgiCi0KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotI2luY2x1ZGUgInhmYS9mZGUvY2Z4X2NoYXJpdGVyLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLWVudW0gRlhfV29yZEJyZWFrUHJvcCB7Ci0gIEZYX1dvcmRCcmVha1Byb3BfTm9uZSA9IDAsCi0gIEZYX1dvcmRCcmVha1Byb3BfQ1IsCi0gIEZYX1dvcmRCcmVha1Byb3BfTEYsCi0gIEZYX1dvcmRCcmVha1Byb3BfTmV3TGluZSwKLSAgRlhfV29yZEJyZWFrUHJvcF9FeHRlbmQsCi0gIEZYX1dvcmRCcmVha1Byb3BfRm9ybWF0LAotICBGWF9Xb3JkQnJlYWtQcm9wX0thdGFLYW5hLAotICBGWF9Xb3JkQnJlYWtQcm9wX0FMZXR0ZXIsCi0gIEZYX1dvcmRCcmVha1Byb3BfTWlkTGV0dGVyLAotICBGWF9Xb3JkQnJlYWtQcm9wX01pZE51bSwKLSAgRlhfV29yZEJyZWFrUHJvcF9NaWROdW1MZXQsCi0gIEZYX1dvcmRCcmVha1Byb3BfTnVtYmVyaWMsCi0gIEZYX1dvcmRCcmVha1Byb3BfRXh0ZW5kTnVtTGV0LAotfTsKLQotY29uc3QgdWludDE2X3QgZ3NfRlhfV29yZEJyZWFrX1RhYmxlWzE2XSA9IHsKLSAgICAweEZGRkYsIDB4RkZGOSwgMHhGRkZCLCAweEZGRkIsIDB4RkZGQiwgMHhGRkZCLCAweEVGQkIsIDB4RTc3QiwKLSAgICAweEZGRkIsIDB4RkZGQiwgMHhGRkZCLCAweEU3N0IsIDB4RTczQiwgMHhGRkZCLCAweEZGRkIsIDB4RkZGQiwKLX07Ci0KLWNvbnN0IHVpbnQ4X3QgZ3NfRlhfV29yZEJyZWFrX0NvZGVQb2ludFByb3BlcnRpZXNbKDB4RkZGRiAtIDEpIC8gMiArIDFdID0KLSAgICAvLyBOT0xJTlRORVhUTElORQotICAgIHsKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMywgMHgzMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwMCwgMHg5MCwgMHhBMCwKLSAgICAgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHg4OSwgMHgwMCwgMHgwMCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwQywKLSAgICAgICAgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHg3MCwgMHgwNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHgwOCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHg3MCwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg3NywgMHg3NywgMHg3MCwgMHg3NywKLSAgICAgICAgMHgwMCwgMHg3NywgMHg3NywgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3OCwgMHg3NywgMHg3MCwgMHg3MCwgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwNywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHgwNCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwKLSAgICAgICAgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHgwNCwgMHgwNCwgMHg0MCwgMHg0NCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg1NSwgMHg1NSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg5OSwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwKLSAgICAgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwQiwgMHg5MCwgMHg3NywgMHg0NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwNywgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NSwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NywgMHg3NCwgMHg0MCwgMHg0NCwgMHg0NCwgMHg3NywKLSAgICAgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHg3NywgMHg3MCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNSwgMHg3NCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHgwNywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwKLSAgICAgICAgMHhCQiwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg3NywgMHgwMCwKLSAgICAgICAgMHg5MCwgMHg3MCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHg0NCwgMHg3NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg3NCwgMHg0NCwKLSAgICAgICAgMHg3NCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHg0NywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHg3NCwgMHg0NCwgMHg0NCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg0NCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwNywgMHg3MCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHgwNCwgMHg0NCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwNywKLSAgICAgICAgMHg3MCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3MCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHg0NywgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0MCwgMHgwNCwgMHg0MCwgMHgwNCwgMHg0NCwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHg3NywgMHgwNywgMHg3NywgMHg0NCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwKLSAgICAgICAgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwgMHgwNywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3MCwgMHgwMCwgMHgwNywgMHg3MCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHgwNywgMHg3MCwKLSAgICAgICAgMHg3NywgMHgwMCwgMHg0MCwgMHg0NCwgMHg0NCwgMHg0MCwgMHgwMCwgMHgwNCwgMHg0MCwgMHgwNCwgMHg0NCwgMHgwMCwKLSAgICAgICAgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHg3NywgMHg3MCwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwKLSAgICAgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHg0NCwgMHg3NywgMHg3NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwNCwgMHg0NCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwNywgMHg3NywgMHgwNywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3MCwgMHg3NywgMHgwNywgMHg3NywgMHg3NywgMHgwMCwgMHg0NywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHgwNCwKLSAgICAgICAgMHg0NCwgMHgwNCwgMHg0NCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg3NywgMHg0NCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwNywKLSAgICAgICAgMHg3MCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHgwNywgMHg3NywgMHg3NywgMHgwMCwgMHg0NywgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0MCwgMHgwNCwgMHg0MCwgMHgwNCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHg3NywgMHgwNywgMHg3NywgMHg0NCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwKLSAgICAgICAgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NywgMHgwNywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3MCwgMHgwMCwgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHgwMCwgMHgwNywgMHg3MCwgMHg3MCwgMHg3NywKLSAgICAgICAgMHgwMCwgMHgwNywgMHg3MCwgMHgwMCwgMHg3NywgMHg3MCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0MCwgMHgwMCwgMHg0NCwgMHg0MCwgMHg0NCwgMHg0NCwgMHgwMCwKLSAgICAgICAgMHg3MCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwKLSAgICAgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwNCwgMHg0NCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHgwNywgMHg3NywgMHg3NywgMHgwMCwgMHgwNywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHg0NCwKLSAgICAgICAgMHg0MCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0MCwgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg3NywgMHg0NCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywKLSAgICAgICAgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwNywgMHg3NywgMHg3NywgMHgwMCwgMHg0NywgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0MCwgMHg0NCwgMHg0MCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0MCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHg3NywgMHg0NCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHgwNywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHgwMCwgMHgwNywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHg0NCwgMHg0MCwgMHg0NCwgMHg0NCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg0NCwgMHgwMCwgMHhCQiwKLSAgICAgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHgwMCwgMHg0NCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwKLSAgICAgICAgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwNywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwKLSAgICAgICAgMHgwMCwgMHg0MCwgMHgwMCwgMHgwNCwgMHg0NCwgMHg0NCwgMHg0MCwgMHg0MCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwKLSAgICAgICAgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHgwNCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwgMHgwMCwKLSAgICAgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwNCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHg0NCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHgwNCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0MCwgMHg0NCwgMHg0MCwgMHgwNCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwNCwgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHgwNCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwKLSAgICAgICAgMHhCQiwgMHg0NCwgMHg0NCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3MCwgMHg3MCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3MCwgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3MCwgMHg3NywgMHg3NywgMHgwMCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHgwMCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwKLSAgICAgICAgMHg3MCwgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3MCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywKLSAgICAgICAgMHg3NywgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywKLSAgICAgICAgMHg3MCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1NSwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwKLSAgICAgICAgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwKLSAgICAgICAgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NCwgMHg3MCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHgwNCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwKLSAgICAgICAgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0MCwgMHgwMCwgMHg3NywgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwNywgMHg3NywKLSAgICAgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0MCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NywgMHg3NywgMHg3NCwgMHg3NywgMHg3NywgMHg0MCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHgwMCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHgwMCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3MCwgMHgwMCwgMHg3NywgMHg3MCwgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3MCwgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg1NSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhBMCwgMHgwOCwKLSAgICAgICAgMHgzMywgMHg1NSwgMHg1NSwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywKLSAgICAgICAgMHhDMCwgMHgwMCwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhDMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHg1MCwgMHgwMCwgMHgwMCwgMHg1NSwgMHg1NSwgMHg1NSwKLSAgICAgICAgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHg3MCwgMHgwMCwgMHgwNywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwNywgMHgwMCwKLSAgICAgICAgMHgwNywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHg3MCwgMHg3MCwgMHg3NywgMHg3NywgMHgwNywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwNywgMHg3NywKLSAgICAgICAgMHg3NywgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwNywgMHg3NywgMHg3NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHgwNiwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwNywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHg0NiwgMHg2MCwgMHgwMCwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKLSAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKLSAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKLSAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKLSAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2MCwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwNywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKLSAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKLSAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2MCwKLSAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKLSAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKLSAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKLSAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NCwgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHgwNywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3MCwgMHgwNywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg0NywgMHg3NywgMHg0NywgMHg3NywgMHg3NCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NCwgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwKLSAgICAgICAgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwNywgMHgwMCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwKLSAgICAgICAgMHhCQiwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwKLSAgICAgICAgMHg0NCwgMHg0NCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNywgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg3NywgMHg3NCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg0NCwgMHgwMCwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwKLSAgICAgICAgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwgMHg0NCwgMHg0MCwgMHgwNCwKLSAgICAgICAgMHg0MCwgMHgwMCwgMHgwMCwgMHg0NCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwgMHg0NCwgMHgwMCwKLSAgICAgICAgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHhCQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwNywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwNywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwNywgMHg0NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3MCwgMHg3MCwKLSAgICAgICAgMHg3NywgMHgwNywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NCwKLSAgICAgICAgMHg5MCwgMHgwOCwgMHg5MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg0MCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHhDMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHhDQywgMHg5MCwgMHhBMCwgMHg5OCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHg3NywgMHg3NywgMHg3MCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwNSwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQSwgMHgwMCwgMHgwMCwgMHg5MCwgMHhBMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHg4OSwgMHgwMCwgMHgwMCwgMHgwNywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwQywgMHgwNywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKLSAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwKLSAgICAgICAgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg2NiwgMHg0NCwgMHg3NywgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3NywgMHg3MCwKLSAgICAgICAgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywgMHgwMCwgMHg3NywgMHg3NywgMHg3NywKLSAgICAgICAgMHgwMCwgMHg3NywgMHg3MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNSwgMHg1NSwgMHgwMCwgMHgwMCwKLX07Ci0KLUZYX1dvcmRCcmVha1Byb3AgR2V0V29yZEJyZWFrUHJvcGVydHkoRlhfV0NIQVIgd2NDb2RlUG9pbnQpIHsKLSAgdWludDMyX3QgZHdQcm9wZXJ0eSA9Ci0gICAgICAodWludDMyX3QpZ3NfRlhfV29yZEJyZWFrX0NvZGVQb2ludFByb3BlcnRpZXNbd2NDb2RlUG9pbnQgPj4gMV07Ci0gIHJldHVybiAoRlhfV29yZEJyZWFrUHJvcCkoKCh3Y0NvZGVQb2ludCkmMSkgPyAoZHdQcm9wZXJ0eSAmIDB4MEYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZHdQcm9wZXJ0eSA+PiA0KSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1DRlhfV29yZEJyZWFrOjpDRlhfV29yZEJyZWFrKCkge30KLQotQ0ZYX1dvcmRCcmVhazo6fkNGWF9Xb3JkQnJlYWsoKSB7fQotCi12b2lkIENGWF9Xb3JkQnJlYWs6OkF0dGFjaChJRlhfQ2hhckl0ZXIqIHBJdGVyKSB7Ci0gIEFTU0VSVChwSXRlcik7Ci0gIG1fcEN1ckl0ZXIucmVzZXQocEl0ZXIpOwotfQotCi12b2lkIENGWF9Xb3JkQnJlYWs6OkF0dGFjaChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7Ci0gIG1fcEN1ckl0ZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0NoYXJJdGVyPih3c1RleHQpOwotfQotCi1ib29sIENGWF9Xb3JkQnJlYWs6Ok5leHQoYm9vbCBiUHJldikgewotICBzdGQ6OnVuaXF1ZV9wdHI8SUZYX0NoYXJJdGVyPiBwSXRlcigKLSAgICAgIChiUHJldiA/IG1fcFByZUl0ZXIgOiBtX3BDdXJJdGVyKS0+Q2xvbmUoKSk7Ci0gIGlmIChwSXRlci0+SXNFT0YoIWJQcmV2KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcEl0ZXItPk5leHQoYlByZXYpOwotICBpZiAoIUZpbmROZXh0QnJlYWtQb3MocEl0ZXIuZ2V0KCksIGJQcmV2LCB0cnVlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGJQcmV2KSB7Ci0gICAgbV9wQ3VySXRlciA9IHN0ZDo6bW92ZShtX3BQcmVJdGVyKTsKLSAgICBtX3BDdXJJdGVyLT5OZXh0KHRydWUpOwotICAgIG1fcFByZUl0ZXIgPSBzdGQ6Om1vdmUocEl0ZXIpOwotICB9IGVsc2UgewotICAgIG1fcFByZUl0ZXIgPSBzdGQ6Om1vdmUobV9wQ3VySXRlcik7Ci0gICAgbV9wUHJlSXRlci0+TmV4dCgpOwotICAgIG1fcEN1ckl0ZXIgPSBzdGQ6Om1vdmUocEl0ZXIpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIENGWF9Xb3JkQnJlYWs6OlNldEF0KGludDMyX3QgbkluZGV4KSB7Ci0gIG1fcFByZUl0ZXIucmVzZXQoKTsKLSAgbV9wQ3VySXRlci0+U2V0QXQobkluZGV4KTsKLSAgRmluZE5leHRCcmVha1BvcyhtX3BDdXJJdGVyLmdldCgpLCB0cnVlLCBmYWxzZSk7Ci0gIG1fcFByZUl0ZXIgPSBzdGQ6Om1vdmUobV9wQ3VySXRlcik7Ci0gIG1fcEN1ckl0ZXIucmVzZXQobV9wUHJlSXRlci0+Q2xvbmUoKSk7Ci0gIEZpbmROZXh0QnJlYWtQb3MobV9wQ3VySXRlci5nZXQoKSwgZmFsc2UsIGZhbHNlKTsKLX0KLQotaW50MzJfdCBDRlhfV29yZEJyZWFrOjpHZXRXb3JkUG9zKCkgY29uc3QgewotICByZXR1cm4gbV9wUHJlSXRlci0+R2V0QXQoKTsKLX0KLQotaW50MzJfdCBDRlhfV29yZEJyZWFrOjpHZXRXb3JkTGVuZ3RoKCkgY29uc3QgewotICByZXR1cm4gbV9wQ3VySXRlci0+R2V0QXQoKSAtIG1fcFByZUl0ZXItPkdldEF0KCkgKyAxOwotfQotCi12b2lkIENGWF9Xb3JkQnJlYWs6OkdldFdvcmQoQ0ZYX1dpZGVTdHJpbmcmIHdzV29yZCkgY29uc3QgewotICBpbnQzMl90IG5Xb3JkTGVuZ3RoID0gR2V0V29yZExlbmd0aCgpOwotICBpZiAobldvcmRMZW5ndGggPD0gMCkgewotICAgIHJldHVybjsKLSAgfQotICBGWF9XQ0hBUiogbHBCdWYgPSB3c1dvcmQuR2V0QnVmZmVyKG5Xb3JkTGVuZ3RoKTsKLSAgc3RkOjp1bmlxdWVfcHRyPElGWF9DaGFySXRlcj4gcFRlbXBJdGVyKG1fcFByZUl0ZXItPkNsb25lKCkpOwotICBpbnQzMl90IGkgPSAwOwotICB3aGlsZSAocFRlbXBJdGVyLT5HZXRBdCgpIDw9IG1fcEN1ckl0ZXItPkdldEF0KCkpIHsKLSAgICBscEJ1ZltpKytdID0gcFRlbXBJdGVyLT5HZXRDaGFyKCk7Ci0gICAgaWYgKCFwVGVtcEl0ZXItPk5leHQoKSkKLSAgICAgIGJyZWFrOwotICB9Ci0gIHdzV29yZC5SZWxlYXNlQnVmZmVyKG5Xb3JkTGVuZ3RoKTsKLX0KLQotYm9vbCBDRlhfV29yZEJyZWFrOjpJc0VPRihib29sIGJUYWlsKSBjb25zdCB7Ci0gIHJldHVybiBtX3BDdXJJdGVyLT5Jc0VPRihiVGFpbCk7Ci19Ci0KLWJvb2wgQ0ZYX1dvcmRCcmVhazo6RmluZE5leHRCcmVha1BvcyhJRlhfQ2hhckl0ZXIqIHBJdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlByZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRnJvbU5leHQpIHsKLSAgRlhfV29yZEJyZWFrUHJvcCBlUHJlVHlwZSA9IEZYX1dvcmRCcmVha1Byb3BfTm9uZTsKLSAgRlhfV29yZEJyZWFrUHJvcCBlQ3VyVHlwZSA9IEZYX1dvcmRCcmVha1Byb3BfTm9uZTsKLSAgRlhfV29yZEJyZWFrUHJvcCBlTmV4dFR5cGUgPSBGWF9Xb3JkQnJlYWtQcm9wX05vbmU7Ci0gIGlmIChwSXRlci0+SXNFT0YoIWJQcmV2KSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmICghKGJGcm9tTmV4dCB8fCBwSXRlci0+SXNFT0YoYlByZXYpKSkgewotICAgIHBJdGVyLT5OZXh0KCFiUHJldik7Ci0gICAgZVByZVR5cGUgPSBHZXRXb3JkQnJlYWtQcm9wZXJ0eShwSXRlci0+R2V0Q2hhcigpKTsKLSAgICBwSXRlci0+TmV4dChiUHJldik7Ci0gIH0KLSAgZUN1clR5cGUgPSBHZXRXb3JkQnJlYWtQcm9wZXJ0eShwSXRlci0+R2V0Q2hhcigpKTsKLSAgYm9vbCBiRmlyc3QgPSB0cnVlOwotICBkbyB7Ci0gICAgcEl0ZXItPk5leHQoYlByZXYpOwotICAgIGVOZXh0VHlwZSA9IEdldFdvcmRCcmVha1Byb3BlcnR5KHBJdGVyLT5HZXRDaGFyKCkpOwotICAgIHVpbnQxNl90IHdCcmVhayA9Ci0gICAgICAgIGdzX0ZYX1dvcmRCcmVha19UYWJsZVtlQ3VyVHlwZV0gJiAoKHVpbnQxNl90KSgxIDw8IGVOZXh0VHlwZSkpOwotICAgIGlmICh3QnJlYWspIHsKLSAgICAgIGlmIChwSXRlci0+SXNFT0YoIWJQcmV2KSkgewotICAgICAgICBwSXRlci0+TmV4dCghYlByZXYpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChiRmlyc3QpIHsKLSAgICAgICAgaW50MzJfdCBuRmxhZ3MgPSAwOwotICAgICAgICBpZiAoZUN1clR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9NaWRMZXR0ZXIpIHsKLSAgICAgICAgICBpZiAoZU5leHRUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfQUxldHRlcikgewotICAgICAgICAgICAgbkZsYWdzID0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZUN1clR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9NaWROdW0pIHsKLSAgICAgICAgICBpZiAoZU5leHRUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfTnVtYmVyaWMpIHsKLSAgICAgICAgICAgIG5GbGFncyA9IDI7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGVDdXJUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfTWlkTnVtTGV0KSB7Ci0gICAgICAgICAgaWYgKGVOZXh0VHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX0FMZXR0ZXIpIHsKLSAgICAgICAgICAgIG5GbGFncyA9IDE7Ci0gICAgICAgICAgfSBlbHNlIGlmIChlTmV4dFR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9OdW1iZXJpYykgewotICAgICAgICAgICAgbkZsYWdzID0gMjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5GbGFncyA+IDApIHsKLSAgICAgICAgICBBU1NFUlQobkZsYWdzIDw9IDIpOwotICAgICAgICAgIGlmICghKChuRmxhZ3MgPT0gMSAmJiBlUHJlVHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX0FMZXR0ZXIpIHx8Ci0gICAgICAgICAgICAgICAgKG5GbGFncyA9PSAyICYmIGVQcmVUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfTnVtYmVyaWMpKSkgewotICAgICAgICAgICAgcEl0ZXItPk5leHQoIWJQcmV2KTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBwSXRlci0+TmV4dChiUHJldik7Ci0gICAgICAgICAgd0JyZWFrID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgYkZpcnN0ID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAod0JyZWFrKSB7Ci0gICAgICAgIGludDMyX3QgbkZsYWdzID0gMDsKLSAgICAgICAgaWYgKGVOZXh0VHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX01pZExldHRlcikgewotICAgICAgICAgIGlmIChlQ3VyVHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX0FMZXR0ZXIpIHsKLSAgICAgICAgICAgIG5GbGFncyA9IDE7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGVOZXh0VHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX01pZE51bSkgewotICAgICAgICAgIGlmIChlQ3VyVHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX051bWJlcmljKSB7Ci0gICAgICAgICAgICBuRmxhZ3MgPSAyOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChlTmV4dFR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9NaWROdW1MZXQpIHsKLSAgICAgICAgICBpZiAoZUN1clR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9BTGV0dGVyKSB7Ci0gICAgICAgICAgICBuRmxhZ3MgPSAxOwotICAgICAgICAgIH0gZWxzZSBpZiAoZUN1clR5cGUgPT0gRlhfV29yZEJyZWFrUHJvcF9OdW1iZXJpYykgewotICAgICAgICAgICAgbkZsYWdzID0gMjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5GbGFncyA8PSAwKSB7Ci0gICAgICAgICAgcEl0ZXItPk5leHQoIWJQcmV2KTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBBU1NFUlQobkZsYWdzIDw9IDIpOwotICAgICAgICBwSXRlci0+TmV4dChiUHJldik7Ci0gICAgICAgIGVOZXh0VHlwZSA9IChGWF9Xb3JkQnJlYWtQcm9wKUdldFdvcmRCcmVha1Byb3BlcnR5KHBJdGVyLT5HZXRDaGFyKCkpOwotICAgICAgICBpZiAoISgobkZsYWdzID09IDEgJiYgZU5leHRUeXBlID09IEZYX1dvcmRCcmVha1Byb3BfQUxldHRlcikgfHwKLSAgICAgICAgICAgICAgKG5GbGFncyA9PSAyICYmIGVOZXh0VHlwZSA9PSBGWF9Xb3JkQnJlYWtQcm9wX051bWJlcmljKSkpIHsKLSAgICAgICAgICBwSXRlci0+TmV4dCghYlByZXYpOwotICAgICAgICAgIHBJdGVyLT5OZXh0KCFiUHJldik7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZVByZVR5cGUgPSBlQ3VyVHlwZTsKLSAgICBlQ3VyVHlwZSA9IGVOZXh0VHlwZTsKLSAgICBiRmlyc3QgPSBmYWxzZTsKLSAgfSB3aGlsZSAoIXBJdGVyLT5Jc0VPRighYlByZXYpKTsKLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS94ZmEvZmRlL2NmeF93b3JkYnJlYWsuaCBiL3hmYS9mZGUvY2Z4X3dvcmRicmVhay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGY2ZWRhLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY2Z4X3dvcmRicmVhay5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GREVfQ0ZYX1dPUkRCUkVBS19IXwotI2RlZmluZSBYRkFfRkRFX0NGWF9XT1JEQlJFQUtfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLQotY2xhc3MgSUZYX0NoYXJJdGVyOwotCi1jbGFzcyBDRlhfV29yZEJyZWFrIHsKLSBwdWJsaWM6Ci0gIENGWF9Xb3JkQnJlYWsoKTsKLSAgfkNGWF9Xb3JkQnJlYWsoKTsKLQotICB2b2lkIEF0dGFjaChJRlhfQ2hhckl0ZXIqIHBJdGVyKTsKLSAgdm9pZCBBdHRhY2goY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7Ci0gIGJvb2wgTmV4dChib29sIGJQcmV2KTsKLSAgdm9pZCBTZXRBdChpbnQzMl90IG5JbmRleCk7Ci0gIGludDMyX3QgR2V0V29yZFBvcygpIGNvbnN0OwotICBpbnQzMl90IEdldFdvcmRMZW5ndGgoKSBjb25zdDsKLSAgdm9pZCBHZXRXb3JkKENGWF9XaWRlU3RyaW5nJiB3c1dvcmQpIGNvbnN0OwotICBib29sIElzRU9GKGJvb2wgYlRhaWwpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgotICBib29sIEZpbmROZXh0QnJlYWtQb3MoSUZYX0NoYXJJdGVyKiBwSXRlciwgYm9vbCBiUHJldiwgYm9vbCBiRnJvbU5leHQgPSB0cnVlKTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6dW5pcXVlX3B0cjxJRlhfQ2hhckl0ZXI+IG1fcFByZUl0ZXI7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxJRlhfQ2hhckl0ZXI+IG1fcEN1ckl0ZXI7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GREVfQ0ZYX1dPUkRCUkVBS19IXwpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9jc3MvY2ZkZV9jc3Njb2xvcnZhbHVlLmNwcCBiL3hmYS9mZGUvY3NzL2NmZGVfY3NzY29sb3J2YWx1ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNTM1NTEuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jc3MvY2ZkZV9jc3Njb2xvcnZhbHVlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3NzY29sb3J2YWx1ZS5oIgotCi1DRkRFX0NTU0NvbG9yVmFsdWU6OkNGREVfQ1NTQ29sb3JWYWx1ZShGWF9BUkdCIHZhbHVlKQotICAgIDogQ0ZERV9DU1NWYWx1ZShGREVfQ1NTUHJpbWl0aXZlVHlwZTo6UkdCKSwgdmFsdWVfKHZhbHVlKSB7fQotCi1DRkRFX0NTU0NvbG9yVmFsdWU6On5DRkRFX0NTU0NvbG9yVmFsdWUoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9jc3MvY2ZkZV9jc3Njb2xvcnZhbHVlLmggYi94ZmEvZmRlL2Nzcy9jZmRlX2Nzc2NvbG9ydmFsdWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQwNDQxYS4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc2NvbG9ydmFsdWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRkRFX0NTU19DRkRFX0NTU0NPTE9SVkFMVUVfSF8KLSNkZWZpbmUgWEZBX0ZERV9DU1NfQ0ZERV9DU1NDT0xPUlZBTFVFX0hfCi0KLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3ZhbHVlLmgiCi0KLWNsYXNzIENGREVfQ1NTQ29sb3JWYWx1ZSA6IHB1YmxpYyBDRkRFX0NTU1ZhbHVlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENGREVfQ1NTQ29sb3JWYWx1ZShGWF9BUkdCIGNvbG9yKTsKLSAgfkNGREVfQ1NTQ29sb3JWYWx1ZSgpIG92ZXJyaWRlOwotCi0gIEZYX0FSR0IgVmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV87IH0KLQotIHByaXZhdGU6Ci0gIEZYX0FSR0IgdmFsdWVfOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRkRFX0NTU19DRkRFX0NTU0NPTE9SVkFMVUVfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZGUvY3NzL2NmZGVfY3NzY29tcHV0ZWRzdHlsZS5jcHAgYi94ZmEvZmRlL2Nzcy9jZmRlX2Nzc2NvbXB1dGVkc3R5bGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTg3MmQxLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY3NzL2NmZGVfY3NzY29tcHV0ZWRzdHlsZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3Njb21wdXRlZHN0eWxlLmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NzdHJpbmd2YWx1ZS5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3NzdmFsdWVsaXN0LmgiCi0KLUNGREVfQ1NTQ29tcHV0ZWRTdHlsZTo6Q0ZERV9DU1NDb21wdXRlZFN0eWxlKCkge30KLQotQ0ZERV9DU1NDb21wdXRlZFN0eWxlOjp+Q0ZERV9DU1NDb21wdXRlZFN0eWxlKCkge30KLQotYm9vbCBDRkRFX0NTU0NvbXB1dGVkU3R5bGU6OkdldEN1c3RvbVN0eWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpIGNvbnN0IHsKLSAgZm9yIChhdXRvIGl0ZXIgPSBtX0N1c3RvbVByb3BlcnRpZXMucmJlZ2luKCk7Ci0gICAgICAgaXRlciAhPSBtX0N1c3RvbVByb3BlcnRpZXMucmVuZCgpOyBpdGVyKyspIHsKLSAgICBpZiAod3NOYW1lID09IGl0ZXItPm5hbWUoKSkgewotICAgICAgd3NWYWx1ZSA9IGl0ZXItPnZhbHVlKCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1pbnQzMl90IENGREVfQ1NTQ29tcHV0ZWRTdHlsZTo6Q291bnRGb250RmFtaWxpZXMoKSBjb25zdCB7Ci0gIHJldHVybiBtX0luaGVyaXRlZERhdGEubV9wRm9udEZhbWlseQotICAgICAgICAgICAgID8gbV9Jbmhlcml0ZWREYXRhLm1fcEZvbnRGYW1pbHktPkNvdW50VmFsdWVzKCkKLSAgICAgICAgICAgICA6IDA7Ci19Ci0KLWNvbnN0IENGWF9XaWRlU3RyaW5nIENGREVfQ1NTQ29tcHV0ZWRTdHlsZTo6R2V0Rm9udEZhbWlseShpbnQzMl90IGluZGV4KSBjb25zdCB7Ci0gIHJldHVybiBtX0luaGVyaXRlZERhdGEubV9wRm9udEZhbWlseS0+R2V0VmFsdWUoaW5kZXgpCi0gICAgICAuQXM8Q0ZERV9DU1NTdHJpbmdWYWx1ZT4oKQotICAgICAgLT5WYWx1ZSgpOwotfQotCi11aW50MTZfdCBDRkRFX0NTU0NvbXB1dGVkU3R5bGU6OkdldEZvbnRXZWlnaHQoKSBjb25zdCB7Ci0gIHJldHVybiBtX0luaGVyaXRlZERhdGEubV93Rm9udFdlaWdodDsKLX0KLQotRkRFX0NTU0ZvbnRWYXJpYW50IENGREVfQ1NTQ29tcHV0ZWRTdHlsZTo6R2V0Rm9udFZhcmlhbnQoKSBjb25zdCB7Ci0gIHJldHVybiBtX0luaGVyaXRlZERhdGEubV9lRm9udFZhcmlhbnQ7Ci19Ci0KLUZERV9DU1NGb250U3R5bGUgQ0ZERV9DU1NDb21wdXRlZFN0eWxlOjpHZXRGb250U3R5bGUoKSBjb25zdCB7Ci0gIHJldHVybiBtX0luaGVyaXRlZERhdGEubV9lRm9udFN0eWxlOwotfQotCi1GWF9GTE9BVCBDRkRFX0NTU0NvbXB1dGVkU3R5bGU6OkdldEZvbnRTaXplKCkgY29uc3QgewotICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplOwotfQotCi1GWF9BUkdCIENGREVfQ1NTQ29tcHV0ZWRTdHlsZTo6R2V0Q29sb3IoKSBjb25zdCB7Ci0gIHJldHVybiBtX0luaGVyaXRlZERhdGEubV9kd0ZvbnRDb2xvcjsKLX0KLQotdm9pZCBDRkRFX0NTU0NvbXB1dGVkU3R5bGU6OlNldEZvbnRXZWlnaHQodWludDE2X3Qgd0ZvbnRXZWlnaHQpIHsKLSAgbV9Jbmhlcml0ZWREYXRhLm1fd0ZvbnRXZWlnaHQgPSB3Rm9udFdlaWdodDsKLX0KLQotdm9pZCBDRkRFX0NTU0NvbXB1dGVkU3R5bGU6OlNldEZvbnRWYXJpYW50KEZERV9DU1NGb250VmFyaWFudCBlRm9udFZhcmlhbnQpIHsKLSAgbV9Jbmhlcml0ZWREYXRhLm1fZUZvbnRWYXJpYW50ID0gZUZvbnRWYXJpYW50OwotfQotCi12b2lkIENGREVfQ1NTQ29tcHV0ZWRTdHlsZTo6U2V0Rm9udFN0eWxlKEZERV9DU1NGb250U3R5bGUgZUZvbnRTdHlsZSkgewotICBtX0luaGVyaXRlZERhdGEubV9lRm9udFN0eWxlID0gZUZvbnRTdHlsZTsKLX0KLQotdm9pZCBDRkRFX0NTU0NvbXB1dGVkU3R5bGU6OlNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgewotICBtX0luaGVyaXRlZERhdGEubV9mRm9udFNpemUgPSBmRm9udFNpemU7Ci19Ci0KLXZvaWQgQ0ZERV9DU1NDb21wdXRlZFN0eWxlOjpTZXRDb2xvcihGWF9BUkdCIGR3Rm9udENvbG9yKSB7Ci0gIG1fSW5oZXJpdGVkRGF0YS5tX2R3Rm9udENvbG9yID0gZHdGb250Q29sb3I7Ci19Ci0KLWNvbnN0IEZERV9DU1NSZWN0KiBDRkRFX0NTU0NvbXB1dGVkU3R5bGU6OkdldEJvcmRlcldpZHRoKCkgY29uc3QgewotICByZXR1cm4gbV9Ob25Jbmhlcml0ZWREYXRhLm1fYkhhc0JvcmRlciA/ICYobV9Ob25Jbmhlcml0ZWREYXRhLm1fQm9yZGVyV2lkdGgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cjsKLX0KLQotY29uc3QgRkRFX0NTU1JlY3QqIENGREVfQ1NTQ29tcHV0ZWRTdHlsZTo6R2V0TWFyZ2luV2lkdGgoKSBjb25zdCB7Ci0gIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9iSGFzTWFyZ2luID8gJihtX05vbkluaGVyaXRlZERhdGEubV9NYXJnaW5XaWR0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyOwotfQotCi1jb25zdCBGREVfQ1NTUmVjdCogQ0ZERV9DU1NDb21wdXRlZFN0eWxlOjpHZXRQYWRkaW5nV2lkdGgoKSBjb25zdCB7Ci0gIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9iSGFzUGFkZGluZyA/ICYobV9Ob25Jbmhlcml0ZWREYXRhLm1fUGFkZGluZ1dpZHRoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyOwotfQotCi12b2lkIENGREVfQ1NTQ29tcHV0ZWRTdHlsZTo6U2V0TWFyZ2luV2lkdGgoY29uc3QgRkRFX0NTU1JlY3QmIHJlY3QpIHsKLSAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fTWFyZ2luV2lkdGggPSByZWN0OwotICBtX05vbkluaGVyaXRlZERhdGEubV9iSGFzTWFyZ2luID0gdHJ1ZTsKLX0KLQotdm9pZCBDRkRFX0NTU0NvbXB1dGVkU3R5bGU6OlNldFBhZGRpbmdXaWR0aChjb25zdCBGREVfQ1NTUmVjdCYgcmVjdCkgewotICBtX05vbkluaGVyaXRlZERhdGEubV9QYWRkaW5nV2lkdGggPSByZWN0OwotICBtX05vbkluaGVyaXRlZERhdGEubV9iSGFzUGFkZGluZyA9IHRydWU7Ci19Ci0KLUZERV9DU1NEaXNwbGF5IENGREVfQ1NTQ29tcHV0ZWRTdHlsZTo6R2V0RGlzcGxheSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VEaXNwbGF5OwotfQotCi1GWF9GTE9BVCBDRkRFX0NTU0NvbXB1dGVkU3R5bGU6OkdldExpbmVIZWlnaHQoKSBjb25zdCB7Ci0gIHJldHVybiBtX0luaGVyaXRlZERhdGEubV9mTGluZUhlaWdodDsKLX0KLQotY29uc3QgRkRFX0NTU0xlbmd0aCYgQ0ZERV9DU1NDb21wdXRlZFN0eWxlOjpHZXRUZXh0SW5kZW50KCkgY29uc3QgewotICByZXR1cm4gbV9Jbmhlcml0ZWREYXRhLm1fVGV4dEluZGVudDsKLX0KLQotRkRFX0NTU1RleHRBbGlnbiBDRkRFX0NTU0NvbXB1dGVkU3R5bGU6OkdldFRleHRBbGlnbigpIGNvbnN0IHsKLSAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX2VUZXh0QWxpZ247Ci19Ci0KLUZERV9DU1NWZXJ0aWNhbEFsaWduIENGREVfQ1NTQ29tcHV0ZWRTdHlsZTo6R2V0VmVydGljYWxBbGlnbigpIGNvbnN0IHsKLSAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2VWZXJ0aWNhbEFsaWduOwotfQotCi1GWF9GTE9BVCBDRkRFX0NTU0NvbXB1dGVkU3R5bGU6OkdldE51bWJlclZlcnRpY2FsQWxpZ24oKSBjb25zdCB7Ci0gIHJldHVybiBtX05vbkluaGVyaXRlZERhdGEubV9mVmVydGljYWxBbGlnbjsKLX0KLQotdWludDMyX3QgQ0ZERV9DU1NDb21wdXRlZFN0eWxlOjpHZXRUZXh0RGVjb3JhdGlvbigpIGNvbnN0IHsKLSAgcmV0dXJuIG1fTm9uSW5oZXJpdGVkRGF0YS5tX2R3VGV4dERlY29yYXRpb247Ci19Ci0KLWNvbnN0IEZERV9DU1NMZW5ndGgmIENGREVfQ1NTQ29tcHV0ZWRTdHlsZTo6R2V0TGV0dGVyU3BhY2luZygpIGNvbnN0IHsKLSAgcmV0dXJuIG1fSW5oZXJpdGVkRGF0YS5tX0xldHRlclNwYWNpbmc7Ci19Ci0KLXZvaWQgQ0ZERV9DU1NDb21wdXRlZFN0eWxlOjpTZXRMaW5lSGVpZ2h0KEZYX0ZMT0FUIGZMaW5lSGVpZ2h0KSB7Ci0gIG1fSW5oZXJpdGVkRGF0YS5tX2ZMaW5lSGVpZ2h0ID0gZkxpbmVIZWlnaHQ7Ci19Ci0KLXZvaWQgQ0ZERV9DU1NDb21wdXRlZFN0eWxlOjpTZXRUZXh0SW5kZW50KGNvbnN0IEZERV9DU1NMZW5ndGgmIHRleHRJbmRlbnQpIHsKLSAgbV9Jbmhlcml0ZWREYXRhLm1fVGV4dEluZGVudCA9IHRleHRJbmRlbnQ7Ci19Ci0KLXZvaWQgQ0ZERV9DU1NDb21wdXRlZFN0eWxlOjpTZXRUZXh0QWxpZ24oRkRFX0NTU1RleHRBbGlnbiBlVGV4dEFsaWduKSB7Ci0gIG1fSW5oZXJpdGVkRGF0YS5tX2VUZXh0QWxpZ24gPSBlVGV4dEFsaWduOwotfQotCi12b2lkIENGREVfQ1NTQ29tcHV0ZWRTdHlsZTo6U2V0TnVtYmVyVmVydGljYWxBbGlnbihGWF9GTE9BVCBmQWxpZ24pIHsKLSAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZVZlcnRpY2FsQWxpZ24gPSBGREVfQ1NTVmVydGljYWxBbGlnbjo6TnVtYmVyLAotICBtX05vbkluaGVyaXRlZERhdGEubV9mVmVydGljYWxBbGlnbiA9IGZBbGlnbjsKLX0KLQotdm9pZCBDRkRFX0NTU0NvbXB1dGVkU3R5bGU6OlNldFRleHREZWNvcmF0aW9uKHVpbnQzMl90IGR3VGV4dERlY29yYXRpb24pIHsKLSAgbV9Ob25Jbmhlcml0ZWREYXRhLm1fZHdUZXh0RGVjb3JhdGlvbiA9IGR3VGV4dERlY29yYXRpb247Ci19Ci0KLXZvaWQgQ0ZERV9DU1NDb21wdXRlZFN0eWxlOjpTZXRMZXR0ZXJTcGFjaW5nKAotICAgIGNvbnN0IEZERV9DU1NMZW5ndGgmIGxldHRlclNwYWNpbmcpIHsKLSAgbV9Jbmhlcml0ZWREYXRhLm1fTGV0dGVyU3BhY2luZyA9IGxldHRlclNwYWNpbmc7Ci19Ci0KLXZvaWQgQ0ZERV9DU1NDb21wdXRlZFN0eWxlOjpBZGRDdXN0b21TdHlsZShjb25zdCBDRkRFX0NTU0N1c3RvbVByb3BlcnR5JiBwcm9wKSB7Ci0gIC8vIEZvcmNlIHRoZSBwcm9wZXJ0eSB0byBiZSBjb3BpZWQgc28gd2UgYXJlbid0IGRlcGVuZGVudCBvbiB0aGUgbGlmZXRpbWUKLSAgLy8gb2Ygd2hhdGV2ZXIgY3VycmVudGx5IG93bnMgaXQuCi0gIG1fQ3VzdG9tUHJvcGVydGllcy5wdXNoX2JhY2socHJvcCk7Ci19Ci0KLUNGREVfQ1NTQ29tcHV0ZWRTdHlsZTo6SW5oZXJpdGVkRGF0YTo6SW5oZXJpdGVkRGF0YSgpCi0gICAgOiBtX0xldHRlclNwYWNpbmcoRkRFX0NTU0xlbmd0aFVuaXQ6Ok5vcm1hbCksCi0gICAgICBtX1dvcmRTcGFjaW5nKEZERV9DU1NMZW5ndGhVbml0OjpOb3JtYWwpLAotICAgICAgbV9UZXh0SW5kZW50KEZERV9DU1NMZW5ndGhVbml0OjpQb2ludCwgMCksCi0gICAgICBtX3BGb250RmFtaWx5KG51bGxwdHIpLAotICAgICAgbV9mRm9udFNpemUoMTIuMGYpLAotICAgICAgbV9mTGluZUhlaWdodCgxNC4wZiksCi0gICAgICBtX2R3Rm9udENvbG9yKDB4RkYwMDAwMDApLAotICAgICAgbV93Rm9udFdlaWdodCg0MDApLAotICAgICAgbV9lRm9udFZhcmlhbnQoRkRFX0NTU0ZvbnRWYXJpYW50OjpOb3JtYWwpLAotICAgICAgbV9lRm9udFN0eWxlKEZERV9DU1NGb250U3R5bGU6Ok5vcm1hbCksCi0gICAgICBtX2VUZXh0QWxpZ24oRkRFX0NTU1RleHRBbGlnbjo6TGVmdCkge30KLQotQ0ZERV9DU1NDb21wdXRlZFN0eWxlOjpJbmhlcml0ZWREYXRhOjp+SW5oZXJpdGVkRGF0YSgpIHt9Ci0KLUNGREVfQ1NTQ29tcHV0ZWRTdHlsZTo6Tm9uSW5oZXJpdGVkRGF0YTo6Tm9uSW5oZXJpdGVkRGF0YSgpCi0gICAgOiBtX01hcmdpbldpZHRoKEZERV9DU1NMZW5ndGhVbml0OjpQb2ludCwgMCksCi0gICAgICBtX0JvcmRlcldpZHRoKEZERV9DU1NMZW5ndGhVbml0OjpQb2ludCwgMCksCi0gICAgICBtX1BhZGRpbmdXaWR0aChGREVfQ1NTTGVuZ3RoVW5pdDo6UG9pbnQsIDApLAotICAgICAgbV9mVmVydGljYWxBbGlnbigwLjBmKSwKLSAgICAgIG1fZURpc3BsYXkoRkRFX0NTU0Rpc3BsYXk6OklubGluZSksCi0gICAgICBtX2VWZXJ0aWNhbEFsaWduKEZERV9DU1NWZXJ0aWNhbEFsaWduOjpCYXNlbGluZSksCi0gICAgICBtX2R3VGV4dERlY29yYXRpb24oMCksCi0gICAgICBtX2JIYXNNYXJnaW4oZmFsc2UpLAotICAgICAgbV9iSGFzQm9yZGVyKGZhbHNlKSwKLSAgICAgIG1fYkhhc1BhZGRpbmcoZmFsc2UpIHt9CmRpZmYgLS1naXQgYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc2NvbXB1dGVkc3R5bGUuaCBiL3hmYS9mZGUvY3NzL2NmZGVfY3NzY29tcHV0ZWRzdHlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmE0Y2NiLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY3NzL2NmZGVfY3NzY29tcHV0ZWRzdHlsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRkRFX0NTU19DRkRFX0NTU0NPTVBVVEVEU1RZTEVfSF8KLSNkZWZpbmUgWEZBX0ZERV9DU1NfQ0ZERV9DU1NDT01QVVRFRFNUWUxFX0hfCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc2N1c3RvbXByb3BlcnR5LmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvZmRlX2Nzcy5oIgotCi1jbGFzcyBDRkRFX0NTU1ZhbHVlTGlzdDsKLQotY2xhc3MgQ0ZERV9DU1NDb21wdXRlZFN0eWxlIDogcHVibGljIENGWF9SZXRhaW5hYmxlIHsKLSBwdWJsaWM6Ci0gIGNsYXNzIEluaGVyaXRlZERhdGEgewotICAgcHVibGljOgotICAgIEluaGVyaXRlZERhdGEoKTsKLSAgICB+SW5oZXJpdGVkRGF0YSgpOwotCi0gICAgRkRFX0NTU0xlbmd0aCBtX0xldHRlclNwYWNpbmc7Ci0gICAgRkRFX0NTU0xlbmd0aCBtX1dvcmRTcGFjaW5nOwotICAgIEZERV9DU1NMZW5ndGggbV9UZXh0SW5kZW50OwotICAgIENGWF9SZXRhaW5QdHI8Q0ZERV9DU1NWYWx1ZUxpc3Q+IG1fcEZvbnRGYW1pbHk7Ci0gICAgRlhfRkxPQVQgbV9mRm9udFNpemU7Ci0gICAgRlhfRkxPQVQgbV9mTGluZUhlaWdodDsKLSAgICBGWF9BUkdCIG1fZHdGb250Q29sb3I7Ci0gICAgdWludDE2X3QgbV93Rm9udFdlaWdodDsKLSAgICBGREVfQ1NTRm9udFZhcmlhbnQgbV9lRm9udFZhcmlhbnQ7Ci0gICAgRkRFX0NTU0ZvbnRTdHlsZSBtX2VGb250U3R5bGU7Ci0gICAgRkRFX0NTU1RleHRBbGlnbiBtX2VUZXh0QWxpZ247Ci0gIH07Ci0KLSAgY2xhc3MgTm9uSW5oZXJpdGVkRGF0YSB7Ci0gICBwdWJsaWM6Ci0gICAgTm9uSW5oZXJpdGVkRGF0YSgpOwotCi0gICAgRkRFX0NTU1JlY3QgbV9NYXJnaW5XaWR0aDsKLSAgICBGREVfQ1NTUmVjdCBtX0JvcmRlcldpZHRoOwotICAgIEZERV9DU1NSZWN0IG1fUGFkZGluZ1dpZHRoOwotICAgIEZERV9DU1NMZW5ndGggbV9Ub3A7Ci0gICAgRkRFX0NTU0xlbmd0aCBtX0JvdHRvbTsKLSAgICBGREVfQ1NTTGVuZ3RoIG1fTGVmdDsKLSAgICBGREVfQ1NTTGVuZ3RoIG1fUmlnaHQ7Ci0gICAgRlhfRkxPQVQgbV9mVmVydGljYWxBbGlnbjsKLSAgICBGREVfQ1NTRGlzcGxheSBtX2VEaXNwbGF5OwotICAgIEZERV9DU1NWZXJ0aWNhbEFsaWduIG1fZVZlcnRpY2FsQWxpZ247Ci0gICAgdWludDhfdCBtX2R3VGV4dERlY29yYXRpb247Ci0gICAgYm9vbCBtX2JIYXNNYXJnaW47Ci0gICAgYm9vbCBtX2JIYXNCb3JkZXI7Ci0gICAgYm9vbCBtX2JIYXNQYWRkaW5nOwotICB9OwotCi0gIGludDMyX3QgQ291bnRGb250RmFtaWxpZXMoKSBjb25zdDsKLSAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgR2V0Rm9udEZhbWlseShpbnQzMl90IGluZGV4KSBjb25zdDsKLSAgdWludDE2X3QgR2V0Rm9udFdlaWdodCgpIGNvbnN0OwotICBGREVfQ1NTRm9udFZhcmlhbnQgR2V0Rm9udFZhcmlhbnQoKSBjb25zdDsKLSAgRkRFX0NTU0ZvbnRTdHlsZSBHZXRGb250U3R5bGUoKSBjb25zdDsKLSAgRlhfRkxPQVQgR2V0Rm9udFNpemUoKSBjb25zdDsKLSAgRlhfQVJHQiBHZXRDb2xvcigpIGNvbnN0OwotICB2b2lkIFNldEZvbnRXZWlnaHQodWludDE2X3Qgd0ZvbnRXZWlnaHQpOwotICB2b2lkIFNldEZvbnRWYXJpYW50KEZERV9DU1NGb250VmFyaWFudCBlRm9udFZhcmlhbnQpOwotICB2b2lkIFNldEZvbnRTdHlsZShGREVfQ1NTRm9udFN0eWxlIGVGb250U3R5bGUpOwotICB2b2lkIFNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSk7Ci0gIHZvaWQgU2V0Q29sb3IoRlhfQVJHQiBkd0ZvbnRDb2xvcik7Ci0KLSAgY29uc3QgRkRFX0NTU1JlY3QqIEdldEJvcmRlcldpZHRoKCkgY29uc3Q7Ci0gIGNvbnN0IEZERV9DU1NSZWN0KiBHZXRNYXJnaW5XaWR0aCgpIGNvbnN0OwotICBjb25zdCBGREVfQ1NTUmVjdCogR2V0UGFkZGluZ1dpZHRoKCkgY29uc3Q7Ci0gIHZvaWQgU2V0TWFyZ2luV2lkdGgoY29uc3QgRkRFX0NTU1JlY3QmIHJlY3QpOwotICB2b2lkIFNldFBhZGRpbmdXaWR0aChjb25zdCBGREVfQ1NTUmVjdCYgcmVjdCk7Ci0KLSAgRkRFX0NTU0Rpc3BsYXkgR2V0RGlzcGxheSgpIGNvbnN0OwotCi0gIEZYX0ZMT0FUIEdldExpbmVIZWlnaHQoKSBjb25zdDsKLSAgY29uc3QgRkRFX0NTU0xlbmd0aCYgR2V0VGV4dEluZGVudCgpIGNvbnN0OwotICBGREVfQ1NTVGV4dEFsaWduIEdldFRleHRBbGlnbigpIGNvbnN0OwotICBGREVfQ1NTVmVydGljYWxBbGlnbiBHZXRWZXJ0aWNhbEFsaWduKCkgY29uc3Q7Ci0gIEZYX0ZMT0FUIEdldE51bWJlclZlcnRpY2FsQWxpZ24oKSBjb25zdDsKLSAgdWludDMyX3QgR2V0VGV4dERlY29yYXRpb24oKSBjb25zdDsKLSAgY29uc3QgRkRFX0NTU0xlbmd0aCYgR2V0TGV0dGVyU3BhY2luZygpIGNvbnN0OwotICB2b2lkIFNldExpbmVIZWlnaHQoRlhfRkxPQVQgZkxpbmVIZWlnaHQpOwotICB2b2lkIFNldFRleHRJbmRlbnQoY29uc3QgRkRFX0NTU0xlbmd0aCYgdGV4dEluZGVudCk7Ci0gIHZvaWQgU2V0VGV4dEFsaWduKEZERV9DU1NUZXh0QWxpZ24gZVRleHRBbGlnbik7Ci0gIHZvaWQgU2V0TnVtYmVyVmVydGljYWxBbGlnbihGWF9GTE9BVCBmQWxpZ24pOwotICB2b2lkIFNldFRleHREZWNvcmF0aW9uKHVpbnQzMl90IGR3VGV4dERlY29yYXRpb24pOwotICB2b2lkIFNldExldHRlclNwYWNpbmcoY29uc3QgRkRFX0NTU0xlbmd0aCYgbGV0dGVyU3BhY2luZyk7Ci0gIHZvaWQgQWRkQ3VzdG9tU3R5bGUoY29uc3QgQ0ZERV9DU1NDdXN0b21Qcm9wZXJ0eSYgcHJvcCk7Ci0KLSAgYm9vbCBHZXRDdXN0b21TdHlsZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKSBjb25zdDsKLQotICBJbmhlcml0ZWREYXRhIG1fSW5oZXJpdGVkRGF0YTsKLSAgTm9uSW5oZXJpdGVkRGF0YSBtX05vbkluaGVyaXRlZERhdGE7Ci0KLSBwcml2YXRlOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KLSAgZnJpZW5kIENGWF9SZXRhaW5QdHI8VD4gcGRmaXVtOjpNYWtlUmV0YWluKEFyZ3MmJi4uLiBhcmdzKTsKLQotICBDRkRFX0NTU0NvbXB1dGVkU3R5bGUoKTsKLSAgfkNGREVfQ1NTQ29tcHV0ZWRTdHlsZSgpIG92ZXJyaWRlOwotCi0gIHN0ZDo6dmVjdG9yPENGREVfQ1NTQ3VzdG9tUHJvcGVydHk+IG1fQ3VzdG9tUHJvcGVydGllczsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZERV9DU1NfQ0ZERV9DU1NDT01QVVRFRFNUWUxFX0hfCmRpZmYgLS1naXQgYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc2N1c3RvbXByb3BlcnR5LmNwcCBiL3hmYS9mZGUvY3NzL2NmZGVfY3NzY3VzdG9tcHJvcGVydHkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmIyODhlLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY3NzL2NmZGVfY3NzY3VzdG9tcHJvcGVydHkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NjdXN0b21wcm9wZXJ0eS5oIgotCi1DRkRFX0NTU0N1c3RvbVByb3BlcnR5OjpDRkRFX0NTU0N1c3RvbVByb3BlcnR5KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgdmFsdWUpCi0gICAgOiBuYW1lXyhuYW1lKSwgdmFsdWVfKHZhbHVlKSB7fQotCi1DRkRFX0NTU0N1c3RvbVByb3BlcnR5OjpDRkRFX0NTU0N1c3RvbVByb3BlcnR5KAotICAgIGNvbnN0IENGREVfQ1NTQ3VzdG9tUHJvcGVydHkmIHByb3ApCi0gICAgOiBuYW1lXyhwcm9wLm5hbWVfKSwgdmFsdWVfKHByb3AudmFsdWVfKSB7fQotCi1DRkRFX0NTU0N1c3RvbVByb3BlcnR5Ojp+Q0ZERV9DU1NDdXN0b21Qcm9wZXJ0eSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc2N1c3RvbXByb3BlcnR5LmggYi94ZmEvZmRlL2Nzcy9jZmRlX2Nzc2N1c3RvbXByb3BlcnR5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NzBkNDkuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jc3MvY2ZkZV9jc3NjdXN0b21wcm9wZXJ0eS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GREVfQ1NTX0NGREVfQ1NTQ1VTVE9NUFJPUEVSVFlfSF8KLSNkZWZpbmUgWEZBX0ZERV9DU1NfQ0ZERV9DU1NDVVNUT01QUk9QRVJUWV9IXwotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLQotY2xhc3MgQ0ZERV9DU1NDdXN0b21Qcm9wZXJ0eSB7Ci0gcHVibGljOgotICBDRkRFX0NTU0N1c3RvbVByb3BlcnR5KGNvbnN0IENGWF9XaWRlU3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSk7Ci0gIENGREVfQ1NTQ3VzdG9tUHJvcGVydHkoY29uc3QgQ0ZERV9DU1NDdXN0b21Qcm9wZXJ0eSYgcHJvcCk7Ci0gIH5DRkRFX0NTU0N1c3RvbVByb3BlcnR5KCk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG5hbWVfOyB9Ci0gIENGWF9XaWRlU3RyaW5nIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfOyB9Ci0KLSBwcml2YXRlOgotICBDRlhfV2lkZVN0cmluZyBuYW1lXzsKLSAgQ0ZYX1dpZGVTdHJpbmcgdmFsdWVfOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRkRFX0NTU19DRkRFX0NTU0NVU1RPTVBST1BFUlRZX0hfCmRpZmYgLS1naXQgYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc2RlY2xhcmF0aW9uLmNwcCBiL3hmYS9mZGUvY3NzL2NmZGVfY3NzZGVjbGFyYXRpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzc3NmNhLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY3NzL2NmZGVfY3NzZGVjbGFyYXRpb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjM5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3NzZGVjbGFyYXRpb24uaCIKLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3NzY29sb3J2YWx1ZS5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3NzY3VzdG9tcHJvcGVydHkuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc2VudW12YWx1ZS5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3NzbnVtYmVydmFsdWUuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3Byb3BlcnR5aG9sZGVyLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NzdHJpbmd2YWx1ZS5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3NzdmFsdWVsaXN0LmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3N2YWx1ZWxpc3RwYXJzZXIuaCIKLQotbmFtZXNwYWNlIHsKLQotdWludDhfdCBIZXgyRGVjKHVpbnQ4X3QgaGV4SGlnaCwgdWludDhfdCBoZXhMb3cpIHsKLSAgcmV0dXJuIChGWFNZU190b0hleERpZ2l0KGhleEhpZ2gpIDw8IDQpICsgRlhTWVNfdG9IZXhEaWdpdChoZXhMb3cpOwotfQotCi1ib29sIFBhcnNlQ1NTTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4sCi0gICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgIEZERV9DU1NOdW1iZXJUeXBlJiBlVW5pdCkgewotICBBU1NFUlQocHN6VmFsdWUgJiYgaVZhbHVlTGVuID4gMCk7Ci0gIGludDMyX3QgaVVzZWRMZW4gPSAwOwotICBmVmFsdWUgPSBGWFNZU193Y3N0b2YocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJmlVc2VkTGVuKTsKLSAgaWYgKGlVc2VkTGVuIDw9IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlWYWx1ZUxlbiAtPSBpVXNlZExlbjsKLSAgcHN6VmFsdWUgKz0gaVVzZWRMZW47Ci0gIGVVbml0ID0gRkRFX0NTU051bWJlclR5cGU6Ok51bWJlcjsKLSAgaWYgKGlWYWx1ZUxlbiA+PSAxICYmICpwc3pWYWx1ZSA9PSAnJScpIHsKLSAgICBlVW5pdCA9IEZERV9DU1NOdW1iZXJUeXBlOjpQZXJjZW50OwotICB9IGVsc2UgaWYgKGlWYWx1ZUxlbiA9PSAyKSB7Ci0gICAgY29uc3QgRkRFX0NTU0xlbmd0aFVuaXRUYWJsZSogcFVuaXQgPQotICAgICAgICBGREVfR2V0Q1NTTGVuZ3RoVW5pdEJ5TmFtZShDRlhfV2lkZVN0cmluZ0MocHN6VmFsdWUsIDIpKTsKLSAgICBpZiAocFVuaXQpCi0gICAgICBlVW5pdCA9IHBVbml0LT53VmFsdWU7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLWJvb2wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VDU1NTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogaU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogaUxlbmd0aCkgewotICBBU1NFUlQocHN6VmFsdWUgJiYgaVZhbHVlTGVuID4gMCk7Ci0gICppT2Zmc2V0ID0gMDsKLSAgKmlMZW5ndGggPSBpVmFsdWVMZW47Ci0gIGlmIChpVmFsdWVMZW4gPj0gMikgewotICAgIEZYX1dDSEFSIGZpcnN0ID0gcHN6VmFsdWVbMF0sIGxhc3QgPSBwc3pWYWx1ZVtpVmFsdWVMZW4gLSAxXTsKLSAgICBpZiAoKGZpcnN0ID09ICdcIicgJiYgbGFzdCA9PSAnXCInKSB8fCAoZmlyc3QgPT0gJ1wnJyAmJiBsYXN0ID09ICdcJycpKSB7Ci0gICAgICAqaU9mZnNldCA9IDE7Ci0gICAgICAqaUxlbmd0aCAtPSAyOwotICAgIH0KLSAgfQotICByZXR1cm4gaVZhbHVlTGVuID4gMDsKLX0KLQotLy8gc3RhdGljLgotYm9vbCBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUNTU0NvbG9yKGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCKiBkd0NvbG9yKSB7Ci0gIEFTU0VSVChwc3pWYWx1ZSAmJiBpVmFsdWVMZW4gPiAwKTsKLSAgQVNTRVJUKGR3Q29sb3IpOwotCi0gIGlmICgqcHN6VmFsdWUgPT0gJyMnKSB7Ci0gICAgc3dpdGNoIChpVmFsdWVMZW4pIHsKLSAgICAgIGNhc2UgNDogewotICAgICAgICB1aW50OF90IHJlZCA9IEhleDJEZWMoKHVpbnQ4X3QpcHN6VmFsdWVbMV0sICh1aW50OF90KXBzelZhbHVlWzFdKTsKLSAgICAgICAgdWludDhfdCBncmVlbiA9IEhleDJEZWMoKHVpbnQ4X3QpcHN6VmFsdWVbMl0sICh1aW50OF90KXBzelZhbHVlWzJdKTsKLSAgICAgICAgdWludDhfdCBibHVlID0gSGV4MkRlYygodWludDhfdClwc3pWYWx1ZVszXSwgKHVpbnQ4X3QpcHN6VmFsdWVbM10pOwotICAgICAgICAqZHdDb2xvciA9IEFyZ2JFbmNvZGUoMjU1LCByZWQsIGdyZWVuLCBibHVlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBjYXNlIDc6IHsKLSAgICAgICAgdWludDhfdCByZWQgPSBIZXgyRGVjKCh1aW50OF90KXBzelZhbHVlWzFdLCAodWludDhfdClwc3pWYWx1ZVsyXSk7Ci0gICAgICAgIHVpbnQ4X3QgZ3JlZW4gPSBIZXgyRGVjKCh1aW50OF90KXBzelZhbHVlWzNdLCAodWludDhfdClwc3pWYWx1ZVs0XSk7Ci0gICAgICAgIHVpbnQ4X3QgYmx1ZSA9IEhleDJEZWMoKHVpbnQ4X3QpcHN6VmFsdWVbNV0sICh1aW50OF90KXBzelZhbHVlWzZdKTsKLSAgICAgICAgKmR3Q29sb3IgPSBBcmdiRW5jb2RlKDI1NSwgcmVkLCBncmVlbiwgYmx1ZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIGlmIChpVmFsdWVMZW4gPj0gMTApIHsKLSAgICBpZiAocHN6VmFsdWVbaVZhbHVlTGVuIC0gMV0gIT0gJyknIHx8IEZYU1lTX3djc25pY21wKEwicmdiKCIsIHBzelZhbHVlLCA0KSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHVpbnQ4X3QgcmdiWzNdID0gezB9OwotICAgIEZYX0ZMT0FUIGZWYWx1ZTsKLSAgICBGREVfQ1NTUHJpbWl0aXZlVHlwZSBlVHlwZTsKLSAgICBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciBsaXN0KHBzelZhbHVlICsgNCwgaVZhbHVlTGVuIC0gNSwgJywnKTsKLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzOyArK2kpIHsKLSAgICAgIGlmICghbGlzdC5OZXh0VmFsdWUoZVR5cGUsIHBzelZhbHVlLCBpVmFsdWVMZW4pKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoZVR5cGUgIT0gRkRFX0NTU1ByaW1pdGl2ZVR5cGU6Ok51bWJlcikKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgRkRFX0NTU051bWJlclR5cGUgZU51bVR5cGU7Ci0gICAgICBpZiAoIVBhcnNlQ1NTTnVtYmVyKHBzelZhbHVlLCBpVmFsdWVMZW4sIGZWYWx1ZSwgZU51bVR5cGUpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHJnYltpXSA9IGVOdW1UeXBlID09IEZERV9DU1NOdW1iZXJUeXBlOjpQZXJjZW50Ci0gICAgICAgICAgICAgICAgICAgPyBGWFNZU19yb3VuZChmVmFsdWUgKiAyLjU1ZikKLSAgICAgICAgICAgICAgICAgICA6IEZYU1lTX3JvdW5kKGZWYWx1ZSk7Ci0gICAgfQotICAgICpkd0NvbG9yID0gQXJnYkVuY29kZSgyNTUsIHJnYlswXSwgcmdiWzFdLCByZ2JbMl0pOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgY29uc3QgRkRFX0NTU0NPTE9SVEFCTEUqIHBDb2xvciA9Ci0gICAgICBGREVfR2V0Q1NTQ29sb3JCeU5hbWUoQ0ZYX1dpZGVTdHJpbmdDKHBzelZhbHVlLCBpVmFsdWVMZW4pKTsKLSAgaWYgKCFwQ29sb3IpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gICpkd0NvbG9yID0gcENvbG9yLT5kd1ZhbHVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotQ0ZERV9DU1NEZWNsYXJhdGlvbjo6Q0ZERV9DU1NEZWNsYXJhdGlvbigpIHt9Ci0KLUNGREVfQ1NTRGVjbGFyYXRpb246On5DRkRFX0NTU0RlY2xhcmF0aW9uKCkge30KLQotQ0ZYX1JldGFpblB0cjxDRkRFX0NTU1ZhbHVlPiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpHZXRQcm9wZXJ0eSgKLSAgICBGREVfQ1NTUHJvcGVydHkgZVByb3BlcnR5LAotICAgIGJvb2wqIGJJbXBvcnRhbnQpIGNvbnN0IHsKLSAgZm9yIChjb25zdCBhdXRvJiBwIDogcHJvcGVydGllc18pIHsKLSAgICBpZiAocC0+ZVByb3BlcnR5ID09IGVQcm9wZXJ0eSkgewotICAgICAgKmJJbXBvcnRhbnQgPSBwLT5iSW1wb3J0YW50OwotICAgICAgcmV0dXJuIHAtPnBWYWx1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLXZvaWQgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6QWRkUHJvcGVydHlIb2xkZXIoRkRFX0NTU1Byb3BlcnR5IGVQcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JldGFpblB0cjxDRkRFX0NTU1ZhbHVlPiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkltcG9ydGFudCkgewotICBhdXRvIHBIb2xkZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZERV9DU1NQcm9wZXJ0eUhvbGRlcj4oKTsKLSAgcEhvbGRlci0+YkltcG9ydGFudCA9IGJJbXBvcnRhbnQ7Ci0gIHBIb2xkZXItPmVQcm9wZXJ0eSA9IGVQcm9wZXJ0eTsKLSAgcEhvbGRlci0+cFZhbHVlID0gcFZhbHVlOwotICBwcm9wZXJ0aWVzXy5wdXNoX2JhY2soc3RkOjptb3ZlKHBIb2xkZXIpKTsKLX0KLQotdm9pZCBDRkRFX0NTU0RlY2xhcmF0aW9uOjpBZGRQcm9wZXJ0eShjb25zdCBGREVfQ1NTUHJvcGVydHlUYWJsZSogcFRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHZhbHVlKSB7Ci0gIEFTU0VSVCghdmFsdWUuSXNFbXB0eSgpKTsKLQotICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUgPSB2YWx1ZS5jX3N0cigpOwotICBpbnQzMl90IGlWYWx1ZUxlbiA9IHZhbHVlLkdldExlbmd0aCgpOwotCi0gIGJvb2wgYkltcG9ydGFudCA9IGZhbHNlOwotICBpZiAoaVZhbHVlTGVuID49IDEwICYmIHBzelZhbHVlW2lWYWx1ZUxlbiAtIDEwXSA9PSAnIScgJiYKLSAgICAgIEZYU1lTX3djc25pY21wKEwiaW1wb3J0YW50IiwgcHN6VmFsdWUgKyBpVmFsdWVMZW4gLSA5LCA5KSA9PSAwKSB7Ci0gICAgaWYgKChpVmFsdWVMZW4gLT0gMTApID09IDApCi0gICAgICByZXR1cm47Ci0KLSAgICBiSW1wb3J0YW50ID0gdHJ1ZTsKLSAgfQotICBjb25zdCB1aW50MzJfdCBkd1R5cGUgPSBwVGFibGUtPmR3VHlwZTsKLSAgc3dpdGNoIChkd1R5cGUgJiAweDBGKSB7Ci0gICAgY2FzZSBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZTogewotICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGdfVmFsdWVHdWVzc09yZGVyW10gPSB7Ci0gICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlciwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0sCi0gICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yLCBGREVfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nLAotICAgICAgfTsKLSAgICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGdfVmFsdWVHdWVzc0NvdW50ID0KLSAgICAgICAgICBzaXplb2YoZ19WYWx1ZUd1ZXNzT3JkZXIpIC8gc2l6ZW9mKHVpbnQzMl90KTsKLSAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGdfVmFsdWVHdWVzc0NvdW50OyArK2kpIHsKLSAgICAgICAgY29uc3QgdWludDMyX3QgZHdNYXRjaCA9IGR3VHlwZSAmIGdfVmFsdWVHdWVzc09yZGVyW2ldOwotICAgICAgICBpZiAoZHdNYXRjaCA9PSAwKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX1JldGFpblB0cjxDRkRFX0NTU1ZhbHVlPiBwQ1NTVmFsdWU7Ci0gICAgICAgIHN3aXRjaCAoZHdNYXRjaCkgewotICAgICAgICAgIGNhc2UgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcjoKLSAgICAgICAgICAgIHBDU1NWYWx1ZSA9IFBhcnNlTnVtYmVyKHBzelZhbHVlLCBpVmFsdWVMZW4pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bToKLSAgICAgICAgICAgIHBDU1NWYWx1ZSA9IFBhcnNlRW51bShwc3pWYWx1ZSwgaVZhbHVlTGVuKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yOgotICAgICAgICAgICAgcENTU1ZhbHVlID0gUGFyc2VDb2xvcihwc3pWYWx1ZSwgaVZhbHVlTGVuKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZVN0cmluZzoKLSAgICAgICAgICAgIHBDU1NWYWx1ZSA9IFBhcnNlU3RyaW5nKHBzelZhbHVlLCBpVmFsdWVMZW4pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQ1NTVmFsdWUpIHsKLSAgICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwVGFibGUtPmVOYW1lLCBwQ1NTVmFsdWUsIGJJbXBvcnRhbnQpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoRkRFX0lzT25seVZhbHVlKGR3VHlwZSwgZ19WYWx1ZUd1ZXNzT3JkZXJbaV0pKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZERV9DU1NWQUxVRVRZUEVfU2hvcnRoYW5kOiB7Ci0gICAgICBDRlhfUmV0YWluUHRyPENGREVfQ1NTVmFsdWU+IHBXaWR0aDsKLSAgICAgIHN3aXRjaCAocFRhYmxlLT5lTmFtZSkgewotICAgICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eTo6Rm9udDoKLSAgICAgICAgICBQYXJzZUZvbnRQcm9wZXJ0eShwc3pWYWx1ZSwgaVZhbHVlTGVuLCBiSW1wb3J0YW50KTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5OjpCb3JkZXI6Ci0gICAgICAgICAgaWYgKFBhcnNlQm9yZGVyUHJvcGVydHkocHN6VmFsdWUsIGlWYWx1ZUxlbiwgcFdpZHRoKSkgewotICAgICAgICAgICAgQWRkUHJvcGVydHlIb2xkZXIoRkRFX0NTU1Byb3BlcnR5OjpCb3JkZXJMZWZ0V2lkdGgsIHBXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOwotICAgICAgICAgICAgQWRkUHJvcGVydHlIb2xkZXIoRkRFX0NTU1Byb3BlcnR5OjpCb3JkZXJUb3BXaWR0aCwgcFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkltcG9ydGFudCk7Ci0gICAgICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihGREVfQ1NTUHJvcGVydHk6OkJvcmRlclJpZ2h0V2lkdGgsIHBXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOwotICAgICAgICAgICAgQWRkUHJvcGVydHlIb2xkZXIoRkRFX0NTU1Byb3BlcnR5OjpCb3JkZXJCb3R0b21XaWR0aCwgcFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkltcG9ydGFudCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eTo6Qm9yZGVyTGVmdDoKLSAgICAgICAgICBpZiAoUGFyc2VCb3JkZXJQcm9wZXJ0eShwc3pWYWx1ZSwgaVZhbHVlTGVuLCBwV2lkdGgpKSB7Ci0gICAgICAgICAgICBBZGRQcm9wZXJ0eUhvbGRlcihGREVfQ1NTUHJvcGVydHk6OkJvcmRlckxlZnRXaWR0aCwgcFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkltcG9ydGFudCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eTo6Qm9yZGVyVG9wOgotICAgICAgICAgIGlmIChQYXJzZUJvcmRlclByb3BlcnR5KHBzelZhbHVlLCBpVmFsdWVMZW4sIHBXaWR0aCkpIHsKLSAgICAgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKEZERV9DU1NQcm9wZXJ0eTo6Qm9yZGVyVG9wV2lkdGgsIHBXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGREVfQ1NTUHJvcGVydHk6OkJvcmRlclJpZ2h0OgotICAgICAgICAgIGlmIChQYXJzZUJvcmRlclByb3BlcnR5KHBzelZhbHVlLCBpVmFsdWVMZW4sIHBXaWR0aCkpIHsKLSAgICAgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKEZERV9DU1NQcm9wZXJ0eTo6Qm9yZGVyUmlnaHRXaWR0aCwgcFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkltcG9ydGFudCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eTo6Qm9yZGVyQm90dG9tOgotICAgICAgICAgIGlmIChQYXJzZUJvcmRlclByb3BlcnR5KHBzelZhbHVlLCBpVmFsdWVMZW4sIHBXaWR0aCkpIHsKLSAgICAgICAgICAgIEFkZFByb3BlcnR5SG9sZGVyKEZERV9DU1NQcm9wZXJ0eTo6Qm9yZGVyQm90dG9tV2lkdGgsIHBXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJbXBvcnRhbnQpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotICAgIGNhc2UgRkRFX0NTU1ZBTFVFVFlQRV9MaXN0OgotICAgICAgUGFyc2VWYWx1ZUxpc3RQcm9wZXJ0eShwVGFibGUsIHBzelZhbHVlLCBpVmFsdWVMZW4sIGJJbXBvcnRhbnQpOwotICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0gICAgICBBU1NFUlQoZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBDRkRFX0NTU0RlY2xhcmF0aW9uOjpBZGRQcm9wZXJ0eShjb25zdCBDRlhfV2lkZVN0cmluZyYgcHJvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlKSB7Ci0gIGN1c3RvbV9wcm9wZXJ0aWVzXy5wdXNoX2JhY2soCi0gICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZERV9DU1NDdXN0b21Qcm9wZXJ0eT4ocHJvcCwgdmFsdWUpKTsKLX0KLQotQ0ZYX1JldGFpblB0cjxDRkRFX0NTU1ZhbHVlPiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZU51bWJlcigKLSAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsCi0gICAgaW50MzJfdCBpVmFsdWVMZW4pIHsKLSAgRlhfRkxPQVQgZlZhbHVlOwotICBGREVfQ1NTTnVtYmVyVHlwZSBlVW5pdDsKLSAgaWYgKCFQYXJzZUNTU051bWJlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBmVmFsdWUsIGVVbml0KSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIHBkZml1bTo6TWFrZVJldGFpbjxDRkRFX0NTU051bWJlclZhbHVlPihlVW5pdCwgZlZhbHVlKTsKLX0KLQotQ0ZYX1JldGFpblB0cjxDRkRFX0NTU1ZhbHVlPiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUVudW0oCi0gICAgY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLAotICAgIGludDMyX3QgaVZhbHVlTGVuKSB7Ci0gIGNvbnN0IEZERV9DU1NQcm9wZXJ0eVZhbHVlVGFibGUqIHBWYWx1ZSA9Ci0gICAgICBGREVfR2V0Q1NTUHJvcGVydHlWYWx1ZUJ5TmFtZShDRlhfV2lkZVN0cmluZ0MocHN6VmFsdWUsIGlWYWx1ZUxlbikpOwotICByZXR1cm4gcFZhbHVlID8gcGRmaXVtOjpNYWtlUmV0YWluPENGREVfQ1NTRW51bVZhbHVlPihwVmFsdWUtPmVOYW1lKQotICAgICAgICAgICAgICAgIDogbnVsbHB0cjsKLX0KLQotQ0ZYX1JldGFpblB0cjxDRkRFX0NTU1ZhbHVlPiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUNvbG9yKAotICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwKLSAgICBpbnQzMl90IGlWYWx1ZUxlbikgewotICBGWF9BUkdCIGR3Q29sb3I7Ci0gIGlmICghUGFyc2VDU1NDb2xvcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCAmZHdDb2xvcikpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIHJldHVybiBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZERV9DU1NDb2xvclZhbHVlPihkd0NvbG9yKTsKLX0KLQotQ0ZYX1JldGFpblB0cjxDRkRFX0NTU1ZhbHVlPiBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZVN0cmluZygKLSAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsCi0gICAgaW50MzJfdCBpVmFsdWVMZW4pIHsKLSAgaW50MzJfdCBpT2Zmc2V0OwotICBpZiAoIVBhcnNlQ1NTU3RyaW5nKHBzelZhbHVlLCBpVmFsdWVMZW4sICZpT2Zmc2V0LCAmaVZhbHVlTGVuKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBpZiAoaVZhbHVlTGVuIDw9IDApCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgcmV0dXJuIHBkZml1bTo6TWFrZVJldGFpbjxDRkRFX0NTU1N0cmluZ1ZhbHVlPigKLSAgICAgIENGWF9XaWRlU3RyaW5nKHBzelZhbHVlICsgaU9mZnNldCwgaVZhbHVlTGVuKSk7Ci19Ci0KLXZvaWQgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VWYWx1ZUxpc3RQcm9wZXJ0eSgKLSAgICBjb25zdCBGREVfQ1NTUHJvcGVydHlUYWJsZSogcFRhYmxlLAotICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwKLSAgICBpbnQzMl90IGlWYWx1ZUxlbiwKLSAgICBib29sIGJJbXBvcnRhbnQpIHsKLSAgRlhfV0NIQVIgc2VwYXJhdG9yID0KLSAgICAgIChwVGFibGUtPmVOYW1lID09IEZERV9DU1NQcm9wZXJ0eTo6Rm9udEZhbWlseSkgPyAnLCcgOiAnICc7Ci0gIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyIHBhcnNlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBzZXBhcmF0b3IpOwotCi0gIGNvbnN0IHVpbnQzMl90IGR3VHlwZSA9IHBUYWJsZS0+ZHdUeXBlOwotICBGREVfQ1NTUHJpbWl0aXZlVHlwZSBlVHlwZTsKLSAgc3RkOjp2ZWN0b3I8Q0ZYX1JldGFpblB0cjxDRkRFX0NTU1ZhbHVlPj4gbGlzdDsKLSAgd2hpbGUgKHBhcnNlci5OZXh0VmFsdWUoZVR5cGUsIHBzelZhbHVlLCBpVmFsdWVMZW4pKSB7Ci0gICAgc3dpdGNoIChlVHlwZSkgewotICAgICAgY2FzZSBGREVfQ1NTUHJpbWl0aXZlVHlwZTo6TnVtYmVyOgotICAgICAgICBpZiAoZHdUeXBlICYgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcikgewotICAgICAgICAgIEZYX0ZMT0FUIGZWYWx1ZTsKLSAgICAgICAgICBGREVfQ1NTTnVtYmVyVHlwZSBlTnVtVHlwZTsKLSAgICAgICAgICBpZiAoUGFyc2VDU1NOdW1iZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgZlZhbHVlLCBlTnVtVHlwZSkpCi0gICAgICAgICAgICBsaXN0LnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZERV9DU1NOdW1iZXJWYWx1ZT4oZU51bVR5cGUsIGZWYWx1ZSkpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGREVfQ1NTUHJpbWl0aXZlVHlwZTo6U3RyaW5nOgotICAgICAgICBpZiAoZHdUeXBlICYgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yKSB7Ci0gICAgICAgICAgRlhfQVJHQiBkd0NvbG9yOwotICAgICAgICAgIGlmIChQYXJzZUNTU0NvbG9yKHBzelZhbHVlLCBpVmFsdWVMZW4sICZkd0NvbG9yKSkgewotICAgICAgICAgICAgbGlzdC5wdXNoX2JhY2socGRmaXVtOjpNYWtlUmV0YWluPENGREVfQ1NTQ29sb3JWYWx1ZT4oZHdDb2xvcikpOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChkd1R5cGUgJiBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSkgewotICAgICAgICAgIGNvbnN0IEZERV9DU1NQcm9wZXJ0eVZhbHVlVGFibGUqIHBWYWx1ZSA9Ci0gICAgICAgICAgICAgIEZERV9HZXRDU1NQcm9wZXJ0eVZhbHVlQnlOYW1lKAotICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDKHBzelZhbHVlLCBpVmFsdWVMZW4pKTsKLSAgICAgICAgICBpZiAocFZhbHVlKSB7Ci0gICAgICAgICAgICBsaXN0LnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZERV9DU1NFbnVtVmFsdWU+KHBWYWx1ZS0+ZU5hbWUpKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZHdUeXBlICYgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZVN0cmluZykgewotICAgICAgICAgIGxpc3QucHVzaF9iYWNrKHBkZml1bTo6TWFrZVJldGFpbjxDRkRFX0NTU1N0cmluZ1ZhbHVlPigKLSAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcocHN6VmFsdWUsIGlWYWx1ZUxlbikpKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX0NTU1ByaW1pdGl2ZVR5cGU6OlJHQjoKLSAgICAgICAgaWYgKGR3VHlwZSAmIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvcikgewotICAgICAgICAgIEZYX0FSR0IgZHdDb2xvcjsKLSAgICAgICAgICBpZiAoUGFyc2VDU1NDb2xvcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCAmZHdDb2xvcikpIHsKLSAgICAgICAgICAgIGxpc3QucHVzaF9iYWNrKHBkZml1bTo6TWFrZVJldGFpbjxDRkRFX0NTU0NvbG9yVmFsdWU+KGR3Q29sb3IpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgaWYgKGxpc3QuZW1wdHkoKSkKLSAgICByZXR1cm47Ci0KLSAgc3dpdGNoIChwVGFibGUtPmVOYW1lKSB7Ci0gICAgY2FzZSBGREVfQ1NTUHJvcGVydHk6OkJvcmRlcldpZHRoOgotICAgICAgQWRkNFZhbHVlc1Byb3BlcnR5KGxpc3QsIGJJbXBvcnRhbnQsIEZERV9DU1NQcm9wZXJ0eTo6Qm9yZGVyTGVmdFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQcm9wZXJ0eTo6Qm9yZGVyVG9wV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1Byb3BlcnR5OjpCb3JkZXJSaWdodFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQcm9wZXJ0eTo6Qm9yZGVyQm90dG9tV2lkdGgpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5OjpNYXJnaW46Ci0gICAgICBBZGQ0VmFsdWVzUHJvcGVydHkobGlzdCwgYkltcG9ydGFudCwgRkRFX0NTU1Byb3BlcnR5OjpNYXJnaW5MZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQcm9wZXJ0eTo6TWFyZ2luVG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQcm9wZXJ0eTo6TWFyZ2luUmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1Byb3BlcnR5OjpNYXJnaW5Cb3R0b20pOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5OjpQYWRkaW5nOgotICAgICAgQWRkNFZhbHVlc1Byb3BlcnR5KGxpc3QsIGJJbXBvcnRhbnQsIEZERV9DU1NQcm9wZXJ0eTo6UGFkZGluZ0xlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1Byb3BlcnR5OjpQYWRkaW5nVG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQcm9wZXJ0eTo6UGFkZGluZ1JpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9DU1NQcm9wZXJ0eTo6UGFkZGluZ0JvdHRvbSk7Ci0gICAgICByZXR1cm47Ci0gICAgZGVmYXVsdDogewotICAgICAgYXV0byBwTGlzdCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRkRFX0NTU1ZhbHVlTGlzdD4obGlzdCk7Ci0gICAgICBBZGRQcm9wZXJ0eUhvbGRlcihwVGFibGUtPmVOYW1lLCBwTGlzdCwgYkltcG9ydGFudCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6QWRkNFZhbHVlc1Byb3BlcnR5KAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENGWF9SZXRhaW5QdHI8Q0ZERV9DU1NWYWx1ZT4+JiBsaXN0LAotICAgIGJvb2wgYkltcG9ydGFudCwKLSAgICBGREVfQ1NTUHJvcGVydHkgZUxlZnQsCi0gICAgRkRFX0NTU1Byb3BlcnR5IGVUb3AsCi0gICAgRkRFX0NTU1Byb3BlcnR5IGVSaWdodCwKLSAgICBGREVfQ1NTUHJvcGVydHkgZUJvdHRvbSkgewotICBzd2l0Y2ggKGxpc3Quc2l6ZSgpKSB7Ci0gICAgY2FzZSAxOgotICAgICAgQWRkUHJvcGVydHlIb2xkZXIoZUxlZnQsIGxpc3RbMF0sIGJJbXBvcnRhbnQpOwotICAgICAgQWRkUHJvcGVydHlIb2xkZXIoZVRvcCwgbGlzdFswXSwgYkltcG9ydGFudCk7Ci0gICAgICBBZGRQcm9wZXJ0eUhvbGRlcihlUmlnaHQsIGxpc3RbMF0sIGJJbXBvcnRhbnQpOwotICAgICAgQWRkUHJvcGVydHlIb2xkZXIoZUJvdHRvbSwgbGlzdFswXSwgYkltcG9ydGFudCk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSAyOgotICAgICAgQWRkUHJvcGVydHlIb2xkZXIoZUxlZnQsIGxpc3RbMV0sIGJJbXBvcnRhbnQpOwotICAgICAgQWRkUHJvcGVydHlIb2xkZXIoZVRvcCwgbGlzdFswXSwgYkltcG9ydGFudCk7Ci0gICAgICBBZGRQcm9wZXJ0eUhvbGRlcihlUmlnaHQsIGxpc3RbMV0sIGJJbXBvcnRhbnQpOwotICAgICAgQWRkUHJvcGVydHlIb2xkZXIoZUJvdHRvbSwgbGlzdFswXSwgYkltcG9ydGFudCk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSAzOgotICAgICAgQWRkUHJvcGVydHlIb2xkZXIoZUxlZnQsIGxpc3RbMV0sIGJJbXBvcnRhbnQpOwotICAgICAgQWRkUHJvcGVydHlIb2xkZXIoZVRvcCwgbGlzdFswXSwgYkltcG9ydGFudCk7Ci0gICAgICBBZGRQcm9wZXJ0eUhvbGRlcihlUmlnaHQsIGxpc3RbMV0sIGJJbXBvcnRhbnQpOwotICAgICAgQWRkUHJvcGVydHlIb2xkZXIoZUJvdHRvbSwgbGlzdFsyXSwgYkltcG9ydGFudCk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSA0OgotICAgICAgQWRkUHJvcGVydHlIb2xkZXIoZUxlZnQsIGxpc3RbM10sIGJJbXBvcnRhbnQpOwotICAgICAgQWRkUHJvcGVydHlIb2xkZXIoZVRvcCwgbGlzdFswXSwgYkltcG9ydGFudCk7Ci0gICAgICBBZGRQcm9wZXJ0eUhvbGRlcihlUmlnaHQsIGxpc3RbMV0sIGJJbXBvcnRhbnQpOwotICAgICAgQWRkUHJvcGVydHlIb2xkZXIoZUJvdHRvbSwgbGlzdFsyXSwgYkltcG9ydGFudCk7Ci0gICAgICByZXR1cm47Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLWJvb2wgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VCb3JkZXJQcm9wZXJ0eSgKLSAgICBjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsCi0gICAgaW50MzJfdCBpVmFsdWVMZW4sCi0gICAgQ0ZYX1JldGFpblB0cjxDRkRFX0NTU1ZhbHVlPiYgcFdpZHRoKSBjb25zdCB7Ci0gIHBXaWR0aC5SZXNldChudWxscHRyKTsKLQotICBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciBwYXJzZXIocHN6VmFsdWUsIGlWYWx1ZUxlbiwgJyAnKTsKLSAgRkRFX0NTU1ByaW1pdGl2ZVR5cGUgZVR5cGU7Ci0gIHdoaWxlIChwYXJzZXIuTmV4dFZhbHVlKGVUeXBlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkgewotICAgIHN3aXRjaCAoZVR5cGUpIHsKLSAgICAgIGNhc2UgRkRFX0NTU1ByaW1pdGl2ZVR5cGU6Ok51bWJlcjogewotICAgICAgICBpZiAocFdpZHRoKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIEZYX0ZMT0FUIGZWYWx1ZTsKLSAgICAgICAgRkRFX0NTU051bWJlclR5cGUgZU51bVR5cGU7Ci0gICAgICAgIGlmIChQYXJzZUNTU051bWJlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCBmVmFsdWUsIGVOdW1UeXBlKSkKLSAgICAgICAgICBwV2lkdGggPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZERV9DU1NOdW1iZXJWYWx1ZT4oZU51bVR5cGUsIGZWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBGREVfQ1NTUHJpbWl0aXZlVHlwZTo6U3RyaW5nOiB7Ci0gICAgICAgIGNvbnN0IEZERV9DU1NDT0xPUlRBQkxFKiBwQ29sb3JJdGVtID0KLSAgICAgICAgICAgIEZERV9HZXRDU1NDb2xvckJ5TmFtZShDRlhfV2lkZVN0cmluZ0MocHN6VmFsdWUsIGlWYWx1ZUxlbikpOwotICAgICAgICBpZiAocENvbG9ySXRlbSkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBjb25zdCBGREVfQ1NTUHJvcGVydHlWYWx1ZVRhYmxlKiBwVmFsdWUgPQotICAgICAgICAgICAgRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUoQ0ZYX1dpZGVTdHJpbmdDKHBzelZhbHVlLCBpVmFsdWVMZW4pKTsKLSAgICAgICAgaWYgKCFwVmFsdWUpCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgc3dpdGNoIChwVmFsdWUtPmVOYW1lKSB7Ci0gICAgICAgICAgY2FzZSBGREVfQ1NTUHJvcGVydHlWYWx1ZTo6VGhpbjoKLSAgICAgICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpUaGljazoKLSAgICAgICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpNZWRpdW06Ci0gICAgICAgICAgICBpZiAoIXBXaWR0aCkKLSAgICAgICAgICAgICAgcFdpZHRoID0gcGRmaXVtOjpNYWtlUmV0YWluPENGREVfQ1NTRW51bVZhbHVlPihwVmFsdWUtPmVOYW1lKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBpZiAoIXBXaWR0aCkKLSAgICBwV2lkdGggPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZERV9DU1NOdW1iZXJWYWx1ZT4oRkRFX0NTU051bWJlclR5cGU6Ok51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wZik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VGb250UHJvcGVydHkoY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSW1wb3J0YW50KSB7Ci0gIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyIHBhcnNlcihwc3pWYWx1ZSwgaVZhbHVlTGVuLCAnLycpOwotICBDRlhfUmV0YWluUHRyPENGREVfQ1NTVmFsdWU+IHBTdHlsZTsKLSAgQ0ZYX1JldGFpblB0cjxDRkRFX0NTU1ZhbHVlPiBwVmFyaWFudDsKLSAgQ0ZYX1JldGFpblB0cjxDRkRFX0NTU1ZhbHVlPiBwV2VpZ2h0OwotICBDRlhfUmV0YWluUHRyPENGREVfQ1NTVmFsdWU+IHBGb250U2l6ZTsKLSAgQ0ZYX1JldGFpblB0cjxDRkRFX0NTU1ZhbHVlPiBwTGluZUhlaWdodDsKLSAgc3RkOjp2ZWN0b3I8Q0ZYX1JldGFpblB0cjxDRkRFX0NTU1ZhbHVlPj4gZmFtaWx5TGlzdDsKLSAgRkRFX0NTU1ByaW1pdGl2ZVR5cGUgZVR5cGU7Ci0gIHdoaWxlIChwYXJzZXIuTmV4dFZhbHVlKGVUeXBlLCBwc3pWYWx1ZSwgaVZhbHVlTGVuKSkgewotICAgIHN3aXRjaCAoZVR5cGUpIHsKLSAgICAgIGNhc2UgRkRFX0NTU1ByaW1pdGl2ZVR5cGU6OlN0cmluZzogewotICAgICAgICBjb25zdCBGREVfQ1NTUHJvcGVydHlWYWx1ZVRhYmxlKiBwVmFsdWUgPQotICAgICAgICAgICAgRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUoQ0ZYX1dpZGVTdHJpbmdDKHBzelZhbHVlLCBpVmFsdWVMZW4pKTsKLSAgICAgICAgaWYgKHBWYWx1ZSkgewotICAgICAgICAgIHN3aXRjaCAocFZhbHVlLT5lTmFtZSkgewotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUHJvcGVydHlWYWx1ZTo6WHhTbWFsbDoKLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6OlhTbWFsbDoKLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6OlNtYWxsOgotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUHJvcGVydHlWYWx1ZTo6TWVkaXVtOgotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUHJvcGVydHlWYWx1ZTo6TGFyZ2U6Ci0gICAgICAgICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpYTGFyZ2U6Ci0gICAgICAgICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpYeExhcmdlOgotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUHJvcGVydHlWYWx1ZTo6U21hbGxlcjoKLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6OkxhcmdlcjoKLSAgICAgICAgICAgICAgaWYgKCFwRm9udFNpemUpCi0gICAgICAgICAgICAgICAgcEZvbnRTaXplID0KLSAgICAgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlUmV0YWluPENGREVfQ1NTRW51bVZhbHVlPihwVmFsdWUtPmVOYW1lKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpCb2xkOgotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUHJvcGVydHlWYWx1ZTo6Qm9sZGVyOgotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUHJvcGVydHlWYWx1ZTo6TGlnaHRlcjoKLSAgICAgICAgICAgICAgaWYgKCFwV2VpZ2h0KQotICAgICAgICAgICAgICAgIHBXZWlnaHQgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZERV9DU1NFbnVtVmFsdWU+KHBWYWx1ZS0+ZU5hbWUpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6Okl0YWxpYzoKLSAgICAgICAgICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6Ok9ibGlxdWU6Ci0gICAgICAgICAgICAgIGlmICghcFN0eWxlKQotICAgICAgICAgICAgICAgIHBTdHlsZSA9IHBkZml1bTo6TWFrZVJldGFpbjxDRkRFX0NTU0VudW1WYWx1ZT4ocFZhbHVlLT5lTmFtZSk7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgY2FzZSBGREVfQ1NTUHJvcGVydHlWYWx1ZTo6U21hbGxDYXBzOgotICAgICAgICAgICAgICBpZiAoIXBWYXJpYW50KQotICAgICAgICAgICAgICAgIHBWYXJpYW50ID0gcGRmaXVtOjpNYWtlUmV0YWluPENGREVfQ1NTRW51bVZhbHVlPihwVmFsdWUtPmVOYW1lKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpOb3JtYWw6Ci0gICAgICAgICAgICAgIGlmICghcFN0eWxlKQotICAgICAgICAgICAgICAgIHBTdHlsZSA9IHBkZml1bTo6TWFrZVJldGFpbjxDRkRFX0NTU0VudW1WYWx1ZT4ocFZhbHVlLT5lTmFtZSk7Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKCFwVmFyaWFudCkKLSAgICAgICAgICAgICAgICBwVmFyaWFudCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRkRFX0NTU0VudW1WYWx1ZT4ocFZhbHVlLT5lTmFtZSk7Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKCFwV2VpZ2h0KQotICAgICAgICAgICAgICAgIHBXZWlnaHQgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZERV9DU1NFbnVtVmFsdWU+KHBWYWx1ZS0+ZU5hbWUpOwotICAgICAgICAgICAgICBlbHNlIGlmICghcEZvbnRTaXplKQotICAgICAgICAgICAgICAgIHBGb250U2l6ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDRkRFX0NTU0VudW1WYWx1ZT4ocFZhbHVlLT5lTmFtZSk7Ci0gICAgICAgICAgICAgIGVsc2UgaWYgKCFwTGluZUhlaWdodCkKLSAgICAgICAgICAgICAgICBwTGluZUhlaWdodCA9Ci0gICAgICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDRkRFX0NTU0VudW1WYWx1ZT4ocFZhbHVlLT5lTmFtZSk7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwRm9udFNpemUpIHsKLSAgICAgICAgICBmYW1pbHlMaXN0LnB1c2hfYmFjayhwZGZpdW06Ok1ha2VSZXRhaW48Q0ZERV9DU1NTdHJpbmdWYWx1ZT4oCi0gICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nKHBzelZhbHVlLCBpVmFsdWVMZW4pKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcGFyc2VyLm1fU2VwYXJhdG9yID0gJywnOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgRkRFX0NTU1ByaW1pdGl2ZVR5cGU6Ok51bWJlcjogewotICAgICAgICBGWF9GTE9BVCBmVmFsdWU7Ci0gICAgICAgIEZERV9DU1NOdW1iZXJUeXBlIGVOdW1UeXBlOwotICAgICAgICBpZiAoIVBhcnNlQ1NTTnVtYmVyKHBzelZhbHVlLCBpVmFsdWVMZW4sIGZWYWx1ZSwgZU51bVR5cGUpKQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1ByaW1pdGl2ZVR5cGU6Ok51bWJlcikgewotICAgICAgICAgIHN3aXRjaCAoKGludDMyX3QpZlZhbHVlKSB7Ci0gICAgICAgICAgICBjYXNlIDEwMDoKLSAgICAgICAgICAgIGNhc2UgMjAwOgotICAgICAgICAgICAgY2FzZSAzMDA6Ci0gICAgICAgICAgICBjYXNlIDQwMDoKLSAgICAgICAgICAgIGNhc2UgNTAwOgotICAgICAgICAgICAgY2FzZSA2MDA6Ci0gICAgICAgICAgICBjYXNlIDcwMDoKLSAgICAgICAgICAgIGNhc2UgODAwOgotICAgICAgICAgICAgY2FzZSA5MDA6Ci0gICAgICAgICAgICAgIGlmICghcFdlaWdodCkKLSAgICAgICAgICAgICAgICBwV2VpZ2h0ID0gcGRmaXVtOjpNYWtlUmV0YWluPENGREVfQ1NTTnVtYmVyVmFsdWU+KAotICAgICAgICAgICAgICAgICAgICBGREVfQ1NTTnVtYmVyVHlwZTo6TnVtYmVyLCBmVmFsdWUpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwRm9udFNpemUpCi0gICAgICAgICAgcEZvbnRTaXplID0gcGRmaXVtOjpNYWtlUmV0YWluPENGREVfQ1NTTnVtYmVyVmFsdWU+KGVOdW1UeXBlLCBmVmFsdWUpOwotICAgICAgICBlbHNlIGlmICghcExpbmVIZWlnaHQpCi0gICAgICAgICAgcExpbmVIZWlnaHQgPQotICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZERV9DU1NOdW1iZXJWYWx1ZT4oZU51bVR5cGUsIGZWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFwU3R5bGUpIHsKLSAgICBwU3R5bGUgPQotICAgICAgICBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZERV9DU1NFbnVtVmFsdWU+KEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpOb3JtYWwpOwotICB9Ci0gIGlmICghcFZhcmlhbnQpIHsKLSAgICBwVmFyaWFudCA9Ci0gICAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDRkRFX0NTU0VudW1WYWx1ZT4oRkRFX0NTU1Byb3BlcnR5VmFsdWU6Ok5vcm1hbCk7Ci0gIH0KLSAgaWYgKCFwV2VpZ2h0KSB7Ci0gICAgcFdlaWdodCA9Ci0gICAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDRkRFX0NTU0VudW1WYWx1ZT4oRkRFX0NTU1Byb3BlcnR5VmFsdWU6Ok5vcm1hbCk7Ci0gIH0KLSAgaWYgKCFwRm9udFNpemUpIHsKLSAgICBwRm9udFNpemUgPQotICAgICAgICBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZERV9DU1NFbnVtVmFsdWU+KEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpNZWRpdW0pOwotICB9Ci0gIGlmICghcExpbmVIZWlnaHQpIHsKLSAgICBwTGluZUhlaWdodCA9Ci0gICAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDRkRFX0NTU0VudW1WYWx1ZT4oRkRFX0NTU1Byb3BlcnR5VmFsdWU6Ok5vcm1hbCk7Ci0gIH0KLQotICBBZGRQcm9wZXJ0eUhvbGRlcihGREVfQ1NTUHJvcGVydHk6OkZvbnRTdHlsZSwgcFN0eWxlLCBiSW1wb3J0YW50KTsKLSAgQWRkUHJvcGVydHlIb2xkZXIoRkRFX0NTU1Byb3BlcnR5OjpGb250VmFyaWFudCwgcFZhcmlhbnQsIGJJbXBvcnRhbnQpOwotICBBZGRQcm9wZXJ0eUhvbGRlcihGREVfQ1NTUHJvcGVydHk6OkZvbnRXZWlnaHQsIHBXZWlnaHQsIGJJbXBvcnRhbnQpOwotICBBZGRQcm9wZXJ0eUhvbGRlcihGREVfQ1NTUHJvcGVydHk6OkZvbnRTaXplLCBwRm9udFNpemUsIGJJbXBvcnRhbnQpOwotICBBZGRQcm9wZXJ0eUhvbGRlcihGREVfQ1NTUHJvcGVydHk6OkxpbmVIZWlnaHQsIHBMaW5lSGVpZ2h0LCBiSW1wb3J0YW50KTsKLSAgaWYgKCFmYW1pbHlMaXN0LmVtcHR5KCkpIHsKLSAgICBhdXRvIHBMaXN0ID0gcGRmaXVtOjpNYWtlUmV0YWluPENGREVfQ1NTVmFsdWVMaXN0PihmYW1pbHlMaXN0KTsKLSAgICBBZGRQcm9wZXJ0eUhvbGRlcihGREVfQ1NTUHJvcGVydHk6OkZvbnRGYW1pbHksIHBMaXN0LCBiSW1wb3J0YW50KTsKLSAgfQotfQotCi1zaXplX3QgQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UHJvcGVydHlDb3VudEZvclRlc3RpbmcoKSBjb25zdCB7Ci0gIHJldHVybiBwcm9wZXJ0aWVzXy5zaXplKCk7Ci19CmRpZmYgLS1naXQgYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc2RlY2xhcmF0aW9uLmggYi94ZmEvZmRlL2Nzcy9jZmRlX2Nzc2RlY2xhcmF0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMjg3MzAuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jc3MvY2ZkZV9jc3NkZWNsYXJhdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GREVfQ1NTX0NGREVfQ1NTREVDTEFSQVRJT05fSF8KLSNkZWZpbmUgWEZBX0ZERV9DU1NfQ0ZERV9DU1NERUNMQVJBVElPTl9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvZmRlX2Nzc2RhdGF0YWJsZS5oIgotCi1jbGFzcyBDRkRFX0NTU1Byb3BlcnR5SG9sZGVyOwotY2xhc3MgQ0ZERV9DU1NDdXN0b21Qcm9wZXJ0eTsKLQotY2xhc3MgQ0ZERV9DU1NEZWNsYXJhdGlvbiB7Ci0gcHVibGljOgotICB1c2luZyBjb25zdF9wcm9wX2l0ZXJhdG9yID0KLSAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRkRFX0NTU1Byb3BlcnR5SG9sZGVyPj46OmNvbnN0X2l0ZXJhdG9yOwotICB1c2luZyBjb25zdF9jdXN0b21faXRlcmF0b3IgPQotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGREVfQ1NTQ3VzdG9tUHJvcGVydHk+Pjo6Y29uc3RfaXRlcmF0b3I7Ci0KLSAgc3RhdGljIGJvb2wgUGFyc2VDU1NTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogaU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogaUxlbmd0aCk7Ci0gIHN0YXRpYyBib29sIFBhcnNlQ1NTQ29sb3IoY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IqIGR3Q29sb3IpOwotCi0gIENGREVfQ1NTRGVjbGFyYXRpb24oKTsKLSAgfkNGREVfQ1NTRGVjbGFyYXRpb24oKTsKLQotICBDRlhfUmV0YWluUHRyPENGREVfQ1NTVmFsdWU+IEdldFByb3BlcnR5KEZERV9DU1NQcm9wZXJ0eSBlUHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogYkltcG9ydGFudCkgY29uc3Q7Ci0KLSAgY29uc3RfcHJvcF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIHByb3BlcnRpZXNfLmJlZ2luKCk7IH0KLSAgY29uc3RfcHJvcF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBwcm9wZXJ0aWVzXy5lbmQoKTsgfQotCi0gIGNvbnN0X2N1c3RvbV9pdGVyYXRvciBjdXN0b21fYmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGN1c3RvbV9wcm9wZXJ0aWVzXy5iZWdpbigpOwotICB9Ci0gIGNvbnN0X2N1c3RvbV9pdGVyYXRvciBjdXN0b21fZW5kKCkgY29uc3QgeyByZXR1cm4gY3VzdG9tX3Byb3BlcnRpZXNfLmVuZCgpOyB9Ci0KLSAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHByb3BlcnRpZXNfLmVtcHR5KCk7IH0KLQotICB2b2lkIEFkZFByb3BlcnR5KGNvbnN0IEZERV9DU1NQcm9wZXJ0eVRhYmxlKiBwVGFibGUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB2YWx1ZSk7Ci0gIHZvaWQgQWRkUHJvcGVydHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHByb3AsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSk7Ci0KLSAgc2l6ZV90IFByb3BlcnR5Q291bnRGb3JUZXN0aW5nKCkgY29uc3Q7Ci0KLSAgRlhfQVJHQiBQYXJzZUNvbG9yRm9yVGVzdChjb25zdCBGWF9XQ0hBUiogcHN6VmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiogZHdDb2xvcikgY29uc3Q7Ci0KLSBwcml2YXRlOgotICB2b2lkIFBhcnNlRm9udFByb3BlcnR5KGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJbXBvcnRhbnQpOwotICBib29sIFBhcnNlQm9yZGVyUHJvcGVydHkoY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmV0YWluUHRyPENGREVfQ1NTVmFsdWU+JiBwV2lkdGgpIGNvbnN0OwotICB2b2lkIFBhcnNlVmFsdWVMaXN0UHJvcGVydHkoY29uc3QgRkRFX0NTU1Byb3BlcnR5VGFibGUqIHBUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZhbHVlTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSW1wb3J0YW50KTsKLSAgdm9pZCBBZGQ0VmFsdWVzUHJvcGVydHkoY29uc3Qgc3RkOjp2ZWN0b3I8Q0ZYX1JldGFpblB0cjxDRkRFX0NTU1ZhbHVlPj4mIGxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkltcG9ydGFudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1Byb3BlcnR5IGVMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTUHJvcGVydHkgZVRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1Byb3BlcnR5IGVSaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1Byb3BlcnR5IGVCb3R0b20pOwotICBDRlhfUmV0YWluUHRyPENGREVfQ1NTVmFsdWU+IFBhcnNlTnVtYmVyKGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbik7Ci0gIENGWF9SZXRhaW5QdHI8Q0ZERV9DU1NWYWx1ZT4gUGFyc2VFbnVtKGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4pOwotICBDRlhfUmV0YWluUHRyPENGREVfQ1NTVmFsdWU+IFBhcnNlQ29sb3IoY29uc3QgRlhfV0NIQVIqIHBzelZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmFsdWVMZW4pOwotICBDRlhfUmV0YWluUHRyPENGREVfQ1NTVmFsdWU+IFBhcnNlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwc3pWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlWYWx1ZUxlbik7Ci0gIHZvaWQgQWRkUHJvcGVydHlIb2xkZXIoRkRFX0NTU1Byb3BlcnR5IGVQcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmV0YWluUHRyPENGREVfQ1NTVmFsdWU+IHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJbXBvcnRhbnQpOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRkRFX0NTU1Byb3BlcnR5SG9sZGVyPj4gcHJvcGVydGllc187Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRkRFX0NTU0N1c3RvbVByb3BlcnR5Pj4gY3VzdG9tX3Byb3BlcnRpZXNfOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRkRFX0NTU19DRkRFX0NTU0RFQ0xBUkFUSU9OX0hfCmRpZmYgLS1naXQgYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc2RlY2xhcmF0aW9uX3VuaXR0ZXN0LmNwcCBiL3hmYS9mZGUvY3NzL2NmZGVfY3NzZGVjbGFyYXRpb25fdW5pdHRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGEzYzcyLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY3NzL2NmZGVfY3NzZGVjbGFyYXRpb25fdW5pdHRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NkZWNsYXJhdGlvbi5oIgotCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0KLVRFU1QoQ0ZERV9DU1NEZWNhbHJhdGlvbiwgSGV4RW5jb2RpbmdQYXJzaW5nKSB7Ci0gIEZYX0FSR0IgY29sb3I7Ci0KLSAgLy8gTGVuZ3RoIHZhbHVlIGludmFsaWQuCi0gIEVYUEVDVF9GQUxTRShDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUNTU0NvbG9yKEwiIzAwMCIsIDMsICZjb2xvcikpOwotICBFWFBFQ1RfRkFMU0UoQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VDU1NDb2xvcihMIiMwMDAwMDAiLCA1LCAmY29sb3IpKTsKLSAgRVhQRUNUX0ZBTFNFKENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlQ1NTQ29sb3IoTCIjMDAwMDAwIiwgOCwgJmNvbG9yKSk7Ci0KLSAgLy8gSW52YWxpZCBjaGFyYWN0ZXJzCi0gIEVYUEVDVF9UUlVFKENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlQ1NTQ29sb3IoTCIjenh5dGxtIiwgNywgJmNvbG9yKSk7Ci0gIEVYUEVDVF9FUSgwLCBGWEFSR0JfUihjb2xvcikpOwotICBFWFBFQ1RfRVEoMCwgRlhBUkdCX0coY29sb3IpKTsKLSAgRVhQRUNUX0VRKDAsIEZYQVJHQl9CKGNvbG9yKSk7Ci0KLSAgRVhQRUNUX1RSVUUoQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VDU1NDb2xvcihMIiMwMDAiLCA0LCAmY29sb3IpKTsKLSAgRVhQRUNUX0VRKDAsIEZYQVJHQl9SKGNvbG9yKSk7Ci0gIEVYUEVDVF9FUSgwLCBGWEFSR0JfRyhjb2xvcikpOwotICBFWFBFQ1RfRVEoMCwgRlhBUkdCX0IoY29sb3IpKTsKLQotICBFWFBFQ1RfVFJVRShDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUNTU0NvbG9yKEwiI0ZGRiIsIDQsICZjb2xvcikpOwotICBFWFBFQ1RfRVEoMjU1LCBGWEFSR0JfUihjb2xvcikpOwotICBFWFBFQ1RfRVEoMjU1LCBGWEFSR0JfRyhjb2xvcikpOwotICBFWFBFQ1RfRVEoMjU1LCBGWEFSR0JfQihjb2xvcikpOwotCi0gIEVYUEVDVF9UUlVFKENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlQ1NTQ29sb3IoTCIjRjBGMEYwIiwgNywgJmNvbG9yKSk7Ci0gIEVYUEVDVF9FUSgyNDAsIEZYQVJHQl9SKGNvbG9yKSk7Ci0gIEVYUEVDVF9FUSgyNDAsIEZYQVJHQl9HKGNvbG9yKSk7Ci0gIEVYUEVDVF9FUSgyNDAsIEZYQVJHQl9CKGNvbG9yKSk7Ci0KLSAgLy8gVXBwZXIgYW5kIGxvd2VyIGNhc2UgY2hhcmFjdGVycy4KLSAgRVhQRUNUX1RSVUUoQ0ZERV9DU1NEZWNsYXJhdGlvbjo6UGFyc2VDU1NDb2xvcihMIiMxYjJGM2MiLCA3LCAmY29sb3IpKTsKLSAgRVhQRUNUX0VRKDI3LCBGWEFSR0JfUihjb2xvcikpOwotICBFWFBFQ1RfRVEoNDcsIEZYQVJHQl9HKGNvbG9yKSk7Ci0gIEVYUEVDVF9FUSg2MCwgRlhBUkdCX0IoY29sb3IpKTsKLX0KLQotVEVTVChDRkRFX0NTU0RlY2FscmF0aW9uLCBSR0JFbmNvZGluZ1BhcnNpbmcpIHsKLSAgRlhfQVJHQiBjb2xvcjsKLQotICAvLyBJbnZhbGlkIGlucHV0IGZvciByZ2IoKSBzeW50YXguCi0gIEVYUEVDVF9GQUxTRShDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUNTU0NvbG9yKEwiYmxhaGJsYWhibGFoIiwgMTEsICZjb2xvcikpOwotCi0gIEVYUEVDVF9UUlVFKENGREVfQ1NTRGVjbGFyYXRpb246OlBhcnNlQ1NTQ29sb3IoTCJyZ2IoMCwgMCwgMCkiLCAxMiwgJmNvbG9yKSk7Ci0gIEVYUEVDVF9FUSgwLCBGWEFSR0JfUihjb2xvcikpOwotICBFWFBFQ1RfRVEoMCwgRlhBUkdCX0coY29sb3IpKTsKLSAgRVhQRUNUX0VRKDAsIEZYQVJHQl9CKGNvbG9yKSk7Ci0KLSAgRVhQRUNUX1RSVUUoCi0gICAgICBDRkRFX0NTU0RlY2xhcmF0aW9uOjpQYXJzZUNTU0NvbG9yKEwicmdiKDEyOCwyNTUsNDgpIiwgMTUsICZjb2xvcikpOwotICBFWFBFQ1RfRVEoMTI4LCBGWEFSR0JfUihjb2xvcikpOwotICBFWFBFQ1RfRVEoMjU1LCBGWEFSR0JfRyhjb2xvcikpOwotICBFWFBFQ1RfRVEoNDgsIEZYQVJHQl9CKGNvbG9yKSk7Ci19CmRpZmYgLS1naXQgYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc2VudW12YWx1ZS5jcHAgYi94ZmEvZmRlL2Nzcy9jZmRlX2Nzc2VudW12YWx1ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YjlkM2YuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jc3MvY2ZkZV9jc3NlbnVtdmFsdWUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NlbnVtdmFsdWUuaCIKLQotQ0ZERV9DU1NFbnVtVmFsdWU6OkNGREVfQ1NTRW51bVZhbHVlKEZERV9DU1NQcm9wZXJ0eVZhbHVlIHZhbHVlKQotICAgIDogQ0ZERV9DU1NWYWx1ZShGREVfQ1NTUHJpbWl0aXZlVHlwZTo6RW51bSksIHZhbHVlXyh2YWx1ZSkge30KLQotQ0ZERV9DU1NFbnVtVmFsdWU6On5DRkRFX0NTU0VudW1WYWx1ZSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc2VudW12YWx1ZS5oIGIveGZhL2ZkZS9jc3MvY2ZkZV9jc3NlbnVtdmFsdWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZiMWI2OS4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc2VudW12YWx1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GREVfQ1NTX0NGREVfQ1NTRU5VTVZBTFVFX0hfCi0jZGVmaW5lIFhGQV9GREVfQ1NTX0NGREVfQ1NTRU5VTVZBTFVFX0hfCi0KLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3ZhbHVlLmgiCi0KLWNsYXNzIENGREVfQ1NTRW51bVZhbHVlIDogcHVibGljIENGREVfQ1NTVmFsdWUgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0ZERV9DU1NFbnVtVmFsdWUoRkRFX0NTU1Byb3BlcnR5VmFsdWUgdmFsdWUpOwotICB+Q0ZERV9DU1NFbnVtVmFsdWUoKSBvdmVycmlkZTsKLQotICBGREVfQ1NTUHJvcGVydHlWYWx1ZSBWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQotCi0gcHJpdmF0ZToKLSAgRkRFX0NTU1Byb3BlcnR5VmFsdWUgdmFsdWVfOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRkRFX0NTU19DRkRFX0NTU0VOVU1WQUxVRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9jc3MvY2ZkZV9jc3NudW1iZXJ2YWx1ZS5jcHAgYi94ZmEvZmRlL2Nzcy9jZmRlX2Nzc251bWJlcnZhbHVlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1NjZjYS4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc251bWJlcnZhbHVlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3NzbnVtYmVydmFsdWUuaCIKLQotQ0ZERV9DU1NOdW1iZXJWYWx1ZTo6Q0ZERV9DU1NOdW1iZXJWYWx1ZShGREVfQ1NTTnVtYmVyVHlwZSB0eXBlLCBGWF9GTE9BVCB2YWx1ZSkKLSAgICA6IENGREVfQ1NTVmFsdWUoRkRFX0NTU1ByaW1pdGl2ZVR5cGU6Ok51bWJlciksIHR5cGVfKHR5cGUpLCB2YWx1ZV8odmFsdWUpIHsKLSAgaWYgKHR5cGVfID09IEZERV9DU1NOdW1iZXJUeXBlOjpOdW1iZXIgJiYgRlhTWVNfZmFicyh2YWx1ZV8pIDwgMC4wMDFmKQotICAgIHZhbHVlXyA9IDAuMGY7Ci19Ci0KLUNGREVfQ1NTTnVtYmVyVmFsdWU6On5DRkRFX0NTU051bWJlclZhbHVlKCkge30KLQotRlhfRkxPQVQgQ0ZERV9DU1NOdW1iZXJWYWx1ZTo6QXBwbHkoRlhfRkxPQVQgcGVyY2VudEJhc2UpIGNvbnN0IHsKLSAgc3dpdGNoICh0eXBlXykgewotICAgIGNhc2UgRkRFX0NTU051bWJlclR5cGU6OlBpeGVsczoKLSAgICBjYXNlIEZERV9DU1NOdW1iZXJUeXBlOjpOdW1iZXI6Ci0gICAgICByZXR1cm4gdmFsdWVfICogNzIgLyA5NjsKLSAgICBjYXNlIEZERV9DU1NOdW1iZXJUeXBlOjpFTVM6Ci0gICAgY2FzZSBGREVfQ1NTTnVtYmVyVHlwZTo6RVhTOgotICAgICAgcmV0dXJuIHZhbHVlXyAqIHBlcmNlbnRCYXNlOwotICAgIGNhc2UgRkRFX0NTU051bWJlclR5cGU6OlBlcmNlbnQ6Ci0gICAgICByZXR1cm4gdmFsdWVfICogcGVyY2VudEJhc2UgLyAxMDAuMGY7Ci0gICAgY2FzZSBGREVfQ1NTTnVtYmVyVHlwZTo6Q2VudGlNZXRlcnM6Ci0gICAgICByZXR1cm4gdmFsdWVfICogMjguMzQ2NGY7Ci0gICAgY2FzZSBGREVfQ1NTTnVtYmVyVHlwZTo6TWlsbGlNZXRlcnM6Ci0gICAgICByZXR1cm4gdmFsdWVfICogMi44MzQ2ZjsKLSAgICBjYXNlIEZERV9DU1NOdW1iZXJUeXBlOjpJbmNoZXM6Ci0gICAgICByZXR1cm4gdmFsdWVfICogNzIuMGY7Ci0gICAgY2FzZSBGREVfQ1NTTnVtYmVyVHlwZTo6UGljYXM6Ci0gICAgICByZXR1cm4gdmFsdWVfIC8gMTIuMGY7Ci0gICAgY2FzZSBGREVfQ1NTTnVtYmVyVHlwZTo6UG9pbnRzOgotICAgICAgcmV0dXJuIHZhbHVlXzsKLSAgfQotICByZXR1cm4gdmFsdWVfOwotfQpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9jc3MvY2ZkZV9jc3NudW1iZXJ2YWx1ZS5oIGIveGZhL2ZkZS9jc3MvY2ZkZV9jc3NudW1iZXJ2YWx1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWU1NjJlLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY3NzL2NmZGVfY3NzbnVtYmVydmFsdWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRkRFX0NTU19DRkRFX0NTU05VTUJFUlZBTFVFX0hfCi0jZGVmaW5lIFhGQV9GREVfQ1NTX0NGREVfQ1NTTlVNQkVSVkFMVUVfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3N2YWx1ZS5oIgotCi1lbnVtIGNsYXNzIEZERV9DU1NOdW1iZXJUeXBlIHsKLSAgTnVtYmVyLAotICBQZXJjZW50LAotICBFTVMsCi0gIEVYUywKLSAgUGl4ZWxzLAotICBDZW50aU1ldGVycywKLSAgTWlsbGlNZXRlcnMsCi0gIEluY2hlcywKLSAgUG9pbnRzLAotICBQaWNhcywKLX07Ci0KLWNsYXNzIENGREVfQ1NTTnVtYmVyVmFsdWUgOiBwdWJsaWMgQ0ZERV9DU1NWYWx1ZSB7Ci0gcHVibGljOgotICBDRkRFX0NTU051bWJlclZhbHVlKEZERV9DU1NOdW1iZXJUeXBlIHR5cGUsIEZYX0ZMT0FUIHZhbHVlKTsKLSAgfkNGREVfQ1NTTnVtYmVyVmFsdWUoKSBvdmVycmlkZTsKLQotICBGWF9GTE9BVCBWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQotICBGREVfQ1NTTnVtYmVyVHlwZSBLaW5kKCkgY29uc3QgeyByZXR1cm4gdHlwZV87IH0KLQotICBGWF9GTE9BVCBBcHBseShGWF9GTE9BVCBwZXJjZW50QmFzZSkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBGREVfQ1NTTnVtYmVyVHlwZSB0eXBlXzsKLSAgRlhfRkxPQVQgdmFsdWVfOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRkRFX0NTU19DRkRFX0NTU05VTUJFUlZBTFVFX0hfCmRpZmYgLS1naXQgYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3Byb3BlcnR5aG9sZGVyLmNwcCBiL3hmYS9mZGUvY3NzL2NmZGVfY3NzcHJvcGVydHlob2xkZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjQ3YzhmLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY3NzL2NmZGVfY3NzcHJvcGVydHlob2xkZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3Nwcm9wZXJ0eWhvbGRlci5oIgotCi1DRkRFX0NTU1Byb3BlcnR5SG9sZGVyOjpDRkRFX0NTU1Byb3BlcnR5SG9sZGVyKCkge30KLQotQ0ZERV9DU1NQcm9wZXJ0eUhvbGRlcjo6fkNGREVfQ1NTUHJvcGVydHlIb2xkZXIoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9jc3MvY2ZkZV9jc3Nwcm9wZXJ0eWhvbGRlci5oIGIveGZhL2ZkZS9jc3MvY2ZkZV9jc3Nwcm9wZXJ0eWhvbGRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Zjg1MjZkLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY3NzL2NmZGVfY3NzcHJvcGVydHlob2xkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRkRFX0NTU19DRkRFX0NTU1BST1BFUlRZSE9MREVSX0hfCi0jZGVmaW5lIFhGQV9GREVfQ1NTX0NGREVfQ1NTUFJPUEVSVFlIT0xERVJfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3JldGFpbl9wdHIuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3ZhbHVlLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvZmRlX2Nzcy5oIgotCi1jbGFzcyBDRkRFX0NTU1Byb3BlcnR5SG9sZGVyIHsKLSBwdWJsaWM6Ci0gIENGREVfQ1NTUHJvcGVydHlIb2xkZXIoKTsKLSAgfkNGREVfQ1NTUHJvcGVydHlIb2xkZXIoKTsKLQotICBGREVfQ1NTUHJvcGVydHkgZVByb3BlcnR5OwotICBib29sIGJJbXBvcnRhbnQ7Ci0gIENGWF9SZXRhaW5QdHI8Q0ZERV9DU1NWYWx1ZT4gcFZhbHVlOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRkRFX0NTU19DRkRFX0NTU1BST1BFUlRZSE9MREVSX0hfCmRpZmYgLS1naXQgYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3J1bGVjb2xsZWN0aW9uLmNwcCBiL3hmYS9mZGUvY3NzL2NmZGVfY3NzcnVsZWNvbGxlY3Rpb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzE4NjUxLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY3NzL2NmZGVfY3NzcnVsZWNvbGxlY3Rpb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NydWxlY29sbGVjdGlvbi5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NkZWNsYXJhdGlvbi5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3Nzc2VsZWN0b3IuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N0eWxlcnVsZS5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3Nzc3R5bGVzaGVldC5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3Nzc3ludGF4cGFyc2VyLmgiCi0KLUNGREVfQ1NTUnVsZUNvbGxlY3Rpb246OkNGREVfQ1NTUnVsZUNvbGxlY3Rpb24oKSA6IG1faVNlbGVjdG9ycygwKSB7fQotCi1DRkRFX0NTU1J1bGVDb2xsZWN0aW9uOjp+Q0ZERV9DU1NSdWxlQ29sbGVjdGlvbigpIHsKLSAgQ2xlYXIoKTsKLX0KLQotdm9pZCBDRkRFX0NTU1J1bGVDb2xsZWN0aW9uOjpDbGVhcigpIHsKLSAgbV9UYWdSdWxlcy5jbGVhcigpOwotICBtX2lTZWxlY3RvcnMgPSAwOwotfQotCi1jb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0ZERV9DU1NSdWxlQ29sbGVjdGlvbjo6RGF0YT4+KgotQ0ZERV9DU1NSdWxlQ29sbGVjdGlvbjo6R2V0VGFnUnVsZURhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHRhZ25hbWUpIGNvbnN0IHsKLSAgYXV0byBpdCA9IG1fVGFnUnVsZXMuZmluZChGWF9IYXNoQ29kZV9HZXRXKHRhZ25hbWUuY19zdHIoKSwgdHJ1ZSkpOwotICByZXR1cm4gaXQgIT0gbV9UYWdSdWxlcy5lbmQoKSA/ICZpdC0+c2Vjb25kIDogbnVsbHB0cjsKLX0KLQotdm9pZCBDRkRFX0NTU1J1bGVDb2xsZWN0aW9uOjpBZGRSdWxlc0Zyb20oY29uc3QgQ0ZERV9DU1NTdHlsZVNoZWV0KiBzaGVldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGR0FTX0ZvbnRNZ3IqIHBGb250TWdyKSB7Ci0gIGludDMyX3QgaVJ1bGVzID0gc2hlZXQtPkNvdW50UnVsZXMoKTsKLSAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVJ1bGVzOyBqKyspCi0gICAgQWRkUnVsZXNGcm9tKHNoZWV0LCBzaGVldC0+R2V0UnVsZShqKSwgcEZvbnRNZ3IpOwotfQotCi12b2lkIENGREVfQ1NTUnVsZUNvbGxlY3Rpb246OkFkZFJ1bGVzRnJvbShjb25zdCBDRkRFX0NTU1N0eWxlU2hlZXQqIHBTdHlsZVNoZWV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9DU1NTdHlsZVJ1bGUqIHBTdHlsZVJ1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkdBU19Gb250TWdyKiBwRm9udE1ncikgewotICBDRkRFX0NTU0RlY2xhcmF0aW9uKiBwRGVjbGFyYXRpb24gPSBwU3R5bGVSdWxlLT5HZXREZWNsYXJhdGlvbigpOwotICBpbnQzMl90IGlTZWxlY3RvcnMgPSBwU3R5bGVSdWxlLT5Db3VudFNlbGVjdG9yTGlzdHMoKTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNlbGVjdG9yczsgKytpKSB7Ci0gICAgQ0ZERV9DU1NTZWxlY3RvciogcFNlbGVjdG9yID0gcFN0eWxlUnVsZS0+R2V0U2VsZWN0b3JMaXN0KGkpOwotICAgIG1fVGFnUnVsZXNbcFNlbGVjdG9yLT5HZXROYW1lSGFzaCgpXS5wdXNoX2JhY2soCi0gICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxEYXRhPihwU2VsZWN0b3IsIHBEZWNsYXJhdGlvbikpOwotICAgIG1faVNlbGVjdG9ycysrOwotICB9Ci19Ci0KLUNGREVfQ1NTUnVsZUNvbGxlY3Rpb246OkRhdGE6OkRhdGEoQ0ZERV9DU1NTZWxlY3RvciogcFNlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9DU1NEZWNsYXJhdGlvbiogcERlY2wpCi0gICAgOiBwU2VsZWN0b3IocFNlbCksIHBEZWNsYXJhdGlvbihwRGVjbCkge30KZGlmZiAtLWdpdCBhL3hmYS9mZGUvY3NzL2NmZGVfY3NzcnVsZWNvbGxlY3Rpb24uaCBiL3hmYS9mZGUvY3NzL2NmZGVfY3NzcnVsZWNvbGxlY3Rpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ0OTkyMi4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3J1bGVjb2xsZWN0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZERV9DU1NfQ0ZERV9DU1NSVUxFQ09MTEVDVElPTl9IXwotI2RlZmluZSBYRkFfRkRFX0NTU19DRkRFX0NTU1JVTEVDT0xMRUNUSU9OX0hfCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLQotY2xhc3MgQ0ZERV9DU1NEZWNsYXJhdGlvbjsKLWNsYXNzIENGREVfQ1NTU2VsZWN0b3I7Ci1jbGFzcyBDRkRFX0NTU1N0eWxlUnVsZTsKLWNsYXNzIENGREVfQ1NTU3R5bGVTaGVldDsKLWNsYXNzIENGR0FTX0ZvbnRNZ3I7Ci0KLWNsYXNzIENGREVfQ1NTUnVsZUNvbGxlY3Rpb24gewotIHB1YmxpYzoKLSAgY2xhc3MgRGF0YSB7Ci0gICBwdWJsaWM6Ci0gICAgRGF0YShDRkRFX0NTU1NlbGVjdG9yKiBwU2VsLCBDRkRFX0NTU0RlY2xhcmF0aW9uKiBwRGVjbCk7Ci0KLSAgICBDRkRFX0NTU1NlbGVjdG9yKiBjb25zdCBwU2VsZWN0b3I7Ci0gICAgQ0ZERV9DU1NEZWNsYXJhdGlvbiogY29uc3QgcERlY2xhcmF0aW9uOwotICB9OwotCi0gIENGREVfQ1NTUnVsZUNvbGxlY3Rpb24oKTsKLSAgfkNGREVfQ1NTUnVsZUNvbGxlY3Rpb24oKTsKLQotICB2b2lkIEFkZFJ1bGVzRnJvbShjb25zdCBDRkRFX0NTU1N0eWxlU2hlZXQqIHNoZWV0LCBDRkdBU19Gb250TWdyKiBwRm9udE1ncik7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgaW50MzJfdCBDb3VudFNlbGVjdG9ycygpIGNvbnN0IHsgcmV0dXJuIG1faVNlbGVjdG9yczsgfQotCi0gIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEYXRhPj4qIEdldFRhZ1J1bGVEYXRhKAotICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHRhZ25hbWUpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgdm9pZCBBZGRSdWxlc0Zyb20oY29uc3QgQ0ZERV9DU1NTdHlsZVNoZWV0KiBwU3R5bGVTaGVldCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZERV9DU1NTdHlsZVJ1bGUqIHBSdWxlLAotICAgICAgICAgICAgICAgICAgICBDRkdBU19Gb250TWdyKiBwRm9udE1ncik7Ci0KLSAgc3RkOjptYXA8dWludDMyX3QsIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEYXRhPj4+IG1fVGFnUnVsZXM7Ci0gIGludDMyX3QgbV9pU2VsZWN0b3JzOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRkRFX0NTU19DRkRFX0NTU1JVTEVDT0xMRUNUSU9OX0hfCmRpZmYgLS1naXQgYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3NlbGVjdG9yLmNwcCBiL3hmYS9mZGUvY3NzL2NmZGVfY3Nzc2VsZWN0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzU4MDIzLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY3NzL2NmZGVfY3Nzc2VsZWN0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NzZWxlY3Rvci5oIgotCi0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLQotbmFtZXNwYWNlIHsKLQotYm9vbCBJc0NTU0NoYXIoRlhfV0NIQVIgd2NoKSB7Ci0gIHJldHVybiAod2NoID49ICdhJyAmJiB3Y2ggPD0gJ3onKSB8fCAod2NoID49ICdBJyAmJiB3Y2ggPD0gJ1onKTsKLX0KLQotaW50MzJfdCBHZXRDU1NOYW1lTGVuKGNvbnN0IEZYX1dDSEFSKiBwc3osIGNvbnN0IEZYX1dDSEFSKiBwRW5kKSB7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwU3RhcnQgPSBwc3o7Ci0gIHdoaWxlIChwc3ogPCBwRW5kKSB7Ci0gICAgRlhfV0NIQVIgd2NoID0gKnBzejsKLSAgICBpZiAoSXNDU1NDaGFyKHdjaCkgfHwgKHdjaCA+PSAnMCcgJiYgd2NoIDw9ICc5JykgfHwgd2NoID09ICdfJyB8fAotICAgICAgICB3Y2ggPT0gJy0nKSB7Ci0gICAgICArK3BzejsKLSAgICB9IGVsc2UgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBwc3ogLSBwU3RhcnQ7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1DRkRFX0NTU1NlbGVjdG9yOjpDRkRFX0NTU1NlbGVjdG9yKEZERV9DU1NTZWxlY3RvclR5cGUgZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3osCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSWdub3JlQ2FzZSkKLSAgICA6IG1fZVR5cGUoZVR5cGUpLAotICAgICAgbV9kd0hhc2goRlhfSGFzaENvZGVfR2V0VyhDRlhfV2lkZVN0cmluZ0MocHN6LCBpTGVuKSwgYklnbm9yZUNhc2UpKSB7fQotCi1DRkRFX0NTU1NlbGVjdG9yOjp+Q0ZERV9DU1NTZWxlY3RvcigpIHt9Ci0KLUZERV9DU1NTZWxlY3RvclR5cGUgQ0ZERV9DU1NTZWxlY3Rvcjo6R2V0VHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fZVR5cGU7Ci19Ci0KLXVpbnQzMl90IENGREVfQ1NTU2VsZWN0b3I6OkdldE5hbWVIYXNoKCkgY29uc3QgewotICByZXR1cm4gbV9kd0hhc2g7Ci19Ci0KLUNGREVfQ1NTU2VsZWN0b3IqIENGREVfQ1NTU2VsZWN0b3I6OkdldE5leHRTZWxlY3RvcigpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcE5leHQuZ2V0KCk7Ci19Ci0KLS8vIHN0YXRpYy4KLXN0ZDo6dW5pcXVlX3B0cjxDRkRFX0NTU1NlbGVjdG9yPiBDRkRFX0NTU1NlbGVjdG9yOjpGcm9tU3RyaW5nKAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3RyKSB7Ci0gIEFTU0VSVCghc3RyLklzRW1wdHkoKSk7Ci0KLSAgY29uc3QgRlhfV0NIQVIqIHBzeiA9IHN0ci5jX3N0cigpOwotICBjb25zdCBGWF9XQ0hBUiogcFN0YXJ0ID0gcHN6OwotICBjb25zdCBGWF9XQ0hBUiogcEVuZCA9IHBzeiArIHN0ci5HZXRMZW5ndGgoKTsKLSAgZm9yICg7IHBzeiA8IHBFbmQ7ICsrcHN6KSB7Ci0gICAgc3dpdGNoICgqcHN6KSB7Ci0gICAgICBjYXNlICc+JzoKLSAgICAgIGNhc2UgJ1snOgotICAgICAgY2FzZSAnKyc6Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRkRFX0NTU1NlbGVjdG9yPiBwRmlyc3QgPSBudWxscHRyOwotICBmb3IgKHBzeiA9IHBTdGFydDsgcHN6IDwgcEVuZDspIHsKLSAgICBGWF9XQ0hBUiB3Y2ggPSAqcHN6OwotICAgIGlmIChJc0NTU0NoYXIod2NoKSB8fCB3Y2ggPT0gJyonKSB7Ci0gICAgICBpbnQzMl90IGlOYW1lTGVuID0gd2NoID09ICcqJyA/IDEgOiBHZXRDU1NOYW1lTGVuKHBzeiwgcEVuZCk7Ci0gICAgICBhdXRvIHAgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZERV9DU1NTZWxlY3Rvcj4oCi0gICAgICAgICAgRkRFX0NTU1NlbGVjdG9yVHlwZTo6RWxlbWVudCwgcHN6LCBpTmFtZUxlbiwgdHJ1ZSk7Ci0gICAgICBpZiAocEZpcnN0KSB7Ci0gICAgICAgIHBGaXJzdC0+U2V0VHlwZShGREVfQ1NTU2VsZWN0b3JUeXBlOjpEZXNjZW5kYW50KTsKLSAgICAgICAgcC0+U2V0TmV4dChzdGQ6Om1vdmUocEZpcnN0KSk7Ci0gICAgICB9Ci0gICAgICBwRmlyc3QgPSBzdGQ6Om1vdmUocCk7Ci0gICAgICBwc3ogKz0gaU5hbWVMZW47Ci0gICAgfSBlbHNlIGlmICh3Y2ggPT0gJyAnKSB7Ci0gICAgICBwc3orKzsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICB9Ci0gIHJldHVybiBwRmlyc3Q7Ci19CmRpZmYgLS1naXQgYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3NlbGVjdG9yLmggYi94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3NlbGVjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ODViM2YuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jc3MvY2ZkZV9jc3NzZWxlY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GREVfQ1NTX0NGREVfQ1NTU0VMRUNUT1JfSF8KLSNkZWZpbmUgWEZBX0ZERV9DU1NfQ0ZERV9DU1NTRUxFQ1RPUl9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2ZkZV9jc3MuaCIKLQotY2xhc3MgQ0ZERV9DU1NTZWxlY3RvciB7Ci0gcHVibGljOgotICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPENGREVfQ1NTU2VsZWN0b3I+IEZyb21TdHJpbmcoCi0gICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cik7Ci0KLSAgQ0ZERV9DU1NTZWxlY3RvcihGREVfQ1NTU2VsZWN0b3JUeXBlIGVUeXBlLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3osCi0gICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuLAotICAgICAgICAgICAgICAgICAgIGJvb2wgYklnbm9yZUNhc2UpOwotICB+Q0ZERV9DU1NTZWxlY3RvcigpOwotCi0gIEZERV9DU1NTZWxlY3RvclR5cGUgR2V0VHlwZSgpIGNvbnN0OwotICB1aW50MzJfdCBHZXROYW1lSGFzaCgpIGNvbnN0OwotICBDRkRFX0NTU1NlbGVjdG9yKiBHZXROZXh0U2VsZWN0b3IoKSBjb25zdDsKLQotICB2b2lkIFNldE5leHQoc3RkOjp1bmlxdWVfcHRyPENGREVfQ1NTU2VsZWN0b3I+IHBOZXh0KSB7Ci0gICAgbV9wTmV4dCA9IHN0ZDo6bW92ZShwTmV4dCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHZvaWQgU2V0VHlwZShGREVfQ1NTU2VsZWN0b3JUeXBlIGVUeXBlKSB7IG1fZVR5cGUgPSBlVHlwZTsgfQotCi0gIEZERV9DU1NTZWxlY3RvclR5cGUgbV9lVHlwZTsKLSAgdWludDMyX3QgbV9kd0hhc2g7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRkRFX0NTU1NlbGVjdG9yPiBtX3BOZXh0OwotfTsKLQotI2VuZGlmICAvLyBYRkFfRkRFX0NTU19DRkRFX0NTU1NFTEVDVE9SX0hfCmRpZmYgLS1naXQgYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N0cmluZ3ZhbHVlLmNwcCBiL3hmYS9mZGUvY3NzL2NmZGVfY3Nzc3RyaW5ndmFsdWUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWI5YmUzLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY3NzL2NmZGVfY3Nzc3RyaW5ndmFsdWUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NzdHJpbmd2YWx1ZS5oIgotCi1DRkRFX0NTU1N0cmluZ1ZhbHVlOjpDRkRFX0NTU1N0cmluZ1ZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB2YWx1ZSkKLSAgICA6IENGREVfQ1NTVmFsdWUoRkRFX0NTU1ByaW1pdGl2ZVR5cGU6OlN0cmluZyksIHZhbHVlXyh2YWx1ZSkge30KLQotQ0ZERV9DU1NTdHJpbmdWYWx1ZTo6fkNGREVfQ1NTU3RyaW5nVmFsdWUoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9jc3MvY2ZkZV9jc3NzdHJpbmd2YWx1ZS5oIGIveGZhL2ZkZS9jc3MvY2ZkZV9jc3NzdHJpbmd2YWx1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzMyOGNmLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY3NzL2NmZGVfY3Nzc3RyaW5ndmFsdWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRkRFX0NTU19DRkRFX0NTU1NUUklOR1ZBTFVFX0hfCi0jZGVmaW5lIFhGQV9GREVfQ1NTX0NGREVfQ1NTU1RSSU5HVkFMVUVfSF8KLQotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3NzdmFsdWUuaCIKLQotY2xhc3MgQ0ZERV9DU1NTdHJpbmdWYWx1ZSA6IHB1YmxpYyBDRkRFX0NTU1ZhbHVlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENGREVfQ1NTU3RyaW5nVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHZhbHVlKTsKLSAgfkNGREVfQ1NTU3RyaW5nVmFsdWUoKSBvdmVycmlkZTsKLQotICBjb25zdCBDRlhfV2lkZVN0cmluZyBWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlXzsgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcgdmFsdWVfOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRkRFX0NTU19DRkRFX0NTU1NUUklOR1ZBTFVFX0hfCmRpZmYgLS1naXQgYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N0eWxlcnVsZS5jcHAgYi94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N0eWxlcnVsZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZjZjZmYuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jc3MvY2ZkZV9jc3NzdHlsZXJ1bGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NzdHlsZXJ1bGUuaCIKLQotQ0ZERV9DU1NTdHlsZVJ1bGU6OkNGREVfQ1NTU3R5bGVSdWxlKCkge30KLQotQ0ZERV9DU1NTdHlsZVJ1bGU6On5DRkRFX0NTU1N0eWxlUnVsZSgpIHt9Ci0KLXNpemVfdCBDRkRFX0NTU1N0eWxlUnVsZTo6Q291bnRTZWxlY3Rvckxpc3RzKCkgY29uc3QgewotICByZXR1cm4gbV9wcFNlbGVjdG9yLnNpemUoKTsKLX0KLQotQ0ZERV9DU1NTZWxlY3RvciogQ0ZERV9DU1NTdHlsZVJ1bGU6OkdldFNlbGVjdG9yTGlzdChpbnQzMl90IGluZGV4KSBjb25zdCB7Ci0gIHJldHVybiBtX3BwU2VsZWN0b3JbaW5kZXhdLmdldCgpOwotfQotCi1DRkRFX0NTU0RlY2xhcmF0aW9uKiBDRkRFX0NTU1N0eWxlUnVsZTo6R2V0RGVjbGFyYXRpb24oKSB7Ci0gIHJldHVybiAmbV9EZWNsYXJhdGlvbjsKLX0KLQotdm9pZCBDRkRFX0NTU1N0eWxlUnVsZTo6U2V0U2VsZWN0b3IoCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGREVfQ1NTU2VsZWN0b3I+PiogbGlzdCkgewotICBBU1NFUlQobV9wcFNlbGVjdG9yLmVtcHR5KCkpOwotCi0gIG1fcHBTZWxlY3Rvci5zd2FwKCpsaXN0KTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9mZGUvY3NzL2NmZGVfY3Nzc3R5bGVydWxlLmggYi94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N0eWxlcnVsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzVhYjhkLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY3NzL2NmZGVfY3Nzc3R5bGVydWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZERV9DU1NfQ0ZERV9DU1NTVFlMRVJVTEVfSF8KLSNkZWZpbmUgWEZBX0ZERV9DU1NfQ0ZERV9DU1NTVFlMRVJVTEVfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc2RlY2xhcmF0aW9uLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NzZWxlY3Rvci5oIgotCi1jbGFzcyBDRkRFX0NTU1N0eWxlUnVsZSB7Ci0gcHVibGljOgotICBDRkRFX0NTU1N0eWxlUnVsZSgpOwotICB+Q0ZERV9DU1NTdHlsZVJ1bGUoKTsKLQotICBzaXplX3QgQ291bnRTZWxlY3Rvckxpc3RzKCkgY29uc3Q7Ci0gIENGREVfQ1NTU2VsZWN0b3IqIEdldFNlbGVjdG9yTGlzdChpbnQzMl90IGluZGV4KSBjb25zdDsKLSAgQ0ZERV9DU1NEZWNsYXJhdGlvbiogR2V0RGVjbGFyYXRpb24oKTsKLQotICB2b2lkIFNldFNlbGVjdG9yKHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRkRFX0NTU1NlbGVjdG9yPj4qIGxpc3QpOwotCi0gcHJpdmF0ZToKLSAgQ0ZERV9DU1NEZWNsYXJhdGlvbiBtX0RlY2xhcmF0aW9uOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0ZERV9DU1NTZWxlY3Rvcj4+IG1fcHBTZWxlY3RvcjsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZERV9DU1NfQ0ZERV9DU1NTVFlMRVJVTEVfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZGUvY3NzL2NmZGVfY3Nzc3R5bGVzZWxlY3Rvci5jcHAgYi94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N0eWxlc2VsZWN0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTdhYTFiLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY3NzL2NmZGVfY3Nzc3R5bGVzZWxlY3Rvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MDIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NzdHlsZXNlbGVjdG9yLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc2NvbG9ydmFsdWUuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc2NvbXB1dGVkc3R5bGUuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc2N1c3RvbXByb3BlcnR5LmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NkZWNsYXJhdGlvbi5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3NzZW51bXZhbHVlLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3Nwcm9wZXJ0eWhvbGRlci5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3Nzc2VsZWN0b3IuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N0eWxlc2hlZXQuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N5bnRheHBhcnNlci5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3NzdmFsdWVsaXN0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL2N4ZmFfY3NzdGFncHJvdmlkZXIuaCIKLQotQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpDRkRFX0NTU1N0eWxlU2VsZWN0b3IoQ0ZHQVNfRm9udE1nciogcEZvbnRNZ3IpCi0gICAgOiBtX3BGb250TWdyKHBGb250TWdyKSwgbV9mRGVmRm9udFNpemUoMTIuMGYpIHt9Ci0KLUNGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6fkNGREVfQ1NTU3R5bGVTZWxlY3RvcigpIHt9Ci0KLXZvaWQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpTZXREZWZGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpIHsKLSAgQVNTRVJUKGZGb250U2l6ZSA+IDApOwotICBtX2ZEZWZGb250U2l6ZSA9IGZGb250U2l6ZTsKLX0KLQotQ0ZYX1JldGFpblB0cjxDRkRFX0NTU0NvbXB1dGVkU3R5bGU+IENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6Q3JlYXRlQ29tcHV0ZWRTdHlsZSgKLSAgICBDRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBQYXJlbnRTdHlsZSkgewotICBhdXRvIHBTdHlsZSA9IHBkZml1bTo6TWFrZVJldGFpbjxDRkRFX0NTU0NvbXB1dGVkU3R5bGU+KCk7Ci0gIGlmIChwUGFyZW50U3R5bGUpCi0gICAgcFN0eWxlLT5tX0luaGVyaXRlZERhdGEgPSBwUGFyZW50U3R5bGUtPm1fSW5oZXJpdGVkRGF0YTsKLSAgcmV0dXJuIHBTdHlsZTsKLX0KLQotdm9pZCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlNldFVBU3R5bGVTaGVldCgKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZERV9DU1NTdHlsZVNoZWV0PiBwU2hlZXQpIHsKLSAgbV9VQVN0eWxlcyA9IHN0ZDo6bW92ZShwU2hlZXQpOwotfQotCi12b2lkIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VXBkYXRlU3R5bGVJbmRleCgpIHsKLSAgbV9VQVJ1bGVzLkNsZWFyKCk7Ci0gIG1fVUFSdWxlcy5BZGRSdWxlc0Zyb20obV9VQVN0eWxlcy5nZXQoKSwgbV9wRm9udE1ncik7Ci19Ci0KLXN0ZDo6dmVjdG9yPGNvbnN0IENGREVfQ1NTRGVjbGFyYXRpb24qPgotQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpNYXRjaERlY2xhcmF0aW9ucyhjb25zdCBDRlhfV2lkZVN0cmluZyYgdGFnbmFtZSkgewotICBzdGQ6OnZlY3Rvcjxjb25zdCBDRkRFX0NTU0RlY2xhcmF0aW9uKj4gbWF0Y2hlZERlY2xzOwotICBpZiAobV9VQVJ1bGVzLkNvdW50U2VsZWN0b3JzKCkgPT0gMCB8fCB0YWduYW1lLklzRW1wdHkoKSkKLSAgICByZXR1cm4gbWF0Y2hlZERlY2xzOwotCi0gIGF1dG8gcnVsZXMgPSBtX1VBUnVsZXMuR2V0VGFnUnVsZURhdGEodGFnbmFtZSk7Ci0gIGlmICghcnVsZXMpCi0gICAgcmV0dXJuIG1hdGNoZWREZWNsczsKLQotICBmb3IgKGNvbnN0IGF1dG8mIGQgOiAqcnVsZXMpIHsKLSAgICBpZiAoTWF0Y2hTZWxlY3Rvcih0YWduYW1lLCBkLT5wU2VsZWN0b3IpKQotICAgICAgbWF0Y2hlZERlY2xzLnB1c2hfYmFjayhkLT5wRGVjbGFyYXRpb24pOwotICB9Ci0gIHJldHVybiBtYXRjaGVkRGVjbHM7Ci19Ci0KLWJvb2wgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpNYXRjaFNlbGVjdG9yKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB0YWduYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9DU1NTZWxlY3RvciogcFNlbCkgewotICAvLyBUT0RPKGRzaW5jbGFpcik6IFRoZSBjb2RlIG9ubHkgc3VwcG9ydHMgYSBzaW5nbGUgbGV2ZWwgb2Ygc2VsZWN0b3IgYXQgdGhpcwotICAvLyBwb2ludC4gTm9uZSBvZiB0aGUgY29kZSB1c2luZyBzZWxlY3RvcnMgcmVxdWlyZWQgdGhlIGNvbXBsZXhpdHkgc28gbGV0cwotICAvLyBqdXN0IHNheSB3ZSBkb24ndCBzdXBwb3J0IHRoZW0gdG8gc2ltcGxpZnkgdGhlIGNvZGUgZm9yIG5vdy4KLSAgaWYgKCFwU2VsIHx8IHBTZWwtPkdldE5leHRTZWxlY3RvcigpIHx8Ci0gICAgICBwU2VsLT5HZXRUeXBlKCkgPT0gRkRFX0NTU1NlbGVjdG9yVHlwZTo6RGVzY2VuZGFudCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gcFNlbC0+R2V0TmFtZUhhc2goKSA9PSBGWF9IYXNoQ29kZV9HZXRXKHRhZ25hbWUuY19zdHIoKSwgdHJ1ZSk7Ci19Ci0KLXZvaWQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpDb21wdXRlU3R5bGUoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgQ0ZERV9DU1NEZWNsYXJhdGlvbio+JiBkZWNsQXJyYXksCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0eWxlU3RyaW5nLAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBhbGlnblN0cmluZywKLSAgICBDRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBEZXN0KSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRkRFX0NTU0RlY2xhcmF0aW9uPiBwRGVjbDsKLSAgaWYgKCFzdHlsZVN0cmluZy5Jc0VtcHR5KCkgfHwgIWFsaWduU3RyaW5nLklzRW1wdHkoKSkgewotICAgIHBEZWNsID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGREVfQ1NTRGVjbGFyYXRpb24+KCk7Ci0KLSAgICBpZiAoIXN0eWxlU3RyaW5nLklzRW1wdHkoKSkKLSAgICAgIEFwcGVuZElubGluZVN0eWxlKHBEZWNsLmdldCgpLCBzdHlsZVN0cmluZyk7Ci0gICAgaWYgKCFhbGlnblN0cmluZy5Jc0VtcHR5KCkpIHsKLSAgICAgIHBEZWNsLT5BZGRQcm9wZXJ0eShGREVfR2V0Q1NTUHJvcGVydHlCeUVudW0oRkRFX0NTU1Byb3BlcnR5OjpUZXh0QWxpZ24pLAotICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduU3RyaW5nLkFzU3RyaW5nQygpKTsKLSAgICB9Ci0gIH0KLSAgQXBwbHlEZWNsYXJhdGlvbnMoZGVjbEFycmF5LCBwRGVjbC5nZXQoKSwgcERlc3QpOwotfQotCi12b2lkIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6QXBwbHlEZWNsYXJhdGlvbnMoCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgQ0ZERV9DU1NEZWNsYXJhdGlvbio+JiBkZWNsQXJyYXksCi0gICAgY29uc3QgQ0ZERV9DU1NEZWNsYXJhdGlvbiogZXh0cmFEZWNsLAotICAgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcENvbXB1dGVkU3R5bGUpIHsKLSAgc3RkOjp2ZWN0b3I8Y29uc3QgQ0ZERV9DU1NQcm9wZXJ0eUhvbGRlcio+IGltcG9ydGFudHM7Ci0gIHN0ZDo6dmVjdG9yPGNvbnN0IENGREVfQ1NTUHJvcGVydHlIb2xkZXIqPiBub3JtYWxzOwotICBzdGQ6OnZlY3Rvcjxjb25zdCBDRkRFX0NTU0N1c3RvbVByb3BlcnR5Kj4gY3VzdG9tczsKLQotICBmb3IgKGF1dG8mIGRlY2wgOiBkZWNsQXJyYXkpCi0gICAgRXh0cmFjdFZhbHVlcyhkZWNsLCAmaW1wb3J0YW50cywgJm5vcm1hbHMsICZjdXN0b21zKTsKLQotICBpZiAoZXh0cmFEZWNsKQotICAgIEV4dHJhY3RWYWx1ZXMoZXh0cmFEZWNsLCAmaW1wb3J0YW50cywgJm5vcm1hbHMsICZjdXN0b21zKTsKLQotICBmb3IgKGF1dG8mIHByb3AgOiBub3JtYWxzKQotICAgIEFwcGx5UHJvcGVydHkocHJvcC0+ZVByb3BlcnR5LCBwcm9wLT5wVmFsdWUsIHBDb21wdXRlZFN0eWxlKTsKLQotICBmb3IgKGF1dG8mIHByb3AgOiBjdXN0b21zKQotICAgIHBDb21wdXRlZFN0eWxlLT5BZGRDdXN0b21TdHlsZSgqcHJvcCk7Ci0KLSAgZm9yIChhdXRvJiBwcm9wIDogaW1wb3J0YW50cykKLSAgICBBcHBseVByb3BlcnR5KHByb3AtPmVQcm9wZXJ0eSwgcHJvcC0+cFZhbHVlLCBwQ29tcHV0ZWRTdHlsZSk7Ci19Ci0KLXZvaWQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpFeHRyYWN0VmFsdWVzKAotICAgIGNvbnN0IENGREVfQ1NTRGVjbGFyYXRpb24qIGRlY2wsCi0gICAgc3RkOjp2ZWN0b3I8Y29uc3QgQ0ZERV9DU1NQcm9wZXJ0eUhvbGRlcio+KiBpbXBvcnRhbnRzLAotICAgIHN0ZDo6dmVjdG9yPGNvbnN0IENGREVfQ1NTUHJvcGVydHlIb2xkZXIqPiogbm9ybWFscywKLSAgICBzdGQ6OnZlY3Rvcjxjb25zdCBDRkRFX0NTU0N1c3RvbVByb3BlcnR5Kj4qIGN1c3RvbSkgewotICBmb3IgKGNvbnN0IGF1dG8mIGhvbGRlciA6ICpkZWNsKSB7Ci0gICAgaWYgKGhvbGRlci0+YkltcG9ydGFudCkKLSAgICAgIGltcG9ydGFudHMtPnB1c2hfYmFjayhob2xkZXIuZ2V0KCkpOwotICAgIGVsc2UKLSAgICAgIG5vcm1hbHMtPnB1c2hfYmFjayhob2xkZXIuZ2V0KCkpOwotICB9Ci0gIGZvciAoYXV0byBpdCA9IGRlY2wtPmN1c3RvbV9iZWdpbigpOyBpdCAhPSBkZWNsLT5jdXN0b21fZW5kKCk7IGl0KyspCi0gICAgY3VzdG9tLT5wdXNoX2JhY2soaXQtPmdldCgpKTsKLX0KLQotdm9pZCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OkFwcGVuZElubGluZVN0eWxlKENGREVfQ1NTRGVjbGFyYXRpb24qIHBEZWNsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHlsZSkgewotICBBU1NFUlQocERlY2wgJiYgIXN0eWxlLklzRW1wdHkoKSk7Ci0KLSAgYXV0byBwU3ludGF4ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGREVfQ1NTU3ludGF4UGFyc2VyPigpOwotICBpZiAoIXBTeW50YXgtPkluaXQoc3R5bGUuY19zdHIoKSwgc3R5bGUuR2V0TGVuZ3RoKCksIDMyLCB0cnVlKSkKLSAgICByZXR1cm47Ci0KLSAgaW50MzJfdCBpTGVuMiA9IDA7Ci0gIGNvbnN0IEZERV9DU1NQcm9wZXJ0eVRhYmxlKiB0YWJsZSA9IG51bGxwdHI7Ci0gIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsKLSAgd2hpbGUgKDEpIHsKLSAgICBGREVfQ1NTU3ludGF4U3RhdHVzIGVTdGF0dXMgPSBwU3ludGF4LT5Eb1N5bnRheFBhcnNlKCk7Ci0gICAgaWYgKGVTdGF0dXMgPT0gRkRFX0NTU1N5bnRheFN0YXR1czo6UHJvcGVydHlOYW1lKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZ0Mgc3RyVmFsdWUgPSBwU3ludGF4LT5HZXRDdXJyZW50U3RyaW5nKCk7Ci0gICAgICB0YWJsZSA9IEZERV9HZXRDU1NQcm9wZXJ0eUJ5TmFtZShzdHJWYWx1ZSk7Ci0gICAgICBpZiAoIXRhYmxlKQotICAgICAgICB3c05hbWUgPSBDRlhfV2lkZVN0cmluZyhzdHJWYWx1ZSk7Ci0gICAgfSBlbHNlIGlmIChlU3RhdHVzID09IEZERV9DU1NTeW50YXhTdGF0dXM6OlByb3BlcnR5VmFsdWUpIHsKLSAgICAgIGlmICh0YWJsZSB8fCBpTGVuMiA+IDApIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHN0clZhbHVlID0gcFN5bnRheC0+R2V0Q3VycmVudFN0cmluZygpOwotICAgICAgICBpZiAoIXN0clZhbHVlLklzRW1wdHkoKSkgewotICAgICAgICAgIGlmICh0YWJsZSkKLSAgICAgICAgICAgIHBEZWNsLT5BZGRQcm9wZXJ0eSh0YWJsZSwgc3RyVmFsdWUpOwotICAgICAgICAgIGVsc2UgaWYgKGlMZW4yID4gMCkKLSAgICAgICAgICAgIHBEZWNsLT5BZGRQcm9wZXJ0eSh3c05hbWUsIENGWF9XaWRlU3RyaW5nKHN0clZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpBcHBseVByb3BlcnR5KAotICAgIEZERV9DU1NQcm9wZXJ0eSBlUHJvcGVydHksCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxDRkRFX0NTU1ZhbHVlPiYgcFZhbHVlLAotICAgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcENvbXB1dGVkU3R5bGUpIHsKLSAgaWYgKHBWYWx1ZS0+R2V0VHlwZSgpICE9IEZERV9DU1NQcmltaXRpdmVUeXBlOjpMaXN0KSB7Ci0gICAgRkRFX0NTU1ByaW1pdGl2ZVR5cGUgZVR5cGUgPSBwVmFsdWUtPkdldFR5cGUoKTsKLSAgICBzd2l0Y2ggKGVQcm9wZXJ0eSkgewotICAgICAgY2FzZSBGREVfQ1NTUHJvcGVydHk6OkRpc3BsYXk6Ci0gICAgICAgIGlmIChlVHlwZSA9PSBGREVfQ1NTUHJpbWl0aXZlVHlwZTo6RW51bSkgewotICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEubV9lRGlzcGxheSA9Ci0gICAgICAgICAgICAgIFRvRGlzcGxheShwVmFsdWUuQXM8Q0ZERV9DU1NFbnVtVmFsdWU+KCktPlZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGREVfQ1NTUHJvcGVydHk6OkZvbnRTaXplOiB7Ci0gICAgICAgIEZYX0ZMT0FUJiBmRm9udFNpemUgPSBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplOwotICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1ByaW1pdGl2ZVR5cGU6Ok51bWJlcikgewotICAgICAgICAgIGZGb250U2l6ZSA9IHBWYWx1ZS5BczxDRkRFX0NTU051bWJlclZhbHVlPigpLT5BcHBseShmRm9udFNpemUpOwotICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID09IEZERV9DU1NQcmltaXRpdmVUeXBlOjpFbnVtKSB7Ci0gICAgICAgICAgZkZvbnRTaXplID0KLSAgICAgICAgICAgICAgVG9Gb250U2l6ZShwVmFsdWUuQXM8Q0ZERV9DU1NFbnVtVmFsdWU+KCktPlZhbHVlKCksIGZGb250U2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eTo6TGluZUhlaWdodDoKLSAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQcmltaXRpdmVUeXBlOjpOdW1iZXIpIHsKLSAgICAgICAgICBDRlhfUmV0YWluUHRyPENGREVfQ1NTTnVtYmVyVmFsdWU+IHYgPQotICAgICAgICAgICAgICBwVmFsdWUuQXM8Q0ZERV9DU1NOdW1iZXJWYWx1ZT4oKTsKLSAgICAgICAgICBpZiAodi0+S2luZCgpID09IEZERV9DU1NOdW1iZXJUeXBlOjpOdW1iZXIpIHsKLSAgICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9mTGluZUhlaWdodCA9Ci0gICAgICAgICAgICAgICAgdi0+VmFsdWUoKSAqIHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9mRm9udFNpemU7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9mTGluZUhlaWdodCA9Ci0gICAgICAgICAgICAgICAgdi0+QXBwbHkocENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX2ZGb250U2l6ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGREVfQ1NTUHJvcGVydHk6OlRleHRBbGlnbjoKLSAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQcmltaXRpdmVUeXBlOjpFbnVtKSB7Ci0gICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX2VUZXh0QWxpZ24gPQotICAgICAgICAgICAgICBUb1RleHRBbGlnbihwVmFsdWUuQXM8Q0ZERV9DU1NFbnVtVmFsdWU+KCktPlZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGREVfQ1NTUHJvcGVydHk6OlRleHRJbmRlbnQ6Ci0gICAgICAgIFNldExlbmd0aFdpdGhQZXJjZW50KHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9UZXh0SW5kZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlVHlwZSwgcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eTo6Rm9udFdlaWdodDoKLSAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQcmltaXRpdmVUeXBlOjpFbnVtKSB7Ci0gICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX3dGb250V2VpZ2h0ID0KLSAgICAgICAgICAgICAgVG9Gb250V2VpZ2h0KHBWYWx1ZS5BczxDRkRFX0NTU0VudW1WYWx1ZT4oKS0+VmFsdWUoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gRkRFX0NTU1ByaW1pdGl2ZVR5cGU6Ok51bWJlcikgewotICAgICAgICAgIGludDMyX3QgaVZhbHVlID0KLSAgICAgICAgICAgICAgKGludDMyX3QpcFZhbHVlLkFzPENGREVfQ1NTTnVtYmVyVmFsdWU+KCktPlZhbHVlKCkgLyAxMDA7Ci0gICAgICAgICAgaWYgKGlWYWx1ZSA+PSAxICYmIGlWYWx1ZSA8PSA5KSB7Ci0gICAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fd0ZvbnRXZWlnaHQgPSBpVmFsdWUgKiAxMDA7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGREVfQ1NTUHJvcGVydHk6OkZvbnRTdHlsZToKLSAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQcmltaXRpdmVUeXBlOjpFbnVtKSB7Ci0gICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX2VGb250U3R5bGUgPQotICAgICAgICAgICAgICBUb0ZvbnRTdHlsZShwVmFsdWUuQXM8Q0ZERV9DU1NFbnVtVmFsdWU+KCktPlZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGREVfQ1NTUHJvcGVydHk6OkNvbG9yOgotICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1ByaW1pdGl2ZVR5cGU6OlJHQikgewotICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9kd0ZvbnRDb2xvciA9Ci0gICAgICAgICAgICAgIHBWYWx1ZS5BczxDRkRFX0NTU0NvbG9yVmFsdWU+KCktPlZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eTo6TWFyZ2luTGVmdDoKLSAgICAgICAgaWYgKFNldExlbmd0aFdpdGhQZXJjZW50KAotICAgICAgICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEubV9NYXJnaW5XaWR0aC5sZWZ0LCBlVHlwZSwKLSAgICAgICAgICAgICAgICBwVmFsdWUsIHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9mRm9udFNpemUpKSB7Ci0gICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX2JIYXNNYXJnaW4gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGREVfQ1NTUHJvcGVydHk6Ok1hcmdpblRvcDoKLSAgICAgICAgaWYgKFNldExlbmd0aFdpdGhQZXJjZW50KAotICAgICAgICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEubV9NYXJnaW5XaWR0aC50b3AsIGVUeXBlLAotICAgICAgICAgICAgICAgIHBWYWx1ZSwgcENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX2ZGb250U2l6ZSkpIHsKLSAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fYkhhc01hcmdpbiA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eTo6TWFyZ2luUmlnaHQ6Ci0gICAgICAgIGlmIChTZXRMZW5ndGhXaXRoUGVyY2VudCgKLSAgICAgICAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fTWFyZ2luV2lkdGgucmlnaHQsIGVUeXBlLAotICAgICAgICAgICAgICAgIHBWYWx1ZSwgcENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX2ZGb250U2l6ZSkpIHsKLSAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fYkhhc01hcmdpbiA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eTo6TWFyZ2luQm90dG9tOgotICAgICAgICBpZiAoU2V0TGVuZ3RoV2l0aFBlcmNlbnQoCi0gICAgICAgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX01hcmdpbldpZHRoLmJvdHRvbSwgZVR5cGUsCi0gICAgICAgICAgICAgICAgcFZhbHVlLCBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplKSkgewotICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEubV9iSGFzTWFyZ2luID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5OjpQYWRkaW5nTGVmdDoKLSAgICAgICAgaWYgKFNldExlbmd0aFdpdGhQZXJjZW50KAotICAgICAgICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEubV9QYWRkaW5nV2lkdGgubGVmdCwgZVR5cGUsCi0gICAgICAgICAgICAgICAgcFZhbHVlLCBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplKSkgewotICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEubV9iSGFzUGFkZGluZyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eTo6UGFkZGluZ1RvcDoKLSAgICAgICAgaWYgKFNldExlbmd0aFdpdGhQZXJjZW50KAotICAgICAgICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEubV9QYWRkaW5nV2lkdGgudG9wLCBlVHlwZSwKLSAgICAgICAgICAgICAgICBwVmFsdWUsIHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9mRm9udFNpemUpKSB7Ci0gICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX2JIYXNQYWRkaW5nID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5OjpQYWRkaW5nUmlnaHQ6Ci0gICAgICAgIGlmIChTZXRMZW5ndGhXaXRoUGVyY2VudCgKLSAgICAgICAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fUGFkZGluZ1dpZHRoLnJpZ2h0LCBlVHlwZSwKLSAgICAgICAgICAgICAgICBwVmFsdWUsIHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9mRm9udFNpemUpKSB7Ci0gICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX2JIYXNQYWRkaW5nID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5OjpQYWRkaW5nQm90dG9tOgotICAgICAgICBpZiAoU2V0TGVuZ3RoV2l0aFBlcmNlbnQoCi0gICAgICAgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX1BhZGRpbmdXaWR0aC5ib3R0b20sIGVUeXBlLAotICAgICAgICAgICAgICAgIHBWYWx1ZSwgcENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX2ZGb250U2l6ZSkpIHsKLSAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fYkhhc1BhZGRpbmcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGREVfQ1NTUHJvcGVydHk6OkJvcmRlckxlZnRXaWR0aDoKLSAgICAgICAgaWYgKFNldExlbmd0aFdpdGhQZXJjZW50KAotICAgICAgICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEubV9Cb3JkZXJXaWR0aC5sZWZ0LCBlVHlwZSwKLSAgICAgICAgICAgICAgICBwVmFsdWUsIHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9mRm9udFNpemUpKSB7Ci0gICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX2JIYXNCb3JkZXIgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGREVfQ1NTUHJvcGVydHk6OkJvcmRlclRvcFdpZHRoOgotICAgICAgICBpZiAoU2V0TGVuZ3RoV2l0aFBlcmNlbnQoCi0gICAgICAgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX0JvcmRlcldpZHRoLnRvcCwgZVR5cGUsCi0gICAgICAgICAgICAgICAgcFZhbHVlLCBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplKSkgewotICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEubV9iSGFzQm9yZGVyID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5OjpCb3JkZXJSaWdodFdpZHRoOgotICAgICAgICBpZiAoU2V0TGVuZ3RoV2l0aFBlcmNlbnQoCi0gICAgICAgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX0JvcmRlcldpZHRoLnJpZ2h0LCBlVHlwZSwKLSAgICAgICAgICAgICAgICBwVmFsdWUsIHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9mRm9udFNpemUpKSB7Ci0gICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX2JIYXNCb3JkZXIgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGREVfQ1NTUHJvcGVydHk6OkJvcmRlckJvdHRvbVdpZHRoOgotICAgICAgICBpZiAoU2V0TGVuZ3RoV2l0aFBlcmNlbnQoCi0gICAgICAgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX0JvcmRlcldpZHRoLmJvdHRvbSwgZVR5cGUsCi0gICAgICAgICAgICAgICAgcFZhbHVlLCBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplKSkgewotICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEubV9iSGFzQm9yZGVyID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5OjpWZXJ0aWNhbEFsaWduOgotICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1ByaW1pdGl2ZVR5cGU6OkVudW0pIHsKLSAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fZVZlcnRpY2FsQWxpZ24gPQotICAgICAgICAgICAgICBUb1ZlcnRpY2FsQWxpZ24ocFZhbHVlLkFzPENGREVfQ1NTRW51bVZhbHVlPigpLT5WYWx1ZSgpKTsKLSAgICAgICAgfSBlbHNlIGlmIChlVHlwZSA9PSBGREVfQ1NTUHJpbWl0aXZlVHlwZTo6TnVtYmVyKSB7Ci0gICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX2VWZXJ0aWNhbEFsaWduID0KLSAgICAgICAgICAgICAgRkRFX0NTU1ZlcnRpY2FsQWxpZ246Ok51bWJlcjsKLSAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fZlZlcnRpY2FsQWxpZ24gPQotICAgICAgICAgICAgICBwVmFsdWUuQXM8Q0ZERV9DU1NOdW1iZXJWYWx1ZT4oKS0+QXBwbHkoCi0gICAgICAgICAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5OjpGb250VmFyaWFudDoKLSAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQcmltaXRpdmVUeXBlOjpFbnVtKSB7Ci0gICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX2VGb250VmFyaWFudCA9Ci0gICAgICAgICAgICAgIFRvRm9udFZhcmlhbnQocFZhbHVlLkFzPENGREVfQ1NTRW51bVZhbHVlPigpLT5WYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5OjpMZXR0ZXJTcGFjaW5nOgotICAgICAgICBpZiAoZVR5cGUgPT0gRkRFX0NTU1ByaW1pdGl2ZVR5cGU6OkVudW0pIHsKLSAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fTGV0dGVyU3BhY2luZy5TZXQoCi0gICAgICAgICAgICAgIEZERV9DU1NMZW5ndGhVbml0OjpOb3JtYWwpOwotICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID09IEZERV9DU1NQcmltaXRpdmVUeXBlOjpOdW1iZXIpIHsKLSAgICAgICAgICBpZiAocFZhbHVlLkFzPENGREVfQ1NTTnVtYmVyVmFsdWU+KCktPktpbmQoKSA9PQotICAgICAgICAgICAgICBGREVfQ1NTTnVtYmVyVHlwZTo6UGVyY2VudCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQocENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX0xldHRlclNwYWNpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZVR5cGUsIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5OjpXb3JkU3BhY2luZzoKLSAgICAgICAgaWYgKGVUeXBlID09IEZERV9DU1NQcmltaXRpdmVUeXBlOjpFbnVtKSB7Ci0gICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX1dvcmRTcGFjaW5nLlNldCgKLSAgICAgICAgICAgICAgRkRFX0NTU0xlbmd0aFVuaXQ6Ok5vcm1hbCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gRkRFX0NTU1ByaW1pdGl2ZVR5cGU6Ok51bWJlcikgewotICAgICAgICAgIGlmIChwVmFsdWUuQXM8Q0ZERV9DU1NOdW1iZXJWYWx1ZT4oKS0+S2luZCgpID09Ci0gICAgICAgICAgICAgIEZERV9DU1NOdW1iZXJUeXBlOjpQZXJjZW50KSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQocENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX1dvcmRTcGFjaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVUeXBlLCBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbXB1dGVkU3R5bGUtPm1fSW5oZXJpdGVkRGF0YS5tX2ZGb250U2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eTo6VG9wOgotICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fVG9wLCBlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eTo6Qm90dG9tOgotICAgICAgICBTZXRMZW5ndGhXaXRoUGVyY2VudChwQ29tcHV0ZWRTdHlsZS0+bV9Ob25Jbmhlcml0ZWREYXRhLm1fQm90dG9tLCBlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eTo6TGVmdDoKLSAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQocENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX0xlZnQsIGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX0luaGVyaXRlZERhdGEubV9mRm9udFNpemUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5OjpSaWdodDoKLSAgICAgICAgU2V0TGVuZ3RoV2l0aFBlcmNlbnQocENvbXB1dGVkU3R5bGUtPm1fTm9uSW5oZXJpdGVkRGF0YS5tX1JpZ2h0LCBlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fZkZvbnRTaXplKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0gZWxzZSBpZiAocFZhbHVlLT5HZXRUeXBlKCkgPT0gRkRFX0NTU1ByaW1pdGl2ZVR5cGU6Okxpc3QpIHsKLSAgICBDRlhfUmV0YWluUHRyPENGREVfQ1NTVmFsdWVMaXN0PiBwTGlzdCA9IHBWYWx1ZS5BczxDRkRFX0NTU1ZhbHVlTGlzdD4oKTsKLSAgICBpbnQzMl90IGlDb3VudCA9IHBMaXN0LT5Db3VudFZhbHVlcygpOwotICAgIGlmIChpQ291bnQgPiAwKSB7Ci0gICAgICBzd2l0Y2ggKGVQcm9wZXJ0eSkgewotICAgICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eTo6Rm9udEZhbWlseToKLSAgICAgICAgICBwQ29tcHV0ZWRTdHlsZS0+bV9Jbmhlcml0ZWREYXRhLm1fcEZvbnRGYW1pbHkgPSBwTGlzdDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGREVfQ1NTUHJvcGVydHk6OlRleHREZWNvcmF0aW9uOgotICAgICAgICAgIHBDb21wdXRlZFN0eWxlLT5tX05vbkluaGVyaXRlZERhdGEubV9kd1RleHREZWNvcmF0aW9uID0KLSAgICAgICAgICAgICAgVG9UZXh0RGVjb3JhdGlvbihwTGlzdCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIEFTU0VSVChmYWxzZSk7Ci0gIH0KLX0KLQotRkRFX0NTU0Rpc3BsYXkgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb0Rpc3BsYXkoRkRFX0NTU1Byb3BlcnR5VmFsdWUgZVZhbHVlKSB7Ci0gIHN3aXRjaCAoZVZhbHVlKSB7Ci0gICAgY2FzZSBGREVfQ1NTUHJvcGVydHlWYWx1ZTo6QmxvY2s6Ci0gICAgICByZXR1cm4gRkRFX0NTU0Rpc3BsYXk6OkJsb2NrOwotICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6Ok5vbmU6Ci0gICAgICByZXR1cm4gRkRFX0NTU0Rpc3BsYXk6Ok5vbmU7Ci0gICAgY2FzZSBGREVfQ1NTUHJvcGVydHlWYWx1ZTo6TGlzdEl0ZW06Ci0gICAgICByZXR1cm4gRkRFX0NTU0Rpc3BsYXk6Okxpc3RJdGVtOwotICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6OklubGluZVRhYmxlOgotICAgICAgcmV0dXJuIEZERV9DU1NEaXNwbGF5OjpJbmxpbmVUYWJsZTsKLSAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpJbmxpbmVCbG9jazoKLSAgICAgIHJldHVybiBGREVfQ1NTRGlzcGxheTo6SW5saW5lQmxvY2s7Ci0gICAgY2FzZSBGREVfQ1NTUHJvcGVydHlWYWx1ZTo6SW5saW5lOgotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gRkRFX0NTU0Rpc3BsYXk6OklubGluZTsKLSAgfQotfQotCi1GREVfQ1NTVGV4dEFsaWduIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9UZXh0QWxpZ24oCi0gICAgRkRFX0NTU1Byb3BlcnR5VmFsdWUgZVZhbHVlKSB7Ci0gIHN3aXRjaCAoZVZhbHVlKSB7Ci0gICAgY2FzZSBGREVfQ1NTUHJvcGVydHlWYWx1ZTo6Q2VudGVyOgotICAgICAgcmV0dXJuIEZERV9DU1NUZXh0QWxpZ246OkNlbnRlcjsKLSAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpSaWdodDoKLSAgICAgIHJldHVybiBGREVfQ1NTVGV4dEFsaWduOjpSaWdodDsKLSAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpKdXN0aWZ5OgotICAgICAgcmV0dXJuIEZERV9DU1NUZXh0QWxpZ246Okp1c3RpZnk7Ci0gICAgY2FzZSBGREVfQ1NTUHJvcGVydHlWYWx1ZTo6TGVmdDoKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEZERV9DU1NUZXh0QWxpZ246OkxlZnQ7Ci0gIH0KLX0KLQotdWludDE2X3QgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb0ZvbnRXZWlnaHQoRkRFX0NTU1Byb3BlcnR5VmFsdWUgZVZhbHVlKSB7Ci0gIHN3aXRjaCAoZVZhbHVlKSB7Ci0gICAgY2FzZSBGREVfQ1NTUHJvcGVydHlWYWx1ZTo6Qm9sZDoKLSAgICAgIHJldHVybiA3MDA7Ci0gICAgY2FzZSBGREVfQ1NTUHJvcGVydHlWYWx1ZTo6Qm9sZGVyOgotICAgICAgcmV0dXJuIDkwMDsKLSAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpMaWdodGVyOgotICAgICAgcmV0dXJuIDIwMDsKLSAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpOb3JtYWw6Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiA0MDA7Ci0gIH0KLX0KLQotRkRFX0NTU0ZvbnRTdHlsZSBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvRm9udFN0eWxlKAotICAgIEZERV9DU1NQcm9wZXJ0eVZhbHVlIGVWYWx1ZSkgewotICBzd2l0Y2ggKGVWYWx1ZSkgewotICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6Okl0YWxpYzoKLSAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpPYmxpcXVlOgotICAgICAgcmV0dXJuIEZERV9DU1NGb250U3R5bGU6Okl0YWxpYzsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEZERV9DU1NGb250U3R5bGU6Ok5vcm1hbDsKLSAgfQotfQotCi1ib29sIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6U2V0TGVuZ3RoV2l0aFBlcmNlbnQoCi0gICAgRkRFX0NTU0xlbmd0aCYgd2lkdGgsCi0gICAgRkRFX0NTU1ByaW1pdGl2ZVR5cGUgZVR5cGUsCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxDRkRFX0NTU1ZhbHVlPiYgcFZhbHVlLAotICAgIEZYX0ZMT0FUIGZGb250U2l6ZSkgewotICBpZiAoZVR5cGUgPT0gRkRFX0NTU1ByaW1pdGl2ZVR5cGU6Ok51bWJlcikgewotICAgIENGWF9SZXRhaW5QdHI8Q0ZERV9DU1NOdW1iZXJWYWx1ZT4gdiA9IHBWYWx1ZS5BczxDRkRFX0NTU051bWJlclZhbHVlPigpOwotICAgIGlmICh2LT5LaW5kKCkgPT0gRkRFX0NTU051bWJlclR5cGU6OlBlcmNlbnQpIHsKLSAgICAgIHdpZHRoLlNldChGREVfQ1NTTGVuZ3RoVW5pdDo6UGVyY2VudCwKLSAgICAgICAgICAgICAgICBwVmFsdWUuQXM8Q0ZERV9DU1NOdW1iZXJWYWx1ZT4oKS0+VmFsdWUoKSAvIDEwMC4wZik7Ci0gICAgICByZXR1cm4gd2lkdGguTm9uWmVybygpOwotICAgIH0KLQotICAgIEZYX0ZMT0FUIGZWYWx1ZSA9IHYtPkFwcGx5KGZGb250U2l6ZSk7Ci0gICAgd2lkdGguU2V0KEZERV9DU1NMZW5ndGhVbml0OjpQb2ludCwgZlZhbHVlKTsKLSAgICByZXR1cm4gd2lkdGguTm9uWmVybygpOwotICB9IGVsc2UgaWYgKGVUeXBlID09IEZERV9DU1NQcmltaXRpdmVUeXBlOjpFbnVtKSB7Ci0gICAgc3dpdGNoIChwVmFsdWUuQXM8Q0ZERV9DU1NFbnVtVmFsdWU+KCktPlZhbHVlKCkpIHsKLSAgICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6OkF1dG86Ci0gICAgICAgIHdpZHRoLlNldChGREVfQ1NTTGVuZ3RoVW5pdDo6QXV0byk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgY2FzZSBGREVfQ1NTUHJvcGVydHlWYWx1ZTo6Tm9uZToKLSAgICAgICAgd2lkdGguU2V0KEZERV9DU1NMZW5ndGhVbml0OjpOb25lKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpUaGluOgotICAgICAgICB3aWR0aC5TZXQoRkRFX0NTU0xlbmd0aFVuaXQ6OlBvaW50LCAyKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpNZWRpdW06Ci0gICAgICAgIHdpZHRoLlNldChGREVfQ1NTTGVuZ3RoVW5pdDo6UG9pbnQsIDMpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6OlRoaWNrOgotICAgICAgICB3aWR0aC5TZXQoRkRFX0NTU0xlbmd0aFVuaXQ6OlBvaW50LCA0KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotRlhfRkxPQVQgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb0ZvbnRTaXplKEZERV9DU1NQcm9wZXJ0eVZhbHVlIGVWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ3VyRm9udFNpemUpIHsKLSAgc3dpdGNoIChlVmFsdWUpIHsKLSAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpYeFNtYWxsOgotICAgICAgcmV0dXJuIG1fZkRlZkZvbnRTaXplIC8gMS4yZiAvIDEuMmYgLyAxLjJmOwotICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6OlhTbWFsbDoKLSAgICAgIHJldHVybiBtX2ZEZWZGb250U2l6ZSAvIDEuMmYgLyAxLjJmOwotICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6OlNtYWxsOgotICAgICAgcmV0dXJuIG1fZkRlZkZvbnRTaXplIC8gMS4yZjsKLSAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpNZWRpdW06Ci0gICAgICByZXR1cm4gbV9mRGVmRm9udFNpemU7Ci0gICAgY2FzZSBGREVfQ1NTUHJvcGVydHlWYWx1ZTo6TGFyZ2U6Ci0gICAgICByZXR1cm4gbV9mRGVmRm9udFNpemUgKiAxLjJmOwotICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6OlhMYXJnZToKLSAgICAgIHJldHVybiBtX2ZEZWZGb250U2l6ZSAqIDEuMmYgKiAxLjJmOwotICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6Olh4TGFyZ2U6Ci0gICAgICByZXR1cm4gbV9mRGVmRm9udFNpemUgKiAxLjJmICogMS4yZiAqIDEuMmY7Ci0gICAgY2FzZSBGREVfQ1NTUHJvcGVydHlWYWx1ZTo6TGFyZ2VyOgotICAgICAgcmV0dXJuIGZDdXJGb250U2l6ZSAqIDEuMmY7Ci0gICAgY2FzZSBGREVfQ1NTUHJvcGVydHlWYWx1ZTo6U21hbGxlcjoKLSAgICAgIHJldHVybiBmQ3VyRm9udFNpemUgLyAxLjJmOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZkN1ckZvbnRTaXplOwotICB9Ci19Ci0KLUZERV9DU1NWZXJ0aWNhbEFsaWduIENGREVfQ1NTU3R5bGVTZWxlY3Rvcjo6VG9WZXJ0aWNhbEFsaWduKAotICAgIEZERV9DU1NQcm9wZXJ0eVZhbHVlIGVWYWx1ZSkgewotICBzd2l0Y2ggKGVWYWx1ZSkgewotICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6Ok1pZGRsZToKLSAgICAgIHJldHVybiBGREVfQ1NTVmVydGljYWxBbGlnbjo6TWlkZGxlOwotICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6OkJvdHRvbToKLSAgICAgIHJldHVybiBGREVfQ1NTVmVydGljYWxBbGlnbjo6Qm90dG9tOwotICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6OlN1cGVyOgotICAgICAgcmV0dXJuIEZERV9DU1NWZXJ0aWNhbEFsaWduOjpTdXBlcjsKLSAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpTdWI6Ci0gICAgICByZXR1cm4gRkRFX0NTU1ZlcnRpY2FsQWxpZ246OlN1YjsKLSAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpUb3A6Ci0gICAgICByZXR1cm4gRkRFX0NTU1ZlcnRpY2FsQWxpZ246OlRvcDsKLSAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpUZXh0VG9wOgotICAgICAgcmV0dXJuIEZERV9DU1NWZXJ0aWNhbEFsaWduOjpUZXh0VG9wOwotICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6OlRleHRCb3R0b206Ci0gICAgICByZXR1cm4gRkRFX0NTU1ZlcnRpY2FsQWxpZ246OlRleHRCb3R0b207Ci0gICAgY2FzZSBGREVfQ1NTUHJvcGVydHlWYWx1ZTo6QmFzZWxpbmU6Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBGREVfQ1NTVmVydGljYWxBbGlnbjo6QmFzZWxpbmU7Ci0gIH0KLX0KLQotdWludDMyX3QgQ0ZERV9DU1NTdHlsZVNlbGVjdG9yOjpUb1RleHREZWNvcmF0aW9uKAotICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8Q0ZERV9DU1NWYWx1ZUxpc3Q+JiBwVmFsdWUpIHsKLSAgdWludDMyX3QgZHdEZWNvcmF0aW9uID0gMDsKLSAgZm9yIChpbnQzMl90IGkgPSBwVmFsdWUtPkNvdW50VmFsdWVzKCkgLSAxOyBpID49IDA7IC0taSkgewotICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8Q0ZERV9DU1NWYWx1ZT4gcFZhbCA9IHBWYWx1ZS0+R2V0VmFsdWUoaSk7Ci0gICAgaWYgKHBWYWwtPkdldFR5cGUoKSAhPSBGREVfQ1NTUHJpbWl0aXZlVHlwZTo6RW51bSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgc3dpdGNoIChwVmFsLkFzPENGREVfQ1NTRW51bVZhbHVlPigpLT5WYWx1ZSgpKSB7Ci0gICAgICBjYXNlIEZERV9DU1NQcm9wZXJ0eVZhbHVlOjpVbmRlcmxpbmU6Ci0gICAgICAgIGR3RGVjb3JhdGlvbiB8PSBGREVfQ1NTVEVYVERFQ09SQVRJT05fVW5kZXJsaW5lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6OkxpbmVUaHJvdWdoOgotICAgICAgICBkd0RlY29yYXRpb24gfD0gRkRFX0NTU1RFWFRERUNPUkFUSU9OX0xpbmVUaHJvdWdoOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6Ok92ZXJsaW5lOgotICAgICAgICBkd0RlY29yYXRpb24gfD0gRkRFX0NTU1RFWFRERUNPUkFUSU9OX092ZXJsaW5lOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6OkJsaW5rOgotICAgICAgICBkd0RlY29yYXRpb24gfD0gRkRFX0NTU1RFWFRERUNPUkFUSU9OX0JsaW5rOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX0NTU1Byb3BlcnR5VmFsdWU6OkRvdWJsZToKLSAgICAgICAgZHdEZWNvcmF0aW9uIHw9IEZERV9DU1NURVhUREVDT1JBVElPTl9Eb3VibGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBkd0RlY29yYXRpb247Ci19Ci0KLUZERV9DU1NGb250VmFyaWFudCBDRkRFX0NTU1N0eWxlU2VsZWN0b3I6OlRvRm9udFZhcmlhbnQoCi0gICAgRkRFX0NTU1Byb3BlcnR5VmFsdWUgZVZhbHVlKSB7Ci0gIHJldHVybiBlVmFsdWUgPT0gRkRFX0NTU1Byb3BlcnR5VmFsdWU6OlNtYWxsQ2FwcwotICAgICAgICAgICAgID8gRkRFX0NTU0ZvbnRWYXJpYW50OjpTbWFsbENhcHMKLSAgICAgICAgICAgICA6IEZERV9DU1NGb250VmFyaWFudDo6Tm9ybWFsOwotfQpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9jc3MvY2ZkZV9jc3NzdHlsZXNlbGVjdG9yLmggYi94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N0eWxlc2VsZWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdiNmI0MS4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N0eWxlc2VsZWN0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRkRFX0NTU19DRkRFX0NTU1NUWUxFU0VMRUNUT1JfSF8KLSNkZWZpbmUgWEZBX0ZERV9DU1NfQ0ZERV9DU1NTVFlMRVNFTEVDVE9SX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NydWxlY29sbGVjdGlvbi5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2ZkZV9jc3MuaCIKLQotY2xhc3MgQ0ZERV9DU1NDb21wdXRlZFN0eWxlOwotY2xhc3MgQ0ZERV9DU1NDdXN0b21Qcm9wZXJ0eTsKLWNsYXNzIENGREVfQ1NTRGVjbGFyYXRpb247Ci1jbGFzcyBDRkRFX0NTU1Byb3BlcnR5SG9sZGVyOwotY2xhc3MgQ0ZERV9DU1NTZWxlY3RvcjsKLWNsYXNzIENGREVfQ1NTU3R5bGVTaGVldDsKLWNsYXNzIENGREVfQ1NTVmFsdWU7Ci1jbGFzcyBDRkRFX0NTU1ZhbHVlTGlzdDsKLWNsYXNzIENGR0FTX0ZvbnRNZ3I7Ci0KLWNsYXNzIENGREVfQ1NTU3R5bGVTZWxlY3RvciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDRkRFX0NTU1N0eWxlU2VsZWN0b3IoQ0ZHQVNfRm9udE1nciogcEZvbnRNZ3IpOwotICB+Q0ZERV9DU1NTdHlsZVNlbGVjdG9yKCk7Ci0KLSAgdm9pZCBTZXREZWZGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOwotICB2b2lkIFNldFVBU3R5bGVTaGVldChzdGQ6OnVuaXF1ZV9wdHI8Q0ZERV9DU1NTdHlsZVNoZWV0PiBwU2hlZXQpOwotICB2b2lkIFVwZGF0ZVN0eWxlSW5kZXgoKTsKLQotICBDRlhfUmV0YWluUHRyPENGREVfQ1NTQ29tcHV0ZWRTdHlsZT4gQ3JlYXRlQ29tcHV0ZWRTdHlsZSgKLSAgICAgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFBhcmVudFN0eWxlKTsKLQotICAvLyBOb3RlLCB0aGUgZGVzdCBzdHlsZSBoYXMgdG8gYmUgYW4gb3V0IHBhcmFtIGJlY2F1c2UgdGhlIENYRkFfVGV4dFBhcnNlcgotICAvLyBhZGRzIG5vbi1pbmhlcml0ZWQgZGF0YSBmcm9tIHRoZSBwYXJlbnQgc3R5bGUuIEF0dGVtcHRpbmcgdG8gY29weQotICAvLyBpbnRlcm5hbGx5IHdpbGwgZmFpbCBhcyB5b3UnbGwgbG9zZSB0aGUgbm9uLWluaGVyaXRlZCBkYXRhLgotICB2b2lkIENvbXB1dGVTdHlsZShjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBDRkRFX0NTU0RlY2xhcmF0aW9uKj4mIGRlY2xBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHN0eWxlU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgYWxpZ25TdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcERlc3RTdHlsZSk7Ci0KLSAgc3RkOjp2ZWN0b3I8Y29uc3QgQ0ZERV9DU1NEZWNsYXJhdGlvbio+IE1hdGNoRGVjbGFyYXRpb25zKAotICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHRhZ25hbWUpOwotCi0gcHJpdmF0ZToKLSAgYm9vbCBNYXRjaFNlbGVjdG9yKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB0YWduYW1lLCBDRkRFX0NTU1NlbGVjdG9yKiBwU2VsKTsKLQotICB2b2lkIEFwcGVuZElubGluZVN0eWxlKENGREVfQ1NTRGVjbGFyYXRpb24qIHBEZWNsLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHlsZSk7Ci0gIHZvaWQgQXBwbHlEZWNsYXJhdGlvbnMoCi0gICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBDRkRFX0NTU0RlY2xhcmF0aW9uKj4mIGRlY2xBcnJheSwKLSAgICAgIGNvbnN0IENGREVfQ1NTRGVjbGFyYXRpb24qIGV4dHJhRGVjbCwKLSAgICAgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcERlc3RTdHlsZSk7Ci0gIHZvaWQgQXBwbHlQcm9wZXJ0eShGREVfQ1NTUHJvcGVydHkgZVByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JldGFpblB0cjxDRkRFX0NTU1ZhbHVlPiYgcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgQ0ZERV9DU1NDb21wdXRlZFN0eWxlKiBwQ29tcHV0ZWRTdHlsZSk7Ci0gIHZvaWQgRXh0cmFjdFZhbHVlcyhjb25zdCBDRkRFX0NTU0RlY2xhcmF0aW9uKiBkZWNsLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgQ0ZERV9DU1NQcm9wZXJ0eUhvbGRlcio+KiBpbXBvcnRhbnRzLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgQ0ZERV9DU1NQcm9wZXJ0eUhvbGRlcio+KiBub3JtYWxzLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgQ0ZERV9DU1NDdXN0b21Qcm9wZXJ0eSo+KiBjdXN0b20pOwotCi0gIGJvb2wgU2V0TGVuZ3RoV2l0aFBlcmNlbnQoRkRFX0NTU0xlbmd0aCYgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX0NTU1ByaW1pdGl2ZVR5cGUgZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JldGFpblB0cjxDRkRFX0NTU1ZhbHVlPiYgcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSk7Ci0gIEZYX0ZMT0FUIFRvRm9udFNpemUoRkRFX0NTU1Byb3BlcnR5VmFsdWUgZVZhbHVlLCBGWF9GTE9BVCBmQ3VyRm9udFNpemUpOwotICBGREVfQ1NTRGlzcGxheSBUb0Rpc3BsYXkoRkRFX0NTU1Byb3BlcnR5VmFsdWUgZVZhbHVlKTsKLSAgRkRFX0NTU1RleHRBbGlnbiBUb1RleHRBbGlnbihGREVfQ1NTUHJvcGVydHlWYWx1ZSBlVmFsdWUpOwotICB1aW50MTZfdCBUb0ZvbnRXZWlnaHQoRkRFX0NTU1Byb3BlcnR5VmFsdWUgZVZhbHVlKTsKLSAgRkRFX0NTU0ZvbnRTdHlsZSBUb0ZvbnRTdHlsZShGREVfQ1NTUHJvcGVydHlWYWx1ZSBlVmFsdWUpOwotICBGREVfQ1NTVmVydGljYWxBbGlnbiBUb1ZlcnRpY2FsQWxpZ24oRkRFX0NTU1Byb3BlcnR5VmFsdWUgZVZhbHVlKTsKLSAgdWludDMyX3QgVG9UZXh0RGVjb3JhdGlvbihjb25zdCBDRlhfUmV0YWluUHRyPENGREVfQ1NTVmFsdWVMaXN0PiYgcExpc3QpOwotICBGREVfQ1NTRm9udFZhcmlhbnQgVG9Gb250VmFyaWFudChGREVfQ1NTUHJvcGVydHlWYWx1ZSBlVmFsdWUpOwotCi0gIENGR0FTX0ZvbnRNZ3IqIGNvbnN0IG1fcEZvbnRNZ3I7Ci0gIEZYX0ZMT0FUIG1fZkRlZkZvbnRTaXplOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZERV9DU1NTdHlsZVNoZWV0PiBtX1VBU3R5bGVzOwotICBDRkRFX0NTU1J1bGVDb2xsZWN0aW9uIG1fVUFSdWxlczsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZERV9DU1NfQ0ZERV9DU1NTVFlMRVNFTEVDVE9SX0hfCmRpZmYgLS1naXQgYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N0eWxlc2hlZXQuY3BwIGIveGZhL2ZkZS9jc3MvY2ZkZV9jc3NzdHlsZXNoZWV0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhiZjcwZS4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N0eWxlc2hlZXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3Nzc3R5bGVzaGVldC5oIgotCi0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NkZWNsYXJhdGlvbi5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3Nzc3R5bGVydWxlLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvZmRlX2Nzc2RhdGF0YWJsZS5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2NydC9mZ2FzX2NvZGVwYWdlLmgiCi0KLUNGREVfQ1NTU3R5bGVTaGVldDo6Q0ZERV9DU1NTdHlsZVNoZWV0KCkge30KLQotQ0ZERV9DU1NTdHlsZVNoZWV0Ojp+Q0ZERV9DU1NTdHlsZVNoZWV0KCkgewotICBSZXNldCgpOwotfQotCi12b2lkIENGREVfQ1NTU3R5bGVTaGVldDo6UmVzZXQoKSB7Ci0gIG1fUnVsZUFycmF5LmNsZWFyKCk7Ci0gIG1fU3RyaW5nQ2FjaGUuY2xlYXIoKTsKLX0KLQotaW50MzJfdCBDRkRFX0NTU1N0eWxlU2hlZXQ6OkNvdW50UnVsZXMoKSBjb25zdCB7Ci0gIHJldHVybiBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fUnVsZUFycmF5KTsKLX0KLQotQ0ZERV9DU1NTdHlsZVJ1bGUqIENGREVfQ1NTU3R5bGVTaGVldDo6R2V0UnVsZShpbnQzMl90IGluZGV4KSBjb25zdCB7Ci0gIHJldHVybiBtX1J1bGVBcnJheVtpbmRleF0uZ2V0KCk7Ci19Ci0KLWJvb2wgQ0ZERV9DU1NTdHlsZVNoZWV0OjpMb2FkQnVmZmVyKGNvbnN0IEZYX1dDSEFSKiBwQnVmZmVyLCBpbnQzMl90IGlCdWZTaXplKSB7Ci0gIEFTU0VSVChwQnVmZmVyICYmIGlCdWZTaXplID4gMCk7Ci0KLSAgYXV0byBwU3ludGF4ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGREVfQ1NTU3ludGF4UGFyc2VyPigpOwotICBpZiAoIXBTeW50YXgtPkluaXQocEJ1ZmZlciwgaUJ1ZlNpemUpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBSZXNldCgpOwotICBGREVfQ1NTU3ludGF4U3RhdHVzIGVTdGF0dXM7Ci0gIGRvIHsKLSAgICBzd2l0Y2ggKGVTdGF0dXMgPSBwU3ludGF4LT5Eb1N5bnRheFBhcnNlKCkpIHsKLSAgICAgIGNhc2UgRkRFX0NTU1N5bnRheFN0YXR1czo6U3R5bGVSdWxlOgotICAgICAgICBlU3RhdHVzID0gTG9hZFN0eWxlUnVsZShwU3ludGF4LmdldCgpLCAmbV9SdWxlQXJyYXkpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfSB3aGlsZSAoZVN0YXR1cyA+PSBGREVfQ1NTU3ludGF4U3RhdHVzOjpOb25lKTsKLQotICBtX1N0cmluZ0NhY2hlLmNsZWFyKCk7Ci0gIHJldHVybiBlU3RhdHVzICE9IEZERV9DU1NTeW50YXhTdGF0dXM6OkVycm9yOwotfQotCi1GREVfQ1NTU3ludGF4U3RhdHVzIENGREVfQ1NTU3R5bGVTaGVldDo6TG9hZFN0eWxlUnVsZSgKLSAgICBDRkRFX0NTU1N5bnRheFBhcnNlciogcFN5bnRheCwKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0ZERV9DU1NTdHlsZVJ1bGU+PiogcnVsZUFycmF5KSB7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRkRFX0NTU1NlbGVjdG9yPj4gc2VsZWN0b3JzOwotCi0gIENGREVfQ1NTU3R5bGVSdWxlKiBwU3R5bGVSdWxlID0gbnVsbHB0cjsKLSAgaW50MzJfdCBpVmFsdWVMZW4gPSAwOwotICBjb25zdCBGREVfQ1NTUHJvcGVydHlUYWJsZSogcHJvcGVydHlUYWJsZSA9IG51bGxwdHI7Ci0gIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsKLSAgd2hpbGUgKDEpIHsKLSAgICBzd2l0Y2ggKHBTeW50YXgtPkRvU3ludGF4UGFyc2UoKSkgewotICAgICAgY2FzZSBGREVfQ1NTU3ludGF4U3RhdHVzOjpTZWxlY3RvcjogewotICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgc3RyVmFsdWUgPSBwU3ludGF4LT5HZXRDdXJyZW50U3RyaW5nKCk7Ci0gICAgICAgIGF1dG8gcFNlbGVjdG9yID0gQ0ZERV9DU1NTZWxlY3Rvcjo6RnJvbVN0cmluZyhzdHJWYWx1ZSk7Ci0gICAgICAgIGlmIChwU2VsZWN0b3IpCi0gICAgICAgICAgc2VsZWN0b3JzLnB1c2hfYmFjayhzdGQ6Om1vdmUocFNlbGVjdG9yKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBGREVfQ1NTU3ludGF4U3RhdHVzOjpQcm9wZXJ0eU5hbWU6IHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHN0clZhbHVlID0gcFN5bnRheC0+R2V0Q3VycmVudFN0cmluZygpOwotICAgICAgICBwcm9wZXJ0eVRhYmxlID0gRkRFX0dldENTU1Byb3BlcnR5QnlOYW1lKHN0clZhbHVlKTsKLSAgICAgICAgaWYgKCFwcm9wZXJ0eVRhYmxlKQotICAgICAgICAgIHdzTmFtZSA9IENGWF9XaWRlU3RyaW5nKHN0clZhbHVlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEZERV9DU1NTeW50YXhTdGF0dXM6OlByb3BlcnR5VmFsdWU6IHsKLSAgICAgICAgaWYgKHByb3BlcnR5VGFibGUgfHwgaVZhbHVlTGVuID4gMCkgewotICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyBzdHJWYWx1ZSA9IHBTeW50YXgtPkdldEN1cnJlbnRTdHJpbmcoKTsKLSAgICAgICAgICBhdXRvIGRlY2wgPSBwU3R5bGVSdWxlLT5HZXREZWNsYXJhdGlvbigpOwotICAgICAgICAgIGlmICghc3RyVmFsdWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBpZiAocHJvcGVydHlUYWJsZSkgewotICAgICAgICAgICAgICBkZWNsLT5BZGRQcm9wZXJ0eShwcm9wZXJ0eVRhYmxlLCBzdHJWYWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBkZWNsLT5BZGRQcm9wZXJ0eSh3c05hbWUsIENGWF9XaWRlU3RyaW5nKHN0clZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBGREVfQ1NTU3ludGF4U3RhdHVzOjpEZWNsT3BlbjogewotICAgICAgICBpZiAoIXBTdHlsZVJ1bGUgJiYgIXNlbGVjdG9ycy5lbXB0eSgpKSB7Ci0gICAgICAgICAgYXV0byBydWxlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGREVfQ1NTU3R5bGVSdWxlPigpOwotICAgICAgICAgIHBTdHlsZVJ1bGUgPSBydWxlLmdldCgpOwotICAgICAgICAgIHBTdHlsZVJ1bGUtPlNldFNlbGVjdG9yKCZzZWxlY3RvcnMpOwotICAgICAgICAgIHJ1bGVBcnJheS0+cHVzaF9iYWNrKHN0ZDo6bW92ZShydWxlKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgU2tpcFJ1bGVTZXQocFN5bnRheCk7Ci0gICAgICAgICAgcmV0dXJuIEZERV9DU1NTeW50YXhTdGF0dXM6Ok5vbmU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEZERV9DU1NTeW50YXhTdGF0dXM6OkRlY2xDbG9zZTogewotICAgICAgICBpZiAocFN0eWxlUnVsZSAmJiBwU3R5bGVSdWxlLT5HZXREZWNsYXJhdGlvbigpLT5lbXB0eSgpKSB7Ci0gICAgICAgICAgcnVsZUFycmF5LT5wb3BfYmFjaygpOwotICAgICAgICAgIHBTdHlsZVJ1bGUgPSBudWxscHRyOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBGREVfQ1NTU3ludGF4U3RhdHVzOjpOb25lOwotICAgICAgfQotICAgICAgY2FzZSBGREVfQ1NTU3ludGF4U3RhdHVzOjpFT1M6Ci0gICAgICAgIHJldHVybiBGREVfQ1NTU3ludGF4U3RhdHVzOjpFT1M7Ci0gICAgICBjYXNlIEZERV9DU1NTeW50YXhTdGF0dXM6OkVycm9yOgotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEZERV9DU1NTeW50YXhTdGF0dXM6OkVycm9yOwotICAgIH0KLSAgfQotfQotCi12b2lkIENGREVfQ1NTU3R5bGVTaGVldDo6U2tpcFJ1bGVTZXQoQ0ZERV9DU1NTeW50YXhQYXJzZXIqIHBTeW50YXgpIHsKLSAgd2hpbGUgKDEpIHsKLSAgICBzd2l0Y2ggKHBTeW50YXgtPkRvU3ludGF4UGFyc2UoKSkgewotICAgICAgY2FzZSBGREVfQ1NTU3ludGF4U3RhdHVzOjpTZWxlY3RvcjoKLSAgICAgIGNhc2UgRkRFX0NTU1N5bnRheFN0YXR1czo6RGVjbE9wZW46Ci0gICAgICBjYXNlIEZERV9DU1NTeW50YXhTdGF0dXM6OlByb3BlcnR5TmFtZToKLSAgICAgIGNhc2UgRkRFX0NTU1N5bnRheFN0YXR1czo6UHJvcGVydHlWYWx1ZToKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZERV9DU1NTeW50YXhTdGF0dXM6OkRlY2xDbG9zZToKLSAgICAgIGNhc2UgRkRFX0NTU1N5bnRheFN0YXR1czo6RU9TOgotICAgICAgY2FzZSBGREVfQ1NTU3ludGF4U3RhdHVzOjpFcnJvcjoKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3hmYS9mZGUvY3NzL2NmZGVfY3Nzc3R5bGVzaGVldC5oIGIveGZhL2ZkZS9jc3MvY2ZkZV9jc3NzdHlsZXNoZWV0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZTM3NzIuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jc3MvY2ZkZV9jc3NzdHlsZXNoZWV0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZERV9DU1NfQ0ZERV9DU1NTVFlMRVNIRUVUX0hfCi0jZGVmaW5lIFhGQV9GREVfQ1NTX0NGREVfQ1NTU1RZTEVTSEVFVF9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N5bnRheHBhcnNlci5oIgotCi1jbGFzcyBDRkRFX0NTU1N0eWxlUnVsZTsKLQotY2xhc3MgQ0ZERV9DU1NTdHlsZVNoZWV0IHsKLSBwdWJsaWM6Ci0gIENGREVfQ1NTU3R5bGVTaGVldCgpOwotICB+Q0ZERV9DU1NTdHlsZVNoZWV0KCk7Ci0KLSAgYm9vbCBMb2FkQnVmZmVyKGNvbnN0IEZYX1dDSEFSKiBwQnVmZmVyLCBpbnQzMl90IGlCdWZTaXplKTsKLQotICBpbnQzMl90IENvdW50UnVsZXMoKSBjb25zdDsKLSAgQ0ZERV9DU1NTdHlsZVJ1bGUqIEdldFJ1bGUoaW50MzJfdCBpbmRleCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICB2b2lkIFJlc2V0KCk7Ci0gIEZERV9DU1NTeW50YXhTdGF0dXMgTG9hZFN0eWxlUnVsZSgKLSAgICAgIENGREVfQ1NTU3ludGF4UGFyc2VyKiBwU3ludGF4LAotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGREVfQ1NTU3R5bGVSdWxlPj4qIHJ1bGVBcnJheSk7Ci0gIHZvaWQgU2tpcFJ1bGVTZXQoQ0ZERV9DU1NTeW50YXhQYXJzZXIqIHBTeW50YXgpOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRkRFX0NTU1N0eWxlUnVsZT4+IG1fUnVsZUFycmF5OwotICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDMyX3QsIEZYX1dDSEFSKj4gbV9TdHJpbmdDYWNoZTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZERV9DU1NfQ0ZERV9DU1NTVFlMRVNIRUVUX0hfCmRpZmYgLS1naXQgYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N0eWxlc2hlZXRfdW5pdHRlc3QuY3BwIGIveGZhL2ZkZS9jc3MvY2ZkZV9jc3NzdHlsZXNoZWV0X3VuaXR0ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE3M2E3YS4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N0eWxlc2hlZXRfdW5pdHRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3Nzc3R5bGVzaGVldC5oIgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NkZWNsYXJhdGlvbi5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3NzZW51bXZhbHVlLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NudW1iZXJ2YWx1ZS5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3Nzc3R5bGVydWxlLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3N2YWx1ZWxpc3QuaCIKLQotY2xhc3MgQ0ZERV9DU1NTdHlsZVNoZWV0VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwdWJsaWM6Ci0gIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgc2hlZXRfID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGREVfQ1NTU3R5bGVTaGVldD4oKTsKLSAgICBkZWNsXyA9IG51bGxwdHI7Ci0gIH0KLQotICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeyBkZWNsXyA9IG51bGxwdHI7IH0KLQotICB2b2lkIExvYWRBbmRWZXJpZnlEZWNsKGNvbnN0IEZYX1dDSEFSKiBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+JiBzZWxlY3RvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRlY2xfY291bnQpIHsKLSAgICBBU1NFUlQoc2hlZXRfKTsKLQotICAgIEVYUEVDVF9UUlVFKHNoZWV0Xy0+TG9hZEJ1ZmZlcihidWYsIEZYU1lTX3djc2xlbihidWYpKSk7Ci0gICAgRVhQRUNUX0VRKHNoZWV0Xy0+Q291bnRSdWxlcygpLCAxKTsKLQotICAgIENGREVfQ1NTU3R5bGVSdWxlKiBzdHlsZSA9IHNoZWV0Xy0+R2V0UnVsZSgwKTsKLSAgICBFWFBFQ1RfRVEoc2VsZWN0b3JzLnNpemUoKSwgc3R5bGUtPkNvdW50U2VsZWN0b3JMaXN0cygpKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2VsZWN0b3JzLnNpemUoKTsgaSsrKSB7Ci0gICAgICB1aW50MzJfdCBoYXNoID0gRlhfSGFzaENvZGVfR2V0VyhzZWxlY3RvcnNbaV0uQXNTdHJpbmdDKCksIHRydWUpOwotICAgICAgRVhQRUNUX0VRKGhhc2gsIHN0eWxlLT5HZXRTZWxlY3Rvckxpc3QoaSktPkdldE5hbWVIYXNoKCkpOwotICAgIH0KLQotICAgIGRlY2xfID0gc3R5bGUtPkdldERlY2xhcmF0aW9uKCk7Ci0gICAgRVhQRUNUX0VRKGRlY2xfLT5Qcm9wZXJ0eUNvdW50Rm9yVGVzdGluZygpLCBkZWNsX2NvdW50KTsKLSAgfQotCi0gIHZvaWQgVmVyaWZ5RmxvYXQoRkRFX0NTU1Byb3BlcnR5IHByb3AsIGZsb2F0IHZhbCwgRkRFX0NTU051bWJlclR5cGUgdHlwZSkgewotICAgIEFTU0VSVChkZWNsXyk7Ci0KLSAgICBib29sIGltcG9ydGFudDsKLSAgICBDRlhfUmV0YWluUHRyPENGREVfQ1NTVmFsdWU+IHYgPSBkZWNsXy0+R2V0UHJvcGVydHkocHJvcCwgJmltcG9ydGFudCk7Ci0gICAgRVhQRUNUX0VRKHYtPkdldFR5cGUoKSwgRkRFX0NTU1ByaW1pdGl2ZVR5cGU6Ok51bWJlcik7Ci0gICAgRVhQRUNUX0VRKHYuQXM8Q0ZERV9DU1NOdW1iZXJWYWx1ZT4oKS0+S2luZCgpLCB0eXBlKTsKLSAgICBFWFBFQ1RfRVEodi5BczxDRkRFX0NTU051bWJlclZhbHVlPigpLT5WYWx1ZSgpLCB2YWwpOwotICB9Ci0KLSAgdm9pZCBWZXJpZnlFbnVtKEZERV9DU1NQcm9wZXJ0eSBwcm9wLCBGREVfQ1NTUHJvcGVydHlWYWx1ZSB2YWwpIHsKLSAgICBBU1NFUlQoZGVjbF8pOwotCi0gICAgYm9vbCBpbXBvcnRhbnQ7Ci0gICAgQ0ZYX1JldGFpblB0cjxDRkRFX0NTU1ZhbHVlPiB2ID0gZGVjbF8tPkdldFByb3BlcnR5KHByb3AsICZpbXBvcnRhbnQpOwotICAgIEVYUEVDVF9FUSh2LT5HZXRUeXBlKCksIEZERV9DU1NQcmltaXRpdmVUeXBlOjpFbnVtKTsKLSAgICBFWFBFQ1RfRVEodi5BczxDRkRFX0NTU0VudW1WYWx1ZT4oKS0+VmFsdWUoKSwgdmFsKTsKLSAgfQotCi0gIHZvaWQgVmVyaWZ5TGlzdChGREVfQ1NTUHJvcGVydHkgcHJvcCwKLSAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEZERV9DU1NQcm9wZXJ0eVZhbHVlPiB2YWx1ZXMpIHsKLSAgICBBU1NFUlQoZGVjbF8pOwotCi0gICAgYm9vbCBpbXBvcnRhbnQ7Ci0gICAgQ0ZYX1JldGFpblB0cjxDRkRFX0NTU1ZhbHVlTGlzdD4gbGlzdCA9Ci0gICAgICAgIGRlY2xfLT5HZXRQcm9wZXJ0eShwcm9wLCAmaW1wb3J0YW50KS5BczxDRkRFX0NTU1ZhbHVlTGlzdD4oKTsKLSAgICBFWFBFQ1RfRVEobGlzdC0+Q291bnRWYWx1ZXMoKSwgcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90Pih2YWx1ZXMpKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmFsdWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBDRlhfUmV0YWluUHRyPENGREVfQ1NTVmFsdWU+IHZhbCA9IGxpc3QtPkdldFZhbHVlKGkpOwotICAgICAgRVhQRUNUX0VRKHZhbC0+R2V0VHlwZSgpLCBGREVfQ1NTUHJpbWl0aXZlVHlwZTo6RW51bSk7Ci0gICAgICBFWFBFQ1RfRVEodmFsLkFzPENGREVfQ1NTRW51bVZhbHVlPigpLT5WYWx1ZSgpLCB2YWx1ZXNbaV0pOwotICAgIH0KLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRkRFX0NTU1N0eWxlU2hlZXQ+IHNoZWV0XzsKLSAgQ0ZERV9DU1NEZWNsYXJhdGlvbiogZGVjbF87Ci19OwotCi1URVNUX0YoQ0ZERV9DU1NTdHlsZVNoZWV0VGVzdCwgUGFyc2VNdWx0aXBsZVNlbGVjdG9ycykgewotICBjb25zdCBGWF9XQ0hBUiogYnVmID0KLSAgICAgIEwiYSB7IGJvcmRlcjogMTBweDsgfVxuYiB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9IjsKLSAgRVhQRUNUX1RSVUUoc2hlZXRfLT5Mb2FkQnVmZmVyKGJ1ZiwgRlhTWVNfd2NzbGVuKGJ1ZikpKTsKLSAgRVhQRUNUX0VRKDIsIHNoZWV0Xy0+Q291bnRSdWxlcygpKTsKLQotICBDRkRFX0NTU1N0eWxlUnVsZSogc3R5bGUgPSBzaGVldF8tPkdldFJ1bGUoMCk7Ci0gIEVYUEVDVF9FUSgxVUwsIHN0eWxlLT5Db3VudFNlbGVjdG9yTGlzdHMoKSk7Ci0KLSAgYm9vbCBmb3VuZF9zZWxlY3RvciA9IGZhbHNlOwotICB1aW50MzJfdCBoYXNoID0gRlhfSGFzaENvZGVfR2V0VyhMImEiLCB0cnVlKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdHlsZS0+Q291bnRTZWxlY3Rvckxpc3RzKCk7IGkrKykgewotICAgIGlmIChzdHlsZS0+R2V0U2VsZWN0b3JMaXN0KGkpLT5HZXROYW1lSGFzaCgpID09IGhhc2gpIHsKLSAgICAgIGZvdW5kX3NlbGVjdG9yID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBFWFBFQ1RfVFJVRShmb3VuZF9zZWxlY3Rvcik7Ci0KLSAgZGVjbF8gPSBzdHlsZS0+R2V0RGVjbGFyYXRpb24oKTsKLSAgRVhQRUNUX0VRKDRVTCwgZGVjbF8tPlByb3BlcnR5Q291bnRGb3JUZXN0aW5nKCkpOwotCi0gIFZlcmlmeUZsb2F0KEZERV9DU1NQcm9wZXJ0eTo6Qm9yZGVyTGVmdFdpZHRoLCAxMC4wLAotICAgICAgICAgICAgICBGREVfQ1NTTnVtYmVyVHlwZTo6UGl4ZWxzKTsKLSAgVmVyaWZ5RmxvYXQoRkRFX0NTU1Byb3BlcnR5OjpCb3JkZXJSaWdodFdpZHRoLCAxMC4wLAotICAgICAgICAgICAgICBGREVfQ1NTTnVtYmVyVHlwZTo6UGl4ZWxzKTsKLSAgVmVyaWZ5RmxvYXQoRkRFX0NTU1Byb3BlcnR5OjpCb3JkZXJUb3BXaWR0aCwgMTAuMCwgRkRFX0NTU051bWJlclR5cGU6OlBpeGVscyk7Ci0gIFZlcmlmeUZsb2F0KEZERV9DU1NQcm9wZXJ0eTo6Qm9yZGVyQm90dG9tV2lkdGgsIDEwLjAsCi0gICAgICAgICAgICAgIEZERV9DU1NOdW1iZXJUeXBlOjpQaXhlbHMpOwotCi0gIHN0eWxlID0gc2hlZXRfLT5HZXRSdWxlKDEpOwotICBFWFBFQ1RfRVEoMVVMLCBzdHlsZS0+Q291bnRTZWxlY3Rvckxpc3RzKCkpOwotCi0gIGZvdW5kX3NlbGVjdG9yID0gZmFsc2U7Ci0gIGhhc2ggPSBGWF9IYXNoQ29kZV9HZXRXKEwiYiIsIHRydWUpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0eWxlLT5Db3VudFNlbGVjdG9yTGlzdHMoKTsgaSsrKSB7Ci0gICAgaWYgKHN0eWxlLT5HZXRTZWxlY3Rvckxpc3QoaSktPkdldE5hbWVIYXNoKCkgPT0gaGFzaCkgewotICAgICAgZm91bmRfc2VsZWN0b3IgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIEVYUEVDVF9UUlVFKGZvdW5kX3NlbGVjdG9yKTsKLQotICBkZWNsXyA9IHN0eWxlLT5HZXREZWNsYXJhdGlvbigpOwotICBFWFBFQ1RfRVEoMVVMLCBkZWNsXy0+UHJvcGVydHlDb3VudEZvclRlc3RpbmcoKSk7Ci0gIFZlcmlmeUxpc3QoRkRFX0NTU1Byb3BlcnR5OjpUZXh0RGVjb3JhdGlvbiwKLSAgICAgICAgICAgICB7RkRFX0NTU1Byb3BlcnR5VmFsdWU6OlVuZGVybGluZX0pOwotfQotCi1URVNUX0YoQ0ZERV9DU1NTdHlsZVNoZWV0VGVzdCwgUGFyc2VDaGlsZFNlbGVjdG9ycykgewotICBjb25zdCBGWF9XQ0hBUiogYnVmID0gTCJhIGIgYyB7IGJvcmRlcjogMTBweDsgfSI7Ci0gIEVYUEVDVF9UUlVFKHNoZWV0Xy0+TG9hZEJ1ZmZlcihidWYsIEZYU1lTX3djc2xlbihidWYpKSk7Ci0gIEVYUEVDVF9FUSgxLCBzaGVldF8tPkNvdW50UnVsZXMoKSk7Ci0KLSAgQ0ZERV9DU1NTdHlsZVJ1bGUqIHN0eWxlID0gc2hlZXRfLT5HZXRSdWxlKDApOwotICBFWFBFQ1RfRVEoMVVMLCBzdHlsZS0+Q291bnRTZWxlY3Rvckxpc3RzKCkpOwotCi0gIGF1dG8gc2VsID0gc3R5bGUtPkdldFNlbGVjdG9yTGlzdCgwKTsKLSAgRVhQRUNUX1RSVUUoc2VsICE9IG51bGxwdHIpOwotICBFWFBFQ1RfRVEoRlhfSGFzaENvZGVfR2V0VyhMImMiLCB0cnVlKSwgc2VsLT5HZXROYW1lSGFzaCgpKTsKLQotICBzZWwgPSBzZWwtPkdldE5leHRTZWxlY3RvcigpOwotICBFWFBFQ1RfVFJVRShzZWwgIT0gbnVsbHB0cik7Ci0gIEVYUEVDVF9FUShGWF9IYXNoQ29kZV9HZXRXKEwiYiIsIHRydWUpLCBzZWwtPkdldE5hbWVIYXNoKCkpOwotCi0gIHNlbCA9IHNlbC0+R2V0TmV4dFNlbGVjdG9yKCk7Ci0gIEVYUEVDVF9UUlVFKHNlbCAhPSBudWxscHRyKTsKLSAgRVhQRUNUX0VRKEZYX0hhc2hDb2RlX0dldFcoTCJhIiwgdHJ1ZSksIHNlbC0+R2V0TmFtZUhhc2goKSk7Ci0KLSAgc2VsID0gc2VsLT5HZXROZXh0U2VsZWN0b3IoKTsKLSAgRVhQRUNUX1RSVUUoc2VsID09IG51bGxwdHIpOwotCi0gIGRlY2xfID0gc3R5bGUtPkdldERlY2xhcmF0aW9uKCk7Ci0gIEVYUEVDVF9FUSg0VUwsIGRlY2xfLT5Qcm9wZXJ0eUNvdW50Rm9yVGVzdGluZygpKTsKLQotICBWZXJpZnlGbG9hdChGREVfQ1NTUHJvcGVydHk6OkJvcmRlckxlZnRXaWR0aCwgMTAuMCwKLSAgICAgICAgICAgICAgRkRFX0NTU051bWJlclR5cGU6OlBpeGVscyk7Ci0gIFZlcmlmeUZsb2F0KEZERV9DU1NQcm9wZXJ0eTo6Qm9yZGVyUmlnaHRXaWR0aCwgMTAuMCwKLSAgICAgICAgICAgICAgRkRFX0NTU051bWJlclR5cGU6OlBpeGVscyk7Ci0gIFZlcmlmeUZsb2F0KEZERV9DU1NQcm9wZXJ0eTo6Qm9yZGVyVG9wV2lkdGgsIDEwLjAsIEZERV9DU1NOdW1iZXJUeXBlOjpQaXhlbHMpOwotICBWZXJpZnlGbG9hdChGREVfQ1NTUHJvcGVydHk6OkJvcmRlckJvdHRvbVdpZHRoLCAxMC4wLAotICAgICAgICAgICAgICBGREVfQ1NTTnVtYmVyVHlwZTo6UGl4ZWxzKTsKLX0KLQotVEVTVF9GKENGREVfQ1NTU3R5bGVTaGVldFRlc3QsIFBhcnNlVW5oYW5kbGVkU2VsZWN0b3JzKSB7Ci0gIGNvbnN0IEZYX1dDSEFSKiBidWYgPSBMImEgPiBiIHsgcGFkZGluZzogMDsgfSI7Ci0gIEVYUEVDVF9UUlVFKHNoZWV0Xy0+TG9hZEJ1ZmZlcihidWYsIEZYU1lTX3djc2xlbihidWYpKSk7Ci0gIEVYUEVDVF9FUSgwLCBzaGVldF8tPkNvdW50UnVsZXMoKSk7Ci0KLSAgYnVmID0gTCJhW2ZpcnN0XSB7IHBhZGRpbmc6IDA7IH0iOwotICBFWFBFQ1RfVFJVRShzaGVldF8tPkxvYWRCdWZmZXIoYnVmLCBGWFNZU193Y3NsZW4oYnVmKSkpOwotICBFWFBFQ1RfRVEoMCwgc2hlZXRfLT5Db3VudFJ1bGVzKCkpOwotCi0gIGJ1ZiA9IEwiYStiIHsgcGFkZGluZzogMDsgfSI7Ci0gIEVYUEVDVF9UUlVFKHNoZWV0Xy0+TG9hZEJ1ZmZlcihidWYsIEZYU1lTX3djc2xlbihidWYpKSk7Ci0gIEVYUEVDVF9FUSgwLCBzaGVldF8tPkNvdW50UnVsZXMoKSk7Ci0KLSAgYnVmID0gTCJhIF4gYiB7IHBhZGRpbmc6IDA7IH0iOwotICBFWFBFQ1RfVFJVRShzaGVldF8tPkxvYWRCdWZmZXIoYnVmLCBGWFNZU193Y3NsZW4oYnVmKSkpOwotICBFWFBFQ1RfRVEoMCwgc2hlZXRfLT5Db3VudFJ1bGVzKCkpOwotfQotCi1URVNUX0YoQ0ZERV9DU1NTdHlsZVNoZWV0VGVzdCwgUGFyc2VNdWx0aXBsZVNlbGVjdG9yc0NvbWJpbmVkKSB7Ci0gIExvYWRBbmRWZXJpZnlEZWNsKEwiYSwgYiwgYyB7IGJvcmRlcjogNXB4OyB9Iiwge0wiYSIsIEwiYiIsIEwiYyJ9LCA0KTsKLX0KLQotVEVTVF9GKENGREVfQ1NTU3R5bGVTaGVldFRlc3QsIFBhcnNlQm9yZGVyKSB7Ci0gIExvYWRBbmRWZXJpZnlEZWNsKEwiYSB7IGJvcmRlcjogNXB4OyB9Iiwge0wiYSJ9LCA0KTsKLSAgVmVyaWZ5RmxvYXQoRkRFX0NTU1Byb3BlcnR5OjpCb3JkZXJMZWZ0V2lkdGgsIDUuMCwgRkRFX0NTU051bWJlclR5cGU6OlBpeGVscyk7Ci0gIFZlcmlmeUZsb2F0KEZERV9DU1NQcm9wZXJ0eTo6Qm9yZGVyUmlnaHRXaWR0aCwgNS4wLAotICAgICAgICAgICAgICBGREVfQ1NTTnVtYmVyVHlwZTo6UGl4ZWxzKTsKLSAgVmVyaWZ5RmxvYXQoRkRFX0NTU1Byb3BlcnR5OjpCb3JkZXJUb3BXaWR0aCwgNS4wLCBGREVfQ1NTTnVtYmVyVHlwZTo6UGl4ZWxzKTsKLSAgVmVyaWZ5RmxvYXQoRkRFX0NTU1Byb3BlcnR5OjpCb3JkZXJCb3R0b21XaWR0aCwgNS4wLAotICAgICAgICAgICAgICBGREVfQ1NTTnVtYmVyVHlwZTo6UGl4ZWxzKTsKLX0KLQotVEVTVF9GKENGREVfQ1NTU3R5bGVTaGVldFRlc3QsIFBhcnNlQm9yZGVyRnVsbCkgewotICBMb2FkQW5kVmVyaWZ5RGVjbChMImEgeyBib3JkZXI6IDVweCBzb2xpZCByZWQ7IH0iLCB7TCJhIn0sIDQpOwotICBWZXJpZnlGbG9hdChGREVfQ1NTUHJvcGVydHk6OkJvcmRlckxlZnRXaWR0aCwgNS4wLCBGREVfQ1NTTnVtYmVyVHlwZTo6UGl4ZWxzKTsKLSAgVmVyaWZ5RmxvYXQoRkRFX0NTU1Byb3BlcnR5OjpCb3JkZXJSaWdodFdpZHRoLCA1LjAsCi0gICAgICAgICAgICAgIEZERV9DU1NOdW1iZXJUeXBlOjpQaXhlbHMpOwotICBWZXJpZnlGbG9hdChGREVfQ1NTUHJvcGVydHk6OkJvcmRlclRvcFdpZHRoLCA1LjAsIEZERV9DU1NOdW1iZXJUeXBlOjpQaXhlbHMpOwotICBWZXJpZnlGbG9hdChGREVfQ1NTUHJvcGVydHk6OkJvcmRlckJvdHRvbVdpZHRoLCA1LjAsCi0gICAgICAgICAgICAgIEZERV9DU1NOdW1iZXJUeXBlOjpQaXhlbHMpOwotfQotCi1URVNUX0YoQ0ZERV9DU1NTdHlsZVNoZWV0VGVzdCwgUGFyc2VCb3JkZXJMZWZ0KSB7Ci0gIExvYWRBbmRWZXJpZnlEZWNsKEwiYSB7IGJvcmRlci1sZWZ0OiAyLjVwYzsgfSIsIHtMImEifSwgMSk7Ci0gIFZlcmlmeUZsb2F0KEZERV9DU1NQcm9wZXJ0eTo6Qm9yZGVyTGVmdFdpZHRoLCAyLjUsIEZERV9DU1NOdW1iZXJUeXBlOjpQaWNhcyk7Ci19Ci0KLVRFU1RfRihDRkRFX0NTU1N0eWxlU2hlZXRUZXN0LCBQYXJzZUJvcmRlckxlZnRUaGljaykgewotICBMb2FkQW5kVmVyaWZ5RGVjbChMImEgeyBib3JkZXItbGVmdDogdGhpY2s7IH0iLCB7TCJhIn0sIDEpOwotICBWZXJpZnlFbnVtKEZERV9DU1NQcm9wZXJ0eTo6Qm9yZGVyTGVmdFdpZHRoLCBGREVfQ1NTUHJvcGVydHlWYWx1ZTo6VGhpY2spOwotfQotCi1URVNUX0YoQ0ZERV9DU1NTdHlsZVNoZWV0VGVzdCwgUGFyc2VCb3JkZXJSaWdodCkgewotICBMb2FkQW5kVmVyaWZ5RGVjbChMImEgeyBib3JkZXItcmlnaHQ6IDIuNXBjOyB9Iiwge0wiYSJ9LCAxKTsKLSAgVmVyaWZ5RmxvYXQoRkRFX0NTU1Byb3BlcnR5OjpCb3JkZXJSaWdodFdpZHRoLCAyLjUsIEZERV9DU1NOdW1iZXJUeXBlOjpQaWNhcyk7Ci19Ci0KLVRFU1RfRihDRkRFX0NTU1N0eWxlU2hlZXRUZXN0LCBQYXJzZUJvcmRlclRvcCkgewotICBMb2FkQW5kVmVyaWZ5RGVjbChMImEgeyBib3JkZXItdG9wOiAyLjVwYzsgfSIsIHtMImEifSwgMSk7Ci0gIFZlcmlmeUZsb2F0KEZERV9DU1NQcm9wZXJ0eTo6Qm9yZGVyVG9wV2lkdGgsIDIuNSwgRkRFX0NTU051bWJlclR5cGU6OlBpY2FzKTsKLX0KLQotVEVTVF9GKENGREVfQ1NTU3R5bGVTaGVldFRlc3QsIFBhcnNlQm9yZGVyQm90dG9tKSB7Ci0gIExvYWRBbmRWZXJpZnlEZWNsKEwiYSB7IGJvcmRlci1ib3R0b206IDIuNXBjOyB9Iiwge0wiYSJ9LCAxKTsKLSAgVmVyaWZ5RmxvYXQoRkRFX0NTU1Byb3BlcnR5OjpCb3JkZXJCb3R0b21XaWR0aCwgMi41LAotICAgICAgICAgICAgICBGREVfQ1NTTnVtYmVyVHlwZTo6UGljYXMpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9jc3MvY2ZkZV9jc3NzeW50YXhwYXJzZXIuY3BwIGIveGZhL2ZkZS9jc3MvY2ZkZV9jc3NzeW50YXhwYXJzZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjdiY2NlLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY3NzL2NmZGVfY3Nzc3ludGF4cGFyc2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N5bnRheHBhcnNlci5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NkZWNsYXJhdGlvbi5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2ZkZV9jc3NkYXRhdGFibGUuaCIKLSNpbmNsdWRlICJ4ZmEvZmdhcy9jcnQvZmdhc19jb2RlcGFnZS5oIgotCi1uYW1lc3BhY2UgewotCi1ib29sIElzU2VsZWN0b3JTdGFydChGWF9XQ0hBUiB3Y2gpIHsKLSAgcmV0dXJuIHdjaCA9PSAnLicgfHwgd2NoID09ICcjJyB8fCB3Y2ggPT0gJyonIHx8ICh3Y2ggPj0gJ2EnICYmIHdjaCA8PSAneicpIHx8Ci0gICAgICAgICAod2NoID49ICdBJyAmJiB3Y2ggPD0gJ1onKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLUNGREVfQ1NTU3ludGF4UGFyc2VyOjpDRkRFX0NTU1N5bnRheFBhcnNlcigpCi0gICAgOiBtX2lUZXh0RGF0YUxlbigwKSwKLSAgICAgIG1fZHdDaGVjaygodWludDMyX3QpLTEpLAotICAgICAgbV9lTW9kZShGREVfQ1NTU3ludGF4TW9kZTo6UnVsZVNldCksCi0gICAgICBtX2VTdGF0dXMoRkRFX0NTU1N5bnRheFN0YXR1czo6Tm9uZSkge30KLQotQ0ZERV9DU1NTeW50YXhQYXJzZXI6On5DRkRFX0NTU1N5bnRheFBhcnNlcigpIHsKLSAgbV9UZXh0RGF0YS5SZXNldCgpOwotICBtX1RleHRQbGFuZS5SZXNldCgpOwotfQotCi1ib29sIENGREVfQ1NTU3ludGF4UGFyc2VyOjpJbml0KGNvbnN0IEZYX1dDSEFSKiBwQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCdWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUZXh0RGF0U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiT25seURlY2xhcmF0aW9uKSB7Ci0gIEFTU0VSVChwQnVmZmVyICYmIGlCdWZmZXJTaXplID4gMCAmJiBpVGV4dERhdFNpemUgPiAwKTsKLSAgUmVzZXQoYk9ubHlEZWNsYXJhdGlvbik7Ci0gIGlmICghbV9UZXh0RGF0YS5Fc3RpbWF0ZVNpemUoaVRleHREYXRTaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiBtX1RleHRQbGFuZS5BdHRhY2hCdWZmZXIocEJ1ZmZlciwgaUJ1ZmZlclNpemUpOwotfQotCi12b2lkIENGREVfQ1NTU3ludGF4UGFyc2VyOjpSZXNldChib29sIGJPbmx5RGVjbGFyYXRpb24pIHsKLSAgbV9UZXh0UGxhbmUuUmVzZXQoKTsKLSAgbV9UZXh0RGF0YS5SZXNldCgpOwotICBtX2lUZXh0RGF0YUxlbiA9IDA7Ci0gIG1fZHdDaGVjayA9ICh1aW50MzJfdCktMTsKLSAgbV9lU3RhdHVzID0gRkRFX0NTU1N5bnRheFN0YXR1czo6Tm9uZTsKLSAgbV9lTW9kZSA9IGJPbmx5RGVjbGFyYXRpb24gPyBGREVfQ1NTU3ludGF4TW9kZTo6UHJvcGVydHlOYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRkRFX0NTU1N5bnRheE1vZGU6OlJ1bGVTZXQ7Ci19Ci0KLUZERV9DU1NTeW50YXhTdGF0dXMgQ0ZERV9DU1NTeW50YXhQYXJzZXI6OkRvU3ludGF4UGFyc2UoKSB7Ci0gIHdoaWxlIChtX2VTdGF0dXMgPj0gRkRFX0NTU1N5bnRheFN0YXR1czo6Tm9uZSkgewotICAgIGlmIChtX1RleHRQbGFuZS5Jc0VPRigpKSB7Ci0gICAgICBpZiAobV9lTW9kZSA9PSBGREVfQ1NTU3ludGF4TW9kZTo6UHJvcGVydHlWYWx1ZSAmJgotICAgICAgICAgIG1fVGV4dERhdGEuR2V0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIFNhdmVUZXh0RGF0YSgpOwotICAgICAgICBtX2VTdGF0dXMgPSBGREVfQ1NTU3ludGF4U3RhdHVzOjpQcm9wZXJ0eVZhbHVlOwotICAgICAgICByZXR1cm4gbV9lU3RhdHVzOwotICAgICAgfQotICAgICAgbV9lU3RhdHVzID0gRkRFX0NTU1N5bnRheFN0YXR1czo6RU9TOwotICAgICAgcmV0dXJuIG1fZVN0YXR1czsKLSAgICB9Ci0gICAgRlhfV0NIQVIgd2NoOwotICAgIHdoaWxlICghbV9UZXh0UGxhbmUuSXNFT0YoKSkgewotICAgICAgd2NoID0gbV9UZXh0UGxhbmUuR2V0Q2hhcigpOwotICAgICAgc3dpdGNoIChtX2VNb2RlKSB7Ci0gICAgICAgIGNhc2UgRkRFX0NTU1N5bnRheE1vZGU6OlJ1bGVTZXQ6Ci0gICAgICAgICAgc3dpdGNoICh3Y2gpIHsKLSAgICAgICAgICAgIGNhc2UgJ30nOgotICAgICAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOwotICAgICAgICAgICAgICBpZiAoUmVzdG9yZU1vZGUoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1N5bnRheFN0YXR1czo6RGVjbENsb3NlOwotCi0gICAgICAgICAgICAgIG1fZVN0YXR1cyA9IEZERV9DU1NTeW50YXhTdGF0dXM6OkVycm9yOwotICAgICAgICAgICAgICByZXR1cm4gbV9lU3RhdHVzOwotICAgICAgICAgICAgY2FzZSAnLyc6Ci0gICAgICAgICAgICAgIGlmIChtX1RleHRQbGFuZS5HZXROZXh0Q2hhcigpID09ICcqJykgewotICAgICAgICAgICAgICAgIG1fTW9kZVN0YWNrLnB1c2gobV9lTW9kZSk7Ci0gICAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU3ludGF4TW9kZTo6Q29tbWVudCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIGlmICh3Y2ggPD0gJyAnKSB7Ci0gICAgICAgICAgICAgICAgbV9UZXh0UGxhbmUuTW92ZU5leHQoKTsKLSAgICAgICAgICAgICAgfSBlbHNlIGlmIChJc1NlbGVjdG9yU3RhcnQod2NoKSkgewotICAgICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1N5bnRheE1vZGU6OlNlbGVjdG9yKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1N5bnRheFN0YXR1czo6U3R5bGVSdWxlOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fZVN0YXR1cyA9IEZERV9DU1NTeW50YXhTdGF0dXM6OkVycm9yOwotICAgICAgICAgICAgICAgIHJldHVybiBtX2VTdGF0dXM7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZERV9DU1NTeW50YXhNb2RlOjpTZWxlY3RvcjoKLSAgICAgICAgICBzd2l0Y2ggKHdjaCkgewotICAgICAgICAgICAgY2FzZSAnLCc6Ci0gICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7Ci0gICAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1N5bnRheE1vZGU6OlNlbGVjdG9yKTsKLSAgICAgICAgICAgICAgaWYgKG1faVRleHREYXRhTGVuID4gMCkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1N5bnRheFN0YXR1czo6U2VsZWN0b3I7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAneyc6Ci0gICAgICAgICAgICAgIGlmIChtX1RleHREYXRhLkdldExlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIFNhdmVUZXh0RGF0YSgpOwotICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU3ludGF4U3RhdHVzOjpTZWxlY3RvcjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOwotICAgICAgICAgICAgICBtX01vZGVTdGFjay5wdXNoKEZERV9DU1NTeW50YXhNb2RlOjpSdWxlU2V0KTsKLSAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU3ludGF4TW9kZTo6UHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTeW50YXhTdGF0dXM6OkRlY2xPcGVuOwotICAgICAgICAgICAgY2FzZSAnLyc6Ci0gICAgICAgICAgICAgIGlmIChtX1RleHRQbGFuZS5HZXROZXh0Q2hhcigpID09ICcqJykgewotICAgICAgICAgICAgICAgIGlmIChTd2l0Y2hUb0NvbW1lbnQoKSA+IDApCi0gICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1N5bnRheFN0YXR1czo6U2VsZWN0b3I7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIEFwcGVuZENoYXIod2NoKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZERV9DU1NTeW50YXhNb2RlOjpQcm9wZXJ0eU5hbWU6Ci0gICAgICAgICAgc3dpdGNoICh3Y2gpIHsKLSAgICAgICAgICAgIGNhc2UgJzonOgotICAgICAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOwotICAgICAgICAgICAgICBTd2l0Y2hNb2RlKEZERV9DU1NTeW50YXhNb2RlOjpQcm9wZXJ0eVZhbHVlKTsKLSAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTeW50YXhTdGF0dXM6OlByb3BlcnR5TmFtZTsKLSAgICAgICAgICAgIGNhc2UgJ30nOgotICAgICAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOwotICAgICAgICAgICAgICBpZiAoUmVzdG9yZU1vZGUoKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1N5bnRheFN0YXR1czo6RGVjbENsb3NlOwotCi0gICAgICAgICAgICAgIG1fZVN0YXR1cyA9IEZERV9DU1NTeW50YXhTdGF0dXM6OkVycm9yOwotICAgICAgICAgICAgICByZXR1cm4gbV9lU3RhdHVzOwotICAgICAgICAgICAgY2FzZSAnLyc6Ci0gICAgICAgICAgICAgIGlmIChtX1RleHRQbGFuZS5HZXROZXh0Q2hhcigpID09ICcqJykgewotICAgICAgICAgICAgICAgIGlmIChTd2l0Y2hUb0NvbW1lbnQoKSA+IDApCi0gICAgICAgICAgICAgICAgICByZXR1cm4gRkRFX0NTU1N5bnRheFN0YXR1czo6UHJvcGVydHlOYW1lOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBBcHBlbmRDaGFyKHdjaCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGREVfQ1NTU3ludGF4TW9kZTo6UHJvcGVydHlWYWx1ZToKLSAgICAgICAgICBzd2l0Y2ggKHdjaCkgewotICAgICAgICAgICAgY2FzZSAnOyc6Ci0gICAgICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7Ci0gICAgICAgICAgICBjYXNlICd9JzoKLSAgICAgICAgICAgICAgU3dpdGNoTW9kZShGREVfQ1NTU3ludGF4TW9kZTo6UHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgICAgcmV0dXJuIEZERV9DU1NTeW50YXhTdGF0dXM6OlByb3BlcnR5VmFsdWU7Ci0gICAgICAgICAgICBjYXNlICcvJzoKLSAgICAgICAgICAgICAgaWYgKG1fVGV4dFBsYW5lLkdldE5leHRDaGFyKCkgPT0gJyonKSB7Ci0gICAgICAgICAgICAgICAgaWYgKFN3aXRjaFRvQ29tbWVudCgpID4gMCkKLSAgICAgICAgICAgICAgICAgIHJldHVybiBGREVfQ1NTU3ludGF4U3RhdHVzOjpQcm9wZXJ0eVZhbHVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBBcHBlbmRDaGFyKHdjaCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGREVfQ1NTU3ludGF4TW9kZTo6Q29tbWVudDoKLSAgICAgICAgICBpZiAod2NoID09ICcvJyAmJiBtX1RleHREYXRhLkdldExlbmd0aCgpID4gMCAmJgotICAgICAgICAgICAgICBtX1RleHREYXRhLkdldEF0KG1fVGV4dERhdGEuR2V0TGVuZ3RoKCkgLSAxKSA9PSAnKicpIHsKLSAgICAgICAgICAgIFJlc3RvcmVNb2RlKCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fVGV4dERhdGEuQXBwZW5kQ2hhcih3Y2gpOwotICAgICAgICAgIH0KLSAgICAgICAgICBtX1RleHRQbGFuZS5Nb3ZlTmV4dCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZERV9DU1NTeW50YXhNb2RlOjpVbmtub3duUnVsZToKLSAgICAgICAgICBpZiAod2NoID09ICc7JykKLSAgICAgICAgICAgIFN3aXRjaE1vZGUoRkRFX0NTU1N5bnRheE1vZGU6OlJ1bGVTZXQpOwotICAgICAgICAgIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgQVNTRVJUKGZhbHNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG1fZVN0YXR1czsKLX0KLQotYm9vbCBDRkRFX0NTU1N5bnRheFBhcnNlcjo6SXNJbXBvcnRFbmFibGVkKCkgY29uc3QgewotICBpZiAoKG1fZHdDaGVjayAmIEZERV9DU1NTWU5UQVhDSEVDS19BbGxvd0ltcG9ydCkgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChtX01vZGVTdGFjay5zaXplKCkgPiAxKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0ZERV9DU1NTeW50YXhQYXJzZXI6OkFwcGVuZENoYXIoRlhfV0NIQVIgd2NoKSB7Ci0gIG1fVGV4dFBsYW5lLk1vdmVOZXh0KCk7Ci0gIGlmIChtX1RleHREYXRhLkdldExlbmd0aCgpID4gMCB8fCB3Y2ggPiAnICcpIHsKLSAgICBtX1RleHREYXRhLkFwcGVuZENoYXIod2NoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWludDMyX3QgQ0ZERV9DU1NTeW50YXhQYXJzZXI6OlNhdmVUZXh0RGF0YSgpIHsKLSAgbV9pVGV4dERhdGFMZW4gPSBtX1RleHREYXRhLlRyaW1FbmQoKTsKLSAgbV9UZXh0RGF0YS5DbGVhcigpOwotICByZXR1cm4gbV9pVGV4dERhdGFMZW47Ci19Ci0KLXZvaWQgQ0ZERV9DU1NTeW50YXhQYXJzZXI6OlN3aXRjaE1vZGUoRkRFX0NTU1N5bnRheE1vZGUgZU1vZGUpIHsKLSAgbV9lTW9kZSA9IGVNb2RlOwotICBTYXZlVGV4dERhdGEoKTsKLX0KLQotaW50MzJfdCBDRkRFX0NTU1N5bnRheFBhcnNlcjo6U3dpdGNoVG9Db21tZW50KCkgewotICBpbnQzMl90IGlMZW5ndGggPSBtX1RleHREYXRhLkdldExlbmd0aCgpOwotICBtX01vZGVTdGFjay5wdXNoKG1fZU1vZGUpOwotICBTd2l0Y2hNb2RlKEZERV9DU1NTeW50YXhNb2RlOjpDb21tZW50KTsKLSAgcmV0dXJuIGlMZW5ndGg7Ci19Ci0KLWJvb2wgQ0ZERV9DU1NTeW50YXhQYXJzZXI6OlJlc3RvcmVNb2RlKCkgewotICBpZiAobV9Nb2RlU3RhY2suZW1wdHkoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgU3dpdGNoTW9kZShtX01vZGVTdGFjay50b3AoKSk7Ci0gIG1fTW9kZVN0YWNrLnBvcCgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmdDIENGREVfQ1NTU3ludGF4UGFyc2VyOjpHZXRDdXJyZW50U3RyaW5nKCkgY29uc3QgewotICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmdDKG1fVGV4dERhdGEuR2V0QnVmZmVyKCksIG1faVRleHREYXRhTGVuKTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9mZGUvY3NzL2NmZGVfY3Nzc3ludGF4cGFyc2VyLmggYi94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3N5bnRheHBhcnNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTgzYjk4Li4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY3NzL2NmZGVfY3Nzc3ludGF4cGFyc2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZERV9DU1NfQ0ZERV9DU1NTWU5UQVhQQVJTRVJfSF8KLSNkZWZpbmUgWEZBX0ZERV9DU1NfQ0ZERV9DU1NTWU5UQVhQQVJTRVJfSF8KLQotI2luY2x1ZGUgPHN0YWNrPgotCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3N0ZXh0YnVmLmgiCi0KLSNkZWZpbmUgRkRFX0NTU1NZTlRBWENIRUNLX0FsbG93Q2hhcnNldCAxCi0jZGVmaW5lIEZERV9DU1NTWU5UQVhDSEVDS19BbGxvd0ltcG9ydCAyCi0KLWVudW0gY2xhc3MgRkRFX0NTU1N5bnRheE1vZGUgewotICBSdWxlU2V0LAotICBDb21tZW50LAotICBVbmtub3duUnVsZSwKLSAgU2VsZWN0b3IsCi0gIFByb3BlcnR5TmFtZSwKLSAgUHJvcGVydHlWYWx1ZSwKLX07Ci0KLWVudW0gY2xhc3MgRkRFX0NTU1N5bnRheFN0YXR1cyA6IHVpbnQ4X3QgewotICBFcnJvciwKLSAgRU9TLAotICBOb25lLAotICBTdHlsZVJ1bGUsCi0gIFNlbGVjdG9yLAotICBEZWNsT3BlbiwKLSAgRGVjbENsb3NlLAotICBQcm9wZXJ0eU5hbWUsCi0gIFByb3BlcnR5VmFsdWUsCi19OwotCi1jbGFzcyBDRkRFX0NTU1N5bnRheFBhcnNlciB7Ci0gcHVibGljOgotICBDRkRFX0NTU1N5bnRheFBhcnNlcigpOwotICB+Q0ZERV9DU1NTeW50YXhQYXJzZXIoKTsKLQotICBib29sIEluaXQoY29uc3QgRlhfV0NIQVIqIHBCdWZmZXIsCi0gICAgICAgICAgICBpbnQzMl90IGlCdWZmZXJTaXplLAotICAgICAgICAgICAgaW50MzJfdCBpVGV4dERhdFNpemUgPSAzMiwKLSAgICAgICAgICAgIGJvb2wgYk9ubHlEZWNsYXJhdGlvbiA9IGZhbHNlKTsKLSAgRkRFX0NTU1N5bnRheFN0YXR1cyBEb1N5bnRheFBhcnNlKCk7Ci0gIENGWF9XaWRlU3RyaW5nQyBHZXRDdXJyZW50U3RyaW5nKCkgY29uc3Q7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgUmVzZXQoYm9vbCBiT25seURlY2xhcmF0aW9uKTsKLSAgdm9pZCBTd2l0Y2hNb2RlKEZERV9DU1NTeW50YXhNb2RlIGVNb2RlKTsKLSAgaW50MzJfdCBTd2l0Y2hUb0NvbW1lbnQoKTsKLQotICBib29sIFJlc3RvcmVNb2RlKCk7Ci0gIGJvb2wgQXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpOwotICBpbnQzMl90IFNhdmVUZXh0RGF0YSgpOwotICBib29sIElzQ2hhcnNldEVuYWJsZWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChtX2R3Q2hlY2sgJiBGREVfQ1NTU1lOVEFYQ0hFQ0tfQWxsb3dDaGFyc2V0KSAhPSAwOwotICB9Ci0gIHZvaWQgRGlzYWJsZUNoYXJzZXQoKSB7IG1fZHdDaGVjayA9IEZERV9DU1NTWU5UQVhDSEVDS19BbGxvd0ltcG9ydDsgfQotICBib29sIElzSW1wb3J0RW5hYmxlZCgpIGNvbnN0OwotICB2b2lkIERpc2FibGVJbXBvcnQoKSB7IG1fZHdDaGVjayA9IDA7IH0KLQotICBDRkRFX0NTU1RleHRCdWYgbV9UZXh0RGF0YTsKLSAgQ0ZERV9DU1NUZXh0QnVmIG1fVGV4dFBsYW5lOwotICBpbnQzMl90IG1faVRleHREYXRhTGVuOwotICB1aW50MzJfdCBtX2R3Q2hlY2s7Ci0gIEZERV9DU1NTeW50YXhNb2RlIG1fZU1vZGU7Ci0gIEZERV9DU1NTeW50YXhTdGF0dXMgbV9lU3RhdHVzOwotICBzdGQ6OnN0YWNrPEZERV9DU1NTeW50YXhNb2RlPiBtX01vZGVTdGFjazsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZERV9DU1NfQ0ZERV9DU1NTWU5UQVhQQVJTRVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZGUvY3NzL2NmZGVfY3NzdGV4dGJ1Zi5jcHAgYi94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3RleHRidWYuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2IyODk5Li4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY3NzL2NmZGVfY3NzdGV4dGJ1Zi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3RleHRidWYuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotQ0ZERV9DU1NUZXh0QnVmOjpDRkRFX0NTU1RleHRCdWYoKQotICAgIDogbV9iRXh0QnVmKGZhbHNlKSwKLSAgICAgIG1fcEJ1ZmZlcihudWxscHRyKSwKLSAgICAgIG1faUJ1ZkxlbigwKSwKLSAgICAgIG1faURhdExlbigwKSwKLSAgICAgIG1faURhdFBvcygwKSB7fQotCi1DRkRFX0NTU1RleHRCdWY6On5DRkRFX0NTU1RleHRCdWYoKSB7Ci0gIFJlc2V0KCk7Ci19Ci0KLXZvaWQgQ0ZERV9DU1NUZXh0QnVmOjpSZXNldCgpIHsKLSAgaWYgKCFtX2JFeHRCdWYpIHsKLSAgICBGWF9GcmVlKG1fcEJ1ZmZlcik7Ci0gICAgbV9wQnVmZmVyID0gbnVsbHB0cjsKLSAgfQotICBtX2lEYXRQb3MgPSBtX2lEYXRMZW4gPSBtX2lCdWZMZW47Ci19Ci0KLWJvb2wgQ0ZERV9DU1NUZXh0QnVmOjpBdHRhY2hCdWZmZXIoY29uc3QgRlhfV0NIQVIqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZkxlbikgewotICBSZXNldCgpOwotICBtX3BCdWZmZXIgPSBjb25zdF9jYXN0PEZYX1dDSEFSKj4ocEJ1ZmZlcik7Ci0gIG1faURhdExlbiA9IG1faUJ1ZkxlbiA9IGlCdWZMZW47Ci0gIHJldHVybiBtX2JFeHRCdWYgPSB0cnVlOwotfQotCi1ib29sIENGREVfQ1NTVGV4dEJ1Zjo6RXN0aW1hdGVTaXplKGludDMyX3QgaUFsbG9jU2l6ZSkgewotICBBU1NFUlQoaUFsbG9jU2l6ZSA+IDApOwotICBDbGVhcigpOwotICBtX2JFeHRCdWYgPSBmYWxzZTsKLSAgcmV0dXJuIEV4cGFuZEJ1ZihpQWxsb2NTaXplKTsKLX0KLQotaW50MzJfdCBDRkRFX0NTU1RleHRCdWY6OkxvYWRGcm9tU3RyZWFtKAotICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiYgcFR4dFN0cmVhbSwKLSAgICBpbnQzMl90IGlTdHJlYW1PZmZzZXQsCi0gICAgaW50MzJfdCBpTWF4Q2hhcnMsCi0gICAgYm9vbCYgYkVPUykgewotICBBU1NFUlQoaVN0cmVhbU9mZnNldCA+PSAwICYmIGlNYXhDaGFycyA+IDApOwotICBDbGVhcigpOwotICBtX2JFeHRCdWYgPSBmYWxzZTsKLSAgaWYgKCFFeHBhbmRCdWYoaU1heENoYXJzKSkKLSAgICByZXR1cm4gMDsKLQotICBpZiAocFR4dFN0cmVhbS0+R2V0UG9zaXRpb24oKSAhPSBpU3RyZWFtT2Zmc2V0KQotICAgIHBUeHRTdHJlYW0tPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgaVN0cmVhbU9mZnNldCk7Ci0KLSAgbV9pRGF0TGVuID0gcFR4dFN0cmVhbS0+UmVhZFN0cmluZyhtX3BCdWZmZXIsIGlNYXhDaGFycywgYkVPUyk7Ci0gIHJldHVybiBtX2lEYXRMZW47Ci19Ci0KLWJvb2wgQ0ZERV9DU1NUZXh0QnVmOjpFeHBhbmRCdWYoaW50MzJfdCBpRGVzaXJlZFNpemUpIHsKLSAgaWYgKG1fYkV4dEJ1ZikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghbV9wQnVmZmVyKQotICAgIG1fcEJ1ZmZlciA9IEZYX0FsbG9jKEZYX1dDSEFSLCBpRGVzaXJlZFNpemUpOwotICBlbHNlIGlmIChtX2lCdWZMZW4gIT0gaURlc2lyZWRTaXplKQotICAgIG1fcEJ1ZmZlciA9IEZYX1JlYWxsb2MoRlhfV0NIQVIsIG1fcEJ1ZmZlciwgaURlc2lyZWRTaXplKTsKLSAgZWxzZQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICghbV9wQnVmZmVyKSB7Ci0gICAgbV9pQnVmTGVuID0gMDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgbV9pQnVmTGVuID0gaURlc2lyZWRTaXplOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDRkRFX0NTU1RleHRCdWY6OlN1YnRyYWN0KGludDMyX3QgaVN0YXJ0LCBpbnQzMl90IGlMZW5ndGgpIHsKLSAgQVNTRVJUKGlTdGFydCA+PSAwICYmIGlMZW5ndGggPj0gMCk7Ci0KLSAgaUxlbmd0aCA9IHN0ZDo6bWF4KHN0ZDo6bWluKGlMZW5ndGgsIG1faURhdExlbiAtIGlTdGFydCksIDApOwotICBGWFNZU19tZW1tb3ZlKG1fcEJ1ZmZlciwgbV9wQnVmZmVyICsgaVN0YXJ0LCBpTGVuZ3RoICogc2l6ZW9mKEZYX1dDSEFSKSk7Ci0gIG1faURhdExlbiA9IGlMZW5ndGg7Ci19CmRpZmYgLS1naXQgYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3RleHRidWYuaCBiL3hmYS9mZGUvY3NzL2NmZGVfY3NzdGV4dGJ1Zi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjE1MWUwLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY3NzL2NmZGVfY3NzdGV4dGJ1Zi5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GREVfQ1NTX0NGREVfQ1NTVEVYVEJVRl9IXwotI2RlZmluZSBYRkFfRkRFX0NTU19DRkRFX0NTU1RFWFRCVUZfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3JldGFpbl9wdHIuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvY3J0L2ZnYXNfc3RyZWFtLmgiCi0KLWNsYXNzIENGREVfQ1NTVGV4dEJ1ZiB7Ci0gcHVibGljOgotICBDRkRFX0NTU1RleHRCdWYoKTsKLSAgfkNGREVfQ1NTVGV4dEJ1ZigpOwotCi0gIGJvb2wgQXR0YWNoQnVmZmVyKGNvbnN0IEZYX1dDSEFSKiBwQnVmZmVyLCBpbnQzMl90IGlCdWZMZW4pOwotICBib29sIEVzdGltYXRlU2l6ZShpbnQzMl90IGlBbGxvY1NpemUpOwotICBpbnQzMl90IExvYWRGcm9tU3RyZWFtKGNvbnN0IENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiYgcFR4dFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdHJlYW1PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTWF4Q2hhcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYkVPUyk7Ci0gIGJvb2wgQXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpIHsKLSAgICBpZiAobV9pRGF0TGVuID49IG1faUJ1ZkxlbiAmJiAhRXhwYW5kQnVmKG1faUJ1ZkxlbiAqIDIpKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIG1fcEJ1ZmZlclttX2lEYXRMZW4rK10gPSB3Y2g7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2b2lkIENsZWFyKCkgeyBtX2lEYXRQb3MgPSBtX2lEYXRMZW4gPSAwOyB9Ci0gIHZvaWQgUmVzZXQoKTsKLQotICBpbnQzMl90IFRyaW1FbmQoKSB7Ci0gICAgd2hpbGUgKG1faURhdExlbiA+IDAgJiYgbV9wQnVmZmVyW21faURhdExlbiAtIDFdIDw9ICcgJykKLSAgICAgIC0tbV9pRGF0TGVuOwotICAgIEFwcGVuZENoYXIoMCk7Ci0gICAgcmV0dXJuIC0tbV9pRGF0TGVuOwotICB9Ci0KLSAgdm9pZCBTdWJ0cmFjdChpbnQzMl90IGlTdGFydCwgaW50MzJfdCBpTGVuZ3RoKTsKLSAgYm9vbCBJc0VPRigpIGNvbnN0IHsgcmV0dXJuIG1faURhdFBvcyA+PSBtX2lEYXRMZW47IH0KLQotICBGWF9XQ0hBUiBHZXRBdChpbnQzMl90IGluZGV4KSBjb25zdCB7IHJldHVybiBtX3BCdWZmZXJbaW5kZXhdOyB9Ci0gIEZYX1dDSEFSIEdldENoYXIoKSBjb25zdCB7IHJldHVybiBtX3BCdWZmZXJbbV9pRGF0UG9zXTsgfQotICBGWF9XQ0hBUiBHZXROZXh0Q2hhcigpIGNvbnN0IHsKLSAgICByZXR1cm4gKG1faURhdFBvcyArIDEgPj0gbV9pRGF0TGVuKSA/IDAgOiBtX3BCdWZmZXJbbV9pRGF0UG9zICsgMV07Ci0gIH0KLQotICB2b2lkIE1vdmVOZXh0KCkgeyBtX2lEYXRQb3MrKzsgfQotCi0gIGludDMyX3QgR2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9pRGF0TGVuOyB9Ci0gIGNvbnN0IEZYX1dDSEFSKiBHZXRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtX3BCdWZmZXI7IH0KLQotIHByb3RlY3RlZDoKLSAgYm9vbCBFeHBhbmRCdWYoaW50MzJfdCBpRGVzaXJlZFNpemUpOwotICBib29sIG1fYkV4dEJ1ZjsKLSAgRlhfV0NIQVIqIG1fcEJ1ZmZlcjsKLSAgaW50MzJfdCBtX2lCdWZMZW47Ci0gIGludDMyX3QgbV9pRGF0TGVuOwotICBpbnQzMl90IG1faURhdFBvczsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZERV9DU1NfQ0ZERV9DU1NURVhUQlVGX0hfCmRpZmYgLS1naXQgYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3ZhbHVlLmNwcCBiL3hmYS9mZGUvY3NzL2NmZGVfY3NzdmFsdWUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjcwMjlmLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvY3NzL2NmZGVfY3NzdmFsdWUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3ZhbHVlLmgiCi0KLUNGREVfQ1NTVmFsdWU6OkNGREVfQ1NTVmFsdWUoRkRFX0NTU1ByaW1pdGl2ZVR5cGUgdHlwZSkgOiBtX3ZhbHVlKHR5cGUpIHt9CmRpZmYgLS1naXQgYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3ZhbHVlLmggYi94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3ZhbHVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZDI1NGIuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jc3MvY2ZkZV9jc3N2YWx1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GREVfQ1NTX0NGREVfQ1NTVkFMVUVfSF8KLSNkZWZpbmUgWEZBX0ZERV9DU1NfQ0ZERV9DU1NWQUxVRV9IXwotCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvZmRlX2Nzcy5oIgotCi1jbGFzcyBDRkRFX0NTU1ZhbHVlIDogcHVibGljIENGWF9SZXRhaW5hYmxlIHsKLSBwdWJsaWM6Ci0gIEZERV9DU1NQcmltaXRpdmVUeXBlIEdldFR5cGUoKSBjb25zdCB7IHJldHVybiBtX3ZhbHVlOyB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGV4cGxpY2l0IENGREVfQ1NTVmFsdWUoRkRFX0NTU1ByaW1pdGl2ZVR5cGUgdHlwZSk7Ci0KLSBwcml2YXRlOgotICBGREVfQ1NTUHJpbWl0aXZlVHlwZSBtX3ZhbHVlOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRkRFX0NTU19DRkRFX0NTU1ZBTFVFX0hfCmRpZmYgLS1naXQgYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3ZhbHVlbGlzdC5jcHAgYi94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3ZhbHVlbGlzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczN2ZmY2IuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jc3MvY2ZkZV9jc3N2YWx1ZWxpc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3N2YWx1ZWxpc3QuaCIKLQotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9mZGVfY3NzLmgiCi0KLUNGREVfQ1NTVmFsdWVMaXN0OjpDRkRFX0NTU1ZhbHVlTGlzdCgKLSAgICBzdGQ6OnZlY3RvcjxDRlhfUmV0YWluUHRyPENGREVfQ1NTVmFsdWU+PiYgbGlzdCkKLSAgICA6IENGREVfQ1NTVmFsdWUoRkRFX0NTU1ByaW1pdGl2ZVR5cGU6Okxpc3QpLCBtX3BwTGlzdChzdGQ6Om1vdmUobGlzdCkpIHt9Ci0KLUNGREVfQ1NTVmFsdWVMaXN0Ojp+Q0ZERV9DU1NWYWx1ZUxpc3QoKSB7fQotCi1pbnQzMl90IENGREVfQ1NTVmFsdWVMaXN0OjpDb3VudFZhbHVlcygpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcHBMaXN0LnNpemUoKTsKLX0KLQotQ0ZYX1JldGFpblB0cjxDRkRFX0NTU1ZhbHVlPiBDRkRFX0NTU1ZhbHVlTGlzdDo6R2V0VmFsdWUoaW50MzJfdCBpbmRleCkgY29uc3QgewotICByZXR1cm4gbV9wcExpc3RbaW5kZXhdOwotfQpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9jc3MvY2ZkZV9jc3N2YWx1ZWxpc3QuaCBiL3hmYS9mZGUvY3NzL2NmZGVfY3NzdmFsdWVsaXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0N2Y4YTMuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jc3MvY2ZkZV9jc3N2YWx1ZWxpc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRkRFX0NTU19DRkRFX0NTU1ZBTFVFTElTVF9IXwotI2RlZmluZSBYRkFfRkRFX0NTU19DRkRFX0NTU1ZBTFVFTElTVF9IXwotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3N2YWx1ZS5oIgotCi1jbGFzcyBDRkRFX0NTU1ZhbHVlTGlzdCA6IHB1YmxpYyBDRkRFX0NTU1ZhbHVlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENGREVfQ1NTVmFsdWVMaXN0KHN0ZDo6dmVjdG9yPENGWF9SZXRhaW5QdHI8Q0ZERV9DU1NWYWx1ZT4+JiBsaXN0KTsKLSAgfkNGREVfQ1NTVmFsdWVMaXN0KCkgb3ZlcnJpZGU7Ci0KLSAgaW50MzJfdCBDb3VudFZhbHVlcygpIGNvbnN0OwotICBDRlhfUmV0YWluUHRyPENGREVfQ1NTVmFsdWU+IEdldFZhbHVlKGludDMyX3QgaW5kZXgpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgotICBzdGQ6OnZlY3RvcjxDRlhfUmV0YWluUHRyPENGREVfQ1NTVmFsdWU+PiBtX3BwTGlzdDsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZERV9DU1NfQ0ZERV9DU1NWQUxVRUxJU1RfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZGUvY3NzL2NmZGVfY3NzdmFsdWVsaXN0cGFyc2VyLmNwcCBiL3hmYS9mZGUvY3NzL2NmZGVfY3NzdmFsdWVsaXN0cGFyc2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJjMzI5Ni4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3ZhbHVlbGlzdHBhcnNlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc3ZhbHVlbGlzdHBhcnNlci5oIgotCi1DRkRFX0NTU1ZhbHVlTGlzdFBhcnNlcjo6Q0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIoY29uc3QgRlhfV0NIQVIqIHBzeiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgc2VwYXJhdG9yKQotICAgIDogbV9TZXBhcmF0b3Ioc2VwYXJhdG9yKSwgbV9wQ3VyKHBzeiksIG1fcEVuZChwc3ogKyBpTGVuKSB7Ci0gIEFTU0VSVChwc3ogJiYgaUxlbiA+IDApOwotfQotCi1ib29sIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyOjpOZXh0VmFsdWUoRkRFX0NTU1ByaW1pdGl2ZVR5cGUmIGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiYgcFN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlMZW5ndGgpIHsKLSAgd2hpbGUgKG1fcEN1ciA8IG1fcEVuZCAmJiAoKm1fcEN1ciA8PSAnICcgfHwgKm1fcEN1ciA9PSBtX1NlcGFyYXRvcikpCi0gICAgKyttX3BDdXI7Ci0KLSAgaWYgKG1fcEN1ciA+PSBtX3BFbmQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGVUeXBlID0gRkRFX0NTU1ByaW1pdGl2ZVR5cGU6OlVua25vd247Ci0gIHBTdGFydCA9IG1fcEN1cjsKLSAgaUxlbmd0aCA9IDA7Ci0gIEZYX1dDSEFSIHdjaCA9ICptX3BDdXI7Ci0gIGlmICh3Y2ggPT0gJyMnKSB7Ci0gICAgaUxlbmd0aCA9IFNraXBUbygnICcsIGZhbHNlLCBmYWxzZSk7Ci0gICAgaWYgKGlMZW5ndGggPT0gNCB8fCBpTGVuZ3RoID09IDcpCi0gICAgICBlVHlwZSA9IEZERV9DU1NQcmltaXRpdmVUeXBlOjpSR0I7Ci0gIH0gZWxzZSBpZiAoKHdjaCA+PSAnMCcgJiYgd2NoIDw9ICc5JykgfHwgd2NoID09ICcuJyB8fCB3Y2ggPT0gJy0nIHx8Ci0gICAgICAgICAgICAgd2NoID09ICcrJykgewotICAgIHdoaWxlIChtX3BDdXIgPCBtX3BFbmQgJiYgKCptX3BDdXIgPiAnICcgJiYgKm1fcEN1ciAhPSBtX1NlcGFyYXRvcikpCi0gICAgICArK21fcEN1cjsKLQotICAgIGlMZW5ndGggPSBtX3BDdXIgLSBwU3RhcnQ7Ci0gICAgZVR5cGUgPSBGREVfQ1NTUHJpbWl0aXZlVHlwZTo6TnVtYmVyOwotICB9IGVsc2UgaWYgKHdjaCA9PSAnXCInIHx8IHdjaCA9PSAnXCcnKSB7Ci0gICAgcFN0YXJ0Kys7Ci0gICAgbV9wQ3VyKys7Ci0gICAgaUxlbmd0aCA9IFNraXBUbyh3Y2gsIGZhbHNlLCBmYWxzZSk7Ci0gICAgbV9wQ3VyKys7Ci0gICAgZVR5cGUgPSBGREVfQ1NTUHJpbWl0aXZlVHlwZTo6U3RyaW5nOwotICB9IGVsc2UgaWYgKG1fcEVuZCAtIG1fcEN1ciA+IDUgJiYgbV9wQ3VyWzNdID09ICcoJykgewotICAgIGlmIChGWFNZU193Y3NuaWNtcChMInJnYiIsIG1fcEN1ciwgMykgPT0gMCkgewotICAgICAgaUxlbmd0aCA9IFNraXBUbygnKScsIGZhbHNlLCBmYWxzZSkgKyAxOwotICAgICAgbV9wQ3VyKys7Ci0gICAgICBlVHlwZSA9IEZERV9DU1NQcmltaXRpdmVUeXBlOjpSR0I7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlMZW5ndGggPSBTa2lwVG8obV9TZXBhcmF0b3IsIHRydWUsIHRydWUpOwotICAgIGVUeXBlID0gRkRFX0NTU1ByaW1pdGl2ZVR5cGU6OlN0cmluZzsKLSAgfQotICByZXR1cm4gbV9wQ3VyIDw9IG1fcEVuZCAmJiBpTGVuZ3RoID4gMDsKLX0KLQotaW50MzJfdCBDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlcjo6U2tpcFRvKEZYX1dDSEFSIHdjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJyZWFrT25TcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1hdGNoQnJhY2tldHMpIHsKLSAgY29uc3QgRlhfV0NIQVIqIHBTdGFydCA9IG1fcEN1cjsKLSAgaW50MzJfdCBicmFja2V0Q291bnQgPSAwOwotICB3aGlsZSAobV9wQ3VyIDwgbV9wRW5kICYmICptX3BDdXIgIT0gd2NoKSB7Ci0gICAgaWYgKGJyZWFrT25TcGFjZSAmJiAqbV9wQ3VyIDw9ICcgJykKLSAgICAgIGJyZWFrOwotICAgIGlmICghbWF0Y2hCcmFja2V0cykgewotICAgICAgbV9wQ3VyKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBpZiAoKm1fcEN1ciA9PSAnKCcpCi0gICAgICBicmFja2V0Q291bnQrKzsKLSAgICBlbHNlIGlmICgqbV9wQ3VyID09ICcpJykKLSAgICAgIGJyYWNrZXRDb3VudC0tOwotCi0gICAgbV9wQ3VyKys7Ci0gIH0KLQotICB3aGlsZSAoYnJhY2tldENvdW50ID4gMCAmJiBtX3BDdXIgPCBtX3BFbmQpIHsKLSAgICBpZiAoKm1fcEN1ciA9PSAnKScpCi0gICAgICBicmFja2V0Q291bnQtLTsKLSAgICBtX3BDdXIrKzsKLSAgfQotICByZXR1cm4gbV9wQ3VyIC0gcFN0YXJ0OwotfQpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9jc3MvY2ZkZV9jc3N2YWx1ZWxpc3RwYXJzZXIuaCBiL3hmYS9mZGUvY3NzL2NmZGVfY3NzdmFsdWVsaXN0cGFyc2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczNGFlZDguLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jc3MvY2ZkZV9jc3N2YWx1ZWxpc3RwYXJzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRkRFX0NTU19DRkRFX0NTU1ZBTFVFTElTVFBBUlNFUl9IXwotI2RlZmluZSBYRkFfRkRFX0NTU19DRkRFX0NTU1ZBTFVFTElTVFBBUlNFUl9IXwotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9mZGVfY3NzLmgiCi0KLWNsYXNzIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyIHsKLSBwdWJsaWM6Ci0gIENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyKGNvbnN0IEZYX1dDSEFSKiBwc3osCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgc2VwYXJhdG9yKTsKLQotICBib29sIE5leHRWYWx1ZShGREVfQ1NTUHJpbWl0aXZlVHlwZSYgZVR5cGUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiYgcFN0YXJ0LAotICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTGVuZ3RoKTsKLQotICBGWF9XQ0hBUiBtX1NlcGFyYXRvcjsKLQotIHByaXZhdGU6Ci0gIGludDMyX3QgU2tpcFRvKEZYX1dDSEFSIHdjaCwgYm9vbCBicmVha09uU3BhY2UsIGJvb2wgbWF0Y2hCcmFja2V0cyk7Ci0KLSAgY29uc3QgRlhfV0NIQVIqIG1fcEN1cjsKLSAgY29uc3QgRlhfV0NIQVIqIG1fcEVuZDsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZERV9DU1NfQ0ZERV9DU1NWQUxVRUxJU1RQQVJTRVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZGUvY3NzL2NmZGVfY3NzdmFsdWVsaXN0cGFyc2VyX3VuaXR0ZXN0LmNwcCBiL3hmYS9mZGUvY3NzL2NmZGVfY3NzdmFsdWVsaXN0cGFyc2VyX3VuaXR0ZXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFiYjgwNy4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL2Nzcy9jZmRlX2Nzc3ZhbHVlbGlzdHBhcnNlcl91bml0dGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3N2YWx1ZWxpc3RwYXJzZXIuaCIKLQotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLQotVEVTVChDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciwgcmdiX3Nob3J0KSB7Ci0gIEZERV9DU1NQcmltaXRpdmVUeXBlIHR5cGU7Ci0gIGNvbnN0IEZYX1dDSEFSKiBzdGFydDsKLSAgaW50MzJfdCBsZW47Ci0KLSAgYXV0byBwYXJzZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXI+KEwiI2FiYyIsIDQsIEwnICcpOwotICBFWFBFQ1RfVFJVRShwYXJzZXItPk5leHRWYWx1ZSh0eXBlLCBzdGFydCwgbGVuKSk7Ci0gIEVYUEVDVF9FUShGREVfQ1NTUHJpbWl0aXZlVHlwZTo6UkdCLCB0eXBlKTsKLSAgRVhQRUNUX0VRKEwiI2FiYyIsIENGWF9XaWRlU3RyaW5nKHN0YXJ0LCBsZW4pKTsKLSAgRVhQRUNUX0ZBTFNFKHBhcnNlci0+TmV4dFZhbHVlKHR5cGUsIHN0YXJ0LCBsZW4pKTsKLQotICBwYXJzZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXI+KEwiI2FiY2RlZiIsIDcsIEwnICcpOwotICBFWFBFQ1RfVFJVRShwYXJzZXItPk5leHRWYWx1ZSh0eXBlLCBzdGFydCwgbGVuKSk7Ci0gIEVYUEVDVF9FUShGREVfQ1NTUHJpbWl0aXZlVHlwZTo6UkdCLCB0eXBlKTsKLSAgRVhQRUNUX0VRKEwiI2FiY2RlZiIsIENGWF9XaWRlU3RyaW5nKHN0YXJ0LCBsZW4pKTsKLSAgRVhQRUNUX0ZBTFNFKHBhcnNlci0+TmV4dFZhbHVlKHR5cGUsIHN0YXJ0LCBsZW4pKTsKLQotICBwYXJzZXIgPQotICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyPihMInJnYigxLCAyNTUsIDQpIiwgMTQsIEwnICcpOwotICBFWFBFQ1RfVFJVRShwYXJzZXItPk5leHRWYWx1ZSh0eXBlLCBzdGFydCwgbGVuKSk7Ci0gIEVYUEVDVF9FUShGREVfQ1NTUHJpbWl0aXZlVHlwZTo6UkdCLCB0eXBlKTsKLSAgRVhQRUNUX0VRKEwicmdiKDEsIDI1NSwgNCkiLCBDRlhfV2lkZVN0cmluZyhzdGFydCwgbGVuKSk7Ci0KLSAgcGFyc2VyID0KLSAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlcj4oTCIjYWJjZGVmZ2hpaiIsIDExLCBMJyAnKTsKLSAgRVhQRUNUX1RSVUUocGFyc2VyLT5OZXh0VmFsdWUodHlwZSwgc3RhcnQsIGxlbikpOwotICBFWFBFQ1RfRVEoRkRFX0NTU1ByaW1pdGl2ZVR5cGU6OlVua25vd24sIHR5cGUpOwotICBFWFBFQ1RfRVEoTCIjYWJjZGVmZ2hpaiIsIENGWF9XaWRlU3RyaW5nKHN0YXJ0LCBsZW4pKTsKLSAgRVhQRUNUX0ZBTFNFKHBhcnNlci0+TmV4dFZhbHVlKHR5cGUsIHN0YXJ0LCBsZW4pKTsKLX0KLQotVEVTVChDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlciwgbnVtYmVyX3BhcnNpbmcpIHsKLSAgRkRFX0NTU1ByaW1pdGl2ZVR5cGUgdHlwZTsKLSAgY29uc3QgRlhfV0NIQVIqIHN0YXJ0OwotICBpbnQzMl90IGxlbjsKLQotICBhdXRvIHBhcnNlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlcj4oTCIxMjM0IiwgNCwgTCcgJyk7Ci0gIEVYUEVDVF9UUlVFKHBhcnNlci0+TmV4dFZhbHVlKHR5cGUsIHN0YXJ0LCBsZW4pKTsKLSAgRVhQRUNUX0VRKEZERV9DU1NQcmltaXRpdmVUeXBlOjpOdW1iZXIsIHR5cGUpOwotICBFWFBFQ1RfRVEoTCIxMjM0IiwgQ0ZYX1dpZGVTdHJpbmcoc3RhcnQsIGxlbikpOwotCi0gIHBhcnNlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlcj4oTCItMTIzNCIsIDUsIEwnICcpOwotICBFWFBFQ1RfVFJVRShwYXJzZXItPk5leHRWYWx1ZSh0eXBlLCBzdGFydCwgbGVuKSk7Ci0gIEVYUEVDVF9FUShGREVfQ1NTUHJpbWl0aXZlVHlwZTo6TnVtYmVyLCB0eXBlKTsKLSAgRVhQRUNUX0VRKEwiLTEyMzQiLCBDRlhfV2lkZVN0cmluZyhzdGFydCwgbGVuKSk7Ci0KLSAgcGFyc2VyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyPihMIisxMjM0IiwgNSwgTCcgJyk7Ci0gIEVYUEVDVF9UUlVFKHBhcnNlci0+TmV4dFZhbHVlKHR5cGUsIHN0YXJ0LCBsZW4pKTsKLSAgRVhQRUNUX0VRKEZERV9DU1NQcmltaXRpdmVUeXBlOjpOdW1iZXIsIHR5cGUpOwotICBFWFBFQ1RfRVEoTCIrMTIzNCIsIENGWF9XaWRlU3RyaW5nKHN0YXJ0LCBsZW4pKTsKLQotICBwYXJzZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXI+KEwiLjEyMzQiLCA1LCBMJyAnKTsKLSAgRVhQRUNUX1RSVUUocGFyc2VyLT5OZXh0VmFsdWUodHlwZSwgc3RhcnQsIGxlbikpOwotICBFWFBFQ1RfRVEoRkRFX0NTU1ByaW1pdGl2ZVR5cGU6Ok51bWJlciwgdHlwZSk7Ci0gIEVYUEVDVF9FUShMIi4xMjM0IiwgQ0ZYX1dpZGVTdHJpbmcoc3RhcnQsIGxlbikpOwotCi0gIHBhcnNlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlcj4oTCI0MzIxLjEyMzQiLCA5LCBMJyAnKTsKLSAgRVhQRUNUX1RSVUUocGFyc2VyLT5OZXh0VmFsdWUodHlwZSwgc3RhcnQsIGxlbikpOwotICBFWFBFQ1RfRVEoRkRFX0NTU1ByaW1pdGl2ZVR5cGU6Ok51bWJlciwgdHlwZSk7Ci0gIEVYUEVDVF9FUShMIjQzMjEuMTIzNCIsIENGWF9XaWRlU3RyaW5nKHN0YXJ0LCBsZW4pKTsKLQotICAvLyBUT0RPKGRzaW5jbGFpcik6IFRoZXNlIHNob3VsZCBwcm9iYWJseSBmYWlsIGJ1dCBjdXJyZW50bHkgZG9uJ3QuCi0gIHBhcnNlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlcj4oTCI0MzIxLjEyLjM0IiwgMTAsIEwnICcpOwotICBFWFBFQ1RfVFJVRShwYXJzZXItPk5leHRWYWx1ZSh0eXBlLCBzdGFydCwgbGVuKSk7Ci0gIEVYUEVDVF9FUShGREVfQ1NTUHJpbWl0aXZlVHlwZTo6TnVtYmVyLCB0eXBlKTsKLSAgRVhQRUNUX0VRKEwiNDMyMS4xMi4zNCIsIENGWF9XaWRlU3RyaW5nKHN0YXJ0LCBsZW4pKTsKLQotICBwYXJzZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXI+KEwiNDNhMS4xMi4zNCIsIDEwLCBMJyAnKTsKLSAgRVhQRUNUX1RSVUUocGFyc2VyLT5OZXh0VmFsdWUodHlwZSwgc3RhcnQsIGxlbikpOwotICBFWFBFQ1RfRVEoRkRFX0NTU1ByaW1pdGl2ZVR5cGU6Ok51bWJlciwgdHlwZSk7Ci0gIEVYUEVDVF9FUShMIjQzYTEuMTIuMzQiLCBDRlhfV2lkZVN0cmluZyhzdGFydCwgbGVuKSk7Ci19Ci0KLVRFU1QoQ0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXIsIHN0cmluZ19wYXJzaW5nKSB7Ci0gIEZERV9DU1NQcmltaXRpdmVUeXBlIHR5cGU7Ci0gIGNvbnN0IEZYX1dDSEFSKiBzdGFydDsKLSAgaW50MzJfdCBsZW47Ci0KLSAgYXV0byBwYXJzZXIgPQotICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyPihMIidzdHJpbmcnIiwgOCwgTCcgJyk7Ci0gIEVYUEVDVF9UUlVFKHBhcnNlci0+TmV4dFZhbHVlKHR5cGUsIHN0YXJ0LCBsZW4pKTsKLSAgRVhQRUNUX0VRKEZERV9DU1NQcmltaXRpdmVUeXBlOjpTdHJpbmcsIHR5cGUpOwotICBFWFBFQ1RfRVEoTCJzdHJpbmciLCBDRlhfV2lkZVN0cmluZyhzdGFydCwgbGVuKSk7Ci0KLSAgcGFyc2VyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyPihMIlwiYW5vdGhlciBzdHJpbmdcIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsIEwnICcpOwotICBFWFBFQ1RfVFJVRShwYXJzZXItPk5leHRWYWx1ZSh0eXBlLCBzdGFydCwgbGVuKSk7Ci0gIEVYUEVDVF9FUShGREVfQ1NTUHJpbWl0aXZlVHlwZTo6U3RyaW5nLCB0eXBlKTsKLSAgRVhQRUNUX0VRKEwiYW5vdGhlciBzdHJpbmciLCBDRlhfV2lkZVN0cmluZyhzdGFydCwgbGVuKSk7Ci0KLSAgcGFyc2VyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyPihMInN0YW5kYWxvbmUiLCAxMCwgTCcgJyk7Ci0gIEVYUEVDVF9UUlVFKHBhcnNlci0+TmV4dFZhbHVlKHR5cGUsIHN0YXJ0LCBsZW4pKTsKLSAgRVhQRUNUX0VRKEZERV9DU1NQcmltaXRpdmVUeXBlOjpTdHJpbmcsIHR5cGUpOwotICBFWFBFQ1RfRVEoTCJzdGFuZGFsb25lIiwgQ0ZYX1dpZGVTdHJpbmcoc3RhcnQsIGxlbikpOwotfQotCi1URVNUKENGREVfQ1NTVmFsdWVMaXN0UGFyc2VyLCBtdWx0aXBhcnNpbmcpIHsKLSAgRkRFX0NTU1ByaW1pdGl2ZVR5cGUgdHlwZTsKLSAgY29uc3QgRlhfV0NIQVIqIHN0YXJ0OwotICBpbnQzMl90IGxlbjsKLQotICBhdXRvIHBhcnNlciA9Ci0gICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZERV9DU1NWYWx1ZUxpc3RQYXJzZXI+KEwiMSwgMiwgMyIsIDcsIEwnLCcpOwotICBFWFBFQ1RfVFJVRShwYXJzZXItPk5leHRWYWx1ZSh0eXBlLCBzdGFydCwgbGVuKSk7Ci0gIEVYUEVDVF9FUShGREVfQ1NTUHJpbWl0aXZlVHlwZTo6TnVtYmVyLCB0eXBlKTsKLSAgRVhQRUNUX0VRKEwiMSIsIENGWF9XaWRlU3RyaW5nKHN0YXJ0LCBsZW4pKTsKLQotICBFWFBFQ1RfVFJVRShwYXJzZXItPk5leHRWYWx1ZSh0eXBlLCBzdGFydCwgbGVuKSk7Ci0gIEVYUEVDVF9FUShGREVfQ1NTUHJpbWl0aXZlVHlwZTo6TnVtYmVyLCB0eXBlKTsKLSAgRVhQRUNUX0VRKEwiMiIsIENGWF9XaWRlU3RyaW5nKHN0YXJ0LCBsZW4pKTsKLQotICBFWFBFQ1RfVFJVRShwYXJzZXItPk5leHRWYWx1ZSh0eXBlLCBzdGFydCwgbGVuKSk7Ci0gIEVYUEVDVF9FUShGREVfQ1NTUHJpbWl0aXZlVHlwZTo6TnVtYmVyLCB0eXBlKTsKLSAgRVhQRUNUX0VRKEwiMyIsIENGWF9XaWRlU3RyaW5nKHN0YXJ0LCBsZW4pKTsKLQotICBFWFBFQ1RfRkFMU0UocGFyc2VyLT5OZXh0VmFsdWUodHlwZSwgc3RhcnQsIGxlbikpOwotCi0gIHBhcnNlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRkRFX0NTU1ZhbHVlTGlzdFBhcnNlcj4oCi0gICAgICBMIidzdHInLCByZ2IoMSwgMiwgMyksIDQiLCAyMiwgTCcsJyk7Ci0gIEVYUEVDVF9UUlVFKHBhcnNlci0+TmV4dFZhbHVlKHR5cGUsIHN0YXJ0LCBsZW4pKTsKLSAgRVhQRUNUX0VRKEZERV9DU1NQcmltaXRpdmVUeXBlOjpTdHJpbmcsIHR5cGUpOwotICBFWFBFQ1RfRVEoTCJzdHIiLCBDRlhfV2lkZVN0cmluZyhzdGFydCwgbGVuKSk7Ci0KLSAgRVhQRUNUX1RSVUUocGFyc2VyLT5OZXh0VmFsdWUodHlwZSwgc3RhcnQsIGxlbikpOwotICBFWFBFQ1RfRVEoRkRFX0NTU1ByaW1pdGl2ZVR5cGU6OlJHQiwgdHlwZSk7Ci0gIEVYUEVDVF9FUShMInJnYigxLCAyLCAzKSIsIENGWF9XaWRlU3RyaW5nKHN0YXJ0LCBsZW4pKTsKLQotICBFWFBFQ1RfVFJVRShwYXJzZXItPk5leHRWYWx1ZSh0eXBlLCBzdGFydCwgbGVuKSk7Ci0gIEVYUEVDVF9FUShGREVfQ1NTUHJpbWl0aXZlVHlwZTo6TnVtYmVyLCB0eXBlKTsKLSAgRVhQRUNUX0VRKEwiNCIsIENGWF9XaWRlU3RyaW5nKHN0YXJ0LCBsZW4pKTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9mZGUvY3NzL2ZkZV9jc3MuaCBiL3hmYS9mZGUvY3NzL2ZkZV9jc3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMyNjI5Zi4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL2Nzcy9mZGVfY3NzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GREVfQ1NTX0ZERV9DU1NfSF8KLSNkZWZpbmUgWEZBX0ZERV9DU1NfRkRFX0NTU19IXwotCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2NydC9mZ2FzX3N0cmVhbS5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2NydC9mZ2FzX3V0aWxzLmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9jZmdhc19mb250bWdyLmgiCi0KLWVudW0gRkRFX0NTU1ZBTFVFVFlQRSB7Ci0gIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlID0gMSA8PCAwLAotICBGREVfQ1NTVkFMVUVUWVBFX0xpc3QgPSAxIDw8IDEsCi0gIEZERV9DU1NWQUxVRVRZUEVfU2hvcnRoYW5kID0gMSA8PCAyLAotICAvLyBOb3RlIHRoZSB2YWx1ZXMgYmVsb3cgdGhpcyBjb21tZW50IG11c3QgYmUgPiAweDBGIHNvIHdlIGNhbiBtYXNrIHRoZSBhYm92ZS4KLSAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlciA9IDEgPDwgNCwKLSAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gPSAxIDw8IDUsCi0gIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVTdHJpbmcgPSAxIDw8IDcsCi0gIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVDb2xvciA9IDEgPDwgOAotfTsKLQotZW51bSBjbGFzcyBGREVfQ1NTUHJpbWl0aXZlVHlwZSA6IHVpbnQ4X3QgewotICBVbmtub3duID0gMCwKLSAgTnVtYmVyLAotICBTdHJpbmcsCi0gIFJHQiwKLSAgRW51bSwKLSAgRnVuY3Rpb24sCi0gIExpc3QsCi19OwotCi1lbnVtIGNsYXNzIEZERV9DU1NQcm9wZXJ0eVZhbHVlIDogdWludDhfdCB7Ci0gIEJvbGRlciA9IDAsCi0gIE5vbmUsCi0gIERvdCwKLSAgU3ViLAotICBUb3AsCi0gIFJpZ2h0LAotICBOb3JtYWwsCi0gIEF1dG8sCi0gIFRleHQsCi0gIFhTbWFsbCwKLSAgVGhpbiwKLSAgU21hbGwsCi0gIEJvdHRvbSwKLSAgVW5kZXJsaW5lLAotICBEb3VibGUsCi0gIExpZ2h0ZXIsCi0gIE9ibGlxdWUsCi0gIFN1cGVyLAotICBDZW50ZXIsCi0gIFh4TGFyZ2UsCi0gIFNtYWxsZXIsCi0gIEJhc2VsaW5lLAotICBUaGljaywKLSAgSnVzdGlmeSwKLSAgTWlkZGxlLAotICBNZWRpdW0sCi0gIExpc3RJdGVtLAotICBYeFNtYWxsLAotICBCb2xkLAotICBTbWFsbENhcHMsCi0gIElubGluZSwKLSAgT3ZlcmxpbmUsCi0gIFRleHRCb3R0b20sCi0gIExhcmdlciwKLSAgSW5saW5lVGFibGUsCi0gIElubGluZUJsb2NrLAotICBCbGluaywKLSAgQmxvY2ssCi0gIEl0YWxpYywKLSAgTGluZVRocm91Z2gsCi0gIFhMYXJnZSwKLSAgTGFyZ2UsCi0gIExlZnQsCi0gIFRleHRUb3AsCi0gIExBU1RfTUFSS0VSCi19OwotCi1lbnVtIGNsYXNzIEZERV9DU1NQcm9wZXJ0eSA6IHVpbnQ4X3QgewotICBCb3JkZXJMZWZ0ID0gMCwKLSAgVG9wLAotICBNYXJnaW4sCi0gIFRleHRJbmRlbnQsCi0gIFJpZ2h0LAotICBQYWRkaW5nTGVmdCwKLSAgTWFyZ2luTGVmdCwKLSAgQm9yZGVyLAotICBCb3JkZXJUb3AsCi0gIEJvdHRvbSwKLSAgUGFkZGluZ1JpZ2h0LAotICBCb3JkZXJCb3R0b20sCi0gIEZvbnRGYW1pbHksCi0gIEZvbnRXZWlnaHQsCi0gIENvbG9yLAotICBMZXR0ZXJTcGFjaW5nLAotICBUZXh0QWxpZ24sCi0gIEJvcmRlclJpZ2h0V2lkdGgsCi0gIFZlcnRpY2FsQWxpZ24sCi0gIFBhZGRpbmdUb3AsCi0gIEZvbnRWYXJpYW50LAotICBCb3JkZXJXaWR0aCwKLSAgQm9yZGVyQm90dG9tV2lkdGgsCi0gIEJvcmRlclJpZ2h0LAotICBGb250U2l6ZSwKLSAgQm9yZGVyU3BhY2luZywKLSAgRm9udFN0eWxlLAotICBGb250LAotICBMaW5lSGVpZ2h0LAotICBNYXJnaW5SaWdodCwKLSAgQm9yZGVyTGVmdFdpZHRoLAotICBEaXNwbGF5LAotICBQYWRkaW5nQm90dG9tLAotICBCb3JkZXJUb3BXaWR0aCwKLSAgV29yZFNwYWNpbmcsCi0gIExlZnQsCi0gIFRleHREZWNvcmF0aW9uLAotICBQYWRkaW5nLAotICBNYXJnaW5Cb3R0b20sCi0gIE1hcmdpblRvcCwKLSAgTEFTVF9NQVJLRVIKLX07Ci0KLWVudW0gY2xhc3MgRkRFX0NTU1NlbGVjdG9yVHlwZSA6IHVpbnQ4X3QgeyBFbGVtZW50ID0gMCwgRGVzY2VuZGFudCB9OwotCi1lbnVtIGNsYXNzIEZERV9DU1NMZW5ndGhVbml0IDogdWludDhfdCB7Ci0gIEF1dG8sCi0gIE5vbmUsCi0gIE5vcm1hbCwKLSAgUG9pbnQsCi0gIFBlcmNlbnQsCi19OwotCi1lbnVtIGNsYXNzIEZERV9DU1NEaXNwbGF5IDogdWludDhfdCB7Ci0gIE5vbmUsCi0gIExpc3RJdGVtLAotICBCbG9jaywKLSAgSW5saW5lLAotICBJbmxpbmVCbG9jaywKLSAgSW5saW5lVGFibGUsCi19OwotCi1lbnVtIGNsYXNzIEZERV9DU1NGb250U3R5bGUgOiB1aW50OF90IHsKLSAgTm9ybWFsLAotICBJdGFsaWMsCi19OwotCi1lbnVtIGNsYXNzIEZERV9DU1NUZXh0QWxpZ24gOiB1aW50OF90IHsKLSAgTGVmdCwKLSAgUmlnaHQsCi0gIENlbnRlciwKLSAgSnVzdGlmeSwKLSAgSnVzdGlmeUFsbCwKLX07Ci0KLWVudW0gY2xhc3MgRkRFX0NTU1ZlcnRpY2FsQWxpZ24gOiB1aW50OF90IHsKLSAgQmFzZWxpbmUsCi0gIFN1YiwKLSAgU3VwZXIsCi0gIFRvcCwKLSAgVGV4dFRvcCwKLSAgTWlkZGxlLAotICBCb3R0b20sCi0gIFRleHRCb3R0b20sCi0gIE51bWJlciwKLX07Ci0KLWVudW0gY2xhc3MgRkRFX0NTU0ZvbnRWYXJpYW50IDogdWludDhfdCB7Ci0gIE5vcm1hbCwKLSAgU21hbGxDYXBzLAotfTsKLQotZW51bSBGREVfQ1NTVEVYVERFQ09SQVRJT04gewotICBGREVfQ1NTVEVYVERFQ09SQVRJT05fTm9uZSA9IDAsCi0gIEZERV9DU1NURVhUREVDT1JBVElPTl9VbmRlcmxpbmUgPSAxIDw8IDAsCi0gIEZERV9DU1NURVhUREVDT1JBVElPTl9PdmVybGluZSA9IDEgPDwgMSwKLSAgRkRFX0NTU1RFWFRERUNPUkFUSU9OX0xpbmVUaHJvdWdoID0gMSA8PCAyLAotICBGREVfQ1NTVEVYVERFQ09SQVRJT05fQmxpbmsgPSAxIDw8IDMsCi0gIEZERV9DU1NURVhUREVDT1JBVElPTl9Eb3VibGUgPSAxIDw8IDQsCi19OwotCi1jbGFzcyBGREVfQ1NTTGVuZ3RoIHsKLSBwdWJsaWM6Ci0gIEZERV9DU1NMZW5ndGgoKSB7fQotCi0gIGV4cGxpY2l0IEZERV9DU1NMZW5ndGgoRkRFX0NTU0xlbmd0aFVuaXQgZVVuaXQpIDogbV91bml0KGVVbml0KSB7fQotCi0gIEZERV9DU1NMZW5ndGgoRkRFX0NTU0xlbmd0aFVuaXQgZVVuaXQsIEZYX0ZMT0FUIGZWYWx1ZSkKLSAgICAgIDogbV91bml0KGVVbml0KSwgbV9mVmFsdWUoZlZhbHVlKSB7fQotCi0gIEZERV9DU1NMZW5ndGgmIFNldChGREVfQ1NTTGVuZ3RoVW5pdCBlVW5pdCkgewotICAgIG1fdW5pdCA9IGVVbml0OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIEZERV9DU1NMZW5ndGgmIFNldChGREVfQ1NTTGVuZ3RoVW5pdCBlVW5pdCwgRlhfRkxPQVQgZlZhbHVlKSB7Ci0gICAgbV91bml0ID0gZVVuaXQ7Ci0gICAgbV9mVmFsdWUgPSBmVmFsdWU7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgRkRFX0NTU0xlbmd0aFVuaXQgR2V0VW5pdCgpIGNvbnN0IHsgcmV0dXJuIG1fdW5pdDsgfQotCi0gIEZYX0ZMT0FUIEdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV9mVmFsdWU7IH0KLSAgYm9vbCBOb25aZXJvKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihtX2ZWYWx1ZSkgIT0gMDsgfQotCi0gcHJpdmF0ZToKLSAgRkRFX0NTU0xlbmd0aFVuaXQgbV91bml0OwotICBGWF9GTE9BVCBtX2ZWYWx1ZTsKLX07Ci0KLWNsYXNzIEZERV9DU1NSZWN0IHsKLSBwdWJsaWM6Ci0gIEZERV9DU1NSZWN0KCkge30KLQotICBGREVfQ1NTUmVjdChGREVfQ1NTTGVuZ3RoVW5pdCBlVW5pdCwgRlhfRkxPQVQgdmFsKQotICAgICAgOiBsZWZ0KGVVbml0LCB2YWwpLAotICAgICAgICB0b3AoZVVuaXQsIHZhbCksCi0gICAgICAgIHJpZ2h0KGVVbml0LCB2YWwpLAotICAgICAgICBib3R0b20oZVVuaXQsIHZhbCkge30KLQotICBGREVfQ1NTUmVjdCYgU2V0KEZERV9DU1NMZW5ndGhVbml0IGVVbml0KSB7Ci0gICAgbGVmdC5TZXQoZVVuaXQpOwotICAgIHRvcC5TZXQoZVVuaXQpOwotICAgIHJpZ2h0LlNldChlVW5pdCk7Ci0gICAgYm90dG9tLlNldChlVW5pdCk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIEZERV9DU1NSZWN0JiBTZXQoRkRFX0NTU0xlbmd0aFVuaXQgZVVuaXQsIEZYX0ZMT0FUIGZWYWx1ZSkgewotICAgIGxlZnQuU2V0KGVVbml0LCBmVmFsdWUpOwotICAgIHRvcC5TZXQoZVVuaXQsIGZWYWx1ZSk7Ci0gICAgcmlnaHQuU2V0KGVVbml0LCBmVmFsdWUpOwotICAgIGJvdHRvbS5TZXQoZVVuaXQsIGZWYWx1ZSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgRkRFX0NTU0xlbmd0aCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GREVfQ1NTX0ZERV9DU1NfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZGUvY3NzL2ZkZV9jc3NkYXRhdGFibGUuY3BwIGIveGZhL2ZkZS9jc3MvZmRlX2Nzc2RhdGF0YWJsZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MWM2MTAuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jc3MvZmRlX2Nzc2RhdGF0YWJsZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvZmRlX2Nzc2RhdGF0YWJsZS5oIgotCi0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NzdHlsZXNlbGVjdG9yLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3N2YWx1ZWxpc3RwYXJzZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZmdhcy9jcnQvZmdhc19jb2RlcGFnZS5oIgotCi1zdGF0aWMgY29uc3QgRkRFX0NTU1Byb3BlcnR5VGFibGUgZ19GREVfQ1NTUHJvcGVydGllc1tdID0gewotICAgIHtGREVfQ1NTUHJvcGVydHk6OkJvcmRlckxlZnQsIEwiYm9yZGVyLWxlZnQiLCAweDA0MDgwMDM2LAotICAgICBGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eTo6VG9wLCBMInRvcCIsIDB4MEJFREFGMzMsCi0gICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfAotICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eTo6TWFyZ2luLCBMIm1hcmdpbiIsIDB4MENCMDE2QkUsCi0gICAgIEZERV9DU1NWQUxVRVRZUEVfTGlzdCB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwKLSAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LAotICAgIHtGREVfQ1NTUHJvcGVydHk6OlRleHRJbmRlbnQsIEwidGV4dC1pbmRlbnQiLCAweDE2OUFEQjc0LAotICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LAotICAgIHtGREVfQ1NTUHJvcGVydHk6OlJpZ2h0LCBMInJpZ2h0IiwgMHgxOTNBREUzRSwKLSAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8Ci0gICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5OjpQYWRkaW5nTGVmdCwgTCJwYWRkaW5nLWxlZnQiLCAweDIyOENGMDJGLAotICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LAotICAgIHtGREVfQ1NTUHJvcGVydHk6Ok1hcmdpbkxlZnQsIEwibWFyZ2luLWxlZnQiLCAweDI5N0M1NjU2LAotICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXIgfAotICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LAotICAgIHtGREVfQ1NTUHJvcGVydHk6OkJvcmRlciwgTCJib3JkZXIiLCAweDJBMjMzNDlFLAotICAgICBGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eTo6Qm9yZGVyVG9wLCBMImJvcmRlci10b3AiLCAweDJCODY2QURFLAotICAgICBGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eTo6Qm90dG9tLCBMImJvdHRvbSIsIDB4Mzk5RjAyQjUsCi0gICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfAotICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eTo6UGFkZGluZ1JpZ2h0LCBMInBhZGRpbmctcmlnaHQiLCAweDNGNjE2QUMyLAotICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LAotICAgIHtGREVfQ1NTUHJvcGVydHk6OkJvcmRlckJvdHRvbSwgTCJib3JkZXItYm90dG9tIiwgMHg0NTJDRTc4MCwKLSAgICAgRkRFX0NTU1ZBTFVFVFlQRV9TaG9ydGhhbmR9LAotICAgIHtGREVfQ1NTUHJvcGVydHk6OkZvbnRGYW1pbHksIEwiZm9udC1mYW1pbHkiLCAweDU3NDY4NkU2LAotICAgICBGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlU3RyaW5nfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5OjpGb250V2VpZ2h0LCBMImZvbnQtd2VpZ2h0IiwgMHg2NjkyRjYwQywKLSAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8Ci0gICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5OjpDb2xvciwgTCJjb2xvciIsIDB4NkU2NzkyMUYsCi0gICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfAotICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUNvbG9yfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5OjpMZXR0ZXJTcGFjaW5nLCBMImxldHRlci1zcGFjaW5nIiwgMHg3MDUzNjEwMiwKLSAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8Ci0gICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5OjpUZXh0QWxpZ24sIEwidGV4dC1hbGlnbiIsIDB4NzU1M0YxQkQsCi0gICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LAotICAgIHtGREVfQ1NTUHJvcGVydHk6OkJvcmRlclJpZ2h0V2lkdGgsIEwiYm9yZGVyLXJpZ2h0LXdpZHRoIiwgMHg4RjVBNjAzNiwKLSAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8Ci0gICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5OjpWZXJ0aWNhbEFsaWduLCBMInZlcnRpY2FsLWFsaWduIiwgMHg5MzRBODdEMiwKLSAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8Ci0gICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5OjpQYWRkaW5nVG9wLCBMInBhZGRpbmctdG9wIiwgMHg5NTlEMjJCNywKLSAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5OjpGb250VmFyaWFudCwgTCJmb250LXZhcmlhbnQiLCAweDlDNzg1Nzc5LAotICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5OjpCb3JkZXJXaWR0aCwgTCJib3JkZXItd2lkdGgiLCAweEE4REU0RkVCLAotICAgICBGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8Ci0gICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5OjpCb3JkZXJCb3R0b21XaWR0aCwgTCJib3JkZXItYm90dG9tLXdpZHRoIiwgMHhBRTQxMjA0RCwKLSAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8Ci0gICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5OjpCb3JkZXJSaWdodCwgTCJib3JkZXItcmlnaHQiLCAweEI3OEU5RUE5LAotICAgICBGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eTo6Rm9udFNpemUsIEwiZm9udC1zaXplIiwgMHhCOTM5NTZERiwKLSAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8Ci0gICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5OjpCb3JkZXJTcGFjaW5nLCBMImJvcmRlci1zcGFjaW5nIiwgMHhDNzIwMzBGMCwKLSAgICAgRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eTo6Rm9udFN0eWxlLCBMImZvbnQtc3R5bGUiLCAweENCMTk1MEY1LAotICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5OjpGb250LCBMImZvbnQiLCAweENEMzA4Qjc3LCBGREVfQ1NTVkFMVUVUWVBFX1Nob3J0aGFuZH0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eTo6TGluZUhlaWdodCwgTCJsaW5lLWhlaWdodCIsIDB4Q0ZDQUNFMkUsCi0gICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfAotICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eTo6TWFyZ2luUmlnaHQsIEwibWFyZ2luLXJpZ2h0IiwgMHhEMTNDNThDOSwKLSAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyIHwKLSAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5OjpCb3JkZXJMZWZ0V2lkdGgsIEwiYm9yZGVyLWxlZnQtd2lkdGgiLCAweEQxRTkzRDgzLAotICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwKLSAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LAotICAgIHtGREVfQ1NTUHJvcGVydHk6OkRpc3BsYXksIEwiZGlzcGxheSIsIDB4RDQyMjRDMzYsCi0gICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LAotICAgIHtGREVfQ1NTUHJvcGVydHk6OlBhZGRpbmdCb3R0b20sIEwicGFkZGluZy1ib3R0b20iLCAweEU1NTVCM0I5LAotICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LAotICAgIHtGREVfQ1NTUHJvcGVydHk6OkJvcmRlclRvcFdpZHRoLCBMImJvcmRlci10b3Atd2lkdGgiLCAweEVEMkNCNjJCLAotICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtIHwKLSAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXJ9LAotICAgIHtGREVfQ1NTUHJvcGVydHk6OldvcmRTcGFjaW5nLCBMIndvcmQtc3BhY2luZyIsIDB4RURBNjNCQUUsCi0gICAgIEZERV9DU1NWQUxVRVRZUEVfUHJpbWl0aXZlIHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW0gfAotICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eTo6TGVmdCwgTCJsZWZ0IiwgMHhGNUFENzgyQiwKLSAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bSB8Ci0gICAgICAgICBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5OjpUZXh0RGVjb3JhdGlvbiwgTCJ0ZXh0LWRlY29yYXRpb24iLCAweEY3QzYzNEJBLAotICAgICBGREVfQ1NTVkFMVUVUWVBFX0xpc3QgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlRW51bX0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eTo6UGFkZGluZywgTCJwYWRkaW5nIiwgMHhGOEMzNzNGNywKLSAgICAgRkRFX0NTU1ZBTFVFVFlQRV9MaXN0IHwgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZU51bWJlcn0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eTo6TWFyZ2luQm90dG9tLCBMIm1hcmdpbi1ib3R0b20iLCAweEY5MzQ4NUEwLAotICAgICBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSB8IEZERV9DU1NWQUxVRVRZUEVfTWF5YmVOdW1iZXIgfAotICAgICAgICAgRkRFX0NTU1ZBTFVFVFlQRV9NYXliZUVudW19LAotICAgIHtGREVfQ1NTUHJvcGVydHk6Ok1hcmdpblRvcCwgTCJtYXJnaW4tdG9wIiwgMHhGRTUxRENGRSwKLSAgICAgRkRFX0NTU1ZBTFVFVFlQRV9QcmltaXRpdmUgfCBGREVfQ1NTVkFMVUVUWVBFX01heWJlTnVtYmVyIHwKLSAgICAgICAgIEZERV9DU1NWQUxVRVRZUEVfTWF5YmVFbnVtfSwKLX07Ci1jb25zdCBpbnQzMl90IGdfaUNTU1Byb3BlcnR5Q291bnQgPQotICAgIHNpemVvZihnX0ZERV9DU1NQcm9wZXJ0aWVzKSAvIHNpemVvZihGREVfQ1NTUHJvcGVydHlUYWJsZSk7Ci1zdGF0aWNfYXNzZXJ0KGdfaUNTU1Byb3BlcnR5Q291bnQgPT0KLSAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KEZERV9DU1NQcm9wZXJ0eTo6TEFTVF9NQVJLRVIpLAotICAgICAgICAgICAgICAiUHJvcGVydHkgdGFibGUgZGlmZmVycyBpbiBzaXplIGZyb20gcHJvcGVydHkgZW51bSIpOwotCi1zdGF0aWMgY29uc3QgRkRFX0NTU1Byb3BlcnR5VmFsdWVUYWJsZSBnX0ZERV9DU1NQcm9wZXJ0eVZhbHVlc1tdID0gewotICAgIHtGREVfQ1NTUHJvcGVydHlWYWx1ZTo6Qm9sZGVyLCBMImJvbGRlciIsIDB4MDA5RjEwNTh9LAotICAgIHtGREVfQ1NTUHJvcGVydHlWYWx1ZTo6Tm9uZSwgTCJub25lIiwgMHgwNDhCNjY3MH0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eVZhbHVlOjpEb3QsIEwiZG90IiwgMHgwQTQ4Q0IyN30sCi0gICAge0ZERV9DU1NQcm9wZXJ0eVZhbHVlOjpTdWIsIEwic3ViIiwgMHgwQkQzN0ZBQX0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eVZhbHVlOjpUb3AsIEwidG9wIiwgMHgwQkVEQUYzM30sCi0gICAge0ZERV9DU1NQcm9wZXJ0eVZhbHVlOjpSaWdodCwgTCJyaWdodCIsIDB4MTkzQURFM0V9LAotICAgIHtGREVfQ1NTUHJvcGVydHlWYWx1ZTo6Tm9ybWFsLCBMIm5vcm1hbCIsIDB4MjQ3Q0YzRTl9LAotICAgIHtGREVfQ1NTUHJvcGVydHlWYWx1ZTo6QXV0bywgTCJhdXRvIiwgMHgyQjM1QjZEOX0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eVZhbHVlOjpUZXh0LCBMInRleHQiLCAweDJEMDhBRjg1fSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5VmFsdWU6OlhTbWFsbCwgTCJ4LXNtYWxsIiwgMHgyRDJGQ0FGRX0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eVZhbHVlOjpUaGluLCBMInRoaW4iLCAweDJENTc0RDUzfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5VmFsdWU6OlNtYWxsLCBMInNtYWxsIiwgMHgzMTZBMzczOX0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eVZhbHVlOjpCb3R0b20sIEwiYm90dG9tIiwgMHgzOTlGMDJCNX0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eVZhbHVlOjpVbmRlcmxpbmUsIEwidW5kZXJsaW5lIiwgMHgzQTAyNzNBNn0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eVZhbHVlOjpEb3VibGUsIEwiZG91YmxlIiwgMHgzRDk4NTE1Qn0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eVZhbHVlOjpMaWdodGVyLCBMImxpZ2h0ZXIiLCAweDQ1QkVCN0FGfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5VmFsdWU6Ok9ibGlxdWUsIEwib2JsaXF1ZSIsIDB4NTNFQkREQjF9LAotICAgIHtGREVfQ1NTUHJvcGVydHlWYWx1ZTo6U3VwZXIsIEwic3VwZXIiLCAweDZBNEY4NDJGfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5VmFsdWU6OkNlbnRlciwgTCJjZW50ZXIiLCAweDZDNTFBRkMxfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5VmFsdWU6Olh4TGFyZ2UsIEwieHgtbGFyZ2UiLCAweDcwQkIxNTA4fSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5VmFsdWU6OlNtYWxsZXIsIEwic21hbGxlciIsIDB4ODQ5NzY5RjB9LAotICAgIHtGREVfQ1NTUHJvcGVydHlWYWx1ZTo6QmFzZWxpbmUsIEwiYmFzZWxpbmUiLCAweDg3NDM2QkEzfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5VmFsdWU6OlRoaWNrLCBMInRoaWNrIiwgMHg4Q0MzNUVCM30sCi0gICAge0ZERV9DU1NQcm9wZXJ0eVZhbHVlOjpKdXN0aWZ5LCBMImp1c3RpZnkiLCAweDhEMjY5Q0FFfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5VmFsdWU6Ok1pZGRsZSwgTCJtaWRkbGUiLCAweDk0N0ZBMDBGfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5VmFsdWU6Ok1lZGl1bSwgTCJtZWRpdW0iLCAweEEwODRBMzgxfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5VmFsdWU6Okxpc3RJdGVtLCBMImxpc3QtaXRlbSIsIDB4QTMyMzgyQjh9LAotICAgIHtGREVfQ1NTUHJvcGVydHlWYWx1ZTo6WHhTbWFsbCwgTCJ4eC1zbWFsbCIsIDB4QURFMUZDNzZ9LAotICAgIHtGREVfQ1NTUHJvcGVydHlWYWx1ZTo6Qm9sZCwgTCJib2xkIiwgMHhCMTgzMTNBMX0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eVZhbHVlOjpTbWFsbENhcHMsIEwic21hbGwtY2FwcyIsIDB4QjI5OTQyOER9LAotICAgIHtGREVfQ1NTUHJvcGVydHlWYWx1ZTo6SW5saW5lLCBMImlubGluZSIsIDB4QzAyRDY0OUZ9LAotICAgIHtGREVfQ1NTUHJvcGVydHlWYWx1ZTo6T3ZlcmxpbmUsIEwib3ZlcmxpbmUiLCAweEMwRUM5RkE0fSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5VmFsdWU6OlRleHRCb3R0b20sIEwidGV4dC1ib3R0b20iLCAweEM3RDA4RDg3fSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5VmFsdWU6OkxhcmdlciwgTCJsYXJnZXIiLCAweENEM0M0MDlEfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5VmFsdWU6OklubGluZVRhYmxlLCBMImlubGluZS10YWJsZSIsIDB4RDEzMUY0OTR9LAotICAgIHtGREVfQ1NTUHJvcGVydHlWYWx1ZTo6SW5saW5lQmxvY2ssIEwiaW5saW5lLWJsb2NrIiwgMHhEMjZBOEJEN30sCi0gICAge0ZERV9DU1NQcm9wZXJ0eVZhbHVlOjpCbGluaywgTCJibGluayIsIDB4REMzNkUzOTB9LAotICAgIHtGREVfQ1NTUHJvcGVydHlWYWx1ZTo6QmxvY2ssIEwiYmxvY2siLCAweERDRDQ4MEFCfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5VmFsdWU6Okl0YWxpYywgTCJpdGFsaWMiLCAweEUzMUQ1Mzk2fSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5VmFsdWU6OkxpbmVUaHJvdWdoLCBMImxpbmUtdGhyb3VnaCIsIDB4RTRDNUEyNzZ9LAotICAgIHtGREVfQ1NTUHJvcGVydHlWYWx1ZTo6WExhcmdlLCBMIngtbGFyZ2UiLCAweEYwMDhFMzkwfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5VmFsdWU6OkxhcmdlLCBMImxhcmdlIiwgMHhGNDQzNEZDQn0sCi0gICAge0ZERV9DU1NQcm9wZXJ0eVZhbHVlOjpMZWZ0LCBMImxlZnQiLCAweEY1QUQ3ODJCfSwKLSAgICB7RkRFX0NTU1Byb3BlcnR5VmFsdWU6OlRleHRUb3AsIEwidGV4dC10b3AiLCAweEZDQjU4RDQ1fSwKLX07Ci1jb25zdCBpbnQzMl90IGdfaUNTU1Byb3BlcnR5VmFsdWVDb3VudCA9Ci0gICAgc2l6ZW9mKGdfRkRFX0NTU1Byb3BlcnR5VmFsdWVzKSAvIHNpemVvZihGREVfQ1NTUHJvcGVydHlWYWx1ZVRhYmxlKTsKLXN0YXRpY19hc3NlcnQoZ19pQ1NTUHJvcGVydHlWYWx1ZUNvdW50ID09Ci0gICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihGREVfQ1NTUHJvcGVydHlWYWx1ZTo6TEFTVF9NQVJLRVIpLAotICAgICAgICAgICAgICAiUHJvcGVydHkgdmFsdWUgdGFibGUgZGlmZmVycyBpbiBzaXplIGZyb20gcHJvcGVydHkgdmFsdWUgZW51bSIpOwotCi1zdGF0aWMgY29uc3QgRkRFX0NTU0xlbmd0aFVuaXRUYWJsZSBnX0ZERV9DU1NMZW5ndGhVbml0c1tdID0gewotICAgIHsweDA2NzIsIEZERV9DU1NOdW1iZXJUeXBlOjpFTVN9LAotICAgIHsweDA2N0QsIEZERV9DU1NOdW1iZXJUeXBlOjpFWFN9LAotICAgIHsweDFBRjcsIEZERV9DU1NOdW1iZXJUeXBlOjpJbmNoZXN9LAotICAgIHsweDJGN0EsIEZERV9DU1NOdW1iZXJUeXBlOjpNaWxsaU1ldGVyc30sCi0gICAgezB4M0VEMywgRkRFX0NTU051bWJlclR5cGU6OlBpY2FzfSwKLSAgICB7MHgzRUU0LCBGREVfQ1NTTnVtYmVyVHlwZTo6UG9pbnRzfSwKLSAgICB7MHgzRUU4LCBGREVfQ1NTTnVtYmVyVHlwZTo6UGl4ZWxzfSwKLSAgICB7MHhGQzMwLCBGREVfQ1NTTnVtYmVyVHlwZTo6Q2VudGlNZXRlcnN9LAotfTsKLQotc3RhdGljIGNvbnN0IEZERV9DU1NDT0xPUlRBQkxFIGdfRkRFX0NTU0NvbG9yc1tdID0gewotICAgIHsweDAzMUI0N0ZFLCAweGZmMDAwMDgwfSwgezB4MEJCOERGNUIsIDB4ZmZmZjAwMDB9LAotICAgIHsweDBEODJBNzhDLCAweGZmODAwMDAwfSwgezB4MkFDQzgyRTgsIDB4ZmYwMGZmZmZ9LAotICAgIHsweDJEMDgzOTg2LCAweGZmMDA4MDgwfSwgezB4NEE2QTYxOTUsIDB4ZmZjMGMwYzB9LAotICAgIHsweDU0NkE4RUYzLCAweGZmODA4MDgwfSwgezB4NjVDOTE2OUMsIDB4ZmZmZmE1MDB9LAotICAgIHsweDg0MjJCQjYxLCAweGZmZmZmZmZmfSwgezB4OTI3MUE1NTgsIDB4ZmY4MDAwODB9LAotICAgIHsweEE2NUEzRUUzLCAweGZmZmYwMGZmfSwgezB4QjEzNDU3MDgsIDB4ZmYwMDAwZmZ9LAotICAgIHsweEI2RDJDRjFGLCAweGZmODA4MDAwfSwgezB4RDE5QjVFMUMsIDB4ZmZmZmZmMDB9LAotICAgIHsweERCNjQzOTFELCAweGZmMDAwMDAwfSwgezB4RjYxNkQ1MDcsIDB4ZmYwMGZmMDB9LAotICAgIHsweEY2RUZGRjMxLCAweGZmMDA4MDAwfSwKLX07Ci0KLWNvbnN0IEZERV9DU1NQcm9wZXJ0eVRhYmxlKiBGREVfR2V0Q1NTUHJvcGVydHlCeU5hbWUoCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIHsKLSAgQVNTRVJUKCF3c05hbWUuSXNFbXB0eSgpKTsKLSAgdWludDMyX3QgZHdIYXNoID0gRlhfSGFzaENvZGVfR2V0Vyh3c05hbWUsIHRydWUpOwotICBpbnQzMl90IGlFbmQgPSBnX2lDU1NQcm9wZXJ0eUNvdW50OwotICBpbnQzMl90IGlNaWQsIGlTdGFydCA9IDA7Ci0gIHVpbnQzMl90IGR3TWlkOwotICBkbyB7Ci0gICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7Ci0gICAgZHdNaWQgPSBnX0ZERV9DU1NQcm9wZXJ0aWVzW2lNaWRdLmR3SGFzaDsKLSAgICBpZiAoZHdIYXNoID09IGR3TWlkKSB7Ci0gICAgICByZXR1cm4gZ19GREVfQ1NTUHJvcGVydGllcyArIGlNaWQ7Ci0gICAgfSBlbHNlIGlmIChkd0hhc2ggPiBkd01pZCkgewotICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlFbmQgPSBpTWlkIC0gMTsKLSAgICB9Ci0gIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLWNvbnN0IEZERV9DU1NQcm9wZXJ0eVRhYmxlKiBGREVfR2V0Q1NTUHJvcGVydHlCeUVudW0oRkRFX0NTU1Byb3BlcnR5IGVOYW1lKSB7Ci0gIHJldHVybiBnX0ZERV9DU1NQcm9wZXJ0aWVzICsgc3RhdGljX2Nhc3Q8aW50PihlTmFtZSk7Ci19Ci0KLWNvbnN0IEZERV9DU1NQcm9wZXJ0eVZhbHVlVGFibGUqIEZERV9HZXRDU1NQcm9wZXJ0eVZhbHVlQnlOYW1lKAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKSB7Ci0gIEFTU0VSVCghd3NOYW1lLklzRW1wdHkoKSk7Ci0gIHVpbnQzMl90IGR3SGFzaCA9IEZYX0hhc2hDb2RlX0dldFcod3NOYW1lLCB0cnVlKTsKLSAgaW50MzJfdCBpRW5kID0gZ19pQ1NTUHJvcGVydHlWYWx1ZUNvdW50OwotICBpbnQzMl90IGlNaWQsIGlTdGFydCA9IDA7Ci0gIHVpbnQzMl90IGR3TWlkOwotICBkbyB7Ci0gICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7Ci0gICAgZHdNaWQgPSBnX0ZERV9DU1NQcm9wZXJ0eVZhbHVlc1tpTWlkXS5kd0hhc2g7Ci0gICAgaWYgKGR3SGFzaCA9PSBkd01pZCkgewotICAgICAgcmV0dXJuIGdfRkRFX0NTU1Byb3BlcnR5VmFsdWVzICsgaU1pZDsKLSAgICB9IGVsc2UgaWYgKGR3SGFzaCA+IGR3TWlkKSB7Ci0gICAgICBpU3RhcnQgPSBpTWlkICsgMTsKLSAgICB9IGVsc2UgewotICAgICAgaUVuZCA9IGlNaWQgLSAxOwotICAgIH0KLSAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotY29uc3QgRkRFX0NTU0xlbmd0aFVuaXRUYWJsZSogRkRFX0dldENTU0xlbmd0aFVuaXRCeU5hbWUoCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIHsKLSAgQVNTRVJUKCF3c05hbWUuSXNFbXB0eSgpKTsKLSAgdWludDE2X3Qgd0hhc2ggPSBGWF9IYXNoQ29kZV9HZXRXKHdzTmFtZSwgdHJ1ZSk7Ci0gIGludDMyX3QgaUVuZCA9Ci0gICAgICBzaXplb2YoZ19GREVfQ1NTTGVuZ3RoVW5pdHMpIC8gc2l6ZW9mKEZERV9DU1NMZW5ndGhVbml0VGFibGUpIC0gMTsKLSAgaW50MzJfdCBpTWlkLCBpU3RhcnQgPSAwOwotICB1aW50MTZfdCB3TWlkOwotICBkbyB7Ci0gICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7Ci0gICAgd01pZCA9IGdfRkRFX0NTU0xlbmd0aFVuaXRzW2lNaWRdLndIYXNoOwotICAgIGlmICh3SGFzaCA9PSB3TWlkKSB7Ci0gICAgICByZXR1cm4gZ19GREVfQ1NTTGVuZ3RoVW5pdHMgKyBpTWlkOwotICAgIH0gZWxzZSBpZiAod0hhc2ggPiB3TWlkKSB7Ci0gICAgICBpU3RhcnQgPSBpTWlkICsgMTsKLSAgICB9IGVsc2UgewotICAgICAgaUVuZCA9IGlNaWQgLSAxOwotICAgIH0KLSAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotY29uc3QgRkRFX0NTU0NPTE9SVEFCTEUqIEZERV9HZXRDU1NDb2xvckJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSkgewotICBBU1NFUlQoIXdzTmFtZS5Jc0VtcHR5KCkpOwotICB1aW50MzJfdCBkd0hhc2ggPSBGWF9IYXNoQ29kZV9HZXRXKHdzTmFtZSwgdHJ1ZSk7Ci0gIGludDMyX3QgaUVuZCA9IHNpemVvZihnX0ZERV9DU1NDb2xvcnMpIC8gc2l6ZW9mKEZERV9DU1NDT0xPUlRBQkxFKSAtIDE7Ci0gIGludDMyX3QgaU1pZCwgaVN0YXJ0ID0gMDsKLSAgdWludDMyX3QgZHdNaWQ7Ci0gIGRvIHsKLSAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsKLSAgICBkd01pZCA9IGdfRkRFX0NTU0NvbG9yc1tpTWlkXS5kd0hhc2g7Ci0gICAgaWYgKGR3SGFzaCA9PSBkd01pZCkgewotICAgICAgcmV0dXJuIGdfRkRFX0NTU0NvbG9ycyArIGlNaWQ7Ci0gICAgfSBlbHNlIGlmIChkd0hhc2ggPiBkd01pZCkgewotICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlFbmQgPSBpTWlkIC0gMTsKLSAgICB9Ci0gIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsKLSAgcmV0dXJuIG51bGxwdHI7Ci19CmRpZmYgLS1naXQgYS94ZmEvZmRlL2Nzcy9mZGVfY3NzZGF0YXRhYmxlLmggYi94ZmEvZmRlL2Nzcy9mZGVfY3NzZGF0YXRhYmxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYjBiODUuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9jc3MvZmRlX2Nzc2RhdGF0YWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GREVfQ1NTX0ZERV9DU1NEQVRBVEFCTEVfSF8KLSNkZWZpbmUgWEZBX0ZERV9DU1NfRkRFX0NTU0RBVEFUQUJMRV9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NudW1iZXJ2YWx1ZS5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3NzdmFsdWUuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9mZGVfY3NzLmgiCi0KLSNkZWZpbmUgRkRFX0lzT25seVZhbHVlKHR5cGUsIGVudW0pIFwKLSAgKCgodHlwZSkgJiB+KGVudW0pKSA9PSBGREVfQ1NTVkFMVUVUWVBFX1ByaW1pdGl2ZSkKLQotc3RydWN0IEZERV9DU1NQcm9wZXJ0eVRhYmxlIHsKLSAgRkRFX0NTU1Byb3BlcnR5IGVOYW1lOwotICBjb25zdCBGWF9XQ0hBUiogcHN6TmFtZTsKLSAgdWludDMyX3QgZHdIYXNoOwotICB1aW50MzJfdCBkd1R5cGU7Ci19OwotCi1zdHJ1Y3QgRkRFX0NTU1Byb3BlcnR5VmFsdWVUYWJsZSB7Ci0gIEZERV9DU1NQcm9wZXJ0eVZhbHVlIGVOYW1lOwotICBjb25zdCBGWF9XQ0hBUiogcHN6TmFtZTsKLSAgdWludDMyX3QgZHdIYXNoOwotfTsKLQotc3RydWN0IEZERV9DU1NMZW5ndGhVbml0VGFibGUgewotICB1aW50MTZfdCB3SGFzaDsKLSAgRkRFX0NTU051bWJlclR5cGUgd1ZhbHVlOwotfTsKLQotc3RydWN0IEZERV9DU1NDT0xPUlRBQkxFIHsKLSAgdWludDMyX3QgZHdIYXNoOwotICBGWF9BUkdCIGR3VmFsdWU7Ci19OwotCi1jb25zdCBGREVfQ1NTUHJvcGVydHlUYWJsZSogRkRFX0dldENTU1Byb3BlcnR5QnlOYW1lKAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKTsKLWNvbnN0IEZERV9DU1NQcm9wZXJ0eVRhYmxlKiBGREVfR2V0Q1NTUHJvcGVydHlCeUVudW0oRkRFX0NTU1Byb3BlcnR5IGVOYW1lKTsKLQotY29uc3QgRkRFX0NTU1Byb3BlcnR5VmFsdWVUYWJsZSogRkRFX0dldENTU1Byb3BlcnR5VmFsdWVCeU5hbWUoCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpOwotCi1jb25zdCBGREVfQ1NTTGVuZ3RoVW5pdFRhYmxlKiBGREVfR2V0Q1NTTGVuZ3RoVW5pdEJ5TmFtZSgKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSk7Ci0KLWNvbnN0IEZERV9DU1NDT0xPUlRBQkxFKiBGREVfR2V0Q1NTQ29sb3JCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpOwotCi0jZW5kaWYgIC8vIFhGQV9GREVfQ1NTX0ZERV9DU1NEQVRBVEFCTEVfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZGUvZmRlX2dlZGV2aWNlLmNwcCBiL3hmYS9mZGUvZmRlX2dlZGV2aWNlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwNWY3Ni4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL2ZkZV9nZWRldmljZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZkZS9mZGVfZ2VkZXZpY2UuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dlbW9kdWxlLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9ncmFwaHN0YXRlZGF0YS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9zdWJzdGZvbnQuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2NmZGVfcGF0aC5oIgotI2luY2x1ZGUgInhmYS9mZGUvZmRlX29iamVjdC5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2ZvbnQvY2ZnYXNfZm9udG1nci5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2ZvbnQvY2ZnYXNfZ2Vmb250LmgiCi0KLUNGREVfUmVuZGVyRGV2aWNlOjpDRkRFX1JlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk93bmVyRGV2aWNlKQotICAgIDogbV9wRGV2aWNlKHBEZXZpY2UpLCBtX2JPd25lckRldmljZShiT3duZXJEZXZpY2UpLCBtX2lDaGFyQ291bnQoMCkgewotICBBU1NFUlQocERldmljZSk7Ci0KLSAgRlhfUkVDVCBydCA9IG1fcERldmljZS0+R2V0Q2xpcEJveCgpOwotICBtX3J0Q2xpcCA9IENGWF9SZWN0RigKLSAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihydC5sZWZ0KSwgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHJ0LnRvcCksCi0gICAgICBzdGF0aWNfY2FzdDxGWF9GTE9BVD4ocnQuV2lkdGgoKSksIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihydC5IZWlnaHQoKSkpOwotfQotCi1DRkRFX1JlbmRlckRldmljZTo6fkNGREVfUmVuZGVyRGV2aWNlKCkgewotICBpZiAobV9iT3duZXJEZXZpY2UpCi0gICAgZGVsZXRlIG1fcERldmljZTsKLX0KLQotaW50MzJfdCBDRkRFX1JlbmRlckRldmljZTo6R2V0V2lkdGgoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BEZXZpY2UtPkdldFdpZHRoKCk7Ci19Ci0KLWludDMyX3QgQ0ZERV9SZW5kZXJEZXZpY2U6OkdldEhlaWdodCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcERldmljZS0+R2V0SGVpZ2h0KCk7Ci19Ci0KLXZvaWQgQ0ZERV9SZW5kZXJEZXZpY2U6OlNhdmVTdGF0ZSgpIHsKLSAgbV9wRGV2aWNlLT5TYXZlU3RhdGUoKTsKLX0KLQotdm9pZCBDRkRFX1JlbmRlckRldmljZTo6UmVzdG9yZVN0YXRlKCkgewotICBtX3BEZXZpY2UtPlJlc3RvcmVTdGF0ZShmYWxzZSk7Ci0gIGNvbnN0IEZYX1JFQ1QmIHJ0ID0gbV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7Ci0gIG1fcnRDbGlwID0gQ0ZYX1JlY3RGKAotICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHJ0LmxlZnQpLCBzdGF0aWNfY2FzdDxGWF9GTE9BVD4ocnQudG9wKSwKLSAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihydC5XaWR0aCgpKSwgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHJ0LkhlaWdodCgpKSk7Ci19Ci0KLWJvb2wgQ0ZERV9SZW5kZXJEZXZpY2U6OlNldENsaXBSZWN0KGNvbnN0IENGWF9SZWN0RiYgcnRDbGlwKSB7Ci0gIG1fcnRDbGlwID0gcnRDbGlwOwotICByZXR1cm4gbV9wRGV2aWNlLT5TZXRDbGlwX1JlY3QoRlhfUkVDVCgoaW50MzJfdClGWFNZU19mbG9vcihydENsaXAubGVmdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KUZYU1lTX2Zsb29yKHJ0Q2xpcC50b3ApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClGWFNZU19jZWlsKHJ0Q2xpcC5yaWdodCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpRlhTWVNfY2VpbChydENsaXAuYm90dG9tKCkpKSk7Ci19Ci0KLWNvbnN0IENGWF9SZWN0RiYgQ0ZERV9SZW5kZXJEZXZpY2U6OkdldENsaXBSZWN0KCkgewotICByZXR1cm4gbV9ydENsaXA7Ci19Ci0KLWJvb2wgQ0ZERV9SZW5kZXJEZXZpY2U6OlNldENsaXBQYXRoKGNvbnN0IENGREVfUGF0aCogcENsaXApIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1DRkRFX1BhdGgqIENGREVfUmVuZGVyRGV2aWNlOjpHZXRDbGlwUGF0aCgpIGNvbnN0IHsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLUZYX0ZMT0FUIENGREVfUmVuZGVyRGV2aWNlOjpHZXREcGlYKCkgY29uc3QgewotICByZXR1cm4gOTY7Ci19Ci0KLUZYX0ZMT0FUIENGREVfUmVuZGVyRGV2aWNlOjpHZXREcGlZKCkgY29uc3QgewotICByZXR1cm4gOTY7Ci19Ci0KLWJvb2wgQ0ZERV9SZW5kZXJEZXZpY2U6OkRyYXdJbWFnZShDRlhfRElCU291cmNlKiBwRGliLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFNyY1JlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBkc3RSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBJbWdNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcERldk1hdHJpeCkgewotICBDRlhfUmVjdEYgc3JjUmVjdDsKLSAgaWYgKHBTcmNSZWN0KSB7Ci0gICAgc3JjUmVjdCA9ICpwU3JjUmVjdDsKLSAgfSBlbHNlIHsKLSAgICBzcmNSZWN0ID0gQ0ZYX1JlY3RGKDAsIDAsIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihwRGliLT5HZXRXaWR0aCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihwRGliLT5HZXRIZWlnaHQoKSkpOwotICB9Ci0KLSAgaWYgKHNyY1JlY3QuSXNFbXB0eSgpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDRlhfTWF0cml4IGRpYjJmeGRldjsKLSAgaWYgKHBJbWdNYXRyaXgpIHsKLSAgICBkaWIyZnhkZXYgPSAqcEltZ01hdHJpeDsKLSAgfSBlbHNlIHsKLSAgICBkaWIyZnhkZXYuU2V0SWRlbnRpdHkoKTsKLSAgfQotICBkaWIyZnhkZXYuYSA9IGRzdFJlY3Qud2lkdGg7Ci0gIGRpYjJmeGRldi5kID0gLWRzdFJlY3QuaGVpZ2h0OwotICBkaWIyZnhkZXYuZSA9IGRzdFJlY3QubGVmdDsKLSAgZGliMmZ4ZGV2LmYgPSBkc3RSZWN0LmJvdHRvbSgpOwotICBpZiAocERldk1hdHJpeCkgewotICAgIGRpYjJmeGRldi5Db25jYXQoKnBEZXZNYXRyaXgpOwotICB9Ci0gIHZvaWQqIGhhbmRsZSA9IG51bGxwdHI7Ci0gIG1fcERldmljZS0+U3RhcnRESUJpdHMocERpYiwgMjU1LCAwLCAoY29uc3QgQ0ZYX01hdHJpeCopJmRpYjJmeGRldiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUpOwotICB3aGlsZSAobV9wRGV2aWNlLT5Db250aW51ZURJQml0cyhoYW5kbGUsIG51bGxwdHIpKSB7Ci0gIH0KLSAgbV9wRGV2aWNlLT5DYW5jZWxESUJpdHMoaGFuZGxlKTsKLSAgcmV0dXJuICEhaGFuZGxlOwotfQotCi1ib29sIENGREVfUmVuZGVyRGV2aWNlOjpEcmF3U3RyaW5nKENGREVfQnJ1c2gqIHBCcnVzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+JiBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkZvbnRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7Ci0gIEFTU0VSVChwQnJ1c2ggJiYgcEZvbnQgJiYgcENoYXJQb3MgJiYgaUNvdW50ID4gMCk7Ci0gIENGWF9Gb250KiBwRnhGb250ID0gcEZvbnQtPkdldERldkZvbnQoKTsKLSAgRlhfQVJHQiBhcmdiID0gcEJydXNoLT5HZXRDb2xvcigpOwotICBpZiAoKHBGb250LT5HZXRGb250U3R5bGVzKCkgJiBGWF9GT05UU1RZTEVfSXRhbGljKSAhPSAwICYmCi0gICAgICAhcEZ4Rm9udC0+SXNJdGFsaWMoKSkgewotICAgIEZYVEVYVF9DSEFSUE9TKiBwQ1AgPSAoRlhURVhUX0NIQVJQT1MqKXBDaGFyUG9zOwotICAgIEZYX0ZMT0FUKiBwQU07Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyArK2kpIHsKLSAgICAgIHN0YXRpYyBjb25zdCBGWF9GTE9BVCBtYyA9IDAuMjY3OTQ5ZjsKLSAgICAgIHBBTSA9IHBDUC0+bV9BZGp1c3RNYXRyaXg7Ci0gICAgICBwQU1bMl0gPSBtYyAqIHBBTVswXSArIHBBTVsyXTsKLSAgICAgIHBBTVszXSA9IG1jICogcEFNWzFdICsgcEFNWzNdOwotICAgICAgcENQKys7Ci0gICAgfQotICB9Ci0gIEZYVEVYVF9DSEFSUE9TKiBwQ1AgPSAoRlhURVhUX0NIQVJQT1MqKXBDaGFyUG9zOwotICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gcEN1ckZvbnQ7Ci0gIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBwU1RGb250OwotICBGWFRFWFRfQ0hBUlBPUyogcEN1ckNQID0gbnVsbHB0cjsKLSAgaW50MzJfdCBpQ3VyQ291bnQgPSAwOwotCi0jaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotICB1aW50MzJfdCBkd0ZvbnRTdHlsZSA9IHBGb250LT5HZXRGb250U3R5bGVzKCk7Ci0gIENGWF9Gb250IEZ4Rm9udDsKLSAgQ0ZYX1N1YnN0Rm9udCogU3Vic3RGeEZvbnQgPSBuZXcgQ0ZYX1N1YnN0Rm9udCgpOwotICBGeEZvbnQuU2V0U3Vic3RGb250KHN0ZDo6dW5pcXVlX3B0cjxDRlhfU3Vic3RGb250PihTdWJzdEZ4Rm9udCkpOwotICBTdWJzdEZ4Rm9udC0+bV9XZWlnaHQgPSBkd0ZvbnRTdHlsZSAmIEZYX0ZPTlRTVFlMRV9Cb2xkID8gNzAwIDogNDAwOwotICBTdWJzdEZ4Rm9udC0+bV9JdGFsaWNBbmdsZSA9IGR3Rm9udFN0eWxlICYgRlhfRk9OVFNUWUxFX0l0YWxpYyA/IC0xMiA6IDA7Ci0gIFN1YnN0RnhGb250LT5tX1dlaWdodENKSyA9IFN1YnN0RnhGb250LT5tX1dlaWdodDsKLSAgU3Vic3RGeEZvbnQtPm1fYkl0YWxpY0NKSyA9ICEhKGR3Rm9udFN0eWxlICYgRlhfRk9OVFNUWUxFX0l0YWxpYyk7Ci0jZW5kaWYgIC8vIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLQotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7ICsraSkgewotICAgIHBTVEZvbnQgPSBwRm9udC0+R2V0U3Vic3RGb250KChpbnQzMl90KXBDUC0+bV9HbHlwaEluZGV4KTsKLSAgICBwQ1AtPm1fR2x5cGhJbmRleCAmPSAweDAwRkZGRkZGOwotICAgIHBDUC0+bV9iRm9udFN0eWxlID0gZmFsc2U7Ci0gICAgaWYgKHBDdXJGb250ICE9IHBTVEZvbnQpIHsKLSAgICAgIGlmIChwQ3VyRm9udCkgewotICAgICAgICBwRnhGb250ID0gcEN1ckZvbnQtPkdldERldkZvbnQoKTsKLSNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0gICAgICAgIEZ4Rm9udC5TZXRGYWNlKHBGeEZvbnQtPkdldEZhY2UoKSk7Ci0gICAgICAgIG1fcERldmljZS0+RHJhd05vcm1hbFRleHQoaUN1ckNvdW50LCBwQ3VyQ1AsICZGeEZvbnQsIC1mRm9udFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hdHJpeCwgYXJnYiwgRlhURVhUX0NMRUFSVFlQRSk7Ci0jZWxzZQotICAgICAgICBtX3BEZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlDdXJDb3VudCwgcEN1ckNQLCBwRnhGb250LCAtZkZvbnRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYXRyaXgsIGFyZ2IsIEZYVEVYVF9DTEVBUlRZUEUpOwotI2VuZGlmICAvLyBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0gICAgICB9Ci0gICAgICBwQ3VyRm9udCA9IHBTVEZvbnQ7Ci0gICAgICBwQ3VyQ1AgPSBwQ1A7Ci0gICAgICBpQ3VyQ291bnQgPSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICBpQ3VyQ291bnQrKzsKLSAgICB9Ci0gICAgcENQKys7Ci0gIH0KLSAgaWYgKHBDdXJGb250ICYmIGlDdXJDb3VudCkgewotICAgIHBGeEZvbnQgPSBwQ3VyRm9udC0+R2V0RGV2Rm9udCgpOwotI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgICBGeEZvbnQuU2V0RmFjZShwRnhGb250LT5HZXRGYWNlKCkpOwotICAgIGJvb2wgYlJldCA9Ci0gICAgICAgIG1fcERldmljZS0+RHJhd05vcm1hbFRleHQoaUN1ckNvdW50LCBwQ3VyQ1AsICZGeEZvbnQsIC1mRm9udFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hdHJpeCwgYXJnYiwgRlhURVhUX0NMRUFSVFlQRSk7Ci0gICAgRnhGb250LlNldEZhY2UobnVsbHB0cik7Ci0gICAgcmV0dXJuIGJSZXQ7Ci0jZWxzZQotICAgIHJldHVybiBtX3BEZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlDdXJDb3VudCwgcEN1ckNQLCBwRnhGb250LCAtZkZvbnRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNYXRyaXgsIGFyZ2IsIEZYVEVYVF9DTEVBUlRZUEUpOwotI2VuZGlmICAvLyBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0gIH0KLQotI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgRnhGb250LlNldEZhY2UobnVsbHB0cik7Ci0jZW5kaWYgIC8vIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDRkRFX1JlbmRlckRldmljZTo6RHJhd0JlemllcihDRkRFX1BlbiogcFBlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgc3RkOjp2ZWN0b3I8Q0ZYX1BvaW50Rj4gcG9pbnRzOwotICBwb2ludHMucHVzaF9iYWNrKHB0MSk7Ci0gIHBvaW50cy5wdXNoX2JhY2socHQyKTsKLSAgcG9pbnRzLnB1c2hfYmFjayhwdDMpOwotICBwb2ludHMucHVzaF9iYWNrKHB0NCk7Ci0gIENGREVfUGF0aCBwYXRoOwotICBwYXRoLkFkZEJlemllcihwb2ludHMpOwotICByZXR1cm4gRHJhd1BhdGgocFBlbiwgZlBlbldpZHRoLCAmcGF0aCwgcE1hdHJpeCk7Ci19Ci0KLWJvb2wgQ0ZERV9SZW5kZXJEZXZpY2U6OkRyYXdDdXJ2ZShDRkRFX1BlbiogcFBlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0ZYX1BvaW50Rj4mIHBvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJDbG9zZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBDRkRFX1BhdGggcGF0aDsKLSAgcGF0aC5BZGRDdXJ2ZShwb2ludHMsIGJDbG9zZWQsIGZUZW5zaW9uKTsKLSAgcmV0dXJuIERyYXdQYXRoKHBQZW4sIGZQZW5XaWR0aCwgJnBhdGgsIHBNYXRyaXgpOwotfQotCi1ib29sIENGREVfUmVuZGVyRGV2aWNlOjpEcmF3RWxsaXBzZShDRkRFX1BlbiogcFBlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgQ0ZERV9QYXRoIHBhdGg7Ci0gIHBhdGguQWRkRWxsaXBzZShyZWN0KTsKLSAgcmV0dXJuIERyYXdQYXRoKHBQZW4sIGZQZW5XaWR0aCwgJnBhdGgsIHBNYXRyaXgpOwotfQotCi1ib29sIENGREVfUmVuZGVyRGV2aWNlOjpEcmF3TGluZXMoQ0ZERV9QZW4qIHBQZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENGWF9Qb2ludEY+JiBwb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBDRkRFX1BhdGggcGF0aDsKLSAgcGF0aC5BZGRMaW5lcyhwb2ludHMpOwotICByZXR1cm4gRHJhd1BhdGgocFBlbiwgZlBlbldpZHRoLCAmcGF0aCwgcE1hdHJpeCk7Ci19Ci0KLWJvb2wgQ0ZERV9SZW5kZXJEZXZpY2U6OkRyYXdMaW5lKENGREVfUGVuKiBwUGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBDRkRFX1BhdGggcGF0aDsKLSAgcGF0aC5BZGRMaW5lKHB0MSwgcHQyKTsKLSAgcmV0dXJuIERyYXdQYXRoKHBQZW4sIGZQZW5XaWR0aCwgJnBhdGgsIHBNYXRyaXgpOwotfQotCi1ib29sIENGREVfUmVuZGVyRGV2aWNlOjpEcmF3UGF0aChDRkRFX1BlbiogcFBlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGREVfUGF0aCogcFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7Ci0gIENGREVfUGF0aCogcEdlUGF0aCA9IChDRkRFX1BhdGgqKXBQYXRoOwotICBpZiAoIXBHZVBhdGgpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENGWF9HcmFwaFN0YXRlRGF0YSBncmFwaFN0YXRlOwotICBpZiAoIUNyZWF0ZVBlbihwUGVuLCBmUGVuV2lkdGgsIGdyYXBoU3RhdGUpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBtX3BEZXZpY2UtPkRyYXdQYXRoKCZwR2VQYXRoLT5tX1BhdGgsIChjb25zdCBDRlhfTWF0cml4KilwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3JhcGhTdGF0ZSwgMCwgcFBlbi0+R2V0Q29sb3IoKSwgMCk7Ci19Ci0KLWJvb2wgQ0ZERV9SZW5kZXJEZXZpY2U6OkRyYXdQb2x5Z29uKENGREVfUGVuKiBwUGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0ZYX1BvaW50Rj4mIHBvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgQ0ZERV9QYXRoIHBhdGg7Ci0gIHBhdGguQWRkUG9seWdvbihwb2ludHMpOwotICByZXR1cm4gRHJhd1BhdGgocFBlbiwgZlBlbldpZHRoLCAmcGF0aCwgcE1hdHJpeCk7Ci19Ci0KLWJvb2wgQ0ZERV9SZW5kZXJEZXZpY2U6OkRyYXdSZWN0YW5nbGUoQ0ZERV9QZW4qIHBQZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7Ci0gIENGREVfUGF0aCBwYXRoOwotICBwYXRoLkFkZFJlY3RhbmdsZShyZWN0KTsKLSAgcmV0dXJuIERyYXdQYXRoKHBQZW4sIGZQZW5XaWR0aCwgJnBhdGgsIHBNYXRyaXgpOwotfQotCi1ib29sIENGREVfUmVuZGVyRGV2aWNlOjpGaWxsQ2xvc2VkQ3VydmUoQ0ZERV9CcnVzaCogcEJydXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENGWF9Qb2ludEY+JiBwb2ludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBDRkRFX1BhdGggcGF0aDsKLSAgcGF0aC5BZGRDdXJ2ZShwb2ludHMsIHRydWUsIGZUZW5zaW9uKTsKLSAgcmV0dXJuIEZpbGxQYXRoKHBCcnVzaCwgJnBhdGgsIHBNYXRyaXgpOwotfQotCi1ib29sIENGREVfUmVuZGVyRGV2aWNlOjpGaWxsRWxsaXBzZShDRkRFX0JydXNoKiBwQnJ1c2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7Ci0gIENGREVfUGF0aCBwYXRoOwotICBwYXRoLkFkZEVsbGlwc2UocmVjdCk7Ci0gIHJldHVybiBGaWxsUGF0aChwQnJ1c2gsICZwYXRoLCBwTWF0cml4KTsKLX0KLQotYm9vbCBDRkRFX1JlbmRlckRldmljZTo6RmlsbFBvbHlnb24oQ0ZERV9CcnVzaCogcEJydXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0ZYX1BvaW50Rj4mIHBvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgQ0ZERV9QYXRoIHBhdGg7Ci0gIHBhdGguQWRkUG9seWdvbihwb2ludHMpOwotICByZXR1cm4gRmlsbFBhdGgocEJydXNoLCAmcGF0aCwgcE1hdHJpeCk7Ci19Ci0KLWJvb2wgQ0ZERV9SZW5kZXJEZXZpY2U6OkZpbGxSZWN0YW5nbGUoQ0ZERV9CcnVzaCogcEJydXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgQ0ZERV9QYXRoIHBhdGg7Ci0gIHBhdGguQWRkUmVjdGFuZ2xlKHJlY3QpOwotICByZXR1cm4gRmlsbFBhdGgocEJydXNoLCAmcGF0aCwgcE1hdHJpeCk7Ci19Ci0KLWJvb2wgQ0ZERV9SZW5kZXJEZXZpY2U6OkNyZWF0ZVBlbihDRkRFX1BlbiogcFBlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhJiBncmFwaFN0YXRlKSB7Ci0gIGlmICghcFBlbikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgZ3JhcGhTdGF0ZS5tX0xpbmVDYXAgPSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBCdXR0OwotICBncmFwaFN0YXRlLm1fTGluZUpvaW4gPSBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVKb2luTWl0ZXI7Ci0gIGdyYXBoU3RhdGUubV9MaW5lV2lkdGggPSBmUGVuV2lkdGg7Ci0gIGdyYXBoU3RhdGUubV9NaXRlckxpbWl0ID0gMTA7Ci0gIGdyYXBoU3RhdGUubV9EYXNoUGhhc2UgPSAwOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDRkRFX1JlbmRlckRldmljZTo6RmlsbFBhdGgoQ0ZERV9CcnVzaCogcEJydXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZERV9QYXRoKiBwUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgQ0ZERV9QYXRoKiBwR2VQYXRoID0gKENGREVfUGF0aCopcFBhdGg7Ci0gIGlmICghcEdlUGF0aCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghcEJydXNoKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIG1fcERldmljZS0+RHJhd1BhdGgoJnBHZVBhdGgtPm1fUGF0aCwgcE1hdHJpeCwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJydXNoLT5HZXRDb2xvcigpLCAwLCBGWEZJTExfV0lORElORyk7Ci19Ci0KZGlmZiAtLWdpdCBhL3hmYS9mZGUvZmRlX2dlZGV2aWNlLmggYi94ZmEvZmRlL2ZkZV9nZWRldmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yzc3MmNmLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvZmRlX2dlZGV2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GREVfRkRFX0dFREVWSUNFX0hfCi0jZGVmaW5lIFhGQV9GREVfRkRFX0dFREVWSUNFX0hfCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2ZvbnQvY2ZnYXNfZ2Vmb250LmgiCi0KLWNsYXNzIENGREVfQnJ1c2g7Ci1jbGFzcyBDRkRFX1BhdGg7Ci1jbGFzcyBDRkRFX1BlbjsKLWNsYXNzIENGWF9HcmFwaFN0YXRlRGF0YTsKLQotY2xhc3MgQ0ZERV9SZW5kZXJEZXZpY2UgewotIHB1YmxpYzoKLSAgQ0ZERV9SZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSwgYm9vbCBiT3duZXJEZXZpY2UpOwotICB+Q0ZERV9SZW5kZXJEZXZpY2UoKTsKLQotICBpbnQzMl90IEdldFdpZHRoKCkgY29uc3Q7Ci0gIGludDMyX3QgR2V0SGVpZ2h0KCkgY29uc3Q7Ci0gIHZvaWQgU2F2ZVN0YXRlKCk7Ci0gIHZvaWQgUmVzdG9yZVN0YXRlKCk7Ci0gIGJvb2wgU2V0Q2xpcFBhdGgoY29uc3QgQ0ZERV9QYXRoKiBwQ2xpcCk7Ci0gIENGREVfUGF0aCogR2V0Q2xpcFBhdGgoKSBjb25zdDsKLSAgYm9vbCBTZXRDbGlwUmVjdChjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCk7Ci0gIGNvbnN0IENGWF9SZWN0RiYgR2V0Q2xpcFJlY3QoKTsKLQotICBGWF9GTE9BVCBHZXREcGlYKCkgY29uc3Q7Ci0gIEZYX0ZMT0FUIEdldERwaVkoKSBjb25zdDsKLQotICBib29sIERyYXdJbWFnZShDRlhfRElCU291cmNlKiBwRGliLAotICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBTcmNSZWN0LAotICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIGRzdFJlY3QsCi0gICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBJbWdNYXRyaXggPSBudWxscHRyLAotICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwRGV2TWF0cml4ID0gbnVsbHB0cik7Ci0gIGJvb2wgRHJhd1N0cmluZyhDRkRFX0JydXNoKiBwQnJ1c2gsCi0gICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4mIHBGb250LAotICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAotICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQsCi0gICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRm9udFNpemUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gbnVsbHB0cik7Ci0gIGJvb2wgRHJhd0JlemllcihDRkRFX1BlbiogcFBlbiwKLSAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0MSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0MiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0MywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHB0NCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBudWxscHRyKTsKLSAgYm9vbCBEcmF3Q3VydmUoQ0ZERV9QZW4qIHBQZW4sCi0gICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0ZYX1BvaW50Rj4mIHBvaW50cywKLSAgICAgICAgICAgICAgICAgYm9vbCBiQ2xvc2VkLAotICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVGVuc2lvbiA9IDAuNWYsCi0gICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBudWxscHRyKTsKLSAgYm9vbCBEcmF3RWxsaXBzZShDRkRFX1BlbiogcFBlbiwKLSAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBudWxscHRyKTsKLSAgYm9vbCBEcmF3TGluZXMoQ0ZERV9QZW4qIHBQZW4sCi0gICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0ZYX1BvaW50Rj4mIHBvaW50cywKLSAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IG51bGxwdHIpOwotICBib29sIERyYXdMaW5lKENGREVfUGVuKiBwUGVuLAotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwKLSAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwdDEsCi0gICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcHQyLAotICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBudWxscHRyKTsKLSAgYm9vbCBEcmF3UGF0aChDRkRFX1BlbiogcFBlbiwKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsCi0gICAgICAgICAgICAgICAgY29uc3QgQ0ZERV9QYXRoKiBwUGF0aCwKLSAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gbnVsbHB0cik7Ci0gIGJvb2wgRHJhd1BvbHlnb24oQ0ZERV9QZW4qIHBQZW4sCi0gICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlBlbldpZHRoLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENGWF9Qb2ludEY+JiBwb2ludHMsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IG51bGxwdHIpOwotICBib29sIERyYXdSZWN0YW5nbGUoQ0ZERV9QZW4qIHBQZW4sCi0gICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUGVuV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gbnVsbHB0cik7Ci0gIGJvb2wgRmlsbENsb3NlZEN1cnZlKENGREVfQnJ1c2gqIHBCcnVzaCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q0ZYX1BvaW50Rj4mIHBvaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRlbnNpb24gPSAwLjVmLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gbnVsbHB0cik7Ci0gIGJvb2wgRmlsbEVsbGlwc2UoQ0ZERV9CcnVzaCogcEJydXNoLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gbnVsbHB0cik7Ci0gIGJvb2wgRmlsbFBhdGgoQ0ZERV9CcnVzaCogcEJydXNoLAotICAgICAgICAgICAgICAgIGNvbnN0IENGREVfUGF0aCogcFBhdGgsCi0gICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IG51bGxwdHIpOwotICBib29sIEZpbGxQb2x5Z29uKENGREVfQnJ1c2gqIHBCcnVzaCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDRlhfUG9pbnRGPiYgcG9pbnRzLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBudWxscHRyKTsKLSAgYm9vbCBGaWxsUmVjdGFuZ2xlKENGREVfQnJ1c2gqIHBCcnVzaCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBudWxscHRyKTsKLQotICBib29sIERyYXdTb2xpZFN0cmluZyhDRkRFX0JydXNoKiBwQnJ1c2gsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiYgcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7Ci0gIGJvb2wgRHJhd1N0cmluZ1BhdGgoQ0ZERV9CcnVzaCogcEJydXNoLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiYgcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAotICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZGb250U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKLQotIHByb3RlY3RlZDoKLSAgYm9vbCBDcmVhdGVQZW4oQ0ZERV9QZW4qIHBQZW4sCi0gICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZQZW5XaWR0aCwKLSAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhJiBncmFwaFN0YXRlKTsKLQotICBDRlhfUmVuZGVyRGV2aWNlKiBjb25zdCBtX3BEZXZpY2U7Ci0gIENGWF9SZWN0RiBtX3J0Q2xpcDsKLSAgYm9vbCBtX2JPd25lckRldmljZTsKLSAgaW50MzJfdCBtX2lDaGFyQ291bnQ7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GREVfRkRFX0dFREVWSUNFX0hfCmRpZmYgLS1naXQgYS94ZmEvZmRlL2ZkZV9pdGVyYXRvci5jcHAgYi94ZmEvZmRlL2ZkZV9pdGVyYXRvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYTAyZGEuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9mZGVfaXRlcmF0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZkZS9mZGVfaXRlcmF0b3IuaCIKLQotI2luY2x1ZGUgInhmYS9mZ2FzL2NydC9mZ2FzX3V0aWxzLmgiCi0KLUNGREVfVmlzdWFsU2V0SXRlcmF0b3I6OkNGREVfVmlzdWFsU2V0SXRlcmF0b3IoKQotICAgIDogbV9kd0ZpbHRlcigwKSwgbV9DYW52YXNTdGFjaygxMDApIHt9Ci0KLUNGREVfVmlzdWFsU2V0SXRlcmF0b3I6On5DRkRFX1Zpc3VhbFNldEl0ZXJhdG9yKCkgewotICBtX0NhbnZhc1N0YWNrLlJlbW92ZUFsbChmYWxzZSk7Ci19Ci0KLWJvb2wgQ0ZERV9WaXN1YWxTZXRJdGVyYXRvcjo6QXR0YWNoQ2FudmFzKElGREVfQ2FudmFzU2V0KiBwQ2FudmFzKSB7Ci0gIEFTU0VSVChwQ2FudmFzKTsKLQotICBtX0NhbnZhc1N0YWNrLlJlbW92ZUFsbChmYWxzZSk7Ci0gIEZERV9DQU5WQVNJVEVNIGNhbnZhczsKLSAgY2FudmFzLmhDYW52YXMgPSBudWxscHRyOwotICBjYW52YXMucENhbnZhcyA9IHBDYW52YXM7Ci0gIGNhbnZhcy5oUG9zID0gcENhbnZhcy0+R2V0Rmlyc3RQb3NpdGlvbigpOwotICBpZiAoIWNhbnZhcy5oUG9zKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gbV9DYW52YXNTdGFjay5QdXNoKGNhbnZhcykgPT0gMDsKLX0KLQotYm9vbCBDRkRFX1Zpc3VhbFNldEl0ZXJhdG9yOjpGaWx0ZXJPYmplY3RzKHVpbnQzMl90IGR3T2JqZWN0cykgewotICBpZiAobV9DYW52YXNTdGFjay5HZXRTaXplKCkgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgd2hpbGUgKG1fQ2FudmFzU3RhY2suR2V0U2l6ZSgpID4gMSkKLSAgICBtX0NhbnZhc1N0YWNrLlBvcCgpOwotCi0gIG1fZHdGaWx0ZXIgPSBkd09iamVjdHM7Ci0KLSAgRkRFX0NBTlZBU0lURU0qIHBDYW52YXMgPSBtX0NhbnZhc1N0YWNrLkdldFRvcEVsZW1lbnQoKTsKLSAgQVNTRVJUKHBDYW52YXMgJiYgcENhbnZhcy0+cENhbnZhcyk7Ci0KLSAgcENhbnZhcy0+aFBvcyA9IHBDYW52YXMtPnBDYW52YXMtPkdldEZpcnN0UG9zaXRpb24oKTsKLSAgcmV0dXJuICEhcENhbnZhcy0+aFBvczsKLX0KLQotdm9pZCBDRkRFX1Zpc3VhbFNldEl0ZXJhdG9yOjpSZXNldCgpIHsKLSAgRmlsdGVyT2JqZWN0cyhtX2R3RmlsdGVyKTsKLX0KLQotRkRFX1RFWFRFRElUUElFQ0UqIENGREVfVmlzdWFsU2V0SXRlcmF0b3I6OkdldE5leHQoCi0gICAgSUZERV9WaXN1YWxTZXQqJiBwVmlzdWFsU2V0LAotICAgIEZERV9URVhURURJVFBJRUNFKiogcGhDYW52YXNPYmosCi0gICAgSUZERV9DYW52YXNTZXQqKiBwcENhbnZhc1NldCkgewotICB3aGlsZSAobV9DYW52YXNTdGFjay5HZXRTaXplKCkgPiAwKSB7Ci0gICAgRkRFX0NBTlZBU0lURU0qIHBDYW52YXMgPSBtX0NhbnZhc1N0YWNrLkdldFRvcEVsZW1lbnQoKTsKLSAgICBBU1NFUlQocENhbnZhcyAmJiBwQ2FudmFzLT5wQ2FudmFzKTsKLQotICAgIGlmICghcENhbnZhcy0+aFBvcykgewotICAgICAgaWYgKG1fQ2FudmFzU3RhY2suR2V0U2l6ZSgpID09IDEpCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBtX0NhbnZhc1N0YWNrLlBvcCgpOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGRvIHsKLSAgICAgIEZERV9URVhURURJVFBJRUNFKiBwT2JqID0KLSAgICAgICAgICBwQ2FudmFzLT5wQ2FudmFzLT5HZXROZXh0KHBDYW52YXMtPmhQb3MsIHBWaXN1YWxTZXQpOwotICAgICAgQVNTRVJUKHBPYmopOwotCi0gICAgICBGREVfVklTVUFMT0JKVFlQRSBlVHlwZSA9IHBWaXN1YWxTZXQtPkdldFR5cGUoKTsKLSAgICAgIGlmIChlVHlwZSA9PSBGREVfVklTVUFMT0JKX0NhbnZhcykgewotICAgICAgICBGREVfQ0FOVkFTSVRFTSBjYW52YXM7Ci0gICAgICAgIGNhbnZhcy5oQ2FudmFzID0gcE9iajsKLSAgICAgICAgY2FudmFzLnBDYW52YXMgPSBzdGF0aWNfY2FzdDxJRkRFX0NhbnZhc1NldCo+KHBWaXN1YWxTZXQpOwotICAgICAgICBjYW52YXMuaFBvcyA9IGNhbnZhcy5wQ2FudmFzLT5HZXRGaXJzdFBvc2l0aW9uKCk7Ci0gICAgICAgIG1fQ2FudmFzU3RhY2suUHVzaChjYW52YXMpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHVpbnQzMl90IGR3T2JqID0gKHVpbnQzMl90KWVUeXBlOwotICAgICAgaWYgKChtX2R3RmlsdGVyICYgZHdPYmopICE9IDApIHsKLSAgICAgICAgaWYgKHBwQ2FudmFzU2V0KQotICAgICAgICAgICpwcENhbnZhc1NldCA9IHBDYW52YXMtPnBDYW52YXM7Ci0gICAgICAgIGlmIChwaENhbnZhc09iaikKLSAgICAgICAgICAqcGhDYW52YXNPYmogPSBwQ2FudmFzLT5oQ2FudmFzOwotICAgICAgICByZXR1cm4gcE9iajsKLSAgICAgIH0KLSAgICB9IHdoaWxlIChwQ2FudmFzLT5oUG9zKTsKLSAgfQotICBpZiAocHBDYW52YXNTZXQpCi0gICAgKnBwQ2FudmFzU2V0ID0gbnVsbHB0cjsKLSAgaWYgKHBoQ2FudmFzT2JqKQotICAgICpwaENhbnZhc09iaiA9IG51bGxwdHI7Ci0KLSAgcFZpc3VhbFNldCA9IG51bGxwdHI7Ci0gIHJldHVybiBudWxscHRyOwotfQpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9mZGVfaXRlcmF0b3IuaCBiL3hmYS9mZGUvZmRlX2l0ZXJhdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NjU5Y2UuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9mZGVfaXRlcmF0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRkRFX0ZERV9JVEVSQVRPUl9IXwotI2RlZmluZSBYRkFfRkRFX0ZERV9JVEVSQVRPUl9IXwotCi0jaW5jbHVkZSAieGZhL2ZkZS9mZGVfdmlzdWFsc2V0LmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvY3J0L2ZnYXNfdXRpbHMuaCIKLQotc3RydWN0IEZERV9DQU5WQVNJVEVNIHsKLSAgSUZERV9DYW52YXNTZXQqIHBDYW52YXM7Ci0gIEZERV9URVhURURJVFBJRUNFKiBoQ2FudmFzOwotICBGWF9QT1NJVElPTiBoUG9zOwotfTsKLQotY2xhc3MgQ0ZERV9WaXN1YWxTZXRJdGVyYXRvciB7Ci0gcHVibGljOgotICBDRkRFX1Zpc3VhbFNldEl0ZXJhdG9yKCk7Ci0gIH5DRkRFX1Zpc3VhbFNldEl0ZXJhdG9yKCk7Ci0KLSAgYm9vbCBBdHRhY2hDYW52YXMoSUZERV9DYW52YXNTZXQqIHBDYW52YXMpOwotICBib29sIEZpbHRlck9iamVjdHModWludDMyX3QgZHdPYmplY3RzID0gMHhGRkZGRkZGRik7Ci0KLSAgdm9pZCBSZXNldCgpOwotICBGREVfVEVYVEVESVRQSUVDRSogR2V0TmV4dChJRkRFX1Zpc3VhbFNldComIHBWaXN1YWxTZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9URVhURURJVFBJRUNFKiogcGhDYW52YXNPYmogPSBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRkRFX0NhbnZhc1NldCoqIHBwQ2FudmFzU2V0ID0gbnVsbHB0cik7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHVpbnQzMl90IG1fZHdGaWx0ZXI7Ci0gIENGWF9TdGFja1RlbXBsYXRlPEZERV9DQU5WQVNJVEVNPiBtX0NhbnZhc1N0YWNrOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRkRFX0ZERV9JVEVSQVRPUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9mZGVfb2JqZWN0LmggYi94ZmEvZmRlL2ZkZV9vYmplY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM2NmIyMC4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL2ZkZV9vYmplY3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRkRFX0ZERV9PQkpFQ1RfSF8KLSNkZWZpbmUgWEZBX0ZERV9GREVfT0JKRUNUX0hfCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgotCi1jbGFzcyBDRkRFX0JydXNoIHsKLSBwdWJsaWM6Ci0gIENGREVfQnJ1c2goKSA6IG1fQ29sb3IoMHhGRjAwMDAwMCkge30KLQotICBGWF9BUkdCIEdldENvbG9yKCkgY29uc3QgeyByZXR1cm4gbV9Db2xvcjsgfQotICB2b2lkIFNldENvbG9yKEZYX0FSR0IgY29sb3IpIHsgbV9Db2xvciA9IGNvbG9yOyB9Ci0KLSBwcml2YXRlOgotICBGWF9BUkdCIG1fQ29sb3I7Ci19OwotCi1jbGFzcyBDRkRFX1BlbiB7Ci0gcHVibGljOgotICBDRkRFX1BlbigpIDogbV9Db2xvcigwKSB7fQotICB+Q0ZERV9QZW4oKSB7fQotCi0gIEZYX0FSR0IgR2V0Q29sb3IoKSBjb25zdCB7IHJldHVybiBtX0NvbG9yOyB9Ci0gIHZvaWQgU2V0Q29sb3IoRlhfQVJHQiBjb2xvcikgeyBtX0NvbG9yID0gY29sb3I7IH0KLQotIHByaXZhdGU6Ci0gIEZYX0FSR0IgbV9Db2xvcjsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZERV9GREVfT0JKRUNUX0hfCmRpZmYgLS1naXQgYS94ZmEvZmRlL2ZkZV9yZW5kZXIuY3BwIGIveGZhL2ZkZS9mZGVfcmVuZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZhOGY3ZS4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL2ZkZV9yZW5kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9mZGUvZmRlX3JlbmRlci5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotI2luY2x1ZGUgInhmYS9mZGUvZmRlX2dlZGV2aWNlLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9mZGVfb2JqZWN0LmgiCi0KLSNkZWZpbmUgRkRFX1BBVEhSRU5ERVJfU3Ryb2tlIDEKLSNkZWZpbmUgRkRFX1BBVEhSRU5ERVJfRmlsbCAyCi0KLUNGREVfUmVuZGVyQ29udGV4dDo6Q0ZERV9SZW5kZXJDb250ZXh0KCkKLSAgICA6IG1fZVN0YXR1cyhGREVfUkVOREVSU1RBVFVTX1Jlc2V0KSwKLSAgICAgIG1fcFJlbmRlckRldmljZShudWxscHRyKSwKLSAgICAgIG1fVHJhbnNmb3JtKCkgewotICBtX1RyYW5zZm9ybS5TZXRJZGVudGl0eSgpOwotfQotCi1DRkRFX1JlbmRlckNvbnRleHQ6On5DRkRFX1JlbmRlckNvbnRleHQoKSB7Ci0gIFN0b3BSZW5kZXIoKTsKLX0KLQotYm9vbCBDRkRFX1JlbmRlckNvbnRleHQ6OlN0YXJ0UmVuZGVyKENGREVfUmVuZGVyRGV2aWNlKiBwUmVuZGVyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGREVfQ2FudmFzU2V0KiBwQ2FudmFzU2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIHRtRG9jMkRldmljZSkgewotICBpZiAobV9wUmVuZGVyRGV2aWNlKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCFwUmVuZGVyRGV2aWNlKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCFwQ2FudmFzU2V0KQotICAgIHJldHVybiBmYWxzZTsKLQotICBtX2VTdGF0dXMgPSBGREVfUkVOREVSU1RBVFVTX1BhdXNlZDsKLSAgbV9wUmVuZGVyRGV2aWNlID0gcFJlbmRlckRldmljZTsKLSAgbV9UcmFuc2Zvcm0gPSB0bURvYzJEZXZpY2U7Ci0gIGlmICghbV9wSXRlcmF0b3IpCi0gICAgbV9wSXRlcmF0b3IgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZERV9WaXN1YWxTZXRJdGVyYXRvcj4oKTsKLQotICByZXR1cm4gbV9wSXRlcmF0b3ItPkF0dGFjaENhbnZhcyhwQ2FudmFzU2V0KSAmJiBtX3BJdGVyYXRvci0+RmlsdGVyT2JqZWN0cygpOwotfQotCi1GREVfUkVOREVSU1RBVFVTIENGREVfUmVuZGVyQ29udGV4dDo6RG9SZW5kZXIoSUZYX1BhdXNlKiBwUGF1c2UpIHsKLSAgaWYgKCFtX3BSZW5kZXJEZXZpY2UpCi0gICAgcmV0dXJuIEZERV9SRU5ERVJTVEFUVVNfRmFpbGVkOwotICBpZiAoIW1fcEl0ZXJhdG9yKQotICAgIHJldHVybiBGREVfUkVOREVSU1RBVFVTX0ZhaWxlZDsKLQotICBGREVfUkVOREVSU1RBVFVTIGVTdGF0dXMgPSBGREVfUkVOREVSU1RBVFVTX1BhdXNlZDsKLSAgQ0ZYX01hdHJpeCBybTsKLSAgcm0uU2V0UmV2ZXJzZShtX1RyYW5zZm9ybSk7Ci0gIENGWF9SZWN0RiBydERvY0NsaXAgPSBtX3BSZW5kZXJEZXZpY2UtPkdldENsaXBSZWN0KCk7Ci0gIGlmIChydERvY0NsaXAuSXNFbXB0eSgpKSB7Ci0gICAgcnREb2NDbGlwLmxlZnQgPSBydERvY0NsaXAudG9wID0gMDsKLSAgICBydERvY0NsaXAud2lkdGggPSAoRlhfRkxPQVQpbV9wUmVuZGVyRGV2aWNlLT5HZXRXaWR0aCgpOwotICAgIHJ0RG9jQ2xpcC5oZWlnaHQgPSAoRlhfRkxPQVQpbV9wUmVuZGVyRGV2aWNlLT5HZXRIZWlnaHQoKTsKLSAgfQotICBybS5UcmFuc2Zvcm1SZWN0KHJ0RG9jQ2xpcCk7Ci0gIElGREVfVmlzdWFsU2V0KiBwVmlzdWFsU2V0OwotICBGREVfVEVYVEVESVRQSUVDRSogcFBpZWNlOwotICBpbnQzMl90IGlDb3VudCA9IDA7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgcFBpZWNlID0gbV9wSXRlcmF0b3ItPkdldE5leHQocFZpc3VhbFNldCk7Ci0gICAgaWYgKCFwUGllY2UgfHwgIXBWaXN1YWxTZXQpIHsKLSAgICAgIGVTdGF0dXMgPSBGREVfUkVOREVSU1RBVFVTX0RvbmU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKCFydERvY0NsaXAuSW50ZXJzZWN0V2l0aChwVmlzdWFsU2V0LT5HZXRSZWN0KCpwUGllY2UpKSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgc3dpdGNoIChwVmlzdWFsU2V0LT5HZXRUeXBlKCkpIHsKLSAgICAgIGNhc2UgRkRFX1ZJU1VBTE9CSl9UZXh0OgotICAgICAgICBSZW5kZXJUZXh0KHN0YXRpY19jYXN0PElGREVfVGV4dFNldCo+KHBWaXN1YWxTZXQpLCBwUGllY2UpOwotICAgICAgICBpQ291bnQgKz0gNTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZERV9WSVNVQUxPQkpfQ2FudmFzOgotICAgICAgICBBU1NFUlQoZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoaUNvdW50ID49IDEwMCAmJiBwUGF1c2UgJiYgcFBhdXNlLT5OZWVkVG9QYXVzZU5vdygpKSB7Ci0gICAgICBlU3RhdHVzID0gRkRFX1JFTkRFUlNUQVRVU19QYXVzZWQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG1fZVN0YXR1cyA9IGVTdGF0dXM7Ci19Ci0KLXZvaWQgQ0ZERV9SZW5kZXJDb250ZXh0OjpTdG9wUmVuZGVyKCkgewotICBtX2VTdGF0dXMgPSBGREVfUkVOREVSU1RBVFVTX1Jlc2V0OwotICBtX3BSZW5kZXJEZXZpY2UgPSBudWxscHRyOwotICBtX1RyYW5zZm9ybS5TZXRJZGVudGl0eSgpOwotICBtX3BJdGVyYXRvci5yZXNldCgpOwotICBtX3BCcnVzaC5yZXNldCgpOwotICBtX0NoYXJQb3MuY2xlYXIoKTsKLX0KLQotdm9pZCBDRkRFX1JlbmRlckNvbnRleHQ6OlJlbmRlclRleHQoSUZERV9UZXh0U2V0KiBwVGV4dFNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZERV9URVhURURJVFBJRUNFKiBwVGV4dCkgewotICBBU1NFUlQobV9wUmVuZGVyRGV2aWNlKTsKLSAgQVNTRVJUKHBUZXh0U2V0ICYmIHBUZXh0KTsKLQotICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gcEZvbnQgPSBwVGV4dFNldC0+R2V0Rm9udCgpOwotICBpZiAoIXBGb250KQotICAgIHJldHVybjsKLQotICBpbnQzMl90IGlDb3VudCA9IHBUZXh0U2V0LT5HZXREaXNwbGF5UG9zKCpwVGV4dCwgbnVsbHB0ciwgZmFsc2UpOwotICBpZiAoaUNvdW50IDwgMSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKCFtX3BCcnVzaCkKLSAgICBtX3BCcnVzaCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRkRFX0JydXNoPigpOwotCi0gIGlmIChtX0NoYXJQb3Muc2l6ZSgpIDwgc3RhdGljX2Nhc3Q8c2l6ZV90PihpQ291bnQpKQotICAgIG1fQ2hhclBvcy5yZXNpemUoaUNvdW50LCBGWFRFWFRfQ0hBUlBPUygpKTsKLQotICBpQ291bnQgPSBwVGV4dFNldC0+R2V0RGlzcGxheVBvcygqcFRleHQsIG1fQ2hhclBvcy5kYXRhKCksIGZhbHNlKTsKLSAgRlhfRkxPQVQgZkZvbnRTaXplID0gcFRleHRTZXQtPkdldEZvbnRTaXplKCk7Ci0gIEZYX0FSR0IgZHdDb2xvciA9IHBUZXh0U2V0LT5HZXRGb250Q29sb3IoKTsKLSAgbV9wQnJ1c2gtPlNldENvbG9yKGR3Q29sb3IpOwotICBtX3BSZW5kZXJEZXZpY2UtPkRyYXdTdHJpbmcobV9wQnJ1c2guZ2V0KCksIHBGb250LCBtX0NoYXJQb3MuZGF0YSgpLCBpQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmRm9udFNpemUsICZtX1RyYW5zZm9ybSk7Ci19Ci0KZGlmZiAtLWdpdCBhL3hmYS9mZGUvZmRlX3JlbmRlci5oIGIveGZhL2ZkZS9mZGVfcmVuZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNGQ2YjUuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9mZGVfcmVuZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZERV9GREVfUkVOREVSX0hfCi0jZGVmaW5lIFhGQV9GREVfRkRFX1JFTkRFUl9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2ZkZV9nZWRldmljZS5oIgotI2luY2x1ZGUgInhmYS9mZGUvZmRlX2l0ZXJhdG9yLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9mZGVfdmlzdWFsc2V0LmgiCi0KLWNsYXNzIENGREVfUmVuZGVyRGV2aWNlOwotCi1lbnVtIEZERV9SRU5ERVJTVEFUVVMgewotICBGREVfUkVOREVSU1RBVFVTX1Jlc2V0ID0gMCwKLSAgRkRFX1JFTkRFUlNUQVRVU19QYXVzZWQsCi0gIEZERV9SRU5ERVJTVEFUVVNfRG9uZSwKLSAgRkRFX1JFTkRFUlNUQVRVU19GYWlsZWQsCi19OwotCi1jbGFzcyBDRkRFX1JlbmRlckNvbnRleHQgewotIHB1YmxpYzoKLSAgQ0ZERV9SZW5kZXJDb250ZXh0KCk7Ci0gIH5DRkRFX1JlbmRlckNvbnRleHQoKTsKLQotICBib29sIFN0YXJ0UmVuZGVyKENGREVfUmVuZGVyRGV2aWNlKiBwUmVuZGVyRGV2aWNlLAotICAgICAgICAgICAgICAgICAgIElGREVfQ2FudmFzU2V0KiBwQ2FudmFzU2V0LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIHRtRG9jMkRldmljZSk7Ci0gIEZERV9SRU5ERVJTVEFUVVMgR2V0U3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbV9lU3RhdHVzOyB9Ci0gIEZERV9SRU5ERVJTVEFUVVMgRG9SZW5kZXIoSUZYX1BhdXNlKiBwUGF1c2UgPSBudWxscHRyKTsKLSAgdm9pZCBTdG9wUmVuZGVyKCk7Ci0gIHZvaWQgUmVuZGVyVGV4dChJRkRFX1RleHRTZXQqIHBUZXh0U2V0LCBGREVfVEVYVEVESVRQSUVDRSogcFRleHQpOwotCi0gcHJvdGVjdGVkOgotICBGREVfUkVOREVSU1RBVFVTIG1fZVN0YXR1czsKLSAgQ0ZERV9SZW5kZXJEZXZpY2UqIG1fcFJlbmRlckRldmljZTsKLSAgQ0ZYX01hdHJpeCBtX1RyYW5zZm9ybTsKLSAgc3RkOjp2ZWN0b3I8RlhURVhUX0NIQVJQT1M+IG1fQ2hhclBvczsKLSAgc3RkOjp1bmlxdWVfcHRyPENGREVfQnJ1c2g+IG1fcEJydXNoOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZERV9WaXN1YWxTZXRJdGVyYXRvcj4gbV9wSXRlcmF0b3I7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GREVfRkRFX1JFTkRFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9mZGVfdmlzdWFsc2V0LmggYi94ZmEvZmRlL2ZkZV92aXN1YWxzZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNmMDJjZC4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL2ZkZV92aXN1YWxzZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRkRFX0ZERV9WSVNVQUxTRVRfSF8KLSNkZWZpbmUgWEZBX0ZERV9GREVfVklTVUFMU0VUX0hfCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgotI2luY2x1ZGUgInhmYS9mZGUvY2ZkZV9wYXRoLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9mZGVfb2JqZWN0LmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9jZmdhc19mb250bWdyLmgiCi0KLWNsYXNzIEZYVEVYVF9DSEFSUE9TOwotCi1lbnVtIEZERV9WSVNVQUxPQkpUWVBFIHsKLSAgRkRFX1ZJU1VBTE9CSl9DYW52YXMgPSAweDAwLAotICBGREVfVklTVUFMT0JKX1RleHQgPSAweDAxCi19OwotCi1zdHJ1Y3QgRkRFX1RFWFRFRElUUElFQ0UgewotICBGREVfVEVYVEVESVRQSUVDRSgpOwotICBGREVfVEVYVEVESVRQSUVDRShjb25zdCBGREVfVEVYVEVESVRQSUVDRSYgdGhhdCk7Ci0gIH5GREVfVEVYVEVESVRQSUVDRSgpOwotCi0gIGludDMyX3QgblN0YXJ0OwotICBpbnQzMl90IG5Db3VudDsKLSAgaW50MzJfdCBuQmlkaUxldmVsOwotICBDRlhfUmVjdEYgcnRQaWVjZTsKLSAgdWludDMyX3QgZHdDaGFyU3R5bGVzOwotfTsKLWlubGluZSBGREVfVEVYVEVESVRQSUVDRTo6RkRFX1RFWFRFRElUUElFQ0UoKSA9IGRlZmF1bHQ7Ci1pbmxpbmUgRkRFX1RFWFRFRElUUElFQ0U6OkZERV9URVhURURJVFBJRUNFKGNvbnN0IEZERV9URVhURURJVFBJRUNFJiB0aGF0KSA9Ci0gICAgZGVmYXVsdDsKLWlubGluZSBGREVfVEVYVEVESVRQSUVDRTo6fkZERV9URVhURURJVFBJRUNFKCkgPSBkZWZhdWx0OwotCi1jbGFzcyBJRkRFX1Zpc3VhbFNldCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5JRkRFX1Zpc3VhbFNldCgpIHt9Ci0gIHZpcnR1YWwgRkRFX1ZJU1VBTE9CSlRZUEUgR2V0VHlwZSgpID0gMDsKLSAgdmlydHVhbCBDRlhfUmVjdEYgR2V0UmVjdChjb25zdCBGREVfVEVYVEVESVRQSUVDRSYgaFZpc3VhbE9iaikgPSAwOwotfTsKLQotY2xhc3MgSUZERV9DYW52YXNTZXQgOiBwdWJsaWMgSUZERV9WaXN1YWxTZXQgewotIHB1YmxpYzoKLSAgdmlydHVhbCBGWF9QT1NJVElPTiBHZXRGaXJzdFBvc2l0aW9uKCkgPSAwOwotICB2aXJ0dWFsIEZERV9URVhURURJVFBJRUNFKiBHZXROZXh0KEZYX1BPU0lUSU9OJiBwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZERV9WaXN1YWxTZXQqJiBwVmlzdWFsU2V0KSA9IDA7Ci19OwotCi1jbGFzcyBJRkRFX1RleHRTZXQgOiBwdWJsaWMgSUZERV9WaXN1YWxTZXQgewotIHB1YmxpYzoKLSAgdmlydHVhbCBpbnQzMl90IEdldFN0cmluZyhGREVfVEVYVEVESVRQSUVDRSogaFRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgPSAwOwotICB2aXJ0dWFsIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBHZXRGb250KCkgPSAwOwotICB2aXJ0dWFsIEZYX0ZMT0FUIEdldEZvbnRTaXplKCkgPSAwOwotICB2aXJ0dWFsIEZYX0FSR0IgR2V0Rm9udENvbG9yKCkgPSAwOwotICB2aXJ0dWFsIGludDMyX3QgR2V0RGlzcGxheVBvcyhjb25zdCBGREVfVEVYVEVESVRQSUVDRSYgaFRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ2hhckNvZGUgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcqIHBXU0Zvcm1zID0gbnVsbHB0cikgPSAwOwotICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPENGWF9SZWN0Rj4gR2V0Q2hhclJlY3RzKGNvbnN0IEZERV9URVhURURJVFBJRUNFKiBoVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJib3gpID0gMDsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZERV9GREVfVklTVUFMU0VUX0hfCmRpZmYgLS1naXQgYS94ZmEvZmRlL2lmZGVfdHh0ZWR0ZG9yZWNvcmQuaCBiL3hmYS9mZGUvaWZkZV90eHRlZHRkb3JlY29yZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmE0MTAwLi4wMDAwMDAwCi0tLSBhL3hmYS9mZGUvaWZkZV90eHRlZHRkb3JlY29yZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GREVfSUZERV9UWFRFRFRET1JFQ09SRF9IXwotI2RlZmluZSBYRkFfRkRFX0lGREVfVFhURURURE9SRUNPUkRfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0KLWNsYXNzIElGREVfVHh0RWR0RG9SZWNvcmQgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+SUZERV9UeHRFZHREb1JlY29yZCgpIHt9Ci0KLSAgdmlydHVhbCBib29sIFJlZG8oKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBVbmRvKCkgY29uc3QgPSAwOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRkRFX0lGREVfVFhURURURE9SRUNPUkRfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZGUvaWZkZV90eHRlZHRlbmdpbmUuaCBiL3hmYS9mZGUvaWZkZV90eHRlZHRlbmdpbmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk0MGE4Yy4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL2lmZGVfdHh0ZWR0ZW5naW5lLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GREVfSUZERV9UWFRFRFRFTkdJTkVfSF8KLSNkZWZpbmUgWEZBX0ZERV9JRkRFX1RYVEVEVEVOR0lORV9IXwotCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2ZvbnQvY2ZnYXNfZm9udG1nci5oIgotCi1jbGFzcyBDRkRFX1R4dEVkdEVuZ2luZTsKLWNsYXNzIElGREVfVHh0RWR0UGFnZTsKLWNsYXNzIENGV0xfRWRpdDsKLQotI2RlZmluZSBGREVfVEVYVEVESVRNT0RFX011bHRpTGluZXMgKDFMIDw8IDApCi0jZGVmaW5lIEZERV9URVhURURJVE1PREVfQXV0b0xpbmVXcmFwICgxTCA8PCAxKQotI2RlZmluZSBGREVfVEVYVEVESVRNT0RFX1JlYWRPbmx5ICgxTCA8PCAyKQotI2RlZmluZSBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9WZXJ0ICgxTCA8PCAzKQotI2RlZmluZSBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9Ib3J6ICgxTCA8PCA0KQotI2RlZmluZSBGREVfVEVYVEVESVRNT0RFX1ZhbGlkYXRlICgxTCA8PCA4KQotI2RlZmluZSBGREVfVEVYVEVESVRNT0RFX1Bhc3N3b3JkICgxTCA8PCA5KQotCi0jZGVmaW5lIEZERV9URVhURURJVEFMSUdOX0xlZnQgMAotI2RlZmluZSBGREVfVEVYVEVESVRBTElHTl9DZW50ZXIgKDFMIDw8IDApCi0jZGVmaW5lIEZERV9URVhURURJVEFMSUdOX1JpZ2h0ICgyTCA8PCAwKQotI2RlZmluZSBGREVfVEVYVEVESVRBTElHTl9Ob3JtYWwgKDFMIDw8IDMpCi0jZGVmaW5lIEZERV9URVhURURJVEFMSUdOX0p1c3RpZmllZCAoMUwgPDwgNCkKLQotI2RlZmluZSBGREVfVEVYVEVESVRMQVlPVVRfQ29tYlRleHQgKDFMIDw8IDQpCi0jZGVmaW5lIEZERV9URVhURURJVExBWU9VVF9MYXN0TGluZUhlaWdodCAoMUwgPDwgOCkKLQotZW51bSBGREVfVFhURURUTU9WRUNBUkVUIHsKLSAgTUNfTW92ZU5vbmUgPSAwLAotICBNQ19MZWZ0LAotICBNQ19SaWdodCwKLSAgTUNfVXAsCi0gIE1DX0Rvd24sCi0gIE1DX1dvcmRCYWNrd2FyZCwKLSAgTUNfV29yZEZvcndhcmQsCi0gIE1DX0xpbmVTdGFydCwKLSAgTUNfTGluZUVuZCwKLSAgTUNfUGFyYWdTdGFydCwKLSAgTUNfUGFyYWdFbmQsCi0gIE1DX1BhZ2VVcCwKLSAgTUNfUGFnZURvd24sCi0gIE1DX0hvbWUsCi0gIE1DX0VuZCwKLX07Ci0KLWVudW0gRkRFX1RYVEVEVF9NT0RJRllfUkVUIHsKLSAgRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfVGFiID0gLTYsCi0gIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0xvY2tlZCA9IC01LAotICBGREVfVFhURURUX01PRElGWV9SRVRfRl9JbnZhbGlkYXRlID0gLTQsCi0gIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0JvdW5kYXJ5ID0gLTMsCi0gIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9GX0Z1bGwgPSAtMiwKLSAgRkRFX1RYVEVEVF9NT0RJRllfUkVUX0ZfTm9ybWFsID0gLTEsCi0gIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX05vcm1hbCA9IDAsCi0gIEZERV9UWFRFRFRfTU9ESUZZX1JFVF9TX0Z1bGwgPSAxLAotICBGREVfVFhURURUX01PRElGWV9SRVRfU19QYXJ0ID0gMiwKLSAgRkRFX1RYVEVEVF9NT0RJRllfUkVUX1NfRW1wdHkgPSAzLAotICBGREVfVFhURURUX01PRElGWV9SRVRfVF9UYWIgPSA0LAotfTsKLQotZW51bSBGREVfVFhURURJVF9MSU5FRU5EIHsKLSAgRkRFX1RYVEVESVRfTElORUVORF9BdXRvLAotICBGREVfVFhURURJVF9MSU5FRU5EX0NSTEYsCi0gIEZERV9UWFRFRElUX0xJTkVFTkRfQ1IsCi0gIEZERV9UWFRFRElUX0xJTkVFTkRfTEYsCi19OwotCi1zdHJ1Y3QgRkRFX1RYVEVEVFBBUkFNUyB7Ci0gIEZERV9UWFRFRFRQQVJBTVMoKTsKLSAgfkZERV9UWFRFRFRQQVJBTVMoKTsKLQotICBGWF9GTE9BVCBmUGxhdGVXaWR0aDsKLSAgRlhfRkxPQVQgZlBsYXRlSGVpZ2h0OwotICBpbnQzMl90IG5MaW5lQ291bnQ7Ci0gIHVpbnQzMl90IGR3TGF5b3V0U3R5bGVzOwotICB1aW50MzJfdCBkd0FsaWdubWVudDsKLSAgdWludDMyX3QgZHdNb2RlOwotICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gcEZvbnQ7Ci0gIEZYX0ZMT0FUIGZGb250U2l6ZTsKLSAgRlhfQVJHQiBkd0ZvbnRDb2xvcjsKLSAgRlhfRkxPQVQgZkxpbmVTcGFjZTsKLSAgRlhfRkxPQVQgZlRhYldpZHRoOwotICBib29sIGJUYWJFcXVpZGlzdGFudDsKLSAgRlhfV0NIQVIgd0RlZkNoYXI7Ci0gIEZYX1dDSEFSIHdMaW5lQnJlYWtDaGFyOwotICBpbnQzMl90IG5DaGFyUm90YXRpb247Ci0gIGludDMyX3QgbkxpbmVFbmQ7Ci0gIGludDMyX3QgbkhvcnpTY2FsZTsKLSAgRlhfRkxPQVQgZkNoYXJTcGFjZTsKLSAgQ0ZXTF9FZGl0KiBwRXZlbnRTaW5rOwotfTsKLQotZW51bSBGREVfVFhURURUX1RFWFRDSEFOR0VfVFlQRSB7Ci0gIEZERV9UWFRFRFRfVEVYVENIQU5HRV9UWVBFX0luc2VydCA9IDAsCi0gIEZERV9UWFRFRFRfVEVYVENIQU5HRV9UWVBFX0RlbGV0ZSwKLSAgRkRFX1RYVEVEVF9URVhUQ0hBTkdFX1RZUEVfUmVwbGFjZSwKLX07Ci0KLXN0cnVjdCBGREVfVFhURURUX1RFWFRDSEFOR0VfSU5GTyB7Ci0gIEZERV9UWFRFRFRfVEVYVENIQU5HRV9JTkZPKCk7Ci0gIH5GREVfVFhURURUX1RFWFRDSEFOR0VfSU5GTygpOwotCi0gIGludDMyX3QgbkNoYW5nZVR5cGU7Ci0gIENGWF9XaWRlU3RyaW5nIHdzSW5zZXJ0OwotICBDRlhfV2lkZVN0cmluZyB3c0RlbGV0ZTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NQcmV2VGV4dDsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZERV9JRkRFX1RYVEVEVEVOR0lORV9IXwpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9pZmRlX3R4dGVkdHBhZ2UuaCBiL3hmYS9mZGUvaWZkZV90eHRlZHRwYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYjM4OTcuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9pZmRlX3R4dGVkdHBhZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRkRFX0lGREVfVFhURURUUEFHRV9IXwotI2RlZmluZSBYRkFfRkRFX0lGREVfVFhURURUUEFHRV9IXwotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAieGZhL2ZkZS9mZGVfdmlzdWFsc2V0LmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvbGF5b3V0L2ZnYXNfdGV4dGJyZWFrLmgiCi0KLWNsYXNzIENGREVfVHh0RWR0RW5naW5lOwotCi1jbGFzcyBJRkRFX1R4dEVkdFBhZ2UgOiBwdWJsaWMgSUZERV9DYW52YXNTZXQsIHB1YmxpYyBJRlhfVHh0QWNjZXNzIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBJRkRFX1R4dEVkdFBhZ2UqIENyZWF0ZShDRkRFX1R4dEVkdEVuZ2luZSogcEVuZ2luZSwgaW50MzJfdCBuSW5kZXgpOwotICB+SUZERV9UeHRFZHRQYWdlKCkgb3ZlcnJpZGUge30KLQotICB2aXJ0dWFsIENGREVfVHh0RWR0RW5naW5lKiBHZXRFbmdpbmUoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgaW50MzJfdCBHZXRDaGFyUmVjdChpbnQzMl90IG5JbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkJCb3ggPSBmYWxzZSkgY29uc3QgPSAwOwotICB2aXJ0dWFsIGludDMyX3QgR2V0Q2hhckluZGV4KGNvbnN0IENGWF9Qb2ludEYmIGZQb2ludCwgYm9vbCYgYkJlZm9yZSkgPSAwOwotICB2aXJ0dWFsIHZvaWQgQ2FsY1JhbmdlUmVjdEFycmF5KGludDMyX3QgblN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENGWF9SZWN0Rj4qIFJlY3RGQXJyKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgaW50MzJfdCBTZWxlY3RXb3JkKGNvbnN0IENGWF9Qb2ludEYmIGZQb2ludCwgaW50MzJfdCYgbkNvdW50KSA9IDA7Ci0gIHZpcnR1YWwgaW50MzJfdCBHZXRDaGFyU3RhcnQoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgaW50MzJfdCBHZXRDaGFyQ291bnQoKSBjb25zdCA9IDA7Ci0KLSAgdmlydHVhbCBpbnQzMl90IEdldERpc3BsYXlQb3MoY29uc3QgQ0ZYX1JlY3RGJiBydENsaXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiYgcENoYXJQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiogcEJCb3gpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBib29sIElzTG9hZGVkKGNvbnN0IENGWF9SZWN0RiogcENsaXBCb3gpID0gMDsKLSAgdmlydHVhbCBpbnQzMl90IExvYWRQYWdlKGNvbnN0IENGWF9SZWN0RiogcENsaXBCb3gsIElGWF9QYXVzZSogcFBhdXNlKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBVbmxvYWRQYWdlKGNvbnN0IENGWF9SZWN0RiogcENsaXBCb3gpID0gMDsKLSAgdmlydHVhbCBjb25zdCBDRlhfUmVjdEYmIEdldENvbnRlbnRzQm94KCkgPSAwOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRkRFX0lGREVfVFhURURUUEFHRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2ZkZS9pZnhfY2hhcml0ZXIuaCBiL3hmYS9mZGUvaWZ4X2NoYXJpdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NjdlZmQuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS9pZnhfY2hhcml0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRkRFX0lGWF9DSEFSSVRFUl9IXwotI2RlZmluZSBYRkFfRkRFX0lGWF9DSEFSSVRFUl9IXwotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLQotY2xhc3MgSUZYX0NoYXJJdGVyIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfklGWF9DaGFySXRlcigpIHt9Ci0KLSAgdmlydHVhbCBib29sIE5leHQoYm9vbCBiUHJldiA9IGZhbHNlKSA9IDA7Ci0gIHZpcnR1YWwgRlhfV0NIQVIgR2V0Q2hhcigpID0gMDsKLSAgdmlydHVhbCB2b2lkIFNldEF0KGludDMyX3QgbkluZGV4KSA9IDA7Ci0gIHZpcnR1YWwgaW50MzJfdCBHZXRBdCgpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBib29sIElzRU9GKGJvb2wgYlRhaWwgPSB0cnVlKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgSUZYX0NoYXJJdGVyKiBDbG9uZSgpID0gMDsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZERV9JRlhfQ0hBUklURVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZGUvdHRvL2ZkZV90ZXh0b3V0LmNwcCBiL3hmYS9mZGUvdHRvL2ZkZV90ZXh0b3V0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIxODc2Yi4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL3R0by9mZGVfdGV4dG91dC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NzYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZkZS90dG8vZmRlX3RleHRvdXQuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jZmRlX3BhdGguaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2ZkZV9nZWRldmljZS5oIgotI2luY2x1ZGUgInhmYS9mZGUvZmRlX29iamVjdC5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2NydC9mZ2FzX3V0aWxzLmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvbGF5b3V0L2ZnYXNfdGV4dGJyZWFrLmgiCi0KLUZERV9UVE9QSUVDRTo6RkRFX1RUT1BJRUNFKCkgPSBkZWZhdWx0OwotRkRFX1RUT1BJRUNFOjpGREVfVFRPUElFQ0UoY29uc3QgRkRFX1RUT1BJRUNFJiB0aGF0KSA9IGRlZmF1bHQ7Ci1GREVfVFRPUElFQ0U6On5GREVfVFRPUElFQ0UoKSA9IGRlZmF1bHQ7Ci0KLUNGREVfVGV4dE91dDo6Q0ZERV9UZXh0T3V0KCkKLSAgICA6IG1fcFR4dEJyZWFrKG5ldyBDRlhfVHh0QnJlYWsoRlhfVFhUQlJFQUtQT0xJQ1lfTm9uZSkpLAotICAgICAgbV9wRm9udChudWxscHRyKSwKLSAgICAgIG1fZkZvbnRTaXplKDEyLjBmKSwKLSAgICAgIG1fZkxpbmVTcGFjZShtX2ZGb250U2l6ZSksCi0gICAgICBtX2ZMaW5lUG9zKDAuMGYpLAotICAgICAgbV9mVG9sZXJhbmNlKDAuMGYpLAotICAgICAgbV9pQWxpZ25tZW50KDApLAotICAgICAgbV9pVHh0QmtBbGlnbm1lbnQoMCksCi0gICAgICBtX3dQYXJhZ3JhcGhCa0NoYXIoTCdcbicpLAotICAgICAgbV9UeHRDb2xvcigweEZGMDAwMDAwKSwKLSAgICAgIG1fZHdTdHlsZXMoMCksCi0gICAgICBtX2R3VHh0QmtTdHlsZXMoMCksCi0gICAgICBtX2JFbGxpQ2hhbmdlZChmYWxzZSksCi0gICAgICBtX2lFbGxpcHNpc1dpZHRoKDApLAotICAgICAgbV90dG9MaW5lcyg1KSwKLSAgICAgIG1faUN1ckxpbmUoMCksCi0gICAgICBtX2lDdXJQaWVjZSgwKSwKLSAgICAgIG1faVRvdGFsTGluZXMoMCkgewotICBtX01hdHJpeC5TZXRJZGVudGl0eSgpOwotICBtX3J0Q2xpcC5SZXNldCgpOwotICBtX3J0TG9naWNDbGlwLlJlc2V0KCk7Ci19Ci0KLUNGREVfVGV4dE91dDo6fkNGREVfVGV4dE91dCgpIHt9Ci0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRGb250KGNvbnN0IENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiYgcEZvbnQpIHsKLSAgQVNTRVJUKHBGb250KTsKLSAgbV9wRm9udCA9IHBGb250OwotICBtX3BUeHRCcmVhay0+U2V0Rm9udChwRm9udCk7Ci19Ci0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpIHsKLSAgQVNTRVJUKGZGb250U2l6ZSA+IDApOwotICBtX2ZGb250U2l6ZSA9IGZGb250U2l6ZTsKLSAgbV9wVHh0QnJlYWstPlNldEZvbnRTaXplKGZGb250U2l6ZSk7Ci19Ci0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRUZXh0Q29sb3IoRlhfQVJHQiBjb2xvcikgewotICBtX1R4dENvbG9yID0gY29sb3I7Ci19Ci0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRTdHlsZXModWludDMyX3QgZHdTdHlsZXMpIHsKLSAgbV9kd1N0eWxlcyA9IGR3U3R5bGVzOwotICBtX2R3VHh0QmtTdHlsZXMgPSAwOwotICBpZiAoZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfU2luZ2xlTGluZSkgewotICAgIG1fZHdUeHRCa1N0eWxlcyB8PSBGWF9UWFRMQVlPVVRTVFlMRV9TaW5nbGVMaW5lOwotICB9Ci0gIGlmIChkd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9FeHBhbmRUYWIpIHsKLSAgICBtX2R3VHh0QmtTdHlsZXMgfD0gRlhfVFhUTEFZT1VUU1RZTEVfRXhwYW5kVGFiOwotICB9Ci0gIGlmIChkd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9BcmFiaWNTaGFwZXMpIHsKLSAgICBtX2R3VHh0QmtTdHlsZXMgfD0gRlhfVFhUTEFZT1VUU1RZTEVfQXJhYmljU2hhcGVzOwotICB9Ci0gIGlmIChkd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9BcmFiaWNDb250ZXh0KSB7Ci0gICAgbV9kd1R4dEJrU3R5bGVzIHw9IEZYX1RYVExBWU9VVFNUWUxFX0FyYWJpY0NvbnRleHQ7Ci0gIH0KLSAgaWYgKGR3U3R5bGVzICYgRkRFX1RUT1NUWUxFX1ZlcnRpY2FsTGF5b3V0KSB7Ci0gICAgbV9kd1R4dEJrU3R5bGVzIHw9Ci0gICAgICAgIChGWF9UWFRMQVlPVVRTVFlMRV9WZXJ0aWNhbENoYXJzIHwgRlhfVFhUTEFZT1VUU1RZTEVfVmVydGljYWxMYXlvdXQpOwotICB9Ci0gIG1fcFR4dEJyZWFrLT5TZXRMYXlvdXRTdHlsZXMobV9kd1R4dEJrU3R5bGVzKTsKLX0KLQotdm9pZCBDRkRFX1RleHRPdXQ6OlNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCkgewotICBBU1NFUlQoZlRhYldpZHRoID4gMS4wZik7Ci0gIG1fcFR4dEJyZWFrLT5TZXRUYWJXaWR0aChmVGFiV2lkdGgsIGZhbHNlKTsKLX0KLQotdm9pZCBDRkRFX1RleHRPdXQ6OlNldEVsbGlwc2lzU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0VsbGlwc2lzKSB7Ci0gIG1fYkVsbGlDaGFuZ2VkID0gdHJ1ZTsKLSAgbV93c0VsbGlwc2lzID0gd3NFbGxpcHNpczsKLX0KLQotdm9pZCBDRkRFX1RleHRPdXQ6OlNldFBhcmFncmFwaEJyZWFrQ2hhcihGWF9XQ0hBUiB3Y2gpIHsKLSAgbV93UGFyYWdyYXBoQmtDaGFyID0gd2NoOwotICBtX3BUeHRCcmVhay0+U2V0UGFyYWdyYXBoQnJlYWtDaGFyKHdjaCk7Ci19Ci0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRBbGlnbm1lbnQoaW50MzJfdCBpQWxpZ25tZW50KSB7Ci0gIG1faUFsaWdubWVudCA9IGlBbGlnbm1lbnQ7Ci0gIHN3aXRjaCAobV9pQWxpZ25tZW50KSB7Ci0gICAgY2FzZSBGREVfVFRPQUxJR05NRU5UX1RvcENlbnRlcjoKLSAgICBjYXNlIEZERV9UVE9BTElHTk1FTlRfQ2VudGVyOgotICAgIGNhc2UgRkRFX1RUT0FMSUdOTUVOVF9Cb3R0b21DZW50ZXI6Ci0gICAgICBtX2lUeHRCa0FsaWdubWVudCA9IEZYX1RYVExJTkVBTElHTk1FTlRfQ2VudGVyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGREVfVFRPQUxJR05NRU5UX1RvcFJpZ2h0OgotICAgIGNhc2UgRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXJSaWdodDoKLSAgICBjYXNlIEZERV9UVE9BTElHTk1FTlRfQm90dG9tUmlnaHQ6Ci0gICAgICBtX2lUeHRCa0FsaWdubWVudCA9IEZYX1RYVExJTkVBTElHTk1FTlRfUmlnaHQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgbV9pVHh0QmtBbGlnbm1lbnQgPSBGWF9UWFRMSU5FQUxJR05NRU5UX0xlZnQ7Ci0gICAgICBicmVhazsKLSAgfQotICBtX3BUeHRCcmVhay0+U2V0QWxpZ25tZW50KG1faVR4dEJrQWxpZ25tZW50KTsKLX0KLQotdm9pZCBDRkRFX1RleHRPdXQ6OlNldExpbmVTcGFjZShGWF9GTE9BVCBmTGluZVNwYWNlKSB7Ci0gIEFTU0VSVChmTGluZVNwYWNlID4gMS4wZik7Ci0gIG1fZkxpbmVTcGFjZSA9IGZMaW5lU3BhY2U7Ci19Ci0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRESUJpdG1hcChDRlhfRElCaXRtYXAqIHBESUIpIHsKLSAgQVNTRVJUKHBESUIpOwotCi0gIG1fcFJlbmRlckRldmljZS5yZXNldCgpOwotICBDRlhfRnhnZURldmljZSogZGV2aWNlID0gbmV3IENGWF9GeGdlRGV2aWNlOwotICBkZXZpY2UtPkF0dGFjaChwRElCLCBmYWxzZSwgbnVsbHB0ciwgZmFsc2UpOwotICBtX3BSZW5kZXJEZXZpY2UgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZERV9SZW5kZXJEZXZpY2U+KGRldmljZSwgZmFsc2UpOwotfQotCi12b2lkIENGREVfVGV4dE91dDo6U2V0UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UpIHsKLSAgQVNTRVJUKHBEZXZpY2UpOwotICBtX3BSZW5kZXJEZXZpY2UgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZERV9SZW5kZXJEZXZpY2U+KHBEZXZpY2UsIGZhbHNlKTsKLX0KLQotdm9pZCBDRkRFX1RleHRPdXQ6OlNldENsaXBSZWN0KGNvbnN0IENGWF9SZWN0JiBydENsaXApIHsKLSAgbV9ydENsaXAgPSBydENsaXAuQXM8RlhfRkxPQVQ+KCk7Ci19Ci0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRDbGlwUmVjdChjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCkgewotICBtX3J0Q2xpcCA9IHJ0Q2xpcDsKLX0KLQotdm9pZCBDRkRFX1RleHRPdXQ6OlNldExvZ2ljQ2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiBydENsaXApIHsKLSAgbV9ydExvZ2ljQ2xpcCA9IHJ0Q2xpcDsKLX0KLQotdm9pZCBDRkRFX1RleHRPdXQ6OlNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKLSAgbV9NYXRyaXggPSBtYXRyaXg7Ci19Ci0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpTZXRMaW5lQnJlYWtUb2xlcmFuY2UoRlhfRkxPQVQgZlRvbGVyYW5jZSkgewotICBtX2ZUb2xlcmFuY2UgPSBmVG9sZXJhbmNlOwotICBtX3BUeHRCcmVhay0+U2V0TGluZUJyZWFrVG9sZXJhbmNlKG1fZlRvbGVyYW5jZSk7Ci19Ci0KLWludDMyX3QgQ0ZERV9UZXh0T3V0OjpHZXRUb3RhbExpbmVzKCkgewotICByZXR1cm4gbV9pVG90YWxMaW5lczsKLX0KLQotdm9pZCBDRkRFX1RleHRPdXQ6OkNhbGNMb2dpY1NpemUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9TaXplRiYgc2l6ZSkgewotICBDRlhfUmVjdEYgcnRUZXh0KDAuMGYsIDAuMGYsIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KTsKLSAgQ2FsY0xvZ2ljU2l6ZShwd3NTdHIsIGlMZW5ndGgsIHJ0VGV4dCk7Ci0gIHNpemUgPSBydFRleHQuU2l6ZSgpOwotfQotCi12b2lkIENGREVfVGV4dE91dDo6Q2FsY0xvZ2ljU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiByZWN0KSB7Ci0gIGlmICghcHdzU3RyIHx8IGlMZW5ndGggPCAxKSB7Ci0gICAgcmVjdC53aWR0aCA9IDAuMGY7Ci0gICAgcmVjdC5oZWlnaHQgPSAwLjBmOwotICB9IGVsc2UgewotICAgIENhbGNUZXh0U2l6ZShwd3NTdHIsIGlMZW5ndGgsIHJlY3QpOwotICB9Ci19Ci0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpDYWxjVGV4dFNpemUoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJlY3QpIHsKLSAgQVNTRVJUKG1fcEZvbnQgJiYgbV9mRm9udFNpemUgPj0gMS4wZik7Ci0gIFNldExpbmVXaWR0aChyZWN0KTsKLSAgbV9pVG90YWxMaW5lcyA9IDA7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwU3RyID0gcHdzU3RyOwotICBib29sIGJIb3RLZXkgPSAhIShtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0hvdEtleSk7Ci0gIGJvb2wgYlZlcnRpY2FsID0gISEobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9WZXJ0aWNhbExheW91dCk7Ci0gIEZYX0ZMT0FUIGZXaWR0aCA9IDAuMGY7Ci0gIEZYX0ZMT0FUIGZIZWlnaHQgPSAwLjBmOwotICBGWF9GTE9BVCBmU3RhcnRQb3MgPSBiVmVydGljYWwgPyByZWN0LmJvdHRvbSgpIDogcmVjdC5yaWdodCgpOwotICB1aW50MzJfdCBkd0JyZWFrU3RhdHVzID0gMDsKLSAgRlhfV0NIQVIgd1ByZUNoYXIgPSAwOwotICBGWF9XQ0hBUiB3Y2g7Ci0gIEZYX1dDSEFSIHdCcmVhayA9IDA7Ci0gIHdoaWxlIChpTGVuZ3RoLS0gPiAwKSB7Ci0gICAgd2NoID0gKnBTdHIrKzsKLSAgICBpZiAod0JyZWFrID09IDAgJiYgKHdjaCA9PSBMJ1xuJyB8fCB3Y2ggPT0gTCdccicpKSB7Ci0gICAgICB3QnJlYWsgPSB3Y2g7Ci0gICAgICBtX3BUeHRCcmVhay0+U2V0UGFyYWdyYXBoQnJlYWtDaGFyKHdjaCk7Ci0gICAgfQotICAgIGlmIChiSG90S2V5ICYmIHdjaCA9PSBMJyYnICYmIHdQcmVDaGFyICE9IEwnJicpIHsKLSAgICAgIHdQcmVDaGFyID0gd2NoOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGR3QnJlYWtTdGF0dXMgPSBtX3BUeHRCcmVhay0+QXBwZW5kQ2hhcih3Y2gpOwotICAgIGlmIChkd0JyZWFrU3RhdHVzID4gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgewotICAgICAgUmV0cmlldmVMaW5lV2lkdGgoZHdCcmVha1N0YXR1cywgZlN0YXJ0UG9zLCBmV2lkdGgsIGZIZWlnaHQpOwotICAgIH0KLSAgICB3UHJlQ2hhciA9IDA7Ci0gIH0KLSAgZHdCcmVha1N0YXR1cyA9IG1fcFR4dEJyZWFrLT5FbmRCcmVhayhGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhayk7Ci0gIGlmIChkd0JyZWFrU3RhdHVzID4gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgewotICAgIFJldHJpZXZlTGluZVdpZHRoKGR3QnJlYWtTdGF0dXMsIGZTdGFydFBvcywgZldpZHRoLCBmSGVpZ2h0KTsKLSAgfQotICBtX3BUeHRCcmVhay0+UmVzZXQoKTsKLSAgRlhfRkxPQVQgZkluYyA9IHJlY3QuSGVpZ2h0KCkgLSBmSGVpZ2h0OwotICBpZiAoYlZlcnRpY2FsKSB7Ci0gICAgZkluYyA9IHJlY3QuV2lkdGgoKSAtIGZIZWlnaHQ7Ci0gIH0KLSAgaWYgKG1faUFsaWdubWVudCA+PSBGREVfVFRPQUxJR05NRU5UX0NlbnRlckxlZnQgJiYKLSAgICAgIG1faUFsaWdubWVudCA8IEZERV9UVE9BTElHTk1FTlRfQm90dG9tTGVmdCkgewotICAgIGZJbmMgLz0gMi4wZjsKLSAgfSBlbHNlIGlmIChtX2lBbGlnbm1lbnQgPCBGREVfVFRPQUxJR05NRU5UX0NlbnRlckxlZnQpIHsKLSAgICBmSW5jID0gMC4wZjsKLSAgfQotICBpZiAoYlZlcnRpY2FsKSB7Ci0gICAgcmVjdC50b3AgKz0gZlN0YXJ0UG9zOwotICAgIHJlY3QubGVmdCArPSBmSW5jOwotICAgIHJlY3Qud2lkdGggPSBmSGVpZ2h0OwotICAgIHJlY3QuaGVpZ2h0ID0gc3RkOjptaW4oZldpZHRoLCByZWN0LkhlaWdodCgpKTsKLSAgfSBlbHNlIHsKLSAgICByZWN0LmxlZnQgKz0gZlN0YXJ0UG9zOwotICAgIHJlY3QudG9wICs9IGZJbmM7Ci0gICAgcmVjdC53aWR0aCA9IHN0ZDo6bWluKGZXaWR0aCwgcmVjdC5XaWR0aCgpKTsKLSAgICByZWN0LmhlaWdodCA9IGZIZWlnaHQ7Ci0gICAgaWYgKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfTGFzdExpbmVIZWlnaHQpIHsKLSAgICAgIHJlY3QuaGVpZ2h0IC09IG1fZkxpbmVTcGFjZSAtIG1fZkZvbnRTaXplOwotICAgIH0KLSAgfQotfQotCi12b2lkIENGREVfVGV4dE91dDo6U2V0TGluZVdpZHRoKENGWF9SZWN0RiYgcmVjdCkgewotICBpZiAoKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfU2luZ2xlTGluZSkgPT0gMCkgewotICAgIEZYX0ZMT0FUIGZMaW5lV2lkdGggPSAwLjBmOwotICAgIGlmIChtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX1ZlcnRpY2FsTGF5b3V0KSB7Ci0gICAgICBpZiAocmVjdC5IZWlnaHQoKSA8IDEuMGYpIHsKLSAgICAgICAgcmVjdC5oZWlnaHQgPSBtX2ZGb250U2l6ZSAqIDEwMDAuMGY7Ci0gICAgICB9Ci0gICAgICBmTGluZVdpZHRoID0gcmVjdC5IZWlnaHQoKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKHJlY3QuV2lkdGgoKSA8IDEuMGYpIHsKLSAgICAgICAgcmVjdC53aWR0aCA9IG1fZkZvbnRTaXplICogMTAwMC4wZjsKLSAgICAgIH0KLSAgICAgIGZMaW5lV2lkdGggPSByZWN0LldpZHRoKCk7Ci0gICAgfQotICAgIG1fcFR4dEJyZWFrLT5TZXRMaW5lV2lkdGgoZkxpbmVXaWR0aCk7Ci0gIH0KLX0KLQotYm9vbCBDRkRFX1RleHRPdXQ6OlJldHJpZXZlTGluZVdpZHRoKHVpbnQzMl90IGR3QnJlYWtTdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZTdGFydFBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmSGVpZ2h0KSB7Ci0gIGlmIChkd0JyZWFrU3RhdHVzIDw9IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRlhfRkxPQVQgZkxpbmVTdGVwID0KLSAgICAgIChtX2ZMaW5lU3BhY2UgPiBtX2ZGb250U2l6ZSkgPyBtX2ZMaW5lU3BhY2UgOiBtX2ZGb250U2l6ZTsKLSAgYm9vbCBiTGluZVdyYXAgPSAhIShtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0xpbmVXcmFwKTsKLSAgRlhfRkxPQVQgZkxpbmVXaWR0aCA9IDAuMGY7Ci0gIGludDMyX3QgaUNvdW50ID0gbV9wVHh0QnJlYWstPkNvdW50QnJlYWtQaWVjZXMoKTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKLSAgICBjb25zdCBDRlhfVHh0UGllY2UqIHBQaWVjZSA9IG1fcFR4dEJyZWFrLT5HZXRCcmVha1BpZWNlKGkpOwotICAgIGZMaW5lV2lkdGggKz0gKEZYX0ZMT0FUKXBQaWVjZS0+bV9pV2lkdGggLyAyMDAwMC4wZjsKLSAgICBmU3RhcnRQb3MgPSBzdGQ6Om1pbihmU3RhcnRQb3MsIChGWF9GTE9BVClwUGllY2UtPm1faVN0YXJ0UG9zIC8gMjAwMDAuMGYpOwotICB9Ci0gIG1fcFR4dEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7Ci0gIGlmIChkd0JyZWFrU3RhdHVzID09IEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKSB7Ci0gICAgbV9wVHh0QnJlYWstPlJlc2V0KCk7Ci0gIH0KLSAgaWYgKCFiTGluZVdyYXAgJiYgZHdCcmVha1N0YXR1cyA9PSBGWF9UWFRCUkVBS19MaW5lQnJlYWspIHsKLSAgICBmV2lkdGggKz0gZkxpbmVXaWR0aDsKLSAgfSBlbHNlIHsKLSAgICBmV2lkdGggPSBzdGQ6Om1heChmV2lkdGgsIGZMaW5lV2lkdGgpOwotICAgIGZIZWlnaHQgKz0gZkxpbmVTdGVwOwotICB9Ci0gIG1faVRvdGFsTGluZXMrKzsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpEcmF3VGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5KSB7Ci0gIENGWF9SZWN0RiBydFRleHQoc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHgpLCBzdGF0aWNfY2FzdDxGWF9GTE9BVD4oeSksCi0gICAgICAgICAgICAgICAgICAgbV9mRm9udFNpemUgKiAxMDAwLjBmLCBtX2ZGb250U2l6ZSAqIDEwMDAuMGYpOwotICBEcmF3VGV4dChwd3NTdHIsIGlMZW5ndGgsIHJ0VGV4dCk7Ci19Ci0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpEcmF3VGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkpIHsKLSAgRHJhd1RleHQocHdzU3RyLCBpTGVuZ3RoLAotICAgICAgICAgICBDRlhfUmVjdEYoeCwgeSwgbV9mRm9udFNpemUgKiAxMDAwLjBmLCBtX2ZGb250U2l6ZSAqIDEwMDAuMGYpKTsKLX0KLQotdm9pZCBDRkRFX1RleHRPdXQ6OkRyYXdUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0JiByZWN0KSB7Ci0gIERyYXdUZXh0KHB3c1N0ciwgaUxlbmd0aCwgcmVjdC5BczxGWF9GTE9BVD4oKSk7Ci19Ci0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpEcmF3VGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsKLSAgQ0ZYX1JlY3RGIHJ0VGV4dChyZWN0LmxlZnQsIHJlY3QudG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0gIENGWF9NYXRyaXggcm07Ci0gIHJtLlNldFJldmVyc2UobV9NYXRyaXgpOwotICBybS5UcmFuc2Zvcm1SZWN0KHJ0VGV4dCk7Ci0gIERyYXdUZXh0KHB3c1N0ciwgaUxlbmd0aCwgcnRUZXh0LCBtX3J0Q2xpcCk7Ci19Ci0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpEcmF3TG9naWNUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeSkgewotICBDRlhfUmVjdEYgcnRUZXh0KHgsIHksIG1fZkZvbnRTaXplICogMTAwMC4wZiwgbV9mRm9udFNpemUgKiAxMDAwLjBmKTsKLSAgRHJhd0xvZ2ljVGV4dChwd3NTdHIsIGlMZW5ndGgsIHJ0VGV4dCk7Ci19Ci0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpEcmF3TG9naWNUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsKLSAgQ0ZYX1JlY3RGIHJ0Q2xpcChtX3J0TG9naWNDbGlwLmxlZnQsIG1fcnRMb2dpY0NsaXAudG9wLCBtX3J0TG9naWNDbGlwLndpZHRoLAotICAgICAgICAgICAgICAgICAgIG1fcnRMb2dpY0NsaXAuaGVpZ2h0KTsKLSAgbV9NYXRyaXguVHJhbnNmb3JtUmVjdChydENsaXApOwotICBEcmF3VGV4dChwd3NTdHIsIGlMZW5ndGgsIHJlY3QsIHJ0Q2xpcCk7Ci19Ci0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpEcmF3VGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydENsaXApIHsKLSAgQVNTRVJUKG1fcEZvbnQgJiYgbV9mRm9udFNpemUgPj0gMS4wZik7Ci0gIGlmICghcHdzU3RyIHx8IGlMZW5ndGggPCAxKQotICAgIHJldHVybjsKLQotICBpZiAocmVjdC53aWR0aCA8IG1fZkZvbnRTaXplIHx8IHJlY3QuaGVpZ2h0IDwgbV9mRm9udFNpemUpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgRlhfRkxPQVQgZkxpbmVXaWR0aCA9IHJlY3Qud2lkdGg7Ci0gIGlmIChtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX1ZlcnRpY2FsTGF5b3V0KSB7Ci0gICAgZkxpbmVXaWR0aCA9IHJlY3QuaGVpZ2h0OwotICB9Ci0gIG1fcFR4dEJyZWFrLT5TZXRMaW5lV2lkdGgoZkxpbmVXaWR0aCk7Ci0gIG1fdHRvTGluZXMuY2xlYXIoKTsKLSAgbV93c1RleHQuY2xlYXIoKTsKLSAgTG9hZFRleHQocHdzU3RyLCBpTGVuZ3RoLCByZWN0KTsKLSAgaWYgKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfRWxsaXBzaXMpIHsKLSAgICBSZXBsYWNlV2lkdGhFbGxpcHNpcygpOwotICB9Ci0gIFJlbG9hZChyZWN0KTsKLSAgRG9BbGlnbm1lbnQocmVjdCk7Ci0gIE9uRHJhdyhydENsaXApOwotfQotCi12b2lkIENGREVfVGV4dE91dDo6RXhwYW5kQnVmZmVyKGludDMyX3QgaVNpemUsIGludDMyX3QgaVR5cGUpIHsKLSAgQVNTRVJUKGlTaXplID49IDApOwotICBzaXplX3Qgc2l6ZSA9IGlTaXplOwotICBzd2l0Y2ggKGlUeXBlKSB7Ci0gICAgY2FzZSAwOgotICAgICAgaWYgKG1fQ2hhcldpZHRocy5zaXplKCkgPCBzaXplKQotICAgICAgICBtX0NoYXJXaWR0aHMucmVzaXplKHNpemUsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgaWYgKG1fRWxsQ2hhcldpZHRocy5zaXplKCkgPCBzaXplKQotICAgICAgICBtX0VsbENoYXJXaWR0aHMucmVzaXplKHNpemUsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaWYgKG1fQ2hhclBvcy5zaXplKCkgPCBzaXplKQotICAgICAgICBtX0NoYXJQb3MucmVzaXplKHNpemUsIEZYVEVYVF9DSEFSUE9TKCkpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBDRkRFX1RleHRPdXQ6OkxvYWRFbGxpcHNpcygpIHsKLSAgaWYgKCFtX2JFbGxpQ2hhbmdlZCkgewotICAgIHJldHVybjsKLSAgfQotICBtX2JFbGxpQ2hhbmdlZCA9IGZhbHNlOwotICBtX2lFbGxpcHNpc1dpZHRoID0gMDsKLSAgaW50MzJfdCBpTGVuZ3RoID0gbV93c0VsbGlwc2lzLkdldExlbmd0aCgpOwotICBpZiAoaUxlbmd0aCA8IDEpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgRXhwYW5kQnVmZmVyKGlMZW5ndGgsIDEpOwotICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IG1fd3NFbGxpcHNpcy5jX3N0cigpOwotICB1aW50MzJfdCBkd0JyZWFrU3RhdHVzOwotICBGWF9XQ0hBUiB3Y2g7Ci0gIHdoaWxlIChpTGVuZ3RoLS0gPiAwKSB7Ci0gICAgd2NoID0gKnBTdHIrKzsKLSAgICBkd0JyZWFrU3RhdHVzID0gbV9wVHh0QnJlYWstPkFwcGVuZENoYXIod2NoKTsKLSAgICBpZiAoZHdCcmVha1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspCi0gICAgICBSZXRyaWV2ZUVsbFBpZWNlcygmbV9FbGxDaGFyV2lkdGhzKTsKLSAgfQotICBkd0JyZWFrU3RhdHVzID0gbV9wVHh0QnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsKLSAgaWYgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKQotICAgIFJldHJpZXZlRWxsUGllY2VzKCZtX0VsbENoYXJXaWR0aHMpOwotICBtX3BUeHRCcmVhay0+UmVzZXQoKTsKLX0KLQotdm9pZCBDRkRFX1RleHRPdXQ6OlJldHJpZXZlRWxsUGllY2VzKHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBwQ2hhcldpZHRocykgewotICBpbnQzMl90IGlDb3VudCA9IG1fcFR4dEJyZWFrLT5Db3VudEJyZWFrUGllY2VzKCk7Ci0gIGludDMyX3QgaUNoYXJJbmRleCA9IDA7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7Ci0gICAgY29uc3QgQ0ZYX1R4dFBpZWNlKiBwUGllY2UgPSBtX3BUeHRCcmVhay0+R2V0QnJlYWtQaWVjZShpKTsKLSAgICBpbnQzMl90IGlQaWVjZUNoYXJzID0gcFBpZWNlLT5HZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpUGllY2VDaGFyczsgaisrKSB7Ci0gICAgICBDRlhfQ2hhciogcFRDID0gcFBpZWNlLT5HZXRDaGFyUHRyKGopOwotICAgICAgKCpwQ2hhcldpZHRocylbaUNoYXJJbmRleF0gPSBzdGQ6Om1heChwVEMtPm1faUNoYXJXaWR0aCwgMCk7Ci0gICAgICBtX2lFbGxpcHNpc1dpZHRoICs9ICgqcENoYXJXaWR0aHMpW2lDaGFySW5kZXhdOwotICAgICAgaUNoYXJJbmRleCsrOwotICAgIH0KLSAgfQotICBtX3BUeHRCcmVhay0+Q2xlYXJCcmVha1BpZWNlcygpOwotfQotCi12b2lkIENGREVfVGV4dE91dDo6TG9hZFRleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7Ci0gIEZYX1dDSEFSKiBwU3RyID0gbV93c1RleHQuR2V0QnVmZmVyKGlMZW5ndGgpOwotICBpbnQzMl90IGlUeHRMZW5ndGggPSBpTGVuZ3RoOwotICBFeHBhbmRCdWZmZXIoaVR4dExlbmd0aCwgMCk7Ci0gIGJvb2wgYkhvdEtleSA9ICEhKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfSG90S2V5KTsKLSAgYm9vbCBiVmVydGljYWwgPSAhIShtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX1ZlcnRpY2FsTGF5b3V0KTsKLSAgYm9vbCBiTGluZVdyYXAgPSAhIShtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0xpbmVXcmFwKTsKLSAgRlhfRkxPQVQgZkxpbmVTdGVwID0KLSAgICAgIChtX2ZMaW5lU3BhY2UgPiBtX2ZGb250U2l6ZSkgPyBtX2ZMaW5lU3BhY2UgOiBtX2ZGb250U2l6ZTsKLSAgRlhfRkxPQVQgZkxpbmVTdG9wID0gYlZlcnRpY2FsID8gcmVjdC5sZWZ0IDogcmVjdC5ib3R0b20oKTsKLSAgbV9mTGluZVBvcyA9IGJWZXJ0aWNhbCA/IHJlY3QucmlnaHQoKSA6IHJlY3QudG9wOwotICBpZiAoYlZlcnRpY2FsKSB7Ci0gICAgZkxpbmVTdGVwID0gLWZMaW5lU3RlcDsKLSAgfQotICBtX2hvdEtleXMuUmVtb3ZlQWxsKCk7Ci0gIGludDMyX3QgaVN0YXJ0Q2hhciA9IDA7Ci0gIGludDMyX3QgaUNoYXJzID0gMDsKLSAgaW50MzJfdCBpUGllY2VXaWR0aHMgPSAwOwotICB1aW50MzJfdCBkd0JyZWFrU3RhdHVzOwotICBGWF9XQ0hBUiB3Y2g7Ci0gIGJvb2wgYlJldCA9IGZhbHNlOwotICB3aGlsZSAoaVR4dExlbmd0aC0tID4gMCkgewotICAgIHdjaCA9ICpwd3NTdHIrKzsKLSAgICBpZiAoYkhvdEtleSAmJiB3Y2ggPT0gTCcmJyAmJiAqKHBTdHIgLSAxKSAhPSBMJyYnKSB7Ci0gICAgICBpZiAoaVR4dExlbmd0aCA+IDApCi0gICAgICAgIG1faG90S2V5cy5BZGQoaUNoYXJzKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICAqcFN0cisrID0gd2NoOwotICAgIGlDaGFycysrOwotICAgIGR3QnJlYWtTdGF0dXMgPSBtX3BUeHRCcmVhay0+QXBwZW5kQ2hhcih3Y2gpOwotICAgIGlmIChkd0JyZWFrU3RhdHVzID4gRlhfVFhUQlJFQUtfUGllY2VCcmVhaykgewotICAgICAgYm9vbCBiRW5kb2ZMaW5lID0KLSAgICAgICAgICBSZXRyaWVjZVBpZWNlcyhkd0JyZWFrU3RhdHVzLCBpU3RhcnRDaGFyLCBpUGllY2VXaWR0aHMsIGZhbHNlLCByZWN0KTsKLSAgICAgIGlmIChiRW5kb2ZMaW5lICYmIChiTGluZVdyYXAgfHwgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19MaW5lQnJlYWsgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFiTGluZVdyYXApKSkgewotICAgICAgICBpUGllY2VXaWR0aHMgPSAwOwotICAgICAgICBtX2lDdXJMaW5lKys7Ci0gICAgICAgIG1fZkxpbmVQb3MgKz0gZkxpbmVTdGVwOwotICAgICAgfQotICAgICAgaWYgKChiVmVydGljYWwgJiYgbV9mTGluZVBvcyArIGZMaW5lU3RlcCA8IGZMaW5lU3RvcCkgfHwKLSAgICAgICAgICAoIWJWZXJ0aWNhbCAmJiBtX2ZMaW5lUG9zICsgZkxpbmVTdGVwID4gZkxpbmVTdG9wKSkgewotICAgICAgICBpbnQzMl90IGlDdXJMaW5lID0gYkVuZG9mTGluZSA/IG1faUN1ckxpbmUgLSAxIDogbV9pQ3VyTGluZTsKLSAgICAgICAgbV90dG9MaW5lc1tpQ3VyTGluZV0uU2V0TmV3UmVsb2FkKHRydWUpOwotICAgICAgICBiUmV0ID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGR3QnJlYWtTdGF0dXMgPSBtX3BUeHRCcmVhay0+RW5kQnJlYWsoRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspOwotICBpZiAoZHdCcmVha1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWsgJiYgIWJSZXQpIHsKLSAgICBSZXRyaWVjZVBpZWNlcyhkd0JyZWFrU3RhdHVzLCBpU3RhcnRDaGFyLCBpUGllY2VXaWR0aHMsIGZhbHNlLCByZWN0KTsKLSAgfQotICBtX3BUeHRCcmVhay0+Q2xlYXJCcmVha1BpZWNlcygpOwotICBtX3BUeHRCcmVhay0+UmVzZXQoKTsKLSAgbV93c1RleHQuUmVsZWFzZUJ1ZmZlcihpTGVuZ3RoKTsKLX0KLQotYm9vbCBDRkRFX1RleHRPdXQ6OlJldHJpZWNlUGllY2VzKHVpbnQzMl90IGR3QnJlYWtTdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVN0YXJ0Q2hhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpUGllY2VXaWR0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmVsb2FkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgewotICBib29sIGJTaW5nbGVMaW5lID0gISEobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lKTsKLSAgYm9vbCBiTGluZVdyYXAgPSAhIShtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX0xpbmVXcmFwKTsKLSAgYm9vbCBiVmVydGljYWwgPSAhIShtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX1ZlcnRpY2FsTGF5b3V0KTsKLSAgRlhfRkxPQVQgZkxpbmVTdGVwID0KLSAgICAgIChtX2ZMaW5lU3BhY2UgPiBtX2ZGb250U2l6ZSkgPyBtX2ZMaW5lU3BhY2UgOiBtX2ZGb250U2l6ZTsKLSAgaWYgKGJWZXJ0aWNhbCkgewotICAgIGZMaW5lU3RlcCA9IC1mTGluZVN0ZXA7Ci0gIH0KLSAgQ0ZYX0NoYXIqIHBUQyA9IG51bGxwdHI7Ci0gIGJvb2wgYk5lZWRSZWxvYWQgPSBmYWxzZTsKLSAgRlhfRkxPQVQgZkxpbmVXaWR0aCA9IGJWZXJ0aWNhbCA/IHJlY3QuSGVpZ2h0KCkgOiByZWN0LldpZHRoKCk7Ci0gIGludDMyX3QgaUxpbmVXaWR0aCA9IEZYU1lTX3JvdW5kKGZMaW5lV2lkdGggKiAyMDAwMC4wZik7Ci0gIGludDMyX3QgaUNvdW50ID0gbV9wVHh0QnJlYWstPkNvdW50QnJlYWtQaWVjZXMoKTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKLSAgICBjb25zdCBDRlhfVHh0UGllY2UqIHBQaWVjZSA9IG1fcFR4dEJyZWFrLT5HZXRCcmVha1BpZWNlKGkpOwotICAgIGludDMyX3QgaVBpZWNlQ2hhcnMgPSBwUGllY2UtPkdldExlbmd0aCgpOwotICAgIGludDMyX3QgaUNoYXIgPSBpU3RhcnRDaGFyOwotICAgIGludDMyX3QgaVdpZHRoID0gMDsKLSAgICBpbnQzMl90IGogPSAwOwotICAgIGZvciAoOyBqIDwgaVBpZWNlQ2hhcnM7IGorKykgewotICAgICAgcFRDID0gcFBpZWNlLT5HZXRDaGFyUHRyKGopOwotICAgICAgaW50MzJfdCBpQ3VyQ2hhcldpZHRoID0gcFRDLT5tX2lDaGFyV2lkdGggPiAwID8gcFRDLT5tX2lDaGFyV2lkdGggOiAwOwotICAgICAgaWYgKGJTaW5nbGVMaW5lIHx8ICFiTGluZVdyYXApIHsKLSAgICAgICAgaWYgKGlMaW5lV2lkdGggLSBpUGllY2VXaWR0aHMgLSBpV2lkdGggPCBpQ3VyQ2hhcldpZHRoKSB7Ci0gICAgICAgICAgYk5lZWRSZWxvYWQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpV2lkdGggKz0gaUN1ckNoYXJXaWR0aDsKLSAgICAgIG1fQ2hhcldpZHRoc1tpQ2hhcisrXSA9IGlDdXJDaGFyV2lkdGg7Ci0gICAgfQotICAgIGlmIChqID09IDAgJiYgIWJSZWxvYWQpIHsKLSAgICAgIG1fdHRvTGluZXNbbV9pQ3VyTGluZV0uU2V0TmV3UmVsb2FkKHRydWUpOwotICAgIH0gZWxzZSBpZiAoaiA+IDApIHsKLSAgICAgIENGWF9SZWN0RiBydFBpZWNlOwotICAgICAgaWYgKGJWZXJ0aWNhbCkgewotICAgICAgICBydFBpZWNlLmxlZnQgPSBtX2ZMaW5lUG9zOwotICAgICAgICBydFBpZWNlLnRvcCA9IHJlY3QudG9wICsgKEZYX0ZMT0FUKXBQaWVjZS0+bV9pU3RhcnRQb3MgLyAyMDAwMC4wZjsKLSAgICAgICAgcnRQaWVjZS53aWR0aCA9IGZMaW5lU3RlcDsKLSAgICAgICAgcnRQaWVjZS5oZWlnaHQgPSBpV2lkdGggLyAyMDAwMC4wZjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJ0UGllY2UubGVmdCA9IHJlY3QubGVmdCArIChGWF9GTE9BVClwUGllY2UtPm1faVN0YXJ0UG9zIC8gMjAwMDAuMGY7Ci0gICAgICAgIHJ0UGllY2UudG9wID0gbV9mTGluZVBvczsKLSAgICAgICAgcnRQaWVjZS53aWR0aCA9IGlXaWR0aCAvIDIwMDAwLjBmOwotICAgICAgICBydFBpZWNlLmhlaWdodCA9IGZMaW5lU3RlcDsKLSAgICAgIH0KLSAgICAgIEZERV9UVE9QSUVDRSB0dG9QaWVjZTsKLSAgICAgIHR0b1BpZWNlLmlTdGFydENoYXIgPSBpU3RhcnRDaGFyOwotICAgICAgdHRvUGllY2UuaUNoYXJzID0gajsKLSAgICAgIHR0b1BpZWNlLnJ0UGllY2UgPSBydFBpZWNlOwotICAgICAgdHRvUGllY2UuZHdDaGFyU3R5bGVzID0gcFBpZWNlLT5tX2R3Q2hhclN0eWxlczsKLSAgICAgIGlmIChGWF9Jc09kZChwUGllY2UtPm1faUJpZGlMZXZlbCkpIHsKLSAgICAgICAgdHRvUGllY2UuZHdDaGFyU3R5bGVzIHw9IEZYX1RYVENIQVJTVFlMRV9PZGRCaWRpTGV2ZWw7Ci0gICAgICB9Ci0gICAgICBBcHBlbmRQaWVjZSh0dG9QaWVjZSwgYk5lZWRSZWxvYWQsIChiUmVsb2FkICYmIGkgPT0gaUNvdW50IC0gMSkpOwotICAgIH0KLSAgICBpU3RhcnRDaGFyICs9IGlQaWVjZUNoYXJzOwotICAgIGlQaWVjZVdpZHRocyArPSBpV2lkdGg7Ci0gIH0KLSAgbV9wVHh0QnJlYWstPkNsZWFyQnJlYWtQaWVjZXMoKTsKLSAgYm9vbCBiUmV0ID0gYlNpbmdsZUxpbmUgfHwgYkxpbmVXcmFwIHx8ICghYkxpbmVXcmFwICYmIGJOZWVkUmVsb2FkKSB8fAotICAgICAgICAgICAgICBkd0JyZWFrU3RhdHVzID09IEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrOwotICByZXR1cm4gYlJldDsKLX0KLQotdm9pZCBDRkRFX1RleHRPdXQ6OkFwcGVuZFBpZWNlKGNvbnN0IEZERV9UVE9QSUVDRSYgdHRvUGllY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTmVlZFJlbG9hZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJFbmQpIHsKLSAgaWYgKG1faUN1ckxpbmUgPj0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX3R0b0xpbmVzKSkgewotICAgIENGREVfVFRPTGluZSB0dG9MaW5lOwotICAgIHR0b0xpbmUuU2V0TmV3UmVsb2FkKGJOZWVkUmVsb2FkKTsKLSAgICBtX2lDdXJQaWVjZSA9IHR0b0xpbmUuQWRkUGllY2UobV9pQ3VyUGllY2UsIHR0b1BpZWNlKTsKLSAgICBtX3R0b0xpbmVzLnB1c2hfYmFjayh0dG9MaW5lKTsKLSAgICBtX2lDdXJMaW5lID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX3R0b0xpbmVzKSAtIDE7Ci0gIH0gZWxzZSB7Ci0gICAgQ0ZERV9UVE9MaW5lKiBwTGluZSA9ICZtX3R0b0xpbmVzW21faUN1ckxpbmVdOwotICAgIHBMaW5lLT5TZXROZXdSZWxvYWQoYk5lZWRSZWxvYWQpOwotICAgIG1faUN1clBpZWNlID0gcExpbmUtPkFkZFBpZWNlKG1faUN1clBpZWNlLCB0dG9QaWVjZSk7Ci0gICAgaWYgKGJFbmQpIHsKLSAgICAgIGludDMyX3QgaVBpZWNlcyA9IHBMaW5lLT5HZXRTaXplKCk7Ci0gICAgICBpZiAobV9pQ3VyUGllY2UgPCBpUGllY2VzKSB7Ci0gICAgICAgIHBMaW5lLT5SZW1vdmVMYXN0KGlQaWVjZXMgLSBtX2lDdXJQaWVjZSAtIDEpOwotICAgICAgfQotICAgIH0KLSAgfQotICBpZiAoIWJFbmQgJiYgYk5lZWRSZWxvYWQpCi0gICAgbV9pQ3VyUGllY2UgPSAwOwotfQotCi12b2lkIENGREVfVGV4dE91dDo6UmVwbGFjZVdpZHRoRWxsaXBzaXMoKSB7Ci0gIExvYWRFbGxpcHNpcygpOwotICBpbnQzMl90IGlMZW5ndGggPSBtX3dzRWxsaXBzaXMuR2V0TGVuZ3RoKCk7Ci0gIGlmIChpTGVuZ3RoIDwgMSkKLSAgICByZXR1cm47Ci0KLSAgZm9yIChhdXRvJiBsaW5lIDogbV90dG9MaW5lcykgewotICAgIGlmICghbGluZS5HZXROZXdSZWxvYWQoKSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgaW50MzJfdCBpRWxsaXBzaXNDaGFySW5kZXggPSBpTGVuZ3RoIC0gMTsKLSAgICBpbnQzMl90IGlDaGFyV2lkdGggPSAwOwotICAgIGludDMyX3QgaUNoYXJDb3VudCA9IDA7Ci0gICAgaW50MzJfdCBpUGllY2UgPSBsaW5lLkdldFNpemUoKTsKLSAgICB3aGlsZSAoaVBpZWNlLS0gPiAwKSB7Ci0gICAgICBGREVfVFRPUElFQ0UqIHBQaWVjZSA9IGxpbmUuR2V0UHRyQXQoaVBpZWNlKTsKLSAgICAgIGlmICghcFBpZWNlKQotICAgICAgICBicmVhazsKLQotICAgICAgZm9yIChpbnQzMl90IGogPSBwUGllY2UtPmlDaGFycyAtIDE7IGogPj0gMDsgai0tKSB7Ci0gICAgICAgIGlmIChpRWxsaXBzaXNDaGFySW5kZXggPCAwKQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGludDMyX3QgaW5kZXggPSBwUGllY2UtPmlTdGFydENoYXIgKyBqOwotICAgICAgICBpQ2hhcldpZHRoICs9IG1fQ2hhcldpZHRoc1tpbmRleF07Ci0gICAgICAgIGlDaGFyQ291bnQrKzsKLSAgICAgICAgaWYgKGlDaGFyQ291bnQgPD0gaUxlbmd0aCkgewotICAgICAgICAgIG1fd3NUZXh0LlNldEF0KGluZGV4LCBtX3dzRWxsaXBzaXMuR2V0QXQoaUVsbGlwc2lzQ2hhckluZGV4KSk7Ci0gICAgICAgICAgbV9DaGFyV2lkdGhzW2luZGV4XSA9IG1fRWxsQ2hhcldpZHRoc1tpRWxsaXBzaXNDaGFySW5kZXhdOwotICAgICAgICB9IGVsc2UgaWYgKGlDaGFyV2lkdGggPD0gbV9pRWxsaXBzaXNXaWR0aCkgewotICAgICAgICAgIG1fd3NUZXh0LlNldEF0KGluZGV4LCAwKTsKLSAgICAgICAgICBtX0NoYXJXaWR0aHNbaW5kZXhdID0gMDsKLSAgICAgICAgfQotICAgICAgICBpRWxsaXBzaXNDaGFySW5kZXgtLTsKLSAgICAgIH0KLSAgICAgIGlmIChpRWxsaXBzaXNDaGFySW5kZXggPCAwKQotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDRkRFX1RleHRPdXQ6OlJlbG9hZChjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsKLSAgaW50IGkgPSAwOwotICBmb3IgKGF1dG8mIGxpbmUgOiBtX3R0b0xpbmVzKSB7Ci0gICAgaWYgKGxpbmUuR2V0TmV3UmVsb2FkKCkpIHsKLSAgICAgIG1faUN1ckxpbmUgPSBpOwotICAgICAgbV9pQ3VyUGllY2UgPSAwOwotICAgICAgUmVsb2FkTGluZVBpZWNlKCZsaW5lLCByZWN0KTsKLSAgICB9Ci0gICAgKytpOwotICB9Ci19Ci0KLXZvaWQgQ0ZERV9UZXh0T3V0OjpSZWxvYWRMaW5lUGllY2UoQ0ZERV9UVE9MaW5lKiBwTGluZSwgY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIgPSBtX3dzVGV4dC5jX3N0cigpOwotICBib29sIGJWZXJ0aWNhbCA9ICEhKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVmVydGljYWxMYXlvdXQpOwotICBpbnQzMl90IGlQaWVjZVdpZHRocyA9IDA7Ci0gIEZERV9UVE9QSUVDRSogcFBpZWNlID0gcExpbmUtPkdldFB0ckF0KDApOwotICBpbnQzMl90IGlTdGFydENoYXIgPSBwUGllY2UtPmlTdGFydENoYXI7Ci0gIG1fZkxpbmVQb3MgPSBiVmVydGljYWwgPyBwUGllY2UtPnJ0UGllY2UubGVmdCA6IHBQaWVjZS0+cnRQaWVjZS50b3A7Ci0gIGludDMyX3QgaVBpZWNlQ291bnQgPSBwTGluZS0+R2V0U2l6ZSgpOwotICBpbnQzMl90IGlQaWVjZUluZGV4ID0gMDsKLSAgdWludDMyX3QgZHdCcmVha1N0YXR1cyA9IDA7Ci0gIEZYX1dDSEFSIHdjaDsKLSAgd2hpbGUgKGlQaWVjZUluZGV4IDwgaVBpZWNlQ291bnQpIHsKLSAgICBpbnQzMl90IGlTdGFyID0gaVN0YXJ0Q2hhcjsKLSAgICBpbnQzMl90IGlFbmQgPSBwUGllY2UtPmlDaGFycyArIGlTdGFyOwotICAgIHdoaWxlIChpU3RhciA8IGlFbmQpIHsKLSAgICAgIHdjaCA9ICoocHdzU3RyICsgaVN0YXIpOwotICAgICAgZHdCcmVha1N0YXR1cyA9IG1fcFR4dEJyZWFrLT5BcHBlbmRDaGFyKHdjaCk7Ci0gICAgICBpZiAoZHdCcmVha1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspIHsKLSAgICAgICAgUmV0cmllY2VQaWVjZXMoZHdCcmVha1N0YXR1cywgaVN0YXJ0Q2hhciwgaVBpZWNlV2lkdGhzLCB0cnVlLCByZWN0KTsKLSAgICAgIH0KLSAgICAgIGlTdGFyKys7Ci0gICAgfQotICAgIGlQaWVjZUluZGV4Kys7Ci0gICAgcFBpZWNlID0gcExpbmUtPkdldFB0ckF0KGlQaWVjZUluZGV4KTsKLSAgfQotICBkd0JyZWFrU3RhdHVzID0gbV9wVHh0QnJlYWstPkVuZEJyZWFrKEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrKTsKLSAgaWYgKGR3QnJlYWtTdGF0dXMgPiBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKSB7Ci0gICAgUmV0cmllY2VQaWVjZXMoZHdCcmVha1N0YXR1cywgaVN0YXJ0Q2hhciwgaVBpZWNlV2lkdGhzLCB0cnVlLCByZWN0KTsKLSAgfQotICBtX3BUeHRCcmVhay0+UmVzZXQoKTsKLX0KLQotdm9pZCBDRkRFX1RleHRPdXQ6OkRvQWxpZ25tZW50KGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgewotICBpZiAobV90dG9MaW5lcy5lbXB0eSgpKQotICAgIHJldHVybjsKLQotICBib29sIGJWZXJ0aWNhbCA9ICEhKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVmVydGljYWxMYXlvdXQpOwotICBGWF9GTE9BVCBmTGluZVN0b3BTID0gYlZlcnRpY2FsID8gcmVjdC5yaWdodCgpIDogcmVjdC5ib3R0b20oKTsKLSAgRkRFX1RUT1BJRUNFKiBwRmlyc3RQaWVjZSA9IG1fdHRvTGluZXMuYmFjaygpLkdldFB0ckF0KDApOwotICBpZiAoIXBGaXJzdFBpZWNlKQotICAgIHJldHVybjsKLQotICBGWF9GTE9BVCBmTGluZVN0b3BEID0KLSAgICAgIGJWZXJ0aWNhbCA/IHBGaXJzdFBpZWNlLT5ydFBpZWNlLnJpZ2h0KCkgOiBwRmlyc3RQaWVjZS0+cnRQaWVjZS5ib3R0b20oKTsKLSAgRlhfRkxPQVQgZkluYyA9IGZMaW5lU3RvcFMgLSBmTGluZVN0b3BEOwotICBpZiAobV9pQWxpZ25tZW50ID49IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyTGVmdCAmJgotICAgICAgbV9pQWxpZ25tZW50IDwgRkRFX1RUT0FMSUdOTUVOVF9Cb3R0b21MZWZ0KSB7Ci0gICAgZkluYyAvPSAyLjBmOwotICB9IGVsc2UgaWYgKG1faUFsaWdubWVudCA8IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyTGVmdCkgewotICAgIGZJbmMgPSAwLjBmOwotICB9Ci0gIGlmIChmSW5jIDwgMS4wZikKLSAgICByZXR1cm47Ci0gIGZvciAoYXV0byYgbGluZSA6IG1fdHRvTGluZXMpIHsKLSAgICBpbnQzMl90IGlQaWVjZXMgPSBsaW5lLkdldFNpemUoKTsKLSAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpUGllY2VzOyBqKyspIHsKLSAgICAgIEZERV9UVE9QSUVDRSogcFBpZWNlID0gbGluZS5HZXRQdHJBdChqKTsKLSAgICAgIGlmIChiVmVydGljYWwpCi0gICAgICAgIHBQaWVjZS0+cnRQaWVjZS5sZWZ0ICs9IGZJbmM7Ci0gICAgICBlbHNlCi0gICAgICAgIHBQaWVjZS0+cnRQaWVjZS50b3AgKz0gZkluYzsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDRkRFX1RleHRPdXQ6Ok9uRHJhdyhjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCkgewotICBpZiAoIW1fcFJlbmRlckRldmljZSB8fCBtX3R0b0xpbmVzLmVtcHR5KCkpCi0gICAgcmV0dXJuOwotCi0gIGF1dG8gcEJydXNoID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGREVfQnJ1c2g+KCk7Ci0gIHBCcnVzaC0+U2V0Q29sb3IobV9UeHRDb2xvcik7Ci0gIG1fcFJlbmRlckRldmljZS0+U2F2ZVN0YXRlKCk7Ci0gIGlmIChydENsaXAuV2lkdGgoKSA+IDAuMGYgJiYgcnRDbGlwLkhlaWdodCgpID4gMC4wZikKLSAgICBtX3BSZW5kZXJEZXZpY2UtPlNldENsaXBSZWN0KHJ0Q2xpcCk7Ci0KLSAgYXV0byBwUGVuID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGREVfUGVuPigpOwotICBwUGVuLT5TZXRDb2xvcihtX1R4dENvbG9yKTsKLQotICBmb3IgKGF1dG8mIGxpbmUgOiBtX3R0b0xpbmVzKSB7Ci0gICAgaW50MzJfdCBpUGllY2VzID0gbGluZS5HZXRTaXplKCk7Ci0gICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVBpZWNlczsgaisrKSB7Ci0gICAgICBGREVfVFRPUElFQ0UqIHBQaWVjZSA9IGxpbmUuR2V0UHRyQXQoaik7Ci0gICAgICBpZiAoIXBQaWVjZSkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIGludDMyX3QgaUNvdW50ID0gR2V0RGlzcGxheVBvcyhwUGllY2UpOwotICAgICAgaWYgKGlDb3VudCA+IDApIHsKLSAgICAgICAgbV9wUmVuZGVyRGV2aWNlLT5EcmF3U3RyaW5nKHBCcnVzaC5nZXQoKSwgbV9wRm9udCwgbV9DaGFyUG9zLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb3VudCwgbV9mRm9udFNpemUsICZtX01hdHJpeCk7Ci0gICAgICB9Ci0gICAgICBEcmF3TGluZShwUGllY2UsIHBQZW4uZ2V0KCkpOwotICAgIH0KLSAgfQotICBtX3BSZW5kZXJEZXZpY2UtPlJlc3RvcmVTdGF0ZSgpOwotfQotCi1pbnQzMl90IENGREVfVGV4dE91dDo6R2V0RGlzcGxheVBvcyhGREVfVFRPUElFQ0UqIHBQaWVjZSkgewotICBGWF9UWFRSVU4gdHIgPSBUb1RleHRSdW4ocFBpZWNlKTsKLSAgRXhwYW5kQnVmZmVyKHRyLmlMZW5ndGgsIDIpOwotICByZXR1cm4gbV9wVHh0QnJlYWstPkdldERpc3BsYXlQb3MoJnRyLCBtX0NoYXJQb3MuZGF0YSgpKTsKLX0KLQotaW50MzJfdCBDRkRFX1RleHRPdXQ6OkdldENoYXJSZWN0cyhjb25zdCBGREVfVFRPUElFQ0UqIHBQaWVjZSkgewotICBGWF9UWFRSVU4gdHIgPSBUb1RleHRSdW4ocFBpZWNlKTsKLSAgbV9yZWN0QXJyYXkgPSBtX3BUeHRCcmVhay0+R2V0Q2hhclJlY3RzKCZ0cik7Ci0gIHJldHVybiBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fcmVjdEFycmF5KTsKLX0KLQotRlhfVFhUUlVOIENGREVfVGV4dE91dDo6VG9UZXh0UnVuKGNvbnN0IEZERV9UVE9QSUVDRSogcFBpZWNlKSB7Ci0gIEZYX1RYVFJVTiB0cjsKLSAgdHIud3NTdHIgPSBtX3dzVGV4dCArIHBQaWVjZS0+aVN0YXJ0Q2hhcjsKLSAgdHIucFdpZHRocyA9ICZtX0NoYXJXaWR0aHNbcFBpZWNlLT5pU3RhcnRDaGFyXTsKLSAgdHIuaUxlbmd0aCA9IHBQaWVjZS0+aUNoYXJzOwotICB0ci5wRm9udCA9IG1fcEZvbnQ7Ci0gIHRyLmZGb250U2l6ZSA9IG1fZkZvbnRTaXplOwotICB0ci5kd1N0eWxlcyA9IG1fZHdUeHRCa1N0eWxlczsKLSAgdHIuZHdDaGFyU3R5bGVzID0gcFBpZWNlLT5kd0NoYXJTdHlsZXM7Ci0gIHRyLndMaW5lQnJlYWtDaGFyID0gbV93UGFyYWdyYXBoQmtDaGFyOwotICB0ci5wUmVjdCA9ICZwUGllY2UtPnJ0UGllY2U7Ci0gIHJldHVybiB0cjsKLX0KLQotdm9pZCBDRkRFX1RleHRPdXQ6OkRyYXdMaW5lKGNvbnN0IEZERV9UVE9QSUVDRSogcFBpZWNlLCBDRkRFX1BlbiogcFBlbikgewotICBib29sIGJVbmRlckxpbmUgPSAhIShtX2R3U3R5bGVzICYgRkRFX1RUT1NUWUxFX1VuZGVybGluZSk7Ci0gIGJvb2wgYlN0cmlrZU91dCA9ICEhKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfU3RyaWtlb3V0KTsKLSAgYm9vbCBiSG90S2V5ID0gISEobV9kd1N0eWxlcyAmIEZERV9UVE9TVFlMRV9Ib3RLZXkpOwotICBib29sIGJWZXJ0aWNhbCA9ICEhKG1fZHdTdHlsZXMgJiBGREVfVFRPU1RZTEVfVmVydGljYWxMYXlvdXQpOwotICBpZiAoIWJVbmRlckxpbmUgJiYgIWJTdHJpa2VPdXQgJiYgIWJIb3RLZXkpCi0gICAgcmV0dXJuOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRkRFX1BhdGg+IHBQYXRoKG5ldyBDRkRFX1BhdGgpOwotICBpbnQzMl90IGlMaW5lQ291bnQgPSAwOwotICBDRlhfUmVjdEYgcnRUZXh0ID0gcFBpZWNlLT5ydFBpZWNlOwotICBDRlhfUG9pbnRGIHB0MSwgcHQyOwotICBpZiAoYlVuZGVyTGluZSkgewotICAgIGlmIChiVmVydGljYWwpIHsKLSAgICAgIHB0MS54ID0gcnRUZXh0LmxlZnQ7Ci0gICAgICBwdDEueSA9IHJ0VGV4dC50b3A7Ci0gICAgICBwdDIueCA9IHJ0VGV4dC5sZWZ0OwotICAgICAgcHQyLnkgPSBydFRleHQuYm90dG9tKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHB0MS54ID0gcnRUZXh0LmxlZnQ7Ci0gICAgICBwdDEueSA9IHJ0VGV4dC5ib3R0b20oKTsKLSAgICAgIHB0Mi54ID0gcnRUZXh0LnJpZ2h0KCk7Ci0gICAgICBwdDIueSA9IHJ0VGV4dC5ib3R0b20oKTsKLSAgICB9Ci0gICAgcFBhdGgtPkFkZExpbmUocHQxLCBwdDIpOwotICAgIGlMaW5lQ291bnQrKzsKLSAgfQotICBpZiAoYlN0cmlrZU91dCkgewotICAgIGlmIChiVmVydGljYWwpIHsKLSAgICAgIHB0MS54ID0gcnRUZXh0LmxlZnQgKyBydFRleHQud2lkdGggKiAyLjBmIC8gNS4wZjsKLSAgICAgIHB0MS55ID0gcnRUZXh0LnRvcDsKLSAgICAgIHB0Mi54ID0gcHQxLng7Ci0gICAgICBwdDIueSA9IHJ0VGV4dC5ib3R0b20oKTsKLSAgICB9IGVsc2UgewotICAgICAgcHQxLnggPSBydFRleHQubGVmdDsKLSAgICAgIHB0MS55ID0gcnRUZXh0LmJvdHRvbSgpIC0gcnRUZXh0LmhlaWdodCAqIDIuMGYgLyA1LjBmOwotICAgICAgcHQyLnggPSBydFRleHQucmlnaHQoKTsKLSAgICAgIHB0Mi55ID0gcHQxLnk7Ci0gICAgfQotICAgIHBQYXRoLT5BZGRMaW5lKHB0MSwgcHQyKTsKLSAgICBpTGluZUNvdW50Kys7Ci0gIH0KLSAgaWYgKGJIb3RLZXkpIHsKLSAgICBpbnQzMl90IGlIb3RLZXlzID0gbV9ob3RLZXlzLkdldFNpemUoKTsKLSAgICBpbnQzMl90IGlDb3VudCA9IEdldENoYXJSZWN0cyhwUGllY2UpOwotICAgIGlmIChpQ291bnQgPiAwKSB7Ci0gICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpSG90S2V5czsgaSsrKSB7Ci0gICAgICAgIGludDMyX3QgaUNoYXJJbmRleCA9IG1faG90S2V5cy5HZXRBdChpKTsKLSAgICAgICAgaWYgKGlDaGFySW5kZXggPj0gcFBpZWNlLT5pU3RhcnRDaGFyICYmCi0gICAgICAgICAgICBpQ2hhckluZGV4IDwgcFBpZWNlLT5pU3RhcnRDaGFyICsgcFBpZWNlLT5pQ2hhcnMpIHsKLSAgICAgICAgICBDRlhfUmVjdEYgcmVjdCA9IG1fcmVjdEFycmF5W2lDaGFySW5kZXggLSBwUGllY2UtPmlTdGFydENoYXJdOwotICAgICAgICAgIGlmIChiVmVydGljYWwpIHsKLSAgICAgICAgICAgIHB0MS54ID0gcmVjdC5sZWZ0OwotICAgICAgICAgICAgcHQxLnkgPSByZWN0LnRvcDsKLSAgICAgICAgICAgIHB0Mi54ID0gcmVjdC5sZWZ0OwotICAgICAgICAgICAgcHQyLnkgPSByZWN0LmJvdHRvbSgpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwdDEueCA9IHJlY3QubGVmdDsKLSAgICAgICAgICAgIHB0MS55ID0gcmVjdC5ib3R0b20oKTsKLSAgICAgICAgICAgIHB0Mi54ID0gcmVjdC5yaWdodCgpOwotICAgICAgICAgICAgcHQyLnkgPSByZWN0LmJvdHRvbSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBwUGF0aC0+QWRkTGluZShwdDEsIHB0Mik7Ci0gICAgICAgICAgaUxpbmVDb3VudCsrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGlmIChpTGluZUNvdW50ID4gMCkKLSAgICBtX3BSZW5kZXJEZXZpY2UtPkRyYXdQYXRoKHBQZW4sIDEsIHBQYXRoLmdldCgpLCAmbV9NYXRyaXgpOwotfQotCi1DRkRFX1RUT0xpbmU6OkNGREVfVFRPTGluZSgpIDogbV9iTmV3UmVsb2FkKGZhbHNlKSB7fQotCi1DRkRFX1RUT0xpbmU6OkNGREVfVFRPTGluZShjb25zdCBDRkRFX1RUT0xpbmUmIHR0b0xpbmUpIDogbV9waWVjZXMoNSkgewotICBtX2JOZXdSZWxvYWQgPSB0dG9MaW5lLm1fYk5ld1JlbG9hZDsKLSAgbV9waWVjZXMgPSB0dG9MaW5lLm1fcGllY2VzOwotfQotCi1DRkRFX1RUT0xpbmU6On5DRkRFX1RUT0xpbmUoKSB7fQotCi1pbnQzMl90IENGREVfVFRPTGluZTo6QWRkUGllY2UoaW50MzJfdCBpbmRleCwgY29uc3QgRkRFX1RUT1BJRUNFJiB0dG9QaWVjZSkgewotICBpZiAoaW5kZXggPj0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX3BpZWNlcykpIHsKLSAgICBtX3BpZWNlcy5wdXNoX2JhY2sodHRvUGllY2UpOwotICAgIHJldHVybiBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fcGllY2VzKTsKLSAgfQotICBtX3BpZWNlc1tpbmRleF0gPSB0dG9QaWVjZTsKLSAgcmV0dXJuIGluZGV4OwotfQotCi1pbnQzMl90IENGREVfVFRPTGluZTo6R2V0U2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9waWVjZXMpOwotfQotCi1GREVfVFRPUElFQ0UqIENGREVfVFRPTGluZTo6R2V0UHRyQXQoaW50MzJfdCBpbmRleCkgewotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9waWVjZXMpKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIHJldHVybiAmbV9waWVjZXNbaW5kZXhdOwotfQotCi12b2lkIENGREVfVFRPTGluZTo6UmVtb3ZlTGFzdChpbnQzMl90IGljb3VudCkgewotICBpZiAoaWNvdW50IDwgMCkKLSAgICByZXR1cm47Ci0gIGljb3VudCA9IHN0ZDo6bWluKGljb3VudCwgcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX3BpZWNlcykpOwotICBtX3BpZWNlcy5lcmFzZShtX3BpZWNlcy5lbmQoKSAtIGljb3VudCwgbV9waWVjZXMuZW5kKCkpOwotfQotCi12b2lkIENGREVfVFRPTGluZTo6UmVtb3ZlQWxsKCkgewotICBtX3BpZWNlcy5jbGVhcigpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2ZkZS90dG8vZmRlX3RleHRvdXQuaCBiL3hmYS9mZGUvdHRvL2ZkZV90ZXh0b3V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZDY1NjcuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS90dG8vZmRlX3RleHRvdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZERV9UVE9fRkRFX1RFWFRPVVRfSF8KLSNkZWZpbmUgWEZBX0ZERV9UVE9fRkRFX1RFWFRPVVRfSF8KLQotI2luY2x1ZGUgPGRlcXVlPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2Z4Z2VkZXZpY2UuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9meF9kaWIuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2ZkZV9vYmplY3QuaCIKLSNpbmNsdWRlICJ4ZmEvZmdhcy9jcnQvZmdhc191dGlscy5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2ZvbnQvY2ZnYXNfZm9udG1nci5oIgotCi0jZGVmaW5lIEZERV9UVE9TVFlMRV9VbmRlcmxpbmUgMHgwMDAxCi0jZGVmaW5lIEZERV9UVE9TVFlMRV9TdHJpa2VvdXQgMHgwMDAyCi0jZGVmaW5lIEZERV9UVE9TVFlMRV9WZXJ0aWNhbExheW91dCAweDAwMDQKLSNkZWZpbmUgRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmUgMHgwMDEwCi0jZGVmaW5lIEZERV9UVE9TVFlMRV9FeHBhbmRUYWIgMHgwMDIwCi0jZGVmaW5lIEZERV9UVE9TVFlMRV9Ib3RLZXkgMHgwMDQwCi0jZGVmaW5lIEZERV9UVE9TVFlMRV9FbGxpcHNpcyAweDAwODAKLSNkZWZpbmUgRkRFX1RUT1NUWUxFX0xpbmVXcmFwIDB4MDEwMAotI2RlZmluZSBGREVfVFRPU1RZTEVfQXJhYmljU2hhcGVzIDB4MDIwMAotI2RlZmluZSBGREVfVFRPU1RZTEVfQXJhYmljQ29udGV4dCAweDA4MDAKLSNkZWZpbmUgRkRFX1RUT1NUWUxFX0xhc3RMaW5lSGVpZ2h0IDB4MTAwMAotI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX1RvcExlZnQgMAotI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX1RvcENlbnRlciAxCi0jZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfVG9wUmlnaHQgMgotI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX1RvcEF1dG8gMwotI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX0NlbnRlckxlZnQgNAotI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX0NlbnRlciA1Ci0jZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfQ2VudGVyUmlnaHQgNgotI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX0NlbnRlckF1dG8gNwotI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbUxlZnQgOAotI2RlZmluZSBGREVfVFRPQUxJR05NRU5UX0JvdHRvbUNlbnRlciA5Ci0jZGVmaW5lIEZERV9UVE9BTElHTk1FTlRfQm90dG9tUmlnaHQgMTAKLSNkZWZpbmUgRkRFX1RUT0FMSUdOTUVOVF9Cb3R0b21BdXRvIDExCi0KLWNsYXNzIENGREVfUmVuZGVyRGV2aWNlOwotY2xhc3MgQ0ZYX1JlbmRlckRldmljZTsKLWNsYXNzIENGWF9UeHRCcmVhazsKLXN0cnVjdCBGWF9UWFRSVU47Ci0KLXN0cnVjdCBGREVfVFRPUElFQ0UgewotICBGREVfVFRPUElFQ0UoKTsKLSAgRkRFX1RUT1BJRUNFKGNvbnN0IEZERV9UVE9QSUVDRSYgdGhhdCk7Ci0gIH5GREVfVFRPUElFQ0UoKTsKLQotICBpbnQzMl90IGlTdGFydENoYXI7Ci0gIGludDMyX3QgaUNoYXJzOwotICB1aW50MzJfdCBkd0NoYXJTdHlsZXM7Ci0gIENGWF9SZWN0RiBydFBpZWNlOwotfTsKLQotY2xhc3MgQ0ZERV9UVE9MaW5lIHsKLSBwdWJsaWM6Ci0gIENGREVfVFRPTGluZSgpOwotICBDRkRFX1RUT0xpbmUoY29uc3QgQ0ZERV9UVE9MaW5lJiB0dG9MaW5lKTsKLSAgfkNGREVfVFRPTGluZSgpOwotCi0gIGJvb2wgR2V0TmV3UmVsb2FkKCkgY29uc3QgeyByZXR1cm4gbV9iTmV3UmVsb2FkOyB9Ci0gIHZvaWQgU2V0TmV3UmVsb2FkKGJvb2wgcmVsb2FkKSB7IG1fYk5ld1JlbG9hZCA9IHJlbG9hZDsgfQotICBpbnQzMl90IEFkZFBpZWNlKGludDMyX3QgaW5kZXgsIGNvbnN0IEZERV9UVE9QSUVDRSYgdHRvUGllY2UpOwotICBpbnQzMl90IEdldFNpemUoKSBjb25zdDsKLSAgRkRFX1RUT1BJRUNFKiBHZXRQdHJBdChpbnQzMl90IGluZGV4KTsKLSAgdm9pZCBSZW1vdmVMYXN0KGludDMyX3QgaUNvdW50KTsKLSAgdm9pZCBSZW1vdmVBbGwoKTsKLQotIHByaXZhdGU6Ci0gIGJvb2wgbV9iTmV3UmVsb2FkOwotICBzdGQ6OmRlcXVlPEZERV9UVE9QSUVDRT4gbV9waWVjZXM7Ci19OwotCi1jbGFzcyBDRkRFX1RleHRPdXQgewotIHB1YmxpYzoKLSAgQ0ZERV9UZXh0T3V0KCk7Ci0gIH5DRkRFX1RleHRPdXQoKTsKLQotICB2b2lkIFNldEZvbnQoY29uc3QgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+JiBwRm9udCk7Ci0gIHZvaWQgU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKLSAgdm9pZCBTZXRUZXh0Q29sb3IoRlhfQVJHQiBjb2xvcik7Ci0gIHZvaWQgU2V0U3R5bGVzKHVpbnQzMl90IGR3U3R5bGVzKTsKLSAgdm9pZCBTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgpOwotICB2b2lkIFNldEVsbGlwc2lzU3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0VsbGlwc2lzKTsKLSAgdm9pZCBTZXRQYXJhZ3JhcGhCcmVha0NoYXIoRlhfV0NIQVIgd2NoKTsKLSAgdm9pZCBTZXRBbGlnbm1lbnQoaW50MzJfdCBpQWxpZ25tZW50KTsKLSAgdm9pZCBTZXRMaW5lU3BhY2UoRlhfRkxPQVQgZkxpbmVTcGFjZSk7Ci0gIHZvaWQgU2V0RElCaXRtYXAoQ0ZYX0RJQml0bWFwKiBwRElCKTsKLSAgdm9pZCBTZXRSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogcERldmljZSk7Ci0gIHZvaWQgU2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3QmIHJ0Q2xpcCk7Ci0gIHZvaWQgU2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiBydENsaXApOwotICB2b2lkIFNldE1hdHJpeChjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpOwotICB2b2lkIFNldExpbmVCcmVha1RvbGVyYW5jZShGWF9GTE9BVCBmVG9sZXJhbmNlKTsKLQotICB2b2lkIERyYXdUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsIGludDMyX3QgaUxlbmd0aCwgaW50MzJfdCB4LCBpbnQzMl90IHkpOwotICB2b2lkIERyYXdUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLAotICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHgsCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQgeSk7Ci0gIHZvaWQgRHJhd1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgaW50MzJfdCBpTGVuZ3RoLCBjb25zdCBDRlhfUmVjdCYgcmVjdCk7Ci0gIHZvaWQgRHJhd1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgaW50MzJfdCBpTGVuZ3RoLCBjb25zdCBDRlhfUmVjdEYmIHJlY3QpOwotCi0gIHZvaWQgU2V0TG9naWNDbGlwUmVjdChjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCk7Ci0gIHZvaWQgQ2FsY0xvZ2ljU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIENGWF9TaXplRiYgc2l6ZSk7Ci0gIHZvaWQgQ2FsY0xvZ2ljU2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIENGWF9SZWN0RiYgcmVjdCk7Ci0gIHZvaWQgRHJhd0xvZ2ljVGV4dChjb25zdCBGWF9XQ0hBUiogcHdzU3RyLAotICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgeCwKLSAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHkpOwotICB2b2lkIERyYXdMb2dpY1RleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwKLSAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCk7Ci0gIGludDMyX3QgR2V0VG90YWxMaW5lcygpOwotCi0gcHJvdGVjdGVkOgotICB2b2lkIENhbGNUZXh0U2l6ZShjb25zdCBGWF9XQ0hBUiogcHdzU3RyLCBpbnQzMl90IGlMZW5ndGgsIENGWF9SZWN0RiYgcmVjdCk7Ci0gIGJvb2wgUmV0cmlldmVMaW5lV2lkdGgodWludDMyX3QgZHdCcmVha1N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZlN0YXJ0UG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZIZWlnaHQpOwotICB2b2lkIFNldExpbmVXaWR0aChDRlhfUmVjdEYmIHJlY3QpOwotICB2b2lkIERyYXdUZXh0KGNvbnN0IEZYX1dDSEFSKiBwd3NTdHIsCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLAotICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcmVjdCwKLSAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCk7Ci0gIHZvaWQgTG9hZFRleHQoY29uc3QgRlhfV0NIQVIqIHB3c1N0ciwgaW50MzJfdCBpTGVuZ3RoLCBjb25zdCBDRlhfUmVjdEYmIHJlY3QpOwotICB2b2lkIExvYWRFbGxpcHNpcygpOwotICB2b2lkIEV4cGFuZEJ1ZmZlcihpbnQzMl90IGlTaXplLCBpbnQzMl90IGlUeXBlKTsKLSAgdm9pZCBSZXRyaWV2ZUVsbFBpZWNlcyhzdGQ6OnZlY3RvcjxpbnQzMl90PiogcENoYXJXaWR0aHMpOwotCi0gIHZvaWQgUmVsb2FkKGNvbnN0IENGWF9SZWN0RiYgcmVjdCk7Ci0gIHZvaWQgUmVsb2FkTGluZVBpZWNlKENGREVfVFRPTGluZSogcExpbmUsIGNvbnN0IENGWF9SZWN0RiYgcmVjdCk7Ci0gIGJvb2wgUmV0cmllY2VQaWVjZXModWludDMyX3QgZHdCcmVha1N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpU3RhcnRDaGFyLAotICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlQaWVjZVdpZHRocywKLSAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZWxvYWQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0KTsKLSAgdm9pZCBBcHBlbmRQaWVjZShjb25zdCBGREVfVFRPUElFQ0UmIHR0b1BpZWNlLCBib29sIGJOZWVkUmVsb2FkLCBib29sIGJFbmQpOwotICB2b2lkIFJlcGxhY2VXaWR0aEVsbGlwc2lzKCk7Ci0gIHZvaWQgRG9BbGlnbm1lbnQoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KTsKLSAgdm9pZCBPbkRyYXcoY29uc3QgQ0ZYX1JlY3RGJiBydENsaXApOwotICBpbnQzMl90IEdldERpc3BsYXlQb3MoRkRFX1RUT1BJRUNFKiBwUGllY2UpOwotICBpbnQzMl90IEdldENoYXJSZWN0cyhjb25zdCBGREVfVFRPUElFQ0UqIHBQaWVjZSk7Ci0KLSAgRlhfVFhUUlVOIFRvVGV4dFJ1bihjb25zdCBGREVfVFRPUElFQ0UqIHBQaWVjZSk7Ci0gIHZvaWQgRHJhd0xpbmUoY29uc3QgRkRFX1RUT1BJRUNFKiBwUGllY2UsIENGREVfUGVuKiBwUGVuKTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1R4dEJyZWFrPiBtX3BUeHRCcmVhazsKLSAgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IG1fcEZvbnQ7Ci0gIEZYX0ZMT0FUIG1fZkZvbnRTaXplOwotICBGWF9GTE9BVCBtX2ZMaW5lU3BhY2U7Ci0gIEZYX0ZMT0FUIG1fZkxpbmVQb3M7Ci0gIEZYX0ZMT0FUIG1fZlRvbGVyYW5jZTsKLSAgaW50MzJfdCBtX2lBbGlnbm1lbnQ7Ci0gIGludDMyX3QgbV9pVHh0QmtBbGlnbm1lbnQ7Ci0gIHN0ZDo6dmVjdG9yPGludDMyX3Q+IG1fQ2hhcldpZHRoczsKLSAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gbV9FbGxDaGFyV2lkdGhzOwotICBGWF9XQ0hBUiBtX3dQYXJhZ3JhcGhCa0NoYXI7Ci0gIEZYX0FSR0IgbV9UeHRDb2xvcjsKLSAgdWludDMyX3QgbV9kd1N0eWxlczsKLSAgdWludDMyX3QgbV9kd1R4dEJrU3R5bGVzOwotICBDRlhfV2lkZVN0cmluZyBtX3dzRWxsaXBzaXM7Ci0gIGJvb2wgbV9iRWxsaUNoYW5nZWQ7Ci0gIGludDMyX3QgbV9pRWxsaXBzaXNXaWR0aDsKLSAgQ0ZYX1dpZGVTdHJpbmcgbV93c1RleHQ7Ci0gIENGWF9SZWN0RiBtX3J0Q2xpcDsKLSAgQ0ZYX1JlY3RGIG1fcnRMb2dpY0NsaXA7Ci0gIENGWF9NYXRyaXggbV9NYXRyaXg7Ci0gIHN0ZDo6ZGVxdWU8Q0ZERV9UVE9MaW5lPiBtX3R0b0xpbmVzOwotICBpbnQzMl90IG1faUN1ckxpbmU7Ci0gIGludDMyX3QgbV9pQ3VyUGllY2U7Ci0gIGludDMyX3QgbV9pVG90YWxMaW5lczsKLSAgc3RkOjp2ZWN0b3I8RlhURVhUX0NIQVJQT1M+IG1fQ2hhclBvczsKLSAgc3RkOjp1bmlxdWVfcHRyPENGREVfUmVuZGVyRGV2aWNlPiBtX3BSZW5kZXJEZXZpY2U7Ci0gIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+IG1faG90S2V5czsKLSAgc3RkOjp2ZWN0b3I8Q0ZYX1JlY3RGPiBtX3JlY3RBcnJheTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZERV9UVE9fRkRFX1RFWFRPVVRfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZGUveG1sL2NmeF9zYXhyZWFkZXIuY3BwIGIveGZhL2ZkZS94bWwvY2Z4X3NheHJlYWRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1OGJlZDUuLjAwMDAwMDAKLS0tIGEveGZhL2ZkZS94bWwvY2Z4X3NheHJlYWRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZkZS94bWwvY2Z4X3NheHJlYWRlci5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2NoZWNrc3VtLmgiCi0KLWVudW0gY2xhc3MgQ0ZYX1NheE1vZGUgewotICBUZXh0ID0gMCwKLSAgTm9kZVN0YXJ0LAotICBEZWNsT3JDb21tZW50LAotICBEZWNsTm9kZSwKLSAgQ29tbWVudCwKLSAgQ29tbWVudENvbnRlbnQsCi0gIFRhZ05hbWUsCi0gIFRhZ0F0dHJpYnV0ZU5hbWUsCi0gIFRhZ0F0dHJpYnV0ZUVxdWFsLAotICBUYWdBdHRyaWJ1dGVWYWx1ZSwKLSAgVGFnTWF5YmVDbG9zZSwKLSAgVGFnQ2xvc2UsCi0gIFRhZ0VuZCwKLSAgVGFyZ2V0RGF0YSwKLSAgTUFYCi19OwotCi1jbGFzcyBDRlhfU0FYQ29tbWVudENvbnRleHQgewotIHB1YmxpYzoKLSAgQ0ZYX1NBWENvbW1lbnRDb250ZXh0KCkgOiBtX2lIZWFkZXJDb3VudCgwKSwgbV9pVGFpbENvdW50KDApIHt9Ci0gIGludDMyX3QgbV9pSGVhZGVyQ291bnQ7Ci0gIGludDMyX3QgbV9pVGFpbENvdW50OwotfTsKLQotbmFtZXNwYWNlIHsKLQotY29uc3QgdWludDMyX3Qga1NheEZpbGVCdWZTaXplID0gMzI3Njg7Ci0KLXR5cGVkZWYgdm9pZCAoQ0ZYX1NBWFJlYWRlcjo6KkZYX1NBWFJlYWRlcl9MUEZQYXJzZSkoKTsKLXN0YXRpYyBjb25zdCBGWF9TQVhSZWFkZXJfTFBGUGFyc2UKLSAgICBnX0ZYX1NBWFJlYWRlcl9MUEZQYXJzZVtzdGF0aWNfY2FzdDxpbnQ+KENGWF9TYXhNb2RlOjpNQVgpXSA9IHsKLSAgICAgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlVGV4dCwKLSAgICAgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlTm9kZVN0YXJ0LAotICAgICAgICAmQ0ZYX1NBWFJlYWRlcjo6UGFyc2VEZWNsT3JDb21tZW50LAotICAgICAgICAmQ0ZYX1NBWFJlYWRlcjo6UGFyc2VEZWNsTm9kZSwKLSAgICAgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlQ29tbWVudCwKLSAgICAgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlQ29tbWVudENvbnRlbnQsCi0gICAgICAgICZDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ05hbWUsCi0gICAgICAgICZDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ0F0dHJpYnV0ZU5hbWUsCi0gICAgICAgICZDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ0F0dHJpYnV0ZUVxdWFsLAotICAgICAgICAmQ0ZYX1NBWFJlYWRlcjo6UGFyc2VUYWdBdHRyaWJ1dGVWYWx1ZSwKLSAgICAgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlTWF5YmVDbG9zZSwKLSAgICAgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlVGFnQ2xvc2UsCi0gICAgICAgICZDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ0VuZCwKLSAgICAgICAgJkNGWF9TQVhSZWFkZXI6OlBhcnNlVGFyZ2V0RGF0YSwKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1DRlhfU0FYRmlsZTo6Q0ZYX1NBWEZpbGUoKQotICAgIDogbV9kd1N0YXJ0KDApLAotICAgICAgbV9kd0VuZCgwKSwKLSAgICAgIG1fZHdDdXIoMCksCi0gICAgICBtX3BCdWYobnVsbHB0ciksCi0gICAgICBtX2R3QnVmU2l6ZSgwKSwKLSAgICAgIG1fZHdCdWZJbmRleCgwKSB7fQotCi1DRlhfU0FYRmlsZTo6fkNGWF9TQVhGaWxlKCkge30KLQotYm9vbCBDRlhfU0FYRmlsZTo6U3RhcnRGaWxlKGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdMZW4pIHsKLSAgQVNTRVJUKCFtX3BGaWxlICYmIHBGaWxlKTsKLSAgdWludDMyX3QgZHdTaXplID0gcEZpbGUtPkdldFNpemUoKTsKLSAgaWYgKGR3U3RhcnQgPj0gZHdTaXplKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoZHdMZW4gPT0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KC0xKSB8fCBkd1N0YXJ0ICsgZHdMZW4gPiBkd1NpemUpCi0gICAgZHdMZW4gPSBkd1NpemUgLSBkd1N0YXJ0OwotCi0gIGlmIChkd0xlbiA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBtX2R3QnVmU2l6ZSA9IHN0ZDo6bWluKGR3TGVuLCBrU2F4RmlsZUJ1ZlNpemUpOwotICBtX3BCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBtX2R3QnVmU2l6ZSk7Ci0gIGlmICghcEZpbGUtPlJlYWRCbG9jayhtX3BCdWYsIGR3U3RhcnQsIG1fZHdCdWZTaXplKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbV9kd1N0YXJ0ID0gZHdTdGFydDsKLSAgbV9kd0VuZCA9IGR3U3RhcnQgKyBkd0xlbjsKLSAgbV9kd0N1ciA9IGR3U3RhcnQ7Ci0gIG1fcEZpbGUgPSBwRmlsZTsKLSAgbV9kd0J1ZkluZGV4ID0gMDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0ZYX1NBWEZpbGU6OlJlYWROZXh0QmxvY2soKSB7Ci0gIEFTU0VSVChtX3BGaWxlKTsKLSAgdWludDMyX3QgZHdTaXplID0gbV9kd0VuZCAtIG1fZHdDdXI7Ci0gIGlmIChkd1NpemUgPT0gMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBtX2R3QnVmU2l6ZSA9IHN0ZDo6bWluKGR3U2l6ZSwga1NheEZpbGVCdWZTaXplKTsKLSAgaWYgKCFtX3BGaWxlLT5SZWFkQmxvY2sobV9wQnVmLCBtX2R3Q3VyLCBtX2R3QnVmU2l6ZSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgbV9kd0J1ZkluZGV4ID0gMDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ0ZYX1NBWEZpbGU6OlJlc2V0KCkgewotICBpZiAobV9wQnVmKSB7Ci0gICAgRlhfRnJlZShtX3BCdWYpOwotICAgIG1fcEJ1ZiA9IG51bGxwdHI7Ci0gIH0KLSAgbV9wRmlsZSA9IG51bGxwdHI7Ci19Ci0KLUNGWF9TQVhSZWFkZXI6OkNGWF9TQVhSZWFkZXIoKQotICAgIDogbV9GaWxlKCksCi0gICAgICBtX3BIYW5kbGVyKG51bGxwdHIpLAotICAgICAgbV9pU3RhdGUoLTEpLAotICAgICAgbV9kd0l0ZW1JRCgwKSwKLSAgICAgIG1faURhdGFTaXplKDI1NiksCi0gICAgICBtX2lOYW1lU2l6ZSgyNTYpLAotICAgICAgbV9kd1BhcnNlTW9kZSgwKSwKLSAgICAgIG1fcENvbW1lbnRDb250ZXh0KG51bGxwdHIpIHsKLSAgbV9wc3pEYXRhID0gRlhfQWxsb2ModWludDhfdCwgbV9pRGF0YVNpemUpOwotICBtX3Bzek5hbWUgPSBGWF9BbGxvYyh1aW50OF90LCBtX2lOYW1lU2l6ZSk7Ci19Ci1DRlhfU0FYUmVhZGVyOjp+Q0ZYX1NBWFJlYWRlcigpIHsKLSAgUmVzZXQoKTsKLSAgaWYgKG1fcHN6RGF0YSkgewotICAgIEZYX0ZyZWUobV9wc3pEYXRhKTsKLSAgICBtX3BzekRhdGEgPSBudWxscHRyOwotICB9Ci0gIGlmIChtX3Bzek5hbWUpIHsKLSAgICBGWF9GcmVlKG1fcHN6TmFtZSk7Ci0gICAgbV9wc3pOYW1lID0gbnVsbHB0cjsKLSAgfQotfQotCi12b2lkIENGWF9TQVhSZWFkZXI6OlJlc2V0KCkgewotICBtX0ZpbGUuUmVzZXQoKTsKLSAgd2hpbGUgKCFtX1N0YWNrLmVtcHR5KCkpCi0gICAgbV9TdGFjay5wb3AoKTsKLQotICBtX2R3SXRlbUlEID0gMDsKLSAgbV9Ta2lwU3RhY2suUmVtb3ZlQWxsKCk7Ci0gIG1fU2tpcENoYXIgPSAwOwotICBtX2lEYXRhTGVuZ3RoID0gMDsKLSAgbV9pRW50aXR5U3RhcnQgPSAtMTsKLSAgbV9pTmFtZUxlbmd0aCA9IDA7Ci0gIG1faURhdGFQb3MgPSAwOwotICBkZWxldGUgbV9wQ29tbWVudENvbnRleHQ7Ci0gIG1fcENvbW1lbnRDb250ZXh0ID0gbnVsbHB0cjsKLX0KLQotdm9pZCBDRlhfU0FYUmVhZGVyOjpQdXNoKCkgewotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1NBWEl0ZW0+IHBOZXcgPQotICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9TQVhJdGVtPigrK21fZHdJdGVtSUQpOwotICBpZiAoIW1fU3RhY2suZW1wdHkoKSkKLSAgICBwTmV3LT5tX2JTa2lwID0gbV9TdGFjay50b3AoKS0+bV9iU2tpcDsKLSAgbV9TdGFjay5wdXNoKHN0ZDo6bW92ZShwTmV3KSk7Ci19Ci0KLXZvaWQgQ0ZYX1NBWFJlYWRlcjo6UG9wKCkgewotICBpZiAoIW1fU3RhY2suZW1wdHkoKSkKLSAgICBtX1N0YWNrLnBvcCgpOwotfQotCi1DRlhfU0FYSXRlbSogQ0ZYX1NBWFJlYWRlcjo6R2V0Q3VycmVudEl0ZW0oKSBjb25zdCB7Ci0gIHJldHVybiBtX1N0YWNrLmVtcHR5KCkgPyBudWxscHRyIDogbV9TdGFjay50b3AoKS5nZXQoKTsKLX0KLQotdm9pZCBDRlhfU0FYUmVhZGVyOjpBcHBlbmREYXRhKHVpbnQ4X3QgY2gpIHsKLSAgUmVhbGxvY0RhdGFCdWZmZXIoKTsKLSAgbV9wc3pEYXRhW21faURhdGFQb3MrK10gPSBjaDsKLX0KLQotdm9pZCBDRlhfU0FYUmVhZGVyOjpBcHBlbmROYW1lKHVpbnQ4X3QgY2gpIHsKLSAgUmVhbGxvY05hbWVCdWZmZXIoKTsKLSAgbV9wc3pOYW1lW21faURhdGFQb3MrK10gPSBjaDsKLX0KLQotdm9pZCBDRlhfU0FYUmVhZGVyOjpSZWFsbG9jRGF0YUJ1ZmZlcigpIHsKLSAgaWYgKG1faURhdGFQb3MgPCBtX2lEYXRhU2l6ZSkgewotICAgIHJldHVybjsKLSAgfQotICBpZiAobV9pRGF0YVNpemUgPD0gMTAyNCAqIDEwMjQpIHsKLSAgICBtX2lEYXRhU2l6ZSAqPSAyOwotICB9IGVsc2UgewotICAgIG1faURhdGFTaXplICs9IDEwMjQgKiAxMDI0OwotICB9Ci0gIG1fcHN6RGF0YSA9ICh1aW50OF90KilGWF9SZWFsbG9jKHVpbnQ4X3QsIG1fcHN6RGF0YSwgbV9pRGF0YVNpemUpOwotfQotCi12b2lkIENGWF9TQVhSZWFkZXI6OlJlYWxsb2NOYW1lQnVmZmVyKCkgewotICBpZiAobV9pRGF0YVBvcyA8IG1faU5hbWVTaXplKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChtX2lOYW1lU2l6ZSA8PSAxMDI0ICogMTAyNCkgewotICAgIG1faU5hbWVTaXplICo9IDI7Ci0gIH0gZWxzZSB7Ci0gICAgbV9pTmFtZVNpemUgKz0gMTAyNCAqIDEwMjQ7Ci0gIH0KLSAgbV9wc3pOYW1lID0gKHVpbnQ4X3QqKUZYX1JlYWxsb2ModWludDhfdCwgbV9wc3pOYW1lLCBtX2lOYW1lU2l6ZSk7Ci19Ci0KLWJvb2wgQ0ZYX1NBWFJlYWRlcjo6U2tpcFNwYWNlKHVpbnQ4X3QgY2gpIHsKLSAgcmV0dXJuIChtX2R3UGFyc2VNb2RlICYgQ0ZYX1NheFBhcnNlTW9kZV9Ob3RTa2lwU3BhY2UpID09IDAgJiYgY2ggPCAweDIxOwotfQotCi1pbnQzMl90IENGWF9TQVhSZWFkZXI6OlN0YXJ0UGFyc2UoCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGUsCi0gICAgdWludDMyX3QgZHdTdGFydCwKLSAgICB1aW50MzJfdCBkd0xlbiwKLSAgICB1aW50MzJfdCBkd1BhcnNlTW9kZSkgewotICBtX2lTdGF0ZSA9IC0xOwotICBSZXNldCgpOwotICBpZiAoIW1fRmlsZS5TdGFydEZpbGUocEZpbGUsIGR3U3RhcnQsIGR3TGVuKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgbV9pU3RhdGUgPSAwOwotICBtX2VNb2RlID0gQ0ZYX1NheE1vZGU6OlRleHQ7Ci0gIG1fZVByZXZNb2RlID0gQ0ZYX1NheE1vZGU6OlRleHQ7Ci0gIG1fYkNoYXJEYXRhID0gZmFsc2U7Ci0gIG1fZHdEYXRhT2Zmc2V0ID0gMDsKLSAgbV9kd1BhcnNlTW9kZSA9IGR3UGFyc2VNb2RlOwotICBtX1N0YWNrLmVtcGxhY2UobmV3IENGWF9TQVhJdGVtKCsrbV9kd0l0ZW1JRCkpOwotICByZXR1cm4gMDsKLX0KLQotaW50MzJfdCBDRlhfU0FYUmVhZGVyOjpDb250aW51ZVBhcnNlKElGWF9QYXVzZSogcFBhdXNlKSB7Ci0gIGlmIChtX2lTdGF0ZSA8IDAgfHwgbV9pU3RhdGUgPiA5OSkgewotICAgIHJldHVybiBtX2lTdGF0ZTsKLSAgfQotICB3aGlsZSAobV9GaWxlLm1fZHdDdXIgPCBtX0ZpbGUubV9kd0VuZCkgewotICAgIHVpbnQzMl90JiBpbmRleCA9IG1fRmlsZS5tX2R3QnVmSW5kZXg7Ci0gICAgdWludDMyX3Qgc2l6ZSA9IG1fRmlsZS5tX2R3QnVmU2l6ZTsKLSAgICBjb25zdCB1aW50OF90KiBwQnVmID0gbV9GaWxlLm1fcEJ1ZjsKLSAgICB3aGlsZSAoaW5kZXggPCBzaXplKSB7Ci0gICAgICBtX0N1ckJ5dGUgPSBwQnVmW2luZGV4XTsKLSAgICAgICh0aGlzLT4qZ19GWF9TQVhSZWFkZXJfTFBGUGFyc2Vbc3RhdGljX2Nhc3Q8aW50PihtX2VNb2RlKV0pKCk7Ci0gICAgICBpbmRleCsrOwotICAgIH0KLSAgICBtX0ZpbGUubV9kd0N1ciArPSBpbmRleDsKLSAgICBtX2lTdGF0ZSA9IChtX0ZpbGUubV9kd0N1ciAtIG1fRmlsZS5tX2R3U3RhcnQpICogMTAwIC8KLSAgICAgICAgICAgICAgIChtX0ZpbGUubV9kd0VuZCAtIG1fRmlsZS5tX2R3U3RhcnQpOwotICAgIGlmIChtX0ZpbGUubV9kd0N1ciA+PSBtX0ZpbGUubV9kd0VuZCkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmICghbV9GaWxlLlJlYWROZXh0QmxvY2soKSkgewotICAgICAgbV9pU3RhdGUgPSAtMjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBtX2R3RGF0YU9mZnNldCA9IDA7Ci0gICAgaWYgKHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gbV9pU3RhdGU7Ci19Ci12b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlQ2hhcih1aW50OF90IGNoKSB7Ci0gIFJlYWxsb2NEYXRhQnVmZmVyKCk7Ci0gIG1fcHN6RGF0YVttX2lEYXRhUG9zXSA9IGNoOwotICBpZiAobV9pRW50aXR5U3RhcnQgPiAtMSAmJiBjaCA9PSAnOycpIHsKLSAgICBpbnQzMl90IGlTYXZlRW50aXR5U3RhcnQgPSBtX2lFbnRpdHlTdGFydDsKLSAgICBDRlhfQnl0ZVN0cmluZyBjc0VudGl0eShtX3BzekRhdGEgKyBtX2lFbnRpdHlTdGFydCArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pRGF0YVBvcyAtIG1faUVudGl0eVN0YXJ0IC0gMSk7Ci0gICAgaW50MzJfdCBpTGVuID0gY3NFbnRpdHkuR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKGlMZW4gPiAwKSB7Ci0gICAgICBpZiAoY3NFbnRpdHlbMF0gPT0gJyMnKSB7Ci0gICAgICAgIGlmICgobV9kd1BhcnNlTW9kZSAmIENGWF9TYXhQYXJzZU1vZGVfTm90Q29udmVydF9zaGFycCkgPT0gMCkgewotICAgICAgICAgIGNoID0gMDsKLSAgICAgICAgICB1aW50OF90IHc7Ci0gICAgICAgICAgaWYgKGlMZW4gPiAxICYmIGNzRW50aXR5WzFdID09ICd4JykgewotICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAyOyBpIDwgaUxlbjsgaSsrKSB7Ci0gICAgICAgICAgICAgIHcgPSBjc0VudGl0eVtpXTsKLSAgICAgICAgICAgICAgaWYgKHcgPj0gJzAnICYmIHcgPD0gJzknKSB7Ci0gICAgICAgICAgICAgICAgY2ggPSAoY2ggPDwgNCkgKyB3IC0gJzAnOwotICAgICAgICAgICAgICB9IGVsc2UgaWYgKHcgPj0gJ0EnICYmIHcgPD0gJ0YnKSB7Ci0gICAgICAgICAgICAgICAgY2ggPSAoY2ggPDwgNCkgKyB3IC0gNTU7Ci0gICAgICAgICAgICAgIH0gZWxzZSBpZiAodyA+PSAnYScgJiYgdyA8PSAnZicpIHsKLSAgICAgICAgICAgICAgICBjaCA9IChjaCA8PCA0KSArIHcgLSA4NzsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBpTGVuOyBpKyspIHsKLSAgICAgICAgICAgICAgdyA9IGNzRW50aXR5W2ldOwotICAgICAgICAgICAgICBpZiAodyA8ICcwJyB8fCB3ID4gJzknKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY2ggPSBjaCAqIDEwICsgdyAtICcwJzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGNoICE9IDApIHsKLSAgICAgICAgICAgIG1fcHN6RGF0YVttX2lFbnRpdHlTdGFydCsrXSA9IGNoOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGNzRW50aXR5LkNvbXBhcmUoImFtcCIpID09IDApIHsKLSAgICAgICAgICBpZiAoKG1fZHdQYXJzZU1vZGUgJiBDRlhfU2F4UGFyc2VNb2RlX05vdENvbnZlcnRfYW1wKSA9PSAwKSB7Ci0gICAgICAgICAgICBtX3BzekRhdGFbbV9pRW50aXR5U3RhcnQrK10gPSAnJic7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoImx0IikgPT0gMCkgewotICAgICAgICAgIGlmICgobV9kd1BhcnNlTW9kZSAmIENGWF9TYXhQYXJzZU1vZGVfTm90Q29udmVydF9sdCkgPT0gMCkgewotICAgICAgICAgICAgbV9wc3pEYXRhW21faUVudGl0eVN0YXJ0KytdID0gJzwnOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChjc0VudGl0eS5Db21wYXJlKCJndCIpID09IDApIHsKLSAgICAgICAgICBpZiAoKG1fZHdQYXJzZU1vZGUgJiBDRlhfU2F4UGFyc2VNb2RlX05vdENvbnZlcnRfZ3QpID09IDApIHsKLSAgICAgICAgICAgIG1fcHN6RGF0YVttX2lFbnRpdHlTdGFydCsrXSA9ICc+JzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY3NFbnRpdHkuQ29tcGFyZSgiYXBvcyIpID09IDApIHsKLSAgICAgICAgICBpZiAoKG1fZHdQYXJzZU1vZGUgJiBDRlhfU2F4UGFyc2VNb2RlX05vdENvbnZlcnRfYXBvcykgPT0gMCkgewotICAgICAgICAgICAgbV9wc3pEYXRhW21faUVudGl0eVN0YXJ0KytdID0gJ1wnJzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoY3NFbnRpdHkuQ29tcGFyZSgicXVvdCIpID09IDApIHsKLSAgICAgICAgICBpZiAoKG1fZHdQYXJzZU1vZGUgJiBDRlhfU2F4UGFyc2VNb2RlX05vdENvbnZlcnRfcXVvdCkgPT0gMCkgewotICAgICAgICAgICAgbV9wc3pEYXRhW21faUVudGl0eVN0YXJ0KytdID0gJ1wiJzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGlTYXZlRW50aXR5U3RhcnQgIT0gbV9pRW50aXR5U3RhcnQpIHsKLSAgICAgIG1faURhdGFQb3MgPSBtX2lFbnRpdHlTdGFydDsKLSAgICAgIG1faUVudGl0eVN0YXJ0ID0gLTE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1faURhdGFQb3MrKzsKLSAgICAgIG1faUVudGl0eVN0YXJ0ID0gLTE7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChtX2lFbnRpdHlTdGFydCA8IDAgJiYgY2ggPT0gJyYnKSB7Ci0gICAgICBtX2lFbnRpdHlTdGFydCA9IG1faURhdGFQb3M7Ci0gICAgfQotICAgIG1faURhdGFQb3MrKzsKLSAgfQotfQotCi12b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlVGV4dCgpIHsKLSAgaWYgKG1fQ3VyQnl0ZSA9PSAnPCcpIHsKLSAgICBpZiAobV9pRGF0YVBvcyA+IDApIHsKLSAgICAgIG1faURhdGFMZW5ndGggPSBtX2lEYXRhUG9zOwotICAgICAgbV9pRGF0YVBvcyA9IDA7Ci0gICAgICBpZiAobV9wSGFuZGxlcikgewotICAgICAgICBOb3RpZnlEYXRhKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIFB1c2goKTsKLSAgICBtX2R3Tm9kZVBvcyA9IG1fRmlsZS5tX2R3Q3VyICsgbV9GaWxlLm1fZHdCdWZJbmRleDsKLSAgICBtX2VNb2RlID0gQ0ZYX1NheE1vZGU6Ok5vZGVTdGFydDsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKG1faURhdGFQb3MgPCAxICYmIFNraXBTcGFjZShtX0N1ckJ5dGUpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIFBhcnNlQ2hhcihtX0N1ckJ5dGUpOwotfQotCi12b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlTm9kZVN0YXJ0KCkgewotICBpZiAobV9DdXJCeXRlID09ICc/JykgewotICAgIEdldEN1cnJlbnRJdGVtKCktPm1fZU5vZGUgPSBDRlhfU0FYSXRlbTo6VHlwZTo6SW5zdHJ1Y3Rpb247Ci0gICAgbV9lTW9kZSA9IENGWF9TYXhNb2RlOjpUYWdOYW1lOwotICAgIHJldHVybjsKLSAgfQotICBpZiAobV9DdXJCeXRlID09ICchJykgewotICAgIG1fZU1vZGUgPSBDRlhfU2F4TW9kZTo6RGVjbE9yQ29tbWVudDsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKG1fQ3VyQnl0ZSA9PSAnLycpIHsKLSAgICBtX2VNb2RlID0gQ0ZYX1NheE1vZGU6OlRhZ0VuZDsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKG1fQ3VyQnl0ZSA9PSAnPicpIHsKLSAgICBQb3AoKTsKLSAgICBtX2VNb2RlID0gQ0ZYX1NheE1vZGU6OlRleHQ7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChtX0N1ckJ5dGUgPiAweDIwKSB7Ci0gICAgbV9kd0RhdGFPZmZzZXQgPSBtX0ZpbGUubV9kd0J1ZkluZGV4OwotICAgIEdldEN1cnJlbnRJdGVtKCktPm1fZU5vZGUgPSBDRlhfU0FYSXRlbTo6VHlwZTo6VGFnOwotICAgIG1fZU1vZGUgPSBDRlhfU2F4TW9kZTo6VGFnTmFtZTsKLSAgICBBcHBlbmREYXRhKG1fQ3VyQnl0ZSk7Ci0gIH0KLX0KLQotdm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZURlY2xPckNvbW1lbnQoKSB7Ci0gIGlmIChtX0N1ckJ5dGUgPT0gJy0nKSB7Ci0gICAgbV9lTW9kZSA9IENGWF9TYXhNb2RlOjpDb21tZW50OwotICAgIEdldEN1cnJlbnRJdGVtKCktPm1fZU5vZGUgPSBDRlhfU0FYSXRlbTo6VHlwZTo6Q29tbWVudDsKLSAgICBpZiAoIW1fcENvbW1lbnRDb250ZXh0KQotICAgICAgbV9wQ29tbWVudENvbnRleHQgPSBuZXcgQ0ZYX1NBWENvbW1lbnRDb250ZXh0OwotCi0gICAgbV9wQ29tbWVudENvbnRleHQtPm1faUhlYWRlckNvdW50ID0gMTsKLSAgICBtX3BDb21tZW50Q29udGV4dC0+bV9pVGFpbENvdW50ID0gMDsKLSAgfSBlbHNlIHsKLSAgICBtX2VNb2RlID0gQ0ZYX1NheE1vZGU6OkRlY2xOb2RlOwotICAgIG1fZHdEYXRhT2Zmc2V0ID0gbV9GaWxlLm1fZHdCdWZJbmRleDsKLSAgICBtX1NraXBDaGFyID0gJz4nOwotICAgIG1fU2tpcFN0YWNrLkFkZCgnPicpOwotICAgIFNraXBOb2RlKCk7Ci0gIH0KLX0KLXZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VDb21tZW50KCkgewotICBtX3BDb21tZW50Q29udGV4dC0+bV9pSGVhZGVyQ291bnQgPSAyOwotICBtX2R3Tm9kZVBvcyA9IG1fRmlsZS5tX2R3Q3VyICsgbV9GaWxlLm1fZHdCdWZJbmRleDsKLSAgbV9lTW9kZSA9IENGWF9TYXhNb2RlOjpDb21tZW50Q29udGVudDsKLX0KLXZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VDb21tZW50Q29udGVudCgpIHsKLSAgaWYgKG1fQ3VyQnl0ZSA9PSAnLScpIHsKLSAgICBtX3BDb21tZW50Q29udGV4dC0+bV9pVGFpbENvdW50Kys7Ci0gIH0gZWxzZSBpZiAobV9DdXJCeXRlID09ICc+JyAmJiBtX3BDb21tZW50Q29udGV4dC0+bV9pVGFpbENvdW50ID09IDIpIHsKLSAgICBtX2lEYXRhTGVuZ3RoID0gbV9pRGF0YVBvczsKLSAgICBtX2lEYXRhUG9zID0gMDsKLSAgICBpZiAobV9wSGFuZGxlcikgewotICAgICAgTm90aWZ5VGFyZ2V0RGF0YSgpOwotICAgIH0KLSAgICBQb3AoKTsKLSAgICBtX2VNb2RlID0gQ0ZYX1NheE1vZGU6OlRleHQ7Ci0gIH0gZWxzZSB7Ci0gICAgd2hpbGUgKG1fcENvbW1lbnRDb250ZXh0LT5tX2lUYWlsQ291bnQgPiAwKSB7Ci0gICAgICBBcHBlbmREYXRhKCctJyk7Ci0gICAgICBtX3BDb21tZW50Q29udGV4dC0+bV9pVGFpbENvdW50LS07Ci0gICAgfQotICAgIEFwcGVuZERhdGEobV9DdXJCeXRlKTsKLSAgfQotfQotdm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZURlY2xOb2RlKCkgewotICBTa2lwTm9kZSgpOwotfQotdm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ05hbWUoKSB7Ci0gIGlmIChtX0N1ckJ5dGUgPCAweDIxIHx8IG1fQ3VyQnl0ZSA9PSAnLycgfHwgbV9DdXJCeXRlID09ICc+JyB8fAotICAgICAgbV9DdXJCeXRlID09ICc/JykgewotICAgIG1faURhdGFMZW5ndGggPSBtX2lEYXRhUG9zOwotICAgIG1faURhdGFQb3MgPSAwOwotICAgIGlmIChtX3BIYW5kbGVyKSB7Ci0gICAgICBOb3RpZnlFbnRlcigpOwotICAgIH0KLSAgICBpZiAobV9DdXJCeXRlIDwgMHgyMSkgewotICAgICAgbV9lTW9kZSA9IENGWF9TYXhNb2RlOjpUYWdBdHRyaWJ1dGVOYW1lOwotICAgIH0gZWxzZSBpZiAobV9DdXJCeXRlID09ICcvJyB8fCBtX0N1ckJ5dGUgPT0gJz8nKSB7Ci0gICAgICBtX2VQcmV2TW9kZSA9IG1fZU1vZGU7Ci0gICAgICBtX2VNb2RlID0gQ0ZYX1NheE1vZGU6OlRhZ01heWJlQ2xvc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChtX3BIYW5kbGVyKSB7Ci0gICAgICAgIE5vdGlmeUJyZWFrKCk7Ci0gICAgICB9Ci0gICAgICBtX2VNb2RlID0gQ0ZYX1NheE1vZGU6OlRleHQ7Ci0gICAgfQotICB9IGVsc2UgewotICAgIEFwcGVuZERhdGEobV9DdXJCeXRlKTsKLSAgfQotfQotdm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ0F0dHJpYnV0ZU5hbWUoKSB7Ci0gIGlmIChtX0N1ckJ5dGUgPCAweDIxIHx8IG1fQ3VyQnl0ZSA9PSAnPScpIHsKLSAgICBpZiAobV9pRGF0YVBvcyA8IDEgJiYgbV9DdXJCeXRlIDwgMHgyMSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtX2lOYW1lTGVuZ3RoID0gbV9pRGF0YVBvczsKLSAgICBtX2lEYXRhUG9zID0gMDsKLSAgICBtX1NraXBDaGFyID0gMDsKLSAgICBtX2VNb2RlID0gbV9DdXJCeXRlID09ICc9JyA/IENGWF9TYXhNb2RlOjpUYWdBdHRyaWJ1dGVWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ0ZYX1NheE1vZGU6OlRhZ0F0dHJpYnV0ZUVxdWFsOwotICAgIHJldHVybjsKLSAgfQotICBpZiAobV9DdXJCeXRlID09ICcvJyB8fCBtX0N1ckJ5dGUgPT0gJz4nIHx8IG1fQ3VyQnl0ZSA9PSAnPycpIHsKLSAgICBpZiAobV9DdXJCeXRlID09ICcvJyB8fCBtX0N1ckJ5dGUgPT0gJz8nKSB7Ci0gICAgICBtX2VQcmV2TW9kZSA9IG1fZU1vZGU7Ci0gICAgICBtX2VNb2RlID0gQ0ZYX1NheE1vZGU6OlRhZ01heWJlQ2xvc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChtX3BIYW5kbGVyKSB7Ci0gICAgICAgIE5vdGlmeUJyZWFrKCk7Ci0gICAgICB9Ci0gICAgICBtX2VNb2RlID0gQ0ZYX1NheE1vZGU6OlRleHQ7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotICBpZiAobV9pRGF0YVBvcyA8IDEpIHsKLSAgICBtX2R3RGF0YU9mZnNldCA9IG1fRmlsZS5tX2R3QnVmSW5kZXg7Ci0gIH0KLSAgQXBwZW5kTmFtZShtX0N1ckJ5dGUpOwotfQotCi12b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlVGFnQXR0cmlidXRlRXF1YWwoKSB7Ci0gIGlmIChtX0N1ckJ5dGUgPT0gJz0nKSB7Ci0gICAgbV9Ta2lwQ2hhciA9IDA7Ci0gICAgbV9lTW9kZSA9IENGWF9TYXhNb2RlOjpUYWdBdHRyaWJ1dGVWYWx1ZTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKEdldEN1cnJlbnRJdGVtKCktPm1fZU5vZGUgPT0gQ0ZYX1NBWEl0ZW06OlR5cGU6Okluc3RydWN0aW9uKSB7Ci0gICAgbV9pRGF0YVBvcyA9IG1faU5hbWVMZW5ndGg7Ci0gICAgQXBwZW5kTmFtZSgweDIwKTsKLSAgICBtX2VNb2RlID0gQ0ZYX1NheE1vZGU6OlRhcmdldERhdGE7Ci0gICAgUGFyc2VUYXJnZXREYXRhKCk7Ci0gIH0KLX0KLQotdm9pZCBDRlhfU0FYUmVhZGVyOjpQYXJzZVRhZ0F0dHJpYnV0ZVZhbHVlKCkgewotICBpZiAobV9Ta2lwQ2hhcikgewotICAgIGlmIChtX1NraXBDaGFyID09IG1fQ3VyQnl0ZSkgewotICAgICAgewotICAgICAgICBtX2lEYXRhTGVuZ3RoID0gbV9pRGF0YVBvczsKLSAgICAgICAgbV9pRGF0YVBvcyA9IDA7Ci0gICAgICAgIGlmIChtX3BIYW5kbGVyKSB7Ci0gICAgICAgICAgTm90aWZ5QXR0cmlidXRlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG1fU2tpcENoYXIgPSAwOwotICAgICAgbV9lTW9kZSA9IENGWF9TYXhNb2RlOjpUYWdBdHRyaWJ1dGVOYW1lOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBQYXJzZUNoYXIobV9DdXJCeXRlKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKG1fQ3VyQnl0ZSA8IDB4MjEpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKG1faURhdGFQb3MgPCAxKSB7Ci0gICAgaWYgKG1fQ3VyQnl0ZSA9PSAnXCcnIHx8IG1fQ3VyQnl0ZSA9PSAnXCInKSB7Ci0gICAgICBtX1NraXBDaGFyID0gbV9DdXJCeXRlOwotICAgIH0KLSAgfQotfQotCi12b2lkIENGWF9TQVhSZWFkZXI6OlBhcnNlTWF5YmVDbG9zZSgpIHsKLSAgaWYgKG1fQ3VyQnl0ZSA9PSAnPicpIHsKLSAgICBpZiAoR2V0Q3VycmVudEl0ZW0oKS0+bV9lTm9kZSA9PSBDRlhfU0FYSXRlbTo6VHlwZTo6SW5zdHJ1Y3Rpb24pIHsKLSAgICAgIG1faU5hbWVMZW5ndGggPSBtX2lEYXRhUG9zOwotICAgICAgbV9pRGF0YVBvcyA9IDA7Ci0gICAgICBpZiAobV9wSGFuZGxlcikgewotICAgICAgICBOb3RpZnlUYXJnZXREYXRhKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIFBhcnNlVGFnQ2xvc2UoKTsKLSAgICBtX2VNb2RlID0gQ0ZYX1NheE1vZGU6OlRleHQ7Ci0gIH0gZWxzZSBpZiAobV9lUHJldk1vZGUgPT0gQ0ZYX1NheE1vZGU6OlRhZ05hbWUpIHsKLSAgICBBcHBlbmREYXRhKCcvJyk7Ci0gICAgbV9lTW9kZSA9IENGWF9TYXhNb2RlOjpUYWdOYW1lOwotICAgIG1fZVByZXZNb2RlID0gQ0ZYX1NheE1vZGU6OlRleHQ7Ci0gICAgUGFyc2VUYWdOYW1lKCk7Ci0gIH0gZWxzZSBpZiAobV9lUHJldk1vZGUgPT0gQ0ZYX1NheE1vZGU6OlRhZ0F0dHJpYnV0ZU5hbWUpIHsKLSAgICBBcHBlbmROYW1lKCcvJyk7Ci0gICAgbV9lTW9kZSA9IENGWF9TYXhNb2RlOjpUYWdBdHRyaWJ1dGVOYW1lOwotICAgIG1fZVByZXZNb2RlID0gQ0ZYX1NheE1vZGU6OlRleHQ7Ci0gICAgUGFyc2VUYWdBdHRyaWJ1dGVOYW1lKCk7Ci0gIH0gZWxzZSBpZiAobV9lUHJldk1vZGUgPT0gQ0ZYX1NheE1vZGU6OlRhcmdldERhdGEpIHsKLSAgICBBcHBlbmROYW1lKCc/Jyk7Ci0gICAgbV9lTW9kZSA9IENGWF9TYXhNb2RlOjpUYXJnZXREYXRhOwotICAgIG1fZVByZXZNb2RlID0gQ0ZYX1NheE1vZGU6OlRleHQ7Ci0gICAgUGFyc2VUYXJnZXREYXRhKCk7Ci0gIH0KLX0KLXZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VUYWdDbG9zZSgpIHsKLSAgbV9kd05vZGVQb3MgPSBtX0ZpbGUubV9kd0N1ciArIG1fRmlsZS5tX2R3QnVmSW5kZXg7Ci0gIGlmIChtX3BIYW5kbGVyKSB7Ci0gICAgTm90aWZ5Q2xvc2UoKTsKLSAgfQotICBQb3AoKTsKLX0KLXZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VUYWdFbmQoKSB7Ci0gIGlmIChtX0N1ckJ5dGUgPCAweDIxKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChtX0N1ckJ5dGUgPT0gJz4nKSB7Ci0gICAgUG9wKCk7Ci0gICAgbV9kd05vZGVQb3MgPSBtX0ZpbGUubV9kd0N1ciArIG1fRmlsZS5tX2R3QnVmSW5kZXg7Ci0gICAgbV9pRGF0YUxlbmd0aCA9IG1faURhdGFQb3M7Ci0gICAgbV9pRGF0YVBvcyA9IDA7Ci0gICAgaWYgKG1fcEhhbmRsZXIpIHsKLSAgICAgIE5vdGlmeUVuZCgpOwotICAgIH0KLSAgICBQb3AoKTsKLSAgICBtX2VNb2RlID0gQ0ZYX1NheE1vZGU6OlRleHQ7Ci0gIH0gZWxzZSB7Ci0gICAgUGFyc2VDaGFyKG1fQ3VyQnl0ZSk7Ci0gIH0KLX0KLXZvaWQgQ0ZYX1NBWFJlYWRlcjo6UGFyc2VUYXJnZXREYXRhKCkgewotICBpZiAobV9DdXJCeXRlID09ICc/JykgewotICAgIG1fZVByZXZNb2RlID0gbV9lTW9kZTsKLSAgICBtX2VNb2RlID0gQ0ZYX1NheE1vZGU6OlRhZ01heWJlQ2xvc2U7Ci0gIH0gZWxzZSB7Ci0gICAgQXBwZW5kTmFtZShtX0N1ckJ5dGUpOwotICB9Ci19Ci12b2lkIENGWF9TQVhSZWFkZXI6OlNraXBOb2RlKCkgewotICBpbnQzMl90IGlMZW4gPSBtX1NraXBTdGFjay5HZXRTaXplKCk7Ci0gIGlmIChtX1NraXBDaGFyID09ICdcJycgfHwgbV9Ta2lwQ2hhciA9PSAnXCInKSB7Ci0gICAgaWYgKG1fQ3VyQnl0ZSAhPSBtX1NraXBDaGFyKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlMZW4tLTsKLSAgICBBU1NFUlQoaUxlbiA+IC0xKTsKLSAgICBtX1NraXBTdGFjay5SZW1vdmVBdChpTGVuLCAxKTsKLSAgICBtX1NraXBDaGFyID0gaUxlbiA/IG1fU2tpcFN0YWNrW2lMZW4gLSAxXSA6IDA7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHN3aXRjaCAobV9DdXJCeXRlKSB7Ci0gICAgY2FzZSAnPCc6Ci0gICAgICBtX1NraXBDaGFyID0gJz4nOwotICAgICAgbV9Ta2lwU3RhY2suQWRkKCc+Jyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdbJzoKLSAgICAgIG1fU2tpcENoYXIgPSAnXSc7Ci0gICAgICBtX1NraXBTdGFjay5BZGQoJ10nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgJygnOgotICAgICAgbV9Ta2lwQ2hhciA9ICcpJzsKLSAgICAgIG1fU2tpcFN0YWNrLkFkZCgnKScpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAnXCcnOgotICAgICAgbV9Ta2lwQ2hhciA9ICdcJyc7Ci0gICAgICBtX1NraXBTdGFjay5BZGQoJ1wnJyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlICdcIic6Ci0gICAgICBtX1NraXBDaGFyID0gJ1wiJzsKLSAgICAgIG1fU2tpcFN0YWNrLkFkZCgnXCInKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBpZiAobV9DdXJCeXRlID09IG1fU2tpcENoYXIpIHsKLSAgICAgICAgaUxlbi0tOwotICAgICAgICBtX1NraXBTdGFjay5SZW1vdmVBdChpTGVuLCAxKTsKLSAgICAgICAgbV9Ta2lwQ2hhciA9IGlMZW4gPyBtX1NraXBTdGFja1tpTGVuIC0gMV0gOiAwOwotICAgICAgICBpZiAoaUxlbiA9PSAwICYmIG1fQ3VyQnl0ZSA9PSAnPicpIHsKLSAgICAgICAgICBtX2lEYXRhTGVuZ3RoID0gbV9pRGF0YVBvczsKLSAgICAgICAgICBtX2lEYXRhUG9zID0gMDsKLSAgICAgICAgICBpZiAobV9pRGF0YUxlbmd0aCA+PSA5ICYmCi0gICAgICAgICAgICAgIEZYU1lTX21lbWNtcChtX3BzekRhdGEsICJbQ0RBVEFbIiwgNyAqIHNpemVvZih1aW50OF90KSkgPT0gMCAmJgotICAgICAgICAgICAgICBGWFNZU19tZW1jbXAobV9wc3pEYXRhICsgbV9pRGF0YUxlbmd0aCAtIDIsICJdXSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAyICogc2l6ZW9mKHVpbnQ4X3QpKSA9PSAwKSB7Ci0gICAgICAgICAgICBQb3AoKTsKLSAgICAgICAgICAgIG1faURhdGFMZW5ndGggLT0gOTsKLSAgICAgICAgICAgIG1fZHdEYXRhT2Zmc2V0ICs9IDc7Ci0gICAgICAgICAgICBGWFNZU19tZW1tb3ZlKG1fcHN6RGF0YSwgbV9wc3pEYXRhICsgNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pRGF0YUxlbmd0aCAqIHNpemVvZih1aW50OF90KSk7Ci0gICAgICAgICAgICBtX2JDaGFyRGF0YSA9IHRydWU7Ci0gICAgICAgICAgICBpZiAobV9wSGFuZGxlcikgewotICAgICAgICAgICAgICBOb3RpZnlEYXRhKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2JDaGFyRGF0YSA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBQb3AoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbV9lTW9kZSA9IENGWF9TYXhNb2RlOjpUZXh0OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgfQotICBpZiAoaUxlbiA+IDApIHsKLSAgICBQYXJzZUNoYXIobV9DdXJCeXRlKTsKLSAgfQotfQotCi12b2lkIENGWF9TQVhSZWFkZXI6Ok5vdGlmeURhdGEoKSB7Ci0gIENGWF9TQVhJdGVtKiBwSXRlbSA9IEdldEN1cnJlbnRJdGVtKCk7Ci0gIGlmICghcEl0ZW0pCi0gICAgcmV0dXJuOwotCi0gIGlmIChwSXRlbS0+bV9lTm9kZSA9PSBDRlhfU0FYSXRlbTo6VHlwZTo6VGFnKQotICAgIG1fcEhhbmRsZXItPk9uVGFnRGF0YSgKLSAgICAgICAgcEl0ZW0tPm1fcE5vZGUsCi0gICAgICAgIG1fYkNoYXJEYXRhID8gQ0ZYX1NBWEl0ZW06OlR5cGU6OkNoYXJEYXRhIDogQ0ZYX1NBWEl0ZW06OlR5cGU6OlRleHQsCi0gICAgICAgIENGWF9CeXRlU3RyaW5nQyhtX3BzekRhdGEsIG1faURhdGFMZW5ndGgpLAotICAgICAgICBtX0ZpbGUubV9kd0N1ciArIG1fZHdEYXRhT2Zmc2V0KTsKLX0KLQotdm9pZCBDRlhfU0FYUmVhZGVyOjpOb3RpZnlFbnRlcigpIHsKLSAgQ0ZYX1NBWEl0ZW0qIHBJdGVtID0gR2V0Q3VycmVudEl0ZW0oKTsKLSAgaWYgKHBJdGVtLT5tX2VOb2RlID09IENGWF9TQVhJdGVtOjpUeXBlOjpUYWcgfHwKLSAgICAgIHBJdGVtLT5tX2VOb2RlID09IENGWF9TQVhJdGVtOjpUeXBlOjpJbnN0cnVjdGlvbikgewotICAgIHBJdGVtLT5tX3BOb2RlID0gbV9wSGFuZGxlci0+T25UYWdFbnRlcigKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDKG1fcHN6RGF0YSwgbV9pRGF0YUxlbmd0aCksIHBJdGVtLT5tX2VOb2RlLCBtX2R3Tm9kZVBvcyk7Ci0gIH0KLX0KLQotdm9pZCBDRlhfU0FYUmVhZGVyOjpOb3RpZnlBdHRyaWJ1dGUoKSB7Ci0gIENGWF9TQVhJdGVtKiBwSXRlbSA9IEdldEN1cnJlbnRJdGVtKCk7Ci0gIGlmIChwSXRlbS0+bV9lTm9kZSA9PSBDRlhfU0FYSXRlbTo6VHlwZTo6VGFnIHx8Ci0gICAgICBwSXRlbS0+bV9lTm9kZSA9PSBDRlhfU0FYSXRlbTo6VHlwZTo6SW5zdHJ1Y3Rpb24pIHsKLSAgICBtX3BIYW5kbGVyLT5PblRhZ0F0dHJpYnV0ZShwSXRlbS0+bV9wTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MobV9wc3pOYW1lLCBtX2lOYW1lTGVuZ3RoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MobV9wc3pEYXRhLCBtX2lEYXRhTGVuZ3RoKSk7Ci0gIH0KLX0KLQotdm9pZCBDRlhfU0FYUmVhZGVyOjpOb3RpZnlCcmVhaygpIHsKLSAgQ0ZYX1NBWEl0ZW0qIHBJdGVtID0gR2V0Q3VycmVudEl0ZW0oKTsKLSAgaWYgKHBJdGVtLT5tX2VOb2RlID09IENGWF9TQVhJdGVtOjpUeXBlOjpUYWcpCi0gICAgbV9wSGFuZGxlci0+T25UYWdCcmVhayhwSXRlbS0+bV9wTm9kZSk7Ci19Ci0KLXZvaWQgQ0ZYX1NBWFJlYWRlcjo6Tm90aWZ5Q2xvc2UoKSB7Ci0gIENGWF9TQVhJdGVtKiBwSXRlbSA9IEdldEN1cnJlbnRJdGVtKCk7Ci0gIGlmIChwSXRlbS0+bV9lTm9kZSA9PSBDRlhfU0FYSXRlbTo6VHlwZTo6VGFnIHx8Ci0gICAgICBwSXRlbS0+bV9lTm9kZSA9PSBDRlhfU0FYSXRlbTo6VHlwZTo6SW5zdHJ1Y3Rpb24pIHsKLSAgICBtX3BIYW5kbGVyLT5PblRhZ0Nsb3NlKHBJdGVtLT5tX3BOb2RlLCBtX2R3Tm9kZVBvcyk7Ci0gIH0KLX0KLQotdm9pZCBDRlhfU0FYUmVhZGVyOjpOb3RpZnlFbmQoKSB7Ci0gIENGWF9TQVhJdGVtKiBwSXRlbSA9IEdldEN1cnJlbnRJdGVtKCk7Ci0gIGlmICghcEl0ZW0gfHwgcEl0ZW0tPm1fZU5vZGUgIT0gQ0ZYX1NBWEl0ZW06OlR5cGU6OlRhZykKLSAgICByZXR1cm47Ci0KLSAgbV9wSGFuZGxlci0+T25UYWdFbmQocEl0ZW0tPm1fcE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyhtX3BzekRhdGEsIG1faURhdGFMZW5ndGgpLCBtX2R3Tm9kZVBvcyk7Ci19Ci0KLXZvaWQgQ0ZYX1NBWFJlYWRlcjo6Tm90aWZ5VGFyZ2V0RGF0YSgpIHsKLSAgQ0ZYX1NBWEl0ZW0qIHBJdGVtID0gR2V0Q3VycmVudEl0ZW0oKTsKLSAgaWYgKHBJdGVtLT5tX2VOb2RlID09IENGWF9TQVhJdGVtOjpUeXBlOjpJbnN0cnVjdGlvbikgewotICAgIG1fcEhhbmRsZXItPk9uVGFyZ2V0RGF0YShwSXRlbS0+bV9wTm9kZSwgcEl0ZW0tPm1fZU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyhtX3Bzek5hbWUsIG1faU5hbWVMZW5ndGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2R3Tm9kZVBvcyk7Ci0gIH0gZWxzZSBpZiAocEl0ZW0tPm1fZU5vZGUgPT0gQ0ZYX1NBWEl0ZW06OlR5cGU6OkNvbW1lbnQpIHsKLSAgICBtX3BIYW5kbGVyLT5PblRhcmdldERhdGEocEl0ZW0tPm1fcE5vZGUsIHBJdGVtLT5tX2VOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MobV9wc3pEYXRhLCBtX2lEYXRhTGVuZ3RoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kd05vZGVQb3MpOwotICB9Ci19Ci0KLXZvaWQgQ0ZYX1NBWFJlYWRlcjo6U2tpcEN1cnJlbnROb2RlKCkgewotICBDRlhfU0FYSXRlbSogcEl0ZW0gPSBHZXRDdXJyZW50SXRlbSgpOwotICBpZiAoIXBJdGVtKQotICAgIHJldHVybjsKLQotICBwSXRlbS0+bV9iU2tpcCA9IHRydWU7Ci19Ci0KLXZvaWQgQ0ZYX1NBWFJlYWRlcjo6U2V0SGFuZGxlcihDWEZBX1NBWFJlYWRlckhhbmRsZXIqIHBIYW5kbGVyKSB7Ci0gIG1fcEhhbmRsZXIgPSBwSGFuZGxlcjsKLX0KZGlmZiAtLWdpdCBhL3hmYS9mZGUveG1sL2NmeF9zYXhyZWFkZXIuaCBiL3hmYS9mZGUveG1sL2NmeF9zYXhyZWFkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI5Mzk5ZC4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL3htbC9jZnhfc2F4cmVhZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GREVfWE1MX0NGWF9TQVhSRUFERVJfSF8KLSNkZWZpbmUgWEZBX0ZERV9YTUxfQ0ZYX1NBWFJFQURFUl9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHN0YWNrPgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgotCi1jbGFzcyBDWEZBX1NBWENvbnRleHQ7Ci0KLWNsYXNzIENGWF9TQVhJdGVtIHsKLSBwdWJsaWM6Ci0gIGVudW0gY2xhc3MgVHlwZSB7Ci0gICAgVW5rbm93biA9IDAsCi0gICAgSW5zdHJ1Y3Rpb24sCi0gICAgRGVjbGFyYXRpb24sCi0gICAgQ29tbWVudCwKLSAgICBUYWcsCi0gICAgVGV4dCwKLSAgICBDaGFyRGF0YSwKLSAgfTsKLQotICBleHBsaWNpdCBDRlhfU0FYSXRlbSh1aW50MzJfdCBpZCkKLSAgICAgIDogbV9wTm9kZShudWxscHRyKSwgbV9lTm9kZShUeXBlOjpVbmtub3duKSwgbV9kd0lEKGlkKSwgbV9iU2tpcChmYWxzZSkge30KLQotICBDWEZBX1NBWENvbnRleHQqIG1fcE5vZGU7Ci0gIFR5cGUgbV9lTm9kZTsKLSAgY29uc3QgdWludDMyX3QgbV9kd0lEOwotICBib29sIG1fYlNraXA7Ci19OwotCi1jbGFzcyBDRlhfU0FYRmlsZSB7Ci0gcHVibGljOgotICBDRlhfU0FYRmlsZSgpOwotICB+Q0ZYX1NBWEZpbGUoKTsKLQotICBib29sIFN0YXJ0RmlsZShjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZSwKLSAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGFydCwKLSAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdMZW4pOwotICBib29sIFJlYWROZXh0QmxvY2soKTsKLSAgdm9pZCBSZXNldCgpOwotCi0gIENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gbV9wRmlsZTsKLSAgdWludDMyX3QgbV9kd1N0YXJ0OwotICB1aW50MzJfdCBtX2R3RW5kOwotICB1aW50MzJfdCBtX2R3Q3VyOwotICB1aW50OF90KiBtX3BCdWY7Ci0gIHVpbnQzMl90IG1fZHdCdWZTaXplOwotICB1aW50MzJfdCBtX2R3QnVmSW5kZXg7Ci19OwotCi1jbGFzcyBDRlhfU0FYQ29tbWVudENvbnRleHQ7Ci1lbnVtIGNsYXNzIENGWF9TYXhNb2RlOwotCi1lbnVtIENGWF9TYXhQYXJzZU1vZGUgewotICBDRlhfU2F4UGFyc2VNb2RlX05vdENvbnZlcnRfYW1wID0gMSA8PCAwLAotICBDRlhfU2F4UGFyc2VNb2RlX05vdENvbnZlcnRfbHQgPSAxIDw8IDEsCi0gIENGWF9TYXhQYXJzZU1vZGVfTm90Q29udmVydF9ndCA9IDEgPDwgMiwKLSAgQ0ZYX1NheFBhcnNlTW9kZV9Ob3RDb252ZXJ0X2Fwb3MgPSAxIDw8IDMsCi0gIENGWF9TYXhQYXJzZU1vZGVfTm90Q29udmVydF9xdW90ID0gMSA8PCA0LAotICBDRlhfU2F4UGFyc2VNb2RlX05vdENvbnZlcnRfc2hhcnAgPSAxIDw8IDUsCi0gIENGWF9TYXhQYXJzZU1vZGVfTm90U2tpcFNwYWNlID0gMSA8PCA2Ci19OwotCi1jbGFzcyBDWEZBX1NBWFJlYWRlckhhbmRsZXI7Ci0KLWNsYXNzIENGWF9TQVhSZWFkZXIgewotIHB1YmxpYzoKLSAgQ0ZYX1NBWFJlYWRlcigpOwotICB+Q0ZYX1NBWFJlYWRlcigpOwotCi0gIGludDMyX3QgU3RhcnRQYXJzZShjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhcnQgPSAwLAotICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdMZW4gPSAtMSwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3UGFyc2VNb2RlID0gMCk7Ci0gIGludDMyX3QgQ29udGludWVQYXJzZShJRlhfUGF1c2UqIHBQYXVzZSA9IG51bGxwdHIpOwotICB2b2lkIFNraXBDdXJyZW50Tm9kZSgpOwotICB2b2lkIFNldEhhbmRsZXIoQ1hGQV9TQVhSZWFkZXJIYW5kbGVyKiBwSGFuZGxlcik7Ci0gIHZvaWQgQXBwZW5kRGF0YSh1aW50OF90IGNoKTsKLSAgdm9pZCBBcHBlbmROYW1lKHVpbnQ4X3QgY2gpOwotICB2b2lkIFBhcnNlVGV4dCgpOwotICB2b2lkIFBhcnNlTm9kZVN0YXJ0KCk7Ci0gIHZvaWQgUGFyc2VJbnN0cnVjdGlvbigpOwotICB2b2lkIFBhcnNlRGVjbE9yQ29tbWVudCgpOwotICB2b2lkIFBhcnNlRGVjbE5vZGUoKTsKLSAgdm9pZCBQYXJzZUNvbW1lbnQoKTsKLSAgdm9pZCBQYXJzZUNvbW1lbnRDb250ZW50KCk7Ci0gIHZvaWQgUGFyc2VUYWdOYW1lKCk7Ci0gIHZvaWQgUGFyc2VUYWdBdHRyaWJ1dGVOYW1lKCk7Ci0gIHZvaWQgUGFyc2VUYWdBdHRyaWJ1dGVFcXVhbCgpOwotICB2b2lkIFBhcnNlVGFnQXR0cmlidXRlVmFsdWUoKTsKLSAgdm9pZCBQYXJzZU1heWJlQ2xvc2UoKTsKLSAgdm9pZCBQYXJzZVRhZ0Nsb3NlKCk7Ci0gIHZvaWQgUGFyc2VUYWdFbmQoKTsKLSAgdm9pZCBQYXJzZVRhcmdldERhdGEoKTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgUmVzZXQoKTsKLSAgdm9pZCBQdXNoKCk7Ci0gIHZvaWQgUG9wKCk7Ci0gIENGWF9TQVhJdGVtKiBHZXRDdXJyZW50SXRlbSgpIGNvbnN0OwotICBib29sIFNraXBTcGFjZSh1aW50OF90IGNoKTsKLSAgdm9pZCBTa2lwTm9kZSgpOwotICB2b2lkIE5vdGlmeURhdGEoKTsKLSAgdm9pZCBOb3RpZnlFbnRlcigpOwotICB2b2lkIE5vdGlmeUF0dHJpYnV0ZSgpOwotICB2b2lkIE5vdGlmeUJyZWFrKCk7Ci0gIHZvaWQgTm90aWZ5Q2xvc2UoKTsKLSAgdm9pZCBOb3RpZnlFbmQoKTsKLSAgdm9pZCBOb3RpZnlUYXJnZXREYXRhKCk7Ci0gIHZvaWQgUmVhbGxvY0RhdGFCdWZmZXIoKTsKLSAgdm9pZCBSZWFsbG9jTmFtZUJ1ZmZlcigpOwotICB2b2lkIFBhcnNlQ2hhcih1aW50OF90IGNoKTsKLQotICBDRlhfU0FYRmlsZSBtX0ZpbGU7Ci0gIENYRkFfU0FYUmVhZGVySGFuZGxlciogbV9wSGFuZGxlcjsKLSAgaW50MzJfdCBtX2lTdGF0ZTsKLSAgc3RkOjpzdGFjazxzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1NBWEl0ZW0+PiBtX1N0YWNrOwotICB1aW50MzJfdCBtX2R3SXRlbUlEOwotICBDRlhfU2F4TW9kZSBtX2VNb2RlOwotICBDRlhfU2F4TW9kZSBtX2VQcmV2TW9kZTsKLSAgYm9vbCBtX2JDaGFyRGF0YTsKLSAgdWludDhfdCBtX0N1ckJ5dGU7Ci0gIHVpbnQzMl90IG1fZHdEYXRhT2Zmc2V0OwotICBDRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90PiBtX1NraXBTdGFjazsKLSAgdWludDhfdCBtX1NraXBDaGFyOwotICB1aW50MzJfdCBtX2R3Tm9kZVBvczsKLSAgdWludDhfdCogbV9wc3pEYXRhOwotICBpbnQzMl90IG1faURhdGFTaXplOwotICBpbnQzMl90IG1faURhdGFMZW5ndGg7Ci0gIGludDMyX3QgbV9pRW50aXR5U3RhcnQ7Ci0gIGludDMyX3QgbV9pRGF0YVBvczsKLSAgdWludDhfdCogbV9wc3pOYW1lOwotICBpbnQzMl90IG1faU5hbWVTaXplOwotICBpbnQzMl90IG1faU5hbWVMZW5ndGg7Ci0gIHVpbnQzMl90IG1fZHdQYXJzZU1vZGU7Ci0gIENGWF9TQVhDb21tZW50Q29udGV4dCogbV9wQ29tbWVudENvbnRleHQ7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GREVfWE1MX0NGWF9TQVhSRUFERVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZGUveG1sL2ZkZV94bWwuaCBiL3hmYS9mZGUveG1sL2ZkZV94bWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc3M2IzMC4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL3htbC9mZGVfeG1sLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZERV9YTUxfRkRFX1hNTF9IXwotI2RlZmluZSBYRkFfRkRFX1hNTF9GREVfWE1MX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotCi1lbnVtIGNsYXNzIEZERV9YbWxTeW50YXhSZXN1bHQgewotICBOb25lLAotICBJbnN0cnVjdGlvbk9wZW4sCi0gIEluc3RydWN0aW9uQ2xvc2UsCi0gIEVsZW1lbnRPcGVuLAotICBFbGVtZW50QnJlYWssCi0gIEVsZW1lbnRDbG9zZSwKLSAgVGFyZ2V0TmFtZSwKLSAgVGFnTmFtZSwKLSAgQXR0cmlOYW1lLAotICBBdHRyaVZhbHVlLAotICBUZXh0LAotICBDRGF0YSwKLSAgVGFyZ2V0RGF0YSwKLSAgRXJyb3IsCi0gIEVuZE9mU3RyaW5nCi19OwotCi1lbnVtIEZERV9YTUxOT0RFVFlQRSB7Ci0gIEZERV9YTUxOT0RFX1Vua25vd24gPSAwLAotICBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbiwKLSAgRkRFX1hNTE5PREVfRWxlbWVudCwKLSAgRkRFX1hNTE5PREVfVGV4dCwKLSAgRkRFX1hNTE5PREVfQ2hhckRhdGEsCi19OwotCi1zdHJ1Y3QgRkRFX1hNTE5PREUgewotICBpbnQzMl90IGlOb2RlTnVtOwotICBGREVfWE1MTk9ERVRZUEUgZU5vZGVUeXBlOwotfTsKLQotYm9vbCBGREVfSXNYTUxWYWxpZENoYXIoRlhfV0NIQVIgY2gpOwotCi0jZW5kaWYgIC8vIFhGQV9GREVfWE1MX0ZERV9YTUxfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZGUveG1sL2ZkZV94bWxfaW1wLmNwcCBiL3hmYS9mZGUveG1sL2ZkZV94bWxfaW1wLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNlMjc0Yi4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL3htbC9mZGVfeG1sX2ltcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODk3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9mZGUveG1sL2ZkZV94bWxfaW1wLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zYWZlX3R5cGVzLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2NydC9mZ2FzX2NvZGVwYWdlLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IHVpbnQzMl90IGtNYXhDaGFyUmFuZ2UgPSAweDEwZmZmZjsKLQotY29uc3QgdWludDE2X3QgZ19YTUxWYWxpZENoYXJSYW5nZVtdWzJdID0ge3sweDA5LCAweDA5fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwQSwgMHgwQX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MEQsIDB4MER9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDIwLCAweEQ3RkZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweEUwMDAsIDB4RkZGRH19OwotCi1ib29sIEZERV9Jc1hNTFdoaXRlU3BhY2UoRlhfV0NIQVIgY2gpIHsKLSAgcmV0dXJuIGNoID09IEwnICcgfHwgY2ggPT0gMHgwQSB8fCBjaCA9PSAweDBEIHx8IGNoID09IDB4MDk7Ci19Ci0KLXN0cnVjdCBGREVfWE1MTkFNRUNIQVIgewotICB1aW50MTZfdCB3U3RhcnQ7Ci0gIHVpbnQxNl90IHdFbmQ7Ci0gIGJvb2wgYlN0YXJ0Q2hhcjsKLX07Ci0KLWNvbnN0IEZERV9YTUxOQU1FQ0hBUiBnX1hNTE5hbWVDaGFyc1tdID0gewotICAgIHtMJy0nLCBMJy4nLCBmYWxzZX0sICAgIHtMJzAnLCBMJzknLCBmYWxzZX0sICAgICB7TCc6JywgTCc6JywgZmFsc2V9LAotICAgIHtMJ0EnLCBMJ1onLCB0cnVlfSwgICAgIHtMJ18nLCBMJ18nLCB0cnVlfSwgICAgICB7TCdhJywgTCd6JywgdHJ1ZX0sCi0gICAgezB4QjcsIDB4QjcsIGZhbHNlfSwgICAgezB4QzAsIDB4RDYsIHRydWV9LCAgICAgIHsweEQ4LCAweEY2LCB0cnVlfSwKLSAgICB7MHhGOCwgMHgwMkZGLCB0cnVlfSwgICB7MHgwMzAwLCAweDAzNkYsIGZhbHNlfSwgezB4MDM3MCwgMHgwMzdELCB0cnVlfSwKLSAgICB7MHgwMzdGLCAweDFGRkYsIHRydWV9LCB7MHgyMDBDLCAweDIwMEQsIHRydWV9LCAgezB4MjAzRiwgMHgyMDQwLCBmYWxzZX0sCi0gICAgezB4MjA3MCwgMHgyMThGLCB0cnVlfSwgezB4MkMwMCwgMHgyRkVGLCB0cnVlfSwgIHsweDMwMDEsIDB4RDdGRiwgdHJ1ZX0sCi0gICAgezB4RjkwMCwgMHhGRENGLCB0cnVlfSwgezB4RkRGMCwgMHhGRkZELCB0cnVlfSwKLX07Ci0KLWJvb2wgRkRFX0lzWE1MTmFtZUNoYXIoRlhfV0NIQVIgY2gsIGJvb2wgYkZpcnN0Q2hhcikgewotICBpbnQzMl90IGlTdGFydCA9IDA7Ci0gIGludDMyX3QgaUVuZCA9IEZYX0FycmF5U2l6ZShnX1hNTE5hbWVDaGFycykgLSAxOwotICB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpIHsKLSAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOwotICAgIGlmIChjaCA8IGdfWE1MTmFtZUNoYXJzW2lNaWRdLndTdGFydCkgewotICAgICAgaUVuZCA9IGlNaWQgLSAxOwotICAgIH0gZWxzZSBpZiAoY2ggPiBnX1hNTE5hbWVDaGFyc1tpTWlkXS53RW5kKSB7Ci0gICAgICBpU3RhcnQgPSBpTWlkICsgMTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGJGaXJzdENoYXIgPyBnX1hNTE5hbWVDaGFyc1tpTWlkXS5iU3RhcnRDaGFyIDogdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotYm9vbCBGREVfSXNYTUxWYWxpZENoYXIoRlhfV0NIQVIgY2gpIHsKLSAgaW50MzJfdCBpU3RhcnQgPSAwOwotICBpbnQzMl90IGlFbmQgPSBGWF9BcnJheVNpemUoZ19YTUxWYWxpZENoYXJSYW5nZSkgLSAxOwotICB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpIHsKLSAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOwotICAgIGlmIChjaCA8IGdfWE1MVmFsaWRDaGFyUmFuZ2VbaU1pZF1bMF0pIHsKLSAgICAgIGlFbmQgPSBpTWlkIC0gMTsKLSAgICB9IGVsc2UgaWYgKGNoID4gZ19YTUxWYWxpZENoYXJSYW5nZVtpTWlkXVsxXSkgewotICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLUNGREVfWE1MTm9kZTo6Q0ZERV9YTUxOb2RlKCkKLSAgICA6IG1fcFBhcmVudChudWxscHRyKSwKLSAgICAgIG1fcENoaWxkKG51bGxwdHIpLAotICAgICAgbV9wUHJpb3IobnVsbHB0ciksCi0gICAgICBtX3BOZXh0KG51bGxwdHIpIHt9Ci0KLUZERV9YTUxOT0RFVFlQRSBDRkRFX1hNTE5vZGU6OkdldFR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBGREVfWE1MTk9ERV9Vbmtub3duOwotfQotCi1DRkRFX1hNTE5vZGU6On5DRkRFX1hNTE5vZGUoKSB7Ci0gIERlbGV0ZUNoaWxkcmVuKCk7Ci19Ci0KLXZvaWQgQ0ZERV9YTUxOb2RlOjpEZWxldGVDaGlsZHJlbigpIHsKLSAgQ0ZERV9YTUxOb2RlKiBwQ2hpbGQgPSBtX3BDaGlsZDsKLSAgd2hpbGUgKHBDaGlsZCkgewotICAgIENGREVfWE1MTm9kZSogcE5leHQgPSBwQ2hpbGQtPm1fcE5leHQ7Ci0gICAgZGVsZXRlIHBDaGlsZDsKLSAgICBwQ2hpbGQgPSBwTmV4dDsKLSAgfQotICBtX3BDaGlsZCA9IG51bGxwdHI7Ci19Ci0KLWludDMyX3QgQ0ZERV9YTUxOb2RlOjpDb3VudENoaWxkTm9kZXMoKSBjb25zdCB7Ci0gIGludDMyX3QgaUNvdW50ID0gMDsKLSAgQ0ZERV9YTUxOb2RlKiBwQ2hpbGQgPSBtX3BDaGlsZDsKLSAgd2hpbGUgKHBDaGlsZCkgewotICAgIGlDb3VudCsrOwotICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsKLSAgfQotICByZXR1cm4gaUNvdW50OwotfQotCi1DRkRFX1hNTE5vZGUqIENGREVfWE1MTm9kZTo6R2V0Q2hpbGROb2RlKGludDMyX3QgaW5kZXgpIGNvbnN0IHsKLSAgQ0ZERV9YTUxOb2RlKiBwQ2hpbGQgPSBtX3BDaGlsZDsKLSAgd2hpbGUgKHBDaGlsZCkgewotICAgIGlmIChpbmRleCA9PSAwKSB7Ci0gICAgICByZXR1cm4gcENoaWxkOwotICAgIH0KLSAgICBpbmRleC0tOwotICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsKLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotaW50MzJfdCBDRkRFX1hNTE5vZGU6OkdldENoaWxkTm9kZUluZGV4KENGREVfWE1MTm9kZSogcE5vZGUpIGNvbnN0IHsKLSAgaW50MzJfdCBpbmRleCA9IDA7Ci0gIENGREVfWE1MTm9kZSogcENoaWxkID0gbV9wQ2hpbGQ7Ci0gIHdoaWxlIChwQ2hpbGQpIHsKLSAgICBpZiAocENoaWxkID09IHBOb2RlKSB7Ci0gICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotICAgIGluZGV4Kys7Ci0gICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0OwotICB9Ci0gIHJldHVybiAtMTsKLX0KLQotQ0ZERV9YTUxOb2RlKiBDRkRFX1hNTE5vZGU6OkdldFBhdGgoY29uc3QgRlhfV0NIQVIqIHBQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUXVhbGlmaWVkTmFtZSkgY29uc3QgewotICBBU1NFUlQocFBhdGgpOwotICBpZiAoaUxlbmd0aCA8IDApIHsKLSAgICBpTGVuZ3RoID0gRlhTWVNfd2NzbGVuKHBQYXRoKTsKLSAgfQotICBpZiAoaUxlbmd0aCA9PSAwKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgY3NQYXRoOwotICBjb25zdCBGWF9XQ0hBUiogcFN0YXJ0ID0gcFBhdGg7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwRW5kID0gcFBhdGggKyBpTGVuZ3RoOwotICBGWF9XQ0hBUiBjaDsKLSAgd2hpbGUgKHBTdGFydCA8IHBFbmQpIHsKLSAgICBjaCA9ICpwU3RhcnQrKzsKLSAgICBpZiAoY2ggPT0gTCcvJykgewotICAgICAgYnJlYWs7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNzUGF0aCArPSBjaDsKLSAgICB9Ci0gIH0KLSAgaUxlbmd0aCAtPSBwU3RhcnQgLSBwUGF0aDsKLSAgQ0ZERV9YTUxOb2RlKiBwRmluZCA9IG51bGxwdHI7Ci0gIGlmIChjc1BhdGguR2V0TGVuZ3RoKCkgPCAxKSB7Ci0gICAgcEZpbmQgPSBHZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6OlJvb3QpOwotICB9IGVsc2UgaWYgKGNzUGF0aC5Db21wYXJlKEwiLi4iKSA9PSAwKSB7Ci0gICAgcEZpbmQgPSBtX3BQYXJlbnQ7Ci0gIH0gZWxzZSBpZiAoY3NQYXRoLkNvbXBhcmUoTCIuIikgPT0gMCkgewotICAgIHBGaW5kID0gKENGREVfWE1MTm9kZSopdGhpczsKLSAgfSBlbHNlIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1RhZzsKLSAgICBDRkRFX1hNTE5vZGUqIHBOb2RlID0gbV9wQ2hpbGQ7Ci0gICAgd2hpbGUgKHBOb2RlKSB7Ci0gICAgICBpZiAocE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7Ci0gICAgICAgIGlmIChiUXVhbGlmaWVkTmFtZSkgewotICAgICAgICAgICgoQ0ZERV9YTUxFbGVtZW50KilwTm9kZSktPkdldFRhZ05hbWUod3NUYWcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICgoQ0ZERV9YTUxFbGVtZW50KilwTm9kZSktPkdldExvY2FsVGFnTmFtZSh3c1RhZyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdzVGFnLkNvbXBhcmUoY3NQYXRoKSA9PSAwKSB7Ci0gICAgICAgICAgaWYgKGlMZW5ndGggPCAxKSB7Ci0gICAgICAgICAgICBwRmluZCA9IHBOb2RlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwRmluZCA9IHBOb2RlLT5HZXRQYXRoKHBTdGFydCwgaUxlbmd0aCwgYlF1YWxpZmllZE5hbWUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAocEZpbmQpCi0gICAgICAgICAgICByZXR1cm4gcEZpbmQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHBOb2RlID0gcE5vZGUtPm1fcE5leHQ7Ci0gICAgfQotICB9Ci0gIGlmICghcEZpbmQgfHwgaUxlbmd0aCA8IDEpCi0gICAgcmV0dXJuIHBGaW5kOwotICByZXR1cm4gcEZpbmQtPkdldFBhdGgocFN0YXJ0LCBpTGVuZ3RoLCBiUXVhbGlmaWVkTmFtZSk7Ci19Ci0KLWludDMyX3QgQ0ZERV9YTUxOb2RlOjpJbnNlcnRDaGlsZE5vZGUoQ0ZERV9YTUxOb2RlKiBwTm9kZSwgaW50MzJfdCBpbmRleCkgewotICBwTm9kZS0+bV9wUGFyZW50ID0gdGhpczsKLSAgaWYgKCFtX3BDaGlsZCkgewotICAgIG1fcENoaWxkID0gcE5vZGU7Ci0gICAgcE5vZGUtPm1fcFByaW9yID0gbnVsbHB0cjsKLSAgICBwTm9kZS0+bV9wTmV4dCA9IG51bGxwdHI7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKGluZGV4ID09IDApIHsKLSAgICBwTm9kZS0+bV9wTmV4dCA9IG1fcENoaWxkOwotICAgIHBOb2RlLT5tX3BQcmlvciA9IG51bGxwdHI7Ci0gICAgbV9wQ2hpbGQtPm1fcFByaW9yID0gcE5vZGU7Ci0gICAgbV9wQ2hpbGQgPSBwTm9kZTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpbnQzMl90IGlDb3VudCA9IDA7Ci0gIENGREVfWE1MTm9kZSogcEZpbmQgPSBtX3BDaGlsZDsKLSAgd2hpbGUgKCsraUNvdW50ICE9IGluZGV4ICYmIHBGaW5kLT5tX3BOZXh0KSB7Ci0gICAgcEZpbmQgPSBwRmluZC0+bV9wTmV4dDsKLSAgfQotICBwTm9kZS0+bV9wUHJpb3IgPSBwRmluZDsKLSAgcE5vZGUtPm1fcE5leHQgPSBwRmluZC0+bV9wTmV4dDsKLSAgaWYgKHBGaW5kLT5tX3BOZXh0KQotICAgIHBGaW5kLT5tX3BOZXh0LT5tX3BQcmlvciA9IHBOb2RlOwotICBwRmluZC0+bV9wTmV4dCA9IHBOb2RlOwotICByZXR1cm4gaUNvdW50OwotfQotCi12b2lkIENGREVfWE1MTm9kZTo6UmVtb3ZlQ2hpbGROb2RlKENGREVfWE1MTm9kZSogcE5vZGUpIHsKLSAgQVNTRVJUKG1fcENoaWxkICYmIHBOb2RlKTsKLSAgaWYgKG1fcENoaWxkID09IHBOb2RlKSB7Ci0gICAgbV9wQ2hpbGQgPSBwTm9kZS0+bV9wTmV4dDsKLSAgfSBlbHNlIHsKLSAgICBwTm9kZS0+bV9wUHJpb3ItPm1fcE5leHQgPSBwTm9kZS0+bV9wTmV4dDsKLSAgfQotICBpZiAocE5vZGUtPm1fcE5leHQpCi0gICAgcE5vZGUtPm1fcE5leHQtPm1fcFByaW9yID0gcE5vZGUtPm1fcFByaW9yOwotICBwTm9kZS0+bV9wUGFyZW50ID0gbnVsbHB0cjsKLSAgcE5vZGUtPm1fcE5leHQgPSBudWxscHRyOwotICBwTm9kZS0+bV9wUHJpb3IgPSBudWxscHRyOwotfQotCi1DRkRFX1hNTE5vZGUqIENGREVfWE1MTm9kZTo6R2V0Tm9kZUl0ZW0oQ0ZERV9YTUxOb2RlOjpOb2RlSXRlbSBlSXRlbSkgY29uc3QgewotICBzd2l0Y2ggKGVJdGVtKSB7Ci0gICAgY2FzZSBDRkRFX1hNTE5vZGU6OlJvb3Q6IHsKLSAgICAgIENGREVfWE1MTm9kZSogcFBhcmVudCA9IChDRkRFX1hNTE5vZGUqKXRoaXM7Ci0gICAgICB3aGlsZSAocFBhcmVudC0+bV9wUGFyZW50KSB7Ci0gICAgICAgIHBQYXJlbnQgPSBwUGFyZW50LT5tX3BQYXJlbnQ7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcFBhcmVudDsKLSAgICB9Ci0gICAgY2FzZSBDRkRFX1hNTE5vZGU6OlBhcmVudDoKLSAgICAgIHJldHVybiBtX3BQYXJlbnQ7Ci0gICAgY2FzZSBDRkRFX1hNTE5vZGU6OkZpcnN0U2libGluZzogewotICAgICAgQ0ZERV9YTUxOb2RlKiBwSXRlbSA9IChDRkRFX1hNTE5vZGUqKXRoaXM7Ci0gICAgICB3aGlsZSAocEl0ZW0tPm1fcFByaW9yKSB7Ci0gICAgICAgIHBJdGVtID0gcEl0ZW0tPm1fcFByaW9yOwotICAgICAgfQotICAgICAgcmV0dXJuIHBJdGVtID09IChDRkRFX1hNTE5vZGUqKXRoaXMgPyBudWxscHRyIDogcEl0ZW07Ci0gICAgfQotICAgIGNhc2UgQ0ZERV9YTUxOb2RlOjpQcmlvclNpYmxpbmc6Ci0gICAgICByZXR1cm4gbV9wUHJpb3I7Ci0gICAgY2FzZSBDRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nOgotICAgICAgcmV0dXJuIG1fcE5leHQ7Ci0gICAgY2FzZSBDRkRFX1hNTE5vZGU6Okxhc3RTaWJsaW5nOiB7Ci0gICAgICBDRkRFX1hNTE5vZGUqIHBJdGVtID0gKENGREVfWE1MTm9kZSopdGhpczsKLSAgICAgIHdoaWxlIChwSXRlbS0+bV9wTmV4dCkKLSAgICAgICAgcEl0ZW0gPSBwSXRlbS0+bV9wTmV4dDsKLSAgICAgIHJldHVybiBwSXRlbSA9PSAoQ0ZERV9YTUxOb2RlKil0aGlzID8gbnVsbHB0ciA6IHBJdGVtOwotICAgIH0KLSAgICBjYXNlIENGREVfWE1MTm9kZTo6Rmlyc3ROZWlnaGJvcjogewotICAgICAgQ0ZERV9YTUxOb2RlKiBwUGFyZW50ID0gKENGREVfWE1MTm9kZSopdGhpczsKLSAgICAgIHdoaWxlIChwUGFyZW50LT5tX3BQYXJlbnQpCi0gICAgICAgIHBQYXJlbnQgPSBwUGFyZW50LT5tX3BQYXJlbnQ7Ci0gICAgICByZXR1cm4gcFBhcmVudCA9PSAoQ0ZERV9YTUxOb2RlKil0aGlzID8gbnVsbHB0ciA6IHBQYXJlbnQ7Ci0gICAgfQotICAgIGNhc2UgQ0ZERV9YTUxOb2RlOjpQcmlvck5laWdoYm9yOiB7Ci0gICAgICBpZiAoIW1fcFByaW9yKQotICAgICAgICByZXR1cm4gbV9wUGFyZW50OwotCi0gICAgICBDRkRFX1hNTE5vZGUqIHBJdGVtID0gbV9wUHJpb3I7Ci0gICAgICB3aGlsZSAocEl0ZW0tPm1fcENoaWxkKSB7Ci0gICAgICAgIHBJdGVtID0gcEl0ZW0tPm1fcENoaWxkOwotICAgICAgICB3aGlsZSAocEl0ZW0tPm1fcE5leHQpCi0gICAgICAgICAgcEl0ZW0gPSBwSXRlbS0+bV9wTmV4dDsKLSAgICAgIH0KLSAgICAgIHJldHVybiBwSXRlbTsKLSAgICB9Ci0gICAgY2FzZSBDRkRFX1hNTE5vZGU6Ok5leHROZWlnaGJvcjogewotICAgICAgaWYgKG1fcENoaWxkKQotICAgICAgICByZXR1cm4gbV9wQ2hpbGQ7Ci0gICAgICBpZiAobV9wTmV4dCkKLSAgICAgICAgcmV0dXJuIG1fcE5leHQ7Ci0gICAgICBDRkRFX1hNTE5vZGUqIHBJdGVtID0gbV9wUGFyZW50OwotICAgICAgd2hpbGUgKHBJdGVtKSB7Ci0gICAgICAgIGlmIChwSXRlbS0+bV9wTmV4dCkKLSAgICAgICAgICByZXR1cm4gcEl0ZW0tPm1fcE5leHQ7Ci0gICAgICAgIHBJdGVtID0gcEl0ZW0tPm1fcFBhcmVudDsKLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICBjYXNlIENGREVfWE1MTm9kZTo6TGFzdE5laWdoYm9yOiB7Ci0gICAgICBDRkRFX1hNTE5vZGUqIHBJdGVtID0gKENGREVfWE1MTm9kZSopdGhpczsKLSAgICAgIHdoaWxlIChwSXRlbS0+bV9wUGFyZW50KSB7Ci0gICAgICAgIHBJdGVtID0gcEl0ZW0tPm1fcFBhcmVudDsKLSAgICAgIH0KLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHdoaWxlIChwSXRlbS0+bV9wTmV4dCkKLSAgICAgICAgICBwSXRlbSA9IHBJdGVtLT5tX3BOZXh0OwotICAgICAgICBpZiAoIXBJdGVtLT5tX3BDaGlsZCkKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgcEl0ZW0gPSBwSXRlbS0+bV9wQ2hpbGQ7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcEl0ZW0gPT0gKENGREVfWE1MTm9kZSopdGhpcyA/IG51bGxwdHIgOiBwSXRlbTsKLSAgICB9Ci0gICAgY2FzZSBDRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQ6Ci0gICAgICByZXR1cm4gbV9wQ2hpbGQ7Ci0gICAgY2FzZSBDRkRFX1hNTE5vZGU6Okxhc3RDaGlsZDogewotICAgICAgaWYgKCFtX3BDaGlsZCkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICAgIENGREVfWE1MTm9kZSogcENoaWxkID0gbV9wQ2hpbGQ7Ci0gICAgICB3aGlsZSAocENoaWxkLT5tX3BOZXh0KQotICAgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPm1fcE5leHQ7Ci0gICAgICByZXR1cm4gcENoaWxkOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLWludDMyX3QgQ0ZERV9YTUxOb2RlOjpHZXROb2RlTGV2ZWwoKSBjb25zdCB7Ci0gIGludDMyX3QgaUxldmVsID0gMDsKLSAgY29uc3QgQ0ZERV9YTUxOb2RlKiBwSXRlbSA9IG1fcFBhcmVudDsKLSAgd2hpbGUgKHBJdGVtKSB7Ci0gICAgaUxldmVsKys7Ci0gICAgcEl0ZW0gPSBwSXRlbS0+bV9wUGFyZW50OwotICB9Ci0gIHJldHVybiBpTGV2ZWw7Ci19Ci0KLWJvb2wgQ0ZERV9YTUxOb2RlOjpJbnNlcnROb2RlSXRlbShDRkRFX1hNTE5vZGU6Ok5vZGVJdGVtIGVJdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfWE1MTm9kZSogcE5vZGUpIHsKLSAgc3dpdGNoIChlSXRlbSkgewotICAgIGNhc2UgQ0ZERV9YTUxOb2RlOjpOZXh0U2libGluZzogewotICAgICAgcE5vZGUtPm1fcFBhcmVudCA9IG1fcFBhcmVudDsKLSAgICAgIHBOb2RlLT5tX3BOZXh0ID0gbV9wTmV4dDsKLSAgICAgIHBOb2RlLT5tX3BQcmlvciA9IHRoaXM7Ci0gICAgICBpZiAobV9wTmV4dCkgewotICAgICAgICBtX3BOZXh0LT5tX3BQcmlvciA9IHBOb2RlOwotICAgICAgfQotICAgICAgbV9wTmV4dCA9IHBOb2RlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNhc2UgQ0ZERV9YTUxOb2RlOjpQcmlvclNpYmxpbmc6IHsKLSAgICAgIHBOb2RlLT5tX3BQYXJlbnQgPSBtX3BQYXJlbnQ7Ci0gICAgICBwTm9kZS0+bV9wTmV4dCA9IHRoaXM7Ci0gICAgICBwTm9kZS0+bV9wUHJpb3IgPSBtX3BQcmlvcjsKLSAgICAgIGlmIChtX3BQcmlvcikgewotICAgICAgICBtX3BQcmlvci0+bV9wTmV4dCA9IHBOb2RlOwotICAgICAgfSBlbHNlIGlmIChtX3BQYXJlbnQpIHsKLSAgICAgICAgbV9wUGFyZW50LT5tX3BDaGlsZCA9IHBOb2RlOwotICAgICAgfQotICAgICAgbV9wUHJpb3IgPSBwTm9kZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLUNGREVfWE1MTm9kZSogQ0ZERV9YTUxOb2RlOjpSZW1vdmVOb2RlSXRlbShDRkRFX1hNTE5vZGU6Ok5vZGVJdGVtIGVJdGVtKSB7Ci0gIENGREVfWE1MTm9kZSogcE5vZGUgPSBudWxscHRyOwotICBzd2l0Y2ggKGVJdGVtKSB7Ci0gICAgY2FzZSBDRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nOgotICAgICAgaWYgKG1fcE5leHQpIHsKLSAgICAgICAgcE5vZGUgPSBtX3BOZXh0OwotICAgICAgICBtX3BOZXh0ID0gcE5vZGUtPm1fcE5leHQ7Ci0gICAgICAgIGlmIChtX3BOZXh0KSB7Ci0gICAgICAgICAgbV9wTmV4dC0+bV9wUHJpb3IgPSB0aGlzOwotICAgICAgICB9Ci0gICAgICAgIHBOb2RlLT5tX3BQYXJlbnQgPSBudWxscHRyOwotICAgICAgICBwTm9kZS0+bV9wTmV4dCA9IG51bGxwdHI7Ci0gICAgICAgIHBOb2RlLT5tX3BQcmlvciA9IG51bGxwdHI7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIHBOb2RlOwotfQotCi1DRkRFX1hNTE5vZGUqIENGREVfWE1MTm9kZTo6Q2xvbmUoYm9vbCBiUmVjdXJzaXZlKSB7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi12b2lkIENGREVfWE1MTm9kZTo6U2F2ZVhNTE5vZGUoY29uc3QgQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+JiBwWE1MU3RyZWFtKSB7Ci0gIENGREVfWE1MTm9kZSogcE5vZGUgPSAoQ0ZERV9YTUxOb2RlKil0aGlzOwotICBzd2l0Y2ggKHBOb2RlLT5HZXRUeXBlKCkpIHsKLSAgICBjYXNlIEZERV9YTUxOT0RFX0luc3RydWN0aW9uOiB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3czsKLSAgICAgIENGREVfWE1MSW5zdHJ1Y3Rpb24qIHBJbnN0cnVjdGlvbiA9IChDRkRFX1hNTEluc3RydWN0aW9uKilwTm9kZTsKLSAgICAgIGlmIChwSW5zdHJ1Y3Rpb24tPm1fd3NUYXJnZXQuQ29tcGFyZU5vQ2FzZShMInhtbCIpID09IDApIHsKLSAgICAgICAgd3MgPSBMIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIiI7Ci0gICAgICAgIHVpbnQxNl90IHdDb2RlUGFnZSA9IHBYTUxTdHJlYW0tPkdldENvZGVQYWdlKCk7Ci0gICAgICAgIGlmICh3Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGMTZMRSkgewotICAgICAgICAgIHdzICs9IEwiVVRGLTE2IjsKLSAgICAgICAgfSBlbHNlIGlmICh3Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGMTZCRSkgewotICAgICAgICAgIHdzICs9IEwiVVRGLTE2YmUiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHdzICs9IEwiVVRGLTgiOwotICAgICAgICB9Ci0gICAgICAgIHdzICs9IEwiXCI/PiI7Ci0gICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLmNfc3RyKCksIHdzLkdldExlbmd0aCgpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHdzLkZvcm1hdChMIjw/JXMiLCBwSW5zdHJ1Y3Rpb24tPm1fd3NUYXJnZXQuY19zdHIoKSk7Ci0gICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLmNfc3RyKCksIHdzLkdldExlbmd0aCgpKTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+JiBhdHRyaWJ1dGVzID0gcEluc3RydWN0aW9uLT5tX0F0dHJpYnV0ZXM7Ci0gICAgICAgIGludDMyX3QgaTsKLSAgICAgICAgaW50MzJfdCBpQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KGF0dHJpYnV0ZXMpOwotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsKLSAgICAgICAgICB3cyA9IEwiICI7Ci0gICAgICAgICAgd3MgKz0gYXR0cmlidXRlc1tpXTsKLSAgICAgICAgICB3cyArPSBMIj1cIiI7Ci0gICAgICAgICAgd3NWYWx1ZSA9IGF0dHJpYnV0ZXNbaSArIDFdOwotICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIiYiLCBMIiZhbXA7Iik7Ci0gICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiPCIsIEwiJmx0OyIpOwotICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIj4iLCBMIiZndDsiKTsKLSAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCJcJyIsIEwiJmFwb3M7Iik7Ci0gICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiXCIiLCBMIiZxdW90OyIpOwotICAgICAgICAgIHdzICs9IHdzVmFsdWU7Ci0gICAgICAgICAgd3MgKz0gTCJcIiI7Ci0gICAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MuY19zdHIoKSwgd3MuR2V0TGVuZ3RoKCkpOwotICAgICAgICB9Ci0gICAgICAgIHN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nPiYgdGFyZ2V0ZGF0YSA9IHBJbnN0cnVjdGlvbi0+bV9UYXJnZXREYXRhOwotICAgICAgICBpQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHRhcmdldGRhdGEpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKLSAgICAgICAgICB3cyA9IEwiIFwiIjsKLSAgICAgICAgICB3cyArPSB0YXJnZXRkYXRhW2ldOwotICAgICAgICAgIHdzICs9IEwiXCIiOwotICAgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLmNfc3RyKCksIHdzLkdldExlbmd0aCgpKTsKLSAgICAgICAgfQotICAgICAgICB3cyA9IEwiPz4iOwotICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cy5jX3N0cigpLCB3cy5HZXRMZW5ndGgoKSk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEZERV9YTUxOT0RFX0VsZW1lbnQ6IHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzOwotICAgICAgd3MgPSBMIjwiOwotICAgICAgd3MgKz0gKChDRkRFX1hNTEVsZW1lbnQqKXBOb2RlKS0+bV93c1RhZzsKLSAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLmNfc3RyKCksIHdzLkdldExlbmd0aCgpKTsKLSAgICAgIHN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nPiYgYXR0cmlidXRlcyA9Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4ocE5vZGUpLT5tX0F0dHJpYnV0ZXM7Ci0gICAgICBpbnQzMl90IGlDb3VudCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4oYXR0cmlidXRlcyk7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOwotICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsKLSAgICAgICAgd3MgPSBMIiAiOwotICAgICAgICB3cyArPSBhdHRyaWJ1dGVzW2ldOwotICAgICAgICB3cyArPSBMIj1cIiI7Ci0gICAgICAgIHdzVmFsdWUgPSBhdHRyaWJ1dGVzW2kgKyAxXTsKLSAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiJiIsIEwiJmFtcDsiKTsKLSAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiPCIsIEwiJmx0OyIpOwotICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCI+IiwgTCImZ3Q7Iik7Ci0gICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIlwnIiwgTCImYXBvczsiKTsKLSAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiXCIiLCBMIiZxdW90OyIpOwotICAgICAgICB3cyArPSB3c1ZhbHVlOwotICAgICAgICB3cyArPSBMIlwiIjsKLSAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MuY19zdHIoKSwgd3MuR2V0TGVuZ3RoKCkpOwotICAgICAgfQotICAgICAgaWYgKHBOb2RlLT5tX3BDaGlsZCkgewotICAgICAgICB3cyA9IEwiXG4+IjsKLSAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MuY19zdHIoKSwgd3MuR2V0TGVuZ3RoKCkpOwotICAgICAgICBDRkRFX1hNTE5vZGUqIHBDaGlsZCA9IHBOb2RlLT5tX3BDaGlsZDsKLSAgICAgICAgd2hpbGUgKHBDaGlsZCkgewotICAgICAgICAgIHBDaGlsZC0+U2F2ZVhNTE5vZGUocFhNTFN0cmVhbSk7Ci0gICAgICAgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0OwotICAgICAgICB9Ci0gICAgICAgIHdzID0gTCI8LyI7Ci0gICAgICAgIHdzICs9ICgoQ0ZERV9YTUxFbGVtZW50KilwTm9kZSktPm1fd3NUYWc7Ci0gICAgICAgIHdzICs9IEwiXG4+IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHdzID0gTCJcbi8+IjsKLSAgICAgIH0KLSAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLmNfc3RyKCksIHdzLkdldExlbmd0aCgpKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgRkRFX1hNTE5PREVfVGV4dDogewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3MgPSAoKENGREVfWE1MVGV4dCopcE5vZGUpLT5tX3dzVGV4dDsKLSAgICAgIHdzLlJlcGxhY2UoTCImIiwgTCImYW1wOyIpOwotICAgICAgd3MuUmVwbGFjZShMIjwiLCBMIiZsdDsiKTsKLSAgICAgIHdzLlJlcGxhY2UoTCI+IiwgTCImZ3Q7Iik7Ci0gICAgICB3cy5SZXBsYWNlKEwiXCciLCBMIiZhcG9zOyIpOwotICAgICAgd3MuUmVwbGFjZShMIlwiIiwgTCImcXVvdDsiKTsKLSAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLmNfc3RyKCksIHdzLkdldExlbmd0aCgpKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgRkRFX1hNTE5PREVfQ2hhckRhdGE6IHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzID0gTCI8IVtDREFUQVsiOwotICAgICAgd3MgKz0gKChDRkRFX1hNTENoYXJEYXRhKilwTm9kZSktPm1fd3NDaGFyRGF0YTsKLSAgICAgIHdzICs9IEwiXV0+IjsKLSAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLmNfc3RyKCksIHdzLkdldExlbmd0aCgpKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgRkRFX1hNTE5PREVfVW5rbm93bjoKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIENGREVfWE1MTm9kZTo6Q2xvbmVDaGlsZHJlbihDRkRFX1hNTE5vZGUqIHBDbG9uZSkgewotICBpZiAoIW1fcENoaWxkKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENGREVfWE1MTm9kZSogcE5leHQgPSBtX3BDaGlsZDsKLSAgQ0ZERV9YTUxOb2RlKiBwQ2xvbmVOZXh0ID0gcE5leHQtPkNsb25lKHRydWUpOwotICBwQ2xvbmUtPkluc2VydENoaWxkTm9kZShwQ2xvbmVOZXh0KTsKLSAgcE5leHQgPSBwTmV4dC0+bV9wTmV4dDsKLSAgd2hpbGUgKHBOZXh0KSB7Ci0gICAgQ0ZERV9YTUxOb2RlKiBwQ2hpbGQgPSBwTmV4dC0+Q2xvbmUodHJ1ZSk7Ci0gICAgcENsb25lTmV4dC0+SW5zZXJ0Tm9kZUl0ZW0oQ0ZERV9YTUxOb2RlOjpOZXh0U2libGluZywgcENoaWxkKTsKLSAgICBwQ2xvbmVOZXh0ID0gcENoaWxkOwotICAgIHBOZXh0ID0gcE5leHQtPm1fcE5leHQ7Ci0gIH0KLX0KLQotQ0ZERV9YTUxJbnN0cnVjdGlvbjo6Q0ZERV9YTUxJbnN0cnVjdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUYXJnZXQpCi0gICAgOiBtX3dzVGFyZ2V0KHdzVGFyZ2V0KSB7Ci0gIEFTU0VSVChtX3dzVGFyZ2V0LkdldExlbmd0aCgpID4gMCk7Ci19Ci0KLUZERV9YTUxOT0RFVFlQRSBDRkRFX1hNTEluc3RydWN0aW9uOjpHZXRUeXBlKCkgY29uc3QgewotICByZXR1cm4gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb247Ci19Ci0KLUNGREVfWE1MTm9kZSogQ0ZERV9YTUxJbnN0cnVjdGlvbjo6Q2xvbmUoYm9vbCBiUmVjdXJzaXZlKSB7Ci0gIENGREVfWE1MSW5zdHJ1Y3Rpb24qIHBDbG9uZSA9IG5ldyBDRkRFX1hNTEluc3RydWN0aW9uKG1fd3NUYXJnZXQpOwotICBpZiAoIXBDbG9uZSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBwQ2xvbmUtPm1fQXR0cmlidXRlcyA9IG1fQXR0cmlidXRlczsKLSAgcENsb25lLT5tX1RhcmdldERhdGEgPSBtX1RhcmdldERhdGE7Ci0gIGlmIChiUmVjdXJzaXZlKQotICAgIENsb25lQ2hpbGRyZW4ocENsb25lKTsKLQotICByZXR1cm4gcENsb25lOwotfQotCi1pbnQzMl90IENGREVfWE1MSW5zdHJ1Y3Rpb246OkNvdW50QXR0cmlidXRlcygpIGNvbnN0IHsKLSAgcmV0dXJuIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9BdHRyaWJ1dGVzKSAvIDI7Ci19Ci0KLWJvb2wgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6R2V0QXR0cmlidXRlKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaVZhbHVlKSBjb25zdCB7Ci0gIGludDMyX3QgaUNvdW50ID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX0F0dHJpYnV0ZXMpOwotICBBU1NFUlQoaW5kZXggPiAtMSAmJiBpbmRleCA8IGlDb3VudCAvIDIpOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgewotICAgIGlmIChpbmRleCA9PSAwKSB7Ci0gICAgICB3c0F0dHJpTmFtZSA9IG1fQXR0cmlidXRlc1tpXTsKLSAgICAgIHdzQXR0cmlWYWx1ZSA9IG1fQXR0cmlidXRlc1tpICsgMV07Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaW5kZXgtLTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6SGFzQXR0cmlidXRlKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUpIGNvbnN0IHsKLSAgaW50MzJfdCBpQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fQXR0cmlidXRlcyk7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7Ci0gICAgaWYgKG1fQXR0cmlidXRlc1tpXS5Db21wYXJlKHB3c0F0dHJpTmFtZSkgPT0gMCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBDRkRFX1hNTEluc3RydWN0aW9uOjpHZXRTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHdzRGVmVmFsdWUpIGNvbnN0IHsKLSAgaW50MzJfdCBpQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fQXR0cmlidXRlcyk7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7Ci0gICAgaWYgKG1fQXR0cmlidXRlc1tpXS5Db21wYXJlKHB3c0F0dHJpTmFtZSkgPT0gMCkgewotICAgICAgd3NBdHRyaVZhbHVlID0gbV9BdHRyaWJ1dGVzW2kgKyAxXTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgd3NBdHRyaVZhbHVlID0gcHdzRGVmVmFsdWU7Ci19Ci0KLXZvaWQgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6U2V0U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpVmFsdWUpIHsKLSAgQVNTRVJUKHdzQXR0cmlOYW1lLkdldExlbmd0aCgpID4gMCk7Ci0gIGludDMyX3QgaUNvdW50ID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX0F0dHJpYnV0ZXMpOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgewotICAgIGlmIChtX0F0dHJpYnV0ZXNbaV0uQ29tcGFyZSh3c0F0dHJpTmFtZSkgPT0gMCkgewotICAgICAgbV9BdHRyaWJ1dGVzW2ldID0gd3NBdHRyaU5hbWU7Ci0gICAgICBtX0F0dHJpYnV0ZXNbaSArIDFdID0gd3NBdHRyaVZhbHVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICBtX0F0dHJpYnV0ZXMucHVzaF9iYWNrKHdzQXR0cmlOYW1lKTsKLSAgbV9BdHRyaWJ1dGVzLnB1c2hfYmFjayh3c0F0dHJpVmFsdWUpOwotfQotCi1pbnQzMl90IENGREVfWE1MSW5zdHJ1Y3Rpb246OkdldEludGVnZXIoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEZWZWYWx1ZSkgY29uc3QgewotICBpbnQzMl90IGlDb3VudCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9BdHRyaWJ1dGVzKTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsKLSAgICBpZiAobV9BdHRyaWJ1dGVzW2ldLkNvbXBhcmUocHdzQXR0cmlOYW1lKSA9PSAwKSB7Ci0gICAgICByZXR1cm4gRlhTWVNfd3RvaShtX0F0dHJpYnV0ZXNbaSArIDFdLmNfc3RyKCkpOwotICAgIH0KLSAgfQotICByZXR1cm4gaURlZlZhbHVlOwotfQotCi12b2lkIENGREVfWE1MSW5zdHJ1Y3Rpb246OlNldEludGVnZXIoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlBdHRyaVZhbHVlKSB7Ci0gIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7Ci0gIHdzVmFsdWUuRm9ybWF0KEwiJWQiLCBpQXR0cmlWYWx1ZSk7Ci0gIFNldFN0cmluZyhwd3NBdHRyaU5hbWUsIHdzVmFsdWUpOwotfQotCi1GWF9GTE9BVCBDRkRFX1hNTEluc3RydWN0aW9uOjpHZXRGbG9hdChjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkRlZlZhbHVlKSBjb25zdCB7Ci0gIGludDMyX3QgaUNvdW50ID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX0F0dHJpYnV0ZXMpOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgewotICAgIGlmIChtX0F0dHJpYnV0ZXNbaV0uQ29tcGFyZShwd3NBdHRyaU5hbWUpID09IDApIHsKLSAgICAgIHJldHVybiBGWFNZU193Y3N0b2YobV9BdHRyaWJ1dGVzW2kgKyAxXS5jX3N0cigpLCAtMSwgbnVsbHB0cik7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmRGVmVmFsdWU7Ci19Ci0KLXZvaWQgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6U2V0RmxvYXQoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkF0dHJpVmFsdWUpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsKLSAgd3NWYWx1ZS5Gb3JtYXQoTCIlZiIsIGZBdHRyaVZhbHVlKTsKLSAgU2V0U3RyaW5nKHB3c0F0dHJpTmFtZSwgd3NWYWx1ZSk7Ci19Ci0KLXZvaWQgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6UmVtb3ZlQXR0cmlidXRlKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUpIHsKLSAgaW50MzJfdCBpQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fQXR0cmlidXRlcyk7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7Ci0gICAgaWYgKG1fQXR0cmlidXRlc1tpXS5Db21wYXJlKHB3c0F0dHJpTmFtZSkgPT0gMCkgewotICAgICAgbV9BdHRyaWJ1dGVzLmVyYXNlKG1fQXR0cmlidXRlcy5iZWdpbigpICsgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtX0F0dHJpYnV0ZXMuYmVnaW4oKSArIGkgKyAyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLX0KLQotaW50MzJfdCBDRkRFX1hNTEluc3RydWN0aW9uOjpDb3VudERhdGEoKSBjb25zdCB7Ci0gIHJldHVybiBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fVGFyZ2V0RGF0YSk7Ci19Ci0KLWJvb2wgQ0ZERV9YTUxJbnN0cnVjdGlvbjo6R2V0RGF0YShpbnQzMl90IGluZGV4LCBDRlhfV2lkZVN0cmluZyYgd3NEYXRhKSBjb25zdCB7Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX1RhcmdldERhdGEpKQotICAgIHJldHVybiBmYWxzZTsKLQotICB3c0RhdGEgPSBtX1RhcmdldERhdGFbaW5kZXhdOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDRkRFX1hNTEluc3RydWN0aW9uOjpBcHBlbmREYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGEpIHsKLSAgbV9UYXJnZXREYXRhLnB1c2hfYmFjayh3c0RhdGEpOwotfQotCi12b2lkIENGREVfWE1MSW5zdHJ1Y3Rpb246OlJlbW92ZURhdGEoaW50MzJfdCBpbmRleCkgewotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9UYXJnZXREYXRhKSkKLSAgICByZXR1cm47Ci0KLSAgbV9UYXJnZXREYXRhLmVyYXNlKG1fVGFyZ2V0RGF0YS5iZWdpbigpICsgaW5kZXgpOwotfQotCi1DRkRFX1hNTEluc3RydWN0aW9uOjp+Q0ZERV9YTUxJbnN0cnVjdGlvbigpIHt9Ci0KLUNGREVfWE1MRWxlbWVudDo6Q0ZERV9YTUxFbGVtZW50KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RhZykKLSAgICA6IENGREVfWE1MTm9kZSgpLCBtX3dzVGFnKHdzVGFnKSwgbV9BdHRyaWJ1dGVzKCkgewotICBBU1NFUlQobV93c1RhZy5HZXRMZW5ndGgoKSA+IDApOwotfQotCi1DRkRFX1hNTEVsZW1lbnQ6On5DRkRFX1hNTEVsZW1lbnQoKSB7fQotCi1GREVfWE1MTk9ERVRZUEUgQ0ZERV9YTUxFbGVtZW50OjpHZXRUeXBlKCkgY29uc3QgewotICByZXR1cm4gRkRFX1hNTE5PREVfRWxlbWVudDsKLX0KLQotQ0ZERV9YTUxOb2RlKiBDRkRFX1hNTEVsZW1lbnQ6OkNsb25lKGJvb2wgYlJlY3Vyc2l2ZSkgewotICBDRkRFX1hNTEVsZW1lbnQqIHBDbG9uZSA9IG5ldyBDRkRFX1hNTEVsZW1lbnQobV93c1RhZyk7Ci0gIGlmICghcENsb25lKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIHBDbG9uZS0+bV9BdHRyaWJ1dGVzID0gbV9BdHRyaWJ1dGVzOwotICBpZiAoYlJlY3Vyc2l2ZSkgewotICAgIENsb25lQ2hpbGRyZW4ocENsb25lKTsKLSAgfSBlbHNlIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7Ci0gICAgQ0ZERV9YTUxOb2RlKiBwQ2hpbGQgPSBtX3BDaGlsZDsKLSAgICB3aGlsZSAocENoaWxkKSB7Ci0gICAgICBzd2l0Y2ggKHBDaGlsZC0+R2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgRkRFX1hNTE5PREVfVGV4dDoKLSAgICAgICAgICB3c1RleHQgKz0gKChDRkRFX1hNTFRleHQqKXBDaGlsZCktPm1fd3NUZXh0OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0OwotICAgIH0KLSAgICBwQ2xvbmUtPlNldFRleHREYXRhKHdzVGV4dCk7Ci0gIH0KLSAgcmV0dXJuIHBDbG9uZTsKLX0KLQotdm9pZCBDRkRFX1hNTEVsZW1lbnQ6OkdldFRhZ05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzVGFnKSBjb25zdCB7Ci0gIHdzVGFnID0gbV93c1RhZzsKLX0KLQotdm9pZCBDRkRFX1hNTEVsZW1lbnQ6OkdldExvY2FsVGFnTmFtZShDRlhfV2lkZVN0cmluZyYgd3NUYWcpIGNvbnN0IHsKLSAgRlhfU1RSU0laRSBpRmluZCA9IG1fd3NUYWcuRmluZChMJzonLCAwKTsKLSAgaWYgKGlGaW5kIDwgMCkgewotICAgIHdzVGFnID0gbV93c1RhZzsKLSAgfSBlbHNlIHsKLSAgICB3c1RhZyA9IG1fd3NUYWcuUmlnaHQobV93c1RhZy5HZXRMZW5ndGgoKSAtIGlGaW5kIC0gMSk7Ci0gIH0KLX0KLQotdm9pZCBDRkRFX1hNTEVsZW1lbnQ6OkdldE5hbWVzcGFjZVByZWZpeChDRlhfV2lkZVN0cmluZyYgd3NQcmVmaXgpIGNvbnN0IHsKLSAgRlhfU1RSU0laRSBpRmluZCA9IG1fd3NUYWcuRmluZChMJzonLCAwKTsKLSAgaWYgKGlGaW5kIDwgMCkgewotICAgIHdzUHJlZml4LmNsZWFyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgd3NQcmVmaXggPSBtX3dzVGFnLkxlZnQoaUZpbmQpOwotICB9Ci19Ci0KLXZvaWQgQ0ZERV9YTUxFbGVtZW50OjpHZXROYW1lc3BhY2VVUkkoQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZXNwYWNlKSBjb25zdCB7Ci0gIENGWF9XaWRlU3RyaW5nIHdzQXR0cmkoTCJ4bWxucyIpLCB3c1ByZWZpeDsKLSAgR2V0TmFtZXNwYWNlUHJlZml4KHdzUHJlZml4KTsKLSAgaWYgKHdzUHJlZml4LkdldExlbmd0aCgpID4gMCkgewotICAgIHdzQXR0cmkgKz0gTCI6IjsKLSAgICB3c0F0dHJpICs9IHdzUHJlZml4OwotICB9Ci0gIHdzTmFtZXNwYWNlLmNsZWFyKCk7Ci0gIENGREVfWE1MTm9kZSogcE5vZGUgPSAoQ0ZERV9YTUxOb2RlKil0aGlzOwotICB3aGlsZSAocE5vZGUpIHsKLSAgICBpZiAocE5vZGUtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgQ0ZERV9YTUxFbGVtZW50KiBwRWxlbWVudCA9IChDRkRFX1hNTEVsZW1lbnQqKXBOb2RlOwotICAgIGlmICghcEVsZW1lbnQtPkhhc0F0dHJpYnV0ZSh3c0F0dHJpLmNfc3RyKCkpKSB7Ci0gICAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6OlBhcmVudCk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgcEVsZW1lbnQtPkdldFN0cmluZyh3c0F0dHJpLmNfc3RyKCksIHdzTmFtZXNwYWNlKTsKLSAgICBicmVhazsKLSAgfQotfQotCi1pbnQzMl90IENGREVfWE1MRWxlbWVudDo6Q291bnRBdHRyaWJ1dGVzKCkgY29uc3QgewotICByZXR1cm4gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX0F0dHJpYnV0ZXMpIC8gMjsKLX0KLQotYm9vbCBDRkRFX1hNTEVsZW1lbnQ6OkdldEF0dHJpYnV0ZShpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpVmFsdWUpIGNvbnN0IHsKLSAgaW50MzJfdCBpQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fQXR0cmlidXRlcyk7Ci0gIEFTU0VSVChpbmRleCA+IC0xICYmIGluZGV4IDwgaUNvdW50IC8gMik7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7Ci0gICAgaWYgKGluZGV4ID09IDApIHsKLSAgICAgIHdzQXR0cmlOYW1lID0gbV9BdHRyaWJ1dGVzW2ldOwotICAgICAgd3NBdHRyaVZhbHVlID0gbV9BdHRyaWJ1dGVzW2kgKyAxXTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpbmRleC0tOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDRkRFX1hNTEVsZW1lbnQ6Okhhc0F0dHJpYnV0ZShjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lKSBjb25zdCB7Ci0gIGludDMyX3QgaUNvdW50ID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX0F0dHJpYnV0ZXMpOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgewotICAgIGlmIChtX0F0dHJpYnV0ZXNbaV0uQ29tcGFyZShwd3NBdHRyaU5hbWUpID09IDApCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQ0ZERV9YTUxFbGVtZW50OjpHZXRTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHB3c0RlZlZhbHVlKSBjb25zdCB7Ci0gIGludDMyX3QgaUNvdW50ID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX0F0dHJpYnV0ZXMpOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkgKz0gMikgewotICAgIGlmIChtX0F0dHJpYnV0ZXNbaV0uQ29tcGFyZShwd3NBdHRyaU5hbWUpID09IDApIHsKLSAgICAgIHdzQXR0cmlWYWx1ZSA9IG1fQXR0cmlidXRlc1tpICsgMV07Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIHdzQXR0cmlWYWx1ZSA9IHB3c0RlZlZhbHVlOwotfQotCi12b2lkIENGREVfWE1MRWxlbWVudDo6U2V0U3RyaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlWYWx1ZSkgewotICBBU1NFUlQod3NBdHRyaU5hbWUuR2V0TGVuZ3RoKCkgPiAwKTsKLSAgaW50MzJfdCBpQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fQXR0cmlidXRlcyk7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7Ci0gICAgaWYgKG1fQXR0cmlidXRlc1tpXS5Db21wYXJlKHdzQXR0cmlOYW1lKSA9PSAwKSB7Ci0gICAgICBtX0F0dHJpYnV0ZXNbaV0gPSB3c0F0dHJpTmFtZTsKLSAgICAgIG1fQXR0cmlidXRlc1tpICsgMV0gPSB3c0F0dHJpVmFsdWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIG1fQXR0cmlidXRlcy5wdXNoX2JhY2sod3NBdHRyaU5hbWUpOwotICBtX0F0dHJpYnV0ZXMucHVzaF9iYWNrKHdzQXR0cmlWYWx1ZSk7Ci19Ci0KLWludDMyX3QgQ0ZERV9YTUxFbGVtZW50OjpHZXRJbnRlZ2VyKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEZWZWYWx1ZSkgY29uc3QgewotICBpbnQzMl90IGlDb3VudCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9BdHRyaWJ1dGVzKTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsKLSAgICBpZiAobV9BdHRyaWJ1dGVzW2ldLkNvbXBhcmUocHdzQXR0cmlOYW1lKSA9PSAwKSB7Ci0gICAgICByZXR1cm4gRlhTWVNfd3RvaShtX0F0dHJpYnV0ZXNbaSArIDFdLmNfc3RyKCkpOwotICAgIH0KLSAgfQotICByZXR1cm4gaURlZlZhbHVlOwotfQotCi12b2lkIENGREVfWE1MRWxlbWVudDo6U2V0SW50ZWdlcihjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQXR0cmlWYWx1ZSkgewotICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOwotICB3c1ZhbHVlLkZvcm1hdChMIiVkIiwgaUF0dHJpVmFsdWUpOwotICBTZXRTdHJpbmcocHdzQXR0cmlOYW1lLCB3c1ZhbHVlKTsKLX0KLQotRlhfRkxPQVQgQ0ZERV9YTUxFbGVtZW50OjpHZXRGbG9hdChjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmRGVmVmFsdWUpIGNvbnN0IHsKLSAgaW50MzJfdCBpQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fQXR0cmlidXRlcyk7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSArPSAyKSB7Ci0gICAgaWYgKG1fQXR0cmlidXRlc1tpXS5Db21wYXJlKHB3c0F0dHJpTmFtZSkgPT0gMCkgewotICAgICAgcmV0dXJuIEZYU1lTX3djc3RvZihtX0F0dHJpYnV0ZXNbaSArIDFdLmNfc3RyKCksIC0xLCBudWxscHRyKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZEZWZWYWx1ZTsKLX0KLQotdm9pZCBDRkRFX1hNTEVsZW1lbnQ6OlNldEZsb2F0KGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkF0dHJpVmFsdWUpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsKLSAgd3NWYWx1ZS5Gb3JtYXQoTCIlZiIsIGZBdHRyaVZhbHVlKTsKLSAgU2V0U3RyaW5nKHB3c0F0dHJpTmFtZSwgd3NWYWx1ZSk7Ci19Ci0KLXZvaWQgQ0ZERV9YTUxFbGVtZW50OjpSZW1vdmVBdHRyaWJ1dGUoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSkgewotICBpbnQzMl90IGlDb3VudCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9BdHRyaWJ1dGVzKTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsKLSAgICBpZiAobV9BdHRyaWJ1dGVzW2ldLkNvbXBhcmUocHdzQXR0cmlOYW1lKSA9PSAwKSB7Ci0gICAgICBtX0F0dHJpYnV0ZXMuZXJhc2UobV9BdHRyaWJ1dGVzLmJlZ2luKCkgKyBpLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1fQXR0cmlidXRlcy5iZWdpbigpICsgaSArIDIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotfQotCi12b2lkIENGREVfWE1MRWxlbWVudDo6R2V0VGV4dERhdGEoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgY29uc3QgewotICBDRlhfV2lkZVRleHRCdWYgYnVmZmVyOwotICBDRkRFX1hNTE5vZGUqIHBDaGlsZCA9IG1fcENoaWxkOwotICB3aGlsZSAocENoaWxkKSB7Ci0gICAgc3dpdGNoIChwQ2hpbGQtPkdldFR5cGUoKSkgewotICAgICAgY2FzZSBGREVfWE1MTk9ERV9UZXh0OgotICAgICAgICBidWZmZXIgPDwgKChDRkRFX1hNTFRleHQqKXBDaGlsZCktPm1fd3NUZXh0OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX1hNTE5PREVfQ2hhckRhdGE6Ci0gICAgICAgIGJ1ZmZlciA8PCAoKENGREVfWE1MQ2hhckRhdGEqKXBDaGlsZCktPm1fd3NDaGFyRGF0YTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0OwotICB9Ci0gIHdzVGV4dCA9IGJ1ZmZlci5Bc1N0cmluZ0MoKTsKLX0KLQotdm9pZCBDRkRFX1hNTEVsZW1lbnQ6OlNldFRleHREYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsKLSAgaWYgKHdzVGV4dC5HZXRMZW5ndGgoKSA8IDEpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgSW5zZXJ0Q2hpbGROb2RlKG5ldyBDRkRFX1hNTFRleHQod3NUZXh0KSk7Ci19Ci0KLUNGREVfWE1MVGV4dDo6Q0ZERV9YTUxUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpCi0gICAgOiBDRkRFX1hNTE5vZGUoKSwgbV93c1RleHQod3NUZXh0KSB7fQotCi1GREVfWE1MTk9ERVRZUEUgQ0ZERV9YTUxUZXh0OjpHZXRUeXBlKCkgY29uc3QgewotICByZXR1cm4gRkRFX1hNTE5PREVfVGV4dDsKLX0KLQotQ0ZERV9YTUxOb2RlKiBDRkRFX1hNTFRleHQ6OkNsb25lKGJvb2wgYlJlY3Vyc2l2ZSkgewotICBDRkRFX1hNTFRleHQqIHBDbG9uZSA9IG5ldyBDRkRFX1hNTFRleHQobV93c1RleHQpOwotICByZXR1cm4gcENsb25lOwotfQotCi1DRkRFX1hNTFRleHQ6On5DRkRFX1hNTFRleHQoKSB7fQotCi1DRkRFX1hNTENoYXJEYXRhOjpDRkRFX1hNTENoYXJEYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NEYXRhKQotICAgIDogQ0ZERV9YTUxEZWNsYXJhdGlvbigpLCBtX3dzQ2hhckRhdGEod3NDRGF0YSkge30KLQotRkRFX1hNTE5PREVUWVBFIENGREVfWE1MQ2hhckRhdGE6OkdldFR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBGREVfWE1MTk9ERV9DaGFyRGF0YTsKLX0KLQotQ0ZERV9YTUxOb2RlKiBDRkRFX1hNTENoYXJEYXRhOjpDbG9uZShib29sIGJSZWN1cnNpdmUpIHsKLSAgQ0ZERV9YTUxDaGFyRGF0YSogcENsb25lID0gbmV3IENGREVfWE1MQ2hhckRhdGEobV93c0NoYXJEYXRhKTsKLSAgcmV0dXJuIHBDbG9uZTsKLX0KLQotQ0ZERV9YTUxDaGFyRGF0YTo6fkNGREVfWE1MQ2hhckRhdGEoKSB7fQotCi1DRkRFX1hNTERvYzo6Q0ZERV9YTUxEb2MoKSA6IG1fcFJvb3QobnVsbHB0cikgewotICBSZXNldCh0cnVlKTsKLSAgQ0ZERV9YTUxJbnN0cnVjdGlvbiogcFhNTCA9IG5ldyBDRkRFX1hNTEluc3RydWN0aW9uKEwieG1sIik7Ci0gIG1fcFJvb3QtPkluc2VydENoaWxkTm9kZShwWE1MKTsKLX0KLQotQ0ZERV9YTUxEb2M6On5DRkRFX1hNTERvYygpIHsKLSAgUmVzZXQoZmFsc2UpOwotfQotCi12b2lkIENGREVfWE1MRG9jOjpSZXNldChib29sIGJJbml0Um9vdCkgewotICBtX2lTdGF0dXMgPSAwOwotICBtX3BTdHJlYW0gPSBudWxscHRyOwotICBpZiAoYkluaXRSb290KSB7Ci0gICAgaWYgKG1fcFJvb3QpCi0gICAgICBtX3BSb290LT5EZWxldGVDaGlsZHJlbigpOwotICAgIGVsc2UKLSAgICAgIG1fcFJvb3QgPSBuZXcgQ0ZERV9YTUxOb2RlOwotICB9IGVsc2UgewotICAgIGRlbGV0ZSBtX3BSb290OwotICAgIG1fcFJvb3QgPSBudWxscHRyOwotICB9Ci0gIFJlbGVhc2VQYXJzZXIoKTsKLX0KLQotdm9pZCBDRkRFX1hNTERvYzo6UmVsZWFzZVBhcnNlcigpIHsKLSAgbV9wWE1MUGFyc2VyLnJlc2V0KCk7Ci19Ci0KLWJvb2wgQ0ZERV9YTUxEb2M6OkxvYWRYTUwoc3RkOjp1bmlxdWVfcHRyPElGREVfWE1MUGFyc2VyPiBwWE1MUGFyc2VyKSB7Ci0gIGlmICghcFhNTFBhcnNlcikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgUmVzZXQodHJ1ZSk7Ci0gIG1fcFhNTFBhcnNlciA9IHN0ZDo6bW92ZShwWE1MUGFyc2VyKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWludDMyX3QgQ0ZERV9YTUxEb2M6OkRvTG9hZChJRlhfUGF1c2UqIHBQYXVzZSkgewotICBpZiAobV9pU3RhdHVzIDwgMTAwKQotICAgIG1faVN0YXR1cyA9IG1fcFhNTFBhcnNlci0+RG9QYXJzZXIocFBhdXNlKTsKLQotICByZXR1cm4gbV9pU3RhdHVzOwotfQotCi12b2lkIENGREVfWE1MRG9jOjpDbG9zZVhNTCgpIHsKLSAgUmVsZWFzZVBhcnNlcigpOwotfQotCi12b2lkIENGREVfWE1MRG9jOjpTYXZlWE1MTm9kZShjb25zdCBDRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4mIHBYTUxTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1hNTE5vZGUqIHBJTm9kZSkgewotICBDRkRFX1hNTE5vZGUqIHBOb2RlID0gKENGREVfWE1MTm9kZSopcElOb2RlOwotICBzd2l0Y2ggKHBOb2RlLT5HZXRUeXBlKCkpIHsKLSAgICBjYXNlIEZERV9YTUxOT0RFX0luc3RydWN0aW9uOiB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3czsKLSAgICAgIENGREVfWE1MSW5zdHJ1Y3Rpb24qIHBJbnN0cnVjdGlvbiA9IChDRkRFX1hNTEluc3RydWN0aW9uKilwTm9kZTsKLSAgICAgIGlmIChwSW5zdHJ1Y3Rpb24tPm1fd3NUYXJnZXQuQ29tcGFyZU5vQ2FzZShMInhtbCIpID09IDApIHsKLSAgICAgICAgd3MgPSBMIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIiI7Ci0gICAgICAgIHVpbnQxNl90IHdDb2RlUGFnZSA9IHBYTUxTdHJlYW0tPkdldENvZGVQYWdlKCk7Ci0gICAgICAgIGlmICh3Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGMTZMRSkgewotICAgICAgICAgIHdzICs9IEwiVVRGLTE2IjsKLSAgICAgICAgfSBlbHNlIGlmICh3Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGMTZCRSkgewotICAgICAgICAgIHdzICs9IEwiVVRGLTE2YmUiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHdzICs9IEwiVVRGLTgiOwotICAgICAgICB9Ci0gICAgICAgIHdzICs9IEwiXCI/PiI7Ci0gICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLmNfc3RyKCksIHdzLkdldExlbmd0aCgpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHdzLkZvcm1hdChMIjw/JXMiLCBwSW5zdHJ1Y3Rpb24tPm1fd3NUYXJnZXQuY19zdHIoKSk7Ci0gICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLmNfc3RyKCksIHdzLkdldExlbmd0aCgpKTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+JiBhdHRyaWJ1dGVzID0gcEluc3RydWN0aW9uLT5tX0F0dHJpYnV0ZXM7Ci0gICAgICAgIGludDMyX3QgaTsKLSAgICAgICAgaW50MzJfdCBpQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KGF0dHJpYnV0ZXMpOwotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsKLSAgICAgICAgICB3cyA9IEwiICI7Ci0gICAgICAgICAgd3MgKz0gYXR0cmlidXRlc1tpXTsKLSAgICAgICAgICB3cyArPSBMIj1cIiI7Ci0gICAgICAgICAgd3NWYWx1ZSA9IGF0dHJpYnV0ZXNbaSArIDFdOwotICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIiYiLCBMIiZhbXA7Iik7Ci0gICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiPCIsIEwiJmx0OyIpOwotICAgICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIj4iLCBMIiZndDsiKTsKLSAgICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCJcJyIsIEwiJmFwb3M7Iik7Ci0gICAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiXCIiLCBMIiZxdW90OyIpOwotICAgICAgICAgIHdzICs9IHdzVmFsdWU7Ci0gICAgICAgICAgd3MgKz0gTCJcIiI7Ci0gICAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MuY19zdHIoKSwgd3MuR2V0TGVuZ3RoKCkpOwotICAgICAgICB9Ci0gICAgICAgIHN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nPiYgdGFyZ2V0ZGF0YSA9IHBJbnN0cnVjdGlvbi0+bV9UYXJnZXREYXRhOwotICAgICAgICBpQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHRhcmdldGRhdGEpOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKLSAgICAgICAgICB3cyA9IEwiIFwiIjsKLSAgICAgICAgICB3cyArPSB0YXJnZXRkYXRhW2ldOwotICAgICAgICAgIHdzICs9IEwiXCIiOwotICAgICAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLmNfc3RyKCksIHdzLkdldExlbmd0aCgpKTsKLSAgICAgICAgfQotICAgICAgICB3cyA9IEwiPz4iOwotICAgICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cy5jX3N0cigpLCB3cy5HZXRMZW5ndGgoKSk7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEZERV9YTUxOT0RFX0VsZW1lbnQ6IHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzOwotICAgICAgd3MgPSBMIjwiOwotICAgICAgd3MgKz0gKChDRkRFX1hNTEVsZW1lbnQqKXBOb2RlKS0+bV93c1RhZzsKLSAgICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKHdzLmNfc3RyKCksIHdzLkdldExlbmd0aCgpKTsKLSAgICAgIHN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nPiYgYXR0cmlidXRlcyA9Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4ocE5vZGUpLT5tX0F0dHJpYnV0ZXM7Ci0gICAgICBpbnQzMl90IGlDb3VudCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4oYXR0cmlidXRlcyk7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOwotICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpICs9IDIpIHsKLSAgICAgICAgd3MgPSBMIiAiOwotICAgICAgICB3cyArPSBhdHRyaWJ1dGVzW2ldOwotICAgICAgICB3cyArPSBMIj1cIiI7Ci0gICAgICAgIHdzVmFsdWUgPSBhdHRyaWJ1dGVzW2kgKyAxXTsKLSAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiJiIsIEwiJmFtcDsiKTsKLSAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiPCIsIEwiJmx0OyIpOwotICAgICAgICB3c1ZhbHVlLlJlcGxhY2UoTCI+IiwgTCImZ3Q7Iik7Ci0gICAgICAgIHdzVmFsdWUuUmVwbGFjZShMIlwnIiwgTCImYXBvczsiKTsKLSAgICAgICAgd3NWYWx1ZS5SZXBsYWNlKEwiXCIiLCBMIiZxdW90OyIpOwotICAgICAgICB3cyArPSB3c1ZhbHVlOwotICAgICAgICB3cyArPSBMIlwiIjsKLSAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MuY19zdHIoKSwgd3MuR2V0TGVuZ3RoKCkpOwotICAgICAgfQotICAgICAgaWYgKHBOb2RlLT5tX3BDaGlsZCkgewotICAgICAgICB3cyA9IEwiXG4+IjsKLSAgICAgICAgcFhNTFN0cmVhbS0+V3JpdGVTdHJpbmcod3MuY19zdHIoKSwgd3MuR2V0TGVuZ3RoKCkpOwotICAgICAgICBDRkRFX1hNTE5vZGUqIHBDaGlsZCA9IHBOb2RlLT5tX3BDaGlsZDsKLSAgICAgICAgd2hpbGUgKHBDaGlsZCkgewotICAgICAgICAgIFNhdmVYTUxOb2RlKHBYTUxTdHJlYW0sIHN0YXRpY19jYXN0PENGREVfWE1MTm9kZSo+KHBDaGlsZCkpOwotICAgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+bV9wTmV4dDsKLSAgICAgICAgfQotICAgICAgICB3cyA9IEwiPC8iOwotICAgICAgICB3cyArPSAoKENGREVfWE1MRWxlbWVudCopcE5vZGUpLT5tX3dzVGFnOwotICAgICAgICB3cyArPSBMIlxuPiI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB3cyA9IEwiXG4vPiI7Ci0gICAgICB9Ci0gICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cy5jX3N0cigpLCB3cy5HZXRMZW5ndGgoKSk7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEZERV9YTUxOT0RFX1RleHQ6IHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzID0gKChDRkRFX1hNTFRleHQqKXBOb2RlKS0+bV93c1RleHQ7Ci0gICAgICB3cy5SZXBsYWNlKEwiJiIsIEwiJmFtcDsiKTsKLSAgICAgIHdzLlJlcGxhY2UoTCI8IiwgTCImbHQ7Iik7Ci0gICAgICB3cy5SZXBsYWNlKEwiPiIsIEwiJmd0OyIpOwotICAgICAgd3MuUmVwbGFjZShMIlwnIiwgTCImYXBvczsiKTsKLSAgICAgIHdzLlJlcGxhY2UoTCJcIiIsIEwiJnF1b3Q7Iik7Ci0gICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cy5jX3N0cigpLCB3cy5HZXRMZW5ndGgoKSk7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEZERV9YTUxOT0RFX0NoYXJEYXRhOiB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3cyA9IEwiPCFbQ0RBVEFbIjsKLSAgICAgIHdzICs9ICgoQ0ZERV9YTUxDaGFyRGF0YSopcE5vZGUpLT5tX3dzQ2hhckRhdGE7Ci0gICAgICB3cyArPSBMIl1dPiI7Ci0gICAgICBwWE1MU3RyZWFtLT5Xcml0ZVN0cmluZyh3cy5jX3N0cigpLCB3cy5HZXRMZW5ndGgoKSk7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEZERV9YTUxOT0RFX1Vua25vd246Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBDRkRFX1hNTERvYzo6U2F2ZVhNTChDRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4mIHBYTUxTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNhdmVCT00pIHsKLSAgaWYgKCFwWE1MU3RyZWFtIHx8IHBYTUxTdHJlYW0gPT0gbV9wU3RyZWFtKSB7Ci0gICAgbV9wU3RyZWFtLT5TZWVrKEZYX1NUUkVBTVNFRUtfQmVnaW4sIDApOwotICAgIHBYTUxTdHJlYW0gPSBtX3BTdHJlYW07Ci0gIH0KLSAgQVNTRVJUKChwWE1MU3RyZWFtLT5HZXRBY2Nlc3NNb2RlcygpICYgRlhfU1RSRUFNQUNDRVNTX1RleHQpICE9IDApOwotICBBU1NFUlQoKHBYTUxTdHJlYW0tPkdldEFjY2Vzc01vZGVzKCkgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDApOwotICB1aW50MTZfdCB3Q29kZVBhZ2UgPSBwWE1MU3RyZWFtLT5HZXRDb2RlUGFnZSgpOwotICBpZiAod0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjE2TEUgJiYgd0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjE2QkUgJiYKLSAgICAgIHdDb2RlUGFnZSAhPSBGWF9DT0RFUEFHRV9VVEY4KSB7Ci0gICAgd0NvZGVQYWdlID0gRlhfQ09ERVBBR0VfVVRGODsKLSAgICBwWE1MU3RyZWFtLT5TZXRDb2RlUGFnZSh3Q29kZVBhZ2UpOwotICB9Ci0gIGlmIChiU2F2ZUJPTSkgewotICAgIHBYTUxTdHJlYW0tPldyaXRlU3RyaW5nKEwiXHhGRUZGIiwgMSk7Ci0gIH0KLSAgQ0ZERV9YTUxOb2RlKiBwTm9kZSA9IG1fcFJvb3QtPm1fcENoaWxkOwotICB3aGlsZSAocE5vZGUpIHsKLSAgICBTYXZlWE1MTm9kZShwWE1MU3RyZWFtLCBzdGF0aWNfY2FzdDxDRkRFX1hNTE5vZGUqPihwTm9kZSkpOwotICAgIHBOb2RlID0gcE5vZGUtPm1fcE5leHQ7Ci0gIH0KLSAgaWYgKHBYTUxTdHJlYW0gPT0gbV9wU3RyZWFtKSB7Ci0gICAgaW50MzJfdCBpUG9zID0gcFhNTFN0cmVhbS0+R2V0UG9zaXRpb24oKTsKLSAgICBwWE1MU3RyZWFtLT5TZXRMZW5ndGgoaVBvcyk7Ci0gIH0KLX0KLQotQ0ZERV9CbG9ja0J1ZmZlcjo6Q0ZERV9CbG9ja0J1ZmZlcihpbnQzMl90IGlBbGxvY1N0ZXApCi0gICAgOiBtX2lEYXRhTGVuZ3RoKDApLAotICAgICAgbV9pQnVmZmVyU2l6ZSgwKSwKLSAgICAgIG1faUFsbG9jU3RlcChpQWxsb2NTdGVwKSwKLSAgICAgIG1faVN0YXJ0UG9zaXRpb24oMCkge30KLQotQ0ZERV9CbG9ja0J1ZmZlcjo6fkNGREVfQmxvY2tCdWZmZXIoKSB7Ci0gIENsZWFyQnVmZmVyKCk7Ci19Ci0KLUZYX1dDSEFSKiBDRkRFX0Jsb2NrQnVmZmVyOjpHZXRBdmFpbGFibGVCbG9jayhpbnQzMl90JiBpSW5kZXhJbkJsb2NrKSB7Ci0gIGlJbmRleEluQmxvY2sgPSAwOwotICBpZiAoIW1fQmxvY2tBcnJheS5HZXRTaXplKCkpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBpbnQzMl90IGlSZWFsSW5kZXggPSBtX2lTdGFydFBvc2l0aW9uICsgbV9pRGF0YUxlbmd0aDsKLSAgaWYgKGlSZWFsSW5kZXggPT0gbV9pQnVmZmVyU2l6ZSkgewotICAgIEZYX1dDSEFSKiBwQmxvY2sgPSBGWF9BbGxvYyhGWF9XQ0hBUiwgbV9pQWxsb2NTdGVwKTsKLSAgICBtX0Jsb2NrQXJyYXkuQWRkKHBCbG9jayk7Ci0gICAgbV9pQnVmZmVyU2l6ZSArPSBtX2lBbGxvY1N0ZXA7Ci0gICAgcmV0dXJuIHBCbG9jazsKLSAgfQotICBpSW5kZXhJbkJsb2NrID0gaVJlYWxJbmRleCAlIG1faUFsbG9jU3RlcDsKLSAgcmV0dXJuIG1fQmxvY2tBcnJheVtpUmVhbEluZGV4IC8gbV9pQWxsb2NTdGVwXTsKLX0KLQotYm9vbCBDRkRFX0Jsb2NrQnVmZmVyOjpJbml0QnVmZmVyKGludDMyX3QgaUJ1ZmZlclNpemUpIHsKLSAgQ2xlYXJCdWZmZXIoKTsKLSAgaW50MzJfdCBpTnVtT2ZCbG9jayA9IChpQnVmZmVyU2l6ZSAtIDEpIC8gbV9pQWxsb2NTdGVwICsgMTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaU51bU9mQmxvY2s7IGkrKykgewotICAgIG1fQmxvY2tBcnJheS5BZGQoRlhfQWxsb2MoRlhfV0NIQVIsIG1faUFsbG9jU3RlcCkpOwotICB9Ci0gIG1faUJ1ZmZlclNpemUgPSBpTnVtT2ZCbG9jayAqIG1faUFsbG9jU3RlcDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ0ZERV9CbG9ja0J1ZmZlcjo6U2V0VGV4dENoYXIoaW50MzJfdCBpSW5kZXgsIEZYX1dDSEFSIGNoKSB7Ci0gIGlmIChpSW5kZXggPCAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGludDMyX3QgaVJlYWxJbmRleCA9IG1faVN0YXJ0UG9zaXRpb24gKyBpSW5kZXg7Ci0gIGludDMyX3QgaUJsb2NrSW5kZXggPSBpUmVhbEluZGV4IC8gbV9pQWxsb2NTdGVwOwotICBpbnQzMl90IGlJbm5lckluZGV4ID0gaVJlYWxJbmRleCAlIG1faUFsbG9jU3RlcDsKLSAgaW50MzJfdCBpQmxvY2tTaXplID0gbV9CbG9ja0FycmF5LkdldFNpemUoKTsKLSAgaWYgKGlCbG9ja0luZGV4ID49IGlCbG9ja1NpemUpIHsKLSAgICBpbnQzMl90IGlOZXdCbG9ja3MgPSBpQmxvY2tJbmRleCAtIGlCbG9ja1NpemUgKyAxOwotICAgIGRvIHsKLSAgICAgIEZYX1dDSEFSKiBwQmxvY2sgPSBGWF9BbGxvYyhGWF9XQ0hBUiwgbV9pQWxsb2NTdGVwKTsKLSAgICAgIG1fQmxvY2tBcnJheS5BZGQocEJsb2NrKTsKLSAgICAgIG1faUJ1ZmZlclNpemUgKz0gbV9pQWxsb2NTdGVwOwotICAgIH0gd2hpbGUgKC0taU5ld0Jsb2Nrcyk7Ci0gIH0KLSAgRlhfV0NIQVIqIHBUZXh0RGF0YSA9IG1fQmxvY2tBcnJheVtpQmxvY2tJbmRleF07Ci0gICoocFRleHREYXRhICsgaUlubmVySW5kZXgpID0gY2g7Ci0gIGlmIChtX2lEYXRhTGVuZ3RoIDw9IGlJbmRleCkgewotICAgIG1faURhdGFMZW5ndGggPSBpSW5kZXggKyAxOwotICB9Ci19Ci0KLWludDMyX3QgQ0ZERV9CbG9ja0J1ZmZlcjo6RGVsZXRlVGV4dENoYXJzKGludDMyX3QgaUNvdW50LCBib29sIGJEaXJlY3Rpb24pIHsKLSAgaWYgKGlDb3VudCA8PSAwKSB7Ci0gICAgcmV0dXJuIG1faURhdGFMZW5ndGg7Ci0gIH0KLSAgaWYgKGlDb3VudCA+PSBtX2lEYXRhTGVuZ3RoKSB7Ci0gICAgUmVzZXQoZmFsc2UpOwotICAgIHJldHVybiAwOwotICB9Ci0gIGlmIChiRGlyZWN0aW9uKSB7Ci0gICAgbV9pU3RhcnRQb3NpdGlvbiArPSBpQ291bnQ7Ci0gICAgbV9pRGF0YUxlbmd0aCAtPSBpQ291bnQ7Ci0gIH0gZWxzZSB7Ci0gICAgbV9pRGF0YUxlbmd0aCAtPSBpQ291bnQ7Ci0gIH0KLSAgcmV0dXJuIG1faURhdGFMZW5ndGg7Ci19Ci0KLXZvaWQgQ0ZERV9CbG9ja0J1ZmZlcjo6R2V0VGV4dERhdGEoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpIGNvbnN0IHsKLSAgd3NUZXh0RGF0YS5jbGVhcigpOwotICBpbnQzMl90IGlNYXliZURhdGFMZW5ndGggPSBtX2lCdWZmZXJTaXplIC0gMSAtIG1faVN0YXJ0UG9zaXRpb247Ci0gIGlmIChpU3RhcnQgPCAwIHx8IGlTdGFydCA+IGlNYXliZURhdGFMZW5ndGgpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGlMZW5ndGggPT0gLTEgfHwgaUxlbmd0aCA+IGlNYXliZURhdGFMZW5ndGgpIHsKLSAgICBpTGVuZ3RoID0gaU1heWJlRGF0YUxlbmd0aDsKLSAgfQotICBpZiAoaUxlbmd0aCA8PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIEZYX1dDSEFSKiBwQnVmID0gd3NUZXh0RGF0YS5HZXRCdWZmZXIoaUxlbmd0aCk7Ci0gIGlmICghcEJ1ZikgewotICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IGlTdGFydEJsb2NrSW5kZXggPSAwOwotICBpbnQzMl90IGlTdGFydElubmVySW5kZXggPSAwOwotICBUZXh0RGF0YUluZGV4MkJ1ZkluZGV4KGlTdGFydCwgaVN0YXJ0QmxvY2tJbmRleCwgaVN0YXJ0SW5uZXJJbmRleCk7Ci0gIGludDMyX3QgaUVuZEJsb2NrSW5kZXggPSAwOwotICBpbnQzMl90IGlFbmRJbm5lckluZGV4ID0gMDsKLSAgVGV4dERhdGFJbmRleDJCdWZJbmRleChpU3RhcnQgKyBpTGVuZ3RoLCBpRW5kQmxvY2tJbmRleCwgaUVuZElubmVySW5kZXgpOwotICBpbnQzMl90IGlQb2ludGVyID0gMDsKLSAgZm9yIChpbnQzMl90IGkgPSBpU3RhcnRCbG9ja0luZGV4OyBpIDw9IGlFbmRCbG9ja0luZGV4OyBpKyspIHsKLSAgICBpbnQzMl90IGlCdWZmZXJQb2ludGVyID0gMDsKLSAgICBpbnQzMl90IGlDb3B5TGVuZ3RoID0gbV9pQWxsb2NTdGVwOwotICAgIGlmIChpID09IGlTdGFydEJsb2NrSW5kZXgpIHsKLSAgICAgIGlDb3B5TGVuZ3RoIC09IGlTdGFydElubmVySW5kZXg7Ci0gICAgICBpQnVmZmVyUG9pbnRlciA9IGlTdGFydElubmVySW5kZXg7Ci0gICAgfQotICAgIGlmIChpID09IGlFbmRCbG9ja0luZGV4KSB7Ci0gICAgICBpQ29weUxlbmd0aCAtPSAoKG1faUFsbG9jU3RlcCAtIDEpIC0gaUVuZElubmVySW5kZXgpOwotICAgIH0KLSAgICBGWF9XQ0hBUiogcEJsb2NrQnVmID0gbV9CbG9ja0FycmF5W2ldOwotICAgIEZYU1lTX21lbWNweShwQnVmICsgaVBvaW50ZXIsIHBCbG9ja0J1ZiArIGlCdWZmZXJQb2ludGVyLAotICAgICAgICAgICAgICAgICBpQ29weUxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOwotICAgIGlQb2ludGVyICs9IGlDb3B5TGVuZ3RoOwotICB9Ci0gIHdzVGV4dERhdGEuUmVsZWFzZUJ1ZmZlcihpTGVuZ3RoKTsKLX0KLQotdm9pZCBDRkRFX0Jsb2NrQnVmZmVyOjpUZXh0RGF0YUluZGV4MkJ1ZkluZGV4KGNvbnN0IGludDMyX3QgaUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlCbG9ja0luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlJbm5lckluZGV4KSBjb25zdCB7Ci0gIEFTU0VSVChpSW5kZXggPj0gMCk7Ci0gIGludDMyX3QgaVJlYWxJbmRleCA9IG1faVN0YXJ0UG9zaXRpb24gKyBpSW5kZXg7Ci0gIGlCbG9ja0luZGV4ID0gaVJlYWxJbmRleCAvIG1faUFsbG9jU3RlcDsKLSAgaUlubmVySW5kZXggPSBpUmVhbEluZGV4ICUgbV9pQWxsb2NTdGVwOwotfQotCi12b2lkIENGREVfQmxvY2tCdWZmZXI6OkNsZWFyQnVmZmVyKCkgewotICBtX2lCdWZmZXJTaXplID0gMDsKLSAgaW50MzJfdCBpU2l6ZSA9IG1fQmxvY2tBcnJheS5HZXRTaXplKCk7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyBpKyspIHsKLSAgICBGWF9GcmVlKG1fQmxvY2tBcnJheVtpXSk7Ci0gIH0KLSAgbV9CbG9ja0FycmF5LlJlbW92ZUFsbCgpOwotfQotCi1DRkRFX1hNTFN5bnRheFBhcnNlcjo6Q0ZERV9YTUxTeW50YXhQYXJzZXIoKQotICAgIDogbV9wU3RyZWFtKG51bGxwdHIpLAotICAgICAgbV9pWE1MUGxhbmVTaXplKC0xKSwKLSAgICAgIG1faUN1cnJlbnRQb3MoMCksCi0gICAgICBtX2lDdXJyZW50Tm9kZU51bSgtMSksCi0gICAgICBtX2lMYXN0Tm9kZU51bSgtMSksCi0gICAgICBtX2lQYXJzZWRDaGFycygwKSwKLSAgICAgIG1faVBhcnNlZEJ5dGVzKDApLAotICAgICAgbV9wQnVmZmVyKG51bGxwdHIpLAotICAgICAgbV9pQnVmZmVyQ2hhcnMoMCksCi0gICAgICBtX2JFT1MoZmFsc2UpLAotICAgICAgbV9wU3RhcnQobnVsbHB0ciksCi0gICAgICBtX3BFbmQobnVsbHB0ciksCi0gICAgICBtX1hNTE5vZGVTdGFjaygxNiksCi0gICAgICBtX2lBbGxvY1N0ZXAobV9CbG9ja0J1ZmZlci5HZXRBbGxvY1N0ZXAoKSksCi0gICAgICBtX2lEYXRhTGVuZ3RoKG1fQmxvY2tCdWZmZXIuR2V0RGF0YUxlbmd0aFJlZigpKSwKLSAgICAgIG1fcEN1cnJlbnRCbG9jayhudWxscHRyKSwKLSAgICAgIG1faUluZGV4SW5CbG9jaygwKSwKLSAgICAgIG1faVRleHREYXRhTGVuZ3RoKDApLAotICAgICAgbV9zeW50YXhQYXJzZXJSZXN1bHQoRkRFX1htbFN5bnRheFJlc3VsdDo6Tm9uZSksCi0gICAgICBtX3N5bnRheFBhcnNlclN0YXRlKEZERV9YbWxTeW50YXhTdGF0ZTo6VGV4dCksCi0gICAgICBtX3dRdW90YXRpb25NYXJrKDApLAotICAgICAgbV9pRW50aXR5U3RhcnQoLTEpLAotICAgICAgbV9Ta2lwU3RhY2soMTYpIHsKLSAgbV9DdXJOb2RlLmlOb2RlTnVtID0gLTE7Ci0gIG1fQ3VyTm9kZS5lTm9kZVR5cGUgPSBGREVfWE1MTk9ERV9Vbmtub3duOwotfQotCi12b2lkIENGREVfWE1MU3ludGF4UGFyc2VyOjpJbml0KGNvbnN0IENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiYgcFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpWE1MUGxhbmVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUZXh0RGF0YVNpemUpIHsKLSAgQVNTRVJUKCFtX3BTdHJlYW0gJiYgIW1fcEJ1ZmZlcik7Ci0gIEFTU0VSVChwU3RyZWFtICYmIGlYTUxQbGFuZVNpemUgPiAwKTsKLSAgaW50MzJfdCBpU3RyZWFtTGVuZ3RoID0gcFN0cmVhbS0+R2V0TGVuZ3RoKCk7Ci0gIEFTU0VSVChpU3RyZWFtTGVuZ3RoID4gMCk7Ci0gIG1fcFN0cmVhbSA9IHBTdHJlYW07Ci0gIG1faVhNTFBsYW5lU2l6ZSA9IHN0ZDo6bWluKGlYTUxQbGFuZVNpemUsIGlTdHJlYW1MZW5ndGgpOwotICB1aW50OF90IGJvbVs0XTsKLSAgbV9pQ3VycmVudFBvcyA9IG1fcFN0cmVhbS0+R2V0Qk9NKGJvbSk7Ci0gIEFTU0VSVCghbV9wQnVmZmVyKTsKLQotICBGWF9TQUZFX0lOVDMyIGFsbG9jX3NpemVfc2FmZSA9IG1faVhNTFBsYW5lU2l6ZTsKLSAgYWxsb2Nfc2l6ZV9zYWZlICs9IDE7ICAvLyBGb3IgTlVMLgotICBpZiAoIWFsbG9jX3NpemVfc2FmZS5Jc1ZhbGlkKCkgfHwgYWxsb2Nfc2l6ZV9zYWZlLlZhbHVlT3JEaWUoKSA8PSAwKSB7Ci0gICAgbV9zeW50YXhQYXJzZXJSZXN1bHQgPSBGREVfWG1sU3ludGF4UmVzdWx0OjpFcnJvcjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBtX3BCdWZmZXIgPSBGWF9BbGxvYygKLSAgICAgIEZYX1dDSEFSLCBwZGZpdW06OmJhc2U6OlZhbHVlT3JEaWVGb3JUeXBlPHNpemVfdD4oYWxsb2Nfc2l6ZV9zYWZlKSk7Ci0gIG1fcFN0YXJ0ID0gbV9wRW5kID0gbV9wQnVmZmVyOwotICBBU1NFUlQoIW1fQmxvY2tCdWZmZXIuSXNJbml0aWFsaXplZCgpKTsKLSAgbV9CbG9ja0J1ZmZlci5Jbml0QnVmZmVyKCk7Ci0gIG1fcEN1cnJlbnRCbG9jayA9IG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsKLSAgbV9pUGFyc2VkQnl0ZXMgPSBtX2lQYXJzZWRDaGFycyA9IDA7Ci0gIG1faUJ1ZmZlckNoYXJzID0gMDsKLX0KLQotRkRFX1htbFN5bnRheFJlc3VsdCBDRkRFX1hNTFN5bnRheFBhcnNlcjo6RG9TeW50YXhQYXJzZSgpIHsKLSAgaWYgKG1fc3ludGF4UGFyc2VyUmVzdWx0ID09IEZERV9YbWxTeW50YXhSZXN1bHQ6OkVycm9yIHx8Ci0gICAgICBtX3N5bnRheFBhcnNlclJlc3VsdCA9PSBGREVfWG1sU3ludGF4UmVzdWx0OjpFbmRPZlN0cmluZykgewotICAgIHJldHVybiBtX3N5bnRheFBhcnNlclJlc3VsdDsKLSAgfQotICBBU1NFUlQobV9wU3RyZWFtICYmIG1fcEJ1ZmZlciAmJiBtX0Jsb2NrQnVmZmVyLklzSW5pdGlhbGl6ZWQoKSk7Ci0gIGludDMyX3QgaVN0cmVhbUxlbmd0aCA9IG1fcFN0cmVhbS0+R2V0TGVuZ3RoKCk7Ci0gIGludDMyX3QgaVBvczsKLQotICBGREVfWG1sU3ludGF4UmVzdWx0IHN5bnRheFBhcnNlclJlc3VsdCA9IEZERV9YbWxTeW50YXhSZXN1bHQ6Ok5vbmU7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgaWYgKG1fcFN0YXJ0ID49IG1fcEVuZCkgewotICAgICAgaWYgKG1fYkVPUyB8fCBtX2lDdXJyZW50UG9zID49IGlTdHJlYW1MZW5ndGgpIHsKLSAgICAgICAgbV9zeW50YXhQYXJzZXJSZXN1bHQgPSBGREVfWG1sU3ludGF4UmVzdWx0OjpFbmRPZlN0cmluZzsKLSAgICAgICAgcmV0dXJuIG1fc3ludGF4UGFyc2VyUmVzdWx0OwotICAgICAgfQotICAgICAgbV9pUGFyc2VkQ2hhcnMgKz0gKG1fcEVuZCAtIG1fcEJ1ZmZlcik7Ci0gICAgICBtX2lQYXJzZWRCeXRlcyA9IG1faUN1cnJlbnRQb3M7Ci0gICAgICBpZiAobV9wU3RyZWFtLT5HZXRQb3NpdGlvbigpICE9IG1faUN1cnJlbnRQb3MpIHsKLSAgICAgICAgbV9wU3RyZWFtLT5TZWVrKEZYX1NUUkVBTVNFRUtfQmVnaW4sIG1faUN1cnJlbnRQb3MpOwotICAgICAgfQotICAgICAgbV9pQnVmZmVyQ2hhcnMgPQotICAgICAgICAgIG1fcFN0cmVhbS0+UmVhZFN0cmluZyhtX3BCdWZmZXIsIG1faVhNTFBsYW5lU2l6ZSwgbV9iRU9TKTsKLSAgICAgIGlQb3MgPSBtX3BTdHJlYW0tPkdldFBvc2l0aW9uKCk7Ci0gICAgICBpZiAobV9pQnVmZmVyQ2hhcnMgPCAxKSB7Ci0gICAgICAgIG1faUN1cnJlbnRQb3MgPSBpU3RyZWFtTGVuZ3RoOwotICAgICAgICBtX3N5bnRheFBhcnNlclJlc3VsdCA9IEZERV9YbWxTeW50YXhSZXN1bHQ6OkVuZE9mU3RyaW5nOwotICAgICAgICByZXR1cm4gbV9zeW50YXhQYXJzZXJSZXN1bHQ7Ci0gICAgICB9Ci0gICAgICBtX2lDdXJyZW50UG9zID0gaVBvczsKLSAgICAgIG1fcFN0YXJ0ID0gbV9wQnVmZmVyOwotICAgICAgbV9wRW5kID0gbV9wQnVmZmVyICsgbV9pQnVmZmVyQ2hhcnM7Ci0gICAgfQotCi0gICAgd2hpbGUgKG1fcFN0YXJ0IDwgbV9wRW5kKSB7Ci0gICAgICBGWF9XQ0hBUiBjaCA9ICptX3BTdGFydDsKLSAgICAgIHN3aXRjaCAobV9zeW50YXhQYXJzZXJTdGF0ZSkgewotICAgICAgICBjYXNlIEZERV9YbWxTeW50YXhTdGF0ZTo6VGV4dDoKLSAgICAgICAgICBpZiAoY2ggPT0gTCc8JykgewotICAgICAgICAgICAgaWYgKG1faURhdGFMZW5ndGggPiAwKSB7Ci0gICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9pRGF0YUxlbmd0aDsKLSAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5SZXNldCgpOwotICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPQotICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOwotICAgICAgICAgICAgICBtX2lFbnRpdHlTdGFydCA9IC0xOwotICAgICAgICAgICAgICBzeW50YXhQYXJzZXJSZXN1bHQgPSBGREVfWG1sU3ludGF4UmVzdWx0OjpUZXh0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgbV9wU3RhcnQrKzsKLSAgICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJTdGF0ZSA9IEZERV9YbWxTeW50YXhTdGF0ZTo6Tm9kZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgUGFyc2VUZXh0Q2hhcihjaCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZERV9YbWxTeW50YXhTdGF0ZTo6Tm9kZToKLSAgICAgICAgICBpZiAoY2ggPT0gTCchJykgewotICAgICAgICAgICAgbV9wU3RhcnQrKzsKLSAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OlNraXBDb21tZW50T3JEZWNsOwotICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gTCcvJykgewotICAgICAgICAgICAgbV9wU3RhcnQrKzsKLSAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OkNsb3NlRWxlbWVudDsKLSAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IEwnPycpIHsKLSAgICAgICAgICAgIG1faUxhc3ROb2RlTnVtKys7Ci0gICAgICAgICAgICBtX2lDdXJyZW50Tm9kZU51bSA9IG1faUxhc3ROb2RlTnVtOwotICAgICAgICAgICAgbV9DdXJOb2RlLmlOb2RlTnVtID0gbV9pTGFzdE5vZGVOdW07Ci0gICAgICAgICAgICBtX0N1ck5vZGUuZU5vZGVUeXBlID0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb247Ci0gICAgICAgICAgICBtX1hNTE5vZGVTdGFjay5QdXNoKG1fQ3VyTm9kZSk7Ci0gICAgICAgICAgICBtX3BTdGFydCsrOwotICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJTdGF0ZSA9IEZERV9YbWxTeW50YXhTdGF0ZTo6VGFyZ2V0OwotICAgICAgICAgICAgc3ludGF4UGFyc2VyUmVzdWx0ID0gRkRFX1htbFN5bnRheFJlc3VsdDo6SW5zdHJ1Y3Rpb25PcGVuOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX2lMYXN0Tm9kZU51bSsrOwotICAgICAgICAgICAgbV9pQ3VycmVudE5vZGVOdW0gPSBtX2lMYXN0Tm9kZU51bTsKLSAgICAgICAgICAgIG1fQ3VyTm9kZS5pTm9kZU51bSA9IG1faUxhc3ROb2RlTnVtOwotICAgICAgICAgICAgbV9DdXJOb2RlLmVOb2RlVHlwZSA9IEZERV9YTUxOT0RFX0VsZW1lbnQ7Ci0gICAgICAgICAgICBtX1hNTE5vZGVTdGFjay5QdXNoKG1fQ3VyTm9kZSk7Ci0gICAgICAgICAgICBtX3N5bnRheFBhcnNlclN0YXRlID0gRkRFX1htbFN5bnRheFN0YXRlOjpUYWc7Ci0gICAgICAgICAgICBzeW50YXhQYXJzZXJSZXN1bHQgPSBGREVfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50T3BlbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRkRFX1htbFN5bnRheFN0YXRlOjpUYXJnZXQ6Ci0gICAgICAgIGNhc2UgRkRFX1htbFN5bnRheFN0YXRlOjpUYWc6Ci0gICAgICAgICAgaWYgKCFGREVfSXNYTUxOYW1lQ2hhcihjaCwgbV9pRGF0YUxlbmd0aCA8IDEpKSB7Ci0gICAgICAgICAgICBpZiAobV9pRGF0YUxlbmd0aCA8IDEpIHsKLSAgICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJSZXN1bHQgPSBGREVfWG1sU3ludGF4UmVzdWx0OjpFcnJvcjsKLSAgICAgICAgICAgICAgcmV0dXJuIG1fc3ludGF4UGFyc2VyUmVzdWx0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhTGVuZ3RoOwotICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7Ci0gICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9Ci0gICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7Ci0gICAgICAgICAgICAgIGlmIChtX3N5bnRheFBhcnNlclN0YXRlICE9IEZERV9YbWxTeW50YXhTdGF0ZTo6VGFyZ2V0KSB7Ci0gICAgICAgICAgICAgICAgc3ludGF4UGFyc2VyUmVzdWx0ID0gRkRFX1htbFN5bnRheFJlc3VsdDo6VGFnTmFtZTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW50YXhQYXJzZXJSZXN1bHQgPSBGREVfWG1sU3ludGF4UmVzdWx0OjpUYXJnZXROYW1lOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OkF0dHJpTmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1faUluZGV4SW5CbG9jayA9PSBtX2lBbGxvY1N0ZXApIHsKLSAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0KLSAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsKLSAgICAgICAgICAgICAgaWYgKCFtX3BDdXJyZW50QmxvY2spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1htbFN5bnRheFJlc3VsdDo6RXJyb3I7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9ja1ttX2lJbmRleEluQmxvY2srK10gPSBjaDsKLSAgICAgICAgICAgIG1faURhdGFMZW5ndGgrKzsKLSAgICAgICAgICAgIG1fcFN0YXJ0Kys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZERV9YbWxTeW50YXhTdGF0ZTo6QXR0cmlOYW1lOgotICAgICAgICAgIGlmIChtX2lEYXRhTGVuZ3RoIDwgMSAmJiBGREVfSXNYTUxXaGl0ZVNwYWNlKGNoKSkgewotICAgICAgICAgICAgbV9wU3RhcnQrKzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoIUZERV9Jc1hNTE5hbWVDaGFyKGNoLCBtX2lEYXRhTGVuZ3RoIDwgMSkpIHsKLSAgICAgICAgICAgIGlmIChtX2lEYXRhTGVuZ3RoIDwgMSkgewotICAgICAgICAgICAgICBpZiAobV9DdXJOb2RlLmVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoID09IEwnPicgfHwgY2ggPT0gTCcvJykgewotICAgICAgICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJTdGF0ZSA9IEZERV9YbWxTeW50YXhTdGF0ZTo6QnJlYWtFbGVtZW50OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1fQ3VyTm9kZS5lTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gTCc/JykgewotICAgICAgICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJTdGF0ZSA9IEZERV9YbWxTeW50YXhTdGF0ZTo6Q2xvc2VJbnN0cnVjdGlvbjsKLSAgICAgICAgICAgICAgICAgIG1fcFN0YXJ0Kys7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OlRhcmdldERhdGE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyUmVzdWx0ID0gRkRFX1htbFN5bnRheFJlc3VsdDo6RXJyb3I7Ci0gICAgICAgICAgICAgIHJldHVybiBtX3N5bnRheFBhcnNlclJlc3VsdDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGlmIChtX0N1ck5vZGUuZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNoICE9ICc9JyAmJiAhRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsKLSAgICAgICAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OlRhcmdldERhdGE7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhTGVuZ3RoOwotICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7Ci0gICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9Ci0gICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7Ci0gICAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OkF0dHJpRXF1YWxTaWduOwotICAgICAgICAgICAgICBzeW50YXhQYXJzZXJSZXN1bHQgPSBGREVfWG1sU3ludGF4UmVzdWx0OjpBdHRyaU5hbWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX2lJbmRleEluQmxvY2sgPT0gbV9pQWxsb2NTdGVwKSB7Ci0gICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9Ci0gICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7Ci0gICAgICAgICAgICAgIGlmICghbV9wQ3VycmVudEJsb2NrKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZERV9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX3BDdXJyZW50QmxvY2tbbV9pSW5kZXhJbkJsb2NrKytdID0gY2g7Ci0gICAgICAgICAgICBtX2lEYXRhTGVuZ3RoKys7Ci0gICAgICAgICAgICBtX3BTdGFydCsrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGREVfWG1sU3ludGF4U3RhdGU6OkF0dHJpRXF1YWxTaWduOgotICAgICAgICAgIGlmIChGREVfSXNYTUxXaGl0ZVNwYWNlKGNoKSkgewotICAgICAgICAgICAgbV9wU3RhcnQrKzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoY2ggIT0gTCc9JykgewotICAgICAgICAgICAgaWYgKG1fQ3VyTm9kZS5lTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pIHsKLSAgICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJTdGF0ZSA9IEZERV9YbWxTeW50YXhTdGF0ZTo6VGFyZ2V0RGF0YTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX3N5bnRheFBhcnNlclJlc3VsdCA9IEZERV9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOwotICAgICAgICAgICAgcmV0dXJuIG1fc3ludGF4UGFyc2VyUmVzdWx0OwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3N5bnRheFBhcnNlclN0YXRlID0gRkRFX1htbFN5bnRheFN0YXRlOjpBdHRyaVF1b3RhdGlvbjsKLSAgICAgICAgICAgIG1fcFN0YXJ0Kys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZERV9YbWxTeW50YXhTdGF0ZTo6QXR0cmlRdW90YXRpb246Ci0gICAgICAgICAgaWYgKEZERV9Jc1hNTFdoaXRlU3BhY2UoY2gpKSB7Ci0gICAgICAgICAgICBtX3BTdGFydCsrOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChjaCAhPSBMJ1wiJyAmJiBjaCAhPSBMJ1wnJykgewotICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJSZXN1bHQgPSBGREVfWG1sU3ludGF4UmVzdWx0OjpFcnJvcjsKLSAgICAgICAgICAgIHJldHVybiBtX3N5bnRheFBhcnNlclJlc3VsdDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV93UXVvdGF0aW9uTWFyayA9IGNoOwotICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJTdGF0ZSA9IEZERV9YbWxTeW50YXhTdGF0ZTo6QXR0cmlWYWx1ZTsKLSAgICAgICAgICAgIG1fcFN0YXJ0Kys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZERV9YbWxTeW50YXhTdGF0ZTo6QXR0cmlWYWx1ZToKLSAgICAgICAgICBpZiAoY2ggPT0gbV93UXVvdGF0aW9uTWFyaykgewotICAgICAgICAgICAgaWYgKG1faUVudGl0eVN0YXJ0ID4gLTEpIHsKLSAgICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJSZXN1bHQgPSBGREVfWG1sU3ludGF4UmVzdWx0OjpFcnJvcjsKLSAgICAgICAgICAgICAgcmV0dXJuIG1fc3ludGF4UGFyc2VyUmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhTGVuZ3RoOwotICAgICAgICAgICAgbV93UXVvdGF0aW9uTWFyayA9IDA7Ci0gICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7Ci0gICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPSBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7Ci0gICAgICAgICAgICBtX3BTdGFydCsrOwotICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJTdGF0ZSA9IEZERV9YbWxTeW50YXhTdGF0ZTo6QXR0cmlOYW1lOwotICAgICAgICAgICAgc3ludGF4UGFyc2VyUmVzdWx0ID0gRkRFX1htbFN5bnRheFJlc3VsdDo6QXR0cmlWYWx1ZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgUGFyc2VUZXh0Q2hhcihjaCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZERV9YbWxTeW50YXhTdGF0ZTo6Q2xvc2VJbnN0cnVjdGlvbjoKLSAgICAgICAgICBpZiAoY2ggIT0gTCc+JykgewotICAgICAgICAgICAgaWYgKG1faUluZGV4SW5CbG9jayA9PSBtX2lBbGxvY1N0ZXApIHsKLSAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0KLSAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsKLSAgICAgICAgICAgICAgaWYgKCFtX3BDdXJyZW50QmxvY2spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRkRFX1htbFN5bnRheFJlc3VsdDo6RXJyb3I7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9ja1ttX2lJbmRleEluQmxvY2srK10gPSBjaDsKLSAgICAgICAgICAgIG1faURhdGFMZW5ndGgrKzsKLSAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OlRhcmdldERhdGE7Ci0gICAgICAgICAgfSBlbHNlIGlmIChtX2lEYXRhTGVuZ3RoID4gMCkgewotICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhTGVuZ3RoOwotICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5SZXNldCgpOwotICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOwotICAgICAgICAgICAgc3ludGF4UGFyc2VyUmVzdWx0ID0gRkRFX1htbFN5bnRheFJlc3VsdDo6VGFyZ2V0RGF0YTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9wU3RhcnQrKzsKLSAgICAgICAgICAgIEZERV9YTUxOT0RFKiBwWE1MTm9kZSA9IG1fWE1MTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmICghcFhNTE5vZGUpIHsKLSAgICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJSZXN1bHQgPSBGREVfWG1sU3ludGF4UmVzdWx0OjpFcnJvcjsKLSAgICAgICAgICAgICAgcmV0dXJuIG1fc3ludGF4UGFyc2VyUmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9YTUxOb2RlU3RhY2suUG9wKCk7Ci0gICAgICAgICAgICBwWE1MTm9kZSA9IG1fWE1MTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsKLSAgICAgICAgICAgIGlmIChwWE1MTm9kZSkgewotICAgICAgICAgICAgICBtX0N1ck5vZGUgPSAqcFhNTE5vZGU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBtX0N1ck5vZGUuaU5vZGVOdW0gPSAtMTsKLSAgICAgICAgICAgICAgbV9DdXJOb2RlLmVOb2RlVHlwZSA9IEZERV9YTUxOT0RFX1Vua25vd247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2lDdXJyZW50Tm9kZU51bSA9IG1fQ3VyTm9kZS5pTm9kZU51bTsKLSAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsKLSAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9IG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsKLSAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OlRleHQ7Ci0gICAgICAgICAgICBzeW50YXhQYXJzZXJSZXN1bHQgPSBGREVfWG1sU3ludGF4UmVzdWx0OjpJbnN0cnVjdGlvbkNsb3NlOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGREVfWG1sU3ludGF4U3RhdGU6OkJyZWFrRWxlbWVudDoKLSAgICAgICAgICBpZiAoY2ggPT0gTCc+JykgewotICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJTdGF0ZSA9IEZERV9YbWxTeW50YXhTdGF0ZTo6VGV4dDsKLSAgICAgICAgICAgIHN5bnRheFBhcnNlclJlc3VsdCA9IEZERV9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRCcmVhazsKLSAgICAgICAgICB9IGVsc2UgaWYgKGNoID09IEwnLycpIHsKLSAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OkNsb3NlRWxlbWVudDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJSZXN1bHQgPSBGREVfWG1sU3ludGF4UmVzdWx0OjpFcnJvcjsKLSAgICAgICAgICAgIHJldHVybiBtX3N5bnRheFBhcnNlclJlc3VsdDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbV9wU3RhcnQrKzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGREVfWG1sU3ludGF4U3RhdGU6OkNsb3NlRWxlbWVudDoKLSAgICAgICAgICBpZiAoIUZERV9Jc1hNTE5hbWVDaGFyKGNoLCBtX2lEYXRhTGVuZ3RoIDwgMSkpIHsKLSAgICAgICAgICAgIGlmIChjaCA9PSBMJz4nKSB7Ci0gICAgICAgICAgICAgIEZERV9YTUxOT0RFKiBwWE1MTm9kZSA9IG1fWE1MTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgaWYgKCFwWE1MTm9kZSkgewotICAgICAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyUmVzdWx0ID0gRkRFX1htbFN5bnRheFJlc3VsdDo6RXJyb3I7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1fc3ludGF4UGFyc2VyUmVzdWx0OwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIG1fWE1MTm9kZVN0YWNrLlBvcCgpOwotICAgICAgICAgICAgICBwWE1MTm9kZSA9IG1fWE1MTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgaWYgKHBYTUxOb2RlKSB7Ci0gICAgICAgICAgICAgICAgbV9DdXJOb2RlID0gKnBYTUxOb2RlOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1fQ3VyTm9kZS5pTm9kZU51bSA9IC0xOwotICAgICAgICAgICAgICAgIG1fQ3VyTm9kZS5lTm9kZVR5cGUgPSBGREVfWE1MTk9ERV9Vbmtub3duOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIG1faUN1cnJlbnROb2RlTnVtID0gbV9DdXJOb2RlLmlOb2RlTnVtOwotICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFMZW5ndGg7Ci0gICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuUmVzZXQoKTsKLSAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0KLSAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsKLSAgICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJTdGF0ZSA9IEZERV9YbWxTeW50YXhTdGF0ZTo6VGV4dDsKLSAgICAgICAgICAgICAgc3ludGF4UGFyc2VyUmVzdWx0ID0gRkRFX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudENsb3NlOwotICAgICAgICAgICAgfSBlbHNlIGlmICghRkRFX0lzWE1MV2hpdGVTcGFjZShjaCkpIHsKLSAgICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJSZXN1bHQgPSBGREVfWG1sU3ludGF4UmVzdWx0OjpFcnJvcjsKLSAgICAgICAgICAgICAgcmV0dXJuIG1fc3ludGF4UGFyc2VyUmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobV9pSW5kZXhJbkJsb2NrID09IG1faUFsbG9jU3RlcCkgewotICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPQotICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOwotICAgICAgICAgICAgICBpZiAoIW1fcEN1cnJlbnRCbG9jaykgewotICAgICAgICAgICAgICAgIHJldHVybiBGREVfWG1sU3ludGF4UmVzdWx0OjpFcnJvcjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrW21faUluZGV4SW5CbG9jaysrXSA9IGNoOwotICAgICAgICAgICAgbV9pRGF0YUxlbmd0aCsrOwotICAgICAgICAgIH0KLSAgICAgICAgICBtX3BTdGFydCsrOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZERV9YbWxTeW50YXhTdGF0ZTo6U2tpcENvbW1lbnRPckRlY2w6Ci0gICAgICAgICAgaWYgKEZYU1lTX3djc25pY21wKG1fcFN0YXJ0LCBMIi0tIiwgMikgPT0gMCkgewotICAgICAgICAgICAgbV9wU3RhcnQgKz0gMjsKLSAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OlNraXBDb21tZW50OwotICAgICAgICAgIH0gZWxzZSBpZiAoRlhTWVNfd2NzbmljbXAobV9wU3RhcnQsIEwiW0NEQVRBWyIsIDcpID09IDApIHsKLSAgICAgICAgICAgIG1fcFN0YXJ0ICs9IDc7Ci0gICAgICAgICAgICBtX3N5bnRheFBhcnNlclN0YXRlID0gRkRFX1htbFN5bnRheFN0YXRlOjpTa2lwQ0RhdGE7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fc3ludGF4UGFyc2VyU3RhdGUgPSBGREVfWG1sU3ludGF4U3RhdGU6OlNraXBEZWNsTm9kZTsKLSAgICAgICAgICAgIG1fU2tpcENoYXIgPSBMJz4nOwotICAgICAgICAgICAgbV9Ta2lwU3RhY2suUHVzaChMJz4nKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRkRFX1htbFN5bnRheFN0YXRlOjpTa2lwQ0RhdGE6IHsKLSAgICAgICAgICBpZiAoRlhTWVNfd2NzbmljbXAobV9wU3RhcnQsIEwiXV0+IiwgMykgPT0gMCkgewotICAgICAgICAgICAgbV9wU3RhcnQgKz0gMzsKLSAgICAgICAgICAgIHN5bnRheFBhcnNlclJlc3VsdCA9IEZERV9YbWxTeW50YXhSZXN1bHQ6OkNEYXRhOwotICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhTGVuZ3RoOwotICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5SZXNldCgpOwotICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOwotICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJTdGF0ZSA9IEZERV9YbWxTeW50YXhTdGF0ZTo6VGV4dDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1faUluZGV4SW5CbG9jayA9PSBtX2lBbGxvY1N0ZXApIHsKLSAgICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrID0KLSAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsKLSAgICAgICAgICAgICAgaWYgKCFtX3BDdXJyZW50QmxvY2spCi0gICAgICAgICAgICAgICAgcmV0dXJuIEZERV9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbV9wQ3VycmVudEJsb2NrW21faUluZGV4SW5CbG9jaysrXSA9IGNoOwotICAgICAgICAgICAgbV9pRGF0YUxlbmd0aCsrOwotICAgICAgICAgICAgbV9wU3RhcnQrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBGREVfWG1sU3ludGF4U3RhdGU6OlNraXBEZWNsTm9kZToKLSAgICAgICAgICBpZiAobV9Ta2lwQ2hhciA9PSBMJ1wnJyB8fCBtX1NraXBDaGFyID09IEwnXCInKSB7Ci0gICAgICAgICAgICBtX3BTdGFydCsrOwotICAgICAgICAgICAgaWYgKGNoICE9IG1fU2tpcENoYXIpCi0gICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBtX1NraXBTdGFjay5Qb3AoKTsKLSAgICAgICAgICAgIHVpbnQzMl90KiBwRFdvcmQgPSBtX1NraXBTdGFjay5HZXRUb3BFbGVtZW50KCk7Ci0gICAgICAgICAgICBpZiAoIXBEV29yZCkKLSAgICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJTdGF0ZSA9IEZERV9YbWxTeW50YXhTdGF0ZTo6VGV4dDsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IChGWF9XQ0hBUikqcERXb3JkOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNoKSB7Ci0gICAgICAgICAgICAgIGNhc2UgTCc8JzoKLSAgICAgICAgICAgICAgICBtX1NraXBDaGFyID0gTCc+JzsKLSAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5QdXNoKEwnPicpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIEwnWyc6Ci0gICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IEwnXSc7Ci0gICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUHVzaChMJ10nKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSBMJygnOgotICAgICAgICAgICAgICAgIG1fU2tpcENoYXIgPSBMJyknOwotICAgICAgICAgICAgICAgIG1fU2tpcFN0YWNrLlB1c2goTCcpJyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgTCdcJyc6Ci0gICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IEwnXCcnOwotICAgICAgICAgICAgICAgIG1fU2tpcFN0YWNrLlB1c2goTCdcJycpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIEwnXCInOgotICAgICAgICAgICAgICAgIG1fU2tpcENoYXIgPSBMJ1wiJzsKLSAgICAgICAgICAgICAgICBtX1NraXBTdGFjay5QdXNoKEwnXCInKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBpZiAoY2ggPT0gbV9Ta2lwQ2hhcikgewotICAgICAgICAgICAgICAgICAgbV9Ta2lwU3RhY2suUG9wKCk7Ci0gICAgICAgICAgICAgICAgICB1aW50MzJfdCogcERXb3JkID0gbV9Ta2lwU3RhY2suR2V0VG9wRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgaWYgKCFwRFdvcmQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1faURhdGFMZW5ndGggPj0gOSkgewotICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzSGVhZGVyOwotICAgICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0VGV4dERhdGEod3NIZWFkZXIsIDAsIDcpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1faVRleHREYXRhTGVuZ3RoID0gbV9pRGF0YUxlbmd0aDsKLSAgICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5SZXNldCgpOwotICAgICAgICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPQotICAgICAgICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOwotICAgICAgICAgICAgICAgICAgICBtX3N5bnRheFBhcnNlclN0YXRlID0gRkRFX1htbFN5bnRheFN0YXRlOjpUZXh0OwotICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbV9Ta2lwQ2hhciA9IHN0YXRpY19jYXN0PEZYX1dDSEFSPigqcERXb3JkKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobV9Ta2lwU3RhY2suR2V0U2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICBpZiAobV9pSW5kZXhJbkJsb2NrID09IG1faUFsbG9jU3RlcCkgewotICAgICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9Ci0gICAgICAgICAgICAgICAgICAgIG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsKLSAgICAgICAgICAgICAgICBpZiAoIW1fcEN1cnJlbnRCbG9jaykgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIEZERV9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2tbbV9pSW5kZXhJbkJsb2NrKytdID0gY2g7Ci0gICAgICAgICAgICAgIG1faURhdGFMZW5ndGgrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1fcFN0YXJ0Kys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZERV9YbWxTeW50YXhTdGF0ZTo6U2tpcENvbW1lbnQ6Ci0gICAgICAgICAgaWYgKEZYU1lTX3djc25pY21wKG1fcFN0YXJ0LCBMIi0tPiIsIDMpID09IDApIHsKLSAgICAgICAgICAgIG1fcFN0YXJ0ICs9IDI7Ci0gICAgICAgICAgICBtX3N5bnRheFBhcnNlclN0YXRlID0gRkRFX1htbFN5bnRheFN0YXRlOjpUZXh0OwotICAgICAgICAgIH0KLQotICAgICAgICAgIG1fcFN0YXJ0Kys7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRkRFX1htbFN5bnRheFN0YXRlOjpUYXJnZXREYXRhOgotICAgICAgICAgIGlmIChGREVfSXNYTUxXaGl0ZVNwYWNlKGNoKSkgewotICAgICAgICAgICAgaWYgKG1faURhdGFMZW5ndGggPCAxKSB7Ci0gICAgICAgICAgICAgIG1fcFN0YXJ0Kys7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtX3dRdW90YXRpb25NYXJrID09IDApIHsKLSAgICAgICAgICAgICAgbV9pVGV4dERhdGFMZW5ndGggPSBtX2lEYXRhTGVuZ3RoOwotICAgICAgICAgICAgICBtX3dRdW90YXRpb25NYXJrID0gMDsKLSAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5SZXNldCgpOwotICAgICAgICAgICAgICBtX3BDdXJyZW50QmxvY2sgPQotICAgICAgICAgICAgICAgICAgbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOwotICAgICAgICAgICAgICBtX3BTdGFydCsrOwotICAgICAgICAgICAgICBzeW50YXhQYXJzZXJSZXN1bHQgPSBGREVfWG1sU3ludGF4UmVzdWx0OjpUYXJnZXREYXRhOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGNoID09ICc/JykgewotICAgICAgICAgICAgbV9zeW50YXhQYXJzZXJTdGF0ZSA9IEZERV9YbWxTeW50YXhTdGF0ZTo6Q2xvc2VJbnN0cnVjdGlvbjsKLSAgICAgICAgICAgIG1fcFN0YXJ0Kys7Ci0gICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXCInKSB7Ci0gICAgICAgICAgICBpZiAobV93UXVvdGF0aW9uTWFyayA9PSAwKSB7Ci0gICAgICAgICAgICAgIG1fd1F1b3RhdGlvbk1hcmsgPSBjaDsKLSAgICAgICAgICAgICAgbV9wU3RhcnQrKzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gbV93UXVvdGF0aW9uTWFyaykgewotICAgICAgICAgICAgICBtX2lUZXh0RGF0YUxlbmd0aCA9IG1faURhdGFMZW5ndGg7Ci0gICAgICAgICAgICAgIG1fd1F1b3RhdGlvbk1hcmsgPSAwOwotICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlJlc2V0KCk7Ci0gICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9Ci0gICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7Ci0gICAgICAgICAgICAgIG1fcFN0YXJ0Kys7Ci0gICAgICAgICAgICAgIHN5bnRheFBhcnNlclJlc3VsdCA9IEZERV9YbWxTeW50YXhSZXN1bHQ6OlRhcmdldERhdGE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBtX3N5bnRheFBhcnNlclJlc3VsdCA9IEZERV9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOwotICAgICAgICAgICAgICByZXR1cm4gbV9zeW50YXhQYXJzZXJSZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChtX2lJbmRleEluQmxvY2sgPT0gbV9pQWxsb2NTdGVwKSB7Ci0gICAgICAgICAgICAgIG1fcEN1cnJlbnRCbG9jayA9Ci0gICAgICAgICAgICAgICAgICBtX0Jsb2NrQnVmZmVyLkdldEF2YWlsYWJsZUJsb2NrKG1faUluZGV4SW5CbG9jayk7Ci0gICAgICAgICAgICAgIGlmICghbV9wQ3VycmVudEJsb2NrKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEZERV9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX3BDdXJyZW50QmxvY2tbbV9pSW5kZXhJbkJsb2NrKytdID0gY2g7Ci0gICAgICAgICAgICBtX2lEYXRhTGVuZ3RoKys7Ci0gICAgICAgICAgICBtX3BTdGFydCsrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChzeW50YXhQYXJzZXJSZXN1bHQgIT0gRkRFX1htbFN5bnRheFJlc3VsdDo6Tm9uZSkKLSAgICAgICAgcmV0dXJuIHN5bnRheFBhcnNlclJlc3VsdDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIEZERV9YbWxTeW50YXhSZXN1bHQ6OlRleHQ7Ci19Ci0KLUNGREVfWE1MU3ludGF4UGFyc2VyOjp+Q0ZERV9YTUxTeW50YXhQYXJzZXIoKSB7Ci0gIG1fcEN1cnJlbnRCbG9jayA9IG51bGxwdHI7Ci0gIEZYX0ZyZWUobV9wQnVmZmVyKTsKLX0KLQotaW50MzJfdCBDRkRFX1hNTFN5bnRheFBhcnNlcjo6R2V0U3RhdHVzKCkgY29uc3QgewotICBpZiAoIW1fcFN0cmVhbSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaW50MzJfdCBpU3RyZWFtTGVuZ3RoID0gbV9wU3RyZWFtLT5HZXRMZW5ndGgoKTsKLSAgaWYgKGlTdHJlYW1MZW5ndGggPCAxKQotICAgIHJldHVybiAxMDA7Ci0KLSAgaWYgKG1fc3ludGF4UGFyc2VyUmVzdWx0ID09IEZERV9YbWxTeW50YXhSZXN1bHQ6OkVycm9yKQotICAgIHJldHVybiAtMTsKLQotICBpZiAobV9zeW50YXhQYXJzZXJSZXN1bHQgPT0gRkRFX1htbFN5bnRheFJlc3VsdDo6RW5kT2ZTdHJpbmcpCi0gICAgcmV0dXJuIDEwMDsKLSAgcmV0dXJuIG1faVBhcnNlZEJ5dGVzICogMTAwIC8gaVN0cmVhbUxlbmd0aDsKLX0KLQotc3RhdGljIGludDMyX3QgRlhfR2V0VVRGOEVuY29kZUxlbmd0aChjb25zdCBGWF9XQ0hBUiogcFNyYywgaW50MzJfdCBpU3JjTGVuKSB7Ci0gIHVpbnQzMl90IHVuaWNvZGUgPSAwOwotICBpbnQzMl90IGlEc3ROdW0gPSAwOwotICB3aGlsZSAoaVNyY0xlbi0tID4gMCkgewotICAgIHVuaWNvZGUgPSAqcFNyYysrOwotICAgIGludCBuYnl0ZXMgPSAwOwotICAgIGlmICgodWludDMyX3QpdW5pY29kZSA8IDB4ODApIHsKLSAgICAgIG5ieXRlcyA9IDE7Ci0gICAgfSBlbHNlIGlmICgodWludDMyX3QpdW5pY29kZSA8IDB4ODAwKSB7Ci0gICAgICBuYnl0ZXMgPSAyOwotICAgIH0gZWxzZSBpZiAoKHVpbnQzMl90KXVuaWNvZGUgPCAweDEwMDAwKSB7Ci0gICAgICBuYnl0ZXMgPSAzOwotICAgIH0gZWxzZSBpZiAoKHVpbnQzMl90KXVuaWNvZGUgPCAweDIwMDAwMCkgewotICAgICAgbmJ5dGVzID0gNDsKLSAgICB9IGVsc2UgaWYgKCh1aW50MzJfdCl1bmljb2RlIDwgMHg0MDAwMDAwKSB7Ci0gICAgICBuYnl0ZXMgPSA1OwotICAgIH0gZWxzZSB7Ci0gICAgICBuYnl0ZXMgPSA2OwotICAgIH0KLSAgICBpRHN0TnVtICs9IG5ieXRlczsKLSAgfQotICByZXR1cm4gaURzdE51bTsKLX0KLQotRlhfRklMRVNJWkUgQ0ZERV9YTUxTeW50YXhQYXJzZXI6OkdldEN1cnJlbnRCaW5hcnlQb3MoKSBjb25zdCB7Ci0gIGlmICghbV9wU3RyZWFtKQotICAgIHJldHVybiAwOwotCi0gIGludDMyX3QgblNyY0xlbiA9IG1fcFN0YXJ0IC0gbV9wQnVmZmVyOwotICBpbnQzMl90IG5Ec3RMZW4gPSBGWF9HZXRVVEY4RW5jb2RlTGVuZ3RoKG1fcEJ1ZmZlciwgblNyY0xlbik7Ci0gIHJldHVybiBtX2lQYXJzZWRCeXRlcyArIG5Ec3RMZW47Ci19Ci0KLXZvaWQgQ0ZERV9YTUxTeW50YXhQYXJzZXI6OlBhcnNlVGV4dENoYXIoRlhfV0NIQVIgY2hhcmFjdGVyKSB7Ci0gIGlmIChtX2lJbmRleEluQmxvY2sgPT0gbV9pQWxsb2NTdGVwKSB7Ci0gICAgbV9wQ3VycmVudEJsb2NrID0gbV9CbG9ja0J1ZmZlci5HZXRBdmFpbGFibGVCbG9jayhtX2lJbmRleEluQmxvY2spOwotICAgIGlmICghbV9wQ3VycmVudEJsb2NrKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIG1fcEN1cnJlbnRCbG9ja1ttX2lJbmRleEluQmxvY2srK10gPSBjaGFyYWN0ZXI7Ci0gIG1faURhdGFMZW5ndGgrKzsKLSAgaWYgKG1faUVudGl0eVN0YXJ0ID4gLTEgJiYgY2hhcmFjdGVyID09IEwnOycpIHsKLSAgICBDRlhfV2lkZVN0cmluZyBjc0VudGl0eTsKLSAgICBtX0Jsb2NrQnVmZmVyLkdldFRleHREYXRhKGNzRW50aXR5LCBtX2lFbnRpdHlTdGFydCArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV9pRGF0YUxlbmd0aCAtIDEpIC0gbV9pRW50aXR5U3RhcnQgLSAxKTsKLSAgICBpbnQzMl90IGlMZW4gPSBjc0VudGl0eS5HZXRMZW5ndGgoKTsKLSAgICBpZiAoaUxlbiA+IDApIHsKLSAgICAgIGlmIChjc0VudGl0eVswXSA9PSBMJyMnKSB7Ci0gICAgICAgIHVpbnQzMl90IGNoID0gMDsKLSAgICAgICAgRlhfV0NIQVIgdzsKLSAgICAgICAgaWYgKGlMZW4gPiAxICYmIGNzRW50aXR5WzFdID09IEwneCcpIHsKLSAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDI7IGkgPCBpTGVuOyBpKyspIHsKLSAgICAgICAgICAgIHcgPSBjc0VudGl0eVtpXTsKLSAgICAgICAgICAgIGlmICh3ID49IEwnMCcgJiYgdyA8PSBMJzknKSB7Ci0gICAgICAgICAgICAgIGNoID0gKGNoIDw8IDQpICsgdyAtIEwnMCc7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHcgPj0gTCdBJyAmJiB3IDw9IEwnRicpIHsKLSAgICAgICAgICAgICAgY2ggPSAoY2ggPDwgNCkgKyB3IC0gNTU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHcgPj0gTCdhJyAmJiB3IDw9IEwnZicpIHsKLSAgICAgICAgICAgICAgY2ggPSAoY2ggPDwgNCkgKyB3IC0gODc7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgaUxlbjsgaSsrKSB7Ci0gICAgICAgICAgICB3ID0gY3NFbnRpdHlbaV07Ci0gICAgICAgICAgICBpZiAodyA8IEwnMCcgfHwgdyA+IEwnOScpCi0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2ggPSBjaCAqIDEwICsgdyAtIEwnMCc7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChjaCA+IGtNYXhDaGFyUmFuZ2UpCi0gICAgICAgICAgY2ggPSAnICc7Ci0KLSAgICAgICAgY2hhcmFjdGVyID0gc3RhdGljX2Nhc3Q8RlhfV0NIQVI+KGNoKTsKLSAgICAgICAgaWYgKGNoYXJhY3RlciAhPSAwKSB7Ci0gICAgICAgICAgbV9CbG9ja0J1ZmZlci5TZXRUZXh0Q2hhcihtX2lFbnRpdHlTdGFydCwgY2hhcmFjdGVyKTsKLSAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoY3NFbnRpdHkuQ29tcGFyZShMImFtcCIpID09IDApIHsKLSAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlNldFRleHRDaGFyKG1faUVudGl0eVN0YXJ0LCBMJyYnKTsKLSAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOwotICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJsdCIpID09IDApIHsKLSAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlNldFRleHRDaGFyKG1faUVudGl0eVN0YXJ0LCBMJzwnKTsKLSAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOwotICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJndCIpID09IDApIHsKLSAgICAgICAgICBtX0Jsb2NrQnVmZmVyLlNldFRleHRDaGFyKG1faUVudGl0eVN0YXJ0LCBMJz4nKTsKLSAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOwotICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJhcG9zIikgPT0gMCkgewotICAgICAgICAgIG1fQmxvY2tCdWZmZXIuU2V0VGV4dENoYXIobV9pRW50aXR5U3RhcnQsIEwnXCcnKTsKLSAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOwotICAgICAgICB9IGVsc2UgaWYgKGNzRW50aXR5LkNvbXBhcmUoTCJxdW90IikgPT0gMCkgewotICAgICAgICAgIG1fQmxvY2tCdWZmZXIuU2V0VGV4dENoYXIobV9pRW50aXR5U3RhcnQsIEwnXCInKTsKLSAgICAgICAgICBtX2lFbnRpdHlTdGFydCsrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIG1fQmxvY2tCdWZmZXIuRGVsZXRlVGV4dENoYXJzKG1faURhdGFMZW5ndGggLSBtX2lFbnRpdHlTdGFydCwgZmFsc2UpOwotICAgIG1fcEN1cnJlbnRCbG9jayA9IG1fQmxvY2tCdWZmZXIuR2V0QXZhaWxhYmxlQmxvY2sobV9pSW5kZXhJbkJsb2NrKTsKLSAgICBtX2lFbnRpdHlTdGFydCA9IC0xOwotICB9IGVsc2UgewotICAgIGlmIChtX2lFbnRpdHlTdGFydCA8IDAgJiYgY2hhcmFjdGVyID09IEwnJicpIHsKLSAgICAgIG1faUVudGl0eVN0YXJ0ID0gbV9pRGF0YUxlbmd0aCAtIDE7Ci0gICAgfQotICB9Ci0gIG1fcFN0YXJ0Kys7Ci19CmRpZmYgLS1naXQgYS94ZmEvZmRlL3htbC9mZGVfeG1sX2ltcC5oIGIveGZhL2ZkZS94bWwvZmRlX3htbF9pbXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFlODRiYS4uMDAwMDAwMAotLS0gYS94ZmEvZmRlL3htbC9mZGVfeG1sX2ltcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRkRFX1hNTF9GREVfWE1MX0lNUF9IXwotI2RlZmluZSBYRkFfRkRFX1hNTF9GREVfWE1MX0lNUF9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS94bWwvZmRlX3htbC5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2NydC9mZ2FzX3N0cmVhbS5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2NydC9mZ2FzX3V0aWxzLmgiCi0KLWNsYXNzIENGREVfQmxvY2tCdWZmZXI7Ci1jbGFzcyBDRkRFX1hNTEluc3RydWN0aW9uOwotY2xhc3MgQ0ZERV9YTUxFbGVtZW50OwotY2xhc3MgQ0ZERV9YTUxUZXh0OwotY2xhc3MgQ0ZERV9YTUxEb2M7Ci1jbGFzcyBDRkRFX1hNTERPTVBhcnNlcjsKLWNsYXNzIENGREVfWE1MU3ludGF4UGFyc2VyOwotY2xhc3MgSUZERV9YTUxQYXJzZXI7Ci0KLWNsYXNzIENGREVfWE1MTm9kZSB7Ci0gcHVibGljOgotICBlbnVtIE5vZGVJdGVtIHsKLSAgICBSb290ID0gMCwKLSAgICBQYXJlbnQsCi0gICAgRmlyc3RTaWJsaW5nLAotICAgIFByaW9yU2libGluZywKLSAgICBOZXh0U2libGluZywKLSAgICBMYXN0U2libGluZywKLSAgICBGaXJzdE5laWdoYm9yLAotICAgIFByaW9yTmVpZ2hib3IsCi0gICAgTmV4dE5laWdoYm9yLAotICAgIExhc3ROZWlnaGJvciwKLSAgICBGaXJzdENoaWxkLAotICAgIExhc3RDaGlsZAotICB9OwotCi0gIENGREVfWE1MTm9kZSgpOwotICB2aXJ0dWFsIH5DRkRFX1hNTE5vZGUoKTsKLQotICB2aXJ0dWFsIEZERV9YTUxOT0RFVFlQRSBHZXRUeXBlKCkgY29uc3Q7Ci0gIHZpcnR1YWwgQ0ZERV9YTUxOb2RlKiBDbG9uZShib29sIGJSZWN1cnNpdmUpOwotCi0gIGludDMyX3QgQ291bnRDaGlsZE5vZGVzKCkgY29uc3Q7Ci0gIENGREVfWE1MTm9kZSogR2V0Q2hpbGROb2RlKGludDMyX3QgaW5kZXgpIGNvbnN0OwotICBpbnQzMl90IEdldENoaWxkTm9kZUluZGV4KENGREVfWE1MTm9kZSogcE5vZGUpIGNvbnN0OwotICBpbnQzMl90IEluc2VydENoaWxkTm9kZShDRkRFX1hNTE5vZGUqIHBOb2RlLCBpbnQzMl90IGluZGV4ID0gLTEpOwotICB2b2lkIFJlbW92ZUNoaWxkTm9kZShDRkRFX1hNTE5vZGUqIHBOb2RlKTsKLSAgdm9pZCBEZWxldGVDaGlsZHJlbigpOwotICB2b2lkIENsb25lQ2hpbGRyZW4oQ0ZERV9YTUxOb2RlKiBwQ2xvbmUpOwotCi0gIENGREVfWE1MTm9kZSogR2V0UGF0aChjb25zdCBGWF9XQ0hBUiogcFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGggPSAtMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlF1YWxpZmllZE5hbWUgPSB0cnVlKSBjb25zdDsKLQotICBpbnQzMl90IEdldE5vZGVMZXZlbCgpIGNvbnN0OwotICBDRkRFX1hNTE5vZGUqIEdldE5vZGVJdGVtKENGREVfWE1MTm9kZTo6Tm9kZUl0ZW0gZUl0ZW0pIGNvbnN0OwotICBib29sIEluc2VydE5vZGVJdGVtKENGREVfWE1MTm9kZTo6Tm9kZUl0ZW0gZUl0ZW0sIENGREVfWE1MTm9kZSogcE5vZGUpOwotICBDRkRFX1hNTE5vZGUqIFJlbW92ZU5vZGVJdGVtKENGREVfWE1MTm9kZTo6Tm9kZUl0ZW0gZUl0ZW0pOwotCi0gIHZvaWQgU2F2ZVhNTE5vZGUoY29uc3QgQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+JiBwWE1MU3RyZWFtKTsKLQotICBDRkRFX1hNTE5vZGUqIG1fcFBhcmVudDsKLSAgQ0ZERV9YTUxOb2RlKiBtX3BDaGlsZDsKLSAgQ0ZERV9YTUxOb2RlKiBtX3BQcmlvcjsKLSAgQ0ZERV9YTUxOb2RlKiBtX3BOZXh0OwotfTsKLQotY2xhc3MgQ0ZERV9YTUxJbnN0cnVjdGlvbiA6IHB1YmxpYyBDRkRFX1hNTE5vZGUgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0ZERV9YTUxJbnN0cnVjdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUYXJnZXQpOwotICB+Q0ZERV9YTUxJbnN0cnVjdGlvbigpIG92ZXJyaWRlOwotCi0gIC8vIENGREVfWE1MTm9kZQotICBGREVfWE1MTk9ERVRZUEUgR2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotICBDRkRFX1hNTE5vZGUqIENsb25lKGJvb2wgYlJlY3Vyc2l2ZSkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBHZXRUYXJnZXROYW1lKENGWF9XaWRlU3RyaW5nJiB3c1RhcmdldCkgY29uc3QgeyB3c1RhcmdldCA9IG1fd3NUYXJnZXQ7IH0KLSAgaW50MzJfdCBDb3VudEF0dHJpYnV0ZXMoKSBjb25zdDsKLSAgYm9vbCBHZXRBdHRyaWJ1dGUoaW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlOYW1lLAotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaVZhbHVlKSBjb25zdDsKLSAgYm9vbCBIYXNBdHRyaWJ1dGUoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSkgY29uc3Q7Ci0gIHZvaWQgR2V0U3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsCi0gICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpVmFsdWUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwd3NEZWZWYWx1ZSA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFNldFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaU5hbWUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpVmFsdWUpOwotICBpbnQzMl90IEdldEludGVnZXIoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwgaW50MzJfdCBpRGVmVmFsdWUgPSAwKSBjb25zdDsKLSAgdm9pZCBTZXRJbnRlZ2VyKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsIGludDMyX3QgaUF0dHJpVmFsdWUpOwotICBGWF9GTE9BVCBHZXRGbG9hdChjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLCBGWF9GTE9BVCBmRGVmVmFsdWUgPSAwKSBjb25zdDsKLSAgdm9pZCBTZXRGbG9hdChjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLCBGWF9GTE9BVCBmQXR0cmlWYWx1ZSk7Ci0gIHZvaWQgUmVtb3ZlQXR0cmlidXRlKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUpOwotICBpbnQzMl90IENvdW50RGF0YSgpIGNvbnN0OwotICBib29sIEdldERhdGEoaW50MzJfdCBpbmRleCwgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0YSkgY29uc3Q7Ci0gIHZvaWQgQXBwZW5kRGF0YShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRhKTsKLSAgdm9pZCBSZW1vdmVEYXRhKGludDMyX3QgaW5kZXgpOwotCi0gIENGWF9XaWRlU3RyaW5nIG1fd3NUYXJnZXQ7Ci0gIHN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nPiBtX0F0dHJpYnV0ZXM7Ci0gIHN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nPiBtX1RhcmdldERhdGE7Ci19OwotCi1jbGFzcyBDRkRFX1hNTEVsZW1lbnQgOiBwdWJsaWMgQ0ZERV9YTUxOb2RlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENGREVfWE1MRWxlbWVudChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUYWcpOwotICB+Q0ZERV9YTUxFbGVtZW50KCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ0ZERV9YTUxOb2RlCi0gIEZERV9YTUxOT0RFVFlQRSBHZXRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIENGREVfWE1MTm9kZSogQ2xvbmUoYm9vbCBiUmVjdXJzaXZlKSBvdmVycmlkZTsKLQotICB2b2lkIEdldFRhZ05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzVGFnKSBjb25zdDsKLSAgdm9pZCBHZXRMb2NhbFRhZ05hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzVGFnKSBjb25zdDsKLQotICB2b2lkIEdldE5hbWVzcGFjZVByZWZpeChDRlhfV2lkZVN0cmluZyYgd3NQcmVmaXgpIGNvbnN0OwotICB2b2lkIEdldE5hbWVzcGFjZVVSSShDRlhfV2lkZVN0cmluZyYgd3NOYW1lc3BhY2UpIGNvbnN0OwotCi0gIGludDMyX3QgQ291bnRBdHRyaWJ1dGVzKCkgY29uc3Q7Ci0gIGJvb2wgR2V0QXR0cmlidXRlKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0F0dHJpTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlWYWx1ZSkgY29uc3Q7Ci0gIGJvb2wgSGFzQXR0cmlidXRlKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUpIGNvbnN0OwotICB2b2lkIFJlbW92ZUF0dHJpYnV0ZShjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lKTsKLQotICB2b2lkIEdldFN0cmluZyhjb25zdCBGWF9XQ0hBUiogcHdzQXR0cmlOYW1lLAotICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaVZhbHVlLAotICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHdzRGVmVmFsdWUgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBTZXRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlOYW1lLAotICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NBdHRyaVZhbHVlKTsKLQotICBpbnQzMl90IEdldEludGVnZXIoY29uc3QgRlhfV0NIQVIqIHB3c0F0dHJpTmFtZSwgaW50MzJfdCBpRGVmVmFsdWUgPSAwKSBjb25zdDsKLSAgdm9pZCBTZXRJbnRlZ2VyKGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsIGludDMyX3QgaUF0dHJpVmFsdWUpOwotCi0gIEZYX0ZMT0FUIEdldEZsb2F0KGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsIEZYX0ZMT0FUIGZEZWZWYWx1ZSA9IDApIGNvbnN0OwotICB2b2lkIFNldEZsb2F0KGNvbnN0IEZYX1dDSEFSKiBwd3NBdHRyaU5hbWUsIEZYX0ZMT0FUIGZBdHRyaVZhbHVlKTsKLQotICB2b2lkIEdldFRleHREYXRhKENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIGNvbnN0OwotICB2b2lkIFNldFRleHREYXRhKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOwotCi0gIENGWF9XaWRlU3RyaW5nIG1fd3NUYWc7Ci0gIHN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nPiBtX0F0dHJpYnV0ZXM7Ci19OwotCi1jbGFzcyBDRkRFX1hNTFRleHQgOiBwdWJsaWMgQ0ZERV9YTUxOb2RlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENGREVfWE1MVGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsKLSAgfkNGREVfWE1MVGV4dCgpIG92ZXJyaWRlOwotCi0gIC8vIENGREVfWE1MTm9kZQotICBGREVfWE1MTk9ERVRZUEUgR2V0VHlwZSgpIGNvbnN0IG92ZXJyaWRlOwotICBDRkRFX1hNTE5vZGUqIENsb25lKGJvb2wgYlJlY3Vyc2l2ZSkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBHZXRUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIGNvbnN0IHsgd3NUZXh0ID0gbV93c1RleHQ7IH0KLSAgdm9pZCBTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsgbV93c1RleHQgPSB3c1RleHQ7IH0KLQotICBDRlhfV2lkZVN0cmluZyBtX3dzVGV4dDsKLX07Ci0KLWNsYXNzIENGREVfWE1MRGVjbGFyYXRpb24gOiBwdWJsaWMgQ0ZERV9YTUxOb2RlIHsKLSBwdWJsaWM6Ci0gIENGREVfWE1MRGVjbGFyYXRpb24oKSB7fQotICB+Q0ZERV9YTUxEZWNsYXJhdGlvbigpIG92ZXJyaWRlIHt9Ci19OwotCi1jbGFzcyBDRkRFX1hNTENoYXJEYXRhIDogcHVibGljIENGREVfWE1MRGVjbGFyYXRpb24gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0ZERV9YTUxDaGFyRGF0YShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDRGF0YSk7Ci0gIH5DRkRFX1hNTENoYXJEYXRhKCkgb3ZlcnJpZGU7Ci0KLSAgRkRFX1hNTE5PREVUWVBFIEdldFR5cGUoKSBjb25zdCBvdmVycmlkZTsKLSAgQ0ZERV9YTUxOb2RlKiBDbG9uZShib29sIGJSZWN1cnNpdmUpIG92ZXJyaWRlOwotCi0gIHZvaWQgR2V0Q2hhckRhdGEoQ0ZYX1dpZGVTdHJpbmcmIHdzQ2hhckRhdGEpIGNvbnN0IHsKLSAgICB3c0NoYXJEYXRhID0gbV93c0NoYXJEYXRhOwotICB9Ci0gIHZvaWQgU2V0Q2hhckRhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ0RhdGEpIHsgbV93c0NoYXJEYXRhID0gd3NDRGF0YTsgfQotCi0gIENGWF9XaWRlU3RyaW5nIG1fd3NDaGFyRGF0YTsKLX07Ci0KLWNsYXNzIENGREVfWE1MRG9jIHsKLSBwdWJsaWM6Ci0gIENGREVfWE1MRG9jKCk7Ci0gIH5DRkRFX1hNTERvYygpOwotCi0gIGJvb2wgTG9hZFhNTChzdGQ6OnVuaXF1ZV9wdHI8SUZERV9YTUxQYXJzZXI+IHBYTUxQYXJzZXIpOwotICBpbnQzMl90IERvTG9hZChJRlhfUGF1c2UqIHBQYXVzZSA9IG51bGxwdHIpOwotICB2b2lkIENsb3NlWE1MKCk7Ci0gIENGREVfWE1MTm9kZSogR2V0Um9vdCgpIGNvbnN0IHsgcmV0dXJuIG1fcFJvb3Q7IH0KLSAgdm9pZCBTYXZlWE1MKENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiYgcFhNTFN0cmVhbSwgYm9vbCBiU2F2ZUJPTSA9IHRydWUpOwotICB2b2lkIFNhdmVYTUxOb2RlKGNvbnN0IENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiYgcFhNTFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICBDRkRFX1hNTE5vZGUqIHBOb2RlKTsKLQotIHByb3RlY3RlZDoKLSAgdm9pZCBSZXNldChib29sIGJJbml0Um9vdCk7Ci0gIHZvaWQgUmVsZWFzZVBhcnNlcigpOwotCi0gIENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiBtX3BTdHJlYW07Ci0gIGludDMyX3QgbV9pU3RhdHVzOwotICBDRkRFX1hNTE5vZGUqIG1fcFJvb3Q7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxJRkRFX1hNTFBhcnNlcj4gbV9wWE1MUGFyc2VyOwotfTsKLQotY2xhc3MgSUZERV9YTUxQYXJzZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCB+SUZERV9YTUxQYXJzZXIoKSB7fQotICB2aXJ0dWFsIGludDMyX3QgRG9QYXJzZXIoSUZYX1BhdXNlKiBwUGF1c2UpID0gMDsKLX07Ci0KLWNsYXNzIENGREVfQmxvY2tCdWZmZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0ZERV9CbG9ja0J1ZmZlcihpbnQzMl90IGlBbGxvY1N0ZXAgPSAxMDI0ICogMTAyNCk7Ci0gIH5DRkRFX0Jsb2NrQnVmZmVyKCk7Ci0KLSAgYm9vbCBJbml0QnVmZmVyKGludDMyX3QgaUJ1ZmZlclNpemUgPSAxMDI0ICogMTAyNCk7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIHsgcmV0dXJuIG1faUJ1ZmZlclNpemUgLyBtX2lBbGxvY1N0ZXAgPj0gMTsgfQotICBGWF9XQ0hBUiogR2V0QXZhaWxhYmxlQmxvY2soaW50MzJfdCYgaUluZGV4SW5CbG9jayk7Ci0gIGlubGluZSBpbnQzMl90IEdldEFsbG9jU3RlcCgpIGNvbnN0IHsgcmV0dXJuIG1faUFsbG9jU3RlcDsgfQotICBpbmxpbmUgaW50MzJfdCYgR2V0RGF0YUxlbmd0aFJlZigpIHsgcmV0dXJuIG1faURhdGFMZW5ndGg7IH0KLSAgaW5saW5lIHZvaWQgUmVzZXQoYm9vbCBiUmVzZXJ2ZURhdGEgPSB0cnVlKSB7Ci0gICAgaWYgKCFiUmVzZXJ2ZURhdGEpIHsKLSAgICAgIG1faVN0YXJ0UG9zaXRpb24gPSAwOwotICAgIH0KLSAgICBtX2lEYXRhTGVuZ3RoID0gMDsKLSAgfQotICB2b2lkIFNldFRleHRDaGFyKGludDMyX3QgaUluZGV4LCBGWF9XQ0hBUiBjaCk7Ci0gIGludDMyX3QgRGVsZXRlVGV4dENoYXJzKGludDMyX3QgaUNvdW50LCBib29sIGJEaXJlY3Rpb24gPSB0cnVlKTsKLSAgdm9pZCBHZXRUZXh0RGF0YShDRlhfV2lkZVN0cmluZyYgd3NUZXh0RGF0YSwKLSAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCA9IDAsCi0gICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoID0gLTEpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgotICBpbmxpbmUgdm9pZCBUZXh0RGF0YUluZGV4MkJ1ZkluZGV4KGNvbnN0IGludDMyX3QgaUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlCbG9ja0luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlJbm5lckluZGV4KSBjb25zdDsKLSAgdm9pZCBDbGVhckJ1ZmZlcigpOwotCi0gIENGWF9BcnJheVRlbXBsYXRlPEZYX1dDSEFSKj4gbV9CbG9ja0FycmF5OwotICBpbnQzMl90IG1faURhdGFMZW5ndGg7Ci0gIGludDMyX3QgbV9pQnVmZmVyU2l6ZTsKLSAgaW50MzJfdCBtX2lBbGxvY1N0ZXA7Ci0gIGludDMyX3QgbV9pU3RhcnRQb3NpdGlvbjsKLX07Ci0KLWNsYXNzIENGREVfWE1MU3ludGF4UGFyc2VyIHsKLSBwdWJsaWM6Ci0gIENGREVfWE1MU3ludGF4UGFyc2VyKCk7Ci0gIH5DRkRFX1hNTFN5bnRheFBhcnNlcigpOwotCi0gIHZvaWQgSW5pdChjb25zdCBDRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4mIHBTdHJlYW0sCi0gICAgICAgICAgICBpbnQzMl90IGlYTUxQbGFuZVNpemUsCi0gICAgICAgICAgICBpbnQzMl90IGlUZXh0RGF0YVNpemUgPSAyNTYpOwotCi0gIEZERV9YbWxTeW50YXhSZXN1bHQgRG9TeW50YXhQYXJzZSgpOwotCi0gIGludDMyX3QgR2V0U3RhdHVzKCkgY29uc3Q7Ci0gIGludDMyX3QgR2V0Q3VycmVudFBvcygpIGNvbnN0IHsKLSAgICByZXR1cm4gbV9pUGFyc2VkQ2hhcnMgKyAobV9wU3RhcnQgLSBtX3BCdWZmZXIpOwotICB9Ci0gIEZYX0ZJTEVTSVpFIEdldEN1cnJlbnRCaW5hcnlQb3MoKSBjb25zdDsKLSAgaW50MzJfdCBHZXRDdXJyZW50Tm9kZU51bWJlcigpIGNvbnN0IHsgcmV0dXJuIG1faUN1cnJlbnROb2RlTnVtOyB9Ci0gIGludDMyX3QgR2V0TGFzdE5vZGVOdW1iZXIoKSBjb25zdCB7IHJldHVybiBtX2lMYXN0Tm9kZU51bTsgfQotCi0gIHZvaWQgR2V0VGFyZ2V0TmFtZShDRlhfV2lkZVN0cmluZyYgd3NUYXJnZXQpIGNvbnN0IHsKLSAgICBtX0Jsb2NrQnVmZmVyLkdldFRleHREYXRhKHdzVGFyZ2V0LCAwLCBtX2lUZXh0RGF0YUxlbmd0aCk7Ci0gIH0KLSAgdm9pZCBHZXRUYWdOYW1lKENGWF9XaWRlU3RyaW5nJiB3c1RhZykgY29uc3QgewotICAgIG1fQmxvY2tCdWZmZXIuR2V0VGV4dERhdGEod3NUYWcsIDAsIG1faVRleHREYXRhTGVuZ3RoKTsKLSAgfQotICB2b2lkIEdldEF0dHJpYnV0ZU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlOYW1lKSBjb25zdCB7Ci0gICAgbV9CbG9ja0J1ZmZlci5HZXRUZXh0RGF0YSh3c0F0dHJpTmFtZSwgMCwgbV9pVGV4dERhdGFMZW5ndGgpOwotICB9Ci0gIHZvaWQgR2V0QXR0cmlidXRlVmFsdWUoQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cmlWYWx1ZSkgY29uc3QgewotICAgIG1fQmxvY2tCdWZmZXIuR2V0VGV4dERhdGEod3NBdHRyaVZhbHVlLCAwLCBtX2lUZXh0RGF0YUxlbmd0aCk7Ci0gIH0KLSAgdm9pZCBHZXRUZXh0RGF0YShDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSBjb25zdCB7Ci0gICAgbV9CbG9ja0J1ZmZlci5HZXRUZXh0RGF0YSh3c1RleHQsIDAsIG1faVRleHREYXRhTGVuZ3RoKTsKLSAgfQotICB2b2lkIEdldFRhcmdldERhdGEoQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0YSkgY29uc3QgewotICAgIG1fQmxvY2tCdWZmZXIuR2V0VGV4dERhdGEod3NEYXRhLCAwLCBtX2lUZXh0RGF0YUxlbmd0aCk7Ci0gIH0KLQotIHByb3RlY3RlZDoKLSAgZW51bSBjbGFzcyBGREVfWG1sU3ludGF4U3RhdGUgewotICAgIFRleHQsCi0gICAgTm9kZSwKLSAgICBUYXJnZXQsCi0gICAgVGFnLAotICAgIEF0dHJpTmFtZSwKLSAgICBBdHRyaUVxdWFsU2lnbiwKLSAgICBBdHRyaVF1b3RhdGlvbiwKLSAgICBBdHRyaVZhbHVlLAotICAgIEVudGl0eSwKLSAgICBFbnRpdHlEZWNpbWFsLAotICAgIEVudGl0eUhleCwKLSAgICBDbG9zZUluc3RydWN0aW9uLAotICAgIEJyZWFrRWxlbWVudCwKLSAgICBDbG9zZUVsZW1lbnQsCi0gICAgU2tpcERlY2xOb2RlLAotICAgIERlY2xDaGFyRGF0YSwKLSAgICBTa2lwQ29tbWVudCwKLSAgICBTa2lwQ29tbWVudE9yRGVjbCwKLSAgICBTa2lwQ0RhdGEsCi0gICAgVGFyZ2V0RGF0YQotICB9OwotCi0gIHZvaWQgUGFyc2VUZXh0Q2hhcihGWF9XQ0hBUiBjaCk7Ci0KLSAgQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+IG1fcFN0cmVhbTsKLSAgaW50MzJfdCBtX2lYTUxQbGFuZVNpemU7Ci0gIGludDMyX3QgbV9pQ3VycmVudFBvczsKLSAgaW50MzJfdCBtX2lDdXJyZW50Tm9kZU51bTsKLSAgaW50MzJfdCBtX2lMYXN0Tm9kZU51bTsKLSAgaW50MzJfdCBtX2lQYXJzZWRDaGFyczsKLSAgaW50MzJfdCBtX2lQYXJzZWRCeXRlczsKLSAgRlhfV0NIQVIqIG1fcEJ1ZmZlcjsKLSAgaW50MzJfdCBtX2lCdWZmZXJDaGFyczsKLSAgYm9vbCBtX2JFT1M7Ci0gIEZYX1dDSEFSKiBtX3BTdGFydDsKLSAgRlhfV0NIQVIqIG1fcEVuZDsKLSAgRkRFX1hNTE5PREUgbV9DdXJOb2RlOwotICBDRlhfU3RhY2tUZW1wbGF0ZTxGREVfWE1MTk9ERT4gbV9YTUxOb2RlU3RhY2s7Ci0gIENGREVfQmxvY2tCdWZmZXIgbV9CbG9ja0J1ZmZlcjsKLSAgaW50MzJfdCBtX2lBbGxvY1N0ZXA7Ci0gIGludDMyX3QmIG1faURhdGFMZW5ndGg7Ci0gIEZYX1dDSEFSKiBtX3BDdXJyZW50QmxvY2s7Ci0gIGludDMyX3QgbV9pSW5kZXhJbkJsb2NrOwotICBpbnQzMl90IG1faVRleHREYXRhTGVuZ3RoOwotICBGREVfWG1sU3ludGF4UmVzdWx0IG1fc3ludGF4UGFyc2VyUmVzdWx0OwotICBGREVfWG1sU3ludGF4U3RhdGUgbV9zeW50YXhQYXJzZXJTdGF0ZTsKLSAgRlhfV0NIQVIgbV93UXVvdGF0aW9uTWFyazsKLSAgaW50MzJfdCBtX2lFbnRpdHlTdGFydDsKLSAgQ0ZYX1N0YWNrVGVtcGxhdGU8dWludDMyX3Q+IG1fU2tpcFN0YWNrOwotICBGWF9XQ0hBUiBtX1NraXBDaGFyOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRkRFX1hNTF9GREVfWE1MX0lNUF9IXwpkaWZmIC0tZ2l0IGEveGZhL2ZkZS94bWwvZmRlX3htbF9pbXBfdW5pdHRlc3QuY3BwIGIveGZhL2ZkZS94bWwvZmRlX3htbF9pbXBfdW5pdHRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGIxYjE5Li4wMDAwMDAwCi0tLSBhL3hmYS9mZGUveG1sL2ZkZV94bWxfaW1wX3VuaXR0ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYzMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJ4ZmEvZmRlL3htbC9mZGVfeG1sX2ltcC5oIgotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvY3J0L2ZnYXNfc3RyZWFtLmgiCi0KLVRFU1QoQ0ZERV9YTUxTeW50YXhQYXJzZXIsIENEYXRhKSB7Ci0gIGNvbnN0IEZYX1dDSEFSKiBpbnB1dCA9Ci0gICAgICBMIjxzY3JpcHQgY29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHRcIj5cbiIKLSAgICAgIEwiICA8IVtDREFUQVtcbiIKLSAgICAgIEwiICAgIGlmIChhWzFdIDwgMylcbiIKLSAgICAgIEwiICAgICAgYXBwLmFsZXJ0KFwiVGNsYW1zXCIpO1xuIgotICAgICAgTCIgIF1dPlxuIgotICAgICAgTCI8L3NjcmlwdD4iOwotCi0gIGNvbnN0IEZYX1dDSEFSKiBjZGF0YSA9Ci0gICAgICBMIlxuIgotICAgICAgTCIgICAgaWYgKGFbMV0gPCAzKVxuIgotICAgICAgTCIgICAgICBhcHAuYWxlcnQoXCJUY2xhbXNcIik7XG4iCi0gICAgICBMIiAgIjsKLQotICAvLyBXZSAqIHNpemVvZihGWF9XQ0hBUikgYmVjYXVzZSB3ZSBwYXNzIGluIHRoZSB1aW50OF90LCBub3QgdGhlIEZYX1dDSEFSLgotICBzaXplX3QgbGVuID0gRlhTWVNfd2NzbGVuKGlucHV0KSAqIHNpemVvZihGWF9XQ0hBUik7Ci0gIENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiBzdHJlYW0gPSBJRkdBU19TdHJlYW06OkNyZWF0ZVN0cmVhbSgKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8RlhfV0NIQVIqPihpbnB1dCkpLCBsZW4sIDApOwotICBDRkRFX1hNTFN5bnRheFBhcnNlciBwYXJzZXI7Ci0gIHBhcnNlci5Jbml0KHN0cmVhbSwgMjU2KTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRPcGVuLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OlRhZ05hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotCi0gIENGWF9XaWRlU3RyaW5nIGRhdGE7Ci0gIHBhcnNlci5HZXRUYWdOYW1lKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJzY3JpcHQiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6QXR0cmlOYW1lLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldEF0dHJpYnV0ZU5hbWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMImNvbnRlbnRUeXBlIiwgZGF0YSk7Ci0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpBdHRyaVZhbHVlLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldEF0dHJpYnV0ZVZhbHVlKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudEJyZWFrLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OlRleHQsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0VGV4dERhdGEoZGF0YSk7Ci0gIEVYUEVDVF9FUShMIlxuICAiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6Q0RhdGEsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0VGV4dERhdGEoZGF0YSk7Ci0gIEVYUEVDVF9FUShjZGF0YSwgZGF0YSk7Ci0KLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OlRleHQsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0VGV4dERhdGEoZGF0YSk7Ci0gIEVYUEVDVF9FUShMIlxuIiwgZGF0YSk7Ci0KLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRDbG9zZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIHBhcnNlci5HZXRUYWdOYW1lKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJzY3JpcHQiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RW5kT2ZTdHJpbmcsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotfQotCi1URVNUKENGREVfWE1MU3ludGF4UGFyc2VyLCBDRGF0YVdpdGhJbm5lclNjcmlwdCkgewotICBjb25zdCBGWF9XQ0hBUiogaW5wdXQgPQotICAgICAgTCI8c2NyaXB0IGNvbnRlbnRUeXBlPVwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0XCI+XG4iCi0gICAgICBMIiAgPCFbQ0RBVEFbXG4iCi0gICAgICBMIiAgICBpZiAoYVsxXSA8IDMpXG4iCi0gICAgICBMIiAgICAgIGFwcC5hbGVydChcIlRjbGFtc1wiKTtcbiIKLSAgICAgIEwiICAgIDwvc2NyaXB0PlxuIgotICAgICAgTCIgIF1dPlxuIgotICAgICAgTCI8L3NjcmlwdD4iOwotCi0gIGNvbnN0IEZYX1dDSEFSKiBjZGF0YSA9Ci0gICAgICBMIlxuIgotICAgICAgTCIgICAgaWYgKGFbMV0gPCAzKVxuIgotICAgICAgTCIgICAgICBhcHAuYWxlcnQoXCJUY2xhbXNcIik7XG4iCi0gICAgICBMIiAgICA8L3NjcmlwdD5cbiIKLSAgICAgIEwiICAiOwotCi0gIC8vIFdlICogc2l6ZW9mKEZYX1dDSEFSKSBiZWNhdXNlIHdlIHBhc3MgaW4gdGhlIHVpbnQ4X3QsIG5vdCB0aGUgRlhfV0NIQVIuCi0gIHNpemVfdCBsZW4gPSBGWFNZU193Y3NsZW4oaW5wdXQpICogc2l6ZW9mKEZYX1dDSEFSKTsKLSAgQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+IHN0cmVhbSA9IElGR0FTX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKAotICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxGWF9XQ0hBUio+KGlucHV0KSksIGxlbiwgMCk7Ci0gIENGREVfWE1MU3ludGF4UGFyc2VyIHBhcnNlcjsKLSAgcGFyc2VyLkluaXQoc3RyZWFtLCAyNTYpOwotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudE9wZW4sIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6VGFnTmFtZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgZGF0YTsKLSAgcGFyc2VyLkdldFRhZ05hbWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMInNjcmlwdCIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpBdHRyaU5hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0QXR0cmlidXRlTmFtZShkYXRhKTsKLSAgRVhQRUNUX0VRKEwiY29udGVudFR5cGUiLCBkYXRhKTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpVmFsdWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0QXR0cmlidXRlVmFsdWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50QnJlYWssIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6VGV4dCwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIHBhcnNlci5HZXRUZXh0RGF0YShkYXRhKTsKLSAgRVhQRUNUX0VRKEwiXG4gICIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpDRGF0YSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIHBhcnNlci5HZXRUZXh0RGF0YShkYXRhKTsKLSAgRVhQRUNUX0VRKGNkYXRhLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6VGV4dCwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIHBhcnNlci5HZXRUZXh0RGF0YShkYXRhKTsKLSAgRVhQRUNUX0VRKEwiXG4iLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudENsb3NlLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldFRhZ05hbWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMInNjcmlwdCIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpFbmRPZlN0cmluZywgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci19Ci0KLVRFU1QoQ0ZERV9YTUxTeW50YXhQYXJzZXIsIEFycm93QmFuZ0Fycm93KSB7Ci0gIGNvbnN0IEZYX1dDSEFSKiBpbnB1dCA9Ci0gICAgICBMIjxzY3JpcHQgY29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHRcIj5cbiIKLSAgICAgIEwiICA8IT5cbiIKLSAgICAgIEwiPC9zY3JpcHQ+IjsKLQotICAvLyBXZSAqIHNpemVvZihGWF9XQ0hBUikgYmVjYXVzZSB3ZSBwYXNzIGluIHRoZSB1aW50OF90LCBub3QgdGhlIEZYX1dDSEFSLgotICBzaXplX3QgbGVuID0gRlhTWVNfd2NzbGVuKGlucHV0KSAqIHNpemVvZihGWF9XQ0hBUik7Ci0gIENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiBzdHJlYW0gPSBJRkdBU19TdHJlYW06OkNyZWF0ZVN0cmVhbSgKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8RlhfV0NIQVIqPihpbnB1dCkpLCBsZW4sIDApOwotICBDRkRFX1hNTFN5bnRheFBhcnNlciBwYXJzZXI7Ci0gIHBhcnNlci5Jbml0KHN0cmVhbSwgMjU2KTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRPcGVuLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OlRhZ05hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotCi0gIENGWF9XaWRlU3RyaW5nIGRhdGE7Ci0gIHBhcnNlci5HZXRUYWdOYW1lKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJzY3JpcHQiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6QXR0cmlOYW1lLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldEF0dHJpYnV0ZU5hbWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMImNvbnRlbnRUeXBlIiwgZGF0YSk7Ci0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpBdHRyaVZhbHVlLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldEF0dHJpYnV0ZVZhbHVlKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudEJyZWFrLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OlRleHQsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0VGV4dERhdGEoZGF0YSk7Ci0gIEVYUEVDVF9FUShMIlxuICAiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6VGV4dCwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIHBhcnNlci5HZXRUZXh0RGF0YShkYXRhKTsKLSAgRVhQRUNUX0VRKEwiXG4iLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudENsb3NlLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldFRhZ05hbWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMInNjcmlwdCIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpFbmRPZlN0cmluZywgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci19Ci0KLVRFU1QoQ0ZERV9YTUxTeW50YXhQYXJzZXIsIEFycm93QmFuZ0JyYWNrZXRBcnJvdykgewotICBjb25zdCBGWF9XQ0hBUiogaW5wdXQgPQotICAgICAgTCI8c2NyaXB0IGNvbnRlbnRUeXBlPVwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0XCI+XG4iCi0gICAgICBMIiAgPCFbPlxuIgotICAgICAgTCI8L3NjcmlwdD4iOwotCi0gIC8vIFdlICogc2l6ZW9mKEZYX1dDSEFSKSBiZWNhdXNlIHdlIHBhc3MgaW4gdGhlIHVpbnQ4X3QsIG5vdCB0aGUgRlhfV0NIQVIuCi0gIHNpemVfdCBsZW4gPSBGWFNZU193Y3NsZW4oaW5wdXQpICogc2l6ZW9mKEZYX1dDSEFSKTsKLSAgQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+IHN0cmVhbSA9IElGR0FTX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKAotICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxGWF9XQ0hBUio+KGlucHV0KSksIGxlbiwgMCk7Ci0gIENGREVfWE1MU3ludGF4UGFyc2VyIHBhcnNlcjsKLSAgcGFyc2VyLkluaXQoc3RyZWFtLCAyNTYpOwotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudE9wZW4sIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6VGFnTmFtZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgZGF0YTsKLSAgcGFyc2VyLkdldFRhZ05hbWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMInNjcmlwdCIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpBdHRyaU5hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0QXR0cmlidXRlTmFtZShkYXRhKTsKLSAgRVhQRUNUX0VRKEwiY29udGVudFR5cGUiLCBkYXRhKTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpVmFsdWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0QXR0cmlidXRlVmFsdWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50QnJlYWssIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6VGV4dCwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIHBhcnNlci5HZXRUZXh0RGF0YShkYXRhKTsKLSAgRVhQRUNUX0VRKEwiXG4gICIsIGRhdGEpOwotCi0gIC8vIFBhcnNlciB3YWxrcyB0byBlbmQgb2YgaW5wdXQuCi0KLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkVuZE9mU3RyaW5nLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLX0KLQotVEVTVChDRkRFX1hNTFN5bnRheFBhcnNlciwgSW5jb21wbGV0ZUNEYXRhKSB7Ci0gIGNvbnN0IEZYX1dDSEFSKiBpbnB1dCA9Ci0gICAgICBMIjxzY3JpcHQgY29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHRcIj5cbiIKLSAgICAgIEwiICA8IVtDREFUQT5cbiIKLSAgICAgIEwiPC9zY3JpcHQ+IjsKLQotICAvLyBXZSAqIHNpemVvZihGWF9XQ0hBUikgYmVjYXVzZSB3ZSBwYXNzIGluIHRoZSB1aW50OF90LCBub3QgdGhlIEZYX1dDSEFSLgotICBzaXplX3QgbGVuID0gRlhTWVNfd2NzbGVuKGlucHV0KSAqIHNpemVvZihGWF9XQ0hBUik7Ci0gIENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiBzdHJlYW0gPSBJRkdBU19TdHJlYW06OkNyZWF0ZVN0cmVhbSgKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8RlhfV0NIQVIqPihpbnB1dCkpLCBsZW4sIDApOwotICBDRkRFX1hNTFN5bnRheFBhcnNlciBwYXJzZXI7Ci0gIHBhcnNlci5Jbml0KHN0cmVhbSwgMjU2KTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRPcGVuLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OlRhZ05hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotCi0gIENGWF9XaWRlU3RyaW5nIGRhdGE7Ci0gIHBhcnNlci5HZXRUYWdOYW1lKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJzY3JpcHQiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6QXR0cmlOYW1lLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldEF0dHJpYnV0ZU5hbWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMImNvbnRlbnRUeXBlIiwgZGF0YSk7Ci0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpBdHRyaVZhbHVlLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldEF0dHJpYnV0ZVZhbHVlKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudEJyZWFrLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OlRleHQsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0VGV4dERhdGEoZGF0YSk7Ci0gIEVYUEVDVF9FUShMIlxuICAiLCBkYXRhKTsKLQotICAvLyBQYXJzZXIgd2Fsa3MgdG8gZW5kIG9mIGlucHV0LgotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpFbmRPZlN0cmluZywgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci19Ci0KLVRFU1QoQ0ZERV9YTUxTeW50YXhQYXJzZXIsIFVuQ2xvc2VkQ0RhdGEpIHsKLSAgY29uc3QgRlhfV0NIQVIqIGlucHV0ID0KLSAgICAgIEwiPHNjcmlwdCBjb250ZW50VHlwZT1cImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdFwiPlxuIgotICAgICAgTCIgIDwhW0NEQVRBW1xuIgotICAgICAgTCI8L3NjcmlwdD4iOwotCi0gIC8vIFdlICogc2l6ZW9mKEZYX1dDSEFSKSBiZWNhdXNlIHdlIHBhc3MgaW4gdGhlIHVpbnQ4X3QsIG5vdCB0aGUgRlhfV0NIQVIuCi0gIHNpemVfdCBsZW4gPSBGWFNZU193Y3NsZW4oaW5wdXQpICogc2l6ZW9mKEZYX1dDSEFSKTsKLSAgQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+IHN0cmVhbSA9IElGR0FTX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKAotICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxGWF9XQ0hBUio+KGlucHV0KSksIGxlbiwgMCk7Ci0gIENGREVfWE1MU3ludGF4UGFyc2VyIHBhcnNlcjsKLSAgcGFyc2VyLkluaXQoc3RyZWFtLCAyNTYpOwotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudE9wZW4sIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6VGFnTmFtZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgZGF0YTsKLSAgcGFyc2VyLkdldFRhZ05hbWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMInNjcmlwdCIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpBdHRyaU5hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0QXR0cmlidXRlTmFtZShkYXRhKTsKLSAgRVhQRUNUX0VRKEwiY29udGVudFR5cGUiLCBkYXRhKTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpVmFsdWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0QXR0cmlidXRlVmFsdWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50QnJlYWssIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6VGV4dCwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIHBhcnNlci5HZXRUZXh0RGF0YShkYXRhKTsKLSAgRVhQRUNUX0VRKEwiXG4gICIsIGRhdGEpOwotCi0gIC8vIFBhcnNlciB3YWxrcyB0byBlbmQgb2YgaW5wdXQuCi0KLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkVuZE9mU3RyaW5nLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLX0KLQotVEVTVChDRkRFX1hNTFN5bnRheFBhcnNlciwgRW1wdHlDRGF0YSkgewotICBjb25zdCBGWF9XQ0hBUiogaW5wdXQgPQotICAgICAgTCI8c2NyaXB0IGNvbnRlbnRUeXBlPVwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0XCI+XG4iCi0gICAgICBMIiAgPCFbQ0RBVEFbXV0+XG4iCi0gICAgICBMIjwvc2NyaXB0PiI7Ci0KLSAgLy8gV2UgKiBzaXplb2YoRlhfV0NIQVIpIGJlY2F1c2Ugd2UgcGFzcyBpbiB0aGUgdWludDhfdCwgbm90IHRoZSBGWF9XQ0hBUi4KLSAgc2l6ZV90IGxlbiA9IEZYU1lTX3djc2xlbihpbnB1dCkgKiBzaXplb2YoRlhfV0NIQVIpOwotICBDRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4gc3RyZWFtID0gSUZHQVNfU3RyZWFtOjpDcmVhdGVTdHJlYW0oCi0gICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PEZYX1dDSEFSKj4oaW5wdXQpKSwgbGVuLCAwKTsKLSAgQ0ZERV9YTUxTeW50YXhQYXJzZXIgcGFyc2VyOwotICBwYXJzZXIuSW5pdChzdHJlYW0sIDI1Nik7Ci0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50T3BlbiwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpUYWdOYW1lLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLQotICBDRlhfV2lkZVN0cmluZyBkYXRhOwotICBwYXJzZXIuR2V0VGFnTmFtZShkYXRhKTsKLSAgRVhQRUNUX0VRKEwic2NyaXB0IiwgZGF0YSk7Ci0KLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpTmFtZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIHBhcnNlci5HZXRBdHRyaWJ1dGVOYW1lKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJjb250ZW50VHlwZSIsIGRhdGEpOwotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6QXR0cmlWYWx1ZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIHBhcnNlci5HZXRBdHRyaWJ1dGVWYWx1ZShkYXRhKTsKLSAgRVhQRUNUX0VRKEwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IiwgZGF0YSk7Ci0KLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRCcmVhaywgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpUZXh0LCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldFRleHREYXRhKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJcbiAgIiwgZGF0YSk7Ci0KLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkNEYXRhLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldFRleHREYXRhKGRhdGEpOwotICBFWFBFQ1RfRVEoTCIiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6VGV4dCwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIHBhcnNlci5HZXRUZXh0RGF0YShkYXRhKTsKLSAgRVhQRUNUX0VRKEwiXG4iLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudENsb3NlLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldFRhZ05hbWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMInNjcmlwdCIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpFbmRPZlN0cmluZywgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci19Ci0KLVRFU1QoQ0ZERV9YTUxTeW50YXhQYXJzZXIsIENvbW1lbnQpIHsKLSAgY29uc3QgRlhfV0NIQVIqIGlucHV0ID0KLSAgICAgIEwiPHNjcmlwdCBjb250ZW50VHlwZT1cImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdFwiPlxuIgotICAgICAgTCIgIDwhLS0gQSBDb21tZW50IC0tPlxuIgotICAgICAgTCI8L3NjcmlwdD4iOwotCi0gIC8vIFdlICogc2l6ZW9mKEZYX1dDSEFSKSBiZWNhdXNlIHdlIHBhc3MgaW4gdGhlIHVpbnQ4X3QsIG5vdCB0aGUgRlhfV0NIQVIuCi0gIHNpemVfdCBsZW4gPSBGWFNZU193Y3NsZW4oaW5wdXQpICogc2l6ZW9mKEZYX1dDSEFSKTsKLSAgQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+IHN0cmVhbSA9IElGR0FTX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKAotICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxGWF9XQ0hBUio+KGlucHV0KSksIGxlbiwgMCk7Ci0gIENGREVfWE1MU3ludGF4UGFyc2VyIHBhcnNlcjsKLSAgcGFyc2VyLkluaXQoc3RyZWFtLCAyNTYpOwotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudE9wZW4sIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6VGFnTmFtZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgZGF0YTsKLSAgcGFyc2VyLkdldFRhZ05hbWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMInNjcmlwdCIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpBdHRyaU5hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0QXR0cmlidXRlTmFtZShkYXRhKTsKLSAgRVhQRUNUX0VRKEwiY29udGVudFR5cGUiLCBkYXRhKTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpVmFsdWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0QXR0cmlidXRlVmFsdWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50QnJlYWssIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6VGV4dCwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIHBhcnNlci5HZXRUZXh0RGF0YShkYXRhKTsKLSAgRVhQRUNUX0VRKEwiXG4gICIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpUZXh0LCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldFRleHREYXRhKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJcbiIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50Q2xvc2UsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0VGFnTmFtZShkYXRhKTsKLSAgRVhQRUNUX0VRKEwic2NyaXB0IiwgZGF0YSk7Ci0KLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkVuZE9mU3RyaW5nLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLX0KLQotVEVTVChDRkRFX1hNTFN5bnRheFBhcnNlciwgSW5jb3JyZWN0Q29tbWVudFN0YXJ0KSB7Ci0gIGNvbnN0IEZYX1dDSEFSKiBpbnB1dCA9Ci0gICAgICBMIjxzY3JpcHQgY29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHRcIj5cbiIKLSAgICAgIEwiICA8IS0gQSBDb21tZW50IC0tPlxuIgotICAgICAgTCI8L3NjcmlwdD4iOwotCi0gIC8vIFdlICogc2l6ZW9mKEZYX1dDSEFSKSBiZWNhdXNlIHdlIHBhc3MgaW4gdGhlIHVpbnQ4X3QsIG5vdCB0aGUgRlhfV0NIQVIuCi0gIHNpemVfdCBsZW4gPSBGWFNZU193Y3NsZW4oaW5wdXQpICogc2l6ZW9mKEZYX1dDSEFSKTsKLSAgQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+IHN0cmVhbSA9IElGR0FTX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKAotICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxGWF9XQ0hBUio+KGlucHV0KSksIGxlbiwgMCk7Ci0gIENGREVfWE1MU3ludGF4UGFyc2VyIHBhcnNlcjsKLSAgcGFyc2VyLkluaXQoc3RyZWFtLCAyNTYpOwotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudE9wZW4sIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6VGFnTmFtZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgZGF0YTsKLSAgcGFyc2VyLkdldFRhZ05hbWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMInNjcmlwdCIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpBdHRyaU5hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0QXR0cmlidXRlTmFtZShkYXRhKTsKLSAgRVhQRUNUX0VRKEwiY29udGVudFR5cGUiLCBkYXRhKTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpVmFsdWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0QXR0cmlidXRlVmFsdWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50QnJlYWssIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6VGV4dCwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIHBhcnNlci5HZXRUZXh0RGF0YShkYXRhKTsKLSAgRVhQRUNUX0VRKEwiXG4gICIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpUZXh0LCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldFRleHREYXRhKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJcbiIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50Q2xvc2UsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0VGFnTmFtZShkYXRhKTsKLSAgRVhQRUNUX0VRKEwic2NyaXB0IiwgZGF0YSk7Ci0KLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkVuZE9mU3RyaW5nLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLX0KLQotVEVTVChDRkRFX1hNTFN5bnRheFBhcnNlciwgQ29tbWVudEVtcHR5KSB7Ci0gIGNvbnN0IEZYX1dDSEFSKiBpbnB1dCA9Ci0gICAgICBMIjxzY3JpcHQgY29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHRcIj5cbiIKLSAgICAgIEwiICA8IS0tLS0+XG4iCi0gICAgICBMIjwvc2NyaXB0PiI7Ci0KLSAgLy8gV2UgKiBzaXplb2YoRlhfV0NIQVIpIGJlY2F1c2Ugd2UgcGFzcyBpbiB0aGUgdWludDhfdCwgbm90IHRoZSBGWF9XQ0hBUi4KLSAgc2l6ZV90IGxlbiA9IEZYU1lTX3djc2xlbihpbnB1dCkgKiBzaXplb2YoRlhfV0NIQVIpOwotICBDRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4gc3RyZWFtID0gSUZHQVNfU3RyZWFtOjpDcmVhdGVTdHJlYW0oCi0gICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PEZYX1dDSEFSKj4oaW5wdXQpKSwgbGVuLCAwKTsKLSAgQ0ZERV9YTUxTeW50YXhQYXJzZXIgcGFyc2VyOwotICBwYXJzZXIuSW5pdChzdHJlYW0sIDI1Nik7Ci0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50T3BlbiwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpUYWdOYW1lLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLQotICBDRlhfV2lkZVN0cmluZyBkYXRhOwotICBwYXJzZXIuR2V0VGFnTmFtZShkYXRhKTsKLSAgRVhQRUNUX0VRKEwic2NyaXB0IiwgZGF0YSk7Ci0KLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpTmFtZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIHBhcnNlci5HZXRBdHRyaWJ1dGVOYW1lKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJjb250ZW50VHlwZSIsIGRhdGEpOwotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6QXR0cmlWYWx1ZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIHBhcnNlci5HZXRBdHRyaWJ1dGVWYWx1ZShkYXRhKTsKLSAgRVhQRUNUX0VRKEwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IiwgZGF0YSk7Ci0KLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRCcmVhaywgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpUZXh0LCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldFRleHREYXRhKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJcbiAgIiwgZGF0YSk7Ci0KLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OlRleHQsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0VGV4dERhdGEoZGF0YSk7Ci0gIEVYUEVDVF9FUShMIlxuIiwgZGF0YSk7Ci0KLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRDbG9zZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIHBhcnNlci5HZXRUYWdOYW1lKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJzY3JpcHQiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RW5kT2ZTdHJpbmcsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotfQotCi1URVNUKENGREVfWE1MU3ludGF4UGFyc2VyLCBDb21tZW50VGhyZWVEYXNoKSB7Ci0gIGNvbnN0IEZYX1dDSEFSKiBpbnB1dCA9Ci0gICAgICBMIjxzY3JpcHQgY29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHRcIj5cbiIKLSAgICAgIEwiICA8IS0tLT5cbiIKLSAgICAgIEwiPC9zY3JpcHQ+IjsKLQotICAvLyBXZSAqIHNpemVvZihGWF9XQ0hBUikgYmVjYXVzZSB3ZSBwYXNzIGluIHRoZSB1aW50OF90LCBub3QgdGhlIEZYX1dDSEFSLgotICBzaXplX3QgbGVuID0gRlhTWVNfd2NzbGVuKGlucHV0KSAqIHNpemVvZihGWF9XQ0hBUik7Ci0gIENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiBzdHJlYW0gPSBJRkdBU19TdHJlYW06OkNyZWF0ZVN0cmVhbSgKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8RlhfV0NIQVIqPihpbnB1dCkpLCBsZW4sIDApOwotICBDRkRFX1hNTFN5bnRheFBhcnNlciBwYXJzZXI7Ci0gIHBhcnNlci5Jbml0KHN0cmVhbSwgMjU2KTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRPcGVuLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OlRhZ05hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotCi0gIENGWF9XaWRlU3RyaW5nIGRhdGE7Ci0gIHBhcnNlci5HZXRUYWdOYW1lKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJzY3JpcHQiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6QXR0cmlOYW1lLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldEF0dHJpYnV0ZU5hbWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMImNvbnRlbnRUeXBlIiwgZGF0YSk7Ci0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpBdHRyaVZhbHVlLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldEF0dHJpYnV0ZVZhbHVlKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudEJyZWFrLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OlRleHQsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0VGV4dERhdGEoZGF0YSk7Ci0gIEVYUEVDVF9FUShMIlxuICAiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RW5kT2ZTdHJpbmcsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotfQotCi1URVNUKENGREVfWE1MU3ludGF4UGFyc2VyLCBDb21tZW50VHdvRGFzaCkgewotICBjb25zdCBGWF9XQ0hBUiogaW5wdXQgPQotICAgICAgTCI8c2NyaXB0IGNvbnRlbnRUeXBlPVwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0XCI+XG4iCi0gICAgICBMIiAgPCEtLT5cbiIKLSAgICAgIEwiPC9zY3JpcHQ+IjsKLQotICAvLyBXZSAqIHNpemVvZihGWF9XQ0hBUikgYmVjYXVzZSB3ZSBwYXNzIGluIHRoZSB1aW50OF90LCBub3QgdGhlIEZYX1dDSEFSLgotICBzaXplX3QgbGVuID0gRlhTWVNfd2NzbGVuKGlucHV0KSAqIHNpemVvZihGWF9XQ0hBUik7Ci0gIENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiBzdHJlYW0gPSBJRkdBU19TdHJlYW06OkNyZWF0ZVN0cmVhbSgKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8RlhfV0NIQVIqPihpbnB1dCkpLCBsZW4sIDApOwotICBDRkRFX1hNTFN5bnRheFBhcnNlciBwYXJzZXI7Ci0gIHBhcnNlci5Jbml0KHN0cmVhbSwgMjU2KTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRPcGVuLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OlRhZ05hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotCi0gIENGWF9XaWRlU3RyaW5nIGRhdGE7Ci0gIHBhcnNlci5HZXRUYWdOYW1lKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJzY3JpcHQiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6QXR0cmlOYW1lLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldEF0dHJpYnV0ZU5hbWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMImNvbnRlbnRUeXBlIiwgZGF0YSk7Ci0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpBdHRyaVZhbHVlLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldEF0dHJpYnV0ZVZhbHVlKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudEJyZWFrLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OlRleHQsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0VGV4dERhdGEoZGF0YSk7Ci0gIEVYUEVDVF9FUShMIlxuICAiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RW5kT2ZTdHJpbmcsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotfQotCi1URVNUKENGREVfWE1MU3ludGF4UGFyc2VyLCBFbnRpdGllcykgewotICBjb25zdCBGWF9XQ0hBUiogaW5wdXQgPQotICAgICAgTCI8c2NyaXB0IGNvbnRlbnRUeXBlPVwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0XCI+IgotICAgICAgTCImIzY2OyIKLSAgICAgIEwiJiN4NTQ7IgotICAgICAgTCImI3gwMDAwMDAwMDAwMDAwMDAwMDA0ODsiCi0gICAgICBMIiYjeDAwMDAwMDAwMDAwMDAwMDBBQjQ4OyIKLSAgICAgIEwiJiN4MDAwMDAwMDAwMDAwMDAwMDAwMDsiCi0gICAgICBMIjwvc2NyaXB0PiI7Ci0KLSAgLy8gV2UgKiBzaXplb2YoRlhfV0NIQVIpIGJlY2F1c2Ugd2UgcGFzcyBpbiB0aGUgdWludDhfdCwgbm90IHRoZSBGWF9XQ0hBUi4KLSAgc2l6ZV90IGxlbiA9IEZYU1lTX3djc2xlbihpbnB1dCkgKiBzaXplb2YoRlhfV0NIQVIpOwotICBDRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4gc3RyZWFtID0gSUZHQVNfU3RyZWFtOjpDcmVhdGVTdHJlYW0oCi0gICAgICByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PEZYX1dDSEFSKj4oaW5wdXQpKSwgbGVuLCAwKTsKLSAgQ0ZERV9YTUxTeW50YXhQYXJzZXIgcGFyc2VyOwotICBwYXJzZXIuSW5pdChzdHJlYW0sIDI1Nik7Ci0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50T3BlbiwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpUYWdOYW1lLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLQotICBDRlhfV2lkZVN0cmluZyBkYXRhOwotICBwYXJzZXIuR2V0VGFnTmFtZShkYXRhKTsKLSAgRVhQRUNUX0VRKEwic2NyaXB0IiwgZGF0YSk7Ci0KLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpTmFtZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIHBhcnNlci5HZXRBdHRyaWJ1dGVOYW1lKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJjb250ZW50VHlwZSIsIGRhdGEpOwotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6QXR0cmlWYWx1ZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIHBhcnNlci5HZXRBdHRyaWJ1dGVWYWx1ZShkYXRhKTsKLSAgRVhQRUNUX0VRKEwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IiwgZGF0YSk7Ci0KLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRCcmVhaywgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpUZXh0LCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldFRleHREYXRhKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJCVEhceGFiNDgiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudENsb3NlLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldFRhZ05hbWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMInNjcmlwdCIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpFbmRPZlN0cmluZywgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci19Ci0KLVRFU1QoQ0ZERV9YTUxTeW50YXhQYXJzZXIsIEVudGl0eU92ZXJmbG93SGV4KSB7Ci0gIGNvbnN0IEZYX1dDSEFSKiBpbnB1dCA9Ci0gICAgICBMIjxzY3JpcHQgY29udGVudFR5cGU9XCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHRcIj4iCi0gICAgICBMIiYjeGFEQkRGRkZGRjsiCi0gICAgICBMIiYjeGFmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY7IgotICAgICAgTCI8L3NjcmlwdD4iOwotCi0gIC8vIFdlICogc2l6ZW9mKEZYX1dDSEFSKSBiZWNhdXNlIHdlIHBhc3MgaW4gdGhlIHVpbnQ4X3QsIG5vdCB0aGUgRlhfV0NIQVIuCi0gIHNpemVfdCBsZW4gPSBGWFNZU193Y3NsZW4oaW5wdXQpICogc2l6ZW9mKEZYX1dDSEFSKTsKLSAgQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+IHN0cmVhbSA9IElGR0FTX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKAotICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDxGWF9XQ0hBUio+KGlucHV0KSksIGxlbiwgMCk7Ci0gIENGREVfWE1MU3ludGF4UGFyc2VyIHBhcnNlcjsKLSAgcGFyc2VyLkluaXQoc3RyZWFtLCAyNTYpOwotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudE9wZW4sIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6VGFnTmFtZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgZGF0YTsKLSAgcGFyc2VyLkdldFRhZ05hbWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMInNjcmlwdCIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpBdHRyaU5hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0QXR0cmlidXRlTmFtZShkYXRhKTsKLSAgRVhQRUNUX0VRKEwiY29udGVudFR5cGUiLCBkYXRhKTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpVmFsdWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0QXR0cmlidXRlVmFsdWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpFbGVtZW50QnJlYWssIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6VGV4dCwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIHBhcnNlci5HZXRUZXh0RGF0YShkYXRhKTsKLSAgRVhQRUNUX0VRKEwiICAiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudENsb3NlLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldFRhZ05hbWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMInNjcmlwdCIsIGRhdGEpOwotCi0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpFbmRPZlN0cmluZywgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci19Ci0KLVRFU1QoQ0ZERV9YTUxTeW50YXhQYXJzZXIsIEVudGl0eU92ZXJmbG93RGVjaW1hbCkgewotICBjb25zdCBGWF9XQ0hBUiogaW5wdXQgPQotICAgICAgTCI8c2NyaXB0IGNvbnRlbnRUeXBlPVwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0XCI+IgotICAgICAgTCImIzI5MTQ5MTAyMDU7IgotICAgICAgTCImIzI5MTQ5MTAyMDUyMzQyMzQyMTM0NTIxMzQxMjM0NTEyMzUxMjM0MjEzNDUyMzE1OyIKLSAgICAgIEwiPC9zY3JpcHQ+IjsKLQotICAvLyBXZSAqIHNpemVvZihGWF9XQ0hBUikgYmVjYXVzZSB3ZSBwYXNzIGluIHRoZSB1aW50OF90LCBub3QgdGhlIEZYX1dDSEFSLgotICBzaXplX3QgbGVuID0gRlhTWVNfd2NzbGVuKGlucHV0KSAqIHNpemVvZihGWF9XQ0hBUik7Ci0gIENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiBzdHJlYW0gPSBJRkdBU19TdHJlYW06OkNyZWF0ZVN0cmVhbSgKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KGNvbnN0X2Nhc3Q8RlhfV0NIQVIqPihpbnB1dCkpLCBsZW4sIDApOwotICBDRkRFX1hNTFN5bnRheFBhcnNlciBwYXJzZXI7Ci0gIHBhcnNlci5Jbml0KHN0cmVhbSwgMjU2KTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRPcGVuLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OlRhZ05hbWUsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotCi0gIENGWF9XaWRlU3RyaW5nIGRhdGE7Ci0gIHBhcnNlci5HZXRUYWdOYW1lKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJzY3JpcHQiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6QXR0cmlOYW1lLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldEF0dHJpYnV0ZU5hbWUoZGF0YSk7Ci0gIEVYUEVDVF9FUShMImNvbnRlbnRUeXBlIiwgZGF0YSk7Ci0gIEVYUEVDVF9FUShGREVfWG1sU3ludGF4UmVzdWx0OjpBdHRyaVZhbHVlLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgcGFyc2VyLkdldEF0dHJpYnV0ZVZhbHVlKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudEJyZWFrLCBwYXJzZXIuRG9TeW50YXhQYXJzZSgpKTsKLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OlRleHQsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotICBwYXJzZXIuR2V0VGV4dERhdGEoZGF0YSk7Ci0gIEVYUEVDVF9FUShMIiAgIiwgZGF0YSk7Ci0KLSAgRVhQRUNUX0VRKEZERV9YbWxTeW50YXhSZXN1bHQ6OkVsZW1lbnRDbG9zZSwgcGFyc2VyLkRvU3ludGF4UGFyc2UoKSk7Ci0gIHBhcnNlci5HZXRUYWdOYW1lKGRhdGEpOwotICBFWFBFQ1RfRVEoTCJzY3JpcHQiLCBkYXRhKTsKLQotICBFWFBFQ1RfRVEoRkRFX1htbFN5bnRheFJlc3VsdDo6RW5kT2ZTdHJpbmcsIHBhcnNlci5Eb1N5bnRheFBhcnNlKCkpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2ZnYXMvUkVBRE1FLm1kIGIveGZhL2ZnYXMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMjc3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZmdhcy9SRUFETUUubWQKQEAgLTAsMCArMSBAQAoreGZhL2ZnYXMgY29udGFpbnMgdXRpbGl0eSBjbGFzc2VzIHVzZWQgYnkgWEZBLgpkaWZmIC0tZ2l0IGEveGZhL2ZnYXMvY3J0L2NmZ2FzX2Zvcm1hdHN0cmluZy5jcHAgYi94ZmEvZmdhcy9jcnQvY2ZnYXNfZm9ybWF0c3RyaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGY2ZWVlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2ZnYXMvY3J0L2NmZ2FzX2Zvcm1hdHN0cmluZy5jcHAKQEAgLTAsMCArMSwyMzQ1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZmdhcy9jcnQvY2ZnYXNfZm9ybWF0c3RyaW5nLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfZGVjaW1hbC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY3htbF9lbGVtZW50LmgiCisKKyNkZWZpbmUgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZUhhc2ggMHhiZGU5YWJkZQorI2RlZmluZSBGWF9MT0NBTEVDQVRFR09SWV9UaW1lSGFzaCAweDJkNzFiMDBmCisjZGVmaW5lIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lSGFzaCAweDE1OGM3MmVkCisjZGVmaW5lIEZYX0xPQ0FMRUNBVEVHT1JZX051bUhhc2ggMHgwYjRmZjg3MAorI2RlZmluZSBGWF9MT0NBTEVDQVRFR09SWV9UZXh0SGFzaCAweDJkMDhhZjg1CisjZGVmaW5lIEZYX0xPQ0FMRUNBVEVHT1JZX1plcm9IYXNoIDB4NTY4Y2I1MDAKKyNkZWZpbmUgRlhfTE9DQUxFQ0FURUdPUllfTnVsbEhhc2ggMHgwNTI5MzFiYgorCisjZGVmaW5lIEZYX05VTVNUWUxFX1BlcmNlbnQgMHgwMQorI2RlZmluZSBGWF9OVU1TVFlMRV9FeHBvbmVudCAweDAyCisjZGVmaW5lIEZYX05VTVNUWUxFX0RvdFZvcnYgMHgwNAorCituYW1lc3BhY2UgeworCitzdHJ1Y3QgRlhfTE9DQUxFU1VCQ0FURUdPUllJTkZPIHsKKyAgdWludDMyX3QgdUhhc2g7CisgIGNvbnN0IHdjaGFyX3QqIHBOYW1lOworICBpbnQzMl90IGVTdWJDYXRlZ29yeTsKK307CisKK2NvbnN0IEZYX0xPQ0FMRVNVQkNBVEVHT1JZSU5GTyBnX0ZYTG9jYWxlRGF0ZVRpbWVTdWJDYXREYXRhW10gPSB7CisgICAgezB4MTRkYTIxMjUsIEwiZGVmYXVsdCIsIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRGVmYXVsdH0sCisgICAgezB4OTA0MWQ0YjAsIEwic2hvcnQiLCBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0fSwKKyAgICB7MHhhMDg0YTM4MSwgTCJtZWRpdW0iLCBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bX0sCisgICAgezB4Y2RjZTU2YjMsIEwiZnVsbCIsIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbH0sCisgICAgezB4ZjZiNGFmYjAsIEwibG9uZyIsIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTG9uZ30sCit9OworY29uc3QgaW50MzJfdCBnX2lGWExvY2FsZURhdGVUaW1lU3ViQ2F0Q291bnQgPQorICAgIHNpemVvZihnX0ZYTG9jYWxlRGF0ZVRpbWVTdWJDYXREYXRhKSAvIHNpemVvZihGWF9MT0NBTEVTVUJDQVRFR09SWUlORk8pOworCitjb25zdCBGWF9MT0NBTEVTVUJDQVRFR09SWUlORk8gZ19GWExvY2FsZU51bVN1YkNhdERhdGFbXSA9IHsKKyAgICB7MHg0NmY5NTUzMSwgTCJwZXJjZW50IiwgRlhfTE9DQUxFTlVNUEFUVEVSTl9QZXJjZW50fSwKKyAgICB7MHg0YzRlOGFjYiwgTCJjdXJyZW5jeSIsIEZYX0xPQ0FMRU5VTVBBVFRFUk5fQ3VycmVuY3l9LAorICAgIHsweDU0MDM0YzJmLCBMImRlY2ltYWwiLCBGWF9MT0NBTEVOVU1QQVRURVJOX0RlY2ltYWx9LAorICAgIHsweDc1NjhlNmFlLCBMImludGVnZXIiLCBGWF9MT0NBTEVOVU1QQVRURVJOX0ludGVnZXJ9LAorfTsKK2NvbnN0IGludDMyX3QgZ19pRlhMb2NhbGVOdW1TdWJDYXRDb3VudCA9CisgICAgc2l6ZW9mKGdfRlhMb2NhbGVOdW1TdWJDYXREYXRhKSAvIHNpemVvZihGWF9MT0NBTEVTVUJDQVRFR09SWUlORk8pOworCitzdHJ1Y3QgRlhfTE9DQUxFVElNRVpPTkVJTkZPIHsKKyAgY29uc3Qgd2NoYXJfdCogbmFtZTsKKyAgaW50MTZfdCBpSG91cjsKKyAgaW50MTZfdCBpTWludXRlOworfTsKKworY29uc3QgRlhfTE9DQUxFVElNRVpPTkVJTkZPIGdfRlhMb2NhbGVUaW1lWm9uZURhdGFbXSA9IHsKKyAgICB7TCJDRFQiLCAtNSwgMH0sIHtMIkNTVCIsIC02LCAwfSwge0wiRURUIiwgLTQsIDB9LCB7TCJFU1QiLCAtNSwgMH0sCisgICAge0wiTURUIiwgLTYsIDB9LCB7TCJNU1QiLCAtNywgMH0sIHtMIlBEVCIsIC03LCAwfSwge0wiUFNUIiwgLTgsIDB9LAorfTsKKworY29uc3Qgd2NoYXJfdCBnc193c1RpbWVTeW1ib2xzW10gPSBMImhIa0tNU0ZBeloiOworY29uc3Qgd2NoYXJfdCBnc193c0RhdGVTeW1ib2xzW10gPSBMIkRKTUVlR2dZd1ciOworY29uc3Qgd2NoYXJfdCBnc193c0NvbnN0Q2hhcnNbXSA9IEwiLC06Ly4gIjsKKworaW50MzJfdCBQYXJzZVRpbWVab25lKGNvbnN0IHdjaGFyX3QqIHBTdHIsIGludDMyX3QgaUxlbiwgRlhfVElNRVpPTkUqIHR6KSB7CisgIHR6LT50ekhvdXIgPSAwOworICB0ei0+dHpNaW51dGUgPSAwOworICBpZiAoaUxlbiA8IDApCisgICAgcmV0dXJuIDA7CisKKyAgaW50MzJfdCBpU3RhcnQgPSAxOworICBpbnQzMl90IGlFbmQgPSBpU3RhcnQgKyAyOworICB3aGlsZSAoaVN0YXJ0IDwgaUxlbiAmJiBpU3RhcnQgPCBpRW5kKQorICAgIHR6LT50ekhvdXIgPSB0ei0+dHpIb3VyICogMTAgKyBGWFNZU19EZWNpbWFsQ2hhclRvSW50KHBTdHJbaVN0YXJ0KytdKTsKKworICBpZiAoaVN0YXJ0IDwgaUxlbiAmJiBwU3RyW2lTdGFydF0gPT0gJzonKQorICAgIGlTdGFydCsrOworCisgIGlFbmQgPSBpU3RhcnQgKyAyOworICB3aGlsZSAoaVN0YXJ0IDwgaUxlbiAmJiBpU3RhcnQgPCBpRW5kKQorICAgIHR6LT50ek1pbnV0ZSA9IHR6LT50ek1pbnV0ZSAqIDEwICsgRlhTWVNfRGVjaW1hbENoYXJUb0ludChwU3RyW2lTdGFydCsrXSk7CisKKyAgaWYgKHBTdHJbMF0gPT0gJy0nKQorICAgIHR6LT50ekhvdXIgPSAtdHotPnR6SG91cjsKKworICByZXR1cm4gaVN0YXJ0OworfQorCitpbnQzMl90IENvbnZlcnRIZXgoaW50MzJfdCBpS2V5VmFsdWUsIHdjaGFyX3QgY2gpIHsKKyAgaWYgKEZYU1lTX2lzSGV4RGlnaXQoY2gpKQorICAgIHJldHVybiBpS2V5VmFsdWUgKiAxNiArIEZYU1lTX0hleENoYXJUb0ludChjaCk7CisgIHJldHVybiBpS2V5VmFsdWU7Cit9CisKK1dpZGVTdHJpbmcgR2V0TGl0ZXJhbFRleHQoY29uc3Qgd2NoYXJfdCogcFN0clBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGlQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5QYXR0ZXJuKSB7CisgIFdpZGVTdHJpbmcgd3NPdXRwdXQ7CisgIGlmIChwU3RyUGF0dGVyblsqaVBhdHRlcm5dICE9ICdcJycpCisgICAgcmV0dXJuIHdzT3V0cHV0OworCisgICgqaVBhdHRlcm4pKys7CisgIGludDMyX3QgaVF1b3RlID0gMTsKKyAgd2hpbGUgKCppUGF0dGVybiA8IGlMZW5QYXR0ZXJuKSB7CisgICAgaWYgKHBTdHJQYXR0ZXJuWyppUGF0dGVybl0gPT0gJ1wnJykgeworICAgICAgaVF1b3RlKys7CisgICAgICBpZiAoKCppUGF0dGVybiArIDEgPj0gaUxlblBhdHRlcm4pIHx8CisgICAgICAgICAgKChwU3RyUGF0dGVyblsqaVBhdHRlcm4gKyAxXSAhPSAnXCcnKSAmJiAoaVF1b3RlICUgMiA9PSAwKSkpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpUXVvdGUrKzsKKyAgICAgICgqaVBhdHRlcm4pKys7CisgICAgfSBlbHNlIGlmIChwU3RyUGF0dGVyblsqaVBhdHRlcm5dID09ICdcXCcgJiYKKyAgICAgICAgICAgICAgICgqaVBhdHRlcm4gKyAxIDwgaUxlblBhdHRlcm4pICYmCisgICAgICAgICAgICAgICBwU3RyUGF0dGVyblsqaVBhdHRlcm4gKyAxXSA9PSAndScpIHsKKyAgICAgIGludDMyX3QgaUtleVZhbHVlID0gMDsKKyAgICAgICppUGF0dGVybiArPSAyOworICAgICAgaW50MzJfdCBpID0gMDsKKyAgICAgIHdoaWxlICgqaVBhdHRlcm4gPCBpTGVuUGF0dGVybiAmJiBpKysgPCA0KSB7CisgICAgICAgIHdjaGFyX3QgY2ggPSBwU3RyUGF0dGVyblsoKmlQYXR0ZXJuKSsrXTsKKyAgICAgICAgaUtleVZhbHVlID0gQ29udmVydEhleChpS2V5VmFsdWUsIGNoKTsKKyAgICAgIH0KKyAgICAgIGlmIChpS2V5VmFsdWUgIT0gMCkKKyAgICAgICAgd3NPdXRwdXQgKz0gc3RhdGljX2Nhc3Q8d2NoYXJfdD4oaUtleVZhbHVlICYgMHgwMDAwRkZGRik7CisKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB3c091dHB1dCArPSBwU3RyUGF0dGVyblsoKmlQYXR0ZXJuKSsrXTsKKyAgfQorICByZXR1cm4gd3NPdXRwdXQ7Cit9CisKK1dpZGVTdHJpbmcgR2V0TGl0ZXJhbFRleHRSZXZlcnNlKGNvbnN0IHdjaGFyX3QqIHBTdHJQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogaVBhdHRlcm4pIHsKKyAgV2lkZVN0cmluZyB3c091dHB1dDsKKyAgaWYgKHBTdHJQYXR0ZXJuWyppUGF0dGVybl0gIT0gJ1wnJykKKyAgICByZXR1cm4gd3NPdXRwdXQ7CisKKyAgKCppUGF0dGVybiktLTsKKyAgaW50MzJfdCBpUXVvdGUgPSAxOworICB3aGlsZSAoKmlQYXR0ZXJuID49IDApIHsKKyAgICBpZiAocFN0clBhdHRlcm5bKmlQYXR0ZXJuXSA9PSAnXCcnKSB7CisgICAgICBpUXVvdGUrKzsKKyAgICAgIGlmICgqaVBhdHRlcm4gLSAxID49IDAgfHwKKyAgICAgICAgICAoKHBTdHJQYXR0ZXJuWyppUGF0dGVybiAtIDFdICE9ICdcJycpICYmIChpUXVvdGUgJSAyID09IDApKSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlRdW90ZSsrOworICAgICAgKCppUGF0dGVybiktLTsKKyAgICB9IGVsc2UgaWYgKHBTdHJQYXR0ZXJuWyppUGF0dGVybl0gPT0gJ1xcJyAmJgorICAgICAgICAgICAgICAgcFN0clBhdHRlcm5bKmlQYXR0ZXJuICsgMV0gPT0gJ3UnKSB7CisgICAgICAoKmlQYXR0ZXJuKS0tOworICAgICAgaW50MzJfdCBpS2V5VmFsdWUgPSAwOworICAgICAgaW50MzJfdCBpTGVuID0gd3NPdXRwdXQuR2V0TGVuZ3RoKCk7CisgICAgICBpbnQzMl90IGkgPSAxOworICAgICAgZm9yICg7IGkgPCBpTGVuICYmIGkgPCA1OyBpKyspIHsKKyAgICAgICAgd2NoYXJfdCBjaCA9IHdzT3V0cHV0W2ldOworICAgICAgICBpS2V5VmFsdWUgPSBDb252ZXJ0SGV4KGlLZXlWYWx1ZSwgY2gpOworICAgICAgfQorICAgICAgaWYgKGlLZXlWYWx1ZSAhPSAwKSB7CisgICAgICAgIHdzT3V0cHV0LkRlbGV0ZSgwLCBpKTsKKyAgICAgICAgd3NPdXRwdXQgPSAod2NoYXJfdCkoaUtleVZhbHVlICYgMHgwMDAwRkZGRikgKyB3c091dHB1dDsKKyAgICAgIH0KKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICB3c091dHB1dCA9IHBTdHJQYXR0ZXJuWygqaVBhdHRlcm4pLS1dICsgd3NPdXRwdXQ7CisgIH0KKyAgcmV0dXJuIHdzT3V0cHV0OworfQorCitib29sIEdldE51bWVyaWNEb3RJbmRleChjb25zdCBXaWRlU3RyaW5nJiB3c051bSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzRG90U3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogaURvdEluZGV4KSB7CisgIGludDMyX3QgY2NmID0gMDsKKyAgaW50MzJfdCBpTGVuZiA9IHdzTnVtLkdldExlbmd0aCgpOworICBjb25zdCB3Y2hhcl90KiBwU3RyID0gd3NOdW0uY19zdHIoKTsKKyAgaW50MzJfdCBpTGVuRG90ID0gd3NEb3RTeW1ib2wuR2V0TGVuZ3RoKCk7CisgIHdoaWxlIChjY2YgPCBpTGVuZikgeworICAgIGlmIChwU3RyW2NjZl0gPT0gJ1wnJykgeworICAgICAgR2V0TGl0ZXJhbFRleHQocFN0ciwgJmNjZiwgaUxlbmYpOworICAgIH0gZWxzZSBpZiAoY2NmICsgaUxlbkRvdCA8PSBpTGVuZiAmJgorICAgICAgICAgICAgICAgIXdjc25jbXAocFN0ciArIGNjZiwgd3NEb3RTeW1ib2wuY19zdHIoKSwgaUxlbkRvdCkpIHsKKyAgICAgICppRG90SW5kZXggPSBjY2Y7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2NmKys7CisgIH0KKyAgYXV0byByZXN1bHQgPSB3c051bS5GaW5kKCcuJyk7CisgICppRG90SW5kZXggPSByZXN1bHQudmFsdWVfb3IoaUxlbmYpOworICByZXR1cm4gcmVzdWx0Lmhhc192YWx1ZSgpOworfQorCitib29sIEV4dHJhY3RDb3VudERpZ2l0cyhjb25zdCB3Y2hhcl90KiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiB2YWx1ZSkgeworICBmb3IgKGludCBpID0gY291bnQ7IGkgPiAwOyAtLWkpIHsKKyAgICBpZiAoKmNjID49IGxlbikKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0clsqY2NdKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAqdmFsdWUgPSAqdmFsdWUgKiAxMCArIEZYU1lTX0RlY2ltYWxDaGFyVG9JbnQoc3RyWygqY2MpKytdKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeHRyYWN0Q291bnREaWdpdHNXaXRoT3B0aW9uYWwoY29uc3Qgd2NoYXJfdCogc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogdmFsdWUpIHsKKyAgaWYgKCFFeHRyYWN0Q291bnREaWdpdHMoc3RyLCBsZW4sIGNvdW50LCBjYywgdmFsdWUpKQorICAgIHJldHVybiBmYWxzZTsKKyAgRXh0cmFjdENvdW50RGlnaXRzKHN0ciwgbGVuLCAxLCBjYywgdmFsdWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZUxvY2FsZURhdGUoY29uc3QgV2lkZVN0cmluZyYgd3NEYXRlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NEYXRlUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICBDRlhfRGF0ZVRpbWUqIGRhdGV0aW1lLAorICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogY2MpIHsKKyAgdWludDMyX3QgeWVhciA9IDE5MDA7CisgIHVpbnQzMl90IG1vbnRoID0gMTsKKyAgdWludDMyX3QgZGF5ID0gMTsKKyAgaW50MzJfdCBjY2YgPSAwOworICBjb25zdCB3Y2hhcl90KiBzdHIgPSB3c0RhdGUuY19zdHIoKTsKKyAgaW50MzJfdCBsZW4gPSB3c0RhdGUuR2V0TGVuZ3RoKCk7CisgIGNvbnN0IHdjaGFyX3QqIHN0cmYgPSB3c0RhdGVQYXR0ZXJuLmNfc3RyKCk7CisgIGludDMyX3QgbGVuZiA9IHdzRGF0ZVBhdHRlcm4uR2V0TGVuZ3RoKCk7CisgIFdpZGVTdHJpbmdWaWV3IHdzRGF0ZVN5bWJvbHMoZ3Nfd3NEYXRlU3ltYm9scyk7CisgIHdoaWxlICgqY2MgPCBsZW4gJiYgY2NmIDwgbGVuZikgeworICAgIGlmIChzdHJmW2NjZl0gPT0gJ1wnJykgeworICAgICAgV2lkZVN0cmluZyB3c0xpdGVyYWwgPSBHZXRMaXRlcmFsVGV4dChzdHJmLCAmY2NmLCBsZW5mKTsKKyAgICAgIGludDMyX3QgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7CisgICAgICBpZiAoKmNjICsgaUxpdGVyYWxMZW4gPiBsZW4gfHwKKyAgICAgICAgICB3Y3NuY21wKHN0ciArICpjYywgd3NMaXRlcmFsLmNfc3RyKCksIGlMaXRlcmFsTGVuKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAqY2MgKz0gaUxpdGVyYWxMZW47CisgICAgICBjY2YrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoIXdzRGF0ZVN5bWJvbHMuQ29udGFpbnMoc3RyZltjY2ZdKSkgeworICAgICAgaWYgKHN0cmZbY2NmXSAhPSBzdHJbKmNjXSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgKCpjYykrKzsKKyAgICAgIGNjZisrOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgV2lkZVN0cmluZyBzeW1ib2w7CisgICAgc3ltYm9sLlJlc2VydmUoNCk7CisgICAgc3ltYm9sICs9IHN0cmZbY2NmKytdOworICAgIHdoaWxlIChjY2YgPCBsZW5mICYmIHN0cmZbY2NmXSA9PSBzeW1ib2xbMF0pCisgICAgICBzeW1ib2wgKz0gc3RyZltjY2YrK107CisKKyAgICBpZiAoc3ltYm9sID09IEwiRCIgfHwgc3ltYm9sID09IEwiREQiKSB7CisgICAgICBkYXkgPSAwOworICAgICAgaWYgKCFFeHRyYWN0Q291bnREaWdpdHNXaXRoT3B0aW9uYWwoc3RyLCBsZW4sIDEsIGNjLCAmZGF5KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoc3ltYm9sID09IEwiSiIpIHsKKyAgICAgIHVpbnQzMl90IHZhbCA9IDA7CisgICAgICBFeHRyYWN0Q291bnREaWdpdHMoc3RyLCBsZW4sIDMsIGNjLCAmdmFsKTsKKyAgICB9IGVsc2UgaWYgKHN5bWJvbCA9PSBMIk0iIHx8IHN5bWJvbCA9PSBMIk1NIikgeworICAgICAgbW9udGggPSAwOworICAgICAgaWYgKCFFeHRyYWN0Q291bnREaWdpdHNXaXRoT3B0aW9uYWwoc3RyLCBsZW4sIDEsIGNjLCAmbW9udGgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmIChzeW1ib2wgPT0gTCJNTU0iIHx8IHN5bWJvbCA9PSBMIk1NTU0iKSB7CisgICAgICBmb3IgKHVpbnQxNl90IGkgPSAwOyBpIDwgMTI7IGkrKykgeworICAgICAgICBXaWRlU3RyaW5nIHdzTW9udGhOYW1lID0gcExvY2FsZS0+R2V0TW9udGhOYW1lKGksIHN5bWJvbCA9PSBMIk1NTSIpOworICAgICAgICBpZiAod3NNb250aE5hbWUuSXNFbXB0eSgpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIXdjc25jbXAod3NNb250aE5hbWUuY19zdHIoKSwgc3RyICsgKmNjLCB3c01vbnRoTmFtZS5HZXRMZW5ndGgoKSkpIHsKKyAgICAgICAgICAqY2MgKz0gd3NNb250aE5hbWUuR2V0TGVuZ3RoKCk7CisgICAgICAgICAgbW9udGggPSBpICsgMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAoc3ltYm9sID09IEwiRUVFIiB8fCBzeW1ib2wgPT0gTCJFRUVFIikgeworICAgICAgZm9yICh1aW50MTZfdCBpID0gMDsgaSA8IDc7IGkrKykgeworICAgICAgICBXaWRlU3RyaW5nIHdzRGF5TmFtZSA9IHBMb2NhbGUtPkdldERheU5hbWUoaSwgc3ltYm9sID09IEwiRUVFIik7CisgICAgICAgIGlmICh3c0RheU5hbWUuSXNFbXB0eSgpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoIXdjc25jbXAod3NEYXlOYW1lLmNfc3RyKCksIHN0ciArICpjYywgd3NEYXlOYW1lLkdldExlbmd0aCgpKSkgeworICAgICAgICAgICpjYyArPSB3c0RheU5hbWUuR2V0TGVuZ3RoKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHN5bWJvbCA9PSBMIllZIiB8fCBzeW1ib2wgPT0gTCJZWVlZIikgeworICAgICAgaWYgKCpjYyArIHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PGludDMyX3Q+KHN5bWJvbC5HZXRMZW5ndGgoKSkgPiBsZW4pCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgeWVhciA9IDA7CisgICAgICBpZiAoIUV4dHJhY3RDb3VudERpZ2l0cyhzdHIsIGxlbiwgc3ltYm9sLkdldExlbmd0aCgpLCBjYywgJnllYXIpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoc3ltYm9sID09IEwiWVkiKSB7CisgICAgICAgIGlmICh5ZWFyIDw9IDI5KQorICAgICAgICAgIHllYXIgKz0gMjAwMDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHllYXIgKz0gMTkwMDsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHN5bWJvbCA9PSBMIkciKSB7CisgICAgICAqY2MgKz0gMjsKKyAgICB9IGVsc2UgaWYgKHN5bWJvbCA9PSBMIkpKSiIgfHwgc3ltYm9sID09IEwiRSIgfHwgc3ltYm9sID09IEwiZSIgfHwKKyAgICAgICAgICAgICAgIHN5bWJvbCA9PSBMInciIHx8IHN5bWJvbCA9PSBMIldXIikgeworICAgICAgKmNjICs9IHN5bWJvbC5HZXRMZW5ndGgoKTsKKyAgICB9CisgIH0KKyAgaWYgKCpjYyA8IGxlbikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZGF0ZXRpbWUtPlNldERhdGUoeWVhciwgbW9udGgsIGRheSk7CisgIHJldHVybiAhISgqY2MpOworfQorCit2b2lkIFJlc29sdmVab25lKEZYX1RJTUVaT05FIHR6RGlmZiwKKyAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSwKKyAgICAgICAgICAgICAgICAgdWludDMyX3QqIHdIb3VyLAorICAgICAgICAgICAgICAgICB1aW50MzJfdCogd01pbnV0ZSkgeworICBpbnQzMl90IGlNaW51dGVEaWZmID0gKndIb3VyICogNjAgKyAqd01pbnV0ZTsKKyAgRlhfVElNRVpPTkUgdHpMb2NhbGUgPSBwTG9jYWxlLT5HZXRUaW1lWm9uZSgpOworICBpTWludXRlRGlmZiArPSB0ekxvY2FsZS50ekhvdXIgKiA2MCArCisgICAgICAgICAgICAgICAgICh0ekxvY2FsZS50ekhvdXIgPCAwID8gLXR6TG9jYWxlLnR6TWludXRlIDogdHpMb2NhbGUudHpNaW51dGUpOworICBpTWludXRlRGlmZiAtPSB0ekRpZmYudHpIb3VyICogNjAgKworICAgICAgICAgICAgICAgICAodHpEaWZmLnR6SG91ciA8IDAgPyAtdHpEaWZmLnR6TWludXRlIDogdHpEaWZmLnR6TWludXRlKTsKKworICBpTWludXRlRGlmZiAlPSAxNDQwOworICBpZiAoaU1pbnV0ZURpZmYgPCAwKQorICAgIGlNaW51dGVEaWZmICs9IDE0NDA7CisKKyAgKndIb3VyID0gaU1pbnV0ZURpZmYgLyA2MDsKKyAgKndNaW51dGUgPSBpTWludXRlRGlmZiAlIDYwOworfQorCitib29sIFBhcnNlTG9jYWxlVGltZShjb25zdCBXaWRlU3RyaW5nJiB3c1RpbWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c1RpbWVQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9EYXRlVGltZSogZGF0ZXRpbWUsCisgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBjYykgeworICB1aW50MzJfdCBob3VyID0gMDsKKyAgdWludDMyX3QgbWludXRlID0gMDsKKyAgdWludDMyX3Qgc2Vjb25kID0gMDsKKyAgdWludDMyX3QgbWlsbGlzZWNvbmQgPSAwOworICBpbnQzMl90IGNjZiA9IDA7CisgIGNvbnN0IHdjaGFyX3QqIHN0ciA9IHdzVGltZS5jX3N0cigpOworICBpbnQgbGVuID0gd3NUaW1lLkdldExlbmd0aCgpOworICBjb25zdCB3Y2hhcl90KiBzdHJmID0gd3NUaW1lUGF0dGVybi5jX3N0cigpOworICBpbnQgbGVuZiA9IHdzVGltZVBhdHRlcm4uR2V0TGVuZ3RoKCk7CisgIGJvb2wgYkhhc0EgPSBmYWxzZTsKKyAgYm9vbCBiUE0gPSBmYWxzZTsKKyAgV2lkZVN0cmluZ1ZpZXcgd3NUaW1lU3ltYm9scyhnc193c1RpbWVTeW1ib2xzKTsKKyAgd2hpbGUgKCpjYyA8IGxlbiAmJiBjY2YgPCBsZW5mKSB7CisgICAgaWYgKHN0cmZbY2NmXSA9PSAnXCcnKSB7CisgICAgICBXaWRlU3RyaW5nIHdzTGl0ZXJhbCA9IEdldExpdGVyYWxUZXh0KHN0cmYsICZjY2YsIGxlbmYpOworICAgICAgaW50MzJfdCBpTGl0ZXJhbExlbiA9IHdzTGl0ZXJhbC5HZXRMZW5ndGgoKTsKKyAgICAgIGlmICgqY2MgKyBpTGl0ZXJhbExlbiA+IGxlbiB8fAorICAgICAgICAgIHdjc25jbXAoc3RyICsgKmNjLCB3c0xpdGVyYWwuY19zdHIoKSwgaUxpdGVyYWxMZW4pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgICpjYyArPSBpTGl0ZXJhbExlbjsKKyAgICAgIGNjZisrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICghd3NUaW1lU3ltYm9scy5Db250YWlucyhzdHJmW2NjZl0pKSB7CisgICAgICBpZiAoc3RyZltjY2ZdICE9IHN0clsqY2NdKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAoKmNjKSsrOworICAgICAgY2NmKys7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBXaWRlU3RyaW5nIHN5bWJvbDsKKyAgICBzeW1ib2wuUmVzZXJ2ZSg0KTsKKyAgICBzeW1ib2wgKz0gc3RyZltjY2YrK107CisgICAgd2hpbGUgKGNjZiA8IGxlbmYgJiYgc3RyZltjY2ZdID09IHN5bWJvbFswXSkKKyAgICAgIHN5bWJvbCArPSBzdHJmW2NjZisrXTsKKworICAgIGlmIChzeW1ib2wgPT0gTCJrIiB8fCBzeW1ib2wgPT0gTCJLIiB8fCBzeW1ib2wgPT0gTCJoIiB8fCBzeW1ib2wgPT0gTCJIIikgeworICAgICAgaG91ciA9IDA7CisgICAgICBpZiAoIUV4dHJhY3RDb3VudERpZ2l0c1dpdGhPcHRpb25hbChzdHIsIGxlbiwgMSwgY2MsICZob3VyKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHN5bWJvbCA9PSBMIksiICYmIGhvdXIgPT0gMjQpCisgICAgICAgIGhvdXIgPSAwOworICAgIH0gZWxzZSBpZiAoc3ltYm9sID09IEwia2siIHx8IHN5bWJvbCA9PSBMIktLIiB8fCBzeW1ib2wgPT0gTCJoaCIgfHwKKyAgICAgICAgICAgICAgIHN5bWJvbCA9PSBMIkhIIikgeworICAgICAgaG91ciA9IDA7CisgICAgICBpZiAoIUV4dHJhY3RDb3VudERpZ2l0cyhzdHIsIGxlbiwgMiwgY2MsICZob3VyKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHN5bWJvbCA9PSBMIktLIiAmJiBob3VyID09IDI0KQorICAgICAgICBob3VyID0gMDsKKyAgICB9IGVsc2UgaWYgKHN5bWJvbCA9PSBMIk0iKSB7CisgICAgICBtaW51dGUgPSAwOworICAgICAgaWYgKCFFeHRyYWN0Q291bnREaWdpdHNXaXRoT3B0aW9uYWwoc3RyLCBsZW4sIDEsIGNjLCAmbWludXRlKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoc3ltYm9sID09IEwiTU0iKSB7CisgICAgICBtaW51dGUgPSAwOworICAgICAgaWYgKCFFeHRyYWN0Q291bnREaWdpdHMoc3RyLCBsZW4sIDIsIGNjLCAmbWludXRlKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoc3ltYm9sID09IEwiUyIpIHsKKyAgICAgIHNlY29uZCA9IDA7CisgICAgICBpZiAoIUV4dHJhY3RDb3VudERpZ2l0c1dpdGhPcHRpb25hbChzdHIsIGxlbiwgMSwgY2MsICZzZWNvbmQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmIChzeW1ib2wgPT0gTCJTUyIpIHsKKyAgICAgIHNlY29uZCA9IDA7CisgICAgICBpZiAoIUV4dHJhY3RDb3VudERpZ2l0cyhzdHIsIGxlbiwgMiwgY2MsICZzZWNvbmQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmIChzeW1ib2wgPT0gTCJGRkYiKSB7CisgICAgICBtaWxsaXNlY29uZCA9IDA7CisgICAgICBpZiAoIUV4dHJhY3RDb3VudERpZ2l0cyhzdHIsIGxlbiwgMywgY2MsICZtaWxsaXNlY29uZCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHN5bWJvbCA9PSBMIkEiKSB7CisgICAgICBXaWRlU3RyaW5nIHdzQU0gPSBwTG9jYWxlLT5HZXRNZXJpZGllbU5hbWUodHJ1ZSk7CisgICAgICBXaWRlU3RyaW5nIHdzUE0gPSBwTG9jYWxlLT5HZXRNZXJpZGllbU5hbWUoZmFsc2UpOworICAgICAgaWYgKCgqY2MgKyBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxpbnQzMl90Pih3c0FNLkdldExlbmd0aCgpKSA8PQorICAgICAgICAgICBsZW4pICYmCisgICAgICAgICAgKFdpZGVTdHJpbmdWaWV3KHN0ciArICpjYywgd3NBTS5HZXRMZW5ndGgoKSkgPT0gd3NBTSkpIHsKKyAgICAgICAgKmNjICs9IHdzQU0uR2V0TGVuZ3RoKCk7CisgICAgICAgIGJIYXNBID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoKCpjYyArIHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PGludDMyX3Q+KHdzUE0uR2V0TGVuZ3RoKCkpIDw9CisgICAgICAgICAgICAgICAgICBsZW4pICYmCisgICAgICAgICAgICAgICAgIChXaWRlU3RyaW5nVmlldyhzdHIgKyAqY2MsIHdzUE0uR2V0TGVuZ3RoKCkpID09IHdzUE0pKSB7CisgICAgICAgICpjYyArPSB3c1BNLkdldExlbmd0aCgpOworICAgICAgICBiSGFzQSA9IHRydWU7CisgICAgICAgIGJQTSA9IHRydWU7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChzeW1ib2wgPT0gTCJaIikgeworICAgICAgaWYgKCpjYyArIDMgPiBsZW4pCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBXaWRlU3RyaW5nIHR6KHN0clsoKmNjKSsrXSk7CisgICAgICB0eiArPSBzdHJbKCpjYykrK107CisgICAgICB0eiArPSBzdHJbKCpjYykrK107CisgICAgICBpZiAodHogPT0gTCJHTVQiKSB7CisgICAgICAgIEZYX1RJTUVaT05FIHR6RGlmZjsKKyAgICAgICAgdHpEaWZmLnR6SG91ciA9IDA7CisgICAgICAgIHR6RGlmZi50ek1pbnV0ZSA9IDA7CisgICAgICAgIGlmICgqY2MgPCBsZW4gJiYgKHN0clsqY2NdID09ICctJyB8fCBzdHJbKmNjXSA9PSAnKycpKQorICAgICAgICAgICpjYyArPSBQYXJzZVRpbWVab25lKHN0ciArICpjYywgbGVuIC0gKmNjLCAmdHpEaWZmKTsKKworICAgICAgICBSZXNvbHZlWm9uZSh0ekRpZmYsIHBMb2NhbGUsICZob3VyLCAmbWludXRlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFNlYXJjaCB0aGUgdGltZXpvbmUgbGlzdC4gVGhlcmUgYXJlIG9ubHkgOCBvZiB0aGVtLCBzbyBsaW5lYXIgc2Nhbi4KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZ19GWExvY2FsZVRpbWVab25lRGF0YSk7ICsraSkgeworICAgICAgICAgIGNvbnN0IEZYX0xPQ0FMRVRJTUVaT05FSU5GTyYgaW5mbyA9IGdfRlhMb2NhbGVUaW1lWm9uZURhdGFbaV07CisgICAgICAgICAgaWYgKHR6ICE9IGluZm8ubmFtZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgaG91ciArPSBpbmZvLmlIb3VyOworICAgICAgICAgIG1pbnV0ZSArPSBpbmZvLmlIb3VyID4gMCA/IGluZm8uaU1pbnV0ZSA6IC1pbmZvLmlNaW51dGU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHN5bWJvbCA9PSBMInoiKSB7CisgICAgICBpZiAoc3RyWypjY10gIT0gJ1onKSB7CisgICAgICAgIEZYX1RJTUVaT05FIHR6RGlmZjsKKyAgICAgICAgKmNjICs9IFBhcnNlVGltZVpvbmUoc3RyICsgKmNjLCBsZW4gLSAqY2MsICZ0ekRpZmYpOworICAgICAgICBSZXNvbHZlWm9uZSh0ekRpZmYsIHBMb2NhbGUsICZob3VyLCAmbWludXRlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICgqY2MpKys7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChiSGFzQSkgeworICAgIGlmIChiUE0pIHsKKyAgICAgIGhvdXIgKz0gMTI7CisgICAgICBpZiAoaG91ciA9PSAyNCkKKyAgICAgICAgaG91ciA9IDEyOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoaG91ciA9PSAxMikKKyAgICAgICAgaG91ciA9IDA7CisgICAgfQorICB9CisgIGRhdGV0aW1lLT5TZXRUaW1lKGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCk7CisgIHJldHVybiAhISgqY2MpOworfQorCitpbnQzMl90IEdldE51bVRyYWlsaW5nTGltaXQoY29uc3QgV2lkZVN0cmluZyYgd3NGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlEb3RQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogYlRyaW1UYWlsWmVyb3MpIHsKKyAgaWYgKGlEb3RQb3MgPCAwKQorICAgIHJldHVybiAwOworCisgIGludDMyX3QgaUNvdW50ID0gd3NGb3JtYXQuR2V0TGVuZ3RoKCk7CisgIGludDMyX3QgaVRyZWFkaW5nID0gMDsKKyAgZm9yIChpRG90UG9zKys7IGlEb3RQb3MgPCBpQ291bnQ7IGlEb3RQb3MrKykgeworICAgIHdjaGFyX3Qgd2MgPSB3c0Zvcm1hdFtpRG90UG9zXTsKKyAgICBpZiAod2MgPT0gTCd6JyB8fCB3YyA9PSBMJzknIHx8IHdjID09ICdaJykgeworICAgICAgaVRyZWFkaW5nKys7CisgICAgICAqYlRyaW1UYWlsWmVyb3MgPSB3YyAhPSBMJzknOworICAgIH0KKyAgfQorICByZXR1cm4gaVRyZWFkaW5nOworfQorCitib29sIElzTGVhcFllYXIodWludDMyX3QgeWVhcikgeworICByZXR1cm4gKHllYXIgJSA0ID09IDAgJiYgeWVhciAlIDEwMCAhPSAwKSB8fCB5ZWFyICUgNDAwID09IDA7Cit9CisKK2Jvb2wgTW9udGhIYXMzMERheXModWludDMyX3QgbW9udGgpIHsKKyAgcmV0dXJuIG1vbnRoID09IDQgfHwgbW9udGggPT0gNiB8fCBtb250aCA9PSA5IHx8IG1vbnRoID09IDExOworfQorCitib29sIE1vbnRoSGFzMzFEYXlzKHVpbnQzMl90IG1vbnRoKSB7CisgIHJldHVybiBtb250aCAhPSAyICYmICFNb250aEhhczMwRGF5cyhtb250aCk7Cit9CisKKy8vIHxtb250aHwgaXMgMS1iYXNlZC4gZS5nLiAxIG1lYW5zIEphbnVhcnkuCit1aW50MTZfdCBHZXRTb2xhck1vbnRoRGF5cyh1aW50MTZfdCB5ZWFyLCB1aW50MTZfdCBtb250aCkgeworICBpZiAobW9udGggPT0gMikKKyAgICByZXR1cm4gRlhfSXNMZWFwWWVhcih5ZWFyKSA/IDI5IDogMjg7CisKKyAgcmV0dXJuIE1vbnRoSGFzMzBEYXlzKG1vbnRoKSA/IDMwIDogMzE7Cit9CisKK3VpbnQxNl90IEdldFdlZWtEYXkodWludDE2X3QgeWVhciwgdWludDE2X3QgbW9udGgsIHVpbnQxNl90IGRheSkgeworICBzdGF0aWMgY29uc3QgdWludDE2X3QgbW9udGhfZGF5W10gPSB7MCwgMywgMywgNiwgMSwgNCwgNiwgMiwgNSwgMCwgMywgNX07CisgIHVpbnQxNl90IG5EYXlzID0KKyAgICAgICh5ZWFyIC0gMSkgJSA3ICsgKHllYXIgLSAxKSAvIDQgLSAoeWVhciAtIDEpIC8gMTAwICsgKHllYXIgLSAxKSAvIDQwMDsKKyAgbkRheXMgKz0gbW9udGhfZGF5W21vbnRoIC0gMV0gKyBkYXk7CisgIGlmIChGWF9Jc0xlYXBZZWFyKHllYXIpICYmIG1vbnRoID4gMikKKyAgICBuRGF5cysrOworICByZXR1cm4gbkRheXMgJSA3OworfQorCit1aW50MTZfdCBHZXRXZWVrT2ZNb250aCh1aW50MTZfdCB5ZWFyLCB1aW50MTZfdCBtb250aCwgdWludDE2X3QgZGF5KSB7CisgIHVpbnQxNl90IHdlZWtfZGF5ID0gR2V0V2Vla0RheSh5ZWFyLCBtb250aCwgMSk7CisgIHVpbnQxNl90IHdlZWtfaW5kZXggPSAwOworICB3ZWVrX2luZGV4ICs9IGRheSAvIDc7CisgIGRheSA9IGRheSAlIDc7CisgIGlmICh3ZWVrX2RheSArIGRheSA+IDcpCisgICAgd2Vla19pbmRleCsrOworICByZXR1cm4gd2Vla19pbmRleDsKK30KKwordWludDE2X3QgR2V0V2Vla09mWWVhcih1aW50MTZfdCB5ZWFyLCB1aW50MTZfdCBtb250aCwgdWludDE2X3QgZGF5KSB7CisgIHVpbnQxNl90IG5EYXlzID0gMDsKKyAgZm9yICh1aW50MTZfdCBpID0gMTsgaSA8IG1vbnRoOyBpKyspCisgICAgbkRheXMgKz0gR2V0U29sYXJNb250aERheXMoeWVhciwgaSk7CisKKyAgbkRheXMgKz0gZGF5OworICB1aW50MTZfdCB3ZWVrX2RheSA9IEdldFdlZWtEYXkoeWVhciwgMSwgMSk7CisgIHVpbnQxNl90IHdlZWtfaW5kZXggPSAxOworICB3ZWVrX2luZGV4ICs9IG5EYXlzIC8gNzsKKyAgbkRheXMgPSBuRGF5cyAlIDc7CisgIGlmICh3ZWVrX2RheSArIG5EYXlzID4gNykKKyAgICB3ZWVrX2luZGV4Kys7CisgIHJldHVybiB3ZWVrX2luZGV4OworfQorCitXaWRlU3RyaW5nIE51bVRvU3RyaW5nKHNpemVfdCBmbXRfc2l6ZSwgaW50MzJfdCB2YWx1ZSkgeworICByZXR1cm4gV2lkZVN0cmluZzo6Rm9ybWF0KAorICAgICAgZm10X3NpemUgPT0gMSA/IEwiJWQiIDogZm10X3NpemUgPT0gMiA/IEwiJTAyZCIgOiBMIiUwM2QiLCB2YWx1ZSk7Cit9CisKK1dpZGVTdHJpbmcgRGF0ZUZvcm1hdChjb25zdCBXaWRlU3RyaW5nJiB3c0RhdGVQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RhdGVUaW1lJiBkYXRldGltZSkgeworICBXaWRlU3RyaW5nIHdzUmVzdWx0OworICBpbnQzMl90IHllYXIgPSBkYXRldGltZS5HZXRZZWFyKCk7CisgIHVpbnQ4X3QgbW9udGggPSBkYXRldGltZS5HZXRNb250aCgpOworICB1aW50OF90IGRheSA9IGRhdGV0aW1lLkdldERheSgpOworICBpbnQzMl90IGNjZiA9IDA7CisgIGNvbnN0IHdjaGFyX3QqIHN0cmYgPSB3c0RhdGVQYXR0ZXJuLmNfc3RyKCk7CisgIGludDMyX3QgbGVuZiA9IHdzRGF0ZVBhdHRlcm4uR2V0TGVuZ3RoKCk7CisgIFdpZGVTdHJpbmdWaWV3IHdzRGF0ZVN5bWJvbHMoZ3Nfd3NEYXRlU3ltYm9scyk7CisgIHdoaWxlIChjY2YgPCBsZW5mKSB7CisgICAgaWYgKHN0cmZbY2NmXSA9PSAnXCcnKSB7CisgICAgICB3c1Jlc3VsdCArPSBHZXRMaXRlcmFsVGV4dChzdHJmLCAmY2NmLCBsZW5mKTsKKyAgICAgIGNjZisrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICghd3NEYXRlU3ltYm9scy5Db250YWlucyhzdHJmW2NjZl0pKSB7CisgICAgICB3c1Jlc3VsdCArPSBzdHJmW2NjZisrXTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIFdpZGVTdHJpbmcgc3ltYm9sOworICAgIHN5bWJvbC5SZXNlcnZlKDQpOworICAgIHN5bWJvbCArPSBzdHJmW2NjZisrXTsKKyAgICB3aGlsZSAoY2NmIDwgbGVuZiAmJiBzdHJmW2NjZl0gPT0gc3ltYm9sWzBdKQorICAgICAgc3ltYm9sICs9IHN0cmZbY2NmKytdOworCisgICAgaWYgKHN5bWJvbCA9PSBMIkQiIHx8IHN5bWJvbCA9PSBMIkREIikgeworICAgICAgd3NSZXN1bHQgKz0gTnVtVG9TdHJpbmcoc3ltYm9sLkdldExlbmd0aCgpLCBkYXkpOworICAgIH0gZWxzZSBpZiAoc3ltYm9sID09IEwiSiIgfHwgc3ltYm9sID09IEwiSkpKIikgeworICAgICAgdWludDE2X3QgbkRheXMgPSAwOworICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBtb250aDsgaSsrKQorICAgICAgICBuRGF5cyArPSBHZXRTb2xhck1vbnRoRGF5cyh5ZWFyLCBpKTsKKyAgICAgIG5EYXlzICs9IGRheTsKKyAgICAgIHdzUmVzdWx0ICs9IE51bVRvU3RyaW5nKHN5bWJvbC5HZXRMZW5ndGgoKSwgbkRheXMpOworICAgIH0gZWxzZSBpZiAoc3ltYm9sID09IEwiTSIgfHwgc3ltYm9sID09IEwiTU0iKSB7CisgICAgICB3c1Jlc3VsdCArPSBOdW1Ub1N0cmluZyhzeW1ib2wuR2V0TGVuZ3RoKCksIG1vbnRoKTsKKyAgICB9IGVsc2UgaWYgKHN5bWJvbCA9PSBMIk1NTSIgfHwgc3ltYm9sID09IEwiTU1NTSIpIHsKKyAgICAgIHdzUmVzdWx0ICs9IHBMb2NhbGUtPkdldE1vbnRoTmFtZShtb250aCAtIDEsIHN5bWJvbCA9PSBMIk1NTSIpOworICAgIH0gZWxzZSBpZiAoc3ltYm9sID09IEwiRSIgfHwgc3ltYm9sID09IEwiZSIpIHsKKyAgICAgIHVpbnQxNl90IHdXZWVrRGF5ID0gR2V0V2Vla0RheSh5ZWFyLCBtb250aCwgZGF5KTsKKyAgICAgIHdzUmVzdWx0ICs9IE51bVRvU3RyaW5nKAorICAgICAgICAgIDEsIHN5bWJvbCA9PSBMIkUiID8gd1dlZWtEYXkgKyAxIDogKHdXZWVrRGF5ID8gd1dlZWtEYXkgOiA3KSk7CisgICAgfSBlbHNlIGlmIChzeW1ib2wgPT0gTCJFRUUiIHx8IHN5bWJvbCA9PSBMIkVFRUUiKSB7CisgICAgICB3c1Jlc3VsdCArPQorICAgICAgICAgIHBMb2NhbGUtPkdldERheU5hbWUoR2V0V2Vla0RheSh5ZWFyLCBtb250aCwgZGF5KSwgc3ltYm9sID09IEwiRUVFIik7CisgICAgfSBlbHNlIGlmIChzeW1ib2wgPT0gTCJHIikgeworICAgICAgd3NSZXN1bHQgKz0gcExvY2FsZS0+R2V0RXJhTmFtZSh5ZWFyID4gMCk7CisgICAgfSBlbHNlIGlmIChzeW1ib2wgPT0gTCJZWSIpIHsKKyAgICAgIHdzUmVzdWx0ICs9IE51bVRvU3RyaW5nKDIsIHllYXIgJSAxMDApOworICAgIH0gZWxzZSBpZiAoc3ltYm9sID09IEwiWVlZWSIpIHsKKyAgICAgIHdzUmVzdWx0ICs9IE51bVRvU3RyaW5nKDEsIHllYXIpOworICAgIH0gZWxzZSBpZiAoc3ltYm9sID09IEwidyIpIHsKKyAgICAgIHdzUmVzdWx0ICs9IE51bVRvU3RyaW5nKDEsIEdldFdlZWtPZk1vbnRoKHllYXIsIG1vbnRoLCBkYXkpKTsKKyAgICB9IGVsc2UgaWYgKHN5bWJvbCA9PSBMIldXIikgeworICAgICAgd3NSZXN1bHQgKz0gTnVtVG9TdHJpbmcoMiwgR2V0V2Vla09mWWVhcih5ZWFyLCBtb250aCwgZGF5KSk7CisgICAgfQorICB9CisgIHJldHVybiB3c1Jlc3VsdDsKK30KKworV2lkZVN0cmluZyBUaW1lRm9ybWF0KGNvbnN0IFdpZGVTdHJpbmcmIHdzVGltZVBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRGF0ZVRpbWUmIGRhdGV0aW1lKSB7CisgIFdpZGVTdHJpbmcgd3NSZXN1bHQ7CisgIHVpbnQ4X3QgaG91ciA9IGRhdGV0aW1lLkdldEhvdXIoKTsKKyAgdWludDhfdCBtaW51dGUgPSBkYXRldGltZS5HZXRNaW51dGUoKTsKKyAgdWludDhfdCBzZWNvbmQgPSBkYXRldGltZS5HZXRTZWNvbmQoKTsKKyAgdWludDE2X3QgbWlsbGlzZWNvbmQgPSBkYXRldGltZS5HZXRNaWxsaXNlY29uZCgpOworICBpbnQzMl90IGNjZiA9IDA7CisgIGNvbnN0IHdjaGFyX3QqIHN0cmYgPSB3c1RpbWVQYXR0ZXJuLmNfc3RyKCk7CisgIGludDMyX3QgbGVuZiA9IHdzVGltZVBhdHRlcm4uR2V0TGVuZ3RoKCk7CisgIHVpbnQxNl90IHdIb3VyID0gaG91cjsKKyAgYm9vbCBiUE0gPSBmYWxzZTsKKyAgaWYgKHdzVGltZVBhdHRlcm4uQ29udGFpbnMoJ0EnKSkgeworICAgIGlmICh3SG91ciA+PSAxMikKKyAgICAgIGJQTSA9IHRydWU7CisgIH0KKworICBXaWRlU3RyaW5nVmlldyB3c1RpbWVTeW1ib2xzKGdzX3dzVGltZVN5bWJvbHMpOworICB3aGlsZSAoY2NmIDwgbGVuZikgeworICAgIGlmIChzdHJmW2NjZl0gPT0gJ1wnJykgeworICAgICAgd3NSZXN1bHQgKz0gR2V0TGl0ZXJhbFRleHQoc3RyZiwgJmNjZiwgbGVuZik7CisgICAgICBjY2YrKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoIXdzVGltZVN5bWJvbHMuQ29udGFpbnMoc3RyZltjY2ZdKSkgeworICAgICAgd3NSZXN1bHQgKz0gc3RyZltjY2YrK107CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBXaWRlU3RyaW5nIHN5bWJvbDsKKyAgICBzeW1ib2wuUmVzZXJ2ZSg0KTsKKyAgICBzeW1ib2wgKz0gc3RyZltjY2YrK107CisgICAgd2hpbGUgKGNjZiA8IGxlbmYgJiYgc3RyZltjY2ZdID09IHN5bWJvbFswXSkKKyAgICAgIHN5bWJvbCArPSBzdHJmW2NjZisrXTsKKworICAgIGlmIChzeW1ib2wgPT0gTCJoIiB8fCBzeW1ib2wgPT0gTCJoaCIpIHsKKyAgICAgIGlmICh3SG91ciA+IDEyKQorICAgICAgICB3SG91ciAtPSAxMjsKKyAgICAgIHdzUmVzdWx0ICs9IE51bVRvU3RyaW5nKHN5bWJvbC5HZXRMZW5ndGgoKSwgd0hvdXIgPT0gMCA/IDEyIDogd0hvdXIpOworICAgIH0gZWxzZSBpZiAoc3ltYm9sID09IEwiSyIgfHwgc3ltYm9sID09IEwiS0siKSB7CisgICAgICB3c1Jlc3VsdCArPSBOdW1Ub1N0cmluZyhzeW1ib2wuR2V0TGVuZ3RoKCksIHdIb3VyID09IDAgPyAyNCA6IHdIb3VyKTsKKyAgICB9IGVsc2UgaWYgKHN5bWJvbCA9PSBMImsiIHx8IHN5bWJvbCA9PSBMImtrIikgeworICAgICAgaWYgKHdIb3VyID4gMTIpCisgICAgICAgIHdIb3VyIC09IDEyOworICAgICAgd3NSZXN1bHQgKz0gTnVtVG9TdHJpbmcoc3ltYm9sLkdldExlbmd0aCgpLCB3SG91cik7CisgICAgfSBlbHNlIGlmIChzeW1ib2wgPT0gTCJIIiB8fCBzeW1ib2wgPT0gTCJISCIpIHsKKyAgICAgIHdzUmVzdWx0ICs9IE51bVRvU3RyaW5nKHN5bWJvbC5HZXRMZW5ndGgoKSwgd0hvdXIpOworICAgIH0gZWxzZSBpZiAoc3ltYm9sID09IEwiTSIgfHwgc3ltYm9sID09IEwiTU0iKSB7CisgICAgICB3c1Jlc3VsdCArPSBOdW1Ub1N0cmluZyhzeW1ib2wuR2V0TGVuZ3RoKCksIG1pbnV0ZSk7CisgICAgfSBlbHNlIGlmIChzeW1ib2wgPT0gTCJTIiB8fCBzeW1ib2wgPT0gTCJTUyIpIHsKKyAgICAgIHdzUmVzdWx0ICs9IE51bVRvU3RyaW5nKHN5bWJvbC5HZXRMZW5ndGgoKSwgc2Vjb25kKTsKKyAgICB9IGVsc2UgaWYgKHN5bWJvbCA9PSBMIkZGRiIpIHsKKyAgICAgIHdzUmVzdWx0ICs9IE51bVRvU3RyaW5nKDMsIG1pbGxpc2Vjb25kKTsKKyAgICB9IGVsc2UgaWYgKHN5bWJvbCA9PSBMIkEiKSB7CisgICAgICB3c1Jlc3VsdCArPSBwTG9jYWxlLT5HZXRNZXJpZGllbU5hbWUoIWJQTSk7CisgICAgfSBlbHNlIGlmIChzeW1ib2wgPT0gTCJaIiB8fCBzeW1ib2wgPT0gTCJ6IikgeworICAgICAgaWYgKHN5bWJvbCA9PSBMIloiKQorICAgICAgICB3c1Jlc3VsdCArPSBMIkdNVCI7CisKKyAgICAgIEZYX1RJTUVaT05FIHR6ID0gcExvY2FsZS0+R2V0VGltZVpvbmUoKTsKKyAgICAgIGlmICh0ei50ekhvdXIgIT0gMCB8fCB0ei50ek1pbnV0ZSAhPSAwKSB7CisgICAgICAgIHdzUmVzdWx0ICs9IHR6LnR6SG91ciA8IDAgPyBMIi0iIDogTCIrIjsKKyAgICAgICAgd3NSZXN1bHQgKz0KKyAgICAgICAgICAgIFdpZGVTdHJpbmc6OkZvcm1hdChMIiUwMmQ6JTAyZCIsIGFicyh0ei50ekhvdXIpLCB0ei50ek1pbnV0ZSk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB3c1Jlc3VsdDsKK30KKworV2lkZVN0cmluZyBGb3JtYXREYXRlVGltZUludGVybmFsKGNvbnN0IENGWF9EYXRlVGltZSYgZHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NEYXRlUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c1RpbWVQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkRhdGVGaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlKSB7CisgIFdpZGVTdHJpbmcgd3NEYXRlT3V0OworICBpZiAoIXdzRGF0ZVBhdHRlcm4uSXNFbXB0eSgpKQorICAgIHdzRGF0ZU91dCA9IERhdGVGb3JtYXQod3NEYXRlUGF0dGVybiwgcExvY2FsZSwgZHQpOworCisgIFdpZGVTdHJpbmcgd3NUaW1lT3V0OworICBpZiAoIXdzVGltZVBhdHRlcm4uSXNFbXB0eSgpKQorICAgIHdzVGltZU91dCA9IFRpbWVGb3JtYXQod3NUaW1lUGF0dGVybiwgcExvY2FsZSwgZHQpOworCisgIHJldHVybiBiRGF0ZUZpcnN0ID8gd3NEYXRlT3V0ICsgd3NUaW1lT3V0IDogd3NUaW1lT3V0ICsgd3NEYXRlT3V0OworfQorCit9ICAvLyBuYW1lc3BhY2UKKworYm9vbCBGWF9EYXRlRnJvbUNhbm9uaWNhbChjb25zdCBXaWRlU3RyaW5nJiB3c0RhdGUsIENGWF9EYXRlVGltZSogZGF0ZXRpbWUpIHsKKyAgY29uc3Qgd2NoYXJfdCogc3RyID0gd3NEYXRlLmNfc3RyKCk7CisgIGludCBsZW4gPSB3c0RhdGUuR2V0TGVuZ3RoKCk7CisgIGlmIChsZW4gPiAxMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW50IGNjID0gMDsKKyAgdWludDMyX3QgeWVhciA9IDA7CisgIGlmICghRXh0cmFjdENvdW50RGlnaXRzKHN0ciwgbGVuLCA0LCAmY2MsICZ5ZWFyKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICh5ZWFyIDwgMTkwMCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChjYyA+PSBsZW4pIHsKKyAgICBkYXRldGltZS0+U2V0RGF0ZSh5ZWFyLCAxLCAxKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGlmIChzdHJbY2NdID09ICctJykKKyAgICBjYysrOworCisgIHVpbnQzMl90IG1vbnRoID0gMDsKKyAgaWYgKCFFeHRyYWN0Q291bnREaWdpdHMoc3RyLCBsZW4sIDIsICZjYywgJm1vbnRoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChtb250aCA+IDEyIHx8IG1vbnRoIDwgMSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChjYyA+PSBsZW4pIHsKKyAgICBkYXRldGltZS0+U2V0RGF0ZSh5ZWFyLCBtb250aCwgMSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpZiAoc3RyW2NjXSA9PSAnLScpCisgICAgY2MrKzsKKworICB1aW50MzJfdCBkYXkgPSAwOworICBpZiAoIUV4dHJhY3RDb3VudERpZ2l0cyhzdHIsIGxlbiwgMiwgJmNjLCAmZGF5KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChkYXkgPCAxKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKChNb250aEhhczMxRGF5cyhtb250aCkgJiYgZGF5ID4gMzEpIHx8CisgICAgICAoTW9udGhIYXMzMERheXMobW9udGgpICYmIGRheSA+IDMwKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAobW9udGggPT0gMiAmJiBkYXkgPiAoSXNMZWFwWWVhcih5ZWFyKSA/IDI5VSA6IDI4VSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGRhdGV0aW1lLT5TZXREYXRlKHllYXIsIG1vbnRoLCBkYXkpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBGWF9UaW1lRnJvbUNhbm9uaWNhbChjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRGF0ZVRpbWUqIGRhdGV0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlKSB7CisgIGlmICh3c1RpbWUuR2V0TGVuZ3RoKCkgPT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY29uc3Qgd2NoYXJfdCogc3RyID0gd3NUaW1lLnVudGVybWluYXRlZF9jX3N0cigpOworICBpbnQgbGVuID0gd3NUaW1lLkdldExlbmd0aCgpOworCisgIGludCBjYyA9IDA7CisgIHVpbnQzMl90IGhvdXIgPSAwOworICBpZiAoIUV4dHJhY3RDb3VudERpZ2l0cyhzdHIsIGxlbiwgMiwgJmNjLCAmaG91cikpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoaG91ciA+PSAyNCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChjYyA+PSBsZW4pIHsKKyAgICBkYXRldGltZS0+U2V0VGltZShob3VyLCAwLCAwLCAwKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGlmIChzdHJbY2NdID09ICc6JykKKyAgICBjYysrOworCisgIHVpbnQzMl90IG1pbnV0ZSA9IDA7CisgIGlmICghRXh0cmFjdENvdW50RGlnaXRzKHN0ciwgbGVuLCAyLCAmY2MsICZtaW51dGUpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKG1pbnV0ZSA+PSA2MCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGNjID49IGxlbikgeworICAgIGRhdGV0aW1lLT5TZXRUaW1lKGhvdXIsIG1pbnV0ZSwgMCwgMCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBpZiAoc3RyW2NjXSA9PSAnOicpCisgICAgY2MrKzsKKworICB1aW50MzJfdCBzZWNvbmQgPSAwOworICB1aW50MzJfdCBtaWxsaXNlY29uZCA9IDA7CisgIGlmIChzdHJbY2NdICE9ICdaJykgeworICAgIGlmICghRXh0cmFjdENvdW50RGlnaXRzKHN0ciwgbGVuLCAyLCAmY2MsICZzZWNvbmQpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzZWNvbmQgPj0gNjApCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGNjIDwgbGVuICYmIHN0cltjY10gPT0gJy4nKSB7CisgICAgICBjYysrOworICAgICAgaWYgKCFFeHRyYWN0Q291bnREaWdpdHMoc3RyLCBsZW4sIDMsICZjYywgJm1pbGxpc2Vjb25kKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vIFNraXAgdW50aWwgd2UgZmluZCBhICsgb3IgLSBmb3IgdGhlIHRpbWUgem9uZS4KKyAgd2hpbGUgKGNjIDwgbGVuKSB7CisgICAgaWYgKHN0cltjY10gPT0gJysnIHx8IHN0cltjY10gPT0gJy0nKQorICAgICAgYnJlYWs7CisgICAgKytjYzsKKyAgfQorCisgIGlmIChjYyA8IGxlbikgeworICAgIEZYX1RJTUVaT05FIHR6RGlmZjsKKyAgICB0ekRpZmYudHpIb3VyID0gMDsKKyAgICB0ekRpZmYudHpNaW51dGUgPSAwOworICAgIGlmIChzdHJbY2NdICE9ICdaJykKKyAgICAgIGNjICs9IFBhcnNlVGltZVpvbmUoc3RyICsgY2MsIGxlbiAtIGNjLCAmdHpEaWZmKTsKKworICAgIFJlc29sdmVab25lKHR6RGlmZiwgcExvY2FsZSwgJmhvdXIsICZtaW51dGUpOworICB9CisKKyAgZGF0ZXRpbWUtPlNldFRpbWUoaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0NGR0FTX0Zvcm1hdFN0cmluZzo6Q0ZHQVNfRm9ybWF0U3RyaW5nKENYRkFfTG9jYWxlTWdyKiBwTG9jYWxlTWdyKQorICAgIDogbV9wTG9jYWxlTWdyKHBMb2NhbGVNZ3IpIHt9CisKK0NGR0FTX0Zvcm1hdFN0cmluZzo6fkNGR0FTX0Zvcm1hdFN0cmluZygpIHt9CisKK3ZvaWQgQ0ZHQVNfRm9ybWF0U3RyaW5nOjpTcGxpdEZvcm1hdFN0cmluZygKKyAgICBjb25zdCBXaWRlU3RyaW5nJiB3c0Zvcm1hdFN0cmluZywKKyAgICBzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nPiogd3NQYXR0ZXJucykgeworICBpbnQzMl90IGlTdHJMZW4gPSB3c0Zvcm1hdFN0cmluZy5HZXRMZW5ndGgoKTsKKyAgY29uc3Qgd2NoYXJfdCogcFN0ciA9IHdzRm9ybWF0U3RyaW5nLmNfc3RyKCk7CisgIGNvbnN0IHdjaGFyX3QqIHBUb2tlbiA9IHBTdHI7CisgIGNvbnN0IHdjaGFyX3QqIHBFbmQgPSBwU3RyICsgaVN0ckxlbjsKKyAgYm9vbCBpUXVvdGUgPSBmYWxzZTsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAocFN0ciA+PSBwRW5kKSB7CisgICAgICB3c1BhdHRlcm5zLT5wdXNoX2JhY2soV2lkZVN0cmluZyhwVG9rZW4sIHBTdHIgLSBwVG9rZW4pKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCpwU3RyID09ICdcJycpIHsKKyAgICAgIGlRdW90ZSA9ICFpUXVvdGU7CisgICAgfSBlbHNlIGlmICgqcFN0ciA9PSBMJ3wnICYmICFpUXVvdGUpIHsKKyAgICAgIHdzUGF0dGVybnMtPnB1c2hfYmFjayhXaWRlU3RyaW5nKHBUb2tlbiwgcFN0ciAtIHBUb2tlbikpOworICAgICAgcFRva2VuID0gcFN0ciArIDE7CisgICAgfQorICAgIHBTdHIrKzsKKyAgfQorfQorCitGWF9MT0NBTEVDQVRFR09SWSBDRkdBU19Gb3JtYXRTdHJpbmc6OkdldENhdGVnb3J5KGNvbnN0IFdpZGVTdHJpbmcmIHdzUGF0dGVybikgeworICBGWF9MT0NBTEVDQVRFR09SWSBlQ2F0ZWdvcnkgPSBGWF9MT0NBTEVDQVRFR09SWV9Vbmtub3duOworICBpbnQzMl90IGNjZiA9IDA7CisgIGludDMyX3QgaUxlbmYgPSB3c1BhdHRlcm4uR2V0TGVuZ3RoKCk7CisgIGNvbnN0IHdjaGFyX3QqIHBTdHIgPSB3c1BhdHRlcm4uY19zdHIoKTsKKyAgYm9vbCBiQnJhY2VPcGVuID0gZmFsc2U7CisgIFdpZGVTdHJpbmdWaWV3IHdzQ29uc3RDaGFycyhnc193c0NvbnN0Q2hhcnMpOworICB3aGlsZSAoY2NmIDwgaUxlbmYpIHsKKyAgICBpZiAocFN0cltjY2ZdID09ICdcJycpIHsKKyAgICAgIEdldExpdGVyYWxUZXh0KHBTdHIsICZjY2YsIGlMZW5mKTsKKyAgICB9IGVsc2UgaWYgKCFiQnJhY2VPcGVuICYmICF3c0NvbnN0Q2hhcnMuQ29udGFpbnMocFN0cltjY2ZdKSkgeworICAgICAgV2lkZVN0cmluZyB3c0NhdGVnb3J5KHBTdHJbY2NmXSk7CisgICAgICBjY2YrKzsKKyAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChjY2YgPT0gaUxlbmYpCisgICAgICAgICAgcmV0dXJuIGVDYXRlZ29yeTsKKyAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAnLicgfHwgcFN0cltjY2ZdID09ICcoJykKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAneycpIHsKKyAgICAgICAgICBiQnJhY2VPcGVuID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB3c0NhdGVnb3J5ICs9IHBTdHJbY2NmXTsKKyAgICAgICAgY2NmKys7CisgICAgICB9CisKKyAgICAgIHVpbnQzMl90IGR3SGFzaCA9IEZYX0hhc2hDb2RlX0dldFcod3NDYXRlZ29yeS5Bc1N0cmluZ1ZpZXcoKSwgZmFsc2UpOworICAgICAgaWYgKGR3SGFzaCA9PSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZUhhc2gpCisgICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZTsKKyAgICAgIGlmIChkd0hhc2ggPT0gRlhfTE9DQUxFQ0FURUdPUllfVGV4dEhhc2gpCisgICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9UZXh0OworICAgICAgaWYgKGR3SGFzaCA9PSBGWF9MT0NBTEVDQVRFR09SWV9OdW1IYXNoKQorICAgICAgICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfTnVtOworICAgICAgaWYgKGR3SGFzaCA9PSBGWF9MT0NBTEVDQVRFR09SWV9aZXJvSGFzaCkKKyAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX1plcm87CisgICAgICBpZiAoZHdIYXNoID09IEZYX0xPQ0FMRUNBVEVHT1JZX051bGxIYXNoKQorICAgICAgICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfTnVsbDsKKyAgICAgIGlmIChkd0hhc2ggPT0gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZUhhc2gpIHsKKyAgICAgICAgaWYgKGVDYXRlZ29yeSA9PSBGWF9MT0NBTEVDQVRFR09SWV9UaW1lKQorICAgICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZTsKKyAgICAgICAgZUNhdGVnb3J5ID0gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZTsKKyAgICAgIH0gZWxzZSBpZiAoZHdIYXNoID09IEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWVIYXNoKSB7CisgICAgICAgIGlmIChlQ2F0ZWdvcnkgPT0gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZSkKKyAgICAgICAgICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWU7CisgICAgICAgIGVDYXRlZ29yeSA9IEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWU7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gPT0gJ30nKSB7CisgICAgICBiQnJhY2VPcGVuID0gZmFsc2U7CisgICAgfQorICAgIGNjZisrOworICB9CisgIHJldHVybiBlQ2F0ZWdvcnk7Cit9CisKK1dpZGVTdHJpbmcgQ0ZHQVNfRm9ybWF0U3RyaW5nOjpHZXRUZXh0Rm9ybWF0KGNvbnN0IFdpZGVTdHJpbmcmIHdzUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c0NhdGVnb3J5KSB7CisgIGludDMyX3QgY2NmID0gMDsKKyAgaW50MzJfdCBpTGVuZiA9IHdzUGF0dGVybi5HZXRMZW5ndGgoKTsKKyAgY29uc3Qgd2NoYXJfdCogcFN0ciA9IHdzUGF0dGVybi5jX3N0cigpOworICBib29sIGJCcmFja09wZW4gPSBmYWxzZTsKKyAgV2lkZVN0cmluZ1ZpZXcgd3NDb25zdENoYXJzKGdzX3dzQ29uc3RDaGFycyk7CisgIFdpZGVTdHJpbmcgd3NQdXJnZVBhdHRlcm47CisgIHdoaWxlIChjY2YgPCBpTGVuZikgeworICAgIGlmIChwU3RyW2NjZl0gPT0gJ1wnJykgeworICAgICAgaW50MzJfdCBpQ3VyQ2hhciA9IGNjZjsKKyAgICAgIEdldExpdGVyYWxUZXh0KHBTdHIsICZjY2YsIGlMZW5mKTsKKyAgICAgIHdzUHVyZ2VQYXR0ZXJuICs9IFdpZGVTdHJpbmdWaWV3KHBTdHIgKyBpQ3VyQ2hhciwgY2NmIC0gaUN1ckNoYXIgKyAxKTsKKyAgICB9IGVsc2UgaWYgKCFiQnJhY2tPcGVuICYmICF3c0NvbnN0Q2hhcnMuQ29udGFpbnMocFN0cltjY2ZdKSkgeworICAgICAgV2lkZVN0cmluZyB3c1NlYXJjaENhdGVnb3J5KHBTdHJbY2NmXSk7CisgICAgICBjY2YrKzsKKyAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJ3snICYmIHBTdHJbY2NmXSAhPSAnLicgJiYKKyAgICAgICAgICAgICBwU3RyW2NjZl0gIT0gJygnKSB7CisgICAgICAgIHdzU2VhcmNoQ2F0ZWdvcnkgKz0gcFN0cltjY2ZdOworICAgICAgICBjY2YrKzsKKyAgICAgIH0KKyAgICAgIGlmICh3c1NlYXJjaENhdGVnb3J5ICE9IHdzQ2F0ZWdvcnkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYpIHsKKyAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAnKCcpIHsKKyAgICAgICAgICBjY2YrKzsKKyAgICAgICAgICAvLyBTa2lwIG92ZXIgdGhlIGVuY29kaW5nIG5hbWUuCisgICAgICAgICAgd2hpbGUgKGNjZiA8IGlMZW5mICYmIHBTdHJbY2NmXSAhPSAnKScpCisgICAgICAgICAgICBjY2YrKzsKKyAgICAgICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gPT0gJ3snKSB7CisgICAgICAgICAgYkJyYWNrT3BlbiA9IHRydWU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2NmKys7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gIT0gJ30nKSB7CisgICAgICB3c1B1cmdlUGF0dGVybiArPSBwU3RyW2NjZl07CisgICAgfQorICAgIGNjZisrOworICB9CisgIGlmICghYkJyYWNrT3BlbikKKyAgICB3c1B1cmdlUGF0dGVybiA9IHdzUGF0dGVybjsKKworICByZXR1cm4gd3NQdXJnZVBhdHRlcm47Cit9CisKK0lGWF9Mb2NhbGUqIENGR0FTX0Zvcm1hdFN0cmluZzo6R2V0TnVtZXJpY0Zvcm1hdChjb25zdCBXaWRlU3RyaW5nJiB3c1BhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogaURvdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkd1N0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcqIHdzUHVyZ2VQYXR0ZXJuKSB7CisgICpkd1N0eWxlID0gMDsKKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9IG51bGxwdHI7CisgIGludDMyX3QgY2NmID0gMDsKKyAgaW50MzJfdCBpTGVuZiA9IHdzUGF0dGVybi5HZXRMZW5ndGgoKTsKKyAgY29uc3Qgd2NoYXJfdCogcFN0ciA9IHdzUGF0dGVybi5jX3N0cigpOworICBib29sIGJGaW5kRG90ID0gZmFsc2U7CisgIGJvb2wgYkJyYWNrT3BlbiA9IGZhbHNlOworICBXaWRlU3RyaW5nVmlldyB3c0NvbnN0Q2hhcnMoZ3Nfd3NDb25zdENoYXJzKTsKKyAgd2hpbGUgKGNjZiA8IGlMZW5mKSB7CisgICAgaWYgKHBTdHJbY2NmXSA9PSAnXCcnKSB7CisgICAgICBpbnQzMl90IGlDdXJDaGFyID0gY2NmOworICAgICAgR2V0TGl0ZXJhbFRleHQocFN0ciwgJmNjZiwgaUxlbmYpOworICAgICAgKndzUHVyZ2VQYXR0ZXJuICs9IFdpZGVTdHJpbmdWaWV3KHBTdHIgKyBpQ3VyQ2hhciwgY2NmIC0gaUN1ckNoYXIgKyAxKTsKKyAgICB9IGVsc2UgaWYgKCFiQnJhY2tPcGVuICYmICF3c0NvbnN0Q2hhcnMuQ29udGFpbnMocFN0cltjY2ZdKSkgeworICAgICAgV2lkZVN0cmluZyB3c0NhdGVnb3J5KHBTdHJbY2NmXSk7CisgICAgICBjY2YrKzsKKyAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJ3snICYmIHBTdHJbY2NmXSAhPSAnLicgJiYKKyAgICAgICAgICAgICBwU3RyW2NjZl0gIT0gJygnKSB7CisgICAgICAgIHdzQ2F0ZWdvcnkgKz0gcFN0cltjY2ZdOworICAgICAgICBjY2YrKzsKKyAgICAgIH0KKyAgICAgIGlmICh3c0NhdGVnb3J5ICE9IEwibnVtIikgeworICAgICAgICBiQnJhY2tPcGVuID0gdHJ1ZTsKKyAgICAgICAgY2NmID0gMDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYpIHsKKyAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAneycpIHsKKyAgICAgICAgICBiQnJhY2tPcGVuID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAocFN0cltjY2ZdID09ICcoJykgeworICAgICAgICAgIGNjZisrOworICAgICAgICAgIFdpZGVTdHJpbmcgd3NMQ0lEOworICAgICAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJyknKQorICAgICAgICAgICAgd3NMQ0lEICs9IHBTdHJbY2NmKytdOworCisgICAgICAgICAgcExvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0TG9jYWxlQnlOYW1lKHdzTENJRCk7CisgICAgICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdID09ICcuJykgeworICAgICAgICAgIFdpZGVTdHJpbmcgd3NTdWJDYXRlZ29yeTsKKyAgICAgICAgICBjY2YrKzsKKyAgICAgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYgJiYgcFN0cltjY2ZdICE9ICcoJyAmJiBwU3RyW2NjZl0gIT0gJ3snKQorICAgICAgICAgICAgd3NTdWJDYXRlZ29yeSArPSBwU3RyW2NjZisrXTsKKworICAgICAgICAgIHVpbnQzMl90IGR3U3ViSGFzaCA9CisgICAgICAgICAgICAgIEZYX0hhc2hDb2RlX0dldFcod3NTdWJDYXRlZ29yeS5Bc1N0cmluZ1ZpZXcoKSwgZmFsc2UpOworICAgICAgICAgIEZYX0xPQ0FMRU5VTVNVQkNBVEVHT1JZIGVTdWJDYXRlZ29yeSA9IEZYX0xPQ0FMRU5VTVBBVFRFUk5fRGVjaW1hbDsKKyAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBnX2lGWExvY2FsZU51bVN1YkNhdENvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChnX0ZYTG9jYWxlTnVtU3ViQ2F0RGF0YVtpXS51SGFzaCA9PSBkd1N1Ykhhc2gpIHsKKyAgICAgICAgICAgICAgZVN1YkNhdGVnb3J5ID0gKEZYX0xPQ0FMRU5VTVNVQkNBVEVHT1JZKWdfRlhMb2NhbGVOdW1TdWJDYXREYXRhW2ldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZVN1YkNhdGVnb3J5OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFwTG9jYWxlKQorICAgICAgICAgICAgcExvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7CisKKyAgICAgICAgICBBU1NFUlQocExvY2FsZSk7CisKKyAgICAgICAgICB3c1N1YkNhdGVnb3J5ID0gcExvY2FsZS0+R2V0TnVtUGF0dGVybihlU3ViQ2F0ZWdvcnkpOworICAgICAgICAgIGF1dG8gcmVzdWx0ID0gd3NTdWJDYXRlZ29yeS5GaW5kKCcuJyk7CisgICAgICAgICAgaWYgKHJlc3VsdC5oYXNfdmFsdWUoKSAmJiByZXN1bHQudmFsdWUoKSAhPSAwKSB7CisgICAgICAgICAgICAqaURvdEluZGV4ICs9IHdzUHVyZ2VQYXR0ZXJuLT5HZXRMZW5ndGgoKTsKKyAgICAgICAgICAgIGJGaW5kRG90ID0gdHJ1ZTsKKyAgICAgICAgICAgICpkd1N0eWxlIHw9IEZYX05VTVNUWUxFX0RvdFZvcnY7CisgICAgICAgICAgfQorICAgICAgICAgICp3c1B1cmdlUGF0dGVybiArPSB3c1N1YkNhdGVnb3J5OworICAgICAgICAgIGlmIChlU3ViQ2F0ZWdvcnkgPT0gRlhfTE9DQUxFTlVNUEFUVEVSTl9QZXJjZW50KQorICAgICAgICAgICAgKmR3U3R5bGUgfD0gRlhfTlVNU1RZTEVfUGVyY2VudDsKKworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNjZisrOworICAgICAgfQorICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdID09ICdFJykgeworICAgICAgKmR3U3R5bGUgfD0gRlhfTlVNU1RZTEVfRXhwb25lbnQ7CisgICAgICAqd3NQdXJnZVBhdHRlcm4gKz0gcFN0cltjY2ZdOworICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdID09ICclJykgeworICAgICAgKmR3U3R5bGUgfD0gRlhfTlVNU1RZTEVfUGVyY2VudDsKKyAgICAgICp3c1B1cmdlUGF0dGVybiArPSBwU3RyW2NjZl07CisgICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gIT0gJ30nKSB7CisgICAgICAqd3NQdXJnZVBhdHRlcm4gKz0gcFN0cltjY2ZdOworICAgIH0KKyAgICBpZiAoIWJGaW5kRG90KSB7CisgICAgICBpZiAocFN0cltjY2ZdID09ICcuJyB8fCBwU3RyW2NjZl0gPT0gJ1YnIHx8IHBTdHJbY2NmXSA9PSAndicpIHsKKyAgICAgICAgYkZpbmREb3QgPSB0cnVlOworICAgICAgICAqaURvdEluZGV4ID0gd3NQdXJnZVBhdHRlcm4tPkdldExlbmd0aCgpIC0gMTsKKyAgICAgICAgKmR3U3R5bGUgfD0gRlhfTlVNU1RZTEVfRG90Vm9ydjsKKyAgICAgIH0KKyAgICB9CisgICAgY2NmKys7CisgIH0KKyAgaWYgKCFiRmluZERvdCkKKyAgICAqaURvdEluZGV4ID0gd3NQdXJnZVBhdHRlcm4tPkdldExlbmd0aCgpOworICBpZiAoIXBMb2NhbGUpCisgICAgcExvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7CisgIHJldHVybiBwTG9jYWxlOworfQorCitib29sIENGR0FTX0Zvcm1hdFN0cmluZzo6UGFyc2VUZXh0KGNvbnN0IFdpZGVTdHJpbmcmIHdzU3JjVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nKiB3c1ZhbHVlKSB7CisgIHdzVmFsdWUtPmNsZWFyKCk7CisgIGlmICh3c1NyY1RleHQuSXNFbXB0eSgpIHx8IHdzUGF0dGVybi5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIFdpZGVTdHJpbmcgd3NUZXh0Rm9ybWF0ID0gR2V0VGV4dEZvcm1hdCh3c1BhdHRlcm4sIEwidGV4dCIpOworICBpZiAod3NUZXh0Rm9ybWF0LklzRW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW50MzJfdCBpVGV4dCA9IDA7CisgIGludDMyX3QgaVBhdHRlcm4gPSAwOworICBjb25zdCB3Y2hhcl90KiBwU3RyVGV4dCA9IHdzU3JjVGV4dC5jX3N0cigpOworICBpbnQzMl90IGlMZW5UZXh0ID0gd3NTcmNUZXh0LkdldExlbmd0aCgpOworICBjb25zdCB3Y2hhcl90KiBwU3RyUGF0dGVybiA9IHdzVGV4dEZvcm1hdC5jX3N0cigpOworICBpbnQzMl90IGlMZW5QYXR0ZXJuID0gd3NUZXh0Rm9ybWF0LkdldExlbmd0aCgpOworICB3aGlsZSAoaVBhdHRlcm4gPCBpTGVuUGF0dGVybiAmJiBpVGV4dCA8IGlMZW5UZXh0KSB7CisgICAgc3dpdGNoIChwU3RyUGF0dGVybltpUGF0dGVybl0pIHsKKyAgICAgIGNhc2UgJ1wnJzogeworICAgICAgICBXaWRlU3RyaW5nIHdzTGl0ZXJhbCA9CisgICAgICAgICAgICBHZXRMaXRlcmFsVGV4dChwU3RyUGF0dGVybiwgJmlQYXR0ZXJuLCBpTGVuUGF0dGVybik7CisgICAgICAgIGludDMyX3QgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7CisgICAgICAgIGlmIChpVGV4dCArIGlMaXRlcmFsTGVuID4gaUxlblRleHQgfHwKKyAgICAgICAgICAgIHdjc25jbXAocFN0clRleHQgKyBpVGV4dCwgd3NMaXRlcmFsLmNfc3RyKCksIGlMaXRlcmFsTGVuKSkgeworICAgICAgICAgICp3c1ZhbHVlID0gd3NTcmNUZXh0OworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpVGV4dCArPSBpTGl0ZXJhbExlbjsKKyAgICAgICAgaVBhdHRlcm4rKzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICdBJzoKKyAgICAgICAgaWYgKEZYU1lTX2lzd2FscGhhKHBTdHJUZXh0W2lUZXh0XSkpIHsKKyAgICAgICAgICAqd3NWYWx1ZSArPSBwU3RyVGV4dFtpVGV4dF07CisgICAgICAgICAgaVRleHQrKzsKKyAgICAgICAgfQorICAgICAgICBpUGF0dGVybisrOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1gnOgorICAgICAgICAqd3NWYWx1ZSArPSBwU3RyVGV4dFtpVGV4dF07CisgICAgICAgIGlUZXh0Kys7CisgICAgICAgIGlQYXR0ZXJuKys7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnTyc6CisgICAgICBjYXNlICcwJzoKKyAgICAgICAgaWYgKEZYU1lTX2lzRGVjaW1hbERpZ2l0KHBTdHJUZXh0W2lUZXh0XSkgfHwKKyAgICAgICAgICAgIEZYU1lTX2lzd2FscGhhKHBTdHJUZXh0W2lUZXh0XSkpIHsKKyAgICAgICAgICAqd3NWYWx1ZSArPSBwU3RyVGV4dFtpVGV4dF07CisgICAgICAgICAgaVRleHQrKzsKKyAgICAgICAgfQorICAgICAgICBpUGF0dGVybisrOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJzknOgorICAgICAgICBpZiAoRlhTWVNfaXNEZWNpbWFsRGlnaXQocFN0clRleHRbaVRleHRdKSkgeworICAgICAgICAgICp3c1ZhbHVlICs9IHBTdHJUZXh0W2lUZXh0XTsKKyAgICAgICAgICBpVGV4dCsrOworICAgICAgICB9CisgICAgICAgIGlQYXR0ZXJuKys7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSAhPSBwU3RyVGV4dFtpVGV4dF0pIHsKKyAgICAgICAgICAqd3NWYWx1ZSA9IHdzU3JjVGV4dDsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaVBhdHRlcm4rKzsKKyAgICAgICAgaVRleHQrKzsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBpUGF0dGVybiA9PSBpTGVuUGF0dGVybiAmJiBpVGV4dCA9PSBpTGVuVGV4dDsKK30KKworYm9vbCBDRkdBU19Gb3JtYXRTdHJpbmc6OlBhcnNlTnVtKGNvbnN0IFdpZGVTdHJpbmcmIHdzU3JjTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nKiB3c1ZhbHVlKSB7CisgIHdzVmFsdWUtPmNsZWFyKCk7CisgIGlmICh3c1NyY051bS5Jc0VtcHR5KCkgfHwgd3NQYXR0ZXJuLklzRW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW50MzJfdCBkb3RfaW5kZXhfZiA9IC0xOworICB1aW50MzJfdCBkd0Zvcm1hdFN0eWxlID0gMDsKKyAgV2lkZVN0cmluZyB3c051bUZvcm1hdDsKKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9CisgICAgICBHZXROdW1lcmljRm9ybWF0KHdzUGF0dGVybiwgJmRvdF9pbmRleF9mLCAmZHdGb3JtYXRTdHlsZSwgJndzTnVtRm9ybWF0KTsKKyAgaWYgKCFwTG9jYWxlIHx8IHdzTnVtRm9ybWF0LklzRW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW50MzJfdCBpRXhwb25lbnQgPSAwOworICBXaWRlU3RyaW5nIHdzRG90U3ltYm9sID0KKyAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsKTsKKyAgV2lkZVN0cmluZyB3c0dyb3VwU3ltYm9sID0KKyAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9Hcm91cGluZyk7CisgIGludDMyX3QgaUdyb3VwTGVuID0gd3NHcm91cFN5bWJvbC5HZXRMZW5ndGgoKTsKKyAgV2lkZVN0cmluZyB3c01pbnVzID0gcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzKTsKKyAgaW50MzJfdCBpTWludXNMZW4gPSB3c01pbnVzLkdldExlbmd0aCgpOworICBjb25zdCB3Y2hhcl90KiBzdHIgPSB3c1NyY051bS5jX3N0cigpOworICBpbnQgbGVuID0gd3NTcmNOdW0uR2V0TGVuZ3RoKCk7CisgIGNvbnN0IHdjaGFyX3QqIHN0cmYgPSB3c051bUZvcm1hdC5jX3N0cigpOworICBpbnQgbGVuZiA9IHdzTnVtRm9ybWF0LkdldExlbmd0aCgpOworICBib29sIGJIYXZlUGVyY2VudFN5bWJvbCA9IGZhbHNlOworICBib29sIGJOZWcgPSBmYWxzZTsKKyAgYm9vbCBiUmV2ZXJzZVBhcnNlID0gZmFsc2U7CisgIGludDMyX3QgZG90X2luZGV4ID0gMDsKKworICAvLyBJZiB3ZSdyZSBsb29raW5nIGZvciBhICcuJywgJ1YnIG9yICd2JyBhbmQgdGhlIGlucHV0IHN0cmluZyBkb2VzIG5vdAorICAvLyBoYXZlIGEgZG90IGluZGV4IGZvciBvbmUgb2YgdGhvc2UsIHRoZW4gd2UgZGlzYWJsZSBwYXJzaW5nIHRoZSBkZWNpbWFsLgorICBpZiAoIUdldE51bWVyaWNEb3RJbmRleCh3c1NyY051bSwgd3NEb3RTeW1ib2wsICZkb3RfaW5kZXgpICYmCisgICAgICAoZHdGb3JtYXRTdHlsZSAmIEZYX05VTVNUWUxFX0RvdFZvcnYpKQorICAgIGJSZXZlcnNlUGFyc2UgPSB0cnVlOworCisgIC8vIFRoaXMgcGFyc2UgaXMgYnJva2VuIGludG8gdHdvIHBhcnRzIGJhc2VkIG9uIHRoZSAnLicgaW4gdGhlIG51bWJlcgorICAvLyAob3IgJ1YnIG9yICd2JykuIHxkb3RfaW5kZXhfZnwgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBkb3QgaW4gdGhlIGZvcm1hdCBhbmQKKyAgLy8gfGRvdF9pbmRleHwgaXMgdGhlIGxvY2F0aW9uIG9mIHRoZSBkb3QgaW4gdGhlIG51bWJlci4KKyAgLy8KKyAgLy8gVGhpcyBmaXJzdCB3aGlsZSgpIHN0YXJ0cyBhdCB0aGUgJy4nIGFuZCB3YWxrcyBiYWNrd2FyZHMgdG8gdGhlIHN0YXJ0IG9mCisgIC8vIHRoZSBudW1iZXIuIFRoZSBzZWNvbmQgd2hpbGUoKSB3YWxrcyBmcm9tIHRoZSBkb3QgZm9yd2FyZHMgdG8gdGhlIGVuZCBvZgorICAvLyB0aGUgZGVjaW1hbC4KKworICBpbnQgY2NmID0gZG90X2luZGV4X2YgLSAxOworICBpbnQgY2MgPSBkb3RfaW5kZXggLSAxOworICB3aGlsZSAoY2NmID49IDAgJiYgY2MgPj0gMCkgeworICAgIHN3aXRjaCAoc3RyZltjY2ZdKSB7CisgICAgICBjYXNlICdcJyc6IHsKKyAgICAgICAgV2lkZVN0cmluZyB3c0xpdGVyYWwgPSBHZXRMaXRlcmFsVGV4dFJldmVyc2Uoc3RyZiwgJmNjZik7CisgICAgICAgIGludDMyX3QgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7CisgICAgICAgIGNjIC09IGlMaXRlcmFsTGVuIC0gMTsKKyAgICAgICAgaWYgKGNjIDwgMCB8fCB3Y3NuY21wKHN0ciArIGNjLCB3c0xpdGVyYWwuY19zdHIoKSwgaUxpdGVyYWxMZW4pKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBjYy0tOworICAgICAgICBjY2YtLTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICc5JzoKKyAgICAgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgd3NWYWx1ZS0+SW5zZXJ0QXRGcm9udChzdHJbY2NdKTsKKyAgICAgICAgY2MtLTsKKyAgICAgICAgY2NmLS07CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAneic6CisgICAgICBjYXNlICdaJzoKKyAgICAgICAgaWYgKHN0cmZbY2NmXSA9PSAneicgfHwgc3RyW2NjXSAhPSAnICcpIHsKKyAgICAgICAgICBpZiAoRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKKyAgICAgICAgICAgIHdzVmFsdWUtPkluc2VydEF0RnJvbnQoc3RyW2NjXSk7CisgICAgICAgICAgICBjYy0tOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjYy0tOworICAgICAgICB9CisgICAgICAgIGNjZi0tOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1MnOgorICAgICAgY2FzZSAncyc6CisgICAgICAgIGlmIChzdHJbY2NdID09ICcrJyB8fCAoc3RyZltjY2ZdID09ICdTJyAmJiBzdHJbY2NdID09ICcgJykpIHsKKyAgICAgICAgICBjYy0tOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNjIC09IGlNaW51c0xlbiAtIDE7CisgICAgICAgICAgaWYgKGNjIDwgMCB8fCB3Y3NuY21wKHN0ciArIGNjLCB3c01pbnVzLmNfc3RyKCksIGlNaW51c0xlbikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICBjYy0tOworICAgICAgICAgIGJOZWcgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGNjZi0tOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ0UnOiB7CisgICAgICAgIGJvb2wgYkV4cFNpZ24gPSBmYWxzZTsKKyAgICAgICAgd2hpbGUgKGNjID49IDApIHsKKyAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBpZiAoRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKKyAgICAgICAgICAgIGlFeHBvbmVudCA9IGlFeHBvbmVudCArIEZYU1lTX0RlY2ltYWxDaGFyVG9JbnQoc3RyW2NjXSkgKiAxMDsKKyAgICAgICAgICAgIGNjLS07CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7CisgICAgICAgICAgICBjYy0tOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChjYyAtIGlNaW51c0xlbiArIDEgPiAwICYmICF3Y3NuY21wKHN0ciArIChjYyAtIGlNaW51c0xlbiArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzTWludXMuY19zdHIoKSwgaU1pbnVzTGVuKSkgeworICAgICAgICAgICAgYkV4cFNpZ24gPSB0cnVlOworICAgICAgICAgICAgY2MgLT0gaU1pbnVzTGVuOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGNjLS07CisgICAgICAgIGlFeHBvbmVudCA9IGJFeHBTaWduID8gLWlFeHBvbmVudCA6IGlFeHBvbmVudDsKKyAgICAgICAgY2NmLS07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAnJCc6IHsKKyAgICAgICAgV2lkZVN0cmluZyB3c1N5bWJvbCA9CisgICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfQ3VycmVuY3lTeW1ib2wpOworICAgICAgICBpbnQzMl90IGlTeW1ib2xMZW4gPSB3c1N5bWJvbC5HZXRMZW5ndGgoKTsKKyAgICAgICAgY2MgLT0gaVN5bWJvbExlbiAtIDE7CisgICAgICAgIGlmIChjYyA8IDAgfHwgd2NzbmNtcChzdHIgKyBjYywgd3NTeW1ib2wuY19zdHIoKSwgaVN5bWJvbExlbikpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGNjLS07CisgICAgICAgIGNjZi0tOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJ3InOgorICAgICAgY2FzZSAnUic6CisgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgKChzdHJmW2NjZl0gPT0gJ1InICYmIHN0cmZbY2NmIC0gMV0gPT0gJ0MnKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyZltjY2ZdID09ICdyJyAmJiBzdHJmW2NjZiAtIDFdID09ICdjJykpKSB7CisgICAgICAgICAgaWYgKHN0cmZbY2NmXSA9PSAnUicgJiYgc3RyW2NjXSA9PSAnICcpIHsKKyAgICAgICAgICAgIGNjIC09IDI7CisgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICdSJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnQycpIHsKKyAgICAgICAgICAgIGJOZWcgPSB0cnVlOworICAgICAgICAgICAgY2MgLT0gMjsKKyAgICAgICAgICB9CisgICAgICAgICAgY2NmIC09IDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY2NmLS07CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdiJzoKKyAgICAgIGNhc2UgJ0InOgorICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmICgoc3RyZltjY2ZdID09ICdCJyAmJiBzdHJmW2NjZiAtIDFdID09ICdEJykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmZbY2NmXSA9PSAnYicgJiYgc3RyZltjY2YgLSAxXSA9PSAnZCcpKSkgeworICAgICAgICAgIGlmIChzdHJmW2NjZl0gPT0gJ0InICYmIHN0cltjY10gPT0gJyAnKSB7CisgICAgICAgICAgICBjYyAtPSAyOworICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnQicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0QnKSB7CisgICAgICAgICAgICBiTmVnID0gdHJ1ZTsKKyAgICAgICAgICAgIGNjIC09IDI7CisgICAgICAgICAgfQorICAgICAgICAgIGNjZiAtPSAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGNjZi0tOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnJSc6IHsKKyAgICAgICAgV2lkZVN0cmluZyB3c1N5bWJvbCA9CisgICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfUGVyY2VudCk7CisgICAgICAgIGludDMyX3QgaVN5c21ib2xMZW4gPSB3c1N5bWJvbC5HZXRMZW5ndGgoKTsKKyAgICAgICAgY2MgLT0gaVN5c21ib2xMZW4gLSAxOworICAgICAgICBpZiAoY2MgPCAwIHx8IHdjc25jbXAoc3RyICsgY2MsIHdzU3ltYm9sLmNfc3RyKCksIGlTeXNtYm9sTGVuKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgY2MtLTsKKyAgICAgICAgY2NmLS07CisgICAgICAgIGJIYXZlUGVyY2VudFN5bWJvbCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAnLic6CisgICAgICBjYXNlICdWJzoKKyAgICAgIGNhc2UgJ3YnOgorICAgICAgY2FzZSAnOCc6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGNhc2UgJywnOiB7CisgICAgICAgIGlmIChjYyA+PSAwKSB7CisgICAgICAgICAgY2MgLT0gaUdyb3VwTGVuIC0gMTsKKyAgICAgICAgICBpZiAoY2MgPj0gMCAmJgorICAgICAgICAgICAgICB3Y3NuY21wKHN0ciArIGNjLCB3c0dyb3VwU3ltYm9sLmNfc3RyKCksIGlHcm91cExlbikgPT0gMCkgeworICAgICAgICAgICAgY2MtLTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2MgKz0gaUdyb3VwTGVuIC0gMTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2NmLS07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSAnKCc6CisgICAgICBjYXNlICcpJzoKKyAgICAgICAgaWYgKHN0cltjY10gPT0gc3RyZltjY2ZdKQorICAgICAgICAgIGJOZWcgPSB0cnVlOworICAgICAgICBlbHNlIGlmIChzdHJbY2NdICE9IEwnICcpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGNjLS07CisgICAgICAgIGNjZi0tOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChzdHJmW2NjZl0gIT0gc3RyW2NjXSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgY2MtLTsKKyAgICAgICAgY2NmLS07CisgICAgfQorICB9CisgIGlmIChjYyA+PSAwKSB7CisgICAgaWYgKHN0cltjY10gPT0gJy0nKSB7CisgICAgICBiTmVnID0gdHJ1ZTsKKyAgICAgIGNjLS07CisgICAgfQorICAgIGlmIChjYyA+PSAwKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChkb3RfaW5kZXggPCBsZW4gJiYgKGR3Rm9ybWF0U3R5bGUgJiBGWF9OVU1TVFlMRV9Eb3RWb3J2KSkKKyAgICAqd3NWYWx1ZSArPSAnLic7CisgIGlmICghYlJldmVyc2VQYXJzZSkgeworICAgIGNjZiA9IGRvdF9pbmRleF9mICsgMTsKKyAgICBjYyA9IChkb3RfaW5kZXggPT0gbGVuKSA/IGxlbiA6IGRvdF9pbmRleCArIDE7CisgICAgd2hpbGUgKGNjIDwgbGVuICYmIGNjZiA8IGxlbmYpIHsKKyAgICAgIHN3aXRjaCAoc3RyZltjY2ZdKSB7CisgICAgICAgIGNhc2UgJ1wnJzogeworICAgICAgICAgIFdpZGVTdHJpbmcgd3NMaXRlcmFsID0gR2V0TGl0ZXJhbFRleHQoc3RyZiwgJmNjZiwgbGVuZik7CisgICAgICAgICAgaW50MzJfdCBpTGl0ZXJhbExlbiA9IHdzTGl0ZXJhbC5HZXRMZW5ndGgoKTsKKyAgICAgICAgICBpZiAoY2MgKyBpTGl0ZXJhbExlbiA+IGxlbiB8fAorICAgICAgICAgICAgICB3Y3NuY21wKHN0ciArIGNjLCB3c0xpdGVyYWwuY19zdHIoKSwgaUxpdGVyYWxMZW4pKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQorICAgICAgICAgIGNjICs9IGlMaXRlcmFsTGVuOworICAgICAgICAgIGNjZisrOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgJzknOgorICAgICAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAqd3NWYWx1ZSArPSBzdHJbY2NdOworICAgICAgICAgIGNjKys7CisgICAgICAgICAgY2NmKys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ3onOgorICAgICAgICBjYXNlICdaJzoKKyAgICAgICAgICBpZiAoc3RyZltjY2ZdID09ICd6JyB8fCBzdHJbY2NdICE9ICcgJykgeworICAgICAgICAgICAgaWYgKEZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKSB7CisgICAgICAgICAgICAgICp3c1ZhbHVlICs9IHN0cltjY107CisgICAgICAgICAgICAgIGNjKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNjKys7CisgICAgICAgICAgfQorICAgICAgICAgIGNjZisrOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgaWYgKHN0cltjY10gPT0gJysnIHx8IChzdHJmW2NjZl0gPT0gJ1MnICYmIHN0cltjY10gPT0gJyAnKSkgeworICAgICAgICAgICAgY2MrKzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNjICsgaU1pbnVzTGVuID4gbGVuIHx8CisgICAgICAgICAgICAgICAgd2NzbmNtcChzdHIgKyBjYywgd3NNaW51cy5jX3N0cigpLCBpTWludXNMZW4pKSB7CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJOZWcgPSB0cnVlOworICAgICAgICAgICAgY2MgKz0gaU1pbnVzTGVuOworICAgICAgICAgIH0KKyAgICAgICAgICBjY2YrKzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnRSc6IHsKKyAgICAgICAgICBpZiAoY2MgPj0gbGVuIHx8IChzdHJbY2NdICE9ICdFJyAmJiBzdHJbY2NdICE9ICdlJykpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICBib29sIGJFeHBTaWduID0gZmFsc2U7CisgICAgICAgICAgY2MrKzsKKyAgICAgICAgICBpZiAoY2MgPCBsZW4pIHsKKyAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcrJykgeworICAgICAgICAgICAgICBjYysrOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICctJykgeworICAgICAgICAgICAgICBiRXhwU2lnbiA9IHRydWU7CisgICAgICAgICAgICAgIGNjKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHdoaWxlIChjYyA8IGxlbikgeworICAgICAgICAgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkKKyAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGlFeHBvbmVudCA9IGlFeHBvbmVudCAqIDEwICsgRlhTWVNfRGVjaW1hbENoYXJUb0ludChzdHJbY2NdKTsKKyAgICAgICAgICAgIGNjKys7CisgICAgICAgICAgfQorICAgICAgICAgIGlFeHBvbmVudCA9IGJFeHBTaWduID8gLWlFeHBvbmVudCA6IGlFeHBvbmVudDsKKyAgICAgICAgICBjY2YrKzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlICckJzogeworICAgICAgICAgIFdpZGVTdHJpbmcgd3NTeW1ib2wgPQorICAgICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfQ3VycmVuY3lTeW1ib2wpOworICAgICAgICAgIGludDMyX3QgaVN5bWJvbExlbiA9IHdzU3ltYm9sLkdldExlbmd0aCgpOworICAgICAgICAgIGlmIChjYyArIGlTeW1ib2xMZW4gPiBsZW4gfHwKKyAgICAgICAgICAgICAgd2NzbmNtcChzdHIgKyBjYywgd3NTeW1ib2wuY19zdHIoKSwgaVN5bWJvbExlbikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgICAgY2MgKz0gaVN5bWJvbExlbjsKKyAgICAgICAgICBjY2YrKzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlICdjJzoKKyAgICAgICAgY2FzZSAnQyc6CisgICAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmICgoc3RyZltjY2ZdID09ICdDJyAmJiBzdHJmW2NjZiArIDFdID09ICdSJykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJmW2NjZl0gPT0gJ2MnICYmIHN0cmZbY2NmICsgMV0gPT0gJ3InKSkpIHsKKyAgICAgICAgICAgIGlmIChzdHJmW2NjZl0gPT0gJ0MnICYmIHN0cltjY10gPT0gJyAnKSB7CisgICAgICAgICAgICAgIGNjKys7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJ0MnICYmIGNjICsgMSA8IGxlbiAmJiBzdHJbY2MgKyAxXSA9PSAnUicpIHsKKyAgICAgICAgICAgICAgYk5lZyA9IHRydWU7CisgICAgICAgICAgICAgIGNjICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjY2YgKz0gMjsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ2QnOgorICAgICAgICBjYXNlICdEJzoKKyAgICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgKChzdHJmW2NjZl0gPT0gJ0QnICYmIHN0cmZbY2NmICsgMV0gPT0gJ0InKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmZbY2NmXSA9PSAnZCcgJiYgc3RyZltjY2YgKyAxXSA9PSAnYicpKSkgeworICAgICAgICAgICAgaWYgKHN0cmZbY2NmXSA9PSAnRCcgJiYgc3RyW2NjXSA9PSAnICcpIHsKKyAgICAgICAgICAgICAgY2MrKzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnRCcgJiYgY2MgKyAxIDwgbGVuICYmIHN0cltjYyArIDFdID09ICdCJykgeworICAgICAgICAgICAgICBiTmVnID0gdHJ1ZTsKKyAgICAgICAgICAgICAgY2MgKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNjZiArPSAyOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnLic6CisgICAgICAgIGNhc2UgJ1YnOgorICAgICAgICBjYXNlICd2JzoKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGNhc2UgJyUnOiB7CisgICAgICAgICAgV2lkZVN0cmluZyB3c1N5bWJvbCA9CisgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50KTsKKyAgICAgICAgICBpbnQzMl90IGlTeXNtYm9sTGVuID0gd3NTeW1ib2wuR2V0TGVuZ3RoKCk7CisgICAgICAgICAgaWYgKGNjICsgaVN5c21ib2xMZW4gPD0gbGVuICYmCisgICAgICAgICAgICAgICF3Y3NuY21wKHN0ciArIGNjLCB3c1N5bWJvbC5jX3N0cigpLCBpU3lzbWJvbExlbikpIHsKKyAgICAgICAgICAgIGNjICs9IGlTeXNtYm9sTGVuOworICAgICAgICAgIH0KKyAgICAgICAgICBjY2YrKzsKKyAgICAgICAgICBiSGF2ZVBlcmNlbnRTeW1ib2wgPSB0cnVlOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlICc4JzogeworICAgICAgICAgIHdoaWxlIChjY2YgPCBsZW5mICYmIHN0cmZbY2NmXSA9PSAnOCcpCisgICAgICAgICAgICBjY2YrKzsKKworICAgICAgICAgIHdoaWxlIChjYyA8IGxlbiAmJiBGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgeworICAgICAgICAgICAgKndzVmFsdWUgKz0gc3RyW2NjXTsKKyAgICAgICAgICAgIGNjKys7CisgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlICcsJzogeworICAgICAgICAgIGlmIChjYyArIGlHcm91cExlbiA8PSBsZW4gJiYKKyAgICAgICAgICAgICAgd2NzbmNtcChzdHIgKyBjYywgd3NHcm91cFN5bWJvbC5jX3N0cigpLCBpR3JvdXBMZW4pID09IDApIHsKKyAgICAgICAgICAgIGNjICs9IGlHcm91cExlbjsKKyAgICAgICAgICB9CisgICAgICAgICAgY2NmKys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSAnKCc6CisgICAgICAgIGNhc2UgJyknOgorICAgICAgICAgIGlmIChzdHJbY2NdID09IHN0cmZbY2NmXSkKKyAgICAgICAgICAgIGJOZWcgPSB0cnVlOworICAgICAgICAgIGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgIGNjKys7CisgICAgICAgICAgY2NmKys7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgaWYgKHN0cmZbY2NmXSAhPSBzdHJbY2NdKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgY2MrKzsKKyAgICAgICAgICBjY2YrKzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGNjICE9IGxlbikKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoaUV4cG9uZW50IHx8IGJIYXZlUGVyY2VudFN5bWJvbCkgeworICAgIENGWF9EZWNpbWFsIGRlY2ltYWwgPSBDRlhfRGVjaW1hbCh3c1ZhbHVlLT5Bc1N0cmluZ1ZpZXcoKSk7CisgICAgaWYgKGlFeHBvbmVudCkgeworICAgICAgZGVjaW1hbCA9IGRlY2ltYWwgKgorICAgICAgICAgICAgICAgIENGWF9EZWNpbWFsKEZYU1lTX3BvdygxMCwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KGlFeHBvbmVudCkpLCAzKTsKKyAgICB9CisgICAgaWYgKGJIYXZlUGVyY2VudFN5bWJvbCkKKyAgICAgIGRlY2ltYWwgPSBkZWNpbWFsIC8gQ0ZYX0RlY2ltYWwoMTAwKTsKKworICAgICp3c1ZhbHVlID0gZGVjaW1hbDsKKyAgfQorICBpZiAoYk5lZykKKyAgICB3c1ZhbHVlLT5JbnNlcnRBdEZyb250KEwnLScpOworCisgIHJldHVybiB0cnVlOworfQorCitGWF9EQVRFVElNRVRZUEUgQ0ZHQVNfRm9ybWF0U3RyaW5nOjpHZXREYXRlVGltZUZvcm1hdCgKKyAgICBjb25zdCBXaWRlU3RyaW5nJiB3c1BhdHRlcm4sCisgICAgSUZYX0xvY2FsZSoqIHBMb2NhbGUsCisgICAgV2lkZVN0cmluZyogd3NEYXRlUGF0dGVybiwKKyAgICBXaWRlU3RyaW5nKiB3c1RpbWVQYXR0ZXJuKSB7CisgICpwTG9jYWxlID0gbnVsbHB0cjsKKyAgV2lkZVN0cmluZyB3c1RlbXBQYXR0ZXJuOworICBGWF9MT0NBTEVDQVRFR09SWSBlQ2F0ZWdvcnkgPSBGWF9MT0NBTEVDQVRFR09SWV9Vbmtub3duOworICBpbnQzMl90IGNjZiA9IDA7CisgIGludDMyX3QgaUxlbmYgPSB3c1BhdHRlcm4uR2V0TGVuZ3RoKCk7CisgIGNvbnN0IHdjaGFyX3QqIHBTdHIgPSB3c1BhdHRlcm4uY19zdHIoKTsKKyAgaW50MzJfdCBpRmluZENhdGVnb3J5ID0gMDsKKyAgYm9vbCBiQnJhY2VPcGVuID0gZmFsc2U7CisgIFdpZGVTdHJpbmdWaWV3IHdzQ29uc3RDaGFycyhnc193c0NvbnN0Q2hhcnMpOworICB3aGlsZSAoY2NmIDwgaUxlbmYpIHsKKyAgICBpZiAocFN0cltjY2ZdID09ICdcJycpIHsKKyAgICAgIGludDMyX3QgaUN1ckNoYXIgPSBjY2Y7CisgICAgICBHZXRMaXRlcmFsVGV4dChwU3RyLCAmY2NmLCBpTGVuZik7CisgICAgICB3c1RlbXBQYXR0ZXJuICs9IFdpZGVTdHJpbmdWaWV3KHBTdHIgKyBpQ3VyQ2hhciwgY2NmIC0gaUN1ckNoYXIgKyAxKTsKKyAgICB9IGVsc2UgaWYgKCFiQnJhY2VPcGVuICYmIGlGaW5kQ2F0ZWdvcnkgIT0gMyAmJgorICAgICAgICAgICAgICAgIXdzQ29uc3RDaGFycy5Db250YWlucyhwU3RyW2NjZl0pKSB7CisgICAgICBXaWRlU3RyaW5nIHdzQ2F0ZWdvcnkocFN0cltjY2ZdKTsKKyAgICAgIGNjZisrOworICAgICAgd2hpbGUgKGNjZiA8IGlMZW5mICYmIHBTdHJbY2NmXSAhPSAneycgJiYgcFN0cltjY2ZdICE9ICcuJyAmJgorICAgICAgICAgICAgIHBTdHJbY2NmXSAhPSAnKCcpIHsKKyAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAnVCcpIHsKKyAgICAgICAgICAqd3NEYXRlUGF0dGVybiA9IHdzUGF0dGVybi5MZWZ0KGNjZik7CisgICAgICAgICAgKndzVGltZVBhdHRlcm4gPSB3c1BhdHRlcm4uUmlnaHQod3NQYXR0ZXJuLkdldExlbmd0aCgpIC0gY2NmKTsKKyAgICAgICAgICB3c1RpbWVQYXR0ZXJuLT5TZXRBdCgwLCAnICcpOworICAgICAgICAgIGlmICghKnBMb2NhbGUpCisgICAgICAgICAgICAqcExvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7CisKKyAgICAgICAgICByZXR1cm4gRlhfREFURVRJTUVUWVBFX0RhdGVUaW1lOworICAgICAgICB9CisgICAgICAgIHdzQ2F0ZWdvcnkgKz0gcFN0cltjY2ZdOworICAgICAgICBjY2YrKzsKKyAgICAgIH0KKyAgICAgIGlmICghKGlGaW5kQ2F0ZWdvcnkgJiAxKSAmJiB3c0NhdGVnb3J5ID09IEwiZGF0ZSIpIHsKKyAgICAgICAgaUZpbmRDYXRlZ29yeSB8PSAxOworICAgICAgICBlQ2F0ZWdvcnkgPSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlOworICAgICAgICBpZiAoaUZpbmRDYXRlZ29yeSAmIDIpCisgICAgICAgICAgaUZpbmRDYXRlZ29yeSA9IDQ7CisgICAgICB9IGVsc2UgaWYgKCEoaUZpbmRDYXRlZ29yeSAmIDIpICYmIHdzQ2F0ZWdvcnkgPT0gTCJ0aW1lIikgeworICAgICAgICBpRmluZENhdGVnb3J5IHw9IDI7CisgICAgICAgIGVDYXRlZ29yeSA9IEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWU7CisgICAgICB9IGVsc2UgaWYgKHdzQ2F0ZWdvcnkgPT0gTCJkYXRldGltZSIpIHsKKyAgICAgICAgaUZpbmRDYXRlZ29yeSA9IDM7CisgICAgICAgIGVDYXRlZ29yeSA9IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYpIHsKKyAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAneycpIHsKKyAgICAgICAgICBiQnJhY2VPcGVuID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAocFN0cltjY2ZdID09ICcoJykgeworICAgICAgICAgIGNjZisrOworICAgICAgICAgIFdpZGVTdHJpbmcgd3NMQ0lEOworICAgICAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJyknKQorICAgICAgICAgICAgd3NMQ0lEICs9IHBTdHJbY2NmKytdOworCisgICAgICAgICAgKnBMb2NhbGUgPSBtX3BMb2NhbGVNZ3ItPkdldExvY2FsZUJ5TmFtZSh3c0xDSUQpOworICAgICAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSA9PSAnLicpIHsKKyAgICAgICAgICBXaWRlU3RyaW5nIHdzU3ViQ2F0ZWdvcnk7CisgICAgICAgICAgY2NmKys7CisgICAgICAgICAgd2hpbGUgKGNjZiA8IGlMZW5mICYmIHBTdHJbY2NmXSAhPSAnKCcgJiYgcFN0cltjY2ZdICE9ICd7JykKKyAgICAgICAgICAgIHdzU3ViQ2F0ZWdvcnkgKz0gcFN0cltjY2YrK107CisKKyAgICAgICAgICB1aW50MzJfdCBkd1N1Ykhhc2ggPQorICAgICAgICAgICAgICBGWF9IYXNoQ29kZV9HZXRXKHdzU3ViQ2F0ZWdvcnkuQXNTdHJpbmdWaWV3KCksIGZhbHNlKTsKKyAgICAgICAgICBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVTdWJDYXRlZ29yeSA9CisgICAgICAgICAgICAgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtOworICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGdfaUZYTG9jYWxlRGF0ZVRpbWVTdWJDYXRDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZ19GWExvY2FsZURhdGVUaW1lU3ViQ2F0RGF0YVtpXS51SGFzaCA9PSBkd1N1Ykhhc2gpIHsKKyAgICAgICAgICAgICAgZVN1YkNhdGVnb3J5ID0KKyAgICAgICAgICAgICAgICAgIChGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZKWdfRlhMb2NhbGVEYXRlVGltZVN1YkNhdERhdGFbaV0KKyAgICAgICAgICAgICAgICAgICAgICAuZVN1YkNhdGVnb3J5OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCEqcExvY2FsZSkKKyAgICAgICAgICAgICpwTG9jYWxlID0gbV9wTG9jYWxlTWdyLT5HZXREZWZMb2NhbGUoKTsKKyAgICAgICAgICBBU1NFUlQoKnBMb2NhbGUpOworCisgICAgICAgICAgc3dpdGNoIChlQ2F0ZWdvcnkpIHsKKyAgICAgICAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZToKKyAgICAgICAgICAgICAgKndzRGF0ZVBhdHRlcm4gPQorICAgICAgICAgICAgICAgICAgd3NUZW1wUGF0dGVybiArICgqcExvY2FsZSktPkdldERhdGVQYXR0ZXJuKGVTdWJDYXRlZ29yeSk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9UaW1lOgorICAgICAgICAgICAgICAqd3NUaW1lUGF0dGVybiA9CisgICAgICAgICAgICAgICAgICB3c1RlbXBQYXR0ZXJuICsgKCpwTG9jYWxlKS0+R2V0VGltZVBhdHRlcm4oZVN1YkNhdGVnb3J5KTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lOgorICAgICAgICAgICAgICAqd3NEYXRlUGF0dGVybiA9CisgICAgICAgICAgICAgICAgICB3c1RlbXBQYXR0ZXJuICsgKCpwTG9jYWxlKS0+R2V0RGF0ZVBhdHRlcm4oZVN1YkNhdGVnb3J5KTsKKyAgICAgICAgICAgICAgKndzVGltZVBhdHRlcm4gPSAoKnBMb2NhbGUpLT5HZXRUaW1lUGF0dGVybihlU3ViQ2F0ZWdvcnkpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICB3c1RlbXBQYXR0ZXJuLmNsZWFyKCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgY2NmKys7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gPT0gJ30nKSB7CisgICAgICBiQnJhY2VPcGVuID0gZmFsc2U7CisgICAgICBpZiAoIXdzVGVtcFBhdHRlcm4uSXNFbXB0eSgpKSB7CisgICAgICAgIGlmIChlQ2F0ZWdvcnkgPT0gRlhfTE9DQUxFQ0FURUdPUllfVGltZSkKKyAgICAgICAgICAqd3NUaW1lUGF0dGVybiA9IHdzVGVtcFBhdHRlcm47CisgICAgICAgIGVsc2UgaWYgKGVDYXRlZ29yeSA9PSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlKQorICAgICAgICAgICp3c0RhdGVQYXR0ZXJuID0gd3NUZW1wUGF0dGVybjsKKworICAgICAgICB3c1RlbXBQYXR0ZXJuLmNsZWFyKCk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHdzVGVtcFBhdHRlcm4gKz0gcFN0cltjY2ZdOworICAgIH0KKyAgICBjY2YrKzsKKyAgfQorCisgIGlmICghd3NUZW1wUGF0dGVybi5Jc0VtcHR5KCkpIHsKKyAgICBpZiAoZUNhdGVnb3J5ID09IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGUpCisgICAgICAqd3NEYXRlUGF0dGVybiArPSB3c1RlbXBQYXR0ZXJuOworICAgIGVsc2UKKyAgICAgICp3c1RpbWVQYXR0ZXJuICs9IHdzVGVtcFBhdHRlcm47CisgIH0KKyAgaWYgKCEqcExvY2FsZSkKKyAgICAqcExvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7CisgIGlmICghaUZpbmRDYXRlZ29yeSkgeworICAgIHdzVGltZVBhdHRlcm4tPmNsZWFyKCk7CisgICAgKndzRGF0ZVBhdHRlcm4gPSB3c1BhdHRlcm47CisgIH0KKyAgcmV0dXJuIChGWF9EQVRFVElNRVRZUEUpaUZpbmRDYXRlZ29yeTsKK30KKworYm9vbCBDRkdBU19Gb3JtYXRTdHJpbmc6OlBhcnNlRGF0ZVRpbWUoY29uc3QgV2lkZVN0cmluZyYgd3NTcmNEYXRlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRSBlRGF0ZVRpbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RhdGVUaW1lKiBkdFZhbHVlKSB7CisgIGR0VmFsdWUtPlJlc2V0KCk7CisgIGlmICh3c1NyY0RhdGVUaW1lLklzRW1wdHkoKSB8fCB3c1BhdHRlcm4uSXNFbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBXaWRlU3RyaW5nIHdzRGF0ZVBhdHRlcm47CisgIFdpZGVTdHJpbmcgd3NUaW1lUGF0dGVybjsKKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9IG51bGxwdHI7CisgIEZYX0RBVEVUSU1FVFlQRSBlQ2F0ZWdvcnkgPQorICAgICAgR2V0RGF0ZVRpbWVGb3JtYXQod3NQYXR0ZXJuLCAmcExvY2FsZSwgJndzRGF0ZVBhdHRlcm4sICZ3c1RpbWVQYXR0ZXJuKTsKKyAgaWYgKCFwTG9jYWxlKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKGVDYXRlZ29yeSA9PSBGWF9EQVRFVElNRVRZUEVfVW5rbm93bikKKyAgICBlQ2F0ZWdvcnkgPSBlRGF0ZVRpbWVUeXBlOworICBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9Vbmtub3duKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKGVDYXRlZ29yeSA9PSBGWF9EQVRFVElNRVRZUEVfVGltZURhdGUpIHsKKyAgICBpbnQzMl90IGlTdGFydCA9IDA7CisgICAgaWYgKCFQYXJzZUxvY2FsZVRpbWUod3NTcmNEYXRlVGltZSwgd3NUaW1lUGF0dGVybiwgcExvY2FsZSwgZHRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAmaVN0YXJ0KSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIVBhcnNlTG9jYWxlRGF0ZSh3c1NyY0RhdGVUaW1lLCB3c0RhdGVQYXR0ZXJuLCBwTG9jYWxlLCBkdFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnQpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9IGVsc2UgeworICAgIGludDMyX3QgaVN0YXJ0ID0gMDsKKyAgICBpZiAoKGVDYXRlZ29yeSAmIEZYX0RBVEVUSU1FVFlQRV9EYXRlKSAmJgorICAgICAgICAhUGFyc2VMb2NhbGVEYXRlKHdzU3JjRGF0ZVRpbWUsIHdzRGF0ZVBhdHRlcm4sIHBMb2NhbGUsIGR0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmlTdGFydCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKChlQ2F0ZWdvcnkgJiBGWF9EQVRFVElNRVRZUEVfVGltZSkgJiYKKyAgICAgICAgIVBhcnNlTG9jYWxlVGltZSh3c1NyY0RhdGVUaW1lLCB3c1RpbWVQYXR0ZXJuLCBwTG9jYWxlLCBkdFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICZpU3RhcnQpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIENGR0FTX0Zvcm1hdFN0cmluZzo6UGFyc2VaZXJvKGNvbnN0IFdpZGVTdHJpbmcmIHdzU3JjVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSB7CisgIFdpZGVTdHJpbmcgd3NUZXh0Rm9ybWF0ID0gR2V0VGV4dEZvcm1hdCh3c1BhdHRlcm4sIEwiemVybyIpOworCisgIGludDMyX3QgaVRleHQgPSAwOworICBpbnQzMl90IGlQYXR0ZXJuID0gMDsKKyAgY29uc3Qgd2NoYXJfdCogcFN0clRleHQgPSB3c1NyY1RleHQuY19zdHIoKTsKKyAgaW50MzJfdCBpTGVuVGV4dCA9IHdzU3JjVGV4dC5HZXRMZW5ndGgoKTsKKyAgY29uc3Qgd2NoYXJfdCogcFN0clBhdHRlcm4gPSB3c1RleHRGb3JtYXQuY19zdHIoKTsKKyAgaW50MzJfdCBpTGVuUGF0dGVybiA9IHdzVGV4dEZvcm1hdC5HZXRMZW5ndGgoKTsKKyAgd2hpbGUgKGlQYXR0ZXJuIDwgaUxlblBhdHRlcm4gJiYgaVRleHQgPCBpTGVuVGV4dCkgeworICAgIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gPT0gJ1wnJykgeworICAgICAgV2lkZVN0cmluZyB3c0xpdGVyYWwgPQorICAgICAgICAgIEdldExpdGVyYWxUZXh0KHBTdHJQYXR0ZXJuLCAmaVBhdHRlcm4sIGlMZW5QYXR0ZXJuKTsKKyAgICAgIGludDMyX3QgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7CisgICAgICBpZiAoaVRleHQgKyBpTGl0ZXJhbExlbiA+IGlMZW5UZXh0IHx8CisgICAgICAgICAgd2NzbmNtcChwU3RyVGV4dCArIGlUZXh0LCB3c0xpdGVyYWwuY19zdHIoKSwgaUxpdGVyYWxMZW4pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlUZXh0ICs9IGlMaXRlcmFsTGVuOworICAgICAgaVBhdHRlcm4rKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dICE9IHBTdHJUZXh0W2lUZXh0XSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlUZXh0Kys7CisgICAgaVBhdHRlcm4rKzsKKyAgfQorICByZXR1cm4gaVBhdHRlcm4gPT0gaUxlblBhdHRlcm4gJiYgaVRleHQgPT0gaUxlblRleHQ7Cit9CisKK2Jvb2wgQ0ZHQVNfRm9ybWF0U3RyaW5nOjpQYXJzZU51bGwoY29uc3QgV2lkZVN0cmluZyYgd3NTcmNUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c1BhdHRlcm4pIHsKKyAgV2lkZVN0cmluZyB3c1RleHRGb3JtYXQgPSBHZXRUZXh0Rm9ybWF0KHdzUGF0dGVybiwgTCJudWxsIik7CisKKyAgaW50MzJfdCBpVGV4dCA9IDA7CisgIGludDMyX3QgaVBhdHRlcm4gPSAwOworICBjb25zdCB3Y2hhcl90KiBwU3RyVGV4dCA9IHdzU3JjVGV4dC5jX3N0cigpOworICBpbnQzMl90IGlMZW5UZXh0ID0gd3NTcmNUZXh0LkdldExlbmd0aCgpOworICBjb25zdCB3Y2hhcl90KiBwU3RyUGF0dGVybiA9IHdzVGV4dEZvcm1hdC5jX3N0cigpOworICBpbnQzMl90IGlMZW5QYXR0ZXJuID0gd3NUZXh0Rm9ybWF0LkdldExlbmd0aCgpOworICB3aGlsZSAoaVBhdHRlcm4gPCBpTGVuUGF0dGVybiAmJiBpVGV4dCA8IGlMZW5UZXh0KSB7CisgICAgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSA9PSAnXCcnKSB7CisgICAgICBXaWRlU3RyaW5nIHdzTGl0ZXJhbCA9CisgICAgICAgICAgR2V0TGl0ZXJhbFRleHQocFN0clBhdHRlcm4sICZpUGF0dGVybiwgaUxlblBhdHRlcm4pOworICAgICAgaW50MzJfdCBpTGl0ZXJhbExlbiA9IHdzTGl0ZXJhbC5HZXRMZW5ndGgoKTsKKyAgICAgIGlmIChpVGV4dCArIGlMaXRlcmFsTGVuID4gaUxlblRleHQgfHwKKyAgICAgICAgICB3Y3NuY21wKHBTdHJUZXh0ICsgaVRleHQsIHdzTGl0ZXJhbC5jX3N0cigpLCBpTGl0ZXJhbExlbikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgaVRleHQgKz0gaUxpdGVyYWxMZW47CisgICAgICBpUGF0dGVybisrOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gIT0gcFN0clRleHRbaVRleHRdKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaVRleHQrKzsKKyAgICBpUGF0dGVybisrOworICB9CisgIHJldHVybiBpUGF0dGVybiA9PSBpTGVuUGF0dGVybiAmJiBpVGV4dCA9PSBpTGVuVGV4dDsKK30KKworYm9vbCBDRkdBU19Gb3JtYXRTdHJpbmc6OkZvcm1hdFRleHQoY29uc3QgV2lkZVN0cmluZyYgd3NTcmNUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyogd3NPdXRwdXQpIHsKKyAgaWYgKHdzUGF0dGVybi5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGludDMyX3QgaUxlblRleHQgPSB3c1NyY1RleHQuR2V0TGVuZ3RoKCk7CisgIGlmIChpTGVuVGV4dCA9PSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBXaWRlU3RyaW5nIHdzVGV4dEZvcm1hdCA9IEdldFRleHRGb3JtYXQod3NQYXR0ZXJuLCBMInRleHQiKTsKKworICBpbnQzMl90IGlUZXh0ID0gMDsKKyAgaW50MzJfdCBpUGF0dGVybiA9IDA7CisgIGNvbnN0IHdjaGFyX3QqIHBTdHJUZXh0ID0gd3NTcmNUZXh0LmNfc3RyKCk7CisgIGNvbnN0IHdjaGFyX3QqIHBTdHJQYXR0ZXJuID0gd3NUZXh0Rm9ybWF0LmNfc3RyKCk7CisgIGludDMyX3QgaUxlblBhdHRlcm4gPSB3c1RleHRGb3JtYXQuR2V0TGVuZ3RoKCk7CisgIHdoaWxlIChpUGF0dGVybiA8IGlMZW5QYXR0ZXJuKSB7CisgICAgc3dpdGNoIChwU3RyUGF0dGVybltpUGF0dGVybl0pIHsKKyAgICAgIGNhc2UgJ1wnJzogeworICAgICAgICAqd3NPdXRwdXQgKz0gR2V0TGl0ZXJhbFRleHQocFN0clBhdHRlcm4sICZpUGF0dGVybiwgaUxlblBhdHRlcm4pOworICAgICAgICBpUGF0dGVybisrOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJ0EnOgorICAgICAgICBpZiAoaVRleHQgPj0gaUxlblRleHQgfHwgIUZYU1lTX2lzd2FscGhhKHBTdHJUZXh0W2lUZXh0XSkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICp3c091dHB1dCArPSBwU3RyVGV4dFtpVGV4dCsrXTsKKyAgICAgICAgaVBhdHRlcm4rKzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdYJzoKKyAgICAgICAgaWYgKGlUZXh0ID49IGlMZW5UZXh0KQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAqd3NPdXRwdXQgKz0gcFN0clRleHRbaVRleHQrK107CisgICAgICAgIGlQYXR0ZXJuKys7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnTyc6CisgICAgICBjYXNlICcwJzoKKyAgICAgICAgaWYgKGlUZXh0ID49IGlMZW5UZXh0IHx8ICghRlhTWVNfaXNEZWNpbWFsRGlnaXQocFN0clRleHRbaVRleHRdKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFGWFNZU19pc3dhbHBoYShwU3RyVGV4dFtpVGV4dF0pKSkgeworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAqd3NPdXRwdXQgKz0gcFN0clRleHRbaVRleHQrK107CisgICAgICAgIGlQYXR0ZXJuKys7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnOSc6CisgICAgICAgIGlmIChpVGV4dCA+PSBpTGVuVGV4dCB8fCAhRlhTWVNfaXNEZWNpbWFsRGlnaXQocFN0clRleHRbaVRleHRdKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgKndzT3V0cHV0ICs9IHBTdHJUZXh0W2lUZXh0KytdOworICAgICAgICBpUGF0dGVybisrOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgICp3c091dHB1dCArPSBwU3RyUGF0dGVybltpUGF0dGVybisrXTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBpVGV4dCA9PSBpTGVuVGV4dDsKK30KKworYm9vbCBDRkdBU19Gb3JtYXRTdHJpbmc6OkZvcm1hdFN0ck51bShjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NJbnB1dE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nKiB3c091dHB1dCkgeworICBpZiAod3NJbnB1dE51bS5Jc0VtcHR5KCkgfHwgd3NQYXR0ZXJuLklzRW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW50MzJfdCBkb3RfaW5kZXhfZiA9IC0xOworICB1aW50MzJfdCBkd051bVN0eWxlID0gMDsKKyAgV2lkZVN0cmluZyB3c051bUZvcm1hdDsKKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9CisgICAgICBHZXROdW1lcmljRm9ybWF0KHdzUGF0dGVybiwgJmRvdF9pbmRleF9mLCAmZHdOdW1TdHlsZSwgJndzTnVtRm9ybWF0KTsKKyAgaWYgKCFwTG9jYWxlIHx8IHdzTnVtRm9ybWF0LklzRW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaW50MzJfdCBjYyA9IDAsIGNjZiA9IDA7CisgIGNvbnN0IHdjaGFyX3QqIHN0cmYgPSB3c051bUZvcm1hdC5jX3N0cigpOworICBpbnQgbGVuZiA9IHdzTnVtRm9ybWF0LkdldExlbmd0aCgpOworICBXaWRlU3RyaW5nIHdzU3JjTnVtKHdzSW5wdXROdW0pOworICB3c1NyY051bS5UcmltTGVmdCgnMCcpOworICBpZiAod3NTcmNOdW0uSXNFbXB0eSgpIHx8IHdzU3JjTnVtWzBdID09ICcuJykKKyAgICB3c1NyY051bS5JbnNlcnRBdEZyb250KCcwJyk7CisKKyAgQ0ZYX0RlY2ltYWwgZGVjaW1hbCA9IENGWF9EZWNpbWFsKHdzU3JjTnVtLkFzU3RyaW5nVmlldygpKTsKKyAgaWYgKGR3TnVtU3R5bGUgJiBGWF9OVU1TVFlMRV9QZXJjZW50KSB7CisgICAgZGVjaW1hbCA9IGRlY2ltYWwgKiBDRlhfRGVjaW1hbCgxMDApOworICAgIHdzU3JjTnVtID0gZGVjaW1hbDsKKyAgfQorCisgIGludDMyX3QgZXhwb25lbnQgPSAwOworICBpZiAoZHdOdW1TdHlsZSAmIEZYX05VTVNUWUxFX0V4cG9uZW50KSB7CisgICAgaW50IGZpeGVkX2NvdW50ID0gMDsKKyAgICB3aGlsZSAoY2NmIDwgZG90X2luZGV4X2YpIHsKKyAgICAgIHN3aXRjaCAoc3RyZltjY2ZdKSB7CisgICAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgICBHZXRMaXRlcmFsVGV4dChzdHJmLCAmY2NmLCBkb3RfaW5kZXhfZik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJzknOgorICAgICAgICBjYXNlICd6JzoKKyAgICAgICAgY2FzZSAnWic6CisgICAgICAgICAgZml4ZWRfY291bnQrKzsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNjZisrOworICAgIH0KKworICAgIGludCB0aHJlc2hvbGQgPSAxOworICAgIHdoaWxlIChmaXhlZF9jb3VudCA+IDEpIHsKKyAgICAgIHRocmVzaG9sZCAqPSAxMDsKKyAgICAgIGZpeGVkX2NvdW50LS07CisgICAgfQorICAgIGlmIChkZWNpbWFsICE9IENGWF9EZWNpbWFsKDApKSB7CisgICAgICBpZiAoZGVjaW1hbCA8IENGWF9EZWNpbWFsKHRocmVzaG9sZCkpIHsKKyAgICAgICAgZGVjaW1hbCA9IGRlY2ltYWwgKiBDRlhfRGVjaW1hbCgxMCk7CisgICAgICAgIGV4cG9uZW50ID0gLTE7CisgICAgICAgIHdoaWxlIChkZWNpbWFsIDwgQ0ZYX0RlY2ltYWwodGhyZXNob2xkKSkgeworICAgICAgICAgIGRlY2ltYWwgPSBkZWNpbWFsICogQ0ZYX0RlY2ltYWwoMTApOworICAgICAgICAgIGV4cG9uZW50IC09IDE7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSBpZiAoZGVjaW1hbCA+IENGWF9EZWNpbWFsKHRocmVzaG9sZCkpIHsKKyAgICAgICAgdGhyZXNob2xkICo9IDEwOworICAgICAgICB3aGlsZSAoZGVjaW1hbCA+IENGWF9EZWNpbWFsKHRocmVzaG9sZCkpIHsKKyAgICAgICAgICBkZWNpbWFsID0gZGVjaW1hbCAvIENGWF9EZWNpbWFsKDEwKTsKKyAgICAgICAgICBleHBvbmVudCArPSAxOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgYm9vbCBiVHJpbVRhaWxaZXJvcyA9IGZhbHNlOworICBpbnQzMl90IGlUcmVhZGluZyA9CisgICAgICBHZXROdW1UcmFpbGluZ0xpbWl0KHdzTnVtRm9ybWF0LCBkb3RfaW5kZXhfZiwgJmJUcmltVGFpbFplcm9zKTsKKyAgaW50MzJfdCBzY2FsZSA9IGRlY2ltYWwuR2V0U2NhbGUoKTsKKyAgaWYgKGlUcmVhZGluZyA8IHNjYWxlKSB7CisgICAgZGVjaW1hbC5TZXRTY2FsZShpVHJlYWRpbmcpOworICAgIHdzU3JjTnVtID0gZGVjaW1hbDsKKyAgfQorICBpZiAoYlRyaW1UYWlsWmVyb3MgJiYgc2NhbGUgPiAwICYmIGlUcmVhZGluZyA+IDApIHsKKyAgICB3c1NyY051bS5UcmltUmlnaHQoTCIwIik7CisgICAgd3NTcmNOdW0uVHJpbVJpZ2h0KEwiLiIpOworICB9CisKKyAgV2lkZVN0cmluZyB3c0dyb3VwU3ltYm9sID0KKyAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9Hcm91cGluZyk7CisgIGJvb2wgYk5lZyA9IGZhbHNlOworICBpZiAod3NTcmNOdW1bMF0gPT0gJy0nKSB7CisgICAgYk5lZyA9IHRydWU7CisgICAgd3NTcmNOdW0uRGVsZXRlKDAsIDEpOworICB9CisKKyAgYm9vbCBiQWRkTmVnID0gZmFsc2U7CisgIGNvbnN0IHdjaGFyX3QqIHN0ciA9IHdzU3JjTnVtLmNfc3RyKCk7CisgIGludCBsZW4gPSB3c1NyY051bS5HZXRMZW5ndGgoKTsKKyAgYXV0byBkb3RfaW5kZXggPSB3c1NyY051bS5GaW5kKCcuJyk7CisgIGlmICghZG90X2luZGV4Lmhhc192YWx1ZSgpKQorICAgIGRvdF9pbmRleCA9IGxlbjsKKworICBjY2YgPSBkb3RfaW5kZXhfZiAtIDE7CisgIGNjID0gZG90X2luZGV4LnZhbHVlKCkgLSAxOworICB3aGlsZSAoY2NmID49IDApIHsKKyAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgeworICAgICAgY2FzZSAnOSc6CisgICAgICAgIGlmIChjYyA+PSAwKSB7CisgICAgICAgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgIHdzT3V0cHV0LT5JbnNlcnRBdEZyb250KHN0cltjY10pOworICAgICAgICAgIGNjLS07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgd3NPdXRwdXQtPkluc2VydEF0RnJvbnQoTCcwJyk7CisgICAgICAgIH0KKyAgICAgICAgY2NmLS07CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAneic6CisgICAgICAgIGlmIChjYyA+PSAwKSB7CisgICAgICAgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICBpZiAoc3RyWzBdICE9ICcwJykKKyAgICAgICAgICAgIHdzT3V0cHV0LT5JbnNlcnRBdEZyb250KHN0cltjY10pOworCisgICAgICAgICAgY2MtLTsKKyAgICAgICAgfQorICAgICAgICBjY2YtLTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdaJzoKKyAgICAgICAgaWYgKGNjID49IDApIHsKKyAgICAgICAgICBpZiAoIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgd3NPdXRwdXQtPkluc2VydEF0RnJvbnQoc3RyWzBdID09ICcwJyA/IEwnICcgOiBzdHJbY2NdKTsKKyAgICAgICAgICBjYy0tOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHdzT3V0cHV0LT5JbnNlcnRBdEZyb250KEwnICcpOworICAgICAgICB9CisgICAgICAgIGNjZi0tOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1MnOgorICAgICAgICBpZiAoYk5lZykgeworICAgICAgICAgICp3c091dHB1dCA9CisgICAgICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cykgKyAqd3NPdXRwdXQ7CisgICAgICAgICAgYkFkZE5lZyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgd3NPdXRwdXQtPkluc2VydEF0RnJvbnQoTCcgJyk7CisgICAgICAgIH0KKyAgICAgICAgY2NmLS07CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAncyc6CisgICAgICAgIGlmIChiTmVnKSB7CisgICAgICAgICAgKndzT3V0cHV0ID0KKyAgICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzKSArICp3c091dHB1dDsKKyAgICAgICAgICBiQWRkTmVnID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjY2YtLTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdFJzogeworICAgICAgICAqd3NPdXRwdXQgPSBXaWRlU3RyaW5nOjpGb3JtYXQoTCJFJStkIiwgZXhwb25lbnQpICsgKndzT3V0cHV0OworICAgICAgICBjY2YtLTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICckJzogeworICAgICAgICAqd3NPdXRwdXQgPQorICAgICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sKSArCisgICAgICAgICAgICAqd3NPdXRwdXQ7CisgICAgICAgIGNjZi0tOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJ3InOgorICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ2MnKSB7CisgICAgICAgICAgaWYgKGJOZWcpCisgICAgICAgICAgICAqd3NPdXRwdXQgPSBMIkNSIiArICp3c091dHB1dDsKKworICAgICAgICAgIGNjZiAtPSAyOworICAgICAgICAgIGJBZGROZWcgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnUic6CisgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnQycpIHsKKyAgICAgICAgICAqd3NPdXRwdXQgPSBiTmVnID8gTCJDUiIgOiBMIiAgIiArICp3c091dHB1dDsKKyAgICAgICAgICBjY2YgLT0gMjsKKyAgICAgICAgICBiQWRkTmVnID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ2InOgorICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ2QnKSB7CisgICAgICAgICAgaWYgKGJOZWcpCisgICAgICAgICAgICAqd3NPdXRwdXQgPSBMImRiIiArICp3c091dHB1dDsKKworICAgICAgICAgIGNjZiAtPSAyOworICAgICAgICAgIGJBZGROZWcgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnQic6CisgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnRCcpIHsKKyAgICAgICAgICAqd3NPdXRwdXQgPSBiTmVnID8gTCJEQiIgOiBMIiAgIiArICp3c091dHB1dDsKKyAgICAgICAgICBjY2YgLT0gMjsKKyAgICAgICAgICBiQWRkTmVnID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyUnOiB7CisgICAgICAgICp3c091dHB1dCA9CisgICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfUGVyY2VudCkgKyAqd3NPdXRwdXQ7CisgICAgICAgIGNjZi0tOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJywnOgorICAgICAgICBpZiAoY2MgPj0gMCkKKyAgICAgICAgICAqd3NPdXRwdXQgPSB3c0dyb3VwU3ltYm9sICsgKndzT3V0cHV0OworCisgICAgICAgIGNjZi0tOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJygnOgorICAgICAgICB3c091dHB1dC0+SW5zZXJ0QXRGcm9udChiTmVnID8gTCcoJyA6IEwnICcpOworICAgICAgICBiQWRkTmVnID0gdHJ1ZTsKKyAgICAgICAgY2NmLS07CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnKSc6CisgICAgICAgIHdzT3V0cHV0LT5JbnNlcnRBdEZyb250KGJOZWcgPyBMJyknIDogTCcgJyk7CisgICAgICAgIGNjZi0tOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgKndzT3V0cHV0ID0gR2V0TGl0ZXJhbFRleHRSZXZlcnNlKHN0cmYsICZjY2YpICsgKndzT3V0cHV0OworICAgICAgICBjY2YtLTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB3c091dHB1dC0+SW5zZXJ0QXRGcm9udChzdHJmW2NjZl0pOworICAgICAgICBjY2YtLTsKKyAgICB9CisgIH0KKworICBpZiAoY2MgPj0gMCkgeworICAgIGludCBuUG9zID0gZG90X2luZGV4LnZhbHVlKCkgJSAzOworICAgIHdzT3V0cHV0LT5jbGVhcigpOworICAgIGZvciAoaW50MzJfdCBpID0gMDsKKyAgICAgICAgIGkgPCBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxpbnQzMl90Pihkb3RfaW5kZXgudmFsdWUoKSk7IGkrKykgeworICAgICAgaWYgKGkgJSAzID09IG5Qb3MgJiYgaSAhPSAwKQorICAgICAgICAqd3NPdXRwdXQgKz0gd3NHcm91cFN5bWJvbDsKKyAgICAgICp3c091dHB1dCArPSB3c1NyY051bVtpXTsKKyAgICB9CisgICAgaWYgKHBkZml1bTo6YmFzZTo6Y2hlY2tlZF9jYXN0PGludDMyX3Q+KGRvdF9pbmRleC52YWx1ZSgpKSA8IGxlbikgeworICAgICAgKndzT3V0cHV0ICs9IHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsKTsKKyAgICAgICp3c091dHB1dCArPSB3c1NyY051bS5SaWdodChsZW4gLSBkb3RfaW5kZXgudmFsdWUoKSAtIDEpOworICAgIH0KKyAgICBpZiAoYk5lZykgeworICAgICAgKndzT3V0cHV0ID0KKyAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMpICsgKndzT3V0cHV0OworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGRvdF9pbmRleF9mID09CisgICAgICBwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxpbnQzMl90Pih3c051bUZvcm1hdC5HZXRMZW5ndGgoKSkpIHsKKyAgICBpZiAoIWJBZGROZWcgJiYgYk5lZykgeworICAgICAgKndzT3V0cHV0ID0KKyAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMpICsgKndzT3V0cHV0OworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIFdpZGVTdHJpbmcgd3NEb3RTeW1ib2wgPQorICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0RlY2ltYWwpOworICBpZiAoc3RyZltkb3RfaW5kZXhfZl0gPT0gJ1YnKSB7CisgICAgKndzT3V0cHV0ICs9IHdzRG90U3ltYm9sOworICB9IGVsc2UgaWYgKHN0cmZbZG90X2luZGV4X2ZdID09ICcuJykgeworICAgIGlmIChwZGZpdW06OmJhc2U6OmNoZWNrZWRfY2FzdDxpbnQzMl90Pihkb3RfaW5kZXgudmFsdWUoKSkgPCBsZW4pCisgICAgICAqd3NPdXRwdXQgKz0gd3NEb3RTeW1ib2w7CisgICAgZWxzZSBpZiAoc3RyZltkb3RfaW5kZXhfZiArIDFdID09ICc5JyB8fCBzdHJmW2RvdF9pbmRleF9mICsgMV0gPT0gJ1onKQorICAgICAgKndzT3V0cHV0ICs9IHdzRG90U3ltYm9sOworICB9CisKKyAgY2NmID0gZG90X2luZGV4X2YgKyAxOworICBjYyA9IGRvdF9pbmRleC52YWx1ZSgpICsgMTsKKyAgd2hpbGUgKGNjZiA8IGxlbmYpIHsKKyAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgeworICAgICAgY2FzZSAnXCcnOgorICAgICAgICAqd3NPdXRwdXQgKz0gR2V0TGl0ZXJhbFRleHQoc3RyZiwgJmNjZiwgbGVuZik7CisgICAgICAgIGNjZisrOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJzknOgorICAgICAgICBpZiAoY2MgPCBsZW4pIHsKKyAgICAgICAgICBpZiAoIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgICAgKndzT3V0cHV0ICs9IHN0cltjY107CisgICAgICAgICAgY2MrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAqd3NPdXRwdXQgKz0gTCcwJzsKKyAgICAgICAgfQorICAgICAgICBjY2YrKzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICd6JzoKKyAgICAgICAgaWYgKGNjIDwgbGVuKSB7CisgICAgICAgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICp3c091dHB1dCArPSBzdHJbY2NdOworICAgICAgICAgIGNjKys7CisgICAgICAgIH0KKyAgICAgICAgY2NmKys7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnWic6CisgICAgICAgIGlmIChjYyA8IGxlbikgeworICAgICAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgICAqd3NPdXRwdXQgKz0gc3RyW2NjXTsKKyAgICAgICAgICBjYysrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICp3c091dHB1dCArPSBMJzAnOworICAgICAgICB9CisgICAgICAgIGNjZisrOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ0UnOiB7CisgICAgICAgICp3c091dHB1dCArPSBXaWRlU3RyaW5nOjpGb3JtYXQoTCJFJStkIiwgZXhwb25lbnQpOworICAgICAgICBjY2YrKzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlICckJzoKKyAgICAgICAgKndzT3V0cHV0ICs9CisgICAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfQ3VycmVuY3lTeW1ib2wpOworICAgICAgICBjY2YrKzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdjJzoKKyAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ3InKSB7CisgICAgICAgICAgaWYgKGJOZWcpCisgICAgICAgICAgICAqd3NPdXRwdXQgKz0gTCJDUiI7CisKKyAgICAgICAgICBjY2YgKz0gMjsKKyAgICAgICAgICBiQWRkTmVnID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ0MnOgorICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAnUicpIHsKKyAgICAgICAgICAqd3NPdXRwdXQgKz0gYk5lZyA/IEwiQ1IiIDogTCIgICI7CisgICAgICAgICAgY2NmICs9IDI7CisgICAgICAgICAgYkFkZE5lZyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdkJzoKKyAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ2InKSB7CisgICAgICAgICAgaWYgKGJOZWcpCisgICAgICAgICAgICAqd3NPdXRwdXQgKz0gTCJkYiI7CisKKyAgICAgICAgICBjY2YgKz0gMjsKKyAgICAgICAgICBiQWRkTmVnID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ0QnOgorICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAnQicpIHsKKyAgICAgICAgICAqd3NPdXRwdXQgKz0gYk5lZyA/IEwiREIiIDogTCIgICI7CisgICAgICAgICAgY2NmICs9IDI7CisgICAgICAgICAgYkFkZE5lZyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICclJzoKKyAgICAgICAgKndzT3V0cHV0ICs9IHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50KTsKKyAgICAgICAgY2NmKys7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnOCc6CisgICAgICAgIHdoaWxlIChjY2YgPCBsZW5mICYmIHN0cmZbY2NmXSA9PSAnOCcpCisgICAgICAgICAgY2NmKys7CisgICAgICAgIHdoaWxlIChjYyA8IGxlbiAmJiBGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgeworICAgICAgICAgICp3c091dHB1dCArPSBzdHJbY2NdOworICAgICAgICAgIGNjKys7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICcsJzoKKyAgICAgICAgKndzT3V0cHV0ICs9IHdzR3JvdXBTeW1ib2w7CisgICAgICAgIGNjZisrOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJygnOgorICAgICAgICAqd3NPdXRwdXQgKz0gYk5lZyA/ICcoJyA6ICcgJzsKKyAgICAgICAgYkFkZE5lZyA9IHRydWU7CisgICAgICAgIGNjZisrOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJyknOgorICAgICAgICAqd3NPdXRwdXQgKz0gYk5lZyA/ICcpJyA6ICcgJzsKKyAgICAgICAgY2NmKys7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgY2NmKys7CisgICAgfQorICB9CisgIGlmICghYkFkZE5lZyAmJiBiTmVnKSB7CisgICAgKndzT3V0cHV0ID0gcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzKSArCisgICAgICAgICAgICAgICAgKCp3c091dHB1dClbMF0gKyB3c091dHB1dC0+UmlnaHQod3NPdXRwdXQtPkdldExlbmd0aCgpIC0gMSk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ0ZHQVNfRm9ybWF0U3RyaW5nOjpGb3JtYXROdW0oY29uc3QgV2lkZVN0cmluZyYgd3NTcmNOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyogd3NPdXRwdXQpIHsKKyAgaWYgKHdzU3JjTnVtLklzRW1wdHkoKSB8fCB3c1BhdHRlcm4uSXNFbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIEZvcm1hdFN0ck51bSh3c1NyY051bS5Bc1N0cmluZ1ZpZXcoKSwgd3NQYXR0ZXJuLCB3c091dHB1dCk7Cit9CisKK2Jvb2wgQ0ZHQVNfRm9ybWF0U3RyaW5nOjpGb3JtYXREYXRlVGltZShjb25zdCBXaWRlU3RyaW5nJiB3c1NyY0RhdGVUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EQVRFVElNRVRZUEUgZURhdGVUaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nKiB3c091dHB1dCkgeworICBpZiAod3NTcmNEYXRlVGltZS5Jc0VtcHR5KCkgfHwgd3NQYXR0ZXJuLklzRW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgV2lkZVN0cmluZyB3c0RhdGVQYXR0ZXJuOworICBXaWRlU3RyaW5nIHdzVGltZVBhdHRlcm47CisgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBudWxscHRyOworICBGWF9EQVRFVElNRVRZUEUgZUNhdGVnb3J5ID0KKyAgICAgIEdldERhdGVUaW1lRm9ybWF0KHdzUGF0dGVybiwgJnBMb2NhbGUsICZ3c0RhdGVQYXR0ZXJuLCAmd3NUaW1lUGF0dGVybik7CisgIGlmICghcExvY2FsZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKGVDYXRlZ29yeSA9PSBGWF9EQVRFVElNRVRZUEVfVW5rbm93bikgeworICAgIGlmIChlRGF0ZVRpbWVUeXBlID09IEZYX0RBVEVUSU1FVFlQRV9UaW1lKSB7CisgICAgICB3c1RpbWVQYXR0ZXJuID0gd3NEYXRlUGF0dGVybjsKKyAgICAgIHdzRGF0ZVBhdHRlcm4uY2xlYXIoKTsKKyAgICB9CisgICAgZUNhdGVnb3J5ID0gZURhdGVUaW1lVHlwZTsKKyAgfQorICBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9Vbmtub3duKQorICAgIHJldHVybiBmYWxzZTsKKworICBDRlhfRGF0ZVRpbWUgZHQ7CisgIGF1dG8gaVQgPSB3c1NyY0RhdGVUaW1lLkZpbmQoTCJUIik7CisgIGlmICghaVQuaGFzX3ZhbHVlKCkpIHsKKyAgICBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9EYXRlICYmCisgICAgICAgIEZYX0RhdGVGcm9tQ2Fub25pY2FsKHdzU3JjRGF0ZVRpbWUsICZkdCkpIHsKKyAgICAgICp3c091dHB1dCA9IEZvcm1hdERhdGVUaW1lSW50ZXJuYWwoZHQsIHdzRGF0ZVBhdHRlcm4sIHdzVGltZVBhdHRlcm4sIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMb2NhbGUpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChlQ2F0ZWdvcnkgPT0gRlhfREFURVRJTUVUWVBFX1RpbWUgJiYKKyAgICAgICAgRlhfVGltZUZyb21DYW5vbmljYWwod3NTcmNEYXRlVGltZS5Bc1N0cmluZ1ZpZXcoKSwgJmR0LCBwTG9jYWxlKSkgeworICAgICAgKndzT3V0cHV0ID0gRm9ybWF0RGF0ZVRpbWVJbnRlcm5hbChkdCwgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybiwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgV2lkZVN0cmluZyB3c1NyY0RhdGUod3NTcmNEYXRlVGltZS5jX3N0cigpLCBpVC52YWx1ZSgpKTsKKyAgICBXaWRlU3RyaW5nVmlldyB3c1NyY1RpbWUod3NTcmNEYXRlVGltZS5jX3N0cigpICsgaVQudmFsdWUoKSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzU3JjRGF0ZVRpbWUuR2V0TGVuZ3RoKCkgLSBpVC52YWx1ZSgpIC0gMSk7CisgICAgaWYgKHdzU3JjRGF0ZS5Jc0VtcHR5KCkgfHwgd3NTcmNUaW1lLklzRW1wdHkoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoRlhfRGF0ZUZyb21DYW5vbmljYWwod3NTcmNEYXRlLCAmZHQpICYmCisgICAgICAgIEZYX1RpbWVGcm9tQ2Fub25pY2FsKHdzU3JjVGltZSwgJmR0LCBwTG9jYWxlKSkgeworICAgICAgKndzT3V0cHV0ID0gRm9ybWF0RGF0ZVRpbWVJbnRlcm5hbChkdCwgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNhdGVnb3J5ICE9IEZYX0RBVEVUSU1FVFlQRV9UaW1lRGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENGR0FTX0Zvcm1hdFN0cmluZzo6Rm9ybWF0WmVybyhjb25zdCBXaWRlU3RyaW5nJiB3c1BhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nKiB3c091dHB1dCkgeworICBpZiAod3NQYXR0ZXJuLklzRW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgV2lkZVN0cmluZyB3c1RleHRGb3JtYXQgPSBHZXRUZXh0Rm9ybWF0KHdzUGF0dGVybiwgTCJ6ZXJvIik7CisgIGludDMyX3QgaVBhdHRlcm4gPSAwOworICBjb25zdCB3Y2hhcl90KiBwU3RyUGF0dGVybiA9IHdzVGV4dEZvcm1hdC5jX3N0cigpOworICBpbnQzMl90IGlMZW5QYXR0ZXJuID0gd3NUZXh0Rm9ybWF0LkdldExlbmd0aCgpOworICB3aGlsZSAoaVBhdHRlcm4gPCBpTGVuUGF0dGVybikgeworICAgIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gPT0gJ1wnJykgeworICAgICAgKndzT3V0cHV0ICs9IEdldExpdGVyYWxUZXh0KHBTdHJQYXR0ZXJuLCAmaVBhdHRlcm4sIGlMZW5QYXR0ZXJuKTsKKyAgICAgIGlQYXR0ZXJuKys7CisgICAgfSBlbHNlIHsKKyAgICAgICp3c091dHB1dCArPSBwU3RyUGF0dGVybltpUGF0dGVybisrXTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ0ZHQVNfRm9ybWF0U3RyaW5nOjpGb3JtYXROdWxsKGNvbnN0IFdpZGVTdHJpbmcmIHdzUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcqIHdzT3V0cHV0KSB7CisgIGlmICh3c1BhdHRlcm4uSXNFbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBXaWRlU3RyaW5nIHdzVGV4dEZvcm1hdCA9IEdldFRleHRGb3JtYXQod3NQYXR0ZXJuLCBMIm51bGwiKTsKKyAgaW50MzJfdCBpUGF0dGVybiA9IDA7CisgIGNvbnN0IHdjaGFyX3QqIHBTdHJQYXR0ZXJuID0gd3NUZXh0Rm9ybWF0LmNfc3RyKCk7CisgIGludDMyX3QgaUxlblBhdHRlcm4gPSB3c1RleHRGb3JtYXQuR2V0TGVuZ3RoKCk7CisgIHdoaWxlIChpUGF0dGVybiA8IGlMZW5QYXR0ZXJuKSB7CisgICAgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSA9PSAnXCcnKSB7CisgICAgICAqd3NPdXRwdXQgKz0gR2V0TGl0ZXJhbFRleHQocFN0clBhdHRlcm4sICZpUGF0dGVybiwgaUxlblBhdHRlcm4pOworICAgICAgaVBhdHRlcm4rKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICAqd3NPdXRwdXQgKz0gcFN0clBhdHRlcm5baVBhdHRlcm4rK107CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS94ZmEvZmdhcy9jcnQvY2ZnYXNfZm9ybWF0c3RyaW5nLmggYi94ZmEvZmdhcy9jcnQvY2ZnYXNfZm9ybWF0c3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVhZTI1ZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9mZ2FzL2NydC9jZmdhc19mb3JtYXRzdHJpbmcuaApAQCAtMCwwICsxLDczIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZHQVNfQ1JUX0NGR0FTX0ZPUk1BVFNUUklOR19IXworI2RlZmluZSBYRkFfRkdBU19DUlRfQ0ZHQVNfRk9STUFUU1RSSU5HX0hfCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2lmeF9sb2NhbGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGVtZ3IuaCIKKworYm9vbCBGWF9EYXRlRnJvbUNhbm9uaWNhbChjb25zdCBXaWRlU3RyaW5nJiB3c0RhdGUsIENGWF9EYXRlVGltZSogZGF0ZXRpbWUpOworYm9vbCBGWF9UaW1lRnJvbUNhbm9uaWNhbChjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRGF0ZVRpbWUqIGRhdGV0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlKTsKKworY2xhc3MgQ0ZHQVNfRm9ybWF0U3RyaW5nIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENGR0FTX0Zvcm1hdFN0cmluZyhDWEZBX0xvY2FsZU1nciogcExvY2FsZU1ncik7CisgIH5DRkdBU19Gb3JtYXRTdHJpbmcoKTsKKworICB2b2lkIFNwbGl0Rm9ybWF0U3RyaW5nKGNvbnN0IFdpZGVTdHJpbmcmIHdzRm9ybWF0U3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFdpZGVTdHJpbmc+KiB3c1BhdHRlcm5zKTsKKyAgRlhfTE9DQUxFQ0FURUdPUlkgR2V0Q2F0ZWdvcnkoY29uc3QgV2lkZVN0cmluZyYgd3NQYXR0ZXJuKTsKKworICBib29sIFBhcnNlVGV4dChjb25zdCBXaWRlU3RyaW5nJiB3c1NyY1RleHQsCisgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyogd3NWYWx1ZSk7CisgIGJvb2wgUGFyc2VOdW0oY29uc3QgV2lkZVN0cmluZyYgd3NTcmNOdW0sCisgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NQYXR0ZXJuLAorICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcqIHdzVmFsdWUpOworICBib29sIFBhcnNlRGF0ZVRpbWUoY29uc3QgV2lkZVN0cmluZyYgd3NTcmNEYXRlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRSBlRGF0ZVRpbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RhdGVUaW1lKiBkdFZhbHVlKTsKKyAgYm9vbCBQYXJzZVplcm8oY29uc3QgV2lkZVN0cmluZyYgd3NTcmNUZXh0LCBjb25zdCBXaWRlU3RyaW5nJiB3c1BhdHRlcm4pOworICBib29sIFBhcnNlTnVsbChjb25zdCBXaWRlU3RyaW5nJiB3c1NyY1RleHQsIGNvbnN0IFdpZGVTdHJpbmcmIHdzUGF0dGVybik7CisKKyAgYm9vbCBGb3JtYXRUZXh0KGNvbnN0IFdpZGVTdHJpbmcmIHdzU3JjVGV4dCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcqIHdzT3V0cHV0KTsKKyAgYm9vbCBGb3JtYXROdW0oY29uc3QgV2lkZVN0cmluZyYgd3NTcmNOdW0sCisgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyogd3NPdXRwdXQpOworICBib29sIEZvcm1hdERhdGVUaW1lKGNvbnN0IFdpZGVTdHJpbmcmIHdzU3JjRGF0ZVRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRSBlRGF0ZVRpbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcqIHdzT3V0cHV0KTsKKyAgYm9vbCBGb3JtYXRaZXJvKGNvbnN0IFdpZGVTdHJpbmcmIHdzUGF0dGVybiwgV2lkZVN0cmluZyogd3NPdXRwdXQpOworICBib29sIEZvcm1hdE51bGwoY29uc3QgV2lkZVN0cmluZyYgd3NQYXR0ZXJuLCBXaWRlU3RyaW5nKiB3c091dHB1dCk7CisKKyBwcml2YXRlOgorICBXaWRlU3RyaW5nIEdldFRleHRGb3JtYXQoY29uc3QgV2lkZVN0cmluZyYgd3NQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzQ2F0ZWdvcnkpOworICBJRlhfTG9jYWxlKiBHZXROdW1lcmljRm9ybWF0KGNvbnN0IFdpZGVTdHJpbmcmIHdzUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBpRG90SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGR3U3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyogd3NQdXJnZVBhdHRlcm4pOworICBib29sIEZvcm1hdFN0ck51bShjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NJbnB1dE51bSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nKiB3c091dHB1dCk7CisgIEZYX0RBVEVUSU1FVFlQRSBHZXREYXRlVGltZUZvcm1hdChjb25zdCBXaWRlU3RyaW5nJiB3c1BhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiogcExvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcqIHdzRGF0ZVBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nKiB3c1RpbWVQYXR0ZXJuKTsKKworICBDWEZBX0xvY2FsZU1nciogbV9wTG9jYWxlTWdyOworfTsKKworI2VuZGlmICAvLyBYRkFfRkdBU19DUlRfQ0ZHQVNfRk9STUFUU1RSSU5HX0hfCmRpZmYgLS1naXQgYS94ZmEvZmdhcy9jcnQvY2ZnYXNfZm9ybWF0c3RyaW5nX3VuaXR0ZXN0LmNwcCBiL3hmYS9mZ2FzL2NydC9jZmdhc19mb3JtYXRzdHJpbmdfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYzAwMTAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZmdhcy9jcnQvY2ZnYXNfZm9ybWF0c3RyaW5nX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDY2MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2ZnYXMvY3J0L2NmZ2FzX2Zvcm1hdHN0cmluZy5oIgorCisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2NwZGZfbW9kdWxlbWdyLmgiCisjaW5jbHVkZSAidGVzdGluZy9meF9zdHJpbmdfdGVzdGhlbHBlcnMuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGVtZ3IuaCIKKworY2xhc3MgQ0ZHQVNfRm9ybWF0U3RyaW5nVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIENGR0FTX0Zvcm1hdFN0cmluZ1Rlc3QoKSB7CisgICAgU2V0VFooIlVUQyIpOworICAgIENQREZfTW9kdWxlTWdyOjpHZXQoKS0+SW5pdCgpOworICB9CisKKyAgfkNGR0FTX0Zvcm1hdFN0cmluZ1Rlc3QoKSBvdmVycmlkZSB7IENQREZfTW9kdWxlTWdyOjpHZXQoKS0+RGVzdHJveSgpOyB9CisKKyAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICBmbXRfLnJlc2V0KCk7CisgICAgbWdyXy5yZXNldCgpOworICB9CisKKyAgdm9pZCBTZXRUWihjb25zdCBjaGFyKiB0eikgeworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisgICAgX3B1dGVudl9zKCJUWiIsIHR6KTsKKyAgICBfdHpzZXQoKTsKKyNlbHNlCisgICAgc2V0ZW52KCJUWiIsIHR6LCAxKTsKKyAgICB0enNldCgpOworI2VuZGlmCisgIH0KKworICAvLyBOb3RlLCB0aGlzIHJlLWNyZWF0ZXMgdGhlIGZtdCBvbiBlYWNoIGNhbGwuIElmIHlvdSBuZWVkIHRvIG11bHRpcGxlCisgIC8vIHRpbWVzIHN0b3JlIGl0IGxvY2FsbHkuCisgIENGR0FTX0Zvcm1hdFN0cmluZyogZm10KGNvbnN0IFdpZGVTdHJpbmcmIGxvY2FsZSkgeworICAgIG1ncl8gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Mb2NhbGVNZ3I+KG51bGxwdHIsIGxvY2FsZSk7CisgICAgZm10XyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRkdBU19Gb3JtYXRTdHJpbmc+KG1ncl8uZ2V0KCkpOworICAgIHJldHVybiBmbXRfLmdldCgpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0xvY2FsZU1ncj4gbWdyXzsKKyAgc3RkOjp1bmlxdWVfcHRyPENGR0FTX0Zvcm1hdFN0cmluZz4gZm10XzsKK307CisKKy8vIFRPRE8oZHNpbmNsYWlyKTogTG9va3MgbGlrZSB0aGUgZm9ybWF0dGVyL3BhcnNlciBkb2VzIG5vdCBoYW5kbGUgdGhlIHZhcmlvdXMKKy8vICdnJyBmbGFncy4KK1RFU1RfRihDRkdBU19Gb3JtYXRTdHJpbmdUZXN0LCBEYXRlRm9ybWF0KSB7CisgIHN0cnVjdCB7CisgICAgY29uc3Qgd2NoYXJfdCogbG9jYWxlOworICAgIGNvbnN0IHdjaGFyX3QqIGlucHV0OworICAgIGNvbnN0IHdjaGFyX3QqIHBhdHRlcm47CisgICAgY29uc3Qgd2NoYXJfdCogb3V0cHV0OworICB9IHRlc3RzW10gPSB7CisgICAgICB7TCJlbiIsIEwiMjAwMi0xMC0yNSIsIEwiTU1NTSBERCwgWVlZWSIsIEwiT2N0b2JlciAyNSwgMjAwMiJ9LAorICAgICAgLy8gTm90ZSwgdGhpcyBpcyBpbiB0aGUgZG9jIGFzIDUgYnV0IGl0J3Mgd3JvbmcgYW5kIHNob3VsZCBiZSAzIGJ5IHRoZQorICAgICAgLy8gZXhhbXBsZSBpbiB0aGUgUGljdHVyZSBDbGF1c2UgUmVmZXJlbmNlIHNlY3Rpb24uCisgICAgICB7TCJlbiIsIEwiMjAwNDA3MjIiLCBMIidXZWVrIG9mIHRoZSBtb250aCBpcycgdyIsCisgICAgICAgTCJXZWVrIG9mIHRoZSBtb250aCBpcyAzIn0sCisgICAgICB7TCJlbiIsIEwiMjAwNDA3MjIiLCBMImUgJ2RheXMgYWZ0ZXIgU3VuZGF5JyIsIEwiNCBkYXlzIGFmdGVyIFN1bmRheSJ9LAorICAgICAge0wiZW4iLCBMIjIwMDQwNzIyIiwgTCJZWVlZLSdXJ1dXLWUiLCBMIjIwMDQtVzMwLTQifSwKKyAgICAgIHtMImVuIiwgTCIyMDA0MDcyMiIsIEwiRSAnZGF5cyBhZnRlciBTYXR1cmRheSciLAorICAgICAgIEwiNSBkYXlzIGFmdGVyIFNhdHVyZGF5In0sCisgICAgICB7TCJlbiIsIEwiMjAwMC0wMS0wMSIsIEwiRUVFLCAndGhlJyBEICdvZicgTU1NTSwgWVlZWSIsCisgICAgICAgTCJTYXQsIHRoZSAxIG9mIEphbnVhcnksIDIwMDAifSwKKyAgICAgIHtMImVuIiwgTCIyMDAwLTAxLTAxIiwgTCJFRUVFLCAndGhlJyBEICdvZicgTU1NTSwgWVlZWSIsCisgICAgICAgTCJTYXR1cmRheSwgdGhlIDEgb2YgSmFudWFyeSwgMjAwMCJ9LAorICAgICAge0wiZW4iLCBMIjE5OTkxMjAyIiwgTCJNTS9EL1lZIiwgTCIxMi8yLzk5In0sCisgICAgICB7TCJlbiIsIEwiMTk5OTAxMTAiLCBMIk1NTSBELCBZWVlZIiwgTCJKYW4gMTAsIDE5OTkifSwKKyAgICAgIHtMImVuIiwgTCIxOTk5MDIwMiIsIEwiSiIsIEwiMzMifSwKKyAgICAgIHtMImVuIiwgTCIxOTk5MDIwMiIsIEwiSkpKIiwgTCIwMzMifSwKKyAgICAgIHtMImVuIiwgTCIxOTk5MTIzMSIsIEwiSiIsIEwiMzY1In0sCisgICAgICB7TCJlbiIsIEwiMjAwMDEyMzEiLCBMIkoiLCBMIjM2NiJ9LAorICAgICAge0wiZW4iLCBMIjE5OTkwNTAxIiwgTCJKIiwgTCIxMjEifSwKKyAgICAgIHtMImVuIiwgTCIxOTk5MDkwMSIsIEwiSiIsIEwiMjQ0In0sCisgICAgICB7TCJlbiIsIEwiMTk5OTAyMjgiLCBMIkoiLCBMIjU5In0sCisgICAgICB7TCJlbiIsIEwiMjAwMDAyMjkiLCBMIkoiLCBMIjYwIn0sCisgICAgICB7TCJlbiIsIEwiMjEwMDA1MDEiLCBMIkoiLCBMIjEyMSJ9LAorICAgICAge0wiZW4iLCBMIjE5OTkwMTAyIiwgTCJNIiwgTCIxIn0sCisgICAgICB7TCJlbiIsIEwiMTk5OTAxMDIiLCBMIk1NTSIsIEwiSmFuIn0sCisgICAgICB7TCJlbiIsIEwiMTk5OTAxMDIiLCBMIllZWVkgRyIsIEwiMTk5OSBBRCJ9LAorICAgICAgLy8gV2VlayAwMSBvZiB0aGUgeWVhciBpcyB0aGUgd2VlayBjb250YWluaW5nIEphbiAwNC4KKyAgICAgIC8vIHtMImVuIiwgTCIxOTk5MDEwMiIsIEwiV1ciLCBMIjAwIn0sICAtLSBSZXR1cm5zIDAxIGluY29ycmVjdGx5CisgICAgICAvLyB7TCJlbiIsIEwiMTk5OTAxMDQiLCBMIldXIiwgTCIwMSJ9LCAgLS0gUmV0dXJucyAwMiBpbmNvcnJlY3RseQorICAgICAgLy8gVGhlID8qKyBzaG91bGQgZm9ybWF0IGFzIHdoaXRlc3BhY2UuCisgICAgICAvLyB7TCJlbiIsIEwiMTk5OTAxMDQiLCBMIllZWVk/KitNTSIsIEwiMTk5OSAgIDAxIn0sCisgICAgICAvLyB7TCJlbiIsIEwiMTk5OS0wNy0xNiIsIEwiZGF0ZXtERC9NTS9ZWX0gJygnZGF0ZXtNTU0gREQsIFlZWVl9JyknIiwKKyAgICAgIC8vICBMIjE2LzA3Lzk5IChKdWwgMTYsIDE5OTkpIn0sCisgICAgICB7TCJkZV9DSCIsIEwiMjAwNDEwMzAiLCBMIkQuIE1NTU0gWVlZWSIsIEwiMzAuIE9rdG9iZXIgMjAwNCJ9LAorICAgICAge0wiZnJfQ0EiLCBMIjIwMDQxMDMwIiwgTCJEIE1NTU0gWVlZWSIsIEwiMzAgb2N0b2JyZSAyMDA0In0sCisgICAgICB7TCJlbiIsIEwiMjAwMi0xMC0yNSIsIEwiZGF0ZShmcil7REQgTU1NTSwgWVlZWX0iLCBMIjI1IG9jdG9icmUsIDIwMDIifSwKKyAgICAgIHtMImVuIiwgTCIyMDAyLTEwLTI1IiwgTCJkYXRlKGVzKXtFRUVFLCBEICdkZScgTU1NTSAnZGUnIFlZWVl9IiwKKyAgICAgICBMInZpZXJuZXMsIDI1IGRlIG9jdHVicmUgZGUgMjAwMiJ9LAorICAgICAgLy8ge0wiZW4iLCBMIjIwMDItMjAtMjUiLCBMImRhdGUubG9uZyhmcikoKSIsIEwiMjUgb2N0b2JyZSwgMjAwMiJ9LAorICAgICAgLy8ge0wiamEiLCBMIjIwMDMtMTEtMDMiLCBMImdZL00vRCIsIEwiSDE1LzExLzMifSwKKyAgICAgIC8vIHtMImphIiwgTCIxOTg5LTAxLTA4IiwgTCJnZ1ktTS1EIiwgTCJcdTVlNzMxLTEtOCJ9LAorICAgICAgLy8ge0wiamEiLCBMIjE5ODktMTEtMDMiLCBMImdnZ1lZL01NL0REIiwgTCJcdTVlNzNcdTYyMTA4OS8xMS8wMyJ9LAorICB9OworICAvLyBOb3RlLCBub25lIG9mIHRoZSBmdWxsIHdpZHRoIGRhdGUgc3ltYm9scyBhcmUgbGlzdGVkIGhlcmUKKyAgLy8gYXMgdGhleSBhcmUgbm90IHN1cHBvcnRlZC4gSW4gdGhlb3J5IHRoZXJlIGFyZSB0aGUgZnVsbCB3aWR0aCB2ZXJzaW9ucworICAvLyBvZiBEREQsIEREREQsIE1NTSwgTU1NTSwgRSwgZSwgZ2csIFlZWSwgWVlZWVkuCisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBXaWRlU3RyaW5nIHJlc3VsdDsKKyAgICBFWFBFQ1RfVFJVRShmbXQodGVzdHNbaV0ubG9jYWxlKQorICAgICAgICAgICAgICAgICAgICAtPkZvcm1hdERhdGVUaW1lKHRlc3RzW2ldLmlucHV0LCB0ZXN0c1tpXS5wYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRV9EYXRlLCAmcmVzdWx0KSk7CisgICAgRVhQRUNUX1NUUkVRKHRlc3RzW2ldLm91dHB1dCwgcmVzdWx0LmNfc3RyKCkpIDw8ICIgVEVTVDogIiA8PCBpOworICB9Cit9CisKK1RFU1RfRihDRkdBU19Gb3JtYXRTdHJpbmdUZXN0LCBUaW1lRm9ybWF0KSB7CisgIHN0cnVjdCB7CisgICAgY29uc3Qgd2NoYXJfdCogbG9jYWxlOworICAgIGNvbnN0IHdjaGFyX3QqIGlucHV0OworICAgIGNvbnN0IHdjaGFyX3QqIHBhdHRlcm47CisgICAgY29uc3Qgd2NoYXJfdCogb3V0cHV0OworICB9IHRlc3RzW10gPSB7e0wiZW4iLCBMIjAxOjAxOjExIiwgTCJoOk0gQSIsIEwiMToxIEFNIn0sCisgICAgICAgICAgICAgICB7TCJlbiIsIEwiMTM6MDE6MTEiLCBMImg6TSBBIiwgTCIxOjEgUE0ifSwKKyAgICAgICAgICAgICAgIHtMImVuIiwgTCIwMTowMToxMSIsIEwiaGg6TU06U1MgQSIsIEwiMDE6MDE6MTEgQU0ifSwKKyAgICAgICAgICAgICAgIHtMImVuIiwgTCIxMzowMToxMSIsIEwiaGg6TU06U1MgQSIsIEwiMDE6MDE6MTEgUE0ifSwKKyAgICAgICAgICAgICAgIHtMImVuIiwgTCIwMTowMToxMSIsIEwiaGg6TU06U1MgQSBaIiwgTCIwMTowMToxMSBBTSBHTVQtMDI6MDAifSwKKyAgICAgICAgICAgICAgIHtMImVuIiwgTCIwMTowMToxMSIsIEwiaGg6TU06U1MgQSB6IiwgTCIwMTowMToxMSBBTSAtMDI6MDAifSwKKyAgICAgICAgICAgICAgIC8vIHtMImVuIiwgTCIwMTowMToxMSIsIEwiaGg6TU06U1MgQSB6eiIsIEwiMDE6MDE6MTEgQU0gR01UIn0sCisgICAgICAgICAgICAgICAvLyBTaG91bGQgY2hhbmdlID8qKyBpbnRvICcgJyB3aGVuIGZvcm1hdHRpbmcuCisgICAgICAgICAgICAgICAvLyB7TCJlbiIsIEwiMDE6MDE6MTEiLCBMImhoOk1NOlNTPyorQSIsIEwiMDE6MDE6MTEgICBBTSJ9LAorICAgICAgICAgICAgICAge0wiZW4iLCBMIjEyOjAxOjAxIiwgTCJrOk1NOlNTIiwgTCIxMjowMTowMSJ9LAorICAgICAgICAgICAgICAge0wiZW4iLCBMIjE0OjAxOjAxIiwgTCJrOk1NOlNTIiwgTCIyOjAxOjAxIn0sCisgICAgICAgICAgICAgICB7TCJlbiIsIEwiMTI6MDE6MTEiLCBMImtrOk1NIiwgTCIxMjowMSJ9LAorICAgICAgICAgICAgICAge0wiZW4iLCBMIjE0OjAxOjExIiwgTCJrazpNTSIsIEwiMDI6MDEifSwKKyAgICAgICAgICAgICAgIHtMImVuIiwgTCIxMjowMToxMSArMDQ6MzAiLCBMImtrOk1NIiwgTCIwNTozMSJ9LAorICAgICAgICAgICAgICAge0wiZW4iLCBMIjEyOjAxOjExIiwgTCJrazpNTSBBIiwgTCIxMjowMSBQTSJ9LAorICAgICAgICAgICAgICAge0wiZW4iLCBMIjAwOjAxOjAxIiwgTCJIOk06UyIsIEwiMDoxOjEifSwKKyAgICAgICAgICAgICAgIHtMImVuIiwgTCIxMzowMjoxMSIsIEwiSDpNOlMiLCBMIjEzOjI6MTEifSwKKyAgICAgICAgICAgICAgIHtMImVuIiwgTCIwMDowMToxMS4wMDEiLCBMIkhIOk06Uy5GRkYiLCBMIjAwOjE6MTEuMDAxIn0sCisgICAgICAgICAgICAgICB7TCJlbiIsIEwiMTM6MDI6MTEiLCBMIkhIOk0iLCBMIjEzOjIifSwKKyAgICAgICAgICAgICAgIHtMImVuIiwgTCIwMDowMToxMSIsIEwiSzpNIiwgTCIyNDoxIn0sCisgICAgICAgICAgICAgICB7TCJlbiIsIEwiMDA6MDI6MTEiLCBMIktLOk0iLCBMIjI0OjIifSwKKyAgICAgICAgICAgICAgIHtMImVuIiwgTCIxMToxMToxMSIsIEwiSEg6TU06U1MgJ28nJ2Nsb2NrJyBBIFoiLAorICAgICAgICAgICAgICAgIEwiMTE6MTE6MTEgbydjbG9jayBBTSBHTVQtMDI6MDAifSwKKyAgICAgICAgICAgICAgIHtMImVuIiwgTCIxNDozMDo1OSIsIEwiaDpNTSBBIiwgTCIyOjMwIFBNIn0sCisgICAgICAgICAgICAgICB7TCJlbiIsIEwiMTQ6MzA6NTkiLCBMIkhIOk1NOlNTIEEgWiIsIEwiMTQ6MzA6NTkgUE0gR01ULTAyOjAwIn19OworICAvLyBOb3RlLCBub25lIG9mIHRoZSBmdWxsIHdpZHRoIHRpbWUgc3ltYm9scyBhcmUgbGlzdGVkIGhlcmUKKyAgLy8gYXMgdGhleSBhcmUgbm90IHN1cHBvcnRlZC4gSW4gdGhlb3J5IHRoZXJlIGFyZSB0aGUgZnVsbAorICAvLyB3aWR0aCB2ZXJzaW9ucyBvZiBra2ssIGtra2ssIEhISCwgSEhISCwgS0tLLCBLS0tLLCBNTU0sIE1NTU0sCisgIC8vIFNTUywgU1NTUyBwbHVzIDIgbW9yZSB0aGF0IHRoZSBzcGVjIGFwcGFyZW50bHkgZm9yZ290IHRvCisgIC8vIGxpc3QgdGhlIHN5bWJvbC4KKworICAvLyBUaGUgeiBtb2RpZmllciBvbmx5IGFwcGVuZHMgaWYgdGhlIFRaIGlzIG91dHNpZGUgb2YgKzAKKyAgU2V0VFooIlVUQysyIik7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBXaWRlU3RyaW5nIHJlc3VsdDsKKyAgICBFWFBFQ1RfVFJVRShmbXQodGVzdHNbaV0ubG9jYWxlKQorICAgICAgICAgICAgICAgICAgICAtPkZvcm1hdERhdGVUaW1lKHRlc3RzW2ldLmlucHV0LCB0ZXN0c1tpXS5wYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRV9UaW1lLCAmcmVzdWx0KSk7CisgICAgRVhQRUNUX1NUUkVRKHRlc3RzW2ldLm91dHB1dCwgcmVzdWx0LmNfc3RyKCkpIDw8ICIgVEVTVDogIiA8PCBpOworICB9CisKKyAgU2V0VFooIlVUQyIpOworfQorCitURVNUX0YoQ0ZHQVNfRm9ybWF0U3RyaW5nVGVzdCwgRGF0ZVRpbWVGb3JtYXQpIHsKKyAgc3RydWN0IHsKKyAgICBjb25zdCB3Y2hhcl90KiBsb2NhbGU7CisgICAgY29uc3Qgd2NoYXJfdCogaW5wdXQ7CisgICAgY29uc3Qgd2NoYXJfdCogcGF0dGVybjsKKyAgICBjb25zdCB3Y2hhcl90KiBvdXRwdXQ7CisgIH0gdGVzdHNbXSA9IHsKKyAgICAgIHtMImVuIiwgTCIxOTk5LTA3LTE2VDEwOjMwWiIsCisgICAgICAgTCInQXQnIHRpbWV7SEg6TU0gWn0gJ29uJyBkYXRle01NTSBERCwgWVlZWX0iLAorICAgICAgIEwiQXQgMTA6MzAgR01UIG9uIEp1bCAxNiwgMTk5OSJ9LAorICAgICAge0wiZW4iLCBMIjE5OTktMDctMTZUMTA6MzAiLCBMIidBdCcgdGltZXtISDpNTX0gJ29uJyBkYXRle01NTSBERCwgWVlZWX0iLAorICAgICAgIEwiQXQgMTA6MzAgb24gSnVsIDE2LCAxOTk5In0sCisgICAgICB7TCJlbiIsIEwiMTk5OS0wNy0xNlQxMDozMFoiLAorICAgICAgIEwidGltZXsnQXQnIEhIOk1NIFp9IGRhdGV7J29uJyBNTU0gREQsIFlZWVl9IiwKKyAgICAgICBMIkF0IDEwOjMwIEdNVCBvbiBKdWwgMTYsIDE5OTkifSwKKyAgICAgIHtMImVuIiwgTCIxOTk5LTA3LTE2VDEwOjMwWiIsCisgICAgICAgTCJ0aW1leydBdCAnSEg6TU0gWn1kYXRleycgb24gJ01NTSBERCwgWVlZWX0iLAorICAgICAgIEwiQXQgMTA6MzAgR01UIG9uIEp1bCAxNiwgMTk5OSJ9fTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIFdpZGVTdHJpbmcgcmVzdWx0OworICAgIEVYUEVDVF9UUlVFKGZtdCh0ZXN0c1tpXS5sb2NhbGUpCisgICAgICAgICAgICAgICAgICAgIC0+Rm9ybWF0RGF0ZVRpbWUodGVzdHNbaV0uaW5wdXQsIHRlc3RzW2ldLnBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfREFURVRJTUVUWVBFX1RpbWVEYXRlLCAmcmVzdWx0KSk7CisgICAgRVhQRUNUX1NUUkVRKHRlc3RzW2ldLm91dHB1dCwgcmVzdWx0LmNfc3RyKCkpIDw8ICIgVEVTVDogIiA8PCBpOworICB9Cit9CisKK1RFU1RfRihDRkdBU19Gb3JtYXRTdHJpbmdUZXN0LCBEYXRlUGFyc2UpIHsKKyAgc3RydWN0IHsKKyAgICBjb25zdCB3Y2hhcl90KiBsb2NhbGU7CisgICAgY29uc3Qgd2NoYXJfdCogaW5wdXQ7CisgICAgY29uc3Qgd2NoYXJfdCogcGF0dGVybjsKKyAgICBDRlhfRGF0ZVRpbWUgb3V0cHV0OworICB9IHRlc3RzW10gPSB7CisgICAgICB7TCJlbiIsIEwiMTIvMi85OSIsIEwiTU0vRC9ZWSIsIENGWF9EYXRlVGltZSgxOTk5LCAxMiwgMiwgMCwgMCwgMCwgMCl9LAorICAgICAge0wiZW4iLCBMIjIvMi85OSIsIEwiTS9EL1lZIiwgQ0ZYX0RhdGVUaW1lKDE5OTksIDIsIDIsIDAsIDAsIDAsIDApfSwKKyAgICAgIHtMImVuIiwgTCIyLzIvMTAiLCBMIk0vRC9ZWSIsIENGWF9EYXRlVGltZSgyMDEwLCAyLCAyLCAwLCAwLCAwLCAwKX0sCisgICAgICB7TCJlbiIsIEwiSmFuIDEwLCAxOTk5IiwgTCJNTU0gRCwgWVlZWSIsCisgICAgICAgQ0ZYX0RhdGVUaW1lKDE5OTksIDEsIDEwLCAwLCAwLCAwLCAwKX0sCisgICAgICB7TCJlbiIsIEwiSmFuIDEwLCAxOTk5IEFEIiwgTCJNTU0gRCwgWVlZWSBHIiwKKyAgICAgICBDRlhfRGF0ZVRpbWUoMTk5OSwgMSwgMTAsIDAsIDAsIDAsIDApfSwKKyAgICAgIC8vIFRPRE8oZHNpbmNsYWlyKTogU2hvdWxkIHRoaXMgYmUgLTIgaW5zdGVhZCBvZiAyPworICAgICAge0wiZW4iLCBMIkphbiAxMCwgMDAwMiBCQyIsIEwiTU1NIEQsIFlZWVkgRyIsCisgICAgICAgQ0ZYX0RhdGVUaW1lKDIsIDEsIDEwLCAwLCAwLCAwLCAwKX0sCisgICAgICB7TCJlbiIsIEwiT2N0b2JlciAyNSwgMjAwMiIsIEwiTU1NTSBERCwgWVlZWSIsCisgICAgICAgQ0ZYX0RhdGVUaW1lKDIwMDIsIDEwLCAyNSwgMCwgMCwgMCwgMCl9LAorICAgICAgLy8gVE9ETyhkc2luY2xhaXIpOiBUaGUgSiBhbmQgSkpKIGFyZSBpZ25vcmVkIGR1cmluZyBwYXJzaW5nIHdoZW4gdGhleQorICAgICAgLy8gY291bGQgYmUgdHVybmVkIGJhY2sgaW50byBhIGRhdGUuCisgICAgICB7TCJlbiIsIEwiMTk5OS0zMyIsIEwiWVlZWS1KIiwgQ0ZYX0RhdGVUaW1lKDE5OTksIDEsIDEsIDAsIDAsIDAsIDApfSwKKyAgICAgIHtMImVuIiwgTCIxOTk5LTAzMyIsIEwiWVlZWS1KSkoiLCBDRlhfRGF0ZVRpbWUoMTk5OSwgMSwgMSwgMCwgMCwgMCwgMCl9LAorICAgICAge0wiZGVfQ0giLCBMIjMwLiBPa3RvYmVyIDIwMDQiLCBMIkQuIE1NTU0gWVlZWSIsCisgICAgICAgQ0ZYX0RhdGVUaW1lKDIwMDQsIDEwLCAzMCwgMCwgMCwgMCwgMCl9LAorICAgICAge0wiZnJfQ0EiLCBMIjMwIG9jdG9icmUgMjAwNCIsIEwiRCBNTU1NIFlZWVkiLAorICAgICAgIENGWF9EYXRlVGltZSgyMDA0LCAxMCwgMzAsIDAsIDAsIDAsIDApfSwKKyAgICAgIHtMImVuIiwgTCJTYXR1cmRheSwgdGhlIDEgb2YgSmFudWFyeSwgMjAwMCIsCisgICAgICAgTCJFRUVFLCAndGhlJyBEICdvZicgTU1NTSwgWVlZWSIsIENGWF9EYXRlVGltZSgyMDAwLCAxLCAxLCAwLCAwLCAwLCAwKX0sCisgICAgICB7TCJlbiIsIEwiU2F0LCB0aGUgMSBvZiBKYW51YXJ5LCAyMDAwIiwgTCJFRUUsICd0aGUnIEQgJ29mJyBNTU1NLCBZWVlZIiwKKyAgICAgICBDRlhfRGF0ZVRpbWUoMjAwMCwgMSwgMSwgMCwgMCwgMCwgMCl9LAorICAgICAge0wiZW4iLCBMIjcsIHRoZSAxIG9mIEphbnVhcnksIDIwMDAiLCAgLy8gNyA9PSBTYXR1cmRheSBhcyAxID09IFN1bmRheQorICAgICAgIEwiRSwgJ3RoZScgRCAnb2YnIE1NTU0sIFlZWVkiLCBDRlhfRGF0ZVRpbWUoMjAwMCwgMSwgMSwgMCwgMCwgMCwgMCl9LAorICAgICAge0wiZW4iLCBMIjYsIHRoZSAxIG9mIEphbnVhcnksIDIwMDAiLCAgLy8gNiA9PSBTYXR1cmRheSBhcyAxID09IE1vbmRheQorICAgICAgIEwiZSwgJ3RoZScgRCAnb2YnIE1NTU0sIFlZWVkiLCBDRlhfRGF0ZVRpbWUoMjAwMCwgMSwgMSwgMCwgMCwgMCwgMCl9LAorICAgICAge0wiZW4iLCBMIjIwMDQtMDctMjIgV2VlayBvZiB0aGUgbW9udGggaXMgMyIsCisgICAgICAgTCJZWVlZLU1NLUREICdXZWVrIG9mIHRoZSBtb250aCBpcycgdyIsCisgICAgICAgQ0ZYX0RhdGVUaW1lKDIwMDQsIDcsIDIyLCAwLCAwLCAwLCAwKX0sCisgICAgICB7TCJlbiIsIEwiMjAwNC0wNy0yMiBXZWVrIG9mIHRoZSB5ZWFyIGlzIDAzIiwKKyAgICAgICBMIllZWVktTU0tREQgJ1dlZWsgb2YgdGhlIHllYXIgaXMnIFdXIiwKKyAgICAgICBDRlhfRGF0ZVRpbWUoMjAwNCwgNywgMjIsIDAsIDAsIDAsIDApfQorICAgICAgLy8ge0wiamEiLCBMIkgxNS8xMS8zIiwgTCJnWS9NL0QiLCBDRlhfRGF0ZVRpbWUoMjAwMywgMTEsIDMsIDAsIDAsIDAsIDApfSwKKyAgICAgIC8vIHtMImphIiwgTCJcdTVlNzMxLTEtOCIsIEwiZ2dZLU0tRCIsIENGWF9EYXRlVGltZSgxOTg5LCAxLCA4LCAwLCAwLCAwLAorICAgICAgLy8gMCl9LCB7TCJqYSIsIEwiXHU1ZTczXHU2MjEwODkvMTEvMDMiLCBMImdnZ1lZL01NL0REIiwKKyAgICAgIC8vICBDRlhfRGF0ZVRpbWUoMTk4OSwgMTEsIDMsIDAsIDAsIDAsIDApfSwKKyAgICAgIC8vIHtMImphIiwgTCJ1MzM3Yjk5LzAxLzA4IiwgTCJcdTAwNjdcdTAwNjdZWS9NTS9ERCIsCisgICAgICAvLyAgQ0ZYX0RhdGVUaW1lKDE5OTksIDEsIDgsIDAsIDAsIDAsIDApfQorICB9OworICAvLyBOb3RlLCBub25lIG9mIHRoZSBmdWxsIHdpZHRoIGRhdGUgc3ltYm9scyBhcmUgbGlzdGVkIGhlcmUgYXMgdGhleSBhcmUKKyAgLy8gbm90IHN1cHBvcnRlZC4gSW4gdGhlb3J5IHRoZXJlIGFyZSB0aGUgZnVsbCB3aWR0aCB2ZXJzaW9ucyBvZiBEREQsCisgIC8vIEREREQsIE1NTSwgTU1NTSwgRSwgZSwgZ2csIFlZWSwgWVlZWVkuCisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBDRlhfRGF0ZVRpbWUgcmVzdWx0OworICAgIEVYUEVDVF9UUlVFKGZtdCh0ZXN0c1tpXS5sb2NhbGUpCisgICAgICAgICAgICAgICAgICAgIC0+UGFyc2VEYXRlVGltZSh0ZXN0c1tpXS5pbnB1dCwgdGVzdHNbaV0ucGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRV9EYXRlLCAmcmVzdWx0KSk7CisgICAgRVhQRUNUX0VRKHRlc3RzW2ldLm91dHB1dCwgcmVzdWx0KSA8PCAiIFRFU1Q6ICIgPDwgaTsKKyAgfQorfQorCisvLyBUT0RPKGRzaW5jbGFpcik6IEdldERhdGVUaW1lRm9ybWF0IGlzIGJyb2tlbiBhbmQgZG9lc24ndCBhbGxvdyBqdXN0IHJldHVybmluZworLy8gYSBwYXJzZWQgVGltZS4gSXQgd2lsbCBhc3N1bWUgaXQncyBhIERhdGUuIFRoZSBtZXRob2QgbmVlZHMgdG8gYmUgcmUtd3JpdHRlbi4KKy8vIFRFU1RfRihDRkdBU19Gb3JtYXRTdHJpbmdUZXN0LCBUaW1lUGFyc2UpIHsKKy8vICAgc3RydWN0IHsKKy8vICAgICBjb25zdCB3Y2hhcl90KiBsb2NhbGU7CisvLyAgICAgY29uc3Qgd2NoYXJfdCogaW5wdXQ7CisvLyAgICAgY29uc3Qgd2NoYXJfdCogcGF0dGVybjsKKy8vICAgICBDRlhfRGF0ZVRpbWUgb3V0cHV0OworLy8gICB9IHRlc3RzW10gPSB7CisvLyAgICAgICB7TCJlbiIsIEwiMTg6MDAiLCBMIkhIOk1NIiwgQ0ZYX0RhdGVUaW1lKDAsIDAsIDAsIDE4LCAwLCAwLCAwKX0sCisvLyAgICAgICB7TCJlbiIsIEwiMTIuNTkgVWhyIiwgTCJILk1NICdVaHInIiwgQ0ZYX0RhdGVUaW1lKDAsIDAsIDAsIDEyLCA1OSwgMCwKKy8vICAgICAgIDApfSwge0wiZW4iLCBMIjE6MDU6MTAgUE0gUFNUIiwgTCJoOk1NOlNTIEEgWiIsCisvLyAgICAgICAgQ0ZYX0RhdGVUaW1lKDAsIDAsIDAsIDE3LCAwNSwgMTAsIDApfX07CisvLyAgIC8vIE5vdGUsIG5vbmUgb2YgdGhlIGZ1bGwgd2lkdGggZGF0ZSBzeW1ib2xzIGFyZSBsaXN0ZWQgaGVyZSBhcyB0aGV5IGFyZQorLy8gICAvLyBub3Qgc3VwcG9ydGVkLiBJbiB0aGVvcnkgdGhlcmUgYXJlIHRoZSBmdWxsIHdpZHRoIHZlcnNpb25zIG9mIGtraywKKy8vICAgLy8ga2traywgSEhILCBISEhILCBLS0ssIEtLS0ssIE1NTSwgTU1NTSwgU1NTLCBTU1NTIHBsdXMgMiBtb3JlIHRoYXQgdGhlCisvLyAgIC8vIHNwZWMgYXBwYXJlbnRseSBmb3Jnb3QgdG8gbGlzdCB0aGUgc3ltYm9sLgorCisvLyAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisvLyAgICAgQ0ZYX0RhdGVUaW1lIHJlc3VsdDsKKy8vICAgICBFWFBFQ1RfVFJVRShmbXQodGVzdHNbaV0ubG9jYWxlKQorLy8gICAgICAgICAgICAgICAgICAgICAtPlBhcnNlRGF0ZVRpbWUodGVzdHNbaV0uaW5wdXQsIHRlc3RzW2ldLnBhdHRlcm4sCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EQVRFVElNRVRZUEVfVGltZSwgJnJlc3VsdCkpOworLy8gICAgIEVYUEVDVF9FUSh0ZXN0c1tpXS5vdXRwdXQsIHJlc3VsdCkgPDwgIiBURVNUOiAiIDw8IGk7CisvLyAgIH0KKy8vIH0KKworVEVTVF9GKENGR0FTX0Zvcm1hdFN0cmluZ1Rlc3QsIFNwbGl0Rm9ybWF0U3RyaW5nKSB7CisgIHN0ZDo6dmVjdG9yPFdpZGVTdHJpbmc+IHJlc3VsdHM7CisgIGZtdChMImVuIiktPlNwbGl0Rm9ybWF0U3RyaW5nKAorICAgICAgTCJudWxseydObyBkYXRhJ30gfCBudWxse30gfCB0ZXh0ezk5OSo5OTk5fSB8IHRleHR7OTk5Kjk5OSo5OTk5fSIsCisgICAgICAmcmVzdWx0cyk7CisgIEVYUEVDVF9FUSg0VUwsIHJlc3VsdHMuc2l6ZSgpKTsKKworICBjb25zdCB3Y2hhcl90KiBwYXR0ZXJuc1tdID0ge0wibnVsbHsnTm8gZGF0YSd9ICIsIEwiIG51bGx7fSAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiIHRleHR7OTk5Kjk5OTl9ICIsIEwiIHRleHR7OTk5Kjk5OSo5OTk5fSJ9OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7ICsraSkgeworICAgIEVYUEVDVF9TVFJFUShwYXR0ZXJuc1tpXSwgcmVzdWx0c1tpXS5jX3N0cigpKTsKKyAgfQorfQorCitURVNUX0YoQ0ZHQVNfRm9ybWF0U3RyaW5nVGVzdCwgTnVtUGFyc2UpIHsKKyAgc3RydWN0IHsKKyAgICBjb25zdCB3Y2hhcl90KiBsb2NhbGU7CisgICAgY29uc3Qgd2NoYXJfdCogaW5wdXQ7CisgICAgY29uc3Qgd2NoYXJfdCogcGF0dGVybjsKKyAgICBjb25zdCB3Y2hhcl90KiBvdXRwdXQ7CisgIH0gdGVzdHNbXSA9IHsKKyAgICAgIC8vIHtMImVuIiwgTCLigqwxMDAuMDAiLCBMIm51bShlbl9HQil7JHoseno5Ljk5fSIsIEwiMTAwIn0sCisgICAgICAvLyB7TCJlbiIsIEwiMTA1MCIsIEwiOTlWOTkiLCBMIjEwLjUwIn0sCisgICAgICAvLyB7TCJlbiIsIEwiMzEyNSIsIEwiOTlWOTkiLCBMIjMxLjI1In0sCisgICAgICB7TCJlbiIsIEwiMTIuMzQ1ZTMiLCBMIjk5Ljk5OUUiLCBMIjEyMzQ1LjAwMDAwMCJ9LAorICAgICAge0wiZW4iLCBMIjEyLjM0NWUrMyIsIEwiOTkuOTk5RSIsIEwiMTIzNDUuMDAwMDAwIn0sCisgICAgICB7TCJlbiIsIEwiMTIuMzQ1RS0yIiwgTCI5OS45OTlFIiwgTCIwLjEyMzQ1MCJ9LAorICAgICAgLy8gVE9ETyhkc2luY2xhaXIpOiBSZXR1cm5zIDAuMDAwPworICAgICAgLy8ge0wiZW4iLCBMIjEyZS0yIiwgTCI5OUUiLCBMIjAuMTIifSwKKyAgICAgIHtMImVuIiwgTCIxNTAiLCBMIno5OTkiLCBMIjE1MCJ9LAorICAgICAge0wiZW4iLCBMIjE1MC41MCQiLCBMInp6ei56eiQiLCBMIjE1MC41MCJ9LAorICAgICAge0wiZW4iLCBMIjAxNTAiLCBMIno5OTkiLCBMIjAxNTAifSwKKyAgICAgIHtMImVuIiwgTCIxMjNDUiIsIEwiOTk5Y3IiLCBMIi0xMjMifSwKKyAgICAgIHtMImVuIiwgTCIxMjMiLCBMIjk5OWNyIiwgTCIxMjMifSwKKyAgICAgIHtMImVuIiwgTCIxMjNDUiIsIEwiOTk5Q1IiLCBMIi0xMjMifSwKKyAgICAgIHtMImVuIiwgTCIxMjMgICIsIEwiOTk5Q1IiLCBMIjEyMyJ9LAorICAgICAge0wiZW4iLCBMIjEyM0RCIiwgTCI5OTlkYiIsIEwiLTEyMyJ9LAorICAgICAge0wiZW4iLCBMIjEyMyIsIEwiOTk5ZGIiLCBMIjEyMyJ9LAorICAgICAge0wiZW4iLCBMIjEyM0RCIiwgTCI5OTlEQiIsIEwiLTEyMyJ9LAorICAgICAge0wiZW4iLCBMIjEyMyAgIiwgTCI5OTlEQiIsIEwiMTIzIn0sCisgICAgICB7TCJlbiIsIEwiMTIzLjVDUiIsIEwiOTk5LjljciIsIEwiLTEyMy41In0sCisgICAgICB7TCJlbiIsIEwiMTIzLjUiLCBMIjk5OS45Y3IiLCBMIjEyMy41In0sCisgICAgICB7TCJlbiIsIEwiMTIzLjVDUiIsIEwiOTk5LjlDUiIsIEwiLTEyMy41In0sCisgICAgICAvLyB7TCJlbiIsIEwiMTIzLjUgICIsIEwiOTk5LjlDUiIsIEwiMTIzLjUifSwKKyAgICAgIHtMImVuIiwgTCIxMjMuNURCIiwgTCI5OTkuOWRiIiwgTCItMTIzLjUifSwKKyAgICAgIHtMImVuIiwgTCIxMjMuNSIsIEwiOTk5LjlkYiIsIEwiMTIzLjUifSwKKyAgICAgIHtMImVuIiwgTCIxMjMuNURCIiwgTCI5OTkuOURCIiwgTCItMTIzLjUifSwKKyAgICAgIC8vIHtMImVuIiwgTCIxMjMuNSAgIiwgTCI5OTkuOURCIiwgTCIxMjMuNSJ9LAorICAgICAge0wiZW4iLCBMIjEwLjUwIiwgTCJ6LHp6OS45OSIsIEwiMTAuNTAifSwKKyAgICAgIHtMImVuIiwgTCIzLDEyNS4wMCIsIEwieix6ejkuOTkiLCBMIjMxMjUuMDAifSwKKyAgICAgIHtMImVuIiwgTCIkMSwyMzQuMDAiLCBMIiR6LHp6OS45OURCIiwgTCIxMjM0LjAwIn0sCisgICAgICAvLyBUT0RPKGRzaW5jbGFpcik6IENvbWVzIG91dCBhcyAxMjM0IGluc3RlYWQgb2YgLTEyMzQuCisgICAgICAvLyB7TCJlbiIsIEwiJCwxMjM0LjAwREIiLCBMIiR6LHp6OS45OURCIiwgTCItMTIzNC4wMCJ9LAorICAgICAge0wiZW4iLCBMIjEuMjM0IiwgTCJ6ejkuenp6IiwgTCIxLjIzNCJ9LAorICAgICAge0wiZW4iLCBMIjEgdGV4dCIsIEwibnVte3ogJ3RleHQnfSIsIEwiMSJ9LAorICAgICAge0wiZW4iLCBMIjEuMjM0IHRleHQiLCBMInouenp6ICd0ZXh0JyIsIEwiMS4yMzQifSwKKyAgICAgIHtMImVuIiwgTCIgIDEuMjM0IiwgTCJaWjkuWlpaIiwgTCIxLjIzNCJ9LAorICAgICAge0wiZW4iLCBMIjEyLjM0NSIsIEwieno5Lnp6eiIsIEwiMTIuMzQ1In0sCisgICAgICB7TCJlbiIsIEwiIDEyLjM0NSIsIEwiWlo5LlpaWiIsIEwiMTIuMzQ1In0sCisgICAgICB7TCJlbiIsIEwiMTIzLjQ1NiIsIEwieno5Lnp6eiIsIEwiMTIzLjQ1NiJ9LAorICAgICAge0wiZW4iLCBMIjEyMy40NTYiLCBMIlpaOS5aWloiLCBMIjEyMy40NTYifSwKKyAgICAgIHtMImVuIiwgTCIxMjMuNDU2LSIsIEwiWlo5LlpaWlMiLCBMIi0xMjMuNDU2In0sCisgICAgICB7TCJlbiIsIEwiMTIzLjQ1NisiLCBMIlpaOS5aWlpTIiwgTCIxMjMuNDU2In0sCisgICAgICB7TCJlbiIsIEwiMTIzLjQ1NiAiLCBMIlpaOS5aWlpTIiwgTCIxMjMuNDU2In0sCisgICAgICB7TCJlbiIsIEwiMTIzLjQ1Ni0iLCBMIlpaOS5aWlpTIiwgTCItMTIzLjQ1NiJ9LAorICAgICAge0wiZW4iLCBMIjEyMy40NTYrIiwgTCJaWjkuWlpaUyIsIEwiMTIzLjQ1NiJ9LAorICAgICAge0wiZW4iLCBMIjEyMyIsIEwieno5Lnp6eiIsIEwiMTIzIn0sCisgICAgICB7TCJlbiIsIEwiMTIzLiIsIEwiWlo5LlpaWiIsIEwiMTIzLiJ9LAorICAgICAge0wiZW4iLCBMIjEyMy4iLCBMInp6OS56enoiLCBMIjEyMy4ifSwKKyAgICAgIHtMImVuIiwgTCIxMjMuIiwgTCJaWjkuWlpaIiwgTCIxMjMuIn0sCisgICAgICB7TCJlbiIsIEwiMTIzLjAiLCBMInp6OS56enoiLCBMIjEyMy4wIn0sCisgICAgICB7TCJlbiIsIEwiMTIzLjAiLCBMIlpaOS5aWloiLCBMIjEyMy4wIn0sCisgICAgICB7TCJlbiIsIEwiMTIzLjAwMCIsIEwieno5Lnp6eiIsIEwiMTIzLjAwMCJ9LAorICAgICAge0wiZW4iLCBMIjEyMy4wMDAiLCBMIlpaOS5aWloiLCBMIjEyMy4wMDAifSwKKyAgICAgIHtMImVuIiwgTCIxMiwzNDUuNjciLCBMInp6eix6ejkuODg4ODg4ODgiLCBMIjEyMzQ1LjY3In0sCisgICAgICB7TCJlbiIsIEwiMTIsMzQ1LjAwMDAiLCBMInp6eix6ejkuODg4ODg4ODgiLCBMIjEyMzQ1LjAwMDAifSwKKyAgICAgIHtMImVuIiwgTCIxMiwzNDUuNjc4OSIsIEwienp6LHp6OS44IiwgTCIxMjM0NS42Nzg5In0sCisgICAgICB7TCJlbiIsIEwiMTIsMzQ1LiIsIEwienp6LHp6OS44IiwgTCIxMjM0NS4ifSwKKyAgICAgIHtMImVuIiwgTCIxMjMsNDU2LjAwMCIsIEwienp6LHp6OS44ODg4IiwgTCIxMjM0NTYuMDAwIn0sCisgICAgICB7TCJlbiIsIEwiMTIzLDQ1Ni4wIiwgTCJ6enoseno5Ljg4ODgiLCBMIjEyMzQ1Ni4wIn0sCisgICAgICB7TCJlbiIsIEwiMTIzLDQ1NiIsIEwienp6LHp6OS44ODg4IiwgTCIxMjM0NTYifSwKKyAgICAgIHtMImVuIiwgTCIxMjMsNDU2IiwgTCJaWlosWlo5Ljg4IiwgTCIxMjM0NTYifSwKKyAgICAgIHtMImVuIiwgTCIxMiwzNDUuNjciLCBMInp6eix6ejkuODg4ODg4ODgiLCBMIjEyMzQ1LjY3In0sCisgICAgICB7TCJlbiIsIEwiMTIsMzQ1LjAwMDAiLCBMInp6eix6ejkuODg4ODg4ODgiLCBMIjEyMzQ1LjAwMDAifSwKKyAgICAgIHtMImVuIiwgTCIxMiwzNDUuNjc4OSIsIEwienp6LHp6OS44IiwgTCIxMjM0NS42Nzg5In0sCisgICAgICB7TCJlbiIsIEwiMTIsMzQ1LiIsIEwienp6LHp6OS44IiwgTCIxMjM0NS4ifSwKKyAgICAgIC8vIFRPRE8oZHNpbmNsYWlyKTogUGFyc2VzIHRvIDAKKyAgICAgIC8vIHtMImVuIiwgTCIxMiUiLCBMInp6OS4lJSIsIEwiLjEyIn0sCisgICAgICB7TCJlbiIsIEwiMSwyMzQuNTAlIiwgTCJ6enoseno5Ljk5JSUiLCBMIjEyLjM0NSJ9LAorICAgICAgLy8ge0wiZW4iLCBMIi0wMDEyMyIsIEwiUzk5OXY5OSIsIEwiLTEuMjMifSwKKyAgICAgIHtMImVuIiwgTCIgMDAxLjIzIiwgTCJTOTk5Vjk5IiwgTCIwMDEuMjMifSwKKyAgICAgIC8vIHtMImVuIiwgTCIgMTIzLjAwIiwgTCJTOTk5Vjk5IiwgTCIxMjMifSwKKyAgICAgIHtMImVuIiwgTCIgIDEyLjMwIiwgTCJTWlo5Ljk5IiwgTCIxMi4zMCJ9LAorICAgICAge0wiZW4iLCBMIi0gMTIuMzAiLCBMIlNaOTkuOTkiLCBMIi0xMi4zMCJ9LAorICAgICAge0wiZW4iLCBMIjEyMy4wMCIsIEwic3p6OS45OSIsIEwiMTIzLjAwIn0sCisgICAgICB7TCJlbiIsIEwiLTEyMy4wMCIsIEwic3p6OS45OSIsIEwiLTEyMy4wMCJ9LAorICAgICAgLy8ge0wiZW4iLCBMIiQgIDEsMjM0LjAwICAiLCBMIiRaWixaWjkuOTlDUiIsIEwiMTIzNCJ9LAorICAgICAgLy8ge0wiZW4iLCBMIiQgIDEsMjM0LjAwQ1IiLCBMIiRaWixaWjkuOTlDUiIsIEwiLTEyMzQifSwKKyAgICAgIC8vIHtMImVuIiwgTCIkMSwyMzQwMCIsIEwiJHoseno5Ljk5REIiLCBMIjEyMzQifSwKKyAgICAgIHtMImVuIiwgTCIkMSwyMzQuMDBEQiIsIEwiJHoseno5Ljk5REIiLCBMIi0xMjM0LjAwIn0sCisgICAgICB7TCJlbiIsCisgICAgICAgTCIxXHhBMCIKKyAgICAgICBMIjIzNCIsCisgICAgICAgTCJudW0oZnIpe3osenp6fSIsIEwiMTIzNCJ9LAorICAgICAgLy8gVE9ETyhkc2luY2xhaXIpOiBQYXJzZXMgdG8gYmxhbmsKKyAgICAgIC8vIHtMImVuIiwgTCIxLDIzNCUiLCBMIm51bS5wZXJjZW50e30iLCBMIjEyLjM0In0sCisgICAgICAvLyB7TCJlbiIsIEwiMVx4QTAiIEwiMjM0JSUiLCBMIm51bShmcikucGVyY2VudHt9IiwgTCIxMi4zNCJ9LAorICAgICAgLy8gVE9ETyhkc2luY2xhaXIpOiBQYXJzZXMgdG8gYmxhbmsKKyAgICAgIC8vIHtMImVuIiwgTCIxLDIzNCUiLCBMIm51bXs5LDk5OSUlfSIsIEwiMTIuMzQifSwKKyAgICAgIHtMImZyIiwKKyAgICAgICBMIjEyM1x4QTAiCisgICAgICAgTCI0NTYiLAorICAgICAgIEwienp6LHp6eiIsIEwiMTIzNDU2In0sCisgICAgICB7TCJlbiIsIEwiMTIlIiwgTCJ6eiUiLCBMIjAuMTIifSwKKyAgICAgIHtMImVuIiwgTCIoMTIzIiwgTCIoenp6IiwgTCItMTIzIn0sCisgICAgICB7TCJlbiIsIEwiMTIzKSIsIEwienp6KSIsIEwiLTEyMyJ9LAorICAgICAge0wiZW4iLCBMIigxMjMpIiwgTCIoenp6KSIsIEwiLTEyMyJ9LAorICAgICAge0wiZW4iLCBMIjEyMyAiLCBMInp6eikiLCBMIjEyMyJ9LAorICAgICAge0wiZW4iLCBMIiAxMjMiLCBMIih6enoiLCBMIjEyMyJ9LAorICAgICAge0wiZW4iLCBMIiAxMjMgIiwgTCIoenp6KSIsIEwiMTIzIn0sCisgICAgICB7TCJlbiIsIEwiMTIzLjUoIiwgTCJ6enoueigiLCBMIi0xMjMuNSJ9LAorICAgICAge0wiZW4iLCBMIjEyMy41KSIsIEwienp6LnopIiwgTCItMTIzLjUifSwKKyAgICAgIHtMImVuIiwgTCIxMjMuNSAiLCBMInp6ei56KSIsIEwiMTIzLjUifSwKKyAgICAgIHtMImVuIiwgTCIxMjMuNSAiLCBMInp6ei56KCIsIEwiMTIzLjUifSwKKyAgICAgIHtMImVuIiwgTCIxMjMuNTQ1LDQiLCBMInp6ei56enoseiIsIEwiMTIzLjU0NTQifSwKKyAgfTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIFdpZGVTdHJpbmcgcmVzdWx0OworICAgIEVYUEVDVF9UUlVFKGZtdCh0ZXN0c1tpXS5sb2NhbGUpCisgICAgICAgICAgICAgICAgICAgIC0+UGFyc2VOdW0odGVzdHNbaV0uaW5wdXQsIHRlc3RzW2ldLnBhdHRlcm4sICZyZXN1bHQpKQorICAgICAgICA8PCAiIFRFU1Q6ICIgPDwgaTsKKyAgICBFWFBFQ1RfU1RSRVEodGVzdHNbaV0ub3V0cHV0LCByZXN1bHQuY19zdHIoKSkgPDwgIiBURVNUOiAiIDw8IGk7CisgIH0KK30KKworVEVTVF9GKENGR0FTX0Zvcm1hdFN0cmluZ1Rlc3QsIE51bUZvcm1hdCkgeworICBzdHJ1Y3QgeworICAgIGNvbnN0IHdjaGFyX3QqIGxvY2FsZTsKKyAgICBjb25zdCB3Y2hhcl90KiBpbnB1dDsKKyAgICBjb25zdCB3Y2hhcl90KiBwYXR0ZXJuOworICAgIGNvbnN0IHdjaGFyX3QqIG91dHB1dDsKKyAgfSB0ZXN0c1tdID0geworICAgICAge0wiZW4iLCBMIjEuMjM0IiwgTCJ6ejkuenp6IiwgTCIxLjIzNCJ9LAorICAgICAge0wiZW4iLCBMIjEiLCBMIm51bXt6ICd0ZXh0J30iLCBMIjEgdGV4dCJ9LAorICAgICAge0wiZW4iLCBMIjEiLCBMIm51bXsndGV4dCcgen0iLCBMInRleHQgMSJ9LAorICAgICAge0wiZW4iLCBMIjEuMjM0IiwgTCJaWjkuWlpaIiwgTCIgIDEuMjM0In0sCisgICAgICB7TCJlbiIsIEwiMTIuMzQ1IiwgTCJ6ejkuenp6IiwgTCIxMi4zNDUifSwKKyAgICAgIHtMImVuIiwgTCIxMi4zNDUiLCBMIlpaOS5aWloiLCBMIiAxMi4zNDUifSwKKyAgICAgIHtMImVuIiwgTCIxMjMuNDU2IiwgTCJ6ejkuenp6IiwgTCIxMjMuNDU2In0sCisgICAgICB7TCJlbiIsIEwiMTIzLjQ1NiIsIEwiWlo5LlpaWiIsIEwiMTIzLjQ1NiJ9LAorICAgICAge0wiZW4iLCBMIjEyMyIsIEwieno5Lnp6eiIsIEwiMTIzIn0sCisgICAgICB7TCJlbiIsIEwiMTIzIiwgTCJaWjkuWlpaIiwgTCIxMjMuMDAwIn0sCisgICAgICB7TCJlbiIsIEwiMTIzLiIsIEwieno5Lnp6eiIsIEwiMTIzLiJ9LAorICAgICAge0wiZW4iLCBMIjEyMy4iLCBMIlpaOS5aWloiLCBMIjEyMy4wMDAifSwKKyAgICAgIHtMImVuIiwgTCIxMjMuMCIsIEwieno5Lnp6eiIsIEwiMTIzIn0sCisgICAgICB7TCJlbiIsIEwiMTIzLjAiLCBMIlpaOS5aWloiLCBMIjEyMy4wMDAifSwKKyAgICAgIHtMImVuIiwgTCIxMjMuMDAwIiwgTCJ6ejkuenp6IiwgTCIxMjMifSwKKyAgICAgIHtMImVuIiwgTCIxMjMuMDAwIiwgTCJaWjkuWlpaIiwgTCIxMjMuMDAwIn0sCisgICAgICAvLyB7TCJlbiIsIEwiMTIzNDUuNjciLCBMInp6eix6ejkuODg4ODg4ODgiLCBMIjEyLDM0NS42NyJ9LAorICAgICAgLy8ge0wiZW4iLCBMIjEyMzQ1LjAwMDAiLCBMInp6eix6ejkuODg4ODg4ODgiLCBMIjEyLDM0NS4wMDAwIn0sCisgICAgICAvLyB7TCJlbiIsIEwiMTIzNDUuNjc4OSIsIEwienp6LHp6OS44IiwgTCIxMiwzNDUuNjc4OSJ9LAorICAgICAgLy8ge0wiZW4iLCBMIjEyMzQ1LiIsIEwienp6LHp6OS44IiwgTCIxMiwzNDUifSwKKyAgICAgIC8vIHtMImVuIiwgTCIxMjM0NTYuMDAwIiwgTCJ6enoseno5Ljg4ODgiLCBMIjEyMyw0NTYuMDAwIn0sCisgICAgICAvLyB7TCJlbiIsIEwiMTIzNDU2LjAiLCBMInp6eix6ejkuODg4OCIsIEwiMTIzLDQ1Ni4wIn0sCisgICAgICB7TCJlbiIsIEwiMTIzNDU2IiwgTCJ6enoseno5Ljg4ODgiLCBMIjEyMyw0NTYifSwKKyAgICAgIHtMImVuIiwgTCIxMjM0NTYiLCBMIlpaWixaWjkuODgiLCBMIjEyMyw0NTYifSwKKyAgICAgIC8vIHtMImVuIiwgTCIxMjM0NS42NyIsIEwienp6LHp6OS44ODg4ODg4OCIsIEwiMTIsMzQ1LjY3In0sCisgICAgICAvLyB7TCJlbiIsIEwiMTIzNDUuMDAwMCIsIEwienp6LHp6OS44ODg4ODg4OCIsIEwiMTIsMzQ1LjAwMDAifSwKKyAgICAgIC8vIHtMImVuIiwgTCIxMjM0NS42Nzg5IiwgTCJ6enoseno5LjgiLCBMIjEyLDM0NS42Nzg5In0sCisgICAgICAvLyB7TCJlbiIsIEwiMTIzNDUuIiwgTCJ6enoseno5LjgiLCBMIjEyLDM0NSJ9LAorICAgICAgLy8ge0wiZW4iLCBMIjEyJSUiLCBMInp6OS4lJSIsIEwiMTIlJSJ9LAorICAgICAgLy8ge0wiZW4iLCBMIjEsMjM0LjUlJSIsIEwienp6LHp6OS45OSUlIiwgTCIxLDIzNC41MCUlIn0sCisgICAgICB7TCJlbiIsIEwiLTEuMjMiLCBMIlM5OTl2OTkiLCBMIi0wMDEyMyJ9LAorICAgICAge0wiZW4iLCBMIjEuMjMiLCBMIlM5OTlWOTkiLCBMIiAwMDEuMjMifSwKKyAgICAgIHtMImVuIiwgTCIxMjMiLCBMIlM5OTlWOTkiLCBMIiAxMjMuMDAifSwKKyAgICAgIHtMImVuIiwgTCIxMi4zIiwgTCJTWlo5Ljk5IiwgTCIgIDEyLjMwIn0sCisgICAgICB7TCJlbiIsIEwiLTEyLjMiLCBMIlNaOTkuOTkiLCBMIi0gMTIuMzAifSwKKyAgICAgIHtMImVuIiwgTCIxMjMiLCBMInN6ejkuOTkiLCBMIjEyMy4wMCJ9LAorICAgICAge0wiZW4iLCBMIi0xMjMiLCBMInN6ejkuOTkiLCBMIi0xMjMuMDAifSwKKyAgICAgIC8vIHtMImVuIiwgTCIxMjM0IiwgTCIkWlosWlo5Ljk5Q1IiLCBMIiQgIDEsMjM0LjAwICAifSwKKyAgICAgIC8vIHtMImVuIiwgTCItMTIzNCIsIEwiJFpaLFpaOS45OUNSIiwgTCIkICAxLDIzNC4wMENSIn0sCisgICAgICAvLyB7TCJlbiIsIEwiMTIzNCIsIEwiJHoseno5Ljk5REIiLCBMIiQxLDIzNC4wMCJ9LAorICAgICAge0wiZW4iLCBMIi0xMjM0IiwgTCIkeix6ejkuOTlEQiIsIEwiJDEsMjM0LjAwREIifSwKKyAgICAgIHtMImVuIiwgTCIxMjM0NSIsIEwiOTkuOTk5RSIsIEwiMTIuMzQ1RSszIn0sCisgICAgICB7TCJlbiIsIEwiMTIzNDUiLCBMIjk5OTk5RSIsIEwiMTIzNDVFKzAifSwKKyAgICAgIHtMImVuIiwgTCIuMTIzNDUiLCBMIjk5Ljk5OUUiLCBMIjEyLjM0NUUtMiJ9LAorICAgICAge0wiZW4iLCBMIjEyMzQ1IiwgTCI5OSw5OTkiLCBMIjEyLDM0NSJ9LAorICAgICAge0wiZW4iLCBMIjEyMzQiLCBMIm51bShmcil7eix6enp9IiwKKyAgICAgICBMIjFceEEwIgorICAgICAgIEwiMjM0In0sCisgICAgICB7TCJlbiIsIEwiMTIuMzQiLCBMIm51bS5wZXJjZW50e30iLCBMIjEsMjM0JSJ9LAorICAgICAge0wiZW4iLCBMIjEyLjM0IiwgTCJudW0oZnIpLnBlcmNlbnR7fSIsCisgICAgICAgTCIxXHhBMCIKKyAgICAgICBMIjIzNCUifSwKKyAgICAgIC8vIHtMImVuIiwgTCIxMi4zNCIsIEwibnVtezksOTk5JSV9IiwgTCIxLDIzNCUifSwKKyAgICAgIHtMImVuIiwgTCItMTIzIiwgTCJ6enpDUiIsIEwiMTIzQ1IifSwKKyAgICAgIHtMImVuIiwgTCIxMjMiLCBMInp6ekNSIiwgTCIxMjMgICJ9LAorICAgICAge0wiZW4iLCBMIi0xMjMiLCBMInp6emNyIiwgTCIxMjNDUiJ9LAorICAgICAge0wiZW4iLCBMIjEyMyIsIEwienp6Y3IiLCBMIjEyMyJ9LAorICAgICAge0wiZW4iLCBMIjEyMyIsIEwienp6JCIsIEwiMTIzJCJ9LAorICAgICAge0wiZW4iLCBMIi0xMjMuNSIsIEwienp6LnpDUiIsIEwiMTIzLjVDUiJ9LAorICAgICAge0wiZW4iLCBMIjEyMy41IiwgTCJ6enouekNSIiwgTCIxMjMuNSAgIn0sCisgICAgICB7TCJlbiIsIEwiLTEyMy41IiwgTCJ6enouemNyIiwgTCIxMjMuNUNSIn0sCisgICAgICB7TCJlbiIsIEwiMTIzLjUiLCBMInp6ei56Y3IiLCBMIjEyMy41In0sCisKKyAgICAgIHtMImVuIiwgTCItMTIzLjUiLCBMIjk5OS45ZGIiLCBMIjEyMy41ZGIifSwKKyAgICAgIHtMImVuIiwgTCIxMjMuNSIsIEwiOTk5LjlkYiIsIEwiMTIzLjUifSwKKyAgICAgIHtMImVuIiwgTCItMTIzLjUiLCBMIjk5OS45REIiLCBMIjEyMy41REIifSwKKyAgICAgIHtMImVuIiwgTCIxMjMuNSIsIEwiOTk5LjlEQiIsIEwiMTIzLjUgICJ9LAorCisgICAgICB7TCJlbiIsIEwiLTEyMyIsIEwiKHp6eiIsIEwiKDEyMyJ9LAorICAgICAgLy8ge0wiZW4iLCBMIi0xMjMiLCBMInp6eikiLCBMIjEyMykifSwKKyAgICAgIHtMImVuIiwgTCItMTIzIiwgTCIoenp6KSIsIEwiKDEyMykifSwKKyAgICAgIHtMImVuIiwgTCIxMjMiLCBMInp6eikiLCBMIjEyMyAifSwKKyAgICAgIHtMImVuIiwgTCIxMjMiLCBMIih6enoiLCBMIiAxMjMifSwKKyAgICAgIHtMImVuIiwgTCIxMjMiLCBMIih6enopIiwgTCIgMTIzICJ9LAorICAgICAge0wiZW4iLCBMIi0xMjMuNSIsIEwienp6LnooIiwgTCIxMjMuNSgifSwKKyAgICAgIC8vIHtMImVuIiwgTCItMTIzLjUiLCBMInp6ei56KSIsIEwiMTIzLjUpIn0sCisgICAgICB7TCJlbiIsIEwiMTIzLjUiLCBMInp6ei56KSIsIEwiMTIzLjUgIn0sCisgICAgICB7TCJlbiIsIEwiMTIzLjUiLCBMInp6ei56KCIsIEwiMTIzLjUgIn0sCisgIH07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBXaWRlU3RyaW5nIHJlc3VsdDsKKyAgICBFWFBFQ1RfVFJVRShmbXQodGVzdHNbaV0ubG9jYWxlKQorICAgICAgICAgICAgICAgICAgICAtPkZvcm1hdE51bSh0ZXN0c1tpXS5pbnB1dCwgdGVzdHNbaV0ucGF0dGVybiwgJnJlc3VsdCkpCisgICAgICAgIDw8ICIgVEVTVDogIiA8PCBpOworICAgIEVYUEVDVF9TVFJFUSh0ZXN0c1tpXS5vdXRwdXQsIHJlc3VsdC5jX3N0cigpKSA8PCAiIFRFU1Q6ICIgPDwgaTsKKyAgfQorfQorCitURVNUX0YoQ0ZHQVNfRm9ybWF0U3RyaW5nVGVzdCwgVGV4dFBhcnNlKSB7CisgIHN0cnVjdCB7CisgICAgY29uc3Qgd2NoYXJfdCogbG9jYWxlOworICAgIGNvbnN0IHdjaGFyX3QqIGlucHV0OworICAgIGNvbnN0IHdjaGFyX3QqIHBhdHRlcm47CisgICAgY29uc3Qgd2NoYXJfdCogb3V0cHV0OworICB9IHRlc3RzW10gPSB7Ly8gVE9ETyhkc2luY2xhaXIpIE1pc3Npbmcgc3VwcG9ydCBmb3IgdGhlIGdsb2JhbCBtb2RpZmllcnM6CisgICAgICAgICAgICAgICAvLyAgPyAtIHdpbGRjYXJkCisgICAgICAgICAgICAgICAvLyAgKiAtIHplcm8gb3IgbW9yZSB3aGl0ZXNwYWNlCisgICAgICAgICAgICAgICAvLyAgKyAtIG9uZSBvciBtb3JlIHdoaXRlc3BhY2UKKyAgICAgICAgICAgICAgIC8vIHtMImVuIiwgTCI1NTUtMTIxMiIsIEwidGV4dCh0aF9USCl7OTk5Kjk5OTl9IiwgTCI1NTUxMjEyIn0sCisgICAgICAgICAgICAgICB7TCJlbiIsIEwiQUJDLTEyMzQtNSIsIEwiQUFBLTk5OTktWCIsIEwiQUJDMTIzNDUifSwKKyAgICAgICAgICAgICAgIHtMImVuIiwgTCJBQkMtMTIzNC1EIiwgTCJBQUEtOTk5OS1YIiwgTCJBQkMxMjM0RCJ9LAorICAgICAgICAgICAgICAge0wiZW4iLCBMIkExQy0xMjM0LUQiLCBMIk9PTy05OTk5LVgiLCBMIkExQzEyMzREIn0sCisgICAgICAgICAgICAgICB7TCJlbiIsIEwiQTFDLTEyMzQtRCIsIEwiMDAwLTk5OTktWCIsIEwiQTFDMTIzNEQifSwKKyAgICAgICAgICAgICAgIHtMImVuIiwgTCJBMUMtMTIzNC1EIHRleHQiLCBMIjAwMC05OTk5LVggJ3RleHQnIiwgTCJBMUMxMjM0RCJ9fTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIFdpZGVTdHJpbmcgcmVzdWx0OworICAgIEVYUEVDVF9UUlVFKGZtdCh0ZXN0c1tpXS5sb2NhbGUpCisgICAgICAgICAgICAgICAgICAgIC0+UGFyc2VUZXh0KHRlc3RzW2ldLmlucHV0LCB0ZXN0c1tpXS5wYXR0ZXJuLCAmcmVzdWx0KSk7CisgICAgRVhQRUNUX1NUUkVRKHRlc3RzW2ldLm91dHB1dCwgcmVzdWx0LmNfc3RyKCkpIDw8ICIgVEVTVDogIiA8PCBpOworICB9Cit9CisKK1RFU1RfRihDRkdBU19Gb3JtYXRTdHJpbmdUZXN0LCBJbnZhbGlkVGV4dFBhcnNlKSB7CisgIC8vIElucHV0IGRvZXMgbm90IG1hdGNoIG1hc2suCisgIFdpZGVTdHJpbmcgcmVzdWx0OworICBFWFBFQ1RfRkFMU0UoZm10KEwiZW4iKS0+UGFyc2VUZXh0KEwiMTIzLTQ1NjctOCIsIEwiQUFBLTk5OTktWCIsICZyZXN1bHQpKTsKK30KKworVEVTVF9GKENGR0FTX0Zvcm1hdFN0cmluZ1Rlc3QsIFRleHRGb3JtYXQpIHsKKyAgc3RydWN0IHsKKyAgICBjb25zdCB3Y2hhcl90KiBsb2NhbGU7CisgICAgY29uc3Qgd2NoYXJfdCogaW5wdXQ7CisgICAgY29uc3Qgd2NoYXJfdCogcGF0dGVybjsKKyAgICBjb25zdCB3Y2hhcl90KiBvdXRwdXQ7CisgIH0gdGVzdHNbXSA9IHsKKyAgICAgIHtMImVuIiwgTCJLMVM1SzIiLCBMIkE5QSA5QTkiLCBMIksxUyA1SzIifSwKKyAgICAgIHtMImVuIiwgTCJLMVM1SzIiLCBMInRleHQoZnIpe0E5QSA5QTl9IiwgTCJLMVMgNUsyIn0sCisgICAgICB7TCJlbiIsIEwiNjEzNTU1MTIxMiIsIEwiJysxICgnOVx1MDAyMzk5JykgJzk5OS05OTk5IiwKKyAgICAgICBMIisxICg2IzEzKSA1NTUtMTIxMiJ9LAorICAgICAge0wiZW4iLCBMIjYxMzU1NTEyMTIiLCBMIjk5OS45OTkuOTk5OSIsIEwiNjEzLjU1NS4xMjEyIn0sCisgICAgICB7TCJlbiIsIEwiNjEzNTU1MTIxMiIsIEwiOTk5XHUwMDIzOTk5XHUwMDJBOTk5OSIsIEwiNjEzIzU1NSoxMjEyIn0sCisgICAgICB7TCJlbiIsIEwiSzEjNUsyIiwgTCIwMFggT085IiwgTCJLMSMgNUsyIn0sCisgIH07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBXaWRlU3RyaW5nIHJlc3VsdDsKKyAgICBFWFBFQ1RfVFJVRShmbXQodGVzdHNbaV0ubG9jYWxlKQorICAgICAgICAgICAgICAgICAgICAtPkZvcm1hdFRleHQodGVzdHNbaV0uaW5wdXQsIHRlc3RzW2ldLnBhdHRlcm4sICZyZXN1bHQpKTsKKyAgICBFWFBFQ1RfU1RSRVEodGVzdHNbaV0ub3V0cHV0LCByZXN1bHQuY19zdHIoKSkgPDwgIiBURVNUOiAiIDw8IGk7CisgIH0KK30KKworVEVTVF9GKENGR0FTX0Zvcm1hdFN0cmluZ1Rlc3QsIE51bGxQYXJzZSkgeworICBzdHJ1Y3QgeworICAgIGNvbnN0IHdjaGFyX3QqIGxvY2FsZTsKKyAgICBjb25zdCB3Y2hhcl90KiBpbnB1dDsKKyAgICBjb25zdCB3Y2hhcl90KiBwYXR0ZXJuOworICB9IHRlc3RzW10gPSB7CisgICAgICB7TCJlbiIsIEwiIiwgTCJudWxse30ifSwge0wiZW4iLCBMIk5vIGRhdGEiLCBMIm51bGx7J05vIGRhdGEnfSJ9LAorICB9OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKHRlc3RzKTsgKytpKSB7CisgICAgRVhQRUNUX1RSVUUoCisgICAgICAgIGZtdCh0ZXN0c1tpXS5sb2NhbGUpLT5QYXJzZU51bGwodGVzdHNbaV0uaW5wdXQsIHRlc3RzW2ldLnBhdHRlcm4pKQorICAgICAgICA8PCAiIFRFU1Q6ICIgPDwgaTsKKyAgfQorfQorCitURVNUX0YoQ0ZHQVNfRm9ybWF0U3RyaW5nVGVzdCwgTnVsbEZvcm1hdCkgeworICBzdHJ1Y3QgeworICAgIGNvbnN0IHdjaGFyX3QqIGxvY2FsZTsKKyAgICBjb25zdCB3Y2hhcl90KiBwYXR0ZXJuOworICAgIGNvbnN0IHdjaGFyX3QqIG91dHB1dDsKKyAgfSB0ZXN0c1tdID0ge3tMImVuIiwgTCJudWxseyduL2EnfSIsIEwibi9hIn0sIHtMImVuIiwgTCJudWxse30iLCBMIiJ9fTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIFdpZGVTdHJpbmcgcmVzdWx0OworICAgIEVYUEVDVF9UUlVFKGZtdCh0ZXN0c1tpXS5sb2NhbGUpLT5Gb3JtYXROdWxsKHRlc3RzW2ldLnBhdHRlcm4sICZyZXN1bHQpKTsKKyAgICBFWFBFQ1RfU1RSRVEodGVzdHNbaV0ub3V0cHV0LCByZXN1bHQuY19zdHIoKSkgPDwgIiBURVNUOiAiIDw8IGk7CisgIH0KK30KKworVEVTVF9GKENGR0FTX0Zvcm1hdFN0cmluZ1Rlc3QsIFplcm9QYXJzZSkgeworICBzdHJ1Y3QgeworICAgIGNvbnN0IHdjaGFyX3QqIGxvY2FsZTsKKyAgICBjb25zdCB3Y2hhcl90KiBpbnB1dDsKKyAgICBjb25zdCB3Y2hhcl90KiBwYXR0ZXJuOworICB9IHRlc3RzW10gPSB7e0wiZW4iLCBMIiIsIEwiemVyb3t9In0sCisgICAgICAgICAgICAgICB7TCJlbiIsIEwiOSIsIEwiemVyb3s5fSJ9LAorICAgICAgICAgICAgICAge0wiZW4iLCBMImEiLCBMInplcm97J2EnfSJ9fTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZSh0ZXN0cyk7ICsraSkgeworICAgIEVYUEVDVF9UUlVFKAorICAgICAgICBmbXQodGVzdHNbaV0ubG9jYWxlKS0+UGFyc2VaZXJvKHRlc3RzW2ldLmlucHV0LCB0ZXN0c1tpXS5wYXR0ZXJuKSkKKyAgICAgICAgPDwgIiBURVNUOiAiIDw8IGk7CisgIH0KK30KKworVEVTVF9GKENGR0FTX0Zvcm1hdFN0cmluZ1Rlc3QsIFplcm9Gb3JtYXQpIHsKKyAgc3RydWN0IHsKKyAgICBjb25zdCB3Y2hhcl90KiBsb2NhbGU7CisgICAgY29uc3Qgd2NoYXJfdCogaW5wdXQ7CisgICAgY29uc3Qgd2NoYXJfdCogcGF0dGVybjsKKyAgICBjb25zdCB3Y2hhcl90KiBvdXRwdXQ7CisgIH0gdGVzdHNbXSA9IHsvLyBUT0RPKGRzaW5jbGFpcik6IFRoZSB6ZXJvIGZvcm1hdCBjYW4gdGFrZSBhIG51bWJlciBzcGVjaWZpZXIKKyAgICAgICAgICAgICAgIC8vIHdoaWNoIHdlIGRvbid0IHRha2UgaW50byBhY2NvdW50LgorICAgICAgICAgICAgICAgLy8ge0wiZW4iLCBMIiIsIEwiemVybyB7OX0iLCBMIiJ9LAorICAgICAgICAgICAgICAgLy8ge0wiZW4iLCBMIjAiLCBMInplcm8gezl9IiwgTCIwIn0sCisgICAgICAgICAgICAgICAvLyB7TCJlbiIsIEwiMC4wIiwgTCJ6ZXJvezl9IiwgTCIwIn0sCisgICAgICAgICAgICAgICB7TCJlbiIsIEwiMCIsIEwiemVyb3t9IiwgTCIifX07CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUodGVzdHMpOyArK2kpIHsKKyAgICBXaWRlU3RyaW5nIHJlc3VsdDsKKyAgICBFWFBFQ1RfVFJVRSgKKyAgICAgICAgZm10KHRlc3RzW2ldLmxvY2FsZSkKKyAgICAgICAgICAgIC0+Rm9ybWF0WmVybygvKiB0ZXN0c1tpXS5pbnB1dCwqLyB0ZXN0c1tpXS5wYXR0ZXJuLCAmcmVzdWx0KSk7CisgICAgRVhQRUNUX1NUUkVRKHRlc3RzW2ldLm91dHB1dCwgcmVzdWx0LmNfc3RyKCkpIDw8ICIgVEVTVDogIiA8PCBpOworICB9Cit9CisKK1RFU1RfRihDRkdBU19Gb3JtYXRTdHJpbmdUZXN0LCBHZXRDYXRlZ29yeSkgeworICBDRkdBU19Gb3JtYXRTdHJpbmcqIGYgPSBmbXQoTCJlbiIpOworCisgIEVYUEVDVF9FUShGWF9MT0NBTEVDQVRFR09SWV9Vbmtub3duLCBmLT5HZXRDYXRlZ29yeShMIidqdXN0IHRleHQnIikpOworICBFWFBFQ1RfRVEoRlhfTE9DQUxFQ0FURUdPUllfTnVsbCwgZi0+R2V0Q2F0ZWdvcnkoTCJudWxse30iKSk7CisgIEVYUEVDVF9FUShGWF9MT0NBTEVDQVRFR09SWV9aZXJvLCBmLT5HZXRDYXRlZ29yeShMInplcm97fSIpKTsKKyAgRVhQRUNUX0VRKEZYX0xPQ0FMRUNBVEVHT1JZX051bSwgZi0+R2V0Q2F0ZWdvcnkoTCJudW17fSIpKTsKKyAgRVhQRUNUX0VRKEZYX0xPQ0FMRUNBVEVHT1JZX1RleHQsIGYtPkdldENhdGVnb3J5KEwidGV4dHt9IikpOworICBFWFBFQ1RfRVEoRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWUsIGYtPkdldENhdGVnb3J5KEwiZGF0ZXRpbWV7fSIpKTsKKyAgRVhQRUNUX0VRKEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWUsIGYtPkdldENhdGVnb3J5KEwidGltZXt9IikpOworICBFWFBFQ1RfRVEoRlhfTE9DQUxFQ0FURUdPUllfRGF0ZSwgZi0+R2V0Q2F0ZWdvcnkoTCJkYXRle30iKSk7CisgIEVYUEVDVF9FUShGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZSwgZi0+R2V0Q2F0ZWdvcnkoTCJ0aW1le30gZGF0ZXt9IikpOworICBFWFBFQ1RfRVEoRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWUsIGYtPkdldENhdGVnb3J5KEwiZGF0ZXt9IHRpbWV7fSIpKTsKKyAgRVhQRUNUX0VRKEZYX0xPQ0FMRUNBVEVHT1JZX051bSwgZi0+R2V0Q2F0ZWdvcnkoTCJudW0oZW5fR0Ipe30iKSk7CisgIEVYUEVDVF9FUShGWF9MT0NBTEVDQVRFR09SWV9EYXRlLCBmLT5HZXRDYXRlZ29yeShMImRhdGUubG9uZ3t9IikpOworfQpkaWZmIC0tZ2l0IGEveGZhL2ZnYXMvY3J0L2ZnYXNfY29kZXBhZ2UuY3BwIGIveGZhL2ZnYXMvY3J0L2ZnYXNfY29kZXBhZ2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmY4N2EzLi4wMDAwMDAwCi0tLSBhL3hmYS9mZ2FzL2NydC9mZ2FzX2NvZGVwYWdlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ2NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dC5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2NydC9mZ2FzX2NvZGVwYWdlLmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvY3J0L2ZnYXNfbGFuZ3VhZ2UuaCIKLQotbmFtZXNwYWNlIHsKLQotc3RydWN0IEZYX1NUUjJDUEhBU0ggewotICB1aW50MzJfdCB1SGFzaDsKLSAgdWludDE2X3QgdUNvZGVQYWdlOwotfTsKLQotc3RydWN0IEZYX0NIQVJTRVRfTUFQIHsKLSAgdWludDE2X3QgY2hhcnNldDsKLSAgdWludDE2X3QgY29kZXBhZ2U7Ci19OwotCi1zdHJ1Y3QgRlhfTEFORzJDUE1BUCB7Ci0gIHVpbnQxNl90IHdMYW5ndWFnZTsKLSAgdWludDE2X3Qgd0NvZGVwYWdlOwotfTsKLQotY29uc3QgRlhfQ0hBUlNFVF9NQVAgZ19GWENoYXJzZXQyQ29kZVBhZ2VUYWJsZVtdID0gewotICAgIHswLCAxMjUyfSwgICB7MSwgMH0sICAgICAgezIsIDQyfSwgICAgIHs3NywgMTAwMDB9LCB7NzgsIDEwMDAxfSwKLSAgICB7NzksIDEwMDAzfSwgezgwLCAxMDAwOH0sIHs4MSwgMTAwMDJ9LCB7ODMsIDEwMDA1fSwgezg0LCAxMDAwNH0sCi0gICAgezg1LCAxMDAwNn0sIHs4NiwgMTAwODF9LCB7ODcsIDEwMDIxfSwgezg4LCAxMDAyOX0sIHs4OSwgMTAwMDd9LAotICAgIHsxMjgsIDkzMn0sICB7MTI5LCA5NDl9LCAgezEzMCwgMTM2MX0sIHsxMzQsIDkzNn0sICB7MTM2LCA5NTB9LAotICAgIHsxNjEsIDEyNTN9LCB7MTYyLCAxMjU0fSwgezE2MywgMTI1OH0sIHsxNzcsIDEyNTV9LCB7MTc4LCAxMjU2fSwKLSAgICB7MTg2LCAxMjU3fSwgezIwNCwgMTI1MX0sIHsyMjIsIDg3NH0sICB7MjM4LCAxMjUwfSwgezI1NCwgNDM3fSwKLSAgICB7MjU1LCA4NTB9LAotfTsKLQotY29uc3QgRlhfTEFORzJDUE1BUCBnX0ZYTGFuZzJDb2RlcGFnZVRhYmxlW10gPSB7Ci0gICAge0ZYX0xBTkdfQXJhYmljX1NhdWRpQXJhYmlhLCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LAotICAgIHtGWF9MQU5HX0J1bGdhcmlhbl9CdWxnYXJpYSwgRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWN9LAotICAgIHtGWF9MQU5HX0NhdGFsYW5fQ2F0YWxhbiwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19DaGluZXNlX1RhaXdhbiwgRlhfQ09ERVBBR0VfQ2hpbmVzZVRyYWRpdGlvbmFsfSwKLSAgICB7RlhfTEFOR19DemVjaFJlcHVibGljLCBGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX0RhbmlzaF9EZW5tYXJrLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX0dlcm1hbl9HZXJtYW55LCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX0dyZWVrX0dyZWVjZSwgRlhfQ09ERVBBR0VfTVNXaW5fR3JlZWt9LAotICAgIHtGWF9MQU5HX0VuZ2xpc2hfVW5pdGVkU3RhdGVzLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX1NwYW5pc2hfVHJhZGl0aW9uYWxTb3J0LCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX0Zpbm5pc2hfRmlubGFuZCwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19GcmVuY2hfRnJhbmNlLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX0hlYnJld19Jc3JhZWwsIEZYX0NPREVQQUdFX01TV2luX0hlYnJld30sCi0gICAge0ZYX0xBTkdfSHVuZ2FyaWFuX0h1bmdhcnksIEZYX0NPREVQQUdFX01TV2luX0Vhc3Rlcm5FdXJvcGVhbn0sCi0gICAge0ZYX0xBTkdfSWNlbGFuZGljX0ljZWxhbmQsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sCi0gICAge0ZYX0xBTkdfSXRhbGlhbl9JdGFseSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19KYXBhbmVzZV9KYXBhbiwgRlhfQ09ERVBBR0VfU2hpZnRKSVN9LAotICAgIHtGWF9MQU5HX0tvcmVhbl9Lb3JlYSwgRlhfQ09ERVBBR0VfS29yZWFufSwKLSAgICB7RlhfTEFOR19EdXRjaF9OZXRoZXJsYW5kcywgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19Ob3J3ZWdpYW5fQm9rbWFsLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX1BvbGlzaF9Qb2xhbmQsIEZYX0NPREVQQUdFX01TV2luX0Vhc3Rlcm5FdXJvcGVhbn0sCi0gICAge0ZYX0xBTkdfUG9ydHVndWVzZV9CcmF6aWwsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sCi0gICAge0ZYX0xBTkdfUm9tYW5pYW5fUm9tYW5pYSwgRlhfQ09ERVBBR0VfTVNXaW5fRWFzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19SdXNzaWFuX1J1c3NpYSwgRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWN9LAotICAgIHtGWF9MQU5HX0Nyb2F0aWFuX0Nyb2F0aWEsIEZYX0NPREVQQUdFX01TV2luX0Vhc3Rlcm5FdXJvcGVhbn0sCi0gICAge0ZYX0xBTkdfU2xvdmFrX1Nsb3Zha2lhLCBGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX0FsYmFuaWFuX0FsYmFuaWEsIEZYX0NPREVQQUdFX01TV2luX0Vhc3Rlcm5FdXJvcGVhbn0sCi0gICAge0ZYX0xBTkdfU3dlZGlzaF9Td2VkZW4sIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sCi0gICAge0ZYX0xBTkdfVGhhaV9UaGFpbGFuZCwgRlhfQ09ERVBBR0VfTVNET1NfVGhhaX0sCi0gICAge0ZYX0xBTkdfVHVya2lzaF9UdXJrZXksIEZYX0NPREVQQUdFX01TV2luX1R1cmtpc2h9LAotICAgIHtGWF9MQU5HX1VyZHVfUGFraXN0YW4sIEZYX0NPREVQQUdFX01TV2luX0FyYWJpY30sCi0gICAge0ZYX0xBTkdfSW5kb25lc2lhbl9JbmRvbmVzaWEsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sCi0gICAge0ZYX0xBTkdfVWtyYWluaWFuX1VrcmFpbmUsIEZYX0NPREVQQUdFX01TV2luX0N5cmlsbGljfSwKLSAgICB7RlhfTEFOR19CZWxhcnVzaWFuX0JlbGFydXMsIEZYX0NPREVQQUdFX01TV2luX0N5cmlsbGljfSwKLSAgICB7RlhfTEFOR19TbG92ZW5pYW5fU2xvdmVuaWEsIEZYX0NPREVQQUdFX01TV2luX0Vhc3Rlcm5FdXJvcGVhbn0sCi0gICAge0ZYX0xBTkdfRXN0b25pYW5fRXN0b25pYSwgRlhfQ09ERVBBR0VfTVNXaW5fQmFsdGljfSwKLSAgICB7RlhfTEFOR19MYXR2aWFuX0xhdHZpYSwgRlhfQ09ERVBBR0VfTVNXaW5fQmFsdGljfSwKLSAgICB7RlhfTEFOR19MaXRodWFuaWFuX0xpdGh1YW5pYSwgRlhfQ09ERVBBR0VfTVNXaW5fQmFsdGljfSwKLSAgICB7RlhfTEFOR19QZXJzaWFuLCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LAotICAgIHtGWF9MQU5HX1ZpZXRuYW1lc2VfVmlldG5hbSwgRlhfQ09ERVBBR0VfTVNXaW5fVmlldG5hbWVzZX0sCi0gICAge0ZYX0xBTkdfQXJtZW5pYW5fQXJtZW5pYSwgRlhfQ09ERVBBR0VfRGVmQU5TSX0sCi0gICAge0ZYX0xBTkdfQXplcmJhaWphbl9MYXRpbiwgRlhfQ09ERVBBR0VfTVNXaW5fVHVya2lzaH0sCi0gICAge0ZYX0xBTkdfQmFzcXVlX0Jhc3F1ZSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19NYWNlZG9uaWFuLCBGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpY30sCi0gICAge0ZYX0xBTkdfQWZyaWthYW5zX1NvdXRoQWZyaWNhLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX0dlb3JnaWFuX0dlb3JnaWEsIEZYX0NPREVQQUdFX0RlZkFOU0l9LAotICAgIHtGWF9MQU5HX0Zhcm9lc2VfRmFyb2VJc2xhbmRzLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX0hpbmRpX0luZGlhLCBGWF9DT0RFUEFHRV9EZWZBTlNJfSwKLSAgICB7RlhfTEFOR19NYWxheV9NYWxheXNpYSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19LYXpha2hfS2F6YWtoc3RhbiwgRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWN9LAotICAgIHtGWF9MQU5HX0t5cmd5el9LeXJneXpzdGFuLCBGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpY30sCi0gICAge0ZYX0xBTkdfS2lzd2FoaWxpX0tlbnlhLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX1V6YmVrX0xhdGluVXpiZWtpc3RhbiwgRlhfQ09ERVBBR0VfTVNXaW5fVHVya2lzaH0sCi0gICAge0ZYX0xBTkdfVGF0YXJfUnVzc2lhLCBGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpY30sCi0gICAge0ZYX0xBTkdfUHVuamFiaV9JbmRpYSwgRlhfQ09ERVBBR0VfRGVmQU5TSX0sCi0gICAge0ZYX0xBTkdfR3VqYXJhdGlfSW5kaWEsIEZYX0NPREVQQUdFX0RlZkFOU0l9LAotICAgIHtGWF9MQU5HX1RhbWlsX0luZGlhLCBGWF9DT0RFUEFHRV9EZWZBTlNJfSwKLSAgICB7RlhfTEFOR19UZWx1Z3VfSW5kaWEsIEZYX0NPREVQQUdFX0RlZkFOU0l9LAotICAgIHtGWF9MQU5HX0thbm5hZGFfSW5kaWEsIEZYX0NPREVQQUdFX0RlZkFOU0l9LAotICAgIHtGWF9MQU5HX01hcmF0aGlfSW5kaWEsIEZYX0NPREVQQUdFX0RlZkFOU0l9LAotICAgIHtGWF9MQU5HX1NhbnNrcml0SW5kaWEsIEZYX0NPREVQQUdFX0RlZkFOU0l9LAotICAgIHtGWF9MQU5HX01vbmdvbGlhbl9DeXJpbGxpY01vbmdvbGlhLCBGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpY30sCi0gICAge0ZYX0xBTkdfR2FsaWNpYW5fR2FsaWNpYW4sIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sCi0gICAge0ZYX0xBTkdfS29ua2FuaV9JbmRpYSwgRlhfQ09ERVBBR0VfRGVmQU5TSX0sCi0gICAge0ZYX0xBTkdfU3lyaWFjX1N5cmlhLCBGWF9DT0RFUEFHRV9EZWZBTlNJfSwKLSAgICB7RlhfTEFOR19EaXZlaGlfTWFsZGl2ZXMsIEZYX0NPREVQQUdFX0RlZkFOU0l9LAotICAgIHtGWF9MQU5HX0FyYWJpY19JcmFxLCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LAotICAgIHtGWF9MQU5HX0NoaW5lc2VfUFJDLCBGWF9DT0RFUEFHRV9DaGluZXNlU2ltcGxpZmllZH0sCi0gICAge0ZYX0xBTkdfR2VybWFuX1N3aXR6ZXJsYW5kLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX0VuZ2xpc2hfVW5pdGVkS2luZ2RvbSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19TcGFuaXNoX01leGljbywgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19GcmVuY2hfQmVsZ2l1bSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19JdGFsaWFuX1N3aXR6ZXJsYW5kLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX0R1dGNoX0JlbGdpdW0sIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sCi0gICAge0ZYX0xBTkdfTm9yd2VnaWFuX055bm9yc2ssIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sCi0gICAge0ZYX0xBTkdfUG9ydHVndWVzZV9Qb3J0dWdhbCwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19TZXJiaWFuTGF0aW5fU2VyYmlhLCBGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX1N3ZWRpc2hfRmlubGFuZCwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19BemVyYmFpamFuX0N5cmlsbGljLCBGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpY30sCi0gICAge0ZYX0xBTkdfTWFsYXlfQnJ1bmVpRGFydXNzYWxhbSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19VemJla19DeXJpbGxpY1V6YmVraXN0YW4sIEZYX0NPREVQQUdFX01TV2luX0N5cmlsbGljfSwKLSAgICB7RlhfTEFOR19BcmFiaWNfRWd5cHQsIEZYX0NPREVQQUdFX01TV2luX0FyYWJpY30sCi0gICAge0ZYX0xBTkdfQ2hpbmVzZV9Ib25nS29uZywgRlhfQ09ERVBBR0VfQ2hpbmVzZVRyYWRpdGlvbmFsfSwKLSAgICB7RlhfTEFOR19HZXJtYW5fQXVzdHJpYSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19FbmdsaXNoX0F1c3RyYWxpYSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19TcGFuaXNoX0ludGVybmF0aW9uYWxTb3J0LCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX0ZyZW5jaF9DYW5hZGEsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sCi0gICAge0ZYX0xBTkdfU2VyYmlhbkN5cmlsbGljX1NlcmJpYSwgRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWN9LAotICAgIHtGWF9MQU5HX0FyYWJpY19MaWJ5YSwgRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljfSwKLSAgICB7RlhfTEFOR19DaGluZXNlX1NpbmdhcG9yZSwgRlhfQ09ERVBBR0VfQ2hpbmVzZVNpbXBsaWZpZWR9LAotICAgIHtGWF9MQU5HX0dlcm1hbl9MdXhlbWJvdXJnLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX0VuZ2xpc2hfQ2FuYWRhLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX1NwYW5pc2hfR3VhdGVtYWxhLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX0ZyZW5jaF9Td2l0emVybGFuZCwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19BcmFiaWNfQWxnZXJpYSwgRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljfSwKLSAgICB7RlhfTEFOR19DaGluZXNlX01hY2FvLCBGWF9DT0RFUEFHRV9DaGluZXNlVHJhZGl0aW9uYWx9LAotICAgIHtGWF9MQU5HX0dlcm1hbl9MaWVjaHRlbnN0ZWluLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX0VuZ2xpc2hfTmV3WmVhbGFuZCwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19TcGFuaXNoX0Nvc3RhUmljYSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19GcmVuY2hfTHV4ZW1ib3VyZywgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19BcmFiaWNfTW9yb2NjbywgRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljfSwKLSAgICB7RlhfTEFOR19FbmdsaXNoX0lyZWxhbmQsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9QYW5hbWEsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sCi0gICAge0ZYX0xBTkdfRnJlbmNoX01vbmFjbywgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19BcmFiaWNfVHVuaXNpYSwgRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljfSwKLSAgICB7RlhfTEFOR19FbmdsaXNoX1NvdXRoQWZyaWNhLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX1NwYW5pc2hfRG9taW5pY2FuUmVwdWJsaWMsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sCi0gICAge0ZYX0xBTkdfQXJhYmljX09tYW4sIEZYX0NPREVQQUdFX01TV2luX0FyYWJpY30sCi0gICAge0ZYX0xBTkdfRW5nbGlzaF9KYW1haWNhLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX1NwYW5pc2hfVmVuZXp1ZWxhLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX0FyYWJpY19ZZW1lbiwgRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljfSwKLSAgICB7RlhfTEFOR19FbmdsaXNoX0NhcmliYmVhbiwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19TcGFuaXNoX0NvbG9tYmlhLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX0FyYWJpY19TeXJpYSwgRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljfSwKLSAgICB7RlhfTEFOR19FbmdsaXNoX0JlbGl6ZSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19TcGFuaXNoX1BlcnUsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sCi0gICAge0ZYX0xBTkdfQXJhYmljX0pvcmRhbiwgRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljfSwKLSAgICB7RlhfTEFOR19FbmdsaXNoX1RyaW5pZGFkVG9iYWdvLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX1NwYW5pc2hfQXJnZW50aW5hLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX0FyYWJpY19MZWJhbm9uLCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LAotICAgIHtGWF9MQU5HX0VuZ2xpc2hfWmltYmFid2UsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9FY3VhZG9yLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX0FyYWJpY19LdXdhaXQsIEZYX0NPREVQQUdFX01TV2luX0FyYWJpY30sCi0gICAge0ZYX0xBTkdfRW5nbGlzaF9QaGlsaXBwaW5lcywgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19TcGFuaXNoX0NoaWxlLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX0FyYWJpY19VQUUsIEZYX0NPREVQQUdFX01TV2luX0FyYWJpY30sCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9VcnVndWF5LCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAotICAgIHtGWF9MQU5HX0FyYWJpY19CYWhyYWluLCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LAotICAgIHtGWF9MQU5HX1NwYW5pc2hfUGFyYWd1YXksIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sCi0gICAge0ZYX0xBTkdfQXJhYmljX1FhdGFyLCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LAotICAgIHtGWF9MQU5HX1NwYW5pc2hfQm9saXZpYSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19TcGFuaXNoX0VsU2FsdmFkb3IsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sCi0gICAge0ZYX0xBTkdfU3BhbmlzaF9Ib25kdXJhcywgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19TcGFuaXNoX05pY2FyYWd1YSwgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFufSwKLSAgICB7RlhfTEFOR19TcGFuaXNoX1B1ZXJ0b1JpY28sIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sCi19OwotCi1jb25zdCBGWF9TVFIyQ1BIQVNIIGdfRlhDUEhhc2hUYWJsZVtdID0gewotICAgIHsweGQ0NSwgMHg2ZmFmfSwgICAgICB7MHhkNDYsIDB4NmZiMH0sICAgICAgezB4ZDQ3LCAweDZmYjF9LAotICAgIHsweGQ0OCwgMHg2ZmIyfSwgICAgICB7MHhkNDksIDB4NGU2fSwgICAgICAgezB4ZDRkLCAweDZmYmR9LAotICAgIHsweGU5ZSwgMHg0ZTR9LCAgICAgICB7MHhjOTk4LCAweDFiNX0sICAgICAgezB4MThlZjAsIDB4M2E4fSwKLSAgICB7MHgxOWY4NSwgMHg1MTgyfSwgICAgezB4MmUyMzM1LCAweDNiNn0sICAgIHsweDMyNTE1MywgMHg1MTgyfSwKLSAgICB7MHgxNDViZGVkLCAweDI3MTZ9LCAgezB4M2M5YTVmMiwgMHhjNmYzfSwgIHsweDRjNDVmMmQsIDB4M2E0fSwKLSAgICB7MHg0YzQ1ZjRlLCAweGM0MzF9LCAgezB4NThjYWY1MSwgMHg0ZTR9LCAgIHsweDVhNWNkN2QsIDB4M2E4fSwKLSAgICB7MHg1YTZjNmE3LCAweDRlNH0sICAgezB4NWE2Y2EwYiwgMHgxYjV9LCAgIHsweDVhNmNkNjgsIDB4MzA3fSwKLSAgICB7MHg1YTZkOGQzLCAweDRlNH0sICAgezB4NWE2ZDk0OCwgMHgzNTR9LCAgIHsweDVhNmQ5NmIsIDB4MzYyfSwKLSAgICB7MHg1YTZkOTg0LCAweDM2Nn0sICAgezB4NWE5MGUzNSwgMHgxYjV9LCAgIHsweDVlMGNmMDAsIDB4NmZiNX0sCi0gICAgezB4NjA5YzMyNCwgMHg1NTF9LCAgIHsweDYxN2Q5N2YsIDB4NTE4Mn0sICB7MHg2YTZmZDkxLCAweGZkZTh9LAotICAgIHsweDZhNmZkOTIsIDB4ZmRlOX0sICB7MHg2YjEwMmRlLCAweGNhZGN9LCAgezB4NmIxMGY0OCwgMHg0ZTg5fSwKLSAgICB7MHgxMDIwODA1ZiwgMHg0ZTR9LCAgezB4MTBmMDUyNGMsIDB4NmZiNX0sIHsweDExZDU1OGZlLCAweDZmYjB9LAotICAgIHsweDEzODk4ZDE5LCAweGM0MmR9LCB7MHgxMzg5OGQzYSwgMHhjNDMxfSwgezB4MTM4YTMxOWUsIDB4NmZiMX0sCi0gICAgezB4MTQ2NzljMDksIDB4OTZjNn0sIHsweDE1M2YwYTNkLCAweDZmYjJ9LCB7MHgxNTc2ZWViMywgMHg0ZTIwfSwKLSAgICB7MHgxNjlhMGNlNiwgMHhjNmY5fSwgezB4MTZmM2UyZGMsIDB4NmZiM30sIHsweDE4YThiYjdhLCAweDZmYjR9LAotICAgIHsweDFhNWQ5NDE5LCAweDZmYjV9LCB7MHgxYTg0N2I0OCwgMHgzYTh9LCAgezB4MWI3NjI0MTksIDB4Y2VjOH0sCi0gICAgezB4MWI5ZDc4NDcsIDB4NDc1fSwgIHsweDFjMTI2Y2I5LCAweDZmYjZ9LCB7MHgxY2NkYmM3ZCwgMHg0ZjQyfSwKLSAgICB7MHgxZDMzMGY1ZiwgMHgyNzE0fSwgezB4MWRjNzQ1NTksIDB4NGU2fSwgIHsweDFlZGQ4MGRhLCAweDRlNH0sCi0gICAgezB4MjNlNGIwM2QsIDB4ZmRlOH0sIHsweDI0ZjI4YTE2LCAweDRmM2R9LCB7MHgyODZlN2EzMiwgMHgyNzE1fSwKLSAgICB7MHgyYzdjMThlZCwgMHgzYTh9LCAgezB4MmUyMTAzYjcsIDB4MjcxM30sIHsweDMwNGJmNDc5LCAweDZmYjR9LAotICAgIHsweDMwNGJmNDdkLCAweDZmYjV9LCB7MHgzMDliYjg2OSwgMHhmZGU4fSwgezB4MzA5YmI4NmEsIDB4ZmRlOX0sCi0gICAgezB4MzM2NjQzNTcsIDB4M2I2fSwgIHsweDM1MmQ2YjQ5LCAweDNhNH0sICB7MHgzNmY1NjYxYywgMHgxYjV9LAotICAgIHsweDM5MmU4ZjQ4LCAweGNhZGN9LCB7MHgzZGM3YzY0YywgMHg0N2N9LCAgezB4M2VkMmU4ZTEsIDB4NGU0fSwKLSAgICB7MHgzZjBjMmZlYSwgMHhjYWVkfSwgezB4M2YwZmVmOGYsIDB4YzZmMn0sIHsweDNmNWUxMzBmLCAweDUxODJ9LAotICAgIHsweDQ3MTc0ZDFmLCAweDNhOH0sICB7MHg0OTY4NmI3YiwgMHg2ZmI0fSwgezB4NGI4MGIwZDksIDB4M2E0fSwKLSAgICB7MHg0ZGNkYTk3YSwgMHg0ZTR9LCAgezB4NGRjZGE5YjYsIDB4NGU0fSwgIHsweDRlODgxZTZhLCAweDUyMjF9LAotICAgIHsweDRmZmRmNWExLCAweDM2YX0sICB7MHg0ZmZkZjVhNSwgMHg2ZmJkfSwgezB4NTI0MWNlMTYsIDB4NGU4Yn0sCi0gICAgezB4NTQ2YmFiOWQsIDB4NGU0fSwgIHsweDU0YTNkNjRlLCAweDZmYjZ9LCB7MHg1NjIxNzliZCwgMHg1MTYxfSwKLSAgICB7MHg1N2MxZGYxNSwgMHhjNmY3fSwgezB4NjFmZjZlNjIsIDB4NGYzNn0sIHsweDYzNTljN2Q4LCAweDRmMzV9LAotICAgIHsweDYzZjNjMzM1LCAweDNhOH0sICB7MHg2NDVhMGY3OCwgMHg0Nzd9LCAgezB4NjkxYWMyZmQsIDB4Mjc1Zn0sCi0gICAgezB4NmRjMmVhYjAsIDB4MmQwfSwgIHsweDZkYzJlZWVmLCAweDM1ZX0sICB7MHg2ZGMyZWYxMCwgMHgzNmF9LAotICAgIHsweDcxMDMxMzhhLCAweDQ3ZH0sICB7MHg3MTBkZmJkMCwgMHhjNmY1fSwgezB4NzMxOWY2Y2IsIDB4MzZhfSwKLSAgICB7MHg3NDUwOTZhZCwgMHgzYTh9LCAgezB4NzQ4NjYyMjksIDB4NGU4Y30sIHsweDc3MTg1ZmE1LCAweDNhOH0sCi0gICAgezB4Nzk1M2YwMDIsIDB4NmZhZn0sIHsweDc5NTNmMDAzLCAweDZmYjB9LCB7MHg3OTUzZjAwNCwgMHg2ZmIxfSwKLSAgICB7MHg3OTUzZjAwNSwgMHg2ZmIyfSwgezB4Nzk1M2YwMDYsIDB4NmZiN30sIHsweDc5NTNmMDBhLCAweDZmYmR9LAotICAgIHsweDdjNTc3NTcxLCAweDI3NjF9LCB7MHg3ZThjOGZmMSwgMHg0Nzl9LCAgezB4ODAzMWY0N2YsIDB4M2I1fSwKLSAgICB7MHg4MDMxZjQ4MSwgMHgzYjV9LCAgezB4ODBjNGE3MTAsIDB4NTE4N30sIHsweDg1N2M3ZTE0LCAweGZkZTh9LAotICAgIHsweDg1N2M3ZTE1LCAweGZkZTl9LCB7MHg4NmI1OWM5MCwgMHg0ZTR9LCAgezB4ODZiNTljOTEsIDB4NmZiMH0sCi0gICAgezB4ODZiNTljOTIsIDB4NmZiMX0sIHsweDg2YjU5YzkzLCAweDZmYjJ9LCB7MHg4NmI1OWM5NCwgMHg2ZmIzfSwKLSAgICB7MHg4NmI1OWM5NSwgMHg2ZmI0fSwgezB4ODZiNTljOTYsIDB4NmZiNX0sIHsweDg2YjU5Yzk3LCAweDRlN30sCi0gICAgezB4ODZiNTljOTgsIDB4NGU2fSwgIHsweDhiNGIyNGVjLCAweDUxOTB9LCB7MHg4ZmFjZTM2MiwgMHg0ZTR9LAotICAgIHsweDhmZjllYzJhLCAweGZkZTl9LCB7MHg5MTlkMzk4OSwgMHhjYWRjfSwgezB4OTk2N2U1YWQsIDB4NGUyMn0sCi0gICAgezB4OTlmOGI5MzMsIDB4NmZiZH0sIHsweDliZDJhMzgwLCAweDRmYzd9LCB7MHg5YmVmYWQyMywgMHg0ZjM4fSwKLSAgICB7MHg5YzdhYzY0OSwgMHg0ZjNjfSwgezB4YTAyNDY4ZGIsIDB4ZGVhZX0sIHsweGEwMjQ2OGVjLCAweGRlYWJ9LAotICAgIHsweGEwMjQ2OTJhLCAweGRlYWF9LCB7MHhhMDI0Njk5NywgMHhkZWIyfSwgezB4YTAyNDY5ZmYsIDB4ZGViMH0sCi0gICAgezB4YTAyNDZhM2QsIDB4ZGViMX0sIHsweGEwMjQ2YThjLCAweGRlYWZ9LCB7MHhhMDI0NmE5YSwgMHhkZWIzfSwKLSAgICB7MHhhMDI0NmIxNiwgMHhkZWFjfSwgezB4YTAyNDZiMWEsIDB4ZGVhZH0sIHsweGEwNzFhZGRjLCAweDRiMX0sCi0gICAgezB4YTM4YjYyZGMsIDB4NDc0fSwgIHsweGE0YzA5ZmVkLCAweDNhOH0sICB7MHhhNTFlODZlNSwgMHg0ZTd9LAotICAgIHsweGE2N2FiMTNlLCAweDNhNH0sICB7MHhhNzQxNDI0NCwgMHg1MWE5fSwgezB4YTlkZGJlYWQsIDB4YzZmYn0sCi0gICAgezB4YWIyNGZmYWIsIDB4NGU4YX0sIHsweGFiZWY4YWM0LCAweDI3MTB9LCB7MHhhYmZhMjBhYywgMHg2ZmI0fSwKLSAgICB7MHhhZDM2ODk1ZSwgMHg0ZTJ9LCAgezB4YWQzNjg5NWYsIDB4NGUzfSwgIHsweGFmMzEwZTkwLCAweDQwMn0sCi0gICAgezB4YWYzMTE2NmYsIDB4NGU4fSwgIHsweGFmNzI3N2E1LCAweDNiNn0sICB7MHhhZmMwZDhiMywgMHg5NmM2fSwKLSAgICB7MHhiMGZkNWRiYSwgMHhjYWUwfSwgezB4YjBmZDVlOTUsIDB4Y2FkY30sIHsweGIxMDUyODkzLCAweDcxNDl9LAotICAgIHsweGIxZTk4NzQ1LCAweDM2YX0sICB7MHhiMjc3ZTkxYywgMHg1MTY2fSwgezB4YjJmN2VhYzUsIDB4Y2FlMH0sCi0gICAgezB4YjJmN2ViYTAsIDB4Y2FkY30sIHsweGIyZjdlYmMxLCAweDNiNX0sICB7MHhiNTNmYTc3ZCwgMHgzYTh9LAotICAgIHsweGI2MzkxMTM4LCAweDZmYjV9LCB7MHhiNzM1OGI3ZiwgMHg2ZmI2fSwgezB4YjhjNDJiNDAsIDB4NGU0fSwKLSAgICB7MHhiOGM0MmVhNCwgMHgxYjV9LCAgezB4YjhjNDM5ZTcsIDB4MmUxfSwgIHsweGI4YzQzYTYxLCAweDMwN30sCi0gICAgezB4YjhjNDNkNmMsIDB4NGU0fSwgIHsweGI4YzQzZGRmLCAweDM1Mn0sICB7MHhiOGM0M2RlMSwgMHgzNTR9LAotICAgIHsweGI4YzQzZGU2LCAweDM1OX0sICB7MHhiOGM0M2RmZiwgMHgzNWR9LCAgezB4YjhjNDNlMDQsIDB4MzYyfSwKLSAgICB7MHhiOGM0M2UwNywgMHgzNjV9LCAgezB4YmNkMjlhN2YsIDB4M2E4fSwgIHsweGJjZTM0ZTc4LCAweDUxODJ9LAotICAgIHsweGJjZTM0ZTdiLCAweDU1NmF9LCB7MHhiY2U4MTUwNCwgMHgzYjV9LCAgezB4YmQ4YTRjOTUsIDB4MjcyZH0sCi0gICAgezB4YmRkODlkYWQsIDB4NGU0fSwgIHsweGJkZDg5ZGFlLCAweDZmYjB9LCB7MHhiZGQ4OWRhZiwgMHg2ZmIxfSwKLSAgICB7MHhiZGQ4OWRiMCwgMHg2ZmIyfSwgezB4YmRkODlkYjEsIDB4NGU2fSwgIHsweGJkZDg5ZGI1LCAweDZmYmR9LAotICAgIHsweGMxNzU2ZTlmLCAweDM2Yn0sICB7MHhjNzQ4MjQ0NCwgMHg0N2F9LCAgezB4YzkyODFjMTgsIDB4NGU0fSwKLSAgICB7MHhjOWVmOTVkZiwgMHg0N2J9LCAgezB4Y2NjOWRiMGQsIDB4NGU0fSwgIHsweGNjYzlkYjBlLCAweDZmYjB9LAotICAgIHsweGNkNzM0MjVmLCAweDNiNn0sICB7MHhjZTM4YjQwYiwgMHg0YjB9LCAgezB4Y2U5OWU1NDksIDB4MjV9LAotICAgIHsweGNmNTk4NzQwLCAweDRlN30sICB7MHhjZjZkNmY3OCwgMHg0ZTR9LCAgezB4Y2Y3NThkZjYsIDB4M2E0fSwKLSAgICB7MHhkMTI2NmU1MSwgMHg2ZmI1fSwgezB4ZDI5MTAyMTMsIDB4MjcxOH0sIHsweGQyOTE5NmJiLCAweDI3MTJ9LAotICAgIHsweGQzZWIyZmMyLCAweDQ3Nn0sICB7MHhkNDQyZGMyYywgMHg0ZmM0fSwgezB4ZDlkYTRkYTQsIDB4MjcxMX0sCi0gICAgezB4ZGJhZDJmNDIsIDB4NGU0fSwgIHsweGRiYWQyZjQzLCAweDZmYjB9LCB7MHhkYmFkMmY0NCwgMHg2ZmIxfSwKLSAgICB7MHhkYmFkMmY0NSwgMHg2ZmIyfSwgezB4ZGJhZDJmNDYsIDB4NmZiM30sIHsweGRiYWQyZjQ3LCAweDZmYjR9LAotICAgIHsweGRiYWQyZjQ4LCAweDZmYjV9LCB7MHhkYmFkMmY0OSwgMHg2ZmI2fSwgezB4ZGJhZDJmNGEsIDB4NGU2fSwKLSAgICB7MHhkYzQzODAzMywgMHg0ZjMxfSwgezB4ZGNjYjQzOWIsIDB4NDc3fSwgIHsweGRjY2RjNjI2LCAweDNiNX0sCi0gICAgezB4ZGQ4MGE1OTUsIDB4NGU0fSwgIHsweGRkODBhNTk2LCAweDZmYjB9LCB7MHhkZDgwYTU5ZSwgMHg2ZmIxfSwKLSAgICB7MHhkZDgwYTViNCwgMHg2ZmIyfSwgezB4ZGQ4MGE1ZDksIDB4NmZiNX0sIHsweGRkODBhNWRhLCAweDZmYjR9LAotICAgIHsweGRkODBhNWZhLCAweDZmYjZ9LCB7MHhkZDgwYTYxNSwgMHg2ZmIzfSwgezB4ZGQ4MGE2MTksIDB4NGU2fSwKLSAgICB7MHhkZDgwYTYxYSwgMHgzYjV9LCAgezB4ZGQ4MGMwZjgsIDB4NGU5Zn0sIHsweGRmN2U0NmZmLCAweDRmYzh9LAotICAgIHsweGRmODY4MGZkLCAweDU1NmF9LCB7MHhkZmIwYmQ2ZSwgMHhjNDJkfSwgezB4ZGZmMDU0ODYsIDB4MmM0fSwKLSAgICB7MHhlMzMyMzM5OSwgMHgzYTR9LCAgezB4ZTYwNDEyZGQsIDB4M2I1fSwgIHsweGVlZTQ3YWRkLCAweDRiMH0sCi0gICAgezB4ZjAyMWExODYsIDB4NGUyfSwgIHsweGYwMjFhMTg3LCAweDRlM30sICB7MHhmMDIxYTE4OCwgMHg0ZTR9LAotICAgIHsweGYwMjFhMTg5LCAweDRlNX0sICB7MHhmMDIxYTE4YSwgMHg0ZTZ9LCAgezB4ZjAyMWExOGIsIDB4NGU3fSwKLSAgICB7MHhmMDIxYTE4YywgMHg0ZTh9LCAgezB4ZjAyMWExOGQsIDB4NGU5fSwgIHsweGYwMjFhMThlLCAweDRlYX0sCi0gICAgezB4ZjA3MDA0NTYsIDB4NmZiM30sIHsweGYyNzRmMTc1LCAweDNiNX0sICB7MHhmMmE5NzMwYiwgMHgzYTh9LAotICAgIHsweGYzZDQ2M2MyLCAweDNhNH0sICB7MHhmNTJhNzBhMywgMHhjNDJlfSwgezB4ZjU2OTMxNDcsIDB4NmZiM30sCi0gICAgezB4ZjYzN2UxNTcsIDB4NDc4fSwgIHsweGZjMjEzZjNhLCAweDI3MTd9LCB7MHhmZjY1NGQxNCwgMHgzYjV9LAotfTsKLQotdWludDE2X3QgR2V0Q29kZVBhZ2VGcm9tU3RyaW5nQShjb25zdCBGWF9DSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpIHsKLSAgQVNTRVJUKHBTdHIpOwotICBpZiAoaUxlbmd0aCA8IDApIHsKLSAgICBpTGVuZ3RoID0gRlhTWVNfc3RybGVuKHBTdHIpOwotICB9Ci0gIGlmIChpTGVuZ3RoID09IDApIHsKLSAgICByZXR1cm4gMHhGRkZGOwotICB9Ci0gIHVpbnQzMl90IHVIYXNoID0gRlhfSGFzaENvZGVfR2V0QShDRlhfQnl0ZVN0cmluZ0MocFN0ciwgaUxlbmd0aCksIHRydWUpOwotICBpbnQzMl90IGlTdGFydCA9IDA7Ci0gIGludDMyX3QgaUVuZCA9IHNpemVvZihnX0ZYQ1BIYXNoVGFibGUpIC8gc2l6ZW9mKEZYX1NUUjJDUEhBU0gpIC0gMTsKLSAgQVNTRVJUKGlFbmQgPj0gMCk7Ci0gIGRvIHsKLSAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOwotICAgIGNvbnN0IEZYX1NUUjJDUEhBU0gmIGNwID0gZ19GWENQSGFzaFRhYmxlW2lNaWRdOwotICAgIGlmICh1SGFzaCA9PSBjcC51SGFzaCkgewotICAgICAgcmV0dXJuICh1aW50MTZfdCljcC51Q29kZVBhZ2U7Ci0gICAgfSBlbHNlIGlmICh1SGFzaCA8IGNwLnVIYXNoKSB7Ci0gICAgICBpRW5kID0gaU1pZCAtIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlTdGFydCA9IGlNaWQgKyAxOwotICAgIH0KLSAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOwotICByZXR1cm4gMHhGRkZGOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotdWludDE2X3QgRlhfR2V0Q29kZVBhZ2VGcm9tQ2hhcnNldCh1aW50OF90IGNoYXJzZXQpIHsKLSAgaW50MzJfdCBpRW5kID0gc2l6ZW9mKGdfRlhDaGFyc2V0MkNvZGVQYWdlVGFibGUpIC8gc2l6ZW9mKEZYX0NIQVJTRVRfTUFQKSAtIDE7Ci0gIEFTU0VSVChpRW5kID49IDApOwotICBpbnQzMl90IGlTdGFydCA9IDAsIGlNaWQ7Ci0gIGRvIHsKLSAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsKLSAgICBjb25zdCBGWF9DSEFSU0VUX01BUCYgY3AgPSBnX0ZYQ2hhcnNldDJDb2RlUGFnZVRhYmxlW2lNaWRdOwotICAgIGlmIChjaGFyc2V0ID09IGNwLmNoYXJzZXQpIHsKLSAgICAgIHJldHVybiBjcC5jb2RlcGFnZTsKLSAgICB9IGVsc2UgaWYgKGNoYXJzZXQgPCBjcC5jaGFyc2V0KSB7Ci0gICAgICBpRW5kID0gaU1pZCAtIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlTdGFydCA9IGlNaWQgKyAxOwotICAgIH0KLSAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOwotICByZXR1cm4gMHhGRkZGOwotfQotCi11aW50MTZfdCBGWF9HZXREZWZDb2RlUGFnZUJ5TGFuZ3VhZ2UodWludDE2X3Qgd0xhbmd1YWdlKSB7Ci0gIGludDMyX3QgaUVuZCA9IHNpemVvZihnX0ZYTGFuZzJDb2RlcGFnZVRhYmxlKSAvIHNpemVvZihGWF9MQU5HMkNQTUFQKSAtIDE7Ci0gIEFTU0VSVChpRW5kID49IDApOwotICBpbnQzMl90IGlTdGFydCA9IDAsIGlNaWQ7Ci0gIGRvIHsKLSAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsKLSAgICBjb25zdCBGWF9MQU5HMkNQTUFQJiBjcCA9IGdfRlhMYW5nMkNvZGVwYWdlVGFibGVbaU1pZF07Ci0gICAgaWYgKHdMYW5ndWFnZSA9PSBjcC53TGFuZ3VhZ2UpIHsKLSAgICAgIHJldHVybiBjcC53Q29kZXBhZ2U7Ci0gICAgfSBlbHNlIGlmICh3TGFuZ3VhZ2UgPCBjcC53TGFuZ3VhZ2UpIHsKLSAgICAgIGlFbmQgPSBpTWlkIC0gMTsKLSAgICB9IGVsc2UgewotICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7Ci0gICAgfQotICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7Ci0gIHJldHVybiAweEZGRkY7Ci19Ci0KLXVpbnQxNl90IEZYX0dldENvZGVQYWdlRnJvbVN0cmluZ1coY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCkgewotICBpZiAoaUxlbmd0aCA8IDApIHsKLSAgICBpTGVuZ3RoID0gRlhTWVNfd2NzbGVuKHBTdHIpOwotICB9Ci0gIGlmIChpTGVuZ3RoID09IDApIHsKLSAgICByZXR1cm4gMHhGRkZGOwotICB9Ci0gIENGWF9CeXRlU3RyaW5nIGNzU3RyOwotICBGWF9DSEFSKiBwQnVmID0gY3NTdHIuR2V0QnVmZmVyKGlMZW5ndGggKyAxKTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxlbmd0aDsgKytpKSB7Ci0gICAgKnBCdWYrKyA9IChGWF9DSEFSKSpwU3RyKys7Ci0gIH0KLSAgY3NTdHIuUmVsZWFzZUJ1ZmZlcihpTGVuZ3RoKTsKLSAgcmV0dXJuIEdldENvZGVQYWdlRnJvbVN0cmluZ0EoY3NTdHIuY19zdHIoKSwgaUxlbmd0aCk7Ci19Ci0KLXZvaWQgRlhfU3dhcEJ5dGVPcmRlcihGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKSB7Ci0gIEFTU0VSVChwU3RyKTsKLSAgaWYgKGlMZW5ndGggPCAwKSB7Ci0gICAgaUxlbmd0aCA9IEZYU1lTX3djc2xlbihwU3RyKTsKLSAgfQotICB1aW50MTZfdCB3Y2g7Ci0gIGlmIChzaXplb2YoRlhfV0NIQVIpID4gMikgewotICAgIHdoaWxlIChpTGVuZ3RoLS0gPiAwKSB7Ci0gICAgICB3Y2ggPSAodWludDE2X3QpKnBTdHI7Ci0gICAgICB3Y2ggPSAod2NoID4+IDgpIHwgKHdjaCA8PCA4KTsKLSAgICAgIHdjaCAmPSAweDAwRkY7Ci0gICAgICAqcFN0cisrID0gd2NoOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB3aGlsZSAoaUxlbmd0aC0tID4gMCkgewotICAgICAgd2NoID0gKHVpbnQxNl90KSpwU3RyOwotICAgICAgd2NoID0gKHdjaCA+PiA4KSB8ICh3Y2ggPDwgOCk7Ci0gICAgICAqcFN0cisrID0gd2NoOwotICAgIH0KLSAgfQotfQotCi12b2lkIEZYX1VURjE2VG9XQ2hhcih2b2lkKiBwQnVmZmVyLCBpbnQzMl90IGlMZW5ndGgpIHsKLSAgQVNTRVJUKHBCdWZmZXIgJiYgaUxlbmd0aCA+IDApOwotICBpZiAoc2l6ZW9mKEZYX1dDSEFSKSA9PSAyKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHVpbnQxNl90KiBwU3JjID0gKHVpbnQxNl90KilwQnVmZmVyOwotICBGWF9XQ0hBUiogcERzdCA9IChGWF9XQ0hBUiopcEJ1ZmZlcjsKLSAgd2hpbGUgKC0taUxlbmd0aCA+PSAwKSB7Ci0gICAgcERzdFtpTGVuZ3RoXSA9IChGWF9XQ0hBUilwU3JjW2lMZW5ndGhdOwotICB9Ci19Ci0KLWludDMyX3QgRlhfRGVjb2RlU3RyaW5nKHVpbnQxNl90IHdDb2RlUGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0NIQVIqIHBTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBwU3JjTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIqIHBEc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBwRHN0TGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRXJyQnJlYWspIHsKLSAgaWYgKHdDb2RlUGFnZSA9PSBGWF9DT0RFUEFHRV9VVEY4KSB7Ci0gICAgcmV0dXJuIEZYX1VURjhEZWNvZGUocFNyYywgcFNyY0xlbiwgcERzdCwgcERzdExlbik7Ci0gIH0KLSAgcmV0dXJuIC0xOwotfQotaW50MzJfdCBGWF9VVEY4RGVjb2RlKGNvbnN0IEZYX0NIQVIqIHBTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcFNyY0xlbiwKLSAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiogcERzdCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBwRHN0TGVuKSB7Ci0gIGlmICghcFNyY0xlbiB8fCAhcERzdExlbikgewotICAgIHJldHVybiAtMTsKLSAgfQotICBpbnQzMl90IGlTcmNMZW4gPSAqcFNyY0xlbjsKLSAgaWYgKGlTcmNMZW4gPCAxKSB7Ci0gICAgKnBTcmNMZW4gPSAqcERzdExlbiA9IDA7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgaW50MzJfdCBpRHN0TGVuID0gKnBEc3RMZW47Ci0gIGJvb2wgYlZhbGlkRHN0ID0gKHBEc3QgJiYgaURzdExlbiA+IDApOwotICB1aW50MzJfdCBkd0NvZGUgPSAwOwotICBpbnQzMl90IGlQZW5kaW5nID0gMDsKLSAgaW50MzJfdCBpU3JjTnVtID0gMCwgaURzdE51bSA9IDA7Ci0gIGludDMyX3QgayA9IDA7Ci0gIGludDMyX3QgaUluZGV4ID0gMDsKLSAgayA9IDE7Ci0gIHdoaWxlIChpSW5kZXggPCBpU3JjTGVuKSB7Ci0gICAgdWludDhfdCBieXRlID0gKHVpbnQ4X3QpICogKHBTcmMgKyBpSW5kZXgpOwotICAgIGlmIChieXRlIDwgMHg4MCkgewotICAgICAgaVBlbmRpbmcgPSAwOwotICAgICAgayA9IDE7Ci0gICAgICBpRHN0TnVtKys7Ci0gICAgICBpU3JjTnVtICs9IGs7Ci0gICAgICBpZiAoYlZhbGlkRHN0KSB7Ci0gICAgICAgICpwRHN0KysgPSBieXRlOwotICAgICAgICBpZiAoaURzdE51bSA+PSBpRHN0TGVuKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGJ5dGUgPCAweGMwKSB7Ci0gICAgICBpZiAoaVBlbmRpbmcgPCAxKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaVBlbmRpbmctLTsKLSAgICAgIGR3Q29kZSB8PSAoYnl0ZSAmIDB4M2YpIDw8IChpUGVuZGluZyAqIDYpOwotICAgICAgaWYgKGlQZW5kaW5nID09IDApIHsKLSAgICAgICAgaURzdE51bSsrOwotICAgICAgICBpU3JjTnVtICs9IGs7Ci0gICAgICAgIGlmIChiVmFsaWREc3QpIHsKLSAgICAgICAgICAqcERzdCsrID0gZHdDb2RlOwotICAgICAgICAgIGlmIChpRHN0TnVtID49IGlEc3RMZW4pIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSBpZiAoYnl0ZSA8IDB4ZTApIHsKLSAgICAgIGlQZW5kaW5nID0gMTsKLSAgICAgIGsgPSAyOwotICAgICAgZHdDb2RlID0gKGJ5dGUgJiAweDFmKSA8PCA2OwotICAgIH0gZWxzZSBpZiAoYnl0ZSA8IDB4ZjApIHsKLSAgICAgIGlQZW5kaW5nID0gMjsKLSAgICAgIGsgPSAzOwotICAgICAgZHdDb2RlID0gKGJ5dGUgJiAweDBmKSA8PCAxMjsKLSAgICB9IGVsc2UgaWYgKGJ5dGUgPCAweGY4KSB7Ci0gICAgICBpUGVuZGluZyA9IDM7Ci0gICAgICBrID0gNDsKLSAgICAgIGR3Q29kZSA9IChieXRlICYgMHgwNykgPDwgMTg7Ci0gICAgfSBlbHNlIGlmIChieXRlIDwgMHhmYykgewotICAgICAgaVBlbmRpbmcgPSA0OwotICAgICAgayA9IDU7Ci0gICAgICBkd0NvZGUgPSAoYnl0ZSAmIDB4MDMpIDw8IDI0OwotICAgIH0gZWxzZSBpZiAoYnl0ZSA8IDB4ZmUpIHsKLSAgICAgIGlQZW5kaW5nID0gNTsKLSAgICAgIGsgPSA2OwotICAgICAgZHdDb2RlID0gKGJ5dGUgJiAweDAxKSA8PCAzMDsKLSAgICB9IGVsc2UgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlJbmRleCsrOwotICB9Ci0gICpwU3JjTGVuID0gaVNyY051bTsKLSAgKnBEc3RMZW4gPSBpRHN0TnVtOwotICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9mZ2FzL2NydC9mZ2FzX2NvZGVwYWdlLmggYi94ZmEvZmdhcy9jcnQvZmdhc19jb2RlcGFnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODBjMjBlLi4wMDAwMDAwCi0tLSBhL3hmYS9mZ2FzL2NydC9mZ2FzX2NvZGVwYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GR0FTX0NSVF9GR0FTX0NPREVQQUdFX0hfCi0jZGVmaW5lIFhGQV9GR0FTX0NSVF9GR0FTX0NPREVQQUdFX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0KLSNkZWZpbmUgRlhfQ09ERVBBR0VfRGVmQU5TSSAwCi0jZGVmaW5lIEZYX0NPREVQQUdFX0RlZk9FTSAxCi0jZGVmaW5lIEZYX0NPREVQQUdFX0RlZk1BQyAyCi0jZGVmaW5lIEZYX0NPREVQQUdFX1RocmVhZCAzCi0jZGVmaW5lIEZYX0NPREVQQUdFX1N5bWJvbCA0MgotI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19VUyA0MzcKLSNkZWZpbmUgRlhfQ09ERVBBR0VfQXJhYmljX0FTTU83MDggNzA4Ci0jZGVmaW5lIEZYX0NPREVQQUdFX0FyYWJpY19BU01PNDQ5UGx1cyA3MDkKLSNkZWZpbmUgRlhfQ09ERVBBR0VfQXJhYmljX1RyYW5zcGFyZW50IDcxMAotI2RlZmluZSBGWF9DT0RFUEFHRV9BcmFiaWNfTmFmaXRoYUVuaGFuY2VkIDcxMQotI2RlZmluZSBGWF9DT0RFUEFHRV9BcmFiaWNfVHJhbnNwYXJlbnRBU01PIDcyMAotI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19HcmVlazEgNzM3Ci0jZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0JhbHRpYyA3NzUKLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW4zMV9XZXN0ZXJuRXVyb3BlYW4gODE5Ci0jZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX1dlc3Rlcm5FdXJvcGVhbiA4NTAKLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfRWFzdGVybkV1cm9wZWFuIDg1MgotI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19MYXRpbjMgODUzCi0jZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0N5cmlsbGljIDg1NQotI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19UdXJraXNoIDg1NwotI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19MYXRpbjFFdXJvIDg1OAotI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19Qb3J0dWd1ZXNlIDg2MAotI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19JY2VsYW5kaWMgODYxCi0jZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0hlYnJldyA4NjIKLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfRnJlbmNoQ2FuYWRpYW4gODYzCi0jZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0FyYWJpYyA4NjQKLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNET1NfTm9yd2VnaWFuIDg2NQotI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19SdXNzaWFuIDg2NgotI2RlZmluZSBGWF9DT0RFUEFHRV9NU0RPU19HcmVlazIgODY5Ci0jZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX1RoYWkgODc0Ci0jZGVmaW5lIEZYX0NPREVQQUdFX01TRE9TX0thbWVuaWNreUNTIDg5NQotI2RlZmluZSBGWF9DT0RFUEFHRV9TaGlmdEpJUyA5MzIKLSNkZWZpbmUgRlhfQ09ERVBBR0VfQ2hpbmVzZVNpbXBsaWZpZWQgOTM2Ci0jZGVmaW5lIEZYX0NPREVQQUdFX0tvcmVhbiA5NDkKLSNkZWZpbmUgRlhfQ09ERVBBR0VfQ2hpbmVzZVRyYWRpdGlvbmFsIDk1MAotI2RlZmluZSBGWF9DT0RFUEFHRV9VVEYxNkxFIDEyMDAKLSNkZWZpbmUgRlhfQ09ERVBBR0VfVVRGMTZCRSAxMjAxCi0jZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX0Vhc3Rlcm5FdXJvcGVhbiAxMjUwCi0jZGVmaW5lIEZYX0NPREVQQUdFX01TV2luX0N5cmlsbGljIDEyNTEKLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFuIDEyNTIKLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW5fR3JlZWsgMTI1MwotI2RlZmluZSBGWF9DT0RFUEFHRV9NU1dpbl9UdXJraXNoIDEyNTQKLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW5fSGVicmV3IDEyNTUKLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljIDEyNTYKLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW5fQmFsdGljIDEyNTcKLSNkZWZpbmUgRlhfQ09ERVBBR0VfTVNXaW5fVmlldG5hbWVzZSAxMjU4Ci0jZGVmaW5lIEZYX0NPREVQQUdFX0pvaGFiIDEzNjEKLSNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX1JvbWFuIDEwMDAwCi0jZGVmaW5lIEZYX0NPREVQQUdFX01BQ19TaGlmdEpJUyAxMDAwMQotI2RlZmluZSBGWF9DT0RFUEFHRV9NQUNfQ2hpbmVzZVRyYWRpdGlvbmFsIDEwMDAyCi0jZGVmaW5lIEZYX0NPREVQQUdFX01BQ19Lb3JlYW4gMTAwMDMKLSNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX0FyYWJpYyAxMDAwNAotI2RlZmluZSBGWF9DT0RFUEFHRV9NQUNfSGVicmV3IDEwMDA1Ci0jZGVmaW5lIEZYX0NPREVQQUdFX01BQ19HcmVlayAxMDAwNgotI2RlZmluZSBGWF9DT0RFUEFHRV9NQUNfQ3lyaWxsaWMgMTAwMDcKLSNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX0NoaW5lc2VTaW1wbGlmaWVkIDEwMDA4Ci0jZGVmaW5lIEZYX0NPREVQQUdFX01BQ19UaGFpIDEwMDIxCi0jZGVmaW5lIEZYX0NPREVQQUdFX01BQ19FYXN0ZXJuRXVyb3BlYW4gMTAwMjkKLSNkZWZpbmUgRlhfQ09ERVBBR0VfTUFDX1R1cmtpc2ggMTAwODEKLSNkZWZpbmUgRlhfQ09ERVBBR0VfVVRGMzJMRSAxMjAwMAotI2RlZmluZSBGWF9DT0RFUEFHRV9VVEYzMkJFIDEyMDAxCi0jZGVmaW5lIEZYX0NPREVQQUdFX0lTTzg4NTlfMSAyODU5MQotI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzIgMjg1OTIKLSNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV8zIDI4NTkzCi0jZGVmaW5lIEZYX0NPREVQQUdFX0lTTzg4NTlfNCAyODU5NAotI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzUgMjg1OTUKLSNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV82IDI4NTk2Ci0jZGVmaW5lIEZYX0NPREVQQUdFX0lTTzg4NTlfNyAyODU5NwotI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzggMjg1OTgKLSNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV85IDI4NTk5Ci0jZGVmaW5lIEZYX0NPREVQQUdFX0lTTzg4NTlfMTAgMjg2MDAKLSNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV8xMSAyODYwMQotI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzEyIDI4NjAyCi0jZGVmaW5lIEZYX0NPREVQQUdFX0lTTzg4NTlfMTMgMjg2MDMKLSNkZWZpbmUgRlhfQ09ERVBBR0VfSVNPODg1OV8xNCAyODYwNAotI2RlZmluZSBGWF9DT0RFUEFHRV9JU084ODU5XzE1IDI4NjA1Ci0jZGVmaW5lIEZYX0NPREVQQUdFX0lTTzg4NTlfMTYgMjg2MDYKLSNkZWZpbmUgRlhfQ09ERVBBR0VfSVNDSUlfRGV2YW5hZ2FyaSA1NzAwMgotI2RlZmluZSBGWF9DT0RFUEFHRV9JU0NJSV9CZW5nYWxpIDU3MDAzCi0jZGVmaW5lIEZYX0NPREVQQUdFX0lTQ0lJX1RhbWlsIDU3MDA0Ci0jZGVmaW5lIEZYX0NPREVQQUdFX0lTQ0lJX1RlbHVndSA1NzAwNQotI2RlZmluZSBGWF9DT0RFUEFHRV9JU0NJSV9Bc3NhbWVzZSA1NzAwNgotI2RlZmluZSBGWF9DT0RFUEFHRV9JU0NJSV9Pcml5YSA1NzAwNwotI2RlZmluZSBGWF9DT0RFUEFHRV9JU0NJSV9LYW5uYWRhIDU3MDA4Ci0jZGVmaW5lIEZYX0NPREVQQUdFX0lTQ0lJX01hbGF5YWxhbSA1NzAwOQotI2RlZmluZSBGWF9DT0RFUEFHRV9JU0NJSV9HdWphcmF0aSA1NzAxMAotI2RlZmluZSBGWF9DT0RFUEFHRV9JU0NJSV9QdW5qYWJpIDU3MDExCi0jZGVmaW5lIEZYX0NPREVQQUdFX1VURjcgNjUwMDAKLSNkZWZpbmUgRlhfQ09ERVBBR0VfVVRGOCA2NTAwMQotI2RlZmluZSBGWF9DSEFSU0VUX0FOU0kgMAotI2RlZmluZSBGWF9DSEFSU0VUX0RlZmF1bHQgMQotI2RlZmluZSBGWF9DSEFSU0VUX1N5bWJvbCAyCi0jZGVmaW5lIEZYX0NIQVJTRVRfTUFDX1JvbWFuIDc3Ci0jZGVmaW5lIEZYX0NIQVJTRVRfTUFDX1NoaWZ0SklTIDc4Ci0jZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0tvcmVhbiA3OQotI2RlZmluZSBGWF9DSEFSU0VUX01BQ19DaGluZXNlU2ltcGxpZmllZCA4MAotI2RlZmluZSBGWF9DSEFSU0VUX01BQ19DaGluZXNlVHJpZGl0aW9uYWwgODEKLSNkZWZpbmUgRlhfQ0hBUlNFVF9NQUNfSm9oYWIgODIKLSNkZWZpbmUgRlhfQ0hBUlNFVF9NQUNfSGVicmV3IDgzCi0jZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0FyYWJpYyA4NAotI2RlZmluZSBGWF9DSEFSU0VUX01BQ19HcmVlayA4NQotI2RlZmluZSBGWF9DSEFSU0VUX01BQ19UdXJraXNoIDg2Ci0jZGVmaW5lIEZYX0NIQVJTRVRfTUFDX1RoYWkgODcKLSNkZWZpbmUgRlhfQ0hBUlNFVF9NQUNfRWFzdGVybkV1cm9wZWFuIDg4Ci0jZGVmaW5lIEZYX0NIQVJTRVRfTUFDX0N5cmlsbGljIDg5Ci0jZGVmaW5lIEZYX0NIQVJTRVRfU2hpZnRKSVMgMTI4Ci0jZGVmaW5lIEZYX0NIQVJTRVRfS29yZWFuIDEyOQotI2RlZmluZSBGWF9DSEFSU0VUX0pvaGFiIDEzMAotI2RlZmluZSBGWF9DSEFSU0VUX0NoaW5lc2VTaW1wbGlmaWVkIDEzNAotI2RlZmluZSBGWF9DSEFSU0VUX0NoaW5lc2VUcmlkaXRpb25hbCAxMzYKLSNkZWZpbmUgRlhfQ0hBUlNFVF9NU1dpbl9HcmVlayAxNjEKLSNkZWZpbmUgRlhfQ0hBUlNFVF9NU1dpbl9UdXJraXNoIDE2MgotI2RlZmluZSBGWF9DSEFSU0VUX01TV2luX1ZpZXRuYW1lc2UgMTYzCi0jZGVmaW5lIEZYX0NIQVJTRVRfTVNXaW5fSGVicmV3IDE3NwotI2RlZmluZSBGWF9DSEFSU0VUX01TV2luX0FyYWJpYyAxNzgKLSNkZWZpbmUgRlhfQ0hBUlNFVF9BcmFiaWNUcmFkaXRpb25hbCAxNzkKLSNkZWZpbmUgRlhfQ0hBUlNFVF9BcmFiaWNVc2VyIDE4MAotI2RlZmluZSBGWF9DSEFSU0VUX0hlYnJld1VzZXIgMTgxCi0jZGVmaW5lIEZYX0NIQVJTRVRfTVNXaW5fQmFsdGljIDE4NgotI2RlZmluZSBGWF9DSEFSU0VUX01TV2luX0N5cmlsbGljIDIwNAotI2RlZmluZSBGWF9DSEFSU0VUX1RoYWkgMjIyCi0jZGVmaW5lIEZYX0NIQVJTRVRfTVNXaW5fRWFzdGVyRXVyb3BlYW4gMjM4Ci0jZGVmaW5lIEZYX0NIQVJTRVRfVVMgMjU0Ci0jZGVmaW5lIEZYX0NIQVJTRVRfT0VNIDI1NQotCi11aW50MTZfdCBGWF9HZXRDb2RlUGFnZUZyb21DaGFyc2V0KHVpbnQ4X3QgY2hhcnNldCk7Ci11aW50MTZfdCBGWF9HZXRDb2RlUGFnZUZyb21TdHJpbmdXKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpOwotdWludDE2X3QgRlhfR2V0RGVmQ29kZVBhZ2VCeUxhbmd1YWdlKHVpbnQxNl90IHdMYW5ndWFnZSk7Ci12b2lkIEZYX1N3YXBCeXRlT3JkZXIoRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCk7Ci0KLXZvaWQgRlhfVVRGMTZUb1dDaGFyKHZvaWQqIHBCdWZmZXIsIGludDMyX3QgaUxlbmd0aCk7Ci1pbnQzMl90IEZYX0RlY29kZVN0cmluZyh1aW50MTZfdCB3Q29kZVBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9DSEFSKiBwU3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcFNyY0xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSKiBwRHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcERzdExlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkVyckJyZWFrKTsKLWludDMyX3QgRlhfVVRGOERlY29kZShjb25zdCBGWF9DSEFSKiBwU3JjLAotICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBTcmNMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIqIHBEc3QsCi0gICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcERzdExlbik7Ci0KLSNlbmRpZiAgLy8gWEZBX0ZHQVNfQ1JUX0ZHQVNfQ09ERVBBR0VfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZ2FzL2NydC9mZ2FzX2xhbmd1YWdlLmggYi94ZmEvZmdhcy9jcnQvZmdhc19sYW5ndWFnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWQ2OGU2Li4wMDAwMDAwCi0tLSBhL3hmYS9mZ2FzL2NydC9mZ2FzX2xhbmd1YWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GR0FTX0NSVF9GR0FTX0xBTkdVQUdFX0hfCi0jZGVmaW5lIFhGQV9GR0FTX0NSVF9GR0FTX0xBTkdVQUdFX0hfCi0KLSNkZWZpbmUgRlhfTEFOR19OZXV0cmFsIDB4MDAwMAotI2RlZmluZSBGWF9MQU5HX0ludmFyaWFudCAweDAwN2YKLSNkZWZpbmUgRlhfTEFOR19Vc2VyRGVmYXVsdCAweDA0MDAKLSNkZWZpbmUgRlhfTEFOR19TeXN0ZW1EZWZhdWx0IDB4MDgwMAotI2RlZmluZSBGWF9MQU5HX0FmcmlrYWFuc19Tb3V0aEFmcmljYSAweDA0MzYKLSNkZWZpbmUgRlhfTEFOR19BbGJhbmlhbl9BbGJhbmlhIDB4MDQxYwotI2RlZmluZSBGWF9MQU5HX0Fsc2F0aWFuX0ZyYW5jZSAweDA0ODQKLSNkZWZpbmUgRlhfTEFOR19BbWhhcmljX0V0aGlvcGlhIDB4MDQ1ZQotI2RlZmluZSBGWF9MQU5HX0FyYWJpY19BbGdlcmlhIDB4MTQwMQotI2RlZmluZSBGWF9MQU5HX0FyYWJpY19CYWhyYWluIDB4M2MwMQotI2RlZmluZSBGWF9MQU5HX0FyYWJpY19FZ3lwdCAweDBjMDEKLSNkZWZpbmUgRlhfTEFOR19BcmFiaWNfSXJhcSAweDA4MDEKLSNkZWZpbmUgRlhfTEFOR19BcmFiaWNfSm9yZGFuIDB4MmMwMQotI2RlZmluZSBGWF9MQU5HX0FyYWJpY19LdXdhaXQgMHgzNDAxCi0jZGVmaW5lIEZYX0xBTkdfQXJhYmljX0xlYmFub24gMHgzMDAxCi0jZGVmaW5lIEZYX0xBTkdfQXJhYmljX0xpYnlhIDB4MTAwMQotI2RlZmluZSBGWF9MQU5HX0FyYWJpY19Nb3JvY2NvIDB4MTgwMQotI2RlZmluZSBGWF9MQU5HX0FyYWJpY19PbWFuIDB4MjAwMQotI2RlZmluZSBGWF9MQU5HX0FyYWJpY19RYXRhciAweDQwMDEKLSNkZWZpbmUgRlhfTEFOR19BcmFiaWNfU2F1ZGlBcmFiaWEgMHgwNDAxCi0jZGVmaW5lIEZYX0xBTkdfQXJhYmljX1N5cmlhIDB4MjgwMQotI2RlZmluZSBGWF9MQU5HX0FyYWJpY19UdW5pc2lhIDB4MWMwMQotI2RlZmluZSBGWF9MQU5HX0FyYWJpY19VQUUgMHgzODAxCi0jZGVmaW5lIEZYX0xBTkdfQXJhYmljX1llbWVuIDB4MjQwMQotI2RlZmluZSBGWF9MQU5HX0FybWVuaWFuX0FybWVuaWEgMHgwNDJiCi0jZGVmaW5lIEZYX0xBTkdfQXNzYW1lc2VfSW5kaWEgMHgwNDRkCi0jZGVmaW5lIEZYX0xBTkdfQXplcmJhaWphbl9DeXJpbGxpYyAweDA4MmMKLSNkZWZpbmUgRlhfTEFOR19BemVyYmFpamFuX0xhdGluIDB4MDQyYwotI2RlZmluZSBGWF9MQU5HX0Jhc2hraXJfUnVzc2lhIDB4MDQ2ZAotI2RlZmluZSBGWF9MQU5HX0Jhc3F1ZV9CYXNxdWUgMHgwNDJkCi0jZGVmaW5lIEZYX0xBTkdfQmVsYXJ1c2lhbl9CZWxhcnVzIDB4MDQyMwotI2RlZmluZSBGWF9MQU5HX0JlbmdhbGlfQmFuZ2xhZGVzaCAweDA4NDUKLSNkZWZpbmUgRlhfTEFOR19CZW5nYWxpX0luZGlhIDB4MDQ0NQotI2RlZmluZSBGWF9MQU5HX0Jvc25pYV9IZXJ6ZWdvdmluYSAweDEwMWEKLSNkZWZpbmUgRlhfTEFOR19Cb3NuaWFuX0N5cmlsbGljIDB4MjAxYQotI2RlZmluZSBGWF9MQU5HX0Jvc25pYW5fTGF0aW4gMHgxNDFhCi0jZGVmaW5lIEZYX0xBTkdfQnJldG9uX0ZyYW5jZSAweDA0N2UKLSNkZWZpbmUgRlhfTEFOR19CdWxnYXJpYW5fQnVsZ2FyaWEgMHgwNDAyCi0jZGVmaW5lIEZYX0xBTkdfQnVybWVzZSAweDA0NTUKLSNkZWZpbmUgRlhfTEFOR19DYXRhbGFuX0NhdGFsYW4gMHgwNDAzCi0jZGVmaW5lIEZYX0xBTkdfQ2hlcm9rZWUgMHgwNDVjCi0jZGVmaW5lIEZYX0xBTkdfQ2hpbmVzZV9Ib25nS29uZyAweDBjMDQKLSNkZWZpbmUgRlhfTEFOR19DaGluZXNlX01hY2FvIDB4MTQwNAotI2RlZmluZSBGWF9MQU5HX0NoaW5lc2VfUFJDIDB4MDgwNAotI2RlZmluZSBGWF9MQU5HX0NoaW5lc2VfU2luZ2Fwb3JlIDB4MTAwNAotI2RlZmluZSBGWF9MQU5HX0NoaW5lc2VfVGFpd2FuIDB4MDQwNAotI2RlZmluZSBGWF9MQU5HX0NvcnNpY2FuX0ZyYW5jZSAweDA0ODMKLSNkZWZpbmUgRlhfTEFOR19Dcm9hdGlhbl9Dcm9hdGlhIDB4MDQxYQotI2RlZmluZSBGWF9MQU5HX0Nyb2F0aWFuX0xhdGluIDB4MTAxYQotI2RlZmluZSBGWF9MQU5HX0N1c3RvbUN1cnJlbnQgMHgwYzAwCi0jZGVmaW5lIEZYX0xBTkdfQ3plY2hSZXB1YmxpYyAweDA0MDUKLSNkZWZpbmUgRlhfTEFOR19EYW5pc2hfRGVubWFyayAweDA0MDYKLSNkZWZpbmUgRlhfTEFOR19EYXJpX0FmZ2hhbmlzdGFuIDB4MDQ4YwotI2RlZmluZSBGWF9MQU5HX0RpdmVoaV9NYWxkaXZlcyAweDA0NjUKLSNkZWZpbmUgRlhfTEFOR19EdXRjaF9CZWxnaXVtIDB4MDgxMwotI2RlZmluZSBGWF9MQU5HX0R1dGNoX05ldGhlcmxhbmRzIDB4MDQxMwotI2RlZmluZSBGWF9MQU5HX0R1dGNoX1ByZWZlcnJlZCAweDAwMTMKLSNkZWZpbmUgRlhfTEFOR19Eem9uZ2toYSAweDA4NTEKLSNkZWZpbmUgRlhfTEFOR19FZG8gMHgwNDY2Ci0jZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9BdXN0cmFsaWEgMHgwYzA5Ci0jZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9CZWxpemUgMHgyODA5Ci0jZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9DYW5hZGEgMHgxMDA5Ci0jZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9DYXJpYmJlYW4gMHgyNDA5Ci0jZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9Ib25nS29uZyAweDNjMDkKLSNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX0luZGlhIDB4NDAwOQotI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfSW5kb25lc2lhIDB4MzgwOQotI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfSXJlbGFuZCAweDE4MDkKLSNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX0phbWFpY2EgMHgyMDA5Ci0jZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9NYWxheXNpYSAweDQ0MDkKLSNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX05ld1plYWxhbmQgMHgxNDA5Ci0jZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9QaGlsaXBwaW5lcyAweDM0MDkKLSNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX1NpbmdhcG9yZSAweDQ4MDkKLSNkZWZpbmUgRlhfTEFOR19FbmdsaXNoX1NvdXRoQWZyaWNhIDB4MWMwOQotI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfVHJpbmlkYWRUb2JhZ28gMHgyYzA5Ci0jZGVmaW5lIEZYX0xBTkdfRW5nbGlzaF9Vbml0ZWRLaW5nZG9tIDB4MDgwOQotI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfVW5pdGVkU3RhdGVzIDB4MDQwOQotI2RlZmluZSBGWF9MQU5HX0VuZ2xpc2hfWmltYmFid2UgMHgzMDA5Ci0jZGVmaW5lIEZYX0xBTkdfRXN0b25pYW5fRXN0b25pYSAweDA0MjUKLSNkZWZpbmUgRlhfTEFOR19GYXJvZXNlX0Zhcm9lSXNsYW5kcyAweDA0MzgKLSNkZWZpbmUgRlhfTEFOR19GaWxpcGlub19QaGlsaXBwaW5lcyAweDA0NjQKLSNkZWZpbmUgRlhfTEFOR19GaW5uaXNoX0ZpbmxhbmQgMHgwNDBiCi0jZGVmaW5lIEZYX0xBTkdfRnJlbmNoX0JlbGdpdW0gMHgwODBjCi0jZGVmaW5lIEZYX0xBTkdfRnJlbmNoX0NhbWVyb29uIDB4MmMwYwotI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9DYW5hZGEgMHgwYzBjCi0jZGVmaW5lIEZYX0xBTkdfRnJlbmNoX0NvbmdvRFJDIDB4MjQwYwotI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9Db3RlZEl2b2lyZSAweDMwMGMKLSNkZWZpbmUgRlhfTEFOR19GcmVuY2hfRnJhbmNlIDB4MDQwYwotI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9IYWl0aSAweDNjMGMKLSNkZWZpbmUgRlhfTEFOR19GcmVuY2hfTHV4ZW1ib3VyZyAweDE0MGMKLSNkZWZpbmUgRlhfTEFOR19GcmVuY2hfTWFsaSAweDM0MGMKLSNkZWZpbmUgRlhfTEFOR19GcmVuY2hfTW9uYWNvIDB4MTgwYwotI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9Nb3JvY2NvIDB4MzgwYwotI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9SZXVuaW9uIDB4MjAwYwotI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9TZW5lZ2FsIDB4MjgwYwotI2RlZmluZSBGWF9MQU5HX0ZyZW5jaF9Td2l0emVybGFuZCAweDEwMGMKLSNkZWZpbmUgRlhfTEFOR19GcmVuY2hfV2VzdEluZGllcyAweDFjMGMKLSNkZWZpbmUgRlhfTEFOR19GcmlzaWFuX05ldGhlcmxhbmRzIDB4MDQ2MgotI2RlZmluZSBGWF9MQU5HX0Z1bGZ1bGRlIDB4MDQ2NwotI2RlZmluZSBGWF9MQU5HX0dhZWxpY19JcmVsYW5kIDB4MDgzYwotI2RlZmluZSBGWF9MQU5HX0dhZWxpY19TY290bGFuZCAweDA0M2MKLSNkZWZpbmUgRlhfTEFOR19HYWxpY2lhbl9HYWxpY2lhbiAweDA0NTYKLSNkZWZpbmUgRlhfTEFOR19HZW9yZ2lhbl9HZW9yZ2lhIDB4MDQzNwotI2RlZmluZSBGWF9MQU5HX0dlcm1hbl9BdXN0cmlhIDB4MGMwNwotI2RlZmluZSBGWF9MQU5HX0dlcm1hbl9HZXJtYW55IDB4MDQwNwotI2RlZmluZSBGWF9MQU5HX0dlcm1hbl9MaWVjaHRlbnN0ZWluIDB4MTQwNwotI2RlZmluZSBGWF9MQU5HX0dlcm1hbl9MdXhlbWJvdXJnIDB4MTAwNwotI2RlZmluZSBGWF9MQU5HX0dlcm1hbl9Td2l0emVybGFuZCAweDA4MDcKLSNkZWZpbmUgRlhfTEFOR19HcmVla19HcmVlY2UgMHgwNDA4Ci0jZGVmaW5lIEZYX0xBTkdfR3JlZW5sYW5kaWNfR3JlZW5sYW5kIDB4MDQ2ZgotI2RlZmluZSBGWF9MQU5HX0d1YXJhbmkgMHgwNDc0Ci0jZGVmaW5lIEZYX0xBTkdfR3VqYXJhdGlfSW5kaWEgMHgwNDQ3Ci0jZGVmaW5lIEZYX0xBTkdfSGF1c2FfTGF0aW5OaWdlcmlhIDB4MDQ2OAotI2RlZmluZSBGWF9MQU5HX0hhd2FpaWFuIDB4MDQ3NQotI2RlZmluZSBGWF9MQU5HX0hlYnJld19Jc3JhZWwgMHgwNDBkCi0jZGVmaW5lIEZYX0xBTkdfSGluZGlfSW5kaWEgMHgwNDM5Ci0jZGVmaW5lIEZYX0xBTkdfSHVuZ2FyaWFuX0h1bmdhcnkgMHgwNDBlCi0jZGVmaW5lIEZYX0xBTkdfSWJpYmlvX05pZ2VyaWEgMHgwNDY5Ci0jZGVmaW5lIEZYX0xBTkdfSWNlbGFuZGljX0ljZWxhbmQgMHgwNDBmCi0jZGVmaW5lIEZYX0xBTkdfSWdib19OaWdlcmlhIDB4MDQ3MAotI2RlZmluZSBGWF9MQU5HX0luZG9uZXNpYW5fSW5kb25lc2lhIDB4MDQyMQotI2RlZmluZSBGWF9MQU5HX0ludWt0aXR1dF9MYXRpbkNhbmFkYSAweDA4NWQKLSNkZWZpbmUgRlhfTEFOR19JbnVrdGl0dXRfU3lsbGFiaWNzQ2FuYWRhIDB4MDQ1ZAotI2RlZmluZSBGWF9MQU5HX0lzaVhob3NhX1NvdXRoQWZyaWNhIDB4MDQzNAotI2RlZmluZSBGWF9MQU5HX0lzaVp1bHVfU291dGhBZnJpY2EgMHgwNDM1Ci0jZGVmaW5lIEZYX0xBTkdfSXRhbGlhbl9JdGFseSAweDA0MTAKLSNkZWZpbmUgRlhfTEFOR19JdGFsaWFuX1N3aXR6ZXJsYW5kIDB4MDgxMAotI2RlZmluZSBGWF9MQU5HX0phcGFuZXNlX0phcGFuIDB4MDQxMQotI2RlZmluZSBGWF9MQU5HX0thbm5hZGFfSW5kaWEgMHgwNDRiCi0jZGVmaW5lIEZYX0xBTkdfS2FudXJpIDB4MDQ3MQotI2RlZmluZSBGWF9MQU5HX0thc2htaXJpIDB4MDg2MAotI2RlZmluZSBGWF9MQU5HX0thc2htaXJpX0FyYWJpYyAweDA0NjAKLSNkZWZpbmUgRlhfTEFOR19LYXpha2hfS2F6YWtoc3RhbiAweDA0M2YKLSNkZWZpbmUgRlhfTEFOR19LaG1lcl9DYW1ib2RpYSAweDA0NTMKLSNkZWZpbmUgRlhfTEFOR19LaWNoZV9HdWF0ZW1hbGEgMHgwNDg2Ci0jZGVmaW5lIEZYX0xBTkdfS2lueWFyd2FuZGFfUndhbmRhIDB4MDQ4NwotI2RlZmluZSBGWF9MQU5HX0tpc3dhaGlsaV9LZW55YSAweDA0NDEKLSNkZWZpbmUgRlhfTEFOR19Lb25rYW5pX0luZGlhIDB4MDQ1NwotI2RlZmluZSBGWF9MQU5HX0tvcmVhbl9Lb3JlYSAweDA0MTIKLSNkZWZpbmUgRlhfTEFOR19LeXJneXpfS3lyZ3l6c3RhbiAweDA0NDAKLSNkZWZpbmUgRlhfTEFOR19MYW9fTGFvUERSIDB4MDQ1NAotI2RlZmluZSBGWF9MQU5HX0xhdGluIDB4MDQ3NgotI2RlZmluZSBGWF9MQU5HX0xhdHZpYW5fTGF0dmlhIDB4MDQyNgotI2RlZmluZSBGWF9MQU5HX0xpdGh1YW5pYW5fTGl0aHVhbmlhIDB4MDQyNwotI2RlZmluZSBGWF9MQU5HX0xpdGh1YW5pYW5UcmFkIDB4MDgyNwotI2RlZmluZSBGWF9MQU5HX0xvd2VyIFNvcmJpYW5fR2VybWFueSAweDA4MmUKLSNkZWZpbmUgRlhfTEFOR19MdXhlbWJvdXJnaXNoX0x1eGVtYm91cmcgMHgwNDZlCi0jZGVmaW5lIEZYX0xBTkdfTWFjZWRvbmlhbiAweDA0MmYKLSNkZWZpbmUgRlhfTEFOR19NYWxheV9CcnVuZWlEYXJ1c3NhbGFtIDB4MDgzZQotI2RlZmluZSBGWF9MQU5HX01hbGF5X01hbGF5c2lhIDB4MDQzZQotI2RlZmluZSBGWF9MQU5HX01hbGF5YWxhbV9JbmRpYSAweDA0NGMKLSNkZWZpbmUgRlhfTEFOR19NYWxkaXZpYW4gMHgwNDY1Ci0jZGVmaW5lIEZYX0xBTkdfTWFsdGVzZV9NYWx0YSAweDA0M2EKLSNkZWZpbmUgRlhfTEFOR19NYW5pcHVyaSAweDA0NTgKLSNkZWZpbmUgRlhfTEFOR19NYW9yaV9OZXdaZWFsYW5kIDB4MDQ4MQotI2RlZmluZSBGWF9MQU5HX01hcHVkdW5ndW5fQ2hpbGUgMHgwNDdhCi0jZGVmaW5lIEZYX0xBTkdfTWFyYXRoaV9JbmRpYSAweDA0NGUKLSNkZWZpbmUgRlhfTEFOR19Nb2hhd2tfTW9oYXdrIDB4MDQ3YwotI2RlZmluZSBGWF9MQU5HX01vbmdvbGlhbl9DeXJpbGxpY01vbmdvbGlhIDB4MDQ1MAotI2RlZmluZSBGWF9MQU5HX01vbmdvbGlhbl9UcmFkaXRpb25hbE1vbmdvbGlhbiAweDA4NTAKLSNkZWZpbmUgRlhfTEFOR19OZXBhbGlfSW5kaWEgMHgwODYxCi0jZGVmaW5lIEZYX0xBTkdfTmVwYWxpX05lcGFsIDB4MDQ2MQotI2RlZmluZSBGWF9MQU5HX05vcndlZ2lhbl9Cb2ttYWwgMHgwNDE0Ci0jZGVmaW5lIEZYX0xBTkdfTm9yd2VnaWFuX055bm9yc2sgMHgwODE0Ci0jZGVmaW5lIEZYX0xBTkdfT2NjaXRhbl9GcmFuY2UgMHgwNDgyCi0jZGVmaW5lIEZYX0xBTkdfT3JpeWFfSW5kaWEgMHgwNDQ4Ci0jZGVmaW5lIEZYX0xBTkdfT3JvbW8gMHgwNDcyCi0jZGVmaW5lIEZYX0xBTkdfUGFwaWFtZW50dSAweDA0NzkKLSNkZWZpbmUgRlhfTEFOR19QYXNodG9fQWZnaGFuaXN0YW4gMHgwNDYzCi0jZGVmaW5lIEZYX0xBTkdfUGVyc2lhbiAweDA0MjkKLSNkZWZpbmUgRlhfTEFOR19Qb2xpc2hfUG9sYW5kIDB4MDQxNQotI2RlZmluZSBGWF9MQU5HX1BvcnR1Z3Vlc2VfQnJhemlsIDB4MDQxNgotI2RlZmluZSBGWF9MQU5HX1BvcnR1Z3Vlc2VfUG9ydHVnYWwgMHgwODE2Ci0jZGVmaW5lIEZYX0xBTkdfUHVuamFiaV9JbmRpYSAweDA0NDYKLSNkZWZpbmUgRlhfTEFOR19QdW5qYWJpX1Bha2lzdGFuIDB4MDg0NgotI2RlZmluZSBGWF9MQU5HX1F1ZWNodWFfQm9saXZpYSAweDA0NmIKLSNkZWZpbmUgRlhfTEFOR19RdWVjaHVhX0VjdWFkb3IgMHgwODZiCi0jZGVmaW5lIEZYX0xBTkdfUXVlY2h1YV9QZXJ1IDB4MGM2YgotI2RlZmluZSBGWF9MQU5HX1JvbWFuaWFuX01vbGRvdmEgMHgwODE4Ci0jZGVmaW5lIEZYX0xBTkdfUm9tYW5pYW5fUm9tYW5pYSAweDA0MTgKLSNkZWZpbmUgRlhfTEFOR19Sb21hbnNoX1N3aXR6ZXJsYW5kIDB4MDQxNwotI2RlZmluZSBGWF9MQU5HX1J1c3NpYW5fTW9sZG92YSAweDA4MTkKLSNkZWZpbmUgRlhfTEFOR19SdXNzaWFuX1J1c3NpYSAweDA0MTkKLSNkZWZpbmUgRlhfTEFOR19TYW1pX0luYXJpRmlubGFuZCAweDI0M2IKLSNkZWZpbmUgRlhfTEFOR19TYW1pX0x1bGVOb3J3YXkgMHgxMDNiCi0jZGVmaW5lIEZYX0xBTkdfU2FtaV9MdWxlU3dlZGVuIDB4MTQzYgotI2RlZmluZSBGWF9MQU5HX1NhbWlfTm9ydGhlcm5GaW5sYW5kIDB4MGMzYgotI2RlZmluZSBGWF9MQU5HX1NhbWlfTm9ydGhlcm5Ob3J3YXkgMHgwNDNiCi0jZGVmaW5lIEZYX0xBTkdfU2FtaV9Ob3J0aGVyblN3ZWRlbiAweDA4M2IKLSNkZWZpbmUgRlhfTEFOR19TYW1pX1Nrb2x0RmlubGFuZCAweDIwM2IKLSNkZWZpbmUgRlhfTEFOR19TYW1pX1NvdXRoZXJuTm9yd2F5IDB4MTgzYgotI2RlZmluZSBGWF9MQU5HX1NhbWlfU291dGhlcm5Td2VkZW4gMHgxYzNiCi0jZGVmaW5lIEZYX0xBTkdfU2Fuc2tyaXRJbmRpYSAweDA0NGYKLSNkZWZpbmUgRlhfTEFOR19TZXJiaWFuQ3lyaWxsaWNfQm9zbmlhSGVyemVnb3ZpbmEgMHgxYzFhCi0jZGVmaW5lIEZYX0xBTkdfU2VyYmlhbkN5cmlsbGljX1NlcmJpYSAweDBjMWEKLSNkZWZpbmUgRlhfTEFOR19TZXJiaWFuTGF0aW5fQm9zbmlhSGVyemVnb3ZpbmEgMHgxODFhCi0jZGVmaW5lIEZYX0xBTkdfU2VyYmlhbkxhdGluX1NlcmJpYSAweDA4MWEKLSNkZWZpbmUgRlhfTEFOR19TZXNvdGhvU2FMZWJvYSAweDA0NmMKLSNkZWZpbmUgRlhfTEFOR19TZXRzd2FuYV9Tb3V0aEFmcmljYSAweDA0MzIKLSNkZWZpbmUgRlhfTEFOR19TaW5kaGlfQXJhYmljIDB4MDg1OQotI2RlZmluZSBGWF9MQU5HX1NpbmRoaV9EZXZhbmFnYXJpIDB4MDQ1OQotI2RlZmluZSBGWF9MQU5HX1NpbmhhbGFfU3JpTGFua2EgMHgwNDViCi0jZGVmaW5lIEZYX0xBTkdfU2xvdmFrX1Nsb3Zha2lhIDB4MDQxYgotI2RlZmluZSBGWF9MQU5HX1Nsb3Zlbmlhbl9TbG92ZW5pYSAweDA0MjQKLSNkZWZpbmUgRlhfTEFOR19Tb21hbGkgMHgwNDc3Ci0jZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9BcmdlbnRpbmEgMHgyYzBhCi0jZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9Cb2xpdmlhIDB4NDAwYQotI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfQ2hpbGUgMHgzNDBhCi0jZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9Db2xvbWJpYSAweDI0MGEKLSNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX0Nvc3RhUmljYSAweDE0MGEKLSNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX0RvbWluaWNhblJlcHVibGljIDB4MWMwYQotI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfRWN1YWRvciAweDMwMGEKLSNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX0VsU2FsdmFkb3IgMHg0NDBhCi0jZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9HdWF0ZW1hbGEgMHgxMDBhCi0jZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9Ib25kdXJhcyAweDQ4MGEKLSNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX01leGljbyAweDA4MGEKLSNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX05pY2FyYWd1YSAweDRjMGEKLSNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX1BhbmFtYSAweDE4MGEKLSNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX1BhcmFndWF5IDB4M2MwYQotI2RlZmluZSBGWF9MQU5HX1NwYW5pc2hfUGVydSAweDI4MGEKLSNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX1B1ZXJ0b1JpY28gMHg1MDBhCi0jZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9JbnRlcm5hdGlvbmFsU29ydCAweDBjMGEKLSNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX1RyYWRpdGlvbmFsU29ydCAweDA0MGEKLSNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX1VuaXRlZFN0YXRlcyAweDU0MGEKLSNkZWZpbmUgRlhfTEFOR19TcGFuaXNoX1VydWd1YXkgMHgzODBhCi0jZGVmaW5lIEZYX0xBTkdfU3BhbmlzaF9WZW5lenVlbGEgMHgyMDBhCi0jZGVmaW5lIEZYX0xBTkdfU3V0dV9Tb3V0aEFmcmljYSAweDA0MzAKLSNkZWZpbmUgRlhfTEFOR19Td2VkaXNoX0ZpbmxhbmQgMHgwODFkCi0jZGVmaW5lIEZYX0xBTkdfU3dlZGlzaF9Td2VkZW4gMHgwNDFkCi0jZGVmaW5lIEZYX0xBTkdfU3lyaWFjX1N5cmlhIDB4MDQ1YQotI2RlZmluZSBGWF9MQU5HX1RhamlrX0N5cmlsbGljVGFqaWtpc3RhbiAweDA0MjgKLSNkZWZpbmUgRlhfTEFOR19UYW1hemlnaHRfQXJhYmljTW9yb2NjbyAweDA0NWYKLSNkZWZpbmUgRlhfTEFOR19UYW1hemlnaHRfTGF0aW5BbGdlcmlhIDB4MDg1ZgotI2RlZmluZSBGWF9MQU5HX1RhbWlsX0luZGlhIDB4MDQ0OQotI2RlZmluZSBGWF9MQU5HX1RhdGFyX1J1c3NpYSAweDA0NDQKLSNkZWZpbmUgRlhfTEFOR19UZWx1Z3VfSW5kaWEgMHgwNDRhCi0jZGVmaW5lIEZYX0xBTkdfVGhhaV9UaGFpbGFuZCAweDA0MWUKLSNkZWZpbmUgRlhfTEFOR19UaWJldGFuUFJDIDB4MDQ1MQotI2RlZmluZSBGWF9MQU5HX1RpZ3JpZ25hX0VyaXRyZWEgMHgwODczCi0jZGVmaW5lIEZYX0xBTkdfVGlncmlnbmFfRXRoaW9waWEgMHgwNDczCi0jZGVmaW5lIEZYX0xBTkdfVHNvbmdhIDB4MDQzMQotI2RlZmluZSBGWF9MQU5HX1R1cmtpc2hfVHVya2V5IDB4MDQxZgotI2RlZmluZSBGWF9MQU5HX1R1cmttZW5fVHVya21lbmlzdGFuIDB4MDQ0MgotI2RlZmluZSBGWF9MQU5HX1VpZ2h1clBSQyAweDA0ODAKLSNkZWZpbmUgRlhfTEFOR19Va3JhaW5pYW5fVWtyYWluZSAweDA0MjIKLSNkZWZpbmUgRlhfTEFOR19VcHBlclNvcmJpYW5fR2VybWFueSAweDA0MmUKLSNkZWZpbmUgRlhfTEFOR19VcmR1X1Bha2lzdGFuIDB4MDQyMAotI2RlZmluZSBGWF9MQU5HX1VyZHVfSW5kaWEgMHgwODIwCi0jZGVmaW5lIEZYX0xBTkdfVXpiZWtfQ3lyaWxsaWNVemJla2lzdGFuIDB4MDg0MwotI2RlZmluZSBGWF9MQU5HX1V6YmVrX0xhdGluVXpiZWtpc3RhbiAweDA0NDMKLSNkZWZpbmUgRlhfTEFOR19WZW5kYSAweDA0MzMKLSNkZWZpbmUgRlhfTEFOR19WaWV0bmFtZXNlX1ZpZXRuYW0gMHgwNDJhCi0jZGVmaW5lIEZYX0xBTkdfV2Vsc2hfVW5pdGVkS2luZ2RvbSAweDA0NTIKLSNkZWZpbmUgRlhfTEFOR19Xb2xvZl9TZW5lZ2FsIDB4MDQ4OAotI2RlZmluZSBGWF9MQU5HX1hob3NhIDB4MDQzNAotI2RlZmluZSBGWF9MQU5HX1lha3V0X1J1c3NpYSAweDA0ODUKLSNkZWZpbmUgRlhfTEFOR19ZaVBSQyAweDA0NzgKLSNkZWZpbmUgRlhfTEFOR19ZaWRkaXNoIDB4MDQzZAotI2RlZmluZSBGWF9MQU5HX1lvcnViYV9OaWdlcmlhIDB4MDQ2YQotCi0jZW5kaWYgIC8vIFhGQV9GR0FTX0NSVF9GR0FTX0xBTkdVQUdFX0hfCmRpZmYgLS1naXQgYS94ZmEvZmdhcy9jcnQvZmdhc19zdHJlYW0uY3BwIGIveGZhL2ZnYXMvY3J0L2ZnYXNfc3RyZWFtLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI0YjE5MS4uMDAwMDAwMAotLS0gYS94ZmEvZmdhcy9jcnQvZmdhc19zdHJlYW0uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZmdhcy9jcnQvZmdhc19zdHJlYW0uaCIKLQotI2lmIF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjMyX01PQklMRV8gfHwgXAotICAgIF9GWF9PU18gPT0gX0ZYX1dJTjY0XwotI2luY2x1ZGUgPGlvLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvY3J0L2ZnYXNfY29kZXBhZ2UuaCIKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgSUZHQVNfU3RyZWFtSW1wIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfklGR0FTX1N0cmVhbUltcCgpIHt9Ci0KLSAgdmlydHVhbCBpbnQzMl90IEdldExlbmd0aCgpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBpbnQzMl90IFNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KSA9IDA7Ci0gIHZpcnR1YWwgaW50MzJfdCBHZXRQb3NpdGlvbigpID0gMDsKLSAgdmlydHVhbCBib29sIElzRU9GKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIGludDMyX3QgUmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkgPSAwOwotICB2aXJ0dWFsIGludDMyX3QgUmVhZFN0cmluZyhGWF9XQ0hBUiogcFN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTWF4TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiRU9TKSA9IDA7Ci0gIHZpcnR1YWwgaW50MzJfdCBXcml0ZURhdGEoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkgPSAwOwotICB2aXJ0dWFsIGludDMyX3QgV3JpdGVTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgRmx1c2goKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBTZXRMZW5ndGgoaW50MzJfdCBpTGVuZ3RoKSA9IDA7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIElGR0FTX1N0cmVhbUltcCgpOwotCi0gIHVpbnQzMl90IEdldEFjY2Vzc01vZGVzKCkgY29uc3QgeyByZXR1cm4gbV9kd0FjY2VzczsgfQotICB2b2lkIFNldEFjY2Vzc01vZGVzKHVpbnQzMl90IG1vZGVzKSB7IG1fZHdBY2Nlc3MgPSBtb2RlczsgfQotCi0gcHJpdmF0ZToKLSAgdWludDMyX3QgbV9kd0FjY2VzczsKLX07Ci0KLWNsYXNzIENGR0FTX0ZpbGVTdHJlYW1JbXAgOiBwdWJsaWMgSUZHQVNfU3RyZWFtSW1wIHsKLSBwdWJsaWM6Ci0gIENGR0FTX0ZpbGVTdHJlYW1JbXAoKTsKLSAgfkNGR0FTX0ZpbGVTdHJlYW1JbXAoKSBvdmVycmlkZTsKLQotICBib29sIExvYWRGaWxlKGNvbnN0IEZYX1dDSEFSKiBwc3pTcmNGaWxlTmFtZSwgdWludDMyX3QgZHdBY2Nlc3MpOwotCi0gIC8vIElGR0FTX1N0cmVhbUltcDoKLSAgaW50MzJfdCBHZXRMZW5ndGgoKSBjb25zdCBvdmVycmlkZTsKLSAgaW50MzJfdCBTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCkgb3ZlcnJpZGU7Ci0gIGludDMyX3QgR2V0UG9zaXRpb24oKSBvdmVycmlkZTsKLSAgYm9vbCBJc0VPRigpIGNvbnN0IG92ZXJyaWRlOwotICBpbnQzMl90IFJlYWREYXRhKHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpIG92ZXJyaWRlOwotICBpbnQzMl90IFJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaU1heExlbmd0aCwgYm9vbCYgYkVPUykgb3ZlcnJpZGU7Ci0gIGludDMyX3QgV3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpIG92ZXJyaWRlOwotICBpbnQzMl90IFdyaXRlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpIG92ZXJyaWRlOwotICB2b2lkIEZsdXNoKCkgb3ZlcnJpZGU7Ci0gIGJvb2wgU2V0TGVuZ3RoKGludDMyX3QgaUxlbmd0aCkgb3ZlcnJpZGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIEZYU1lTX0ZJTEUqIG1faEZpbGU7Ci0gIGludDMyX3QgbV9pTGVuZ3RoOwotfTsKLQotY2xhc3MgQ0ZHQVNfQnVmZmVyU3RyZWFtSW1wIDogcHVibGljIElGR0FTX1N0cmVhbUltcCB7Ci0gcHVibGljOgotICBDRkdBU19CdWZmZXJTdHJlYW1JbXAoKTsKLSAgfkNGR0FTX0J1ZmZlclN0cmVhbUltcCgpIG92ZXJyaWRlIHt9Ci0KLSAgYm9vbCBMb2FkQnVmZmVyKHVpbnQ4X3QqIHBEYXRhLCBpbnQzMl90IGlUb3RhbFNpemUsIHVpbnQzMl90IGR3QWNjZXNzKTsKLQotICAvLyBJRkdBU19TdHJlYW1JbXA6Ci0gIGludDMyX3QgR2V0TGVuZ3RoKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGludDMyX3QgU2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpIG92ZXJyaWRlOwotICBpbnQzMl90IEdldFBvc2l0aW9uKCkgb3ZlcnJpZGU7Ci0gIGJvb2wgSXNFT0YoKSBjb25zdCBvdmVycmlkZTsKLSAgaW50MzJfdCBSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSBvdmVycmlkZTsKLSAgaW50MzJfdCBSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlNYXhMZW5ndGgsIGJvb2wmIGJFT1MpIG92ZXJyaWRlOwotICBpbnQzMl90IFdyaXRlRGF0YShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSBvdmVycmlkZTsKLSAgaW50MzJfdCBXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKSBvdmVycmlkZTsKLSAgdm9pZCBGbHVzaCgpIG92ZXJyaWRlIHt9Ci0gIGJvb2wgU2V0TGVuZ3RoKGludDMyX3QgaUxlbmd0aCkgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KLQotIHByb3RlY3RlZDoKLSAgdWludDhfdCogbV9wRGF0YTsKLSAgaW50MzJfdCBtX2lUb3RhbFNpemU7Ci0gIGludDMyX3QgbV9pUG9zaXRpb247Ci0gIGludDMyX3QgbV9pTGVuZ3RoOwotfTsKLQotY2xhc3MgQ0ZHQVNfRmlsZVJlYWRTdHJlYW1JbXAgOiBwdWJsaWMgSUZHQVNfU3RyZWFtSW1wIHsKLSBwdWJsaWM6Ci0gIENGR0FTX0ZpbGVSZWFkU3RyZWFtSW1wKCk7Ci0gIH5DRkdBU19GaWxlUmVhZFN0cmVhbUltcCgpIG92ZXJyaWRlIHt9Ci0KLSAgYm9vbCBMb2FkRmlsZVJlYWQoY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGVSZWFkLAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0FjY2Vzcyk7Ci0KLSAgLy8gSUZHQVNfU3RyZWFtSW1wOgotICBpbnQzMl90IEdldExlbmd0aCgpIGNvbnN0IG92ZXJyaWRlOwotICBpbnQzMl90IFNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KSBvdmVycmlkZTsKLSAgaW50MzJfdCBHZXRQb3NpdGlvbigpIG92ZXJyaWRlIHsgcmV0dXJuIG1faVBvc2l0aW9uOyB9Ci0gIGJvb2wgSXNFT0YoKSBjb25zdCBvdmVycmlkZTsKLSAgaW50MzJfdCBSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSBvdmVycmlkZTsKLSAgaW50MzJfdCBSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlNYXhMZW5ndGgsIGJvb2wmIGJFT1MpIG92ZXJyaWRlOwotICBpbnQzMl90IFdyaXRlRGF0YShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaW50MzJfdCBXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgdm9pZCBGbHVzaCgpIG92ZXJyaWRlIHt9Ci0gIGJvb2wgU2V0TGVuZ3RoKGludDMyX3QgaUxlbmd0aCkgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KLQotIHByb3RlY3RlZDoKLSAgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBtX3BGaWxlUmVhZDsKLSAgaW50MzJfdCBtX2lQb3NpdGlvbjsKLSAgaW50MzJfdCBtX2lMZW5ndGg7Ci19OwotCi1jbGFzcyBDRkdBU19CdWZmZXJSZWFkU3RyZWFtSW1wIDogcHVibGljIElGR0FTX1N0cmVhbUltcCB7Ci0gcHVibGljOgotICBDRkdBU19CdWZmZXJSZWFkU3RyZWFtSW1wKCk7Ci0gIH5DRkdBU19CdWZmZXJSZWFkU3RyZWFtSW1wKCkgb3ZlcnJpZGU7Ci0KLSAgYm9vbCBMb2FkQnVmZmVyUmVhZChjb25zdCBDRlhfUmV0YWluUHRyPElGWF9CdWZmZXJlZFJlYWRTdHJlYW0+JiBwQnVmZmVyUmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlGaWxlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0FjY2Vzcyk7Ci0KLSAgLy8gSUZHQVNfU3RyZWFtSW1wOgotICBpbnQzMl90IEdldExlbmd0aCgpIGNvbnN0IG92ZXJyaWRlOwotICBpbnQzMl90IFNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KSBvdmVycmlkZTsKLSAgaW50MzJfdCBHZXRQb3NpdGlvbigpIG92ZXJyaWRlIHsgcmV0dXJuIG1faVBvc2l0aW9uOyB9Ci0gIGJvb2wgSXNFT0YoKSBjb25zdCBvdmVycmlkZTsKLSAgaW50MzJfdCBSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSBvdmVycmlkZTsKLSAgaW50MzJfdCBSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlNYXhMZW5ndGgsIGJvb2wmIGJFT1MpIG92ZXJyaWRlOwotICBpbnQzMl90IFdyaXRlRGF0YShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaW50MzJfdCBXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKSBvdmVycmlkZSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgdm9pZCBGbHVzaCgpIG92ZXJyaWRlIHt9Ci0gIGJvb2wgU2V0TGVuZ3RoKGludDMyX3QgaUxlbmd0aCkgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KLQotIHByaXZhdGU6Ci0gIENGWF9SZXRhaW5QdHI8SUZYX0J1ZmZlcmVkUmVhZFN0cmVhbT4gbV9wQnVmZmVyUmVhZDsKLSAgaW50MzJfdCBtX2lQb3NpdGlvbjsKLSAgaW50MzJfdCBtX2lCdWZmZXJTaXplOwotfTsKLQotY2xhc3MgQ0ZHQVNfRmlsZVdyaXRlU3RyZWFtSW1wIDogcHVibGljIElGR0FTX1N0cmVhbUltcCB7Ci0gcHVibGljOgotICBDRkdBU19GaWxlV3JpdGVTdHJlYW1JbXAoKTsKLSAgfkNGR0FTX0ZpbGVXcml0ZVN0cmVhbUltcCgpIG92ZXJyaWRlIHt9Ci0KLSAgYm9vbCBMb2FkRmlsZVdyaXRlKGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlV3JpdGVTdHJlYW0+JiBwRmlsZVdyaXRlLAotICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdBY2Nlc3MpOwotCi0gIC8vIElGR0FTX1N0cmVhbUltcDoKLSAgaW50MzJfdCBHZXRMZW5ndGgoKSBjb25zdCBvdmVycmlkZTsKLSAgaW50MzJfdCBTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCkgb3ZlcnJpZGU7Ci0gIGludDMyX3QgR2V0UG9zaXRpb24oKSBvdmVycmlkZSB7IHJldHVybiBtX2lQb3NpdGlvbjsgfQotICBib29sIElzRU9GKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGludDMyX3QgUmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQotICBpbnQzMl90IFJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaU1heExlbmd0aCwgYm9vbCYgYkVPUykgb3ZlcnJpZGUgewotICAgIHJldHVybiAwOwotICB9Ci0gIGludDMyX3QgV3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpIG92ZXJyaWRlOwotICBpbnQzMl90IFdyaXRlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpIG92ZXJyaWRlOwotICB2b2lkIEZsdXNoKCkgb3ZlcnJpZGU7Ci0gIGJvb2wgU2V0TGVuZ3RoKGludDMyX3QgaUxlbmd0aCkgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KLQotIHByb3RlY3RlZDoKLSAgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVXcml0ZVN0cmVhbT4gbV9wRmlsZVdyaXRlOwotICBpbnQzMl90IG1faVBvc2l0aW9uOwotfTsKLQotZW51bSBGWF9TVFJFQU1UWVBFIHsKLSAgRlhfU1JFQU1UWVBFX1Vua25vd24gPSAwLAotICBGWF9TVFJFQU1UWVBFX0ZpbGUsCi0gIEZYX1NUUkVBTVRZUEVfQnVmZmVyLAotICBGWF9TVFJFQU1UWVBFX1N0cmVhbSwKLSAgRlhfU1RSRUFNVFlQRV9CdWZmZXJSZWFkLAotfTsKLQotY2xhc3MgQ0ZHQVNfU3RyZWFtIDogcHVibGljIElGR0FTX1N0cmVhbSB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KLSAgZnJpZW5kIENGWF9SZXRhaW5QdHI8VD4gcGRmaXVtOjpNYWtlUmV0YWluKEFyZ3MmJi4uLiBhcmdzKTsKLQotICBib29sIExvYWRGaWxlKGNvbnN0IEZYX1dDSEFSKiBwc3pTcmNGaWxlTmFtZSwgdWludDMyX3QgZHdBY2Nlc3MpOwotICBib29sIExvYWRCdWZmZXIodWludDhfdCogcERhdGEsIGludDMyX3QgaVRvdGFsU2l6ZSwgdWludDMyX3QgZHdBY2Nlc3MpOwotICBib29sIExvYWRGaWxlUmVhZChjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZVJlYWQsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3QWNjZXNzKTsKLSAgYm9vbCBMb2FkRmlsZVdyaXRlKGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlV3JpdGVTdHJlYW0+JiBwRmlsZVdyaXRlLAotICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdBY2Nlc3MpOwotICBib29sIExvYWRCdWZmZXJSZWFkKGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX0J1ZmZlcmVkUmVhZFN0cmVhbT4mIHBCdWZmZXJSZWFkLAotICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZpbGVTaXplLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3QWNjZXNzKTsKLQotICAvLyBJRkdBU19TdHJlYW0KLSAgdWludDMyX3QgR2V0QWNjZXNzTW9kZXMoKSBjb25zdCBvdmVycmlkZTsKLSAgaW50MzJfdCBHZXRMZW5ndGgoKSBjb25zdCBvdmVycmlkZTsKLSAgaW50MzJfdCBTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCkgb3ZlcnJpZGU7Ci0gIGludDMyX3QgR2V0UG9zaXRpb24oKSBvdmVycmlkZTsKLSAgYm9vbCBJc0VPRigpIGNvbnN0IG92ZXJyaWRlOwotICBpbnQzMl90IFJlYWREYXRhKHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpIG92ZXJyaWRlOwotICBpbnQzMl90IFJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaU1heExlbmd0aCwgYm9vbCYgYkVPUykgb3ZlcnJpZGU7Ci0gIGludDMyX3QgV3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpIG92ZXJyaWRlOwotICBpbnQzMl90IFdyaXRlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpIG92ZXJyaWRlOwotICB2b2lkIEZsdXNoKCkgb3ZlcnJpZGU7Ci0gIGJvb2wgU2V0TGVuZ3RoKGludDMyX3QgaUxlbmd0aCkgb3ZlcnJpZGU7Ci0gIGludDMyX3QgR2V0Qk9NKHVpbnQ4X3QgYm9tWzRdKSBjb25zdCBvdmVycmlkZTsKLSAgdWludDE2X3QgR2V0Q29kZVBhZ2UoKSBjb25zdCBvdmVycmlkZTsKLSAgdWludDE2X3QgU2V0Q29kZVBhZ2UodWludDE2X3Qgd0NvZGVQYWdlKSBvdmVycmlkZTsKLSAgQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+IENyZWF0ZVNoYXJlZFN0cmVhbSh1aW50MzJfdCBkd0FjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoKSBvdmVycmlkZTsKLQotIHByb3RlY3RlZDoKLSAgQ0ZHQVNfU3RyZWFtKCk7Ci0gIH5DRkdBU19TdHJlYW0oKSBvdmVycmlkZTsKLQotICBGWF9TVFJFQU1UWVBFIG1fZVN0cmVhbVR5cGU7Ci0gIElGR0FTX1N0cmVhbUltcCogbV9wU3RyZWFtSW1wOwotICB1aW50MzJfdCBtX2R3QWNjZXNzOwotICBpbnQzMl90IG1faVRvdGFsU2l6ZTsKLSAgaW50MzJfdCBtX2lQb3NpdGlvbjsKLSAgaW50MzJfdCBtX2lTdGFydDsKLSAgaW50MzJfdCBtX2lMZW5ndGg7Ci0gIGludDMyX3QgbV9pUmVmQ291bnQ7Ci19OwotCi1jbGFzcyBDRkdBU19UZXh0U3RyZWFtIDogcHVibGljIElGR0FTX1N0cmVhbSB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KLSAgZnJpZW5kIENGWF9SZXRhaW5QdHI8VD4gcGRmaXVtOjpNYWtlUmV0YWluKEFyZ3MmJi4uLiBhcmdzKTsKLQotICAvLyBJRkdBU19TdHJlYW0KLSAgdWludDMyX3QgR2V0QWNjZXNzTW9kZXMoKSBjb25zdCBvdmVycmlkZTsKLSAgaW50MzJfdCBHZXRMZW5ndGgoKSBjb25zdCBvdmVycmlkZTsKLSAgaW50MzJfdCBTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCkgb3ZlcnJpZGU7Ci0gIGludDMyX3QgR2V0UG9zaXRpb24oKSBvdmVycmlkZTsKLSAgYm9vbCBJc0VPRigpIGNvbnN0IG92ZXJyaWRlOwotICBpbnQzMl90IFJlYWREYXRhKHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpIG92ZXJyaWRlOwotICBpbnQzMl90IFJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaU1heExlbmd0aCwgYm9vbCYgYkVPUykgb3ZlcnJpZGU7Ci0gIGludDMyX3QgV3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpIG92ZXJyaWRlOwotICBpbnQzMl90IFdyaXRlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpIG92ZXJyaWRlOwotICB2b2lkIEZsdXNoKCkgb3ZlcnJpZGU7Ci0gIGJvb2wgU2V0TGVuZ3RoKGludDMyX3QgaUxlbmd0aCkgb3ZlcnJpZGU7Ci0gIGludDMyX3QgR2V0Qk9NKHVpbnQ4X3QgYm9tWzRdKSBjb25zdCBvdmVycmlkZTsKLSAgdWludDE2X3QgR2V0Q29kZVBhZ2UoKSBjb25zdCBvdmVycmlkZTsKLSAgdWludDE2X3QgU2V0Q29kZVBhZ2UodWludDE2X3Qgd0NvZGVQYWdlKSBvdmVycmlkZTsKLSAgQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+IENyZWF0ZVNoYXJlZFN0cmVhbSh1aW50MzJfdCBkd0FjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoKSBvdmVycmlkZTsKLQotIHByb3RlY3RlZDoKLSAgZXhwbGljaXQgQ0ZHQVNfVGV4dFN0cmVhbShjb25zdCBDRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4mIHBTdHJlYW0pOwotICB+Q0ZHQVNfVGV4dFN0cmVhbSgpIG92ZXJyaWRlOwotCi0gIHZvaWQgSW5pdFN0cmVhbSgpOwotCi0gIHVpbnQxNl90IG1fd0NvZGVQYWdlOwotICBpbnQzMl90IG1fd0JPTUxlbmd0aDsKLSAgdWludDMyX3QgbV9kd0JPTTsKLSAgdWludDhfdCogbV9wQnVmOwotICBpbnQzMl90IG1faUJ1ZlNpemU7Ci0gIENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiBtX3BTdHJlYW1JbXA7Ci19OwotCi1jbGFzcyBDRkdBU19GaWxlUmVhZCA6IHB1YmxpYyBJRlhfU2Vla2FibGVSZWFkU3RyZWFtIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBDRlhfUmV0YWluUHRyPENGR0FTX0ZpbGVSZWFkPiBDcmVhdGUoCi0gICAgICBjb25zdCBDRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4mIHBTdHJlYW0pOwotCi0gIGV4cGxpY2l0IENGR0FTX0ZpbGVSZWFkKGNvbnN0IENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiYgcFN0cmVhbSk7Ci0gIH5DRkdBU19GaWxlUmVhZCgpIG92ZXJyaWRlOwotCi0gIC8vIElGWF9TZWVrYWJsZVJlYWRTdHJlYW0KLSAgRlhfRklMRVNJWkUgR2V0U2l6ZSgpIG92ZXJyaWRlOwotICBib29sIFJlYWRCbG9jayh2b2lkKiBidWZmZXIsIEZYX0ZJTEVTSVpFIG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICBDRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4gbV9wU3RyZWFtOwotfTsKLQotaW50MzJfdCBGaWxlTGVuZ3RoKEZYU1lTX0ZJTEUqIGZpbGUpIHsKLSAgQVNTRVJUKGZpbGUpOwotI2lmIF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjY0XwotICByZXR1cm4gX2ZpbGVsZW5ndGgoX2ZpbGVubyhmaWxlKSk7Ci0jZWxzZQotICBpbnQzMl90IGlQb3MgPSBGWFNZU19mdGVsbChmaWxlKTsKLSAgRlhTWVNfZnNlZWsoZmlsZSwgMCwgRlhTWVNfU0VFS19FTkQpOwotICBpbnQzMl90IGlMZW4gPSBGWFNZU19mdGVsbChmaWxlKTsKLSAgRlhTWVNfZnNlZWsoZmlsZSwgaVBvcywgRlhTWVNfU0VFS19TRVQpOwotICByZXR1cm4gaUxlbjsKLSNlbmRpZgotfQotCi1ib29sIEZpbGVTZXRTaXplKEZYU1lTX0ZJTEUqIGZpbGUsIGludDMyX3Qgc2l6ZSkgewotICBBU1NFUlQoZmlsZSk7Ci0jaWYgX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lONjRfCi0gIHJldHVybiBfY2hzaXplKF9maWxlbm8oZmlsZSksIHNpemUpID09IDA7Ci0jZWxpZiBfRlhfT1NfID09IF9GWF9XSU4zMl9NT0JJTEVfCi0gIEhBTkRMRSBoRmlsZSA9IF9maWxlbm8oZmlsZSk7Ci0gIHVpbnQzMl90IGR3UG9zID0gOjpTZXRGaWxlUG9pbnRlcihoRmlsZSwgMCwgMCwgRklMRV9DVVJSRU5UKTsKLSAgOjpTZXRGaWxlUG9pbnRlcihoRmlsZSwgc2l6ZSwgMCwgRklMRV9CRUdJTik7Ci0gIGJvb2wgYlJldCA9IDo6U2V0RW5kT2ZGaWxlKGhGaWxlKTsKLSAgOjpTZXRGaWxlUG9pbnRlcihoRmlsZSwgKGludDMyX3QpZHdQb3MsIDAsIEZJTEVfQkVHSU4pOwotICByZXR1cm4gYlJldDsKLSNlbHNlCi0gIHJldHVybiBmYWxzZTsKLSNlbmRpZgotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1DRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4gSUZHQVNfU3RyZWFtOjpDcmVhdGVTdHJlYW0oCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGVSZWFkLAotICAgIHVpbnQzMl90IGR3QWNjZXNzKSB7Ci0gIGF1dG8gcFNSID0gcGRmaXVtOjpNYWtlUmV0YWluPENGR0FTX1N0cmVhbT4oKTsKLSAgaWYgKCFwU1ItPkxvYWRGaWxlUmVhZChwRmlsZVJlYWQsIGR3QWNjZXNzKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfVGV4dCkKLSAgICByZXR1cm4gcGRmaXVtOjpNYWtlUmV0YWluPENGR0FTX1RleHRTdHJlYW0+KHBTUik7Ci0KLSAgcmV0dXJuIHBTUjsKLX0KLQotLy8gc3RhdGljCi1DRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4gSUZHQVNfU3RyZWFtOjpDcmVhdGVTdHJlYW0oCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVXcml0ZVN0cmVhbT4mIHBGaWxlV3JpdGUsCi0gICAgdWludDMyX3QgZHdBY2Nlc3MpIHsKLSAgYXV0byBwU1IgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZHQVNfU3RyZWFtPigpOwotICBpZiAoIXBTUi0+TG9hZEZpbGVXcml0ZShwRmlsZVdyaXRlLCBkd0FjY2VzcykpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1RleHQpCi0gICAgcmV0dXJuIHBkZml1bTo6TWFrZVJldGFpbjxDRkdBU19UZXh0U3RyZWFtPihwU1IpOwotCi0gIHJldHVybiBwU1I7Ci19Ci0KLS8vIHN0YXRpYwotQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+IElGR0FTX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKHVpbnQ4X3QqIHBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3QWNjZXNzKSB7Ci0gIGF1dG8gcFNSID0gcGRmaXVtOjpNYWtlUmV0YWluPENGR0FTX1N0cmVhbT4oKTsKLSAgaWYgKCFwU1ItPkxvYWRCdWZmZXIocERhdGEsIGxlbmd0aCwgZHdBY2Nlc3MpKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UZXh0KQotICAgIHJldHVybiBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZHQVNfVGV4dFN0cmVhbT4ocFNSKTsKLQotICByZXR1cm4gcFNSOwotfQotCi1JRkdBU19TdHJlYW1JbXA6OklGR0FTX1N0cmVhbUltcCgpIDogbV9kd0FjY2VzcygwKSB7fQotCi1DRkdBU19GaWxlU3RyZWFtSW1wOjpDRkdBU19GaWxlU3RyZWFtSW1wKCkgOiBtX2hGaWxlKG51bGxwdHIpLCBtX2lMZW5ndGgoMCkge30KLQotQ0ZHQVNfRmlsZVN0cmVhbUltcDo6fkNGR0FTX0ZpbGVTdHJlYW1JbXAoKSB7Ci0gIGlmIChtX2hGaWxlKQotICAgIEZYU1lTX2ZjbG9zZShtX2hGaWxlKTsKLX0KLQotYm9vbCBDRkdBU19GaWxlU3RyZWFtSW1wOjpMb2FkRmlsZShjb25zdCBGWF9XQ0hBUiogcHN6U3JjRmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3QWNjZXNzKSB7Ci0gIEFTU0VSVCghbV9oRmlsZSk7Ci0gIEFTU0VSVChwc3pTcmNGaWxlTmFtZSAmJiBGWFNZU193Y3NsZW4ocHN6U3JjRmlsZU5hbWUpID4gMCk7Ci0jaWYgX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lOMzJfTU9CSUxFXyB8fCBcCi0gICAgX0ZYX09TXyA9PSBfRlhfV0lONjRfCi0gIGNvbnN0IEZYX1dDSEFSKiB3c01vZGU7Ci0gIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgewotICAgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19BcHBlbmQpIHsKLSAgICAgIHdzTW9kZSA9IEwiYStiIjsKLSAgICB9IGVsc2UgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1RydW5jYXRlKSB7Ci0gICAgICB3c01vZGUgPSBMIncrYiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHdzTW9kZSA9IEwicitiIjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgd3NNb2RlID0gTCJyYiI7Ci0gIH0KLSAgbV9oRmlsZSA9IEZYU1lTX3dmb3Blbihwc3pTcmNGaWxlTmFtZSwgd3NNb2RlKTsKLQotICBpZiAoIW1faEZpbGUpIHsKLSAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpIHsKLSAgICAgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19DcmVhdGUpCi0gICAgICAgIG1faEZpbGUgPSBGWFNZU193Zm9wZW4ocHN6U3JjRmlsZU5hbWUsIEwidytiIik7Ci0KLSAgICAgIGlmICghbV9oRmlsZSkgewotICAgICAgICBtX2hGaWxlID0gRlhTWVNfd2ZvcGVuKHBzelNyY0ZpbGVOYW1lLCBMInIrYiIpOwotICAgICAgICBpZiAoIW1faEZpbGUpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UcnVuY2F0ZSkKLSAgICAgICAgICBGaWxlU2V0U2l6ZShtX2hGaWxlLCAwKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotI2Vsc2UKLSAgY29uc3QgRlhfQ0hBUiogd3NNb2RlID0gInJiIjsKLSAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSB7Ci0gICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX0FwcGVuZCkgewotICAgICAgd3NNb2RlID0gImErYiI7Ci0gICAgfSBlbHNlIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UcnVuY2F0ZSkgewotICAgICAgd3NNb2RlID0gIncrYiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHdzTW9kZSA9ICJyK2IiOwotICAgIH0KLSAgfQotICBDRlhfQnl0ZVN0cmluZyBzekZpbGVOYW1lID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHBzelNyY0ZpbGVOYW1lKTsKLSAgbV9oRmlsZSA9IEZYU1lTX2ZvcGVuKHN6RmlsZU5hbWUuY19zdHIoKSwgd3NNb2RlKTsKLSAgaWYgKCFtX2hGaWxlKSB7Ci0gICAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSB7Ci0gICAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfQ3JlYXRlKSB7Ci0gICAgICAgIG1faEZpbGUgPSBGWFNZU19mb3BlbihzekZpbGVOYW1lLmNfc3RyKCksICJ3K2IiKTsKLSAgICAgIH0KLSAgICAgIGlmICghbV9oRmlsZSkgewotICAgICAgICBtX2hGaWxlID0gRlhTWVNfZm9wZW4oc3pGaWxlTmFtZS5jX3N0cigpLCAicitiIik7Ci0gICAgICAgIGlmICghbV9oRmlsZSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfVHJ1bmNhdGUpIHsKLSAgICAgICAgICBGaWxlU2V0U2l6ZShtX2hGaWxlLCAwKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0jZW5kaWYKLSAgU2V0QWNjZXNzTW9kZXMoZHdBY2Nlc3MpOwotICBpZiAoKGR3QWNjZXNzICYgKEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSB8IEZYX1NUUkVBTUFDQ0VTU19UcnVuY2F0ZSkpID09Ci0gICAgICAoRlhfU1RSRUFNQUNDRVNTX1dyaXRlIHwgRlhfU1RSRUFNQUNDRVNTX1RydW5jYXRlKSkgewotICAgIG1faUxlbmd0aCA9IDA7Ci0gIH0gZWxzZSB7Ci0gICAgbV9pTGVuZ3RoID0gRmlsZUxlbmd0aChtX2hGaWxlKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLWludDMyX3QgQ0ZHQVNfRmlsZVN0cmVhbUltcDo6R2V0TGVuZ3RoKCkgY29uc3QgewotICBBU1NFUlQobV9oRmlsZSk7Ci0gIHJldHVybiBtX2lMZW5ndGg7Ci19Ci1pbnQzMl90IENGR0FTX0ZpbGVTdHJlYW1JbXA6OlNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KSB7Ci0gIEFTU0VSVChtX2hGaWxlKTsKLSAgRlhTWVNfZnNlZWsobV9oRmlsZSwgaU9mZnNldCwgZVNlZWspOwotICByZXR1cm4gRlhTWVNfZnRlbGwobV9oRmlsZSk7Ci19Ci1pbnQzMl90IENGR0FTX0ZpbGVTdHJlYW1JbXA6OkdldFBvc2l0aW9uKCkgewotICBBU1NFUlQobV9oRmlsZSk7Ci0gIHJldHVybiBGWFNZU19mdGVsbChtX2hGaWxlKTsKLX0KLWJvb2wgQ0ZHQVNfRmlsZVN0cmVhbUltcDo6SXNFT0YoKSBjb25zdCB7Ci0gIEFTU0VSVChtX2hGaWxlKTsKLSAgcmV0dXJuIEZYU1lTX2Z0ZWxsKG1faEZpbGUpID49IG1faUxlbmd0aDsKLX0KLWludDMyX3QgQ0ZHQVNfRmlsZVN0cmVhbUltcDo6UmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkgewotICBBU1NFUlQobV9oRmlsZSk7Ci0gIEFTU0VSVChwQnVmZmVyICYmIGlCdWZmZXJTaXplID4gMCk7Ci0gIHJldHVybiBGWFNZU19mcmVhZChwQnVmZmVyLCAxLCBpQnVmZmVyU2l6ZSwgbV9oRmlsZSk7Ci19Ci1pbnQzMl90IENGR0FTX0ZpbGVTdHJlYW1JbXA6OlJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTWF4TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJFT1MpIHsKLSAgQVNTRVJUKG1faEZpbGUpOwotICBBU1NFUlQocFN0ciAmJiBpTWF4TGVuZ3RoID4gMCk7Ci0gIGlmIChtX2lMZW5ndGggPD0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIGludDMyX3QgaVBvc2l0aW9uID0gRlhTWVNfZnRlbGwobV9oRmlsZSk7Ci0gIGludDMyX3QgaUxlbiA9IHN0ZDo6bWluKChtX2lMZW5ndGggLSBpUG9zaXRpb24pIC8gMiwgaU1heExlbmd0aCk7Ci0gIGlmIChpTGVuIDw9IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpTGVuID0gRlhTWVNfZnJlYWQocFN0ciwgMiwgaUxlbiwgbV9oRmlsZSk7Ci0gIGludDMyX3QgaUNvdW50ID0gMDsKLSAgd2hpbGUgKCpwU3RyICE9IEwnXDAnICYmIGlDb3VudCA8IGlMZW4pIHsKLSAgICBwU3RyKyssIGlDb3VudCsrOwotICB9Ci0gIGlQb3NpdGlvbiArPSBpQ291bnQgKiAyOwotICBpZiAoRlhTWVNfZnRlbGwobV9oRmlsZSkgIT0gaVBvc2l0aW9uKSB7Ci0gICAgRlhTWVNfZnNlZWsobV9oRmlsZSwgaVBvc2l0aW9uLCAwKTsKLSAgfQotICBiRU9TID0gKGlQb3NpdGlvbiA+PSBtX2lMZW5ndGgpOwotICByZXR1cm4gaUNvdW50OwotfQotaW50MzJfdCBDRkdBU19GaWxlU3RyZWFtSW1wOjpXcml0ZURhdGEoY29uc3QgdWludDhfdCogcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJ1ZmZlclNpemUpIHsKLSAgQVNTRVJUKG1faEZpbGUgJiYgKEdldEFjY2Vzc01vZGVzKCkgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDApOwotICBBU1NFUlQocEJ1ZmZlciAmJiBpQnVmZmVyU2l6ZSA+IDApOwotICBpbnQzMl90IGlSZXQgPSBGWFNZU19md3JpdGUocEJ1ZmZlciwgMSwgaUJ1ZmZlclNpemUsIG1faEZpbGUpOwotICBpZiAoaVJldCAhPSAwKSB7Ci0gICAgaW50MzJfdCBpUG9zID0gRlhTWVNfZnRlbGwobV9oRmlsZSk7Ci0gICAgaWYgKGlQb3MgPiBtX2lMZW5ndGgpIHsKLSAgICAgIG1faUxlbmd0aCA9IGlQb3M7Ci0gICAgfQotICB9Ci0gIHJldHVybiBpUmV0OwotfQotaW50MzJfdCBDRkdBU19GaWxlU3RyZWFtSW1wOjpXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoKSB7Ci0gIEFTU0VSVChtX2hGaWxlICYmIChHZXRBY2Nlc3NNb2RlcygpICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSAhPSAwKTsKLSAgQVNTRVJUKHBTdHIgJiYgaUxlbmd0aCA+IDApOwotICBpbnQzMl90IGlSZXQgPSBGWFNZU19md3JpdGUocFN0ciwgMiwgaUxlbmd0aCwgbV9oRmlsZSk7Ci0gIGlmIChpUmV0ICE9IDApIHsKLSAgICBpbnQzMl90IGlQb3MgPSBGWFNZU19mdGVsbChtX2hGaWxlKTsKLSAgICBpZiAoaVBvcyA+IG1faUxlbmd0aCkgewotICAgICAgbV9pTGVuZ3RoID0gaVBvczsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGlSZXQ7Ci19Ci12b2lkIENGR0FTX0ZpbGVTdHJlYW1JbXA6OkZsdXNoKCkgewotICBBU1NFUlQobV9oRmlsZSAmJiAoR2V0QWNjZXNzTW9kZXMoKSAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgIT0gMCk7Ci0gIEZYU1lTX2ZmbHVzaChtX2hGaWxlKTsKLX0KLWJvb2wgQ0ZHQVNfRmlsZVN0cmVhbUltcDo6U2V0TGVuZ3RoKGludDMyX3QgaUxlbmd0aCkgewotICBBU1NFUlQobV9oRmlsZSAmJiAoR2V0QWNjZXNzTW9kZXMoKSAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgIT0gMCk7Ci0gIGJvb2wgYlJldCA9IEZpbGVTZXRTaXplKG1faEZpbGUsIGlMZW5ndGgpOwotICBtX2lMZW5ndGggPSBGaWxlTGVuZ3RoKG1faEZpbGUpOwotICByZXR1cm4gYlJldDsKLX0KLQotQ0ZHQVNfRmlsZVJlYWRTdHJlYW1JbXA6OkNGR0FTX0ZpbGVSZWFkU3RyZWFtSW1wKCkKLSAgICA6IG1fcEZpbGVSZWFkKG51bGxwdHIpLCBtX2lQb3NpdGlvbigwKSwgbV9pTGVuZ3RoKDApIHt9Ci0KLWJvb2wgQ0ZHQVNfRmlsZVJlYWRTdHJlYW1JbXA6OkxvYWRGaWxlUmVhZCgKLSAgICBjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZVJlYWQsCi0gICAgdWludDMyX3QgZHdBY2Nlc3MpIHsKLSAgQVNTRVJUKCFtX3BGaWxlUmVhZCAmJiBwRmlsZVJlYWQpOwotICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG1fcEZpbGVSZWFkID0gcEZpbGVSZWFkOwotICBtX2lMZW5ndGggPSBtX3BGaWxlUmVhZC0+R2V0U2l6ZSgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotaW50MzJfdCBDRkdBU19GaWxlUmVhZFN0cmVhbUltcDo6R2V0TGVuZ3RoKCkgY29uc3QgewotICByZXR1cm4gbV9pTGVuZ3RoOwotfQotaW50MzJfdCBDRkdBU19GaWxlUmVhZFN0cmVhbUltcDo6U2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpIHsKLSAgc3dpdGNoIChlU2VlaykgewotICAgIGNhc2UgRlhfU1RSRUFNU0VFS19CZWdpbjoKLSAgICAgIG1faVBvc2l0aW9uID0gaU9mZnNldDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlhfU1RSRUFNU0VFS19DdXJyZW50OgotICAgICAgbV9pUG9zaXRpb24gKz0gaU9mZnNldDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlhfU1RSRUFNU0VFS19FbmQ6Ci0gICAgICBtX2lQb3NpdGlvbiA9IG1faUxlbmd0aCArIGlPZmZzZXQ7Ci0gICAgICBicmVhazsKLSAgfQotICBpZiAobV9pUG9zaXRpb24gPCAwKSB7Ci0gICAgbV9pUG9zaXRpb24gPSAwOwotICB9IGVsc2UgaWYgKG1faVBvc2l0aW9uID49IG1faUxlbmd0aCkgewotICAgIG1faVBvc2l0aW9uID0gbV9pTGVuZ3RoOwotICB9Ci0gIHJldHVybiBtX2lQb3NpdGlvbjsKLX0KLWJvb2wgQ0ZHQVNfRmlsZVJlYWRTdHJlYW1JbXA6OklzRU9GKCkgY29uc3QgewotICByZXR1cm4gbV9pUG9zaXRpb24gPj0gbV9pTGVuZ3RoOwotfQotaW50MzJfdCBDRkdBU19GaWxlUmVhZFN0cmVhbUltcDo6UmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJ1ZmZlclNpemUpIHsKLSAgQVNTRVJUKG1fcEZpbGVSZWFkKTsKLSAgQVNTRVJUKHBCdWZmZXIgJiYgaUJ1ZmZlclNpemUgPiAwKTsKLSAgaWYgKGlCdWZmZXJTaXplID4gbV9pTGVuZ3RoIC0gbV9pUG9zaXRpb24pIHsKLSAgICBpQnVmZmVyU2l6ZSA9IG1faUxlbmd0aCAtIG1faVBvc2l0aW9uOwotICB9Ci0gIGlmIChtX3BGaWxlUmVhZC0+UmVhZEJsb2NrKHBCdWZmZXIsIG1faVBvc2l0aW9uLCBpQnVmZmVyU2l6ZSkpIHsKLSAgICBtX2lQb3NpdGlvbiArPSBpQnVmZmVyU2l6ZTsKLSAgICByZXR1cm4gaUJ1ZmZlclNpemU7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci1pbnQzMl90IENGR0FTX0ZpbGVSZWFkU3RyZWFtSW1wOjpSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNYXhMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJFT1MpIHsKLSAgQVNTRVJUKG1fcEZpbGVSZWFkKTsKLSAgQVNTRVJUKHBTdHIgJiYgaU1heExlbmd0aCA+IDApOwotICBpTWF4TGVuZ3RoID0gUmVhZERhdGEoKHVpbnQ4X3QqKXBTdHIsIGlNYXhMZW5ndGggKiAyKSAvIDI7Ci0gIGlmIChpTWF4TGVuZ3RoIDw9IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpbnQzMl90IGkgPSAwOwotICB3aGlsZSAoaSA8IGlNYXhMZW5ndGggJiYgcFN0cltpXSAhPSBMJ1wwJykgewotICAgICsraTsKLSAgfQotICBiRU9TID0gKG1faVBvc2l0aW9uID49IG1faUxlbmd0aCkgfHwgcFN0cltpXSA9PSBMJ1wwJzsKLSAgcmV0dXJuIGk7Ci19Ci0KLUNGR0FTX0J1ZmZlclJlYWRTdHJlYW1JbXA6OkNGR0FTX0J1ZmZlclJlYWRTdHJlYW1JbXAoKQotICAgIDogbV9pUG9zaXRpb24oMCksIG1faUJ1ZmZlclNpemUoMCkge30KLQotQ0ZHQVNfQnVmZmVyUmVhZFN0cmVhbUltcDo6fkNGR0FTX0J1ZmZlclJlYWRTdHJlYW1JbXAoKSB7fQotCi1ib29sIENGR0FTX0J1ZmZlclJlYWRTdHJlYW1JbXA6OkxvYWRCdWZmZXJSZWFkKAotICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX0J1ZmZlcmVkUmVhZFN0cmVhbT4mIHBCdWZmZXJSZWFkLAotICAgIGludDMyX3QgaUZpbGVTaXplLAotICAgIHVpbnQzMl90IGR3QWNjZXNzKSB7Ci0gIEFTU0VSVCghbV9wQnVmZmVyUmVhZCAmJiBwQnVmZmVyUmVhZCk7Ci0gIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbV9wQnVmZmVyUmVhZCA9IHBCdWZmZXJSZWFkOwotICBtX2lCdWZmZXJTaXplID0gaUZpbGVTaXplOwotICBpZiAobV9pQnVmZmVyU2l6ZSA+PSAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmICghbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayh0cnVlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbV9pQnVmZmVyU2l6ZSA9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOwotICB3aGlsZSAoIW1fcEJ1ZmZlclJlYWQtPklzRU9GKCkpIHsKLSAgICBtX3BCdWZmZXJSZWFkLT5SZWFkTmV4dEJsb2NrKGZhbHNlKTsKLSAgICBtX2lCdWZmZXJTaXplICs9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotaW50MzJfdCBDRkdBU19CdWZmZXJSZWFkU3RyZWFtSW1wOjpHZXRMZW5ndGgoKSBjb25zdCB7Ci0gIHJldHVybiBtX2lCdWZmZXJTaXplOwotfQotaW50MzJfdCBDRkdBU19CdWZmZXJSZWFkU3RyZWFtSW1wOjpTZWVrKEZYX1NUUkVBTVNFRUsgZVNlZWssIGludDMyX3QgaU9mZnNldCkgewotICBpbnQzMl90IGlMZW5ndGggPSBHZXRMZW5ndGgoKTsKLSAgc3dpdGNoIChlU2VlaykgewotICAgIGNhc2UgRlhfU1RSRUFNU0VFS19CZWdpbjoKLSAgICAgIG1faVBvc2l0aW9uID0gaU9mZnNldDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlhfU1RSRUFNU0VFS19DdXJyZW50OgotICAgICAgbV9pUG9zaXRpb24gKz0gaU9mZnNldDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlhfU1RSRUFNU0VFS19FbmQ6Ci0gICAgICBtX2lQb3NpdGlvbiA9IGlMZW5ndGggKyBpT2Zmc2V0OwotICAgICAgYnJlYWs7Ci0gIH0KLSAgaWYgKG1faVBvc2l0aW9uIDwgMCkgewotICAgIG1faVBvc2l0aW9uID0gMDsKLSAgfSBlbHNlIGlmIChtX2lQb3NpdGlvbiA+PSBpTGVuZ3RoKSB7Ci0gICAgbV9pUG9zaXRpb24gPSBpTGVuZ3RoOwotICB9Ci0gIHJldHVybiBtX2lQb3NpdGlvbjsKLX0KLWJvb2wgQ0ZHQVNfQnVmZmVyUmVhZFN0cmVhbUltcDo6SXNFT0YoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BCdWZmZXJSZWFkID8gbV9wQnVmZmVyUmVhZC0+SXNFT0YoKSA6IHRydWU7Ci19Ci1pbnQzMl90IENGR0FTX0J1ZmZlclJlYWRTdHJlYW1JbXA6OlJlYWREYXRhKHVpbnQ4X3QqIHBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJ1ZmZlclNpemUpIHsKLSAgQVNTRVJUKG1fcEJ1ZmZlclJlYWQpOwotICBBU1NFUlQocEJ1ZmZlciAmJiBpQnVmZmVyU2l6ZSA+IDApOwotICBpbnQzMl90IGlMZW5ndGggPSBHZXRMZW5ndGgoKTsKLSAgaWYgKG1faVBvc2l0aW9uID49IGlMZW5ndGgpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAoaUJ1ZmZlclNpemUgPiBpTGVuZ3RoIC0gbV9pUG9zaXRpb24pIHsKLSAgICBpQnVmZmVyU2l6ZSA9IGlMZW5ndGggLSBtX2lQb3NpdGlvbjsKLSAgfQotICB1aW50MzJfdCBkd0Jsb2NrT2Zmc2V0ID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tPZmZzZXQoKTsKLSAgdWludDMyX3QgZHdCbG9ja1NpemUgPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja1NpemUoKTsKLSAgaWYgKG1faVBvc2l0aW9uIDwgKGludDMyX3QpZHdCbG9ja09mZnNldCkgewotICAgIGlmICghbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayh0cnVlKSkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGR3QmxvY2tPZmZzZXQgPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja09mZnNldCgpOwotICAgIGR3QmxvY2tTaXplID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7Ci0gIH0KLSAgd2hpbGUgKG1faVBvc2l0aW9uIDwgKGludDMyX3QpZHdCbG9ja09mZnNldCB8fAotICAgICAgICAgbV9pUG9zaXRpb24gPj0gKGludDMyX3QpKGR3QmxvY2tPZmZzZXQgKyBkd0Jsb2NrU2l6ZSkpIHsKLSAgICBpZiAobV9wQnVmZmVyUmVhZC0+SXNFT0YoKSB8fCAhbV9wQnVmZmVyUmVhZC0+UmVhZE5leHRCbG9jayhmYWxzZSkpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkd0Jsb2NrT2Zmc2V0ID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tPZmZzZXQoKTsKLSAgICBkd0Jsb2NrU2l6ZSA9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrU2l6ZSgpOwotICB9Ci0gIGlmIChtX2lQb3NpdGlvbiA8IChpbnQzMl90KWR3QmxvY2tPZmZzZXQgfHwKLSAgICAgIG1faVBvc2l0aW9uID49IChpbnQzMl90KShkd0Jsb2NrT2Zmc2V0ICsgZHdCbG9ja1NpemUpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgY29uc3QgdWludDhfdCogcEJ1ZmZlclRtcCA9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrQnVmZmVyKCk7Ci0gIHVpbnQzMl90IGR3T2Zmc2V0VG1wID0gbV9pUG9zaXRpb24gLSBkd0Jsb2NrT2Zmc2V0OwotICB1aW50MzJfdCBkd0NvcHlTaXplID0KLSAgICAgIHN0ZDo6bWluKGlCdWZmZXJTaXplLCAoaW50MzJfdCkoZHdCbG9ja1NpemUgLSBkd09mZnNldFRtcCkpOwotICBGWFNZU19tZW1jcHkocEJ1ZmZlciwgcEJ1ZmZlclRtcCArIGR3T2Zmc2V0VG1wLCBkd0NvcHlTaXplKTsKLSAgZHdPZmZzZXRUbXAgPSBkd0NvcHlTaXplOwotICBpQnVmZmVyU2l6ZSAtPSBkd0NvcHlTaXplOwotICB3aGlsZSAoaUJ1ZmZlclNpemUgPiAwKSB7Ci0gICAgaWYgKCFtX3BCdWZmZXJSZWFkLT5SZWFkTmV4dEJsb2NrKGZhbHNlKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGR3QmxvY2tPZmZzZXQgPSBtX3BCdWZmZXJSZWFkLT5HZXRCbG9ja09mZnNldCgpOwotICAgIGR3QmxvY2tTaXplID0gbV9wQnVmZmVyUmVhZC0+R2V0QmxvY2tTaXplKCk7Ci0gICAgcEJ1ZmZlclRtcCA9IG1fcEJ1ZmZlclJlYWQtPkdldEJsb2NrQnVmZmVyKCk7Ci0gICAgZHdDb3B5U2l6ZSA9IHN0ZDo6bWluKCh1aW50MzJfdClpQnVmZmVyU2l6ZSwgZHdCbG9ja1NpemUpOwotICAgIEZYU1lTX21lbWNweShwQnVmZmVyICsgZHdPZmZzZXRUbXAsIHBCdWZmZXJUbXAsIGR3Q29weVNpemUpOwotICAgIGR3T2Zmc2V0VG1wICs9IGR3Q29weVNpemU7Ci0gICAgaUJ1ZmZlclNpemUgLT0gZHdDb3B5U2l6ZTsKLSAgfQotICBtX2lQb3NpdGlvbiArPSBkd09mZnNldFRtcDsKLSAgcmV0dXJuIGR3T2Zmc2V0VG1wOwotfQotaW50MzJfdCBDRkdBU19CdWZmZXJSZWFkU3RyZWFtSW1wOjpSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1heExlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiRU9TKSB7Ci0gIEFTU0VSVChtX3BCdWZmZXJSZWFkKTsKLSAgQVNTRVJUKHBTdHIgJiYgaU1heExlbmd0aCA+IDApOwotICBpTWF4TGVuZ3RoID0gUmVhZERhdGEoKHVpbnQ4X3QqKXBTdHIsIGlNYXhMZW5ndGggKiAyKSAvIDI7Ci0gIGlmIChpTWF4TGVuZ3RoIDw9IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpbnQzMl90IGkgPSAwOwotICB3aGlsZSAoaSA8IGlNYXhMZW5ndGggJiYgcFN0cltpXSAhPSBMJ1wwJykgewotICAgICsraTsKLSAgfQotICBiRU9TID0gKG1faVBvc2l0aW9uID49IEdldExlbmd0aCgpKSB8fCBwU3RyW2ldID09IEwnXDAnOwotICByZXR1cm4gaTsKLX0KLUNGR0FTX0ZpbGVXcml0ZVN0cmVhbUltcDo6Q0ZHQVNfRmlsZVdyaXRlU3RyZWFtSW1wKCkKLSAgICA6IG1fcEZpbGVXcml0ZShudWxscHRyKSwgbV9pUG9zaXRpb24oMCkge30KLQotYm9vbCBDRkdBU19GaWxlV3JpdGVTdHJlYW1JbXA6OkxvYWRGaWxlV3JpdGUoCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVXcml0ZVN0cmVhbT4mIHBGaWxlV3JpdGUsCi0gICAgdWludDMyX3QgZHdBY2Nlc3MpIHsKLSAgQVNTRVJUKCFtX3BGaWxlV3JpdGUgJiYgcEZpbGVXcml0ZSk7Ci0gIGlmIChkd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19SZWFkKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfQXBwZW5kKQotICAgIG1faVBvc2l0aW9uID0gcEZpbGVXcml0ZS0+R2V0U2l6ZSgpOwotCi0gIG1fcEZpbGVXcml0ZSA9IHBGaWxlV3JpdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1pbnQzMl90IENGR0FTX0ZpbGVXcml0ZVN0cmVhbUltcDo6R2V0TGVuZ3RoKCkgY29uc3QgewotICBpZiAoIW1fcEZpbGVXcml0ZSkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gKGludDMyX3QpbV9wRmlsZVdyaXRlLT5HZXRTaXplKCk7Ci19Ci1pbnQzMl90IENGR0FTX0ZpbGVXcml0ZVN0cmVhbUltcDo6U2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpIHsKLSAgaW50MzJfdCBpTGVuZ3RoID0gR2V0TGVuZ3RoKCk7Ci0gIHN3aXRjaCAoZVNlZWspIHsKLSAgICBjYXNlIEZYX1NUUkVBTVNFRUtfQmVnaW46Ci0gICAgICBtX2lQb3NpdGlvbiA9IGlPZmZzZXQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYX1NUUkVBTVNFRUtfQ3VycmVudDoKLSAgICAgIG1faVBvc2l0aW9uICs9IGlPZmZzZXQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYX1NUUkVBTVNFRUtfRW5kOgotICAgICAgbV9pUG9zaXRpb24gPSBpTGVuZ3RoICsgaU9mZnNldDsKLSAgICAgIGJyZWFrOwotICB9Ci0gIGlmIChtX2lQb3NpdGlvbiA8IDApIHsKLSAgICBtX2lQb3NpdGlvbiA9IDA7Ci0gIH0gZWxzZSBpZiAobV9pUG9zaXRpb24gPj0gaUxlbmd0aCkgewotICAgIG1faVBvc2l0aW9uID0gaUxlbmd0aDsKLSAgfQotICByZXR1cm4gbV9pUG9zaXRpb247Ci19Ci1ib29sIENGR0FTX0ZpbGVXcml0ZVN0cmVhbUltcDo6SXNFT0YoKSBjb25zdCB7Ci0gIHJldHVybiBtX2lQb3NpdGlvbiA+PSBHZXRMZW5ndGgoKTsKLX0KLWludDMyX3QgQ0ZHQVNfRmlsZVdyaXRlU3RyZWFtSW1wOjpXcml0ZURhdGEoY29uc3QgdWludDhfdCogcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQnVmZmVyU2l6ZSkgewotICBpZiAoIW1fcEZpbGVXcml0ZSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIGlmIChtX3BGaWxlV3JpdGUtPldyaXRlQmxvY2socEJ1ZmZlciwgbV9pUG9zaXRpb24sIGlCdWZmZXJTaXplKSkgewotICAgIG1faVBvc2l0aW9uICs9IGlCdWZmZXJTaXplOwotICB9Ci0gIHJldHVybiBpQnVmZmVyU2l6ZTsKLX0KLWludDMyX3QgQ0ZHQVNfRmlsZVdyaXRlU3RyZWFtSW1wOjpXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpIHsKLSAgcmV0dXJuIFdyaXRlRGF0YSgoY29uc3QgdWludDhfdCopcFN0ciwgaUxlbmd0aCAqIHNpemVvZihGWF9XQ0hBUikpOwotfQotdm9pZCBDRkdBU19GaWxlV3JpdGVTdHJlYW1JbXA6OkZsdXNoKCkgewotICBpZiAobV9wRmlsZVdyaXRlKSB7Ci0gICAgbV9wRmlsZVdyaXRlLT5GbHVzaCgpOwotICB9Ci19Ci1DRkdBU19CdWZmZXJTdHJlYW1JbXA6OkNGR0FTX0J1ZmZlclN0cmVhbUltcCgpCi0gICAgOiBtX3BEYXRhKG51bGxwdHIpLCBtX2lUb3RhbFNpemUoMCksIG1faVBvc2l0aW9uKDApLCBtX2lMZW5ndGgoMCkge30KLQotYm9vbCBDRkdBU19CdWZmZXJTdHJlYW1JbXA6OkxvYWRCdWZmZXIodWludDhfdCogcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUb3RhbFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0FjY2VzcykgewotICBBU1NFUlQoIW1fcERhdGEgJiYgcERhdGEgJiYgaVRvdGFsU2l6ZSA+IDApOwotICBTZXRBY2Nlc3NNb2Rlcyhkd0FjY2Vzcyk7Ci0gIG1fcERhdGEgPSBwRGF0YTsKLSAgbV9pVG90YWxTaXplID0gaVRvdGFsU2l6ZTsKLSAgbV9pUG9zaXRpb24gPSAwOwotICBtX2lMZW5ndGggPSAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDAgPyAwIDogaVRvdGFsU2l6ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci1pbnQzMl90IENGR0FTX0J1ZmZlclN0cmVhbUltcDo6R2V0TGVuZ3RoKCkgY29uc3QgewotICBBU1NFUlQobV9wRGF0YSk7Ci0gIHJldHVybiBtX2lMZW5ndGg7Ci19Ci1pbnQzMl90IENGR0FTX0J1ZmZlclN0cmVhbUltcDo6U2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpIHsKLSAgQVNTRVJUKG1fcERhdGEpOwotICBpZiAoZVNlZWsgPT0gRlhfU1RSRUFNU0VFS19CZWdpbikgewotICAgIG1faVBvc2l0aW9uID0gaU9mZnNldDsKLSAgfSBlbHNlIGlmIChlU2VlayA9PSBGWF9TVFJFQU1TRUVLX0N1cnJlbnQpIHsKLSAgICBtX2lQb3NpdGlvbiArPSBpT2Zmc2V0OwotICB9IGVsc2UgaWYgKGVTZWVrID09IEZYX1NUUkVBTVNFRUtfRW5kKSB7Ci0gICAgbV9pUG9zaXRpb24gPSBtX2lMZW5ndGggKyBpT2Zmc2V0OwotICB9Ci0gIGlmIChtX2lQb3NpdGlvbiA+IG1faUxlbmd0aCkgewotICAgIG1faVBvc2l0aW9uID0gbV9pTGVuZ3RoOwotICB9Ci0gIGlmIChtX2lQb3NpdGlvbiA8IDApIHsKLSAgICBtX2lQb3NpdGlvbiA9IDA7Ci0gIH0KLSAgcmV0dXJuIG1faVBvc2l0aW9uOwotfQotaW50MzJfdCBDRkdBU19CdWZmZXJTdHJlYW1JbXA6OkdldFBvc2l0aW9uKCkgewotICBBU1NFUlQobV9wRGF0YSk7Ci0gIHJldHVybiBtX2lQb3NpdGlvbjsKLX0KLWJvb2wgQ0ZHQVNfQnVmZmVyU3RyZWFtSW1wOjpJc0VPRigpIGNvbnN0IHsKLSAgQVNTRVJUKG1fcERhdGEpOwotICByZXR1cm4gbV9pUG9zaXRpb24gPj0gbV9pTGVuZ3RoOwotfQotaW50MzJfdCBDRkdBU19CdWZmZXJTdHJlYW1JbXA6OlJlYWREYXRhKHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpIHsKLSAgQVNTRVJUKG1fcERhdGEpOwotICBBU1NFUlQocEJ1ZmZlciAmJiBpQnVmZmVyU2l6ZSA+IDApOwotICBpbnQzMl90IGlMZW4gPSBzdGQ6Om1pbihtX2lMZW5ndGggLSBtX2lQb3NpdGlvbiwgaUJ1ZmZlclNpemUpOwotICBpZiAoaUxlbiA8PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgRlhTWVNfbWVtY3B5KHBCdWZmZXIsIG1fcERhdGEgKyBtX2lQb3NpdGlvbiwgaUxlbik7Ci0gIG1faVBvc2l0aW9uICs9IGlMZW47Ci0gIHJldHVybiBpTGVuOwotfQotaW50MzJfdCBDRkdBU19CdWZmZXJTdHJlYW1JbXA6OlJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNYXhMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiRU9TKSB7Ci0gIEFTU0VSVChtX3BEYXRhKTsKLSAgQVNTRVJUKHBTdHIgJiYgaU1heExlbmd0aCA+IDApOwotICBpbnQzMl90IGlMZW4gPSBzdGQ6Om1pbigobV9pTGVuZ3RoIC0gbV9pUG9zaXRpb24pIC8gMiwgaU1heExlbmd0aCk7Ci0gIGlmIChpTGVuIDw9IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBjb25zdCBGWF9XQ0hBUiogcFNyYyA9IChjb25zdCBGWF9XQ0hBUiopKEZYX0NIQVIqKShtX3BEYXRhICsgbV9pUG9zaXRpb24pOwotICBpbnQzMl90IGlDb3VudCA9IDA7Ci0gIHdoaWxlICgqcFNyYyAmJiBpQ291bnQgPCBpTGVuKSB7Ci0gICAgKnBTdHIrKyA9ICpwU3JjKys7Ci0gICAgaUNvdW50Kys7Ci0gIH0KLSAgbV9pUG9zaXRpb24gKz0gaUNvdW50ICogMjsKLSAgYkVPUyA9ICgqcFNyYyA9PSBMJ1wwJykgfHwgKG1faVBvc2l0aW9uID49IG1faUxlbmd0aCk7Ci0gIHJldHVybiBpQ291bnQ7Ci19Ci1pbnQzMl90IENGR0FTX0J1ZmZlclN0cmVhbUltcDo6V3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJ1ZmZlclNpemUpIHsKLSAgQVNTRVJUKG1fcERhdGEgJiYgKEdldEFjY2Vzc01vZGVzKCkgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDApOwotICBBU1NFUlQocEJ1ZmZlciAmJiBpQnVmZmVyU2l6ZSA+IDApOwotICBpbnQzMl90IGlMZW4gPSBzdGQ6Om1pbihtX2lUb3RhbFNpemUgLSBtX2lQb3NpdGlvbiwgaUJ1ZmZlclNpemUpOwotICBpZiAoaUxlbiA8PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgRlhTWVNfbWVtY3B5KG1fcERhdGEgKyBtX2lQb3NpdGlvbiwgcEJ1ZmZlciwgaUxlbik7Ci0gIG1faVBvc2l0aW9uICs9IGlMZW47Ci0gIGlmIChtX2lQb3NpdGlvbiA+IG1faUxlbmd0aCkgewotICAgIG1faUxlbmd0aCA9IG1faVBvc2l0aW9uOwotICB9Ci0gIHJldHVybiBpTGVuOwotfQotaW50MzJfdCBDRkdBU19CdWZmZXJTdHJlYW1JbXA6OldyaXRlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCkgewotICBBU1NFUlQobV9wRGF0YSAmJiAoR2V0QWNjZXNzTW9kZXMoKSAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgIT0gMCk7Ci0gIEFTU0VSVChwU3RyICYmIGlMZW5ndGggPiAwKTsKLSAgaW50MzJfdCBpTGVuID0gc3RkOjptaW4oKG1faVRvdGFsU2l6ZSAtIG1faVBvc2l0aW9uKSAvIDIsIGlMZW5ndGgpOwotICBpZiAoaUxlbiA8PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgRlhTWVNfbWVtY3B5KG1fcERhdGEgKyBtX2lQb3NpdGlvbiwgcFN0ciwgaUxlbiAqIDIpOwotICBtX2lQb3NpdGlvbiArPSBpTGVuICogMjsKLSAgaWYgKG1faVBvc2l0aW9uID4gbV9pTGVuZ3RoKSB7Ci0gICAgbV9pTGVuZ3RoID0gbV9pUG9zaXRpb247Ci0gIH0KLSAgcmV0dXJuIGlMZW47Ci19Ci0KLS8vIHN0YXRpYwotQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+IElGR0FTX1N0cmVhbTo6Q3JlYXRlVGV4dFN0cmVhbSgKLSAgICBjb25zdCBDRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4mIHBCYXNlU3RyZWFtKSB7Ci0gIEFTU0VSVChwQmFzZVN0cmVhbSk7Ci0gIHJldHVybiBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZHQVNfVGV4dFN0cmVhbT4ocEJhc2VTdHJlYW0pOwotfQotCi1DRkdBU19UZXh0U3RyZWFtOjpDRkdBU19UZXh0U3RyZWFtKGNvbnN0IENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiYgcFN0cmVhbSkKLSAgICA6IG1fd0NvZGVQYWdlKEZYX0NPREVQQUdFX0RlZkFOU0kpLAotICAgICAgbV93Qk9NTGVuZ3RoKDApLAotICAgICAgbV9kd0JPTSgwKSwKLSAgICAgIG1fcEJ1ZihudWxscHRyKSwKLSAgICAgIG1faUJ1ZlNpemUoMCksCi0gICAgICBtX3BTdHJlYW1JbXAocFN0cmVhbSkgewotICBBU1NFUlQobV9wU3RyZWFtSW1wKTsKLSAgSW5pdFN0cmVhbSgpOwotfQotCi1DRkdBU19UZXh0U3RyZWFtOjp+Q0ZHQVNfVGV4dFN0cmVhbSgpIHsKLSAgaWYgKG1fcEJ1ZikKLSAgICBGWF9GcmVlKG1fcEJ1Zik7Ci19Ci0KLXZvaWQgQ0ZHQVNfVGV4dFN0cmVhbTo6SW5pdFN0cmVhbSgpIHsKLSAgaW50MzJfdCBpUG9zaXRpb24gPSBtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCk7Ci0gIG1fcFN0cmVhbUltcC0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCAwKTsKLSAgbV9wU3RyZWFtSW1wLT5SZWFkRGF0YSgodWludDhfdCopJm1fZHdCT00sIDMpOwotI2lmIF9GWF9FTkRJQU5fID09IF9GWF9MSVRUTEVfRU5ESUFOXwotICBtX2R3Qk9NICY9IDB4MDBGRkZGRkY7Ci0gIGlmIChtX2R3Qk9NID09IDB4MDBCRkJCRUYpIHsKLSAgICBtX3dCT01MZW5ndGggPSAzOwotICAgIG1fd0NvZGVQYWdlID0gRlhfQ09ERVBBR0VfVVRGODsKLSAgfSBlbHNlIHsKLSAgICBtX2R3Qk9NICY9IDB4MDAwMEZGRkY7Ci0gICAgaWYgKG1fZHdCT00gPT0gMHgwMDAwRkZGRSkgewotICAgICAgbV93Qk9NTGVuZ3RoID0gMjsKLSAgICAgIG1fd0NvZGVQYWdlID0gRlhfQ09ERVBBR0VfVVRGMTZCRTsKLSAgICB9IGVsc2UgaWYgKG1fZHdCT00gPT0gMHgwMDAwRkVGRikgewotICAgICAgbV93Qk9NTGVuZ3RoID0gMjsKLSAgICAgIG1fd0NvZGVQYWdlID0gRlhfQ09ERVBBR0VfVVRGMTZMRTsKLSAgICB9IGVsc2UgewotICAgICAgbV93Qk9NTGVuZ3RoID0gMDsKLSAgICAgIG1fZHdCT00gPSAwOwotICAgICAgbV93Q29kZVBhZ2UgPSBGWFNZU19HZXRBQ1AoKTsKLSAgICB9Ci0gIH0KLSNlbHNlCi0gIG1fZHdCT00gJj0gMHhGRkZGRkYwMDsKLSAgaWYgKG1fZHdCT00gPT0gMHhFRkJCQkYwMCkgewotICAgIG1fd0JPTUxlbmd0aCA9IDM7Ci0gICAgbV93Q29kZVBhZ2UgPSBGWF9DT0RFUEFHRV9VVEY4OwotICB9IGVsc2UgewotICAgIG1fZHdCT00gJj0gMHhGRkZGMDAwMDsKLSAgICBpZiAobV9kd0JPTSA9PSAweEZFRkYwMDAwKSB7Ci0gICAgICBtX3dCT01MZW5ndGggPSAyOwotICAgICAgbV93Q29kZVBhZ2UgPSBGWF9DT0RFUEFHRV9VVEYxNkJFOwotICAgIH0gZWxzZSBpZiAobV9kd0JPTSA9PSAweEZGRkUwMDAwKSB7Ci0gICAgICBtX3dCT01MZW5ndGggPSAyOwotICAgICAgbV93Q29kZVBhZ2UgPSBGWF9DT0RFUEFHRV9VVEYxNkxFOwotICAgIH0gZWxzZSB7Ci0gICAgICBtX3dCT01MZW5ndGggPSAwOwotICAgICAgbV9kd0JPTSA9IDA7Ci0gICAgICBtX3dDb2RlUGFnZSA9IEZYU1lTX0dldEFDUCgpOwotICAgIH0KLSAgfQotI2VuZGlmCi0gIG1fcFN0cmVhbUltcC0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCBzdGQ6Om1heChtX3dCT01MZW5ndGgsIGlQb3NpdGlvbikpOwotfQotCi11aW50MzJfdCBDRkdBU19UZXh0U3RyZWFtOjpHZXRBY2Nlc3NNb2RlcygpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcFN0cmVhbUltcC0+R2V0QWNjZXNzTW9kZXMoKSB8IEZYX1NUUkVBTUFDQ0VTU19UZXh0OwotfQotCi1pbnQzMl90IENGR0FTX1RleHRTdHJlYW06OkdldExlbmd0aCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcFN0cmVhbUltcC0+R2V0TGVuZ3RoKCk7Ci19Ci0KLWludDMyX3QgQ0ZHQVNfVGV4dFN0cmVhbTo6U2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpIHsKLSAgcmV0dXJuIG1fcFN0cmVhbUltcC0+U2VlayhlU2VlaywgaU9mZnNldCk7Ci19Ci0KLWludDMyX3QgQ0ZHQVNfVGV4dFN0cmVhbTo6R2V0UG9zaXRpb24oKSB7Ci0gIHJldHVybiBtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCk7Ci19Ci0KLWJvb2wgQ0ZHQVNfVGV4dFN0cmVhbTo6SXNFT0YoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BTdHJlYW1JbXAtPklzRU9GKCk7Ci19Ci0KLWludDMyX3QgQ0ZHQVNfVGV4dFN0cmVhbTo6UmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkgewotICByZXR1cm4gbV9wU3RyZWFtSW1wLT5SZWFkRGF0YShwQnVmZmVyLCBpQnVmZmVyU2l6ZSk7Ci19Ci0KLWludDMyX3QgQ0ZHQVNfVGV4dFN0cmVhbTo6V3JpdGVEYXRhKGNvbnN0IHVpbnQ4X3QqIHBCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCdWZmZXJTaXplKSB7Ci0gIHJldHVybiBtX3BTdHJlYW1JbXAtPldyaXRlRGF0YShwQnVmZmVyLCBpQnVmZmVyU2l6ZSk7Ci19Ci0KLXZvaWQgQ0ZHQVNfVGV4dFN0cmVhbTo6Rmx1c2goKSB7Ci0gIG1fcFN0cmVhbUltcC0+Rmx1c2goKTsKLX0KLQotYm9vbCBDRkdBU19UZXh0U3RyZWFtOjpTZXRMZW5ndGgoaW50MzJfdCBpTGVuZ3RoKSB7Ci0gIHJldHVybiBtX3BTdHJlYW1JbXAtPlNldExlbmd0aChpTGVuZ3RoKTsKLX0KLQotdWludDE2X3QgQ0ZHQVNfVGV4dFN0cmVhbTo6R2V0Q29kZVBhZ2UoKSBjb25zdCB7Ci0gIHJldHVybiBtX3dDb2RlUGFnZTsKLX0KLQotQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+IENGR0FTX1RleHRTdHJlYW06OkNyZWF0ZVNoYXJlZFN0cmVhbSgKLSAgICB1aW50MzJfdCBkd0FjY2VzcywKLSAgICBpbnQzMl90IGlPZmZzZXQsCi0gICAgaW50MzJfdCBpTGVuZ3RoKSB7Ci0gIENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiBwU1IgPQotICAgICAgbV9wU3RyZWFtSW1wLT5DcmVhdGVTaGFyZWRTdHJlYW0oZHdBY2Nlc3MsIGlPZmZzZXQsIGlMZW5ndGgpOwotICBpZiAoIXBTUikKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBpZiAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfVGV4dCkKLSAgICByZXR1cm4gcGRmaXVtOjpNYWtlUmV0YWluPENGR0FTX1RleHRTdHJlYW0+KHBTUik7Ci0KLSAgcmV0dXJuIHBTUjsKLX0KLQotaW50MzJfdCBDRkdBU19UZXh0U3RyZWFtOjpHZXRCT00odWludDhfdCBib21bNF0pIGNvbnN0IHsKLSAgaWYgKG1fd0JPTUxlbmd0aCA8IDEpCi0gICAgcmV0dXJuIDA7Ci0KLSAgKih1aW50MzJfdCopYm9tID0gbV9kd0JPTTsKLSAgcmV0dXJuIG1fd0JPTUxlbmd0aDsKLX0KLQotdWludDE2X3QgQ0ZHQVNfVGV4dFN0cmVhbTo6U2V0Q29kZVBhZ2UodWludDE2X3Qgd0NvZGVQYWdlKSB7Ci0gIGlmIChtX3dCT01MZW5ndGggPiAwKQotICAgIHJldHVybiBtX3dDb2RlUGFnZTsKLQotICB1aW50MTZfdCB2ID0gbV93Q29kZVBhZ2U7Ci0gIG1fd0NvZGVQYWdlID0gd0NvZGVQYWdlOwotICByZXR1cm4gdjsKLX0KLQotaW50MzJfdCBDRkdBU19UZXh0U3RyZWFtOjpSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1heExlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiRU9TKSB7Ci0gIEFTU0VSVChwU3RyICYmIGlNYXhMZW5ndGggPiAwKTsKLSAgaWYgKCFtX3BTdHJlYW1JbXApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaW50MzJfdCBpTGVuOwotICBpZiAobV93Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGMTZMRSB8fAotICAgICAgbV93Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGMTZCRSkgewotICAgIGludDMyX3QgaUJ5dGVzID0gaU1heExlbmd0aCAqIDI7Ci0gICAgaUxlbiA9IG1fcFN0cmVhbUltcC0+UmVhZERhdGEoKHVpbnQ4X3QqKXBTdHIsIGlCeXRlcyk7Ci0gICAgaU1heExlbmd0aCA9IGlMZW4gLyAyOwotICAgIGlmIChzaXplb2YoRlhfV0NIQVIpID4gMikgewotICAgICAgRlhfVVRGMTZUb1dDaGFyKHBTdHIsIGlNYXhMZW5ndGgpOwotICAgIH0KLSNpZiBfRlhfRU5ESUFOXyA9PSBfRlhfQklHX0VORElBTl8KLSAgICBpZiAobV93Q29kZVBhZ2UgPT0gRlhfQ09ERVBBR0VfVVRGMTZMRSkgewotICAgICAgRlhfU3dhcEJ5dGVPcmRlcihwU3RyLCBpTWF4TGVuZ3RoKTsKLSAgICB9Ci0jZWxzZQotICAgIGlmIChtX3dDb2RlUGFnZSA9PSBGWF9DT0RFUEFHRV9VVEYxNkJFKSB7Ci0gICAgICBGWF9Td2FwQnl0ZU9yZGVyKHBTdHIsIGlNYXhMZW5ndGgpOwotICAgIH0KLSNlbmRpZgotICB9IGVsc2UgewotICAgIGludDMyX3QgcG9zID0gbV9wU3RyZWFtSW1wLT5HZXRQb3NpdGlvbigpOwotICAgIGludDMyX3QgaUJ5dGVzID0gaU1heExlbmd0aDsKLSAgICBpQnl0ZXMgPSBzdGQ6Om1pbihpQnl0ZXMsIG1fcFN0cmVhbUltcC0+R2V0TGVuZ3RoKCkgLSBwb3MpOwotICAgIGlmIChpQnl0ZXMgPiAwKSB7Ci0gICAgICBpZiAoIW1fcEJ1ZikgewotICAgICAgICBtX3BCdWYgPSBGWF9BbGxvYyh1aW50OF90LCBpQnl0ZXMpOwotICAgICAgICBtX2lCdWZTaXplID0gaUJ5dGVzOwotICAgICAgfSBlbHNlIGlmIChpQnl0ZXMgPiBtX2lCdWZTaXplKSB7Ci0gICAgICAgIG1fcEJ1ZiA9IEZYX1JlYWxsb2ModWludDhfdCwgbV9wQnVmLCBpQnl0ZXMpOwotICAgICAgICBtX2lCdWZTaXplID0gaUJ5dGVzOwotICAgICAgfQotICAgICAgaUxlbiA9IG1fcFN0cmVhbUltcC0+UmVhZERhdGEobV9wQnVmLCBpQnl0ZXMpOwotICAgICAgaW50MzJfdCBpU3JjID0gaUxlbjsKLSAgICAgIGludDMyX3QgaURlY29kZSA9IEZYX0RlY29kZVN0cmluZyhtX3dDb2RlUGFnZSwgKGNvbnN0IEZYX0NIQVIqKW1fcEJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaVNyYywgcFN0ciwgJmlNYXhMZW5ndGgsIHRydWUpOwotICAgICAgbV9wU3RyZWFtSW1wLT5TZWVrKEZYX1NUUkVBTVNFRUtfQ3VycmVudCwgaVNyYyAtIGlMZW4pOwotICAgICAgaWYgKGlEZWNvZGUgPCAxKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaU1heExlbmd0aCA9IDA7Ci0gICAgfQotICB9Ci0gIGJFT1MgPSBtX3BTdHJlYW1JbXAtPklzRU9GKCk7Ci0gIHJldHVybiBpTWF4TGVuZ3RoOwotfQotCi1pbnQzMl90IENGR0FTX1RleHRTdHJlYW06OldyaXRlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpIHsKLSAgQVNTRVJUKHBTdHIgJiYgaUxlbmd0aCA+IDApOwotICBpZiAoKG1fcFN0cmVhbUltcC0+R2V0QWNjZXNzTW9kZXMoKSAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgPT0gMCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgaWYgKG1fd0NvZGVQYWdlID09IEZYX0NPREVQQUdFX1VURjgpIHsKLSAgICBpbnQzMl90IGxlbiA9IGlMZW5ndGg7Ci0gICAgQ0ZYX1VURjhFbmNvZGVyIGVuY29kZXI7Ci0gICAgd2hpbGUgKGxlbi0tID4gMCkgewotICAgICAgZW5jb2Rlci5JbnB1dCgqcFN0cisrKTsKLSAgICB9Ci0gICAgQ0ZYX0J5dGVTdHJpbmdDIGJzUmVzdWx0ID0gZW5jb2Rlci5HZXRSZXN1bHQoKTsKLSAgICBtX3BTdHJlYW1JbXAtPldyaXRlRGF0YSgoY29uc3QgdWludDhfdCopYnNSZXN1bHQuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBic1Jlc3VsdC5HZXRMZW5ndGgoKSk7Ci0gIH0KLSAgcmV0dXJuIGlMZW5ndGg7Ci19Ci0KLUNGR0FTX1N0cmVhbTo6Q0ZHQVNfU3RyZWFtKCkKLSAgICA6IG1fZVN0cmVhbVR5cGUoRlhfU1JFQU1UWVBFX1Vua25vd24pLAotICAgICAgbV9wU3RyZWFtSW1wKG51bGxwdHIpLAotICAgICAgbV9kd0FjY2VzcygwKSwKLSAgICAgIG1faVRvdGFsU2l6ZSgwKSwKLSAgICAgIG1faVBvc2l0aW9uKDApLAotICAgICAgbV9pU3RhcnQoMCksCi0gICAgICBtX2lMZW5ndGgoMCksCi0gICAgICBtX2lSZWZDb3VudCgxKSB7fQotCi1DRkdBU19TdHJlYW06On5DRkdBU19TdHJlYW0oKSB7Ci0gIGlmIChtX2VTdHJlYW1UeXBlICE9IEZYX1NUUkVBTVRZUEVfU3RyZWFtKQotICAgIGRlbGV0ZSBtX3BTdHJlYW1JbXA7Ci19Ci0KLWJvb2wgQ0ZHQVNfU3RyZWFtOjpMb2FkRmlsZShjb25zdCBGWF9XQ0hBUiogcHN6U3JjRmlsZU5hbWUsIHVpbnQzMl90IGR3QWNjZXNzKSB7Ci0gIGlmIChtX2VTdHJlYW1UeXBlICE9IEZYX1NSRUFNVFlQRV9Vbmtub3duIHx8IG1fcFN0cmVhbUltcCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFwc3pTcmNGaWxlTmFtZSB8fCBGWFNZU193Y3NsZW4ocHN6U3JjRmlsZU5hbWUpIDwgMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGR0FTX0ZpbGVTdHJlYW1JbXA+IHBJbXAobmV3IENGR0FTX0ZpbGVTdHJlYW1JbXAoKSk7Ci0gIGlmICghcEltcC0+TG9hZEZpbGUocHN6U3JjRmlsZU5hbWUsIGR3QWNjZXNzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbV9wU3RyZWFtSW1wID0gcEltcC5yZWxlYXNlKCk7Ci0gIG1fZVN0cmVhbVR5cGUgPSBGWF9TVFJFQU1UWVBFX0ZpbGU7Ci0gIG1fZHdBY2Nlc3MgPSBkd0FjY2VzczsKLSAgbV9pTGVuZ3RoID0gbV9wU3RyZWFtSW1wLT5HZXRMZW5ndGgoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0ZHQVNfU3RyZWFtOjpMb2FkRmlsZVJlYWQoCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZpbGVSZWFkLAotICAgIHVpbnQzMl90IGR3QWNjZXNzKSB7Ci0gIGlmIChtX2VTdHJlYW1UeXBlICE9IEZYX1NSRUFNVFlQRV9Vbmtub3duIHx8IG1fcFN0cmVhbUltcCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFwRmlsZVJlYWQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRkdBU19GaWxlUmVhZFN0cmVhbUltcD4gcEltcChuZXcgQ0ZHQVNfRmlsZVJlYWRTdHJlYW1JbXAoKSk7Ci0gIGlmICghcEltcC0+TG9hZEZpbGVSZWFkKHBGaWxlUmVhZCwgZHdBY2Nlc3MpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBtX3BTdHJlYW1JbXAgPSBwSW1wLnJlbGVhc2UoKTsKLSAgbV9lU3RyZWFtVHlwZSA9IEZYX1NUUkVBTVRZUEVfRmlsZTsKLSAgbV9kd0FjY2VzcyA9IGR3QWNjZXNzOwotICBtX2lMZW5ndGggPSBtX3BTdHJlYW1JbXAtPkdldExlbmd0aCgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDRkdBU19TdHJlYW06OkxvYWRGaWxlV3JpdGUoCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVXcml0ZVN0cmVhbT4mIHBGaWxlV3JpdGUsCi0gICAgdWludDMyX3QgZHdBY2Nlc3MpIHsKLSAgaWYgKG1fZVN0cmVhbVR5cGUgIT0gRlhfU1JFQU1UWVBFX1Vua25vd24gfHwgbV9wU3RyZWFtSW1wKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoIXBGaWxlV3JpdGUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGF1dG8gcEltcCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRkdBU19GaWxlV3JpdGVTdHJlYW1JbXA+KCk7Ci0gIGlmICghcEltcC0+TG9hZEZpbGVXcml0ZShwRmlsZVdyaXRlLCBkd0FjY2VzcykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG1fcFN0cmVhbUltcCA9IHBJbXAucmVsZWFzZSgpOwotICBtX2VTdHJlYW1UeXBlID0gRlhfU1RSRUFNVFlQRV9GaWxlOwotICBtX2R3QWNjZXNzID0gZHdBY2Nlc3M7Ci0gIG1faUxlbmd0aCA9IG1fcFN0cmVhbUltcC0+R2V0TGVuZ3RoKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENGR0FTX1N0cmVhbTo6TG9hZEJ1ZmZlcih1aW50OF90KiBwRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVRvdGFsU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3QWNjZXNzKSB7Ci0gIGlmIChtX2VTdHJlYW1UeXBlICE9IEZYX1NSRUFNVFlQRV9Vbmtub3duIHx8IG1fcFN0cmVhbUltcCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFwRGF0YSB8fCBpVG90YWxTaXplIDwgMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGR0FTX0J1ZmZlclN0cmVhbUltcD4gcEltcChuZXcgQ0ZHQVNfQnVmZmVyU3RyZWFtSW1wKCkpOwotICBpZiAoIXBJbXAtPkxvYWRCdWZmZXIocERhdGEsIGlUb3RhbFNpemUsIGR3QWNjZXNzKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbV9wU3RyZWFtSW1wID0gcEltcC5yZWxlYXNlKCk7Ci0gIG1fZVN0cmVhbVR5cGUgPSBGWF9TVFJFQU1UWVBFX0J1ZmZlcjsKLSAgbV9kd0FjY2VzcyA9IGR3QWNjZXNzOwotICBtX2lMZW5ndGggPSBtX3BTdHJlYW1JbXAtPkdldExlbmd0aCgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDRkdBU19TdHJlYW06OkxvYWRCdWZmZXJSZWFkKAotICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX0J1ZmZlcmVkUmVhZFN0cmVhbT4mIHBCdWZmZXJSZWFkLAotICAgIGludDMyX3QgaUZpbGVTaXplLAotICAgIHVpbnQzMl90IGR3QWNjZXNzKSB7Ci0gIGlmIChtX2VTdHJlYW1UeXBlICE9IEZYX1NSRUFNVFlQRV9Vbmtub3duIHx8IG1fcFN0cmVhbUltcCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFwQnVmZmVyUmVhZCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYXV0byBwSW1wID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGR0FTX0J1ZmZlclJlYWRTdHJlYW1JbXA+KCk7Ci0gIGlmICghcEltcC0+TG9hZEJ1ZmZlclJlYWQocEJ1ZmZlclJlYWQsIGlGaWxlU2l6ZSwgZHdBY2Nlc3MpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBtX3BTdHJlYW1JbXAgPSBwSW1wLnJlbGVhc2UoKTsKLSAgbV9lU3RyZWFtVHlwZSA9IEZYX1NUUkVBTVRZUEVfQnVmZmVyUmVhZDsKLSAgbV9kd0FjY2VzcyA9IGR3QWNjZXNzOwotICBtX2lMZW5ndGggPSBtX3BTdHJlYW1JbXAtPkdldExlbmd0aCgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdWludDMyX3QgQ0ZHQVNfU3RyZWFtOjpHZXRBY2Nlc3NNb2RlcygpIGNvbnN0IHsKLSAgcmV0dXJuIG1fZHdBY2Nlc3M7Ci19Ci0KLWludDMyX3QgQ0ZHQVNfU3RyZWFtOjpHZXRMZW5ndGgoKSBjb25zdCB7Ci0gIGlmICghbV9wU3RyZWFtSW1wKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChtX2VTdHJlYW1UeXBlID09IEZYX1NUUkVBTVRZUEVfRmlsZSB8fAotICAgICAgbV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX0J1ZmZlcikgewotICAgIHJldHVybiBtX3BTdHJlYW1JbXAtPkdldExlbmd0aCgpOwotICB9Ci0gIHJldHVybiBtX2lMZW5ndGg7Ci19Ci1pbnQzMl90IENGR0FTX1N0cmVhbTo6U2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpIHsKLSAgaWYgKCFtX3BTdHJlYW1JbXApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKG1fZVN0cmVhbVR5cGUgPT0gRlhfU1RSRUFNVFlQRV9GaWxlIHx8Ci0gICAgICBtX2VTdHJlYW1UeXBlID09IEZYX1NUUkVBTVRZUEVfQnVmZmVyKSB7Ci0gICAgcmV0dXJuIG1faVBvc2l0aW9uID0gbV9wU3RyZWFtSW1wLT5TZWVrKGVTZWVrLCBpT2Zmc2V0KTsKLSAgfQotICBpbnQzMl90IGlFbmQgPSBtX2lTdGFydCArIG1faUxlbmd0aDsKLSAgaW50MzJfdCBpUG9zaXRpb24gPSBtX2lTdGFydCArIGlPZmZzZXQ7Ci0gIGlmIChlU2VlayA9PSBGWF9TVFJFQU1TRUVLX0JlZ2luKSB7Ci0gICAgbV9pUG9zaXRpb24gPSBpUG9zaXRpb247Ci0gIH0gZWxzZSBpZiAoZVNlZWsgPT0gRlhfU1RSRUFNU0VFS19DdXJyZW50KSB7Ci0gICAgbV9pUG9zaXRpb24gKz0gaU9mZnNldDsKLSAgfSBlbHNlIGlmIChlU2VlayA9PSBGWF9TVFJFQU1TRUVLX0VuZCkgewotICAgIG1faVBvc2l0aW9uID0gaUVuZCArIGlPZmZzZXQ7Ci0gIH0KLSAgaWYgKG1faVBvc2l0aW9uID4gaUVuZCkgewotICAgIG1faVBvc2l0aW9uID0gaUVuZDsKLSAgfQotICBpZiAobV9pUG9zaXRpb24gPCBtX2lTdGFydCkgewotICAgIG1faVBvc2l0aW9uID0gbV9pU3RhcnQ7Ci0gIH0KLSAgcmV0dXJuIG1faVBvc2l0aW9uIC0gbV9pU3RhcnQ7Ci19Ci1pbnQzMl90IENGR0FTX1N0cmVhbTo6R2V0UG9zaXRpb24oKSB7Ci0gIGlmICghbV9wU3RyZWFtSW1wKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChtX2VTdHJlYW1UeXBlID09IEZYX1NUUkVBTVRZUEVfRmlsZSB8fAotICAgICAgbV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX0J1ZmZlcikgewotICAgIHJldHVybiBtX2lQb3NpdGlvbiA9IG1fcFN0cmVhbUltcC0+R2V0UG9zaXRpb24oKTsKLSAgfQotICByZXR1cm4gbV9pUG9zaXRpb24gLSBtX2lTdGFydDsKLX0KLWJvb2wgQ0ZHQVNfU3RyZWFtOjpJc0VPRigpIGNvbnN0IHsKLSAgaWYgKCFtX3BTdHJlYW1JbXApIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAobV9lU3RyZWFtVHlwZSA9PSBGWF9TVFJFQU1UWVBFX0ZpbGUgfHwKLSAgICAgIG1fZVN0cmVhbVR5cGUgPT0gRlhfU1RSRUFNVFlQRV9CdWZmZXIpIHsKLSAgICByZXR1cm4gbV9wU3RyZWFtSW1wLT5Jc0VPRigpOwotICB9Ci0gIHJldHVybiBtX2lQb3NpdGlvbiA+PSBtX2lTdGFydCArIG1faUxlbmd0aDsKLX0KLWludDMyX3QgQ0ZHQVNfU3RyZWFtOjpSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSB7Ci0gIEFTU0VSVChwQnVmZmVyICYmIGlCdWZmZXJTaXplID4gMCk7Ci0gIGlmICghbV9wU3RyZWFtSW1wKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGludDMyX3QgaUxlbiA9IHN0ZDo6bWluKG1faVN0YXJ0ICsgbV9pTGVuZ3RoIC0gbV9pUG9zaXRpb24sIGlCdWZmZXJTaXplKTsKLSAgaWYgKGlMZW4gPD0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIGlmIChtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCkgIT0gbV9pUG9zaXRpb24pIHsKLSAgICBtX3BTdHJlYW1JbXAtPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgbV9pUG9zaXRpb24pOwotICB9Ci0gIGlMZW4gPSBtX3BTdHJlYW1JbXAtPlJlYWREYXRhKHBCdWZmZXIsIGlMZW4pOwotICBtX2lQb3NpdGlvbiA9IG1fcFN0cmVhbUltcC0+R2V0UG9zaXRpb24oKTsKLSAgcmV0dXJuIGlMZW47Ci19Ci1pbnQzMl90IENGR0FTX1N0cmVhbTo6UmVhZFN0cmluZyhGWF9XQ0hBUiogcFN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1heExlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJFT1MpIHsKLSAgQVNTRVJUKHBTdHIgJiYgaU1heExlbmd0aCA+IDApOwotICBpZiAoIW1fcFN0cmVhbUltcCkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBpbnQzMl90IGlFbmQgPSBtX2lTdGFydCArIG1faUxlbmd0aDsKLSAgaW50MzJfdCBpTGVuID0gaUVuZCAtIG1faVBvc2l0aW9uOwotICBpTGVuID0gc3RkOjptaW4oaUVuZCAvIDIsIGlNYXhMZW5ndGgpOwotICBpZiAoaUxlbiA8PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKG1fcFN0cmVhbUltcC0+R2V0UG9zaXRpb24oKSAhPSBtX2lQb3NpdGlvbikgewotICAgIG1fcFN0cmVhbUltcC0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCBtX2lQb3NpdGlvbik7Ci0gIH0KLSAgaUxlbiA9IG1fcFN0cmVhbUltcC0+UmVhZFN0cmluZyhwU3RyLCBpTGVuLCBiRU9TKTsKLSAgbV9pUG9zaXRpb24gPSBtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCk7Ci0gIGlmIChpTGVuID4gMCAmJiBtX2lQb3NpdGlvbiA+PSBpRW5kKSB7Ci0gICAgYkVPUyA9IHRydWU7Ci0gIH0KLSAgcmV0dXJuIGlMZW47Ci19Ci0KLWludDMyX3QgQ0ZHQVNfU3RyZWFtOjpXcml0ZURhdGEoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkgewotICBBU1NFUlQocEJ1ZmZlciAmJiBpQnVmZmVyU2l6ZSA+IDApOwotICBpZiAoIW1fcFN0cmVhbUltcCkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAoKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpID09IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaW50MzJfdCBpTGVuID0gaUJ1ZmZlclNpemU7Ci0gIGlmIChtX2VTdHJlYW1UeXBlID09IEZYX1NUUkVBTVRZUEVfU3RyZWFtKSB7Ci0gICAgaUxlbiA9IHN0ZDo6bWluKG1faVN0YXJ0ICsgbV9pVG90YWxTaXplIC0gbV9pUG9zaXRpb24sIGlCdWZmZXJTaXplKTsKLSAgICBpZiAoaUxlbiA8PSAwKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLSAgaW50MzJfdCBpRW5kID0gbV9pU3RhcnQgKyBtX2lMZW5ndGg7Ci0gIGlmIChtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCkgIT0gbV9pUG9zaXRpb24pIHsKLSAgICBtX3BTdHJlYW1JbXAtPlNlZWsoRlhfU1RSRUFNU0VFS19CZWdpbiwgbV9pUG9zaXRpb24pOwotICB9Ci0gIGlMZW4gPSBtX3BTdHJlYW1JbXAtPldyaXRlRGF0YShwQnVmZmVyLCBpTGVuKTsKLSAgbV9pUG9zaXRpb24gPSBtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCk7Ci0gIGlmIChtX2lQb3NpdGlvbiA+IGlFbmQpIHsKLSAgICBtX2lMZW5ndGggPSBtX2lQb3NpdGlvbiAtIG1faVN0YXJ0OwotICB9Ci0gIHJldHVybiBpTGVuOwotfQotaW50MzJfdCBDRkdBU19TdHJlYW06OldyaXRlU3RyaW5nKGNvbnN0IEZYX1dDSEFSKiBwU3RyLCBpbnQzMl90IGlMZW5ndGgpIHsKLSAgQVNTRVJUKHBTdHIgJiYgaUxlbmd0aCA+IDApOwotICBpZiAoIW1fcFN0cmVhbUltcCkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAoKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpID09IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaW50MzJfdCBpTGVuID0gaUxlbmd0aDsKLSAgaWYgKG1fZVN0cmVhbVR5cGUgPT0gRlhfU1RSRUFNVFlQRV9TdHJlYW0pIHsKLSAgICBpTGVuID0gc3RkOjptaW4oKG1faVN0YXJ0ICsgbV9pVG90YWxTaXplIC0gbV9pUG9zaXRpb24pIC8gMiwgaUxlbmd0aCk7Ci0gICAgaWYgKGlMZW4gPD0gMCkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0gIGludDMyX3QgaUVuZCA9IG1faVN0YXJ0ICsgbV9pTGVuZ3RoOwotICBpZiAobV9wU3RyZWFtSW1wLT5HZXRQb3NpdGlvbigpICE9IG1faVBvc2l0aW9uKSB7Ci0gICAgbV9wU3RyZWFtSW1wLT5TZWVrKEZYX1NUUkVBTVNFRUtfQmVnaW4sIG1faVBvc2l0aW9uKTsKLSAgfQotICBpTGVuID0gbV9wU3RyZWFtSW1wLT5Xcml0ZVN0cmluZyhwU3RyLCBpTGVuKTsKLSAgbV9pUG9zaXRpb24gPSBtX3BTdHJlYW1JbXAtPkdldFBvc2l0aW9uKCk7Ci0gIGlmIChtX2lQb3NpdGlvbiA+IGlFbmQpIHsKLSAgICBtX2lMZW5ndGggPSBtX2lQb3NpdGlvbiAtIG1faVN0YXJ0OwotICB9Ci0gIHJldHVybiBpTGVuOwotfQotdm9pZCBDRkdBU19TdHJlYW06OkZsdXNoKCkgewotICBpZiAoIW1fcFN0cmVhbUltcCkgewotICAgIHJldHVybjsKLSAgfQotICBpZiAoKG1fZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgbV9wU3RyZWFtSW1wLT5GbHVzaCgpOwotfQotYm9vbCBDRkdBU19TdHJlYW06OlNldExlbmd0aChpbnQzMl90IGlMZW5ndGgpIHsKLSAgaWYgKCFtX3BTdHJlYW1JbXApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKChtX2R3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSA9PSAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBtX3BTdHJlYW1JbXAtPlNldExlbmd0aChpTGVuZ3RoKTsKLX0KLWludDMyX3QgQ0ZHQVNfU3RyZWFtOjpHZXRCT00odWludDhfdCBib21bNF0pIGNvbnN0IHsKLSAgaWYgKCFtX3BTdHJlYW1JbXApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci11aW50MTZfdCBDRkdBU19TdHJlYW06OkdldENvZGVQYWdlKCkgY29uc3QgewotI2lmIF9GWF9FTkRJQU5fID09IF9GWF9MSVRUTEVfRU5ESUFOXwotICByZXR1cm4gRlhfQ09ERVBBR0VfVVRGMTZMRTsKLSNlbHNlCi0gIHJldHVybiBGWF9DT0RFUEFHRV9VVEYxNkJFOwotI2VuZGlmCi19Ci11aW50MTZfdCBDRkdBU19TdHJlYW06OlNldENvZGVQYWdlKHVpbnQxNl90IHdDb2RlUGFnZSkgewotI2lmIF9GWF9FTkRJQU5fID09IF9GWF9MSVRUTEVfRU5ESUFOXwotICByZXR1cm4gRlhfQ09ERVBBR0VfVVRGMTZMRTsKLSNlbHNlCi0gIHJldHVybiBGWF9DT0RFUEFHRV9VVEYxNkJFOwotI2VuZGlmCi19Ci0KLUNGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiBDRkdBU19TdHJlYW06OkNyZWF0ZVNoYXJlZFN0cmVhbSh1aW50MzJfdCBkd0FjY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoKSB7Ci0gIEFTU0VSVChpTGVuZ3RoID4gMCk7Ci0gIGlmICghbV9wU3RyZWFtSW1wKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIGlmICgobV9kd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19UZXh0KSAhPSAwICYmCi0gICAgICAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfVGV4dCkgPT0gMCkgewotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIGlmICgobV9kd0FjY2VzcyAmIEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSkgPT0gMCAmJgotICAgICAgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1dyaXRlKSAhPSAwKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgaW50MzJfdCBpU3RhcnQgPSBtX2lTdGFydCArIGlPZmZzZXQ7Ci0gIGludDMyX3QgaVRvdGFsID0gbV9pU3RhcnQgKyBtX2lMZW5ndGg7Ci0gIGlmIChpU3RhcnQgPCBtX2lTdGFydCB8fCBpU3RhcnQgPj0gaVRvdGFsKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIGludDMyX3QgaUVuZCA9IGlTdGFydCArIGlMZW5ndGg7Ci0gIGlmIChpRW5kIDwgaVN0YXJ0IHx8IGlFbmQgPiBpVG90YWwpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgYXV0byBwU2hhcmVkID0gcGRmaXVtOjpNYWtlUmV0YWluPENGR0FTX1N0cmVhbT4oKTsKLSAgcFNoYXJlZC0+bV9lU3RyZWFtVHlwZSA9IEZYX1NUUkVBTVRZUEVfU3RyZWFtOwotICBwU2hhcmVkLT5tX3BTdHJlYW1JbXAgPSBtX3BTdHJlYW1JbXA7Ci0gIHBTaGFyZWQtPm1fZHdBY2Nlc3MgPSBkd0FjY2VzczsKLSAgcFNoYXJlZC0+bV9pVG90YWxTaXplID0gaUxlbmd0aDsKLSAgcFNoYXJlZC0+bV9pUG9zaXRpb24gPSBpU3RhcnQ7Ci0gIHBTaGFyZWQtPm1faVN0YXJ0ID0gaVN0YXJ0OwotICBwU2hhcmVkLT5tX2lMZW5ndGggPSAoZHdBY2Nlc3MgJiBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUpICE9IDAgPyAwIDogaUxlbmd0aDsKLSAgaWYgKGR3QWNjZXNzICYgRlhfU1RSRUFNQUNDRVNTX1RleHQpCi0gICAgcmV0dXJuIElGR0FTX1N0cmVhbTo6Q3JlYXRlVGV4dFN0cmVhbShwU2hhcmVkKTsKLQotICByZXR1cm4gcFNoYXJlZDsKLX0KLQotQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBJRkdBU19TdHJlYW06Ok1ha2VTZWVrYWJsZVJlYWRTdHJlYW0oKSB7Ci0gIHJldHVybiBDRkdBU19GaWxlUmVhZDo6Q3JlYXRlKENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPih0aGlzKSk7Ci19Ci0KLUNGWF9SZXRhaW5QdHI8Q0ZHQVNfRmlsZVJlYWQ+IENGR0FTX0ZpbGVSZWFkOjpDcmVhdGUoCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+JiBwU3RyZWFtKSB7Ci0gIHJldHVybiBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZHQVNfRmlsZVJlYWQ+KHBTdHJlYW0pOwotfQotCi1DRkdBU19GaWxlUmVhZDo6Q0ZHQVNfRmlsZVJlYWQoY29uc3QgQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+JiBwU3RyZWFtKQotICAgIDogbV9wU3RyZWFtKHBTdHJlYW0pIHsKLSAgQVNTRVJUKG1fcFN0cmVhbSk7Ci19Ci0KLUNGR0FTX0ZpbGVSZWFkOjp+Q0ZHQVNfRmlsZVJlYWQoKSB7fQotCi1GWF9GSUxFU0laRSBDRkdBU19GaWxlUmVhZDo6R2V0U2l6ZSgpIHsKLSAgcmV0dXJuIChGWF9GSUxFU0laRSltX3BTdHJlYW0tPkdldExlbmd0aCgpOwotfQotCi1ib29sIENGR0FTX0ZpbGVSZWFkOjpSZWFkQmxvY2sodm9pZCogYnVmZmVyLCBGWF9GSUxFU0laRSBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gIG1fcFN0cmVhbS0+U2VlayhGWF9TVFJFQU1TRUVLX0JlZ2luLCAoaW50MzJfdClvZmZzZXQpOwotICBpbnQzMl90IGlMZW4gPSBtX3BTdHJlYW0tPlJlYWREYXRhKCh1aW50OF90KilidWZmZXIsIChpbnQzMl90KXNpemUpOwotICByZXR1cm4gaUxlbiA9PSAoaW50MzJfdClzaXplOwotfQpkaWZmIC0tZ2l0IGEveGZhL2ZnYXMvY3J0L2ZnYXNfc3RyZWFtLmggYi94ZmEvZmdhcy9jcnQvZmdhc19zdHJlYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlmZGE1OC4uMDAwMDAwMAotLS0gYS94ZmEvZmdhcy9jcnQvZmdhc19zdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRkdBU19DUlRfRkdBU19TVFJFQU1fSF8KLSNkZWZpbmUgWEZBX0ZHQVNfQ1JUX0ZHQVNfU1RSRUFNX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJlYW0uaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotCi1lbnVtIEZYX1NUUkVBTUFDQ0VTUyB7Ci0gIEZYX1NUUkVBTUFDQ0VTU19CaW5hcnkgPSAweDAwLAotICBGWF9TVFJFQU1BQ0NFU1NfVGV4dCA9IDB4MDEsCi0gIEZYX1NUUkVBTUFDQ0VTU19SZWFkID0gMHgwMiwKLSAgRlhfU1RSRUFNQUNDRVNTX1dyaXRlID0gMHgwNCwKLSAgRlhfU1RSRUFNQUNDRVNTX1RydW5jYXRlID0gMHgxMCwKLSAgRlhfU1RSRUFNQUNDRVNTX0FwcGVuZCA9IDB4MjAsCi0gIEZYX1NUUkVBTUFDQ0VTU19DcmVhdGUgPSAweDgwLAotfTsKLQotZW51bSBGWF9TVFJFQU1TRUVLIHsKLSAgRlhfU1RSRUFNU0VFS19CZWdpbiA9IDAsCi0gIEZYX1NUUkVBTVNFRUtfQ3VycmVudCwKLSAgRlhfU1RSRUFNU0VFS19FbmQsCi19OwotCi1jbGFzcyBJRkdBU19TdHJlYW0gOiBwdWJsaWMgQ0ZYX1JldGFpbmFibGUgewotIHB1YmxpYzoKLSAgc3RhdGljIENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiBDcmVhdGVTdHJlYW0oCi0gICAgICBjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRmlsZVJlYWQsCi0gICAgICB1aW50MzJfdCBkd0FjY2Vzcyk7Ci0gIHN0YXRpYyBDRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4gQ3JlYXRlU3RyZWFtKAotICAgICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVXcml0ZVN0cmVhbT4mIHBGaWxlV3JpdGUsCi0gICAgICB1aW50MzJfdCBkd0FjY2Vzcyk7Ci0gIHN0YXRpYyBDRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4gQ3JlYXRlU3RyZWFtKHVpbnQ4X3QqIHBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdBY2Nlc3MpOwotICBzdGF0aWMgQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+IENyZWF0ZVRleHRTdHJlYW0oCi0gICAgICBjb25zdCBDRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4mIHBCYXNlU3RyZWFtKTsKLQotICB2aXJ0dWFsIENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiBDcmVhdGVTaGFyZWRTdHJlYW0odWludDMyX3QgZHdBY2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgpID0gMDsKLQotICB2aXJ0dWFsIHVpbnQzMl90IEdldEFjY2Vzc01vZGVzKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIGludDMyX3QgR2V0TGVuZ3RoKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIGludDMyX3QgU2VlayhGWF9TVFJFQU1TRUVLIGVTZWVrLCBpbnQzMl90IGlPZmZzZXQpID0gMDsKLSAgdmlydHVhbCBpbnQzMl90IEdldFBvc2l0aW9uKCkgPSAwOwotICB2aXJ0dWFsIGJvb2wgSXNFT0YoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgaW50MzJfdCBSZWFkRGF0YSh1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSA9IDA7Ci0gIHZpcnR1YWwgaW50MzJfdCBSZWFkU3RyaW5nKEZYX1dDSEFSKiBwU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNYXhMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJFT1MpID0gMDsKLSAgdmlydHVhbCBpbnQzMl90IFdyaXRlRGF0YShjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGlCdWZmZXJTaXplKSA9IDA7Ci0gIHZpcnR1YWwgaW50MzJfdCBXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBGbHVzaCgpID0gMDsKLSAgdmlydHVhbCBib29sIFNldExlbmd0aChpbnQzMl90IGlMZW5ndGgpID0gMDsKLSAgdmlydHVhbCBpbnQzMl90IEdldEJPTSh1aW50OF90IGJvbVs0XSkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHVpbnQxNl90IEdldENvZGVQYWdlKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHVpbnQxNl90IFNldENvZGVQYWdlKHVpbnQxNl90IHdDb2RlUGFnZSkgPSAwOwotCi0gIENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gTWFrZVNlZWthYmxlUmVhZFN0cmVhbSgpOwotfTsKLQotCi0jZW5kaWYgIC8vIFhGQV9GR0FTX0NSVF9GR0FTX1NUUkVBTV9IXwpkaWZmIC0tZ2l0IGEveGZhL2ZnYXMvY3J0L2ZnYXNfdXRpbHMuY3BwIGIveGZhL2ZnYXMvY3J0L2ZnYXNfdXRpbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDkxOThmLi4wMDAwMDAwCi0tLSBhL3hmYS9mZ2FzL2NydC9mZ2FzX3V0aWxzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQwMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZmdhcy9jcnQvZmdhc191dGlscy5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgotCi1jbGFzcyBGWF9CQVNFQVJSQVlEQVRBIHsKLSBwdWJsaWM6Ci0gIEZYX0JBU0VBUlJBWURBVEEoaW50MzJfdCBncm93c2l6ZSwgaW50MzJfdCBibG9ja3NpemUpOwotICB+RlhfQkFTRUFSUkFZREFUQSgpOwotCi0gIGludDMyX3QgaUdyb3dTaXplOwotICBpbnQzMl90IGlCbG9ja1NpemU7Ci0gIGludDMyX3QgaVRvdGFsQ291bnQ7Ci0gIGludDMyX3QgaUJsb2NrQ291bnQ7Ci0gIHVpbnQ4X3QqIHBCdWZmZXI7Ci19OwotCi1GWF9CQVNFQVJSQVlEQVRBOjpGWF9CQVNFQVJSQVlEQVRBKGludDMyX3QgZ3Jvd3NpemUsIGludDMyX3QgYmxvY2tzaXplKQotICAgIDogaUdyb3dTaXplKGdyb3dzaXplKSwKLSAgICAgIGlCbG9ja1NpemUoYmxvY2tzaXplKSwKLSAgICAgIGlUb3RhbENvdW50KDApLAotICAgICAgaUJsb2NrQ291bnQoMCksCi0gICAgICBwQnVmZmVyKG51bGxwdHIpIHt9Ci0KLUZYX0JBU0VBUlJBWURBVEE6On5GWF9CQVNFQVJSQVlEQVRBKCkgewotICBGWF9GcmVlKHBCdWZmZXIpOwotfQotCi1DRlhfQmFzZUFycmF5OjpDRlhfQmFzZUFycmF5KGludDMyX3QgaUdyb3dTaXplLCBpbnQzMl90IGlCbG9ja1NpemUpIHsKLSAgQVNTRVJUKGlHcm93U2l6ZSA+IDAgJiYgaUJsb2NrU2l6ZSA+IDApOwotICBtX3BEYXRhID0gbmV3IEZYX0JBU0VBUlJBWURBVEEoaUdyb3dTaXplLCBpQmxvY2tTaXplKTsKLX0KLUNGWF9CYXNlQXJyYXk6On5DRlhfQmFzZUFycmF5KCkgewotICBSZW1vdmVBbGwoZmFsc2UpOwotICBkZWxldGUgbV9wRGF0YTsKLX0KLWludDMyX3QgQ0ZYX0Jhc2VBcnJheTo6R2V0U2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcERhdGEtPmlCbG9ja0NvdW50OwotfQotaW50MzJfdCBDRlhfQmFzZUFycmF5OjpHZXRCbG9ja1NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BEYXRhLT5pQmxvY2tTaXplOwotfQotdWludDhfdCogQ0ZYX0Jhc2VBcnJheTo6QWRkU3BhY2VUbyhpbnQzMl90IGluZGV4KSB7Ci0gIEFTU0VSVChpbmRleCA+IC0xKTsKLSAgdWludDhfdComIHBCdWZmZXIgPSBtX3BEYXRhLT5wQnVmZmVyOwotICBpbnQzMl90JiBpVG90YWxDb3VudCA9IG1fcERhdGEtPmlUb3RhbENvdW50OwotICBpbnQzMl90IGlCbG9ja1NpemUgPSBtX3BEYXRhLT5pQmxvY2tTaXplOwotICBpZiAoaW5kZXggPj0gaVRvdGFsQ291bnQpIHsKLSAgICBpbnQzMl90IGlHcm93U2l6ZSA9IG1fcERhdGEtPmlHcm93U2l6ZTsKLSAgICBpVG90YWxDb3VudCA9IChpbmRleCAvIGlHcm93U2l6ZSArIDEpICogaUdyb3dTaXplOwotICAgIGludDMyX3QgaU5ld1NpemUgPSBpVG90YWxDb3VudCAqIGlCbG9ja1NpemU7Ci0gICAgaWYgKCFwQnVmZmVyKSB7Ci0gICAgICBwQnVmZmVyID0gRlhfQWxsb2ModWludDhfdCwgaU5ld1NpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwQnVmZmVyID0gRlhfUmVhbGxvYyh1aW50OF90LCBwQnVmZmVyLCBpTmV3U2l6ZSk7Ci0gICAgfQotICB9Ci0gIGludDMyX3QmIGlCbG9ja0NvdW50ID0gbV9wRGF0YS0+aUJsb2NrQ291bnQ7Ci0gIGlmIChpbmRleCA+PSBpQmxvY2tDb3VudCkgewotICAgIGlCbG9ja0NvdW50ID0gaW5kZXggKyAxOwotICB9Ci0gIHJldHVybiBwQnVmZmVyICsgaW5kZXggKiBpQmxvY2tTaXplOwotfQotdWludDhfdCogQ0ZYX0Jhc2VBcnJheTo6R2V0QXQoaW50MzJfdCBpbmRleCkgY29uc3QgewotICBBU1NFUlQoaW5kZXggPiAtMSAmJiBpbmRleCA8IG1fcERhdGEtPmlCbG9ja0NvdW50KTsKLSAgcmV0dXJuIG1fcERhdGEtPnBCdWZmZXIgKyBpbmRleCAqIG1fcERhdGEtPmlCbG9ja1NpemU7Ci19Ci11aW50OF90KiBDRlhfQmFzZUFycmF5OjpHZXRCdWZmZXIoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BEYXRhLT5wQnVmZmVyOwotfQotaW50MzJfdCBDRlhfQmFzZUFycmF5OjpBcHBlbmQoY29uc3QgQ0ZYX0Jhc2VBcnJheSYgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCkgewotICBpbnQzMl90IGlCbG9ja1NpemUgPSBtX3BEYXRhLT5pQmxvY2tTaXplOwotICBBU1NFUlQoaUJsb2NrU2l6ZSA9PSBzcmMubV9wRGF0YS0+aUJsb2NrU2l6ZSk7Ci0gIGludDMyX3QmIGlCbG9ja0NvdW50ID0gbV9wRGF0YS0+aUJsb2NrQ291bnQ7Ci0gIGludDMyX3QgaUFkZGVkID0gc3JjLkdldFNpemUoKTsKLSAgQVNTRVJUKGlTdGFydCA+IC0xICYmIGlTdGFydCA8IGlBZGRlZCk7Ci0gIGlmIChpQ291bnQgPCAwKSB7Ci0gICAgaUNvdW50ID0gaUFkZGVkOwotICB9Ci0gIGlmIChpU3RhcnQgKyBpQ291bnQgPiBpQWRkZWQpIHsKLSAgICBpQ291bnQgPSBpQWRkZWQgLSBpU3RhcnQ7Ci0gIH0KLSAgaWYgKGlDb3VudCA8IDEpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICB1aW50OF90KiBwRHN0ID0gbV9wRGF0YS0+cEJ1ZmZlciArIGlCbG9ja0NvdW50ICogaUJsb2NrU2l6ZTsKLSAgQWRkU3BhY2VUbyhpQmxvY2tDb3VudCArIGlDb3VudCAtIDEpOwotICBGWFNZU19tZW1jcHkocERzdCwgc3JjLm1fcERhdGEtPnBCdWZmZXIgKyBpU3RhcnQgKiBpQmxvY2tTaXplLAotICAgICAgICAgICAgICAgaUNvdW50ICogaUJsb2NrU2l6ZSk7Ci0gIHJldHVybiBpQ291bnQ7Ci19Ci1pbnQzMl90IENGWF9CYXNlQXJyYXk6OkNvcHkoY29uc3QgQ0ZYX0Jhc2VBcnJheSYgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50KSB7Ci0gIGludDMyX3QgaUJsb2NrU2l6ZSA9IG1fcERhdGEtPmlCbG9ja1NpemU7Ci0gIEFTU0VSVChpQmxvY2tTaXplID09IHNyYy5tX3BEYXRhLT5pQmxvY2tTaXplKTsKLSAgaW50MzJfdCBpQ29waWVkID0gc3JjLkdldFNpemUoKTsKLSAgQVNTRVJUKGlTdGFydCA+IC0xICYmIGlTdGFydCA8IGlDb3BpZWQpOwotICBpZiAoaUNvdW50IDwgMCkgewotICAgIGlDb3VudCA9IGlDb3BpZWQ7Ci0gIH0KLSAgaWYgKGlTdGFydCArIGlDb3VudCA+IGlDb3BpZWQpIHsKLSAgICBpQ291bnQgPSBpQ29waWVkIC0gaVN0YXJ0OwotICB9Ci0gIGlmIChpQ291bnQgPCAxKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgUmVtb3ZlQWxsKHRydWUpOwotICBBZGRTcGFjZVRvKGlDb3VudCAtIDEpOwotICBGWFNZU19tZW1jcHkobV9wRGF0YS0+cEJ1ZmZlciwgc3JjLm1fcERhdGEtPnBCdWZmZXIgKyBpU3RhcnQgKiBpQmxvY2tTaXplLAotICAgICAgICAgICAgICAgaUNvdW50ICogaUJsb2NrU2l6ZSk7Ci0gIHJldHVybiBpQ291bnQ7Ci19Ci1pbnQzMl90IENGWF9CYXNlQXJyYXk6OlJlbW92ZUxhc3QoaW50MzJfdCBpQ291bnQpIHsKLSAgaW50MzJfdCYgaUJsb2NrQ291bnQgPSBtX3BEYXRhLT5pQmxvY2tDb3VudDsKLSAgaWYgKGlDb3VudCA8IDAgfHwgaUNvdW50ID4gaUJsb2NrQ291bnQpIHsKLSAgICBpQ291bnQgPSBpQmxvY2tDb3VudDsKLSAgICBpQmxvY2tDb3VudCA9IDA7Ci0gIH0gZWxzZSB7Ci0gICAgaUJsb2NrQ291bnQgLT0gaUNvdW50OwotICB9Ci0gIHJldHVybiBpQ291bnQ7Ci19Ci12b2lkIENGWF9CYXNlQXJyYXk6OlJlbW92ZUFsbChib29sIGJMZWF2ZU1lbW9yeSkgewotICBpZiAoIWJMZWF2ZU1lbW9yeSkgewotICAgIHVpbnQ4X3QqJiBwQnVmZmVyID0gbV9wRGF0YS0+cEJ1ZmZlcjsKLSAgICBpZiAocEJ1ZmZlcikgewotICAgICAgRlhfRnJlZShwQnVmZmVyKTsKLSAgICAgIHBCdWZmZXIgPSBudWxscHRyOwotICAgIH0KLSAgICBtX3BEYXRhLT5pVG90YWxDb3VudCA9IDA7Ci0gIH0KLSAgbV9wRGF0YS0+aUJsb2NrQ291bnQgPSAwOwotfQotCi1DRlhfQmFzZU1hc3NBcnJheUltcDo6Q0ZYX0Jhc2VNYXNzQXJyYXlJbXAoaW50MzJfdCBpQ2h1bmtTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJsb2NrU2l6ZSkKLSAgICA6IG1faUNodW5rU2l6ZShpQ2h1bmtTaXplKSwKLSAgICAgIG1faUJsb2NrU2l6ZShpQmxvY2tTaXplKSwKLSAgICAgIG1faUNodW5rQ291bnQoMCksCi0gICAgICBtX2lCbG9ja0NvdW50KDApLAotICAgICAgbV9wRGF0YShuZXcgQ0ZYX0FycmF5VGVtcGxhdGU8dm9pZCo+KCkpIHsKLSAgQVNTRVJUKG1faUNodW5rU2l6ZSA+IDAgJiYgbV9pQmxvY2tTaXplID4gMCk7Ci0gIG1fcERhdGEtPlNldFNpemUoMTYpOwotfQotQ0ZYX0Jhc2VNYXNzQXJyYXlJbXA6On5DRlhfQmFzZU1hc3NBcnJheUltcCgpIHsKLSAgUmVtb3ZlQWxsKGZhbHNlKTsKLSAgZGVsZXRlIG1fcERhdGE7Ci19Ci11aW50OF90KiBDRlhfQmFzZU1hc3NBcnJheUltcDo6QWRkU3BhY2VUbyhpbnQzMl90IGluZGV4KSB7Ci0gIEFTU0VSVChpbmRleCA+IC0xKTsKLSAgdWludDhfdCogcENodW5rOwotICBpZiAoaW5kZXggPCBtX2lCbG9ja0NvdW50KSB7Ci0gICAgcENodW5rID0gKHVpbnQ4X3QqKW1fcERhdGEtPkdldEF0KGluZGV4IC8gbV9pQ2h1bmtTaXplKTsKLSAgfSBlbHNlIHsKLSAgICBpbnQzMl90IGlNZW1TaXplID0gbV9pQ2h1bmtTaXplICogbV9pQmxvY2tTaXplOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBpZiAoaW5kZXggPCBtX2lDaHVua0NvdW50ICogbV9pQ2h1bmtTaXplKSB7Ci0gICAgICAgIHBDaHVuayA9ICh1aW50OF90KiltX3BEYXRhLT5HZXRBdChpbmRleCAvIG1faUNodW5rU2l6ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcENodW5rID0gRlhfQWxsb2ModWludDhfdCwgaU1lbVNpemUpOwotICAgICAgICBpZiAobV9pQ2h1bmtDb3VudCA8IG1fcERhdGEtPkdldFNpemUoKSkgewotICAgICAgICAgIG1fcERhdGEtPlNldEF0KG1faUNodW5rQ291bnQsIHBDaHVuayk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbV9wRGF0YS0+QWRkKHBDaHVuayk7Ci0gICAgICAgIH0KLSAgICAgICAgbV9pQ2h1bmtDb3VudCsrOwotICAgICAgfQotICAgIH0KLSAgfQotICBBU1NFUlQocENodW5rKTsKLSAgbV9pQmxvY2tDb3VudCA9IGluZGV4ICsgMTsKLSAgcmV0dXJuIHBDaHVuayArIChpbmRleCAlIG1faUNodW5rU2l6ZSkgKiBtX2lCbG9ja1NpemU7Ci19Ci11aW50OF90KiBDRlhfQmFzZU1hc3NBcnJheUltcDo6R2V0QXQoaW50MzJfdCBpbmRleCkgY29uc3QgewotICBBU1NFUlQoaW5kZXggPiAtMSAmJiBpbmRleCA8IG1faUJsb2NrQ291bnQpOwotICB1aW50OF90KiBwQ2h1bmsgPSAodWludDhfdCopbV9wRGF0YS0+R2V0QXQoaW5kZXggLyBtX2lDaHVua1NpemUpOwotICBBU1NFUlQocENodW5rKTsKLSAgcmV0dXJuIHBDaHVuayArIChpbmRleCAlIG1faUNodW5rU2l6ZSkgKiBtX2lCbG9ja1NpemU7Ci19Ci1pbnQzMl90IENGWF9CYXNlTWFzc0FycmF5SW1wOjpBcHBlbmQoY29uc3QgQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAmIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCkgewotICBBU1NFUlQobV9pQmxvY2tTaXplID09IHNyYy5tX2lCbG9ja1NpemUpOwotICBpbnQzMl90IGlBZGRlZCA9IHNyYy5tX2lCbG9ja0NvdW50OwotICBBU1NFUlQoaVN0YXJ0ID4gLTEgJiYgaVN0YXJ0IDwgaUFkZGVkKTsKLSAgaWYgKGlDb3VudCA8IDApIHsKLSAgICBpQ291bnQgPSBpQWRkZWQ7Ci0gIH0KLSAgaWYgKGlTdGFydCArIGlDb3VudCA+IGlBZGRlZCkgewotICAgIGlDb3VudCA9IGlBZGRlZCAtIGlTdGFydDsKLSAgfQotICBpZiAoaUNvdW50IDwgMSkgewotICAgIHJldHVybiBtX2lCbG9ja0NvdW50OwotICB9Ci0gIGludDMyX3QgaUJsb2NrQ291bnQgPSBtX2lCbG9ja0NvdW50OwotICBpbnQzMl90IGlUb3RhbCA9IG1faUJsb2NrQ291bnQgKyBpQ291bnQ7Ci0gIEFkZFNwYWNlVG8oaVRvdGFsIC0gMSk7Ci0gIEFwcGVuZChpQmxvY2tDb3VudCwgc3JjLCBpU3RhcnQsIGlDb3VudCk7Ci0gIHJldHVybiBtX2lCbG9ja0NvdW50OwotfQotaW50MzJfdCBDRlhfQmFzZU1hc3NBcnJheUltcDo6Q29weShjb25zdCBDRlhfQmFzZU1hc3NBcnJheUltcCYgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQpIHsKLSAgQVNTRVJUKG1faUJsb2NrU2l6ZSA9PSBzcmMubV9pQmxvY2tTaXplKTsKLSAgaW50MzJfdCBpQ29waWVkID0gc3JjLm1faUJsb2NrQ291bnQ7Ci0gIEFTU0VSVChpU3RhcnQgPiAtMSk7Ci0gIGlmIChpU3RhcnQgPj0gaUNvcGllZCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIFJlbW92ZUFsbCh0cnVlKTsKLSAgaWYgKGlDb3VudCA8IDApIHsKLSAgICBpQ291bnQgPSBpQ29waWVkOwotICB9Ci0gIGlmIChpU3RhcnQgKyBpQ291bnQgPiBpQ29waWVkKSB7Ci0gICAgaUNvdW50ID0gaUNvcGllZCAtIGlTdGFydDsKLSAgfQotICBpZiAoaUNvdW50IDwgMSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIGlmIChtX2lCbG9ja0NvdW50IDwgaUNvdW50KSB7Ci0gICAgQWRkU3BhY2VUbyhpQ291bnQgLSAxKTsKLSAgfQotICBBcHBlbmQoMCwgc3JjLCBpU3RhcnQsIGlDb3VudCk7Ci0gIHJldHVybiBtX2lCbG9ja0NvdW50OwotfQotCi12b2lkIENGWF9CYXNlTWFzc0FycmF5SW1wOjpBcHBlbmQoaW50MzJfdCBpRHN0U3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAmIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTcmNTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTcmNDb3VudCkgewotICBBU1NFUlQoaURzdFN0YXJ0ID4gLTEpOwotICBBU1NFUlQobV9pQmxvY2tTaXplID09IHNyYy5tX2lCbG9ja1NpemUpOwotICBBU1NFUlQoc3JjLm1faUJsb2NrQ291bnQgPiAwKTsKLSAgQVNTRVJUKG1faUJsb2NrQ291bnQgPj0gaURzdFN0YXJ0ICsgaVNyY0NvdW50KTsKLSAgQVNTRVJUKGlTcmNTdGFydCA+IC0xKTsKLSAgQVNTRVJUKGlTcmNTdGFydCA8IHNyYy5tX2lCbG9ja0NvdW50KTsKLSAgQVNTRVJUKGlTcmNDb3VudCA+IDApOwotICBBU1NFUlQoaVNyY1N0YXJ0ICsgaVNyY0NvdW50IDw9IHNyYy5tX2lCbG9ja0NvdW50KTsKLQotICBpbnQzMl90IGlEc3RDaHVua0luZGV4ID0gaURzdFN0YXJ0IC8gbV9pQ2h1bmtTaXplOwotICBpbnQzMl90IGlTcmNDaHVua0luZGV4ID0gaVNyY1N0YXJ0IC8gc3JjLm1faUNodW5rU2l6ZTsKLSAgdWludDhfdCogcERzdENodW5rID0gKHVpbnQ4X3QqKUdldEF0KGlEc3RTdGFydCk7Ci0gIHVpbnQ4X3QqIHBTcmNDaHVuayA9ICh1aW50OF90KilzcmMuR2V0QXQoaVNyY1N0YXJ0KTsKLSAgaW50MzJfdCBpRHN0Q2h1bmtTaXplID0gbV9pQ2h1bmtTaXplIC0gKGlEc3RTdGFydCAlIG1faUNodW5rU2l6ZSk7Ci0gIGludDMyX3QgaVNyY0NodW5rU2l6ZSA9IHNyYy5tX2lDaHVua1NpemUgLSAoaVNyY1N0YXJ0ICUgc3JjLm1faUNodW5rU2l6ZSk7Ci0gIGludDMyX3QgaUNvcHlTaXplID0KLSAgICAgIHN0ZDo6bWluKGlTcmNDb3VudCwgc3RkOjptaW4oaVNyY0NodW5rU2l6ZSwgaURzdENodW5rU2l6ZSkpOwotICBpbnQzMl90IGlDb3B5Qnl0ZXMgPSBpQ29weVNpemUgKiBtX2lCbG9ja1NpemU7Ci0gIHdoaWxlIChpU3JjQ291bnQgPiAwKSB7Ci0gICAgQVNTRVJUKHBEc3RDaHVuayAmJiBwU3JjQ2h1bmspOwotICAgIEZYU1lTX21lbWNweShwRHN0Q2h1bmssIHBTcmNDaHVuaywgaUNvcHlCeXRlcyk7Ci0gICAgaVNyY0NvdW50IC09IGlDb3B5U2l6ZTsKLSAgICBpU3JjQ2h1bmtTaXplIC09IGlDb3B5U2l6ZTsKLSAgICBpZiAoaVNyY0NodW5rU2l6ZSA8IDEpIHsKLSAgICAgIGlTcmNDaHVua1NpemUgPSBzcmMubV9pQ2h1bmtTaXplOwotICAgICAgaVNyY0NodW5rSW5kZXgrKzsKLSAgICAgIHBTcmNDaHVuayA9ICh1aW50OF90KilzcmMubV9wRGF0YS0+R2V0QXQoaVNyY0NodW5rSW5kZXgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwU3JjQ2h1bmsgKz0gaUNvcHlCeXRlczsKLSAgICB9Ci0gICAgaURzdENodW5rU2l6ZSAtPSBpQ29weVNpemU7Ci0gICAgaWYgKGlEc3RDaHVua1NpemUgPCAxKSB7Ci0gICAgICBpRHN0Q2h1bmtTaXplID0gbV9pQ2h1bmtTaXplOwotICAgICAgaURzdENodW5rSW5kZXgrKzsKLSAgICAgIHBEc3RDaHVuayA9ICh1aW50OF90KiltX3BEYXRhLT5HZXRBdChpRHN0Q2h1bmtJbmRleCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBEc3RDaHVuayArPSBpQ29weUJ5dGVzOwotICAgIH0KLSAgICBpQ29weVNpemUgPSBzdGQ6Om1pbihpU3JjQ291bnQsIHN0ZDo6bWluKGlTcmNDaHVua1NpemUsIGlEc3RDaHVua1NpemUpKTsKLSAgICBpQ29weUJ5dGVzID0gaUNvcHlTaXplICogbV9pQmxvY2tTaXplOwotICB9Ci19Ci1pbnQzMl90IENGWF9CYXNlTWFzc0FycmF5SW1wOjpSZW1vdmVMYXN0KGludDMyX3QgaUNvdW50KSB7Ci0gIGlmIChpQ291bnQgPCAwIHx8IGlDb3VudCA+PSBtX2lCbG9ja0NvdW50KSB7Ci0gICAgbV9pQmxvY2tDb3VudCA9IDA7Ci0gIH0gZWxzZSB7Ci0gICAgbV9pQmxvY2tDb3VudCAtPSBpQ291bnQ7Ci0gIH0KLSAgcmV0dXJuIG1faUJsb2NrQ291bnQ7Ci19Ci12b2lkIENGWF9CYXNlTWFzc0FycmF5SW1wOjpSZW1vdmVBbGwoYm9vbCBiTGVhdmVNZW1vcnkpIHsKLSAgaWYgKGJMZWF2ZU1lbW9yeSkgewotICAgIG1faUJsb2NrQ291bnQgPSAwOwotICAgIHJldHVybjsKLSAgfQotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX2lDaHVua0NvdW50OyBpKyspCi0gICAgRlhfRnJlZShtX3BEYXRhLT5HZXRBdChpKSk7Ci0KLSAgbV9wRGF0YS0+UmVtb3ZlQWxsKCk7Ci0gIG1faUNodW5rQ291bnQgPSAwOwotICBtX2lCbG9ja0NvdW50ID0gMDsKLX0KLQotc3RydWN0IEZYX0JBU0VESVNDUkVURUFSUkFZREFUQSB7Ci0gIGludDMyX3QgaUJsb2NrU2l6ZTsKLSAgaW50MzJfdCBpQ2h1bmtTaXplOwotICBpbnQzMl90IGlDaHVua0NvdW50OwotICBDRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90Kj4gQ2h1bmtCdWZmZXI7Ci19OwotCi1DRlhfQmFzZURpc2NyZXRlQXJyYXk6OkNGWF9CYXNlRGlzY3JldGVBcnJheShpbnQzMl90IGlDaHVua1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCbG9ja1NpemUpIHsKLSAgQVNTRVJUKGlDaHVua1NpemUgPiAwICYmIGlCbG9ja1NpemUgPiAwKTsKLSAgRlhfQkFTRURJU0NSRVRFQVJSQVlEQVRBKiBwRGF0YSA9IG5ldyBGWF9CQVNFRElTQ1JFVEVBUlJBWURBVEE7Ci0gIG1fcERhdGEgPSBwRGF0YTsKLSAgcERhdGEtPkNodW5rQnVmZmVyLlNldFNpemUoMTYpOwotICBwRGF0YS0+aUNodW5rQ291bnQgPSAwOwotICBwRGF0YS0+aUNodW5rU2l6ZSA9IGlDaHVua1NpemU7Ci0gIHBEYXRhLT5pQmxvY2tTaXplID0gaUJsb2NrU2l6ZTsKLX0KLUNGWF9CYXNlRGlzY3JldGVBcnJheTo6fkNGWF9CYXNlRGlzY3JldGVBcnJheSgpIHsKLSAgUmVtb3ZlQWxsKCk7Ci0gIGRlbGV0ZSBzdGF0aWNfY2FzdDxGWF9CQVNFRElTQ1JFVEVBUlJBWURBVEEqPihtX3BEYXRhKTsKLX0KLXVpbnQ4X3QqIENGWF9CYXNlRGlzY3JldGVBcnJheTo6QWRkU3BhY2VUbyhpbnQzMl90IGluZGV4KSB7Ci0gIEFTU0VSVChpbmRleCA+IC0xKTsKLSAgRlhfQkFTRURJU0NSRVRFQVJSQVlEQVRBKiBwRGF0YSA9IChGWF9CQVNFRElTQ1JFVEVBUlJBWURBVEEqKW1fcERhdGE7Ci0gIGludDMyX3QmIGlDaHVua0NvdW50ID0gcERhdGEtPmlDaHVua0NvdW50OwotICBpbnQzMl90IGlDaHVua1NpemUgPSBwRGF0YS0+aUNodW5rU2l6ZTsKLSAgdWludDhfdCogcENodW5rID0gbnVsbHB0cjsKLSAgaW50MzJfdCBpQ2h1bmsgPSBpbmRleCAvIGlDaHVua1NpemU7Ci0gIGlmIChpQ2h1bmsgPCBpQ2h1bmtDb3VudCkgewotICAgIHBDaHVuayA9IHBEYXRhLT5DaHVua0J1ZmZlci5HZXRBdChpQ2h1bmspOwotICB9Ci0gIGlmICghcENodW5rKSB7Ci0gICAgcENodW5rID0gRlhfQWxsb2MyRCh1aW50OF90LCBpQ2h1bmtTaXplLCBwRGF0YS0+aUJsb2NrU2l6ZSk7Ci0gICAgRlhTWVNfbWVtc2V0KHBDaHVuaywgMCwgaUNodW5rU2l6ZSAqIHBEYXRhLT5pQmxvY2tTaXplKTsKLSAgICBwRGF0YS0+Q2h1bmtCdWZmZXIuU2V0QXRHcm93KGlDaHVuaywgcENodW5rKTsKLSAgICBpZiAoaUNodW5rQ291bnQgPD0gaUNodW5rKSB7Ci0gICAgICBpQ2h1bmtDb3VudCA9IGlDaHVuayArIDE7Ci0gICAgfQotICB9Ci0gIHJldHVybiBwQ2h1bmsgKyAoaW5kZXggJSBpQ2h1bmtTaXplKSAqIHBEYXRhLT5pQmxvY2tTaXplOwotfQotdWludDhfdCogQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5OjpHZXRBdChpbnQzMl90IGluZGV4KSBjb25zdCB7Ci0gIEFTU0VSVChpbmRleCA+PSAwKTsKLSAgRlhfQkFTRURJU0NSRVRFQVJSQVlEQVRBKiBwRGF0YSA9IChGWF9CQVNFRElTQ1JFVEVBUlJBWURBVEEqKW1fcERhdGE7Ci0gIGludDMyX3QgaUNodW5rU2l6ZSA9IHBEYXRhLT5pQ2h1bmtTaXplOwotICBpbnQzMl90IGlDaHVuayA9IGluZGV4IC8gaUNodW5rU2l6ZTsKLSAgaWYgKGlDaHVuayA+PSBwRGF0YS0+aUNodW5rQ291bnQpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgdWludDhfdCogcENodW5rID0gcERhdGEtPkNodW5rQnVmZmVyLkdldEF0KGlDaHVuayk7Ci0gIGlmICghcENodW5rKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIHJldHVybiBwQ2h1bmsgKyAoaW5kZXggJSBpQ2h1bmtTaXplKSAqIHBEYXRhLT5pQmxvY2tTaXplOwotfQotdm9pZCBDRlhfQmFzZURpc2NyZXRlQXJyYXk6OlJlbW92ZUFsbCgpIHsKLSAgRlhfQkFTRURJU0NSRVRFQVJSQVlEQVRBKiBwRGF0YSA9IChGWF9CQVNFRElTQ1JFVEVBUlJBWURBVEEqKW1fcERhdGE7Ci0gIENGWF9BcnJheVRlbXBsYXRlPHVpbnQ4X3QqPiYgQ2h1bmtCdWZmZXIgPSBwRGF0YS0+Q2h1bmtCdWZmZXI7Ci0gIGludDMyX3QmIGlDaHVua0NvdW50ID0gcERhdGEtPmlDaHVua0NvdW50OwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ2h1bmtDb3VudDsgaSsrKQotICAgIEZYX0ZyZWUoQ2h1bmtCdWZmZXIuR2V0QXQoaSkpOwotCi0gIENodW5rQnVmZmVyLlJlbW92ZUFsbCgpOwotICBpQ2h1bmtDb3VudCA9IDA7Ci19Ci1DRlhfQmFzZVN0YWNrOjpDRlhfQmFzZVN0YWNrKGludDMyX3QgaUNodW5rU2l6ZSwgaW50MzJfdCBpQmxvY2tTaXplKSB7Ci0gIG1fcERhdGEgPSBuZXcgQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAoaUNodW5rU2l6ZSwgaUJsb2NrU2l6ZSk7Ci19Ci1DRlhfQmFzZVN0YWNrOjp+Q0ZYX0Jhc2VTdGFjaygpIHsKLSAgZGVsZXRlIChDRlhfQmFzZU1hc3NBcnJheUltcCopbV9wRGF0YTsKLX0KLXVpbnQ4X3QqIENGWF9CYXNlU3RhY2s6OlB1c2goKSB7Ci0gIHJldHVybiBtX3BEYXRhLT5BZGRTcGFjZSgpOwotfQotdm9pZCBDRlhfQmFzZVN0YWNrOjpQb3AoKSB7Ci0gIGludDMyX3QmIGlCbG9ja0NvdW50ID0gbV9wRGF0YS0+bV9pQmxvY2tDb3VudDsKLSAgaWYgKGlCbG9ja0NvdW50IDwgMSkgewotICAgIHJldHVybjsKLSAgfQotICBpQmxvY2tDb3VudC0tOwotfQotdWludDhfdCogQ0ZYX0Jhc2VTdGFjazo6R2V0VG9wRWxlbWVudCgpIGNvbnN0IHsKLSAgaW50MzJfdCBpU2l6ZSA9IG1fcERhdGEtPm1faUJsb2NrQ291bnQ7Ci0gIGlmIChpU2l6ZSA8IDEpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICByZXR1cm4gbV9wRGF0YS0+R2V0QXQoaVNpemUgLSAxKTsKLX0KLWludDMyX3QgQ0ZYX0Jhc2VTdGFjazo6R2V0U2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcERhdGEtPm1faUJsb2NrQ291bnQ7Ci19Ci11aW50OF90KiBDRlhfQmFzZVN0YWNrOjpHZXRBdChpbnQzMl90IGluZGV4KSBjb25zdCB7Ci0gIHJldHVybiBtX3BEYXRhLT5HZXRBdChpbmRleCk7Ci19Ci12b2lkIENGWF9CYXNlU3RhY2s6OlJlbW92ZUFsbChib29sIGJMZWF2ZU1lbW9yeSkgewotICBtX3BEYXRhLT5SZW1vdmVBbGwoYkxlYXZlTWVtb3J5KTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9mZ2FzL2NydC9mZ2FzX3V0aWxzLmggYi94ZmEvZmdhcy9jcnQvZmdhc191dGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDU5MjBkLi4wMDAwMDAwCi0tLSBhL3hmYS9mZ2FzL2NydC9mZ2FzX3V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GR0FTX0NSVF9GR0FTX1VUSUxTX0hfCi0jZGVmaW5lIFhGQV9GR0FTX0NSVF9GR0FTX1VUSUxTX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCi0KLWNsYXNzIEZYX0JBU0VBUlJBWURBVEE7Ci0KLWNsYXNzIENGWF9CYXNlQXJyYXkgewotIHByb3RlY3RlZDoKLSAgQ0ZYX0Jhc2VBcnJheShpbnQzMl90IGlHcm93U2l6ZSwgaW50MzJfdCBpQmxvY2tTaXplKTsKLSAgfkNGWF9CYXNlQXJyYXkoKTsKLQotICBpbnQzMl90IEdldFNpemUoKSBjb25zdDsKLSAgaW50MzJfdCBHZXRCbG9ja1NpemUoKSBjb25zdDsKLSAgdWludDhfdCogQWRkU3BhY2VUbyhpbnQzMl90IGluZGV4KTsKLSAgdWludDhfdCogR2V0QXQoaW50MzJfdCBpbmRleCkgY29uc3Q7Ci0gIHVpbnQ4X3QqIEdldEJ1ZmZlcigpIGNvbnN0OwotICBpbnQzMl90IEFwcGVuZChjb25zdCBDRlhfQmFzZUFycmF5JiBzcmMsIGludDMyX3QgaVN0YXJ0LCBpbnQzMl90IGlDb3VudCk7Ci0gIGludDMyX3QgQ29weShjb25zdCBDRlhfQmFzZUFycmF5JiBzcmMsIGludDMyX3QgaVN0YXJ0LCBpbnQzMl90IGlDb3VudCk7Ci0gIGludDMyX3QgUmVtb3ZlTGFzdChpbnQzMl90IGlDb3VudCk7Ci0gIHZvaWQgUmVtb3ZlQWxsKGJvb2wgYkxlYXZlTWVtb3J5KTsKLQotICBGWF9CQVNFQVJSQVlEQVRBKiBtX3BEYXRhOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPgotY2xhc3MgQ0ZYX0Jhc2VBcnJheVRlbXBsYXRlIDogcHVibGljIENGWF9CYXNlQXJyYXkgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0ZYX0Jhc2VBcnJheVRlbXBsYXRlKGludDMyX3QgaUdyb3dTaXplKQotICAgICAgOiBDRlhfQmFzZUFycmF5KGlHcm93U2l6ZSwgc2l6ZW9mKGJhc2VUeXBlKSkge30KLSAgQ0ZYX0Jhc2VBcnJheVRlbXBsYXRlKGludDMyX3QgaUdyb3dTaXplLCBpbnQzMl90IGlCbG9ja1NpemUpCi0gICAgICA6IENGWF9CYXNlQXJyYXkoaUdyb3dTaXplLCBpQmxvY2tTaXplKSB7fQotCi0gIGludDMyX3QgR2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIENGWF9CYXNlQXJyYXk6OkdldFNpemUoKTsgfQotICBpbnQzMl90IEdldEJsb2NrU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIENGWF9CYXNlQXJyYXk6OkdldEJsb2NrU2l6ZSgpOyB9Ci0gIGJhc2VUeXBlKiBBZGRTcGFjZSgpIHsKLSAgICByZXR1cm4gKGJhc2VUeXBlKilDRlhfQmFzZUFycmF5OjpBZGRTcGFjZVRvKENGWF9CYXNlQXJyYXk6OkdldFNpemUoKSk7Ci0gIH0KLSAgaW50MzJfdCBBZGQoY29uc3QgYmFzZVR5cGUmIGVsZW1lbnQpIHsKLSAgICBpbnQzMl90IGluZGV4ID0gQ0ZYX0Jhc2VBcnJheTo6R2V0U2l6ZSgpOwotICAgICooYmFzZVR5cGUqKUNGWF9CYXNlQXJyYXk6OkFkZFNwYWNlVG8oaW5kZXgpID0gZWxlbWVudDsKLSAgICByZXR1cm4gaW5kZXg7Ci0gIH0KLSAgYmFzZVR5cGUqIEdldEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VBcnJheTo6R2V0QnVmZmVyKCk7IH0KLSAgYmFzZVR5cGUmIEdldEF0KGludDMyX3QgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gKihiYXNlVHlwZSopQ0ZYX0Jhc2VBcnJheTo6R2V0QXQoaW5kZXgpOwotICB9Ci0gIGJhc2VUeXBlKiBHZXRQdHJBdChpbnQzMl90IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VBcnJheTo6R2V0QXQoaW5kZXgpOwotICB9Ci0gIHZvaWQgU2V0QXQoaW50MzJfdCBpbmRleCwgY29uc3QgYmFzZVR5cGUmIGVsZW1lbnQpIHsKLSAgICAqKGJhc2VUeXBlKilDRlhfQmFzZUFycmF5OjpHZXRBdChpbmRleCkgPSBlbGVtZW50OwotICB9Ci0gIHZvaWQgU2V0QXRHcm93KGludDMyX3QgaW5kZXgsIGNvbnN0IGJhc2VUeXBlJiBlbGVtZW50KSB7Ci0gICAgKihiYXNlVHlwZSopQ0ZYX0Jhc2VBcnJheTo6QWRkU3BhY2VUbyhpbmRleCkgPSBlbGVtZW50OwotICB9Ci0gIGludDMyX3QgQXBwZW5kKGNvbnN0IENGWF9CYXNlQXJyYXlUZW1wbGF0ZSYgc3JjLAotICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGFydCwKLSAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQpIHsKLSAgICByZXR1cm4gQ0ZYX0Jhc2VBcnJheTo6QXBwZW5kKHNyYywgaVN0YXJ0LCBpQ291bnQpOwotICB9Ci0gIGludDMyX3QgQ29weShjb25zdCBDRlhfQmFzZUFycmF5VGVtcGxhdGUmIHNyYywKLSAgICAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0LAotICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQpIHsKLSAgICByZXR1cm4gQ0ZYX0Jhc2VBcnJheTo6Q29weShzcmMsIGlTdGFydCwgaUNvdW50KTsKLSAgfQotICBpbnQzMl90IFJlbW92ZUxhc3QoaW50MzJfdCBpQ291bnQpIHsKLSAgICByZXR1cm4gQ0ZYX0Jhc2VBcnJheTo6UmVtb3ZlTGFzdChpQ291bnQpOwotICB9Ci0gIHZvaWQgUmVtb3ZlQWxsKGJvb2wgYkxlYXZlTWVtb3J5KSB7IENGWF9CYXNlQXJyYXk6OlJlbW92ZUFsbChiTGVhdmVNZW1vcnkpOyB9Ci19OwotCi1jbGFzcyBDRlhfQmFzZU1hc3NBcnJheUltcCB7Ci0gcHVibGljOgotICBDRlhfQmFzZU1hc3NBcnJheUltcChpbnQzMl90IGlDaHVua1NpemUsIGludDMyX3QgaUJsb2NrU2l6ZSk7Ci0gIH5DRlhfQmFzZU1hc3NBcnJheUltcCgpOwotCi0gIHVpbnQ4X3QqIEFkZFNwYWNlKCkgeyByZXR1cm4gQWRkU3BhY2VUbyhtX2lCbG9ja0NvdW50KTsgfQotICB1aW50OF90KiBBZGRTcGFjZVRvKGludDMyX3QgaW5kZXgpOwotICB1aW50OF90KiBHZXRBdChpbnQzMl90IGluZGV4KSBjb25zdDsKLSAgaW50MzJfdCBBcHBlbmQoY29uc3QgQ0ZYX0Jhc2VNYXNzQXJyYXlJbXAmIHNyYywKLSAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhcnQsCi0gICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50KTsKLSAgaW50MzJfdCBDb3B5KGNvbnN0IENGWF9CYXNlTWFzc0FycmF5SW1wJiBzcmMsIGludDMyX3QgaVN0YXJ0LCBpbnQzMl90IGlDb3VudCk7Ci0gIGludDMyX3QgUmVtb3ZlTGFzdChpbnQzMl90IGlDb3VudCk7Ci0gIHZvaWQgUmVtb3ZlQWxsKGJvb2wgYkxlYXZlTWVtb3J5KTsKLQotICBpbnQzMl90IG1faUNodW5rU2l6ZTsKLSAgaW50MzJfdCBtX2lCbG9ja1NpemU7Ci0gIGludDMyX3QgbV9pQ2h1bmtDb3VudDsKLSAgaW50MzJfdCBtX2lCbG9ja0NvdW50OwotICBDRlhfQXJyYXlUZW1wbGF0ZTx2b2lkKj4qIG1fcERhdGE7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgQXBwZW5kKGludDMyX3QgaURzdFN0YXJ0LAotICAgICAgICAgICAgICBjb25zdCBDRlhfQmFzZU1hc3NBcnJheUltcCYgc3JjLAotICAgICAgICAgICAgICBpbnQzMl90IGlTcmNTdGFydCwKLSAgICAgICAgICAgICAgaW50MzJfdCBpU3JjQ291bnQpOwotfTsKLQotY2xhc3MgQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5IHsKLSBwcm90ZWN0ZWQ6Ci0gIENGWF9CYXNlRGlzY3JldGVBcnJheShpbnQzMl90IGlDaHVua1NpemUsIGludDMyX3QgaUJsb2NrU2l6ZSk7Ci0gIH5DRlhfQmFzZURpc2NyZXRlQXJyYXkoKTsKLQotICB1aW50OF90KiBBZGRTcGFjZVRvKGludDMyX3QgaW5kZXgpOwotICB1aW50OF90KiBHZXRBdChpbnQzMl90IGluZGV4KSBjb25zdDsKLSAgdm9pZCBSZW1vdmVBbGwoKTsKLSAgdm9pZCogbV9wRGF0YTsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBiYXNlVHlwZT4KLWNsYXNzIENGWF9EaXNjcmV0ZUFycmF5VGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENGWF9EaXNjcmV0ZUFycmF5VGVtcGxhdGUoaW50MzJfdCBpQ2h1bmtTaXplKQotICAgICAgOiBDRlhfQmFzZURpc2NyZXRlQXJyYXkoaUNodW5rU2l6ZSwgc2l6ZW9mKGJhc2VUeXBlKSkge30KLQotICBiYXNlVHlwZSYgR2V0QXQoaW50MzJfdCBpbmRleCwgY29uc3QgYmFzZVR5cGUmIGRlZlZhbHVlKSBjb25zdCB7Ci0gICAgYmFzZVR5cGUqIHAgPSAoYmFzZVR5cGUqKUNGWF9CYXNlRGlzY3JldGVBcnJheTo6R2V0QXQoaW5kZXgpOwotICAgIHJldHVybiBwID8gKnAgOiAoYmFzZVR5cGUmKWRlZlZhbHVlOwotICB9Ci0gIGJhc2VUeXBlKiBHZXRQdHJBdChpbnQzMl90IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5OjpHZXRBdChpbmRleCk7Ci0gIH0KLSAgdm9pZCBTZXRBdEdyb3coaW50MzJfdCBpbmRleCwgY29uc3QgYmFzZVR5cGUmIGVsZW1lbnQpIHsKLSAgICAqKGJhc2VUeXBlKilDRlhfQmFzZURpc2NyZXRlQXJyYXk6OkFkZFNwYWNlVG8oaW5kZXgpID0gZWxlbWVudDsKLSAgfQotICB2b2lkIFJlbW92ZUFsbCgpIHsgQ0ZYX0Jhc2VEaXNjcmV0ZUFycmF5OjpSZW1vdmVBbGwoKTsgfQotfTsKLQotY2xhc3MgQ0ZYX0Jhc2VTdGFjayB7Ci0gcHJvdGVjdGVkOgotICBDRlhfQmFzZVN0YWNrKGludDMyX3QgaUNodW5rU2l6ZSwgaW50MzJfdCBpQmxvY2tTaXplKTsKLSAgfkNGWF9CYXNlU3RhY2soKTsKLQotICB1aW50OF90KiBQdXNoKCk7Ci0gIHZvaWQgUG9wKCk7Ci0gIHVpbnQ4X3QqIEdldFRvcEVsZW1lbnQoKSBjb25zdDsKLSAgaW50MzJfdCBHZXRTaXplKCkgY29uc3Q7Ci0gIHVpbnQ4X3QqIEdldEF0KGludDMyX3QgaW5kZXgpIGNvbnN0OwotICB2b2lkIFJlbW92ZUFsbChib29sIGJMZWF2ZU1lbW9yeSk7Ci0gIENGWF9CYXNlTWFzc0FycmF5SW1wKiBtX3BEYXRhOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIGJhc2VUeXBlPgotY2xhc3MgQ0ZYX1N0YWNrVGVtcGxhdGUgOiBwdWJsaWMgQ0ZYX0Jhc2VTdGFjayB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDRlhfU3RhY2tUZW1wbGF0ZShpbnQzMl90IGlDaHVua1NpemUpCi0gICAgICA6IENGWF9CYXNlU3RhY2soaUNodW5rU2l6ZSwgc2l6ZW9mKGJhc2VUeXBlKSkge30KLQotICBpbnQzMl90IFB1c2goY29uc3QgYmFzZVR5cGUmIGVsZW1lbnQpIHsKLSAgICBpbnQzMl90IGluZGV4ID0gQ0ZYX0Jhc2VTdGFjazo6R2V0U2l6ZSgpOwotICAgICooYmFzZVR5cGUqKUNGWF9CYXNlU3RhY2s6OlB1c2goKSA9IGVsZW1lbnQ7Ci0gICAgcmV0dXJuIGluZGV4OwotICB9Ci0gIHZvaWQgUG9wKCkgeyBDRlhfQmFzZVN0YWNrOjpQb3AoKTsgfQotICBiYXNlVHlwZSogR2V0VG9wRWxlbWVudCgpIGNvbnN0IHsKLSAgICByZXR1cm4gKGJhc2VUeXBlKilDRlhfQmFzZVN0YWNrOjpHZXRUb3BFbGVtZW50KCk7Ci0gIH0KLSAgaW50MzJfdCBHZXRTaXplKCkgY29uc3QgeyByZXR1cm4gQ0ZYX0Jhc2VTdGFjazo6R2V0U2l6ZSgpOyB9Ci0gIGJhc2VUeXBlKiBHZXRBdChpbnQzMl90IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIChiYXNlVHlwZSopQ0ZYX0Jhc2VTdGFjazo6R2V0QXQoaW5kZXgpOwotICB9Ci0gIHZvaWQgUmVtb3ZlQWxsKGJvb2wgYkxlYXZlTWVtb3J5KSB7IENGWF9CYXNlU3RhY2s6OlJlbW92ZUFsbChiTGVhdmVNZW1vcnkpOyB9Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GR0FTX0NSVF9GR0FTX1VUSUxTX0hfCmRpZmYgLS1naXQgYS94ZmEvZmdhcy9mb250L0RFUFMgYi94ZmEvZmdhcy9mb250L0RFUFMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MzBkZDAuLjAwMDAwMDAKLS0tIGEveGZhL2ZnYXMvZm9udC9ERVBTCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1pbmNsdWRlX3J1bGVzID0gWwotICAnK3RoaXJkX3BhcnR5L2ZyZWV0eXBlL2luY2x1ZGUnLAotXQpkaWZmIC0tZ2l0IGEveGZhL2ZnYXMvZm9udC9jZmdhc19kZWZhdWx0Zm9udG1hbmFnZXIuY3BwIGIveGZhL2ZnYXMvZm9udC9jZmdhc19kZWZhdWx0Zm9udG1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMGZmMjAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZmdhcy9mb250L2NmZ2FzX2RlZmF1bHRmb250bWFuYWdlci5jcHAKQEAgLTAsMCArMSw3MCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9jZmdhc19kZWZhdWx0Zm9udG1hbmFnZXIuaCIKKworI2luY2x1ZGUgInhmYS9mZ2FzL2ZvbnQvZmdhc19mb250dXRpbHMuaCIKKworQ0ZHQVNfRGVmYXVsdEZvbnRNYW5hZ2VyOjpDRkdBU19EZWZhdWx0Rm9udE1hbmFnZXIoKSB7fQorCitDRkdBU19EZWZhdWx0Rm9udE1hbmFnZXI6On5DRkdBU19EZWZhdWx0Rm9udE1hbmFnZXIoKSB7fQorCitSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBDRkdBU19EZWZhdWx0Rm9udE1hbmFnZXI6OkdldEZvbnQoCisgICAgQ0ZHQVNfRm9udE1nciogcEZvbnRNZ3IsCisgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzRm9udEZhbWlseSwKKyAgICB1aW50MzJfdCBkd0ZvbnRTdHlsZXMpIHsKKyAgV2lkZVN0cmluZyB3c0ZvbnROYW1lKHdzRm9udEZhbWlseSk7CisgIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+IHBGb250ID0KKyAgICAgIHBGb250TWdyLT5Mb2FkRm9udCh3c0ZvbnROYW1lLmNfc3RyKCksIGR3Rm9udFN0eWxlcywgMHhGRkZGKTsKKyAgaWYgKCFwRm9udCkgeworICAgIGNvbnN0IEZHQVNfRm9udEluZm8qIHBDdXJGb250ID0KKyAgICAgICAgRkdBU19Gb250SW5mb0J5Rm9udE5hbWUod3NGb250TmFtZS5Bc1N0cmluZ1ZpZXcoKSk7CisgICAgaWYgKHBDdXJGb250ICYmIHBDdXJGb250LT5wUmVwbGFjZUZvbnQpIHsKKyAgICAgIHVpbnQzMl90IGR3U3R5bGUgPSAwOworICAgICAgLy8gVE9ETyhkc2luY2xhaXIpOiBXaHkgZG9lc24ndCB0aGlzIGNoZWNrIHRoZSBvdGhlciBmbGFncz8KKyAgICAgIGlmIChGb250U3R5bGVJc0JvbGQoZHdGb250U3R5bGVzKSkKKyAgICAgICAgZHdTdHlsZSB8PSBGWEZPTlRfQk9MRDsKKyAgICAgIGlmIChGb250U3R5bGVJc0l0YWxpYyhkd0ZvbnRTdHlsZXMpKQorICAgICAgICBkd1N0eWxlIHw9IEZYRk9OVF9JVEFMSUM7CisKKyAgICAgIGNvbnN0IHdjaGFyX3QqIHBSZXBsYWNlID0gcEN1ckZvbnQtPnBSZXBsYWNlRm9udDsKKyAgICAgIGludDMyX3QgaUxlbmd0aCA9IHdjc2xlbihwUmVwbGFjZSk7CisgICAgICB3aGlsZSAoaUxlbmd0aCA+IDApIHsKKyAgICAgICAgY29uc3Qgd2NoYXJfdCogcE5hbWVUZXh0ID0gcFJlcGxhY2U7CisgICAgICAgIHdoaWxlICgqcE5hbWVUZXh0ICE9IEwnLCcgJiYgaUxlbmd0aCA+IDApIHsKKyAgICAgICAgICBwTmFtZVRleHQrKzsKKyAgICAgICAgICBpTGVuZ3RoLS07CisgICAgICAgIH0KKyAgICAgICAgV2lkZVN0cmluZyB3c1JlcGxhY2UgPSBXaWRlU3RyaW5nKHBSZXBsYWNlLCBwTmFtZVRleHQgLSBwUmVwbGFjZSk7CisgICAgICAgIHBGb250ID0gcEZvbnRNZ3ItPkxvYWRGb250KHdzUmVwbGFjZS5jX3N0cigpLCBkd1N0eWxlLCAweEZGRkYpOworICAgICAgICBpZiAocEZvbnQpCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaUxlbmd0aC0tOworICAgICAgICBwTmFtZVRleHQrKzsKKyAgICAgICAgcFJlcGxhY2UgPSBwTmFtZVRleHQ7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChwRm9udCkKKyAgICBtX0NhY2hlRm9udHMucHVzaF9iYWNrKHBGb250KTsKKyAgcmV0dXJuIHBGb250OworfQorCitSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBDRkdBU19EZWZhdWx0Rm9udE1hbmFnZXI6OkdldERlZmF1bHRGb250KAorICAgIENGR0FTX0ZvbnRNZ3IqIHBGb250TWdyLAorICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c0ZvbnRGYW1pbHksCisgICAgdWludDMyX3QgZHdGb250U3R5bGVzKSB7CisgIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+IHBGb250ID0KKyAgICAgIHBGb250TWdyLT5Mb2FkRm9udChMIkFyaWFsIE5hcnJvdyIsIGR3Rm9udFN0eWxlcywgMHhGRkZGKTsKKyAgaWYgKCFwRm9udCkgeworICAgIHBGb250ID0gcEZvbnRNZ3ItPkxvYWRGb250KHN0YXRpY19jYXN0PGNvbnN0IHdjaGFyX3QqPihudWxscHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ZvbnRTdHlsZXMsIDB4RkZGRik7CisgIH0KKyAgaWYgKHBGb250KQorICAgIG1fQ2FjaGVGb250cy5wdXNoX2JhY2socEZvbnQpOworICByZXR1cm4gcEZvbnQ7Cit9CmRpZmYgLS1naXQgYS94ZmEvZmdhcy9mb250L2NmZ2FzX2RlZmF1bHRmb250bWFuYWdlci5oIGIveGZhL2ZnYXMvZm9udC9jZmdhc19kZWZhdWx0Zm9udG1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYWZlOWViCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2ZnYXMvZm9udC9jZmdhc19kZWZhdWx0Zm9udG1hbmFnZXIuaApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZHQVNfRk9OVF9DRkdBU19ERUZBVUxURk9OVE1BTkFHRVJfSF8KKyNkZWZpbmUgWEZBX0ZHQVNfRk9OVF9DRkdBU19ERUZBVUxURk9OVE1BTkFHRVJfSF8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9jZmdhc19nZWZvbnQuaCIKKworY2xhc3MgQ0ZHQVNfRGVmYXVsdEZvbnRNYW5hZ2VyIHsKKyBwdWJsaWM6CisgIENGR0FTX0RlZmF1bHRGb250TWFuYWdlcigpOworICB+Q0ZHQVNfRGVmYXVsdEZvbnRNYW5hZ2VyKCk7CisKKyAgUmV0YWluUHRyPENGR0FTX0dFRm9udD4gR2V0Rm9udChDRkdBU19Gb250TWdyKiBwRm9udE1nciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NGb250RmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3Rm9udFN0eWxlcyk7CisgIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+IEdldERlZmF1bHRGb250KENGR0FTX0ZvbnRNZ3IqIHBGb250TWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NGb250RmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZvbnRTdHlsZXMpOworCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8UmV0YWluUHRyPENGR0FTX0dFRm9udD4+IG1fQ2FjaGVGb250czsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZHQVNfRk9OVF9DRkdBU19ERUZBVUxURk9OVE1BTkFHRVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZ2FzL2ZvbnQvY2ZnYXNfZm9udG1nci5jcHAgYi94ZmEvZmdhcy9mb250L2NmZ2FzX2ZvbnRtZ3IuY3BwCmluZGV4IGFhNDEzMTguLjg2MmU5MjkgMTAwNjQ0Ci0tLSBhL3hmYS9mZ2FzL2ZvbnQvY2ZnYXNfZm9udG1nci5jcHAKKysrIGIveGZhL2ZnYXMvZm9udC9jZmdhc19mb250bWdyLmNwcApAQCAtMTAsNDAgKzEwLDk1IEBACiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHV0aWxpdHk+CiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmVhbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X21lbW9yeXN0cmVhbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29kZXBhZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnQuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnRtYXBwZXIuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2ZvbnRtZ3IuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dlbW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2ZvbnQuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvaWZ4X3N5c3RlbWZvbnRpbmZvLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKLSNpbmNsdWRlICJ4ZmEvZmdhcy9jcnQvZmdhc19jb2RlcGFnZS5oIgogI2luY2x1ZGUgInhmYS9mZ2FzL2ZvbnQvY2ZnYXNfZ2Vmb250LmgiCiAjaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9mZ2FzX2ZvbnR1dGlscy5oIgogCi0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCiAKIG5hbWVzcGFjZSB7CiAKK3N0cnVjdCBGWF9DSEFSU0VUX01BUCB7CisgIHVpbnQxNl90IGNoYXJzZXQ7CisgIHVpbnQxNl90IGNvZGVwYWdlOworfTsKKworY29uc3QgRlhfQ0hBUlNFVF9NQVAgZ19GWENoYXJzZXQyQ29kZVBhZ2VUYWJsZVtdID0geworICAgIHtGWF9DSEFSU0VUX0FOU0ksIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sCisgICAge0ZYX0NIQVJTRVRfRGVmYXVsdCwgRlhfQ09ERVBBR0VfRGVmQU5TSX0sCisgICAge0ZYX0NIQVJTRVRfU3ltYm9sLCBGWF9DT0RFUEFHRV9TeW1ib2x9LAorICAgIHtGWF9DSEFSU0VUX01BQ19Sb21hbiwgRlhfQ09ERVBBR0VfTUFDX1JvbWFufSwKKyAgICB7RlhfQ0hBUlNFVF9NQUNfU2hpZnRKSVMsIEZYX0NPREVQQUdFX01BQ19TaGlmdEpJU30sCisgICAge0ZYX0NIQVJTRVRfTUFDX0tvcmVhbiwgRlhfQ09ERVBBR0VfTUFDX0tvcmVhbn0sCisgICAge0ZYX0NIQVJTRVRfTUFDX0NoaW5lc2VTaW1wbGlmaWVkLCBGWF9DT0RFUEFHRV9NQUNfQ2hpbmVzZVNpbXBsaWZpZWR9LAorICAgIHtGWF9DSEFSU0VUX01BQ19DaGluZXNlVHJhZGl0aW9uYWwsIEZYX0NPREVQQUdFX01BQ19DaGluZXNlVHJhZGl0aW9uYWx9LAorICAgIHtGWF9DSEFSU0VUX01BQ19IZWJyZXcsIEZYX0NPREVQQUdFX01BQ19IZWJyZXd9LAorICAgIHtGWF9DSEFSU0VUX01BQ19BcmFiaWMsIEZYX0NPREVQQUdFX01BQ19BcmFiaWN9LAorICAgIHtGWF9DSEFSU0VUX01BQ19HcmVlaywgRlhfQ09ERVBBR0VfTUFDX0dyZWVrfSwKKyAgICB7RlhfQ0hBUlNFVF9NQUNfVHVya2lzaCwgRlhfQ09ERVBBR0VfTUFDX1R1cmtpc2h9LAorICAgIHtGWF9DSEFSU0VUX01BQ19UaGFpLCBGWF9DT0RFUEFHRV9NQUNfVGhhaX0sCisgICAge0ZYX0NIQVJTRVRfTUFDX0Vhc3Rlcm5FdXJvcGVhbiwgRlhfQ09ERVBBR0VfTUFDX0Vhc3Rlcm5FdXJvcGVhbn0sCisgICAge0ZYX0NIQVJTRVRfTUFDX0N5cmlsbGljLCBGWF9DT0RFUEFHRV9NQUNfQ3lyaWxsaWN9LAorICAgIHtGWF9DSEFSU0VUX1NoaWZ0SklTLCBGWF9DT0RFUEFHRV9TaGlmdEpJU30sCisgICAge0ZYX0NIQVJTRVRfSGFuZ3VsLCBGWF9DT0RFUEFHRV9IYW5ndWx9LAorICAgIHtGWF9DSEFSU0VUX0pvaGFiLCBGWF9DT0RFUEFHRV9Kb2hhYn0sCisgICAge0ZYX0NIQVJTRVRfQ2hpbmVzZVNpbXBsaWZpZWQsIEZYX0NPREVQQUdFX0NoaW5lc2VTaW1wbGlmaWVkfSwKKyAgICB7RlhfQ0hBUlNFVF9DaGluZXNlVHJhZGl0aW9uYWwsIEZYX0NPREVQQUdFX0NoaW5lc2VUcmFkaXRpb25hbH0sCisgICAge0ZYX0NIQVJTRVRfTVNXaW5fR3JlZWssIEZYX0NPREVQQUdFX01TV2luX0dyZWVrfSwKKyAgICB7RlhfQ0hBUlNFVF9NU1dpbl9UdXJraXNoLCBGWF9DT0RFUEFHRV9NU1dpbl9UdXJraXNofSwKKyAgICB7RlhfQ0hBUlNFVF9NU1dpbl9WaWV0bmFtZXNlLCBGWF9DT0RFUEFHRV9NU1dpbl9WaWV0bmFtZXNlfSwKKyAgICB7RlhfQ0hBUlNFVF9NU1dpbl9IZWJyZXcsIEZYX0NPREVQQUdFX01TV2luX0hlYnJld30sCisgICAge0ZYX0NIQVJTRVRfTVNXaW5fQXJhYmljLCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LAorICAgIHtGWF9DSEFSU0VUX01TV2luX0JhbHRpYywgRlhfQ09ERVBBR0VfTVNXaW5fQmFsdGljfSwKKyAgICB7RlhfQ0hBUlNFVF9NU1dpbl9DeXJpbGxpYywgRlhfQ09ERVBBR0VfTVNXaW5fQ3lyaWxsaWN9LAorICAgIHtGWF9DSEFSU0VUX1RoYWksIEZYX0NPREVQQUdFX01TRE9TX1RoYWl9LAorICAgIHtGWF9DSEFSU0VUX01TV2luX0Vhc3Rlcm5FdXJvcGVhbiwgRlhfQ09ERVBBR0VfTVNXaW5fRWFzdGVybkV1cm9wZWFufSwKKyAgICB7RlhfQ0hBUlNFVF9VUywgRlhfQ09ERVBBR0VfTVNET1NfVVN9LAorICAgIHtGWF9DSEFSU0VUX09FTSwgRlhfQ09ERVBBR0VfTVNET1NfV2VzdGVybkV1cm9wZWFufSwKK307CisKK3VpbnQxNl90IEdldENvZGVQYWdlRnJvbUNoYXJzZXQodWludDhfdCBjaGFyc2V0KSB7CisgIGludDMyX3QgaUVuZCA9IHNpemVvZihnX0ZYQ2hhcnNldDJDb2RlUGFnZVRhYmxlKSAvIHNpemVvZihGWF9DSEFSU0VUX01BUCkgLSAxOworICBBU1NFUlQoaUVuZCA+PSAwKTsKKworICBpbnQzMl90IGlTdGFydCA9IDAsIGlNaWQ7CisgIGRvIHsKKyAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsKKyAgICBjb25zdCBGWF9DSEFSU0VUX01BUCYgY3AgPSBnX0ZYQ2hhcnNldDJDb2RlUGFnZVRhYmxlW2lNaWRdOworICAgIGlmIChjaGFyc2V0ID09IGNwLmNoYXJzZXQpCisgICAgICByZXR1cm4gY3AuY29kZXBhZ2U7CisgICAgaWYgKGNoYXJzZXQgPCBjcC5jaGFyc2V0KQorICAgICAgaUVuZCA9IGlNaWQgLSAxOworICAgIGVsc2UKKyAgICAgIGlTdGFydCA9IGlNaWQgKyAxOworICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7CisgIHJldHVybiAweEZGRkY7Cit9CisKIGludDMyX3QgR2V0U2ltaWxhcml0eVNjb3JlKEZYX0ZPTlRERVNDUklQVE9SIGNvbnN0KiBwRm9udCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3Rm9udFN0eWxlcykgewogICBpbnQzMl90IGlWYWx1ZSA9IDA7Ci0gIGlmICgoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX1N5bWJvbGljKSA9PQotICAgICAgKHBGb250LT5kd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU3ltYm9saWMpKSB7CisgIGlmIChGb250U3R5bGVJc1N5bWJvbGljKGR3Rm9udFN0eWxlcykgPT0KKyAgICAgIEZvbnRTdHlsZUlzU3ltYm9saWMocEZvbnQtPmR3Rm9udFN0eWxlcykpIHsKICAgICBpVmFsdWUgKz0gNjQ7CiAgIH0KLSAgaWYgKChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfRml4ZWRQaXRjaCkgPT0KLSAgICAgIChwRm9udC0+ZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0ZpeGVkUGl0Y2gpKSB7CisgIGlmIChGb250U3R5bGVJc0ZpeGVkUGl0Y2goZHdGb250U3R5bGVzKSA9PQorICAgICAgRm9udFN0eWxlSXNGaXhlZFBpdGNoKHBGb250LT5kd0ZvbnRTdHlsZXMpKSB7CiAgICAgaVZhbHVlICs9IDMyOwogICB9Ci0gIGlmICgoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX1NlcmlmKSA9PQotICAgICAgKHBGb250LT5kd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU2VyaWYpKSB7CisgIGlmIChGb250U3R5bGVJc1NlcmlmKGR3Rm9udFN0eWxlcykgPT0gRm9udFN0eWxlSXNTZXJpZihwRm9udC0+ZHdGb250U3R5bGVzKSkKICAgICBpVmFsdWUgKz0gMTY7Ci0gIH0KLSAgaWYgKChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU2NyaXB0KSA9PQotICAgICAgKHBGb250LT5kd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU2NyaXB0KSkgeworICBpZiAoRm9udFN0eWxlSXNTY3JpcHQoZHdGb250U3R5bGVzKSA9PSBGb250U3R5bGVJc1NjcmlwdChwRm9udC0+ZHdGb250U3R5bGVzKSkKICAgICBpVmFsdWUgKz0gODsKLSAgfQogICByZXR1cm4gaVZhbHVlOwogfQogCkBAIC01MiwxMiArMTA3LDEyIEBACiAgICAgY29uc3Qgc3RkOjpkZXF1ZTxGWF9GT05UREVTQ1JJUFRPUj4mIGZvbnRzKSB7CiAgIGNvbnN0IEZYX0ZPTlRERVNDUklQVE9SKiBwQmVzdEZvbnQgPSBudWxscHRyOwogICBpbnQzMl90IGlCZXN0U2ltaWxhciA9IDA7Ci0gIGJvb2wgYk1hdGNoU3R5bGUgPSAocFBhcmFtcy0+ZHdNYXRjaEZsYWdzICYgRlhfRk9OVE1BVENIUEFSQV9NYXRjaFN0eWxlKSA+IDA7CiAgIGZvciAoY29uc3QgYXV0byYgZm9udCA6IGZvbnRzKSB7Ci0gICAgaWYgKChmb250LmR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9Cb2xkSXRhbGljKSA9PQotICAgICAgICBGWF9GT05UU1RZTEVfQm9sZEl0YWxpYykgeworICAgIGlmIChGb250U3R5bGVJc0JvbGQoZm9udC5kd0ZvbnRTdHlsZXMpICYmCisgICAgICAgIEZvbnRTdHlsZUlzSXRhbGljKGZvbnQuZHdGb250U3R5bGVzKSkgewogICAgICAgY29udGludWU7CiAgICAgfQorCiAgICAgaWYgKHBQYXJhbXMtPnB3c0ZhbWlseSkgewogICAgICAgaWYgKEZYU1lTX3djc2ljbXAocFBhcmFtcy0+cHdzRmFtaWx5LCBmb250LndzRm9udEZhY2UpKQogICAgICAgICBjb250aW51ZTsKQEAgLTY3LDcgKzEyMiw3IEBACiAgICAgaWYgKGZvbnQudUNoYXJTZXQgPT0gRlhfQ0hBUlNFVF9TeW1ib2wpCiAgICAgICBjb250aW51ZTsKICAgICBpZiAocFBhcmFtcy0+d0NvZGVQYWdlICE9IDB4RkZGRikgewotICAgICAgaWYgKEZYX0dldENvZGVQYWdlRnJvbUNoYXJzZXQoZm9udC51Q2hhclNldCkgIT0gcFBhcmFtcy0+d0NvZGVQYWdlKQorICAgICAgaWYgKEdldENvZGVQYWdlRnJvbUNoYXJzZXQoZm9udC51Q2hhclNldCkgIT0gcFBhcmFtcy0+d0NvZGVQYWdlKQogICAgICAgICBjb250aW51ZTsKICAgICB9IGVsc2UgewogICAgICAgaWYgKHBQYXJhbXMtPmR3VVNCIDwgMTI4KSB7CkBAIC03Nyw3ICsxMzIsNyBAQAogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgfQogICAgIH0KLSAgICBpZiAoYk1hdGNoU3R5bGUpIHsKKyAgICBpZiAocFBhcmFtcy0+bWF0Y2hQYXJhZ3JhcGhTdHlsZSkgewogICAgICAgaWYgKChmb250LmR3Rm9udFN0eWxlcyAmIDB4MEYpID09IChwUGFyYW1zLT5kd0ZvbnRTdHlsZXMgJiAweDBGKSkKICAgICAgICAgcmV0dXJuICZmb250OwogICAgICAgY29udGludWU7CkBAIC05NSwxODcgKzE1MCw4NSBAQAogICByZXR1cm4gaUJlc3RTaW1pbGFyIDwgMSA/IG51bGxwdHIgOiBwQmVzdEZvbnQ7CiB9CiAKLX0gIC8vIG5hbWVzcGFjZQotCi1zdGQ6OnVuaXF1ZV9wdHI8Q0ZHQVNfRm9udE1ncj4gQ0ZHQVNfRm9udE1ncjo6Q3JlYXRlKAotICAgIEZYX0xQRW51bUFsbEZvbnRzIHBFbnVtZXJhdG9yKSB7Ci0gIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZHQVNfRm9udE1ncj4ocEVudW1lcmF0b3IpOwordWludDMyX3QgR2V0R2RpRm9udFN0eWxlcyhjb25zdCBMT0dGT05UVyYgbGYpIHsKKyAgdWludDMyX3QgZHdTdHlsZXMgPSAwOworICBpZiAoKGxmLmxmUGl0Y2hBbmRGYW1pbHkgJiAweDAzKSA9PSBGSVhFRF9QSVRDSCkKKyAgICBkd1N0eWxlcyB8PSBGWEZPTlRfRklYRURfUElUQ0g7CisgIHVpbnQ4X3QgbkZhbWlsaWVzID0gbGYubGZQaXRjaEFuZEZhbWlseSAmIDB4RjA7CisgIGlmIChuRmFtaWxpZXMgPT0gRkZfUk9NQU4pCisgICAgZHdTdHlsZXMgfD0gRlhGT05UX1NFUklGOworICBpZiAobkZhbWlsaWVzID09IEZGX1NDUklQVCkKKyAgICBkd1N0eWxlcyB8PSBGWEZPTlRfU0NSSVBUOworICBpZiAobGYubGZDaGFyU2V0ID09IFNZTUJPTF9DSEFSU0VUKQorICAgIGR3U3R5bGVzIHw9IEZYRk9OVF9TWU1CT0xJQzsKKyAgcmV0dXJuIGR3U3R5bGVzOwogfQogCi1DRkdBU19Gb250TWdyOjpDRkdBU19Gb250TWdyKEZYX0xQRW51bUFsbEZvbnRzIHBFbnVtZXJhdG9yKQotICAgIDogbV9wRW51bWVyYXRvcihwRW51bWVyYXRvciksIG1fRm9udEZhY2VzKDEwMCkgeworaW50MzJfdCBDQUxMQkFDSyBHZGlGb250RW51bVByb2MoRU5VTUxPR0ZPTlRFWCogbHBlbGZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVXVEVYVE1FVFJJQ0VYKiBscG50bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZvbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSkgeworICBpZiAoZHdGb250VHlwZSAhPSBUUlVFVFlQRV9GT05UVFlQRSkKKyAgICByZXR1cm4gMTsKKyAgY29uc3QgTE9HRk9OVFcmIGxmID0gKChMUEVOVU1MT0dGT05URVhXKWxwZWxmZSktPmVsZkxvZ0ZvbnQ7CisgIGlmIChsZi5sZkZhY2VOYW1lWzBdID09IEwnQCcpCisgICAgcmV0dXJuIDE7CisgIEZYX0ZPTlRERVNDUklQVE9SKiBwRm9udCA9IEZYX0FsbG9jKEZYX0ZPTlRERVNDUklQVE9SLCAxKTsKKyAgbWVtc2V0KHBGb250LCAwLCBzaXplb2YoRlhfRk9OVERFU0NSSVBUT1IpKTsKKyAgcEZvbnQtPnVDaGFyU2V0ID0gbGYubGZDaGFyU2V0OworICBwRm9udC0+ZHdGb250U3R5bGVzID0gR2V0R2RpRm9udFN0eWxlcyhsZik7CisgIEZYU1lTX3djc25jcHkocEZvbnQtPndzRm9udEZhY2UsIChjb25zdCB3Y2hhcl90KilsZi5sZkZhY2VOYW1lLCAzMSk7CisgIHBGb250LT53c0ZvbnRGYWNlWzMxXSA9IDA7CisgIG1lbWNweSgmcEZvbnQtPkZvbnRTaWduYXR1cmUsICZscG50bWUtPm50bUZvbnRTaWcsCisgICAgICAgICBzaXplb2YobHBudG1lLT5udG1Gb250U2lnKSk7CisgIHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjpkZXF1ZTxGWF9GT05UREVTQ1JJUFRPUj4qPihsUGFyYW0pLT5wdXNoX2JhY2soKnBGb250KTsKKyAgRlhfRnJlZShwRm9udCk7CisgIHJldHVybiAxOworfQorCit2b2lkIEVudW1HZGlGb250cyhzdGQ6OmRlcXVlPEZYX0ZPTlRERVNDUklQVE9SPiogZm9udHMsCisgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBwd3NGYWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgIHdjaGFyX3Qgd1VuaWNvZGUpIHsKKyAgSERDIGhEQyA9IDo6R2V0REMobnVsbHB0cik7CisgIExPR0ZPTlRXIGxmRmluZDsKKyAgbWVtc2V0KCZsZkZpbmQsIDAsIHNpemVvZihsZkZpbmQpKTsKKyAgbGZGaW5kLmxmQ2hhclNldCA9IERFRkFVTFRfQ0hBUlNFVDsKKyAgaWYgKHB3c0ZhY2VOYW1lKSB7CisgICAgRlhTWVNfd2NzbmNweShsZkZpbmQubGZGYWNlTmFtZSwgcHdzRmFjZU5hbWUsIDMxKTsKKyAgICBsZkZpbmQubGZGYWNlTmFtZVszMV0gPSAwOworICB9CisgIEVudW1Gb250RmFtaWxpZXNFeFcoaERDLCAoTFBMT0dGT05UVykmbGZGaW5kLCAoRk9OVEVOVU1QUk9DVylHZGlGb250RW51bVByb2MsCisgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSlmb250cywgMCk7CisgIDo6UmVsZWFzZURDKG51bGxwdHIsIGhEQyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitDRkdBU19Gb250TWdyOjpDRkdBU19Gb250TWdyKCkgOiBtX3BFbnVtZXJhdG9yKEVudW1HZGlGb250cyksIG1fRm9udEZhY2VzKDEwMCkgewogICBpZiAobV9wRW51bWVyYXRvcikKICAgICBtX3BFbnVtZXJhdG9yKCZtX0ZvbnRGYWNlcywgbnVsbHB0ciwgMHhGRUZGKTsKIH0KIAogQ0ZHQVNfRm9udE1ncjo6fkNGR0FTX0ZvbnRNZ3IoKSB7fQogCi1DRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gQ0ZHQVNfRm9udE1ncjo6R2V0Rm9udEJ5Q29kZVBhZ2UoCi0gICAgdWludDE2X3Qgd0NvZGVQYWdlLAotICAgIHVpbnQzMl90IGR3Rm9udFN0eWxlcywKLSAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSkgewotICB1aW50MzJfdCBkd0hhc2ggPSBGR0FTX0dldEZvbnRIYXNoQ29kZSh3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcyk7Ci0gIGF1dG8gaXQgPSBtX0NQRm9udHMuZmluZChkd0hhc2gpOwotICBpZiAoaXQgIT0gbV9DUEZvbnRzLmVuZCgpKSB7Ci0gICAgcmV0dXJuIGl0LT5zZWNvbmQgPyBMb2FkRm9udChpdC0+c2Vjb25kLCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSkgOiBudWxscHRyOwotICB9Ci0gIGNvbnN0IEZYX0ZPTlRERVNDUklQVE9SKiBwRkQgPQotICAgICAgRmluZEZvbnQocHN6Rm9udEZhbWlseSwgZHdGb250U3R5bGVzLCB0cnVlLCB3Q29kZVBhZ2UpOwotICBpZiAoIXBGRCkKLSAgICBwRkQgPSBGaW5kRm9udChudWxscHRyLCBkd0ZvbnRTdHlsZXMsIHRydWUsIHdDb2RlUGFnZSk7Ci0gIGlmICghcEZEKQotICAgIHBGRCA9IEZpbmRGb250KG51bGxwdHIsIGR3Rm9udFN0eWxlcywgZmFsc2UsIHdDb2RlUGFnZSk7Ci0gIGlmICghcEZEKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBwRm9udCA9Ci0gICAgICBDRkdBU19HRUZvbnQ6OkxvYWRGb250KHBGRC0+d3NGb250RmFjZSwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UsIHRoaXMpOwotICBpZiAoIXBGb250KQotICAgIHJldHVybiBudWxscHRyOwotCi0gIG1fRm9udHMucHVzaF9iYWNrKHBGb250KTsKLSAgbV9DUEZvbnRzW2R3SGFzaF0gPSBwRm9udDsKLSAgZHdIYXNoID0gRkdBU19HZXRGb250RmFtaWx5SGFzaChwRkQtPndzRm9udEZhY2UsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsKLSAgbV9GYW1pbHlGb250c1tkd0hhc2hdID0gcEZvbnQ7Ci0gIHJldHVybiBMb2FkRm9udChwRm9udCwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOworYm9vbCBDRkdBU19Gb250TWdyOjpFbnVtRm9udHMoKSB7CisgIHJldHVybiB0cnVlOwogfQogCi1DRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gQ0ZHQVNfRm9udE1ncjo6R2V0Rm9udEJ5VW5pY29kZSgKLSAgICBGWF9XQ0hBUiB3VW5pY29kZSwKLSAgICB1aW50MzJfdCBkd0ZvbnRTdHlsZXMsCi0gICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkpIHsKLSAgY29uc3QgRkdBU19GT05UVVNCKiBwUmV0ID0gRkdBU19HZXRVbmljb2RlQml0RmllbGQod1VuaWNvZGUpOwotICBpZiAocFJldC0+d0JpdEZpZWxkID09IDk5OSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICB1aW50MzJfdCBkd0hhc2ggPQotICAgICAgRkdBU19HZXRGb250RmFtaWx5SGFzaChwc3pGb250RmFtaWx5LCBkd0ZvbnRTdHlsZXMsIHBSZXQtPndCaXRGaWVsZCk7Ci0gIGF1dG8gaXQgPSBtX1VuaWNvZGVGb250cy5maW5kKGR3SGFzaCk7Ci0gIGlmIChpdCAhPSBtX1VuaWNvZGVGb250cy5lbmQoKSkgewotICAgIHJldHVybiBpdC0+c2Vjb25kID8gTG9hZEZvbnQoaXQtPnNlY29uZCwgZHdGb250U3R5bGVzLCBwUmV0LT53Q29kZVBhZ2UpCi0gICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyOwotICB9Ci0gIGNvbnN0IEZYX0ZPTlRERVNDUklQVE9SKiBwRkQgPQotICAgICAgRmluZEZvbnQocHN6Rm9udEZhbWlseSwgZHdGb250U3R5bGVzLCBmYWxzZSwgcFJldC0+d0NvZGVQYWdlLAotICAgICAgICAgICAgICAgcFJldC0+d0JpdEZpZWxkLCB3VW5pY29kZSk7Ci0gIGlmICghcEZEICYmIHBzekZvbnRGYW1pbHkpIHsKLSAgICBwRkQgPSBGaW5kRm9udChudWxscHRyLCBkd0ZvbnRTdHlsZXMsIGZhbHNlLCBwUmV0LT53Q29kZVBhZ2UsCi0gICAgICAgICAgICAgICAgICAgcFJldC0+d0JpdEZpZWxkLCB3VW5pY29kZSk7Ci0gIH0KLSAgaWYgKCFwRkQpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgdWludDE2X3Qgd0NvZGVQYWdlID0gRlhfR2V0Q29kZVBhZ2VGcm9tQ2hhcnNldChwRkQtPnVDaGFyU2V0KTsKLSAgY29uc3QgRlhfV0NIQVIqIHBGb250RmFjZSA9IHBGRC0+d3NGb250RmFjZTsKLSAgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IHBGb250ID0KLSAgICAgIENGR0FTX0dFRm9udDo6TG9hZEZvbnQocEZvbnRGYWNlLCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSwgdGhpcyk7Ci0gIGlmICghcEZvbnQpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgbV9Gb250cy5wdXNoX2JhY2socEZvbnQpOwotICBtX1VuaWNvZGVGb250c1tkd0hhc2hdID0gcEZvbnQ7Ci0gIG1fQ1BGb250c1tGR0FTX0dldEZvbnRIYXNoQ29kZSh3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcyldID0gcEZvbnQ7Ci0gIG1fRmFtaWx5Rm9udHNbRkdBU19HZXRGb250RmFtaWx5SGFzaChwRm9udEZhY2UsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKV0gPQotICAgICAgcEZvbnQ7Ci0gIHJldHVybiBMb2FkRm9udChwRm9udCwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOwotfQotCi1DRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gQ0ZHQVNfRm9udE1ncjo6TG9hZEZvbnQoCi0gICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHksCi0gICAgdWludDMyX3QgZHdGb250U3R5bGVzLAotICAgIHVpbnQxNl90IHdDb2RlUGFnZSkgewotICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gcEZvbnQ7Ci0gIHVpbnQzMl90IGR3SGFzaCA9Ci0gICAgICBGR0FTX0dldEZvbnRGYW1pbHlIYXNoKHBzekZvbnRGYW1pbHksIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsKLSAgYXV0byBpdCA9IG1fRmFtaWx5Rm9udHMuZmluZChkd0hhc2gpOwotICBpZiAoaXQgIT0gbV9GYW1pbHlGb250cy5lbmQoKSkKLSAgICByZXR1cm4gaXQtPnNlY29uZCA/IExvYWRGb250KGl0LT5zZWNvbmQsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKSA6IG51bGxwdHI7Ci0KLSAgY29uc3QgRlhfRk9OVERFU0NSSVBUT1IqIHBGRCA9Ci0gICAgICBGaW5kRm9udChwc3pGb250RmFtaWx5LCBkd0ZvbnRTdHlsZXMsIHRydWUsIHdDb2RlUGFnZSk7Ci0gIGlmICghcEZEKQotICAgIHBGRCA9IEZpbmRGb250KHBzekZvbnRGYW1pbHksIGR3Rm9udFN0eWxlcywgZmFsc2UsIHdDb2RlUGFnZSk7Ci0gIGlmICghcEZEKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIGlmICh3Q29kZVBhZ2UgPT0gMHhGRkZGKQotICAgIHdDb2RlUGFnZSA9IEZYX0dldENvZGVQYWdlRnJvbUNoYXJzZXQocEZELT51Q2hhclNldCk7Ci0KLSAgcEZvbnQgPQotICAgICAgQ0ZHQVNfR0VGb250OjpMb2FkRm9udChwRkQtPndzRm9udEZhY2UsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlLCB0aGlzKTsKLSAgaWYgKCFwRm9udCkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBtX0ZvbnRzLnB1c2hfYmFjayhwRm9udCk7Ci0gIG1fRmFtaWx5Rm9udHNbZHdIYXNoXSA9IHBGb250OwotICBkd0hhc2ggPSBGR0FTX0dldEZvbnRIYXNoQ29kZSh3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcyk7Ci0gIG1fQ1BGb250c1tkd0hhc2hdID0gcEZvbnQ7Ci0gIHJldHVybiBMb2FkRm9udChwRm9udCwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UpOwotfQotCi1DRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gQ0ZHQVNfRm9udE1ncjo6TG9hZEZvbnQoCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+JiBwU3JjRm9udCwKLSAgICB1aW50MzJfdCBkd0ZvbnRTdHlsZXMsCi0gICAgdWludDE2X3Qgd0NvZGVQYWdlKSB7Ci0gIGlmIChwU3JjRm9udC0+R2V0Rm9udFN0eWxlcygpID09IGR3Rm9udFN0eWxlcykKLSAgICByZXR1cm4gcFNyY0ZvbnQ7Ci0KLSAgdm9pZCogYnVmZmVyWzNdID0ge3BTcmNGb250LkdldCgpLCAodm9pZCopKHVpbnRwdHJfdClkd0ZvbnRTdHlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAodm9pZCopKHVpbnRwdHJfdCl3Q29kZVBhZ2V9OwotICB1aW50MzJfdCBkd0hhc2ggPSBGWF9IYXNoQ29kZV9HZXRBKAotICAgICAgQ0ZYX0J5dGVTdHJpbmdDKCh1aW50OF90KilidWZmZXIsIHNpemVvZihidWZmZXIpKSwgZmFsc2UpOwotICBhdXRvIGl0ID0gbV9EZXJpdmVGb250cy5maW5kKGR3SGFzaCk7Ci0gIGlmIChpdCAhPSBtX0Rlcml2ZUZvbnRzLmVuZCgpICYmIGl0LT5zZWNvbmQpCi0gICAgcmV0dXJuIGl0LT5zZWNvbmQ7Ci0KLSAgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IHBGb250ID0gcFNyY0ZvbnQtPkRlcml2ZShkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7Ci0gIGlmICghcEZvbnQpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgbV9EZXJpdmVGb250c1tkd0hhc2hdID0gcEZvbnQ7Ci0gIGF1dG8gaXRlciA9IHN0ZDo6ZmluZChtX0ZvbnRzLmJlZ2luKCksIG1fRm9udHMuZW5kKCksIHBGb250KTsKLSAgaWYgKGl0ZXIgPT0gbV9Gb250cy5lbmQoKSkKLSAgICBtX0ZvbnRzLnB1c2hfYmFjayhwRm9udCk7Ci0gIHJldHVybiBwRm9udDsKLX0KLQotdm9pZCBDRkdBU19Gb250TWdyOjpSZW1vdmVGb250KAotICAgIHN0ZDo6bWFwPHVpbnQzMl90LCBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4+KiBwRm9udE1hcCwKLSAgICBjb25zdCBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4mIHBGb250KSB7Ci0gIGF1dG8gaXRlciA9IHBGb250TWFwLT5iZWdpbigpOwotICB3aGlsZSAoaXRlciAhPSBwRm9udE1hcC0+ZW5kKCkpIHsKLSAgICBhdXRvIG9sZF9pdGVyID0gaXRlcisrOwotICAgIGlmIChvbGRfaXRlci0+c2Vjb25kID09IHBGb250KQotICAgICAgcEZvbnRNYXAtPmVyYXNlKG9sZF9pdGVyKTsKLSAgfQotfQotCi12b2lkIENGR0FTX0ZvbnRNZ3I6OlJlbW92ZUZvbnQoY29uc3QgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+JiBwRm9udCkgewotICBSZW1vdmVGb250KCZtX0NQRm9udHMsIHBGb250KTsKLSAgUmVtb3ZlRm9udCgmbV9GYW1pbHlGb250cywgcEZvbnQpOwotICBSZW1vdmVGb250KCZtX1VuaWNvZGVGb250cywgcEZvbnQpOwotICBSZW1vdmVGb250KCZtX0J1ZmZlckZvbnRzLCBwRm9udCk7Ci0gIFJlbW92ZUZvbnQoJm1fU3RyZWFtRm9udHMsIHBGb250KTsKLSAgUmVtb3ZlRm9udCgmbV9EZXJpdmVGb250cywgcEZvbnQpOwotICBhdXRvIGl0ID0gc3RkOjpmaW5kKG1fRm9udHMuYmVnaW4oKSwgbV9Gb250cy5lbmQoKSwgcEZvbnQpOwotICBpZiAoaXQgIT0gbV9Gb250cy5lbmQoKSkKLSAgICBtX0ZvbnRzLmVyYXNlKGl0KTsKLX0KLQotY29uc3QgRlhfRk9OVERFU0NSSVBUT1IqIENGR0FTX0ZvbnRNZ3I6OkZpbmRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5LAorY29uc3QgRlhfRk9OVERFU0NSSVBUT1IqIENGR0FTX0ZvbnRNZ3I6OkZpbmRGb250KGNvbnN0IHdjaGFyX3QqIHBzekZvbnRGYW1pbHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGb250U3R5bGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3TWF0Y2hGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1hdGNoUGFyYWdyYXBoU3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd0NvZGVQYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3VVNCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHdVbmljb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCB3VW5pY29kZSkgewogICBGWF9GT05UTUFUQ0hQQVJBTVMgcGFyYW1zOwotICBGWFNZU19tZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOworICBtZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOwogICBwYXJhbXMuZHdVU0IgPSBkd1VTQjsKICAgcGFyYW1zLndVbmljb2RlID0gd1VuaWNvZGU7CiAgIHBhcmFtcy53Q29kZVBhZ2UgPSB3Q29kZVBhZ2U7CiAgIHBhcmFtcy5wd3NGYW1pbHkgPSBwc3pGb250RmFtaWx5OwogICBwYXJhbXMuZHdGb250U3R5bGVzID0gZHdGb250U3R5bGVzOwotICBwYXJhbXMuZHdNYXRjaEZsYWdzID0gZHdNYXRjaEZsYWdzOworICBwYXJhbXMubWF0Y2hQYXJhZ3JhcGhTdHlsZSA9IG1hdGNoUGFyYWdyYXBoU3R5bGU7CiAgIGNvbnN0IEZYX0ZPTlRERVNDUklQVE9SKiBwRGVzYyA9IE1hdGNoRGVmYXVsdEZvbnQoJnBhcmFtcywgbV9Gb250RmFjZXMpOwogICBpZiAocERlc2MpCiAgICAgcmV0dXJuIHBEZXNjOwpAQCAtMjk4LDEwNSArMjUxLDk1IEBACiAgIHJldHVybiAmbV9Gb250RmFjZXMuYmFjaygpOwogfQogCi11aW50MzJfdCBGWF9HZXRHZGlGb250U3R5bGVzKGNvbnN0IExPR0ZPTlRXJiBsZikgewotICB1aW50MzJfdCBkd1N0eWxlcyA9IDA7Ci0gIGlmICgobGYubGZQaXRjaEFuZEZhbWlseSAmIDB4MDMpID09IEZJWEVEX1BJVENIKQotICAgIGR3U3R5bGVzIHw9IEZYX0ZPTlRTVFlMRV9GaXhlZFBpdGNoOwotICB1aW50OF90IG5GYW1pbGllcyA9IGxmLmxmUGl0Y2hBbmRGYW1pbHkgJiAweEYwOwotICBpZiAobkZhbWlsaWVzID09IEZGX1JPTUFOKQotICAgIGR3U3R5bGVzIHw9IEZYX0ZPTlRTVFlMRV9TZXJpZjsKLSAgaWYgKG5GYW1pbGllcyA9PSBGRl9TQ1JJUFQpCi0gICAgZHdTdHlsZXMgfD0gRlhfRk9OVFNUWUxFX1NjcmlwdDsKLSAgaWYgKGxmLmxmQ2hhclNldCA9PSBTWU1CT0xfQ0hBUlNFVCkKLSAgICBkd1N0eWxlcyB8PSBGWF9GT05UU1RZTEVfU3ltYm9saWM7Ci0gIHJldHVybiBkd1N0eWxlczsKLX0KLQotc3RhdGljIGludDMyX3QgQ0FMTEJBQ0sgRlhfR2RpRm9udEVudW1Qcm9jKEVOVU1MT0dGT05URVgqIGxwZWxmZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVdURVhUTUVUUklDRVgqIGxwbnRtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkd0ZvbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQVJBTSBsUGFyYW0pIHsKLSAgaWYgKGR3Rm9udFR5cGUgIT0gVFJVRVRZUEVfRk9OVFRZUEUpCi0gICAgcmV0dXJuIDE7Ci0gIGNvbnN0IExPR0ZPTlRXJiBsZiA9ICgoTFBFTlVNTE9HRk9OVEVYVylscGVsZmUpLT5lbGZMb2dGb250OwotICBpZiAobGYubGZGYWNlTmFtZVswXSA9PSBMJ0AnKQotICAgIHJldHVybiAxOwotICBGWF9GT05UREVTQ1JJUFRPUiogcEZvbnQgPSBGWF9BbGxvYyhGWF9GT05UREVTQ1JJUFRPUiwgMSk7Ci0gIEZYU1lTX21lbXNldChwRm9udCwgMCwgc2l6ZW9mKEZYX0ZPTlRERVNDUklQVE9SKSk7Ci0gIHBGb250LT51Q2hhclNldCA9IGxmLmxmQ2hhclNldDsKLSAgcEZvbnQtPmR3Rm9udFN0eWxlcyA9IEZYX0dldEdkaUZvbnRTdHlsZXMobGYpOwotICBGWFNZU193Y3NuY3B5KHBGb250LT53c0ZvbnRGYWNlLCAoY29uc3QgRlhfV0NIQVIqKWxmLmxmRmFjZU5hbWUsIDMxKTsKLSAgcEZvbnQtPndzRm9udEZhY2VbMzFdID0gMDsKLSAgRlhTWVNfbWVtY3B5KCZwRm9udC0+Rm9udFNpZ25hdHVyZSwgJmxwbnRtZS0+bnRtRm9udFNpZywKLSAgICAgICAgICAgICAgIHNpemVvZihscG50bWUtPm50bUZvbnRTaWcpKTsKLSAgcmVpbnRlcnByZXRfY2FzdDxzdGQ6OmRlcXVlPEZYX0ZPTlRERVNDUklQVE9SPio+KGxQYXJhbSktPnB1c2hfYmFjaygqcEZvbnQpOwotICBGWF9GcmVlKHBGb250KTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIEZYX0VudW1HZGlGb250cyhzdGQ6OmRlcXVlPEZYX0ZPTlRERVNDUklQVE9SPiogZm9udHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHB3c0ZhY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHdVbmljb2RlKSB7Ci0gIEhEQyBoREMgPSA6OkdldERDKG51bGxwdHIpOwotICBMT0dGT05UVyBsZkZpbmQ7Ci0gIEZYU1lTX21lbXNldCgmbGZGaW5kLCAwLCBzaXplb2YobGZGaW5kKSk7Ci0gIGxmRmluZC5sZkNoYXJTZXQgPSBERUZBVUxUX0NIQVJTRVQ7Ci0gIGlmIChwd3NGYWNlTmFtZSkgewotICAgIEZYU1lTX3djc25jcHkobGZGaW5kLmxmRmFjZU5hbWUsIHB3c0ZhY2VOYW1lLCAzMSk7Ci0gICAgbGZGaW5kLmxmRmFjZU5hbWVbMzFdID0gMDsKLSAgfQotICBFbnVtRm9udEZhbWlsaWVzRXhXKGhEQywgKExQTE9HRk9OVFcpJmxmRmluZCwKLSAgICAgICAgICAgICAgICAgICAgICAoRk9OVEVOVU1QUk9DVylGWF9HZGlGb250RW51bVByb2MsIChMUEFSQU0pZm9udHMsIDApOwotICA6OlJlbGVhc2VEQyhudWxscHRyLCBoREMpOwotfQotCi1GWF9MUEVudW1BbGxGb250cyBGWF9HZXREZWZGb250RW51bWVyYXRvcigpIHsKLSAgcmV0dXJuIEZYX0VudW1HZGlGb250czsKLX0KLQotI2Vsc2UgIC8vIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNlbHNlICAvLyBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXwogCiBuYW1lc3BhY2UgewogCi1jb25zdCBGWF9DSEFSKiBnX0ZvbnRGb2xkZXJzW10gPSB7Ci0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9MSU5VWF8KK2NvbnN0ZXhwciBjb25zdCBjaGFyKiBnX0ZvbnRGb2xkZXJzW10gPSB7CisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fTElOVVhfCiAgICAgIi91c3Ivc2hhcmUvZm9udHMiLCAiL3Vzci9zaGFyZS9YMTEvZm9udHMvVHlwZTEiLAogICAgICIvdXNyL3NoYXJlL1gxMS9mb250cy9UVEYiLCAiL3Vzci9sb2NhbC9zaGFyZS9mb250cyIsCi0jZWxpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXworI2VsaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCiAgICAgIn4vTGlicmFyeS9Gb250cyIsICIvTGlicmFyeS9Gb250cyIsICIvU3lzdGVtL0xpYnJhcnkvRm9udHMiLAotI2VsaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9BTkRST0lEXworI2VsaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQU5EUk9JRF8KICAgICAiL3N5c3RlbS9mb250cyIsCiAjZW5kaWYKIH07CiAKLXN0cnVjdCBGWF9CaXRDb2RlUGFnZSB7Ci0gIHVpbnQxNl90IHdCaXQ7Ci0gIHVpbnQxNl90IHdDb2RlUGFnZTsKLX07Ci0KLWNvbnN0IEZYX0JpdENvZGVQYWdlIGdfQml0MkNvZGVQYWdlW10gPSB7Ci0gICAgezAsIDEyNTJ9LCB7MSwgMTI1MH0sIHsyLCAxMjUxfSwgezMsIDEyNTN9LCAgezQsIDEyNTR9LCB7NSwgMTI1NX0sCi0gICAgezYsIDEyNTZ9LCB7NywgMTI1N30sIHs4LCAxMjU4fSwgezksIDB9LCAgICAgezEwLCAwfSwgICB7MTEsIDB9LAotICAgIHsxMiwgMH0sICAgezEzLCAwfSwgICB7MTQsIDB9LCAgIHsxNSwgMH0sICAgIHsxNiwgODc0fSwgezE3LCA5MzJ9LAotICAgIHsxOCwgOTM2fSwgezE5LCA5NDl9LCB7MjAsIDk1MH0sIHsyMSwgMTM2MX0sIHsyMiwgMH0sICAgezIzLCAwfSwKLSAgICB7MjQsIDB9LCAgIHsyNSwgMH0sICAgezI2LCAwfSwgICB7MjcsIDB9LCAgICB7MjgsIDB9LCAgIHsyOSwgMH0sCi0gICAgezMwLCAwfSwgICB7MzEsIDB9LCAgIHszMiwgMH0sICAgezMzLCAwfSwgICAgezM0LCAwfSwgICB7MzUsIDB9LAotICAgIHszNiwgMH0sICAgezM3LCAwfSwgICB7MzgsIDB9LCAgIHszOSwgMH0sICAgIHs0MCwgMH0sICAgezQxLCAwfSwKLSAgICB7NDIsIDB9LCAgIHs0MywgMH0sICAgezQ0LCAwfSwgICB7NDUsIDB9LCAgICB7NDYsIDB9LCAgIHs0NywgMH0sCi0gICAgezQ4LCA4Njl9LCB7NDksIDg2Nn0sIHs1MCwgODY1fSwgezUxLCA4NjR9LCAgezUyLCA4NjN9LCB7NTMsIDg2Mn0sCi0gICAgezU0LCA4NjF9LCB7NTUsIDg2MH0sIHs1NiwgODU3fSwgezU3LCA4NTV9LCAgezU4LCA4NTJ9LCB7NTksIDc3NX0sCi0gICAgezYwLCA3Mzd9LCB7NjEsIDcwOH0sIHs2MiwgODUwfSwgezYzLCA0Mzd9LAotfTsKK2NvbnN0IHVpbnQxNl90IGdfQ29kZVBhZ2VzW10gPSB7RlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DT0RFUEFHRV9NU1dpbl9FYXN0ZXJuRXVyb3BlYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX01TV2luX0N5cmlsbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DT0RFUEFHRV9NU1dpbl9HcmVlaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09ERVBBR0VfTVNXaW5fVHVya2lzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09ERVBBR0VfTVNXaW5fSGVicmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX01TV2luX0JhbHRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09ERVBBR0VfTVNXaW5fVmlldG5hbWVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09ERVBBR0VfRGVmQU5TSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09ERVBBR0VfRGVmQU5TSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09ERVBBR0VfRGVmQU5TSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09ERVBBR0VfRGVmQU5TSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09ERVBBR0VfRGVmQU5TSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09ERVBBR0VfRGVmQU5TSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09ERVBBR0VfRGVmQU5TSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09ERVBBR0VfTVNET1NfVGhhaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09ERVBBR0VfU2hpZnRKSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0NoaW5lc2VTaW1wbGlmaWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DT0RFUEFHRV9IYW5ndWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0NoaW5lc2VUcmFkaXRpb25hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09ERVBBR0VfSm9oYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0RlZkFOU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX01TRE9TX0dyZWVrMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09ERVBBR0VfTVNET1NfUnVzc2lhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09ERVBBR0VfTVNET1NfTm9yd2VnaWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DT0RFUEFHRV9NU0RPU19BcmFiaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX01TRE9TX0ZyZW5jaENhbmFkaWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DT0RFUEFHRV9NU0RPU19IZWJyZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX01TRE9TX0ljZWxhbmRpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09ERVBBR0VfTVNET1NfUG9ydHVndWVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09ERVBBR0VfTVNET1NfVHVya2lzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09ERVBBR0VfTVNET1NfQ3lyaWxsaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX01TRE9TX0Vhc3Rlcm5FdXJvcGVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQ09ERVBBR0VfTVNET1NfQmFsdGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DT0RFUEFHRV9NU0RPU19HcmVlazEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX0FyYWJpY19BU01PNzA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DT0RFUEFHRV9NU0RPU19XZXN0ZXJuRXVyb3BlYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NPREVQQUdFX01TRE9TX1VTfTsKIAogdWludDE2X3QgRlhfR2V0Q29kZVBhZ2VCaXQodWludDE2X3Qgd0NvZGVQYWdlKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGdfQml0MkNvZGVQYWdlKTsgKytpKSB7Ci0gICAgaWYgKGdfQml0MkNvZGVQYWdlW2ldLndDb2RlUGFnZSA9PSB3Q29kZVBhZ2UpCi0gICAgICByZXR1cm4gZ19CaXQyQ29kZVBhZ2VbaV0ud0JpdDsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZ19Db2RlUGFnZXMpOyArK2kpIHsKKyAgICBpZiAoZ19Db2RlUGFnZXNbaV0gPT0gd0NvZGVQYWdlKQorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQxNl90PihpKTsKICAgfQogICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KC0xKTsKIH0KIAotdWludDE2X3QgRlhfR2V0VW5pY29kZUJpdChGWF9XQ0hBUiB3Y1VuaWNvZGUpIHsKK3VpbnQxNl90IEZYX0dldFVuaWNvZGVCaXQod2NoYXJfdCB3Y1VuaWNvZGUpIHsKICAgY29uc3QgRkdBU19GT05UVVNCKiB4ID0gRkdBU19HZXRVbmljb2RlQml0RmllbGQod2NVbmljb2RlKTsKICAgcmV0dXJuIHggPyB4LT53Qml0RmllbGQgOiA5OTk7CiB9CkBAIC00MTYsNyArMzU5LDcgQEAKIAogY29uc3QgRlhfQklUMkNIQVJTRVQgZ19GWF9CaXQyQ2hhcnNldFs0XVsxNl0gPSB7CiAgICAge3sxIDw8IDAsIEZYX0NIQVJTRVRfQU5TSX0sCi0gICAgIHsxIDw8IDEsIEZYX0NIQVJTRVRfTVNXaW5fRWFzdGVyRXVyb3BlYW59LAorICAgICB7MSA8PCAxLCBGWF9DSEFSU0VUX01TV2luX0Vhc3Rlcm5FdXJvcGVhbn0sCiAgICAgIHsxIDw8IDIsIEZYX0NIQVJTRVRfTVNXaW5fQ3lyaWxsaWN9LAogICAgICB7MSA8PCAzLCBGWF9DSEFSU0VUX01TV2luX0dyZWVrfSwKICAgICAgezEgPDwgNCwgRlhfQ0hBUlNFVF9NU1dpbl9UdXJraXNofSwKQEAgLTQzNCw4ICszNzcsOCBAQAogICAgIHt7MSA8PCAwLCBGWF9DSEFSU0VUX1RoYWl9LAogICAgICB7MSA8PCAxLCBGWF9DSEFSU0VUX1NoaWZ0SklTfSwKICAgICAgezEgPDwgMiwgRlhfQ0hBUlNFVF9DaGluZXNlU2ltcGxpZmllZH0sCi0gICAgIHsxIDw8IDMsIEZYX0NIQVJTRVRfS29yZWFufSwKLSAgICAgezEgPDwgNCwgRlhfQ0hBUlNFVF9DaGluZXNlVHJpZGl0aW9uYWx9LAorICAgICB7MSA8PCAzLCBGWF9DSEFSU0VUX0hhbmd1bH0sCisgICAgIHsxIDw8IDQsIEZYX0NIQVJTRVRfQ2hpbmVzZVRyYWRpdGlvbmFsfSwKICAgICAgezEgPDwgNSwgRlhfQ0hBUlNFVF9Kb2hhYn0sCiAgICAgIHsxIDw8IDYsIEZYX0NIQVJTRVRfRGVmYXVsdH0sCiAgICAgIHsxIDw8IDcsIEZYX0NIQVJTRVRfRGVmYXVsdH0sCkBAIC00ODAsNiArNDIzLDI5IEBACiAgICAgIHsxIDw8IDE0LCBGWF9DSEFSU0VUX0RlZmF1bHR9LAogICAgICB7MSA8PCAxNSwgRlhfQ0hBUlNFVF9VU319fTsKIAorY29uc3RleHByIHdjaGFyX3Qga0ZvbGRlclNlcGFyYXRvciA9IEwnLyc7CisKK2V4dGVybiAiQyIgeworCit1bnNpZ25lZCBsb25nIGZ0U3RyZWFtUmVhZChGWEZUX1N0cmVhbSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQpIHsKKyAgaWYgKGNvdW50ID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgSUZYX1NlZWthYmxlUmVhZFN0cmVhbSogcEZpbGUgPQorICAgICAgc3RhdGljX2Nhc3Q8SUZYX1NlZWthYmxlUmVhZFN0cmVhbSo+KHN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyKTsKKyAgaWYgKCFwRmlsZS0+UmVhZEJsb2NrKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCkpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIGNvdW50OworfQorCit2b2lkIGZ0U3RyZWFtQ2xvc2UoRlhGVF9TdHJlYW0gc3RyZWFtKSB7fQorCit9OyAgLy8gZXh0ZXJuICJDIgorCiB9ICAvLyBuYW1lc3BhY2UKIAogQ0ZYX0ZvbnREZXNjcmlwdG9yOjpDRlhfRm9udERlc2NyaXB0b3IoKQpAQCAtNDk0LDIyICs0NjAsMjIgQEAKIAogQ0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGU6On5DRlhfRm9udFNvdXJjZUVudW1fRmlsZSgpIHt9CiAKLUNGWF9CeXRlU3RyaW5nIENGWF9Gb250U291cmNlRW51bV9GaWxlOjpHZXROZXh0RmlsZSgpIHsKK0J5dGVTdHJpbmcgQ0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGU6OkdldE5leHRGaWxlKCkgewogICBGWF9GaWxlSGFuZGxlKiBwQ3VySGFuZGxlID0KICAgICAgICFtX0ZvbGRlclF1ZXVlLmVtcHR5KCkgPyBtX0ZvbGRlclF1ZXVlLmJhY2soKS5wRmlsZUhhbmRsZSA6IG51bGxwdHI7CiAgIGlmICghcEN1ckhhbmRsZSkgewogICAgIGlmIChtX0ZvbGRlclBhdGhzLmVtcHR5KCkpCiAgICAgICByZXR1cm4gIiI7CiAgICAgcEN1ckhhbmRsZSA9IEZYX09wZW5Gb2xkZXIobV9Gb2xkZXJQYXRocy5iYWNrKCkuY19zdHIoKSk7Ci0gICAgRlhfSGFuZGxlUGFyZW50UGF0aCBocHA7CisgICAgSGFuZGxlUGFyZW50UGF0aCBocHA7CiAgICAgaHBwLnBGaWxlSGFuZGxlID0gcEN1ckhhbmRsZTsKICAgICBocHAuYnNQYXJlbnRQYXRoID0gbV9Gb2xkZXJQYXRocy5iYWNrKCk7CiAgICAgbV9Gb2xkZXJRdWV1ZS5wdXNoX2JhY2soaHBwKTsKICAgfQotICBDRlhfQnl0ZVN0cmluZyBic05hbWU7CisgIEJ5dGVTdHJpbmcgYnNOYW1lOwogICBib29sIGJGb2xkZXI7Ci0gIENGWF9CeXRlU3RyaW5nIGJzRm9sZGVyU2VwYXJhdG9yID0KLSAgICAgIENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShDRlhfV2lkZVN0cmluZyhGWF9HZXRGb2xkZXJTZXBhcmF0b3IoKSkpOworICBCeXRlU3RyaW5nIGJzRm9sZGVyU2VwYXJhdG9yID0KKyAgICAgIEJ5dGVTdHJpbmc6OkZyb21Vbmljb2RlKFdpZGVTdHJpbmcoa0ZvbGRlclNlcGFyYXRvcikpOwogICB3aGlsZSAodHJ1ZSkgewogICAgIGlmICghRlhfR2V0TmV4dEZpbGUocEN1ckhhbmRsZSwgJmJzTmFtZSwgJmJGb2xkZXIpKSB7CiAgICAgICBGWF9DbG9zZUZvbGRlcihwQ3VySGFuZGxlKTsKQEAgLTUyNiw3ICs0OTIsNyBAQAogICAgIGlmIChic05hbWUgPT0gIi4iIHx8IGJzTmFtZSA9PSAiLi4iKQogICAgICAgY29udGludWU7CiAgICAgaWYgKGJGb2xkZXIpIHsKLSAgICAgIEZYX0hhbmRsZVBhcmVudFBhdGggaHBwOworICAgICAgSGFuZGxlUGFyZW50UGF0aCBocHA7CiAgICAgICBocHAuYnNQYXJlbnRQYXRoID0KICAgICAgICAgICBtX0ZvbGRlclF1ZXVlLmJhY2soKS5ic1BhcmVudFBhdGggKyBic0ZvbGRlclNlcGFyYXRvciArIGJzTmFtZTsKICAgICAgIGhwcC5wRmlsZUhhbmRsZSA9IEZYX09wZW5Gb2xkZXIoaHBwLmJzUGFyZW50UGF0aC5jX3N0cigpKTsKQEAgLTU0MiwzNSArNTA4LDI1IEBACiAgIHJldHVybiBic05hbWU7CiB9CiAKLUZYX1BPU0lUSU9OIENGWF9Gb250U291cmNlRW51bV9GaWxlOjpHZXRTdGFydFBvc2l0aW9uKCkgeworYm9vbCBDRlhfRm9udFNvdXJjZUVudW1fRmlsZTo6SGFzU3RhcnRQb3NpdGlvbigpIHsKICAgbV93c05leHQgPSBHZXROZXh0RmlsZSgpLlVURjhEZWNvZGUoKTsKKyAgcmV0dXJuIG1fd3NOZXh0LkdldExlbmd0aCgpICE9IDA7Cit9CisKKy8vIDxuZXh0IGV4aXN0cywgc3RyZWFtIGZvciBuZXh0Pgorc3RkOjpwYWlyPGJvb2wsIFJldGFpblB0cjxJRlhfU2Vla2FibGVTdHJlYW0+PgorQ0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGU6OkdldE5leHQoKSB7CiAgIGlmIChtX3dzTmV4dC5HZXRMZW5ndGgoKSA9PSAwKQotICAgIHJldHVybiAoRlhfUE9TSVRJT04pMDsKLSAgcmV0dXJuIChGWF9QT1NJVElPTiktMTsKLX0KKyAgICByZXR1cm4ge2ZhbHNlLCBudWxscHRyfTsKIAotQ0ZYX1JldGFpblB0cjxJRlhfRmlsZUFjY2Vzcz4gQ0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGU6OkdldE5leHQoCi0gICAgRlhfUE9TSVRJT04mIHBvcykgewotICBDRlhfUmV0YWluUHRyPElGWF9GaWxlQWNjZXNzPiBwQWNjZXNzID0KLSAgICAgIElGWF9GaWxlQWNjZXNzOjpDcmVhdGVEZWZhdWx0KG1fd3NOZXh0LkFzU3RyaW5nQygpKTsKKyAgYXV0byBzdHJlYW0gPSBJRlhfU2Vla2FibGVTdHJlYW06OkNyZWF0ZUZyb21GaWxlbmFtZShtX3dzTmV4dC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZJTEVNT0RFX1JlYWRPbmx5KTsKICAgbV93c05leHQgPSBHZXROZXh0RmlsZSgpLlVURjhEZWNvZGUoKTsKLSAgcG9zID0gbV93c05leHQuR2V0TGVuZ3RoKCkgIT0gMCA/IHBBY2Nlc3MuR2V0KCkgOiBudWxscHRyOwotICByZXR1cm4gcEFjY2VzczsKKyAgcmV0dXJuIHt0cnVlLCBzdHJlYW19OwogfQogCi1zdGQ6OnVuaXF1ZV9wdHI8Q0ZHQVNfRm9udE1ncj4gQ0ZHQVNfRm9udE1ncjo6Q3JlYXRlKAotICAgIENGWF9Gb250U291cmNlRW51bV9GaWxlKiBwRm9udEVudW0pIHsKLSAgaWYgKCFwRm9udEVudW0pCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgYXV0byBwRm9udE1nciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRkdBU19Gb250TWdyPihwRm9udEVudW0pOwotICBpZiAoIXBGb250TWdyLT5FbnVtRm9udHMoKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIHBGb250TWdyOwotfQotCi1DRkdBU19Gb250TWdyOjpDRkdBU19Gb250TWdyKENGWF9Gb250U291cmNlRW51bV9GaWxlKiBwRm9udEVudW0pCi0gICAgOiBtX3BGb250U291cmNlKHBGb250RW51bSkge30KK0NGR0FTX0ZvbnRNZ3I6OkNGR0FTX0ZvbnRNZ3IoKQorICAgIDogbV9wRm9udFNvdXJjZShwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGU+KCkpIHt9CiAKIENGR0FTX0ZvbnRNZ3I6On5DRkdBU19Gb250TWdyKCkge30KIApAQCAtNTg2LDEzICs1NDIsMTMgQEAKIAogICBwU3lzdGVtRm9udEluZm8tPkVudW1Gb250TGlzdChwRm9udE1hcHBlcik7CiAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHBGb250TWFwcGVyLT5HZXRGYWNlU2l6ZSgpOyArK2kpIHsKLSAgICBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IHBGb250U3RyZWFtID0KKyAgICBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gcEZvbnRTdHJlYW0gPQogICAgICAgICBDcmVhdGVGb250U3RyZWFtKHBGb250TWFwcGVyLCBwU3lzdGVtRm9udEluZm8sIGkpOwogICAgIGlmICghcEZvbnRTdHJlYW0pCiAgICAgICBjb250aW51ZTsKIAotICAgIENGWF9XaWRlU3RyaW5nIHdzRmFjZU5hbWUgPQotICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKHBGb250TWFwcGVyLT5HZXRGYWNlTmFtZShpKS5jX3N0cigpKTsKKyAgICBXaWRlU3RyaW5nIHdzRmFjZU5hbWUgPQorICAgICAgICBXaWRlU3RyaW5nOjpGcm9tTG9jYWwocEZvbnRNYXBwZXItPkdldEZhY2VOYW1lKGkpLmNfc3RyKCkpOwogICAgIFJlZ2lzdGVyRmFjZXMocEZvbnRTdHJlYW0sICZ3c0ZhY2VOYW1lKTsKICAgfQogICByZXR1cm4gIW1fSW5zdGFsbGVkRm9udHMuZW1wdHkoKTsKQEAgLTYwMCwxMyArNTU2LDE2IEBACiAKIGJvb2wgQ0ZHQVNfRm9udE1ncjo6RW51bUZvbnRzRnJvbUZpbGVzKCkgewogICBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCktPkluaXRGVExpYnJhcnkoKTsKLSAgRlhfUE9TSVRJT04gcG9zID0gbV9wRm9udFNvdXJjZS0+R2V0U3RhcnRQb3NpdGlvbigpOwotICB3aGlsZSAocG9zKSB7Ci0gICAgQ0ZYX1JldGFpblB0cjxJRlhfRmlsZUFjY2Vzcz4gcEZvbnRTb3VyY2UgPSBtX3BGb250U291cmNlLT5HZXROZXh0KHBvcyk7Ci0gICAgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBwRm9udFN0cmVhbSA9Ci0gICAgICAgIHBGb250U291cmNlLT5DcmVhdGVGaWxlU3RyZWFtKEZYX0ZJTEVNT0RFX1JlYWRPbmx5KTsKLSAgICBpZiAocEZvbnRTdHJlYW0pCi0gICAgICBSZWdpc3RlckZhY2VzKHBGb250U3RyZWFtLCBudWxscHRyKTsKKyAgaWYgKCFtX3BGb250U291cmNlLT5IYXNTdGFydFBvc2l0aW9uKCkpCisgICAgcmV0dXJuICFtX0luc3RhbGxlZEZvbnRzLmVtcHR5KCk7CisKKyAgYm9vbCBoYXNfbmV4dDsKKyAgUmV0YWluUHRyPElGWF9TZWVrYWJsZVN0cmVhbT4gc3RyZWFtOworICBzdGQ6OnRpZShoYXNfbmV4dCwgc3RyZWFtKSA9IG1fcEZvbnRTb3VyY2UtPkdldE5leHQoKTsKKyAgd2hpbGUgKGhhc19uZXh0KSB7CisgICAgaWYgKHN0cmVhbSkKKyAgICAgIFJlZ2lzdGVyRmFjZXMoc3RyZWFtLCBudWxscHRyKTsKKyAgICBzdGQ6OnRpZShoYXNfbmV4dCwgc3RyZWFtKSA9IG1fcEZvbnRTb3VyY2UtPkdldE5leHQoKTsKICAgfQogICByZXR1cm4gIW1fSW5zdGFsbGVkRm9udHMuZW1wdHkoKTsKIH0KQEAgLTYxNSw5OSArNTc0LDkgQEAKICAgcmV0dXJuIEVudW1Gb250c0Zyb21Gb250TWFwcGVyKCkgfHwgRW51bUZvbnRzRnJvbUZpbGVzKCk7CiB9CiAKLUNGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBDRkdBU19Gb250TWdyOjpMb2FkRm9udCgKLSAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwKLSAgICB1aW50MzJfdCBkd0ZvbnRTdHlsZXMsCi0gICAgdWludDE2X3Qgd0NvZGVQYWdlKSB7Ci0gIHJldHVybiBHZXRGb250QnlDb2RlUGFnZSh3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcywgcHN6Rm9udEZhbWlseSk7Ci19Ci0KLUNGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBDRkdBU19Gb250TWdyOjpHZXRGb250QnlDb2RlUGFnZSgKLSAgICB1aW50MTZfdCB3Q29kZVBhZ2UsCi0gICAgdWludDMyX3QgZHdGb250U3R5bGVzLAotICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5KSB7Ci0gIENGWF9CeXRlU3RyaW5nIGJzSGFzaDsKLSAgYnNIYXNoLkZvcm1hdCgiJWQsICVkIiwgd0NvZGVQYWdlLCBkd0ZvbnRTdHlsZXMpOwotICBic0hhc2ggKz0gRlhfVVRGOEVuY29kZShDRlhfV2lkZVN0cmluZ0MocHN6Rm9udEZhbWlseSkpOwotICB1aW50MzJfdCBkd0hhc2ggPSBGWF9IYXNoQ29kZV9HZXRBKGJzSGFzaC5Bc1N0cmluZ0MoKSwgZmFsc2UpOwotICBzdGQ6OnZlY3RvcjxDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4+KiBwRm9udEFycmF5ID0gJm1fSGFzaDJGb250c1tkd0hhc2hdOwotICBpZiAoIXBGb250QXJyYXktPmVtcHR5KCkpCi0gICAgcmV0dXJuICgqcEZvbnRBcnJheSlbMF07Ci0KLSAgc3RkOjp2ZWN0b3I8Q0ZYX0ZvbnREZXNjcmlwdG9ySW5mbz4qIHNvcnRlZEZvbnRJbmZvcyA9Ci0gICAgICBtX0hhc2gyQ2FuZGlkYXRlTGlzdFtkd0hhc2hdLmdldCgpOwotICBpZiAoIXNvcnRlZEZvbnRJbmZvcykgewotICAgIGF1dG8gcE5ld0ZvbnRzID0gcGRmaXVtOjpNYWtlVW5pcXVlPHN0ZDo6dmVjdG9yPENGWF9Gb250RGVzY3JpcHRvckluZm8+PigpOwotICAgIHNvcnRlZEZvbnRJbmZvcyA9IHBOZXdGb250cy5nZXQoKTsKLSAgICBNYXRjaEZvbnRzKHNvcnRlZEZvbnRJbmZvcywgd0NvZGVQYWdlLCBkd0ZvbnRTdHlsZXMsCi0gICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyhwc3pGb250RmFtaWx5KSwgMCk7Ci0gICAgbV9IYXNoMkNhbmRpZGF0ZUxpc3RbZHdIYXNoXSA9IHN0ZDo6bW92ZShwTmV3Rm9udHMpOwotICB9Ci0gIGlmIChzb3J0ZWRGb250SW5mb3MtPmVtcHR5KCkpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgQ0ZYX0ZvbnREZXNjcmlwdG9yKiBwRGVzYyA9ICgqc29ydGVkRm9udEluZm9zKVswXS5wRm9udDsKLSAgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IHBGb250ID0KLSAgICAgIExvYWRGb250KHBEZXNjLT5tX3dzRmFjZU5hbWUsIHBEZXNjLT5tX25GYWNlSW5kZXgsIG51bGxwdHIpOwotICBpZiAoIXBGb250KQotICAgIHJldHVybiBudWxscHRyOwotCi0gIHBGb250LT5TZXRMb2dpY2FsRm9udFN0eWxlKGR3Rm9udFN0eWxlcyk7Ci0gIHBGb250QXJyYXktPnB1c2hfYmFjayhwRm9udCk7Ci0gIHJldHVybiBwRm9udDsKLX0KLQotQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IENGR0FTX0ZvbnRNZ3I6OkdldEZvbnRCeVVuaWNvZGUoCi0gICAgRlhfV0NIQVIgd1VuaWNvZGUsCi0gICAgdWludDMyX3QgZHdGb250U3R5bGVzLAotICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5KSB7Ci0gIGlmIChwZGZpdW06OkNvbnRhaW5zS2V5KG1fRmFpbGVkVW5pY29kZXNTZXQsIHdVbmljb2RlKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBjb25zdCBGR0FTX0ZPTlRVU0IqIHggPSBGR0FTX0dldFVuaWNvZGVCaXRGaWVsZCh3VW5pY29kZSk7Ci0gIHVpbnQxNl90IHdDb2RlUGFnZSA9IHggPyB4LT53Q29kZVBhZ2UgOiAweEZGRkY7Ci0gIHVpbnQxNl90IHdCaXRGaWVsZCA9IHggPyB4LT53Qml0RmllbGQgOiAweDAzRTc7Ci0gIENGWF9CeXRlU3RyaW5nIGJzSGFzaDsKLSAgaWYgKHdDb2RlUGFnZSA9PSAweEZGRkYpCi0gICAgYnNIYXNoLkZvcm1hdCgiJWQsICVkLCAlZCIsIHdDb2RlUGFnZSwgd0JpdEZpZWxkLCBkd0ZvbnRTdHlsZXMpOwotICBlbHNlCi0gICAgYnNIYXNoLkZvcm1hdCgiJWQsICVkIiwgd0NvZGVQYWdlLCBkd0ZvbnRTdHlsZXMpOwotICBic0hhc2ggKz0gRlhfVVRGOEVuY29kZShDRlhfV2lkZVN0cmluZ0MocHN6Rm9udEZhbWlseSkpOwotICB1aW50MzJfdCBkd0hhc2ggPSBGWF9IYXNoQ29kZV9HZXRBKGJzSGFzaC5Bc1N0cmluZ0MoKSwgZmFsc2UpOwotICBzdGQ6OnZlY3RvcjxDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4+KiBwRm9udHMgPSAmbV9IYXNoMkZvbnRzW2R3SGFzaF07Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcEZvbnRzLT5zaXplKCk7ICsraSkgewotICAgIGlmIChWZXJpZnlVbmljb2RlKCgqcEZvbnRzKVtpXSwgd1VuaWNvZGUpKQotICAgICAgcmV0dXJuICgqcEZvbnRzKVtpXTsKLSAgfQotICBzdGQ6OnZlY3RvcjxDRlhfRm9udERlc2NyaXB0b3JJbmZvPiogc29ydGVkRm9udEluZm9zID0KLSAgICAgIG1fSGFzaDJDYW5kaWRhdGVMaXN0W2R3SGFzaF0uZ2V0KCk7Ci0gIGlmICghc29ydGVkRm9udEluZm9zKSB7Ci0gICAgYXV0byBwTmV3Rm9udHMgPSBwZGZpdW06Ok1ha2VVbmlxdWU8c3RkOjp2ZWN0b3I8Q0ZYX0ZvbnREZXNjcmlwdG9ySW5mbz4+KCk7Ci0gICAgc29ydGVkRm9udEluZm9zID0gcE5ld0ZvbnRzLmdldCgpOwotICAgIE1hdGNoRm9udHMoc29ydGVkRm9udEluZm9zLCB3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcywKLSAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nKHBzekZvbnRGYW1pbHkpLCB3VW5pY29kZSk7Ci0gICAgbV9IYXNoMkNhbmRpZGF0ZUxpc3RbZHdIYXNoXSA9IHN0ZDo6bW92ZShwTmV3Rm9udHMpOwotICB9Ci0gIGZvciAoY29uc3QgYXV0byYgaW5mbyA6ICpzb3J0ZWRGb250SW5mb3MpIHsKLSAgICBDRlhfRm9udERlc2NyaXB0b3IqIHBEZXNjID0gaW5mby5wRm9udDsKLSAgICBpZiAoIVZlcmlmeVVuaWNvZGUocERlc2MsIHdVbmljb2RlKSkKLSAgICAgIGNvbnRpbnVlOwotICAgIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBwRm9udCA9Ci0gICAgICAgIExvYWRGb250KHBEZXNjLT5tX3dzRmFjZU5hbWUsIHBEZXNjLT5tX25GYWNlSW5kZXgsIG51bGxwdHIpOwotICAgIGlmICghcEZvbnQpCi0gICAgICBjb250aW51ZTsKLSAgICBwRm9udC0+U2V0TG9naWNhbEZvbnRTdHlsZShkd0ZvbnRTdHlsZXMpOwotICAgIHBGb250cy0+cHVzaF9iYWNrKHBGb250KTsKLSAgICByZXR1cm4gcEZvbnQ7Ci0gIH0KLSAgaWYgKCFwc3pGb250RmFtaWx5KQotICAgIG1fRmFpbGVkVW5pY29kZXNTZXQuaW5zZXJ0KHdVbmljb2RlKTsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KIGJvb2wgQ0ZHQVNfRm9udE1ncjo6VmVyaWZ5VW5pY29kZShDRlhfRm9udERlc2NyaXB0b3IqIHBEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHdjVW5pY29kZSkgewotICBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IHBGaWxlUmVhZCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCB3Y1VuaWNvZGUpIHsKKyAgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IHBGaWxlUmVhZCA9CiAgICAgICBDcmVhdGVGb250U3RyZWFtKHBEZXNjLT5tX3dzRmFjZU5hbWUuVVRGOEVuY29kZSgpKTsKICAgaWYgKCFwRmlsZVJlYWQpCiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNzI1LDI3ICs1OTQsOSBAQAogICByZXR1cm4gIXJldENoYXJtYXAgJiYgcmV0SW5kZXg7CiB9CiAKLWJvb2wgQ0ZHQVNfRm9udE1ncjo6VmVyaWZ5VW5pY29kZShjb25zdCBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4mIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHdjVW5pY29kZSkgewotICBpZiAoIXBGb250KQotICAgIHJldHVybiBmYWxzZTsKLQotICBGWEZUX0ZhY2UgcEZhY2UgPSBwRm9udC0+R2V0RGV2Rm9udCgpLT5HZXRGYWNlKCk7Ci0gIEZYRlRfQ2hhck1hcCBjaGFybWFwID0gRlhGVF9HZXRfRmFjZV9DaGFybWFwKHBGYWNlKTsKLSAgaWYgKEZYRlRfU2VsZWN0X0NoYXJtYXAocEZhY2UsIEZYRlRfRU5DT0RJTkdfVU5JQ09ERSkgIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKEZYRlRfR2V0X0NoYXJfSW5kZXgocEZhY2UsIHdjVW5pY29kZSkgPT0gMCkgewotICAgIEZYRlRfU2V0X0NoYXJtYXAocEZhY2UsIGNoYXJtYXApOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IENGR0FTX0ZvbnRNZ3I6OkxvYWRGb250KAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0ZhY2VOYW1lLAotICAgIGludDMyX3QgaUZhY2VJbmRleCwKLSAgICBpbnQzMl90KiBwRmFjZUNvdW50KSB7CitSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBDRkdBU19Gb250TWdyOjpMb2FkRm9udChjb25zdCBXaWRlU3RyaW5nJiB3c0ZhY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmFjZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcEZhY2VDb3VudCkgewogICBDRlhfRm9udE1nciogcEZvbnRNZ3IgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCk7CiAgIENGWF9Gb250TWFwcGVyKiBwRm9udE1hcHBlciA9IHBGb250TWdyLT5HZXRCdWlsdGluTWFwcGVyKCk7CiAgIGlmICghcEZvbnRNYXBwZXIpCkBAIC03NTUsNyArNjA2LDcgQEAKICAgaWYgKCFwU3lzdGVtRm9udEluZm8pCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBwRm9udFN0cmVhbSA9CisgIFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBwRm9udFN0cmVhbSA9CiAgICAgICBDcmVhdGVGb250U3RyZWFtKHdzRmFjZU5hbWUuVVRGOEVuY29kZSgpKTsKICAgaWYgKCFwRm9udFN0cmVhbSkKICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTc2NCw3ICs2MTUsNyBAQAogICBpZiAoIXBJbnRlcm5hbEZvbnQtPkxvYWRGaWxlKHBGb250U3RyZWFtLCBpRmFjZUluZGV4KSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAotICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gcEZvbnQgPQorICBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBwRm9udCA9CiAgICAgICBDRkdBU19HRUZvbnQ6OkxvYWRGb250KHN0ZDo6bW92ZShwSW50ZXJuYWxGb250KSwgdGhpcyk7CiAgIGlmICghcEZvbnQpCiAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC03NzUsMjkgKzYyNiw4IEBACiAgIHJldHVybiBwRm9udDsKIH0KIAotZXh0ZXJuICJDIiB7Ci0KLXVuc2lnbmVkIGxvbmcgX2Z0U3RyZWFtUmVhZChGWEZUX1N0cmVhbSBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgY291bnQpIHsKLSAgaWYgKGNvdW50ID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgSUZYX1NlZWthYmxlUmVhZFN0cmVhbSogcEZpbGUgPQotICAgICAgc3RhdGljX2Nhc3Q8SUZYX1NlZWthYmxlUmVhZFN0cmVhbSo+KHN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyKTsKLSAgaWYgKCFwRmlsZS0+UmVhZEJsb2NrKGJ1ZmZlciwgb2Zmc2V0LCBjb3VudCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgcmV0dXJuIGNvdW50OwotfQotCi12b2lkIF9mdFN0cmVhbUNsb3NlKEZYRlRfU3RyZWFtIHN0cmVhbSkge30KLQotfTsgIC8vIGV4dGVybiAiQyIKLQogRlhGVF9GYWNlIENGR0FTX0ZvbnRNZ3I6OkxvYWRGYWNlKAotICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBGb250U3RyZWFtLAorICAgIGNvbnN0IFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZvbnRTdHJlYW0sCiAgICAgaW50MzJfdCBpRmFjZUluZGV4KSB7CiAgIGlmICghcEZvbnRTdHJlYW0pCiAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC04MDksMjMgKzYzOSwyOCBAQAogICBpZiAoIWxpYnJhcnkpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgRlhGVF9TdHJlYW0gZnRTdHJlYW0gPSBGWF9BbGxvYyhGWEZUX1N0cmVhbVJlYywgMSk7Ci0gIEZYU1lTX21lbXNldChmdFN0cmVhbSwgMCwgc2l6ZW9mKEZYRlRfU3RyZWFtUmVjKSk7CisgIC8vIFRPRE8ocGFsbWVyKTogVGhpcyBtZW1vcnkgd2lsbCBiZSBmcmVlZCB3aXRoIHxmdF9mcmVlfCAod2hpY2ggaXMgfGZyZWV8KS4KKyAgLy8gVWx0aW1hdGVseSwgd2Ugd2FudCB0byBjaGFuZ2UgdGhpcyB0bzoKKyAgLy8gICBGWEZUX1N0cmVhbSBmdFN0cmVhbSA9IEZYX0FsbG9jKEZYRlRfU3RyZWFtUmVjLCAxKTsKKyAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3BkZml1bS9pc3N1ZXMvZGV0YWlsP2lkPTY5MAorICBGWEZUX1N0cmVhbSBmdFN0cmVhbSA9CisgICAgICBzdGF0aWNfY2FzdDxGWEZUX1N0cmVhbT4oZnRfc2NhbGxvYyhzaXplb2YoRlhGVF9TdHJlYW1SZWMpLCAxKSk7CisgIG1lbXNldChmdFN0cmVhbSwgMCwgc2l6ZW9mKEZYRlRfU3RyZWFtUmVjKSk7CiAgIGZ0U3RyZWFtLT5iYXNlID0gbnVsbHB0cjsKICAgZnRTdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlciA9IHN0YXRpY19jYXN0PHZvaWQqPihwRm9udFN0cmVhbS5HZXQoKSk7CiAgIGZ0U3RyZWFtLT5wb3MgPSAwOwogICBmdFN0cmVhbS0+c2l6ZSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KHBGb250U3RyZWFtLT5HZXRTaXplKCkpOwotICBmdFN0cmVhbS0+cmVhZCA9IF9mdFN0cmVhbVJlYWQ7Ci0gIGZ0U3RyZWFtLT5jbG9zZSA9IF9mdFN0cmVhbUNsb3NlOworICBmdFN0cmVhbS0+cmVhZCA9IGZ0U3RyZWFtUmVhZDsKKyAgZnRTdHJlYW0tPmNsb3NlID0gZnRTdHJlYW1DbG9zZTsKIAogICBGWEZUX09wZW5fQXJncyBmdEFyZ3M7Ci0gIEZYU1lTX21lbXNldCgmZnRBcmdzLCAwLCBzaXplb2YoRlhGVF9PcGVuX0FyZ3MpKTsKKyAgbWVtc2V0KCZmdEFyZ3MsIDAsIHNpemVvZihGWEZUX09wZW5fQXJncykpOwogICBmdEFyZ3MuZmxhZ3MgfD0gRlRfT1BFTl9TVFJFQU07CiAgIGZ0QXJncy5zdHJlYW0gPSBmdFN0cmVhbTsKIAogICBGWEZUX0ZhY2UgcEZhY2UgPSBudWxscHRyOwogICBpZiAoRlhGVF9PcGVuX0ZhY2UobGlicmFyeSwgJmZ0QXJncywgaUZhY2VJbmRleCwgJnBGYWNlKSkgewotICAgIEZYX0ZyZWUoZnRTdHJlYW0pOworICAgIGZ0X3NmcmVlKGZ0U3RyZWFtKTsKICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQogCkBAIC04MzMsMTQgKzY2OCwxMiBAQAogICByZXR1cm4gcEZhY2U7CiB9CiAKLUNGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gQ0ZHQVNfRm9udE1ncjo6Q3JlYXRlRm9udFN0cmVhbSgKK1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBDRkdBU19Gb250TWdyOjpDcmVhdGVGb250U3RyZWFtKAogICAgIENGWF9Gb250TWFwcGVyKiBwRm9udE1hcHBlciwKICAgICBJRlhfU3lzdGVtRm9udEluZm8qIHBTeXN0ZW1Gb250SW5mbywKICAgICB1aW50MzJfdCBpbmRleCkgewotICBpbnQgaUV4YWN0ID0gMDsKLSAgdm9pZCogaEZvbnQgPQotICAgICAgcFN5c3RlbUZvbnRJbmZvLT5NYXBGb250KDAsIDAsIEZYRk9OVF9ERUZBVUxUX0NIQVJTRVQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvbnRNYXBwZXItPkdldEZhY2VOYW1lKGluZGV4KS5jX3N0cigpLCBpRXhhY3QpOworICB2b2lkKiBoRm9udCA9IHBTeXN0ZW1Gb250SW5mby0+TWFwRm9udCgKKyAgICAgIDAsIDAsIEZYX0NIQVJTRVRfRGVmYXVsdCwgMCwgcEZvbnRNYXBwZXItPkdldEZhY2VOYW1lKGluZGV4KS5jX3N0cigpKTsKICAgaWYgKCFoRm9udCkKICAgICByZXR1cm4gbnVsbHB0cjsKIApAQCAtODUxLDExICs2ODQsMTEgQEAKICAgdWludDhfdCogcEJ1ZmZlciA9IEZYX0FsbG9jKHVpbnQ4X3QsIGR3RmlsZVNpemUgKyAxKTsKICAgZHdGaWxlU2l6ZSA9IHBTeXN0ZW1Gb250SW5mby0+R2V0Rm9udERhdGEoaEZvbnQsIDAsIHBCdWZmZXIsIGR3RmlsZVNpemUpOwogCi0gIHJldHVybiBJRlhfTWVtb3J5U3RyZWFtOjpDcmVhdGUocEJ1ZmZlciwgZHdGaWxlU2l6ZSwgdHJ1ZSk7CisgIHJldHVybiBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX01lbW9yeVN0cmVhbT4ocEJ1ZmZlciwgZHdGaWxlU2l6ZSwgdHJ1ZSk7CiB9CiAKLUNGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gQ0ZHQVNfRm9udE1ncjo6Q3JlYXRlRm9udFN0cmVhbSgKLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgYnNGYWNlTmFtZSkgeworUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IENGR0FTX0ZvbnRNZ3I6OkNyZWF0ZUZvbnRTdHJlYW0oCisgICAgY29uc3QgQnl0ZVN0cmluZyYgYnNGYWNlTmFtZSkgewogICBDRlhfRm9udE1nciogcEZvbnRNZ3IgPSBDRlhfR0VNb2R1bGU6OkdldCgpLT5HZXRGb250TWdyKCk7CiAgIENGWF9Gb250TWFwcGVyKiBwRm9udE1hcHBlciA9IHBGb250TWdyLT5HZXRCdWlsdGluTWFwcGVyKCk7CiAgIGlmICghcEZvbnRNYXBwZXIpCkBAIC04NzcsOCArNzEwLDggQEAKICAgICBzdGQ6OnZlY3RvcjxDRlhfRm9udERlc2NyaXB0b3JJbmZvPiogcE1hdGNoZWRGb250cywKICAgICB1aW50MTZfdCB3Q29kZVBhZ2UsCiAgICAgdWludDMyX3QgZHdGb250U3R5bGVzLAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBGb250TmFtZSwKLSAgICBGWF9XQ0hBUiB3Y1VuaWNvZGUpIHsKKyAgICBjb25zdCBXaWRlU3RyaW5nJiBGb250TmFtZSwKKyAgICB3Y2hhcl90IHdjVW5pY29kZSkgewogICBwTWF0Y2hlZEZvbnRzLT5jbGVhcigpOwogICBmb3IgKGNvbnN0IGF1dG8mIHBGb250IDogbV9JbnN0YWxsZWRGb250cykgewogICAgIGludDMyX3QgblBlbmFsdHkgPQpAQCAtODk1LDggKzcyOCw4IEBACiBpbnQzMl90IENGR0FTX0ZvbnRNZ3I6OkNhbGNQZW5hbHR5KENGWF9Gb250RGVzY3JpcHRvciogcEluc3RhbGxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd0NvZGVQYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZvbnRTdHlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBGb250TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgd2NVbmljb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIEZvbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90IHdjVW5pY29kZSkgewogICBpbnQzMl90IG5QZW5hbHR5ID0gMzAwMDA7CiAgIGlmIChGb250TmFtZS5HZXRMZW5ndGgoKSAhPSAwKSB7CiAgICAgaWYgKEZvbnROYW1lICE9IHBJbnN0YWxsZWQtPm1fd3NGYWNlTmFtZSkgewpAQCAtOTI4LDIwICs3NjEsMjAgQEAKICAgICB9CiAgIH0KICAgdWludDMyX3QgZHdTdHlsZU1hc2sgPSBwSW5zdGFsbGVkLT5tX2R3Rm9udFN0eWxlcyBeIGR3Rm9udFN0eWxlczsKLSAgaWYgKGR3U3R5bGVNYXNrICYgRlhfRk9OVFNUWUxFX0JvbGQpCisgIGlmIChGb250U3R5bGVJc0JvbGQoZHdTdHlsZU1hc2spKQogICAgIG5QZW5hbHR5ICs9IDQ1MDA7Ci0gIGlmIChkd1N0eWxlTWFzayAmIEZYX0ZPTlRTVFlMRV9GaXhlZFBpdGNoKQorICBpZiAoRm9udFN0eWxlSXNGaXhlZFBpdGNoKGR3U3R5bGVNYXNrKSkKICAgICBuUGVuYWx0eSArPSAxMDAwMDsKLSAgaWYgKGR3U3R5bGVNYXNrICYgRlhfRk9OVFNUWUxFX0l0YWxpYykKKyAgaWYgKEZvbnRTdHlsZUlzSXRhbGljKGR3U3R5bGVNYXNrKSkKICAgICBuUGVuYWx0eSArPSAxMDAwMDsKLSAgaWYgKGR3U3R5bGVNYXNrICYgRlhfRk9OVFNUWUxFX1NlcmlmKQorICBpZiAoRm9udFN0eWxlSXNTZXJpZihkd1N0eWxlTWFzaykpCiAgICAgblBlbmFsdHkgKz0gNTAwOwotICBpZiAoZHdTdHlsZU1hc2sgJiBGWF9GT05UU1RZTEVfU3ltYm9saWMpCisgIGlmIChGb250U3R5bGVJc1N5bWJvbGljKGR3U3R5bGVNYXNrKSkKICAgICBuUGVuYWx0eSArPSAweEZGRkY7CiAgIGlmIChuUGVuYWx0eSA+PSAweEZGRkYpCiAgICAgcmV0dXJuIDB4RkZGRjsKIAotICB1aW50MTZfdCB3Qml0ID0gKHdDb2RlUGFnZSA9PSAwIHx8IHdDb2RlUGFnZSA9PSAweEZGRkYpCisgIHVpbnQxNl90IHdCaXQgPSAod0NvZGVQYWdlID09IEZYX0NPREVQQUdFX0RlZkFOU0kgfHwgd0NvZGVQYWdlID09IDB4RkZGRikKICAgICAgICAgICAgICAgICAgICAgICA/IHN0YXRpY19jYXN0PHVpbnQxNl90PigtMSkKICAgICAgICAgICAgICAgICAgICAgICA6IEZYX0dldENvZGVQYWdlQml0KHdDb2RlUGFnZSk7CiAgIGlmICh3Qml0ICE9IHN0YXRpY19jYXN0PHVpbnQxNl90PigtMSkpIHsKQEAgLTk2MywzNSArNzk2LDEzIEBACiAgIHJldHVybiBuUGVuYWx0eTsKIH0KIAotdm9pZCBDRkdBU19Gb250TWdyOjpSZW1vdmVGb250KGNvbnN0IENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiYgcEVGb250KSB7Ci0gIGlmICghcEVGb250KQotICAgIHJldHVybjsKLQotICBtX0lGWEZvbnQyRmlsZVJlYWQuZXJhc2UocEVGb250KTsKLQotICBhdXRvIGl0ZXIgPSBtX0hhc2gyRm9udHMuYmVnaW4oKTsKLSAgd2hpbGUgKGl0ZXIgIT0gbV9IYXNoMkZvbnRzLmVuZCgpKSB7Ci0gICAgYXV0byBvbGRfaXRlciA9IGl0ZXIrKzsKLSAgICBib29sIGFsbF9lbXB0eSA9IHRydWU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvbGRfaXRlci0+c2Vjb25kLnNpemUoKTsgaSsrKSB7Ci0gICAgICBpZiAob2xkX2l0ZXItPnNlY29uZFtpXSA9PSBwRUZvbnQpCi0gICAgICAgIG9sZF9pdGVyLT5zZWNvbmRbaV0uUmVzZXQoKTsKLSAgICAgIGVsc2UgaWYgKG9sZF9pdGVyLT5zZWNvbmRbaV0pCi0gICAgICAgIGFsbF9lbXB0eSA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAoYWxsX2VtcHR5KQotICAgICAgbV9IYXNoMkZvbnRzLmVyYXNlKG9sZF9pdGVyKTsKLSAgfQotfQotCi12b2lkIENGR0FTX0ZvbnRNZ3I6OlJlZ2lzdGVyRmFjZShGWEZUX0ZhY2UgcEZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyogcEZhY2VOYW1lKSB7Cit2b2lkIENGR0FTX0ZvbnRNZ3I6OlJlZ2lzdGVyRmFjZShGWEZUX0ZhY2UgcEZhY2UsIGNvbnN0IFdpZGVTdHJpbmcqIHBGYWNlTmFtZSkgewogICBpZiAoKHBGYWNlLT5mYWNlX2ZsYWdzICYgRlRfRkFDRV9GTEFHX1NDQUxBQkxFKSA9PSAwKQogICAgIHJldHVybjsKIAogICBhdXRvIHBGb250ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9Gb250RGVzY3JpcHRvcj4oKTsKLSAgcEZvbnQtPm1fZHdGb250U3R5bGVzIHw9IEZYRlRfSXNfRmFjZV9Cb2xkKHBGYWNlKSA/IEZYX0ZPTlRTVFlMRV9Cb2xkIDogMDsKLSAgcEZvbnQtPm1fZHdGb250U3R5bGVzIHw9IEZYRlRfSXNfRmFjZV9JdGFsaWMocEZhY2UpID8gRlhfRk9OVFNUWUxFX0l0YWxpYyA6IDA7CisgIHBGb250LT5tX2R3Rm9udFN0eWxlcyB8PSBGWEZUX0lzX0ZhY2VfQm9sZChwRmFjZSkgPyBGWEZPTlRfQk9MRCA6IDA7CisgIHBGb250LT5tX2R3Rm9udFN0eWxlcyB8PSBGWEZUX0lzX0ZhY2VfSXRhbGljKHBGYWNlKSA/IEZYRk9OVF9JVEFMSUMgOiAwOwogICBwRm9udC0+bV9kd0ZvbnRTdHlsZXMgfD0gR2V0RmxhZ3MocEZhY2UpOwogCiAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiBjaGFyc2V0cyA9IEdldENoYXJzZXRzKHBGYWNlKTsKQEAgLTEwMDksMTggKzgyMCwxNyBAQAogICAgICAgdGFibGUuY2xlYXIoKTsKICAgfQogICBHZXROYW1lcyh0YWJsZS5lbXB0eSgpID8gbnVsbHB0ciA6IHRhYmxlLmRhdGEoKSwgcEZvbnQtPm1fd3NGYW1pbHlOYW1lcyk7Ci0gIHBGb250LT5tX3dzRmFtaWx5TmFtZXMucHVzaF9iYWNrKAotICAgICAgQ0ZYX0J5dGVTdHJpbmcocEZhY2UtPmZhbWlseV9uYW1lKS5VVEY4RGVjb2RlKCkpOworICBwRm9udC0+bV93c0ZhbWlseU5hbWVzLnB1c2hfYmFjayhCeXRlU3RyaW5nKHBGYWNlLT5mYW1pbHlfbmFtZSkuVVRGOERlY29kZSgpKTsKICAgcEZvbnQtPm1fd3NGYWNlTmFtZSA9CiAgICAgICBwRmFjZU5hbWUgPyAqcEZhY2VOYW1lCi0gICAgICAgICAgICAgICAgOiBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKEZYRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZShwRmFjZSkpOworICAgICAgICAgICAgICAgIDogV2lkZVN0cmluZzo6RnJvbUxvY2FsKEZYRlRfR2V0X1Bvc3RzY3JpcHRfTmFtZShwRmFjZSkpOwogICBwRm9udC0+bV9uRmFjZUluZGV4ID0gcEZhY2UtPmZhY2VfaW5kZXg7CiAgIG1fSW5zdGFsbGVkRm9udHMucHVzaF9iYWNrKHN0ZDo6bW92ZShwRm9udCkpOwogfQogCiB2b2lkIENGR0FTX0ZvbnRNZ3I6OlJlZ2lzdGVyRmFjZXMoCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZvbnRTdHJlYW0sCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcqIHBGYWNlTmFtZSkgeworICAgIGNvbnN0IFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZvbnRTdHJlYW0sCisgICAgY29uc3QgV2lkZVN0cmluZyogcEZhY2VOYW1lKSB7CiAgIGludDMyX3QgaW5kZXggPSAwOwogICBpbnQzMl90IG51bV9mYWNlcyA9IDA7CiAgIGRvIHsKQEAgLTEwNDAsMjggKzg1MCwyOCBAQAogdWludDMyX3QgQ0ZHQVNfRm9udE1ncjo6R2V0RmxhZ3MoRlhGVF9GYWNlIHBGYWNlKSB7CiAgIHVpbnQzMl90IGZsYWcgPSAwOwogICBpZiAoRlRfSVNfRklYRURfV0lEVEgocEZhY2UpKQotICAgIGZsYWcgfD0gRlhfRk9OVFNUWUxFX0ZpeGVkUGl0Y2g7CisgICAgZmxhZyB8PSBGWEZPTlRfRklYRURfUElUQ0g7CiAgIFRUX09TMiogcE9TMiA9IChUVF9PUzIqKUZUX0dldF9TZm50X1RhYmxlKHBGYWNlLCBmdF9zZm50X29zMik7CiAgIGlmICghcE9TMikKICAgICByZXR1cm4gZmxhZzsKIAogICBpZiAocE9TMi0+dWxDb2RlUGFnZVJhbmdlMSAmICgxIDw8IDMxKSkKLSAgICBmbGFnIHw9IEZYX0ZPTlRTVFlMRV9TeW1ib2xpYzsKKyAgICBmbGFnIHw9IEZYRk9OVF9TWU1CT0xJQzsKICAgaWYgKHBPUzItPnBhbm9zZVswXSA9PSAyKSB7CiAgICAgdWludDhfdCB1U2VyaWYgPSBwT1MyLT5wYW5vc2VbMV07CiAgICAgaWYgKCh1U2VyaWYgPiAxICYmIHVTZXJpZiA8IDEwKSB8fCB1U2VyaWYgPiAxMykKLSAgICAgIGZsYWcgfD0gRlhfRk9OVFNUWUxFX1NlcmlmOworICAgICAgZmxhZyB8PSBGWEZPTlRfU0VSSUY7CiAgIH0KICAgcmV0dXJuIGZsYWc7CiB9CiAKIHZvaWQgQ0ZHQVNfRm9udE1ncjo6R2V0TmFtZXMoY29uc3QgdWludDhfdCogbmFtZV90YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+JiBOYW1lcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nPiYgTmFtZXMpIHsKICAgaWYgKCFuYW1lX3RhYmxlKQogICAgIHJldHVybjsKIAogICB1aW50OF90KiBscFRhYmxlID0gKHVpbnQ4X3QqKW5hbWVfdGFibGU7Ci0gIENGWF9XaWRlU3RyaW5nIHdzRmFtaWx5OworICBXaWRlU3RyaW5nIHdzRmFtaWx5OwogICB1aW50OF90KiBzcCA9IGxwVGFibGUgKyAyOwogICB1aW50OF90KiBscE5hbWVSZWNvcmQgPSBscFRhYmxlICsgNjsKICAgdWludDE2X3Qgbk5hbWVDb3VudCA9IEdldFVJbnQxNihzcCk7CkBAIC0xMDc3LDE0ICs4ODcsMTQgQEAKICAgICB3c0ZhbWlseS5jbGVhcigpOwogICAgIGlmIChuUGxhdGZvcm1JRCAhPSAxKSB7CiAgICAgICBmb3IgKHVpbnQxNl90IGsgPSAwOyBrIDwgbk5hbWVMZW5ndGggLyAyOyBrKyspIHsKLSAgICAgICAgRlhfV0NIQVIgd2NUZW1wID0gR2V0VUludDE2KGxwU3RyICsgbk5hbWVPZmZzZXQgKyBrICogMik7CisgICAgICAgIHdjaGFyX3Qgd2NUZW1wID0gR2V0VUludDE2KGxwU3RyICsgbk5hbWVPZmZzZXQgKyBrICogMik7CiAgICAgICAgIHdzRmFtaWx5ICs9IHdjVGVtcDsKICAgICAgIH0KICAgICAgIE5hbWVzLnB1c2hfYmFjayh3c0ZhbWlseSk7CiAgICAgICBjb250aW51ZTsKICAgICB9CiAgICAgZm9yICh1aW50MTZfdCBrID0gMDsgayA8IG5OYW1lTGVuZ3RoOyBrKyspIHsKLSAgICAgIEZYX1dDSEFSIHdjVGVtcCA9IEdldFVJbnQ4KGxwU3RyICsgbk5hbWVPZmZzZXQgKyBrKTsKKyAgICAgIHdjaGFyX3Qgd2NUZW1wID0gR2V0VUludDgobHBTdHIgKyBuTmFtZU9mZnNldCArIGspOwogICAgICAgd3NGYW1pbHkgKz0gd2NUZW1wOwogICAgIH0KICAgICBOYW1lcy5wdXNoX2JhY2sod3NGYW1pbHkpOwpAQCAtMTEyOSwxMSArOTM5LDIwNSBAQAogICBDU0JbMV0gPSBwT1MyLT51bENvZGVQYWdlUmFuZ2UyOwogfQogCi1pbnQzMl90IENGR0FTX0ZvbnRNZ3I6OklzUGFydE5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIE5hbWUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBOYW1lMikgewotICBpZiAoTmFtZTEuRmluZChOYW1lMi5jX3N0cigpKSAhPSAtMSkKK2ludDMyX3QgQ0ZHQVNfRm9udE1ncjo6SXNQYXJ0TmFtZShjb25zdCBXaWRlU3RyaW5nJiBOYW1lMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBOYW1lMikgeworICBpZiAoTmFtZTEuQ29udGFpbnMoTmFtZTIuY19zdHIoKSkpCiAgICAgcmV0dXJuIDE7CiAgIHJldHVybiAwOwogfQogCi0jZW5kaWYgIC8vIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNlbmRpZiAgLy8gX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KKworUmV0YWluUHRyPENGR0FTX0dFRm9udD4gQ0ZHQVNfRm9udE1ncjo6R2V0Rm9udEJ5Q29kZVBhZ2UoCisgICAgdWludDE2X3Qgd0NvZGVQYWdlLAorICAgIHVpbnQzMl90IGR3Rm9udFN0eWxlcywKKyAgICBjb25zdCB3Y2hhcl90KiBwc3pGb250RmFtaWx5KSB7CisgIEJ5dGVTdHJpbmcgYnNIYXNoID0gQnl0ZVN0cmluZzo6Rm9ybWF0KCIlZCwgJWQiLCB3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcyk7CisgIGJzSGFzaCArPSBGWF9VVEY4RW5jb2RlKFdpZGVTdHJpbmdWaWV3KHBzekZvbnRGYW1pbHkpKTsKKyAgdWludDMyX3QgZHdIYXNoID0gRlhfSGFzaENvZGVfR2V0QShic0hhc2guQXNTdHJpbmdWaWV3KCksIGZhbHNlKTsKKyAgc3RkOjp2ZWN0b3I8UmV0YWluUHRyPENGR0FTX0dFRm9udD4+KiBwRm9udEFycmF5ID0gJm1fSGFzaDJGb250c1tkd0hhc2hdOworICBpZiAoIXBGb250QXJyYXktPmVtcHR5KCkpCisgICAgcmV0dXJuICgqcEZvbnRBcnJheSlbMF07CisKKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXworICBjb25zdCBGWF9GT05UREVTQ1JJUFRPUiogcEZEID0KKyAgICAgIEZpbmRGb250KHBzekZvbnRGYW1pbHksIGR3Rm9udFN0eWxlcywgdHJ1ZSwgd0NvZGVQYWdlLCA5OTksIDApOworICBpZiAoIXBGRCkKKyAgICBwRkQgPSBGaW5kRm9udChudWxscHRyLCBkd0ZvbnRTdHlsZXMsIHRydWUsIHdDb2RlUGFnZSwgOTk5LCAwKTsKKyAgaWYgKCFwRkQpCisgICAgcEZEID0gRmluZEZvbnQobnVsbHB0ciwgZHdGb250U3R5bGVzLCBmYWxzZSwgd0NvZGVQYWdlLCA5OTksIDApOworICBpZiAoIXBGRCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBwRm9udCA9CisgICAgICBDRkdBU19HRUZvbnQ6OkxvYWRGb250KHBGRC0+d3NGb250RmFjZSwgZHdGb250U3R5bGVzLCB3Q29kZVBhZ2UsIHRoaXMpOworI2Vsc2UgICAvLyBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXworICBzdGQ6OnZlY3RvcjxDRlhfRm9udERlc2NyaXB0b3JJbmZvPiogc29ydGVkRm9udEluZm9zID0KKyAgICAgIG1fSGFzaDJDYW5kaWRhdGVMaXN0W2R3SGFzaF0uZ2V0KCk7CisgIGlmICghc29ydGVkRm9udEluZm9zKSB7CisgICAgYXV0byBwTmV3Rm9udHMgPSBwZGZpdW06Ok1ha2VVbmlxdWU8c3RkOjp2ZWN0b3I8Q0ZYX0ZvbnREZXNjcmlwdG9ySW5mbz4+KCk7CisgICAgc29ydGVkRm9udEluZm9zID0gcE5ld0ZvbnRzLmdldCgpOworICAgIE1hdGNoRm9udHMoc29ydGVkRm9udEluZm9zLCB3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcywKKyAgICAgICAgICAgICAgIFdpZGVTdHJpbmcocHN6Rm9udEZhbWlseSksIDApOworICAgIG1fSGFzaDJDYW5kaWRhdGVMaXN0W2R3SGFzaF0gPSBzdGQ6Om1vdmUocE5ld0ZvbnRzKTsKKyAgfQorICBpZiAoc29ydGVkRm9udEluZm9zLT5lbXB0eSgpKQorICAgIHJldHVybiBudWxscHRyOworCisgIENGWF9Gb250RGVzY3JpcHRvciogcERlc2MgPSAoKnNvcnRlZEZvbnRJbmZvcylbMF0ucEZvbnQ7CisgIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+IHBGb250ID0KKyAgICAgIExvYWRGb250KHBEZXNjLT5tX3dzRmFjZU5hbWUsIHBEZXNjLT5tX25GYWNlSW5kZXgsIG51bGxwdHIpOworI2VuZGlmICAvLyBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXworCisgIGlmICghcEZvbnQpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgcEZvbnQtPlNldExvZ2ljYWxGb250U3R5bGUoZHdGb250U3R5bGVzKTsKKyAgcEZvbnRBcnJheS0+cHVzaF9iYWNrKHBGb250KTsKKyAgcmV0dXJuIHBGb250OworfQorCitSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBDRkdBU19Gb250TWdyOjpHZXRGb250QnlVbmljb2RlKAorICAgIHdjaGFyX3Qgd1VuaWNvZGUsCisgICAgdWludDMyX3QgZHdGb250U3R5bGVzLAorICAgIGNvbnN0IHdjaGFyX3QqIHBzekZvbnRGYW1pbHkpIHsKKyNpZiBfRlhfUExBVEZPUk1fICE9IF9GWF9QTEFURk9STV9XSU5ET1dTXworICBpZiAocGRmaXVtOjpDb250YWluc0tleShtX0ZhaWxlZFVuaWNvZGVzU2V0LCB3VW5pY29kZSkpCisgICAgcmV0dXJuIG51bGxwdHI7CisjZW5kaWYgIC8vIF9GWF9QTEFURk9STV8gIT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisKKyAgY29uc3QgRkdBU19GT05UVVNCKiB4ID0gRkdBU19HZXRVbmljb2RlQml0RmllbGQod1VuaWNvZGUpOworICB1aW50MTZfdCB3Q29kZVBhZ2UgPSB4ID8geC0+d0NvZGVQYWdlIDogMHhGRkZGOworICB1aW50MTZfdCB3Qml0RmllbGQgPSB4ID8geC0+d0JpdEZpZWxkIDogMHgwM0U3OworICBCeXRlU3RyaW5nIGJzSGFzaDsKKyAgaWYgKHdDb2RlUGFnZSA9PSAweEZGRkYpIHsKKyAgICBic0hhc2ggPQorICAgICAgICBCeXRlU3RyaW5nOjpGb3JtYXQoIiVkLCAlZCwgJWQiLCB3Q29kZVBhZ2UsIHdCaXRGaWVsZCwgZHdGb250U3R5bGVzKTsKKyAgfSBlbHNlIHsKKyAgICBic0hhc2ggPSBCeXRlU3RyaW5nOjpGb3JtYXQoIiVkLCAlZCIsIHdDb2RlUGFnZSwgZHdGb250U3R5bGVzKTsKKyAgfQorICBic0hhc2ggKz0gRlhfVVRGOEVuY29kZShXaWRlU3RyaW5nVmlldyhwc3pGb250RmFtaWx5KSk7CisgIHVpbnQzMl90IGR3SGFzaCA9IEZYX0hhc2hDb2RlX0dldEEoYnNIYXNoLkFzU3RyaW5nVmlldygpLCBmYWxzZSk7CisgIHN0ZDo6dmVjdG9yPFJldGFpblB0cjxDRkdBU19HRUZvbnQ+PiogcEZvbnRzID0gJm1fSGFzaDJGb250c1tkd0hhc2hdOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBGb250cy0+c2l6ZSgpOyArK2kpIHsKKyAgICBpZiAoVmVyaWZ5VW5pY29kZSgoKnBGb250cylbaV0sIHdVbmljb2RlKSkKKyAgICAgIHJldHVybiAoKnBGb250cylbaV07CisgIH0KKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXworICBjb25zdCBGWF9GT05UREVTQ1JJUFRPUiogcEZEID0gRmluZEZvbnQocHN6Rm9udEZhbWlseSwgZHdGb250U3R5bGVzLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdDb2RlUGFnZSwgd0JpdEZpZWxkLCB3VW5pY29kZSk7CisgIGlmICghcEZEICYmIHBzekZvbnRGYW1pbHkpIHsKKyAgICBwRkQgPQorICAgICAgICBGaW5kRm9udChudWxscHRyLCBkd0ZvbnRTdHlsZXMsIGZhbHNlLCB3Q29kZVBhZ2UsIHdCaXRGaWVsZCwgd1VuaWNvZGUpOworICB9CisgIGlmICghcEZEKQorICAgIHJldHVybiBudWxscHRyOworCisgIHVpbnQxNl90IG5ld0NvZGVQYWdlID0gR2V0Q29kZVBhZ2VGcm9tQ2hhcnNldChwRkQtPnVDaGFyU2V0KTsKKyAgY29uc3Qgd2NoYXJfdCogcEZvbnRGYWNlID0gcEZELT53c0ZvbnRGYWNlOworICBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBwRm9udCA9CisgICAgICBDRkdBU19HRUZvbnQ6OkxvYWRGb250KHBGb250RmFjZSwgZHdGb250U3R5bGVzLCBuZXdDb2RlUGFnZSwgdGhpcyk7CisgIGlmICghcEZvbnQpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgcEZvbnQtPlNldExvZ2ljYWxGb250U3R5bGUoZHdGb250U3R5bGVzKTsKKyAgcEZvbnRzLT5wdXNoX2JhY2socEZvbnQpOworICByZXR1cm4gcEZvbnQ7CisjZWxzZSAgIC8vIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisgIHN0ZDo6dmVjdG9yPENGWF9Gb250RGVzY3JpcHRvckluZm8+KiBzb3J0ZWRGb250SW5mb3MgPQorICAgICAgbV9IYXNoMkNhbmRpZGF0ZUxpc3RbZHdIYXNoXS5nZXQoKTsKKyAgaWYgKCFzb3J0ZWRGb250SW5mb3MpIHsKKyAgICBhdXRvIHBOZXdGb250cyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxzdGQ6OnZlY3RvcjxDRlhfRm9udERlc2NyaXB0b3JJbmZvPj4oKTsKKyAgICBzb3J0ZWRGb250SW5mb3MgPSBwTmV3Rm9udHMuZ2V0KCk7CisgICAgTWF0Y2hGb250cyhzb3J0ZWRGb250SW5mb3MsIHdDb2RlUGFnZSwgZHdGb250U3R5bGVzLAorICAgICAgICAgICAgICAgV2lkZVN0cmluZyhwc3pGb250RmFtaWx5KSwgd1VuaWNvZGUpOworICAgIG1fSGFzaDJDYW5kaWRhdGVMaXN0W2R3SGFzaF0gPSBzdGQ6Om1vdmUocE5ld0ZvbnRzKTsKKyAgfQorICBmb3IgKGNvbnN0IGF1dG8mIGluZm8gOiAqc29ydGVkRm9udEluZm9zKSB7CisgICAgQ0ZYX0ZvbnREZXNjcmlwdG9yKiBwRGVzYyA9IGluZm8ucEZvbnQ7CisgICAgaWYgKCFWZXJpZnlVbmljb2RlKHBEZXNjLCB3VW5pY29kZSkpCisgICAgICBjb250aW51ZTsKKyAgICBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBwRm9udCA9CisgICAgICAgIExvYWRGb250KHBEZXNjLT5tX3dzRmFjZU5hbWUsIHBEZXNjLT5tX25GYWNlSW5kZXgsIG51bGxwdHIpOworICAgIGlmICghcEZvbnQpCisgICAgICBjb250aW51ZTsKKyAgICBwRm9udC0+U2V0TG9naWNhbEZvbnRTdHlsZShkd0ZvbnRTdHlsZXMpOworICAgIHBGb250cy0+cHVzaF9iYWNrKHBGb250KTsKKyAgICByZXR1cm4gcEZvbnQ7CisgIH0KKyAgaWYgKCFwc3pGb250RmFtaWx5KQorICAgIG1fRmFpbGVkVW5pY29kZXNTZXQuaW5zZXJ0KHdVbmljb2RlKTsKKyAgcmV0dXJuIG51bGxwdHI7CisjZW5kaWYgIC8vIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCit9CisKK2Jvb2wgQ0ZHQVNfRm9udE1ncjo6VmVyaWZ5VW5pY29kZShjb25zdCBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiYgcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCB3Y1VuaWNvZGUpIHsKKyAgaWYgKCFwRm9udCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgRlhGVF9GYWNlIHBGYWNlID0gcEZvbnQtPkdldERldkZvbnQoKS0+R2V0RmFjZSgpOworICBGWEZUX0NoYXJNYXAgY2hhcm1hcCA9IEZYRlRfR2V0X0ZhY2VfQ2hhcm1hcChwRmFjZSk7CisgIGlmIChGWEZUX1NlbGVjdF9DaGFybWFwKHBGYWNlLCBGWEZUX0VOQ09ESU5HX1VOSUNPREUpICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChGWEZUX0dldF9DaGFyX0luZGV4KHBGYWNlLCB3Y1VuaWNvZGUpID09IDApIHsKKyAgICBGWEZUX1NldF9DaGFybWFwKHBGYWNlLCBjaGFybWFwKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IENGR0FTX0ZvbnRNZ3I6OkxvYWRGb250KGNvbnN0IHdjaGFyX3QqIHBzekZvbnRGYW1pbHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZvbnRTdHlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB3Q29kZVBhZ2UpIHsKKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXworICBCeXRlU3RyaW5nIGJzSGFzaCA9IEJ5dGVTdHJpbmc6OkZvcm1hdCgiJWQsICVkIiwgd0NvZGVQYWdlLCBkd0ZvbnRTdHlsZXMpOworICBic0hhc2ggKz0gRlhfVVRGOEVuY29kZShXaWRlU3RyaW5nVmlldyhwc3pGb250RmFtaWx5KSk7CisgIHVpbnQzMl90IGR3SGFzaCA9IEZYX0hhc2hDb2RlX0dldEEoYnNIYXNoLkFzU3RyaW5nVmlldygpLCBmYWxzZSk7CisgIHN0ZDo6dmVjdG9yPFJldGFpblB0cjxDRkdBU19HRUZvbnQ+PiogcEZvbnRBcnJheSA9ICZtX0hhc2gyRm9udHNbZHdIYXNoXTsKKyAgaWYgKCFwRm9udEFycmF5LT5lbXB0eSgpKQorICAgIHJldHVybiAoKnBGb250QXJyYXkpWzBdOworCisgIGNvbnN0IEZYX0ZPTlRERVNDUklQVE9SKiBwRkQgPQorICAgICAgRmluZEZvbnQocHN6Rm9udEZhbWlseSwgZHdGb250U3R5bGVzLCB0cnVlLCB3Q29kZVBhZ2UsIDk5OSwgMCk7CisgIGlmICghcEZEKQorICAgIHBGRCA9IEZpbmRGb250KHBzekZvbnRGYW1pbHksIGR3Rm9udFN0eWxlcywgZmFsc2UsIHdDb2RlUGFnZSwgOTk5LCAwKTsKKyAgaWYgKCFwRkQpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgUmV0YWluUHRyPENGR0FTX0dFRm9udD4gcEZvbnQgPQorICAgICAgQ0ZHQVNfR0VGb250OjpMb2FkRm9udChwRkQtPndzRm9udEZhY2UsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlLCB0aGlzKTsKKyAgaWYgKCFwRm9udCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBwRm9udC0+U2V0TG9naWNhbEZvbnRTdHlsZShkd0ZvbnRTdHlsZXMpOworICBwRm9udEFycmF5LT5wdXNoX2JhY2socEZvbnQpOworICByZXR1cm4gcEZvbnQ7CisjZWxzZSAgIC8vIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisgIHJldHVybiBHZXRGb250QnlDb2RlUGFnZSh3Q29kZVBhZ2UsIGR3Rm9udFN0eWxlcywgcHN6Rm9udEZhbWlseSk7CisjZW5kaWYgIC8vIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCit9CisKK3ZvaWQgQ0ZHQVNfRm9udE1ncjo6UmVtb3ZlRm9udChjb25zdCBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiYgcEVGb250KSB7CisgIGlmICghcEVGb250KQorICAgIHJldHVybjsKKworI2lmIF9GWF9QTEFURk9STV8gIT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisgIG1fSUZYRm9udDJGaWxlUmVhZC5lcmFzZShwRUZvbnQpOworI2VuZGlmICAvLyBfRlhfUExBVEZPUk1fICE9IF9GWF9QTEFURk9STV9XSU5ET1dTXworCisgIGF1dG8gaXRlciA9IG1fSGFzaDJGb250cy5iZWdpbigpOworICB3aGlsZSAoaXRlciAhPSBtX0hhc2gyRm9udHMuZW5kKCkpIHsKKyAgICBhdXRvIG9sZF9pdGVyID0gaXRlcisrOworICAgIGJvb2wgYWxsX2VtcHR5ID0gdHJ1ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9sZF9pdGVyLT5zZWNvbmQuc2l6ZSgpOyBpKyspIHsKKyAgICAgIGlmIChvbGRfaXRlci0+c2Vjb25kW2ldID09IHBFRm9udCkKKyAgICAgICAgb2xkX2l0ZXItPnNlY29uZFtpXS5SZXNldCgpOworICAgICAgZWxzZSBpZiAob2xkX2l0ZXItPnNlY29uZFtpXSkKKyAgICAgICAgYWxsX2VtcHR5ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChhbGxfZW1wdHkpCisgICAgICBtX0hhc2gyRm9udHMuZXJhc2Uob2xkX2l0ZXIpOworICB9Cit9CmRpZmYgLS1naXQgYS94ZmEvZmdhcy9mb250L2NmZ2FzX2ZvbnRtZ3IuaCBiL3hmYS9mZ2FzL2ZvbnQvY2ZnYXNfZm9udG1nci5oCmluZGV4IGRmZmRiOGEuLjQ0NWIzMTggMTAwNjQ0Ci0tLSBhL3hmYS9mZ2FzL2ZvbnQvY2ZnYXNfZm9udG1nci5oCisrKyBiL3hmYS9mZ2FzL2ZvbnQvY2ZnYXNfZm9udG1nci5oCkBAIC0xMSw0NCArMTEsMjggQEAKICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3JldGFpbl9wdHIuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dC5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZm9udG1hcHBlci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3NlZWthYmxlc3RyZWFtcHJveHkuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvb2JzZXJ2YWJsZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9meF9mcmVldHlwZS5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9pZnhfc3lzdGVtZm9udGluZm8uaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9mcmVldHlwZS9pbmNsdWRlL2ZyZWV0eXBlL2Z0dHlwZXMuaCIKLSNpbmNsdWRlICJ4ZmEvZmdhcy9jcnQvZmdhc19zdHJlYW0uaCIKKyNpbmNsdWRlICJ4ZmEvZmdhcy9mb250L2NmZ2FzX3BkZmZvbnRtZ3IuaCIKIAotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSNpbmNsdWRlICJ4ZmEvZmdhcy9jcnQvZmdhc191dGlscy5oIgotI2VuZGlmICAvLyBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0KLSNkZWZpbmUgRlhfRk9OVFNUWUxFX05vcm1hbCAweDAwCi0jZGVmaW5lIEZYX0ZPTlRTVFlMRV9GaXhlZFBpdGNoIDB4MDEKLSNkZWZpbmUgRlhfRk9OVFNUWUxFX1NlcmlmIDB4MDIKLSNkZWZpbmUgRlhfRk9OVFNUWUxFX1N5bWJvbGljIDB4MDQKLSNkZWZpbmUgRlhfRk9OVFNUWUxFX1NjcmlwdCAweDA4Ci0jZGVmaW5lIEZYX0ZPTlRTVFlMRV9JdGFsaWMgMHg0MAotI2RlZmluZSBGWF9GT05UU1RZTEVfQm9sZCAweDQwMDAwCi0jZGVmaW5lIEZYX0ZPTlRTVFlMRV9Cb2xkSXRhbGljIChGWF9GT05UU1RZTEVfQm9sZCB8IEZYX0ZPTlRTVFlMRV9JdGFsaWMpCi0jZGVmaW5lIEZYX0ZPTlRTVFlMRV9FeGFjdE1hdGNoIDB4ODAwMDAwMDAKLQotY2xhc3MgQ0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGU7Ci1jbGFzcyBDWEZBX1BERkZvbnRNZ3I7Ci1jbGFzcyBDRkdBU19Gb250TWdyOwogY2xhc3MgQ0ZHQVNfR0VGb250OworY2xhc3MgQ0ZYX0ZvbnRNYXBwZXI7CitjbGFzcyBDRlhfRm9udFNvdXJjZUVudW1fRmlsZTsKIAotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSNkZWZpbmUgRlhfRk9OVE1BVENIUEFSQV9NYXRjaFN0eWxlIDB4MDEKLQorI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCiBzdHJ1Y3QgRlhfRk9OVE1BVENIUEFSQU1TIHsKLSAgY29uc3QgRlhfV0NIQVIqIHB3c0ZhbWlseTsKKyAgY29uc3Qgd2NoYXJfdCogcHdzRmFtaWx5OwogICB1aW50MzJfdCBkd0ZvbnRTdHlsZXM7CiAgIHVpbnQzMl90IGR3VVNCOwotICB1aW50MzJfdCBkd01hdGNoRmxhZ3M7Ci0gIEZYX1dDSEFSIHdVbmljb2RlOworICBib29sIG1hdGNoUGFyYWdyYXBoU3R5bGU7CisgIHdjaGFyX3Qgd1VuaWNvZGU7CiAgIHVpbnQxNl90IHdDb2RlUGFnZTsKIH07CiAKQEAgLTY1LDcgKzQ5LDcgQEAKIH0KIAogc3RydWN0IEZYX0ZPTlRERVNDUklQVE9SIHsKLSAgRlhfV0NIQVIgd3NGb250RmFjZVszMl07CisgIHdjaGFyX3Qgd3NGb250RmFjZVszMl07CiAgIHVpbnQzMl90IGR3Rm9udFN0eWxlczsKICAgdWludDhfdCB1Q2hhclNldDsKICAgRlhfRk9OVFNJR05BVFVSRSBGb250U2lnbmF0dXJlOwpAQCAtNzYsNjcgKzYwLDIzIEBACiAgIHJldHVybiBsZWZ0LnVDaGFyU2V0ID09IHJpZ2h0LnVDaGFyU2V0ICYmCiAgICAgICAgICBsZWZ0LmR3Rm9udFN0eWxlcyA9PSByaWdodC5kd0ZvbnRTdHlsZXMgJiYKICAgICAgICAgIGxlZnQuRm9udFNpZ25hdHVyZSA9PSByaWdodC5Gb250U2lnbmF0dXJlICYmCi0gICAgICAgICBGWFNZU193Y3NjbXAobGVmdC53c0ZvbnRGYWNlLCByaWdodC53c0ZvbnRGYWNlKSA9PSAwOworICAgICAgICAgd2NzY21wKGxlZnQud3NGb250RmFjZSwgcmlnaHQud3NGb250RmFjZSkgPT0gMDsKIH0KIAogdHlwZWRlZiB2b2lkICgqRlhfTFBFbnVtQWxsRm9udHMpKHN0ZDo6ZGVxdWU8RlhfRk9OVERFU0NSSVBUT1I+KiBmb250cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHdzRmFjZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgd1VuaWNvZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHB3c0ZhY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3Qgd1VuaWNvZGUpOwogCi1GWF9MUEVudW1BbGxGb250cyBGWF9HZXREZWZGb250RW51bWVyYXRvcigpOworI2Vsc2UgIC8vIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCiAKLWNsYXNzIENGR0FTX0ZvbnRNZ3IgewotIHB1YmxpYzoKLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDRkdBU19Gb250TWdyPiBDcmVhdGUoRlhfTFBFbnVtQWxsRm9udHMgcEVudW1lcmF0b3IpOwotCi0gIGV4cGxpY2l0IENGR0FTX0ZvbnRNZ3IoRlhfTFBFbnVtQWxsRm9udHMgcEVudW1lcmF0b3IpOwotICB+Q0ZHQVNfRm9udE1ncigpOwotCi0gIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBHZXRGb250QnlDb2RlUGFnZSh1aW50MTZfdCB3Q29kZVBhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZvbnRTdHlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSk7Ci0gIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBHZXRGb250QnlVbmljb2RlKEZYX1dDSEFSIHdVbmljb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZvbnRTdHlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5KTsKLSAgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IExvYWRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGb250U3R5bGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd0NvZGVQYWdlKTsKLSAgdm9pZCBSZW1vdmVGb250KGNvbnN0IENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiYgcEZvbnQpOwotCi0gcHJpdmF0ZToKLSAgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IExvYWRGb250KAotICAgICAgY29uc3QgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+JiBwU3JjRm9udCwKLSAgICAgIHVpbnQzMl90IGR3Rm9udFN0eWxlcywKLSAgICAgIHVpbnQxNl90IHdDb2RlUGFnZSk7Ci0gIHZvaWQgUmVtb3ZlRm9udChzdGQ6Om1hcDx1aW50MzJfdCwgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+PiogcEZvbnRNYXAsCi0gICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4mIHBGb250KTsKLSAgY29uc3QgRlhfRk9OVERFU0NSSVBUT1IqIEZpbmRGb250KGNvbnN0IEZYX1dDSEFSKiBwc3pGb250RmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGb250U3R5bGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdNYXRjaEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd0NvZGVQYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdVU0IgPSA5OTksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiB3VW5pY29kZSA9IDApOwotCi0gIEZYX0xQRW51bUFsbEZvbnRzIG1fcEVudW1lcmF0b3I7Ci0gIHN0ZDo6ZGVxdWU8RlhfRk9OVERFU0NSSVBUT1I+IG1fRm9udEZhY2VzOwotICBzdGQ6OnZlY3RvcjxDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4+IG1fRm9udHM7Ci0gIHN0ZDo6bWFwPHVpbnQzMl90LCBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4+IG1fQ1BGb250czsKLSAgc3RkOjptYXA8dWludDMyX3QsIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250Pj4gbV9GYW1pbHlGb250czsKLSAgc3RkOjptYXA8dWludDMyX3QsIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250Pj4gbV9Vbmljb2RlRm9udHM7Ci0gIHN0ZDo6bWFwPHVpbnQzMl90LCBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4+IG1fQnVmZmVyRm9udHM7Ci0gIHN0ZDo6bWFwPHVpbnQzMl90LCBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4+IG1fU3RyZWFtRm9udHM7Ci0gIHN0ZDo6bWFwPHVpbnQzMl90LCBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4+IG1fRGVyaXZlRm9udHM7Ci19OwotCi0jZWxzZSAgLy8gX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwogY2xhc3MgQ0ZYX0ZvbnREZXNjcmlwdG9yIHsKICBwdWJsaWM6CiAgIENGWF9Gb250RGVzY3JpcHRvcigpOwogICB+Q0ZYX0ZvbnREZXNjcmlwdG9yKCk7CiAKICAgaW50MzJfdCBtX25GYWNlSW5kZXg7Ci0gIENGWF9XaWRlU3RyaW5nIG1fd3NGYWNlTmFtZTsKLSAgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+IG1fd3NGYW1pbHlOYW1lczsKKyAgV2lkZVN0cmluZyBtX3dzRmFjZU5hbWU7CisgIHN0ZDo6dmVjdG9yPFdpZGVTdHJpbmc+IG1fd3NGYW1pbHlOYW1lczsKICAgdWludDMyX3QgbV9kd0ZvbnRTdHlsZXM7CiAgIHVpbnQzMl90IG1fZHdVc2JbNF07CiAgIHVpbnQzMl90IG1fZHdDc2JbMl07CkBAIC0xNTgsOTcgKzk4LDEwOSBAQAogICB9CiB9OwogCi1zdHJ1Y3QgRlhfSGFuZGxlUGFyZW50UGF0aCB7Ci0gIEZYX0hhbmRsZVBhcmVudFBhdGgoKSB7fQotICBGWF9IYW5kbGVQYXJlbnRQYXRoKGNvbnN0IEZYX0hhbmRsZVBhcmVudFBhdGgmIHgpIHsKLSAgICBwRmlsZUhhbmRsZSA9IHgucEZpbGVIYW5kbGU7Ci0gICAgYnNQYXJlbnRQYXRoID0geC5ic1BhcmVudFBhdGg7Ci0gIH0KLSAgRlhfRmlsZUhhbmRsZSogcEZpbGVIYW5kbGU7Ci0gIENGWF9CeXRlU3RyaW5nIGJzUGFyZW50UGF0aDsKLX07Ci0KIGNsYXNzIENGWF9Gb250U291cmNlRW51bV9GaWxlIHsKICBwdWJsaWM6CiAgIENGWF9Gb250U291cmNlRW51bV9GaWxlKCk7CiAgIH5DRlhfRm9udFNvdXJjZUVudW1fRmlsZSgpOwogCi0gIEZYX1BPU0lUSU9OIEdldFN0YXJ0UG9zaXRpb24oKTsKLSAgQ0ZYX1JldGFpblB0cjxJRlhfRmlsZUFjY2Vzcz4gR2V0TmV4dChGWF9QT1NJVElPTiYgcG9zKTsKKyAgYm9vbCBIYXNTdGFydFBvc2l0aW9uKCk7CisgIHN0ZDo6cGFpcjxib29sLCBSZXRhaW5QdHI8SUZYX1NlZWthYmxlU3RyZWFtPj4gR2V0TmV4dCgpOwogCiAgcHJpdmF0ZToKLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0TmV4dEZpbGUoKTsKKyAgc3RydWN0IEhhbmRsZVBhcmVudFBhdGggeworICAgIEhhbmRsZVBhcmVudFBhdGgoKSA9IGRlZmF1bHQ7CisgICAgSGFuZGxlUGFyZW50UGF0aChjb25zdCBIYW5kbGVQYXJlbnRQYXRoJiB4KSB7CisgICAgICBwRmlsZUhhbmRsZSA9IHgucEZpbGVIYW5kbGU7CisgICAgICBic1BhcmVudFBhdGggPSB4LmJzUGFyZW50UGF0aDsKKyAgICB9CisgICAgRlhfRmlsZUhhbmRsZSogcEZpbGVIYW5kbGU7CisgICAgQnl0ZVN0cmluZyBic1BhcmVudFBhdGg7CisgIH07CiAKLSAgQ0ZYX1dpZGVTdHJpbmcgbV93c05leHQ7Ci0gIHN0ZDo6dmVjdG9yPEZYX0hhbmRsZVBhcmVudFBhdGg+IG1fRm9sZGVyUXVldWU7Ci0gIHN0ZDo6dmVjdG9yPENGWF9CeXRlU3RyaW5nPiBtX0ZvbGRlclBhdGhzOworICBCeXRlU3RyaW5nIEdldE5leHRGaWxlKCk7CisKKyAgV2lkZVN0cmluZyBtX3dzTmV4dDsKKyAgc3RkOjp2ZWN0b3I8SGFuZGxlUGFyZW50UGF0aD4gbV9Gb2xkZXJRdWV1ZTsKKyAgc3RkOjp2ZWN0b3I8Qnl0ZVN0cmluZz4gbV9Gb2xkZXJQYXRoczsKIH07CiAKLWNsYXNzIENGR0FTX0ZvbnRNZ3IgewotIHB1YmxpYzoKLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDRkdBU19Gb250TWdyPiBDcmVhdGUoCi0gICAgICBDRlhfRm9udFNvdXJjZUVudW1fRmlsZSogcEZvbnRFbnVtKTsKKyNlbmRpZiAgLy8gX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KIAotICBleHBsaWNpdCBDRkdBU19Gb250TWdyKENGWF9Gb250U291cmNlRW51bV9GaWxlKiBwRm9udEVudW0pOworY2xhc3MgQ0ZHQVNfRm9udE1nciA6IHB1YmxpYyBPYnNlcnZhYmxlPENGR0FTX0ZvbnRNZ3I+IHsKKyBwdWJsaWM6CisgIENGR0FTX0ZvbnRNZ3IoKTsKICAgfkNGR0FTX0ZvbnRNZ3IoKTsKIAotICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gR2V0Rm9udEJ5Q29kZVBhZ2UodWludDE2X3Qgd0NvZGVQYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGb250U3R5bGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBzekZvbnRGYW1pbHkpOwotICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gR2V0Rm9udEJ5VW5pY29kZShGWF9XQ0hBUiB3VW5pY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGb250U3R5bGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSk7Ci0gIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3Rm9udFN0eWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdDb2RlUGFnZSk7Ci0gIHZvaWQgUmVtb3ZlRm9udChjb25zdCBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4mIHBGb250KTsKKyAgUmV0YWluUHRyPENGR0FTX0dFRm9udD4gR2V0Rm9udEJ5Q29kZVBhZ2UodWludDE2X3Qgd0NvZGVQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZvbnRTdHlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHBzekZvbnRGYW1pbHkpOworICBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBHZXRGb250QnlVbmljb2RlKHdjaGFyX3Qgd1VuaWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGb250U3R5bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHBzekZvbnRGYW1pbHkpOworICBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBMb2FkRm9udChjb25zdCB3Y2hhcl90KiBwc3pGb250RmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZvbnRTdHlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdDb2RlUGFnZSk7CisgIHZvaWQgUmVtb3ZlRm9udChjb25zdCBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiYgcEZvbnQpOworCisgIGJvb2wgRW51bUZvbnRzKCk7CiAKICBwcml2YXRlOgotICBib29sIEVudW1Gb250cygpOworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisgIGNvbnN0IEZYX0ZPTlRERVNDUklQVE9SKiBGaW5kRm9udChjb25zdCB3Y2hhcl90KiBwc3pGb250RmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGb250U3R5bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtYXRjaFBhcmFncmFwaFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd0NvZGVQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdVU0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90IHdVbmljb2RlKTsKKworICBGWF9MUEVudW1BbGxGb250cyBtX3BFbnVtZXJhdG9yOworICBzdGQ6OmRlcXVlPEZYX0ZPTlRERVNDUklQVE9SPiBtX0ZvbnRGYWNlczsKKyNlbHNlICAgLy8gX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KICAgYm9vbCBFbnVtRm9udHNGcm9tRm9udE1hcHBlcigpOwogICBib29sIEVudW1Gb250c0Zyb21GaWxlcygpOwotICB2b2lkIFJlZ2lzdGVyRmFjZShGWEZUX0ZhY2UgcEZhY2UsIGNvbnN0IENGWF9XaWRlU3RyaW5nKiBwRmFjZU5hbWUpOwotICB2b2lkIFJlZ2lzdGVyRmFjZXMoY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcEZvbnRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyogcEZhY2VOYW1lKTsKLSAgdm9pZCBHZXROYW1lcyhjb25zdCB1aW50OF90KiBuYW1lX3RhYmxlLCBzdGQ6OnZlY3RvcjxDRlhfV2lkZVN0cmluZz4mIE5hbWVzKTsKKyAgdm9pZCBSZWdpc3RlckZhY2UoRlhGVF9GYWNlIHBGYWNlLCBjb25zdCBXaWRlU3RyaW5nKiBwRmFjZU5hbWUpOworICB2b2lkIFJlZ2lzdGVyRmFjZXMoY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRm9udFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcqIHBGYWNlTmFtZSk7CisgIHZvaWQgR2V0TmFtZXMoY29uc3QgdWludDhfdCogbmFtZV90YWJsZSwgc3RkOjp2ZWN0b3I8V2lkZVN0cmluZz4mIE5hbWVzKTsKICAgc3RkOjp2ZWN0b3I8dWludDE2X3Q+IEdldENoYXJzZXRzKEZYRlRfRmFjZSBwRmFjZSkgY29uc3Q7CiAgIHZvaWQgR2V0VVNCQ1NCKEZYRlRfRmFjZSBwRmFjZSwgdWludDMyX3QqIFVTQiwgdWludDMyX3QqIENTQik7CiAgIHVpbnQzMl90IEdldEZsYWdzKEZYRlRfRmFjZSBwRmFjZSk7Ci0gIGJvb2wgVmVyaWZ5VW5pY29kZShDRlhfRm9udERlc2NyaXB0b3IqIHBEZXNjLCBGWF9XQ0hBUiB3Y1VuaWNvZGUpOwotICBib29sIFZlcmlmeVVuaWNvZGUoY29uc3QgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+JiBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHdjVW5pY29kZSk7Ci0gIGludDMyX3QgSXNQYXJ0TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgTmFtZTEsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBOYW1lMik7CisgIGJvb2wgVmVyaWZ5VW5pY29kZShDRlhfRm9udERlc2NyaXB0b3IqIHBEZXNjLCB3Y2hhcl90IHdjVW5pY29kZSk7CisgIGludDMyX3QgSXNQYXJ0TmFtZShjb25zdCBXaWRlU3RyaW5nJiBOYW1lMSwgY29uc3QgV2lkZVN0cmluZyYgTmFtZTIpOwogICB2b2lkIE1hdGNoRm9udHMoc3RkOjp2ZWN0b3I8Q0ZYX0ZvbnREZXNjcmlwdG9ySW5mbz4qIE1hdGNoZWRGb250cywKICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdDb2RlUGFnZSwKICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3Rm9udFN0eWxlcywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBGb250TmFtZSwKLSAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHdjVW5pY29kZSA9IDB4RkZGRSk7CisgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBGb250TmFtZSwKKyAgICAgICAgICAgICAgICAgIHdjaGFyX3Qgd2NVbmljb2RlID0gMHhGRkZFKTsKICAgaW50MzJfdCBDYWxjUGVuYWx0eShDRlhfRm9udERlc2NyaXB0b3IqIHBJbnN0YWxsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd0NvZGVQYWdlLAogICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3Rm9udFN0eWxlcywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgRm9udE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgd2NVbmljb2RlID0gMHhGRkZFKTsKLSAgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IExvYWRGb250KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0ZhY2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmFjZUluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcEZhY2VDb3VudCk7Ci0gIEZYRlRfRmFjZSBMb2FkRmFjZShjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRm9udFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiBGb250TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90IHdjVW5pY29kZSA9IDB4RkZGRSk7CisgIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+IExvYWRGb250KGNvbnN0IFdpZGVTdHJpbmcmIHdzRmFjZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZhY2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcEZhY2VDb3VudCk7CisgIEZYRlRfRmFjZSBMb2FkRmFjZShjb25zdCBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBGb250U3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmFjZUluZGV4KTsKLSAgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBDcmVhdGVGb250U3RyZWFtKAorICBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gQ3JlYXRlRm9udFN0cmVhbSgKICAgICAgIENGWF9Gb250TWFwcGVyKiBwRm9udE1hcHBlciwKICAgICAgIElGWF9TeXN0ZW1Gb250SW5mbyogcFN5c3RlbUZvbnRJbmZvLAogICAgICAgdWludDMyX3QgaW5kZXgpOwotICBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IENyZWF0ZUZvbnRTdHJlYW0oCi0gICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgYnNGYWNlTmFtZSk7CisgIFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBDcmVhdGVGb250U3RyZWFtKAorICAgICAgY29uc3QgQnl0ZVN0cmluZyYgYnNGYWNlTmFtZSk7CiAKLSAgQ0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGUqIGNvbnN0IG1fcEZvbnRTb3VyY2U7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRm9udFNvdXJjZUVudW1fRmlsZT4gbV9wRm9udFNvdXJjZTsKICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWF9Gb250RGVzY3JpcHRvcj4+IG1fSW5zdGFsbGVkRm9udHM7CiAgIHN0ZDo6bWFwPHVpbnQzMl90LCBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8Q0ZYX0ZvbnREZXNjcmlwdG9ySW5mbz4+PgogICAgICAgbV9IYXNoMkNhbmRpZGF0ZUxpc3Q7Ci0gIHN0ZDo6bWFwPHVpbnQzMl90LCBzdGQ6OnZlY3RvcjxDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4+PiBtX0hhc2gyRm9udHM7Ci0gIHN0ZDo6bWFwPENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiwgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPj4KKyAgc3RkOjptYXA8UmV0YWluUHRyPENGR0FTX0dFRm9udD4sIFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPj4KICAgICAgIG1fSUZYRm9udDJGaWxlUmVhZDsKLSAgc3RkOjpzZXQ8RlhfV0NIQVI+IG1fRmFpbGVkVW5pY29kZXNTZXQ7CisgIHN0ZDo6c2V0PHdjaGFyX3Q+IG1fRmFpbGVkVW5pY29kZXNTZXQ7CisjZW5kaWYgIC8vIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCisKKyAgYm9vbCBWZXJpZnlVbmljb2RlKGNvbnN0IFJldGFpblB0cjxDRkdBU19HRUZvbnQ+JiBwRm9udCwgd2NoYXJfdCB3Y1VuaWNvZGUpOworCisgIHN0ZDo6bWFwPHVpbnQzMl90LCBzdGQ6OnZlY3RvcjxSZXRhaW5QdHI8Q0ZHQVNfR0VGb250Pj4+IG1fSGFzaDJGb250czsKIH07Ci0jZW5kaWYgIC8vIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KIAogI2VuZGlmICAvLyBYRkFfRkdBU19GT05UX0NGR0FTX0ZPTlRNR1JfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZ2FzL2ZvbnQvY2ZnYXNfZ2Vmb250LmNwcCBiL3hmYS9mZ2FzL2ZvbnQvY2ZnYXNfZ2Vmb250LmNwcAppbmRleCBhNTc5NjJkLi44M2I3YWQ2IDEwMDY0NAotLS0gYS94ZmEvZmdhcy9mb250L2NmZ2FzX2dlZm9udC5jcHAKKysrIGIveGZhL2ZnYXMvZm9udC9jZmdhc19nZWZvbnQuY3BwCkBAIC05LDIxICs5LDIwIEBACiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHV0aWxpdHk+CiAKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2NvZGVwYWdlLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9mb250LmgiCiAjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9zdWJzdGZvbnQuaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3VuaWNvZGVlbmNvZGluZy5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfdW5pY29kZWVuY29kaW5nZXguaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvY3J0L2ZnYXNfY29kZXBhZ2UuaCIKICNpbmNsdWRlICJ4ZmEvZmdhcy9mb250L2ZnYXNfZm9udHV0aWxzLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZvbnRtZ3IuaCIKIAogLy8gc3RhdGljCi1DRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gQ0ZHQVNfR0VGb250OjpMb2FkRm9udCgKLSAgICBjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwKLSAgICB1aW50MzJfdCBkd0ZvbnRTdHlsZXMsCi0gICAgdWludDE2X3Qgd0NvZGVQYWdlLAotICAgIENGR0FTX0ZvbnRNZ3IqIHBGb250TWdyKSB7Ci0jaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXworUmV0YWluUHRyPENGR0FTX0dFRm9udD4gQ0ZHQVNfR0VGb250OjpMb2FkRm9udChjb25zdCB3Y2hhcl90KiBwc3pGb250RmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZvbnRTdHlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdDb2RlUGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZHQVNfRm9udE1nciogcEZvbnRNZ3IpIHsKKyNpZiBfRlhfUExBVEZPUk1fICE9IF9GWF9QTEFURk9STV9XSU5ET1dTXwogICBpZiAoIXBGb250TWdyKQogICAgIHJldHVybiBudWxscHRyOwogCkBAIC0zNyw4ICszNiw4IEBACiB9CiAKIC8vIHN0YXRpYwotQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IENGR0FTX0dFRm9udDo6TG9hZEZvbnQoQ0ZYX0ZvbnQqIHBFeHRlcm5hbEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkdBU19Gb250TWdyKiBwRm9udE1ncikgeworUmV0YWluUHRyPENGR0FTX0dFRm9udD4gQ0ZHQVNfR0VGb250OjpMb2FkRm9udChDRlhfRm9udCogcEV4dGVybmFsRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZHQVNfRm9udE1nciogcEZvbnRNZ3IpIHsKICAgYXV0byBwRm9udCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRkdBU19HRUZvbnQ+KHBGb250TWdyKTsKICAgaWYgKCFwRm9udC0+TG9hZEZvbnRJbnRlcm5hbChwRXh0ZXJuYWxGb250KSkKICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTQ2LDcgKzQ1LDcgQEAKIH0KIAogLy8gc3RhdGljCi1DRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gQ0ZHQVNfR0VGb250OjpMb2FkRm9udCgKK1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IENGR0FTX0dFRm9udDo6TG9hZEZvbnQoCiAgICAgc3RkOjp1bmlxdWVfcHRyPENGWF9Gb250PiBwSW50ZXJuYWxGb250LAogICAgIENGR0FTX0ZvbnRNZ3IqIHBGb250TWdyKSB7CiAgIGF1dG8gcEZvbnQgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZHQVNfR0VGb250PihwRm9udE1ncik7CkBAIC01NSw2NiArNTQsMTMgQEAKICAgcmV0dXJuIHBGb250OwogfQogCi0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotLy8gc3RhdGljCi1DRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gQ0ZHQVNfR0VGb250OjpMb2FkRm9udChjb25zdCB1aW50OF90KiBwQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZHQVNfRm9udE1nciogcEZvbnRNZ3IpIHsKLSAgYXV0byBwRm9udCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRkdBU19HRUZvbnQ+KHBGb250TWdyKTsKLSAgaWYgKHBGb250LT5Mb2FkRm9udEludGVybmFsKHBCdWZmZXIsIGlMZW5ndGgpKQotICAgIHJldHVybiBudWxscHRyOwotICByZXR1cm4gcEZvbnQ7Ci19Ci0KLS8vIHN0YXRpYwotQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IENGR0FTX0dFRm9udDo6TG9hZEZvbnQoCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+JiBwRm9udFN0cmVhbSwKLSAgICBDRkdBU19Gb250TWdyKiBwRm9udE1nciwKLSAgICBib29sIGJTYXZlU3RyZWFtKSB7Ci0gIGF1dG8gcEZvbnQgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZHQVNfR0VGb250PihwRm9udE1ncik7Ci0gIGlmICghcEZvbnQtPkxvYWRGb250SW50ZXJuYWwocEZvbnRTdHJlYW0sIGJTYXZlU3RyZWFtKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIHBGb250OwotfQotI2VuZGlmICAvLyBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0KIENGR0FTX0dFRm9udDo6Q0ZHQVNfR0VGb250KENGR0FTX0ZvbnRNZ3IqIHBGb250TWdyKQogICAgIDoKLSNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCiAgICAgICBtX2JVc2VMb2dGb250U3R5bGUoZmFsc2UpLAogICAgICAgbV9kd0xvZ0ZvbnRTdHlsZSgwKSwKLSNlbmRpZgogICAgICAgbV9wRm9udChudWxscHRyKSwKLSAgICAgIG1fcEZvbnRNZ3IocEZvbnRNZ3IpLAogICAgICAgbV9iRXh0ZXJuYWxGb250KGZhbHNlKSwKLSAgICAgIG1fcFByb3ZpZGVyKG51bGxwdHIpIHsKLX0KLQotQ0ZHQVNfR0VGb250OjpDRkdBU19HRUZvbnQoY29uc3QgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+JiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZvbnRTdHlsZXMpCi0gICAgOgotI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgICAgIG1fYlVzZUxvZ0ZvbnRTdHlsZShmYWxzZSksCi0gICAgICBtX2R3TG9nRm9udFN0eWxlKDApLAotI2VuZGlmCi0gICAgICBtX3BGb250KG51bGxwdHIpLAotICAgICAgbV9wU3JjRm9udChzcmMpLAotICAgICAgbV9wRm9udE1ncihzcmMtPm1fcEZvbnRNZ3IpLAotICAgICAgbV9iRXh0ZXJuYWxGb250KGZhbHNlKSwKLSAgICAgIG1fcFByb3ZpZGVyKG51bGxwdHIpIHsKLSAgQVNTRVJUKG1fcFNyY0ZvbnQtPm1fcEZvbnQpOwotICBtX3BGb250ID0gbmV3IENGWF9Gb250OwotICBtX3BGb250LT5Mb2FkQ2xvbmUobV9wU3JjRm9udC0+bV9wRm9udCk7Ci0gIENGWF9TdWJzdEZvbnQqIHBTdWJzdCA9IG1fcEZvbnQtPkdldFN1YnN0Rm9udCgpOwotICBpZiAoIXBTdWJzdCkgewotICAgIHBTdWJzdCA9IG5ldyBDRlhfU3Vic3RGb250OwotICAgIG1fcEZvbnQtPlNldFN1YnN0Rm9udChzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1N1YnN0Rm9udD4ocFN1YnN0KSk7Ci0gIH0KLSAgcFN1YnN0LT5tX1dlaWdodCA9Ci0gICAgICAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGQpID8gRlhGT05UX0ZXX0JPTEQgOiBGWEZPTlRfRldfTk9STUFMOwotICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0l0YWxpYykKLSAgICBwU3Vic3QtPm1fU3Vic3RGbGFncyB8PSBGWEZPTlRfU1VCU1RfSVRBTElDOwotICBJbml0Rm9udCgpOworICAgICAgbV9wRm9udE1ncihwRm9udE1ncikgewogfQogCiBDRkdBU19HRUZvbnQ6On5DRkdBU19HRUZvbnQoKSB7CkBAIC0xMjIsNzIgKzY4LDMzIEBACiAgICAgZGVsZXRlIG1fcEZvbnQ7CiB9CiAKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi1ib29sIENGR0FTX0dFRm9udDo6TG9hZEZvbnRJbnRlcm5hbChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwKKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXworYm9vbCBDRkdBU19HRUZvbnQ6OkxvYWRGb250SW50ZXJuYWwoY29uc3Qgd2NoYXJfdCogcHN6Rm9udEZhbWlseSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3Rm9udFN0eWxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdDb2RlUGFnZSkgewogICBpZiAobV9wRm9udCkKICAgICByZXR1cm4gZmFsc2U7Ci0gIENGWF9CeXRlU3RyaW5nIGNzRm9udEZhbWlseTsKKyAgQnl0ZVN0cmluZyBjc0ZvbnRGYW1pbHk7CiAgIGlmIChwc3pGb250RmFtaWx5KQotICAgIGNzRm9udEZhbWlseSA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwc3pGb250RmFtaWx5KTsKLSAgdWludDMyX3QgZHdGbGFncyA9IDA7Ci0gIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfRml4ZWRQaXRjaCkKLSAgICBkd0ZsYWdzIHw9IEZYRk9OVF9GSVhFRF9QSVRDSDsKLSAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TZXJpZikKLSAgICBkd0ZsYWdzIHw9IEZYRk9OVF9TRVJJRjsKLSAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TeW1ib2xpYykKLSAgICBkd0ZsYWdzIHw9IEZYRk9OVF9TWU1CT0xJQzsKLSAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TY3JpcHQpCi0gICAgZHdGbGFncyB8PSBGWEZPTlRfU0NSSVBUOwotICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0l0YWxpYykKLSAgICBkd0ZsYWdzIHw9IEZYRk9OVF9JVEFMSUM7Ci0gIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfQm9sZCkKLSAgICBkd0ZsYWdzIHw9IEZYRk9OVF9CT0xEOwotICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0V4YWN0TWF0Y2gpCi0gICAgZHdGbGFncyB8PSBGWEZPTlRfRVhBQ1RNQVRDSDsKKyAgICBjc0ZvbnRGYW1pbHkgPSBCeXRlU3RyaW5nOjpGcm9tVW5pY29kZShwc3pGb250RmFtaWx5KTsKKwogICBpbnQzMl90IGlXZWlnaHQgPQotICAgICAgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9Cb2xkKSA/IEZYRk9OVF9GV19CT0xEIDogRlhGT05UX0ZXX05PUk1BTDsKKyAgICAgIEZvbnRTdHlsZUlzQm9sZChkd0ZvbnRTdHlsZXMpID8gRlhGT05UX0ZXX0JPTEQgOiBGWEZPTlRfRldfTk9STUFMOwogICBtX3BGb250ID0gbmV3IENGWF9Gb250OwotICBpZiAoKGR3RmxhZ3MgJiBGWEZPTlRfSVRBTElDKSAmJiAoZHdGbGFncyAmIEZYRk9OVF9CT0xEKSkKKyAgaWYgKEZvbnRTdHlsZUlzSXRhbGljKGR3Rm9udFN0eWxlcykgJiYgRm9udFN0eWxlSXNCb2xkKGR3Rm9udFN0eWxlcykpCiAgICAgY3NGb250RmFtaWx5ICs9ICIsQm9sZEl0YWxpYyI7Ci0gIGVsc2UgaWYgKGR3RmxhZ3MgJiBGWEZPTlRfQk9MRCkKKyAgZWxzZSBpZiAoRm9udFN0eWxlSXNCb2xkKGR3Rm9udFN0eWxlcykpCiAgICAgY3NGb250RmFtaWx5ICs9ICIsQm9sZCI7Ci0gIGVsc2UgaWYgKGR3RmxhZ3MgJiBGWEZPTlRfSVRBTElDKQorICBlbHNlIGlmIChGb250U3R5bGVJc0l0YWxpYyhkd0ZvbnRTdHlsZXMpKQogICAgIGNzRm9udEZhbWlseSArPSAiLEl0YWxpYyI7Ci0gIG1fcEZvbnQtPkxvYWRTdWJzdChjc0ZvbnRGYW1pbHksIHRydWUsIGR3RmxhZ3MsIGlXZWlnaHQsIDAsIHdDb2RlUGFnZSwgZmFsc2UpOworCisgIG1fcEZvbnQtPkxvYWRTdWJzdChjc0ZvbnRGYW1pbHksIHRydWUsIGR3Rm9udFN0eWxlcywgaVdlaWdodCwgMCwgd0NvZGVQYWdlLAorICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICBpZiAoIW1fcEZvbnQtPkdldEZhY2UoKSkKICAgICByZXR1cm4gZmFsc2U7CiAgIHJldHVybiBJbml0Rm9udCgpOwogfQotCi1ib29sIENGR0FTX0dFRm9udDo6TG9hZEZvbnRJbnRlcm5hbChjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGxlbmd0aCkgewotICBpZiAobV9wRm9udCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbV9wRm9udCA9IG5ldyBDRlhfRm9udDsKLSAgaWYgKCFtX3BGb250LT5Mb2FkRW1iZWRkZWQocEJ1ZmZlciwgbGVuZ3RoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiBJbml0Rm9udCgpOwotfQotCi1ib29sIENGR0FTX0dFRm9udDo6TG9hZEZvbnRJbnRlcm5hbCgKLSAgICBjb25zdCBDRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4mIHBGb250U3RyZWFtLAotICAgIGJvb2wgYlNhdmVTdHJlYW0pIHsKLSAgaWYgKG1fcEZvbnQgfHwgbV9wRmlsZVJlYWQgfHwgIXBGb250U3RyZWFtIHx8IHBGb250U3RyZWFtLT5HZXRMZW5ndGgoKSA8IDEpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoYlNhdmVTdHJlYW0pCi0gICAgbV9wU3RyZWFtID0gcEZvbnRTdHJlYW07Ci0KLSAgbV9wRmlsZVJlYWQgPSBwRm9udFN0cmVhbS0+TWFrZVNlZWthYmxlUmVhZFN0cmVhbSgpOwotICBtX3BGb250ID0gbmV3IENGWF9Gb250OwotICBpZiAoIW1fcEZvbnQtPkxvYWRGaWxlKG1fcEZpbGVSZWFkKSkgewotICAgIG1fcEZpbGVSZWFkLlJlc2V0KCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBJbml0Rm9udCgpOwotfQotI2VuZGlmICAvLyBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisjZW5kaWYgIC8vIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCiAKIGJvb2wgQ0ZHQVNfR0VGb250OjpMb2FkRm9udEludGVybmFsKENGWF9Gb250KiBwRXh0ZXJuYWxGb250KSB7CiAgIGlmIChtX3BGb250IHx8ICFwRXh0ZXJuYWxGb250KQpAQCAtMjExLDEyMSArMTE4LDg4IEBACiAgIGlmICghbV9wRm9udCkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgaWYgKCFtX3BGb250RW5jb2RpbmcpIHsKLSAgICBtX3BGb250RW5jb2RpbmcucmVzZXQoRlhfQ3JlYXRlRm9udEVuY29kaW5nRXgobV9wRm9udCkpOwotICAgIGlmICghbV9wRm9udEVuY29kaW5nKQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghbV9wQ2hhcldpZHRoTWFwKSB7Ci0gICAgbV9wQ2hhcldpZHRoTWFwID0KLSAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9EaXNjcmV0ZUFycmF5VGVtcGxhdGU8dWludDE2X3Q+PigxMDI0KTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKKyAgaWYgKG1fcEZvbnRFbmNvZGluZykKKyAgICByZXR1cm4gdHJ1ZTsKKworICBtX3BGb250RW5jb2RpbmcgPSBGWF9DcmVhdGVGb250RW5jb2RpbmdFeChtX3BGb250LCBGWEZNX0VOQ09ESU5HX05PTkUpOworICByZXR1cm4gISFtX3BGb250RW5jb2Rpbmc7CiB9CiAKLUNGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBDRkdBU19HRUZvbnQ6OkRlcml2ZSh1aW50MzJfdCBkd0ZvbnRTdHlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd0NvZGVQYWdlKSB7Ci0gIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBwRm9udCh0aGlzKTsKLSAgaWYgKEdldEZvbnRTdHlsZXMoKSA9PSBkd0ZvbnRTdHlsZXMpCi0gICAgcmV0dXJuIHBGb250OwotICByZXR1cm4gcGRmaXVtOjpNYWtlUmV0YWluPENGR0FTX0dFRm9udD4ocEZvbnQsIGR3Rm9udFN0eWxlcyk7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENGR0FTX0dFRm9udDo6R2V0RmFtaWx5TmFtZSgpIGNvbnN0IHsKK1dpZGVTdHJpbmcgQ0ZHQVNfR0VGb250OjpHZXRGYW1pbHlOYW1lKCkgY29uc3QgewogICBpZiAoIW1fcEZvbnQtPkdldFN1YnN0Rm9udCgpIHx8CiAgICAgICBtX3BGb250LT5HZXRTdWJzdEZvbnQoKS0+bV9GYW1pbHkuR2V0TGVuZ3RoKCkgPT0gMCkgewotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKG1fcEZvbnQtPkdldEZhbWlseU5hbWUoKS5Bc1N0cmluZ0MoKSk7CisgICAgcmV0dXJuIFdpZGVTdHJpbmc6OkZyb21Mb2NhbChtX3BGb250LT5HZXRGYW1pbHlOYW1lKCkuQXNTdHJpbmdWaWV3KCkpOwogICB9Ci0gIHJldHVybiBDRlhfV2lkZVN0cmluZzo6RnJvbUxvY2FsKAotICAgICAgbV9wRm9udC0+R2V0U3Vic3RGb250KCktPm1fRmFtaWx5LkFzU3RyaW5nQygpKTsKKyAgcmV0dXJuIFdpZGVTdHJpbmc6OkZyb21Mb2NhbCgKKyAgICAgIG1fcEZvbnQtPkdldFN1YnN0Rm9udCgpLT5tX0ZhbWlseS5Bc1N0cmluZ1ZpZXcoKSk7CiB9CiAKIHVpbnQzMl90IENGR0FTX0dFRm9udDo6R2V0Rm9udFN0eWxlcygpIGNvbnN0IHsKICAgQVNTRVJUKG1fcEZvbnQpOwotI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18KICAgaWYgKG1fYlVzZUxvZ0ZvbnRTdHlsZSkKICAgICByZXR1cm4gbV9kd0xvZ0ZvbnRTdHlsZTsKLSNlbmRpZgogCiAgIHVpbnQzMl90IGR3U3R5bGVzID0gMDsKICAgYXV0byogcFN1YnN0Rm9udCA9IG1fcEZvbnQtPkdldFN1YnN0Rm9udCgpOwogICBpZiAocFN1YnN0Rm9udCkgewogICAgIGlmIChwU3Vic3RGb250LT5tX1dlaWdodCA9PSBGWEZPTlRfRldfQk9MRCkKLSAgICAgIGR3U3R5bGVzIHw9IEZYX0ZPTlRTVFlMRV9Cb2xkOwotICAgIGlmIChwU3Vic3RGb250LT5tX1N1YnN0RmxhZ3MgJiBGWEZPTlRfU1VCU1RfSVRBTElDKQotICAgICAgZHdTdHlsZXMgfD0gRlhfRk9OVFNUWUxFX0l0YWxpYzsKKyAgICAgIGR3U3R5bGVzIHw9IEZYRk9OVF9CT0xEOworICAgIGlmIChwU3Vic3RGb250LT5tX2JGbGFnSXRhbGljKQorICAgICAgZHdTdHlsZXMgfD0gRlhGT05UX0lUQUxJQzsKICAgfSBlbHNlIHsKICAgICBpZiAobV9wRm9udC0+SXNCb2xkKCkpCi0gICAgICBkd1N0eWxlcyB8PSBGWF9GT05UU1RZTEVfQm9sZDsKKyAgICAgIGR3U3R5bGVzIHw9IEZYRk9OVF9CT0xEOwogICAgIGlmIChtX3BGb250LT5Jc0l0YWxpYygpKQotICAgICAgZHdTdHlsZXMgfD0gRlhfRk9OVFNUWUxFX0l0YWxpYzsKKyAgICAgIGR3U3R5bGVzIHw9IEZYRk9OVF9JVEFMSUM7CiAgIH0KICAgcmV0dXJuIGR3U3R5bGVzOwogfQogCi1ib29sIENGR0FTX0dFRm9udDo6R2V0Q2hhcldpZHRoKEZYX1dDSEFSIHdVbmljb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNoYXJDb2RlKSB7Ci0gIHJldHVybiBHZXRDaGFyV2lkdGhJbnRlcm5hbCh3VW5pY29kZSwgaVdpZHRoLCB0cnVlLCBiQ2hhckNvZGUpOwotfQotCi1ib29sIENGR0FTX0dFRm9udDo6R2V0Q2hhcldpZHRoSW50ZXJuYWwoRlhfV0NIQVIgd1VuaWNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJlY3Vyc2l2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJDaGFyQ29kZSkgewotICBBU1NFUlQobV9wQ2hhcldpZHRoTWFwKTsKLSAgaVdpZHRoID0gbV9wQ2hhcldpZHRoTWFwLT5HZXRBdCh3VW5pY29kZSwgMCk7Citib29sIENGR0FTX0dFRm9udDo6R2V0Q2hhcldpZHRoKHdjaGFyX3Qgd1VuaWNvZGUsIGludDMyX3QmIGlXaWR0aCkgeworICBhdXRvIGl0ID0gbV9DaGFyV2lkdGhNYXAuZmluZCh3VW5pY29kZSk7CisgIGlXaWR0aCA9IGl0ICE9IG1fQ2hhcldpZHRoTWFwLmVuZCgpID8gaXQtPnNlY29uZCA6IDA7CiAgIGlmIChpV2lkdGggPT0gNjU1MzUpCiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIGlmIChpV2lkdGggPiAwKQogICAgIHJldHVybiB0cnVlOwogCi0gIGlmICghbV9wUHJvdmlkZXIgfHwKLSAgICAgICFtX3BQcm92aWRlci0+R2V0Q2hhcldpZHRoKENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250Pih0aGlzKSwgd1VuaWNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hhckNvZGUsICZpV2lkdGgpKSB7Ci0gICAgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IHBGb250OwotICAgIGludDMyX3QgaUdseXBoID0gR2V0R2x5cGhJbmRleCh3VW5pY29kZSwgdHJ1ZSwgJnBGb250LCBiQ2hhckNvZGUpOworICBpZiAoIW1fcFByb3ZpZGVyIHx8ICFtX3BQcm92aWRlci0+R2V0Q2hhcldpZHRoKFJldGFpblB0cjxDRkdBU19HRUZvbnQ+KHRoaXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdVbmljb2RlLCAmaVdpZHRoKSkgeworICAgIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+IHBGb250OworICAgIGludDMyX3QgaUdseXBoOworICAgIHN0ZDo6dGllKGlHbHlwaCwgcEZvbnQpID0gR2V0R2x5cGhJbmRleEFuZEZvbnQod1VuaWNvZGUsIHRydWUpOwogICAgIGlmIChpR2x5cGggIT0gMHhGRkZGICYmIHBGb250KSB7CiAgICAgICBpZiAocEZvbnQuR2V0KCkgPT0gdGhpcykgewogICAgICAgICBpV2lkdGggPSBtX3BGb250LT5HZXRHbHlwaFdpZHRoKGlHbHlwaCk7CiAgICAgICAgIGlmIChpV2lkdGggPCAwKQogICAgICAgICAgIGlXaWR0aCA9IC0xOwotICAgICAgfSBlbHNlIGlmIChwRm9udC0+R2V0Q2hhcldpZHRoSW50ZXJuYWwod1VuaWNvZGUsIGlXaWR0aCwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hhckNvZGUpKSB7CisgICAgICB9IGVsc2UgaWYgKHBGb250LT5HZXRDaGFyV2lkdGgod1VuaWNvZGUsIGlXaWR0aCkpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIGlXaWR0aCA9IC0xOwogICAgIH0KICAgfQotICBtX3BDaGFyV2lkdGhNYXAtPlNldEF0R3Jvdyh3VW5pY29kZSwgaVdpZHRoKTsKKyAgbV9DaGFyV2lkdGhNYXBbd1VuaWNvZGVdID0gaVdpZHRoOwogICByZXR1cm4gaVdpZHRoID4gMDsKIH0KIAotYm9vbCBDRkdBU19HRUZvbnQ6OkdldENoYXJCQm94KEZYX1dDSEFSIHdVbmljb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0KiBiYm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNoYXJDb2RlKSB7Ci0gIHJldHVybiBHZXRDaGFyQkJveEludGVybmFsKHdVbmljb2RlLCBiYm94LCB0cnVlLCBiQ2hhckNvZGUpOwotfQotCi1ib29sIENGR0FTX0dFRm9udDo6R2V0Q2hhckJCb3hJbnRlcm5hbChGWF9XQ0hBUiB3VW5pY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0KiBiYm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmVjdXJzaXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ2hhckNvZGUpIHsKK2Jvb2wgQ0ZHQVNfR0VGb250OjpHZXRDaGFyQkJveCh3Y2hhcl90IHdVbmljb2RlLCBDRlhfUmVjdCogYmJveCkgewogICBhdXRvIGl0ID0gbV9CQm94TWFwLmZpbmQod1VuaWNvZGUpOwogICBpZiAoaXQgIT0gbV9CQm94TWFwLmVuZCgpKSB7CiAgICAgKmJib3ggPSBpdC0+c2Vjb25kOwogICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IHBGb250OwotICBpbnQzMl90IGlHbHlwaCA9IEdldEdseXBoSW5kZXgod1VuaWNvZGUsIHRydWUsICZwRm9udCwgYkNoYXJDb2RlKTsKKyAgUmV0YWluUHRyPENGR0FTX0dFRm9udD4gcEZvbnQ7CisgIGludDMyX3QgaUdseXBoOworICBzdGQ6OnRpZShpR2x5cGgsIHBGb250KSA9IEdldEdseXBoSW5kZXhBbmRGb250KHdVbmljb2RlLCB0cnVlKTsKICAgaWYgKCFwRm9udCB8fCBpR2x5cGggPT0gMHhGRkZGKQogICAgIHJldHVybiBmYWxzZTsKIAogICBpZiAocEZvbnQuR2V0KCkgIT0gdGhpcykKLSAgICByZXR1cm4gcEZvbnQtPkdldENoYXJCQm94SW50ZXJuYWwod1VuaWNvZGUsIGJib3gsIGZhbHNlLCBiQ2hhckNvZGUpOworICAgIHJldHVybiBwRm9udC0+R2V0Q2hhckJCb3god1VuaWNvZGUsIGJib3gpOwogCiAgIEZYX1JFQ1QgcnRCQm94OwogICBpZiAoIW1fcEZvbnQtPkdldEdseXBoQkJveChpR2x5cGgsIHJ0QkJveCkpCkBAIC0zNDksNjQgKzIyMyw2MiBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotaW50MzJfdCBDRkdBU19HRUZvbnQ6OkdldEdseXBoSW5kZXgoRlhfV0NIQVIgd1VuaWNvZGUsIGJvb2wgYkNoYXJDb2RlKSB7Ci0gIHJldHVybiBHZXRHbHlwaEluZGV4KHdVbmljb2RlLCB0cnVlLCBudWxscHRyLCBiQ2hhckNvZGUpOworaW50MzJfdCBDRkdBU19HRUZvbnQ6OkdldEdseXBoSW5kZXgod2NoYXJfdCB3VW5pY29kZSkgeworICBpbnQzMl90IGdseXBoOworICBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBmb250OworICBzdGQ6OnRpZShnbHlwaCwgZm9udCkgPSBHZXRHbHlwaEluZGV4QW5kRm9udCh3VW5pY29kZSwgdHJ1ZSk7CisgIHJldHVybiBnbHlwaDsKIH0KIAotaW50MzJfdCBDRkdBU19HRUZvbnQ6OkdldEdseXBoSW5kZXgoRlhfV0NIQVIgd1VuaWNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZWN1cnNpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4qIHBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNoYXJDb2RlKSB7CitzdGQ6OnBhaXI8aW50MzJfdCwgUmV0YWluUHRyPENGR0FTX0dFRm9udD4+IENGR0FTX0dFRm9udDo6R2V0R2x5cGhJbmRleEFuZEZvbnQoCisgICAgd2NoYXJfdCB3VW5pY29kZSwKKyAgICBib29sIGJSZWN1cnNpdmUpIHsKICAgaW50MzJfdCBpR2x5cGhJbmRleCA9IG1fcEZvbnRFbmNvZGluZy0+R2x5cGhGcm9tQ2hhckNvZGUod1VuaWNvZGUpOwotICBpZiAoaUdseXBoSW5kZXggPiAwKSB7Ci0gICAgaWYgKHBwRm9udCkKLSAgICAgIHBwRm9udC0+UmVzZXQodGhpcyk7Ci0gICAgcmV0dXJuIGlHbHlwaEluZGV4OwotICB9CisgIGlmIChpR2x5cGhJbmRleCA+IDApCisgICAgcmV0dXJuIHtpR2x5cGhJbmRleCwgUmV0YWluUHRyPENGR0FTX0dFRm9udD4odGhpcyl9OworCiAgIGNvbnN0IEZHQVNfRk9OVFVTQiogcEZvbnRVU0IgPSBGR0FTX0dldFVuaWNvZGVCaXRGaWVsZCh3VW5pY29kZSk7CiAgIGlmICghcEZvbnRVU0IpCi0gICAgcmV0dXJuIDB4RkZGRjsKKyAgICByZXR1cm4gezB4RkZGRiwgbnVsbHB0cn07CiAKICAgdWludDE2X3Qgd0JpdEZpZWxkID0gcEZvbnRVU0ItPndCaXRGaWVsZDsKICAgaWYgKHdCaXRGaWVsZCA+PSAxMjgpCi0gICAgcmV0dXJuIDB4RkZGRjsKKyAgICByZXR1cm4gezB4RkZGRiwgbnVsbHB0cn07CiAKICAgYXV0byBpdCA9IG1fRm9udE1hcHBlci5maW5kKHdVbmljb2RlKTsKICAgaWYgKGl0ICE9IG1fRm9udE1hcHBlci5lbmQoKSAmJiBpdC0+c2Vjb25kICYmIGl0LT5zZWNvbmQuR2V0KCkgIT0gdGhpcykgewotICAgIGlHbHlwaEluZGV4ID0KLSAgICAgICAgaXQtPnNlY29uZC0+R2V0R2x5cGhJbmRleCh3VW5pY29kZSwgZmFsc2UsIG51bGxwdHIsIGJDaGFyQ29kZSk7CisgICAgUmV0YWluUHRyPENGR0FTX0dFRm9udD4gZm9udDsKKyAgICBzdGQ6OnRpZShpR2x5cGhJbmRleCwgZm9udCkgPQorICAgICAgICBpdC0+c2Vjb25kLT5HZXRHbHlwaEluZGV4QW5kRm9udCh3VW5pY29kZSwgZmFsc2UpOwogICAgIGlmIChpR2x5cGhJbmRleCAhPSAweEZGRkYpIHsKICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9TdWJzdEZvbnRzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmIChtX1N1YnN0Rm9udHNbaV0gPT0gaXQtPnNlY29uZCkgewotICAgICAgICAgIGlmIChwcEZvbnQpCi0gICAgICAgICAgICAqcHBGb250ID0gaXQtPnNlY29uZDsKLSAgICAgICAgICByZXR1cm4gKGlHbHlwaEluZGV4IHwgKChpICsgMSkgPDwgMjQpKTsKLSAgICAgICAgfQorICAgICAgICBpZiAobV9TdWJzdEZvbnRzW2ldID09IGl0LT5zZWNvbmQpCisgICAgICAgICAgcmV0dXJuIHsoaUdseXBoSW5kZXggfCAoKGkgKyAxKSA8PCAyNCkpLCBpdC0+c2Vjb25kfTsKICAgICAgIH0KICAgICB9CiAgIH0KICAgaWYgKCFtX3BGb250TWdyIHx8ICFiUmVjdXJzaXZlKQotICAgIHJldHVybiAweEZGRkY7CisgICAgcmV0dXJuIHsweEZGRkYsIG51bGxwdHJ9OwogCi0gIENGWF9XaWRlU3RyaW5nIHdzRmFtaWx5ID0gR2V0RmFtaWx5TmFtZSgpOwotICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gcEZvbnQgPQorICBXaWRlU3RyaW5nIHdzRmFtaWx5ID0gR2V0RmFtaWx5TmFtZSgpOworICBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBwRm9udCA9CiAgICAgICBtX3BGb250TWdyLT5HZXRGb250QnlVbmljb2RlKHdVbmljb2RlLCBHZXRGb250U3R5bGVzKCksIHdzRmFtaWx5LmNfc3RyKCkpOwotI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKyNpZiBfRlhfUExBVEZPUk1fICE9IF9GWF9QTEFURk9STV9XSU5ET1dTXwogICBpZiAoIXBGb250KQogICAgIHBGb250ID0gbV9wRm9udE1nci0+R2V0Rm9udEJ5VW5pY29kZSh3VW5pY29kZSwgR2V0Rm9udFN0eWxlcygpLCBudWxscHRyKTsKICNlbmRpZgogICBpZiAoIXBGb250IHx8IHBGb250LkdldCgpID09IHRoaXMpICAvLyBBdm9pZHMgZGlyZWN0IGN5Y2xlcyBiZWxvdy4KLSAgICByZXR1cm4gMHhGRkZGOworICAgIHJldHVybiB7MHhGRkZGLCBudWxscHRyfTsKIAogICBtX0ZvbnRNYXBwZXJbd1VuaWNvZGVdID0gcEZvbnQ7CiAgIG1fU3Vic3RGb250cy5wdXNoX2JhY2socEZvbnQpOwotICBpR2x5cGhJbmRleCA9IHBGb250LT5HZXRHbHlwaEluZGV4KHdVbmljb2RlLCBmYWxzZSwgbnVsbHB0ciwgYkNoYXJDb2RlKTsKLSAgaWYgKGlHbHlwaEluZGV4ID09IDB4RkZGRikKLSAgICByZXR1cm4gMHhGRkZGOwogCi0gIGlmIChwcEZvbnQpCi0gICAgKnBwRm9udCA9IHBGb250OwotICByZXR1cm4gKGlHbHlwaEluZGV4IHwgKG1fU3Vic3RGb250cy5zaXplKCkgPDwgMjQpKTsKKyAgUmV0YWluUHRyPENGR0FTX0dFRm9udD4gZm9udDsKKyAgc3RkOjp0aWUoaUdseXBoSW5kZXgsIGZvbnQpID0gcEZvbnQtPkdldEdseXBoSW5kZXhBbmRGb250KHdVbmljb2RlLCBmYWxzZSk7CisgIGlmIChpR2x5cGhJbmRleCA9PSAweEZGRkYpCisgICAgcmV0dXJuIHsweEZGRkYsIG51bGxwdHJ9OworCisgIHJldHVybiB7KGlHbHlwaEluZGV4IHwgKG1fU3Vic3RGb250cy5zaXplKCkgPDwgMjQpKSwgcEZvbnR9OwogfQogCiBpbnQzMl90IENGR0FTX0dFRm9udDo6R2V0QXNjZW50KCkgY29uc3QgewpAQCAtNDE3LDkgKzI4OSw5IEBACiAgIHJldHVybiBtX3BGb250LT5HZXREZXNjZW50KCk7CiB9CiAKLUNGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBDRkdBU19HRUZvbnQ6OkdldFN1YnN0Rm9udChpbnQzMl90IGlHbHlwaEluZGV4KSB7CitSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBDRkdBU19HRUZvbnQ6OkdldFN1YnN0Rm9udChpbnQzMl90IGlHbHlwaEluZGV4KSB7CiAgIGlHbHlwaEluZGV4ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlHbHlwaEluZGV4KSA+PiAyNDsKICAgaWYgKGlHbHlwaEluZGV4ID09IDApCi0gICAgcmV0dXJuIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250Pih0aGlzKTsKKyAgICByZXR1cm4gUmV0YWluUHRyPENGR0FTX0dFRm9udD4odGhpcyk7CiAgIHJldHVybiBtX1N1YnN0Rm9udHNbaUdseXBoSW5kZXggLSAxXTsKIH0KZGlmZiAtLWdpdCBhL3hmYS9mZ2FzL2ZvbnQvY2ZnYXNfZ2Vmb250LmggYi94ZmEvZmdhcy9mb250L2NmZ2FzX2dlZm9udC5oCmluZGV4IDIyMDE3MjEuLjY0NjU2MmQgMTAwNjQ0Ci0tLSBhL3hmYS9mZ2FzL2ZvbnQvY2ZnYXNfZ2Vmb250LmgKKysrIGIveGZhL2ZnYXMvZm9udC9jZmdhc19nZWZvbnQuaApAQCAtOSwxMTAgKzksODkgQEAKIAogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9tZW1vcnkuaCIKLSNpbmNsdWRlICJ4ZmEvZmdhcy9jcnQvZmdhc191dGlscy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvdW5vd25lZF9wdHIuaCIKICNpbmNsdWRlICJ4ZmEvZmdhcy9mb250L2NmZ2FzX2ZvbnRtZ3IuaCIKKyNpbmNsdWRlICJ4ZmEvZmdhcy9mb250L2NmZ2FzX3BkZmZvbnRtZ3IuaCIKIAotI2RlZmluZSBGWEZPTlRfU1VCU1RfSVRBTElDIDB4MDIKLQotY2xhc3MgQ0ZHQVNfRm9udE1ncjsKIGNsYXNzIENGWF9Vbmljb2RlRW5jb2Rpbmc7Ci1jbGFzcyBDWEZBX1BERkZvbnRNZ3I7CiAKLWNsYXNzIENGR0FTX0dFRm9udCA6IHB1YmxpYyBDRlhfUmV0YWluYWJsZSB7CitjbGFzcyBDRkdBU19HRUZvbnQgOiBwdWJsaWMgUmV0YWluYWJsZSB7CiAgcHVibGljOgogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgZnJpZW5kIGNsYXNzIENGWF9SZXRhaW5QdHI7CisgIGZyaWVuZCBjbGFzcyBSZXRhaW5QdHI7CiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgotICBmcmllbmQgQ0ZYX1JldGFpblB0cjxUPiBwZGZpdW06Ok1ha2VSZXRhaW4oQXJncyYmLi4uIGFyZ3MpOworICBmcmllbmQgUmV0YWluUHRyPFQ+IHBkZml1bTo6TWFrZVJldGFpbihBcmdzJiYuLi4gYXJncyk7CiAKLSAgc3RhdGljIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBMb2FkRm9udChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZvbnRTdHlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd0NvZGVQYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGR0FTX0ZvbnRNZ3IqIHBGb250TWdyKTsKLSAgc3RhdGljIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBMb2FkRm9udChDRlhfRm9udCogcEV4dGVybmFsRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkdBU19Gb250TWdyKiBwRm9udE1ncik7Ci0gIHN0YXRpYyBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gTG9hZEZvbnQoCisgIHN0YXRpYyBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBMb2FkRm9udChjb25zdCB3Y2hhcl90KiBwc3pGb250RmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGb250U3R5bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd0NvZGVQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZHQVNfRm9udE1nciogcEZvbnRNZ3IpOworICBzdGF0aWMgUmV0YWluUHRyPENGR0FTX0dFRm9udD4gTG9hZEZvbnQoQ0ZYX0ZvbnQqIHBFeHRlcm5hbEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkdBU19Gb250TWdyKiBwRm9udE1ncik7CisgIHN0YXRpYyBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBMb2FkRm9udCgKICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRm9udD4gcEludGVybmFsRm9udCwKICAgICAgIENGR0FTX0ZvbnRNZ3IqIHBGb250TWdyKTsKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0gIHN0YXRpYyBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gTG9hZEZvbnQoY29uc3QgdWludDhfdCogcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZHQVNfRm9udE1nciogcEZvbnRNZ3IpOwotICBzdGF0aWMgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IExvYWRGb250KAotICAgICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+JiBwRm9udFN0cmVhbSwKLSAgICAgIENGR0FTX0ZvbnRNZ3IqIHBGb250TWdyLAotICAgICAgYm9vbCBiU2F2ZVN0cmVhbSk7Ci0jZW5kaWYKIAotICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gRGVyaXZlKHVpbnQzMl90IGR3Rm9udFN0eWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB3Q29kZVBhZ2UgPSAwKTsKICAgdWludDMyX3QgR2V0Rm9udFN0eWxlcygpIGNvbnN0OwotICBib29sIEdldENoYXJXaWR0aChGWF9XQ0hBUiB3VW5pY29kZSwgaW50MzJfdCYgaVdpZHRoLCBib29sIGJDaGFyQ29kZSk7Ci0gIGludDMyX3QgR2V0R2x5cGhJbmRleChGWF9XQ0hBUiB3VW5pY29kZSwgYm9vbCBiQ2hhckNvZGUgPSBmYWxzZSk7CisgIGJvb2wgR2V0Q2hhcldpZHRoKHdjaGFyX3Qgd1VuaWNvZGUsIGludDMyX3QmIGlXaWR0aCk7CisgIGludDMyX3QgR2V0R2x5cGhJbmRleCh3Y2hhcl90IHdVbmljb2RlKTsKICAgaW50MzJfdCBHZXRBc2NlbnQoKSBjb25zdDsKICAgaW50MzJfdCBHZXREZXNjZW50KCkgY29uc3Q7Ci0gIGJvb2wgR2V0Q2hhckJCb3goRlhfV0NIQVIgd1VuaWNvZGUsIENGWF9SZWN0KiBiYm94LCBib29sIGJDaGFyQ29kZSA9IGZhbHNlKTsKKworICBib29sIEdldENoYXJCQm94KHdjaGFyX3Qgd1VuaWNvZGUsIENGWF9SZWN0KiBiYm94KTsKICAgYm9vbCBHZXRCQm94KENGWF9SZWN0KiBiYm94KTsKLSAgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IEdldFN1YnN0Rm9udChpbnQzMl90IGlHbHlwaEluZGV4KTsKKworICBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBHZXRTdWJzdEZvbnQoaW50MzJfdCBpR2x5cGhJbmRleCk7CiAgIENGWF9Gb250KiBHZXREZXZGb250KCkgY29uc3QgeyByZXR1cm4gbV9wRm9udDsgfQotICB2b2lkIFNldEZvbnRQcm92aWRlcihDWEZBX1BERkZvbnRNZ3IqIHBQcm92aWRlcikgeyBtX3BQcm92aWRlciA9IHBQcm92aWRlcjsgfQotI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18KKworICB2b2lkIFNldEZvbnRQcm92aWRlcihDRkdBU19QREZGb250TWdyKiBwUHJvdmlkZXIpIHsKKyAgICBtX3BQcm92aWRlci5SZXNldChwUHJvdmlkZXIpOworICB9CisKICAgdm9pZCBTZXRMb2dpY2FsRm9udFN0eWxlKHVpbnQzMl90IGR3TG9nRm9udFN0eWxlKSB7CiAgICAgbV9iVXNlTG9nRm9udFN0eWxlID0gdHJ1ZTsKICAgICBtX2R3TG9nRm9udFN0eWxlID0gZHdMb2dGb250U3R5bGU7CiAgIH0KLSNlbmRpZgogCiAgcHJpdmF0ZToKICAgZXhwbGljaXQgQ0ZHQVNfR0VGb250KENGR0FTX0ZvbnRNZ3IqIHBGb250TWdyKTsKLSAgQ0ZHQVNfR0VGb250KGNvbnN0IENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiYgc3JjLCB1aW50MzJfdCBkd0ZvbnRTdHlsZXMpOwogICB+Q0ZHQVNfR0VGb250KCkgb3ZlcnJpZGU7CiAKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi0gIGJvb2wgTG9hZEZvbnRJbnRlcm5hbChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwKKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXworICBib29sIExvYWRGb250SW50ZXJuYWwoY29uc3Qgd2NoYXJfdCogcHN6Rm9udEZhbWlseSwKICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3Rm9udFN0eWxlcywKICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdDb2RlUGFnZSk7CiAgIGJvb2wgTG9hZEZvbnRJbnRlcm5hbChjb25zdCB1aW50OF90KiBwQnVmZmVyLCBpbnQzMl90IGxlbmd0aCk7Ci0gIGJvb2wgTG9hZEZvbnRJbnRlcm5hbChjb25zdCBDRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4mIHBGb250U3RyZWFtLAorICBib29sIExvYWRGb250SW50ZXJuYWwoY29uc3QgUmV0YWluUHRyPENGWF9TZWVrYWJsZVN0cmVhbVByb3h5PiYgcEZvbnRTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTYXZlU3RyZWFtKTsKLSNlbmRpZgotICBib29sIExvYWRGb250SW50ZXJuYWwoQ0ZYX0ZvbnQqIHBFeHRlcm5hbEZvbnQpOworI2VuZGlmICAvLyBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXwogICBib29sIExvYWRGb250SW50ZXJuYWwoc3RkOjp1bmlxdWVfcHRyPENGWF9Gb250PiBwSW50ZXJuYWxGb250KTsKKyAgYm9vbCBMb2FkRm9udEludGVybmFsKENGWF9Gb250KiBwRXh0ZXJuYWxGb250KTsKICAgYm9vbCBJbml0Rm9udCgpOwotICBib29sIEdldENoYXJCQm94SW50ZXJuYWwoRlhfV0NIQVIgd1VuaWNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdCogYmJveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJlY3Vyc2l2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNoYXJDb2RlID0gZmFsc2UpOwotICBib29sIEdldENoYXJXaWR0aEludGVybmFsKEZYX1dDSEFSIHdVbmljb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZWN1cnNpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ2hhckNvZGUpOwotICBpbnQzMl90IEdldEdseXBoSW5kZXgoRlhfV0NIQVIgd1VuaWNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZWN1cnNpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4qIHBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNoYXJDb2RlID0gZmFsc2UpOwotICBDRlhfV2lkZVN0cmluZyBHZXRGYW1pbHlOYW1lKCkgY29uc3Q7CisgIHN0ZDo6cGFpcjxpbnQzMl90LCBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250Pj4gR2V0R2x5cGhJbmRleEFuZEZvbnQoCisgICAgICB3Y2hhcl90IHdVbmljb2RlLAorICAgICAgYm9vbCBiUmVjdXJzaXZlKTsKKyAgV2lkZVN0cmluZyBHZXRGYW1pbHlOYW1lKCkgY29uc3Q7CiAKLSNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCiAgIGJvb2wgbV9iVXNlTG9nRm9udFN0eWxlOwogICB1aW50MzJfdCBtX2R3TG9nRm9udFN0eWxlOwotI2VuZGlmCiAgIENGWF9Gb250KiBtX3BGb250OwotICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gbV9wU3JjRm9udDsgIC8vIE9ubHkgc2V0IGJ5IGN0b3IsIHNvIG5vIGN5Y2xlcy4KLSAgQ0ZHQVNfRm9udE1nciogY29uc3QgbV9wRm9udE1ncjsKICAgYm9vbCBtX2JFeHRlcm5hbEZvbnQ7Ci0gIENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiBtX3BTdHJlYW07Ci0gIENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gbV9wRmlsZVJlYWQ7CisgIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+IG1fcFNyY0ZvbnQ7ICAvLyBPbmx5IHNldCBieSBjdG9yLCBzbyBubyBjeWNsZXMuCisgIENGR0FTX0ZvbnRNZ3I6Ok9ic2VydmVkUHRyIG1fcEZvbnRNZ3I7CisgIENGR0FTX1BERkZvbnRNZ3I6Ok9ic2VydmVkUHRyIG1fcFByb3ZpZGVyOworICBSZXRhaW5QdHI8Q0ZYX1NlZWthYmxlU3RyZWFtUHJveHk+IG1fcFN0cmVhbTsKKyAgUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IG1fcEZpbGVSZWFkOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1VuaWNvZGVFbmNvZGluZz4gbV9wRm9udEVuY29kaW5nOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0Rpc2NyZXRlQXJyYXlUZW1wbGF0ZTx1aW50MTZfdD4+IG1fcENoYXJXaWR0aE1hcDsKLSAgc3RkOjptYXA8RlhfV0NIQVIsIENGWF9SZWN0PiBtX0JCb3hNYXA7Ci0gIENYRkFfUERGRm9udE1nciogbV9wUHJvdmlkZXI7ICAvLyBub3Qgb3duZWQuCi0gIHN0ZDo6dmVjdG9yPENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250Pj4gbV9TdWJzdEZvbnRzOwotICBzdGQ6Om1hcDxGWF9XQ0hBUiwgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+PiBtX0ZvbnRNYXBwZXI7CisgIHN0ZDo6bWFwPHdjaGFyX3QsIGludDMyX3Q+IG1fQ2hhcldpZHRoTWFwOworICBzdGQ6Om1hcDx3Y2hhcl90LCBDRlhfUmVjdD4gbV9CQm94TWFwOworICBzdGQ6OnZlY3RvcjxSZXRhaW5QdHI8Q0ZHQVNfR0VGb250Pj4gbV9TdWJzdEZvbnRzOworICBzdGQ6Om1hcDx3Y2hhcl90LCBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250Pj4gbV9Gb250TWFwcGVyOwogfTsKIAogI2VuZGlmICAvLyBYRkFfRkdBU19GT05UX0NGR0FTX0dFRk9OVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2ZnYXMvZm9udC9jZmdhc19wZGZmb250bWdyLmNwcCBiL3hmYS9mZ2FzL2ZvbnQvY2ZnYXNfcGRmZm9udG1nci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQzNGFjOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9mZ2FzL2ZvbnQvY2ZnYXNfcGRmZm9udG1nci5jcHAKQEAgLTAsMCArMSwyMDQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9mZ2FzL2ZvbnQvY2ZnYXNfcGRmZm9udG1nci5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9mb250LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RvY3VtZW50LmgiCisjaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9jZmdhc19mb250bWdyLmgiCisjaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9jZmdhc19nZWZvbnQuaCIKKworbmFtZXNwYWNlIHsKKworLy8gVGhlIDUgbmFtZXMgcGVyIGVudHJ5IGFyZTogUHNOYW1lLCBOb3JtYWwsIEJvbGQsIEl0YWxpYywgQm9sZEl0YWxpYy4KK2NvbnN0IGNoYXIqIGNvbnN0IGdfWEZBUERGRm9udE5hbWVbXVs1XSA9IHsKKyAgICB7IkFkb2JlIFBJIFN0ZCIsICJBZG9iZVBJU3RkIiwgIkFkb2JlUElTdGQiLCAiQWRvYmVQSVN0ZCIsICJBZG9iZVBJU3RkIn0sCisgICAgeyJNeXJpYWQgUHJvIExpZ2h0IiwgIk15cmlhZFByby1MaWdodCIsICJNeXJpYWRQcm8tU2VtaWJvbGQiLAorICAgICAiTXlyaWFkUHJvLUxpZ2h0SXQiLCAiTXlyaWFkUHJvLVNlbWlib2xkSXQifSwKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitDRkdBU19QREZGb250TWdyOjpDRkdBU19QREZGb250TWdyKENQREZfRG9jdW1lbnQqIHBEb2MsIENGR0FTX0ZvbnRNZ3IqIHBGb250TWdyKQorICAgIDogbV9wRG9jKHBEb2MpLCBtX3BGb250TWdyKHBGb250TWdyKSB7CisgIEFTU0VSVChwRG9jKTsKKyAgQVNTRVJUKHBGb250TWdyKTsKK30KKworQ0ZHQVNfUERGRm9udE1ncjo6fkNGR0FTX1BERkZvbnRNZ3IoKSB7fQorCitSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBDRkdBU19QREZGb250TWdyOjpGaW5kRm9udChjb25zdCBCeXRlU3RyaW5nJiBzdHJQc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJCb2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiogcERzdFBERkZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTdHJpY3RNYXRjaCkgeworICBDUERGX0RpY3Rpb25hcnkqIHBGb250U2V0RGljdCA9CisgICAgICBtX3BEb2MtPkdldFJvb3QoKS0+R2V0RGljdEZvcigiQWNyb0Zvcm0iKS0+R2V0RGljdEZvcigiRFIiKTsKKyAgaWYgKCFwRm9udFNldERpY3QpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgcEZvbnRTZXREaWN0ID0gcEZvbnRTZXREaWN0LT5HZXREaWN0Rm9yKCJGb250Iik7CisgIGlmICghcEZvbnRTZXREaWN0KQorICAgIHJldHVybiBudWxscHRyOworCisgIEJ5dGVTdHJpbmcgbmFtZSA9IHN0clBzTmFtZTsKKyAgbmFtZS5SZW1vdmUoJyAnKTsKKyAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICpwRm9udFNldERpY3QpIHsKKyAgICBjb25zdCBCeXRlU3RyaW5nJiBrZXkgPSBpdC5maXJzdDsKKyAgICBDUERGX09iamVjdCogcE9iaiA9IGl0LnNlY29uZC5nZXQoKTsKKyAgICBpZiAoIVBzTmFtZU1hdGNoRFJGb250TmFtZShuYW1lLkFzU3RyaW5nVmlldygpLCBiQm9sZCwgYkl0YWxpYywga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTdHJpY3RNYXRjaCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCA9IFRvRGljdGlvbmFyeShwT2JqLT5HZXREaXJlY3QoKSk7CisgICAgaWYgKCFwRm9udERpY3QgfHwgcEZvbnREaWN0LT5HZXRTdHJpbmdGb3IoIlR5cGUiKSAhPSAiRm9udCIpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIENQREZfRm9udCogcFBERkZvbnQgPSBtX3BEb2MtPkxvYWRGb250KHBGb250RGljdCk7CisgICAgaWYgKCFwUERGRm9udCkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgaWYgKCFwUERGRm9udC0+SXNFbWJlZGRlZCgpKSB7CisgICAgICAqcERzdFBERkZvbnQgPSBwUERGRm9udDsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gQ0ZHQVNfR0VGb250OjpMb2FkRm9udChwUERGRm9udC0+R2V0Rm9udCgpLCBtX3BGb250TWdyLkdldCgpKTsKKyAgfQorICByZXR1cm4gbnVsbHB0cjsKK30KKworUmV0YWluUHRyPENGR0FTX0dFRm9udD4gQ0ZHQVNfUERGRm9udE1ncjo6R2V0Rm9udCgKKyAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NGb250RmFtaWx5LAorICAgIHVpbnQzMl90IGR3Rm9udFN0eWxlcywKKyAgICBDUERGX0ZvbnQqKiBwUERGRm9udCwKKyAgICBib29sIGJTdHJpY3RNYXRjaCkgeworICB1aW50MzJfdCBkd0hhc2hDb2RlID0gRlhfSGFzaENvZGVfR2V0Vyh3c0ZvbnRGYW1pbHksIGZhbHNlKTsKKyAgQnl0ZVN0cmluZyBzdHJLZXkgPSBCeXRlU3RyaW5nOjpGb3JtYXQoIiV1JXUiLCBkd0hhc2hDb2RlLCBkd0ZvbnRTdHlsZXMpOworICBhdXRvIGl0ID0gbV9Gb250TWFwLmZpbmQoc3RyS2V5KTsKKyAgaWYgKGl0ICE9IG1fRm9udE1hcC5lbmQoKSkKKyAgICByZXR1cm4gaXQtPnNlY29uZDsKKworICBCeXRlU3RyaW5nIGJzUHNOYW1lID0gQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUoV2lkZVN0cmluZyh3c0ZvbnRGYW1pbHkpKTsKKyAgYm9vbCBiQm9sZCA9IEZvbnRTdHlsZUlzQm9sZChkd0ZvbnRTdHlsZXMpOworICBib29sIGJJdGFsaWMgPSBGb250U3R5bGVJc0l0YWxpYyhkd0ZvbnRTdHlsZXMpOworICBCeXRlU3RyaW5nIHN0ckZvbnROYW1lID0gUHNOYW1lVG9Gb250TmFtZShic1BzTmFtZSwgYkJvbGQsIGJJdGFsaWMpOworICBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBwRm9udCA9CisgICAgICBGaW5kRm9udChzdHJGb250TmFtZSwgYkJvbGQsIGJJdGFsaWMsIHBQREZGb250LCBiU3RyaWN0TWF0Y2gpOworICBpZiAocEZvbnQpCisgICAgbV9Gb250TWFwW3N0cktleV0gPSBwRm9udDsKKworICByZXR1cm4gcEZvbnQ7Cit9CisKK0J5dGVTdHJpbmcgQ0ZHQVNfUERGRm9udE1ncjo6UHNOYW1lVG9Gb250TmFtZShjb25zdCBCeXRlU3RyaW5nJiBzdHJQc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQm9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJdGFsaWMpIHsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZ19YRkFQREZGb250TmFtZSk7ICsraSkgeworICAgIGlmIChzdHJQc05hbWUgPT0gZ19YRkFQREZGb250TmFtZVtpXVswXSkgeworICAgICAgc2l6ZV90IGluZGV4ID0gMTsKKyAgICAgIGlmIChiQm9sZCkKKyAgICAgICAgKytpbmRleDsKKyAgICAgIGlmIChiSXRhbGljKQorICAgICAgICBpbmRleCArPSAyOworICAgICAgcmV0dXJuIGdfWEZBUERGRm9udE5hbWVbaV1baW5kZXhdOworICAgIH0KKyAgfQorICByZXR1cm4gc3RyUHNOYW1lOworfQorCitib29sIENGR0FTX1BERkZvbnRNZ3I6OlBzTmFtZU1hdGNoRFJGb250TmFtZShjb25zdCBCeXRlU3RyaW5nVmlldyYgYnNQc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJCb2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXRhbGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgYnNEUkZvbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3RyaWN0TWF0Y2gpIHsKKyAgQnl0ZVN0cmluZyBic0RSTmFtZSA9IGJzRFJGb250TmFtZTsKKyAgYnNEUk5hbWUuUmVtb3ZlKCctJyk7CisgIHNpemVfdCBpUHNMZW4gPSBic1BzTmFtZS5HZXRMZW5ndGgoKTsKKyAgYXV0byBuSW5kZXggPSBic0RSTmFtZS5GaW5kKGJzUHNOYW1lKTsKKyAgaWYgKG5JbmRleC5oYXNfdmFsdWUoKSAmJiAhYlN0cmljdE1hdGNoKQorICAgIHJldHVybiB0cnVlOworCisgIGlmICghbkluZGV4Lmhhc192YWx1ZSgpIHx8IG5JbmRleC52YWx1ZSgpICE9IDApCisgICAgcmV0dXJuIGZhbHNlOworCisgIHNpemVfdCBpRGlmZmVyTGVuZ3RoID0gYnNEUk5hbWUuR2V0TGVuZ3RoKCkgLSBpUHNMZW47CisgIGlmIChpRGlmZmVyTGVuZ3RoID4gMSB8fCAoYkJvbGQgfHwgYkl0YWxpYykpIHsKKyAgICBhdXRvIGlCb2xkSW5kZXggPSBic0RSTmFtZS5GaW5kKCJCb2xkIik7CisgICAgaWYgKGJCb2xkICE9IGlCb2xkSW5kZXguaGFzX3ZhbHVlKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaUJvbGRJbmRleC5oYXNfdmFsdWUoKSkgeworICAgICAgaURpZmZlckxlbmd0aCA9IHN0ZDo6bWluKGlEaWZmZXJMZW5ndGggLSA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJzRFJOYW1lLkdldExlbmd0aCgpIC0gaUJvbGRJbmRleC52YWx1ZSgpIC0gNCk7CisgICAgfQorICAgIGJvb2wgYkl0YWxpY0ZvbnQgPSB0cnVlOworICAgIGlmIChic0RSTmFtZS5Db250YWlucygiSXRhbGljIikpCisgICAgICBpRGlmZmVyTGVuZ3RoIC09IDY7CisgICAgZWxzZSBpZiAoYnNEUk5hbWUuQ29udGFpbnMoIkl0IikpCisgICAgICBpRGlmZmVyTGVuZ3RoIC09IDI7CisgICAgZWxzZSBpZiAoYnNEUk5hbWUuQ29udGFpbnMoIk9ibGlxdWUiKSkKKyAgICAgIGlEaWZmZXJMZW5ndGggLT0gNzsKKyAgICBlbHNlCisgICAgICBiSXRhbGljRm9udCA9IGZhbHNlOworCisgICAgaWYgKGJJdGFsaWMgIT0gYkl0YWxpY0ZvbnQpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoaURpZmZlckxlbmd0aCA+IDEpIHsKKyAgICAgIEJ5dGVTdHJpbmcgYnNEUlRhaWxlciA9IGJzRFJOYW1lLlJpZ2h0KGlEaWZmZXJMZW5ndGgpOworICAgICAgaWYgKGJzRFJUYWlsZXIgPT0gIk1UIiB8fCBic0RSVGFpbGVyID09ICJQU01UIiB8fAorICAgICAgICAgIGJzRFJUYWlsZXIgPT0gIlJlZ3VsYXIiIHx8IGJzRFJUYWlsZXIgPT0gIlJlZyIpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICBpZiAoaUJvbGRJbmRleC5oYXNfdmFsdWUoKSB8fCBiSXRhbGljRm9udCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBib29sIGJNYXRjaCA9IGZhbHNlOworICAgICAgc3dpdGNoIChic1BzTmFtZVtpUHNMZW4gLSAxXSkgeworICAgICAgICBjYXNlICdMJzoKKyAgICAgICAgICBpZiAoYnNEUk5hbWUuUmlnaHQoNSkgPT0gIkxpZ2h0IikKKyAgICAgICAgICAgIGJNYXRjaCA9IHRydWU7CisKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnUic6CisgICAgICAgICAgaWYgKGJzRFJOYW1lLlJpZ2h0KDcpID09ICJSZWd1bGFyIiB8fCBic0RSTmFtZS5SaWdodCgzKSA9PSAiUmVnIikKKyAgICAgICAgICAgIGJNYXRjaCA9IHRydWU7CisKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnTSc6CisgICAgICAgICAgaWYgKGJzRFJOYW1lLlJpZ2h0KDUpID09ICJNZWRpdW0iKQorICAgICAgICAgICAgYk1hdGNoID0gdHJ1ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHJldHVybiBiTWF0Y2g7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIENGR0FTX1BERkZvbnRNZ3I6OkdldENoYXJXaWR0aChjb25zdCBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiYgcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Y2hhcl90IHdVbmljb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcFdpZHRoKSB7CisgIGlmICh3VW5pY29kZSAhPSAweDIwKQorICAgIHJldHVybiBmYWxzZTsKKworICBhdXRvIGl0ID0gbV9GREUyUERGRm9udC5maW5kKHBGb250KTsKKyAgaWYgKGl0ID09IG1fRkRFMlBERkZvbnQuZW5kKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENQREZfRm9udCogcFBERkZvbnQgPSBpdC0+c2Vjb25kOworICAqcFdpZHRoID0gcFBERkZvbnQtPkdldENoYXJXaWR0aEYocFBERkZvbnQtPkNoYXJDb2RlRnJvbVVuaWNvZGUod1VuaWNvZGUpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ0ZHQVNfUERGRm9udE1ncjo6U2V0Rm9udChjb25zdCBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiYgcEZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiBwUERGRm9udCkgeworICBtX0ZERTJQREZGb250W3BGb250XSA9IHBQREZGb250OworfQpkaWZmIC0tZ2l0IGEveGZhL2ZnYXMvZm9udC9jZmdhc19wZGZmb250bWdyLmggYi94ZmEvZmdhcy9mb250L2NmZ2FzX3BkZmZvbnRtZ3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDE5OTkwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2ZnYXMvZm9udC9jZmdhc19wZGZmb250bWdyLmgKQEAgLTAsMCArMSw1OCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GR0FTX0ZPTlRfQ0ZHQVNfUERGRk9OVE1HUl9IXworI2RlZmluZSBYRkFfRkdBU19GT05UX0NGR0FTX1BERkZPTlRNR1JfSF8KKworI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kaWN0aW9uYXJ5LmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RvY3VtZW50LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L29ic2VydmFibGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKworY2xhc3MgQ0ZHQVNfRm9udE1ncjsKK2NsYXNzIENGR0FTX0dFRm9udDsKK2NsYXNzIENQREZfRG9jdW1lbnQ7CitjbGFzcyBDUERGX0ZvbnQ7CisKK2NsYXNzIENGR0FTX1BERkZvbnRNZ3IgOiBwdWJsaWMgT2JzZXJ2YWJsZTxDRkdBU19QREZGb250TWdyPiB7CisgcHVibGljOgorICBleHBsaWNpdCBDRkdBU19QREZGb250TWdyKENQREZfRG9jdW1lbnQqIHBEb2MsIENGR0FTX0ZvbnRNZ3IqIHBGb250TWdyKTsKKyAgfkNGR0FTX1BERkZvbnRNZ3IoKTsKKworICB2b2lkIFNldEZvbnQoY29uc3QgUmV0YWluUHRyPENGR0FTX0dFRm9udD4mIHBGb250LCBDUERGX0ZvbnQqIHBQREZGb250KTsKKyAgUmV0YWluUHRyPENGR0FTX0dFRm9udD4gR2V0Rm9udChjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NGb250RmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3Rm9udFN0eWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0ZvbnQqKiBwUERGRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTdHJpY3RNYXRjaCk7CisgIGJvb2wgR2V0Q2hhcldpZHRoKGNvbnN0IFJldGFpblB0cjxDRkdBU19HRUZvbnQ+JiBwRm9udCwKKyAgICAgICAgICAgICAgICAgICAgd2NoYXJfdCB3VW5pY29kZSwKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcFdpZHRoKTsKKworIHByaXZhdGU6CisgIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+IEZpbmRGb250KGNvbnN0IEJ5dGVTdHJpbmcmIHN0ckZhbWlseU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkJvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiogcFBERkZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0cmljdE1hdGNoKTsKKyAgQnl0ZVN0cmluZyBQc05hbWVUb0ZvbnROYW1lKGNvbnN0IEJ5dGVTdHJpbmcmIHN0clBzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkJvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJdGFsaWMpOworICBib29sIFBzTmFtZU1hdGNoRFJGb250TmFtZShjb25zdCBCeXRlU3RyaW5nVmlldyYgYnNQc05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkJvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkl0YWxpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZyYgYnNEUkZvbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTdHJpY3RNYXRjaCk7CisKKyAgVW5vd25lZFB0cjxDUERGX0RvY3VtZW50PiBjb25zdCBtX3BEb2M7CisgIFVub3duZWRQdHI8Q0ZHQVNfRm9udE1ncj4gY29uc3QgbV9wRm9udE1ncjsKKyAgc3RkOjptYXA8UmV0YWluUHRyPENGR0FTX0dFRm9udD4sIENQREZfRm9udCo+IG1fRkRFMlBERkZvbnQ7CisgIHN0ZDo6bWFwPEJ5dGVTdHJpbmcsIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+PiBtX0ZvbnRNYXA7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GR0FTX0ZPTlRfQ0ZHQVNfUERGRk9OVE1HUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2ZnYXMvZm9udC9mZ2FzX2ZvbnR1dGlscy5jcHAgYi94ZmEvZmdhcy9mb250L2ZnYXNfZm9udHV0aWxzLmNwcAppbmRleCBlNzQwNTZiLi4yY2Y1NmNlIDEwMDY0NAotLS0gYS94ZmEvZmdhcy9mb250L2ZnYXNfZm9udHV0aWxzLmNwcAorKysgYi94ZmEvZmdhcy9mb250L2ZnYXNfZm9udHV0aWxzLmNwcApAQCAtNiwxNDggKzYsMTkxMiBAQAogCiAjaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9mZ2FzX2ZvbnR1dGlscy5oIgogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9leHQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2NvZGVwYWdlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9leHRlbnNpb24uaCIKICNpbmNsdWRlICJ4ZmEvZmdhcy9mb250L2NmZ2FzX2ZvbnRtZ3IuaCIKIAotdWludDMyX3QgRkdBU19HZXRGb250SGFzaENvZGUodWludDE2X3Qgd0NvZGVQYWdlLCB1aW50MzJfdCBkd0ZvbnRTdHlsZXMpIHsKLSAgdWludDMyX3QgZHdIYXNoID0gd0NvZGVQYWdlOwotICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0ZpeGVkUGl0Y2gpIHsKLSAgICBkd0hhc2ggfD0gMHgwMDAxMDAwMDsKLSAgfQotICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX1NlcmlmKSB7Ci0gICAgZHdIYXNoIHw9IDB4MDAwMjAwMDA7Ci0gIH0KLSAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9TeW1ib2xpYykgewotICAgIGR3SGFzaCB8PSAweDAwMDQwMDAwOwotICB9Ci0gIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfU2NyaXB0KSB7Ci0gICAgZHdIYXNoIHw9IDB4MDAwODAwMDA7Ci0gIH0KLSAgaWYgKGR3Rm9udFN0eWxlcyAmIEZYX0ZPTlRTVFlMRV9JdGFsaWMpIHsKLSAgICBkd0hhc2ggfD0gMHgwMDEwMDAwMDsKLSAgfQotICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGQpIHsKLSAgICBkd0hhc2ggfD0gMHgwMDIwMDAwMDsKLSAgfQotICByZXR1cm4gZHdIYXNoOwotfQotdWludDMyX3QgRkdBU19HZXRGb250RmFtaWx5SGFzaChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGb250U3R5bGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB3Q29kZVBhZ2UpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NGb250KHBzekZvbnRGYW1pbHkpOwotICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGQpIHsKLSAgICB3c0ZvbnQgKz0gTCJCb2xkIjsKLSAgfQotICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0l0YWxpYykgewotICAgIHdzRm9udCArPSBMIkl0YWxpYyI7Ci0gIH0KLSAgd3NGb250ICs9IHdDb2RlUGFnZTsKLSAgcmV0dXJuIEZYX0hhc2hDb2RlX0dldFcod3NGb250LkFzU3RyaW5nQygpLCBmYWxzZSk7Ci19Ci1zdGF0aWMgY29uc3QgRkdBU19GT05UVVNCIGdfRlhHZGlGb250VVNCVGFibGVbXSA9IHsKLSAgICB7MHgwMDAwLCAweDAwN0YsIDAsIDEyNTJ9LCAgICAgezB4MDA4MCwgMHgwMEZGLCAxLCAxMjUyfSwKLSAgICB7MHgwMTAwLCAweDAxN0YsIDIsIDEyNTB9LCAgICAgezB4MDE4MCwgMHgwMjRGLCAzLCAxMjUwfSwKLSAgICB7MHgwMjUwLCAweDAyQUYsIDQsIDB4RkZGRn0sICAgezB4MDJCMCwgMHgwMkZGLCA1LCAweEZGRkZ9LAotICAgIHsweDAzMDAsIDB4MDM2RiwgNiwgMHhGRkZGfSwgICB7MHgwMzcwLCAweDAzRkYsIDcsIDEyNTN9LAotICAgIHsweDA0MDAsIDB4MDRGRiwgOSwgMTI1MX0sICAgICB7MHgwNTAwLCAweDA1MkYsIDksIDB4RkZGRn0sCi0gICAgezB4MDUzMCwgMHgwNThGLCAxMCwgMHhGRkZGfSwgIHsweDA1OTAsIDB4MDVGRiwgMTEsIDEyNTV9LAotICAgIHsweDA2MDAsIDB4MDZGRiwgMTMsIDEyNTZ9LCAgICB7MHgwNzAwLCAweDA3NEYsIDcxLCAweEZGRkZ9LAotICAgIHsweDA3NTAsIDB4MDc3RiwgMTMsIDB4RkZGRn0sICB7MHgwNzgwLCAweDA3QkYsIDcyLCAweEZGRkZ9LAotICAgIHsweDA3QzAsIDB4MDdGRiwgMTQsIDB4RkZGRn0sICB7MHgwODAwLCAweDA4RkYsIDk5OSwgMHhGRkZGfSwKLSAgICB7MHgwOTAwLCAweDA5N0YsIDE1LCAweEZGRkZ9LCAgezB4MDk4MCwgMHgwOUZGLCAxNiwgMHhGRkZGfSwKLSAgICB7MHgwQTAwLCAweDBBN0YsIDE3LCAweEZGRkZ9LCAgezB4MEE4MCwgMHgwQUZGLCAxOCwgMHhGRkZGfSwKLSAgICB7MHgwQjAwLCAweDBCN0YsIDE5LCAweEZGRkZ9LCAgezB4MEI4MCwgMHgwQkZGLCAyMCwgMHhGRkZGfSwKLSAgICB7MHgwQzAwLCAweDBDN0YsIDIxLCAweEZGRkZ9LCAgezB4MEM4MCwgMHgwQ0ZGLCAyMiwgMHhGRkZGfSwKLSAgICB7MHgwRDAwLCAweDBEN0YsIDIzLCAweEZGRkZ9LCAgezB4MEQ4MCwgMHgwREZGLCA3MywgMHhGRkZGfSwKLSAgICB7MHgwRTAwLCAweDBFN0YsIDI0LCA4NzR9LCAgICAgezB4MEU4MCwgMHgwRUZGLCAyNSwgMHhGRkZGfSwKLSAgICB7MHgwRjAwLCAweDBGRkYsIDcwLCAweEZGRkZ9LCAgezB4MTAwMCwgMHgxMDlGLCA3NCwgMHhGRkZGfSwKLSAgICB7MHgxMEEwLCAweDEwRkYsIDI2LCAweEZGRkZ9LCAgezB4MTEwMCwgMHgxMUZGLCAyOCwgMHhGRkZGfSwKLSAgICB7MHgxMjAwLCAweDEzN0YsIDc1LCAweEZGRkZ9LCAgezB4MTM4MCwgMHgxMzlGLCA3NSwgMHhGRkZGfSwKLSAgICB7MHgxM0EwLCAweDEzRkYsIDc2LCAweEZGRkZ9LCAgezB4MTQwMCwgMHgxNjdGLCA3NywgMHhGRkZGfSwKLSAgICB7MHgxNjgwLCAweDE2OUYsIDc4LCAweEZGRkZ9LCAgezB4MTZBMCwgMHgxNkZGLCA3OSwgMHhGRkZGfSwKLSAgICB7MHgxNzAwLCAweDE3MUYsIDg0LCAweEZGRkZ9LCAgezB4MTcyMCwgMHgxNzNGLCA4NCwgMHhGRkZGfSwKLSAgICB7MHgxNzQwLCAweDE3NUYsIDg0LCAweEZGRkZ9LCAgezB4MTc2MCwgMHgxNzdGLCA4NCwgMHhGRkZGfSwKLSAgICB7MHgxNzgwLCAweDE3RkYsIDgwLCAweEZGRkZ9LCAgezB4MTgwMCwgMHgxOEFGLCA4MSwgMHhGRkZGfSwKLSAgICB7MHgxOEIwLCAweDE4RkYsIDk5OSwgMHhGRkZGfSwgezB4MTkwMCwgMHgxOTRGLCA5MywgMHhGRkZGfSwKLSAgICB7MHgxOTUwLCAweDE5N0YsIDk0LCAweEZGRkZ9LCAgezB4MTk4MCwgMHgxOURGLCA5NSwgMHhGRkZGfSwKLSAgICB7MHgxOUUwLCAweDE5RkYsIDgwLCAweEZGRkZ9LCAgezB4MUEwMCwgMHgxQTFGLCA5NiwgMHhGRkZGfSwKLSAgICB7MHgxQTIwLCAweDFBRkYsIDk5OSwgMHhGRkZGfSwgezB4MUIwMCwgMHgxQjdGLCAyNywgMHhGRkZGfSwKLSAgICB7MHgxQjgwLCAweDFCQkYsIDExMiwgMHhGRkZGfSwgezB4MUJDMCwgMHgxQkZGLCA5OTksIDB4RkZGRn0sCi0gICAgezB4MUMwMCwgMHgxQzRGLCAxMTMsIDB4RkZGRn0sIHsweDFDNTAsIDB4MUM3RiwgMTE0LCAweEZGRkZ9LAotICAgIHsweDFDODAsIDB4MUNGRiwgOTk5LCAweEZGRkZ9LCB7MHgxRDAwLCAweDFEN0YsIDQsIDB4RkZGRn0sCi0gICAgezB4MUQ4MCwgMHgxREJGLCA0LCAweEZGRkZ9LCAgIHsweDFEQzAsIDB4MURGRiwgNiwgMHhGRkZGfSwKLSAgICB7MHgxRTAwLCAweDFFRkYsIDI5LCAweEZGRkZ9LCAgezB4MUYwMCwgMHgxRkZGLCAzMCwgMHhGRkZGfSwKLSAgICB7MHgyMDAwLCAweDIwNkYsIDMxLCAweEZGRkZ9LCAgezB4MjA3MCwgMHgyMDlGLCAzMiwgMHhGRkZGfSwKLSAgICB7MHgyMEEwLCAweDIwQ0YsIDMzLCAweEZGRkZ9LCAgezB4MjBEMCwgMHgyMEZGLCAzNCwgMHhGRkZGfSwKLSAgICB7MHgyMTAwLCAweDIxNEYsIDM1LCAweEZGRkZ9LCAgezB4MjE1MCwgMHgyMTVGLCAzNiwgMHhGRkZGfSwKLSAgICB7MHgyMTYwLCAweDIxNkIsIDM2LCA5MzZ9LCAgICAgezB4MjE2QywgMHgyMTZGLCAzNiwgMHhGRkZGfSwKLSAgICB7MHgyMTcwLCAweDIxNzksIDM2LCA5MzZ9LCAgICAgezB4MjE3QSwgMHgyMThGLCAzNiwgMHhGRkZGfSwKLSAgICB7MHgyMTkwLCAweDIxOTksIDM3LCA5NDl9LCAgICAgezB4MjE5QSwgMHgyMUZGLCAzNywgMHhGRkZGfSwKLSAgICB7MHgyMjAwLCAweDIyRkYsIDM4LCAweEZGRkZ9LCAgezB4MjMwMCwgMHgyM0ZGLCAzOSwgMHhGRkZGfSwKLSAgICB7MHgyNDAwLCAweDI0M0YsIDQwLCAweEZGRkZ9LCAgezB4MjQ0MCwgMHgyNDVGLCA0MSwgMHhGRkZGfSwKLSAgICB7MHgyNDYwLCAweDI0NzMsIDQyLCA5MzJ9LCAgICAgezB4MjQ3NCwgMHgyNDlCLCA0MiwgOTM2fSwKLSAgICB7MHgyNDlDLCAweDI0RTksIDQyLCA5NDl9LCAgICAgezB4MjRFQSwgMHgyNEZGLCA0MiwgMHhGRkZGfSwKLSAgICB7MHgyNTAwLCAweDI1NzMsIDQzLCA5MzZ9LCAgICAgezB4MjU3NCwgMHgyNTdGLCA0MywgMHhGRkZGfSwKLSAgICB7MHgyNTgwLCAweDI1ODAsIDQ0LCAweEZGRkZ9LCAgezB4MjU4MSwgMHgyNThGLCA0NCwgOTM2fSwKLSAgICB7MHgyNTkwLCAweDI1OUYsIDQ0LCAweEZGRkZ9LCAgezB4MjVBMCwgMHgyNUZGLCA0NSwgMHhGRkZGfSwKLSAgICB7MHgyNjAwLCAweDI2RkYsIDQ2LCAweEZGRkZ9LCAgezB4MjcwMCwgMHgyN0JGLCA0NywgMHhGRkZGfSwKLSAgICB7MHgyN0MwLCAweDI3RUYsIDM4LCAweEZGRkZ9LCAgezB4MjdGMCwgMHgyN0ZGLCAzNywgMHhGRkZGfSwKLSAgICB7MHgyODAwLCAweDI4RkYsIDgyLCAweEZGRkZ9LCAgezB4MjkwMCwgMHgyOTdGLCAzNywgMHhGRkZGfSwKLSAgICB7MHgyOTgwLCAweDI5RkYsIDM4LCAweEZGRkZ9LCAgezB4MkEwMCwgMHgyQUZGLCAzOCwgMHhGRkZGfSwKLSAgICB7MHgyQjAwLCAweDJCRkYsIDM3LCAweEZGRkZ9LCAgezB4MkMwMCwgMHgyQzVGLCA5NywgMHhGRkZGfSwKLSAgICB7MHgyQzYwLCAweDJDN0YsIDI5LCAweEZGRkZ9LCAgezB4MkM4MCwgMHgyQ0ZGLCA4LCAweEZGRkZ9LAotICAgIHsweDJEMDAsIDB4MkQyRiwgMjYsIDB4RkZGRn0sICB7MHgyRDMwLCAweDJEN0YsIDk4LCAweEZGRkZ9LAotICAgIHsweDJEODAsIDB4MkRERiwgNzUsIDB4RkZGRn0sICB7MHgyREUwLCAweDJERkYsIDksIDB4RkZGRn0sCi0gICAgezB4MkUwMCwgMHgyRTdGLCAzMSwgMHhGRkZGfSwgIHsweDJFODAsIDB4MkVGRiwgNTksIDB4RkZGRn0sCi0gICAgezB4MkYwMCwgMHgyRkRGLCA1OSwgMHhGRkZGfSwgIHsweDJGRTAsIDB4MkZFRiwgOTk5LCAweEZGRkZ9LAotICAgIHsweDJGRjAsIDB4MkZGRiwgNTksIDB4RkZGRn0sICB7MHgzMDAwLCAweDMwM0YsIDQ4LCAweEZGRkZ9LAotICAgIHsweDMwNDAsIDB4MzA5RiwgNDksIDkzMn0sICAgICB7MHgzMEEwLCAweDMwRkYsIDUwLCA5MzJ9LAotICAgIHsweDMxMDAsIDB4MzEyOSwgNTEsIDkzNn0sICAgICB7MHgzMTJBLCAweDMxMkYsIDUxLCAweEZGRkZ9LAotICAgIHsweDMxMzAsIDB4MzE4RiwgNTIsIDk0OX0sICAgICB7MHgzMTkwLCAweDMxOUYsIDU5LCAweEZGRkZ9LAotICAgIHsweDMxQTAsIDB4MzFCRiwgNTEsIDB4RkZGRn0sICB7MHgzMUMwLCAweDMxRUYsIDYxLCAweEZGRkZ9LAotICAgIHsweDMxRjAsIDB4MzFGRiwgNTAsIDB4RkZGRn0sICB7MHgzMjAwLCAweDMyMUMsIDU0LCA5NDl9LAotICAgIHsweDMyMUQsIDB4MzI1RiwgNTQsIDB4RkZGRn0sICB7MHgzMjYwLCAweDMyN0YsIDU0LCA5NDl9LAotICAgIHsweDMyODAsIDB4MzJGRiwgNTQsIDB4RkZGRn0sICB7MHgzMzAwLCAweDMzODcsIDU1LCAweEZGRkZ9LAotICAgIHsweDMzODgsIDB4MzNEMCwgNTUsIDk0OX0sICAgICB7MHgzM0QxLCAweDMzRkYsIDU1LCAweEZGRkZ9LAotICAgIHsweDM0MDAsIDB4NERCRiwgNTksIDB4RkZGRn0sICB7MHg0REMwLCAweDRERkYsIDk5LCAweEZGRkZ9LAotICAgIHsweDRFMDAsIDB4OUZBNSwgNTksIDkzNn0sICAgICB7MHg5RkE2LCAweDlGRkYsIDU5LCAweEZGRkZ9LAotICAgIHsweEEwMDAsIDB4QTQ4RiwgODMsIDB4RkZGRn0sICB7MHhBNDkwLCAweEE0Q0YsIDgzLCAweEZGRkZ9LAotICAgIHsweEE0RDAsIDB4QTRGRiwgOTk5LCAweEZGRkZ9LCB7MHhBNTAwLCAweEE2M0YsIDEyLCAweEZGRkZ9LAotICAgIHsweEE2NDAsIDB4QTY5RiwgOSwgMHhGRkZGfSwgICB7MHhBNkEwLCAweEE2RkYsIDk5OSwgMHhGRkZGfSwKLSAgICB7MHhBNzAwLCAweEE3MUYsIDUsIDB4RkZGRn0sICAgezB4QTcyMCwgMHhBN0ZGLCAyOSwgMHhGRkZGfSwKLSAgICB7MHhBODAwLCAweEE4MkYsIDEwMCwgMHhGRkZGfSwgezB4QTgzMCwgMHhBOEZGLCA5OTksIDB4RkZGRn0sCi0gICAgezB4QTg0MCwgMHhBODdGLCA1MywgMHhGRkZGfSwgIHsweEE4ODAsIDB4QThERiwgMTE1LCAweEZGRkZ9LAotICAgIHsweEE4RTAsIDB4QThGRiwgOTk5LCAweEZGRkZ9LCB7MHhBOTAwLCAweEE5MkYsIDExNiwgMHhGRkZGfSwKLSAgICB7MHhBOTMwLCAweEE5NUYsIDExNywgMHhGRkZGfSwgezB4QTk2MCwgMHhBOUZGLCA5OTksIDB4RkZGRn0sCi0gICAgezB4QUEwMCwgMHhBQTVGLCAxMTgsIDB4RkZGRn0sIHsweEFBNjAsIDB4QUJGRiwgOTk5LCAweEZGRkZ9LAotICAgIHsweEFDMDAsIDB4RDdBRiwgNTYsIDk0OX0sICAgICB7MHhEN0IwLCAweEQ3RkYsIDk5OSwgMHhGRkZGfSwKLSAgICB7MHhEODAwLCAweERCN0YsIDU3LCAweEZGRkZ9LCAgezB4REI4MCwgMHhEQkZGLCA1NywgMHhGRkZGfSwKLSAgICB7MHhEQzAwLCAweERGRkYsIDU3LCAweEZGRkZ9LCAgezB4RTAwMCwgMHhFODE0LCA2MCwgMHhGRkZGfSwKLSAgICB7MHhFODE1LCAweEU4NjQsIDYwLCA5MzZ9LCAgICAgezB4RTg2NSwgMHhGOEZGLCA2MCwgMHhGRkZGfSwKLSAgICB7MHhGOTAwLCAweEZBMEIsIDYxLCA5NDl9LCAgICAgezB4RkEwQywgMHhGQTBELCA2MSwgOTM2fSwKLSAgICB7MHhGQTBFLCAweEZBMkQsIDYxLCA5MzJ9LCAgICAgezB4RkEyRSwgMHhGQUZGLCA2MSwgMHhGRkZGfSwKLSAgICB7MHhGQjAwLCAweEZCNEYsIDYyLCAweEZGRkZ9LCAgezB4RkI1MCwgMHhGREZGLCA2MywgMTI1Nn0sCi0gICAgezB4RkUwMCwgMHhGRTBGLCA5MSwgMHhGRkZGfSwgIHsweEZFMTAsIDB4RkUxRiwgNjUsIDB4RkZGRn0sCi0gICAgezB4RkUyMCwgMHhGRTJGLCA2NCwgMHhGRkZGfSwgIHsweEZFMzAsIDB4RkU0RiwgNjUsIDB4RkZGRn0sCi0gICAgezB4RkU1MCwgMHhGRTZGLCA2NiwgMHhGRkZGfSwgIHsweEZFNzAsIDB4RkVGRiwgNjcsIDEyNTZ9LAotICAgIHsweEZGMDAsIDB4RkY1RiwgNjgsIDkzNn0sICAgICB7MHhGRjYwLCAweEZGOUYsIDY4LCA5MzJ9LAorbmFtZXNwYWNlIHsKKworY29uc3QgRkdBU19GT05UVVNCIGdfRlhHZGlGb250VVNCVGFibGVbXSA9IHsKKyAgICB7MHgwMDAwLCAweDAwN0YsIDAsIEZYX0NPREVQQUdFX01TV2luX1dlc3Rlcm5FdXJvcGVhbn0sCisgICAgezB4MDA4MCwgMHgwMEZGLCAxLCBGWF9DT0RFUEFHRV9NU1dpbl9XZXN0ZXJuRXVyb3BlYW59LAorICAgIHsweDAxMDAsIDB4MDE3RiwgMiwgRlhfQ09ERVBBR0VfTVNXaW5fRWFzdGVybkV1cm9wZWFufSwKKyAgICB7MHgwMTgwLCAweDAyNEYsIDMsIEZYX0NPREVQQUdFX01TV2luX0Vhc3Rlcm5FdXJvcGVhbn0sCisgICAgezB4MDI1MCwgMHgwMkFGLCA0LCAweEZGRkZ9LAorICAgIHsweDAyQjAsIDB4MDJGRiwgNSwgMHhGRkZGfSwKKyAgICB7MHgwMzAwLCAweDAzNkYsIDYsIDB4RkZGRn0sCisgICAgezB4MDM3MCwgMHgwM0ZGLCA3LCBGWF9DT0RFUEFHRV9NU1dpbl9HcmVla30sCisgICAgezB4MDQwMCwgMHgwNEZGLCA5LCBGWF9DT0RFUEFHRV9NU1dpbl9DeXJpbGxpY30sCisgICAgezB4MDUwMCwgMHgwNTJGLCA5LCAweEZGRkZ9LAorICAgIHsweDA1MzAsIDB4MDU4RiwgMTAsIDB4RkZGRn0sCisgICAgezB4MDU5MCwgMHgwNUZGLCAxMSwgRlhfQ09ERVBBR0VfTVNXaW5fSGVicmV3fSwKKyAgICB7MHgwNjAwLCAweDA2RkYsIDEzLCBGWF9DT0RFUEFHRV9NU1dpbl9BcmFiaWN9LAorICAgIHsweDA3MDAsIDB4MDc0RiwgNzEsIDB4RkZGRn0sCisgICAgezB4MDc1MCwgMHgwNzdGLCAxMywgMHhGRkZGfSwKKyAgICB7MHgwNzgwLCAweDA3QkYsIDcyLCAweEZGRkZ9LAorICAgIHsweDA3QzAsIDB4MDdGRiwgMTQsIDB4RkZGRn0sCisgICAgezB4MDgwMCwgMHgwOEZGLCA5OTksIDB4RkZGRn0sCisgICAgezB4MDkwMCwgMHgwOTdGLCAxNSwgMHhGRkZGfSwKKyAgICB7MHgwOTgwLCAweDA5RkYsIDE2LCAweEZGRkZ9LAorICAgIHsweDBBMDAsIDB4MEE3RiwgMTcsIDB4RkZGRn0sCisgICAgezB4MEE4MCwgMHgwQUZGLCAxOCwgMHhGRkZGfSwKKyAgICB7MHgwQjAwLCAweDBCN0YsIDE5LCAweEZGRkZ9LAorICAgIHsweDBCODAsIDB4MEJGRiwgMjAsIDB4RkZGRn0sCisgICAgezB4MEMwMCwgMHgwQzdGLCAyMSwgMHhGRkZGfSwKKyAgICB7MHgwQzgwLCAweDBDRkYsIDIyLCAweEZGRkZ9LAorICAgIHsweDBEMDAsIDB4MEQ3RiwgMjMsIDB4RkZGRn0sCisgICAgezB4MEQ4MCwgMHgwREZGLCA3MywgMHhGRkZGfSwKKyAgICB7MHgwRTAwLCAweDBFN0YsIDI0LCBGWF9DT0RFUEFHRV9NU0RPU19UaGFpfSwKKyAgICB7MHgwRTgwLCAweDBFRkYsIDI1LCAweEZGRkZ9LAorICAgIHsweDBGMDAsIDB4MEZGRiwgNzAsIDB4RkZGRn0sCisgICAgezB4MTAwMCwgMHgxMDlGLCA3NCwgMHhGRkZGfSwKKyAgICB7MHgxMEEwLCAweDEwRkYsIDI2LCAweEZGRkZ9LAorICAgIHsweDExMDAsIDB4MTFGRiwgMjgsIDB4RkZGRn0sCisgICAgezB4MTIwMCwgMHgxMzdGLCA3NSwgMHhGRkZGfSwKKyAgICB7MHgxMzgwLCAweDEzOUYsIDc1LCAweEZGRkZ9LAorICAgIHsweDEzQTAsIDB4MTNGRiwgNzYsIDB4RkZGRn0sCisgICAgezB4MTQwMCwgMHgxNjdGLCA3NywgMHhGRkZGfSwKKyAgICB7MHgxNjgwLCAweDE2OUYsIDc4LCAweEZGRkZ9LAorICAgIHsweDE2QTAsIDB4MTZGRiwgNzksIDB4RkZGRn0sCisgICAgezB4MTcwMCwgMHgxNzFGLCA4NCwgMHhGRkZGfSwKKyAgICB7MHgxNzIwLCAweDE3M0YsIDg0LCAweEZGRkZ9LAorICAgIHsweDE3NDAsIDB4MTc1RiwgODQsIDB4RkZGRn0sCisgICAgezB4MTc2MCwgMHgxNzdGLCA4NCwgMHhGRkZGfSwKKyAgICB7MHgxNzgwLCAweDE3RkYsIDgwLCAweEZGRkZ9LAorICAgIHsweDE4MDAsIDB4MThBRiwgODEsIDB4RkZGRn0sCisgICAgezB4MThCMCwgMHgxOEZGLCA5OTksIDB4RkZGRn0sCisgICAgezB4MTkwMCwgMHgxOTRGLCA5MywgMHhGRkZGfSwKKyAgICB7MHgxOTUwLCAweDE5N0YsIDk0LCAweEZGRkZ9LAorICAgIHsweDE5ODAsIDB4MTlERiwgOTUsIDB4RkZGRn0sCisgICAgezB4MTlFMCwgMHgxOUZGLCA4MCwgMHhGRkZGfSwKKyAgICB7MHgxQTAwLCAweDFBMUYsIDk2LCAweEZGRkZ9LAorICAgIHsweDFBMjAsIDB4MUFGRiwgOTk5LCAweEZGRkZ9LAorICAgIHsweDFCMDAsIDB4MUI3RiwgMjcsIDB4RkZGRn0sCisgICAgezB4MUI4MCwgMHgxQkJGLCAxMTIsIDB4RkZGRn0sCisgICAgezB4MUJDMCwgMHgxQkZGLCA5OTksIDB4RkZGRn0sCisgICAgezB4MUMwMCwgMHgxQzRGLCAxMTMsIDB4RkZGRn0sCisgICAgezB4MUM1MCwgMHgxQzdGLCAxMTQsIDB4RkZGRn0sCisgICAgezB4MUM4MCwgMHgxQ0ZGLCA5OTksIDB4RkZGRn0sCisgICAgezB4MUQwMCwgMHgxRDdGLCA0LCAweEZGRkZ9LAorICAgIHsweDFEODAsIDB4MURCRiwgNCwgMHhGRkZGfSwKKyAgICB7MHgxREMwLCAweDFERkYsIDYsIDB4RkZGRn0sCisgICAgezB4MUUwMCwgMHgxRUZGLCAyOSwgMHhGRkZGfSwKKyAgICB7MHgxRjAwLCAweDFGRkYsIDMwLCAweEZGRkZ9LAorICAgIHsweDIwMDAsIDB4MjA2RiwgMzEsIDB4RkZGRn0sCisgICAgezB4MjA3MCwgMHgyMDlGLCAzMiwgMHhGRkZGfSwKKyAgICB7MHgyMEEwLCAweDIwQ0YsIDMzLCAweEZGRkZ9LAorICAgIHsweDIwRDAsIDB4MjBGRiwgMzQsIDB4RkZGRn0sCisgICAgezB4MjEwMCwgMHgyMTRGLCAzNSwgMHhGRkZGfSwKKyAgICB7MHgyMTUwLCAweDIxNUYsIDM2LCAweEZGRkZ9LAorICAgIHsweDIxNjAsIDB4MjE2QiwgMzYsIEZYX0NPREVQQUdFX0NoaW5lc2VTaW1wbGlmaWVkfSwKKyAgICB7MHgyMTZDLCAweDIxNkYsIDM2LCAweEZGRkZ9LAorICAgIHsweDIxNzAsIDB4MjE3OSwgMzYsIEZYX0NPREVQQUdFX0NoaW5lc2VTaW1wbGlmaWVkfSwKKyAgICB7MHgyMTdBLCAweDIxOEYsIDM2LCAweEZGRkZ9LAorICAgIHsweDIxOTAsIDB4MjE5OSwgMzcsIEZYX0NPREVQQUdFX0hhbmd1bH0sCisgICAgezB4MjE5QSwgMHgyMUZGLCAzNywgMHhGRkZGfSwKKyAgICB7MHgyMjAwLCAweDIyRkYsIDM4LCAweEZGRkZ9LAorICAgIHsweDIzMDAsIDB4MjNGRiwgMzksIDB4RkZGRn0sCisgICAgezB4MjQwMCwgMHgyNDNGLCA0MCwgMHhGRkZGfSwKKyAgICB7MHgyNDQwLCAweDI0NUYsIDQxLCAweEZGRkZ9LAorICAgIHsweDI0NjAsIDB4MjQ3MywgNDIsIEZYX0NPREVQQUdFX1NoaWZ0SklTfSwKKyAgICB7MHgyNDc0LCAweDI0OUIsIDQyLCBGWF9DT0RFUEFHRV9DaGluZXNlU2ltcGxpZmllZH0sCisgICAgezB4MjQ5QywgMHgyNEU5LCA0MiwgRlhfQ09ERVBBR0VfSGFuZ3VsfSwKKyAgICB7MHgyNEVBLCAweDI0RkYsIDQyLCAweEZGRkZ9LAorICAgIHsweDI1MDAsIDB4MjU3MywgNDMsIEZYX0NPREVQQUdFX0NoaW5lc2VTaW1wbGlmaWVkfSwKKyAgICB7MHgyNTc0LCAweDI1N0YsIDQzLCAweEZGRkZ9LAorICAgIHsweDI1ODAsIDB4MjU4MCwgNDQsIDB4RkZGRn0sCisgICAgezB4MjU4MSwgMHgyNThGLCA0NCwgRlhfQ09ERVBBR0VfQ2hpbmVzZVNpbXBsaWZpZWR9LAorICAgIHsweDI1OTAsIDB4MjU5RiwgNDQsIDB4RkZGRn0sCisgICAgezB4MjVBMCwgMHgyNUZGLCA0NSwgMHhGRkZGfSwKKyAgICB7MHgyNjAwLCAweDI2RkYsIDQ2LCAweEZGRkZ9LAorICAgIHsweDI3MDAsIDB4MjdCRiwgNDcsIDB4RkZGRn0sCisgICAgezB4MjdDMCwgMHgyN0VGLCAzOCwgMHhGRkZGfSwKKyAgICB7MHgyN0YwLCAweDI3RkYsIDM3LCAweEZGRkZ9LAorICAgIHsweDI4MDAsIDB4MjhGRiwgODIsIDB4RkZGRn0sCisgICAgezB4MjkwMCwgMHgyOTdGLCAzNywgMHhGRkZGfSwKKyAgICB7MHgyOTgwLCAweDI5RkYsIDM4LCAweEZGRkZ9LAorICAgIHsweDJBMDAsIDB4MkFGRiwgMzgsIDB4RkZGRn0sCisgICAgezB4MkIwMCwgMHgyQkZGLCAzNywgMHhGRkZGfSwKKyAgICB7MHgyQzAwLCAweDJDNUYsIDk3LCAweEZGRkZ9LAorICAgIHsweDJDNjAsIDB4MkM3RiwgMjksIDB4RkZGRn0sCisgICAgezB4MkM4MCwgMHgyQ0ZGLCA4LCAweEZGRkZ9LAorICAgIHsweDJEMDAsIDB4MkQyRiwgMjYsIDB4RkZGRn0sCisgICAgezB4MkQzMCwgMHgyRDdGLCA5OCwgMHhGRkZGfSwKKyAgICB7MHgyRDgwLCAweDJEREYsIDc1LCAweEZGRkZ9LAorICAgIHsweDJERTAsIDB4MkRGRiwgOSwgMHhGRkZGfSwKKyAgICB7MHgyRTAwLCAweDJFN0YsIDMxLCAweEZGRkZ9LAorICAgIHsweDJFODAsIDB4MkVGRiwgNTksIDB4RkZGRn0sCisgICAgezB4MkYwMCwgMHgyRkRGLCA1OSwgMHhGRkZGfSwKKyAgICB7MHgyRkUwLCAweDJGRUYsIDk5OSwgMHhGRkZGfSwKKyAgICB7MHgyRkYwLCAweDJGRkYsIDU5LCAweEZGRkZ9LAorICAgIHsweDMwMDAsIDB4MzAzRiwgNDgsIDB4RkZGRn0sCisgICAgezB4MzA0MCwgMHgzMDlGLCA0OSwgRlhfQ09ERVBBR0VfU2hpZnRKSVN9LAorICAgIHsweDMwQTAsIDB4MzBGRiwgNTAsIEZYX0NPREVQQUdFX1NoaWZ0SklTfSwKKyAgICB7MHgzMTAwLCAweDMxMjksIDUxLCBGWF9DT0RFUEFHRV9DaGluZXNlU2ltcGxpZmllZH0sCisgICAgezB4MzEyQSwgMHgzMTJGLCA1MSwgMHhGRkZGfSwKKyAgICB7MHgzMTMwLCAweDMxOEYsIDUyLCBGWF9DT0RFUEFHRV9IYW5ndWx9LAorICAgIHsweDMxOTAsIDB4MzE5RiwgNTksIDB4RkZGRn0sCisgICAgezB4MzFBMCwgMHgzMUJGLCA1MSwgMHhGRkZGfSwKKyAgICB7MHgzMUMwLCAweDMxRUYsIDYxLCAweEZGRkZ9LAorICAgIHsweDMxRjAsIDB4MzFGRiwgNTAsIDB4RkZGRn0sCisgICAgezB4MzIwMCwgMHgzMjFDLCA1NCwgRlhfQ09ERVBBR0VfSGFuZ3VsfSwKKyAgICB7MHgzMjFELCAweDMyNUYsIDU0LCAweEZGRkZ9LAorICAgIHsweDMyNjAsIDB4MzI3RiwgNTQsIEZYX0NPREVQQUdFX0hhbmd1bH0sCisgICAgezB4MzI4MCwgMHgzMkZGLCA1NCwgMHhGRkZGfSwKKyAgICB7MHgzMzAwLCAweDMzODcsIDU1LCAweEZGRkZ9LAorICAgIHsweDMzODgsIDB4MzNEMCwgNTUsIEZYX0NPREVQQUdFX0hhbmd1bH0sCisgICAgezB4MzNEMSwgMHgzM0ZGLCA1NSwgMHhGRkZGfSwKKyAgICB7MHgzNDAwLCAweDREQkYsIDU5LCAweEZGRkZ9LAorICAgIHsweDREQzAsIDB4NERGRiwgOTksIDB4RkZGRn0sCisgICAgezB4NEUwMCwgMHg5RkE1LCA1OSwgRlhfQ09ERVBBR0VfQ2hpbmVzZVNpbXBsaWZpZWR9LAorICAgIHsweDlGQTYsIDB4OUZGRiwgNTksIDB4RkZGRn0sCisgICAgezB4QTAwMCwgMHhBNDhGLCA4MywgMHhGRkZGfSwKKyAgICB7MHhBNDkwLCAweEE0Q0YsIDgzLCAweEZGRkZ9LAorICAgIHsweEE0RDAsIDB4QTRGRiwgOTk5LCAweEZGRkZ9LAorICAgIHsweEE1MDAsIDB4QTYzRiwgMTIsIDB4RkZGRn0sCisgICAgezB4QTY0MCwgMHhBNjlGLCA5LCAweEZGRkZ9LAorICAgIHsweEE2QTAsIDB4QTZGRiwgOTk5LCAweEZGRkZ9LAorICAgIHsweEE3MDAsIDB4QTcxRiwgNSwgMHhGRkZGfSwKKyAgICB7MHhBNzIwLCAweEE3RkYsIDI5LCAweEZGRkZ9LAorICAgIHsweEE4MDAsIDB4QTgyRiwgMTAwLCAweEZGRkZ9LAorICAgIHsweEE4MzAsIDB4QThGRiwgOTk5LCAweEZGRkZ9LAorICAgIHsweEE4NDAsIDB4QTg3RiwgNTMsIDB4RkZGRn0sCisgICAgezB4QTg4MCwgMHhBOERGLCAxMTUsIDB4RkZGRn0sCisgICAgezB4QThFMCwgMHhBOEZGLCA5OTksIDB4RkZGRn0sCisgICAgezB4QTkwMCwgMHhBOTJGLCAxMTYsIDB4RkZGRn0sCisgICAgezB4QTkzMCwgMHhBOTVGLCAxMTcsIDB4RkZGRn0sCisgICAgezB4QTk2MCwgMHhBOUZGLCA5OTksIDB4RkZGRn0sCisgICAgezB4QUEwMCwgMHhBQTVGLCAxMTgsIDB4RkZGRn0sCisgICAgezB4QUE2MCwgMHhBQkZGLCA5OTksIDB4RkZGRn0sCisgICAgezB4QUMwMCwgMHhEN0FGLCA1NiwgRlhfQ09ERVBBR0VfSGFuZ3VsfSwKKyAgICB7MHhEN0IwLCAweEQ3RkYsIDk5OSwgMHhGRkZGfSwKKyAgICB7MHhEODAwLCAweERCN0YsIDU3LCAweEZGRkZ9LAorICAgIHsweERCODAsIDB4REJGRiwgNTcsIDB4RkZGRn0sCisgICAgezB4REMwMCwgMHhERkZGLCA1NywgMHhGRkZGfSwKKyAgICB7MHhFMDAwLCAweEU4MTQsIDYwLCAweEZGRkZ9LAorICAgIHsweEU4MTUsIDB4RTg2NCwgNjAsIEZYX0NPREVQQUdFX0NoaW5lc2VTaW1wbGlmaWVkfSwKKyAgICB7MHhFODY1LCAweEY4RkYsIDYwLCAweEZGRkZ9LAorICAgIHsweEY5MDAsIDB4RkEwQiwgNjEsIEZYX0NPREVQQUdFX0hhbmd1bH0sCisgICAgezB4RkEwQywgMHhGQTBELCA2MSwgRlhfQ09ERVBBR0VfQ2hpbmVzZVNpbXBsaWZpZWR9LAorICAgIHsweEZBMEUsIDB4RkEyRCwgNjEsIEZYX0NPREVQQUdFX1NoaWZ0SklTfSwKKyAgICB7MHhGQTJFLCAweEZBRkYsIDYxLCAweEZGRkZ9LAorICAgIHsweEZCMDAsIDB4RkI0RiwgNjIsIDB4RkZGRn0sCisgICAgezB4RkI1MCwgMHhGREZGLCA2MywgRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljfSwKKyAgICB7MHhGRTAwLCAweEZFMEYsIDkxLCAweEZGRkZ9LAorICAgIHsweEZFMTAsIDB4RkUxRiwgNjUsIDB4RkZGRn0sCisgICAgezB4RkUyMCwgMHhGRTJGLCA2NCwgMHhGRkZGfSwKKyAgICB7MHhGRTMwLCAweEZFNEYsIDY1LCAweEZGRkZ9LAorICAgIHsweEZFNTAsIDB4RkU2RiwgNjYsIDB4RkZGRn0sCisgICAgezB4RkU3MCwgMHhGRUZGLCA2NywgRlhfQ09ERVBBR0VfTVNXaW5fQXJhYmljfSwKKyAgICB7MHhGRjAwLCAweEZGNUYsIDY4LCBGWF9DT0RFUEFHRV9DaGluZXNlU2ltcGxpZmllZH0sCisgICAgezB4RkY2MCwgMHhGRjlGLCA2OCwgRlhfQ09ERVBBR0VfU2hpZnRKSVN9LAogICAgIHsweEZGQTAsIDB4RkZFRiwgNjgsIDB4RkZGRn0sCiB9OwogCi1jb25zdCBGR0FTX0ZPTlRVU0IqIEZHQVNfR2V0VW5pY29kZUJpdEZpZWxkKEZYX1dDSEFSIHdVbmljb2RlKSB7CisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KK2NvbnN0IEZHQVNfRm9udEluZm8gZ19YRkFGb250c01hcFtdID0geworICAgIHsweDAxZDVkMzNlLCBMIlNpbVN1biIsIEwiQXJpYWwiLCAwLCA5MzZ9LAorICAgIHsweDAxZTRmMTAyLCBMIllvdVl1YW4iLCBMIkFyaWFsIiwgMSwgOTM2fSwKKyAgICB7MHgwMzA1NDlkYywgTCJMaVN1IiwgTCJBcmlhbCIsIDEsIDkzNn0sCisgICAgezB4MDMyZWRkNDQsIEwiU2ltaGVpIiwgTCJBcmlhbCIsIDEsIDkzNn0sCisgICAgezB4MDNlYWM2ZmMsIEwiUG9vclJpY2hhcmQtUmVndWxhciIsIEwiQXJpYWwiLCAyLCAxMjUyfSwKKyAgICB7MHgwM2VkOTBlNiwgTCJOaW5hIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweDA3N2I1NmIzLCBMIktpbmdzb2Z0UGhvbmV0aWNQbGFpbiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHgwNzhlZDUyNCwgTCJNaWNyb3NvZnRTYW5zU2VyaWYiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4MDg5YjE4YTksIEwiQXJpYWwiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4MGIyY2FkNzIsIEwiTW9ub3R5cGVDb3JzaXZhIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LAorICAgIHsweDBiYjAwM2U3LCBMIkthcnRpa2EiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCisgICAgezB4MGJiNDY5ZGYsIEwiVmluZXJIYW5kSVRDIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LAorICAgIHsweDBiYzFhODUxLCBMIlNlZ29lVUkiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4MGMxMTJlYmQsIEwiS296dWthR290aGljUHJvLVZJTSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHgwY2ZjYjljMSwgTCJBZG9iZVRoYWkiLCBMIktva2lsYSxBcmlhbCBOYXJyb3ciLCAwLCA4NDd9LAorICAgIHsweDBlN2RlMGY5LCBMIlBsYXliaWxsIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweDBlZmY0N2MzLCBMIlNUSHVwbyIsIEwiQXJpYWwiLCAwLCA5MzZ9LAorICAgIHsweDEwN2FkMzc0LCBMIkNvbnN0YW50aWEiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCisgICAgezB4MTIxOTRjMmQsIEwiS3Vuc3RsZXJTY3JpcHQiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sCisgICAgezB4MTM1ZWY2YTEsIEwiTWluaW9uUHJvU21CZCIsCisgICAgIEwiQmVsbCBNVCxDb3JiZWwsVGltZXMgTmV3IFJvbWFuLENhbWJyaWEsQmVybGluIFNhbnMgRkIiLCAwLCAxMjUyfSwKKyAgICB7MHgxNThjNDA0OSwgTCJHYXJhbW9uZCIsIEwiQXJpYWwiLCAyLCAxMjUyfSwKKyAgICB7MHgxNjBlY2IyNCwgTCJTVFpob25nc29uZyIsIEwiQXJpYWwiLCAwLCA5MzZ9LAorICAgIHsweDE2MWVkMDdlLCBMIk1TR290aGljIiwgTCJBcmlhbCIsIDEsIDEyNTJ9LAorICAgIHsweDE3MWQxZWQxLCBMIlNuYXBJVEMtUmVndWxhciIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHgxOGQxMTg4ZiwgTCJDYW1icmlhIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAorICAgIHsweDE4ZWFmMzUwLCBMIkFyaWFsVW5pY29kZU1TIiwgTCJBcmlhbCIsIDAsIDkzNn0sCisgICAgezB4MWE5MmQxMTUsIEwiTWluZ0xpVSIsIEwiQXJpYWwiLCAxLCAxMjUyfSwKKyAgICB7MHgxY2MyMTdjNiwgTCJUcmVidWNoZXRNUyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHgxZDY0OTU5NiwgTCJCYXNlbWljVGltZXMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4MWUzNGVlNjAsIEwiQmVsbE1UIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAorICAgIHsweDFlYjM2OTQ1LCBMIkNvb3BlckJsYWNrIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAorICAgIHsweDFlZjc3ODdkLCBMIkJhdGFuZ0NoZSIsIEwiQXJpYWwiLCAxLCAxMjUyfSwKKyAgICB7MHgyMGIzYmQzYSwgTCJCcnVzaFNjcmlwdE1UIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LAorICAgIHsweDIyMDg3N2FhLCBMIkNhbmRhcmEiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4MjIxMzUwMDcsIEwiRnJlZXN0eWxlU2NyaXB0LVJlZ3VsYXIiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sCisgICAgezB4MjUxMDU5YzMsIEwiQ2hpbGxlciIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHgyNWJlZDZkZCwgTCJNU1JlZmVyZW5jZVNhbnNTZXJpZiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHgyODE1NGM4MSwgTCJQYXJjaG1lbnQtUmVndWxhciIsIEwiQXJpYWwiLCA4LCAxMjUyfSwKKyAgICB7MHgyOTcxMWViOSwgTCJTVExpdGkiLCBMIkFyaWFsIiwgMCwgOTM2fSwKKyAgICB7MHgyYjE5OTNiNCwgTCJCYXNlbWljIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweDJiMzE2MzM5LCBMIk5pYWdhcmFTb2xpZC1SZWciLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4MmMxNDc1MjksIEwiRm9vdGxpZ2h0TVRMaWdodCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHgyYzE5ODkyOCwgTCJIYXJsb3dTb2xpZCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHgyYzZhYzZiMiwgTCJMdWNpZGFCcmlnaHQiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCisgICAgezB4MmM5ZjM4ZTIsIEwiS296dWthTWluY2hvUHJvLVZJUiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHgyZDVhNDdiMCwgTCJTVENhaXl1biIsIEwiQXJpYWwiLCAwLCA5MzZ9LAorICAgIHsweDJkZWYyNmJmLCBMIkJlcm5hcmRNVC1Db25kZW5zZWQiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4MmZkODkzMGIsIEwiS296dWthTWluY2hvUHI2TlIiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4MzExNTUyNWEsIEwiRmFuZ1NvbmdfR0IyMzEyIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweDMxMzI3ODE3LCBMIk15cmlhZFBybyIsCisgICAgIEwiQ2FsaWJyaSxDb3JiZWwsQ2FuZGFyYSxDYW1icmlhIE1hdGgsRnJhbmtsaW4gR290aGljIE1lZGl1bSxBcmlhbCAiCisgICAgIEwiTmFycm93LFRpbWVzIE5ldyBSb21hbiIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweDMyMjQ0OTc1LCBMIkhlbHZldGljYSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHgzMmFjOTk1YywgTCJUZXJtaW5hbCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHgzMzhkNjQ4YSwgTCJOaWFnYXJhRW5ncmF2ZWQtUmVnIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweDMzYmI2NWYyLCBMIlN5bGZhZW4iLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCisgICAgezB4MzQwMmMzMGUsIEwiTVNQTWluY2hvIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAorICAgIHsweDM0MTJiZjMxLCBMIlNpbVN1bi1QVUEiLCBMIkFyaWFsIiwgMCwgOTM2fSwKKyAgICB7MHgzNmViMzliOSwgTCJCZXJsaW5TYW5zRkIiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4MzZmNDIwNTUsIEwiVW5pdmVyc0FUVCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYiLCAwLCAxMjUyfSwKKyAgICB7MHgzODY0YzRmNiwgTCJIaWdoVG93ZXJUZXh0IiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAorICAgIHsweDNhMjU3ZDAzLCBMIkZhbmdTb25nX0dCMjMxMiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHgzY2RhZTY2OCwgTCJGcmVlc3R5bGVTY3JpcHQiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sCisgICAgezB4M2Q1NWFlZDcsIEwiSm9rZXJtYW4iLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4M2Q1YjQzODUsIEwiUE1pbmdMaVUiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCisgICAgezB4M2Q5Yjc2NjksIEwiRXN0cmFuZ2Vsb0VkZXNzYSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHgzZTUzMmQ3NCwgTCJGcmFua2xpbkdvdGhpY01lZGl1bSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHgzZTZhYTMyZCwgTCJOU2ltU3VuIiwgTCJBcmlhbCIsIDEsIDkzNn0sCisgICAgezB4M2Y2YzM2YTgsIEwiR2F1dGFtaSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHgzZmYzMjY2MiwgTCJDaGlsbGVyLVJlZ3VsYXIiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4NDA5ZGUzMTIsIEwiTW9kZXJuTm8uMjAiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCisgICAgezB4NDE0NDNjNWUsIEwiR2VvcmdpYSIsIEwiQXJpYWwiLCAyLCAxMjUyfSwKKyAgICB7MHg0MTYwYWRlNSwgTCJCZWxsR290aGljU3RkQmxhY2siLAorICAgICBMIkFyaWFsLEFyaWFsIFVuaWNvZGUgTVMsQm9vayBBbnRpcXVhLERvdHVtLEdlb3JnaWEiLCAwLCAxMjUyfSwKKyAgICB7MHg0MjE5NzZjNCwgTCJNb2Rlcm4tUmVndWxhciIsIEwiQXJpYWwiLCAyLCAxMjUyfSwKKyAgICB7MHg0MjJhNzI1MiwgTCJTdGVuY2lsIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweDQyYzg1NTRmLCBMIkZpeGVkc3lzIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweDQzNWNiNDFkLCBMIlJvbWFuIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweDQ3ODgyMzgzLCBMIkNvdXJpZXJOZXciLCBMIkFyaWFsIiwgMSwgMTI1Mn0sCisgICAgezB4NDgwYTIzMzgsIEwiQmVybGluU2Fuc0ZCRGVtaSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHg0ODBiZjdhNCwgTCJDb3VyaWVyU3RkIiwgTCJDb3VyaWVyIE5ldyxWZXJkYW5hIiwgMCwgMTI1Mn0sCisgICAgezB4NDgxYWQ2ZWQsIEwiVmxhZGltaXJTY3JpcHQiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sCisgICAgezB4NDkxMTU3N2EsIEwiWW91WXVhbiIsIEwiQXJpYWwiLCAxLCA5MzZ9LAorICAgIHsweDRhNzg4ZDcyLCBMIlNUWGluZ2thaSIsIEwiQXJpYWwiLCAwLCA5MzZ9LAorICAgIHsweDRiZjg4NTY2LCBMIlNlZ29lQ29uZGVuc2VkIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweDRjY2Y1MWE0LCBMIkJlcmxpblNhbnNGQi1SZWciLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4NGVhOTY3Y2UsIEwiR3VsaW1DaGUiLCBMIkFyaWFsIiwgMSwgMTI1Mn0sCisgICAgezB4NGY2OGJkNzksIEwiTGV0dGVyR290aGljU3RkIiwgTCJDb3VyaWVyIE5ldyxWZXJkYW5hIiwgMCwgMTI1Mn0sCisgICAgezB4NTFhMGQwZTYsIEwiS296dWthR290aGljUHI2Tk0iLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4NTMxYjNkZWEsIEwiQmFzZW1pY1N5bWJvbCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHg1MzMzZmQzOSwgTCJDYWxpZm9ybmlhbkZCLVJlZyIsIEwiQXJpYWwiLCAyLCAxMjUyfSwKKyAgICB7MHg1MzU2MWE1NCwgTCJGWllUSy0tR0JLMS0wIiwgTCJBcmlhbCIsIDAsIDkzNn0sCisgICAgezB4NTVlMGRkZTYsIEwiTHVjaWRhU2Fuc1R5cGV3cml0ZXIiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4NTc0ZDRkM2QsIEwiQWRvYmVBcmFiaWMiLCBMIkFyaWFsIE5hcnJvdyIsIDAsIDEyNTJ9LAorICAgIHsweDU3OTJlNzU5LCBMIlNUS2FpdGkiLCBMIkFyaWFsIiwgMCwgOTM2fSwKKyAgICB7MHg1OTIxOTc4ZSwgTCJMdWNpZGFTYW5zVW5pY29kZSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHg1OTRlMmRhNCwgTCJWcmluZGEiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4NTliYWE5YTIsIEwiS2FpVGlfR0IyMzEyIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweDVjZmVkZjRmLCBMIkJhc2tPbGRGYWNlIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweDVmOTc5MjFjLCBMIkFkb2JlTXl1bmdqb1N0ZE0iLAorICAgICBMIkJhdGFuZyxCb29rbWFuIE9sZCBTdHlsZSxDb25zb2xhcyxTVFpob25nc29uZyIsIDAsIDkzNn0sCisgICAgezB4NWZlZmJmYWQsIEwiQmF0YW5nIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAorICAgIHsweDYwNTM0MmI5LCBMIkRvdHVtQ2hlIiwgTCJBcmlhbCIsIDEsIDEyNTJ9LAorICAgIHsweDYwOGM1ZjlhLCBMIkthaVRpX0dCMjMxMiIsIEwiQXJpYWwiLCAwLCA5MzZ9LAorICAgIHsweDYxZWZkMGQxLCBMIk1hdHVyYU1UU2NyaXB0Q2FwaXRhbHMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4NjI2NjA4YTksIEwiTVZCb2xpIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweDYzMDUwMWEzLCBMIlNtYWxsRm9udHMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4NjVkMGUyYTksIEwiRlpZVEstLUdCSzEtMCIsIEwiQXJpYWwiLCAwLCA5MzZ9LAorICAgIHsweDY2OWYyOWUxLCBMIkZaU1RLLS1HQksxLTAiLCBMIkFyaWFsIiwgMCwgOTM2fSwKKyAgICB7MHg2NzNhOWU1ZiwgTCJUdW5nYSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHg2OTFhYTRjZSwgTCJOaWFnYXJhU29saWQiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4Njk2MjU5YjcsIEwiQ29yYmVsIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweDY5NmVlOWJlLCBMIlNUWGloZWkiLCBMIkFyaWFsIiwgMCwgOTM2fSwKKyAgICB7MHg2YzU5Y2Y2OSwgTCJEb3R1bSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHg3MDdmYTU2MSwgTCJHdW5nc3VoIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAorICAgIHsweDcxNDE2YmIyLCBMIlpXQWRvYmVGIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweDcxYjQxODAxLCBMIlZlcmRhbmEiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4NzNmMjVlNGMsIEwiUGFsYXRpbm9MaW5vdHlwZSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHg3M2Y0ZDE5ZiwgTCJOaWFnYXJhRW5ncmF2ZWQiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4NzQwMDE2OTQsIEwiTXlyaWFkUHJvQmxhY2siLCBMIkJvb2sgQW50aXF1YSxDb25zdGFudGlhLERvdHVtLEdlb3JnaWEiLCAwLAorICAgICAxMjUyfSwKKyAgICB7MHg3NGIxNGQ4ZiwgTCJIYWV0dGVuc2Nod2VpbGVyIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweDc0Y2I0NGVlLCBMIk5TaW1TdW4iLCBMIkFyaWFsIiwgMSwgOTM2fSwKKyAgICB7MHg3NmI0ZDdmZiwgTCJTaHJ1dGkiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4Nzg4YjM1MzMsIEwiV2ViZGluZ3MiLCBMIkFyaWFsIiwgNiwgNDJ9LAorICAgIHsweDc5N2RkZTk5LCBMIk1TU2VyaWYiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4N2EwZjllOWUsIEwiTVNNaW5jaG8iLCBMIkFyaWFsIiwgMSwgMTI1Mn0sCisgICAgezB4N2I0MzljYWYsIEwiT2xkRW5nbGlzaFRleHRNVCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHg4MjEzYTQzMywgTCJMdWNpZGFTYW5zLVR5cGV3cml0ZXIiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4ODJmZWM5MjksIEwiQWRvYmVTb25nU3RkTCIsCisgICAgIEwiQ2VudGF1cixDYWxpYnJpLFNUU29uZyxCZWxsIE1ULEdhcmFtb25kLFRpbWVzIE5ldyBSb21hbiIsIDAsIDkzNn0sCisgICAgezB4ODM1ODE4MjUsIEwiTW9kZXJuIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweDgzNWEyODIzLCBMIkFsZ2VyaWFuIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweDgzZGFiOWY1LCBMIlNjcmlwdCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHg4NDdiNTZkYSwgTCJUYWhvbWEiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4OGE3ODNjYjIsIEwiU2ltU3VuLVBVQSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHg4YjVjYWMwZSwgTCJPbnl4IiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweDhjNmE0OTllLCBMIkd1bGltIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweDhlMGFmNzkwLCBMIkp1aWNlSVRDIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweDhlOGQ0M2IyLCBMIkNlbnRhdXIiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCisgICAgezB4OGVlNGRjY2EsIEwiQm9va3NoZWxmU3ltYm9sNyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHg5MDc5NDgwMCwgTCJCZWxsR290aGljU3RkTGlnaHQiLCBMIkJlbGwgTVQsQ2FsaWJyaSxUaW1lcyBOZXcgUm9tYW4iLCAwLAorICAgICAxMjUyfSwKKyAgICB7MHg5MDliNTE2YSwgTCJDZW50dXJ5IiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAorICAgIHsweDkyYWUzNzBkLCBMIk1TT3V0bG9vayIsIEwiQXJpYWwiLCA0LCA0Mn0sCisgICAgezB4OTNjOWZiZjEsIEwiTHVjaWRhRmF4IiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAorICAgIHsweDk1NjUwODVlLCBMIkJvb2tBbnRpcXVhIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAorICAgIHsweDk4NTZkOTVkLCBMIkFkb2JlTWluZ1N0ZEwiLCBMIkFyaWFsLEFyaWFsIFVuaWNvZGUgTVMsQ2FtYnJpYSxCYXRhbmdDaGUiLAorICAgICAwLCA5NDl9LAorICAgIHsweDliYmFkZDZiLCBMIkNvbG9ubmFNVCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHg5Y2JkMTZhNCwgTCJTaG93Y2FyZEdvdGhpYy1SZWciLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4OWQ3MzAwOGUsIEwiTVNTYW5zU2VyaWYiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4YTA2MDdkYjEsIEwiR3VuZ3N1aENoZSIsIEwiQXJpYWwiLCAxLCAxMjUyfSwKKyAgICB7MHhhMGJjZjZhMSwgTCJMYXRpbldpZGUiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCisgICAgezB4YTE0MjliMzYsIEwiU3ltYm9sIiwgTCJBcmlhbCIsIDYsIDQyfSwKKyAgICB7MHhhMWZhNWFiYywgTCJXaW5nZGluZ3MyIiwgTCJBcmlhbCIsIDYsIDQyfSwKKyAgICB7MHhhMWZhNWFiZCwgTCJXaW5nZGluZ3MzIiwgTCJBcmlhbCIsIDYsIDQyfSwKKyAgICB7MHhhNDI3YmFkNCwgTCJJbmZvcm1hbFJvbWFuLVJlZ3VsYXIiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sCisgICAgezB4YThiOTJlY2UsIEwiRlpTVEstLUdCSzEtMCIsIEwiQXJpYWwiLCAwLCA5MzZ9LAorICAgIHsweGE4ZDgzZWNlLCBMIkNhbGlmb3JuaWFuRkIiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCisgICAgezB4YWEzZTA4MmMsIEwiS2luZ3NvZnQtUGhvbmV0aWMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4YWE2YmNhYmUsIEwiSGFybG93U29saWRJdGFsaWMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4YWRlNTMzN2MsIEwiTVNVSUdvdGhpYyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHhiMDhkZDk0MSwgTCJXaWRlTGF0aW4iLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCisgICAgezB4YjIwN2YwNWQsIEwiUG9vclJpY2hhcmQiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCisgICAgezB4YjNiYzQ5MmYsIEwiSnVpY2VJVEMtUmVndWxhciIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHhiNTU0NTM5OSwgTCJNYXJsZXR0IiwgTCJBcmlhbCIsIDQsIDQyfSwKKyAgICB7MHhiNWRkMWViYiwgTCJCcml0YW5uaWNCb2xkIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweGI2OTljMWM1LCBMIkx1Y2lkYUNhbGxpZ3JhcGh5LUl0YWxpYyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHhiNzI1ZDYyOSwgTCJUaW1lc05ld1JvbWFuIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAorICAgIHsweGI3ZWFlYmViLCBMIkFkb2JlSGVpdGlTdGRSIiwgTCJCYXRhbmcsQ2VudHVyeSxEb3R1bSIsIDAsIDkzNn0sCisgICAgezB4YmQyOWM0ODYsIEwiQmVybGluU2Fuc0ZCRGVtaS1Cb2xkIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweGJlOGE4ZGI0LCBMIkJvb2tzaGVsZlN5bWJvbFNldmVuIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweGMxNmMwMTE4LCBMIkFkb2JlSGVicmV3IiwgTCJCZWxsIE1ULEJlcmxpbiBTYW5zIEZCLENhbGlicmkiLCAwLCAxMjUyfSwKKyAgICB7MHhjMzE4YjBhZiwgTCJNeXJpYWRQcm9MaWdodCIsIEwiQ2FsaWJyaSxTVEZhbmdzb25nLFRpbWVzIE5ldyBSb21hbiIsIDAsCisgICAgIDEyNTJ9LAorICAgIHsweGM2NWU1NjU5LCBMIkNhbWJyaWFNYXRoIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAorICAgIHsweGM3NWM4ZjA1LCBMIkx1Y2lkYUNvbnNvbGUiLCBMIkFyaWFsIiwgMSwgMTI1Mn0sCisgICAgezB4Y2E3YzM1ZDYsIEwiQ2FsaWJyaSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHhjYjA1M2Y1MywgTCJNaWNyb3NvZnRZYUhlaSIsIEwiQXJpYWwiLCAwLCA5MzZ9LAorICAgIHsweGNiNzE5MGY5LCBMIk1hZ25ldG8tQm9sZCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHhjY2EwMGNjNSwgTCJTeXN0ZW0iLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4Y2NhZDZmNzYsIEwiSm9rZXJtYW4tUmVndWxhciIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHhjY2M1ODE4YywgTCJFdXJvU2lnbiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHhjZjNkNzIzNCwgTCJMdWNpZGFIYW5kd3JpdGluZy1JdGFsaWMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4Y2Y3YjhmZGIsIEwiTWluaW9uUHJvIiwKKyAgICAgTCJCZWxsIE1ULENvcmJlbCxUaW1lcyBOZXcgUm9tYW4sQ2FtYnJpYSxCZXJsaW4gU2FucyBGQiIsIDAsIDEyNTJ9LAorICAgIHsweGNmZTU3NTVmLCBMIlNpbWhlaSIsIEwiQXJpYWwiLCAxLCA5MzZ9LAorICAgIHsweGQwMTFmNGVlLCBMIk1TUEdvdGhpYyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHhkMDYwZTdlZiwgTCJWaXZhbGRpIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LAorICAgIHsweGQwN2VkZWMxLCBMIkZyYW5rbGluR290aGljLU1lZGl1bSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHhkMTA3MjQzZiwgTCJTaW1TdW4iLCBMIkFyaWFsIiwgMCwgOTM2fSwKKyAgICB7MHhkMTg4MTU2MiwgTCJBcmlhbE5hcnJvdyIsIEwiQXJpYWwgTmFycm93IiwgMCwgMTI1Mn0sCisgICAgezB4ZDIyYjdkY2UsIEwiQm9kb25pTVRQb3N0ZXJDb21wcmVzc2VkIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweGQyMmJmYTYwLCBMIkNvbWljU2Fuc01TIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LAorICAgIHsweGQzYmQwZTM1LCBMIkJhdWhhdXM5MyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHhkNDI5ZWU3YSwgTCJTVEZhbmdzb25nIiwgTCJBcmlhbCIsIDAsIDkzNn0sCisgICAgezB4ZDY2NzljMTIsIEwiQmVybmFyZE1UQ29uZGVuc2VkIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweGQ4ZThhMDI3LCBMIkx1Y2lkYVNhbnMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4ZDlmZTc3NjEsIEwiSGlnaFRvd2VyVGV4dC1SZWciLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCisgICAgezB4ZGE3ZTU1MWUsIEwiU1RTb25nIiwgTCJBcmlhbCIsIDAsIDkzNn0sCisgICAgezB4ZGFhNjg0MmQsIEwiU1RaaG9uZ3NvbmciLCBMIkFyaWFsIiwgMCwgOTM2fSwKKyAgICB7MHhkYWFhYjkzZiwgTCJTVEZhbmdzb25nIiwgTCJBcmlhbCIsIDAsIDkzNn0sCisgICAgezB4ZGFlYjA3MTMsIEwiU1RTb25nIiwgTCJBcmlhbCIsIDAsIDkzNn0sCisgICAgezB4ZGFmZWRiZWYsIEwiU1RDYWl5dW4iLCBMIkFyaWFsIiwgMCwgOTM2fSwKKyAgICB7MHhkYjAwYTNkOSwgTCJCcm9hZHdheSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHhkYjFmNWFkNCwgTCJTVFhpbndlaSIsIEwiQXJpYWwiLCAwLCA5MzZ9LAorICAgIHsweGRiMzI2ZTdmLCBMIlNUS2FpdGkiLCBMIkFyaWFsIiwgMCwgOTM2fSwKKyAgICB7MHhkYjY5NTk1YSwgTCJTVEh1cG8iLCBMIkFyaWFsIiwgMCwgOTM2fSwKKyAgICB7MHhkYmEwMDgyYywgTCJTVFhpaGVpIiwgTCJBcmlhbCIsIDAsIDkzNn0sCisgICAgezB4ZGJkMGFiMTgsIEwiU1RYaW5na2FpIiwgTCJBcmlhbCIsIDAsIDkzNn0sCisgICAgezB4ZGMxYTdkYjEsIEwiU1RMaXRpIiwgTCJBcmlhbCIsIDAsIDkzNn0sCisgICAgezB4ZGMzMzA3NWYsIEwiS3Jpc3RlbklUQy1SZWd1bGFyIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LAorICAgIHsweGRjYzcwMDljLCBMIkhhcnJpbmd0b24iLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4ZGQ3MTI0NjYsIEwiQXJpYWxCbGFjayIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHhkZGU4N2IzZSwgTCJJbXBhY3QiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4ZGY2OWZiMzIsIEwiU25hcElUQyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHhkZjhiMjVlOCwgTCJDZW50dXJ5R290aGljIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweGUwZjcwNWMwLCBMIktyaXN0ZW5JVEMiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sCisgICAgezB4ZTE0Mjc1NzMsIEwiUmFhdmkiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4ZTJjZWEwY2IsIEwiTWFnbmV0byIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHhlMzZhOWUxNywgTCJSYXZpZSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHhlNDMzZjhlMiwgTCJQYXJjaG1lbnQiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sCisgICAgezB4ZTQzZGZmNGEsIEwiV2luZ2RpbmdzIiwgTCJBcmlhbCIsIDQsIDQyfSwKKyAgICB7MHhlNGUyYzQwNSwgTCJNVEV4dHJhIiwgTCJBcmlhbCIsIDYsIDQyfSwKKyAgICB7MHhlNjE4Y2MzNSwgTCJJbmZvcm1hbFJvbWFuIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LAorICAgIHsweGU2YzI3ZmZjLCBMIk1pc3RyYWwiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sCisgICAgezB4ZTdlYmY0YjksIEwiQ291cmllciIsIEwiQ291cmllciBOZXciLCAwLCAxMjUyfSwKKyAgICB7MHhlOGJjNGE5ZCwgTCJNU1JlZmVyZW5jZVNwZWNpYWx0eSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHhlOTBmYjAxMywgTCJUZW1wdXNTYW5zSVRDIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweGVjNjM3YjQyLCBMIkNvbnNvbGFzIiwgTCJWZXJkYW5hIiwgMSwgMTI1Mn0sCisgICAgezB4ZWQzYTY4M2IsIEwiU1RYaW53ZWkiLCBMIkFyaWFsIiwgMCwgOTM2fSwKKyAgICB7MHhlZjI2NGNkMSwgTCJMdWNpZGFIYW5kd3JpdGluZyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKKyAgICB7MHhmMDg2YmNhMiwgTCJCYXNrZXJ2aWxsZU9sZEZhY2UiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4ZjEwMjgwMzAsIEwiTWFuZ2FsIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAorICAgIHsweGYxZGE3ZWI5LCBMIlNob3djYXJkR290aGljIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweGYyMTBmMDZhLCBMIkFyaWFsTVQiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4ZjQ3N2YxNmEsIEwiTGF0aGEiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCisgICAgezB4ZjYxNmYzZGQsIEwiTGlTdSIsIEwiQXJpYWwiLCAxLCA5MzZ9LAorICAgIHsweGZhNDc5YWE2LCBMIk1pY3Jvc29mdFlhSGVpIiwgTCJBcmlhbCIsIDAsIDkzNn0sCisgICAgezB4ZmNkMTk2OTcsIEwiQm9va21hbk9sZFN0eWxlIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweGZlMjA5YTgyLCBMIkx1Y2lkYUNhbGxpZ3JhcGh5IiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAorICAgIHsweGZlZjEzNWY4LCBMIkFkb2JlSGVpdGlTdGQtUmVndWxhciIsIEwiQmF0YW5nLENlbnR1cnksRG90dW0iLCAwLCA5MzZ9LAorfTsKKyNlbGlmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0xJTlVYXworY29uc3QgRkdBU19Gb250SW5mbyBnX1hGQUZvbnRzTWFwW10gPSB7CisgICAgezB4MDFkNWQzM2UsIEwiU2ltU3VuIiwKKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXLEFSICIKKyAgICAgTCJQTCBVTWluZyBUVyBNQkUiLAorICAgICAwLCA5MzZ9LAorICAgIHsweDAxZTRmMTAyLCBMIllvdVl1YW4iLAorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgSEssQVIgUEwgVU1pbmcgVFcsQVIgIgorICAgICBMIlBMIFVNaW5nIFRXIE1CRSIsCisgICAgIDEsIDkzNn0sCisgICAgezB4MDMwNTQ5ZGMsIEwiTGlTdSIsCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIFplbiBIZWkgIgorICAgICBMIk1vbm8sV2VuUXVhbllpIE1pY3JvIEhlaSIsCisgICAgIDEsIDkzNn0sCisgICAgezB4MDMyZWRkNDQsIEwiU2ltaGVpIiwKKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCxXZW5RdWFuWWkgWmVuIEhlaSAiCisgICAgIEwiTW9ubyxXZW5RdWFuWWkgTWljcm8gSGVpIiwKKyAgICAgMSwgOTM2fSwKKyAgICB7MHgwM2VhYzZmYywgTCJQb29yUmljaGFyZC1SZWd1bGFyIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZiIsIDIsCisgICAgIDEyNTJ9LAorICAgIHsweDAzZWQ5MGU2LCBMIk5pbmEiLCBMIkZyZWVTZXJpZiIsIDAsIDEyNTJ9LAorICAgIHsweDA3N2I1NmIzLCBMIktpbmdzb2Z0UGhvbmV0aWNQbGFpbiIsCisgICAgIEwiVGliZXRhbiBNYWNoaW5lIFVuaSxMS0xVRyxTYW15YWsgR3VqYXJhdGksRHJvaWQgU2FucyBUaGFpLERyb2lkIFNhbnMgIgorICAgICBMIkFybWVuaWFuLFVudGl0bGVkMSx1dGthbCxMb2hpdCBPcml5YSIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweDA3OGVkNTI0LCBMIk1pY3Jvc29mdFNhbnNTZXJpZiIsCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYsV2VuUXVhbllpIE1pY3JvIEhlaSIsIDAsIDEyNTJ9LAorICAgIHsweDA4OWIxOGE5LCBMIkFyaWFsIiwKKyAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIENvbmRlbnNlZCxGcmVlU2VyaWYsV2VuUXVhbllpIE1pY3JvIEhlaSIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweDBiMmNhZDcyLCBMIk1vbm90eXBlQ29yc2l2YSIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYiLCA4LCAxMjUyfSwKKyAgICB7MHgwYmIwMDNlNywgTCJLYXJ0aWthIiwKKyAgICAgTCJGcmVlU2FucyxMaWJlcmF0aW9uIFNhbnMsTGliZXJhdGlvbiBTYW5zIE5hcnJvdyxOaW1idXMgU2FucyAiCisgICAgIEwiTCxHYXJ1ZGEsRnJlZVNlcmlmLFdlblF1YW5ZaSBNaWNybyBIZWkiLAorICAgICAyLCAxMjUyfSwKKyAgICB7MHgwYmI0NjlkZiwgTCJWaW5lckhhbmRJVEMiLAorICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsVWJ1bnR1LExpYmVyYXRpb24gU2FucyxMaWJlcmF0aW9uIFNlcmlmIiwgOCwgMTI1Mn0sCisgICAgezB4MGJjMWE4NTEsIEwiU2Vnb2VVSSIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyIsIDAsIDEyNTJ9LAorICAgIHsweDBjMTEyZWJkLCBMIktvenVrYUdvdGhpY1Byby1WSU0iLCBMIkZyZWVTZXJpZiIsIDAsIDEyNTJ9LAorICAgIHsweDBjZmNiOWMxLCBMIkFkb2JlVGhhaSIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxXYXJlZSIsIDAsIDg0N30sCisgICAgezB4MGU3ZGUwZjksIEwiUGxheWJpbGwiLAorICAgICBMIkthY3N0UXVybixEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERyb2lkICIKKyAgICAgTCJTYW5zIEV0aGlvcGljLERyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNlcmlmIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4MGVmZjQ3YzMsIEwiU1RIdXBvIiwgTCJBUiBQTCBVS2FpIEhLLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVLYWkgQ04iLCAwLAorICAgICA5MzZ9LAorICAgIHsweDEwN2FkMzc0LCBMIkNvbnN0YW50aWEiLAorICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNlcmlmLFdlblF1YW5ZaSBNaWNybyBIZWksVWJ1bnR1IiwgMiwgMTI1Mn0sCisgICAgezB4MTIxOTRjMmQsIEwiS3Vuc3RsZXJTY3JpcHQiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZiIsIDgsCisgICAgIDEyNTJ9LAorICAgIHsweDEzNWVmNmExLCBMIk1pbmlvblByb1NtQmQiLCBMIkxpYmVyYXRpb24gU2VyaWYiLCAwLCAxMjUyfSwKKyAgICB7MHgxNThjNDA0OSwgTCJHYXJhbW9uZCIsCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNlcmlmLFVidW50dSxGcmVlU2VyaWYiLCAyLCAxMjUyfSwKKyAgICB7MHgxNjBlY2IyNCwgTCJTVFpob25nc29uZyIsCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiCisgICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCisgICAgIDAsIDkzNn0sCisgICAgezB4MTYxZWQwN2UsIEwiTVNHb3RoaWMiLAorICAgICBMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLEFSIFBMICIKKyAgICAgTCJVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyIsCisgICAgIDEsIDEyNTJ9LAorICAgIHsweDE3MWQxZWQxLCBMIlNuYXBJVEMtUmVndWxhciIsCisgICAgIEwiTGliZXJhdGlvbiBTYW5zIE5hcnJvdyxVYnVudHUgQ29uZGVuc2VkLE5pbWJ1cyBTYW5zIEwsRGVqYVZ1IFNhbnMiLCAwLAorICAgICAxMjUyfSwKKyAgICB7MHgxOGQxMTg4ZiwgTCJDYW1icmlhIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZixGcmVlTW9ubyIsIDIsCisgICAgIDEyNTJ9LAorICAgIHsweDE4ZWFmMzUwLCBMIkFyaWFsVW5pY29kZU1TIiwKKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICIKKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwKKyAgICAgMCwgOTM2fSwKKyAgICB7MHgxYTkyZDExNSwgTCJNaW5nTGlVIiwKKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICIKKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwKKyAgICAgMSwgMTI1Mn0sCisgICAgezB4MWNjMjE3YzYsIEwiVHJlYnVjaGV0TVMiLAorICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZixGcmVlU2VyaWYsVWJ1bnR1IiwgMCwgMTI1Mn0sCisgICAgezB4MWQ2NDk1OTYsIEwiQmFzZW1pY1RpbWVzIiwKKyAgICAgTCJMaWJlcmF0aW9uIFNlcmlmLFRpbWVzIE5ldyBSb21hbixEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZixVYnVudHUiLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHgxZTM0ZWU2MCwgTCJCZWxsTVQiLAorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLFVidW50dSxMaWJlcmF0aW9uIFNlcmlmIiwgMiwgMTI1Mn0sCisgICAgezB4MWViMzY5NDUsIEwiQ29vcGVyQmxhY2siLAorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVNb25vLExpYmVyYXRpb24gTW9ubywgV2VuUXVhbllpIE1pY3JvICIKKyAgICAgTCJIZWkgTW9ubyIsCisgICAgIDIsIDEyNTJ9LAorICAgIHsweDFlZjc3ODdkLCBMIkJhdGFuZ0NoZSIsCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyAiCisgICAgIEwiVFcsV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIE1pY3JvIEhlaSIsCisgICAgIDEsIDEyNTJ9LAorICAgIHsweDIwYjNiZDNhLCBMIkJydXNoU2NyaXB0TVQiLAorICAgICBMIkthY3N0UXVybixEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTYW5zICIKKyAgICAgTCJKYXBhbmVzZSxVUlcgQ2hhbmNlcnkgTCxMaWJlcmF0aW9uIFNhbnMiLAorICAgICA4LCAxMjUyfSwKKyAgICB7MHgyMjA4NzdhYSwgTCJDYW5kYXJhIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwgMCwgMTI1Mn0sCisgICAgezB4MjIxMzUwMDcsIEwiRnJlZXN0eWxlU2NyaXB0LVJlZ3VsYXIiLAorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsIDgsIDEyNTJ9LAorICAgIHsweDI1MTA1OWMzLCBMIkNoaWxsZXIiLAorICAgICBMIkthY3N0UXVybixEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTYW5zICIKKyAgICAgTCJKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMiLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHgyNWJlZDZkZCwgTCJNU1JlZmVyZW5jZVNhbnNTZXJpZiIsCisgICAgIEwiRGVqYVZ1IFNhbnMgQ29uZGVuc2VkLFVidW50dSBDb25kZW5zZWQsRHJvaWQgU2FucyBKYXBhbmVzZSxBUiBQTCBVS2FpICIKKyAgICAgTCJISyIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweDI4MTU0YzgxLCBMIlBhcmNobWVudC1SZWd1bGFyIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsCisgICAgIDgsIDEyNTJ9LAorICAgIHsweDI5NzExZWI5LCBMIlNUTGl0aSIsIEwiQVIgUEwgVUthaSBISyIsIDAsIDkzNn0sCisgICAgezB4MmIxOTkzYjQsIEwiQmFzZW1pYyIsCisgICAgIEwiTGliZXJhdGlvbiBTZXJpZixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsIDAsIDEyNTJ9LAorICAgIHsweDJiMzE2MzM5LCBMIk5pYWdhcmFTb2xpZC1SZWciLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zIiwgMCwKKyAgICAgMTI1Mn0sCisgICAgezB4MmMxNDc1MjksIEwiRm9vdGxpZ2h0TVRMaWdodCIsCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zIiwgMCwgMTI1Mn0sCisgICAgezB4MmMxOTg5MjgsIEwiSGFybG93U29saWQiLAorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsIDAsIDEyNTJ9LAorICAgIHsweDJjNmFjNmIyLCBMIkx1Y2lkYUJyaWdodCIsCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRHJvaWQgIgorICAgICBMIlNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zIiwKKyAgICAgMiwgMTI1Mn0sCisgICAgezB4MmM5ZjM4ZTIsIEwiS296dWthTWluY2hvUHJvLVZJUiIsIEwiRGVqYVZ1IFNhbnMiLCAwLCAxMjUyfSwKKyAgICB7MHgyZDVhNDdiMCwgTCJTVENhaXl1biIsIEwiQVIgUEwgVUthaSBISyIsIDAsIDkzNn0sCisgICAgezB4MmRlZjI2YmYsIEwiQmVybmFyZE1ULUNvbmRlbnNlZCIsCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwgMCwgMTI1Mn0sCisgICAgezB4MmZkODkzMGIsIEwiS296dWthTWluY2hvUHI2TlIiLCBMIkRlamFWdSBTZXJpZiIsIDAsIDEyNTJ9LAorICAgIHsweDMxMTU1MjVhLCBMIkZhbmdTb25nX0dCMjMxMiIsCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiCisgICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweDMxMzI3ODE3LCBMIk15cmlhZFBybyIsCisgICAgIEwiVWJ1bnR1IENvbmRlbnNlZCxEcm9pZCBTYW5zIEphcGFuZXNlLCBGcmVlU2VyaWYiLCAwLCAxMjUyfSwKKyAgICB7MHgzMjI0NDk3NSwgTCJIZWx2ZXRpY2EiLAorICAgICBMIlVidW50dSxEZWphVnUgU2FucyBDb25kZW5zZWQsTGliZXJhdGlvbiBTYW5zLExpYmVyYXRpb24gU2FucyAiCisgICAgIEwiTmFycm93LE5pbWJ1cyBTYW5zIEwiLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHgzMmFjOTk1YywgTCJUZXJtaW5hbCIsIEwiRGVqYVZ1IFNlcmlmIiwgMCwgMTI1Mn0sCisgICAgezB4MzM4ZDY0OGEsIEwiTmlhZ2FyYUVuZ3JhdmVkLVJlZyIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLCAwLAorICAgICAxMjUyfSwKKyAgICB7MHgzM2JiNjVmMiwgTCJTeWxmYWVuIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwgMiwgMTI1Mn0sCisgICAgezB4MzQwMmMzMGUsIEwiTVNQTWluY2hvIiwKKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXIiwgMiwKKyAgICAgMTI1Mn0sCisgICAgezB4MzQxMmJmMzEsIEwiU2ltU3VuLVBVQSIsCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyIsIDAsCisgICAgIDkzNn0sCisgICAgezB4MzZlYjM5YjksIEwiQmVybGluU2Fuc0ZCIiwKKyAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2VyaWYsVWJ1bnR1LEZyZWVTZXJpZiIsIDAsIDEyNTJ9LAorICAgIHsweDM2ZjQyMDU1LCBMIlVuaXZlcnNBVFQiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwgMCwgMTI1Mn0sCisgICAgezB4Mzg2NGM0ZjYsIEwiSGlnaFRvd2VyVGV4dCIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLCAyLAorICAgICAxMjUyfSwKKyAgICB7MHgzYTI1N2QwMywgTCJGYW5nU29uZ19HQjIzMTIiLAorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWkiLCAwLCAxMjUyfSwKKyAgICB7MHgzYzdkMWQwNywgTCJHYXJhbW9uZDNMVFN0ZCIsCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxVYnVudHUgQ29uZGVuc2VkLERlamFWdSBTYW5zIENvbmRlbnNlZCxMaWJlcmF0aW9uICIKKyAgICAgTCJTZXJpZixVYnVudHUsRnJlZVNlcmlmIiwKKyAgICAgMiwgMTI1Mn0sCisgICAgezB4M2NkYWU2NjgsIEwiRnJlZXN0eWxlU2NyaXB0IiwKKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyIsIDgsIDEyNTJ9LAorICAgIHsweDNkNTVhZWQ3LCBMIkpva2VybWFuIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwgMCwgMTI1Mn0sCisgICAgezB4M2Q1YjQzODUsIEwiUE1pbmdMaVUiLAorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIgorICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAorICAgICAyLCAxMjUyfSwKKyAgICB7MHgzZDliNzY2OSwgTCJFc3RyYW5nZWxvRWRlc3NhIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwgMCwKKyAgICAgMTI1Mn0sCisgICAgezB4M2U1MzJkNzQsIEwiRnJhbmtsaW5Hb3RoaWNNZWRpdW0iLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsVWJ1bnR1IiwgMCwKKyAgICAgMTI1Mn0sCisgICAgezB4M2U2YWEzMmQsIEwiTlNpbVN1biIsCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiCisgICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCisgICAgIDEsIDkzNn0sCisgICAgezB4M2Y2YzM2YTgsIEwiR2F1dGFtaSIsCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsIG1yeV9LYWNzdFF1cm4sRHJvaWQgU2FucyAiCisgICAgIEwiSmFwYW5lc2UsRnJlZVNhbnMiLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHgzZmYzMjY2MiwgTCJDaGlsbGVyLVJlZ3VsYXIiLAorICAgICBMIkthY3N0UXVybixEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxGcmVlU2FucyIsIDAsIDEyNTJ9LAorICAgIHsweDQwOWRlMzEyLCBMIk1vZGVybk5vLjIwIiwKKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxOaW1idXMgU2FucyBMLE5pbWJ1cyBTYW5zIEwsRnJlZVNhbnMiLCAyLAorICAgICAxMjUyfSwKKyAgICB7MHg0MTQ0M2M1ZSwgTCJHZW9yZ2lhIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTYW5zIiwgMiwgMTI1Mn0sCisgICAgezB4NDE2MGFkZTUsIEwiQmVsbEdvdGhpY1N0ZEJsYWNrIiwgTCJGcmVlU2FucyIsIDAsIDEyNTJ9LAorICAgIHsweDQyMTk3NmM0LCBMIk1vZGVybi1SZWd1bGFyIiwgTCJGcmVlU2FucyIsIDIsIDEyNTJ9LAorICAgIHsweDQyMmE3MjUyLCBMIlN0ZW5jaWwiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNhbnMsTGliZXJhdGlvbiBTYW5zIiwgMCwKKyAgICAgMTI1Mn0sCisgICAgezB4NDJjODU1NGYsIEwiRml4ZWRzeXMiLCBMIkZyZWVTZXJpZiIsIDAsIDEyNTJ9LAorICAgIHsweDQzNWNiNDFkLCBMIlJvbWFuIiwgTCJGcmVlU2VyaWYiLCAwLCAxMjUyfSwKKyAgICB7MHg0Nzg4MjM4MywgTCJDb3VyaWVyTmV3IiwKKyAgICAgTCJGcmVlTW9ubyxXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8sQVIgUEwgVUthaSBDTixBUiBQTCBVS2FpIEhLLEFSIFBMICIKKyAgICAgTCJVS2FpIFRXLEFSIFBMIFVLYWkgVFcgTUJFLERlamFWdSBTYW5zIiwKKyAgICAgMSwgMTI1Mn0sCisgICAgezB4NDgwYTIzMzgsIEwiQmVybGluU2Fuc0ZCRGVtaSIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNlcmlmIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4NDgwYmY3YTQsIEwiQ291cmllclN0ZCIsIEwiRGVqYVZ1IFNhbnMiLCAwLCAxMjUyfSwKKyAgICB7MHg0ODFhZDZlZCwgTCJWbGFkaW1pclNjcmlwdCIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLCA4LAorICAgICAxMjUyfSwKKyAgICB7MHg0OTExNTc3YSwgTCJZb3VZdWFuIiwKKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXIiwgMSwKKyAgICAgOTM2fSwKKyAgICB7MHg0YTc4OGQ3MiwgTCJTVFhpbmdrYWkiLCBMIkFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsIDAsCisgICAgIDkzNn0sCisgICAgezB4NGJmODg1NjYsIEwiU2Vnb2VDb25kZW5zZWQiLCBMIkZyZWVTZXJpZiIsIDAsIDEyNTJ9LAorICAgIHsweDRjY2Y1MWE0LCBMIkJlcmxpblNhbnNGQi1SZWciLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZiIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweDRlYTk2N2NlLCBMIkd1bGltQ2hlIiwKKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVLYWkgQ04sQVIgUEwgVUthaSBISyxBUiBQTCBVS2FpIFRXLEFSIFBMICIKKyAgICAgTCJVS2FpIFRXIE1CRSIsCisgICAgIDEsIDEyNTJ9LAorICAgIHsweDRmNjhiZDc5LCBMIkxldHRlckdvdGhpY1N0ZCIsCisgICAgIEwiRnJlZU1vbm8sTGliZXJhdGlvbiBNb25vLEFuZGFsZSBNb25vLFdlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyIsIDAsIDEyNTJ9LAorICAgIHsweDUxYTBkMGU2LCBMIktvenVrYUdvdGhpY1ByNk5NIiwgTCJGcmVlU2VyaWYiLCAwLCAxMjUyfSwKKyAgICB7MHg1MzFiM2RlYSwgTCJCYXNlbWljU3ltYm9sIiwgTCJGcmVlU2VyaWYiLCAwLCAxMjUyfSwKKyAgICB7MHg1MzMzZmQzOSwgTCJDYWxpZm9ybmlhbkZCLVJlZyIsCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxVUlcgQ2hhbmNlcnkgTCxGcmVlU2VyaWYiLCAyLCAxMjUyfSwKKyAgICB7MHg1MzU2MWE1NCwgTCJGWllUSy0tR0JLMS0wIiwKKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICIKKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwKKyAgICAgMCwgOTM2fSwKKyAgICB7MHg1NWUwZGRlNiwgTCJMdWNpZGFTYW5zVHlwZXdyaXRlciIsCisgICAgIEwiVWJ1bnR1IE1vbm8sRGVqYVZ1IFNhbnMgTW9ubyxOaW1idXMgTW9ubyBMLExpYmVyYXRpb24gTW9ubyxDb3VyaWVyIDEwICIKKyAgICAgTCJQaXRjaCxGcmVlTW9ubyIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweDU3NGQ0ZDNkLCBMIkFkb2JlQXJhYmljIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwgMCwgMTI1Mn0sCisgICAgezB4NTc5MmU3NTksIEwiU1RLYWl0aSIsIEwiV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vIiwgMCwgOTM2fSwKKyAgICB7MHg1OTIxOTc4ZSwgTCJMdWNpZGFTYW5zVW5pY29kZSIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyIsIDAsCisgICAgIDEyNTJ9LAorICAgIHsweDU5NGUyZGE0LCBMIlZyaW5kYSIsCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgQXJhYmljICIKKyAgICAgTCJOYXNraCxtcnlfS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNhbnMsRnJlZVNlcmlmIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4NTliYWE5YTIsIEwiS2FpVGlfR0IyMzEyIiwKKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICIKKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4NWNmZWRmNGYsIEwiQmFza09sZEZhY2UiLAorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLFVidW50dSxMaWJlcmF0aW9uIFNlcmlmIiwgMCwgMTI1Mn0sCisgICAgezB4NWUxNmFjOTEsIEwiVHJhamFuUHJvIiwKKyAgICAgTCJOaW1idXMgU2FucyBMLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgVFcsQVIgUEwgVU1pbmcgIgorICAgICBMIlRXIE1CRSxEZWphVnUgU2FucyxEZWphVnUgU2VyaWYiLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHg1ZjM4ODE5NiwgTCJJVENMZWdhY3lTYW5zU3RkTWVkaXVtIiwKKyAgICAgTCJMaWJlcmF0aW9uIFNlcmlmLEZyZWVTZXJpZixGcmVlU2FucyxVYnVudHUiLCAwLCAxMjUyfSwKKyAgICB7MHg1Zjk3OTIxYywgTCJBZG9iZU15dW5nam9TdGRNIiwKKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICIKKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwKKyAgICAgMCwgOTM2fSwKKyAgICB7MHg1ZmVmYmZhZCwgTCJCYXRhbmciLAorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIgorICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAorICAgICAyLCAxMjUyfSwKKyAgICB7MHg2MDUzNDJiOSwgTCJEb3R1bUNoZSIsCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyIsIDEsCisgICAgIDEyNTJ9LAorICAgIHsweDYwOGM1ZjlhLCBMIkthaVRpX0dCMjMxMiIsCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiCisgICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCisgICAgIDAsIDkzNn0sCisgICAgezB4NjFlZmQwZDEsIEwiTWF0dXJhTVRTY3JpcHRDYXBpdGFscyIsCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRHJvaWQgIgorICAgICBMIlNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmLERlamFWdSBTYW5zIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4NjI2NjA4YTksIEwiTVZCb2xpIiwKKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERyb2lkIFNhbnMgIgorICAgICBMIkV0aGlvcGljLERyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMiLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHg2MzA1MDFhMywgTCJTbWFsbEZvbnRzIiwgTCJEZWphVnUgU2VyaWYiLCAwLCAxMjUyfSwKKyAgICB7MHg2NWQwZTJhOSwgTCJGWllUSy0tR0JLMS0wIiwKKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICIKKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwKKyAgICAgMCwgOTM2fSwKKyAgICB7MHg2NjlmMjllMSwgTCJGWlNUSy0tR0JLMS0wIiwKKyAgICAgTCJBUiBQTCBVTWluZyBDTixBUiBQTCBVS2FpIENOLCBBUiBQTCBVTWluZyBISyIsIDAsIDkzNn0sCisgICAgezB4NjczYTllNWYsIEwiVHVuZ2EiLAorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRHJvaWQgU2FucyAiCisgICAgIEwiSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4NjkxYWE0Y2UsIEwiTmlhZ2FyYVNvbGlkIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTZXJpZiIsIDAsIDEyNTJ9LAorICAgIHsweDY5NjI1OWI3LCBMIkNvcmJlbCIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyIsIDAsIDEyNTJ9LAorICAgIHsweDY5NmVlOWJlLCBMIlNUWGloZWkiLCBMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyIsIDAsIDkzNn0sCisgICAgezB4NmM1OWNmNjksIEwiRG90dW0iLCBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8iLCAwLCAxMjUyfSwKKyAgICB7MHg3MDdmYTU2MSwgTCJHdW5nc3VoIiwgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vIiwgMiwgMTI1Mn0sCisgICAgezB4NzE0MTZiYjIsIEwiWldBZG9iZUYiLAorICAgICBMIkthY3N0QXJ0LEthY3N0Qm9va20sS2Fjc3REZWNvcmF0aXZlLEthY3N0RGlnaXRhbCxLYWNzdEZhcnNpLEthY3N0TGV0dGVyLCIKKyAgICAgTCJLYWNzdE9mZmljZSxEaW5nYmF0cyxGcmVlU2VyaWYiLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHg3MWI0MTgwMSwgTCJWZXJkYW5hIiwKKyAgICAgTCJEZWphVnUgU2FucyBDb25kZW5zZWQsVWJ1bnR1IENvbmRlbnNlZCxEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4NzNmMjVlNGMsIEwiUGFsYXRpbm9MaW5vdHlwZSIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYiLCAwLAorICAgICAxMjUyfSwKKyAgICB7MHg3M2Y0ZDE5ZiwgTCJOaWFnYXJhRW5ncmF2ZWQiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNlcmlmIiwgMCwgMTI1Mn0sCisgICAgezB4NzQwMDE2OTQsIEwiTXlyaWFkUHJvQmxhY2siLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsQVIgUEwgVUthaSBISyIsIDAsCisgICAgIDEyNTJ9LAorICAgIHsweDc0YjE0ZDhmLCBMIkhhZXR0ZW5zY2h3ZWlsZXIiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwgMCwKKyAgICAgMTI1Mn0sCisgICAgezB4NzRjYjQ0ZWUsIEwiTlNpbVN1biIsIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyIsIDEsIDkzNn0sCisgICAgezB4NzZiNGQ3ZmYsIEwiU2hydXRpIiwKKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERyb2lkIFNhbnMgIgorICAgICBMIkphcGFuZXNlLEZyZWVTYW5zIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4Nzg4YjM1MzMsIEwiV2ViZGluZ3MiLCBMIkZyZWVTYW5zIiwgNiwgNDJ9LAorICAgIHsweDc5N2RkZTk5LCBMIk1TU2VyaWYiLCBMIkZyZWVTYW5zIiwgMCwgMTI1Mn0sCisgICAgezB4N2EwZjllOWUsIEwiTVNNaW5jaG8iLAorICAgICBMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyIsCisgICAgIDEsIDEyNTJ9LAorICAgIHsweDdiNDM5Y2FmLCBMIk9sZEVuZ2xpc2hUZXh0TVQiLAorICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zLFVidW50dSIsIDAsIDEyNTJ9LAorICAgIHsweDgyMTNhNDMzLCBMIkx1Y2lkYVNhbnMtVHlwZXdyaXRlciIsCisgICAgIEwiVWJ1bnR1IE1vbm8sTGliZXJhdGlvbiBNb25vLERlamFWdSBTYW5zIE1vbm8iLCAwLCAxMjUyfSwKKyAgICB7MHg4MmZlYzkyOSwgTCJBZG9iZVNvbmdTdGRMIiwKKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICIKKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwKKyAgICAgMCwgOTM2fSwKKyAgICB7MHg4MzU4MTgyNSwgTCJNb2Rlcm4iLCBMIkZyZWVTYW5zIiwgMCwgMTI1Mn0sCisgICAgezB4ODM1YTI4MjMsIEwiQWxnZXJpYW4iLAorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTYW5zLExpYmVyYXRpb24gU2FucyxVYnVudHUiLCAwLCAxMjUyfSwKKyAgICB7MHg4M2RhYjlmNSwgTCJTY3JpcHQiLCBMIkZyZWVTYW5zIiwgMCwgMTI1Mn0sCisgICAgezB4ODQ3YjU2ZGEsIEwiVGFob21hIiwKKyAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIENvbmRlbnNlZCxGcmVlU2VyaWYiLCAwLCAxMjUyfSwKKyAgICB7MHg4YTc4M2NiMiwgTCJTaW1TdW4tUFVBIiwKKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICIKKyAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4OGI1Y2FjMGUsIEwiT255eCIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMiLCAwLCAxMjUyfSwKKyAgICB7MHg4YzZhNDk5ZSwgTCJHdWxpbSIsCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiCisgICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweDhlMGFmNzkwLCBMIkp1aWNlSVRDIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsIDAsIDEyNTJ9LAorICAgIHsweDhlOGQ0M2IyLCBMIkNlbnRhdXIiLAorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLEtobWVyIE9TLEtobWVyIE9TIFN5c3RlbSIsIDIsIDEyNTJ9LAorICAgIHsweDhlZTRkY2NhLCBMIkJvb2tzaGVsZlN5bWJvbDciLCBMIkxpYmVyYXRpb24gU2FucyIsIDAsIDEyNTJ9LAorICAgIHsweDkwNzk0ODAwLCBMIkJlbGxHb3RoaWNTdGRMaWdodCIsIEwiTGliZXJhdGlvbiBTYW5zIiwgMCwgMTI1Mn0sCisgICAgezB4OTA5YjUxNmEsIEwiQ2VudHVyeSIsCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMsTGliZXJhdGlvbiBNb25vLExpYmVyYXRpb24gU2VyaWYiLCAyLAorICAgICAxMjUyfSwKKyAgICB7MHg5MmFlMzcwZCwgTCJNU091dGxvb2siLCBMIkxpYmVyYXRpb24gU2FucyIsIDQsIDQyfSwKKyAgICB7MHg5M2M5ZmJmMSwgTCJMdWNpZGFGYXgiLAorICAgICBMIkthY3N0UXVybixEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyAiCisgICAgIEwiRXRoaW9waWMsbXJ5X0thY3N0UXVybixMaWJlcmF0aW9uIFNhbnMiLAorICAgICAyLCAxMjUyfSwKKyAgICB7MHg5NTY1MDg1ZSwgTCJCb29rQW50aXF1YSIsCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMsTGliZXJhdGlvbiBTZXJpZiIsIDIsIDEyNTJ9LAorICAgIHsweDk4NTZkOTVkLCBMIkFkb2JlTWluZ1N0ZEwiLCBMIkFSIFBMIFVNaW5nIEhLIiwgMCwgOTQ5fSwKKyAgICB7MHg5YmJhZGQ2YiwgTCJDb2xvbm5hTVQiLAorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLEtobWVyIE9TLEtobWVyIE9TIFN5c3RlbSIsIDAsIDEyNTJ9LAorICAgIHsweDljYmQxNmE0LCBMIlNob3djYXJkR290aGljLVJlZyIsCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMsVWJ1bnR1IiwgMCwgMTI1Mn0sCisgICAgezB4OWQ3MzAwOGUsIEwiTVNTYW5zU2VyaWYiLCBMIkZyZWVTZXJpZiIsIDAsIDEyNTJ9LAorICAgIHsweGEwNjA3ZGIxLCBMIkd1bmdzdWhDaGUiLAorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIgorICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAorICAgICAxLCAxMjUyfSwKKyAgICB7MHhhMGJjZjZhMSwgTCJMYXRpbldpZGUiLCBMIkZyZWVTZXJpZiIsIDIsIDEyNTJ9LAorICAgIHsweGExNDI5YjM2LCBMIlN5bWJvbCIsIEwiRnJlZVNlcmlmIiwgNiwgNDJ9LAorICAgIHsweGExZmE1YWJjLCBMIldpbmdkaW5nczIiLCBMIkZyZWVTZXJpZiIsIDYsIDQyfSwKKyAgICB7MHhhMWZhNWFiZCwgTCJXaW5nZGluZ3MzIiwgTCJGcmVlU2VyaWYiLCA2LCA0Mn0sCisgICAgezB4YTQyN2JhZDQsIEwiSW5mb3JtYWxSb21hbi1SZWd1bGFyIiwKKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERyb2lkIFNhbnMgIgorICAgICBMIkphcGFuZXNlLEZyZWVTZXJpZiIsCisgICAgIDgsIDEyNTJ9LAorICAgIHsweGE4YjkyZWNlLCBMIkZaU1RLLS1HQksxLTAiLCBMIkFSIFBMIFVNaW5nIENOIiwgMCwgOTM2fSwKKyAgICB7MHhhOGQ4M2VjZSwgTCJDYWxpZm9ybmlhbkZCIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZiIsIDIsIDEyNTJ9LAorICAgIHsweGFhM2UwODJjLCBMIktpbmdzb2Z0LVBob25ldGljIiwKKyAgICAgTCJUaWJldGFuIE1hY2hpbmUgVW5pLExLTFVHLFNhbXlhayBHdWphcmF0aSxEcm9pZCBTYW5zICIKKyAgICAgTCJUaGFpLHV0a2FsLEtlZGFnZSxNYWxsaWdlLEFSIFBMIFVLYWkgQ04iLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHhhYTZiY2FiZSwgTCJIYXJsb3dTb2xpZEl0YWxpYyIsCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZiIsIDAsIDEyNTJ9LAorICAgIHsweGFkZTUzMzdjLCBMIk1TVUlHb3RoaWMiLAorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIgorICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHhiMDhkZDk0MSwgTCJXaWRlTGF0aW4iLAorICAgICBMIkthY3N0UXVybixEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERyb2lkICIKKyAgICAgTCJTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2VyaWYiLAorICAgICAyLCAxMjUyfSwKKyAgICB7MHhiMTI3NjVlMCwgTCJJVENMZWdhY3lTYW5zU3RkQm9vayIsCisgICAgIEwiQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBISyxGcmVlU2VyaWYsVWJ1bnR1LEZyZWVTYW5zIiwgMCwgMTI1Mn0sCisgICAgezB4YjIwN2YwNWQsIEwiUG9vclJpY2hhcmQiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZiIsIDIsCisgICAgIDEyNTJ9LAorICAgIHsweGIzYmM0OTJmLCBMIkp1aWNlSVRDLVJlZ3VsYXIiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZiIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweGI1NTQ1Mzk5LCBMIk1hcmxldHQiLCBMIkxpYmVyYXRpb24gU2VyaWYiLCA0LCA0Mn0sCisgICAgezB4YjVkZDFlYmIsIEwiQnJpdGFubmljQm9sZCIsCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zICIKKyAgICAgTCJFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLExpYmVyYXRpb24gU2VyaWYiLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHhiNjk5YzFjNSwgTCJMdWNpZGFDYWxsaWdyYXBoeS1JdGFsaWMiLAorICAgICBMIkthY3N0UXVybixEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERyb2lkICIKKyAgICAgTCJTYW5zIEphcGFuZXNlLERlamFWdSBTZXJpZiIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweGI3MjVkNjI5LCBMIlRpbWVzTmV3Um9tYW4iLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zIiwgMiwKKyAgICAgMTI1Mn0sCisgICAgezB4YjdlYWViZWIsIEwiQWRvYmVIZWl0aVN0ZFIiLAorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIgorICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAorICAgICAwLCA5MzZ9LAorICAgIHsweGJkMjljNDg2LCBMIkJlcmxpblNhbnNGQkRlbWktQm9sZCIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHhiZThhOGRiNCwgTCJCb29rc2hlbGZTeW1ib2xTZXZlbiIsIEwiRGVqYVZ1IFNhbnMiLCAwLCAxMjUyfSwKKyAgICB7MHhjMTZjMDExOCwgTCJBZG9iZUhlYnJldyIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxVYnVudHUsTGliZXJhdGlvbiBTZXJpZiIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweGMzMThiMGFmLCBMIk15cmlhZFByb0xpZ2h0IiwKKyAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsIDAsCisgICAgIDEyNTJ9LAorICAgIHsweGM2NWU1NjU5LCBMIkNhbWJyaWFNYXRoIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZixGcmVlTW9ubyIsIDIsCisgICAgIDEyNTJ9LAorICAgIHsweGM3NWM4ZjA1LCBMIkx1Y2lkYUNvbnNvbGUiLAorICAgICBMIkxpYmVyYXRpb24gTW9ubyxEZWphVnUgU2FucyBNb25vLEZyZWVNb25vLFdlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyIsIDEsCisgICAgIDEyNTJ9LAorICAgIHsweGNhN2MzNWQ2LCBMIkNhbGlicmkiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMiLCAwLCAxMjUyfSwKKyAgICB7MHhjYjA1M2Y1MywgTCJNaWNyb3NvZnRZYUhlaSIsCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiCisgICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCisgICAgIDAsIDkzNn0sCisgICAgezB4Y2I3MTkwZjksIEwiTWFnbmV0by1Cb2xkIiwKKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERyb2lkIFNhbnMgIgorICAgICBMIkphcGFuZXNlLERlamFWdSBTZXJpZiIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweGNjYTAwY2M1LCBMIlN5c3RlbSIsIEwiRGVqYVZ1IFNhbnMiLCAwLCAxMjUyfSwKKyAgICB7MHhjY2FkNmY3NiwgTCJKb2tlcm1hbi1SZWd1bGFyIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwgMCwKKyAgICAgMTI1Mn0sCisgICAgezB4Y2NjNTgxOGMsIEwiRXVyb1NpZ24iLCBMIkRlamFWdSBTZXJpZiIsIDAsIDEyNTJ9LAorICAgIHsweGNmM2Q3MjM0LCBMIkx1Y2lkYUhhbmR3cml0aW5nLUl0YWxpYyIsCisgICAgIEwiTGliZXJhdGlvbiBTYW5zIE5hcnJvdyxVYnVudHUgQ29uZGVuc2VkLE5pbWJ1cyBTYW5zIEwsRGVqYVZ1IFNlcmlmIiwgMCwKKyAgICAgMTI1Mn0sCisgICAgezB4Y2Y3YjhmZGIsIEwiTWluaW9uUHJvIiwgTCJEZWphVnUgU2FucyIsIDAsIDEyNTJ9LAorICAgIHsweGNmZTU3NTVmLCBMIlNpbWhlaSIsCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiCisgICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCisgICAgIDEsIDkzNn0sCisgICAgezB4ZDAxMWY0ZWUsIEwiTVNQR290aGljIiwKKyAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXIiwgMCwKKyAgICAgMTI1Mn0sCisgICAgezB4ZDA2MGU3ZWYsIEwiVml2YWxkaSIsCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zLFVidW50dSIsIDgsIDEyNTJ9LAorICAgIHsweGQwN2VkZWMxLCBMIkZyYW5rbGluR290aGljLU1lZGl1bSIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxVYnVudHUiLCAwLAorICAgICAxMjUyfSwKKyAgICB7MHhkMTA3MjQzZiwgTCJTaW1TdW4iLCBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8iLCAwLCA5MzZ9LAorICAgIHsweGQxODgxNTYyLCBMIkFyaWFsTmFycm93IiwKKyAgICAgTCJMaWJlcmF0aW9uIFNhbnMgTmFycm93LERyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNlcmlmIiwgMCwgMTI1Mn0sCisgICAgezB4ZDIyYjdkY2UsIEwiQm9kb25pTVRQb3N0ZXJDb21wcmVzc2VkIiwKKyAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTZXJpZiIsIDAsIDEyNTJ9LAorICAgIHsweGQyMmJmYTYwLCBMIkNvbWljU2Fuc01TIiwKKyAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVNb25vLExpYmVyYXRpb24gTW9ubyIsIDgsIDEyNTJ9LAorICAgIHsweGQzYmQwZTM1LCBMIkJhdWhhdXM5MyIsCisgICAgIEwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zLFVidW50dSIsIDAsIDEyNTJ9LAorICAgIHsweGQ0MjllZTdhLCBMIlNURmFuZ3NvbmciLCBMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyIsIDAsIDkzNn0sCisgICAgezB4ZDY2NzljMTIsIEwiQmVybmFyZE1UQ29uZGVuc2VkIiwKKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxOaW1idXMgU2FucyBMLFVSVyBDaGFuY2VyeSAiCisgICAgIEwiTCxLYWNzdE9uZSxMaWJlcmF0aW9uIFNhbnMiLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHhkOGU4YTAyNywgTCJMdWNpZGFTYW5zIiwKKyAgICAgTCJMaWJlcmF0aW9uIFNhbnMgTmFycm93LE5pbWJ1cyBTYW5zIEwsS2Fjc3RRdXJuLERyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCAiCisgICAgIEwiU2FucyBFdGhpb3BpYyxEZWphVnUgU2VyaWYgQ29uZGVuc2VkLExpYmVyYXRpb24gTW9ubyxVYnVudHUiLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHhkOWZlNzc2MSwgTCJIaWdoVG93ZXJUZXh0LVJlZyIsCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxVYnVudHUsTGliZXJhdGlvbiBTZXJpZiIsIDIsIDEyNTJ9LAorICAgIHsweGRhN2U1NTFlLCBMIlNUU29uZyIsIEwiV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vIiwgMCwgOTM2fSwKKyAgICB7MHhkYWE2ODQyZCwgTCJTVFpob25nc29uZyIsCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiCisgICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCisgICAgIDAsIDkzNn0sCisgICAgezB4ZGFhYWI5M2YsIEwiU1RGYW5nc29uZyIsCisgICAgIEwiV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiAiCisgICAgIEwiSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwIiwKKyAgICAgMCwgOTM2fSwKKyAgICB7MHhkYWViMDcxMywgTCJTVFNvbmciLAorICAgICBMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gIgorICAgICBMIkhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCIsCisgICAgIDAsIDkzNn0sCisgICAgezB4ZGFmZWRiZWYsIEwiU1RDYWl5dW4iLCBMIkFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsIDAsCisgICAgIDkzNn0sCisgICAgezB4ZGIwMGEzZDksIEwiQnJvYWR3YXkiLAorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zLEZyZWVNb25vLExpYmVyYXRpb24gTW9ubyIsIDAsCisgICAgIDEyNTJ9LAorICAgIHsweGRiMWY1YWQ0LCBMIlNUWGlud2VpIiwgTCJBUiBQTCBVS2FpIEhLLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVLYWkgQ04iLCAwLAorICAgICA5MzZ9LAorICAgIHsweGRiMzI2ZTdmLCBMIlNUS2FpdGkiLAorICAgICBMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gIgorICAgICBMIkhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCIsCisgICAgIDAsIDkzNn0sCisgICAgezB4ZGI2OTU5NWEsIEwiU1RIdXBvIiwKKyAgICAgTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuICIKKyAgICAgTCJIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAiLAorICAgICAwLCA5MzZ9LAorICAgIHsweGRiYTAwODJjLCBMIlNUWGloZWkiLAorICAgICBMIiBXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuICIKKyAgICAgTCJIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAiLAorICAgICAwLCA5MzZ9LAorICAgIHsweGRiZDBhYjE4LCBMIlNUWGluZ2thaSIsIEwiQVIgUEwgVUthaSBISyxBUiBQTCBVTWluZyBISyxBUiBQTCBVS2FpIENOIiwgMCwKKyAgICAgOTM2fSwKKyAgICB7MHhkYzFhN2RiMSwgTCJTVExpdGkiLCBMIkFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsIDAsCisgICAgIDkzNn0sCisgICAgezB4ZGMzMzA3NWYsIEwiS3Jpc3RlbklUQy1SZWd1bGFyIiwKKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERlamFWdSBTYW5zICIKKyAgICAgTCJDb25kZW5zZWQsVWJ1bnR1LExpYmVyYXRpb24gU2FucyIsCisgICAgIDgsIDEyNTJ9LAorICAgIHsweGRjYzcwMDljLCBMIkhhcnJpbmd0b24iLAorICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2VyaWYsRnJlZVNlcmlmLFVidW50dSIsIDAsCisgICAgIDEyNTJ9LAorICAgIHsweGRkNzEyNDY2LCBMIkFyaWFsQmxhY2siLAorICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMsRGVqYVZ1IFNlcmlmLEZyZWVNb25vIiwgMCwgMTI1Mn0sCisgICAgezB4ZGRlODdiM2UsIEwiSW1wYWN0IiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTZXJpZiIsIDAsIDEyNTJ9LAorICAgIHsweGRmNjlmYjMyLCBMIlNuYXBJVEMiLAorICAgICBMIkxpYmVyYXRpb24gU2FucyBOYXJyb3csVWJ1bnR1IENvbmRlbnNlZCxEZWphVnUgU2FucyxEZWphVnUgIgorICAgICBMIlNlcmlmLEZyZWVNb25vIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4ZGY4YjI1ZTgsIEwiQ2VudHVyeUdvdGhpYyIsCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIE1vbm8sTGliZXJhdGlvbiBTYW5zLExpYmVyYXRpb24gU2VyaWYiLCAwLAorICAgICAxMjUyfSwKKyAgICB7MHhlMGY3MDVjMCwgTCJLcmlzdGVuSVRDIiwKKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERlamFWdSBTYW5zICIKKyAgICAgTCJDb25kZW5zZWQsVWJ1bnR1LExpYmVyYXRpb24gU2FucyIsCisgICAgIDgsIDEyNTJ9LAorICAgIHsweGUxNDI3NTczLCBMIlJhYXZpIiwKKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyAiCisgICAgIEwiRXRoaW9waWMsbXJ5X0thY3N0UXVybixGcmVlU2VyaWYsTGliZXJhdGlvbiBTZXJpZixLaG1lciBPUyIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweGUyY2VhMGNiLCBMIk1hZ25ldG8iLAorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRGVqYVZ1ICIKKyAgICAgTCJTZXJpZixEZWphVnUgU2VyaWYgQ29uZGVuc2VkLERlamFWdSBTYW5zIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4ZTM2YTllMTcsIEwiUmF2aWUiLAorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRGVqYVZ1ICIKKyAgICAgTCJTZXJpZixEZWphVnUgU2FucyxGcmVlTW9ubyIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweGU0MzNmOGUyLCBMIlBhcmNobWVudCIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLCA4LCAxMjUyfSwKKyAgICB7MHhlNDNkZmY0YSwgTCJXaW5nZGluZ3MiLCBMIkRlamFWdSBTZXJpZiIsIDQsIDQyfSwKKyAgICB7MHhlNGUyYzQwNSwgTCJNVEV4dHJhIiwgTCJEZWphVnUgU2VyaWYiLCA2LCA0Mn0sCisgICAgezB4ZTYxOGNjMzUsIEwiSW5mb3JtYWxSb21hbiIsCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCBTYW5zICIKKyAgICAgTCJKYXBhbmVzZSxOaW1idXMgU2FucyBMLERlamFWdSBTYW5zIENvbmRlbnNlZCxVYnVudHUsTGliZXJhdGlvbiBTYW5zIiwKKyAgICAgOCwgMTI1Mn0sCisgICAgezB4ZTZjMjdmZmMsIEwiTWlzdHJhbCIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLCA4LCAxMjUyfSwKKyAgICB7MHhlN2ViZjRiOSwgTCJDb3VyaWVyIiwgTCJEZWphVnUgU2FucyxEZWphVnUgU2FucyBDb25kZW5zZWQsRnJlZVNlcmlmIiwgMCwKKyAgICAgMTI1Mn0sCisgICAgezB4ZThiYzRhOWQsIEwiTVNSZWZlcmVuY2VTcGVjaWFsdHkiLCBMIkRlamFWdSBTZXJpZiIsIDAsIDEyNTJ9LAorICAgIHsweGU5MGZiMDEzLCBMIlRlbXB1c1NhbnNJVEMiLAorICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsVWJ1bnR1LExpYmVyYXRpb24gU2VyaWYsRnJlZVNlcmlmIiwgMCwgMTI1Mn0sCisgICAgezB4ZWM2MzdiNDIsIEwiQ29uc29sYXMiLAorICAgICBMIkRlamFWdSBTYW5zIENvbmRlbnNlZCxBUiBQTCBVS2FpIENOLEFSIFBMIFVLYWkgSEssQVIgUEwgVUthaSAiCisgICAgIEwiVFcsRnJlZVNlcmlmLEZyZWVTYW5zIiwKKyAgICAgMSwgMTI1Mn0sCisgICAgezB4ZWQzYTY4M2IsIEwiU1RYaW53ZWkiLCBMIkFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsIDAsCisgICAgIDkzNn0sCisgICAgezB4ZWYyNjRjZDEsIEwiTHVjaWRhSGFuZHdyaXRpbmciLAorICAgICBMIkxpYmVyYXRpb24gU2FucyBOYXJyb3csVWJ1bnR1IENvbmRlbnNlZCxOaW1idXMgU2FucyAiCisgICAgIEwiTCxLYWNzdFF1cm4sTGliZXJhdGlvbiBNb25vIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4ZjA4NmJjYTIsIEwiQmFza2VydmlsbGVPbGRGYWNlIiwKKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNlcmlmLFVidW50dSxGcmVlU2VyaWYiLCAwLAorICAgICAxMjUyfSwKKyAgICB7MHhmMTAyODAzMCwgTCJNYW5nYWwiLAorICAgICBMIkZyZWVTYW5zLFRTQ3VfUGFyYW5hcixHYXJ1ZGEsTGliZXJhdGlvbiBTYW5zLExpYmVyYXRpb24gU2FucyAiCisgICAgIEwiTmFycm93LE5pbWJ1cyBTYW5zIEwiLAorICAgICAyLCAxMjUyfSwKKyAgICB7MHhmMWRhN2ViOSwgTCJTaG93Y2FyZEdvdGhpYyIsCisgICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYgQ29uZGVuc2VkLERlamFWdSBTYW5zICIKKyAgICAgTCJDb25kZW5zZWQsTGliZXJhdGlvbiBTYW5zLFVidW50dSIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweGYyMTBmMDZhLCBMIkFyaWFsTVQiLAorICAgICBMIkxpYmVyYXRpb24gU2FucyxMaWJlcmF0aW9uIFNhbnMgTmFycm93LEZyZWVTYW5zLE5pbWJ1cyBTYW5zIEwsS2htZXIgT1MgIgorICAgICBMIlN5c3RlbSxLaG1lciBPUyIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweGY0NzdmMTZhLCBMIkxhdGhhIiwKKyAgICAgTCJMaWJlcmF0aW9uIFNhbnMgTmFycm93LE5pbWJ1cyBTYW5zIEwsRHJvaWQgQXJhYmljICIKKyAgICAgTCJOYXNraCxtcnlfS2Fjc3RRdXJuLEZyZWVTZXJpZixOaW1idXMgU2FucyBMIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4ZjYxNmYzZGQsIEwiTGlTdSIsCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyxBUiAiCisgICAgIEwiUEwgVU1pbmcgVFcgTUJFIiwKKyAgICAgMSwgOTM2fSwKKyAgICB7MHhmYTQ3OWFhNiwgTCJNaWNyb3NvZnRZYUhlaSIsCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiCisgICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCisgICAgIDAsIDkzNn0sCisgICAgezB4ZmNkMTk2OTcsIEwiQm9va21hbk9sZFN0eWxlIiwKKyAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gTW9ubyxMaWJlcmF0aW9uIFNhbnMsTGliZXJhdGlvbiBTZXJpZiIsIDAsCisgICAgIDEyNTJ9LAorICAgIHsweGZlMjA5YTgyLCBMIkx1Y2lkYUNhbGxpZ3JhcGh5IiwKKyAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCAiCisgICAgIEwiU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYsRGVqYVZ1IFNhbnMsRnJlZU1vbm8iLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHhmZWYxMzVmOCwgTCJBZG9iZUhlaXRpU3RkLVJlZ3VsYXIiLAorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIgorICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAorICAgICAwLCA5MzZ9LAorfTsKKyNlbGlmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX0FQUExFXworY29uc3QgRkdBU19Gb250SW5mbyBnX1hGQUZvbnRzTWFwW10gPSB7CisgICAgezB4MDFkNWQzM2UsIEwiU2ltU3VuIiwgTCJTVEhlaXRpLEhlaXRpIFRDLFNURmFuZ3NvbmciLCAwLCA5MzZ9LAorICAgIHsweDAxZTRmMTAyLCBMIllvdVl1YW4iLCBMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsIDEsIDkzNn0sCisgICAgezB4MDMwNTQ5ZGMsIEwiTGlTdSIsIEwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwgMSwgOTM2fSwKKyAgICB7MHgwMzJlZGQ0NCwgTCJTaW1oZWkiLCBMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsIDEsIDkzNn0sCisgICAgezB4MDNlYWM2ZmMsIEwiUG9vclJpY2hhcmQtUmVndWxhciIsCisgICAgIEwiTm90ZXdvcnRoeSxBdmVuaXIgTmV4dCBDb25kZW5zZWQsSW1wYWN0IiwgMiwgMTI1Mn0sCisgICAgezB4MDNlZDkwZTYsIEwiTmluYSIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYiLCAwLCAxMjUyfSwKKyAgICB7MHgwNzdiNTZiMywgTCJLaW5nc29mdFBob25ldGljUGxhaW4iLAorICAgICBMIkxhc3RSZXNvcnQsQXBwbGUgIgorICAgICBMIkNoYW5jZXJ5LFNUSVhWYXJpYW50cyxTVElYU2l6ZU9uZVN5bSxTVElYU2l6ZU9uZVN5bSxBcHBsZSBCcmFpbGxlIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4MDc4ZWQ1MjQsIEwiTWljcm9zb2Z0U2Fuc1NlcmlmIiwgTCJTb25ndGkgU0MsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LAorICAgIHsweDA4OWIxOGE5LCBMIkFyaWFsIiwKKyAgICAgTCJBcmlhbCBVbmljb2RlIE1TLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLCAxMjUyfSwKKyAgICB7MHgwYjJjYWQ3MiwgTCJNb25vdHlwZUNvcnNpdmEiLCBMIkFyaWFsIE5hcnJvdyxJbXBhY3QiLCA4LCAxMjUyfSwKKyAgICB7MHgwYmIwMDNlNywgTCJLYXJ0aWthIiwKKyAgICAgTCJBcmlhbCBVbmljb2RlIE1TLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEFyaWFsIE5hcnJvdyxEYW1hc2N1cyIsIDIsIDEyNTJ9LAorICAgIHsweDBiYjQ2OWRmLCBMIlZpbmVySGFuZElUQyIsIEwiQ29taWMgU2FucyBNUyxTb25ndGkgU0MsU1RTb25nIiwgOCwgMTI1Mn0sCisgICAgezB4MGJjMWE4NTEsIEwiU2Vnb2VVSSIsIEwiQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LAorICAgIHsweDBjMTEyZWJkLCBMIktvenVrYUdvdGhpY1Byby1WSU0iLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHgwY2ZjYjljMSwgTCJBZG9iZVRoYWkiLCBMIkF2ZW5pciBOZXh0IENvbmRlbnNlZCBVbHRyYSBMaWdodCIsIDAsIDg0N30sCisgICAgezB4MGU3ZGUwZjksIEwiUGxheWJpbGwiLCBMIlNUSVhOb25Vbmljb2RlIiwgMCwgMTI1Mn0sCisgICAgezB4MGVmZjQ3YzMsIEwiU1RIdXBvIiwgTCJLYWl0aSBTQyxTb25ndGkgU0MsU1RIZWl0aSIsIDAsIDkzNn0sCisgICAgezB4MTA3YWQzNzQsIEwiQ29uc3RhbnRpYSIsIEwiQXJpYWwgVW5pY29kZSBNUyxQYWxhdGlubyxCYXNrZXJ2aWxsZSIsIDIsCisgICAgIDEyNTJ9LAorICAgIHsweDEyMTk0YzJkLCBMIkt1bnN0bGVyU2NyaXB0IiwKKyAgICAgTCJBdmVuaXIgTmV4dCBDb25kZW5zZWQgRGVtaSBCb2xkLEFyaWFsIE5hcnJvdyIsIDgsIDEyNTJ9LAorICAgIHsweDEzNWVmNmExLCBMIk1pbmlvblByb1NtQmQiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLAorICAgICAxMjUyfSwKKyAgICB7MHgxNThjNDA0OSwgTCJHYXJhbW9uZCIsIEwiSW1wYWN0LEFyaWFsIE5hcnJvdyIsIDIsIDEyNTJ9LAorICAgIHsweDE2MGVjYjI0LCBMIlNUWmhvbmdzb25nIiwgTCJTVEZhbmdzb25nLFNvbmd0aSBTQyIsIDAsIDkzNn0sCisgICAgezB4MTYxZWQwN2UsIEwiTVNHb3RoaWMiLAorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgSEssQVIgUEwgVU1pbmcgIgorICAgICBMIlRXLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAorICAgICAxLCAxMjUyfSwKKyAgICB7MHgxNzFkMWVkMSwgTCJTbmFwSVRDLVJlZ3VsYXIiLCBMIlNUSGVpdGksQXJpYWwgQmxhY2siLCAwLCAxMjUyfSwKKyAgICB7MHgxOGQxMTg4ZiwgTCJDYW1icmlhIiwgTCJBcmlhbCBVbmljb2RlIE1TIiwgMiwgMTI1Mn0sCisgICAgezB4MThlYWYzNTAsIEwiQXJpYWxVbmljb2RlTVMiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLAorICAgICA5MzZ9LAorICAgIHsweDFhOTJkMTE1LCBMIk1pbmdMaVUiLCBMIkhlaXRpIFNDLFNUSGVpdGkiLCAxLCAxMjUyfSwKKyAgICB7MHgxY2MyMTdjNiwgTCJUcmVidWNoZXRNUyIsIEwiRGFtYXNjdXMsSW1wYWN0LEFyaWFsIE5hcnJvdyIsIDAsIDEyNTJ9LAorICAgIHsweDFkNjQ5NTk2LCBMIkJhc2VtaWNUaW1lcyIsIEwiTGliZXJhdGlvbiBTZXJpZixJbXBhY3QsQXJpYWwgTmFycm93IiwgMCwKKyAgICAgMTI1Mn0sCisgICAgezB4MWUzNGVlNjAsIEwiQmVsbE1UIiwKKyAgICAgTCJQYXB5cnVzLFNUSVhOb25Vbmljb2RlLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEF2ZW5pciBMaWdodCIsIDIsIDEyNTJ9LAorICAgIHsweDFlYjM2OTQ1LCBMIkNvb3BlckJsYWNrIiwKKyAgICAgTCJNYXJpb24sU1RJWE5vblVuaWNvZGUsQXJpYWwgUm91bmRlZCBNVCBCb2xkLEx1Y2lkYSBHcmFuZGUiLCAyLCAxMjUyfSwKKyAgICB7MHgxZWY3Nzg3ZCwgTCJCYXRhbmdDaGUiLAorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVU1pbmcgQ04sLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXLEFSICIKKyAgICAgTCJQTCBVTWluZyBUVyBNQkUsQXJpYWwgVW5pY29kZSBNUyxIZWl0aSBUQyIsCisgICAgIDEsIDEyNTJ9LAorICAgIHsweDIwYjNiZDNhLCBMIkJydXNoU2NyaXB0TVQiLAorICAgICBMIlNUSVhOb25Vbmljb2RlLERhbWFzY3VzLEFyaWFsIE5hcnJvdyxBdmVuaXIgTmV4dCBDb25kZW5zZWQsQ29jaGluIiwgOCwKKyAgICAgMTI1Mn0sCisgICAgezB4MjIwODc3YWEsIEwiQ2FuZGFyYSIsIEwiQ29jaGluLEJhc2tlcnZpbGxlLE1hcmlvbiIsIDAsIDEyNTJ9LAorICAgIHsweDIyMTM1MDA3LCBMIkZyZWVzdHlsZVNjcmlwdC1SZWd1bGFyIiwKKyAgICAgTCJTVElYTm9uVW5pY29kZSxOYWRlZW0sWmFwZiBEaW5nYmF0cyIsIDgsIDEyNTJ9LAorICAgIHsweDI1MTA1OWMzLCBMIkNoaWxsZXIiLAorICAgICBMIlphcGYgRGluZ2JhdHMsRGFtYXNjdXMsU1RJWE5vblVuaWNvZGUsUGFweXJ1cyxLdWZpU3RhbmRhcmRHSyxCYWdoZGFkIiwgMCwKKyAgICAgMTI1Mn0sCisgICAgezB4MjViZWQ2ZGQsIEwiTVNSZWZlcmVuY2VTYW5zU2VyaWYiLAorICAgICBMIlRhaG9tYSxBcHBsZSBTeW1ib2xzLEFwcGxlIExpR290aGljLEFyaWFsIFVuaWNvZGUgTVMsTHVjaWRhICIKKyAgICAgTCJHcmFuZGUsTWljcm9zb2Z0IFNhbnMgU2VyaWYiLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHgyODE1NGM4MSwgTCJQYXJjaG1lbnQtUmVndWxhciIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDgsCisgICAgIDEyNTJ9LAorICAgIHsweDI5NzExZWI5LCBMIlNUTGl0aSIsIEwiS2FpdGkgU0MsU29uZ3RpIFNDIiwgMCwgOTM2fSwKKyAgICB7MHgyYjE5OTNiNCwgTCJCYXNlbWljIiwgTCJJbXBhY3QsQXJpYWwgTmFycm93IiwgMCwgMTI1Mn0sCisgICAgezB4MmIzMTYzMzksIEwiTmlhZ2FyYVNvbGlkLVJlZyIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsCisgICAgIDEyNTJ9LAorICAgIHsweDJjMTQ3NTI5LCBMIkZvb3RsaWdodE1UTGlnaHQiLAorICAgICBMIlNUSVhOb25Vbmljb2RlLEF2ZW5pciBOZXh0IENvbmRlbnNlZCBIZWF2eSxQVCBTYW5zLE5vdGV3b3J0aHkiLCAwLCAxMjUyfSwKKyAgICB7MHgyYzE5ODkyOCwgTCJIYXJsb3dTb2xpZCIsCisgICAgIEwiQXZlbmlyIE1lZGl1bSxBdmVuaXIgTmV4dCBNZWRpdW0sQXJpYWwgVW5pY29kZSBNUyIsIDAsIDEyNTJ9LAorICAgIHsweDJjNmFjNmIyLCBMIkx1Y2lkYUJyaWdodCIsCisgICAgIEwiUFQgU2FucyBOYXJyb3csUGFweXJ1cyxEYW1hc2N1cyxTVElYTm9uVW5pY29kZSxBcmlhbCBSb3VuZGVkIE1UICIKKyAgICAgTCJCb2xkLENvbWljIFNhbnMgTVMsQXZlbmlyIE5leHQiLAorICAgICAyLCAxMjUyfSwKKyAgICB7MHgyYzlmMzhlMiwgTCJLb3p1a2FNaW5jaG9Qcm8tVklSIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4MmQ1YTQ3YjAsIEwiU1RDYWl5dW4iLCBMIkthaXRpIFNDLFNvbmd0aSBTQyIsIDAsIDkzNn0sCisgICAgezB4MmRlZjI2YmYsIEwiQmVybmFyZE1ULUNvbmRlbnNlZCIsCisgICAgIEwiSW1wYWN0LEF2ZW5pciBOZXh0IENvbmRlbnNlZCBEZW1pIEJvbGQsQW1lcmljYW4gVHlwZXdyaXRlciIsIDAsIDEyNTJ9LAorICAgIHsweDJmZDg5MzBiLCBMIktvenVrYU1pbmNob1ByNk5SIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwKKyAgICAgMTI1Mn0sCisgICAgezB4MzExNTUyNWEsIEwiRmFuZ1NvbmdfR0IyMzEyIiwgTCJIaXJhZ2lubyBTYW5zIEdCLFNUSGVpdGkiLCAwLCAxMjUyfSwKKyAgICB7MHgzMTMyNzgxNywgTCJNeXJpYWRQcm8iLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLCAxMjUyfSwKKyAgICB7MHgzMjI0NDk3NSwgTCJIZWx2ZXRpY2EiLAorICAgICBMIkFyaWFsIE5hcnJvdyxBcmlhbCBVbmljb2RlIE1TLERhbWFzY3VzLFNUSVhOb25Vbmljb2RlIiwgMCwgMTI1Mn0sCisgICAgezB4MzJhYzk5NWMsIEwiVGVybWluYWwiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLCAxMjUyfSwKKyAgICB7MHgzMzhkNjQ4YSwgTCJOaWFnYXJhRW5ncmF2ZWQtUmVnIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4MzNiYjY1ZjIsIEwiU3lsZmFlbiIsIEwiQXJpYWwgVW5pY29kZSBNUyxNYXJpb24iLCAyLCAxMjUyfSwKKyAgICB7MHgzNDAyYzMwZSwgTCJNU1BNaW5jaG8iLCBMIkFyaWFsIFVuaWNvZGUgTVMsQXBwbGUgU0QgR290aGljIE5lbyIsIDIsCisgICAgIDEyNTJ9LAorICAgIHsweDM0MTJiZjMxLCBMIlNpbVN1bi1QVUEiLCBMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsIDAsIDkzNn0sCisgICAgezB4MzZlYjM5YjksIEwiQmVybGluU2Fuc0ZCIiwgTCJBbWVyaWNhbiBUeXBld3JpdGVyLEltcGFjdCIsIDAsIDEyNTJ9LAorICAgIHsweDM2ZjQyMDU1LCBMIlVuaXZlcnNBVFQiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwgMCwgMTI1Mn0sCisgICAgezB4Mzg2NGM0ZjYsIEwiSGlnaFRvd2VyVGV4dCIsIEwiU1RJWEdlbmVyYWwsLkhlbHZldGljYSBOZXVlIERlc2sgVUkiLCAyLAorICAgICAxMjUyfSwKKyAgICB7MHgzYTI1N2QwMywgTCJGYW5nU29uZ19HQjIzMTIiLCBMIkhpcmFnaW5vIFNhbnMgR0IsU1RIZWl0aSIsIDAsIDEyNTJ9LAorICAgIHsweDNjZGFlNjY4LCBMIkZyZWVzdHlsZVNjcmlwdCIsIEwiTmFkZWVtLFphcGYgRGluZ2JhdHMsU1RJWE5vblVuaWNvZGUiLCA4LAorICAgICAxMjUyfSwKKyAgICB7MHgzZDU1YWVkNywgTCJKb2tlcm1hbiIsCisgICAgIEwiUGFweXJ1cyxMdWNpZGEgR3JhbmRlLEhlaXRpIFRDLEFtZXJpY2FuIFR5cGV3cml0ZXIiLCAwLCAxMjUyfSwKKyAgICB7MHgzZDViNDM4NSwgTCJQTWluZ0xpVSIsIEwiSGVpdGkgU0MsU1RIZWl0aSIsIDIsIDEyNTJ9LAorICAgIHsweDNkOWI3NjY5LCBMIkVzdHJhbmdlbG9FZGVzc2EiLCBMIkFtZXJpY2FuIFR5cGV3cml0ZXIsTWFyaW9uIiwgMCwgMTI1Mn0sCisgICAgezB4M2U1MzJkNzQsIEwiRnJhbmtsaW5Hb3RoaWNNZWRpdW0iLCBMIkltcGFjdCxBcmlhbCBOYXJyb3ciLCAwLCAxMjUyfSwKKyAgICB7MHgzZTZhYTMyZCwgTCJOU2ltU3VuIiwgTCJTVEhlaXRpLFNURmFuZ3NvbmciLCAxLCA5MzZ9LAorICAgIHsweDNmNmMzNmE4LCBMIkdhdXRhbWkiLAorICAgICBMIkRhbWFzY3VzLFNUSVhOb25Vbmljb2RlLFNUSVhHZW5lcmFsLEFtZXJpY2FuIFR5cGV3cml0ZXIiLCAwLCAxMjUyfSwKKyAgICB7MHgzZmYzMjY2MiwgTCJDaGlsbGVyLVJlZ3VsYXIiLCBMIlBhcHlydXMsS3VmaVN0YW5kYXJkR0ssQmFnaGRhZCIsIDAsCisgICAgIDEyNTJ9LAorICAgIHsweDQwOWRlMzEyLCBMIk1vZGVybk5vLjIwIiwgTCJBdmVuaXIgTmV4dCBDb25kZW5zZWQsSW1wYWN0IiwgMiwgMTI1Mn0sCisgICAgezB4NDE0NDNjNWUsIEwiR2VvcmdpYSIsIEwiLkhlbHZldGljYSBOZXVlIERlc2sgVUksQXJpYWwgVW5pY29kZSBNUyIsIDIsCisgICAgIDEyNTJ9LAorICAgIHsweDQxNjBhZGU1LCBMIkJlbGxHb3RoaWNTdGRCbGFjayIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweDQyMTk3NmM0LCBMIk1vZGVybi1SZWd1bGFyIiwgTCJJbXBhY3QiLCAyLCAxMjUyfSwKKyAgICB7MHg0MjJhNzI1MiwgTCJTdGVuY2lsIiwgTCJTVElYTm9uVW5pY29kZSxTb25ndGkgU0MsR2VvcmdpYSxCYXNrZXJ2aWxsZSIsIDAsCisgICAgIDEyNTJ9LAorICAgIHsweDQyYzg1NTRmLCBMIkZpeGVkc3lzIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sCisgICAgezB4NDM1Y2I0MWQsIEwiUm9tYW4iLCBMIkFyaWFsIE5hcnJvdyIsIDAsIDEyNTJ9LAorICAgIHsweDQ3ODgyMzgzLCBMIkNvdXJpZXJOZXciLCBMIlBDTXl1bmdqbyxPc2FrYSxBcmlhbCBVbmljb2RlIE1TLFNvbmd0aSBTQyIsCisgICAgIDEsIDEyNTJ9LAorICAgIHsweDQ4MGEyMzM4LCBMIkJlcmxpblNhbnNGQkRlbWkiLAorICAgICBMIlNUSVhOb25Vbmljb2RlLEFtZXJpY2FuIFR5cGV3cml0ZXIsQXZlbmlyIE5leHQgQ29uZGVuc2VkIEhlYXZ5IiwgMCwKKyAgICAgMTI1Mn0sCisgICAgezB4NDgwYmY3YTQsIEwiQ291cmllclN0ZCIsIEwiQ291cmllciBOZXciLCAwLCAxMjUyfSwKKyAgICB7MHg0ODFhZDZlZCwgTCJWbGFkaW1pclNjcmlwdCIsCisgICAgIEwiU1RJWE5vblVuaWNvZGUsQXZlbmlyIE5leHQgQ29uZGVuc2VkLEltcGFjdCIsIDgsIDEyNTJ9LAorICAgIHsweDQ5MTE1NzdhLCBMIllvdVl1YW4iLCBMIlNUSGVpdGksSGVpdGkgVEMiLCAxLCA5MzZ9LAorICAgIHsweDRhNzg4ZDcyLCBMIlNUWGluZ2thaSIsIEwiS2FpdGkgU0MsU29uZ3RpIFNDIiwgMCwgOTM2fSwKKyAgICB7MHg0YmY4ODU2NiwgTCJTZWdvZUNvbmRlbnNlZCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsCisgICAgIDEyNTJ9LAorICAgIHsweDRjY2Y1MWE0LCBMIkJlcmxpblNhbnNGQi1SZWciLAorICAgICBMIlNUSVhOb25Vbmljb2RlLEFtZXJpY2FuIFR5cGV3cml0ZXIsSW1wYWN0IiwgMCwgMTI1Mn0sCisgICAgezB4NGVhOTY3Y2UsIEwiR3VsaW1DaGUiLCBMIkFyaWFsIFVuaWNvZGUgTVMsSGVpdGkgVEMsU1RGYW5nc29uZyIsIDEsIDEyNTJ9LAorICAgIHsweDRmNjhiZDc5LCBMIkxldHRlckdvdGhpY1N0ZCIsCisgICAgIEwiQ291cmllciBOZXcsQW5kYWxlIE1vbm8sQXl1dGhheWEsUENNeXVuZ2pvLE9zYWthIiwgMCwgMTI1Mn0sCisgICAgezB4NTFhMGQwZTYsIEwiS296dWthR290aGljUHI2Tk0iLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLAorICAgICAxMjUyfSwKKyAgICB7MHg1MzFiM2RlYSwgTCJCYXNlbWljU3ltYm9sIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwKKyAgICAgMTI1Mn0sCisgICAgezB4NTMzM2ZkMzksIEwiQ2FsaWZvcm5pYW5GQi1SZWciLAorICAgICBMIkFtZXJpY2FuIFR5cGV3cml0ZXIsQXZlbmlyIE5leHQgQ29uZGVuc2VkLEltcGFjdCIsIDIsIDEyNTJ9LAorICAgIHsweDUzNTYxYTU0LCBMIkZaWVRLLS1HQksxLTAiLCBMIlNURmFuZ3NvbmcsU29uZ3RpIFNDLFNUU29uZyIsIDAsIDkzNn0sCisgICAgezB4NTVlMGRkZTYsIEwiTHVjaWRhU2Fuc1R5cGV3cml0ZXIiLCBMIk1lbmxvLENvdXJpZXIgTmV3LEFuZGFsZSBNb25vIiwgMCwKKyAgICAgMTI1Mn0sCisgICAgezB4NTc0ZDRkM2QsIEwiQWRvYmVBcmFiaWMiLCBMIkFyaWFsIE5hcnJvdyIsIDAsIDEyNTJ9LAorICAgIHsweDU3OTJlNzU5LCBMIlNUS2FpdGkiLCBMIlNvbmd0aSBTQyxBcmlhbCBVbmljb2RlIE1TIiwgMCwgOTM2fSwKKyAgICB7MHg1OTIxOTc4ZSwgTCJMdWNpZGFTYW5zVW5pY29kZSIsIEwiTHVjaWRhIEdyYW5kZSxBcmlhbCBVbmljb2RlIE1TLE1lbmxvIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4NTk0ZTJkYTQsIEwiVnJpbmRhIiwgTCJHZWV6YSBQcm8sRGFtYXNjdXMsU1RJWEdlbmVyYWwsR2lsbCBTYW5zIiwgMCwKKyAgICAgMTI1Mn0sCisgICAgezB4NTliYWE5YTIsIEwiS2FpVGlfR0IyMzEyIiwgTCJIaXJhZ2lubyBTYW5zIEdCLFNUSGVpdGkiLCAwLCAxMjUyfSwKKyAgICB7MHg1Y2ZlZGY0ZiwgTCJCYXNrT2xkRmFjZSIsCisgICAgIEwiQXZlbmlyIE5leHQgQ29uZGVuc2VkIEhlYXZ5LFBUIFNhbnMsQXZlbmlyIE5leHQgQ29uZGVuc2VkIiwgMCwgMTI1Mn0sCisgICAgezB4NWUxNmFjOTEsIEwiVHJhamFuUHJvIiwgTCJBcmlhbCBOYXJyb3csUFQgU2FucyBOYXJyb3csRGFtYXNjdXMiLCAwLAorICAgICAxMjUyfSwKKyAgICB7MHg1Zjk3OTIxYywgTCJBZG9iZU15dW5nam9TdGRNIiwKKyAgICAgTCJBcHBsZU15dW5nam8sQXBwbGVHb3RoaWMsQXJpYWwgVW5pY29kZSBNUyIsIDAsIDkzNn0sCisgICAgezB4NWZlZmJmYWQsIEwiQmF0YW5nIiwgTCJBcmlhbCBVbmljb2RlIE1TLFNvbmd0aSBTQyIsIDIsIDEyNTJ9LAorICAgIHsweDYwNTM0MmI5LCBMIkRvdHVtQ2hlIiwgTCJBcmlhbCBVbmljb2RlIE1TLEhlaXRpIFRDIiwgMSwgMTI1Mn0sCisgICAgezB4NjA4YzVmOWEsIEwiS2FpVGlfR0IyMzEyIiwgTCJIaXJhZ2lubyBTYW5zIEdCLFNUSGVpdGksSGVpdGkgVEMiLCAwLCA5MzZ9LAorICAgIHsweDYxZWZkMGQxLCBMIk1hdHVyYU1UU2NyaXB0Q2FwaXRhbHMiLAorICAgICBMIktva29ub3IsRGFtYXNjdXMsU1RJWE5vblVuaWNvZGUsU1RIZWl0aSxBcmlhbCBCbGFjayxBdmVuaXIgTmV4dCBIZWF2eSIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweDYyNjYwOGE5LCBMIk1WQm9saSIsCisgICAgIEwiQXBwbGUgQnJhaWxsZSxHZWV6YSBQcm8sTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LAorICAgIHsweDYzMDUwMWEzLCBMIlNtYWxsRm9udHMiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLCAxMjUyfSwKKyAgICB7MHg2NWQwZTJhOSwgTCJGWllUSy0tR0JLMS0wIiwgTCJTVEZhbmdzb25nLFNvbmd0aSBTQyxTVFNvbmciLCAwLCA5MzZ9LAorICAgIHsweDY2OWYyOWUxLCBMIkZaU1RLLS1HQksxLTAiLCBMIlNUSGVpdGksSGVpdGkgVEMiLCAwLCA5MzZ9LAorICAgIHsweDY3M2E5ZTVmLCBMIlR1bmdhIiwKKyAgICAgTCJEYW1hc2N1cyxTVElYTm9uVW5pY29kZSxBdmVuaXIgTmV4dCBDb25kZW5zZWQsQXZlbmlyIE5leHQgQ29uZGVuc2VkICIKKyAgICAgTCJVbHRyYSBMaWdodCxGdXR1cmEiLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHg2OTFhYTRjZSwgTCJOaWFnYXJhU29saWQiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLAorICAgICAxMjUyfSwKKyAgICB7MHg2OTYyNTliNywgTCJDb3JiZWwiLCBMIkNvY2hpbixCYXNrZXJ2aWxsZSxNYXJpb24iLCAwLCAxMjUyfSwKKyAgICB7MHg2OTZlZTliZSwgTCJTVFhpaGVpIiwgTCJTVEhlaXRpLEhlaXRpIFRDLFNvbmd0aSBTQyxBcmlhbCBVbmljb2RlIE1TIiwgMCwKKyAgICAgOTM2fSwKKyAgICB7MHg2YzU5Y2Y2OSwgTCJEb3R1bSIsIEwiQXJpYWwgVW5pY29kZSBNUyxTb25ndGkgU0MiLCAwLCAxMjUyfSwKKyAgICB7MHg3MDdmYTU2MSwgTCJHdW5nc3VoIiwgTCJBcmlhbCBVbmljb2RlIE1TLEhlaXRpIFRDIiwgMiwgMTI1Mn0sCisgICAgezB4NzE0MTZiYjIsIEwiWldBZG9iZUYiLAorICAgICBMIlNUSVhTaXplRm91clN5bSxTVElYU2l6ZVRocmVlU3ltLFNUSVhTaXplVHdvU3ltLFNUSVhTaXplT25lU3ltIiwgMCwKKyAgICAgMTI1Mn0sCisgICAgezB4NzFiNDE4MDEsIEwiVmVyZGFuYSIsCisgICAgIEwiVGFob21hLE1hcmlvbixBcHBsZSBTeW1ib2xzLC5IZWx2ZXRpY2EgTmV1ZSBEZXNrIFVJLEx1Y2lkYSAiCisgICAgIEwiR3JhbmRlLENvdXJpZXIgTmV3IiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4NzNmMjVlNGMsIEwiUGFsYXRpbm9MaW5vdHlwZSIsIEwiUGFsYXRpbm8sQXJpYWwgVW5pY29kZSBNUyIsIDAsIDEyNTJ9LAorICAgIHsweDczZjRkMTlmLCBMIk5pYWdhcmFFbmdyYXZlZCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsCisgICAgIDEyNTJ9LAorICAgIHsweDc0MDAxNjk0LCBMIk15cmlhZFByb0JsYWNrIiwgTCJQYWxhdGlubyxCYXNrZXJ2aWxsZSxNYXJpb24sQ29jaGluIiwgMCwKKyAgICAgMTI1Mn0sCisgICAgezB4NzRiMTRkOGYsIEwiSGFldHRlbnNjaHdlaWxlciIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsCisgICAgIDEyNTJ9LAorICAgIHsweDc0Y2I0NGVlLCBMIk5TaW1TdW4iLCBMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsIDEsIDkzNn0sCisgICAgezB4NzZiNGQ3ZmYsIEwiU2hydXRpIiwKKyAgICAgTCJEYW1hc2N1cyxTVElYTm9uVW5pY29kZSxBcmlhbCBVbmljb2RlIE1TLEFtZXJpY2FuIFR5cGV3cml0ZXIiLCAwLCAxMjUyfSwKKyAgICB7MHg3ODhiMzUzMywgTCJXZWJkaW5ncyIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDYsIDQyfSwKKyAgICB7MHg3OTdkZGU5OSwgTCJNU1NlcmlmIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sCisgICAgezB4N2EwZjllOWUsIEwiTVNNaW5jaG8iLAorICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgSEssQVIgUEwgVU1pbmcgVFcsQVIgIgorICAgICBMIlBMIFVNaW5nIFRXIE1CRSxBcmlhbCBVbmljb2RlIE1TLEFwcGxlIFNEIEdvdGhpYyBOZW8iLAorICAgICAxLCAxMjUyfSwKKyAgICB7MHg3YjQzOWNhZiwgTCJPbGRFbmdsaXNoVGV4dE1UIiwKKyAgICAgTCJTVElYTm9uVW5pY29kZSxBcmlhbCBVbmljb2RlIE1TLEJhc2tlcnZpbGxlLEF2ZW5pciBOZXh0IE1lZGl1bSIsIDAsCisgICAgIDEyNTJ9LAorICAgIHsweDgyMTNhNDMzLCBMIkx1Y2lkYVNhbnMtVHlwZXdyaXRlciIsCisgICAgIEwiQ29taWMgU2FucyBNUyxBdmVuaXIgTmV4dCxBcmlhbCBSb3VuZGVkIE1UIEJvbGQiLCAwLCAxMjUyfSwKKyAgICB7MHg4MmZlYzkyOSwgTCJBZG9iZVNvbmdTdGRMIiwgTCJIZWl0aSBUQyxTVEhlaXRpIiwgMCwgOTM2fSwKKyAgICB7MHg4MzU4MTgyNSwgTCJNb2Rlcm4iLCBMIkF2ZW5pciBOZXh0IENvbmRlbnNlZCxJbXBhY3QiLCAwLCAxMjUyfSwKKyAgICB7MHg4MzVhMjgyMywgTCJBbGdlcmlhbiIsCisgICAgIEwiU1RJWE5vblVuaWNvZGUsQmFza2VydmlsbGUsQXZlbmlyIE5leHQgTWVkaXVtLEFtZXJpY2FuIFR5cGV3cml0ZXIiLCAwLAorICAgICAxMjUyfSwKKyAgICB7MHg4M2RhYjlmNSwgTCJTY3JpcHQiLCBMIkFyaWFsIE5hcnJvdyIsIDAsIDEyNTJ9LAorICAgIHsweDg0N2I1NmRhLCBMIlRhaG9tYSIsIEwiU29uZ3RpIFNDLEFwcGxlIFN5bWJvbHMiLCAwLCAxMjUyfSwKKyAgICB7MHg4YTc4M2NiMiwgTCJTaW1TdW4tUFVBIiwgTCJTVEhlaXRpLEhlaXRpIFRDLFNURmFuZ3NvbmciLCAwLCAxMjUyfSwKKyAgICB7MHg4YjVjYWMwZSwgTCJPbnl4IiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sCisgICAgezB4OGM2YTQ5OWUsIEwiR3VsaW0iLCBMIkFyaWFsIFVuaWNvZGUgTVMsU29uZ3RpIFNDIiwgMCwgMTI1Mn0sCisgICAgezB4OGUwYWY3OTAsIEwiSnVpY2VJVEMiLCBMIk5hZGVlbSxBbCBCYXlhbiIsIDAsIDEyNTJ9LAorICAgIHsweDhlOGQ0M2IyLCBMIkNlbnRhdXIiLCBMIkF2ZW5pciBOZXh0IENvbmRlbnNlZCxOb3Rld29ydGh5LEltcGFjdCIsIDIsCisgICAgIDEyNTJ9LAorICAgIHsweDhlZTRkY2NhLCBMIkJvb2tzaGVsZlN5bWJvbDciLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLAorICAgICAxMjUyfSwKKyAgICB7MHg5MDc5NDgwMCwgTCJCZWxsR290aGljU3RkTGlnaHQiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHg5MDliNTE2YSwgTCJDZW50dXJ5IiwgTCJEYW1hc2N1cyxBbmRhbGUgTW9ubyxTb25ndGkgU0MsQXJpYWwgVW5pY29kZSBNUyIsCisgICAgIDIsIDEyNTJ9LAorICAgIHsweDkyYWUzNzBkLCBMIk1TT3V0bG9vayIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDQsIDQyfSwKKyAgICB7MHg5M2M5ZmJmMSwgTCJMdWNpZGFGYXgiLAorICAgICBMIlBUIFNhbnMgTmFycm93LFBhcHlydXMsS29rb25vcixHZWV6YSBQcm8sQXJpYWwgUm91bmRlZCBNVCBCb2xkLEx1Y2lkYSAiCisgICAgIEwiR3JhbmRlLEZ1dHVyYSIsCisgICAgIDIsIDEyNTJ9LAorICAgIHsweDk1NjUwODVlLCBMIkJvb2tBbnRpcXVhIiwgTCJQYWxhdGlubyxNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwKKyAgICAgMiwgMTI1Mn0sCisgICAgezB4OTg1NmQ5NWQsIEwiQWRvYmVNaW5nU3RkTCIsIEwiQUhpcmFnaW5vIFNhbnMgR0IsSGVpdGkgVEMsU1RIZWl0aSIsIDAsCisgICAgIDk0OX0sCisgICAgezB4OWJiYWRkNmIsIEwiQ29sb25uYU1UIiwgTCJOb3Rld29ydGh5LEF2ZW5pciBOZXh0IENvbmRlbnNlZCxJbXBhY3QiLCAwLAorICAgICAxMjUyfSwKKyAgICB7MHg5Y2JkMTZhNCwgTCJTaG93Y2FyZEdvdGhpYy1SZWciLAorICAgICBMIkFyaWFsIFVuaWNvZGUgTVMsR2VvcmdpYSxBbWVyaWNhbiBUeXBld3JpdGVyIiwgMCwgMTI1Mn0sCisgICAgezB4OWQ3MzAwOGUsIEwiTVNTYW5zU2VyaWYiLCBMIlNvbmd0aSBTQyxBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sCisgICAgezB4YTA2MDdkYjEsIEwiR3VuZ3N1aENoZSIsCisgICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyxBUiAiCisgICAgIEwiUEwgVU1pbmcgVFcgTUJFLEFyaWFsIFVuaWNvZGUgTVMsSGVpdGkgVEMsU1RGYW5nc29uZyIsCisgICAgIDEsIDEyNTJ9LAorICAgIHsweGEwYmNmNmExLCBMIkxhdGluV2lkZSIsIEwiWmFwZmlubyxBcmlhbCBCbGFjayxTVEhlaXRpIiwgMiwgMTI1Mn0sCisgICAgezB4YTE0MjliMzYsIEwiU3ltYm9sIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgNiwgNDJ9LAorICAgIHsweGExZmE1YWJjLCBMIldpbmdkaW5nczIiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCA2LCA0Mn0sCisgICAgezB4YTFmYTVhYmQsIEwiV2luZ2RpbmdzMyIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDYsIDQyfSwKKyAgICB7MHhhNDI3YmFkNCwgTCJJbmZvcm1hbFJvbWFuLVJlZ3VsYXIiLAorICAgICBMIlNUSVhOb25Vbmljb2RlLEFyaWFsIE5hcnJvdyxBdmVuaXIgTmV4dCBDb25kZW5zZWQgRGVtaSBCb2xkIiwgOCwgMTI1Mn0sCisgICAgezB4YThiOTJlY2UsIEwiRlpTVEstLUdCSzEtMCIsIEwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwgMCwgOTM2fSwKKyAgICB7MHhhOGQ4M2VjZSwgTCJDYWxpZm9ybmlhbkZCIiwKKyAgICAgTCJBbWVyaWNhbiBUeXBld3JpdGVyLEF2ZW5pciBOZXh0IENvbmRlbnNlZCxJbXBhY3QiLCAyLCAxMjUyfSwKKyAgICB7MHhhYTNlMDgyYywgTCJLaW5nc29mdC1QaG9uZXRpYyIsCisgICAgIEwiU1RJWFZhcmlhbnRzLFNUSVhTaXplT25lU3ltLEFwcGxlIEJyYWlsbGUiLCAwLCAxMjUyfSwKKyAgICB7MHhhYTZiY2FiZSwgTCJIYXJsb3dTb2xpZEl0YWxpYyIsCisgICAgIEwiU1RJWE5vblVuaWNvZGUsQXZlbmlyIE1lZGl1bSxBdmVuaXIgTmV4dCBNZWRpdW0sQXJpYWwgVW5pY29kZSBNUyIsIDAsCisgICAgIDEyNTJ9LAorICAgIHsweGFkZTUzMzdjLCBMIk1TVUlHb3RoaWMiLCBMIkFyaWFsIFVuaWNvZGUgTVMsQXBwbGUgU0QgR290aGljIE5lbyIsIDAsCisgICAgIDEyNTJ9LAorICAgIHsweGIwOGRkOTQxLCBMIldpZGVMYXRpbiIsCisgICAgIEwiTWFyaW9uLFBhcHlydXMsTmFudW0gUGVuIFNjcmlwdCxaYXBmIERpbmdiYXRzLERhbWFzY3VzLFphcGZpbm8sQXJpYWwgIgorICAgICBMIkJsYWNrLFNUSGVpdGkiLAorICAgICAyLCAxMjUyfSwKKyAgICB7MHhiMTI3NjVlMCwgTCJJVENMZWdhY3lTYW5zU3RkQm9vayIsCisgICAgIEwiTGFzdFJlc29ydCwuSGVsdmV0aWNhIE5ldWUgRGVzayBVSSxBcmlhbCBVbmljb2RlIE1TLFBhbGF0aW5vIiwgMCwgMTI1Mn0sCisgICAgezB4YjIwN2YwNWQsIEwiUG9vclJpY2hhcmQiLCBMIk5vdGV3b3J0aHksQXZlbmlyIE5leHQgQ29uZGVuc2VkLEltcGFjdCIsIDIsCisgICAgIDEyNTJ9LAorICAgIHsweGIzYmM0OTJmLCBMIkp1aWNlSVRDLVJlZ3VsYXIiLCBMIk5hZGVlbSxBbCBCYXlhbixTVElYTm9uVW5pY29kZSIsIDAsCisgICAgIDEyNTJ9LAorICAgIHsweGI1NTQ1Mzk5LCBMIk1hcmxldHQiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCA0LCA0Mn0sCisgICAgezB4YjVkZDFlYmIsIEwiQnJpdGFubmljQm9sZCIsCisgICAgIEwiRGFtYXNjdXMsU1RJWE5vblVuaWNvZGUsQXZlbmlyIE5leHQgQ29uZGVuc2VkIEhlYXZ5LFBUIFNhbnMiLCAwLCAxMjUyfSwKKyAgICB7MHhiNjk5YzFjNSwgTCJMdWNpZGFDYWxsaWdyYXBoeS1JdGFsaWMiLCBMIlNUSGVpdGksQXJpYWwgQmxhY2siLCAwLCAxMjUyfSwKKyAgICB7MHhiNzI1ZDYyOSwgTCJUaW1lc05ld1JvbWFuIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMiwKKyAgICAgMTI1Mn0sCisgICAgezB4YjdlYWViZWIsIEwiQWRvYmVIZWl0aVN0ZFIiLCBMIkhlaXRpIFRDLFNUSGVpdGkiLCAwLCA5MzZ9LAorICAgIHsweGJkMjljNDg2LCBMIkJlcmxpblNhbnNGQkRlbWktQm9sZCIsCisgICAgIEwiQW1lcmljYW4gVHlwZXdyaXRlcixBdmVuaXIgTmV4dCBDb25kZW5zZWQgSGVhdnkiLCAwLCAxMjUyfSwKKyAgICB7MHhiZThhOGRiNCwgTCJCb29rc2hlbGZTeW1ib2xTZXZlbiIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweGMxNmMwMTE4LCBMIkFkb2JlSGVicmV3IiwKKyAgICAgTCIuSGVsdmV0aWNhIE5ldWUgRGVzayBVSSxQYWxhdGlubyxBbWVyaWNhbiBUeXBld3JpdGVyIiwgMCwgMTI1Mn0sCisgICAgezB4YzMxOGIwYWYsIEwiTXlyaWFkUHJvTGlnaHQiLCBMIlBhbGF0aW5vLEJhc2tlcnZpbGxlLE1hcmlvbiIsIDAsIDEyNTJ9LAorICAgIHsweGM2NWU1NjU5LCBMIkNhbWJyaWFNYXRoIiwgTCJBcmlhbCBVbmljb2RlIE1TIiwgMiwgMTI1Mn0sCisgICAgezB4Yzc1YzhmMDUsIEwiTHVjaWRhQ29uc29sZSIsIEwiQ291cmllciBOZXcsTWVubG8sQW5kYWxlIE1vbm8iLCAxLCAxMjUyfSwKKyAgICB7MHhjYTdjMzVkNiwgTCJDYWxpYnJpIiwgTCJBcHBsZSBTeW1ib2xzLEhlYWRMaW5lQSIsIDAsIDEyNTJ9LAorICAgIHsweGNiMDUzZjUzLCBMIk1pY3Jvc29mdFlhSGVpIiwgTCJBcmlhbCBVbmljb2RlIE1TIiwgMCwgOTM2fSwKKyAgICB7MHhjYjcxOTBmOSwgTCJNYWduZXRvLUJvbGQiLCBMIkx1Y2lkYSBHcmFuZGUiLCAwLCAxMjUyfSwKKyAgICB7MHhjY2EwMGNjNSwgTCJTeXN0ZW0iLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLCAxMjUyfSwKKyAgICB7MHhjY2FkNmY3NiwgTCJKb2tlcm1hbi1SZWd1bGFyIiwgTCJMdWNpZGEgR3JhbmRlIiwgMCwgMTI1Mn0sCisgICAgezB4Y2NjNTgxOGMsIEwiRXVyb1NpZ24iLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLCAxMjUyfSwKKyAgICB7MHhjZjNkNzIzNCwgTCJMdWNpZGFIYW5kd3JpdGluZy1JdGFsaWMiLAorICAgICBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLCAxMjUyfSwKKyAgICB7MHhjZjdiOGZkYiwgTCJNaW5pb25Qcm8iLAorICAgICBMIkJlbGwgTVQsQ29yYmVsLFRpbWVzIE5ldyBSb21hbixDYW1icmlhLEJlcmxpbiBTYW5zIEZCIiwgMCwgMTI1Mn0sCisgICAgezB4Y2ZlNTc1NWYsIEwiU2ltaGVpIiwgTCJTVEhlaXRpLEhlaXRpIFRDLFNURmFuZ3NvbmciLCAxLCA5MzZ9LAorICAgIHsweGQwMTFmNGVlLCBMIk1TUEdvdGhpYyIsIEwiQXJpYWwgVW5pY29kZSBNUyxBcHBsZSBTRCBHb3RoaWMgTmVvIiwgMCwKKyAgICAgMTI1Mn0sCisgICAgezB4ZDA2MGU3ZWYsIEwiVml2YWxkaSIsCisgICAgIEwiU1RJWE5vblVuaWNvZGUsQXJpYWwgVW5pY29kZSBNUyxBdmVuaXIgTWVkaXVtLEF2ZW5pciBOZXh0IE1lZGl1bSIsIDgsCisgICAgIDEyNTJ9LAorICAgIHsweGQwN2VkZWMxLCBMIkZyYW5rbGluR290aGljLU1lZGl1bSIsIEwiSW1wYWN0LEFyaWFsIE5hcnJvdyIsIDAsIDEyNTJ9LAorICAgIHsweGQxMDcyNDNmLCBMIlNpbVN1biIsIEwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwgMCwgOTM2fSwKKyAgICB7MHhkMTg4MTU2MiwgTCJBcmlhbE5hcnJvdyIsIEwiUFQgU2FucyBOYXJyb3csQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LAorICAgIHsweGQyMmI3ZGNlLCBMIkJvZG9uaU1UUG9zdGVyQ29tcHJlc3NlZCIsCisgICAgIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LAorICAgIHsweGQyMmJmYTYwLCBMIkNvbWljU2Fuc01TIiwKKyAgICAgTCJEYW1hc2N1cyxHZW9yZ2lhLC5IZWx2ZXRpY2EgTmV1ZSBEZXNrIFVJLEx1Y2lkYSBHcmFuZGUsQXJpYWwgVW5pY29kZSBNUyIsCisgICAgIDgsIDEyNTJ9LAorICAgIHsweGQzYmQwZTM1LCBMIkJhdWhhdXM5MyIsCisgICAgIEwiU1RJWE5vblVuaWNvZGUsQXJpYWwgVW5pY29kZSBNUyxBdmVuaXIgTmV4dCxBdmVuaXIiLCAwLCAxMjUyfSwKKyAgICB7MHhkNDI5ZWU3YSwgTCJTVEZhbmdzb25nIiwgTCJTb25ndGkgU0MsQXJpYWwgVW5pY29kZSBNUyIsIDAsIDkzNn0sCisgICAgezB4ZDY2NzljMTIsIEwiQmVybmFyZE1UQ29uZGVuc2VkIiwKKyAgICAgTCJJbXBhY3QsQXZlbmlyIE5leHQgQ29uZGVuc2VkIERlbWkgQm9sZCIsIDAsIDEyNTJ9LAorICAgIHsweGQ4ZThhMDI3LCBMIkx1Y2lkYVNhbnMiLAorICAgICBMIkFyaWFsIE5hcnJvdyxLaG1lciBNTixLb2tvbm9yLERhbWFzY3VzLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlICIKKyAgICAgTCJTeW1ib2xzIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4ZDlmZTc3NjEsIEwiSGlnaFRvd2VyVGV4dC1SZWciLAorICAgICBMIlNUSVhHZW5lcmFsLC5IZWx2ZXRpY2EgTmV1ZSBEZXNrIFVJLFRyZWJ1Y2hldCBNUyIsIDIsIDEyNTJ9LAorICAgIHsweGRhN2U1NTFlLCBMIlNUU29uZyIsIEwiQXJpYWwgVW5pY29kZSBNUyIsIDAsIDkzNn0sCisgICAgezB4ZGFhNjg0MmQsIEwiU1RaaG9uZ3NvbmciLCBMIlNURmFuZ3NvbmcsU29uZ3RpIFNDLFNUU29uZyIsIDAsIDkzNn0sCisgICAgezB4ZGFhYWI5M2YsIEwiU1RGYW5nc29uZyIsIEwiU29uZ3RpIFNDLEFyaWFsIFVuaWNvZGUgTVMiLCAwLCA5MzZ9LAorICAgIHsweGRhZWIwNzEzLCBMIlNUU29uZyIsIEwiU29uZ3RpIFNDLEFyaWFsIFVuaWNvZGUgTVMiLCAwLCA5MzZ9LAorICAgIHsweGRhZmVkYmVmLCBMIlNUQ2FpeXVuIiwgTCJLYWl0aSBTQyxTb25ndGkgU0MsU1RIZWl0aSIsIDAsIDkzNn0sCisgICAgezB4ZGIwMGEzZDksIEwiQnJvYWR3YXkiLAorICAgICBMIlBhcHlydXMsU1RJWE5vblVuaWNvZGUsQXJpYWwgQmxhY2ssQXZlbmlyIE5leHQgSGVhdnksSGVpdGkgVEMiLCAwLCAxMjUyfSwKKyAgICB7MHhkYjFmNWFkNCwgTCJTVFhpbndlaSIsIEwiS2FpdGkgU0MsU29uZ3RpIFNDLFNUSGVpdGkiLCAwLCA5MzZ9LAorICAgIHsweGRiMzI2ZTdmLCBMIlNUS2FpdGkiLCBMIlNvbmd0aSBTQyxBcmlhbCBVbmljb2RlIE1TIiwgMCwgOTM2fSwKKyAgICB7MHhkYjY5NTk1YSwgTCJTVEh1cG8iLCBMIkthaXRpIFNDLFNvbmd0aSBTQyxTVEhlaXRpIiwgMCwgOTM2fSwKKyAgICB7MHhkYmEwMDgyYywgTCJTVFhpaGVpIiwgTCJTb25ndGkgU0MsQXJpYWwgVW5pY29kZSBNUyIsIDAsIDkzNn0sCisgICAgezB4ZGJkMGFiMTgsIEwiU1RYaW5na2FpIiwgTCJLYWl0aSBTQyxTb25ndGkgU0MiLCAwLCA5MzZ9LAorICAgIHsweGRjMWE3ZGIxLCBMIlNUTGl0aSIsIEwiS2FpdGkgU0MsU29uZ3RpIFNDIiwgMCwgOTM2fSwKKyAgICB7MHhkYzMzMDc1ZiwgTCJLcmlzdGVuSVRDLVJlZ3VsYXIiLAorICAgICBMIlNUSVhOb25Vbmljb2RlLERhbWFzY3VzLFNvbmd0aSBTQyxTVFNvbmciLCA4LCAxMjUyfSwKKyAgICB7MHhkY2M3MDA5YywgTCJIYXJyaW5ndG9uIiwKKyAgICAgTCJTVElYTm9uVW5pY29kZSxBdmVuaXIgTmV4dCBDb25kZW5zZWQgSGVhdnksTm90ZXdvcnRoeSIsIDAsIDEyNTJ9LAorICAgIHsweGRkNzEyNDY2LCBMIkFyaWFsQmxhY2siLCBMIkdlZXphIFBybyxEYW1hc2N1cyxTb25ndGkgU0MsU1RTb25nIiwgMCwKKyAgICAgMTI1Mn0sCisgICAgezB4ZGRlODdiM2UsIEwiSW1wYWN0IiwgTCJBcmlhbCBOYXJyb3csTWFyaW9uIiwgMCwgMTI1Mn0sCisgICAgezB4ZGY2OWZiMzIsIEwiU25hcElUQyIsCisgICAgIEwiQXJpYWwgTmFycm93LFBUIFNhbnMgTmFycm93LE1hcmlvbixTVEhlaXRpLEFyaWFsIEJsYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4ZGY4YjI1ZTgsIEwiQ2VudHVyeUdvdGhpYyIsCisgICAgIEwiRGFtYXNjdXMsQW5kYWxlIE1vbm8sU29uZ3RpIFNDLEFyaWFsIFVuaWNvZGUgTVMiLCAwLCAxMjUyfSwKKyAgICB7MHhlMGY3MDVjMCwgTCJLcmlzdGVuSVRDIiwgTCJTb25ndGkgU0MsU1RTb25nIiwgOCwgMTI1Mn0sCisgICAgezB4ZTE0Mjc1NzMsIEwiUmFhdmkiLAorICAgICBMIkRhbWFzY3VzLFNUSVhOb25Vbmljb2RlLE1hcmlvbixQYXB5cnVzLEF2ZW5pciBOZXh0IENvbmRlbnNlZCAiCisgICAgIEwiSGVhdnksQW1lcmljYW4gVHlwZXdyaXRlciIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweGUyY2VhMGNiLCBMIk1hZ25ldG8iLAorICAgICBMIlNUSVhOb25Vbmljb2RlLERhbWFzY3VzLEdlZXphIFBybyxMdWNpZGEgR3JhbmRlLEdlb3JnaWEsSGVpdGkgVEMiLCAwLAorICAgICAxMjUyfSwKKyAgICB7MHhlMzZhOWUxNywgTCJSYXZpZSIsIEwiU1RIZWl0aSxBcmlhbCBCbGFjayIsIDAsIDEyNTJ9LAorICAgIHsweGU0MzNmOGUyLCBMIlBhcmNobWVudCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDgsIDEyNTJ9LAorICAgIHsweGU0M2RmZjRhLCBMIldpbmdkaW5ncyIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDQsIDQyfSwKKyAgICB7MHhlNGUyYzQwNSwgTCJNVEV4dHJhIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgNiwgNDJ9LAorICAgIHsweGU2MThjYzM1LCBMIkluZm9ybWFsUm9tYW4iLCBMIkFyaWFsIE5hcnJvdyIsIDgsIDEyNTJ9LAorICAgIHsweGU2YzI3ZmZjLCBMIk1pc3RyYWwiLCBMIkFwcGxlIFN5bWJvbHMiLCA4LCAxMjUyfSwKKyAgICB7MHhlN2ViZjRiOSwgTCJDb3VyaWVyIiwgTCJDb3VyaWVyIE5ldyIsIDAsIDEyNTJ9LAorICAgIHsweGU4YmM0YTlkLCBMIk1TUmVmZXJlbmNlU3BlY2lhbHR5IiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4ZTkwZmIwMTMsIEwiVGVtcHVzU2Fuc0lUQyIsCisgICAgIEwiU1RJWE5vblVuaWNvZGUsTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXZlbmlyIExpZ2h0IiwgMCwgMTI1Mn0sCisgICAgezB4ZWM2MzdiNDIsIEwiQ29uc29sYXMiLAorICAgICBMIkFSIFBMIFVLYWkgQ04sQVIgUEwgVUthaSBISyxBUiBQTCBVS2FpIFRXLEFSIFBMIFVLYWkgVFcgTUJFLEFSIFBMIFVNaW5nICIKKyAgICAgTCJDTixBUiBQTCBVTWluZyBISyxNaWNyb3NvZnQgU2FucyBTZXJpZixUYWhvbWEiLAorICAgICAxLCAxMjUyfSwKKyAgICB7MHhlZDNhNjgzYiwgTCJTVFhpbndlaSIsIEwiS2FpdGkgU0MsU29uZ3RpIFNDLCIsIDAsIDkzNn0sCisgICAgezB4ZWYyNjRjZDEsIEwiTHVjaWRhSGFuZHdyaXRpbmciLAorICAgICBMIkFyaWFsIE5hcnJvdyxBdmVuaXIgTmV4dCBDb25kZW5zZWQgRGVtaSBCb2xkLEF2ZW5pciBOZXh0ICIKKyAgICAgTCJDb25kZW5zZWQsQXZlbmlyIE5leHQgQ29uZGVuc2VkIE1lZGl1bSxTVEhlaXRpLEFyaWFsIEJsYWNrIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4ZjA4NmJjYTIsIEwiQmFza2VydmlsbGVPbGRGYWNlIiwKKyAgICAgTCJTVElYTm9uVW5pY29kZSxBdmVuaXIgTmV4dCBDb25kZW5zZWQgSGVhdnksUFQgU2FucyIsIDAsIDEyNTJ9LAorICAgIHsweGYxMDI4MDMwLCBMIk1hbmdhbCIsCisgICAgIEwiQXJpYWwgVW5pY29kZSBNUyxNaWNyb3NvZnQgU2FucyBTZXJpZixBcmlhbCBOYXJyb3csVGFob21hIiwgMiwgMTI1Mn0sCisgICAgezB4ZjFkYTdlYjksIEwiU2hvd2NhcmRHb3RoaWMiLAorICAgICBMIlBhcHlydXMsQXJpYWwgVW5pY29kZSBNUyxHZW9yZ2lhLEFtZXJpY2FuIFR5cGV3cml0ZXIiLCAwLCAxMjUyfSwKKyAgICB7MHhmMjEwZjA2YSwgTCJBcmlhbE1UIiwKKyAgICAgTCJBcmlhbCBVbmljb2RlIE1TLEFyaWFsIE5hcnJvdyxTVElYTm9uVW5pY29kZSxEYW1hc2N1cyxBdmVuaXIgTmV4dCAiCisgICAgIEwiQ29uZGVuc2VkIERlbWkgQm9sZCxBdmVuaXIgTmV4dCBDb25kZW5zZWQgTWVkaXVtLEF2ZW5pciBOZXh0IENvbmRlbnNlZCIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweGY0NzdmMTZhLCBMIkxhdGhhIiwKKyAgICAgTCJBcmlhbCBOYXJyb3csRGFtYXNjdXMsU1RJWE5vblVuaWNvZGUsQW1lcmljYW4gVHlwZXdyaXRlciIsIDAsIDEyNTJ9LAorICAgIHsweGY2MTZmM2RkLCBMIkxpU3UiLCBMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsIDEsIDkzNn0sCisgICAgezB4ZmE0NzlhYTYsIEwiTWljcm9zb2Z0WWFIZWkiLCBMIkFyaWFsIFVuaWNvZGUgTVMiLCAwLCA5MzZ9LAorICAgIHsweGZjZDE5Njk3LCBMIkJvb2ttYW5PbGRTdHlsZSIsCisgICAgIEwiR2VlemEgUHJvLERhbWFzY3VzLEFuZGFsZSBNb25vLFNvbmd0aSBTQyxBcmlhbCBVbmljb2RlIE1TIiwgMCwgMTI1Mn0sCisgICAgezB4ZmUyMDlhODIsIEwiTHVjaWRhQ2FsbGlncmFwaHkiLAorICAgICBMIktva29ub3IsRGFtYXNjdXMsU1RJWE5vblVuaWNvZGUsU1RIZWl0aSxBcmlhbCBCbGFjayIsIDAsIDEyNTJ9LAorICAgIHsweGZlZjEzNWY4LCBMIkFkb2JlSGVpdGlTdGQtUmVndWxhciIsIEwiSGVpdGkgVEMsU1RIZWl0aSIsIDAsIDkzNn0sCit9OworI2VsaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQU5EUk9JRF8KK2NvbnN0IEZHQVNfRm9udEluZm8gZ19YRkFGb250c01hcFtdID0geworICAgIHsweDAxZDVkMzNlLCBMIlNpbVN1biIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sCisgICAgezB4MDFlNGYxMDIsIEwiWW91WXVhbiIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDkzNn0sCisgICAgezB4MDMwNTQ5ZGMsIEwiTGlTdSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDkzNn0sCisgICAgezB4MDMyZWRkNDQsIEwiU2ltaGVpIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMSwgOTM2fSwKKyAgICB7MHgwM2VhYzZmYywgTCJQb29yUmljaGFyZC1SZWd1bGFyIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2ssRHJvaWQgQXJhYmljICIKKyAgICAgTCJOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljIiwKKyAgICAgMiwgMTI1Mn0sCisgICAgezB4MDNlZDkwZTYsIEwiTmluYSIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4MDc3YjU2YjMsIEwiS2luZ3NvZnRQaG9uZXRpY1BsYWluIiwKKyAgICAgTCJEcm9pZCBTYW5zIFRoYWksRHJvaWQgU2FucyBBcm1lbmlhbixEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyAiCisgICAgIEwiRXRoaW9waWMsRHJvaWQgU2FucyBGYWxsYmFjayIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweDA3OGVkNTI0LCBMIk1pY3Jvc29mdFNhbnNTZXJpZiIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweDA4OWIxOGE5LCBMIkFyaWFsIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4MGIyY2FkNzIsIEwiTW9ub3R5cGVDb3JzaXZhIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA4LCAxMjUyfSwKKyAgICB7MHgwYmIwMDNlNywgTCJLYXJ0aWthIiwKKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyAiCisgICAgIEwiTW9ubyIsCisgICAgIDIsIDEyNTJ9LAorICAgIHsweDBiYjQ2OWRmLCBMIlZpbmVySGFuZElUQyIsCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgOCwgMTI1Mn0sCisgICAgezB4MGJjMWE4NTEsIEwiU2Vnb2VVSSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweDBjMTEyZWJkLCBMIktvenVrYUdvdGhpY1Byby1WSU0iLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweDBjZmNiOWMxLCBMIkFkb2JlVGhhaSIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgODQ3fSwKKyAgICB7MHgwZTdkZTBmOSwgTCJQbGF5YmlsbCIsCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgIgorICAgICBMIk1vbm8iLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHgwZWZmNDdjMywgTCJTVEh1cG8iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAorICAgIHsweDEwN2FkMzc0LCBMIkNvbnN0YW50aWEiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LAorICAgIHsweDEyMTk0YzJkLCBMIkt1bnN0bGVyU2NyaXB0IiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA4LCAxMjUyfSwKKyAgICB7MHgxMzVlZjZhMSwgTCJNaW5pb25Qcm9TbUJkIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHgxNThjNDA0OSwgTCJHYXJhbW9uZCIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sCisgICAgezB4MTYwZWNiMjQsIEwiU1RaaG9uZ3NvbmciLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAorICAgIHsweDE2MWVkMDdlLCBMIk1TR290aGljIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMSwgMTI1Mn0sCisgICAgezB4MTcxZDFlZDEsIEwiU25hcElUQy1SZWd1bGFyIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHgxOGQxMTg4ZiwgTCJDYW1icmlhIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sCisgICAgezB4MThlYWYzNTAsIEwiQXJpYWxVbmljb2RlTVMiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAorICAgIHsweDFhOTJkMTE1LCBMIk1pbmdMaVUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwKKyAgICB7MHgxY2MyMTdjNiwgTCJUcmVidWNoZXRNUyIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4MWQ2NDk1OTYsIEwiQmFzZW1pY1RpbWVzIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHgxZTM0ZWU2MCwgTCJCZWxsTVQiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LAorICAgIHsweDFlYjM2OTQ1LCBMIkNvb3BlckJsYWNrIiwKKyAgICAgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwKKyAgICB7MHgxZWY3Nzg3ZCwgTCJCYXRhbmdDaGUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwKKyAgICB7MHgyMGIzYmQzYSwgTCJCcnVzaFNjcmlwdE1UIiwgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyIsIDgsCisgICAgIDEyNTJ9LAorICAgIHsweDIyMDg3N2FhLCBMIkNhbmRhcmEiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweDIyMTM1MDA3LCBMIkZyZWVzdHlsZVNjcmlwdC1SZWd1bGFyIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA4LCAxMjUyfSwKKyAgICB7MHgyNTEwNTljMywgTCJDaGlsbGVyIiwKKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxSb2JvdG8sRHJvaWQgU2VyaWYiLCAwLCAxMjUyfSwKKyAgICB7MHgyNWJlZDZkZCwgTCJNU1JlZmVyZW5jZVNhbnNTZXJpZiIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweDI4MTU0YzgxLCBMIlBhcmNobWVudC1SZWd1bGFyIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA4LCAxMjUyfSwKKyAgICB7MHgyOTcxMWViOSwgTCJTVExpdGkiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAorICAgIHsweDJiMTk5M2I0LCBMIkJhc2VtaWMiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweDJiMzE2MzM5LCBMIk5pYWdhcmFTb2xpZC1SZWciLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweDJjMTQ3NTI5LCBMIkZvb3RsaWdodE1UTGlnaHQiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweDJjMTk4OTI4LCBMIkhhcmxvd1NvbGlkIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHgyYzZhYzZiMiwgTCJMdWNpZGFCcmlnaHQiLAorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIFNlcmlmLFJvYm90byIsIDIsIDEyNTJ9LAorICAgIHsweDJjOWYzOGUyLCBMIktvenVrYU1pbmNob1Byby1WSVIiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweDJkNWE0N2IwLCBMIlNUQ2FpeXVuIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKKyAgICB7MHgyZGVmMjZiZiwgTCJCZXJuYXJkTVQtQ29uZGVuc2VkIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHgyZmQ4OTMwYiwgTCJLb3p1a2FNaW5jaG9QcjZOUiIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4MzExNTUyNWEsIEwiRmFuZ1NvbmdfR0IyMzEyIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4MzEzMjc4MTcsIEwiTXlyaWFkUHJvIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHgzMjI0NDk3NSwgTCJIZWx2ZXRpY2EiLAorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIFNlcmlmLFJvYm90byIsIDAsIDEyNTJ9LAorICAgIHsweDMyYWM5OTVjLCBMIlRlcm1pbmFsIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHgzMzhkNjQ4YSwgTCJOaWFnYXJhRW5ncmF2ZWQtUmVnIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHgzM2JiNjVmMiwgTCJTeWxmYWVuIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwKKyAgICB7MHgzNDAyYzMwZSwgTCJNU1BNaW5jaG8iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwKKyAgICB7MHgzNDEyYmYzMSwgTCJTaW1TdW4tUFVBIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKKyAgICB7MHgzNmViMzliOSwgTCJCZXJsaW5TYW5zRkIiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweDM2ZjQyMDU1LCBMIlVuaXZlcnNBVFQiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwgMCwgMTI1Mn0sCisgICAgezB4Mzg2NGM0ZjYsIEwiSGlnaFRvd2VyVGV4dCIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sCisgICAgezB4M2EyNTdkMDMsIEwiRmFuZ1NvbmdfR0IyMzEyIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4M2NkYWU2NjgsIEwiRnJlZXN0eWxlU2NyaXB0IiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA4LCAxMjUyfSwKKyAgICB7MHgzZDU1YWVkNywgTCJKb2tlcm1hbiIsCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4M2Q1YjQzODUsIEwiUE1pbmdMaVUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwKKyAgICB7MHgzZDliNzY2OSwgTCJFc3RyYW5nZWxvRWRlc3NhIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHgzZTUzMmQ3NCwgTCJGcmFua2xpbkdvdGhpY01lZGl1bSIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4M2U2YWEzMmQsIEwiTlNpbVN1biIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDkzNn0sCisgICAgezB4M2Y2YzM2YTgsIEwiR2F1dGFtaSIsCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgIgorICAgICBMIk1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweDNmZjMyNjYyLCBMIkNoaWxsZXItUmVndWxhciIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4NDA5ZGUzMTIsIEwiTW9kZXJuTm8uMjAiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LAorICAgIHsweDQxNDQzYzVlLCBMIkdlb3JnaWEiLAorICAgICBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LAorICAgIHsweDQxNjBhZGU1LCBMIkJlbGxHb3RoaWNTdGRCbGFjayIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4NDIxOTc2YzQsIEwiTW9kZXJuLVJlZ3VsYXIiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LAorICAgIHsweDQyMmE3MjUyLCBMIlN0ZW5jaWwiLAorICAgICBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweDQyYzg1NTRmLCBMIkZpeGVkc3lzIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHg0MzVjYjQxZCwgTCJSb21hbiIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4NDc4ODIzODMsIEwiQ291cmllck5ldyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDEyNTJ9LAorICAgIHsweDQ4MGEyMzM4LCBMIkJlcmxpblNhbnNGQkRlbWkiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweDQ4MGJmN2E0LCBMIkNvdXJpZXJTdGQiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHg0ODFhZDZlZCwgTCJWbGFkaW1pclNjcmlwdCIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgOCwgMTI1Mn0sCisgICAgezB4NDkxMTU3N2EsIEwiWW91WXVhbiIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDkzNn0sCisgICAgezB4NGE3ODhkNzIsIEwiU1RYaW5na2FpIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKKyAgICB7MHg0YmY4ODU2NiwgTCJTZWdvZUNvbmRlbnNlZCIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4NGNjZjUxYTQsIEwiQmVybGluU2Fuc0ZCLVJlZyIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4NGVhOTY3Y2UsIEwiR3VsaW1DaGUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwKKyAgICB7MHg0ZjY4YmQ3OSwgTCJMZXR0ZXJHb3RoaWNTdGQiLAorICAgICBMIkRyb2lkIFNhbnMgTW9ubyxEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTYW5zICIKKyAgICAgTCJNb25vLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgRmFsbGJhY2siLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHg1MWEwZDBlNiwgTCJLb3p1a2FHb3RoaWNQcjZOTSIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4NTMxYjNkZWEsIEwiQmFzZW1pY1N5bWJvbCIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4NTMzM2ZkMzksIEwiQ2FsaWZvcm5pYW5GQi1SZWciLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LAorICAgIHsweDUzNTYxYTU0LCBMIkZaWVRLLS1HQksxLTAiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAorICAgIHsweDU1ZTBkZGU2LCBMIkx1Y2lkYVNhbnNUeXBld3JpdGVyIiwKKyAgICAgTCJEcm9pZCBTYW5zIE1vbm8sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMiLCAwLCAxMjUyfSwKKyAgICB7MHg1NzRkNGQzZCwgTCJBZG9iZUFyYWJpYyIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4NTc5MmU3NTksIEwiU1RLYWl0aSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sCisgICAgezB4NTkyMTk3OGUsIEwiTHVjaWRhU2Fuc1VuaWNvZGUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHg1OTRlMmRhNCwgTCJWcmluZGEiLAorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLFJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zICIKKyAgICAgTCJNb25vIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4NTliYWE5YTIsIEwiS2FpVGlfR0IyMzEyIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4NWNmZWRmNGYsIEwiQmFza09sZEZhY2UiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweDVmOTc5MjFjLCBMIkFkb2JlTXl1bmdqb1N0ZE0iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAorICAgIHsweDVmZWZiZmFkLCBMIkJhdGFuZyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LAorICAgIHsweDYwNTM0MmI5LCBMIkRvdHVtQ2hlIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMSwgMTI1Mn0sCisgICAgezB4NjA4YzVmOWEsIEwiS2FpVGlfR0IyMzEyIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKKyAgICB7MHg2MWVmZDBkMSwgTCJNYXR1cmFNVFNjcmlwdENhcGl0YWxzIiwKKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyAiCisgICAgIEwiTW9ubyIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweDYyNjYwOGE5LCBMIk1WQm9saSIsCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgIgorICAgICBMIk1vbm8iLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHg2MzA1MDFhMywgTCJTbWFsbEZvbnRzIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHg2NWQwZTJhOSwgTCJGWllUSy0tR0JLMS0wIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKKyAgICB7MHg2NjlmMjllMSwgTCJGWlNUSy0tR0JLMS0wIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKKyAgICB7MHg2NzNhOWU1ZiwgTCJUdW5nYSIsCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgIgorICAgICBMIk1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweDY5MWFhNGNlLCBMIk5pYWdhcmFTb2xpZCIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4Njk2MjU5YjcsIEwiQ29yYmVsIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHg2OTZlZTliZSwgTCJTVFhpaGVpIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKKyAgICB7MHg2YzU5Y2Y2OSwgTCJEb3R1bSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweDcwN2ZhNTYxLCBMIkd1bmdzdWgiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwKKyAgICB7MHg3MTQxNmJiMiwgTCJaV0Fkb2JlRiIsCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgQXJtZW5pYW4sRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTYW5zICIKKyAgICAgTCJHZW9yZ2lhbixEcm9pZCBTYW5zIEhlYnJldyxEcm9pZCBTYW5zIFRoYWkiLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHg3MWI0MTgwMSwgTCJWZXJkYW5hIiwKKyAgICAgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHg3M2YyNWU0YywgTCJQYWxhdGlub0xpbm90eXBlIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4NzNmNGQxOWYsIEwiTmlhZ2FyYUVuZ3JhdmVkIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHg3NDAwMTY5NCwgTCJNeXJpYWRQcm9CbGFjayIsIEwiQm9vayBBbnRpcXVhLENvbnN0YW50aWEsRG90dW0sR2VvcmdpYSIsIDAsCisgICAgIDEyNTJ9LAorICAgIHsweDc0YjE0ZDhmLCBMIkhhZXR0ZW5zY2h3ZWlsZXIiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweDc0Y2I0NGVlLCBMIk5TaW1TdW4iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCA5MzZ9LAorICAgIHsweDc2YjRkN2ZmLCBMIlNocnV0aSIsCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgIgorICAgICBMIk1vbm8iLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHg3ODhiMzUzMywgTCJXZWJkaW5ncyIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgNiwgNDJ9LAorICAgIHsweDc5N2RkZTk5LCBMIk1TU2VyaWYiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweDdhMGY5ZTllLCBMIk1TTWluY2hvIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMSwgMTI1Mn0sCisgICAgezB4N2I0MzljYWYsIEwiT2xkRW5nbGlzaFRleHRNVCIsCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4ODIxM2E0MzMsIEwiTHVjaWRhU2Fucy1UeXBld3JpdGVyIiwKKyAgICAgTCJEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHg4MmZlYzkyOSwgTCJBZG9iZVNvbmdTdGRMIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKKyAgICB7MHg4MzU4MTgyNSwgTCJNb2Rlcm4iLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweDgzNWEyODIzLCBMIkFsZ2VyaWFuIiwKKyAgICAgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHg4M2RhYjlmNSwgTCJTY3JpcHQiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweDg0N2I1NmRhLCBMIlRhaG9tYSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweDhhNzgzY2IyLCBMIlNpbVN1bi1QVUEiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHg4YjVjYWMwZSwgTCJPbnl4IiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHg4YzZhNDk5ZSwgTCJHdWxpbSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweDhlMGFmNzkwLCBMIkp1aWNlSVRDIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHg4ZThkNDNiMiwgTCJDZW50YXVyIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwKKyAgICB7MHg4ZWU0ZGNjYSwgTCJCb29rc2hlbGZTeW1ib2w3IiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHg5MDc5NDgwMCwgTCJCZWxsR290aGljU3RkTGlnaHQiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweDkwOWI1MTZhLCBMIkNlbnR1cnkiLAorICAgICBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LAorICAgIHsweDkyYWUzNzBkLCBMIk1TT3V0bG9vayIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgNCwgNDJ9LAorICAgIHsweDkzYzlmYmYxLCBMIkx1Y2lkYUZheCIsCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgIgorICAgICBMIk1vbm8iLAorICAgICAyLCAxMjUyfSwKKyAgICB7MHg5NTY1MDg1ZSwgTCJCb29rQW50aXF1YSIsCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sCisgICAgezB4OTg1NmQ5NWQsIEwiQWRvYmVNaW5nU3RkTCIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDk0OX0sCisgICAgezB4OWJiYWRkNmIsIEwiQ29sb25uYU1UIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHg5Y2JkMTZhNCwgTCJTaG93Y2FyZEdvdGhpYy1SZWciLAorICAgICBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjIiwgMCwgMTI1Mn0sCisgICAgezB4OWQ3MzAwOGUsIEwiTVNTYW5zU2VyaWYiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweGEwNjA3ZGIxLCBMIkd1bmdzdWhDaGUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwKKyAgICB7MHhhMGJjZjZhMSwgTCJMYXRpbldpZGUiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LAorICAgIHsweGExNDI5YjM2LCBMIlN5bWJvbCIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgNiwgNDJ9LAorICAgIHsweGExZmE1YWJjLCBMIldpbmdkaW5nczIiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDYsIDQyfSwKKyAgICB7MHhhMWZhNWFiZCwgTCJXaW5nZGluZ3MzIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA2LCA0Mn0sCisgICAgezB4YTQyN2JhZDQsIEwiSW5mb3JtYWxSb21hbi1SZWd1bGFyIiwKKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyIsIDgsIDEyNTJ9LAorICAgIHsweGE4YjkyZWNlLCBMIkZaU1RLLS1HQksxLTAiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAorICAgIHsweGE4ZDgzZWNlLCBMIkNhbGlmb3JuaWFuRkIiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LAorICAgIHsweGFhM2UwODJjLCBMIktpbmdzb2Z0LVBob25ldGljIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHhhYTZiY2FiZSwgTCJIYXJsb3dTb2xpZEl0YWxpYyIsCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4YWRlNTMzN2MsIEwiTVNVSUdvdGhpYyIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4YjA4ZGQ5NDEsIEwiV2lkZUxhdGluIiwKKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyAiCisgICAgIEwiTW9ubyIsCisgICAgIDIsIDEyNTJ9LAorICAgIHsweGIyMDdmMDVkLCBMIlBvb3JSaWNoYXJkIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwKKyAgICB7MHhiM2JjNDkyZiwgTCJKdWljZUlUQy1SZWd1bGFyIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHhiNTU0NTM5OSwgTCJNYXJsZXR0IiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA0LCA0Mn0sCisgICAgezB4YjVkZDFlYmIsIEwiQnJpdGFubmljQm9sZCIsIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMiLCAwLAorICAgICAxMjUyfSwKKyAgICB7MHhiNjk5YzFjNSwgTCJMdWNpZGFDYWxsaWdyYXBoeS1JdGFsaWMiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweGI3MjVkNjI5LCBMIlRpbWVzTmV3Um9tYW4iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwKKyAgICB7MHhiN2VhZWJlYiwgTCJBZG9iZUhlaXRpU3RkUiIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sCisgICAgezB4YmQyOWM0ODYsIEwiQmVybGluU2Fuc0ZCRGVtaS1Cb2xkIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHhiZThhOGRiNCwgTCJCb29rc2hlbGZTeW1ib2xTZXZlbiIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4YzE2YzAxMTgsIEwiQWRvYmVIZWJyZXciLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayxEcm9pZCBBcmFiaWMgIgorICAgICBMIk5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMiLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHhjMzE4YjBhZiwgTCJNeXJpYWRQcm9MaWdodCIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4YzY1ZTU2NTksIEwiQ2FtYnJpYU1hdGgiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwKKyAgICB7MHhjNzVjOGYwNSwgTCJMdWNpZGFDb25zb2xlIiwKKyAgICAgTCJEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwKKyAgICB7MHhjYTdjMzVkNiwgTCJDYWxpYnJpIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4Y2IwNTNmNTMsIEwiTWljcm9zb2Z0WWFIZWkiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAorICAgIHsweGNiNzE5MGY5LCBMIk1hZ25ldG8tQm9sZCIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4Y2NhMDBjYzUsIEwiU3lzdGVtIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHhjY2FkNmY3NiwgTCJKb2tlcm1hbi1SZWd1bGFyIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHhjY2M1ODE4YywgTCJFdXJvU2lnbiIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4Y2YzZDcyMzQsIEwiTHVjaWRhSGFuZHdyaXRpbmctSXRhbGljIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHhjZjdiOGZkYiwgTCJNaW5pb25Qcm8iLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweGNmZTU3NTVmLCBMIlNpbWhlaSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDkzNn0sCisgICAgezB4ZDAxMWY0ZWUsIEwiTVNQR290aGljIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4ZDA2MGU3ZWYsIEwiVml2YWxkaSIsCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgOCwgMTI1Mn0sCisgICAgezB4ZDA3ZWRlYzEsIEwiRnJhbmtsaW5Hb3RoaWMtTWVkaXVtIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHhkMTA3MjQzZiwgTCJTaW1TdW4iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAorICAgIHsweGQxODgxNTYyLCBMIkFyaWFsTmFycm93IiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHhkMjJiN2RjZSwgTCJCb2RvbmlNVFBvc3RlckNvbXByZXNzZWQiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAorICAgIHsweGQyMmJmYTYwLCBMIkNvbWljU2Fuc01TIiwgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDgsCisgICAgIDEyNTJ9LAorICAgIHsweGQzYmQwZTM1LCBMIkJhdWhhdXM5MyIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4ZDQyOWVlN2EsIEwiU1RGYW5nc29uZyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sCisgICAgezB4ZDY2NzljMTIsIEwiQmVybmFyZE1UQ29uZGVuc2VkIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHhkOGU4YTAyNywgTCJMdWNpZGFTYW5zIiwKKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8iLCAwLCAxMjUyfSwKKyAgICB7MHhkOWZlNzc2MSwgTCJIaWdoVG93ZXJUZXh0LVJlZyIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sCisgICAgezB4ZGE3ZTU1MWUsIEwiU1RTb25nIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKKyAgICB7MHhkYWE2ODQyZCwgTCJTVFpob25nc29uZyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sCisgICAgezB4ZGFhYWI5M2YsIEwiU1RGYW5nc29uZyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sCisgICAgezB4ZGFlYjA3MTMsIEwiU1RTb25nIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAorICAgIHsweGRhZmVkYmVmLCBMIlNUQ2FpeXVuIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKKyAgICB7MHhkYjAwYTNkOSwgTCJCcm9hZHdheSIsCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4ZGIxZjVhZDQsIEwiU1RYaW53ZWkiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAorICAgIHsweGRiMzI2ZTdmLCBMIlNUS2FpdGkiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAorICAgIHsweGRiNjk1OTVhLCBMIlNUSHVwbyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sCisgICAgezB4ZGJhMDA4MmMsIEwiU1RYaWhlaSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sCisgICAgezB4ZGJkMGFiMTgsIEwiU1RYaW5na2FpIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKKyAgICB7MHhkYzFhN2RiMSwgTCJTVExpdGkiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAorICAgIHsweGRjMzMwNzVmLCBMIktyaXN0ZW5JVEMtUmVndWxhciIsCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvIiwgOCwgMTI1Mn0sCisgICAgezB4ZGNjNzAwOWMsIEwiSGFycmluZ3RvbiIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4ZGQ3MTI0NjYsIEwiQXJpYWxCbGFjayIsCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4ZGRlODdiM2UsIEwiSW1wYWN0IiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHhkZjY5ZmIzMiwgTCJTbmFwSVRDIiwKKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyAiCisgICAgIEwiTW9ubyIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweGRmOGIyNWU4LCBMIkNlbnR1cnlHb3RoaWMiLAorICAgICBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8iLCAwLCAxMjUyfSwKKyAgICB7MHhlMGY3MDVjMCwgTCJLcmlzdGVuSVRDIiwKKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8iLCA4LCAxMjUyfSwKKyAgICB7MHhlMTQyNzU3MywgTCJSYWF2aSIsCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgIgorICAgICBMIk1vbm8iLAorICAgICAwLCAxMjUyfSwKKyAgICB7MHhlMmNlYTBjYiwgTCJNYWduZXRvIiwKKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyAiCisgICAgIEwiTW9ubyIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweGUzNmE5ZTE3LCBMIlJhdmllIiwKKyAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyAiCisgICAgIEwiTW9ubyIsCisgICAgIDAsIDEyNTJ9LAorICAgIHsweGU0MzNmOGUyLCBMIlBhcmNobWVudCIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgOCwgMTI1Mn0sCisgICAgezB4ZTQzZGZmNGEsIEwiV2luZ2RpbmdzIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA0LCA0Mn0sCisgICAgezB4ZTRlMmM0MDUsIEwiTVRFeHRyYSIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgNiwgNDJ9LAorICAgIHsweGU2MThjYzM1LCBMIkluZm9ybWFsUm9tYW4iLAorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLFJvYm90byxEcm9pZCBTZXJpZiIsIDgsIDEyNTJ9LAorICAgIHsweGU2YzI3ZmZjLCBMIk1pc3RyYWwiLAorICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDgsIDEyNTJ9LAorICAgIHsweGU3ZWJmNGI5LCBMIkNvdXJpZXIiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHhlOGJjNGE5ZCwgTCJNU1JlZmVyZW5jZVNwZWNpYWx0eSIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4ZTkwZmIwMTMsIEwiVGVtcHVzU2Fuc0lUQyIsCisgICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4ZWM2MzdiNDIsIEwiQ29uc29sYXMiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwKKyAgICB7MHhlZDNhNjgzYiwgTCJTVFhpbndlaSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sCisgICAgezB4ZWYyNjRjZDEsIEwiTHVjaWRhSGFuZHdyaXRpbmciLAorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zICIKKyAgICAgTCJNb25vIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4ZjA4NmJjYTIsIEwiQmFza2VydmlsbGVPbGRGYWNlIiwKKyAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKKyAgICB7MHhmMTAyODAzMCwgTCJNYW5nYWwiLAorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zICIKKyAgICAgTCJNb25vIiwKKyAgICAgMiwgMTI1Mn0sCisgICAgezB4ZjFkYTdlYjksIEwiU2hvd2NhcmRHb3RoaWMiLAorICAgICBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjIiwgMCwgMTI1Mn0sCisgICAgezB4ZjIxMGYwNmEsIEwiQXJpYWxNVCIsCisgICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmIiwgMCwgMTI1Mn0sCisgICAgezB4ZjQ3N2YxNmEsIEwiTGF0aGEiLAorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLFJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zICIKKyAgICAgTCJNb25vIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4ZjYxNmYzZGQsIEwiTGlTdSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDkzNn0sCisgICAgezB4ZmE0NzlhYTYsIEwiTWljcm9zb2Z0WWFIZWkiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAorICAgIHsweGZjZDE5Njk3LCBMIkJvb2ttYW5PbGRTdHlsZSIsCisgICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCisgICAgezB4ZmUyMDlhODIsIEwiTHVjaWRhQ2FsbGlncmFwaHkiLAorICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zICIKKyAgICAgTCJNb25vIiwKKyAgICAgMCwgMTI1Mn0sCisgICAgezB4ZmVmMTM1ZjgsIEwiQWRvYmVIZWl0aVN0ZC1SZWd1bGFyIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKK307CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlCisKK2NvbnN0IEZHQVNfRk9OVFVTQiogRkdBU19HZXRVbmljb2RlQml0RmllbGQod2NoYXJfdCB3VW5pY29kZSkgewogICBpbnQzMl90IGlFbmQgPSBzaXplb2YoZ19GWEdkaUZvbnRVU0JUYWJsZSkgLyBzaXplb2YoRkdBU19GT05UVVNCKSAtIDE7CiAgIEFTU0VSVChpRW5kID49IDApOwotICBpbnQzMl90IGlTdGFydCA9IDAsIGlNaWQ7CisKKyAgaW50MzJfdCBpU3RhcnQgPSAwOworICBpbnQzMl90IGlNaWQ7CiAgIGRvIHsKICAgICBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsKICAgICBjb25zdCBGR0FTX0ZPTlRVU0ImIHVzYiA9IGdfRlhHZGlGb250VVNCVGFibGVbaU1pZF07Ci0gICAgaWYgKHdVbmljb2RlIDwgdXNiLndTdGFydFVuaWNvZGUpIHsKKyAgICBpZiAod1VuaWNvZGUgPCB1c2Iud1N0YXJ0VW5pY29kZSkKICAgICAgIGlFbmQgPSBpTWlkIC0gMTsKLSAgICB9IGVsc2UgaWYgKHdVbmljb2RlID4gdXNiLndFbmRVbmljb2RlKSB7CisgICAgZWxzZSBpZiAod1VuaWNvZGUgPiB1c2Iud0VuZFVuaWNvZGUpCiAgICAgICBpU3RhcnQgPSBpTWlkICsgMTsKLSAgICB9IGVsc2UgeworICAgIGVsc2UKICAgICAgIHJldHVybiAmdXNiOwotICAgIH0KICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOwogICByZXR1cm4gbnVsbHB0cjsKIH0KKworV2lkZVN0cmluZyBGR0FTX0ZvbnROYW1lVG9FbmdsaXNoTmFtZShjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NMb2NhbE5hbWUpIHsKKyAgdWludDMyX3QgZHdMb2NhbE5hbWVIYXNoID0gRlhfSGFzaENvZGVfR2V0Vyh3c0xvY2FsTmFtZSwgdHJ1ZSk7CisgIGNvbnN0IEZHQVNfRm9udEluZm8qIHBFbmQgPSBnX1hGQUZvbnRzTWFwICsgRlhfQXJyYXlTaXplKGdfWEZBRm9udHNNYXApOworICBjb25zdCBGR0FTX0ZvbnRJbmZvKiBwRm9udEluZm8gPQorICAgICAgc3RkOjpsb3dlcl9ib3VuZChnX1hGQUZvbnRzTWFwLCBwRW5kLCBkd0xvY2FsTmFtZUhhc2gsCisgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IEZHQVNfRm9udEluZm8mIGVudHJ5LCB1aW50MzJfdCBoYXNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmR3Rm9udE5hbWVIYXNoIDwgaGFzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgIGlmIChwRm9udEluZm8gPCBwRW5kICYmIHBGb250SW5mby0+ZHdGb250TmFtZUhhc2ggPT0gZHdMb2NhbE5hbWVIYXNoKQorICAgIHJldHVybiBwRm9udEluZm8tPnBQc05hbWU7CisgIHJldHVybiBXaWRlU3RyaW5nKHdzTG9jYWxOYW1lKTsKK30KKworY29uc3QgRkdBU19Gb250SW5mbyogRkdBU19Gb250SW5mb0J5Rm9udE5hbWUoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzRm9udE5hbWUpIHsKKyAgV2lkZVN0cmluZyB3c0ZvbnROYW1lVGVtcCh3c0ZvbnROYW1lKTsKKyAgd3NGb250TmFtZVRlbXAuUmVtb3ZlKEwnICcpOworICB1aW50MzJfdCBkd0N1ckZvbnROYW1lSGFzaCA9CisgICAgICBGWF9IYXNoQ29kZV9HZXRXKHdzRm9udE5hbWVUZW1wLkFzU3RyaW5nVmlldygpLCB0cnVlKTsKKyAgY29uc3QgRkdBU19Gb250SW5mbyogcEVuZCA9IGdfWEZBRm9udHNNYXAgKyBGWF9BcnJheVNpemUoZ19YRkFGb250c01hcCk7CisgIGNvbnN0IEZHQVNfRm9udEluZm8qIHBGb250SW5mbyA9CisgICAgICBzdGQ6Omxvd2VyX2JvdW5kKGdfWEZBRm9udHNNYXAsIHBFbmQsIGR3Q3VyRm9udE5hbWVIYXNoLAorICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBGR0FTX0ZvbnRJbmZvJiBlbnRyeSwgdWludDMyX3QgaGFzaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5kd0ZvbnROYW1lSGFzaCA8IGhhc2g7CisgICAgICAgICAgICAgICAgICAgICAgIH0pOworICBpZiAocEZvbnRJbmZvIDwgcEVuZCAmJiBwRm9udEluZm8tPmR3Rm9udE5hbWVIYXNoID09IGR3Q3VyRm9udE5hbWVIYXNoKQorICAgIHJldHVybiBwRm9udEluZm87CisgIHJldHVybiBudWxscHRyOworfQpkaWZmIC0tZ2l0IGEveGZhL2ZnYXMvZm9udC9mZ2FzX2ZvbnR1dGlscy5oIGIveGZhL2ZnYXMvZm9udC9mZ2FzX2ZvbnR1dGlscy5oCmluZGV4IGQ3MDU1Y2UuLjNiZmQ5MzkgMTAwNjQ0Ci0tLSBhL3hmYS9mZ2FzL2ZvbnQvZmdhc19mb250dXRpbHMuaAorKysgYi94ZmEvZmdhcy9mb250L2ZnYXNfZm9udHV0aWxzLmgKQEAgLTcsNyArNyw3IEBACiAjaWZuZGVmIFhGQV9GR0FTX0ZPTlRfRkdBU19GT05UVVRJTFNfSF8KICNkZWZpbmUgWEZBX0ZHQVNfRk9OVF9GR0FTX0ZPTlRVVElMU19IXwogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3dpZGVzdHJpbmcuaCIKIAogc3RydWN0IEZHQVNfRk9OVFVTQiB7CiAgIHVpbnQxNl90IHdTdGFydFVuaWNvZGU7CkBAIC0xNiwxMCArMTYsMTggQEAKICAgdWludDE2X3Qgd0NvZGVQYWdlOwogfTsKIAotdWludDMyX3QgRkdBU19HZXRGb250SGFzaENvZGUodWludDE2X3Qgd0NvZGVQYWdlLCB1aW50MzJfdCBkd0ZvbnRTdHlsZXMpOwotdWludDMyX3QgRkdBU19HZXRGb250RmFtaWx5SGFzaChjb25zdCBGWF9XQ0hBUiogcHN6Rm9udEZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGb250U3R5bGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB3Q29kZVBhZ2UpOwotY29uc3QgRkdBU19GT05UVVNCKiBGR0FTX0dldFVuaWNvZGVCaXRGaWVsZChGWF9XQ0hBUiB3VW5pY29kZSk7Citjb25zdCBGR0FTX0ZPTlRVU0IqIEZHQVNfR2V0VW5pY29kZUJpdEZpZWxkKHdjaGFyX3Qgd1VuaWNvZGUpOworCitzdHJ1Y3QgRkdBU19Gb250SW5mbyB7CisgIHVpbnQzMl90IGR3Rm9udE5hbWVIYXNoOworICBjb25zdCB3Y2hhcl90KiBwUHNOYW1lOworICBjb25zdCB3Y2hhcl90KiBwUmVwbGFjZUZvbnQ7CisgIHVpbnQxNl90IGR3U3R5bGVzOworICB1aW50MTZfdCB3Q29kZVBhZ2U7Cit9OworCitXaWRlU3RyaW5nIEZHQVNfRm9udE5hbWVUb0VuZ2xpc2hOYW1lKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c0xvY2FsTmFtZSk7CisKK2NvbnN0IEZHQVNfRm9udEluZm8qIEZHQVNfRm9udEluZm9CeUZvbnROYW1lKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c0ZvbnROYW1lKTsKIAogI2VuZGlmICAvLyBYRkFfRkdBU19GT05UX0ZHQVNfRk9OVFVUSUxTX0hfCmRpZmYgLS1naXQgYS94ZmEvZmdhcy9sYXlvdXQvY2Z4X2JyZWFrLmNwcCBiL3hmYS9mZ2FzL2xheW91dC9jZnhfYnJlYWsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNTJhMmQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZmdhcy9sYXlvdXQvY2Z4X2JyZWFrLmNwcApAQCAtMCwwICsxLDIwMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2ZnYXMvbGF5b3V0L2NmeF9icmVhay5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKKyNpbmNsdWRlICJ4ZmEvZmdhcy9mb250L2NmZ2FzX2dlZm9udC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBpbnQga01pbmltdW1UYWJXaWR0aCA9IDE2MDAwMDsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NGWF9CcmVhazo6Q0ZYX0JyZWFrKHVpbnQzMl90IGR3TGF5b3V0U3R5bGVzKQorICAgIDogbV9lQ2hhclR5cGUoRlhfQ0hBUlRZUEVfVW5rbm93biksCisgICAgICBtX2JTaW5nbGVMaW5lKGZhbHNlKSwKKyAgICAgIG1fYkNvbWJUZXh0KGZhbHNlKSwKKyAgICAgIG1fZHdJZGVudGl0eSgwKSwKKyAgICAgIG1fZHdMYXlvdXRTdHlsZXMoZHdMYXlvdXRTdHlsZXMpLAorICAgICAgbV9pTGluZVN0YXJ0KDApLAorICAgICAgbV9pTGluZVdpZHRoKDIwMDAwMDApLAorICAgICAgbV93UGFyYWdyYXBoQnJlYWtDaGFyKEwnXG4nKSwKKyAgICAgIG1faUZvbnRTaXplKDI0MCksCisgICAgICBtX2lUYWJXaWR0aCg3MjAwMDApLAorICAgICAgbV9pSG9yaXpvbnRhbFNjYWxlKDEwMCksCisgICAgICBtX2lWZXJ0aWNhbFNjYWxlKDEwMCksCisgICAgICBtX2lUb2xlcmFuY2UoMCksCisgICAgICBtX2lDaGFyU3BhY2UoMCksCisgICAgICBtX2lEZWZDaGFyKDApLAorICAgICAgbV93RGVmQ2hhcigweEZFRkYpLAorICAgICAgbV9wRm9udChudWxscHRyKSwKKyAgICAgIG1fcEN1ckxpbmUobnVsbHB0ciksCisgICAgICBtX2lSZWFkeUxpbmVJbmRleCgtMSkgeworICBtX3BDdXJMaW5lID0gJm1fTGluZVswXTsKK30KKworQ0ZYX0JyZWFrOjp+Q0ZYX0JyZWFrKCkge30KKwordm9pZCBDRlhfQnJlYWs6OlJlc2V0KCkgeworICBtX2VDaGFyVHlwZSA9IEZYX0NIQVJUWVBFX1Vua25vd247CisgIG1fTGluZVswXS5DbGVhcigpOworICBtX0xpbmVbMV0uQ2xlYXIoKTsKK30KKwordm9pZCBDRlhfQnJlYWs6OlNldExheW91dFN0eWxlcyh1aW50MzJfdCBkd0xheW91dFN0eWxlcykgeworICBtX2R3TGF5b3V0U3R5bGVzID0gZHdMYXlvdXRTdHlsZXM7CisgIG1fYlNpbmdsZUxpbmUgPSAobV9kd0xheW91dFN0eWxlcyAmIEZYX0xBWU9VVFNUWUxFX1NpbmdsZUxpbmUpICE9IDA7CisgIG1fYkNvbWJUZXh0ID0gKG1fZHdMYXlvdXRTdHlsZXMgJiBGWF9MQVlPVVRTVFlMRV9Db21iVGV4dCkgIT0gMDsKK30KKwordm9pZCBDRlhfQnJlYWs6OlNldEhvcml6b250YWxTY2FsZShpbnQzMl90IGlTY2FsZSkgeworICBpU2NhbGUgPSBzdGQ6Om1heChpU2NhbGUsIDApOworICBpZiAobV9pSG9yaXpvbnRhbFNjYWxlID09IGlTY2FsZSkKKyAgICByZXR1cm47CisKKyAgU2V0QnJlYWtTdGF0dXMoKTsKKyAgbV9pSG9yaXpvbnRhbFNjYWxlID0gaVNjYWxlOworfQorCit2b2lkIENGWF9CcmVhazo6U2V0VmVydGljYWxTY2FsZShpbnQzMl90IGlTY2FsZSkgeworICBpZiAoaVNjYWxlIDwgMCkKKyAgICBpU2NhbGUgPSAwOworICBpZiAobV9pVmVydGljYWxTY2FsZSA9PSBpU2NhbGUpCisgICAgcmV0dXJuOworCisgIFNldEJyZWFrU3RhdHVzKCk7CisgIG1faVZlcnRpY2FsU2NhbGUgPSBpU2NhbGU7Cit9CisKK3ZvaWQgQ0ZYX0JyZWFrOjpTZXRGb250KGNvbnN0IFJldGFpblB0cjxDRkdBU19HRUZvbnQ+JiBwRm9udCkgeworICBpZiAoIXBGb250IHx8IHBGb250ID09IG1fcEZvbnQpCisgICAgcmV0dXJuOworCisgIFNldEJyZWFrU3RhdHVzKCk7CisgIG1fcEZvbnQgPSBwRm9udDsKKyAgRm9udENoYW5nZWQoKTsKK30KKwordm9pZCBDRlhfQnJlYWs6OlNldEZvbnRTaXplKGZsb2F0IGZGb250U2l6ZSkgeworICBpbnQzMl90IGlGb250U2l6ZSA9IEZYU1lTX3JvdW5kKGZGb250U2l6ZSAqIDIwLjBmKTsKKyAgaWYgKG1faUZvbnRTaXplID09IGlGb250U2l6ZSkKKyAgICByZXR1cm47CisKKyAgU2V0QnJlYWtTdGF0dXMoKTsKKyAgbV9pRm9udFNpemUgPSBpRm9udFNpemU7CisgIEZvbnRDaGFuZ2VkKCk7Cit9CisKK3ZvaWQgQ0ZYX0JyZWFrOjpTZXRCcmVha1N0YXR1cygpIHsKKyAgKyttX2R3SWRlbnRpdHk7CisgIGludDMyX3QgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOworICBpZiAoaUNvdW50IDwgMSkKKyAgICByZXR1cm47CisKKyAgQ0ZYX0NoYXIqIHRjID0gbV9wQ3VyTGluZS0+R2V0Q2hhcihpQ291bnQgLSAxKTsKKyAgaWYgKHRjLT5tX2R3U3RhdHVzID09IENGWF9CcmVha1R5cGU6Ok5vbmUpCisgICAgdGMtPm1fZHdTdGF0dXMgPSBDRlhfQnJlYWtUeXBlOjpQaWVjZTsKK30KKworRlhfQ0hBUlRZUEUgQ0ZYX0JyZWFrOjpHZXRVbmlmaWVkQ2hhclR5cGUoRlhfQ0hBUlRZUEUgY2hhcnR5cGUpIGNvbnN0IHsKKyAgcmV0dXJuIGNoYXJ0eXBlID49IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYgPyBGWF9DSEFSVFlQRV9BcmFiaWMgOiBjaGFydHlwZTsKK30KKwordm9pZCBDRlhfQnJlYWs6OkZvbnRDaGFuZ2VkKCkgeworICBtX2lEZWZDaGFyID0gMDsKKyAgaWYgKCFtX3BGb250IHx8IG1fd0RlZkNoYXIgPT0gMHhGRUZGKQorICAgIHJldHVybjsKKworICBtX3BGb250LT5HZXRDaGFyV2lkdGgobV93RGVmQ2hhciwgbV9pRGVmQ2hhcik7CisgIG1faURlZkNoYXIgKj0gbV9pRm9udFNpemU7Cit9CisKK3ZvaWQgQ0ZYX0JyZWFrOjpTZXRUYWJXaWR0aChmbG9hdCBmVGFiV2lkdGgpIHsKKyAgLy8gTm90ZSwgdGhlIHVzZSBvZiBtYXggaGVyZSB3YXMgb25seSBkb25lIGluIHRoZSBUeHRCcmVhayBjb2RlLiBMZWF2aW5nIHRoaXMKKyAgLy8gaW4gZm9yIHRoZSBSVEZCcmVhayBjb2RlIGZvciBjb25zaXN0ZW5jeS4gSWYgd2Ugc2VlIGlzc3VlcyB3aXRoIHRhYiB3aWR0aHMKKyAgLy8gd2UgbWF5IG5lZWQgdG8gZml4IHRoaXMuCisgIG1faVRhYldpZHRoID0gc3RkOjptYXgoRlhTWVNfcm91bmQoZlRhYldpZHRoICogMjAwMDAuMGYpLCBrTWluaW11bVRhYldpZHRoKTsKK30KKwordm9pZCBDRlhfQnJlYWs6OlNldERlZmF1bHRDaGFyKHdjaGFyX3Qgd2NoKSB7CisgIG1fd0RlZkNoYXIgPSB3Y2g7CisgIG1faURlZkNoYXIgPSAwOworICBpZiAobV93RGVmQ2hhciA9PSAweEZFRkYgfHwgIW1fcEZvbnQpCisgICAgcmV0dXJuOworCisgIG1fcEZvbnQtPkdldENoYXJXaWR0aChtX3dEZWZDaGFyLCBtX2lEZWZDaGFyKTsKKyAgaWYgKG1faURlZkNoYXIgPCAwKQorICAgIG1faURlZkNoYXIgPSAwOworICBlbHNlCisgICAgbV9pRGVmQ2hhciAqPSBtX2lGb250U2l6ZTsKK30KKwordm9pZCBDRlhfQnJlYWs6OlNldFBhcmFncmFwaEJyZWFrQ2hhcih3Y2hhcl90IHdjaCkgeworICBpZiAod2NoICE9IEwnXHInICYmIHdjaCAhPSBMJ1xuJykKKyAgICByZXR1cm47CisgIG1fd1BhcmFncmFwaEJyZWFrQ2hhciA9IHdjaDsKK30KKwordm9pZCBDRlhfQnJlYWs6OlNldExpbmVCcmVha1RvbGVyYW5jZShmbG9hdCBmVG9sZXJhbmNlKSB7CisgIG1faVRvbGVyYW5jZSA9IEZYU1lTX3JvdW5kKGZUb2xlcmFuY2UgKiAyMDAwMC4wZik7Cit9CisKK3ZvaWQgQ0ZYX0JyZWFrOjpTZXRDaGFyU3BhY2UoZmxvYXQgZkNoYXJTcGFjZSkgeworICBtX2lDaGFyU3BhY2UgPSBGWFNZU19yb3VuZChmQ2hhclNwYWNlICogMjAwMDAuMGYpOworfQorCit2b2lkIENGWF9CcmVhazo6U2V0TGluZUJvdW5kYXJ5KGZsb2F0IGZMaW5lU3RhcnQsIGZsb2F0IGZMaW5lRW5kKSB7CisgIGlmIChmTGluZVN0YXJ0ID4gZkxpbmVFbmQpCisgICAgcmV0dXJuOworCisgIG1faUxpbmVTdGFydCA9IEZYU1lTX3JvdW5kKGZMaW5lU3RhcnQgKiAyMDAwMC4wZik7CisgIG1faUxpbmVXaWR0aCA9IEZYU1lTX3JvdW5kKGZMaW5lRW5kICogMjAwMDAuMGYpOworICBtX3BDdXJMaW5lLT5tX2lTdGFydCA9IHN0ZDo6bWluKG1fcEN1ckxpbmUtPm1faVN0YXJ0LCBtX2lMaW5lV2lkdGgpOworICBtX3BDdXJMaW5lLT5tX2lTdGFydCA9IHN0ZDo6bWF4KG1fcEN1ckxpbmUtPm1faVN0YXJ0LCBtX2lMaW5lU3RhcnQpOworfQorCitDRlhfQ2hhciogQ0ZYX0JyZWFrOjpHZXRMYXN0Q2hhcihpbnQzMl90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiT21pdENoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSaWNoVGV4dCkgY29uc3QgeworICBzdGQ6OnZlY3RvcjxDRlhfQ2hhcj4mIHRjYSA9IG1fcEN1ckxpbmUtPm1fTGluZUNoYXJzOworICBpZiAoIXBkZml1bTo6SW5kZXhJbkJvdW5kcyh0Y2EsIGluZGV4KSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBpbnQzMl90IGlTdGFydCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4odGNhKSAtIDE7CisgIHdoaWxlIChpU3RhcnQgPiAtMSkgeworICAgIENGWF9DaGFyKiBwVEMgPSAmdGNhW2lTdGFydC0tXTsKKyAgICBpZiAoKChiUmljaFRleHQgJiYgcFRDLT5tX2lDaGFyV2lkdGggPCAwKSB8fCBiT21pdENoYXIpICYmCisgICAgICAgIHBUQy0+R2V0Q2hhclR5cGUoKSA9PSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICgtLWluZGV4IDwgMCkKKyAgICAgIHJldHVybiBwVEM7CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2ludDMyX3QgQ0ZYX0JyZWFrOjpDb3VudEJyZWFrUGllY2VzKCkgY29uc3QgeworICByZXR1cm4gSGFzTGluZSgpID8gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PigKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX0xpbmVbbV9pUmVhZHlMaW5lSW5kZXhdLm1fTGluZVBpZWNlcykKKyAgICAgICAgICAgICAgICAgICA6IDA7Cit9CisKK2NvbnN0IENGWF9CcmVha1BpZWNlKiBDRlhfQnJlYWs6OkdldEJyZWFrUGllY2VVbnN0YWJsZShpbnQzMl90IGluZGV4KSBjb25zdCB7CisgIGlmICghSGFzTGluZSgpKQorICAgIHJldHVybiBudWxscHRyOworICBpZiAoIXBkZml1bTo6SW5kZXhJbkJvdW5kcyhtX0xpbmVbbV9pUmVhZHlMaW5lSW5kZXhdLm1fTGluZVBpZWNlcywgaW5kZXgpKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gJm1fTGluZVttX2lSZWFkeUxpbmVJbmRleF0ubV9MaW5lUGllY2VzW2luZGV4XTsKK30KKwordm9pZCBDRlhfQnJlYWs6OkNsZWFyQnJlYWtQaWVjZXMoKSB7CisgIGlmIChIYXNMaW5lKCkpCisgICAgbV9MaW5lW21faVJlYWR5TGluZUluZGV4XS5DbGVhcigpOworICBtX2lSZWFkeUxpbmVJbmRleCA9IC0xOworfQpkaWZmIC0tZ2l0IGEveGZhL2ZnYXMvbGF5b3V0L2NmeF9icmVhay5oIGIveGZhL2ZnYXMvbGF5b3V0L2NmeF9icmVhay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OTIyMGQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZmdhcy9sYXlvdXQvY2Z4X2JyZWFrLmgKQEAgLTAsMCArMSw5MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GR0FTX0xBWU9VVF9DRlhfQlJFQUtfSF8KKyNkZWZpbmUgWEZBX0ZHQVNfTEFZT1VUX0NGWF9CUkVBS19IXworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJ4ZmEvZmdhcy9sYXlvdXQvY2Z4X2JyZWFrbGluZS5oIgorCitjbGFzcyBDRkdBU19HRUZvbnQ7CisKK3N0cnVjdCBGWF9UUE8geworICBib29sIG9wZXJhdG9yPChjb25zdCBGWF9UUE8mIHRoYXQpIGNvbnN0IHsgcmV0dXJuIHBvcyA8IHRoYXQucG9zOyB9CisKKyAgaW50MzJfdCBpbmRleDsKKyAgaW50MzJfdCBwb3M7Cit9OworCitlbnVtIEZYX0xBWU9VVFNUWUxFIHsKKyAgRlhfTEFZT1VUU1RZTEVfTm9uZSA9IDAsCisgIEZYX0xBWU9VVFNUWUxFX1BhZ2luYXRpb24gPSAweDAxLAorICBGWF9MQVlPVVRTVFlMRV9FeHBhbmRUYWIgPSAweDEwLAorICBGWF9MQVlPVVRTVFlMRV9TaW5nbGVMaW5lID0gMHgyMDAsCisgIEZYX0xBWU9VVFNUWUxFX0NvbWJUZXh0ID0gMHg0MDAKK307CisKK2NsYXNzIENGWF9CcmVhayB7CisgcHVibGljOgorICB2aXJ0dWFsIH5DRlhfQnJlYWsoKTsKKworICB2b2lkIFJlc2V0KCk7CisKKyAgdm9pZCBTZXRMYXlvdXRTdHlsZXModWludDMyX3QgZHdMYXlvdXRTdHlsZXMpOworICB1aW50MzJfdCBHZXRMYXlvdXRTdHlsZXMoKSBjb25zdCB7IHJldHVybiBtX2R3TGF5b3V0U3R5bGVzOyB9CisKKyAgdm9pZCBTZXRGb250KGNvbnN0IFJldGFpblB0cjxDRkdBU19HRUZvbnQ+JiBwRm9udCk7CisgIHZvaWQgU2V0Rm9udFNpemUoZmxvYXQgZkZvbnRTaXplKTsKKyAgdm9pZCBTZXRUYWJXaWR0aChmbG9hdCBmVGFiV2lkdGgpOworICBpbnQzMl90IEdldFRhYldpZHRoKCkgY29uc3QgeyByZXR1cm4gbV9pVGFiV2lkdGg7IH0KKworICB2b2lkIFNldEhvcml6b250YWxTY2FsZShpbnQzMl90IGlTY2FsZSk7CisgIHZvaWQgU2V0VmVydGljYWxTY2FsZShpbnQzMl90IGlTY2FsZSk7CisgIHZvaWQgU2V0TGluZUJyZWFrVG9sZXJhbmNlKGZsb2F0IGZUb2xlcmFuY2UpOworICB2b2lkIFNldExpbmVCb3VuZGFyeShmbG9hdCBmTGluZVN0YXJ0LCBmbG9hdCBmTGluZUVuZCk7CisKKyAgdm9pZCBTZXRDaGFyU3BhY2UoZmxvYXQgZkNoYXJTcGFjZSk7CisgIHZvaWQgU2V0UGFyYWdyYXBoQnJlYWtDaGFyKHdjaGFyX3Qgd2NoKTsKKyAgdm9pZCBTZXREZWZhdWx0Q2hhcih3Y2hhcl90IHdjaCk7CisKKyAgaW50MzJfdCBDb3VudEJyZWFrUGllY2VzKCkgY29uc3Q7CisgIGNvbnN0IENGWF9CcmVha1BpZWNlKiBHZXRCcmVha1BpZWNlVW5zdGFibGUoaW50MzJfdCBpbmRleCkgY29uc3Q7CisgIHZvaWQgQ2xlYXJCcmVha1BpZWNlcygpOworCisgIENGWF9DaGFyKiBHZXRMYXN0Q2hhcihpbnQzMl90IGluZGV4LCBib29sIGJPbWl0Q2hhciwgYm9vbCBiUmljaFRleHQpIGNvbnN0OworCisgcHJvdGVjdGVkOgorICBleHBsaWNpdCBDRlhfQnJlYWsodWludDMyX3QgZHdMYXlvdXRTdHlsZXMpOworCisgIHZvaWQgU2V0QnJlYWtTdGF0dXMoKTsKKyAgYm9vbCBIYXNMaW5lKCkgY29uc3QgeyByZXR1cm4gbV9pUmVhZHlMaW5lSW5kZXggPj0gMDsgfQorICBGWF9DSEFSVFlQRSBHZXRVbmlmaWVkQ2hhclR5cGUoRlhfQ0hBUlRZUEUgZHdUeXBlKSBjb25zdDsKKworICBGWF9DSEFSVFlQRSBtX2VDaGFyVHlwZTsKKyAgYm9vbCBtX2JTaW5nbGVMaW5lOworICBib29sIG1fYkNvbWJUZXh0OworICB1aW50MzJfdCBtX2R3SWRlbnRpdHk7CisgIHVpbnQzMl90IG1fZHdMYXlvdXRTdHlsZXM7CisgIGludDMyX3QgbV9pTGluZVN0YXJ0OworICBpbnQzMl90IG1faUxpbmVXaWR0aDsKKyAgd2NoYXJfdCBtX3dQYXJhZ3JhcGhCcmVha0NoYXI7CisgIGludDMyX3QgbV9pRm9udFNpemU7CisgIGludDMyX3QgbV9pVGFiV2lkdGg7CisgIGludDMyX3QgbV9pSG9yaXpvbnRhbFNjYWxlOworICBpbnQzMl90IG1faVZlcnRpY2FsU2NhbGU7CisgIGludDMyX3QgbV9pVG9sZXJhbmNlOworICBpbnQzMl90IG1faUNoYXJTcGFjZTsKKyAgaW50MzJfdCBtX2lEZWZDaGFyOworICB3Y2hhcl90IG1fd0RlZkNoYXI7CisgIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+IG1fcEZvbnQ7CisgIENGWF9CcmVha0xpbmUgbV9MaW5lWzJdOworICBDRlhfQnJlYWtMaW5lKiBtX3BDdXJMaW5lOworICBpbnQ4X3QgbV9pUmVhZHlMaW5lSW5kZXg7CisKKyBwcml2YXRlOgorICB2b2lkIEZvbnRDaGFuZ2VkKCk7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GR0FTX0xBWU9VVF9DRlhfQlJFQUtfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZ2FzL2xheW91dC9jZnhfYnJlYWtsaW5lLmNwcCBiL3hmYS9mZ2FzL2xheW91dC9jZnhfYnJlYWtsaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzg4NjAzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2ZnYXMvbGF5b3V0L2NmeF9icmVha2xpbmUuY3BwCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9mZ2FzL2xheW91dC9jZnhfYnJlYWtsaW5lLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisKK0NGWF9CcmVha0xpbmU6OkNGWF9CcmVha0xpbmUoKSA6IG1faVN0YXJ0KDApLCBtX2lXaWR0aCgwKSwgbV9pQXJhYmljQ2hhcnMoMCkge30KKworQ0ZYX0JyZWFrTGluZTo6fkNGWF9CcmVha0xpbmUoKSB7fQorCitpbnQzMl90IENGWF9CcmVha0xpbmU6OkNvdW50Q2hhcnMoKSBjb25zdCB7CisgIHJldHVybiBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fTGluZUNoYXJzKTsKK30KKworQ0ZYX0NoYXIqIENGWF9CcmVha0xpbmU6OkdldENoYXIoaW50MzJfdCBpbmRleCkgeworICBBU1NFUlQocGRmaXVtOjpJbmRleEluQm91bmRzKG1fTGluZUNoYXJzLCBpbmRleCkpOworICByZXR1cm4gJm1fTGluZUNoYXJzW2luZGV4XTsKK30KKworY29uc3QgQ0ZYX0NoYXIqIENGWF9CcmVha0xpbmU6OkdldENoYXIoaW50MzJfdCBpbmRleCkgY29uc3QgeworICBBU1NFUlQocGRmaXVtOjpJbmRleEluQm91bmRzKG1fTGluZUNoYXJzLCBpbmRleCkpOworICByZXR1cm4gJm1fTGluZUNoYXJzW2luZGV4XTsKK30KKworaW50MzJfdCBDRlhfQnJlYWtMaW5lOjpDb3VudFBpZWNlcygpIGNvbnN0IHsKKyAgcmV0dXJuIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9MaW5lUGllY2VzKTsKK30KKworY29uc3QgQ0ZYX0JyZWFrUGllY2UqIENGWF9CcmVha0xpbmU6OkdldFBpZWNlKGludDMyX3QgaW5kZXgpIGNvbnN0IHsKKyAgQVNTRVJUKGluZGV4ID49IDAgJiYgaW5kZXggPCBDb3VudFBpZWNlcygpKTsKKyAgcmV0dXJuICZtX0xpbmVQaWVjZXNbaW5kZXhdOworfQorCitpbnQzMl90IENGWF9CcmVha0xpbmU6OkdldExpbmVFbmQoKSBjb25zdCB7CisgIHJldHVybiBtX2lTdGFydCArIG1faVdpZHRoOworfQorCit2b2lkIENGWF9CcmVha0xpbmU6OkNsZWFyKCkgeworICBtX0xpbmVDaGFycy5jbGVhcigpOworICBtX0xpbmVQaWVjZXMuY2xlYXIoKTsKKyAgbV9pV2lkdGggPSAwOworICBtX2lBcmFiaWNDaGFycyA9IDA7Cit9CmRpZmYgLS1naXQgYS94ZmEvZmdhcy9sYXlvdXQvY2Z4X2JyZWFrbGluZS5oIGIveGZhL2ZnYXMvbGF5b3V0L2NmeF9icmVha2xpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjgzZWU2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2ZnYXMvbGF5b3V0L2NmeF9icmVha2xpbmUuaApAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZHQVNfTEFZT1VUX0NGWF9CUkVBS0xJTkVfSF8KKyNkZWZpbmUgWEZBX0ZHQVNfTEFZT1VUX0NGWF9CUkVBS0xJTkVfSF8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X2NoYXIuaCIKKyNpbmNsdWRlICJ4ZmEvZmdhcy9sYXlvdXQvY2Z4X2JyZWFrcGllY2UuaCIKKworY2xhc3MgQ0ZYX0JyZWFrTGluZSB7CisgcHVibGljOgorICBDRlhfQnJlYWtMaW5lKCk7CisgIH5DRlhfQnJlYWtMaW5lKCk7CisKKyAgaW50MzJfdCBDb3VudENoYXJzKCkgY29uc3Q7CisgIENGWF9DaGFyKiBHZXRDaGFyKGludDMyX3QgaW5kZXgpOworICBjb25zdCBDRlhfQ2hhciogR2V0Q2hhcihpbnQzMl90IGluZGV4KSBjb25zdDsKKworICBpbnQzMl90IENvdW50UGllY2VzKCkgY29uc3Q7CisgIGNvbnN0IENGWF9CcmVha1BpZWNlKiBHZXRQaWVjZShpbnQzMl90IGluZGV4KSBjb25zdDsKKworICBpbnQzMl90IEdldExpbmVFbmQoKSBjb25zdDsKKworICB2b2lkIENsZWFyKCk7CisKKyAgc3RkOjp2ZWN0b3I8Q0ZYX0NoYXI+IG1fTGluZUNoYXJzOworICBzdGQ6OnZlY3RvcjxDRlhfQnJlYWtQaWVjZT4gbV9MaW5lUGllY2VzOworICBpbnQzMl90IG1faVN0YXJ0OworICBpbnQzMl90IG1faVdpZHRoOworICBpbnQzMl90IG1faUFyYWJpY0NoYXJzOworfTsKKworI2VuZGlmICAvLyBYRkFfRkdBU19MQVlPVVRfQ0ZYX0JSRUFLTElORV9IXwpkaWZmIC0tZ2l0IGEveGZhL2ZnYXMvbGF5b3V0L2NmeF9icmVha3BpZWNlLmNwcCBiL3hmYS9mZ2FzL2xheW91dC9jZnhfYnJlYWtwaWVjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY0YzExNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9mZ2FzL2xheW91dC9jZnhfYnJlYWtwaWVjZS5jcHAKQEAgLTAsMCArMSw1MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2ZnYXMvbGF5b3V0L2NmeF9icmVha3BpZWNlLmgiCisKK0NGWF9CcmVha1BpZWNlOjpDRlhfQnJlYWtQaWVjZSgpCisgICAgOiBtX2R3U3RhdHVzKENGWF9CcmVha1R5cGU6OlBpZWNlKSwKKyAgICAgIG1faVN0YXJ0UG9zKDApLAorICAgICAgbV9pV2lkdGgoLTEpLAorICAgICAgbV9pU3RhcnRDaGFyKDApLAorICAgICAgbV9pQ2hhcnMoMCksCisgICAgICBtX2lCaWRpTGV2ZWwoMCksCisgICAgICBtX2lCaWRpUG9zKDApLAorICAgICAgbV9pRm9udFNpemUoMCksCisgICAgICBtX2lIb3Jpem9udGFsU2NhbGUoMTAwKSwKKyAgICAgIG1faVZlcnRpY2FsU2NhbGUoMTAwKSwKKyAgICAgIG1fZHdJZGVudGl0eSgwKSwKKyAgICAgIG1fZHdDaGFyU3R5bGVzKDApLAorICAgICAgbV9wQ2hhcnMobnVsbHB0cikge30KKworQ0ZYX0JyZWFrUGllY2U6OkNGWF9CcmVha1BpZWNlKGNvbnN0IENGWF9CcmVha1BpZWNlJiBvdGhlcikgPSBkZWZhdWx0OworCitDRlhfQnJlYWtQaWVjZTo6fkNGWF9CcmVha1BpZWNlKCkgPSBkZWZhdWx0OworCitpbnQzMl90IENGWF9CcmVha1BpZWNlOjpHZXRFbmRQb3MoKSBjb25zdCB7CisgIHJldHVybiBtX2lXaWR0aCA8IDAgPyBtX2lTdGFydFBvcyA6IG1faVN0YXJ0UG9zICsgbV9pV2lkdGg7Cit9CisKK0NGWF9DaGFyKiBDRlhfQnJlYWtQaWVjZTo6R2V0Q2hhcihpbnQzMl90IGluZGV4KSBjb25zdCB7CisgIEFTU0VSVChpbmRleCA+PSAwICYmIGluZGV4IDwgbV9pQ2hhcnMgJiYgbV9wQ2hhcnMpOworICByZXR1cm4gJigqbV9wQ2hhcnMpW21faVN0YXJ0Q2hhciArIGluZGV4XTsKK30KKworV2lkZVN0cmluZyBDRlhfQnJlYWtQaWVjZTo6R2V0U3RyaW5nKCkgY29uc3QgeworICBXaWRlU3RyaW5nIHJldDsKKyAgcmV0LlJlc2VydmUobV9pQ2hhcnMpOworICBmb3IgKGludDMyX3QgaSA9IG1faVN0YXJ0Q2hhcjsgaSA8IG1faVN0YXJ0Q2hhciArIG1faUNoYXJzOyBpKyspCisgICAgcmV0ICs9IHN0YXRpY19jYXN0PHdjaGFyX3Q+KCgqbV9wQ2hhcnMpW2ldLmNoYXJfY29kZSgpKTsKKyAgcmV0dXJuIHJldDsKK30KKworc3RkOjp2ZWN0b3I8aW50MzJfdD4gQ0ZYX0JyZWFrUGllY2U6OkdldFdpZHRocygpIGNvbnN0IHsKKyAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gcmV0OworICByZXQucmVzZXJ2ZShtX2lDaGFycyk7CisgIGZvciAoaW50MzJfdCBpID0gbV9pU3RhcnRDaGFyOyBpIDwgbV9pU3RhcnRDaGFyICsgbV9pQ2hhcnM7IGkrKykKKyAgICByZXQucHVzaF9iYWNrKCgqbV9wQ2hhcnMpW2ldLm1faUNoYXJXaWR0aCk7CisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS94ZmEvZmdhcy9sYXlvdXQvY2Z4X2JyZWFrcGllY2UuaCBiL3hmYS9mZ2FzL2xheW91dC9jZnhfYnJlYWtwaWVjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYmMwZTcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZmdhcy9sYXlvdXQvY2Z4X2JyZWFrcGllY2UuaApAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZHQVNfTEFZT1VUX0NGWF9CUkVBS1BJRUNFX0hfCisjZGVmaW5lIFhGQV9GR0FTX0xBWU9VVF9DRlhfQlJFQUtQSUVDRV9IXworCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfY2hhci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfdGV4dHVzZXJkYXRhLmgiCisKK2NsYXNzIENGWF9CcmVha1BpZWNlIHsKKyBwdWJsaWM6CisgIENGWF9CcmVha1BpZWNlKCk7CisgIENGWF9CcmVha1BpZWNlKGNvbnN0IENGWF9CcmVha1BpZWNlJiBvdGhlcik7CisgIH5DRlhfQnJlYWtQaWVjZSgpOworCisgIGludDMyX3QgR2V0RW5kUG9zKCkgY29uc3Q7CisgIGludDMyX3QgR2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9pQ2hhcnM7IH0KKworICBDRlhfQ2hhciogR2V0Q2hhcihpbnQzMl90IGluZGV4KSBjb25zdDsKKyAgV2lkZVN0cmluZyBHZXRTdHJpbmcoKSBjb25zdDsKKyAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gR2V0V2lkdGhzKCkgY29uc3Q7CisKKyAgQ0ZYX0JyZWFrVHlwZSBtX2R3U3RhdHVzOworICBpbnQzMl90IG1faVN0YXJ0UG9zOworICBpbnQzMl90IG1faVdpZHRoOworICBpbnQzMl90IG1faVN0YXJ0Q2hhcjsKKyAgaW50MzJfdCBtX2lDaGFyczsKKyAgaW50MzJfdCBtX2lCaWRpTGV2ZWw7CisgIGludDMyX3QgbV9pQmlkaVBvczsKKyAgaW50MzJfdCBtX2lGb250U2l6ZTsKKyAgaW50MzJfdCBtX2lIb3Jpem9udGFsU2NhbGU7CisgIGludDMyX3QgbV9pVmVydGljYWxTY2FsZTsKKyAgdWludDMyX3QgbV9kd0lkZW50aXR5OworICB1aW50MzJfdCBtX2R3Q2hhclN0eWxlczsKKyAgVW5vd25lZFB0cjxzdGQ6OnZlY3RvcjxDRlhfQ2hhcj4+IG1fcENoYXJzOworICBSZXRhaW5QdHI8Q1hGQV9UZXh0VXNlckRhdGE+IG1fcFVzZXJEYXRhOworfTsKKworI2VuZGlmICAvLyBYRkFfRkdBU19MQVlPVVRfQ0ZYX0JSRUFLUElFQ0VfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZ2FzL2xheW91dC9jZnhfbGluZWJyZWFrLmNwcCBiL3hmYS9mZ2FzL2xheW91dC9jZnhfbGluZWJyZWFrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDM1MjQ4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2ZnYXMvbGF5b3V0L2NmeF9saW5lYnJlYWsuY3BwCkBAIC0wLDAgKzEsMjY4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZmdhcy9sYXlvdXQvY2Z4X2xpbmVicmVhay5oIgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF91bmljb2RlLmgiCisKK2NvbnN0IEZYX0xJTkVCUkVBS1RZUEUgZ3NfRlhfTGluZUJyZWFrX1BhaXJUYWJsZVs2NF1bMzJdID0geworICAgIHtGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAorICAgICBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAorICAgICBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkNQLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAorICAgICBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKKyAgICAgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCisgICAge0ZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAorICAgIHtGWF9MQklCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAorICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAorICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAorICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCisgICAge0ZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAorICAgIHtGWF9MQklCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKKyAgICB7RlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKKyAgICAgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCisgICAge0ZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAorICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKKyAgICB7RlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKKyAgICAgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwKKyAgICAgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwKKyAgICAgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsCisgICAgIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAorICAgIHtGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCisgICAge0ZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCisgICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAorICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAorICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCisgICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCisgICAgIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAorICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAorICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCisgICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAorICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCisgICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAorICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCisgICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAorICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAorICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAorICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCisgICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCUEIsCisgICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCSUIsCisgICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCisgICAgIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKKyAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKKyAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKKyAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKKyAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCisgICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCisgICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAorICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAorICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKK307CmRpZmYgLS1naXQgYS94ZmEvZmdhcy9sYXlvdXQvY2Z4X2xpbmVicmVhay5oIGIveGZhL2ZnYXMvbGF5b3V0L2NmeF9saW5lYnJlYWsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmEwMjJlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2ZnYXMvbGF5b3V0L2NmeF9saW5lYnJlYWsuaApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZHQVNfTEFZT1VUX0NGWF9MSU5FQlJFQUtfSF8KKyNkZWZpbmUgWEZBX0ZHQVNfTEFZT1VUX0NGWF9MSU5FQlJFQUtfSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisKK2VudW0gRlhfTElORUJSRUFLVFlQRSA6IHVpbnQ4X3QgeworICBGWF9MQlRfVU5LTk9XTiA9IDB4MDAsCisgIEZYX0xCVF9ESVJFQ1RfQlJLID0gMHgxQSwKKyAgRlhfTEJUX0lORElSRUNUX0JSSyA9IDB4MkIsCisgIEZYX0xCVF9DT01fSU5ESVJFQ1RfQlJLID0gMHgzQywKKyAgRlhfTEJUX0NPTV9QUk9ISUJJVEVEX0JSSyA9IDB4NEQsCisgIEZYX0xCVF9QUk9ISUJJVEVEX0JSSyA9IDB4NUUsCisgIEZYX0xCVF9IQU5HVUxfU1BBQ0VfQlJLID0gMHg2RiwKK307CisKKyNkZWZpbmUgRlhfTEJVTiBGWF9MQlRfVU5LTk9XTgorI2RlZmluZSBGWF9MQkRCIEZYX0xCVF9ESVJFQ1RfQlJLCisjZGVmaW5lIEZYX0xCSUIgRlhfTEJUX0lORElSRUNUX0JSSworI2RlZmluZSBGWF9MQkNCIEZYX0xCVF9DT01fSU5ESVJFQ1RfQlJLCisjZGVmaW5lIEZYX0xCQ1AgRlhfTEJUX0NPTV9QUk9ISUJJVEVEX0JSSworI2RlZmluZSBGWF9MQlBCIEZYX0xCVF9QUk9ISUJJVEVEX0JSSworI2RlZmluZSBGWF9MQkhTIEZYX0xCVF9IQU5HVUxfU1BBQ0VfQlJLCisKK2V4dGVybiBjb25zdCBGWF9MSU5FQlJFQUtUWVBFIGdzX0ZYX0xpbmVCcmVha19QYWlyVGFibGVbNjRdWzMyXTsKKworI2VuZGlmICAvLyBYRkFfRkdBU19MQVlPVVRfQ0ZYX0xJTkVCUkVBS19IXwpkaWZmIC0tZ2l0IGEveGZhL2ZnYXMvbGF5b3V0L2NmeF9ydGZicmVhay5jcHAgYi94ZmEvZmdhcy9sYXlvdXQvY2Z4X3J0ZmJyZWFrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWYwZWYyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2ZnYXMvbGF5b3V0L2NmeF9ydGZicmVhay5jcHAKQEAgLTAsMCArMSw3ODkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9mZ2FzL2xheW91dC9jZnhfcnRmYnJlYWsuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYXJhYmljLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9iaWRpLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisjaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9jZmdhc19nZWZvbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZmdhcy9sYXlvdXQvY2Z4X2xpbmVicmVhay5oIgorCitDRlhfUlRGQnJlYWs6OkNGWF9SVEZCcmVhayh1aW50MzJfdCBkd0xheW91dFN0eWxlcykKKyAgICA6IENGWF9CcmVhayhkd0xheW91dFN0eWxlcyksCisgICAgICBtX2JQYWdpbmF0aW9uKGZhbHNlKSwKKyAgICAgIG1faUFsaWdubWVudChDRlhfUlRGTGluZUFsaWdubWVudDo6TGVmdCkgeworICBTZXRCcmVha1N0YXR1cygpOworICBtX2JQYWdpbmF0aW9uID0gISEobV9kd0xheW91dFN0eWxlcyAmIEZYX0xBWU9VVFNUWUxFX1BhZ2luYXRpb24pOworfQorCitDRlhfUlRGQnJlYWs6On5DRlhfUlRGQnJlYWsoKSB7fQorCit2b2lkIENGWF9SVEZCcmVhazo6U2V0TGluZVN0YXJ0UG9zKGZsb2F0IGZMaW5lUG9zKSB7CisgIGludDMyX3QgaUxpbmVQb3MgPSBGWFNZU19yb3VuZChmTGluZVBvcyAqIDIwMDAwLjBmKTsKKyAgaUxpbmVQb3MgPSBzdGQ6Om1pbihpTGluZVBvcywgbV9pTGluZVdpZHRoKTsKKyAgaUxpbmVQb3MgPSBzdGQ6Om1heChpTGluZVBvcywgbV9pTGluZVN0YXJ0KTsKKyAgbV9wQ3VyTGluZS0+bV9pU3RhcnQgPSBpTGluZVBvczsKK30KKwordm9pZCBDRlhfUlRGQnJlYWs6OkFkZFBvc2l0aW9uZWRUYWIoZmxvYXQgZlRhYlBvcykgeworICBpbnQzMl90IGlUYWJQb3MgPQorICAgICAgc3RkOjptaW4oRlhTWVNfcm91bmQoZlRhYlBvcyAqIDIwMDAwLjBmKSArIG1faUxpbmVTdGFydCwgbV9pTGluZVdpZHRoKTsKKyAgYXV0byBpdCA9IHN0ZDo6bG93ZXJfYm91bmQobV9Qb3NpdGlvbmVkVGFicy5iZWdpbigpLCBtX1Bvc2l0aW9uZWRUYWJzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpVGFiUG9zKTsKKyAgaWYgKGl0ICE9IG1fUG9zaXRpb25lZFRhYnMuZW5kKCkgJiYgKml0ID09IGlUYWJQb3MpCisgICAgcmV0dXJuOworICBtX1Bvc2l0aW9uZWRUYWJzLmluc2VydChpdCwgaVRhYlBvcyk7Cit9CisKK3ZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRVc2VyRGF0YShjb25zdCBSZXRhaW5QdHI8Q1hGQV9UZXh0VXNlckRhdGE+JiBwVXNlckRhdGEpIHsKKyAgaWYgKG1fcFVzZXJEYXRhID09IHBVc2VyRGF0YSkKKyAgICByZXR1cm47CisKKyAgU2V0QnJlYWtTdGF0dXMoKTsKKyAgbV9wVXNlckRhdGEgPSBwVXNlckRhdGE7Cit9CisKK2ludDMyX3QgQ0ZYX1JURkJyZWFrOjpHZXRMYXN0UG9zaXRpb25lZFRhYigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fUG9zaXRpb25lZFRhYnMuZW1wdHkoKSA/IG1faUxpbmVTdGFydCA6IG1fUG9zaXRpb25lZFRhYnMuYmFjaygpOworfQorCitib29sIENGWF9SVEZCcmVhazo6R2V0UG9zaXRpb25lZFRhYihpbnQzMl90KiBpVGFiUG9zKSBjb25zdCB7CisgIGF1dG8gaXQgPSBzdGQ6OnVwcGVyX2JvdW5kKG1fUG9zaXRpb25lZFRhYnMuYmVnaW4oKSwgbV9Qb3NpdGlvbmVkVGFicy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmlUYWJQb3MpOworICBpZiAoaXQgPT0gbV9Qb3NpdGlvbmVkVGFicy5lbmQoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgKmlUYWJQb3MgPSAqaXQ7CisgIHJldHVybiB0cnVlOworfQorCitDRlhfQnJlYWtUeXBlIENGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcih3Y2hhcl90IHdjaCkgeworICBBU1NFUlQobV9wRm9udCAmJiBtX3BDdXJMaW5lKTsKKworICB1aW50MzJfdCBkd1Byb3BzID0gRlhfR2V0VW5pY29kZVByb3BlcnRpZXMod2NoKTsKKyAgRlhfQ0hBUlRZUEUgY2hhcnR5cGUgPSBHZXRDaGFyVHlwZUZyb21Qcm9wKGR3UHJvcHMpOworICBtX3BDdXJMaW5lLT5tX0xpbmVDaGFycy5lbXBsYWNlX2JhY2sod2NoLCBkd1Byb3BzLCBtX2lIb3Jpem9udGFsU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lWZXJ0aWNhbFNjYWxlKTsKKyAgQ0ZYX0NoYXIqIHBDdXJDaGFyID0gJm1fcEN1ckxpbmUtPm1fTGluZUNoYXJzLmJhY2soKTsKKyAgcEN1ckNoYXItPm1faUZvbnRTaXplID0gbV9pRm9udFNpemU7CisgIHBDdXJDaGFyLT5tX2R3SWRlbnRpdHkgPSBtX2R3SWRlbnRpdHk7CisgIHBDdXJDaGFyLT5tX3BVc2VyRGF0YSA9IG1fcFVzZXJEYXRhOworCisgIENGWF9CcmVha1R5cGUgZHdSZXQxID0gQ0ZYX0JyZWFrVHlwZTo6Tm9uZTsKKyAgaWYgKGNoYXJ0eXBlICE9IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uICYmCisgICAgICBHZXRVbmlmaWVkQ2hhclR5cGUobV9lQ2hhclR5cGUpICE9IEdldFVuaWZpZWRDaGFyVHlwZShjaGFydHlwZSkgJiYKKyAgICAgIG1fZUNoYXJUeXBlICE9IEZYX0NIQVJUWVBFX1Vua25vd24gJiYKKyAgICAgIG1fcEN1ckxpbmUtPkdldExpbmVFbmQoKSA+IG1faUxpbmVXaWR0aCArIG1faVRvbGVyYW5jZSAmJgorICAgICAgKG1fZUNoYXJUeXBlICE9IEZYX0NIQVJUWVBFX1NwYWNlIHx8IGNoYXJ0eXBlICE9IEZYX0NIQVJUWVBFX0NvbnRyb2wpKSB7CisgICAgZHdSZXQxID0gRW5kQnJlYWsoQ0ZYX0JyZWFrVHlwZTo6TGluZSk7CisgICAgaW50MzJfdCBpQ291bnQgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCk7CisgICAgaWYgKGlDb3VudCA+IDApCisgICAgICBwQ3VyQ2hhciA9ICZtX3BDdXJMaW5lLT5tX0xpbmVDaGFyc1tpQ291bnQgLSAxXTsKKyAgfQorCisgIENGWF9CcmVha1R5cGUgZHdSZXQyID0gQ0ZYX0JyZWFrVHlwZTo6Tm9uZTsKKyAgc3dpdGNoIChjaGFydHlwZSkgeworICAgIGNhc2UgRlhfQ0hBUlRZUEVfVGFiOgorICAgICAgQXBwZW5kQ2hhcl9UYWIocEN1ckNoYXIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWF9DSEFSVFlQRV9Db250cm9sOgorICAgICAgZHdSZXQyID0gQXBwZW5kQ2hhcl9Db250cm9sKHBDdXJDaGFyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhfQ0hBUlRZUEVfQ29tYmluYXRpb246CisgICAgICBBcHBlbmRDaGFyX0NvbWJpbmF0aW9uKHBDdXJDaGFyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhfQ0hBUlRZUEVfQXJhYmljQWxlZjoKKyAgICBjYXNlIEZYX0NIQVJUWVBFX0FyYWJpY1NwZWNpYWw6CisgICAgY2FzZSBGWF9DSEFSVFlQRV9BcmFiaWNEaXN0b3J0aW9uOgorICAgIGNhc2UgRlhfQ0hBUlRZUEVfQXJhYmljTm9ybWFsOgorICAgIGNhc2UgRlhfQ0hBUlRZUEVfQXJhYmljRm9ybToKKyAgICBjYXNlIEZYX0NIQVJUWVBFX0FyYWJpYzoKKyAgICAgIGR3UmV0MiA9IEFwcGVuZENoYXJfQXJhYmljKHBDdXJDaGFyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhfQ0hBUlRZUEVfVW5rbm93bjoKKyAgICBjYXNlIEZYX0NIQVJUWVBFX1NwYWNlOgorICAgIGNhc2UgRlhfQ0hBUlRZUEVfTnVtZXJpYzoKKyAgICBjYXNlIEZYX0NIQVJUWVBFX05vcm1hbDoKKyAgICBkZWZhdWx0OgorICAgICAgZHdSZXQyID0gQXBwZW5kQ2hhcl9PdGhlcnMocEN1ckNoYXIpOworICAgICAgYnJlYWs7CisgIH0KKworICBtX2VDaGFyVHlwZSA9IGNoYXJ0eXBlOworICByZXR1cm4gc3RkOjptYXgoZHdSZXQxLCBkd1JldDIpOworfQorCit2b2lkIENGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9Db21iaW5hdGlvbihDRlhfQ2hhciogcEN1ckNoYXIpIHsKKyAgaW50MzJfdCBpQ2hhcldpZHRoID0gMDsKKyAgaWYgKCFtX3BGb250LT5HZXRDaGFyV2lkdGgocEN1ckNoYXItPmNoYXJfY29kZSgpLCBpQ2hhcldpZHRoKSkKKyAgICBpQ2hhcldpZHRoID0gMDsKKworICBpQ2hhcldpZHRoICo9IG1faUZvbnRTaXplOworICBpQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIG1faUhvcml6b250YWxTY2FsZSAvIDEwMDsKKyAgQ0ZYX0NoYXIqIHBMYXN0Q2hhciA9IEdldExhc3RDaGFyKDAsIGZhbHNlLCB0cnVlKTsKKyAgaWYgKHBMYXN0Q2hhciAmJiBwTGFzdENoYXItPkdldENoYXJUeXBlKCkgPiBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikKKyAgICBpQ2hhcldpZHRoID0gLWlDaGFyV2lkdGg7CisgIGVsc2UKKyAgICBtX2VDaGFyVHlwZSA9IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uOworCisgIHBDdXJDaGFyLT5tX2lDaGFyV2lkdGggPSBpQ2hhcldpZHRoOworICBpZiAoaUNoYXJXaWR0aCA+IDApCisgICAgbV9wQ3VyTGluZS0+bV9pV2lkdGggKz0gaUNoYXJXaWR0aDsKK30KKwordm9pZCBDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfVGFiKENGWF9DaGFyKiBwQ3VyQ2hhcikgeworICBpZiAoIShtX2R3TGF5b3V0U3R5bGVzICYgRlhfTEFZT1VUU1RZTEVfRXhwYW5kVGFiKSkKKyAgICByZXR1cm47CisKKyAgaW50MzJfdCYgaUxpbmVXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOworICBpbnQzMl90IGlDaGFyV2lkdGggPSBpTGluZVdpZHRoOworICBpZiAoR2V0UG9zaXRpb25lZFRhYigmaUNoYXJXaWR0aCkpCisgICAgaUNoYXJXaWR0aCAtPSBpTGluZVdpZHRoOworICBlbHNlCisgICAgaUNoYXJXaWR0aCA9IG1faVRhYldpZHRoICogKGlMaW5lV2lkdGggLyBtX2lUYWJXaWR0aCArIDEpIC0gaUxpbmVXaWR0aDsKKworICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gaUNoYXJXaWR0aDsKKyAgaUxpbmVXaWR0aCArPSBpQ2hhcldpZHRoOworfQorCitDRlhfQnJlYWtUeXBlIENGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9Db250cm9sKENGWF9DaGFyKiBwQ3VyQ2hhcikgeworICBDRlhfQnJlYWtUeXBlIGR3UmV0MiA9IENGWF9CcmVha1R5cGU6Ok5vbmU7CisgIHN3aXRjaCAocEN1ckNoYXItPmNoYXJfY29kZSgpKSB7CisgICAgY2FzZSBMJ1x2JzoKKyAgICBjYXNlIDB4MjAyODoKKyAgICAgIGR3UmV0MiA9IENGWF9CcmVha1R5cGU6OkxpbmU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEwnXGYnOgorICAgICAgZHdSZXQyID0gQ0ZYX0JyZWFrVHlwZTo6UGFnZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMHgyMDI5OgorICAgICAgZHdSZXQyID0gQ0ZYX0JyZWFrVHlwZTo6UGFyYWdyYXBoOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGlmIChwQ3VyQ2hhci0+Y2hhcl9jb2RlKCkgPT0gbV93UGFyYWdyYXBoQnJlYWtDaGFyKQorICAgICAgICBkd1JldDIgPSBDRlhfQnJlYWtUeXBlOjpQYXJhZ3JhcGg7CisgICAgICBicmVhazsKKyAgfQorICBpZiAoZHdSZXQyICE9IENGWF9CcmVha1R5cGU6Ok5vbmUpCisgICAgZHdSZXQyID0gRW5kQnJlYWsoZHdSZXQyKTsKKworICByZXR1cm4gZHdSZXQyOworfQorCitDRlhfQnJlYWtUeXBlIENGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMoQ0ZYX0NoYXIqIHBDdXJDaGFyKSB7CisgIENGWF9DaGFyKiBwTGFzdENoYXIgPSBudWxscHRyOworICBpbnQzMl90IGlDaGFyV2lkdGggPSAwOworICB3Y2hhcl90IHdGb3JtOworICBib29sIGJBbGVmID0gZmFsc2U7CisgIGlmIChtX2VDaGFyVHlwZSA+PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmICYmCisgICAgICBtX2VDaGFyVHlwZSA8PSBGWF9DSEFSVFlQRV9BcmFiaWNEaXN0b3J0aW9uKSB7CisgICAgcExhc3RDaGFyID0gR2V0TGFzdENoYXIoMSwgZmFsc2UsIHRydWUpOworICAgIGlmIChwTGFzdENoYXIpIHsKKyAgICAgIG1fcEN1ckxpbmUtPm1faVdpZHRoIC09IHBMYXN0Q2hhci0+bV9pQ2hhcldpZHRoOworICAgICAgQ0ZYX0NoYXIqIHBQcmV2Q2hhciA9IEdldExhc3RDaGFyKDIsIGZhbHNlLCB0cnVlKTsKKyAgICAgIHdGb3JtID0gcGRmaXVtOjphcmFiaWM6OkdldEZvcm1DaGFyKHBMYXN0Q2hhciwgcFByZXZDaGFyLCBwQ3VyQ2hhcik7CisgICAgICBiQWxlZiA9ICh3Rm9ybSA9PSAweEZFRkYgJiYKKyAgICAgICAgICAgICAgIHBMYXN0Q2hhci0+R2V0Q2hhclR5cGUoKSA9PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmKTsKKyAgICAgIGlmICghbV9wRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpQ2hhcldpZHRoKSAmJgorICAgICAgICAgICFtX3BGb250LT5HZXRDaGFyV2lkdGgocExhc3RDaGFyLT5jaGFyX2NvZGUoKSwgaUNoYXJXaWR0aCkpIHsKKyAgICAgICAgaUNoYXJXaWR0aCA9IG1faURlZkNoYXI7CisgICAgICB9CisKKyAgICAgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7CisgICAgICBpQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIG1faUhvcml6b250YWxTY2FsZSAvIDEwMDsKKyAgICAgIHBMYXN0Q2hhci0+bV9pQ2hhcldpZHRoID0gaUNoYXJXaWR0aDsKKyAgICAgIG1fcEN1ckxpbmUtPm1faVdpZHRoICs9IGlDaGFyV2lkdGg7CisgICAgICBpQ2hhcldpZHRoID0gMDsKKyAgICB9CisgIH0KKworICB3Rm9ybSA9IHBkZml1bTo6YXJhYmljOjpHZXRGb3JtQ2hhcihwQ3VyQ2hhciwgYkFsZWYgPyBudWxscHRyIDogcExhc3RDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgaWYgKCFtX3BGb250LT5HZXRDaGFyV2lkdGgod0Zvcm0sIGlDaGFyV2lkdGgpICYmCisgICAgICAhbV9wRm9udC0+R2V0Q2hhcldpZHRoKHBDdXJDaGFyLT5jaGFyX2NvZGUoKSwgaUNoYXJXaWR0aCkpIHsKKyAgICBpQ2hhcldpZHRoID0gbV9pRGVmQ2hhcjsKKyAgfQorCisgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7CisgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yaXpvbnRhbFNjYWxlIC8gMTAwOworICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gaUNoYXJXaWR0aDsKKyAgbV9wQ3VyTGluZS0+bV9pV2lkdGggKz0gaUNoYXJXaWR0aDsKKyAgbV9wQ3VyTGluZS0+bV9pQXJhYmljQ2hhcnMrKzsKKworICBpZiAobV9wQ3VyTGluZS0+R2V0TGluZUVuZCgpID4gbV9pTGluZVdpZHRoICsgbV9pVG9sZXJhbmNlKQorICAgIHJldHVybiBFbmRCcmVhayhDRlhfQnJlYWtUeXBlOjpMaW5lKTsKKyAgcmV0dXJuIENGWF9CcmVha1R5cGU6Ok5vbmU7Cit9CisKK0NGWF9CcmVha1R5cGUgQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX090aGVycyhDRlhfQ2hhciogcEN1ckNoYXIpIHsKKyAgRlhfQ0hBUlRZUEUgY2hhcnR5cGUgPSBwQ3VyQ2hhci0+R2V0Q2hhclR5cGUoKTsKKyAgd2NoYXJfdCB3Rm9ybSA9IHBDdXJDaGFyLT5jaGFyX2NvZGUoKTsKKyAgaW50MzJfdCBpQ2hhcldpZHRoID0gMDsKKyAgaWYgKCFtX3BGb250LT5HZXRDaGFyV2lkdGgod0Zvcm0sIGlDaGFyV2lkdGgpKQorICAgIGlDaGFyV2lkdGggPSBtX2lEZWZDaGFyOworCisgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7CisgIGlDaGFyV2lkdGggKj0gbV9pSG9yaXpvbnRhbFNjYWxlIC8gMTAwOworICBpQ2hhcldpZHRoICs9IG1faUNoYXJTcGFjZTsKKworICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gaUNoYXJXaWR0aDsKKyAgbV9wQ3VyTGluZS0+bV9pV2lkdGggKz0gaUNoYXJXaWR0aDsKKyAgaWYgKGNoYXJ0eXBlICE9IEZYX0NIQVJUWVBFX1NwYWNlICYmCisgICAgICBtX3BDdXJMaW5lLT5HZXRMaW5lRW5kKCkgPiBtX2lMaW5lV2lkdGggKyBtX2lUb2xlcmFuY2UpIHsKKyAgICByZXR1cm4gRW5kQnJlYWsoQ0ZYX0JyZWFrVHlwZTo6TGluZSk7CisgIH0KKyAgcmV0dXJuIENGWF9CcmVha1R5cGU6Ok5vbmU7Cit9CisKK0NGWF9CcmVha1R5cGUgQ0ZYX1JURkJyZWFrOjpFbmRCcmVhayhDRlhfQnJlYWtUeXBlIGR3U3RhdHVzKSB7CisgIEFTU0VSVChkd1N0YXR1cyAhPSBDRlhfQnJlYWtUeXBlOjpOb25lKTsKKworICArK21fZHdJZGVudGl0eTsKKyAgaWYgKCFtX3BDdXJMaW5lLT5tX0xpbmVQaWVjZXMuZW1wdHkoKSkgeworICAgIGlmIChkd1N0YXR1cyAhPSBDRlhfQnJlYWtUeXBlOjpQaWVjZSkKKyAgICAgIG1fcEN1ckxpbmUtPm1fTGluZVBpZWNlcy5iYWNrKCkubV9kd1N0YXR1cyA9IGR3U3RhdHVzOworICAgIHJldHVybiBtX3BDdXJMaW5lLT5tX0xpbmVQaWVjZXMuYmFjaygpLm1fZHdTdGF0dXM7CisgIH0KKworICBpZiAoSGFzTGluZSgpKSB7CisgICAgaWYgKCFtX0xpbmVbbV9pUmVhZHlMaW5lSW5kZXhdLm1fTGluZVBpZWNlcy5lbXB0eSgpKSB7CisgICAgICBpZiAoZHdTdGF0dXMgIT0gQ0ZYX0JyZWFrVHlwZTo6UGllY2UpCisgICAgICAgIG1fTGluZVttX2lSZWFkeUxpbmVJbmRleF0ubV9MaW5lUGllY2VzLmJhY2soKS5tX2R3U3RhdHVzID0gZHdTdGF0dXM7CisgICAgICByZXR1cm4gbV9MaW5lW21faVJlYWR5TGluZUluZGV4XS5tX0xpbmVQaWVjZXMuYmFjaygpLm1fZHdTdGF0dXM7CisgICAgfQorICAgIHJldHVybiBDRlhfQnJlYWtUeXBlOjpOb25lOworICB9CisKKyAgaW50MzJfdCBpQ291bnQgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCk7CisgIGlmIChpQ291bnQgPCAxKQorICAgIHJldHVybiBDRlhfQnJlYWtUeXBlOjpOb25lOworCisgIENGWF9DaGFyKiB0YyA9IG1fcEN1ckxpbmUtPkdldENoYXIoaUNvdW50IC0gMSk7CisgIHRjLT5tX2R3U3RhdHVzID0gZHdTdGF0dXM7CisgIGlmIChkd1N0YXR1cyA9PSBDRlhfQnJlYWtUeXBlOjpQaWVjZSkKKyAgICByZXR1cm4gZHdTdGF0dXM7CisKKyAgbV9pUmVhZHlMaW5lSW5kZXggPSBtX3BDdXJMaW5lID09ICZtX0xpbmVbMF0gPyAwIDogMTsKKyAgQ0ZYX0JyZWFrTGluZSogcE5leHRMaW5lID0gJm1fTGluZVsxIC0gbV9pUmVhZHlMaW5lSW5kZXhdOworICBib29sIGJBbGxDaGFycyA9IG1faUFsaWdubWVudCA9PSBDRlhfUlRGTGluZUFsaWdubWVudDo6SnVzdGlmaWVkIHx8CisgICAgICAgICAgICAgICAgICAgbV9pQWxpZ25tZW50ID09IENGWF9SVEZMaW5lQWxpZ25tZW50OjpEaXN0cmlidXRlZDsKKworICBpZiAoIUVuZEJyZWFrX1NwbGl0TGluZShwTmV4dExpbmUsIGJBbGxDaGFycywgZHdTdGF0dXMpKSB7CisgICAgc3RkOjpkZXF1ZTxGWF9UUE8+IHRwb3M7CisgICAgRW5kQnJlYWtfQmlkaUxpbmUoJnRwb3MsIGR3U3RhdHVzKTsKKyAgICBpZiAoIW1fYlBhZ2luYXRpb24gJiYgbV9pQWxpZ25tZW50ICE9IENGWF9SVEZMaW5lQWxpZ25tZW50OjpMZWZ0KQorICAgICAgRW5kQnJlYWtfQWxpZ25tZW50KHRwb3MsIGJBbGxDaGFycywgZHdTdGF0dXMpOworICB9CisgIG1fcEN1ckxpbmUgPSBwTmV4dExpbmU7CisgIG1fcEN1ckxpbmUtPm1faVN0YXJ0ID0gbV9pTGluZVN0YXJ0OworCisgIENGWF9DaGFyKiBwVEMgPSBHZXRMYXN0Q2hhcigwLCBmYWxzZSwgdHJ1ZSk7CisgIG1fZUNoYXJUeXBlID0gcFRDID8gcFRDLT5HZXRDaGFyVHlwZSgpIDogRlhfQ0hBUlRZUEVfVW5rbm93bjsKKyAgcmV0dXJuIGR3U3RhdHVzOworfQorCitib29sIENGWF9SVEZCcmVhazo6RW5kQnJlYWtfU3BsaXRMaW5lKENGWF9CcmVha0xpbmUqIHBOZXh0TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWxsQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CcmVha1R5cGUgZHdTdGF0dXMpIHsKKyAgYm9vbCBiRG9uZSA9IGZhbHNlOworICBpZiAobV9wQ3VyTGluZS0+R2V0TGluZUVuZCgpID4gbV9pTGluZVdpZHRoICsgbV9pVG9sZXJhbmNlKSB7CisgICAgY29uc3QgQ0ZYX0NoYXIqIHRjID0gbV9wQ3VyTGluZS0+R2V0Q2hhcihtX3BDdXJMaW5lLT5Db3VudENoYXJzKCkgLSAxKTsKKyAgICBzd2l0Y2ggKHRjLT5HZXRDaGFyVHlwZSgpKSB7CisgICAgICBjYXNlIEZYX0NIQVJUWVBFX1RhYjoKKyAgICAgIGNhc2UgRlhfQ0hBUlRZUEVfQ29udHJvbDoKKyAgICAgIGNhc2UgRlhfQ0hBUlRZUEVfU3BhY2U6CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgU3BsaXRUZXh0TGluZShtX3BDdXJMaW5lLCBwTmV4dExpbmUsICFtX2JQYWdpbmF0aW9uICYmIGJBbGxDaGFycyk7CisgICAgICAgIGJEb25lID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKCFtX2JQYWdpbmF0aW9uKSB7CisgICAgaWYgKGJBbGxDaGFycyAmJiAhYkRvbmUpIHsKKyAgICAgIGludDMyX3QgZW5kUG9zID0gbV9wQ3VyTGluZS0+R2V0TGluZUVuZCgpOworICAgICAgR2V0QnJlYWtQb3MobV9wQ3VyTGluZS0+bV9MaW5lQ2hhcnMsIGVuZFBvcywgYkFsbENoYXJzLCB0cnVlKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgY29uc3QgQ0ZYX0NoYXIqIHBDdXJDaGFycyA9IG1fcEN1ckxpbmUtPm1fTGluZUNoYXJzLmRhdGEoKTsKKyAgQ0ZYX0JyZWFrUGllY2UgdHA7CisgIHRwLm1fcENoYXJzID0gJm1fcEN1ckxpbmUtPm1fTGluZUNoYXJzOworICBib29sIGJOZXcgPSB0cnVlOworICB1aW50MzJfdCBkd0lkZW50aXR5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KC0xKTsKKyAgaW50MzJfdCBpTGFzdCA9IG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKSAtIDE7CisgIGludDMyX3QgaiA9IDA7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8PSBpTGFzdDspIHsKKyAgICBjb25zdCBDRlhfQ2hhciogcFRDID0gcEN1ckNoYXJzICsgaTsKKyAgICBpZiAoYk5ldykgeworICAgICAgdHAubV9pU3RhcnRDaGFyID0gaTsKKyAgICAgIHRwLm1faVN0YXJ0UG9zICs9IHRwLm1faVdpZHRoOworICAgICAgdHAubV9pV2lkdGggPSAwOworICAgICAgdHAubV9kd1N0YXR1cyA9IHBUQy0+bV9kd1N0YXR1czsKKyAgICAgIHRwLm1faUZvbnRTaXplID0gcFRDLT5tX2lGb250U2l6ZTsKKyAgICAgIHRwLm1faUhvcml6b250YWxTY2FsZSA9IHBUQy0+aG9yaXpvbmFsX3NjYWxlKCk7CisgICAgICB0cC5tX2lWZXJ0aWNhbFNjYWxlID0gcFRDLT52ZXJ0aWNhbF9zY2FsZSgpOworICAgICAgZHdJZGVudGl0eSA9IHBUQy0+bV9kd0lkZW50aXR5OworICAgICAgdHAubV9kd0lkZW50aXR5ID0gZHdJZGVudGl0eTsKKyAgICAgIHRwLm1fcFVzZXJEYXRhID0gcFRDLT5tX3BVc2VyRGF0YS5BczxDWEZBX1RleHRVc2VyRGF0YT4oKTsKKyAgICAgIGogPSBpOworICAgICAgYk5ldyA9IGZhbHNlOworICAgIH0KKworICAgIGlmIChpID09IGlMYXN0IHx8IHBUQy0+bV9kd1N0YXR1cyAhPSBDRlhfQnJlYWtUeXBlOjpOb25lIHx8CisgICAgICAgIHBUQy0+bV9kd0lkZW50aXR5ICE9IGR3SWRlbnRpdHkpIHsKKyAgICAgIHRwLm1faUNoYXJzID0gaSAtIGo7CisgICAgICBpZiAocFRDLT5tX2R3SWRlbnRpdHkgPT0gZHdJZGVudGl0eSkgeworICAgICAgICB0cC5tX2R3U3RhdHVzID0gcFRDLT5tX2R3U3RhdHVzOworICAgICAgICB0cC5tX2lXaWR0aCArPSBwVEMtPm1faUNoYXJXaWR0aDsKKyAgICAgICAgdHAubV9pQ2hhcnMgKz0gMTsKKyAgICAgICAgKytpOworICAgICAgfQorICAgICAgbV9wQ3VyTGluZS0+bV9MaW5lUGllY2VzLnB1c2hfYmFjayh0cCk7CisgICAgICBiTmV3ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgdHAubV9pV2lkdGggKz0gcFRDLT5tX2lDaGFyV2lkdGg7CisgICAgICArK2k7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENGWF9SVEZCcmVhazo6RW5kQnJlYWtfQmlkaUxpbmUoc3RkOjpkZXF1ZTxGWF9UUE8+KiB0cG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CcmVha1R5cGUgZHdTdGF0dXMpIHsKKyAgQ0ZYX0NoYXIqIHBUQzsKKyAgc3RkOjp2ZWN0b3I8Q0ZYX0NoYXI+JiBjaGFycyA9IG1fcEN1ckxpbmUtPm1fTGluZUNoYXJzOworICBpbnQzMl90IGlDb3VudCA9IG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsKKyAgaWYgKCFtX2JQYWdpbmF0aW9uICYmIG1fcEN1ckxpbmUtPm1faUFyYWJpY0NoYXJzID4gMCkgeworICAgIEFTU0VSVChpQ291bnQgPj0gMCk7CisKKyAgICBzaXplX3QgaUJpZGlOdW0gPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGljX2Nhc3Q8c2l6ZV90PihpQ291bnQpOyArK2kpIHsKKyAgICAgIHBUQyA9ICZjaGFyc1tpXTsKKyAgICAgIHBUQy0+bV9pQmlkaVBvcyA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGkpOworICAgICAgaWYgKHBUQy0+R2V0Q2hhclR5cGUoKSAhPSBGWF9DSEFSVFlQRV9Db250cm9sKQorICAgICAgICBpQmlkaU51bSA9IGk7CisgICAgICBpZiAoaSA9PSAwKQorICAgICAgICBwVEMtPm1faUJpZGlMZXZlbCA9IDE7CisgICAgfQorICAgIEZYX0JpZGlMaW5lKCZjaGFycywgaUJpZGlOdW0gKyAxKTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7ICsraSkgeworICAgICAgcFRDID0gJmNoYXJzW2ldOworICAgICAgcFRDLT5tX2lCaWRpTGV2ZWwgPSAwOworICAgICAgcFRDLT5tX2lCaWRpUG9zID0gMDsKKyAgICAgIHBUQy0+bV9pQmlkaU9yZGVyID0gMDsKKyAgICB9CisgIH0KKworICBDRlhfQnJlYWtQaWVjZSB0cDsKKyAgdHAubV9kd1N0YXR1cyA9IENGWF9CcmVha1R5cGU6OlBpZWNlOworICB0cC5tX2lTdGFydFBvcyA9IG1fcEN1ckxpbmUtPm1faVN0YXJ0OworICB0cC5tX3BDaGFycyA9ICZjaGFyczsKKworICBpbnQzMl90IGlCaWRpTGV2ZWwgPSAtMTsKKyAgaW50MzJfdCBpQ2hhcldpZHRoOworICBGWF9UUE8gdHBvOworICB1aW50MzJfdCBkd0lkZW50aXR5ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KC0xKTsKKyAgaW50MzJfdCBpID0gMDsKKyAgaW50MzJfdCBqID0gMDsKKyAgd2hpbGUgKGkgPCBpQ291bnQpIHsKKyAgICBwVEMgPSAmY2hhcnNbaV07CisgICAgaWYgKGlCaWRpTGV2ZWwgPCAwKSB7CisgICAgICBpQmlkaUxldmVsID0gcFRDLT5tX2lCaWRpTGV2ZWw7CisgICAgICBpQ2hhcldpZHRoID0gcFRDLT5tX2lDaGFyV2lkdGg7CisgICAgICB0cC5tX2lXaWR0aCA9IGlDaGFyV2lkdGggPCAxID8gMCA6IGlDaGFyV2lkdGg7CisgICAgICB0cC5tX2lCaWRpTGV2ZWwgPSBpQmlkaUxldmVsOworICAgICAgdHAubV9pQmlkaVBvcyA9IHBUQy0+bV9pQmlkaU9yZGVyOworICAgICAgdHAubV9pRm9udFNpemUgPSBwVEMtPm1faUZvbnRTaXplOworICAgICAgdHAubV9pSG9yaXpvbnRhbFNjYWxlID0gcFRDLT5ob3Jpem9uYWxfc2NhbGUoKTsKKyAgICAgIHRwLm1faVZlcnRpY2FsU2NhbGUgPSBwVEMtPnZlcnRpY2FsX3NjYWxlKCk7CisgICAgICBkd0lkZW50aXR5ID0gcFRDLT5tX2R3SWRlbnRpdHk7CisgICAgICB0cC5tX2R3SWRlbnRpdHkgPSBkd0lkZW50aXR5OworICAgICAgdHAubV9wVXNlckRhdGEgPSBwVEMtPm1fcFVzZXJEYXRhLkFzPENYRkFfVGV4dFVzZXJEYXRhPigpOworICAgICAgdHAubV9kd1N0YXR1cyA9IENGWF9CcmVha1R5cGU6OlBpZWNlOworICAgICAgKytpOworICAgIH0gZWxzZSBpZiAoaUJpZGlMZXZlbCAhPSBwVEMtPm1faUJpZGlMZXZlbCB8fAorICAgICAgICAgICAgICAgcFRDLT5tX2R3SWRlbnRpdHkgIT0gZHdJZGVudGl0eSkgeworICAgICAgdHAubV9pQ2hhcnMgPSBpIC0gdHAubV9pU3RhcnRDaGFyOworICAgICAgbV9wQ3VyTGluZS0+bV9MaW5lUGllY2VzLnB1c2hfYmFjayh0cCk7CisKKyAgICAgIHRwLm1faVN0YXJ0UG9zICs9IHRwLm1faVdpZHRoOworICAgICAgdHAubV9pU3RhcnRDaGFyID0gaTsKKyAgICAgIHRwby5pbmRleCA9IGorKzsKKyAgICAgIHRwby5wb3MgPSB0cC5tX2lCaWRpUG9zOworICAgICAgdHBvcy0+cHVzaF9iYWNrKHRwbyk7CisgICAgICBpQmlkaUxldmVsID0gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgIGlDaGFyV2lkdGggPSBwVEMtPm1faUNoYXJXaWR0aDsKKyAgICAgIGlmIChpQ2hhcldpZHRoID4gMCkKKyAgICAgICAgdHAubV9pV2lkdGggKz0gaUNoYXJXaWR0aDsKKyAgICAgICsraTsKKyAgICB9CisgIH0KKworICBpZiAoaSA+IHRwLm1faVN0YXJ0Q2hhcikgeworICAgIHRwLm1fZHdTdGF0dXMgPSBkd1N0YXR1czsKKyAgICB0cC5tX2lDaGFycyA9IGkgLSB0cC5tX2lTdGFydENoYXI7CisgICAgbV9wQ3VyTGluZS0+bV9MaW5lUGllY2VzLnB1c2hfYmFjayh0cCk7CisKKyAgICB0cG8uaW5kZXggPSBqOworICAgIHRwby5wb3MgPSB0cC5tX2lCaWRpUG9zOworICAgIHRwb3MtPnB1c2hfYmFjayh0cG8pOworICB9CisKKyAgc3RkOjpzb3J0KHRwb3MtPmJlZ2luKCksIHRwb3MtPmVuZCgpKTsKKyAgaW50MzJfdCBpU3RhcnRQb3MgPSBtX3BDdXJMaW5lLT5tX2lTdGFydDsKKyAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICp0cG9zKSB7CisgICAgQ0ZYX0JyZWFrUGllY2UmIHR0cCA9IG1fcEN1ckxpbmUtPm1fTGluZVBpZWNlc1tpdC5pbmRleF07CisgICAgdHRwLm1faVN0YXJ0UG9zID0gaVN0YXJ0UG9zOworICAgIGlTdGFydFBvcyArPSB0dHAubV9pV2lkdGg7CisgIH0KK30KKwordm9pZCBDRlhfUlRGQnJlYWs6OkVuZEJyZWFrX0FsaWdubWVudChjb25zdCBzdGQ6OmRlcXVlPEZYX1RQTz4mIHRwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFsbENoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnJlYWtUeXBlIGR3U3RhdHVzKSB7CisgIGludDMyX3QgaU5ldFdpZHRoID0gbV9wQ3VyTGluZS0+bV9pV2lkdGg7CisgIGludDMyX3QgaUdhcENoYXJzID0gMDsKKyAgYm9vbCBiRmluZCA9IGZhbHNlOworICBmb3IgKGF1dG8gaXQgPSB0cG9zLnJiZWdpbigpOyBpdCAhPSB0cG9zLnJlbmQoKTsgaXQrKykgeworICAgIENGWF9CcmVha1BpZWNlJiB0dHAgPSBtX3BDdXJMaW5lLT5tX0xpbmVQaWVjZXNbaXQtPmluZGV4XTsKKyAgICBpZiAoIWJGaW5kKQorICAgICAgaU5ldFdpZHRoID0gdHRwLkdldEVuZFBvcygpOworCisgICAgYm9vbCBiQXJhYmljID0gRlhfSXNPZGQodHRwLm1faUJpZGlMZXZlbCk7CisgICAgaW50MzJfdCBqID0gYkFyYWJpYyA/IDAgOiB0dHAubV9pQ2hhcnMgLSAxOworICAgIHdoaWxlIChqID4gLTEgJiYgaiA8IHR0cC5tX2lDaGFycykgeworICAgICAgY29uc3QgQ0ZYX0NoYXIqIHRjID0gdHRwLkdldENoYXIoaik7CisgICAgICBpZiAodGMtPm1fbkJyZWFrVHlwZSA9PSBGWF9MQlRfRElSRUNUX0JSSykKKyAgICAgICAgKytpR2FwQ2hhcnM7CisKKyAgICAgIGlmICghYkZpbmQgfHwgIWJBbGxDaGFycykgeworICAgICAgICB1aW50MzJfdCBkd0NoYXJUeXBlID0gdGMtPkdldENoYXJUeXBlKCk7CisgICAgICAgIGlmIChkd0NoYXJUeXBlID09IEZYX0NIQVJUWVBFX1NwYWNlIHx8CisgICAgICAgICAgICBkd0NoYXJUeXBlID09IEZYX0NIQVJUWVBFX0NvbnRyb2wpIHsKKyAgICAgICAgICBpZiAoIWJGaW5kKSB7CisgICAgICAgICAgICBpbnQzMl90IGlDaGFyV2lkdGggPSB0Yy0+bV9pQ2hhcldpZHRoOworICAgICAgICAgICAgaWYgKGJBbGxDaGFycyAmJiBpQ2hhcldpZHRoID4gMCkKKyAgICAgICAgICAgICAgaU5ldFdpZHRoIC09IGlDaGFyV2lkdGg7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJGaW5kID0gdHJ1ZTsKKyAgICAgICAgICBpZiAoIWJBbGxDaGFycykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBqICs9IGJBcmFiaWMgPyAxIDogLTE7CisgICAgfQorICAgIGlmICghYkFsbENoYXJzICYmIGJGaW5kKQorICAgICAgYnJlYWs7CisgIH0KKworICBpbnQzMl90IGlPZmZzZXQgPSBtX2lMaW5lV2lkdGggLSBpTmV0V2lkdGg7CisgIGlmIChpR2FwQ2hhcnMgPiAwICYmIChtX2lBbGlnbm1lbnQgPT0gQ0ZYX1JURkxpbmVBbGlnbm1lbnQ6OkRpc3RyaWJ1dGVkIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAobV9pQWxpZ25tZW50ID09IENGWF9SVEZMaW5lQWxpZ25tZW50OjpKdXN0aWZpZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXR1cyAhPSBDRlhfQnJlYWtUeXBlOjpQYXJhZ3JhcGgpKSkgeworICAgIGludDMyX3QgaVN0YXJ0ID0gLTE7CisgICAgZm9yIChjb25zdCBhdXRvJiB0cG8gOiB0cG9zKSB7CisgICAgICBDRlhfQnJlYWtQaWVjZSYgdHRwID0gbV9wQ3VyTGluZS0+bV9MaW5lUGllY2VzW3Rwby5pbmRleF07CisgICAgICBpZiAoaVN0YXJ0IDwgMCkKKyAgICAgICAgaVN0YXJ0ID0gdHRwLm1faVN0YXJ0UG9zOworICAgICAgZWxzZQorICAgICAgICB0dHAubV9pU3RhcnRQb3MgPSBpU3RhcnQ7CisKKyAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHR0cC5tX2lDaGFyczsgKytqKSB7CisgICAgICAgIENGWF9DaGFyKiB0YyA9IHR0cC5HZXRDaGFyKGopOworICAgICAgICBpZiAodGMtPm1fbkJyZWFrVHlwZSAhPSBGWF9MQlRfRElSRUNUX0JSSyB8fCB0Yy0+bV9pQ2hhcldpZHRoIDwgMCkKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpbnQzMl90IGsgPSBpT2Zmc2V0IC8gaUdhcENoYXJzOworICAgICAgICB0Yy0+bV9pQ2hhcldpZHRoICs9IGs7CisgICAgICAgIHR0cC5tX2lXaWR0aCArPSBrOworICAgICAgICBpT2Zmc2V0IC09IGs7CisgICAgICAgIC0taUdhcENoYXJzOworICAgICAgICBpZiAoaUdhcENoYXJzIDwgMSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlTdGFydCArPSB0dHAubV9pV2lkdGg7CisgICAgfQorICB9IGVsc2UgaWYgKG1faUFsaWdubWVudCA9PSBDRlhfUlRGTGluZUFsaWdubWVudDo6UmlnaHQgfHwKKyAgICAgICAgICAgICBtX2lBbGlnbm1lbnQgPT0gQ0ZYX1JURkxpbmVBbGlnbm1lbnQ6OkNlbnRlcikgeworICAgIGlmIChtX2lBbGlnbm1lbnQgPT0gQ0ZYX1JURkxpbmVBbGlnbm1lbnQ6OkNlbnRlcikKKyAgICAgIGlPZmZzZXQgLz0gMjsKKyAgICBpZiAoaU9mZnNldCA+IDApIHsKKyAgICAgIGZvciAoYXV0byYgdHRwIDogbV9wQ3VyTGluZS0+bV9MaW5lUGllY2VzKQorICAgICAgICB0dHAubV9pU3RhcnRQb3MgKz0gaU9mZnNldDsKKyAgICB9CisgIH0KK30KKworaW50MzJfdCBDRlhfUlRGQnJlYWs6OkdldEJyZWFrUG9zKHN0ZDo6dmVjdG9yPENGWF9DaGFyPiYgdGNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlFbmRQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWxsQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiT25seUJyaykgeworICBpbnQzMl90IGlMZW5ndGggPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHRjYSkgLSAxOworICBpZiAoaUxlbmd0aCA8IDEpCisgICAgcmV0dXJuIGlMZW5ndGg7CisKKyAgaW50MzJfdCBpQnJlYWsgPSAtMTsKKyAgaW50MzJfdCBpQnJlYWtQb3MgPSAtMTsKKyAgaW50MzJfdCBpSW5kaXJlY3QgPSAtMTsKKyAgaW50MzJfdCBpSW5kaXJlY3RQb3MgPSAtMTsKKyAgaW50MzJfdCBpTGFzdCA9IC0xOworICBpbnQzMl90IGlMYXN0UG9zID0gLTE7CisgIGlmIChpRW5kUG9zIDw9IG1faUxpbmVXaWR0aCkgeworICAgIGlmICghYkFsbENoYXJzKQorICAgICAgcmV0dXJuIGlMZW5ndGg7CisKKyAgICBpQnJlYWsgPSBpTGVuZ3RoOworICAgIGlCcmVha1BvcyA9IGlFbmRQb3M7CisgIH0KKworICBDRlhfQ2hhciogcENoYXJBcnJheSA9IHRjYS5kYXRhKCk7CisgIENGWF9DaGFyKiBwQ3VyID0gcENoYXJBcnJheSArIGlMZW5ndGg7CisgIC0taUxlbmd0aDsKKyAgaWYgKGJBbGxDaGFycykKKyAgICBwQ3VyLT5tX25CcmVha1R5cGUgPSBGWF9MQlRfVU5LTk9XTjsKKworICB1aW50MzJfdCBuQ29kZVByb3AgPSBwQ3VyLT5jaGFyX3Byb3BzKCk7CisgIHVpbnQzMl90IG5OZXh0ID0gbkNvZGVQcm9wICYgMHgwMDNGOworICBpbnQzMl90IGlDaGFyV2lkdGggPSBwQ3VyLT5tX2lDaGFyV2lkdGg7CisgIGlmIChpQ2hhcldpZHRoID4gMCkKKyAgICBpRW5kUG9zIC09IGlDaGFyV2lkdGg7CisKKyAgd2hpbGUgKGlMZW5ndGggPj0gMCkgeworICAgIHBDdXIgPSBwQ2hhckFycmF5ICsgaUxlbmd0aDsKKyAgICBuQ29kZVByb3AgPSBwQ3VyLT5jaGFyX3Byb3BzKCk7CisgICAgdWludDMyX3QgbkN1ciA9IG5Db2RlUHJvcCAmIDB4MDAzRjsKKyAgICBib29sIGJOZWVkQnJlYWsgPSBmYWxzZTsKKyAgICBGWF9MSU5FQlJFQUtUWVBFIGVUeXBlOworICAgIGlmIChuQ3VyID09IGtCcmVha1Byb3BlcnR5VEIpIHsKKyAgICAgIGJOZWVkQnJlYWsgPSB0cnVlOworICAgICAgZVR5cGUgPSBuTmV4dCA9PSBrQnJlYWtQcm9wZXJ0eVRCCisgICAgICAgICAgICAgICAgICA/IEZYX0xCVF9QUk9ISUJJVEVEX0JSSworICAgICAgICAgICAgICAgICAgOiBnc19GWF9MaW5lQnJlYWtfUGFpclRhYmxlW25DdXJdW25OZXh0XTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKG5DdXIgPT0ga0JyZWFrUHJvcGVydHlTcGFjZSkKKyAgICAgICAgYk5lZWRCcmVhayA9IHRydWU7CisKKyAgICAgIGVUeXBlID0gbk5leHQgPT0ga0JyZWFrUHJvcGVydHlTcGFjZQorICAgICAgICAgICAgICAgICAgPyBGWF9MQlRfUFJPSElCSVRFRF9CUksKKyAgICAgICAgICAgICAgICAgIDogZ3NfRlhfTGluZUJyZWFrX1BhaXJUYWJsZVtuQ3VyXVtuTmV4dF07CisgICAgfQorICAgIGlmIChiQWxsQ2hhcnMpCisgICAgICBwQ3VyLT5tX25CcmVha1R5cGUgPSBlVHlwZTsKKworICAgIGlmICghYk9ubHlCcmspIHsKKyAgICAgIGlDaGFyV2lkdGggPSBwQ3VyLT5tX2lDaGFyV2lkdGg7CisgICAgICBpZiAoaUVuZFBvcyA8PSBtX2lMaW5lV2lkdGggfHwgYk5lZWRCcmVhaykgeworICAgICAgICBpZiAoZVR5cGUgPT0gRlhfTEJUX0RJUkVDVF9CUksgJiYgaUJyZWFrIDwgMCkgeworICAgICAgICAgIGlCcmVhayA9IGlMZW5ndGg7CisgICAgICAgICAgaUJyZWFrUG9zID0gaUVuZFBvczsKKyAgICAgICAgICBpZiAoIWJBbGxDaGFycykKKyAgICAgICAgICAgIHJldHVybiBpTGVuZ3RoOworICAgICAgICB9IGVsc2UgaWYgKGVUeXBlID09IEZYX0xCVF9JTkRJUkVDVF9CUksgJiYgaUluZGlyZWN0IDwgMCkgeworICAgICAgICAgIGlJbmRpcmVjdCA9IGlMZW5ndGg7CisgICAgICAgICAgaUluZGlyZWN0UG9zID0gaUVuZFBvczsKKyAgICAgICAgfQorICAgICAgICBpZiAoaUxhc3QgPCAwKSB7CisgICAgICAgICAgaUxhc3QgPSBpTGVuZ3RoOworICAgICAgICAgIGlMYXN0UG9zID0gaUVuZFBvczsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGlDaGFyV2lkdGggPiAwKQorICAgICAgICBpRW5kUG9zIC09IGlDaGFyV2lkdGg7CisgICAgfQorICAgIG5OZXh0ID0gbkNvZGVQcm9wICYgMHgwMDNGOworICAgIC0taUxlbmd0aDsKKyAgfQorICBpZiAoYk9ubHlCcmspCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKGlCcmVhayA+IC0xKSB7CisgICAgaUVuZFBvcyA9IGlCcmVha1BvczsKKyAgICByZXR1cm4gaUJyZWFrOworICB9CisgIGlmIChpSW5kaXJlY3QgPiAtMSkgeworICAgIGlFbmRQb3MgPSBpSW5kaXJlY3RQb3M7CisgICAgcmV0dXJuIGlJbmRpcmVjdDsKKyAgfQorICBpZiAoaUxhc3QgPiAtMSkgeworICAgIGlFbmRQb3MgPSBpTGFzdFBvczsKKyAgICByZXR1cm4gaUxhc3Q7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQ0ZYX1JURkJyZWFrOjpTcGxpdFRleHRMaW5lKENGWF9CcmVha0xpbmUqIHBDdXJMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0JyZWFrTGluZSogcE5leHRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWxsQ2hhcnMpIHsKKyAgQVNTRVJUKHBDdXJMaW5lICYmIHBOZXh0TGluZSk7CisgIGludDMyX3QgaUNvdW50ID0gcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsKKyAgaWYgKGlDb3VudCA8IDIpCisgICAgcmV0dXJuOworCisgIGludDMyX3QgaUVuZFBvcyA9IHBDdXJMaW5lLT5HZXRMaW5lRW5kKCk7CisgIHN0ZDo6dmVjdG9yPENGWF9DaGFyPiYgY3VyQ2hhcnMgPSBwQ3VyTGluZS0+bV9MaW5lQ2hhcnM7CisgIGludDMyX3QgaUNoYXJQb3MgPSBHZXRCcmVha1BvcyhjdXJDaGFycywgaUVuZFBvcywgYkFsbENoYXJzLCBmYWxzZSk7CisgIGlmIChpQ2hhclBvcyA8IDApCisgICAgaUNoYXJQb3MgPSAwOworCisgICsraUNoYXJQb3M7CisgIGlmIChpQ2hhclBvcyA+PSBpQ291bnQpIHsKKyAgICBwTmV4dExpbmUtPkNsZWFyKCk7CisgICAgY3VyQ2hhcnNbaUNoYXJQb3MgLSAxXS5tX25CcmVha1R5cGUgPSBGWF9MQlRfVU5LTk9XTjsKKyAgICByZXR1cm47CisgIH0KKworICBwTmV4dExpbmUtPm1fTGluZUNoYXJzID0KKyAgICAgIHN0ZDo6dmVjdG9yPENGWF9DaGFyPihjdXJDaGFycy5iZWdpbigpICsgaUNoYXJQb3MsIGN1ckNoYXJzLmVuZCgpKTsKKyAgY3VyQ2hhcnMuZXJhc2UoY3VyQ2hhcnMuYmVnaW4oKSArIGlDaGFyUG9zLCBjdXJDaGFycy5lbmQoKSk7CisgIHBOZXh0TGluZS0+bV9pU3RhcnQgPSBwQ3VyTGluZS0+bV9pU3RhcnQ7CisgIHBOZXh0TGluZS0+bV9pV2lkdGggPSBwQ3VyTGluZS0+R2V0TGluZUVuZCgpIC0gaUVuZFBvczsKKyAgcEN1ckxpbmUtPm1faVdpZHRoID0gaUVuZFBvczsKKyAgY3VyQ2hhcnNbaUNoYXJQb3MgLSAxXS5tX25CcmVha1R5cGUgPSBGWF9MQlRfVU5LTk9XTjsKKworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBOZXh0TGluZS0+bV9MaW5lQ2hhcnMuc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAocE5leHRMaW5lLT5tX0xpbmVDaGFyc1tpXS5HZXRDaGFyVHlwZSgpID49IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpIHsKKyAgICAgIHBDdXJMaW5lLT5tX2lBcmFiaWNDaGFycy0tOworICAgICAgcE5leHRMaW5lLT5tX2lBcmFiaWNDaGFycysrOworICAgIH0KKyAgICBwTmV4dExpbmUtPm1fTGluZUNoYXJzW2ldLm1fZHdTdGF0dXMgPSBDRlhfQnJlYWtUeXBlOjpOb25lOworICB9Cit9CisKK2ludDMyX3QgQ0ZYX1JURkJyZWFrOjpHZXREaXNwbGF5UG9zKGNvbnN0IEZYX1JURlRFWFRPQkoqIHBUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ2hhckNvZGUpIGNvbnN0IHsKKyAgaWYgKCFwVGV4dCB8fCBwVGV4dC0+aUxlbmd0aCA8IDEpCisgICAgcmV0dXJuIDA7CisKKyAgQVNTRVJUKHBUZXh0LT5wRm9udCAmJiBwVGV4dC0+cFJlY3QpOworCisgIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+IHBGb250ID0gcFRleHQtPnBGb250OworICBDRlhfUmVjdEYgcnRUZXh0KCpwVGV4dC0+cFJlY3QpOworICBib29sIGJSVExQaWVjZSA9IEZYX0lzT2RkKHBUZXh0LT5pQmlkaUxldmVsKTsKKyAgZmxvYXQgZkZvbnRTaXplID0gcFRleHQtPmZGb250U2l6ZTsKKyAgaW50MzJfdCBpRm9udFNpemUgPSBGWFNZU19yb3VuZChmRm9udFNpemUgKiAyMC4wZik7CisgIGludDMyX3QgaUFzY2VudCA9IHBGb250LT5HZXRBc2NlbnQoKTsKKyAgaW50MzJfdCBpRGVzY2VudCA9IHBGb250LT5HZXREZXNjZW50KCk7CisgIGludDMyX3QgaU1heEhlaWdodCA9IGlBc2NlbnQgLSBpRGVzY2VudDsKKyAgZmxvYXQgZkZvbnRIZWlnaHQgPSBmRm9udFNpemU7CisgIGZsb2F0IGZBc2NlbnQgPSBmRm9udEhlaWdodCAqIHN0YXRpY19jYXN0PGZsb2F0PihpQXNjZW50KSAvCisgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4oaU1heEhlaWdodCk7CisgIHdjaGFyX3Qgd1ByZXYgPSAweEZFRkY7CisgIHdjaGFyX3Qgd05leHQ7CisgIGZsb2F0IGZYID0gcnRUZXh0LmxlZnQ7CisgIGludDMyX3QgaUhvclNjYWxlID0gcFRleHQtPmlIb3Jpem9udGFsU2NhbGU7CisgIGludDMyX3QgaVZlclNjYWxlID0gcFRleHQtPmlWZXJ0aWNhbFNjYWxlOworICBpZiAoYlJUTFBpZWNlKQorICAgIGZYID0gcnRUZXh0LnJpZ2h0KCk7CisKKyAgZmxvYXQgZlkgPSBydFRleHQudG9wICsgZkFzY2VudDsKKyAgaW50MzJfdCBpQ291bnQgPSAwOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwVGV4dC0+aUxlbmd0aDsgKytpKSB7CisgICAgd2NoYXJfdCB3Y2ggPSBwVGV4dC0+cFN0cltpXTsKKyAgICBpbnQzMl90IGlXaWR0aCA9IHBUZXh0LT5wV2lkdGhzW2ldOworICAgIHVpbnQzMl90IGR3UHJvcHMgPSBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3Y2gpOworICAgIHVpbnQzMl90IGR3Q2hhclR5cGUgPSAoZHdQcm9wcyAmIEZYX0NIQVJUWVBFQklUU01BU0spOworICAgIGlmIChpV2lkdGggPT0gMCkgeworICAgICAgaWYgKGR3Q2hhclR5cGUgPT0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikKKyAgICAgICAgd1ByZXYgPSAweEZFRkY7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBpbnQzMl90IGlDaGFyV2lkdGggPSBhYnMoaVdpZHRoKTsKKyAgICBib29sIGJFbXB0eUNoYXIgPQorICAgICAgICAoZHdDaGFyVHlwZSA+PSBGWF9DSEFSVFlQRV9UYWIgJiYgZHdDaGFyVHlwZSA8PSBGWF9DSEFSVFlQRV9Db250cm9sKTsKKyAgICBpZiAoIWJFbXB0eUNoYXIpCisgICAgICArK2lDb3VudDsKKworICAgIGlmIChwQ2hhclBvcykgeworICAgICAgaUNoYXJXaWR0aCAvPSBpRm9udFNpemU7CisgICAgICB3Y2hhcl90IHdGb3JtID0gd2NoOworICAgICAgaWYgKGR3Q2hhclR5cGUgPj0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgeworICAgICAgICBpZiAoaSArIDEgPCBwVGV4dC0+aUxlbmd0aCkgeworICAgICAgICAgIHdOZXh0ID0gcFRleHQtPnBTdHJbaSArIDFdOworICAgICAgICAgIGlmIChwVGV4dC0+cFdpZHRoc1tpICsgMV0gPCAwICYmIGkgKyAyIDwgcFRleHQtPmlMZW5ndGgpCisgICAgICAgICAgICB3TmV4dCA9IHBUZXh0LT5wU3RyW2kgKyAyXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB3TmV4dCA9IDB4RkVGRjsKKyAgICAgICAgfQorICAgICAgICB3Rm9ybSA9IHBkZml1bTo6YXJhYmljOjpHZXRGb3JtQ2hhcih3Y2gsIHdQcmV2LCB3TmV4dCk7CisgICAgICB9IGVsc2UgaWYgKGJSVExQaWVjZSkgeworICAgICAgICB3Rm9ybSA9IEZYX0dldE1pcnJvckNoYXIod2NoLCBkd1Byb3BzKTsKKyAgICAgIH0KKyAgICAgIGR3UHJvcHMgPSBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3Rm9ybSk7CisKKyAgICAgIGlmICghYkVtcHR5Q2hhcikgeworICAgICAgICBpZiAoYkNoYXJDb2RlKSB7CisgICAgICAgICAgcENoYXJQb3MtPm1fR2x5cGhJbmRleCA9IHdjaDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwQ2hhclBvcy0+bV9HbHlwaEluZGV4ID0gcEZvbnQtPkdldEdseXBoSW5kZXgod0Zvcm0pOworICAgICAgICAgIGlmIChwQ2hhclBvcy0+bV9HbHlwaEluZGV4ID09IDB4RkZGRikKKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX0dseXBoSW5kZXggPSBwRm9udC0+R2V0R2x5cGhJbmRleCh3Y2gpOworICAgICAgICB9CisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCisgICAgICAgIHBDaGFyUG9zLT5tX0V4dEdJRCA9IHBDaGFyUG9zLT5tX0dseXBoSW5kZXg7CisjZW5kaWYKKyAgICAgICAgcENoYXJQb3MtPm1fRm9udENoYXJXaWR0aCA9IGlDaGFyV2lkdGg7CisgICAgICB9CisKKyAgICAgIGZsb2F0IGZDaGFyV2lkdGggPSBmRm9udFNpemUgKiBpQ2hhcldpZHRoIC8gMTAwMC4wZjsKKyAgICAgIGlmIChiUlRMUGllY2UgJiYgZHdDaGFyVHlwZSAhPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikKKyAgICAgICAgZlggLT0gZkNoYXJXaWR0aDsKKworICAgICAgaWYgKCFiRW1wdHlDaGFyKQorICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW4gPSBDRlhfUG9pbnRGKGZYLCBmWSk7CisgICAgICBpZiAoIWJSVExQaWVjZSAmJiBkd0NoYXJUeXBlICE9IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKQorICAgICAgICBmWCArPSBmQ2hhcldpZHRoOworCisgICAgICBpZiAoIWJFbXB0eUNoYXIpIHsKKyAgICAgICAgcENoYXJQb3MtPm1fYkdseXBoQWRqdXN0ID0gdHJ1ZTsKKyAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gLTE7CisgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IDA7CisgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IDA7CisgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDE7CisgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpbi55ICs9IGZBc2NlbnQgKiBpVmVyU2NhbGUgLyAxMDAuMGY7CisgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpbi55IC09IGZBc2NlbnQ7CisKKyAgICAgICAgaWYgKGlIb3JTY2FsZSAhPSAxMDAgfHwgaVZlclNjYWxlICE9IDEwMCkgeworICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9CisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSAqIGlIb3JTY2FsZSAvIDEwMC4wZjsKKyAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gKiBpSG9yU2NhbGUgLyAxMDAuMGY7CisgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdICogaVZlclNjYWxlIC8gMTAwLjBmOworICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9CisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSAqIGlWZXJTY2FsZSAvIDEwMC4wZjsKKyAgICAgICAgfQorICAgICAgICArK3BDaGFyUG9zOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaVdpZHRoID4gMCkKKyAgICAgIHdQcmV2ID0gd2NoOworICB9CisgIHJldHVybiBpQ291bnQ7Cit9CisKK0ZYX1JURlRFWFRPQko6OkZYX1JURlRFWFRPQkooKQorICAgIDogcEZvbnQobnVsbHB0ciksCisgICAgICBwUmVjdChudWxscHRyKSwKKyAgICAgIHdMaW5lQnJlYWtDaGFyKEwnXG4nKSwKKyAgICAgIGZGb250U2l6ZSgxMi4wZiksCisgICAgICBpTGVuZ3RoKDApLAorICAgICAgaUJpZGlMZXZlbCgwKSwKKyAgICAgIGlIb3Jpem9udGFsU2NhbGUoMTAwKSwKKyAgICAgIGlWZXJ0aWNhbFNjYWxlKDEwMCkge30KKworRlhfUlRGVEVYVE9CSjo6fkZYX1JURlRFWFRPQkooKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2ZnYXMvbGF5b3V0L2NmeF9ydGZicmVhay5oIGIveGZhL2ZnYXMvbGF5b3V0L2NmeF9ydGZicmVhay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MDUyZDIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZmdhcy9sYXlvdXQvY2Z4X3J0ZmJyZWFrLmgKQEAgLTAsMCArMSw5OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GR0FTX0xBWU9VVF9DRlhfUlRGQlJFQUtfSF8KKyNkZWZpbmUgWEZBX0ZHQVNfTEFZT1VUX0NGWF9SVEZCUkVBS19IXworCisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfdW5pY29kZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgorI2luY2x1ZGUgInhmYS9mZ2FzL2xheW91dC9jZnhfYnJlYWsuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX3RleHR1c2VyZGF0YS5oIgorCitjbGFzcyBDRkdBU19HRUZvbnQ7CitjbGFzcyBGWFRFWFRfQ0hBUlBPUzsKKworZW51bSBjbGFzcyBDRlhfUlRGTGluZUFsaWdubWVudCB7CisgIExlZnQgPSAwLAorICBDZW50ZXIsCisgIFJpZ2h0LAorICBKdXN0aWZpZWQsCisgIERpc3RyaWJ1dGVkCit9OworCitzdHJ1Y3QgRlhfUlRGVEVYVE9CSiB7CisgIEZYX1JURlRFWFRPQkooKTsKKyAgfkZYX1JURlRFWFRPQkooKTsKKworICBXaWRlU3RyaW5nIHBTdHI7CisgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHBXaWR0aHM7CisgIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+IHBGb250OworICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0OworICB3Y2hhcl90IHdMaW5lQnJlYWtDaGFyOworICBmbG9hdCBmRm9udFNpemU7CisgIGludDMyX3QgaUxlbmd0aDsKKyAgaW50MzJfdCBpQmlkaUxldmVsOworICBpbnQzMl90IGlIb3Jpem9udGFsU2NhbGU7CisgIGludDMyX3QgaVZlcnRpY2FsU2NhbGU7Cit9OworCitjbGFzcyBDRlhfUlRGQnJlYWsgOiBwdWJsaWMgQ0ZYX0JyZWFrIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENGWF9SVEZCcmVhayh1aW50MzJfdCBkd0xheW91dFN0eWxlcyk7CisgIH5DRlhfUlRGQnJlYWsoKSBvdmVycmlkZTsKKworICB2b2lkIFNldExpbmVTdGFydFBvcyhmbG9hdCBmTGluZVBvcyk7CisKKyAgdm9pZCBTZXRBbGlnbm1lbnQoQ0ZYX1JURkxpbmVBbGlnbm1lbnQgYWxpZ24pIHsgbV9pQWxpZ25tZW50ID0gYWxpZ247IH0KKyAgdm9pZCBTZXRVc2VyRGF0YShjb25zdCBSZXRhaW5QdHI8Q1hGQV9UZXh0VXNlckRhdGE+JiBwVXNlckRhdGEpOworCisgIHZvaWQgQWRkUG9zaXRpb25lZFRhYihmbG9hdCBmVGFiUG9zKTsKKworICBDRlhfQnJlYWtUeXBlIEVuZEJyZWFrKENGWF9CcmVha1R5cGUgZHdTdGF0dXMpOworCisgIGludDMyX3QgR2V0RGlzcGxheVBvcyhjb25zdCBGWF9SVEZURVhUT0JKKiBwVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNoYXJDb2RlKSBjb25zdDsKKworICBDRlhfQnJlYWtUeXBlIEFwcGVuZENoYXIod2NoYXJfdCB3Y2gpOworCisgIENGWF9CcmVha0xpbmUqIEdldEN1cnJlbnRMaW5lRm9yVGVzdGluZygpIGNvbnN0IHsgcmV0dXJuIG1fcEN1ckxpbmU7IH0KKworIHByaXZhdGU6CisgIHZvaWQgQXBwZW5kQ2hhcl9Db21iaW5hdGlvbihDRlhfQ2hhciogcEN1ckNoYXIpOworICB2b2lkIEFwcGVuZENoYXJfVGFiKENGWF9DaGFyKiBwQ3VyQ2hhcik7CisgIENGWF9CcmVha1R5cGUgQXBwZW5kQ2hhcl9Db250cm9sKENGWF9DaGFyKiBwQ3VyQ2hhcik7CisgIENGWF9CcmVha1R5cGUgQXBwZW5kQ2hhcl9BcmFiaWMoQ0ZYX0NoYXIqIHBDdXJDaGFyKTsKKyAgQ0ZYX0JyZWFrVHlwZSBBcHBlbmRDaGFyX090aGVycyhDRlhfQ2hhciogcEN1ckNoYXIpOworICBpbnQzMl90IEdldExhc3RQb3NpdGlvbmVkVGFiKCkgY29uc3Q7CisgIGJvb2wgR2V0UG9zaXRpb25lZFRhYihpbnQzMl90KiBpVGFiUG9zKSBjb25zdDsKKworICBpbnQzMl90IEdldEJyZWFrUG9zKHN0ZDo6dmVjdG9yPENGWF9DaGFyPiYgdGNhLAorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlFbmRQb3MsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWxsQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiT25seUJyayk7CisgIHZvaWQgU3BsaXRUZXh0TGluZShDRlhfQnJlYWtMaW5lKiBwQ3VyTGluZSwKKyAgICAgICAgICAgICAgICAgICAgIENGWF9CcmVha0xpbmUqIHBOZXh0TGluZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFsbENoYXJzKTsKKyAgYm9vbCBFbmRCcmVha19TcGxpdExpbmUoQ0ZYX0JyZWFrTGluZSogcE5leHRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJBbGxDaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0JyZWFrVHlwZSBkd1N0YXR1cyk7CisgIHZvaWQgRW5kQnJlYWtfQmlkaUxpbmUoc3RkOjpkZXF1ZTxGWF9UUE8+KiB0cG9zLCBDRlhfQnJlYWtUeXBlIGR3U3RhdHVzKTsKKyAgdm9pZCBFbmRCcmVha19BbGlnbm1lbnQoY29uc3Qgc3RkOjpkZXF1ZTxGWF9UUE8+JiB0cG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJBbGxDaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0JyZWFrVHlwZSBkd1N0YXR1cyk7CisKKyAgYm9vbCBtX2JQYWdpbmF0aW9uOworICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBtX1Bvc2l0aW9uZWRUYWJzOworICBDRlhfUlRGTGluZUFsaWdubWVudCBtX2lBbGlnbm1lbnQ7CisgIFJldGFpblB0cjxDWEZBX1RleHRVc2VyRGF0YT4gbV9wVXNlckRhdGE7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GR0FTX0xBWU9VVF9DRlhfUlRGQlJFQUtfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZ2FzL2xheW91dC9jZnhfcnRmYnJlYWtfdW5pdHRlc3QuY3BwIGIveGZhL2ZnYXMvbGF5b3V0L2NmeF9ydGZicmVha191bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYyNDYzMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9mZ2FzL2xheW91dC9jZnhfcnRmYnJlYWtfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsNzQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9mZ2FzL2xheW91dC9jZnhfcnRmYnJlYWsuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZ2Vtb2R1bGUuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ4ZmEvZmdhcy9mb250L2NmZ2FzX2ZvbnRtZ3IuaCIKKyNpbmNsdWRlICJ4ZmEvZmdhcy9mb250L2NmZ2FzX2dlZm9udC5oIgorCitjbGFzcyBDRlhfUlRGQnJlYWtUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBmb250XyA9CisgICAgICAgIENGR0FTX0dFRm9udDo6TG9hZEZvbnQoTCJBcmlhbCBCbGFjayIsIDAsIDAsIEdldEdsb2JhbEZvbnRNYW5hZ2VyKCkpOworICAgIEFTU0VSVChmb250Xy5HZXQoKSAhPSBudWxscHRyKTsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfUlRGQnJlYWs+IENyZWF0ZUJyZWFrKGludDMyX3QgYXJncykgeworICAgIGF1dG8gYiA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfUlRGQnJlYWs+KGFyZ3MpOworICAgIGItPlNldEZvbnQoZm9udF8pOworICAgIHJldHVybiBiOworICB9CisKKyBwcml2YXRlOgorICBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBmb250XzsKK307CisKKy8vIEFzIHNvb24gYXMgeW91IGdldCBvbmUgb2YgdGhlIGNvbnRyb2wgY2hhcmFjdGVycyB0aGUgYnJlYWsgaXMgY29tcGxldGUKKy8vIGFuZCBtdXN0IGJlIGNvbnN1bWVkIGJlZm9yZSB5b3UgZ2V0IGFueSBtb3JlIGNoYXJhY3RlcnMgLi4uLgorCitURVNUX0YoQ0ZYX1JURkJyZWFrVGVzdCwgQWRkQ2hhcnMpIHsKKyAgYXV0byBiID0gQ3JlYXRlQnJlYWsoRlhfTEFZT1VUU1RZTEVfRXhwYW5kVGFiKTsKKworICBXaWRlU3RyaW5nIHN0cihMIklucHV0IFN0cmluZy4iKTsKKyAgZm9yIChjb25zdCBhdXRvJiBjIDogc3RyKQorICAgIEVYUEVDVF9FUShDRlhfQnJlYWtUeXBlOjpOb25lLCBiLT5BcHBlbmRDaGFyKGMpKTsKKworICBFWFBFQ1RfRVEoQ0ZYX0JyZWFrVHlwZTo6UGFyYWdyYXBoLCBiLT5BcHBlbmRDaGFyKEwnXG4nKSk7CisgIEFTU0VSVF9FUSgxLCBiLT5Db3VudEJyZWFrUGllY2VzKCkpOworICBFWFBFQ1RfRVEoc3RyICsgTCJcbiIsIGItPkdldEJyZWFrUGllY2VVbnN0YWJsZSgwKS0+R2V0U3RyaW5nKCkpOworCisgIGItPkNsZWFyQnJlYWtQaWVjZXMoKTsKKyAgYi0+UmVzZXQoKTsKKyAgRVhQRUNUX0VRKDAsIGItPkdldEN1cnJlbnRMaW5lRm9yVGVzdGluZygpLT5HZXRMaW5lRW5kKCkpOworCisgIHN0ciA9IEwiU2Vjb25kIHN0ci4iOworICBmb3IgKGNvbnN0IGF1dG8mIGMgOiBzdHIpCisgICAgRVhQRUNUX0VRKENGWF9CcmVha1R5cGU6Ok5vbmUsIGItPkFwcGVuZENoYXIoYykpOworCisgIC8vIEZvcmNlIHRoZSBlbmQgb2YgdGhlIGJyZWFrIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KKyAgYi0+RW5kQnJlYWsoQ0ZYX0JyZWFrVHlwZTo6UGFyYWdyYXBoKTsKKyAgQVNTRVJUX0VRKDEsIGItPkNvdW50QnJlYWtQaWVjZXMoKSk7CisgIEVYUEVDVF9FUShzdHIsIGItPkdldEJyZWFrUGllY2VVbnN0YWJsZSgwKS0+R2V0U3RyaW5nKCkpOworfQorCitURVNUX0YoQ0ZYX1JURkJyZWFrVGVzdCwgQ29udHJvbENoYXJhY3RlcnMpIHsKKyAgYXV0byBiID0gQ3JlYXRlQnJlYWsoRlhfTEFZT1VUU1RZTEVfRXhwYW5kVGFiKTsKKyAgRVhQRUNUX0VRKENGWF9CcmVha1R5cGU6OkxpbmUsIGItPkFwcGVuZENoYXIoTCdcdicpKTsKKyAgRVhQRUNUX0VRKENGWF9CcmVha1R5cGU6OlBhZ2UsIGItPkFwcGVuZENoYXIoTCdcZicpKTsKKyAgLy8gMHgyMDI5IGlzIHRoZSBQYXJhZ3JhcGggU2VwYXJhdG9yIHVuaWNvZGUgY2hhcmFjdGVyLgorICBFWFBFQ1RfRVEoQ0ZYX0JyZWFrVHlwZTo6UGFyYWdyYXBoLCBiLT5BcHBlbmRDaGFyKDB4MjAyOSkpOworICBFWFBFQ1RfRVEoQ0ZYX0JyZWFrVHlwZTo6UGFyYWdyYXBoLCBiLT5BcHBlbmRDaGFyKEwnXG4nKSk7CisKKyAgQVNTRVJUX0VRKDEsIGItPkNvdW50QnJlYWtQaWVjZXMoKSk7CisgIEVYUEVDVF9FUShMIlx2IiwgYi0+R2V0QnJlYWtQaWVjZVVuc3RhYmxlKDApLT5HZXRTdHJpbmcoKSk7Cit9CmRpZmYgLS1naXQgYS94ZmEvZmdhcy9sYXlvdXQvY2Z4X3R4dGJyZWFrLmNwcCBiL3hmYS9mZ2FzL2xheW91dC9jZnhfdHh0YnJlYWsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMjhjOWIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZmdhcy9sYXlvdXQvY2Z4X3R4dGJyZWFrLmNwcApAQCAtMCwwICsxLDk5OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2ZnYXMvbGF5b3V0L2NmeF90eHRicmVhay5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9hcmFiaWMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2JpZGkuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ4ZmEvZmRlL2NmZGVfdGV4dGVkaXRlbmdpbmUuaCIKKyNpbmNsdWRlICJ4ZmEvZmdhcy9mb250L2NmZ2FzX2dlZm9udC5oIgorI2luY2x1ZGUgInhmYS9mZ2FzL2xheW91dC9jZnhfbGluZWJyZWFrLmgiCisKK25hbWVzcGFjZSB7CisKK2Jvb2wgSXNDdHJsQ29kZSh3Y2hhcl90IGNoKSB7CisgIHVpbnQzMl90IGR3UmV0ID0gKEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKGNoKSAmIEZYX0NIQVJUWVBFQklUU01BU0spOworICByZXR1cm4gZHdSZXQgPT0gRlhfQ0hBUlRZUEVfVGFiIHx8IGR3UmV0ID09IEZYX0NIQVJUWVBFX0NvbnRyb2w7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitDRlhfVHh0QnJlYWs6OkNGWF9UeHRCcmVhaygpCisgICAgOiBDRlhfQnJlYWsoRlhfTEFZT1VUU1RZTEVfTm9uZSksCisgICAgICBtX2lBbGlnbm1lbnQoQ0ZYX1R4dExpbmVBbGlnbm1lbnRfTGVmdCksCisgICAgICBtX2lDb21iV2lkdGgoMzYwMDAwKSB7fQorCitDRlhfVHh0QnJlYWs6On5DRlhfVHh0QnJlYWsoKSB7fQorCit2b2lkIENGWF9UeHRCcmVhazo6U2V0TGluZVdpZHRoKGZsb2F0IGZMaW5lV2lkdGgpIHsKKyAgbV9pTGluZVdpZHRoID0gRlhTWVNfcm91bmQoZkxpbmVXaWR0aCAqIDIwMDAwLjBmKTsKKyAgQVNTRVJUKG1faUxpbmVXaWR0aCA+PSAyMDAwMCk7Cit9CisKK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRBbGlnbm1lbnQoaW50MzJfdCBpQWxpZ25tZW50KSB7CisgIEFTU0VSVChpQWxpZ25tZW50ID49IENGWF9UeHRMaW5lQWxpZ25tZW50X0xlZnQgJiYKKyAgICAgICAgIGlBbGlnbm1lbnQgPD0gQ0ZYX1R4dExpbmVBbGlnbm1lbnRfSnVzdGlmaWVkKTsKKyAgbV9pQWxpZ25tZW50ID0gaUFsaWdubWVudDsKK30KKwordm9pZCBDRlhfVHh0QnJlYWs6OlNldENvbWJXaWR0aChmbG9hdCBmQ29tYldpZHRoKSB7CisgIG1faUNvbWJXaWR0aCA9IEZYU1lTX3JvdW5kKGZDb21iV2lkdGggKiAyMDAwMC4wZik7Cit9CisKK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0NvbWJpbmF0aW9uKENGWF9DaGFyKiBwQ3VyQ2hhcikgeworICB3Y2hhcl90IHdjaCA9IHBDdXJDaGFyLT5jaGFyX2NvZGUoKTsKKyAgd2NoYXJfdCB3Rm9ybTsKKyAgaW50MzJfdCBpQ2hhcldpZHRoID0gMDsKKyAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IC0xOworICBpZiAobV9iQ29tYlRleHQpIHsKKyAgICBpQ2hhcldpZHRoID0gbV9pQ29tYldpZHRoOworICB9IGVsc2UgeworICAgIHdGb3JtID0gd2NoOworICAgIENGWF9DaGFyKiBwTGFzdENoYXIgPSBHZXRMYXN0Q2hhcigwLCBmYWxzZSwgZmFsc2UpOworICAgIGlmIChwTGFzdENoYXIgJiYKKyAgICAgICAgKHBMYXN0Q2hhci0+bV9kd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljU2hhZGRhKSA9PSAwKSB7CisgICAgICBib29sIGJTaGFkZGEgPSBmYWxzZTsKKyAgICAgIGlmICh3Y2ggPT0gMHgwNjUxKSB7CisgICAgICAgIHdjaGFyX3Qgd0xhc3QgPSBwTGFzdENoYXItPmNoYXJfY29kZSgpOworICAgICAgICBpZiAod0xhc3QgPj0gMHgwNjRDICYmIHdMYXN0IDw9IDB4MDY1MCkgeworICAgICAgICAgIHdGb3JtID0gRlhfR2V0QXJhYmljRnJvbVNoYWRkYVRhYmxlKHdMYXN0KTsKKyAgICAgICAgICBiU2hhZGRhID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh3Y2ggPj0gMHgwNjRDICYmIHdjaCA8PSAweDA2NTApIHsKKyAgICAgICAgaWYgKHBMYXN0Q2hhci0+Y2hhcl9jb2RlKCkgPT0gMHgwNjUxKSB7CisgICAgICAgICAgd0Zvcm0gPSBGWF9HZXRBcmFiaWNGcm9tU2hhZGRhVGFibGUod2NoKTsKKyAgICAgICAgICBiU2hhZGRhID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKGJTaGFkZGEpIHsKKyAgICAgICAgcExhc3RDaGFyLT5tX2R3Q2hhclN0eWxlcyB8PSBGWF9UWFRDSEFSU1RZTEVfQXJhYmljU2hhZGRhOworICAgICAgICBwTGFzdENoYXItPm1faUNoYXJXaWR0aCA9IDA7CisgICAgICAgIHBDdXJDaGFyLT5tX2R3Q2hhclN0eWxlcyB8PSBGWF9UWFRDSEFSU1RZTEVfQXJhYmljU2hhZGRhOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIW1fcEZvbnQtPkdldENoYXJXaWR0aCh3Rm9ybSwgaUNoYXJXaWR0aCkpCisgICAgICBpQ2hhcldpZHRoID0gMDsKKworICAgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7CisgICAgaUNoYXJXaWR0aCA9IGlDaGFyV2lkdGggKiBtX2lIb3Jpem9udGFsU2NhbGUgLyAxMDA7CisgIH0KKyAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IC1pQ2hhcldpZHRoOworfQorCit2b2lkIENGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9UYWIoQ0ZYX0NoYXIqIHBDdXJDaGFyKSB7CisgIG1fZUNoYXJUeXBlID0gRlhfQ0hBUlRZUEVfVGFiOworfQorCitDRlhfQnJlYWtUeXBlIENGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9Db250cm9sKENGWF9DaGFyKiBwQ3VyQ2hhcikgeworICBtX2VDaGFyVHlwZSA9IEZYX0NIQVJUWVBFX0NvbnRyb2w7CisgIENGWF9CcmVha1R5cGUgZHdSZXQgPSBDRlhfQnJlYWtUeXBlOjpOb25lOworICBpZiAoIW1fYlNpbmdsZUxpbmUpIHsKKyAgICB3Y2hhcl90IHdjaCA9IHBDdXJDaGFyLT5jaGFyX2NvZGUoKTsKKyAgICBzd2l0Y2ggKHdjaCkgeworICAgICAgY2FzZSBMJ1x2JzoKKyAgICAgIGNhc2UgMHgyMDI4OgorICAgICAgICBkd1JldCA9IENGWF9CcmVha1R5cGU6OkxpbmU7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBMJ1xmJzoKKyAgICAgICAgZHdSZXQgPSBDRlhfQnJlYWtUeXBlOjpQYWdlOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMHgyMDI5OgorICAgICAgICBkd1JldCA9IENGWF9CcmVha1R5cGU6OlBhcmFncmFwaDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpZiAod2NoID09IG1fd1BhcmFncmFwaEJyZWFrQ2hhcikKKyAgICAgICAgICBkd1JldCA9IENGWF9CcmVha1R5cGU6OlBhcmFncmFwaDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChkd1JldCAhPSBDRlhfQnJlYWtUeXBlOjpOb25lKQorICAgICAgZHdSZXQgPSBFbmRCcmVhayhkd1JldCk7CisgIH0KKyAgcmV0dXJuIGR3UmV0OworfQorCitDRlhfQnJlYWtUeXBlIENGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMoQ0ZYX0NoYXIqIHBDdXJDaGFyKSB7CisgIEZYX0NIQVJUWVBFIGNoYXJ0eXBlID0gcEN1ckNoYXItPkdldENoYXJUeXBlKCk7CisgIGludDMyX3QmIGlMaW5lV2lkdGggPSBtX3BDdXJMaW5lLT5tX2lXaWR0aDsKKyAgd2NoYXJfdCB3Rm9ybTsKKyAgaW50MzJfdCBpQ2hhcldpZHRoID0gMDsKKyAgQ0ZYX0NoYXIqIHBMYXN0Q2hhciA9IG51bGxwdHI7CisgIGJvb2wgYkFsZWYgPSBmYWxzZTsKKyAgaWYgKCFtX2JDb21iVGV4dCAmJiBtX2VDaGFyVHlwZSA+PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmICYmCisgICAgICBtX2VDaGFyVHlwZSA8PSBGWF9DSEFSVFlQRV9BcmFiaWNEaXN0b3J0aW9uKSB7CisgICAgcExhc3RDaGFyID0gR2V0TGFzdENoYXIoMSwgdHJ1ZSwgZmFsc2UpOworICAgIGlmIChwTGFzdENoYXIpIHsKKyAgICAgIGlDaGFyV2lkdGggPSBwTGFzdENoYXItPm1faUNoYXJXaWR0aDsKKyAgICAgIGlmIChpQ2hhcldpZHRoID4gMCkKKyAgICAgICAgaUxpbmVXaWR0aCAtPSBpQ2hhcldpZHRoOworCisgICAgICBDRlhfQ2hhciogcFByZXZDaGFyID0gR2V0TGFzdENoYXIoMiwgdHJ1ZSwgZmFsc2UpOworICAgICAgd0Zvcm0gPSBwZGZpdW06OmFyYWJpYzo6R2V0Rm9ybUNoYXIocExhc3RDaGFyLCBwUHJldkNoYXIsIHBDdXJDaGFyKTsKKyAgICAgIGJBbGVmID0gKHdGb3JtID09IDB4RkVGRiAmJgorICAgICAgICAgICAgICAgcExhc3RDaGFyLT5HZXRDaGFyVHlwZSgpID09IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpOworICAgICAgbV9wRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpQ2hhcldpZHRoKTsKKworICAgICAgaWYgKHdGb3JtID09IDB4RkVGRikKKyAgICAgICAgaUNoYXJXaWR0aCA9IG1faURlZkNoYXI7CisKKyAgICAgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7CisgICAgICBpQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIG1faUhvcml6b250YWxTY2FsZSAvIDEwMDsKKyAgICAgIHBMYXN0Q2hhci0+bV9pQ2hhcldpZHRoID0gaUNoYXJXaWR0aDsKKyAgICAgIGlMaW5lV2lkdGggKz0gaUNoYXJXaWR0aDsKKyAgICAgIGlDaGFyV2lkdGggPSAwOworICAgIH0KKyAgfQorCisgIG1fZUNoYXJUeXBlID0gY2hhcnR5cGU7CisgIHdGb3JtID0gcGRmaXVtOjphcmFiaWM6OkdldEZvcm1DaGFyKHBDdXJDaGFyLCBiQWxlZiA/IG51bGxwdHIgOiBwTGFzdENoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICBpZiAobV9iQ29tYlRleHQpIHsKKyAgICBpQ2hhcldpZHRoID0gbV9pQ29tYldpZHRoOworICB9IGVsc2UgeworICAgIG1fcEZvbnQtPkdldENoYXJXaWR0aCh3Rm9ybSwgaUNoYXJXaWR0aCk7CisKKyAgICBpZiAod0Zvcm0gPT0gMHhGRUZGKQorICAgICAgaUNoYXJXaWR0aCA9IG1faURlZkNoYXI7CisKKyAgICBpQ2hhcldpZHRoICo9IG1faUZvbnRTaXplOworICAgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yaXpvbnRhbFNjYWxlIC8gMTAwOworICB9CisgIHBDdXJDaGFyLT5tX2lDaGFyV2lkdGggPSBpQ2hhcldpZHRoOworICBpTGluZVdpZHRoICs9IGlDaGFyV2lkdGg7CisgIG1fcEN1ckxpbmUtPm1faUFyYWJpY0NoYXJzKys7CisgIGlmICghbV9iU2luZ2xlTGluZSAmJiBpTGluZVdpZHRoID4gbV9pTGluZVdpZHRoICsgbV9pVG9sZXJhbmNlKQorICAgIHJldHVybiBFbmRCcmVhayhDRlhfQnJlYWtUeXBlOjpMaW5lKTsKKyAgcmV0dXJuIENGWF9CcmVha1R5cGU6Ok5vbmU7Cit9CisKK0NGWF9CcmVha1R5cGUgQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX090aGVycyhDRlhfQ2hhciogcEN1ckNoYXIpIHsKKyAgRlhfQ0hBUlRZUEUgY2hhcnR5cGUgPSBwQ3VyQ2hhci0+R2V0Q2hhclR5cGUoKTsKKyAgaW50MzJfdCYgaUxpbmVXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOworICBpbnQzMl90IGlDaGFyV2lkdGggPSAwOworICBtX2VDaGFyVHlwZSA9IGNoYXJ0eXBlOworICB3Y2hhcl90IHdjaCA9IHBDdXJDaGFyLT5jaGFyX2NvZGUoKTsKKyAgd2NoYXJfdCB3Rm9ybSA9IHdjaDsKKworICBpZiAobV9iQ29tYlRleHQpIHsKKyAgICBpQ2hhcldpZHRoID0gbV9pQ29tYldpZHRoOworICB9IGVsc2UgeworICAgIGlmICghbV9wRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpQ2hhcldpZHRoKSkKKyAgICAgIGlDaGFyV2lkdGggPSBtX2lEZWZDaGFyOworCisgICAgaUNoYXJXaWR0aCAqPSBtX2lGb250U2l6ZTsKKyAgICBpQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIG1faUhvcml6b250YWxTY2FsZSAvIDEwMDsKKyAgfQorCisgIGlDaGFyV2lkdGggKz0gbV9pQ2hhclNwYWNlOworICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gaUNoYXJXaWR0aDsKKyAgaUxpbmVXaWR0aCArPSBpQ2hhcldpZHRoOworICBpZiAoIW1fYlNpbmdsZUxpbmUgJiYgY2hhcnR5cGUgIT0gRlhfQ0hBUlRZUEVfU3BhY2UgJiYKKyAgICAgIGlMaW5lV2lkdGggPiBtX2lMaW5lV2lkdGggKyBtX2lUb2xlcmFuY2UpIHsKKyAgICByZXR1cm4gRW5kQnJlYWsoQ0ZYX0JyZWFrVHlwZTo6TGluZSk7CisgIH0KKworICByZXR1cm4gQ0ZYX0JyZWFrVHlwZTo6Tm9uZTsKK30KKworQ0ZYX0JyZWFrVHlwZSBDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXIod2NoYXJfdCB3Y2gpIHsKKyAgdWludDMyX3QgZHdQcm9wcyA9IEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKHdjaCk7CisgIEZYX0NIQVJUWVBFIGNoYXJ0eXBlID0gR2V0Q2hhclR5cGVGcm9tUHJvcChkd1Byb3BzKTsKKyAgbV9wQ3VyTGluZS0+bV9MaW5lQ2hhcnMuZW1wbGFjZV9iYWNrKHdjaCwgZHdQcm9wcywgbV9pSG9yaXpvbnRhbFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pVmVydGljYWxTY2FsZSk7CisgIENGWF9DaGFyKiBwQ3VyQ2hhciA9ICZtX3BDdXJMaW5lLT5tX0xpbmVDaGFycy5iYWNrKCk7CisgIHBDdXJDaGFyLT5tX2R3Q2hhclN0eWxlcyA9IG1faUFsaWdubWVudCB8ICgxIDw8IDgpOworCisgIENGWF9CcmVha1R5cGUgZHdSZXQxID0gQ0ZYX0JyZWFrVHlwZTo6Tm9uZTsKKyAgaWYgKGNoYXJ0eXBlICE9IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uICYmCisgICAgICBHZXRVbmlmaWVkQ2hhclR5cGUobV9lQ2hhclR5cGUpICE9IEdldFVuaWZpZWRDaGFyVHlwZShjaGFydHlwZSkgJiYKKyAgICAgIG1fZUNoYXJUeXBlICE9IEZYX0NIQVJUWVBFX1Vua25vd24gJiYKKyAgICAgIG1fcEN1ckxpbmUtPm1faVdpZHRoID4gbV9pTGluZVdpZHRoICsgbV9pVG9sZXJhbmNlICYmICFtX2JTaW5nbGVMaW5lICYmCisgICAgICAobV9lQ2hhclR5cGUgIT0gRlhfQ0hBUlRZUEVfU3BhY2UgfHwgY2hhcnR5cGUgIT0gRlhfQ0hBUlRZUEVfQ29udHJvbCkpIHsKKyAgICBkd1JldDEgPSBFbmRCcmVhayhDRlhfQnJlYWtUeXBlOjpMaW5lKTsKKyAgICBpbnQzMl90IGlDb3VudCA9IG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsKKyAgICBpZiAoaUNvdW50ID4gMCkKKyAgICAgIHBDdXJDaGFyID0gJm1fcEN1ckxpbmUtPm1fTGluZUNoYXJzW2lDb3VudCAtIDFdOworICB9CisKKyAgQ0ZYX0JyZWFrVHlwZSBkd1JldDIgPSBDRlhfQnJlYWtUeXBlOjpOb25lOworICBpZiAod2NoID09IG1fd1BhcmFncmFwaEJyZWFrQ2hhcikgeworICAgIC8vIFRoaXMgaXMgaGFuZGxlZCBpbiBBcHBlbmRDaGFyX0NvbnRyb2wsIGJ1dCBpdCBzZWVtcyBsaWtlIFxuIGFuZCBccgorICAgIC8vIGRvbid0IGdldCBtYXRjaGVkIGFzIGNvbnRyb2wgY2hhcmFjdGVycyBzbyB3ZSBnbyBpbnRvIEFwcGVuZENoYXJfb3RoZXIKKyAgICAvLyBhbmQgbmV2ZXIgZGV0ZWN0IHRoZSBuZXcgcGFyYWdyYXBoIC4uLgorICAgIGR3UmV0MiA9IENGWF9CcmVha1R5cGU6OlBhcmFncmFwaDsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGNoYXJ0eXBlKSB7CisgICAgICBjYXNlIEZYX0NIQVJUWVBFX1RhYjoKKyAgICAgICAgQXBwZW5kQ2hhcl9UYWIocEN1ckNoYXIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlhfQ0hBUlRZUEVfQ29udHJvbDoKKyAgICAgICAgZHdSZXQyID0gQXBwZW5kQ2hhcl9Db250cm9sKHBDdXJDaGFyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uOgorICAgICAgICBBcHBlbmRDaGFyX0NvbWJpbmF0aW9uKHBDdXJDaGFyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZYX0NIQVJUWVBFX0FyYWJpY0FsZWY6CisgICAgICBjYXNlIEZYX0NIQVJUWVBFX0FyYWJpY1NwZWNpYWw6CisgICAgICBjYXNlIEZYX0NIQVJUWVBFX0FyYWJpY0Rpc3RvcnRpb246CisgICAgICBjYXNlIEZYX0NIQVJUWVBFX0FyYWJpY05vcm1hbDoKKyAgICAgIGNhc2UgRlhfQ0hBUlRZUEVfQXJhYmljRm9ybToKKyAgICAgIGNhc2UgRlhfQ0hBUlRZUEVfQXJhYmljOgorICAgICAgICBkd1JldDIgPSBBcHBlbmRDaGFyX0FyYWJpYyhwQ3VyQ2hhcik7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWF9DSEFSVFlQRV9Vbmtub3duOgorICAgICAgY2FzZSBGWF9DSEFSVFlQRV9TcGFjZToKKyAgICAgIGNhc2UgRlhfQ0hBUlRZUEVfTnVtZXJpYzoKKyAgICAgIGNhc2UgRlhfQ0hBUlRZUEVfTm9ybWFsOgorICAgICAgZGVmYXVsdDoKKyAgICAgICAgZHdSZXQyID0gQXBwZW5kQ2hhcl9PdGhlcnMocEN1ckNoYXIpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0ZDo6bWF4KGR3UmV0MSwgZHdSZXQyKTsKK30KKworYm9vbCBDRlhfVHh0QnJlYWs6OkVuZEJyZWFrX1NwbGl0TGluZShDRlhfQnJlYWtMaW5lKiBwTmV4dExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFsbENoYXJzKSB7CisgIGludDMyX3QgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOworICBib29sIGJEb25lID0gZmFsc2U7CisgIENGWF9DaGFyKiBwVEM7CisgIGlmICghbV9iU2luZ2xlTGluZSAmJiBtX3BDdXJMaW5lLT5tX2lXaWR0aCA+IG1faUxpbmVXaWR0aCArIG1faVRvbGVyYW5jZSkgeworICAgIHBUQyA9IG1fcEN1ckxpbmUtPkdldENoYXIoaUNvdW50IC0gMSk7CisgICAgc3dpdGNoIChwVEMtPkdldENoYXJUeXBlKCkpIHsKKyAgICAgIGNhc2UgRlhfQ0hBUlRZUEVfVGFiOgorICAgICAgY2FzZSBGWF9DSEFSVFlQRV9Db250cm9sOgorICAgICAgY2FzZSBGWF9DSEFSVFlQRV9TcGFjZToKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBTcGxpdFRleHRMaW5lKG1fcEN1ckxpbmUsIHBOZXh0TGluZSwgYkFsbENoYXJzKTsKKyAgICAgICAgYkRvbmUgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpQ291bnQgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCk7CisgIENGWF9CcmVha1BpZWNlIHRwOworICBpZiAoYkFsbENoYXJzICYmICFiRG9uZSkgeworICAgIGludDMyX3QgaUVuZFBvcyA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOworICAgIEdldEJyZWFrUG9zKG1fcEN1ckxpbmUtPm1fTGluZUNoYXJzLCBpRW5kUG9zLCBiQWxsQ2hhcnMsIHRydWUpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBDRlhfVHh0QnJlYWs6OkVuZEJyZWFrX0JpZGlMaW5lKHN0ZDo6ZGVxdWU8RlhfVFBPPiogdHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnJlYWtUeXBlIGR3U3RhdHVzKSB7CisgIENGWF9CcmVha1BpZWNlIHRwOworICBGWF9UUE8gdHBvOworICBDRlhfQ2hhciogcFRDOworICBzdGQ6OnZlY3RvcjxDRlhfQ2hhcj4mIGNoYXJzID0gbV9wQ3VyTGluZS0+bV9MaW5lQ2hhcnM7CisgIGludDMyX3QgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOworICBib29sIGJEb25lID0gbV9wQ3VyTGluZS0+bV9pQXJhYmljQ2hhcnMgPiAwOworICBpZiAoYkRvbmUpIHsKKyAgICBBU1NFUlQoaUNvdW50ID49IDApOworCisgICAgc2l6ZV90IGlCaWRpTnVtID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRpY19jYXN0PHNpemVfdD4oaUNvdW50KTsgKytpKSB7CisgICAgICBwVEMgPSAmY2hhcnNbaV07CisgICAgICBwVEMtPm1faUJpZGlQb3MgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihpKTsKKyAgICAgIGlmIChwVEMtPkdldENoYXJUeXBlKCkgIT0gRlhfQ0hBUlRZUEVfQ29udHJvbCkKKyAgICAgICAgaUJpZGlOdW0gPSBpOworICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgcFRDLT5tX2lCaWRpTGV2ZWwgPSAxOworICAgIH0KKyAgICBGWF9CaWRpTGluZSgmY2hhcnMsIGlCaWRpTnVtICsgMSk7CisgIH0KKworICBpZiAoYkRvbmUpIHsKKyAgICB0cC5tX2R3U3RhdHVzID0gQ0ZYX0JyZWFrVHlwZTo6UGllY2U7CisgICAgdHAubV9pU3RhcnRQb3MgPSBtX3BDdXJMaW5lLT5tX2lTdGFydDsKKyAgICB0cC5tX3BDaGFycyA9ICZtX3BDdXJMaW5lLT5tX0xpbmVDaGFyczsKKyAgICBpbnQzMl90IGlCaWRpTGV2ZWwgPSAtMTsKKyAgICBpbnQzMl90IGlDaGFyV2lkdGg7CisgICAgaW50MzJfdCBpID0gMDsKKyAgICBpbnQzMl90IGogPSAtMTsKKyAgICB3aGlsZSAoaSA8IGlDb3VudCkgeworICAgICAgcFRDID0gJmNoYXJzW2ldOworICAgICAgaWYgKGlCaWRpTGV2ZWwgPCAwKSB7CisgICAgICAgIGlCaWRpTGV2ZWwgPSBwVEMtPm1faUJpZGlMZXZlbDsKKyAgICAgICAgdHAubV9pV2lkdGggPSAwOworICAgICAgICB0cC5tX2lCaWRpTGV2ZWwgPSBpQmlkaUxldmVsOworICAgICAgICB0cC5tX2lCaWRpUG9zID0gcFRDLT5tX2lCaWRpT3JkZXI7CisgICAgICAgIHRwLm1fZHdDaGFyU3R5bGVzID0gcFRDLT5tX2R3Q2hhclN0eWxlczsKKyAgICAgICAgdHAubV9pSG9yaXpvbnRhbFNjYWxlID0gcFRDLT5ob3Jpem9uYWxfc2NhbGUoKTsKKyAgICAgICAgdHAubV9pVmVydGljYWxTY2FsZSA9IHBUQy0+dmVydGljYWxfc2NhbGUoKTsKKyAgICAgICAgdHAubV9kd1N0YXR1cyA9IENGWF9CcmVha1R5cGU6OlBpZWNlOworICAgICAgfQorICAgICAgaWYgKGlCaWRpTGV2ZWwgIT0gcFRDLT5tX2lCaWRpTGV2ZWwgfHwKKyAgICAgICAgICBwVEMtPm1fZHdTdGF0dXMgIT0gQ0ZYX0JyZWFrVHlwZTo6Tm9uZSkgeworICAgICAgICBpZiAoaUJpZGlMZXZlbCA9PSBwVEMtPm1faUJpZGlMZXZlbCkgeworICAgICAgICAgIHRwLm1fZHdTdGF0dXMgPSBwVEMtPm1fZHdTdGF0dXM7CisgICAgICAgICAgaUNoYXJXaWR0aCA9IHBUQy0+bV9pQ2hhcldpZHRoOworICAgICAgICAgIGlmIChpQ2hhcldpZHRoID4gMCkKKyAgICAgICAgICAgIHRwLm1faVdpZHRoICs9IGlDaGFyV2lkdGg7CisKKyAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgICAgdHAubV9pQ2hhcnMgPSBpIC0gdHAubV9pU3RhcnRDaGFyOworICAgICAgICBtX3BDdXJMaW5lLT5tX0xpbmVQaWVjZXMucHVzaF9iYWNrKHRwKTsKKyAgICAgICAgdHAubV9pU3RhcnRQb3MgKz0gdHAubV9pV2lkdGg7CisgICAgICAgIHRwLm1faVN0YXJ0Q2hhciA9IGk7CisgICAgICAgIHRwby5pbmRleCA9ICsrajsKKyAgICAgICAgdHBvLnBvcyA9IHRwLm1faUJpZGlQb3M7CisgICAgICAgIHRwb3MtPnB1c2hfYmFjayh0cG8pOworICAgICAgICBpQmlkaUxldmVsID0gLTE7CisgICAgICB9IGVsc2UgeworICAgICAgICBpQ2hhcldpZHRoID0gcFRDLT5tX2lDaGFyV2lkdGg7CisgICAgICAgIGlmIChpQ2hhcldpZHRoID4gMCkKKyAgICAgICAgICB0cC5tX2lXaWR0aCArPSBpQ2hhcldpZHRoOworCisgICAgICAgIGkrKzsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGkgPiB0cC5tX2lTdGFydENoYXIpIHsKKyAgICAgIHRwLm1fZHdTdGF0dXMgPSBkd1N0YXR1czsKKyAgICAgIHRwLm1faUNoYXJzID0gaSAtIHRwLm1faVN0YXJ0Q2hhcjsKKyAgICAgIG1fcEN1ckxpbmUtPm1fTGluZVBpZWNlcy5wdXNoX2JhY2sodHApOworICAgICAgdHBvLmluZGV4ID0gKytqOworICAgICAgdHBvLnBvcyA9IHRwLm1faUJpZGlQb3M7CisgICAgICB0cG9zLT5wdXNoX2JhY2sodHBvKTsKKyAgICB9CisgICAgaWYgKGogPiAtMSkgeworICAgICAgaWYgKGogPiAwKSB7CisgICAgICAgIHN0ZDo6c29ydCh0cG9zLT5iZWdpbigpLCB0cG9zLT5lbmQoKSk7CisgICAgICAgIGludDMyX3QgaVN0YXJ0UG9zID0gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8PSBqOyBpKyspIHsKKyAgICAgICAgICB0cG8gPSAoKnRwb3MpW2ldOworICAgICAgICAgIENGWF9CcmVha1BpZWNlJiB0dHAgPSBtX3BDdXJMaW5lLT5tX0xpbmVQaWVjZXNbdHBvLmluZGV4XTsKKyAgICAgICAgICB0dHAubV9pU3RhcnRQb3MgPSBpU3RhcnRQb3M7CisgICAgICAgICAgaVN0YXJ0UG9zICs9IHR0cC5tX2lXaWR0aDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbV9wQ3VyTGluZS0+bV9MaW5lUGllY2VzW2pdLm1fZHdTdGF0dXMgPSBkd1N0YXR1czsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdHAubV9kd1N0YXR1cyA9IGR3U3RhdHVzOworICAgIHRwLm1faVN0YXJ0UG9zID0gbV9wQ3VyTGluZS0+bV9pU3RhcnQ7CisgICAgdHAubV9pV2lkdGggPSBtX3BDdXJMaW5lLT5tX2lXaWR0aDsKKyAgICB0cC5tX2lTdGFydENoYXIgPSAwOworICAgIHRwLm1faUNoYXJzID0gaUNvdW50OworICAgIHRwLm1fcENoYXJzID0gJm1fcEN1ckxpbmUtPm1fTGluZUNoYXJzOworICAgIHBUQyA9ICZjaGFyc1swXTsKKyAgICB0cC5tX2R3Q2hhclN0eWxlcyA9IHBUQy0+bV9kd0NoYXJTdHlsZXM7CisgICAgdHAubV9pSG9yaXpvbnRhbFNjYWxlID0gcFRDLT5ob3Jpem9uYWxfc2NhbGUoKTsKKyAgICB0cC5tX2lWZXJ0aWNhbFNjYWxlID0gcFRDLT52ZXJ0aWNhbF9zY2FsZSgpOworICAgIG1fcEN1ckxpbmUtPm1fTGluZVBpZWNlcy5wdXNoX2JhY2sodHApOworICAgIHRwb3MtPnB1c2hfYmFjayh7MCwgMH0pOworICB9Cit9CisKK3ZvaWQgQ0ZYX1R4dEJyZWFrOjpFbmRCcmVha19BbGlnbm1lbnQoY29uc3Qgc3RkOjpkZXF1ZTxGWF9UUE8+JiB0cG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJBbGxDaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0JyZWFrVHlwZSBkd1N0YXR1cykgeworICBpbnQzMl90IGlOZXRXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOworICBpbnQzMl90IGlHYXBDaGFycyA9IDA7CisgIGJvb2wgYkZpbmQgPSBmYWxzZTsKKyAgZm9yIChhdXRvIGl0ID0gdHBvcy5yYmVnaW4oKTsgaXQgIT0gdHBvcy5yZW5kKCk7ICsraXQpIHsKKyAgICBDRlhfQnJlYWtQaWVjZSYgdHRwID0gbV9wQ3VyTGluZS0+bV9MaW5lUGllY2VzW2l0LT5pbmRleF07CisgICAgaWYgKCFiRmluZCkKKyAgICAgIGlOZXRXaWR0aCA9IHR0cC5HZXRFbmRQb3MoKTsKKworICAgIGJvb2wgYkFyYWJpYyA9IEZYX0lzT2RkKHR0cC5tX2lCaWRpTGV2ZWwpOworICAgIGludDMyX3QgaiA9IGJBcmFiaWMgPyAwIDogdHRwLm1faUNoYXJzIC0gMTsKKyAgICB3aGlsZSAoaiA+IC0xICYmIGogPCB0dHAubV9pQ2hhcnMpIHsKKyAgICAgIGNvbnN0IENGWF9DaGFyKiBwVEMgPSB0dHAuR2V0Q2hhcihqKTsKKyAgICAgIGlmIChwVEMtPm1fbkJyZWFrVHlwZSA9PSBGWF9MQlRfRElSRUNUX0JSSykKKyAgICAgICAgaUdhcENoYXJzKys7CisgICAgICBpZiAoIWJGaW5kIHx8ICFiQWxsQ2hhcnMpIHsKKyAgICAgICAgRlhfQ0hBUlRZUEUgY2hhcnR5cGUgPSBwVEMtPkdldENoYXJUeXBlKCk7CisgICAgICAgIGlmIChjaGFydHlwZSA9PSBGWF9DSEFSVFlQRV9TcGFjZSB8fCBjaGFydHlwZSA9PSBGWF9DSEFSVFlQRV9Db250cm9sKSB7CisgICAgICAgICAgaWYgKCFiRmluZCAmJiBiQWxsQ2hhcnMgJiYgcFRDLT5tX2lDaGFyV2lkdGggPiAwKQorICAgICAgICAgICAgaU5ldFdpZHRoIC09IHBUQy0+bV9pQ2hhcldpZHRoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJGaW5kID0gdHJ1ZTsKKyAgICAgICAgICBpZiAoIWJBbGxDaGFycykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBqICs9IGJBcmFiaWMgPyAxIDogLTE7CisgICAgfQorICAgIGlmICghYkFsbENoYXJzICYmIGJGaW5kKQorICAgICAgYnJlYWs7CisgIH0KKworICBpbnQzMl90IGlPZmZzZXQgPSBtX2lMaW5lV2lkdGggLSBpTmV0V2lkdGg7CisgIGlmIChpR2FwQ2hhcnMgPiAwICYmIG1faUFsaWdubWVudCAmIENGWF9UeHRMaW5lQWxpZ25tZW50X0p1c3RpZmllZCAmJgorICAgICAgZHdTdGF0dXMgIT0gQ0ZYX0JyZWFrVHlwZTo6UGFyYWdyYXBoKSB7CisgICAgaW50MzJfdCBpU3RhcnQgPSAtMTsKKyAgICBmb3IgKGF1dG8mIHRwbyA6IHRwb3MpIHsKKyAgICAgIENGWF9CcmVha1BpZWNlJiB0dHAgPSBtX3BDdXJMaW5lLT5tX0xpbmVQaWVjZXNbdHBvLmluZGV4XTsKKyAgICAgIGlmIChpU3RhcnQgPCAtMSkKKyAgICAgICAgaVN0YXJ0ID0gdHRwLm1faVN0YXJ0UG9zOworICAgICAgZWxzZQorICAgICAgICB0dHAubV9pU3RhcnRQb3MgPSBpU3RhcnQ7CisKKyAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHR0cC5tX2lDaGFyczsgaisrKSB7CisgICAgICAgIENGWF9DaGFyKiBwVEMgPSB0dHAuR2V0Q2hhcihqKTsKKyAgICAgICAgaWYgKHBUQy0+bV9uQnJlYWtUeXBlICE9IEZYX0xCVF9ESVJFQ1RfQlJLIHx8IHBUQy0+bV9pQ2hhcldpZHRoIDwgMCkKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpbnQzMl90IGsgPSBpT2Zmc2V0IC8gaUdhcENoYXJzOworICAgICAgICBwVEMtPm1faUNoYXJXaWR0aCArPSBrOworICAgICAgICB0dHAubV9pV2lkdGggKz0gazsKKyAgICAgICAgaU9mZnNldCAtPSBrOworICAgICAgICBpR2FwQ2hhcnMtLTsKKyAgICAgICAgaWYgKGlHYXBDaGFycyA8IDEpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpU3RhcnQgKz0gdHRwLm1faVdpZHRoOworICAgIH0KKyAgfSBlbHNlIGlmIChtX2lBbGlnbm1lbnQgJiBDRlhfVHh0TGluZUFsaWdubWVudF9DZW50ZXIgfHwKKyAgICAgICAgICAgICBtX2lBbGlnbm1lbnQgJiBDRlhfVHh0TGluZUFsaWdubWVudF9SaWdodCkgeworICAgIGlmIChtX2lBbGlnbm1lbnQgJiBDRlhfVHh0TGluZUFsaWdubWVudF9DZW50ZXIgJiYKKyAgICAgICAgIShtX2lBbGlnbm1lbnQgJiBDRlhfVHh0TGluZUFsaWdubWVudF9SaWdodCkpIHsKKyAgICAgIGlPZmZzZXQgLz0gMjsKKyAgICB9CisgICAgaWYgKGlPZmZzZXQgPiAwKSB7CisgICAgICBmb3IgKGF1dG8mIHR0cCA6IG1fcEN1ckxpbmUtPm1fTGluZVBpZWNlcykKKyAgICAgICAgdHRwLm1faVN0YXJ0UG9zICs9IGlPZmZzZXQ7CisgICAgfQorICB9Cit9CisKK0NGWF9CcmVha1R5cGUgQ0ZYX1R4dEJyZWFrOjpFbmRCcmVhayhDRlhfQnJlYWtUeXBlIGR3U3RhdHVzKSB7CisgIEFTU0VSVChkd1N0YXR1cyAhPSBDRlhfQnJlYWtUeXBlOjpOb25lKTsKKworICBpZiAoIW1fcEN1ckxpbmUtPm1fTGluZVBpZWNlcy5lbXB0eSgpKSB7CisgICAgaWYgKGR3U3RhdHVzICE9IENGWF9CcmVha1R5cGU6OlBpZWNlKQorICAgICAgbV9wQ3VyTGluZS0+bV9MaW5lUGllY2VzLmJhY2soKS5tX2R3U3RhdHVzID0gZHdTdGF0dXM7CisgICAgcmV0dXJuIG1fcEN1ckxpbmUtPm1fTGluZVBpZWNlcy5iYWNrKCkubV9kd1N0YXR1czsKKyAgfQorCisgIGlmIChIYXNMaW5lKCkpIHsKKyAgICBpZiAoIW1fTGluZVttX2lSZWFkeUxpbmVJbmRleF0ubV9MaW5lUGllY2VzLmVtcHR5KCkpIHsKKyAgICAgIGlmIChkd1N0YXR1cyAhPSBDRlhfQnJlYWtUeXBlOjpQaWVjZSkKKyAgICAgICAgbV9MaW5lW21faVJlYWR5TGluZUluZGV4XS5tX0xpbmVQaWVjZXMuYmFjaygpLm1fZHdTdGF0dXMgPSBkd1N0YXR1czsKKyAgICAgIHJldHVybiBtX0xpbmVbbV9pUmVhZHlMaW5lSW5kZXhdLm1fTGluZVBpZWNlcy5iYWNrKCkubV9kd1N0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIENGWF9CcmVha1R5cGU6Ok5vbmU7CisgIH0KKworICBpbnQzMl90IGlDb3VudCA9IG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsKKyAgaWYgKGlDb3VudCA8IDEpCisgICAgcmV0dXJuIENGWF9CcmVha1R5cGU6Ok5vbmU7CisKKyAgbV9wQ3VyTGluZS0+R2V0Q2hhcihpQ291bnQgLSAxKS0+bV9kd1N0YXR1cyA9IGR3U3RhdHVzOworICBpZiAoZHdTdGF0dXMgPT0gQ0ZYX0JyZWFrVHlwZTo6UGllY2UpCisgICAgcmV0dXJuIGR3U3RhdHVzOworCisgIG1faVJlYWR5TGluZUluZGV4ID0gbV9wQ3VyTGluZSA9PSAmbV9MaW5lWzBdID8gMCA6IDE7CisgIENGWF9CcmVha0xpbmUqIHBOZXh0TGluZSA9ICZtX0xpbmVbMSAtIG1faVJlYWR5TGluZUluZGV4XTsKKyAgYm9vbCBiQWxsQ2hhcnMgPSBtX2lBbGlnbm1lbnQgPiBDRlhfVHh0TGluZUFsaWdubWVudF9SaWdodDsKKyAgaWYgKCFFbmRCcmVha19TcGxpdExpbmUocE5leHRMaW5lLCBiQWxsQ2hhcnMpKSB7CisgICAgc3RkOjpkZXF1ZTxGWF9UUE8+IHRwb3M7CisgICAgRW5kQnJlYWtfQmlkaUxpbmUoJnRwb3MsIGR3U3RhdHVzKTsKKyAgICBpZiAobV9pQWxpZ25tZW50ID4gQ0ZYX1R4dExpbmVBbGlnbm1lbnRfTGVmdCkKKyAgICAgIEVuZEJyZWFrX0FsaWdubWVudCh0cG9zLCBiQWxsQ2hhcnMsIGR3U3RhdHVzKTsKKyAgfQorCisgIG1fcEN1ckxpbmUgPSBwTmV4dExpbmU7CisgIENGWF9DaGFyKiBwVEMgPSBHZXRMYXN0Q2hhcigwLCBmYWxzZSwgZmFsc2UpOworICBtX2VDaGFyVHlwZSA9IHBUQyA/IHBUQy0+R2V0Q2hhclR5cGUoKSA6IEZYX0NIQVJUWVBFX1Vua25vd247CisKKyAgcmV0dXJuIGR3U3RhdHVzOworfQorCitpbnQzMl90IENGWF9UeHRCcmVhazo6R2V0QnJlYWtQb3Moc3RkOjp2ZWN0b3I8Q0ZYX0NoYXI+JiBjYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRW5kUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFsbENoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk9ubHlCcmspIHsKKyAgaW50MzJfdCBpTGVuZ3RoID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihjYSkgLSAxOworICBpZiAoaUxlbmd0aCA8IDEpCisgICAgcmV0dXJuIGlMZW5ndGg7CisKKyAgaW50MzJfdCBpQnJlYWsgPSAtMTsKKyAgaW50MzJfdCBpQnJlYWtQb3MgPSAtMTsKKyAgaW50MzJfdCBpSW5kaXJlY3QgPSAtMTsKKyAgaW50MzJfdCBpSW5kaXJlY3RQb3MgPSAtMTsKKyAgaW50MzJfdCBpTGFzdCA9IC0xOworICBpbnQzMl90IGlMYXN0UG9zID0gLTE7CisgIGlmIChtX2JTaW5nbGVMaW5lIHx8IGlFbmRQb3MgPD0gbV9pTGluZVdpZHRoKSB7CisgICAgaWYgKCFiQWxsQ2hhcnMpCisgICAgICByZXR1cm4gaUxlbmd0aDsKKworICAgIGlCcmVhayA9IGlMZW5ndGg7CisgICAgaUJyZWFrUG9zID0gaUVuZFBvczsKKyAgfQorCisgIEZYX0xJTkVCUkVBS1RZUEUgZVR5cGU7CisgIHVpbnQzMl90IG5Db2RlUHJvcDsKKyAgdWludDMyX3QgbkN1cjsKKyAgdWludDMyX3Qgbk5leHQ7CisgIENGWF9DaGFyKiBwQ3VyID0gJmNhW2lMZW5ndGgtLV07CisgIGlmIChiQWxsQ2hhcnMpCisgICAgcEN1ci0+bV9uQnJlYWtUeXBlID0gRlhfTEJUX1VOS05PV047CisKKyAgbkNvZGVQcm9wID0gcEN1ci0+Y2hhcl9wcm9wcygpOworICBuTmV4dCA9IG5Db2RlUHJvcCAmIDB4MDAzRjsKKyAgaW50MzJfdCBpQ2hhcldpZHRoID0gcEN1ci0+bV9pQ2hhcldpZHRoOworICBpZiAoaUNoYXJXaWR0aCA+IDApCisgICAgaUVuZFBvcyAtPSBpQ2hhcldpZHRoOworCisgIHdoaWxlIChpTGVuZ3RoID49IDApIHsKKyAgICBwQ3VyID0gJmNhW2lMZW5ndGhdOworICAgIG5Db2RlUHJvcCA9IHBDdXItPmNoYXJfcHJvcHMoKTsKKyAgICBuQ3VyID0gbkNvZGVQcm9wICYgMHgwMDNGOworICAgIGlmIChuTmV4dCA9PSBrQnJlYWtQcm9wZXJ0eVNwYWNlKQorICAgICAgZVR5cGUgPSBGWF9MQlRfUFJPSElCSVRFRF9CUks7CisgICAgZWxzZQorICAgICAgZVR5cGUgPSBnc19GWF9MaW5lQnJlYWtfUGFpclRhYmxlW25DdXJdW25OZXh0XTsKKyAgICBpZiAoYkFsbENoYXJzKQorICAgICAgcEN1ci0+bV9uQnJlYWtUeXBlID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oZVR5cGUpOworICAgIGlmICghYk9ubHlCcmspIHsKKyAgICAgIGlmIChtX2JTaW5nbGVMaW5lIHx8IGlFbmRQb3MgPD0gbV9pTGluZVdpZHRoIHx8CisgICAgICAgICAgbkN1ciA9PSBrQnJlYWtQcm9wZXJ0eVNwYWNlKSB7CisgICAgICAgIGlmIChlVHlwZSA9PSBGWF9MQlRfRElSRUNUX0JSSyAmJiBpQnJlYWsgPCAwKSB7CisgICAgICAgICAgaUJyZWFrID0gaUxlbmd0aDsKKyAgICAgICAgICBpQnJlYWtQb3MgPSBpRW5kUG9zOworICAgICAgICAgIGlmICghYkFsbENoYXJzKQorICAgICAgICAgICAgcmV0dXJuIGlMZW5ndGg7CisgICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gRlhfTEJUX0lORElSRUNUX0JSSyAmJiBpSW5kaXJlY3QgPCAwKSB7CisgICAgICAgICAgaUluZGlyZWN0ID0gaUxlbmd0aDsKKyAgICAgICAgICBpSW5kaXJlY3RQb3MgPSBpRW5kUG9zOworICAgICAgICB9CisgICAgICAgIGlmIChpTGFzdCA8IDApIHsKKyAgICAgICAgICBpTGFzdCA9IGlMZW5ndGg7CisgICAgICAgICAgaUxhc3RQb3MgPSBpRW5kUG9zOworICAgICAgICB9CisgICAgICB9CisgICAgICBpQ2hhcldpZHRoID0gcEN1ci0+bV9pQ2hhcldpZHRoOworICAgICAgaWYgKGlDaGFyV2lkdGggPiAwKQorICAgICAgICBpRW5kUG9zIC09IGlDaGFyV2lkdGg7CisgICAgfQorICAgIG5OZXh0ID0gbkNvZGVQcm9wICYgMHgwMDNGOworICAgIGlMZW5ndGgtLTsKKyAgfQorICBpZiAoYk9ubHlCcmspCisgICAgcmV0dXJuIDA7CisgIGlmIChpQnJlYWsgPiAtMSkgeworICAgIGlFbmRQb3MgPSBpQnJlYWtQb3M7CisgICAgcmV0dXJuIGlCcmVhazsKKyAgfQorICBpZiAoaUluZGlyZWN0ID4gLTEpIHsKKyAgICBpRW5kUG9zID0gaUluZGlyZWN0UG9zOworICAgIHJldHVybiBpSW5kaXJlY3Q7CisgIH0KKyAgaWYgKGlMYXN0ID4gLTEpIHsKKyAgICBpRW5kUG9zID0gaUxhc3RQb3M7CisgICAgcmV0dXJuIGlMYXN0OworICB9CisgIHJldHVybiAwOworfQorCit2b2lkIENGWF9UeHRCcmVhazo6U3BsaXRUZXh0TGluZShDRlhfQnJlYWtMaW5lKiBwQ3VyTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CcmVha0xpbmUqIHBOZXh0TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFsbENoYXJzKSB7CisgIEFTU0VSVChwQ3VyTGluZSAmJiBwTmV4dExpbmUpOworICBpbnQzMl90IGlDb3VudCA9IHBDdXJMaW5lLT5Db3VudENoYXJzKCk7CisgIGlmIChpQ291bnQgPCAyKQorICAgIHJldHVybjsKKworICBpbnQzMl90IGlFbmRQb3MgPSBwQ3VyTGluZS0+bV9pV2lkdGg7CisgIHN0ZDo6dmVjdG9yPENGWF9DaGFyPiYgY3VyQ2hhcnMgPSBwQ3VyTGluZS0+bV9MaW5lQ2hhcnM7CisgIGludDMyX3QgaUNoYXJQb3MgPSBHZXRCcmVha1BvcyhjdXJDaGFycywgaUVuZFBvcywgYkFsbENoYXJzLCBmYWxzZSk7CisgIGlmIChpQ2hhclBvcyA8IDApCisgICAgaUNoYXJQb3MgPSAwOworCisgIGlDaGFyUG9zKys7CisgIGlmIChpQ2hhclBvcyA+PSBpQ291bnQpIHsKKyAgICBwTmV4dExpbmUtPkNsZWFyKCk7CisgICAgQ0ZYX0NoYXIqIHBUQyA9ICZjdXJDaGFyc1tpQ2hhclBvcyAtIDFdOworICAgIHBUQy0+bV9uQnJlYWtUeXBlID0gRlhfTEJUX1VOS05PV047CisgICAgcmV0dXJuOworICB9CisKKyAgcE5leHRMaW5lLT5tX0xpbmVDaGFycyA9CisgICAgICBzdGQ6OnZlY3RvcjxDRlhfQ2hhcj4oY3VyQ2hhcnMuYmVnaW4oKSArIGlDaGFyUG9zLCBjdXJDaGFycy5lbmQoKSk7CisgIGN1ckNoYXJzLmVyYXNlKGN1ckNoYXJzLmJlZ2luKCkgKyBpQ2hhclBvcywgY3VyQ2hhcnMuZW5kKCkpOworICBwQ3VyTGluZS0+bV9pV2lkdGggPSBpRW5kUG9zOworICBDRlhfQ2hhciogcFRDID0gJmN1ckNoYXJzW2lDaGFyUG9zIC0gMV07CisgIHBUQy0+bV9uQnJlYWtUeXBlID0gRlhfTEJUX1VOS05PV047CisgIGlDb3VudCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50PihwTmV4dExpbmUtPm1fTGluZUNoYXJzKTsKKyAgaW50MzJfdCBpV2lkdGggPSAwOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgeworICAgIGlmIChwTmV4dExpbmUtPm1fTGluZUNoYXJzW2ldLkdldENoYXJUeXBlKCkgPj0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgeworICAgICAgcEN1ckxpbmUtPm1faUFyYWJpY0NoYXJzLS07CisgICAgICBwTmV4dExpbmUtPm1faUFyYWJpY0NoYXJzKys7CisgICAgfQorICAgIGlXaWR0aCArPSBzdGQ6Om1heCgwLCBwTmV4dExpbmUtPm1fTGluZUNoYXJzW2ldLm1faUNoYXJXaWR0aCk7CisgICAgcE5leHRMaW5lLT5tX0xpbmVDaGFyc1tpXS5tX2R3U3RhdHVzID0gQ0ZYX0JyZWFrVHlwZTo6Tm9uZTsKKyAgfQorICBwTmV4dExpbmUtPm1faVdpZHRoID0gaVdpZHRoOworfQorCitzdHJ1Y3QgRlhfRk9STUNIQVIgeworICB1aW50MTZfdCB3Y2g7CisgIHVpbnQxNl90IHdGb3JtOworICBpbnQzMl90IGlXaWR0aDsKK307CisKK2ludDMyX3QgQ0ZYX1R4dEJyZWFrOjpHZXREaXNwbGF5UG9zKGNvbnN0IEZYX1RYVFJVTiogcFR4dFJ1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcykgY29uc3QgeworICBpZiAoIXBUeHRSdW4gfHwgcFR4dFJ1bi0+aUxlbmd0aCA8IDEpCisgICAgcmV0dXJuIDA7CisKKyAgQ0ZERV9UZXh0RWRpdEVuZ2luZSogcEVuZ2luZSA9IHBUeHRSdW4tPnBFZHRFbmdpbmU7CisgIGNvbnN0IHdjaGFyX3QqIHBTdHIgPSBwVHh0UnVuLT53c1N0ci5jX3N0cigpOworICBpbnQzMl90KiBwV2lkdGhzID0gcFR4dFJ1bi0+cFdpZHRoczsKKyAgaW50MzJfdCBpTGVuZ3RoID0gcFR4dFJ1bi0+aUxlbmd0aCAtIDE7CisgIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+IHBGb250ID0gcFR4dFJ1bi0+cEZvbnQ7CisgIHVpbnQzMl90IGR3U3R5bGVzID0gcFR4dFJ1bi0+ZHdTdHlsZXM7CisgIENGWF9SZWN0RiBydFRleHQoKnBUeHRSdW4tPnBSZWN0KTsKKyAgYm9vbCBiUlRMUGllY2UgPSAocFR4dFJ1bi0+ZHdDaGFyU3R5bGVzICYgRlhfVFhUQ0hBUlNUWUxFX09kZEJpZGlMZXZlbCkgIT0gMDsKKyAgZmxvYXQgZkZvbnRTaXplID0gcFR4dFJ1bi0+ZkZvbnRTaXplOworICBpbnQzMl90IGlGb250U2l6ZSA9IEZYU1lTX3JvdW5kKGZGb250U2l6ZSAqIDIwLjBmKTsKKyAgaW50MzJfdCBpQXNjZW50ID0gcEZvbnQtPkdldEFzY2VudCgpOworICBpbnQzMl90IGlEZXNjZW50ID0gcEZvbnQtPkdldERlc2NlbnQoKTsKKyAgaW50MzJfdCBpTWF4SGVpZ2h0ID0gaUFzY2VudCAtIGlEZXNjZW50OworICBmbG9hdCBmRm9udEhlaWdodCA9IGZGb250U2l6ZTsKKyAgZmxvYXQgZkFzY2VudCA9IGZGb250SGVpZ2h0ICogKGZsb2F0KWlBc2NlbnQgLyAoZmxvYXQpaU1heEhlaWdodDsKKyAgZmxvYXQgZlggPSBydFRleHQubGVmdDsKKyAgZmxvYXQgZlk7CisgIGZsb2F0IGZDaGFyV2lkdGg7CisgIGludDMyX3QgaUhvclNjYWxlID0gcFR4dFJ1bi0+aUhvcml6b250YWxTY2FsZTsKKyAgaW50MzJfdCBpVmVyU2NhbGUgPSBwVHh0UnVuLT5pVmVydGljYWxTY2FsZTsKKyAgYm9vbCBiU2tpcFNwYWNlID0gcFR4dFJ1bi0+YlNraXBTcGFjZTsKKyAgRlhfRk9STUNIQVIgZm9ybUNoYXJzWzNdOworICBmbG9hdCBmWUJhc2U7CisKKyAgaWYgKGJSVExQaWVjZSkKKyAgICBmWCA9IHJ0VGV4dC5yaWdodCgpOworCisgIGZZQmFzZSA9IHJ0VGV4dC50b3AgKyAocnRUZXh0LmhlaWdodCAtIGZGb250U2l6ZSkgLyAyLjBmOworICBmWSA9IGZZQmFzZSArIGZBc2NlbnQ7CisKKyAgaW50MzJfdCBpQ291bnQgPSAwOworICBpbnQzMl90IGlOZXh0ID0gMDsKKyAgd2NoYXJfdCB3UHJldiA9IDB4RkVGRjsKKyAgd2NoYXJfdCB3TmV4dCA9IDB4RkVGRjsKKyAgd2NoYXJfdCB3Rm9ybSA9IDB4RkVGRjsKKyAgd2NoYXJfdCB3TGFzdCA9IDB4RkVGRjsKKyAgYm9vbCBiU2hhZGRhID0gZmFsc2U7CisgIGJvb2wgYkxhbSA9IGZhbHNlOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPD0gaUxlbmd0aDsgaSsrKSB7CisgICAgaW50MzJfdCBpV2lkdGg7CisgICAgd2NoYXJfdCB3Y2g7CisgICAgaWYgKHBFbmdpbmUpIHsKKyAgICAgIHdjaCA9IHBFbmdpbmUtPkdldENoYXIoaSk7CisgICAgICBpV2lkdGggPSBwRW5naW5lLT5HZXRXaWR0aE9mQ2hhcihpKTsKKyAgICB9IGVsc2UgeworICAgICAgd2NoID0gKnBTdHIrKzsKKyAgICAgIGlXaWR0aCA9ICpwV2lkdGhzKys7CisgICAgfQorCisgICAgdWludDMyX3QgZHdQcm9wcyA9IEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKHdjaCk7CisgICAgRlhfQ0hBUlRZUEUgY2hhcnR5cGUgPSBHZXRDaGFyVHlwZUZyb21Qcm9wKGR3UHJvcHMpOworICAgIGlmIChjaGFydHlwZSA9PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmICYmIGlXaWR0aCA9PSAwKSB7CisgICAgICB3UHJldiA9IDB4RkVGRjsKKyAgICAgIHdMYXN0ID0gd2NoOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKGNoYXJ0eXBlID49IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpIHsKKyAgICAgIGlmIChpIDwgaUxlbmd0aCkgeworICAgICAgICBpZiAocEVuZ2luZSkgeworICAgICAgICAgIGlOZXh0ID0gaSArIDE7CisgICAgICAgICAgd2hpbGUgKGlOZXh0IDw9IGlMZW5ndGgpIHsKKyAgICAgICAgICAgIHdOZXh0ID0gcEVuZ2luZS0+R2V0Q2hhcihpTmV4dCk7CisgICAgICAgICAgICBkd1Byb3BzID0gRlhfR2V0VW5pY29kZVByb3BlcnRpZXMod05leHQpOworICAgICAgICAgICAgaWYgKChkd1Byb3BzICYgRlhfQ0hBUlRZUEVCSVRTTUFTSykgIT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpTmV4dCsrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoaU5leHQgPiBpTGVuZ3RoKQorICAgICAgICAgICAgd05leHQgPSAweEZFRkY7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaW50MzJfdCBqID0gLTE7CisgICAgICAgICAgZG8geworICAgICAgICAgICAgaisrOworICAgICAgICAgICAgaWYgKGkgKyBqID49IGlMZW5ndGgpCisgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB3TmV4dCA9IHBTdHJbal07CisgICAgICAgICAgICBkd1Byb3BzID0gRlhfR2V0VW5pY29kZVByb3BlcnRpZXMod05leHQpOworICAgICAgICAgIH0gd2hpbGUgKChkd1Byb3BzICYgRlhfQ0hBUlRZUEVCSVRTTUFTSykgPT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pOworICAgICAgICAgIGlmIChpICsgaiA+PSBpTGVuZ3RoKQorICAgICAgICAgICAgd05leHQgPSAweEZFRkY7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHdOZXh0ID0gMHhGRUZGOworICAgICAgfQorCisgICAgICB3Rm9ybSA9IHBkZml1bTo6YXJhYmljOjpHZXRGb3JtQ2hhcih3Y2gsIHdQcmV2LCB3TmV4dCk7CisgICAgICBiTGFtID0gKHdQcmV2ID09IDB4MDY0NCAmJiB3Y2ggPT0gMHgwNjQ0ICYmIHdOZXh0ID09IDB4MDY0Nyk7CisgICAgfSBlbHNlIGlmIChjaGFydHlwZSA9PSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikgeworICAgICAgd0Zvcm0gPSB3Y2g7CisgICAgICBpZiAod2NoID49IDB4MDY0QyAmJiB3Y2ggPD0gMHgwNjUxKSB7CisgICAgICAgIGlmIChiU2hhZGRhKSB7CisgICAgICAgICAgd0Zvcm0gPSAweEZFRkY7CisgICAgICAgICAgYlNoYWRkYSA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHdOZXh0ID0gMHhGRUZGOworICAgICAgICAgIGlmIChwRW5naW5lKSB7CisgICAgICAgICAgICBpTmV4dCA9IGkgKyAxOworICAgICAgICAgICAgaWYgKGlOZXh0IDw9IGlMZW5ndGgpCisgICAgICAgICAgICAgIHdOZXh0ID0gcEVuZ2luZS0+R2V0Q2hhcihpTmV4dCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpIDwgaUxlbmd0aCkKKyAgICAgICAgICAgICAgd05leHQgPSAqcFN0cjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKHdjaCA9PSAweDA2NTEpIHsKKyAgICAgICAgICAgIGlmICh3TmV4dCA+PSAweDA2NEMgJiYgd05leHQgPD0gMHgwNjUwKSB7CisgICAgICAgICAgICAgIHdGb3JtID0gRlhfR2V0QXJhYmljRnJvbVNoYWRkYVRhYmxlKHdOZXh0KTsKKyAgICAgICAgICAgICAgYlNoYWRkYSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh3TmV4dCA9PSAweDA2NTEpIHsKKyAgICAgICAgICAgICAgd0Zvcm0gPSBGWF9HZXRBcmFiaWNGcm9tU2hhZGRhVGFibGUod2NoKTsKKyAgICAgICAgICAgICAgYlNoYWRkYSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBiU2hhZGRhID0gZmFsc2U7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChjaGFydHlwZSA9PSBGWF9DSEFSVFlQRV9OdW1lcmljKSB7CisgICAgICB3Rm9ybSA9IHdjaDsKKyAgICB9IGVsc2UgaWYgKHdjaCA9PSBMJy4nKSB7CisgICAgICB3Rm9ybSA9IHdjaDsKKyAgICB9IGVsc2UgaWYgKHdjaCA9PSBMJywnKSB7CisgICAgICB3Rm9ybSA9IHdjaDsKKyAgICB9IGVsc2UgaWYgKGJSVExQaWVjZSkgeworICAgICAgd0Zvcm0gPSBGWF9HZXRNaXJyb3JDaGFyKHdjaCwgZHdQcm9wcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdGb3JtID0gd2NoOworICAgIH0KKyAgICBpZiAoY2hhcnR5cGUgIT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pCisgICAgICBiU2hhZGRhID0gZmFsc2U7CisgICAgaWYgKGNoYXJ0eXBlIDwgRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikKKyAgICAgIGJMYW0gPSBmYWxzZTsKKworICAgIGR3UHJvcHMgPSBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3Rm9ybSk7CisgICAgYm9vbCBiRW1wdHlDaGFyID0KKyAgICAgICAgKGNoYXJ0eXBlID49IEZYX0NIQVJUWVBFX1RhYiAmJiBjaGFydHlwZSA8PSBGWF9DSEFSVFlQRV9Db250cm9sKTsKKyAgICBpZiAod0Zvcm0gPT0gMHhGRUZGKQorICAgICAgYkVtcHR5Q2hhciA9IHRydWU7CisKKyAgICBpbnQzMl90IGlGb3JtcyA9IGJMYW0gPyAzIDogMTsKKyAgICBpQ291bnQgKz0gKGJFbXB0eUNoYXIgJiYgYlNraXBTcGFjZSkgPyAwIDogaUZvcm1zOworICAgIGlmICghcENoYXJQb3MpIHsKKyAgICAgIGlmIChpV2lkdGggPiAwKQorICAgICAgICB3UHJldiA9IHdjaDsKKyAgICAgIHdMYXN0ID0gd2NoOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaW50MzJfdCBpQ2hhcldpZHRoID0gaVdpZHRoOworICAgIGlmIChpQ2hhcldpZHRoIDwgMCkKKyAgICAgIGlDaGFyV2lkdGggPSAtaUNoYXJXaWR0aDsKKworICAgIGlDaGFyV2lkdGggLz0gaUZvbnRTaXplOworICAgIGZvcm1DaGFyc1swXS53Y2ggPSB3Y2g7CisgICAgZm9ybUNoYXJzWzBdLndGb3JtID0gd0Zvcm07CisgICAgZm9ybUNoYXJzWzBdLmlXaWR0aCA9IGlDaGFyV2lkdGg7CisgICAgaWYgKGJMYW0pIHsKKyAgICAgIGZvcm1DaGFyc1sxXS53Rm9ybSA9IDB4MDY1MTsKKyAgICAgIGlDaGFyV2lkdGggPSAwOworICAgICAgcEZvbnQtPkdldENoYXJXaWR0aCgweDA2NTEsIGlDaGFyV2lkdGgpOworICAgICAgZm9ybUNoYXJzWzFdLmlXaWR0aCA9IGlDaGFyV2lkdGg7CisgICAgICBmb3JtQ2hhcnNbMl0ud0Zvcm0gPSAweDA2NzA7CisgICAgICBpQ2hhcldpZHRoID0gMDsKKyAgICAgIHBGb250LT5HZXRDaGFyV2lkdGgoMHgwNjcwLCBpQ2hhcldpZHRoKTsKKyAgICAgIGZvcm1DaGFyc1syXS5pV2lkdGggPSBpQ2hhcldpZHRoOworICAgIH0KKworICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlGb3JtczsgaisrKSB7CisgICAgICB3Rm9ybSA9ICh3Y2hhcl90KWZvcm1DaGFyc1tqXS53Rm9ybTsKKyAgICAgIGlDaGFyV2lkdGggPSBmb3JtQ2hhcnNbal0uaVdpZHRoOworICAgICAgaWYgKGogPiAwKSB7CisgICAgICAgIGNoYXJ0eXBlID0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb247CisgICAgICAgIHdjaCA9IHdGb3JtOworICAgICAgICB3TGFzdCA9ICh3Y2hhcl90KWZvcm1DaGFyc1tqIC0gMV0ud0Zvcm07CisgICAgICB9CisgICAgICBpZiAoIWJFbXB0eUNoYXIgfHwgKGJFbXB0eUNoYXIgJiYgIWJTa2lwU3BhY2UpKSB7CisgICAgICAgIHBDaGFyUG9zLT5tX0dseXBoSW5kZXggPSBwRm9udC0+R2V0R2x5cGhJbmRleCh3Rm9ybSk7CisjaWYgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fQVBQTEVfCisgICAgICAgIHBDaGFyUG9zLT5tX0V4dEdJRCA9IHBDaGFyUG9zLT5tX0dseXBoSW5kZXg7CisjZW5kaWYKKyAgICAgICAgcENoYXJQb3MtPm1fRm9udENoYXJXaWR0aCA9IGlDaGFyV2lkdGg7CisgICAgICB9CisKKyAgICAgIGZDaGFyV2lkdGggPSBmRm9udFNpemUgKiBpQ2hhcldpZHRoIC8gMTAwMC4wZjsKKyAgICAgIGlmIChiUlRMUGllY2UgJiYgY2hhcnR5cGUgIT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pCisgICAgICAgIGZYIC09IGZDaGFyV2lkdGg7CisKKyAgICAgIGlmICghYkVtcHR5Q2hhciB8fCAoYkVtcHR5Q2hhciAmJiAhYlNraXBTcGFjZSkpIHsKKyAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luID0gQ0ZYX1BvaW50RihmWCwgZlkpOworCisgICAgICAgIGlmICgoZHdTdHlsZXMgJiBGWF9MQVlPVVRTVFlMRV9Db21iVGV4dCkgIT0gMCkgeworICAgICAgICAgIGludDMyX3QgaUZvcm1XaWR0aCA9IGlDaGFyV2lkdGg7CisgICAgICAgICAgcEZvbnQtPkdldENoYXJXaWR0aCh3Rm9ybSwgaUZvcm1XaWR0aCk7CisgICAgICAgICAgZmxvYXQgZk9mZnNldCA9IGZGb250U2l6ZSAqIChpQ2hhcldpZHRoIC0gaUZvcm1XaWR0aCkgLyAyMDAwLjBmOworICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpbi54ICs9IGZPZmZzZXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2hhcnR5cGUgPT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsKKyAgICAgICAgICBDRlhfUmVjdCBydEJCb3g7CisgICAgICAgICAgaWYgKHBGb250LT5HZXRDaGFyQkJveCh3Rm9ybSwgJnJ0QkJveCkpIHsKKyAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpbi55ID0KKyAgICAgICAgICAgICAgICBmWUJhc2UgKyBmRm9udFNpemUgLQorICAgICAgICAgICAgICAgIGZGb250U2l6ZSAqIChmbG9hdClydEJCb3guaGVpZ2h0IC8gKGZsb2F0KWlNYXhIZWlnaHQ7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICh3Rm9ybSA9PSB3Y2ggJiYgd0xhc3QgIT0gMHhGRUZGKSB7CisgICAgICAgICAgICB1aW50MzJfdCBkd0xhc3RQcm9wcyA9IEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKHdMYXN0KTsKKyAgICAgICAgICAgIGlmICgoZHdMYXN0UHJvcHMgJiBGWF9DSEFSVFlQRUJJVFNNQVNLKSA9PQorICAgICAgICAgICAgICAgIEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKSB7CisgICAgICAgICAgICAgIENGWF9SZWN0IHJ0Qm94OworICAgICAgICAgICAgICBpZiAocEZvbnQtPkdldENoYXJCQm94KHdMYXN0LCAmcnRCb3gpKQorICAgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpbi55IC09IGZGb250U2l6ZSAqIHJ0Qm94LmhlaWdodCAvIGlNYXhIZWlnaHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoIWJSVExQaWVjZSAmJiBjaGFydHlwZSAhPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikKKyAgICAgICAgZlggKz0gZkNoYXJXaWR0aDsKKworICAgICAgaWYgKCFiRW1wdHlDaGFyIHx8IChiRW1wdHlDaGFyICYmICFiU2tpcFNwYWNlKSkgeworICAgICAgICBwQ2hhclBvcy0+bV9iR2x5cGhBZGp1c3QgPSB0cnVlOworICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAtMTsKKyAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMDsKKyAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gMDsKKyAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gMTsKKworICAgICAgICBpZiAoaUhvclNjYWxlICE9IDEwMCB8fCBpVmVyU2NhbGUgIT0gMTAwKSB7CisgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdICogaUhvclNjYWxlIC8gMTAwLjBmOworICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9CisgICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSAqIGlIb3JTY2FsZSAvIDEwMC4wZjsKKyAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPQorICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gKiBpVmVyU2NhbGUgLyAxMDAuMGY7CisgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0KKyAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdICogaVZlclNjYWxlIC8gMTAwLjBmOworICAgICAgICB9CisgICAgICAgIHBDaGFyUG9zKys7CisgICAgICB9CisgICAgfQorICAgIGlmIChpV2lkdGggPiAwKQorICAgICAgd1ByZXYgPSBzdGF0aWNfY2FzdDx3Y2hhcl90Pihmb3JtQ2hhcnNbMF0ud2NoKTsKKyAgICB3TGFzdCA9IHdjaDsKKyAgfQorICByZXR1cm4gaUNvdW50OworfQorCitzdGQ6OnZlY3RvcjxDRlhfUmVjdEY+IENGWF9UeHRCcmVhazo6R2V0Q2hhclJlY3RzKGNvbnN0IEZYX1RYVFJVTiogcFR4dFJ1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ2hhckJCb3gpIGNvbnN0IHsKKyAgaWYgKCFwVHh0UnVuIHx8IHBUeHRSdW4tPmlMZW5ndGggPCAxKQorICAgIHJldHVybiBzdGQ6OnZlY3RvcjxDRlhfUmVjdEY+KCk7CisKKyAgQ0ZERV9UZXh0RWRpdEVuZ2luZSogcEVuZ2luZSA9IHBUeHRSdW4tPnBFZHRFbmdpbmU7CisgIGNvbnN0IHdjaGFyX3QqIHBTdHIgPSBwVHh0UnVuLT53c1N0ci5jX3N0cigpOworICBpbnQzMl90KiBwV2lkdGhzID0gcFR4dFJ1bi0+cFdpZHRoczsKKyAgaW50MzJfdCBpTGVuZ3RoID0gcFR4dFJ1bi0+aUxlbmd0aDsKKyAgQ0ZYX1JlY3RGIHJlY3QoKnBUeHRSdW4tPnBSZWN0KTsKKyAgZmxvYXQgZkZvbnRTaXplID0gcFR4dFJ1bi0+ZkZvbnRTaXplOworICBpbnQzMl90IGlGb250U2l6ZSA9IEZYU1lTX3JvdW5kKGZGb250U2l6ZSAqIDIwLjBmKTsKKyAgZmxvYXQgZlNjYWxlID0gZkZvbnRTaXplIC8gMTAwMC4wZjsKKyAgUmV0YWluUHRyPENGR0FTX0dFRm9udD4gcEZvbnQgPSBwVHh0UnVuLT5wRm9udDsKKyAgaWYgKCFwRm9udCkKKyAgICBiQ2hhckJCb3ggPSBmYWxzZTsKKworICBDRlhfUmVjdCBiYm94OworICBpZiAoYkNoYXJCQm94KQorICAgIGJDaGFyQkJveCA9IHBGb250LT5HZXRCQm94KCZiYm94KTsKKworICBmbG9hdCBmTGVmdCA9IHN0ZDo6bWF4KDAuMGYsIGJib3gubGVmdCAqIGZTY2FsZSk7CisgIGZsb2F0IGZIZWlnaHQgPSBmYWJzKGJib3guaGVpZ2h0ICogZlNjYWxlKTsKKyAgYm9vbCBiUlRMUGllY2UgPSAhIShwVHh0UnVuLT5kd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfT2RkQmlkaUxldmVsKTsKKyAgYm9vbCBiU2luZ2xlTGluZSA9ICEhKHBUeHRSdW4tPmR3U3R5bGVzICYgRlhfTEFZT1VUU1RZTEVfU2luZ2xlTGluZSk7CisgIGJvb2wgYkNvbWJUZXh0ID0gISEocFR4dFJ1bi0+ZHdTdHlsZXMgJiBGWF9MQVlPVVRTVFlMRV9Db21iVGV4dCk7CisgIHdjaGFyX3Qgd2NoOworICBpbnQzMl90IGlDaGFyU2l6ZTsKKyAgZmxvYXQgZkNoYXJTaXplOworICBmbG9hdCBmU3RhcnQgPSBiUlRMUGllY2UgPyByZWN0LnJpZ2h0KCkgOiByZWN0LmxlZnQ7CisKKyAgc3RkOjp2ZWN0b3I8Q0ZYX1JlY3RGPiBydEFycmF5KGlMZW5ndGgpOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGVuZ3RoOyBpKyspIHsKKyAgICBpZiAocEVuZ2luZSkgeworICAgICAgd2NoID0gcEVuZ2luZS0+R2V0Q2hhcihpKTsKKyAgICAgIGlDaGFyU2l6ZSA9IHBFbmdpbmUtPkdldFdpZHRoT2ZDaGFyKGkpOworICAgIH0gZWxzZSB7CisgICAgICB3Y2ggPSAqcFN0cisrOworICAgICAgaUNoYXJTaXplID0gKnBXaWR0aHMrKzsKKyAgICB9CisgICAgZkNoYXJTaXplID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGlDaGFyU2l6ZSkgLyAyMDAwMC4wZjsKKyAgICBib29sIGJSZXQgPSAoIWJTaW5nbGVMaW5lICYmIElzQ3RybENvZGUod2NoKSk7CisgICAgaWYgKCEod2NoID09IEwnXHYnIHx8IHdjaCA9PSBMJ1xmJyB8fCB3Y2ggPT0gMHgyMDI4IHx8IHdjaCA9PSAweDIwMjkgfHwKKyAgICAgICAgICB3Y2ggPT0gTCdcbicpKSB7CisgICAgICBiUmV0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChiUmV0KSB7CisgICAgICBpQ2hhclNpemUgPSBpRm9udFNpemUgKiA1MDA7CisgICAgICBmQ2hhclNpemUgPSBmRm9udFNpemUgLyAyLjBmOworICAgIH0KKyAgICByZWN0LmxlZnQgPSBmU3RhcnQ7CisgICAgaWYgKGJSVExQaWVjZSkgeworICAgICAgcmVjdC5sZWZ0IC09IGZDaGFyU2l6ZTsKKyAgICAgIGZTdGFydCAtPSBmQ2hhclNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgIGZTdGFydCArPSBmQ2hhclNpemU7CisgICAgfQorICAgIHJlY3Qud2lkdGggPSBmQ2hhclNpemU7CisKKyAgICBpZiAoYkNoYXJCQm94ICYmICFiUmV0KSB7CisgICAgICBpbnQzMl90IGlDaGFyV2lkdGggPSAxMDAwOworICAgICAgcEZvbnQtPkdldENoYXJXaWR0aCh3Y2gsIGlDaGFyV2lkdGgpOworICAgICAgZmxvYXQgZlJUTGVmdCA9IDAsIGZDaGFyV2lkdGggPSAwOworICAgICAgaWYgKGlDaGFyV2lkdGggPiAwKSB7CisgICAgICAgIGZDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogZlNjYWxlOworICAgICAgICBmUlRMZWZ0ID0gZkxlZnQ7CisgICAgICAgIGlmIChiQ29tYlRleHQpCisgICAgICAgICAgZlJUTGVmdCA9IChyZWN0LndpZHRoIC0gZkNoYXJXaWR0aCkgLyAyLjBmOworICAgICAgfQorICAgICAgQ0ZYX1JlY3RGIHJ0QkJveEY7CisgICAgICBydEJCb3hGLmxlZnQgPSByZWN0LmxlZnQgKyBmUlRMZWZ0OworICAgICAgcnRCQm94Ri50b3AgPSByZWN0LnRvcCArIChyZWN0LmhlaWdodCAtIGZIZWlnaHQpIC8gMi4wZjsKKyAgICAgIHJ0QkJveEYud2lkdGggPSBmQ2hhcldpZHRoOworICAgICAgcnRCQm94Ri5oZWlnaHQgPSBmSGVpZ2h0OworICAgICAgcnRCQm94Ri50b3AgPSBzdGQ6Om1heChydEJCb3hGLnRvcCwgMC4wZik7CisgICAgICBydEFycmF5W2ldID0gcnRCQm94RjsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBydEFycmF5W2ldID0gcmVjdDsKKyAgfQorICByZXR1cm4gcnRBcnJheTsKK30KKworRlhfVFhUUlVOOjpGWF9UWFRSVU4oKQorICAgIDogcEVkdEVuZ2luZShudWxscHRyKSwKKyAgICAgIHBJZGVudGl0eShudWxscHRyKSwKKyAgICAgIHBXaWR0aHMobnVsbHB0ciksCisgICAgICBpTGVuZ3RoKDApLAorICAgICAgcEZvbnQobnVsbHB0ciksCisgICAgICBmRm9udFNpemUoMTIpLAorICAgICAgZHdTdHlsZXMoMCksCisgICAgICBpSG9yaXpvbnRhbFNjYWxlKDEwMCksCisgICAgICBpVmVydGljYWxTY2FsZSgxMDApLAorICAgICAgZHdDaGFyU3R5bGVzKDApLAorICAgICAgcFJlY3QobnVsbHB0ciksCisgICAgICBiU2tpcFNwYWNlKHRydWUpIHt9CisKK0ZYX1RYVFJVTjo6fkZYX1RYVFJVTigpIHt9CisKK0ZYX1RYVFJVTjo6RlhfVFhUUlVOKGNvbnN0IEZYX1RYVFJVTiYgb3RoZXIpID0gZGVmYXVsdDsKZGlmZiAtLWdpdCBhL3hmYS9mZ2FzL2xheW91dC9jZnhfdHh0YnJlYWsuaCBiL3hmYS9mZ2FzL2xheW91dC9jZnhfdHh0YnJlYWsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmY4ZGEwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2ZnYXMvbGF5b3V0L2NmeF90eHRicmVhay5oCkBAIC0wLDAgKzEsOTggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRkdBU19MQVlPVVRfQ0ZYX1RYVEJSRUFLX0hfCisjZGVmaW5lIFhGQV9GR0FTX0xBWU9VVF9DRlhfVFhUQlJFQUtfSF8KKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9jaGFyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisjaW5jbHVkZSAieGZhL2ZnYXMvbGF5b3V0L2NmeF9icmVhay5oIgorCitjbGFzcyBDRkRFX1RleHRFZGl0RW5naW5lOworY2xhc3MgQ0ZHQVNfR0VGb250Oworc3RydWN0IEZERV9URVhURURJVFBJRUNFOworCisjZGVmaW5lIEZYX1RYVENIQVJTVFlMRV9BcmFiaWNTaGFkZGEgMHgwMDIwCisjZGVmaW5lIEZYX1RYVENIQVJTVFlMRV9PZGRCaWRpTGV2ZWwgMHgwMDQwCisKK2VudW0gQ0ZYX1R4dExpbmVBbGlnbm1lbnQgeworICBDRlhfVHh0TGluZUFsaWdubWVudF9MZWZ0ID0gMCwKKyAgQ0ZYX1R4dExpbmVBbGlnbm1lbnRfQ2VudGVyID0gMSA8PCAwLAorICBDRlhfVHh0TGluZUFsaWdubWVudF9SaWdodCA9IDEgPDwgMSwKKyAgQ0ZYX1R4dExpbmVBbGlnbm1lbnRfSnVzdGlmaWVkID0gMSA8PCAyCit9OworCitpbmxpbmUgYm9vbCBDRlhfQnJlYWtUeXBlTm9uZU9yUGllY2UoQ0ZYX0JyZWFrVHlwZSB0eXBlKSB7CisgIHJldHVybiB0eXBlID09IENGWF9CcmVha1R5cGU6Ok5vbmUgfHwgdHlwZSA9PSBDRlhfQnJlYWtUeXBlOjpQaWVjZTsKK30KKworc3RydWN0IEZYX1RYVFJVTiB7CisgIEZYX1RYVFJVTigpOworICBGWF9UWFRSVU4oY29uc3QgRlhfVFhUUlVOJiBvdGhlcik7CisgIH5GWF9UWFRSVU4oKTsKKworICBDRkRFX1RleHRFZGl0RW5naW5lKiBwRWR0RW5naW5lOworICBjb25zdCBGREVfVEVYVEVESVRQSUVDRSogcElkZW50aXR5OworICBXaWRlU3RyaW5nIHdzU3RyOworICBpbnQzMl90KiBwV2lkdGhzOworICBpbnQzMl90IGlMZW5ndGg7CisgIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+IHBGb250OworICBmbG9hdCBmRm9udFNpemU7CisgIHVpbnQzMl90IGR3U3R5bGVzOworICBpbnQzMl90IGlIb3Jpem9udGFsU2NhbGU7CisgIGludDMyX3QgaVZlcnRpY2FsU2NhbGU7CisgIHVpbnQzMl90IGR3Q2hhclN0eWxlczsKKyAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdDsKKyAgYm9vbCBiU2tpcFNwYWNlOworfTsKKworY2xhc3MgQ0ZYX1R4dEJyZWFrIDogcHVibGljIENGWF9CcmVhayB7CisgcHVibGljOgorICBDRlhfVHh0QnJlYWsoKTsKKyAgfkNGWF9UeHRCcmVhaygpIG92ZXJyaWRlOworCisgIHZvaWQgU2V0TGluZVdpZHRoKGZsb2F0IGZMaW5lV2lkdGgpOworICB2b2lkIFNldEFsaWdubWVudChpbnQzMl90IGlBbGlnbm1lbnQpOworICB2b2lkIFNldENvbWJXaWR0aChmbG9hdCBmQ29tYldpZHRoKTsKKyAgQ0ZYX0JyZWFrVHlwZSBFbmRCcmVhayhDRlhfQnJlYWtUeXBlIGR3U3RhdHVzKTsKKworICBpbnQzMl90IEdldERpc3BsYXlQb3MoY29uc3QgRlhfVFhUUlVOKiBwVHh0UnVuLAorICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zKSBjb25zdDsKKyAgc3RkOjp2ZWN0b3I8Q0ZYX1JlY3RGPiBHZXRDaGFyUmVjdHMoY29uc3QgRlhfVFhUUlVOKiBwVHh0UnVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJDaGFyQkJveCA9IGZhbHNlKSBjb25zdDsKKyAgQ0ZYX0JyZWFrVHlwZSBBcHBlbmRDaGFyKHdjaGFyX3Qgd2NoKTsKKworIHByaXZhdGU6CisgIHZvaWQgQXBwZW5kQ2hhcl9Db21iaW5hdGlvbihDRlhfQ2hhciogcEN1ckNoYXIpOworICB2b2lkIEFwcGVuZENoYXJfVGFiKENGWF9DaGFyKiBwQ3VyQ2hhcik7CisgIENGWF9CcmVha1R5cGUgQXBwZW5kQ2hhcl9Db250cm9sKENGWF9DaGFyKiBwQ3VyQ2hhcik7CisgIENGWF9CcmVha1R5cGUgQXBwZW5kQ2hhcl9BcmFiaWMoQ0ZYX0NoYXIqIHBDdXJDaGFyKTsKKyAgQ0ZYX0JyZWFrVHlwZSBBcHBlbmRDaGFyX090aGVycyhDRlhfQ2hhciogcEN1ckNoYXIpOworCisgIHZvaWQgUmVzZXRDb250ZXh0Q2hhclN0eWxlcygpOworICBib29sIEVuZEJyZWFrX1NwbGl0TGluZShDRlhfQnJlYWtMaW5lKiBwTmV4dExpbmUsIGJvb2wgYkFsbENoYXJzKTsKKyAgdm9pZCBFbmRCcmVha19CaWRpTGluZShzdGQ6OmRlcXVlPEZYX1RQTz4qIHRwb3MsIENGWF9CcmVha1R5cGUgZHdTdGF0dXMpOworICB2b2lkIEVuZEJyZWFrX0FsaWdubWVudChjb25zdCBzdGQ6OmRlcXVlPEZYX1RQTz4mIHRwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFsbENoYXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnJlYWtUeXBlIGR3U3RhdHVzKTsKKyAgaW50MzJfdCBHZXRCcmVha1BvcyhzdGQ6OnZlY3RvcjxDRlhfQ2hhcj4mIGNhLAorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlFbmRQb3MsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWxsQ2hhcnMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJPbmx5QnJrID0gZmFsc2UpOworICB2b2lkIFNwbGl0VGV4dExpbmUoQ0ZYX0JyZWFrTGluZSogcEN1ckxpbmUsCisgICAgICAgICAgICAgICAgICAgICBDRlhfQnJlYWtMaW5lKiBwTmV4dExpbmUsCisgICAgICAgICAgICAgICAgICAgICBib29sIGJBbGxDaGFycyA9IGZhbHNlKTsKKworICBpbnQzMl90IG1faUFsaWdubWVudDsKKyAgaW50MzJfdCBtX2lDb21iV2lkdGg7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GR0FTX0xBWU9VVF9DRlhfVFhUQlJFQUtfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZ2FzL2xheW91dC9mZ2FzX2xpbmVicmVhay5jcHAgYi94ZmEvZmdhcy9sYXlvdXQvZmdhc19saW5lYnJlYWsuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTllM2JlLi4wMDAwMDAwCi0tLSBhL3hmYS9mZ2FzL2xheW91dC9mZ2FzX2xpbmVicmVhay5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2ZnYXMvbGF5b3V0L2ZnYXNfbGluZWJyZWFrLmgiCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3VjZC5oIgotCi1jb25zdCBGWF9MSU5FQlJFQUtUWVBFIGdzX0ZYX0xpbmVCcmVha19QYWlyVGFibGVbNjRdWzMyXSA9IHsKLSAgICB7RlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKLSAgICAgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKLSAgICAgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJDUCwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKLSAgICAgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCi0gICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAotICAgIHtGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAotICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAotICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAotICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKLSAgICB7RlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKLSAgICAgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwKLSAgICAgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwKLSAgICAgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAotICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAotICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLAotICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAotICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKLSAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAotICAgIHtGWF9MQklCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAotICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLAotICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAotICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKLSAgICB7RlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi0gICAge0ZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCi0gICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAotICAgIHtGWF9MQklCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAotICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAotICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAotICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKLSAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAotICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAotICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLAotICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAotICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKLSAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi0gICAge0ZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCi0gICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCi0gICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCi0gICAgIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAotICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAotICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLAotICAgICBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAotICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKLSAgICB7RlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAotICAgIHtGWF9MQklCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAotICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAotICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAotICAgICBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKLSAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKLSAgICAgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCi0gICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCi0gICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAotICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAotICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAotICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAotICAgICBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKLSAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKLSAgICAgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCi0gICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCi0gICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAotICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAotICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAotICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAotICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKLSAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCi0gICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAotICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAotICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAotICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAotICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKLSAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCi0gICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAotICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLAotICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQklCLCBGWF9MQklCLAotICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAotICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKLSAgICB7RlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJQQiwgRlhfTEJQQiwgRlhfTEJQQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJJQiwgRlhfTEJJQiwgRlhfTEJJQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJQQiwgRlhfTEJDQiwgRlhfTEJQQiwgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJEQiwKLSAgICAgRlhfTEJEQiwgRlhfTEJEQiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCi0gICAgIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsIEZYX0xCSUIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAotICAgIHtGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQlBCLAotICAgICBGWF9MQkRCLCBGWF9MQklCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQlBCLCBGWF9MQklCLAotICAgICBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQlBCLCBGWF9MQkNCLCBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQkRCLCBGWF9MQkRCLAotICAgICBGWF9MQlBCLCBGWF9MQkRCLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKLSAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi0gICAge0ZYX0xCREIsIEZYX0xCUEIsIEZYX0xCSUIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCUEIsIEZYX0xCUEIsIEZYX0xCUEIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCSUIsIEZYX0xCSUIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCUEIsIEZYX0xCQ0IsIEZYX0xCUEIsIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCREIsCi0gICAgIEZYX0xCREIsIEZYX0xCREIsIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAotICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKLSAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi0gICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAotICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKLSAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi0gICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAotICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKLSAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi0gICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAotICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKLSAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi0gICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAotICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKLSAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi0gICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAotICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKLSAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi0gICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAotICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKLSAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi0gICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAotICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKLSAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi0gICAge0ZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sCi0gICAgIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU4sIEZYX0xCVU59LAotICAgIHtGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLAotICAgICBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOLCBGWF9MQlVOfSwKLSAgICB7RlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwKLSAgICAgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTiwgRlhfTEJVTn0sCi19OwpkaWZmIC0tZ2l0IGEveGZhL2ZnYXMvbGF5b3V0L2ZnYXNfbGluZWJyZWFrLmggYi94ZmEvZmdhcy9sYXlvdXQvZmdhc19saW5lYnJlYWsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkzMzNkZi4uMDAwMDAwMAotLS0gYS94ZmEvZmdhcy9sYXlvdXQvZmdhc19saW5lYnJlYWsuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRkdBU19MQVlPVVRfRkdBU19MSU5FQlJFQUtfSF8KLSNkZWZpbmUgWEZBX0ZHQVNfTEFZT1VUX0ZHQVNfTElORUJSRUFLX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2NydC9mZ2FzX3V0aWxzLmgiCi0KLWVudW0gRlhfTElORUJSRUFLVFlQRSA6IHVpbnQ4X3QgewotICBGWF9MQlRfVU5LTk9XTiA9IDB4MDAsCi0gIEZYX0xCVF9ESVJFQ1RfQlJLID0gMHgxQSwKLSAgRlhfTEJUX0lORElSRUNUX0JSSyA9IDB4MkIsCi0gIEZYX0xCVF9DT01fSU5ESVJFQ1RfQlJLID0gMHgzQywKLSAgRlhfTEJUX0NPTV9QUk9ISUJJVEVEX0JSSyA9IDB4NEQsCi0gIEZYX0xCVF9QUk9ISUJJVEVEX0JSSyA9IDB4NUUsCi0gIEZYX0xCVF9IQU5HVUxfU1BBQ0VfQlJLID0gMHg2RiwKLX07Ci0KLSNkZWZpbmUgRlhfTEJVTiBGWF9MQlRfVU5LTk9XTgotI2RlZmluZSBGWF9MQkRCIEZYX0xCVF9ESVJFQ1RfQlJLCi0jZGVmaW5lIEZYX0xCSUIgRlhfTEJUX0lORElSRUNUX0JSSwotI2RlZmluZSBGWF9MQkNCIEZYX0xCVF9DT01fSU5ESVJFQ1RfQlJLCi0jZGVmaW5lIEZYX0xCQ1AgRlhfTEJUX0NPTV9QUk9ISUJJVEVEX0JSSwotI2RlZmluZSBGWF9MQlBCIEZYX0xCVF9QUk9ISUJJVEVEX0JSSwotI2RlZmluZSBGWF9MQkhTIEZYX0xCVF9IQU5HVUxfU1BBQ0VfQlJLCi0KLWV4dGVybiBjb25zdCBGWF9MSU5FQlJFQUtUWVBFIGdzX0ZYX0xpbmVCcmVha19QYWlyVGFibGVbNjRdWzMyXTsKLQotI2VuZGlmICAvLyBYRkFfRkdBU19MQVlPVVRfRkdBU19MSU5FQlJFQUtfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZ2FzL2xheW91dC9mZ2FzX3J0ZmJyZWFrLmNwcCBiL3hmYS9mZ2FzL2xheW91dC9mZ2FzX3J0ZmJyZWFrLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE4M2JlNi4uMDAwMDAwMAotLS0gYS94ZmEvZmdhcy9sYXlvdXQvZmdhc19ydGZicmVhay5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9mZ2FzL2xheW91dC9mZ2FzX3J0ZmJyZWFrLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2FyYWJpYy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYXJiLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2ZvbnQvY2ZnYXNfZ2Vmb250LmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvbGF5b3V0L2ZnYXNfbGluZWJyZWFrLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLXR5cGVkZWYgQ0ZYX1JURkJyZWFrVHlwZSAoQ0ZYX1JURkJyZWFrOjoqRlhfUlRGQnJlYWtfTFBGQXBwZW5kQ2hhcikoCi0gICAgQ0ZYX1JURkNoYXIqIHBDdXJDaGFyKTsKLWNvbnN0IEZYX1JURkJyZWFrX0xQRkFwcGVuZENoYXIgZ19GWF9SVEZCcmVha19scGZBcHBlbmRDaGFyWzE2XSA9IHsKLSAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX090aGVycywgICAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX1RhYiwKLSAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX090aGVycywgICAgICAmQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX0NvbnRyb2wsCi0gICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9Db21iaW5hdGlvbiwgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsCi0gICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsICAgICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsCi0gICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsICAgICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsCi0gICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsICAgICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsCi0gICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9BcmFiaWMsICAgICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsCi0gICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsICAgICAgJkNGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9PdGhlcnMsCi19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotQ0ZYX1JURkJyZWFrOjpDRlhfUlRGQnJlYWsodWludDMyX3QgZHdMYXlvdXRTdHlsZXMpCi0gICAgOiBtX2lCb3VuZGFyeVN0YXJ0KDApLAotICAgICAgbV9pQm91bmRhcnlFbmQoMjAwMDAwMCksCi0gICAgICBtX2R3TGF5b3V0U3R5bGVzKGR3TGF5b3V0U3R5bGVzKSwKLSAgICAgIG1fYlBhZ2luYXRpb24oZmFsc2UpLAotICAgICAgbV9wRm9udChudWxscHRyKSwKLSAgICAgIG1faUZvbnRIZWlnaHQoMjQwKSwKLSAgICAgIG1faUZvbnRTaXplKDI0MCksCi0gICAgICBtX2lUYWJXaWR0aCg3MjAwMDApLAotICAgICAgbV93RGVmQ2hhcigweEZFRkYpLAotICAgICAgbV9pRGVmQ2hhcigwKSwKLSAgICAgIG1fd0xpbmVCcmVha0NoYXIoTCdcbicpLAotICAgICAgbV9pSG9yaXpvbnRhbFNjYWxlKDEwMCksCi0gICAgICBtX2lWZXJ0aWNhbFNjYWxlKDEwMCksCi0gICAgICBtX2lDaGFyU3BhY2UoMCksCi0gICAgICBtX2lBbGlnbm1lbnQoQ0ZYX1JURkxpbmVBbGlnbm1lbnQ6OkxlZnQpLAotICAgICAgbV9wVXNlckRhdGEobnVsbHB0ciksCi0gICAgICBtX2VDaGFyVHlwZShGWF9DSEFSVFlQRV9Vbmtub3duKSwKLSAgICAgIG1fZHdJZGVudGl0eSgwKSwKLSAgICAgIG1fUlRGTGluZTEoKSwKLSAgICAgIG1fUlRGTGluZTIoKSwKLSAgICAgIG1fcEN1ckxpbmUobnVsbHB0ciksCi0gICAgICBtX2lSZWFkeSgwKSwKLSAgICAgIG1faVRvbGVyYW5jZSgwKSB7Ci0gIG1fcEN1ckxpbmUgPSAmbV9SVEZMaW5lMTsKLQotICBTZXRCcmVha1N0YXR1cygpOwotICBtX2JQYWdpbmF0aW9uID0gKG1fZHdMYXlvdXRTdHlsZXMgJiBGWF9SVEZMQVlPVVRTVFlMRV9QYWdpbmF0aW9uKSAhPSAwOwotfQotCi1DRlhfUlRGQnJlYWs6On5DRlhfUlRGQnJlYWsoKSB7Ci0gIFJlc2V0KCk7Ci19Ci0KLXZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRMaW5lQm91bmRhcnkoRlhfRkxPQVQgZkxpbmVTdGFydCwgRlhfRkxPQVQgZkxpbmVFbmQpIHsKLSAgaWYgKGZMaW5lU3RhcnQgPiBmTGluZUVuZCkKLSAgICByZXR1cm47Ci0KLSAgbV9pQm91bmRhcnlTdGFydCA9IEZYU1lTX3JvdW5kKGZMaW5lU3RhcnQgKiAyMDAwMC4wZik7Ci0gIG1faUJvdW5kYXJ5RW5kID0gRlhTWVNfcm91bmQoZkxpbmVFbmQgKiAyMDAwMC4wZik7Ci0gIG1fcEN1ckxpbmUtPm1faVN0YXJ0ID0gc3RkOjptaW4obV9wQ3VyTGluZS0+bV9pU3RhcnQsIG1faUJvdW5kYXJ5RW5kKTsKLSAgbV9wQ3VyTGluZS0+bV9pU3RhcnQgPSBzdGQ6Om1heChtX3BDdXJMaW5lLT5tX2lTdGFydCwgbV9pQm91bmRhcnlTdGFydCk7Ci19Ci0KLXZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRMaW5lU3RhcnRQb3MoRlhfRkxPQVQgZkxpbmVQb3MpIHsKLSAgaW50MzJfdCBpTGluZVBvcyA9IEZYU1lTX3JvdW5kKGZMaW5lUG9zICogMjAwMDAuMGYpOwotICBpTGluZVBvcyA9IHN0ZDo6bWluKGlMaW5lUG9zLCBtX2lCb3VuZGFyeUVuZCk7Ci0gIGlMaW5lUG9zID0gc3RkOjptYXgoaUxpbmVQb3MsIG1faUJvdW5kYXJ5U3RhcnQpOwotICBtX3BDdXJMaW5lLT5tX2lTdGFydCA9IGlMaW5lUG9zOwotfQotCi12b2lkIENGWF9SVEZCcmVhazo6U2V0Rm9udChjb25zdCBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4mIHBGb250KSB7Ci0gIGlmICghcEZvbnQgfHwgcEZvbnQgPT0gbV9wRm9udCkKLSAgICByZXR1cm47Ci0KLSAgU2V0QnJlYWtTdGF0dXMoKTsKLSAgbV9wRm9udCA9IHBGb250OwotICBGb250Q2hhbmdlZCgpOwotfQotCi12b2lkIENGWF9SVEZCcmVhazo6U2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKSB7Ci0gIGludDMyX3QgaUZvbnRTaXplID0gRlhTWVNfcm91bmQoZkZvbnRTaXplICogMjAuMGYpOwotICBpZiAobV9pRm9udFNpemUgPT0gaUZvbnRTaXplKQotICAgIHJldHVybjsKLQotICBTZXRCcmVha1N0YXR1cygpOwotICBtX2lGb250U2l6ZSA9IGlGb250U2l6ZTsKLSAgRm9udENoYW5nZWQoKTsKLX0KLQotdm9pZCBDRlhfUlRGQnJlYWs6OkZvbnRDaGFuZ2VkKCkgewotICBtX2lEZWZDaGFyID0gMDsKLSAgaWYgKCFtX3BGb250KQotICAgIHJldHVybjsKLQotICBtX2lGb250SGVpZ2h0ID0gbV9pRm9udFNpemU7Ci0gIGlmIChtX3dEZWZDaGFyID09IDB4RkVGRikKLSAgICByZXR1cm47Ci0KLSAgbV9wRm9udC0+R2V0Q2hhcldpZHRoKG1fd0RlZkNoYXIsIG1faURlZkNoYXIsIGZhbHNlKTsKLSAgbV9pRGVmQ2hhciAqPSBtX2lGb250U2l6ZTsKLX0KLQotdm9pZCBDRlhfUlRGQnJlYWs6OlNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCkgewotICBtX2lUYWJXaWR0aCA9IEZYU1lTX3JvdW5kKGZUYWJXaWR0aCAqIDIwMDAwLjBmKTsKLX0KLQotdm9pZCBDRlhfUlRGQnJlYWs6OkFkZFBvc2l0aW9uZWRUYWIoRlhfRkxPQVQgZlRhYlBvcykgewotICBpbnQzMl90IGlUYWJQb3MgPSBzdGQ6Om1pbihGWFNZU19yb3VuZChmVGFiUG9zICogMjAwMDAuMGYpICsgbV9pQm91bmRhcnlTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pQm91bmRhcnlFbmQpOwotICBhdXRvIGl0ID0gc3RkOjpsb3dlcl9ib3VuZChtX1Bvc2l0aW9uZWRUYWJzLmJlZ2luKCksIG1fUG9zaXRpb25lZFRhYnMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlUYWJQb3MpOwotICBpZiAoaXQgIT0gbV9Qb3NpdGlvbmVkVGFicy5lbmQoKSAmJiAqaXQgPT0gaVRhYlBvcykKLSAgICByZXR1cm47Ci0gIG1fUG9zaXRpb25lZFRhYnMuaW5zZXJ0KGl0LCBpVGFiUG9zKTsKLX0KLQotdm9pZCBDRlhfUlRGQnJlYWs6OlNldExpbmVCcmVha1RvbGVyYW5jZShGWF9GTE9BVCBmVG9sZXJhbmNlKSB7Ci0gIG1faVRvbGVyYW5jZSA9IEZYU1lTX3JvdW5kKGZUb2xlcmFuY2UgKiAyMDAwMC4wZik7Ci19Ci0KLXZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRIb3Jpem9udGFsU2NhbGUoaW50MzJfdCBpU2NhbGUpIHsKLSAgaWYgKGlTY2FsZSA8IDApCi0gICAgaVNjYWxlID0gMDsKLSAgaWYgKG1faUhvcml6b250YWxTY2FsZSA9PSBpU2NhbGUpCi0gICAgcmV0dXJuOwotCi0gIFNldEJyZWFrU3RhdHVzKCk7Ci0gIG1faUhvcml6b250YWxTY2FsZSA9IGlTY2FsZTsKLX0KLQotdm9pZCBDRlhfUlRGQnJlYWs6OlNldFZlcnRpY2FsU2NhbGUoaW50MzJfdCBpU2NhbGUpIHsKLSAgaWYgKGlTY2FsZSA8IDApCi0gICAgaVNjYWxlID0gMDsKLSAgaWYgKG1faVZlcnRpY2FsU2NhbGUgPT0gaVNjYWxlKQotICAgIHJldHVybjsKLQotICBTZXRCcmVha1N0YXR1cygpOwotICBtX2lWZXJ0aWNhbFNjYWxlID0gaVNjYWxlOwotfQotCi12b2lkIENGWF9SVEZCcmVhazo6U2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpIHsKLSAgbV9pQ2hhclNwYWNlID0gRlhTWVNfcm91bmQoZkNoYXJTcGFjZSAqIDIwMDAwLjBmKTsKLX0KLQotdm9pZCBDRlhfUlRGQnJlYWs6OlNldFVzZXJEYXRhKGNvbnN0IENGWF9SZXRhaW5QdHI8Q0ZYX1JldGFpbmFibGU+JiBwVXNlckRhdGEpIHsKLSAgaWYgKG1fcFVzZXJEYXRhID09IHBVc2VyRGF0YSkKLSAgICByZXR1cm47Ci0KLSAgU2V0QnJlYWtTdGF0dXMoKTsKLSAgbV9wVXNlckRhdGEgPSBwVXNlckRhdGE7Ci19Ci0KLXZvaWQgQ0ZYX1JURkJyZWFrOjpTZXRCcmVha1N0YXR1cygpIHsKLSAgbV9kd0lkZW50aXR5Kys7Ci0gIGludDMyX3QgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOwotICBpZiAoaUNvdW50IDwgMSkKLSAgICByZXR1cm47Ci0KLSAgQ0ZYX1JURkNoYXImIHRjID0gbV9wQ3VyTGluZS0+R2V0Q2hhcihpQ291bnQgLSAxKTsKLSAgaWYgKHRjLm1fZHdTdGF0dXMgPT0gQ0ZYX1JURkJyZWFrVHlwZTo6Tm9uZSkKLSAgICB0Yy5tX2R3U3RhdHVzID0gQ0ZYX1JURkJyZWFrVHlwZTo6UGllY2U7Ci19Ci0KLUNGWF9SVEZDaGFyKiBDRlhfUlRGQnJlYWs6OkdldExhc3RDaGFyKGludDMyX3QgaW5kZXgpIGNvbnN0IHsKLSAgc3RkOjp2ZWN0b3I8Q0ZYX1JURkNoYXI+JiB0Y2EgPSBtX3BDdXJMaW5lLT5tX0xpbmVDaGFyczsKLSAgaW50MzJfdCBpQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHRjYSk7Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gaUNvdW50KQotICAgIHJldHVybiBudWxscHRyOwotCi0gIGludDMyX3QgaVN0YXJ0ID0gaUNvdW50IC0gMTsKLSAgd2hpbGUgKGlTdGFydCA+IC0xKSB7Ci0gICAgQ0ZYX1JURkNoYXIqIHBUQyA9ICZ0Y2FbaVN0YXJ0LS1dOwotICAgIGlmIChwVEMtPm1faUNoYXJXaWR0aCA+PSAwIHx8Ci0gICAgICAgIHBUQy0+R2V0Q2hhclR5cGUoKSAhPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikgewotICAgICAgaWYgKC0taW5kZXggPCAwKQotICAgICAgICByZXR1cm4gcFRDOwotICAgIH0KLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotY29uc3QgQ0ZYX1JURkxpbmUqIENGWF9SVEZCcmVhazo6R2V0UlRGTGluZSgpIGNvbnN0IHsKLSAgaWYgKG1faVJlYWR5ID09IDEpCi0gICAgcmV0dXJuICZtX1JURkxpbmUxOwotICBpZiAobV9pUmVhZHkgPT0gMikKLSAgICByZXR1cm4gJm1fUlRGTGluZTI7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1jb25zdCBDRlhfUlRGUGllY2VBcnJheSogQ0ZYX1JURkJyZWFrOjpHZXRSVEZQaWVjZXMoKSBjb25zdCB7Ci0gIGNvbnN0IENGWF9SVEZMaW5lKiBwUlRGTGluZSA9IEdldFJURkxpbmUoKTsKLSAgcmV0dXJuIHBSVEZMaW5lID8gJnBSVEZMaW5lLT5tX0xpbmVQaWVjZXMgOiBudWxscHRyOwotfQotCi1pbmxpbmUgRlhfQ0hBUlRZUEUgQ0ZYX1JURkJyZWFrOjpHZXRVbmlmaWVkQ2hhclR5cGUoCi0gICAgRlhfQ0hBUlRZUEUgY2hhcnR5cGUpIGNvbnN0IHsKLSAgcmV0dXJuIGNoYXJ0eXBlID49IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYgPyBGWF9DSEFSVFlQRV9BcmFiaWMgOiBjaGFydHlwZTsKLX0KLQotaW50MzJfdCBDRlhfUlRGQnJlYWs6OkdldExhc3RQb3NpdGlvbmVkVGFiKCkgY29uc3QgewotICByZXR1cm4gbV9Qb3NpdGlvbmVkVGFicy5lbXB0eSgpID8gbV9pQm91bmRhcnlTdGFydCA6IG1fUG9zaXRpb25lZFRhYnMuYmFjaygpOwotfQotCi1ib29sIENGWF9SVEZCcmVhazo6R2V0UG9zaXRpb25lZFRhYihpbnQzMl90KiBpVGFiUG9zKSBjb25zdCB7Ci0gIGF1dG8gaXQgPSBzdGQ6OnVwcGVyX2JvdW5kKG1fUG9zaXRpb25lZFRhYnMuYmVnaW4oKSwgbV9Qb3NpdGlvbmVkVGFicy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmlUYWJQb3MpOwotICBpZiAoaXQgPT0gbV9Qb3NpdGlvbmVkVGFicy5lbmQoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgKmlUYWJQb3MgPSAqaXQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi1DRlhfUlRGQnJlYWtUeXBlIENGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpIHsKLSAgQVNTRVJUKG1fcEZvbnQgJiYgbV9wQ3VyTGluZSk7Ci0KLSAgdWludDMyX3QgZHdQcm9wcyA9IGtUZXh0TGF5b3V0Q29kZVByb3BlcnRpZXNbc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHdjaCldOwotICBGWF9DSEFSVFlQRSBjaGFydHlwZSA9IEdldENoYXJUeXBlRnJvbVByb3AoZHdQcm9wcyk7Ci0gIG1fcEN1ckxpbmUtPm1fTGluZUNoYXJzLmVtcGxhY2VfYmFjaygpOwotCi0gIENGWF9SVEZDaGFyKiBwQ3VyQ2hhciA9ICZtX3BDdXJMaW5lLT5tX0xpbmVDaGFycy5iYWNrKCk7Ci0gIHBDdXJDaGFyLT5tX2R3U3RhdHVzID0gQ0ZYX1JURkJyZWFrVHlwZTo6Tm9uZTsKLSAgcEN1ckNoYXItPm1fd0NoYXJDb2RlID0gd2NoOwotICBwQ3VyQ2hhci0+bV9kd0NoYXJQcm9wcyA9IGR3UHJvcHM7Ci0gIHBDdXJDaGFyLT5tX2lGb250U2l6ZSA9IG1faUZvbnRTaXplOwotICBwQ3VyQ2hhci0+bV9pRm9udEhlaWdodCA9IG1faUZvbnRIZWlnaHQ7Ci0gIHBDdXJDaGFyLT5tX2lIb3Jpem9udGFsU2NhbGUgPSBtX2lIb3Jpem9udGFsU2NhbGU7Ci0gIHBDdXJDaGFyLT5tX2lWZXJ0aWNhbFNjYWxlID0gbV9pVmVydGljYWxTY2FsZTsKLSAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IDA7Ci0gIHBDdXJDaGFyLT5tX2R3SWRlbnRpdHkgPSBtX2R3SWRlbnRpdHk7Ci0gIHBDdXJDaGFyLT5tX3BVc2VyRGF0YSA9IG1fcFVzZXJEYXRhOwotCi0gIENGWF9SVEZCcmVha1R5cGUgZHdSZXQxID0gQ0ZYX1JURkJyZWFrVHlwZTo6Tm9uZTsKLSAgaWYgKGNoYXJ0eXBlICE9IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uICYmCi0gICAgICBHZXRVbmlmaWVkQ2hhclR5cGUobV9lQ2hhclR5cGUpICE9IEdldFVuaWZpZWRDaGFyVHlwZShjaGFydHlwZSkgJiYKLSAgICAgIG1fZUNoYXJUeXBlICE9IEZYX0NIQVJUWVBFX1Vua25vd24gJiYKLSAgICAgIG1fcEN1ckxpbmUtPkdldExpbmVFbmQoKSA+IG1faUJvdW5kYXJ5RW5kICsgbV9pVG9sZXJhbmNlICYmCi0gICAgICAobV9lQ2hhclR5cGUgIT0gRlhfQ0hBUlRZUEVfU3BhY2UgfHwgY2hhcnR5cGUgIT0gRlhfQ0hBUlRZUEVfQ29udHJvbCkpIHsKLSAgICBkd1JldDEgPSBFbmRCcmVhayhDRlhfUlRGQnJlYWtUeXBlOjpMaW5lKTsKLSAgICBpbnQzMl90IGlDb3VudCA9IG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsKLSAgICBpZiAoaUNvdW50ID4gMCkKLSAgICAgIHBDdXJDaGFyID0gJm1fcEN1ckxpbmUtPm1fTGluZUNoYXJzW2lDb3VudCAtIDFdOwotICB9Ci0KLSAgQ0ZYX1JURkJyZWFrVHlwZSBkd1JldDIgPQotICAgICAgKHRoaXMtPipnX0ZYX1JURkJyZWFrX2xwZkFwcGVuZENoYXJbY2hhcnR5cGUgPj4gRlhfQ0hBUlRZUEVCSVRTXSkoCi0gICAgICAgICAgcEN1ckNoYXIpOwotICBtX2VDaGFyVHlwZSA9IGNoYXJ0eXBlOwotICByZXR1cm4gc3RkOjptYXgoZHdSZXQxLCBkd1JldDIpOwotfQotCi1DRlhfUlRGQnJlYWtUeXBlIENGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9Db21iaW5hdGlvbihDRlhfUlRGQ2hhciogcEN1ckNoYXIpIHsKLSAgaW50MzJfdCBpQ2hhcldpZHRoID0gMDsKLSAgaWYgKCFtX3BGb250LT5HZXRDaGFyV2lkdGgocEN1ckNoYXItPm1fd0NoYXJDb2RlLCBpQ2hhcldpZHRoLCBmYWxzZSkpCi0gICAgaUNoYXJXaWR0aCA9IDA7Ci0KLSAgaUNoYXJXaWR0aCAqPSBtX2lGb250U2l6ZTsKLSAgaUNoYXJXaWR0aCA9IGlDaGFyV2lkdGggKiBtX2lIb3Jpem9udGFsU2NhbGUgLyAxMDA7Ci0gIENGWF9SVEZDaGFyKiBwTGFzdENoYXIgPSBHZXRMYXN0Q2hhcigwKTsKLSAgaWYgKHBMYXN0Q2hhciAmJiBwTGFzdENoYXItPkdldENoYXJUeXBlKCkgPiBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikKLSAgICBpQ2hhcldpZHRoID0gLWlDaGFyV2lkdGg7Ci0gIGVsc2UKLSAgICBtX2VDaGFyVHlwZSA9IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uOwotCi0gIHBDdXJDaGFyLT5tX2lDaGFyV2lkdGggPSBpQ2hhcldpZHRoOwotICBpZiAoaUNoYXJXaWR0aCA+IDApCi0gICAgbV9wQ3VyTGluZS0+bV9pV2lkdGggKz0gaUNoYXJXaWR0aDsKLQotICByZXR1cm4gQ0ZYX1JURkJyZWFrVHlwZTo6Tm9uZTsKLX0KLQotQ0ZYX1JURkJyZWFrVHlwZSBDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfVGFiKENGWF9SVEZDaGFyKiBwQ3VyQ2hhcikgewotICBpZiAoIShtX2R3TGF5b3V0U3R5bGVzICYgRlhfUlRGTEFZT1VUU1RZTEVfRXhwYW5kVGFiKSkKLSAgICByZXR1cm4gQ0ZYX1JURkJyZWFrVHlwZTo6Tm9uZTsKLQotICBpbnQzMl90JiBpTGluZVdpZHRoID0gbV9wQ3VyTGluZS0+bV9pV2lkdGg7Ci0gIGludDMyX3QgaUNoYXJXaWR0aCA9IGlMaW5lV2lkdGg7Ci0gIGlmIChHZXRQb3NpdGlvbmVkVGFiKCZpQ2hhcldpZHRoKSkKLSAgICBpQ2hhcldpZHRoIC09IGlMaW5lV2lkdGg7Ci0gIGVsc2UKLSAgICBpQ2hhcldpZHRoID0gbV9pVGFiV2lkdGggKiAoaUxpbmVXaWR0aCAvIG1faVRhYldpZHRoICsgMSkgLSBpTGluZVdpZHRoOwotCi0gIHBDdXJDaGFyLT5tX2lDaGFyV2lkdGggPSBpQ2hhcldpZHRoOwotICBpTGluZVdpZHRoICs9IGlDaGFyV2lkdGg7Ci0gIHJldHVybiBDRlhfUlRGQnJlYWtUeXBlOjpOb25lOwotfQotCi1DRlhfUlRGQnJlYWtUeXBlIENGWF9SVEZCcmVhazo6QXBwZW5kQ2hhcl9Db250cm9sKENGWF9SVEZDaGFyKiBwQ3VyQ2hhcikgewotICBDRlhfUlRGQnJlYWtUeXBlIGR3UmV0MiA9IENGWF9SVEZCcmVha1R5cGU6Ok5vbmU7Ci0gIHN3aXRjaCAocEN1ckNoYXItPm1fd0NoYXJDb2RlKSB7Ci0gICAgY2FzZSBMJ1x2JzoKLSAgICBjYXNlIDB4MjAyODoKLSAgICAgIGR3UmV0MiA9IENGWF9SVEZCcmVha1R5cGU6OkxpbmU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEwnXGYnOgotICAgICAgZHdSZXQyID0gQ0ZYX1JURkJyZWFrVHlwZTo6UGFnZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMHgyMDI5OgotICAgICAgZHdSZXQyID0gQ0ZYX1JURkJyZWFrVHlwZTo6UGFyYWdyYXBoOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChwQ3VyQ2hhci0+bV93Q2hhckNvZGUgPT0gbV93TGluZUJyZWFrQ2hhcikKLSAgICAgICAgZHdSZXQyID0gQ0ZYX1JURkJyZWFrVHlwZTo6UGFyYWdyYXBoOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgaWYgKGR3UmV0MiAhPSBDRlhfUlRGQnJlYWtUeXBlOjpOb25lKQotICAgIGR3UmV0MiA9IEVuZEJyZWFrKGR3UmV0Mik7Ci0KLSAgcmV0dXJuIGR3UmV0MjsKLX0KLQotQ0ZYX1JURkJyZWFrVHlwZSBDRlhfUlRGQnJlYWs6OkFwcGVuZENoYXJfQXJhYmljKENGWF9SVEZDaGFyKiBwQ3VyQ2hhcikgewotICBDRlhfUlRGQ2hhciogcExhc3RDaGFyID0gbnVsbHB0cjsKLSAgaW50MzJfdCBpQ2hhcldpZHRoID0gMDsKLSAgRlhfV0NIQVIgd0Zvcm07Ci0gIGJvb2wgYkFsZWYgPSBmYWxzZTsKLSAgaWYgKG1fZUNoYXJUeXBlID49IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYgJiYKLSAgICAgIG1fZUNoYXJUeXBlIDw9IEZYX0NIQVJUWVBFX0FyYWJpY0Rpc3RvcnRpb24pIHsKLSAgICBwTGFzdENoYXIgPSBHZXRMYXN0Q2hhcigxKTsKLSAgICBpZiAocExhc3RDaGFyKSB7Ci0gICAgICBtX3BDdXJMaW5lLT5tX2lXaWR0aCAtPSBwTGFzdENoYXItPm1faUNoYXJXaWR0aDsKLSAgICAgIENGWF9SVEZDaGFyKiBwUHJldkNoYXIgPSBHZXRMYXN0Q2hhcigyKTsKLSAgICAgIHdGb3JtID0gcGRmaXVtOjphcmFiaWM6OkdldEZvcm1DaGFyKHBMYXN0Q2hhciwgcFByZXZDaGFyLCBwQ3VyQ2hhcik7Ci0gICAgICBiQWxlZiA9ICh3Rm9ybSA9PSAweEZFRkYgJiYKLSAgICAgICAgICAgICAgIHBMYXN0Q2hhci0+R2V0Q2hhclR5cGUoKSA9PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmKTsKLSAgICAgIGlmICghbV9wRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpQ2hhcldpZHRoLCBmYWxzZSkgJiYKLSAgICAgICAgICAhbV9wRm9udC0+R2V0Q2hhcldpZHRoKHBMYXN0Q2hhci0+bV93Q2hhckNvZGUsIGlDaGFyV2lkdGgsIGZhbHNlKSkgewotICAgICAgICBpQ2hhcldpZHRoID0gbV9pRGVmQ2hhcjsKLSAgICAgIH0KLQotICAgICAgaUNoYXJXaWR0aCAqPSBtX2lGb250U2l6ZTsKLSAgICAgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yaXpvbnRhbFNjYWxlIC8gMTAwOwotICAgICAgcExhc3RDaGFyLT5tX2lDaGFyV2lkdGggPSBpQ2hhcldpZHRoOwotICAgICAgbV9wQ3VyTGluZS0+bV9pV2lkdGggKz0gaUNoYXJXaWR0aDsKLSAgICAgIGlDaGFyV2lkdGggPSAwOwotICAgIH0KLSAgfQotCi0gIHdGb3JtID0gcGRmaXVtOjphcmFiaWM6OkdldEZvcm1DaGFyKHBDdXJDaGFyLCBiQWxlZiA/IG51bGxwdHIgOiBwTGFzdENoYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOwotICBpZiAoIW1fcEZvbnQtPkdldENoYXJXaWR0aCh3Rm9ybSwgaUNoYXJXaWR0aCwgZmFsc2UpICYmCi0gICAgICAhbV9wRm9udC0+R2V0Q2hhcldpZHRoKHBDdXJDaGFyLT5tX3dDaGFyQ29kZSwgaUNoYXJXaWR0aCwgZmFsc2UpKSB7Ci0gICAgaUNoYXJXaWR0aCA9IG1faURlZkNoYXI7Ci0gIH0KLQotICBpQ2hhcldpZHRoICo9IG1faUZvbnRTaXplOwotICBpQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIG1faUhvcml6b250YWxTY2FsZSAvIDEwMDsKLSAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IGlDaGFyV2lkdGg7Ci0gIG1fcEN1ckxpbmUtPm1faVdpZHRoICs9IGlDaGFyV2lkdGg7Ci0gIG1fcEN1ckxpbmUtPm1faUFyYWJpY0NoYXJzKys7Ci0KLSAgaWYgKG1fcEN1ckxpbmUtPkdldExpbmVFbmQoKSA+IG1faUJvdW5kYXJ5RW5kICsgbV9pVG9sZXJhbmNlKQotICAgIHJldHVybiBFbmRCcmVhayhDRlhfUlRGQnJlYWtUeXBlOjpMaW5lKTsKLSAgcmV0dXJuIENGWF9SVEZCcmVha1R5cGU6Ok5vbmU7Ci19Ci0KLUNGWF9SVEZCcmVha1R5cGUgQ0ZYX1JURkJyZWFrOjpBcHBlbmRDaGFyX090aGVycyhDRlhfUlRGQ2hhciogcEN1ckNoYXIpIHsKLSAgRlhfQ0hBUlRZUEUgY2hhcnR5cGUgPSBwQ3VyQ2hhci0+R2V0Q2hhclR5cGUoKTsKLSAgRlhfV0NIQVIgd0Zvcm0gPSBwQ3VyQ2hhci0+bV93Q2hhckNvZGU7Ci0gIGludDMyX3QgaUNoYXJXaWR0aCA9IDA7Ci0gIGlmICghbV9wRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpQ2hhcldpZHRoLCBmYWxzZSkpCi0gICAgaUNoYXJXaWR0aCA9IG1faURlZkNoYXI7Ci0KLSAgaUNoYXJXaWR0aCAqPSBtX2lGb250U2l6ZTsKLSAgaUNoYXJXaWR0aCAqPSBtX2lIb3Jpem9udGFsU2NhbGUgLyAxMDA7Ci0gIGlDaGFyV2lkdGggKz0gbV9pQ2hhclNwYWNlOwotCi0gIHBDdXJDaGFyLT5tX2lDaGFyV2lkdGggPSBpQ2hhcldpZHRoOwotICBtX3BDdXJMaW5lLT5tX2lXaWR0aCArPSBpQ2hhcldpZHRoOwotICBpZiAoY2hhcnR5cGUgIT0gRlhfQ0hBUlRZUEVfU3BhY2UgJiYKLSAgICAgIG1fcEN1ckxpbmUtPkdldExpbmVFbmQoKSA+IG1faUJvdW5kYXJ5RW5kICsgbV9pVG9sZXJhbmNlKSB7Ci0gICAgcmV0dXJuIEVuZEJyZWFrKENGWF9SVEZCcmVha1R5cGU6OkxpbmUpOwotICB9Ci0gIHJldHVybiBDRlhfUlRGQnJlYWtUeXBlOjpOb25lOwotfQotCi1DRlhfUlRGQnJlYWtUeXBlIENGWF9SVEZCcmVhazo6RW5kQnJlYWsoQ0ZYX1JURkJyZWFrVHlwZSBkd1N0YXR1cykgewotICBBU1NFUlQoZHdTdGF0dXMgIT0gQ0ZYX1JURkJyZWFrVHlwZTo6Tm9uZSk7Ci0KLSAgbV9kd0lkZW50aXR5Kys7Ci0gIGNvbnN0IENGWF9SVEZQaWVjZUFycmF5KiBwQ3VyUGllY2VzID0gJm1fcEN1ckxpbmUtPm1fTGluZVBpZWNlczsKLSAgaW50MzJfdCBpQ291bnQgPSBwQ3VyUGllY2VzLT5HZXRTaXplKCk7Ci0gIGlmIChpQ291bnQgPiAwKSB7Ci0gICAgQ0ZYX1JURlBpZWNlKiBwTGFzdFBpZWNlID0gcEN1clBpZWNlcy0+R2V0UHRyQXQoLS1pQ291bnQpOwotICAgIGlmIChkd1N0YXR1cyAhPSBDRlhfUlRGQnJlYWtUeXBlOjpQaWVjZSkKLSAgICAgIHBMYXN0UGllY2UtPm1fZHdTdGF0dXMgPSBkd1N0YXR1czsKLSAgICBlbHNlCi0gICAgICBkd1N0YXR1cyA9IHBMYXN0UGllY2UtPm1fZHdTdGF0dXM7Ci0gICAgcmV0dXJuIGR3U3RhdHVzOwotICB9Ci0KLSAgY29uc3QgQ0ZYX1JURkxpbmUqIHBMYXN0TGluZSA9IEdldFJURkxpbmUoKTsKLSAgaWYgKHBMYXN0TGluZSkgewotICAgIHBDdXJQaWVjZXMgPSAmcExhc3RMaW5lLT5tX0xpbmVQaWVjZXM7Ci0gICAgaUNvdW50ID0gcEN1clBpZWNlcy0+R2V0U2l6ZSgpOwotICAgIGlmIChpQ291bnQtLSA+IDApIHsKLSAgICAgIENGWF9SVEZQaWVjZSogcExhc3RQaWVjZSA9IHBDdXJQaWVjZXMtPkdldFB0ckF0KGlDb3VudCk7Ci0gICAgICBpZiAoZHdTdGF0dXMgIT0gQ0ZYX1JURkJyZWFrVHlwZTo6UGllY2UpCi0gICAgICAgIHBMYXN0UGllY2UtPm1fZHdTdGF0dXMgPSBkd1N0YXR1czsKLSAgICAgIGVsc2UKLSAgICAgICAgZHdTdGF0dXMgPSBwTGFzdFBpZWNlLT5tX2R3U3RhdHVzOwotICAgICAgcmV0dXJuIGR3U3RhdHVzOwotICAgIH0KLSAgICByZXR1cm4gQ0ZYX1JURkJyZWFrVHlwZTo6Tm9uZTsKLSAgfQotCi0gIGlDb3VudCA9IG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsKLSAgaWYgKGlDb3VudCA8IDEpCi0gICAgcmV0dXJuIENGWF9SVEZCcmVha1R5cGU6Ok5vbmU7Ci0KLSAgQ0ZYX1JURkNoYXImIHRjID0gbV9wQ3VyTGluZS0+R2V0Q2hhcihpQ291bnQgLSAxKTsKLSAgdGMubV9kd1N0YXR1cyA9IGR3U3RhdHVzOwotICBpZiAoZHdTdGF0dXMgPT0gQ0ZYX1JURkJyZWFrVHlwZTo6UGllY2UpCi0gICAgcmV0dXJuIGR3U3RhdHVzOwotCi0gIG1faVJlYWR5ID0gbV9wQ3VyTGluZSA9PSAmbV9SVEZMaW5lMSA/IDEgOiAyOwotICBDRlhfUlRGTGluZSogcE5leHRMaW5lID0KLSAgICAgIG1fcEN1ckxpbmUgPT0gJm1fUlRGTGluZTEgPyAmbV9SVEZMaW5lMiA6ICZtX1JURkxpbmUxOwotICBib29sIGJBbGxDaGFycyA9IG1faUFsaWdubWVudCA9PSBDRlhfUlRGTGluZUFsaWdubWVudDo6SnVzdGlmaWVkIHx8Ci0gICAgICAgICAgICAgICAgICAgbV9pQWxpZ25tZW50ID09IENGWF9SVEZMaW5lQWxpZ25tZW50OjpEaXN0cmlidXRlZDsKLQotICBpZiAoIUVuZEJyZWFrX1NwbGl0TGluZShwTmV4dExpbmUsIGJBbGxDaGFycywgZHdTdGF0dXMpKSB7Ci0gICAgc3RkOjpkZXF1ZTxGWF9UUE8+IHRwb3M7Ci0gICAgRW5kQnJlYWtfQmlkaUxpbmUoJnRwb3MsIGR3U3RhdHVzKTsKLSAgICBpZiAoIW1fYlBhZ2luYXRpb24gJiYgbV9pQWxpZ25tZW50ICE9IENGWF9SVEZMaW5lQWxpZ25tZW50OjpMZWZ0KQotICAgICAgRW5kQnJlYWtfQWxpZ25tZW50KHRwb3MsIGJBbGxDaGFycywgZHdTdGF0dXMpOwotICB9Ci0gIG1fcEN1ckxpbmUgPSBwTmV4dExpbmU7Ci0gIG1fcEN1ckxpbmUtPm1faVN0YXJ0ID0gbV9pQm91bmRhcnlTdGFydDsKLQotICBDRlhfUlRGQ2hhciogcFRDID0gR2V0TGFzdENoYXIoMCk7Ci0gIG1fZUNoYXJUeXBlID0gcFRDID8gcFRDLT5HZXRDaGFyVHlwZSgpIDogRlhfQ0hBUlRZUEVfVW5rbm93bjsKLSAgcmV0dXJuIGR3U3RhdHVzOwotfQotCi1ib29sIENGWF9SVEZCcmVhazo6RW5kQnJlYWtfU3BsaXRMaW5lKENGWF9SVEZMaW5lKiBwTmV4dExpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFsbENoYXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUlRGQnJlYWtUeXBlIGR3U3RhdHVzKSB7Ci0gIGJvb2wgYkRvbmUgPSBmYWxzZTsKLSAgaWYgKG1fcEN1ckxpbmUtPkdldExpbmVFbmQoKSA+IG1faUJvdW5kYXJ5RW5kICsgbV9pVG9sZXJhbmNlKSB7Ci0gICAgY29uc3QgQ0ZYX1JURkNoYXImIHRjID0gbV9wQ3VyTGluZS0+R2V0Q2hhcihtX3BDdXJMaW5lLT5Db3VudENoYXJzKCkgLSAxKTsKLSAgICBzd2l0Y2ggKHRjLkdldENoYXJUeXBlKCkpIHsKLSAgICAgIGNhc2UgRlhfQ0hBUlRZUEVfVGFiOgotICAgICAgY2FzZSBGWF9DSEFSVFlQRV9Db250cm9sOgotICAgICAgY2FzZSBGWF9DSEFSVFlQRV9TcGFjZToKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBTcGxpdFRleHRMaW5lKG1fcEN1ckxpbmUsIHBOZXh0TGluZSwgIW1fYlBhZ2luYXRpb24gJiYgYkFsbENoYXJzKTsKLSAgICAgICAgYkRvbmUgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAoIW1fYlBhZ2luYXRpb24gJiYgbV9wQ3VyTGluZS0+bV9pTUJDU0NoYXJzIDw9IDApIHsKLSAgICBpZiAoYkFsbENoYXJzICYmICFiRG9uZSkgewotICAgICAgaW50MzJfdCBlbmRQb3MgPSBtX3BDdXJMaW5lLT5HZXRMaW5lRW5kKCk7Ci0gICAgICBHZXRCcmVha1BvcyhtX3BDdXJMaW5lLT5tX0xpbmVDaGFycywgZW5kUG9zLCBiQWxsQ2hhcnMsIHRydWUpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBjb25zdCBDRlhfUlRGQ2hhciogcEN1ckNoYXJzID0gbV9wQ3VyTGluZS0+bV9MaW5lQ2hhcnMuZGF0YSgpOwotICBjb25zdCBDRlhfUlRGQ2hhciogcFRDOwotICBDRlhfUlRGUGllY2VBcnJheSogcEN1clBpZWNlcyA9ICZtX3BDdXJMaW5lLT5tX0xpbmVQaWVjZXM7Ci0gIENGWF9SVEZQaWVjZSB0cDsKLSAgdHAubV9wQ2hhcnMgPSAmbV9wQ3VyTGluZS0+bV9MaW5lQ2hhcnM7Ci0gIGJvb2wgYk5ldyA9IHRydWU7Ci0gIHVpbnQzMl90IGR3SWRlbnRpdHkgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oLTEpOwotICBpbnQzMl90IGlMYXN0ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpIC0gMTsKLSAgaW50MzJfdCBqID0gMDsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDw9IGlMYXN0OykgewotICAgIHBUQyA9IHBDdXJDaGFycyArIGk7Ci0gICAgaWYgKGJOZXcpIHsKLSAgICAgIHRwLm1faVN0YXJ0Q2hhciA9IGk7Ci0gICAgICB0cC5tX2lTdGFydFBvcyArPSB0cC5tX2lXaWR0aDsKLSAgICAgIHRwLm1faVdpZHRoID0gMDsKLSAgICAgIHRwLm1fZHdTdGF0dXMgPSBwVEMtPm1fZHdTdGF0dXM7Ci0gICAgICB0cC5tX2lGb250U2l6ZSA9IHBUQy0+bV9pRm9udFNpemU7Ci0gICAgICB0cC5tX2lGb250SGVpZ2h0ID0gcFRDLT5tX2lGb250SGVpZ2h0OwotICAgICAgdHAubV9pSG9yaXpvbnRhbFNjYWxlID0gcFRDLT5tX2lIb3Jpem9udGFsU2NhbGU7Ci0gICAgICB0cC5tX2lWZXJ0aWNhbFNjYWxlID0gcFRDLT5tX2lWZXJ0aWNhbFNjYWxlOwotICAgICAgZHdJZGVudGl0eSA9IHBUQy0+bV9kd0lkZW50aXR5OwotICAgICAgdHAubV9kd0lkZW50aXR5ID0gZHdJZGVudGl0eTsKLSAgICAgIHRwLm1fcFVzZXJEYXRhID0gcFRDLT5tX3BVc2VyRGF0YTsKLSAgICAgIGogPSBpOwotICAgICAgYk5ldyA9IGZhbHNlOwotICAgIH0KLQotICAgIGlmIChpID09IGlMYXN0IHx8IHBUQy0+bV9kd1N0YXR1cyAhPSBDRlhfUlRGQnJlYWtUeXBlOjpOb25lIHx8Ci0gICAgICAgIHBUQy0+bV9kd0lkZW50aXR5ICE9IGR3SWRlbnRpdHkpIHsKLSAgICAgIHRwLm1faUNoYXJzID0gaSAtIGo7Ci0gICAgICBpZiAocFRDLT5tX2R3SWRlbnRpdHkgPT0gZHdJZGVudGl0eSkgewotICAgICAgICB0cC5tX2R3U3RhdHVzID0gcFRDLT5tX2R3U3RhdHVzOwotICAgICAgICB0cC5tX2lXaWR0aCArPSBwVEMtPm1faUNoYXJXaWR0aDsKLSAgICAgICAgdHAubV9pQ2hhcnMgKz0gMTsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgICAgcEN1clBpZWNlcy0+QWRkKHRwKTsKLSAgICAgIGJOZXcgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICB0cC5tX2lXaWR0aCArPSBwVEMtPm1faUNoYXJXaWR0aDsKLSAgICAgIGkrKzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ0ZYX1JURkJyZWFrOjpFbmRCcmVha19CaWRpTGluZShzdGQ6OmRlcXVlPEZYX1RQTz4qIHRwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JURkJyZWFrVHlwZSBkd1N0YXR1cykgewotICBGWF9UUE8gdHBvOwotICBDRlhfUlRGUGllY2UgdHA7Ci0gIENGWF9SVEZDaGFyKiBwVEM7Ci0gIGludDMyX3QgaTsKLSAgaW50MzJfdCBqOwotICBzdGQ6OnZlY3RvcjxDRlhfUlRGQ2hhcj4mIGNoYXJzID0gbV9wQ3VyTGluZS0+bV9MaW5lQ2hhcnM7Ci0gIGludDMyX3QgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOwotICBpZiAoIW1fYlBhZ2luYXRpb24gJiYgbV9wQ3VyTGluZS0+bV9pQXJhYmljQ2hhcnMgPiAwKSB7Ci0gICAgaW50MzJfdCBpQmlkaU51bSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7Ci0gICAgICBwVEMgPSAmY2hhcnNbaV07Ci0gICAgICBwVEMtPm1faUJpZGlQb3MgPSBpOwotICAgICAgaWYgKHBUQy0+R2V0Q2hhclR5cGUoKSAhPSBGWF9DSEFSVFlQRV9Db250cm9sKQotICAgICAgICBpQmlkaU51bSA9IGk7Ci0gICAgICBpZiAoaSA9PSAwKQotICAgICAgICBwVEMtPm1faUJpZGlMZXZlbCA9IDE7Ci0gICAgfQotICAgIEZYX0JpZGlMaW5lKGNoYXJzLCBpQmlkaU51bSArIDEsIDApOwotICB9IGVsc2UgewotICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgewotICAgICAgcFRDID0gJmNoYXJzW2ldOwotICAgICAgcFRDLT5tX2lCaWRpTGV2ZWwgPSAwOwotICAgICAgcFRDLT5tX2lCaWRpUG9zID0gMDsKLSAgICAgIHBUQy0+bV9pQmlkaU9yZGVyID0gMDsKLSAgICB9Ci0gIH0KLQotICB0cC5tX2R3U3RhdHVzID0gQ0ZYX1JURkJyZWFrVHlwZTo6UGllY2U7Ci0gIHRwLm1faVN0YXJ0UG9zID0gbV9wQ3VyTGluZS0+bV9pU3RhcnQ7Ci0gIHRwLm1fcENoYXJzID0gJmNoYXJzOwotICBDRlhfUlRGUGllY2VBcnJheSogcEN1clBpZWNlcyA9ICZtX3BDdXJMaW5lLT5tX0xpbmVQaWVjZXM7Ci0gIGludDMyX3QgaUJpZGlMZXZlbCA9IC0xOwotICBpbnQzMl90IGlDaGFyV2lkdGg7Ci0gIHVpbnQzMl90IGR3SWRlbnRpdHkgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oLTEpOwotICBpID0gMDsKLSAgaiA9IDA7Ci0gIHdoaWxlIChpIDwgaUNvdW50KSB7Ci0gICAgcFRDID0gJmNoYXJzW2ldOwotICAgIGlmIChpQmlkaUxldmVsIDwgMCkgewotICAgICAgaUJpZGlMZXZlbCA9IHBUQy0+bV9pQmlkaUxldmVsOwotICAgICAgaUNoYXJXaWR0aCA9IHBUQy0+bV9pQ2hhcldpZHRoOwotICAgICAgdHAubV9pV2lkdGggPSBpQ2hhcldpZHRoIDwgMSA/IDAgOiBpQ2hhcldpZHRoOwotICAgICAgdHAubV9pQmlkaUxldmVsID0gaUJpZGlMZXZlbDsKLSAgICAgIHRwLm1faUJpZGlQb3MgPSBwVEMtPm1faUJpZGlPcmRlcjsKLSAgICAgIHRwLm1faUZvbnRTaXplID0gcFRDLT5tX2lGb250U2l6ZTsKLSAgICAgIHRwLm1faUZvbnRIZWlnaHQgPSBwVEMtPm1faUZvbnRIZWlnaHQ7Ci0gICAgICB0cC5tX2lIb3Jpem9udGFsU2NhbGUgPSBwVEMtPm1faUhvcml6b250YWxTY2FsZTsKLSAgICAgIHRwLm1faVZlcnRpY2FsU2NhbGUgPSBwVEMtPm1faVZlcnRpY2FsU2NhbGU7Ci0gICAgICBkd0lkZW50aXR5ID0gcFRDLT5tX2R3SWRlbnRpdHk7Ci0gICAgICB0cC5tX2R3SWRlbnRpdHkgPSBkd0lkZW50aXR5OwotICAgICAgdHAubV9wVXNlckRhdGEgPSBwVEMtPm1fcFVzZXJEYXRhOwotICAgICAgdHAubV9kd1N0YXR1cyA9IENGWF9SVEZCcmVha1R5cGU6OlBpZWNlOwotICAgICAgaSsrOwotICAgIH0gZWxzZSBpZiAoaUJpZGlMZXZlbCAhPSBwVEMtPm1faUJpZGlMZXZlbCB8fAotICAgICAgICAgICAgICAgcFRDLT5tX2R3SWRlbnRpdHkgIT0gZHdJZGVudGl0eSkgewotICAgICAgdHAubV9pQ2hhcnMgPSBpIC0gdHAubV9pU3RhcnRDaGFyOwotICAgICAgcEN1clBpZWNlcy0+QWRkKHRwKTsKLSAgICAgIHRwLm1faVN0YXJ0UG9zICs9IHRwLm1faVdpZHRoOwotICAgICAgdHAubV9pU3RhcnRDaGFyID0gaTsKLSAgICAgIHRwby5pbmRleCA9IGorKzsKLSAgICAgIHRwby5wb3MgPSB0cC5tX2lCaWRpUG9zOwotICAgICAgdHBvcy0+cHVzaF9iYWNrKHRwbyk7Ci0gICAgICBpQmlkaUxldmVsID0gLTE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlDaGFyV2lkdGggPSBwVEMtPm1faUNoYXJXaWR0aDsKLSAgICAgIGlmIChpQ2hhcldpZHRoID4gMCkKLSAgICAgICAgdHAubV9pV2lkdGggKz0gaUNoYXJXaWR0aDsKLSAgICAgIGkrKzsKLSAgICB9Ci0gIH0KLQotICBpZiAoaSA+IHRwLm1faVN0YXJ0Q2hhcikgewotICAgIHRwLm1fZHdTdGF0dXMgPSBkd1N0YXR1czsKLSAgICB0cC5tX2lDaGFycyA9IGkgLSB0cC5tX2lTdGFydENoYXI7Ci0gICAgcEN1clBpZWNlcy0+QWRkKHRwKTsKLSAgICB0cG8uaW5kZXggPSBqOwotICAgIHRwby5wb3MgPSB0cC5tX2lCaWRpUG9zOwotICAgIHRwb3MtPnB1c2hfYmFjayh0cG8pOwotICB9Ci0KLSAgc3RkOjpzb3J0KHRwb3MtPmJlZ2luKCksIHRwb3MtPmVuZCgpKTsKLSAgaW50MzJfdCBpU3RhcnRQb3MgPSBtX3BDdXJMaW5lLT5tX2lTdGFydDsKLSAgZm9yIChjb25zdCBhdXRvJiBpdCA6ICp0cG9zKSB7Ci0gICAgQ0ZYX1JURlBpZWNlJiB0dHAgPSBwQ3VyUGllY2VzLT5HZXRBdChpdC5pbmRleCk7Ci0gICAgdHRwLm1faVN0YXJ0UG9zID0gaVN0YXJ0UG9zOwotICAgIGlTdGFydFBvcyArPSB0dHAubV9pV2lkdGg7Ci0gIH0KLX0KLQotdm9pZCBDRlhfUlRGQnJlYWs6OkVuZEJyZWFrX0FsaWdubWVudChjb25zdCBzdGQ6OmRlcXVlPEZYX1RQTz4mIHRwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFsbENoYXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUlRGQnJlYWtUeXBlIGR3U3RhdHVzKSB7Ci0gIENGWF9SVEZQaWVjZUFycmF5KiBwQ3VyUGllY2VzID0gJm1fcEN1ckxpbmUtPm1fTGluZVBpZWNlczsKLSAgaW50MzJfdCBpTmV0V2lkdGggPSBtX3BDdXJMaW5lLT5tX2lXaWR0aDsKLSAgaW50MzJfdCBpR2FwQ2hhcnMgPSAwOwotICBpbnQzMl90IGlDaGFyV2lkdGg7Ci0gIGludDMyX3QgaUNvdW50ID0gcEN1clBpZWNlcy0+R2V0U2l6ZSgpOwotICBib29sIGJGaW5kID0gZmFsc2U7Ci0gIHVpbnQzMl90IGR3Q2hhclR5cGU7Ci0gIGludDMyX3QgaTsKLSAgaW50MzJfdCBqOwotICBGWF9UUE8gdHBvOwotICBmb3IgKGkgPSBpQ291bnQgLSAxOyBpID4gLTE7IGktLSkgewotICAgIHRwbyA9IHRwb3NbaV07Ci0gICAgQ0ZYX1JURlBpZWNlJiB0dHAgPSBwQ3VyUGllY2VzLT5HZXRBdCh0cG8uaW5kZXgpOwotICAgIGlmICghYkZpbmQpCi0gICAgICBpTmV0V2lkdGggPSB0dHAuR2V0RW5kUG9zKCk7Ci0KLSAgICBib29sIGJBcmFiaWMgPSBGWF9Jc09kZCh0dHAubV9pQmlkaUxldmVsKTsKLSAgICBqID0gYkFyYWJpYyA/IDAgOiB0dHAubV9pQ2hhcnMgLSAxOwotICAgIHdoaWxlIChqID4gLTEgJiYgaiA8IHR0cC5tX2lDaGFycykgewotICAgICAgY29uc3QgQ0ZYX1JURkNoYXImIHRjID0gdHRwLkdldENoYXIoaik7Ci0gICAgICBpZiAodGMubV9uQnJlYWtUeXBlID09IEZYX0xCVF9ESVJFQ1RfQlJLKQotICAgICAgICBpR2FwQ2hhcnMrKzsKLQotICAgICAgaWYgKCFiRmluZCB8fCAhYkFsbENoYXJzKSB7Ci0gICAgICAgIGR3Q2hhclR5cGUgPSB0Yy5HZXRDaGFyVHlwZSgpOwotICAgICAgICBpZiAoZHdDaGFyVHlwZSA9PSBGWF9DSEFSVFlQRV9TcGFjZSB8fAotICAgICAgICAgICAgZHdDaGFyVHlwZSA9PSBGWF9DSEFSVFlQRV9Db250cm9sKSB7Ci0gICAgICAgICAgaWYgKCFiRmluZCkgewotICAgICAgICAgICAgaUNoYXJXaWR0aCA9IHRjLm1faUNoYXJXaWR0aDsKLSAgICAgICAgICAgIGlmIChiQWxsQ2hhcnMgJiYgaUNoYXJXaWR0aCA+IDApCi0gICAgICAgICAgICAgIGlOZXRXaWR0aCAtPSBpQ2hhcldpZHRoOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBiRmluZCA9IHRydWU7Ci0gICAgICAgICAgaWYgKCFiQWxsQ2hhcnMpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaiArPSBiQXJhYmljID8gMSA6IC0xOwotICAgIH0KLSAgICBpZiAoIWJBbGxDaGFycyAmJiBiRmluZCkKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaW50MzJfdCBpT2Zmc2V0ID0gbV9pQm91bmRhcnlFbmQgLSBpTmV0V2lkdGg7Ci0gIGlmIChpR2FwQ2hhcnMgPiAwICYmIChtX2lBbGlnbm1lbnQgPT0gQ0ZYX1JURkxpbmVBbGlnbm1lbnQ6OkRpc3RyaWJ1dGVkIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAobV9pQWxpZ25tZW50ID09IENGWF9SVEZMaW5lQWxpZ25tZW50OjpKdXN0aWZpZWQgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICBkd1N0YXR1cyAhPSBDRlhfUlRGQnJlYWtUeXBlOjpQYXJhZ3JhcGgpKSkgewotICAgIGludDMyX3QgaVN0YXJ0ID0gLTE7Ci0gICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7Ci0gICAgICB0cG8gPSB0cG9zW2ldOwotICAgICAgQ0ZYX1JURlBpZWNlJiB0dHAgPSBwQ3VyUGllY2VzLT5HZXRBdCh0cG8uaW5kZXgpOwotICAgICAgaWYgKGlTdGFydCA8IDApCi0gICAgICAgIGlTdGFydCA9IHR0cC5tX2lTdGFydFBvczsKLSAgICAgIGVsc2UKLSAgICAgICAgdHRwLm1faVN0YXJ0UG9zID0gaVN0YXJ0OwotCi0gICAgICBmb3IgKGogPSAwOyBqIDwgdHRwLm1faUNoYXJzOyBqKyspIHsKLSAgICAgICAgQ0ZYX1JURkNoYXImIHRjID0gdHRwLkdldENoYXIoaik7Ci0gICAgICAgIGlmICh0Yy5tX25CcmVha1R5cGUgIT0gRlhfTEJUX0RJUkVDVF9CUksgfHwgdGMubV9pQ2hhcldpZHRoIDwgMCkKLSAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICBpbnQzMl90IGsgPSBpT2Zmc2V0IC8gaUdhcENoYXJzOwotICAgICAgICB0Yy5tX2lDaGFyV2lkdGggKz0gazsKLSAgICAgICAgdHRwLm1faVdpZHRoICs9IGs7Ci0gICAgICAgIGlPZmZzZXQgLT0gazsKLSAgICAgICAgaUdhcENoYXJzLS07Ci0gICAgICAgIGlmIChpR2FwQ2hhcnMgPCAxKQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaVN0YXJ0ICs9IHR0cC5tX2lXaWR0aDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAobV9pQWxpZ25tZW50ID09IENGWF9SVEZMaW5lQWxpZ25tZW50OjpSaWdodCB8fAotICAgICAgICAgICAgIG1faUFsaWdubWVudCA9PSBDRlhfUlRGTGluZUFsaWdubWVudDo6Q2VudGVyKSB7Ci0gICAgaWYgKG1faUFsaWdubWVudCA9PSBDRlhfUlRGTGluZUFsaWdubWVudDo6Q2VudGVyKQotICAgICAgaU9mZnNldCAvPSAyOwotICAgIGlmIChpT2Zmc2V0ID4gMCkgewotICAgICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7Ci0gICAgICAgIENGWF9SVEZQaWVjZSYgdHRwID0gcEN1clBpZWNlcy0+R2V0QXQoaSk7Ci0gICAgICAgIHR0cC5tX2lTdGFydFBvcyArPSBpT2Zmc2V0OwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1pbnQzMl90IENGWF9SVEZCcmVhazo6R2V0QnJlYWtQb3Moc3RkOjp2ZWN0b3I8Q0ZYX1JURkNoYXI+JiB0Y2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUVuZFBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJBbGxDaGFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJPbmx5QnJrKSB7Ci0gIGludDMyX3QgaUxlbmd0aCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4odGNhKSAtIDE7Ci0gIGlmIChpTGVuZ3RoIDwgMSkKLSAgICByZXR1cm4gaUxlbmd0aDsKLQotICBpbnQzMl90IGlCcmVhayA9IC0xOwotICBpbnQzMl90IGlCcmVha1BvcyA9IC0xOwotICBpbnQzMl90IGlJbmRpcmVjdCA9IC0xOwotICBpbnQzMl90IGlJbmRpcmVjdFBvcyA9IC0xOwotICBpbnQzMl90IGlMYXN0ID0gLTE7Ci0gIGludDMyX3QgaUxhc3RQb3MgPSAtMTsKLSAgaWYgKGlFbmRQb3MgPD0gbV9pQm91bmRhcnlFbmQpIHsKLSAgICBpZiAoIWJBbGxDaGFycykKLSAgICAgIHJldHVybiBpTGVuZ3RoOwotCi0gICAgaUJyZWFrID0gaUxlbmd0aDsKLSAgICBpQnJlYWtQb3MgPSBpRW5kUG9zOwotICB9Ci0KLSAgQ0ZYX1JURkNoYXIqIHBDaGFyQXJyYXkgPSB0Y2EuZGF0YSgpOwotICBDRlhfUlRGQ2hhciogcEN1ciA9IHBDaGFyQXJyYXkgKyBpTGVuZ3RoOwotICAtLWlMZW5ndGg7Ci0gIGlmIChiQWxsQ2hhcnMpCi0gICAgcEN1ci0+bV9uQnJlYWtUeXBlID0gRlhfTEJUX1VOS05PV047Ci0KLSAgdWludDMyX3QgbkNvZGVQcm9wID0gcEN1ci0+bV9kd0NoYXJQcm9wczsKLSAgdWludDMyX3Qgbk5leHQgPSBuQ29kZVByb3AgJiAweDAwM0Y7Ci0gIGludDMyX3QgaUNoYXJXaWR0aCA9IHBDdXItPm1faUNoYXJXaWR0aDsKLSAgaWYgKGlDaGFyV2lkdGggPiAwKQotICAgIGlFbmRQb3MgLT0gaUNoYXJXaWR0aDsKLQotICB3aGlsZSAoaUxlbmd0aCA+PSAwKSB7Ci0gICAgcEN1ciA9IHBDaGFyQXJyYXkgKyBpTGVuZ3RoOwotICAgIG5Db2RlUHJvcCA9IHBDdXItPm1fZHdDaGFyUHJvcHM7Ci0gICAgdWludDMyX3QgbkN1ciA9IG5Db2RlUHJvcCAmIDB4MDAzRjsKLSAgICBib29sIGJOZWVkQnJlYWsgPSBmYWxzZTsKLSAgICBGWF9MSU5FQlJFQUtUWVBFIGVUeXBlOwotICAgIGlmIChuQ3VyID09IEZYX0NCUF9UQikgewotICAgICAgYk5lZWRCcmVhayA9IHRydWU7Ci0gICAgICBlVHlwZSA9IG5OZXh0ID09IEZYX0NCUF9UQiA/IEZYX0xCVF9QUk9ISUJJVEVEX0JSSwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnc19GWF9MaW5lQnJlYWtfUGFpclRhYmxlW25DdXJdW25OZXh0XTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKG5DdXIgPT0gRlhfQ0JQX1NQKQotICAgICAgICBiTmVlZEJyZWFrID0gdHJ1ZTsKLQotICAgICAgZVR5cGUgPSBuTmV4dCA9PSBGWF9DQlBfU1AgPyBGWF9MQlRfUFJPSElCSVRFRF9CUksKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ3NfRlhfTGluZUJyZWFrX1BhaXJUYWJsZVtuQ3VyXVtuTmV4dF07Ci0gICAgfQotICAgIGlmIChiQWxsQ2hhcnMpCi0gICAgICBwQ3VyLT5tX25CcmVha1R5cGUgPSBlVHlwZTsKLQotICAgIGlmICghYk9ubHlCcmspIHsKLSAgICAgIGlDaGFyV2lkdGggPSBwQ3VyLT5tX2lDaGFyV2lkdGg7Ci0gICAgICBpZiAoaUVuZFBvcyA8PSBtX2lCb3VuZGFyeUVuZCB8fCBiTmVlZEJyZWFrKSB7Ci0gICAgICAgIGlmIChlVHlwZSA9PSBGWF9MQlRfRElSRUNUX0JSSyAmJiBpQnJlYWsgPCAwKSB7Ci0gICAgICAgICAgaUJyZWFrID0gaUxlbmd0aDsKLSAgICAgICAgICBpQnJlYWtQb3MgPSBpRW5kUG9zOwotICAgICAgICAgIGlmICghYkFsbENoYXJzKQotICAgICAgICAgICAgcmV0dXJuIGlMZW5ndGg7Ci0gICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gRlhfTEJUX0lORElSRUNUX0JSSyAmJiBpSW5kaXJlY3QgPCAwKSB7Ci0gICAgICAgICAgaUluZGlyZWN0ID0gaUxlbmd0aDsKLSAgICAgICAgICBpSW5kaXJlY3RQb3MgPSBpRW5kUG9zOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpTGFzdCA8IDApIHsKLSAgICAgICAgICBpTGFzdCA9IGlMZW5ndGg7Ci0gICAgICAgICAgaUxhc3RQb3MgPSBpRW5kUG9zOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoaUNoYXJXaWR0aCA+IDApCi0gICAgICAgIGlFbmRQb3MgLT0gaUNoYXJXaWR0aDsKLSAgICB9Ci0gICAgbk5leHQgPSBuQ29kZVByb3AgJiAweDAwM0Y7Ci0gICAgaUxlbmd0aC0tOwotICB9Ci0gIGlmIChiT25seUJyaykKLSAgICByZXR1cm4gMDsKLQotICBpZiAoaUJyZWFrID4gLTEpIHsKLSAgICBpRW5kUG9zID0gaUJyZWFrUG9zOwotICAgIHJldHVybiBpQnJlYWs7Ci0gIH0KLSAgaWYgKGlJbmRpcmVjdCA+IC0xKSB7Ci0gICAgaUVuZFBvcyA9IGlJbmRpcmVjdFBvczsKLSAgICByZXR1cm4gaUluZGlyZWN0OwotICB9Ci0gIGlmIChpTGFzdCA+IC0xKSB7Ci0gICAgaUVuZFBvcyA9IGlMYXN0UG9zOwotICAgIHJldHVybiBpTGFzdDsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotdm9pZCBDRlhfUlRGQnJlYWs6OlNwbGl0VGV4dExpbmUoQ0ZYX1JURkxpbmUqIHBDdXJMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JURkxpbmUqIHBOZXh0TGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFsbENoYXJzKSB7Ci0gIEFTU0VSVChwQ3VyTGluZSAmJiBwTmV4dExpbmUpOwotICBpbnQzMl90IGlDb3VudCA9IHBDdXJMaW5lLT5Db3VudENoYXJzKCk7Ci0gIGlmIChpQ291bnQgPCAyKQotICAgIHJldHVybjsKLQotICBpbnQzMl90IGlFbmRQb3MgPSBwQ3VyTGluZS0+R2V0TGluZUVuZCgpOwotICBzdGQ6OnZlY3RvcjxDRlhfUlRGQ2hhcj4mIGN1ckNoYXJzID0gcEN1ckxpbmUtPm1fTGluZUNoYXJzOwotICBpbnQzMl90IGlDaGFyUG9zID0gR2V0QnJlYWtQb3MoY3VyQ2hhcnMsIGlFbmRQb3MsIGJBbGxDaGFycywgZmFsc2UpOwotICBpZiAoaUNoYXJQb3MgPCAwKQotICAgIGlDaGFyUG9zID0gMDsKLQotICBpQ2hhclBvcysrOwotICBpZiAoaUNoYXJQb3MgPj0gaUNvdW50KSB7Ci0gICAgcE5leHRMaW5lLT5SZW1vdmVBbGwodHJ1ZSk7Ci0gICAgQ0ZYX0NoYXIqIHBUQyA9ICZjdXJDaGFyc1tpQ2hhclBvcyAtIDFdOwotICAgIHBUQy0+bV9uQnJlYWtUeXBlID0gRlhfTEJUX1VOS05PV047Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcE5leHRMaW5lLT5tX0xpbmVDaGFycyA9Ci0gICAgICBzdGQ6OnZlY3RvcjxDRlhfUlRGQ2hhcj4oY3VyQ2hhcnMuYmVnaW4oKSArIGlDaGFyUG9zLCBjdXJDaGFycy5lbmQoKSk7Ci0gIGN1ckNoYXJzLmVyYXNlKGN1ckNoYXJzLmJlZ2luKCkgKyBpQ2hhclBvcywgY3VyQ2hhcnMuZW5kKCkpOwotICBwTmV4dExpbmUtPm1faVN0YXJ0ID0gcEN1ckxpbmUtPm1faVN0YXJ0OwotICBwTmV4dExpbmUtPm1faVdpZHRoID0gcEN1ckxpbmUtPkdldExpbmVFbmQoKSAtIGlFbmRQb3M7Ci0gIHBDdXJMaW5lLT5tX2lXaWR0aCA9IGlFbmRQb3M7Ci0gIGN1ckNoYXJzW2lDaGFyUG9zIC0gMV0ubV9uQnJlYWtUeXBlID0gRlhfTEJUX1VOS05PV047Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwTmV4dExpbmUtPm1fTGluZUNoYXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgaWYgKHBOZXh0TGluZS0+bV9MaW5lQ2hhcnNbaV0uR2V0Q2hhclR5cGUoKSA+PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmKSB7Ci0gICAgICBwQ3VyTGluZS0+bV9pQXJhYmljQ2hhcnMtLTsKLSAgICAgIHBOZXh0TGluZS0+bV9pQXJhYmljQ2hhcnMrKzsKLSAgICB9Ci0gICAgcE5leHRMaW5lLT5tX0xpbmVDaGFyc1tpXS5tX2R3U3RhdHVzID0gQ0ZYX1JURkJyZWFrVHlwZTo6Tm9uZTsKLSAgfQotfQotCi1pbnQzMl90IENGWF9SVEZCcmVhazo6Q291bnRCcmVha1BpZWNlcygpIGNvbnN0IHsKLSAgY29uc3QgQ0ZYX1JURlBpZWNlQXJyYXkqIHBSVEZQaWVjZXMgPSBHZXRSVEZQaWVjZXMoKTsKLSAgcmV0dXJuIHBSVEZQaWVjZXMgPyBwUlRGUGllY2VzLT5HZXRTaXplKCkgOiAwOwotfQotCi1jb25zdCBDRlhfUlRGUGllY2UqIENGWF9SVEZCcmVhazo6R2V0QnJlYWtQaWVjZShpbnQzMl90IGluZGV4KSBjb25zdCB7Ci0gIGNvbnN0IENGWF9SVEZQaWVjZUFycmF5KiBwUlRGUGllY2VzID0gR2V0UlRGUGllY2VzKCk7Ci0gIGlmICghcFJURlBpZWNlcykKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBwUlRGUGllY2VzLT5HZXRTaXplKCkpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIHJldHVybiBwUlRGUGllY2VzLT5HZXRQdHJBdChpbmRleCk7Ci19Ci0KLXZvaWQgQ0ZYX1JURkJyZWFrOjpDbGVhckJyZWFrUGllY2VzKCkgewotICBjb25zdCBDRlhfUlRGTGluZSogcFJURkxpbmUgPSBHZXRSVEZMaW5lKCk7Ci0gIGlmIChwUlRGTGluZSkKLSAgICBjb25zdF9jYXN0PENGWF9SVEZMaW5lKj4ocFJURkxpbmUpLT5SZW1vdmVBbGwodHJ1ZSk7Ci0gIG1faVJlYWR5ID0gMDsKLX0KLQotdm9pZCBDRlhfUlRGQnJlYWs6OlJlc2V0KCkgewotICBtX2VDaGFyVHlwZSA9IEZYX0NIQVJUWVBFX1Vua25vd247Ci0gIG1fUlRGTGluZTEuUmVtb3ZlQWxsKHRydWUpOwotICBtX1JURkxpbmUyLlJlbW92ZUFsbCh0cnVlKTsKLX0KLQotaW50MzJfdCBDRlhfUlRGQnJlYWs6OkdldERpc3BsYXlQb3MoY29uc3QgRlhfUlRGVEVYVE9CSiogcFRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJDaGFyQ29kZSkgY29uc3QgewotICBpZiAoIXBUZXh0IHx8IHBUZXh0LT5pTGVuZ3RoIDwgMSkKLSAgICByZXR1cm4gMDsKLQotICBBU1NFUlQocFRleHQtPnBGb250ICYmIHBUZXh0LT5wUmVjdCk7Ci0KLSAgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IHBGb250ID0gcFRleHQtPnBGb250OwotICBDRlhfUmVjdEYgcnRUZXh0KCpwVGV4dC0+cFJlY3QpOwotICBib29sIGJSVExQaWVjZSA9IEZYX0lzT2RkKHBUZXh0LT5pQmlkaUxldmVsKTsKLSAgRlhfRkxPQVQgZkZvbnRTaXplID0gcFRleHQtPmZGb250U2l6ZTsKLSAgaW50MzJfdCBpRm9udFNpemUgPSBGWFNZU19yb3VuZChmRm9udFNpemUgKiAyMC4wZik7Ci0gIGludDMyX3QgaUFzY2VudCA9IHBGb250LT5HZXRBc2NlbnQoKTsKLSAgaW50MzJfdCBpRGVzY2VudCA9IHBGb250LT5HZXREZXNjZW50KCk7Ci0gIGludDMyX3QgaU1heEhlaWdodCA9IGlBc2NlbnQgLSBpRGVzY2VudDsKLSAgRlhfRkxPQVQgZkZvbnRIZWlnaHQgPSBmRm9udFNpemU7Ci0gIEZYX0ZMT0FUIGZBc2NlbnQgPSBmRm9udEhlaWdodCAqIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihpQXNjZW50KSAvCi0gICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGWF9GTE9BVD4oaU1heEhlaWdodCk7Ci0gIEZYX1dDSEFSIHdjaDsKLSAgRlhfV0NIQVIgd1ByZXYgPSAweEZFRkY7Ci0gIEZYX1dDSEFSIHdOZXh0OwotICBGWF9XQ0hBUiB3Rm9ybTsKLSAgaW50MzJfdCBpV2lkdGg7Ci0gIGludDMyX3QgaUNoYXJXaWR0aDsKLSAgaW50MzJfdCBpQ2hhckhlaWdodDsKLSAgRlhfRkxPQVQgZlggPSBydFRleHQubGVmdDsKLSAgRlhfRkxPQVQgZlkgPSBydFRleHQudG9wOwotICBGWF9GTE9BVCBmQ2hhcldpZHRoOwotICBGWF9GTE9BVCBmQ2hhckhlaWdodDsKLSAgaW50MzJfdCBpSG9yU2NhbGUgPSBwVGV4dC0+aUhvcml6b250YWxTY2FsZTsKLSAgaW50MzJfdCBpVmVyU2NhbGUgPSBwVGV4dC0+aVZlcnRpY2FsU2NhbGU7Ci0gIGJvb2wgYkVtcHR5Q2hhcjsKLSAgdWludDMyX3QgZHdQcm9wczsKLSAgdWludDMyX3QgZHdDaGFyVHlwZTsKLQotICBpZiAoYlJUTFBpZWNlKQotICAgIGZYID0gcnRUZXh0LnJpZ2h0KCk7Ci0KLSAgZlkgKz0gZkFzY2VudDsKLSAgaW50MzJfdCBpQ291bnQgPSAwOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwVGV4dC0+aUxlbmd0aDsgaSsrKSB7Ci0gICAgd2NoID0gcFRleHQtPnBTdHJbaV07Ci0gICAgaVdpZHRoID0gcFRleHQtPnBXaWR0aHNbaV07Ci0gICAgZHdQcm9wcyA9IEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKHdjaCk7Ci0gICAgZHdDaGFyVHlwZSA9IChkd1Byb3BzICYgRlhfQ0hBUlRZUEVCSVRTTUFTSyk7Ci0gICAgaWYgKGlXaWR0aCA9PSAwKSB7Ci0gICAgICBpZiAoZHdDaGFyVHlwZSA9PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmKQotICAgICAgICB3UHJldiA9IDB4RkVGRjsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGlDaGFyV2lkdGggPSBGWFNZU19hYnMoaVdpZHRoKTsKLSAgICBiRW1wdHlDaGFyID0KLSAgICAgICAgKGR3Q2hhclR5cGUgPj0gRlhfQ0hBUlRZUEVfVGFiICYmIGR3Q2hhclR5cGUgPD0gRlhfQ0hBUlRZUEVfQ29udHJvbCk7Ci0gICAgaWYgKCFiRW1wdHlDaGFyKQotICAgICAgaUNvdW50Kys7Ci0KLSAgICBpZiAocENoYXJQb3MpIHsKLSAgICAgIGlDaGFyV2lkdGggLz0gaUZvbnRTaXplOwotICAgICAgd0Zvcm0gPSB3Y2g7Ci0gICAgICBpZiAoZHdDaGFyVHlwZSA+PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmKSB7Ci0gICAgICAgIGlmIChpICsgMSA8IHBUZXh0LT5pTGVuZ3RoKSB7Ci0gICAgICAgICAgd05leHQgPSBwVGV4dC0+cFN0cltpICsgMV07Ci0gICAgICAgICAgaWYgKHBUZXh0LT5wV2lkdGhzW2kgKyAxXSA8IDAgJiYgaSArIDIgPCBwVGV4dC0+aUxlbmd0aCkKLSAgICAgICAgICAgIHdOZXh0ID0gcFRleHQtPnBTdHJbaSArIDJdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHdOZXh0ID0gMHhGRUZGOwotICAgICAgICB9Ci0gICAgICAgIHdGb3JtID0gcGRmaXVtOjphcmFiaWM6OkdldEZvcm1DaGFyKHdjaCwgd1ByZXYsIHdOZXh0KTsKLSAgICAgIH0gZWxzZSBpZiAoYlJUTFBpZWNlKSB7Ci0gICAgICAgIHdGb3JtID0gRlhfR2V0TWlycm9yQ2hhcih3Y2gsIGR3UHJvcHMsIGJSVExQaWVjZSwgZmFsc2UpOwotICAgICAgfQotICAgICAgZHdQcm9wcyA9IEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKHdGb3JtKTsKLQotICAgICAgaWYgKCFiRW1wdHlDaGFyKSB7Ci0gICAgICAgIGlmIChiQ2hhckNvZGUpIHsKLSAgICAgICAgICBwQ2hhclBvcy0+bV9HbHlwaEluZGV4ID0gd2NoOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBDaGFyUG9zLT5tX0dseXBoSW5kZXggPSBwRm9udC0+R2V0R2x5cGhJbmRleCh3Rm9ybSwgZmFsc2UpOwotICAgICAgICAgIGlmIChwQ2hhclBvcy0+bV9HbHlwaEluZGV4ID09IDB4RkZGRikKLSAgICAgICAgICAgIHBDaGFyUG9zLT5tX0dseXBoSW5kZXggPSBwRm9udC0+R2V0R2x5cGhJbmRleCh3Y2gsIGZhbHNlKTsKLSAgICAgICAgfQotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gICAgICAgIHBDaGFyUG9zLT5tX0V4dEdJRCA9IHBDaGFyUG9zLT5tX0dseXBoSW5kZXg7Ci0jZW5kaWYKLSAgICAgICAgcENoYXJQb3MtPm1fRm9udENoYXJXaWR0aCA9IGlDaGFyV2lkdGg7Ci0gICAgICB9Ci0gICAgICBpQ2hhckhlaWdodCA9IDEwMDA7Ci0KLSAgICAgIGZDaGFyV2lkdGggPSBmRm9udFNpemUgKiBpQ2hhcldpZHRoIC8gMTAwMC4wZjsKLSAgICAgIGZDaGFySGVpZ2h0ID0gZkZvbnRTaXplICogaUNoYXJIZWlnaHQgLyAxMDAwLjBmOwotICAgICAgaWYgKGJSVExQaWVjZSAmJiBkd0NoYXJUeXBlICE9IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKQotICAgICAgICBmWCAtPSBmQ2hhcldpZHRoOwotCi0gICAgICBpZiAoIWJFbXB0eUNoYXIpCi0gICAgICAgIHBDaGFyUG9zLT5tX09yaWdpbiA9IENGWF9Qb2ludEYoZlgsIGZZKTsKLSAgICAgIGlmICghYlJUTFBpZWNlICYmIGR3Q2hhclR5cGUgIT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pCi0gICAgICAgIGZYICs9IGZDaGFyV2lkdGg7Ci0KLSAgICAgIGlmICghYkVtcHR5Q2hhcikgewotICAgICAgICBwQ2hhclBvcy0+bV9iR2x5cGhBZGp1c3QgPSB0cnVlOwotICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAtMTsKLSAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMDsKLSAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gMDsKLSAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gMTsKLSAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luLnkgKz0gZkFzY2VudCAqIGlWZXJTY2FsZSAvIDEwMC4wZjsKLSAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luLnkgLT0gZkFzY2VudDsKLQotICAgICAgICBpZiAoaUhvclNjYWxlICE9IDEwMCB8fCBpVmVyU2NhbGUgIT0gMTAwKSB7Ci0gICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0KLSAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdICogaUhvclNjYWxlIC8gMTAwLjBmOwotICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9Ci0gICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSAqIGlIb3JTY2FsZSAvIDEwMC4wZjsKLSAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPQotICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gKiBpVmVyU2NhbGUgLyAxMDAuMGY7Ci0gICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0KLSAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdICogaVZlclNjYWxlIC8gMTAwLjBmOwotICAgICAgICB9Ci0gICAgICAgIHBDaGFyUG9zKys7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChpV2lkdGggPiAwKQotICAgICAgd1ByZXYgPSB3Y2g7Ci0gIH0KLSAgcmV0dXJuIGlDb3VudDsKLX0KLQotQ0ZYX1JURlBpZWNlOjpDRlhfUlRGUGllY2UoKQotICAgIDogbV9kd1N0YXR1cyhDRlhfUlRGQnJlYWtUeXBlOjpQaWVjZSksCi0gICAgICBtX2lTdGFydFBvcygwKSwKLSAgICAgIG1faVdpZHRoKC0xKSwKLSAgICAgIG1faVN0YXJ0Q2hhcigwKSwKLSAgICAgIG1faUNoYXJzKDApLAotICAgICAgbV9pQmlkaUxldmVsKDApLAotICAgICAgbV9pQmlkaVBvcygwKSwKLSAgICAgIG1faUZvbnRTaXplKDApLAotICAgICAgbV9pRm9udEhlaWdodCgwKSwKLSAgICAgIG1faUhvcml6b250YWxTY2FsZSgxMDApLAotICAgICAgbV9pVmVydGljYWxTY2FsZSgxMDApLAotICAgICAgbV9kd0lkZW50aXR5KDApLAotICAgICAgbV9wQ2hhcnMobnVsbHB0ciksCi0gICAgICBtX3BVc2VyRGF0YShudWxscHRyKSB7fQotCi1DRlhfUlRGUGllY2U6On5DRlhfUlRGUGllY2UoKSB7Ci0gIFJlc2V0KCk7Ci19Ci0KLUNGWF9SVEZMaW5lOjpDRlhfUlRGTGluZSgpCi0gICAgOiBtX0xpbmVQaWVjZXMoMTYpLAotICAgICAgbV9pU3RhcnQoMCksCi0gICAgICBtX2lXaWR0aCgwKSwKLSAgICAgIG1faUFyYWJpY0NoYXJzKDApLAotICAgICAgbV9pTUJDU0NoYXJzKDApIHt9Ci0KLUNGWF9SVEZMaW5lOjp+Q0ZYX1JURkxpbmUoKSB7Ci0gIFJlbW92ZUFsbChmYWxzZSk7Ci19Ci0KLUZYX1JURlRFWFRPQko6OkZYX1JURlRFWFRPQkooKQotICAgIDogcEZvbnQobnVsbHB0ciksCi0gICAgICBwUmVjdChudWxscHRyKSwKLSAgICAgIHdMaW5lQnJlYWtDaGFyKEwnXG4nKSwKLSAgICAgIGZGb250U2l6ZSgxMi4wZiksCi0gICAgICBpTGVuZ3RoKDApLAotICAgICAgaUJpZGlMZXZlbCgwKSwKLSAgICAgIGlIb3Jpem9udGFsU2NhbGUoMTAwKSwKLSAgICAgIGlWZXJ0aWNhbFNjYWxlKDEwMCkge30KLQotRlhfUlRGVEVYVE9CSjo6fkZYX1JURlRFWFRPQkooKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2ZnYXMvbGF5b3V0L2ZnYXNfcnRmYnJlYWsuaCBiL3hmYS9mZ2FzL2xheW91dC9mZ2FzX3J0ZmJyZWFrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkOTk5ZWMuLjAwMDAwMDAKLS0tIGEveGZhL2ZnYXMvbGF5b3V0L2ZnYXNfcnRmYnJlYWsuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZHQVNfTEFZT1VUX0ZHQVNfUlRGQlJFQUtfSF8KLSNkZWZpbmUgWEZBX0ZHQVNfTEFZT1VUX0ZHQVNfUlRGQlJFQUtfSF8KLQotI2luY2x1ZGUgPGRlcXVlPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3JldGFpbl9wdHIuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF91Y2QuaCIKLSNpbmNsdWRlICJ4ZmEvZmdhcy9jcnQvZmdhc191dGlscy5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2xheW91dC9mZ2FzX3RleHRicmVhay5oIgotCi1jbGFzcyBDRkdBU19HRUZvbnQ7Ci0KLSNkZWZpbmUgRlhfUlRGTEFZT1VUU1RZTEVfUGFnaW5hdGlvbiAweDAxCi0jZGVmaW5lIEZYX1JURkxBWU9VVFNUWUxFX0V4cGFuZFRhYiAweDEwCi0KLWVudW0gY2xhc3MgQ0ZYX1JURkxpbmVBbGlnbm1lbnQgewotICBMZWZ0ID0gMCwKLSAgQ2VudGVyLAotICBSaWdodCwKLSAgSnVzdGlmaWVkLAotICBEaXN0cmlidXRlZAotfTsKLQotc3RydWN0IEZYX1JURlRFWFRPQkogewotICBGWF9SVEZURVhUT0JKKCk7Ci0gIH5GWF9SVEZURVhUT0JKKCk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgcFN0cjsKLSAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gcFdpZHRoczsKLSAgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IHBGb250OwotICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0OwotICBGWF9XQ0hBUiB3TGluZUJyZWFrQ2hhcjsKLSAgRlhfRkxPQVQgZkZvbnRTaXplOwotICBpbnQzMl90IGlMZW5ndGg7Ci0gIGludDMyX3QgaUJpZGlMZXZlbDsKLSAgaW50MzJfdCBpSG9yaXpvbnRhbFNjYWxlOwotICBpbnQzMl90IGlWZXJ0aWNhbFNjYWxlOwotfTsKLQotY2xhc3MgQ0ZYX1JURlBpZWNlIHsKLSBwdWJsaWM6Ci0gIENGWF9SVEZQaWVjZSgpOwotICB+Q0ZYX1JURlBpZWNlKCk7Ci0KLSAgaW50MzJfdCBHZXRFbmRQb3MoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1faVdpZHRoIDwgMCA/IG1faVN0YXJ0UG9zIDogbV9pU3RhcnRQb3MgKyBtX2lXaWR0aDsKLSAgfQotCi0gIENGWF9SVEZDaGFyJiBHZXRDaGFyKGludDMyX3QgaW5kZXgpIHsKLSAgICBBU1NFUlQoaW5kZXggPiAtMSAmJiBpbmRleCA8IG1faUNoYXJzICYmIG1fcENoYXJzKTsKLSAgICByZXR1cm4gKCptX3BDaGFycylbbV9pU3RhcnRDaGFyICsgaW5kZXhdOwotICB9Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0U3RyaW5nKCkgY29uc3QgewotICAgIENGWF9XaWRlU3RyaW5nIHJldDsKLSAgICByZXQuUmVzZXJ2ZShtX2lDaGFycyk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSBtX2lTdGFydENoYXI7IGkgPCBtX2lTdGFydENoYXIgKyBtX2lDaGFyczsgaSsrKQotICAgICAgcmV0ICs9IHN0YXRpY19jYXN0PEZYX1dDSEFSPigoKm1fcENoYXJzKVtpXS5tX3dDaGFyQ29kZSk7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPGludDMyX3Q+IEdldFdpZHRocygpIGNvbnN0IHsKLSAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiByZXQ7Ci0gICAgcmV0LnJlc2VydmUobV9pQ2hhcnMpOwotICAgIGZvciAoaW50MzJfdCBpID0gbV9pU3RhcnRDaGFyOyBpIDwgbV9pU3RhcnRDaGFyICsgbV9pQ2hhcnM7IGkrKykKLSAgICAgIHJldC5wdXNoX2JhY2soKCptX3BDaGFycylbaV0ubV9pQ2hhcldpZHRoKTsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgdm9pZCBSZXNldCgpIHsKLSAgICBtX2R3U3RhdHVzID0gQ0ZYX1JURkJyZWFrVHlwZTo6UGllY2U7Ci0gICAgaWYgKG1faVdpZHRoID4gLTEpCi0gICAgICBtX2lTdGFydFBvcyArPSBtX2lXaWR0aDsKLQotICAgIG1faVdpZHRoID0gLTE7Ci0gICAgbV9pU3RhcnRDaGFyICs9IG1faUNoYXJzOwotICAgIG1faUNoYXJzID0gMDsKLSAgICBtX2lCaWRpTGV2ZWwgPSAwOwotICAgIG1faUJpZGlQb3MgPSAwOwotICAgIG1faUhvcml6b250YWxTY2FsZSA9IDEwMDsKLSAgICBtX2lWZXJ0aWNhbFNjYWxlID0gMTAwOwotICB9Ci0KLSAgQ0ZYX1JURkJyZWFrVHlwZSBtX2R3U3RhdHVzOwotICBpbnQzMl90IG1faVN0YXJ0UG9zOwotICBpbnQzMl90IG1faVdpZHRoOwotICBpbnQzMl90IG1faVN0YXJ0Q2hhcjsKLSAgaW50MzJfdCBtX2lDaGFyczsKLSAgaW50MzJfdCBtX2lCaWRpTGV2ZWw7Ci0gIGludDMyX3QgbV9pQmlkaVBvczsKLSAgaW50MzJfdCBtX2lGb250U2l6ZTsKLSAgaW50MzJfdCBtX2lGb250SGVpZ2h0OwotICBpbnQzMl90IG1faUhvcml6b250YWxTY2FsZTsKLSAgaW50MzJfdCBtX2lWZXJ0aWNhbFNjYWxlOwotICB1aW50MzJfdCBtX2R3SWRlbnRpdHk7Ci0gIHN0ZDo6dmVjdG9yPENGWF9SVEZDaGFyPiogbV9wQ2hhcnM7ICAvLyBub3Qgb3duZWQuCi0gIENGWF9SZXRhaW5QdHI8Q0ZYX1JldGFpbmFibGU+IG1fcFVzZXJEYXRhOwotfTsKLQotdHlwZWRlZiBDRlhfQmFzZUFycmF5VGVtcGxhdGU8Q0ZYX1JURlBpZWNlPiBDRlhfUlRGUGllY2VBcnJheTsKLQotY2xhc3MgQ0ZYX1JURkxpbmUgewotIHB1YmxpYzoKLSAgQ0ZYX1JURkxpbmUoKTsKLSAgfkNGWF9SVEZMaW5lKCk7Ci0KLSAgaW50MzJfdCBDb3VudENoYXJzKCkgY29uc3QgewotICAgIHJldHVybiBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fTGluZUNoYXJzKTsKLSAgfQotCi0gIENGWF9SVEZDaGFyJiBHZXRDaGFyKGludDMyX3QgaW5kZXgpIHsKLSAgICBBU1NFUlQoaW5kZXggPj0gMCAmJiBpbmRleCA8IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9MaW5lQ2hhcnMpKTsKLSAgICByZXR1cm4gbV9MaW5lQ2hhcnNbaW5kZXhdOwotICB9Ci0KLSAgaW50MzJfdCBHZXRMaW5lRW5kKCkgY29uc3QgeyByZXR1cm4gbV9pU3RhcnQgKyBtX2lXaWR0aDsgfQotICB2b2lkIFJlbW92ZUFsbChib29sIGJMZWF2ZU1lbW9yeSkgewotICAgIG1fTGluZUNoYXJzLmNsZWFyKCk7Ci0gICAgbV9MaW5lUGllY2VzLlJlbW92ZUFsbChiTGVhdmVNZW1vcnkpOwotICAgIG1faVdpZHRoID0gMDsKLSAgICBtX2lBcmFiaWNDaGFycyA9IDA7Ci0gICAgbV9pTUJDU0NoYXJzID0gMDsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPENGWF9SVEZDaGFyPiBtX0xpbmVDaGFyczsKLSAgQ0ZYX1JURlBpZWNlQXJyYXkgbV9MaW5lUGllY2VzOwotICBpbnQzMl90IG1faVN0YXJ0OwotICBpbnQzMl90IG1faVdpZHRoOwotICBpbnQzMl90IG1faUFyYWJpY0NoYXJzOwotICBpbnQzMl90IG1faU1CQ1NDaGFyczsKLX07Ci0KLWNsYXNzIENGWF9SVEZCcmVhayB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDRlhfUlRGQnJlYWsodWludDMyX3QgZHdMYXlvdXRTdHlsZXMpOwotICB+Q0ZYX1JURkJyZWFrKCk7Ci0KLSAgdm9pZCBTZXRMaW5lQm91bmRhcnkoRlhfRkxPQVQgZkxpbmVTdGFydCwgRlhfRkxPQVQgZkxpbmVFbmQpOwotICB2b2lkIFNldExpbmVTdGFydFBvcyhGWF9GTE9BVCBmTGluZVBvcyk7Ci0gIHZvaWQgU2V0Rm9udChjb25zdCBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4mIHBGb250KTsKLSAgdm9pZCBTZXRGb250U2l6ZShGWF9GTE9BVCBmRm9udFNpemUpOwotICB2b2lkIFNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCk7Ci0gIHZvaWQgU2V0TGluZUJyZWFrVG9sZXJhbmNlKEZYX0ZMT0FUIGZUb2xlcmFuY2UpOwotICB2b2lkIFNldEhvcml6b250YWxTY2FsZShpbnQzMl90IGlTY2FsZSk7Ci0gIHZvaWQgU2V0VmVydGljYWxTY2FsZShpbnQzMl90IGlTY2FsZSk7Ci0gIHZvaWQgU2V0Q2hhclNwYWNlKEZYX0ZMT0FUIGZDaGFyU3BhY2UpOwotICB2b2lkIFNldEFsaWdubWVudChDRlhfUlRGTGluZUFsaWdubWVudCBhbGlnbikgeyBtX2lBbGlnbm1lbnQgPSBhbGlnbjsgfQotICB2b2lkIFNldFVzZXJEYXRhKGNvbnN0IENGWF9SZXRhaW5QdHI8Q0ZYX1JldGFpbmFibGU+JiBwVXNlckRhdGEpOwotCi0gIHZvaWQgQWRkUG9zaXRpb25lZFRhYihGWF9GTE9BVCBmVGFiUG9zKTsKLQotICBDRlhfUlRGQnJlYWtUeXBlIEVuZEJyZWFrKENGWF9SVEZCcmVha1R5cGUgZHdTdGF0dXMpOwotICBpbnQzMl90IENvdW50QnJlYWtQaWVjZXMoKSBjb25zdDsKLSAgY29uc3QgQ0ZYX1JURlBpZWNlKiBHZXRCcmVha1BpZWNlKGludDMyX3QgaW5kZXgpIGNvbnN0OwotICB2b2lkIENsZWFyQnJlYWtQaWVjZXMoKTsKLQotICB2b2lkIFJlc2V0KCk7Ci0KLSAgaW50MzJfdCBHZXREaXNwbGF5UG9zKGNvbnN0IEZYX1JURlRFWFRPQkoqIHBUZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ2hhckNvZGUpIGNvbnN0OwotCi0gIENGWF9SVEZCcmVha1R5cGUgQXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpOwotICBDRlhfUlRGQnJlYWtUeXBlIEFwcGVuZENoYXJfQ29tYmluYXRpb24oQ0ZYX1JURkNoYXIqIHBDdXJDaGFyKTsKLSAgQ0ZYX1JURkJyZWFrVHlwZSBBcHBlbmRDaGFyX1RhYihDRlhfUlRGQ2hhciogcEN1ckNoYXIpOwotICBDRlhfUlRGQnJlYWtUeXBlIEFwcGVuZENoYXJfQ29udHJvbChDRlhfUlRGQ2hhciogcEN1ckNoYXIpOwotICBDRlhfUlRGQnJlYWtUeXBlIEFwcGVuZENoYXJfQXJhYmljKENGWF9SVEZDaGFyKiBwQ3VyQ2hhcik7Ci0gIENGWF9SVEZCcmVha1R5cGUgQXBwZW5kQ2hhcl9PdGhlcnMoQ0ZYX1JURkNoYXIqIHBDdXJDaGFyKTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgRm9udENoYW5nZWQoKTsKLSAgdm9pZCBTZXRCcmVha1N0YXR1cygpOwotICBDRlhfUlRGQ2hhciogR2V0TGFzdENoYXIoaW50MzJfdCBpbmRleCkgY29uc3Q7Ci0gIGNvbnN0IENGWF9SVEZMaW5lKiBHZXRSVEZMaW5lKCkgY29uc3Q7Ci0gIGNvbnN0IENGWF9SVEZQaWVjZUFycmF5KiBHZXRSVEZQaWVjZXMoKSBjb25zdDsKLSAgRlhfQ0hBUlRZUEUgR2V0VW5pZmllZENoYXJUeXBlKEZYX0NIQVJUWVBFIGNoYXJ0eXBlKSBjb25zdDsKLSAgaW50MzJfdCBHZXRMYXN0UG9zaXRpb25lZFRhYigpIGNvbnN0OwotICBib29sIEdldFBvc2l0aW9uZWRUYWIoaW50MzJfdCogaVRhYlBvcykgY29uc3Q7Ci0KLSAgaW50MzJfdCBHZXRCcmVha1BvcyhzdGQ6OnZlY3RvcjxDRlhfUlRGQ2hhcj4mIHRjYSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRW5kUG9zLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFsbENoYXJzLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk9ubHlCcmspOwotICB2b2lkIFNwbGl0VGV4dExpbmUoQ0ZYX1JURkxpbmUqIHBDdXJMaW5lLAotICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JURkxpbmUqIHBOZXh0TGluZSwKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFsbENoYXJzKTsKLSAgYm9vbCBFbmRCcmVha19TcGxpdExpbmUoQ0ZYX1JURkxpbmUqIHBOZXh0TGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWxsQ2hhcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SVEZCcmVha1R5cGUgZHdTdGF0dXMpOwotICB2b2lkIEVuZEJyZWFrX0JpZGlMaW5lKHN0ZDo6ZGVxdWU8RlhfVFBPPiogdHBvcywgQ0ZYX1JURkJyZWFrVHlwZSBkd1N0YXR1cyk7Ci0gIHZvaWQgRW5kQnJlYWtfQWxpZ25tZW50KGNvbnN0IHN0ZDo6ZGVxdWU8RlhfVFBPPiYgdHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWxsQ2hhcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SVEZCcmVha1R5cGUgZHdTdGF0dXMpOwotCi0gIGludDMyX3QgbV9pQm91bmRhcnlTdGFydDsKLSAgaW50MzJfdCBtX2lCb3VuZGFyeUVuZDsKLSAgdWludDMyX3QgbV9kd0xheW91dFN0eWxlczsKLSAgYm9vbCBtX2JQYWdpbmF0aW9uOwotICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gbV9wRm9udDsKLSAgaW50MzJfdCBtX2lGb250SGVpZ2h0OwotICBpbnQzMl90IG1faUZvbnRTaXplOwotICBpbnQzMl90IG1faVRhYldpZHRoOwotICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBtX1Bvc2l0aW9uZWRUYWJzOwotICBGWF9XQ0hBUiBtX3dEZWZDaGFyOwotICBpbnQzMl90IG1faURlZkNoYXI7Ci0gIEZYX1dDSEFSIG1fd0xpbmVCcmVha0NoYXI7Ci0gIGludDMyX3QgbV9pSG9yaXpvbnRhbFNjYWxlOwotICBpbnQzMl90IG1faVZlcnRpY2FsU2NhbGU7Ci0gIGludDMyX3QgbV9pQ2hhclNwYWNlOwotICBDRlhfUlRGTGluZUFsaWdubWVudCBtX2lBbGlnbm1lbnQ7Ci0gIENGWF9SZXRhaW5QdHI8Q0ZYX1JldGFpbmFibGU+IG1fcFVzZXJEYXRhOwotICBGWF9DSEFSVFlQRSBtX2VDaGFyVHlwZTsKLSAgdWludDMyX3QgbV9kd0lkZW50aXR5OwotICBDRlhfUlRGTGluZSBtX1JURkxpbmUxOwotICBDRlhfUlRGTGluZSBtX1JURkxpbmUyOwotICBDRlhfUlRGTGluZSogbV9wQ3VyTGluZTsKLSAgaW50MzJfdCBtX2lSZWFkeTsKLSAgaW50MzJfdCBtX2lUb2xlcmFuY2U7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GR0FTX0xBWU9VVF9GR0FTX1JURkJSRUFLX0hfCmRpZmYgLS1naXQgYS94ZmEvZmdhcy9sYXlvdXQvZmdhc190ZXh0YnJlYWsuY3BwIGIveGZhL2ZnYXMvbGF5b3V0L2ZnYXNfdGV4dGJyZWFrLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJlNzJmMi4uMDAwMDAwMAotLS0gYS94ZmEvZmdhcy9sYXlvdXQvZmdhc190ZXh0YnJlYWsuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTY2OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZmdhcy9sYXlvdXQvZmdhc190ZXh0YnJlYWsuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYXJhYmljLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9hcmIuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJ4ZmEvZmdhcy9mb250L2NmZ2FzX2dlZm9udC5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2xheW91dC9mZ2FzX2xpbmVicmVhay5oIgotCi1uYW1lc3BhY2UgewotCi10eXBlZGVmIHVpbnQzMl90IChDRlhfVHh0QnJlYWs6OipGWF9UeHRCcmVha19MUEZBcHBlbmRDaGFyKSgKLSAgICBDRlhfVHh0Q2hhciogcEN1ckNoYXIsCi0gICAgaW50MzJfdCBpUm90YXRpb24pOwotY29uc3QgRlhfVHh0QnJlYWtfTFBGQXBwZW5kQ2hhciBnX0ZYX1R4dEJyZWFrX2xwZkFwcGVuZENoYXJbMTZdID0gewotICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfT3RoZXJzLCAgICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfVGFiLAotICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfT3RoZXJzLCAgICAgICZDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfQ29udHJvbCwKLSAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0NvbWJpbmF0aW9uLCAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX090aGVycywKLSAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX090aGVycywgICAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywKLSAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywgICAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywKLSAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywgICAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywKLSAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX0FyYWJpYywgICAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX090aGVycywKLSAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX090aGVycywgICAgICAmQ0ZYX1R4dEJyZWFrOjpBcHBlbmRDaGFyX090aGVycywKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1DRlhfVHh0QnJlYWs6OkNGWF9UeHRCcmVhayh1aW50MzJfdCBkd1BvbGljaWVzKQotICAgIDogbV9kd1BvbGljaWVzKGR3UG9saWNpZXMpLAotICAgICAgbV9pTGluZVdpZHRoKDIwMDAwMDApLAotICAgICAgbV9kd0xheW91dFN0eWxlcygwKSwKLSAgICAgIG1fYlZlcnRpY2FsKGZhbHNlKSwKLSAgICAgIG1fYkFyYWJpY0NvbnRleHQoZmFsc2UpLAotICAgICAgbV9iQXJhYmljU2hhcGVzKGZhbHNlKSwKLSAgICAgIG1fYlJUTChmYWxzZSksCi0gICAgICBtX2JTaW5nbGVMaW5lKGZhbHNlKSwKLSAgICAgIG1fYkNvbWJUZXh0KGZhbHNlKSwKLSAgICAgIG1faUFyYWJpY0NvbnRleHQoMSksCi0gICAgICBtX2lDdXJBcmFiaWNDb250ZXh0KDEpLAotICAgICAgbV9wRm9udChudWxscHRyKSwKLSAgICAgIG1faUZvbnRTaXplKDI0MCksCi0gICAgICBtX2JFcXVpZGlzdGFudCh0cnVlKSwKLSAgICAgIG1faVRhYldpZHRoKDcyMDAwMCksCi0gICAgICBtX3dEZWZDaGFyKDB4RkVGRiksCi0gICAgICBtX3dQYXJhZ0JyZWFrQ2hhcihMJ1xuJyksCi0gICAgICBtX2lEZWZDaGFyKDApLAotICAgICAgbV9pTGluZVJvdGF0aW9uKDApLAotICAgICAgbV9pQ2hhclJvdGF0aW9uKDApLAotICAgICAgbV9pUm90YXRpb24oMCksCi0gICAgICBtX2lBbGlnbm1lbnQoRlhfVFhUTElORUFMSUdOTUVOVF9MZWZ0KSwKLSAgICAgIG1fZHdDb250ZXh0Q2hhclN0eWxlcygwKSwKLSAgICAgIG1faUNvbWJXaWR0aCgzNjAwMDApLAotICAgICAgbV9wVXNlckRhdGEobnVsbHB0ciksCi0gICAgICBtX2VDaGFyVHlwZShGWF9DSEFSVFlQRV9Vbmtub3duKSwKLSAgICAgIG1fYkFyYWJpY051bWJlcihmYWxzZSksCi0gICAgICBtX2JBcmFiaWNDb21tYShmYWxzZSksCi0gICAgICBtX3BDdXJMaW5lKG51bGxwdHIpLAotICAgICAgbV9pUmVhZHkoMCksCi0gICAgICBtX2lUb2xlcmFuY2UoMCksCi0gICAgICBtX2lIb3JTY2FsZSgxMDApLAotICAgICAgbV9pQ2hhclNwYWNlKDApIHsKLSAgbV9iUGFnaW5hdGlvbiA9IChtX2R3UG9saWNpZXMgJiBGWF9UWFRCUkVBS1BPTElDWV9QYWdpbmF0aW9uKSAhPSAwOwotICBpbnQzMl90IGlTaXplID0gbV9iUGFnaW5hdGlvbiA/IHNpemVvZihDRlhfQ2hhcikgOiBzaXplb2YoQ0ZYX1R4dENoYXIpOwotICBtX3BUeHRMaW5lMSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfVHh0TGluZT4oaVNpemUpOwotICBtX3BUeHRMaW5lMiA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfVHh0TGluZT4oaVNpemUpOwotICBtX3BDdXJMaW5lID0gbV9wVHh0TGluZTEuZ2V0KCk7Ci0gIFJlc2V0QXJhYmljQ29udGV4dCgpOwotfQotCi1DRlhfVHh0QnJlYWs6On5DRlhfVHh0QnJlYWsoKSB7Ci0gIFJlc2V0KCk7Ci19Ci0KLXZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRMaW5lV2lkdGgoRlhfRkxPQVQgZkxpbmVXaWR0aCkgewotICBtX2lMaW5lV2lkdGggPSBGWFNZU19yb3VuZChmTGluZVdpZHRoICogMjAwMDAuMGYpOwotICBBU1NFUlQobV9pTGluZVdpZHRoID49IDIwMDAwKTsKLX0KLQotdm9pZCBDRlhfVHh0QnJlYWs6OlNldExpbmVQb3MoRlhfRkxPQVQgZkxpbmVQb3MpIHsKLSAgaW50MzJfdCBpTGluZVBvcyA9Ci0gICAgICBzdGQ6Om1pbihzdGQ6Om1heChGWFNZU19yb3VuZChmTGluZVBvcyAqIDIwMDAwLjBmKSwgMCksIG1faUxpbmVXaWR0aCk7Ci0gIG1fcEN1ckxpbmUtPm1faVN0YXJ0ID0gaUxpbmVQb3M7Ci0gIG1fcEN1ckxpbmUtPm1faVdpZHRoICs9IGlMaW5lUG9zOwotfQotCi12b2lkIENGWF9UeHRCcmVhazo6U2V0TGF5b3V0U3R5bGVzKHVpbnQzMl90IGR3TGF5b3V0U3R5bGVzKSB7Ci0gIG1fZHdMYXlvdXRTdHlsZXMgPSBkd0xheW91dFN0eWxlczsKLSAgbV9iVmVydGljYWwgPSAobV9kd0xheW91dFN0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsQ2hhcnMpICE9IDA7Ci0gIG1fYkFyYWJpY0NvbnRleHQgPSAobV9kd0xheW91dFN0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX0FyYWJpY0NvbnRleHQpICE9IDA7Ci0gIG1fYkFyYWJpY1NoYXBlcyA9IChtX2R3TGF5b3V0U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfQXJhYmljU2hhcGVzKSAhPSAwOwotICBtX2JSVEwgPSAobV9kd0xheW91dFN0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX1JUTFJlYWRpbmdPcmRlcikgIT0gMDsKLSAgbV9iU2luZ2xlTGluZSA9IChtX2R3TGF5b3V0U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfU2luZ2xlTGluZSkgIT0gMDsKLSAgbV9iQ29tYlRleHQgPSAobV9kd0xheW91dFN0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX0NvbWJUZXh0KSAhPSAwOwotICBSZXNldEFyYWJpY0NvbnRleHQoKTsKLSAgbV9pTGluZVJvdGF0aW9uID0gR2V0TGluZVJvdGF0aW9uKG1fZHdMYXlvdXRTdHlsZXMpOwotICBtX2lSb3RhdGlvbiA9IG1faUxpbmVSb3RhdGlvbiArIG1faUNoYXJSb3RhdGlvbjsKLSAgbV9pUm90YXRpb24gJT0gNDsKLX0KLQotdm9pZCBDRlhfVHh0QnJlYWs6OlNldEZvbnQoY29uc3QgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+JiBwRm9udCkgewotICBpZiAoIXBGb250IHx8IHBGb250ID09IG1fcEZvbnQpCi0gICAgcmV0dXJuOwotCi0gIFNldEJyZWFrU3RhdHVzKCk7Ci0gIG1fcEZvbnQgPSBwRm9udDsKLSAgRm9udENoYW5nZWQoKTsKLX0KLQotdm9pZCBDRlhfVHh0QnJlYWs6OlNldEZvbnRTaXplKEZYX0ZMT0FUIGZGb250U2l6ZSkgewotICBpbnQzMl90IGlGb250U2l6ZSA9IEZYU1lTX3JvdW5kKGZGb250U2l6ZSAqIDIwLjBmKTsKLSAgaWYgKG1faUZvbnRTaXplID09IGlGb250U2l6ZSkKLSAgICByZXR1cm47Ci0KLSAgU2V0QnJlYWtTdGF0dXMoKTsKLSAgbV9pRm9udFNpemUgPSBpRm9udFNpemU7Ci0gIEZvbnRDaGFuZ2VkKCk7Ci19Ci0KLXZvaWQgQ0ZYX1R4dEJyZWFrOjpGb250Q2hhbmdlZCgpIHsKLSAgbV9pRGVmQ2hhciA9IDA7Ci0gIGlmIChtX3dEZWZDaGFyID09IDB4RkVGRiB8fCAhbV9wRm9udCkKLSAgICByZXR1cm47Ci0KLSAgbV9wRm9udC0+R2V0Q2hhcldpZHRoKG1fd0RlZkNoYXIsIG1faURlZkNoYXIsIGZhbHNlKTsKLSAgbV9pRGVmQ2hhciAqPSBtX2lGb250U2l6ZTsKLX0KLQotdm9pZCBDRlhfVHh0QnJlYWs6OlNldFRhYldpZHRoKEZYX0ZMT0FUIGZUYWJXaWR0aCwgYm9vbCBiRXF1aWRpc3RhbnQpIHsKLSAgbV9pVGFiV2lkdGggPSBGWFNZU19yb3VuZChmVGFiV2lkdGggKiAyMDAwMC4wZik7Ci0gIGlmIChtX2lUYWJXaWR0aCA8IEZYX1RYVEJSRUFLX01pbmltdW1UYWJXaWR0aCkKLSAgICBtX2lUYWJXaWR0aCA9IEZYX1RYVEJSRUFLX01pbmltdW1UYWJXaWR0aDsKLQotICBtX2JFcXVpZGlzdGFudCA9IGJFcXVpZGlzdGFudDsKLX0KLQotdm9pZCBDRlhfVHh0QnJlYWs6OlNldERlZmF1bHRDaGFyKEZYX1dDSEFSIHdjaCkgewotICBtX3dEZWZDaGFyID0gd2NoOwotICBtX2lEZWZDaGFyID0gMDsKLSAgaWYgKG1fd0RlZkNoYXIgPT0gMHhGRUZGIHx8ICFtX3BGb250KQotICAgIHJldHVybjsKLQotICBtX3BGb250LT5HZXRDaGFyV2lkdGgobV93RGVmQ2hhciwgbV9pRGVmQ2hhciwgZmFsc2UpOwotICBpZiAobV9pRGVmQ2hhciA8IDApCi0gICAgbV9pRGVmQ2hhciA9IDA7Ci0gIGVsc2UKLSAgICBtX2lEZWZDaGFyICo9IG1faUZvbnRTaXplOwotfQotCi12b2lkIENGWF9UeHRCcmVhazo6U2V0UGFyYWdyYXBoQnJlYWtDaGFyKEZYX1dDSEFSIHdjaCkgewotICBpZiAod2NoICE9IEwnXHInICYmIHdjaCAhPSBMJ1xuJykKLSAgICByZXR1cm47Ci0gIG1fd1BhcmFnQnJlYWtDaGFyID0gd2NoOwotfQotCi12b2lkIENGWF9UeHRCcmVhazo6U2V0TGluZUJyZWFrVG9sZXJhbmNlKEZYX0ZMT0FUIGZUb2xlcmFuY2UpIHsKLSAgbV9pVG9sZXJhbmNlID0gRlhTWVNfcm91bmQoZlRvbGVyYW5jZSAqIDIwMDAwLjBmKTsKLX0KLQotdm9pZCBDRlhfVHh0QnJlYWs6OlNldENoYXJSb3RhdGlvbihpbnQzMl90IGlDaGFyUm90YXRpb24pIHsKLSAgaWYgKGlDaGFyUm90YXRpb24gPCAwKQotICAgIGlDaGFyUm90YXRpb24gKz0gKC1pQ2hhclJvdGF0aW9uIC8gNCArIDEpICogNDsKLSAgZWxzZSBpZiAoaUNoYXJSb3RhdGlvbiA+IDMpCi0gICAgaUNoYXJSb3RhdGlvbiAtPSAoaUNoYXJSb3RhdGlvbiAvIDQpICogNDsKLQotICBpZiAobV9pQ2hhclJvdGF0aW9uID09IGlDaGFyUm90YXRpb24pCi0gICAgcmV0dXJuOwotCi0gIFNldEJyZWFrU3RhdHVzKCk7Ci0gIG1faUNoYXJSb3RhdGlvbiA9IGlDaGFyUm90YXRpb247Ci0gIG1faVJvdGF0aW9uID0gbV9pTGluZVJvdGF0aW9uICsgbV9pQ2hhclJvdGF0aW9uOwotICBtX2lSb3RhdGlvbiAlPSA0OwotfQotCi12b2lkIENGWF9UeHRCcmVhazo6U2V0QWxpZ25tZW50KGludDMyX3QgaUFsaWdubWVudCkgewotICBBU1NFUlQoaUFsaWdubWVudCA+PSBGWF9UWFRMSU5FQUxJR05NRU5UX0xlZnQgJiYKLSAgICAgICAgIGlBbGlnbm1lbnQgPD0gRlhfVFhUTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZCk7Ci0gIG1faUFsaWdubWVudCA9IGlBbGlnbm1lbnQ7Ci0gIFJlc2V0QXJhYmljQ29udGV4dCgpOwotfQotCi12b2lkIENGWF9UeHRCcmVhazo6UmVzZXRDb250ZXh0Q2hhclN0eWxlcygpIHsKLSAgbV9kd0NvbnRleHRDaGFyU3R5bGVzID0gbV9iQXJhYmljQ29udGV4dCA/IG1faUN1ckFsaWdubWVudCA6IG1faUFsaWdubWVudDsKLSAgaWYgKG1fYkFyYWJpY051bWJlcikKLSAgICBtX2R3Q29udGV4dENoYXJTdHlsZXMgfD0gRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY051bWJlcjsKLSAgaWYgKG1fYkFyYWJpY0NvbW1hKQotICAgIG1fZHdDb250ZXh0Q2hhclN0eWxlcyB8PSBGWF9UWFRDSEFSU1RZTEVfQXJhYmljQ29tbWE7Ci0gIGlmICgobV9iQXJhYmljQ29udGV4dCAmJiBtX2JDdXJSVEwpIHx8ICghbV9iQXJhYmljQ29udGV4dCAmJiBtX2JSVEwpKQotICAgIG1fZHdDb250ZXh0Q2hhclN0eWxlcyB8PSBGWF9UWFRDSEFSU1RZTEVfUlRMUmVhZGluZ09yZGVyOwotICBtX2R3Q29udGV4dENoYXJTdHlsZXMgfD0gKG1faUFyYWJpY0NvbnRleHQgPDwgOCk7Ci19Ci0KLXZvaWQgQ0ZYX1R4dEJyZWFrOjpTZXRDb21iV2lkdGgoRlhfRkxPQVQgZkNvbWJXaWR0aCkgewotICBtX2lDb21iV2lkdGggPSBGWFNZU19yb3VuZChmQ29tYldpZHRoICogMjAwMDAuMGYpOwotfQotCi12b2lkIENGWF9UeHRCcmVhazo6U2V0VXNlckRhdGEodm9pZCogcFVzZXJEYXRhKSB7Ci0gIGlmIChtX3BVc2VyRGF0YSA9PSBwVXNlckRhdGEpCi0gICAgcmV0dXJuOwotCi0gIFNldEJyZWFrU3RhdHVzKCk7Ci0gIG1fcFVzZXJEYXRhID0gcFVzZXJEYXRhOwotfQotCi12b2lkIENGWF9UeHRCcmVhazo6U2V0QnJlYWtTdGF0dXMoKSB7Ci0gIGlmIChtX2JQYWdpbmF0aW9uKQotICAgIHJldHVybjsKLQotICBpbnQzMl90IGlDb3VudCA9IG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsKLSAgaWYgKGlDb3VudCA8IDEpCi0gICAgcmV0dXJuOwotCi0gIENGWF9UeHRDaGFyKiBwVEMgPSBtX3BDdXJMaW5lLT5HZXRDaGFyUHRyKGlDb3VudCAtIDEpOwotICBpZiAocFRDLT5tX2R3U3RhdHVzID09IDApCi0gICAgcFRDLT5tX2R3U3RhdHVzID0gRlhfVFhUQlJFQUtfUGllY2VCcmVhazsKLX0KLQotdm9pZCBDRlhfVHh0QnJlYWs6OlNldEhvcml6b250YWxTY2FsZShpbnQzMl90IGlTY2FsZSkgewotICBpZiAoaVNjYWxlIDwgMCkKLSAgICBpU2NhbGUgPSAwOwotICBpZiAoaVNjYWxlID09IG1faUhvclNjYWxlKQotICAgIHJldHVybjsKLQotICBTZXRCcmVha1N0YXR1cygpOwotICBtX2lIb3JTY2FsZSA9IGlTY2FsZTsKLX0KLQotdm9pZCBDRlhfVHh0QnJlYWs6OlNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKSB7Ci0gIG1faUNoYXJTcGFjZSA9IEZYU1lTX3JvdW5kKGZDaGFyU3BhY2UgKiAyMDAwMC4wZik7Ci19Ci0KLXN0YXRpYyBjb25zdCBpbnQzMl90IGdzX0ZYX1R4dExpbmVSb3RhdGlvbnNbOF0gPSB7MCwgMywgMSwgMCwgMiwgMSwgMywgMn07Ci0KLWludDMyX3QgQ0ZYX1R4dEJyZWFrOjpHZXRMaW5lUm90YXRpb24odWludDMyX3QgZHdTdHlsZXMpIGNvbnN0IHsKLSAgcmV0dXJuIGdzX0ZYX1R4dExpbmVSb3RhdGlvbnNbKGR3U3R5bGVzICYgMHgwRSkgPj4gMV07Ci19Ci0KLUNGWF9UeHRDaGFyKiBDRlhfVHh0QnJlYWs6OkdldExhc3RDaGFyKGludDMyX3QgaW5kZXgsIGJvb2wgYk9taXRDaGFyKSBjb25zdCB7Ci0gIHN0ZDo6dmVjdG9yPENGWF9UeHRDaGFyPiYgY2EgPSAqbV9wQ3VyTGluZS0+bV9wTGluZUNoYXJzLmdldCgpOwotICBpbnQzMl90IGlDb3VudCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4oY2EpOwotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGlDb3VudCkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBpbnQzMl90IGlTdGFydCA9IGlDb3VudCAtIDE7Ci0gIHdoaWxlIChpU3RhcnQgPiAtMSkgewotICAgIENGWF9UeHRDaGFyKiBwVEMgPSAmY2FbaVN0YXJ0LS1dOwotICAgIGlmIChiT21pdENoYXIgJiYgcFRDLT5HZXRDaGFyVHlwZSgpID09IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKQotICAgICAgY29udGludWU7Ci0gICAgaWYgKC0taW5kZXggPCAwKQotICAgICAgcmV0dXJuIHBUQzsKLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotQ0ZYX1R4dExpbmUqIENGWF9UeHRCcmVhazo6R2V0VHh0TGluZSgpIGNvbnN0IHsKLSAgaWYgKG1faVJlYWR5ID09IDEpCi0gICAgcmV0dXJuIG1fcFR4dExpbmUxLmdldCgpOwotICBpZiAobV9pUmVhZHkgPT0gMikKLSAgICByZXR1cm4gbV9wVHh0TGluZTIuZ2V0KCk7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1DRlhfVHh0UGllY2VBcnJheSogQ0ZYX1R4dEJyZWFrOjpHZXRUeHRQaWVjZXMoKSBjb25zdCB7Ci0gIENGWF9UeHRMaW5lKiBwVHh0TGluZSA9IEdldFR4dExpbmUoKTsKLSAgcmV0dXJuIHBUeHRMaW5lID8gcFR4dExpbmUtPm1fcExpbmVQaWVjZXMuZ2V0KCkgOiBudWxscHRyOwotfQotCi1pbmxpbmUgRlhfQ0hBUlRZUEUgQ0ZYX1R4dEJyZWFrOjpHZXRVbmlmaWVkQ2hhclR5cGUoCi0gICAgRlhfQ0hBUlRZUEUgY2hhcnR5cGUpIGNvbnN0IHsKLSAgcmV0dXJuIGNoYXJ0eXBlID49IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYgPyBGWF9DSEFSVFlQRV9BcmFiaWMgOiBjaGFydHlwZTsKLX0KLQotdm9pZCBDRlhfVHh0QnJlYWs6OlJlc2V0QXJhYmljQ29udGV4dCgpIHsKLSAgaWYgKG1fYkFyYWJpY0NvbnRleHQpIHsKLSAgICBtX2JDdXJSVEwgPSBtX2lDdXJBcmFiaWNDb250ZXh0ID4gMTsKLSAgICBtX2lDdXJBbGlnbm1lbnQgPSBtX2lDdXJBcmFiaWNDb250ZXh0ID4gMSA/IEZYX1RYVExJTkVBTElHTk1FTlRfUmlnaHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZYX1RYVExJTkVBTElHTk1FTlRfTGVmdDsKLSAgICBtX2lDdXJBbGlnbm1lbnQgfD0gKG1faUFsaWdubWVudCAmIEZYX1RYVExJTkVBTElHTk1FTlRfSGlnaGVyTWFzayk7Ci0gICAgbV9iQXJhYmljTnVtYmVyID0gbV9pQXJhYmljQ29udGV4dCA+PSAxICYmIG1fYkFyYWJpY1NoYXBlczsKLSAgfSBlbHNlIHsKLSAgICBpZiAobV9iUGFnaW5hdGlvbikgewotICAgICAgbV9iQ3VyUlRMID0gZmFsc2U7Ci0gICAgICBtX2lDdXJBbGlnbm1lbnQgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICBtX2JDdXJSVEwgPSBtX2JSVEw7Ci0gICAgICBtX2lDdXJBbGlnbm1lbnQgPSBtX2lBbGlnbm1lbnQ7Ci0gICAgfQotICAgIGlmIChtX2JSVEwpCi0gICAgICBtX2JBcmFiaWNOdW1iZXIgPSBtX2lBcmFiaWNDb250ZXh0ID49IDE7Ci0gICAgZWxzZQotICAgICAgbV9iQXJhYmljTnVtYmVyID0gbV9pQXJhYmljQ29udGV4dCA+IDE7Ci0gICAgbV9iQXJhYmljTnVtYmVyID0gbV9iQXJhYmljTnVtYmVyICYmIG1fYkFyYWJpY1NoYXBlczsKLSAgfQotICBtX2JBcmFiaWNDb21tYSA9IG1fYkFyYWJpY051bWJlcjsKLSAgUmVzZXRDb250ZXh0Q2hhclN0eWxlcygpOwotfQotCi12b2lkIENGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9QYWdlTG9hZChDRlhfVHh0Q2hhciogcEN1ckNoYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1Byb3BzKSB7Ci0gIGlmICghbV9iUGFnaW5hdGlvbikgewotICAgIHBDdXJDaGFyLT5tX2R3U3RhdHVzID0gMDsKLSAgICBwQ3VyQ2hhci0+bV9wVXNlckRhdGEgPSBtX3BVc2VyRGF0YTsKLSAgfQotICBpZiAobV9iQXJhYmljQ29udGV4dCB8fCBtX2JBcmFiaWNTaGFwZXMpIHsKLSAgICBpbnQzMl90IGlCaWRpQ2xzID0gKGR3UHJvcHMgJiBGWF9CSURJQ0xBU1NCSVRTTUFTSykgPj4gRlhfQklESUNMQVNTQklUUzsKLSAgICBpbnQzMl90IGlBcmFiaWNDb250ZXh0ID0KLSAgICAgICAgKGlCaWRpQ2xzID09IEZYX0JJRElDTEFTU19SIHx8IGlCaWRpQ2xzID09IEZYX0JJRElDTEFTU19BTCkKLSAgICAgICAgICAgID8gMgotICAgICAgICAgICAgOiAoKGlCaWRpQ2xzID09IEZYX0JJRElDTEFTU19MIHx8IGlCaWRpQ2xzID09IEZYX0JJRElDTEFTU19TKSA/IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAxKTsKLSAgICBpZiAoaUFyYWJpY0NvbnRleHQgIT0gbV9pQXJhYmljQ29udGV4dCAmJiBpQXJhYmljQ29udGV4dCAhPSAxKSB7Ci0gICAgICBtX2lBcmFiaWNDb250ZXh0ID0gaUFyYWJpY0NvbnRleHQ7Ci0gICAgICBpZiAobV9pQ3VyQXJhYmljQ29udGV4dCA9PSAxKQotICAgICAgICBtX2lDdXJBcmFiaWNDb250ZXh0ID0gaUFyYWJpY0NvbnRleHQ7Ci0KLSAgICAgIFJlc2V0QXJhYmljQ29udGV4dCgpOwotICAgICAgaWYgKCFtX2JQYWdpbmF0aW9uKSB7Ci0gICAgICAgIENGWF9UeHRDaGFyKiBwTGFzdENoYXIgPSBHZXRMYXN0Q2hhcigxLCBmYWxzZSk7Ci0gICAgICAgIGlmIChwTGFzdENoYXIgJiYgcExhc3RDaGFyLT5tX2R3U3RhdHVzIDwgMSkKLSAgICAgICAgICBwTGFzdENoYXItPm1fZHdTdGF0dXMgPSBGWF9UWFRCUkVBS19QaWVjZUJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICBwQ3VyQ2hhci0+bV9kd0NoYXJTdHlsZXMgPSBtX2R3Q29udGV4dENoYXJTdHlsZXM7Ci19Ci0KLXVpbnQzMl90IENGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcl9Db21iaW5hdGlvbihDRlhfVHh0Q2hhciogcEN1ckNoYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRpb24pIHsKLSAgRlhfV0NIQVIgd2NoID0gcEN1ckNoYXItPm1fd0NoYXJDb2RlOwotICBGWF9XQ0hBUiB3Rm9ybTsKLSAgaW50MzJfdCBpQ2hhcldpZHRoID0gMDsKLSAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IC0xOwotICBpZiAobV9iQ29tYlRleHQpIHsKLSAgICBpQ2hhcldpZHRoID0gbV9pQ29tYldpZHRoOwotICB9IGVsc2UgewotICAgIGlmIChtX2JWZXJ0aWNhbCAhPSBGWF9Jc09kZChpUm90YXRpb24pKSB7Ci0gICAgICBpQ2hhcldpZHRoID0gMTAwMDsKLSAgICB9IGVsc2UgewotICAgICAgd0Zvcm0gPSB3Y2g7Ci0gICAgICBpZiAoIW1fYlBhZ2luYXRpb24pIHsKLSAgICAgICAgQ0ZYX1R4dENoYXIqIHBMYXN0Q2hhciA9IEdldExhc3RDaGFyKDAsIGZhbHNlKTsKLSAgICAgICAgaWYgKHBMYXN0Q2hhciAmJgotICAgICAgICAgICAgKHBMYXN0Q2hhci0+bV9kd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljU2hhZGRhKSA9PSAwKSB7Ci0gICAgICAgICAgYm9vbCBiU2hhZGRhID0gZmFsc2U7Ci0gICAgICAgICAgaWYgKHdjaCA9PSAweDA2NTEpIHsKLSAgICAgICAgICAgIEZYX1dDSEFSIHdMYXN0ID0gcExhc3RDaGFyLT5tX3dDaGFyQ29kZTsKLSAgICAgICAgICAgIGlmICh3TGFzdCA+PSAweDA2NEMgJiYgd0xhc3QgPD0gMHgwNjUwKSB7Ci0gICAgICAgICAgICAgIHdGb3JtID0gRlhfR2V0QXJhYmljRnJvbVNoYWRkYVRhYmxlKHdMYXN0KTsKLSAgICAgICAgICAgICAgYlNoYWRkYSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIGlmICh3Y2ggPj0gMHgwNjRDICYmIHdjaCA8PSAweDA2NTApIHsKLSAgICAgICAgICAgIGlmIChwTGFzdENoYXItPm1fd0NoYXJDb2RlID09IDB4MDY1MSkgewotICAgICAgICAgICAgICB3Rm9ybSA9IEZYX0dldEFyYWJpY0Zyb21TaGFkZGFUYWJsZSh3Y2gpOwotICAgICAgICAgICAgICBiU2hhZGRhID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGJTaGFkZGEpIHsKLSAgICAgICAgICAgIHBMYXN0Q2hhci0+bV9kd0NoYXJTdHlsZXMgfD0gRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY1NoYWRkYTsKLSAgICAgICAgICAgIHBMYXN0Q2hhci0+bV9pQ2hhcldpZHRoID0gMDsKLSAgICAgICAgICAgIHBDdXJDaGFyLT5tX2R3Q2hhclN0eWxlcyB8PSBGWF9UWFRDSEFSU1RZTEVfQXJhYmljU2hhZGRhOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKCFtX3BGb250LT5HZXRDaGFyV2lkdGgod0Zvcm0sIGlDaGFyV2lkdGgsIGZhbHNlKSkKLSAgICAgICAgaUNoYXJXaWR0aCA9IDA7Ci0gICAgfQotICAgIGlDaGFyV2lkdGggKj0gbV9pRm9udFNpemU7Ci0gICAgaUNoYXJXaWR0aCA9IGlDaGFyV2lkdGggKiBtX2lIb3JTY2FsZSAvIDEwMDsKLSAgfQotICBwQ3VyQ2hhci0+bV9pQ2hhcldpZHRoID0gLWlDaGFyV2lkdGg7Ci0gIHJldHVybiBGWF9UWFRCUkVBS19Ob25lOwotfQotCi11aW50MzJfdCBDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfVGFiKENGWF9UeHRDaGFyKiBwQ3VyQ2hhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRpb24pIHsKLSAgbV9lQ2hhclR5cGUgPSBGWF9DSEFSVFlQRV9UYWI7Ci0gIGlmICgobV9kd0xheW91dFN0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX0V4cGFuZFRhYikgPT0gMCkKLSAgICByZXR1cm4gRlhfVFhUQlJFQUtfTm9uZTsKLQotICBpbnQzMl90JiBpTGluZVdpZHRoID0gbV9wQ3VyTGluZS0+bV9pV2lkdGg7Ci0gIGludDMyX3QgaUNoYXJXaWR0aDsKLSAgaWYgKG1fYkNvbWJUZXh0KSB7Ci0gICAgaUNoYXJXaWR0aCA9IG1faUNvbWJXaWR0aDsKLSAgfSBlbHNlIHsKLSAgICBpZiAobV9iRXF1aWRpc3RhbnQpIHsKLSAgICAgIGlDaGFyV2lkdGggPSBpTGluZVdpZHRoOwotICAgICAgaUNoYXJXaWR0aCA9IG1faVRhYldpZHRoICogKGlDaGFyV2lkdGggLyBtX2lUYWJXaWR0aCArIDEpIC0gaUNoYXJXaWR0aDsKLSAgICAgIGlmIChpQ2hhcldpZHRoIDwgRlhfVFhUQlJFQUtfTWluaW11bVRhYldpZHRoKQotICAgICAgICBpQ2hhcldpZHRoICs9IG1faVRhYldpZHRoOwotICAgIH0gZWxzZSB7Ci0gICAgICBpQ2hhcldpZHRoID0gbV9pVGFiV2lkdGg7Ci0gICAgfQotICB9Ci0KLSAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IGlDaGFyV2lkdGg7Ci0gIGlMaW5lV2lkdGggKz0gaUNoYXJXaWR0aDsKLSAgaWYgKCFtX2JTaW5nbGVMaW5lICYmIGlMaW5lV2lkdGggPj0gbV9pTGluZVdpZHRoICsgbV9pVG9sZXJhbmNlKQotICAgIHJldHVybiBFbmRCcmVhayhGWF9UWFRCUkVBS19MaW5lQnJlYWspOwotCi0gIHJldHVybiBGWF9UWFRCUkVBS19Ob25lOwotfQotCi11aW50MzJfdCBDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfQ29udHJvbChDRlhfVHh0Q2hhciogcEN1ckNoYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSb3RhdGlvbikgewotICBtX2VDaGFyVHlwZSA9IEZYX0NIQVJUWVBFX0NvbnRyb2w7Ci0gIHVpbnQzMl90IGR3UmV0ID0gRlhfVFhUQlJFQUtfTm9uZTsKLSAgaWYgKCFtX2JTaW5nbGVMaW5lKSB7Ci0gICAgRlhfV0NIQVIgd2NoID0gcEN1ckNoYXItPm1fd0NoYXJDb2RlOwotICAgIHN3aXRjaCAod2NoKSB7Ci0gICAgICBjYXNlIEwnXHYnOgotICAgICAgY2FzZSAweDIwMjg6Ci0gICAgICAgIGR3UmV0ID0gRlhfVFhUQlJFQUtfTGluZUJyZWFrOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTCdcZic6Ci0gICAgICAgIGR3UmV0ID0gRlhfVFhUQlJFQUtfUGFnZUJyZWFrOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMHgyMDI5OgotICAgICAgICBkd1JldCA9IEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmICh3Y2ggPT0gbV93UGFyYWdCcmVha0NoYXIpCi0gICAgICAgICAgZHdSZXQgPSBGWF9UWFRCUkVBS19QYXJhZ3JhcGhCcmVhazsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChkd1JldCAhPSBGWF9UWFRCUkVBS19Ob25lKQotICAgICAgZHdSZXQgPSBFbmRCcmVhayhkd1JldCk7Ci0gIH0KLSAgcmV0dXJuIGR3UmV0OwotfQotCi11aW50MzJfdCBDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfQXJhYmljKENGWF9UeHRDaGFyKiBwQ3VyQ2hhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRpb24pIHsKLSAgRlhfQ0hBUlRZUEUgY2hhcnR5cGUgPSBwQ3VyQ2hhci0+R2V0Q2hhclR5cGUoKTsKLSAgaW50MzJfdCYgaUxpbmVXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOwotICBGWF9XQ0hBUiB3Rm9ybTsKLSAgaW50MzJfdCBpQ2hhcldpZHRoID0gMDsKLSAgQ0ZYX1R4dENoYXIqIHBMYXN0Q2hhciA9IG51bGxwdHI7Ci0gIGJvb2wgYkFsZWYgPSBmYWxzZTsKLSAgaWYgKCFtX2JDb21iVGV4dCAmJiBtX2VDaGFyVHlwZSA+PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmICYmCi0gICAgICBtX2VDaGFyVHlwZSA8PSBGWF9DSEFSVFlQRV9BcmFiaWNEaXN0b3J0aW9uKSB7Ci0gICAgcExhc3RDaGFyID0gR2V0TGFzdENoYXIoMSk7Ci0gICAgaWYgKHBMYXN0Q2hhcikgewotICAgICAgaUNoYXJXaWR0aCA9IHBMYXN0Q2hhci0+bV9pQ2hhcldpZHRoOwotICAgICAgaWYgKGlDaGFyV2lkdGggPiAwKQotICAgICAgICBpTGluZVdpZHRoIC09IGlDaGFyV2lkdGg7Ci0KLSAgICAgIENGWF9DaGFyKiBwUHJldkNoYXIgPSBHZXRMYXN0Q2hhcigyKTsKLSAgICAgIHdGb3JtID0gcGRmaXVtOjphcmFiaWM6OkdldEZvcm1DaGFyKHBMYXN0Q2hhciwgcFByZXZDaGFyLCBwQ3VyQ2hhcik7Ci0gICAgICBiQWxlZiA9ICh3Rm9ybSA9PSAweEZFRkYgJiYKLSAgICAgICAgICAgICAgIHBMYXN0Q2hhci0+R2V0Q2hhclR5cGUoKSA9PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmKTsKLSAgICAgIGludDMyX3QgaUxhc3RSb3RhdGlvbiA9IHBMYXN0Q2hhci0+bV9uUm90YXRpb24gKyBtX2lMaW5lUm90YXRpb247Ci0gICAgICBpZiAobV9iVmVydGljYWwgJiYgKHBMYXN0Q2hhci0+bV9kd0NoYXJQcm9wcyAmIDB4ODAwMCkgIT0gMCkKLSAgICAgICAgaUxhc3RSb3RhdGlvbisrOwotICAgICAgaWYgKG1fYlZlcnRpY2FsICE9IEZYX0lzT2RkKGlMYXN0Um90YXRpb24pKQotICAgICAgICBpQ2hhcldpZHRoID0gMTAwMDsKLSAgICAgIGVsc2UKLSAgICAgICAgbV9wRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpQ2hhcldpZHRoLCBmYWxzZSk7Ci0KLSAgICAgIGlmICh3Rm9ybSA9PSAweEZFRkYpCi0gICAgICAgIGlDaGFyV2lkdGggPSBtX2lEZWZDaGFyOwotCi0gICAgICBpQ2hhcldpZHRoICo9IG1faUZvbnRTaXplOwotICAgICAgaUNoYXJXaWR0aCA9IGlDaGFyV2lkdGggKiBtX2lIb3JTY2FsZSAvIDEwMDsKLSAgICAgIHBMYXN0Q2hhci0+bV9pQ2hhcldpZHRoID0gaUNoYXJXaWR0aDsKLSAgICAgIGlMaW5lV2lkdGggKz0gaUNoYXJXaWR0aDsKLSAgICAgIGlDaGFyV2lkdGggPSAwOwotICAgIH0KLSAgfQotCi0gIG1fZUNoYXJUeXBlID0gY2hhcnR5cGU7Ci0gIHdGb3JtID0gcGRmaXVtOjphcmFiaWM6OkdldEZvcm1DaGFyKHBDdXJDaGFyLCBiQWxlZiA/IG51bGxwdHIgOiBwTGFzdENoYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOwotICBpZiAobV9iQ29tYlRleHQpIHsKLSAgICBpQ2hhcldpZHRoID0gbV9pQ29tYldpZHRoOwotICB9IGVsc2UgewotICAgIGlmIChtX2JWZXJ0aWNhbCAhPSBGWF9Jc09kZChpUm90YXRpb24pKQotICAgICAgaUNoYXJXaWR0aCA9IDEwMDA7Ci0gICAgZWxzZQotICAgICAgbV9wRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpQ2hhcldpZHRoLCBmYWxzZSk7Ci0KLSAgICBpZiAod0Zvcm0gPT0gMHhGRUZGKQotICAgICAgaUNoYXJXaWR0aCA9IG1faURlZkNoYXI7Ci0KLSAgICBpQ2hhcldpZHRoICo9IG1faUZvbnRTaXplOwotICAgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yU2NhbGUgLyAxMDA7Ci0gIH0KLSAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IGlDaGFyV2lkdGg7Ci0gIGlMaW5lV2lkdGggKz0gaUNoYXJXaWR0aDsKLSAgbV9wQ3VyTGluZS0+bV9pQXJhYmljQ2hhcnMrKzsKLSAgaWYgKCFtX2JTaW5nbGVMaW5lICYmIGlMaW5lV2lkdGggPiBtX2lMaW5lV2lkdGggKyBtX2lUb2xlcmFuY2UpCi0gICAgcmV0dXJuIEVuZEJyZWFrKEZYX1RYVEJSRUFLX0xpbmVCcmVhayk7Ci0gIHJldHVybiBGWF9UWFRCUkVBS19Ob25lOwotfQotCi11aW50MzJfdCBDRlhfVHh0QnJlYWs6OkFwcGVuZENoYXJfT3RoZXJzKENGWF9UeHRDaGFyKiBwQ3VyQ2hhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRpb24pIHsKLSAgdWludDMyX3QgZHdQcm9wcyA9IHBDdXJDaGFyLT5tX2R3Q2hhclByb3BzOwotICBGWF9DSEFSVFlQRSBjaGFydHlwZSA9IHBDdXJDaGFyLT5HZXRDaGFyVHlwZSgpOwotICBpbnQzMl90JiBpTGluZVdpZHRoID0gbV9wQ3VyTGluZS0+bV9pV2lkdGg7Ci0gIGludDMyX3QgaUNoYXJXaWR0aCA9IDA7Ci0gIG1fZUNoYXJUeXBlID0gY2hhcnR5cGU7Ci0gIEZYX1dDSEFSIHdjaCA9IHBDdXJDaGFyLT5tX3dDaGFyQ29kZTsKLSAgRlhfV0NIQVIgd0Zvcm0gPSB3Y2g7Ci0gIGlmIChjaGFydHlwZSA9PSBGWF9DSEFSVFlQRV9OdW1lcmljKSB7Ci0gICAgaWYgKG1fYkFyYWJpY051bWJlcikgewotICAgICAgd0Zvcm0gPSB3Y2ggKyAweDA2MzA7Ci0gICAgICBwQ3VyQ2hhci0+bV9kd0NoYXJTdHlsZXMgfD0gRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY0luZGljOwotICAgIH0KLSAgfSBlbHNlIGlmICh3Y2ggPT0gTCcsJykgewotICAgIGlmIChtX2JBcmFiaWNTaGFwZXMgJiYgbV9pQ3VyQXJhYmljQ29udGV4dCA+IDApIHsKLSAgICAgIHdGb3JtID0gMHgwNjBDOwotICAgICAgcEN1ckNoYXItPm1fZHdDaGFyU3R5bGVzIHw9IEZYX1RYVENIQVJTVFlMRV9BcmFiaWNDb21tYTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAobV9iQ3VyUlRMIHx8IG1fYlZlcnRpY2FsKSB7Ci0gICAgd0Zvcm0gPSBGWF9HZXRNaXJyb3JDaGFyKHdjaCwgZHdQcm9wcywgbV9iQ3VyUlRMLCBtX2JWZXJ0aWNhbCk7Ci0gIH0KLQotICBpZiAobV9iQ29tYlRleHQpIHsKLSAgICBpQ2hhcldpZHRoID0gbV9pQ29tYldpZHRoOwotICB9IGVsc2UgewotICAgIGlmIChtX2JWZXJ0aWNhbCAhPSBGWF9Jc09kZChpUm90YXRpb24pKQotICAgICAgaUNoYXJXaWR0aCA9IDEwMDA7Ci0gICAgZWxzZSBpZiAoIW1fcEZvbnQtPkdldENoYXJXaWR0aCh3Rm9ybSwgaUNoYXJXaWR0aCwgZmFsc2UpKQotICAgICAgaUNoYXJXaWR0aCA9IG1faURlZkNoYXI7Ci0KLSAgICBpQ2hhcldpZHRoICo9IG1faUZvbnRTaXplOwotICAgIGlDaGFyV2lkdGggPSBpQ2hhcldpZHRoICogbV9pSG9yU2NhbGUgLyAxMDA7Ci0gIH0KLQotICBpQ2hhcldpZHRoICs9IG1faUNoYXJTcGFjZTsKLSAgcEN1ckNoYXItPm1faUNoYXJXaWR0aCA9IGlDaGFyV2lkdGg7Ci0gIGlMaW5lV2lkdGggKz0gaUNoYXJXaWR0aDsKLSAgYm9vbCBiQnJlYWsgPSAoY2hhcnR5cGUgIT0gRlhfQ0hBUlRZUEVfU3BhY2UgfHwKLSAgICAgICAgICAgICAgICAgKG1fZHdQb2xpY2llcyAmIEZYX1RYVEJSRUFLUE9MSUNZX1NwYWNlQnJlYWspICE9IDApOwotICBpZiAoIW1fYlNpbmdsZUxpbmUgJiYgYkJyZWFrICYmIGlMaW5lV2lkdGggPiBtX2lMaW5lV2lkdGggKyBtX2lUb2xlcmFuY2UpCi0gICAgcmV0dXJuIEVuZEJyZWFrKEZYX1RYVEJSRUFLX0xpbmVCcmVhayk7Ci0KLSAgcmV0dXJuIEZYX1RYVEJSRUFLX05vbmU7Ci19Ci0KLXVpbnQzMl90IENGWF9UeHRCcmVhazo6QXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpIHsKLSAgdWludDMyX3QgZHdQcm9wcyA9IGtUZXh0TGF5b3V0Q29kZVByb3BlcnRpZXNbc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHdjaCldOwotICBGWF9DSEFSVFlQRSBjaGFydHlwZSA9IEdldENoYXJUeXBlRnJvbVByb3AoZHdQcm9wcyk7Ci0gIG1fcEN1ckxpbmUtPm1fcExpbmVDaGFycy0+ZW1wbGFjZV9iYWNrKCk7Ci0KLSAgQ0ZYX1R4dENoYXIqIHBDdXJDaGFyID0gJm1fcEN1ckxpbmUtPm1fcExpbmVDaGFycy0+YmFjaygpOwotICBwQ3VyQ2hhci0+bV93Q2hhckNvZGUgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4od2NoKTsKLSAgcEN1ckNoYXItPm1fblJvdGF0aW9uID0gbV9pQ2hhclJvdGF0aW9uOwotICBwQ3VyQ2hhci0+bV9kd0NoYXJQcm9wcyA9IGR3UHJvcHM7Ci0gIHBDdXJDaGFyLT5tX2R3Q2hhclN0eWxlcyA9IDA7Ci0gIHBDdXJDaGFyLT5tX2lDaGFyV2lkdGggPSAwOwotICBwQ3VyQ2hhci0+bV9pSG9yaXpvbnRhbFNjYWxlID0gbV9pSG9yU2NhbGU7Ci0gIHBDdXJDaGFyLT5tX2lWZXJ0aWNhbFNjYWxlID0gMTAwOwotICBwQ3VyQ2hhci0+bV9kd1N0YXR1cyA9IDA7Ci0gIHBDdXJDaGFyLT5tX2lCaWRpQ2xhc3MgPSAwOwotICBwQ3VyQ2hhci0+bV9pQmlkaUxldmVsID0gMDsKLSAgcEN1ckNoYXItPm1faUJpZGlQb3MgPSAwOwotICBwQ3VyQ2hhci0+bV9pQmlkaU9yZGVyID0gMDsKLSAgcEN1ckNoYXItPm1fcFVzZXJEYXRhID0gbnVsbHB0cjsKLSAgQXBwZW5kQ2hhcl9QYWdlTG9hZChwQ3VyQ2hhciwgZHdQcm9wcyk7Ci0gIHVpbnQzMl90IGR3UmV0MSA9IEZYX1RYVEJSRUFLX05vbmU7Ci0gIGlmIChjaGFydHlwZSAhPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbiAmJgotICAgICAgR2V0VW5pZmllZENoYXJUeXBlKG1fZUNoYXJUeXBlKSAhPSBHZXRVbmlmaWVkQ2hhclR5cGUoY2hhcnR5cGUpICYmCi0gICAgICBtX2VDaGFyVHlwZSAhPSBGWF9DSEFSVFlQRV9Vbmtub3duICYmCi0gICAgICBtX3BDdXJMaW5lLT5tX2lXaWR0aCA+IG1faUxpbmVXaWR0aCArIG1faVRvbGVyYW5jZSAmJiAhbV9iU2luZ2xlTGluZSAmJgotICAgICAgKG1fZUNoYXJUeXBlICE9IEZYX0NIQVJUWVBFX1NwYWNlIHx8IGNoYXJ0eXBlICE9IEZYX0NIQVJUWVBFX0NvbnRyb2wpKSB7Ci0gICAgZHdSZXQxID0gRW5kQnJlYWsoRlhfVFhUQlJFQUtfTGluZUJyZWFrKTsKLSAgICBpbnQzMl90IGlDb3VudCA9IG1fcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsKLSAgICBpZiAoaUNvdW50ID4gMCkKLSAgICAgIHBDdXJDaGFyID0gJigqbV9wQ3VyTGluZS0+bV9wTGluZUNoYXJzKVtpQ291bnQgLSAxXTsKLSAgfQotCi0gIGludDMyX3QgaVJvdGF0aW9uID0gbV9pUm90YXRpb247Ci0gIGlmIChtX2JWZXJ0aWNhbCAmJiAoZHdQcm9wcyAmIDB4ODAwMCkgIT0gMCkKLSAgICBpUm90YXRpb24gPSAoaVJvdGF0aW9uICsgMSkgJSA0OwotCi0gIHVpbnQzMl90IGR3UmV0MiA9Ci0gICAgICAodGhpcy0+KmdfRlhfVHh0QnJlYWtfbHBmQXBwZW5kQ2hhcltjaGFydHlwZSA+PiBGWF9DSEFSVFlQRUJJVFNdKSgKLSAgICAgICAgICBwQ3VyQ2hhciwgaVJvdGF0aW9uKTsKLSAgcmV0dXJuIHN0ZDo6bWF4KGR3UmV0MSwgZHdSZXQyKTsKLX0KLQotdm9pZCBDRlhfVHh0QnJlYWs6OkVuZEJyZWFrX1VwZGF0ZUFyYWJpY1NoYXBlcygpIHsKLSAgQVNTRVJUKG1fYkFyYWJpY1NoYXBlcyk7Ci0gIGludDMyX3QgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOwotICBpZiAoaUNvdW50IDwgMikKLSAgICByZXR1cm47Ci0KLSAgaW50MzJfdCYgaUxpbmVXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOwotICBDRlhfVHh0Q2hhciogcEN1ciA9IG1fcEN1ckxpbmUtPkdldENoYXJQdHIoMCk7Ci0gIGJvb2wgYlByZXZOdW0gPSAocEN1ci0+bV9kd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljSW5kaWMpICE9IDA7Ci0gIHBDdXIgPSBtX3BDdXJMaW5lLT5HZXRDaGFyUHRyKDEpOwotICBGWF9XQ0hBUiB3Y2gsIHdGb3JtOwotICBib29sIGJOZXh0TnVtOwotICBpbnQzMl90IGkgPSAxOwotICBpbnQzMl90IGlDaGFyV2lkdGg7Ci0gIGludDMyX3QgaVJvdGF0aW9uOwotICBDRlhfVHh0Q2hhciogcE5leHQ7Ci0gIGRvIHsKLSAgICBpKys7Ci0gICAgaWYgKGkgPCBpQ291bnQpIHsKLSAgICAgIHBOZXh0ID0gbV9wQ3VyTGluZS0+R2V0Q2hhclB0cihpKTsKLSAgICAgIGJOZXh0TnVtID0gKHBOZXh0LT5tX2R3Q2hhclN0eWxlcyAmIEZYX1RYVENIQVJTVFlMRV9BcmFiaWNJbmRpYykgIT0gMDsKLSAgICB9IGVsc2UgewotICAgICAgcE5leHQgPSBudWxscHRyOwotICAgICAgYk5leHROdW0gPSBmYWxzZTsKLSAgICB9Ci0KLSAgICB3Y2ggPSBwQ3VyLT5tX3dDaGFyQ29kZTsKLSAgICBpZiAod2NoID09IEwnLicpIHsKLSAgICAgIGlmIChiUHJldk51bSAmJiBiTmV4dE51bSkgewotICAgICAgICBpUm90YXRpb24gPSBtX2lSb3RhdGlvbjsKLSAgICAgICAgaWYgKG1fYlZlcnRpY2FsICYmIChwQ3VyLT5tX2R3Q2hhclByb3BzICYgMHg4MDAwKSAhPSAwKQotICAgICAgICAgIGlSb3RhdGlvbiA9ICgoaVJvdGF0aW9uICsgMSkgJiAweDAzKTsKLQotICAgICAgICB3Rm9ybSA9IHdjaCA9PSBMJy4nID8gMHgwNjZCIDogMHgwNjZDOwotICAgICAgICBpTGluZVdpZHRoIC09IHBDdXItPm1faUNoYXJXaWR0aDsKLSAgICAgICAgaWYgKG1fYkNvbWJUZXh0KSB7Ci0gICAgICAgICAgaUNoYXJXaWR0aCA9IG1faUNvbWJXaWR0aDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAobV9iVmVydGljYWwgIT0gRlhfSXNPZGQoaVJvdGF0aW9uKSkKLSAgICAgICAgICAgIGlDaGFyV2lkdGggPSAxMDAwOwotICAgICAgICAgIGVsc2UgaWYgKCFtX3BGb250LT5HZXRDaGFyV2lkdGgod0Zvcm0sIGlDaGFyV2lkdGgsIGZhbHNlKSkKLSAgICAgICAgICAgIGlDaGFyV2lkdGggPSBtX2lEZWZDaGFyOwotCi0gICAgICAgICAgaUNoYXJXaWR0aCAqPSBtX2lGb250U2l6ZTsKLSAgICAgICAgICBpQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIG1faUhvclNjYWxlIC8gMTAwOwotICAgICAgICB9Ci0gICAgICAgIHBDdXItPm1faUNoYXJXaWR0aCA9IGlDaGFyV2lkdGg7Ci0gICAgICAgIGlMaW5lV2lkdGggKz0gaUNoYXJXaWR0aDsKLSAgICAgIH0KLSAgICB9Ci0gICAgYlByZXZOdW0gPSAocEN1ci0+bV9kd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfQXJhYmljSW5kaWMpICE9IDA7Ci0gICAgcEN1ciA9IHBOZXh0OwotICB9IHdoaWxlIChpIDwgaUNvdW50KTsKLX0KLQotYm9vbCBDRlhfVHh0QnJlYWs6OkVuZEJyZWFrX1NwbGl0TGluZShDRlhfVHh0TGluZSogcE5leHRMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJBbGxDaGFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGF0dXMpIHsKLSAgaW50MzJfdCBpQ291bnQgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCk7Ci0gIGJvb2wgYkRvbmUgPSBmYWxzZTsKLSAgQ0ZYX1R4dENoYXIqIHBUQzsKLSAgaWYgKCFtX2JTaW5nbGVMaW5lICYmIG1fcEN1ckxpbmUtPm1faVdpZHRoID4gbV9pTGluZVdpZHRoICsgbV9pVG9sZXJhbmNlKSB7Ci0gICAgcFRDID0gbV9wQ3VyTGluZS0+R2V0Q2hhclB0cihpQ291bnQgLSAxKTsKLSAgICBzd2l0Y2ggKHBUQy0+R2V0Q2hhclR5cGUoKSkgewotICAgICAgY2FzZSBGWF9DSEFSVFlQRV9UYWI6Ci0gICAgICBjYXNlIEZYX0NIQVJUWVBFX0NvbnRyb2w6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGWF9DSEFSVFlQRV9TcGFjZToKLSAgICAgICAgaWYgKChtX2R3UG9saWNpZXMgJiBGWF9UWFRCUkVBS1BPTElDWV9TcGFjZUJyZWFrKSAhPSAwKSB7Ci0gICAgICAgICAgU3BsaXRUZXh0TGluZShtX3BDdXJMaW5lLCBwTmV4dExpbmUsICFtX2JQYWdpbmF0aW9uICYmIGJBbGxDaGFycyk7Ci0gICAgICAgICAgYkRvbmUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgU3BsaXRUZXh0TGluZShtX3BDdXJMaW5lLCBwTmV4dExpbmUsICFtX2JQYWdpbmF0aW9uICYmIGJBbGxDaGFycyk7Ci0gICAgICAgIGJEb25lID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaUNvdW50ID0gbV9wQ3VyTGluZS0+Q291bnRDaGFycygpOwotICBDRlhfVHh0UGllY2VBcnJheSogcEN1clBpZWNlcyA9IG1fcEN1ckxpbmUtPm1fcExpbmVQaWVjZXMuZ2V0KCk7Ci0gIENGWF9UeHRQaWVjZSB0cDsKLSAgaWYgKG1fYlBhZ2luYXRpb24pIHsKLSAgICB0cC5tX2R3U3RhdHVzID0gZHdTdGF0dXM7Ci0gICAgdHAubV9pU3RhcnRQb3MgPSBtX3BDdXJMaW5lLT5tX2lTdGFydDsKLSAgICB0cC5tX2lXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOwotICAgIHRwLm1faVN0YXJ0Q2hhciA9IDA7Ci0gICAgdHAubV9pQ2hhcnMgPSBpQ291bnQ7Ci0gICAgdHAubV9wQ2hhcnMgPSBtX3BDdXJMaW5lLT5tX3BMaW5lQ2hhcnMuZ2V0KCk7Ci0gICAgdHAubV9wVXNlckRhdGEgPSBtX3BVc2VyRGF0YTsKLSAgICBwVEMgPSBtX3BDdXJMaW5lLT5HZXRDaGFyUHRyKDApOwotICAgIHRwLm1fZHdDaGFyU3R5bGVzID0gcFRDLT5tX2R3Q2hhclN0eWxlczsKLSAgICB0cC5tX2lIb3Jpem9udGFsU2NhbGUgPSBwVEMtPm1faUhvcml6b250YWxTY2FsZTsKLSAgICB0cC5tX2lWZXJ0aWNhbFNjYWxlID0gcFRDLT5tX2lWZXJ0aWNhbFNjYWxlOwotICAgIHBDdXJQaWVjZXMtPkFkZCh0cCk7Ci0gICAgbV9wQ3VyTGluZSA9IHBOZXh0TGluZTsKLSAgICBtX2VDaGFyVHlwZSA9IEZYX0NIQVJUWVBFX1Vua25vd247Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKGJBbGxDaGFycyAmJiAhYkRvbmUpIHsKLSAgICBpbnQzMl90IGlFbmRQb3MgPSBtX3BDdXJMaW5lLT5tX2lXaWR0aDsKLSAgICBHZXRCcmVha1BvcygqbV9wQ3VyTGluZS0+bV9wTGluZUNoYXJzLmdldCgpLCBpRW5kUG9zLCBiQWxsQ2hhcnMsIHRydWUpOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBDRlhfVHh0QnJlYWs6OkVuZEJyZWFrX0JpZGlMaW5lKHN0ZDo6ZGVxdWU8RlhfVFBPPiogdHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cykgewotICBDRlhfVHh0UGllY2UgdHA7Ci0gIEZYX1RQTyB0cG87Ci0gIENGWF9UeHRDaGFyKiBwVEM7Ci0gIGludDMyX3QgaTsKLSAgaW50MzJfdCBqOwotICBzdGQ6OnZlY3RvcjxDRlhfVHh0Q2hhcj4mIGNoYXJzID0gKm1fcEN1ckxpbmUtPm1fcExpbmVDaGFycy5nZXQoKTsKLSAgaW50MzJfdCBpQ291bnQgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCk7Ci0gIGJvb2wgYkRvbmUgPSAobV9wQ3VyTGluZS0+bV9pQXJhYmljQ2hhcnMgPiAwIHx8IG1fYkN1clJUTCk7Ci0gIGlmICghbV9iUGFnaW5hdGlvbiAmJiBiRG9uZSkgewotICAgIGludDMyX3QgaUJpZGlOdW0gPSAwOwotICAgIGZvciAoaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgewotICAgICAgcFRDID0gJmNoYXJzW2ldOwotICAgICAgcFRDLT5tX2lCaWRpUG9zID0gaTsKLSAgICAgIGlmIChwVEMtPkdldENoYXJUeXBlKCkgIT0gRlhfQ0hBUlRZUEVfQ29udHJvbCkKLSAgICAgICAgaUJpZGlOdW0gPSBpOwotICAgICAgaWYgKGkgPT0gMCkKLSAgICAgICAgcFRDLT5tX2lCaWRpTGV2ZWwgPSAxOwotICAgIH0KLSAgICBGWF9CaWRpTGluZShjaGFycywgaUJpZGlOdW0gKyAxLCBtX2JDdXJSVEwgPyAxIDogMCk7Ci0gIH0KLQotICBDRlhfVHh0UGllY2VBcnJheSogcEN1clBpZWNlcyA9IG1fcEN1ckxpbmUtPm1fcExpbmVQaWVjZXMuZ2V0KCk7Ci0gIGlmICghbV9iUGFnaW5hdGlvbiAmJgotICAgICAgKGJEb25lIHx8IChtX2R3TGF5b3V0U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfTXV0aXBsZUZvcm1hdCkgIT0gMCkpIHsKLSAgICB0cC5tX2R3U3RhdHVzID0gRlhfVFhUQlJFQUtfUGllY2VCcmVhazsKLSAgICB0cC5tX2lTdGFydFBvcyA9IG1fcEN1ckxpbmUtPm1faVN0YXJ0OwotICAgIHRwLm1fcENoYXJzID0gbV9wQ3VyTGluZS0+bV9wTGluZUNoYXJzLmdldCgpOwotICAgIGludDMyX3QgaUJpZGlMZXZlbCA9IC0xOwotICAgIGludDMyX3QgaUNoYXJXaWR0aDsKLSAgICBpID0gMDsKLSAgICBqID0gLTE7Ci0gICAgd2hpbGUgKGkgPCBpQ291bnQpIHsKLSAgICAgIHBUQyA9ICZjaGFyc1tpXTsKLSAgICAgIGlmIChpQmlkaUxldmVsIDwgMCkgewotICAgICAgICBpQmlkaUxldmVsID0gcFRDLT5tX2lCaWRpTGV2ZWw7Ci0gICAgICAgIHRwLm1faVdpZHRoID0gMDsKLSAgICAgICAgdHAubV9pQmlkaUxldmVsID0gaUJpZGlMZXZlbDsKLSAgICAgICAgdHAubV9pQmlkaVBvcyA9IHBUQy0+bV9pQmlkaU9yZGVyOwotICAgICAgICB0cC5tX2R3Q2hhclN0eWxlcyA9IHBUQy0+bV9kd0NoYXJTdHlsZXM7Ci0gICAgICAgIHRwLm1fcFVzZXJEYXRhID0gcFRDLT5tX3BVc2VyRGF0YTsKLSAgICAgICAgdHAubV9pSG9yaXpvbnRhbFNjYWxlID0gcFRDLT5tX2lIb3Jpem9udGFsU2NhbGU7Ci0gICAgICAgIHRwLm1faVZlcnRpY2FsU2NhbGUgPSBwVEMtPm1faVZlcnRpY2FsU2NhbGU7Ci0gICAgICAgIHRwLm1fZHdTdGF0dXMgPSBGWF9UWFRCUkVBS19QaWVjZUJyZWFrOwotICAgICAgfQotICAgICAgaWYgKGlCaWRpTGV2ZWwgIT0gcFRDLT5tX2lCaWRpTGV2ZWwgfHwgcFRDLT5tX2R3U3RhdHVzICE9IDApIHsKLSAgICAgICAgaWYgKGlCaWRpTGV2ZWwgPT0gcFRDLT5tX2lCaWRpTGV2ZWwpIHsKLSAgICAgICAgICB0cC5tX2R3U3RhdHVzID0gcFRDLT5tX2R3U3RhdHVzOwotICAgICAgICAgIGlDaGFyV2lkdGggPSBwVEMtPm1faUNoYXJXaWR0aDsKLSAgICAgICAgICBpZiAoaUNoYXJXaWR0aCA+IDApCi0gICAgICAgICAgICB0cC5tX2lXaWR0aCArPSBpQ2hhcldpZHRoOwotCi0gICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICAgIHRwLm1faUNoYXJzID0gaSAtIHRwLm1faVN0YXJ0Q2hhcjsKLSAgICAgICAgcEN1clBpZWNlcy0+QWRkKHRwKTsKLSAgICAgICAgdHAubV9pU3RhcnRQb3MgKz0gdHAubV9pV2lkdGg7Ci0gICAgICAgIHRwLm1faVN0YXJ0Q2hhciA9IGk7Ci0gICAgICAgIHRwby5pbmRleCA9ICsrajsKLSAgICAgICAgdHBvLnBvcyA9IHRwLm1faUJpZGlQb3M7Ci0gICAgICAgIHRwb3MtPnB1c2hfYmFjayh0cG8pOwotICAgICAgICBpQmlkaUxldmVsID0gLTE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpQ2hhcldpZHRoID0gcFRDLT5tX2lDaGFyV2lkdGg7Ci0gICAgICAgIGlmIChpQ2hhcldpZHRoID4gMCkKLSAgICAgICAgICB0cC5tX2lXaWR0aCArPSBpQ2hhcldpZHRoOwotCi0gICAgICAgIGkrKzsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGkgPiB0cC5tX2lTdGFydENoYXIpIHsKLSAgICAgIHRwLm1fZHdTdGF0dXMgPSBkd1N0YXR1czsKLSAgICAgIHRwLm1faUNoYXJzID0gaSAtIHRwLm1faVN0YXJ0Q2hhcjsKLSAgICAgIHBDdXJQaWVjZXMtPkFkZCh0cCk7Ci0gICAgICB0cG8uaW5kZXggPSArK2o7Ci0gICAgICB0cG8ucG9zID0gdHAubV9pQmlkaVBvczsKLSAgICAgIHRwb3MtPnB1c2hfYmFjayh0cG8pOwotICAgIH0KLSAgICBpZiAoaiA+IC0xKSB7Ci0gICAgICBpZiAoaiA+IDApIHsKLSAgICAgICAgc3RkOjpzb3J0KHRwb3MtPmJlZ2luKCksIHRwb3MtPmVuZCgpKTsKLSAgICAgICAgaW50MzJfdCBpU3RhcnRQb3MgPSAwOwotICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGo7IGkrKykgewotICAgICAgICAgIHRwbyA9ICgqdHBvcylbaV07Ci0gICAgICAgICAgQ0ZYX1R4dFBpZWNlJiB0dHAgPSBwQ3VyUGllY2VzLT5HZXRBdCh0cG8uaW5kZXgpOwotICAgICAgICAgIHR0cC5tX2lTdGFydFBvcyA9IGlTdGFydFBvczsKLSAgICAgICAgICBpU3RhcnRQb3MgKz0gdHRwLm1faVdpZHRoOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBDRlhfVHh0UGllY2UmIHR0cCA9IHBDdXJQaWVjZXMtPkdldEF0KGopOwotICAgICAgdHRwLm1fZHdTdGF0dXMgPSBkd1N0YXR1czsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdHAubV9kd1N0YXR1cyA9IGR3U3RhdHVzOwotICAgIHRwLm1faVN0YXJ0UG9zID0gbV9wQ3VyTGluZS0+bV9pU3RhcnQ7Ci0gICAgdHAubV9pV2lkdGggPSBtX3BDdXJMaW5lLT5tX2lXaWR0aDsKLSAgICB0cC5tX2lTdGFydENoYXIgPSAwOwotICAgIHRwLm1faUNoYXJzID0gaUNvdW50OwotICAgIHRwLm1fcENoYXJzID0gbV9wQ3VyTGluZS0+bV9wTGluZUNoYXJzLmdldCgpOwotICAgIHRwLm1fcFVzZXJEYXRhID0gbV9wVXNlckRhdGE7Ci0gICAgcFRDID0gJmNoYXJzWzBdOwotICAgIHRwLm1fZHdDaGFyU3R5bGVzID0gcFRDLT5tX2R3Q2hhclN0eWxlczsKLSAgICB0cC5tX2lIb3Jpem9udGFsU2NhbGUgPSBwVEMtPm1faUhvcml6b250YWxTY2FsZTsKLSAgICB0cC5tX2lWZXJ0aWNhbFNjYWxlID0gcFRDLT5tX2lWZXJ0aWNhbFNjYWxlOwotICAgIHBDdXJQaWVjZXMtPkFkZCh0cCk7Ci0gICAgdHBvcy0+cHVzaF9iYWNrKHswLCAwfSk7Ci0gIH0KLX0KLQotdm9pZCBDRlhfVHh0QnJlYWs6OkVuZEJyZWFrX0FsaWdubWVudChjb25zdCBzdGQ6OmRlcXVlPEZYX1RQTz4mIHRwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFsbENoYXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cykgewotICBpbnQzMl90IGlOZXRXaWR0aCA9IG1fcEN1ckxpbmUtPm1faVdpZHRoOwotICBpbnQzMl90IGlHYXBDaGFycyA9IDA7Ci0gIGludDMyX3QgaUNoYXJXaWR0aDsKLSAgQ0ZYX1R4dFBpZWNlQXJyYXkqIHBDdXJQaWVjZXMgPSBtX3BDdXJMaW5lLT5tX3BMaW5lUGllY2VzLmdldCgpOwotICBpbnQzMl90IGk7Ci0gIGludDMyX3QgajsKLSAgaW50MzJfdCBpQ291bnQgPSBwQ3VyUGllY2VzLT5HZXRTaXplKCk7Ci0gIGJvb2wgYkZpbmQgPSBmYWxzZTsKLSAgRlhfVFBPIHRwbzsKLSAgQ0ZYX1R4dENoYXIqIHBUQzsKLSAgRlhfQ0hBUlRZUEUgY2hhcnR5cGU7Ci0gIGZvciAoaSA9IGlDb3VudCAtIDE7IGkgPiAtMTsgaS0tKSB7Ci0gICAgdHBvID0gdHBvc1tpXTsKLSAgICBDRlhfVHh0UGllY2UmIHR0cCA9IHBDdXJQaWVjZXMtPkdldEF0KHRwby5pbmRleCk7Ci0gICAgaWYgKCFiRmluZCkKLSAgICAgIGlOZXRXaWR0aCA9IHR0cC5HZXRFbmRQb3MoKTsKLQotICAgIGJvb2wgYkFyYWJpYyA9IEZYX0lzT2RkKHR0cC5tX2lCaWRpTGV2ZWwpOwotICAgIGogPSBiQXJhYmljID8gMCA6IHR0cC5tX2lDaGFycyAtIDE7Ci0gICAgd2hpbGUgKGogPiAtMSAmJiBqIDwgdHRwLm1faUNoYXJzKSB7Ci0gICAgICBwVEMgPSB0dHAuR2V0Q2hhclB0cihqKTsKLSAgICAgIGlmIChwVEMtPm1fbkJyZWFrVHlwZSA9PSBGWF9MQlRfRElSRUNUX0JSSykKLSAgICAgICAgaUdhcENoYXJzKys7Ci0gICAgICBpZiAoIWJGaW5kIHx8ICFiQWxsQ2hhcnMpIHsKLSAgICAgICAgY2hhcnR5cGUgPSBwVEMtPkdldENoYXJUeXBlKCk7Ci0gICAgICAgIGlmIChjaGFydHlwZSA9PSBGWF9DSEFSVFlQRV9TcGFjZSB8fCBjaGFydHlwZSA9PSBGWF9DSEFSVFlQRV9Db250cm9sKSB7Ci0gICAgICAgICAgaWYgKCFiRmluZCkgewotICAgICAgICAgICAgaUNoYXJXaWR0aCA9IHBUQy0+bV9pQ2hhcldpZHRoOwotICAgICAgICAgICAgaWYgKGJBbGxDaGFycyAmJiBpQ2hhcldpZHRoID4gMCkKLSAgICAgICAgICAgICAgaU5ldFdpZHRoIC09IGlDaGFyV2lkdGg7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGJGaW5kID0gdHJ1ZTsKLSAgICAgICAgICBpZiAoIWJBbGxDaGFycykKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBqICs9IGJBcmFiaWMgPyAxIDogLTE7Ci0gICAgfQotICAgIGlmICghYkFsbENoYXJzICYmIGJGaW5kKQotICAgICAgYnJlYWs7Ci0gIH0KLQotICBpbnQzMl90IGlPZmZzZXQgPSBtX2lMaW5lV2lkdGggLSBpTmV0V2lkdGg7Ci0gIGludDMyX3QgaUxvd2VyQWxpZ25tZW50ID0gKG1faUN1ckFsaWdubWVudCAmIEZYX1RYVExJTkVBTElHTk1FTlRfTG93ZXJNYXNrKTsKLSAgaW50MzJfdCBpSGlnaGVyQWxpZ25tZW50ID0gKG1faUN1ckFsaWdubWVudCAmIEZYX1RYVExJTkVBTElHTk1FTlRfSGlnaGVyTWFzayk7Ci0gIGlmIChpR2FwQ2hhcnMgPiAwICYmIChpSGlnaGVyQWxpZ25tZW50ID09IEZYX1RYVExJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpSGlnaGVyQWxpZ25tZW50ID09IEZYX1RYVExJTkVBTElHTk1FTlRfSnVzdGlmaWVkICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgZHdTdGF0dXMgIT0gRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspKSkgewotICAgIGludDMyX3QgaVN0YXJ0ID0gLTE7Ci0gICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7Ci0gICAgICB0cG8gPSB0cG9zW2ldOwotICAgICAgQ0ZYX1R4dFBpZWNlJiB0dHAgPSBwQ3VyUGllY2VzLT5HZXRBdCh0cG8uaW5kZXgpOwotICAgICAgaWYgKGlTdGFydCA8IC0xKQotICAgICAgICBpU3RhcnQgPSB0dHAubV9pU3RhcnRQb3M7Ci0gICAgICBlbHNlCi0gICAgICAgIHR0cC5tX2lTdGFydFBvcyA9IGlTdGFydDsKLQotICAgICAgZm9yIChqID0gMDsgaiA8IHR0cC5tX2lDaGFyczsgaisrKSB7Ci0gICAgICAgIHBUQyA9IHR0cC5HZXRDaGFyUHRyKGopOwotICAgICAgICBpZiAocFRDLT5tX25CcmVha1R5cGUgIT0gRlhfTEJUX0RJUkVDVF9CUksgfHwgcFRDLT5tX2lDaGFyV2lkdGggPCAwKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGludDMyX3QgayA9IGlPZmZzZXQgLyBpR2FwQ2hhcnM7Ci0gICAgICAgIHBUQy0+bV9pQ2hhcldpZHRoICs9IGs7Ci0gICAgICAgIHR0cC5tX2lXaWR0aCArPSBrOwotICAgICAgICBpT2Zmc2V0IC09IGs7Ci0gICAgICAgIGlHYXBDaGFycy0tOwotICAgICAgICBpZiAoaUdhcENoYXJzIDwgMSkKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlTdGFydCArPSB0dHAubV9pV2lkdGg7Ci0gICAgfQotICB9IGVsc2UgaWYgKGlMb3dlckFsaWdubWVudCA+IEZYX1RYVExJTkVBTElHTk1FTlRfTGVmdCkgewotICAgIGlmIChpTG93ZXJBbGlnbm1lbnQgPT0gRlhfVFhUTElORUFMSUdOTUVOVF9DZW50ZXIpCi0gICAgICBpT2Zmc2V0IC89IDI7Ci0gICAgaWYgKGlPZmZzZXQgPiAwKSB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKLSAgICAgICAgQ0ZYX1R4dFBpZWNlJiB0dHAgPSBwQ3VyUGllY2VzLT5HZXRBdChpKTsKLSAgICAgICAgdHRwLm1faVN0YXJ0UG9zICs9IGlPZmZzZXQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXVpbnQzMl90IENGWF9UeHRCcmVhazo6RW5kQnJlYWsodWludDMyX3QgZHdTdGF0dXMpIHsKLSAgQVNTRVJUKGR3U3RhdHVzID49IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWsgJiYKLSAgICAgICAgIGR3U3RhdHVzIDw9IEZYX1RYVEJSRUFLX1BhZ2VCcmVhayk7Ci0gIENGWF9UeHRQaWVjZUFycmF5KiBwQ3VyUGllY2VzID0gbV9wQ3VyTGluZS0+bV9wTGluZVBpZWNlcy5nZXQoKTsKLSAgaW50MzJfdCBpQ291bnQgPSBwQ3VyUGllY2VzLT5HZXRTaXplKCk7Ci0gIGlmIChpQ291bnQgPiAwKSB7Ci0gICAgQ0ZYX1R4dFBpZWNlKiBwTGFzdFBpZWNlID0gcEN1clBpZWNlcy0+R2V0UHRyQXQoLS1pQ291bnQpOwotICAgIGlmIChkd1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspCi0gICAgICBwTGFzdFBpZWNlLT5tX2R3U3RhdHVzID0gZHdTdGF0dXM7Ci0gICAgZWxzZQotICAgICAgZHdTdGF0dXMgPSBwTGFzdFBpZWNlLT5tX2R3U3RhdHVzOwotICAgIHJldHVybiBkd1N0YXR1czsKLSAgfSBlbHNlIHsKLSAgICBDRlhfVHh0TGluZSogcExhc3RMaW5lID0gR2V0VHh0TGluZSgpOwotICAgIGlmIChwTGFzdExpbmUpIHsKLSAgICAgIHBDdXJQaWVjZXMgPSBwTGFzdExpbmUtPm1fcExpbmVQaWVjZXMuZ2V0KCk7Ci0gICAgICBpQ291bnQgPSBwQ3VyUGllY2VzLT5HZXRTaXplKCk7Ci0gICAgICBpZiAoaUNvdW50LS0gPiAwKSB7Ci0gICAgICAgIENGWF9UeHRQaWVjZSogcExhc3RQaWVjZSA9IHBDdXJQaWVjZXMtPkdldFB0ckF0KGlDb3VudCk7Ci0gICAgICAgIGlmIChkd1N0YXR1cyA+IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspCi0gICAgICAgICAgcExhc3RQaWVjZS0+bV9kd1N0YXR1cyA9IGR3U3RhdHVzOwotICAgICAgICBlbHNlCi0gICAgICAgICAgZHdTdGF0dXMgPSBwTGFzdFBpZWNlLT5tX2R3U3RhdHVzOwotICAgICAgICByZXR1cm4gZHdTdGF0dXM7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gRlhfVFhUQlJFQUtfTm9uZTsKLSAgICB9Ci0KLSAgICBpQ291bnQgPSBtX3BDdXJMaW5lLT5Db3VudENoYXJzKCk7Ci0gICAgaWYgKGlDb3VudCA8IDEpCi0gICAgICByZXR1cm4gRlhfVFhUQlJFQUtfTm9uZTsKLSAgICBpZiAoIW1fYlBhZ2luYXRpb24pIHsKLSAgICAgIENGWF9UeHRDaGFyKiBwVEMgPSBtX3BDdXJMaW5lLT5HZXRDaGFyUHRyKGlDb3VudCAtIDEpOwotICAgICAgcFRDLT5tX2R3U3RhdHVzID0gZHdTdGF0dXM7Ci0gICAgfQotICAgIGlmIChkd1N0YXR1cyA8PSBGWF9UWFRCUkVBS19QaWVjZUJyZWFrKQotICAgICAgcmV0dXJuIGR3U3RhdHVzOwotICB9Ci0KLSAgbV9pUmVhZHkgPSAobV9wQ3VyTGluZSA9PSBtX3BUeHRMaW5lMS5nZXQoKSkgPyAxIDogMjsKLSAgQ0ZYX1R4dExpbmUqIHBOZXh0TGluZSA9Ci0gICAgICAobV9wQ3VyTGluZSA9PSBtX3BUeHRMaW5lMS5nZXQoKSkgPyBtX3BUeHRMaW5lMi5nZXQoKSA6IG1fcFR4dExpbmUxLmdldCgpOwotICBib29sIGJBbGxDaGFycyA9IChtX2lDdXJBbGlnbm1lbnQgPiBGWF9UWFRMSU5FQUxJR05NRU5UX1JpZ2h0KTsKLSAgaWYgKG1fYkFyYWJpY1NoYXBlcykKLSAgICBFbmRCcmVha19VcGRhdGVBcmFiaWNTaGFwZXMoKTsKLQotICBpZiAoIUVuZEJyZWFrX1NwbGl0TGluZShwTmV4dExpbmUsIGJBbGxDaGFycywgZHdTdGF0dXMpKSB7Ci0gICAgc3RkOjpkZXF1ZTxGWF9UUE8+IHRwb3M7Ci0gICAgRW5kQnJlYWtfQmlkaUxpbmUoJnRwb3MsIGR3U3RhdHVzKTsKLSAgICBpZiAoIW1fYlBhZ2luYXRpb24gJiYgbV9pQ3VyQWxpZ25tZW50ID4gRlhfVFhUTElORUFMSUdOTUVOVF9MZWZ0KQotICAgICAgRW5kQnJlYWtfQWxpZ25tZW50KHRwb3MsIGJBbGxDaGFycywgZHdTdGF0dXMpOwotICB9Ci0KLSAgbV9wQ3VyTGluZSA9IHBOZXh0TGluZTsKLSAgQ0ZYX0NoYXIqIHBUQyA9IEdldExhc3RDaGFyKDAsIGZhbHNlKTsKLSAgbV9lQ2hhclR5cGUgPSBwVEMgPyBwVEMtPkdldENoYXJUeXBlKCkgOiBGWF9DSEFSVFlQRV9Vbmtub3duOwotICBpZiAoZHdTdGF0dXMgPT0gRlhfVFhUQlJFQUtfUGFyYWdyYXBoQnJlYWspIHsKLSAgICBtX2lBcmFiaWNDb250ZXh0ID0gbV9pQ3VyQXJhYmljQ29udGV4dCA9IDE7Ci0gICAgUmVzZXRBcmFiaWNDb250ZXh0KCk7Ci0gIH0KLSAgcmV0dXJuIGR3U3RhdHVzOwotfQotCi1pbnQzMl90IENGWF9UeHRCcmVhazo6R2V0QnJlYWtQb3Moc3RkOjp2ZWN0b3I8Q0ZYX1R4dENoYXI+JiBjYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRW5kUG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFsbENoYXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk9ubHlCcmspIHsKLSAgaW50MzJfdCBpTGVuZ3RoID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihjYSkgLSAxOwotICBpZiAoaUxlbmd0aCA8IDEpCi0gICAgcmV0dXJuIGlMZW5ndGg7Ci0KLSAgaW50MzJfdCBpQnJlYWsgPSAtMTsKLSAgaW50MzJfdCBpQnJlYWtQb3MgPSAtMTsKLSAgaW50MzJfdCBpSW5kaXJlY3QgPSAtMTsKLSAgaW50MzJfdCBpSW5kaXJlY3RQb3MgPSAtMTsKLSAgaW50MzJfdCBpTGFzdCA9IC0xOwotICBpbnQzMl90IGlMYXN0UG9zID0gLTE7Ci0gIGlmIChtX2JTaW5nbGVMaW5lIHx8IGlFbmRQb3MgPD0gbV9pTGluZVdpZHRoKSB7Ci0gICAgaWYgKCFiQWxsQ2hhcnMpCi0gICAgICByZXR1cm4gaUxlbmd0aDsKLQotICAgIGlCcmVhayA9IGlMZW5ndGg7Ci0gICAgaUJyZWFrUG9zID0gaUVuZFBvczsKLSAgfQotCi0gIGJvb2wgYlNwYWNlQnJlYWsgPSAobV9kd1BvbGljaWVzICYgRlhfVFhUQlJFQUtQT0xJQ1lfU3BhY2VCcmVhaykgIT0gMDsKLSAgYm9vbCBiTnVtYmVyQnJlYWsgPSAobV9kd1BvbGljaWVzICYgRlhfVFhUQlJFQUtQT0xJQ1lfTnVtYmVyQnJlYWspICE9IDA7Ci0gIEZYX0xJTkVCUkVBS1RZUEUgZVR5cGU7Ci0gIHVpbnQzMl90IG5Db2RlUHJvcDsKLSAgdWludDMyX3QgbkN1cjsKLSAgdWludDMyX3Qgbk5leHQ7Ci0gIENGWF9DaGFyKiBwQ3VyID0gJmNhW2lMZW5ndGgtLV07Ci0gIGlmIChiQWxsQ2hhcnMpCi0gICAgcEN1ci0+bV9uQnJlYWtUeXBlID0gRlhfTEJUX1VOS05PV047Ci0KLSAgbkNvZGVQcm9wID0gcEN1ci0+bV9kd0NoYXJQcm9wczsKLSAgbk5leHQgPSBuQ29kZVByb3AgJiAweDAwM0Y7Ci0gIGludDMyX3QgaUNoYXJXaWR0aCA9IHBDdXItPm1faUNoYXJXaWR0aDsKLSAgaWYgKGlDaGFyV2lkdGggPiAwKQotICAgIGlFbmRQb3MgLT0gaUNoYXJXaWR0aDsKLQotICB3aGlsZSAoaUxlbmd0aCA+PSAwKSB7Ci0gICAgcEN1ciA9ICZjYVtpTGVuZ3RoXTsKLSAgICBuQ29kZVByb3AgPSBwQ3VyLT5tX2R3Q2hhclByb3BzOwotICAgIG5DdXIgPSBuQ29kZVByb3AgJiAweDAwM0Y7Ci0gICAgaWYgKG5DdXIgPT0gRlhfQ0JQX1NQKSB7Ci0gICAgICBpZiAobk5leHQgPT0gRlhfQ0JQX1NQKQotICAgICAgICBlVHlwZSA9IGJTcGFjZUJyZWFrID8gRlhfTEJUX0RJUkVDVF9CUksgOiBGWF9MQlRfUFJPSElCSVRFRF9CUks7Ci0gICAgICBlbHNlCi0gICAgICAgIGVUeXBlID0gZ3NfRlhfTGluZUJyZWFrX1BhaXJUYWJsZVtuQ3VyXVtuTmV4dF07Ci0gICAgfSBlbHNlIGlmIChiTnVtYmVyQnJlYWsgJiYgbkN1ciA9PSBGWF9DQlBfTlUgJiYgbk5leHQgPT0gRlhfQ0JQX05VKSB7Ci0gICAgICBlVHlwZSA9IEZYX0xCVF9ESVJFQ1RfQlJLOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAobk5leHQgPT0gRlhfQ0JQX1NQKQotICAgICAgICBlVHlwZSA9IEZYX0xCVF9QUk9ISUJJVEVEX0JSSzsKLSAgICAgIGVsc2UKLSAgICAgICAgZVR5cGUgPSBnc19GWF9MaW5lQnJlYWtfUGFpclRhYmxlW25DdXJdW25OZXh0XTsKLSAgICB9Ci0gICAgaWYgKGJBbGxDaGFycykKLSAgICAgIHBDdXItPm1fbkJyZWFrVHlwZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGVUeXBlKTsKLSAgICBpZiAoIWJPbmx5QnJrKSB7Ci0gICAgICBpZiAobV9iU2luZ2xlTGluZSB8fCBpRW5kUG9zIDw9IG1faUxpbmVXaWR0aCB8fAotICAgICAgICAgIChuQ3VyID09IEZYX0NCUF9TUCAmJiAhYlNwYWNlQnJlYWspKSB7Ci0gICAgICAgIGlmIChlVHlwZSA9PSBGWF9MQlRfRElSRUNUX0JSSyAmJiBpQnJlYWsgPCAwKSB7Ci0gICAgICAgICAgaUJyZWFrID0gaUxlbmd0aDsKLSAgICAgICAgICBpQnJlYWtQb3MgPSBpRW5kUG9zOwotICAgICAgICAgIGlmICghYkFsbENoYXJzKQotICAgICAgICAgICAgcmV0dXJuIGlMZW5ndGg7Ci0gICAgICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gRlhfTEJUX0lORElSRUNUX0JSSyAmJiBpSW5kaXJlY3QgPCAwKSB7Ci0gICAgICAgICAgaUluZGlyZWN0ID0gaUxlbmd0aDsKLSAgICAgICAgICBpSW5kaXJlY3RQb3MgPSBpRW5kUG9zOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpTGFzdCA8IDApIHsKLSAgICAgICAgICBpTGFzdCA9IGlMZW5ndGg7Ci0gICAgICAgICAgaUxhc3RQb3MgPSBpRW5kUG9zOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpQ2hhcldpZHRoID0gcEN1ci0+bV9pQ2hhcldpZHRoOwotICAgICAgaWYgKGlDaGFyV2lkdGggPiAwKQotICAgICAgICBpRW5kUG9zIC09IGlDaGFyV2lkdGg7Ci0gICAgfQotICAgIG5OZXh0ID0gbkNvZGVQcm9wICYgMHgwMDNGOwotICAgIGlMZW5ndGgtLTsKLSAgfQotICBpZiAoYk9ubHlCcmspCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChpQnJlYWsgPiAtMSkgewotICAgIGlFbmRQb3MgPSBpQnJlYWtQb3M7Ci0gICAgcmV0dXJuIGlCcmVhazsKLSAgfQotICBpZiAoaUluZGlyZWN0ID4gLTEpIHsKLSAgICBpRW5kUG9zID0gaUluZGlyZWN0UG9zOwotICAgIHJldHVybiBpSW5kaXJlY3Q7Ci0gIH0KLSAgaWYgKGlMYXN0ID4gLTEpIHsKLSAgICBpRW5kUG9zID0gaUxhc3RQb3M7Ci0gICAgcmV0dXJuIGlMYXN0OwotICB9Ci0gIHJldHVybiAwOwotfQotCi12b2lkIENGWF9UeHRCcmVhazo6U3BsaXRUZXh0TGluZShDRlhfVHh0TGluZSogcEN1ckxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfVHh0TGluZSogcE5leHRMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWxsQ2hhcnMpIHsKLSAgQVNTRVJUKHBDdXJMaW5lICYmIHBOZXh0TGluZSk7Ci0gIGludDMyX3QgaUNvdW50ID0gcEN1ckxpbmUtPkNvdW50Q2hhcnMoKTsKLSAgaWYgKGlDb3VudCA8IDIpCi0gICAgcmV0dXJuOwotCi0gIGludDMyX3QgaUVuZFBvcyA9IHBDdXJMaW5lLT5tX2lXaWR0aDsKLSAgc3RkOjp2ZWN0b3I8Q0ZYX1R4dENoYXI+JiBjdXJDaGFycyA9ICpwQ3VyTGluZS0+bV9wTGluZUNoYXJzOwotICBpbnQzMl90IGlDaGFyUG9zID0gR2V0QnJlYWtQb3MoY3VyQ2hhcnMsIGlFbmRQb3MsIGJBbGxDaGFycywgZmFsc2UpOwotICBpZiAoaUNoYXJQb3MgPCAwKQotICAgIGlDaGFyUG9zID0gMDsKLQotICBpQ2hhclBvcysrOwotICBpZiAoaUNoYXJQb3MgPj0gaUNvdW50KSB7Ci0gICAgcE5leHRMaW5lLT5SZW1vdmVBbGwodHJ1ZSk7Ci0gICAgQ0ZYX0NoYXIqIHBUQyA9ICZjdXJDaGFyc1tpQ2hhclBvcyAtIDFdOwotICAgIHBUQy0+bV9uQnJlYWtUeXBlID0gRlhfTEJUX1VOS05PV047Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gbV9wTGluZUNoYXJzIGlzIGEgdW5pcXVlX3B0cjx2ZWN0b3I+LiBBc3NpZ24gdGhlIHJlZiBpbnRvIG5leHRDaGFycwotICAvLyBzbyB3ZSBjYW4gY2hhbmdlIHRoZSBtX3BMaW5lQ2hhcnMgdmVjdG9yIC4uLgotICBzdGQ6OnZlY3RvcjxDRlhfVHh0Q2hhcj4mIG5leHRDaGFycyA9ICpwTmV4dExpbmUtPm1fcExpbmVDaGFyczsKLSAgbmV4dENoYXJzID0KLSAgICAgIHN0ZDo6dmVjdG9yPENGWF9UeHRDaGFyPihjdXJDaGFycy5iZWdpbigpICsgaUNoYXJQb3MsIGN1ckNoYXJzLmVuZCgpKTsKLSAgY3VyQ2hhcnMuZXJhc2UoY3VyQ2hhcnMuYmVnaW4oKSArIGlDaGFyUG9zLCBjdXJDaGFycy5lbmQoKSk7Ci0gIHBDdXJMaW5lLT5tX2lXaWR0aCA9IGlFbmRQb3M7Ci0gIENGWF9UeHRDaGFyKiBwVEMgPSAmY3VyQ2hhcnNbaUNoYXJQb3MgLSAxXTsKLSAgcFRDLT5tX25CcmVha1R5cGUgPSBGWF9MQlRfVU5LTk9XTjsKLSAgaUNvdW50ID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQ+KG5leHRDaGFycyk7Ci0gIGludDMyX3QgaVdpZHRoID0gMDsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKLSAgICBpZiAobmV4dENoYXJzW2ldLkdldENoYXJUeXBlKCkgPj0gRlhfQ0hBUlRZUEVfQXJhYmljQWxlZikgewotICAgICAgcEN1ckxpbmUtPm1faUFyYWJpY0NoYXJzLS07Ci0gICAgICBwTmV4dExpbmUtPm1faUFyYWJpY0NoYXJzKys7Ci0gICAgfQotICAgIGludDMyX3QgaUNoYXJXaWR0aCA9IG5leHRDaGFyc1tpXS5tX2lDaGFyV2lkdGg7Ci0gICAgaWYgKGlDaGFyV2lkdGggPiAwKQotICAgICAgaVdpZHRoICs9IGlDaGFyV2lkdGg7Ci0gICAgaWYgKG1fYlBhZ2luYXRpb24pCi0gICAgICBjb250aW51ZTsKLQotICAgIG5leHRDaGFyc1tpXS5tX2R3U3RhdHVzID0gMDsKLSAgfQotICBwTmV4dExpbmUtPm1faVdpZHRoID0gaVdpZHRoOwotfQotCi1pbnQzMl90IENGWF9UeHRCcmVhazo6Q291bnRCcmVha1BpZWNlcygpIGNvbnN0IHsKLSAgQ0ZYX1R4dFBpZWNlQXJyYXkqIHBUeHRQaWVjZXMgPSBHZXRUeHRQaWVjZXMoKTsKLSAgcmV0dXJuIHBUeHRQaWVjZXMgPyBwVHh0UGllY2VzLT5HZXRTaXplKCkgOiAwOwotfQotCi1jb25zdCBDRlhfVHh0UGllY2UqIENGWF9UeHRCcmVhazo6R2V0QnJlYWtQaWVjZShpbnQzMl90IGluZGV4KSBjb25zdCB7Ci0gIENGWF9UeHRQaWVjZUFycmF5KiBwVHh0UGllY2VzID0gR2V0VHh0UGllY2VzKCk7Ci0gIGlmICghcFR4dFBpZWNlcykKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBwVHh0UGllY2VzLT5HZXRTaXplKCkpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIHJldHVybiBwVHh0UGllY2VzLT5HZXRQdHJBdChpbmRleCk7Ci19Ci0KLXZvaWQgQ0ZYX1R4dEJyZWFrOjpDbGVhckJyZWFrUGllY2VzKCkgewotICBDRlhfVHh0TGluZSogcFR4dExpbmUgPSBHZXRUeHRMaW5lKCk7Ci0gIGlmIChwVHh0TGluZSkKLSAgICBwVHh0TGluZS0+UmVtb3ZlQWxsKHRydWUpOwotICBtX2lSZWFkeSA9IDA7Ci19Ci0KLXZvaWQgQ0ZYX1R4dEJyZWFrOjpSZXNldCgpIHsKLSAgbV9lQ2hhclR5cGUgPSBGWF9DSEFSVFlQRV9Vbmtub3duOwotICBtX2lBcmFiaWNDb250ZXh0ID0gMTsKLSAgbV9pQ3VyQXJhYmljQ29udGV4dCA9IDE7Ci0gIFJlc2V0QXJhYmljQ29udGV4dCgpOwotICBtX3BUeHRMaW5lMS0+UmVtb3ZlQWxsKHRydWUpOwotICBtX3BUeHRMaW5lMi0+UmVtb3ZlQWxsKHRydWUpOwotfQotCi1zdHJ1Y3QgRlhfRk9STUNIQVIgewotICB1aW50MTZfdCB3Y2g7Ci0gIHVpbnQxNl90IHdGb3JtOwotICBpbnQzMl90IGlXaWR0aDsKLX07Ci0KLWludDMyX3QgQ0ZYX1R4dEJyZWFrOjpHZXREaXNwbGF5UG9zKGNvbnN0IEZYX1RYVFJVTiogcFR4dFJ1biwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNoYXJDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcqIHBXU0Zvcm1zKSBjb25zdCB7Ci0gIGlmICghcFR4dFJ1biB8fCBwVHh0UnVuLT5pTGVuZ3RoIDwgMSkKLSAgICByZXR1cm4gMDsKLQotICBJRlhfVHh0QWNjZXNzKiBwQWNjZXNzID0gcFR4dFJ1bi0+cEFjY2VzczsKLSAgY29uc3QgRkRFX1RFWFRFRElUUElFQ0UqIHBJZGVudGl0eSA9IHBUeHRSdW4tPnBJZGVudGl0eTsKLSAgY29uc3QgRlhfV0NIQVIqIHBTdHIgPSBwVHh0UnVuLT53c1N0ci5jX3N0cigpOwotICBpbnQzMl90KiBwV2lkdGhzID0gcFR4dFJ1bi0+cFdpZHRoczsKLSAgaW50MzJfdCBpTGVuZ3RoID0gcFR4dFJ1bi0+aUxlbmd0aCAtIDE7Ci0gIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBwRm9udCA9IHBUeHRSdW4tPnBGb250OwotICB1aW50MzJfdCBkd1N0eWxlcyA9IHBUeHRSdW4tPmR3U3R5bGVzOwotICBDRlhfUmVjdEYgcnRUZXh0KCpwVHh0UnVuLT5wUmVjdCk7Ci0gIGJvb2wgYlJUTFBpZWNlID0gKHBUeHRSdW4tPmR3Q2hhclN0eWxlcyAmIEZYX1RYVENIQVJTVFlMRV9PZGRCaWRpTGV2ZWwpICE9IDA7Ci0gIGJvb2wgYkFyYWJpY051bWJlciA9Ci0gICAgICAocFR4dFJ1bi0+ZHdDaGFyU3R5bGVzICYgRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY051bWJlcikgIT0gMDsKLSAgYm9vbCBiQXJhYmljQ29tbWEgPQotICAgICAgKHBUeHRSdW4tPmR3Q2hhclN0eWxlcyAmIEZYX1RYVENIQVJTVFlMRV9BcmFiaWNDb21tYSkgIT0gMDsKLSAgRlhfRkxPQVQgZkZvbnRTaXplID0gcFR4dFJ1bi0+ZkZvbnRTaXplOwotICBpbnQzMl90IGlGb250U2l6ZSA9IEZYU1lTX3JvdW5kKGZGb250U2l6ZSAqIDIwLjBmKTsKLSAgaW50MzJfdCBpQXNjZW50ID0gcEZvbnQtPkdldEFzY2VudCgpOwotICBpbnQzMl90IGlEZXNjZW50ID0gcEZvbnQtPkdldERlc2NlbnQoKTsKLSAgaW50MzJfdCBpTWF4SGVpZ2h0ID0gaUFzY2VudCAtIGlEZXNjZW50OwotICBGWF9GTE9BVCBmRm9udEhlaWdodCA9IGZGb250U2l6ZTsKLSAgRlhfRkxPQVQgZkFzY2VudCA9IGZGb250SGVpZ2h0ICogKEZYX0ZMT0FUKWlBc2NlbnQgLyAoRlhfRkxPQVQpaU1heEhlaWdodDsKLSAgRlhfRkxPQVQgZkRlc2NlbnQgPSBmRm9udEhlaWdodCAqIChGWF9GTE9BVClpRGVzY2VudCAvIChGWF9GTE9BVClpTWF4SGVpZ2h0OwotICBib29sIGJWZXJ0aWNhbERvYyA9IChkd1N0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsTGF5b3V0KSAhPSAwOwotICBib29sIGJWZXJ0aWNhbENoYXIgPSAoZHdTdHlsZXMgJiBGWF9UWFRMQVlPVVRTVFlMRV9WZXJ0aWNhbENoYXJzKSAhPSAwOwotICBpbnQzMl90IGlSb3RhdGlvbiA9IEdldExpbmVSb3RhdGlvbihkd1N0eWxlcykgKyBwVHh0UnVuLT5pQ2hhclJvdGF0aW9uOwotICBGWF9GTE9BVCBmWCA9IHJ0VGV4dC5sZWZ0OwotICBGWF9GTE9BVCBmWTsKLSAgRlhfRkxPQVQgZkNoYXJXaWR0aDsKLSAgRlhfRkxPQVQgZkNoYXJIZWlnaHQ7Ci0gIGludDMyX3QgaUhvclNjYWxlID0gcFR4dFJ1bi0+aUhvcml6b250YWxTY2FsZTsKLSAgaW50MzJfdCBpVmVyU2NhbGUgPSBwVHh0UnVuLT5pVmVydGljYWxTY2FsZTsKLSAgYm9vbCBiU2tpcFNwYWNlID0gcFR4dFJ1bi0+YlNraXBTcGFjZTsKLSAgRlhfRk9STUNIQVIgZm9ybUNoYXJzWzNdOwotICBGWF9GTE9BVCBmWUJhc2U7Ci0KLSAgaWYgKGJWZXJ0aWNhbERvYykgewotICAgIGZYICs9IChydFRleHQud2lkdGggLSBmRm9udFNpemUpIC8gMi4wZjsKLSAgICBmWUJhc2UgPSBiUlRMUGllY2UgPyBydFRleHQuYm90dG9tKCkgOiBydFRleHQudG9wOwotICAgIGZZID0gZllCYXNlOwotICB9IGVsc2UgewotICAgIGlmIChiUlRMUGllY2UpCi0gICAgICBmWCA9IHJ0VGV4dC5yaWdodCgpOwotCi0gICAgZllCYXNlID0gcnRUZXh0LnRvcCArIChydFRleHQuaGVpZ2h0IC0gZkZvbnRTaXplKSAvIDIuMGY7Ci0gICAgZlkgPSBmWUJhc2UgKyBmQXNjZW50OwotICB9Ci0KLSAgaW50MzJfdCBpQ291bnQgPSAwOwotICBpbnQzMl90IGlOZXh0ID0gMDsKLSAgRlhfV0NIQVIgd1ByZXYgPSAweEZFRkY7Ci0gIEZYX1dDSEFSIHdOZXh0ID0gMHhGRUZGOwotICBGWF9XQ0hBUiB3Rm9ybSA9IDB4RkVGRjsKLSAgRlhfV0NIQVIgd0xhc3QgPSAweEZFRkY7Ci0gIGJvb2wgYlNoYWRkYSA9IGZhbHNlOwotICBib29sIGJMYW0gPSBmYWxzZTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDw9IGlMZW5ndGg7IGkrKykgewotICAgIGludDMyX3QgaVdpZHRoOwotICAgIEZYX1dDSEFSIHdjaDsKLSAgICBpZiAocEFjY2VzcykgewotICAgICAgd2NoID0gcEFjY2Vzcy0+R2V0Q2hhcihwSWRlbnRpdHksIGkpOwotICAgICAgaVdpZHRoID0gcEFjY2Vzcy0+R2V0V2lkdGgocElkZW50aXR5LCBpKTsKLSAgICB9IGVsc2UgewotICAgICAgd2NoID0gKnBTdHIrKzsKLSAgICAgIGlXaWR0aCA9ICpwV2lkdGhzKys7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZHdQcm9wcyA9IEZYX0dldFVuaWNvZGVQcm9wZXJ0aWVzKHdjaCk7Ci0gICAgRlhfQ0hBUlRZUEUgY2hhcnR5cGUgPSBHZXRDaGFyVHlwZUZyb21Qcm9wKGR3UHJvcHMpOwotICAgIGlmIChjaGFydHlwZSA9PSBGWF9DSEFSVFlQRV9BcmFiaWNBbGVmICYmIGlXaWR0aCA9PSAwKSB7Ci0gICAgICB3UHJldiA9IDB4RkVGRjsKLSAgICAgIHdMYXN0ID0gd2NoOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgaWYgKGNoYXJ0eXBlID49IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpIHsKLSAgICAgIGlmIChpIDwgaUxlbmd0aCkgewotICAgICAgICBpZiAocEFjY2VzcykgewotICAgICAgICAgIGlOZXh0ID0gaSArIDE7Ci0gICAgICAgICAgd2hpbGUgKGlOZXh0IDw9IGlMZW5ndGgpIHsKLSAgICAgICAgICAgIHdOZXh0ID0gcEFjY2Vzcy0+R2V0Q2hhcihwSWRlbnRpdHksIGlOZXh0KTsKLSAgICAgICAgICAgIGR3UHJvcHMgPSBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3TmV4dCk7Ci0gICAgICAgICAgICBpZiAoKGR3UHJvcHMgJiBGWF9DSEFSVFlQRUJJVFNNQVNLKSAhPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIGlOZXh0Kys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChpTmV4dCA+IGlMZW5ndGgpCi0gICAgICAgICAgICB3TmV4dCA9IDB4RkVGRjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpbnQzMl90IGogPSAtMTsKLSAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICBqKys7Ci0gICAgICAgICAgICBpZiAoaSArIGogPj0gaUxlbmd0aCkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgIHdOZXh0ID0gcFN0cltqXTsKLSAgICAgICAgICAgIGR3UHJvcHMgPSBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3TmV4dCk7Ci0gICAgICAgICAgfSB3aGlsZSAoKGR3UHJvcHMgJiBGWF9DSEFSVFlQRUJJVFNNQVNLKSA9PSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbik7Ci0gICAgICAgICAgaWYgKGkgKyBqID49IGlMZW5ndGgpCi0gICAgICAgICAgICB3TmV4dCA9IDB4RkVGRjsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgd05leHQgPSAweEZFRkY7Ci0gICAgICB9Ci0KLSAgICAgIHdGb3JtID0gcGRmaXVtOjphcmFiaWM6OkdldEZvcm1DaGFyKHdjaCwgd1ByZXYsIHdOZXh0KTsKLSAgICAgIGJMYW0gPSAod1ByZXYgPT0gMHgwNjQ0ICYmIHdjaCA9PSAweDA2NDQgJiYgd05leHQgPT0gMHgwNjQ3KTsKLSAgICB9IGVsc2UgaWYgKGNoYXJ0eXBlID09IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKSB7Ci0gICAgICB3Rm9ybSA9IHdjaDsKLSAgICAgIGlmICh3Y2ggPj0gMHgwNjRDICYmIHdjaCA8PSAweDA2NTEpIHsKLSAgICAgICAgaWYgKGJTaGFkZGEpIHsKLSAgICAgICAgICB3Rm9ybSA9IDB4RkVGRjsKLSAgICAgICAgICBiU2hhZGRhID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgd05leHQgPSAweEZFRkY7Ci0gICAgICAgICAgaWYgKHBBY2Nlc3MpIHsKLSAgICAgICAgICAgIGlOZXh0ID0gaSArIDE7Ci0gICAgICAgICAgICBpZiAoaU5leHQgPD0gaUxlbmd0aCkKLSAgICAgICAgICAgICAgd05leHQgPSBwQWNjZXNzLT5HZXRDaGFyKHBJZGVudGl0eSwgaU5leHQpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoaSA8IGlMZW5ndGgpCi0gICAgICAgICAgICAgIHdOZXh0ID0gKnBTdHI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICh3Y2ggPT0gMHgwNjUxKSB7Ci0gICAgICAgICAgICBpZiAod05leHQgPj0gMHgwNjRDICYmIHdOZXh0IDw9IDB4MDY1MCkgewotICAgICAgICAgICAgICB3Rm9ybSA9IEZYX0dldEFyYWJpY0Zyb21TaGFkZGFUYWJsZSh3TmV4dCk7Ci0gICAgICAgICAgICAgIGJTaGFkZGEgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAod05leHQgPT0gMHgwNjUxKSB7Ci0gICAgICAgICAgICAgIHdGb3JtID0gRlhfR2V0QXJhYmljRnJvbVNoYWRkYVRhYmxlKHdjaCk7Ci0gICAgICAgICAgICAgIGJTaGFkZGEgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYlNoYWRkYSA9IGZhbHNlOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoY2hhcnR5cGUgPT0gRlhfQ0hBUlRZUEVfTnVtZXJpYykgewotICAgICAgd0Zvcm0gPSB3Y2g7Ci0gICAgICBpZiAoYkFyYWJpY051bWJlcikKLSAgICAgICAgd0Zvcm0gKz0gMHgwNjMwOwotICAgIH0gZWxzZSBpZiAod2NoID09IEwnLicpIHsKLSAgICAgIHdGb3JtID0gd2NoOwotICAgICAgaWYgKGJBcmFiaWNOdW1iZXIpIHsKLSAgICAgICAgd05leHQgPSAweEZFRkY7Ci0gICAgICAgIGlmIChwQWNjZXNzKSB7Ci0gICAgICAgICAgaU5leHQgPSBpICsgMTsKLSAgICAgICAgICBpZiAoaU5leHQgPD0gaUxlbmd0aCkKLSAgICAgICAgICAgIHdOZXh0ID0gcEFjY2Vzcy0+R2V0Q2hhcihwSWRlbnRpdHksIGlOZXh0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoaSA8IGlMZW5ndGgpCi0gICAgICAgICAgICB3TmV4dCA9ICpwU3RyOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3TmV4dCA+PSBMJzAnICYmIHdOZXh0IDw9IEwnOScpCi0gICAgICAgICAgd0Zvcm0gPSAweDA2NkI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh3Y2ggPT0gTCcsJykgewotICAgICAgd0Zvcm0gPSB3Y2g7Ci0gICAgICBpZiAoYkFyYWJpY0NvbW1hKQotICAgICAgICB3Rm9ybSA9IDB4MDYwQzsKLSAgICB9IGVsc2UgaWYgKGJSVExQaWVjZSB8fCBiVmVydGljYWxDaGFyKSB7Ci0gICAgICB3Rm9ybSA9IEZYX0dldE1pcnJvckNoYXIod2NoLCBkd1Byb3BzLCBiUlRMUGllY2UsIGJWZXJ0aWNhbENoYXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICB3Rm9ybSA9IHdjaDsKLSAgICB9Ci0gICAgaWYgKGNoYXJ0eXBlICE9IEZYX0NIQVJUWVBFX0NvbWJpbmF0aW9uKQotICAgICAgYlNoYWRkYSA9IGZhbHNlOwotICAgIGlmIChjaGFydHlwZSA8IEZYX0NIQVJUWVBFX0FyYWJpY0FsZWYpCi0gICAgICBiTGFtID0gZmFsc2U7Ci0KLSAgICBkd1Byb3BzID0gRlhfR2V0VW5pY29kZVByb3BlcnRpZXMod0Zvcm0pOwotICAgIGludDMyX3QgaUNoYXJSb3RhdGlvbiA9IGlSb3RhdGlvbjsKLSAgICBpZiAoYlZlcnRpY2FsQ2hhciAmJiAoZHdQcm9wcyAmIDB4ODAwMCkgIT0gMCkKLSAgICAgIGlDaGFyUm90YXRpb24rKzsKLQotICAgIGlDaGFyUm90YXRpb24gJT0gNDsKLSAgICBib29sIGJFbXB0eUNoYXIgPQotICAgICAgICAoY2hhcnR5cGUgPj0gRlhfQ0hBUlRZUEVfVGFiICYmIGNoYXJ0eXBlIDw9IEZYX0NIQVJUWVBFX0NvbnRyb2wpOwotICAgIGlmICh3Rm9ybSA9PSAweEZFRkYpCi0gICAgICBiRW1wdHlDaGFyID0gdHJ1ZTsKLQotICAgIGludDMyX3QgaUZvcm1zID0gYkxhbSA/IDMgOiAxOwotICAgIGlDb3VudCArPSAoYkVtcHR5Q2hhciAmJiBiU2tpcFNwYWNlKSA/IDAgOiBpRm9ybXM7Ci0gICAgaWYgKCFwQ2hhclBvcykgewotICAgICAgaWYgKGlXaWR0aCA+IDApCi0gICAgICAgIHdQcmV2ID0gd2NoOwotICAgICAgd0xhc3QgPSB3Y2g7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGlDaGFyV2lkdGggPSBpV2lkdGg7Ci0gICAgaWYgKGlDaGFyV2lkdGggPCAwKQotICAgICAgaUNoYXJXaWR0aCA9IC1pQ2hhcldpZHRoOwotCi0gICAgaUNoYXJXaWR0aCAvPSBpRm9udFNpemU7Ci0gICAgZm9ybUNoYXJzWzBdLndjaCA9IHdjaDsKLSAgICBmb3JtQ2hhcnNbMF0ud0Zvcm0gPSB3Rm9ybTsKLSAgICBmb3JtQ2hhcnNbMF0uaVdpZHRoID0gaUNoYXJXaWR0aDsKLSAgICBpZiAoYkxhbSkgewotICAgICAgZm9ybUNoYXJzWzFdLndGb3JtID0gMHgwNjUxOwotICAgICAgaUNoYXJXaWR0aCA9IDA7Ci0gICAgICBwRm9udC0+R2V0Q2hhcldpZHRoKDB4MDY1MSwgaUNoYXJXaWR0aCwgZmFsc2UpOwotICAgICAgZm9ybUNoYXJzWzFdLmlXaWR0aCA9IGlDaGFyV2lkdGg7Ci0gICAgICBmb3JtQ2hhcnNbMl0ud0Zvcm0gPSAweDA2NzA7Ci0gICAgICBpQ2hhcldpZHRoID0gMDsKLSAgICAgIHBGb250LT5HZXRDaGFyV2lkdGgoMHgwNjcwLCBpQ2hhcldpZHRoLCBmYWxzZSk7Ci0gICAgICBmb3JtQ2hhcnNbMl0uaVdpZHRoID0gaUNoYXJXaWR0aDsKLSAgICB9Ci0KLSAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpRm9ybXM7IGorKykgewotICAgICAgd0Zvcm0gPSAoRlhfV0NIQVIpZm9ybUNoYXJzW2pdLndGb3JtOwotICAgICAgaUNoYXJXaWR0aCA9IGZvcm1DaGFyc1tqXS5pV2lkdGg7Ci0gICAgICBpZiAoaiA+IDApIHsKLSAgICAgICAgY2hhcnR5cGUgPSBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbjsKLSAgICAgICAgd2NoID0gd0Zvcm07Ci0gICAgICAgIHdMYXN0ID0gKEZYX1dDSEFSKWZvcm1DaGFyc1tqIC0gMV0ud0Zvcm07Ci0gICAgICB9Ci0gICAgICBpZiAoIWJFbXB0eUNoYXIgfHwgKGJFbXB0eUNoYXIgJiYgIWJTa2lwU3BhY2UpKSB7Ci0gICAgICAgIHBDaGFyUG9zLT5tX0dseXBoSW5kZXggPQotICAgICAgICAgICAgYkNoYXJDb2RlID8gd2NoIDogcEZvbnQtPkdldEdseXBoSW5kZXgod0Zvcm0sIGZhbHNlKTsKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgICAgICBwQ2hhclBvcy0+bV9FeHRHSUQgPSBwQ2hhclBvcy0+bV9HbHlwaEluZGV4OwotI2VuZGlmCi0gICAgICAgIHBDaGFyUG9zLT5tX0ZvbnRDaGFyV2lkdGggPSBpQ2hhcldpZHRoOwotICAgICAgICBpZiAocFdTRm9ybXMpCi0gICAgICAgICAgKnBXU0Zvcm1zICs9IHdGb3JtOwotICAgICAgfQotCi0gICAgICBpbnQzMl90IGlDaGFySGVpZ2h0OwotICAgICAgaWYgKGJWZXJ0aWNhbERvYykgewotICAgICAgICBpQ2hhckhlaWdodCA9IGlDaGFyV2lkdGg7Ci0gICAgICAgIGlDaGFyV2lkdGggPSAxMDAwOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaUNoYXJIZWlnaHQgPSAxMDAwOwotICAgICAgfQotCi0gICAgICBmQ2hhcldpZHRoID0gZkZvbnRTaXplICogaUNoYXJXaWR0aCAvIDEwMDAuMGY7Ci0gICAgICBmQ2hhckhlaWdodCA9IGZGb250U2l6ZSAqIGlDaGFySGVpZ2h0IC8gMTAwMC4wZjsKLSAgICAgIGlmIChiUlRMUGllY2UgJiYgY2hhcnR5cGUgIT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsKLSAgICAgICAgaWYgKGJWZXJ0aWNhbERvYykKLSAgICAgICAgICBmWSAtPSBmQ2hhckhlaWdodDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGZYIC09IGZDaGFyV2lkdGg7Ci0gICAgICB9Ci0gICAgICBpZiAoIWJFbXB0eUNoYXIgfHwgKGJFbXB0eUNoYXIgJiYgIWJTa2lwU3BhY2UpKSB7Ci0gICAgICAgIHBDaGFyUG9zLT5tX09yaWdpbiA9IENGWF9Qb2ludEYoZlgsIGZZKTsKLSAgICAgICAgaWYgKChkd1N0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX0NvbWJUZXh0KSAhPSAwKSB7Ci0gICAgICAgICAgaW50MzJfdCBpRm9ybVdpZHRoID0gaUNoYXJXaWR0aDsKLSAgICAgICAgICBwRm9udC0+R2V0Q2hhcldpZHRoKHdGb3JtLCBpRm9ybVdpZHRoLCBmYWxzZSk7Ci0gICAgICAgICAgRlhfRkxPQVQgZk9mZnNldCA9IGZGb250U2l6ZSAqIChpQ2hhcldpZHRoIC0gaUZvcm1XaWR0aCkgLyAyMDAwLjBmOwotICAgICAgICAgIGlmIChiVmVydGljYWxEb2MpCi0gICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW4ueSArPSBmT2Zmc2V0OwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpbi54ICs9IGZPZmZzZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY2hhcnR5cGUgPT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsKLSAgICAgICAgICBDRlhfUmVjdCBydEJCb3g7Ci0gICAgICAgICAgaWYgKHBGb250LT5HZXRDaGFyQkJveCh3Rm9ybSwgJnJ0QkJveCwgZmFsc2UpKSB7Ci0gICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW4ueSA9Ci0gICAgICAgICAgICAgICAgZllCYXNlICsgZkZvbnRTaXplIC0KLSAgICAgICAgICAgICAgICBmRm9udFNpemUgKiAoRlhfRkxPQVQpcnRCQm94LmhlaWdodCAvIChGWF9GTE9BVClpTWF4SGVpZ2h0OwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAod0Zvcm0gPT0gd2NoICYmIHdMYXN0ICE9IDB4RkVGRikgewotICAgICAgICAgICAgdWludDMyX3QgZHdMYXN0UHJvcHMgPSBGWF9HZXRVbmljb2RlUHJvcGVydGllcyh3TGFzdCk7Ci0gICAgICAgICAgICBpZiAoKGR3TGFzdFByb3BzICYgRlhfQ0hBUlRZUEVCSVRTTUFTSykgPT0KLSAgICAgICAgICAgICAgICBGWF9DSEFSVFlQRV9Db21iaW5hdGlvbikgewotICAgICAgICAgICAgICBDRlhfUmVjdCBydEJveDsKLSAgICAgICAgICAgICAgaWYgKHBGb250LT5HZXRDaGFyQkJveCh3TGFzdCwgJnJ0Qm94LCBmYWxzZSkpCi0gICAgICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luLnkgLT0gZkZvbnRTaXplICogcnRCb3guaGVpZ2h0IC8gaU1heEhlaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQ0ZYX1BvaW50RiBwdE9mZnNldDsKLSAgICAgICAgaWYgKGJWZXJ0aWNhbENoYXIgJiYgKGR3UHJvcHMgJiAweDAwMDEwMDAwKSAhPSAwKSB7Ci0gICAgICAgICAgQ0ZYX1JlY3QgcnRCQm94OwotICAgICAgICAgIGlmIChwRm9udC0+R2V0Q2hhckJCb3god0Zvcm0sICZydEJCb3gsIGZhbHNlKSkgewotICAgICAgICAgICAgcHRPZmZzZXQueCA9IGZGb250U2l6ZSAqICg4NTAgLSBydEJCb3gucmlnaHQoKSkgLyBpTWF4SGVpZ2h0OwotICAgICAgICAgICAgcHRPZmZzZXQueSA9IGZGb250U2l6ZSAqIChpQXNjZW50IC0gcnRCQm94LnRvcCAtIDE1MCkgLyBpTWF4SGVpZ2h0OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW4ueCArPSBwdE9mZnNldC54OwotICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW4ueSAtPSBwdE9mZnNldC55OwotICAgICAgfQotICAgICAgaWYgKCFiUlRMUGllY2UgJiYgY2hhcnR5cGUgIT0gRlhfQ0hBUlRZUEVfQ29tYmluYXRpb24pIHsKLSAgICAgICAgaWYgKGJWZXJ0aWNhbERvYykKLSAgICAgICAgICBmWSArPSBmQ2hhckhlaWdodDsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGZYICs9IGZDaGFyV2lkdGg7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghYkVtcHR5Q2hhciB8fCAoYkVtcHR5Q2hhciAmJiAhYlNraXBTcGFjZSkpIHsKLSAgICAgICAgcENoYXJQb3MtPm1fYkdseXBoQWRqdXN0ID0gdHJ1ZTsKLSAgICAgICAgaWYgKGJWZXJ0aWNhbERvYykgewotICAgICAgICAgIGlmIChpQ2hhclJvdGF0aW9uID09IDApIHsKLSAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IC0xOwotICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzFdID0gMDsKLSAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsyXSA9IDA7Ci0gICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAxOwotICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luLnkgKz0gZkFzY2VudDsKLSAgICAgICAgICB9IGVsc2UgaWYgKGlDaGFyUm90YXRpb24gPT0gMSkgewotICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gMDsKLSAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IC0xOwotICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gLTE7Ci0gICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAwOwotICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luLnggLT0gZkRlc2NlbnQ7Ci0gICAgICAgICAgfSBlbHNlIGlmIChpQ2hhclJvdGF0aW9uID09IDIpIHsKLSAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IDE7Ci0gICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAwOwotICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gMDsKLSAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IC0xOwotICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luLnggKz0gZkNoYXJXaWR0aDsKLSAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpbi55ICs9IGZBc2NlbnQ7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IDA7Ci0gICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAxOwotICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gMTsKLSAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDA7Ci0gICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW4ueCArPSBmQXNjZW50OwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoaUNoYXJSb3RhdGlvbiA9PSAwKSB7Ci0gICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMF0gPSAtMTsKLSAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IDA7Ci0gICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPSAwOwotICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0gMTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGlDaGFyUm90YXRpb24gPT0gMSkgewotICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0gMDsKLSAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9IC0xOwotICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gLTE7Ci0gICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbM10gPSAwOwotICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luLnggLT0gZkRlc2NlbnQ7Ci0gICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW4ueSAtPSBmQXNjZW50ICsgZkRlc2NlbnQ7Ci0gICAgICAgICAgfSBlbHNlIGlmIChpQ2hhclJvdGF0aW9uID09IDIpIHsKLSAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IDE7Ci0gICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAwOwotICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gMDsKLSAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IC0xOwotICAgICAgICAgICAgcENoYXJQb3MtPm1fT3JpZ2luLnggKz0gZkNoYXJXaWR0aDsKLSAgICAgICAgICAgIHBDaGFyUG9zLT5tX09yaWdpbi55IC09IGZBc2NlbnQ7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFswXSA9IDA7Ci0gICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMV0gPSAxOwotICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzJdID0gMTsKLSAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFszXSA9IDA7Ci0gICAgICAgICAgICBwQ2hhclBvcy0+bV9PcmlnaW4ueCArPSBmQXNjZW50OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoaUhvclNjYWxlICE9IDEwMCB8fCBpVmVyU2NhbGUgIT0gMTAwKSB7Ci0gICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdID0KLSAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzBdICogaUhvclNjYWxlIC8gMTAwLjBmOwotICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSA9Ci0gICAgICAgICAgICAgIHBDaGFyUG9zLT5tX0FkanVzdE1hdHJpeFsxXSAqIGlIb3JTY2FsZSAvIDEwMC4wZjsKLSAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gPQotICAgICAgICAgICAgICBwQ2hhclBvcy0+bV9BZGp1c3RNYXRyaXhbMl0gKiBpVmVyU2NhbGUgLyAxMDAuMGY7Ci0gICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdID0KLSAgICAgICAgICAgICAgcENoYXJQb3MtPm1fQWRqdXN0TWF0cml4WzNdICogaVZlclNjYWxlIC8gMTAwLjBmOwotICAgICAgICB9Ci0gICAgICAgIHBDaGFyUG9zKys7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChpV2lkdGggPiAwKQotICAgICAgd1ByZXYgPSBzdGF0aWNfY2FzdDxGWF9XQ0hBUj4oZm9ybUNoYXJzWzBdLndjaCk7Ci0gICAgd0xhc3QgPSB3Y2g7Ci0gIH0KLSAgcmV0dXJuIGlDb3VudDsKLX0KLQotc3RkOjp2ZWN0b3I8Q0ZYX1JlY3RGPiBDRlhfVHh0QnJlYWs6OkdldENoYXJSZWN0cyhjb25zdCBGWF9UWFRSVU4qIHBUeHRSdW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNoYXJCQm94KSBjb25zdCB7Ci0gIGlmICghcFR4dFJ1biB8fCBwVHh0UnVuLT5pTGVuZ3RoIDwgMSkKLSAgICByZXR1cm4gc3RkOjp2ZWN0b3I8Q0ZYX1JlY3RGPigpOwotCi0gIElGWF9UeHRBY2Nlc3MqIHBBY2Nlc3MgPSBwVHh0UnVuLT5wQWNjZXNzOwotICBjb25zdCBGREVfVEVYVEVESVRQSUVDRSogcElkZW50aXR5ID0gcFR4dFJ1bi0+cElkZW50aXR5OwotICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IHBUeHRSdW4tPndzU3RyLmNfc3RyKCk7Ci0gIGludDMyX3QqIHBXaWR0aHMgPSBwVHh0UnVuLT5wV2lkdGhzOwotICBpbnQzMl90IGlMZW5ndGggPSBwVHh0UnVuLT5pTGVuZ3RoOwotICBDRlhfUmVjdEYgcmVjdCgqcFR4dFJ1bi0+cFJlY3QpOwotICBGWF9GTE9BVCBmRm9udFNpemUgPSBwVHh0UnVuLT5mRm9udFNpemU7Ci0gIGludDMyX3QgaUZvbnRTaXplID0gRlhTWVNfcm91bmQoZkZvbnRTaXplICogMjAuMGYpOwotICBGWF9GTE9BVCBmU2NhbGUgPSBmRm9udFNpemUgLyAxMDAwLjBmOwotICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gcEZvbnQgPSBwVHh0UnVuLT5wRm9udDsKLSAgaWYgKCFwRm9udCkKLSAgICBiQ2hhckJCb3ggPSBmYWxzZTsKLQotICBDRlhfUmVjdCBiYm94OwotICBpZiAoYkNoYXJCQm94KQotICAgIGJDaGFyQkJveCA9IHBGb250LT5HZXRCQm94KCZiYm94KTsKLQotICBGWF9GTE9BVCBmTGVmdCA9IHN0ZDo6bWF4KDAuMGYsIGJib3gubGVmdCAqIGZTY2FsZSk7Ci0gIEZYX0ZMT0FUIGZIZWlnaHQgPSBGWFNZU19mYWJzKGJib3guaGVpZ2h0ICogZlNjYWxlKTsKLSAgYm9vbCBiUlRMUGllY2UgPSAhIShwVHh0UnVuLT5kd0NoYXJTdHlsZXMgJiBGWF9UWFRDSEFSU1RZTEVfT2RkQmlkaUxldmVsKTsKLSAgYm9vbCBiVmVydGljYWwgPSAhIShwVHh0UnVuLT5kd1N0eWxlcyAmIEZYX1RYVExBWU9VVFNUWUxFX1ZlcnRpY2FsTGF5b3V0KTsKLSAgYm9vbCBiU2luZ2xlTGluZSA9ICEhKHBUeHRSdW4tPmR3U3R5bGVzICYgRlhfVFhUTEFZT1VUU1RZTEVfU2luZ2xlTGluZSk7Ci0gIGJvb2wgYkNvbWJUZXh0ID0gISEocFR4dFJ1bi0+ZHdTdHlsZXMgJiBGWF9UWFRMQVlPVVRTVFlMRV9Db21iVGV4dCk7Ci0gIEZYX1dDSEFSIHdjaDsKLSAgRlhfV0NIQVIgd0xpbmVCcmVha0NoYXIgPSBwVHh0UnVuLT53TGluZUJyZWFrQ2hhcjsKLSAgaW50MzJfdCBpQ2hhclNpemU7Ci0gIEZYX0ZMT0FUIGZDaGFyU2l6ZTsKLSAgRlhfRkxPQVQgZlN0YXJ0OwotICBpZiAoYlZlcnRpY2FsKQotICAgIGZTdGFydCA9IGJSVExQaWVjZSA/IHJlY3QuYm90dG9tKCkgOiByZWN0LnRvcDsKLSAgZWxzZQotICAgIGZTdGFydCA9IGJSVExQaWVjZSA/IHJlY3QucmlnaHQoKSA6IHJlY3QubGVmdDsKLQotICBzdGQ6OnZlY3RvcjxDRlhfUmVjdEY+IHJ0QXJyYXkoaUxlbmd0aCk7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGg7IGkrKykgewotICAgIGlmIChwQWNjZXNzKSB7Ci0gICAgICB3Y2ggPSBwQWNjZXNzLT5HZXRDaGFyKHBJZGVudGl0eSwgaSk7Ci0gICAgICBpQ2hhclNpemUgPSBwQWNjZXNzLT5HZXRXaWR0aChwSWRlbnRpdHksIGkpOwotICAgIH0gZWxzZSB7Ci0gICAgICB3Y2ggPSAqcFN0cisrOwotICAgICAgaUNoYXJTaXplID0gKnBXaWR0aHMrKzsKLSAgICB9Ci0gICAgZkNoYXJTaXplID0gc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KGlDaGFyU2l6ZSkgLyAyMDAwMC4wZjsKLSAgICBib29sIGJSZXQgPSAoIWJTaW5nbGVMaW5lICYmIEZYX0lzQ3RybENvZGUod2NoKSk7Ci0gICAgaWYgKCEod2NoID09IEwnXHYnIHx8IHdjaCA9PSBMJ1xmJyB8fCB3Y2ggPT0gMHgyMDI4IHx8IHdjaCA9PSAweDIwMjkgfHwKLSAgICAgICAgICAod0xpbmVCcmVha0NoYXIgIT0gMHhGRUZGICYmIHdjaCA9PSB3TGluZUJyZWFrQ2hhcikpKSB7Ci0gICAgICBiUmV0ID0gZmFsc2U7Ci0gICAgfQotICAgIGlmIChiUmV0KSB7Ci0gICAgICBpQ2hhclNpemUgPSBpRm9udFNpemUgKiA1MDA7Ci0gICAgICBmQ2hhclNpemUgPSBmRm9udFNpemUgLyAyLjBmOwotICAgIH0KLSAgICBpZiAoYlZlcnRpY2FsKSB7Ci0gICAgICByZWN0LnRvcCA9IGZTdGFydDsKLSAgICAgIGlmIChiUlRMUGllY2UpIHsKLSAgICAgICAgcmVjdC50b3AgLT0gZkNoYXJTaXplOwotICAgICAgICBmU3RhcnQgLT0gZkNoYXJTaXplOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZlN0YXJ0ICs9IGZDaGFyU2l6ZTsKLSAgICAgIH0KLSAgICAgIHJlY3QuaGVpZ2h0ID0gZkNoYXJTaXplOwotICAgIH0gZWxzZSB7Ci0gICAgICByZWN0LmxlZnQgPSBmU3RhcnQ7Ci0gICAgICBpZiAoYlJUTFBpZWNlKSB7Ci0gICAgICAgIHJlY3QubGVmdCAtPSBmQ2hhclNpemU7Ci0gICAgICAgIGZTdGFydCAtPSBmQ2hhclNpemU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmU3RhcnQgKz0gZkNoYXJTaXplOwotICAgICAgfQotICAgICAgcmVjdC53aWR0aCA9IGZDaGFyU2l6ZTsKLSAgICB9Ci0KLSAgICBpZiAoYkNoYXJCQm94ICYmICFiUmV0KSB7Ci0gICAgICBpbnQzMl90IGlDaGFyV2lkdGggPSAxMDAwOwotICAgICAgcEZvbnQtPkdldENoYXJXaWR0aCh3Y2gsIGlDaGFyV2lkdGgsIGZhbHNlKTsKLSAgICAgIEZYX0ZMT0FUIGZSVExlZnQgPSAwLCBmQ2hhcldpZHRoID0gMDsKLSAgICAgIGlmIChpQ2hhcldpZHRoID4gMCkgewotICAgICAgICBmQ2hhcldpZHRoID0gaUNoYXJXaWR0aCAqIGZTY2FsZTsKLSAgICAgICAgZlJUTGVmdCA9IGZMZWZ0OwotICAgICAgICBpZiAoYkNvbWJUZXh0KQotICAgICAgICAgIGZSVExlZnQgPSAocmVjdC53aWR0aCAtIGZDaGFyV2lkdGgpIC8gMi4wZjsKLSAgICAgIH0KLSAgICAgIENGWF9SZWN0RiBydEJCb3hGOwotICAgICAgaWYgKGJWZXJ0aWNhbCkgewotICAgICAgICBydEJCb3hGLnRvcCA9IHJlY3QubGVmdCArIGZSVExlZnQ7Ci0gICAgICAgIHJ0QkJveEYubGVmdCA9IHJlY3QudG9wICsgKHJlY3QuaGVpZ2h0IC0gZkhlaWdodCkgLyAyLjBmOwotICAgICAgICBydEJCb3hGLmhlaWdodCA9IGZDaGFyV2lkdGg7Ci0gICAgICAgIHJ0QkJveEYud2lkdGggPSBmSGVpZ2h0OwotICAgICAgICBydEJCb3hGLmxlZnQgPSBzdGQ6Om1heChydEJCb3hGLmxlZnQsIDAuMGYpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcnRCQm94Ri5sZWZ0ID0gcmVjdC5sZWZ0ICsgZlJUTGVmdDsKLSAgICAgICAgcnRCQm94Ri50b3AgPSByZWN0LnRvcCArIChyZWN0LmhlaWdodCAtIGZIZWlnaHQpIC8gMi4wZjsKLSAgICAgICAgcnRCQm94Ri53aWR0aCA9IGZDaGFyV2lkdGg7Ci0gICAgICAgIHJ0QkJveEYuaGVpZ2h0ID0gZkhlaWdodDsKLSAgICAgICAgcnRCQm94Ri50b3AgPSBzdGQ6Om1heChydEJCb3hGLnRvcCwgMC4wZik7Ci0gICAgICB9Ci0gICAgICBydEFycmF5W2ldID0gcnRCQm94RjsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBydEFycmF5W2ldID0gcmVjdDsKLSAgfQotICByZXR1cm4gcnRBcnJheTsKLX0KLQotRlhfVFhUUlVOOjpGWF9UWFRSVU4oKQotICAgIDogcEFjY2VzcyhudWxscHRyKSwKLSAgICAgIHBJZGVudGl0eShudWxscHRyKSwKLSAgICAgIHBXaWR0aHMobnVsbHB0ciksCi0gICAgICBpTGVuZ3RoKDApLAotICAgICAgcEZvbnQobnVsbHB0ciksCi0gICAgICBmRm9udFNpemUoMTIpLAotICAgICAgZHdTdHlsZXMoMCksCi0gICAgICBpSG9yaXpvbnRhbFNjYWxlKDEwMCksCi0gICAgICBpVmVydGljYWxTY2FsZSgxMDApLAotICAgICAgaUNoYXJSb3RhdGlvbigwKSwKLSAgICAgIGR3Q2hhclN0eWxlcygwKSwKLSAgICAgIHBSZWN0KG51bGxwdHIpLAotICAgICAgd0xpbmVCcmVha0NoYXIoTCdcbicpLAotICAgICAgYlNraXBTcGFjZSh0cnVlKSB7fQotCi1GWF9UWFRSVU46On5GWF9UWFRSVU4oKSB7fQotCi1GWF9UWFRSVU46OkZYX1RYVFJVTihjb25zdCBGWF9UWFRSVU4mIG90aGVyKSA9IGRlZmF1bHQ7Ci0KLUNGWF9UeHRQaWVjZTo6Q0ZYX1R4dFBpZWNlKCkKLSAgICA6IG1fZHdTdGF0dXMoRlhfVFhUQlJFQUtfUGllY2VCcmVhayksCi0gICAgICBtX2lTdGFydFBvcygwKSwKLSAgICAgIG1faVdpZHRoKC0xKSwKLSAgICAgIG1faVN0YXJ0Q2hhcigwKSwKLSAgICAgIG1faUNoYXJzKDApLAotICAgICAgbV9pQmlkaUxldmVsKDApLAotICAgICAgbV9pQmlkaVBvcygwKSwKLSAgICAgIG1faUhvcml6b250YWxTY2FsZSgxMDApLAotICAgICAgbV9pVmVydGljYWxTY2FsZSgxMDApLAotICAgICAgbV9kd0NoYXJTdHlsZXMoMCksCi0gICAgICBtX3BDaGFycyhudWxscHRyKSwKLSAgICAgIG1fcFVzZXJEYXRhKG51bGxwdHIpIHt9Ci0KLUNGWF9UeHRMaW5lOjpDRlhfVHh0TGluZShpbnQzMl90IGlCbG9ja1NpemUpCi0gICAgOiBtX3BMaW5lQ2hhcnMobmV3IHN0ZDo6dmVjdG9yPENGWF9UeHRDaGFyPiksCi0gICAgICBtX3BMaW5lUGllY2VzKG5ldyBDRlhfVHh0UGllY2VBcnJheSgxNikpLAotICAgICAgbV9pU3RhcnQoMCksCi0gICAgICBtX2lXaWR0aCgwKSwKLSAgICAgIG1faUFyYWJpY0NoYXJzKDApIHt9Ci0KLUNGWF9UeHRMaW5lOjp+Q0ZYX1R4dExpbmUoKSB7Ci0gIFJlbW92ZUFsbCgpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2ZnYXMvbGF5b3V0L2ZnYXNfdGV4dGJyZWFrLmggYi94ZmEvZmdhcy9sYXlvdXQvZmdhc190ZXh0YnJlYWsuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjljYTgzNS4uMDAwMDAwMAotLS0gYS94ZmEvZmdhcy9sYXlvdXQvZmdhc190ZXh0YnJlYWsuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZHQVNfTEFZT1VUX0ZHQVNfVEVYVEJSRUFLX0hfCi0jZGVmaW5lIFhGQV9GR0FTX0xBWU9VVF9GR0FTX1RFWFRCUkVBS19IXwotCi0jaW5jbHVkZSA8ZGVxdWU+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfdWNkLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvY3J0L2ZnYXNfdXRpbHMuaCIKLQotY2xhc3MgQ0ZYX0NoYXI7Ci1jbGFzcyBDRkdBU19HRUZvbnQ7Ci1jbGFzcyBDRlhfVHh0Q2hhcjsKLWNsYXNzIENGWF9UeHRQaWVjZTsKLWNsYXNzIElGWF9UeHRBY2Nlc3M7Ci1zdHJ1Y3QgRkRFX1RFWFRFRElUUElFQ0U7Ci0KLSNkZWZpbmUgRlhfVFhUQlJFQUtQT0xJQ1lfTm9uZSAweDAwCi0jZGVmaW5lIEZYX1RYVEJSRUFLUE9MSUNZX1BhZ2luYXRpb24gMHgwMQotI2RlZmluZSBGWF9UWFRCUkVBS1BPTElDWV9TcGFjZUJyZWFrIDB4MDIKLSNkZWZpbmUgRlhfVFhUQlJFQUtQT0xJQ1lfTnVtYmVyQnJlYWsgMHgwNAotI2RlZmluZSBGWF9UWFRCUkVBS19Ob25lIDB4MDAKLSNkZWZpbmUgRlhfVFhUQlJFQUtfUGllY2VCcmVhayAweDAxCi0jZGVmaW5lIEZYX1RYVEJSRUFLX0xpbmVCcmVhayAweDAyCi0jZGVmaW5lIEZYX1RYVEJSRUFLX1BhcmFncmFwaEJyZWFrIDB4MDMKLSNkZWZpbmUgRlhfVFhUQlJFQUtfUGFnZUJyZWFrIDB4MDQKLSNkZWZpbmUgRlhfVFhUQlJFQUtfQ29udHJvbENoYXIgMHgxMAotI2RlZmluZSBGWF9UWFRCUkVBS19CcmVha0NoYXIgMHgyMAotI2RlZmluZSBGWF9UWFRCUkVBS19Vbmtub3duQ2hhciAweDQwCi0jZGVmaW5lIEZYX1RYVEJSRUFLX1JlbW92ZUNoYXIgMHg4MAotI2RlZmluZSBGWF9UWFRMQVlPVVRTVFlMRV9NdXRpcGxlRm9ybWF0IDB4MDAwMQotI2RlZmluZSBGWF9UWFRMQVlPVVRTVFlMRV9WZXJ0aWNhbExheW91dCAweDAwMDIKLSNkZWZpbmUgRlhfVFhUTEFZT1VUU1RZTEVfVmVydGljYWxDaGFycyAweDAwMDQKLSNkZWZpbmUgRlhfVFhUTEFZT1VUU1RZTEVfUmV2ZXJzZUxpbmUgMHgwMDA4Ci0jZGVmaW5lIEZYX1RYVExBWU9VVFNUWUxFX0FyYWJpY0NvbnRleHQgMHgwMDEwCi0jZGVmaW5lIEZYX1RYVExBWU9VVFNUWUxFX0FyYWJpY1NoYXBlcyAweDAwMjAKLSNkZWZpbmUgRlhfVFhUTEFZT1VUU1RZTEVfUlRMUmVhZGluZ09yZGVyIDB4MDA0MAotI2RlZmluZSBGWF9UWFRMQVlPVVRTVFlMRV9FeHBhbmRUYWIgMHgwMTAwCi0jZGVmaW5lIEZYX1RYVExBWU9VVFNUWUxFX1NpbmdsZUxpbmUgMHgwMjAwCi0jZGVmaW5lIEZYX1RYVExBWU9VVFNUWUxFX0NvbWJUZXh0IDB4MDQwMAotI2RlZmluZSBGWF9UWFRDSEFSU1RZTEVfQWxpZ25tZW50IDB4MDAwRgotI2RlZmluZSBGWF9UWFRDSEFSU1RZTEVfQXJhYmljTnVtYmVyIDB4MDAxMAotI2RlZmluZSBGWF9UWFRDSEFSU1RZTEVfQXJhYmljU2hhZGRhIDB4MDAyMAotI2RlZmluZSBGWF9UWFRDSEFSU1RZTEVfT2RkQmlkaUxldmVsIDB4MDA0MAotI2RlZmluZSBGWF9UWFRDSEFSU1RZTEVfUlRMUmVhZGluZ09yZGVyIDB4MDA4MAotI2RlZmluZSBGWF9UWFRDSEFSU1RZTEVfQXJhYmljQ29udGV4dCAweDAzMDAKLSNkZWZpbmUgRlhfVFhUQ0hBUlNUWUxFX0FyYWJpY0luZGljIDB4MDQwMAotI2RlZmluZSBGWF9UWFRDSEFSU1RZTEVfQXJhYmljQ29tbWEgMHgwODAwCi0jZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfTGVmdCAwCi0jZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfQ2VudGVyIDEKLSNkZWZpbmUgRlhfVFhUTElORUFMSUdOTUVOVF9SaWdodCAyCi0jZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfSnVzdGlmaWVkICgxIDw8IDIpCi0jZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQgKDIgPDwgMikKLSNkZWZpbmUgRlhfVFhUTElORUFMSUdOTUVOVF9KdXN0aWZpZWRMZWZ0IFwKLSAgKEZYX1RYVExJTkVBTElHTk1FTlRfTGVmdCB8IEZYX1RYVExJTkVBTElHTk1FTlRfSnVzdGlmaWVkKQotI2RlZmluZSBGWF9UWFRMSU5FQUxJR05NRU5UX0p1c3RpZmllZENlbnRlciBcCi0gIChGWF9UWFRMSU5FQUxJR05NRU5UX0NlbnRlciB8IEZYX1RYVExJTkVBTElHTk1FTlRfSnVzdGlmaWVkKQotI2RlZmluZSBGWF9UWFRMSU5FQUxJR05NRU5UX0p1c3RpZmllZFJpZ2h0IFwKLSAgKEZYX1RYVExJTkVBTElHTk1FTlRfUmlnaHQgfCBGWF9UWFRMSU5FQUxJR05NRU5UX0p1c3RpZmllZCkKLSNkZWZpbmUgRlhfVFhUTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZExlZnQgXAotICAoRlhfVFhUTElORUFMSUdOTUVOVF9MZWZ0IHwgRlhfVFhUTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZCkKLSNkZWZpbmUgRlhfVFhUTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZENlbnRlciBcCi0gIChGWF9UWFRMSU5FQUxJR05NRU5UX0NlbnRlciB8IEZYX1RYVExJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWQpCi0jZGVmaW5lIEZYX1RYVExJTkVBTElHTk1FTlRfRGlzdHJpYnV0ZWRSaWdodCBcCi0gIChGWF9UWFRMSU5FQUxJR05NRU5UX1JpZ2h0IHwgRlhfVFhUTElORUFMSUdOTUVOVF9EaXN0cmlidXRlZCkKLSNkZWZpbmUgRlhfVFhUTElORUFMSUdOTUVOVF9Mb3dlck1hc2sgMHgwMwotI2RlZmluZSBGWF9UWFRMSU5FQUxJR05NRU5UX0hpZ2hlck1hc2sgMHgwQwotI2RlZmluZSBGWF9UWFRCUkVBS19NaW5pbXVtVGFiV2lkdGggMTYwMDAwCi0KLXN0cnVjdCBGWF9UUE8gewotICBpbnQzMl90IGluZGV4OwotICBpbnQzMl90IHBvczsKLQotICBib29sIG9wZXJhdG9yPChjb25zdCBGWF9UUE8mIHRoYXQpIGNvbnN0IHsgcmV0dXJuIHBvcyA8IHRoYXQucG9zOyB9Ci19OwotCi1jbGFzcyBJRlhfVHh0QWNjZXNzIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfklGWF9UeHRBY2Nlc3MoKSB7fQotICB2aXJ0dWFsIEZYX1dDSEFSIEdldENoYXIoY29uc3QgRkRFX1RFWFRFRElUUElFQ0UqIHBJZGVudGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXgpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBpbnQzMl90IEdldFdpZHRoKGNvbnN0IEZERV9URVhURURJVFBJRUNFKiBwSWRlbnRpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGluZGV4KSBjb25zdCA9IDA7Ci19OwotCi1zdHJ1Y3QgRlhfVFhUUlVOIHsKLSAgRlhfVFhUUlVOKCk7Ci0gIEZYX1RYVFJVTihjb25zdCBGWF9UWFRSVU4mIG90aGVyKTsKLSAgfkZYX1RYVFJVTigpOwotCi0gIElGWF9UeHRBY2Nlc3MqIHBBY2Nlc3M7Ci0gIGNvbnN0IEZERV9URVhURURJVFBJRUNFKiBwSWRlbnRpdHk7Ci0gIENGWF9XaWRlU3RyaW5nIHdzU3RyOwotICBpbnQzMl90KiBwV2lkdGhzOwotICBpbnQzMl90IGlMZW5ndGg7Ci0gIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBwRm9udDsKLSAgRlhfRkxPQVQgZkZvbnRTaXplOwotICB1aW50MzJfdCBkd1N0eWxlczsKLSAgaW50MzJfdCBpSG9yaXpvbnRhbFNjYWxlOwotICBpbnQzMl90IGlWZXJ0aWNhbFNjYWxlOwotICBpbnQzMl90IGlDaGFyUm90YXRpb247Ci0gIHVpbnQzMl90IGR3Q2hhclN0eWxlczsKLSAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdDsKLSAgRlhfV0NIQVIgd0xpbmVCcmVha0NoYXI7Ci0gIGJvb2wgYlNraXBTcGFjZTsKLX07Ci0KLWNsYXNzIENGWF9UeHRQaWVjZSB7Ci0gcHVibGljOgotICBDRlhfVHh0UGllY2UoKTsKLQotICBpbnQzMl90IEdldEVuZFBvcygpIGNvbnN0IHsKLSAgICByZXR1cm4gbV9pV2lkdGggPCAwID8gbV9pU3RhcnRQb3MgOiBtX2lTdGFydFBvcyArIG1faVdpZHRoOwotICB9Ci0gIGludDMyX3QgR2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9pQ2hhcnM7IH0KLSAgaW50MzJfdCBHZXRFbmRDaGFyKCkgY29uc3QgeyByZXR1cm4gbV9pU3RhcnRDaGFyICsgbV9pQ2hhcnM7IH0KLSAgQ0ZYX1R4dENoYXIqIEdldENoYXJQdHIoaW50MzJfdCBpbmRleCkgY29uc3QgewotICAgIEFTU0VSVChpbmRleCA+IC0xICYmIGluZGV4IDwgbV9pQ2hhcnMgJiYgbV9wQ2hhcnMpOwotICAgIHJldHVybiAmKCptX3BDaGFycylbbV9pU3RhcnRDaGFyICsgaW5kZXhdOwotICB9Ci0gIHZvaWQgR2V0U3RyaW5nKEZYX1dDSEFSKiBwVGV4dCkgY29uc3QgewotICAgIEFTU0VSVChwVGV4dCk7Ci0gICAgaW50MzJfdCBpRW5kQ2hhciA9IG1faVN0YXJ0Q2hhciArIG1faUNoYXJzOwotICAgIGZvciAoaW50MzJfdCBpID0gbV9pU3RhcnRDaGFyOyBpIDwgaUVuZENoYXI7IGkrKykKLSAgICAgICpwVGV4dCsrID0gc3RhdGljX2Nhc3Q8RlhfV0NIQVI+KCgqbV9wQ2hhcnMpW2ldLm1fd0NoYXJDb2RlKTsKLSAgfQotICB2b2lkIEdldFN0cmluZyhDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSBjb25zdCB7Ci0gICAgRlhfV0NIQVIqIHBUZXh0ID0gd3NUZXh0LkdldEJ1ZmZlcihtX2lDaGFycyk7Ci0gICAgR2V0U3RyaW5nKHBUZXh0KTsKLSAgICB3c1RleHQuUmVsZWFzZUJ1ZmZlcihtX2lDaGFycyk7Ci0gIH0KLSAgdm9pZCBHZXRXaWR0aHMoaW50MzJfdCogcFdpZHRocykgY29uc3QgewotICAgIEFTU0VSVChwV2lkdGhzKTsKLSAgICBpbnQzMl90IGlFbmRDaGFyID0gbV9pU3RhcnRDaGFyICsgbV9pQ2hhcnM7Ci0gICAgZm9yIChpbnQzMl90IGkgPSBtX2lTdGFydENoYXI7IGkgPCBpRW5kQ2hhcjsgaSsrKQotICAgICAgKnBXaWR0aHMrKyA9ICgqbV9wQ2hhcnMpW2ldLm1faUNoYXJXaWR0aDsKLSAgfQotCi0gIHVpbnQzMl90IG1fZHdTdGF0dXM7Ci0gIGludDMyX3QgbV9pU3RhcnRQb3M7Ci0gIGludDMyX3QgbV9pV2lkdGg7Ci0gIGludDMyX3QgbV9pU3RhcnRDaGFyOwotICBpbnQzMl90IG1faUNoYXJzOwotICBpbnQzMl90IG1faUJpZGlMZXZlbDsKLSAgaW50MzJfdCBtX2lCaWRpUG9zOwotICBpbnQzMl90IG1faUhvcml6b250YWxTY2FsZTsKLSAgaW50MzJfdCBtX2lWZXJ0aWNhbFNjYWxlOwotICB1aW50MzJfdCBtX2R3Q2hhclN0eWxlczsKLSAgc3RkOjp2ZWN0b3I8Q0ZYX1R4dENoYXI+KiBtX3BDaGFyczsKLSAgdm9pZCogbV9wVXNlckRhdGE7Ci19OwotCi10eXBlZGVmIENGWF9CYXNlQXJyYXlUZW1wbGF0ZTxDRlhfVHh0UGllY2U+IENGWF9UeHRQaWVjZUFycmF5OwotCi1jbGFzcyBDRlhfVHh0TGluZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDRlhfVHh0TGluZShpbnQzMl90IGlCbG9ja1NpemUpOwotICB+Q0ZYX1R4dExpbmUoKTsKLQotICBpbnQzMl90IENvdW50Q2hhcnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4oKm1fcExpbmVDaGFycyk7Ci0gIH0KLQotICBDRlhfVHh0Q2hhciogR2V0Q2hhclB0cihpbnQzMl90IGluZGV4KSBjb25zdCB7Ci0gICAgQVNTRVJUKGluZGV4ID49IDAgJiYKLSAgICAgICAgICAgaW5kZXggPCBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KCptX3BMaW5lQ2hhcnMpKTsKLSAgICByZXR1cm4gJigqbV9wTGluZUNoYXJzKVtpbmRleF07Ci0gIH0KLQotICBpbnQzMl90IENvdW50UGllY2VzKCkgY29uc3QgeyByZXR1cm4gbV9wTGluZVBpZWNlcy0+R2V0U2l6ZSgpOyB9Ci0gIENGWF9UeHRQaWVjZSogR2V0UGllY2VQdHIoaW50MzJfdCBpbmRleCkgY29uc3QgewotICAgIEFTU0VSVChpbmRleCA+IC0xICYmIGluZGV4IDwgbV9wTGluZVBpZWNlcy0+R2V0U2l6ZSgpKTsKLSAgICByZXR1cm4gbV9wTGluZVBpZWNlcy0+R2V0UHRyQXQoaW5kZXgpOwotICB9Ci0KLSAgdm9pZCBHZXRTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcmIHdzU3RyKSBjb25zdCB7Ci0gICAgaW50MzJfdCBpQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KCptX3BMaW5lQ2hhcnMpOwotICAgIEZYX1dDSEFSKiBwQnVmID0gd3NTdHIuR2V0QnVmZmVyKGlDb3VudCk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspCi0gICAgICAqcEJ1ZisrID0gc3RhdGljX2Nhc3Q8RlhfV0NIQVI+KCgqbV9wTGluZUNoYXJzKVtpXS5tX3dDaGFyQ29kZSk7Ci0gICAgd3NTdHIuUmVsZWFzZUJ1ZmZlcihpQ291bnQpOwotICB9Ci0KLSAgdm9pZCBSZW1vdmVBbGwoYm9vbCBiTGVhdmVNZW1vcnkgPSBmYWxzZSkgewotICAgIG1fcExpbmVDaGFycy0+Y2xlYXIoKTsKLSAgICBtX3BMaW5lUGllY2VzLT5SZW1vdmVBbGwoYkxlYXZlTWVtb3J5KTsKLSAgICBtX2lXaWR0aCA9IDA7Ci0gICAgbV9pQXJhYmljQ2hhcnMgPSAwOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dmVjdG9yPENGWF9UeHRDaGFyPj4gbV9wTGluZUNoYXJzOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1R4dFBpZWNlQXJyYXk+IG1fcExpbmVQaWVjZXM7Ci0gIGludDMyX3QgbV9pU3RhcnQ7Ci0gIGludDMyX3QgbV9pV2lkdGg7Ci0gIGludDMyX3QgbV9pQXJhYmljQ2hhcnM7Ci19OwotCi1jbGFzcyBDRlhfVHh0QnJlYWsgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0ZYX1R4dEJyZWFrKHVpbnQzMl90IGR3UG9saWNpZXMpOwotICB+Q0ZYX1R4dEJyZWFrKCk7Ci0KLSAgdm9pZCBTZXRMaW5lV2lkdGgoRlhfRkxPQVQgZkxpbmVXaWR0aCk7Ci0gIHZvaWQgU2V0TGluZVBvcyhGWF9GTE9BVCBmTGluZVBvcyk7Ci0gIHVpbnQzMl90IEdldExheW91dFN0eWxlcygpIGNvbnN0IHsgcmV0dXJuIG1fZHdMYXlvdXRTdHlsZXM7IH0KLSAgdm9pZCBTZXRMYXlvdXRTdHlsZXModWludDMyX3QgZHdMYXlvdXRTdHlsZXMpOwotICB2b2lkIFNldEZvbnQoY29uc3QgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+JiBwRm9udCk7Ci0gIHZvaWQgU2V0Rm9udFNpemUoRlhfRkxPQVQgZkZvbnRTaXplKTsKLSAgdm9pZCBTZXRUYWJXaWR0aChGWF9GTE9BVCBmVGFiV2lkdGgsIGJvb2wgYkVxdWlkaXN0YW50KTsKLSAgdm9pZCBTZXREZWZhdWx0Q2hhcihGWF9XQ0hBUiB3Y2gpOwotICB2b2lkIFNldFBhcmFncmFwaEJyZWFrQ2hhcihGWF9XQ0hBUiB3Y2gpOwotICB2b2lkIFNldExpbmVCcmVha1RvbGVyYW5jZShGWF9GTE9BVCBmVG9sZXJhbmNlKTsKLSAgdm9pZCBTZXRIb3Jpem9udGFsU2NhbGUoaW50MzJfdCBpU2NhbGUpOwotICB2b2lkIFNldENoYXJSb3RhdGlvbihpbnQzMl90IGlDaGFyUm90YXRpb24pOwotICB2b2lkIFNldENoYXJTcGFjZShGWF9GTE9BVCBmQ2hhclNwYWNlKTsKLSAgdm9pZCBTZXRBbGlnbm1lbnQoaW50MzJfdCBpQWxpZ25tZW50KTsKLSAgdm9pZCBTZXRDb21iV2lkdGgoRlhfRkxPQVQgZkNvbWJXaWR0aCk7Ci0gIHZvaWQgU2V0VXNlckRhdGEodm9pZCogcFVzZXJEYXRhKTsKLSAgdWludDMyX3QgQXBwZW5kQ2hhcihGWF9XQ0hBUiB3Y2gpOwotICB1aW50MzJfdCBFbmRCcmVhayh1aW50MzJfdCBkd1N0YXR1cyA9IEZYX1RYVEJSRUFLX1BpZWNlQnJlYWspOwotICBpbnQzMl90IENvdW50QnJlYWtQaWVjZXMoKSBjb25zdDsKLSAgY29uc3QgQ0ZYX1R4dFBpZWNlKiBHZXRCcmVha1BpZWNlKGludDMyX3QgaW5kZXgpIGNvbnN0OwotICB2b2lkIENsZWFyQnJlYWtQaWVjZXMoKTsKLSAgdm9pZCBSZXNldCgpOwotICBpbnQzMl90IEdldERpc3BsYXlQb3MoY29uc3QgRlhfVFhUUlVOKiBwVHh0UnVuLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ2hhckNvZGUgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nKiBwV1NGb3JtcyA9IG51bGxwdHIpIGNvbnN0OwotICBzdGQ6OnZlY3RvcjxDRlhfUmVjdEY+IEdldENoYXJSZWN0cyhjb25zdCBGWF9UWFRSVU4qIHBUeHRSdW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNoYXJCQm94ID0gZmFsc2UpIGNvbnN0OwotICB2b2lkIEFwcGVuZENoYXJfUGFnZUxvYWQoQ0ZYX1R4dENoYXIqIHBDdXJDaGFyLCB1aW50MzJfdCBkd1Byb3BzKTsKLSAgdWludDMyX3QgQXBwZW5kQ2hhcl9Db21iaW5hdGlvbihDRlhfVHh0Q2hhciogcEN1ckNoYXIsIGludDMyX3QgaVJvdGF0aW9uKTsKLSAgdWludDMyX3QgQXBwZW5kQ2hhcl9UYWIoQ0ZYX1R4dENoYXIqIHBDdXJDaGFyLCBpbnQzMl90IGlSb3RhdGlvbik7Ci0gIHVpbnQzMl90IEFwcGVuZENoYXJfQ29udHJvbChDRlhfVHh0Q2hhciogcEN1ckNoYXIsIGludDMyX3QgaVJvdGF0aW9uKTsKLSAgdWludDMyX3QgQXBwZW5kQ2hhcl9BcmFiaWMoQ0ZYX1R4dENoYXIqIHBDdXJDaGFyLCBpbnQzMl90IGlSb3RhdGlvbik7Ci0gIHVpbnQzMl90IEFwcGVuZENoYXJfT3RoZXJzKENGWF9UeHRDaGFyKiBwQ3VyQ2hhciwgaW50MzJfdCBpUm90YXRpb24pOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBGb250Q2hhbmdlZCgpOwotICB2b2lkIFNldEJyZWFrU3RhdHVzKCk7Ci0gIGludDMyX3QgR2V0TGluZVJvdGF0aW9uKHVpbnQzMl90IGR3U3R5bGVzKSBjb25zdDsKLSAgQ0ZYX1R4dENoYXIqIEdldExhc3RDaGFyKGludDMyX3QgaW5kZXgsIGJvb2wgYk9taXRDaGFyID0gdHJ1ZSkgY29uc3Q7Ci0gIENGWF9UeHRMaW5lKiBHZXRUeHRMaW5lKCkgY29uc3Q7Ci0gIENGWF9UeHRQaWVjZUFycmF5KiBHZXRUeHRQaWVjZXMoKSBjb25zdDsKLSAgRlhfQ0hBUlRZUEUgR2V0VW5pZmllZENoYXJUeXBlKEZYX0NIQVJUWVBFIGR3VHlwZSkgY29uc3Q7Ci0gIHZvaWQgUmVzZXRBcmFiaWNDb250ZXh0KCk7Ci0gIHZvaWQgUmVzZXRDb250ZXh0Q2hhclN0eWxlcygpOwotICB2b2lkIEVuZEJyZWFrX1VwZGF0ZUFyYWJpY1NoYXBlcygpOwotICBib29sIEVuZEJyZWFrX1NwbGl0TGluZShDRlhfVHh0TGluZSogcE5leHRMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJBbGxDaGFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGF0dXMpOwotICB2b2lkIEVuZEJyZWFrX0JpZGlMaW5lKHN0ZDo6ZGVxdWU8RlhfVFBPPiogdHBvcywgdWludDMyX3QgZHdTdGF0dXMpOwotICB2b2lkIEVuZEJyZWFrX0FsaWdubWVudChjb25zdCBzdGQ6OmRlcXVlPEZYX1RQTz4mIHRwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFsbENoYXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cyk7Ci0gIGludDMyX3QgR2V0QnJlYWtQb3Moc3RkOjp2ZWN0b3I8Q0ZYX1R4dENoYXI+JiBjYSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRW5kUG9zLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFsbENoYXJzID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCBiT25seUJyayA9IGZhbHNlKTsKLSAgdm9pZCBTcGxpdFRleHRMaW5lKENGWF9UeHRMaW5lKiBwQ3VyTGluZSwKLSAgICAgICAgICAgICAgICAgICAgIENGWF9UeHRMaW5lKiBwTmV4dExpbmUsCi0gICAgICAgICAgICAgICAgICAgICBib29sIGJBbGxDaGFycyA9IGZhbHNlKTsKLQotICB1aW50MzJfdCBtX2R3UG9saWNpZXM7Ci0gIGJvb2wgbV9iUGFnaW5hdGlvbjsKLSAgaW50MzJfdCBtX2lMaW5lV2lkdGg7Ci0gIHVpbnQzMl90IG1fZHdMYXlvdXRTdHlsZXM7Ci0gIGJvb2wgbV9iVmVydGljYWw7Ci0gIGJvb2wgbV9iQXJhYmljQ29udGV4dDsKLSAgYm9vbCBtX2JBcmFiaWNTaGFwZXM7Ci0gIGJvb2wgbV9iUlRMOwotICBib29sIG1fYlNpbmdsZUxpbmU7Ci0gIGJvb2wgbV9iQ29tYlRleHQ7Ci0gIGludDMyX3QgbV9pQXJhYmljQ29udGV4dDsKLSAgaW50MzJfdCBtX2lDdXJBcmFiaWNDb250ZXh0OwotICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gbV9wRm9udDsKLSAgaW50MzJfdCBtX2lGb250U2l6ZTsKLSAgYm9vbCBtX2JFcXVpZGlzdGFudDsKLSAgaW50MzJfdCBtX2lUYWJXaWR0aDsKLSAgRlhfV0NIQVIgbV93RGVmQ2hhcjsKLSAgRlhfV0NIQVIgbV93UGFyYWdCcmVha0NoYXI7Ci0gIGludDMyX3QgbV9pRGVmQ2hhcjsKLSAgaW50MzJfdCBtX2lMaW5lUm90YXRpb247Ci0gIGludDMyX3QgbV9pQ2hhclJvdGF0aW9uOwotICBpbnQzMl90IG1faVJvdGF0aW9uOwotICBpbnQzMl90IG1faUFsaWdubWVudDsKLSAgdWludDMyX3QgbV9kd0NvbnRleHRDaGFyU3R5bGVzOwotICBpbnQzMl90IG1faUNvbWJXaWR0aDsKLSAgdm9pZCogbV9wVXNlckRhdGE7Ci0gIEZYX0NIQVJUWVBFIG1fZUNoYXJUeXBlOwotICBib29sIG1fYkN1clJUTDsKLSAgaW50MzJfdCBtX2lDdXJBbGlnbm1lbnQ7Ci0gIGJvb2wgbV9iQXJhYmljTnVtYmVyOwotICBib29sIG1fYkFyYWJpY0NvbW1hOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1R4dExpbmU+IG1fcFR4dExpbmUxOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1R4dExpbmU+IG1fcFR4dExpbmUyOwotICBDRlhfVHh0TGluZSogbV9wQ3VyTGluZTsKLSAgaW50MzJfdCBtX2lSZWFkeTsKLSAgaW50MzJfdCBtX2lUb2xlcmFuY2U7Ci0gIGludDMyX3QgbV9pSG9yU2NhbGU7Ci0gIGludDMyX3QgbV9pQ2hhclNwYWNlOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRkdBU19MQVlPVVRfRkdBU19URVhUQlJFQUtfSF8KZGlmZiAtLWdpdCBhL3hmYS9mZ2FzL2xvY2FsaXphdGlvbi9mZ2FzX2RhdGV0aW1lLmNwcCBiL3hmYS9mZ2FzL2xvY2FsaXphdGlvbi9mZ2FzX2RhdGV0aW1lLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMwMDBhNC4uMDAwMDAwMAotLS0gYS94ZmEvZmdhcy9sb2NhbGl6YXRpb24vZmdhc19kYXRldGltZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLSNpbmNsdWRlICJ4ZmEvZmdhcy9sb2NhbGl6YXRpb24vZmdhc19kYXRldGltZS5oIgotCi0jaWYgX0ZYX09TXyA9PSBfRlhfTElOVVhfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfQU5EUk9JRF8gfHwgXAotICAgIF9GWF9PU18gPT0gX0ZYX01BQ09TWF8gfHwgX0ZYX09TXyA9PSBfRlhfSU9TXwotI2luY2x1ZGUgPHN5cy90aW1lLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2VuZGlmCi0KLWNvbnN0IHVpbnQ4X3QgZ19GWERheXNQZXJNb250aFsxMl0gPSB7MzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMX07Ci1jb25zdCB1aW50OF90IGdfRlhEYXlzUGVyTGVhcE1vbnRoWzEyXSA9IHszMSwgMjksIDMxLCAzMCwgMzEsIDMwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMX07Ci1jb25zdCBpbnQzMl90IGdfRlhEYXlzQmVmb3JlTW9udGhbMTJdID0gezAsICAgMzEsICA1OSwgIDkwLCAgMTIwLCAxNTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzR9OwotY29uc3QgaW50MzJfdCBnX0ZYRGF5c0JlZm9yZUxlYXBNb250aFsxMl0gPSB7MCwgICAzMSwgIDYwLCAgOTEsICAxMjEsIDE1MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MiwgMjEzLCAyNDQsIDI3NCwgMzA1LCAzMzV9OwotY29uc3QgaW50MzJfdCBnX0ZYRGF5c1BlclllYXIgPSAzNjU7Ci1jb25zdCBpbnQzMl90IGdfRlhEYXlzUGVyTGVhcFllYXIgPSAzNjY7Ci1jb25zdCBpbnQzMl90IGdfRlhEYXlzUGVyNFllYXJzID0gMTQ2MTsKLWNvbnN0IGludDMyX3QgZ19GWERheXNQZXIxMDBZZWFycyA9IDM2NTI0OwotY29uc3QgaW50MzJfdCBnX0ZYRGF5c1BlcjQwMFllYXJzID0gMTQ2MDk3OwotY29uc3QgaW50NjRfdCBnX0ZYTWlsbGlzZWNvbmRzUGVyU2Vjb25kID0gMTAwMDsKLWNvbnN0IGludDY0X3QgZ19GWE1pbGxpc2Vjb25kc1Blck1pbnV0ZSA9IDYwMDAwOwotY29uc3QgaW50NjRfdCBnX0ZYTWlsbGlzZWNvbmRzUGVySG91ciA9IDM2MDAwMDA7Ci1jb25zdCBpbnQ2NF90IGdfRlhNaWxsaXNlY29uZHNQZXJEYXkgPSA4NjQwMDAwMDsKLWJvb2wgRlhfSXNMZWFwWWVhcihpbnQzMl90IGlZZWFyKSB7Ci0gIEFTU0VSVChpWWVhciAhPSAwKTsKLSAgcmV0dXJuICgoaVllYXIgJSA0KSA9PSAwICYmIChpWWVhciAlIDEwMCkgIT0gMCkgfHwgKGlZZWFyICUgNDAwKSA9PSAwOwotfQotaW50MzJfdCBGWF9EYXlzSW5ZZWFyKGludDMyX3QgaVllYXIpIHsKLSAgQVNTRVJUKGlZZWFyICE9IDApOwotICByZXR1cm4gRlhfSXNMZWFwWWVhcihpWWVhcikgPyBnX0ZYRGF5c1BlckxlYXBZZWFyIDogZ19GWERheXNQZXJZZWFyOwotfQotdWludDhfdCBGWF9EYXlzSW5Nb250aChpbnQzMl90IGlZZWFyLCB1aW50OF90IGlNb250aCkgewotICBBU1NFUlQoaVllYXIgIT0gMCk7Ci0gIEFTU0VSVChpTW9udGggPj0gMSAmJiBpTW9udGggPD0gMTIpOwotICBjb25zdCB1aW50OF90KiBwID0KLSAgICAgIEZYX0lzTGVhcFllYXIoaVllYXIpID8gZ19GWERheXNQZXJMZWFwTW9udGggOiBnX0ZYRGF5c1Blck1vbnRoOwotICByZXR1cm4gcFtpTW9udGggLSAxXTsKLX0KLXN0YXRpYyBpbnQzMl90IEZYX0RheXNCZWZvcmVNb250aEluWWVhcihpbnQzMl90IGlZZWFyLCB1aW50OF90IGlNb250aCkgewotICBBU1NFUlQoaVllYXIgIT0gMCk7Ci0gIEFTU0VSVChpTW9udGggPj0gMSAmJiBpTW9udGggPD0gMTIpOwotICBjb25zdCBpbnQzMl90KiBwID0KLSAgICAgIEZYX0lzTGVhcFllYXIoaVllYXIpID8gZ19GWERheXNCZWZvcmVMZWFwTW9udGggOiBnX0ZYRGF5c0JlZm9yZU1vbnRoOwotICByZXR1cm4gcFtpTW9udGggLSAxXTsKLX0KLXN0YXRpYyBpbnQ2NF90IEZYX0RhdGVUb0RheXMoaW50MzJfdCBpWWVhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBpTW9udGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgaURheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSW5jbHVkZVRoaXNEYXkgPSBmYWxzZSkgewotICBBU1NFUlQoaVllYXIgIT0gMCk7Ci0gIEFTU0VSVChpTW9udGggPj0gMSAmJiBpTW9udGggPD0gMTIpOwotICBBU1NFUlQoaURheSA+PSAxICYmIGlEYXkgPD0gRlhfRGF5c0luTW9udGgoaVllYXIsIGlNb250aCkpOwotICBpbnQ2NF90IGlEYXlzID0gRlhfRGF5c0JlZm9yZU1vbnRoSW5ZZWFyKGlZZWFyLCBpTW9udGgpOwotICBpRGF5cyArPSBpRGF5OwotICBpZiAoIWJJbmNsdWRlVGhpc0RheSkgewotICAgIGlEYXlzLS07Ci0gIH0KLSAgaWYgKGlZZWFyID4gMCkgewotICAgIGlZZWFyLS07Ci0gIH0gZWxzZSB7Ci0gICAgaURheXMgLT0gRlhfRGF5c0luWWVhcihpWWVhcik7Ci0gICAgaVllYXIrKzsKLSAgfQotICByZXR1cm4gaURheXMgKyAoaW50NjRfdClpWWVhciAqIDM2NSArIGlZZWFyIC8gNCAtIGlZZWFyIC8gMTAwICsgaVllYXIgLyA0MDA7Ci19Ci1zdGF0aWMgdm9pZCBGWF9EYXlzVG9EYXRlKGludDY0X3QgaURheXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlZZWFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBpTW9udGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QmIGlEYXkpIHsKLSAgYm9vbCBiQkMgPSBpRGF5cyA8IDA7Ci0gIGlmIChiQkMpIHsKLSAgICBpRGF5cyA9IC1pRGF5czsKLSAgfQotICBpWWVhciA9IDE7Ci0gIGlNb250aCA9IDE7Ci0gIGlEYXkgPSAxOwotICBpZiAoaURheXMgPj0gZ19GWERheXNQZXI0MDBZZWFycykgewotICAgIGlZZWFyICs9IChpbnQzMl90KShpRGF5cyAvIGdfRlhEYXlzUGVyNDAwWWVhcnMgKiA0MDApOwotICAgIGlEYXlzICU9IGdfRlhEYXlzUGVyNDAwWWVhcnM7Ci0gIH0KLSAgaWYgKGlEYXlzID49IGdfRlhEYXlzUGVyMTAwWWVhcnMpIHsKLSAgICBpZiAoaURheXMgPT0gZ19GWERheXNQZXIxMDBZZWFycyAqIDQpIHsKLSAgICAgIGlZZWFyICs9IDMwMDsKLSAgICAgIGlEYXlzIC09IGdfRlhEYXlzUGVyMTAwWWVhcnMgKiAzOwotICAgIH0gZWxzZSB7Ci0gICAgICBpWWVhciArPSAoaW50MzJfdCkoaURheXMgLyBnX0ZYRGF5c1BlcjEwMFllYXJzICogMTAwKTsKLSAgICAgIGlEYXlzICU9IGdfRlhEYXlzUGVyMTAwWWVhcnM7Ci0gICAgfQotICB9Ci0gIGlmIChpRGF5cyA+PSBnX0ZYRGF5c1BlcjRZZWFycykgewotICAgIGlZZWFyICs9IChpbnQzMl90KShpRGF5cyAvIGdfRlhEYXlzUGVyNFllYXJzICogNCk7Ci0gICAgaURheXMgJT0gZ19GWERheXNQZXI0WWVhcnM7Ci0gIH0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICBpbnQzMl90IGlZZWFyRGF5cyA9IEZYX0RheXNJblllYXIoaVllYXIpOwotICAgIGlmIChpRGF5cyA8IGlZZWFyRGF5cykgewotICAgICAgaWYgKGJCQykgewotICAgICAgICBpWWVhciA9IC1pWWVhcjsKLSAgICAgICAgaURheXMgPSBpWWVhckRheXMgLSBpRGF5czsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpWWVhcisrOwotICAgIGlEYXlzIC09IGlZZWFyRGF5czsKLSAgfQotICB3aGlsZSAodHJ1ZSkgewotICAgIGludDMyX3QgaU1vbnRoRGF5cyA9IEZYX0RheXNJbk1vbnRoKGlZZWFyLCBpTW9udGgpOwotICAgIGlmIChpRGF5cyA8IGlNb250aERheXMpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpTW9udGgrKzsKLSAgICBpRGF5cyAtPSBpTW9udGhEYXlzOwotICB9Ci0gIGlEYXkgKz0gKHVpbnQ4X3QpaURheXM7Ci19Ci0KLXN0cnVjdCBGWFVUX1NZU1RFTVRJTUUgewotICB1aW50MTZfdCB3WWVhcjsKLSAgdWludDE2X3Qgd01vbnRoOwotICB1aW50MTZfdCB3RGF5T2ZXZWVrOwotICB1aW50MTZfdCB3RGF5OwotICB1aW50MTZfdCB3SG91cjsKLSAgdWludDE2X3Qgd01pbnV0ZTsKLSAgdWludDE2X3Qgd1NlY29uZDsKLSAgdWludDE2X3Qgd01pbGxpc2Vjb25kczsKLX07Ci0KLXZvaWQgQ0ZYX1VuaXRpbWU6Ok5vdygpIHsKLSAgRlhVVF9TWVNURU1USU1FIHV0TG9jYWw7Ci0jaWYgX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lOMzJfTU9CSUxFXyB8fCBcCi0gICAgX0ZYX09TXyA9PSBfRlhfV0lONjRfCi0gIDo6R2V0TG9jYWxUaW1lKChMUFNZU1RFTVRJTUUpJnV0TG9jYWwpOwotI2VsaWYgX0ZYX09TXyAhPSBfRlhfRU1CRURERURfCi0jaWYgMQotICB0aW1ldmFsIGN1clRpbWU7Ci0gIGdldHRpbWVvZmRheSgmY3VyVGltZSwgbnVsbHB0cik7Ci0jZWxzZQotICBzdHJ1Y3QgdGltZXNwZWMgY3VyVGltZTsKLSAgY2xvY2tfZ2V0dGltZShDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQsICZjdXJUaW1lKTsKLSNlbmRpZgotICBzdHJ1Y3QgdG0gc3Q7Ci0gIGxvY2FsdGltZV9yKCZjdXJUaW1lLnR2X3NlYywgJnN0KTsKLSAgdXRMb2NhbC53WWVhciA9IHN0LnRtX3llYXIgKyAxOTAwOwotICB1dExvY2FsLndNb250aCA9IHN0LnRtX21vbiArIDE7Ci0gIHV0TG9jYWwud0RheU9mV2VlayA9IHN0LnRtX3dkYXk7Ci0gIHV0TG9jYWwud0RheSA9IHN0LnRtX21kYXk7Ci0gIHV0TG9jYWwud0hvdXIgPSBzdC50bV9ob3VyOwotICB1dExvY2FsLndNaW51dGUgPSBzdC50bV9taW47Ci0gIHV0TG9jYWwud1NlY29uZCA9IHN0LnRtX3NlYzsKLSAgdXRMb2NhbC53TWlsbGlzZWNvbmRzID0gY3VyVGltZS50dl91c2VjIC8gMTAwMDsKLSNlbmRpZgotICBTZXQodXRMb2NhbC53WWVhciwgKHVpbnQ4X3QpdXRMb2NhbC53TW9udGgsICh1aW50OF90KXV0TG9jYWwud0RheSwKLSAgICAgICh1aW50OF90KXV0TG9jYWwud0hvdXIsICh1aW50OF90KXV0TG9jYWwud01pbnV0ZSwKLSAgICAgICh1aW50OF90KXV0TG9jYWwud1NlY29uZCwgKHVpbnQxNl90KXV0TG9jYWwud01pbGxpc2Vjb25kcyk7Ci19Ci12b2lkIENGWF9Vbml0aW1lOjpTZXRHTVRpbWUoKSB7Ci0gIEZYVVRfU1lTVEVNVElNRSB1dExvY2FsOwotI2lmIF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX1dJTjMyX01PQklMRV8gfHwgXAotICAgIF9GWF9PU18gPT0gX0ZYX1dJTjY0XwotICA6OkdldFN5c3RlbVRpbWUoKExQU1lTVEVNVElNRSkmdXRMb2NhbCk7Ci0jZWxpZiBfRlhfT1NfICE9IF9GWF9FTUJFRERFRF8KLSNpZiAxCi0gIHRpbWV2YWwgY3VyVGltZTsKLSAgZ2V0dGltZW9mZGF5KCZjdXJUaW1lLCBudWxscHRyKTsKLSNlbHNlCi0gIHN0cnVjdCB0aW1lc3BlYyBjdXJUaW1lOwotICBjbG9ja19nZXR0aW1lKENMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCwgJmN1clRpbWUpOwotI2VuZGlmCi0gIHN0cnVjdCB0bSBzdDsKLSAgZ210aW1lX3IoJmN1clRpbWUudHZfc2VjLCAmc3QpOwotICB1dExvY2FsLndZZWFyID0gc3QudG1feWVhciArIDE5MDA7Ci0gIHV0TG9jYWwud01vbnRoID0gc3QudG1fbW9uICsgMTsKLSAgdXRMb2NhbC53RGF5T2ZXZWVrID0gc3QudG1fd2RheTsKLSAgdXRMb2NhbC53RGF5ID0gc3QudG1fbWRheTsKLSAgdXRMb2NhbC53SG91ciA9IHN0LnRtX2hvdXI7Ci0gIHV0TG9jYWwud01pbnV0ZSA9IHN0LnRtX21pbjsKLSAgdXRMb2NhbC53U2Vjb25kID0gc3QudG1fc2VjOwotICB1dExvY2FsLndNaWxsaXNlY29uZHMgPSBjdXJUaW1lLnR2X3VzZWMgLyAxMDAwOwotI2VuZGlmCi0gIFNldCh1dExvY2FsLndZZWFyLCAodWludDhfdCl1dExvY2FsLndNb250aCwgKHVpbnQ4X3QpdXRMb2NhbC53RGF5LAotICAgICAgKHVpbnQ4X3QpdXRMb2NhbC53SG91ciwgKHVpbnQ4X3QpdXRMb2NhbC53TWludXRlLAotICAgICAgKHVpbnQ4X3QpdXRMb2NhbC53U2Vjb25kLCAodWludDE2X3QpdXRMb2NhbC53TWlsbGlzZWNvbmRzKTsKLX0KLXZvaWQgQ0ZYX1VuaXRpbWU6OlNldChpbnQzMl90IHllYXIsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtb250aCwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRheSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGhvdXIsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBtaW51dGUsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWlsbGlzZWNvbmQpIHsKLSAgQVNTRVJUKGhvdXIgPD0gMjMpOwotICBBU1NFUlQobWludXRlIDw9IDU5KTsKLSAgQVNTRVJUKHNlY29uZCA8PSA1OSk7Ci0gIEFTU0VSVChtaWxsaXNlY29uZCA8PSA5OTkpOwotICBtX2lVbml0aW1lID0gKGludDY0X3QpaG91ciAqIGdfRlhNaWxsaXNlY29uZHNQZXJIb3VyICsKLSAgICAgICAgICAgICAgIChpbnQ2NF90KW1pbnV0ZSAqIGdfRlhNaWxsaXNlY29uZHNQZXJNaW51dGUgKwotICAgICAgICAgICAgICAgKGludDY0X3Qpc2Vjb25kICogZ19GWE1pbGxpc2Vjb25kc1BlclNlY29uZCArIG1pbGxpc2Vjb25kOwotICBpZiAoeWVhciA+IDApIHsKLSAgICBtX2lVbml0aW1lID0KLSAgICAgICAgbV9pVW5pdGltZSArCi0gICAgICAgIEZYX0RhdGVUb0RheXMoeWVhciwgbW9udGgsIGRheSwgZmFsc2UpICogZ19GWE1pbGxpc2Vjb25kc1BlckRheTsKLSAgfQotfQotdm9pZCBDRlhfVW5pdGltZTo6U2V0KEZYX1VOSVRJTUUgdCkgewotICBtX2lVbml0aW1lID0gdDsKLX0KLWludDMyX3QgQ0ZYX1VuaXRpbWU6OkdldFllYXIoKSBjb25zdCB7Ci0gIGludDMyX3QgaVllYXI7Ci0gIHVpbnQ4X3QgaU1vbnRoLCBpRGF5OwotICBGWF9EYXlzVG9EYXRlKEdldERheU9mQUQoKSwgaVllYXIsIGlNb250aCwgaURheSk7Ci0gIHJldHVybiBpWWVhcjsKLX0KLXVpbnQ4X3QgQ0ZYX1VuaXRpbWU6OkdldE1vbnRoKCkgY29uc3QgewotICBpbnQzMl90IGlZZWFyOwotICB1aW50OF90IGlNb250aCwgaURheTsKLSAgRlhfRGF5c1RvRGF0ZShHZXREYXlPZkFEKCksIGlZZWFyLCBpTW9udGgsIGlEYXkpOwotICByZXR1cm4gaU1vbnRoOwotfQotdWludDhfdCBDRlhfVW5pdGltZTo6R2V0RGF5KCkgY29uc3QgewotICBpbnQzMl90IGlZZWFyOwotICB1aW50OF90IGlNb250aCwgaURheTsKLSAgRlhfRGF5c1RvRGF0ZShHZXREYXlPZkFEKCksIGlZZWFyLCBpTW9udGgsIGlEYXkpOwotICByZXR1cm4gaURheTsKLX0KLUZYX1dFRUtEQVkgQ0ZYX1VuaXRpbWU6OkdldERheU9mV2VlaygpIGNvbnN0IHsKLSAgaW50MzJfdCB2ID0gKGludDMyX3QpKChtX2lVbml0aW1lIC8gZ19GWE1pbGxpc2Vjb25kc1BlckRheSArIDEpICUgNyk7Ci0gIGlmICh2IDwgMCkgewotICAgIHYgKz0gNzsKLSAgfQotICByZXR1cm4gKEZYX1dFRUtEQVkpdjsKLX0KLXVpbnQxNl90IENGWF9Vbml0aW1lOjpHZXREYXlPZlllYXIoKSBjb25zdCB7Ci0gIGludDMyX3QgaVllYXI7Ci0gIHVpbnQ4X3QgaU1vbnRoLCBpRGF5OwotICBGWF9EYXlzVG9EYXRlKEdldERheU9mQUQoKSwgaVllYXIsIGlNb250aCwgaURheSk7Ci0gIHJldHVybiBGWF9EYXlzQmVmb3JlTW9udGhJblllYXIoaVllYXIsIGlNb250aCkgKyBpRGF5OwotfQotaW50NjRfdCBDRlhfVW5pdGltZTo6R2V0RGF5T2ZBRCgpIGNvbnN0IHsKLSAgYm9vbCBiQkMgPSBtX2lVbml0aW1lIDwgMDsKLSAgaW50NjRfdCBpRGF5cyA9IG1faVVuaXRpbWUgLyBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5OwotICBpRGF5cyArPSBiQkMgPyAtMSA6IDA7Ci0gIGlmIChiQkMgJiYgKG1faVVuaXRpbWUgJSBnX0ZYTWlsbGlzZWNvbmRzUGVyRGF5KSA9PSAwKSB7Ci0gICAgaURheXMrKzsKLSAgfQotICByZXR1cm4gaURheXM7Ci19Ci11aW50OF90IENGWF9Vbml0aW1lOjpHZXRIb3VyKCkgY29uc3QgewotICBpbnQzMl90IHYgPSAoaW50MzJfdCkobV9pVW5pdGltZSAlIGdfRlhNaWxsaXNlY29uZHNQZXJEYXkpOwotICBpZiAodiA8IDApIHsKLSAgICB2ICs9IGdfRlhNaWxsaXNlY29uZHNQZXJEYXk7Ci0gIH0KLSAgcmV0dXJuICh1aW50OF90KSh2IC8gZ19GWE1pbGxpc2Vjb25kc1BlckhvdXIpOwotfQotdWludDhfdCBDRlhfVW5pdGltZTo6R2V0TWludXRlKCkgY29uc3QgewotICBpbnQzMl90IHYgPSAoaW50MzJfdCkobV9pVW5pdGltZSAlIGdfRlhNaWxsaXNlY29uZHNQZXJIb3VyKTsKLSAgaWYgKHYgPCAwKSB7Ci0gICAgdiArPSBnX0ZYTWlsbGlzZWNvbmRzUGVySG91cjsKLSAgfQotICByZXR1cm4gKHVpbnQ4X3QpKHYgLyBnX0ZYTWlsbGlzZWNvbmRzUGVyTWludXRlKTsKLX0KLXVpbnQ4X3QgQ0ZYX1VuaXRpbWU6OkdldFNlY29uZCgpIGNvbnN0IHsKLSAgaW50MzJfdCB2ID0gKGludDMyX3QpKG1faVVuaXRpbWUgJSBnX0ZYTWlsbGlzZWNvbmRzUGVyTWludXRlKTsKLSAgaWYgKHYgPCAwKSB7Ci0gICAgdiArPSBnX0ZYTWlsbGlzZWNvbmRzUGVyTWludXRlOwotICB9Ci0gIHJldHVybiAodWludDhfdCkodiAvIGdfRlhNaWxsaXNlY29uZHNQZXJTZWNvbmQpOwotfQotdWludDE2X3QgQ0ZYX1VuaXRpbWU6OkdldE1pbGxpc2Vjb25kKCkgY29uc3QgewotICBpbnQzMl90IHYgPSAoaW50MzJfdCkobV9pVW5pdGltZSAlIGdfRlhNaWxsaXNlY29uZHNQZXJTZWNvbmQpOwotICBpZiAodiA8IDApIHsKLSAgICB2ICs9IGdfRlhNaWxsaXNlY29uZHNQZXJTZWNvbmQ7Ci0gIH0KLSAgcmV0dXJuICh1aW50MTZfdCl2OwotfQotYm9vbCBDRlhfVW5pdGltZTo6QWRkWWVhcnMoaW50MzJfdCBpWWVhcnMpIHsKLSAgRlhfVU5JVElNRSB1dCA9IG1faVVuaXRpbWU7Ci0gIGlmICh1dCA8IDApIHsKLSAgICB1dCA9IC11dDsKLSAgfQotICBGWF9VTklUSU1FIHIgPSB1dCAlIGdfRlhNaWxsaXNlY29uZHNQZXJEYXk7Ci0gIGludDMyX3QgaVllYXI7Ci0gIHVpbnQ4X3QgaU1vbnRoLCBpRGF5OwotICBGWF9EYXlzVG9EYXRlKEdldERheU9mQUQoKSwgaVllYXIsIGlNb250aCwgaURheSk7Ci0gIGlZZWFyICs9IGlZZWFyczsKLSAgaWYgKGlZZWFyID09IDApIHsKLSAgICBpWWVhciA9IGlZZWFycyA+IDAgPyAxIDogLTE7Ci0gIH0KLSAgbV9pVW5pdGltZSA9Ci0gICAgICBGWF9EYXRlVG9EYXlzKGlZZWFyLCBpTW9udGgsIGlEYXksIGZhbHNlKSAqIGdfRlhNaWxsaXNlY29uZHNQZXJEYXk7Ci0gIG1faVVuaXRpbWUgKz0gKGlZZWFyIDwgMCkgPyAtciA6IHI7Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDRlhfVW5pdGltZTo6QWRkTW9udGhzKGludDMyX3QgaU1vbnRocykgewotICBib29sIGIgPSBpTW9udGhzID4gMDsKLSAgRlhfVU5JVElNRSB1dCA9IG1faVVuaXRpbWU7Ci0gIGlmICh1dCA8IDApIHsKLSAgICB1dCA9IC11dDsKLSAgfQotICBGWF9VTklUSU1FIHIgPSB1dCAlIGdfRlhNaWxsaXNlY29uZHNQZXJEYXk7Ci0gIGludDMyX3QgaVllYXI7Ci0gIHVpbnQ4X3QgaU1vbnRoLCBpRGF5OwotICBGWF9EYXlzVG9EYXRlKEdldERheU9mQUQoKSwgaVllYXIsIGlNb250aCwgaURheSk7Ci0gIGlNb250aHMgKz0gaU1vbnRoOwotICB3aGlsZSAoaU1vbnRocyA8IDEpIHsKLSAgICBpWWVhci0tLCBpTW9udGhzICs9IDEyOwotICB9Ci0gIHdoaWxlIChpTW9udGhzID4gMTIpIHsKLSAgICBpWWVhcisrLCBpTW9udGhzIC09IDEyOwotICB9Ci0gIGlmIChpWWVhciA9PSAwKSB7Ci0gICAgaVllYXIgPSBiID8gMSA6IC0xOwotICB9Ci0gIG1faVVuaXRpbWUgPSBGWF9EYXRlVG9EYXlzKGlZZWFyLCAodWludDhfdClpTW9udGhzLCBpRGF5LCBmYWxzZSkgKgotICAgICAgICAgICAgICAgZ19GWE1pbGxpc2Vjb25kc1BlckRheTsKLSAgbV9pVW5pdGltZSArPSAoaVllYXIgPCAwKSA/IC1yIDogcjsKLSAgcmV0dXJuIHRydWU7Ci19Ci1ib29sIENGWF9Vbml0aW1lOjpBZGREYXlzKGludDMyX3QgaURheXMpIHsKLSAgbV9pVW5pdGltZSArPSAoaW50NjRfdClpRGF5cyAqIGdfRlhNaWxsaXNlY29uZHNQZXJEYXk7Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDRlhfVW5pdGltZTo6QWRkSG91cnMoaW50MzJfdCBpSG91cnMpIHsKLSAgbV9pVW5pdGltZSArPSAoaW50NjRfdClpSG91cnMgKiBnX0ZYTWlsbGlzZWNvbmRzUGVySG91cjsKLSAgcmV0dXJuIHRydWU7Ci19Ci1ib29sIENGWF9Vbml0aW1lOjpBZGRNaW51dGVzKGludDMyX3QgaU1pbnV0ZXMpIHsKLSAgbV9pVW5pdGltZSArPSAoaW50NjRfdClpTWludXRlcyAqIGdfRlhNaWxsaXNlY29uZHNQZXJNaW51dGU7Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDRlhfVW5pdGltZTo6QWRkU2Vjb25kcyhpbnQzMl90IGlTZWNvbmRzKSB7Ci0gIG1faVVuaXRpbWUgKz0gKChpbnQ2NF90KWlTZWNvbmRzKSAqIGdfRlhNaWxsaXNlY29uZHNQZXJTZWNvbmQ7Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDRlhfVW5pdGltZTo6QWRkTWlsbGlzZWNvbmRzKGludDMyX3QgaU1pbGxpc2Vjb25kcykgewotICBtX2lVbml0aW1lICs9IGlNaWxsaXNlY29uZHM7Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDRlhfRGF0ZVRpbWU6OlNldChpbnQzMl90IHllYXIsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbW9udGgsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGF5LAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGhvdXIsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWludXRlLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgbWlsbGlzZWNvbmQpIHsKLSAgQVNTRVJUKHllYXIgIT0gMCk7Ci0gIEFTU0VSVChtb250aCA+PSAxICYmIG1vbnRoIDw9IDEyKTsKLSAgQVNTRVJUKGRheSA+PSAxICYmIGRheSA8PSBGWF9EYXlzSW5Nb250aCh5ZWFyLCBtb250aCkpOwotICBBU1NFUlQoaG91ciA8PSAyMyk7Ci0gIEFTU0VSVChtaW51dGUgPD0gNTkpOwotICBBU1NFUlQoc2Vjb25kIDw9IDU5KTsKLSAgQVNTRVJUKG1pbGxpc2Vjb25kIDw9IDk5OSk7Ci0gIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyID0geWVhcjsKLSAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLm1vbnRoID0gbW9udGg7Ci0gIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5kYXkgPSBkYXk7Ci0gIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5ob3VyID0gaG91cjsKLSAgbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbnV0ZSA9IG1pbnV0ZTsKLSAgbV9EYXRlVGltZS5UaW1lLnNUaW1lLnNlY29uZCA9IHNlY29uZDsKLSAgbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbGxpc2Vjb25kID0gbWlsbGlzZWNvbmQ7Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDRlhfRGF0ZVRpbWU6OkZyb21Vbml0aW1lKEZYX1VOSVRJTUUgdCkgewotICBDRlhfVW5pdGltZSB1dCh0KTsKLSAgRlhfRGF5c1RvRGF0ZSh1dC5HZXREYXlPZkFEKCksIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyLAotICAgICAgICAgICAgICAgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5tb250aCwgbV9EYXRlVGltZS5EYXRlLnNEYXRlLmRheSk7Ci0gIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5kYXkgPSB1dC5HZXRIb3VyKCk7Ci0gIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5taW51dGUgPSB1dC5HZXRNaW51dGUoKTsKLSAgbV9EYXRlVGltZS5UaW1lLnNUaW1lLnNlY29uZCA9IHV0LkdldFNlY29uZCgpOwotICBtX0RhdGVUaW1lLlRpbWUuc1RpbWUubWlsbGlzZWNvbmQgPSB1dC5HZXRNaWxsaXNlY29uZCgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLUZYX1VOSVRJTUUgQ0ZYX0RhdGVUaW1lOjpUb1VuaXRpbWUoKSBjb25zdCB7Ci0gIEZYX1VOSVRJTUUgdiA9Ci0gICAgICAoaW50NjRfdCltX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5ICogZ19GWE1pbGxpc2Vjb25kc1BlckhvdXIgKwotICAgICAgKGludDY0X3QpbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbnV0ZSAqIGdfRlhNaWxsaXNlY29uZHNQZXJNaW51dGUgKwotICAgICAgKGludDY0X3QpbV9EYXRlVGltZS5UaW1lLnNUaW1lLnNlY29uZCAqIGdfRlhNaWxsaXNlY29uZHNQZXJTZWNvbmQgKwotICAgICAgbV9EYXRlVGltZS5UaW1lLnNUaW1lLm1pbGxpc2Vjb25kOwotICB2ICs9IEZYX0RhdGVUb0RheXMobV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIsIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5tb250aCwKLSAgICAgICAgICAgICAgICAgICAgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5kYXksIGZhbHNlKSAqCi0gICAgICAgZ19GWE1pbGxpc2Vjb25kc1BlckRheTsKLSAgcmV0dXJuIHY7Ci19Ci1pbnQzMl90IENGWF9EYXRlVGltZTo6R2V0WWVhcigpIGNvbnN0IHsKLSAgcmV0dXJuIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyOwotfQotdWludDhfdCBDRlhfRGF0ZVRpbWU6OkdldE1vbnRoKCkgY29uc3QgewotICByZXR1cm4gbV9EYXRlVGltZS5EYXRlLnNEYXRlLm1vbnRoOwotfQotdWludDhfdCBDRlhfRGF0ZVRpbWU6OkdldERheSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5kYXk7Ci19Ci1GWF9XRUVLREFZIENGWF9EYXRlVGltZTo6R2V0RGF5T2ZXZWVrKCkgY29uc3QgewotICBpbnQzMl90IHYgPSAoaW50MzJfdCkoRlhfRGF0ZVRvRGF5cyhtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLm1vbnRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5LCB0cnVlKSAlCi0gICAgICAgICAgICAgICAgICAgICAgICA3KTsKLSAgaWYgKHYgPCAwKSB7Ci0gICAgdiArPSA3OwotICB9Ci0gIHJldHVybiAoRlhfV0VFS0RBWSl2OwotfQotdWludDE2X3QgQ0ZYX0RhdGVUaW1lOjpHZXREYXlPZlllYXIoKSBjb25zdCB7Ci0gIHJldHVybiBGWF9EYXlzQmVmb3JlTW9udGhJblllYXIobV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLm1vbnRoKSArCi0gICAgICAgICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5OwotfQotaW50NjRfdCBDRlhfRGF0ZVRpbWU6OkdldERheU9mQUQoKSBjb25zdCB7Ci0gIHJldHVybiBGWF9EYXRlVG9EYXlzKG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUubW9udGgsCi0gICAgICAgICAgICAgICAgICAgICAgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5kYXksIHRydWUpOwotfQotdWludDhfdCBDRlhfRGF0ZVRpbWU6OkdldEhvdXIoKSBjb25zdCB7Ci0gIHJldHVybiBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5OwotfQotdWludDhfdCBDRlhfRGF0ZVRpbWU6OkdldE1pbnV0ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5taW51dGU7Ci19Ci11aW50OF90IENGWF9EYXRlVGltZTo6R2V0U2Vjb25kKCkgY29uc3QgewotICByZXR1cm4gbV9EYXRlVGltZS5UaW1lLnNUaW1lLnNlY29uZDsKLX0KLXVpbnQxNl90IENGWF9EYXRlVGltZTo6R2V0TWlsbGlzZWNvbmQoKSBjb25zdCB7Ci0gIHJldHVybiBtX0RhdGVUaW1lLlRpbWUuc1RpbWUubWlsbGlzZWNvbmQ7Ci19Ci1ib29sIENGWF9EYXRlVGltZTo6QWRkWWVhcnMoaW50MzJfdCBpWWVhcnMpIHsKLSAgaWYgKGlZZWFycyA9PSAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGludDMyX3QgdiA9IG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyICsgaVllYXJzOwotICBpZiAodiA+PSAwICYmIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyIDwgMCkgewotICAgIHYrKzsKLSAgfSBlbHNlIGlmICh2IDw9IDAgJiYgbV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgPiAwKSB7Ci0gICAgdi0tOwotICB9Ci0gIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS55ZWFyID0gdjsKLSAgcmV0dXJuIHRydWU7Ci19Ci1ib29sIENGWF9EYXRlVGltZTo6QWRkTW9udGhzKGludDMyX3QgaU1vbnRocykgewotICBpZiAoaU1vbnRocyA9PSAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGJvb2wgYiA9IGlNb250aHMgPiAwOwotICBpTW9udGhzICs9IG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5tb250aDsKLSAgd2hpbGUgKGlNb250aHMgPCAxKSB7Ci0gICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXItLTsKLSAgICBpZiAobV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgPT0gMCkgewotICAgICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgPSAtMTsKLSAgICB9Ci0gICAgaU1vbnRocyArPSAxMjsKLSAgfQotICB3aGlsZSAoaU1vbnRocyA+IDEyKSB7Ci0gICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIrKzsKLSAgICBpZiAobV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgPT0gMCkgewotICAgICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgPSAxOwotICAgIH0KLSAgICBpTW9udGhzIC09IDEyOwotICB9Ci0gIGlmIChtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciA9PSAwKSB7Ci0gICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIgPSBiID8gMSA6IC0xOwotICB9Ci0gIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5tb250aCA9ICh1aW50OF90KWlNb250aHM7Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDRlhfRGF0ZVRpbWU6OkFkZERheXMoaW50MzJfdCBpRGF5cykgewotICBpZiAoaURheXMgPT0gMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpbnQ2NF90IHYxID0KLSAgICAgIEZYX0RhdGVUb0RheXMobV9EYXRlVGltZS5EYXRlLnNEYXRlLnllYXIsIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5tb250aCwKLSAgICAgICAgICAgICAgICAgICAgbV9EYXRlVGltZS5EYXRlLnNEYXRlLmRheSwgdHJ1ZSk7Ci0gIGludDY0X3QgdjIgPSB2MSArIGlEYXlzOwotICBpZiAodjIgPD0gMCAmJiB2MSA+IDApIHsKLSAgICB2Mi0tOwotICB9IGVsc2UgaWYgKHYyID49IDAgJiYgdjEgPCAwKSB7Ci0gICAgdjIrKzsKLSAgfQotICBGWF9EYXlzVG9EYXRlKHYyLCBtX0RhdGVUaW1lLkRhdGUuc0RhdGUueWVhciwgbV9EYXRlVGltZS5EYXRlLnNEYXRlLm1vbnRoLAotICAgICAgICAgICAgICAgIG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5kYXkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgQ0ZYX0RhdGVUaW1lOjpBZGRIb3VycyhpbnQzMl90IGlIb3VycykgewotICBpZiAoaUhvdXJzID09IDApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaUhvdXJzICs9IG1fRGF0ZVRpbWUuRGF0ZS5zRGF0ZS5kYXk7Ci0gIGludDMyX3QgaURheXMgPSBpSG91cnMgLyAyNDsKLSAgaUhvdXJzICU9IDI0OwotICBpZiAoaUhvdXJzIDwgMCkgewotICAgIGlEYXlzLS0sIGlIb3VycyArPSAyNDsKLSAgfQotICBtX0RhdGVUaW1lLkRhdGUuc0RhdGUuZGF5ID0gKHVpbnQ4X3QpaUhvdXJzOwotICBpZiAoaURheXMgIT0gMCkgewotICAgIEFkZERheXMoaURheXMpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDRlhfRGF0ZVRpbWU6OkFkZE1pbnV0ZXMoaW50MzJfdCBpTWludXRlcykgewotICBpZiAoaU1pbnV0ZXMgPT0gMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpTWludXRlcyArPSBtX0RhdGVUaW1lLlRpbWUuc1RpbWUubWludXRlOwotICBpbnQzMl90IGlIb3VycyA9IGlNaW51dGVzIC8gNjA7Ci0gIGlNaW51dGVzICU9IDYwOwotICBpZiAoaU1pbnV0ZXMgPCAwKSB7Ci0gICAgaUhvdXJzLS0sIGlNaW51dGVzICs9IDYwOwotICB9Ci0gIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5taW51dGUgPSAodWludDhfdClpTWludXRlczsKLSAgaWYgKGlIb3VycyAhPSAwKSB7Ci0gICAgQWRkSG91cnMoaUhvdXJzKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgQ0ZYX0RhdGVUaW1lOjpBZGRTZWNvbmRzKGludDMyX3QgaVNlY29uZHMpIHsKLSAgaWYgKGlTZWNvbmRzID09IDApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaVNlY29uZHMgKz0gbV9EYXRlVGltZS5UaW1lLnNUaW1lLnNlY29uZDsKLSAgaW50MzJfdCBpTWludXRlcyA9IGlTZWNvbmRzIC8gNjA7Ci0gIGlTZWNvbmRzICU9IDYwOwotICBpZiAoaVNlY29uZHMgPCAwKSB7Ci0gICAgaU1pbnV0ZXMtLSwgaVNlY29uZHMgKz0gNjA7Ci0gIH0KLSAgbV9EYXRlVGltZS5UaW1lLnNUaW1lLnNlY29uZCA9ICh1aW50OF90KWlTZWNvbmRzOwotICBpZiAoaU1pbnV0ZXMgIT0gMCkgewotICAgIEFkZE1pbnV0ZXMoaU1pbnV0ZXMpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDRlhfRGF0ZVRpbWU6OkFkZE1pbGxpc2Vjb25kcyhpbnQzMl90IGlNaWxsaXNlY29uZHMpIHsKLSAgaWYgKGlNaWxsaXNlY29uZHMgPT0gMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpTWlsbGlzZWNvbmRzICs9IG1fRGF0ZVRpbWUuVGltZS5zVGltZS5taWxsaXNlY29uZDsKLSAgaW50MzJfdCBpU2Vjb25kcyA9IChpbnQzMl90KShpTWlsbGlzZWNvbmRzIC8gZ19GWE1pbGxpc2Vjb25kc1BlclNlY29uZCk7Ci0gIGlNaWxsaXNlY29uZHMgJT0gZ19GWE1pbGxpc2Vjb25kc1BlclNlY29uZDsKLSAgaWYgKGlNaWxsaXNlY29uZHMgPCAwKSB7Ci0gICAgaVNlY29uZHMtLSwgaU1pbGxpc2Vjb25kcyArPSBnX0ZYTWlsbGlzZWNvbmRzUGVyU2Vjb25kOwotICB9Ci0gIG1fRGF0ZVRpbWUuVGltZS5zVGltZS5taWxsaXNlY29uZCA9ICh1aW50MTZfdClpTWlsbGlzZWNvbmRzOwotICBpZiAoaVNlY29uZHMgIT0gMCkgewotICAgIEFkZFNlY29uZHMoaVNlY29uZHMpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEveGZhL2ZnYXMvbG9jYWxpemF0aW9uL2ZnYXNfZGF0ZXRpbWUuaCBiL3hmYS9mZ2FzL2xvY2FsaXphdGlvbi9mZ2FzX2RhdGV0aW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZWE5ZmEuLjAwMDAwMDAKLS0tIGEveGZhL2ZnYXMvbG9jYWxpemF0aW9uL2ZnYXNfZGF0ZXRpbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZHQVNfTE9DQUxJWkFUSU9OX0ZHQVNfREFURVRJTUVfSF8KLSNkZWZpbmUgWEZBX0ZHQVNfTE9DQUxJWkFUSU9OX0ZHQVNfREFURVRJTUVfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0KLWNsYXNzIENGWF9Vbml0aW1lOwotY2xhc3MgQ0ZYX0RhdGVUaW1lOwotCi10eXBlZGVmIGludDY0X3QgRlhfVU5JVElNRTsKLWVudW0gRlhfV0VFS0RBWSB7Ci0gIEZYX1N1bmRheSA9IDAsCi0gIEZYX01vbmRheSwKLSAgRlhfVHVlc2RheSwKLSAgRlhfV2VkbmVzZGF5LAotICBGWF9UaHVyc2RheSwKLSAgRlhfRnJpZGF5LAotICBGWF9TYXR1cmRheSwKLX07Ci0KLWJvb2wgRlhfSXNMZWFwWWVhcihpbnQzMl90IGlZZWFyKTsKLWludDMyX3QgRlhfRGF5c0luWWVhcihpbnQzMl90IGlZZWFyKTsKLXVpbnQ4X3QgRlhfRGF5c0luTW9udGgoaW50MzJfdCBpWWVhciwgdWludDhfdCBpTW9udGgpOwotCi1jbGFzcyBDRlhfVW5pdGltZSB7Ci0gcHVibGljOgotICBDRlhfVW5pdGltZSgpIHsgbV9pVW5pdGltZSA9IDA7IH0KLSAgZXhwbGljaXQgQ0ZYX1VuaXRpbWUoRlhfVU5JVElNRSBpVW5pdGltZSkgeyBtX2lVbml0aW1lID0gaVVuaXRpbWU7IH0KLSAgQ0ZYX1VuaXRpbWUoY29uc3QgQ0ZYX1VuaXRpbWUmIHVuaXRpbWUpIHsgbV9pVW5pdGltZSA9IHVuaXRpbWUubV9pVW5pdGltZTsgfQotICBvcGVyYXRvciBGWF9VTklUSU1FKigpIHsgcmV0dXJuICZtX2lVbml0aW1lOyB9Ci0gIG9wZXJhdG9yIEZYX1VOSVRJTUUgY29uc3QqKCkgY29uc3QgeyByZXR1cm4gJm1faVVuaXRpbWU7IH0KLSAgb3BlcmF0b3IgRlhfVU5JVElNRSYoKSB7IHJldHVybiBtX2lVbml0aW1lOyB9Ci0gIG9wZXJhdG9yIGNvbnN0IEZYX1VOSVRJTUUmKCkgY29uc3QgeyByZXR1cm4gbV9pVW5pdGltZTsgfQotICBDRlhfVW5pdGltZSYgb3BlcmF0b3I9KGNvbnN0IENGWF9Vbml0aW1lJiB0KSB7Ci0gICAgbV9pVW5pdGltZSA9IHQubV9pVW5pdGltZTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgQ0ZYX1VuaXRpbWUmIG9wZXJhdG9yPShGWF9VTklUSU1FIHQpIHsKLSAgICBtX2lVbml0aW1lID0gdDsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgQ0ZYX1VuaXRpbWUmIG9wZXJhdG9yKz0oY29uc3QgQ0ZYX1VuaXRpbWUmIHQpIHsKLSAgICBtX2lVbml0aW1lICs9IHQubV9pVW5pdGltZTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgQ0ZYX1VuaXRpbWUmIG9wZXJhdG9yKz0oRlhfVU5JVElNRSB0KSB7Ci0gICAgbV9pVW5pdGltZSArPSB0OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBDRlhfVW5pdGltZSYgb3BlcmF0b3ItPShjb25zdCBDRlhfVW5pdGltZSYgdCkgewotICAgIG1faVVuaXRpbWUgLT0gdC5tX2lVbml0aW1lOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBDRlhfVW5pdGltZSYgb3BlcmF0b3ItPShGWF9VTklUSU1FIHQpIHsKLSAgICBtX2lVbml0aW1lIC09IHQ7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIHZvaWQgTm93KCk7Ci0gIHZvaWQgU2V0R01UaW1lKCk7Ci0gIHZvaWQgU2V0KGludDMyX3QgeWVhciwKLSAgICAgICAgICAgdWludDhfdCBtb250aCwKLSAgICAgICAgICAgdWludDhfdCBkYXksCi0gICAgICAgICAgIHVpbnQ4X3QgaG91ciA9IDAsCi0gICAgICAgICAgIHVpbnQ4X3QgbWludXRlID0gMCwKLSAgICAgICAgICAgdWludDhfdCBzZWNvbmQgPSAwLAotICAgICAgICAgICB1aW50MTZfdCBtaWxsaXNlY29uZCA9IDApOwotICB2b2lkIFNldChGWF9VTklUSU1FIHQpOwotICBpbnQzMl90IEdldFllYXIoKSBjb25zdDsKLSAgdWludDhfdCBHZXRNb250aCgpIGNvbnN0OwotICB1aW50OF90IEdldERheSgpIGNvbnN0OwotICBGWF9XRUVLREFZIEdldERheU9mV2VlaygpIGNvbnN0OwotICB1aW50MTZfdCBHZXREYXlPZlllYXIoKSBjb25zdDsKLSAgaW50NjRfdCBHZXREYXlPZkFEKCkgY29uc3Q7Ci0gIHVpbnQ4X3QgR2V0SG91cigpIGNvbnN0OwotICB1aW50OF90IEdldE1pbnV0ZSgpIGNvbnN0OwotICB1aW50OF90IEdldFNlY29uZCgpIGNvbnN0OwotICB1aW50MTZfdCBHZXRNaWxsaXNlY29uZCgpIGNvbnN0OwotICBib29sIEFkZFllYXJzKGludDMyX3QgaVllYXJzKTsKLSAgYm9vbCBBZGRNb250aHMoaW50MzJfdCBpTW9udGhzKTsKLSAgYm9vbCBBZGREYXlzKGludDMyX3QgaURheXMpOwotICBib29sIEFkZEhvdXJzKGludDMyX3QgaUhvdXJzKTsKLSAgYm9vbCBBZGRNaW51dGVzKGludDMyX3QgaU1pbnV0ZXMpOwotICBib29sIEFkZFNlY29uZHMoaW50MzJfdCBpU2Vjb25kcyk7Ci0gIGJvb2wgQWRkTWlsbGlzZWNvbmRzKGludDMyX3QgaU1pbGxpc2Vjb25kcyk7Ci0gIGZyaWVuZCBDRlhfVW5pdGltZSBvcGVyYXRvcisoY29uc3QgQ0ZYX1VuaXRpbWUmIHQxLCBjb25zdCBDRlhfVW5pdGltZSYgdDIpIHsKLSAgICByZXR1cm4gQ0ZYX1VuaXRpbWUodDEubV9pVW5pdGltZSArIHQyLm1faVVuaXRpbWUpOwotICB9Ci0gIGZyaWVuZCBDRlhfVW5pdGltZSBvcGVyYXRvcisoY29uc3QgQ0ZYX1VuaXRpbWUmIHQxLCBGWF9VTklUSU1FIHQyKSB7Ci0gICAgcmV0dXJuIENGWF9Vbml0aW1lKHQxLm1faVVuaXRpbWUgKyB0Mik7Ci0gIH0KLSAgZnJpZW5kIENGWF9Vbml0aW1lIG9wZXJhdG9yKyhGWF9VTklUSU1FIHQxLCBjb25zdCBDRlhfVW5pdGltZSYgdDIpIHsKLSAgICByZXR1cm4gQ0ZYX1VuaXRpbWUodDEgKyB0Mi5tX2lVbml0aW1lKTsKLSAgfQotICBmcmllbmQgQ0ZYX1VuaXRpbWUgb3BlcmF0b3ItKGNvbnN0IENGWF9Vbml0aW1lJiB0MSwgY29uc3QgQ0ZYX1VuaXRpbWUmIHQyKSB7Ci0gICAgcmV0dXJuIENGWF9Vbml0aW1lKHQxLm1faVVuaXRpbWUgKyB0Mi5tX2lVbml0aW1lKTsKLSAgfQotICBmcmllbmQgQ0ZYX1VuaXRpbWUgb3BlcmF0b3ItKGNvbnN0IENGWF9Vbml0aW1lJiB0MSwgRlhfVU5JVElNRSB0MikgewotICAgIHJldHVybiBDRlhfVW5pdGltZSh0MS5tX2lVbml0aW1lICsgdDIpOwotICB9Ci0gIGZyaWVuZCBDRlhfVW5pdGltZSBvcGVyYXRvci0oRlhfVU5JVElNRSB0MSwgY29uc3QgQ0ZYX1VuaXRpbWUmIHQyKSB7Ci0gICAgcmV0dXJuIENGWF9Vbml0aW1lKHQxICsgdDIubV9pVW5pdGltZSk7Ci0gIH0KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDRlhfVW5pdGltZSYgdDEsIGNvbnN0IENGWF9Vbml0aW1lJiB0MikgewotICAgIHJldHVybiB0MS5tX2lVbml0aW1lID09IHQyLm1faVVuaXRpbWU7Ci0gIH0KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDRlhfVW5pdGltZSYgdDEsIEZYX1VOSVRJTUUgdDIpIHsKLSAgICByZXR1cm4gdDEubV9pVW5pdGltZSA9PSB0MjsKLSAgfQotICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KEZYX1VOSVRJTUUgdDEsIGNvbnN0IENGWF9Vbml0aW1lJiB0MikgewotICAgIHJldHVybiB0MSA9PSB0Mi5tX2lVbml0aW1lOwotICB9Ci0gIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgQ0ZYX1VuaXRpbWUmIHQxLCBjb25zdCBDRlhfVW5pdGltZSYgdDIpIHsKLSAgICByZXR1cm4gdDEubV9pVW5pdGltZSAhPSB0Mi5tX2lVbml0aW1lOwotICB9Ci0gIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgQ0ZYX1VuaXRpbWUmIHQxLCBGWF9VTklUSU1FIHQyKSB7Ci0gICAgcmV0dXJuIHQxLm1faVVuaXRpbWUgIT0gdDI7Ci0gIH0KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShGWF9VTklUSU1FIHQxLCBjb25zdCBDRlhfVW5pdGltZSYgdDIpIHsKLSAgICByZXR1cm4gdDEgIT0gdDIubV9pVW5pdGltZTsKLSAgfQotICBmcmllbmQgYm9vbCBvcGVyYXRvcj4oY29uc3QgQ0ZYX1VuaXRpbWUmIHQxLCBjb25zdCBDRlhfVW5pdGltZSYgdDIpIHsKLSAgICByZXR1cm4gdDEubV9pVW5pdGltZSA+IHQyLm1faVVuaXRpbWU7Ci0gIH0KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+KGNvbnN0IENGWF9Vbml0aW1lJiB0MSwgRlhfVU5JVElNRSB0MikgewotICAgIHJldHVybiB0MS5tX2lVbml0aW1lID4gdDI7Ci0gIH0KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+KEZYX1VOSVRJTUUgdDEsIGNvbnN0IENGWF9Vbml0aW1lJiB0MikgewotICAgIHJldHVybiB0MSA+IHQyLm1faVVuaXRpbWU7Ci0gIH0KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+PShjb25zdCBDRlhfVW5pdGltZSYgdDEsIGNvbnN0IENGWF9Vbml0aW1lJiB0MikgewotICAgIHJldHVybiB0MS5tX2lVbml0aW1lID49IHQyLm1faVVuaXRpbWU7Ci0gIH0KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+PShjb25zdCBDRlhfVW5pdGltZSYgdDEsIEZYX1VOSVRJTUUgdDIpIHsKLSAgICByZXR1cm4gdDEubV9pVW5pdGltZSA+PSB0MjsKLSAgfQotICBmcmllbmQgYm9vbCBvcGVyYXRvcj49KEZYX1VOSVRJTUUgdDEsIGNvbnN0IENGWF9Vbml0aW1lJiB0MikgewotICAgIHJldHVybiB0MSA+PSB0Mi5tX2lVbml0aW1lOwotICB9Ci0gIGZyaWVuZCBib29sIG9wZXJhdG9yPChjb25zdCBDRlhfVW5pdGltZSYgdDEsIGNvbnN0IENGWF9Vbml0aW1lJiB0MikgewotICAgIHJldHVybiB0MS5tX2lVbml0aW1lIDwgdDIubV9pVW5pdGltZTsKLSAgfQotICBmcmllbmQgYm9vbCBvcGVyYXRvcjwoY29uc3QgQ0ZYX1VuaXRpbWUmIHQxLCBGWF9VTklUSU1FIHQyKSB7Ci0gICAgcmV0dXJuIHQxLm1faVVuaXRpbWUgPCB0MjsKLSAgfQotICBmcmllbmQgYm9vbCBvcGVyYXRvcjwoRlhfVU5JVElNRSB0MSwgY29uc3QgQ0ZYX1VuaXRpbWUmIHQyKSB7Ci0gICAgcmV0dXJuIHQxIDwgdDIubV9pVW5pdGltZTsKLSAgfQotICBmcmllbmQgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IENGWF9Vbml0aW1lJiB0MSwgY29uc3QgQ0ZYX1VuaXRpbWUmIHQyKSB7Ci0gICAgcmV0dXJuIHQxLm1faVVuaXRpbWUgPD0gdDIubV9pVW5pdGltZTsKLSAgfQotICBmcmllbmQgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IENGWF9Vbml0aW1lJiB0MSwgRlhfVU5JVElNRSB0MikgewotICAgIHJldHVybiB0MS5tX2lVbml0aW1lIDw9IHQyOwotICB9Ci0gIGZyaWVuZCBib29sIG9wZXJhdG9yPD0oRlhfVU5JVElNRSB0MSwgY29uc3QgQ0ZYX1VuaXRpbWUmIHQyKSB7Ci0gICAgcmV0dXJuIHQxIDw9IHQyLm1faVVuaXRpbWU7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEZYX1VOSVRJTUUgbV9pVW5pdGltZTsKLX07Ci0KLSNpZiBfRlhfT1NfICE9IF9GWF9BTkRST0lEXwotI3ByYWdtYSBwYWNrKHB1c2gsIDEpCi0jZW5kaWYKLXN0cnVjdCBGWF9EQVRFIHsKLSAgaW50MzJfdCB5ZWFyOwotICB1aW50OF90IG1vbnRoOwotICB1aW50OF90IGRheTsKLX07Ci0KLXN0cnVjdCBGWF9USU1FIHsKLSAgdWludDhfdCBob3VyOwotICB1aW50OF90IG1pbnV0ZTsKLSAgdWludDhfdCBzZWNvbmQ7Ci0gIHVpbnQxNl90IG1pbGxpc2Vjb25kOwotfTsKLQotc3RydWN0IEZYX1RJTUVaT05FIHsKLSAgaW50OF90IHR6SG91cjsKLSAgdWludDhfdCB0ek1pbnV0ZTsKLX07Ci0KLXN0cnVjdCBGWF9EQVRFVElNRSB7Ci0gIHVuaW9uIHsKLSAgICBzdHJ1Y3QgewotICAgICAgaW50MzJfdCB5ZWFyOwotICAgICAgdWludDhfdCBtb250aDsKLSAgICAgIHVpbnQ4X3QgZGF5OwotICAgIH0gc0RhdGU7Ci0gICAgRlhfREFURSBhRGF0ZTsKLSAgfSBEYXRlOwotICB1bmlvbiB7Ci0gICAgc3RydWN0IHsKLSAgICAgIHVpbnQ4X3QgaG91cjsKLSAgICAgIHVpbnQ4X3QgbWludXRlOwotICAgICAgdWludDhfdCBzZWNvbmQ7Ci0gICAgICB1aW50MTZfdCBtaWxsaXNlY29uZDsKLSAgICB9IHNUaW1lOwotICAgIEZYX1RJTUUgYVRpbWU7Ci0gIH0gVGltZTsKLX07Ci0KLSNpZiBfRlhfT1NfICE9IF9GWF9BTkRST0lEXwotI3ByYWdtYSBwYWNrKHBvcCkKLSNlbmRpZgotCi1jbGFzcyBDRlhfRGF0ZVRpbWUgewotIHB1YmxpYzoKLSAgQ0ZYX0RhdGVUaW1lKCkge30KLSAgZXhwbGljaXQgQ0ZYX0RhdGVUaW1lKGNvbnN0IEZYX0RBVEVUSU1FJiBkdCkgeyBtX0RhdGVUaW1lID0gZHQ7IH0KLSAgQ0ZYX0RhdGVUaW1lKGNvbnN0IENGWF9EYXRlVGltZSYgZHQpIHsgbV9EYXRlVGltZSA9IGR0Lm1fRGF0ZVRpbWU7IH0KLSAgdmlydHVhbCB+Q0ZYX0RhdGVUaW1lKCkge30KLSAgb3BlcmF0b3IgRlhfREFURVRJTUUqKCkgeyByZXR1cm4gJm1fRGF0ZVRpbWU7IH0KLSAgb3BlcmF0b3IgY29uc3QgRlhfREFURVRJTUUqKCkgY29uc3QgeyByZXR1cm4gJm1fRGF0ZVRpbWU7IH0KLSAgb3BlcmF0b3IgRlhfREFURVRJTUUmKCkgeyByZXR1cm4gbV9EYXRlVGltZTsgfQotICBvcGVyYXRvciBjb25zdCBGWF9EQVRFVElNRSYoKSBjb25zdCB7IHJldHVybiBtX0RhdGVUaW1lOyB9Ci0gIENGWF9EYXRlVGltZSYgb3BlcmF0b3I9KGNvbnN0IENGWF9EYXRlVGltZSYgZHQpIHsKLSAgICBtX0RhdGVUaW1lID0gZHQubV9EYXRlVGltZTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgQ0ZYX0RhdGVUaW1lJiBvcGVyYXRvcj0oY29uc3QgRlhfREFURVRJTUUmIGR0KSB7Ci0gICAgbV9EYXRlVGltZSA9IGR0OwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBDRlhfRGF0ZVRpbWUmIG9wZXJhdG9yKz0oY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdCkgewotICAgIEZyb21Vbml0aW1lKFRvVW5pdGltZSgpICsgZHQuVG9Vbml0aW1lKCkpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBDRlhfRGF0ZVRpbWUmIG9wZXJhdG9yKz0oY29uc3QgRlhfREFURVRJTUUmIGR0KSB7Ci0gICAgRnJvbVVuaXRpbWUoVG9Vbml0aW1lKCkgKyAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQpLlRvVW5pdGltZSgpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgQ0ZYX0RhdGVUaW1lJiBvcGVyYXRvci09KGNvbnN0IENGWF9EYXRlVGltZSYgZHQpIHsKLSAgICBGcm9tVW5pdGltZShUb1VuaXRpbWUoKSAtIGR0LlRvVW5pdGltZSgpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgQ0ZYX0RhdGVUaW1lJiBvcGVyYXRvci09KGNvbnN0IEZYX0RBVEVUSU1FJiBkdCkgewotICAgIEZyb21Vbml0aW1lKFRvVW5pdGltZSgpIC0gKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0KS5Ub1VuaXRpbWUoKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIHZpcnR1YWwgYm9vbCBTZXQoaW50MzJfdCB5ZWFyLAotICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbW9udGgsCi0gICAgICAgICAgICAgICAgICAgdWludDhfdCBkYXksCi0gICAgICAgICAgICAgICAgICAgdWludDhfdCBob3VyID0gMCwKLSAgICAgICAgICAgICAgICAgICB1aW50OF90IG1pbnV0ZSA9IDAsCi0gICAgICAgICAgICAgICAgICAgdWludDhfdCBzZWNvbmQgPSAwLAotICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbGxpc2Vjb25kID0gMCk7Ci0gIHZpcnR1YWwgYm9vbCBGcm9tVW5pdGltZShGWF9VTklUSU1FIHQpOwotICB2aXJ0dWFsIEZYX1VOSVRJTUUgVG9Vbml0aW1lKCkgY29uc3Q7Ci0gIHZpcnR1YWwgaW50MzJfdCBHZXRZZWFyKCkgY29uc3Q7Ci0gIHZpcnR1YWwgdWludDhfdCBHZXRNb250aCgpIGNvbnN0OwotICB2aXJ0dWFsIHVpbnQ4X3QgR2V0RGF5KCkgY29uc3Q7Ci0gIHZpcnR1YWwgRlhfV0VFS0RBWSBHZXREYXlPZldlZWsoKSBjb25zdDsKLSAgdmlydHVhbCB1aW50MTZfdCBHZXREYXlPZlllYXIoKSBjb25zdDsKLSAgdmlydHVhbCBpbnQ2NF90IEdldERheU9mQUQoKSBjb25zdDsKLSAgdmlydHVhbCB1aW50OF90IEdldEhvdXIoKSBjb25zdDsKLSAgdmlydHVhbCB1aW50OF90IEdldE1pbnV0ZSgpIGNvbnN0OwotICB2aXJ0dWFsIHVpbnQ4X3QgR2V0U2Vjb25kKCkgY29uc3Q7Ci0gIHZpcnR1YWwgdWludDE2X3QgR2V0TWlsbGlzZWNvbmQoKSBjb25zdDsKLSAgdmlydHVhbCBib29sIEFkZFllYXJzKGludDMyX3QgaVllYXJzKTsKLSAgdmlydHVhbCBib29sIEFkZE1vbnRocyhpbnQzMl90IGlNb250aHMpOwotICB2aXJ0dWFsIGJvb2wgQWRkRGF5cyhpbnQzMl90IGlEYXlzKTsKLSAgdmlydHVhbCBib29sIEFkZEhvdXJzKGludDMyX3QgaUhvdXJzKTsKLSAgdmlydHVhbCBib29sIEFkZE1pbnV0ZXMoaW50MzJfdCBpTWludXRlcyk7Ci0gIHZpcnR1YWwgYm9vbCBBZGRTZWNvbmRzKGludDMyX3QgaVNlY29uZHMpOwotICB2aXJ0dWFsIGJvb2wgQWRkTWlsbGlzZWNvbmRzKGludDMyX3QgaU1pbGxpc2Vjb25kcyk7Ci0gIGZyaWVuZCBDRlhfRGF0ZVRpbWUgb3BlcmF0b3IrKGNvbnN0IENGWF9EYXRlVGltZSYgZHQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfRGF0ZVRpbWUmIGR0MikgewotICAgIENGWF9EYXRlVGltZSBkdDsKLSAgICBkdC5Gcm9tVW5pdGltZShkdDEuVG9Vbml0aW1lKCkgKyBkdDIuVG9Vbml0aW1lKCkpOwotICAgIHJldHVybiBkdDsKLSAgfQotICBmcmllbmQgQ0ZYX0RhdGVUaW1lIG9wZXJhdG9yKyhjb25zdCBDRlhfRGF0ZVRpbWUmIGR0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfREFURVRJTUUmIGR0MikgewotICAgIENGWF9EYXRlVGltZSBkdDsKLSAgICBkdC5Gcm9tVW5pdGltZShkdDEuVG9Vbml0aW1lKCkgKyAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQyKS5Ub1VuaXRpbWUoKSk7Ci0gICAgcmV0dXJuIGR0OwotICB9Ci0gIGZyaWVuZCBDRlhfRGF0ZVRpbWUgb3BlcmF0b3IrKGNvbnN0IEZYX0RBVEVUSU1FJiBkdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9EYXRlVGltZSYgZHQyKSB7Ci0gICAgQ0ZYX0RhdGVUaW1lIGR0OwotICAgIGR0LkZyb21Vbml0aW1lKCgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdDEpLlRvVW5pdGltZSgpICsgZHQyLlRvVW5pdGltZSgpKTsKLSAgICByZXR1cm4gZHQ7Ci0gIH0KLSAgZnJpZW5kIENGWF9EYXRlVGltZSBvcGVyYXRvci0oY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9EYXRlVGltZSYgZHQyKSB7Ci0gICAgQ0ZYX0RhdGVUaW1lIGR0OwotICAgIGR0LkZyb21Vbml0aW1lKGR0MS5Ub1VuaXRpbWUoKSAtIGR0Mi5Ub1VuaXRpbWUoKSk7Ci0gICAgcmV0dXJuIGR0OwotICB9Ci0gIGZyaWVuZCBDRlhfRGF0ZVRpbWUgb3BlcmF0b3ItKGNvbnN0IENGWF9EYXRlVGltZSYgZHQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9EQVRFVElNRSYgZHQyKSB7Ci0gICAgQ0ZYX0RhdGVUaW1lIGR0OwotICAgIGR0LkZyb21Vbml0aW1lKGR0MS5Ub1VuaXRpbWUoKSAtICgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdDIpLlRvVW5pdGltZSgpKTsKLSAgICByZXR1cm4gZHQ7Ci0gIH0KLSAgZnJpZW5kIENGWF9EYXRlVGltZSBvcGVyYXRvci0oY29uc3QgRlhfREFURVRJTUUmIGR0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDIpIHsKLSAgICBDRlhfRGF0ZVRpbWUgZHQ7Ci0gICAgZHQuRnJvbVVuaXRpbWUoKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0MSkuVG9Vbml0aW1lKCkgLSBkdDIuVG9Vbml0aW1lKCkpOwotICAgIHJldHVybiBkdDsKLSAgfQotICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENGWF9EYXRlVGltZSYgZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUmIGR0MikgewotICAgIHJldHVybiBGWFNZU19tZW1jbXAoc3RhdGljX2Nhc3Q8Y29uc3QgRlhfREFURVRJTUUqPihkdDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgRlhfREFURVRJTUUqPihkdDIpLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZYX0RBVEVUSU1FKSkgPT0gMDsKLSAgfQotICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENGWF9EYXRlVGltZSYgZHQxLCBjb25zdCBGWF9EQVRFVElNRSYgZHQyKSB7Ci0gICAgcmV0dXJuIEZYU1lTX21lbWNtcChzdGF0aWNfY2FzdDxjb25zdCBGWF9EQVRFVElNRSo+KGR0MSksICZkdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRlhfREFURVRJTUUpKSA9PSAwOwotICB9Ci0gIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgRlhfREFURVRJTUUmIGR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDIpIHsKLSAgICByZXR1cm4gRlhTWVNfbWVtY21wKCZkdDEsIHN0YXRpY19jYXN0PGNvbnN0IEZYX0RBVEVUSU1FKj4oZHQyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGWF9EQVRFVElNRSkpID09IDA7Ci0gIH0KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDRlhfRGF0ZVRpbWUmIGR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDIpIHsKLSAgICByZXR1cm4gRlhTWVNfbWVtY21wKHN0YXRpY19jYXN0PGNvbnN0IEZYX0RBVEVUSU1FKj4oZHQxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEZYX0RBVEVUSU1FKj4oZHQyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihGWF9EQVRFVElNRSkpICE9IDA7Ci0gIH0KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDRlhfRGF0ZVRpbWUmIGR0MSwgY29uc3QgRlhfREFURVRJTUUmIGR0MikgewotICAgIHJldHVybiBGWFNZU19tZW1jbXAoc3RhdGljX2Nhc3Q8Y29uc3QgRlhfREFURVRJTUUqPihkdDEpLCAmZHQyLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZYX0RBVEVUSU1FKSkgIT0gMDsKLSAgfQotICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEZYX0RBVEVUSU1FJiBkdDEsIGNvbnN0IENGWF9EYXRlVGltZSYgZHQyKSB7Ci0gICAgcmV0dXJuIEZYU1lTX21lbWNtcCgmZHQxLCBzdGF0aWNfY2FzdDxjb25zdCBGWF9EQVRFVElNRSo+KGR0MiksCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoRlhfREFURVRJTUUpKSAhPSAwOwotICB9Ci0gIGZyaWVuZCBib29sIG9wZXJhdG9yPihjb25zdCBDRlhfRGF0ZVRpbWUmIGR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDIpIHsKLSAgICByZXR1cm4gZHQxLlRvVW5pdGltZSgpID4gZHQyLlRvVW5pdGltZSgpOwotICB9Ci0gIGZyaWVuZCBib29sIG9wZXJhdG9yPihjb25zdCBDRlhfRGF0ZVRpbWUmIGR0MSwgY29uc3QgRlhfREFURVRJTUUmIGR0MikgewotICAgIHJldHVybiBkdDEuVG9Vbml0aW1lKCkgPiAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQyKS5Ub1VuaXRpbWUoKTsKLSAgfQotICBmcmllbmQgYm9vbCBvcGVyYXRvcj4oY29uc3QgRlhfREFURVRJTUUmIGR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDIpIHsKLSAgICByZXR1cm4gKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0MSkuVG9Vbml0aW1lKCkgPiBkdDIuVG9Vbml0aW1lKCk7Ci0gIH0KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I+PShjb25zdCBDRlhfRGF0ZVRpbWUmIGR0MSwgY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDIpIHsKLSAgICByZXR1cm4gZHQxLlRvVW5pdGltZSgpID49IGR0Mi5Ub1VuaXRpbWUoKTsKLSAgfQotICBmcmllbmQgYm9vbCBvcGVyYXRvcj49KGNvbnN0IENGWF9EYXRlVGltZSYgZHQxLCBjb25zdCBGWF9EQVRFVElNRSYgZHQyKSB7Ci0gICAgcmV0dXJuIGR0MS5Ub1VuaXRpbWUoKSA+PSAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQyKS5Ub1VuaXRpbWUoKTsKLSAgfQotICBmcmllbmQgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEZYX0RBVEVUSU1FJiBkdDEsIGNvbnN0IENGWF9EYXRlVGltZSYgZHQyKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdDEpLlRvVW5pdGltZSgpID49IGR0Mi5Ub1VuaXRpbWUoKTsKLSAgfQotICBmcmllbmQgYm9vbCBvcGVyYXRvcjwoY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDEsIGNvbnN0IENGWF9EYXRlVGltZSYgZHQyKSB7Ci0gICAgcmV0dXJuIGR0MS5Ub1VuaXRpbWUoKSA8IGR0Mi5Ub1VuaXRpbWUoKTsKLSAgfQotICBmcmllbmQgYm9vbCBvcGVyYXRvcjwoY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDEsIGNvbnN0IEZYX0RBVEVUSU1FJiBkdDIpIHsKLSAgICByZXR1cm4gZHQxLlRvVW5pdGltZSgpIDwgKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0MikuVG9Vbml0aW1lKCk7Ci0gIH0KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEZYX0RBVEVUSU1FJiBkdDEsIGNvbnN0IENGWF9EYXRlVGltZSYgZHQyKSB7Ci0gICAgcmV0dXJuICgoY29uc3QgQ0ZYX0RhdGVUaW1lJilkdDEpLlRvVW5pdGltZSgpIDwgZHQyLlRvVW5pdGltZSgpOwotICB9Ci0gIGZyaWVuZCBib29sIG9wZXJhdG9yPD0oY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdDEsIGNvbnN0IENGWF9EYXRlVGltZSYgZHQyKSB7Ci0gICAgcmV0dXJuIGR0MS5Ub1VuaXRpbWUoKSA8PSBkdDIuVG9Vbml0aW1lKCk7Ci0gIH0KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8PShjb25zdCBDRlhfRGF0ZVRpbWUmIGR0MSwgY29uc3QgRlhfREFURVRJTUUmIGR0MikgewotICAgIHJldHVybiBkdDEuVG9Vbml0aW1lKCkgPD0gKChjb25zdCBDRlhfRGF0ZVRpbWUmKWR0MikuVG9Vbml0aW1lKCk7Ci0gIH0KLSAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8PShjb25zdCBGWF9EQVRFVElNRSYgZHQxLCBjb25zdCBDRlhfRGF0ZVRpbWUmIGR0MikgewotICAgIHJldHVybiAoKGNvbnN0IENGWF9EYXRlVGltZSYpZHQxKS5Ub1VuaXRpbWUoKSA8PSBkdDIuVG9Vbml0aW1lKCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEZYX0RBVEVUSU1FIG1fRGF0ZVRpbWU7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GR0FTX0xPQ0FMSVpBVElPTl9GR0FTX0RBVEVUSU1FX0hfCmRpZmYgLS1naXQgYS94ZmEvZmdhcy9sb2NhbGl6YXRpb24vZmdhc19sb2NhbGUuY3BwIGIveGZhL2ZnYXMvbG9jYWxpemF0aW9uL2ZnYXNfbG9jYWxlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q1Mzg0MS4uMDAwMDAwMAotLS0gYS94ZmEvZmdhcy9sb2NhbGl6YXRpb24vZmdhc19sb2NhbGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDc2NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZmdhcy9sb2NhbGl6YXRpb24vZmdhc19sb2NhbGUuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dC5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfeG1sLmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvbG9jYWxpemF0aW9uL2ZnYXNfbG9jYWxlaW1wLmgiCi0KLSNkZWZpbmUgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZUhhc2ggMHhiZGU5YWJkZQotI2RlZmluZSBGWF9MT0NBTEVDQVRFR09SWV9UaW1lSGFzaCAweDJkNzFiMDBmCi0jZGVmaW5lIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lSGFzaCAweDE1OGM3MmVkCi0jZGVmaW5lIEZYX0xPQ0FMRUNBVEVHT1JZX051bUhhc2ggMHgwYjRmZjg3MAotI2RlZmluZSBGWF9MT0NBTEVDQVRFR09SWV9UZXh0SGFzaCAweDJkMDhhZjg1Ci0jZGVmaW5lIEZYX0xPQ0FMRUNBVEVHT1JZX1plcm9IYXNoIDB4NTY4Y2I1MDAKLSNkZWZpbmUgRlhfTE9DQUxFQ0FURUdPUllfTnVsbEhhc2ggMHgwNTI5MzFiYgotCi1zdHJ1Y3QgRlhfTE9DQUxFU1VCQ0FURUdPUllJTkZPIHsKLSAgdWludDMyX3QgdUhhc2g7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwTmFtZTsKLSAgaW50MzJfdCBlU3ViQ2F0ZWdvcnk7Ci19OwotCi1zdGF0aWMgY29uc3QgRlhfTE9DQUxFU1VCQ0FURUdPUllJTkZPIGdfRlhMb2NhbGVEYXRlVGltZVN1YkNhdERhdGFbXSA9IHsKLSAgICB7MHgxNGRhMjEyNSwgTCJkZWZhdWx0IiwgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0fSwKLSAgICB7MHg5MDQxZDRiMCwgTCJzaG9ydCIsIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnR9LAotICAgIHsweGEwODRhMzgxLCBMIm1lZGl1bSIsIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtfSwKLSAgICB7MHhjZGNlNTZiMywgTCJmdWxsIiwgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9GdWxsfSwKLSAgICB7MHhmNmI0YWZiMCwgTCJsb25nIiwgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9Mb25nfSwKLX07Ci1zdGF0aWMgY29uc3QgaW50MzJfdCBnX2lGWExvY2FsZURhdGVUaW1lU3ViQ2F0Q291bnQgPQotICAgIHNpemVvZihnX0ZYTG9jYWxlRGF0ZVRpbWVTdWJDYXREYXRhKSAvIHNpemVvZihGWF9MT0NBTEVTVUJDQVRFR09SWUlORk8pOwotCi1zdGF0aWMgY29uc3QgRlhfTE9DQUxFU1VCQ0FURUdPUllJTkZPIGdfRlhMb2NhbGVOdW1TdWJDYXREYXRhW10gPSB7Ci0gICAgezB4NDZmOTU1MzEsIEwicGVyY2VudCIsIEZYX0xPQ0FMRU5VTVBBVFRFUk5fUGVyY2VudH0sCi0gICAgezB4NGM0ZThhY2IsIEwiY3VycmVuY3kiLCBGWF9MT0NBTEVOVU1QQVRURVJOX0N1cnJlbmN5fSwKLSAgICB7MHg1NDAzNGMyZiwgTCJkZWNpbWFsIiwgRlhfTE9DQUxFTlVNUEFUVEVSTl9EZWNpbWFsfSwKLSAgICB7MHg3NTY4ZTZhZSwgTCJpbnRlZ2VyIiwgRlhfTE9DQUxFTlVNUEFUVEVSTl9JbnRlZ2VyfSwKLX07Ci1zdGF0aWMgY29uc3QgaW50MzJfdCBnX2lGWExvY2FsZU51bVN1YkNhdENvdW50ID0KLSAgICBzaXplb2YoZ19GWExvY2FsZU51bVN1YkNhdERhdGEpIC8gc2l6ZW9mKEZYX0xPQ0FMRVNVQkNBVEVHT1JZSU5GTyk7Ci0KLXN0cnVjdCBGWF9MT0NBTEVUSU1FWk9ORUlORk8gewotICB1aW50MzJfdCB1SGFzaDsKLSAgaW50MTZfdCBpSG91cjsKLSAgaW50MTZfdCBpTWludXRlOwotfTsKLQotc3RhdGljIGNvbnN0IEZYX0xPQ0FMRVRJTUVaT05FSU5GTyBnX0ZYTG9jYWxlVGltZVpvbmVEYXRhW10gPSB7Ci0gICAge0ZYQlNUUl9JRCgwLCAnQycsICdEJywgJ1QnKSwgLTUsIDB9LCB7RlhCU1RSX0lEKDAsICdDJywgJ1MnLCAnVCcpLCAtNiwgMH0sCi0gICAge0ZYQlNUUl9JRCgwLCAnRScsICdEJywgJ1QnKSwgLTQsIDB9LCB7RlhCU1RSX0lEKDAsICdFJywgJ1MnLCAnVCcpLCAtNSwgMH0sCi0gICAge0ZYQlNUUl9JRCgwLCAnTScsICdEJywgJ1QnKSwgLTYsIDB9LCB7RlhCU1RSX0lEKDAsICdNJywgJ1MnLCAnVCcpLCAtNywgMH0sCi0gICAge0ZYQlNUUl9JRCgwLCAnUCcsICdEJywgJ1QnKSwgLTcsIDB9LCB7RlhCU1RSX0lEKDAsICdQJywgJ1MnLCAnVCcpLCAtOCwgMH0sCi19OwotCi1zdGF0aWMgY29uc3QgRlhfV0NIQVIgZ3Nfd3NUaW1lU3ltYm9sc1tdID0gTCJoSGtLTVNGQXpaIjsKLXN0YXRpYyBjb25zdCBGWF9XQ0hBUiBnc193c0RhdGVTeW1ib2xzW10gPSBMIkRKTUVlR2dZd1ciOwotc3RhdGljIGNvbnN0IEZYX1dDSEFSIGdzX3dzQ29uc3RDaGFyc1tdID0gTCIsLTovLiAiOwotCi1zdGF0aWMgaW50MzJfdCBGWF9QYXJzZVRpbWVab25lKGNvbnN0IEZYX1dDSEFSKiBwU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1RJTUVaT05FJiB0eikgewotICB0ei50ekhvdXIgPSAwOwotICB0ei50ek1pbnV0ZSA9IDA7Ci0gIGlmIChpTGVuIDwgMCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIGludDMyX3QgaVN0YXJ0ID0gMTsKLSAgaW50MzJfdCBpRW5kID0gaVN0YXJ0ICsgMjsKLSAgd2hpbGUgKGlTdGFydCA8IGlMZW4gJiYgaVN0YXJ0IDwgaUVuZCkgewotICAgIHR6LnR6SG91ciA9IHR6LnR6SG91ciAqIDEwICsgcFN0cltpU3RhcnQrK10gLSAnMCc7Ci0gIH0KLSAgaWYgKGlTdGFydCA8IGlMZW4gJiYgcFN0cltpU3RhcnRdID09ICc6JykgewotICAgIGlTdGFydCsrOwotICB9Ci0gIGlFbmQgPSBpU3RhcnQgKyAyOwotICB3aGlsZSAoaVN0YXJ0IDwgaUxlbiAmJiBpU3RhcnQgPCBpRW5kKSB7Ci0gICAgdHoudHpNaW51dGUgPSB0ei50ek1pbnV0ZSAqIDEwICsgcFN0cltpU3RhcnQrK10gLSAnMCc7Ci0gIH0KLSAgaWYgKHBTdHJbMF0gPT0gJy0nKSB7Ci0gICAgdHoudHpIb3VyID0gLXR6LnR6SG91cjsKLSAgfQotICByZXR1cm4gaVN0YXJ0OwotfQotCi1jbGFzcyBDRlhfTENOdW1lcmljIHsKLSBwdWJsaWM6Ci0gIENGWF9MQ051bWVyaWMoKTsKLSAgQ0ZYX0xDTnVtZXJpYyhpbnQ2NF90IGludGVncmFsLAotICAgICAgICAgICAgICAgIHVpbnQzMl90IGZyYWN0aW9uYWwgPSAwLAotICAgICAgICAgICAgICAgIGludDMyX3QgZXhwb25lbnQgPSAwKTsKLSAgZXhwbGljaXQgQ0ZYX0xDTnVtZXJpYyhGWF9GTE9BVCBkYlJldFZhbHVlKTsKLSAgZXhwbGljaXQgQ0ZYX0xDTnVtZXJpYyhkb3VibGUgZGJ2YWx1ZSk7Ci0gIGV4cGxpY2l0IENGWF9MQ051bWVyaWMoQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtZXJpYyk7Ci0KLSAgRlhfRkxPQVQgR2V0RmxvYXQoKSBjb25zdDsKLSAgZG91YmxlIEdldERvdWJsZSgpIGNvbnN0OwotICBDRlhfV2lkZVN0cmluZyBUb1N0cmluZygpIGNvbnN0OwotICBDRlhfV2lkZVN0cmluZyBUb1N0cmluZyhpbnQzMl90IG5UcmVhZGluZywgYm9vbCBiVHJpbVRhaWxaZXJvcykgY29uc3Q7Ci0KLSAgaW50NjRfdCBtX0ludGVncmFsOwotICB1aW50MzJfdCBtX0ZyYWN0aW9uYWw7Ci0gIGludDMyX3QgbV9FeHBvbmVudDsKLX07Ci0KLXN0YXRpYyBib29sIEZYX1dTdHJpbmdUb051bWVyaWMoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9MQ051bWVyaWMmIGxjbnVtKSB7Ci0gIGxjbnVtLm1fSW50ZWdyYWwgPSAwOwotICBsY251bS5tX0ZyYWN0aW9uYWwgPSAwOwotICBsY251bS5tX0V4cG9uZW50ID0gMDsKLQotICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGNvbnN0IGludDMyX3QgbkludGVncmFsTWF4TGVuID0gMTc7Ci0gIGludDMyX3QgY2MgPSAwOwotICBib29sIGJOZWdhdGl2ZSA9IGZhbHNlOwotICBib29sIGJFeHBTaWduID0gZmFsc2U7Ci0gIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSB3c1ZhbHVlLmNfc3RyKCk7Ci0gIGludDMyX3QgbGVuID0gd3NWYWx1ZS5HZXRMZW5ndGgoKTsKLSAgd2hpbGUgKGNjIDwgbGVuICYmIEZYU1lTX2lzd3NwYWNlKHN0cltjY10pKQotICAgIGNjKys7Ci0KLSAgaWYgKGNjID49IGxlbikKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHN0cltjY10gPT0gJysnKSB7Ci0gICAgY2MrKzsKLSAgfSBlbHNlIGlmIChzdHJbY2NdID09ICctJykgewotICAgIGJOZWdhdGl2ZSA9IHRydWU7Ci0gICAgY2MrKzsKLSAgfQotICBpbnQzMl90IG5JbnRlZ3JhbExlbiA9IDA7Ci0gIHdoaWxlIChjYyA8IGxlbikgewotICAgIGlmIChzdHJbY2NdID09ICcuJykKLSAgICAgIGJyZWFrOwotCi0gICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgaWYgKChzdHJbY2NdID09ICdFJyB8fCBzdHJbY2NdID09ICdlJykpCi0gICAgICAgIGJyZWFrOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAobkludGVncmFsTGVuIDwgbkludGVncmFsTWF4TGVuKSB7Ci0gICAgICBsY251bS5tX0ludGVncmFsID0gbGNudW0ubV9JbnRlZ3JhbCAqIDEwICsgc3RyW2NjXSAtICcwJzsKLSAgICAgIG5JbnRlZ3JhbExlbisrOwotICAgIH0KLSAgICBjYysrOwotICB9Ci0KLSAgbGNudW0ubV9JbnRlZ3JhbCA9IGJOZWdhdGl2ZSA/IC1sY251bS5tX0ludGVncmFsIDogbGNudW0ubV9JbnRlZ3JhbDsKLSAgaWYgKGNjIDwgbGVuICYmIHN0cltjY10gPT0gJy4nKSB7Ci0gICAgaW50IHNjYWxlID0gMDsKLSAgICBkb3VibGUgZnJhY3Rpb24gPSAwLjA7Ci0gICAgY2MrKzsKLSAgICB3aGlsZSAoY2MgPCBsZW4pIHsKLSAgICAgIGlmIChzY2FsZSA+PSBGWFNZU19GcmFjdGlvbmFsU2NhbGVDb3VudCgpKSB7Ci0gICAgICAgIHdoaWxlIChjYyA8IGxlbikgewotICAgICAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYysrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKSB7Ci0gICAgICAgIGlmICgoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpKQotICAgICAgICAgIGJyZWFrOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBmcmFjdGlvbiArPSBGWFNZU19GcmFjdGlvbmFsU2NhbGUoc2NhbGUsIEZYU1lTX3RvRGVjaW1hbERpZ2l0KHN0cltjY10pKTsKLSAgICAgIHNjYWxlKys7Ci0gICAgICBjYysrOwotICAgIH0KLSAgICBsY251bS5tX0ZyYWN0aW9uYWwgPSAodWludDMyX3QpKGZyYWN0aW9uICogNDI5NDk2NzI5Ni4wKTsKLSAgfQotICBpZiAoY2MgPCBsZW4gJiYgKHN0cltjY10gPT0gJ0UnIHx8IHN0cltjY10gPT0gJ2UnKSkgewotICAgIGNjKys7Ci0gICAgaWYgKGNjIDwgbGVuKSB7Ci0gICAgICBpZiAoc3RyW2NjXSA9PSAnKycpIHsKLSAgICAgICAgY2MrKzsKLSAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnLScpIHsKLSAgICAgICAgYkV4cFNpZ24gPSB0cnVlOwotICAgICAgICBjYysrOwotICAgICAgfQotICAgIH0KLSAgICB3aGlsZSAoY2MgPCBsZW4pIHsKLSAgICAgIGlmIChGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgbGNudW0ubV9FeHBvbmVudCA9IGxjbnVtLm1fRXhwb25lbnQgKiAxMCArIHN0cltjY10gLSAnMCc7Ci0gICAgICBjYysrOwotICAgIH0KLSAgICBsY251bS5tX0V4cG9uZW50ID0gYkV4cFNpZ24gPyAtbGNudW0ubV9FeHBvbmVudCA6IGxjbnVtLm1fRXhwb25lbnQ7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUNGWF9MQ051bWVyaWM6OkNGWF9MQ051bWVyaWMoKSB7Ci0gIG1fSW50ZWdyYWwgPSAwOwotICBtX0ZyYWN0aW9uYWwgPSAwOwotICBtX0V4cG9uZW50ID0gMDsKLX0KLUNGWF9MQ051bWVyaWM6OkNGWF9MQ051bWVyaWMoaW50NjRfdCBpbnRlZ3JhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZnJhY3Rpb25hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBleHBvbmVudCkgewotICBtX0ludGVncmFsID0gaW50ZWdyYWw7Ci0gIG1fRnJhY3Rpb25hbCA9IGZyYWN0aW9uYWw7Ci0gIG1fRXhwb25lbnQgPSBleHBvbmVudDsKLX0KLUNGWF9MQ051bWVyaWM6OkNGWF9MQ051bWVyaWMoRlhfRkxPQVQgZGJSZXRWYWx1ZSkgewotICBtX0ludGVncmFsID0gKGludDY0X3QpZGJSZXRWYWx1ZTsKLSAgbV9GcmFjdGlvbmFsID0gKHVpbnQzMl90KSgoKGRiUmV0VmFsdWUgPiAwKSA/IChkYlJldFZhbHVlIC0gbV9JbnRlZ3JhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChtX0ludGVncmFsIC0gZGJSZXRWYWx1ZSkpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA0Mjk0OTY3Mjk2KTsKLSAgbV9FeHBvbmVudCA9IDA7Ci19Ci1DRlhfTENOdW1lcmljOjpDRlhfTENOdW1lcmljKGRvdWJsZSBkYnZhbHVlKSB7Ci0gIG1fSW50ZWdyYWwgPSAoaW50NjRfdClkYnZhbHVlOwotICBtX0ZyYWN0aW9uYWwgPSAodWludDMyX3QpKAotICAgICAgKChkYnZhbHVlID4gMCkgPyAoZGJ2YWx1ZSAtIG1fSW50ZWdyYWwpIDogKG1fSW50ZWdyYWwgLSBkYnZhbHVlKSkgKgotICAgICAgNDI5NDk2NzI5Nik7Ci0gIG1fRXhwb25lbnQgPSAwOwotfQotQ0ZYX0xDTnVtZXJpYzo6Q0ZYX0xDTnVtZXJpYyhDRlhfV2lkZVN0cmluZyYgd3NOdW1lcmljKSB7Ci0gIEZYX1dTdHJpbmdUb051bWVyaWMod3NOdW1lcmljLCAqdGhpcyk7Ci19Ci1GWF9GTE9BVCBDRlhfTENOdW1lcmljOjpHZXRGbG9hdCgpIGNvbnN0IHsKLSAgRlhfRkxPQVQgZGJSZXRWYWx1ZSA9IG1fRnJhY3Rpb25hbCAvIDQyOTQ5NjcyOTYuMGY7Ci0gIGRiUmV0VmFsdWUgPSBtX0ludGVncmFsICsgKG1fSW50ZWdyYWwgPj0gMCA/IGRiUmV0VmFsdWUgOiAtZGJSZXRWYWx1ZSk7Ci0gIGlmIChtX0V4cG9uZW50ICE9IDApIHsKLSAgICBkYlJldFZhbHVlICo9IEZYU1lTX3BvdygxMCwgKEZYX0ZMT0FUKW1fRXhwb25lbnQpOwotICB9Ci0gIHJldHVybiBkYlJldFZhbHVlOwotfQotZG91YmxlIENGWF9MQ051bWVyaWM6OkdldERvdWJsZSgpIGNvbnN0IHsKLSAgZG91YmxlIHZhbHVlID0gbV9GcmFjdGlvbmFsIC8gNDI5NDk2NzI5Ni4wOwotICB2YWx1ZSA9IG1fSW50ZWdyYWwgKyAobV9JbnRlZ3JhbCA+PSAwID8gdmFsdWUgOiAtdmFsdWUpOwotICBpZiAobV9FeHBvbmVudCAhPSAwKSB7Ci0gICAgdmFsdWUgKj0gRlhTWVNfcG93KDEwLCAoRlhfRkxPQVQpbV9FeHBvbmVudCk7Ci0gIH0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi1DRlhfV2lkZVN0cmluZyBDRlhfTENOdW1lcmljOjpUb1N0cmluZygpIGNvbnN0IHsKLSAgcmV0dXJuIFRvU3RyaW5nKDgsIHRydWUpOwotfQotCi1DRlhfV2lkZVN0cmluZyBDRlhfTENOdW1lcmljOjpUb1N0cmluZyhpbnQzMl90IG5UcmVhZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlRyaW1UYWlsWmVyb3MpIGNvbnN0IHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXQ7Ci0gIHdzRm9ybWF0LkZvcm1hdChMIiUlLiVkZiIsIG5UcmVhZGluZyk7Ci0gIENGWF9XaWRlU3RyaW5nIHdzUmVzdWx0OwotICB3c1Jlc3VsdC5Gb3JtYXQod3NGb3JtYXQuY19zdHIoKSwgR2V0RG91YmxlKCkpOwotICBpZiAoYlRyaW1UYWlsWmVyb3MgJiYgblRyZWFkaW5nID4gMCkgewotICAgIHdzUmVzdWx0LlRyaW1SaWdodChMIjAiKTsKLSAgICB3c1Jlc3VsdC5UcmltUmlnaHQoTCIuIik7Ci0gIH0KLSAgcmV0dXJuIHdzUmVzdWx0OwotfQotCi1DRlhfRm9ybWF0U3RyaW5nOjpDRlhfRm9ybWF0U3RyaW5nKElGWF9Mb2NhbGVNZ3IqIHBMb2NhbGVNZ3IsIGJvb2wgYlVzZUxDSUQpCi0gICAgOiBtX3BMb2NhbGVNZ3IocExvY2FsZU1nciksIG1fYlVzZUxDSUQoYlVzZUxDSUQpIHt9Ci0KLUNGWF9Gb3JtYXRTdHJpbmc6On5DRlhfRm9ybWF0U3RyaW5nKCkge30KLQotdm9pZCBDRlhfRm9ybWF0U3RyaW5nOjpTcGxpdEZvcm1hdFN0cmluZygKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXRTdHJpbmcsCi0gICAgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+JiB3c1BhdHRlcm5zKSB7Ci0gIGludDMyX3QgaVN0ckxlbiA9IHdzRm9ybWF0U3RyaW5nLkdldExlbmd0aCgpOwotICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IHdzRm9ybWF0U3RyaW5nLmNfc3RyKCk7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwVG9rZW4gPSBwU3RyOwotICBjb25zdCBGWF9XQ0hBUiogcEVuZCA9IHBTdHIgKyBpU3RyTGVuOwotICBib29sIGlRdW90ZSA9IGZhbHNlOwotICB3aGlsZSAodHJ1ZSkgewotICAgIGlmIChwU3RyID49IHBFbmQpIHsKLSAgICAgIHdzUGF0dGVybnMucHVzaF9iYWNrKENGWF9XaWRlU3RyaW5nKHBUb2tlbiwgcFN0ciAtIHBUb2tlbikpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoKnBTdHIgPT0gJ1wnJykgewotICAgICAgaVF1b3RlID0gIWlRdW90ZTsKLSAgICB9IGVsc2UgaWYgKCpwU3RyID09IEwnfCcgJiYgIWlRdW90ZSkgewotICAgICAgd3NQYXR0ZXJucy5wdXNoX2JhY2soQ0ZYX1dpZGVTdHJpbmcocFRva2VuLCBwU3RyIC0gcFRva2VuKSk7Ci0gICAgICBwVG9rZW4gPSBwU3RyICsgMTsKLSAgICB9Ci0gICAgcFN0cisrOwotICB9Ci19Ci0KLXN0YXRpYyBDRlhfV2lkZVN0cmluZyBGWF9HZXRMaXRlcmFsVGV4dChjb25zdCBGWF9XQ0hBUiogcFN0clBhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVBhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuUGF0dGVybikgewotICBDRlhfV2lkZVN0cmluZyB3c091dHB1dDsKLSAgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSAhPSAnXCcnKSB7Ci0gICAgcmV0dXJuIHdzT3V0cHV0OwotICB9Ci0gIGlQYXR0ZXJuKys7Ci0gIGludDMyX3QgaVF1b3RlID0gMTsKLSAgd2hpbGUgKGlQYXR0ZXJuIDwgaUxlblBhdHRlcm4pIHsKLSAgICBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dID09ICdcJycpIHsKLSAgICAgIGlRdW90ZSsrOwotICAgICAgaWYgKChpUGF0dGVybiArIDEgPj0gaUxlblBhdHRlcm4pIHx8Ci0gICAgICAgICAgKChwU3RyUGF0dGVybltpUGF0dGVybiArIDFdICE9ICdcJycpICYmIChpUXVvdGUgJSAyID09IDApKSkgewotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlRdW90ZSsrOwotICAgICAgfQotICAgICAgaVBhdHRlcm4rKzsKLSAgICB9IGVsc2UgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSA9PSAnXFwnICYmIChpUGF0dGVybiArIDEgPCBpTGVuUGF0dGVybikgJiYKLSAgICAgICAgICAgICAgIHBTdHJQYXR0ZXJuW2lQYXR0ZXJuICsgMV0gPT0gJ3UnKSB7Ci0gICAgICBpbnQzMl90IGlLZXlWYWx1ZSA9IDA7Ci0gICAgICBpUGF0dGVybiArPSAyOwotICAgICAgaW50MzJfdCBpID0gMDsKLSAgICAgIHdoaWxlIChpUGF0dGVybiA8IGlMZW5QYXR0ZXJuICYmIGkrKyA8IDQpIHsKLSAgICAgICAgRlhfV0NIQVIgY2ggPSBwU3RyUGF0dGVybltpUGF0dGVybisrXTsKLSAgICAgICAgaWYgKChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSkgewotICAgICAgICAgIGlLZXlWYWx1ZSA9IGlLZXlWYWx1ZSAqIDE2ICsgY2ggLSAnMCc7Ci0gICAgICAgIH0gZWxzZSBpZiAoKGNoID49ICdhJyAmJiBjaCA8PSAnZicpKSB7Ci0gICAgICAgICAgaUtleVZhbHVlID0gaUtleVZhbHVlICogMTYgKyBjaCAtICdhJyArIDEwOwotICAgICAgICB9IGVsc2UgaWYgKChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSkgewotICAgICAgICAgIGlLZXlWYWx1ZSA9IGlLZXlWYWx1ZSAqIDE2ICsgY2ggLSAnQScgKyAxMDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGlLZXlWYWx1ZSAhPSAwKSB7Ci0gICAgICAgIHdzT3V0cHV0ICs9IChGWF9XQ0hBUikoaUtleVZhbHVlICYgMHgwMDAwRkZGRik7Ci0gICAgICB9Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgd3NPdXRwdXQgKz0gcFN0clBhdHRlcm5baVBhdHRlcm4rK107Ci0gIH0KLSAgcmV0dXJuIHdzT3V0cHV0OwotfQotc3RhdGljIENGWF9XaWRlU3RyaW5nIEZYX0dldExpdGVyYWxUZXh0UmV2ZXJzZShjb25zdCBGWF9XQ0hBUiogcFN0clBhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlQYXR0ZXJuKSB7Ci0gIENGWF9XaWRlU3RyaW5nIHdzT3V0cHV0OwotICBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dICE9ICdcJycpIHsKLSAgICByZXR1cm4gd3NPdXRwdXQ7Ci0gIH0KLSAgaVBhdHRlcm4tLTsKLSAgaW50MzJfdCBpUXVvdGUgPSAxOwotICB3aGlsZSAoaVBhdHRlcm4gPj0gMCkgewotICAgIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gPT0gJ1wnJykgewotICAgICAgaVF1b3RlKys7Ci0gICAgICBpZiAoaVBhdHRlcm4gLSAxID49IDAgfHwKLSAgICAgICAgICAoKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuIC0gMV0gIT0gJ1wnJykgJiYgKGlRdW90ZSAlIDIgPT0gMCkpKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaVF1b3RlKys7Ci0gICAgICBpUGF0dGVybi0tOwotICAgIH0gZWxzZSBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dID09ICdcXCcgJiYKLSAgICAgICAgICAgICAgIHBTdHJQYXR0ZXJuW2lQYXR0ZXJuICsgMV0gPT0gJ3UnKSB7Ci0gICAgICBpUGF0dGVybi0tOwotICAgICAgaW50MzJfdCBpS2V5VmFsdWUgPSAwOwotICAgICAgaW50MzJfdCBpTGVuID0gd3NPdXRwdXQuR2V0TGVuZ3RoKCk7Ci0gICAgICBpbnQzMl90IGkgPSAxOwotICAgICAgZm9yICg7IGkgPCBpTGVuICYmIGkgPCA1OyBpKyspIHsKLSAgICAgICAgRlhfV0NIQVIgY2ggPSB3c091dHB1dFtpXTsKLSAgICAgICAgaWYgKChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSkgewotICAgICAgICAgIGlLZXlWYWx1ZSA9IGlLZXlWYWx1ZSAqIDE2ICsgY2ggLSAnMCc7Ci0gICAgICAgIH0gZWxzZSBpZiAoKGNoID49ICdhJyAmJiBjaCA8PSAnZicpKSB7Ci0gICAgICAgICAgaUtleVZhbHVlID0gaUtleVZhbHVlICogMTYgKyBjaCAtICdhJyArIDEwOwotICAgICAgICB9IGVsc2UgaWYgKChjaCA+PSAnQScgJiYgY2ggPD0gJ0YnKSkgewotICAgICAgICAgIGlLZXlWYWx1ZSA9IGlLZXlWYWx1ZSAqIDE2ICsgY2ggLSAnQScgKyAxMDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGlLZXlWYWx1ZSAhPSAwKSB7Ci0gICAgICAgIHdzT3V0cHV0LkRlbGV0ZSgwLCBpKTsKLSAgICAgICAgd3NPdXRwdXQgPSAoRlhfV0NIQVIpKGlLZXlWYWx1ZSAmIDB4MDAwMEZGRkYpICsgd3NPdXRwdXQ7Ci0gICAgICB9Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgd3NPdXRwdXQgPSBwU3RyUGF0dGVybltpUGF0dGVybi0tXSArIHdzT3V0cHV0OwotICB9Ci0gIHJldHVybiB3c091dHB1dDsKLX0KLUZYX0xPQ0FMRUNBVEVHT1JZIENGWF9Gb3JtYXRTdHJpbmc6OkdldENhdGVnb3J5KAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIHsKLSAgRlhfTE9DQUxFQ0FURUdPUlkgZUNhdGVnb3J5ID0gRlhfTE9DQUxFQ0FURUdPUllfVW5rbm93bjsKLSAgaW50MzJfdCBjY2YgPSAwOwotICBpbnQzMl90IGlMZW5mID0gd3NQYXR0ZXJuLkdldExlbmd0aCgpOwotICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IHdzUGF0dGVybi5jX3N0cigpOwotICBib29sIGJCcmFjZU9wZW4gPSBmYWxzZTsKLSAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ29uc3RDaGFycyhnc193c0NvbnN0Q2hhcnMpOwotICB3aGlsZSAoY2NmIDwgaUxlbmYpIHsKLSAgICBpZiAocFN0cltjY2ZdID09ICdcJycpIHsKLSAgICAgIEZYX0dldExpdGVyYWxUZXh0KHBTdHIsIGNjZiwgaUxlbmYpOwotICAgIH0gZWxzZSBpZiAoIWJCcmFjZU9wZW4gJiYgd3NDb25zdENoYXJzLkZpbmQocFN0cltjY2ZdKSA9PSAtMSkgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDYXRlZ29yeShwU3RyW2NjZl0pOwotICAgICAgY2NmKys7Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpZiAoY2NmID09IGlMZW5mKSB7Ci0gICAgICAgICAgcmV0dXJuIGVDYXRlZ29yeTsKLSAgICAgICAgfQotICAgICAgICBpZiAocFN0cltjY2ZdID09ICcuJyB8fCBwU3RyW2NjZl0gPT0gJygnKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAneycpIHsKLSAgICAgICAgICBiQnJhY2VPcGVuID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB3c0NhdGVnb3J5ICs9IHBTdHJbY2NmXTsKLSAgICAgICAgY2NmKys7Ci0gICAgICB9Ci0gICAgICB1aW50MzJfdCBkd0hhc2ggPSBGWF9IYXNoQ29kZV9HZXRXKHdzQ2F0ZWdvcnkuQXNTdHJpbmdDKCksIGZhbHNlKTsKLSAgICAgIGlmIChkd0hhc2ggPT0gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZUhhc2gpIHsKLSAgICAgICAgaWYgKGVDYXRlZ29yeSA9PSBGWF9MT0NBTEVDQVRFR09SWV9UaW1lKSB7Ci0gICAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lOwotICAgICAgICB9Ci0gICAgICAgIGVDYXRlZ29yeSA9IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGU7Ci0gICAgICB9IGVsc2UgaWYgKGR3SGFzaCA9PSBGWF9MT0NBTEVDQVRFR09SWV9UaW1lSGFzaCkgewotICAgICAgICBpZiAoZUNhdGVnb3J5ID09IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGUpIHsKLSAgICAgICAgICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWU7Ci0gICAgICAgIH0KLSAgICAgICAgZUNhdGVnb3J5ID0gRlhfTE9DQUxFQ0FURUdPUllfVGltZTsKLSAgICAgIH0gZWxzZSBpZiAoZHdIYXNoID09IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lSGFzaCkgewotICAgICAgICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWU7Ci0gICAgICB9IGVsc2UgaWYgKGR3SGFzaCA9PSBGWF9MT0NBTEVDQVRFR09SWV9UZXh0SGFzaCkgewotICAgICAgICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfVGV4dDsKLSAgICAgIH0gZWxzZSBpZiAoZHdIYXNoID09IEZYX0xPQ0FMRUNBVEVHT1JZX051bUhhc2gpIHsKLSAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX051bTsKLSAgICAgIH0gZWxzZSBpZiAoZHdIYXNoID09IEZYX0xPQ0FMRUNBVEVHT1JZX1plcm9IYXNoKSB7Ci0gICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9aZXJvOwotICAgICAgfSBlbHNlIGlmIChkd0hhc2ggPT0gRlhfTE9DQUxFQ0FURUdPUllfTnVsbEhhc2gpIHsKLSAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX051bGw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gPT0gJ30nKSB7Ci0gICAgICBiQnJhY2VPcGVuID0gZmFsc2U7Ci0gICAgfQotICAgIGNjZisrOwotICB9Ci0gIHJldHVybiBlQ2F0ZWdvcnk7Ci19Ci1zdGF0aWMgdWludDE2X3QgRlhfV1N0cmluZ1RvTENJRChjb25zdCBGWF9XQ0hBUiogcHN0ckxDSUQpIHsKLSAgaWYgKCFwc3RyTENJRCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHdjaGFyX3QqIHBFbmQ7Ci0gIHJldHVybiAodWludDE2X3Qpd2NzdG9sKCh3Y2hhcl90Kilwc3RyTENJRCwgJnBFbmQsIDE2KTsKLX0KLXVpbnQxNl90IENGWF9Gb3JtYXRTdHJpbmc6OkdldExDSUQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgewotICByZXR1cm4gRlhfV1N0cmluZ1RvTENJRChHZXRMb2NhbGVOYW1lKHdzUGF0dGVybikuY19zdHIoKSk7Ci19Ci1DRlhfV2lkZVN0cmluZyBDRlhfRm9ybWF0U3RyaW5nOjpHZXRMb2NhbGVOYW1lKAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIHsKLSAgaW50MzJfdCBjY2YgPSAwOwotICBpbnQzMl90IGlMZW5mID0gd3NQYXR0ZXJuLkdldExlbmd0aCgpOwotICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IHdzUGF0dGVybi5jX3N0cigpOwotICB3aGlsZSAoY2NmIDwgaUxlbmYpIHsKLSAgICBpZiAocFN0cltjY2ZdID09ICdcJycpIHsKLSAgICAgIEZYX0dldExpdGVyYWxUZXh0KHBTdHIsIGNjZiwgaUxlbmYpOwotICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdID09ICcoJykgewotICAgICAgY2NmKys7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c0xDSUQ7Ci0gICAgICB3aGlsZSAoY2NmIDwgaUxlbmYgJiYgcFN0cltjY2ZdICE9ICcpJykgewotICAgICAgICB3c0xDSUQgKz0gcFN0cltjY2YrK107Ci0gICAgICB9Ci0gICAgICByZXR1cm4gd3NMQ0lEOwotICAgIH0KLSAgICBjY2YrKzsKLSAgfQotICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLX0KLUlGWF9Mb2NhbGUqIENGWF9Gb3JtYXRTdHJpbmc6OkdldFRleHRGb3JtYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQdXJnZVBhdHRlcm4pIHsKLSAgSUZYX0xvY2FsZSogcExvY2FsZSA9IG51bGxwdHI7Ci0gIGludDMyX3QgY2NmID0gMDsKLSAgaW50MzJfdCBpTGVuZiA9IHdzUGF0dGVybi5HZXRMZW5ndGgoKTsKLSAgY29uc3QgRlhfV0NIQVIqIHBTdHIgPSB3c1BhdHRlcm4uY19zdHIoKTsKLSAgYm9vbCBiQnJhY2tPcGVuID0gZmFsc2U7Ci0gIENGWF9XaWRlU3RyaW5nQyB3c0NvbnN0Q2hhcnMoZ3Nfd3NDb25zdENoYXJzKTsKLSAgd2hpbGUgKGNjZiA8IGlMZW5mKSB7Ci0gICAgaWYgKHBTdHJbY2NmXSA9PSAnXCcnKSB7Ci0gICAgICBpbnQzMl90IGlDdXJDaGFyID0gY2NmOwotICAgICAgRlhfR2V0TGl0ZXJhbFRleHQocFN0ciwgY2NmLCBpTGVuZik7Ci0gICAgICB3c1B1cmdlUGF0dGVybiArPSBDRlhfV2lkZVN0cmluZ0MocFN0ciArIGlDdXJDaGFyLCBjY2YgLSBpQ3VyQ2hhciArIDEpOwotICAgIH0gZWxzZSBpZiAoIWJCcmFja09wZW4gJiYgd3NDb25zdENoYXJzLkZpbmQocFN0cltjY2ZdKSA9PSAtMSkgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTZWFyY2hDYXRlZ29yeShwU3RyW2NjZl0pOwotICAgICAgY2NmKys7Ci0gICAgICB3aGlsZSAoY2NmIDwgaUxlbmYgJiYgcFN0cltjY2ZdICE9ICd7JyAmJiBwU3RyW2NjZl0gIT0gJy4nICYmCi0gICAgICAgICAgICAgcFN0cltjY2ZdICE9ICcoJykgewotICAgICAgICB3c1NlYXJjaENhdGVnb3J5ICs9IHBTdHJbY2NmXTsKLSAgICAgICAgY2NmKys7Ci0gICAgICB9Ci0gICAgICBpZiAod3NTZWFyY2hDYXRlZ29yeSAhPSB3c0NhdGVnb3J5KSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgd2hpbGUgKGNjZiA8IGlMZW5mKSB7Ci0gICAgICAgIGlmIChwU3RyW2NjZl0gPT0gJygnKSB7Ci0gICAgICAgICAgY2NmKys7Ci0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMQ0lEOwotICAgICAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJyknKSB7Ci0gICAgICAgICAgICB3c0xDSUQgKz0gcFN0cltjY2YrK107Ci0gICAgICAgICAgfQotICAgICAgICAgIHBMb2NhbGUgPSBHZXRQYXR0ZXJuTG9jYWxlKHdzTENJRCk7Ci0gICAgICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdID09ICd7JykgewotICAgICAgICAgIGJCcmFja09wZW4gPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNjZisrOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdICE9ICd9JykgewotICAgICAgd3NQdXJnZVBhdHRlcm4gKz0gcFN0cltjY2ZdOwotICAgIH0KLSAgICBjY2YrKzsKLSAgfQotICBpZiAoIWJCcmFja09wZW4pIHsKLSAgICB3c1B1cmdlUGF0dGVybiA9IHdzUGF0dGVybjsKLSAgfQotICBpZiAoIXBMb2NhbGUpIHsKLSAgICBwTG9jYWxlID0gbV9wTG9jYWxlTWdyLT5HZXREZWZMb2NhbGUoKTsKLSAgfQotICByZXR1cm4gcExvY2FsZTsKLX0KLSNkZWZpbmUgRlhfTlVNU1RZTEVfUGVyY2VudCAweDAxCi0jZGVmaW5lIEZYX05VTVNUWUxFX0V4cG9uZW50IDB4MDIKLSNkZWZpbmUgRlhfTlVNU1RZTEVfRG90Vm9ydiAweDA0Ci1JRlhfTG9jYWxlKiBDRlhfRm9ybWF0U3RyaW5nOjpHZXROdW1lcmljRm9ybWF0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlEb3RJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIGR3U3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1B1cmdlUGF0dGVybikgewotICBkd1N0eWxlID0gMDsKLSAgSUZYX0xvY2FsZSogcExvY2FsZSA9IG51bGxwdHI7Ci0gIGludDMyX3QgY2NmID0gMDsKLSAgaW50MzJfdCBpTGVuZiA9IHdzUGF0dGVybi5HZXRMZW5ndGgoKTsKLSAgY29uc3QgRlhfV0NIQVIqIHBTdHIgPSB3c1BhdHRlcm4uY19zdHIoKTsKLSAgYm9vbCBiRmluZERvdCA9IGZhbHNlOwotICBib29sIGJCcmFja09wZW4gPSBmYWxzZTsKLSAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ29uc3RDaGFycyhnc193c0NvbnN0Q2hhcnMpOwotICB3aGlsZSAoY2NmIDwgaUxlbmYpIHsKLSAgICBpZiAocFN0cltjY2ZdID09ICdcJycpIHsKLSAgICAgIGludDMyX3QgaUN1ckNoYXIgPSBjY2Y7Ci0gICAgICBGWF9HZXRMaXRlcmFsVGV4dChwU3RyLCBjY2YsIGlMZW5mKTsKLSAgICAgIHdzUHVyZ2VQYXR0ZXJuICs9IENGWF9XaWRlU3RyaW5nQyhwU3RyICsgaUN1ckNoYXIsIGNjZiAtIGlDdXJDaGFyICsgMSk7Ci0gICAgfSBlbHNlIGlmICghYkJyYWNrT3BlbiAmJiB3c0NvbnN0Q2hhcnMuRmluZChwU3RyW2NjZl0pID09IC0xKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c0NhdGVnb3J5KHBTdHJbY2NmXSk7Ci0gICAgICBjY2YrKzsKLSAgICAgIHdoaWxlIChjY2YgPCBpTGVuZiAmJiBwU3RyW2NjZl0gIT0gJ3snICYmIHBTdHJbY2NmXSAhPSAnLicgJiYKLSAgICAgICAgICAgICBwU3RyW2NjZl0gIT0gJygnKSB7Ci0gICAgICAgIHdzQ2F0ZWdvcnkgKz0gcFN0cltjY2ZdOwotICAgICAgICBjY2YrKzsKLSAgICAgIH0KLSAgICAgIGlmICh3c0NhdGVnb3J5ICE9IEwibnVtIikgewotICAgICAgICBiQnJhY2tPcGVuID0gdHJ1ZTsKLSAgICAgICAgY2NmID0gMDsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICB3aGlsZSAoY2NmIDwgaUxlbmYpIHsKLSAgICAgICAgaWYgKHBTdHJbY2NmXSA9PSAnKCcpIHsKLSAgICAgICAgICBjY2YrKzsKLSAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0xDSUQ7Ci0gICAgICAgICAgd2hpbGUgKGNjZiA8IGlMZW5mICYmIHBTdHJbY2NmXSAhPSAnKScpIHsKLSAgICAgICAgICAgIHdzTENJRCArPSBwU3RyW2NjZisrXTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcExvY2FsZSA9IEdldFBhdHRlcm5Mb2NhbGUod3NMQ0lEKTsKLSAgICAgICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gPT0gJ3snKSB7Ci0gICAgICAgICAgYkJyYWNrT3BlbiA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdID09ICcuJykgewotICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ViQ2F0ZWdvcnk7Ci0gICAgICAgICAgY2NmKys7Ci0gICAgICAgICAgd2hpbGUgKGNjZiA8IGlMZW5mICYmIHBTdHJbY2NmXSAhPSAnKCcgJiYgcFN0cltjY2ZdICE9ICd7JykgewotICAgICAgICAgICAgd3NTdWJDYXRlZ29yeSArPSBwU3RyW2NjZisrXTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdWludDMyX3QgZHdTdWJIYXNoID0KLSAgICAgICAgICAgICAgRlhfSGFzaENvZGVfR2V0Vyh3c1N1YkNhdGVnb3J5LkFzU3RyaW5nQygpLCBmYWxzZSk7Ci0gICAgICAgICAgRlhfTE9DQUxFTlVNU1VCQ0FURUdPUlkgZVN1YkNhdGVnb3J5ID0gRlhfTE9DQUxFTlVNUEFUVEVSTl9EZWNpbWFsOwotICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGdfaUZYTG9jYWxlTnVtU3ViQ2F0Q291bnQ7IGkrKykgewotICAgICAgICAgICAgaWYgKGdfRlhMb2NhbGVOdW1TdWJDYXREYXRhW2ldLnVIYXNoID09IGR3U3ViSGFzaCkgewotICAgICAgICAgICAgICBlU3ViQ2F0ZWdvcnkgPSAoRlhfTE9DQUxFTlVNU1VCQ0FURUdPUlkpZ19GWExvY2FsZU51bVN1YkNhdERhdGFbaV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lU3ViQ2F0ZWdvcnk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICB3c1N1YkNhdGVnb3J5LmNsZWFyKCk7Ci0gICAgICAgICAgaWYgKCFwTG9jYWxlKSB7Ci0gICAgICAgICAgICBwTG9jYWxlID0gbV9wTG9jYWxlTWdyLT5HZXREZWZMb2NhbGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgQVNTRVJUKHBMb2NhbGUpOwotICAgICAgICAgIHBMb2NhbGUtPkdldE51bVBhdHRlcm4oZVN1YkNhdGVnb3J5LCB3c1N1YkNhdGVnb3J5KTsKLSAgICAgICAgICBpRG90SW5kZXggPSB3c1N1YkNhdGVnb3J5LkZpbmQoJy4nKTsKLSAgICAgICAgICBpZiAoaURvdEluZGV4ID4gMCkgewotICAgICAgICAgICAgaURvdEluZGV4ICs9IHdzUHVyZ2VQYXR0ZXJuLkdldExlbmd0aCgpOwotICAgICAgICAgICAgYkZpbmREb3QgPSB0cnVlOwotICAgICAgICAgICAgZHdTdHlsZSB8PSBGWF9OVU1TVFlMRV9Eb3RWb3J2OwotICAgICAgICAgIH0KLSAgICAgICAgICB3c1B1cmdlUGF0dGVybiArPSB3c1N1YkNhdGVnb3J5OwotICAgICAgICAgIGlmIChlU3ViQ2F0ZWdvcnkgPT0gRlhfTE9DQUxFTlVNUEFUVEVSTl9QZXJjZW50KSB7Ci0gICAgICAgICAgICBkd1N0eWxlIHw9IEZYX05VTVNUWUxFX1BlcmNlbnQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGNjZisrOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAocFN0cltjY2ZdID09ICdFJykgewotICAgICAgZHdTdHlsZSB8PSBGWF9OVU1TVFlMRV9FeHBvbmVudDsKLSAgICAgIHdzUHVyZ2VQYXR0ZXJuICs9IHBTdHJbY2NmXTsKLSAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSA9PSAnJScpIHsKLSAgICAgIGR3U3R5bGUgfD0gRlhfTlVNU1RZTEVfUGVyY2VudDsKLSAgICAgIHdzUHVyZ2VQYXR0ZXJuICs9IHBTdHJbY2NmXTsKLSAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSAhPSAnfScpIHsKLSAgICAgIHdzUHVyZ2VQYXR0ZXJuICs9IHBTdHJbY2NmXTsKLSAgICB9Ci0gICAgaWYgKCFiRmluZERvdCkgewotICAgICAgaWYgKHBTdHJbY2NmXSA9PSAnLicgfHwgcFN0cltjY2ZdID09ICdWJyB8fCBwU3RyW2NjZl0gPT0gJ3YnKSB7Ci0gICAgICAgIGJGaW5kRG90ID0gdHJ1ZTsKLSAgICAgICAgaURvdEluZGV4ID0gd3NQdXJnZVBhdHRlcm4uR2V0TGVuZ3RoKCkgLSAxOwotICAgICAgICBkd1N0eWxlIHw9IEZYX05VTVNUWUxFX0RvdFZvcnY7Ci0gICAgICB9Ci0gICAgfQotICAgIGNjZisrOwotICB9Ci0gIGlmICghYkZpbmREb3QpIHsKLSAgICBpRG90SW5kZXggPSB3c1B1cmdlUGF0dGVybi5HZXRMZW5ndGgoKTsKLSAgfQotICBpZiAoIXBMb2NhbGUpIHsKLSAgICBwTG9jYWxlID0gbV9wTG9jYWxlTWdyLT5HZXREZWZMb2NhbGUoKTsKLSAgfQotICByZXR1cm4gcExvY2FsZTsKLX0KLXN0YXRpYyBib29sIEZYX0dldE51bWVyaWNEb3RJbmRleChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NOdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRG90U3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlEb3RJbmRleCkgewotICBpbnQzMl90IGNjZiA9IDA7Ci0gIGludDMyX3QgaUxlbmYgPSB3c051bS5HZXRMZW5ndGgoKTsKLSAgY29uc3QgRlhfV0NIQVIqIHBTdHIgPSB3c051bS5jX3N0cigpOwotICBpbnQzMl90IGlMZW5Eb3QgPSB3c0RvdFN5bWJvbC5HZXRMZW5ndGgoKTsKLSAgd2hpbGUgKGNjZiA8IGlMZW5mKSB7Ci0gICAgaWYgKHBTdHJbY2NmXSA9PSAnXCcnKSB7Ci0gICAgICBGWF9HZXRMaXRlcmFsVGV4dChwU3RyLCBjY2YsIGlMZW5mKTsKLSAgICB9IGVsc2UgaWYgKGNjZiArIGlMZW5Eb3QgPD0gaUxlbmYgJiYKLSAgICAgICAgICAgICAgICFGWFNZU193Y3NuY21wKHBTdHIgKyBjY2YsIHdzRG90U3ltYm9sLmNfc3RyKCksIGlMZW5Eb3QpKSB7Ci0gICAgICBpRG90SW5kZXggPSBjY2Y7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2NmKys7Ci0gIH0KLSAgaURvdEluZGV4ID0gd3NOdW0uRmluZCgnLicpOwotICBpZiAoaURvdEluZGV4IDwgMCkgewotICAgIGlEb3RJbmRleCA9IGlMZW5mOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgQ0ZYX0Zvcm1hdFN0cmluZzo6UGFyc2VUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpIHsKLSAgd3NWYWx1ZS5jbGVhcigpOwotICBpZiAod3NTcmNUZXh0LklzRW1wdHkoKSB8fCB3c1BhdHRlcm4uSXNFbXB0eSgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIENGWF9XaWRlU3RyaW5nIHdzVGV4dEZvcm1hdDsKLSAgR2V0VGV4dEZvcm1hdCh3c1BhdHRlcm4sIEwidGV4dCIsIHdzVGV4dEZvcm1hdCk7Ci0gIGlmICh3c1RleHRGb3JtYXQuSXNFbXB0eSgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGludDMyX3QgaVRleHQgPSAwLCBpUGF0dGVybiA9IDA7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwU3RyVGV4dCA9IHdzU3JjVGV4dC5jX3N0cigpOwotICBpbnQzMl90IGlMZW5UZXh0ID0gd3NTcmNUZXh0LkdldExlbmd0aCgpOwotICBjb25zdCBGWF9XQ0hBUiogcFN0clBhdHRlcm4gPSB3c1RleHRGb3JtYXQuY19zdHIoKTsKLSAgaW50MzJfdCBpTGVuUGF0dGVybiA9IHdzVGV4dEZvcm1hdC5HZXRMZW5ndGgoKTsKLSAgd2hpbGUgKGlQYXR0ZXJuIDwgaUxlblBhdHRlcm4gJiYgaVRleHQgPCBpTGVuVGV4dCkgewotICAgIHN3aXRjaCAocFN0clBhdHRlcm5baVBhdHRlcm5dKSB7Ci0gICAgICBjYXNlICdcJyc6IHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaXRlcmFsID0KLSAgICAgICAgICAgIEZYX0dldExpdGVyYWxUZXh0KHBTdHJQYXR0ZXJuLCBpUGF0dGVybiwgaUxlblBhdHRlcm4pOwotICAgICAgICBpbnQzMl90IGlMaXRlcmFsTGVuID0gd3NMaXRlcmFsLkdldExlbmd0aCgpOwotICAgICAgICBpZiAoaVRleHQgKyBpTGl0ZXJhbExlbiA+IGlMZW5UZXh0IHx8Ci0gICAgICAgICAgICBGWFNZU193Y3NuY21wKHBTdHJUZXh0ICsgaVRleHQsIHdzTGl0ZXJhbC5jX3N0cigpLCBpTGl0ZXJhbExlbikpIHsKLSAgICAgICAgICB3c1ZhbHVlID0gd3NTcmNUZXh0OwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpVGV4dCArPSBpTGl0ZXJhbExlbjsKLSAgICAgICAgaVBhdHRlcm4rKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlICdBJzoKLSAgICAgICAgaWYgKEZYU1lTX2lzd2FscGhhKHBTdHJUZXh0W2lUZXh0XSkpIHsKLSAgICAgICAgICB3c1ZhbHVlICs9IHBTdHJUZXh0W2lUZXh0XTsKLSAgICAgICAgICBpVGV4dCsrOwotICAgICAgICB9Ci0gICAgICAgIGlQYXR0ZXJuKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnWCc6Ci0gICAgICAgIHdzVmFsdWUgKz0gcFN0clRleHRbaVRleHRdOwotICAgICAgICBpVGV4dCsrOwotICAgICAgICBpUGF0dGVybisrOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ08nOgotICAgICAgY2FzZSAnMCc6Ci0gICAgICAgIGlmIChGWFNZU19pc0RlY2ltYWxEaWdpdChwU3RyVGV4dFtpVGV4dF0pIHx8Ci0gICAgICAgICAgICBGWFNZU19pc3dhbHBoYShwU3RyVGV4dFtpVGV4dF0pKSB7Ci0gICAgICAgICAgd3NWYWx1ZSArPSBwU3RyVGV4dFtpVGV4dF07Ci0gICAgICAgICAgaVRleHQrKzsKLSAgICAgICAgfQotICAgICAgICBpUGF0dGVybisrOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJzknOgotICAgICAgICBpZiAoRlhTWVNfaXNEZWNpbWFsRGlnaXQocFN0clRleHRbaVRleHRdKSkgewotICAgICAgICAgIHdzVmFsdWUgKz0gcFN0clRleHRbaVRleHRdOwotICAgICAgICAgIGlUZXh0Kys7Ci0gICAgICAgIH0KLSAgICAgICAgaVBhdHRlcm4rKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dICE9IHBTdHJUZXh0W2lUZXh0XSkgewotICAgICAgICAgIHdzVmFsdWUgPSB3c1NyY1RleHQ7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlQYXR0ZXJuKys7Ci0gICAgICAgIGlUZXh0Kys7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gaVBhdHRlcm4gPT0gaUxlblBhdHRlcm4gJiYgaVRleHQgPT0gaUxlblRleHQ7Ci19Ci1ib29sIENGWF9Gb3JtYXRTdHJpbmc6OlBhcnNlTnVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY051bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZWYWx1ZSkgewotICBmVmFsdWUgPSAwLjBmOwotICBpZiAod3NTcmNOdW0uSXNFbXB0eSgpIHx8IHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaW50MzJfdCBkb3RfaW5kZXhfZiA9IC0xOwotICB1aW50MzJfdCBkd0Zvcm1hdFN0eWxlID0gMDsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NOdW1Gb3JtYXQ7Ci0gIElGWF9Mb2NhbGUqIHBMb2NhbGUgPQotICAgICAgR2V0TnVtZXJpY0Zvcm1hdCh3c1BhdHRlcm4sIGRvdF9pbmRleF9mLCBkd0Zvcm1hdFN0eWxlLCB3c051bUZvcm1hdCk7Ci0gIGlmICghcExvY2FsZSB8fCB3c051bUZvcm1hdC5Jc0VtcHR5KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaW50MzJfdCBpRXhwb25lbnQgPSAwOwotICBDRlhfV2lkZVN0cmluZyB3c0RvdFN5bWJvbDsKLSAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0RlY2ltYWwsIHdzRG90U3ltYm9sKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NHcm91cFN5bWJvbDsKLSAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0dyb3VwaW5nLCB3c0dyb3VwU3ltYm9sKTsKLSAgaW50MzJfdCBpR3JvdXBMZW4gPSB3c0dyb3VwU3ltYm9sLkdldExlbmd0aCgpOwotICBDRlhfV2lkZVN0cmluZyB3c01pbnVzOwotICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXMpOwotICBpbnQzMl90IGlNaW51c0xlbiA9IHdzTWludXMuR2V0TGVuZ3RoKCk7Ci0gIGludCBjYyA9IDAsIGNjZiA9IDA7Ci0gIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSB3c1NyY051bS5jX3N0cigpOwotICBpbnQgbGVuID0gd3NTcmNOdW0uR2V0TGVuZ3RoKCk7Ci0gIGNvbnN0IEZYX1dDSEFSKiBzdHJmID0gd3NOdW1Gb3JtYXQuY19zdHIoKTsKLSAgaW50IGxlbmYgPSB3c051bUZvcm1hdC5HZXRMZW5ndGgoKTsKLSAgZG91YmxlIGRiUmV0VmFsdWUgPSAwOwotICBkb3VibGUgY29lZmYgPSAxOwotICBib29sIGJIYXZlUGVyY2VudFN5bWJvbCA9IGZhbHNlOwotICBib29sIGJOZWcgPSBmYWxzZTsKLSAgYm9vbCBiUmV2ZXJzZVBhcnNlID0gZmFsc2U7Ci0gIGludDMyX3QgZG90X2luZGV4ID0gMDsKLSAgaWYgKCFGWF9HZXROdW1lcmljRG90SW5kZXgod3NTcmNOdW0sIHdzRG90U3ltYm9sLCBkb3RfaW5kZXgpICYmCi0gICAgICAoZHdGb3JtYXRTdHlsZSAmIEZYX05VTVNUWUxFX0RvdFZvcnYpKSB7Ci0gICAgYlJldmVyc2VQYXJzZSA9IHRydWU7Ci0gIH0KLSAgYlJldmVyc2VQYXJzZSA9IGZhbHNlOwotICBpZiAoYlJldmVyc2VQYXJzZSkgewotICAgIGNjZiA9IGxlbmYgLSAxOwotICAgIGNjID0gbGVuIC0gMTsKLSAgICB3aGlsZSAoY2NmID4gZG90X2luZGV4X2YgJiYgY2MgPj0gMCkgewotICAgICAgc3dpdGNoIChzdHJmW2NjZl0pIHsKLSAgICAgICAgY2FzZSAnXCcnOiB7Ci0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaXRlcmFsID0gRlhfR2V0TGl0ZXJhbFRleHRSZXZlcnNlKHN0cmYsIGNjZik7Ci0gICAgICAgICAgaW50MzJfdCBpTGl0ZXJhbExlbiA9IHdzTGl0ZXJhbC5HZXRMZW5ndGgoKTsKLSAgICAgICAgICBjYyAtPSBpTGl0ZXJhbExlbiAtIDE7Ci0gICAgICAgICAgaWYgKGNjIDwgMCB8fAotICAgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCB3c0xpdGVyYWwuY19zdHIoKSwgaUxpdGVyYWxMZW4pKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjLS07Ci0gICAgICAgICAgY2NmLS07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSAnOSc6Ci0gICAgICAgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICBkYlJldFZhbHVlID0gZGJSZXRWYWx1ZSAqIGNvZWZmICsgKHN0cltjY10gLSAnMCcpICogMC4xOwotICAgICAgICAgIGNvZWZmICo9IDAuMTsKLSAgICAgICAgICBjYy0tOwotICAgICAgICAgIGNjZi0tOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICd6JzoKLSAgICAgICAgICBpZiAoY2MgPj0gMCkgewotICAgICAgICAgICAgZGJSZXRWYWx1ZSA9IGRiUmV0VmFsdWUgKiBjb2VmZiArIChzdHJbY2NdIC0gJzAnKSAqIDAuMTsKLSAgICAgICAgICAgIGNvZWZmICo9IDAuMTsKLSAgICAgICAgICAgIGNjLS07Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjZi0tOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdaJzoKLSAgICAgICAgICBpZiAoc3RyW2NjXSAhPSAnICcpIHsKLSAgICAgICAgICAgIGRiUmV0VmFsdWUgPSBkYlJldFZhbHVlICogY29lZmYgKyAoc3RyW2NjXSAtICcwJykgKiAwLjE7Ci0gICAgICAgICAgICBjb2VmZiAqPSAwLjE7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjLS07Ci0gICAgICAgICAgY2NmLS07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1MnOgotICAgICAgICAgIGlmIChzdHJbY2NdID09ICcrJyB8fCBzdHJbY2NdID09ICcgJykgewotICAgICAgICAgICAgY2MtLTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2MgLT0gaU1pbnVzTGVuIC0gMTsKLSAgICAgICAgICAgIGlmIChjYyA8IDAgfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgd3NNaW51cy5jX3N0cigpLCBpTWludXNMZW4pKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNjLS07Ci0gICAgICAgICAgICBiTmVnID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2NmLS07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgIGlmIChzdHJbY2NdID09ICcrJykgewotICAgICAgICAgICAgY2MtLTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2MgLT0gaU1pbnVzTGVuIC0gMTsKLSAgICAgICAgICAgIGlmIChjYyA8IDAgfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgd3NNaW51cy5jX3N0cigpLCBpTWludXNMZW4pKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNjLS07Ci0gICAgICAgICAgICBiTmVnID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2NmLS07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0UnOiB7Ci0gICAgICAgICAgaWYgKGNjID49IGRvdF9pbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICBib29sIGJFeHBTaWduID0gZmFsc2U7Ci0gICAgICAgICAgd2hpbGUgKGNjID49IDApIHsKLSAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICdFJyB8fCBzdHJbY2NdID09ICdlJykgewotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgICAgICAgICBpRXhwb25lbnQgPSBpRXhwb25lbnQgKyAoc3RyW2NjXSAtICcwJykgKiAxMDsKLSAgICAgICAgICAgICAgY2MtLTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJysnKSB7Ci0gICAgICAgICAgICAgIGNjLS07Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjYyAtIGlNaW51c0xlbiArIDEgPiAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICFGWFNZU193Y3NuY21wKHN0ciArIChjYyAtIGlNaW51c0xlbiArIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c01pbnVzLmNfc3RyKCksIGlNaW51c0xlbikpIHsKLSAgICAgICAgICAgICAgYkV4cFNpZ24gPSB0cnVlOwotICAgICAgICAgICAgICBjYyAtPSBpTWludXNMZW47Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjLS07Ci0gICAgICAgICAgaUV4cG9uZW50ID0gYkV4cFNpZ24gPyAtaUV4cG9uZW50IDogaUV4cG9uZW50OwotICAgICAgICAgIGNjZi0tOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlICckJzogewotICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOwotICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1N5bWJvbCk7Ci0gICAgICAgICAgaW50MzJfdCBpU3ltYm9sTGVuID0gd3NTeW1ib2wuR2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgY2MgLT0gaVN5bWJvbExlbiAtIDE7Ci0gICAgICAgICAgaWYgKGNjIDwgMCB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCB3c1N5bWJvbC5jX3N0cigpLCBpU3ltYm9sTGVuKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYy0tOwotICAgICAgICAgIGNjZi0tOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlICdyJzoKLSAgICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ2MnKSB7Ci0gICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnUicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0MnKSB7Ci0gICAgICAgICAgICAgIGJOZWcgPSB0cnVlOwotICAgICAgICAgICAgICBjYyAtPSAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2NmIC09IDI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNjZi0tOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnUic6Ci0gICAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdDJykgewotICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJyAnKSB7Ci0gICAgICAgICAgICAgIGNjKys7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJ1InICYmIGNjIC0gMSA+PSAwICYmIHN0cltjYyAtIDFdID09ICdDJykgewotICAgICAgICAgICAgICBiTmVnID0gdHJ1ZTsKLSAgICAgICAgICAgICAgY2MgLT0gMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNjZiAtPSAyOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjY2YtLTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2InOgotICAgICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnZCcpIHsKLSAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICdCJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnRCcpIHsKLSAgICAgICAgICAgICAgYk5lZyA9IHRydWU7Ci0gICAgICAgICAgICAgIGNjIC09IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjY2YgLT0gMjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2NmLS07Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdCJzoKLSAgICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ0QnKSB7Ci0gICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnICcpIHsKLSAgICAgICAgICAgICAgY2MrKzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnQicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0QnKSB7Ci0gICAgICAgICAgICAgIGJOZWcgPSB0cnVlOwotICAgICAgICAgICAgICBjYyAtPSAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2NmIC09IDI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNjZi0tOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnLic6Ci0gICAgICAgIGNhc2UgJ1YnOgotICAgICAgICBjYXNlICd2JzoKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGNhc2UgJyUnOiB7Ci0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7Ci0gICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX1BlcmNlbnQsIHdzU3ltYm9sKTsKLSAgICAgICAgICBpbnQzMl90IGlTeXNtYm9sTGVuID0gd3NTeW1ib2wuR2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgY2MgLT0gaVN5c21ib2xMZW4gLSAxOwotICAgICAgICAgIGlmIChjYyA8IDAgfHwKLSAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgd3NTeW1ib2wuY19zdHIoKSwgaVN5c21ib2xMZW4pKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjLS07Ci0gICAgICAgICAgY2NmLS07Ci0gICAgICAgICAgYkhhdmVQZXJjZW50U3ltYm9sID0gdHJ1ZTsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSAnOCc6Ci0gICAgICAgICAgd2hpbGUgKGNjZiA8IGxlbmYgJiYgc3RyZltjY2ZdID09ICc4JykgewotICAgICAgICAgICAgY2NmKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIHdoaWxlIChjYyA8IGxlbiAmJiBGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgICAgICAgZGJSZXRWYWx1ZSA9IChzdHJbY2NdIC0gJzAnKSAqIGNvZWZmICsgZGJSZXRWYWx1ZTsKLSAgICAgICAgICAgIGNvZWZmICo9IDAuMTsKLSAgICAgICAgICAgIGNjKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICcsJzogewotICAgICAgICAgIGlmIChjYyA+PSAwKSB7Ci0gICAgICAgICAgICBjYyAtPSBpR3JvdXBMZW4gLSAxOwotICAgICAgICAgICAgaWYgKGNjID49IDAgJiYKLSAgICAgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCB3c0dyb3VwU3ltYm9sLmNfc3RyKCksIGlHcm91cExlbikgPT0KLSAgICAgICAgICAgICAgICAgICAgMCkgewotICAgICAgICAgICAgICBjYy0tOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgY2MgKz0gaUdyb3VwTGVuIC0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgY2NmLS07Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgJygnOgotICAgICAgICAgIGlmIChzdHJbY2NdID09IEwnKCcpIHsKLSAgICAgICAgICAgIGJOZWcgPSB0cnVlOwotICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSAhPSBMJyAnKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjLS07Ci0gICAgICAgICAgY2NmLS07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJyknOgotICAgICAgICAgIGlmIChzdHJbY2NdID09IEwnKScpIHsKLSAgICAgICAgICAgIGJOZWcgPSB0cnVlOwotICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSAhPSBMJyAnKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjLS07Ci0gICAgICAgICAgY2NmLS07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgaWYgKHN0cmZbY2NmXSAhPSBzdHJbY2NdKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjLS07Ci0gICAgICAgICAgY2NmLS07Ci0gICAgICB9Ci0gICAgfQotICAgIGRvdF9pbmRleCA9IGNjICsgMTsKLSAgfQotICBjY2YgPSBkb3RfaW5kZXhfZiAtIDE7Ci0gIGNjID0gZG90X2luZGV4IC0gMTsKLSAgY29lZmYgPSAxOwotICB3aGlsZSAoY2NmID49IDAgJiYgY2MgPj0gMCkgewotICAgIHN3aXRjaCAoc3RyZltjY2ZdKSB7Ci0gICAgICBjYXNlICdcJyc6IHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaXRlcmFsID0gRlhfR2V0TGl0ZXJhbFRleHRSZXZlcnNlKHN0cmYsIGNjZik7Ci0gICAgICAgIGludDMyX3QgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7Ci0gICAgICAgIGNjIC09IGlMaXRlcmFsTGVuIC0gMTsKLSAgICAgICAgaWYgKGNjIDwgMCB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCB3c0xpdGVyYWwuY19zdHIoKSwgaUxpdGVyYWxMZW4pKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGNjLS07Ci0gICAgICAgIGNjZi0tOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgJzknOgotICAgICAgICBpZiAoIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGRiUmV0VmFsdWUgPSBkYlJldFZhbHVlICsgKHN0cltjY10gLSAnMCcpICogY29lZmY7Ci0gICAgICAgIGNvZWZmICo9IDEwOwotICAgICAgICBjYy0tOwotICAgICAgICBjY2YtLTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICd6JzoKLSAgICAgICAgaWYgKEZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKSB7Ci0gICAgICAgICAgZGJSZXRWYWx1ZSA9IGRiUmV0VmFsdWUgKyAoc3RyW2NjXSAtICcwJykgKiBjb2VmZjsKLSAgICAgICAgICBjb2VmZiAqPSAxMDsKLSAgICAgICAgICBjYy0tOwotICAgICAgICB9Ci0gICAgICAgIGNjZi0tOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ1onOgotICAgICAgICBpZiAoc3RyW2NjXSAhPSAnICcpIHsKLSAgICAgICAgICBpZiAoRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgICAgIGRiUmV0VmFsdWUgPSBkYlJldFZhbHVlICsgKHN0cltjY10gLSAnMCcpICogY29lZmY7Ci0gICAgICAgICAgICBjb2VmZiAqPSAxMDsKLSAgICAgICAgICAgIGNjLS07Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGNjLS07Ci0gICAgICAgIH0KLSAgICAgICAgY2NmLS07Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnUyc6Ci0gICAgICAgIGlmIChzdHJbY2NdID09ICcrJyB8fCBzdHJbY2NdID09ICcgJykgewotICAgICAgICAgIGNjLS07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY2MgLT0gaU1pbnVzTGVuIC0gMTsKLSAgICAgICAgICBpZiAoY2MgPCAwIHx8IEZYU1lTX3djc25jbXAoc3RyICsgY2MsIHdzTWludXMuY19zdHIoKSwgaU1pbnVzTGVuKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYy0tOwotICAgICAgICAgIGJOZWcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGNjZi0tOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ3MnOgotICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycpIHsKLSAgICAgICAgICBjYy0tOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGNjIC09IGlNaW51c0xlbiAtIDE7Ci0gICAgICAgICAgaWYgKGNjIDwgMCB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCB3c01pbnVzLmNfc3RyKCksIGlNaW51c0xlbikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2MtLTsKLSAgICAgICAgICBiTmVnID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBjY2YtLTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdFJzogewotICAgICAgICBpZiAoY2MgPj0gZG90X2luZGV4KSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGJvb2wgYkV4cFNpZ24gPSBmYWxzZTsKLSAgICAgICAgd2hpbGUgKGNjID49IDApIHsKLSAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgICAgIGlFeHBvbmVudCA9IGlFeHBvbmVudCArIChzdHJbY2NdIC0gJzAnKSAqIDEwOwotICAgICAgICAgICAgY2MtLTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnKycpIHsKLSAgICAgICAgICAgIGNjLS07Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGNjIC0gaU1pbnVzTGVuICsgMSA+IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICFGWFNZU193Y3NuY21wKHN0ciArIChjYyAtIGlNaW51c0xlbiArIDEpLCB3c01pbnVzLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpTWludXNMZW4pKSB7Ci0gICAgICAgICAgICBiRXhwU2lnbiA9IHRydWU7Ci0gICAgICAgICAgICBjYyAtPSBpTWludXNMZW47Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2MtLTsKLSAgICAgICAgaUV4cG9uZW50ID0gYkV4cFNpZ24gPyAtaUV4cG9uZW50IDogaUV4cG9uZW50OwotICAgICAgICBjY2YtLTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlICckJzogewotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsKLSAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sLCB3c1N5bWJvbCk7Ci0gICAgICAgIGludDMyX3QgaVN5bWJvbExlbiA9IHdzU3ltYm9sLkdldExlbmd0aCgpOwotICAgICAgICBjYyAtPSBpU3ltYm9sTGVuIC0gMTsKLSAgICAgICAgaWYgKGNjIDwgMCB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCB3c1N5bWJvbC5jX3N0cigpLCBpU3ltYm9sTGVuKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBjYy0tOwotICAgICAgICBjY2YtLTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlICdyJzoKLSAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdjJykgewotICAgICAgICAgIGlmIChzdHJbY2NdID09ICdSJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnQycpIHsKLSAgICAgICAgICAgIGJOZWcgPSB0cnVlOwotICAgICAgICAgICAgY2MgLT0gMjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2NmIC09IDI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY2NmLS07Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdSJzoKLSAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdDJykgewotICAgICAgICAgIGlmIChzdHJbY2NdID09ICcgJykgewotICAgICAgICAgICAgY2MrKzsKLSAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJ1InICYmIGNjIC0gMSA+PSAwICYmIHN0cltjYyAtIDFdID09ICdDJykgewotICAgICAgICAgICAgYk5lZyA9IHRydWU7Ci0gICAgICAgICAgICBjYyAtPSAyOwotICAgICAgICAgIH0KLSAgICAgICAgICBjY2YgLT0gMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjY2YtLTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ2InOgotICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ2QnKSB7Ci0gICAgICAgICAgaWYgKHN0cltjY10gPT0gJ0InICYmIGNjIC0gMSA+PSAwICYmIHN0cltjYyAtIDFdID09ICdEJykgewotICAgICAgICAgICAgYk5lZyA9IHRydWU7Ci0gICAgICAgICAgICBjYyAtPSAyOwotICAgICAgICAgIH0KLSAgICAgICAgICBjY2YgLT0gMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjY2YtLTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ0InOgotICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ0QnKSB7Ci0gICAgICAgICAgaWYgKHN0cltjY10gPT0gJyAnKSB7Ci0gICAgICAgICAgICBjYysrOwotICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnQicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0QnKSB7Ci0gICAgICAgICAgICBiTmVnID0gdHJ1ZTsKLSAgICAgICAgICAgIGNjIC09IDI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjZiAtPSAyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGNjZi0tOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnLic6Ci0gICAgICBjYXNlICdWJzoKLSAgICAgIGNhc2UgJ3YnOgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBjYXNlICclJzogewotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsKLSAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX1BlcmNlbnQsIHdzU3ltYm9sKTsKLSAgICAgICAgaW50MzJfdCBpU3lzbWJvbExlbiA9IHdzU3ltYm9sLkdldExlbmd0aCgpOwotICAgICAgICBjYyAtPSBpU3lzbWJvbExlbiAtIDE7Ci0gICAgICAgIGlmIChjYyA8IDAgfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgd3NTeW1ib2wuY19zdHIoKSwgaVN5c21ib2xMZW4pKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGNjLS07Ci0gICAgICAgIGNjZi0tOwotICAgICAgICBiSGF2ZVBlcmNlbnRTeW1ib2wgPSB0cnVlOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgJzgnOgotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBjYXNlICcsJzogewotICAgICAgICBpZiAoY2MgPj0gMCkgewotICAgICAgICAgIGNjIC09IGlHcm91cExlbiAtIDE7Ci0gICAgICAgICAgaWYgKGNjID49IDAgJiYKLSAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgd3NHcm91cFN5bWJvbC5jX3N0cigpLCBpR3JvdXBMZW4pID09IDApIHsKLSAgICAgICAgICAgIGNjLS07Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNjICs9IGlHcm91cExlbiAtIDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNjZi0tOwotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgJygnOgotICAgICAgICBpZiAoc3RyW2NjXSA9PSBMJygnKSB7Ci0gICAgICAgICAgYk5lZyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSAhPSBMJyAnKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGNjLS07Ci0gICAgICAgIGNjZi0tOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJyknOgotICAgICAgICBpZiAoc3RyW2NjXSA9PSBMJyknKSB7Ci0gICAgICAgICAgYk5lZyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSAhPSBMJyAnKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGNjLS07Ci0gICAgICAgIGNjZi0tOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmIChzdHJmW2NjZl0gIT0gc3RyW2NjXSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBjYy0tOwotICAgICAgICBjY2YtLTsKLSAgICB9Ci0gIH0KLSAgaWYgKGNjID49IDApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFiUmV2ZXJzZVBhcnNlKSB7Ci0gICAgY2NmID0gZG90X2luZGV4X2YgKyAxOwotICAgIGNjID0gKGRvdF9pbmRleCA9PSBsZW4pID8gbGVuIDogZG90X2luZGV4ICsgMTsKLSAgICBjb2VmZiA9IDAuMTsKLSAgICB3aGlsZSAoY2MgPCBsZW4gJiYgY2NmIDwgbGVuZikgewotICAgICAgc3dpdGNoIChzdHJmW2NjZl0pIHsKLSAgICAgICAgY2FzZSAnXCcnOiB7Ci0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaXRlcmFsID0gRlhfR2V0TGl0ZXJhbFRleHQoc3RyZiwgY2NmLCBsZW5mKTsKLSAgICAgICAgICBpbnQzMl90IGlMaXRlcmFsTGVuID0gd3NMaXRlcmFsLkdldExlbmd0aCgpOwotICAgICAgICAgIGlmIChjYyArIGlMaXRlcmFsTGVuID4gbGVuIHx8Ci0gICAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIHdzTGl0ZXJhbC5jX3N0cigpLCBpTGl0ZXJhbExlbikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2MgKz0gaUxpdGVyYWxMZW47Ci0gICAgICAgICAgY2NmKys7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSAnOSc6Ci0gICAgICAgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICB7Ci0gICAgICAgICAgICBkYlJldFZhbHVlID0gZGJSZXRWYWx1ZSArIChzdHJbY2NdIC0gJzAnKSAqIGNvZWZmOwotICAgICAgICAgICAgY29lZmYgKj0gMC4xOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYysrOwotICAgICAgICAgIGNjZisrOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICd6JzoKLSAgICAgICAgICBpZiAoRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgICAgIGRiUmV0VmFsdWUgPSBkYlJldFZhbHVlICsgKHN0cltjY10gLSAnMCcpICogY29lZmY7Ci0gICAgICAgICAgICBjb2VmZiAqPSAwLjE7Ci0gICAgICAgICAgICBjYysrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjY2YrKzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnWic6Ci0gICAgICAgICAgaWYgKHN0cltjY10gIT0gJyAnKSB7Ci0gICAgICAgICAgICBpZiAoRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgICAgICAgZGJSZXRWYWx1ZSA9IGRiUmV0VmFsdWUgKyAoc3RyW2NjXSAtICcwJykgKiBjb2VmZjsKLSAgICAgICAgICAgICAgY29lZmYgKj0gMC4xOwotICAgICAgICAgICAgICBjYysrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjYysrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjY2YrKzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnUyc6Ci0gICAgICAgICAgaWYgKHN0cltjY10gPT0gJysnIHx8IHN0cltjY10gPT0gJyAnKSB7Ci0gICAgICAgICAgICBjYysrOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoY2MgKyBpTWludXNMZW4gPiBsZW4gfHwKLSAgICAgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCB3c01pbnVzLmNfc3RyKCksIGlNaW51c0xlbikpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYk5lZyA9IHRydWU7Ci0gICAgICAgICAgICBjYyArPSBpTWludXNMZW47Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjZisrOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdzJzoKLSAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycpIHsKLSAgICAgICAgICAgIGNjKys7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChjYyArIGlNaW51c0xlbiA+IGxlbiB8fAotICAgICAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIHdzTWludXMuY19zdHIoKSwgaU1pbnVzTGVuKSkgewotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiTmVnID0gdHJ1ZTsKLSAgICAgICAgICAgIGNjICs9IGlNaW51c0xlbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2NmKys7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0UnOiB7Ci0gICAgICAgICAgaWYgKGNjID49IGxlbiB8fCAoc3RyW2NjXSAhPSAnRScgJiYgc3RyW2NjXSAhPSAnZScpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJvb2wgYkV4cFNpZ24gPSBmYWxzZTsKLSAgICAgICAgICBjYysrOwotICAgICAgICAgIGlmIChjYyA8IGxlbikgewotICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7Ci0gICAgICAgICAgICAgIGNjKys7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJy0nKSB7Ci0gICAgICAgICAgICAgIGJFeHBTaWduID0gdHJ1ZTsKLSAgICAgICAgICAgICAgY2MrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7Ci0gICAgICAgICAgICBpZiAoIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKSB7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaUV4cG9uZW50ID0gaUV4cG9uZW50ICogMTAgKyBzdHJbY2NdIC0gJzAnOwotICAgICAgICAgICAgY2MrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaUV4cG9uZW50ID0gYkV4cFNpZ24gPyAtaUV4cG9uZW50IDogaUV4cG9uZW50OwotICAgICAgICAgIGNjZisrOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlICckJzogewotICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOwotICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1N5bWJvbCk7Ci0gICAgICAgICAgaW50MzJfdCBpU3ltYm9sTGVuID0gd3NTeW1ib2wuR2V0TGVuZ3RoKCk7Ci0gICAgICAgICAgaWYgKGNjICsgaVN5bWJvbExlbiA+IGxlbiB8fAotICAgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCB3c1N5bWJvbC5jX3N0cigpLCBpU3ltYm9sTGVuKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYyArPSBpU3ltYm9sTGVuOwotICAgICAgICAgIGNjZisrOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlICdjJzoKLSAgICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAncicpIHsKLSAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICdDJyAmJiBjYyArIDEgPCBsZW4gJiYgc3RyW2NjICsgMV0gPT0gJ1InKSB7Ci0gICAgICAgICAgICAgIGJOZWcgPSB0cnVlOwotICAgICAgICAgICAgICBjYyArPSAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2NmICs9IDI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdDJzoKLSAgICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAnUicpIHsKLSAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcgJykgewotICAgICAgICAgICAgICBjYysrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICdDJyAmJiBjYyArIDEgPCBsZW4gJiYgc3RyW2NjICsgMV0gPT0gJ1InKSB7Ci0gICAgICAgICAgICAgIGJOZWcgPSB0cnVlOwotICAgICAgICAgICAgICBjYyArPSAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2NmICs9IDI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdkJzoKLSAgICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAnYicpIHsKLSAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICdEJyAmJiBjYyArIDEgPCBsZW4gJiYgc3RyW2NjICsgMV0gPT0gJ0InKSB7Ci0gICAgICAgICAgICAgIGJOZWcgPSB0cnVlOwotICAgICAgICAgICAgICBjYyArPSAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2NmICs9IDI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdEJzoKLSAgICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAnQicpIHsKLSAgICAgICAgICAgIGlmIChzdHJbY2NdID09ICcgJykgewotICAgICAgICAgICAgICBjYysrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICdEJyAmJiBjYyArIDEgPCBsZW4gJiYgc3RyW2NjICsgMV0gPT0gJ0InKSB7Ci0gICAgICAgICAgICAgIGJOZWcgPSB0cnVlOwotICAgICAgICAgICAgICBjYyArPSAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2NmICs9IDI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICcuJzoKLSAgICAgICAgY2FzZSAnVic6Ci0gICAgICAgIGNhc2UgJ3YnOgotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgY2FzZSAnJSc6IHsKLSAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsKLSAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfUGVyY2VudCwgd3NTeW1ib2wpOwotICAgICAgICAgIGludDMyX3QgaVN5c21ib2xMZW4gPSB3c1N5bWJvbC5HZXRMZW5ndGgoKTsKLSAgICAgICAgICBpZiAoY2MgKyBpU3lzbWJvbExlbiA8PSBsZW4gJiYKLSAgICAgICAgICAgICAgIUZYU1lTX3djc25jbXAoc3RyICsgY2MsIHdzU3ltYm9sLmNfc3RyKCksIGlTeXNtYm9sTGVuKSkgewotICAgICAgICAgICAgY2MgKz0gaVN5c21ib2xMZW47Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjZisrOwotICAgICAgICAgIGJIYXZlUGVyY2VudFN5bWJvbCA9IHRydWU7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgJzgnOiB7Ci0gICAgICAgICAgd2hpbGUgKGNjZiA8IGxlbmYgJiYgc3RyZltjY2ZdID09ICc4JykgewotICAgICAgICAgICAgY2NmKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIHdoaWxlIChjYyA8IGxlbiAmJiBGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgICAgICAgZGJSZXRWYWx1ZSA9IChzdHJbY2NdIC0gJzAnKSAqIGNvZWZmICsgZGJSZXRWYWx1ZTsKLSAgICAgICAgICAgIGNvZWZmICo9IDAuMTsKLSAgICAgICAgICAgIGNjKys7Ci0gICAgICAgICAgfQotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlICcsJzogewotICAgICAgICAgIGlmIChjYyArIGlHcm91cExlbiA8PSBsZW4gJiYKLSAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgd3NHcm91cFN5bWJvbC5jX3N0cigpLCBpR3JvdXBMZW4pID09IDApIHsKLSAgICAgICAgICAgIGNjICs9IGlHcm91cExlbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2NmKys7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgJygnOgotICAgICAgICAgIGlmIChzdHJbY2NdID09IEwnKCcpIHsKLSAgICAgICAgICAgIGJOZWcgPSB0cnVlOwotICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSAhPSBMJyAnKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjKys7Ci0gICAgICAgICAgY2NmKys7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJyknOgotICAgICAgICAgIGlmIChzdHJbY2NdID09IEwnKScpIHsKLSAgICAgICAgICAgIGJOZWcgPSB0cnVlOwotICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSAhPSBMJyAnKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjKys7Ci0gICAgICAgICAgY2NmKys7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgaWYgKHN0cmZbY2NmXSAhPSBzdHJbY2NdKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjKys7Ci0gICAgICAgICAgY2NmKys7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChjYyAhPSBsZW4pIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgaWYgKGlFeHBvbmVudCkgewotICAgIGRiUmV0VmFsdWUgKj0gRlhTWVNfcG93KDEwLCAoRlhfRkxPQVQpaUV4cG9uZW50KTsKLSAgfQotICBpZiAoYkhhdmVQZXJjZW50U3ltYm9sKSB7Ci0gICAgZGJSZXRWYWx1ZSAvPSAxMDAuMDsKLSAgfQotICBpZiAoYk5lZykgewotICAgIGRiUmV0VmFsdWUgPSAtZGJSZXRWYWx1ZTsKLSAgfQotICBmVmFsdWUgPSAoRlhfRkxPQVQpZGJSZXRWYWx1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0ZYX0Zvcm1hdFN0cmluZzo6UGFyc2VOdW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSkgewotICB3c1ZhbHVlLmNsZWFyKCk7Ci0gIGlmICh3c1NyY051bS5Jc0VtcHR5KCkgfHwgd3NQYXR0ZXJuLklzRW1wdHkoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpbnQzMl90IGRvdF9pbmRleF9mID0gLTE7Ci0gIHVpbnQzMl90IGR3Rm9ybWF0U3R5bGUgPSAwOwotICBDRlhfV2lkZVN0cmluZyB3c051bUZvcm1hdDsKLSAgSUZYX0xvY2FsZSogcExvY2FsZSA9Ci0gICAgICBHZXROdW1lcmljRm9ybWF0KHdzUGF0dGVybiwgZG90X2luZGV4X2YsIGR3Rm9ybWF0U3R5bGUsIHdzTnVtRm9ybWF0KTsKLSAgaWYgKCFwTG9jYWxlIHx8IHdzTnVtRm9ybWF0LklzRW1wdHkoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpbnQzMl90IGlFeHBvbmVudCA9IDA7Ci0gIENGWF9XaWRlU3RyaW5nIHdzRG90U3ltYm9sOwotICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbCwgd3NEb3RTeW1ib2wpOwotICBDRlhfV2lkZVN0cmluZyB3c0dyb3VwU3ltYm9sOwotICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfR3JvdXBpbmcsIHdzR3JvdXBTeW1ib2wpOwotICBpbnQzMl90IGlHcm91cExlbiA9IHdzR3JvdXBTeW1ib2wuR2V0TGVuZ3RoKCk7Ci0gIENGWF9XaWRlU3RyaW5nIHdzTWludXM7Ci0gIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51cyk7Ci0gIGludDMyX3QgaU1pbnVzTGVuID0gd3NNaW51cy5HZXRMZW5ndGgoKTsKLSAgaW50IGNjID0gMCwgY2NmID0gMDsKLSAgY29uc3QgRlhfV0NIQVIqIHN0ciA9IHdzU3JjTnVtLmNfc3RyKCk7Ci0gIGludCBsZW4gPSB3c1NyY051bS5HZXRMZW5ndGgoKTsKLSAgY29uc3QgRlhfV0NIQVIqIHN0cmYgPSB3c051bUZvcm1hdC5jX3N0cigpOwotICBpbnQgbGVuZiA9IHdzTnVtRm9ybWF0LkdldExlbmd0aCgpOwotICBib29sIGJIYXZlUGVyY2VudFN5bWJvbCA9IGZhbHNlOwotICBib29sIGJOZWcgPSBmYWxzZTsKLSAgYm9vbCBiUmV2ZXJzZVBhcnNlID0gZmFsc2U7Ci0gIGludDMyX3QgZG90X2luZGV4ID0gMDsKLSAgaWYgKCFGWF9HZXROdW1lcmljRG90SW5kZXgod3NTcmNOdW0sIHdzRG90U3ltYm9sLCBkb3RfaW5kZXgpICYmCi0gICAgICAoZHdGb3JtYXRTdHlsZSAmIEZYX05VTVNUWUxFX0RvdFZvcnYpKSB7Ci0gICAgYlJldmVyc2VQYXJzZSA9IHRydWU7Ci0gIH0KLSAgYlJldmVyc2VQYXJzZSA9IGZhbHNlOwotICBjY2YgPSBkb3RfaW5kZXhfZiAtIDE7Ci0gIGNjID0gZG90X2luZGV4IC0gMTsKLSAgd2hpbGUgKGNjZiA+PSAwICYmIGNjID49IDApIHsKLSAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgewotICAgICAgY2FzZSAnXCcnOiB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGl0ZXJhbCA9IEZYX0dldExpdGVyYWxUZXh0UmV2ZXJzZShzdHJmLCBjY2YpOwotICAgICAgICBpbnQzMl90IGlMaXRlcmFsTGVuID0gd3NMaXRlcmFsLkdldExlbmd0aCgpOwotICAgICAgICBjYyAtPSBpTGl0ZXJhbExlbiAtIDE7Ci0gICAgICAgIGlmIChjYyA8IDAgfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgd3NMaXRlcmFsLmNfc3RyKCksIGlMaXRlcmFsTGVuKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBjYy0tOwotICAgICAgICBjY2YtLTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlICc5JzoKLSAgICAgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICB3c1ZhbHVlID0gc3RyW2NjXSArIHdzVmFsdWU7Ci0gICAgICAgIGNjLS07Ci0gICAgICAgIGNjZi0tOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ3onOgotICAgICAgICBpZiAoRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgICB3c1ZhbHVlID0gc3RyW2NjXSArIHdzVmFsdWU7Ci0gICAgICAgICAgY2MtLTsKLSAgICAgICAgfQotICAgICAgICBjY2YtLTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdaJzoKLSAgICAgICAgaWYgKHN0cltjY10gIT0gJyAnKSB7Ci0gICAgICAgICAgaWYgKEZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKSB7Ci0gICAgICAgICAgICB3c1ZhbHVlID0gc3RyW2NjXSArIHdzVmFsdWU7Ci0gICAgICAgICAgICBjYy0tOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjYy0tOwotICAgICAgICB9Ci0gICAgICAgIGNjZi0tOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ1MnOgotICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycgfHwgc3RyW2NjXSA9PSAnICcpIHsKLSAgICAgICAgICBjYy0tOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGNjIC09IGlNaW51c0xlbiAtIDE7Ci0gICAgICAgICAgaWYgKGNjIDwgMCB8fCBGWFNZU193Y3NuY21wKHN0ciArIGNjLCB3c01pbnVzLmNfc3RyKCksIGlNaW51c0xlbikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2MtLTsKLSAgICAgICAgICBiTmVnID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBjY2YtLTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdzJzoKLSAgICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7Ci0gICAgICAgICAgY2MtLTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjYyAtPSBpTWludXNMZW4gLSAxOwotICAgICAgICAgIGlmIChjYyA8IDAgfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgd3NNaW51cy5jX3N0cigpLCBpTWludXNMZW4pKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjLS07Ci0gICAgICAgICAgYk5lZyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgY2NmLS07Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnRSc6IHsKLSAgICAgICAgaWYgKGNjID49IGRvdF9pbmRleCkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBib29sIGJFeHBTaWduID0gZmFsc2U7Ci0gICAgICAgIHdoaWxlIChjYyA+PSAwKSB7Ci0gICAgICAgICAgaWYgKHN0cltjY10gPT0gJ0UnIHx8IHN0cltjY10gPT0gJ2UnKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKEZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKSB7Ci0gICAgICAgICAgICBpRXhwb25lbnQgPSBpRXhwb25lbnQgKyAoc3RyW2NjXSAtICcwJykgKiAxMDsKLSAgICAgICAgICAgIGNjLS07Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJysnKSB7Ci0gICAgICAgICAgICBjYy0tOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfSBlbHNlIGlmIChjYyAtIGlNaW51c0xlbiArIDEgPiAwICYmCi0gICAgICAgICAgICAgICAgICAgICAhRlhTWVNfd2NzbmNtcChzdHIgKyAoY2MgLSBpTWludXNMZW4gKyAxKSwgd3NNaW51cy5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaU1pbnVzTGVuKSkgewotICAgICAgICAgICAgYkV4cFNpZ24gPSB0cnVlOwotICAgICAgICAgICAgY2MgLT0gaU1pbnVzTGVuOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNjLS07Ci0gICAgICAgIGlFeHBvbmVudCA9IGJFeHBTaWduID8gLWlFeHBvbmVudCA6IGlFeHBvbmVudDsKLSAgICAgICAgY2NmLS07Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSAnJCc6IHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7Ci0gICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbCwgd3NTeW1ib2wpOwotICAgICAgICBpbnQzMl90IGlTeW1ib2xMZW4gPSB3c1N5bWJvbC5HZXRMZW5ndGgoKTsKLSAgICAgICAgY2MgLT0gaVN5bWJvbExlbiAtIDE7Ci0gICAgICAgIGlmIChjYyA8IDAgfHwgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgd3NTeW1ib2wuY19zdHIoKSwgaVN5bWJvbExlbikpIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgY2MtLTsKLSAgICAgICAgY2NmLS07Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSAncic6Ci0gICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnYycpIHsKLSAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnUicgJiYgY2MgLSAxID49IDAgJiYgc3RyW2NjIC0gMV0gPT0gJ0MnKSB7Ci0gICAgICAgICAgICBiTmVnID0gdHJ1ZTsKLSAgICAgICAgICAgIGNjIC09IDI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjZiAtPSAyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGNjZi0tOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnUic6Ci0gICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnQycpIHsKLSAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnICcpIHsKLSAgICAgICAgICAgIGNjKys7Ci0gICAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICdSJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnQycpIHsKLSAgICAgICAgICAgIGJOZWcgPSB0cnVlOwotICAgICAgICAgICAgY2MgLT0gMjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2NmIC09IDI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY2NmLS07Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdiJzoKLSAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdkJykgewotICAgICAgICAgIGlmIChzdHJbY2NdID09ICdCJyAmJiBjYyAtIDEgPj0gMCAmJiBzdHJbY2MgLSAxXSA9PSAnRCcpIHsKLSAgICAgICAgICAgIGJOZWcgPSB0cnVlOwotICAgICAgICAgICAgY2MgLT0gMjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2NmIC09IDI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY2NmLS07Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdCJzoKLSAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdEJykgewotICAgICAgICAgIGlmIChzdHJbY2NdID09ICcgJykgewotICAgICAgICAgICAgY2MrKzsKLSAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJ0InICYmIGNjIC0gMSA+PSAwICYmIHN0cltjYyAtIDFdID09ICdEJykgewotICAgICAgICAgICAgYk5lZyA9IHRydWU7Ci0gICAgICAgICAgICBjYyAtPSAyOwotICAgICAgICAgIH0KLSAgICAgICAgICBjY2YgLT0gMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjY2YtLTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJy4nOgotICAgICAgY2FzZSAnVic6Ci0gICAgICBjYXNlICd2JzoKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgY2FzZSAnJSc6IHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7Ci0gICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50LCB3c1N5bWJvbCk7Ci0gICAgICAgIGludDMyX3QgaVN5c21ib2xMZW4gPSB3c1N5bWJvbC5HZXRMZW5ndGgoKTsKLSAgICAgICAgY2MgLT0gaVN5c21ib2xMZW4gLSAxOwotICAgICAgICBpZiAoY2MgPCAwIHx8IEZYU1lTX3djc25jbXAoc3RyICsgY2MsIHdzU3ltYm9sLmNfc3RyKCksIGlTeXNtYm9sTGVuKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBjYy0tOwotICAgICAgICBjY2YtLTsKLSAgICAgICAgYkhhdmVQZXJjZW50U3ltYm9sID0gdHJ1ZTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlICc4JzoKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgY2FzZSAnLCc6IHsKLSAgICAgICAgaWYgKGNjID49IDApIHsKLSAgICAgICAgICBjYyAtPSBpR3JvdXBMZW4gLSAxOwotICAgICAgICAgIGlmIChjYyA+PSAwICYmCi0gICAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIHdzR3JvdXBTeW1ib2wuY19zdHIoKSwgaUdyb3VwTGVuKSA9PSAwKSB7Ci0gICAgICAgICAgICBjYy0tOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjYyArPSBpR3JvdXBMZW4gLSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjY2YtLTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlICcoJzoKLSAgICAgICAgaWYgKHN0cltjY10gPT0gTCcoJykgewotICAgICAgICAgIGJOZWcgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBjYy0tOwotICAgICAgICBjY2YtLTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICcpJzoKLSAgICAgICAgaWYgKHN0cltjY10gPT0gTCcpJykgewotICAgICAgICAgIGJOZWcgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBjYy0tOwotICAgICAgICBjY2YtLTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBpZiAoc3RyZltjY2ZdICE9IHN0cltjY10pIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgY2MtLTsKLSAgICAgICAgY2NmLS07Ci0gICAgfQotICB9Ci0gIGlmIChjYyA+PSAwKSB7Ci0gICAgaWYgKHN0cltjY10gPT0gJy0nKSB7Ci0gICAgICBiTmVnID0gdHJ1ZTsKLSAgICAgIGNjLS07Ci0gICAgfQotICAgIGlmIChjYyA+PSAwKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIGlmIChkb3RfaW5kZXggPCBsZW4gJiYgKGR3Rm9ybWF0U3R5bGUgJiBGWF9OVU1TVFlMRV9Eb3RWb3J2KSkgewotICAgIHdzVmFsdWUgKz0gJy4nOwotICB9Ci0gIGlmICghYlJldmVyc2VQYXJzZSkgewotICAgIGNjZiA9IGRvdF9pbmRleF9mICsgMTsKLSAgICBjYyA9IChkb3RfaW5kZXggPT0gbGVuKSA/IGxlbiA6IGRvdF9pbmRleCArIDE7Ci0gICAgd2hpbGUgKGNjIDwgbGVuICYmIGNjZiA8IGxlbmYpIHsKLSAgICAgIHN3aXRjaCAoc3RyZltjY2ZdKSB7Ci0gICAgICAgIGNhc2UgJ1wnJzogewotICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGl0ZXJhbCA9IEZYX0dldExpdGVyYWxUZXh0KHN0cmYsIGNjZiwgbGVuZik7Ci0gICAgICAgICAgaW50MzJfdCBpTGl0ZXJhbExlbiA9IHdzTGl0ZXJhbC5HZXRMZW5ndGgoKTsKLSAgICAgICAgICBpZiAoY2MgKyBpTGl0ZXJhbExlbiA+IGxlbiB8fAotICAgICAgICAgICAgICBGWFNZU193Y3NuY21wKHN0ciArIGNjLCB3c0xpdGVyYWwuY19zdHIoKSwgaUxpdGVyYWxMZW4pKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjICs9IGlMaXRlcmFsTGVuOwotICAgICAgICAgIGNjZisrOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgJzknOgotICAgICAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgeyB3c1ZhbHVlICs9IHN0cltjY107IH0KLSAgICAgICAgICBjYysrOwotICAgICAgICAgIGNjZisrOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICd6JzoKLSAgICAgICAgICBpZiAoRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgICAgIHdzVmFsdWUgKz0gc3RyW2NjXTsKLSAgICAgICAgICAgIGNjKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjZisrOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdaJzoKLSAgICAgICAgICBpZiAoc3RyW2NjXSAhPSAnICcpIHsKLSAgICAgICAgICAgIGlmIChGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgICAgICAgICB3c1ZhbHVlICs9IHN0cltjY107Ci0gICAgICAgICAgICAgIGNjKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNjKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjZisrOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdTJzoKLSAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycgfHwgc3RyW2NjXSA9PSAnICcpIHsKLSAgICAgICAgICAgIGNjKys7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChjYyArIGlNaW51c0xlbiA+IGxlbiB8fAotICAgICAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIHdzTWludXMuY19zdHIoKSwgaU1pbnVzTGVuKSkgewotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBiTmVnID0gdHJ1ZTsKLSAgICAgICAgICAgIGNjICs9IGlNaW51c0xlbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2NmKys7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ3MnOgotICAgICAgICAgIGlmIChzdHJbY2NdID09ICcrJykgewotICAgICAgICAgICAgY2MrKzsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGNjICsgaU1pbnVzTGVuID4gbGVuIHx8Ci0gICAgICAgICAgICAgICAgRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgd3NNaW51cy5jX3N0cigpLCBpTWludXNMZW4pKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJOZWcgPSB0cnVlOwotICAgICAgICAgICAgY2MgKz0gaU1pbnVzTGVuOwotICAgICAgICAgIH0KLSAgICAgICAgICBjY2YrKzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnRSc6IHsKLSAgICAgICAgICBpZiAoY2MgPj0gbGVuIHx8IChzdHJbY2NdICE9ICdFJyAmJiBzdHJbY2NdICE9ICdlJykpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYm9vbCBiRXhwU2lnbiA9IGZhbHNlOwotICAgICAgICAgIGNjKys7Ci0gICAgICAgICAgaWYgKGNjIDwgbGVuKSB7Ci0gICAgICAgICAgICBpZiAoc3RyW2NjXSA9PSAnKycpIHsKLSAgICAgICAgICAgICAgY2MrKzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyW2NjXSA9PSAnLScpIHsKLSAgICAgICAgICAgICAgYkV4cFNpZ24gPSB0cnVlOwotICAgICAgICAgICAgICBjYysrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsKLSAgICAgICAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpRXhwb25lbnQgPSBpRXhwb25lbnQgKiAxMCArIHN0cltjY10gLSAnMCc7Ci0gICAgICAgICAgICBjYysrOwotICAgICAgICAgIH0KLSAgICAgICAgICBpRXhwb25lbnQgPSBiRXhwU2lnbiA/IC1pRXhwb25lbnQgOiBpRXhwb25lbnQ7Ci0gICAgICAgICAgY2NmKys7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgJyQnOiB7Ci0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7Ci0gICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzU3ltYm9sKTsKLSAgICAgICAgICBpbnQzMl90IGlTeW1ib2xMZW4gPSB3c1N5bWJvbC5HZXRMZW5ndGgoKTsKLSAgICAgICAgICBpZiAoY2MgKyBpU3ltYm9sTGVuID4gbGVuIHx8Ci0gICAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIHdzU3ltYm9sLmNfc3RyKCksIGlTeW1ib2xMZW4pKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjICs9IGlTeW1ib2xMZW47Ci0gICAgICAgICAgY2NmKys7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2MnOgotICAgICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdyJykgewotICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJ0MnICYmIGNjICsgMSA8IGxlbiAmJiBzdHJbY2MgKyAxXSA9PSAnUicpIHsKLSAgICAgICAgICAgICAgYk5lZyA9IHRydWU7Ci0gICAgICAgICAgICAgIGNjICs9IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjY2YgKz0gMjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0MnOgotICAgICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdSJykgewotICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJyAnKSB7Ci0gICAgICAgICAgICAgIGNjKys7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJ0MnICYmIGNjICsgMSA8IGxlbiAmJiBzdHJbY2MgKyAxXSA9PSAnUicpIHsKLSAgICAgICAgICAgICAgYk5lZyA9IHRydWU7Ci0gICAgICAgICAgICAgIGNjICs9IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjY2YgKz0gMjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2QnOgotICAgICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdiJykgewotICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJ0QnICYmIGNjICsgMSA8IGxlbiAmJiBzdHJbY2MgKyAxXSA9PSAnQicpIHsKLSAgICAgICAgICAgICAgYk5lZyA9IHRydWU7Ci0gICAgICAgICAgICAgIGNjICs9IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjY2YgKz0gMjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ0QnOgotICAgICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdCJykgewotICAgICAgICAgICAgaWYgKHN0cltjY10gPT0gJyAnKSB7Ci0gICAgICAgICAgICAgIGNjKys7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gPT0gJ0QnICYmIGNjICsgMSA8IGxlbiAmJiBzdHJbY2MgKyAxXSA9PSAnQicpIHsKLSAgICAgICAgICAgICAgYk5lZyA9IHRydWU7Ci0gICAgICAgICAgICAgIGNjICs9IDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjY2YgKz0gMjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJy4nOgotICAgICAgICBjYXNlICdWJzoKLSAgICAgICAgY2FzZSAndic6Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNlICclJzogewotICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOwotICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50LCB3c1N5bWJvbCk7Ci0gICAgICAgICAgaW50MzJfdCBpU3lzbWJvbExlbiA9IHdzU3ltYm9sLkdldExlbmd0aCgpOwotICAgICAgICAgIGlmIChjYyArIGlTeXNtYm9sTGVuIDw9IGxlbiAmJgotICAgICAgICAgICAgICAhRlhTWVNfd2NzbmNtcChzdHIgKyBjYywgd3NTeW1ib2wuY19zdHIoKSwgaVN5c21ib2xMZW4pKSB7Ci0gICAgICAgICAgICBjYyArPSBpU3lzbWJvbExlbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2NmKys7Ci0gICAgICAgICAgYkhhdmVQZXJjZW50U3ltYm9sID0gdHJ1ZTsKLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSAnOCc6IHsKLSAgICAgICAgICB3aGlsZSAoY2NmIDwgbGVuZiAmJiBzdHJmW2NjZl0gPT0gJzgnKSB7Ci0gICAgICAgICAgICBjY2YrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIEZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKSB7Ci0gICAgICAgICAgICB3c1ZhbHVlICs9IHN0cltjY107Ci0gICAgICAgICAgICBjYysrOwotICAgICAgICAgIH0KLSAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSAnLCc6IHsKLSAgICAgICAgICBpZiAoY2MgKyBpR3JvdXBMZW4gPD0gbGVuICYmCi0gICAgICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIHdzR3JvdXBTeW1ib2wuY19zdHIoKSwgaUdyb3VwTGVuKSA9PSAwKSB7Ci0gICAgICAgICAgICBjYyArPSBpR3JvdXBMZW47Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjZisrOwotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlICcoJzoKLSAgICAgICAgICBpZiAoc3RyW2NjXSA9PSBMJygnKSB7Ci0gICAgICAgICAgICBiTmVnID0gdHJ1ZTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYysrOwotICAgICAgICAgIGNjZisrOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICcpJzoKLSAgICAgICAgICBpZiAoc3RyW2NjXSA9PSBMJyknKSB7Ci0gICAgICAgICAgICBiTmVnID0gdHJ1ZTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHN0cltjY10gIT0gTCcgJykgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYysrOwotICAgICAgICAgIGNjZisrOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGlmIChzdHJmW2NjZl0gIT0gc3RyW2NjXSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYysrOwotICAgICAgICAgIGNjZisrOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoY2MgIT0gbGVuKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIGlmIChpRXhwb25lbnQgfHwgYkhhdmVQZXJjZW50U3ltYm9sKSB7Ci0gICAgQ0ZYX0RlY2ltYWwgZGVjaW1hbCA9IENGWF9EZWNpbWFsKHdzVmFsdWUuQXNTdHJpbmdDKCkpOwotICAgIGlmIChpRXhwb25lbnQpIHsKLSAgICAgIGRlY2ltYWwgPSBkZWNpbWFsICogQ0ZYX0RlY2ltYWwoRlhTWVNfcG93KDEwLCAoRlhfRkxPQVQpaUV4cG9uZW50KSk7Ci0gICAgfQotICAgIGlmIChiSGF2ZVBlcmNlbnRTeW1ib2wpIHsKLSAgICAgIGRlY2ltYWwgPSBkZWNpbWFsIC8gQ0ZYX0RlY2ltYWwoMTAwKTsKLSAgICB9Ci0gICAgd3NWYWx1ZSA9IGRlY2ltYWw7Ci0gIH0KLSAgaWYgKGJOZWcpIHsKLSAgICB3c1ZhbHVlID0gTCctJyArIHdzVmFsdWU7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci1GWF9EQVRFVElNRVRZUEUgQ0ZYX0Zvcm1hdFN0cmluZzo6R2V0RGF0ZVRpbWVGb3JtYXQoCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwKLSAgICBJRlhfTG9jYWxlKiYgcExvY2FsZSwKLSAgICBDRlhfV2lkZVN0cmluZyYgd3NEYXRlUGF0dGVybiwKLSAgICBDRlhfV2lkZVN0cmluZyYgd3NUaW1lUGF0dGVybikgewotICBwTG9jYWxlID0gbnVsbHB0cjsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wUGF0dGVybjsKLSAgRlhfTE9DQUxFQ0FURUdPUlkgZUNhdGVnb3J5ID0gRlhfTE9DQUxFQ0FURUdPUllfVW5rbm93bjsKLSAgaW50MzJfdCBjY2YgPSAwOwotICBpbnQzMl90IGlMZW5mID0gd3NQYXR0ZXJuLkdldExlbmd0aCgpOwotICBjb25zdCBGWF9XQ0hBUiogcFN0ciA9IHdzUGF0dGVybi5jX3N0cigpOwotICBpbnQzMl90IGlGaW5kQ2F0ZWdvcnkgPSAwOwotICBib29sIGJCcmFjZU9wZW4gPSBmYWxzZTsKLSAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ29uc3RDaGFycyhnc193c0NvbnN0Q2hhcnMpOwotICB3aGlsZSAoY2NmIDwgaUxlbmYpIHsKLSAgICBpZiAocFN0cltjY2ZdID09ICdcJycpIHsKLSAgICAgIGludDMyX3QgaUN1ckNoYXIgPSBjY2Y7Ci0gICAgICBGWF9HZXRMaXRlcmFsVGV4dChwU3RyLCBjY2YsIGlMZW5mKTsKLSAgICAgIHdzVGVtcFBhdHRlcm4gKz0gQ0ZYX1dpZGVTdHJpbmdDKHBTdHIgKyBpQ3VyQ2hhciwgY2NmIC0gaUN1ckNoYXIgKyAxKTsKLSAgICB9IGVsc2UgaWYgKCFiQnJhY2VPcGVuICYmIGlGaW5kQ2F0ZWdvcnkgIT0gMyAmJgotICAgICAgICAgICAgICAgd3NDb25zdENoYXJzLkZpbmQocFN0cltjY2ZdKSA9PSAtMSkgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDYXRlZ29yeShwU3RyW2NjZl0pOwotICAgICAgY2NmKys7Ci0gICAgICB3aGlsZSAoY2NmIDwgaUxlbmYgJiYgcFN0cltjY2ZdICE9ICd7JyAmJiBwU3RyW2NjZl0gIT0gJy4nICYmCi0gICAgICAgICAgICAgcFN0cltjY2ZdICE9ICcoJykgewotICAgICAgICBpZiAocFN0cltjY2ZdID09ICdUJykgewotICAgICAgICAgIHdzRGF0ZVBhdHRlcm4gPSB3c1BhdHRlcm4uTGVmdChjY2YpOwotICAgICAgICAgIHdzVGltZVBhdHRlcm4gPSB3c1BhdHRlcm4uUmlnaHQod3NQYXR0ZXJuLkdldExlbmd0aCgpIC0gY2NmKTsKLSAgICAgICAgICB3c1RpbWVQYXR0ZXJuLlNldEF0KDAsICcgJyk7Ci0gICAgICAgICAgaWYgKCFwTG9jYWxlKSB7Ci0gICAgICAgICAgICBwTG9jYWxlID0gbV9wTG9jYWxlTWdyLT5HZXREZWZMb2NhbGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIEZYX0RBVEVUSU1FVFlQRV9EYXRlVGltZTsKLSAgICAgICAgfQotICAgICAgICB3c0NhdGVnb3J5ICs9IHBTdHJbY2NmXTsKLSAgICAgICAgY2NmKys7Ci0gICAgICB9Ci0gICAgICBpZiAoIShpRmluZENhdGVnb3J5ICYgMSkgJiYgd3NDYXRlZ29yeSA9PSBMImRhdGUiKSB7Ci0gICAgICAgIGlGaW5kQ2F0ZWdvcnkgfD0gMTsKLSAgICAgICAgZUNhdGVnb3J5ID0gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZTsKLSAgICAgICAgaWYgKGlGaW5kQ2F0ZWdvcnkgJiAyKSB7Ci0gICAgICAgICAgaUZpbmRDYXRlZ29yeSA9IDQ7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoIShpRmluZENhdGVnb3J5ICYgMikgJiYgd3NDYXRlZ29yeSA9PSBMInRpbWUiKSB7Ci0gICAgICAgIGlGaW5kQ2F0ZWdvcnkgfD0gMjsKLSAgICAgICAgZUNhdGVnb3J5ID0gRlhfTE9DQUxFQ0FURUdPUllfVGltZTsKLSAgICAgIH0gZWxzZSBpZiAod3NDYXRlZ29yeSA9PSBMImRhdGV0aW1lIikgewotICAgICAgICBpRmluZENhdGVnb3J5ID0gMzsKLSAgICAgICAgZUNhdGVnb3J5ID0gRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIHdoaWxlIChjY2YgPCBpTGVuZikgewotICAgICAgICBpZiAocFN0cltjY2ZdID09ICcoJykgewotICAgICAgICAgIGNjZisrOwotICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTENJRDsKLSAgICAgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYgJiYgcFN0cltjY2ZdICE9ICcpJykgewotICAgICAgICAgICAgd3NMQ0lEICs9IHBTdHJbY2NmKytdOwotICAgICAgICAgIH0KLSAgICAgICAgICBwTG9jYWxlID0gR2V0UGF0dGVybkxvY2FsZSh3c0xDSUQpOwotICAgICAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSA9PSAneycpIHsKLSAgICAgICAgICBiQnJhY2VPcGVuID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIGlmIChwU3RyW2NjZl0gPT0gJy4nKSB7Ci0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTdWJDYXRlZ29yeTsKLSAgICAgICAgICBjY2YrKzsKLSAgICAgICAgICB3aGlsZSAoY2NmIDwgaUxlbmYgJiYgcFN0cltjY2ZdICE9ICcoJyAmJiBwU3RyW2NjZl0gIT0gJ3snKSB7Ci0gICAgICAgICAgICB3c1N1YkNhdGVnb3J5ICs9IHBTdHJbY2NmKytdOwotICAgICAgICAgIH0KLSAgICAgICAgICB1aW50MzJfdCBkd1N1Ykhhc2ggPQotICAgICAgICAgICAgICBGWF9IYXNoQ29kZV9HZXRXKHdzU3ViQ2F0ZWdvcnkuQXNTdHJpbmdDKCksIGZhbHNlKTsKLSAgICAgICAgICBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVTdWJDYXRlZ29yeSA9Ci0gICAgICAgICAgICAgIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtOwotICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGdfaUZYTG9jYWxlRGF0ZVRpbWVTdWJDYXRDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZ19GWExvY2FsZURhdGVUaW1lU3ViQ2F0RGF0YVtpXS51SGFzaCA9PSBkd1N1Ykhhc2gpIHsKLSAgICAgICAgICAgICAgZVN1YkNhdGVnb3J5ID0KLSAgICAgICAgICAgICAgICAgIChGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZKWdfRlhMb2NhbGVEYXRlVGltZVN1YkNhdERhdGFbaV0KLSAgICAgICAgICAgICAgICAgICAgICAuZVN1YkNhdGVnb3J5OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCFwTG9jYWxlKSB7Ci0gICAgICAgICAgICBwTG9jYWxlID0gbV9wTG9jYWxlTWdyLT5HZXREZWZMb2NhbGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgQVNTRVJUKHBMb2NhbGUpOwotICAgICAgICAgIHN3aXRjaCAoZUNhdGVnb3J5KSB7Ci0gICAgICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGU6Ci0gICAgICAgICAgICAgIHBMb2NhbGUtPkdldERhdGVQYXR0ZXJuKGVTdWJDYXRlZ29yeSwgd3NEYXRlUGF0dGVybik7Ci0gICAgICAgICAgICAgIHdzRGF0ZVBhdHRlcm4gPSB3c1RlbXBQYXR0ZXJuICsgd3NEYXRlUGF0dGVybjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWU6Ci0gICAgICAgICAgICAgIHBMb2NhbGUtPkdldFRpbWVQYXR0ZXJuKGVTdWJDYXRlZ29yeSwgd3NUaW1lUGF0dGVybik7Ci0gICAgICAgICAgICAgIHdzVGltZVBhdHRlcm4gPSB3c1RlbXBQYXR0ZXJuICsgd3NUaW1lUGF0dGVybjsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lOgotICAgICAgICAgICAgICBwTG9jYWxlLT5HZXREYXRlUGF0dGVybihlU3ViQ2F0ZWdvcnksIHdzRGF0ZVBhdHRlcm4pOwotICAgICAgICAgICAgICB3c0RhdGVQYXR0ZXJuID0gd3NUZW1wUGF0dGVybiArIHdzRGF0ZVBhdHRlcm47Ci0gICAgICAgICAgICAgIHBMb2NhbGUtPkdldFRpbWVQYXR0ZXJuKGVTdWJDYXRlZ29yeSwgd3NUaW1lUGF0dGVybik7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIHdzVGVtcFBhdHRlcm4uY2xlYXIoKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBjY2YrKzsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHBTdHJbY2NmXSA9PSAnfScpIHsKLSAgICAgIGJCcmFjZU9wZW4gPSBmYWxzZTsKLSAgICAgIGlmICghd3NUZW1wUGF0dGVybi5Jc0VtcHR5KCkpIHsKLSAgICAgICAgaWYgKGVDYXRlZ29yeSA9PSBGWF9MT0NBTEVDQVRFR09SWV9UaW1lKSB7Ci0gICAgICAgICAgd3NUaW1lUGF0dGVybiA9IHdzVGVtcFBhdHRlcm47Ci0gICAgICAgIH0gZWxzZSBpZiAoZUNhdGVnb3J5ID09IEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGUpIHsKLSAgICAgICAgICB3c0RhdGVQYXR0ZXJuID0gd3NUZW1wUGF0dGVybjsKLSAgICAgICAgfQotICAgICAgICB3c1RlbXBQYXR0ZXJuLmNsZWFyKCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHdzVGVtcFBhdHRlcm4gKz0gcFN0cltjY2ZdOwotICAgIH0KLSAgICBjY2YrKzsKLSAgfQotICBpZiAoIXdzVGVtcFBhdHRlcm4uSXNFbXB0eSgpKSB7Ci0gICAgaWYgKGVDYXRlZ29yeSA9PSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlKSB7Ci0gICAgICB3c0RhdGVQYXR0ZXJuICs9IHdzVGVtcFBhdHRlcm47Ci0gICAgfSBlbHNlIHsKLSAgICAgIHdzVGltZVBhdHRlcm4gKz0gd3NUZW1wUGF0dGVybjsKLSAgICB9Ci0gIH0KLSAgaWYgKCFwTG9jYWxlKSB7Ci0gICAgcExvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7Ci0gIH0KLSAgaWYgKCFpRmluZENhdGVnb3J5KSB7Ci0gICAgd3NUaW1lUGF0dGVybi5jbGVhcigpOwotICAgIHdzRGF0ZVBhdHRlcm4gPSB3c1BhdHRlcm47Ci0gIH0KLSAgcmV0dXJuIChGWF9EQVRFVElNRVRZUEUpaUZpbmRDYXRlZ29yeTsKLX0KLXN0YXRpYyBib29sIEZYX1BhcnNlTG9jYWxlRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGVQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1VuaXRpbWUmIGRhdGV0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGNjKSB7Ci0gIGludDMyX3QgeWVhciA9IDE5MDA7Ci0gIGludDMyX3QgbW9udGggPSAxOwotICBpbnQzMl90IGRheSA9IDE7Ci0gIGludDMyX3QgY2NmID0gMDsKLSAgY29uc3QgRlhfV0NIQVIqIHN0ciA9IHdzRGF0ZS5jX3N0cigpOwotICBpbnQzMl90IGxlbiA9IHdzRGF0ZS5HZXRMZW5ndGgoKTsKLSAgY29uc3QgRlhfV0NIQVIqIHN0cmYgPSB3c0RhdGVQYXR0ZXJuLmNfc3RyKCk7Ci0gIGludDMyX3QgbGVuZiA9IHdzRGF0ZVBhdHRlcm4uR2V0TGVuZ3RoKCk7Ci0gIENGWF9XaWRlU3RyaW5nQyB3c0RhdGVTeW1ib2xzKGdzX3dzRGF0ZVN5bWJvbHMpOwotICB3aGlsZSAoY2MgPCBsZW4gJiYgY2NmIDwgbGVuZikgewotICAgIGlmIChzdHJmW2NjZl0gPT0gJ1wnJykgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaXRlcmFsID0gRlhfR2V0TGl0ZXJhbFRleHQoc3RyZiwgY2NmLCBsZW5mKTsKLSAgICAgIGludDMyX3QgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7Ci0gICAgICBpZiAoY2MgKyBpTGl0ZXJhbExlbiA+IGxlbiB8fAotICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIHdzTGl0ZXJhbC5jX3N0cigpLCBpTGl0ZXJhbExlbikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgY2MgKz0gaUxpdGVyYWxMZW47Ci0gICAgICBjY2YrKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0gZWxzZSBpZiAod3NEYXRlU3ltYm9scy5GaW5kKHN0cmZbY2NmXSkgPT0gLTEpIHsKLSAgICAgIGlmIChzdHJmW2NjZl0gIT0gc3RyW2NjXSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgY2MrKzsKLSAgICAgIGNjZisrOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIHVpbnQzMl90IGR3U3ltYm9sTnVtID0gMTsKLSAgICBGWF9XQ0hBUiBkd0NoYXJTeW1ib2wgPSBzdHJmW2NjZisrXTsKLSAgICB3aGlsZSAoY2NmIDwgbGVuZiAmJiBzdHJmW2NjZl0gPT0gZHdDaGFyU3ltYm9sKSB7Ci0gICAgICBjY2YrKzsKLSAgICAgIGR3U3ltYm9sTnVtKys7Ci0gICAgfQotICAgIHVpbnQzMl90IGR3U3ltYm9sID0gKGR3Q2hhclN5bWJvbCA8PCA4KSB8IChkd1N5bWJvbE51bSArICcwJyk7Ci0gICAgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRCcsICcxJykpIHsKLSAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgZGF5ID0gc3RyW2NjKytdIC0gJzAnOwotICAgICAgaWYgKGNjIDwgbGVuICYmIEZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKSB7Ci0gICAgICAgIGRheSA9IGRheSAqIDEwICsgc3RyW2NjKytdIC0gJzAnOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdEJywgJzInKSkgewotICAgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBkYXkgPSBzdHJbY2MrK10gLSAnMCc7Ci0gICAgICBpZiAoY2MgPCBsZW4pIHsKLSAgICAgICAgZGF5ID0gZGF5ICogMTAgKyBzdHJbY2MrK10gLSAnMCc7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0onLCAnMScpKSB7Ci0gICAgICBpbnQgaSA9IDA7Ci0gICAgICB3aGlsZSAoY2MgPCBsZW4gJiYgaSA8IDMgJiYgRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgY2MrKzsKLSAgICAgICAgaSsrOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdKJywgJzMnKSkgewotICAgICAgY2MgKz0gMzsKLSAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICcxJykpIHsKLSAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgbW9udGggPSBzdHJbY2MrK10gLSAnMCc7Ci0gICAgICBpZiAoY2MgPCBsZW4gJiYgRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgbW9udGggPSBtb250aCAqIDEwICsgc3RyW2NjKytdIC0gJzAnOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdNJywgJzInKSkgewotICAgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBtb250aCA9IHN0cltjYysrXSAtICcwJzsKLSAgICAgIGlmIChjYyA8IGxlbikgewotICAgICAgICBtb250aCA9IG1vbnRoICogMTAgKyBzdHJbY2MrK10gLSAnMCc7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ00nLCAnMycpKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c01vbnRoTmFtZUFiYnI7Ci0gICAgICB1aW50MTZfdCBpID0gMDsKLSAgICAgIGZvciAoOyBpIDwgMTI7IGkrKykgewotICAgICAgICBwTG9jYWxlLT5HZXRNb250aE5hbWUoaSwgd3NNb250aE5hbWVBYmJyLCB0cnVlKTsKLSAgICAgICAgaWYgKHdzTW9udGhOYW1lQWJici5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIUZYU1lTX3djc25jbXAod3NNb250aE5hbWVBYmJyLmNfc3RyKCksIHN0ciArIGNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NNb250aE5hbWVBYmJyLkdldExlbmd0aCgpKSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoaSA8IDEyKSB7Ci0gICAgICAgIGNjICs9IHdzTW9udGhOYW1lQWJici5HZXRMZW5ndGgoKTsKLSAgICAgICAgbW9udGggPSBpICsgMTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICc0JykpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzTW9udGhOYW1lOwotICAgICAgdWludDE2X3QgaSA9IDA7Ci0gICAgICBmb3IgKDsgaSA8IDEyOyBpKyspIHsKLSAgICAgICAgcExvY2FsZS0+R2V0TW9udGhOYW1lKGksIHdzTW9udGhOYW1lLCBmYWxzZSk7Ci0gICAgICAgIGlmICh3c01vbnRoTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIUZYU1lTX3djc25jbXAod3NNb250aE5hbWUuY19zdHIoKSwgc3RyICsgY2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB3c01vbnRoTmFtZS5HZXRMZW5ndGgoKSkpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGkgPCAxMikgewotICAgICAgICBjYyArPSB3c01vbnRoTmFtZS5HZXRMZW5ndGgoKTsKLSAgICAgICAgbW9udGggPSBpICsgMTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRScsICcxJykpIHsKLSAgICAgIGNjICs9IDE7Ci0gICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0UnLCAnMycpKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c0RheU5hbWVBYmJyOwotICAgICAgdWludDE2X3QgaSA9IDA7Ci0gICAgICBmb3IgKDsgaSA8IDc7IGkrKykgewotICAgICAgICBwTG9jYWxlLT5HZXREYXlOYW1lKGksIHdzRGF5TmFtZUFiYnIsIHRydWUpOwotICAgICAgICBpZiAod3NEYXlOYW1lQWJici5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIUZYU1lTX3djc25jbXAod3NEYXlOYW1lQWJici5jX3N0cigpLCBzdHIgKyBjYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzRGF5TmFtZUFiYnIuR2V0TGVuZ3RoKCkpKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChpIDwgMTIpIHsKLSAgICAgICAgY2MgKz0gd3NEYXlOYW1lQWJici5HZXRMZW5ndGgoKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRScsICc0JykpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF5TmFtZTsKLSAgICAgIGludDMyX3QgaSA9IDA7Ci0gICAgICBmb3IgKDsgaSA8IDc7IGkrKykgewotICAgICAgICBwTG9jYWxlLT5HZXREYXlOYW1lKGksIHdzRGF5TmFtZSwgZmFsc2UpOwotICAgICAgICBpZiAod3NEYXlOYW1lID09IEwiIikgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghRlhTWVNfd2NzbmNtcCh3c0RheU5hbWUuY19zdHIoKSwgc3RyICsgY2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB3c0RheU5hbWUuR2V0TGVuZ3RoKCkpKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChpIDwgMTIpIHsKLSAgICAgICAgY2MgKz0gd3NEYXlOYW1lLkdldExlbmd0aCgpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdlJywgJzEnKSkgewotICAgICAgY2MgKz0gMTsKLSAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRycsICcxJykpIHsKLSAgICAgIGNjICs9IDI7Ci0gICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ1knLCAnMicpKSB7Ci0gICAgICBpZiAoY2MgKyAyID4gbGVuKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgeWVhciA9IHN0cltjYysrXSAtICcwJzsKLSAgICAgIGlmIChjYyA+PSBsZW4gfHwgIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHllYXIgPSB5ZWFyICogMTAgKyBzdHJbY2MrK10gLSAnMCc7Ci0gICAgICBpZiAoeWVhciA8PSAyOSkgewotICAgICAgICB5ZWFyICs9IDIwMDA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB5ZWFyICs9IDE5MDA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ1knLCAnNCcpKSB7Ci0gICAgICBpbnQgaSA9IDA7Ci0gICAgICB5ZWFyID0gMDsKLSAgICAgIGlmIChjYyArIDQgPiBsZW4pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgd2hpbGUgKGkgPCA0KSB7Ci0gICAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgeWVhciA9IHllYXIgKiAxMCArIHN0cltjY10gLSAnMCc7Ci0gICAgICAgIGNjKys7Ci0gICAgICAgIGkrKzsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAndycsICcxJykpIHsKLSAgICAgIGNjICs9IDE7Ci0gICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ1cnLCAnMicpKSB7Ci0gICAgICBjYyArPSAyOwotICAgIH0KLSAgfQotICBpZiAoY2MgPCBsZW4pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQ0ZYX1VuaXRpbWUgdXQ7Ci0gIHV0LlNldCh5ZWFyLCBtb250aCwgZGF5KTsKLSAgZGF0ZXRpbWUgPSBkYXRldGltZSArIHV0OwotICByZXR1cm4gISFjYzsKLX0KLQotc3RhdGljIHZvaWQgRlhfUmVzb2x2ZVpvbmUodWludDhfdCYgd0hvdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiB3TWludXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfVElNRVpPTkUgdHpEaWZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSkgewotICBpbnQzMl90IGlNaW51dGVEaWZmID0gd0hvdXIgKiA2MCArIHdNaW51dGU7Ci0gIEZYX1RJTUVaT05FIHR6TG9jYWxlOwotICBwTG9jYWxlLT5HZXRUaW1lWm9uZSgmdHpMb2NhbGUpOwotICBpTWludXRlRGlmZiArPSB0ekxvY2FsZS50ekhvdXIgKiA2MCArCi0gICAgICAgICAgICAgICAgICh0ekxvY2FsZS50ekhvdXIgPCAwID8gLXR6TG9jYWxlLnR6TWludXRlIDogdHpMb2NhbGUudHpNaW51dGUpOwotICBpTWludXRlRGlmZiAtPSB0ekRpZmYudHpIb3VyICogNjAgKwotICAgICAgICAgICAgICAgICAodHpEaWZmLnR6SG91ciA8IDAgPyAtdHpEaWZmLnR6TWludXRlIDogdHpEaWZmLnR6TWludXRlKTsKLSAgd2hpbGUgKGlNaW51dGVEaWZmID4gMTQ0MCkgewotICAgIGlNaW51dGVEaWZmIC09IDE0NDA7Ci0gIH0KLSAgd2hpbGUgKGlNaW51dGVEaWZmIDwgMCkgewotICAgIGlNaW51dGVEaWZmICs9IDE0NDA7Ci0gIH0KLSAgd0hvdXIgPSBpTWludXRlRGlmZiAvIDYwOwotICB3TWludXRlID0gaU1pbnV0ZURpZmYgJSA2MDsKLX0KLXN0YXRpYyBib29sIEZYX1BhcnNlTG9jYWxlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RpbWVQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1VuaXRpbWUmIGRhdGV0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGNjKSB7Ci0gIHVpbnQ4X3QgaG91ciA9IDA7Ci0gIHVpbnQ4X3QgbWludXRlID0gMDsKLSAgdWludDhfdCBzZWNvbmQgPSAwOwotICB1aW50MTZfdCBtaWxsaXNlY29uZCA9IDA7Ci0gIGludDMyX3QgY2NmID0gMDsKLSAgY29uc3QgRlhfV0NIQVIqIHN0ciA9IHdzVGltZS5jX3N0cigpOwotICBpbnQgbGVuID0gd3NUaW1lLkdldExlbmd0aCgpOwotICBjb25zdCBGWF9XQ0hBUiogc3RyZiA9IHdzVGltZVBhdHRlcm4uY19zdHIoKTsKLSAgaW50IGxlbmYgPSB3c1RpbWVQYXR0ZXJuLkdldExlbmd0aCgpOwotICBib29sIGJIYXNBID0gZmFsc2U7Ci0gIGJvb2wgYlBNID0gZmFsc2U7Ci0gIENGWF9XaWRlU3RyaW5nQyB3c1RpbWVTeW1ib2xzKGdzX3dzVGltZVN5bWJvbHMpOwotICB3aGlsZSAoY2MgPCBsZW4gJiYgY2NmIDwgbGVuZikgewotICAgIGlmIChzdHJmW2NjZl0gPT0gJ1wnJykgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaXRlcmFsID0gRlhfR2V0TGl0ZXJhbFRleHQoc3RyZiwgY2NmLCBsZW5mKTsKLSAgICAgIGludDMyX3QgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7Ci0gICAgICBpZiAoY2MgKyBpTGl0ZXJhbExlbiA+IGxlbiB8fAotICAgICAgICAgIEZYU1lTX3djc25jbXAoc3RyICsgY2MsIHdzTGl0ZXJhbC5jX3N0cigpLCBpTGl0ZXJhbExlbikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgY2MgKz0gaUxpdGVyYWxMZW47Ci0gICAgICBjY2YrKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0gZWxzZSBpZiAod3NUaW1lU3ltYm9scy5GaW5kKHN0cmZbY2NmXSkgPT0gLTEpIHsKLSAgICAgIGlmIChzdHJmW2NjZl0gIT0gc3RyW2NjXSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgY2MrKzsKLSAgICAgIGNjZisrOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIHVpbnQzMl90IGR3U3ltYm9sTnVtID0gMTsKLSAgICBGWF9XQ0hBUiBkd0NoYXJTeW1ib2wgPSBzdHJmW2NjZisrXTsKLSAgICB3aGlsZSAoY2NmIDwgbGVuZiAmJiBzdHJmW2NjZl0gPT0gZHdDaGFyU3ltYm9sKSB7Ci0gICAgICBjY2YrKzsKLSAgICAgIGR3U3ltYm9sTnVtKys7Ci0gICAgfQotICAgIHVpbnQzMl90IGR3U3ltYm9sID0gKGR3Q2hhclN5bWJvbCA8PCA4KSB8IChkd1N5bWJvbE51bSArICcwJyk7Ci0gICAgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnaycsICcxJykgfHwKLSAgICAgICAgZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdIJywgJzEnKSB8fAotICAgICAgICBkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ2gnLCAnMScpIHx8Ci0gICAgICAgIGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSycsICcxJykpIHsKLSAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaG91ciA9IHN0cltjYysrXSAtICcwJzsKLSAgICAgIGlmIChjYyA8IGxlbiAmJiBGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgICBob3VyID0gaG91ciAqIDEwICsgc3RyW2NjKytdIC0gJzAnOwotICAgICAgfQotICAgICAgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSycsICcxJykgJiYgaG91ciA9PSAyNCkgewotICAgICAgICBob3VyID0gMDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnaycsICcyJykgfHwKLSAgICAgICAgICAgICAgIGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSCcsICcyJykgfHwKLSAgICAgICAgICAgICAgIGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnaCcsICcyJykgfHwKLSAgICAgICAgICAgICAgIGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSycsICcyJykpIHsKLSAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaG91ciA9IHN0cltjYysrXSAtICcwJzsKLSAgICAgIGlmIChjYyA+PSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBob3VyID0gaG91ciAqIDEwICsgc3RyW2NjKytdIC0gJzAnOwotICAgICAgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSycsICcyJykgJiYgaG91ciA9PSAyNCkgewotICAgICAgICBob3VyID0gMDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICcxJykpIHsKLSAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgbWludXRlID0gc3RyW2NjKytdIC0gJzAnOwotICAgICAgaWYgKGNjIDwgbGVuICYmIEZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKSB7Ci0gICAgICAgIG1pbnV0ZSA9IG1pbnV0ZSAqIDEwICsgc3RyW2NjKytdIC0gJzAnOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdNJywgJzInKSkgewotICAgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBtaW51dGUgPSBzdHJbY2MrK10gLSAnMCc7Ci0gICAgICBpZiAoY2MgPj0gbGVuKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgbWludXRlID0gbWludXRlICogMTAgKyBzdHJbY2MrK10gLSAnMCc7Ci0gICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ1MnLCAnMScpKSB7Ci0gICAgICBpZiAoIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHNlY29uZCA9IHN0cltjYysrXSAtICcwJzsKLSAgICAgIGlmIChjYyA8IGxlbiAmJiBGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgICBzZWNvbmQgPSBzZWNvbmQgKiAxMCArIHN0cltjYysrXSAtICcwJzsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnUycsICcyJykpIHsKLSAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgc2Vjb25kID0gc3RyW2NjKytdIC0gJzAnOwotICAgICAgaWYgKGNjID49IGxlbikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHNlY29uZCA9IHNlY29uZCAqIDEwICsgc3RyW2NjKytdIC0gJzAnOwotICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdGJywgJzMnKSkgewotICAgICAgaWYgKGNjICsgMyA+PSBsZW4pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaW50IGkgPSAwOwotICAgICAgd2hpbGUgKGkgPCAzKSB7Ci0gICAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbWlsbGlzZWNvbmQgPSBtaWxsaXNlY29uZCAqIDEwICsgc3RyW2NjKytdIC0gJzAnOwotICAgICAgICBpKys7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0EnLCAnMScpKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c0FNOwotICAgICAgcExvY2FsZS0+R2V0TWVyaWRpZW1OYW1lKHdzQU0sIHRydWUpOwotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQTTsKLSAgICAgIHBMb2NhbGUtPkdldE1lcmlkaWVtTmFtZSh3c1BNLCBmYWxzZSk7Ci0gICAgICBpZiAoKGNjICsgd3NBTS5HZXRMZW5ndGgoKSA8PSBsZW4pICYmCi0gICAgICAgICAgKENGWF9XaWRlU3RyaW5nQyhzdHIgKyBjYywgd3NBTS5HZXRMZW5ndGgoKSkgPT0gd3NBTSkpIHsKLSAgICAgICAgY2MgKz0gd3NBTS5HZXRMZW5ndGgoKTsKLSAgICAgICAgYkhhc0EgPSB0cnVlOwotICAgICAgfSBlbHNlIGlmICgoY2MgKyB3c1BNLkdldExlbmd0aCgpIDw9IGxlbikgJiYKLSAgICAgICAgICAgICAgICAgKENGWF9XaWRlU3RyaW5nQyhzdHIgKyBjYywgd3NQTS5HZXRMZW5ndGgoKSkgPT0gd3NQTSkpIHsKLSAgICAgICAgY2MgKz0gd3NQTS5HZXRMZW5ndGgoKTsKLSAgICAgICAgYkhhc0EgPSB0cnVlOwotICAgICAgICBiUE0gPSB0cnVlOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdaJywgJzEnKSkgewotICAgICAgaWYgKGNjICsgMyA+IGxlbikgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIHVpbnQzMl90IGR3SGFzaCA9IHN0cltjYysrXTsKLSAgICAgIGR3SGFzaCA9IChkd0hhc2ggPDwgOCkgfCBzdHJbY2MrK107Ci0gICAgICBkd0hhc2ggPSAoZHdIYXNoIDw8IDgpIHwgc3RyW2NjKytdOwotICAgICAgaWYgKGR3SGFzaCA9PSBGWEJTVFJfSUQoMCwgJ0cnLCAnTScsICdUJykpIHsKLSAgICAgICAgRlhfVElNRVpPTkUgdHpEaWZmOwotICAgICAgICB0ekRpZmYudHpIb3VyID0gMDsKLSAgICAgICAgdHpEaWZmLnR6TWludXRlID0gMDsKLSAgICAgICAgaWYgKGNjIDwgbGVuICYmIChzdHJbY2NdID09ICctJyB8fCBzdHJbY2NdID09ICcrJykpIHsKLSAgICAgICAgICBjYyArPSBGWF9QYXJzZVRpbWVab25lKHN0ciArIGNjLCBsZW4gLSBjYywgdHpEaWZmKTsKLSAgICAgICAgfQotICAgICAgICBGWF9SZXNvbHZlWm9uZShob3VyLCBtaW51dGUsIHR6RGlmZiwgcExvY2FsZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb25zdCBGWF9MT0NBTEVUSU1FWk9ORUlORk8qIHBFbmQgPQotICAgICAgICAgICAgZ19GWExvY2FsZVRpbWVab25lRGF0YSArIEZYX0FycmF5U2l6ZShnX0ZYTG9jYWxlVGltZVpvbmVEYXRhKTsKLSAgICAgICAgY29uc3QgRlhfTE9DQUxFVElNRVpPTkVJTkZPKiBwVGltZVpvbmVJbmZvID0KLSAgICAgICAgICAgIHN0ZDo6bG93ZXJfYm91bmQoZ19GWExvY2FsZVRpbWVab25lRGF0YSwgcEVuZCwgZHdIYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBGWF9MT0NBTEVUSU1FWk9ORUlORk8mIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGhhc2gpIHsgcmV0dXJuIGluZm8udUhhc2ggPCBoYXNoOyB9KTsKLSAgICAgICAgaWYgKHBUaW1lWm9uZUluZm8gPCBwRW5kICYmIGR3SGFzaCA9PSBwVGltZVpvbmVJbmZvLT51SGFzaCkgewotICAgICAgICAgIGhvdXIgKz0gcFRpbWVab25lSW5mby0+aUhvdXI7Ci0gICAgICAgICAgbWludXRlICs9IHBUaW1lWm9uZUluZm8tPmlIb3VyID4gMCA/IHBUaW1lWm9uZUluZm8tPmlNaW51dGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogLXBUaW1lWm9uZUluZm8tPmlNaW51dGU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAneicsICcxJykpIHsKLSAgICAgIGlmIChzdHJbY2NdICE9ICdaJykgewotICAgICAgICBGWF9USU1FWk9ORSB0ekRpZmY7Ci0gICAgICAgIGNjICs9IEZYX1BhcnNlVGltZVpvbmUoc3RyICsgY2MsIGxlbiAtIGNjLCB0ekRpZmYpOwotICAgICAgICBGWF9SZXNvbHZlWm9uZShob3VyLCBtaW51dGUsIHR6RGlmZiwgcExvY2FsZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjYysrOwotICAgICAgfQotICAgIH0KLSAgfQotICBpZiAoYkhhc0EpIHsKLSAgICBpZiAoYlBNKSB7Ci0gICAgICBob3VyICs9IDEyOwotICAgICAgaWYgKGhvdXIgPT0gMjQpIHsKLSAgICAgICAgaG91ciA9IDEyOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoaG91ciA9PSAxMikgewotICAgICAgICBob3VyID0gMDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgQ0ZYX1VuaXRpbWUgdXQ7Ci0gIHV0LlNldCgwLCAwLCAwLCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpOwotICBkYXRldGltZSA9IGRhdGV0aW1lICsgdXQ7Ci0gIHJldHVybiAhIWNjOwotfQotCi1ib29sIENGWF9Gb3JtYXRTdHJpbmc6OlBhcnNlRGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjRGF0ZVRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EQVRFVElNRVRZUEUgZURhdGVUaW1lVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfVW5pdGltZSYgZHRWYWx1ZSkgewotICBkdFZhbHVlLlNldCgwKTsKLSAgaWYgKHdzU3JjRGF0ZVRpbWUuSXNFbXB0eSgpIHx8IHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybjsKLSAgSUZYX0xvY2FsZSogcExvY2FsZSA9IG51bGxwdHI7Ci0gIEZYX0RBVEVUSU1FVFlQRSBlQ2F0ZWdvcnkgPQotICAgICAgR2V0RGF0ZVRpbWVGb3JtYXQod3NQYXR0ZXJuLCBwTG9jYWxlLCB3c0RhdGVQYXR0ZXJuLCB3c1RpbWVQYXR0ZXJuKTsKLSAgaWYgKCFwTG9jYWxlKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChlQ2F0ZWdvcnkgPT0gRlhfREFURVRJTUVUWVBFX1Vua25vd24pIHsKLSAgICBlQ2F0ZWdvcnkgPSBlRGF0ZVRpbWVUeXBlOwotICB9Ci0gIGlmIChlQ2F0ZWdvcnkgPT0gRlhfREFURVRJTUVUWVBFX1Vua25vd24pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKGVDYXRlZ29yeSA9PSBGWF9EQVRFVElNRVRZUEVfVGltZURhdGUpIHsKLSAgICBpbnQzMl90IGlTdGFydCA9IDA7Ci0gICAgaWYgKCFGWF9QYXJzZUxvY2FsZVRpbWUod3NTcmNEYXRlVGltZSwgd3NUaW1lUGF0dGVybiwgcExvY2FsZSwgZHRWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpU3RhcnQpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICghRlhfUGFyc2VMb2NhbGVEYXRlKHdzU3JjRGF0ZVRpbWUsIHdzRGF0ZVBhdHRlcm4sIHBMb2NhbGUsIGR0VmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaVN0YXJ0KSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpbnQzMl90IGlTdGFydCA9IDA7Ci0gICAgaWYgKChlQ2F0ZWdvcnkgJiBGWF9EQVRFVElNRVRZUEVfRGF0ZSkgJiYKLSAgICAgICAgIUZYX1BhcnNlTG9jYWxlRGF0ZSh3c1NyY0RhdGVUaW1lLCB3c0RhdGVQYXR0ZXJuLCBwTG9jYWxlLCBkdFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKChlQ2F0ZWdvcnkgJiBGWF9EQVRFVElNRVRZUEVfVGltZSkgJiYKLSAgICAgICAgIUZYX1BhcnNlTG9jYWxlVGltZSh3c1NyY0RhdGVUaW1lLCB3c1RpbWVQYXR0ZXJuLCBwTG9jYWxlLCBkdFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlTdGFydCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci1ib29sIENGWF9Gb3JtYXRTdHJpbmc6OlBhcnNlWmVybyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNUZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgewotICBDRlhfV2lkZVN0cmluZyB3c1RleHRGb3JtYXQ7Ci0gIEdldFRleHRGb3JtYXQod3NQYXR0ZXJuLCBMInplcm8iLCB3c1RleHRGb3JtYXQpOwotICBpbnQzMl90IGlUZXh0ID0gMCwgaVBhdHRlcm4gPSAwOwotICBjb25zdCBGWF9XQ0hBUiogcFN0clRleHQgPSB3c1NyY1RleHQuY19zdHIoKTsKLSAgaW50MzJfdCBpTGVuVGV4dCA9IHdzU3JjVGV4dC5HZXRMZW5ndGgoKTsKLSAgY29uc3QgRlhfV0NIQVIqIHBTdHJQYXR0ZXJuID0gd3NUZXh0Rm9ybWF0LmNfc3RyKCk7Ci0gIGludDMyX3QgaUxlblBhdHRlcm4gPSB3c1RleHRGb3JtYXQuR2V0TGVuZ3RoKCk7Ci0gIHdoaWxlIChpUGF0dGVybiA8IGlMZW5QYXR0ZXJuICYmIGlUZXh0IDwgaUxlblRleHQpIHsKLSAgICBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dID09ICdcJycpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGl0ZXJhbCA9Ci0gICAgICAgICAgRlhfR2V0TGl0ZXJhbFRleHQocFN0clBhdHRlcm4sIGlQYXR0ZXJuLCBpTGVuUGF0dGVybik7Ci0gICAgICBpbnQzMl90IGlMaXRlcmFsTGVuID0gd3NMaXRlcmFsLkdldExlbmd0aCgpOwotICAgICAgaWYgKGlUZXh0ICsgaUxpdGVyYWxMZW4gPiBpTGVuVGV4dCB8fAotICAgICAgICAgIEZYU1lTX3djc25jbXAocFN0clRleHQgKyBpVGV4dCwgd3NMaXRlcmFsLmNfc3RyKCksIGlMaXRlcmFsTGVuKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpVGV4dCArPSBpTGl0ZXJhbExlbjsKLSAgICAgIGlQYXR0ZXJuKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9IGVsc2UgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSAhPSBwU3RyVGV4dFtpVGV4dF0pIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgaVRleHQrKzsKLSAgICAgIGlQYXR0ZXJuKys7Ci0gICAgfQotICB9Ci0gIHJldHVybiBpUGF0dGVybiA9PSBpTGVuUGF0dGVybiAmJiBpVGV4dCA9PSBpTGVuVGV4dDsKLX0KLWJvb2wgQ0ZYX0Zvcm1hdFN0cmluZzo6UGFyc2VOdWxsKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSB7Ci0gIENGWF9XaWRlU3RyaW5nIHdzVGV4dEZvcm1hdDsKLSAgR2V0VGV4dEZvcm1hdCh3c1BhdHRlcm4sIEwibnVsbCIsIHdzVGV4dEZvcm1hdCk7Ci0gIGludDMyX3QgaVRleHQgPSAwLCBpUGF0dGVybiA9IDA7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwU3RyVGV4dCA9IHdzU3JjVGV4dC5jX3N0cigpOwotICBpbnQzMl90IGlMZW5UZXh0ID0gd3NTcmNUZXh0LkdldExlbmd0aCgpOwotICBjb25zdCBGWF9XQ0hBUiogcFN0clBhdHRlcm4gPSB3c1RleHRGb3JtYXQuY19zdHIoKTsKLSAgaW50MzJfdCBpTGVuUGF0dGVybiA9IHdzVGV4dEZvcm1hdC5HZXRMZW5ndGgoKTsKLSAgd2hpbGUgKGlQYXR0ZXJuIDwgaUxlblBhdHRlcm4gJiYgaVRleHQgPCBpTGVuVGV4dCkgewotICAgIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gPT0gJ1wnJykgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NMaXRlcmFsID0KLSAgICAgICAgICBGWF9HZXRMaXRlcmFsVGV4dChwU3RyUGF0dGVybiwgaVBhdHRlcm4sIGlMZW5QYXR0ZXJuKTsKLSAgICAgIGludDMyX3QgaUxpdGVyYWxMZW4gPSB3c0xpdGVyYWwuR2V0TGVuZ3RoKCk7Ci0gICAgICBpZiAoaVRleHQgKyBpTGl0ZXJhbExlbiA+IGlMZW5UZXh0IHx8Ci0gICAgICAgICAgRlhTWVNfd2NzbmNtcChwU3RyVGV4dCArIGlUZXh0LCB3c0xpdGVyYWwuY19zdHIoKSwgaUxpdGVyYWxMZW4pKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlUZXh0ICs9IGlMaXRlcmFsTGVuOwotICAgICAgaVBhdHRlcm4rKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0gZWxzZSBpZiAocFN0clBhdHRlcm5baVBhdHRlcm5dICE9IHBTdHJUZXh0W2lUZXh0XSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBpVGV4dCsrOwotICAgICAgaVBhdHRlcm4rKzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGlQYXR0ZXJuID09IGlMZW5QYXR0ZXJuICYmIGlUZXh0ID09IGlMZW5UZXh0OwotfQotYm9vbCBDRlhfRm9ybWF0U3RyaW5nOjpGb3JtYXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpIHsKLSAgaWYgKHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaW50MzJfdCBpTGVuVGV4dCA9IHdzU3JjVGV4dC5HZXRMZW5ndGgoKTsKLSAgaWYgKGlMZW5UZXh0ID09IDApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Rm9ybWF0OwotICBHZXRUZXh0Rm9ybWF0KHdzUGF0dGVybiwgTCJ0ZXh0Iiwgd3NUZXh0Rm9ybWF0KTsKLSAgaW50MzJfdCBpVGV4dCA9IDAsIGlQYXR0ZXJuID0gMDsKLSAgY29uc3QgRlhfV0NIQVIqIHBTdHJUZXh0ID0gd3NTcmNUZXh0LmNfc3RyKCk7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwU3RyUGF0dGVybiA9IHdzVGV4dEZvcm1hdC5jX3N0cigpOwotICBpbnQzMl90IGlMZW5QYXR0ZXJuID0gd3NUZXh0Rm9ybWF0LkdldExlbmd0aCgpOwotICB3aGlsZSAoaVBhdHRlcm4gPCBpTGVuUGF0dGVybikgewotICAgIHN3aXRjaCAocFN0clBhdHRlcm5baVBhdHRlcm5dKSB7Ci0gICAgICBjYXNlICdcJyc6IHsKLSAgICAgICAgd3NPdXRwdXQgKz0gRlhfR2V0TGl0ZXJhbFRleHQocFN0clBhdHRlcm4sIGlQYXR0ZXJuLCBpTGVuUGF0dGVybik7Ci0gICAgICAgIGlQYXR0ZXJuKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSAnQSc6Ci0gICAgICAgIGlmIChpVGV4dCA+PSBpTGVuVGV4dCB8fCAhRlhTWVNfaXN3YWxwaGEocFN0clRleHRbaVRleHRdKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICB3c091dHB1dCArPSBwU3RyVGV4dFtpVGV4dCsrXTsKLSAgICAgICAgaVBhdHRlcm4rKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdYJzoKLSAgICAgICAgaWYgKGlUZXh0ID49IGlMZW5UZXh0KSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHdzT3V0cHV0ICs9IHBTdHJUZXh0W2lUZXh0KytdOwotICAgICAgICBpUGF0dGVybisrOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ08nOgotICAgICAgY2FzZSAnMCc6Ci0gICAgICAgIGlmIChpVGV4dCA+PSBpTGVuVGV4dCB8fCAoIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHBTdHJUZXh0W2lUZXh0XSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhRlhTWVNfaXN3YWxwaGEocFN0clRleHRbaVRleHRdKSkpIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgd3NPdXRwdXQgKz0gcFN0clRleHRbaVRleHQrK107Ci0gICAgICAgIGlQYXR0ZXJuKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnOSc6Ci0gICAgICAgIGlmIChpVGV4dCA+PSBpTGVuVGV4dCB8fCAhRlhTWVNfaXNEZWNpbWFsRGlnaXQocFN0clRleHRbaVRleHRdKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICB3c091dHB1dCArPSBwU3RyVGV4dFtpVGV4dCsrXTsKLSAgICAgICAgaVBhdHRlcm4rKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB3c091dHB1dCArPSBwU3RyUGF0dGVybltpUGF0dGVybisrXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBpVGV4dCA9PSBpTGVuVGV4dDsKLX0KLXN0YXRpYyBpbnQzMl90IEZYX0dldE51bVRyYWlsaW5nTGltaXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaURvdFBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYlRyaW1UYWlsWmVyb3MpIHsKLSAgaWYgKGlEb3RQb3MgPCAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaW50MzJfdCBpQ291bnQgPSB3c0Zvcm1hdC5HZXRMZW5ndGgoKTsKLSAgaW50MzJfdCBpVHJlYWRpbmcgPSAwOwotICBmb3IgKGlEb3RQb3MrKzsgaURvdFBvcyA8IGlDb3VudDsgaURvdFBvcysrKSB7Ci0gICAgRlhfV0NIQVIgd2MgPSB3c0Zvcm1hdFtpRG90UG9zXTsKLSAgICBpZiAod2MgPT0gTCd6JyB8fCB3YyA9PSBMJzknIHx8IHdjID09ICdaJykgewotICAgICAgaVRyZWFkaW5nKys7Ci0gICAgICBiVHJpbVRhaWxaZXJvcyA9ICh3YyA9PSBMJzknID8gZmFsc2UgOiB0cnVlKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGlUcmVhZGluZzsKLX0KLWJvb2wgQ0ZYX0Zvcm1hdFN0cmluZzo6Rm9ybWF0U3RyTnVtKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NJbnB1dE51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpIHsKLSAgaWYgKHdzSW5wdXROdW0uSXNFbXB0eSgpIHx8IHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaW50MzJfdCBkb3RfaW5kZXhfZiA9IC0xOwotICB1aW50MzJfdCBkd051bVN0eWxlID0gMDsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NOdW1Gb3JtYXQ7Ci0gIElGWF9Mb2NhbGUqIHBMb2NhbGUgPQotICAgICAgR2V0TnVtZXJpY0Zvcm1hdCh3c1BhdHRlcm4sIGRvdF9pbmRleF9mLCBkd051bVN0eWxlLCB3c051bUZvcm1hdCk7Ci0gIGlmICghcExvY2FsZSB8fCB3c051bUZvcm1hdC5Jc0VtcHR5KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaW50MzJfdCBjYyA9IDAsIGNjZiA9IDA7Ci0gIGNvbnN0IEZYX1dDSEFSKiBzdHJmID0gd3NOdW1Gb3JtYXQuY19zdHIoKTsKLSAgaW50IGxlbmYgPSB3c051bUZvcm1hdC5HZXRMZW5ndGgoKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NTcmNOdW0od3NJbnB1dE51bSk7Ci0gIHdzU3JjTnVtLlRyaW1MZWZ0KCcwJyk7Ci0gIGlmICh3c1NyY051bS5Jc0VtcHR5KCkgfHwgd3NTcmNOdW1bMF0gPT0gJy4nKSB7Ci0gICAgd3NTcmNOdW0uSW5zZXJ0KDAsICcwJyk7Ci0gIH0KLSAgQ0ZYX0RlY2ltYWwgZGVjaW1hbCA9IENGWF9EZWNpbWFsKHdzU3JjTnVtLkFzU3RyaW5nQygpKTsKLSAgaWYgKGR3TnVtU3R5bGUgJiBGWF9OVU1TVFlMRV9QZXJjZW50KSB7Ci0gICAgZGVjaW1hbCA9IGRlY2ltYWwgKiBDRlhfRGVjaW1hbCgxMDApOwotICAgIHdzU3JjTnVtID0gZGVjaW1hbDsKLSAgfQotICBpbnQzMl90IGV4cG9uZW50ID0gMDsKLSAgaWYgKGR3TnVtU3R5bGUgJiBGWF9OVU1TVFlMRV9FeHBvbmVudCkgewotICAgIGludCBmaXhlZF9jb3VudCA9IDA7Ci0gICAgd2hpbGUgKGNjZiA8IGRvdF9pbmRleF9mKSB7Ci0gICAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgewotICAgICAgICBjYXNlICdcJyc6Ci0gICAgICAgICAgRlhfR2V0TGl0ZXJhbFRleHQoc3RyZiwgY2NmLCBkb3RfaW5kZXhfZik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzknOgotICAgICAgICBjYXNlICd6JzoKLSAgICAgICAgY2FzZSAnWic6Ci0gICAgICAgICAgZml4ZWRfY291bnQrKzsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNjZisrOwotICAgIH0KLSAgICBpbnQgdGhyZXNob2xkID0gMTsKLSAgICB3aGlsZSAoZml4ZWRfY291bnQgPiAxKSB7Ci0gICAgICB0aHJlc2hvbGQgKj0gMTA7Ci0gICAgICBmaXhlZF9jb3VudC0tOwotICAgIH0KLSAgICBpZiAoZGVjaW1hbCAhPSBDRlhfRGVjaW1hbCgwKSkgewotICAgICAgaWYgKGRlY2ltYWwgPCBDRlhfRGVjaW1hbCh0aHJlc2hvbGQpKSB7Ci0gICAgICAgIGRlY2ltYWwgPSBkZWNpbWFsICogQ0ZYX0RlY2ltYWwoMTApOwotICAgICAgICBleHBvbmVudCA9IC0xOwotICAgICAgICB3aGlsZSAoZGVjaW1hbCA8IENGWF9EZWNpbWFsKHRocmVzaG9sZCkpIHsKLSAgICAgICAgICBkZWNpbWFsID0gZGVjaW1hbCAqIENGWF9EZWNpbWFsKDEwKTsKLSAgICAgICAgICBleHBvbmVudCAtPSAxOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGRlY2ltYWwgPiBDRlhfRGVjaW1hbCh0aHJlc2hvbGQpKSB7Ci0gICAgICAgIHRocmVzaG9sZCAqPSAxMDsKLSAgICAgICAgd2hpbGUgKGRlY2ltYWwgPiBDRlhfRGVjaW1hbCh0aHJlc2hvbGQpKSB7Ci0gICAgICAgICAgZGVjaW1hbCA9IGRlY2ltYWwgLyBDRlhfRGVjaW1hbCgxMCk7Ci0gICAgICAgICAgZXhwb25lbnQgKz0gMTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICBib29sIGJUcmltVGFpbFplcm9zID0gZmFsc2U7Ci0gIGludDMyX3QgaVRyZWFkaW5nID0KLSAgICAgIEZYX0dldE51bVRyYWlsaW5nTGltaXQod3NOdW1Gb3JtYXQsIGRvdF9pbmRleF9mLCBiVHJpbVRhaWxaZXJvcyk7Ci0gIGludDMyX3Qgc2NhbGUgPSBkZWNpbWFsLkdldFNjYWxlKCk7Ci0gIGlmIChpVHJlYWRpbmcgPCBzY2FsZSkgewotICAgIGRlY2ltYWwuU2V0U2NhbGUoaVRyZWFkaW5nKTsKLSAgICB3c1NyY051bSA9IGRlY2ltYWw7Ci0gIH0KLSAgaWYgKGJUcmltVGFpbFplcm9zICYmIHNjYWxlID4gMCAmJiBpVHJlYWRpbmcgPiAwKSB7Ci0gICAgd3NTcmNOdW0uVHJpbVJpZ2h0KEwiMCIpOwotICAgIHdzU3JjTnVtLlRyaW1SaWdodChMIi4iKTsKLSAgfQotICBDRlhfV2lkZVN0cmluZyB3c0dyb3VwU3ltYm9sOwotICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfR3JvdXBpbmcsIHdzR3JvdXBTeW1ib2wpOwotICBib29sIGJOZWcgPSBmYWxzZTsKLSAgaWYgKHdzU3JjTnVtWzBdID09ICctJykgewotICAgIGJOZWcgPSB0cnVlOwotICAgIHdzU3JjTnVtLkRlbGV0ZSgwLCAxKTsKLSAgfQotICBib29sIGJBZGROZWcgPSBmYWxzZTsKLSAgY29uc3QgRlhfV0NIQVIqIHN0ciA9IHdzU3JjTnVtLmNfc3RyKCk7Ci0gIGludCBsZW4gPSB3c1NyY051bS5HZXRMZW5ndGgoKTsKLSAgaW50IGRvdF9pbmRleCA9IHdzU3JjTnVtLkZpbmQoJy4nKTsKLSAgaWYgKGRvdF9pbmRleCA9PSAtMSkgewotICAgIGRvdF9pbmRleCA9IGxlbjsKLSAgfQotICBjY2YgPSBkb3RfaW5kZXhfZiAtIDE7Ci0gIGNjID0gZG90X2luZGV4IC0gMTsKLSAgd2hpbGUgKGNjZiA+PSAwKSB7Ci0gICAgc3dpdGNoIChzdHJmW2NjZl0pIHsKLSAgICAgIGNhc2UgJzknOgotICAgICAgICBpZiAoY2MgPj0gMCkgewotICAgICAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgd3NPdXRwdXQgPSBzdHJbY2NdICsgd3NPdXRwdXQ7Ci0gICAgICAgICAgY2MtLTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB3c091dHB1dCA9IEwnMCcgKyB3c091dHB1dDsKLSAgICAgICAgfQotICAgICAgICBjY2YtLTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICd6JzoKLSAgICAgICAgaWYgKGNjID49IDApIHsKLSAgICAgICAgICBpZiAoIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChzdHJbMF0gIT0gJzAnKSB7Ci0gICAgICAgICAgICB3c091dHB1dCA9IHN0cltjY10gKyB3c091dHB1dDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2MtLTsKLSAgICAgICAgfQotICAgICAgICBjY2YtLTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdaJzoKLSAgICAgICAgaWYgKGNjID49IDApIHsKLSAgICAgICAgICBpZiAoIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChzdHJbMF0gPT0gJzAnKSB7Ci0gICAgICAgICAgICB3c091dHB1dCA9IEwnICcgKyB3c091dHB1dDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3NPdXRwdXQgPSBzdHJbY2NdICsgd3NPdXRwdXQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjLS07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgd3NPdXRwdXQgPSBMJyAnICsgd3NPdXRwdXQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2NmLS07Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnUyc6Ci0gICAgICAgIGlmIChiTmVnKSB7Ci0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c1N5bWJvbDsKLSAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXNTeW1ib2wpOwotICAgICAgICAgIHdzT3V0cHV0ID0gd3NNaW51c1N5bWJvbCArIHdzT3V0cHV0OwotICAgICAgICAgIGJBZGROZWcgPSB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHdzT3V0cHV0ID0gTCcgJyArIHdzT3V0cHV0OwotICAgICAgICB9Ci0gICAgICAgIGNjZi0tOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ3MnOgotICAgICAgICBpZiAoYk5lZykgewotICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXNTeW1ib2w7Ci0gICAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLCB3c01pbnVzU3ltYm9sKTsKLSAgICAgICAgICB3c091dHB1dCA9IHdzTWludXNTeW1ib2wgKyB3c091dHB1dDsKLSAgICAgICAgICBiQWRkTmVnID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBjY2YtLTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdFJzogewotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0V4cDsKLSAgICAgICAgd3NFeHAuRm9ybWF0KEwiRSUrZCIsIGV4cG9uZW50KTsKLSAgICAgICAgd3NPdXRwdXQgPSB3c0V4cCArIHdzT3V0cHV0OwotICAgICAgfQotICAgICAgICBjY2YtLTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICckJzogewotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsKLSAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sLCB3c1N5bWJvbCk7Ci0gICAgICAgIHdzT3V0cHV0ID0gd3NTeW1ib2wgKyB3c091dHB1dDsKLSAgICAgIH0KLSAgICAgICAgY2NmLS07Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAncic6Ci0gICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnYycpIHsKLSAgICAgICAgICBpZiAoYk5lZykgewotICAgICAgICAgICAgd3NPdXRwdXQgPSBMIkNSIiArIHdzT3V0cHV0OwotICAgICAgICAgIH0KLSAgICAgICAgICBjY2YgLT0gMjsKLSAgICAgICAgICBiQWRkTmVnID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ1InOgotICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ0MnKSB7Ci0gICAgICAgICAgaWYgKGJOZWcpIHsKLSAgICAgICAgICAgIHdzT3V0cHV0ID0gTCJDUiIgKyB3c091dHB1dDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3NPdXRwdXQgPSBMIiAgIiArIHdzT3V0cHV0OwotICAgICAgICAgIH0KLSAgICAgICAgICBjY2YgLT0gMjsKLSAgICAgICAgICBiQWRkTmVnID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ2InOgotICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ2QnKSB7Ci0gICAgICAgICAgaWYgKGJOZWcpIHsKLSAgICAgICAgICAgIHdzT3V0cHV0ID0gTCJkYiIgKyB3c091dHB1dDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2NmIC09IDI7Ci0gICAgICAgICAgYkFkZE5lZyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdCJzoKLSAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdEJykgewotICAgICAgICAgIGlmIChiTmVnKSB7Ci0gICAgICAgICAgICB3c091dHB1dCA9IEwiREIiICsgd3NPdXRwdXQ7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdzT3V0cHV0ID0gTCIgICIgKyB3c091dHB1dDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2NmIC09IDI7Ci0gICAgICAgICAgYkFkZE5lZyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICclJzogewotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsKLSAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX1BlcmNlbnQsIHdzU3ltYm9sKTsKLSAgICAgICAgd3NPdXRwdXQgPSB3c1N5bWJvbCArIHdzT3V0cHV0OwotICAgICAgfQotICAgICAgICBjY2YtLTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICcsJzoKLSAgICAgICAgaWYgKGNjID49IDApIHsKLSAgICAgICAgICB3c091dHB1dCA9IHdzR3JvdXBTeW1ib2wgKyB3c091dHB1dDsKLSAgICAgICAgfQotICAgICAgICBjY2YtLTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICcoJzoKLSAgICAgICAgaWYgKGJOZWcpIHsKLSAgICAgICAgICB3c091dHB1dCA9IEwiKCIgKyB3c091dHB1dDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB3c091dHB1dCA9IEwiICIgKyB3c091dHB1dDsKLSAgICAgICAgfQotICAgICAgICBiQWRkTmVnID0gdHJ1ZTsKLSAgICAgICAgY2NmLS07Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnKSc6Ci0gICAgICAgIGlmIChiTmVnKSB7Ci0gICAgICAgICAgd3NPdXRwdXQgPSBMIikiICsgd3NPdXRwdXQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgd3NPdXRwdXQgPSBMIiAiICsgd3NPdXRwdXQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2NmLS07Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnXCcnOgotICAgICAgICB3c091dHB1dCA9IEZYX0dldExpdGVyYWxUZXh0UmV2ZXJzZShzdHJmLCBjY2YpICsgd3NPdXRwdXQ7Ci0gICAgICAgIGNjZi0tOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHdzT3V0cHV0ID0gc3RyZltjY2ZdICsgd3NPdXRwdXQ7Ci0gICAgICAgIGNjZi0tOwotICAgIH0KLSAgfQotICBpZiAoY2MgPj0gMCkgewotICAgIGludCBuUG9zID0gZG90X2luZGV4ICUgMzsKLSAgICB3c091dHB1dC5jbGVhcigpOwotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGRvdF9pbmRleDsgaSsrKSB7Ci0gICAgICBpZiAoaSAlIDMgPT0gblBvcyAmJiBpICE9IDApIHsKLSAgICAgICAgd3NPdXRwdXQgKz0gd3NHcm91cFN5bWJvbDsKLSAgICAgIH0KLSAgICAgIHdzT3V0cHV0ICs9IHdzU3JjTnVtW2ldOwotICAgIH0KLSAgICBpZiAoZG90X2luZGV4IDwgbGVuKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsKLSAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsLCB3c1N5bWJvbCk7Ci0gICAgICB3c091dHB1dCArPSB3c1N5bWJvbDsKLSAgICAgIHdzT3V0cHV0ICs9IHdzU3JjTnVtLlJpZ2h0KGxlbiAtIGRvdF9pbmRleCAtIDEpOwotICAgIH0KLSAgICBpZiAoYk5lZykgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c3ltYm9sOwotICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLCB3c01pbnVzeW1ib2wpOwotICAgICAgd3NPdXRwdXQgPSB3c01pbnVzeW1ib2wgKyB3c091dHB1dDsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChkb3RfaW5kZXhfZiA9PSB3c051bUZvcm1hdC5HZXRMZW5ndGgoKSkgewotICAgIGlmICghYkFkZE5lZyAmJiBiTmVnKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c01pbnVzeW1ib2w7Ci0gICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXN5bWJvbCk7Ci0gICAgICB3c091dHB1dCA9IHdzTWludXN5bWJvbCArIHdzT3V0cHV0OwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBDRlhfV2lkZVN0cmluZyB3c0RvdFN5bWJvbDsKLSAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0RlY2ltYWwsIHdzRG90U3ltYm9sKTsKLSAgaWYgKHN0cmZbZG90X2luZGV4X2ZdID09ICdWJykgewotICAgIHdzT3V0cHV0ICs9IHdzRG90U3ltYm9sOwotICB9IGVsc2UgaWYgKHN0cmZbZG90X2luZGV4X2ZdID09ICcuJykgewotICAgIGlmIChkb3RfaW5kZXggPCBsZW4pIHsKLSAgICAgIHdzT3V0cHV0ICs9IHdzRG90U3ltYm9sOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoc3RyZltkb3RfaW5kZXhfZiArIDFdID09ICc5JyB8fCBzdHJmW2RvdF9pbmRleF9mICsgMV0gPT0gJ1onKSB7Ci0gICAgICAgIHdzT3V0cHV0ICs9IHdzRG90U3ltYm9sOwotICAgICAgfQotICAgIH0KLSAgfQotICBjY2YgPSBkb3RfaW5kZXhfZiArIDE7Ci0gIGNjID0gZG90X2luZGV4ICsgMTsKLSAgd2hpbGUgKGNjZiA8IGxlbmYpIHsKLSAgICBzd2l0Y2ggKHN0cmZbY2NmXSkgewotICAgICAgY2FzZSAnXCcnOgotICAgICAgICB3c091dHB1dCArPSBGWF9HZXRMaXRlcmFsVGV4dChzdHJmLCBjY2YsIGxlbmYpOwotICAgICAgICBjY2YrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICc5JzoKLSAgICAgICAgaWYgKGNjIDwgbGVuKSB7Ci0gICAgICAgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICB3c091dHB1dCArPSBzdHJbY2NdOwotICAgICAgICAgIGNjKys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgd3NPdXRwdXQgKz0gTCcwJzsKLSAgICAgICAgfQotICAgICAgICBjY2YrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICd6JzoKLSAgICAgICAgaWYgKGNjIDwgbGVuKSB7Ci0gICAgICAgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICB3c091dHB1dCArPSBzdHJbY2NdOwotICAgICAgICAgIGNjKys7Ci0gICAgICAgIH0KLSAgICAgICAgY2NmKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnWic6Ci0gICAgICAgIGlmIChjYyA8IGxlbikgewotICAgICAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgd3NPdXRwdXQgKz0gc3RyW2NjXTsKLSAgICAgICAgICBjYysrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHdzT3V0cHV0ICs9IEwnMCc7Ci0gICAgICAgIH0KLSAgICAgICAgY2NmKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnRSc6IHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHA7Ci0gICAgICAgIHdzRXhwLkZvcm1hdChMIkUlK2QiLCBleHBvbmVudCk7Ci0gICAgICAgIHdzT3V0cHV0ICs9IHdzRXhwOwotICAgICAgfQotICAgICAgICBjY2YrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICckJzogewotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsKLSAgICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sLCB3c1N5bWJvbCk7Ci0gICAgICAgIHdzT3V0cHV0ICs9IHdzU3ltYm9sOwotICAgICAgfQotICAgICAgICBjY2YrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdjJzoKLSAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ3InKSB7Ci0gICAgICAgICAgaWYgKGJOZWcpIHsKLSAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiQ1IiOwotICAgICAgICAgIH0KLSAgICAgICAgICBjY2YgKz0gMjsKLSAgICAgICAgICBiQWRkTmVnID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ0MnOgotICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAnUicpIHsKLSAgICAgICAgICBpZiAoYk5lZykgewotICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCJDUiI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiICAiOwotICAgICAgICAgIH0KLSAgICAgICAgICBjY2YgKz0gMjsKLSAgICAgICAgICBiQWRkTmVnID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ2QnOgotICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAnYicpIHsKLSAgICAgICAgICBpZiAoYk5lZykgewotICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCJkYiI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjZiArPSAyOwotICAgICAgICAgIGJBZGROZWcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnRCc6Ci0gICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdCJykgewotICAgICAgICAgIGlmIChiTmVnKSB7Ci0gICAgICAgICAgICB3c091dHB1dCArPSBMIkRCIjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCIgICI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjZiArPSAyOwotICAgICAgICAgIGJBZGROZWcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnJSc6IHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7Ci0gICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50LCB3c1N5bWJvbCk7Ci0gICAgICAgIHdzT3V0cHV0ICs9IHdzU3ltYm9sOwotICAgICAgfQotICAgICAgICBjY2YrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICc4JzogewotICAgICAgICB3aGlsZSAoY2NmIDwgbGVuZiAmJiBzdHJmW2NjZl0gPT0gJzgnKSB7Ci0gICAgICAgICAgY2NmKys7Ci0gICAgICAgIH0KLSAgICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIEZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKSB7Ci0gICAgICAgICAgd3NPdXRwdXQgKz0gc3RyW2NjXTsKLSAgICAgICAgICBjYysrOwotICAgICAgICB9Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSAnLCc6Ci0gICAgICAgIHdzT3V0cHV0ICs9IHdzR3JvdXBTeW1ib2w7Ci0gICAgICAgIGNjZisrOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJygnOgotICAgICAgICBpZiAoYk5lZykgewotICAgICAgICAgIHdzT3V0cHV0ICs9ICcoJzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB3c091dHB1dCArPSAnICc7Ci0gICAgICAgIH0KLSAgICAgICAgYkFkZE5lZyA9IHRydWU7Ci0gICAgICAgIGNjZisrOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJyknOgotICAgICAgICBpZiAoYk5lZykgewotICAgICAgICAgIHdzT3V0cHV0ICs9ICcpJzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB3c091dHB1dCArPSAnICc7Ci0gICAgICAgIH0KLSAgICAgICAgY2NmKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgY2NmKys7Ci0gICAgfQotICB9Ci0gIGlmICghYkFkZE5lZyAmJiBiTmVnKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c3ltYm9sOwotICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51c3ltYm9sKTsKLSAgICB3c091dHB1dCA9Ci0gICAgICAgIHdzTWludXN5bWJvbCArIHdzT3V0cHV0WzBdICsgd3NPdXRwdXQuTWlkKDEsIHdzT3V0cHV0LkdldExlbmd0aCgpIC0gMSk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci1ib29sIENGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdExDTnVtZXJpYyhDRlhfTENOdW1lcmljJiBsY051bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpIHsKLSAgaW50MzJfdCBkb3RfaW5kZXhfZiA9IC0xOwotICB1aW50MzJfdCBkd051bVN0eWxlID0gMDsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NOdW1Gb3JtYXQ7Ci0gIElGWF9Mb2NhbGUqIHBMb2NhbGUgPQotICAgICAgR2V0TnVtZXJpY0Zvcm1hdCh3c1BhdHRlcm4sIGRvdF9pbmRleF9mLCBkd051bVN0eWxlLCB3c051bUZvcm1hdCk7Ci0gIGlmICghcExvY2FsZSB8fCB3c051bUZvcm1hdC5Jc0VtcHR5KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaW50MzJfdCBjYyA9IDAsIGNjZiA9IDA7Ci0gIGNvbnN0IEZYX1dDSEFSKiBzdHJmID0gd3NOdW1Gb3JtYXQuY19zdHIoKTsKLSAgaW50IGxlbmYgPSB3c051bUZvcm1hdC5HZXRMZW5ndGgoKTsKLSAgZG91YmxlIGRiT3JnUmF3ID0gbGNOdW0uR2V0RG91YmxlKCk7Ci0gIGRvdWJsZSBkYlJldFZhbHVlID0gZGJPcmdSYXc7Ci0gIGlmIChkd051bVN0eWxlICYgRlhfTlVNU1RZTEVfUGVyY2VudCkgewotICAgIGRiUmV0VmFsdWUgKj0gMTAwOwotICB9Ci0gIGludDMyX3QgZXhwb25lbnQgPSAwOwotICBpZiAoZHdOdW1TdHlsZSAmIEZYX05VTVNUWUxFX0V4cG9uZW50KSB7Ci0gICAgaW50IGZpeGVkX2NvdW50ID0gMDsKLSAgICB3aGlsZSAoY2NmIDwgZG90X2luZGV4X2YpIHsKLSAgICAgIHN3aXRjaCAoc3RyZltjY2ZdKSB7Ci0gICAgICAgIGNhc2UgJ1wnJzoKLSAgICAgICAgICBGWF9HZXRMaXRlcmFsVGV4dChzdHJmLCBjY2YsIGRvdF9pbmRleF9mKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnOSc6Ci0gICAgICAgIGNhc2UgJ3onOgotICAgICAgICBjYXNlICdaJzoKLSAgICAgICAgICBmaXhlZF9jb3VudCsrOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2NmKys7Ci0gICAgfQotICAgIGludCB0aHJlc2hvbGQgPSAxOwotICAgIHdoaWxlIChmaXhlZF9jb3VudCA+IDEpIHsKLSAgICAgIHRocmVzaG9sZCAqPSAxMDsKLSAgICAgIGZpeGVkX2NvdW50LS07Ci0gICAgfQotICAgIGlmIChkYlJldFZhbHVlICE9IDApIHsKLSAgICAgIGlmIChkYlJldFZhbHVlIDwgdGhyZXNob2xkKSB7Ci0gICAgICAgIGRiUmV0VmFsdWUgKj0gMTA7Ci0gICAgICAgIGV4cG9uZW50ID0gLTE7Ci0gICAgICAgIHdoaWxlIChkYlJldFZhbHVlIDwgdGhyZXNob2xkKSB7Ci0gICAgICAgICAgZGJSZXRWYWx1ZSAqPSAxMDsKLSAgICAgICAgICBleHBvbmVudCAtPSAxOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGRiUmV0VmFsdWUgPiB0aHJlc2hvbGQpIHsKLSAgICAgICAgdGhyZXNob2xkICo9IDEwOwotICAgICAgICB3aGlsZSAoZGJSZXRWYWx1ZSA+IHRocmVzaG9sZCkgewotICAgICAgICAgIGRiUmV0VmFsdWUgLz0gMTA7Ci0gICAgICAgICAgZXhwb25lbnQgKz0gMTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICBpZiAoZHdOdW1TdHlsZSAmIChGWF9OVU1TVFlMRV9QZXJjZW50IHwgRlhfTlVNU1RZTEVfRXhwb25lbnQpKSB7Ci0gICAgbGNOdW0gPSBDRlhfTENOdW1lcmljKGRiUmV0VmFsdWUpOwotICB9Ci0gIGJvb2wgYlRyaW1UYWlsWmVyb3MgPSBmYWxzZTsKLSAgaW50MzJfdCBpVHJlYWRpbmcgPQotICAgICAgRlhfR2V0TnVtVHJhaWxpbmdMaW1pdCh3c051bUZvcm1hdCwgZG90X2luZGV4X2YsIGJUcmltVGFpbFplcm9zKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NOdW1lcmljID0gbGNOdW0uVG9TdHJpbmcoaVRyZWFkaW5nLCBiVHJpbVRhaWxaZXJvcyk7Ci0gIGlmICh3c051bWVyaWMuSXNFbXB0eSgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIENGWF9XaWRlU3RyaW5nIHdzR3JvdXBTeW1ib2w7Ci0gIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9Hcm91cGluZywgd3NHcm91cFN5bWJvbCk7Ci0gIGJvb2wgYk5lZyA9IGZhbHNlOwotICBpZiAod3NOdW1lcmljWzBdID09ICctJykgewotICAgIGJOZWcgPSB0cnVlOwotICAgIHdzTnVtZXJpYy5EZWxldGUoMCwgMSk7Ci0gIH0KLSAgYm9vbCBiQWRkTmVnID0gZmFsc2U7Ci0gIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSB3c051bWVyaWMuY19zdHIoKTsKLSAgaW50IGxlbiA9IHdzTnVtZXJpYy5HZXRMZW5ndGgoKTsKLSAgaW50IGRvdF9pbmRleCA9IHdzTnVtZXJpYy5GaW5kKCcuJyk7Ci0gIGlmIChkb3RfaW5kZXggPT0gLTEpIHsKLSAgICBkb3RfaW5kZXggPSBsZW47Ci0gIH0KLSAgY2NmID0gZG90X2luZGV4X2YgLSAxOwotICBjYyA9IGRvdF9pbmRleCAtIDE7Ci0gIHdoaWxlIChjY2YgPj0gMCkgewotICAgIHN3aXRjaCAoc3RyZltjY2ZdKSB7Ci0gICAgICBjYXNlICc5JzoKLSAgICAgICAgaWYgKGNjID49IDApIHsKLSAgICAgICAgICB3c091dHB1dCA9IHN0cltjY10gKyB3c091dHB1dDsKLSAgICAgICAgICBjYy0tOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHdzT3V0cHV0ID0gTCcwJyArIHdzT3V0cHV0OwotICAgICAgICB9Ci0gICAgICAgIGNjZi0tOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ3onOgotICAgICAgICBpZiAoY2MgPj0gMCkgewotICAgICAgICAgIGlmIChsY051bS5tX0ludGVncmFsICE9IDApIHsKLSAgICAgICAgICAgIHdzT3V0cHV0ID0gc3RyW2NjXSArIHdzT3V0cHV0OwotICAgICAgICAgIH0KLSAgICAgICAgICBjYy0tOwotICAgICAgICB9Ci0gICAgICAgIGNjZi0tOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ1onOgotICAgICAgICBpZiAoY2MgPj0gMCkgewotICAgICAgICAgIGlmIChsY051bS5tX0ludGVncmFsID09IDApIHsKLSAgICAgICAgICAgIHdzT3V0cHV0ID0gTCcgJyArIHdzT3V0cHV0OwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3c091dHB1dCA9IHN0cltjY10gKyB3c091dHB1dDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2MtLTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB3c091dHB1dCA9IEwnICcgKyB3c091dHB1dDsKLSAgICAgICAgfQotICAgICAgICBjY2YtLTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdTJzoKLSAgICAgICAgaWYgKGJOZWcpIHsKLSAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c01pbnVzU3ltYm9sOwotICAgICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51c1N5bWJvbCk7Ci0gICAgICAgICAgd3NPdXRwdXQgPSB3c01pbnVzU3ltYm9sICsgd3NPdXRwdXQ7Ci0gICAgICAgICAgYkFkZE5lZyA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgd3NPdXRwdXQgPSBMJyAnICsgd3NPdXRwdXQ7Ci0gICAgICAgIH0KLSAgICAgICAgY2NmLS07Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAncyc6Ci0gICAgICAgIGlmIChiTmVnKSB7Ci0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c1N5bWJvbDsKLSAgICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXNTeW1ib2wpOwotICAgICAgICAgIHdzT3V0cHV0ID0gd3NNaW51c1N5bWJvbCArIHdzT3V0cHV0OwotICAgICAgICAgIGJBZGROZWcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGNjZi0tOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ0UnOiB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRXhwOwotICAgICAgICB3c0V4cC5Gb3JtYXQoTCJFJStkIiwgZXhwb25lbnQpOwotICAgICAgICB3c091dHB1dCA9IHdzRXhwICsgd3NPdXRwdXQ7Ci0gICAgICB9Ci0gICAgICAgIGNjZi0tOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJyQnOiB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOwotICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfQ3VycmVuY3lTeW1ib2wsIHdzU3ltYm9sKTsKLSAgICAgICAgd3NPdXRwdXQgPSB3c1N5bWJvbCArIHdzT3V0cHV0OwotICAgICAgfQotICAgICAgICBjY2YtLTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdyJzoKLSAgICAgICAgaWYgKGNjZiAtIDEgPj0gMCAmJiBzdHJmW2NjZiAtIDFdID09ICdjJykgewotICAgICAgICAgIGlmIChiTmVnKSB7Ci0gICAgICAgICAgICB3c091dHB1dCA9IEwiQ1IiICsgd3NPdXRwdXQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjZiAtPSAyOwotICAgICAgICAgIGJBZGROZWcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnUic6Ci0gICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnQycpIHsKLSAgICAgICAgICBpZiAoYk5lZykgewotICAgICAgICAgICAgd3NPdXRwdXQgPSBMIkNSIiArIHdzT3V0cHV0OwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3c091dHB1dCA9IEwiICAiICsgd3NPdXRwdXQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNjZiAtPSAyOwotICAgICAgICAgIGJBZGROZWcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnYic6Ci0gICAgICAgIGlmIChjY2YgLSAxID49IDAgJiYgc3RyZltjY2YgLSAxXSA9PSAnZCcpIHsKLSAgICAgICAgICBpZiAoYk5lZykgewotICAgICAgICAgICAgd3NPdXRwdXQgPSBMImRiIiArIHdzT3V0cHV0OwotICAgICAgICAgIH0KLSAgICAgICAgICBjY2YgLT0gMjsKLSAgICAgICAgICBiQWRkTmVnID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ0InOgotICAgICAgICBpZiAoY2NmIC0gMSA+PSAwICYmIHN0cmZbY2NmIC0gMV0gPT0gJ0QnKSB7Ci0gICAgICAgICAgaWYgKGJOZWcpIHsKLSAgICAgICAgICAgIHdzT3V0cHV0ID0gTCJEQiIgKyB3c091dHB1dDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3NPdXRwdXQgPSBMIiAgIiArIHdzT3V0cHV0OwotICAgICAgICAgIH0KLSAgICAgICAgICBjY2YgLT0gMjsKLSAgICAgICAgICBiQWRkTmVnID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJyUnOiB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOwotICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfUGVyY2VudCwgd3NTeW1ib2wpOwotICAgICAgICB3c091dHB1dCA9IHdzU3ltYm9sICsgd3NPdXRwdXQ7Ci0gICAgICB9Ci0gICAgICAgIGNjZi0tOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJywnOgotICAgICAgICBpZiAoY2MgPj0gMCkgewotICAgICAgICAgIHdzT3V0cHV0ID0gd3NHcm91cFN5bWJvbCArIHdzT3V0cHV0OwotICAgICAgICB9Ci0gICAgICAgIGNjZi0tOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJygnOgotICAgICAgICBpZiAoYk5lZykgewotICAgICAgICAgIHdzT3V0cHV0ID0gTCIoIiArIHdzT3V0cHV0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHdzT3V0cHV0ID0gTCIgIiArIHdzT3V0cHV0OwotICAgICAgICB9Ci0gICAgICAgIGJBZGROZWcgPSB0cnVlOwotICAgICAgICBjY2YtLTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICcpJzoKLSAgICAgICAgaWYgKGJOZWcpIHsKLSAgICAgICAgICB3c091dHB1dCA9IEwiKSIgKyB3c091dHB1dDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB3c091dHB1dCA9IEwiICIgKyB3c091dHB1dDsKLSAgICAgICAgfQotICAgICAgICBjY2YtLTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdcJyc6Ci0gICAgICAgIHdzT3V0cHV0ID0gRlhfR2V0TGl0ZXJhbFRleHRSZXZlcnNlKHN0cmYsIGNjZikgKyB3c091dHB1dDsKLSAgICAgICAgY2NmLS07Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgd3NPdXRwdXQgPSBzdHJmW2NjZl0gKyB3c091dHB1dDsKLSAgICAgICAgY2NmLS07Ci0gICAgfQotICB9Ci0gIGlmIChjYyA+PSAwKSB7Ci0gICAgaW50IG5Qb3MgPSBkb3RfaW5kZXggJSAzOwotICAgIHdzT3V0cHV0LmNsZWFyKCk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZG90X2luZGV4OyBpKyspIHsKLSAgICAgIGlmIChpICUgMyA9PSBuUG9zICYmIGkgIT0gMCkgewotICAgICAgICB3c091dHB1dCArPSB3c0dyb3VwU3ltYm9sOwotICAgICAgfQotICAgICAgd3NPdXRwdXQgKz0gd3NOdW1lcmljW2ldOwotICAgIH0KLSAgICBpZiAoZG90X2luZGV4IDwgbGVuKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsKLSAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsLCB3c1N5bWJvbCk7Ci0gICAgICB3c091dHB1dCArPSB3c1N5bWJvbDsKLSAgICAgIHdzT3V0cHV0ICs9IHdzTnVtZXJpYy5SaWdodChsZW4gLSBkb3RfaW5kZXggLSAxKTsKLSAgICB9Ci0gICAgaWYgKGJOZWcpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXN5bWJvbDsKLSAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywgd3NNaW51c3ltYm9sKTsKLSAgICAgIHdzT3V0cHV0ID0gd3NNaW51c3ltYm9sICsgd3NPdXRwdXQ7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoZG90X2luZGV4X2YgPT0gd3NOdW1Gb3JtYXQuR2V0TGVuZ3RoKCkpIHsKLSAgICBpZiAoIWJBZGROZWcgJiYgYk5lZykgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c3ltYm9sOwotICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLCB3c01pbnVzeW1ib2wpOwotICAgICAgd3NPdXRwdXQgPSB3c01pbnVzeW1ib2wgKyB3c091dHB1dDsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NEb3RTeW1ib2w7Ci0gIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsLCB3c0RvdFN5bWJvbCk7Ci0gIGlmIChzdHJmW2RvdF9pbmRleF9mXSA9PSAnVicpIHsKLSAgICB3c091dHB1dCArPSB3c0RvdFN5bWJvbDsKLSAgfSBlbHNlIGlmIChzdHJmW2RvdF9pbmRleF9mXSA9PSAnLicpIHsKLSAgICBpZiAoZG90X2luZGV4IDwgbGVuKSB7Ci0gICAgICB3c091dHB1dCArPSB3c0RvdFN5bWJvbDsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKHN0cmZbZG90X2luZGV4X2YgKyAxXSA9PSAnOScgfHwgc3RyZltkb3RfaW5kZXhfZiArIDFdID09ICdaJykgewotICAgICAgICB3c091dHB1dCArPSB3c0RvdFN5bWJvbDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgY2NmID0gZG90X2luZGV4X2YgKyAxOwotICBjYyA9IGRvdF9pbmRleCArIDE7Ci0gIHdoaWxlIChjY2YgPCBsZW5mKSB7Ci0gICAgc3dpdGNoIChzdHJmW2NjZl0pIHsKLSAgICAgIGNhc2UgJ1wnJzoKLSAgICAgICAgd3NPdXRwdXQgKz0gRlhfR2V0TGl0ZXJhbFRleHQoc3RyZiwgY2NmLCBsZW5mKTsKLSAgICAgICAgY2NmKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnOSc6Ci0gICAgICAgIGlmIChjYyA8IGxlbikgewotICAgICAgICAgIHdzT3V0cHV0ICs9IHN0cltjY107Ci0gICAgICAgICAgY2MrKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB3c091dHB1dCArPSBMJzAnOwotICAgICAgICB9Ci0gICAgICAgIGNjZisrOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ3onOgotICAgICAgICBpZiAoY2MgPCBsZW4pIHsKLSAgICAgICAgICB3c091dHB1dCArPSBzdHJbY2NdOwotICAgICAgICAgIGNjKys7Ci0gICAgICAgIH0KLSAgICAgICAgY2NmKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnWic6Ci0gICAgICAgIGlmIChjYyA8IGxlbikgewotICAgICAgICAgIHdzT3V0cHV0ICs9IHN0cltjY107Ci0gICAgICAgICAgY2MrKzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB3c091dHB1dCArPSBMJzAnOwotICAgICAgICB9Ci0gICAgICAgIGNjZisrOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ0UnOiB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRXhwOwotICAgICAgICB3c0V4cC5Gb3JtYXQoTCJFJStkIiwgZXhwb25lbnQpOwotICAgICAgICB3c091dHB1dCArPSB3c0V4cDsKLSAgICAgIH0KLSAgICAgICAgY2NmKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnJCc6IHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2w7Ci0gICAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbCwgd3NTeW1ib2wpOwotICAgICAgICB3c091dHB1dCArPSB3c1N5bWJvbDsKLSAgICAgIH0KLSAgICAgICAgY2NmKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnYyc6Ci0gICAgICAgIGlmIChjY2YgKyAxIDwgbGVuZiAmJiBzdHJmW2NjZiArIDFdID09ICdyJykgewotICAgICAgICAgIGlmIChiTmVnKSB7Ci0gICAgICAgICAgICB3c091dHB1dCArPSBMIkNSIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2NmICs9IDI7Ci0gICAgICAgICAgYkFkZE5lZyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdDJzoKLSAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ1InKSB7Ci0gICAgICAgICAgaWYgKGJOZWcpIHsKLSAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiQ1IiOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3c091dHB1dCArPSBMIiAgIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2NmICs9IDI7Ci0gICAgICAgICAgYkFkZE5lZyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdkJzoKLSAgICAgICAgaWYgKGNjZiArIDEgPCBsZW5mICYmIHN0cmZbY2NmICsgMV0gPT0gJ2InKSB7Ci0gICAgICAgICAgaWYgKGJOZWcpIHsKLSAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiZGIiOwotICAgICAgICAgIH0KLSAgICAgICAgICBjY2YgKz0gMjsKLSAgICAgICAgICBiQWRkTmVnID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ0QnOgotICAgICAgICBpZiAoY2NmICsgMSA8IGxlbmYgJiYgc3RyZltjY2YgKyAxXSA9PSAnQicpIHsKLSAgICAgICAgICBpZiAoYk5lZykgewotICAgICAgICAgICAgd3NPdXRwdXQgKz0gTCJEQiI7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdzT3V0cHV0ICs9IEwiICAiOwotICAgICAgICAgIH0KLSAgICAgICAgICBjY2YgKz0gMjsKLSAgICAgICAgICBiQWRkTmVnID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJyUnOiB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU3ltYm9sOwotICAgICAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfUGVyY2VudCwgd3NTeW1ib2wpOwotICAgICAgICB3c091dHB1dCArPSB3c1N5bWJvbDsKLSAgICAgIH0KLSAgICAgICAgY2NmKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnOCc6IHsKLSAgICAgICAgd2hpbGUgKGNjZiA8IGxlbmYgJiYgc3RyZltjY2ZdID09ICc4JykgewotICAgICAgICAgIGNjZisrOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChjYyA8IGxlbiAmJiBGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgICAgIHdzT3V0cHV0ICs9IHN0cltjY107Ci0gICAgICAgICAgY2MrKzsKLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgJywnOgotICAgICAgICB3c091dHB1dCArPSB3c0dyb3VwU3ltYm9sOwotICAgICAgICBjY2YrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICcoJzoKLSAgICAgICAgaWYgKGJOZWcpIHsKLSAgICAgICAgICB3c091dHB1dCArPSAnKCc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgd3NPdXRwdXQgKz0gJyAnOwotICAgICAgICB9Ci0gICAgICAgIGJBZGROZWcgPSB0cnVlOwotICAgICAgICBjY2YrKzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICcpJzoKLSAgICAgICAgaWYgKGJOZWcpIHsKLSAgICAgICAgICB3c091dHB1dCArPSAnKSc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgd3NPdXRwdXQgKz0gJyAnOwotICAgICAgICB9Ci0gICAgICAgIGNjZisrOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGNjZisrOwotICAgIH0KLSAgfQotICBpZiAoIWJBZGROZWcgJiYgYk5lZykgewotICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXN5bWJvbDsKLSAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfTWludXMsIHdzTWludXN5bWJvbCk7Ci0gICAgd3NPdXRwdXQgPQotICAgICAgICB3c091dHB1dFswXSArIHdzTWludXN5bWJvbCArIHdzT3V0cHV0Lk1pZCgxLCB3c091dHB1dC5HZXRMZW5ndGgoKSAtIDEpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDRlhfRm9ybWF0U3RyaW5nOjpGb3JtYXROdW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgewotICBpZiAod3NTcmNOdW0uSXNFbXB0eSgpIHx8IHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIEZvcm1hdFN0ck51bSh3c1NyY051bS5Bc1N0cmluZ0MoKSwgd3NQYXR0ZXJuLCB3c091dHB1dCk7Ci19Ci1ib29sIENGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdE51bShGWF9GTE9BVCBmTnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgewotICBpZiAod3NQYXR0ZXJuLklzRW1wdHkoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBDRlhfTENOdW1lcmljIGxjTnVtKGZOdW0pOwotICByZXR1cm4gRm9ybWF0TENOdW1lcmljKGxjTnVtLCB3c1BhdHRlcm4sIHdzT3V0cHV0KTsKLX0KLWJvb2wgRlhfRGF0ZUZyb21DYW5vbmljYWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZSwgQ0ZYX1VuaXRpbWUmIGRhdGV0aW1lKSB7Ci0gIGludDMyX3QgeWVhciA9IDE5MDA7Ci0gIGludDMyX3QgbW9udGggPSAxOwotICBpbnQzMl90IGRheSA9IDE7Ci0gIHVpbnQxNl90IHdZZWFyID0gMDsKLSAgaW50IGNjX3N0YXJ0ID0gMCwgY2MgPSAwOwotICBjb25zdCBGWF9XQ0hBUiogc3RyID0gd3NEYXRlLmNfc3RyKCk7Ci0gIGludCBsZW4gPSB3c0RhdGUuR2V0TGVuZ3RoKCk7Ci0gIGlmIChsZW4gPiAxMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB3aGlsZSAoY2MgPCBsZW4gJiYgY2MgPCA0KSB7Ci0gICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICB3WWVhciA9IHdZZWFyICogMTAgKyBzdHJbY2MrK10gLSAnMCc7Ci0gIH0KLSAgeWVhciA9IHdZZWFyOwotICBpZiAoY2MgPCA0IHx8IHdZZWFyIDwgMTkwMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoY2MgPCBsZW4pIHsKLSAgICBpZiAoc3RyW2NjXSA9PSAnLScpIHsKLSAgICAgIGNjKys7Ci0gICAgfQotICAgIGNjX3N0YXJ0ID0gY2M7Ci0gICAgdWludDhfdCB0bXBNID0gMDsKLSAgICB3aGlsZSAoY2MgPCBsZW4gJiYgY2MgPCBjY19zdGFydCArIDIpIHsKLSAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgdG1wTSA9IHRtcE0gKiAxMCArIHN0cltjYysrXSAtICcwJzsKLSAgICB9Ci0gICAgbW9udGggPSB0bXBNOwotICAgIGlmIChjYyA9PSBjY19zdGFydCArIDEgfHwgdG1wTSA+IDEyIHx8IHRtcE0gPCAxKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChjYyA8IGxlbikgewotICAgICAgaWYgKHN0cltjY10gPT0gJy0nKSB7Ci0gICAgICAgIGNjKys7Ci0gICAgICB9Ci0gICAgICB1aW50OF90IHRtcEQgPSAwOwotICAgICAgY2Nfc3RhcnQgPSBjYzsKLSAgICAgIHdoaWxlIChjYyA8IGxlbiAmJiBjYyA8IGNjX3N0YXJ0ICsgMikgewotICAgICAgICBpZiAoIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHRtcEQgPSB0bXBEICogMTAgKyBzdHJbY2MrK10gLSAnMCc7Ci0gICAgICB9Ci0gICAgICBkYXkgPSB0bXBEOwotICAgICAgaWYgKHRtcEQgPCAxKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmICgodG1wTSA9PSAxIHx8IHRtcE0gPT0gMyB8fCB0bXBNID09IDUgfHwgdG1wTSA9PSA3IHx8IHRtcE0gPT0gOCB8fAotICAgICAgICAgICB0bXBNID09IDEwIHx8IHRtcE0gPT0gMTIpICYmCi0gICAgICAgICAgdG1wRCA+IDMxKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmICgodG1wTSA9PSA0IHx8IHRtcE0gPT0gNiB8fCB0bXBNID09IDkgfHwgdG1wTSA9PSAxMSkgJiYgdG1wRCA+IDMwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJvb2wgaUxlYXBZZWFyOwotICAgICAgaWYgKCh3WWVhciAlIDQgPT0gMCAmJiB3WWVhciAlIDEwMCAhPSAwKSB8fCB3WWVhciAlIDQwMCA9PSAwKSB7Ci0gICAgICAgIGlMZWFwWWVhciA9IHRydWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpTGVhcFllYXIgPSBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmICgoaUxlYXBZZWFyICYmIHRtcE0gPT0gMiAmJiB0bXBEID4gMjkpIHx8Ci0gICAgICAgICAgKCFpTGVhcFllYXIgJiYgdG1wTSA9PSAyICYmIHRtcEQgPiAyOCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfQotICBDRlhfVW5pdGltZSB1dDsKLSAgdXQuU2V0KHllYXIsIG1vbnRoLCBkYXkpOwotICBkYXRldGltZSA9IGRhdGV0aW1lICsgdXQ7Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBGWF9UaW1lRnJvbUNhbm9uaWNhbChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1VuaXRpbWUmIGRhdGV0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlKSB7Ci0gIGlmICh3c1RpbWUuR2V0TGVuZ3RoKCkgPT0gMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB1aW50OF90IGhvdXIgPSAwOwotICB1aW50OF90IG1pbnV0ZSA9IDA7Ci0gIHVpbnQ4X3Qgc2Vjb25kID0gMDsKLSAgdWludDE2X3QgbWlsbGlzZWNvbmQgPSAwOwotICBpbnQgY2Nfc3RhcnQgPSAwLCBjYyA9IGNjX3N0YXJ0OwotICBjb25zdCBGWF9XQ0hBUiogc3RyID0gd3NUaW1lLmNfc3RyKCk7Ci0gIGludCBsZW4gPSB3c1RpbWUuR2V0TGVuZ3RoKCk7Ci0gIHdoaWxlIChjYyA8IGxlbiAmJiBjYyA8IDIpIHsKLSAgICBpZiAoIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGhvdXIgPSBob3VyICogMTAgKyBzdHJbY2MrK10gLSAnMCc7Ci0gIH0KLSAgaWYgKGNjIDwgMiB8fCBob3VyID49IDI0KSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChjYyA8IGxlbikgewotICAgIGlmIChzdHJbY2NdID09ICc6JykgewotICAgICAgY2MrKzsKLSAgICB9Ci0gICAgY2Nfc3RhcnQgPSBjYzsKLSAgICB3aGlsZSAoY2MgPCBsZW4gJiYgY2MgPCBjY19zdGFydCArIDIpIHsKLSAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgbWludXRlID0gbWludXRlICogMTAgKyBzdHJbY2MrK10gLSAnMCc7Ci0gICAgfQotICAgIGlmIChjYyA9PSBjY19zdGFydCArIDEgfHwgbWludXRlID49IDYwKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChjYyA8IGxlbikgewotICAgICAgaWYgKHN0cltjY10gPT0gJzonKSB7Ci0gICAgICAgIGNjKys7Ci0gICAgICB9Ci0gICAgICBjY19zdGFydCA9IGNjOwotICAgICAgd2hpbGUgKGNjIDwgbGVuICYmIGNjIDwgY2Nfc3RhcnQgKyAyKSB7Ci0gICAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgc2Vjb25kID0gc2Vjb25kICogMTAgKyBzdHJbY2MrK10gLSAnMCc7Ci0gICAgICB9Ci0gICAgICBpZiAoY2MgPT0gY2Nfc3RhcnQgKyAxIHx8IHNlY29uZCA+PSA2MCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoY2MgPCBsZW4pIHsKLSAgICAgICAgaWYgKHN0cltjY10gPT0gJy4nKSB7Ci0gICAgICAgICAgY2MrKzsKLSAgICAgICAgICBjY19zdGFydCA9IGNjOwotICAgICAgICAgIHdoaWxlIChjYyA8IGxlbiAmJiBjYyA8IGNjX3N0YXJ0ICsgMykgewotICAgICAgICAgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtaWxsaXNlY29uZCA9IG1pbGxpc2Vjb25kICogMTAgKyBzdHJbY2MrK10gLSAnMCc7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChjYyA8IGNjX3N0YXJ0ICsgMykKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2MgPCBsZW4pIHsKLSAgICAgICAgICBGWF9USU1FWk9ORSB0ekRpZmY7Ci0gICAgICAgICAgdHpEaWZmLnR6SG91ciA9IDA7Ci0gICAgICAgICAgdHpEaWZmLnR6TWludXRlID0gMDsKLSAgICAgICAgICBpZiAoc3RyW2NjXSAhPSAnWicpIHsKLSAgICAgICAgICAgIGNjICs9IEZYX1BhcnNlVGltZVpvbmUoc3RyICsgY2MsIGxlbiAtIGNjLCB0ekRpZmYpOwotICAgICAgICAgIH0KLSAgICAgICAgICBGWF9SZXNvbHZlWm9uZShob3VyLCBtaW51dGUsIHR6RGlmZiwgcExvY2FsZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgQ0ZYX1VuaXRpbWUgdXQ7Ci0gIHV0LlNldCgwLCAwLCAwLCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQpOwotICBkYXRldGltZSA9IGRhdGV0aW1lICsgdXQ7Ci0gIHJldHVybiB0cnVlOwotfQotc3RhdGljIHVpbnQxNl90IEZYX0dldFNvbGFyTW9udGhEYXlzKHVpbnQxNl90IHllYXIsIHVpbnQxNl90IG1vbnRoKSB7Ci0gIGlmIChtb250aCAlIDIpIHsKLSAgICByZXR1cm4gMzE7Ci0gIH0gZWxzZSBpZiAobW9udGggPT0gMikgewotICAgIHJldHVybiBGWF9Jc0xlYXBZZWFyKHllYXIpID8gMjkgOiAyODsKLSAgfQotICByZXR1cm4gMzA7Ci19Ci1zdGF0aWMgdWludDE2X3QgRlhfR2V0V2Vla0RheSh1aW50MTZfdCB5ZWFyLCB1aW50MTZfdCBtb250aCwgdWludDE2X3QgZGF5KSB7Ci0gIHVpbnQxNl90IGdfbW9udGhfZGF5W10gPSB7MCwgMywgMywgNiwgMSwgNCwgNiwgMiwgNSwgMCwgMywgNX07Ci0gIHVpbnQxNl90IG5EYXlzID0KLSAgICAgICh5ZWFyIC0gMSkgJSA3ICsgKHllYXIgLSAxKSAvIDQgLSAoeWVhciAtIDEpIC8gMTAwICsgKHllYXIgLSAxKSAvIDQwMDsKLSAgbkRheXMgKz0gZ19tb250aF9kYXlbbW9udGggLSAxXSArIGRheTsKLSAgaWYgKEZYX0lzTGVhcFllYXIoeWVhcikgJiYgbW9udGggPiAyKSB7Ci0gICAgbkRheXMrKzsKLSAgfQotICByZXR1cm4gbkRheXMgJSA3OwotfQotc3RhdGljIHVpbnQxNl90IEZYX0dldFdlZWtPZk1vbnRoKHVpbnQxNl90IHllYXIsIHVpbnQxNl90IG1vbnRoLCB1aW50MTZfdCBkYXkpIHsKLSAgdWludDE2X3Qgd2Vla19kYXkgPSBGWF9HZXRXZWVrRGF5KHllYXIsIG1vbnRoLCAxKTsKLSAgdWludDE2X3Qgd2Vla19pbmRleCA9IDA7Ci0gIHdlZWtfaW5kZXggKz0gZGF5IC8gNzsKLSAgZGF5ID0gZGF5ICUgNzsKLSAgaWYgKHdlZWtfZGF5ICsgZGF5ID4gNykgewotICAgIHdlZWtfaW5kZXgrKzsKLSAgfQotICByZXR1cm4gd2Vla19pbmRleDsKLX0KLXN0YXRpYyB1aW50MTZfdCBGWF9HZXRXZWVrT2ZZZWFyKHVpbnQxNl90IHllYXIsIHVpbnQxNl90IG1vbnRoLCB1aW50MTZfdCBkYXkpIHsKLSAgdWludDE2X3QgbkRheXMgPSAwOwotICBmb3IgKHVpbnQxNl90IGkgPSAxOyBpIDwgbW9udGg7IGkrKykgewotICAgIG5EYXlzICs9IEZYX0dldFNvbGFyTW9udGhEYXlzKHllYXIsIGkpOwotICB9Ci0gIG5EYXlzICs9IGRheTsKLSAgdWludDE2X3Qgd2Vla19kYXkgPSBGWF9HZXRXZWVrRGF5KHllYXIsIDEsIDEpOwotICB1aW50MTZfdCB3ZWVrX2luZGV4ID0gMTsKLSAgd2Vla19pbmRleCArPSBuRGF5cyAvIDc7Ci0gIG5EYXlzID0gbkRheXMgJSA3OwotICBpZiAod2Vla19kYXkgKyBuRGF5cyA+IDcpIHsKLSAgICB3ZWVrX2luZGV4Kys7Ci0gIH0KLSAgcmV0dXJuIHdlZWtfaW5kZXg7Ci19Ci1zdGF0aWMgYm9vbCBGWF9EYXRlRm9ybWF0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGVQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfVW5pdGltZSYgZGF0ZXRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1Jlc3VsdCkgewotICBib29sIGJSZXQgPSB0cnVlOwotICBpbnQzMl90IHllYXIgPSBkYXRldGltZS5HZXRZZWFyKCk7Ci0gIHVpbnQ4X3QgbW9udGggPSBkYXRldGltZS5HZXRNb250aCgpOwotICB1aW50OF90IGRheSA9IGRhdGV0aW1lLkdldERheSgpOwotICBpbnQzMl90IGNjZiA9IDA7Ci0gIGNvbnN0IEZYX1dDSEFSKiBzdHJmID0gd3NEYXRlUGF0dGVybi5jX3N0cigpOwotICBpbnQzMl90IGxlbmYgPSB3c0RhdGVQYXR0ZXJuLkdldExlbmd0aCgpOwotICBDRlhfV2lkZVN0cmluZ0Mgd3NEYXRlU3ltYm9scyhnc193c0RhdGVTeW1ib2xzKTsKLSAgd2hpbGUgKGNjZiA8IGxlbmYpIHsKLSAgICBpZiAoc3RyZltjY2ZdID09ICdcJycpIHsKLSAgICAgIHdzUmVzdWx0ICs9IEZYX0dldExpdGVyYWxUZXh0KHN0cmYsIGNjZiwgbGVuZik7Ci0gICAgICBjY2YrKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0gZWxzZSBpZiAod3NEYXRlU3ltYm9scy5GaW5kKHN0cmZbY2NmXSkgPT0gLTEpIHsKLSAgICAgIHdzUmVzdWx0ICs9IHN0cmZbY2NmKytdOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIHVpbnQzMl90IGR3U3ltYm9sTnVtID0gMTsKLSAgICBGWF9XQ0hBUiBkd0NoYXJTeW1ib2wgPSBzdHJmW2NjZisrXTsKLSAgICB3aGlsZSAoY2NmIDwgbGVuZiAmJiBzdHJmW2NjZl0gPT0gZHdDaGFyU3ltYm9sKSB7Ci0gICAgICBjY2YrKzsKLSAgICAgIGR3U3ltYm9sTnVtKys7Ci0gICAgfQotICAgIHVpbnQzMl90IGR3U3ltYm9sID0gKGR3Q2hhclN5bWJvbCA8PCA4KSB8IChkd1N5bWJvbE51bSArICcwJyk7Ci0gICAgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRCcsICcxJykpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF5OwotICAgICAgd3NEYXkuRm9ybWF0KEwiJWQiLCBkYXkpOwotICAgICAgd3NSZXN1bHQgKz0gd3NEYXk7Ci0gICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0QnLCAnMicpKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c0RheTsKLSAgICAgIHdzRGF5LkZvcm1hdChMIiUwMmQiLCBkYXkpOwotICAgICAgd3NSZXN1bHQgKz0gd3NEYXk7Ci0gICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0onLCAnMScpKSB7Ci0gICAgICB1aW50MTZfdCBuRGF5cyA9IDA7Ci0gICAgICBmb3IgKGludCBpID0gMTsgaSA8IG1vbnRoOyBpKyspIHsKLSAgICAgICAgbkRheXMgKz0gRlhfR2V0U29sYXJNb250aERheXMoeWVhciwgaSk7Ci0gICAgICB9Ci0gICAgICBuRGF5cyArPSBkYXk7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c0RheXM7Ci0gICAgICB3c0RheXMuRm9ybWF0KEwiJWQiLCBuRGF5cyk7Ci0gICAgICB3c1Jlc3VsdCArPSB3c0RheXM7Ci0gICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0onLCAnMycpKSB7Ci0gICAgICB1aW50MTZfdCBuRGF5cyA9IDA7Ci0gICAgICBmb3IgKGludCBpID0gMTsgaSA8IG1vbnRoOyBpKyspIHsKLSAgICAgICAgbkRheXMgKz0gRlhfR2V0U29sYXJNb250aERheXMoeWVhciwgaSk7Ci0gICAgICB9Ci0gICAgICBuRGF5cyArPSBkYXk7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c0RheXM7Ci0gICAgICB3c0RheXMuRm9ybWF0KEwiJTAzZCIsIG5EYXlzKTsKLSAgICAgIHdzUmVzdWx0ICs9IHdzRGF5czsKLSAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICcxJykpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzTW9udGg7Ci0gICAgICB3c01vbnRoLkZvcm1hdChMIiVkIiwgbW9udGgpOwotICAgICAgd3NSZXN1bHQgKz0gd3NNb250aDsKLSAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICcyJykpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzTW9udGg7Ci0gICAgICB3c01vbnRoLkZvcm1hdChMIiUwMmQiLCBtb250aCk7Ci0gICAgICB3c1Jlc3VsdCArPSB3c01vbnRoOwotICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdNJywgJzMnKSkgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOwotICAgICAgcExvY2FsZS0+R2V0TW9udGhOYW1lKG1vbnRoIC0gMSwgd3NUZW1wLCB0cnVlKTsKLSAgICAgIHdzUmVzdWx0ICs9IHdzVGVtcDsKLSAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICc0JykpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsKLSAgICAgIHBMb2NhbGUtPkdldE1vbnRoTmFtZShtb250aCAtIDEsIHdzVGVtcCwgZmFsc2UpOwotICAgICAgd3NSZXN1bHQgKz0gd3NUZW1wOwotICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdFJywgJzEnKSkgewotICAgICAgdWludDE2X3Qgd1dlZWtEYXkgPSBGWF9HZXRXZWVrRGF5KHllYXIsIG1vbnRoLCBkYXkpOwotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NXZWVrRGF5OwotICAgICAgd3NXZWVrRGF5LkZvcm1hdChMIiVkIiwgd1dlZWtEYXkgKyAxKTsKLSAgICAgIHdzUmVzdWx0ICs9IHdzV2Vla0RheTsKLSAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnRScsICczJykpIHsKLSAgICAgIHVpbnQxNl90IHdXZWVrRGF5ID0gRlhfR2V0V2Vla0RheSh5ZWFyLCBtb250aCwgZGF5KTsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsKLSAgICAgIHBMb2NhbGUtPkdldERheU5hbWUod1dlZWtEYXksIHdzVGVtcCwgdHJ1ZSk7Ci0gICAgICB3c1Jlc3VsdCArPSB3c1RlbXA7Ci0gICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0UnLCAnNCcpKSB7Ci0gICAgICB1aW50MTZfdCB3V2Vla0RheSA9IEZYX0dldFdlZWtEYXkoeWVhciwgbW9udGgsIGRheSk7Ci0gICAgICBpZiAocExvY2FsZSkgewotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7Ci0gICAgICAgIHBMb2NhbGUtPkdldERheU5hbWUod1dlZWtEYXksIHdzVGVtcCwgZmFsc2UpOwotICAgICAgICB3c1Jlc3VsdCArPSB3c1RlbXA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ2UnLCAnMScpKSB7Ci0gICAgICB1aW50MTZfdCB3V2Vla0RheSA9IEZYX0dldFdlZWtEYXkoeWVhciwgbW9udGgsIGRheSk7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c1dlZWtEYXk7Ci0gICAgICB3c1dlZWtEYXkuRm9ybWF0KEwiJWQiLCB3V2Vla0RheSA/IHdXZWVrRGF5IDogNyk7Ci0gICAgICB3c1Jlc3VsdCArPSB3c1dlZWtEYXk7Ci0gICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0cnLCAnMScpKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7Ci0gICAgICBwTG9jYWxlLT5HZXRFcmFOYW1lKHdzVGVtcCwgeWVhciA8IDApOwotICAgICAgd3NSZXN1bHQgKz0gd3NUZW1wOwotICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdZJywgJzInKSkgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NZZWFyOwotICAgICAgd3NZZWFyLkZvcm1hdChMIiUwMmQiLCB5ZWFyICUgMTAwKTsKLSAgICAgIHdzUmVzdWx0ICs9IHdzWWVhcjsKLSAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnWScsICc0JykpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzWWVhcjsKLSAgICAgIHdzWWVhci5Gb3JtYXQoTCIlZCIsIHllYXIpOwotICAgICAgd3NSZXN1bHQgKz0gd3NZZWFyOwotICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICd3JywgJzEnKSkgewotICAgICAgdWludDE2X3Qgd2Vla19pbmRleCA9IEZYX0dldFdlZWtPZk1vbnRoKHllYXIsIG1vbnRoLCBkYXkpOwotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NXZWVrSW5Nb250aDsKLSAgICAgIHdzV2Vla0luTW9udGguRm9ybWF0KEwiJWQiLCB3ZWVrX2luZGV4KTsKLSAgICAgIHdzUmVzdWx0ICs9IHdzV2Vla0luTW9udGg7Ci0gICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ1cnLCAnMicpKSB7Ci0gICAgICB1aW50MTZfdCB3ZWVrX2luZGV4ID0gRlhfR2V0V2Vla09mWWVhcih5ZWFyLCBtb250aCwgZGF5KTsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzV2Vla0luWWVhcjsKLSAgICAgIHdzV2Vla0luWWVhci5Gb3JtYXQoTCIlMDJkIiwgd2Vla19pbmRleCk7Ci0gICAgICB3c1Jlc3VsdCArPSB3c1dlZWtJblllYXI7Ci0gICAgfQotICB9Ci0gIHJldHVybiBiUmV0OwotfQotc3RhdGljIGJvb2wgRlhfVGltZUZvcm1hdChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUaW1lUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1VuaXRpbWUmIGRhdGV0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NSZXN1bHQpIHsKLSAgYm9vbCBiR01UID0gZmFsc2U7Ci0gIGJvb2wgYlJldCA9IHRydWU7Ci0gIHVpbnQ4X3QgaG91ciA9IGRhdGV0aW1lLkdldEhvdXIoKTsKLSAgdWludDhfdCBtaW51dGUgPSBkYXRldGltZS5HZXRNaW51dGUoKTsKLSAgdWludDhfdCBzZWNvbmQgPSBkYXRldGltZS5HZXRTZWNvbmQoKTsKLSAgdWludDE2X3QgbWlsbGlzZWNvbmQgPSBkYXRldGltZS5HZXRNaWxsaXNlY29uZCgpOwotICBpbnQzMl90IGNjZiA9IDA7Ci0gIGNvbnN0IEZYX1dDSEFSKiBzdHJmID0gd3NUaW1lUGF0dGVybi5jX3N0cigpOwotICBpbnQzMl90IGxlbmYgPSB3c1RpbWVQYXR0ZXJuLkdldExlbmd0aCgpOwotICB1aW50MTZfdCB3SG91ciA9IGhvdXI7Ci0gIGJvb2wgYlBNID0gZmFsc2U7Ci0gIGlmICh3c1RpbWVQYXR0ZXJuLkZpbmQoJ0EnKSAhPSAtMSkgewotICAgIGlmICh3SG91ciA+PSAxMikgewotICAgICAgYlBNID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmdDIHdzVGltZVN5bWJvbHMoZ3Nfd3NUaW1lU3ltYm9scyk7Ci0gIHdoaWxlIChjY2YgPCBsZW5mKSB7Ci0gICAgaWYgKHN0cmZbY2NmXSA9PSAnXCcnKSB7Ci0gICAgICB3c1Jlc3VsdCArPSBGWF9HZXRMaXRlcmFsVGV4dChzdHJmLCBjY2YsIGxlbmYpOwotICAgICAgY2NmKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9IGVsc2UgaWYgKHdzVGltZVN5bWJvbHMuRmluZChzdHJmW2NjZl0pID09IC0xKSB7Ci0gICAgICB3c1Jlc3VsdCArPSBzdHJmW2NjZisrXTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICB1aW50MzJfdCBkd1N5bWJvbE51bSA9IDE7Ci0gICAgRlhfV0NIQVIgZHdDaGFyU3ltYm9sID0gc3RyZltjY2YrK107Ci0gICAgd2hpbGUgKGNjZiA8IGxlbmYgJiYgc3RyZltjY2ZdID09IGR3Q2hhclN5bWJvbCkgewotICAgICAgY2NmKys7Ci0gICAgICBkd1N5bWJvbE51bSsrOwotICAgIH0KLSAgICB1aW50MzJfdCBkd1N5bWJvbCA9IChkd0NoYXJTeW1ib2wgPDwgOCkgfCAoZHdTeW1ib2xOdW0gKyAnMCcpOwotICAgIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ2gnLCAnMScpKSB7Ci0gICAgICBpZiAod0hvdXIgPiAxMikgewotICAgICAgICB3SG91ciAtPSAxMjsKLSAgICAgIH0KLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzSG91cjsKLSAgICAgIHdzSG91ci5Gb3JtYXQoTCIlZCIsIHdIb3VyID09IDAgPyAxMiA6IHdIb3VyKTsKLSAgICAgIHdzUmVzdWx0ICs9IHdzSG91cjsKLSAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnaCcsICcyJykpIHsKLSAgICAgIGlmICh3SG91ciA+IDEyKSB7Ci0gICAgICAgIHdIb3VyIC09IDEyOwotICAgICAgfQotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NIb3VyOwotICAgICAgd3NIb3VyLkZvcm1hdChMIiUwMmQiLCB3SG91ciA9PSAwID8gMTIgOiB3SG91cik7Ci0gICAgICB3c1Jlc3VsdCArPSB3c0hvdXI7Ci0gICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0snLCAnMScpKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c0hvdXI7Ci0gICAgICB3c0hvdXIuRm9ybWF0KEwiJWQiLCB3SG91ciA9PSAwID8gMjQgOiB3SG91cik7Ci0gICAgICB3c1Jlc3VsdCArPSB3c0hvdXI7Ci0gICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0snLCAnMicpKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c0hvdXI7Ci0gICAgICB3c0hvdXIuRm9ybWF0KEwiJTAyZCIsIHdIb3VyID09IDAgPyAyNCA6IHdIb3VyKTsKLSAgICAgIHdzUmVzdWx0ICs9IHdzSG91cjsKLSAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnaycsICcxJykpIHsKLSAgICAgIGlmICh3SG91ciA+IDEyKSB7Ci0gICAgICAgIHdIb3VyIC09IDEyOwotICAgICAgfQotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NIb3VyOwotICAgICAgd3NIb3VyLkZvcm1hdChMIiVkIiwgd0hvdXIpOwotICAgICAgd3NSZXN1bHQgKz0gd3NIb3VyOwotICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdIJywgJzEnKSkgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NIb3VyOwotICAgICAgd3NIb3VyLkZvcm1hdChMIiVkIiwgd0hvdXIpOwotICAgICAgd3NSZXN1bHQgKz0gd3NIb3VyOwotICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdrJywgJzInKSkgewotICAgICAgaWYgKHdIb3VyID4gMTIpIHsKLSAgICAgICAgd0hvdXIgLT0gMTI7Ci0gICAgICB9Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c0hvdXI7Ci0gICAgICB3c0hvdXIuRm9ybWF0KEwiJTAyZCIsIHdIb3VyKTsKLSAgICAgIHdzUmVzdWx0ICs9IHdzSG91cjsKLSAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnSCcsICcyJykpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzSG91cjsKLSAgICAgIHdzSG91ci5Gb3JtYXQoTCIlMDJkIiwgd0hvdXIpOwotICAgICAgd3NSZXN1bHQgKz0gd3NIb3VyOwotICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdNJywgJzEnKSkgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51dGU7Ci0gICAgICB3c01pbnV0ZS5Gb3JtYXQoTCIlZCIsIG1pbnV0ZSk7Ci0gICAgICB3c1Jlc3VsdCArPSB3c01pbnV0ZTsKLSAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnTScsICcyJykpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWludXRlOwotICAgICAgd3NNaW51dGUuRm9ybWF0KEwiJTAyZCIsIG1pbnV0ZSk7Ci0gICAgICB3c1Jlc3VsdCArPSB3c01pbnV0ZTsKLSAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnUycsICcxJykpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzU2Vjb25kOwotICAgICAgd3NTZWNvbmQuRm9ybWF0KEwiJWQiLCBzZWNvbmQpOwotICAgICAgd3NSZXN1bHQgKz0gd3NTZWNvbmQ7Ci0gICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ1MnLCAnMicpKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c1NlY29uZDsKLSAgICAgIHdzU2Vjb25kLkZvcm1hdChMIiUwMmQiLCBzZWNvbmQpOwotICAgICAgd3NSZXN1bHQgKz0gd3NTZWNvbmQ7Ci0gICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ0YnLCAnMycpKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c01pbGxpc2Vjb25kczsKLSAgICAgIHdzTWlsbGlzZWNvbmRzLkZvcm1hdChMIiUwM2QiLCBtaWxsaXNlY29uZCk7Ci0gICAgICB3c1Jlc3VsdCArPSB3c01pbGxpc2Vjb25kczsKLSAgICB9IGVsc2UgaWYgKGR3U3ltYm9sID09IEZYQlNUUl9JRCgwLCAwLCAnQScsICcxJykpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWVyaWRpZW07Ci0gICAgICBwTG9jYWxlLT5HZXRNZXJpZGllbU5hbWUod3NNZXJpZGllbSwgIWJQTSk7Ci0gICAgICB3c1Jlc3VsdCArPSB3c01lcmlkaWVtOwotICAgIH0gZWxzZSBpZiAoZHdTeW1ib2wgPT0gRlhCU1RSX0lEKDAsIDAsICdaJywgJzEnKSkgewotICAgICAgd3NSZXN1bHQgKz0gTCJHTVQiOwotICAgICAgRlhfVElNRVpPTkUgdHo7Ci0gICAgICBwTG9jYWxlLT5HZXRUaW1lWm9uZSgmdHopOwotICAgICAgaWYgKCFiR01UICYmICh0ei50ekhvdXIgIT0gMCB8fCB0ei50ek1pbnV0ZSAhPSAwKSkgewotICAgICAgICBpZiAodHoudHpIb3VyIDwgMCkgewotICAgICAgICAgIHdzUmVzdWx0ICs9IEwiLSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgd3NSZXN1bHQgKz0gTCIrIjsKLSAgICAgICAgfQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RpbWV6b25lOwotICAgICAgICB3c1RpbWV6b25lLkZvcm1hdChMIiUwMmQ6JTAyZCIsIEZYU1lTX2Ficyh0ei50ekhvdXIpLCB0ei50ek1pbnV0ZSk7Ci0gICAgICAgIHdzUmVzdWx0ICs9IHdzVGltZXpvbmU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChkd1N5bWJvbCA9PSBGWEJTVFJfSUQoMCwgMCwgJ3onLCAnMScpKSB7Ci0gICAgICBGWF9USU1FWk9ORSB0ejsKLSAgICAgIHBMb2NhbGUtPkdldFRpbWVab25lKCZ0eik7Ci0gICAgICBpZiAoIWJHTVQgJiYgdHoudHpIb3VyICE9IDAgJiYgdHoudHpNaW51dGUgIT0gMCkgewotICAgICAgICBpZiAodHoudHpIb3VyIDwgMCkgewotICAgICAgICAgIHdzUmVzdWx0ICs9IEwiLSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgd3NSZXN1bHQgKz0gTCIrIjsKLSAgICAgICAgfQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RpbWV6b25lOwotICAgICAgICB3c1RpbWV6b25lLkZvcm1hdChMIiUwMmQ6JTAyZCIsIEZYU1lTX2Ficyh0ei50ekhvdXIpLCB0ei50ek1pbnV0ZSk7Ci0gICAgICAgIHdzUmVzdWx0ICs9IHdzVGltZXpvbmU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBiUmV0OwotfQotc3RhdGljIGJvb2wgRlhfRm9ybWF0RGF0ZVRpbWUoY29uc3QgQ0ZYX1VuaXRpbWUmIGR0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZVBhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUaW1lUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkRhdGVGaXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpIHsKLSAgYm9vbCBiUmV0ID0gdHJ1ZTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlT3V0LCB3c1RpbWVPdXQ7Ci0gIGlmICghd3NEYXRlUGF0dGVybi5Jc0VtcHR5KCkpIHsKLSAgICBiUmV0ICY9IEZYX0RhdGVGb3JtYXQod3NEYXRlUGF0dGVybiwgcExvY2FsZSwgZHQsIHdzRGF0ZU91dCk7Ci0gIH0KLSAgaWYgKCF3c1RpbWVQYXR0ZXJuLklzRW1wdHkoKSkgewotICAgIGJSZXQgJj0gRlhfVGltZUZvcm1hdCh3c1RpbWVQYXR0ZXJuLCBwTG9jYWxlLCBkdCwgd3NUaW1lT3V0KTsKLSAgfQotICB3c091dHB1dCA9IGJEYXRlRmlyc3QgPyB3c0RhdGVPdXQgKyB3c1RpbWVPdXQgOiB3c1RpbWVPdXQgKyB3c0RhdGVPdXQ7Ci0gIHJldHVybiBiUmV0OwotfQotYm9vbCBDRlhfRm9ybWF0U3RyaW5nOjpGb3JtYXREYXRlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNEYXRlVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KSB7Ci0gIGlmICh3c1NyY0RhdGVUaW1lLklzRW1wdHkoKSB8fCB3c1BhdHRlcm4uSXNFbXB0eSgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIENGWF9XaWRlU3RyaW5nIHdzRGF0ZVBhdHRlcm4sIHdzVGltZVBhdHRlcm47Ci0gIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBudWxscHRyOwotICBGWF9EQVRFVElNRVRZUEUgZUNhdGVnb3J5ID0KLSAgICAgIEdldERhdGVUaW1lRm9ybWF0KHdzUGF0dGVybiwgcExvY2FsZSwgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybik7Ci0gIGlmICghcExvY2FsZSB8fCBlQ2F0ZWdvcnkgPT0gRlhfREFURVRJTUVUWVBFX1Vua25vd24pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQ0ZYX1VuaXRpbWUgZHQoMCk7Ci0gIGludDMyX3QgaVQgPSB3c1NyY0RhdGVUaW1lLkZpbmQoTCJUIik7Ci0gIGlmIChpVCA8IDApIHsKLSAgICBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9EYXRlKSB7Ci0gICAgICBGWF9EYXRlRnJvbUNhbm9uaWNhbCh3c1NyY0RhdGVUaW1lLCBkdCk7Ci0gICAgfSBlbHNlIGlmIChlQ2F0ZWdvcnkgPT0gRlhfREFURVRJTUVUWVBFX1RpbWUpIHsKLSAgICAgIEZYX1RpbWVGcm9tQ2Fub25pY2FsKHdzU3JjRGF0ZVRpbWUuQXNTdHJpbmdDKCksIGR0LCBwTG9jYWxlKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgRlhfRGF0ZUZyb21DYW5vbmljYWwod3NTcmNEYXRlVGltZS5MZWZ0KGlUKSwgZHQpOwotICAgIEZYX1RpbWVGcm9tQ2Fub25pY2FsKAotICAgICAgICB3c1NyY0RhdGVUaW1lLlJpZ2h0KHdzU3JjRGF0ZVRpbWUuR2V0TGVuZ3RoKCkgLSBpVCAtIDEpLkFzU3RyaW5nQygpLCBkdCwKLSAgICAgICAgcExvY2FsZSk7Ci0gIH0KLSAgcmV0dXJuIEZYX0Zvcm1hdERhdGVUaW1lKGR0LCB3c0RhdGVQYXR0ZXJuLCB3c1RpbWVQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNhdGVnb3J5ICE9IEZYX0RBVEVUSU1FVFlQRV9UaW1lRGF0ZSwgcExvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0KTsKLX0KLWJvb2wgQ0ZYX0Zvcm1hdFN0cmluZzo6Rm9ybWF0RGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjRGF0ZVRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfREFURVRJTUVUWVBFIGVEYXRlVGltZVR5cGUpIHsKLSAgaWYgKHdzU3JjRGF0ZVRpbWUuSXNFbXB0eSgpIHx8IHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybjsKLSAgSUZYX0xvY2FsZSogcExvY2FsZSA9IG51bGxwdHI7Ci0gIEZYX0RBVEVUSU1FVFlQRSBlQ2F0ZWdvcnkgPQotICAgICAgR2V0RGF0ZVRpbWVGb3JtYXQod3NQYXR0ZXJuLCBwTG9jYWxlLCB3c0RhdGVQYXR0ZXJuLCB3c1RpbWVQYXR0ZXJuKTsKLSAgaWYgKCFwTG9jYWxlKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChlQ2F0ZWdvcnkgPT0gRlhfREFURVRJTUVUWVBFX1Vua25vd24pIHsKLSAgICBpZiAoZURhdGVUaW1lVHlwZSA9PSBGWF9EQVRFVElNRVRZUEVfVGltZSkgewotICAgICAgd3NUaW1lUGF0dGVybiA9IHdzRGF0ZVBhdHRlcm47Ci0gICAgICB3c0RhdGVQYXR0ZXJuLmNsZWFyKCk7Ci0gICAgfQotICAgIGVDYXRlZ29yeSA9IGVEYXRlVGltZVR5cGU7Ci0gIH0KLSAgaWYgKGVDYXRlZ29yeSA9PSBGWF9EQVRFVElNRVRZUEVfVW5rbm93bikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBDRlhfVW5pdGltZSBkdCgwKTsKLSAgaW50MzJfdCBpVCA9IHdzU3JjRGF0ZVRpbWUuRmluZChMIlQiKTsKLSAgaWYgKGlUIDwgMCkgewotICAgIGlmIChlQ2F0ZWdvcnkgPT0gRlhfREFURVRJTUVUWVBFX0RhdGUgJiYKLSAgICAgICAgRlhfRGF0ZUZyb21DYW5vbmljYWwod3NTcmNEYXRlVGltZSwgZHQpKSB7Ci0gICAgICByZXR1cm4gRlhfRm9ybWF0RGF0ZVRpbWUoZHQsIHdzRGF0ZVBhdHRlcm4sIHdzVGltZVBhdHRlcm4sIHRydWUsIHBMb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NPdXRwdXQpOwotICAgIH0gZWxzZSBpZiAoZUNhdGVnb3J5ID09IEZYX0RBVEVUSU1FVFlQRV9UaW1lICYmCi0gICAgICAgICAgICAgICBGWF9UaW1lRnJvbUNhbm9uaWNhbCh3c1NyY0RhdGVUaW1lLkFzU3RyaW5nQygpLCBkdCwgcExvY2FsZSkpIHsKLSAgICAgIHJldHVybiBGWF9Gb3JtYXREYXRlVGltZShkdCwgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybiwgdHJ1ZSwgcExvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIENGWF9XaWRlU3RyaW5nIHdzU3JjRGF0ZSh3c1NyY0RhdGVUaW1lLmNfc3RyKCksIGlUKTsKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd3NTcmNUaW1lKHdzU3JjRGF0ZVRpbWUuY19zdHIoKSArIGlUICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzU3JjRGF0ZVRpbWUuR2V0TGVuZ3RoKCkgLSBpVCAtIDEpOwotICAgIGlmICh3c1NyY0RhdGUuSXNFbXB0eSgpIHx8IHdzU3JjVGltZS5Jc0VtcHR5KCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKEZYX0RhdGVGcm9tQ2Fub25pY2FsKHdzU3JjRGF0ZSwgZHQpICYmCi0gICAgICAgIEZYX1RpbWVGcm9tQ2Fub25pY2FsKHdzU3JjVGltZSwgZHQsIHBMb2NhbGUpKSB7Ci0gICAgICByZXR1cm4gRlhfRm9ybWF0RGF0ZVRpbWUoZHQsIHdzRGF0ZVBhdHRlcm4sIHdzVGltZVBhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNhdGVnb3J5ICE9IEZYX0RBVEVUSU1FVFlQRV9UaW1lRGF0ZSwgcExvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c091dHB1dCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLWJvb2wgQ0ZYX0Zvcm1hdFN0cmluZzo6Rm9ybWF0RGF0ZVRpbWUoY29uc3QgQ0ZYX1VuaXRpbWUmIGR0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpIHsKLSAgaWYgKHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlUGF0dGVybiwgd3NUaW1lUGF0dGVybjsKLSAgSUZYX0xvY2FsZSogcExvY2FsZSA9IG51bGxwdHI7Ci0gIEZYX0RBVEVUSU1FVFlQRSBlQ2F0ZWdvcnkgPQotICAgICAgR2V0RGF0ZVRpbWVGb3JtYXQod3NQYXR0ZXJuLCBwTG9jYWxlLCB3c0RhdGVQYXR0ZXJuLCB3c1RpbWVQYXR0ZXJuKTsKLSAgaWYgKCFwTG9jYWxlKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBGWF9Gb3JtYXREYXRlVGltZShkdCwgd3NQYXR0ZXJuLCB3c1RpbWVQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZUNhdGVnb3J5ICE9IEZYX0RBVEVUSU1FVFlQRV9UaW1lRGF0ZSwgcExvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzT3V0cHV0KTsKLX0KLWJvb2wgQ0ZYX0Zvcm1hdFN0cmluZzo6Rm9ybWF0WmVybyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgewotICBpZiAod3NQYXR0ZXJuLklzRW1wdHkoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBDRlhfV2lkZVN0cmluZyB3c1RleHRGb3JtYXQ7Ci0gIEdldFRleHRGb3JtYXQod3NQYXR0ZXJuLCBMInplcm8iLCB3c1RleHRGb3JtYXQpOwotICBpbnQzMl90IGlQYXR0ZXJuID0gMDsKLSAgY29uc3QgRlhfV0NIQVIqIHBTdHJQYXR0ZXJuID0gd3NUZXh0Rm9ybWF0LmNfc3RyKCk7Ci0gIGludDMyX3QgaUxlblBhdHRlcm4gPSB3c1RleHRGb3JtYXQuR2V0TGVuZ3RoKCk7Ci0gIHdoaWxlIChpUGF0dGVybiA8IGlMZW5QYXR0ZXJuKSB7Ci0gICAgaWYgKHBTdHJQYXR0ZXJuW2lQYXR0ZXJuXSA9PSAnXCcnKSB7Ci0gICAgICB3c091dHB1dCArPSBGWF9HZXRMaXRlcmFsVGV4dChwU3RyUGF0dGVybiwgaVBhdHRlcm4sIGlMZW5QYXR0ZXJuKTsKLSAgICAgIGlQYXR0ZXJuKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9IGVsc2UgewotICAgICAgd3NPdXRwdXQgKz0gcFN0clBhdHRlcm5baVBhdHRlcm4rK107Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci1ib29sIENGWF9Gb3JtYXRTdHJpbmc6OkZvcm1hdE51bGwoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpIHsKLSAgaWYgKHdzUGF0dGVybi5Jc0VtcHR5KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0Rm9ybWF0OwotICBHZXRUZXh0Rm9ybWF0KHdzUGF0dGVybiwgTCJudWxsIiwgd3NUZXh0Rm9ybWF0KTsKLSAgaW50MzJfdCBpUGF0dGVybiA9IDA7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwU3RyUGF0dGVybiA9IHdzVGV4dEZvcm1hdC5jX3N0cigpOwotICBpbnQzMl90IGlMZW5QYXR0ZXJuID0gd3NUZXh0Rm9ybWF0LkdldExlbmd0aCgpOwotICB3aGlsZSAoaVBhdHRlcm4gPCBpTGVuUGF0dGVybikgewotICAgIGlmIChwU3RyUGF0dGVybltpUGF0dGVybl0gPT0gJ1wnJykgewotICAgICAgd3NPdXRwdXQgKz0gRlhfR2V0TGl0ZXJhbFRleHQocFN0clBhdHRlcm4sIGlQYXR0ZXJuLCBpTGVuUGF0dGVybik7Ci0gICAgICBpUGF0dGVybisrOwotICAgICAgY29udGludWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHdzT3V0cHV0ICs9IHBTdHJQYXR0ZXJuW2lQYXR0ZXJuKytdOwotICAgICAgY29udGludWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotSUZYX0xvY2FsZSogQ0ZYX0Zvcm1hdFN0cmluZzo6R2V0UGF0dGVybkxvY2FsZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NMb2NhbGUpIHsKLSAgcmV0dXJuIG1fcExvY2FsZU1nci0+R2V0TG9jYWxlQnlOYW1lKHdzTG9jYWxlKTsKLX0KLSNkZWZpbmUgRlhNQVRIX0RFQ0lNQUxfU0NBTEVMSU1JVCAweDFjCi0jZGVmaW5lIEZYTUFUSF9ERUNJTUFMX05FR01BU0sgKDB4ODAwMDAwMDBMKQotI2RlZmluZSBGWE1BVEhfREVDSU1BTF9GT1JDRUJPT0woeCkgKCEoISh4KSkpCi0jZGVmaW5lIEZYTUFUSF9ERUNJTUFMX01BS0VGTEFHUyhORUcsIFNDQUxFKSBcCi0gICgoKFNDQUxFKSA8PCAweDEwKSB8ICgoTkVHKSA/IEZYTUFUSF9ERUNJTUFMX05FR01BU0sgOiAwKSkKLSNkZWZpbmUgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKEZMQUdTKSBcCi0gIEZYTUFUSF9ERUNJTUFMX0ZPUkNFQk9PTCgoRkxBR1MpJkZYTUFUSF9ERUNJTUFMX05FR01BU0spCi0jZGVmaW5lIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKEZMQUdTKSBcCi0gICgodWludDhfdCkoKChGTEFHUykgJiB+RlhNQVRIX0RFQ0lNQUxfTkVHTUFTSykgPj4gMHgxMCkpCi0jZGVmaW5lIEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKHgpICgoeCkgPj4gMHgxMCA+PiAweDEwKQotI2RlZmluZSBGWE1BVEhfREVDSU1BTF9MU0hJRlQzMkJJVCh4KSAoKHgpIDw8IDB4MTAgPDwgMHgxMCkKLXN0YXRpYyBpbmxpbmUgdWludDhfdCBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfZGl2MTAodWludDY0X3QmIHBoaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QmIHBtaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90JiBwbG8pIHsKLSAgdWludDhfdCByZXRWYWw7Ci0gIHBtaWQgKz0gRlhNQVRIX0RFQ0lNQUxfTFNISUZUMzJCSVQocGhpICUgMHhBKTsKLSAgcGhpIC89IDB4QTsKLSAgcGxvICs9IEZYTUFUSF9ERUNJTUFMX0xTSElGVDMyQklUKHBtaWQgJSAweEEpOwotICBwbWlkIC89IDB4QTsKLSAgcmV0VmFsID0gcGxvICUgMHhBOwotICBwbG8gLz0gMHhBOwotICByZXR1cm4gcmV0VmFsOwotfQotc3RhdGljIGlubGluZSB1aW50OF90IGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9kaXYxMF9hbnkodWludDY0X3QgbnVtc1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBudW1jb3VudCkgewotICB1aW50OF90IHJldFZhbCA9IDA7Ci0gIGZvciAoaW50IGkgPSBudW1jb3VudCAtIDE7IGkgPiAwOyBpLS0pIHsKLSAgICBudW1zW2kgLSAxXSArPSBGWE1BVEhfREVDSU1BTF9MU0hJRlQzMkJJVChudW1zW2ldICUgMHhBKTsKLSAgICBudW1zW2ldIC89IDB4QTsKLSAgfQotICBpZiAobnVtY291bnQpIHsKLSAgICByZXRWYWwgPSBudW1zWzBdICUgMHhBOwotICAgIG51bXNbMF0gLz0gMHhBOwotICB9Ci0gIHJldHVybiByZXRWYWw7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX211bDEwKHVpbnQ2NF90JiBwaGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90JiBwbWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCYgcGxvKSB7Ci0gIHBsbyAqPSAweEE7Ci0gIHBtaWQgPSBwbWlkICogMHhBICsgRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQocGxvKTsKLSAgcGxvID0gKHVpbnQzMl90KXBsbzsKLSAgcGhpID0gcGhpICogMHhBICsgRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQocG1pZCk7Ci0gIHBtaWQgPSAodWludDMyX3QpcG1pZDsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbXVsMTBfYW55KHVpbnQ2NF90IG51bXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbnVtY291bnQpIHsKLSAgbnVtc1swXSAqPSAweEE7Ci0gIGZvciAoaW50IGkgPSAxOyBpIDwgbnVtY291bnQ7IGkrKykgewotICAgIG51bXNbaV0gPSBudW1zW2ldICogMHhBICsgRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQobnVtc1tpIC0gMV0pOwotICAgIG51bXNbaSAtIDFdID0gKHVpbnQzMl90KW51bXNbaSAtIDFdOwotICB9Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX25vcm1hbGl6ZSh1aW50NjRfdCYgcGhpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QmIHBtaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCYgcGxvKSB7Ci0gIHBoaSArPSBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVChwbWlkKTsKLSAgcG1pZCA9ICh1aW50MzJfdClwbWlkOwotICBwbWlkICs9IEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKHBsbyk7Ci0gIHBsbyA9ICh1aW50MzJfdClwbG87Ci0gIHBoaSArPSBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVChwbWlkKTsKLSAgcG1pZCA9ICh1aW50MzJfdClwbWlkOwotfQotc3RhdGljIGlubGluZSB2b2lkIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9ub3JtYWxpemVfYW55KHVpbnQ2NF90IG51bXNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGxlbikgewotICB7Ci0gICAgZm9yIChpbnQgaSA9IGxlbiAtIDI7IGkgPiAwOyBpLS0pIHsKLSAgICAgIG51bXNbaSArIDFdICs9IEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKG51bXNbaV0pOwotICAgICAgbnVtc1tpXSA9ICh1aW50MzJfdCludW1zW2ldOwotICAgIH0KLSAgfQotICB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW4gLSAxOyBpKyspIHsKLSAgICAgIG51bXNbaSArIDFdICs9IEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKG51bXNbaV0pOwotICAgICAgbnVtc1tpXSA9ICh1aW50MzJfdCludW1zW2ldOwotICAgIH0KLSAgfQotfQotc3RhdGljIGlubGluZSBpbnQ4X3QgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Jhd19jb21wYXJlKHVpbnQzMl90IGhpMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtaWQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxvMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoaTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbWlkMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsbzIpIHsKLSAgaW50OF90IHJldFZhbCA9IDA7Ci0gIGlmICghcmV0VmFsKSB7Ci0gICAgcmV0VmFsICs9IChoaTEgPiBoaTIgPyAxIDogKGhpMSA8IGhpMiA/IC0xIDogMCkpOwotICB9Ci0gIGlmICghcmV0VmFsKSB7Ci0gICAgcmV0VmFsICs9IChtaWQxID4gbWlkMiA/IDEgOiAobWlkMSA8IG1pZDIgPyAtMSA6IDApKTsKLSAgfQotICBpZiAoIXJldFZhbCkgewotICAgIHJldFZhbCArPSAobG8xID4gbG8yID8gMSA6IChsbzEgPCBsbzIgPyAtMSA6IDApKTsKLSAgfQotICByZXR1cm4gcmV0VmFsOwotfQotc3RhdGljIGlubGluZSBpbnQ4X3QgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Jhd19jb21wYXJlX2FueSh1aW50NjRfdCBhW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBibCkgewotICBpbnQ4X3QgcmV0VmFsID0gMDsKLSAgZm9yIChpbnQgaSA9IHN0ZDo6bWF4KGFsIC0gMSwgYmwgLSAxKTsgaSA+PSAwOyBpLS0pIHsKLSAgICB1aW50NjRfdCBsID0gKGkgPj0gYWwgPyAwIDogYVtpXSksIHIgPSAoaSA+PSBibCA/IDAgOiBiW2ldKTsKLSAgICByZXRWYWwgKz0gKGwgPiByID8gMSA6IChsIDwgciA/IC0xIDogMCkpOwotICAgIGlmIChyZXRWYWwpIHsKLSAgICAgIHJldHVybiByZXRWYWw7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXRWYWw7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX2RlY19hbnkodWludDY0X3QgYVtdLCB1aW50OF90IGFsKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgYWw7IGkrKykgewotICAgIGlmIChhW2ldLS0pIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfaW5jX2FueSh1aW50NjRfdCBhW10sIHVpbnQ4X3QgYWwpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbDsgaSsrKSB7Ci0gICAgYVtpXSsrOwotICAgIGlmICgodWludDMyX3QpYVtpXSA9PSBhW2ldKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGFbaV0gPSAwOwotICB9Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Jhd19tdWwodWludDY0X3QgYVtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgY1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2wpIHsKLSAgQVNTRVJUKGFsICsgYmwgPD0gY2wpOwotICB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbDsgaSsrKSB7Ci0gICAgICBjW2ldID0gMDsKLSAgICB9Ci0gIH0KLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWw7IGkrKykgewotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBibDsgaisrKSB7Ci0gICAgICAgIHVpbnQ2NF90IG0gPSAodWludDY0X3QpYVtpXSAqIGJbal07Ci0gICAgICAgIGNbaSArIGpdICs9ICh1aW50MzJfdCltOwotICAgICAgICBjW2kgKyBqICsgMV0gKz0gRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQobSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNsIC0gMTsgaSsrKSB7Ci0gICAgICBjW2kgKyAxXSArPSBGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVChjW2ldKTsKLSAgICAgIGNbaV0gPSAodWludDMyX3QpY1tpXTsKLSAgICB9Ci0gIH0KLSAgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2w7IGkrKykgewotICAgICAgY1tpXSA9ICh1aW50MzJfdCljW2ldOwotICAgIH0KLSAgfQotfQotc3RhdGljIGlubGluZSB2b2lkIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9yYXdfZGl2KHVpbnQ2NF90IGFbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGNbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGNsKSB7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgY2w7IGkrKykgewotICAgIGNbaV0gPSAwOwotICB9Ci0gIHVpbnQ2NF90IGxlZnRbMTZdID0gezB9LCByaWdodFsxNl0gPSB7MH07Ci0gIGxlZnRbMF0gPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgYWw7IGkrKykgewotICAgIHJpZ2h0W2ldID0gYVtpXTsKLSAgfQotICB1aW50NjRfdCB0bXBbMTZdOwotICB3aGlsZSAoZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Jhd19jb21wYXJlX2FueShsZWZ0LCBhbCwgcmlnaHQsIGFsKSA8PSAwKSB7Ci0gICAgdWludDY0X3QgY3VyWzE2XTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgYWw7IGkrKykgewotICAgICAgY3VyW2ldID0gbGVmdFtpXSArIHJpZ2h0W2ldOwotICAgIH0KLSAgICBmb3IgKGkgPSBhbCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICBpZiAoaSkgewotICAgICAgICBjdXJbaSAtIDFdICs9IEZYTUFUSF9ERUNJTUFMX0xTSElGVDMyQklUKGN1cltpXSAlIDIpOwotICAgICAgfQotICAgICAgY3VyW2ldIC89IDI7Ci0gICAgfQotICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9yYXdfbXVsKGN1ciwgYWwsIGIsIGJsLCB0bXAsIDE2KTsKLSAgICBzd2l0Y2ggKGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9yYXdfY29tcGFyZV9hbnkodG1wLCAxNiwgYSwgYWwpKSB7Ci0gICAgICBjYXNlIC0xOgotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgICAgICAgIGxlZnRbaV0gPSBjdXJbaV07Ci0gICAgICAgIH0KLSAgICAgICAgbGVmdFswXSsrOwotICAgICAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbm9ybWFsaXplX2FueShsZWZ0LCBhbCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxOgotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgICAgICAgIHJpZ2h0W2ldID0gY3VyW2ldOwotICAgICAgICB9Ci0gICAgICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9kZWNfYW55KHJpZ2h0LCBhbCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAwOgotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RkOjptaW4oYWwsIGNsKTsgaSsrKSB7Ci0gICAgICAgICAgY1tpXSA9IGN1cltpXTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBzdGQ6Om1pbihhbCwgY2wpOyBpKyspIHsKLSAgICBjW2ldID0gbGVmdFtpXTsKLSAgfQotfQotc3RhdGljIGlubGluZSBib29sIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9vdXRvZnJhbmdlKHVpbnQ2NF90IGFbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZ29hbCkgewotICBmb3IgKGludCBpID0gZ29hbDsgaSA8IGFsOyBpKyspIHsKLSAgICBpZiAoYVtpXSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfc2hyaW5raW50b3JhbmdlKHVpbnQ2NF90IGFbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGdvYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90JiBzY2FsZSkgewotICBib29sIGJSb3VuZFVwID0gZmFsc2U7Ci0gIHdoaWxlIChzY2FsZSAhPSAwICYmIChzY2FsZSA+IEZYTUFUSF9ERUNJTUFMX1NDQUxFTElNSVQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9vdXRvZnJhbmdlKGEsIGFsLCBnb2FsKSkpIHsKLSAgICBiUm91bmRVcCA9IGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9kaXYxMF9hbnkoYSwgYWwpID49IDU7Ci0gICAgc2NhbGUtLTsKLSAgfQotICBpZiAoYlJvdW5kVXApIHsKLSAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbm9ybWFsaXplX2FueShhLCBnb2FsKTsKLSAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfaW5jX2FueShhLCBnb2FsKTsKLSAgfQotfQotc3RhdGljIGlubGluZSB2b2lkIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl90cnVuY2F0ZSh1aW50NjRfdCYgcGhpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCYgcG1pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QmIHBsbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCYgc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgbWluc2NhbGUgPSAwKSB7Ci0gIHdoaWxlIChzY2FsZSA+IG1pbnNjYWxlKSB7Ci0gICAgdWludDY0X3QgdGhpID0gcGhpLCB0bWlkID0gcG1pZCwgdGxvID0gcGxvOwotICAgIGlmIChmeG1hdGhfZGVjaW1hbF9oZWxwZXJfZGl2MTAodGhpLCB0bWlkLCB0bG8pICE9IDApIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBwaGkgPSB0aGksIHBtaWQgPSB0bWlkLCBwbG8gPSB0bG87Ci0gICAgc2NhbGUtLTsKLSAgfQotfQotQ0ZYX0RlY2ltYWw6OkNGWF9EZWNpbWFsKCkgewotICBtX3VMbyA9IG1fdU1pZCA9IG1fdUhpID0gbV91RmxhZ3MgPSAwOwotfQotQ0ZYX0RlY2ltYWw6OkNGWF9EZWNpbWFsKHVpbnQ2NF90IHZhbCkgewotICBtX3VMbyA9ICh1aW50MzJfdCl2YWw7Ci0gIG1fdU1pZCA9ICh1aW50MzJfdClGWE1BVEhfREVDSU1BTF9SU0hJRlQzMkJJVCh2YWwpOwotICBtX3VIaSA9IDA7Ci0gIG1fdUZsYWdzID0gMDsKLX0KLUNGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbCh1aW50MzJfdCB2YWwpIHsKLSAgbV91TG8gPSAodWludDMyX3QpdmFsOwotICBtX3VNaWQgPSBtX3VIaSA9IDA7Ci0gIG1fdUZsYWdzID0gMDsKLX0KLUNGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbCh1aW50MzJfdCBsbywKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzY2FsZSkgewotICBzY2FsZSA9IChzY2FsZSA+IEZYTUFUSF9ERUNJTUFMX1NDQUxFTElNSVQgPyAwIDogc2NhbGUpOwotICBtX3VMbyA9IGxvOwotICBtX3VNaWQgPSBtaWQ7Ci0gIG1fdUhpID0gaGk7Ci0gIG1fdUZsYWdzID0gRlhNQVRIX0RFQ0lNQUxfTUFLRUZMQUdTKG5lZyAmJiBJc05vdFplcm8oKSwgc2NhbGUpOwotfQotQ0ZYX0RlY2ltYWw6OkNGWF9EZWNpbWFsKGludDMyX3QgdmFsKSB7Ci0gIGlmICh2YWwgPj0gMCkgewotICAgICp0aGlzID0gQ0ZYX0RlY2ltYWwoKHVpbnQzMl90KXZhbCk7Ci0gIH0gZWxzZSB7Ci0gICAgKnRoaXMgPSBDRlhfRGVjaW1hbCgodWludDMyX3QpLXZhbCk7Ci0gICAgU2V0TmVnYXRlKCk7Ci0gIH0KLX0KLUNGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbChpbnQ2NF90IHZhbCkgewotICBpZiAodmFsID49IDApIHsKLSAgICAqdGhpcyA9IENGWF9EZWNpbWFsKCh1aW50NjRfdCl2YWwpOwotICB9IGVsc2UgewotICAgICp0aGlzID0gQ0ZYX0RlY2ltYWwoKHVpbnQ2NF90KS12YWwpOwotICAgIFNldE5lZ2F0ZSgpOwotICB9Ci19Ci1DRlhfRGVjaW1hbDo6Q0ZYX0RlY2ltYWwoRlhfRkxPQVQgdmFsLCB1aW50OF90IHNjYWxlKSB7Ci0gIEZYX0ZMT0FUIG5ld3ZhbCA9IGZhYnModmFsKTsKLSAgdWludDY0X3QgcGhpLCBwbWlkLCBwbG87Ci0gIHBsbyA9ICh1aW50NjRfdCluZXd2YWw7Ci0gIHBtaWQgPSAodWludDY0X3QpKG5ld3ZhbCAvIDFlMzIpOwotICBwaGkgPSAodWludDY0X3QpKG5ld3ZhbCAvIDFlNjQpOwotICBuZXd2YWwgPSBGWFNZU19mbW9kKG5ld3ZhbCwgMS4wZik7Ci0gIGZvciAodWludDhfdCBpdGVyID0gMDsgaXRlciA8IHNjYWxlOyBpdGVyKyspIHsKLSAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbXVsMTAocGhpLCBwbWlkLCBwbG8pOwotICAgIG5ld3ZhbCAqPSAxMDsKLSAgICBwbG8gKz0gKHVpbnQ2NF90KW5ld3ZhbDsKLSAgICBuZXd2YWwgPSBGWFNZU19mbW9kKG5ld3ZhbCwgMS4wZik7Ci0gIH0KLSAgcGxvICs9IEZYU1lTX3JvdW5kKG5ld3ZhbCk7Ci0gIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9ub3JtYWxpemUocGhpLCBwbWlkLCBwbG8pOwotICBtX3VIaSA9ICh1aW50MzJfdClwaGk7Ci0gIG1fdU1pZCA9ICh1aW50MzJfdClwbWlkOwotICBtX3VMbyA9ICh1aW50MzJfdClwbG87Ci0gIG1fdUZsYWdzID0gRlhNQVRIX0RFQ0lNQUxfTUFLRUZMQUdTKHZhbCA8IDAgJiYgSXNOb3RaZXJvKCksIHNjYWxlKTsKLX0KLUNGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0ck9iaikgewotICBjb25zdCBGWF9XQ0hBUiogc3RyID0gc3RyT2JqLmNfc3RyKCk7Ci0gIGNvbnN0IEZYX1dDSEFSKiBzdHJCb3VuZCA9IHN0ciArIHN0ck9iai5HZXRMZW5ndGgoKTsKLSAgYm9vbCBwb2ludG1ldCA9IDA7Ci0gIGJvb2wgbmVnbWV0ID0gMDsKLSAgdWludDhfdCBzY2FsZSA9IDA7Ci0gIG1fdUhpID0gbV91TWlkID0gbV91TG8gPSAwOwotICB3aGlsZSAoc3RyICE9IHN0ckJvdW5kICYmICpzdHIgPT0gJyAnKSB7Ci0gICAgc3RyKys7Ci0gIH0KLSAgaWYgKHN0ciAhPSBzdHJCb3VuZCAmJiAqc3RyID09ICctJykgewotICAgIG5lZ21ldCA9IDE7Ci0gICAgc3RyKys7Ci0gIH0gZWxzZSBpZiAoc3RyICE9IHN0ckJvdW5kICYmICpzdHIgPT0gJysnKSB7Ci0gICAgc3RyKys7Ci0gIH0KLSAgd2hpbGUgKHN0ciAhPSBzdHJCb3VuZCAmJiAoKCpzdHIgPj0gJzAnICYmICpzdHIgPD0gJzknKSB8fCAqc3RyID09ICcuJykgJiYKLSAgICAgICAgIHNjYWxlIDwgRlhNQVRIX0RFQ0lNQUxfU0NBTEVMSU1JVCkgewotICAgIGlmICgqc3RyID09ICcuJykgewotICAgICAgaWYgKHBvaW50bWV0KSB7Ci0gICAgICAgIGdvdG8gY29udDsKLSAgICAgIH0KLSAgICAgIHBvaW50bWV0ID0gMTsKLSAgICB9IGVsc2UgewotICAgICAgbV91SGkgPSBtX3VIaSAqIDB4QSArIEZYTUFUSF9ERUNJTUFMX1JTSElGVDMyQklUKCh1aW50NjRfdCltX3VNaWQgKiAweEEpOwotICAgICAgbV91TWlkID0gbV91TWlkICogMHhBICsgRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQoKHVpbnQ2NF90KW1fdUxvICogMHhBKTsKLSAgICAgIG1fdUxvID0gbV91TG8gKiAweEEgKyAoKnN0ciAtICcwJyk7Ci0gICAgICBpZiAocG9pbnRtZXQpIHsKLSAgICAgICAgc2NhbGUrKzsKLSAgICAgIH0KLSAgICB9Ci0gIGNvbnQ6Ci0gICAgc3RyKys7Ci0gIH0KLSAgbV91RmxhZ3MgPSBGWE1BVEhfREVDSU1BTF9NQUtFRkxBR1MobmVnbWV0ICYmIElzTm90WmVybygpLCBzY2FsZSk7Ci19Ci0KLUNGWF9EZWNpbWFsOjpDRlhfRGVjaW1hbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0ck9iaikgewotICAqdGhpcyA9IENGWF9EZWNpbWFsKENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3RyT2JqKS5Bc1N0cmluZ0MoKSk7Ci19Ci0KLUNGWF9EZWNpbWFsOjpvcGVyYXRvciBDRlhfV2lkZVN0cmluZygpIGNvbnN0IHsKLSAgQ0ZYX1dpZGVTdHJpbmcgcmV0U3RyaW5nOwotICBDRlhfV2lkZVN0cmluZyB0bXBidWY7Ci0gIHVpbnQ2NF90IHBoaSA9IG1fdUhpLCBwbWlkID0gbV91TWlkLCBwbG8gPSBtX3VMbzsKLSAgd2hpbGUgKHBoaSB8fCBwbWlkIHx8IHBsbykgewotICAgIHRtcGJ1ZiArPSBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfZGl2MTAocGhpLCBwbWlkLCBwbG8pICsgJzAnOwotICB9Ci0gIHVpbnQ4X3Qgb3V0cHV0bGVuID0gKHVpbnQ4X3QpdG1wYnVmLkdldExlbmd0aCgpOwotICB1aW50OF90IHNjYWxlID0gKHVpbnQ4X3QpRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobV91RmxhZ3MpOwotICB3aGlsZSAoc2NhbGUgPj0gb3V0cHV0bGVuKSB7Ci0gICAgdG1wYnVmICs9ICcwJzsKLSAgICBvdXRwdXRsZW4rKzsKLSAgfQotICBpZiAoRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKG1fdUZsYWdzKSAmJiBJc05vdFplcm8oKSkgewotICAgIHJldFN0cmluZyArPSAnLSc7Ci0gIH0KLSAgZm9yICh1aW50OF90IGlkeCA9IDA7IGlkeCA8IG91dHB1dGxlbjsgaWR4KyspIHsKLSAgICBpZiAoaWR4ID09IChvdXRwdXRsZW4gLSBzY2FsZSkgJiYgc2NhbGUgIT0gMCkgewotICAgICAgcmV0U3RyaW5nICs9ICcuJzsKLSAgICB9Ci0gICAgcmV0U3RyaW5nICs9IHRtcGJ1ZltvdXRwdXRsZW4gLSAxIC0gaWR4XTsKLSAgfQotICByZXR1cm4gcmV0U3RyaW5nOwotfQotQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yIGRvdWJsZSgpIGNvbnN0IHsKLSAgZG91YmxlIHBvdyA9IChkb3VibGUpKDEgPDwgMTYpICogKDEgPDwgMTYpOwotICBkb3VibGUgYmFzZSA9Ci0gICAgICAoKGRvdWJsZSltX3VIaSkgKiBwb3cgKiBwb3cgKyAoKGRvdWJsZSltX3VNaWQpICogcG93ICsgKChkb3VibGUpbV91TG8pOwotICBpbnQ4X3Qgc2NhbGUgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShtX3VGbGFncyk7Ci0gIGJvb2wgYk5lZyA9IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhtX3VGbGFncyk7Ci0gIHJldHVybiAoYk5lZyA/IC0xIDogMSkgKiBiYXNlICogOjpwb3coMTAuMCwgLXNjYWxlKTsKLX0KLXZvaWQgQ0ZYX0RlY2ltYWw6OlNldFNjYWxlKHVpbnQ4X3QgbmV3c2NhbGUpIHsKLSAgdWludDhfdCBvbGRzY2FsZSA9IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKG1fdUZsYWdzKTsKLSAgaWYgKG5ld3NjYWxlID4gb2xkc2NhbGUpIHsKLSAgICB1aW50NjRfdCBwaGkgPSBtX3VIaSwgcG1pZCA9IG1fdU1pZCwgcGxvID0gbV91TG87Ci0gICAgZm9yICh1aW50OF90IGl0ZXIgPSAwOyBpdGVyIDwgbmV3c2NhbGUgLSBvbGRzY2FsZTsgaXRlcisrKSB7Ci0gICAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbXVsMTAocGhpLCBwbWlkLCBwbG8pOwotICAgIH0KLSAgICBtX3VIaSA9ICh1aW50MzJfdClwaGk7Ci0gICAgbV91TWlkID0gKHVpbnQzMl90KXBtaWQ7Ci0gICAgbV91TG8gPSAodWludDMyX3QpcGxvOwotICAgIG1fdUZsYWdzID0gRlhNQVRIX0RFQ0lNQUxfTUFLRUZMQUdTKAotICAgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpICYmIElzTm90WmVybygpLCBuZXdzY2FsZSk7Ci0gIH0gZWxzZSBpZiAobmV3c2NhbGUgPCBvbGRzY2FsZSkgewotICAgIHVpbnQ2NF90IHBoaSwgcG1pZCwgcGxvOwotICAgIHBoaSA9IDAsIHBtaWQgPSAwLCBwbG8gPSA1OwotICAgIHsKLSAgICAgIGZvciAodWludDhfdCBpdGVyID0gMDsgaXRlciA8IG9sZHNjYWxlIC0gbmV3c2NhbGUgLSAxOyBpdGVyKyspIHsKLSAgICAgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX211bDEwKHBoaSwgcG1pZCwgcGxvKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcGhpICs9IG1fdUhpOwotICAgIHBtaWQgKz0gbV91TWlkOwotICAgIHBsbyArPSBtX3VMbzsKLSAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbm9ybWFsaXplKHBoaSwgcG1pZCwgcGxvKTsKLSAgICB7Ci0gICAgICBmb3IgKHVpbnQ4X3QgaXRlciA9IDA7IGl0ZXIgPCBvbGRzY2FsZSAtIG5ld3NjYWxlOyBpdGVyKyspIHsKLSAgICAgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX2RpdjEwKHBoaSwgcG1pZCwgcGxvKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgbV91SGkgPSAodWludDMyX3QpcGhpOwotICAgIG1fdU1pZCA9ICh1aW50MzJfdClwbWlkOwotICAgIG1fdUxvID0gKHVpbnQzMl90KXBsbzsKLSAgICBtX3VGbGFncyA9IEZYTUFUSF9ERUNJTUFMX01BS0VGTEFHUygKLSAgICAgICAgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKG1fdUZsYWdzKSAmJiBJc05vdFplcm8oKSwgbmV3c2NhbGUpOwotICB9Ci19Ci11aW50OF90IENGWF9EZWNpbWFsOjpHZXRTY2FsZSgpIHsKLSAgdWludDhfdCBvbGRzY2FsZSA9IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKG1fdUZsYWdzKTsKLSAgcmV0dXJuIG9sZHNjYWxlOwotfQotdm9pZCBDRlhfRGVjaW1hbDo6U2V0QWJzKCkgewotICBtX3VGbGFncyAmPSB+RlhNQVRIX0RFQ0lNQUxfTkVHTUFTSzsKLX0KLXZvaWQgQ0ZYX0RlY2ltYWw6OlNldE5lZ2F0ZSgpIHsKLSAgaWYgKElzTm90WmVybygpKSB7Ci0gICAgbV91RmxhZ3MgXj0gRlhNQVRIX0RFQ0lNQUxfTkVHTUFTSzsKLSAgfQotfQotdm9pZCBDRlhfRGVjaW1hbDo6Rmxvb3JPckNlaWwoYm9vbCBiRmxvb3IpIHsKLSAgdWludDY0X3QgbnVtc1szXSA9IHttX3VMbywgbV91TWlkLCBtX3VIaX07Ci0gIGJvb2wgYkRhdGFMb3NzID0gZmFsc2U7Ci0gIGZvciAoaW50IGkgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShtX3VGbGFncyk7IGkgPiAwOyBpLS0pIHsKLSAgICBiRGF0YUxvc3MgPSBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfZGl2MTBfYW55KG51bXMsIDMpIHx8IGJEYXRhTG9zczsKLSAgfQotICBpZiAoYkRhdGFMb3NzICYmIChiRmxvb3IgPyBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6ICFGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpKSkgewotICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9pbmNfYW55KG51bXMsIDMpOwotICB9Ci0gIG1fdUhpID0gKHVpbnQzMl90KW51bXNbMl07Ci0gIG1fdU1pZCA9ICh1aW50MzJfdCludW1zWzFdOwotICBtX3VMbyA9ICh1aW50MzJfdCludW1zWzBdOwotICBtX3VGbGFncyA9IEZYTUFUSF9ERUNJTUFMX01BS0VGTEFHUygKLSAgICAgIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMk5FRyhtX3VGbGFncykgJiYgSXNOb3RaZXJvKCksIDApOwotfQotdm9pZCBDRlhfRGVjaW1hbDo6U2V0Rmxvb3IoKSB7Ci0gIEZsb29yT3JDZWlsKHRydWUpOwotfQotdm9pZCBDRlhfRGVjaW1hbDo6U2V0Q2VpbGluZygpIHsKLSAgRmxvb3JPckNlaWwoZmFsc2UpOwotfQotdm9pZCBDRlhfRGVjaW1hbDo6U2V0VHJ1bmNhdGUoKSB7Ci0gIEZsb29yT3JDZWlsKCFGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpKTsKLX0KLXZvaWQgQ0ZYX0RlY2ltYWw6OlN3YXAoQ0ZYX0RlY2ltYWwmIHZhbCkgewotICB1aW50MzJfdCB0bXA7Ci0gIHRtcCA9IG1fdUhpOwotICBtX3VIaSA9IHZhbC5tX3VIaTsKLSAgdmFsLm1fdUhpID0gdG1wOwotICB0bXAgPSBtX3VNaWQ7Ci0gIG1fdU1pZCA9IHZhbC5tX3VNaWQ7Ci0gIHZhbC5tX3VNaWQgPSB0bXA7Ci0gIHRtcCA9IG1fdUxvOwotICBtX3VMbyA9IHZhbC5tX3VMbzsKLSAgdmFsLm1fdUxvID0gdG1wOwotICB0bXAgPSBtX3VGbGFnczsKLSAgbV91RmxhZ3MgPSB2YWwubV91RmxhZ3M7Ci0gIHZhbC5tX3VGbGFncyA9IHRtcDsKLX0KLWludDhfdCBDRlhfRGVjaW1hbDo6Q29tcGFyZShjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdCB7Ci0gIENGWF9EZWNpbWFsIGxocyA9ICp0aGlzLCByaHMgPSB2YWw7Ci0gIGludDhfdCByZXRWYWwgPSAwOwotICBpZiAoRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobGhzLm1fdUZsYWdzKSAhPQotICAgICAgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUocmhzLm1fdUZsYWdzKSkgewotICAgIHVpbnQ4X3Qgc2NhbGUgPSBzdGQ6Om1pbihGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShsaHMubV91RmxhZ3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShyaHMubV91RmxhZ3MpKTsKLSAgICBsaHMuU2V0U2NhbGUoc2NhbGUpOwotICAgIHJocy5TZXRTY2FsZShzY2FsZSk7Ci0gIH0KLSAgcmV0VmFsID0gLShGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobGhzLm1fdUZsYWdzKSAtCi0gICAgICAgICAgICAgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKHJocy5tX3VGbGFncykpOwotICBpZiAocmV0VmFsKSB7Ci0gICAgcmV0dXJuIHJldFZhbDsKLSAgfQotICByZXRWYWwgPSBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfcmF3X2NvbXBhcmUobGhzLm1fdUhpLCBsaHMubV91TWlkLCBsaHMubV91TG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaHMubV91SGksIHJocy5tX3VNaWQsIHJocy5tX3VMbyk7Ci0gIHJldHVybiAoRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKGxocy5tX3VGbGFncykgPyAtcmV0VmFsIDogcmV0VmFsKTsKLX0KLUNGWF9EZWNpbWFsIENGWF9EZWNpbWFsOjpBZGRPck1pbnVzKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQWRkaW5nKSBjb25zdCB7Ci0gIENGWF9EZWNpbWFsIGxocyA9ICp0aGlzLCByaHMgPSB2YWw7Ci0gIGlmIChGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShsaHMubV91RmxhZ3MpICE9Ci0gICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShyaHMubV91RmxhZ3MpKSB7Ci0gICAgdWludDhfdCBzY2FsZSA9IHN0ZDo6bWF4KEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKGxocy5tX3VGbGFncyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKHJocy5tX3VGbGFncykpOwotICAgIGxocy5TZXRTY2FsZShzY2FsZSk7Ci0gICAgcmhzLlNldFNjYWxlKHNjYWxlKTsKLSAgfQotICBpZiAoIWlzQWRkaW5nKSB7Ci0gICAgcmhzLlNldE5lZ2F0ZSgpOwotICB9Ci0gIGlmIChGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobGhzLm1fdUZsYWdzKSA9PQotICAgICAgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKHJocy5tX3VGbGFncykpIHsKLSAgICB1aW50NjRfdCBwaGkgPSBsaHMubV91SGksIHBtaWQgPSBsaHMubV91TWlkLCBwbG8gPSBsaHMubV91TG87Ci0gICAgcGhpICs9IHJocy5tX3VIaTsKLSAgICBwbWlkICs9IHJocy5tX3VNaWQ7Ci0gICAgcGxvICs9IHJocy5tX3VMbzsKLSAgICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfbm9ybWFsaXplKHBoaSwgcG1pZCwgcGxvKTsKLSAgICBpZiAoRlhNQVRIX0RFQ0lNQUxfUlNISUZUMzJCSVQocGhpKSAmJgotICAgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShsaHMubV91RmxhZ3MpICE9IDApIHsKLSAgICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9kaXYxMChwaGksIHBtaWQsIHBsbyk7Ci0gICAgICBsaHMubV91RmxhZ3MgPSBGWE1BVEhfREVDSU1BTF9NQUtFRkxBR1MoCi0gICAgICAgICAgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKGxocy5tX3VGbGFncyksCi0gICAgICAgICAgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobGhzLm1fdUZsYWdzKSAtIDEpOwotICAgIH0KLSAgICBsaHMubV91SGkgPSAodWludDMyX3QpcGhpOwotICAgIGxocy5tX3VNaWQgPSAodWludDMyX3QpcG1pZDsKLSAgICBsaHMubV91TG8gPSAodWludDMyX3QpcGxvOwotICAgIHJldHVybiBsaHM7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9yYXdfY29tcGFyZShsaHMubV91SGksIGxocy5tX3VNaWQsIGxocy5tX3VMbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJocy5tX3VIaSwgcmhzLm1fdU1pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJocy5tX3VMbykgPCAwKSB7Ci0gICAgICBsaHMuU3dhcChyaHMpOwotICAgIH0KLSAgICBsaHMubV91SGkgLT0gcmhzLm1fdUhpOwotICAgIGlmIChsaHMubV91TWlkIDwgcmhzLm1fdU1pZCkgewotICAgICAgbGhzLm1fdUhpLS07Ci0gICAgfQotICAgIGxocy5tX3VNaWQgLT0gcmhzLm1fdU1pZDsKLSAgICBpZiAobGhzLm1fdUxvIDwgcmhzLm1fdUxvKSB7Ci0gICAgICBpZiAoIWxocy5tX3VNaWQpIHsKLSAgICAgICAgbGhzLm1fdUhpLS07Ci0gICAgICB9Ci0gICAgICBsaHMubV91TWlkLS07Ci0gICAgfQotICAgIGxocy5tX3VMbyAtPSByaHMubV91TG87Ci0gICAgcmV0dXJuIGxoczsKLSAgfQotfQotQ0ZYX0RlY2ltYWwgQ0ZYX0RlY2ltYWw6Ok11bHRpcGx5KGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0IHsKLSAgdWludDY0X3QgYVszXSA9IHttX3VMbywgbV91TWlkLCBtX3VIaX0sCi0gICAgICAgICAgIGJbM10gPSB7dmFsLm1fdUxvLCB2YWwubV91TWlkLCB2YWwubV91SGl9OwotICB1aW50NjRfdCBjWzZdOwotICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfcmF3X211bChhLCAzLCBiLCAzLCBjLCA2KTsKLSAgYm9vbCBuZWcgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcobV91RmxhZ3MpIF4KLSAgICAgICAgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJORUcodmFsLm1fdUZsYWdzKTsKLSAgdWludDhfdCBzY2FsZSA9IEZYTUFUSF9ERUNJTUFMX0ZMQUdTMlNDQUxFKG1fdUZsYWdzKSArCi0gICAgICAgICAgICAgICAgICBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRSh2YWwubV91RmxhZ3MpOwotICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfc2hyaW5raW50b3JhbmdlKGMsIDYsIDMsIHNjYWxlKTsKLSAgcmV0dXJuIENGWF9EZWNpbWFsKCh1aW50MzJfdCljWzBdLCAodWludDMyX3QpY1sxXSwgKHVpbnQzMl90KWNbMl0sIG5lZywKLSAgICAgICAgICAgICAgICAgICAgIHNjYWxlKTsKLX0KLUNGWF9EZWNpbWFsIENGWF9EZWNpbWFsOjpEaXZpZGUoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3QgewotICBpZiAoIXZhbC5Jc05vdFplcm8oKSkgewotICAgIHJldHVybiBDRlhfRGVjaW1hbCgpOwotICB9Ci0gIGJvb2wgbmVnID0gRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKG1fdUZsYWdzKSBeCi0gICAgICAgICAgICAgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyTkVHKHZhbC5tX3VGbGFncyk7Ci0gIHVpbnQ2NF90IGFbN10gPSB7bV91TG8sIG1fdU1pZCwgbV91SGl9LAotICAgICAgICAgICBiWzNdID0ge3ZhbC5tX3VMbywgdmFsLm1fdU1pZCwgdmFsLm1fdUhpfSwgY1s3XSA9IHswfTsKLSAgdWludDhfdCBzY2FsZSA9IDA7Ci0gIGlmIChGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShtX3VGbGFncykgPAotICAgICAgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUodmFsLm1fdUZsYWdzKSkgewotICAgIGZvciAoaW50IGkgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRSh2YWwubV91RmxhZ3MpIC0KLSAgICAgICAgICAgICAgICAgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUobV91RmxhZ3MpOwotICAgICAgICAgaSA+IDA7IGktLSkgewotICAgICAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX211bDEwX2FueShhLCA3KTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgc2NhbGUgPSBGWE1BVEhfREVDSU1BTF9GTEFHUzJTQ0FMRShtX3VGbGFncykgLQotICAgICAgICAgICAgRlhNQVRIX0RFQ0lNQUxfRkxBR1MyU0NBTEUodmFsLm1fdUZsYWdzKTsKLSAgfQotICB1aW50OF90IG1pbnNjYWxlID0gc2NhbGU7Ci0gIGlmICghSXNOb3RaZXJvKCkpIHsKLSAgICByZXR1cm4gQ0ZYX0RlY2ltYWwoMCwgMCwgMCwgMCwgbWluc2NhbGUpOwotICB9Ci0gIHdoaWxlICghYVs2XSkgewotICAgIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl9tdWwxMF9hbnkoYSwgNyk7Ci0gICAgc2NhbGUrKzsKLSAgfQotICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfZGl2MTBfYW55KGEsIDcpOwotICBzY2FsZS0tOwotICBmeG1hdGhfZGVjaW1hbF9oZWxwZXJfcmF3X2RpdihhLCA2LCBiLCAzLCBjLCA3KTsKLSAgZnhtYXRoX2RlY2ltYWxfaGVscGVyX3Nocmlua2ludG9yYW5nZShjLCA2LCAzLCBzY2FsZSk7Ci0gIGZ4bWF0aF9kZWNpbWFsX2hlbHBlcl90cnVuY2F0ZShjWzJdLCBjWzFdLCBjWzBdLCBzY2FsZSwgbWluc2NhbGUpOwotICByZXR1cm4gQ0ZYX0RlY2ltYWwoKHVpbnQzMl90KWNbMF0sICh1aW50MzJfdCljWzFdLCAodWludDMyX3QpY1syXSwgbmVnLAotICAgICAgICAgICAgICAgICAgICAgc2NhbGUpOwotfQotQ0ZYX0RlY2ltYWwgQ0ZYX0RlY2ltYWw6Ok1vZHVsdXMoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3QgewotICBDRlhfRGVjaW1hbCBsaHMgPSAqdGhpcywgcmhzX2FicyA9IHZhbDsKLSAgcmhzX2Ficy5TZXRBYnMoKTsKLSAgaWYgKCFyaHNfYWJzLklzTm90WmVybygpKSB7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgQ0ZYX0RlY2ltYWwgbGhzX2FicyA9IGxoczsKLSAgICBsaHNfYWJzLlNldEFicygpOwotICAgIGlmIChsaHNfYWJzIDwgcmhzX2FicykgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIENGWF9EZWNpbWFsIHF1b3QgPSBsaHMgLyByaHNfYWJzOwotICAgIHF1b3QuU2V0VHJ1bmNhdGUoKTsKLSAgICBsaHMgPSBsaHMgLSBxdW90ICogcmhzX2FiczsKLSAgfQotICByZXR1cm4gbGhzOwotfQotYm9vbCBDRlhfRGVjaW1hbDo6b3BlcmF0b3I9PShjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdCB7Ci0gIHJldHVybiBDb21wYXJlKHZhbCkgPT0gMDsKLX0KLWJvb2wgQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yPD0oY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3QgewotICByZXR1cm4gQ29tcGFyZSh2YWwpIDw9IDA7Ci19Ci1ib29sIENGWF9EZWNpbWFsOjpvcGVyYXRvcj49KGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0IHsKLSAgcmV0dXJuIENvbXBhcmUodmFsKSA+PSAwOwotfQotYm9vbCBDRlhfRGVjaW1hbDo6b3BlcmF0b3IhPShjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdCB7Ci0gIHJldHVybiBDb21wYXJlKHZhbCkgIT0gMDsKLX0KLWJvb2wgQ0ZYX0RlY2ltYWw6Om9wZXJhdG9yPChjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdCB7Ci0gIHJldHVybiBDb21wYXJlKHZhbCkgPCAwOwotfQotYm9vbCBDRlhfRGVjaW1hbDo6b3BlcmF0b3I+KGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0IHsKLSAgcmV0dXJuIENvbXBhcmUodmFsKSA+IDA7Ci19Ci1DRlhfRGVjaW1hbCBDRlhfRGVjaW1hbDo6b3BlcmF0b3IrKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0IHsKLSAgcmV0dXJuIEFkZE9yTWludXModmFsLCB0cnVlKTsKLX0KLUNGWF9EZWNpbWFsIENGWF9EZWNpbWFsOjpvcGVyYXRvci0oY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3QgewotICByZXR1cm4gQWRkT3JNaW51cyh2YWwsIGZhbHNlKTsKLX0KLUNGWF9EZWNpbWFsIENGWF9EZWNpbWFsOjpvcGVyYXRvciooY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3QgewotICByZXR1cm4gTXVsdGlwbHkodmFsKTsKLX0KLUNGWF9EZWNpbWFsIENGWF9EZWNpbWFsOjpvcGVyYXRvci8oY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3QgewotICByZXR1cm4gRGl2aWRlKHZhbCk7Ci19Ci1DRlhfRGVjaW1hbCBDRlhfRGVjaW1hbDo6b3BlcmF0b3IlKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0IHsKLSAgcmV0dXJuIE1vZHVsdXModmFsKTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9mZ2FzL2xvY2FsaXphdGlvbi9mZ2FzX2xvY2FsZS5oIGIveGZhL2ZnYXMvbG9jYWxpemF0aW9uL2ZnYXNfbG9jYWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNTc2NmQuLjAwMDAwMDAKLS0tIGEveGZhL2ZnYXMvbG9jYWxpemF0aW9uL2ZnYXNfbG9jYWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GR0FTX0xPQ0FMSVpBVElPTl9GR0FTX0xPQ0FMRV9IXwotI2RlZmluZSBYRkFfRkdBU19MT0NBTElaQVRJT05fRkdBU19MT0NBTEVfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfeG1sLmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvbG9jYWxpemF0aW9uL2ZnYXNfZGF0ZXRpbWUuaCIKLQotY2xhc3MgQ0ZYX1VuaXRpbWU7Ci0KLWVudW0gRlhfTE9DQUxFTlVNU1lNQk9MIHsKLSAgRlhfTE9DQUxFTlVNU1lNQk9MX0RlY2ltYWwsCi0gIEZYX0xPQ0FMRU5VTVNZTUJPTF9Hcm91cGluZywKLSAgRlhfTE9DQUxFTlVNU1lNQk9MX1BlcmNlbnQsCi0gIEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cywKLSAgRlhfTE9DQUxFTlVNU1lNQk9MX1plcm8sCi0gIEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbCwKLSAgRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5TmFtZSwKLX07Ci1lbnVtIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgewotICBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHQsCi0gIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQsCi0gIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtLAotICBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0Z1bGwsCi0gIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTG9uZywKLX07Ci1lbnVtIEZYX0xPQ0FMRU5VTVNVQkNBVEVHT1JZIHsKLSAgRlhfTE9DQUxFTlVNUEFUVEVSTl9QZXJjZW50LAotICBGWF9MT0NBTEVOVU1QQVRURVJOX0N1cnJlbmN5LAotICBGWF9MT0NBTEVOVU1QQVRURVJOX0RlY2ltYWwsCi0gIEZYX0xPQ0FMRU5VTVBBVFRFUk5fSW50ZWdlciwKLX07Ci1lbnVtIEZYX0xPQ0FMRUNBVEVHT1JZIHsKLSAgRlhfTE9DQUxFQ0FURUdPUllfVW5rbm93biwKLSAgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZSwKLSAgRlhfTE9DQUxFQ0FURUdPUllfVGltZSwKLSAgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWUsCi0gIEZYX0xPQ0FMRUNBVEVHT1JZX051bSwKLSAgRlhfTE9DQUxFQ0FURUdPUllfVGV4dCwKLSAgRlhfTE9DQUxFQ0FURUdPUllfWmVybywKLSAgRlhfTE9DQUxFQ0FURUdPUllfTnVsbCwKLX07Ci1lbnVtIEZYX0RBVEVUSU1FVFlQRSB7Ci0gIEZYX0RBVEVUSU1FVFlQRV9Vbmtub3duLAotICBGWF9EQVRFVElNRVRZUEVfRGF0ZSwKLSAgRlhfREFURVRJTUVUWVBFX1RpbWUsCi0gIEZYX0RBVEVUSU1FVFlQRV9EYXRlVGltZSwKLSAgRlhfREFURVRJTUVUWVBFX1RpbWVEYXRlLAotfTsKLQotY2xhc3MgSUZYX0xvY2FsZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5JRlhfTG9jYWxlKCkge30KLQotICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEdldE5hbWUoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBHZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0wgZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NOdW1TeW1ib2wpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIEdldERhdGVUaW1lU3ltYm9scyhDRlhfV2lkZVN0cmluZyYgd3NEdFN5bWJvbCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgR2V0TW9udGhOYW1lKGludDMyX3Qgbk1vbnRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c01vbnRoTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJBYmJyID0gdHJ1ZSkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgR2V0RGF5TmFtZShpbnQzMl90IG5XZWVrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NEYXlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJBYmJyID0gdHJ1ZSkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgR2V0TWVyaWRpZW1OYW1lKENGWF9XaWRlU3RyaW5nJiB3c01lcmlkaWVtTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJBTSA9IHRydWUpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIEdldFRpbWVab25lKEZYX1RJTUVaT05FKiB0eikgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgR2V0RXJhTmFtZShDRlhfV2lkZVN0cmluZyYgd3NFcmFOYW1lLCBib29sIGJBRCA9IHRydWUpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIEdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBHZXRUaW1lUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgR2V0TnVtUGF0dGVybihGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSBlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3QgPSAwOwotfTsKLQotY2xhc3MgSUZYX0xvY2FsZU1nciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5JRlhfTG9jYWxlTWdyKCkge30KLQotICB2aXJ0dWFsIHVpbnQxNl90IEdldERlZkxvY2FsZUlEKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIElGWF9Mb2NhbGUqIEdldERlZkxvY2FsZSgpID0gMDsKLSAgdmlydHVhbCBJRlhfTG9jYWxlKiBHZXRMb2NhbGVCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTG9jYWxlTmFtZSkgPSAwOwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJRlhfTG9jYWxlPiBHZXRMb2NhbGUodWludDE2X3QgbGNpZCkgPSAwOwotfTsKLQotYm9vbCBGWF9EYXRlRnJvbUNhbm9uaWNhbChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlLCBDRlhfVW5pdGltZSYgZGF0ZXRpbWUpOwotYm9vbCBGWF9UaW1lRnJvbUNhbm9uaWNhbChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1VuaXRpbWUmIGRhdGV0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlKTsKLWNsYXNzIENGWF9EZWNpbWFsIHsKLSBwdWJsaWM6Ci0gIENGWF9EZWNpbWFsKCk7Ci0gIGV4cGxpY2l0IENGWF9EZWNpbWFsKHVpbnQzMl90IHZhbCk7Ci0gIGV4cGxpY2l0IENGWF9EZWNpbWFsKHVpbnQ2NF90IHZhbCk7Ci0gIGV4cGxpY2l0IENGWF9EZWNpbWFsKGludDMyX3QgdmFsKTsKLSAgZXhwbGljaXQgQ0ZYX0RlY2ltYWwoaW50NjRfdCB2YWwpOwotICBleHBsaWNpdCBDRlhfRGVjaW1hbChGWF9GTE9BVCB2YWwsIHVpbnQ4X3Qgc2NhbGUgPSAzKTsKLSAgZXhwbGljaXQgQ0ZYX0RlY2ltYWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIpOwotICBleHBsaWNpdCBDRlhfRGVjaW1hbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN0cik7Ci0gIG9wZXJhdG9yIENGWF9XaWRlU3RyaW5nKCkgY29uc3Q7Ci0gIG9wZXJhdG9yIGRvdWJsZSgpIGNvbnN0OwotICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7Ci0gIGJvb2wgb3BlcmF0b3I8PShjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdDsKLSAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0OwotICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7Ci0gIGJvb2wgb3BlcmF0b3I8KGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0OwotICBib29sIG9wZXJhdG9yPihjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdDsKLSAgQ0ZYX0RlY2ltYWwgb3BlcmF0b3IrKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0OwotICBDRlhfRGVjaW1hbCBvcGVyYXRvci0oY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7Ci0gIENGWF9EZWNpbWFsIG9wZXJhdG9yKihjb25zdCBDRlhfRGVjaW1hbCYgdmFsKSBjb25zdDsKLSAgQ0ZYX0RlY2ltYWwgb3BlcmF0b3IvKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0OwotICBDRlhfRGVjaW1hbCBvcGVyYXRvciUoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7Ci0gIHZvaWQgU2V0U2NhbGUodWludDhfdCBuZXdTY2FsZSk7Ci0gIHVpbnQ4X3QgR2V0U2NhbGUoKTsKLSAgdm9pZCBTZXRBYnMoKTsKLSAgdm9pZCBTZXROZWdhdGUoKTsKLSAgdm9pZCBTZXRGbG9vcigpOwotICB2b2lkIFNldENlaWxpbmcoKTsKLSAgdm9pZCBTZXRUcnVuY2F0ZSgpOwotCi0gcHJvdGVjdGVkOgotICBDRlhfRGVjaW1hbCh1aW50MzJfdCBoaSwgdWludDMyX3QgbWlkLCB1aW50MzJfdCBsbywgYm9vbCBuZWcsIHVpbnQ4X3Qgc2NhbGUpOwotICBpbmxpbmUgYm9vbCBJc05vdFplcm8oKSBjb25zdCB7IHJldHVybiBtX3VIaSB8fCBtX3VNaWQgfHwgbV91TG87IH0KLSAgaW5saW5lIGludDhfdCBDb21wYXJlKGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBTd2FwKENGWF9EZWNpbWFsJiB2YWwpOwotICBpbmxpbmUgdm9pZCBGbG9vck9yQ2VpbChib29sIGJGbG9vcik7Ci0gIENGWF9EZWNpbWFsIEFkZE9yTWludXMoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCwgYm9vbCBpc0FkZGluZykgY29uc3Q7Ci0gIENGWF9EZWNpbWFsIE11bHRpcGx5KGNvbnN0IENGWF9EZWNpbWFsJiB2YWwpIGNvbnN0OwotICBDRlhfRGVjaW1hbCBEaXZpZGUoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7Ci0gIENGWF9EZWNpbWFsIE1vZHVsdXMoY29uc3QgQ0ZYX0RlY2ltYWwmIHZhbCkgY29uc3Q7Ci0gIHVpbnQzMl90IG1fdUZsYWdzOwotICB1aW50MzJfdCBtX3VIaTsKLSAgdWludDMyX3QgbV91TG87Ci0gIHVpbnQzMl90IG1fdU1pZDsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZHQVNfTE9DQUxJWkFUSU9OX0ZHQVNfTE9DQUxFX0hfCmRpZmYgLS1naXQgYS94ZmEvZmdhcy9sb2NhbGl6YXRpb24vZmdhc19sb2NhbGVpbXAuaCBiL3hmYS9mZ2FzL2xvY2FsaXphdGlvbi9mZ2FzX2xvY2FsZWltcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjY5MjFiLi4wMDAwMDAwCi0tLSBhL3hmYS9mZ2FzL2xvY2FsaXphdGlvbi9mZ2FzX2xvY2FsZWltcC5oCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GR0FTX0xPQ0FMSVpBVElPTl9GR0FTX0xPQ0FMRUlNUF9IXwotI2RlZmluZSBYRkFfRkdBU19MT0NBTElaQVRJT05fRkdBU19MT0NBTEVJTVBfSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInhmYS9mZ2FzL2xvY2FsaXphdGlvbi9mZ2FzX2xvY2FsZS5oIgotCi1jbGFzcyBDRlhfTENOdW1lcmljOwotCi1jbGFzcyBDRlhfRm9ybWF0U3RyaW5nIHsKLSBwdWJsaWM6Ci0gIENGWF9Gb3JtYXRTdHJpbmcoSUZYX0xvY2FsZU1nciogcExvY2FsZU1nciwgYm9vbCBiVXNlTENJRCk7Ci0gIH5DRlhfRm9ybWF0U3RyaW5nKCk7Ci0KLSAgdm9pZCBTcGxpdEZvcm1hdFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXRTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+JiB3c1BhdHRlcm5zKTsKLSAgRlhfTE9DQUxFQ0FURUdPUlkgR2V0Q2F0ZWdvcnkoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybik7Ci0gIHVpbnQxNl90IEdldExDSUQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybik7Ci0gIENGWF9XaWRlU3RyaW5nIEdldExvY2FsZU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybik7Ci0gIGJvb2wgUGFyc2VUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsCi0gICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sCi0gICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKTsKLSAgYm9vbCBQYXJzZU51bShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNOdW0sCi0gICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZlZhbHVlKTsKLSAgYm9vbCBQYXJzZU51bShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNOdW0sCi0gICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSk7Ci0gIGJvb2wgUGFyc2VEYXRlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNEYXRlVGltZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICBGWF9EQVRFVElNRVRZUEUgZURhdGVUaW1lVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIENGWF9Vbml0aW1lJiBkdFZhbHVlKTsKLSAgYm9vbCBQYXJzZVplcm8oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwKLSAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybik7Ci0gIGJvb2wgUGFyc2VOdWxsKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY1RleHQsCi0gICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pOwotICBib29sIEZvcm1hdFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjVGV4dCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpOwotICBib29sIEZvcm1hdE51bShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTcmNOdW0sCi0gICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sCi0gICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7Ci0gIGJvb2wgRm9ybWF0TnVtKEZYX0ZMT0FUIGZOdW0sCi0gICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sCi0gICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7Ci0gIGJvb2wgRm9ybWF0RGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzU3JjRGF0ZVRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpOwotICBib29sIEZvcm1hdERhdGVUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1NyY0RhdGVUaW1lLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRSBlRGF0ZVRpbWVUeXBlKTsKLSAgYm9vbCBGb3JtYXREYXRlVGltZShjb25zdCBDRlhfVW5pdGltZSYgZHQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpOwotICBib29sIEZvcm1hdFplcm8oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KTsKLSAgYm9vbCBGb3JtYXROdWxsKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIElGWF9Mb2NhbGUqIEdldFRleHRGb3JtYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUHVyZ2VQYXR0ZXJuKTsKLSAgSUZYX0xvY2FsZSogR2V0TnVtZXJpY0Zvcm1hdChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlEb3RJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgZHdTdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQdXJnZVBhdHRlcm4pOwotICBib29sIEZvcm1hdFN0ck51bShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzSW5wdXROdW0sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCk7Ci0gIGJvb2wgRm9ybWF0TENOdW1lcmljKENGWF9MQ051bWVyaWMmIGxjTnVtLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpOwotICBGWF9EQVRFVElNRVRZUEUgR2V0RGF0ZVRpbWVGb3JtYXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqJiBwTG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZVBhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NUaW1lUGF0dGVybik7Ci0gIElGWF9Mb2NhbGUqIEdldFBhdHRlcm5Mb2NhbGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTG9jYWxlKTsKLQotICBJRlhfTG9jYWxlTWdyKiBtX3BMb2NhbGVNZ3I7Ci0gIGJvb2wgbV9iVXNlTENJRDsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZHQVNfTE9DQUxJWkFUSU9OX0ZHQVNfTE9DQUxFSU1QX0hfCmRpZmYgLS1naXQgYS94ZmEvZndsL1JFQURNRS5tZCBiL3hmYS9md2wvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyODVlODkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZndsL1JFQURNRS5tZApAQCAtMCwwICsxLDU4IEBACit4ZmEvZndsIGlzIGEgV2lkZ2V0IExpYnJhcnkgZm9yIFhGQSBGb3Jtcy4KKworQ0ZXTF9XaWRnZXQgaXMgdGhlIGJhc2UgY2xhc3MgdGhhdCB3aWRnZXQgY2xhc3NlcyBleHRlbmQuIFRoZSBkZXJpdmVkIHdpZGdldAorY2xhc3NlcyBhcmUgYm90aCBjb250cm9sbGVycyBhbmQgcmVuZGVyZXJzIGZvciBlYWNoIHdpZGdldC4gVGhlIGhpZXJhcmNoeSBpczoKKworKiBDRldMX1dpZGdldAorICAgICogQ0ZXTF9Gb3JtCisgICAgICAgICogQ0ZXTF9Gb3JtUHJveHkKKyAgICAgICAgICAgICogQ0ZXTF9Db21ib0JveFByb3h5CisgICAgKiBDRldMX0NhcmV0CisgICAgKiBDRldMX0NoZWNrQm94CisgICAgKiBDRldMX0NvbWJvQm94CisgICAgKiBDRldMX0RhdGVUaW1lUGlja2VyCisgICAgKiBDRldMX0VkaXQKKyAgICAgICAgKiBDRldMX0JhcmNvZGUKKyAgICAgICAgKiBDRldMX0NvbWJvRWRpdAorICAgICAgICAqIENGV0xfRGF0ZVRpbWVFZGl0CisgICAgKiBDRldMX0xpc3RCb3gKKyAgICAgICAgKiBDRldMX0NvbWJvTGlzdAorICAgICogQ0ZXTF9Nb250aENhbGVuZGFyCisgICAgKiBDRldMX1BpY3R1cmVCb3gKKyAgICAqIENGV0xfUHVzaEJ1dHRvbgorICAgICogQ0ZXTF9TY3JvbGxCYXIKKyAgICAqIENGV0xfU3BpbkJ1dHRvbgorCitUaGVzZSBDRldMIHdpZGdldHMgYXJlIGluc3RhbnRpYXRlZCBieSBhbmQgY2xvc2VseSByZWxhdGVkIHRvIHRoZSBDWEZBIGNsYXNzZXMKK2luIHRoZSB4ZmEvZnhmYSBkaXJlY3RvcnkuIFNlZSB4ZmEvZnhmYS9SRUFETUUubWQuCisKK0NGV0xfV2lkZ2V0IGltcGxlbWVudHMgSUZXTF9XaWRnZXREZWxlZ2F0ZSB0aHJvdWdoIHdoaWNoIGl0IHJlY2VpdmVzIG1lc3NhZ2VzLAorZXZlbnRzIGFuZCBkcmF3IGNhbGxzLgorCitNZXNzYWdlcyBjb25zaXN0IG9mIHVzZXIgaW5wdXQgZm9yIGEgd2lkZ2V0IHRvIGhhbmRsZS4gRWFjaCB0eXBlIG9mIG1lc3NhZ2UgaXMKK2lkZW50aWZpZWQgYnkgYW4gZW51bSB2YWx1ZSBpbiBNZXNzYWdlOjpUeXBlIGFuZCBoYXMgaXRzIG93biBjbGFzcyBkZXJpdmVkIGZyb20KK3RoZSBiYXNlIENGV0xfTWVzc2FnZS4KKworKiBDRldMX01lc3NhZ2UKKyAgICAqIENGV0xfTWVzc2FnZUtleQorICAgICogQ0ZXTF9NZXNzYWdlS2lsbEZvY3VzCisgICAgKiBDRldMX01lc3NhZ2VNb3VzZQorICAgICogQ0ZXTF9NZXNzYWdlTW91c2VXaGVlbAorICAgICogQ0ZXTF9NZXNzYWdlU2V0Rm9jdXMKKworRXZlbnRzIGFyZSBvcmlnaW5hdGVkIGluIHRoZSB3aWRnZXRzIGFuZCBhcmUgdGhlbiBoYW5kbGVkIGJ5IG90aGVyIENGV0xfV2lkZ2V0CithbmQgQ1hGQSBjbGFzc2VzLgorCisqIENGV0xfRXZlbnQKKyAgICAqIENGV0xfRXZlbnRDaGVja1dvcmQKKyAgICAqIENGV0xfRXZlbnRNb3VzZQorICAgICogQ0ZXTF9FdmVudFNjcm9sbAorICAgICogQ0ZXTF9FdmVudFNlbGVjdENoYW5nZWQKKyAgICAqIENGV0xfRXZlbnRUZXh0Q2hhbmdlZAorICAgICogQ0ZXTF9FdmVudFZhbGlkYXRlCisKK1RoZSB3aWRnZXRzIHVzZSBJRldMX1RoZW1lUHJvdmlkZXIgZm9yIHJlbmRlcmluZyBldmVyeXRoaW5nLCBjYWxsaW5nCitEcmF3QmFja2dyb3VuZCgpIGFuZCBEcmF3VGV4dCgpIGFuZCBwYXNzaW5nIG1hbnkgb3B0aW9ucyBpbiB0aGVpciBwYXJhbWV0ZXJzLAorcmVzcGVjdGl2ZWx5IG9mIHR5cGVzIENGV0xfVGhlbWVCYWNrZ3JvdW5kIGFuZCBDRldMX1RoZW1lVGV4dC4gU2VlCit4ZmEvZndsL3RoZW1lL1JFQURNRS5tZC4KKwpkaWZmIC0tZ2l0IGEveGZhL2Z3bC9jZndsX2FwcC5jcHAgYi94ZmEvZndsL2Nmd2xfYXBwLmNwcAppbmRleCBmZWJjOGEwLi41OGNhOTNkIDEwMDY0NAotLS0gYS94ZmEvZndsL2Nmd2xfYXBwLmNwcAorKysgYi94ZmEvZndsL2Nmd2xfYXBwLmNwcApAQCAtMTAsNyArMTAsNyBAQAogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9ub3RlZHJpdmVyLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3dpZGdldC5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF93aWRnZXRtZ3IuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2Z3bGFkYXB0ZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Z3bGFkYXB0ZXJ3aWRnZXRtZ3IuaCIKIAogQ0ZXTF9BcHA6OkNGV0xfQXBwKENYRkFfRkZBcHAqIHBBZGFwdGVyKQogICAgIDogbV9wQWRhcHRlck5hdGl2ZShwQWRhcHRlciksCmRpZmYgLS1naXQgYS94ZmEvZndsL2Nmd2xfYXBwLmggYi94ZmEvZndsL2Nmd2xfYXBwLmgKaW5kZXggYzI3NzllOC4uZWQ0NzE0OSAxMDA2NDQKLS0tIGEveGZhL2Z3bC9jZndsX2FwcC5oCisrKyBiL3hmYS9md2wvY2Z3bF9hcHAuaApAQCAtMzIsMTIgKzMyLDEyIEBACiAgIGV4cGxpY2l0IENGV0xfQXBwKENYRkFfRkZBcHAqIHBBZGFwdGVyKTsKICAgfkNGV0xfQXBwKCk7CiAKLSAgQ1hGQV9GRkFwcCogR2V0QWRhcHRlck5hdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcEFkYXB0ZXJOYXRpdmU7IH0KKyAgQ1hGQV9GRkFwcCogR2V0QWRhcHRlck5hdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcEFkYXB0ZXJOYXRpdmUuR2V0KCk7IH0KICAgQ0ZXTF9XaWRnZXRNZ3IqIEdldFdpZGdldE1ncigpIGNvbnN0IHsgcmV0dXJuIG1fcFdpZGdldE1nci5nZXQoKTsgfQogICBDRldMX05vdGVEcml2ZXIqIEdldE5vdGVEcml2ZXIoKSBjb25zdCB7IHJldHVybiBtX3BOb3RlRHJpdmVyLmdldCgpOyB9CiAKICBwcml2YXRlOgotICBDWEZBX0ZGQXBwKiBjb25zdCBtX3BBZGFwdGVyTmF0aXZlOworICBVbm93bmVkUHRyPENYRkFfRkZBcHA+IGNvbnN0IG1fcEFkYXB0ZXJOYXRpdmU7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDRldMX1dpZGdldE1ncj4gbV9wV2lkZ2V0TWdyOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZXTF9Ob3RlRHJpdmVyPiBtX3BOb3RlRHJpdmVyOwogfTsKZGlmZiAtLWdpdCBhL3hmYS9md2wvY2Z3bF9iYXJjb2RlLmNwcCBiL3hmYS9md2wvY2Z3bF9iYXJjb2RlLmNwcAppbmRleCAwNDEyYjg2Li5mNWQ2ZWE5IDEwMDY0NAotLS0gYS94ZmEvZndsL2Nmd2xfYmFyY29kZS5jcHAKKysrIGIveGZhL2Z3bC9jZndsX2JhcmNvZGUuY3BwCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3RoZW1lcGFydC5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z4X2JhcmNvZGUuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2lmd2xfdGhlbWVwcm92aWRlci5oIgorI2luY2x1ZGUgInhmYS9md2wvdGhlbWUvY2Z3bF91dGlscy5oIgogCiBDRldMX0JhcmNvZGU6OkNGV0xfQmFyY29kZShjb25zdCBDRldMX0FwcCogYXBwKQogICAgIDogQ0ZXTF9FZGl0KGFwcCwgcGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfV2lkZ2V0UHJvcGVydGllcz4oKSwgbnVsbHB0ciksCkBAIC0zNSw4ICszNiw4IEBACiAgIEdlbmVyYXRlQmFyY29kZUltYWdlQ2FjaGUoKTsKIH0KIAotdm9pZCBDRldMX0JhcmNvZGU6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7Cit2b2lkIENGV0xfQmFyY29kZTo6RHJhd1dpZGdldChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKICAgaWYgKCFwR3JhcGhpY3MpCiAgICAgcmV0dXJuOwogICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpCkBAIC00OSwxNSArNTAsMTIgQEAKICAgICBDRlhfTWF0cml4IG10OwogICAgIG10LmUgPSBHZXRSVENsaWVudCgpLmxlZnQ7CiAgICAgbXQuZiA9IEdldFJUQ2xpZW50KCkudG9wOwotICAgIGlmIChwTWF0cml4KQotICAgICAgbXQuQ29uY2F0KCpwTWF0cml4KTsKKyAgICBtdC5Db25jYXQobWF0cml4KTsKIAotICAgIGludDMyX3QgZXJyb3JDb2RlID0gMDsKLSAgICBtX3BCYXJjb2RlRW5naW5lLT5SZW5kZXJEZXZpY2UocEdyYXBoaWNzLT5HZXRSZW5kZXJEZXZpY2UoKSwgcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlKTsKKyAgICBtX3BCYXJjb2RlRW5naW5lLT5SZW5kZXJEZXZpY2UocEdyYXBoaWNzLT5HZXRSZW5kZXJEZXZpY2UoKSwgJm1hdHJpeCk7CiAgICAgcmV0dXJuOwogICB9Ci0gIENGV0xfRWRpdDo6RHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOworICBDRldMX0VkaXQ6OkRyYXdXaWRnZXQocEdyYXBoaWNzLCBtYXRyaXgpOwogfQogCiB2b2lkIENGV0xfQmFyY29kZTo6U2V0VHlwZShCQ19UWVBFIHR5cGUpIHsKQEAgLTY5LDcgKzY3LDcgQEAKICAgbV9kd1N0YXR1cyA9IFhGQV9CQ1NfTmVlZFVwZGF0ZTsKIH0KIAotdm9pZCBDRldMX0JhcmNvZGU6OlNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgewordm9pZCBDRldMX0JhcmNvZGU6OlNldFRleHQoY29uc3QgV2lkZVN0cmluZyYgd3NUZXh0KSB7CiAgIG1fcEJhcmNvZGVFbmdpbmUucmVzZXQoKTsKICAgbV9kd1N0YXR1cyA9IFhGQV9CQ1NfTmVlZFVwZGF0ZTsKICAgQ0ZXTF9FZGl0OjpTZXRUZXh0KHdzVGV4dCk7CkBAIC0xMzEsMTcgKzEyOSwxNyBAQAogICBtX2VUZXh0TG9jYXRpb24gPSBsb2NhdGlvbjsKIH0KIAotdm9pZCBDRldMX0JhcmNvZGU6OlNldFdpZGVOYXJyb3dSYXRpbyhpbnQzMl90IHJhdGlvKSB7Cit2b2lkIENGV0xfQmFyY29kZTo6U2V0V2lkZU5hcnJvd1JhdGlvKGludDhfdCByYXRpbykgewogICBtX2R3QXR0cmlidXRlTWFzayB8PSBGV0xfQkNEQVRUUklCVVRFX1dJREVOQVJST1dSQVRJTzsKICAgbV9uV2lkZU5hcnJvd1JhdGlvID0gcmF0aW87CiB9CiAKLXZvaWQgQ0ZXTF9CYXJjb2RlOjpTZXRTdGFydENoYXIoRlhfQ0hBUiBzdGFydENoYXIpIHsKK3ZvaWQgQ0ZXTF9CYXJjb2RlOjpTZXRTdGFydENoYXIoY2hhciBzdGFydENoYXIpIHsKICAgbV9kd0F0dHJpYnV0ZU1hc2sgfD0gRldMX0JDREFUVFJJQlVURV9TVEFSVENIQVI7CiAgIG1fY1N0YXJ0Q2hhciA9IHN0YXJ0Q2hhcjsKIH0KIAotdm9pZCBDRldMX0JhcmNvZGU6OlNldEVuZENoYXIoRlhfQ0hBUiBlbmRDaGFyKSB7Cit2b2lkIENGV0xfQmFyY29kZTo6U2V0RW5kQ2hhcihjaGFyIGVuZENoYXIpIHsKICAgbV9kd0F0dHJpYnV0ZU1hc2sgfD0gRldMX0JDREFUVFJJQlVURV9FTkRDSEFSOwogICBtX2NFbmRDaGFyID0gZW5kQ2hhcjsKIH0KQEAgLTE2OSw3ICsxNjcsNyBAQAogICBpZiAocFRoZW1lKSB7CiAgICAgQ0ZXTF9UaGVtZVBhcnQgcGFydDsKICAgICBwYXJ0Lm1fcFdpZGdldCA9IHRoaXM7Ci0gICAgaWYgKENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBwRm9udCA9IHBUaGVtZS0+R2V0Rm9udCgmcGFydCkpIHsKKyAgICBpZiAoUmV0YWluUHRyPENGR0FTX0dFRm9udD4gcEZvbnQgPSBwVGhlbWUtPkdldEZvbnQoJnBhcnQpKSB7CiAgICAgICBpZiAoQ0ZYX0ZvbnQqIHBDWEZvbnQgPSBwRm9udC0+R2V0RGV2Rm9udCgpKQogICAgICAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRGb250KHBDWEZvbnQpOwogICAgIH0KQEAgLTIwMSwxNSArMTk5LDEyIEBACiAgICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0U3RhcnRDaGFyKG1fY1N0YXJ0Q2hhcik7CiAgIGlmIChtX2R3QXR0cmlidXRlTWFzayAmIEZXTF9CQ0RBVFRSSUJVVEVfRU5EQ0hBUikKICAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRFbmRDaGFyKG1fY0VuZENoYXIpOwotICBpZiAobV9kd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX1ZFUlNJT04pCi0gICAgbV9wQmFyY29kZUVuZ2luZS0+U2V0VmVyc2lvbigwKTsKICAgaWYgKG1fZHdBdHRyaWJ1dGVNYXNrICYgRldMX0JDREFUVFJJQlVURV9FQ0xFVkVMKQogICAgIG1fcEJhcmNvZGVFbmdpbmUtPlNldEVycm9yQ29ycmVjdGlvbkxldmVsKG1fbkVDTGV2ZWwpOwogICBpZiAobV9kd0F0dHJpYnV0ZU1hc2sgJiBGV0xfQkNEQVRUUklCVVRFX1RSVU5DQVRFRCkKICAgICBtX3BCYXJjb2RlRW5naW5lLT5TZXRUcnVuY2F0ZWQobV9iVHJ1bmNhdGVkKTsKIAotICBpbnQzMl90IGVycm9yQ29kZSA9IDA7Ci0gIG1fZHdTdGF0dXMgPSBtX3BCYXJjb2RlRW5naW5lLT5FbmNvZGUoR2V0VGV4dCgpLkFzU3RyaW5nQygpLCB0cnVlLCBlcnJvckNvZGUpCisgIG1fZHdTdGF0dXMgPSBtX3BCYXJjb2RlRW5naW5lLT5FbmNvZGUoR2V0VGV4dCgpLkFzU3RyaW5nVmlldygpKQogICAgICAgICAgICAgICAgICAgID8gWEZBX0JDU19FbmNvZGVTdWNjZXNzCiAgICAgICAgICAgICAgICAgICAgOiAwOwogfQpAQCAtMjE4LDcgKzIxMyw3IEBACiAgIGlmIChtX3BCYXJjb2RlRW5naW5lIHx8IG1fdHlwZSA9PSBCQ19VTktOT1dOKQogICAgIHJldHVybjsKIAotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0JhcmNvZGU+IHBCYXJjb2RlKG5ldyBDRlhfQmFyY29kZSk7CisgIGF1dG8gcEJhcmNvZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0JhcmNvZGU+KCk7CiAgIGlmIChwQmFyY29kZS0+Q3JlYXRlKG1fdHlwZSkpCiAgICAgbV9wQmFyY29kZUVuZ2luZSA9IHN0ZDo6bW92ZShwQmFyY29kZSk7CiB9CmRpZmYgLS1naXQgYS94ZmEvZndsL2Nmd2xfYmFyY29kZS5oIGIveGZhL2Z3bC9jZndsX2JhcmNvZGUuaAppbmRleCAyZTk3OTkxLi4yZmM3OTYwIDEwMDY0NAotLS0gYS94ZmEvZndsL2Nmd2xfYmFyY29kZS5oCisrKyBiL3hmYS9md2wvY2Z3bF9iYXJjb2RlLmgKQEAgLTksMTAgKzksMTAgQEAKIAogI2luY2x1ZGUgPG1lbW9yeT4KIAorI2luY2x1ZGUgImZ4YmFyY29kZS9CQ19MaWJyYXJ5LmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2VkaXQuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfc2Nyb2xsYmFyLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3dpZGdldC5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvQkNfTGlicmFyeS5oIgogCiBjbGFzcyBDRldMX1dpZGdldFByb3BlcnRpZXM7CiBjbGFzcyBDRlhfQmFyY29kZTsKQEAgLTMzLDkgKzMzLDggQEAKICAgRldMX0JDREFUVFJJQlVURV9XSURFTkFSUk9XUkFUSU8gPSAxIDw8IDcsCiAgIEZXTF9CQ0RBVFRSSUJVVEVfU1RBUlRDSEFSID0gMSA8PCA4LAogICBGV0xfQkNEQVRUUklCVVRFX0VORENIQVIgPSAxIDw8IDksCi0gIEZXTF9CQ0RBVFRSSUJVVEVfVkVSU0lPTiA9IDEgPDwgMTAsCi0gIEZXTF9CQ0RBVFRSSUJVVEVfRUNMRVZFTCA9IDEgPDwgMTEsCi0gIEZXTF9CQ0RBVFRSSUJVVEVfVFJVTkNBVEVEID0gMSA8PCAxMgorICBGV0xfQkNEQVRUUklCVVRFX0VDTEVWRUwgPSAxIDw8IDEwLAorICBGV0xfQkNEQVRUUklCVVRFX1RSVU5DQVRFRCA9IDEgPDwgMTEsCiB9OwogCiBjbGFzcyBDRldMX0JhcmNvZGUgOiBwdWJsaWMgQ0ZXTF9FZGl0IHsKQEAgLTQ2LDExICs0NSwxMSBAQAogICAvLyBDRldMX1dpZGdldAogICBGV0xfVHlwZSBHZXRDbGFzc0lEKCkgY29uc3Qgb3ZlcnJpZGU7CiAgIHZvaWQgVXBkYXRlKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgb3ZlcnJpZGU7CisgIHZvaWQgRHJhd1dpZGdldChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgb3ZlcnJpZGU7CiAgIHZvaWQgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSBvdmVycmlkZTsKIAogICAvLyBDRldMX0VkaXQKLSAgdm9pZCBTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIG92ZXJyaWRlOworICB2b2lkIFNldFRleHQoY29uc3QgV2lkZVN0cmluZyYgd3NUZXh0KSBvdmVycmlkZTsKIAogICB2b2lkIFNldFR5cGUoQkNfVFlQRSB0eXBlKTsKICAgYm9vbCBJc1Byb3RlY3RlZFR5cGUoKSBjb25zdDsKQEAgLTYyLDkgKzYxLDkgQEAKICAgdm9pZCBTZXRDYWxDaGVja3N1bShib29sIGNhbENoZWNrc3VtKTsKICAgdm9pZCBTZXRQcmludENoZWNrc3VtKGJvb2wgcHJpbnRDaGVja3N1bSk7CiAgIHZvaWQgU2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKTsKLSAgdm9pZCBTZXRXaWRlTmFycm93UmF0aW8oaW50MzJfdCByYXRpbyk7Ci0gIHZvaWQgU2V0U3RhcnRDaGFyKEZYX0NIQVIgc3RhcnRDaGFyKTsKLSAgdm9pZCBTZXRFbmRDaGFyKEZYX0NIQVIgZW5kQ2hhcik7CisgIHZvaWQgU2V0V2lkZU5hcnJvd1JhdGlvKGludDhfdCByYXRpbyk7CisgIHZvaWQgU2V0U3RhcnRDaGFyKGNoYXIgc3RhcnRDaGFyKTsKKyAgdm9pZCBTZXRFbmRDaGFyKGNoYXIgZW5kQ2hhcik7CiAgIHZvaWQgU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBlY0xldmVsKTsKICAgdm9pZCBTZXRUcnVuY2F0ZWQoYm9vbCB0cnVuY2F0ZWQpOwogCkBAIC04Miw5ICs4MSw5IEBACiAgIGJvb2wgbV9iQ2FsQ2hlY2tzdW07CiAgIGJvb2wgbV9iUHJpbnRDaGVja3N1bTsKICAgQkNfVEVYVF9MT0MgbV9lVGV4dExvY2F0aW9uOwotICBpbnQzMl90IG1fbldpZGVOYXJyb3dSYXRpbzsKLSAgRlhfQ0hBUiBtX2NTdGFydENoYXI7Ci0gIEZYX0NIQVIgbV9jRW5kQ2hhcjsKKyAgaW50OF90IG1fbldpZGVOYXJyb3dSYXRpbzsKKyAgY2hhciBtX2NTdGFydENoYXI7CisgIGNoYXIgbV9jRW5kQ2hhcjsKICAgaW50MzJfdCBtX25FQ0xldmVsOwogICBib29sIG1fYlRydW5jYXRlZDsKICAgdWludDMyX3QgbV9kd0F0dHJpYnV0ZU1hc2s7CmRpZmYgLS1naXQgYS94ZmEvZndsL2Nmd2xfY2FyZXQuY3BwIGIveGZhL2Z3bC9jZndsX2NhcmV0LmNwcAppbmRleCBkYTU3Y2I0Li5jZDg1MDQxIDEwMDY0NAotLS0gYS94ZmEvZndsL2Nmd2xfY2FyZXQuY3BwCisrKyBiL3hmYS9md2wvY2Z3bF9jYXJldC5jcHAKQEAgLTE5LDE1ICsxOSwxNyBAQAogCiBjb25zdCB1aW50MzJfdCBrRnJlcXVlbmN5ID0gNDAwOwogCitjb25zdGV4cHIgaW50IGtTdGF0ZUhpZ2hsaWdodCA9ICgxIDw8IDApOworCiB9ICAvLyBuYW1lc3BhY2UKIAogQ0ZXTF9DYXJldDo6Q0ZXTF9DYXJldChjb25zdCBDRldMX0FwcCogYXBwLAogICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZXTF9XaWRnZXRQcm9wZXJ0aWVzPiBwcm9wZXJ0aWVzLAogICAgICAgICAgICAgICAgICAgICAgICBDRldMX1dpZGdldCogcE91dGVyKQogICAgIDogQ0ZXTF9XaWRnZXQoYXBwLCBzdGQ6Om1vdmUocHJvcGVydGllcyksIHBPdXRlciksCi0gICAgICBtX3BUaW1lcihuZXcgQ0ZXTF9DYXJldDo6VGltZXIodGhpcykpLAorICAgICAgbV9wVGltZXIocGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfQ2FyZXQ6OlRpbWVyPih0aGlzKSksCiAgICAgICBtX3BUaW1lckluZm8obnVsbHB0cikgewotICBTZXRTdGF0ZXMoRldMX1NUQVRFX0NBVF9IaWdodExpZ2h0KTsKKyAgU2V0U3RhdGVzKGtTdGF0ZUhpZ2hsaWdodCk7CiB9CiAKIENGV0xfQ2FyZXQ6On5DRldMX0NhcmV0KCkgewpAQCAtNDMsOCArNDUsOCBAQAogCiB2b2lkIENGV0xfQ2FyZXQ6OlVwZGF0ZSgpIHt9CiAKLXZvaWQgQ0ZXTF9DYXJldDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7Cit2b2lkIENGV0xfQ2FyZXQ6OkRyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgewogICBpZiAoIXBHcmFwaGljcykKICAgICByZXR1cm47CiAgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikKQEAgLTUyLDcgKzU0LDcgQEAKICAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKQogICAgIHJldHVybjsKIAotICBEcmF3Q2FyZXRCSyhwR3JhcGhpY3MsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsIHBNYXRyaXgpOworICBEcmF3Q2FyZXRCSyhwR3JhcGhpY3MsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsICZtYXRyaXgpOwogfQogCiB2b2lkIENGV0xfQ2FyZXQ6OlNob3dDYXJldCgpIHsKQEAgLTcwLDEwICs3MiwxMCBAQAogICBTZXRTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSk7CiB9CiAKLXZvaWQgQ0ZXTF9DYXJldDo6RHJhd0NhcmV0QksoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCit2b2lkIENGV0xfQ2FyZXQ6OkRyYXdDYXJldEJLKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgaWYgKCEobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9TVEFURV9DQVRfSGlnaHRMaWdodCkpCisgIGlmICghKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBrU3RhdGVIaWdobGlnaHQpKQogICAgIHJldHVybjsKIAogICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsKQEAgLTg5LDE5ICs5MSwxOSBAQAogCiB2b2lkIENGV0xfQ2FyZXQ6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkge30KIAotdm9pZCBDRldMX0NhcmV0OjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7Ci0gIERyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsKK3ZvaWQgQ0ZXTF9DYXJldDo6T25EcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBEcmF3V2lkZ2V0KHBHcmFwaGljcywgbWF0cml4KTsKIH0KIAogQ0ZXTF9DYXJldDo6VGltZXI6OlRpbWVyKENGV0xfQ2FyZXQqIHBDYXJldCkgOiBDRldMX1RpbWVyKHBDYXJldCkge30KIAogdm9pZCBDRldMX0NhcmV0OjpUaW1lcjo6UnVuKENGV0xfVGltZXJJbmZvKiBwVGltZXJJbmZvKSB7Ci0gIENGV0xfQ2FyZXQqIHBDYXJldCA9IHN0YXRpY19jYXN0PENGV0xfQ2FyZXQqPihtX3BXaWRnZXQpOwotICBpZiAoIShwQ2FyZXQtPkdldFN0YXRlcygpICYgRldMX1NUQVRFX0NBVF9IaWdodExpZ2h0KSkKLSAgICBwQ2FyZXQtPlNldFN0YXRlcyhGV0xfU1RBVEVfQ0FUX0hpZ2h0TGlnaHQpOworICBDRldMX0NhcmV0KiBwQ2FyZXQgPSBzdGF0aWNfY2FzdDxDRldMX0NhcmV0Kj4obV9wV2lkZ2V0LkdldCgpKTsKKyAgaWYgKCEocENhcmV0LT5HZXRTdGF0ZXMoKSAmIGtTdGF0ZUhpZ2hsaWdodCkpCisgICAgcENhcmV0LT5TZXRTdGF0ZXMoa1N0YXRlSGlnaGxpZ2h0KTsKICAgZWxzZQotICAgIHBDYXJldC0+UmVtb3ZlU3RhdGVzKEZXTF9TVEFURV9DQVRfSGlnaHRMaWdodCk7CisgICAgcENhcmV0LT5SZW1vdmVTdGF0ZXMoa1N0YXRlSGlnaGxpZ2h0KTsKIAogICBDRlhfUmVjdEYgcnQgPSBwQ2FyZXQtPkdldFdpZGdldFJlY3QoKTsKICAgcENhcmV0LT5SZXBhaW50UmVjdChDRlhfUmVjdEYoMCwgMCwgcnQud2lkdGggKyAxLCBydC5oZWlnaHQpKTsKZGlmZiAtLWdpdCBhL3hmYS9md2wvY2Z3bF9jYXJldC5oIGIveGZhL2Z3bC9jZndsX2NhcmV0LmgKaW5kZXggZTBjMDdkMy4uOTBkNjJkNiAxMDA2NDQKLS0tIGEveGZhL2Z3bC9jZndsX2NhcmV0LmgKKysrIGIveGZhL2Z3bC9jZndsX2NhcmV0LmgKQEAgLTExLDEzICsxMSwxMSBAQAogCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3RpbWVyLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3dpZGdldC5oIgotI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2NmeF9jb2xvci5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2Vjb2xvci5oIgogCiBjbGFzcyBDRldMX1dpZGdldFByb3BlcnRpZXM7CiBjbGFzcyBDRldMX1dpZGdldDsKIAotI2RlZmluZSBGV0xfU1RBVEVfQ0FUX0hpZ2h0TGlnaHQgMQotCiBjbGFzcyBDRldMX0NhcmV0IDogcHVibGljIENGV0xfV2lkZ2V0IHsKICBwdWJsaWM6CiAgIENGV0xfQ2FyZXQoY29uc3QgQ0ZXTF9BcHAqIGFwcCwKQEAgLTI3LDEwICsyNSwxMCBAQAogCiAgIC8vIENGV0xfV2lkZ2V0CiAgIEZXTF9UeXBlIEdldENsYXNzSUQoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSBvdmVycmlkZTsKKyAgdm9pZCBEcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSBvdmVycmlkZTsKICAgdm9pZCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIG92ZXJyaWRlOwotICB2b2lkIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgb3ZlcnJpZGU7CisgIHZvaWQgT25EcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSBvdmVycmlkZTsKICAgdm9pZCBVcGRhdGUoKSBvdmVycmlkZTsKIAogICB2b2lkIFNob3dDYXJldCgpOwpAQCAtNDYsMTIgKzQ0LDEyIEBACiAgIH07CiAgIGZyaWVuZCBjbGFzcyBDRldMX0NhcmV0OjpUaW1lcjsKIAotICB2b2lkIERyYXdDYXJldEJLKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAorICB2b2lkIERyYXdDYXJldEJLKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKIAogICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZXTF9DYXJldDo6VGltZXI+IG1fcFRpbWVyOwotICBDRldMX1RpbWVySW5mbyogbV9wVGltZXJJbmZvOyAgLy8gbm90IG93bmVkLgorICBVbm93bmVkUHRyPENGV0xfVGltZXJJbmZvPiBtX3BUaW1lckluZm87CiB9OwogCiAjZW5kaWYgIC8vIFhGQV9GV0xfQ0ZXTF9DQVJFVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z3bC9jZndsX2NoZWNrYm94LmNwcCBiL3hmYS9md2wvY2Z3bF9jaGVja2JveC5jcHAKaW5kZXggMDEwMmJjNy4uNDJiNmNhZCAxMDA2NDQKLS0tIGEveGZhL2Z3bC9jZndsX2NoZWNrYm94LmNwcAorKysgYi94ZmEvZndsL2Nmd2xfY2hlY2tib3guY3BwCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotI2luY2x1ZGUgInhmYS9mZGUvdHRvL2ZkZV90ZXh0b3V0LmgiCisjaW5jbHVkZSAieGZhL2ZkZS9jZmRlX3RleHRvdXQuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfYXBwLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2V2ZW50LmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX21lc3NhZ2VrZXkuaCIKQEAgLTMxLDEwICszMSwxMCBAQAogCiBDRldMX0NoZWNrQm94OjpDRldMX0NoZWNrQm94KGNvbnN0IENGV0xfQXBwKiBhcHApCiAgICAgOiBDRldMX1dpZGdldChhcHAsIHBkZml1bTo6TWFrZVVuaXF1ZTxDRldMX1dpZGdldFByb3BlcnRpZXM+KCksIG51bGxwdHIpLAotICAgICAgbV9kd1RUT1N0eWxlcyhGREVfVFRPU1RZTEVfU2luZ2xlTGluZSksCi0gICAgICBtX2lUVE9BbGlnbihGREVfVFRPQUxJR05NRU5UX0NlbnRlciksCisgICAgICBtX2lUVE9BbGlnbihGREVfVGV4dEFsaWdubWVudDo6a0NlbnRlciksCiAgICAgICBtX2JCdG5Eb3duKGZhbHNlKSwKICAgICAgIG1fZkJveEhlaWdodCgxNi4wZikgeworICBtX2R3VFRPU3R5bGVzLnNpbmdsZV9saW5lXyA9IHRydWU7CiAgIG1fcnRDbGllbnQuUmVzZXQoKTsKICAgbV9ydEJveC5SZXNldCgpOwogICBtX3J0Q2FwdGlvbi5SZXNldCgpOwpAQCAtNDcsNyArNDcsNyBAQAogICByZXR1cm4gRldMX1R5cGU6OkNoZWNrQm94OwogfQogCi12b2lkIENGV0xfQ2hlY2tCb3g6OlNldEJveFNpemUoRlhfRkxPQVQgZkhlaWdodCkgewordm9pZCBDRldMX0NoZWNrQm94OjpTZXRCb3hTaXplKGZsb2F0IGZIZWlnaHQpIHsKICAgbV9mQm94SGVpZ2h0ID0gZkhlaWdodDsKIH0KIApAQCAtNjEsOCArNjEsOCBAQAogICBMYXlvdXQoKTsKIH0KIAotdm9pZCBDRldMX0NoZWNrQm94OjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKK3ZvaWQgQ0ZXTF9DaGVja0JveDo6RHJhd1dpZGdldChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7CiAgIGlmICghcEdyYXBoaWNzKQogICAgIHJldHVybjsKICAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKQpAQCAtNzEsNyArNzEsNyBAQAogICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7CiAgIGlmIChIYXNCb3JkZXIoKSkgewogICAgIERyYXdCb3JkZXIocEdyYXBoaWNzLCBDRldMX1BhcnQ6OkJvcmRlciwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwKLSAgICAgICAgICAgICAgIHBNYXRyaXgpOworICAgICAgICAgICAgICAgbWF0cml4KTsKICAgfQogCiAgIGludDMyX3QgZHdTdGF0ZXMgPSBHZXRQYXJ0U3RhdGVzKCk7CkBAIC04MSw4ICs4MSw3IEBACiAgIHBhcmFtLm1faVBhcnQgPSBDRldMX1BhcnQ6OkJhY2tncm91bmQ7CiAgIHBhcmFtLm1fZHdTdGF0ZXMgPSBkd1N0YXRlczsKICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7Ci0gIGlmIChwTWF0cml4KQotICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7CisgIHBhcmFtLm1fbWF0cml4LkNvbmNhdChtYXRyaXgpOwogICBwYXJhbS5tX3J0UGFydCA9IG1fcnRDbGllbnQ7CiAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpCiAgICAgcGFyYW0ubV9wRGF0YSA9ICZtX3J0Rm9jdXM7CkBAIC05Nyw4ICs5Niw3IEBACiAgIHRleHRQYXJhbS5tX2lQYXJ0ID0gQ0ZXTF9QYXJ0OjpDYXB0aW9uOwogICB0ZXh0UGFyYW0ubV9kd1N0YXRlcyA9IGR3U3RhdGVzOwogICB0ZXh0UGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7Ci0gIGlmIChwTWF0cml4KQotICAgIHRleHRQYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOworICB0ZXh0UGFyYW0ubV9tYXRyaXguQ29uY2F0KG1hdHJpeCk7CiAgIHRleHRQYXJhbS5tX3J0UGFydCA9IG1fcnRDYXB0aW9uOwogICB0ZXh0UGFyYW0ubV93c1RleHQgPSBMIkNoZWNrIGJveCI7CiAgIHRleHRQYXJhbS5tX2R3VFRPU3R5bGVzID0gbV9kd1RUT1N0eWxlczsKQEAgLTEyOSw3ICsxMjcsNyBAQAogICAgICAgRlhTWVNfcm91bmQobV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC5oZWlnaHQpOwogICBtX3J0Q2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwogCi0gIEZYX0ZMT0FUIGZUZXh0TGVmdCA9IG1fcnRDbGllbnQubGVmdCArIG1fZkJveEhlaWdodDsKKyAgZmxvYXQgZlRleHRMZWZ0ID0gbV9ydENsaWVudC5sZWZ0ICsgbV9mQm94SGVpZ2h0OwogICBtX3J0Qm94ID0gQ0ZYX1JlY3RGKG1fcnRDbGllbnQuVG9wTGVmdCgpLCBtX2ZCb3hIZWlnaHQsIG1fZkJveEhlaWdodCk7CiAgIG1fcnRDYXB0aW9uID0gQ0ZYX1JlY3RGKGZUZXh0TGVmdCwgbV9ydENsaWVudC50b3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQucmlnaHQoKSAtIGZUZXh0TGVmdCwgbV9ydENsaWVudC5oZWlnaHQpOwpAQCAtMTcwLDkgKzE2OCwxMCBAQAogfQogCiB2b2lkIENGV0xfQ2hlY2tCb3g6OlVwZGF0ZVRleHRPdXRTdHlsZXMoKSB7Ci0gIG1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9Ub3BMZWZ0OwotICBtX2R3VFRPU3R5bGVzID0gMDsKLSAgbV9kd1RUT1N0eWxlcyB8PSBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsKKyAgbV9pVFRPQWxpZ24gPSBGREVfVGV4dEFsaWdubWVudDo6a1RvcExlZnQ7CisKKyAgbV9kd1RUT1N0eWxlcy5SZXNldCgpOworICBtX2R3VFRPU3R5bGVzLnNpbmdsZV9saW5lXyA9IHRydWU7CiB9CiAKIHZvaWQgQ0ZXTF9DaGVja0JveDo6TmV4dFN0YXRlcygpIHsKQEAgLTE4NCw3ICsxODMsNyBAQAogICAgICAgaWYgKCFwV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7CiAgICAgICAgIHN0ZDo6dmVjdG9yPENGV0xfV2lkZ2V0Kj4gcmFkaW9hcnIgPQogICAgICAgICAgICAgcFdpZGdldE1nci0+R2V0U2FtZUdyb3VwUmFkaW9CdXR0b24odGhpcyk7Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byYgcFdpZGdldCA6IHJhZGlvYXJyKSB7CisgICAgICAgIGZvciAoYXV0byogcFdpZGdldCA6IHJhZGlvYXJyKSB7CiAgICAgICAgICAgQ0ZXTF9DaGVja0JveCogcENoZWNrQm94ID0gc3RhdGljX2Nhc3Q8Q0ZXTF9DaGVja0JveCo+KHBXaWRnZXQpOwogICAgICAgICAgIGlmIChwQ2hlY2tCb3ggIT0gdGhpcyAmJgogICAgICAgICAgICAgICBwQ2hlY2tCb3gtPkdldFN0YXRlcygpICYgRldMX1NUQVRFX0NLQl9DaGVja2VkKSB7CkBAIC0yNjYsOSArMjY1LDkgQEAKICAgQ0ZXTF9XaWRnZXQ6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOwogfQogCi12b2lkIENGV0xfQ2hlY2tCb3g6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgRHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOwordm9pZCBDRldMX0NoZWNrQm94OjpPbkRyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7CisgIERyYXdXaWRnZXQocEdyYXBoaWNzLCBtYXRyaXgpOwogfQogCiB2b2lkIENGV0xfQ2hlY2tCb3g6Ok9uRm9jdXNDaGFuZ2VkKGJvb2wgYlNldCkgewpkaWZmIC0tZ2l0IGEveGZhL2Z3bC9jZndsX2NoZWNrYm94LmggYi94ZmEvZndsL2Nmd2xfY2hlY2tib3guaAppbmRleCA2ZGY3NDQwLi45YWU2NTkwIDEwMDY0NAotLS0gYS94ZmEvZndsL2Nmd2xfY2hlY2tib3guaAorKysgYi94ZmEvZndsL2Nmd2xfY2hlY2tib3guaApAQCAtNDEsMTMgKzQxLDEzIEBACiAgIC8vIENGV0xfV2lkZ2V0CiAgIEZXTF9UeXBlIEdldENsYXNzSUQoKSBjb25zdCBvdmVycmlkZTsKICAgdm9pZCBVcGRhdGUoKSBvdmVycmlkZTsKLSAgdm9pZCBEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSBvdmVycmlkZTsKKyAgdm9pZCBEcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSBvdmVycmlkZTsKIAogICB2b2lkIE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSBvdmVycmlkZTsKKyAgdm9pZCBPbkRyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIG92ZXJyaWRlOwogCi0gIHZvaWQgU2V0Qm94U2l6ZShGWF9GTE9BVCBmSGVpZ2h0KTsKKyAgdm9pZCBTZXRCb3hTaXplKGZsb2F0IGZIZWlnaHQpOwogCiAgcHJpdmF0ZToKICAgdm9pZCBTZXRDaGVja1N0YXRlKGludDMyX3QgaUNoZWNrKTsKQEAgLTY2LDEwICs2NiwxMCBAQAogICBDRlhfUmVjdEYgbV9ydEJveDsKICAgQ0ZYX1JlY3RGIG1fcnRDYXB0aW9uOwogICBDRlhfUmVjdEYgbV9ydEZvY3VzOwotICB1aW50MzJfdCBtX2R3VFRPU3R5bGVzOwotICBpbnQzMl90IG1faVRUT0FsaWduOworICBGREVfVGV4dFN0eWxlIG1fZHdUVE9TdHlsZXM7CisgIEZERV9UZXh0QWxpZ25tZW50IG1faVRUT0FsaWduOwogICBib29sIG1fYkJ0bkRvd247Ci0gIEZYX0ZMT0FUIG1fZkJveEhlaWdodDsKKyAgZmxvYXQgbV9mQm94SGVpZ2h0OwogfTsKIAogI2VuZGlmICAvLyBYRkFfRldMX0NGV0xfQ0hFQ0tCT1hfSF8KZGlmZiAtLWdpdCBhL3hmYS9md2wvY2Z3bF9jb21ib2JveC5jcHAgYi94ZmEvZndsL2Nmd2xfY29tYm9ib3guY3BwCmluZGV4IDYwODM5NDMuLjE0M2Q3OTcgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvY2Z3bF9jb21ib2JveC5jcHAKKysrIGIveGZhL2Z3bC9jZndsX2NvbWJvYm94LmNwcApAQCAtMTEsOCArMTEsOCBAQAogI2luY2x1ZGUgPHV0aWxpdHk+CiAKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jZmRlX3R4dGVkdGVuZ2luZS5oIgotI2luY2x1ZGUgInhmYS9mZGUvdHRvL2ZkZV90ZXh0b3V0LmgiCisjaW5jbHVkZSAieGZhL2ZkZS9jZmRlX3RleHRlZGl0ZW5naW5lLmgiCisjaW5jbHVkZSAieGZhL2ZkZS9jZmRlX3RleHRvdXQuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfYXBwLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2V2ZW50LmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2V2ZW50c2VsZWN0Y2hhbmdlZC5oIgpAQCAtNDksMTIgKzQ5LDEyIEBACiAgIGF1dG8gcHJvcCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRldMX1dpZGdldFByb3BlcnRpZXM+KCk7CiAgIHByb3AtPm1fcFRoZW1lUHJvdmlkZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOwogICBwcm9wLT5tX2R3U3R5bGVzIHw9IEZXTF9XR1RTVFlMRV9Cb3JkZXIgfCBGV0xfV0dUU1RZTEVfVlNjcm9sbDsKLSAgbV9wTGlzdEJveCA9Ci0gICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZXTF9Db21ib0xpc3Q+KG1fcE93bmVyQXBwLCBzdGQ6Om1vdmUocHJvcCksIHRoaXMpOworICBtX3BMaXN0Qm94ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfQ29tYm9MaXN0PihtX3BPd25lckFwcC5HZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHByb3ApLCB0aGlzKTsKIAogICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfQ01CX0Ryb3BEb3duKSAmJiAhbV9wRWRpdCkgewogICAgIG1fcEVkaXQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZXTF9Db21ib0VkaXQ+KAotICAgICAgICBtX3BPd25lckFwcCwgcGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfV2lkZ2V0UHJvcGVydGllcz4oKSwgdGhpcyk7CisgICAgICAgIG1fcE93bmVyQXBwLkdldCgpLCBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZXTF9XaWRnZXRQcm9wZXJ0aWVzPigpLCB0aGlzKTsKICAgICBtX3BFZGl0LT5TZXRPdXRlcih0aGlzKTsKICAgfQogICBpZiAobV9wRWRpdCkKQEAgLTY5LDcgKzY5LDcgQEAKICAgcmV0dXJuIEZXTF9UeXBlOjpDb21ib0JveDsKIH0KIAotdm9pZCBDRldMX0NvbWJvQm94OjpBZGRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RleHQpIHsKK3ZvaWQgQ0ZXTF9Db21ib0JveDo6QWRkU3RyaW5nKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c1RleHQpIHsKICAgbV9wTGlzdEJveC0+QWRkU3RyaW5nKHdzVGV4dCk7CiB9CiAKQEAgLTkyLDcgKzkyLDggQEAKICAgYm9vbCBiUmVtb3ZlRHJvcERvd24gPSAhIShkd1N0eWxlc0V4UmVtb3ZlZCAmIEZXTF9TVFlMRUVYVF9DTUJfRHJvcERvd24pOwogICBpZiAoYkFkZERyb3BEb3duICYmICFtX3BFZGl0KSB7CiAgICAgbV9wRWRpdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRldMX0NvbWJvRWRpdD4oCi0gICAgICAgIG1fcE93bmVyQXBwLCBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZXTF9XaWRnZXRQcm9wZXJ0aWVzPigpLCBudWxscHRyKTsKKyAgICAgICAgbV9wT3duZXJBcHAuR2V0KCksIHBkZml1bTo6TWFrZVVuaXF1ZTxDRldMX1dpZGdldFByb3BlcnRpZXM+KCksCisgICAgICAgIG51bGxwdHIpOwogICAgIG1fcEVkaXQtPlNldE91dGVyKHRoaXMpOwogICAgIG1fcEVkaXQtPlNldFBhcmVudCh0aGlzKTsKICAgfSBlbHNlIGlmIChiUmVtb3ZlRHJvcERvd24gJiYgbV9wRWRpdCkgewpAQCAtMTI0LDEwICsxMjUsMTAgQEAKICAgcmV0dXJuIENGV0xfV2lkZ2V0OjpIaXRUZXN0KHBvaW50KTsKIH0KIAotdm9pZCBDRldMX0NvbWJvQm94OjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKK3ZvaWQgQ0ZXTF9Db21ib0JveDo6RHJhd1dpZGdldChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7CiAgIGlmIChtX3BXaWRnZXRNZ3ItPklzRm9ybURpc2FibGVkKCkpIHsKLSAgICBEaXNGb3JtX0RyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsKKyAgICBEaXNGb3JtX0RyYXdXaWRnZXQocEdyYXBoaWNzLCAmbWF0cml4KTsKICAgICByZXR1cm47CiAgIH0KIApAQCAtMTM4LDcgKzEzOSw3IEBACiAKICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOwogICBpZiAoSGFzQm9yZGVyKCkpCi0gICAgRHJhd0JvcmRlcihwR3JhcGhpY3MsIENGV0xfUGFydDo6Qm9yZGVyLCBwVGhlbWUsIHBNYXRyaXgpOworICAgIERyYXdCb3JkZXIocEdyYXBoaWNzLCBDRldMX1BhcnQ6OkJvcmRlciwgcFRoZW1lLCBtYXRyaXgpOwogCiAgIGlmICghSXNEcm9wRG93blN0eWxlKCkpIHsKICAgICBDRlhfUmVjdEYgcnRUZXh0QmsobV9ydENsaWVudCk7CkBAIC0xNDgsOCArMTQ5LDcgQEAKICAgICBwYXJhbS5tX3BXaWRnZXQgPSB0aGlzOwogICAgIHBhcmFtLm1faVBhcnQgPSBDRldMX1BhcnQ6OkJhY2tncm91bmQ7CiAgICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7Ci0gICAgaWYgKHBNYXRyaXgpCi0gICAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOworICAgIHBhcmFtLm1fbWF0cml4LkNvbmNhdChtYXRyaXgpOwogICAgIHBhcmFtLm1fcnRQYXJ0ID0gcnRUZXh0Qms7CiAKICAgICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9EaXNhYmxlZCkgewpAQCAtMTczLDE0ICsxNzMsMTQgQEAKICAgICAgIHRoZW1lX3RleHQubV9pUGFydCA9IENGV0xfUGFydDo6Q2FwdGlvbjsKICAgICAgIHRoZW1lX3RleHQubV9kd1N0YXRlcyA9IG1faUJ0blN0YXRlOwogICAgICAgdGhlbWVfdGV4dC5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsKLSAgICAgIHRoZW1lX3RleHQubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsKKyAgICAgIHRoZW1lX3RleHQubV9tYXRyaXguQ29uY2F0KG1hdHJpeCk7CiAgICAgICB0aGVtZV90ZXh0Lm1fcnRQYXJ0ID0gcnRUZXh0Qms7CiAgICAgICB0aGVtZV90ZXh0Lm1fZHdTdGF0ZXMgPSAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ0ZXTF9QYXJ0U3RhdGVfU2VsZWN0ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENGV0xfUGFydFN0YXRlX05vcm1hbDsKICAgICAgIHRoZW1lX3RleHQubV93c1RleHQgPSBoSXRlbSA/IGhJdGVtLT5HZXRUZXh0KCkgOiBMIiI7Ci0gICAgICB0aGVtZV90ZXh0Lm1fZHdUVE9TdHlsZXMgPSBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsKLSAgICAgIHRoZW1lX3RleHQubV9pVFRPQWxpZ24gPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlckxlZnQ7CisgICAgICB0aGVtZV90ZXh0Lm1fZHdUVE9TdHlsZXMuc2luZ2xlX2xpbmVfID0gdHJ1ZTsKKyAgICAgIHRoZW1lX3RleHQubV9pVFRPQWxpZ24gPSBGREVfVGV4dEFsaWdubWVudDo6a0NlbnRlckxlZnQ7CiAgICAgICBwVGhlbWUtPkRyYXdUZXh0KCZ0aGVtZV90ZXh0KTsKICAgICB9CiAgIH0KQEAgLTE5Miw3ICsxOTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgID8gQ0ZXTF9QYXJ0U3RhdGVfRGlzYWJsZWQKICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1faUJ0blN0YXRlOwogICBwYXJhbS5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsKLSAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsKKyAgcGFyYW0ubV9tYXRyaXguQ29uY2F0KG1hdHJpeCk7CiAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydEJ0bjsKICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOwogfQpAQCAtMjA4LDcgKzIwOCw3IEBACiAgICAgbV9wRWRpdC0+U2V0VGhlbWVQcm92aWRlcihwVGhlbWVQcm92aWRlcik7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENGV0xfQ29tYm9Cb3g6OkdldFRleHRCeUluZGV4KGludDMyX3QgaUluZGV4KSBjb25zdCB7CitXaWRlU3RyaW5nIENGV0xfQ29tYm9Cb3g6OkdldFRleHRCeUluZGV4KGludDMyX3QgaUluZGV4KSBjb25zdCB7CiAgIENGV0xfTGlzdEl0ZW0qIHBJdGVtID0gc3RhdGljX2Nhc3Q8Q0ZXTF9MaXN0SXRlbSo+KAogICAgICAgbV9wTGlzdEJveC0+R2V0SXRlbShtX3BMaXN0Qm94LmdldCgpLCBpSW5kZXgpKTsKICAgcmV0dXJuIHBJdGVtID8gcEl0ZW0tPkdldFRleHQoKSA6IEwiIjsKQEAgLTIxOSw3ICsyMTksNyBAQAogICBib29sIGJDbGVhclNlbCA9IGlTZWwgPCAwIHx8IGlTZWwgPj0gaUNvdW50OwogICBpZiAoSXNEcm9wRG93blN0eWxlKCkgJiYgbV9wRWRpdCkgewogICAgIGlmIChiQ2xlYXJTZWwpIHsKLSAgICAgIG1fcEVkaXQtPlNldFRleHQoQ0ZYX1dpZGVTdHJpbmcoKSk7CisgICAgICBtX3BFZGl0LT5TZXRUZXh0KFdpZGVTdHJpbmcoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgIENGV0xfTGlzdEl0ZW0qIGhJdGVtID0gbV9wTGlzdEJveC0+R2V0SXRlbSh0aGlzLCBpU2VsKTsKICAgICAgIG1fcEVkaXQtPlNldFRleHQoaEl0ZW0gPyBoSXRlbS0+R2V0VGV4dCgpIDogTCIiKTsKQEAgLTI0NSw3ICsyNDUsNyBAQAogICBDRldMX1dpZGdldDo6UmVtb3ZlU3RhdGVzKGR3U3RhdGVzKTsKIH0KIAotdm9pZCBDRldMX0NvbWJvQm94OjpTZXRFZGl0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7Cit2b2lkIENGV0xfQ29tYm9Cb3g6OlNldEVkaXRUZXh0KGNvbnN0IFdpZGVTdHJpbmcmIHdzVGV4dCkgewogICBpZiAoIW1fcEVkaXQpCiAgICAgcmV0dXJuOwogCkBAIC0yNTMsNyArMjUzLDcgQEAKICAgbV9wRWRpdC0+VXBkYXRlKCk7CiB9CiAKLUNGWF9XaWRlU3RyaW5nIENGV0xfQ29tYm9Cb3g6OkdldEVkaXRUZXh0KCkgY29uc3QgeworV2lkZVN0cmluZyBDRldMX0NvbWJvQm94OjpHZXRFZGl0VGV4dCgpIGNvbnN0IHsKICAgaWYgKG1fcEVkaXQpCiAgICAgcmV0dXJuIG1fcEVkaXQtPkdldFRleHQoKTsKICAgaWYgKCFtX3BMaXN0Qm94KQpAQCAtMjg3LDcgKzI4Nyw3IEBACiAgICAgbV9wRWRpdC0+TW9kaWZ5U3R5bGVzRXgoZHdTdHlsZXNFeEFkZGVkLCBkd1N0eWxlc0V4UmVtb3ZlZCk7CiB9CiAKLXZvaWQgQ0ZXTF9Db21ib0JveDo6RHJhd1N0cmV0Y2hIYW5kbGVyKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAordm9pZCBDRldMX0NvbWJvQm94OjpEcmF3U3RyZXRjaEhhbmRsZXIoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewogICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsKICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7CkBAIC0zNDgsNyArMzQ4LDcgQEAKIH0KIAogdm9pZCBDRldMX0NvbWJvQm94OjpNYXRjaEVkaXRUZXh0KCkgewotICBDRlhfV2lkZVN0cmluZyB3c1RleHQgPSBtX3BFZGl0LT5HZXRUZXh0KCk7CisgIFdpZGVTdHJpbmcgd3NUZXh0ID0gbV9wRWRpdC0+R2V0VGV4dCgpOwogICBpbnQzMl90IGlNYXRjaCA9IG1fcExpc3RCb3gtPk1hdGNoSXRlbSh3c1RleHQpOwogICBpZiAoaU1hdGNoICE9IG1faUN1clNlbCkgewogICAgIG1fcExpc3RCb3gtPkNoYW5nZVNlbGVjdGVkKGlNYXRjaCk7CkBAIC0zNzYsNyArMzc2LDcgQEAKICAgaWYgKCF0aGVtZSkKICAgICByZXR1cm47CiAKLSAgRlhfRkxPQVQgZkJ0biA9IHRoZW1lLT5HZXRTY3JvbGxCYXJXaWR0aCgpOworICBmbG9hdCBmQnRuID0gdGhlbWUtPkdldFNjcm9sbEJhcldpZHRoKCk7CiAgIG1fcnRCdG4gPSBDRlhfUmVjdEYobV9ydENsaWVudC5yaWdodCgpIC0gZkJ0biwgbV9ydENsaWVudC50b3AsIGZCdG4sCiAgICAgICAgICAgICAgICAgICAgICAgbV9ydENsaWVudC5oZWlnaHQpOwogICBpZiAoIUlzRHJvcERvd25TdHlsZSgpIHx8ICFtX3BFZGl0KQpAQCAtNDk2LDggKzQ5Niw4IEBACiAKICAgLy8gVE9ETyhkc2luY2xhaXIpOiBEb2VzIHRoaXMgbGVhaz8gSSBkb24ndCBzZWUgYSBkZWxldGUsIGJ1dCBJJ20gbm90IHN1cmUKICAgLy8gaWYgdGhlIFNldFBhcmVudCBjYWxsIGlzIGdvaW5nIHRvIHRyYW5zZmVyIG93bmVyc2hpcC4KLSAgbV9wQ29tYm9Cb3hQcm94eSA9IG5ldyBDRldMX0NvbWJvQm94UHJveHkodGhpcywgbV9wT3duZXJBcHAsIHN0ZDo6bW92ZShwcm9wKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wTGlzdEJveC5nZXQoKSk7CisgIG1fcENvbWJvQm94UHJveHkgPSBuZXcgQ0ZXTF9Db21ib0JveFByb3h5KHRoaXMsIG1fcE93bmVyQXBwLkdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocHJvcCksIG1fcExpc3RCb3guZ2V0KCkpOwogICBtX3BMaXN0Qm94LT5TZXRQYXJlbnQobV9wQ29tYm9Cb3hQcm94eSk7CiB9CiAKQEAgLTUxMCw4ICs1MTAsOCBAQAogICBwcm9wLT5tX2R3U3R5bGVzID0gRldMX1dHVFNUWUxFX0JvcmRlciB8IEZXTF9XR1RTVFlMRV9WU2Nyb2xsOwogICBwcm9wLT5tX2R3U3RhdGVzID0gRldMX1dHVFNUQVRFX0ludmlzaWJsZTsKICAgcHJvcC0+bV9wVGhlbWVQcm92aWRlciA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7Ci0gIG1fcExpc3RCb3ggPQotICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfQ29tYm9MaXN0PihtX3BPd25lckFwcCwgc3RkOjptb3ZlKHByb3ApLCB0aGlzKTsKKyAgbV9wTGlzdEJveCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRldMX0NvbWJvTGlzdD4obV9wT3duZXJBcHAuR2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwcm9wKSwgdGhpcyk7CiB9CiAKIHZvaWQgQ0ZXTF9Db21ib0JveDo6RGlzRm9ybV9Jbml0Q29tYm9FZGl0KCkgewpAQCAtNTIyLDggKzUyMiw4IEBACiAgIHByb3AtPm1fcFBhcmVudCA9IHRoaXM7CiAgIHByb3AtPm1fcFRoZW1lUHJvdmlkZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOwogCi0gIG1fcEVkaXQgPQotICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfQ29tYm9FZGl0PihtX3BPd25lckFwcCwgc3RkOjptb3ZlKHByb3ApLCB0aGlzKTsKKyAgbV9wRWRpdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRldMX0NvbWJvRWRpdD4obV9wT3duZXJBcHAuR2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwcm9wKSwgdGhpcyk7CiAgIG1fcEVkaXQtPlNldE91dGVyKHRoaXMpOwogfQogCkBAIC01NDMsMTMgKzU0MywxMyBAQAogICAgIFJlc2V0TGlzdEl0ZW1BbGlnbm1lbnQoKTsKICAgICBwQ29tYm9MaXN0LT5DaGFuZ2VTZWxlY3RlZChtX2lDdXJTZWwpOwogCi0gICAgRlhfRkxPQVQgZkl0ZW1IZWlnaHQgPSBwQ29tYm9MaXN0LT5DYWxjSXRlbUhlaWdodCgpOwotICAgIEZYX0ZMT0FUIGZCb3JkZXIgPSBHZXRCb3JkZXJTaXplKHRydWUpOwotICAgIEZYX0ZMT0FUIGZQb3B1cE1pbiA9IDAuMGY7CisgICAgZmxvYXQgZkl0ZW1IZWlnaHQgPSBwQ29tYm9MaXN0LT5DYWxjSXRlbUhlaWdodCgpOworICAgIGZsb2F0IGZCb3JkZXIgPSBHZXRCb3JkZXJTaXplKHRydWUpOworICAgIGZsb2F0IGZQb3B1cE1pbiA9IDAuMGY7CiAgICAgaWYgKGlJdGVtcyA+IDMpCiAgICAgICBmUG9wdXBNaW4gPSBmSXRlbUhlaWdodCAqIDMgKyBmQm9yZGVyICogMjsKIAotICAgIEZYX0ZMT0FUIGZQb3B1cE1heCA9IGZJdGVtSGVpZ2h0ICogaUl0ZW1zICsgZkJvcmRlciAqIDI7CisgICAgZmxvYXQgZlBvcHVwTWF4ID0gZkl0ZW1IZWlnaHQgKiBpSXRlbXMgKyBmQm9yZGVyICogMjsKICAgICBDRlhfUmVjdEYgcnRMaXN0KG1fcnRDbGllbnQubGVmdCwgMCwgbV9wUHJvcGVydGllcy0+bV9ydFdpZGdldC53aWR0aCwgMCk7CiAgICAgR2V0UG9wdXBQb3MoZlBvcHVwTWluLCBmUG9wdXBNYXgsIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQsIHJ0TGlzdCk7CiAKQEAgLTYxNCwxMCArNjE0LDEwIEBACiAgIHJldHVybiBGV0xfV2lkZ2V0SGl0OjpVbmtub3duOwogfQogCi12b2lkIENGV0xfQ29tYm9Cb3g6OkRpc0Zvcm1fRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKK3ZvaWQgQ0ZXTF9Db21ib0JveDo6RGlzRm9ybV9EcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOwotICBDRlhfTWF0cml4IG10T3JnKDEsIDAsIDAsIDEsIDAsIDApOworICBDRlhfTWF0cml4IG10T3JnOwogICBpZiAocE1hdHJpeCkKICAgICBtdE9yZyA9ICpwTWF0cml4OwogCkBAIC02MzgsMTMgKzYzOCwxMyBAQAogICAgIENGWF9SZWN0RiBydEVkaXQgPSBtX3BFZGl0LT5HZXRXaWRnZXRSZWN0KCk7CiAgICAgQ0ZYX01hdHJpeCBtdCgxLCAwLCAwLCAxLCBydEVkaXQubGVmdCwgcnRFZGl0LnRvcCk7CiAgICAgbXQuQ29uY2F0KG10T3JnKTsKLSAgICBtX3BFZGl0LT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgJm10KTsKKyAgICBtX3BFZGl0LT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgbXQpOwogICB9CiAgIGlmIChtX3BMaXN0Qm94ICYmIERpc0Zvcm1fSXNEcm9wTGlzdFZpc2libGUoKSkgewogICAgIENGWF9SZWN0RiBydExpc3QgPSBtX3BMaXN0Qm94LT5HZXRXaWRnZXRSZWN0KCk7CiAgICAgQ0ZYX01hdHJpeCBtdCgxLCAwLCAwLCAxLCBydExpc3QubGVmdCwgcnRMaXN0LnRvcCk7CiAgICAgbXQuQ29uY2F0KG10T3JnKTsKLSAgICBtX3BMaXN0Qm94LT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgJm10KTsKKyAgICBtX3BMaXN0Qm94LT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgbXQpOwogICB9CiB9CiAKQEAgLTY2Niw4ICs2NjYsOCBAQAogICBpZiAoIXRoZW1lKQogICAgIHJldHVybjsKIAotICBGWF9GTE9BVCBib3JkZXJXaWR0aCA9IDE7Ci0gIEZYX0ZMT0FUIGZCdG4gPSB0aGVtZS0+R2V0U2Nyb2xsQmFyV2lkdGgoKTsKKyAgZmxvYXQgYm9yZGVyV2lkdGggPSAxOworICBmbG9hdCBmQnRuID0gdGhlbWUtPkdldFNjcm9sbEJhcldpZHRoKCk7CiAgIGlmICghKEdldFN0eWxlc0V4KCkgJiBGV0xfU1RZTEVFWFRfQ01CX1JlYWRPbmx5KSkgewogICAgIG1fcnRCdG4gPQogICAgICAgICBDRlhfUmVjdEYobV9ydENsaWVudC5yaWdodCgpIC0gZkJ0biwgbV9ydENsaWVudC50b3AgKyBib3JkZXJXaWR0aCwKQEAgLTc1NSw5ICs3NTUsOSBAQAogICB9CiB9CiAKLXZvaWQgQ0ZXTF9Db21ib0JveDo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBEcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7Cit2b2lkIENGV0xfQ29tYm9Cb3g6Ok9uRHJhd1dpZGdldChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKKyAgRHJhd1dpZGdldChwR3JhcGhpY3MsIG1hdHJpeCk7CiB9CiAKIHZvaWQgQ0ZXTF9Db21ib0JveDo6T25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlKiBwTXNnLCBib29sIGJTZXQpIHsKQEAgLTg2MSw3ICs4NjEsNyBAQAogICAgIGludDMyX3QgaUN1clNlbCA9IG1faUN1clNlbDsKICAgICBib29sIGJEcm9wRG93biA9IElzRHJvcERvd25TdHlsZSgpOwogICAgIGlmIChiRHJvcERvd24gJiYgbV9wRWRpdCkgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0ID0gbV9wRWRpdC0+R2V0VGV4dCgpOworICAgICAgV2lkZVN0cmluZyB3c1RleHQgPSBtX3BFZGl0LT5HZXRUZXh0KCk7CiAgICAgICBpQ3VyU2VsID0gbV9wTGlzdEJveC0+TWF0Y2hJdGVtKHdzVGV4dCk7CiAgICAgICBpZiAoaUN1clNlbCA+PSAwKSB7CiAgICAgICAgIENGV0xfTGlzdEl0ZW0qIGhJdGVtID0gbV9wTGlzdEJveC0+R2V0SXRlbSh0aGlzLCBpQ3VyU2VsKTsKQEAgLTk5MCw3ICs5OTAsNyBAQAogICAgIGJvb2wgYk1hdGNoRXF1YWwgPSBmYWxzZTsKICAgICBpbnQzMl90IGlDdXJTZWwgPSBtX2lDdXJTZWw7CiAgICAgaWYgKG1fcEVkaXQpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dCA9IG1fcEVkaXQtPkdldFRleHQoKTsKKyAgICAgIFdpZGVTdHJpbmcgd3NUZXh0ID0gbV9wRWRpdC0+R2V0VGV4dCgpOwogICAgICAgaUN1clNlbCA9IHBDb21ib0xpc3QtPk1hdGNoSXRlbSh3c1RleHQpOwogICAgICAgaWYgKGlDdXJTZWwgPj0gMCkgewogICAgICAgICBDRldMX0xpc3RJdGVtKiBpdGVtID0gbV9wTGlzdEJveC0+R2V0U2VsSXRlbShpQ3VyU2VsKTsKZGlmZiAtLWdpdCBhL3hmYS9md2wvY2Z3bF9jb21ib2JveC5oIGIveGZhL2Z3bC9jZndsX2NvbWJvYm94LmgKaW5kZXggMTY4ZTIwMy4uYTlkYzYzNSAxMDA2NDQKLS0tIGEveGZhL2Z3bC9jZndsX2NvbWJvYm94LmgKKysrIGIveGZhL2Z3bC9jZndsX2NvbWJvYm94LmgKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfY29tYm9saXN0LmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2Zvcm0uaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfbGlzdGJveC5oIgotI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2NmeF9ncmFwaGljcy5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ3JhcGhpY3MuaCIKIAogY2xhc3MgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzOwogY2xhc3MgQ0ZXTF9Db21ib0JveDsKQEAgLTUyLDIzICs1MiwyMyBAQAogICB2b2lkIFJlbW92ZVN0YXRlcyh1aW50MzJfdCBkd1N0YXRlcykgb3ZlcnJpZGU7CiAgIHZvaWQgVXBkYXRlKCkgb3ZlcnJpZGU7CiAgIEZXTF9XaWRnZXRIaXQgSGl0VGVzdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7Ci0gIHZvaWQgRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgb3ZlcnJpZGU7CisgIHZvaWQgRHJhd1dpZGdldChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgb3ZlcnJpZGU7CiAgIHZvaWQgU2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZVByb3ZpZGVyKSBvdmVycmlkZTsKICAgdm9pZCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIG92ZXJyaWRlOwogICB2b2lkIE9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSBvdmVycmlkZTsKKyAgdm9pZCBPbkRyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIG92ZXJyaWRlOwogCi0gIENGWF9XaWRlU3RyaW5nIEdldFRleHRCeUluZGV4KGludDMyX3QgaUluZGV4KSBjb25zdDsKKyAgV2lkZVN0cmluZyBHZXRUZXh0QnlJbmRleChpbnQzMl90IGlJbmRleCkgY29uc3Q7CiAgIGludDMyX3QgR2V0Q3VyU2VsKCkgY29uc3QgeyByZXR1cm4gbV9pQ3VyU2VsOyB9CiAgIHZvaWQgU2V0Q3VyU2VsKGludDMyX3QgaVNlbCk7CiAKLSAgdm9pZCBBZGRTdHJpbmcoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RleHQpOworICB2b2lkIEFkZFN0cmluZyhjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NUZXh0KTsKICAgdm9pZCBSZW1vdmVBdChpbnQzMl90IGlJbmRleCk7CiAgIHZvaWQgUmVtb3ZlQWxsKCk7CiAKLSAgdm9pZCBTZXRFZGl0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0RWRpdFRleHQoKSBjb25zdDsKKyAgdm9pZCBTZXRFZGl0VGV4dChjb25zdCBXaWRlU3RyaW5nJiB3c1RleHQpOworICBXaWRlU3RyaW5nIEdldEVkaXRUZXh0KCkgY29uc3Q7CiAKICAgdm9pZCBPcGVuRHJvcERvd25MaXN0KGJvb2wgYkFjdGl2YXRlKTsKIApAQCAtNzYsMjYgKzc2LDI0IEBACiAgIGJvb2wgRWRpdENhblJlZG8oKSBjb25zdCB7IHJldHVybiBtX3BFZGl0LT5DYW5SZWRvKCk7IH0KICAgYm9vbCBFZGl0VW5kbygpIHsgcmV0dXJuIG1fcEVkaXQtPlVuZG8oKTsgfQogICBib29sIEVkaXRSZWRvKCkgeyByZXR1cm4gbV9wRWRpdC0+UmVkbygpOyB9Ci0gIGJvb2wgRWRpdENhbkNvcHkoKSBjb25zdCB7IHJldHVybiBtX3BFZGl0LT5Db3VudFNlbFJhbmdlcygpID4gMDsgfQorICBib29sIEVkaXRDYW5Db3B5KCkgY29uc3QgeyByZXR1cm4gbV9wRWRpdC0+SGFzU2VsZWN0aW9uKCk7IH0KICAgYm9vbCBFZGl0Q2FuQ3V0KCkgY29uc3QgewogICAgIGlmIChtX3BFZGl0LT5HZXRTdHlsZXNFeCgpICYgRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seSkKICAgICAgIHJldHVybiBmYWxzZTsKICAgICByZXR1cm4gRWRpdENhbkNvcHkoKTsKICAgfQogICBib29sIEVkaXRDYW5TZWxlY3RBbGwoKSBjb25zdCB7IHJldHVybiBtX3BFZGl0LT5HZXRUZXh0TGVuZ3RoKCkgPiAwOyB9Ci0gIGJvb2wgRWRpdENvcHkoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29weSkgY29uc3QgeyByZXR1cm4gbV9wRWRpdC0+Q29weSh3c0NvcHkpOyB9Ci0gIGJvb2wgRWRpdEN1dChDRlhfV2lkZVN0cmluZyYgd3NDdXQpIHsgcmV0dXJuIG1fcEVkaXQtPkN1dCh3c0N1dCk7IH0KLSAgYm9vbCBFZGl0UGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGFzdGUpIHsKLSAgICByZXR1cm4gbV9wRWRpdC0+UGFzdGUod3NQYXN0ZSk7Ci0gIH0KLSAgdm9pZCBFZGl0U2VsZWN0QWxsKCkgeyBtX3BFZGl0LT5BZGRTZWxSYW5nZSgwKTsgfQorICBPcHRpb25hbDxXaWRlU3RyaW5nPiBFZGl0Q29weSgpIGNvbnN0IHsgcmV0dXJuIG1fcEVkaXQtPkNvcHkoKTsgfQorICBPcHRpb25hbDxXaWRlU3RyaW5nPiBFZGl0Q3V0KCkgeyByZXR1cm4gbV9wRWRpdC0+Q3V0KCk7IH0KKyAgYm9vbCBFZGl0UGFzdGUoY29uc3QgV2lkZVN0cmluZyYgd3NQYXN0ZSkgeyByZXR1cm4gbV9wRWRpdC0+UGFzdGUod3NQYXN0ZSk7IH0KKyAgdm9pZCBFZGl0U2VsZWN0QWxsKCkgeyBtX3BFZGl0LT5TZWxlY3RBbGwoKTsgfQogICB2b2lkIEVkaXREZWxldGUoKSB7IG1fcEVkaXQtPkNsZWFyVGV4dCgpOyB9Ci0gIHZvaWQgRWRpdERlU2VsZWN0KCkgeyBtX3BFZGl0LT5DbGVhclNlbGVjdGlvbnMoKTsgfQorICB2b2lkIEVkaXREZVNlbGVjdCgpIHsgbV9wRWRpdC0+Q2xlYXJTZWxlY3Rpb24oKTsgfQogCiAgIENGWF9SZWN0RiBHZXRCQm94KCkgY29uc3Q7CiAgIHZvaWQgRWRpdE1vZGlmeVN0eWxlc0V4KHVpbnQzMl90IGR3U3R5bGVzRXhBZGRlZCwgdWludDMyX3QgZHdTdHlsZXNFeFJlbW92ZWQpOwogCi0gIHZvaWQgRHJhd1N0cmV0Y2hIYW5kbGVyKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKKyAgdm9pZCBEcmF3U3RyZXRjaEhhbmRsZXIoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKICAgYm9vbCBJc0Ryb3BMaXN0VmlzaWJsZSgpIGNvbnN0IHsKICAgICByZXR1cm4gbV9wQ29tYm9Cb3hQcm94eSAmJgogICAgICAgICAgICAhKG1fcENvbWJvQm94UHJveHktPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSk7CkBAIC0xMzYsNyArMTM0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3R5bGVzRXhSZW1vdmVkKTsKICAgdm9pZCBEaXNGb3JtX1VwZGF0ZSgpOwogICBGV0xfV2lkZ2V0SGl0IERpc0Zvcm1fSGl0VGVzdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7Ci0gIHZvaWQgRGlzRm9ybV9EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKKyAgdm9pZCBEaXNGb3JtX0RyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKICAgQ0ZYX1JlY3RGIERpc0Zvcm1fR2V0QkJveCgpIGNvbnN0OwogICB2b2lkIERpc0Zvcm1fTGF5b3V0KCk7CiAgIHZvaWQgRGlzRm9ybV9PblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEveGZhL2Z3bC9jZndsX2NvbWJvYm94cHJveHkuY3BwIGIveGZhL2Z3bC9jZndsX2NvbWJvYm94cHJveHkuY3BwCmluZGV4IDBlMjc3OWIuLmQxZGIxYzAgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvY2Z3bF9jb21ib2JveHByb3h5LmNwcAorKysgYi94ZmEvZndsL2Nmd2xfY29tYm9ib3hwcm94eS5jcHAKQEAgLTU4LDkgKzU4LDkgQEAKICAgQ0ZXTF9XaWRnZXQ6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOwogfQogCi12b2lkIENGV0xfQ29tYm9Cb3hQcm94eTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7Ci0gIG1fcENvbWJvQm94LT5EcmF3U3RyZXRjaEhhbmRsZXIocEdyYXBoaWNzLCBwTWF0cml4KTsKK3ZvaWQgQ0ZXTF9Db21ib0JveFByb3h5OjpPbkRyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKKyAgbV9wQ29tYm9Cb3gtPkRyYXdTdHJldGNoSGFuZGxlcihwR3JhcGhpY3MsICZtYXRyaXgpOwogfQogCiB2b2lkIENGV0xfQ29tYm9Cb3hQcm94eTo6T25MQnV0dG9uRG93bihDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7CmRpZmYgLS1naXQgYS94ZmEvZndsL2Nmd2xfY29tYm9ib3hwcm94eS5oIGIveGZhL2Z3bC9jZndsX2NvbWJvYm94cHJveHkuaAppbmRleCA0YmUxNGI5Li5iYjIxNzA3IDEwMDY0NAotLS0gYS94ZmEvZndsL2Nmd2xfY29tYm9ib3hwcm94eS5oCisrKyBiL3hmYS9md2wvY2Z3bF9jb21ib2JveHByb3h5LmgKQEAgLTIzLDggKzIzLDggQEAKIAogICAvLyBDRldMX0Zvcm1Qcm94eQogICB2b2lkIE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSBvdmVycmlkZTsKKyAgdm9pZCBPbkRyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIG92ZXJyaWRlOwogCiAgIHZvaWQgUmVzZXQoKSB7IG1fYkxCdXR0b25VcFNlbGYgPSBmYWxzZTsgfQogCmRpZmYgLS1naXQgYS94ZmEvZndsL2Nmd2xfY29tYm9lZGl0LmNwcCBiL3hmYS9md2wvY2Z3bF9jb21ib2VkaXQuY3BwCmluZGV4IDIyYWQ2YmYuLjRmYTEyNzcgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvY2Z3bF9jb21ib2VkaXQuY3BwCisrKyBiL3hmYS9md2wvY2Z3bF9jb21ib2VkaXQuY3BwCkBAIC05LDcgKzksNyBAQAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx1dGlsaXR5PgogCi0jaW5jbHVkZSAieGZhL2ZkZS9jZmRlX3R4dGVkdGVuZ2luZS5oIgorI2luY2x1ZGUgInhmYS9mZGUvY2ZkZV90ZXh0ZWRpdGVuZ2luZS5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9jb21ib2JveC5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9tZXNzYWdlbW91c2UuaCIKIApAQCAtMjIsMTQgKzIyLDEzIEBACiB9CiAKIHZvaWQgQ0ZXTF9Db21ib0VkaXQ6OkNsZWFyU2VsZWN0ZWQoKSB7Ci0gIENsZWFyU2VsZWN0aW9ucygpOworICBDbGVhclNlbGVjdGlvbigpOwogICBSZXBhaW50UmVjdChHZXRSVENsaWVudCgpKTsKIH0KIAogdm9pZCBDRldMX0NvbWJvRWRpdDo6U2V0U2VsZWN0ZWQoKSB7CiAgIEZsYWdGb2N1cyh0cnVlKTsKLSAgR2V0VHh0RWR0RW5naW5lKCktPk1vdmVDYXJldFBvcyhNQ19FbmQpOwotICBBZGRTZWxSYW5nZSgwKTsKKyAgU2VsZWN0QWxsKCk7CiB9CiAKIHZvaWQgQ0ZXTF9Db21ib0VkaXQ6OkZsYWdGb2N1cyhib29sIGJTZXQpIHsKZGlmZiAtLWdpdCBhL3hmYS9md2wvY2Z3bF9jb21ib2xpc3QuY3BwIGIveGZhL2Z3bC9jZndsX2NvbWJvbGlzdC5jcHAKaW5kZXggNWI3MDBhOS4uMTE4MGFjZiAxMDA2NDQKLS0tIGEveGZhL2Z3bC9jZndsX2NvbWJvbGlzdC5jcHAKKysrIGIveGZhL2Z3bC9jZndsX2NvbWJvbGlzdC5jcHAKQEAgLTI1LDE2ICsyNSwxNiBAQAogICBBU1NFUlQocE91dGVyKTsKIH0KIAotaW50MzJfdCBDRldMX0NvbWJvTGlzdDo6TWF0Y2hJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c01hdGNoKSB7CitpbnQzMl90IENGV0xfQ29tYm9MaXN0OjpNYXRjaEl0ZW0oY29uc3QgV2lkZVN0cmluZyYgd3NNYXRjaCkgewogICBpZiAod3NNYXRjaC5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuIC0xOwogCiAgIGludDMyX3QgaUNvdW50ID0gQ291bnRJdGVtcyh0aGlzKTsKICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKICAgICBDRldMX0xpc3RJdGVtKiBoSXRlbSA9IEdldEl0ZW0odGhpcywgaSk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0ID0gaEl0ZW0gPyBoSXRlbS0+R2V0VGV4dCgpIDogTCIiOwotICAgIEZYX1NUUlNJWkUgcG9zID0gd3NUZXh0LkZpbmQod3NNYXRjaC5jX3N0cigpKTsKLSAgICBpZiAoIXBvcykKKyAgICBXaWRlU3RyaW5nIHdzVGV4dCA9IGhJdGVtID8gaEl0ZW0tPkdldFRleHQoKSA6IEwiIjsKKyAgICBhdXRvIHBvcyA9IHdzVGV4dC5GaW5kKHdzTWF0Y2guY19zdHIoKSk7CisgICAgaWYgKHBvcy5oYXNfdmFsdWUoKSAmJiBwb3MudmFsdWUoKSA9PSAwKQogICAgICAgcmV0dXJuIGk7CiAgIH0KICAgcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEveGZhL2Z3bC9jZndsX2NvbWJvbGlzdC5oIGIveGZhL2Z3bC9jZndsX2NvbWJvbGlzdC5oCmluZGV4IGI3YmE2YjUuLmE0ZDUxMzUgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvY2Z3bF9jb21ib2xpc3QuaAorKysgYi94ZmEvZndsL2Nmd2xfY29tYm9saXN0LmgKQEAgLTIyLDcgKzIyLDcgQEAKICAgLy8gQ0ZXTF9MaXN0Qm94LgogICB2b2lkIE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgb3ZlcnJpZGU7CiAKLSAgaW50MzJfdCBNYXRjaEl0ZW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTWF0Y2gpOworICBpbnQzMl90IE1hdGNoSXRlbShjb25zdCBXaWRlU3RyaW5nJiB3c01hdGNoKTsKIAogICB2b2lkIENoYW5nZVNlbGVjdGVkKGludDMyX3QgaVNlbCk7CiAKZGlmZiAtLWdpdCBhL3hmYS9md2wvY2Z3bF9kYXRldGltZXBpY2tlci5jcHAgYi94ZmEvZndsL2Nmd2xfZGF0ZXRpbWVwaWNrZXIuY3BwCmluZGV4IGE2YmE2NWEuLmYzZGE0NTQgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvY2Z3bF9kYXRldGltZXBpY2tlci5jcHAKKysrIGIveGZhL2Z3bC9jZndsX2RhdGV0aW1lcGlja2VyLmNwcApAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9tZXNzYWdlbW91c2UuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfbWVzc2FnZXNldGZvY3VzLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX25vdGVkcml2ZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfc3BpbmJ1dHRvbi5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF90aGVtZWJhY2tncm91bmQuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfd2lkZ2V0bWdyLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9pZndsX3RoZW1lcHJvdmlkZXIuaCIKQEAgLTQwLDggKzM5LDggQEAKICAgbW9udGhQcm9wLT5tX2R3U3RhdGVzID0gRldMX1dHVFNUQVRFX0ludmlzaWJsZTsKICAgbW9udGhQcm9wLT5tX3BQYXJlbnQgPSB0aGlzOwogICBtb250aFByb3AtPm1fcFRoZW1lUHJvdmlkZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOwotICBtX3BNb250aENhbC5yZXNldCgKLSAgICAgIG5ldyBDRldMX01vbnRoQ2FsZW5kYXIobV9wT3duZXJBcHAsIHN0ZDo6bW92ZShtb250aFByb3ApLCB0aGlzKSk7CisgIG1fcE1vbnRoQ2FsID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfTW9udGhDYWxlbmRhcj4oCisgICAgICBtX3BPd25lckFwcC5HZXQoKSwgc3RkOjptb3ZlKG1vbnRoUHJvcCksIHRoaXMpOwogCiAgIG1fcE1vbnRoQ2FsLT5TZXRXaWRnZXRSZWN0KAogICAgICAgQ0ZYX1JlY3RGKDAsIDAsIG1fcE1vbnRoQ2FsLT5HZXRBdXRvc2l6ZWRXaWRnZXRSZWN0KCkuU2l6ZSgpKSk7CkBAIC01MCw3ICs0OSw3IEBACiAgIGVkaXRQcm9wLT5tX3BQYXJlbnQgPSB0aGlzOwogICBlZGl0UHJvcC0+bV9wVGhlbWVQcm92aWRlciA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7CiAKLSAgbV9wRWRpdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRldMX0RhdGVUaW1lRWRpdD4obV9wT3duZXJBcHAsCisgIG1fcEVkaXQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZXTF9EYXRlVGltZUVkaXQ+KG1fcE93bmVyQXBwLkdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoZWRpdFByb3ApLCB0aGlzKTsKICAgUmVnaXN0ZXJFdmVudFRhcmdldChtX3BNb250aENhbC5nZXQoKSk7CiAgIFJlZ2lzdGVyRXZlbnRUYXJnZXQobV9wRWRpdC5nZXQoKSk7CkBAIC04MSw3ICs4MCw3IEBACiAgIGlmICghdGhlbWUpCiAgICAgcmV0dXJuOwogCi0gIEZYX0ZMT0FUIGZCdG4gPSB0aGVtZS0+R2V0U2Nyb2xsQmFyV2lkdGgoKTsKKyAgZmxvYXQgZkJ0biA9IHRoZW1lLT5HZXRTY3JvbGxCYXJXaWR0aCgpOwogICBtX3J0QnRuID0gQ0ZYX1JlY3RGKG1fcnRDbGllbnQucmlnaHQoKSAtIGZCdG4sIG1fcnRDbGllbnQudG9wLCBmQnRuIC0gMSwKICAgICAgICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LmhlaWdodCAtIDEpOwogCkBAIC0xMTQsOCArMTEzLDggQEAKICAgcmV0dXJuIEZXTF9XaWRnZXRIaXQ6OlVua25vd247CiB9CiAKLXZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7Cit2b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXI6OkRyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgewogICBpZiAoIXBHcmFwaGljcykKICAgICByZXR1cm47CiAgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikKQEAgLTEyMywxMSArMTIyLDExIEBACiAKICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOwogICBpZiAoSGFzQm9yZGVyKCkpCi0gICAgRHJhd0JvcmRlcihwR3JhcGhpY3MsIENGV0xfUGFydDo6Qm9yZGVyLCBwVGhlbWUsIHBNYXRyaXgpOworICAgIERyYXdCb3JkZXIocEdyYXBoaWNzLCBDRldMX1BhcnQ6OkJvcmRlciwgcFRoZW1lLCBtYXRyaXgpOwogICBpZiAoIW1fcnRCdG4uSXNFbXB0eSgpKQotICAgIERyYXdEcm9wRG93bkJ1dHRvbihwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7CisgICAgRHJhd0Ryb3BEb3duQnV0dG9uKHBHcmFwaGljcywgcFRoZW1lLCAmbWF0cml4KTsKICAgaWYgKG1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkgewotICAgIERpc0Zvcm1fRHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOworICAgIERpc0Zvcm1fRHJhd1dpZGdldChwR3JhcGhpY3MsICZtYXRyaXgpOwogICAgIHJldHVybjsKICAgfQogfQpAQCAtMTYxLDcgKzE2MCw3IEBACiAgIG1fcE1vbnRoQ2FsLT5TZXRTZWxlY3QoaVllYXIsIGlNb250aCwgaURheSk7CiB9CiAKLXZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6U2V0RWRpdFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgewordm9pZCBDRldMX0RhdGVUaW1lUGlja2VyOjpTZXRFZGl0VGV4dChjb25zdCBXaWRlU3RyaW5nJiB3c1RleHQpIHsKICAgaWYgKCFtX3BFZGl0KQogICAgIHJldHVybjsKIApAQCAtMTcyLDcgKzE3MSw3IEBACiAgIERpc3BhdGNoRXZlbnQoJmV2KTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6R2V0RWRpdFRleHQoKSBjb25zdCB7CitXaWRlU3RyaW5nIENGV0xfRGF0ZVRpbWVQaWNrZXI6OkdldEVkaXRUZXh0KCkgY29uc3QgewogICByZXR1cm4gbV9wRWRpdCA/IG1fcEVkaXQtPkdldFRleHQoKSA6IEwiIjsKIH0KIApAQCAtMTk1LDcgKzE5NCw3IEBACiAgIG1fcEVkaXQtPk1vZGlmeVN0eWxlc0V4KGR3U3R5bGVzRXhBZGRlZCwgZHdTdHlsZXNFeFJlbW92ZWQpOwogfQogCi12b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXI6OkRyYXdEcm9wRG93bkJ1dHRvbihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKK3ZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6RHJhd0Ryb3BEb3duQnV0dG9uKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewogICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsKQEAgLTIwOSwxNyArMjA4LDIwIEBACiAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsKIH0KIAotdm9pZCBDRldMX0RhdGVUaW1lUGlja2VyOjpGb3JtYXREYXRlU3RyaW5nKGludDMyX3QgaVllYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTW9udGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsKK1dpZGVTdHJpbmcgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6Rm9ybWF0RGF0ZVN0cmluZyhpbnQzMl90IGlZZWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1vbnRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURheSkgewogICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRFRQX1Nob3J0RGF0ZUZvcm1hdCkgPT0KICAgICAgIEZXTF9TVFlMRUVYVF9EVFBfU2hvcnREYXRlRm9ybWF0KSB7Ci0gICAgd3NUZXh0LkZvcm1hdChMIiVkLSVkLSVkIiwgaVllYXIsIGlNb250aCwgaURheSk7Ci0gIH0gZWxzZSBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRFRQX0xvbmdEYXRlRm9ybWF0KSA9PQotICAgICAgICAgICAgIEZXTF9TVFlMRUVYVF9EVFBfTG9uZ0RhdGVGb3JtYXQpIHsKLSAgICB3c1RleHQuRm9ybWF0KEwiJWQgWWVhciAlZCBNb250aCAlZCBEYXkiLCBpWWVhciwgaU1vbnRoLCBpRGF5KTsKKyAgICByZXR1cm4gV2lkZVN0cmluZzo6Rm9ybWF0KEwiJWQtJWQtJWQiLCBpWWVhciwgaU1vbnRoLCBpRGF5KTsKICAgfQorCisgIGlmICgobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9EVFBfTG9uZ0RhdGVGb3JtYXQpID09CisgICAgICBGV0xfU1RZTEVFWFRfRFRQX0xvbmdEYXRlRm9ybWF0KSB7CisgICAgcmV0dXJuIFdpZGVTdHJpbmc6OkZvcm1hdChMIiVkIFllYXIgJWQgTW9udGggJWQgRGF5IiwgaVllYXIsIGlNb250aCwgaURheSk7CisgIH0KKworICByZXR1cm4gV2lkZVN0cmluZygpOwogfQogCiB2b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXI6OlNob3dNb250aENhbGVuZGFyKGJvb2wgYkFjdGl2YXRlKSB7CkBAIC0zMDgsOCArMzEwLDcgQEAKICAgbV9pTW9udGggPSBpTW9udGg7CiAgIG1faURheSA9IGlEYXk7CiAKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0OwotICBGb3JtYXREYXRlU3RyaW5nKG1faVllYXIsIG1faU1vbnRoLCBtX2lEYXksIHdzVGV4dCk7CisgIFdpZGVTdHJpbmcgd3NUZXh0ID0gRm9ybWF0RGF0ZVN0cmluZyhtX2lZZWFyLCBtX2lNb250aCwgbV9pRGF5KTsKICAgbV9wRWRpdC0+U2V0VGV4dCh3c1RleHQpOwogICBtX3BFZGl0LT5VcGRhdGUoKTsKICAgUmVwYWludFJlY3QobV9ydENsaWVudCk7CkBAIC0zMzIsOCArMzMzLDggQEAKICAgcHJvcC0+bV9kd1N0YXRlcyA9IEZXTF9XR1RTVEFURV9JbnZpc2libGU7CiAgIHByb3AtPm1fcE93bmVyID0gdGhpczsKIAotICBtX3BGb3JtID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfRm9ybVByb3h5PihtX3BPd25lckFwcCwgc3RkOjptb3ZlKHByb3ApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BNb250aENhbC5nZXQoKSk7CisgIG1fcEZvcm0gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZXTF9Gb3JtUHJveHk+KAorICAgICAgbV9wT3duZXJBcHAuR2V0KCksIHN0ZDo6bW92ZShwcm9wKSwgbV9wTW9udGhDYWwuZ2V0KCkpOwogICBtX3BNb250aENhbC0+U2V0UGFyZW50KG1fcEZvcm0uZ2V0KCkpOwogfQogCkBAIC0zNDksOCArMzUwLDggQEAKIAogICBpZiAoYkFjdGl2YXRlKSB7CiAgICAgQ0ZYX1JlY3RGIHJ0TW9udGhDYWwgPSBtX3BNb250aENhbC0+R2V0QXV0b3NpemVkV2lkZ2V0UmVjdCgpOwotICAgIEZYX0ZMT0FUIGZQb3B1cE1pbiA9IHJ0TW9udGhDYWwuaGVpZ2h0OwotICAgIEZYX0ZMT0FUIGZQb3B1cE1heCA9IHJ0TW9udGhDYWwuaGVpZ2h0OworICAgIGZsb2F0IGZQb3B1cE1pbiA9IHJ0TW9udGhDYWwuaGVpZ2h0OworICAgIGZsb2F0IGZQb3B1cE1heCA9IHJ0TW9udGhDYWwuaGVpZ2h0OwogICAgIENGWF9SZWN0RiBydEFuY2hvcihtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0KTsKICAgICBydEFuY2hvci53aWR0aCA9IHJ0TW9udGhDYWwud2lkdGg7CiAgICAgcnRNb250aENhbC5sZWZ0ID0gbV9ydENsaWVudC5sZWZ0OwpAQCAtNDQzLDcgKzQ0NCw3IEBACiAgIHJldHVybiByZWN0OwogfQogCi12b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXI6OkRpc0Zvcm1fRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKK3ZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6RGlzRm9ybV9EcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKICAgaWYgKCFwR3JhcGhpY3MpCiAgICAgcmV0dXJuOwpAQCAtNDUzLDcgKzQ1NCw3IEBACiAgICAgQ0ZYX01hdHJpeCBtdCgxLCAwLCAwLCAxLCBydEVkaXQubGVmdCwgcnRFZGl0LnRvcCk7CiAgICAgaWYgKHBNYXRyaXgpCiAgICAgICBtdC5Db25jYXQoKnBNYXRyaXgpOwotICAgIG1fcEVkaXQtPkRyYXdXaWRnZXQocEdyYXBoaWNzLCAmbXQpOworICAgIG1fcEVkaXQtPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBtdCk7CiAgIH0KICAgaWYgKCFJc01vbnRoQ2FsZW5kYXJWaXNpYmxlKCkpCiAgICAgcmV0dXJuOwpAQCAtNDYyLDcgKzQ2Myw3IEBACiAgIENGWF9NYXRyaXggbXQoMSwgMCwgMCwgMSwgcnRNb250aC5sZWZ0LCBydE1vbnRoLnRvcCk7CiAgIGlmIChwTWF0cml4KQogICAgIG10LkNvbmNhdCgqcE1hdHJpeCk7Ci0gIG1fcE1vbnRoQ2FsLT5EcmF3V2lkZ2V0KHBHcmFwaGljcywgJm10KTsKKyAgbV9wTW9udGhDYWwtPkRyYXdXaWRnZXQocEdyYXBoaWNzLCBtdCk7CiB9CiAKIHZvaWQgQ0ZXTF9EYXRlVGltZVBpY2tlcjo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7CkBAIC01MTAsOSArNTExLDkgQEAKICAgQ0ZXTF9XaWRnZXQ6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOwogfQogCi12b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXI6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgRHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOwordm9pZCBDRldMX0RhdGVUaW1lUGlja2VyOjpPbkRyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7CisgIERyYXdXaWRnZXQocEdyYXBoaWNzLCBtYXRyaXgpOwogfQogCiB2b2lkIENGV0xfRGF0ZVRpbWVQaWNrZXI6Ok9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSogcE1zZywgYm9vbCBiU2V0KSB7CmRpZmYgLS1naXQgYS94ZmEvZndsL2Nmd2xfZGF0ZXRpbWVwaWNrZXIuaCBiL3hmYS9md2wvY2Z3bF9kYXRldGltZXBpY2tlci5oCmluZGV4IDI5MzVlZTguLjZkNTM2MDEgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvY2Z3bF9kYXRldGltZXBpY2tlci5oCisrKyBiL3hmYS9md2wvY2Z3bF9kYXRldGltZXBpY2tlci5oCkBAIC04LDYgKzgsNyBAQAogI2RlZmluZSBYRkFfRldMX0NGV0xfREFURVRJTUVQSUNLRVJfSF8KIAogI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgogCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2RhdGV0aW1lZWRpdC5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9ldmVudC5oIgpAQCAtMzksMjEgKzQwLDIyIEBACiAgIEZXTF9UeXBlIEdldENsYXNzSUQoKSBjb25zdCBvdmVycmlkZTsKICAgdm9pZCBVcGRhdGUoKSBvdmVycmlkZTsKICAgRldMX1dpZGdldEhpdCBIaXRUZXN0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKLSAgdm9pZCBEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSBvdmVycmlkZTsKKyAgdm9pZCBEcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSBvdmVycmlkZTsKICAgdm9pZCBTZXRUaGVtZVByb3ZpZGVyKElGV0xfVGhlbWVQcm92aWRlciogcFRQKSBvdmVycmlkZTsKICAgdm9pZCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIG92ZXJyaWRlOwotICB2b2lkIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgb3ZlcnJpZGU7CisgIHZvaWQgT25EcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSBvdmVycmlkZTsKIAogICB2b2lkIEdldEN1clNlbChpbnQzMl90JiBpWWVhciwgaW50MzJfdCYgaU1vbnRoLCBpbnQzMl90JiBpRGF5KTsKICAgdm9pZCBTZXRDdXJTZWwoaW50MzJfdCBpWWVhciwgaW50MzJfdCBpTW9udGgsIGludDMyX3QgaURheSk7CiAKLSAgdm9pZCBTZXRFZGl0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0RWRpdFRleHQoKSBjb25zdDsKKyAgdm9pZCBTZXRFZGl0VGV4dChjb25zdCBXaWRlU3RyaW5nJiB3c1RleHQpOworICBXaWRlU3RyaW5nIEdldEVkaXRUZXh0KCkgY29uc3Q7CiAKLSAgaW50MzJfdCBDb3VudFNlbFJhbmdlcygpIGNvbnN0IHsgcmV0dXJuIG1fcEVkaXQtPkNvdW50U2VsUmFuZ2VzKCk7IH0KLSAgaW50MzJfdCBHZXRTZWxSYW5nZShpbnQzMl90IG5JbmRleCwgaW50MzJfdCogblN0YXJ0KSBjb25zdCB7Ci0gICAgcmV0dXJuIG1fcEVkaXQtPkdldFNlbFJhbmdlKG5JbmRleCwgblN0YXJ0KTsKKyAgYm9vbCBIYXNTZWxlY3Rpb24oKSBjb25zdCB7IHJldHVybiBtX3BFZGl0LT5IYXNTZWxlY3Rpb24oKTsgfQorICAvLyBSZXR1cm5zIDxzdGFydCwgY291bnQ+IG9mIHRoZSBzZWxlY3Rpb24uCisgIHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4gR2V0U2VsZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBtX3BFZGl0LT5HZXRTZWxlY3Rpb24oKTsKICAgfQogCiAgIENGWF9SZWN0RiBHZXRCQm94KCkgY29uc3Q7CkBAIC02NywxMyArNjksMTAgQEAKICAgQ0ZXTF9Gb3JtUHJveHkqIEdldEZvcm1Qcm94eSgpIGNvbnN0IHsgcmV0dXJuIG1fcEZvcm0uZ2V0KCk7IH0KIAogIHByaXZhdGU6Ci0gIHZvaWQgRHJhd0Ryb3BEb3duQnV0dG9uKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAorICB2b2lkIERyYXdEcm9wRG93bkJ1dHRvbihDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKLSAgdm9pZCBGb3JtYXREYXRlU3RyaW5nKGludDMyX3QgaVllYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNb250aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURheSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOworICBXaWRlU3RyaW5nIEZvcm1hdERhdGVTdHJpbmcoaW50MzJfdCBpWWVhciwgaW50MzJfdCBpTW9udGgsIGludDMyX3QgaURheSk7CiAgIHZvaWQgUmVzZXRFZGl0QWxpZ25tZW50KCk7CiAgIHZvaWQgSW5pdFByb3h5Rm9ybSgpOwogICB2b2lkIE9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSogcE1zZywgYm9vbCBiU2V0KTsKQEAgLTg4LDcgKzg3LDcgQEAKICAgYm9vbCBEaXNGb3JtX0lzTmVlZFNob3dCdXR0b24oKSBjb25zdDsKICAgdm9pZCBEaXNGb3JtX1VwZGF0ZSgpOwogICBDRlhfUmVjdEYgRGlzRm9ybV9HZXRCQm94KCkgY29uc3Q7Ci0gIHZvaWQgRGlzRm9ybV9EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKKyAgdm9pZCBEaXNGb3JtX0RyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKICAgdm9pZCBEaXNGb3JtX09uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSogcE1zZywgYm9vbCBiU2V0KTsKIAogICBDRlhfUmVjdEYgbV9ydEJ0bjsKQEAgLTEwMSw3ICsxMDAsNyBAQAogICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZXTF9EYXRlVGltZUVkaXQ+IG1fcEVkaXQ7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDRldMX01vbnRoQ2FsZW5kYXI+IG1fcE1vbnRoQ2FsOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZXTF9Gb3JtUHJveHk+IG1fcEZvcm07Ci0gIEZYX0ZMT0FUIG1fZkJ0bjsKKyAgZmxvYXQgbV9mQnRuOwogfTsKIAogI2VuZGlmICAvLyBYRkFfRldMX0NGV0xfREFURVRJTUVQSUNLRVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9md2wvY2Z3bF9lZGl0LmNwcCBiL3hmYS9md2wvY2Z3bF9lZGl0LmNwcAppbmRleCBkMzZlMjhhLi45NjBlYzk5IDEwMDY0NAotLS0gYS94ZmEvZndsL2Nmd2xfZWRpdC5jcHAKKysrIGIveGZhL2Z3bC9jZndsX2VkaXQuY3BwCkBAIC0xMywxMCArMTMsOCBAQAogCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2NmZGVfdHh0ZWR0ZW5naW5lLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9mZGVfZ2VkZXZpY2UuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2ZkZV9yZW5kZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2lmZGVfdHh0ZWR0cGFnZS5oIgorI2luY2x1ZGUgInhmYS9mZGUvY2ZkZV90ZXh0ZWRpdGVuZ2luZS5oIgorI2luY2x1ZGUgInhmYS9mZGUvY2ZkZV90ZXh0b3V0LmgiCiAjaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9jZmdhc19nZWZvbnQuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfYXBwLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2NhcmV0LmgiCkBAIC0zMCwyOCArMjgsMzUgQEAKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfdGhlbWVwYXJ0LmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3dpZGdldG1nci5oIgogI2luY2x1ZGUgInhmYS9md2wvaWZ3bF90aGVtZXByb3ZpZGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0LmgiCi0jaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY2Z4X3BhdGguaCIKKyNpbmNsdWRlICJ4ZmEvZndsL3RoZW1lL2Nmd2xfdXRpbHMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZG9jLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZndpZGdldC5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2VwYXRoLmgiCiAKIG5hbWVzcGFjZSB7CiAKIGNvbnN0IGludCBrRWRpdE1hcmdpbiA9IDM7CiAKLWJvb2wgRlhfRURJVF9JU0xBVElOV09SRChGWF9XQ0hBUiBjKSB7CisjaWYgKF9GWF9PU18gPT0gX0ZYX09TX01BQ09TWF8pCitjb25zdGV4cHIgaW50IGtFZGl0aW5nTW9kaWZpZXIgPSBGV0xfS0VZRkxBR19Db21tYW5kOworI2Vsc2UKK2NvbnN0ZXhwciBpbnQga0VkaXRpbmdNb2RpZmllciA9IEZXTF9LRVlGTEFHX0N0cmw7CisjZW5kaWYKKworYm9vbCBGeEVkaXRJc0xhdGluV29yZCh3Y2hhcl90IGMpIHsKICAgcmV0dXJuIGMgPT0gMHgyRCB8fCAoYyA8PSAweDAwNUEgJiYgYyA+PSAweDAwNDEpIHx8CiAgICAgICAgICAoYyA8PSAweDAwN0EgJiYgYyA+PSAweDAwNjEpIHx8IChjIDw9IDB4MDJBRiAmJiBjID49IDB4MDBDMCkgfHwKICAgICAgICAgIGMgPT0gMHgwMDI3OwogfQogCi12b2lkIEFkZFNxdWlnZ2x5UGF0aChDRlhfUGF0aCogcFBhdGhEYXRhLAotICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlN0YXJ0WCwKLSAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZFbmRYLAotICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlksCi0gICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU3RlcCkgewordm9pZCBBZGRTcXVpZ2dseVBhdGgoQ1hGQV9HRVBhdGgqIHBQYXRoRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZTdGFydFgsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmRW5kWCwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZZLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZlN0ZXApIHsKICAgcFBhdGhEYXRhLT5Nb3ZlVG8oQ0ZYX1BvaW50RihmU3RhcnRYLCBmWSkpOwogICBpbnQgaSA9IDE7Ci0gIGZvciAoRlhfRkxPQVQgZnggPSBmU3RhcnRYICsgZlN0ZXA7IGZ4IDwgZkVuZFg7IGZ4ICs9IGZTdGVwLCArK2kpCisgIGZvciAoZmxvYXQgZnggPSBmU3RhcnRYICsgZlN0ZXA7IGZ4IDwgZkVuZFg7IGZ4ICs9IGZTdGVwLCArK2kpCiAgICAgcFBhdGhEYXRhLT5MaW5lVG8oQ0ZYX1BvaW50RihmeCwgZlkgKyAoaSAmIDEpICogZlN0ZXApKTsKIH0KIApAQCAtNjUsMjQgKzcwLDIyIEBACiAgICAgICBtX2ZTY3JvbGxPZmZzZXRYKDAuMGYpLAogICAgICAgbV9mU2Nyb2xsT2Zmc2V0WSgwLjBmKSwKICAgICAgIG1fYkxCdXR0b25Eb3duKGZhbHNlKSwKLSAgICAgIG1fblNlbFN0YXJ0KDApLAorICAgICAgbV9DdXJzb3JQb3NpdGlvbigwKSwKICAgICAgIG1fbkxpbWl0KC0xKSwKICAgICAgIG1fZkZvbnRTaXplKDApLAogICAgICAgbV9iU2V0UmFuZ2UoZmFsc2UpLAotICAgICAgbV9pTWF4KDB4RkZGRkZGRiksCi0gICAgICBtX2lDdXJSZWNvcmQoLTEpLAotICAgICAgbV9pTWF4UmVjb3JkKDEyOCkgeworICAgICAgbV9pTWF4KDB4RkZGRkZGRikgewogICBtX3J0Q2xpZW50LlJlc2V0KCk7CiAgIG1fcnRFbmdpbmUuUmVzZXQoKTsKICAgbV9ydFN0YXRpYy5SZXNldCgpOwogCiAgIEluaXRDYXJldCgpOworICBtX0VkdEVuZ2luZS5TZXREZWxlZ2F0ZSh0aGlzKTsKIH0KIAogQ0ZXTF9FZGl0Ojp+Q0ZXTF9FZGl0KCkgewogICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKQogICAgIEhpZGVDYXJldChudWxscHRyKTsKLSAgQ2xlYXJSZWNvcmQoKTsKIH0KIAogRldMX1R5cGUgQ0ZXTF9FZGl0OjpHZXRDbGFzc0lEKCkgY29uc3QgewpAQCAtMTA4LDEyICsxMTEsMTQgQEAKIAogQ0ZYX1JlY3RGIENGV0xfRWRpdDo6R2V0QXV0b3NpemVkV2lkZ2V0UmVjdCgpIHsKICAgQ0ZYX1JlY3RGIHJlY3Q7Ci0gIGlmIChtX0VkdEVuZ2luZS5HZXRUZXh0TGVuZ3RoKCkgPiAwKSB7Ci0gICAgQ0ZYX1NpemVGIHN6ID0gQ2FsY1RleHRTaXplKAotICAgICAgICBtX0VkdEVuZ2luZS5HZXRUZXh0KDAsIC0xKSwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwKKworICBpZiAobV9FZHRFbmdpbmUuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgQ0ZYX1NpemVGIHNpemUgPSBDYWxjVGV4dFNpemUoCisgICAgICAgIG1fRWR0RW5naW5lLkdldFRleHQoKSwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwKICAgICAgICAgISEobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfTXVsdGlMaW5lKSk7Ci0gICAgcmVjdCA9IENGWF9SZWN0RigwLCAwLCBzeik7CisgICAgcmVjdCA9IENGWF9SZWN0RigwLCAwLCBzaXplKTsKICAgfQorCiAgIEluZmxhdGVXaWRnZXRSZWN0KHJlY3QpOwogICByZXR1cm4gcmVjdDsKIH0KQEAgLTE1OCw1MiArMTYzLDQ0IEBACiAgIHJldHVybiBGV0xfV2lkZ2V0SGl0OjpVbmtub3duOwogfQogCi12b2lkIENGV0xfRWRpdDo6QWRkU3BlbGxDaGVja09iaihDRlhfUGF0aCYgUGF0aERhdGEsCit2b2lkIENGV0xfRWRpdDo6QWRkU3BlbGxDaGVja09iaihDWEZBX0dFUGF0aCYgUGF0aERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5TdGFydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk9mZlNldFgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmT2ZmU2V0WSkgewotICBGWF9GTE9BVCBmU3RhcnRYID0gMC4wZjsKLSAgRlhfRkxPQVQgZkVuZFggPSAwLjBmOwotICBGWF9GTE9BVCBmWSA9IDAuMGY7Ci0gIEZYX0ZMT0FUIGZTdGVwID0gMC4wZjsKLSAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IG1fRWR0RW5naW5lLkdldFBhZ2UoMCk7Ci0gIGNvbnN0IEZERV9UWFRFRFRQQVJBTVMqIHR4dEVkdFBhcmFtcyA9IG1fRWR0RW5naW5lLkdldEVkaXRQYXJhbXMoKTsKLSAgRlhfRkxPQVQgZkFzZW50ID0gc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHR4dEVkdFBhcmFtcy0+cEZvbnQtPkdldEFzY2VudCgpKSAqCi0gICAgICAgICAgICAgICAgICAgIHR4dEVkdFBhcmFtcy0+ZkZvbnRTaXplIC8gMTAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZPZmZTZXRYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZk9mZlNldFkpIHsKKyAgZmxvYXQgZlN0ZXAgPSBtX0VkdEVuZ2luZS5HZXRGb250U2l6ZSgpIC8gMTYuMGY7CisgIGZsb2F0IGZvbnRfYXNjZW50ID0gbV9FZHRFbmdpbmUuR2V0Rm9udEFzY2VudCgpOwogCi0gIHN0ZDo6dmVjdG9yPENGWF9SZWN0Rj4gcmVjdEFycmF5OwotICBwUGFnZS0+Q2FsY1JhbmdlUmVjdEFycmF5KG5TdGFydCwgbkNvdW50LCAmcmVjdEFycmF5KTsKKyAgc3RkOjp2ZWN0b3I8Q0ZYX1JlY3RGPiByZWN0cyA9CisgICAgICBtX0VkdEVuZ2luZS5HZXRDaGFyYWN0ZXJSZWN0c0luUmFuZ2UoblN0YXJ0LCBuQ291bnQpOworICBmb3IgKGNvbnN0IGF1dG8mIHJlY3QgOiByZWN0cykgeworICAgIGZsb2F0IGZZID0gcmVjdC50b3AgKyBmb250X2FzY2VudCArIGZPZmZTZXRZOworICAgIGZsb2F0IGZTdGFydFggPSByZWN0LmxlZnQgKyBmT2ZmU2V0WDsKKyAgICBmbG9hdCBmRW5kWCA9IGZTdGFydFggKyByZWN0LldpZHRoKCk7CiAKLSAgZm9yIChjb25zdCBhdXRvJiByZWN0VGV4dCA6IHJlY3RBcnJheSkgewotICAgIGZZID0gcmVjdFRleHQudG9wICsgZkFzZW50ICsgZk9mZlNldFk7Ci0gICAgZlN0ZXAgPSB0eHRFZHRQYXJhbXMtPmZGb250U2l6ZSAvIDE2LjBmOwotICAgIGZTdGFydFggPSByZWN0VGV4dC5sZWZ0ICsgZk9mZlNldFg7Ci0gICAgZkVuZFggPSBmU3RhcnRYICsgcmVjdFRleHQuV2lkdGgoKTsKICAgICBBZGRTcXVpZ2dseVBhdGgoJlBhdGhEYXRhLCBmU3RhcnRYLCBmRW5kWCwgZlksIGZTdGVwKTsKICAgfQogfQogCi12b2lkIENGV0xfRWRpdDo6RHJhd1NwZWxsQ2hlY2soQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCit2b2lkIENGV0xfRWRpdDo6RHJhd1NwZWxsQ2hlY2soQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOwogICBpZiAocE1hdHJpeCkKLSAgICBwR3JhcGhpY3MtPkNvbmNhdE1hdHJpeChjb25zdF9jYXN0PENGWF9NYXRyaXgqPihwTWF0cml4KSk7CisgICAgcEdyYXBoaWNzLT5Db25jYXRNYXRyaXgocE1hdHJpeCk7CiAKLSAgQ0ZYX0NvbG9yIGNyTGluZSgweEZGRkYwMDAwKTsKICAgQ0ZXTF9FdmVudENoZWNrV29yZCBjaGVja1dvcmRFdmVudCh0aGlzKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgc0xhdGluV29yZDsKLSAgQ0ZYX1BhdGggcGF0aFNwZWxsOworICBCeXRlU3RyaW5nIHNMYXRpbldvcmQ7CisgIENYRkFfR0VQYXRoIHBhdGhTcGVsbDsKICAgaW50MzJfdCBuU3RhcnQgPSAwOwotICBGWF9GTE9BVCBmT2ZmU2V0WCA9IG1fcnRFbmdpbmUubGVmdCAtIG1fZlNjcm9sbE9mZnNldFg7Ci0gIEZYX0ZMT0FUIGZPZmZTZXRZID0gbV9ydEVuZ2luZS50b3AgLSBtX2ZTY3JvbGxPZmZzZXRZICsgbV9mVkFsaWduT2Zmc2V0OwotICBDRlhfV2lkZVN0cmluZyB3c1NwZWxsID0gR2V0VGV4dCgpOworICBmbG9hdCBmT2ZmU2V0WCA9IG1fcnRFbmdpbmUubGVmdCAtIG1fZlNjcm9sbE9mZnNldFg7CisgIGZsb2F0IGZPZmZTZXRZID0gbV9ydEVuZ2luZS50b3AgLSBtX2ZTY3JvbGxPZmZzZXRZICsgbV9mVkFsaWduT2Zmc2V0OworICBXaWRlU3RyaW5nIHdzU3BlbGwgPSBHZXRUZXh0KCk7CiAgIGludDMyX3QgbkNvbnRlbnRMZW4gPSB3c1NwZWxsLkdldExlbmd0aCgpOwogICBmb3IgKGludCBpID0gMDsgaSA8IG5Db250ZW50TGVuOyBpKyspIHsKLSAgICBpZiAoRlhfRURJVF9JU0xBVElOV09SRCh3c1NwZWxsW2ldKSkgeworICAgIGlmIChGeEVkaXRJc0xhdGluV29yZCh3c1NwZWxsW2ldKSkgewogICAgICAgaWYgKHNMYXRpbldvcmQuSXNFbXB0eSgpKQogICAgICAgICBuU3RhcnQgPSBpOwotICAgICAgc0xhdGluV29yZCArPSAoRlhfQ0hBUil3c1NwZWxsW2ldOworICAgICAgc0xhdGluV29yZCArPSAoY2hhcil3c1NwZWxsW2ldOwogICAgICAgY29udGludWU7CiAgICAgfQogICAgIGNoZWNrV29yZEV2ZW50LmJzV29yZCA9IHNMYXRpbldvcmQ7CkBAIC0yMjksMTggKzIyNiwxOCBAQAogICAgIENGWF9SZWN0RiBydENsaXAgPSBtX3J0RW5naW5lOwogICAgIENGWF9NYXRyaXggbXQoMSwgMCwgMCwgMSwgZk9mZlNldFgsIGZPZmZTZXRZKTsKICAgICBpZiAocE1hdHJpeCkgewotICAgICAgcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChydENsaXApOworICAgICAgcnRDbGlwID0gcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChydENsaXApOwogICAgICAgbXQuQ29uY2F0KCpwTWF0cml4KTsKICAgICB9CiAgICAgcEdyYXBoaWNzLT5TZXRDbGlwUmVjdChydENsaXApOwotICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyTGluZSk7CisgICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcihDWEZBX0dFQ29sb3IoMHhGRkZGMDAwMCkpOwogICAgIHBHcmFwaGljcy0+U2V0TGluZVdpZHRoKDApOwogICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aFNwZWxsLCBudWxscHRyKTsKICAgfQogICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7CiB9CiAKLXZvaWQgQ0ZXTF9FZGl0OjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7Cit2b2lkIENGV0xfRWRpdDo6RHJhd1dpZGdldChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgewogICBpZiAoIXBHcmFwaGljcykKICAgICByZXR1cm47CiAgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikKQEAgLTI1MCwxNSArMjQ3LDE1IEBACiAKICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOwogICBpZiAoIW1fcFdpZGdldE1nci0+SXNGb3JtRGlzYWJsZWQoKSkKLSAgICBEcmF3VGV4dEJrKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsKLSAgRHJhd0NvbnRlbnQocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOworICAgIERyYXdUZXh0QmsocEdyYXBoaWNzLCBwVGhlbWUsICZtYXRyaXgpOworICBEcmF3Q29udGVudChwR3JhcGhpY3MsIHBUaGVtZSwgJm1hdHJpeCk7CiAKICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0ZvY3VzZWQpICYmCiAgICAgICAhKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5KSkgewotICAgIERyYXdTcGVsbENoZWNrKHBHcmFwaGljcywgcE1hdHJpeCk7CisgICAgRHJhd1NwZWxsQ2hlY2socEdyYXBoaWNzLCAmbWF0cml4KTsKICAgfQogICBpZiAoSGFzQm9yZGVyKCkpCi0gICAgRHJhd0JvcmRlcihwR3JhcGhpY3MsIENGV0xfUGFydDo6Qm9yZGVyLCBwVGhlbWUsIHBNYXRyaXgpOworICAgIERyYXdCb3JkZXIocEdyYXBoaWNzLCBDRldMX1BhcnQ6OkJvcmRlciwgcFRoZW1lLCBtYXRyaXgpOwogfQogCiB2b2lkIENGV0xfRWRpdDo6U2V0VGhlbWVQcm92aWRlcihJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZVByb3ZpZGVyKSB7CkBAIC0yNzMsMzYgKzI3MCwzNyBAQAogICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyID0gcFRoZW1lUHJvdmlkZXI7CiB9CiAKLXZvaWQgQ0ZXTF9FZGl0OjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsKLSAgbV9FZHRFbmdpbmUuU2V0VGV4dCh3c1RleHQpOwordm9pZCBDRldMX0VkaXQ6OlNldFRleHQoY29uc3QgV2lkZVN0cmluZyYgd3NUZXh0KSB7CisgIG1fRWR0RW5naW5lLkNsZWFyKCk7CisgIG1fRWR0RW5naW5lLkluc2VydCgwLCB3c1RleHQpOwogfQogCiBpbnQzMl90IENGV0xfRWRpdDo6R2V0VGV4dExlbmd0aCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fRWR0RW5naW5lLkdldFRleHRMZW5ndGgoKTsKKyAgcmV0dXJuIG1fRWR0RW5naW5lLkdldExlbmd0aCgpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDRldMX0VkaXQ6OkdldFRleHQoKSBjb25zdCB7Ci0gIHJldHVybiBtX0VkdEVuZ2luZS5HZXRUZXh0KDAsIC0xKTsKK1dpZGVTdHJpbmcgQ0ZXTF9FZGl0OjpHZXRUZXh0KCkgY29uc3QgeworICByZXR1cm4gbV9FZHRFbmdpbmUuR2V0VGV4dCgpOwogfQogCiB2b2lkIENGV0xfRWRpdDo6Q2xlYXJUZXh0KCkgewotICBtX0VkdEVuZ2luZS5DbGVhclRleHQoKTsKKyAgbV9FZHRFbmdpbmUuQ2xlYXIoKTsKIH0KIAotdm9pZCBDRldMX0VkaXQ6OkFkZFNlbFJhbmdlKGludDMyX3QgblN0YXJ0KSB7Ci0gIG1fRWR0RW5naW5lLkFkZFNlbFJhbmdlKG5TdGFydCwgLTEpOwordm9pZCBDRldMX0VkaXQ6OlNlbGVjdEFsbCgpIHsKKyAgbV9FZHRFbmdpbmUuU2VsZWN0QWxsKCk7CiB9CiAKLWludDMyX3QgQ0ZXTF9FZGl0OjpDb3VudFNlbFJhbmdlcygpIGNvbnN0IHsKLSAgcmV0dXJuIG1fRWR0RW5naW5lLkNvdW50U2VsUmFuZ2VzKCk7Citib29sIENGV0xfRWRpdDo6SGFzU2VsZWN0aW9uKCkgY29uc3QgeworICByZXR1cm4gbV9FZHRFbmdpbmUuSGFzU2VsZWN0aW9uKCk7CiB9CiAKLWludDMyX3QgQ0ZXTF9FZGl0OjpHZXRTZWxSYW5nZShpbnQzMl90IG5JbmRleCwgaW50MzJfdCogblN0YXJ0KSBjb25zdCB7Ci0gIHJldHVybiBtX0VkdEVuZ2luZS5HZXRTZWxSYW5nZShuSW5kZXgsIG5TdGFydCk7CitzdGQ6OnBhaXI8c2l6ZV90LCBzaXplX3Q+IENGV0xfRWRpdDo6R2V0U2VsZWN0aW9uKCkgY29uc3QgeworICByZXR1cm4gbV9FZHRFbmdpbmUuR2V0U2VsZWN0aW9uKCk7CiB9CiAKLXZvaWQgQ0ZXTF9FZGl0OjpDbGVhclNlbGVjdGlvbnMoKSB7Ci0gIG1fRWR0RW5naW5lLkNsZWFyU2VsZWN0aW9uKCk7Cit2b2lkIENGV0xfRWRpdDo6Q2xlYXJTZWxlY3Rpb24oKSB7CisgIHJldHVybiBtX0VkdEVuZ2luZS5DbGVhclNlbGVjdGlvbigpOwogfQogCiBpbnQzMl90IENGV0xfRWRpdDo6R2V0TGltaXQoKSBjb25zdCB7CkBAIC0zMTEsODkgKzMwOSw2NyBAQAogCiB2b2lkIENGV0xfRWRpdDo6U2V0TGltaXQoaW50MzJfdCBuTGltaXQpIHsKICAgbV9uTGltaXQgPSBuTGltaXQ7Ci0gIG1fRWR0RW5naW5lLlNldExpbWl0KG5MaW1pdCk7CisKKyAgaWYgKG1fbkxpbWl0ID4gMCkgeworICAgIG1fRWR0RW5naW5lLlNldEhhc0NoYXJhY3RlckxpbWl0KHRydWUpOworICAgIG1fRWR0RW5naW5lLlNldENoYXJhY3RlckxpbWl0KG5MaW1pdCk7CisgIH0gZWxzZSB7CisgICAgbV9FZHRFbmdpbmUuU2V0SGFzQ2hhcmFjdGVyTGltaXQoZmFsc2UpOworICB9CiB9CiAKLXZvaWQgQ0ZXTF9FZGl0OjpTZXRBbGlhc0NoYXIoRlhfV0NIQVIgd0FsaWFzKSB7Cit2b2lkIENGV0xfRWRpdDo6U2V0QWxpYXNDaGFyKHdjaGFyX3Qgd0FsaWFzKSB7CiAgIG1fRWR0RW5naW5lLlNldEFsaWFzQ2hhcih3QWxpYXMpOwogfQogCi1ib29sIENGV0xfRWRpdDo6Q29weShDRlhfV2lkZVN0cmluZyYgd3NDb3B5KSB7Ci0gIGludDMyX3QgbkNvdW50ID0gbV9FZHRFbmdpbmUuQ291bnRTZWxSYW5nZXMoKTsKLSAgaWYgKG5Db3VudCA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKK09wdGlvbmFsPFdpZGVTdHJpbmc+IENGV0xfRWRpdDo6Q29weSgpIHsKKyAgaWYgKCFtX0VkdEVuZ2luZS5IYXNTZWxlY3Rpb24oKSkKKyAgICByZXR1cm4ge307CiAKLSAgd3NDb3B5LmNsZWFyKCk7Ci0gIGludDMyX3QgblN0YXJ0OwotICBpbnQzMl90IG5MZW5ndGg7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5Db3VudDsgaSsrKSB7Ci0gICAgbkxlbmd0aCA9IG1fRWR0RW5naW5lLkdldFNlbFJhbmdlKGksICZuU3RhcnQpOwotICAgIHdzQ29weSArPSBtX0VkdEVuZ2luZS5HZXRUZXh0KG5TdGFydCwgbkxlbmd0aCk7Ci0gIH0KKyAgcmV0dXJuIHttX0VkdEVuZ2luZS5HZXRTZWxlY3RlZFRleHQoKX07Cit9CisKK09wdGlvbmFsPFdpZGVTdHJpbmc+IENGV0xfRWRpdDo6Q3V0KCkgeworICBpZiAoIW1fRWR0RW5naW5lLkhhc1NlbGVjdGlvbigpKQorICAgIHJldHVybiB7fTsKKworICByZXR1cm4ge21fRWR0RW5naW5lLkRlbGV0ZVNlbGVjdGVkVGV4dCgpfTsKK30KKworYm9vbCBDRldMX0VkaXQ6OlBhc3RlKGNvbnN0IFdpZGVTdHJpbmcmIHdzUGFzdGUpIHsKKyAgaWYgKG1fRWR0RW5naW5lLkhhc1NlbGVjdGlvbigpKQorICAgIG1fRWR0RW5naW5lLlJlcGxhY2VTZWxlY3RlZFRleHQod3NQYXN0ZSk7CisgIGVsc2UKKyAgICBtX0VkdEVuZ2luZS5JbnNlcnQobV9DdXJzb3JQb3NpdGlvbiwgd3NQYXN0ZSk7CisKICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQ0ZXTF9FZGl0OjpDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KSB7Ci0gIGludDMyX3QgbkNvdW50ID0gbV9FZHRFbmdpbmUuQ291bnRTZWxSYW5nZXMoKTsKLSAgaWYgKG5Db3VudCA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICB3c0N1dC5jbGVhcigpOwotICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7Ci0gIGludDMyX3QgblN0YXJ0LCBuTGVuZ3RoOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuQ291bnQ7IGkrKykgewotICAgIG5MZW5ndGggPSBtX0VkdEVuZ2luZS5HZXRTZWxSYW5nZShpLCAmblN0YXJ0KTsKLSAgICB3c1RlbXAgPSBtX0VkdEVuZ2luZS5HZXRUZXh0KG5TdGFydCwgbkxlbmd0aCk7Ci0gICAgd3NDdXQgKz0gd3NUZW1wOwotICAgIHdzVGVtcC5jbGVhcigpOwotICB9Ci0gIG1fRWR0RW5naW5lLkRlbGV0ZSgwKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0ZXTF9FZGl0OjpQYXN0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXN0ZSkgewotICBpbnQzMl90IG5DYXJldCA9IG1fRWR0RW5naW5lLkdldENhcmV0UG9zKCk7Ci0gIGludDMyX3QgaUVycm9yID0KLSAgICAgIG1fRWR0RW5naW5lLkluc2VydChuQ2FyZXQsIHdzUGFzdGUuY19zdHIoKSwgd3NQYXN0ZS5HZXRMZW5ndGgoKSk7Ci0gIGlmIChpRXJyb3IgPCAwKSB7Ci0gICAgUHJvY2Vzc0luc2VydEVycm9yKGlFcnJvcik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENGV0xfRWRpdDo6UmVkbyhjb25zdCBJRkRFX1R4dEVkdERvUmVjb3JkKiBwUmVjb3JkKSB7Ci0gIHJldHVybiBtX0VkdEVuZ2luZS5SZWRvKHBSZWNvcmQpOwotfQotCi1ib29sIENGV0xfRWRpdDo6VW5kbyhjb25zdCBJRkRFX1R4dEVkdERvUmVjb3JkKiBwUmVjb3JkKSB7Ci0gIHJldHVybiBtX0VkdEVuZ2luZS5VbmRvKHBSZWNvcmQpOwotfQotCiBib29sIENGV0xfRWRpdDo6VW5kbygpIHsKLSAgaWYgKCFDYW5VbmRvKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gVW5kbyhtX0RvUmVjb3Jkc1ttX2lDdXJSZWNvcmQtLV0uZ2V0KCkpOworICByZXR1cm4gQ2FuVW5kbygpID8gbV9FZHRFbmdpbmUuVW5kbygpIDogZmFsc2U7CiB9CiAKIGJvb2wgQ0ZXTF9FZGl0OjpSZWRvKCkgewotICBpZiAoIUNhblJlZG8oKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiBSZWRvKG1fRG9SZWNvcmRzWysrbV9pQ3VyUmVjb3JkXS5nZXQoKSk7CisgIHJldHVybiBDYW5SZWRvKCkgPyBtX0VkdEVuZ2luZS5SZWRvKCkgOiBmYWxzZTsKIH0KIAogYm9vbCBDRldMX0VkaXQ6OkNhblVuZG8oKSB7Ci0gIHJldHVybiBtX2lDdXJSZWNvcmQgPj0gMDsKKyAgcmV0dXJuIG1fRWR0RW5naW5lLkNhblVuZG8oKTsKIH0KIAogYm9vbCBDRldMX0VkaXQ6OkNhblJlZG8oKSB7Ci0gIHJldHVybiBtX2lDdXJSZWNvcmQgPCBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fRG9SZWNvcmRzKSAtIDE7CisgIHJldHVybiBtX0VkdEVuZ2luZS5DYW5SZWRvKCk7CiB9CiAKIHZvaWQgQ0ZXTF9FZGl0OjpTZXRPdXRlcihDRldMX1dpZGdldCogcE91dGVyKSB7CiAgIG1fcE91dGVyID0gcE91dGVyOwogfQogCit2b2lkIENGV0xfRWRpdDo6Tm90aWZ5VGV4dEZ1bGwoKSB7CisgIENGV0xfRXZlbnQgZXZ0KENGV0xfRXZlbnQ6OlR5cGU6OlRleHRGdWxsLCB0aGlzKTsKKyAgRGlzcGF0Y2hFdmVudCgmZXZ0KTsKK30KKwogdm9pZCBDRldMX0VkaXQ6Ok9uQ2FyZXRDaGFuZ2VkKCkgewogICBpZiAobV9ydEVuZ2luZS5Jc0VtcHR5KCkpCiAgICAgcmV0dXJuOwpAQCAtNDE4LDEyICszOTQsMTIgQEAKICAgfQogfQogCi12b2lkIENGV0xfRWRpdDo6T25UZXh0Q2hhbmdlZChjb25zdCBGREVfVFhURURUX1RFWFRDSEFOR0VfSU5GTyYgQ2hhbmdlSW5mbykgewordm9pZCBDRldMX0VkaXQ6Ok9uVGV4dENoYW5nZWQoY29uc3QgV2lkZVN0cmluZyYgcHJldlRleHQpIHsKICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1ZBbGlnbk1hc2spCiAgICAgVXBkYXRlVkFsaWdubWVudCgpOwogCiAgIENGV0xfRXZlbnRUZXh0Q2hhbmdlZCBldmVudCh0aGlzKTsKLSAgZXZlbnQud3NQcmV2VGV4dCA9IENoYW5nZUluZm8ud3NQcmV2VGV4dDsKKyAgZXZlbnQud3NQcmV2VGV4dCA9IHByZXZUZXh0OwogICBEaXNwYXRjaEV2ZW50KCZldmVudCk7CiAKICAgTGF5b3V0U2Nyb2xsQmFyKCk7CkBAIC00MzQsMjkgKzQxMCw3IEBACiAgIFJlcGFpbnRSZWN0KEdldENsaWVudFJlY3QoKSk7CiB9CiAKLWJvb2wgQ0ZXTF9FZGl0OjpPblBhZ2VMb2FkKGludDMyX3QgblBhZ2VJbmRleCkgewotICBJRkRFX1R4dEVkdFBhZ2UqIHBQYWdlID0gbV9FZHRFbmdpbmUuR2V0UGFnZShuUGFnZUluZGV4KTsKLSAgaWYgKCFwUGFnZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcFBhZ2UtPkxvYWRQYWdlKG51bGxwdHIsIG51bGxwdHIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDRldMX0VkaXQ6Ok9uUGFnZVVubG9hZChpbnQzMl90IG5QYWdlSW5kZXgpIHsKLSAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IG1fRWR0RW5naW5lLkdldFBhZ2UoblBhZ2VJbmRleCk7Ci0gIGlmICghcFBhZ2UpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHBQYWdlLT5VbmxvYWRQYWdlKG51bGxwdHIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDRldMX0VkaXQ6Ok9uQWRkRG9SZWNvcmQoc3RkOjp1bmlxdWVfcHRyPElGREVfVHh0RWR0RG9SZWNvcmQ+IHBSZWNvcmQpIHsKLSAgQWRkRG9SZWNvcmQoc3RkOjptb3ZlKHBSZWNvcmQpKTsKLX0KLQotYm9vbCBDRldMX0VkaXQ6Ok9uVmFsaWRhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgeworYm9vbCBDRldMX0VkaXQ6Ok9uVmFsaWRhdGUoY29uc3QgV2lkZVN0cmluZyYgd3NUZXh0KSB7CiAgIENGV0xfV2lkZ2V0KiBwRHN0ID0gR2V0T3V0ZXIoKTsKICAgaWYgKCFwRHN0KQogICAgIHBEc3QgPSB0aGlzOwpAQCAtNDY4LDExICs0MjIsMTEgQEAKICAgcmV0dXJuIGV2ZW50LmJWYWxpZGF0ZTsKIH0KIAotdm9pZCBDRldMX0VkaXQ6OlNldFNjcm9sbE9mZnNldChGWF9GTE9BVCBmU2Nyb2xsT2Zmc2V0KSB7Cit2b2lkIENGV0xfRWRpdDo6U2V0U2Nyb2xsT2Zmc2V0KGZsb2F0IGZTY3JvbGxPZmZzZXQpIHsKICAgbV9mU2Nyb2xsT2Zmc2V0WSA9IGZTY3JvbGxPZmZzZXQ7CiB9CiAKLXZvaWQgQ0ZXTF9FZGl0OjpEcmF3VGV4dEJrKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAordm9pZCBDRldMX0VkaXQ6OkRyYXdUZXh0QmsoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7CiAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOwpAQCAtNTA0LDQ5ICs0NTgsMzQgQEAKICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOwogfQogCi12b2lkIENGV0xfRWRpdDo6RHJhd0NvbnRlbnQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCit2b2lkIENGV0xfRWRpdDo6RHJhd0NvbnRlbnQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IG1fRWR0RW5naW5lLkdldFBhZ2UoMCk7Ci0gIGlmICghcFBhZ2UpCi0gICAgcmV0dXJuOwotCiAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsKKwogICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfQ29tYlRleHQpCiAgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOwogCiAgIENGWF9SZWN0RiBydENsaXAgPSBtX3J0RW5naW5lOwotICBGWF9GTE9BVCBmT2ZmU2V0WCA9IG1fcnRFbmdpbmUubGVmdCAtIG1fZlNjcm9sbE9mZnNldFg7Ci0gIEZYX0ZMT0FUIGZPZmZTZXRZID0gbV9ydEVuZ2luZS50b3AgLSBtX2ZTY3JvbGxPZmZzZXRZICsgbV9mVkFsaWduT2Zmc2V0OworICBmbG9hdCBmT2ZmU2V0WCA9IG1fcnRFbmdpbmUubGVmdCAtIG1fZlNjcm9sbE9mZnNldFg7CisgIGZsb2F0IGZPZmZTZXRZID0gbV9ydEVuZ2luZS50b3AgLSBtX2ZTY3JvbGxPZmZzZXRZICsgbV9mVkFsaWduT2Zmc2V0OworCiAgIENGWF9NYXRyaXggbXQoMSwgMCwgMCwgMSwgZk9mZlNldFgsIGZPZmZTZXRZKTsKICAgaWYgKHBNYXRyaXgpIHsKLSAgICBwTWF0cml4LT5UcmFuc2Zvcm1SZWN0KHJ0Q2xpcCk7CisgICAgcnRDbGlwID0gcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChydENsaXApOwogICAgIG10LkNvbmNhdCgqcE1hdHJpeCk7CiAgIH0KIAogICBib29sIGJTaG93U2VsID0gISEobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKTsKLSAgaW50MzJfdCBuU2VsQ291bnQgPSBtX0VkdEVuZ2luZS5Db3VudFNlbFJhbmdlcygpOwotICBpZiAoYlNob3dTZWwgJiYgblNlbENvdW50ID4gMCkgewotICAgIGludDMyX3QgblBhZ2VDaGFyU3RhcnQgPSBwUGFnZS0+R2V0Q2hhclN0YXJ0KCk7Ci0gICAgaW50MzJfdCBuUGFnZUNoYXJDb3VudCA9IHBQYWdlLT5HZXRDaGFyQ291bnQoKTsKLSAgICBpbnQzMl90IG5QYWdlQ2hhckVuZCA9IG5QYWdlQ2hhclN0YXJ0ICsgblBhZ2VDaGFyQ291bnQgLSAxOwotICAgIGludDMyX3QgbkNoYXJDb3VudDsKLSAgICBpbnQzMl90IG5DaGFyU3RhcnQ7Ci0gICAgc3RkOjp2ZWN0b3I8Q0ZYX1JlY3RGPiByZWN0QXJyOwotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5TZWxDb3VudDsgaSsrKSB7Ci0gICAgICBuQ2hhckNvdW50ID0gbV9FZHRFbmdpbmUuR2V0U2VsUmFuZ2UoaSwgJm5DaGFyU3RhcnQpOwotICAgICAgaW50MzJfdCBuQ2hhckVuZCA9IG5DaGFyU3RhcnQgKyBuQ2hhckNvdW50IC0gMTsKLSAgICAgIGlmIChuQ2hhckVuZCA8IG5QYWdlQ2hhclN0YXJ0IHx8IG5DaGFyU3RhcnQgPiBuUGFnZUNoYXJFbmQpCi0gICAgICAgIGNvbnRpbnVlOworICBpZiAoYlNob3dTZWwgJiYgbV9FZHRFbmdpbmUuSGFzU2VsZWN0aW9uKCkpIHsKKyAgICBzaXplX3Qgc2VsX3N0YXJ0OworICAgIHNpemVfdCBjb3VudDsKKyAgICBzdGQ6OnRpZShzZWxfc3RhcnQsIGNvdW50KSA9IG1fRWR0RW5naW5lLkdldFNlbGVjdGlvbigpOworICAgIHN0ZDo6dmVjdG9yPENGWF9SZWN0Rj4gcmVjdHMgPQorICAgICAgICBtX0VkdEVuZ2luZS5HZXRDaGFyYWN0ZXJSZWN0c0luUmFuZ2Uoc2VsX3N0YXJ0LCBjb3VudCk7CiAKLSAgICAgIGludDMyX3QgbkJnbiA9IHN0ZDo6bWF4KG5DaGFyU3RhcnQsIG5QYWdlQ2hhclN0YXJ0KTsKLSAgICAgIGludDMyX3QgbkVuZCA9IHN0ZDo6bWluKG5DaGFyRW5kLCBuUGFnZUNoYXJFbmQpOwotICAgICAgcFBhZ2UtPkNhbGNSYW5nZVJlY3RBcnJheShuQmduIC0gblBhZ2VDaGFyU3RhcnQsIG5FbmQgLSBuQmduICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3RBcnIpOwotICAgIH0KLQotICAgIENGWF9QYXRoIHBhdGg7Ci0gICAgZm9yIChhdXRvJiByZWN0IDogcmVjdEFycikgeworICAgIENYRkFfR0VQYXRoIHBhdGg7CisgICAgZm9yIChhdXRvJiByZWN0IDogcmVjdHMpIHsKICAgICAgIHJlY3QubGVmdCArPSBmT2ZmU2V0WDsKICAgICAgIHJlY3QudG9wICs9IGZPZmZTZXRZOwogICAgICAgcGF0aC5BZGRSZWN0YW5nbGUocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwpAQCAtNTY2LDE5ICs1MDUsMTUgQEAKICAgaWYgKCFwUmVuZGVyRGV2KQogICAgIHJldHVybjsKIAotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZERV9SZW5kZXJEZXZpY2U+IHBSZW5kZXJEZXZpY2UoCi0gICAgICBuZXcgQ0ZERV9SZW5kZXJEZXZpY2UocFJlbmRlckRldiwgZmFsc2UpKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGREVfUmVuZGVyQ29udGV4dD4gcFJlbmRlckNvbnRleHQobmV3IENGREVfUmVuZGVyQ29udGV4dCk7Ci0gIHBSZW5kZXJEZXZpY2UtPlNldENsaXBSZWN0KHJ0Q2xpcCk7Ci0gIHBSZW5kZXJDb250ZXh0LT5TdGFydFJlbmRlcihwUmVuZGVyRGV2aWNlLmdldCgpLCBwUGFnZSwgbXQpOwotICBwUmVuZGVyQ29udGV4dC0+RG9SZW5kZXIobnVsbHB0cik7CisgIFJlbmRlclRleHQocFJlbmRlckRldiwgcnRDbGlwLCBtdCk7CiAKICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0NvbWJUZXh0KSB7CiAgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOwotICAgIENGWF9QYXRoIHBhdGg7CisKKyAgICBDWEZBX0dFUGF0aCBwYXRoOwogICAgIGludDMyX3QgaUxpbWl0ID0gbV9uTGltaXQgPiAwID8gbV9uTGltaXQgOiAxOwotICAgIEZYX0ZMT0FUIGZTdGVwID0gbV9ydEVuZ2luZS53aWR0aCAvIGlMaW1pdDsKLSAgICBGWF9GTE9BVCBmTGVmdCA9IG1fcnRFbmdpbmUubGVmdCArIDE7CisgICAgZmxvYXQgZlN0ZXAgPSBtX3J0RW5naW5lLndpZHRoIC8gaUxpbWl0OworICAgIGZsb2F0IGZMZWZ0ID0gbV9ydEVuZ2luZS5sZWZ0ICsgMTsKICAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBpTGltaXQ7IGkrKykgewogICAgICAgZkxlZnQgKz0gZlN0ZXA7CiAgICAgICBwYXRoLkFkZExpbmUoQ0ZYX1BvaW50RihmTGVmdCwgbV9ydENsaWVudC50b3ApLApAQCAtNTk2LDM4ICs1MzEsNjggQEAKICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOwogfQogCit2b2lkIENGV0xfRWRpdDo6UmVuZGVyVGV4dChDRlhfUmVuZGVyRGV2aWNlKiBwUmVuZGVyRGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBjbGlwUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG10KSB7CisgIEFTU0VSVChwUmVuZGVyRGV2KTsKKworICBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBmb250ID0gbV9FZHRFbmdpbmUuR2V0Rm9udCgpOworICBpZiAoIWZvbnQpCisgICAgcmV0dXJuOworCisgIHBSZW5kZXJEZXYtPlNldENsaXBfUmVjdChjbGlwUmVjdCk7CisKKyAgQ0ZYX1JlY3RGIHJ0RG9jQ2xpcCA9IGNsaXBSZWN0OworICBpZiAocnREb2NDbGlwLklzRW1wdHkoKSkgeworICAgIHJ0RG9jQ2xpcC5sZWZ0ID0gMDsKKyAgICBydERvY0NsaXAudG9wID0gMDsKKyAgICBydERvY0NsaXAud2lkdGggPSBzdGF0aWNfY2FzdDxmbG9hdD4ocFJlbmRlckRldi0+R2V0V2lkdGgoKSk7CisgICAgcnREb2NDbGlwLmhlaWdodCA9IHN0YXRpY19jYXN0PGZsb2F0PihwUmVuZGVyRGV2LT5HZXRIZWlnaHQoKSk7CisgIH0KKyAgcnREb2NDbGlwID0gbXQuR2V0SW52ZXJzZSgpLlRyYW5zZm9ybVJlY3QocnREb2NDbGlwKTsKKworICBmb3IgKGNvbnN0IEZERV9URVhURURJVFBJRUNFJiBpbmZvIDogbV9FZHRFbmdpbmUuR2V0VGV4dFBpZWNlcygpKSB7CisgICAgLy8gSWYgdGhpcyBjaGFyYWN0ZXIgaXMgb3V0c2lkZSB0aGUgY2xpcCwgc2tpcCBpdC4KKyAgICBpZiAoIXJ0RG9jQ2xpcC5JbnRlcnNlY3RXaXRoKGluZm8ucnRQaWVjZSkpCisgICAgICBjb250aW51ZTsKKworICAgIHN0ZDo6dmVjdG9yPEZYVEVYVF9DSEFSUE9TPiBjaGFyX3BvcyA9IG1fRWR0RW5naW5lLkdldERpc3BsYXlQb3MoaW5mbyk7CisgICAgaWYgKGNoYXJfcG9zLmVtcHR5KCkpCisgICAgICBjb250aW51ZTsKKworICAgIENGREVfVGV4dE91dDo6RHJhd1N0cmluZyhwUmVuZGVyRGV2LCBtX0VkdEVuZ2luZS5HZXRGb250Q29sb3IoKSwgZm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcl9wb3MuZGF0YSgpLCBjaGFyX3Bvcy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fRWR0RW5naW5lLkdldEZvbnRTaXplKCksICZtdCk7CisgIH0KK30KKwogdm9pZCBDRldMX0VkaXQ6OlVwZGF0ZUVkaXRFbmdpbmUoKSB7CiAgIFVwZGF0ZUVkaXRQYXJhbXMoKTsKICAgVXBkYXRlRWRpdExheW91dCgpOwotICBpZiAobV9uTGltaXQgPiAtMSkKLSAgICBtX0VkdEVuZ2luZS5TZXRMaW1pdChtX25MaW1pdCk7CiB9CiAKIHZvaWQgQ0ZXTF9FZGl0OjpVcGRhdGVFZGl0UGFyYW1zKCkgewotICBGREVfVFhURURUUEFSQU1TIHBhcmFtczsKLSAgcGFyYW1zLm5Ib3J6U2NhbGUgPSAxMDA7Ci0gIHBhcmFtcy5mUGxhdGVXaWR0aCA9IG1fcnRFbmdpbmUud2lkdGg7Ci0gIHBhcmFtcy5mUGxhdGVIZWlnaHQgPSBtX3J0RW5naW5lLmhlaWdodDsKLSAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0NvbWJUZXh0KQotICAgIHBhcmFtcy5kd0xheW91dFN0eWxlcyB8PSBGREVfVEVYVEVESVRMQVlPVVRfQ29tYlRleHQ7Ci0gIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9MYXN0TGluZUhlaWdodCkKLSAgICBwYXJhbXMuZHdMYXlvdXRTdHlsZXMgfD0gRkRFX1RFWFRFRElUTEFZT1VUX0xhc3RMaW5lSGVpZ2h0OwotICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfVmFsaWRhdGUpCi0gICAgcGFyYW1zLmR3TW9kZSB8PSBGREVfVEVYVEVESVRNT0RFX1ZhbGlkYXRlOwotICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfUGFzc3dvcmQpCi0gICAgcGFyYW1zLmR3TW9kZSB8PSBGREVfVEVYVEVESVRNT0RFX1Bhc3N3b3JkOworICBtX0VkdEVuZ2luZS5TZXRBdmFpbGFibGVXaWR0aChtX3J0RW5naW5lLndpZHRoKTsKKyAgbV9FZHRFbmdpbmUuU2V0Q29tYlRleHQoCisgICAgICAhIShtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9Db21iVGV4dCkpOwogCisgIG1fRWR0RW5naW5lLkVuYWJsZVZhbGlkYXRpb24oCisgICAgICAhIShtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9WYWxpZGF0ZSkpOworICBtX0VkdEVuZ2luZS5FbmFibGVQYXNzd29yZE1vZGUoCisgICAgICAhIShtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9QYXNzd29yZCkpOworCisgIHVpbnQzMl90IGFsaWdubWVudCA9IDA7CiAgIHN3aXRjaCAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfSEFsaWduTWFzaykgewogICAgIGNhc2UgRldMX1NUWUxFRVhUX0VEVF9ITmVhcjogewotICAgICAgcGFyYW1zLmR3QWxpZ25tZW50IHw9IEZERV9URVhURURJVEFMSUdOX0xlZnQ7CisgICAgICBhbGlnbm1lbnQgfD0gQ0ZYX1R4dExpbmVBbGlnbm1lbnRfTGVmdDsKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBjYXNlIEZXTF9TVFlMRUVYVF9FRFRfSENlbnRlcjogewotICAgICAgcGFyYW1zLmR3QWxpZ25tZW50IHw9IEZERV9URVhURURJVEFMSUdOX0NlbnRlcjsKKyAgICAgIGFsaWdubWVudCB8PSBDRlhfVHh0TGluZUFsaWdubWVudF9DZW50ZXI7CiAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBGV0xfU1RZTEVFWFRfRURUX0hGYXI6IHsKLSAgICAgIHBhcmFtcy5kd0FsaWdubWVudCB8PSBGREVfVEVYVEVESVRBTElHTl9SaWdodDsKKyAgICAgIGFsaWdubWVudCB8PSBDRlhfVHh0TGluZUFsaWdubWVudF9SaWdodDsKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBkZWZhdWx0OgpAQCAtNjM1LDEyMiArNjAwLDk5IEBACiAgIH0KICAgc3dpdGNoIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9IQWxpZ25Nb2RlTWFzaykgewogICAgIGNhc2UgRldMX1NUWUxFRVhUX0VEVF9KdXN0aWZpZWQ6IHsKLSAgICAgIHBhcmFtcy5kd0FsaWdubWVudCB8PSBGREVfVEVYVEVESVRBTElHTl9KdXN0aWZpZWQ7CisgICAgICBhbGlnbm1lbnQgfD0gQ0ZYX1R4dExpbmVBbGlnbm1lbnRfSnVzdGlmaWVkOwogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGRlZmF1bHQ6IHsKLSAgICAgIHBhcmFtcy5kd0FsaWdubWVudCB8PSBGREVfVEVYVEVESVRBTElHTl9Ob3JtYWw7CisgICAgZGVmYXVsdDoKICAgICAgIGJyZWFrOwotICAgIH0KICAgfQorICBtX0VkdEVuZ2luZS5TZXRBbGlnbm1lbnQoYWxpZ25tZW50KTsKKworICBib29sIGF1dG9faHNjcm9sbCA9CisgICAgICAhIShtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9BdXRvSFNjcm9sbCk7CiAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9NdWx0aUxpbmUpIHsKLSAgICBwYXJhbXMuZHdNb2RlIHw9IEZERV9URVhURURJVE1PREVfTXVsdGlMaW5lczsKLSAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX0F1dG9IU2Nyb2xsKSA9PSAwKSB7Ci0gICAgICBwYXJhbXMuZHdNb2RlIHw9Ci0gICAgICAgICAgRkRFX1RFWFRFRElUTU9ERV9BdXRvTGluZVdyYXAgfCBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9Ib3J6OwotICAgIH0KLSAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfVlNjcm9sbCkgPT0gMCAmJgotICAgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYVF9FRFRfQXV0b1ZTY3JvbGwpID09IDApIHsKLSAgICAgIHBhcmFtcy5kd01vZGUgfD0gRkRFX1RFWFRFRElUTU9ERV9MaW1pdEFyZWFfVmVydDsKLSAgICB9IGVsc2UgewotICAgICAgcGFyYW1zLmZQbGF0ZUhlaWdodCA9IDB4MDBGRkZGRkY7Ci0gICAgfQotICB9IGVsc2UgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9BdXRvSFNjcm9sbCkgPT0KLSAgICAgICAgICAgICAwKSB7Ci0gICAgcGFyYW1zLmR3TW9kZSB8PSBGREVfVEVYVEVESVRNT0RFX0xpbWl0QXJlYV9Ib3J6OworICAgIG1fRWR0RW5naW5lLkVuYWJsZU11bHRpTGluZSh0cnVlKTsKKyAgICBtX0VkdEVuZ2luZS5FbmFibGVMaW5lV3JhcCghYXV0b19oc2Nyb2xsKTsKKyAgICBtX0VkdEVuZ2luZS5MaW1pdFZlcnRpY2FsU2Nyb2xsKAorICAgICAgICAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9WU2Nyb2xsKSA9PSAwICYmCisgICAgICAgIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9BdXRvVlNjcm9sbCkgPT0gMCk7CisgIH0gZWxzZSB7CisgICAgbV9FZHRFbmdpbmUuRW5hYmxlTXVsdGlMaW5lKGZhbHNlKTsKKyAgICBtX0VkdEVuZ2luZS5FbmFibGVMaW5lV3JhcChmYWxzZSk7CisgICAgbV9FZHRFbmdpbmUuTGltaXRWZXJ0aWNhbFNjcm9sbChmYWxzZSk7CiAgIH0KLSAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seSkgfHwKLSAgICAgIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSkgewotICAgIHBhcmFtcy5kd01vZGUgfD0gRkRFX1RFWFRFRElUTU9ERV9SZWFkT25seTsKLSAgfQorICBtX0VkdEVuZ2luZS5MaW1pdEhvcml6b250YWxTY3JvbGwoIWF1dG9faHNjcm9sbCk7CiAKICAgSUZXTF9UaGVtZVByb3ZpZGVyKiB0aGVtZSA9IEdldEF2YWlsYWJsZVRoZW1lKCk7CiAgIENGV0xfVGhlbWVQYXJ0IHBhcnQ7CiAgIHBhcnQubV9wV2lkZ2V0ID0gdGhpczsKLSAgbV9mRm9udFNpemUgPSB0aGVtZSA/IHRoZW1lLT5HZXRGb250U2l6ZSgmcGFydCkgOiBGV0xUSEVNRV9DQVBBQ0lUWV9Gb250U2l6ZTsKIAotICBpZiAoIXRoZW1lKQorICBpZiAoIXRoZW1lKSB7CisgICAgbV9mRm9udFNpemUgPSBGV0xUSEVNRV9DQVBBQ0lUWV9Gb250U2l6ZTsKICAgICByZXR1cm47CisgIH0KKyAgbV9mRm9udFNpemUgPSB0aGVtZS0+R2V0Rm9udFNpemUoJnBhcnQpOwogCi0gIHBhcmFtcy5kd0ZvbnRDb2xvciA9IHRoZW1lLT5HZXRUZXh0Q29sb3IoJnBhcnQpOwotICBwYXJhbXMuZkxpbmVTcGFjZSA9IHRoZW1lLT5HZXRMaW5lSGVpZ2h0KCZwYXJ0KTsKLQotICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gcEZvbnQgPSB0aGVtZS0+R2V0Rm9udCgmcGFydCk7CisgIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+IHBGb250ID0gdGhlbWUtPkdldEZvbnQoJnBhcnQpOwogICBpZiAoIXBGb250KQogICAgIHJldHVybjsKIAotICBwYXJhbXMucEZvbnQgPSBwRm9udDsKLSAgcGFyYW1zLmZGb250U2l6ZSA9IG1fZkZvbnRTaXplOwotICBwYXJhbXMubkxpbmVDb3VudCA9IChpbnQzMl90KShwYXJhbXMuZlBsYXRlSGVpZ2h0IC8gcGFyYW1zLmZMaW5lU3BhY2UpOwotICBpZiAocGFyYW1zLm5MaW5lQ291bnQgPD0gMCkKLSAgICBwYXJhbXMubkxpbmVDb3VudCA9IDE7Ci0gIHBhcmFtcy5mVGFiV2lkdGggPSBwYXJhbXMuZkZvbnRTaXplICogMTsKLSAgcGFyYW1zLmJUYWJFcXVpZGlzdGFudCA9IHRydWU7Ci0gIHBhcmFtcy53TGluZUJyZWFrQ2hhciA9IEwnXG4nOwotICBwYXJhbXMubkNoYXJSb3RhdGlvbiA9IDA7Ci0gIHBhcmFtcy5wRXZlbnRTaW5rID0gdGhpczsKLSAgbV9FZHRFbmdpbmUuU2V0RWRpdFBhcmFtcyhwYXJhbXMpOworICBtX0VkdEVuZ2luZS5TZXRGb250KHBGb250KTsKKyAgbV9FZHRFbmdpbmUuU2V0Rm9udENvbG9yKHRoZW1lLT5HZXRUZXh0Q29sb3IoJnBhcnQpKTsKKyAgbV9FZHRFbmdpbmUuU2V0Rm9udFNpemUobV9mRm9udFNpemUpOworICBtX0VkdEVuZ2luZS5TZXRMaW5lU3BhY2UodGhlbWUtPkdldExpbmVIZWlnaHQoJnBhcnQpKTsKKyAgbV9FZHRFbmdpbmUuU2V0VGFiV2lkdGgobV9mRm9udFNpemUpOworICBtX0VkdEVuZ2luZS5TZXRWaXNpYmxlTGluZUNvdW50KG1fcnRFbmdpbmUuaGVpZ2h0IC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZS0+R2V0TGluZUhlaWdodCgmcGFydCkpOwogfQogCiB2b2lkIENGV0xfRWRpdDo6VXBkYXRlRWRpdExheW91dCgpIHsKLSAgaWYgKG1fRWR0RW5naW5lLkdldFRleHRMZW5ndGgoKSA8PSAwKQotICAgIG1fRWR0RW5naW5lLlNldFRleHRCeVN0cmVhbShudWxscHRyKTsKLQotICBJRkRFX1R4dEVkdFBhZ2UqIHBQYWdlID0gbV9FZHRFbmdpbmUuR2V0UGFnZSgwKTsKLSAgaWYgKHBQYWdlKQotICAgIHBQYWdlLT5VbmxvYWRQYWdlKG51bGxwdHIpOwotCi0gIG1fRWR0RW5naW5lLlN0YXJ0TGF5b3V0KCk7Ci0gIG1fRWR0RW5naW5lLkRvTGF5b3V0KG51bGxwdHIpOwotICBtX0VkdEVuZ2luZS5FbmRMYXlvdXQoKTsKLSAgcFBhZ2UgPSBtX0VkdEVuZ2luZS5HZXRQYWdlKDApOwotICBpZiAocFBhZ2UpCi0gICAgcFBhZ2UtPkxvYWRQYWdlKG51bGxwdHIsIG51bGxwdHIpOworICBtX0VkdEVuZ2luZS5MYXlvdXQoKTsKIH0KIAogYm9vbCBDRldMX0VkaXQ6OlVwZGF0ZU9mZnNldCgpIHsKLSAgQ0ZYX1JlY3RGIHJ0Q2FyZXQ7Ci0gIG1fRWR0RW5naW5lLkdldENhcmV0UmVjdChydENhcmV0KTsKLSAgRlhfRkxPQVQgZk9mZlNldFggPSBtX3J0RW5naW5lLmxlZnQgLSBtX2ZTY3JvbGxPZmZzZXRYOwotICBGWF9GTE9BVCBmT2ZmU2V0WSA9IG1fcnRFbmdpbmUudG9wIC0gbV9mU2Nyb2xsT2Zmc2V0WSArIG1fZlZBbGlnbk9mZnNldDsKLSAgcnRDYXJldC5PZmZzZXQoZk9mZlNldFgsIGZPZmZTZXRZKTsKLSAgY29uc3QgQ0ZYX1JlY3RGJiBydEVpZHQgPSBtX3J0RW5naW5lOwotICBpZiAocnRFaWR0LkNvbnRhaW5zKHJ0Q2FyZXQpKSB7Ci0gICAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IG1fRWR0RW5naW5lLkdldFBhZ2UoMCk7Ci0gICAgaWYgKCFwUGFnZSkKLSAgICAgIHJldHVybiBmYWxzZTsKKyAgQ0ZYX1JlY3RGIHJ0Q2FyZXQgPSBtX3J0Q2FyZXQ7CiAKLSAgICBDRlhfUmVjdEYgcnRGREUgPSBwUGFnZS0+R2V0Q29udGVudHNCb3goKTsKLSAgICBydEZERS5PZmZzZXQoZk9mZlNldFgsIGZPZmZTZXRZKTsKLSAgICBpZiAocnRGREUucmlnaHQoKSA8IHJ0RWlkdC5yaWdodCgpICYmIG1fZlNjcm9sbE9mZnNldFggPiAwKSB7Ci0gICAgICBtX2ZTY3JvbGxPZmZzZXRYICs9IHJ0RkRFLnJpZ2h0KCkgLSBydEVpZHQucmlnaHQoKTsKKyAgZmxvYXQgZk9mZlNldFggPSBtX3J0RW5naW5lLmxlZnQgLSBtX2ZTY3JvbGxPZmZzZXRYOworICBmbG9hdCBmT2ZmU2V0WSA9IG1fcnRFbmdpbmUudG9wIC0gbV9mU2Nyb2xsT2Zmc2V0WSArIG1fZlZBbGlnbk9mZnNldDsKKyAgcnRDYXJldC5PZmZzZXQoZk9mZlNldFgsIGZPZmZTZXRZKTsKKworICBjb25zdCBDRlhfUmVjdEYmIGVkaXRfYm91bmRzID0gbV9ydEVuZ2luZTsKKyAgaWYgKGVkaXRfYm91bmRzLkNvbnRhaW5zKHJ0Q2FyZXQpKSB7CisgICAgQ0ZYX1JlY3RGIGNvbnRlbnRzX2JvdW5kcyA9IG1fRWR0RW5naW5lLkdldENvbnRlbnRzQm91bmRpbmdCb3goKTsKKyAgICBjb250ZW50c19ib3VuZHMuT2Zmc2V0KGZPZmZTZXRYLCBmT2ZmU2V0WSk7CisgICAgaWYgKGNvbnRlbnRzX2JvdW5kcy5yaWdodCgpIDwgZWRpdF9ib3VuZHMucmlnaHQoKSAmJiBtX2ZTY3JvbGxPZmZzZXRYID4gMCkgeworICAgICAgbV9mU2Nyb2xsT2Zmc2V0WCArPSBjb250ZW50c19ib3VuZHMucmlnaHQoKSAtIGVkaXRfYm91bmRzLnJpZ2h0KCk7CiAgICAgICBtX2ZTY3JvbGxPZmZzZXRYID0gc3RkOjptYXgobV9mU2Nyb2xsT2Zmc2V0WCwgMC4wZik7CiAgICAgfQotICAgIGlmIChydEZERS5ib3R0b20oKSA8IHJ0RWlkdC5ib3R0b20oKSAmJiBtX2ZTY3JvbGxPZmZzZXRZID4gMCkgewotICAgICAgbV9mU2Nyb2xsT2Zmc2V0WSArPSBydEZERS5ib3R0b20oKSAtIHJ0RWlkdC5ib3R0b20oKTsKKyAgICBpZiAoY29udGVudHNfYm91bmRzLmJvdHRvbSgpIDwgZWRpdF9ib3VuZHMuYm90dG9tKCkgJiYKKyAgICAgICAgbV9mU2Nyb2xsT2Zmc2V0WSA+IDApIHsKKyAgICAgIG1fZlNjcm9sbE9mZnNldFkgKz0gY29udGVudHNfYm91bmRzLmJvdHRvbSgpIC0gZWRpdF9ib3VuZHMuYm90dG9tKCk7CiAgICAgICBtX2ZTY3JvbGxPZmZzZXRZID0gc3RkOjptYXgobV9mU2Nyb2xsT2Zmc2V0WSwgMC4wZik7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIEZYX0ZMT0FUIG9mZnNldFggPSAwLjA7Ci0gIEZYX0ZMT0FUIG9mZnNldFkgPSAwLjA7Ci0gIGlmIChydENhcmV0LmxlZnQgPCBydEVpZHQubGVmdCkKLSAgICBvZmZzZXRYID0gcnRDYXJldC5sZWZ0IC0gcnRFaWR0LmxlZnQ7Ci0gIGlmIChydENhcmV0LnJpZ2h0KCkgPiBydEVpZHQucmlnaHQoKSkKLSAgICBvZmZzZXRYID0gcnRDYXJldC5yaWdodCgpIC0gcnRFaWR0LnJpZ2h0KCk7Ci0gIGlmIChydENhcmV0LnRvcCA8IHJ0RWlkdC50b3ApCi0gICAgb2Zmc2V0WSA9IHJ0Q2FyZXQudG9wIC0gcnRFaWR0LnRvcDsKLSAgaWYgKHJ0Q2FyZXQuYm90dG9tKCkgPiBydEVpZHQuYm90dG9tKCkpCi0gICAgb2Zmc2V0WSA9IHJ0Q2FyZXQuYm90dG9tKCkgLSBydEVpZHQuYm90dG9tKCk7CisgIGZsb2F0IG9mZnNldFggPSAwLjA7CisgIGZsb2F0IG9mZnNldFkgPSAwLjA7CisgIGlmIChydENhcmV0LmxlZnQgPCBlZGl0X2JvdW5kcy5sZWZ0KQorICAgIG9mZnNldFggPSBydENhcmV0LmxlZnQgLSBlZGl0X2JvdW5kcy5sZWZ0OworICBpZiAocnRDYXJldC5yaWdodCgpID4gZWRpdF9ib3VuZHMucmlnaHQoKSkKKyAgICBvZmZzZXRYID0gcnRDYXJldC5yaWdodCgpIC0gZWRpdF9ib3VuZHMucmlnaHQoKTsKKyAgaWYgKHJ0Q2FyZXQudG9wIDwgZWRpdF9ib3VuZHMudG9wKQorICAgIG9mZnNldFkgPSBydENhcmV0LnRvcCAtIGVkaXRfYm91bmRzLnRvcDsKKyAgaWYgKHJ0Q2FyZXQuYm90dG9tKCkgPiBlZGl0X2JvdW5kcy5ib3R0b20oKSkKKyAgICBvZmZzZXRZID0gcnRDYXJldC5ib3R0b20oKSAtIGVkaXRfYm91bmRzLmJvdHRvbSgpOworCiAgIG1fZlNjcm9sbE9mZnNldFggKz0gb2Zmc2V0WDsKICAgbV9mU2Nyb2xsT2Zmc2V0WSArPSBvZmZzZXRZOwogICBpZiAobV9mRm9udFNpemUgPiBtX3J0RW5naW5lLmhlaWdodCkKICAgICBtX2ZTY3JvbGxPZmZzZXRZID0gMDsKKwogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDRldMX0VkaXQ6OlVwZGF0ZU9mZnNldChDRldMX1Njcm9sbEJhciogcFNjcm9sbEJhciwgRlhfRkxPQVQgZlBvc0NoYW5nZWQpIHsKK2Jvb2wgQ0ZXTF9FZGl0OjpVcGRhdGVPZmZzZXQoQ0ZXTF9TY3JvbGxCYXIqIHBTY3JvbGxCYXIsIGZsb2F0IGZQb3NDaGFuZ2VkKSB7CiAgIGlmIChwU2Nyb2xsQmFyID09IG1fcEhvcnpTY3JvbGxCYXIuZ2V0KCkpCiAgICAgbV9mU2Nyb2xsT2Zmc2V0WCArPSBmUG9zQ2hhbmdlZDsKICAgZWxzZQpAQCAtNzU5LDM3ICs3MDEsMjkgQEAKIH0KIAogdm9pZCBDRldMX0VkaXQ6OlVwZGF0ZVZBbGlnbm1lbnQoKSB7Ci0gIElGREVfVHh0RWR0UGFnZSogcFBhZ2UgPSBtX0VkdEVuZ2luZS5HZXRQYWdlKDApOwotICBpZiAoIXBQYWdlKQotICAgIHJldHVybjsKLQotICBjb25zdCBDRlhfUmVjdEYmIHJ0RkRFID0gcFBhZ2UtPkdldENvbnRlbnRzQm94KCk7Ci0gIEZYX0ZMT0FUIGZPZmZzZXRZID0gMC4wZjsKLSAgRlhfRkxPQVQgZlNwYWNlQWJvdmUgPSAwLjBmOwotICBGWF9GTE9BVCBmU3BhY2VCZWxvdyA9IDAuMGY7CisgIGZsb2F0IGZTcGFjZUFib3ZlID0gMC4wZjsKKyAgZmxvYXQgZlNwYWNlQmVsb3cgPSAwLjBmOwogICBJRldMX1RoZW1lUHJvdmlkZXIqIHRoZW1lID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsKICAgaWYgKHRoZW1lKSB7CiAgICAgQ0ZXTF9UaGVtZVBhcnQgcGFydDsKICAgICBwYXJ0Lm1fcFdpZGdldCA9IHRoaXM7CiAKICAgICBDRlhfU2l6ZUYgcFNwYWNlID0gdGhlbWUtPkdldFNwYWNlQWJvdmVCZWxvdygmcGFydCk7Ci0gICAgZlNwYWNlQWJvdmUgPSBwU3BhY2Uud2lkdGg7Ci0gICAgZlNwYWNlQmVsb3cgPSBwU3BhY2UuaGVpZ2h0OworICAgIGZTcGFjZUFib3ZlID0gcFNwYWNlLndpZHRoID49IDAuMWYgPyBwU3BhY2Uud2lkdGggOiAwLjBmOworICAgIGZTcGFjZUJlbG93ID0gcFNwYWNlLmhlaWdodCA+PSAwLjFmID8gcFNwYWNlLmhlaWdodCA6IDAuMGY7CiAgIH0KLSAgaWYgKGZTcGFjZUFib3ZlIDwgMC4xZikKLSAgICBmU3BhY2VBYm92ZSA9IDA7Ci0gIGlmIChmU3BhY2VCZWxvdyA8IDAuMWYpCi0gICAgZlNwYWNlQmVsb3cgPSAwOwogCisgIGZsb2F0IGZPZmZzZXRZID0gMC4wZjsKKyAgQ0ZYX1JlY3RGIGNvbnRlbnRzX2JvdW5kcyA9IG1fRWR0RW5naW5lLkdldENvbnRlbnRzQm91bmRpbmdCb3goKTsKICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1ZDZW50ZXIpIHsKLSAgICBmT2Zmc2V0WSA9IChtX3J0RW5naW5lLmhlaWdodCAtIHJ0RkRFLmhlaWdodCkgLyAyOwotICAgIGlmIChmT2Zmc2V0WSA8IChmU3BhY2VBYm92ZSArIGZTcGFjZUJlbG93KSAvIDIgJiYKKyAgICBmT2Zmc2V0WSA9IChtX3J0RW5naW5lLmhlaWdodCAtIGNvbnRlbnRzX2JvdW5kcy5oZWlnaHQpIC8gMi4wZjsKKyAgICBpZiAoZk9mZnNldFkgPCAoZlNwYWNlQWJvdmUgKyBmU3BhY2VCZWxvdykgLyAyLjBmICYmCiAgICAgICAgIGZTcGFjZUFib3ZlIDwgZlNwYWNlQmVsb3cpIHsKICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgZk9mZnNldFkgKz0gKGZTcGFjZUFib3ZlIC0gZlNwYWNlQmVsb3cpIC8gMjsKKyAgICBmT2Zmc2V0WSArPSAoZlNwYWNlQWJvdmUgLSBmU3BhY2VCZWxvdykgLyAyLjBmOwogICB9IGVsc2UgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1ZGYXIpIHsKLSAgICBmT2Zmc2V0WSA9IChtX3J0RW5naW5lLmhlaWdodCAtIHJ0RkRFLmhlaWdodCk7CisgICAgZk9mZnNldFkgPSAobV9ydEVuZ2luZS5oZWlnaHQgLSBjb250ZW50c19ib3VuZHMuaGVpZ2h0KTsKICAgICBmT2Zmc2V0WSAtPSBmU3BhY2VCZWxvdzsKICAgfSBlbHNlIHsKICAgICBmT2Zmc2V0WSArPSBmU3BhY2VBYm92ZTsKQEAgLTc5OCwxNyArNzMyLDE0IEBACiB9CiAKIHZvaWQgQ0ZXTF9FZGl0OjpVcGRhdGVDYXJldCgpIHsKLSAgQ0ZYX1JlY3RGIHJ0RkRFOwotICBtX0VkdEVuZ2luZS5HZXRDYXJldFJlY3QocnRGREUpOwotCi0gIHJ0RkRFLk9mZnNldChtX3J0RW5naW5lLmxlZnQgLSBtX2ZTY3JvbGxPZmZzZXRYLAotICAgICAgICAgICAgICAgbV9ydEVuZ2luZS50b3AgLSBtX2ZTY3JvbGxPZmZzZXRZICsgbV9mVkFsaWduT2Zmc2V0KTsKLSAgQ0ZYX1JlY3RGIHJ0Q2FyZXQocnRGREUubGVmdCwgcnRGREUudG9wLCBydEZERS53aWR0aCwgcnRGREUuaGVpZ2h0KTsKKyAgQ0ZYX1JlY3RGIHJ0Q2FyZXQgPSBtX3J0Q2FyZXQ7CisgIHJ0Q2FyZXQuT2Zmc2V0KG1fcnRFbmdpbmUubGVmdCAtIG1fZlNjcm9sbE9mZnNldFgsCisgICAgICAgICAgICAgICAgIG1fcnRFbmdpbmUudG9wIC0gbV9mU2Nyb2xsT2Zmc2V0WSArIG1fZlZBbGlnbk9mZnNldCk7CiAKICAgQ0ZYX1JlY3RGIHJ0Q2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwogICBydENhcmV0LkludGVyc2VjdChydENsaWVudCk7CiAgIGlmIChydENhcmV0LmxlZnQgPiBydENsaWVudC5yaWdodCgpKSB7Ci0gICAgRlhfRkxPQVQgcmlnaHQgPSBydENhcmV0LnJpZ2h0KCk7CisgICAgZmxvYXQgcmlnaHQgPSBydENhcmV0LnJpZ2h0KCk7CiAgICAgcnRDYXJldC5sZWZ0ID0gcnRDbGllbnQucmlnaHQoKSAtIDE7CiAgICAgcnRDYXJldC53aWR0aCA9IHJpZ2h0IC0gcnRDYXJldC5sZWZ0OwogICB9CkBAIC04MjksMjAgKzc2MCwxNiBAQAogICBpZiAoIWJTaG93SG9yeiAmJiAhYlNob3dWZXJ0KQogICAgIHJldHVybiBudWxscHRyOwogCi0gIElGREVfVHh0RWR0UGFnZSogcFBhZ2UgPSBtX0VkdEVuZ2luZS5HZXRQYWdlKDApOwotICBpZiAoIXBQYWdlKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIGNvbnN0IENGWF9SZWN0RiYgcnRGREUgPSBwUGFnZS0+R2V0Q29udGVudHNCb3goKTsKKyAgQ0ZYX1JlY3RGIGNvbnRlbnRzX2JvdW5kcyA9IG1fRWR0RW5naW5lLkdldENvbnRlbnRzQm91bmRpbmdCb3goKTsKICAgQ0ZXTF9TY3JvbGxCYXIqIHBSZXBhaW50ID0gbnVsbHB0cjsKICAgaWYgKGJTaG93SG9yeikgewogICAgIENGWF9SZWN0RiBydFNjcm9sbCA9IG1fcEhvcnpTY3JvbGxCYXItPkdldFdpZGdldFJlY3QoKTsKLSAgICBpZiAocnRTY3JvbGwud2lkdGggPCBydEZERS53aWR0aCkgeworICAgIGlmIChydFNjcm9sbC53aWR0aCA8IGNvbnRlbnRzX2JvdW5kcy53aWR0aCkgewogICAgICAgbV9wSG9yelNjcm9sbEJhci0+TG9ja1VwZGF0ZSgpOwotICAgICAgRlhfRkxPQVQgZlJhbmdlID0gcnRGREUud2lkdGggLSBydFNjcm9sbC53aWR0aDsKKyAgICAgIGZsb2F0IGZSYW5nZSA9IGNvbnRlbnRzX2JvdW5kcy53aWR0aCAtIHJ0U2Nyb2xsLndpZHRoOwogICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0UmFuZ2UoMC4wZiwgZlJhbmdlKTsKIAotICAgICAgRlhfRkxPQVQgZlBvcyA9IHN0ZDo6bWluKHN0ZDo6bWF4KG1fZlNjcm9sbE9mZnNldFgsIDAuMGYpLCBmUmFuZ2UpOworICAgICAgZmxvYXQgZlBvcyA9IHBkZml1bTo6Y2xhbXAobV9mU2Nyb2xsT2Zmc2V0WCwgMC4wZiwgZlJhbmdlKTsKICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFBvcyhmUG9zKTsKICAgICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFRyYWNrUG9zKGZQb3MpOwogICAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0UGFnZVNpemUocnRTY3JvbGwud2lkdGgpOwpAQCAtODYzLDEzICs3OTAsMTQgQEAKIAogICBpZiAoYlNob3dWZXJ0KSB7CiAgICAgQ0ZYX1JlY3RGIHJ0U2Nyb2xsID0gbV9wVmVydFNjcm9sbEJhci0+R2V0V2lkZ2V0UmVjdCgpOwotICAgIGlmIChydFNjcm9sbC5oZWlnaHQgPCBydEZERS5oZWlnaHQpIHsKKyAgICBpZiAocnRTY3JvbGwuaGVpZ2h0IDwgY29udGVudHNfYm91bmRzLmhlaWdodCkgewogICAgICAgbV9wVmVydFNjcm9sbEJhci0+TG9ja1VwZGF0ZSgpOwotICAgICAgRlhfRkxPQVQgZlN0ZXAgPSBtX0VkdEVuZ2luZS5HZXRFZGl0UGFyYW1zKCktPmZMaW5lU3BhY2U7Ci0gICAgICBGWF9GTE9BVCBmUmFuZ2UgPSBzdGQ6Om1heChydEZERS5oZWlnaHQgLSBtX3J0RW5naW5lLmhlaWdodCwgZlN0ZXApOworICAgICAgZmxvYXQgZlN0ZXAgPSBtX0VkdEVuZ2luZS5HZXRMaW5lU3BhY2UoKTsKKyAgICAgIGZsb2F0IGZSYW5nZSA9CisgICAgICAgICAgc3RkOjptYXgoY29udGVudHNfYm91bmRzLmhlaWdodCAtIG1fcnRFbmdpbmUuaGVpZ2h0LCBmU3RlcCk7CiAKICAgICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFJhbmdlKDAuMGYsIGZSYW5nZSk7Ci0gICAgICBGWF9GTE9BVCBmUG9zID0gc3RkOjptaW4oc3RkOjptYXgobV9mU2Nyb2xsT2Zmc2V0WSwgMC4wZiksIGZSYW5nZSk7CisgICAgICBmbG9hdCBmUG9zID0gcGRmaXVtOjpjbGFtcChtX2ZTY3JvbGxPZmZzZXRZLCAwLjBmLCBmUmFuZ2UpOwogICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0UG9zKGZQb3MpOwogICAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0VHJhY2tQb3MoZlBvcyk7CiAgICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRQYWdlU2l6ZShydFNjcm9sbC5oZWlnaHQpOwpAQCAtODkxLDQxICs4MTksMjAgQEAKIH0KIAogYm9vbCBDRldMX0VkaXQ6OklzU2hvd1Njcm9sbEJhcihib29sIGJWZXJ0KSB7CisgIGlmICghYlZlcnQpCisgICAgcmV0dXJuIGZhbHNlOwogICBib29sIGJTaG93ID0KICAgICAgIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9TaG93U2Nyb2xsYmFyRm9jdXMpCiAgICAgICAgICAgPyAobV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmIEZXTF9XR1RTVEFURV9Gb2N1c2VkKSA9PQogICAgICAgICAgICAgICAgIEZXTF9XR1RTVEFURV9Gb2N1c2VkCiAgICAgICAgICAgOiB0cnVlOwotICBpZiAoYlZlcnQpIHsKLSAgICByZXR1cm4gYlNob3cgJiYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfVlNjcm9sbCkgJiYKLSAgICAgICAgICAgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX011bHRpTGluZSkgJiYKLSAgICAgICAgICAgSXNDb250ZW50SGVpZ2h0T3ZlcmZsb3coKTsKLSAgfQotICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBiU2hvdyAmJiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9WU2Nyb2xsKSAmJgorICAgICAgICAgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX011bHRpTGluZSkgJiYKKyAgICAgICAgIElzQ29udGVudEhlaWdodE92ZXJmbG93KCk7CiB9CiAKIGJvb2wgQ0ZXTF9FZGl0OjpJc0NvbnRlbnRIZWlnaHRPdmVyZmxvdygpIHsKLSAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IG1fRWR0RW5naW5lLkdldFBhZ2UoMCk7Ci0gIGlmICghcFBhZ2UpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gcFBhZ2UtPkdldENvbnRlbnRzQm94KCkuaGVpZ2h0ID4gbV9ydEVuZ2luZS5oZWlnaHQgKyAxLjBmOwotfQotCi1pbnQzMl90IENGV0xfRWRpdDo6QWRkRG9SZWNvcmQoc3RkOjp1bmlxdWVfcHRyPElGREVfVHh0RWR0RG9SZWNvcmQ+IHBSZWNvcmQpIHsKLSAgaW50MzJfdCBuQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fRG9SZWNvcmRzKTsKLSAgaWYgKG1faUN1clJlY29yZCA9PSBuQ291bnQgLSAxKSB7Ci0gICAgaWYgKG5Db3VudCA9PSBtX2lNYXhSZWNvcmQpIHsKLSAgICAgIG1fRG9SZWNvcmRzLnBvcF9mcm9udCgpOwotICAgICAgbV9pQ3VyUmVjb3JkLS07Ci0gICAgfQotICB9IGVsc2UgewotICAgIG1fRG9SZWNvcmRzLmVyYXNlKG1fRG9SZWNvcmRzLmJlZ2luKCkgKyBtX2lDdXJSZWNvcmQgKyAxLAotICAgICAgICAgICAgICAgICAgICAgIG1fRG9SZWNvcmRzLmVuZCgpKTsKLSAgfQotCi0gIG1fRG9SZWNvcmRzLnB1c2hfYmFjayhzdGQ6Om1vdmUocFJlY29yZCkpOwotICBtX2lDdXJSZWNvcmQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fRG9SZWNvcmRzKSAtIDE7Ci0gIHJldHVybiBtX2lDdXJSZWNvcmQ7CisgIHJldHVybiBtX0VkdEVuZ2luZS5HZXRDb250ZW50c0JvdW5kaW5nQm94KCkuaGVpZ2h0ID4gbV9ydEVuZ2luZS5oZWlnaHQgKyAxLjBmOwogfQogCiB2b2lkIENGV0xfRWRpdDo6TGF5b3V0KCkgewpAQCAtOTM1LDcgKzg0Miw3IEBACiAgIGlmICghdGhlbWUpCiAgICAgcmV0dXJuOwogCi0gIEZYX0ZMT0FUIGZXaWR0aCA9IHRoZW1lLT5HZXRTY3JvbGxCYXJXaWR0aCgpOworICBmbG9hdCBmV2lkdGggPSB0aGVtZS0+R2V0U2Nyb2xsQmFyV2lkdGgoKTsKICAgQ0ZXTF9UaGVtZVBhcnQgcGFydDsKICAgaWYgKCFtX3BPdXRlcikgewogICAgIHBhcnQubV9wV2lkZ2V0ID0gdGhpczsKQEAgLTEwMDUsNyArOTEyLDcgQEAKICAgYm9vbCBiU2hvd0hvcnpTY3JvbGxiYXIgPSBJc1Nob3dTY3JvbGxCYXIoZmFsc2UpOwogCiAgIElGV0xfVGhlbWVQcm92aWRlciogdGhlbWUgPSBHZXRBdmFpbGFibGVUaGVtZSgpOwotICBGWF9GTE9BVCBmV2lkdGggPSB0aGVtZSA/IHRoZW1lLT5HZXRTY3JvbGxCYXJXaWR0aCgpIDogMDsKKyAgZmxvYXQgZldpZHRoID0gdGhlbWUgPyB0aGVtZS0+R2V0U2Nyb2xsQmFyV2lkdGgoKSA6IDA7CiAgIGlmIChiU2hvd1ZlcnRTY3JvbGxiYXIpIHsKICAgICBpZiAoIW1fcFZlcnRTY3JvbGxCYXIpIHsKICAgICAgIEluaXRWZXJ0aWNhbFNjcm9sbEJhcigpOwpAQCAtMTA2Niw4ICs5NzMsOCBAQAogICBwcm9wLT5tX2R3U3RhdGVzID0gRldMX1dHVFNUQVRFX0Rpc2FibGVkIHwgRldMX1dHVFNUQVRFX0ludmlzaWJsZTsKICAgcHJvcC0+bV9wUGFyZW50ID0gdGhpczsKICAgcHJvcC0+bV9wVGhlbWVQcm92aWRlciA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7Ci0gIG1fcFZlcnRTY3JvbGxCYXIgPQotICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfU2Nyb2xsQmFyPihtX3BPd25lckFwcCwgc3RkOjptb3ZlKHByb3ApLCB0aGlzKTsKKyAgbV9wVmVydFNjcm9sbEJhciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRldMX1Njcm9sbEJhcj4obV9wT3duZXJBcHAuR2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwcm9wKSwgdGhpcyk7CiB9CiAKIHZvaWQgQ0ZXTF9FZGl0OjpJbml0SG9yaXpvbnRhbFNjcm9sbEJhcigpIHsKQEAgLTEwNzksOCArOTg2LDggQEAKICAgcHJvcC0+bV9kd1N0YXRlcyA9IEZXTF9XR1RTVEFURV9EaXNhYmxlZCB8IEZXTF9XR1RTVEFURV9JbnZpc2libGU7CiAgIHByb3AtPm1fcFBhcmVudCA9IHRoaXM7CiAgIHByb3AtPm1fcFRoZW1lUHJvdmlkZXIgPSBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyOwotICBtX3BIb3J6U2Nyb2xsQmFyID0KLSAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDRldMX1Njcm9sbEJhcj4obV9wT3duZXJBcHAsIHN0ZDo6bW92ZShwcm9wKSwgdGhpcyk7CisgIG1fcEhvcnpTY3JvbGxCYXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZXTF9TY3JvbGxCYXI+KG1fcE93bmVyQXBwLkdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocHJvcCksIHRoaXMpOwogfQogCiB2b2lkIENGV0xfRWRpdDo6U2hvd0NhcmV0KENGWF9SZWN0RiogcFJlY3QpIHsKQEAgLTExMTAsOCArMTAxNyw3IEBACiAgIGlmICghcERvY0Vudmlyb25tZW50KQogICAgIHJldHVybjsKIAotICBDRlhfUmVjdEYgcnQoKnBSZWN0KTsKLSAgcFhGQVdpZGdldC0+R2V0Um90YXRlTWF0cml4KCkuVHJhbnNmb3JtUmVjdChydCk7CisgIENGWF9SZWN0RiBydCA9IHBYRkFXaWRnZXQtPkdldFJvdGF0ZU1hdHJpeCgpLlRyYW5zZm9ybVJlY3QoKnBSZWN0KTsKICAgcERvY0Vudmlyb25tZW50LT5EaXNwbGF5Q2FyZXQocFhGQVdpZGdldCwgdHJ1ZSwgJnJ0KTsKIH0KIApAQCAtMTEzOCw1MyArMTA0NCw1MSBAQAogICBwRG9jRW52aXJvbm1lbnQtPkRpc3BsYXlDYXJldChwWEZBV2lkZ2V0LCBmYWxzZSwgcFJlY3QpOwogfQogCi1ib29sIENGV0xfRWRpdDo6VmFsaWRhdGVOdW1iZXJDaGFyKEZYX1dDSEFSIGNOdW0pIHsKK2Jvb2wgQ0ZXTF9FZGl0OjpWYWxpZGF0ZU51bWJlckNoYXIod2NoYXJfdCBjTnVtKSB7CiAgIGlmICghbV9iU2V0UmFuZ2UpCiAgICAgcmV0dXJuIHRydWU7CiAKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0ID0gbV9FZHRFbmdpbmUuR2V0VGV4dCgwLCAtMSk7Ci0gIGlmICh3c1RleHQuSXNFbXB0eSgpKSB7Ci0gICAgaWYgKGNOdW0gPT0gTCcwJykKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQorICBXaWRlU3RyaW5nIHdzVGV4dCA9IG1fRWR0RW5naW5lLkdldFRleHQoKTsKKyAgaWYgKHdzVGV4dC5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIGNOdW0gIT0gTCcwJzsKIAotICBpbnQzMl90IGNhcmV0UG9zID0gbV9FZHRFbmdpbmUuR2V0Q2FyZXRQb3MoKTsKLSAgaWYgKENvdW50U2VsUmFuZ2VzKCkgPT0gMCkgewotICAgIGlmIChjTnVtID09IEwnMCcgJiYgY2FyZXRQb3MgPT0gMCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGludDMyX3QgbkxlbiA9IHdzVGV4dC5HZXRMZW5ndGgoKTsKLSAgICBDRlhfV2lkZVN0cmluZyBsID0gd3NUZXh0Lk1pZCgwLCBjYXJldFBvcyk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgciA9IHdzVGV4dC5NaWQoY2FyZXRQb3MsIG5MZW4gLSBjYXJldFBvcyk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NOZXcgPSBsICsgY051bSArIHI7Ci0gICAgaWYgKHdzTmV3LkdldEludGVnZXIoKSA8PSBtX2lNYXgpCi0gICAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKEhhc1NlbGVjdGlvbigpKQorICAgIHJldHVybiB3c1RleHQuR2V0SW50ZWdlcigpIDw9IG1faU1heDsKKyAgaWYgKGNOdW0gPT0gTCcwJyAmJiBtX0N1cnNvclBvc2l0aW9uID09IDApCiAgICAgcmV0dXJuIGZhbHNlOwotICB9CiAKLSAgaWYgKHdzVGV4dC5HZXRJbnRlZ2VyKCkgPD0gbV9pTWF4KQotICAgIHJldHVybiB0cnVlOwotICByZXR1cm4gZmFsc2U7CisgIGludDMyX3QgbkxlbiA9IHdzVGV4dC5HZXRMZW5ndGgoKTsKKyAgV2lkZVN0cmluZyBsID0gd3NUZXh0LkxlZnQobV9DdXJzb3JQb3NpdGlvbik7CisgIFdpZGVTdHJpbmcgciA9IHdzVGV4dC5SaWdodChuTGVuIC0gbV9DdXJzb3JQb3NpdGlvbik7CisgIFdpZGVTdHJpbmcgd3NOZXcgPSBsICsgY051bSArIHI7CisgIHJldHVybiB3c05ldy5HZXRJbnRlZ2VyKCkgPD0gbV9pTWF4OwogfQogCiB2b2lkIENGV0xfRWRpdDo6SW5pdENhcmV0KCkgewotICBpZiAoIW1fcENhcmV0KQotICAgIHJldHVybjsKICAgbV9wQ2FyZXQucmVzZXQoKTsKKyAgbV9ydENhcmV0ID0gQ0ZYX1JlY3RGKCk7CiB9CiAKLXZvaWQgQ0ZXTF9FZGl0OjpDbGVhclJlY29yZCgpIHsKLSAgbV9pQ3VyUmVjb3JkID0gLTE7Ci0gIG1fRG9SZWNvcmRzLmNsZWFyKCk7Cit2b2lkIENGV0xfRWRpdDo6VXBkYXRlQ3Vyc29yUmVjdCgpIHsKKyAgaW50MzJfdCBiaWRpX2xldmVsID0gMDsKKyAgbV9ydENhcmV0ID0gQ0ZYX1JlY3RGKCk7CisgIHN0ZDo6dGllKGJpZGlfbGV2ZWwsIG1fcnRDYXJldCkgPQorICAgICAgbV9FZHRFbmdpbmUuR2V0Q2hhcmFjdGVySW5mbyhtX0N1cnNvclBvc2l0aW9uKTsKKyAgLy8gVE9ETyhkc2luY2xhaXIpOiBUaGlzIHNob3VsZCBoYW5kbGUgYmlkaSBsZXZlbCAgLi4uCisKKyAgaWYgKG1fcnRDYXJldC53aWR0aCA9PSAwICYmIG1fcnRDYXJldC5sZWZ0ID4gMS4wZikKKyAgICBtX3J0Q2FyZXQubGVmdCAtPSAxLjBmOworCisgIG1fcnRDYXJldC53aWR0aCA9IDEuMGY7CiB9CiAKLXZvaWQgQ0ZXTF9FZGl0OjpQcm9jZXNzSW5zZXJ0RXJyb3IoaW50MzJfdCBpRXJyb3IpIHsKLSAgaWYgKGlFcnJvciAhPSAtMikKK3ZvaWQgQ0ZXTF9FZGl0OjpTZXRDdXJzb3JQb3NpdGlvbihzaXplX3QgcG9zaXRpb24pIHsKKyAgaWYgKG1fQ3Vyc29yUG9zaXRpb24gPT0gcG9zaXRpb24pCiAgICAgcmV0dXJuOwogCi0gIENGV0xfRXZlbnQgdGV4dEZ1bGxFdmVudChDRldMX0V2ZW50OjpUeXBlOjpUZXh0RnVsbCwgdGhpcyk7Ci0gIERpc3BhdGNoRXZlbnQoJnRleHRGdWxsRXZlbnQpOworICBtX0N1cnNvclBvc2l0aW9uID0gcG9zaXRpb247CisgIFVwZGF0ZUN1cnNvclJlY3QoKTsKKyAgT25DYXJldENoYW5nZWQoKTsKIH0KIAogdm9pZCBDRldMX0VkaXQ6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgewpAQCAtMTIwOCwxMyArMTExMiwxMyBAQAogICAgICAgICAgIE9uTEJ1dHRvblVwKHBNc2cpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEZXTF9Nb3VzZUNvbW1hbmQ6OkxlZnRCdXR0b25EYmxDbGs6Ci0gICAgICAgICAgT25CdXR0b25EYmxDbGsocE1zZyk7CisgICAgICAgICAgT25CdXR0b25Eb3VibGVDbGljayhwTXNnKTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBGV0xfTW91c2VDb21tYW5kOjpNb3ZlOgogICAgICAgICAgIE9uTW91c2VNb3ZlKHBNc2cpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEZXTF9Nb3VzZUNvbW1hbmQ6OlJpZ2h0QnV0dG9uRG93bjoKLSAgICAgICAgICBEb0J1dHRvbkRvd24ocE1zZyk7CisgICAgICAgICAgRG9SQnV0dG9uRG93bihwTXNnKTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICBicmVhazsKQEAgLTEyMzYsOSArMTE0MCw3IEBACiB9CiAKIHZvaWQgQ0ZXTF9FZGl0OjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsKLSAgaWYgKCFwRXZlbnQpCi0gICAgcmV0dXJuOwotICBpZiAocEV2ZW50LT5HZXRUeXBlKCkgIT0gQ0ZXTF9FdmVudDo6VHlwZTo6U2Nyb2xsKQorICBpZiAoIXBFdmVudCB8fCBwRXZlbnQtPkdldFR5cGUoKSAhPSBDRldMX0V2ZW50OjpUeXBlOjpTY3JvbGwpCiAgICAgcmV0dXJuOwogCiAgIENGV0xfV2lkZ2V0KiBwU3JjVGFyZ2V0ID0gcEV2ZW50LT5tX3BTcmNUYXJnZXQ7CkBAIC0xMjUwLDI1ICsxMTUyLDE2IEBACiAgIH0KIH0KIAotdm9pZCBDRldMX0VkaXQ6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBEcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7Cit2b2lkIENGV0xfRWRpdDo6T25EcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7CisgIERyYXdXaWRnZXQocEdyYXBoaWNzLCBtYXRyaXgpOwogfQogCi12b2lkIENGV0xfRWRpdDo6RG9CdXR0b25Eb3duKENGV0xfTWVzc2FnZU1vdXNlKiBwTXNnKSB7Cit2b2lkIENGV0xfRWRpdDo6RG9SQnV0dG9uRG93bihDRldMX01lc3NhZ2VNb3VzZSogcE1zZykgewogICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgPT0gMCkKICAgICBTZXRGb2N1cyh0cnVlKTsKIAotICBJRkRFX1R4dEVkdFBhZ2UqIHBQYWdlID0gbV9FZHRFbmdpbmUuR2V0UGFnZSgwKTsKLSAgaWYgKCFwUGFnZSkKLSAgICByZXR1cm47Ci0KLSAgYm9vbCBiQmVmb3JlID0gdHJ1ZTsKLSAgaW50MzJfdCBuSW5kZXggPSBwUGFnZS0+R2V0Q2hhckluZGV4KERldmljZVRvRW5naW5lKHBNc2ctPm1fcG9zKSwgYkJlZm9yZSk7Ci0gIGlmIChuSW5kZXggPCAwKQotICAgIG5JbmRleCA9IDA7Ci0KLSAgbV9FZHRFbmdpbmUuU2V0Q2FyZXRQb3MobkluZGV4LCBiQmVmb3JlKTsKKyAgbV9DdXJzb3JQb3NpdGlvbiA9IG1fRWR0RW5naW5lLkdldEluZGV4Rm9yUG9pbnQoRGV2aWNlVG9FbmdpbmUocE1zZy0+bV9wb3MpKTsKIH0KIAogdm9pZCBDRldMX0VkaXQ6Ok9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSogcE1zZywgYm9vbCBiU2V0KSB7CkBAIC0xMjgzLDE1ICsxMTc2LDExIEBACiAgICAgbV9wUHJvcGVydGllcy0+bV9kd1N0YXRlcyAmPSB+RldMX1dHVFNUQVRFX0ZvY3VzZWQ7CiAgICAgSGlkZUNhcmV0KG51bGxwdHIpOwogCi0gICAgaW50MzJfdCBuU2VsID0gQ291bnRTZWxSYW5nZXMoKTsKLSAgICBpZiAoblNlbCA+IDApIHsKLSAgICAgIENsZWFyU2VsZWN0aW9ucygpOworICAgIGlmIChIYXNTZWxlY3Rpb24oKSkgeworICAgICAgQ2xlYXJTZWxlY3Rpb24oKTsKICAgICAgIGJSZXBhaW50ID0gdHJ1ZTsKICAgICB9Ci0gICAgbV9FZHRFbmdpbmUuU2V0Q2FyZXRQb3MoMCwgdHJ1ZSk7CiAgICAgVXBkYXRlT2Zmc2V0KCk7Ci0KLSAgICBDbGVhclJlY29yZCgpOwogICB9CiAKICAgTGF5b3V0U2Nyb2xsQmFyKCk7CkBAIC0xMzA5LDIyICsxMTk4LDMwIEBACiAKICAgbV9iTEJ1dHRvbkRvd24gPSB0cnVlOwogICBTZXRHcmFiKHRydWUpOwotICBEb0J1dHRvbkRvd24ocE1zZyk7Ci0gIGludDMyX3QgbkluZGV4ID0gbV9FZHRFbmdpbmUuR2V0Q2FyZXRQb3MoKTsKKworICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJiBGV0xfV0dUU1RBVEVfRm9jdXNlZCkgPT0gMCkKKyAgICBTZXRGb2N1cyh0cnVlKTsKKwogICBib29sIGJSZXBhaW50ID0gZmFsc2U7Ci0gIGlmIChtX0VkdEVuZ2luZS5Db3VudFNlbFJhbmdlcygpID4gMCkgeworICBpZiAobV9FZHRFbmdpbmUuSGFzU2VsZWN0aW9uKCkpIHsKICAgICBtX0VkdEVuZ2luZS5DbGVhclNlbGVjdGlvbigpOwogICAgIGJSZXBhaW50ID0gdHJ1ZTsKICAgfQogCi0gIGlmICgocE1zZy0+bV9kd0ZsYWdzICYgRldMX0tFWUZMQUdfU2hpZnQpICYmIG1fblNlbFN0YXJ0ICE9IG5JbmRleCkgewotICAgIGludDMyX3QgaVN0YXJ0ID0gc3RkOjptaW4obV9uU2VsU3RhcnQsIG5JbmRleCk7Ci0gICAgaW50MzJfdCBpRW5kID0gc3RkOjptYXgobV9uU2VsU3RhcnQsIG5JbmRleCk7Ci0gICAgbV9FZHRFbmdpbmUuQWRkU2VsUmFuZ2UoaVN0YXJ0LCBpRW5kIC0gaVN0YXJ0KTsKKyAgc2l6ZV90IGluZGV4X2F0X2NsaWNrID0KKyAgICAgIG1fRWR0RW5naW5lLkdldEluZGV4Rm9yUG9pbnQoRGV2aWNlVG9FbmdpbmUocE1zZy0+bV9wb3MpKTsKKworICBpZiAoaW5kZXhfYXRfY2xpY2sgIT0gbV9DdXJzb3JQb3NpdGlvbiAmJgorICAgICAgISEocE1zZy0+bV9kd0ZsYWdzICYgRldMX0tFWUZMQUdfU2hpZnQpKSB7CisgICAgc2l6ZV90IHN0YXJ0ID0gc3RkOjptaW4obV9DdXJzb3JQb3NpdGlvbiwgaW5kZXhfYXRfY2xpY2spOworICAgIHNpemVfdCBlbmQgPSBzdGQ6Om1heChtX0N1cnNvclBvc2l0aW9uLCBpbmRleF9hdF9jbGljayk7CisKKyAgICBtX0VkdEVuZ2luZS5TZXRTZWxlY3Rpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KTsKICAgICBiUmVwYWludCA9IHRydWU7CiAgIH0gZWxzZSB7Ci0gICAgbV9uU2VsU3RhcnQgPSBuSW5kZXg7CisgICAgbV9DdXJzb3JQb3NpdGlvbiA9IGluZGV4X2F0X2NsaWNrOwogICB9CisKICAgaWYgKGJSZXBhaW50KQogICAgIFJlcGFpbnRSZWN0KG1fcnRFbmdpbmUpOwogfQpAQCAtMTMzNCw5OCArMTIzMSwxMDIgQEAKICAgU2V0R3JhYihmYWxzZSk7CiB9CiAKLXZvaWQgQ0ZXTF9FZGl0OjpPbkJ1dHRvbkRibENsayhDRldMX01lc3NhZ2VNb3VzZSogcE1zZykgewotICBJRkRFX1R4dEVkdFBhZ2UqIHBQYWdlID0gbV9FZHRFbmdpbmUuR2V0UGFnZSgwKTsKLSAgaWYgKCFwUGFnZSkKLSAgICByZXR1cm47Cit2b2lkIENGV0xfRWRpdDo6T25CdXR0b25Eb3VibGVDbGljayhDRldMX01lc3NhZ2VNb3VzZSogcE1zZykgeworICBzaXplX3QgY2xpY2tfaWR4ID0gbV9FZHRFbmdpbmUuR2V0SW5kZXhGb3JQb2ludChEZXZpY2VUb0VuZ2luZShwTXNnLT5tX3BvcykpOworICBzaXplX3Qgc3RhcnRfaWR4OworICBzaXplX3QgY291bnQ7CisgIHN0ZDo6dGllKHN0YXJ0X2lkeCwgY291bnQpID0gbV9FZHRFbmdpbmUuQm91bmRzRm9yV29yZEF0KGNsaWNrX2lkeCk7CiAKLSAgaW50MzJfdCBuQ291bnQgPSAwOwotICBpbnQzMl90IG5JbmRleCA9IHBQYWdlLT5TZWxlY3RXb3JkKERldmljZVRvRW5naW5lKHBNc2ctPm1fcG9zKSwgbkNvdW50KTsKLSAgaWYgKG5JbmRleCA8IDApCi0gICAgcmV0dXJuOwotCi0gIG1fRWR0RW5naW5lLkFkZFNlbFJhbmdlKG5JbmRleCwgbkNvdW50KTsKLSAgbV9FZHRFbmdpbmUuU2V0Q2FyZXRQb3MobkluZGV4ICsgbkNvdW50IC0gMSwgZmFsc2UpOworICBtX0VkdEVuZ2luZS5TZXRTZWxlY3Rpb24oc3RhcnRfaWR4LCBjb3VudCk7CisgIG1fQ3Vyc29yUG9zaXRpb24gPSBzdGFydF9pZHggKyBjb3VudDsKICAgUmVwYWludFJlY3QobV9ydEVuZ2luZSk7CiB9CiAKIHZvaWQgQ0ZXTF9FZGl0OjpPbk1vdXNlTW92ZShDRldMX01lc3NhZ2VNb3VzZSogcE1zZykgewotICBpZiAobV9uU2VsU3RhcnQgPT0gLTEgfHwgIW1fYkxCdXR0b25Eb3duKQorICBib29sIHNoaWZ0ID0gISEocE1zZy0+bV9kd0ZsYWdzICYgRldMX0tFWUZMQUdfU2hpZnQpOworICBpZiAoIW1fYkxCdXR0b25Eb3duIHx8ICFzaGlmdCkKICAgICByZXR1cm47CiAKLSAgSUZERV9UeHRFZHRQYWdlKiBwUGFnZSA9IG1fRWR0RW5naW5lLkdldFBhZ2UoMCk7Ci0gIGlmICghcFBhZ2UpCisgIHNpemVfdCBvbGRfY3Vyc29yX3BvcyA9IG1fQ3Vyc29yUG9zaXRpb247CisgIFNldEN1cnNvclBvc2l0aW9uKG1fRWR0RW5naW5lLkdldEluZGV4Rm9yUG9pbnQoRGV2aWNlVG9FbmdpbmUocE1zZy0+bV9wb3MpKSk7CisgIGlmIChvbGRfY3Vyc29yX3BvcyA9PSBtX0N1cnNvclBvc2l0aW9uKQogICAgIHJldHVybjsKIAotICBib29sIGJCZWZvcmUgPSB0cnVlOwotICBpbnQzMl90IG5JbmRleCA9IHBQYWdlLT5HZXRDaGFySW5kZXgoRGV2aWNlVG9FbmdpbmUocE1zZy0+bV9wb3MpLCBiQmVmb3JlKTsKLSAgbV9FZHRFbmdpbmUuU2V0Q2FyZXRQb3MobkluZGV4LCBiQmVmb3JlKTsKLSAgbkluZGV4ID0gbV9FZHRFbmdpbmUuR2V0Q2FyZXRQb3MoKTsKLSAgbV9FZHRFbmdpbmUuQ2xlYXJTZWxlY3Rpb24oKTsKKyAgc2l6ZV90IGxlbmd0aCA9IG1fRWR0RW5naW5lLkdldExlbmd0aCgpOworICBpZiAobV9DdXJzb3JQb3NpdGlvbiA+IGxlbmd0aCkKKyAgICBTZXRDdXJzb3JQb3NpdGlvbihsZW5ndGgpOwogCi0gIGlmIChuSW5kZXggPT0gbV9uU2VsU3RhcnQpCi0gICAgcmV0dXJuOworICBzaXplX3Qgc2VsX3N0YXJ0ID0gMDsKKyAgc2l6ZV90IGNvdW50ID0gMDsKKyAgaWYgKG1fRWR0RW5naW5lLkhhc1NlbGVjdGlvbigpKQorICAgIHN0ZDo6dGllKHNlbF9zdGFydCwgY291bnQpID0gbV9FZHRFbmdpbmUuR2V0U2VsZWN0aW9uKCk7CisgIGVsc2UKKyAgICBzZWxfc3RhcnQgPSBvbGRfY3Vyc29yX3BvczsKIAotICBpbnQzMl90IG5MZW4gPSBtX0VkdEVuZ2luZS5HZXRUZXh0TGVuZ3RoKCk7Ci0gIGlmIChtX25TZWxTdGFydCA+PSBuTGVuKQotICAgIG1fblNlbFN0YXJ0ID0gbkxlbjsKLQotICBtX0VkdEVuZ2luZS5BZGRTZWxSYW5nZShzdGQ6Om1pbihtX25TZWxTdGFydCwgbkluZGV4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfYWJzKG5JbmRleCAtIG1fblNlbFN0YXJ0KSk7CisgIHNpemVfdCBzdGFydF9wb3MgPSBzdGQ6Om1pbihzZWxfc3RhcnQsIG1fQ3Vyc29yUG9zaXRpb24pOworICBzaXplX3QgZW5kX3BvcyA9IHN0ZDo6bWF4KHNlbF9zdGFydCwgbV9DdXJzb3JQb3NpdGlvbik7CisgIG1fRWR0RW5naW5lLlNldFNlbGVjdGlvbihzdGFydF9wb3MsIGVuZF9wb3MgLSBzdGFydF9wb3MpOwogfQogCiB2b2lkIENGV0xfRWRpdDo6T25LZXlEb3duKENGV0xfTWVzc2FnZUtleSogcE1zZykgewotICBGREVfVFhURURUTU9WRUNBUkVUIE1vdmVDYXJldCA9IE1DX01vdmVOb25lOwogICBib29sIGJTaGlmdCA9ICEhKHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX1NoaWZ0KTsKICAgYm9vbCBiQ3RybCA9ICEhKHBNc2ctPm1fZHdGbGFncyAmIEZXTF9LRVlGTEFHX0N0cmwpOwotICB1aW50MzJfdCBkd0tleUNvZGUgPSBwTXNnLT5tX2R3S2V5Q29kZTsKLSAgc3dpdGNoIChkd0tleUNvZGUpIHsKLSAgICBjYXNlIEZXTF9WS0VZX0xlZnQ6IHsKLSAgICAgIE1vdmVDYXJldCA9IE1DX0xlZnQ7CisKKyAgc2l6ZV90IHNlbF9zdGFydCA9IG1fQ3Vyc29yUG9zaXRpb247CisgIGlmIChtX0VkdEVuZ2luZS5IYXNTZWxlY3Rpb24oKSkgeworICAgIHNpemVfdCBzdGFydF9pZHg7CisgICAgc2l6ZV90IGNvdW50OworICAgIHN0ZDo6dGllKHN0YXJ0X2lkeCwgY291bnQpID0gbV9FZHRFbmdpbmUuR2V0U2VsZWN0aW9uKCk7CisgICAgc2VsX3N0YXJ0ID0gc3RhcnRfaWR4OworICB9CisKKyAgc3dpdGNoIChwTXNnLT5tX2R3S2V5Q29kZSkgeworICAgIGNhc2UgRldMX1ZLRVlfTGVmdDoKKyAgICAgIFNldEN1cnNvclBvc2l0aW9uKG1fRWR0RW5naW5lLkdldEluZGV4TGVmdChtX0N1cnNvclBvc2l0aW9uKSk7CiAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGV0xfVktFWV9SaWdodDogewotICAgICAgTW92ZUNhcmV0ID0gTUNfUmlnaHQ7CisgICAgY2FzZSBGV0xfVktFWV9SaWdodDoKKyAgICAgIFNldEN1cnNvclBvc2l0aW9uKG1fRWR0RW5naW5lLkdldEluZGV4UmlnaHQobV9DdXJzb3JQb3NpdGlvbikpOwogICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRldMX1ZLRVlfVXA6IHsKLSAgICAgIE1vdmVDYXJldCA9IE1DX1VwOworICAgIGNhc2UgRldMX1ZLRVlfVXA6CisgICAgICBTZXRDdXJzb3JQb3NpdGlvbihtX0VkdEVuZ2luZS5HZXRJbmRleFVwKG1fQ3Vyc29yUG9zaXRpb24pKTsKICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZXTF9WS0VZX0Rvd246IHsKLSAgICAgIE1vdmVDYXJldCA9IE1DX0Rvd247CisgICAgY2FzZSBGV0xfVktFWV9Eb3duOgorICAgICAgU2V0Q3Vyc29yUG9zaXRpb24obV9FZHRFbmdpbmUuR2V0SW5kZXhEb3duKG1fQ3Vyc29yUG9zaXRpb24pKTsKICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZXTF9WS0VZX0hvbWU6IHsKLSAgICAgIE1vdmVDYXJldCA9IGJDdHJsID8gTUNfSG9tZSA6IE1DX0xpbmVTdGFydDsKKyAgICBjYXNlIEZXTF9WS0VZX0hvbWU6CisgICAgICBTZXRDdXJzb3JQb3NpdGlvbigKKyAgICAgICAgICBiQ3RybCA/IDAgOiBtX0VkdEVuZ2luZS5HZXRJbmRleEF0U3RhcnRPZkxpbmUobV9DdXJzb3JQb3NpdGlvbikpOwogICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRldMX1ZLRVlfRW5kOiB7Ci0gICAgICBNb3ZlQ2FyZXQgPSBiQ3RybCA/IE1DX0VuZCA6IE1DX0xpbmVFbmQ7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGV0xfVktFWV9JbnNlcnQ6CisgICAgY2FzZSBGV0xfVktFWV9FbmQ6CisgICAgICBTZXRDdXJzb3JQb3NpdGlvbigKKyAgICAgICAgICBiQ3RybCA/IG1fRWR0RW5naW5lLkdldExlbmd0aCgpCisgICAgICAgICAgICAgICAgOiBtX0VkdEVuZ2luZS5HZXRJbmRleEF0RW5kT2ZMaW5lKG1fQ3Vyc29yUG9zaXRpb24pKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgRldMX1ZLRVlfRGVsZXRlOiB7CiAgICAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5KSB8fAogICAgICAgICAgIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgRldMX1dHVFNUQVRFX0Rpc2FibGVkKSkgewogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIGludDMyX3QgbkNhcmV0ID0gbV9FZHRFbmdpbmUuR2V0Q2FyZXRQb3MoKTsKLSNpZiAoX0ZYX09TXyA9PSBfRlhfTUFDT1NYXykKLSAgICAgIG1fRWR0RW5naW5lLkRlbGV0ZShuQ2FyZXQsIHRydWUpOwotI2Vsc2UKLSAgICAgIG1fRWR0RW5naW5lLkRlbGV0ZShuQ2FyZXQpOwotI2VuZGlmCisKKyAgICAgIGlmIChtX0N1cnNvclBvc2l0aW9uID4gMCkgeworICAgICAgICBTZXRDdXJzb3JQb3NpdGlvbihtX0VkdEVuZ2luZS5HZXRJbmRleEJlZm9yZShtX0N1cnNvclBvc2l0aW9uKSk7CisgICAgICAgIG1fRWR0RW5naW5lLkRlbGV0ZShtX0N1cnNvclBvc2l0aW9uLCAxKTsKKyAgICAgIH0KICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBjYXNlIEZXTF9WS0VZX0luc2VydDoKICAgICBjYXNlIEZXTF9WS0VZX0YyOgogICAgIGNhc2UgRldMX1ZLRVlfVGFiOgogICAgIGRlZmF1bHQ6CiAgICAgICBicmVhazsKICAgfQotICBpZiAoTW92ZUNhcmV0ICE9IE1DX01vdmVOb25lKQotICAgIG1fRWR0RW5naW5lLk1vdmVDYXJldFBvcyhNb3ZlQ2FyZXQsIGJTaGlmdCwgYkN0cmwpOworCisgIC8vIFVwZGF0ZSB0aGUgc2VsZWN0aW9uLgorICBpZiAoYlNoaWZ0ICYmIHNlbF9zdGFydCAhPSBtX0N1cnNvclBvc2l0aW9uKSB7CisgICAgbV9FZHRFbmdpbmUuU2V0U2VsZWN0aW9uKHN0ZDo6bWluKHNlbF9zdGFydCwgbV9DdXJzb3JQb3NpdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWF4KHNlbF9zdGFydCwgbV9DdXJzb3JQb3NpdGlvbikpOworICAgIFJlcGFpbnRSZWN0KG1fcnRFbmdpbmUpOworICB9CiB9CiAKIHZvaWQgQ0ZXTF9FZGl0OjpPbkNoYXIoQ0ZXTF9NZXNzYWdlS2V5KiBwTXNnKSB7CkBAIC0xNDM0LDI2ICsxMzM1LDI3IEBACiAgICAgcmV0dXJuOwogICB9CiAKLSAgaW50MzJfdCBpRXJyb3IgPSAwOwotICBGWF9XQ0hBUiBjID0gc3RhdGljX2Nhc3Q8RlhfV0NIQVI+KHBNc2ctPm1fZHdLZXlDb2RlKTsKLSAgaW50MzJfdCBuQ2FyZXQgPSBtX0VkdEVuZ2luZS5HZXRDYXJldFBvcygpOworICB3Y2hhcl90IGMgPSBzdGF0aWNfY2FzdDx3Y2hhcl90PihwTXNnLT5tX2R3S2V5Q29kZSk7CiAgIHN3aXRjaCAoYykgewogICAgIGNhc2UgRldMX1ZLRVlfQmFjazoKLSAgICAgIG1fRWR0RW5naW5lLkRlbGV0ZShuQ2FyZXQsIHRydWUpOworICAgICAgaWYgKG1fQ3Vyc29yUG9zaXRpb24gPiAwKSB7CisgICAgICAgIFNldEN1cnNvclBvc2l0aW9uKG1fRWR0RW5naW5lLkdldEluZGV4QmVmb3JlKG1fQ3Vyc29yUG9zaXRpb24pKTsKKyAgICAgICAgbV9FZHRFbmdpbmUuRGVsZXRlKG1fQ3Vyc29yUG9zaXRpb24sIDEpOworICAgICAgfQogICAgICAgYnJlYWs7CiAgICAgY2FzZSBGV0xfVktFWV9OZXdMaW5lOgogICAgIGNhc2UgRldMX1ZLRVlfRXNjYXBlOgogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGV0xfVktFWV9UYWI6IHsKLSAgICAgIGlFcnJvciA9IG1fRWR0RW5naW5lLkluc2VydChuQ2FyZXQsIEwiXHQiLCAxKTsKKyAgICBjYXNlIEZXTF9WS0VZX1RhYjoKKyAgICAgIG1fRWR0RW5naW5lLkluc2VydChtX0N1cnNvclBvc2l0aW9uLCBMIlx0Iik7CisgICAgICBTZXRDdXJzb3JQb3NpdGlvbihtX0N1cnNvclBvc2l0aW9uICsgMSk7CiAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGV0xfVktFWV9SZXR1cm46IHsKKyAgICBjYXNlIEZXTF9WS0VZX1JldHVybjoKICAgICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9XYW50UmV0dXJuKSB7Ci0gICAgICAgIGlFcnJvciA9IG1fRWR0RW5naW5lLkluc2VydChuQ2FyZXQsIEwiXG4iLCAxKTsKKyAgICAgICAgbV9FZHRFbmdpbmUuSW5zZXJ0KG1fQ3Vyc29yUG9zaXRpb24sIEwiXG4iKTsKKyAgICAgICAgU2V0Q3Vyc29yUG9zaXRpb24obV9DdXJzb3JQb3NpdGlvbiArIDEpOwogICAgICAgfQogICAgICAgYnJlYWs7Ci0gICAgfQogICAgIGRlZmF1bHQ6IHsKICAgICAgIGlmICghbV9wV2lkZ2V0TWdyLT5Jc0Zvcm1EaXNhYmxlZCgpKSB7CiAgICAgICAgIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0VEVF9OdW1iZXIpIHsKQEAgLTE0NjYsMjkgKzEzNjgsMjMgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICB9Ci0jaWYgKF9GWF9PU18gPT0gX0ZYX01BQ09TWF8pCi0gICAgICBpZiAocE1zZy0+bV9kd0ZsYWdzICYgRldMX0tFWUZMQUdfQ29tbWFuZCkKLSNlbHNlCi0gICAgICBpZiAocE1zZy0+bV9kd0ZsYWdzICYgRldMX0tFWUZMQUdfQ3RybCkKLSNlbmRpZgotICAgICAgeworICAgICAgaWYgKHBNc2ctPm1fZHdGbGFncyAmIGtFZGl0aW5nTW9kaWZpZXIpCiAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaUVycm9yID0gbV9FZHRFbmdpbmUuSW5zZXJ0KG5DYXJldCwgJmMsIDEpOworCisgICAgICBtX0VkdEVuZ2luZS5JbnNlcnQobV9DdXJzb3JQb3NpdGlvbiwgV2lkZVN0cmluZyhjKSk7CisgICAgICBTZXRDdXJzb3JQb3NpdGlvbihtX0N1cnNvclBvc2l0aW9uICsgMSk7CiAgICAgICBicmVhazsKICAgICB9CiAgIH0KLSAgaWYgKGlFcnJvciA8IDApCi0gICAgUHJvY2Vzc0luc2VydEVycm9yKGlFcnJvcik7CiB9CiAKIGJvb2wgQ0ZXTF9FZGl0OjpPblNjcm9sbChDRldMX1Njcm9sbEJhciogcFNjcm9sbEJhciwKICAgICAgICAgICAgICAgICAgICAgICAgICBDRldMX0V2ZW50U2Nyb2xsOjpDb2RlIGR3Q29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUG9zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZlBvcykgewogICBDRlhfU2l6ZUYgZnM7CiAgIHBTY3JvbGxCYXItPkdldFJhbmdlKCZmcy53aWR0aCwgJmZzLmhlaWdodCk7Ci0gIEZYX0ZMT0FUIGlDdXJQb3MgPSBwU2Nyb2xsQmFyLT5HZXRQb3MoKTsKLSAgRlhfRkxPQVQgZlN0ZXAgPSBwU2Nyb2xsQmFyLT5HZXRTdGVwU2l6ZSgpOworICBmbG9hdCBpQ3VyUG9zID0gcFNjcm9sbEJhci0+R2V0UG9zKCk7CisgIGZsb2F0IGZTdGVwID0gcFNjcm9sbEJhci0+R2V0U3RlcFNpemUoKTsKICAgc3dpdGNoIChkd0NvZGUpIHsKICAgICBjYXNlIENGV0xfRXZlbnRTY3JvbGw6OkNvZGU6Ok1pbjogewogICAgICAgZlBvcyA9IGZzLndpZHRoOwpkaWZmIC0tZ2l0IGEveGZhL2Z3bC9jZndsX2VkaXQuaCBiL3hmYS9md2wvY2Z3bF9lZGl0LmgKaW5kZXggMTU0ZTI4Ni4uOWM2NjdmNSAxMDA2NDQKLS0tIGEveGZhL2Z3bC9jZndsX2VkaXQuaAorKysgYi94ZmEvZndsL2Nmd2xfZWRpdC5oCkBAIC03LDE2ICs3LDE1IEBACiAjaWZuZGVmIFhGQV9GV0xfQ0ZXTF9FRElUX0hfCiAjZGVmaW5lIFhGQV9GV0xfQ0ZXTF9FRElUX0hfCiAKLSNpbmNsdWRlIDxkZXF1ZT4KICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNpbmNsdWRlICJ4ZmEvZmRlL2NmZGVfdHh0ZWR0ZW5naW5lLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9pZmRlX3R4dGVkdGRvcmVjb3JkLmgiCisjaW5jbHVkZSAieGZhL2ZkZS9jZmRlX3RleHRlZGl0ZW5naW5lLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2V2ZW50LmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3Njcm9sbGJhci5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF93aWRnZXQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfcGF0aC5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2VwYXRoLmgiCiAKICNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seSAoMUwgPDwgMCkKICNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9NdWx0aUxpbmUgKDFMIDw8IDEpCkBAIC0zOSwxNSArMzgsMTMgQEAKICNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9IQWxpZ25Nb2RlTWFzayAoM0wgPDwgMjIpCiAjZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfU2hvd1Njcm9sbGJhckZvY3VzICgxTCA8PCAyNSkKICNkZWZpbmUgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhciAoMUwgPDwgMjYpCi0jZGVmaW5lIEZXTF9TVFlMRUVYVF9FRFRfTGFzdExpbmVIZWlnaHQgKDFMIDw8IDI3KQogCi1jbGFzcyBJRkRFX1R4dEVkdERvUmVjb3JkOwogY2xhc3MgQ0ZXTF9FZGl0OwogY2xhc3MgQ0ZXTF9NZXNzYWdlTW91c2U7CiBjbGFzcyBDRldMX1dpZGdldFByb3BlcnRpZXM7CiBjbGFzcyBDRldMX0NhcmV0OwogCi1jbGFzcyBDRldMX0VkaXQgOiBwdWJsaWMgQ0ZXTF9XaWRnZXQgeworY2xhc3MgQ0ZXTF9FZGl0IDogcHVibGljIENGV0xfV2lkZ2V0LCBwdWJsaWMgQ0ZERV9UZXh0RWRpdEVuZ2luZTo6RGVsZWdhdGUgewogIHB1YmxpYzoKICAgQ0ZXTF9FZGl0KGNvbnN0IENGV0xfQXBwKiBhcHAsCiAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZXTF9XaWRnZXRQcm9wZXJ0aWVzPiBwcm9wZXJ0aWVzLApAQCAtNjEsMzEgKzU4LDMxIEBACiAgIHZvaWQgVXBkYXRlKCkgb3ZlcnJpZGU7CiAgIEZXTF9XaWRnZXRIaXQgSGl0VGVzdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7CiAgIHZvaWQgU2V0U3RhdGVzKHVpbnQzMl90IGR3U3RhdGVzKSBvdmVycmlkZTsKLSAgdm9pZCBEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSBvdmVycmlkZTsKKyAgdm9pZCBEcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSBvdmVycmlkZTsKICAgdm9pZCBTZXRUaGVtZVByb3ZpZGVyKElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lUHJvdmlkZXIpIG92ZXJyaWRlOwogICB2b2lkIE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgb3ZlcnJpZGU7CiAgIHZvaWQgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSBvdmVycmlkZTsKLSAgdm9pZCBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIG92ZXJyaWRlOworICB2b2lkIE9uRHJhd1dpZGdldChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgb3ZlcnJpZGU7CiAKLSAgdmlydHVhbCB2b2lkIFNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7CisgIHZpcnR1YWwgdm9pZCBTZXRUZXh0KGNvbnN0IFdpZGVTdHJpbmcmIHdzVGV4dCk7CiAKICAgaW50MzJfdCBHZXRUZXh0TGVuZ3RoKCkgY29uc3Q7Ci0gIENGWF9XaWRlU3RyaW5nIEdldFRleHQoKSBjb25zdDsKKyAgV2lkZVN0cmluZyBHZXRUZXh0KCkgY29uc3Q7CiAgIHZvaWQgQ2xlYXJUZXh0KCk7CiAKLSAgdm9pZCBBZGRTZWxSYW5nZShpbnQzMl90IG5TdGFydCk7Ci0gIGludDMyX3QgQ291bnRTZWxSYW5nZXMoKSBjb25zdDsKLSAgaW50MzJfdCBHZXRTZWxSYW5nZShpbnQzMl90IG5JbmRleCwgaW50MzJfdCogblN0YXJ0KSBjb25zdDsKLSAgdm9pZCBDbGVhclNlbGVjdGlvbnMoKTsKKyAgdm9pZCBTZWxlY3RBbGwoKTsKKyAgdm9pZCBDbGVhclNlbGVjdGlvbigpOworICBib29sIEhhc1NlbGVjdGlvbigpIGNvbnN0OworICAvLyBSZXR1cm5zIDxzdGFydCwgY291bnQ+IG9mIHRoZSBzZWxlY3Rpb24uCisgIHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4gR2V0U2VsZWN0aW9uKCkgY29uc3Q7CisKICAgaW50MzJfdCBHZXRMaW1pdCgpIGNvbnN0OwogICB2b2lkIFNldExpbWl0KGludDMyX3QgbkxpbWl0KTsKLSAgdm9pZCBTZXRBbGlhc0NoYXIoRlhfV0NIQVIgd0FsaWFzKTsKLSAgYm9vbCBDb3B5KENGWF9XaWRlU3RyaW5nJiB3c0NvcHkpOwotICBib29sIEN1dChDRlhfV2lkZVN0cmluZyYgd3NDdXQpOwotICBib29sIFBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Bhc3RlKTsKLSAgYm9vbCBSZWRvKGNvbnN0IElGREVfVHh0RWR0RG9SZWNvcmQqIHBSZWNvcmQpOwotICBib29sIFVuZG8oY29uc3QgSUZERV9UeHRFZHREb1JlY29yZCogcFJlY29yZCk7CisgIHZvaWQgU2V0QWxpYXNDaGFyKHdjaGFyX3Qgd0FsaWFzKTsKKyAgT3B0aW9uYWw8V2lkZVN0cmluZz4gQ29weSgpOworICBPcHRpb25hbDxXaWRlU3RyaW5nPiBDdXQoKTsKKyAgYm9vbCBQYXN0ZShjb25zdCBXaWRlU3RyaW5nJiB3c1Bhc3RlKTsKICAgYm9vbCBVbmRvKCk7CiAgIGJvb2wgUmVkbygpOwogICBib29sIENhblVuZG8oKTsKQEAgLTkzLDM1ICs5MCwzNyBAQAogCiAgIHZvaWQgU2V0T3V0ZXIoQ0ZXTF9XaWRnZXQqIHBPdXRlcik7CiAKLSAgdm9pZCBPbkNhcmV0Q2hhbmdlZCgpOwotICB2b2lkIE9uVGV4dENoYW5nZWQoY29uc3QgRkRFX1RYVEVEVF9URVhUQ0hBTkdFX0lORk8mIENoYW5nZUluZm8pOwotICB2b2lkIE9uU2VsQ2hhbmdlZCgpOwotICBib29sIE9uUGFnZUxvYWQoaW50MzJfdCBuUGFnZUluZGV4KTsKLSAgYm9vbCBPblBhZ2VVbmxvYWQoaW50MzJfdCBuUGFnZUluZGV4KTsKLSAgdm9pZCBPbkFkZERvUmVjb3JkKHN0ZDo6dW5pcXVlX3B0cjxJRkRFX1R4dEVkdERvUmVjb3JkPiBwUmVjb3JkKTsKLSAgYm9vbCBPblZhbGlkYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOwotICB2b2lkIFNldFNjcm9sbE9mZnNldChGWF9GTE9BVCBmU2Nyb2xsT2Zmc2V0KTsKKyAgLy8gQ0ZERV9UZXh0RWRpdEVuZ2luZTo6RGVsZWdhdGUKKyAgdm9pZCBOb3RpZnlUZXh0RnVsbCgpIG92ZXJyaWRlOworICB2b2lkIE9uQ2FyZXRDaGFuZ2VkKCkgb3ZlcnJpZGU7CisgIHZvaWQgT25UZXh0Q2hhbmdlZChjb25zdCBXaWRlU3RyaW5nJiBwcmV2VGV4dCkgb3ZlcnJpZGU7CisgIHZvaWQgT25TZWxDaGFuZ2VkKCkgb3ZlcnJpZGU7CisgIGJvb2wgT25WYWxpZGF0ZShjb25zdCBXaWRlU3RyaW5nJiB3c1RleHQpIG92ZXJyaWRlOworICB2b2lkIFNldFNjcm9sbE9mZnNldChmbG9hdCBmU2Nyb2xsT2Zmc2V0KSBvdmVycmlkZTsKIAogIHByb3RlY3RlZDoKICAgdm9pZCBTaG93Q2FyZXQoQ0ZYX1JlY3RGKiBwUmVjdCk7CiAgIHZvaWQgSGlkZUNhcmV0KENGWF9SZWN0RiogcFJlY3QpOwogICBjb25zdCBDRlhfUmVjdEYmIEdldFJUQ2xpZW50KCkgY29uc3QgeyByZXR1cm4gbV9ydENsaWVudDsgfQotICBDRkRFX1R4dEVkdEVuZ2luZSogR2V0VHh0RWR0RW5naW5lKCkgeyByZXR1cm4gJm1fRWR0RW5naW5lOyB9CisgIENGREVfVGV4dEVkaXRFbmdpbmUqIEdldFR4dEVkdEVuZ2luZSgpIHsgcmV0dXJuICZtX0VkdEVuZ2luZTsgfQogCiAgcHJpdmF0ZToKLSAgdm9pZCBEcmF3VGV4dEJrKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAorICB2b2lkIFJlbmRlclRleHQoQ0ZYX1JlbmRlckRldmljZSogcFJlbmRlckRldiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgY2xpcFJlY3QsCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtdCk7CisgIHZvaWQgRHJhd1RleHRCayhDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOwotICB2b2lkIERyYXdDb250ZW50KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAorICB2b2lkIERyYXdDb250ZW50KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKLSAgdm9pZCBEcmF3U3BlbGxDaGVjayhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7CisgIHZvaWQgRHJhd1NwZWxsQ2hlY2soQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKIAogICB2b2lkIFVwZGF0ZUVkaXRFbmdpbmUoKTsKICAgdm9pZCBVcGRhdGVFZGl0UGFyYW1zKCk7CiAgIHZvaWQgVXBkYXRlRWRpdExheW91dCgpOwogICBib29sIFVwZGF0ZU9mZnNldCgpOwotICBib29sIFVwZGF0ZU9mZnNldChDRldMX1Njcm9sbEJhciogcFNjcm9sbEJhciwgRlhfRkxPQVQgZlBvc0NoYW5nZWQpOworICBib29sIFVwZGF0ZU9mZnNldChDRldMX1Njcm9sbEJhciogcFNjcm9sbEJhciwgZmxvYXQgZlBvc0NoYW5nZWQpOwogICB2b2lkIFVwZGF0ZVZBbGlnbm1lbnQoKTsKICAgdm9pZCBVcGRhdGVDYXJldCgpOwogICBDRldMX1Njcm9sbEJhciogVXBkYXRlU2Nyb2xsKCk7CkBAIC0xMzIsNTEgKzEzMSw0OCBAQAogICB2b2lkIEluaXRIb3Jpem9udGFsU2Nyb2xsQmFyKCk7CiAgIHZvaWQgSW5pdEVuZ2luZSgpOwogICB2b2lkIEluaXRDYXJldCgpOwotICBib29sIFZhbGlkYXRlTnVtYmVyQ2hhcihGWF9XQ0hBUiBjTnVtKTsKLSAgdm9pZCBDbGVhclJlY29yZCgpOworICBib29sIFZhbGlkYXRlTnVtYmVyQ2hhcih3Y2hhcl90IGNOdW0pOwogICBib29sIElzU2hvd1Njcm9sbEJhcihib29sIGJWZXJ0KTsKICAgYm9vbCBJc0NvbnRlbnRIZWlnaHRPdmVyZmxvdygpOwotICBpbnQzMl90IEFkZERvUmVjb3JkKHN0ZDo6dW5pcXVlX3B0cjxJRkRFX1R4dEVkdERvUmVjb3JkPiBwUmVjb3JkKTsKLSAgdm9pZCBQcm9jZXNzSW5zZXJ0RXJyb3IoaW50MzJfdCBpRXJyb3IpOwotICB2b2lkIEFkZFNwZWxsQ2hlY2tPYmooQ0ZYX1BhdGgmIFBhdGhEYXRhLAorICB2b2lkIEFkZFNwZWxsQ2hlY2tPYmooQ1hGQV9HRVBhdGgmIFBhdGhEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5Db3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZPZmZTZXRYLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk9mZlNldFkpOworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZk9mZlNldFgsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmT2ZmU2V0WSk7CisgIHZvaWQgU2V0Q3Vyc29yUG9zaXRpb24oc2l6ZV90IHBvc2l0aW9uKTsKKyAgdm9pZCBVcGRhdGVDdXJzb3JSZWN0KCk7CiAKLSAgdm9pZCBEb0J1dHRvbkRvd24oQ0ZXTF9NZXNzYWdlTW91c2UqIHBNc2cpOworICB2b2lkIERvUkJ1dHRvbkRvd24oQ0ZXTF9NZXNzYWdlTW91c2UqIHBNc2cpOwogICB2b2lkIE9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSogcE1zZywgYm9vbCBiU2V0KTsKICAgdm9pZCBPbkxCdXR0b25Eb3duKENGV0xfTWVzc2FnZU1vdXNlKiBwTXNnKTsKICAgdm9pZCBPbkxCdXR0b25VcChDRldMX01lc3NhZ2VNb3VzZSogcE1zZyk7Ci0gIHZvaWQgT25CdXR0b25EYmxDbGsoQ0ZXTF9NZXNzYWdlTW91c2UqIHBNc2cpOworICB2b2lkIE9uQnV0dG9uRG91YmxlQ2xpY2soQ0ZXTF9NZXNzYWdlTW91c2UqIHBNc2cpOwogICB2b2lkIE9uTW91c2VNb3ZlKENGV0xfTWVzc2FnZU1vdXNlKiBwTXNnKTsKICAgdm9pZCBPbktleURvd24oQ0ZXTF9NZXNzYWdlS2V5KiBwTXNnKTsKICAgdm9pZCBPbkNoYXIoQ0ZXTF9NZXNzYWdlS2V5KiBwTXNnKTsKICAgYm9vbCBPblNjcm9sbChDRldMX1Njcm9sbEJhciogcFNjcm9sbEJhciwKICAgICAgICAgICAgICAgICBDRldMX0V2ZW50U2Nyb2xsOjpDb2RlIGR3Q29kZSwKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUG9zKTsKKyAgICAgICAgICAgICAgICBmbG9hdCBmUG9zKTsKIAogICBDRlhfUmVjdEYgbV9ydENsaWVudDsKICAgQ0ZYX1JlY3RGIG1fcnRFbmdpbmU7CiAgIENGWF9SZWN0RiBtX3J0U3RhdGljOwotICBGWF9GTE9BVCBtX2ZWQWxpZ25PZmZzZXQ7Ci0gIEZYX0ZMT0FUIG1fZlNjcm9sbE9mZnNldFg7Ci0gIEZYX0ZMT0FUIG1fZlNjcm9sbE9mZnNldFk7Ci0gIENGREVfVHh0RWR0RW5naW5lIG1fRWR0RW5naW5lOworICBDRlhfUmVjdEYgbV9ydENhcmV0OworICBmbG9hdCBtX2ZWQWxpZ25PZmZzZXQ7CisgIGZsb2F0IG1fZlNjcm9sbE9mZnNldFg7CisgIGZsb2F0IG1fZlNjcm9sbE9mZnNldFk7CisgIENGREVfVGV4dEVkaXRFbmdpbmUgbV9FZHRFbmdpbmU7CiAgIGJvb2wgbV9iTEJ1dHRvbkRvd247Ci0gIGludDMyX3QgbV9uU2VsU3RhcnQ7CisgIHNpemVfdCBtX0N1cnNvclBvc2l0aW9uOwogICBpbnQzMl90IG1fbkxpbWl0OwotICBGWF9GTE9BVCBtX2ZGb250U2l6ZTsKKyAgZmxvYXQgbV9mRm9udFNpemU7CiAgIGJvb2wgbV9iU2V0UmFuZ2U7CiAgIGludDMyX3QgbV9pTWF4OwogICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZXTF9TY3JvbGxCYXI+IG1fcFZlcnRTY3JvbGxCYXI7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDRldMX1Njcm9sbEJhcj4gbV9wSG9yelNjcm9sbEJhcjsKICAgc3RkOjp1bmlxdWVfcHRyPENGV0xfQ2FyZXQ+IG1fcENhcmV0OwotICBDRlhfV2lkZVN0cmluZyBtX3dzQ2FjaGU7Ci0gIENGWF9XaWRlU3RyaW5nIG1fd3NGb250OwotICBzdGQ6OmRlcXVlPHN0ZDo6dW5pcXVlX3B0cjxJRkRFX1R4dEVkdERvUmVjb3JkPj4gbV9Eb1JlY29yZHM7Ci0gIGludDMyX3QgbV9pQ3VyUmVjb3JkOwotICBpbnQzMl90IG1faU1heFJlY29yZDsKKyAgV2lkZVN0cmluZyBtX3dzQ2FjaGU7CisgIFdpZGVTdHJpbmcgbV93c0ZvbnQ7CiB9OwogCiAjZW5kaWYgIC8vIFhGQV9GV0xfQ0ZXTF9FRElUX0hfCmRpZmYgLS1naXQgYS94ZmEvZndsL2Nmd2xfZWRpdF9lbWJlZGRlcnRlc3QuY3BwIGIveGZhL2Z3bC9jZndsX2VkaXRfZW1iZWRkZXJ0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWE0Y2E1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z3bC9jZndsX2VkaXRfZW1iZWRkZXJ0ZXN0LmNwcApAQCAtMCwwICsxLDc5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3dpZGVzdHJpbmcuaCIKKyNpbmNsdWRlICJwdWJsaWMvZnBkZl9mb3JtZmlsbC5oIgorI2luY2x1ZGUgInB1YmxpYy9mcGRmX2Z3bGV2ZW50LmgiCisjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0X3RpbWVyX2hhbmRsaW5nX2RlbGVnYXRlLmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK2NsYXNzIENGV0xFZGl0RW1iZWRkZXJ0ZXN0IDogcHVibGljIEVtYmVkZGVyVGVzdCB7CisgcHJvdGVjdGVkOgorICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIEVtYmVkZGVyVGVzdDo6U2V0VXAoKTsKKyAgICBTZXREZWxlZ2F0ZSgmZGVsZWdhdGVfKTsKKyAgICBDcmVhdGVBbmRJbml0aWFsaXplRm9ybVBERigpOworICB9CisKKyAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICBVbmxvYWRQYWdlKHBhZ2UoKSk7CisgICAgRW1iZWRkZXJUZXN0OjpUZWFyRG93bigpOworICB9CisKKyAgdm9pZCBDcmVhdGVBbmRJbml0aWFsaXplRm9ybVBERigpIHsKKyAgICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoInhmYS9lbWFpbF9yZWNvbW1lbmRlZC5wZGYiKSk7CisgICAgcGFnZV8gPSBMb2FkUGFnZSgwKTsKKyAgICBBU1NFUlRfVFJVRShwYWdlXyk7CisgIH0KKworICBGUERGX1BBR0UgcGFnZSgpIGNvbnN0IHsgcmV0dXJuIHBhZ2VfOyB9CisgIEVtYmVkZGVyVGVzdFRpbWVySGFuZGxpbmdEZWxlZ2F0ZSBkZWxlZ2F0ZSgpIGNvbnN0IHsgcmV0dXJuIGRlbGVnYXRlXzsgfQorCisgcHJpdmF0ZToKKyAgRlBERl9QQUdFIHBhZ2VfOworICBFbWJlZGRlclRlc3RUaW1lckhhbmRsaW5nRGVsZWdhdGUgZGVsZWdhdGVfOworfTsKKworVEVTVF9GKENGV0xFZGl0RW1iZWRkZXJ0ZXN0LCBUcml2aWFsKSB7CisgIEFTU0VSVF9FUSgxdSwgZGVsZWdhdGUoKS5HZXRBbGVydHMoKS5zaXplKCkpOworICBhdXRvIGFsZXJ0ID0gZGVsZWdhdGUoKS5HZXRBbGVydHMoKVswXTsKKyAgRVhQRUNUX1NUUkVRKEwiUERGaXVtIiwgYWxlcnQudGl0bGUuY19zdHIoKSk7CisgIEVYUEVDVF9TVFJFUShMIlRoZSB2YWx1ZSB5b3UgZW50ZXJlZCBmb3IgVGV4dCBGaWVsZCBpcyBpbnZhbGlkLiIsCisgICAgICAgICAgICAgICBhbGVydC5tZXNzYWdlLmNfc3RyKCkpOworfQorCitURVNUX0YoQ0ZXTEVkaXRFbWJlZGRlcnRlc3QsIExlZnRDbGlja01vdXNlU2VsZWN0aW9uKSB7CisgIEZPUk1fT25MQnV0dG9uRG93bihmb3JtX2hhbmRsZSgpLCBwYWdlKCksIDAsIDExNSwgNTgpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDEwOyArK2kpCisgICAgRk9STV9PbkNoYXIoZm9ybV9oYW5kbGUoKSwgcGFnZSgpLCAnYScgKyBpLCAwKTsKKworICAvLyBNb3VzZSBzZWxlY3Rpb24KKyAgRk9STV9PbkxCdXR0b25Eb3duKGZvcm1faGFuZGxlKCksIHBhZ2UoKSwgMCwgMTI4LCA1OCk7CisgIEZPUk1fT25MQnV0dG9uRG93bihmb3JtX2hhbmRsZSgpLCBwYWdlKCksIEZXTF9FVkVOVEZMQUdfU2hpZnRLZXksIDE1MiwgNTgpOworCisgIC8vIDEyID09ICgyICogc3RybGVuKGRlZmdoKSkgKyAyIChmb3IgXDBcMCkKKyAgRVhQRUNUX0VRKDEyVUwsIEZPUk1fR2V0U2VsZWN0ZWRUZXh0KGZvcm1faGFuZGxlKCksIHBhZ2UoKSwgbnVsbHB0ciwgMCkpOworCisgIHVuc2lnbmVkIHNob3J0IGJ1ZlsxMjhdOworICB1bnNpZ25lZCBsb25nIGxlbiA9IEZPUk1fR2V0U2VsZWN0ZWRUZXh0KGZvcm1faGFuZGxlKCksIHBhZ2UoKSwgJmJ1ZiwgMTI4KTsKKyAgRVhQRUNUX1NUUkVRKEwiZGVmZ2giLCBXaWRlU3RyaW5nOjpGcm9tVVRGMTZMRShidWYsIGxlbikuY19zdHIoKSk7Cit9CisKK1RFU1RfRihDRldMRWRpdEVtYmVkZGVydGVzdCwgRHJhZ01vdXNlU2VsZWN0aW9uKSB7CisgIEZPUk1fT25MQnV0dG9uRG93bihmb3JtX2hhbmRsZSgpLCBwYWdlKCksIDAsIDExNSwgNTgpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDEwOyArK2kpCisgICAgRk9STV9PbkNoYXIoZm9ybV9oYW5kbGUoKSwgcGFnZSgpLCAnYScgKyBpLCAwKTsKKworICAvLyBNb3VzZSBzZWxlY3Rpb24KKyAgRk9STV9PbkxCdXR0b25Eb3duKGZvcm1faGFuZGxlKCksIHBhZ2UoKSwgMCwgMTI4LCA1OCk7CisgIEZPUk1fT25Nb3VzZU1vdmUoZm9ybV9oYW5kbGUoKSwgcGFnZSgpLCBGV0xfRVZFTlRGTEFHX1NoaWZ0S2V5LCAxNTIsIDU4KTsKKworICAvLyAxMiA9PSAoMiAqIHN0cmxlbihkZWZnaCkpICsgMiAoZm9yIFwwXDApCisgIEVYUEVDVF9FUSgxMlVMLCBGT1JNX0dldFNlbGVjdGVkVGV4dChmb3JtX2hhbmRsZSgpLCBwYWdlKCksIG51bGxwdHIsIDApKTsKKworICB1bnNpZ25lZCBzaG9ydCBidWZbMTI4XTsKKyAgdW5zaWduZWQgbG9uZyBsZW4gPSBGT1JNX0dldFNlbGVjdGVkVGV4dChmb3JtX2hhbmRsZSgpLCBwYWdlKCksICZidWYsIDEyOCk7CisgIEVYUEVDVF9TVFJFUShMImRlZmdoIiwgV2lkZVN0cmluZzo6RnJvbVVURjE2TEUoYnVmLCBsZW4pLmNfc3RyKCkpOworfQpkaWZmIC0tZ2l0IGEveGZhL2Z3bC9jZndsX2V2ZW50LmggYi94ZmEvZndsL2Nmd2xfZXZlbnQuaAppbmRleCBlMzI2YWIzLi4wMWUzOTE0IDEwMDY0NAotLS0gYS94ZmEvZndsL2Nmd2xfZXZlbnQuaAorKysgYi94ZmEvZndsL2Nmd2xfZXZlbnQuaApAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9tZXNzYWdla2V5LmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX21lc3NhZ2Vtb3VzZS5oIgogCi1jbGFzcyBDRlhfR3JhcGhpY3M7CitjbGFzcyBDWEZBX0dyYXBoaWNzOwogY2xhc3MgQ0ZXTF9XaWRnZXQ7CiAKIGNsYXNzIENGV0xfRXZlbnQgewpkaWZmIC0tZ2l0IGEveGZhL2Z3bC9jZndsX2V2ZW50Y2hlY2t3b3JkLmggYi94ZmEvZndsL2Nmd2xfZXZlbnRjaGVja3dvcmQuaAppbmRleCAzZGUxZTc1Li5mYWZlM2QzIDEwMDY0NAotLS0gYS94ZmEvZndsL2Nmd2xfZXZlbnRjaGVja3dvcmQuaAorKysgYi94ZmEvZndsL2Nmd2xfZXZlbnRjaGVja3dvcmQuaApAQCAtMTQsNyArMTQsNyBAQAogICBleHBsaWNpdCBDRldMX0V2ZW50Q2hlY2tXb3JkKENGV0xfV2lkZ2V0KiBwU3JjVGFyZ2V0KTsKICAgfkNGV0xfRXZlbnRDaGVja1dvcmQoKSBvdmVycmlkZTsKIAotICBDRlhfQnl0ZVN0cmluZyBic1dvcmQ7CisgIEJ5dGVTdHJpbmcgYnNXb3JkOwogICBib29sIGJDaGVja1dvcmQ7CiB9OwogCmRpZmYgLS1naXQgYS94ZmEvZndsL2Nmd2xfZXZlbnRzY3JvbGwuaCBiL3hmYS9md2wvY2Z3bF9ldmVudHNjcm9sbC5oCmluZGV4IDJmZGVmOWUuLmExM2VlZWYgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvY2Z3bF9ldmVudHNjcm9sbC5oCisrKyBiL3hmYS9md2wvY2Z3bF9ldmVudHNjcm9sbC5oCkBAIC0yOCw3ICsyOCw3IEBACiAgIH5DRldMX0V2ZW50U2Nyb2xsKCkgb3ZlcnJpZGU7CiAKICAgQ29kZSBtX2lTY3JvbGxDb2RlOwotICBGWF9GTE9BVCBtX2ZQb3M7CisgIGZsb2F0IG1fZlBvczsKIH07CiAKICNlbmRpZiAgLy8gWEZBX0ZXTF9DRldMX0VWRU5UU0NST0xMX0hfCmRpZmYgLS1naXQgYS94ZmEvZndsL2Nmd2xfZXZlbnR0YXJnZXQuY3BwIGIveGZhL2Z3bC9jZndsX2V2ZW50dGFyZ2V0LmNwcAppbmRleCA1NWY4ZTFmLi44YTNiNzg3IDEwMDY0NAotLS0gYS94ZmEvZndsL2Nmd2xfZXZlbnR0YXJnZXQuY3BwCisrKyBiL3hmYS9md2wvY2Z3bF9ldmVudHRhcmdldC5jcHAKQEAgLTEwLDcgKzEwLDcgQEAKICNpbmNsdWRlICJ4ZmEvZndsL2lmd2xfd2lkZ2V0ZGVsZWdhdGUuaCIKIAogQ0ZXTF9FdmVudFRhcmdldDo6Q0ZXTF9FdmVudFRhcmdldChDRldMX1dpZGdldCogcExpc3RlbmVyKQotICAgIDogbV9wTGlzdGVuZXIocExpc3RlbmVyKSwgbV9iSW52YWxpZChmYWxzZSkge30KKyAgICA6IG1fcExpc3RlbmVyKHBMaXN0ZW5lciksIG1fYlZhbGlkKHRydWUpIHt9CiAKIENGV0xfRXZlbnRUYXJnZXQ6On5DRldMX0V2ZW50VGFyZ2V0KCkge30KIApkaWZmIC0tZ2l0IGEveGZhL2Z3bC9jZndsX2V2ZW50dGFyZ2V0LmggYi94ZmEvZndsL2Nmd2xfZXZlbnR0YXJnZXQuaAppbmRleCAxYmNhOTcyLi5iNWE4YmRiIDEwMDY0NAotLS0gYS94ZmEvZndsL2Nmd2xfZXZlbnR0YXJnZXQuaAorKysgYi94ZmEvZndsL2Nmd2xfZXZlbnR0YXJnZXQuaApAQCAtOSw3ICs5LDYgQEAKIAogI2luY2x1ZGUgPHNldD4KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfZXZlbnQuaCIKIAogY2xhc3MgQ0ZXTF9FdmVudDsKQEAgLTIzLDEzICsyMiwxMyBAQAogICB2b2lkIFNldEV2ZW50U291cmNlKENGV0xfV2lkZ2V0KiBwU291cmNlKTsKICAgYm9vbCBQcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KTsKIAotICBib29sIElzSW52YWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1fYkludmFsaWQ7IH0KLSAgdm9pZCBGbGFnSW52YWxpZCgpIHsgbV9iSW52YWxpZCA9IHRydWU7IH0KKyAgYm9vbCBJc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbV9iVmFsaWQ7IH0KKyAgdm9pZCBGbGFnSW52YWxpZCgpIHsgbV9iVmFsaWQgPSBmYWxzZTsgfQogCiAgcHJpdmF0ZToKICAgc3RkOjpzZXQ8Q0ZXTF9XaWRnZXQqPiBtX3dpZGdldHM7CiAgIENGV0xfV2lkZ2V0KiBtX3BMaXN0ZW5lcjsKLSAgYm9vbCBtX2JJbnZhbGlkOworICBib29sIG1fYlZhbGlkOwogfTsKIAogI2VuZGlmICAvLyBYRkFfRldMX0NGV0xfRVZFTlRUQVJHRVRfSF8KZGlmZiAtLWdpdCBhL3hmYS9md2wvY2Z3bF9ldmVudHRleHRjaGFuZ2VkLmggYi94ZmEvZndsL2Nmd2xfZXZlbnR0ZXh0Y2hhbmdlZC5oCmluZGV4IDhhZTI3NjIuLjQ0OTRmMDggMTAwNjQ0Ci0tLSBhL3hmYS9md2wvY2Z3bF9ldmVudHRleHRjaGFuZ2VkLmgKKysrIGIveGZhL2Z3bC9jZndsX2V2ZW50dGV4dGNoYW5nZWQuaApAQCAtMTQsNyArMTQsNyBAQAogICBleHBsaWNpdCBDRldMX0V2ZW50VGV4dENoYW5nZWQoQ0ZXTF9XaWRnZXQqIHBTcmNUYXJnZXQpOwogICB+Q0ZXTF9FdmVudFRleHRDaGFuZ2VkKCkgb3ZlcnJpZGU7CiAKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NQcmV2VGV4dDsKKyAgV2lkZVN0cmluZyB3c1ByZXZUZXh0OwogfTsKIAogI2VuZGlmICAvLyBYRkFfRldMX0NGV0xfRVZFTlRURVhUQ0hBTkdFRF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z3bC9jZndsX2V2ZW50dmFsaWRhdGUuaCBiL3hmYS9md2wvY2Z3bF9ldmVudHZhbGlkYXRlLmgKaW5kZXggNTEyMTYxMi4uYjhmZWZmMSAxMDA2NDQKLS0tIGEveGZhL2Z3bC9jZndsX2V2ZW50dmFsaWRhdGUuaAorKysgYi94ZmEvZndsL2Nmd2xfZXZlbnR2YWxpZGF0ZS5oCkBAIC0xNCw3ICsxNCw3IEBACiAgIGV4cGxpY2l0IENGV0xfRXZlbnRWYWxpZGF0ZShDRldMX1dpZGdldCogcFNyY1RhcmdldCk7CiAgIH5DRldMX0V2ZW50VmFsaWRhdGUoKSBvdmVycmlkZTsKIAotICBDRlhfV2lkZVN0cmluZyB3c0luc2VydDsKKyAgV2lkZVN0cmluZyB3c0luc2VydDsKICAgYm9vbCBiVmFsaWRhdGU7CiB9OwogCmRpZmYgLS1naXQgYS94ZmEvZndsL2Nmd2xfZm9ybS5jcHAgYi94ZmEvZndsL2Nmd2xfZm9ybS5jcHAKaW5kZXggNWU5NTZhZC4uZDFjMTc4MyAxMDA2NDQKLS0tIGEveGZhL2Z3bC9jZndsX2Zvcm0uY3BwCisrKyBiL3hmYS9md2wvY2Z3bF9mb3JtLmNwcApAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlIDx1dGlsaXR5PgogCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotI2luY2x1ZGUgInhmYS9mZGUvdHRvL2ZkZV90ZXh0b3V0LmgiCisjaW5jbHVkZSAieGZhL2ZkZS9jZmRlX3RleHRvdXQuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfYXBwLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2V2ZW50LmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2Zvcm1wcm94eS5oIgpAQCAtMjEsNyArMjEsNiBAQAogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF90aGVtZXRleHQuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfd2lkZ2V0bWdyLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9pZndsX3RoZW1lcHJvdmlkZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL3RoZW1lL2Nmd2xfd2lkZ2V0dHAuaCIKIAogQ0ZXTF9Gb3JtOjpDRldMX0Zvcm0oY29uc3QgQ0ZXTF9BcHAqIGFwcCwKICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDRldMX1dpZGdldFByb3BlcnRpZXM+IHByb3BlcnRpZXMsCkBAIC00Niw4ICs0NSw4IEBACiAgIHJldHVybiBGV0xfVHlwZTo6Rm9ybTsKIH0KIAotYm9vbCBDRldMX0Zvcm06OklzSW5zdGFuY2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NsYXNzKSBjb25zdCB7Ci0gIGlmICh3c0NsYXNzID09IENGWF9XaWRlU3RyaW5nQyhGV0xfQ0xBU1NfRm9ybSkpCitib29sIENGV0xfRm9ybTo6SXNJbnN0YW5jZShjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NDbGFzcykgY29uc3QgeworICBpZiAod3NDbGFzcyA9PSBXaWRlU3RyaW5nVmlldyhGV0xfQ0xBU1NfRm9ybSkpCiAgICAgcmV0dXJuIHRydWU7CiAgIHJldHVybiBDRldMX1dpZGdldDo6SXNJbnN0YW5jZSh3c0NsYXNzKTsKIH0KQEAgLTc1LDcgKzc0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZXTF9XaWRnZXRIaXQ6OkNsaWVudDsKIH0KIAotdm9pZCBDRldMX0Zvcm06OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKK3ZvaWQgQ0ZXTF9Gb3JtOjpEcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7CiAgIGlmICghcEdyYXBoaWNzKQogICAgIHJldHVybjsKICAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKQpAQCAtODQsNyArODMsNyBAQAogICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7CiAgIERyYXdCYWNrZ3JvdW5kKHBHcmFwaGljcywgcFRoZW1lKTsKIAotI2lmZGVmIEZXTF9Vc2VNYWNTeXN0ZW1Cb3JkZXIKKyNpZiBfRlhfT1NfID09IF9GWF9PU19NQUNPU1hfCiAgIHJldHVybjsKICNlbmRpZgogICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbTsKQEAgLTkyLDggKzkxLDcgQEAKICAgcGFyYW0ubV9kd1N0YXRlcyA9IENGV0xfUGFydFN0YXRlX05vcm1hbDsKICAgcGFyYW0ubV9wR3JhcGhpY3MgPSBwR3JhcGhpY3M7CiAgIHBhcmFtLm1fcnRQYXJ0ID0gbV9ydFJlbGF0aXZlOwotICBpZiAocE1hdHJpeCkKLSAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOworICBwYXJhbS5tX21hdHJpeC5Db25jYXQobWF0cml4KTsKICAgaWYgKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfQm9yZGVyKSB7CiAgICAgcGFyYW0ubV9pUGFydCA9IENGV0xfUGFydDo6Qm9yZGVyOwogICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsKQEAgLTExNiw3ICsxMTQsNyBAQAogICBSZW1vdmVTdGF0ZXMoRldMX1dHVFNUQVRFX0ludmlzaWJsZSk7CiAgIHBEcml2ZXItPlJ1bigpOwogCi0jaWYgX0ZYX09TXyAhPSBfRlhfTUFDT1NYXworI2lmIF9GWF9PU18gIT0gX0ZYX09TX01BQ09TWF8KICAgcERyaXZlci0+UG9wTm90ZUxvb3AoKTsKICNlbmRpZgogCkBAIC0xMjgsNyArMTI2LDcgQEAKICAgaWYgKCFtX3BOb3RlTG9vcCkKICAgICByZXR1cm47CiAKLSNpZiAoX0ZYX09TXyA9PSBfRlhfTUFDT1NYXykKKyNpZiAoX0ZYX09TXyA9PSBfRlhfT1NfTUFDT1NYXykKICAgbV9wTm90ZUxvb3AtPkVuZE1vZGFsTG9vcCgpOwogICBjb25zdCBDRldMX0FwcCogcEFwcCA9IEdldE93bmVyQXBwKCk7CiAgIGlmICghcEFwcCkKQEAgLTE0Nyw3ICsxNDUsNyBAQAogI2VuZGlmCiB9CiAKLXZvaWQgQ0ZXTF9Gb3JtOjpEcmF3QmFja2dyb3VuZChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKK3ZvaWQgQ0ZXTF9Gb3JtOjpEcmF3QmFja2dyb3VuZChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUpIHsKICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07CiAgIHBhcmFtLm1fcFdpZGdldCA9IHRoaXM7CkBAIC0xNjEsOCArMTU5LDggQEAKIENGWF9SZWN0RiBDRldMX0Zvcm06OkdldEVkZ2VSZWN0KCkgewogICBDRlhfUmVjdEYgcnRFZGdlID0gbV9ydFJlbGF0aXZlOwogICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9Cb3JkZXIpIHsKLSAgICBGWF9GTE9BVCBmQ1ggPSBHZXRCb3JkZXJTaXplKHRydWUpOwotICAgIEZYX0ZMT0FUIGZDWSA9IEdldEJvcmRlclNpemUoZmFsc2UpOworICAgIGZsb2F0IGZDWCA9IEdldEJvcmRlclNpemUodHJ1ZSk7CisgICAgZmxvYXQgZkNZID0gR2V0Qm9yZGVyU2l6ZShmYWxzZSk7CiAgICAgcnRFZGdlLkRlZmxhdGUoZkNYLCBmQ1ksIGZDWCwgZkNZKTsKICAgfQogICByZXR1cm4gcnRFZGdlOwpAQCAtMTc5LDcgKzE3Nyw3IEBACiB2b2lkIENGV0xfRm9ybTo6TGF5b3V0KCkgewogICBtX3J0UmVsYXRpdmUgPSBHZXRSZWxhdGl2ZVJlY3QoKTsKIAotI2lmbmRlZiBGV0xfVXNlTWFjU3lzdGVtQm9yZGVyCisjaWYgX0ZYX09TXyA9PSBfRlhfT1NfTUFDT1NYXwogICBJRldMX1RoZW1lUHJvdmlkZXIqIHRoZW1lID0gR2V0QXZhaWxhYmxlVGhlbWUoKTsKICAgbV9mQ1hCb3JkZXIgPSB0aGVtZSA/IHRoZW1lLT5HZXRDWEJvcmRlclNpemUoKSA6IDAuMGY7CiAgIG1fZkNZQm9yZGVyID0gdGhlbWUgPyB0aGVtZS0+R2V0Q1lCb3JkZXJTaXplKCkgOiAwLjBmOwpAQCAtMjEzLDcgKzIxMSw3IEBACiB9CiAKIHZvaWQgQ0ZXTF9Gb3JtOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsKLSNpZm5kZWYgRldMX1VzZU1hY1N5c3RlbUJvcmRlcgorI2lmIF9GWF9PU18gPT0gX0ZYX09TX01BQ09TWF8KICAgaWYgKCFwTWVzc2FnZSkKICAgICByZXR1cm47CiAKQEAgLTIzNSwxMiArMjMzLDEyIEBACiAgICAgZGVmYXVsdDoKICAgICAgIGJyZWFrOwogICB9Ci0jZW5kaWYgIC8vIEZXTF9Vc2VNYWNTeXN0ZW1Cb3JkZXIKKyNlbmRpZiAgLy8gX0ZYX09TXyA9PSBfRlhfT1NfTUFDT1NYXwogfQogCi12b2lkIENGV0xfRm9ybTo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7Ci0gIERyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsKK3ZvaWQgQ0ZXTF9Gb3JtOjpPbkRyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKKyAgRHJhd1dpZGdldChwR3JhcGhpY3MsIG1hdHJpeCk7CiB9CiAKIHZvaWQgQ0ZXTF9Gb3JtOjpPbkxCdXR0b25Eb3duKENGV0xfTWVzc2FnZU1vdXNlKiBwTXNnKSB7CmRpZmYgLS1naXQgYS94ZmEvZndsL2Nmd2xfZm9ybS5oIGIveGZhL2Z3bC9jZndsX2Zvcm0uaAppbmRleCA3MjAyY2IyLi5jYWMxNzQ3IDEwMDY0NAotLS0gYS94ZmEvZndsL2Nmd2xfZm9ybS5oCisrKyBiL3hmYS9md2wvY2Z3bF9mb3JtLmgKQEAgLTE2LDEwICsxNiw2IEBACiAjZGVmaW5lIEZXTF9DTEFTU19Gb3JtIEwiRldMX0ZPUk0iCiAjZGVmaW5lIEZXTF9DTEFTU19Gb3JtUHJveHkgTCJGV0xfRk9STVBST1hZIgogCi0jaWYgKF9GWF9PU18gPT0gX0ZYX01BQ09TWF8pCi0jZGVmaW5lIEZXTF9Vc2VNYWNTeXN0ZW1Cb3JkZXIKLSNlbmRpZgotCiBjbGFzcyBDRldMX01lc3NhZ2VNb3VzZTsKIGNsYXNzIENGV0xfTm90ZUxvb3A7CiBjbGFzcyBDRldMX1dpZGdldDsKQEAgLTM0LDE0ICszMCwxNCBAQAogCiAgIC8vIENGV0xfV2lkZ2V0CiAgIEZXTF9UeXBlIEdldENsYXNzSUQoKSBjb25zdCBvdmVycmlkZTsKLSAgYm9vbCBJc0luc3RhbmNlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDbGFzcykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgSXNJbnN0YW5jZShjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NDbGFzcykgY29uc3Qgb3ZlcnJpZGU7CiAgIENGWF9SZWN0RiBHZXRDbGllbnRSZWN0KCkgb3ZlcnJpZGU7CiAgIHZvaWQgVXBkYXRlKCkgb3ZlcnJpZGU7CiAgIEZXTF9XaWRnZXRIaXQgSGl0VGVzdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7Ci0gIHZvaWQgRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgb3ZlcnJpZGU7CisgIHZvaWQgRHJhd1dpZGdldChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgb3ZlcnJpZGU7CiAgIHZvaWQgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSBvdmVycmlkZTsKLSAgdm9pZCBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIG92ZXJyaWRlOworICB2b2lkIE9uRHJhd1dpZGdldChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgb3ZlcnJpZGU7CiAKICAgQ0ZXTF9XaWRnZXQqIERvTW9kYWwoKTsKICAgdm9pZCBFbmREb01vZGFsKCk7CkBAIC01MCw3ICs0Niw3IEBACiAgIHZvaWQgU2V0U3ViRm9jdXMoQ0ZXTF9XaWRnZXQqIHBXaWRnZXQpIHsgbV9wU3ViRm9jdXMgPSBwV2lkZ2V0OyB9CiAKICBwcml2YXRlOgotICB2b2lkIERyYXdCYWNrZ3JvdW5kKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSk7CisgIHZvaWQgRHJhd0JhY2tncm91bmQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSk7CiAgIENGWF9SZWN0RiBHZXRFZGdlUmVjdCgpOwogICB2b2lkIFNldFdvcmtBcmVhUmVjdCgpOwogICB2b2lkIExheW91dCgpOwpAQCAtNjMsOCArNTksOCBAQAogICBDRlhfUmVjdEYgbV9ydFJlbGF0aXZlOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZXTF9Ob3RlTG9vcD4gbV9wTm90ZUxvb3A7CiAgIENGV0xfV2lkZ2V0KiBtX3BTdWJGb2N1czsKLSAgRlhfRkxPQVQgbV9mQ1hCb3JkZXI7Ci0gIEZYX0ZMT0FUIG1fZkNZQm9yZGVyOworICBmbG9hdCBtX2ZDWEJvcmRlcjsKKyAgZmxvYXQgbV9mQ1lCb3JkZXI7CiB9OwogCiAjZW5kaWYgIC8vIFhGQV9GV0xfQ0ZXTF9GT1JNX0hfCmRpZmYgLS1naXQgYS94ZmEvZndsL2Nmd2xfZm9ybXByb3h5LmNwcCBiL3hmYS9md2wvY2Z3bF9mb3JtcHJveHkuY3BwCmluZGV4IDc3NmJhMGEuLmQwM2MxNDggMTAwNjQ0Ci0tLSBhL3hmYS9md2wvY2Z3bF9mb3JtcHJveHkuY3BwCisrKyBiL3hmYS9md2wvY2Z3bF9mb3JtcHJveHkuY3BwCkBAIC0yNCwxNiArMjQsMTYgQEAKICAgcmV0dXJuIEZXTF9UeXBlOjpGb3JtUHJveHk7CiB9CiAKLWJvb2wgQ0ZXTF9Gb3JtUHJveHk6OklzSW5zdGFuY2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NsYXNzKSBjb25zdCB7Ci0gIGlmICh3c0NsYXNzID09IENGWF9XaWRlU3RyaW5nQyhGV0xfQ0xBU1NfRm9ybVByb3h5KSkKK2Jvb2wgQ0ZXTF9Gb3JtUHJveHk6OklzSW5zdGFuY2UoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzQ2xhc3MpIGNvbnN0IHsKKyAgaWYgKHdzQ2xhc3MgPT0gV2lkZVN0cmluZ1ZpZXcoRldMX0NMQVNTX0Zvcm1Qcm94eSkpCiAgICAgcmV0dXJuIHRydWU7CiAgIHJldHVybiBDRldMX0Zvcm06OklzSW5zdGFuY2Uod3NDbGFzcyk7CiB9CiAKIHZvaWQgQ0ZXTF9Gb3JtUHJveHk6OlVwZGF0ZSgpIHt9CiAKLXZvaWQgQ0ZXTF9Gb3JtUHJveHk6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHt9Cit2b2lkIENGV0xfRm9ybVByb3h5OjpEcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7fQogCiB2b2lkIENGV0xfRm9ybVByb3h5OjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsKICAgbV9wT3V0ZXItPkdldERlbGVnYXRlKCktPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOwpkaWZmIC0tZ2l0IGEveGZhL2Z3bC9jZndsX2Zvcm1wcm94eS5oIGIveGZhL2Z3bC9jZndsX2Zvcm1wcm94eS5oCmluZGV4IDRhZDcwYmYuLjQ5OGZmNDIgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvY2Z3bF9mb3JtcHJveHkuaAorKysgYi94ZmEvZndsL2Nmd2xfZm9ybXByb3h5LmgKQEAgLTIyLDkgKzIyLDkgQEAKIAogICAvLyBDRldMX1dpZGdldAogICBGV0xfVHlwZSBHZXRDbGFzc0lEKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGJvb2wgSXNJbnN0YW5jZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQ2xhc3MpIGNvbnN0IG92ZXJyaWRlOworICBib29sIElzSW5zdGFuY2UoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzQ2xhc3MpIGNvbnN0IG92ZXJyaWRlOwogICB2b2lkIFVwZGF0ZSgpIG92ZXJyaWRlOwotICB2b2lkIERyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIG92ZXJyaWRlOworICB2b2lkIERyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIG92ZXJyaWRlOwogICB2b2lkIE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgb3ZlcnJpZGU7CiB9OwogCmRpZmYgLS1naXQgYS94ZmEvZndsL2Nmd2xfbGlzdGJveC5jcHAgYi94ZmEvZndsL2Nmd2xfbGlzdGJveC5jcHAKaW5kZXggMGI4MjcwOS4uMGRkYjY1YiAxMDA2NDQKLS0tIGEveGZhL2Z3bC9jZndsX2xpc3Rib3guY3BwCisrKyBiL3hmYS9md2wvY2Z3bF9saXN0Ym94LmNwcApAQCAtMTIsNyArMTIsNyBAQAogCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL3R0by9mZGVfdGV4dG91dC5oIgorI2luY2x1ZGUgInhmYS9mZGUvY2ZkZV90ZXh0b3V0LmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2FwcC5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9tZXNzYWdla2V5LmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX21lc3NhZ2Vtb3VzZS5oIgpAQCAtMzIsOCArMzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENGV0xfV2lkZ2V0UHJvcGVydGllcz4gcHJvcGVydGllcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGV0xfV2lkZ2V0KiBwT3V0ZXIpCiAgICAgOiBDRldMX1dpZGdldChhcHAsIHN0ZDo6bW92ZShwcm9wZXJ0aWVzKSwgcE91dGVyKSwKLSAgICAgIG1fZHdUVE9TdHlsZXMoMCksCi0gICAgICBtX2lUVE9BbGlnbnMoMCksCisgICAgICBtX2lUVE9BbGlnbnMoRkRFX1RleHRBbGlnbm1lbnQ6OmtUb3BMZWZ0KSwKICAgICAgIG1faEFuY2hvcihudWxscHRyKSwKICAgICAgIG1fZlNjb3JsbEJhcldpZHRoKDApLAogICAgICAgbV9iTEJ1dHRvbkRvd24oZmFsc2UpLApAQCAtNTcsMjAgKzU2LDIwIEBACiAKICAgc3dpdGNoIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9BbGlnbk1hc2spIHsKICAgICBjYXNlIEZXTF9TVFlMRUVYVF9MVEJfTGVmdEFsaWduOiB7Ci0gICAgICBtX2lUVE9BbGlnbnMgPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlckxlZnQ7CisgICAgICBtX2lUVE9BbGlnbnMgPSBGREVfVGV4dEFsaWdubWVudDo6a0NlbnRlckxlZnQ7CiAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBGV0xfU1RZTEVFWFRfTFRCX1JpZ2h0QWxpZ246IHsKLSAgICAgIG1faVRUT0FsaWducyA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyUmlnaHQ7CisgICAgICBtX2lUVE9BbGlnbnMgPSBGREVfVGV4dEFsaWdubWVudDo6a0NlbnRlclJpZ2h0OwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNhc2UgRldMX1NUWUxFRVhUX0xUQl9DZW50ZXJBbGlnbjoKICAgICBkZWZhdWx0OiB7Ci0gICAgICBtX2lUVE9BbGlnbnMgPSBGREVfVFRPQUxJR05NRU5UX0NlbnRlcjsKKyAgICAgIG1faVRUT0FsaWducyA9IEZERV9UZXh0QWxpZ25tZW50OjprQ2VudGVyOwogICAgICAgYnJlYWs7CiAgICAgfQogICB9Ci0gIG1fZHdUVE9TdHlsZXMgfD0gRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7CisgIG1fZHdUVE9TdHlsZXMuc2luZ2xlX2xpbmVfID0gdHJ1ZTsKICAgbV9mU2NvcmxsQmFyV2lkdGggPSBHZXRTY3JvbGxXaWR0aCgpOwogICBDYWxjU2l6ZShmYWxzZSk7CiB9CkBAIC05MSw4ICs5MCw4IEBACiAgIHJldHVybiBGV0xfV2lkZ2V0SGl0OjpVbmtub3duOwogfQogCi12b2lkIENGV0xfTGlzdEJveDo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKK3ZvaWQgQ0ZXTF9MaXN0Qm94OjpEcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgewogICBpZiAoIXBHcmFwaGljcykKICAgICByZXR1cm47CiAgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikKQEAgLTEwMSwyMSArMTAwLDE5IEBACiAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsKICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOwogICBpZiAoSGFzQm9yZGVyKCkpCi0gICAgRHJhd0JvcmRlcihwR3JhcGhpY3MsIENGV0xfUGFydDo6Qm9yZGVyLCBwVGhlbWUsIHBNYXRyaXgpOworICAgIERyYXdCb3JkZXIocEdyYXBoaWNzLCBDRldMX1BhcnQ6OkJvcmRlciwgcFRoZW1lLCBtYXRyaXgpOwogCiAgIENGWF9SZWN0RiBydENsaXAobV9ydENvbmVudCk7CiAgIGlmIChJc1Nob3dTY3JvbGxCYXIoZmFsc2UpKQogICAgIHJ0Q2xpcC5oZWlnaHQgLT0gbV9mU2NvcmxsQmFyV2lkdGg7CiAgIGlmIChJc1Nob3dTY3JvbGxCYXIodHJ1ZSkpCiAgICAgcnRDbGlwLndpZHRoIC09IG1fZlNjb3JsbEJhcldpZHRoOwotICBpZiAocE1hdHJpeCkKLSAgICBwTWF0cml4LT5UcmFuc2Zvcm1SZWN0KHJ0Q2xpcCk7CiAKLSAgcEdyYXBoaWNzLT5TZXRDbGlwUmVjdChydENsaXApOworICBwR3JhcGhpY3MtPlNldENsaXBSZWN0KG1hdHJpeC5UcmFuc2Zvcm1SZWN0KHJ0Q2xpcCkpOwogICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZXMgJiBGV0xfV0dUU1RZTEVfTm9CYWNrZ3JvdW5kKSA9PSAwKQotICAgIERyYXdCa2dyb3VuZChwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7CisgICAgRHJhd0JrZ3JvdW5kKHBHcmFwaGljcywgcFRoZW1lLCAmbWF0cml4KTsKIAotICBEcmF3SXRlbXMocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOworICBEcmF3SXRlbXMocEdyYXBoaWNzLCBwVGhlbWUsICZtYXRyaXgpOwogICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7CiB9CiAKQEAgLTMwNiwxMSArMzAzLDExIEBACiAKIENGV0xfTGlzdEl0ZW0qIENGV0xfTGlzdEJveDo6R2V0SXRlbUF0UG9pbnQoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKICAgQ0ZYX1BvaW50RiBwb3MgPSBwb2ludCAtIG1fcnRDb25lbnQuVG9wTGVmdCgpOwotICBGWF9GTE9BVCBmUG9zWCA9IDAuMGY7CisgIGZsb2F0IGZQb3NYID0gMC4wZjsKICAgaWYgKG1fcEhvcnpTY3JvbGxCYXIpCiAgICAgZlBvc1ggPSBtX3BIb3J6U2Nyb2xsQmFyLT5HZXRQb3MoKTsKIAotICBGWF9GTE9BVCBmUG9zWSA9IDAuMDsKKyAgZmxvYXQgZlBvc1kgPSAwLjA7CiAgIGlmIChtX3BWZXJ0U2Nyb2xsQmFyKQogICAgIGZQb3NZID0gbV9wVmVydFNjcm9sbEJhci0+R2V0UG9zKCk7CiAKQEAgLTMzNCw3ICszMzEsNyBAQAogCiAgIENGWF9SZWN0RiBydEl0ZW0gPSBwSXRlbSA/IHBJdGVtLT5HZXRSZWN0KCkgOiBDRlhfUmVjdEYoKTsKICAgYm9vbCBiU2Nyb2xsID0gZmFsc2U7Ci0gIEZYX0ZMT0FUIGZQb3NZID0gbV9wVmVydFNjcm9sbEJhci0+R2V0UG9zKCk7CisgIGZsb2F0IGZQb3NZID0gbV9wVmVydFNjcm9sbEJhci0+R2V0UG9zKCk7CiAgIHJ0SXRlbS5PZmZzZXQoMCwgLWZQb3NZICsgbV9ydENvbmVudC50b3ApOwogICBpZiAocnRJdGVtLnRvcCA8IG1fcnRDb25lbnQudG9wKSB7CiAgICAgZlBvc1kgKz0gcnRJdGVtLnRvcCAtIG1fcnRDb25lbnQudG9wOwpAQCAtMzUyLDcgKzM0OSw3IEBACiAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIENGV0xfTGlzdEJveDo6RHJhd0JrZ3JvdW5kKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAordm9pZCBDRldMX0xpc3RCb3g6OkRyYXdCa2dyb3VuZChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7CiAgIGlmICghcEdyYXBoaWNzKQpAQCAtMzc1LDE0ICszNzIsMTQgQEAKICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOwogfQogCi12b2lkIENGV0xfTGlzdEJveDo6RHJhd0l0ZW1zKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAordm9pZCBDRldMX0xpc3RCb3g6OkRyYXdJdGVtcyhDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7Ci0gIEZYX0ZMT0FUIGZQb3NYID0gMC4wZjsKKyAgZmxvYXQgZlBvc1ggPSAwLjBmOwogICBpZiAobV9wSG9yelNjcm9sbEJhcikKICAgICBmUG9zWCA9IG1fcEhvcnpTY3JvbGxCYXItPkdldFBvcygpOwogCi0gIEZYX0ZMT0FUIGZQb3NZID0gMC4wZjsKKyAgZmxvYXQgZlBvc1kgPSAwLjBmOwogICBpZiAobV9wVmVydFNjcm9sbEJhcikKICAgICBmUG9zWSA9IG1fcFZlcnRTY3JvbGxCYXItPkdldFBvcygpOwogCkBAIC00MDgsNyArNDA1LDcgQEAKICAgfQogfQogCi12b2lkIENGV0xfTGlzdEJveDo6RHJhd0l0ZW0oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCit2b2lkIENGV0xfTGlzdEJveDo6RHJhd0l0ZW0oQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGV0xfTGlzdEl0ZW0qIHBJdGVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgSW5kZXgsCkBAIC00NDcsNyArNDQ0LDcgQEAKICAgaWYgKCFwSXRlbSkKICAgICByZXR1cm47CiAKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0ID0gcEl0ZW0tPkdldFRleHQoKTsKKyAgV2lkZVN0cmluZyB3c1RleHQgPSBwSXRlbS0+R2V0VGV4dCgpOwogICBpZiAod3NUZXh0LkdldExlbmd0aCgpIDw9IDApCiAgICAgcmV0dXJuOwogCkBAIC00ODQsMTEgKzQ4MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICBwVUlNYXJnaW4uaGVpZ2h0KTsKICAgfQogCi0gIEZYX0ZMT0FUIGZXaWR0aCA9IEdldE1heFRleHRXaWR0aCgpOworICBmbG9hdCBmV2lkdGggPSBHZXRNYXhUZXh0V2lkdGgoKTsKICAgZldpZHRoICs9IDIgKiBrSXRlbVRleHRNYXJnaW47CiAgIGlmICghYkF1dG9TaXplKSB7Ci0gICAgRlhfRkxPQVQgZkFjdHVhbFdpZHRoID0KLSAgICAgICAgbV9ydENsaWVudC53aWR0aCAtIHJ0VUlNYXJnaW4ubGVmdCAtIHJ0VUlNYXJnaW4ud2lkdGg7CisgICAgZmxvYXQgZkFjdHVhbFdpZHRoID0gbV9ydENsaWVudC53aWR0aCAtIHJ0VUlNYXJnaW4ubGVmdCAtIHJ0VUlNYXJnaW4ud2lkdGg7CiAgICAgZldpZHRoID0gc3RkOjptYXgoZldpZHRoLCBmQWN0dWFsV2lkdGgpOwogICB9CiAgIG1fZkl0ZW1IZWlnaHQgPSBDYWxjSXRlbUhlaWdodCgpOwpAQCAtNTAyLDcgKzQ5OCw3IEBACiAgIGlmIChiQXV0b1NpemUpCiAgICAgcmV0dXJuIGZzOwogCi0gIEZYX0ZMT0FUIGlIZWlnaHQgPSBtX3J0Q2xpZW50LmhlaWdodDsKKyAgZmxvYXQgaUhlaWdodCA9IG1fcnRDbGllbnQuaGVpZ2h0OwogICBib29sIGJTaG93VmVydFNjciA9IGZhbHNlOwogICBib29sIGJTaG93SG9yelNjciA9IGZhbHNlOwogICBpZiAoIWJTaG93VmVydFNjciAmJiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlcyAmIEZXTF9XR1RTVFlMRV9WU2Nyb2xsKSkKQEAgLTUyNyw4ICs1MjMsOCBAQAogICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFBhZ2VTaXplKHJ0U2Nyb2xsQmFyLmhlaWdodCAqIDkgLyAxMCk7CiAgICAgbV9wVmVydFNjcm9sbEJhci0+U2V0U3RlcFNpemUobV9mSXRlbUhlaWdodCk7CiAKLSAgICBGWF9GTE9BVCBmUG9zID0KLSAgICAgICAgc3RkOjptaW4oc3RkOjptYXgobV9wVmVydFNjcm9sbEJhci0+R2V0UG9zKCksIDAuZiksIHN6UmFuZ2UuaGVpZ2h0KTsKKyAgICBmbG9hdCBmUG9zID0KKyAgICAgICAgcGRmaXVtOjpjbGFtcChtX3BWZXJ0U2Nyb2xsQmFyLT5HZXRQb3MoKSwgMC4wZiwgc3pSYW5nZS5oZWlnaHQpOwogICAgIG1fcFZlcnRTY3JvbGxCYXItPlNldFBvcyhmUG9zKTsKICAgICBtX3BWZXJ0U2Nyb2xsQmFyLT5TZXRUcmFja1BvcyhmUG9zKTsKICAgICBpZiAoKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfTFRCX1Nob3dTY3JvbGxCYXJGb2N1cykgPT0KQEAgLTU1OSw4ICs1NTUsOCBAQAogICAgIG1fcEhvcnpTY3JvbGxCYXItPlNldFBhZ2VTaXplKGZXaWR0aCAqIDkgLyAxMCk7CiAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0U3RlcFNpemUoZldpZHRoIC8gMTApOwogCi0gICAgRlhfRkxPQVQgZlBvcyA9Ci0gICAgICAgIHN0ZDo6bWluKHN0ZDo6bWF4KG1fcEhvcnpTY3JvbGxCYXItPkdldFBvcygpLCAwLmYpLCBzelJhbmdlLmhlaWdodCk7CisgICAgZmxvYXQgZlBvcyA9CisgICAgICAgIHBkZml1bTo6Y2xhbXAobV9wSG9yelNjcm9sbEJhci0+R2V0UG9zKCksIDAuMGYsIHN6UmFuZ2UuaGVpZ2h0KTsKICAgICBtX3BIb3J6U2Nyb2xsQmFyLT5TZXRQb3MoZlBvcyk7CiAgICAgbV9wSG9yelNjcm9sbEJhci0+U2V0VHJhY2tQb3MoZlBvcyk7CiAgICAgaWYgKChtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzICYgRldMX1NUWUxFRVhUX0xUQl9TaG93U2Nyb2xsQmFyRm9jdXMpID09CkBAIC01ODQsOCArNTgwLDggQEAKIAogdm9pZCBDRldMX0xpc3RCb3g6OlVwZGF0ZUl0ZW1TaXplKENGV0xfTGlzdEl0ZW0qIHBJdGVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9TaXplRiYgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkl0ZW1IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZJdGVtSGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkF1dG9TaXplKSBjb25zdCB7CiAgIGlmICghYkF1dG9TaXplICYmIHBJdGVtKSB7CiAgICAgQ0ZYX1JlY3RGIHJ0SXRlbSgwLCBzaXplLmhlaWdodCwgZldpZHRoLCBmSXRlbUhlaWdodCk7CkBAIC01OTUsOCArNTkxLDggQEAKICAgc2l6ZS5oZWlnaHQgKz0gZkl0ZW1IZWlnaHQ7CiB9CiAKLUZYX0ZMT0FUIENGV0xfTGlzdEJveDo6R2V0TWF4VGV4dFdpZHRoKCkgewotICBGWF9GTE9BVCBmUmV0ID0gMC4wZjsKK2Zsb2F0IENGV0xfTGlzdEJveDo6R2V0TWF4VGV4dFdpZHRoKCkgeworICBmbG9hdCBmUmV0ID0gMC4wZjsKICAgaW50MzJfdCBpQ291bnQgPSBDb3VudEl0ZW1zKHRoaXMpOwogICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgewogICAgIENGV0xfTGlzdEl0ZW0qIHBJdGVtID0gR2V0SXRlbSh0aGlzLCBpKTsKQEAgLTYxMCwxMiArNjA2LDEyIEBACiAgIHJldHVybiBmUmV0OwogfQogCi1GWF9GTE9BVCBDRldMX0xpc3RCb3g6OkdldFNjcm9sbFdpZHRoKCkgeworZmxvYXQgQ0ZXTF9MaXN0Qm94OjpHZXRTY3JvbGxXaWR0aCgpIHsKICAgSUZXTF9UaGVtZVByb3ZpZGVyKiB0aGVtZSA9IEdldEF2YWlsYWJsZVRoZW1lKCk7CiAgIHJldHVybiB0aGVtZSA/IHRoZW1lLT5HZXRTY3JvbGxCYXJXaWR0aCgpIDogMC4wZjsKIH0KIAotRlhfRkxPQVQgQ0ZXTF9MaXN0Qm94OjpDYWxjSXRlbUhlaWdodCgpIHsKK2Zsb2F0IENGV0xfTGlzdEJveDo6Q2FsY0l0ZW1IZWlnaHQoKSB7CiAgIElGV0xfVGhlbWVQcm92aWRlciogdGhlbWUgPSBHZXRBdmFpbGFibGVUaGVtZSgpOwogICBDRldMX1RoZW1lUGFydCBwYXJ0OwogICBwYXJ0Lm1fcFdpZGdldCA9IHRoaXM7CkBAIC02MzEsOCArNjI3LDggQEAKICAgcHJvcC0+bV9kd1N0YXRlcyA9IEZXTF9XR1RTVEFURV9JbnZpc2libGU7CiAgIHByb3AtPm1fcFBhcmVudCA9IHRoaXM7CiAgIHByb3AtPm1fcFRoZW1lUHJvdmlkZXIgPSBtX3BTY3JvbGxCYXJUUDsKLSAgbV9wVmVydFNjcm9sbEJhciA9Ci0gICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZXTF9TY3JvbGxCYXI+KG1fcE93bmVyQXBwLCBzdGQ6Om1vdmUocHJvcCksIHRoaXMpOworICBtX3BWZXJ0U2Nyb2xsQmFyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfU2Nyb2xsQmFyPihtX3BPd25lckFwcC5HZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHByb3ApLCB0aGlzKTsKIH0KIAogdm9pZCBDRldMX0xpc3RCb3g6OkluaXRIb3Jpem9udGFsU2Nyb2xsQmFyKCkgewpAQCAtNjQ0LDggKzY0MCw4IEBACiAgIHByb3AtPm1fZHdTdGF0ZXMgPSBGV0xfV0dUU1RBVEVfSW52aXNpYmxlOwogICBwcm9wLT5tX3BQYXJlbnQgPSB0aGlzOwogICBwcm9wLT5tX3BUaGVtZVByb3ZpZGVyID0gbV9wU2Nyb2xsQmFyVFA7Ci0gIG1fcEhvcnpTY3JvbGxCYXIgPQotICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfU2Nyb2xsQmFyPihtX3BPd25lckFwcCwgc3RkOjptb3ZlKHByb3ApLCB0aGlzKTsKKyAgbV9wSG9yelNjcm9sbEJhciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRldMX1Njcm9sbEJhcj4obV9wT3duZXJBcHAuR2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwcm9wKSwgdGhpcyk7CiB9CiAKIGJvb2wgQ0ZXTF9MaXN0Qm94OjpJc1Nob3dTY3JvbGxCYXIoYm9vbCBiVmVydCkgewpAQCAtNzE1LDkgKzcxMSw5IEBACiAgIH0KIH0KIAotdm9pZCBDRldMX0xpc3RCb3g6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBEcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7Cit2b2lkIENGV0xfTGlzdEJveDo6T25EcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7CisgIERyYXdXaWRnZXQocEdyYXBoaWNzLCBtYXRyaXgpOwogfQogCiB2b2lkIENGV0xfTGlzdEJveDo6T25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlKiBwTXNnLCBib29sIGJTZXQpIHsKQEAgLTgzOCwxMSArODM0LDExIEBACiAKIGJvb2wgQ0ZXTF9MaXN0Qm94OjpPblNjcm9sbChDRldMX1Njcm9sbEJhciogcFNjcm9sbEJhciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRldMX0V2ZW50U2Nyb2xsOjpDb2RlIGR3Q29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUG9zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZlBvcykgewogICBDRlhfU2l6ZUYgZnM7CiAgIHBTY3JvbGxCYXItPkdldFJhbmdlKCZmcy53aWR0aCwgJmZzLmhlaWdodCk7Ci0gIEZYX0ZMT0FUIGlDdXJQb3MgPSBwU2Nyb2xsQmFyLT5HZXRQb3MoKTsKLSAgRlhfRkxPQVQgZlN0ZXAgPSBwU2Nyb2xsQmFyLT5HZXRTdGVwU2l6ZSgpOworICBmbG9hdCBpQ3VyUG9zID0gcFNjcm9sbEJhci0+R2V0UG9zKCk7CisgIGZsb2F0IGZTdGVwID0gcFNjcm9sbEJhci0+R2V0U3RlcFNpemUoKTsKICAgc3dpdGNoIChkd0NvZGUpIHsKICAgICBjYXNlIENGV0xfRXZlbnRTY3JvbGw6OkNvZGU6Ok1pbjogewogICAgICAgZlBvcyA9IGZzLndpZHRoOwpAQCAtOTExLDkgKzkwNyw5IEBACiAgIHJldHVybiBpdCAhPSBtX0l0ZW1BcnJheS5lbmQoKSA/IGl0IC0gbV9JdGVtQXJyYXkuYmVnaW4oKSA6IC0xOwogfQogCi1DRldMX0xpc3RJdGVtKiBDRldMX0xpc3RCb3g6OkFkZFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQWRkKSB7CitDRldMX0xpc3RJdGVtKiBDRldMX0xpc3RCb3g6OkFkZFN0cmluZyhjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NBZGQpIHsKICAgbV9JdGVtQXJyYXkuZW1wbGFjZV9iYWNrKAotICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfTGlzdEl0ZW0+KENGWF9XaWRlU3RyaW5nKHdzQWRkKSkpOworICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfTGlzdEl0ZW0+KFdpZGVTdHJpbmcod3NBZGQpKSk7CiAgIHJldHVybiBtX0l0ZW1BcnJheS5iYWNrKCkuZ2V0KCk7CiB9CiAKZGlmZiAtLWdpdCBhL3hmYS9md2wvY2Z3bF9saXN0Ym94LmggYi94ZmEvZndsL2Nmd2xfbGlzdGJveC5oCmluZGV4IGNhYTRmNTAuLjRhNzgxOGMgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvY2Z3bF9saXN0Ym94LmgKKysrIGIveGZhL2Z3bC9jZndsX2xpc3Rib3guaApAQCAtNDIsMTggKzQyLDE4IEBACiAgIEZXTF9UeXBlIEdldENsYXNzSUQoKSBjb25zdCBvdmVycmlkZTsKICAgdm9pZCBVcGRhdGUoKSBvdmVycmlkZTsKICAgRldMX1dpZGdldEhpdCBIaXRUZXN0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKLSAgdm9pZCBEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSBvdmVycmlkZTsKKyAgdm9pZCBEcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSBvdmVycmlkZTsKICAgdm9pZCBTZXRUaGVtZVByb3ZpZGVyKElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lUHJvdmlkZXIpIG92ZXJyaWRlOwogICB2b2lkIE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgb3ZlcnJpZGU7CiAgIHZvaWQgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSBvdmVycmlkZTsKLSAgdm9pZCBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIG92ZXJyaWRlOworICB2b2lkIE9uRHJhd1dpZGdldChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgb3ZlcnJpZGU7CiAKICAgaW50MzJfdCBDb3VudEl0ZW1zKGNvbnN0IENGV0xfV2lkZ2V0KiBwV2lkZ2V0KSBjb25zdDsKICAgQ0ZXTF9MaXN0SXRlbSogR2V0SXRlbShjb25zdCBDRldMX1dpZGdldCogcFdpZGdldCwgaW50MzJfdCBuSW5kZXgpIGNvbnN0OwogICBpbnQzMl90IEdldEl0ZW1JbmRleChDRldMX1dpZGdldCogcFdpZGdldCwgQ0ZXTF9MaXN0SXRlbSogcEl0ZW0pOwogCi0gIENGV0xfTGlzdEl0ZW0qIEFkZFN0cmluZyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQWRkKTsKKyAgQ0ZXTF9MaXN0SXRlbSogQWRkU3RyaW5nKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c0FkZCk7CiAgIHZvaWQgUmVtb3ZlQXQoaW50MzJfdCBpSW5kZXgpOwogICB2b2lkIERlbGV0ZVN0cmluZyhDRldMX0xpc3RJdGVtKiBwSXRlbSk7CiAgIHZvaWQgRGVsZXRlQWxsKCk7CkBAIC02Myw4ICs2Myw4IEBACiAgIGludDMyX3QgR2V0U2VsSW5kZXgoaW50MzJfdCBuSW5kZXgpOwogICB2b2lkIFNldFNlbEl0ZW0oQ0ZXTF9MaXN0SXRlbSogaEl0ZW0sIGJvb2wgYlNlbGVjdCk7CiAKLSAgRlhfRkxPQVQgR2V0SXRlbUhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fZkl0ZW1IZWlnaHQ7IH0KLSAgRlhfRkxPQVQgQ2FsY0l0ZW1IZWlnaHQoKTsKKyAgZmxvYXQgR2V0SXRlbUhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1fZkl0ZW1IZWlnaHQ7IH0KKyAgZmxvYXQgQ2FsY0l0ZW1IZWlnaHQoKTsKIAogIHByb3RlY3RlZDoKICAgQ0ZXTF9MaXN0SXRlbSogR2V0TGlzdEl0ZW0oQ0ZXTF9MaXN0SXRlbSogaEl0ZW0sIHVpbnQzMl90IGR3S2V5Q29kZSk7CkBAIC04NSwyNyArODUsMjcgQEAKICAgdm9pZCBTZWxlY3RBbGwoKTsKICAgQ0ZXTF9MaXN0SXRlbSogR2V0Rm9jdXNlZEl0ZW0oKTsKICAgdm9pZCBTZXRGb2N1c0l0ZW0oQ0ZXTF9MaXN0SXRlbSogaEl0ZW0pOwotICB2b2lkIERyYXdCa2dyb3VuZChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgdm9pZCBEcmF3Qmtncm91bmQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7Ci0gIHZvaWQgRHJhd0l0ZW1zKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAorICB2b2lkIERyYXdJdGVtcyhDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLAogICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKLSAgdm9pZCBEcmF3SXRlbShDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgdm9pZCBEcmF3SXRlbShDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsCiAgICAgICAgICAgICAgICAgQ0ZXTF9MaXN0SXRlbSogaEl0ZW0sCiAgICAgICAgICAgICAgICAgaW50MzJfdCBJbmRleCwKICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0SXRlbSwKICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKLSAgdm9pZCBEcmF3U3RhdGljKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLCBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSk7CisgIHZvaWQgRHJhd1N0YXRpYyhDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lKTsKICAgQ0ZYX1NpemVGIENhbGNTaXplKGJvb2wgYkF1dG9TaXplKTsKICAgdm9pZCBVcGRhdGVJdGVtU2l6ZShDRldMX0xpc3RJdGVtKiBoSXRlbSwKICAgICAgICAgICAgICAgICAgICAgICBDRlhfU2l6ZUYmIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQXV0b1NpemUpIGNvbnN0OwotICBGWF9GTE9BVCBHZXRNYXhUZXh0V2lkdGgoKTsKLSAgRlhfRkxPQVQgR2V0U2Nyb2xsV2lkdGgoKTsKKyAgZmxvYXQgR2V0TWF4VGV4dFdpZHRoKCk7CisgIGZsb2F0IEdldFNjcm9sbFdpZHRoKCk7CiAKICAgdm9pZCBPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UqIHBNc2csIGJvb2wgYlNldCk7CiAgIHZvaWQgT25MQnV0dG9uRG93bihDRldMX01lc3NhZ2VNb3VzZSogcE1zZyk7CkBAIC0xMTUsMTggKzExNSwxOCBAQAogICB2b2lkIE9uVksoQ0ZXTF9MaXN0SXRlbSogaEl0ZW0sIGJvb2wgYlNoaWZ0LCBib29sIGJDdHJsKTsKICAgYm9vbCBPblNjcm9sbChDRldMX1Njcm9sbEJhciogcFNjcm9sbEJhciwKICAgICAgICAgICAgICAgICBDRldMX0V2ZW50U2Nyb2xsOjpDb2RlIGR3Q29kZSwKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUG9zKTsKKyAgICAgICAgICAgICAgICBmbG9hdCBmUG9zKTsKIAogICBDRlhfUmVjdEYgbV9ydENsaWVudDsKICAgQ0ZYX1JlY3RGIG1fcnRTdGF0aWM7CiAgIENGWF9SZWN0RiBtX3J0Q29uZW50OwogICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZXTF9TY3JvbGxCYXI+IG1fcEhvcnpTY3JvbGxCYXI7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDRldMX1Njcm9sbEJhcj4gbV9wVmVydFNjcm9sbEJhcjsKLSAgdWludDMyX3QgbV9kd1RUT1N0eWxlczsKLSAgaW50MzJfdCBtX2lUVE9BbGlnbnM7CisgIEZERV9UZXh0U3R5bGUgbV9kd1RUT1N0eWxlczsKKyAgRkRFX1RleHRBbGlnbm1lbnQgbV9pVFRPQWxpZ25zOwogICBDRldMX0xpc3RJdGVtKiBtX2hBbmNob3I7Ci0gIEZYX0ZMT0FUIG1fZkl0ZW1IZWlnaHQ7Ci0gIEZYX0ZMT0FUIG1fZlNjb3JsbEJhcldpZHRoOworICBmbG9hdCBtX2ZJdGVtSGVpZ2h0OworICBmbG9hdCBtX2ZTY29ybGxCYXJXaWR0aDsKICAgYm9vbCBtX2JMQnV0dG9uRG93bjsKICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBtX3BTY3JvbGxCYXJUUDsKICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGV0xfTGlzdEl0ZW0+PiBtX0l0ZW1BcnJheTsKZGlmZiAtLWdpdCBhL3hmYS9md2wvY2Z3bF9saXN0aXRlbS5jcHAgYi94ZmEvZndsL2Nmd2xfbGlzdGl0ZW0uY3BwCmluZGV4IGE4ZWE4YTYuLmY4YTdiNzUgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvY2Z3bF9saXN0aXRlbS5jcHAKKysrIGIveGZhL2Z3bC9jZndsX2xpc3RpdGVtLmNwcApAQCAtNiw3ICs2LDcgQEAKIAogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9saXN0aXRlbS5oIgogCi1DRldMX0xpc3RJdGVtOjpDRldMX0xpc3RJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB0ZXh0KQorQ0ZXTF9MaXN0SXRlbTo6Q0ZXTF9MaXN0SXRlbShjb25zdCBXaWRlU3RyaW5nJiB0ZXh0KQogICAgIDogbV9kd1N0YXRlcygwKSwgbV93c1RleHQodGV4dCkgewogICBtX3J0SXRlbS5SZXNldCgpOwogfQpkaWZmIC0tZ2l0IGEveGZhL2Z3bC9jZndsX2xpc3RpdGVtLmggYi94ZmEvZndsL2Nmd2xfbGlzdGl0ZW0uaAppbmRleCBhYWM2N2ZjLi42MmMzYTk4IDEwMDY0NAotLS0gYS94ZmEvZndsL2Nmd2xfbGlzdGl0ZW0uaAorKysgYi94ZmEvZndsL2Nmd2xfbGlzdGl0ZW0uaApAQCAtMTIsNyArMTIsNyBAQAogCiBjbGFzcyBDRldMX0xpc3RJdGVtIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IENGV0xfTGlzdEl0ZW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHRleHQpOworICBleHBsaWNpdCBDRldMX0xpc3RJdGVtKGNvbnN0IFdpZGVTdHJpbmcmIHRleHQpOwogICB+Q0ZXTF9MaXN0SXRlbSgpOwogCiAgIENGWF9SZWN0RiBHZXRSZWN0KCkgY29uc3QgeyByZXR1cm4gbV9ydEl0ZW07IH0KQEAgLTIxLDEyICsyMSwxMiBAQAogICB1aW50MzJfdCBHZXRTdGF0ZXMoKSBjb25zdCB7IHJldHVybiBtX2R3U3RhdGVzOyB9CiAgIHZvaWQgU2V0U3RhdGVzKHVpbnQzMl90IGR3U3RhdGVzKSB7IG1fZHdTdGF0ZXMgPSBkd1N0YXRlczsgfQogCi0gIENGWF9XaWRlU3RyaW5nIEdldFRleHQoKSBjb25zdCB7IHJldHVybiBtX3dzVGV4dDsgfQorICBXaWRlU3RyaW5nIEdldFRleHQoKSBjb25zdCB7IHJldHVybiBtX3dzVGV4dDsgfQogCiAgcHJpdmF0ZToKICAgQ0ZYX1JlY3RGIG1fcnRJdGVtOwogICB1aW50MzJfdCBtX2R3U3RhdGVzOwotICBDRlhfV2lkZVN0cmluZyBtX3dzVGV4dDsKKyAgV2lkZVN0cmluZyBtX3dzVGV4dDsKIH07CiAKICNlbmRpZiAgLy8gWEZBX0ZXTF9DRldMX0xJU1RJVEVNX0hfCmRpZmYgLS1naXQgYS94ZmEvZndsL2Nmd2xfbWVzc2FnZS5oIGIveGZhL2Z3bC9jZndsX21lc3NhZ2UuaAppbmRleCA3NzhlMWUyLi45OWNmMDFiIDEwMDY0NAotLS0gYS94ZmEvZndsL2Nmd2xfbWVzc2FnZS5oCisrKyBiL3hmYS9md2wvY2Z3bF9tZXNzYWdlLmgKQEAgLTksNyArOSw2IEBACiAKICNpbmNsdWRlIDxtZW1vcnk+CiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgogCmRpZmYgLS1naXQgYS94ZmEvZndsL2Nmd2xfbW9udGhjYWxlbmRhci5jcHAgYi94ZmEvZndsL2Nmd2xfbW9udGhjYWxlbmRhci5jcHAKaW5kZXggNjg4MmQ3MC4uMDhlZDgzZiAxMDA2NDQKLS0tIGEveGZhL2Z3bC9jZndsX21vbnRoY2FsZW5kYXIuY3BwCisrKyBiL3hmYS9md2wvY2Z3bF9tb250aGNhbGVuZGFyLmNwcApAQCAtMTIsNyArMTIsNyBAQAogCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL3R0by9mZGVfdGV4dG91dC5oIgorI2luY2x1ZGUgInhmYS9mZGUvY2ZkZV90ZXh0b3V0LmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2RhdGV0aW1lcGlja2VyLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2Zvcm1wcm94eS5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9tZXNzYWdlbW91c2UuaCIKQEAgLTMyLDkgKzMyLDkgQEAKIAogbmFtZXNwYWNlIHsKIAotQ0ZYX1dpZGVTdHJpbmcgR2V0Q2FwYWNpdHlGb3JEYXkoSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRldMX1RoZW1lUGFydCYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGF5KSB7CitXaWRlU3RyaW5nIEdldENhcGFjaXR5Rm9yRGF5KElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRldMX1RoZW1lUGFydCYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkYXkpIHsKICAgQVNTRVJUKGRheSA8IDcpOwogCiAgIGlmIChkYXkgPT0gMCkKQEAgLTUyLDkgKzUyLDkgQEAKICAgcmV0dXJuIEwiU2F0IjsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgR2V0Q2FwYWNpdHlGb3JNb250aChJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZXTF9UaGVtZVBhcnQmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbW9udGgpIHsKK1dpZGVTdHJpbmcgR2V0Q2FwYWNpdHlGb3JNb250aChJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRldMX1RoZW1lUGFydCYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1vbnRoKSB7CiAgIEFTU0VSVChtb250aCA8IDEyKTsKIAogICBpZiAobW9udGggPT0gMCkKQEAgLTkwLDcgKzkwLDYgQEAKICAgICBDRldMX1dpZGdldCogcE91dGVyKQogICAgIDogQ0ZXTF9XaWRnZXQoYXBwLCBzdGQ6Om1vdmUocHJvcGVydGllcyksIHBPdXRlciksCiAgICAgICBtX2JJbml0aWFsaXplZChmYWxzZSksCi0gICAgICBtX3BEYXRlVGltZShuZXcgQ0ZYX0RhdGVUaW1lKSwKICAgICAgIG1faUN1clllYXIoMjAxMSksCiAgICAgICBtX2lDdXJNb250aCgxKSwKICAgICAgIG1faVllYXIoMjAxMSksCkBAIC0xNDcsOCArMTQ2LDggQEAKICAgTGF5b3V0KCk7CiB9CiAKLXZvaWQgQ0ZXTF9Nb250aENhbGVuZGFyOjpEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewordm9pZCBDRldMX01vbnRoQ2FsZW5kYXI6OkRyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7CiAgIGlmICghcEdyYXBoaWNzKQogICAgIHJldHVybjsKICAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKQpAQCAtMTU2LDIwICsxNTUsMjAgQEAKIAogICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7CiAgIGlmIChIYXNCb3JkZXIoKSkKLSAgICBEcmF3Qm9yZGVyKHBHcmFwaGljcywgQ0ZXTF9QYXJ0OjpCb3JkZXIsIHBUaGVtZSwgcE1hdHJpeCk7CisgICAgRHJhd0JvcmRlcihwR3JhcGhpY3MsIENGV0xfUGFydDo6Qm9yZGVyLCBwVGhlbWUsIG1hdHJpeCk7CiAKLSAgRHJhd0JhY2tncm91bmQocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOwotICBEcmF3SGVhZEJLKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsKLSAgRHJhd0xCdXR0b24ocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOwotICBEcmF3UkJ1dHRvbihwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7Ci0gIERyYXdTZXBlcmF0b3IocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOwotICBEcmF3RGF0ZXNJbkJLKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsKLSAgRHJhd0RhdGVzSW5DaXJjbGUocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOwotICBEcmF3Q2FwdGlvbihwR3JhcGhpY3MsIHBUaGVtZSwgcE1hdHJpeCk7Ci0gIERyYXdXZWVrKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsKLSAgRHJhd0RhdGVzSW4ocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOwotICBEcmF3RGF0ZXNPdXQocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOwotICBEcmF3VG9kYXkocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOworICBEcmF3QmFja2dyb3VuZChwR3JhcGhpY3MsIHBUaGVtZSwgJm1hdHJpeCk7CisgIERyYXdIZWFkQksocEdyYXBoaWNzLCBwVGhlbWUsICZtYXRyaXgpOworICBEcmF3TEJ1dHRvbihwR3JhcGhpY3MsIHBUaGVtZSwgJm1hdHJpeCk7CisgIERyYXdSQnV0dG9uKHBHcmFwaGljcywgcFRoZW1lLCAmbWF0cml4KTsKKyAgRHJhd1NlcGVyYXRvcihwR3JhcGhpY3MsIHBUaGVtZSwgJm1hdHJpeCk7CisgIERyYXdEYXRlc0luQksocEdyYXBoaWNzLCBwVGhlbWUsICZtYXRyaXgpOworICBEcmF3RGF0ZXNJbkNpcmNsZShwR3JhcGhpY3MsIHBUaGVtZSwgJm1hdHJpeCk7CisgIERyYXdDYXB0aW9uKHBHcmFwaGljcywgcFRoZW1lLCAmbWF0cml4KTsKKyAgRHJhd1dlZWsocEdyYXBoaWNzLCBwVGhlbWUsICZtYXRyaXgpOworICBEcmF3RGF0ZXNJbihwR3JhcGhpY3MsIHBUaGVtZSwgJm1hdHJpeCk7CisgIERyYXdEYXRlc091dChwR3JhcGhpY3MsIHBUaGVtZSwgJm1hdHJpeCk7CisgIERyYXdUb2RheShwR3JhcGhpY3MsIHBUaGVtZSwgJm1hdHJpeCk7CiB9CiAKIHZvaWQgQ0ZXTF9Nb250aENhbGVuZGFyOjpTZXRTZWxlY3QoaW50MzJfdCBpWWVhciwKQEAgLTE3OSw3ICsxNzgsNyBAQAogICBBZGRTZWxEYXkoaURheSk7CiB9CiAKLXZvaWQgQ0ZXTF9Nb250aENhbGVuZGFyOjpEcmF3QmFja2dyb3VuZChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFyOjpEcmF3QmFja2dyb3VuZChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewogICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbXM7CkBAIC0xOTMsNyArMTkyLDcgQEAKICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW1zKTsKIH0KIAotdm9pZCBDRldMX01vbnRoQ2FsZW5kYXI6OkRyYXdIZWFkQksoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCit2b2lkIENGV0xfTW9udGhDYWxlbmRhcjo6RHJhd0hlYWRCSyhDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW1zOwpAQCAtMjA3LDcgKzIwNiw3IEBACiAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtcyk7CiB9CiAKLXZvaWQgQ0ZXTF9Nb250aENhbGVuZGFyOjpEcmF3TEJ1dHRvbihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFyOjpEcmF3TEJ1dHRvbihDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewogICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbXM7CkBAIC0yMjEsNyArMjIwLDcgQEAKICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW1zKTsKIH0KIAotdm9pZCBDRldMX01vbnRoQ2FsZW5kYXI6OkRyYXdSQnV0dG9uKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAordm9pZCBDRldMX01vbnRoQ2FsZW5kYXI6OkRyYXdSQnV0dG9uKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7CiAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtczsKQEAgLTIzNSw3ICsyMzQsNyBAQAogICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbXMpOwogfQogCi12b2lkIENGV0xfTW9udGhDYWxlbmRhcjo6RHJhd0NhcHRpb24oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCit2b2lkIENGV0xfTW9udGhDYWxlbmRhcjo6RHJhd0NhcHRpb24oQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKICAgQ0ZXTF9UaGVtZVRleHQgdGV4dFBhcmFtOwpAQCAtMjQ4LDE0ICsyNDcsMTQgQEAKICAgICAgIENhbGNUZXh0U2l6ZSh0ZXh0UGFyYW0ubV93c1RleHQsIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsIGZhbHNlKTsKICAgQ2FsY0hlYWRTaXplKCk7CiAgIHRleHRQYXJhbS5tX3J0UGFydCA9IG1fcnRIZWFkVGV4dDsKLSAgdGV4dFBhcmFtLm1fZHdUVE9TdHlsZXMgPSBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsKLSAgdGV4dFBhcmFtLm1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXI7CisgIHRleHRQYXJhbS5tX2R3VFRPU3R5bGVzLnNpbmdsZV9saW5lXyA9IHRydWU7CisgIHRleHRQYXJhbS5tX2lUVE9BbGlnbiA9IEZERV9UZXh0QWxpZ25tZW50OjprQ2VudGVyOwogICBpZiAocE1hdHJpeCkKICAgICB0ZXh0UGFyYW0ubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsKICAgcFRoZW1lLT5EcmF3VGV4dCgmdGV4dFBhcmFtKTsKIH0KIAotdm9pZCBDRldMX01vbnRoQ2FsZW5kYXI6OkRyYXdTZXBlcmF0b3IoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCit2b2lkIENGV0xfTW9udGhDYWxlbmRhcjo6RHJhd1NlcGVyYXRvcihDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW1zOwpAQCAtMjY5LDcgKzI2OCw3IEBACiAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtcyk7CiB9CiAKLXZvaWQgQ0ZXTF9Nb250aENhbGVuZGFyOjpEcmF3RGF0ZXNJbkJLKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAordm9pZCBDRldMX01vbnRoQ2FsZW5kYXI6OkRyYXdEYXRlc0luQksoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7CiAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtczsKQEAgLTI5OSw3ICsyOTgsNyBAQAogICB9CiB9CiAKLXZvaWQgQ0ZXTF9Nb250aENhbGVuZGFyOjpEcmF3V2VlayhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFyOjpEcmF3V2VlayhDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewogICBDRldMX1RoZW1lVGV4dCBwYXJhbXM7CkBAIC0zMDcsNyArMzA2LDkgQEAKICAgcGFyYW1zLm1faVBhcnQgPSBDRldMX1BhcnQ6OldlZWs7CiAgIHBhcmFtcy5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsKICAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBDRldMX1BhcnRTdGF0ZV9Ob3JtYWw7Ci0gIHBhcmFtcy5tX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyOworICBwYXJhbXMubV9pVFRPQWxpZ24gPSBGREVfVGV4dEFsaWdubWVudDo6a0NlbnRlcjsKKyAgcGFyYW1zLm1fZHdUVE9TdHlsZXMuc2luZ2xlX2xpbmVfID0gdHJ1ZTsKKwogICBDRlhfUmVjdEYgcnREYXlPZldlZWs7CiAgIGlmIChwTWF0cml4KQogICAgIHBhcmFtcy5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgpOwpAQCAtMzE5LDEyICszMjAsMTEgQEAKIAogICAgIHBhcmFtcy5tX3J0UGFydCA9IHJ0RGF5T2ZXZWVrOwogICAgIHBhcmFtcy5tX3dzVGV4dCA9IEdldENhcGFjaXR5Rm9yRGF5KHBUaGVtZSwgcGFyYW1zLCBpKTsKLSAgICBwYXJhbXMubV9kd1RUT1N0eWxlcyA9IEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lOwogICAgIHBUaGVtZS0+RHJhd1RleHQoJnBhcmFtcyk7CiAgIH0KIH0KIAotdm9pZCBDRldMX01vbnRoQ2FsZW5kYXI6OkRyYXdUb2RheShDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFyOjpEcmF3VG9kYXkoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewogICBDRldMX1RoZW1lVGV4dCBwYXJhbXM7CkBAIC0zMzIsMjAgKzMzMiwyMSBAQAogICBwYXJhbXMubV9pUGFydCA9IENGV0xfUGFydDo6VG9kYXk7CiAgIHBhcmFtcy5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsKICAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBDRldMX1BhcnRTdGF0ZV9Ob3JtYWw7Ci0gIHBhcmFtcy5tX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyTGVmdDsKKyAgcGFyYW1zLm1faVRUT0FsaWduID0gRkRFX1RleHRBbGlnbm1lbnQ6OmtDZW50ZXJMZWZ0OwogICBwYXJhbXMubV93c1RleHQgPSBMIlRvZGF5IiArIEdldFRvZGF5VGV4dChtX2lZZWFyLCBtX2lNb250aCwgbV9pRGF5KTsKIAogICBtX3N6VG9kYXkgPQogICAgICAgQ2FsY1RleHRTaXplKHBhcmFtcy5tX3dzVGV4dCwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwgZmFsc2UpOwogICBDYWxjVG9kYXlTaXplKCk7CiAgIHBhcmFtcy5tX3J0UGFydCA9IG1fcnRUb2RheTsKLSAgcGFyYW1zLm1fZHdUVE9TdHlsZXMgPSBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsKKyAgcGFyYW1zLm1fZHdUVE9TdHlsZXMuc2luZ2xlX2xpbmVfID0gdHJ1ZTsKKwogICBpZiAocE1hdHJpeCkKICAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsKICAgcFRoZW1lLT5EcmF3VGV4dCgmcGFyYW1zKTsKIH0KIAotdm9pZCBDRldMX01vbnRoQ2FsZW5kYXI6OkRyYXdEYXRlc0luKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAordm9pZCBDRldMX01vbnRoQ2FsZW5kYXI6OkRyYXdEYXRlc0luKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7CiAgIENGV0xfVGhlbWVUZXh0IHBhcmFtczsKQEAgLTM1Myw3ICszNTQsNyBAQAogICBwYXJhbXMubV9pUGFydCA9IENGV0xfUGFydDo6RGF0ZXNJbjsKICAgcGFyYW1zLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOwogICBwYXJhbXMubV9kd1N0YXRlcyA9IENGV0xfUGFydFN0YXRlX05vcm1hbDsKLSAgcGFyYW1zLm1faVRUT0FsaWduID0gRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXI7CisgIHBhcmFtcy5tX2lUVE9BbGlnbiA9IEZERV9UZXh0QWxpZ25tZW50OjprQ2VudGVyOwogICBpZiAocE1hdHJpeCkKICAgICBwYXJhbXMubV9tYXRyaXguQ29uY2F0KCpwTWF0cml4KTsKIApAQCAtMzY1LDEyICszNjYsMTMgQEAKICAgICBwYXJhbXMubV9kd1N0YXRlcyA9IHBEYXRhSW5mby0+ZHdTdGF0ZXM7CiAgICAgaWYgKGogKyAxID09IG1faUhvdmVyZWQpCiAgICAgICBwYXJhbXMubV9kd1N0YXRlcyB8PSBDRldMX1BhcnRTdGF0ZV9Ib3ZlcmVkOwotICAgIHBhcmFtcy5tX2R3VFRPU3R5bGVzID0gRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmU7CisKKyAgICBwYXJhbXMubV9kd1RUT1N0eWxlcy5zaW5nbGVfbGluZV8gPSB0cnVlOwogICAgIHBUaGVtZS0+RHJhd1RleHQoJnBhcmFtcyk7CiAgIH0KIH0KIAotdm9pZCBDRldMX01vbnRoQ2FsZW5kYXI6OkRyYXdEYXRlc091dChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFyOjpEcmF3RGF0ZXNPdXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewogICBDRldMX1RoZW1lVGV4dCBwYXJhbXM7CkBAIC0zNzgsMTMgKzM4MCwxMyBAQAogICBwYXJhbXMubV9pUGFydCA9IENGV0xfUGFydDo6RGF0ZXNPdXQ7CiAgIHBhcmFtcy5tX3BHcmFwaGljcyA9IHBHcmFwaGljczsKICAgcGFyYW1zLm1fZHdTdGF0ZXMgPSBDRldMX1BhcnRTdGF0ZV9Ob3JtYWw7Ci0gIHBhcmFtcy5tX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfQ2VudGVyOworICBwYXJhbXMubV9pVFRPQWxpZ24gPSBGREVfVGV4dEFsaWdubWVudDo6a0NlbnRlcjsKICAgaWYgKHBNYXRyaXgpCiAgICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7CiAgIHBUaGVtZS0+RHJhd1RleHQoJnBhcmFtcyk7CiB9CiAKLXZvaWQgQ0ZXTF9Nb250aENhbGVuZGFyOjpEcmF3RGF0ZXNJbkNpcmNsZShDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKK3ZvaWQgQ0ZXTF9Nb250aENhbGVuZGFyOjpEcmF3RGF0ZXNJbkNpcmNsZShDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewogICBpZiAobV9pTW9udGggIT0gbV9pQ3VyTW9udGggfHwgbV9pWWVhciAhPSBtX2lDdXJZZWFyKQpAQCAtNDE1LDggKzQxNyw4IEBACiAgIENGV0xfVGhlbWVQYXJ0IHBhcmFtczsKICAgcGFyYW1zLm1fcFdpZGdldCA9IHRoaXM7CiAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lID0gbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcjsKLSAgRlhfRkxPQVQgZk1heFdlZWtXID0gMC4wZjsKLSAgRlhfRkxPQVQgZk1heFdlZWtIID0gMC4wZjsKKyAgZmxvYXQgZk1heFdlZWtXID0gMC4wZjsKKyAgZmxvYXQgZk1heFdlZWtIID0gMC4wZjsKIAogICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgNzsgKytpKSB7CiAgICAgQ0ZYX1NpemVGIHN6ID0gQ2FsY1RleHRTaXplKEdldENhcGFjaXR5Rm9yRGF5KHBUaGVtZSwgcGFyYW1zLCBpKSwKQEAgLTQyNSwyNSArNDI3LDI0IEBACiAgICAgZk1heFdlZWtIID0gKGZNYXhXZWVrSCA+PSBzei5oZWlnaHQpID8gZk1heFdlZWtIIDogc3ouaGVpZ2h0OwogICB9CiAKLSAgRlhfRkxPQVQgZkRheU1heFcgPSAwLjBmOwotICBGWF9GTE9BVCBmRGF5TWF4SCA9IDAuMGY7CisgIGZsb2F0IGZEYXlNYXhXID0gMC4wZjsKKyAgZmxvYXQgZkRheU1heEggPSAwLjBmOwogICBmb3IgKGludCBkYXkgPSAxMDsgZGF5IDw9IDMxOyBkYXkrKykgewotICAgIENGWF9XaWRlU3RyaW5nIHdzRGF5OwotICAgIHdzRGF5LkZvcm1hdChMIiVkIiwgZGF5KTsKLSAgICBDRlhfU2l6ZUYgc3ogPSBDYWxjVGV4dFNpemUod3NEYXksIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIsIGZhbHNlKTsKKyAgICBDRlhfU2l6ZUYgc3ogPSBDYWxjVGV4dFNpemUoV2lkZVN0cmluZzo6Rm9ybWF0KEwiJWQiLCBkYXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCBmYWxzZSk7CiAgICAgZkRheU1heFcgPSAoZkRheU1heFcgPj0gc3oud2lkdGgpID8gZkRheU1heFcgOiBzei53aWR0aDsKICAgICBmRGF5TWF4SCA9IChmRGF5TWF4SCA+PSBzei5oZWlnaHQpID8gZkRheU1heEggOiBzei5oZWlnaHQ7CiAgIH0KLSAgbV9zekNlbGwud2lkdGggPSBGWF9GTE9BVCgoZk1heFdlZWtXID49IGZEYXlNYXhXKSA/IChpbnQpKGZNYXhXZWVrVyArIDAuNSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChpbnQpKGZEYXlNYXhXICsgMC41KSk7CisgIG1fc3pDZWxsLndpZHRoID0gZmxvYXQoKGZNYXhXZWVrVyA+PSBmRGF5TWF4VykgPyAoaW50KShmTWF4V2Vla1cgKyAwLjUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoaW50KShmRGF5TWF4VyArIDAuNSkpOwogICBtX3N6Q2VsbC5oZWlnaHQgPSAoZk1heFdlZWtIID49IGZEYXlNYXhIKSA/IGZNYXhXZWVrSCA6IGZEYXlNYXhIOwogCiAgIENGWF9TaXplRiBmczsKICAgZnMud2lkdGggPSBtX3N6Q2VsbC53aWR0aCAqIE1PTlRIQ0FMX0NPTFVNTlMgKwogICAgICAgICAgICAgIE1PTlRIQ0FMX0hNQVJHSU4gKiBNT05USENBTF9DT0xVTU5TICogMiArCiAgICAgICAgICAgICAgTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOICogMjsKLSAgRlhfRkxPQVQgZk1vbnRoTWF4VyA9IDAuMGY7Ci0gIEZYX0ZMT0FUIGZNb250aE1heEggPSAwLjBmOworICBmbG9hdCBmTW9udGhNYXhXID0gMC4wZjsKKyAgZmxvYXQgZk1vbnRoTWF4SCA9IDAuMGY7CiAKICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IDEyOyArK2kpIHsKICAgICBDRlhfU2l6ZUYgc3ogPSBDYWxjVGV4dFNpemUoR2V0Q2FwYWNpdHlGb3JNb250aChwVGhlbWUsIHBhcmFtcywgaSksCkBAIC00NjAsNyArNDYxLDcgQEAKICAgICAgIG1fc3pIZWFkLndpZHRoICsgTU9OVEhDQUxfSEVBREVSX0JUTl9ITUFSR0lOICogMiArIG1fc3pDZWxsLndpZHRoICogMjsKICAgZnMud2lkdGggPSBzdGQ6Om1heChmcy53aWR0aCwgZk1vbnRoTWF4Vyk7CiAKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NUb2RheSA9IEdldFRvZGF5VGV4dChtX2lZZWFyLCBtX2lNb250aCwgbV9pRGF5KTsKKyAgV2lkZVN0cmluZyB3c1RvZGF5ID0gR2V0VG9kYXlUZXh0KG1faVllYXIsIG1faU1vbnRoLCBtX2lEYXkpOwogICBtX3dzVG9kYXkgPSBMIlRvZGF5IiArIHdzVG9kYXk7CiAgIG1fc3pUb2RheSA9IENhbGNUZXh0U2l6ZSh3c1RvZGF5LCBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCBmYWxzZSk7CiAgIG1fc3pUb2RheS5oZWlnaHQgPSAobV9zelRvZGF5LmhlaWdodCA+PSBtX3N6Q2VsbC5oZWlnaHQpID8gbV9zelRvZGF5LmhlaWdodApAQCAtNDcyLDggKzQ3Myw4IEBACiB9CiAKIHZvaWQgQ0ZXTF9Nb250aENhbGVuZGFyOjpDYWxjSGVhZFNpemUoKSB7Ci0gIEZYX0ZMT0FUIGZIZWFkSE1hcmdpbiA9IChtX3J0Q2xpZW50LndpZHRoIC0gbV9zekhlYWQud2lkdGgpIC8gMjsKLSAgRlhfRkxPQVQgZkhlYWRWTWFyZ2luID0gKG1fc3pDZWxsLndpZHRoIC0gbV9zekhlYWQuaGVpZ2h0KSAvIDI7CisgIGZsb2F0IGZIZWFkSE1hcmdpbiA9IChtX3J0Q2xpZW50LndpZHRoIC0gbV9zekhlYWQud2lkdGgpIC8gMjsKKyAgZmxvYXQgZkhlYWRWTWFyZ2luID0gKG1fc3pDZWxsLndpZHRoIC0gbV9zekhlYWQuaGVpZ2h0KSAvIDI7CiAgIG1fcnRIZWFkVGV4dCA9IENGWF9SZWN0RihtX3J0Q2xpZW50LmxlZnQgKyBmSGVhZEhNYXJnaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LnRvcCArIE1PTlRIQ0FMX0hFQURFUl9CVE5fVk1BUkdJTiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9OVEhDQUxfVk1BUkdJTiArIGZIZWFkVk1hcmdpbiwKQEAgLTUyNyw4ICs1MjgsOCBAQAogdm9pZCBDRldMX01vbnRoQ2FsZW5kYXI6OkNhbERhdGVJdGVtKCkgewogICBib29sIGJOZXdXZWVrID0gZmFsc2U7CiAgIGludDMyX3QgaVdlZWtPZk1vbnRoID0gMDsKLSAgRlhfRkxPQVQgZkxlZnQgPSBtX3J0RGF0ZXMubGVmdDsKLSAgRlhfRkxPQVQgZlRvcCA9IG1fcnREYXRlcy50b3A7CisgIGZsb2F0IGZMZWZ0ID0gbV9ydERhdGVzLmxlZnQ7CisgIGZsb2F0IGZUb3AgPSBtX3J0RGF0ZXMudG9wOwogICBmb3IgKGNvbnN0IGF1dG8mIHBEYXRlSW5mbyA6IG1fYXJyRGF0ZXMpIHsKICAgICBpZiAoYk5ld1dlZWspIHsKICAgICAgIGlXZWVrT2ZNb250aCsrOwpAQCAtNTcwLDE1ICs1NzEsMTMgQEAKIH0KIAogdm9pZCBDRldMX01vbnRoQ2FsZW5kYXI6OlJlc2V0RGF0ZUl0ZW0oKSB7Ci0gIG1fcERhdGVUaW1lLT5TZXQobV9pQ3VyWWVhciwgbV9pQ3VyTW9udGgsIDEpOwogICBpbnQzMl90IGlEYXlzID0gRlhfRGF5c0luTW9udGgobV9pQ3VyWWVhciwgbV9pQ3VyTW9udGgpOwotICBpbnQzMl90IGlEYXlPZldlZWsgPSBtX3BEYXRlVGltZS0+R2V0RGF5T2ZXZWVrKCk7CisgIGludDMyX3QgaURheU9mV2VlayA9CisgICAgICBDRlhfRGF0ZVRpbWUobV9pQ3VyWWVhciwgbV9pQ3VyTW9udGgsIDEsIDAsIDAsIDAsIDApLkdldERheU9mV2VlaygpOwogICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpRGF5czsgaSsrKSB7CiAgICAgaWYgKGlEYXlPZldlZWsgPj0gNykKICAgICAgIGlEYXlPZldlZWsgPSAwOwogCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXk7Ci0gICAgd3NEYXkuRm9ybWF0KEwiJWQiLCBpICsgMSk7CiAgICAgdWludDMyX3QgZHdTdGF0ZXMgPSAwOwogICAgIGlmIChtX2lZZWFyID09IG1faUN1clllYXIgJiYgbV9pTW9udGggPT0gbV9pQ3VyTW9udGggJiYgbV9pRGF5ID09IChpICsgMSkpCiAgICAgICBkd1N0YXRlcyB8PSBGV0xfSVRFTVNUQVRFX01DRF9GbGFnOwpAQCAtNTg2LDggKzU4NSw4IEBACiAgICAgICBkd1N0YXRlcyB8PSBGV0xfSVRFTVNUQVRFX01DRF9TZWxlY3RlZDsKIAogICAgIENGWF9SZWN0RiBydERhdGU7Ci0gICAgbV9hcnJEYXRlcy5wdXNoX2JhY2socGRmaXVtOjpNYWtlVW5pcXVlPERBVEVJTkZPPihpICsgMSwgaURheU9mV2VlaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3U3RhdGVzLCBydERhdGUsIHdzRGF5KSk7CisgICAgbV9hcnJEYXRlcy5wdXNoX2JhY2socGRmaXVtOjpNYWtlVW5pcXVlPERBVEVJTkZPPigKKyAgICAgICAgaSArIDEsIGlEYXlPZldlZWssIGR3U3RhdGVzLCBydERhdGUsIFdpZGVTdHJpbmc6OkZvcm1hdChMIiVkIiwgaSArIDEpKSk7CiAgICAgaURheU9mV2VlaysrOwogICB9CiB9CkBAIC02NzIsMjMgKzY3MSwxOSBAQAogICAgIEFkZFNlbERheShtX2lEYXkpOwogfQogCi1DRlhfV2lkZVN0cmluZyBDRldMX01vbnRoQ2FsZW5kYXI6OkdldEhlYWRUZXh0KGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoKSB7CitXaWRlU3RyaW5nIENGV0xfTW9udGhDYWxlbmRhcjo6R2V0SGVhZFRleHQoaW50MzJfdCBpWWVhciwgaW50MzJfdCBpTW9udGgpIHsKICAgQVNTRVJUKGlNb250aCA+IDAgJiYgaU1vbnRoIDwgMTMpOwotICBzdGF0aWMgY29uc3QgRlhfV0NIQVIqIGNvbnN0IHBNb250aFtdID0gewotICAgICAgTCJKYW51YXJ5IiwgICBMIkZlYnJ1YXJ5IiwgTCJNYXJjaCIsICAgIEwiQXByaWwiLAotICAgICAgTCJNYXkiLCAgICAgICBMIkp1bmUiLCAgICAgTCJKdWx5IiwgICAgIEwiQXVndXN0IiwKLSAgICAgIEwiU2VwdGVtYmVyIiwgTCJPY3RvYmVyIiwgIEwiTm92ZW1iZXIiLCBMIkRlY2VtYmVyIn07Ci0gIENGWF9XaWRlU3RyaW5nIHdzSGVhZDsKLSAgd3NIZWFkLkZvcm1hdChMIiVzLCAlZCIsIHBNb250aFtpTW9udGggLSAxXSwgaVllYXIpOwotICByZXR1cm4gd3NIZWFkOworICBzdGF0aWMgY29uc3Qgd2NoYXJfdCogY29uc3QgcE1vbnRoW10gPSB7TCJKYW51YXJ5IiwgTCJGZWJydWFyeSIsIEwiTWFyY2giLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJBcHJpbCIsICAgTCJNYXkiLCAgICAgIEwiSnVuZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMIkp1bHkiLCAgICBMIkF1Z3VzdCIsICAgTCJTZXB0ZW1iZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJPY3RvYmVyIiwgTCJOb3ZlbWJlciIsIEwiRGVjZW1iZXIifTsKKyAgcmV0dXJuIFdpZGVTdHJpbmc6OkZvcm1hdChMIiVscywgJWQiLCBwTW9udGhbaU1vbnRoIC0gMV0sIGlZZWFyKTsKIH0KIAotQ0ZYX1dpZGVTdHJpbmcgQ0ZXTF9Nb250aENhbGVuZGFyOjpHZXRUb2RheVRleHQoaW50MzJfdCBpWWVhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1vbnRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGF5KSB7Ci0gIENGWF9XaWRlU3RyaW5nIHdzVG9kYXk7Ci0gIHdzVG9kYXkuRm9ybWF0KEwiLCAlZC8lZC8lZCIsIGlEYXksIGlNb250aCwgaVllYXIpOwotICByZXR1cm4gd3NUb2RheTsKK1dpZGVTdHJpbmcgQ0ZXTF9Nb250aENhbGVuZGFyOjpHZXRUb2RheVRleHQoaW50MzJfdCBpWWVhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTW9udGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURheSkgeworICByZXR1cm4gV2lkZVN0cmluZzo6Rm9ybWF0KEwiLCAlZC8lZC8lZCIsIGlEYXksIGlNb250aCwgaVllYXIpOwogfQogCiBpbnQzMl90IENGV0xfTW9udGhDYWxlbmRhcjo6R2V0RGF5QXRQb2ludChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgY29uc3QgewpAQCAtNzQ2LDkgKzc0MSw5IEBACiAgIENGV0xfV2lkZ2V0OjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsKIH0KIAotdm9pZCBDRldMX01vbnRoQ2FsZW5kYXI6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBEcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7Cit2b2lkIENGV0xfTW9udGhDYWxlbmRhcjo6T25EcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7CisgIERyYXdXaWRnZXQocEdyYXBoaWNzLCBtYXRyaXgpOwogfQogCiB2b2lkIENGV0xfTW9udGhDYWxlbmRhcjo6T25MQnV0dG9uRG93bihDRldMX01lc3NhZ2VNb3VzZSogcE1zZykgewpAQCAtODkxLDcgKzg4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRheW9md2VlaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NkYXkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c2RheSkKICAgICA6IGlEYXkoZGF5KSwKICAgICAgIGlEYXlPZldlZWsoZGF5b2Z3ZWVrKSwKICAgICAgIGR3U3RhdGVzKGR3U3QpLApkaWZmIC0tZ2l0IGEveGZhL2Z3bC9jZndsX21vbnRoY2FsZW5kYXIuaCBiL3hmYS9md2wvY2Z3bF9tb250aGNhbGVuZGFyLmgKaW5kZXggYTExMGVlOC4uN2I2ODYwMCAxMDA2NDQKLS0tIGEveGZhL2Z3bC9jZndsX21vbnRoY2FsZW5kYXIuaAorKysgYi94ZmEvZndsL2Nmd2xfbW9udGhjYWxlbmRhci5oCkBAIC0xMCwxMiArMTAsMTEgQEAKICNpbmNsdWRlIDxtZW1vcnk+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSAieGZhL2ZnYXMvbG9jYWxpemF0aW9uL2ZnYXNfZGF0ZXRpbWUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9kYXRldGltZS5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9ldmVudC5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF93aWRnZXQuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfd2lkZ2V0cHJvcGVydGllcy5oIgogCi0jZGVmaW5lIEZXTF9JVEVNU1RBVEVfTUNEX05vbWFsIDAKICNkZWZpbmUgRldMX0lURU1TVEFURV9NQ0RfRmxhZyAoMUwgPDwgMCkKICNkZWZpbmUgRldMX0lURU1TVEFURV9NQ0RfU2VsZWN0ZWQgKDFMIDw8IDEpCiAKQEAgLTMzLDEwICszMiwxMCBAQAogICBGV0xfVHlwZSBHZXRDbGFzc0lEKCkgY29uc3Qgb3ZlcnJpZGU7CiAgIENGWF9SZWN0RiBHZXRBdXRvc2l6ZWRXaWRnZXRSZWN0KCkgb3ZlcnJpZGU7CiAgIHZvaWQgVXBkYXRlKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgb3ZlcnJpZGU7CisgIHZvaWQgRHJhd1dpZGdldChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgb3ZlcnJpZGU7CiAgIHZvaWQgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSBvdmVycmlkZTsKLSAgdm9pZCBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIG92ZXJyaWRlOworICB2b2lkIE9uRHJhd1dpZGdldChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgb3ZlcnJpZGU7CiAKICAgdm9pZCBTZXRTZWxlY3QoaW50MzJfdCBpWWVhciwgaW50MzJfdCBpTW9udGgsIGludDMyX3QgaURheSk7CiAKQEAgLTgwLDUwICs3OSw1MCBAQAogICAgICAgICAgICAgIGludDMyX3QgZGF5b2Z3ZWVrLAogICAgICAgICAgICAgIHVpbnQzMl90IGR3U3QsCiAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJjLAotICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c2RheSk7CisgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NkYXkpOwogICAgIH5EQVRFSU5GTygpOwogCiAgICAgaW50MzJfdCBpRGF5OwogICAgIGludDMyX3QgaURheU9mV2VlazsKICAgICB1aW50MzJfdCBkd1N0YXRlczsKICAgICBDRlhfUmVjdEYgcmVjdDsKLSAgICBDRlhfV2lkZVN0cmluZyB3c0RheTsKKyAgICBXaWRlU3RyaW5nIHdzRGF5OwogICB9OwogCi0gIHZvaWQgRHJhd0JhY2tncm91bmQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgIHZvaWQgRHJhd0JhY2tncm91bmQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOwotICB2b2lkIERyYXdIZWFkQksoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgIHZvaWQgRHJhd0hlYWRCSyhDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOwotICB2b2lkIERyYXdMQnV0dG9uKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAorICB2b2lkIERyYXdMQnV0dG9uKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKLSAgdm9pZCBEcmF3UkJ1dHRvbihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgdm9pZCBEcmF3UkJ1dHRvbihDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7Ci0gIHZvaWQgRHJhd0NhcHRpb24oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgIHZvaWQgRHJhd0NhcHRpb24oQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOwotICB2b2lkIERyYXdTZXBlcmF0b3IoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgIHZvaWQgRHJhd1NlcGVyYXRvcihDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOwotICB2b2lkIERyYXdEYXRlc0luQksoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgIHZvaWQgRHJhd0RhdGVzSW5CSyhDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOwotICB2b2lkIERyYXdXZWVrKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAorICB2b2lkIERyYXdXZWVrKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKLSAgdm9pZCBEcmF3VG9kYXkoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgIHZvaWQgRHJhd1RvZGF5KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsCiAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOwotICB2b2lkIERyYXdEYXRlc0luKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAorICB2b2lkIERyYXdEYXRlc0luKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKLSAgdm9pZCBEcmF3RGF0ZXNPdXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgIHZvaWQgRHJhd0RhdGVzT3V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOwotICB2b2lkIERyYXdEYXRlc0luQ2lyY2xlKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAorICB2b2lkIERyYXdEYXRlc0luQ2lyY2xlKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKICAgQ0ZYX1NpemVGIENhbGNTaXplKCk7CkBAIC0xNDEsOCArMTQwLDggQEAKICAgdm9pZCBSZW1vdmVTZWxEYXkoKTsKICAgdm9pZCBBZGRTZWxEYXkoaW50MzJfdCBpRGF5KTsKICAgdm9pZCBKdW1wVG9Ub2RheSgpOwotICBDRlhfV2lkZVN0cmluZyBHZXRIZWFkVGV4dChpbnQzMl90IGlZZWFyLCBpbnQzMl90IGlNb250aCk7Ci0gIENGWF9XaWRlU3RyaW5nIEdldFRvZGF5VGV4dChpbnQzMl90IGlZZWFyLCBpbnQzMl90IGlNb250aCwgaW50MzJfdCBpRGF5KTsKKyAgV2lkZVN0cmluZyBHZXRIZWFkVGV4dChpbnQzMl90IGlZZWFyLCBpbnQzMl90IGlNb250aCk7CisgIFdpZGVTdHJpbmcgR2V0VG9kYXlUZXh0KGludDMyX3QgaVllYXIsIGludDMyX3QgaU1vbnRoLCBpbnQzMl90IGlEYXkpOwogICBpbnQzMl90IEdldERheUF0UG9pbnQoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIGNvbnN0OwogICBDRlhfUmVjdEYgR2V0RGF5UmVjdChpbnQzMl90IGlEYXkpOwogICB2b2lkIE9uTEJ1dHRvbkRvd24oQ0ZXTF9NZXNzYWdlTW91c2UqIHBNc2cpOwpAQCAtMTYzLDkgKzE2Miw4IEBACiAgIENGWF9SZWN0RiBtX3J0VG9kYXlGbGFnOwogICBDRlhfUmVjdEYgbV9ydFdlZWtOdW07CiAgIENGWF9SZWN0RiBtX3J0V2Vla051bVNlcDsKLSAgQ0ZYX1dpZGVTdHJpbmcgbV93c0hlYWQ7Ci0gIENGWF9XaWRlU3RyaW5nIG1fd3NUb2RheTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWF9EYXRlVGltZT4gbV9wRGF0ZVRpbWU7CisgIFdpZGVTdHJpbmcgbV93c0hlYWQ7CisgIFdpZGVTdHJpbmcgbV93c1RvZGF5OwogICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8REFURUlORk8+PiBtX2FyckRhdGVzOwogICBpbnQzMl90IG1faUN1clllYXI7CiAgIGludDMyX3QgbV9pQ3VyTW9udGg7CmRpZmYgLS1naXQgYS94ZmEvZndsL2Nmd2xfbm90ZWRyaXZlci5jcHAgYi94ZmEvZndsL2Nmd2xfbm90ZWRyaXZlci5jcHAKaW5kZXggOGZlYjBmYi4uOWExOWY0YiAxMDA2NDQKLS0tIGEveGZhL2Z3bC9jZndsX25vdGVkcml2ZXIuY3BwCisrKyBiL3hmYS9md2wvY2Z3bF9ub3RlZHJpdmVyLmNwcApAQCAtOSw3ICs5LDcgQEAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8dXRpbGl0eT4KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9leHRlbnNpb24uaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9hcHAuaCIKQEAgLTMxLDE4ICszMSwxMiBAQAogICBQdXNoTm90ZUxvb3AobV9wTm90ZUxvb3AuZ2V0KCkpOwogfQogCi1DRldMX05vdGVEcml2ZXI6On5DRldMX05vdGVEcml2ZXIoKSB7Ci0gIENsZWFyRXZlbnRUYXJnZXRzKHRydWUpOwotfQorQ0ZXTF9Ob3RlRHJpdmVyOjp+Q0ZXTF9Ob3RlRHJpdmVyKCkge30KIAogdm9pZCBDRldMX05vdGVEcml2ZXI6OlNlbmRFdmVudChDRldMX0V2ZW50KiBwTm90ZSkgewotICBpZiAobV9ldmVudFRhcmdldHMuZW1wdHkoKSkKLSAgICByZXR1cm47Ci0KICAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbV9ldmVudFRhcmdldHMpIHsKLSAgICBDRldMX0V2ZW50VGFyZ2V0KiBwRXZlbnRUYXJnZXQgPSBwYWlyLnNlY29uZDsKLSAgICBpZiAocEV2ZW50VGFyZ2V0ICYmICFwRXZlbnRUYXJnZXQtPklzSW52YWxpZCgpKQotICAgICAgcEV2ZW50VGFyZ2V0LT5Qcm9jZXNzRXZlbnQocE5vdGUpOworICAgIGlmIChwYWlyLnNlY29uZC0+SXNWYWxpZCgpKQorICAgICAgcGFpci5zZWNvbmQtPlByb2Nlc3NFdmVudChwTm90ZSk7CiAgIH0KIH0KIApAQCAtNTYsNyArNTAsNyBAQAogICAgIHBMaXN0ZW5lci0+U2V0RXZlbnRLZXkoa2V5KTsKICAgfQogICBpZiAoIW1fZXZlbnRUYXJnZXRzW2tleV0pCi0gICAgbV9ldmVudFRhcmdldHNba2V5XSA9IG5ldyBDRldMX0V2ZW50VGFyZ2V0KHBMaXN0ZW5lcik7CisgICAgbV9ldmVudFRhcmdldHNba2V5XSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRldMX0V2ZW50VGFyZ2V0PihwTGlzdGVuZXIpOwogCiAgIG1fZXZlbnRUYXJnZXRzW2tleV0tPlNldEV2ZW50U291cmNlKHBFdmVudFNvdXJjZSk7CiB9CkBAIC0xMTIsMTUgKzEwNiwxNCBAQAogfQogCiB2b2lkIENGV0xfTm90ZURyaXZlcjo6UnVuKCkgewotI2lmIChfRlhfT1NfID09IF9GWF9MSU5VWF9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBcCi0gICAgIF9GWF9PU18gPT0gX0ZYX1dJTjY0XykKKyNpZiBfRlhfT1NfID09IF9GWF9PU19MSU5VWF8gfHwgX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KICAgZm9yICg7OykgewogICAgIENGV0xfTm90ZUxvb3AqIHBUb3BMb29wID0gR2V0VG9wTG9vcCgpOwogICAgIGlmICghcFRvcExvb3AgfHwgIXBUb3BMb29wLT5Db250aW51ZU1vZGFsKCkpCiAgICAgICBicmVhazsKICAgICBVbnF1ZXVlTWVzc2FnZUFuZFByb2Nlc3MocFRvcExvb3ApOwogICB9Ci0jZW5kaWYKKyNlbmRpZiAgLy8gX0ZYX09TXyA9PSBfRlhfT1NfTElOVVhfIHx8IF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCiB9CiAKIHZvaWQgQ0ZXTF9Ob3RlRHJpdmVyOjpOb3RpZnlUYXJnZXRIaWRlKENGV0xfV2lkZ2V0KiBwTm90ZVRhcmdldCkgewpAQCAtMjk0LDcgKzI4Nyw3IEBACiAKIGJvb2wgQ0ZXTF9Ob3RlRHJpdmVyOjpEb0tleShDRldMX01lc3NhZ2UqIHBNZXNzYWdlLCBDRldMX1dpZGdldCogcE1lc3NhZ2VGb3JtKSB7CiAgIENGV0xfTWVzc2FnZUtleSogcE1zZyA9IHN0YXRpY19jYXN0PENGV0xfTWVzc2FnZUtleSo+KHBNZXNzYWdlKTsKLSNpZiAoX0ZYX09TXyAhPSBfRlhfTUFDT1NYXykKKyNpZiAoX0ZYX09TXyAhPSBfRlhfT1NfTUFDT1NYXykKICAgaWYgKHBNc2ctPm1fZHdDbWQgPT0gRldMX0tleUNvbW1hbmQ6OktleURvd24gJiYKICAgICAgIHBNc2ctPm1fZHdLZXlDb2RlID09IEZXTF9WS0VZX1RhYikgewogICAgIENGV0xfV2lkZ2V0TWdyKiBwV2lkZ2V0TWdyID0gcE1lc3NhZ2VGb3JtLT5HZXRPd25lckFwcCgpLT5HZXRXaWRnZXRNZ3IoKTsKQEAgLTQ0NSwxMyArNDM4LDExIEBACiAgIHJldHVybiBwTWVzc2FnZUZvcm07CiB9CiAKLXZvaWQgQ0ZXTF9Ob3RlRHJpdmVyOjpDbGVhckV2ZW50VGFyZ2V0cyhib29sIGJSZW1vdmVBbGwpIHsKK3ZvaWQgQ0ZXTF9Ob3RlRHJpdmVyOjpDbGVhckV2ZW50VGFyZ2V0cygpIHsKICAgYXV0byBpdCA9IG1fZXZlbnRUYXJnZXRzLmJlZ2luKCk7CiAgIHdoaWxlIChpdCAhPSBtX2V2ZW50VGFyZ2V0cy5lbmQoKSkgewogICAgIGF1dG8gb2xkID0gaXQrKzsKLSAgICBpZiAob2xkLT5zZWNvbmQgJiYgKGJSZW1vdmVBbGwgfHwgb2xkLT5zZWNvbmQtPklzSW52YWxpZCgpKSkgewotICAgICAgZGVsZXRlIG9sZC0+c2Vjb25kOworICAgIGlmICghb2xkLT5zZWNvbmQtPklzVmFsaWQoKSkKICAgICAgIG1fZXZlbnRUYXJnZXRzLmVyYXNlKG9sZCk7Ci0gICAgfQogICB9CiB9CmRpZmYgLS1naXQgYS94ZmEvZndsL2Nmd2xfbm90ZWRyaXZlci5oIGIveGZhL2Z3bC9jZndsX25vdGVkcml2ZXIuaAppbmRleCBlMTc3NDk0Li4wZGI0ODJlIDEwMDY0NAotLS0gYS94ZmEvZndsL2Nmd2xfbm90ZWRyaXZlci5oCisrKyBiL3hmYS9md2wvY2Z3bF9ub3RlZHJpdmVyLmgKQEAgLTgsMTMgKzgsMTMgQEAKICNkZWZpbmUgWEZBX0ZXTF9DRldMX05PVEVEUklWRVJfSF8KIAogI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfZXZlbnQuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfd2lkZ2V0LmgiCi0jaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY2Z4X2dyYXBoaWNzLmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9ncmFwaGljcy5oIgogCiBjbGFzcyBDRldMX0V2ZW50VGFyZ2V0OwogY2xhc3MgQ0ZXTF9Ob3RlTG9vcDsKQEAgLTMwLDcgKzMwLDcgQEAKIAogICB2b2lkIFJlZ2lzdGVyRXZlbnRUYXJnZXQoQ0ZXTF9XaWRnZXQqIHBMaXN0ZW5lciwgQ0ZXTF9XaWRnZXQqIHBFdmVudFNvdXJjZSk7CiAgIHZvaWQgVW5yZWdpc3RlckV2ZW50VGFyZ2V0KENGV0xfV2lkZ2V0KiBwTGlzdGVuZXIpOwotICB2b2lkIENsZWFyRXZlbnRUYXJnZXRzKGJvb2wgYlJlbW92ZUFsbCk7CisgIHZvaWQgQ2xlYXJFdmVudFRhcmdldHMoKTsKIAogICBDRldMX05vdGVMb29wKiBHZXRUb3BMb29wKCkgY29uc3Q7CiAgIHZvaWQgUHVzaE5vdGVMb29wKENGV0xfTm90ZUxvb3AqIHBOb3RlTG9vcCk7CkBAIC02OSw3ICs2OSw3IEBACiAgIHN0ZDo6dmVjdG9yPENGV0xfV2lkZ2V0Kj4gbV9Gb3JtczsKICAgc3RkOjpkZXF1ZTxzdGQ6OnVuaXF1ZV9wdHI8Q0ZXTF9NZXNzYWdlPj4gbV9Ob3RlUXVldWU7CiAgIHN0ZDo6dmVjdG9yPENGV0xfTm90ZUxvb3AqPiBtX05vdGVMb29wUXVldWU7Ci0gIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MzJfdCwgQ0ZXTF9FdmVudFRhcmdldCo+IG1fZXZlbnRUYXJnZXRzOworICBzdGQ6Om1hcDx1aW50MzJfdCwgc3RkOjp1bmlxdWVfcHRyPENGV0xfRXZlbnRUYXJnZXQ+PiBtX2V2ZW50VGFyZ2V0czsKICAgQ0ZXTF9XaWRnZXQqIG1fcEhvdmVyOwogICBDRldMX1dpZGdldCogbV9wRm9jdXM7CiAgIENGV0xfV2lkZ2V0KiBtX3BHcmFiOwpkaWZmIC0tZ2l0IGEveGZhL2Z3bC9jZndsX3BpY3R1cmVib3guY3BwIGIveGZhL2Z3bC9jZndsX3BpY3R1cmVib3guY3BwCmluZGV4IDhjMjAwZTAuLjYzN2RlOTQgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvY2Z3bF9waWN0dXJlYm94LmNwcAorKysgYi94ZmEvZndsL2Nmd2xfcGljdHVyZWJveC5jcHAKQEAgLTMyLDggKzMyLDggQEAKICAgbV9ydENsaWVudCA9IEdldENsaWVudFJlY3QoKTsKIH0KIAotdm9pZCBDRldMX1BpY3R1cmVCb3g6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7Cit2b2lkIENGV0xfUGljdHVyZUJveDo6RHJhd1dpZGdldChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKICAgaWYgKCFwR3JhcGhpY3MpCiAgICAgcmV0dXJuOwogICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpCkBAIC00MSwxMCArNDEsMTAgQEAKIAogICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IEdldEF2YWlsYWJsZVRoZW1lKCk7CiAgIGlmIChIYXNCb3JkZXIoKSkKLSAgICBEcmF3Qm9yZGVyKHBHcmFwaGljcywgQ0ZXTF9QYXJ0OjpCb3JkZXIsIHBUaGVtZSwgcE1hdHJpeCk7CisgICAgRHJhd0JvcmRlcihwR3JhcGhpY3MsIENGV0xfUGFydDo6Qm9yZGVyLCBwVGhlbWUsIG1hdHJpeCk7CiB9CiAKLXZvaWQgQ0ZXTF9QaWN0dXJlQm94OjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgRHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOwordm9pZCBDRldMX1BpY3R1cmVCb3g6Ok9uRHJhd1dpZGdldChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBEcmF3V2lkZ2V0KHBHcmFwaGljcywgbWF0cml4KTsKIH0KZGlmZiAtLWdpdCBhL3hmYS9md2wvY2Z3bF9waWN0dXJlYm94LmggYi94ZmEvZndsL2Nmd2xfcGljdHVyZWJveC5oCmluZGV4IDc0M2VhMWQuLjM2M2RiOGEgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvY2Z3bF9waWN0dXJlYm94LmgKKysrIGIveGZhL2Z3bC9jZndsX3BpY3R1cmVib3guaApAQCAtMjMsOSArMjMsOSBAQAogICAvLyBDRldMX1dpZGdldAogICBGV0xfVHlwZSBHZXRDbGFzc0lEKCkgY29uc3Qgb3ZlcnJpZGU7CiAgIHZvaWQgVXBkYXRlKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSBvdmVycmlkZTsKKyAgdm9pZCBEcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSBvdmVycmlkZTsKKyAgdm9pZCBPbkRyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIG92ZXJyaWRlOwogCiAgcHJpdmF0ZToKICAgQ0ZYX1JlY3RGIG1fcnRDbGllbnQ7CmRpZmYgLS1naXQgYS94ZmEvZndsL2Nmd2xfcHVzaGJ1dHRvbi5jcHAgYi94ZmEvZndsL2Nmd2xfcHVzaGJ1dHRvbi5jcHAKaW5kZXggZmU0YzNmNi4uYTkxMjEwOCAxMDA2NDQKLS0tIGEveGZhL2Z3bC9jZndsX3B1c2hidXR0b24uY3BwCisrKyBiL3hmYS9md2wvY2Z3bF9wdXNoYnV0dG9uLmNwcApAQCAtMTAsNyArMTAsNyBAQAogI2luY2x1ZGUgPHV0aWxpdHk+CiAKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS90dG8vZmRlX3RleHRvdXQuaCIKKyNpbmNsdWRlICJ4ZmEvZmRlL2NmZGVfdGV4dG91dC5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9ldmVudC5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9ldmVudG1vdXNlLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX21lc3NhZ2VrZXkuaCIKQEAgLTIyLDkgKzIyLDcgQEAKIAogQ0ZXTF9QdXNoQnV0dG9uOjpDRldMX1B1c2hCdXR0b24oY29uc3QgQ0ZXTF9BcHAqIGFwcCkKICAgICA6IENGV0xfV2lkZ2V0KGFwcCwgcGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfV2lkZ2V0UHJvcGVydGllcz4oKSwgbnVsbHB0ciksCi0gICAgICBtX2JCdG5Eb3duKGZhbHNlKSwKLSAgICAgIG1fZHdUVE9TdHlsZXMoRkRFX1RUT1NUWUxFX1NpbmdsZUxpbmUpLAotICAgICAgbV9pVFRPQWxpZ24oRkRFX1RUT0FMSUdOTUVOVF9DZW50ZXIpIHt9CisgICAgICBtX2JCdG5Eb3duKGZhbHNlKSB7fQogCiBDRldMX1B1c2hCdXR0b246On5DRldMX1B1c2hCdXR0b24oKSB7fQogCkBAIC00NiwxMyArNDQsMTIgQEAKICAgaWYgKCFtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyKQogICAgIG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIgPSBHZXRBdmFpbGFibGVUaGVtZSgpOwogCi0gIFVwZGF0ZVRleHRPdXRTdHlsZXMoKTsKICAgbV9ydENsaWVudCA9IEdldENsaWVudFJlY3QoKTsKICAgbV9ydENhcHRpb24gPSBtX3J0Q2xpZW50OwogfQogCi12b2lkIENGV0xfUHVzaEJ1dHRvbjo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKK3ZvaWQgQ0ZXTF9QdXNoQnV0dG9uOjpEcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgewogICBpZiAoIXBHcmFwaGljcykKICAgICByZXR1cm47CiAgIGlmICghbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlcikKQEAgLTYwLDEyICs1NywxMiBAQAogCiAgIGlmIChIYXNCb3JkZXIoKSkgewogICAgIERyYXdCb3JkZXIocEdyYXBoaWNzLCBDRldMX1BhcnQ6OkJvcmRlciwgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwKLSAgICAgICAgICAgICAgIHBNYXRyaXgpOworICAgICAgICAgICAgICAgbWF0cml4KTsKICAgfQotICBEcmF3Qmtncm91bmQocEdyYXBoaWNzLCBtX3BQcm9wZXJ0aWVzLT5tX3BUaGVtZVByb3ZpZGVyLCBwTWF0cml4KTsKKyAgRHJhd0JrZ3JvdW5kKHBHcmFwaGljcywgbV9wUHJvcGVydGllcy0+bV9wVGhlbWVQcm92aWRlciwgJm1hdHJpeCk7CiB9CiAKLXZvaWQgQ0ZXTF9QdXNoQnV0dG9uOjpEcmF3Qmtncm91bmQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCit2b2lkIENGV0xfUHVzaEJ1dHRvbjo6RHJhd0JrZ3JvdW5kKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKICAgQ0ZXTF9UaGVtZUJhY2tncm91bmQgcGFyYW07CkBAIC05NCwxMSArOTEsNiBAQAogICByZXR1cm4gZHdTdGF0ZXM7CiB9CiAKLXZvaWQgQ0ZXTF9QdXNoQnV0dG9uOjpVcGRhdGVUZXh0T3V0U3R5bGVzKCkgewotICBtX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfVG9wTGVmdDsKLSAgbV9kd1RUT1N0eWxlcyA9IEZERV9UVE9TVFlMRV9TaW5nbGVMaW5lOwotfQotCiB2b2lkIENGV0xfUHVzaEJ1dHRvbjo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7CiAgIGlmICghcE1lc3NhZ2UpCiAgICAgcmV0dXJuOwpAQCAtMTQ0LDkgKzEzNiw5IEBACiAgIENGV0xfV2lkZ2V0OjpPblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsKIH0KIAotdm9pZCBDRldMX1B1c2hCdXR0b246Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBEcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7Cit2b2lkIENGV0xfUHVzaEJ1dHRvbjo6T25EcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7CisgIERyYXdXaWRnZXQocEdyYXBoaWNzLCBtYXRyaXgpOwogfQogCiB2b2lkIENGV0xfUHVzaEJ1dHRvbjo6T25Gb2N1c0NoYW5nZWQoQ0ZXTF9NZXNzYWdlKiBwTXNnLCBib29sIGJTZXQpIHsKZGlmZiAtLWdpdCBhL3hmYS9md2wvY2Z3bF9wdXNoYnV0dG9uLmggYi94ZmEvZndsL2Nmd2xfcHVzaGJ1dHRvbi5oCmluZGV4IGY3MzIzZWIuLjVjNTA5ZmIgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvY2Z3bF9wdXNoYnV0dG9uLmgKKysrIGIveGZhL2Z3bC9jZndsX3B1c2hidXR0b24uaApAQCAtMjgsMTMgKzI4LDEzIEBACiAgIEZXTF9UeXBlIEdldENsYXNzSUQoKSBjb25zdCBvdmVycmlkZTsKICAgdm9pZCBTZXRTdGF0ZXModWludDMyX3QgZHdTdGF0ZXMpIG92ZXJyaWRlOwogICB2b2lkIFVwZGF0ZSgpIG92ZXJyaWRlOwotICB2b2lkIERyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIG92ZXJyaWRlOworICB2b2lkIERyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIG92ZXJyaWRlOwogICB2b2lkIE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSBvdmVycmlkZTsKKyAgdm9pZCBPbkRyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIG92ZXJyaWRlOwogCiAgcHJpdmF0ZToKLSAgdm9pZCBEcmF3Qmtncm91bmQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgIHZvaWQgRHJhd0JrZ3JvdW5kKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOwogICB1aW50MzJfdCBHZXRQYXJ0U3RhdGVzKCk7CkBAIC00OSw4ICs0OSw2IEBACiAgIENGWF9SZWN0RiBtX3J0Q2xpZW50OwogICBDRlhfUmVjdEYgbV9ydENhcHRpb247CiAgIGJvb2wgbV9iQnRuRG93bjsKLSAgdWludDMyX3QgbV9kd1RUT1N0eWxlczsKLSAgaW50MzJfdCBtX2lUVE9BbGlnbjsKIH07CiAKICNlbmRpZiAgLy8gWEZBX0ZXTF9DRldMX1BVU0hCVVRUT05fSF8KZGlmZiAtLWdpdCBhL3hmYS9md2wvY2Z3bF9zY3JvbGxiYXIuY3BwIGIveGZhL2Z3bC9jZndsX3Njcm9sbGJhci5jcHAKaW5kZXggMWRhMjY3NC4uZjcyMzEyNCAxMDA2NDQKLS0tIGEveGZhL2Z3bC9jZndsX3Njcm9sbGJhci5jcHAKKysrIGIveGZhL2Z3bC9jZndsX3Njcm9sbGJhci5jcHAKQEAgLTExLDYgKzExLDcgQEAKICNpbmNsdWRlIDx1dGlsaXR5PgogCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfbWVzc2FnZW1vdXNlLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX21lc3NhZ2Vtb3VzZXdoZWVsLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX25vdGVkcml2ZXIuaCIKQEAgLTczLDggKzc0LDggQEAKICAgTGF5b3V0KCk7CiB9CiAKLXZvaWQgQ0ZXTF9TY3JvbGxCYXI6OkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKK3ZvaWQgQ0ZXTF9TY3JvbGxCYXI6OkRyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKICAgaWYgKCFwR3JhcGhpY3MpCiAgICAgcmV0dXJuOwogICBpZiAoIW1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXIpCkBAIC04MiwyOCArODMsMjggQEAKIAogICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IG1fcFByb3BlcnRpZXMtPm1fcFRoZW1lUHJvdmlkZXI7CiAgIGlmIChIYXNCb3JkZXIoKSkKLSAgICBEcmF3Qm9yZGVyKHBHcmFwaGljcywgQ0ZXTF9QYXJ0OjpCb3JkZXIsIHBUaGVtZSwgcE1hdHJpeCk7Ci0gIERyYXdUcmFjayhwR3JhcGhpY3MsIHBUaGVtZSwgdHJ1ZSwgcE1hdHJpeCk7Ci0gIERyYXdUcmFjayhwR3JhcGhpY3MsIHBUaGVtZSwgZmFsc2UsIHBNYXRyaXgpOwotICBEcmF3QXJyb3dCdG4ocEdyYXBoaWNzLCBwVGhlbWUsIHRydWUsIHBNYXRyaXgpOwotICBEcmF3QXJyb3dCdG4ocEdyYXBoaWNzLCBwVGhlbWUsIGZhbHNlLCBwTWF0cml4KTsKLSAgRHJhd1RodW1iKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsKKyAgICBEcmF3Qm9yZGVyKHBHcmFwaGljcywgQ0ZXTF9QYXJ0OjpCb3JkZXIsIHBUaGVtZSwgbWF0cml4KTsKKyAgRHJhd1RyYWNrKHBHcmFwaGljcywgcFRoZW1lLCB0cnVlLCAmbWF0cml4KTsKKyAgRHJhd1RyYWNrKHBHcmFwaGljcywgcFRoZW1lLCBmYWxzZSwgJm1hdHJpeCk7CisgIERyYXdBcnJvd0J0bihwR3JhcGhpY3MsIHBUaGVtZSwgdHJ1ZSwgJm1hdHJpeCk7CisgIERyYXdBcnJvd0J0bihwR3JhcGhpY3MsIHBUaGVtZSwgZmFsc2UsICZtYXRyaXgpOworICBEcmF3VGh1bWIocEdyYXBoaWNzLCBwVGhlbWUsICZtYXRyaXgpOwogfQogCi12b2lkIENGV0xfU2Nyb2xsQmFyOjpTZXRUcmFja1BvcyhGWF9GTE9BVCBmVHJhY2tQb3MpIHsKK3ZvaWQgQ0ZXTF9TY3JvbGxCYXI6OlNldFRyYWNrUG9zKGZsb2F0IGZUcmFja1BvcykgewogICBtX2ZUcmFja1BvcyA9IGZUcmFja1BvczsKICAgbV9ydFRodW1iID0gQ2FsY1RodW1iQnV0dG9uUmVjdChtX3J0VGh1bWIpOwogICBtX3J0TWluVHJhY2sgPSBDYWxjTWluVHJhY2tSZWN0KG1fcnRNaW5UcmFjayk7CiAgIG1fcnRNYXhUcmFjayA9IENhbGNNYXhUcmFja1JlY3QobV9ydE1heFRyYWNrKTsKIH0KIAotYm9vbCBDRldMX1Njcm9sbEJhcjo6RG9TY3JvbGwoQ0ZXTF9FdmVudFNjcm9sbDo6Q29kZSBkd0NvZGUsIEZYX0ZMT0FUIGZQb3MpIHsKK2Jvb2wgQ0ZXTF9TY3JvbGxCYXI6OkRvU2Nyb2xsKENGV0xfRXZlbnRTY3JvbGw6OkNvZGUgZHdDb2RlLCBmbG9hdCBmUG9zKSB7CiAgIGlmIChkd0NvZGUgPT0gQ0ZXTF9FdmVudFNjcm9sbDo6Q29kZTo6Tm9uZSkKICAgICByZXR1cm4gZmFsc2U7CiAgIHJldHVybiBPblNjcm9sbChkd0NvZGUsIGZQb3MpOwogfQogCi12b2lkIENGV0xfU2Nyb2xsQmFyOjpEcmF3VHJhY2soQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCit2b2lkIENGV0xfU2Nyb2xsQmFyOjpEcmF3VHJhY2soQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkxvd2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKQEAgLTExOSw3ICsxMjAsNyBAQAogICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbSk7CiB9CiAKLXZvaWQgQ0ZXTF9TY3JvbGxCYXI6OkRyYXdBcnJvd0J0bihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKK3ZvaWQgQ0ZXTF9TY3JvbGxCYXI6OkRyYXdBcnJvd0J0bihDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTWluQnRuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKQEAgLTEzNiw3ICsxMzcsNyBAQAogICAgIHBUaGVtZS0+RHJhd0JhY2tncm91bmQoJnBhcmFtKTsKIH0KIAotdm9pZCBDRldMX1Njcm9sbEJhcjo6RHJhd1RodW1iKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAordm9pZCBDRldMX1Njcm9sbEJhcjo6RHJhd1RodW1iKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7CiAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOwpAQCAtMTY0LDcgKzE2NSw3IEBACiAKIHZvaWQgQ0ZXTF9TY3JvbGxCYXI6OkNhbGNCdXR0b25MZW4oKSB7CiAgIG1fZkJ1dHRvbkxlbiA9IElzVmVydGljYWwoKSA/IG1fcnRDbGllbnQud2lkdGggOiBtX3J0Q2xpZW50LmhlaWdodDsKLSAgRlhfRkxPQVQgZkxlbmd0aCA9IElzVmVydGljYWwoKSA/IG1fcnRDbGllbnQuaGVpZ2h0IDogbV9ydENsaWVudC53aWR0aDsKKyAgZmxvYXQgZkxlbmd0aCA9IElzVmVydGljYWwoKSA/IG1fcnRDbGllbnQuaGVpZ2h0IDogbV9ydENsaWVudC53aWR0aDsKICAgaWYgKGZMZW5ndGggPCBtX2ZCdXR0b25MZW4gKiAyKSB7CiAgICAgbV9mQnV0dG9uTGVuID0gZkxlbmd0aCAvIDI7CiAgICAgbV9iTWluU2l6ZSA9IHRydWU7CkBAIC0xOTksNyArMjAwLDcgQEAKICAgICByZXR1cm4gcmVjdDsKICAgfQogCi0gIEZYX0ZMT0FUIGZSYW5nZSA9IG1fZlJhbmdlTWF4IC0gbV9mUmFuZ2VNaW47CisgIGZsb2F0IGZSYW5nZSA9IG1fZlJhbmdlTWF4IC0gbV9mUmFuZ2VNaW47CiAgIGlmIChmUmFuZ2UgPCAwKSB7CiAgICAgaWYgKElzVmVydGljYWwoKSkgewogICAgICAgcmV0dXJuIENGWF9SZWN0RihtX3J0Q2xpZW50LmxlZnQsIG1fcnRNYXhCdG4uYm90dG9tKCksIG1fcnRDbGllbnQud2lkdGgsCkBAIC0yMDksMjIgKzIxMCwyMSBAQAogICB9CiAKICAgQ0ZYX1JlY3RGIHJ0Q2xpZW50ID0gbV9ydENsaWVudDsKLSAgRlhfRkxPQVQgZkxlbmd0aCA9IElzVmVydGljYWwoKSA/IHJ0Q2xpZW50LmhlaWdodCA6IHJ0Q2xpZW50LndpZHRoOwotICBGWF9GTE9BVCBmU2l6ZSA9IG1fZkJ1dHRvbkxlbjsKKyAgZmxvYXQgZkxlbmd0aCA9IElzVmVydGljYWwoKSA/IHJ0Q2xpZW50LmhlaWdodCA6IHJ0Q2xpZW50LndpZHRoOworICBmbG9hdCBmU2l6ZSA9IG1fZkJ1dHRvbkxlbjsKICAgZkxlbmd0aCAtPSBmU2l6ZSAqIDIuMGY7CiAgIGlmIChmTGVuZ3RoIDwgZlNpemUpCiAgICAgZkxlbmd0aCA9IDAuMGY7CiAKLSAgRlhfRkxPQVQgZlRodW1iU2l6ZSA9IGZMZW5ndGggKiBmTGVuZ3RoIC8gKGZSYW5nZSArIGZMZW5ndGgpOworICBmbG9hdCBmVGh1bWJTaXplID0gZkxlbmd0aCAqIGZMZW5ndGggLyAoZlJhbmdlICsgZkxlbmd0aCk7CiAgIGZUaHVtYlNpemUgPSBzdGQ6Om1heChmVGh1bWJTaXplLCBrTWluVGh1bWJTaXplKTsKIAotICBGWF9GTE9BVCBmRGlmZiA9IHN0ZDo6bWF4KGZMZW5ndGggLSBmVGh1bWJTaXplLCAwLjBmKTsKLSAgRlhfRkxPQVQgZlRyYWNrUG9zID0KLSAgICAgIHN0ZDo6bWF4KHN0ZDo6bWluKG1fZlRyYWNrUG9zLCBtX2ZSYW5nZU1heCksIG1fZlJhbmdlTWluKTsKKyAgZmxvYXQgZkRpZmYgPSBzdGQ6Om1heChmTGVuZ3RoIC0gZlRodW1iU2l6ZSwgMC4wZik7CisgIGZsb2F0IGZUcmFja1BvcyA9IHBkZml1bTo6Y2xhbXAobV9mVHJhY2tQb3MsIG1fZlJhbmdlTWluLCBtX2ZSYW5nZU1heCk7CiAgIGlmICghZlJhbmdlKQogICAgIHJldHVybiByZWN0OwogCi0gIEZYX0ZMT0FUIGlQb3MgPSBmU2l6ZSArIGZEaWZmICogKGZUcmFja1BvcyAtIG1fZlJhbmdlTWluKSAvIGZSYW5nZTsKKyAgZmxvYXQgaVBvcyA9IGZTaXplICsgZkRpZmYgKiAoZlRyYWNrUG9zIC0gbV9mUmFuZ2VNaW4pIC8gZlJhbmdlOwogICByZWN0LmxlZnQgPSBydENsaWVudC5sZWZ0OwogICByZWN0LnRvcCA9IHJ0Q2xpZW50LnRvcDsKICAgaWYgKElzVmVydGljYWwoKSkgewpAQCAtMjY0LDIwICsyNjQsMjAgQEAKICAgICByZXR1cm4gQ0ZYX1JlY3RGKHJ0TWF4UmVjdC5Ub3BMZWZ0KCksIDAsIDApOwogCiAgIGlmIChJc1ZlcnRpY2FsKCkpIHsKLSAgICBGWF9GTE9BVCBpeSA9IChtX3J0VGh1bWIudG9wICsgbV9ydFRodW1iLmJvdHRvbSgpKSAvIDI7CisgICAgZmxvYXQgaXkgPSAobV9ydFRodW1iLnRvcCArIG1fcnRUaHVtYi5ib3R0b20oKSkgLyAyOwogICAgIHJldHVybiBDRlhfUmVjdEYobV9ydENsaWVudC5sZWZ0LCBpeSwgbV9ydENsaWVudC53aWR0aCwKICAgICAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQuYm90dG9tKCkgLSBpeSk7CiAgIH0KIAotICBGWF9GTE9BVCBpeCA9IChtX3J0VGh1bWIubGVmdCArIG1fcnRUaHVtYi5yaWdodCgpKSAvIDI7CisgIGZsb2F0IGl4ID0gKG1fcnRUaHVtYi5sZWZ0ICsgbV9ydFRodW1iLnJpZ2h0KCkpIC8gMjsKICAgcmV0dXJuIENGWF9SZWN0RihpeCwgbV9ydENsaWVudC50b3AsIG1fcnRDbGllbnQuaGVpZ2h0IC0gaXgsCiAgICAgICAgICAgICAgICAgICAgbV9ydENsaWVudC5oZWlnaHQpOwogfQogCi1GWF9GTE9BVCBDRldMX1Njcm9sbEJhcjo6R2V0VHJhY2tQb2ludFBvcyhjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworZmxvYXQgQ0ZXTF9TY3JvbGxCYXI6OkdldFRyYWNrUG9pbnRQb3MoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKICAgQ0ZYX1BvaW50RiBkaWZmID0gcG9pbnQgLSBtX2NwVHJhY2tQb2ludDsKLSAgRlhfRkxPQVQgZlJhbmdlID0gbV9mUmFuZ2VNYXggLSBtX2ZSYW5nZU1pbjsKLSAgRlhfRkxPQVQgZlBvczsKKyAgZmxvYXQgZlJhbmdlID0gbV9mUmFuZ2VNYXggLSBtX2ZSYW5nZU1pbjsKKyAgZmxvYXQgZlBvczsKIAogICBpZiAoSXNWZXJ0aWNhbCgpKSB7CiAgICAgZlBvcyA9IGZSYW5nZSAqIGRpZmYueSAvCkBAIC0yODgsNyArMjg4LDcgQEAKICAgfQogCiAgIGZQb3MgKz0gbV9mTGFzdFRyYWNrUG9zOwotICByZXR1cm4gc3RkOjptaW4oc3RkOjptYXgoZlBvcywgbV9mUmFuZ2VNaW4pLCBtX2ZSYW5nZU1heCk7CisgIHJldHVybiBwZGZpdW06OmNsYW1wKGZQb3MsIG1fZlJhbmdlTWluLCBtX2ZSYW5nZU1heCk7CiB9CiAKIGJvb2wgQ0ZXTF9TY3JvbGxCYXI6OlNlbmRFdmVudCgpIHsKQEAgLTMxNyw3ICszMTcsNyBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDRldMX1Njcm9sbEJhcjo6T25TY3JvbGwoQ0ZXTF9FdmVudFNjcm9sbDo6Q29kZSBkd0NvZGUsIEZYX0ZMT0FUIGZQb3MpIHsKK2Jvb2wgQ0ZXTF9TY3JvbGxCYXI6Ok9uU2Nyb2xsKENGV0xfRXZlbnRTY3JvbGw6OkNvZGUgZHdDb2RlLCBmbG9hdCBmUG9zKSB7CiAgIENGV0xfRXZlbnRTY3JvbGwgZXYodGhpcyk7CiAgIGV2Lm1faVNjcm9sbENvZGUgPSBkd0NvZGU7CiAgIGV2Lm1fZlBvcyA9IGZQb3M7CkBAIC0zNTUsOSArMzU1LDkgQEAKICAgfQogfQogCi12b2lkIENGV0xfU2Nyb2xsQmFyOjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBEcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7Cit2b2lkIENGV0xfU2Nyb2xsQmFyOjpPbkRyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBEcmF3V2lkZ2V0KHBHcmFwaGljcywgbWF0cml4KTsKIH0KIAogdm9pZCBDRldMX1Njcm9sbEJhcjo6T25MQnV0dG9uRG93bihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewpAQCAtNDg1LDggKzQ4NSw3IEBACiBDRldMX1Njcm9sbEJhcjo6VGltZXI6OlRpbWVyKENGV0xfU2Nyb2xsQmFyKiBwVG9vbFRpcCkgOiBDRldMX1RpbWVyKHBUb29sVGlwKSB7fQogCiB2b2lkIENGV0xfU2Nyb2xsQmFyOjpUaW1lcjo6UnVuKENGV0xfVGltZXJJbmZvKiBwVGltZXJJbmZvKSB7Ci0gIENGV0xfU2Nyb2xsQmFyKiBwQnV0dG9uID0gc3RhdGljX2Nhc3Q8Q0ZXTF9TY3JvbGxCYXIqPihtX3BXaWRnZXQpOwotCisgIENGV0xfU2Nyb2xsQmFyKiBwQnV0dG9uID0gc3RhdGljX2Nhc3Q8Q0ZXTF9TY3JvbGxCYXIqPihtX3BXaWRnZXQuR2V0KCkpOwogICBpZiAocEJ1dHRvbi0+bV9wVGltZXJJbmZvKQogICAgIHBCdXR0b24tPm1fcFRpbWVySW5mby0+U3RvcFRpbWVyKCk7CiAKZGlmZiAtLWdpdCBhL3hmYS9md2wvY2Z3bF9zY3JvbGxiYXIuaCBiL3hmYS9md2wvY2Z3bF9zY3JvbGxiYXIuaAppbmRleCA2YTY3ZmE4Li5iMjUyM2E2IDEwMDY0NAotLS0gYS94ZmEvZndsL2Nmd2xfc2Nyb2xsYmFyLmgKKysrIGIveGZhL2Z3bC9jZndsX3Njcm9sbGJhci5oCkBAIC0zMCwyOCArMzAsMjggQEAKICAgLy8gQ0ZXTF9XaWRnZXQKICAgRldMX1R5cGUgR2V0Q2xhc3NJRCgpIGNvbnN0IG92ZXJyaWRlOwogICB2b2lkIFVwZGF0ZSgpIG92ZXJyaWRlOwotICB2b2lkIERyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIG92ZXJyaWRlOworICB2b2lkIERyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIG92ZXJyaWRlOwogICB2b2lkIE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSBvdmVycmlkZTsKKyAgdm9pZCBPbkRyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIG92ZXJyaWRlOwogCi0gIHZvaWQgR2V0UmFuZ2UoRlhfRkxPQVQqIGZNaW4sIEZYX0ZMT0FUKiBmTWF4KSBjb25zdCB7CisgIHZvaWQgR2V0UmFuZ2UoZmxvYXQqIGZNaW4sIGZsb2F0KiBmTWF4KSBjb25zdCB7CiAgICAgQVNTRVJUKGZNaW4pOwogICAgIEFTU0VSVChmTWF4KTsKICAgICAqZk1pbiA9IG1fZlJhbmdlTWluOwogICAgICpmTWF4ID0gbV9mUmFuZ2VNYXg7CiAgIH0KLSAgdm9pZCBTZXRSYW5nZShGWF9GTE9BVCBmTWluLCBGWF9GTE9BVCBmTWF4KSB7CisgIHZvaWQgU2V0UmFuZ2UoZmxvYXQgZk1pbiwgZmxvYXQgZk1heCkgewogICAgIG1fZlJhbmdlTWluID0gZk1pbjsKICAgICBtX2ZSYW5nZU1heCA9IGZNYXg7CiAgIH0KLSAgRlhfRkxPQVQgR2V0UGFnZVNpemUoKSBjb25zdCB7IHJldHVybiBtX2ZQYWdlU2l6ZTsgfQotICB2b2lkIFNldFBhZ2VTaXplKEZYX0ZMT0FUIGZQYWdlU2l6ZSkgeyBtX2ZQYWdlU2l6ZSA9IGZQYWdlU2l6ZTsgfQotICBGWF9GTE9BVCBHZXRTdGVwU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZlN0ZXBTaXplOyB9Ci0gIHZvaWQgU2V0U3RlcFNpemUoRlhfRkxPQVQgZlN0ZXBTaXplKSB7IG1fZlN0ZXBTaXplID0gZlN0ZXBTaXplOyB9Ci0gIEZYX0ZMT0FUIEdldFBvcygpIGNvbnN0IHsgcmV0dXJuIG1fZlBvczsgfQotICB2b2lkIFNldFBvcyhGWF9GTE9BVCBmUG9zKSB7IG1fZlBvcyA9IGZQb3M7IH0KLSAgdm9pZCBTZXRUcmFja1BvcyhGWF9GTE9BVCBmVHJhY2tQb3MpOworICBmbG9hdCBHZXRQYWdlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZlBhZ2VTaXplOyB9CisgIHZvaWQgU2V0UGFnZVNpemUoZmxvYXQgZlBhZ2VTaXplKSB7IG1fZlBhZ2VTaXplID0gZlBhZ2VTaXplOyB9CisgIGZsb2F0IEdldFN0ZXBTaXplKCkgY29uc3QgeyByZXR1cm4gbV9mU3RlcFNpemU7IH0KKyAgdm9pZCBTZXRTdGVwU2l6ZShmbG9hdCBmU3RlcFNpemUpIHsgbV9mU3RlcFNpemUgPSBmU3RlcFNpemU7IH0KKyAgZmxvYXQgR2V0UG9zKCkgY29uc3QgeyByZXR1cm4gbV9mUG9zOyB9CisgIHZvaWQgU2V0UG9zKGZsb2F0IGZQb3MpIHsgbV9mUG9zID0gZlBvczsgfQorICB2b2lkIFNldFRyYWNrUG9zKGZsb2F0IGZUcmFja1Bvcyk7CiAKICBwcml2YXRlOgogICBjbGFzcyBUaW1lciA6IHB1YmxpYyBDRldMX1RpbWVyIHsKQEAgLTY2LDE1ICs2NiwxNSBAQAogICBib29sIElzVmVydGljYWwoKSBjb25zdCB7CiAgICAgcmV0dXJuICEhKG1fcFByb3BlcnRpZXMtPm1fZHdTdHlsZUV4ZXMgJiBGV0xfU1RZTEVFWFRfU0NCX1ZlcnQpOwogICB9Ci0gIHZvaWQgRHJhd1RyYWNrKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAorICB2b2lkIERyYXdUcmFjayhDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLAogICAgICAgICAgICAgICAgICBib29sIGJMb3dlciwKICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7Ci0gIHZvaWQgRHJhd0Fycm93QnRuKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAorICB2b2lkIERyYXdBcnJvd0J0bihDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLAogICAgICAgICAgICAgICAgICAgICBib29sIGJNaW5CdG4sCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOwotICB2b2lkIERyYXdUaHVtYihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgdm9pZCBEcmF3VGh1bWIoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7CiAgIHZvaWQgTGF5b3V0KCk7CkBAIC04NCwxNiArODQsMTYgQEAKICAgQ0ZYX1JlY3RGIENhbGNUaHVtYkJ1dHRvblJlY3QoY29uc3QgQ0ZYX1JlY3RGJiBydFRodW1iUmVjdCk7CiAgIENGWF9SZWN0RiBDYWxjTWluVHJhY2tSZWN0KGNvbnN0IENGWF9SZWN0RiYgcnRNaW5SZWN0KTsKICAgQ0ZYX1JlY3RGIENhbGNNYXhUcmFja1JlY3QoY29uc3QgQ0ZYX1JlY3RGJiBydE1heFJlY3QpOwotICBGWF9GTE9BVCBHZXRUcmFja1BvaW50UG9zKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKKyAgZmxvYXQgR2V0VHJhY2tQb2ludFBvcyhjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7CiAKICAgYm9vbCBTZW5kRXZlbnQoKTsKLSAgYm9vbCBPblNjcm9sbChDRldMX0V2ZW50U2Nyb2xsOjpDb2RlIGR3Q29kZSwgRlhfRkxPQVQgZlBvcyk7CisgIGJvb2wgT25TY3JvbGwoQ0ZXTF9FdmVudFNjcm9sbDo6Q29kZSBkd0NvZGUsIGZsb2F0IGZQb3MpOwogICB2b2lkIE9uTEJ1dHRvbkRvd24oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOwogICB2b2lkIE9uTEJ1dHRvblVwKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKICAgdm9pZCBPbk1vdXNlTW92ZShjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7CiAgIHZvaWQgT25Nb3VzZUxlYXZlKCk7CiAgIHZvaWQgT25Nb3VzZVdoZWVsKGNvbnN0IENGWF9Qb2ludEYmIGRlbHRhKTsKLSAgYm9vbCBEb1Njcm9sbChDRldMX0V2ZW50U2Nyb2xsOjpDb2RlIGR3Q29kZSwgRlhfRkxPQVQgZlBvcyk7CisgIGJvb2wgRG9TY3JvbGwoQ0ZXTF9FdmVudFNjcm9sbDo6Q29kZSBkd0NvZGUsIGZsb2F0IGZQb3MpOwogICB2b2lkIERvTW91c2VEb3duKGludDMyX3QgaUl0ZW0sCiAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEl0ZW0sCiAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVN0YXRlLApAQCAtMTEwLDIyICsxMTAsMjIgQEAKICAgdm9pZCBEb01vdXNlSG92ZXIoaW50MzJfdCBpSXRlbSwgY29uc3QgQ0ZYX1JlY3RGJiBydEl0ZW0sIGludDMyX3QmIGlTdGF0ZSk7CiAKICAgQ0ZXTF9UaW1lckluZm8qIG1fcFRpbWVySW5mbzsKLSAgRlhfRkxPQVQgbV9mUmFuZ2VNaW47Ci0gIEZYX0ZMT0FUIG1fZlJhbmdlTWF4OwotICBGWF9GTE9BVCBtX2ZQYWdlU2l6ZTsKLSAgRlhfRkxPQVQgbV9mU3RlcFNpemU7Ci0gIEZYX0ZMT0FUIG1fZlBvczsKLSAgRlhfRkxPQVQgbV9mVHJhY2tQb3M7CisgIGZsb2F0IG1fZlJhbmdlTWluOworICBmbG9hdCBtX2ZSYW5nZU1heDsKKyAgZmxvYXQgbV9mUGFnZVNpemU7CisgIGZsb2F0IG1fZlN0ZXBTaXplOworICBmbG9hdCBtX2ZQb3M7CisgIGZsb2F0IG1fZlRyYWNrUG9zOwogICBpbnQzMl90IG1faU1pbkJ1dHRvblN0YXRlOwogICBpbnQzMl90IG1faU1heEJ1dHRvblN0YXRlOwogICBpbnQzMl90IG1faVRodW1iQnV0dG9uU3RhdGU7CiAgIGludDMyX3QgbV9pTWluVHJhY2tTdGF0ZTsKICAgaW50MzJfdCBtX2lNYXhUcmFja1N0YXRlOwotICBGWF9GTE9BVCBtX2ZMYXN0VHJhY2tQb3M7CisgIGZsb2F0IG1fZkxhc3RUcmFja1BvczsKICAgQ0ZYX1BvaW50RiBtX2NwVHJhY2tQb2ludDsKICAgaW50MzJfdCBtX2lNb3VzZVdoZWVsOwogICBib29sIG1fYk1vdXNlRG93bjsKLSAgRlhfRkxPQVQgbV9mQnV0dG9uTGVuOworICBmbG9hdCBtX2ZCdXR0b25MZW47CiAgIGJvb2wgbV9iTWluU2l6ZTsKICAgQ0ZYX1JlY3RGIG1fcnRDbGllbnQ7CiAgIENGWF9SZWN0RiBtX3J0VGh1bWI7CmRpZmYgLS1naXQgYS94ZmEvZndsL2Nmd2xfc3BpbmJ1dHRvbi5jcHAgYi94ZmEvZndsL2Nmd2xfc3BpbmJ1dHRvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNThiNjkuLjAwMDAwMDAKLS0tIGEveGZhL2Z3bC9jZndsX3NwaW5idXR0b24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9zcGluYnV0dG9uLmgiCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfZXZlbnQuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfbWVzc2FnZWtleS5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9tZXNzYWdlbW91c2UuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfbm90ZWRyaXZlci5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF90aGVtZWJhY2tncm91bmQuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfdGltZXJpbmZvLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX3dpZGdldHByb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2lmd2xfdGhlbWVwcm92aWRlci5oIgotCi1uYW1lc3BhY2UgewotY29uc3QgaW50IGtFbGFwc2VUaW1lID0gMjAwOwotCi19ICAvLyBuYW1lc3BhY2UKLQotQ0ZXTF9TcGluQnV0dG9uOjpDRldMX1NwaW5CdXR0b24oCi0gICAgY29uc3QgQ0ZXTF9BcHAqIGFwcCwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZXTF9XaWRnZXRQcm9wZXJ0aWVzPiBwcm9wZXJ0aWVzKQotICAgIDogQ0ZXTF9XaWRnZXQoYXBwLCBzdGQ6Om1vdmUocHJvcGVydGllcyksIG51bGxwdHIpLAotICAgICAgbV9kd1VwU3RhdGUoQ0ZXTF9QYXJ0U3RhdGVfTm9ybWFsKSwKLSAgICAgIG1fZHdEblN0YXRlKENGV0xfUGFydFN0YXRlX05vcm1hbCksCi0gICAgICBtX2lCdXR0b25JbmRleCgwKSwKLSAgICAgIG1fYkxCdXR0b25Ed24oZmFsc2UpLAotICAgICAgbV9wVGltZXJJbmZvKG51bGxwdHIpLAotICAgICAgbV9UaW1lcih0aGlzKSB7Ci0gIG1fcnRDbGllbnQuUmVzZXQoKTsKLSAgbV9ydFVwQnV0dG9uLlJlc2V0KCk7Ci0gIG1fcnREbkJ1dHRvbi5SZXNldCgpOwotICBtX3BQcm9wZXJ0aWVzLT5tX2R3U3R5bGVFeGVzIHw9IEZXTF9TVFlMRUVYRV9TUEJfVmVydDsKLX0KLQotQ0ZXTF9TcGluQnV0dG9uOjp+Q0ZXTF9TcGluQnV0dG9uKCkge30KLQotRldMX1R5cGUgQ0ZXTF9TcGluQnV0dG9uOjpHZXRDbGFzc0lEKCkgY29uc3QgewotICByZXR1cm4gRldMX1R5cGU6OlNwaW5CdXR0b247Ci19Ci0KLXZvaWQgQ0ZXTF9TcGluQnV0dG9uOjpVcGRhdGUoKSB7Ci0gIGlmIChJc0xvY2tlZCgpKQotICAgIHJldHVybjsKLQotICBtX3J0Q2xpZW50ID0gR2V0Q2xpZW50UmVjdCgpOwotICBpZiAobV9wUHJvcGVydGllcy0+bV9kd1N0eWxlRXhlcyAmIEZXTF9TVFlMRUVYRV9TUEJfVmVydCkgewotICAgIG1fcnRVcEJ1dHRvbiA9IENGWF9SZWN0RihtX3J0Q2xpZW50LnRvcCwgbV9ydENsaWVudC5sZWZ0LCBtX3J0Q2xpZW50LndpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LmhlaWdodCAvIDIpOwotICAgIG1fcnREbkJ1dHRvbiA9Ci0gICAgICAgIENGWF9SZWN0RihtX3J0Q2xpZW50LmxlZnQsIG1fcnRDbGllbnQudG9wICsgbV9ydENsaWVudC5oZWlnaHQgLyAyLAotICAgICAgICAgICAgICAgICAgbV9ydENsaWVudC53aWR0aCwgbV9ydENsaWVudC5oZWlnaHQgLyAyKTsKLSAgfSBlbHNlIHsKLSAgICBtX3J0VXBCdXR0b24gPSBDRlhfUmVjdEYobV9ydENsaWVudC5Ub3BMZWZ0KCksIG1fcnRDbGllbnQud2lkdGggLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3J0Q2xpZW50LmhlaWdodCk7Ci0gICAgbV9ydERuQnV0dG9uID0KLSAgICAgICAgQ0ZYX1JlY3RGKG1fcnRDbGllbnQubGVmdCArIG1fcnRDbGllbnQud2lkdGggLyAyLCBtX3J0Q2xpZW50LnRvcCwKLSAgICAgICAgICAgICAgICAgIG1fcnRDbGllbnQud2lkdGggLyAyLCBtX3J0Q2xpZW50LmhlaWdodCk7Ci0gIH0KLX0KLQotRldMX1dpZGdldEhpdCBDRldMX1NwaW5CdXR0b246OkhpdFRlc3QoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgaWYgKG1fcnRDbGllbnQuQ29udGFpbnMocG9pbnQpKQotICAgIHJldHVybiBGV0xfV2lkZ2V0SGl0OjpDbGllbnQ7Ci0gIGlmIChIYXNCb3JkZXIoKSAmJiAobV9ydENsaWVudC5Db250YWlucyhwb2ludCkpKQotICAgIHJldHVybiBGV0xfV2lkZ2V0SGl0OjpCb3JkZXI7Ci0gIGlmIChtX3J0VXBCdXR0b24uQ29udGFpbnMocG9pbnQpKQotICAgIHJldHVybiBGV0xfV2lkZ2V0SGl0OjpVcEJ1dHRvbjsKLSAgaWYgKG1fcnREbkJ1dHRvbi5Db250YWlucyhwb2ludCkpCi0gICAgcmV0dXJuIEZXTF9XaWRnZXRIaXQ6OkRvd25CdXR0b247Ci0gIHJldHVybiBGV0xfV2lkZ2V0SGl0OjpVbmtub3duOwotfQotCi12b2lkIENGV0xfU3BpbkJ1dHRvbjo6RHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgaWYgKCFwR3JhcGhpY3MpCi0gICAgcmV0dXJuOwotCi0gIENGWF9SZWN0RiBydENsaXAobV9ydENsaWVudCk7Ci0gIGlmIChwTWF0cml4KQotICAgIHBNYXRyaXgtPlRyYW5zZm9ybVJlY3QocnRDbGlwKTsKLQotICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSA9IEdldEF2YWlsYWJsZVRoZW1lKCk7Ci0gIGlmIChIYXNCb3JkZXIoKSkKLSAgICBEcmF3Qm9yZGVyKHBHcmFwaGljcywgQ0ZXTF9QYXJ0OjpCb3JkZXIsIHBUaGVtZSwgcE1hdHJpeCk7Ci0KLSAgRHJhd1VwQnV0dG9uKHBHcmFwaGljcywgcFRoZW1lLCBwTWF0cml4KTsKLSAgRHJhd0Rvd25CdXR0b24ocEdyYXBoaWNzLCBwVGhlbWUsIHBNYXRyaXgpOwotfQotCi12b2lkIENGV0xfU3BpbkJ1dHRvbjo6RGlzYWJsZUJ1dHRvbigpIHsKLSAgbV9kd0RuU3RhdGUgPSBDRldMX1BhcnRTdGF0ZV9EaXNhYmxlZDsKLX0KLQotYm9vbCBDRldMX1NwaW5CdXR0b246OklzVXBCdXR0b25FbmFibGVkKCkgewotICByZXR1cm4gbV9kd1VwU3RhdGUgIT0gQ0ZXTF9QYXJ0U3RhdGVfRGlzYWJsZWQ7Ci19Ci0KLWJvb2wgQ0ZXTF9TcGluQnV0dG9uOjpJc0Rvd25CdXR0b25FbmFibGVkKCkgewotICByZXR1cm4gbV9kd0RuU3RhdGUgIT0gQ0ZXTF9QYXJ0U3RhdGVfRGlzYWJsZWQ7Ci19Ci0KLXZvaWQgQ0ZXTF9TcGluQnV0dG9uOjpEcmF3VXBCdXR0b24oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7Ci0gIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtczsKLSAgcGFyYW1zLm1fcFdpZGdldCA9IHRoaXM7Ci0gIHBhcmFtcy5tX2lQYXJ0ID0gQ0ZXTF9QYXJ0OjpVcEJ1dHRvbjsKLSAgcGFyYW1zLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOwotICBwYXJhbXMubV9kd1N0YXRlcyA9IG1fZHdVcFN0YXRlICsgMTsKLSAgaWYgKHBNYXRyaXgpCi0gICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7Ci0KLSAgcGFyYW1zLm1fcnRQYXJ0ID0gbV9ydFVwQnV0dG9uOwotICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbXMpOwotfQotCi12b2lkIENGV0xfU3BpbkJ1dHRvbjo6RHJhd0Rvd25CdXR0b24oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBDRldMX1RoZW1lQmFja2dyb3VuZCBwYXJhbXM7Ci0gIHBhcmFtcy5tX3BXaWRnZXQgPSB0aGlzOwotICBwYXJhbXMubV9pUGFydCA9IENGV0xfUGFydDo6RG93bkJ1dHRvbjsKLSAgcGFyYW1zLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOwotICBwYXJhbXMubV9kd1N0YXRlcyA9IG1fZHdEblN0YXRlICsgMTsKLSAgaWYgKHBNYXRyaXgpCi0gICAgcGFyYW1zLm1fbWF0cml4LkNvbmNhdCgqcE1hdHJpeCk7Ci0KLSAgcGFyYW1zLm1fcnRQYXJ0ID0gbV9ydERuQnV0dG9uOwotICBwVGhlbWUtPkRyYXdCYWNrZ3JvdW5kKCZwYXJhbXMpOwotfQotCi12b2lkIENGV0xfU3BpbkJ1dHRvbjo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7Ci0gIGlmICghcE1lc3NhZ2UpCi0gICAgcmV0dXJuOwotCi0gIHN3aXRjaCAocE1lc3NhZ2UtPkdldFR5cGUoKSkgewotICAgIGNhc2UgQ0ZXTF9NZXNzYWdlOjpUeXBlOjpTZXRGb2N1czogewotICAgICAgT25Gb2N1c0NoYW5nZWQocE1lc3NhZ2UsIHRydWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQ0ZXTF9NZXNzYWdlOjpUeXBlOjpLaWxsRm9jdXM6IHsKLSAgICAgIE9uRm9jdXNDaGFuZ2VkKHBNZXNzYWdlLCBmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBDRldMX01lc3NhZ2U6OlR5cGU6Ok1vdXNlOiB7Ci0gICAgICBDRldMX01lc3NhZ2VNb3VzZSogcE1zZyA9IHN0YXRpY19jYXN0PENGV0xfTWVzc2FnZU1vdXNlKj4ocE1lc3NhZ2UpOwotICAgICAgc3dpdGNoIChwTXNnLT5tX2R3Q21kKSB7Ci0gICAgICAgIGNhc2UgRldMX01vdXNlQ29tbWFuZDo6TGVmdEJ1dHRvbkRvd246Ci0gICAgICAgICAgT25MQnV0dG9uRG93bihwTXNnKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGV0xfTW91c2VDb21tYW5kOjpMZWZ0QnV0dG9uVXA6Ci0gICAgICAgICAgT25MQnV0dG9uVXAocE1zZyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRldMX01vdXNlQ29tbWFuZDo6TW92ZToKLSAgICAgICAgICBPbk1vdXNlTW92ZShwTXNnKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGV0xfTW91c2VDb21tYW5kOjpMZWF2ZToKLSAgICAgICAgICBPbk1vdXNlTGVhdmUocE1zZyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBDRldMX01lc3NhZ2U6OlR5cGU6OktleTogewotICAgICAgQ0ZXTF9NZXNzYWdlS2V5KiBwS2V5ID0gc3RhdGljX2Nhc3Q8Q0ZXTF9NZXNzYWdlS2V5Kj4ocE1lc3NhZ2UpOwotICAgICAgaWYgKHBLZXktPm1fZHdDbWQgPT0gRldMX0tleUNvbW1hbmQ6OktleURvd24pCi0gICAgICAgIE9uS2V5RG93bihwS2V5KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLSAgQ0ZXTF9XaWRnZXQ6Ok9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOwotfQotCi12b2lkIENGV0xfU3BpbkJ1dHRvbjo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7Ci0gIERyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsKLX0KLQotdm9pZCBDRldMX1NwaW5CdXR0b246Ok9uRm9jdXNDaGFuZ2VkKENGV0xfTWVzc2FnZSogcE1zZywgYm9vbCBiU2V0KSB7Ci0gIGlmIChiU2V0KQotICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgfD0gKEZXTF9XR1RTVEFURV9Gb2N1c2VkKTsKLSAgZWxzZQotICAgIG1fcFByb3BlcnRpZXMtPm1fZHdTdGF0ZXMgJj0gfihGV0xfV0dUU1RBVEVfRm9jdXNlZCk7Ci0KLSAgUmVwYWludFJlY3QobV9ydENsaWVudCk7Ci19Ci0KLXZvaWQgQ0ZXTF9TcGluQnV0dG9uOjpPbkxCdXR0b25Eb3duKENGV0xfTWVzc2FnZU1vdXNlKiBwTXNnKSB7Ci0gIG1fYkxCdXR0b25Ed24gPSB0cnVlOwotICBTZXRHcmFiKHRydWUpOwotICBTZXRGb2N1cyh0cnVlKTsKLQotICBib29sIGJVcFByZXNzID0gbV9ydFVwQnV0dG9uLkNvbnRhaW5zKHBNc2ctPm1fcG9zKSAmJiBJc1VwQnV0dG9uRW5hYmxlZCgpOwotICBib29sIGJEblByZXNzID0gbV9ydERuQnV0dG9uLkNvbnRhaW5zKHBNc2ctPm1fcG9zKSAmJiBJc0Rvd25CdXR0b25FbmFibGVkKCk7Ci0gIGlmICghYlVwUHJlc3MgJiYgIWJEblByZXNzKQotICAgIHJldHVybjsKLSAgaWYgKGJVcFByZXNzKSB7Ci0gICAgbV9pQnV0dG9uSW5kZXggPSAwOwotICAgIG1fZHdVcFN0YXRlID0gQ0ZXTF9QYXJ0U3RhdGVfUHJlc3NlZDsKLSAgfQotICBpZiAoYkRuUHJlc3MpIHsKLSAgICBtX2lCdXR0b25JbmRleCA9IDE7Ci0gICAgbV9kd0RuU3RhdGUgPSBDRldMX1BhcnRTdGF0ZV9QcmVzc2VkOwotICB9Ci0KLSAgQ0ZXTF9FdmVudCB3bVBvc0NoYW5nZWQoQ0ZXTF9FdmVudDo6VHlwZTo6Q2xpY2ssIHRoaXMpOwotICBEaXNwYXRjaEV2ZW50KCZ3bVBvc0NoYW5nZWQpOwotCi0gIFJlcGFpbnRSZWN0KGJVcFByZXNzID8gbV9ydFVwQnV0dG9uIDogbV9ydERuQnV0dG9uKTsKLSAgbV9wVGltZXJJbmZvID0gbV9UaW1lci5TdGFydFRpbWVyKGtFbGFwc2VUaW1lLCB0cnVlKTsKLX0KLQotdm9pZCBDRldMX1NwaW5CdXR0b246Ok9uTEJ1dHRvblVwKENGV0xfTWVzc2FnZU1vdXNlKiBwTXNnKSB7Ci0gIGlmIChtX3BQcm9wZXJ0aWVzLT5tX2R3U3RhdGVzICYgQ0ZXTF9QYXJ0U3RhdGVfRGlzYWJsZWQpCi0gICAgcmV0dXJuOwotCi0gIG1fYkxCdXR0b25Ed24gPSBmYWxzZTsKLSAgU2V0R3JhYihmYWxzZSk7Ci0gIFNldEZvY3VzKGZhbHNlKTsKLSAgaWYgKG1fcFRpbWVySW5mbykgewotICAgIG1fcFRpbWVySW5mby0+U3RvcFRpbWVyKCk7Ci0gICAgbV9wVGltZXJJbmZvID0gbnVsbHB0cjsKLSAgfQotICBib29sIGJSZXBhaW50ID0gZmFsc2U7Ci0gIENGWF9SZWN0RiBydEludmFsaWRhdGU7Ci0gIGlmIChtX2R3VXBTdGF0ZSA9PSBDRldMX1BhcnRTdGF0ZV9QcmVzc2VkICYmIElzVXBCdXR0b25FbmFibGVkKCkpIHsKLSAgICBtX2R3VXBTdGF0ZSA9IENGV0xfUGFydFN0YXRlX05vcm1hbDsKLSAgICBiUmVwYWludCA9IHRydWU7Ci0gICAgcnRJbnZhbGlkYXRlID0gbV9ydFVwQnV0dG9uOwotICB9IGVsc2UgaWYgKG1fZHdEblN0YXRlID09IENGV0xfUGFydFN0YXRlX1ByZXNzZWQgJiYgSXNEb3duQnV0dG9uRW5hYmxlZCgpKSB7Ci0gICAgbV9kd0RuU3RhdGUgPSBDRldMX1BhcnRTdGF0ZV9Ob3JtYWw7Ci0gICAgYlJlcGFpbnQgPSB0cnVlOwotICAgIHJ0SW52YWxpZGF0ZSA9IG1fcnREbkJ1dHRvbjsKLSAgfQotICBpZiAoYlJlcGFpbnQpCi0gICAgUmVwYWludFJlY3QocnRJbnZhbGlkYXRlKTsKLX0KLQotdm9pZCBDRldMX1NwaW5CdXR0b246Ok9uTW91c2VNb3ZlKENGV0xfTWVzc2FnZU1vdXNlKiBwTXNnKSB7Ci0gIGlmIChtX2JMQnV0dG9uRHduKQotICAgIHJldHVybjsKLQotICBib29sIGJSZXBhaW50ID0gZmFsc2U7Ci0gIENGWF9SZWN0RiBydEludmxpZGF0ZTsKLSAgaWYgKG1fcnRVcEJ1dHRvbi5Db250YWlucyhwTXNnLT5tX3BvcykpIHsKLSAgICBpZiAoSXNVcEJ1dHRvbkVuYWJsZWQoKSkgewotICAgICAgaWYgKG1fZHdVcFN0YXRlID09IENGV0xfUGFydFN0YXRlX0hvdmVyZWQpIHsKLSAgICAgICAgbV9kd1VwU3RhdGUgPSBDRldMX1BhcnRTdGF0ZV9Ib3ZlcmVkOwotICAgICAgICBiUmVwYWludCA9IHRydWU7Ci0gICAgICAgIHJ0SW52bGlkYXRlID0gbV9ydFVwQnV0dG9uOwotICAgICAgfQotICAgICAgaWYgKG1fZHdEblN0YXRlICE9IENGV0xfUGFydFN0YXRlX05vcm1hbCAmJiBJc0Rvd25CdXR0b25FbmFibGVkKCkpIHsKLSAgICAgICAgbV9kd0RuU3RhdGUgPSBDRldMX1BhcnRTdGF0ZV9Ob3JtYWw7Ci0gICAgICAgIGlmIChiUmVwYWludCkKLSAgICAgICAgICBydEludmxpZGF0ZS5VbmlvbihtX3J0RG5CdXR0b24pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcnRJbnZsaWRhdGUgPSBtX3J0RG5CdXR0b247Ci0KLSAgICAgICAgYlJlcGFpbnQgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoIUlzRG93bkJ1dHRvbkVuYWJsZWQoKSkKLSAgICAgIERpc2FibGVCdXR0b24oKTsKLQotICB9IGVsc2UgaWYgKG1fcnREbkJ1dHRvbi5Db250YWlucyhwTXNnLT5tX3BvcykpIHsKLSAgICBpZiAoSXNEb3duQnV0dG9uRW5hYmxlZCgpKSB7Ci0gICAgICBpZiAobV9kd0RuU3RhdGUgIT0gQ0ZXTF9QYXJ0U3RhdGVfSG92ZXJlZCkgewotICAgICAgICBtX2R3RG5TdGF0ZSA9IENGV0xfUGFydFN0YXRlX0hvdmVyZWQ7Ci0gICAgICAgIGJSZXBhaW50ID0gdHJ1ZTsKLSAgICAgICAgcnRJbnZsaWRhdGUgPSBtX3J0RG5CdXR0b247Ci0gICAgICB9Ci0gICAgICBpZiAobV9kd1VwU3RhdGUgIT0gQ0ZXTF9QYXJ0U3RhdGVfTm9ybWFsICYmIElzVXBCdXR0b25FbmFibGVkKCkpIHsKLSAgICAgICAgbV9kd1VwU3RhdGUgPSBDRldMX1BhcnRTdGF0ZV9Ob3JtYWw7Ci0gICAgICAgIGlmIChiUmVwYWludCkKLSAgICAgICAgICBydEludmxpZGF0ZS5VbmlvbihtX3J0VXBCdXR0b24pOwotICAgICAgICBlbHNlCi0gICAgICAgICAgcnRJbnZsaWRhdGUgPSBtX3J0VXBCdXR0b247Ci0gICAgICAgIGJSZXBhaW50ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZiAobV9kd1VwU3RhdGUgIT0gQ0ZXTF9QYXJ0U3RhdGVfTm9ybWFsIHx8Ci0gICAgICAgICAgICAgbV9kd0RuU3RhdGUgIT0gQ0ZXTF9QYXJ0U3RhdGVfTm9ybWFsKSB7Ci0gICAgaWYgKG1fZHdVcFN0YXRlICE9IENGV0xfUGFydFN0YXRlX05vcm1hbCkgewotICAgICAgbV9kd1VwU3RhdGUgPSBDRldMX1BhcnRTdGF0ZV9Ob3JtYWw7Ci0gICAgICBiUmVwYWludCA9IHRydWU7Ci0gICAgICBydEludmxpZGF0ZSA9IG1fcnRVcEJ1dHRvbjsKLSAgICB9Ci0gICAgaWYgKG1fZHdEblN0YXRlICE9IENGV0xfUGFydFN0YXRlX05vcm1hbCkgewotICAgICAgbV9kd0RuU3RhdGUgPSBDRldMX1BhcnRTdGF0ZV9Ob3JtYWw7Ci0gICAgICBpZiAoYlJlcGFpbnQpCi0gICAgICAgIHJ0SW52bGlkYXRlLlVuaW9uKG1fcnREbkJ1dHRvbik7Ci0gICAgICBlbHNlCi0gICAgICAgIHJ0SW52bGlkYXRlID0gbV9ydERuQnV0dG9uOwotCi0gICAgICBiUmVwYWludCA9IHRydWU7Ci0gICAgfQotICB9Ci0gIGlmIChiUmVwYWludCkKLSAgICBSZXBhaW50UmVjdChydEludmxpZGF0ZSk7Ci19Ci0KLXZvaWQgQ0ZXTF9TcGluQnV0dG9uOjpPbk1vdXNlTGVhdmUoQ0ZXTF9NZXNzYWdlTW91c2UqIHBNc2cpIHsKLSAgaWYgKCFwTXNnKQotICAgIHJldHVybjsKLSAgaWYgKG1fZHdVcFN0YXRlICE9IENGV0xfUGFydFN0YXRlX05vcm1hbCAmJiBJc1VwQnV0dG9uRW5hYmxlZCgpKQotICAgIG1fZHdVcFN0YXRlID0gQ0ZXTF9QYXJ0U3RhdGVfTm9ybWFsOwotICBpZiAobV9kd0RuU3RhdGUgIT0gQ0ZXTF9QYXJ0U3RhdGVfTm9ybWFsICYmIElzRG93bkJ1dHRvbkVuYWJsZWQoKSkKLSAgICBtX2R3RG5TdGF0ZSA9IENGV0xfUGFydFN0YXRlX05vcm1hbDsKLQotICBSZXBhaW50UmVjdChtX3J0Q2xpZW50KTsKLX0KLQotdm9pZCBDRldMX1NwaW5CdXR0b246Ok9uS2V5RG93bihDRldMX01lc3NhZ2VLZXkqIHBNc2cpIHsKLSAgYm9vbCBiVXAgPQotICAgICAgcE1zZy0+bV9kd0tleUNvZGUgPT0gRldMX1ZLRVlfVXAgfHwgcE1zZy0+bV9kd0tleUNvZGUgPT0gRldMX1ZLRVlfTGVmdDsKLSAgYm9vbCBiRG93biA9Ci0gICAgICBwTXNnLT5tX2R3S2V5Q29kZSA9PSBGV0xfVktFWV9Eb3duIHx8IHBNc2ctPm1fZHdLZXlDb2RlID09IEZXTF9WS0VZX1JpZ2h0OwotICBpZiAoIWJVcCAmJiAhYkRvd24pCi0gICAgcmV0dXJuOwotCi0gIGJvb2wgYlVwRW5hYmxlID0gSXNVcEJ1dHRvbkVuYWJsZWQoKTsKLSAgYm9vbCBiRG93bkVuYWJsZSA9IElzRG93bkJ1dHRvbkVuYWJsZWQoKTsKLSAgaWYgKCFiVXBFbmFibGUgJiYgIWJEb3duRW5hYmxlKQotICAgIHJldHVybjsKLQotICBDRldMX0V2ZW50IHdtUG9zQ2hhbmdlZChDRldMX0V2ZW50OjpUeXBlOjpDbGljaywgdGhpcyk7Ci0gIERpc3BhdGNoRXZlbnQoJndtUG9zQ2hhbmdlZCk7Ci0KLSAgUmVwYWludFJlY3QoYlVwRW5hYmxlID8gbV9ydFVwQnV0dG9uIDogbV9ydERuQnV0dG9uKTsKLX0KLQotQ0ZXTF9TcGluQnV0dG9uOjpUaW1lcjo6VGltZXIoQ0ZXTF9TcGluQnV0dG9uKiBwVG9vbFRpcCkKLSAgICA6IENGV0xfVGltZXIocFRvb2xUaXApIHt9Ci0KLXZvaWQgQ0ZXTF9TcGluQnV0dG9uOjpUaW1lcjo6UnVuKENGV0xfVGltZXJJbmZvKiBwVGltZXJJbmZvKSB7Ci0gIENGV0xfU3BpbkJ1dHRvbiogcEJ1dHRvbiA9IHN0YXRpY19jYXN0PENGV0xfU3BpbkJ1dHRvbio+KG1fcFdpZGdldCk7Ci0KLSAgaWYgKCFwQnV0dG9uLT5tX3BUaW1lckluZm8pCi0gICAgcmV0dXJuOwotCi0gIENGV0xfRXZlbnQgd21Qb3NDaGFuZ2VkKENGV0xfRXZlbnQ6OlR5cGU6OkNsaWNrLCBwQnV0dG9uKTsKLSAgcEJ1dHRvbi0+RGlzcGF0Y2hFdmVudCgmd21Qb3NDaGFuZ2VkKTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9md2wvY2Z3bF9zcGluYnV0dG9uLmggYi94ZmEvZndsL2Nmd2xfc3BpbmJ1dHRvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2RhNzYxLi4wMDAwMDAwCi0tLSBhL3hmYS9md2wvY2Z3bF9zcGluYnV0dG9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZXTF9DRldMX1NQSU5CVVRUT05fSF8KLSNkZWZpbmUgWEZBX0ZXTF9DRldMX1NQSU5CVVRUT05fSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF90aW1lci5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF93aWRnZXQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uaCIKLQotI2RlZmluZSBGV0xfU1RZTEVFWEVfU1BCX1ZlcnQgKDFMIDw8IDApCi0KLWNsYXNzIENGV0xfTWVzc2FnZU1vdXNlOwotY2xhc3MgQ0ZXTF9XaWRnZXRQcm9wZXJ0aWVzOwotCi1jbGFzcyBDRldMX1NwaW5CdXR0b24gOiBwdWJsaWMgQ0ZXTF9XaWRnZXQgewotIHB1YmxpYzoKLSAgQ0ZXTF9TcGluQnV0dG9uKGNvbnN0IENGV0xfQXBwKiBhcHAsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZXTF9XaWRnZXRQcm9wZXJ0aWVzPiBwcm9wZXJ0aWVzKTsKLSAgfkNGV0xfU3BpbkJ1dHRvbigpIG92ZXJyaWRlOwotCi0gIC8vIENGV0xfV2lkZ2V0Ci0gIEZXTF9UeXBlIEdldENsYXNzSUQoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBVcGRhdGUoKSBvdmVycmlkZTsKLSAgRldMX1dpZGdldEhpdCBIaXRUZXN0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKLSAgdm9pZCBEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLCBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSBvdmVycmlkZTsKLSAgdm9pZCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIG92ZXJyaWRlOwotICB2b2lkIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBjbGFzcyBUaW1lciA6IHB1YmxpYyBDRldMX1RpbWVyIHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBUaW1lcihDRldMX1NwaW5CdXR0b24qIHBUb29sVGlwKTsKLSAgICB+VGltZXIoKSBvdmVycmlkZSB7fQotCi0gICAgdm9pZCBSdW4oQ0ZXTF9UaW1lckluZm8qIHBUaW1lckluZm8pIG92ZXJyaWRlOwotICB9OwotICBmcmllbmQgY2xhc3MgQ0ZXTF9TcGluQnV0dG9uOjpUaW1lcjsKLQotICB2b2lkIERpc2FibGVCdXR0b24oKTsKLSAgYm9vbCBJc1VwQnV0dG9uRW5hYmxlZCgpOwotICBib29sIElzRG93bkJ1dHRvbkVuYWJsZWQoKTsKLSAgdm9pZCBEcmF3VXBCdXR0b24oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKLSAgdm9pZCBEcmF3RG93bkJ1dHRvbihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KTsKLSAgdm9pZCBPbkZvY3VzQ2hhbmdlZChDRldMX01lc3NhZ2UqIHBNc2csIGJvb2wgYlNldCk7Ci0gIHZvaWQgT25MQnV0dG9uRG93bihDRldMX01lc3NhZ2VNb3VzZSogcE1zZyk7Ci0gIHZvaWQgT25MQnV0dG9uVXAoQ0ZXTF9NZXNzYWdlTW91c2UqIHBNc2cpOwotICB2b2lkIE9uTW91c2VNb3ZlKENGV0xfTWVzc2FnZU1vdXNlKiBwTXNnKTsKLSAgdm9pZCBPbk1vdXNlTGVhdmUoQ0ZXTF9NZXNzYWdlTW91c2UqIHBNc2cpOwotICB2b2lkIE9uS2V5RG93bihDRldMX01lc3NhZ2VLZXkqIHBNc2cpOwotCi0gIENGWF9SZWN0RiBtX3J0Q2xpZW50OwotICBDRlhfUmVjdEYgbV9ydFVwQnV0dG9uOwotICBDRlhfUmVjdEYgbV9ydERuQnV0dG9uOwotICB1aW50MzJfdCBtX2R3VXBTdGF0ZTsKLSAgdWludDMyX3QgbV9kd0RuU3RhdGU7Ci0gIGludDMyX3QgbV9pQnV0dG9uSW5kZXg7Ci0gIGJvb2wgbV9iTEJ1dHRvbkR3bjsKLSAgQ0ZXTF9UaW1lckluZm8qIG1fcFRpbWVySW5mbzsKLSAgQ0ZXTF9TcGluQnV0dG9uOjpUaW1lciBtX1RpbWVyOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRldMX0NGV0xfU1BJTkJVVFRPTl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z3bC9jZndsX3RoZW1lYmFja2dyb3VuZC5oIGIveGZhL2Z3bC9jZndsX3RoZW1lYmFja2dyb3VuZC5oCmluZGV4IDNmMjA0ODguLjg1NDM1YWEgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvY2Z3bF90aGVtZWJhY2tncm91bmQuaAorKysgYi94ZmEvZndsL2Nmd2xfdGhlbWViYWNrZ3JvdW5kLmgKQEAgLTcsMjEgKzcsMjMgQEAKICNpZm5kZWYgWEZBX0ZXTF9DRldMX1RIRU1FQkFDS0dST1VORF9IXwogI2RlZmluZSBYRkFfRldMX0NGV0xfVEhFTUVCQUNLR1JPVU5EX0hfCiAKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3RoZW1lcGFydC5oIgogCi1jbGFzcyBDRlhfRElCaXRtcGE7Ci1jbGFzcyBDRlhfR3JhcGhpY3M7Ci1jbGFzcyBDRlhfUGF0aDsKK2NsYXNzIENYRkFfR3JhcGhpY3M7CitjbGFzcyBDWEZBX0dFUGF0aDsKIAogY2xhc3MgQ0ZXTF9UaGVtZUJhY2tncm91bmQgOiBwdWJsaWMgQ0ZXTF9UaGVtZVBhcnQgewogIHB1YmxpYzoKLSAgQ0ZXTF9UaGVtZUJhY2tncm91bmQoKQotICAgICAgOiBtX3BHcmFwaGljcyhudWxscHRyKSwgbV9wSW1hZ2UobnVsbHB0ciksIG1fcFBhdGgobnVsbHB0cikge30KKyAgQ0ZXTF9UaGVtZUJhY2tncm91bmQoKTsKKyAgfkNGV0xfVGhlbWVCYWNrZ3JvdW5kKCk7CiAKLSAgQ0ZYX0dyYXBoaWNzKiBtX3BHcmFwaGljczsKLSAgQ0ZYX0RJQml0bWFwKiBtX3BJbWFnZTsKLSAgQ0ZYX1BhdGgqIG1fcFBhdGg7CisgIENYRkFfR3JhcGhpY3MqIG1fcEdyYXBoaWNzOworICBDWEZBX0dFUGF0aCogbV9wUGF0aDsKIH07CiAKK2lubGluZSBDRldMX1RoZW1lQmFja2dyb3VuZDo6Q0ZXTF9UaGVtZUJhY2tncm91bmQoKQorICAgIDogbV9wR3JhcGhpY3MobnVsbHB0ciksIG1fcFBhdGgobnVsbHB0cikge30KKworaW5saW5lIENGV0xfVGhlbWVCYWNrZ3JvdW5kOjp+Q0ZXTF9UaGVtZUJhY2tncm91bmQoKSB7fQorCiAjZW5kaWYgIC8vIFhGQV9GV0xfQ0ZXTF9USEVNRUJBQ0tHUk9VTkRfSF8KZGlmZiAtLWdpdCBhL3hmYS9md2wvY2Z3bF90aGVtZXRleHQuaCBiL3hmYS9md2wvY2Z3bF90aGVtZXRleHQuaAppbmRleCA2Y2JjNDY1Li45MWEzZjM4IDEwMDY0NAotLS0gYS94ZmEvZndsL2Nmd2xfdGhlbWV0ZXh0LmgKKysrIGIveGZhL2Z3bC9jZndsX3RoZW1ldGV4dC5oCkBAIC0xNSwxMCArMTUsMTAgQEAKICBwdWJsaWM6CiAgIENGV0xfVGhlbWVUZXh0KCkgOiBtX3BHcmFwaGljcyhudWxscHRyKSB7fQogCi0gIENGWF9XaWRlU3RyaW5nIG1fd3NUZXh0OwotICB1aW50MzJfdCBtX2R3VFRPU3R5bGVzOwotICBpbnQzMl90IG1faVRUT0FsaWduOwotICBDRlhfR3JhcGhpY3MqIG1fcEdyYXBoaWNzOworICBXaWRlU3RyaW5nIG1fd3NUZXh0OworICBGREVfVGV4dFN0eWxlIG1fZHdUVE9TdHlsZXM7CisgIEZERV9UZXh0QWxpZ25tZW50IG1faVRUT0FsaWduOworICBDWEZBX0dyYXBoaWNzKiBtX3BHcmFwaGljczsKIH07CiAKICNlbmRpZiAgLy8gWEZBX0ZXTF9DRldMX1RIRU1FVEVYVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z3bC9jZndsX3RpbWVyLmNwcCBiL3hmYS9md2wvY2Z3bF90aW1lci5jcHAKaW5kZXggYzcyMTRhNC4uMjczNGU0OSAxMDA2NDQKLS0tIGEveGZhL2Z3bC9jZndsX3RpbWVyLmNwcAorKysgYi94ZmEvZndsL2Nmd2xfdGltZXIuY3BwCkBAIC0xMCw3ICsxMCwxMSBAQAogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF90aW1lcmluZm8uaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfd2lkZ2V0LmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9pZndsX2FkYXB0ZXJ0aW1lcm1nci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmFwcC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZhcHAuaCIKKworQ0ZXTF9UaW1lcjo6Q0ZXTF9UaW1lcihDRldMX1dpZGdldCogcGFyZW50KSA6IG1fcFdpZGdldChwYXJlbnQpIHt9CisKK0NGV0xfVGltZXI6On5DRldMX1RpbWVyKCkge30KIAogQ0ZXTF9UaW1lckluZm8qIENGV0xfVGltZXI6OlN0YXJ0VGltZXIodWludDMyX3QgZHdFbGFwc2UsIGJvb2wgYkltbWVkaWF0ZWx5KSB7CiAgIGNvbnN0IENGV0xfQXBwKiBwQXBwID0gbV9wV2lkZ2V0LT5HZXRPd25lckFwcCgpOwpkaWZmIC0tZ2l0IGEveGZhL2Z3bC9jZndsX3RpbWVyLmggYi94ZmEvZndsL2Nmd2xfdGltZXIuaAppbmRleCA2YzkwNzlhLi5kYTFiNDQzIDEwMDY0NAotLS0gYS94ZmEvZndsL2Nmd2xfdGltZXIuaAorKysgYi94ZmEvZndsL2Nmd2xfdGltZXIuaApAQCAtOCwyMCArOCwyMSBAQAogI2RlZmluZSBYRkFfRldMX0NGV0xfVElNRVJfSF8KIAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogCiBjbGFzcyBDRldMX1RpbWVySW5mbzsKIGNsYXNzIENGV0xfV2lkZ2V0OwogCiBjbGFzcyBDRldMX1RpbWVyIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IENGV0xfVGltZXIoQ0ZXTF9XaWRnZXQqIHBhcmVudCkgOiBtX3BXaWRnZXQocGFyZW50KSB7fQotICB2aXJ0dWFsIH5DRldMX1RpbWVyKCkge30KKyAgZXhwbGljaXQgQ0ZXTF9UaW1lcihDRldMX1dpZGdldCogcGFyZW50KTsKKyAgdmlydHVhbCB+Q0ZXTF9UaW1lcigpOwogCiAgIHZpcnR1YWwgdm9pZCBSdW4oQ0ZXTF9UaW1lckluZm8qIGhUaW1lcikgPSAwOwogICBDRldMX1RpbWVySW5mbyogU3RhcnRUaW1lcih1aW50MzJfdCBkd0VsYXBzZSwgYm9vbCBiSW1tZWRpYXRlbHkpOwogCiAgcHJvdGVjdGVkOgotICBDRldMX1dpZGdldCogbV9wV2lkZ2V0OyAgLy8gTm90IG93bmVkLgorICBVbm93bmVkUHRyPENGV0xfV2lkZ2V0PiBtX3BXaWRnZXQ7CiB9OwogCiAjZW5kaWYgIC8vIFhGQV9GV0xfQ0ZXTF9USU1FUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z3bC9jZndsX3RpbWVyaW5mby5jcHAgYi94ZmEvZndsL2Nmd2xfdGltZXJpbmZvLmNwcAppbmRleCA4YzdhYWViLi5lZTQ3NDZhIDEwMDY0NAotLS0gYS94ZmEvZndsL2Nmd2xfdGltZXJpbmZvLmNwcAorKysgYi94ZmEvZndsL2Nmd2xfdGltZXJpbmZvLmNwcApAQCAtOCw2ICs4LDEyIEBACiAKICNpbmNsdWRlICJ4ZmEvZndsL2lmd2xfYWRhcHRlcnRpbWVybWdyLmgiCiAKK0NGV0xfVGltZXJJbmZvOjpDRldMX1RpbWVySW5mbyhJRldMX0FkYXB0ZXJUaW1lck1nciogbWdyKSA6IG1fcE1ncihtZ3IpIHsKKyAgQVNTRVJUKG1ncik7Cit9CisKK0NGV0xfVGltZXJJbmZvOjp+Q0ZXTF9UaW1lckluZm8oKSB7fQorCiB2b2lkIENGV0xfVGltZXJJbmZvOjpTdG9wVGltZXIoKSB7CiAgIG1fcE1nci0+U3RvcCh0aGlzKTsKIH0KZGlmZiAtLWdpdCBhL3hmYS9md2wvY2Z3bF90aW1lcmluZm8uaCBiL3hmYS9md2wvY2Z3bF90aW1lcmluZm8uaAppbmRleCBhNDdmZWRlLi5jNThiY2ZmIDEwMDY0NAotLS0gYS94ZmEvZndsL2Nmd2xfdGltZXJpbmZvLmgKKysrIGIveGZhL2Z3bC9jZndsX3RpbWVyaW5mby5oCkBAIC04LDIwICs4LDE5IEBACiAjZGVmaW5lIFhGQV9GV0xfQ0ZXTF9USU1FUklORk9fSF8KIAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogCiBjbGFzcyBJRldMX0FkYXB0ZXJUaW1lck1ncjsKIAogY2xhc3MgQ0ZXTF9UaW1lckluZm8gewogIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0ZXTF9UaW1lckluZm8oSUZXTF9BZGFwdGVyVGltZXJNZ3IqIG1ncikgOiBtX3BNZ3IobWdyKSB7Ci0gICAgQVNTRVJUKG1ncik7Ci0gIH0KLSAgdmlydHVhbCB+Q0ZXTF9UaW1lckluZm8oKSB7fQorICBleHBsaWNpdCBDRldMX1RpbWVySW5mbyhJRldMX0FkYXB0ZXJUaW1lck1nciogbWdyKTsKKyAgdmlydHVhbCB+Q0ZXTF9UaW1lckluZm8oKTsKIAogICB2b2lkIFN0b3BUaW1lcigpOwogCiAgcHJpdmF0ZToKLSAgSUZXTF9BZGFwdGVyVGltZXJNZ3IqIG1fcE1ncjsgIC8vIE5vdCBvd25lZC4KKyAgVW5vd25lZFB0cjxJRldMX0FkYXB0ZXJUaW1lck1ncj4gbV9wTWdyOwogfTsKIAogI2VuZGlmICAvLyBYRkFfRldMX0NGV0xfVElNRVJJTkZPX0hfCmRpZmYgLS1naXQgYS94ZmEvZndsL2Nmd2xfd2lkZ2V0LmNwcCBiL3hmYS9md2wvY2Z3bF93aWRnZXQuY3BwCmluZGV4IGI1YjhiZjQuLmI5YjA0Y2YgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvY2Z3bF93aWRnZXQuY3BwCisrKyBiL3hmYS9md2wvY2Z3bF93aWRnZXQuY3BwCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgotI2luY2x1ZGUgInhmYS9mZGUvdHRvL2ZkZV90ZXh0b3V0LmgiCisjaW5jbHVkZSAieGZhL2ZkZS9jZmRlX3RleHRvdXQuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfYXBwLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2NvbWJvYm94LmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2V2ZW50LmgiCkBAIC0yOCw3ICsyOCw3IEBACiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3RoZW1ldGV4dC5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF93aWRnZXRtZ3IuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2lmd2xfdGhlbWVwcm92aWRlci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmFwcC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZhcHAuaCIKIAogI2RlZmluZSBGV0xfU1RZTEVFWFRfTU5VX1ZlcnQgKDFMIDw8IDApCiAjZGVmaW5lIEZXTF9XR1RfQ2FsY0hlaWdodCAyMDQ4CkBAIC02Myw3ICs2Myw3IEBACiAgIG1fcFdpZGdldE1nci0+UmVtb3ZlV2lkZ2V0KHRoaXMpOwogfQogCi1ib29sIENGV0xfV2lkZ2V0OjpJc0luc3RhbmNlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NDbGFzcykgY29uc3QgeworYm9vbCBDRldMX1dpZGdldDo6SXNJbnN0YW5jZShjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NDbGFzcykgY29uc3QgewogICByZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTc3LDcgKzc3LDcgQEAKIAogdm9pZCBDRldMX1dpZGdldDo6SW5mbGF0ZVdpZGdldFJlY3QoQ0ZYX1JlY3RGJiByZWN0KSB7CiAgIGlmIChIYXNCb3JkZXIoKSkgewotICAgIEZYX0ZMT0FUIGZCb3JkZXIgPSBHZXRCb3JkZXJTaXplKHRydWUpOworICAgIGZsb2F0IGZCb3JkZXIgPSBHZXRCb3JkZXJTaXplKHRydWUpOwogICAgIHJlY3QuSW5mbGF0ZShmQm9yZGVyLCBmQm9yZGVyKTsKICAgfQogfQpAQCAtMTk3LDkgKzE5Nyw4IEBACiAgIGlmICghcGFyZW50KQogICAgIHJldHVybiByZXQ7CiAKLSAgQ0ZYX01hdHJpeCBtOwotICBtLlNldFJldmVyc2UocFdpZGdldC0+R2V0TWF0cml4KCkpOwotICByZXR1cm4gbS5UcmFuc2Zvcm0ocmV0KSAtIHBXaWRnZXQtPkdldFdpZGdldFJlY3QoKS5Ub3BMZWZ0KCk7CisgIHJldHVybiBwV2lkZ2V0LT5HZXRNYXRyaXgoKS5HZXRJbnZlcnNlKCkuVHJhbnNmb3JtKHJldCkgLQorICAgICAgICAgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdCgpLlRvcExlZnQoKTsKIH0KIAogQ0ZYX01hdHJpeCBDRldMX1dpZGdldDo6R2V0TWF0cml4KCkgewpAQCAtMjY5LDE0ICsyNjgsMTQgQEAKICAgQ0ZYX1JlY3RGIHJ0RWRnZSgwLCAwLCBtX3BQcm9wZXJ0aWVzLT5tX3J0V2lkZ2V0LndpZHRoLAogICAgICAgICAgICAgICAgICAgIG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQuaGVpZ2h0KTsKICAgaWYgKEhhc0JvcmRlcigpKSB7Ci0gICAgRlhfRkxPQVQgZkNYID0gR2V0Qm9yZGVyU2l6ZSh0cnVlKTsKLSAgICBGWF9GTE9BVCBmQ1kgPSBHZXRCb3JkZXJTaXplKGZhbHNlKTsKKyAgICBmbG9hdCBmQ1ggPSBHZXRCb3JkZXJTaXplKHRydWUpOworICAgIGZsb2F0IGZDWSA9IEdldEJvcmRlclNpemUoZmFsc2UpOwogICAgIHJ0RWRnZS5EZWZsYXRlKGZDWCwgZkNZKTsKICAgfQogICByZXR1cm4gcnRFZGdlOwogfQogCi1GWF9GTE9BVCBDRldMX1dpZGdldDo6R2V0Qm9yZGVyU2l6ZShib29sIGJDWCkgeworZmxvYXQgQ0ZXTF9XaWRnZXQ6OkdldEJvcmRlclNpemUoYm9vbCBiQ1gpIHsKICAgSUZXTF9UaGVtZVByb3ZpZGVyKiB0aGVtZSA9IEdldEF2YWlsYWJsZVRoZW1lKCk7CiAgIGlmICghdGhlbWUpCiAgICAgcmV0dXJuIDAuMGY7CkBAIC0zMTYsNyArMzE1LDcgQEAKICAgcmV0dXJuIHBSZXQ7CiB9CiAKLUNGWF9TaXplRiBDRldMX1dpZGdldDo6Q2FsY1RleHRTaXplKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQsCitDRlhfU2l6ZUYgQ0ZXTF9XaWRnZXQ6OkNhbGNUZXh0U2l6ZShjb25zdCBXaWRlU3RyaW5nJiB3c1RleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRldMX1RoZW1lUHJvdmlkZXIqIHBUaGVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk11bHRpTGluZSkgewogICBpZiAoIXBUaGVtZSkKQEAgLTMyNSwyMCArMzI0LDIyIEBACiAgIENGV0xfVGhlbWVUZXh0IGNhbFBhcnQ7CiAgIGNhbFBhcnQubV9wV2lkZ2V0ID0gdGhpczsKICAgY2FsUGFydC5tX3dzVGV4dCA9IHdzVGV4dDsKLSAgY2FsUGFydC5tX2R3VFRPU3R5bGVzID0KLSAgICAgIGJNdWx0aUxpbmUgPyBGREVfVFRPU1RZTEVfTGluZVdyYXAgOiBGREVfVFRPU1RZTEVfU2luZ2xlTGluZTsKLSAgY2FsUGFydC5tX2lUVE9BbGlnbiA9IEZERV9UVE9BTElHTk1FTlRfVG9wTGVmdDsKLSAgRlhfRkxPQVQgZldpZHRoID0KLSAgICAgIGJNdWx0aUxpbmUgPyBGV0xfV0dUX0NhbGNNdWx0aUxpbmVEZWZXaWR0aCA6IEZXTF9XR1RfQ2FsY1dpZHRoOworICBpZiAoYk11bHRpTGluZSkKKyAgICBjYWxQYXJ0Lm1fZHdUVE9TdHlsZXMubGluZV93cmFwXyA9IHRydWU7CisgIGVsc2UKKyAgICBjYWxQYXJ0Lm1fZHdUVE9TdHlsZXMuc2luZ2xlX2xpbmVfID0gdHJ1ZTsKKworICBjYWxQYXJ0Lm1faVRUT0FsaWduID0gRkRFX1RleHRBbGlnbm1lbnQ6OmtUb3BMZWZ0OworICBmbG9hdCBmV2lkdGggPSBiTXVsdGlMaW5lID8gRldMX1dHVF9DYWxjTXVsdGlMaW5lRGVmV2lkdGggOiBGV0xfV0dUX0NhbGNXaWR0aDsKICAgQ0ZYX1JlY3RGIHJlY3QoMCwgMCwgZldpZHRoLCBGV0xfV0dUX0NhbGNIZWlnaHQpOwogICBwVGhlbWUtPkNhbGNUZXh0UmVjdCgmY2FsUGFydCwgcmVjdCk7CiAgIHJldHVybiBDRlhfU2l6ZUYocmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwogfQogCi12b2lkIENGV0xfV2lkZ2V0OjpDYWxjVGV4dFJlY3QoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwKK3ZvaWQgQ0ZXTF9XaWRnZXQ6OkNhbGNUZXh0UmVjdChjb25zdCBXaWRlU3RyaW5nJiB3c1RleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdUVE9TdHlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVFRPQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRkRFX1RleHRTdHlsZSYgZHdUVE9TdHlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkRFX1RleHRBbGlnbm1lbnQgaVRUT0FsaWduLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcmVjdCkgewogICBDRldMX1RoZW1lVGV4dCBjYWxQYXJ0OwogICBjYWxQYXJ0Lm1fcFdpZGdldCA9IHRoaXM7CkBAIC0zNzgsOCArMzc5LDggQEAKICAgcERyaXZlci0+U2V0R3JhYih0aGlzLCBiU2V0KTsKIH0KIAotdm9pZCBDRldMX1dpZGdldDo6R2V0UG9wdXBQb3MoRlhfRkxPQVQgZk1pbkhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXhIZWlnaHQsCit2b2lkIENGV0xfV2lkZ2V0OjpHZXRQb3B1cFBvcyhmbG9hdCBmTWluSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZk1heEhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRBbmNob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0UG9wdXApIHsKICAgaWYgKEdldENsYXNzSUQoKSA9PSBGV0xfVHlwZTo6Q29tYm9Cb3gpIHsKQEAgLTQwMCwxMyArNDAxLDEzIEBACiAgIEdldFBvcHVwUG9zR2VuZXJhbChmTWluSGVpZ2h0LCBmTWF4SGVpZ2h0LCBydEFuY2hvciwgcnRQb3B1cCk7CiB9CiAKLWJvb2wgQ0ZXTF9XaWRnZXQ6OkdldFBvcHVwUG9zTWVudShGWF9GTE9BVCBmTWluSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXhIZWlnaHQsCitib29sIENGV0xfV2lkZ2V0OjpHZXRQb3B1cFBvc01lbnUoZmxvYXQgZk1pbkhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmTWF4SGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRBbmNob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiBydFBvcHVwKSB7CiAgIGlmIChHZXRTdHlsZXNFeCgpICYgRldMX1NUWUxFRVhUX01OVV9WZXJ0KSB7CiAgICAgYm9vbCBiTGVmdCA9IG1fcFByb3BlcnRpZXMtPm1fcnRXaWRnZXQubGVmdCA8IDA7Ci0gICAgRlhfRkxPQVQgZlJpZ2h0ID0gcnRBbmNob3IucmlnaHQoKSArIHJ0UG9wdXAud2lkdGg7CisgICAgZmxvYXQgZlJpZ2h0ID0gcnRBbmNob3IucmlnaHQoKSArIHJ0UG9wdXAud2lkdGg7CiAgICAgQ0ZYX1BvaW50RiBwb2ludCA9IFRyYW5zZm9ybVRvKG51bGxwdHIsIENGWF9Qb2ludEYoKSk7CiAgICAgaWYgKGZSaWdodCArIHBvaW50LnggPiAwLjBmIHx8IGJMZWZ0KSB7CiAgICAgICBydFBvcHVwID0gQ0ZYX1JlY3RGKHJ0QW5jaG9yLmxlZnQgLSBydFBvcHVwLndpZHRoLCBydEFuY2hvci50b3AsCkBAIC00MTksNyArNDIwLDcgQEAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCi0gIEZYX0ZMT0FUIGZCb3R0b20gPSBydEFuY2hvci5ib3R0b20oKSArIHJ0UG9wdXAuaGVpZ2h0OworICBmbG9hdCBmQm90dG9tID0gcnRBbmNob3IuYm90dG9tKCkgKyBydFBvcHVwLmhlaWdodDsKICAgQ0ZYX1BvaW50RiBwb2ludCA9IFRyYW5zZm9ybVRvKG51bGxwdHIsIHBvaW50KTsKICAgaWYgKGZCb3R0b20gKyBwb2ludC55ID4gMC4wZikgewogICAgIHJ0UG9wdXAgPSBDRlhfUmVjdEYocnRBbmNob3IubGVmdCwgcnRBbmNob3IudG9wIC0gcnRQb3B1cC5oZWlnaHQsCkBAIC00MzIsMTggKzQzMywxOCBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDRldMX1dpZGdldDo6R2V0UG9wdXBQb3NDb21ib0JveChGWF9GTE9BVCBmTWluSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWF4SGVpZ2h0LAorYm9vbCBDRldMX1dpZGdldDo6R2V0UG9wdXBQb3NDb21ib0JveChmbG9hdCBmTWluSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmTWF4SGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0UG9wdXApIHsKLSAgRlhfRkxPQVQgZlBvcEhlaWdodCA9IHJ0UG9wdXAuaGVpZ2h0OworICBmbG9hdCBmUG9wSGVpZ2h0ID0gcnRQb3B1cC5oZWlnaHQ7CiAgIGlmIChydFBvcHVwLmhlaWdodCA+IGZNYXhIZWlnaHQpCiAgICAgZlBvcEhlaWdodCA9IGZNYXhIZWlnaHQ7CiAgIGVsc2UgaWYgKHJ0UG9wdXAuaGVpZ2h0IDwgZk1pbkhlaWdodCkKICAgICBmUG9wSGVpZ2h0ID0gZk1pbkhlaWdodDsKIAotICBGWF9GTE9BVCBmV2lkdGggPSBzdGQ6Om1heChydEFuY2hvci53aWR0aCwgcnRQb3B1cC53aWR0aCk7Ci0gIEZYX0ZMT0FUIGZCb3R0b20gPSBydEFuY2hvci5ib3R0b20oKSArIGZQb3BIZWlnaHQ7CisgIGZsb2F0IGZXaWR0aCA9IHN0ZDo6bWF4KHJ0QW5jaG9yLndpZHRoLCBydFBvcHVwLndpZHRoKTsKKyAgZmxvYXQgZkJvdHRvbSA9IHJ0QW5jaG9yLmJvdHRvbSgpICsgZlBvcEhlaWdodDsKICAgQ0ZYX1BvaW50RiBwb2ludCA9IFRyYW5zZm9ybVRvKG51bGxwdHIsIENGWF9Qb2ludEYoKSk7CiAgIGlmIChmQm90dG9tICsgcG9pbnQueSA+IDAuMGYpIHsKICAgICBydFBvcHVwID0KQEAgLTQ1Niw4ICs0NTcsOCBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDRldMX1dpZGdldDo6R2V0UG9wdXBQb3NHZW5lcmFsKEZYX0ZMT0FUIGZNaW5IZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1heEhlaWdodCwKK2Jvb2wgQ0ZXTF9XaWRnZXQ6OkdldFBvcHVwUG9zR2VuZXJhbChmbG9hdCBmTWluSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZNYXhIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0UG9wdXApIHsKICAgQ0ZYX1BvaW50RiBwb2ludCA9IFRyYW5zZm9ybVRvKG51bGxwdHIsIENGWF9Qb2ludEYoKSk7CkBAIC01MjAsNyArNTIxLDcgQEAKICAgbV9wV2lkZ2V0TWdyLT5SZXBhaW50V2lkZ2V0KHRoaXMsIHBSZWN0KTsKIH0KIAotdm9pZCBDRldMX1dpZGdldDo6RHJhd0JhY2tncm91bmQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCit2b2lkIENGV0xfV2lkZ2V0OjpEcmF3QmFja2dyb3VuZChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRldMX1BhcnQgaVBhcnRCaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewpAQCAtNTM0LDE2ICs1MzUsMTUgQEAKICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOwogfQogCi12b2lkIENGV0xfV2lkZ2V0OjpEcmF3Qm9yZGVyKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAordm9pZCBDRldMX1dpZGdldDo6RHJhd0JvcmRlcihDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGV0xfUGFydCBpUGFydEJvcmRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7CiAgIENGV0xfVGhlbWVCYWNrZ3JvdW5kIHBhcmFtOwogICBwYXJhbS5tX3BXaWRnZXQgPSB0aGlzOwogICBwYXJhbS5tX2lQYXJ0ID0gaVBhcnRCb3JkZXI7CiAgIHBhcmFtLm1fcEdyYXBoaWNzID0gcEdyYXBoaWNzOwotICBpZiAocE1hdHJpeCkKLSAgICBwYXJhbS5tX21hdHJpeC5Db25jYXQoKnBNYXRyaXgsIHRydWUpOworICBwYXJhbS5tX21hdHJpeC5Db25jYXQobWF0cml4LCB0cnVlKTsKICAgcGFyYW0ubV9ydFBhcnQgPSBHZXRSZWxhdGl2ZVJlY3QoKTsKICAgcFRoZW1lLT5EcmF3QmFja2dyb3VuZCgmcGFyYW0pOwogfQpAQCAtNjEyLDUgKzYxMiw1IEBACiAKIHZvaWQgQ0ZXTF9XaWRnZXQ6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkge30KIAotdm9pZCBDRldMX1dpZGdldDo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHt9Cit2b2lkIENGV0xfV2lkZ2V0OjpPbkRyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkge30KZGlmZiAtLWdpdCBhL3hmYS9md2wvY2Z3bF93aWRnZXQuaCBiL3hmYS9md2wvY2Z3bF93aWRnZXQuaAppbmRleCAyMzg3Yjc1Li4yN2NiNDU4IDEwMDY0NAotLS0gYS94ZmEvZndsL2Nmd2xfd2lkZ2V0LmgKKysrIGIveGZhL2Z3bC9jZndsX3dpZGdldC5oCkBAIC02LDE2ICs2LDE4IEBACiAKICNpZm5kZWYgWEZBX0ZXTF9DRldMX1dJREdFVF9IXwogI2RlZmluZSBYRkFfRldMX0NGV0xfV0lER0VUX0hfCisKICNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisjaW5jbHVkZSAieGZhL2ZkZS9jZmRlX2RhdGEuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfZXZlbnQuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfdGhlbWVwYXJ0LmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3dpZGdldG1nci5oIgogI2luY2x1ZGUgInhmYS9md2wvZndsX3dpZGdldGhpdC5oIgogI2luY2x1ZGUgInhmYS9md2wvaWZ3bF93aWRnZXRkZWxlZ2F0ZS5oIgotI2luY2x1ZGUgInhmYS9md2wvdGhlbWUvY2Z3bF93aWRnZXR0cC5oIgogCiBlbnVtIGNsYXNzIEZXTF9UeXBlIHsKICAgVW5rbm93biA9IDAsCkBAIC01MSw3ICs1Myw3IEBACiAgIH5DRldMX1dpZGdldCgpIG92ZXJyaWRlOwogCiAgIHZpcnR1YWwgRldMX1R5cGUgR2V0Q2xhc3NJRCgpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBib29sIElzSW5zdGFuY2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0NsYXNzKSBjb25zdDsKKyAgdmlydHVhbCBib29sIElzSW5zdGFuY2UoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzQ2xhc3MpIGNvbnN0OwogICB2aXJ0dWFsIENGWF9SZWN0RiBHZXRBdXRvc2l6ZWRXaWRnZXRSZWN0KCk7CiAgIHZpcnR1YWwgQ0ZYX1JlY3RGIEdldFdpZGdldFJlY3QoKTsKICAgdmlydHVhbCBDRlhfUmVjdEYgR2V0Q2xpZW50UmVjdCgpOwpAQCAtNjEsMTUgKzYzLDE1IEBACiAgIHZpcnR1YWwgdm9pZCBSZW1vdmVTdGF0ZXModWludDMyX3QgZHdTdGF0ZXMpOwogICB2aXJ0dWFsIHZvaWQgVXBkYXRlKCkgPSAwOwogICB2aXJ0dWFsIEZXTF9XaWRnZXRIaXQgSGl0VGVzdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7Ci0gIHZpcnR1YWwgdm9pZCBEcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSA9IDA7CisgIHZpcnR1YWwgdm9pZCBEcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSA9IDA7CiAgIHZpcnR1YWwgdm9pZCBTZXRUaGVtZVByb3ZpZGVyKElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lUHJvdmlkZXIpOwogCiAgIC8vIElGV0xfV2lkZ2V0RGVsZWdhdGUuCiAgIHZvaWQgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSBvdmVycmlkZTsKICAgdm9pZCBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIG92ZXJyaWRlOwotICB2b2lkIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgb3ZlcnJpZGU7CisgIHZvaWQgT25EcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSBvdmVycmlkZTsKIAogICB2b2lkIEluZmxhdGVXaWRnZXRSZWN0KENGWF9SZWN0RiYgcmVjdCk7CiAgIHZvaWQgU2V0V2lkZ2V0UmVjdChjb25zdCBDRlhfUmVjdEYmIHJlY3QpOwpAQCAtOTYsMTMgKzk4LDEzIEBACiAKICAgdm9pZCBTZXREZWxlZ2F0ZShJRldMX1dpZGdldERlbGVnYXRlKiBkZWxlZ2F0ZSkgeyBtX3BEZWxlZ2F0ZSA9IGRlbGVnYXRlOyB9CiAgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIEdldERlbGVnYXRlKCkgewotICAgIHJldHVybiBtX3BEZWxlZ2F0ZSA/IG1fcERlbGVnYXRlIDogdGhpczsKKyAgICByZXR1cm4gbV9wRGVsZWdhdGUgPyBtX3BEZWxlZ2F0ZS5HZXQoKSA6IHRoaXM7CiAgIH0KICAgY29uc3QgSUZXTF9XaWRnZXREZWxlZ2F0ZSogR2V0RGVsZWdhdGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1fcERlbGVnYXRlID8gbV9wRGVsZWdhdGUgOiB0aGlzOworICAgIHJldHVybiBtX3BEZWxlZ2F0ZSA/IG1fcERlbGVnYXRlLkdldCgpIDogdGhpczsKICAgfQogCi0gIGNvbnN0IENGV0xfQXBwKiBHZXRPd25lckFwcCgpIGNvbnN0IHsgcmV0dXJuIG1fcE93bmVyQXBwOyB9CisgIGNvbnN0IENGV0xfQXBwKiBHZXRPd25lckFwcCgpIGNvbnN0IHsgcmV0dXJuIG1fcE93bmVyQXBwLkdldCgpOyB9CiAgIHVpbnQzMl90IEdldEV2ZW50S2V5KCkgY29uc3QgeyByZXR1cm4gbV9uRXZlbnRLZXk7IH0KICAgdm9pZCBTZXRFdmVudEtleSh1aW50MzJfdCBrZXkpIHsgbV9uRXZlbnRLZXkgPSBrZXk7IH0KIApAQCAtMTIyLDMyICsxMjQsMzIgQEAKICAgYm9vbCBJc0xvY2tlZCgpIGNvbnN0IHsgcmV0dXJuIG1faUxvY2sgPiAwOyB9CiAgIGJvb2wgSGFzQm9yZGVyKCkgY29uc3Q7CiAgIENGWF9SZWN0RiBHZXRFZGdlUmVjdCgpOwotICBGWF9GTE9BVCBHZXRCb3JkZXJTaXplKGJvb2wgYkNYKTsKKyAgZmxvYXQgR2V0Qm9yZGVyU2l6ZShib29sIGJDWCk7CiAgIENGWF9SZWN0RiBHZXRSZWxhdGl2ZVJlY3QoKTsKICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBHZXRBdmFpbGFibGVUaGVtZSgpOwotICBDRlhfU2l6ZUYgQ2FsY1RleHRTaXplKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQsCisgIENGWF9TaXplRiBDYWxjVGV4dFNpemUoY29uc3QgV2lkZVN0cmluZyYgd3NUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk11bHRpTGluZSk7Ci0gIHZvaWQgQ2FsY1RleHRSZWN0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQsCisgIHZvaWQgQ2FsY1RleHRSZWN0KGNvbnN0IFdpZGVTdHJpbmcmIHdzVGV4dCwKICAgICAgICAgICAgICAgICAgICAgSUZXTF9UaGVtZVByb3ZpZGVyKiBwVGhlbWUsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3VFRPU3R5bGVzLAotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUVE9BbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRkRFX1RleHRTdHlsZSYgZHdUVE9TdHlsZXMsCisgICAgICAgICAgICAgICAgICAgIEZERV9UZXh0QWxpZ25tZW50IGlUVE9BbGlnbiwKICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGJiByZWN0KTsKICAgdm9pZCBTZXRHcmFiKGJvb2wgYlNldCk7Ci0gIHZvaWQgR2V0UG9wdXBQb3MoRlhfRkxPQVQgZk1pbkhlaWdodCwKLSAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWF4SGVpZ2h0LAorICB2b2lkIEdldFBvcHVwUG9zKGZsb2F0IGZNaW5IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgZmxvYXQgZk1heEhlaWdodCwKICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yLAogICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCk7CiAgIHZvaWQgUmVnaXN0ZXJFdmVudFRhcmdldChDRldMX1dpZGdldCogcEV2ZW50U291cmNlKTsKICAgdm9pZCBVbnJlZ2lzdGVyRXZlbnRUYXJnZXQoKTsKICAgdm9pZCBEaXNwYXRjaEV2ZW50KENGV0xfRXZlbnQqIHBFdmVudCk7Ci0gIHZvaWQgRHJhd0JvcmRlcihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgdm9pZCBEcmF3Qm9yZGVyKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgIENGV0xfUGFydCBpUGFydEJvcmRlciwKICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLAotICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7CisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBwTWF0cml4KTsKIAotICBjb25zdCBDRldMX0FwcCogY29uc3QgbV9wT3duZXJBcHA7Ci0gIENGV0xfV2lkZ2V0TWdyKiBjb25zdCBtX3BXaWRnZXRNZ3I7CisgIFVub3duZWRQdHI8Y29uc3QgQ0ZXTF9BcHA+IGNvbnN0IG1fcE93bmVyQXBwOworICBVbm93bmVkUHRyPENGV0xfV2lkZ2V0TWdyPiBjb25zdCBtX3BXaWRnZXRNZ3I7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDRldMX1dpZGdldFByb3BlcnRpZXM+IG1fcFByb3BlcnRpZXM7CiAgIENGV0xfV2lkZ2V0KiBtX3BPdXRlcjsKICAgaW50MzJfdCBtX2lMb2NrOwpAQCAtMTYxLDE5ICsxNjMsMTkgQEAKICAgYm9vbCBJc1BvcHVwKCkgY29uc3Q7CiAgIGJvb2wgSXNDaGlsZCgpIGNvbnN0OwogICBDRldMX1dpZGdldCogR2V0Um9vdE91dGVyKCk7Ci0gIGJvb2wgR2V0UG9wdXBQb3NNZW51KEZYX0ZMT0FUIGZNaW5IZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXhIZWlnaHQsCisgIGJvb2wgR2V0UG9wdXBQb3NNZW51KGZsb2F0IGZNaW5IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZNYXhIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRBbmNob3IsCiAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCk7Ci0gIGJvb2wgR2V0UG9wdXBQb3NDb21ib0JveChGWF9GTE9BVCBmTWluSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1heEhlaWdodCwKKyAgYm9vbCBHZXRQb3B1cFBvc0NvbWJvQm94KGZsb2F0IGZNaW5IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmTWF4SGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCk7Ci0gIGJvb2wgR2V0UG9wdXBQb3NHZW5lcmFsKEZYX0ZMT0FUIGZNaW5IZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXhIZWlnaHQsCisgIGJvb2wgR2V0UG9wdXBQb3NHZW5lcmFsKGZsb2F0IGZNaW5IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZNYXhIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRBbmNob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCk7Ci0gIHZvaWQgRHJhd0JhY2tncm91bmQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgIHZvaWQgRHJhd0JhY2tncm91bmQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgIENGV0xfUGFydCBpUGFydEJrLAogICAgICAgICAgICAgICAgICAgICAgIElGV0xfVGhlbWVQcm92aWRlciogcFRoZW1lLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOwpAQCAtMTgyLDcgKzE4NCw3IEBACiAKICAgQ1hGQV9GRldpZGdldCogbV9wTGF5b3V0SXRlbTsKICAgdWludDMyX3QgbV9uRXZlbnRLZXk7Ci0gIElGV0xfV2lkZ2V0RGVsZWdhdGUqIG1fcERlbGVnYXRlOyAgLy8gTm90IG93bmVkLgorICBVbm93bmVkUHRyPElGV0xfV2lkZ2V0RGVsZWdhdGU+IG1fcERlbGVnYXRlOwogfTsKIAogI2VuZGlmICAvLyBYRkFfRldMX0NGV0xfV0lER0VUX0hfCmRpZmYgLS1naXQgYS94ZmEvZndsL2Nmd2xfd2lkZ2V0bWdyLmNwcCBiL3hmYS9md2wvY2Z3bF93aWRnZXRtZ3IuY3BwCmluZGV4IDdjMGZkZGQuLjMwODJiMTggMTAwNjQ0Ci0tLSBhL3hmYS9md2wvY2Z3bF93aWRnZXRtZ3IuY3BwCisrKyBiL3hmYS9md2wvY2Z3bF93aWRnZXRtZ3IuY3BwCkBAIC0xMiw4ICsxMiw4IEBACiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2FwcC5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9mb3JtLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX25vdGVkcml2ZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2Z3bGFkYXB0ZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZhcHAuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmYXBwLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9md2xhZGFwdGVyd2lkZ2V0bWdyLmgiCiAKIG5hbWVzcGFjZSB7CiAKQEAgLTI5LDEyICsyOSwxMyBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIENGV0xfV2lkZ2V0TWdyOjpDRldMX1dpZGdldE1ncihDWEZBX0ZGQXBwKiBwQWRhcHRlck5hdGl2ZSkKLSAgICA6IG1fZHdDYXBhYmlsaXR5KDApLCBtX3BBZGFwdGVyKHBBZGFwdGVyTmF0aXZlLT5HZXRXaWRnZXRNZ3IodGhpcykpIHsKKyAgICA6IG1fZHdDYXBhYmlsaXR5KEZXTF9XR1RNR1JfRGlzYWJsZUZvcm0pLAorICAgICAgbV9wQWRhcHRlcihwQWRhcHRlck5hdGl2ZS0+R2V0RldMQWRhcHRlcldpZGdldE1ncigpKSB7CiAgIEFTU0VSVChtX3BBZGFwdGVyKTsKICAgbV9tYXBXaWRnZXRJdGVtW251bGxwdHJdID0gcGRmaXVtOjpNYWtlVW5pcXVlPEl0ZW0+KCk7Ci0jaWYgKF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfKSB8fCAoX0ZYX09TXyA9PSBfRlhfV0lONjRfKQorI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCiAgIG1fcnRTY3JlZW4uUmVzZXQoKTsKLSNlbmRpZgorI2VuZGlmICAvLyBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXwogfQogCiBDRldMX1dpZGdldE1ncjo6fkNGV0xfV2lkZ2V0TWdyKCkge30KQEAgLTI2NiwxMiArMjY3LDcgQEAKICAgQ0ZXTF9XaWRnZXQqIGNoaWxkID0gR2V0TGFzdENoaWxkV2lkZ2V0KHBhcmVudCk7CiAgIHdoaWxlIChjaGlsZCkgewogICAgIGlmICgoY2hpbGQtPkdldFN0YXRlcygpICYgRldMX1dHVFNUQVRFX0ludmlzaWJsZSkgPT0gMCkgewotICAgICAgQ0ZYX01hdHJpeCBtOwotICAgICAgbS5TZXRJZGVudGl0eSgpOwotCi0gICAgICBDRlhfTWF0cml4IG1hdHJpeE9uUGFyZW50OwotICAgICAgbS5TZXRSZXZlcnNlKG1hdHJpeE9uUGFyZW50KTsKLSAgICAgIHBvcyA9IG0uVHJhbnNmb3JtKHBvaW50KTsKKyAgICAgIHBvcyA9IHBhcmVudC0+R2V0TWF0cml4KCkuR2V0SW52ZXJzZSgpLlRyYW5zZm9ybShwb2ludCk7CiAKICAgICAgIENGWF9SZWN0RiBib3VuZHMgPSBjaGlsZC0+R2V0V2lkZ2V0UmVjdCgpOwogICAgICAgaWYgKGJvdW5kcy5Db250YWlucyhwb3MpKSB7CkBAIC0zODMsMTcgKzM3OSwxMyBAQAogfQogCiB2b2lkIENGV0xfV2lkZ2V0TWdyOjpHZXRBZGFwdGVyUG9wdXBQb3MoQ0ZXTF9XaWRnZXQqIHBXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1pbkhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWF4SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZNaW5IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZk1heEhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCkgY29uc3QgewogICBtX3BBZGFwdGVyLT5HZXRQb3B1cFBvcyhwV2lkZ2V0LCBmTWluSGVpZ2h0LCBmTWF4SGVpZ2h0LCBydEFuY2hvciwgcnRQb3B1cCk7CiB9CiAKLXZvaWQgQ0ZXTF9XaWRnZXRNZ3I6Ok9uU2V0Q2FwYWJpbGl0eSh1aW50MzJfdCBkd0NhcGFiaWxpdHkpIHsKLSAgbV9kd0NhcGFiaWxpdHkgPSBkd0NhcGFiaWxpdHk7Ci19Ci0KIHZvaWQgQ0ZXTF9XaWRnZXRNZ3I6Ok9uUHJvY2Vzc01lc3NhZ2VUb0Zvcm0oQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgewogICBpZiAoIXBNZXNzYWdlKQogICAgIHJldHVybjsKQEAgLTQxNSw3ICs0MDcsNyBAQAogICBlbHNlCiAgICAgcE5vdGVEcml2ZXItPlF1ZXVlTWVzc2FnZShwTWVzc2FnZS0+Q2xvbmUoKSk7CiAKLSNpZiAoX0ZYX09TXyA9PSBfRlhfTUFDT1NYXykKKyNpZiAoX0ZYX09TXyA9PSBfRlhfT1NfTUFDT1NYXykKICAgQ0ZXTF9Ob3RlTG9vcCogcFRvcExvb3AgPSBwTm90ZURyaXZlci0+R2V0VG9wTG9vcCgpOwogICBpZiAocFRvcExvb3ApCiAgICAgcE5vdGVEcml2ZXItPlVucXVldWVNZXNzYWdlQW5kUHJvY2VzcyhwVG9wTG9vcCk7CkBAIC00MjMsMzQgKzQxNSwzNiBAQAogfQogCiB2b2lkIENGV0xfV2lkZ2V0TWdyOjpPbkRyYXdXaWRnZXQoQ0ZXTF9XaWRnZXQqIHBXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKICAgaWYgKCFwV2lkZ2V0IHx8ICFwR3JhcGhpY3MpCiAgICAgcmV0dXJuOwogCiAgIENGWF9SZWN0RiBjbGlwQ29weSgwLCAwLCBwV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KCkuU2l6ZSgpKTsKICAgQ0ZYX1JlY3RGIGNsaXBCb3VuZHM7CiAKLSNpZiBfRlhfT1NfID09IF9GWF9NQUNPU1hfCisjaWYgX0ZYX09TXyA9PSBfRlhfT1NfTUFDT1NYXwogICBpZiAoSXNGb3JtRGlzYWJsZWQoKSkgewotI2VuZGlmICAvLyBfRlhfT1NfID09IF9GWF9NQUNPU1hfCisjZW5kaWYgIC8vIF9GWF9PU18gPT0gX0ZYX09TX01BQ09TWF8KIAotICAgIHBXaWRnZXQtPkdldERlbGVnYXRlKCktPk9uRHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOworICAgIHBXaWRnZXQtPkdldERlbGVnYXRlKCktPk9uRHJhd1dpZGdldChwR3JhcGhpY3MsIG1hdHJpeCk7CiAgICAgY2xpcEJvdW5kcyA9IHBHcmFwaGljcy0+R2V0Q2xpcFJlY3QoKTsKICAgICBjbGlwQ29weSA9IGNsaXBCb3VuZHM7CiAKLSNpZiBfRlhfT1NfID09IF9GWF9NQUNPU1hfCisjaWYgX0ZYX09TXyA9PSBfRlhfT1NfTUFDT1NYXwogICB9IGVsc2UgewotICAgIGNsaXBCb3VuZHMgPSBDRlhfUmVjdEYocE1hdHJpeC0+YSwgcE1hdHJpeC0+YiwgcE1hdHJpeC0+YywgcE1hdHJpeC0+ZCk7Ci0gICAgY29uc3RfY2FzdDxDRlhfTWF0cml4Kj4ocE1hdHJpeCktPlNldElkZW50aXR5KCk7ICAvLyBGSVhNRTogY29uc3QgY2FzdC4KLSAgICBwV2lkZ2V0LT5HZXREZWxlZ2F0ZSgpLT5PbkRyYXdXaWRnZXQocEdyYXBoaWNzLCBwTWF0cml4KTsKKyAgICBjbGlwQm91bmRzID0gQ0ZYX1JlY3RGKG1hdHJpeC5hLCBtYXRyaXguYiwgbWF0cml4LmMsIG1hdHJpeC5kKTsKKyAgICAvLyBGSVhNRTogY29uc3QgY2FzdAorICAgIENGWF9NYXRyaXgqIHBNYXRyaXhIYWNrID0gY29uc3RfY2FzdDxDRlhfTWF0cml4Kj4oJm1hdHJpeCk7CisgICAgcE1hdHJpeEhhY2stPlNldElkZW50aXR5KCk7CisgICAgcFdpZGdldC0+R2V0RGVsZWdhdGUoKS0+T25EcmF3V2lkZ2V0KHBHcmFwaGljcywgKnBNYXRyaXhIYWNrKTsKICAgfQotI2VuZGlmICAvLyBfRlhfT1NfID09IF9GWF9NQUNPU1hfCisjZW5kaWYgIC8vIF9GWF9PU18gPT0gX0ZYX09TX01BQ09TWF8KIAogICBpZiAoIUlzRm9ybURpc2FibGVkKCkpCiAgICAgY2xpcEJvdW5kcy5JbnRlcnNlY3QocFdpZGdldC0+R2V0Q2xpZW50UmVjdCgpKTsKICAgaWYgKCFjbGlwQm91bmRzLklzRW1wdHkoKSkKLSAgICBEcmF3Q2hpbGQocFdpZGdldCwgY2xpcEJvdW5kcywgcEdyYXBoaWNzLCBwTWF0cml4KTsKKyAgICBEcmF3Q2hpbGQocFdpZGdldCwgY2xpcEJvdW5kcywgcEdyYXBoaWNzLCAmbWF0cml4KTsKIAogICBHZXRXaWRnZXRNZ3JJdGVtKHBXaWRnZXQpLT5pUmVkcmF3Q291bnRlciA9IDA7CiAgIFJlc2V0UmVkcmF3Q291bnRzKHBXaWRnZXQpOwpAQCAtNDU4LDcgKzQ1Miw3IEBACiAKIHZvaWQgQ0ZXTF9XaWRnZXRNZ3I6OkRyYXdDaGlsZChDRldMX1dpZGdldCogcGFyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRDbGlwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7CiAgIGlmICghcGFyZW50KQogICAgIHJldHVybjsKQEAgLTQ5Nyw3ICs0OTEsNyBAQAogCiAgICAgaWYgKElGV0xfV2lkZ2V0RGVsZWdhdGUqIHBEZWxlZ2F0ZSA9IGNoaWxkLT5HZXREZWxlZ2F0ZSgpKSB7CiAgICAgICBpZiAoSXNGb3JtRGlzYWJsZWQoKSB8fCBJc05lZWRSZXBhaW50KGNoaWxkLCAmd2lkZ2V0TWF0cml4LCBydENsaXApKQotICAgICAgICBwRGVsZWdhdGUtPk9uRHJhd1dpZGdldChwR3JhcGhpY3MsICZ3aWRnZXRNYXRyaXgpOworICAgICAgICBwRGVsZWdhdGUtPk9uRHJhd1dpZGdldChwR3JhcGhpY3MsIHdpZGdldE1hdHJpeCk7CiAgICAgfQogICAgIGlmICghYkZvcm1EaXNhYmxlKQogICAgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOwpAQCAtNTE3LDggKzUxMSw4IEBACiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICBDRlhfUmVjdEYgcnRXaWRnZXQoMCwgMCwgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdCgpLlNpemUoKSk7Ci0gIHBNYXRyaXgtPlRyYW5zZm9ybVJlY3QocnRXaWRnZXQpOworICBDRlhfUmVjdEYgcnRXaWRnZXQgPQorICAgICAgcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChDRlhfUmVjdEYoMCwgMCwgcFdpZGdldC0+R2V0V2lkZ2V0UmVjdCgpLlNpemUoKSkpOwogICBpZiAoIXJ0V2lkZ2V0LkludGVyc2VjdFdpdGgocnREaXJ0eSkpCiAgICAgcmV0dXJuIGZhbHNlOwogCkBAIC01MzIsOSArNTI2LDkgQEAKICAgYm9vbCBiT3JnaW5QdEludGVyc2VjdFdpZHRoQ2hpbGQgPSBmYWxzZTsKICAgYm9vbCBiT3JnaW5QdEludGVyc2VjdFdpZHRoRGlydHkgPSBydERpcnR5LkNvbnRhaW5zKHJ0V2lkZ2V0LlRvcExlZnQoKSk7CiAgIHN0YXRpYyBGV0xfTkVFRFJFUEFJTlRISVREQVRBIGhpdFBvaW50W2tOZWVkUmVwYWludEhpdFBvaW50c107Ci0gIEZYU1lTX21lbXNldChoaXRQb2ludCwgMCwgc2l6ZW9mKGhpdFBvaW50KSk7Ci0gIEZYX0ZMT0FUIGZ4UGllY2UgPSBydFdpZGdldC53aWR0aCAvIGtOZWVkUmVwYWludEhpdFBpZWNlOwotICBGWF9GTE9BVCBmeVBpZWNlID0gcnRXaWRnZXQuaGVpZ2h0IC8ga05lZWRSZXBhaW50SGl0UGllY2U7CisgIG1lbXNldChoaXRQb2ludCwgMCwgc2l6ZW9mKGhpdFBvaW50KSk7CisgIGZsb2F0IGZ4UGllY2UgPSBydFdpZGdldC53aWR0aCAvIGtOZWVkUmVwYWludEhpdFBpZWNlOworICBmbG9hdCBmeVBpZWNlID0gcnRXaWRnZXQuaGVpZ2h0IC8ga05lZWRSZXBhaW50SGl0UGllY2U7CiAgIGhpdFBvaW50WzJdLmhpdFBvaW50LnggPSBoaXRQb2ludFs2XS5oaXRQb2ludC54ID0gcnRXaWRnZXQubGVmdDsKICAgaGl0UG9pbnRbMF0uaGl0UG9pbnQueCA9IGhpdFBvaW50WzNdLmhpdFBvaW50LnggPSBoaXRQb2ludFs3XS5oaXRQb2ludC54ID0KICAgICAgIGhpdFBvaW50WzEwXS5oaXRQb2ludC54ID0gZnhQaWVjZSArIHJ0V2lkZ2V0LmxlZnQ7CkBAIC01OTYsNyArNTkwLDcgQEAKICAgaWYgKHJlcGFpbnRQb2ludCA+IDApCiAgICAgcmV0dXJuIHRydWU7CiAKLSAgcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChydENoaWxkcyk7CisgIHJ0Q2hpbGRzID0gcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChydENoaWxkcyk7CiAgIGlmIChydENoaWxkcy5Db250YWlucyhydERpcnR5KSB8fCBydENoaWxkcy5Db250YWlucyhydFdpZGdldCkpCiAgICAgcmV0dXJuIGZhbHNlOwogICByZXR1cm4gdHJ1ZTsKQEAgLTYxMiwxMCArNjA2LDEwIEBACiAgICAgICBwTmV4dChudWxscHRyKSwKICAgICAgIHBXaWRnZXQod2lkZ2V0KSwKICAgICAgIGlSZWRyYXdDb3VudGVyKDApCi0jaWYgKF9GWF9PU18gPT0gX0ZYX1dJTjMyX0RFU0tUT1BfKSB8fCAoX0ZYX09TXyA9PSBfRlhfV0lONjRfKQorI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCiAgICAgICAsCiAgICAgICBiT3V0c2lkZUNoYW5nZWQoZmFsc2UpCi0jZW5kaWYKKyNlbmRpZiAgLy8gX0ZYX1BMQVRGT1JNXyA9PSBfRlhfUExBVEZPUk1fV0lORE9XU18KIHsKIH0KIApkaWZmIC0tZ2l0IGEveGZhL2Z3bC9jZndsX3dpZGdldG1nci5oIGIveGZhL2Z3bC9jZndsX3dpZGdldG1nci5oCmluZGV4IDJkNDM2YmQuLjE1M2QwYTkgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvY2Z3bF93aWRnZXRtZ3IuaAorKysgYi94ZmEvZndsL2Nmd2xfd2lkZ2V0bWdyLmgKQEAgLTEyLDI5ICsxMiwyNiBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9pZndsX3dpZGdldG1ncmRlbGVnYXRlLmgiCi0jaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY2Z4X2dyYXBoaWNzLmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9ncmFwaGljcy5oIgogCiAjZGVmaW5lIEZXTF9XR1RNR1JfRGlzYWJsZUZvcm0gMHgwMDAwMDAwMgogCiBjbGFzcyBDRldMX01lc3NhZ2U7CiBjbGFzcyBDWEZBX0ZGQXBwOwogY2xhc3MgQ1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyOwotY2xhc3MgQ0ZYX0dyYXBoaWNzOworY2xhc3MgQ1hGQV9HcmFwaGljczsKIGNsYXNzIENGWF9NYXRyaXg7CiBjbGFzcyBDRldMX1dpZGdldDsKIAotY2xhc3MgQ0ZXTF9XaWRnZXRNZ3IgOiBwdWJsaWMgQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZSB7CitjbGFzcyBDRldMX1dpZGdldE1nciB7CiAgcHVibGljOgogICBleHBsaWNpdCBDRldMX1dpZGdldE1ncihDWEZBX0ZGQXBwKiBwQWRhcHRlck5hdGl2ZSk7CiAgIH5DRldMX1dpZGdldE1ncigpOwogCi0gIC8vIENGV0xfV2lkZ2V0TWdyRGVsZWdhdGUKLSAgdm9pZCBPblNldENhcGFiaWxpdHkodWludDMyX3QgZHdDYXBhYmlsaXR5KSBvdmVycmlkZTsKLSAgdm9pZCBPblByb2Nlc3NNZXNzYWdlVG9Gb3JtKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIG92ZXJyaWRlOworICB2b2lkIE9uUHJvY2Vzc01lc3NhZ2VUb0Zvcm0oQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7CiAgIHZvaWQgT25EcmF3V2lkZ2V0KENGV0xfV2lkZ2V0KiBwV2lkZ2V0LAotICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgICAgIENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KTsKIAogICBDRldMX1dpZGdldCogR2V0UGFyZW50V2lkZ2V0KENGV0xfV2lkZ2V0KiBwV2lkZ2V0KSBjb25zdDsKICAgQ0ZXTF9XaWRnZXQqIEdldE93bmVyV2lkZ2V0KENGV0xfV2lkZ2V0KiBwV2lkZ2V0KSBjb25zdDsKQEAgLTY0LDggKzYxLDggQEAKICAgfQogCiAgIHZvaWQgR2V0QWRhcHRlclBvcHVwUG9zKENGV0xfV2lkZ2V0KiBwV2lkZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWluSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWF4SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmTWluSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmTWF4SGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0UG9wdXApIGNvbnN0OwogCkBAIC04MiwxMSArNzksMTEgQEAKICAgICBJdGVtKiBwUHJldmlvdXM7CiAgICAgSXRlbSogcE5leHQ7CiAgICAgQ0ZXTF9XaWRnZXQqIGNvbnN0IHBXaWRnZXQ7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENGWF9HcmFwaGljcz4gcE9mZnNjcmVlbjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9HcmFwaGljcz4gcE9mZnNjcmVlbjsKICAgICBpbnQzMl90IGlSZWRyYXdDb3VudGVyOwotI2lmIChfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXykgfHwgKF9GWF9PU18gPT0gX0ZYX1dJTjY0XykKKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXwogICAgIGJvb2wgYk91dHNpZGVDaGFuZ2VkOwotI2VuZGlmCisjZW5kaWYgIC8vIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCiAgIH07CiAKICAgQ0ZXTF9XaWRnZXQqIEdldEZpcnN0U2libGluZ1dpZGdldChDRldMX1dpZGdldCogcFdpZGdldCkgY29uc3Q7CkBAIC0xMDMsMTEgKzEwMCwxMSBAQAogCiAgIHZvaWQgRHJhd0NoaWxkKENGV0xfV2lkZ2V0KiBwUGFyZW50LAogICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCwKLSAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgIENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7Ci0gIENGWF9HcmFwaGljcyogRHJhd1dpZGdldEJlZm9yZShDRldMX1dpZGdldCogcFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCk7CisgIENYRkFfR3JhcGhpY3MqIERyYXdXaWRnZXRCZWZvcmUoQ0ZXTF9XaWRnZXQqIHBXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpOwogICBib29sIElzTmVlZFJlcGFpbnQoQ0ZXTF9XaWRnZXQqIHBXaWRnZXQsCiAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydERpcnR5KTsKQEAgLTExNiwxMCArMTEzLDEwIEBACiAKICAgdWludDMyX3QgbV9kd0NhcGFiaWxpdHk7CiAgIHN0ZDo6bWFwPENGV0xfV2lkZ2V0Kiwgc3RkOjp1bmlxdWVfcHRyPEl0ZW0+PiBtX21hcFdpZGdldEl0ZW07Ci0gIENYRkFfRldMQWRhcHRlcldpZGdldE1nciogY29uc3QgbV9wQWRhcHRlcjsKLSNpZiAoX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8pIHx8IChfRlhfT1NfID09IF9GWF9XSU42NF8pCisgIFVub3duZWRQdHI8Q1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyPiBjb25zdCBtX3BBZGFwdGVyOworI2lmIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCiAgIENGWF9SZWN0RiBtX3J0U2NyZWVuOwotI2VuZGlmCisjZW5kaWYgIC8vIF9GWF9QTEFURk9STV8gPT0gX0ZYX1BMQVRGT1JNX1dJTkRPV1NfCiB9OwogCiAjZW5kaWYgIC8vIFhGQV9GV0xfQ0ZXTF9XSURHRVRNR1JfSF8KZGlmZiAtLWdpdCBhL3hmYS9md2wvY2Z4X2JhcmNvZGUuY3BwIGIveGZhL2Z3bC9jZnhfYmFyY29kZS5jcHAKaW5kZXggN2FmM2FhMS4uOWQ2NjdjNiAxMDA2NDQKLS0tIGEveGZhL2Z3bC9jZnhfYmFyY29kZS5jcHAKKysrIGIveGZhL2Z3bC9jZnhfYmFyY29kZS5jcHAKQEAgLTYsNDQgKzYsNDcgQEAKIAogI2luY2x1ZGUgInhmYS9md2wvY2Z4X2JhcmNvZGUuaCIKIAotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY2JjX2NvZGFiYXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2NiY19jb2RlMTI4LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jYmNfY29kZTM5LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jYmNfY29kZWJhc2UuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2NiY19kYXRhbWF0cml4LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jYmNfZWFuMTMuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2NiY19lYW44LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jYmNfcGRmNDE3aS5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY2JjX3FyY29kZS5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY2JjX3VwY2EuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3V0aWxzLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NiY19jb2RhYmFyLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NiY19jb2RlMTI4LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NiY19jb2RlMzkuaCIKKyNpbmNsdWRlICJmeGJhcmNvZGUvY2JjX2NvZGViYXNlLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NiY19kYXRhbWF0cml4LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NiY19lYW4xMy5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9jYmNfZWFuOC5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9jYmNfcGRmNDE3aS5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9jYmNfcXJjb2RlLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL2NiY191cGNhLmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL3V0aWxzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogCiBuYW1lc3BhY2UgewogCi1DQkNfQ29kZUJhc2UqIENyZWF0ZUJhckNvZGVFbmdpbmVPYmplY3QoQkNfVFlQRSB0eXBlKSB7CitzdGQ6OnVuaXF1ZV9wdHI8Q0JDX0NvZGVCYXNlPiBDcmVhdGVCYXJDb2RlRW5naW5lT2JqZWN0KEJDX1RZUEUgdHlwZSkgewogICBzd2l0Y2ggKHR5cGUpIHsKICAgICBjYXNlIEJDX0NPREUzOToKLSAgICAgIHJldHVybiBuZXcgQ0JDX0NvZGUzOSgpOworICAgICAgcmV0dXJuIHBkZml1bTo6TWFrZVVuaXF1ZTxDQkNfQ29kZTM5PigpOwogICAgIGNhc2UgQkNfQ09EQUJBUjoKLSAgICAgIHJldHVybiBuZXcgQ0JDX0NvZGFiYXIoKTsKKyAgICAgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8Q0JDX0NvZGFiYXI+KCk7CiAgICAgY2FzZSBCQ19DT0RFMTI4OgotICAgICAgcmV0dXJuIG5ldyBDQkNfQ29kZTEyOChCQ19DT0RFMTI4X0IpOworICAgICAgcmV0dXJuIHBkZml1bTo6TWFrZVVuaXF1ZTxDQkNfQ29kZTEyOD4oQkNfQ09ERTEyOF9CKTsKICAgICBjYXNlIEJDX0NPREUxMjhfQjoKLSAgICAgIHJldHVybiBuZXcgQ0JDX0NvZGUxMjgoQkNfQ09ERTEyOF9CKTsKKyAgICAgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8Q0JDX0NvZGUxMjg+KEJDX0NPREUxMjhfQik7CiAgICAgY2FzZSBCQ19DT0RFMTI4X0M6Ci0gICAgICByZXR1cm4gbmV3IENCQ19Db2RlMTI4KEJDX0NPREUxMjhfQyk7CisgICAgICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENCQ19Db2RlMTI4PihCQ19DT0RFMTI4X0MpOwogICAgIGNhc2UgQkNfRUFOODoKLSAgICAgIHJldHVybiBuZXcgQ0JDX0VBTjgoKTsKKyAgICAgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8Q0JDX0VBTjg+KCk7CiAgICAgY2FzZSBCQ19VUENBOgotICAgICAgcmV0dXJuIG5ldyBDQkNfVVBDQSgpOworICAgICAgcmV0dXJuIHBkZml1bTo6TWFrZVVuaXF1ZTxDQkNfVVBDQT4oKTsKICAgICBjYXNlIEJDX0VBTjEzOgotICAgICAgcmV0dXJuIG5ldyBDQkNfRUFOMTMoKTsKKyAgICAgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8Q0JDX0VBTjEzPigpOwogICAgIGNhc2UgQkNfUVJfQ09ERToKLSAgICAgIHJldHVybiBuZXcgQ0JDX1FSQ29kZSgpOworICAgICAgcmV0dXJuIHBkZml1bTo6TWFrZVVuaXF1ZTxDQkNfUVJDb2RlPigpOwogICAgIGNhc2UgQkNfUERGNDE3OgotICAgICAgcmV0dXJuIG5ldyBDQkNfUERGNDE3SSgpOworICAgICAgcmV0dXJuIHBkZml1bTo6TWFrZVVuaXF1ZTxDQkNfUERGNDE3ST4oKTsKICAgICBjYXNlIEJDX0RBVEFNQVRSSVg6Ci0gICAgICByZXR1cm4gbmV3IENCQ19EYXRhTWF0cml4KCk7CisgICAgICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENCQ19EYXRhTWF0cml4PigpOwogICAgIGNhc2UgQkNfVU5LTk9XTjoKICAgICBkZWZhdWx0OgogICAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC01Nyw3ICs2MCw3IEBACiBDRlhfQmFyY29kZTo6fkNGWF9CYXJjb2RlKCkge30KIAogYm9vbCBDRlhfQmFyY29kZTo6Q3JlYXRlKEJDX1RZUEUgdHlwZSkgewotICBtX3BCQ0VuZ2luZS5yZXNldChDcmVhdGVCYXJDb2RlRW5naW5lT2JqZWN0KHR5cGUpKTsKKyAgbV9wQkNFbmdpbmUgPSBDcmVhdGVCYXJDb2RlRW5naW5lT2JqZWN0KHR5cGUpOwogICByZXR1cm4gISFtX3BCQ0VuZ2luZTsKIH0KIApAQCAtMTYwLDcgKzE2Myw3IEBACiAgIH0KIH0KIAotYm9vbCBDRlhfQmFyY29kZTo6U2V0Rm9udFNpemUoRlhfRkxPQVQgc2l6ZSkgeworYm9vbCBDRlhfQmFyY29kZTo6U2V0Rm9udFNpemUoZmxvYXQgc2l6ZSkgewogICBzd2l0Y2ggKEdldFR5cGUoKSkgewogICAgIGNhc2UgQkNfQ09ERTM5OgogICAgIGNhc2UgQkNfQ09EQUJBUjoKQEAgLTIxOSw4ICsyMjIsOCBAQAogICByZXR1cm4gbV9wQkNFbmdpbmUgJiYgbWVtcHRyID8gKG1fcEJDRW5naW5lLmdldCgpLT4qbWVtcHRyKShsb2NhdGlvbikgOiBmYWxzZTsKIH0KIAotYm9vbCBDRlhfQmFyY29kZTo6U2V0V2lkZU5hcnJvd1JhdGlvKGludDMyX3QgcmF0aW8pIHsKLSAgdHlwZWRlZiBib29sIChDQkNfQ29kZUJhc2U6OiptZW1wdHJ0eXBlKShpbnQzMl90KTsKK2Jvb2wgQ0ZYX0JhcmNvZGU6OlNldFdpZGVOYXJyb3dSYXRpbyhpbnQ4X3QgcmF0aW8pIHsKKyAgdHlwZWRlZiBib29sIChDQkNfQ29kZUJhc2U6OiptZW1wdHJ0eXBlKShpbnQ4X3QpOwogICBtZW1wdHJ0eXBlIG1lbXB0ciA9IG51bGxwdHI7CiAgIHN3aXRjaCAoR2V0VHlwZSgpKSB7CiAgICAgY2FzZSBCQ19DT0RFMzk6CkBAIC0yMzUsOCArMjM4LDggQEAKICAgcmV0dXJuIG1fcEJDRW5naW5lICYmIG1lbXB0ciA/IChtX3BCQ0VuZ2luZS5nZXQoKS0+Km1lbXB0cikocmF0aW8pIDogZmFsc2U7CiB9CiAKLWJvb2wgQ0ZYX0JhcmNvZGU6OlNldFN0YXJ0Q2hhcihGWF9DSEFSIHN0YXJ0KSB7Ci0gIHR5cGVkZWYgYm9vbCAoQ0JDX0NvZGVCYXNlOjoqbWVtcHRydHlwZSkoRlhfQ0hBUik7Citib29sIENGWF9CYXJjb2RlOjpTZXRTdGFydENoYXIoY2hhciBzdGFydCkgeworICB0eXBlZGVmIGJvb2wgKENCQ19Db2RlQmFzZTo6Km1lbXB0cnR5cGUpKGNoYXIpOwogICBtZW1wdHJ0eXBlIG1lbXB0ciA9IG51bGxwdHI7CiAgIHN3aXRjaCAoR2V0VHlwZSgpKSB7CiAgICAgY2FzZSBCQ19DT0RBQkFSOgpAQCAtMjQ4LDggKzI1MSw4IEBACiAgIHJldHVybiBtX3BCQ0VuZ2luZSAmJiBtZW1wdHIgPyAobV9wQkNFbmdpbmUuZ2V0KCktPiptZW1wdHIpKHN0YXJ0KSA6IGZhbHNlOwogfQogCi1ib29sIENGWF9CYXJjb2RlOjpTZXRFbmRDaGFyKEZYX0NIQVIgZW5kKSB7Ci0gIHR5cGVkZWYgYm9vbCAoQ0JDX0NvZGVCYXNlOjoqbWVtcHRydHlwZSkoRlhfQ0hBUik7Citib29sIENGWF9CYXJjb2RlOjpTZXRFbmRDaGFyKGNoYXIgZW5kKSB7CisgIHR5cGVkZWYgYm9vbCAoQ0JDX0NvZGVCYXNlOjoqbWVtcHRydHlwZSkoY2hhcik7CiAgIG1lbXB0cnR5cGUgbWVtcHRyID0gbnVsbHB0cjsKICAgc3dpdGNoIChHZXRUeXBlKCkpIHsKICAgICBjYXNlIEJDX0NPREFCQVI6CkBAIC0yNjEsMTkgKzI2NCw2IEBACiAgIHJldHVybiBtX3BCQ0VuZ2luZSAmJiBtZW1wdHIgPyAobV9wQkNFbmdpbmUuZ2V0KCktPiptZW1wdHIpKGVuZCkgOiBmYWxzZTsKIH0KIAotYm9vbCBDRlhfQmFyY29kZTo6U2V0VmVyc2lvbihpbnQzMl90IHZlcnNpb24pIHsKLSAgdHlwZWRlZiBib29sIChDQkNfQ29kZUJhc2U6OiptZW1wdHJ0eXBlKShpbnQzMl90KTsKLSAgbWVtcHRydHlwZSBtZW1wdHIgPSBudWxscHRyOwotICBzd2l0Y2ggKEdldFR5cGUoKSkgewotICAgIGNhc2UgQkNfUVJfQ09ERToKLSAgICAgIG1lbXB0ciA9IChtZW1wdHJ0eXBlKSZDQkNfUVJDb2RlOjpTZXRWZXJzaW9uOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBtX3BCQ0VuZ2luZSAmJiBtZW1wdHIgPyAobV9wQkNFbmdpbmUuZ2V0KCktPiptZW1wdHIpKHZlcnNpb24pIDogZmFsc2U7Ci19Ci0KIGJvb2wgQ0ZYX0JhcmNvZGU6OlNldEVycm9yQ29ycmVjdGlvbkxldmVsKGludDMyX3QgbGV2ZWwpIHsKICAgdHlwZWRlZiBib29sIChDQkNfQ29kZUJhc2U6OiptZW1wdHJ0eXBlKShpbnQzMl90KTsKICAgbWVtcHRydHlwZSBtZW1wdHIgPSBudWxscHRyOwpAQCAtMjg5LDYgKzI3OSw3IEBACiAgIH0KICAgcmV0dXJuIG1fcEJDRW5naW5lICYmIG1lbXB0ciA/IChtX3BCQ0VuZ2luZS5nZXQoKS0+Km1lbXB0cikobGV2ZWwpIDogZmFsc2U7CiB9CisKIGJvb2wgQ0ZYX0JhcmNvZGU6OlNldFRydW5jYXRlZChib29sIHRydW5jYXRlZCkgewogICB0eXBlZGVmIHZvaWQgKENCQ19Db2RlQmFzZTo6Km1lbXB0cnR5cGUpKGJvb2wpOwogICBtZW1wdHJ0eXBlIG1lbXB0ciA9IG51bGxwdHI7CkBAIC0zMDMsMTQgKzI5NCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmFsc2U7CiB9CiAKLWJvb2wgQ0ZYX0JhcmNvZGU6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICByZXR1cm4gbV9wQkNFbmdpbmUgJiYgbV9wQkNFbmdpbmUtPkVuY29kZShjb250ZW50cywgaXNEZXZpY2UsIGUpOworYm9vbCBDRlhfQmFyY29kZTo6RW5jb2RlKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBjb250ZW50cykgeworICByZXR1cm4gbV9wQkNFbmdpbmUgJiYgbV9wQkNFbmdpbmUtPkVuY29kZShjb250ZW50cyk7CiB9CiAKIGJvb2wgQ0ZYX0JhcmNvZGU6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgcmV0dXJuIG1fcEJDRW5naW5lICYmIG1fcEJDRW5naW5lLT5SZW5kZXJEZXZpY2UoZGV2aWNlLCBtYXRyaXgsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCkgeworICByZXR1cm4gbV9wQkNFbmdpbmUgJiYgbV9wQkNFbmdpbmUtPlJlbmRlckRldmljZShkZXZpY2UsIG1hdHJpeCk7CiB9CmRpZmYgLS1naXQgYS94ZmEvZndsL2NmeF9iYXJjb2RlLmggYi94ZmEvZndsL2NmeF9iYXJjb2RlLmgKaW5kZXggZjYzOTk3Ny4uZWVjNDY0OCAxMDA2NDQKLS0tIGEveGZhL2Z3bC9jZnhfYmFyY29kZS5oCisrKyBiL3hmYS9md2wvY2Z4X2JhcmNvZGUuaApAQCAtMTMsNyArMTMsNyBAQAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKICNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9CQ19MaWJyYXJ5LmgiCisjaW5jbHVkZSAiZnhiYXJjb2RlL0JDX0xpYnJhcnkuaCIKIAogY2xhc3MgQ0JDX0NvZGVCYXNlOwogY2xhc3MgQ0ZYX0ZvbnQ7CkBAIC0yNywxMSArMjcsOSBAQAogCiAgIGJvb2wgQ3JlYXRlKEJDX1RZUEUgdHlwZSk7CiAgIEJDX1RZUEUgR2V0VHlwZSgpOwotICBib29sIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLCBib29sIGlzRGV2aWNlLCBpbnQzMl90JiBlKTsKKyAgYm9vbCBFbmNvZGUoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGNvbnRlbnRzKTsKIAotICBib29sIFJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7CisgIGJvb2wgUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4KTsKIAogICBib29sIFNldENoYXJFbmNvZGluZyhCQ19DSEFSX0VOQ09ESU5HIGVuY29kaW5nKTsKIApAQCAtNDYsMTUgKzQ0LDE0IEBACiAgIGJvb2wgU2V0Q2FsQ2hlY2tzdW0oYm9vbCBzdGF0ZSk7CiAKICAgYm9vbCBTZXRGb250KENGWF9Gb250KiBwRm9udCk7Ci0gIGJvb2wgU2V0Rm9udFNpemUoRlhfRkxPQVQgc2l6ZSk7CisgIGJvb2wgU2V0Rm9udFNpemUoZmxvYXQgc2l6ZSk7CiAgIGJvb2wgU2V0Rm9udENvbG9yKEZYX0FSR0IgY29sb3IpOwogCiAgIGJvb2wgU2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKTsKIAotICBib29sIFNldFdpZGVOYXJyb3dSYXRpbyhpbnQzMl90IHJhdGlvKTsKLSAgYm9vbCBTZXRTdGFydENoYXIoRlhfQ0hBUiBzdGFydCk7Ci0gIGJvb2wgU2V0RW5kQ2hhcihGWF9DSEFSIGVuZCk7Ci0gIGJvb2wgU2V0VmVyc2lvbihpbnQzMl90IHZlcnNpb24pOworICBib29sIFNldFdpZGVOYXJyb3dSYXRpbyhpbnQ4X3QgcmF0aW8pOworICBib29sIFNldFN0YXJ0Q2hhcihjaGFyIHN0YXJ0KTsKKyAgYm9vbCBTZXRFbmRDaGFyKGNoYXIgZW5kKTsKICAgYm9vbCBTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGxldmVsKTsKICAgYm9vbCBTZXRUcnVuY2F0ZWQoYm9vbCB0cnVuY2F0ZWQpOwogCmRpZmYgLS1naXQgYS94ZmEvZndsL2NmeF9iYXJjb2RlX3VuaXR0ZXN0LmNwcCBiL3hmYS9md2wvY2Z4X2JhcmNvZGVfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOGFlZTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZndsL2NmeF9iYXJjb2RlX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDE0NSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAieGZhL2Z3bC9jZnhfYmFyY29kZS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9kZWZhdWx0cmVuZGVyZGV2aWNlLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworY2xhc3MgQmFyY29kZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIEJDX0xpYnJhcnlfSW5pdCgpOworICAgIGJhcmNvZGVfID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9CYXJjb2RlPigpOworCisgICAgYXV0byBkZXZpY2UgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0RlZmF1bHRSZW5kZXJEZXZpY2U+KCk7CisgICAgYXV0byBiaXRtYXAgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX0RJQml0bWFwPigpOworICAgIGlmIChiaXRtYXAtPkNyZWF0ZSg2NDAsIDQ4MCwgRlhESUJfUmdiMzIpKQorICAgICAgYml0bWFwXyA9IGJpdG1hcDsKKyAgICBBU1NFUlRfVFJVRShiaXRtYXBfKTsKKyAgICBBU1NFUlRfVFJVRShkZXZpY2UtPkF0dGFjaChiaXRtYXBfLCBmYWxzZSwgbnVsbHB0ciwgZmFsc2UpKTsKKyAgICBkZXZpY2VfID0gc3RkOjptb3ZlKGRldmljZSk7CisgIH0KKworICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIGJpdG1hcF8uUmVzZXQoKTsKKyAgICBkZXZpY2VfLnJlc2V0KCk7CisgICAgYmFyY29kZV8ucmVzZXQoKTsKKyAgICBCQ19MaWJyYXJ5X0Rlc3Ryb3koKTsKKyAgfQorCisgIENGWF9CYXJjb2RlKiBiYXJjb2RlKCkgY29uc3QgeyByZXR1cm4gYmFyY29kZV8uZ2V0KCk7IH0KKworICBib29sIENyZWF0ZShCQ19UWVBFIHR5cGUpIHsKKyAgICBpZiAoIWJhcmNvZGVfLT5DcmVhdGUodHlwZSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBiYXJjb2RlXy0+U2V0TW9kdWxlSGVpZ2h0KDMwMCk7CisgICAgYmFyY29kZV8tPlNldE1vZHVsZVdpZHRoKDQyMCk7CisgICAgYmFyY29kZV8tPlNldEhlaWdodCgyOTgpOworICAgIGJhcmNvZGVfLT5TZXRXaWR0aCg0MTgpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCBSZW5kZXJEZXZpY2UoKSB7CisgICAgcmV0dXJuIGJhcmNvZGVfLT5SZW5kZXJEZXZpY2UoZGV2aWNlXy5nZXQoKSwgJm1hdHJpeF8pOworICB9CisKKyAgc3RkOjpzdHJpbmcgQml0bWFwQ2hlY2tzdW0oKSB7CisgICAgcmV0dXJuIEdlbmVyYXRlTUQ1QmFzZTE2KGJpdG1hcF8tPkdldEJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRtYXBfLT5HZXRQaXRjaCgpICogYml0bWFwXy0+R2V0SGVpZ2h0KCkpOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIENGWF9NYXRyaXggbWF0cml4XzsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWF9CYXJjb2RlPiBiYXJjb2RlXzsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWF9SZW5kZXJEZXZpY2U+IGRldmljZV87CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IGJpdG1hcF87Cit9OworCitURVNUX0YoQmFyY29kZVRlc3QsIENvZGUzOSkgeworICBFWFBFQ1RfVFJVRShDcmVhdGUoQkNfQ09ERTM5KSk7CisgIEVYUEVDVF9UUlVFKGJhcmNvZGUoKS0+RW5jb2RlKEwiY2xhbXMiKSk7CisgIFJlbmRlckRldmljZSgpOworICBFWFBFQ1RfRVEoImNkNGNkM2YzNmRhMzhmZjU4ZDlmNjIxODI3MDE4OTAzIiwgQml0bWFwQ2hlY2tzdW0oKSk7Cit9CisKK1RFU1RfRihCYXJjb2RlVGVzdCwgQ29kYUJhcikgeworICBFWFBFQ1RfVFJVRShDcmVhdGUoQkNfQ09EQUJBUikpOworICBFWFBFQ1RfVFJVRShiYXJjb2RlKCktPkVuY29kZShMImNsYW1zIikpOworICBSZW5kZXJEZXZpY2UoKTsKKyAgRVhQRUNUX0VRKCI0ODExODlkYzRmODZlZGRiOGM0MjM0M2M5YjhlZjFkZCIsIEJpdG1hcENoZWNrc3VtKCkpOworfQorCitURVNUX0YoQmFyY29kZVRlc3QsIENvZGUxMjgpIHsKKyAgRVhQRUNUX1RSVUUoQ3JlYXRlKEJDX0NPREUxMjgpKTsKKyAgRVhQRUNUX1RSVUUoYmFyY29kZSgpLT5FbmNvZGUoTCJjbGFtcyIpKTsKKyAgUmVuZGVyRGV2aWNlKCk7CisgIEVYUEVDVF9FUSgiMTFiMjFjMTc4YTlmZDg2NmQ4YmUxOTZjMjEwM2IyNjMiLCBCaXRtYXBDaGVja3N1bSgpKTsKK30KKworVEVTVF9GKEJhcmNvZGVUZXN0LCBDb2RlMTI4X0IpIHsKKyAgRVhQRUNUX1RSVUUoQ3JlYXRlKEJDX0NPREUxMjhfQikpOworICBFWFBFQ1RfVFJVRShiYXJjb2RlKCktPkVuY29kZShMImNsYW1zIikpOworICBSZW5kZXJEZXZpY2UoKTsKKyAgRVhQRUNUX0VRKCIxMWIyMWMxNzhhOWZkODY2ZDhiZTE5NmMyMTAzYjI2MyIsIEJpdG1hcENoZWNrc3VtKCkpOworfQorCitURVNUX0YoQmFyY29kZVRlc3QsIENvZGUxMjhfQykgeworICBFWFBFQ1RfVFJVRShDcmVhdGUoQkNfQ09ERTEyOF9DKSk7CisgIEVYUEVDVF9UUlVFKGJhcmNvZGUoKS0+RW5jb2RlKEwiY2xhbXMiKSk7CisgIFJlbmRlckRldmljZSgpOworICBFWFBFQ1RfRVEoIjYyODRlYzg1MDNkNWE5NDhjOTUxODEwOGRhMzNjZGQzIiwgQml0bWFwQ2hlY2tzdW0oKSk7Cit9CisKK1RFU1RfRihCYXJjb2RlVGVzdCwgRWFuOCkgeworICBFWFBFQ1RfVFJVRShDcmVhdGUoQkNfRUFOOCkpOworICBFWFBFQ1RfVFJVRShiYXJjb2RlKCktPkVuY29kZShMImNsYW1zIikpOworICBSZW5kZXJEZXZpY2UoKTsKKyAgRVhQRUNUX0VRKCIyMmQ4NWJjYjAyZDQ4ZjQ4ODEzZjAyYTFjYzljZmU4YyIsIEJpdG1hcENoZWNrc3VtKCkpOworfQorCitURVNUX0YoQmFyY29kZVRlc3QsIFVQQ0EpIHsKKyAgRVhQRUNUX1RSVUUoQ3JlYXRlKEJDX1VQQ0EpKTsKKyAgRVhQRUNUX1RSVUUoYmFyY29kZSgpLT5FbmNvZGUoTCJjbGFtcyIpKTsKKyAgUmVuZGVyRGV2aWNlKCk7CisgIEVYUEVDVF9FUSgiY2NlNDFmYzMwODUyNzQ0YzQ0YjMzNTMwNTliNTY4YjQiLCBCaXRtYXBDaGVja3N1bSgpKTsKK30KKworVEVTVF9GKEJhcmNvZGVUZXN0LCBFYW4xMykgeworICBFWFBFQ1RfVFJVRShDcmVhdGUoQkNfRUFOMTMpKTsKKyAgRVhQRUNUX1RSVUUoYmFyY29kZSgpLT5FbmNvZGUoTCJjbGFtcyIpKTsKKyAgUmVuZGVyRGV2aWNlKCk7CisgIEVYUEVDVF9FUSgiMTg3MDkxZWMxZmQxODMwZmM0ZDQxZDQwYTkyM2Q0ZmIiLCBCaXRtYXBDaGVja3N1bSgpKTsKK30KKworVEVTVF9GKEJhcmNvZGVUZXN0LCBQZGY0MTcpIHsKKyAgRVhQRUNUX1RSVUUoQ3JlYXRlKEJDX1BERjQxNykpOworICBFWFBFQ1RfVFJVRShiYXJjb2RlKCktPkVuY29kZShMImNsYW1zIikpOworICBSZW5kZXJEZXZpY2UoKTsKKyAgRVhQRUNUX0VRKCIyYmRiOWIzOWYyMGM1NzYzZGE2YTBkN2M3YjFmNjkzMyIsIEJpdG1hcENoZWNrc3VtKCkpOworfQorCitURVNUX0YoQmFyY29kZVRlc3QsIERhdGFNYXRyaXgpIHsKKyAgRVhQRUNUX1RSVUUoQ3JlYXRlKEJDX0RBVEFNQVRSSVgpKTsKKyAgRVhQRUNUX1RSVUUoYmFyY29kZSgpLT5FbmNvZGUoTCJjbGFtcyIpKTsKKyAgUmVuZGVyRGV2aWNlKCk7CisgIEVYUEVDVF9FUSgiNWU1Y2Q5YTY4MGI4NmZjZDRmZmQ1M2VkMzZlM2M5ODAiLCBCaXRtYXBDaGVja3N1bSgpKTsKK30KKworVEVTVF9GKEJhcmNvZGVUZXN0LCBRckNvZGUpIHsKKyAgRVhQRUNUX1RSVUUoQ3JlYXRlKEJDX1FSX0NPREUpKTsKKyAgRVhQRUNUX1RSVUUoYmFyY29kZSgpLT5FbmNvZGUoTCJjbGFtcyIpKTsKKyAgUmVuZGVyRGV2aWNlKCk7CisgIEVYUEVDVF9FUSgiNDc1MWM2ZTBmNjc3NDlmYWJlMjRmNzg3MTI4ZGVjZWUiLCBCaXRtYXBDaGVja3N1bSgpKTsKK30KZGlmZiAtLWdpdCBhL3hmYS9md2wvaWZ3bF90aGVtZXByb3ZpZGVyLmggYi94ZmEvZndsL2lmd2xfdGhlbWVwcm92aWRlci5oCmluZGV4IDIxYTEyYTUuLmViYTMwODUgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvaWZ3bF90aGVtZXByb3ZpZGVyLmgKKysrIGIveGZhL2Z3bC9pZndsX3RoZW1lcHJvdmlkZXIuaApAQCAtOCw4ICs4LDEwIEBACiAjZGVmaW5lIFhGQV9GV0xfSUZXTF9USEVNRVBST1ZJREVSX0hfCiAKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC90aGVtZS9jZndsX3dpZGdldHRwLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgogCitjbGFzcyBDRkdBU19HRUZvbnQ7CiBjbGFzcyBDRldMX1RoZW1lQmFja2dyb3VuZDsKIGNsYXNzIENGV0xfVGhlbWVQYXJ0OwogY2xhc3MgQ0ZXTF9UaGVtZVRleHQ7CkBAIC0yNiw4ICsyOCw3IEBACiAgIHZpcnR1YWwgZmxvYXQgR2V0Q1lCb3JkZXJTaXplKCkgY29uc3QgPSAwOwogICB2aXJ0dWFsIENGWF9SZWN0RiBHZXRVSU1hcmdpbihDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCkgY29uc3QgPSAwOwogICB2aXJ0dWFsIGZsb2F0IEdldEZvbnRTaXplKENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0KSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IEdldEZvbnQoCi0gICAgICBDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCkgY29uc3QgPSAwOworICB2aXJ0dWFsIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+IEdldEZvbnQoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQpIGNvbnN0ID0gMDsKICAgdmlydHVhbCBmbG9hdCBHZXRMaW5lSGVpZ2h0KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0KSBjb25zdCA9IDA7CiAgIHZpcnR1YWwgZmxvYXQgR2V0U2Nyb2xsQmFyV2lkdGgoKSBjb25zdCA9IDA7CiAgIHZpcnR1YWwgRlhfQ09MT1JSRUYgR2V0VGV4dENvbG9yKENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0KSBjb25zdCA9IDA7CmRpZmYgLS1naXQgYS94ZmEvZndsL2lmd2xfd2lkZ2V0ZGVsZWdhdGUuaCBiL3hmYS9md2wvaWZ3bF93aWRnZXRkZWxlZ2F0ZS5oCmluZGV4IGE5NmYwMGQuLjA5YmFjOWEgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvaWZ3bF93aWRnZXRkZWxlZ2F0ZS5oCisrKyBiL3hmYS9md2wvaWZ3bF93aWRnZXRkZWxlZ2F0ZS5oCkBAIC0xMSw3ICsxMSw3IEBACiAKIGNsYXNzIENGV0xfRXZlbnQ7CiBjbGFzcyBDRldMX01lc3NhZ2U7Ci1jbGFzcyBDRlhfR3JhcGhpY3M7CitjbGFzcyBDWEZBX0dyYXBoaWNzOwogY2xhc3MgQ0ZYX01hdHJpeDsKIAogY2xhc3MgSUZXTF9XaWRnZXREZWxlZ2F0ZSB7CkBAIC0yMCw4ICsyMCw4IEBACiAKICAgdmlydHVhbCB2b2lkIE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgPSAwOwogICB2aXJ0dWFsIHZvaWQgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgPSAwOworICB2aXJ0dWFsIHZvaWQgT25EcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpID0gMDsKIH07CiAKICNlbmRpZiAgLy8gWEZBX0ZXTF9JRldMX1dJREdFVERFTEVHQVRFX0hfCmRpZmYgLS1naXQgYS94ZmEvZndsL2lmd2xfd2lkZ2V0bWdyZGVsZWdhdGUuaCBiL3hmYS9md2wvaWZ3bF93aWRnZXRtZ3JkZWxlZ2F0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjBiNTcwLi4wMDAwMDAwCi0tLSBhL3hmYS9md2wvaWZ3bF93aWRnZXRtZ3JkZWxlZ2F0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GV0xfSUZXTF9XSURHRVRNR1JERUxFR0FURV9IXwotI2RlZmluZSBYRkFfRldMX0lGV0xfV0lER0VUTUdSREVMRUdBVEVfSF8KLQotY2xhc3MgQ0ZXTF9NZXNzYWdlOwotY2xhc3MgQ0ZYX0dyYXBoaWNzOwotY2xhc3MgQ0ZYX01hdHJpeDsKLWNsYXNzIENGV0xfV2lkZ2V0OwotCi1jbGFzcyBDRldMX1dpZGdldE1nckRlbGVnYXRlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBPblNldENhcGFiaWxpdHkodWludDMyX3QgZHdDYXBhYmlsaXR5KSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBPblByb2Nlc3NNZXNzYWdlVG9Gb3JtKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpID0gMDsKLSAgdmlydHVhbCB2b2lkIE9uRHJhd1dpZGdldChDRldMX1dpZGdldCogcFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSA9IDA7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GV0xfSUZXTF9XSURHRVRNR1JERUxFR0FURV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z3bC90aGVtZS9SRUFETUUubWQgYi94ZmEvZndsL3RoZW1lL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTY5OTMyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z3bC90aGVtZS9SRUFETUUubWQKQEAgLTAsMCArMSwyOSBAQAoreGZhL2Z3bC90aGVtZSBjb250YWlucyBjb2RlIGZvciByZW5kZXJpbmcgWEZBIHdpZGdldHMuCisKK1RQIHN0YW5kcyBmb3IgVGhlbWUgUGFydC4KKworQ0ZXTF9XaWRnZXRUUCBjb250YWlucyBtdWNoIG9mIHRoZSBjb2RlIGNvbW1vbiB0byBtb3JlIHRoYW4gb25lIHdpZGdldC4KKworVGhlIG90aGVyIENGV0xfVFAgY2xhc3NlcyBkZXJpdmUgZnJvbSBpdCBhbmQga25vdyBob3cgdG8gZHJhdyB0aGUgcGllY2VzCitzcGVjaWZpYyB0byB0aGVpciByZXNwZWN0aXZlIHdpZGdldC4KKworVGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSBmb3IgdGhpcyBkaXJlY3RvcnkgaXM6CisKKyogQ0ZXTF9XaWRnZXRUUAorICAgICogQ0ZXTF9CYXJjb2RlVFAKKyAgICAqIENGV0xfQ2FyZXRUUAorICAgICogQ0ZXTF9DaGVja2JveFRQCisgICAgKiBDRldMX0NvbWJvQm93VFAKKyAgICAqIENGV0xfRGF0ZVRpbWVQaWNrZXJUUAorICAgICogQ0ZXTF9FZGl0VFAKKyAgICAqIENGV0xfTGlzdEJveFRQCisgICAgKiBDRldMX01vbnRoQ2FsZW5kYXJUUAorICAgICogQ0ZXTF9QaWN0dXJlQm94VFAKKyAgICAqIENGV0xfUHVzaEJ1dHRvblRQCisgICAgKiBDRldMX1Njcm9sbEJhclRQCisKK0FsbCB0aGVzZSB3aWRnZXQgVFAgY2xhc3NlcyBhcmUgY29tcG9zZWQgaW50byBDWEZBX0ZXTFRoZW1lLCB3aGljaCBpbXBsZW1lbnRzCitJRldMX1RoZW1lUHJvdmlkZXIgKGFuZCBpcyB0aGUgb25seSBjbGFzcyB0aGF0IGRvZXMpLiBDWEZBX0ZXTFRoZW1lIHJlY2VpdmVzCitEcmF3QmFja2dyb3VuZCgpIGNhbGxzIGZyb20gQ0ZXTCB3aWRnZXRzIHRvIGRyYXcgdGhlbXNlbHZlcyBhbmQgcm91dGVzIHRoZW0gdG8KK3RoZSBUUCAoVGhlbWUgUGFydCkgY29ycmVzcG9uZGluZyB0byB0aGF0IHdpZGdldC4KKwpkaWZmIC0tZ2l0IGEveGZhL2Z3bC90aGVtZS9jZndsX2NhcmV0dHAuY3BwIGIveGZhL2Z3bC90aGVtZS9jZndsX2NhcmV0dHAuY3BwCmluZGV4IDRhMDRmODYuLjk3MzUzMTkgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvdGhlbWUvY2Z3bF9jYXJldHRwLmNwcAorKysgYi94ZmEvZndsL3RoZW1lL2Nmd2xfY2FyZXR0cC5jcHAKQEAgLTksOCArOSw4IEBACiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2NhcmV0LmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3RoZW1lYmFja2dyb3VuZC5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF93aWRnZXQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfY29sb3IuaCIKLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfcGF0aC5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2Vjb2xvci5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2VwYXRoLmgiCiAKIENGV0xfQ2FyZXRUUDo6Q0ZXTF9DYXJldFRQKCkge30KIENGV0xfQ2FyZXRUUDo6fkNGV0xfQ2FyZXRUUCgpIHt9CkBAIC0yNSw3ICsyNSw3IEBACiAgICAgICAgIHJldHVybjsKIAogICAgICAgRHJhd0NhcmV0QksocFBhcmFtcy0+bV9wR3JhcGhpY3MsIHBQYXJhbXMtPm1fZHdTdGF0ZXMsCi0gICAgICAgICAgICAgICAgICAmKHBQYXJhbXMtPm1fcnRQYXJ0KSwgKENGWF9Db2xvciopcFBhcmFtcy0+bV9wRGF0YSwKKyAgICAgICAgICAgICAgICAgICYocFBhcmFtcy0+bV9ydFBhcnQpLCAoQ1hGQV9HRUNvbG9yKilwUGFyYW1zLT5tX3BEYXRhLAogICAgICAgICAgICAgICAgICAgJihwUGFyYW1zLT5tX21hdHJpeCkpOwogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMzQsMTkgKzM0LDE4IEBACiAgIH0KIH0KIAotdm9pZCBDRldMX0NhcmV0VFA6OkRyYXdDYXJldEJLKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAordm9pZCBDRldMX0NhcmV0VFA6OkRyYXdDYXJldEJLKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Db2xvciogY3JGaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfR0VDb2xvciogY3JGaWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgQ0ZYX1BhdGggcGF0aDsKKyAgQ1hGQV9HRVBhdGggcGF0aDsKICAgQ0ZYX1JlY3RGIHJlY3QgPSAqcFJlY3Q7CiAgIHBhdGguQWRkUmVjdGFuZ2xlKHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0KTsKICAgaWYgKGNyRmlsbCkgewotICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKGNyRmlsbCk7CisgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoKmNyRmlsbCk7CiAgIH0gZWxzZSB7Ci0gICAgQ0ZYX0NvbG9yIGNyRmlsbHRlbXAoQXJnYkVuY29kZSgyNTUsIDAsIDAsIDApKTsKLSAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsdGVtcCk7CisgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoQ1hGQV9HRUNvbG9yKEFyZ2JFbmNvZGUoMjU1LCAwLCAwLCAwKSkpOwogICB9CiAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsKIH0KZGlmZiAtLWdpdCBhL3hmYS9md2wvdGhlbWUvY2Z3bF9jYXJldHRwLmggYi94ZmEvZndsL3RoZW1lL2Nmd2xfY2FyZXR0cC5oCmluZGV4IGY3ZDQ0YjcuLjhiODhmZWUgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvdGhlbWUvY2Z3bF9jYXJldHRwLmgKKysrIGIveGZhL2Z3bC90aGVtZS9jZndsX2NhcmV0dHAuaApAQCAtMTgsMTAgKzE4LDEwIEBACiAgIHZvaWQgRHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpIG92ZXJyaWRlOwogCiAgcHJvdGVjdGVkOgotICB2b2lkIERyYXdDYXJldEJLKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAorICB2b2lkIERyYXdDYXJldEJLKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXRlcywKICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LAotICAgICAgICAgICAgICAgICAgIENGWF9Db2xvciogY3JGaWxsLAorICAgICAgICAgICAgICAgICAgIENYRkFfR0VDb2xvciogY3JGaWxsLAogICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBudWxscHRyKTsKIH07CiAKZGlmZiAtLWdpdCBhL3hmYS9md2wvdGhlbWUvY2Z3bF9jaGVja2JveHRwLmNwcCBiL3hmYS9md2wvdGhlbWUvY2Z3bF9jaGVja2JveHRwLmNwcAppbmRleCAxZDE4NWI0Li44MmZkYzFhIDEwMDY0NAotLS0gYS94ZmEvZndsL3RoZW1lL2Nmd2xfY2hlY2tib3h0cC5jcHAKKysrIGIveGZhL2Z3bC90aGVtZS9jZndsX2NoZWNrYm94dHAuY3BwCkBAIC04LDE4ICs4LDI1IEBACiAKICNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3BhdGhkYXRhLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotI2luY2x1ZGUgInhmYS9mZGUvdHRvL2ZkZV90ZXh0b3V0LmgiCisjaW5jbHVkZSAieGZhL2ZkZS9jZmRlX3RleHRvdXQuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfY2hlY2tib3guaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfdGhlbWViYWNrZ3JvdW5kLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3RoZW1ldGV4dC5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF93aWRnZXQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfY29sb3IuaCIKLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfcGF0aC5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2Vjb2xvci5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2VwYXRoLmgiCiAKIG5hbWVzcGFjZSB7CiAKIGNvbnN0IGludCBrU2lnblBhdGggPSAxMDA7CiAKK0NGWF9Qb2ludEYgU2NhbGVCZXppZXJQb2ludChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICBDRlhfUG9pbnRGIHNjYWxlZF9wb2ludChwb2ludCk7CisgIHNjYWxlZF9wb2ludC54ICo9IEZYX0JFWklFUjsKKyAgc2NhbGVkX3BvaW50LnkgKj0gRlhfQkVaSUVSOworICByZXR1cm4gc2NhbGVkX3BvaW50OworfQorCiB9ICAvLyBuYW1lc3BhY2UKIAogI2RlZmluZSBDSEVDS0JPWF9DT0xPUl9CT1hMVDEgKEFyZ2JFbmNvZGUoMjU1LCAxNzIsIDE2OCwgMTUzKSkKQEAgLTU2LDcgKzYzLDcgQEAKICAgQ0ZXTF9XaWRnZXRUUDo6RHJhd1RleHQocFBhcmFtcyk7CiB9CiAKLXZvaWQgQ0ZXTF9DaGVja0JveFRQOjpEcmF3U2lnbkNoZWNrKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAordm9pZCBDRldMX0NoZWNrQm94VFA6OkRyYXdTaWduQ2hlY2soQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUnRTaWduLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiRmlsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKQEAgLTY0LDEwMCArNzEsOTQgQEAKICAgICBJbml0Q2hlY2tQYXRoKHBSdFNpZ24tPndpZHRoKTsKIAogICBDRlhfTWF0cml4IG10OwotICBtdC5TZXRJZGVudGl0eSgpOwogICBtdC5UcmFuc2xhdGUocFJ0U2lnbi0+bGVmdCwgcFJ0U2lnbi0+dG9wKTsKICAgbXQuQ29uY2F0KCpwTWF0cml4KTsKLSAgQ0ZYX0NvbG9yIGNyRmlsbChhcmdiRmlsbCk7CiAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsKLSAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7CisgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKENYRkFfR0VDb2xvcihhcmdiRmlsbCkpOwogICBwR3JhcGhpY3MtPkZpbGxQYXRoKG1fcENoZWNrUGF0aC5nZXQoKSwgRlhGSUxMX1dJTkRJTkcsICZtdCk7CiAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsKIH0KIAotdm9pZCBDRldMX0NoZWNrQm94VFA6OkRyYXdTaWduQ2lyY2xlKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAordm9pZCBDRldMX0NoZWNrQm94VFA6OkRyYXdTaWduQ2lyY2xlKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdFNpZ24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiRmlsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7Ci0gIENGWF9QYXRoIHBhdGg7CisgIENYRkFfR0VQYXRoIHBhdGg7CiAgIHBhdGguQWRkRWxsaXBzZSgqcFJ0U2lnbik7Ci0gIENGWF9Db2xvciBjckZpbGwoYXJnYkZpbGwpOwogICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7Ci0gIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOworICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcihDWEZBX0dFQ29sb3IoYXJnYkZpbGwpKTsKICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOwogICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7CiB9CiAKLXZvaWQgQ0ZXTF9DaGVja0JveFRQOjpEcmF3U2lnbkNyb3NzKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAordm9pZCBDRldMX0NoZWNrQm94VFA6OkRyYXdTaWduQ3Jvc3MoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUnRTaWduLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiRmlsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgQ0ZYX1BhdGggcGF0aDsKLSAgRlhfRkxPQVQgZlJpZ2h0ID0gcFJ0U2lnbi0+cmlnaHQoKTsKLSAgRlhfRkxPQVQgZkJvdHRvbSA9IHBSdFNpZ24tPmJvdHRvbSgpOworICBDWEZBX0dFUGF0aCBwYXRoOworICBmbG9hdCBmUmlnaHQgPSBwUnRTaWduLT5yaWdodCgpOworICBmbG9hdCBmQm90dG9tID0gcFJ0U2lnbi0+Ym90dG9tKCk7CiAgIHBhdGguQWRkTGluZShwUnRTaWduLT5Ub3BMZWZ0KCksIENGWF9Qb2ludEYoZlJpZ2h0LCBmQm90dG9tKSk7CiAgIHBhdGguQWRkTGluZShDRlhfUG9pbnRGKHBSdFNpZ24tPmxlZnQsIGZCb3R0b20pLAogICAgICAgICAgICAgICAgQ0ZYX1BvaW50RihmUmlnaHQsIHBSdFNpZ24tPnRvcCkpOwogCi0gIENGWF9Db2xvciBjckZpbGwoYXJnYkZpbGwpOwogICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7Ci0gIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyRmlsbCk7CisgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoQ1hGQV9HRUNvbG9yKGFyZ2JGaWxsKSk7CiAgIHBHcmFwaGljcy0+U2V0TGluZVdpZHRoKDEuMGYpOwogICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOwogICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7CiB9CiAKLXZvaWQgQ0ZXTF9DaGVja0JveFRQOjpEcmF3U2lnbkRpYW1vbmQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCit2b2lkIENGV0xfQ2hlY2tCb3hUUDo6RHJhd1NpZ25EaWFtb25kKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUnRTaWduLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2JGaWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7Ci0gIENGWF9QYXRoIHBhdGg7Ci0gIEZYX0ZMT0FUIGZXaWR0aCA9IHBSdFNpZ24tPndpZHRoOwotICBGWF9GTE9BVCBmSGVpZ2h0ID0gcFJ0U2lnbi0+aGVpZ2h0OwotICBGWF9GTE9BVCBmQm90dG9tID0gcFJ0U2lnbi0+Ym90dG9tKCk7CisgIENYRkFfR0VQYXRoIHBhdGg7CisgIGZsb2F0IGZXaWR0aCA9IHBSdFNpZ24tPndpZHRoOworICBmbG9hdCBmSGVpZ2h0ID0gcFJ0U2lnbi0+aGVpZ2h0OworICBmbG9hdCBmQm90dG9tID0gcFJ0U2lnbi0+Ym90dG9tKCk7CiAgIHBhdGguTW92ZVRvKENGWF9Qb2ludEYocFJ0U2lnbi0+bGVmdCArIGZXaWR0aCAvIDIsIHBSdFNpZ24tPnRvcCkpOwogICBwYXRoLkxpbmVUbyhDRlhfUG9pbnRGKHBSdFNpZ24tPmxlZnQsIHBSdFNpZ24tPnRvcCArIGZIZWlnaHQgLyAyKSk7CiAgIHBhdGguTGluZVRvKENGWF9Qb2ludEYocFJ0U2lnbi0+bGVmdCArIGZXaWR0aCAvIDIsIGZCb3R0b20pKTsKICAgcGF0aC5MaW5lVG8oQ0ZYX1BvaW50RihwUnRTaWduLT5yaWdodCgpLCBwUnRTaWduLT50b3AgKyBmSGVpZ2h0IC8gMikpOwogICBwYXRoLkxpbmVUbyhDRlhfUG9pbnRGKHBSdFNpZ24tPmxlZnQgKyBmV2lkdGggLyAyLCBwUnRTaWduLT50b3ApKTsKIAotICBDRlhfQ29sb3IgY3JGaWxsKGFyZ2JGaWxsKTsKICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOwotICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsKKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoQ1hGQV9HRUNvbG9yKGFyZ2JGaWxsKSk7CiAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsKICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOwogfQogCi12b2lkIENGV0xfQ2hlY2tCb3hUUDo6RHJhd1NpZ25TcXVhcmUoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCit2b2lkIENGV0xfQ2hlY2tCb3hUUDo6RHJhd1NpZ25TcXVhcmUoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0U2lnbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2JGaWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgQ0ZYX1BhdGggcGF0aDsKKyAgQ1hGQV9HRVBhdGggcGF0aDsKICAgcGF0aC5BZGRSZWN0YW5nbGUocFJ0U2lnbi0+bGVmdCwgcFJ0U2lnbi0+dG9wLCBwUnRTaWduLT53aWR0aCwKICAgICAgICAgICAgICAgICAgICAgcFJ0U2lnbi0+aGVpZ2h0KTsKLSAgQ0ZYX0NvbG9yIGNyRmlsbChhcmdiRmlsbCk7CiAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsKLSAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7CisgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKENYRkFfR0VDb2xvcihhcmdiRmlsbCkpOwogICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7CiAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsKIH0KIAotdm9pZCBDRldMX0NoZWNrQm94VFA6OkRyYXdTaWduU3RhcihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKK3ZvaWQgQ0ZXTF9DaGVja0JveFRQOjpEcmF3U2lnblN0YXIoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdFNpZ24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYkZpbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgQ0ZYX1BhdGggcGF0aDsKLSAgRlhfRkxPQVQgZkJvdHRvbSA9IHBSdFNpZ24tPmJvdHRvbSgpOwotICBGWF9GTE9BVCBmUmFkaXVzID0KLSAgICAgIChwUnRTaWduLT50b3AgLSBmQm90dG9tKSAvICgxICsgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KGNvcyhGWF9QSSAvIDUuMGYpKSk7CisgIENYRkFfR0VQYXRoIHBhdGg7CisgIGZsb2F0IGZCb3R0b20gPSBwUnRTaWduLT5ib3R0b20oKTsKKyAgZmxvYXQgZlJhZGl1cyA9CisgICAgICAocFJ0U2lnbi0+dG9wIC0gZkJvdHRvbSkgLyAoMSArIHN0YXRpY19jYXN0PGZsb2F0Pihjb3MoRlhfUEkgLyA1LjBmKSkpOwogICBDRlhfUG9pbnRGIHB0Q2VudGVyKChwUnRTaWduLT5sZWZ0ICsgcFJ0U2lnbi0+cmlnaHQoKSkgLyAyLjBmLAogICAgICAgICAgICAgICAgICAgICAgIChwUnRTaWduLT50b3AgKyBmQm90dG9tKSAvIDIuMGYpOwogCiAgIENGWF9Qb2ludEYgcG9pbnRzWzVdOwotICBGWF9GTE9BVCBmQW5nZWwgPSBGWF9QSSAvIDEwLjBmOworICBmbG9hdCBmQW5nZWwgPSBGWF9QSSAvIDEwLjBmOwogICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA1OyBpKyspIHsKICAgICBwb2ludHNbaV0gPQotICAgICAgICBwdENlbnRlciArIENGWF9Qb2ludEYoZlJhZGl1cyAqIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihjb3MoZkFuZ2VsKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUmFkaXVzICogc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KHNpbihmQW5nZWwpKSk7CisgICAgICAgIHB0Q2VudGVyICsgQ0ZYX1BvaW50RihmUmFkaXVzICogc3RhdGljX2Nhc3Q8ZmxvYXQ+KGNvcyhmQW5nZWwpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZSYWRpdXMgKiBzdGF0aWNfY2FzdDxmbG9hdD4oc2luKGZBbmdlbCkpKTsKICAgICBmQW5nZWwgKz0gRlhfUEkgKiAyIC8gNS4wZjsKICAgfQogCkBAIC0xNzAsMTAgKzE3MSw4IEBACiAKICAgICBwYXRoLkxpbmVUbyhwb2ludHNbbk5leHRdKTsKICAgfQotCi0gIENGWF9Db2xvciBjckZpbGwoYXJnYkZpbGwpOwogICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7Ci0gIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOworICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcihDWEZBX0dFQ29sb3IoYXJnYkZpbGwpKTsKICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOwogICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7CiB9CkBAIC0yMTYsMTMgKzIxNSwxMyBAQAogICBtX3BUaGVtZURhdGEtPmNsclNpZ25OZXV0cmFsUHJlc3NlZCA9IEFyZ2JFbmNvZGUoMjU1LCAyOCwgMTM0LCAyNik7CiB9CiAKLXZvaWQgQ0ZXTF9DaGVja0JveFRQOjpJbml0Q2hlY2tQYXRoKEZYX0ZMT0FUIGZDaGVja0xlbikgewordm9pZCBDRldMX0NoZWNrQm94VFA6OkluaXRDaGVja1BhdGgoZmxvYXQgZkNoZWNrTGVuKSB7CiAgIGlmICghbV9wQ2hlY2tQYXRoKSB7Ci0gICAgbV9wQ2hlY2tQYXRoID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9QYXRoPigpOworICAgIG1fcENoZWNrUGF0aCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0dFUGF0aD4oKTsKIAotICAgIEZYX0ZMT0FUIGZXaWR0aCA9IGtTaWduUGF0aDsKLSAgICBGWF9GTE9BVCBmSGVpZ2h0ID0gLWtTaWduUGF0aDsKLSAgICBGWF9GTE9BVCBmQm90dG9tID0ga1NpZ25QYXRoOworICAgIGZsb2F0IGZXaWR0aCA9IGtTaWduUGF0aDsKKyAgICBmbG9hdCBmSGVpZ2h0ID0gLWtTaWduUGF0aDsKKyAgICBmbG9hdCBmQm90dG9tID0ga1NpZ25QYXRoOwogICAgIENGWF9Qb2ludEYgcHQxKGZXaWR0aCAvIDE1LjBmLCBmQm90dG9tICsgZkhlaWdodCAqIDIgLyA1LjBmKTsKICAgICBDRlhfUG9pbnRGIHB0MihmV2lkdGggLyA0LjVmLCBmQm90dG9tICsgZkhlaWdodCAvIDE2LjBmKTsKICAgICBDRlhfUG9pbnRGIHB0MyhmV2lkdGggLyAzLjBmLCBmQm90dG9tKTsKQEAgLTI0MiwyOCArMjQxLDI4IEBACiAgICAgQ0ZYX1BvaW50RiBwdDE1KGZXaWR0aCAvIDMuNWYsIGZCb3R0b20gKyBmSGVpZ2h0ICogMy41ZiAvIDUuMGYpOwogICAgIG1fcENoZWNrUGF0aC0+TW92ZVRvKHB0MSk7CiAKLSAgICBDRlhfUG9pbnRGIHAxID0gQ0ZYX1BvaW50RihwdDEyLnggLSBwdDEueCwgcHQxMi55IC0gcHQxLnkpICogRlhfQkVaSUVSOwotICAgIENGWF9Qb2ludEYgcDIgPSBDRlhfUG9pbnRGKHB0MjEueCAtIHB0Mi54LCBwdDIxLnkgLSBwdDIueSkgKiBGWF9CRVpJRVI7CisgICAgQ0ZYX1BvaW50RiBwMSA9IFNjYWxlQmV6aWVyUG9pbnQocHQxMiAtIHB0MSk7CisgICAgQ0ZYX1BvaW50RiBwMiA9IFNjYWxlQmV6aWVyUG9pbnQocHQyMSAtIHB0Mik7CiAgICAgbV9wQ2hlY2tQYXRoLT5CZXppZXJUbyhwdDEgKyBwMSwgcHQyICsgcDIsIHB0Mik7CiAKLSAgICBwMSA9IENGWF9Qb2ludEYocHQyMy54IC0gcHQyLngsIHB0MjMueSAtIHB0Mi55KSAqIEZYX0JFWklFUjsKLSAgICBwMiA9IENGWF9Qb2ludEYocHQzMi54IC0gcHQzLngsIHB0MzIueSAtIHB0My55KSAqIEZYX0JFWklFUjsKKyAgICBwMSA9IFNjYWxlQmV6aWVyUG9pbnQocHQyMyAtIHB0Mik7CisgICAgcDIgPSBTY2FsZUJlemllclBvaW50KHB0MzIgLSBwdDMpOwogICAgIG1fcENoZWNrUGF0aC0+QmV6aWVyVG8ocHQyICsgcDEsIHB0MyArIHAyLCBwdDMpOwogCi0gICAgcDEgPSBDRlhfUG9pbnRGKHB0MzQueCAtIHB0My54LCBwdDM0LnkgLSBwdDMueSkgKiBGWF9CRVpJRVI7Ci0gICAgcDIgPSBDRlhfUG9pbnRGKHB0NDMueCAtIHB0NC54LCBwdDQzLnkgLSBwdDQueSkgKiBGWF9CRVpJRVI7CisgICAgcDEgPSBTY2FsZUJlemllclBvaW50KHB0MzQgLSBwdDMpOworICAgIHAyID0gU2NhbGVCZXppZXJQb2ludChwdDQzIC0gcHQ0KTsKICAgICBtX3BDaGVja1BhdGgtPkJlemllclRvKHB0MyArIHAxLCBwdDQgKyBwMiwgcHQ0KTsKIAotICAgIHAxID0gQ0ZYX1BvaW50RihwdDQ1LnggLSBwdDQueCwgcHQ0NS55IC0gcHQ0LnkpICogRlhfQkVaSUVSOwotICAgIHAyID0gQ0ZYX1BvaW50RihwdDU0LnggLSBwdDUueCwgcHQ1NC55IC0gcHQ1LnkpICogRlhfQkVaSUVSOworICAgIHAxID0gU2NhbGVCZXppZXJQb2ludChwdDQ1IC0gcHQ0KTsKKyAgICBwMiA9IFNjYWxlQmV6aWVyUG9pbnQocHQ1NCAtIHB0NSk7CiAgICAgbV9wQ2hlY2tQYXRoLT5CZXppZXJUbyhwdDQgKyBwMSwgcHQ1ICsgcDIsIHB0NSk7CiAKLSAgICBwMSA9IENGWF9Qb2ludEYocHQ1MS54IC0gcHQ1LngsIHB0NTEueSAtIHB0NS55KSAqIEZYX0JFWklFUjsKLSAgICBwMiA9IENGWF9Qb2ludEYocHQxNS54IC0gcHQxLngsIHB0MTUueSAtIHB0MS55KSAqIEZYX0JFWklFUjsKKyAgICBwMSA9IFNjYWxlQmV6aWVyUG9pbnQocHQ1MSAtIHB0NSk7CisgICAgcDIgPSBTY2FsZUJlemllclBvaW50KHB0MTUgLSBwdDEpOwogICAgIG1fcENoZWNrUGF0aC0+QmV6aWVyVG8ocHQ1ICsgcDEsIHB0MSArIHAyLCBwdDEpOwogCi0gICAgRlhfRkxPQVQgZlNjYWxlID0gZkNoZWNrTGVuIC8ga1NpZ25QYXRoOwotICAgIENGWF9NYXRyaXggbXQoMSwgMCwgMCwgMSwgMCwgMCk7CisgICAgZmxvYXQgZlNjYWxlID0gZkNoZWNrTGVuIC8ga1NpZ25QYXRoOworICAgIENGWF9NYXRyaXggbXQ7CiAgICAgbXQuU2NhbGUoZlNjYWxlLCBmU2NhbGUpOwogCiAgICAgbV9wQ2hlY2tQYXRoLT5UcmFuc2Zvcm1CeShtdCk7CkBAIC0yODIsNyArMjgxLDcgQEAKIH0KIAogdm9pZCBDRldMX0NoZWNrQm94VFA6OkRyYXdDaGVja1NpZ24oQ0ZXTF9XaWRnZXQqIHBXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcFJ0Qm94LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7CmRpZmYgLS1naXQgYS94ZmEvZndsL3RoZW1lL2Nmd2xfY2hlY2tib3h0cC5oIGIveGZhL2Z3bC90aGVtZS9jZndsX2NoZWNrYm94dHAuaAppbmRleCA5NzliOTcwLi5lMzczYjM4IDEwMDY0NAotLS0gYS94ZmEvZndsL3RoZW1lL2Nmd2xfY2hlY2tib3h0cC5oCisrKyBiL3hmYS9md2wvdGhlbWUvY2Z3bF9jaGVja2JveHRwLmgKQEAgLTM2LDM5ICszNiwzOSBAQAogICB9OwogCiAgIHZvaWQgRHJhd0NoZWNrU2lnbihDRldMX1dpZGdldCogcFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBwUnRCb3gsCiAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpOwotICB2b2lkIERyYXdTaWduQ2hlY2soQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgIHZvaWQgRHJhd1NpZ25DaGVjayhDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdFNpZ24sCiAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2JGaWxsLAogICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCk7Ci0gIHZvaWQgRHJhd1NpZ25DaXJjbGUoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgIHZvaWQgRHJhd1NpZ25DaXJjbGUoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0U2lnbiwKICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2JGaWxsLAogICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpOwotICB2b2lkIERyYXdTaWduQ3Jvc3MoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgIHZvaWQgRHJhd1NpZ25Dcm9zcyhDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdFNpZ24sCiAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2JGaWxsLAogICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCk7Ci0gIHZvaWQgRHJhd1NpZ25EaWFtb25kKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAorICB2b2lkIERyYXdTaWduRGlhbW9uZChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0U2lnbiwKICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiRmlsbCwKICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCk7Ci0gIHZvaWQgRHJhd1NpZ25TcXVhcmUoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgIHZvaWQgRHJhd1NpZ25TcXVhcmUoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJ0U2lnbiwKICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2JGaWxsLAogICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpOwotICB2b2lkIERyYXdTaWduU3RhcihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgdm9pZCBEcmF3U2lnblN0YXIoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdFNpZ24sCiAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYkZpbGwsCiAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpOwogCi0gIHZvaWQgSW5pdENoZWNrUGF0aChGWF9GTE9BVCBmQ2hlY2tMZW4pOworICB2b2lkIEluaXRDaGVja1BhdGgoZmxvYXQgZkNoZWNrTGVuKTsKIAogICBzdGQ6OnVuaXF1ZV9wdHI8Q0tCVGhlbWVEYXRhPiBtX3BUaGVtZURhdGE7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfUGF0aD4gbV9wQ2hlY2tQYXRoOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9HRVBhdGg+IG1fcENoZWNrUGF0aDsKIAogIHByaXZhdGU6CiAgIHZvaWQgU2V0VGhlbWVEYXRhKCk7CmRpZmYgLS1naXQgYS94ZmEvZndsL3RoZW1lL2Nmd2xfY29tYm9ib3h0cC5jcHAgYi94ZmEvZndsL3RoZW1lL2Nmd2xfY29tYm9ib3h0cC5jcHAKaW5kZXggNTNhNmVhZS4uNzY5NTM0MiAxMDA2NDQKLS0tIGEveGZhL2Z3bC90aGVtZS9jZndsX2NvbWJvYm94dHAuY3BwCisrKyBiL3hmYS9md2wvdGhlbWUvY2Z3bF9jb21ib2JveHRwLmNwcApAQCAtMTAsOCArMTAsOCBAQAogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF90aGVtZWJhY2tncm91bmQuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfd2lkZ2V0LmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9pZndsX3RoZW1lcHJvdmlkZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfY29sb3IuaCIKLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfcGF0aC5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2Vjb2xvci5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2VwYXRoLmgiCiAKIENGV0xfQ29tYm9Cb3hUUDo6Q0ZXTF9Db21ib0JveFRQKCkge30KIApAQCAtMjcsNyArMjcsNyBAQAogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNhc2UgQ0ZXTF9QYXJ0OjpCYWNrZ3JvdW5kOiB7Ci0gICAgICBDRlhfUGF0aCBwYXRoOworICAgICAgQ1hGQV9HRVBhdGggcGF0aDsKICAgICAgIENGWF9SZWN0RiYgcmVjdCA9IHBQYXJhbXMtPm1fcnRQYXJ0OwogICAgICAgcGF0aC5BZGRSZWN0YW5nbGUocmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwogICAgICAgRlhfQVJHQiBhcmdiX2NvbG9yOwpAQCAtNDIsOCArNDIsNyBAQAogICAgICAgICAgIGFyZ2JfY29sb3IgPSAweEZGRkZGRkZGOwogICAgICAgfQogICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7Ci0gICAgICBDRlhfQ29sb3IgY3IoYXJnYl9jb2xvcik7Ci0gICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjcik7CisgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKENYRkFfR0VDb2xvcihhcmdiX2NvbG9yKSk7CiAgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCAmcFBhcmFtcy0+bV9tYXRyaXgpOwogICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7CiAgICAgICBicmVhazsKQEAgLTY0LDExICs2MywxMSBAQAogdm9pZCBDRldMX0NvbWJvQm94VFA6OkRyYXdTdHJldGhIYW5kbGVyKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgQ0ZYX1BhdGggcGF0aDsKKyAgQ1hGQV9HRVBhdGggcGF0aDsKICAgcGF0aC5BZGRSZWN0YW5nbGUocFBhcmFtcy0+bV9ydFBhcnQubGVmdCwgcFBhcmFtcy0+bV9ydFBhcnQudG9wLAogICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3J0UGFydC53aWR0aCAtIDEsIHBQYXJhbXMtPm1fcnRQYXJ0LmhlaWdodCk7Ci0gIENGWF9Db2xvciBjcihBcmdiRW5jb2RlKDB4ZmYsIDB4ZmYsIDAsIDApKTsKLSAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3IpOworICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKAorICAgICAgQ1hGQV9HRUNvbG9yKEFyZ2JFbmNvZGUoMHhmZiwgMHhmZiwgMCwgMCkpKTsKICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgJnBQYXJhbXMtPm1fbWF0cml4KTsKIH0KIApkaWZmIC0tZ2l0IGEveGZhL2Z3bC90aGVtZS9jZndsX2VkaXR0cC5jcHAgYi94ZmEvZndsL3RoZW1lL2Nmd2xfZWRpdHRwLmNwcAppbmRleCA0MzE2MDE3Li41OTlhNGRkIDEwMDY0NAotLS0gYS94ZmEvZndsL3RoZW1lL2Nmd2xfZWRpdHRwLmNwcAorKysgYi94ZmEvZndsL3RoZW1lL2Nmd2xfZWRpdHRwLmNwcApAQCAtOSwxMCArOSwxMiBAQAogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9lZGl0LmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3RoZW1lYmFja2dyb3VuZC5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF93aWRnZXQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2Z3bHRoZW1lLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0LmgiCi0jaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY2Z4X2NvbG9yLmgiCi0jaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY2Z4X3BhdGguaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9md2x0aGVtZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2JvcmRlci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2VkZ2UuaCIKKyNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jeGZhX2dlY29sb3IuaCIKKyNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jeGZhX2dlcGF0aC5oIgogCiBDRldMX0VkaXRUUDo6Q0ZXTF9FZGl0VFAoKSB7fQogCkBAIC0yMSwxNyArMjMsMTcgQEAKIHZvaWQgQ0ZXTF9FZGl0VFA6OkRyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKSB7CiAgIGlmIChDRldMX1BhcnQ6OkNvbWJUZXh0TGluZSA9PSBwUGFyYW1zLT5tX2lQYXJ0KSB7CiAgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBQYXJhbXMtPm1fcFdpZGdldCk7CisgICAgQ1hGQV9Cb3JkZXIqIGJvcmRlclVJID0gcFdpZGdldC0+R2V0Tm9kZSgpLT5HZXRXaWRnZXRBY2MoKS0+R2V0VUlCb3JkZXIoKTsKICAgICBGWF9BUkdCIGNyID0gMHhGRjAwMDAwMDsKLSAgICBGWF9GTE9BVCBmV2lkdGggPSAxLjBmOwotICAgIGlmIChDWEZBX0JvcmRlciBib3JkZXJVSSA9IHBXaWRnZXQtPkdldERhdGFBY2MoKS0+R2V0VUlCb3JkZXIoKSkgewotICAgICAgQ1hGQV9FZGdlIGVkZ2UgPSBib3JkZXJVSS5HZXRFZGdlKDApOworICAgIGZsb2F0IGZXaWR0aCA9IDEuMGY7CisgICAgaWYgKGJvcmRlclVJKSB7CisgICAgICBDWEZBX0VkZ2UqIGVkZ2UgPSBib3JkZXJVSS0+R2V0RWRnZUlmRXhpc3RzKDApOwogICAgICAgaWYgKGVkZ2UpIHsKLSAgICAgICAgY3IgPSBlZGdlLkdldENvbG9yKCk7Ci0gICAgICAgIGZXaWR0aCA9IGVkZ2UuR2V0VGhpY2tuZXNzKCk7CisgICAgICAgIGNyID0gZWRnZS0+R2V0Q29sb3IoKTsKKyAgICAgICAgZldpZHRoID0gZWRnZS0+R2V0VGhpY2tuZXNzKCk7CiAgICAgICB9CiAgICAgfQotICAgIENGWF9Db2xvciBjckxpbmUoY3IpOwotICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY3JMaW5lKTsKKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoQ1hGQV9HRUNvbG9yKGNyKSk7CiAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldExpbmVXaWR0aChmV2lkdGgpOwogICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJva2VQYXRoKHBQYXJhbXMtPm1fcFBhdGgsICZwUGFyYW1zLT5tX21hdHJpeCk7CiAgICAgcmV0dXJuOwpAQCAtNDQsMjggKzQ2LDI3IEBACiAgICAgfQogICAgIGNhc2UgQ0ZXTF9QYXJ0OjpCYWNrZ3JvdW5kOiB7CiAgICAgICBpZiAocFBhcmFtcy0+bV9wUGF0aCkgewotICAgICAgICBDRlhfR3JhcGhpY3MqIHBHcmFwaGljcyA9IHBQYXJhbXMtPm1fcEdyYXBoaWNzOworICAgICAgICBDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MgPSBwUGFyYW1zLT5tX3BHcmFwaGljczsKICAgICAgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOwotICAgICAgICBDRlhfQ29sb3IgY3JTZWxlY3RlZChGV0xUSEVNRV9DT0xPUl9CS1NlbGVjdGVkKTsKLSAgICAgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyU2VsZWN0ZWQpOworICAgICAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcihDWEZBX0dFQ29sb3IoRldMVEhFTUVfQ09MT1JfQktTZWxlY3RlZCkpOwogICAgICAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKHBQYXJhbXMtPm1fcFBhdGgsIEZYRklMTF9XSU5ESU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUGFyYW1zLT5tX21hdHJpeCk7CiAgICAgICAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIENGWF9QYXRoIHBhdGg7CisgICAgICAgIENYRkFfR0VQYXRoIHBhdGg7CiAgICAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBQYXJhbXMtPm1fcnRQYXJ0LmxlZnQsIHBQYXJhbXMtPm1fcnRQYXJ0LnRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+bV9ydFBhcnQud2lkdGgsIHBQYXJhbXMtPm1fcnRQYXJ0LmhlaWdodCk7Ci0gICAgICAgIENGWF9Db2xvciBjcihGV0xUSEVNRV9DT0xPUl9CYWNrZ3JvdW5kKTsKKyAgICAgICAgQ1hGQV9HRUNvbG9yIGNyKEZXTFRIRU1FX0NPTE9SX0JhY2tncm91bmQpOwogICAgICAgICBpZiAoIXBQYXJhbXMtPm1fYlN0YXRpY0JhY2tncm91bmQpIHsKICAgICAgICAgICBpZiAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIENGV0xfUGFydFN0YXRlX0Rpc2FibGVkKQotICAgICAgICAgICAgY3IuU2V0KEZXTFRIRU1FX0NPTE9SX0VER0VSQjEpOworICAgICAgICAgICAgY3IgPSBDWEZBX0dFQ29sb3IoRldMVEhFTUVfQ09MT1JfRURHRVJCMSk7CiAgICAgICAgICAgZWxzZSBpZiAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIENGV0xfUGFydFN0YXRlX1JlYWRPbmx5KQotICAgICAgICAgICAgY3IuU2V0KEFyZ2JFbmNvZGUoMjU1LCAyMzYsIDIzMywgMjE2KSk7CisgICAgICAgICAgICBjciA9IENYRkFfR0VDb2xvcihBcmdiRW5jb2RlKDI1NSwgMjM2LCAyMzMsIDIxNikpOwogICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIGNyLlNldCgweEZGRkZGRkZGKTsKKyAgICAgICAgICAgIGNyID0gQ1hGQV9HRUNvbG9yKDB4RkZGRkZGRkYpOwogICAgICAgICB9CiAgICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOwotICAgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjcik7CisgICAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoY3IpOwogICAgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQYXJhbXMtPm1fbWF0cml4KTsKICAgICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7CkBAIC03MywxMSArNzQsOCBAQAogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNhc2UgQ0ZXTF9QYXJ0OjpDb21iVGV4dExpbmU6IHsKLSAgICAgIEZYX0FSR0IgY3IgPSAweEZGMDAwMDAwOwotICAgICAgRlhfRkxPQVQgZldpZHRoID0gMS4wZjsKLSAgICAgIENGWF9Db2xvciBjckxpbmUoY3IpOwotICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjckxpbmUpOwotICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldExpbmVXaWR0aChmV2lkdGgpOworICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKENYRkFfR0VDb2xvcigweEZGMDAwMDAwKSk7CisgICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0TGluZVdpZHRoKDEuMGYpOwogICAgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlN0cm9rZVBhdGgocFBhcmFtcy0+bV9wUGF0aCwgJnBQYXJhbXMtPm1fbWF0cml4KTsKICAgICAgIGJyZWFrOwogICAgIH0KZGlmZiAtLWdpdCBhL3hmYS9md2wvdGhlbWUvY2Z3bF9saXN0Ym94dHAuY3BwIGIveGZhL2Z3bC90aGVtZS9jZndsX2xpc3Rib3h0cC5jcHAKaW5kZXggNGUwMDQyMC4uNmI4YWE3NiAxMDA2NDQKLS0tIGEveGZhL2Z3bC90aGVtZS9jZndsX2xpc3Rib3h0cC5jcHAKKysrIGIveGZhL2Z3bC90aGVtZS9jZndsX2xpc3Rib3h0cC5jcHAKQEAgLTksOCArOSw4IEBACiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2xpc3Rib3guaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfdGhlbWViYWNrZ3JvdW5kLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3dpZGdldC5oIgotI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2NmeF9jb2xvci5oIgotI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2NmeF9wYXRoLmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZWNvbG9yLmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXBhdGguaCIKIAogQ0ZXTF9MaXN0Qm94VFA6OkNGV0xfTGlzdEJveFRQKCkge30KIApAQCAtMzksMTEgKzM5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAmcFBhcmFtcy0+bV9ydFBhcnQsIHBQYXJhbXMtPm1fcERhdGEsICZwUGFyYW1zLT5tX21hdHJpeCk7CiAgICAgICBicmVhazsKICAgICB9Ci0gICAgY2FzZSBDRldMX1BhcnQ6Okljb246IHsKLSAgICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJldGNoSW1hZ2UocFBhcmFtcy0+bV9wSW1hZ2UsIHBQYXJhbXMtPm1fcnRQYXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFBhcmFtcy0+bV9tYXRyaXgpOwotICAgICAgYnJlYWs7Ci0gICAgfQogICAgIGNhc2UgQ0ZXTF9QYXJ0OjpDaGVjazogewogICAgICAgdWludDMyX3QgY29sb3IgPSAweEZGMDAwMDAwOwogICAgICAgaWYgKHBQYXJhbXMtPm1fZHdTdGF0ZXMgPT0gQ0ZXTF9QYXJ0U3RhdGVfQ2hlY2tlZCkgewpAQCAtNTksMTggKzU0LDE3IEBACiAgIH0KIH0KIAotdm9pZCBDRldMX0xpc3RCb3hUUDo6RHJhd0xpc3RCb3hJdGVtKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAordm9pZCBDRldMX0xpc3RCb3hUUDo6RHJhd0xpc3RCb3hJdGVtKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBydEl0ZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewogICBpZiAoZHdTdGF0ZXMgJiBDRldMX1BhcnRTdGF0ZV9TZWxlY3RlZCkgewogICAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsKLSAgICBDRlhfQ29sb3IgY3JGaWxsKEZXTFRIRU1FX0NPTE9SX0JLU2VsZWN0ZWQpOwotICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjckZpbGwpOworICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKENYRkFfR0VDb2xvcihGV0xUSEVNRV9DT0xPUl9CS1NlbGVjdGVkKSk7CiAgICAgQ0ZYX1JlY3RGIHJ0KCpwcnRJdGVtKTsKLSAgICBDRlhfUGF0aCBwYXRoOwotI2lmIChfRlhfT1NfID09IF9GWF9NQUNPU1hfKQorICAgIENYRkFfR0VQYXRoIHBhdGg7CisjaWYgKF9GWF9PU18gPT0gX0ZYX09TX01BQ09TWF8pCiAgICAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCwgcnQudG9wLCBydC53aWR0aCAtIDEsIHJ0LmhlaWdodCAtIDEpOwogI2Vsc2UKICAgICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0LCBydC50b3AsIHJ0LndpZHRoLCBydC5oZWlnaHQpOwpkaWZmIC0tZ2l0IGEveGZhL2Z3bC90aGVtZS9jZndsX2xpc3Rib3h0cC5oIGIveGZhL2Z3bC90aGVtZS9jZndsX2xpc3Rib3h0cC5oCmluZGV4IGRjZjVlYzguLjVkYzQ1YWYgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvdGhlbWUvY2Z3bF9saXN0Ym94dHAuaAorKysgYi94ZmEvZndsL3RoZW1lL2Nmd2xfbGlzdGJveHRwLmgKQEAgLTE4LDcgKzE4LDcgQEAKICAgdm9pZCBEcmF3QmFja2dyb3VuZChDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcykgb3ZlcnJpZGU7CiAKICBwcm90ZWN0ZWQ6Ci0gIHZvaWQgRHJhd0xpc3RCb3hJdGVtKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAorICB2b2lkIERyYXdMaXN0Qm94SXRlbShDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdGVzLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBydEl0ZW0sCiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBEYXRhID0gbnVsbHB0ciwKZGlmZiAtLWdpdCBhL3hmYS9md2wvdGhlbWUvY2Z3bF9tb250aGNhbGVuZGFydHAuY3BwIGIveGZhL2Z3bC90aGVtZS9jZndsX21vbnRoY2FsZW5kYXJ0cC5jcHAKaW5kZXggYjE0MTA5ZC4uNmJiM2YxOCAxMDA2NDQKLS0tIGEveGZhL2Z3bC90aGVtZS9jZndsX21vbnRoY2FsZW5kYXJ0cC5jcHAKKysrIGIveGZhL2Z3bC90aGVtZS9jZndsX21vbnRoY2FsZW5kYXJ0cC5jcHAKQEAgLTYsMTQgKzYsMTQgQEAKIAogI2luY2x1ZGUgInhmYS9md2wvdGhlbWUvY2Z3bF9tb250aGNhbGVuZGFydHAuaCIKIAotI2luY2x1ZGUgInhmYS9mZGUvdHRvL2ZkZV90ZXh0b3V0LmgiCisjaW5jbHVkZSAieGZhL2ZkZS9jZmRlX3RleHRvdXQuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfbW9udGhjYWxlbmRhci5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF90aGVtZWJhY2tncm91bmQuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfdGhlbWV0ZXh0LmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3dpZGdldC5oIgogI2luY2x1ZGUgInhmYS9md2wvaWZ3bF90aGVtZXByb3ZpZGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY2Z4X2NvbG9yLmgiCi0jaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY2Z4X3BhdGguaCIKKyNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jeGZhX2dlY29sb3IuaCIKKyNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jeGZhX2dlcGF0aC5oIgogCiBDRldMX01vbnRoQ2FsZW5kYXJUUDo6Q0ZXTF9Nb250aENhbGVuZGFyVFAoKSA6IG1fcFRoZW1lRGF0YShuZXcgTUNUaGVtZURhdGEpIHsKICAgU2V0VGhlbWVEYXRhKCk7CkBAIC0xMDQsNDcgKzEwNCw0MiBAQAogCiB2b2lkIENGV0xfTW9udGhDYWxlbmRhclRQOjpEcmF3VG90YWxCSyhDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgQ0ZYX1BhdGggcGF0aDsKKyAgQ1hGQV9HRVBhdGggcGF0aDsKICAgQ0ZYX1JlY3RGIHJ0VG90YWwocFBhcmFtcy0+bV9ydFBhcnQpOwogICBwYXRoLkFkZFJlY3RhbmdsZShydFRvdGFsLmxlZnQsIHJ0VG90YWwudG9wLCBydFRvdGFsLndpZHRoLCBydFRvdGFsLmhlaWdodCk7CiAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOwotCi0gIENGWF9Db2xvciBjbHJCSyhtX3BUaGVtZURhdGEtPmNsckJLKTsKLSAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY2xyQkspOworICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKENYRkFfR0VDb2xvcihtX3BUaGVtZURhdGEtPmNsckJLKSk7CiAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOwogICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsKIH0KIAogdm9pZCBDRldMX01vbnRoQ2FsZW5kYXJUUDo6RHJhd0hlYWRCayhDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBDRlhfUGF0aCBwYXRoOworICBDWEZBX0dFUGF0aCBwYXRoOwogICBDRlhfUmVjdEYgcnRIZWFkID0gcFBhcmFtcy0+bV9ydFBhcnQ7CiAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0SGVhZC5sZWZ0LCBydEhlYWQudG9wLCBydEhlYWQud2lkdGgsIHJ0SGVhZC5oZWlnaHQpOwogICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsKLQotICBDRlhfQ29sb3IgY2xySGVhZEJLKG1fcFRoZW1lRGF0YS0+Y2xyQkspOwotICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjbHJIZWFkQkspOworICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKENYRkFfR0VDb2xvcihtX3BUaGVtZURhdGEtPmNsckJLKSk7CiAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOwogICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsKIH0KIAogdm9pZCBDRldMX01vbnRoQ2FsZW5kYXJUUDo6RHJhd0xCdXR0b24oQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7Ci0gIENGWF9QYXRoIHBhdGg7CisgIENYRkFfR0VQYXRoIHBhdGg7CiAgIENGWF9SZWN0RiBydExCdG4gPSBwUGFyYW1zLT5tX3J0UGFydDsKICAgcGF0aC5BZGRSZWN0YW5nbGUocnRMQnRuLmxlZnQsIHJ0TEJ0bi50b3AsIHJ0TEJ0bi53aWR0aCwgcnRMQnRuLmhlaWdodCk7CiAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOwotCi0gIENGWF9Db2xvciBjbHJMQnRuRWRnZShBcmdiRW5jb2RlKDB4ZmYsIDIwNSwgMjE5LCAyNDMpKTsKLSAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJMQnRuRWRnZSk7CisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigKKyAgICAgIENYRkFfR0VDb2xvcihBcmdiRW5jb2RlKDB4ZmYsIDIwNSwgMjE5LCAyNDMpKSk7CiAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsKICAgaWYgKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBDRldMX1BhcnRTdGF0ZV9QcmVzc2VkKSB7Ci0gICAgQ0ZYX0NvbG9yIGNsckxCdG5GaWxsKEFyZ2JFbmNvZGUoMHhmZiwgMTc0LCAxOTgsIDI0MikpOwotICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNsckxCdG5GaWxsKTsKKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKAorICAgICAgICBDWEZBX0dFQ29sb3IoQXJnYkVuY29kZSgweGZmLCAxNzQsIDE5OCwgMjQyKSkpOwogICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOwogICB9IGVsc2UgewotICAgIENGWF9Db2xvciBjbHJMQnRuRmlsbChBcmdiRW5jb2RlKDB4ZmYsIDIyNywgMjM1LCAyNDkpKTsKLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjbHJMQnRuRmlsbCk7CisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldEZpbGxDb2xvcigKKyAgICAgICAgQ1hGQV9HRUNvbG9yKEFyZ2JFbmNvZGUoMHhmZiwgMjI3LCAyMzUsIDI0OSkpKTsKICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsKICAgfQogCkBAIC0xNTYsMjkgKzE1MSwyOCBAQAogICBwYXRoLkxpbmVUbyhDRlhfUG9pbnRGKHJ0TEJ0bi5sZWZ0ICsgcnRMQnRuLldpZHRoKCkgLyAzICogMiwKICAgICAgICAgICAgICAgICAgICAgICAgICBydExCdG4uYm90dG9tKCkgLSBydExCdG4uaGVpZ2h0IC8gNCkpOwogCi0gIENGWF9Db2xvciBjbHJGbGFnKEFyZ2JFbmNvZGUoMHhmZiwgNTAsIDEwNCwgMjA1KSk7Ci0gIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyRmxhZyk7CisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigKKyAgICAgIENYRkFfR0VDb2xvcihBcmdiRW5jb2RlKDB4ZmYsIDUwLCAxMDQsIDIwNSkpKTsKICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOwogICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsKIH0KIAogdm9pZCBDRldMX01vbnRoQ2FsZW5kYXJUUDo6RHJhd1JCdXR0b24oQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7Ci0gIENGWF9QYXRoIHBhdGg7CisgIENYRkFfR0VQYXRoIHBhdGg7CiAgIENGWF9SZWN0RiBydFJCdG4gPSBwUGFyYW1zLT5tX3J0UGFydDsKICAgcGF0aC5BZGRSZWN0YW5nbGUocnRSQnRuLmxlZnQsIHJ0UkJ0bi50b3AsIHJ0UkJ0bi53aWR0aCwgcnRSQnRuLmhlaWdodCk7CiAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOwotCi0gIENGWF9Db2xvciBjbHJSQnRuRWRnZShBcmdiRW5jb2RlKDB4ZmYsIDIwNSwgMjE5LCAyNDMpKTsKLSAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJSQnRuRWRnZSk7CisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigKKyAgICAgIENYRkFfR0VDb2xvcihBcmdiRW5jb2RlKDB4ZmYsIDIwNSwgMjE5LCAyNDMpKSk7CiAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsKICAgaWYgKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBDRldMX1BhcnRTdGF0ZV9QcmVzc2VkKSB7Ci0gICAgQ0ZYX0NvbG9yIGNsclJCdG5GaWxsKEFyZ2JFbmNvZGUoMHhmZiwgMTc0LCAxOTgsIDI0MikpOwotICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNsclJCdG5GaWxsKTsKKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKAorICAgICAgICBDWEZBX0dFQ29sb3IoQXJnYkVuY29kZSgweGZmLCAxNzQsIDE5OCwgMjQyKSkpOwogICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOwogICB9IGVsc2UgewotICAgIENGWF9Db2xvciBjbHJSQnRuRmlsbChBcmdiRW5jb2RlKDB4ZmYsIDIyNywgMjM1LCAyNDkpKTsKLSAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKCZjbHJSQnRuRmlsbCk7CisgICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldEZpbGxDb2xvcigKKyAgICAgICAgQ1hGQV9HRUNvbG9yKEFyZ2JFbmNvZGUoMHhmZiwgMjI3LCAyMzUsIDI0OSkpKTsKICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsKICAgfQogCkBAIC0xOTAsMzYgKzE4NCwzNCBAQAogICBwYXRoLkxpbmVUbyhDRlhfUG9pbnRGKHJ0UkJ0bi5sZWZ0ICsgcnRSQnRuLldpZHRoKCkgLyAzLAogICAgICAgICAgICAgICAgICAgICAgICAgIHJ0UkJ0bi5ib3R0b20oKSAtIHJ0UkJ0bi5oZWlnaHQgLyA0KSk7CiAKLSAgQ0ZYX0NvbG9yIGNsckZsYWcoQXJnYkVuY29kZSgweGZmLCA1MCwgMTA0LCAyMDUpKTsKLSAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJGbGFnKTsKKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKAorICAgICAgQ1hGQV9HRUNvbG9yKEFyZ2JFbmNvZGUoMHhmZiwgNTAsIDEwNCwgMjA1KSkpOwogICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7CiAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOwogfQogCiB2b2lkIENGV0xfTW9udGhDYWxlbmRhclRQOjpEcmF3SFNlcGVyYXRvcihDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgQ0ZYX1BhdGggcGF0aDsKKyAgQ1hGQV9HRVBhdGggcGF0aDsKICAgQ0ZYX1JlY3RGIHJ0SFNlcCA9IHBQYXJhbXMtPm1fcnRQYXJ0OwogICBwYXRoLk1vdmVUbyhDRlhfUG9pbnRGKHJ0SFNlcC5sZWZ0LCBydEhTZXAudG9wICsgcnRIU2VwLmhlaWdodCAvIDIpKTsKICAgcGF0aC5MaW5lVG8oQ0ZYX1BvaW50RihydEhTZXAucmlnaHQoKSwgcnRIU2VwLnRvcCArIHJ0SFNlcC5oZWlnaHQgLyAyKSk7CiAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOwotCi0gIENGWF9Db2xvciBjbHJIU2VwKG1fcFRoZW1lRGF0YS0+Y2xyU2VwZXJhdG9yKTsKLSAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJIU2VwKTsKKyAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKAorICAgICAgQ1hGQV9HRUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyU2VwZXJhdG9yKSk7CiAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsKICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7CiB9CiAKIHZvaWQgQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdXZWVrTnVtU2VwKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBDRlhfUGF0aCBwYXRoOworICBDWEZBX0dFUGF0aCBwYXRoOwogICBDRlhfUmVjdEYgcnRXZWVrU2VwID0gcFBhcmFtcy0+bV9ydFBhcnQ7CiAgIHBhdGguTW92ZVRvKHJ0V2Vla1NlcC5Ub3BMZWZ0KCkpOwogICBwYXRoLkxpbmVUbyhydFdlZWtTZXAuQm90dG9tTGVmdCgpKTsKICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7Ci0KLSAgQ0ZYX0NvbG9yIGNsckhTZXAobV9wVGhlbWVEYXRhLT5jbHJTZXBlcmF0b3IpOwotICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsckhTZXApOworICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoCisgICAgICBDWEZBX0dFQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJTZXBlcmF0b3IpKTsKICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOwogICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsKIH0KQEAgLTIyOCwyMCArMjIwLDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7CiAgIGlmIChwUGFyYW1zLT5tX2R3U3RhdGVzICYgQ0ZXTF9QYXJ0U3RhdGVfU2VsZWN0ZWQpIHsKLSAgICBDRlhfUGF0aCBwYXRoOworICAgIENYRkFfR0VQYXRoIHBhdGg7CiAgICAgQ0ZYX1JlY3RGIHJ0U2VsRGF5ID0gcFBhcmFtcy0+bV9ydFBhcnQ7CiAgICAgcGF0aC5BZGRSZWN0YW5nbGUocnRTZWxEYXkubGVmdCwgcnRTZWxEYXkudG9wLCBydFNlbERheS53aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICBydFNlbERheS5oZWlnaHQpOwotICAgIENGWF9Db2xvciBjbHJTZWxEYXlCSyhtX3BUaGVtZURhdGEtPmNsckRhdGVzU2VsZWN0ZWRCSyk7Ci0gICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY2xyU2VsRGF5QkspOworICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoCisgICAgICAgIENYRkFfR0VDb2xvcihtX3BUaGVtZURhdGEtPmNsckRhdGVzU2VsZWN0ZWRCSykpOwogICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOwogICB9IGVsc2UgaWYgKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBDRldMX1BhcnRTdGF0ZV9Ib3ZlcmVkKSB7Ci0gICAgQ0ZYX1BhdGggcGF0aDsKKyAgICBDWEZBX0dFUGF0aCBwYXRoOwogICAgIENGWF9SZWN0RiBydFNlbERheSA9IHBQYXJhbXMtPm1fcnRQYXJ0OwogICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0U2VsRGF5LmxlZnQsIHJ0U2VsRGF5LnRvcCwgcnRTZWxEYXkud2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgcnRTZWxEYXkuaGVpZ2h0KTsKLSAgICBDRlhfQ29sb3IgY2xyU2VsRGF5QksobV9wVGhlbWVEYXRhLT5jbHJEYXRlc0hvdmVyQkspOwotICAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNsclNlbERheUJLKTsKKyAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+U2V0RmlsbENvbG9yKAorICAgICAgICBDWEZBX0dFQ29sb3IobV9wVGhlbWVEYXRhLT5jbHJEYXRlc0hvdmVyQkspKTsKICAgICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsKICAgfQogICBwUGFyYW1zLT5tX3BHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsKQEAgLTI0OSwyNiArMjQxLDI2IEBACiAKIHZvaWQgQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdEYXRlc0luQ2lyY2xlKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBDRlhfUGF0aCBwYXRoOworICBDWEZBX0dFUGF0aCBwYXRoOwogICBDRlhfUmVjdEYgcnRTZWxEYXkgPSBwUGFyYW1zLT5tX3J0UGFydDsKICAgcGF0aC5BZGRSZWN0YW5nbGUocnRTZWxEYXkubGVmdCwgcnRTZWxEYXkudG9wLCBydFNlbERheS53aWR0aCwKICAgICAgICAgICAgICAgICAgICAgcnRTZWxEYXkuaGVpZ2h0KTsKICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7Ci0gIENGWF9Db2xvciBjbHJTZWxEYXlCSyhtX3BUaGVtZURhdGEtPmNsckRhdGVzQ2lyY2xlKTsKLSAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJTZWxEYXlCSyk7CisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigKKyAgICAgIENYRkFfR0VDb2xvcihtX3BUaGVtZURhdGEtPmNsckRhdGVzQ2lyY2xlKSk7CiAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsKICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7CiB9CiAKIHZvaWQgQ0ZXTF9Nb250aENhbGVuZGFyVFA6OkRyYXdUb2RheUNpcmNsZShDRldMX1RoZW1lQmFja2dyb3VuZCogcFBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7Ci0gIENGWF9QYXRoIHBhdGg7CisgIENYRkFfR0VQYXRoIHBhdGg7CiAgIENGWF9SZWN0RiBydFRvZGF5Q2lyY2xlID0gcFBhcmFtcy0+bV9ydFBhcnQ7CiAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0VG9kYXlDaXJjbGUubGVmdCwgcnRUb2RheUNpcmNsZS50b3AsIHJ0VG9kYXlDaXJjbGUud2lkdGgsCiAgICAgICAgICAgICAgICAgICAgIHJ0VG9kYXlDaXJjbGUuaGVpZ2h0KTsKICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7Ci0gIENGWF9Db2xvciBjbHJUb2RheUNpcmNsZShtX3BUaGVtZURhdGEtPmNsckRhdGVzQ2lyY2xlKTsKLSAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJUb2RheUNpcmNsZSk7CisgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigKKyAgICAgIENYRkFfR0VDb2xvcihtX3BUaGVtZURhdGEtPmNsckRhdGVzQ2lyY2xlKSk7CiAgIHBQYXJhbXMtPm1fcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsKICAgcFBhcmFtcy0+bV9wR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7CiB9CmRpZmYgLS1naXQgYS94ZmEvZndsL3RoZW1lL2Nmd2xfbW9udGhjYWxlbmRhcnRwLmggYi94ZmEvZndsL3RoZW1lL2Nmd2xfbW9udGhjYWxlbmRhcnRwLmgKaW5kZXggNTc0MzhhMC4uNmExYjliZSAxMDA2NDQKLS0tIGEveGZhL2Z3bC90aGVtZS9jZndsX21vbnRoY2FsZW5kYXJ0cC5oCisrKyBiL3hmYS9md2wvdGhlbWUvY2Z3bF9tb250aGNhbGVuZGFydHAuaApAQCAtNDUsNyArNDUsNyBAQAogICBGV0xUSEVNRV9TVEFURSBHZXRTdGF0ZSh1aW50MzJfdCBkd0ZXTFN0YXRlcyk7CiAKICAgc3RkOjp1bmlxdWVfcHRyPE1DVGhlbWVEYXRhPiBtX3BUaGVtZURhdGE7Ci0gIENGWF9XaWRlU3RyaW5nIHdzUmVzb3VyY2U7CisgIFdpZGVTdHJpbmcgd3NSZXNvdXJjZTsKIAogIHByaXZhdGU6CiAgIHZvaWQgU2V0VGhlbWVEYXRhKCk7CmRpZmYgLS1naXQgYS94ZmEvZndsL3RoZW1lL2Nmd2xfcHVzaGJ1dHRvbnRwLmNwcCBiL3hmYS9md2wvdGhlbWUvY2Z3bF9wdXNoYnV0dG9udHAuY3BwCmluZGV4IDU2MjY4YTguLjNkM2IxYWEgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvdGhlbWUvY2Z3bF9wdXNoYnV0dG9udHAuY3BwCisrKyBiL3hmYS9md2wvdGhlbWUvY2Z3bF9wdXNoYnV0dG9udHAuY3BwCkBAIC0xMCw4ICsxMCw4IEBACiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3RoZW1lYmFja2dyb3VuZC5oIgogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF93aWRnZXQuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2lmd2xfdGhlbWVwcm92aWRlci5oIgotI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2NmeF9jb2xvci5oIgotI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2NmeF9wYXRoLmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZWNvbG9yLmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXBhdGguaCIKIAogI2RlZmluZSBQVVNIQlVUVE9OX1NJWkVfQ29ybmVyIDIKIApAQCAtMjksMTAgKzI5LDEwIEBACiAgICAgfQogICAgIGNhc2UgQ0ZXTF9QYXJ0OjpCYWNrZ3JvdW5kOiB7CiAgICAgICBDRlhfUmVjdEYmIHJlY3QgPSBwUGFyYW1zLT5tX3J0UGFydDsKLSAgICAgIEZYX0ZMT0FUIGZSaWdodCA9IHJlY3QucmlnaHQoKTsKLSAgICAgIEZYX0ZMT0FUIGZCb3R0b20gPSByZWN0LmJvdHRvbSgpOworICAgICAgZmxvYXQgZlJpZ2h0ID0gcmVjdC5yaWdodCgpOworICAgICAgZmxvYXQgZkJvdHRvbSA9IHJlY3QuYm90dG9tKCk7CiAKLSAgICAgIENGWF9QYXRoIHN0cm9rZVBhdGg7CisgICAgICBDWEZBX0dFUGF0aCBzdHJva2VQYXRoOwogICAgICAgc3Ryb2tlUGF0aC5Nb3ZlVG8oCiAgICAgICAgICAgQ0ZYX1BvaW50RihyZWN0LmxlZnQgKyBQVVNIQlVUVE9OX1NJWkVfQ29ybmVyLCByZWN0LnRvcCkpOwogICAgICAgc3Ryb2tlUGF0aC5MaW5lVG8oQ0ZYX1BvaW50RihmUmlnaHQgLSBQVVNIQlVUVE9OX1NJWkVfQ29ybmVyLCByZWN0LnRvcCkpOwpAQCAtNDgsMTAgKzQ4LDEwIEBACiAgICAgICBzdHJva2VQYXRoLkxpbmVUbygKICAgICAgICAgICBDRlhfUG9pbnRGKHJlY3QubGVmdCArIFBVU0hCVVRUT05fU0laRV9Db3JuZXIsIHJlY3QudG9wKSk7CiAKLSAgICAgIENGWF9QYXRoIGZpbGxQYXRoOworICAgICAgQ1hGQV9HRVBhdGggZmlsbFBhdGg7CiAgICAgICBmaWxsUGF0aC5BZGRTdWJwYXRoKCZzdHJva2VQYXRoKTsKIAotICAgICAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MgPSBwUGFyYW1zLT5tX3BHcmFwaGljczsKKyAgICAgIENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcyA9IHBQYXJhbXMtPm1fcEdyYXBoaWNzOwogICAgICAgcEdyYXBoaWNzLT5TYXZlR3JhcGhTdGF0ZSgpOwogCiAgICAgICBDRlhfUmVjdEYgcnRJbm5lcihyZWN0KTsKQEAgLTY3LDE2ICs2NywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckVuZFtpQ29sb3JdLCAmZmlsbFBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9BTFRFUk5BVEUsICZwUGFyYW1zLT5tX21hdHJpeCk7CiAKLSAgICAgIENGWF9Db2xvciBjclN0cm9rZShtX3BUaGVtZURhdGEtPmNsckJvcmRlcltpQ29sb3JdKTsKLSAgICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNyU3Ryb2tlKTsKKyAgICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoQ1hGQV9HRUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyQm9yZGVyW2lDb2xvcl0pKTsKICAgICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmc3Ryb2tlUGF0aCwgJnBQYXJhbXMtPm1fbWF0cml4KTsKIAogICAgICAgZmlsbFBhdGguQ2xlYXIoKTsKICAgICAgIGZpbGxQYXRoLkFkZFJlY3RhbmdsZShydElubmVyLmxlZnQsIHJ0SW5uZXIudG9wLCBydElubmVyLndpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0SW5uZXIuaGVpZ2h0KTsKIAotICAgICAgQ0ZYX0NvbG9yIGNyRmlsbChtX3BUaGVtZURhdGEtPmNsckZpbGxbaUNvbG9yXSk7Ci0gICAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsKKyAgICAgIHBHcmFwaGljcy0+U2V0RmlsbENvbG9yKENYRkFfR0VDb2xvcihtX3BUaGVtZURhdGEtPmNsckZpbGxbaUNvbG9yXSkpOwogICAgICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmZmlsbFBhdGgsIEZYRklMTF9XSU5ESU5HLCAmcFBhcmFtcy0+bV9tYXRyaXgpOwogICAgICAgaWYgKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBDRldMX1BhcnRTdGF0ZV9Gb2N1c2VkKSB7CiAgICAgICAgIHJ0SW5uZXIuSW5mbGF0ZSgxLCAxLCAwLCAwKTsKZGlmZiAtLWdpdCBhL3hmYS9md2wvdGhlbWUvY2Z3bF9zY3JvbGxiYXJ0cC5jcHAgYi94ZmEvZndsL3RoZW1lL2Nmd2xfc2Nyb2xsYmFydHAuY3BwCmluZGV4IDEyMWQ0ZGUuLmQ5NGVlZDAgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvdGhlbWUvY2Z3bF9zY3JvbGxiYXJ0cC5jcHAKKysrIGIveGZhL2Z3bC90aGVtZS9jZndsX3Njcm9sbGJhcnRwLmNwcApAQCAtMTAsOCArMTAsOCBAQAogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF90aGVtZWJhY2tncm91bmQuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfd2lkZ2V0LmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9pZndsX3RoZW1lcHJvdmlkZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfY29sb3IuaCIKLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfcGF0aC5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2Vjb2xvci5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2VwYXRoLmgiCiAKIG5hbWVzcGFjZSB7CiAKQEAgLTM4LDcgKzM4LDcgQEAKICAgZWxzZSBpZiAocFBhcmFtcy0+bV9kd1N0YXRlcyAmIENGV0xfUGFydFN0YXRlX0Rpc2FibGVkKQogICAgIGVTdGF0ZSA9IEZXTFRIRU1FX1NUQVRFX0Rpc2FibGU7CiAKLSAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MgPSBwUGFyYW1zLT5tX3BHcmFwaGljczsKKyAgQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzID0gcFBhcmFtcy0+bV9wR3JhcGhpY3M7CiAgIENGWF9SZWN0RiogcFJlY3QgPSAmcFBhcmFtcy0+bV9ydFBhcnQ7CiAgIGJvb2wgYlZlcnQgPSAhIXBXaWRnZXQtPkdldFN0eWxlc0V4KCk7CiAgIHN3aXRjaCAocFBhcmFtcy0+bV9pUGFydCkgewpAQCAtNzEsNyArNzEsNyBAQAogICB9CiB9CiAKLXZvaWQgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd1RodW1iQnRuKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAordm9pZCBDRldMX1Njcm9sbEJhclRQOjpEcmF3VGh1bWJCdG4oQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlZlcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsCkBAIC04MCw3ICs4MCw3IEBACiAgIGlmIChlU3RhdGUgPCBGV0xUSEVNRV9TVEFURV9Ob3JtYWwgfHwgZVN0YXRlID4gRldMVEhFTUVfU1RBVEVfRGlzYWJsZSkKICAgICByZXR1cm47CiAKLSAgQ0ZYX1BhdGggcGF0aDsKKyAgQ1hGQV9HRVBhdGggcGF0aDsKICAgQ0ZYX1JlY3RGIHJlY3QoKnBSZWN0KTsKICAgaWYgKGJWZXJ0KSB7CiAgICAgcmVjdC5EZWZsYXRlKDEsIDApOwpAQCAtOTIsMTAgKzkyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbZVN0YXRlIC0gMV1bMF0sCiAgICAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLW2VTdGF0ZSAtIDFdWzFdLCAmcGF0aCwKICAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsKLSAgICBDRlhfQ29sb3IgcmNTdHJva2U7Ci0gICAgcmNTdHJva2UuU2V0KG1fcFRoZW1lRGF0YS0+Y2xyQnRuQm9yZGVyW2VTdGF0ZSAtIDFdKTsKICAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7Ci0gICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmcmNTdHJva2UpOworICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoCisgICAgICAgIENYRkFfR0VDb2xvcihtX3BUaGVtZURhdGEtPmNsckJ0bkJvcmRlcltlU3RhdGUgLSAxXSkpOwogICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7CiAgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOwogICB9IGVsc2UgewpAQCAtMTA4LDI5ICsxMDcsMjggQEAKICAgICAgICAgICAgICAgICAgICAgIG1fcFRoZW1lRGF0YS0+Y2xyQnRuQktbZVN0YXRlIC0gMV1bMF0sCiAgICAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsckJ0bkJLW2VTdGF0ZSAtIDFdWzFdLCAmcGF0aCwKICAgICAgICAgICAgICAgICAgICAgIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsKLSAgICBDRlhfQ29sb3IgcmNTdHJva2U7Ci0gICAgcmNTdHJva2UuU2V0KG1fcFRoZW1lRGF0YS0+Y2xyQnRuQm9yZGVyW2VTdGF0ZSAtIDFdKTsKICAgICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7Ci0gICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmcmNTdHJva2UpOworICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoCisgICAgICAgIENYRkFfR0VDb2xvcihtX3BUaGVtZURhdGEtPmNsckJ0bkJvcmRlcltlU3RhdGUgLSAxXSkpOwogICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7CiAgICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOwogICB9CiB9CiAKLXZvaWQgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd1BhdyhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd1BhdyhDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJWZXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7Ci0gIENGWF9QYXRoIHBhdGg7CisgIENYRkFfR0VQYXRoIHBhdGg7CiAgIGlmIChiVmVydCkgewotICAgIEZYX0ZMT0FUIGZQYXdMZW4gPSBrUGF3TGVuZ3RoOworICAgIGZsb2F0IGZQYXdMZW4gPSBrUGF3TGVuZ3RoOwogICAgIGlmIChwUmVjdC0+d2lkdGggLyAyIDw9IGZQYXdMZW4pIHsKICAgICAgIGZQYXdMZW4gPSAocFJlY3QtPndpZHRoIC0gNikgLyAyOwogICAgIH0KIAotICAgIEZYX0ZMT0FUIGZYID0gcFJlY3QtPmxlZnQgKyBwUmVjdC0+d2lkdGggLyA0OwotICAgIEZYX0ZMT0FUIGZZID0gcFJlY3QtPnRvcCArIHBSZWN0LT5oZWlnaHQgLyAyOworICAgIGZsb2F0IGZYID0gcFJlY3QtPmxlZnQgKyBwUmVjdC0+d2lkdGggLyA0OworICAgIGZsb2F0IGZZID0gcFJlY3QtPnRvcCArIHBSZWN0LT5oZWlnaHQgLyAyOwogICAgIHBhdGguTW92ZVRvKENGWF9Qb2ludEYoZlgsIGZZIC0gNCkpOwogICAgIHBhdGguTGluZVRvKENGWF9Qb2ludEYoZlggKyBmUGF3TGVuLCBmWSAtIDQpKTsKICAgICBwYXRoLk1vdmVUbyhDRlhfUG9pbnRGKGZYLCBmWSAtIDIpKTsKQEAgLTE0MCwxMCArMTM4LDEwIEBACiAgICAgcGF0aC5Nb3ZlVG8oQ0ZYX1BvaW50RihmWCwgZlkgKyAyKSk7CiAgICAgcGF0aC5MaW5lVG8oQ0ZYX1BvaW50RihmWCArIGZQYXdMZW4sIGZZICsgMikpOwogCi0gICAgQ0ZYX0NvbG9yIGNsckxpZ2h0KG1fcFRoZW1lRGF0YS0+Y2xyUGF3Q29sb3JMaWdodFtlU3RhdGUgLSAxXSk7CiAgICAgcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoMSk7Ci0gICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyTGlnaHQpOwotICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCk7CisgICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigKKyAgICAgICAgQ1hGQV9HRUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyUGF3Q29sb3JMaWdodFtlU3RhdGUgLSAxXSkpOworICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgbnVsbHB0cik7CiAgICAgZlgrKzsKIAogICAgIHBhdGguQ2xlYXIoKTsKQEAgLTE1NiwxOCArMTU0LDE4IEBACiAgICAgcGF0aC5Nb3ZlVG8oQ0ZYX1BvaW50RihmWCwgZlkgKyAzKSk7CiAgICAgcGF0aC5MaW5lVG8oQ0ZYX1BvaW50RihmWCArIGZQYXdMZW4sIGZZICsgMykpOwogCi0gICAgQ0ZYX0NvbG9yIGNsckRhcmsobV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckRhcmtbZVN0YXRlIC0gMV0pOwogICAgIHBHcmFwaGljcy0+U2V0TGluZVdpZHRoKDEpOwotICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoJmNsckRhcmspOworICAgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoCisgICAgICAgIENYRkFfR0VDb2xvcihtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yRGFya1tlU3RhdGUgLSAxXSkpOwogICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7CiAgIH0gZWxzZSB7Ci0gICAgRlhfRkxPQVQgZlBhd0xlbiA9IGtQYXdMZW5ndGg7CisgICAgZmxvYXQgZlBhd0xlbiA9IGtQYXdMZW5ndGg7CiAgICAgaWYgKHBSZWN0LT5oZWlnaHQgLyAyIDw9IGZQYXdMZW4pIHsKICAgICAgIGZQYXdMZW4gPSAocFJlY3QtPmhlaWdodCAtIDYpIC8gMjsKICAgICB9CiAKLSAgICBGWF9GTE9BVCBmWCA9IHBSZWN0LT5sZWZ0ICsgcFJlY3QtPndpZHRoIC8gMjsKLSAgICBGWF9GTE9BVCBmWSA9IHBSZWN0LT50b3AgKyBwUmVjdC0+aGVpZ2h0IC8gNDsKKyAgICBmbG9hdCBmWCA9IHBSZWN0LT5sZWZ0ICsgcFJlY3QtPndpZHRoIC8gMjsKKyAgICBmbG9hdCBmWSA9IHBSZWN0LT50b3AgKyBwUmVjdC0+aGVpZ2h0IC8gNDsKICAgICBwYXRoLk1vdmVUbyhDRlhfUG9pbnRGKGZYIC0gNCwgZlkpKTsKICAgICBwYXRoLkxpbmVUbyhDRlhfUG9pbnRGKGZYIC0gNCwgZlkgKyBmUGF3TGVuKSk7CiAgICAgcGF0aC5Nb3ZlVG8oQ0ZYX1BvaW50RihmWCAtIDIsIGZZKSk7CkBAIC0xNzcsOSArMTc1LDkgQEAKICAgICBwYXRoLk1vdmVUbyhDRlhfUG9pbnRGKGZYICsgMiwgZlkpKTsKICAgICBwYXRoLkxpbmVUbyhDRlhfUG9pbnRGKGZYICsgMiwgZlkgKyBmUGF3TGVuKSk7CiAKLSAgICBDRlhfQ29sb3IgY2xyTGlnaHQobV9wVGhlbWVEYXRhLT5jbHJQYXdDb2xvckxpZ2h0W2VTdGF0ZSAtIDFdKTsKICAgICBwR3JhcGhpY3MtPlNldExpbmVXaWR0aCgxKTsKLSAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjbHJMaWdodCk7CisgICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigKKyAgICAgICAgQ1hGQV9HRUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyUGF3Q29sb3JMaWdodFtlU3RhdGUgLSAxXSkpOwogICAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7CiAgICAgZlkrKzsKIApAQCAtMTkzLDE0ICsxOTEsMTQgQEAKICAgICBwYXRoLk1vdmVUbyhDRlhfUG9pbnRGKGZYICsgMywgZlkpKTsKICAgICBwYXRoLkxpbmVUbyhDRlhfUG9pbnRGKGZYICsgMywgZlkgKyBmUGF3TGVuKSk7CiAKLSAgICBDRlhfQ29sb3IgY2xyRGFyayhtX3BUaGVtZURhdGEtPmNsclBhd0NvbG9yRGFya1tlU3RhdGUgLSAxXSk7CiAgICAgcEdyYXBoaWNzLT5TZXRMaW5lV2lkdGgoMSk7Ci0gICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY2xyRGFyayk7CisgICAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigKKyAgICAgICAgQ1hGQV9HRUNvbG9yKG1fcFRoZW1lRGF0YS0+Y2xyUGF3Q29sb3JEYXJrW2VTdGF0ZSAtIDFdKSk7CiAgICAgcEdyYXBoaWNzLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsKICAgfQogfQogCi12b2lkIENGV0xfU2Nyb2xsQmFyVFA6OkRyYXdUcmFjayhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd1RyYWNrKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJWZXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLApAQCAtMjEwLDEwICsyMDgsOSBAQAogICAgIHJldHVybjsKIAogICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7Ci0gIENGWF9Db2xvciBjb2xvckxpbmUoQXJnYkVuY29kZSgyNTUsIDIzOCwgMjM3LCAyMjkpKTsKLSAgQ0ZYX1BhdGggcGF0aDsKLSAgRlhfRkxPQVQgZlJpZ2h0ID0gcFJlY3QtPnJpZ2h0KCk7Ci0gIEZYX0ZMT0FUIGZCb3R0b20gPSBwUmVjdC0+Ym90dG9tKCk7CisgIENYRkFfR0VQYXRoIHBhdGg7CisgIGZsb2F0IGZSaWdodCA9IHBSZWN0LT5yaWdodCgpOworICBmbG9hdCBmQm90dG9tID0gcFJlY3QtPmJvdHRvbSgpOwogICBpZiAoYlZlcnQpIHsKICAgICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgMSwgcFJlY3QtPmhlaWdodCk7CiAgICAgcGF0aC5BZGRSZWN0YW5nbGUoZlJpZ2h0IC0gMSwgcFJlY3QtPnRvcCwgMSwgcFJlY3QtPmhlaWdodCk7CkBAIC0yMjEsMjEgKzIxOCwyMSBAQAogICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGgsIDEpOwogICAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0LCBmQm90dG9tIC0gMSwgcFJlY3QtPndpZHRoLCAxKTsKICAgfQotICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY29sb3JMaW5lKTsKKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoQ1hGQV9HRUNvbG9yKEFyZ2JFbmNvZGUoMjU1LCAyMzgsIDIzNywgMjI5KSkpOwogICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7CiAgIHBhdGguQ2xlYXIoKTsKICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQgKyAxLCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGggLSAyLAogICAgICAgICAgICAgICAgICAgICBwUmVjdC0+aGVpZ2h0KTsKLSAgRlhfRkxPQVQgeDEgPSBiVmVydCA/IHBSZWN0LT5sZWZ0ICsgMSA6IHBSZWN0LT5sZWZ0OwotICBGWF9GTE9BVCB5MSA9IGJWZXJ0ID8gcFJlY3QtPnRvcCA6IHBSZWN0LT50b3AgKyAxOwotICBGWF9GTE9BVCB4MiA9IGJWZXJ0ID8gZlJpZ2h0IC0gMSA6IHBSZWN0LT5sZWZ0OwotICBGWF9GTE9BVCB5MiA9IGJWZXJ0ID8gcFJlY3QtPnRvcCA6IGZCb3R0b20gLSAxOworICBmbG9hdCB4MSA9IGJWZXJ0ID8gcFJlY3QtPmxlZnQgKyAxIDogcFJlY3QtPmxlZnQ7CisgIGZsb2F0IHkxID0gYlZlcnQgPyBwUmVjdC0+dG9wIDogcFJlY3QtPnRvcCArIDE7CisgIGZsb2F0IHgyID0gYlZlcnQgPyBmUmlnaHQgLSAxIDogcFJlY3QtPmxlZnQ7CisgIGZsb2F0IHkyID0gYlZlcnQgPyBwUmVjdC0+dG9wIDogZkJvdHRvbSAtIDE7CiAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsKICAgRHJhd0F4aWFsU2hhZGluZyhwR3JhcGhpY3MsIHgxLCB5MSwgeDIsIHkyLCBtX3BUaGVtZURhdGEtPmNsclRyYWNrQktTdGFydCwKICAgICAgICAgICAgICAgICAgICBtX3BUaGVtZURhdGEtPmNsclRyYWNrQktFbmQsICZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7CiB9CiAKLXZvaWQgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd01heE1pbkJ0bihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKK3ZvaWQgQ0ZXTF9TY3JvbGxCYXJUUDo6RHJhd01heE1pbkJ0bihDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9ESVJFQ1RJT04gZURpY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLApkaWZmIC0tZ2l0IGEveGZhL2Z3bC90aGVtZS9jZndsX3Njcm9sbGJhcnRwLmggYi94ZmEvZndsL3RoZW1lL2Nmd2xfc2Nyb2xsYmFydHAuaAppbmRleCAyMzg5ZWZmLi5lZWMzNzJjIDEwMDY0NAotLS0gYS94ZmEvZndsL3RoZW1lL2Nmd2xfc2Nyb2xsYmFydHAuaAorKysgYi94ZmEvZndsL3RoZW1lL2Nmd2xfc2Nyb2xsYmFydHAuaApAQCAtMjksMjQgKzI5LDI0IEBACiAgICAgRlhfQVJHQiBjbHJUcmFja0JLRW5kOwogICB9OwogCi0gIHZvaWQgRHJhd1RodW1iQnRuKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAorICB2b2lkIERyYXdUaHVtYkJ0bihDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsCiAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlZlcnQsCiAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUGF3QnV0dG9uID0gdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IG51bGxwdHIpOwotICB2b2lkIERyYXdUcmFjayhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgdm9pZCBEcmF3VHJhY2soQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LAogICAgICAgICAgICAgICAgICBib29sIGJWZXJ0LAogICAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsCiAgICAgICAgICAgICAgICAgIGJvb2wgYkxvd2VyVHJhY2ssCiAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBudWxscHRyKTsKLSAgdm9pZCBEcmF3TWF4TWluQnRuKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAorICB2b2lkIERyYXdNYXhNaW5CdG4oQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwKICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0RJUkVDVElPTiBlRGljdCwKICAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX1NUQVRFIGVTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSBudWxscHRyKTsKLSAgdm9pZCBEcmF3UGF3KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAorICB2b2lkIERyYXdQYXcoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwKICAgICAgICAgICAgICAgIGJvb2wgYlZlcnQsCiAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsCmRpZmYgLS1naXQgYS94ZmEvZndsL3RoZW1lL2Nmd2xfdXRpbHMuaCBiL3hmYS9md2wvdGhlbWUvY2Z3bF91dGlscy5oCmluZGV4IDUxYmQwN2YuLjhhYTlhM2MgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvdGhlbWUvY2Z3bF91dGlscy5oCisrKyBiL3hmYS9md2wvdGhlbWUvY2Z3bF91dGlscy5oCkBAIC0zMiw3ICszMiw2IEBACiAjZGVmaW5lIEZXTFRIRU1FX0NPTE9SX0VER0VSQjEgKEFyZ2JFbmNvZGUoMjU1LCAyNDEsIDIzOSwgMjI2KSkKICNkZWZpbmUgRldMVEhFTUVfQ09MT1JfQmFja2dyb3VuZCAoQXJnYkVuY29kZSgyNTUsIDIzNiwgMjMzLCAyMTYpKQogI2RlZmluZSBGV0xUSEVNRV9DT0xPUl9CS1NlbGVjdGVkIChBcmdiRW5jb2RlKDI1NSwgMTUzLCAxOTMsIDIxOCkpCi0jZGVmaW5lIEZXTFRIRU1FX0NPTE9SX0dyZWVuX0JLU2VsZWN0ZWQgKEFyZ2JFbmNvZGUoMjU1LCAxNDcsIDE2MCwgMTEyKSkKIAogI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9Gb250U2l6ZSAxMi4wZgogI2RlZmluZSBGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0Q29sb3IgKEFyZ2JFbmNvZGUoMjU1LCAwLCAwLCAwKSkKZGlmZiAtLWdpdCBhL3hmYS9md2wvdGhlbWUvY2Z3bF93aWRnZXR0cC5jcHAgYi94ZmEvZndsL3RoZW1lL2Nmd2xfd2lkZ2V0dHAuY3BwCmluZGV4IGZiY2JjZmYuLjMxMTNkMjQgMTAwNjQ0Ci0tLSBhL3hmYS9md2wvdGhlbWUvY2Z3bF93aWRnZXR0cC5jcHAKKysrIGIveGZhL2Z3bC90aGVtZS9jZndsX3dpZGdldHRwLmNwcApAQCAtMTAsNyArMTAsNyBAQAogI2luY2x1ZGUgPHV0aWxpdHk+CiAKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS90dG8vZmRlX3RleHRvdXQuaCIKKyNpbmNsdWRlICJ4ZmEvZmRlL2NmZGVfdGV4dG91dC5oIgogI2luY2x1ZGUgInhmYS9mZ2FzL2ZvbnQvY2ZnYXNfZm9udG1nci5oIgogI2luY2x1ZGUgInhmYS9mZ2FzL2ZvbnQvY2ZnYXNfZ2Vmb250LmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3RoZW1lYmFja2dyb3VuZC5oIgpAQCAtMTksOSArMTksOSBAQAogI2luY2x1ZGUgInhmYS9md2wvY2Z3bF93aWRnZXQuaCIKICNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfd2lkZ2V0bWdyLmgiCiAjaW5jbHVkZSAieGZhL2Z3bC9pZndsX3RoZW1lcHJvdmlkZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfY29sb3IuaCIKLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfcGF0aC5oIgotI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2NmeF9zaGFkaW5nLmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZWNvbG9yLmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXBhdGguaCIKKyNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jeGZhX2dlc2hhZGluZy5oIgogCiBDRldMX1dpZGdldFRQOjpDRldMX1dpZGdldFRQKCkKICAgICA6IG1fZHdSZWZDb3VudCgxKSwgbV9wRkRFRm9udChudWxscHRyKSwgbV9wQ29sb3JEYXRhKG51bGxwdHIpIHt9CkBAIC00NSwxNSArNDUsMjAgQEAKICAgaWYgKGlMZW4gPD0gMCkKICAgICByZXR1cm47CiAKLSAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MgPSBwUGFyYW1zLT5tX3BHcmFwaGljczsKLSAgbV9wVGV4dE91dC0+U2V0UmVuZGVyRGV2aWNlKHBHcmFwaGljcy0+R2V0UmVuZGVyRGV2aWNlKCkpOworICBDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MgPSBwUGFyYW1zLT5tX3BHcmFwaGljczsKICAgbV9wVGV4dE91dC0+U2V0U3R5bGVzKHBQYXJhbXMtPm1fZHdUVE9TdHlsZXMpOwogICBtX3BUZXh0T3V0LT5TZXRBbGlnbm1lbnQocFBhcmFtcy0+bV9pVFRPQWxpZ24pOwogCiAgIENGWF9NYXRyaXgqIHBNYXRyaXggPSAmcFBhcmFtcy0+bV9tYXRyaXg7CiAgIHBNYXRyaXgtPkNvbmNhdCgqcEdyYXBoaWNzLT5HZXRNYXRyaXgoKSk7CiAgIG1fcFRleHRPdXQtPlNldE1hdHJpeCgqcE1hdHJpeCk7Ci0gIG1fcFRleHRPdXQtPkRyYXdMb2dpY1RleHQocFBhcmFtcy0+bV93c1RleHQuY19zdHIoKSwgaUxlbiwgcFBhcmFtcy0+bV9ydFBhcnQpOworICBtX3BUZXh0T3V0LT5EcmF3TG9naWNUZXh0KHBHcmFwaGljcy0+R2V0UmVuZGVyRGV2aWNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZ1ZpZXcocFBhcmFtcy0+bV93c1RleHQuY19zdHIoKSwgaUxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcy0+bV9ydFBhcnQpOworfQorCitjb25zdCBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiYgQ0ZXTF9XaWRnZXRUUDo6R2V0Rm9udCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcEZERUZvbnQ7CiB9CiAKIHZvaWQgQ0ZXTF9XaWRnZXRUUDo6SW5pdGlhbGl6ZUFycm93Q29sb3JEYXRhKCkgewpAQCAtODksNjIgKzk0LDU3IEBACiAgIG1fcFRleHRPdXQtPlNldEZvbnQobV9wRkRFRm9udCk7CiAgIG1fcFRleHRPdXQtPlNldEZvbnRTaXplKEZXTFRIRU1FX0NBUEFDSVRZX0ZvbnRTaXplKTsKICAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKEZXTFRIRU1FX0NBUEFDSVRZX1RleHRDb2xvcik7Ci0gIG1fcFRleHRPdXQtPlNldEVsbGlwc2lzU3RyaW5nKEwiLi4uIik7CiB9CiAKIHZvaWQgQ0ZXTF9XaWRnZXRUUDo6RmluYWxpemVUVE8oKSB7CiAgIG1fcFRleHRPdXQucmVzZXQoKTsKIH0KIAotdm9pZCBDRldMX1dpZGdldFRQOjpEcmF3Qm9yZGVyKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAordm9pZCBDRldMX1dpZGdldFRQOjpEcmF3Qm9yZGVyKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgaWYgKCFwR3JhcGhpY3MpCisgIGlmICghcEdyYXBoaWNzIHx8ICFwUmVjdCkKICAgICByZXR1cm47Ci0gIGlmICghcFJlY3QpCi0gICAgcmV0dXJuOwotICBDRlhfUGF0aCBwYXRoOworCisgIENYRkFfR0VQYXRoIHBhdGg7CiAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGgsIHBSZWN0LT5oZWlnaHQpOwogICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCArIDEsIHBSZWN0LT50b3AgKyAxLCBwUmVjdC0+d2lkdGggLSAyLAogICAgICAgICAgICAgICAgICAgICBwUmVjdC0+aGVpZ2h0IC0gMik7CiAgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsKLSAgQ0ZYX0NvbG9yIGNyRmlsbChBcmdiRW5jb2RlKDI1NSwgMCwgMCwgMCkpOwotICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3JGaWxsKTsKKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoQ1hGQV9HRUNvbG9yKEFyZ2JFbmNvZGUoMjU1LCAwLCAwLCAwKSkpOwogICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfQUxURVJOQVRFLCBwTWF0cml4KTsKICAgcEdyYXBoaWNzLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOwogfQogCi12b2lkIENGV0xfV2lkZ2V0VFA6OkZpbGxCYWNrZ3JvdW5kKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAordm9pZCBDRldMX1dpZGdldFRQOjpGaWxsQmFja2dyb3VuZChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKICAgRmlsbFNvaWxkUmVjdChwR3JhcGhpY3MsIEZXTFRIRU1FX0NPTE9SX0JhY2tncm91bmQsIHBSZWN0LCBwTWF0cml4KTsKIH0KIAotdm9pZCBDRldMX1dpZGdldFRQOjpGaWxsU29pbGRSZWN0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAordm9pZCBDRldMX1dpZGdldFRQOjpGaWxsU29pbGRSZWN0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxDb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgaWYgKCFwR3JhcGhpY3MpCisgIGlmICghcEdyYXBoaWNzIHx8ICFwUmVjdCkKICAgICByZXR1cm47Ci0gIGlmICghcFJlY3QpCi0gICAgcmV0dXJuOwotICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7Ci0gIENGWF9Db2xvciBjckZpbGwoZmlsbENvbG9yKTsKLSAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyRmlsbCk7Ci0gIENGWF9QYXRoIHBhdGg7CisKKyAgQ1hGQV9HRVBhdGggcGF0aDsKICAgcGF0aC5BZGRSZWN0YW5nbGUocFJlY3QtPmxlZnQsIHBSZWN0LT50b3AsIHBSZWN0LT53aWR0aCwgcFJlY3QtPmhlaWdodCk7CisgIHBHcmFwaGljcy0+U2F2ZUdyYXBoU3RhdGUoKTsKKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoQ1hGQV9HRUNvbG9yKGZpbGxDb2xvcikpOwogICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7CiAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsKIH0KIAotdm9pZCBDRldMX1dpZGdldFRQOjpEcmF3QXhpYWxTaGFkaW5nKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmeTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZngyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5MiwKK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhd0F4aWFsU2hhZGluZyhDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZngxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZ5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZnkyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYmVnaW5Db2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGVuZENvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfR0VQYXRoKiBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmlsbE1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewogICBpZiAoIXBHcmFwaGljcyB8fCAhcGF0aCkKQEAgLTE1Miw0NCArMTUyLDQyIEBACiAKICAgQ0ZYX1BvaW50RiBiZWdQb2ludChmeDEsIGZ5MSk7CiAgIENGWF9Qb2ludEYgZW5kUG9pbnQoZngyLCBmeTIpOwotICBDRlhfU2hhZGluZyBzaGFkaW5nKGJlZ1BvaW50LCBlbmRQb2ludCwgZmFsc2UsIGZhbHNlLCBiZWdpbkNvbG9yLCBlbmRDb2xvcik7CisgIENYRkFfR0VTaGFkaW5nIHNoYWRpbmcoYmVnUG9pbnQsIGVuZFBvaW50LCBmYWxzZSwgZmFsc2UsIGJlZ2luQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgZW5kQ29sb3IpOwogICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7Ci0gIENGWF9Db2xvciBjb2xvcjEoJnNoYWRpbmcpOwotICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY29sb3IxKTsKKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoQ1hGQV9HRUNvbG9yKCZzaGFkaW5nKSk7CiAgIHBHcmFwaGljcy0+RmlsbFBhdGgocGF0aCwgZmlsbE1vZGUsIHBNYXRyaXgpOwogICBwR3JhcGhpY3MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7CiB9CiAKLXZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhd0ZvY3VzKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAordm9pZCBDRldMX1dpZGdldFRQOjpEcmF3Rm9jdXMoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgaWYgKCFwR3JhcGhpY3MpCisgIGlmICghcEdyYXBoaWNzIHx8ICFwUmVjdCkKICAgICByZXR1cm47Ci0gIGlmICghcFJlY3QpCi0gICAgcmV0dXJuOwotICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7Ci0gIENGWF9Db2xvciBjcigweEZGMDAwMDAwKTsKLSAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmY3IpOwotICBGWF9GTE9BVCBEYXNoUGF0dGVyblsyXSA9IHsxLCAxfTsKLSAgcEdyYXBoaWNzLT5TZXRMaW5lRGFzaCgwLjBmLCBEYXNoUGF0dGVybiwgMik7Ci0gIENGWF9QYXRoIHBhdGg7CisKKyAgZmxvYXQgRGFzaFBhdHRlcm5bMl0gPSB7MSwgMX07CisgIENYRkFfR0VQYXRoIHBhdGg7CiAgIHBhdGguQWRkUmVjdGFuZ2xlKHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBwUmVjdC0+d2lkdGgsIHBSZWN0LT5oZWlnaHQpOworICBwR3JhcGhpY3MtPlNhdmVHcmFwaFN0YXRlKCk7CisgIHBHcmFwaGljcy0+U2V0U3Ryb2tlQ29sb3IoQ1hGQV9HRUNvbG9yKDB4RkYwMDAwMDApKTsKKyAgcEdyYXBoaWNzLT5TZXRMaW5lRGFzaCgwLjBmLCBEYXNoUGF0dGVybiwgMik7CiAgIHBHcmFwaGljcy0+U3Ryb2tlUGF0aCgmcGF0aCwgcE1hdHJpeCk7CiAgIHBHcmFwaGljcy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsKIH0KIAotdm9pZCBDRldMX1dpZGdldFRQOjpEcmF3QXJyb3coQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCit2b2lkIENGV0xfV2lkZ2V0VFA6OkRyYXdBcnJvdyhDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfRElSRUNUSU9OIGVEaWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdTaWduLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewogICBib29sIGJWZXJ0ID0KICAgICAgIChlRGljdCA9PSBGV0xUSEVNRV9ESVJFQ1RJT05fVXAgfHwgZURpY3QgPT0gRldMVEhFTUVfRElSRUNUSU9OX0Rvd24pOwotICBGWF9GTE9BVCBmTGVmdCA9Ci0gICAgICAoRlhfRkxPQVQpKCgocFJlY3QtPndpZHRoIC0gKGJWZXJ0ID8gOSA6IDYpKSAvIDIgKyBwUmVjdC0+bGVmdCkgKyAwLjUpOwotICBGWF9GTE9BVCBmVG9wID0KLSAgICAgIChGWF9GTE9BVCkoKChwUmVjdC0+aGVpZ2h0IC0gKGJWZXJ0ID8gNiA6IDkpKSAvIDIgKyBwUmVjdC0+dG9wKSArIDAuNSk7Ci0gIENGWF9QYXRoIHBhdGg7CisgIGZsb2F0IGZMZWZ0ID0KKyAgICAgIChmbG9hdCkoKChwUmVjdC0+d2lkdGggLSAoYlZlcnQgPyA5IDogNikpIC8gMiArIHBSZWN0LT5sZWZ0KSArIDAuNSk7CisgIGZsb2F0IGZUb3AgPQorICAgICAgKGZsb2F0KSgoKHBSZWN0LT5oZWlnaHQgLSAoYlZlcnQgPyA2IDogOSkpIC8gMiArIHBSZWN0LT50b3ApICsgMC41KTsKKyAgQ1hGQV9HRVBhdGggcGF0aDsKICAgc3dpdGNoIChlRGljdCkgewogICAgIGNhc2UgRldMVEhFTUVfRElSRUNUSU9OX0Rvd246IHsKICAgICAgIHBhdGguTW92ZVRvKENGWF9Qb2ludEYoZkxlZnQsIGZUb3AgKyAxKSk7CkBAIC0yMjgsMzMgKzIyNiwzMCBAQAogICAgICAgYnJlYWs7CiAgICAgfQogICB9Ci0gIENGWF9Db2xvciBjcihhcmdTaWduKTsKLSAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoJmNyKTsKKyAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoQ1hGQV9HRUNvbG9yKGFyZ1NpZ24pKTsKICAgcEdyYXBoaWNzLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOwogfQogCi12b2lkIENGV0xfV2lkZ2V0VFA6OkRyYXdCdG4oQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCit2b2lkIENGV0xfV2lkZ2V0VFA6OkRyYXdCdG4oQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgQ0ZYX1BhdGggcGF0aDsKICAgSW5pdGlhbGl6ZUFycm93Q29sb3JEYXRhKCk7CiAKLSAgRlhfRkxPQVQgZlJpZ2h0ID0gcFJlY3QtPnJpZ2h0KCk7Ci0gIEZYX0ZMT0FUIGZCb3R0b20gPSBwUmVjdC0+Ym90dG9tKCk7CisgIENYRkFfR0VQYXRoIHBhdGg7CisgIGZsb2F0IGZSaWdodCA9IHBSZWN0LT5yaWdodCgpOworICBmbG9hdCBmQm90dG9tID0gcFJlY3QtPmJvdHRvbSgpOwogICBwYXRoLkFkZFJlY3RhbmdsZShwUmVjdC0+bGVmdCwgcFJlY3QtPnRvcCwgcFJlY3QtPndpZHRoLCBwUmVjdC0+aGVpZ2h0KTsKICAgRHJhd0F4aWFsU2hhZGluZyhwR3JhcGhpY3MsIHBSZWN0LT5sZWZ0LCBwUmVjdC0+dG9wLCBmUmlnaHQsIGZCb3R0b20sCiAgICAgICAgICAgICAgICAgICAgbV9wQ29sb3JEYXRhLT5jbHJTdGFydFtlU3RhdGUgLSAxXSwKICAgICAgICAgICAgICAgICAgICBtX3BDb2xvckRhdGEtPmNsckVuZFtlU3RhdGUgLSAxXSwgJnBhdGgsIEZYRklMTF9XSU5ESU5HLAogICAgICAgICAgICAgICAgICAgIHBNYXRyaXgpOwogCi0gIENGWF9Db2xvciByY1N0cm9rZTsKLSAgcmNTdHJva2UuU2V0KG1fcENvbG9yRGF0YS0+Y2xyQm9yZGVyW2VTdGF0ZSAtIDFdKTsKLSAgcEdyYXBoaWNzLT5TZXRTdHJva2VDb2xvcigmcmNTdHJva2UpOworICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKENYRkFfR0VDb2xvcihtX3BDb2xvckRhdGEtPmNsckJvcmRlcltlU3RhdGUgLSAxXSkpOwogICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOwogfQogCi12b2lkIENGV0xfV2lkZ2V0VFA6OkRyYXdBcnJvd0J0bihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKK3ZvaWQgQ0ZXTF9XaWRnZXRUUDo6RHJhd0Fycm93QnRuKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9ESVJFQ1RJT04gZURpY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsCkBAIC0yNzAsMzIgKzI2NSwzNSBAQAogCiBDRldMX0ZvbnREYXRhOjp+Q0ZXTF9Gb250RGF0YSgpIHt9CiAKLWJvb2wgQ0ZXTF9Gb250RGF0YTo6RXF1YWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksCitib29sIENGV0xfRm9udERhdGE6OkVxdWFsKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c0ZvbnRGYW1pbHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3Rm9udFN0eWxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgd0NvZGVQYWdlKSB7CiAgIHJldHVybiBtX3dzRmFtaWx5ID09IHdzRm9udEZhbWlseSAmJiBtX2R3U3R5bGVzID09IGR3Rm9udFN0eWxlcyAmJgogICAgICAgICAgbV9kd0NvZGVQYWdlID09IHdDb2RlUGFnZTsKIH0KIAotYm9vbCBDRldMX0ZvbnREYXRhOjpMb2FkRm9udChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9udEZhbWlseSwKK2Jvb2wgQ0ZXTF9Gb250RGF0YTo6TG9hZEZvbnQoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzRm9udEZhbWlseSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGb250U3R5bGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBkd0NvZGVQYWdlKSB7CiAgIG1fd3NGYW1pbHkgPSB3c0ZvbnRGYW1pbHk7CiAgIG1fZHdTdHlsZXMgPSBkd0ZvbnRTdHlsZXM7CiAgIG1fZHdDb2RlUGFnZSA9IGR3Q29kZVBhZ2U7CiAgIGlmICghbV9wRm9udE1ncikgewotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgICBtX3BGb250TWdyID0gQ0ZHQVNfRm9udE1ncjo6Q3JlYXRlKEZYX0dldERlZkZvbnRFbnVtZXJhdG9yKCkpOwotI2Vsc2UKLSAgICBtX3BGb250U291cmNlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9Gb250U291cmNlRW51bV9GaWxlPigpOwotICAgIG1fcEZvbnRNZ3IgPSBDRkdBU19Gb250TWdyOjpDcmVhdGUobV9wRm9udFNvdXJjZS5nZXQoKSk7Ci0jZW5kaWYKKyAgICBtX3BGb250TWdyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGR0FTX0ZvbnRNZ3I+KCk7CisgICAgaWYgKCFtX3BGb250TWdyLT5FbnVtRm9udHMoKSkKKyAgICAgIG1fcEZvbnRNZ3IgPSBudWxscHRyOwogICB9Ci0gIG1fcEZvbnQgPSBDRkdBU19HRUZvbnQ6OkxvYWRGb250KHdzRm9udEZhbWlseS5jX3N0cigpLCBkd0ZvbnRTdHlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3Q29kZVBhZ2UsIG1fcEZvbnRNZ3IuZ2V0KCkpOworCisgIC8vIFRPRE8odHNlcGV6KTogY2hlY2sgdXNhZ2Ugb2YgY19zdHIoKSBiZWxvdy4KKyAgbV9wRm9udCA9IENGR0FTX0dFRm9udDo6TG9hZEZvbnQod3NGb250RmFtaWx5LnVudGVybWluYXRlZF9jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ZvbnRTdHlsZXMsIGR3Q29kZVBhZ2UsIG1fcEZvbnRNZ3IuZ2V0KCkpOwogICByZXR1cm4gISFtX3BGb250OwogfQogCitSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBDRldMX0ZvbnREYXRhOjpHZXRGb250KCkgY29uc3QgeworICByZXR1cm4gbV9wRm9udDsKK30KKwogQ0ZXTF9Gb250TWFuYWdlciogQ0ZXTF9Gb250TWFuYWdlcjo6c19Gb250TWFuYWdlciA9IG51bGxwdHI7CiBDRldMX0ZvbnRNYW5hZ2VyKiBDRldMX0ZvbnRNYW5hZ2VyOjpHZXRJbnN0YW5jZSgpIHsKICAgaWYgKCFzX0ZvbnRNYW5hZ2VyKQpAQCAtMzEyLDggKzMxMCw4IEBACiAKIENGV0xfRm9udE1hbmFnZXI6On5DRldMX0ZvbnRNYW5hZ2VyKCkge30KIAotQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IENGV0xfRm9udE1hbmFnZXI6OkZpbmRGb250KAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LAorUmV0YWluUHRyPENGR0FTX0dFRm9udD4gQ0ZXTF9Gb250TWFuYWdlcjo6RmluZEZvbnQoCisgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzRm9udEZhbWlseSwKICAgICB1aW50MzJfdCBkd0ZvbnRTdHlsZXMsCiAgICAgdWludDE2X3Qgd0NvZGVQYWdlKSB7CiAgIGZvciAoY29uc3QgYXV0byYgcERhdGEgOiBtX0ZvbnRzQXJyYXkpIHsKZGlmZiAtLWdpdCBhL3hmYS9md2wvdGhlbWUvY2Z3bF93aWRnZXR0cC5oIGIveGZhL2Z3bC90aGVtZS9jZndsX3dpZGdldHRwLmgKaW5kZXggYzgxOTUwNy4uNzgxM2MwOCAxMDA2NDQKLS0tIGEveGZhL2Z3bC90aGVtZS9jZndsX3dpZGdldHRwLmgKKysrIGIveGZhL2Z3bC90aGVtZS9jZndsX3dpZGdldHRwLmgKQEAgLTEwLDIyICsxMCwyMSBAQAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyLmgiCiAjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9jZmdhc19nZWZvbnQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKICNpbmNsdWRlICJ4ZmEvZndsL3RoZW1lL2Nmd2xfdXRpbHMuaCIKLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfZ3JhcGhpY3MuaCIKKyNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jeGZhX2dyYXBoaWNzLmgiCiAKIGNsYXNzIENGREVfVGV4dE91dDsKK2NsYXNzIENGR0FTX0ZvbnRNZ3I7CiBjbGFzcyBDRkdBU19HRUZvbnQ7CiBjbGFzcyBDRldMX1RoZW1lQmFja2dyb3VuZDsKIGNsYXNzIENGV0xfVGhlbWVQYXJ0OwogY2xhc3MgQ0ZXTF9UaGVtZVRleHQ7Ci1jbGFzcyBDRkdBU19Gb250TWdyOwogY2xhc3MgQ0ZXTF9XaWRnZXQ7CiAKLSNpZiBfRlhNX1BMQVRGT1JNXyAhPSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCisjaWYgX0ZYX1BMQVRGT1JNXyAhPSBfRlhfUExBVEZPUk1fV0lORE9XU18KIGNsYXNzIENGWF9Gb250U291cmNlRW51bV9GaWxlOwogI2VuZGlmCiAKQEAgLTM5LDcgKzM4LDcgQEAKICAgdmlydHVhbCB2b2lkIERyYXdCYWNrZ3JvdW5kKENGV0xfVGhlbWVCYWNrZ3JvdW5kKiBwUGFyYW1zKTsKICAgdmlydHVhbCB2b2lkIERyYXdUZXh0KENGV0xfVGhlbWVUZXh0KiBwUGFyYW1zKTsKIAotICBjb25zdCBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4mIEdldEZvbnQoKSBjb25zdCB7IHJldHVybiBtX3BGREVGb250OyB9CisgIGNvbnN0IFJldGFpblB0cjxDRkdBU19HRUZvbnQ+JiBHZXRGb250KCkgY29uc3Q7CiAKICBwcm90ZWN0ZWQ6CiAgIHN0cnVjdCBDQ29sb3JEYXRhIHsKQEAgLTU1LDM5ICs1NCwzOSBAQAogICB2b2lkIEluaXRUVE8oKTsKICAgdm9pZCBGaW5hbGl6ZVRUTygpOwogCi0gIHZvaWQgRHJhd0JvcmRlcihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgdm9pZCBEcmF3Qm9yZGVyKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsCiAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gbnVsbHB0cik7Ci0gIHZvaWQgRmlsbEJhY2tncm91bmQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgIHZvaWQgRmlsbEJhY2tncm91bmQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IG51bGxwdHIpOwotICB2b2lkIEZpbGxTb2lsZFJlY3QoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgIHZvaWQgRmlsbFNvaWxkUmVjdChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGZpbGxDb2xvciwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsCiAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gbnVsbHB0cik7Ci0gIHZvaWQgRHJhd0F4aWFsU2hhZGluZyhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZ5MiwKKyAgdm9pZCBEcmF3QXhpYWxTaGFkaW5nKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZ4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZ5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZ4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZ5MiwKICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYmVnaW5Db2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgZW5kQ29sb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aCogcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfR0VQYXRoKiBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmaWxsTW9kZSA9IEZYRklMTF9XSU5ESU5HLAogICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IG51bGxwdHIpOwotICB2b2lkIERyYXdGb2N1cyhDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgdm9pZCBEcmF3Rm9jdXMoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAogICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSZWN0LAogICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gbnVsbHB0cik7Ci0gIHZvaWQgRHJhd0Fycm93KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAorICB2b2lkIERyYXdBcnJvdyhDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsCiAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0RJUkVDVElPTiBlRGljdCwKICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdTaWduLAogICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gbnVsbHB0cik7Ci0gIHZvaWQgRHJhd0J0bihDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgdm9pZCBEcmF3QnRuKENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsCiAgICAgICAgICAgICAgICBGV0xUSEVNRV9TVEFURSBlU3RhdGUsCiAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4ID0gbnVsbHB0cik7Ci0gIHZvaWQgRHJhd0Fycm93QnRuKENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAorICB2b2lkIERyYXdBcnJvd0J0bihDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiogcFJlY3QsCiAgICAgICAgICAgICAgICAgICAgIEZXTFRIRU1FX0RJUkVDVElPTiBlRGljdCwKICAgICAgICAgICAgICAgICAgICAgRldMVEhFTUVfU1RBVEUgZVN0YXRlLApAQCAtOTUsNyArOTQsNyBAQAogCiAgIHVpbnQzMl90IG1fZHdSZWZDb3VudDsKICAgc3RkOjp1bmlxdWVfcHRyPENGREVfVGV4dE91dD4gbV9wVGV4dE91dDsKLSAgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IG1fcEZERUZvbnQ7CisgIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+IG1fcEZERUZvbnQ7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDQ29sb3JEYXRhPiBtX3BDb2xvckRhdGE7CiB9OwogCkBAIC0xMDYsMjMgKzEwNSwyMCBAQAogICBDRldMX0ZvbnREYXRhKCk7CiAgIHZpcnR1YWwgfkNGV0xfRm9udERhdGEoKTsKIAotICBib29sIEVxdWFsKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LAorICBib29sIEVxdWFsKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c0ZvbnRGYW1pbHksCiAgICAgICAgICAgICAgdWludDMyX3QgZHdGb250U3R5bGVzLAogICAgICAgICAgICAgIHVpbnQxNl90IHdDb2RlUGFnZSk7Ci0gIGJvb2wgTG9hZEZvbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksCisgIGJvb2wgTG9hZEZvbnQoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzRm9udEZhbWlseSwKICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZvbnRTdHlsZXMsCiAgICAgICAgICAgICAgICAgdWludDE2X3Qgd0NvZGVQYWdlKTsKLSAgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IEdldEZvbnQoKSBjb25zdCB7IHJldHVybiBtX3BGb250OyB9CisgIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+IEdldEZvbnQoKSBjb25zdDsKIAogIHByb3RlY3RlZDoKLSAgQ0ZYX1dpZGVTdHJpbmcgbV93c0ZhbWlseTsKKyAgV2lkZVN0cmluZyBtX3dzRmFtaWx5OwogICB1aW50MzJfdCBtX2R3U3R5bGVzOwogICB1aW50MzJfdCBtX2R3Q29kZVBhZ2U7Ci0jaWYgX0ZYTV9QTEFURk9STV8gIT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0ZvbnRTb3VyY2VFbnVtX0ZpbGU+IG1fcEZvbnRTb3VyY2U7Ci0jZW5kaWYKICAgc3RkOjp1bmlxdWVfcHRyPENGR0FTX0ZvbnRNZ3I+IG1fcEZvbnRNZ3I7Ci0gIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBtX3BGb250OworICBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBtX3BGb250OwogfTsKIAogY2xhc3MgQ0ZXTF9Gb250TWFuYWdlciB7CkBAIC0xMzAsOSArMTI2LDkgQEAKICAgc3RhdGljIENGV0xfRm9udE1hbmFnZXIqIEdldEluc3RhbmNlKCk7CiAgIHN0YXRpYyB2b2lkIERlc3Ryb3lJbnN0YW5jZSgpOwogCi0gIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBGaW5kRm9udChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9udEZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3Rm9udFN0eWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGR3Q29kZVBhZ2UpOworICBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBGaW5kRm9udChjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NGb250RmFtaWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZvbnRTdHlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGR3Q29kZVBhZ2UpOwogCiAgcHJvdGVjdGVkOgogICBDRldMX0ZvbnRNYW5hZ2VyKCk7CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL0JDX0RpbWVuc2lvbi5jcHAgYi94ZmEvZnhiYXJjb2RlL0JDX0RpbWVuc2lvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYjA3NmMuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9CQ19EaW1lbnNpb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgotLyoKLSAqIENvcHlyaWdodCAyMDEyIFpYaW5nIGF1dGhvcnMKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvQkNfRGltZW5zaW9uLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuaCIKLQotQ0JDX0RpbWVuc2lvbjo6Q0JDX0RpbWVuc2lvbigpIHt9Ci1DQkNfRGltZW5zaW9uOjpDQkNfRGltZW5zaW9uKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90JiBlKSB7Ci0gIGlmICh3aWR0aCA8IDAgfHwgaGVpZ2h0IDwgMCkgewotICAgIGUgPSBCQ0V4Y2VwdGlvbkhlaWdodEFuZFdpZHRoTXVzdEJlQXRMZWFzdDE7Ci0gIH0KLSAgbV93aWR0aCA9IHdpZHRoOwotICBtX2hlaWdodCA9IGhlaWdodDsKLX0KLUNCQ19EaW1lbnNpb246On5DQkNfRGltZW5zaW9uKCkge30KLWludDMyX3QgQ0JDX0RpbWVuc2lvbjo6Z2V0V2lkdGgoKSB7Ci0gIHJldHVybiBtX3dpZHRoOwotfQotaW50MzJfdCBDQkNfRGltZW5zaW9uOjpnZXRIZWlnaHQoKSB7Ci0gIHJldHVybiBtX2hlaWdodDsKLX0KLWludDMyX3QgQ0JDX0RpbWVuc2lvbjo6aGFzaENvZGUoKSB7Ci0gIHJldHVybiBtX3dpZHRoICogMzI3MTMgKyBtX2hlaWdodDsKLX0KLUNGWF9XaWRlU3RyaW5nIENCQ19EaW1lbnNpb246OnRvU3RyaW5nKCkgewotICByZXR1cm4gKEZYX1dDSEFSKShtX3dpZHRoICsgKEZYX1dDSEFSKSd4JyArIG1faGVpZ2h0KTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvQkNfRGltZW5zaW9uLmggYi94ZmEvZnhiYXJjb2RlL0JDX0RpbWVuc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDUwYjBmLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvQkNfRGltZW5zaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYQkFSQ09ERV9CQ19ESU1FTlNJT05fSF8KLSNkZWZpbmUgWEZBX0ZYQkFSQ09ERV9CQ19ESU1FTlNJT05fSF8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotCi1jbGFzcyBDQkNfRGltZW5zaW9uIHsKLSBwdWJsaWM6Ci0gIENCQ19EaW1lbnNpb24oKTsKLSAgQ0JDX0RpbWVuc2lvbihpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCYgZSk7Ci0gIHZpcnR1YWwgfkNCQ19EaW1lbnNpb24oKTsKLSAgaW50MzJfdCBnZXRXaWR0aCgpOwotICBpbnQzMl90IGdldEhlaWdodCgpOwotICBpbnQzMl90IGhhc2hDb2RlKCk7Ci0gIENGWF9XaWRlU3RyaW5nIHRvU3RyaW5nKCk7Ci0KLSBwcml2YXRlOgotICBpbnQzMl90IG1fd2lkdGg7Ci0gIGludDMyX3QgbV9oZWlnaHQ7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfQkNfRElNRU5TSU9OX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL0JDX0xpYnJhcnkuY3BwIGIveGZhL2Z4YmFyY29kZS9CQ19MaWJyYXJ5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc1YmMyMi4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL0JDX0xpYnJhcnkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9CQ19MaWJyYXJ5LmgiCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTYuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRXJyb3JDb3JyZWN0aW9uLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1vZGUuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyVmVyc2lvbi5oIgotCi12b2lkIEJDX0xpYnJhcnlfSW5pdCgpIHsKLSAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6SW5pdGlhbGl6ZSgpOwotICBDQkNfUVJDb2Rlck1vZGU6OkluaXRpYWxpemUoKTsKLSAgQ0JDX1FSQ29kZXJWZXJzaW9uOjpJbml0aWFsaXplKCk7Ci0gIENCQ19SZWVkU29sb21vbkdGMjU2OjpJbml0aWFsaXplKCk7Ci0gIENCQ19TeW1ib2xJbmZvOjpJbml0aWFsaXplKCk7Ci0gIENCQ19FcnJvckNvcnJlY3Rpb246OkluaXRpYWxpemUoKTsKLSAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkluaXRpYWxpemUoKTsKLX0KLXZvaWQgQkNfTGlicmFyeV9EZXN0b3J5KCkgewotICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpGaW5hbGl6ZSgpOwotICBDQkNfUVJDb2Rlck1vZGU6OkZpbmFsaXplKCk7Ci0gIENCQ19RUkNvZGVyVmVyc2lvbjo6RmluYWxpemUoKTsKLSAgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkZpbmFsaXplKCk7Ci0gIENCQ19TeW1ib2xJbmZvOjpGaW5hbGl6ZSgpOwotICBDQkNfRXJyb3JDb3JyZWN0aW9uOjpGaW5hbGl6ZSgpOwotICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6RmluYWxpemUoKTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvQkNfTGlicmFyeS5oIGIveGZhL2Z4YmFyY29kZS9CQ19MaWJyYXJ5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZWY5ZDEuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9CQ19MaWJyYXJ5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYQkFSQ09ERV9CQ19MSUJSQVJZX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfQkNfTElCUkFSWV9IXwotCi1lbnVtIEJDX1RFWFRfTE9DIHsKLSAgQkNfVEVYVF9MT0NfTk9ORSA9IDAsCi0gIEJDX1RFWFRfTE9DX0FCT1ZFLAotICBCQ19URVhUX0xPQ19CRUxPVywKLSAgQkNfVEVYVF9MT0NfQUJPVkVFTUJFRCwKLSAgQkNfVEVYVF9MT0NfQkVMT1dFTUJFRAotfTsKLQotZW51bSBCQ19DSEFSX0VOQ09ESU5HIHsgQ0hBUl9FTkNPRElOR19VVEY4ID0gMCwgQ0hBUl9FTkNPRElOR19VTklDT0RFIH07Ci0KLWVudW0gQkNfVFlQRSB7Ci0gIEJDX1VOS05PV04gPSAtMSwKLSAgQkNfQ09ERTM5ID0gMCwKLSAgQkNfQ09EQUJBUiwKLSAgQkNfQ09ERTEyOCwKLSAgQkNfQ09ERTEyOF9CLAotICBCQ19DT0RFMTI4X0MsCi0gIEJDX0VBTjgsCi0gIEJDX1VQQ0EsCi0gIEJDX0VBTjEzLAotICBCQ19RUl9DT0RFLAotICBCQ19QREY0MTcsCi0gIEJDX0RBVEFNQVRSSVgKLX07Ci0KLXZvaWQgQkNfTGlicmFyeV9Jbml0KCk7Ci12b2lkIEJDX0xpYnJhcnlfRGVzdG9yeSgpOwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfQkNfTElCUkFSWV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9CQ19Ud29EaW1Xcml0ZXIuY3BwIGIveGZhL2Z4YmFyY29kZS9CQ19Ud29EaW1Xcml0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWFhZTM2Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvQkNfVHdvRGltV3JpdGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGVkYXRhLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9udW1lcmljcy9zYWZlX21hdGguaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9CQ19Ud29EaW1Xcml0ZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL0JDX1dyaXRlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIgotCi1DQkNfVHdvRGltV3JpdGVyOjpDQkNfVHdvRGltV3JpdGVyKCkgOiBtX2lDb3JyZWN0TGV2ZWwoMSksIG1fYkZpeGVkU2l6ZSh0cnVlKSB7fQotCi1DQkNfVHdvRGltV3JpdGVyOjp+Q0JDX1R3b0RpbVdyaXRlcigpIHt9Ci0KLXZvaWQgQ0JDX1R3b0RpbVdyaXRlcjo6UmVuZGVyRGV2aWNlUmVzdWx0KENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCkgewotICBDRlhfR3JhcGhTdGF0ZURhdGEgc3RhdGVEYXRhOwotICBDRlhfUGF0aERhdGEgcGF0aDsKLSAgcGF0aC5BcHBlbmRSZWN0KDAsIDAsIChGWF9GTE9BVCltX1dpZHRoLCAoRlhfRkxPQVQpbV9IZWlnaHQpOwotICBkZXZpY2UtPkRyYXdQYXRoKCZwYXRoLCBtYXRyaXgsICZzdGF0ZURhdGEsIG1fYmFja2dyb3VuZENvbG9yLAotICAgICAgICAgICAgICAgICAgIG1fYmFja2dyb3VuZENvbG9yLCBGWEZJTExfQUxURVJOQVRFKTsKLSAgaW50MzJfdCBsZWZ0UG9zID0gMDsKLSAgaW50MzJfdCB0b3BQb3MgPSAwOwotICBpZiAobV9iRml4ZWRTaXplKSB7Ci0gICAgbGVmdFBvcyA9IChtX1dpZHRoIC0gbV9vdXRwdXQtPkdldFdpZHRoKCkpIC8gMjsKLSAgICB0b3BQb3MgPSAobV9IZWlnaHQgLSBtX291dHB1dC0+R2V0SGVpZ2h0KCkpIC8gMjsKLSAgfQotICBDRlhfTWF0cml4IG1hdHJpID0gKm1hdHJpeDsKLSAgaWYgKG1fV2lkdGggPCBtX291dHB1dC0+R2V0V2lkdGgoKSAmJiBtX0hlaWdodCA8IG1fb3V0cHV0LT5HZXRIZWlnaHQoKSkgewotICAgIENGWF9NYXRyaXggbWF0cmlTY2FsZSgKLSAgICAgICAgKEZYX0ZMT0FUKW1fV2lkdGggLyAoRlhfRkxPQVQpbV9vdXRwdXQtPkdldFdpZHRoKCksIDAuMCwgMC4wLAotICAgICAgICAoRlhfRkxPQVQpbV9IZWlnaHQgLyAoRlhfRkxPQVQpbV9vdXRwdXQtPkdldEhlaWdodCgpLCAwLjAsIDAuMCk7Ci0gICAgbWF0cmlTY2FsZS5Db25jYXQoKm1hdHJpeCk7Ci0gICAgbWF0cmkgPSBtYXRyaVNjYWxlOwotICB9Ci0gIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IG1fb3V0cHV0LT5HZXRXaWR0aCgpOyB4KyspIHsKLSAgICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBtX291dHB1dC0+R2V0SGVpZ2h0KCk7IHkrKykgewotICAgICAgQ0ZYX1BhdGhEYXRhIHJlY3Q7Ci0gICAgICByZWN0LkFwcGVuZFJlY3QoKEZYX0ZMT0FUKWxlZnRQb3MgKyB4LCAoRlhfRkxPQVQpdG9wUG9zICsgeSwKLSAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3MgKyB4ICsgMSksIChGWF9GTE9BVCkodG9wUG9zICsgeSArIDEpKTsKLSAgICAgIGlmIChtX291dHB1dC0+R2V0KHgsIHkpKSB7Ci0gICAgICAgIENGWF9HcmFwaFN0YXRlRGF0YSBkYXRhOwotICAgICAgICBkZXZpY2UtPkRyYXdQYXRoKCZyZWN0LCAmbWF0cmksICZkYXRhLCBtX2JhckNvbG9yLCAwLCBGWEZJTExfV0lORElORyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLWludDMyX3QgQ0JDX1R3b0RpbVdyaXRlcjo6R2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoKSBjb25zdCB7Ci0gIHJldHVybiBtX2lDb3JyZWN0TGV2ZWw7Ci19Ci0KLXZvaWQgQ0JDX1R3b0RpbVdyaXRlcjo6UmVuZGVyQml0bWFwUmVzdWx0KENGWF9ESUJpdG1hcComIHBPdXRCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGlmIChtX2JGaXhlZFNpemUpIHsKLSAgICBwT3V0Qml0bWFwID0gQ3JlYXRlRElCaXRtYXAobV9XaWR0aCwgbV9IZWlnaHQpOwotICB9IGVsc2UgewotICAgIHBPdXRCaXRtYXAgPSBDcmVhdGVESUJpdG1hcChtX291dHB1dC0+R2V0V2lkdGgoKSwgbV9vdXRwdXQtPkdldEhlaWdodCgpKTsKLSAgfQotICBpZiAoIXBPdXRCaXRtYXApIHsKLSAgICBlID0gQkNFeGNlcHRpb25GYWlsVG9DcmVhdGVCaXRtYXA7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBPdXRCaXRtYXAtPkNsZWFyKG1fYmFja2dyb3VuZENvbG9yKTsKLSAgaW50MzJfdCBsZWZ0UG9zID0gMDsKLSAgaW50MzJfdCB0b3BQb3MgPSAwOwotICBpZiAobV9iRml4ZWRTaXplKSB7Ci0gICAgbGVmdFBvcyA9IChtX1dpZHRoIC0gbV9vdXRwdXQtPkdldFdpZHRoKCkpIC8gMjsKLSAgICB0b3BQb3MgPSAobV9IZWlnaHQgLSBtX291dHB1dC0+R2V0SGVpZ2h0KCkpIC8gMjsKLSAgfQotICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBtX291dHB1dC0+R2V0V2lkdGgoKTsgeCsrKSB7Ci0gICAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgbV9vdXRwdXQtPkdldEhlaWdodCgpOyB5KyspIHsKLSAgICAgIGlmIChtX291dHB1dC0+R2V0KHgsIHkpKSB7Ci0gICAgICAgIHBPdXRCaXRtYXAtPlNldFBpeGVsKGxlZnRQb3MgKyB4LCB0b3BQb3MgKyB5LCBtX2JhckNvbG9yKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaWYgKCFtX2JGaXhlZFNpemUpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBwU3RyZXRjaEJpdG1hcCA9Ci0gICAgICAgIHBPdXRCaXRtYXAtPlN0cmV0Y2hUbyhtX1dpZHRoLCBtX0hlaWdodCk7Ci0gICAgZGVsZXRlIHBPdXRCaXRtYXA7Ci0gICAgcE91dEJpdG1hcCA9IHBTdHJldGNoQml0bWFwLnJlbGVhc2UoKTsKLSAgfQotfQotCi12b2lkIENCQ19Ud29EaW1Xcml0ZXI6OlJlbmRlclJlc3VsdCh1aW50OF90KiBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2RlV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGludDMyX3QgaW5wdXRXaWR0aCA9IGNvZGVXaWR0aDsKLSAgaW50MzJfdCBpbnB1dEhlaWdodCA9IGNvZGVIZWlnaHQ7Ci0gIGludDMyX3QgdGVtcFdpZHRoID0gaW5wdXRXaWR0aCArIDI7Ci0gIGludDMyX3QgdGVtcEhlaWdodCA9IGlucHV0SGVpZ2h0ICsgMjsKLSAgRlhfRkxPQVQgbW9kdWxlSFNpemUgPSBzdGQ6Om1pbihtX01vZHVsZVdpZHRoLCBtX01vZHVsZUhlaWdodCk7Ci0gIG1vZHVsZUhTaXplID0gc3RkOjptaW4obW9kdWxlSFNpemUsIDguMGYpOwotICBtb2R1bGVIU2l6ZSA9IHN0ZDo6bWF4KG1vZHVsZUhTaXplLCAxLjBmKTsKLSAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQzMl90PiBzY2FsZWRXaWR0aCA9IHRlbXBXaWR0aDsKLSAgcGRmaXVtOjpiYXNlOjpDaGVja2VkTnVtZXJpYzxpbnQzMl90PiBzY2FsZWRIZWlnaHQgPSB0ZW1wSGVpZ2h0OwotICBzY2FsZWRXaWR0aCAqPSBtb2R1bGVIU2l6ZTsKLSAgc2NhbGVkSGVpZ2h0ICo9IG1vZHVsZUhTaXplOwotCi0gIGludDMyX3Qgb3V0cHV0V2lkdGggPSBzY2FsZWRXaWR0aC5WYWx1ZU9yRGllKCk7Ci0gIGludDMyX3Qgb3V0cHV0SGVpZ2h0ID0gc2NhbGVkSGVpZ2h0LlZhbHVlT3JEaWUoKTsKLSAgaWYgKG1fYkZpeGVkU2l6ZSkgewotICAgIGlmIChtX1dpZHRoIDwgb3V0cHV0V2lkdGggfHwgbV9IZWlnaHQgPCBvdXRwdXRIZWlnaHQpIHsKLSAgICAgIGUgPSBCQ0V4Y2VwdGlvbkJpdG1hcFNpemVFcnJvcjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKG1fV2lkdGggPiBvdXRwdXRXaWR0aCB8fCBtX0hlaWdodCA+IG91dHB1dEhlaWdodCkgewotICAgICAgb3V0cHV0V2lkdGggPSAoaW50MzJfdCkob3V0cHV0V2lkdGggKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VpbCgoRlhfRkxPQVQpbV9XaWR0aCAvIChGWF9GTE9BVClvdXRwdXRXaWR0aCkpOwotICAgICAgb3V0cHV0SGVpZ2h0ID0gKGludDMyX3QpKAotICAgICAgICAgIG91dHB1dEhlaWdodCAqIGNlaWwoKEZYX0ZMT0FUKW1fSGVpZ2h0IC8gKEZYX0ZMT0FUKW91dHB1dEhlaWdodCkpOwotICAgIH0KLSAgfQotICBpbnQzMl90IG11bHRpWCA9IChpbnQzMl90KWNlaWwoKEZYX0ZMT0FUKW91dHB1dFdpZHRoIC8gKEZYX0ZMT0FUKXRlbXBXaWR0aCk7Ci0gIGludDMyX3QgbXVsdGlZID0gKGludDMyX3QpY2VpbCgoRlhfRkxPQVQpb3V0cHV0SGVpZ2h0IC8gKEZYX0ZMT0FUKXRlbXBIZWlnaHQpOwotICBpZiAobV9iRml4ZWRTaXplKSB7Ci0gICAgbXVsdGlYID0gc3RkOjptaW4obXVsdGlYLCBtdWx0aVkpOwotICAgIG11bHRpWSA9IG11bHRpWDsKLSAgfQotICBpbnQzMl90IGxlZnRQYWRkaW5nID0gKG91dHB1dFdpZHRoIC0gKGlucHV0V2lkdGggKiBtdWx0aVgpKSAvIDI7Ci0gIGludDMyX3QgdG9wUGFkZGluZyA9IChvdXRwdXRIZWlnaHQgLSAoaW5wdXRIZWlnaHQgKiBtdWx0aVkpKSAvIDI7Ci0gIGlmIChsZWZ0UGFkZGluZyA8IDApIHsKLSAgICBsZWZ0UGFkZGluZyA9IDA7Ci0gIH0KLSAgaWYgKHRvcFBhZGRpbmcgPCAwKSB7Ci0gICAgdG9wUGFkZGluZyA9IDA7Ci0gIH0KLSAgbV9vdXRwdXQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0JDX0NvbW1vbkJpdE1hdHJpeD4oKTsKLSAgbV9vdXRwdXQtPkluaXQob3V0cHV0V2lkdGgsIG91dHB1dEhlaWdodCk7Ci0gIGZvciAoaW50MzJfdCBpbnB1dFkgPSAwLCBvdXRwdXRZID0gdG9wUGFkZGluZzsKLSAgICAgICAoaW5wdXRZIDwgaW5wdXRIZWlnaHQpICYmIChvdXRwdXRZIDwgb3V0cHV0SGVpZ2h0IC0gbXVsdGlZKTsKLSAgICAgICBpbnB1dFkrKywgb3V0cHV0WSArPSBtdWx0aVkpIHsKLSAgICBmb3IgKGludDMyX3QgaW5wdXRYID0gMCwgb3V0cHV0WCA9IGxlZnRQYWRkaW5nOwotICAgICAgICAgKGlucHV0WCA8IGlucHV0V2lkdGgpICYmIChvdXRwdXRYIDwgb3V0cHV0V2lkdGggLSBtdWx0aVgpOwotICAgICAgICAgaW5wdXRYKyssIG91dHB1dFggKz0gbXVsdGlYKSB7Ci0gICAgICBpZiAoY29kZVtpbnB1dFggKyBpbnB1dFkgKiBpbnB1dFdpZHRoXSA9PSAxKSB7Ci0gICAgICAgIG1fb3V0cHV0LT5TZXRSZWdpb24ob3V0cHV0WCwgb3V0cHV0WSwgbXVsdGlYLCBtdWx0aVksIGUpOwotICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvQkNfVHdvRGltV3JpdGVyLmggYi94ZmEvZnhiYXJjb2RlL0JDX1R3b0RpbVdyaXRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDQ2NThiLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvQkNfVHdvRGltV3JpdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYQkFSQ09ERV9CQ19UV09ESU1XUklURVJfSF8KLSNkZWZpbmUgWEZBX0ZYQkFSQ09ERV9CQ19UV09ESU1XUklURVJfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvQkNfV3JpdGVyLmgiCi0KLWNsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7Ci1jbGFzcyBDRlhfUmVuZGVyRGV2aWNlOwotCi1jbGFzcyBDQkNfVHdvRGltV3JpdGVyIDogcHVibGljIENCQ19Xcml0ZXIgewotIHB1YmxpYzoKLSAgQ0JDX1R3b0RpbVdyaXRlcigpOwotICB+Q0JDX1R3b0RpbVdyaXRlcigpIG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgdm9pZCBSZW5kZXJSZXN1bHQodWludDhfdCogY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7Ci0gIHZpcnR1YWwgdm9pZCBSZW5kZXJCaXRtYXBSZXN1bHQoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSk7Ci0gIHZpcnR1YWwgdm9pZCBSZW5kZXJEZXZpY2VSZXN1bHQoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCk7Ci0gIHZpcnR1YWwgYm9vbCBTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGxldmVsKSA9IDA7Ci0KLSAgaW50MzJfdCBHZXRFcnJvckNvcnJlY3Rpb25MZXZlbCgpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgotICBpbnQzMl90IG1faUNvcnJlY3RMZXZlbDsKLSAgYm9vbCBtX2JGaXhlZFNpemU7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDQkNfQ29tbW9uQml0TWF0cml4PiBtX291dHB1dDsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYQkFSQ09ERV9CQ19UV09ESU1XUklURVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuY3BwIGIveGZhL2Z4YmFyY29kZS9CQ19VdGlsQ29kaW5nQ29udmVydC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNmNmZmMuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9CQ19VdGlsQ29kaW5nQ29udmVydC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL0JDX1V0aWxDb2RpbmdDb252ZXJ0LmgiCi0KLUNCQ19VdGlsQ29kaW5nQ29udmVydDo6Q0JDX1V0aWxDb2RpbmdDb252ZXJ0KCkge30KLQotQ0JDX1V0aWxDb2RpbmdDb252ZXJ0Ojp+Q0JDX1V0aWxDb2RpbmdDb252ZXJ0KCkge30KLQotdm9pZCBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OlVuaWNvZGVUb0xvY2FsZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgZHN0KSB7Ci0gIGRzdCA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShzcmMpOwotfQotCi12b2lkIENCQ19VdGlsQ29kaW5nQ29udmVydDo6TG9jYWxlVG9VdGY4KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBkc3QpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgdW5pY29kZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tTG9jYWwoc3JjLkFzU3RyaW5nQygpKTsKLSAgZHN0ID0gdW5pY29kZS5VVEY4RW5jb2RlKCk7Ci19Ci0KLXZvaWQgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpMb2NhbGVUb1V0ZjgoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdD4mIGRzdCkgewotICBDRlhfV2lkZVN0cmluZyB1bmljb2RlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21Mb2NhbChzcmMuQXNTdHJpbmdDKCkpOwotICBDRlhfQnl0ZVN0cmluZyB1dGY4ID0gdW5pY29kZS5VVEY4RW5jb2RlKCk7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHV0ZjguR2V0TGVuZ3RoKCk7IGkrKykgewotICAgIGRzdC5BZGQodXRmOFtpXSk7Ci0gIH0KLX0KLQotdm9pZCBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OlV0ZjhUb0xvY2FsZShjb25zdCBDRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90PiYgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgZHN0KSB7Ci0gIENGWF9CeXRlU3RyaW5nIHV0Zjg7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNyYy5HZXRTaXplKCk7IGkrKykgewotICAgIHV0ZjggKz0gc3JjW2ldOwotICB9Ci0gIENGWF9XaWRlU3RyaW5nIHVuaWNvZGUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgodXRmOC5Bc1N0cmluZ0MoKSk7Ci0gIGRzdCA9IENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZSh1bmljb2RlKTsKLX0KLQotdm9pZCBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OlV0ZjhUb0xvY2FsZShjb25zdCB1aW50OF90KiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBkc3QpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgdW5pY29kZSA9Ci0gICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoQ0ZYX0J5dGVTdHJpbmdDKHNyYywgY291bnQpKTsKLSAgZHN0ID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHVuaWNvZGUpOwotfQotCi12b2lkIENCQ19VdGlsQ29kaW5nQ29udmVydDo6VW5pY29kZVRvVVRGOChjb25zdCBDRlhfV2lkZVN0cmluZyYgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIGRzdCkgewotICBkc3QgPSBzcmMuVVRGOEVuY29kZSgpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9CQ19VdGlsQ29kaW5nQ29udmVydC5oIGIveGZhL2Z4YmFyY29kZS9CQ19VdGlsQ29kaW5nQ29udmVydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTllZWVhLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhCQVJDT0RFX0JDX1VUSUxDT0RJTkdDT05WRVJUX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfQkNfVVRJTENPRElOR0NPTlZFUlRfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLQotY2xhc3MgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0IHsKLSBwdWJsaWM6Ci0gIENCQ19VdGlsQ29kaW5nQ29udmVydCgpOwotICB2aXJ0dWFsIH5DQkNfVXRpbENvZGluZ0NvbnZlcnQoKTsKLSAgc3RhdGljIHZvaWQgVW5pY29kZVRvTG9jYWxlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0KTsKLSAgc3RhdGljIHZvaWQgTG9jYWxlVG9VdGY4KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0KTsKLSAgc3RhdGljIHZvaWQgTG9jYWxlVG9VdGY4KGNvbnN0IENGWF9CeXRlU3RyaW5nJiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90PiYgcmVzdWx0KTsKLSAgc3RhdGljIHZvaWQgVXRmOFRvTG9jYWxlKGNvbnN0IENGWF9BcnJheVRlbXBsYXRlPHVpbnQ4X3Q+JiBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0KTsKLSAgc3RhdGljIHZvaWQgVXRmOFRvTG9jYWxlKGNvbnN0IHVpbnQ4X3QqIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgcmVzdWx0KTsKLSAgc3RhdGljIHZvaWQgVW5pY29kZVRvVVRGOChjb25zdCBDRlhfV2lkZVN0cmluZyYgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiByZXN1bHQpOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhCQVJDT0RFX0JDX1VUSUxDT0RJTkdDT05WRVJUX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL0JDX1V0aWxzLmNwcCBiL3hmYS9meGJhcmNvZGUvQkNfVXRpbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDg4MWM3Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvQkNfVXRpbHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvdXRpbHMuaCIKLQotYm9vbCBCQ19GWF9CeXRlU3RyaW5nX1JlcGxhY2UoQ0ZYX0J5dGVTdHJpbmcmIGRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9DSEFSIGMpIHsKLSAgaWYgKGZpcnN0ID4gbGFzdCB8fCBjb3VudCA8PSAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGRzdC5EZWxldGUoZmlyc3QsIGxhc3QgLSBmaXJzdCk7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICBkc3QuSW5zZXJ0KDAsIGMpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotdm9pZCBCQ19GWF9CeXRlU3RyaW5nX0FwcGVuZChDRlhfQnl0ZVN0cmluZyYgZHN0LCBpbnQzMl90IGNvdW50LCBGWF9DSEFSIGMpIHsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgIGRzdCArPSBjOwotICB9Ci19Ci12b2lkIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKENGWF9CeXRlU3RyaW5nJiBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BcnJheVRlbXBsYXRlPHVpbnQ4X3Q+JiBiYSkgewotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBiYS5HZXRTaXplKCk7IGkrKykgewotICAgIGRzdCArPSBiYVtpXTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9CQ19Xcml0ZXIuY3BwIGIveGZhL2Z4YmFyY29kZS9CQ19Xcml0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzE2MzUyLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvQkNfV3JpdGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvQkNfV3JpdGVyLmgiCi0KLUNCQ19Xcml0ZXI6OkNCQ19Xcml0ZXIoKSB7Ci0gIG1fQ2hhckVuY29kaW5nID0gMDsKLSAgbV9Nb2R1bGVIZWlnaHQgPSAxOwotICBtX01vZHVsZVdpZHRoID0gMTsKLSAgbV9IZWlnaHQgPSAzMjA7Ci0gIG1fV2lkdGggPSA2NDA7Ci0gIG1fY29sb3JTcGFjZSA9IEZYRElCX0FyZ2I7Ci0gIG1fYmFyQ29sb3IgPSAweGZmMDAwMDAwOwotICBtX2JhY2tncm91bmRDb2xvciA9IDB4ZmZmZmZmZmY7Ci19Ci1DQkNfV3JpdGVyOjp+Q0JDX1dyaXRlcigpIHt9Ci1ib29sIENCQ19Xcml0ZXI6OlNldENoYXJFbmNvZGluZyhpbnQzMl90IGVuY29kaW5nKSB7Ci0gIG1fQ2hhckVuY29kaW5nID0gZW5jb2Rpbmc7Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDQkNfV3JpdGVyOjpTZXRNb2R1bGVIZWlnaHQoaW50MzJfdCBtb2R1bGVIZWlnaHQpIHsKLSAgaWYgKG1vZHVsZUhlaWdodCA+IDEwIHx8IG1vZHVsZUhlaWdodCA8IDEpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgbV9Nb2R1bGVIZWlnaHQgPSBtb2R1bGVIZWlnaHQ7Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDQkNfV3JpdGVyOjpTZXRNb2R1bGVXaWR0aChpbnQzMl90IG1vZHVsZVdpZHRoKSB7Ci0gIGlmIChtb2R1bGVXaWR0aCA+IDEwIHx8IG1vZHVsZVdpZHRoIDwgMSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBtX01vZHVsZVdpZHRoID0gbW9kdWxlV2lkdGg7Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDQkNfV3JpdGVyOjpTZXRIZWlnaHQoaW50MzJfdCBoZWlnaHQpIHsKLSAgbV9IZWlnaHQgPSBoZWlnaHQ7Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDQkNfV3JpdGVyOjpTZXRXaWR0aChpbnQzMl90IHdpZHRoKSB7Ci0gIG1fV2lkdGggPSB3aWR0aDsKLSAgcmV0dXJuIHRydWU7Ci19Ci12b2lkIENCQ19Xcml0ZXI6OlNldEJhY2tncm91bmRDb2xvcihGWF9BUkdCIGJhY2tncm91bmRDb2xvcikgewotICBtX2JhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjsKLX0KLXZvaWQgQ0JDX1dyaXRlcjo6U2V0QmFyY29kZUNvbG9yKEZYX0FSR0IgZm9yZWdyb3VuZENvbG9yKSB7Ci0gIG1fYmFyQ29sb3IgPSBmb3JlZ3JvdW5kQ29sb3I7Ci19Ci1DRlhfRElCaXRtYXAqIENCQ19Xcml0ZXI6OkNyZWF0ZURJQml0bWFwKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7Ci0gIENGWF9ESUJpdG1hcCogcERJQml0bWFwID0gbmV3IENGWF9ESUJpdG1hcDsKLSAgcERJQml0bWFwLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgbV9jb2xvclNwYWNlKTsKLSAgcmV0dXJuIHBESUJpdG1hcDsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvQkNfV3JpdGVyLmggYi94ZmEvZnhiYXJjb2RlL0JDX1dyaXRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGVhMDZhLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvQkNfV3JpdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYQkFSQ09ERV9CQ19XUklURVJfSF8KLSNkZWZpbmUgWEZBX0ZYQkFSQ09ERV9CQ19XUklURVJfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvdXRpbHMuaCIKLQotY2xhc3MgQ0JDX1dyaXRlciB7Ci0gcHVibGljOgotICBDQkNfV3JpdGVyKCk7Ci0gIHZpcnR1YWwgfkNCQ19Xcml0ZXIoKTsKLSAgdmlydHVhbCBib29sIFNldENoYXJFbmNvZGluZyhpbnQzMl90IGVuY29kaW5nKTsKLSAgdmlydHVhbCBib29sIFNldE1vZHVsZUhlaWdodChpbnQzMl90IG1vZHVsZUhlaWdodCk7Ci0gIHZpcnR1YWwgYm9vbCBTZXRNb2R1bGVXaWR0aChpbnQzMl90IG1vZHVsZVdpZHRoKTsKLSAgdmlydHVhbCBib29sIFNldEhlaWdodChpbnQzMl90IGhlaWdodCk7Ci0gIHZpcnR1YWwgYm9vbCBTZXRXaWR0aChpbnQzMl90IHdpZHRoKTsKLSAgdmlydHVhbCB2b2lkIFNldEJhY2tncm91bmRDb2xvcihGWF9BUkdCIGJhY2tncm91bmRDb2xvcik7Ci0gIHZpcnR1YWwgdm9pZCBTZXRCYXJjb2RlQ29sb3IoRlhfQVJHQiBmb3JlZ3JvdW5kQ29sb3IpOwotCi0gcHJvdGVjdGVkOgotICBDRlhfRElCaXRtYXAqIENyZWF0ZURJQml0bWFwKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KTsKLSAgaW50MzJfdCBtX0NoYXJFbmNvZGluZzsKLSAgaW50MzJfdCBtX01vZHVsZUhlaWdodDsKLSAgaW50MzJfdCBtX01vZHVsZVdpZHRoOwotICBpbnQzMl90IG1fSGVpZ2h0OwotICBpbnQzMl90IG1fV2lkdGg7Ci0gIEZYRElCX0Zvcm1hdCBtX2NvbG9yU3BhY2U7Ci0gIEZYX0FSR0IgbV9iYXJDb2xvcjsKLSAgRlhfQVJHQiBtX2JhY2tncm91bmRDb2xvcjsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYQkFSQ09ERV9CQ19XUklURVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvREVQUyBiL3hmYS9meGJhcmNvZGUvREVQUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUxOWNlYS4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL0RFUFMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWluY2x1ZGVfcnVsZXMgPSBbCi0gICcrY29yZS9meGNvZGVjJywKLV0KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvY2JjX2NvZGFiYXIuY3BwIGIveGZhL2Z4YmFyY29kZS9jYmNfY29kYWJhci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNmFiNGEuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9jYmNfY29kYWJhci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLyoKLSAqIENvcHlyaWdodCAyMDExIFpYaW5nIGF1dGhvcnMKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY2JjX2NvZGFiYXIuaCIKLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kYUJhcldyaXRlci5oIgotCi1DQkNfQ29kYWJhcjo6Q0JDX0NvZGFiYXIoKSA6IENCQ19PbmVDb2RlKG5ldyBDQkNfT25lZENvZGFCYXJXcml0ZXIpIHt9Ci0KLUNCQ19Db2RhYmFyOjp+Q0JDX0NvZGFiYXIoKSB7fQotCi1ib29sIENCQ19Db2RhYmFyOjpTZXRTdGFydENoYXIoRlhfQ0hBUiBzdGFydCkgewotICBpZiAoIW1fcEJDV3JpdGVyKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PENCQ19PbmVkQ29kYUJhcldyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKQotICAgICAgLT5TZXRTdGFydENoYXIoc3RhcnQpOwotfQotCi1ib29sIENCQ19Db2RhYmFyOjpTZXRFbmRDaGFyKEZYX0NIQVIgZW5kKSB7Ci0gIGlmIChtX3BCQ1dyaXRlcikKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0JDX09uZWRDb2RhQmFyV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpCi0gICAgICAgIC0+U2V0RW5kQ2hhcihlbmQpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ0JDX0NvZGFiYXI6OlNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbikgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0JDX09uZWRDb2RhQmFyV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpCi0gICAgICAtPlNldFRleHRMb2NhdGlvbihsb2NhdGlvbik7Ci19Ci0KLWJvb2wgQ0JDX0NvZGFiYXI6OlNldFdpZGVOYXJyb3dSYXRpbyhpbnQzMl90IHJhdGlvKSB7Ci0gIGlmIChtX3BCQ1dyaXRlcikKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0JDX09uZWRDb2RhQmFyV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpCi0gICAgICAgIC0+U2V0V2lkZU5hcnJvd1JhdGlvKHJhdGlvKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENCQ19Db2RhYmFyOjpFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgaWYgKGNvbnRlbnRzLklzRW1wdHkoKSkgewotICAgIGUgPSBCQ0V4Y2VwdGlvbk5vQ29udGVudHM7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEJDRk9STUFUIGZvcm1hdCA9IEJDRk9STUFUX0NPREFCQVI7Ci0gIGludDMyX3Qgb3V0V2lkdGggPSAwOwotICBpbnQzMl90IG91dEhlaWdodCA9IDA7Ci0gIENGWF9XaWRlU3RyaW5nIGZpbHRlcmNvbnRlbnRzID0KLSAgICAgIHN0YXRpY19jYXN0PENCQ19PbmVEaW1Xcml0ZXIqPihtX3BCQ1dyaXRlci5nZXQoKSkKLSAgICAgICAgICAtPkZpbHRlckNvbnRlbnRzKGNvbnRlbnRzKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IGZpbHRlcmNvbnRlbnRzLlVURjhFbmNvZGUoKTsKLSAgbV9yZW5kZXJDb250ZW50cyA9IGZpbHRlcmNvbnRlbnRzOwotICB1aW50OF90KiBkYXRhID0gc3RhdGljX2Nhc3Q8Q0JDX09uZWRDb2RhQmFyV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpCi0gICAgICAgICAgICAgICAgICAgICAgLT5FbmNvZGUoYnl0ZVN0cmluZywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHN0YXRpY19jYXN0PENCQ19PbmVEaW1Xcml0ZXIqPihtX3BCQ1dyaXRlci5nZXQoKSkKLSAgICAgIC0+UmVuZGVyUmVzdWx0KGZpbHRlcmNvbnRlbnRzLkFzU3RyaW5nQygpLCBkYXRhLCBvdXRXaWR0aCwgaXNEZXZpY2UsIGUpOwotICBGWF9GcmVlKGRhdGEpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0JDX0NvZGFiYXI6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgcmVuZGVyQ29uID0KLSAgICAgIHN0YXRpY19jYXN0PENCQ19PbmVkQ29kYUJhcldyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKQotICAgICAgICAgIC0+ZW5jb2RlZENvbnRlbnRzKG1fcmVuZGVyQ29udGVudHMuQXNTdHJpbmdDKCkpOwotICBzdGF0aWNfY2FzdDxDQkNfT25lRGltV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpCi0gICAgICAtPlJlbmRlckRldmljZVJlc3VsdChkZXZpY2UsIG1hdHJpeCwgcmVuZGVyQ29uLkFzU3RyaW5nQygpLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENCQ19Db2RhYmFyOjpSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSkgewotICBDRlhfV2lkZVN0cmluZyByZW5kZXJDb24gPQotICAgICAgc3RhdGljX2Nhc3Q8Q0JDX09uZWRDb2RhQmFyV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpCi0gICAgICAgICAgLT5lbmNvZGVkQ29udGVudHMobV9yZW5kZXJDb250ZW50cy5Bc1N0cmluZ0MoKSk7Ci0gIHN0YXRpY19jYXN0PENCQ19PbmVEaW1Xcml0ZXIqPihtX3BCQ1dyaXRlci5nZXQoKSkKLSAgICAgIC0+UmVuZGVyQml0bWFwUmVzdWx0KHBPdXRCaXRtYXAsIHJlbmRlckNvbi5Bc1N0cmluZ0MoKSwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotQkNfVFlQRSBDQkNfQ29kYWJhcjo6R2V0VHlwZSgpIHsKLSAgcmV0dXJuIEJDX0NPREFCQVI7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2NiY19jb2RhYmFyLmggYi94ZmEvZnhiYXJjb2RlL2NiY19jb2RhYmFyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NjMxYTkuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9jYmNfY29kYWJhci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfQ0JDX0NPREFCQVJfSF8KLSNkZWZpbmUgWEZBX0ZYQkFSQ09ERV9DQkNfQ09EQUJBUl9IXwotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY2JjX29uZWNvZGUuaCIKLQotY2xhc3MgQ0JDX0NvZGFiYXIgOiBwdWJsaWMgQ0JDX09uZUNvZGUgewotIHB1YmxpYzoKLSAgQ0JDX0NvZGFiYXIoKTsKLSAgfkNCQ19Db2RhYmFyKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ0JDX09uZUNvZGU6Ci0gIGJvb2wgRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsCi0gICAgICAgICAgICAgIGJvb2wgaXNEZXZpY2UsCi0gICAgICAgICAgICAgIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICBib29sIFJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgUmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcComIHBPdXRCaXRtYXAsIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICBCQ19UWVBFIEdldFR5cGUoKSBvdmVycmlkZTsKLQotICBib29sIFNldFN0YXJ0Q2hhcihGWF9DSEFSIHN0YXJ0KTsKLSAgYm9vbCBTZXRFbmRDaGFyKEZYX0NIQVIgZW5kKTsKLSAgYm9vbCBTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pOwotICBib29sIFNldFdpZGVOYXJyb3dSYXRpbyhpbnQzMl90IHJhdGlvKTsKLQotIHByaXZhdGU6Ci0gIENGWF9XaWRlU3RyaW5nIG1fcmVuZGVyQ29udGVudHM7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfQ0JDX0NPREFCQVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvY2JjX2NvZGUxMjguY3BwIGIveGZhL2Z4YmFyY29kZS9jYmNfY29kZTEyOC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YmQxMzYuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9jYmNfY29kZTEyOC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0vKgotICogQ29weXJpZ2h0IDIwMTEgWlhpbmcgYXV0aG9ycwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jYmNfY29kZTEyOC5oIgotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMTI4V3JpdGVyLmgiCi0KLUNCQ19Db2RlMTI4OjpDQkNfQ29kZTEyOChCQ19UWVBFIHR5cGUpCi0gICAgOiBDQkNfT25lQ29kZShuZXcgQ0JDX09uZWRDb2RlMTI4V3JpdGVyKHR5cGUpKSB7fQotCi1DQkNfQ29kZTEyODo6fkNCQ19Db2RlMTI4KCkge30KLQotYm9vbCBDQkNfQ29kZTEyODo6U2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKSB7Ci0gIGlmIChtX3BCQ1dyaXRlcikKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0JDX09uZWRDb2RlMTI4V3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpCi0gICAgICAgIC0+U2V0VGV4dExvY2F0aW9uKGxvY2F0aW9uKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENCQ19Db2RlMTI4OjpFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgaWYgKGNvbnRlbnRzLklzRW1wdHkoKSkgewotICAgIGUgPSBCQ0V4Y2VwdGlvbk5vQ29udGVudHM7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEJDRk9STUFUIGZvcm1hdCA9IEJDRk9STUFUX0NPREVfMTI4OwotICBpbnQzMl90IG91dFdpZHRoID0gMDsKLSAgaW50MzJfdCBvdXRIZWlnaHQgPSAwOwotICBDRlhfV2lkZVN0cmluZyBjb250ZW50KGNvbnRlbnRzKTsKLSAgaWYgKGNvbnRlbnRzLkdldExlbmd0aCgpICUgMiAmJgotICAgICAgc3RhdGljX2Nhc3Q8Q0JDX09uZWRDb2RlMTI4V3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpLT5HZXRUeXBlKCkgPT0KLSAgICAgICAgICBCQ19DT0RFMTI4X0MpIHsKLSAgICBjb250ZW50ICs9ICcwJzsKLSAgfQotICBDRlhfV2lkZVN0cmluZyBlbmNvZGVDb250ZW50cyA9Ci0gICAgICBzdGF0aWNfY2FzdDxDQkNfT25lZENvZGUxMjhXcml0ZXIqPihtX3BCQ1dyaXRlci5nZXQoKSkKLSAgICAgICAgICAtPkZpbHRlckNvbnRlbnRzKGNvbnRlbnQuQXNTdHJpbmdDKCkpOwotICBtX3JlbmRlckNvbnRlbnRzID0gZW5jb2RlQ29udGVudHM7Ci0gIENGWF9CeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBlbmNvZGVDb250ZW50cy5VVEY4RW5jb2RlKCk7Ci0gIHVpbnQ4X3QqIGRhdGEgPSBzdGF0aWNfY2FzdDxDQkNfT25lZENvZGUxMjhXcml0ZXIqPihtX3BCQ1dyaXRlci5nZXQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAtPkVuY29kZShieXRlU3RyaW5nLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RhdGljX2Nhc3Q8Q0JDX09uZURpbVdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKQotICAgICAgLT5SZW5kZXJSZXN1bHQoZW5jb2RlQ29udGVudHMuQXNTdHJpbmdDKCksIGRhdGEsIG91dFdpZHRoLCBpc0RldmljZSwgZSk7Ci0gIEZYX0ZyZWUoZGF0YSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDQkNfQ29kZTEyODo6UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBzdGF0aWNfY2FzdDxDQkNfT25lRGltV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpCi0gICAgICAtPlJlbmRlckRldmljZVJlc3VsdChkZXZpY2UsIG1hdHJpeCwgbV9yZW5kZXJDb250ZW50cy5Bc1N0cmluZ0MoKSwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDQkNfQ29kZTEyODo6UmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcComIHBPdXRCaXRtYXAsIGludDMyX3QmIGUpIHsKLSAgc3RhdGljX2Nhc3Q8Q0JDX09uZURpbVdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKQotICAgICAgLT5SZW5kZXJCaXRtYXBSZXN1bHQocE91dEJpdG1hcCwgbV9yZW5kZXJDb250ZW50cy5Bc1N0cmluZ0MoKSwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotQkNfVFlQRSBDQkNfQ29kZTEyODo6R2V0VHlwZSgpIHsKLSAgcmV0dXJuIEJDX0NPREUxMjg7Ci19Ci0KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvY2JjX2NvZGUxMjguaCBiL3hmYS9meGJhcmNvZGUvY2JjX2NvZGUxMjguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRkOWM4NC4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2NiY19jb2RlMTI4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYQkFSQ09ERV9DQkNfQ09ERTEyOF9IXwotI2RlZmluZSBYRkFfRlhCQVJDT0RFX0NCQ19DT0RFMTI4X0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jYmNfb25lY29kZS5oIgotCi1jbGFzcyBDQkNfQ29kZTEyOCA6IHB1YmxpYyBDQkNfT25lQ29kZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDQkNfQ29kZTEyOChCQ19UWVBFIHR5cGUpOwotICB+Q0JDX0NvZGUxMjgoKSBvdmVycmlkZTsKLQotICAvLyBDQkNfT25lQ29kZToKLSAgYm9vbCBFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywKLSAgICAgICAgICAgICAgYm9vbCBpc0RldmljZSwKLSAgICAgICAgICAgICAgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LAotICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSBvdmVycmlkZTsKLSAgYm9vbCBSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0gIEJDX1RZUEUgR2V0VHlwZSgpIG92ZXJyaWRlOwotCi0gIGJvb2wgU2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY3Rpb24pOwotCi0gcHJpdmF0ZToKLSAgQ0ZYX1dpZGVTdHJpbmcgbV9yZW5kZXJDb250ZW50czsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYQkFSQ09ERV9DQkNfQ09ERTEyOF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9jYmNfY29kZTM5LmNwcCBiL3hmYS9meGJhcmNvZGUvY2JjX2NvZGUzOS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmNDVhZDQuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9jYmNfY29kZTM5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0vKgotICogQ29weXJpZ2h0IDIwMTEgWlhpbmcgYXV0aG9ycwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jYmNfY29kZTM5LmgiCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVdyaXRlci5oIgotCi1DQkNfQ29kZTM5OjpDQkNfQ29kZTM5KCkgOiBDQkNfT25lQ29kZShuZXcgQ0JDX09uZWRDb2RlMzlXcml0ZXIpIHt9Ci0KLUNCQ19Db2RlMzk6On5DQkNfQ29kZTM5KCkge30KLQotYm9vbCBDQkNfQ29kZTM5OjpFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGlmIChjb250ZW50cy5Jc0VtcHR5KCkpIHsKLSAgICBlID0gQkNFeGNlcHRpb25Ob0NvbnRlbnRzOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBCQ0ZPUk1BVCBmb3JtYXQgPSBCQ0ZPUk1BVF9DT0RFXzM5OwotICBpbnQzMl90IG91dFdpZHRoID0gMDsKLSAgaW50MzJfdCBvdXRIZWlnaHQgPSAwOwotICBDRlhfV2lkZVN0cmluZyBmaWx0ZXJjb250ZW50cyA9Ci0gICAgICBzdGF0aWNfY2FzdDxDQkNfT25lZENvZGUzOVdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKQotICAgICAgICAgIC0+RmlsdGVyQ29udGVudHMoY29udGVudHMpOwotICBDRlhfV2lkZVN0cmluZyByZW5kZXJDb250ZW50cyA9Ci0gICAgICBzdGF0aWNfY2FzdDxDQkNfT25lZENvZGUzOVdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKQotICAgICAgICAgIC0+UmVuZGVyVGV4dENvbnRlbnRzKGNvbnRlbnRzKTsKLSAgbV9yZW5kZXJDb250ZW50cyA9IHJlbmRlckNvbnRlbnRzOwotICBDRlhfQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gZmlsdGVyY29udGVudHMuVVRGOEVuY29kZSgpOwotICB1aW50OF90KiBkYXRhID0gc3RhdGljX2Nhc3Q8Q0JDX09uZWRDb2RlMzlXcml0ZXIqPihtX3BCQ1dyaXRlci5nZXQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAtPkVuY29kZShieXRlU3RyaW5nLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RhdGljX2Nhc3Q8Q0JDX09uZURpbVdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKQotICAgICAgLT5SZW5kZXJSZXN1bHQocmVuZGVyQ29udGVudHMuQXNTdHJpbmdDKCksIGRhdGEsIG91dFdpZHRoLCBpc0RldmljZSwgZSk7Ci0gIEZYX0ZyZWUoZGF0YSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDQkNfQ29kZTM5OjpSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBDRlhfV2lkZVN0cmluZyByZW5kZXJDb24gPQotICAgICAgc3RhdGljX2Nhc3Q8Q0JDX09uZWRDb2RlMzlXcml0ZXIqPihtX3BCQ1dyaXRlci5nZXQoKSkKLSAgICAgICAgICAtPmVuY29kZWRDb250ZW50cyhtX3JlbmRlckNvbnRlbnRzLkFzU3RyaW5nQygpLCBlKTsKLSAgc3RhdGljX2Nhc3Q8Q0JDX09uZURpbVdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKQotICAgICAgLT5SZW5kZXJEZXZpY2VSZXN1bHQoZGV2aWNlLCBtYXRyaXgsIHJlbmRlckNvbi5Bc1N0cmluZ0MoKSwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDQkNfQ29kZTM5OjpSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSkgewotICBDRlhfV2lkZVN0cmluZyByZW5kZXJDb24gPQotICAgICAgc3RhdGljX2Nhc3Q8Q0JDX09uZWRDb2RlMzlXcml0ZXIqPihtX3BCQ1dyaXRlci5nZXQoKSkKLSAgICAgICAgICAtPmVuY29kZWRDb250ZW50cyhtX3JlbmRlckNvbnRlbnRzLkFzU3RyaW5nQygpLCBlKTsKLSAgc3RhdGljX2Nhc3Q8Q0JDX09uZURpbVdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKQotICAgICAgLT5SZW5kZXJCaXRtYXBSZXN1bHQocE91dEJpdG1hcCwgcmVuZGVyQ29uLkFzU3RyaW5nQygpLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1CQ19UWVBFIENCQ19Db2RlMzk6OkdldFR5cGUoKSB7Ci0gIHJldHVybiBCQ19DT0RFMzk7Ci19Ci0KLWJvb2wgQ0JDX0NvZGUzOTo6U2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKSB7Ci0gIGlmIChtX3BCQ1dyaXRlcikKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0JDX09uZWRDb2RlMzlXcml0ZXIqPihtX3BCQ1dyaXRlci5nZXQoKSkKLSAgICAgICAgLT5TZXRUZXh0TG9jYXRpb24obG9jYXRpb24pOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ0JDX0NvZGUzOTo6U2V0V2lkZU5hcnJvd1JhdGlvKGludDMyX3QgcmF0aW8pIHsKLSAgaWYgKG1fcEJDV3JpdGVyKQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxDQkNfT25lZENvZGUzOVdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKQotICAgICAgICAtPlNldFdpZGVOYXJyb3dSYXRpbyhyYXRpbyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvY2JjX2NvZGUzOS5oIGIveGZhL2Z4YmFyY29kZS9jYmNfY29kZTM5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNWM2MjcuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9jYmNfY29kZTM5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYQkFSQ09ERV9DQkNfQ09ERTM5X0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfQ0JDX0NPREUzOV9IXwotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9meF9kaWIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2NiY19vbmVjb2RlLmgiCi0KLWNsYXNzIENCQ19Db2RlMzkgOiBwdWJsaWMgQ0JDX09uZUNvZGUgewotIHB1YmxpYzoKLSAgQ0JDX0NvZGUzOSgpOwotICB+Q0JDX0NvZGUzOSgpIG92ZXJyaWRlOwotCi0gIC8vIENCQ19PbmVDb2RlOgotICBib29sIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLAotICAgICAgICAgICAgICBib29sIGlzRGV2aWNlLAotICAgICAgICAgICAgICBpbnQzMl90JiBlKSBvdmVycmlkZTsKLSAgYm9vbCBSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICBib29sIFJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLCBpbnQzMl90JiBlKSBvdmVycmlkZTsKLSAgQkNfVFlQRSBHZXRUeXBlKCkgb3ZlcnJpZGU7Ci0KLSAgYm9vbCBTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pOwotICBib29sIFNldFdpZGVOYXJyb3dSYXRpbyhpbnQzMl90IHJhdGlvKTsKLQotIHByaXZhdGU6Ci0gIENGWF9XaWRlU3RyaW5nIG1fcmVuZGVyQ29udGVudHM7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfQ0JDX0NPREUzOV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9jYmNfY29kZWJhc2UuY3BwIGIveGZhL2Z4YmFyY29kZS9jYmNfY29kZWJhc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjRjYjcxLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvY2JjX2NvZGViYXNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLS8qCi0gKiBDb3B5cmlnaHQgMjAxMSBaWGluZyBhdXRob3JzCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2NiY19jb2RlYmFzZS5oIgotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9CQ19Xcml0ZXIuaCIKLQotQ0JDX0NvZGVCYXNlOjpDQkNfQ29kZUJhc2UoQ0JDX1dyaXRlciogcFdyaXRlcikgOiBtX3BCQ1dyaXRlcihwV3JpdGVyKSB7fQotCi1DQkNfQ29kZUJhc2U6On5DQkNfQ29kZUJhc2UoKSB7fQotCi1ib29sIENCQ19Db2RlQmFzZTo6U2V0Q2hhckVuY29kaW5nKGludDMyX3QgZW5jb2RpbmcpIHsKLSAgcmV0dXJuIG1fcEJDV3JpdGVyICYmIG1fcEJDV3JpdGVyLT5TZXRDaGFyRW5jb2RpbmcoZW5jb2RpbmcpOwotfQotCi1ib29sIENCQ19Db2RlQmFzZTo6U2V0TW9kdWxlSGVpZ2h0KGludDMyX3QgbW9kdWxlSGVpZ2h0KSB7Ci0gIHJldHVybiBtX3BCQ1dyaXRlciAmJiBtX3BCQ1dyaXRlci0+U2V0TW9kdWxlSGVpZ2h0KG1vZHVsZUhlaWdodCk7Ci19Ci0KLWJvb2wgQ0JDX0NvZGVCYXNlOjpTZXRNb2R1bGVXaWR0aChpbnQzMl90IG1vZHVsZVdpZHRoKSB7Ci0gIHJldHVybiBtX3BCQ1dyaXRlciAmJiBtX3BCQ1dyaXRlci0+U2V0TW9kdWxlV2lkdGgobW9kdWxlV2lkdGgpOwotfQotCi1ib29sIENCQ19Db2RlQmFzZTo6U2V0SGVpZ2h0KGludDMyX3QgaGVpZ2h0KSB7Ci0gIHJldHVybiBtX3BCQ1dyaXRlciAmJiBtX3BCQ1dyaXRlci0+U2V0SGVpZ2h0KGhlaWdodCk7Ci19Ci0KLWJvb2wgQ0JDX0NvZGVCYXNlOjpTZXRXaWR0aChpbnQzMl90IHdpZHRoKSB7Ci0gIHJldHVybiBtX3BCQ1dyaXRlciAmJiBtX3BCQ1dyaXRlci0+U2V0V2lkdGgod2lkdGgpOwotfQotCi12b2lkIENCQ19Db2RlQmFzZTo6U2V0QmFja2dyb3VuZENvbG9yKEZYX0FSR0IgYmFja2dyb3VuZENvbG9yKSB7Ci0gIGlmIChtX3BCQ1dyaXRlcikKLSAgICBtX3BCQ1dyaXRlci0+U2V0QmFja2dyb3VuZENvbG9yKGJhY2tncm91bmRDb2xvcik7Ci19Ci0KLXZvaWQgQ0JDX0NvZGVCYXNlOjpTZXRCYXJjb2RlQ29sb3IoRlhfQVJHQiBmb3JlZ3JvdW5kQ29sb3IpIHsKLSAgaWYgKG1fcEJDV3JpdGVyKQotICAgIG1fcEJDV3JpdGVyLT5TZXRCYXJjb2RlQ29sb3IoZm9yZWdyb3VuZENvbG9yKTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvY2JjX2NvZGViYXNlLmggYi94ZmEvZnhiYXJjb2RlL2NiY19jb2RlYmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjhjMDhiLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvY2JjX2NvZGViYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYQkFSQ09ERV9DQkNfQ09ERUJBU0VfSF8KLSNkZWZpbmUgWEZBX0ZYQkFSQ09ERV9DQkNfQ09ERUJBU0VfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvQkNfTGlicmFyeS5oIgotCi1jbGFzcyBDQkNfV3JpdGVyOwotY2xhc3MgQ0JDX1JlYWRlcjsKLWNsYXNzIENGWF9ESUJpdG1hcDsKLWNsYXNzIENGWF9SZW5kZXJEZXZpY2U7Ci0KLWNsYXNzIENCQ19Db2RlQmFzZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDQkNfQ29kZUJhc2UoQ0JDX1dyaXRlciogcFdyaXRlcik7Ci0gIHZpcnR1YWwgfkNCQ19Db2RlQmFzZSgpOwotCi0gIHZpcnR1YWwgQkNfVFlQRSBHZXRUeXBlKCkgPSAwOwotICB2aXJ0dWFsIGJvb2wgRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSkgPSAwOwotCi0gIGJvb2wgU2V0Q2hhckVuY29kaW5nKGludDMyX3QgZW5jb2RpbmcpOwotICBib29sIFNldE1vZHVsZUhlaWdodChpbnQzMl90IG1vZHVsZUhlaWdodCk7Ci0gIGJvb2wgU2V0TW9kdWxlV2lkdGgoaW50MzJfdCBtb2R1bGVXaWR0aCk7Ci0gIGJvb2wgU2V0SGVpZ2h0KGludDMyX3QgaGVpZ2h0KTsKLSAgYm9vbCBTZXRXaWR0aChpbnQzMl90IHdpZHRoKTsKLSAgdm9pZCBTZXRCYWNrZ3JvdW5kQ29sb3IoRlhfQVJHQiBiYWNrZ3JvdW5kQ29sb3IpOwotICB2b2lkIFNldEJhcmNvZGVDb2xvcihGWF9BUkdCIGZvcmVncm91bmRDb2xvcik7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDQkNfV3JpdGVyPiBtX3BCQ1dyaXRlcjsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYQkFSQ09ERV9DQkNfQ09ERUJBU0VfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvY2JjX2RhdGFtYXRyaXguY3BwIGIveGZhL2Z4YmFyY29kZS9jYmNfZGF0YW1hdHJpeC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMjIzNjguLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9jYmNfZGF0YW1hdHJpeC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0vKgotICogQ29weXJpZ2h0IDIwMTEgWlhpbmcgYXV0aG9ycwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jYmNfZGF0YW1hdHJpeC5oIgotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhXcml0ZXIuaCIKLQotQ0JDX0RhdGFNYXRyaXg6OkNCQ19EYXRhTWF0cml4KCkgOiBDQkNfQ29kZUJhc2UobmV3IENCQ19EYXRhTWF0cml4V3JpdGVyKSB7fQotCi1DQkNfRGF0YU1hdHJpeDo6fkNCQ19EYXRhTWF0cml4KCkge30KLQotYm9vbCBDQkNfRGF0YU1hdHJpeDo6RW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGludDMyX3Qgb3V0V2lkdGggPSAwOwotICBpbnQzMl90IG91dEhlaWdodCA9IDA7Ci0gIHVpbnQ4X3QqIGRhdGEgPQotICAgICAgc3RhdGljX2Nhc3Q8Q0JDX0RhdGFNYXRyaXhXcml0ZXIqPihtX3BCQ1dyaXRlci5nZXQoKSkKLSAgICAgICAgICAtPkVuY29kZShDRlhfV2lkZVN0cmluZyhjb250ZW50cyksIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RhdGljX2Nhc3Q8Q0JDX1R3b0RpbVdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKQotICAgICAgLT5SZW5kZXJSZXN1bHQoZGF0YSwgb3V0V2lkdGgsIG91dEhlaWdodCwgZSk7Ci0gIEZYX0ZyZWUoZGF0YSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDQkNfRGF0YU1hdHJpeDo6UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBzdGF0aWNfY2FzdDxDQkNfVHdvRGltV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpCi0gICAgICAtPlJlbmRlckRldmljZVJlc3VsdChkZXZpY2UsIG1hdHJpeCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENCQ19EYXRhTWF0cml4OjpSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSkgewotICBzdGF0aWNfY2FzdDxDQkNfVHdvRGltV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpCi0gICAgICAtPlJlbmRlckJpdG1hcFJlc3VsdChwT3V0Qml0bWFwLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1CQ19UWVBFIENCQ19EYXRhTWF0cml4OjpHZXRUeXBlKCkgewotICByZXR1cm4gQkNfREFUQU1BVFJJWDsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvY2JjX2RhdGFtYXRyaXguaCBiL3hmYS9meGJhcmNvZGUvY2JjX2RhdGFtYXRyaXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxYjQ4ZC4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2NiY19kYXRhbWF0cml4LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYQkFSQ09ERV9DQkNfREFUQU1BVFJJWF9IXwotI2RlZmluZSBYRkFfRlhCQVJDT0RFX0NCQ19EQVRBTUFUUklYX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY2JjX2NvZGViYXNlLmgiCi0KLWNsYXNzIENCQ19EYXRhTWF0cml4IDogcHVibGljIENCQ19Db2RlQmFzZSB7Ci0gcHVibGljOgotICBDQkNfRGF0YU1hdHJpeCgpOwotICB+Q0JDX0RhdGFNYXRyaXgoKSBvdmVycmlkZTsKLQotICAvLyBDQkNfT25lQ29kZToKLSAgYm9vbCBFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywKLSAgICAgICAgICAgICAgYm9vbCBpc0RldmljZSwKLSAgICAgICAgICAgICAgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgUmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LAotICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSBvdmVycmlkZTsKLSAgYm9vbCBSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0gIEJDX1RZUEUgR2V0VHlwZSgpIG92ZXJyaWRlOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhCQVJDT0RFX0NCQ19EQVRBTUFUUklYX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2NiY19lYW4xMy5jcHAgYi94ZmEvZnhiYXJjb2RlL2NiY19lYW4xMy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MGZiYTAuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9jYmNfZWFuMTMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLyoKLSAqIENvcHlyaWdodCAyMDExIFpYaW5nIGF1dGhvcnMKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY2JjX2VhbjEzLmgiCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzV3JpdGVyLmgiCi0KLUNCQ19FQU4xMzo6Q0JDX0VBTjEzKCkgOiBDQkNfT25lQ29kZShuZXcgQ0JDX09uZWRFQU4xM1dyaXRlcikge30KLQotQ0JDX0VBTjEzOjp+Q0JDX0VBTjEzKCkge30KLQotQ0ZYX1dpZGVTdHJpbmcgQ0JDX0VBTjEzOjpQcmVwcm9jZXNzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlQ29udGVudHMgPQotICAgICAgc3RhdGljX2Nhc3Q8Q0JDX09uZWRFQU4xM1dyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKQotICAgICAgICAgIC0+RmlsdGVyQ29udGVudHMoY29udGVudHMpOwotICBpbnQzMl90IGxlbmd0aCA9IGVuY29kZUNvbnRlbnRzLkdldExlbmd0aCgpOwotICBpZiAobGVuZ3RoIDw9IDEyKSB7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMTIgLSBsZW5ndGg7IGkrKykKLSAgICAgIGVuY29kZUNvbnRlbnRzID0gRlhfV0NIQVIoJzAnKSArIGVuY29kZUNvbnRlbnRzOwotCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IGVuY29kZUNvbnRlbnRzLlVURjhFbmNvZGUoKTsKLSAgICBpbnQzMl90IGNoZWNrc3VtID0gc3RhdGljX2Nhc3Q8Q0JDX09uZWRFQU4xM1dyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5DYWxjQ2hlY2tzdW0oYnl0ZVN0cmluZyk7Ci0gICAgYnl0ZVN0cmluZyArPSBjaGVja3N1bSAtIDAgKyAnMCc7Ci0gICAgZW5jb2RlQ29udGVudHMgPSBieXRlU3RyaW5nLlVURjhEZWNvZGUoKTsKLSAgfQotICBpZiAobGVuZ3RoID4gMTMpCi0gICAgZW5jb2RlQ29udGVudHMgPSBlbmNvZGVDb250ZW50cy5NaWQoMCwgMTMpOwotCi0gIHJldHVybiBlbmNvZGVDb250ZW50czsKLX0KLQotYm9vbCBDQkNfRUFOMTM6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGlmIChjb250ZW50cy5Jc0VtcHR5KCkpIHsKLSAgICBlID0gQkNFeGNlcHRpb25Ob0NvbnRlbnRzOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBCQ0ZPUk1BVCBmb3JtYXQgPSBCQ0ZPUk1BVF9FQU5fMTM7Ci0gIGludDMyX3Qgb3V0V2lkdGggPSAwOwotICBpbnQzMl90IG91dEhlaWdodCA9IDA7Ci0gIENGWF9XaWRlU3RyaW5nIGVuY29kZUNvbnRlbnRzID0gUHJlcHJvY2Vzcyhjb250ZW50cyk7Ci0gIENGWF9CeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBlbmNvZGVDb250ZW50cy5VVEY4RW5jb2RlKCk7Ci0gIG1fcmVuZGVyQ29udGVudHMgPSBlbmNvZGVDb250ZW50czsKLSAgdWludDhfdCogZGF0YSA9IHN0YXRpY19jYXN0PENCQ19PbmVkRUFOMTNXcml0ZXIqPihtX3BCQ1dyaXRlci5nZXQoKSkKLSAgICAgICAgICAgICAgICAgICAgICAtPkVuY29kZShieXRlU3RyaW5nLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RhdGljX2Nhc3Q8Q0JDX09uZURpbVdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKQotICAgICAgLT5SZW5kZXJSZXN1bHQoZW5jb2RlQ29udGVudHMuQXNTdHJpbmdDKCksIGRhdGEsIG91dFdpZHRoLCBpc0RldmljZSwgZSk7Ci0gIEZYX0ZyZWUoZGF0YSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDQkNfRUFOMTM6OlJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBzdGF0aWNfY2FzdDxDQkNfT25lRGltV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpCi0gICAgICAtPlJlbmRlckRldmljZVJlc3VsdChkZXZpY2UsIG1hdHJpeCwgbV9yZW5kZXJDb250ZW50cy5Bc1N0cmluZ0MoKSwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDQkNfRUFOMTM6OlJlbmRlckJpdG1hcChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLCBpbnQzMl90JiBlKSB7Ci0gIHN0YXRpY19jYXN0PENCQ19PbmVEaW1Xcml0ZXIqPihtX3BCQ1dyaXRlci5nZXQoKSkKLSAgICAgIC0+UmVuZGVyQml0bWFwUmVzdWx0KHBPdXRCaXRtYXAsIG1fcmVuZGVyQ29udGVudHMuQXNTdHJpbmdDKCksIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUJDX1RZUEUgQ0JDX0VBTjEzOjpHZXRUeXBlKCkgewotICByZXR1cm4gQkNfRUFOMTM7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2NiY19lYW4xMy5oIGIveGZhL2Z4YmFyY29kZS9jYmNfZWFuMTMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBlNzk0MC4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2NiY19lYW4xMy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfQ0JDX0VBTjEzX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfQ0JDX0VBTjEzX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY2JjX29uZWNvZGUuaCIKLQotY2xhc3MgQ0JDX0VBTjEzIDogcHVibGljIENCQ19PbmVDb2RlIHsKLSBwdWJsaWM6Ci0gIENCQ19FQU4xMygpOwotICB+Q0JDX0VBTjEzKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ0JDX09uZUNvZGU6Ci0gIGJvb2wgRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsCi0gICAgICAgICAgICAgIGJvb2wgaXNEZXZpY2UsCi0gICAgICAgICAgICAgIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICBib29sIFJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgUmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcComIHBPdXRCaXRtYXAsIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICBCQ19UWVBFIEdldFR5cGUoKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIENGWF9XaWRlU3RyaW5nIFByZXByb2Nlc3MoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7Ci0gIENGWF9XaWRlU3RyaW5nIG1fcmVuZGVyQ29udGVudHM7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfQ0JDX0VBTjEzX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2NiY19lYW44LmNwcCBiL3hmYS9meGJhcmNvZGUvY2JjX2VhbjguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGJhNjE3Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvY2JjX2VhbjguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLyoKLSAqIENvcHlyaWdodCAyMDExIFpYaW5nIGF1dGhvcnMKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY2JjX2VhbjguaCIKLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFdyaXRlci5oIgotCi1DQkNfRUFOODo6Q0JDX0VBTjgoKSA6IENCQ19PbmVDb2RlKG5ldyBDQkNfT25lZEVBTjhXcml0ZXIpIHt9Ci0KLUNCQ19FQU44Ojp+Q0JDX0VBTjgoKSB7fQotCi1DRlhfV2lkZVN0cmluZyBDQkNfRUFOODo6UHJlcHJvY2Vzcyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7Ci0gIENGWF9XaWRlU3RyaW5nIGVuY29kZUNvbnRlbnRzID0KLSAgICAgIHN0YXRpY19jYXN0PENCQ19PbmVkRUFOOFdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKQotICAgICAgICAgIC0+RmlsdGVyQ29udGVudHMoY29udGVudHMpOwotICBpbnQzMl90IGxlbmd0aCA9IGVuY29kZUNvbnRlbnRzLkdldExlbmd0aCgpOwotICBpZiAobGVuZ3RoIDw9IDcpIHsKLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA3IC0gbGVuZ3RoOyBpKyspCi0gICAgICBlbmNvZGVDb250ZW50cyA9IEZYX1dDSEFSKCcwJykgKyBlbmNvZGVDb250ZW50czsKLQotICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBlbmNvZGVDb250ZW50cy5VVEY4RW5jb2RlKCk7Ci0gICAgaW50MzJfdCBjaGVja3N1bSA9IHN0YXRpY19jYXN0PENCQ19PbmVkRUFOOFdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5DYWxjQ2hlY2tzdW0oYnl0ZVN0cmluZyk7Ci0gICAgZW5jb2RlQ29udGVudHMgKz0gRlhfV0NIQVIoY2hlY2tzdW0gLSAwICsgJzAnKTsKLSAgfQotICBpZiAobGVuZ3RoID4gOCkKLSAgICBlbmNvZGVDb250ZW50cyA9IGVuY29kZUNvbnRlbnRzLk1pZCgwLCA4KTsKLQotICByZXR1cm4gZW5jb2RlQ29udGVudHM7Ci19Ci0KLWJvb2wgQ0JDX0VBTjg6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBpZiAoY29udGVudHMuSXNFbXB0eSgpKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uTm9Db250ZW50czsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQkNGT1JNQVQgZm9ybWF0ID0gQkNGT1JNQVRfRUFOXzg7Ci0gIGludDMyX3Qgb3V0V2lkdGggPSAwOwotICBpbnQzMl90IG91dEhlaWdodCA9IDA7Ci0gIENGWF9XaWRlU3RyaW5nIGVuY29kZUNvbnRlbnRzID0gUHJlcHJvY2Vzcyhjb250ZW50cyk7Ci0gIENGWF9CeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBlbmNvZGVDb250ZW50cy5VVEY4RW5jb2RlKCk7Ci0gIG1fcmVuZGVyQ29udGVudHMgPSBlbmNvZGVDb250ZW50czsKLSAgdWludDhfdCogZGF0YSA9IHN0YXRpY19jYXN0PENCQ19PbmVkRUFOOFdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKQotICAgICAgICAgICAgICAgICAgICAgIC0+RW5jb2RlKGJ5dGVTdHJpbmcsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIGZhbHNlOwotICBzdGF0aWNfY2FzdDxDQkNfT25lRGltV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpCi0gICAgICAtPlJlbmRlclJlc3VsdChlbmNvZGVDb250ZW50cy5Bc1N0cmluZ0MoKSwgZGF0YSwgb3V0V2lkdGgsIGlzRGV2aWNlLCBlKTsKLSAgRlhfRnJlZShkYXRhKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENCQ19FQU44OjpSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIHN0YXRpY19jYXN0PENCQ19PbmVEaW1Xcml0ZXIqPihtX3BCQ1dyaXRlci5nZXQoKSkKLSAgICAgIC0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0cml4LCBtX3JlbmRlckNvbnRlbnRzLkFzU3RyaW5nQygpLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENCQ19FQU44OjpSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSkgewotICBzdGF0aWNfY2FzdDxDQkNfT25lRGltV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpCi0gICAgICAtPlJlbmRlckJpdG1hcFJlc3VsdChwT3V0Qml0bWFwLCBtX3JlbmRlckNvbnRlbnRzLkFzU3RyaW5nQygpLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1CQ19UWVBFIENCQ19FQU44OjpHZXRUeXBlKCkgewotICByZXR1cm4gQkNfRUFOODsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvY2JjX2VhbjguaCBiL3hmYS9meGJhcmNvZGUvY2JjX2VhbjguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE0NzVjYi4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2NiY19lYW44LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYQkFSQ09ERV9DQkNfRUFOOF9IXwotI2RlZmluZSBYRkFfRlhCQVJDT0RFX0NCQ19FQU44X0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY2JjX29uZWNvZGUuaCIKLQotY2xhc3MgQ0JDX0VBTjggOiBwdWJsaWMgQ0JDX09uZUNvZGUgewotIHB1YmxpYzoKLSAgQ0JDX0VBTjgoKTsKLSAgfkNCQ19FQU44KCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ0JDX09uZUNvZGU6Ci0gIGJvb2wgRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsCi0gICAgICAgICAgICAgIGJvb2wgaXNEZXZpY2UsCi0gICAgICAgICAgICAgIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICBib29sIFJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgUmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcComIHBPdXRCaXRtYXAsIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICBCQ19UWVBFIEdldFR5cGUoKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIENGWF9XaWRlU3RyaW5nIFByZXByb2Nlc3MoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7Ci0gIENGWF9XaWRlU3RyaW5nIG1fcmVuZGVyQ29udGVudHM7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfQ0JDX0VBTjhfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvY2JjX29uZWNvZGUuY3BwIGIveGZhL2Z4YmFyY29kZS9jYmNfb25lY29kZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YzI4MzcuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9jYmNfb25lY29kZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0vKgotICogQ29weXJpZ2h0IDIwMTEgWlhpbmcgYXV0aG9ycwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jYmNfb25lY29kZS5oIgotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5oIgotCi1DQkNfT25lQ29kZTo6Q0JDX09uZUNvZGUoQ0JDX1dyaXRlciogcFdyaXRlcikgOiBDQkNfQ29kZUJhc2UocFdyaXRlcikge30KLQotQ0JDX09uZUNvZGU6On5DQkNfT25lQ29kZSgpIHt9Ci0KLWJvb2wgQ0JDX09uZUNvZGU6OkNoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsKLSAgcmV0dXJuIG1fcEJDV3JpdGVyICYmCi0gICAgICAgICBzdGF0aWNfY2FzdDxDQkNfT25lRGltV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpCi0gICAgICAgICAgICAgLT5DaGVja0NvbnRlbnRWYWxpZGl0eShjb250ZW50cyk7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENCQ19PbmVDb2RlOjpGaWx0ZXJDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7Ci0gIGlmICghbV9wQkNXcml0ZXIpCi0gICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxDQkNfT25lRGltV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpCi0gICAgICAtPkZpbHRlckNvbnRlbnRzKGNvbnRlbnRzKTsKLX0KLQotdm9pZCBDQkNfT25lQ29kZTo6U2V0UHJpbnRDaGVja3N1bShib29sIGNoZWNrc3VtKSB7Ci0gIGlmIChtX3BCQ1dyaXRlcikKLSAgICBzdGF0aWNfY2FzdDxDQkNfT25lRGltV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpCi0gICAgICAgIC0+U2V0UHJpbnRDaGVja3N1bShjaGVja3N1bSk7Ci19Ci0KLXZvaWQgQ0JDX09uZUNvZGU6OlNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpIHsKLSAgaWYgKG1fcEJDV3JpdGVyKQotICAgIHN0YXRpY19jYXN0PENCQ19PbmVEaW1Xcml0ZXIqPihtX3BCQ1dyaXRlci5nZXQoKSktPlNldERhdGFMZW5ndGgobGVuZ3RoKTsKLX0KLQotdm9pZCBDQkNfT25lQ29kZTo6U2V0Q2FsQ2hlY2tzdW0oYm9vbCBjYWxjKSB7Ci0gIGlmIChtX3BCQ1dyaXRlcikKLSAgICBzdGF0aWNfY2FzdDxDQkNfT25lRGltV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpLT5TZXRDYWxjQ2hlY2tzdW0oY2FsYyk7Ci19Ci0KLWJvb2wgQ0JDX09uZUNvZGU6OlNldEZvbnQoQ0ZYX0ZvbnQqIGNGb250KSB7Ci0gIGlmIChtX3BCQ1dyaXRlcikKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0JDX09uZURpbVdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKS0+U2V0Rm9udChjRm9udCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBDQkNfT25lQ29kZTo6U2V0Rm9udFNpemUoRlhfRkxPQVQgc2l6ZSkgewotICBpZiAobV9wQkNXcml0ZXIpCi0gICAgc3RhdGljX2Nhc3Q8Q0JDX09uZURpbVdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKS0+U2V0Rm9udFNpemUoc2l6ZSk7Ci19Ci0KLXZvaWQgQ0JDX09uZUNvZGU6OlNldEZvbnRTdHlsZShpbnQzMl90IHN0eWxlKSB7Ci0gIGlmIChtX3BCQ1dyaXRlcikKLSAgICBzdGF0aWNfY2FzdDxDQkNfT25lRGltV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpLT5TZXRGb250U3R5bGUoc3R5bGUpOwotfQotCi12b2lkIENCQ19PbmVDb2RlOjpTZXRGb250Q29sb3IoRlhfQVJHQiBjb2xvcikgewotICBpZiAobV9wQkNXcml0ZXIpCi0gICAgc3RhdGljX2Nhc3Q8Q0JDX09uZURpbVdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKS0+U2V0Rm9udENvbG9yKGNvbG9yKTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvY2JjX29uZWNvZGUuaCBiL3hmYS9meGJhcmNvZGUvY2JjX29uZWNvZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0OGI0ZS4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2NiY19vbmVjb2RlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYQkFSQ09ERV9DQkNfT05FQ09ERV9IXwotI2RlZmluZSBYRkFfRlhCQVJDT0RFX0NCQ19PTkVDT0RFX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jYmNfY29kZWJhc2UuaCIKLQotY2xhc3MgQ0ZYX0RJQml0bWFwOwotY2xhc3MgQ0ZYX0ZvbnQ7Ci1jbGFzcyBDRlhfUmVuZGVyRGV2aWNlOwotCi1jbGFzcyBDQkNfT25lQ29kZSA6IHB1YmxpYyBDQkNfQ29kZUJhc2UgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0JDX09uZUNvZGUoQ0JDX1dyaXRlciogcFdyaXRlcik7Ci0gIH5DQkNfT25lQ29kZSgpIG92ZXJyaWRlOwotCi0gIHZpcnR1YWwgYm9vbCBDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsKLSAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBGaWx0ZXJDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsKLQotICB2aXJ0dWFsIHZvaWQgU2V0UHJpbnRDaGVja3N1bShib29sIGNoZWNrc3VtKTsKLSAgdmlydHVhbCB2b2lkIFNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpOwotICB2aXJ0dWFsIHZvaWQgU2V0Q2FsQ2hlY2tzdW0oYm9vbCBjYWxjKTsKLSAgdmlydHVhbCBib29sIFNldEZvbnQoQ0ZYX0ZvbnQqIGNGb250KTsKLSAgdmlydHVhbCB2b2lkIFNldEZvbnRTaXplKEZYX0ZMT0FUIHNpemUpOwotICB2aXJ0dWFsIHZvaWQgU2V0Rm9udFN0eWxlKGludDMyX3Qgc3R5bGUpOwotICB2aXJ0dWFsIHZvaWQgU2V0Rm9udENvbG9yKEZYX0FSR0IgY29sb3IpOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhCQVJDT0RFX0NCQ19PTkVDT0RFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2NiY19wZGY0MTdpLmNwcCBiL3hmYS9meGJhcmNvZGUvY2JjX3BkZjQxN2kuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzU1NDdkLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvY2JjX3BkZjQxN2kuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLyoKLSAqIENvcHlyaWdodCAyMDExIFpYaW5nIGF1dGhvcnMKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY2JjX3BkZjQxN2kuaCIKLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1dyaXRlci5oIgotCi1DQkNfUERGNDE3STo6Q0JDX1BERjQxN0koKSA6IENCQ19Db2RlQmFzZShuZXcgQ0JDX1BERjQxN1dyaXRlcikge30KLQotQ0JDX1BERjQxN0k6On5DQkNfUERGNDE3SSgpIHt9Ci0KLWJvb2wgQ0JDX1BERjQxN0k6OlNldEVycm9yQ29ycmVjdGlvbkxldmVsKGludDMyX3QgbGV2ZWwpIHsKLSAgc3RhdGljX2Nhc3Q8Q0JDX1BERjQxN1dyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKQotICAgICAgLT5TZXRFcnJvckNvcnJlY3Rpb25MZXZlbChsZXZlbCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIENCQ19QREY0MTdJOjpTZXRUcnVuY2F0ZWQoYm9vbCB0cnVuY2F0ZWQpIHsKLSAgc3RhdGljX2Nhc3Q8Q0JDX1BERjQxN1dyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKS0+U2V0VHJ1bmNhdGVkKHRydW5jYXRlZCk7Ci19Ci0KLWJvb2wgQ0JDX1BERjQxN0k6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBpbnQzMl90IG91dFdpZHRoID0gMDsKLSAgaW50MzJfdCBvdXRIZWlnaHQgPSAwOwotICB1aW50OF90KiBkYXRhID0KLSAgICAgIHN0YXRpY19jYXN0PENCQ19QREY0MTdXcml0ZXIqPihtX3BCQ1dyaXRlci5nZXQoKSkKLSAgICAgICAgICAtPkVuY29kZShDRlhfV2lkZVN0cmluZyhjb250ZW50cyksIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBmYWxzZTsKLSAgc3RhdGljX2Nhc3Q8Q0JDX1R3b0RpbVdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKQotICAgICAgLT5SZW5kZXJSZXN1bHQoZGF0YSwgb3V0V2lkdGgsIG91dEhlaWdodCwgZSk7Ci0gIEZYX0ZyZWUoZGF0YSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDQkNfUERGNDE3STo6UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBzdGF0aWNfY2FzdDxDQkNfVHdvRGltV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpCi0gICAgICAtPlJlbmRlckRldmljZVJlc3VsdChkZXZpY2UsIG1hdHJpeCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENCQ19QREY0MTdJOjpSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSkgewotICBzdGF0aWNfY2FzdDxDQkNfVHdvRGltV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpCi0gICAgICAtPlJlbmRlckJpdG1hcFJlc3VsdChwT3V0Qml0bWFwLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1CQ19UWVBFIENCQ19QREY0MTdJOjpHZXRUeXBlKCkgewotICByZXR1cm4gQkNfUERGNDE3OwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9jYmNfcGRmNDE3aS5oIGIveGZhL2Z4YmFyY29kZS9jYmNfcGRmNDE3aS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGVhOTI5Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvY2JjX3BkZjQxN2kuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhCQVJDT0RFX0NCQ19QREY0MTdJX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfQ0JDX1BERjQxN0lfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jYmNfY29kZWJhc2UuaCIKLQotY2xhc3MgQ0JDX1BERjQxN0kgOiBwdWJsaWMgQ0JDX0NvZGVCYXNlIHsKLSBwdWJsaWM6Ci0gIENCQ19QREY0MTdJKCk7Ci0gIH5DQkNfUERGNDE3SSgpIG92ZXJyaWRlOwotCi0gIC8vIENCQ19Db2RlQmFzZTo6Ci0gIGJvb2wgRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsCi0gICAgICAgICAgICAgIGJvb2wgaXNEZXZpY2UsCi0gICAgICAgICAgICAgIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICBib29sIFJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgUmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcComIHBPdXRCaXRtYXAsIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICBCQ19UWVBFIEdldFR5cGUoKSBvdmVycmlkZTsKLQotICBib29sIFNldEVycm9yQ29ycmVjdGlvbkxldmVsKGludDMyX3QgbGV2ZWwpOwotICB2b2lkIFNldFRydW5jYXRlZChib29sIHRydW5jYXRlZCk7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfQ0JDX1BERjQxN0lfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvY2JjX3FyY29kZS5jcHAgYi94ZmEvZnhiYXJjb2RlL2NiY19xcmNvZGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmI3NGNhLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvY2JjX3FyY29kZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0vKgotICogQ29weXJpZ2h0IDIwMTEgWlhpbmcgYXV0aG9ycwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jYmNfcXJjb2RlLmgiCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVXcml0ZXIuaCIKLQotQ0JDX1FSQ29kZTo6Q0JDX1FSQ29kZSgpIDogQ0JDX0NvZGVCYXNlKG5ldyBDQkNfUVJDb2RlV3JpdGVyKSB7fQotCi1DQkNfUVJDb2RlOjp+Q0JDX1FSQ29kZSgpIHt9Ci0KLWJvb2wgQ0JDX1FSQ29kZTo6U2V0VmVyc2lvbihpbnQzMl90IHZlcnNpb24pIHsKLSAgaWYgKHZlcnNpb24gPCAwIHx8IHZlcnNpb24gPiA0MCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiBtX3BCQ1dyaXRlciAmJgotICAgICAgICAgc3RhdGljX2Nhc3Q8Q0JDX1FSQ29kZVdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKS0+U2V0VmVyc2lvbih2ZXJzaW9uKTsKLX0KLQotYm9vbCBDQkNfUVJDb2RlOjpTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGxldmVsKSB7Ci0gIGlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPiAzKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gbV9wQkNXcml0ZXIgJiYKLSAgICAgICAgIHN0YXRpY19jYXN0PENCQ19Ud29EaW1Xcml0ZXIqPihtX3BCQ1dyaXRlci5nZXQoKSkKLSAgICAgICAgICAgICAtPlNldEVycm9yQ29ycmVjdGlvbkxldmVsKGxldmVsKTsKLX0KLQotYm9vbCBDQkNfUVJDb2RlOjpFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGludDMyX3Qgb3V0V2lkdGggPSAwOwotICBpbnQzMl90IG91dEhlaWdodCA9IDA7Ci0gIENCQ19RUkNvZGVXcml0ZXIqIHBXcml0ZXIgPSBzdGF0aWNfY2FzdDxDQkNfUVJDb2RlV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpOwotICB1aW50OF90KiBkYXRhID0gcFdyaXRlci0+RW5jb2RlKENGWF9XaWRlU3RyaW5nKGNvbnRlbnRzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV3JpdGVyLT5HZXRFcnJvckNvcnJlY3Rpb25MZXZlbCgpLCBvdXRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRIZWlnaHQsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBmYWxzZTsKLSAgcFdyaXRlci0+UmVuZGVyUmVzdWx0KGRhdGEsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOwotICBGWF9GcmVlKGRhdGEpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0JDX1FSQ29kZTo6UmVuZGVyRGV2aWNlKENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgc3RhdGljX2Nhc3Q8Q0JDX1R3b0RpbVdyaXRlcio+KG1fcEJDV3JpdGVyLmdldCgpKQotICAgICAgLT5SZW5kZXJEZXZpY2VSZXN1bHQoZGV2aWNlLCBtYXRyaXgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDQkNfUVJDb2RlOjpSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSkgewotICBzdGF0aWNfY2FzdDxDQkNfVHdvRGltV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpCi0gICAgICAtPlJlbmRlckJpdG1hcFJlc3VsdChwT3V0Qml0bWFwLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1CQ19UWVBFIENCQ19RUkNvZGU6OkdldFR5cGUoKSB7Ci0gIHJldHVybiBCQ19RUl9DT0RFOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9jYmNfcXJjb2RlLmggYi94ZmEvZnhiYXJjb2RlL2NiY19xcmNvZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMyZDkzZC4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2NiY19xcmNvZGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhCQVJDT0RFX0NCQ19RUkNPREVfSF8KLSNkZWZpbmUgWEZBX0ZYQkFSQ09ERV9DQkNfUVJDT0RFX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY2JjX2NvZGViYXNlLmgiCi0KLWNsYXNzIENCQ19RUkNvZGUgOiBwdWJsaWMgQ0JDX0NvZGVCYXNlIHsKLSBwdWJsaWM6Ci0gIENCQ19RUkNvZGUoKTsKLSAgfkNCQ19RUkNvZGUoKSBvdmVycmlkZTsKLQotICAvLyBDQkNfQ29kZUJhc2U6Ci0gIGJvb2wgRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsCi0gICAgICAgICAgICAgIGJvb2wgaXNEZXZpY2UsCi0gICAgICAgICAgICAgIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICBib29sIFJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgUmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcComIHBPdXRCaXRtYXAsIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICBCQ19UWVBFIEdldFR5cGUoKSBvdmVycmlkZTsKLQotICBib29sIFNldFZlcnNpb24oaW50MzJfdCB2ZXJzaW9uKTsKLSAgYm9vbCBTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGxldmVsKTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYQkFSQ09ERV9DQkNfUVJDT0RFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2NiY191cGNhLmNwcCBiL3hmYS9meGJhcmNvZGUvY2JjX3VwY2EuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjgyZDVjLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvY2JjX3VwY2EuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLyoKLSAqIENvcHlyaWdodCAyMDExIFpYaW5nIGF1dGhvcnMKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY2JjX3VwY2EuaCIKLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkVVBDQVdyaXRlci5oIgotCi1DQkNfVVBDQTo6Q0JDX1VQQ0EoKSA6IENCQ19PbmVDb2RlKG5ldyBDQkNfT25lZFVQQ0FXcml0ZXIpIHt9Ci0KLUNCQ19VUENBOjp+Q0JDX1VQQ0EoKSB7fQotCi1DRlhfV2lkZVN0cmluZyBDQkNfVVBDQTo6UHJlcHJvY2Vzcyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7Ci0gIENCQ19PbmVkVVBDQVdyaXRlciogcFdyaXRlciA9Ci0gICAgICBzdGF0aWNfY2FzdDxDQkNfT25lZFVQQ0FXcml0ZXIqPihtX3BCQ1dyaXRlci5nZXQoKSk7Ci0gIENGWF9XaWRlU3RyaW5nIGVuY29kZUNvbnRlbnRzID0gcFdyaXRlci0+RmlsdGVyQ29udGVudHMoY29udGVudHMpOwotICBpbnQzMl90IGxlbmd0aCA9IGVuY29kZUNvbnRlbnRzLkdldExlbmd0aCgpOwotICBpZiAobGVuZ3RoIDw9IDExKSB7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMTEgLSBsZW5ndGg7IGkrKykKLSAgICAgIGVuY29kZUNvbnRlbnRzID0gRlhfV0NIQVIoJzAnKSArIGVuY29kZUNvbnRlbnRzOwotCi0gICAgQ0ZYX0J5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IGVuY29kZUNvbnRlbnRzLlVURjhFbmNvZGUoKTsKLSAgICBpbnQzMl90IGNoZWNrc3VtID0gcFdyaXRlci0+Q2FsY0NoZWNrc3VtKGJ5dGVTdHJpbmcpOwotICAgIGJ5dGVTdHJpbmcgKz0gY2hlY2tzdW0gLSAwICsgJzAnOwotICAgIGVuY29kZUNvbnRlbnRzID0gYnl0ZVN0cmluZy5VVEY4RGVjb2RlKCk7Ci0gIH0KLSAgaWYgKGxlbmd0aCA+IDEyKQotICAgIGVuY29kZUNvbnRlbnRzID0gZW5jb2RlQ29udGVudHMuTWlkKDAsIDEyKTsKLQotICByZXR1cm4gZW5jb2RlQ29udGVudHM7Ci19Ci0KLWJvb2wgQ0JDX1VQQ0E6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBpZiAoY29udGVudHMuSXNFbXB0eSgpKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uTm9Db250ZW50czsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQkNGT1JNQVQgZm9ybWF0ID0gQkNGT1JNQVRfVVBDX0E7Ci0gIGludDMyX3Qgb3V0V2lkdGggPSAwOwotICBpbnQzMl90IG91dEhlaWdodCA9IDA7Ci0gIENGWF9XaWRlU3RyaW5nIGVuY29kZUNvbnRlbnRzID0gUHJlcHJvY2Vzcyhjb250ZW50cyk7Ci0gIENGWF9CeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBlbmNvZGVDb250ZW50cy5VVEY4RW5jb2RlKCk7Ci0gIG1fcmVuZGVyQ29udGVudHMgPSBlbmNvZGVDb250ZW50czsKLQotICBDQkNfT25lZFVQQ0FXcml0ZXIqIHBXcml0ZXIgPQotICAgICAgc3RhdGljX2Nhc3Q8Q0JDX09uZWRVUENBV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpOwotCi0gIHBXcml0ZXItPkluaXQoKTsKLSAgdWludDhfdCogZGF0YSA9IHBXcml0ZXItPkVuY29kZShieXRlU3RyaW5nLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBmYWxzZTsKLSAgcFdyaXRlci0+UmVuZGVyUmVzdWx0KGVuY29kZUNvbnRlbnRzLkFzU3RyaW5nQygpLCBkYXRhLCBvdXRXaWR0aCwgaXNEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgRlhfRnJlZShkYXRhKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENCQ19VUENBOjpSZW5kZXJEZXZpY2UoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIHN0YXRpY19jYXN0PENCQ19PbmVEaW1Xcml0ZXIqPihtX3BCQ1dyaXRlci5nZXQoKSkKLSAgICAgIC0+UmVuZGVyRGV2aWNlUmVzdWx0KGRldmljZSwgbWF0cml4LCBtX3JlbmRlckNvbnRlbnRzLkFzU3RyaW5nQygpLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENCQ19VUENBOjpSZW5kZXJCaXRtYXAoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwgaW50MzJfdCYgZSkgewotICBzdGF0aWNfY2FzdDxDQkNfT25lRGltV3JpdGVyKj4obV9wQkNXcml0ZXIuZ2V0KCkpCi0gICAgICAtPlJlbmRlckJpdG1hcFJlc3VsdChwT3V0Qml0bWFwLCBtX3JlbmRlckNvbnRlbnRzLkFzU3RyaW5nQygpLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1CQ19UWVBFIENCQ19VUENBOjpHZXRUeXBlKCkgewotICByZXR1cm4gQkNfVVBDQTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvY2JjX3VwY2EuaCBiL3hmYS9meGJhcmNvZGUvY2JjX3VwY2EuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY5MGI5Mi4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2NiY191cGNhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYQkFSQ09ERV9DQkNfVVBDQV9IXwotI2RlZmluZSBYRkFfRlhCQVJDT0RFX0NCQ19VUENBX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY2JjX29uZWNvZGUuaCIKLQotY2xhc3MgQ0JDX1VQQ0EgOiBwdWJsaWMgQ0JDX09uZUNvZGUgewotIHB1YmxpYzoKLSAgQ0JDX1VQQ0EoKTsKLSAgfkNCQ19VUENBKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ0JDX0NvZGVCYXNlCi0gIGJvb2wgRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsCi0gICAgICAgICAgICAgIGJvb2wgaXNEZXZpY2UsCi0gICAgICAgICAgICAgIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICBib29sIFJlbmRlckRldmljZShDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgUmVuZGVyQml0bWFwKENGWF9ESUJpdG1hcComIHBPdXRCaXRtYXAsIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICBCQ19UWVBFIEdldFR5cGUoKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIENGWF9XaWRlU3RyaW5nIFByZXByb2Nlc3MoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7Ci0gIENGWF9XaWRlU3RyaW5nIG1fcmVuZGVyQ29udGVudHM7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfQ0JDX1VQQ0FfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmNwcCBiL3hmYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM3MTgzNy4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRBcnJheS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgotLyoKLSAqIENvcHlyaWdodCAyMDA3IFpYaW5nIGF1dGhvcnMKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS91dGlscy5oIgotCi1DQkNfQ29tbW9uQml0QXJyYXk6OkNCQ19Db21tb25CaXRBcnJheShDQkNfQ29tbW9uQml0QXJyYXkqIGFycmF5KSB7Ci0gIG1fc2l6ZSA9IGFycmF5LT5HZXRTaXplKCk7Ci0gIG1fYml0cy5Db3B5KGFycmF5LT5HZXRCaXRzKCkpOwotfQotQ0JDX0NvbW1vbkJpdEFycmF5OjpDQkNfQ29tbW9uQml0QXJyYXkoKSB7Ci0gIG1fYml0cy5TZXRTaXplKDEpOwotICBtX3NpemUgPSAwOwotfQotQ0JDX0NvbW1vbkJpdEFycmF5OjpDQkNfQ29tbW9uQml0QXJyYXkoaW50MzJfdCBzaXplKSB7Ci0gIG1fYml0cy5TZXRTaXplKChzaXplICsgMzEpID4+IDUpOwotICBtX3NpemUgPSBzaXplOwotfQotQ0JDX0NvbW1vbkJpdEFycmF5Ojp+Q0JDX0NvbW1vbkJpdEFycmF5KCkgewotICBtX3NpemUgPSAwOwotfQotaW50MzJfdCBDQkNfQ29tbW9uQml0QXJyYXk6OkdldFNpemUoKSB7Ci0gIHJldHVybiBtX3NpemU7Ci19Ci1DRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiYgQ0JDX0NvbW1vbkJpdEFycmF5OjpHZXRCaXRzKCkgewotICByZXR1cm4gbV9iaXRzOwotfQotaW50MzJfdCBDQkNfQ29tbW9uQml0QXJyYXk6OkdldFNpemVJbkJ5dGVzKCkgewotICByZXR1cm4gKG1fc2l6ZSArIDcpID4+IDM7Ci19Ci1ib29sIENCQ19Db21tb25CaXRBcnJheTo6R2V0KGludDMyX3QgaSkgewotICByZXR1cm4gKG1fYml0c1tpID4+IDVdICYgKDEgPDwgKGkgJiAweDFmKSkpICE9IDA7Ci19Ci12b2lkIENCQ19Db21tb25CaXRBcnJheTo6U2V0KGludDMyX3QgaSkgewotICBtX2JpdHNbaSA+PiA1XSB8PSAxIDw8IChpICYgMHgxRik7Ci19Ci12b2lkIENCQ19Db21tb25CaXRBcnJheTo6RmxpcChpbnQzMl90IGkpIHsKLSAgbV9iaXRzW2kgPj4gNV0gXj0gMSA8PCAoaSAmIDB4MUYpOwotfQotdm9pZCBDQkNfQ29tbW9uQml0QXJyYXk6OlNldEJ1bGsoaW50MzJfdCBpLCBpbnQzMl90IG5ld0JpdHMpIHsKLSAgbV9iaXRzW2kgPj4gNV0gPSBuZXdCaXRzOwotfQotdm9pZCBDQkNfQ29tbW9uQml0QXJyYXk6OkNsZWFyKCkgewotICBGWFNZU19tZW1zZXQoJm1fYml0c1swXSwgMHgwMCwgbV9iaXRzLkdldFNpemUoKSAqIHNpemVvZihpbnQzMl90KSk7Ci19Ci1ib29sIENCQ19Db21tb25CaXRBcnJheTo6SXNSYW5nZShpbnQzMl90IHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBpZiAoZW5kIDwgc3RhcnQpIHsKLSAgICBlID0gQkNFeGNlcHRpb25FbmRMZXNzVGhhblN0YXJ0OwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoZW5kID09IHN0YXJ0KSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgZW5kLS07Ci0gIGludDMyX3QgZmlyc3RJbnQgPSBzdGFydCA+PiA1OwotICBpbnQzMl90IGxhc3RJbnQgPSBlbmQgPj4gNTsKLSAgaW50MzJfdCBpOwotICBmb3IgKGkgPSBmaXJzdEludDsgaSA8PSBsYXN0SW50OyBpKyspIHsKLSAgICBpbnQzMl90IGZpcnN0Qml0ID0gaSA+IGZpcnN0SW50ID8gMCA6IHN0YXJ0ICYgMHgxRjsKLSAgICBpbnQzMl90IGxhc3RCaXQgPSBpIDwgbGFzdEludCA/IDMxIDogZW5kICYgMHgxRjsKLSAgICBpbnQzMl90IG1hc2s7Ci0gICAgaWYgKGZpcnN0Qml0ID09IDAgJiYgbGFzdEJpdCA9PSAzMSkgewotICAgICAgbWFzayA9IC0xOwotICAgIH0gZWxzZSB7Ci0gICAgICBtYXNrID0gMDsKLSAgICAgIGZvciAoaW50MzJfdCBqID0gZmlyc3RCaXQ7IGogPD0gbGFzdEJpdDsgaisrKSB7Ci0gICAgICAgIG1hc2sgfD0gMSA8PCBqOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoKG1fYml0c1tpXSAmIG1hc2spICE9ICh2YWx1ZSA/IG1hc2sgOiAwKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLWludDMyX3QqIENCQ19Db21tb25CaXRBcnJheTo6R2V0Qml0QXJyYXkoKSB7Ci0gIHJldHVybiAmbV9iaXRzWzBdOwotfQotdm9pZCBDQkNfQ29tbW9uQml0QXJyYXk6OlJldmVyc2UoKSB7Ci0gIGludDMyX3QqIG5ld0JpdHMgPSBGWF9BbGxvYyhpbnQzMl90LCBtX2JpdHMuR2V0U2l6ZSgpKTsKLSAgRlhTWVNfbWVtc2V0KG5ld0JpdHMsIDB4MDAsIG1fYml0cy5HZXRTaXplKCkgKiBzaXplb2YoaW50MzJfdCkpOwotICBpbnQzMl90IHNpemUgPSBtX3NpemU7Ci0gIGludDMyX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgIGlmIChHZXQoc2l6ZSAtIGkgLSAxKSkgewotICAgICAgbmV3Qml0c1tpID4+IDVdIHw9IDEgPDwgKGkgJiAweDFGKTsKLSAgICB9Ci0gIH0KLSAgRlhTWVNfbWVtY3B5KCZtX2JpdHNbMF0sIG5ld0JpdHMsIG1fYml0cy5HZXRTaXplKCkgKiBzaXplb2YoaW50MzJfdCkpOwotICBGWF9GcmVlKG5ld0JpdHMpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0QXJyYXkuaCBiL3hmYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhZDhhYjMuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0QXJyYXkuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhCQVJDT0RFX0NPTU1PTl9CQ19DT01NT05CSVRBUlJBWV9IXwotI2RlZmluZSBYRkFfRlhCQVJDT0RFX0NPTU1PTl9CQ19DT01NT05CSVRBUlJBWV9IXwotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgotCi1jbGFzcyBDQkNfQ29tbW9uQml0QXJyYXkgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0JDX0NvbW1vbkJpdEFycmF5KENCQ19Db21tb25CaXRBcnJheSogYXJyYXkpOwotICBleHBsaWNpdCBDQkNfQ29tbW9uQml0QXJyYXkoaW50MzJfdCBzaXplKTsKLSAgQ0JDX0NvbW1vbkJpdEFycmF5KCk7Ci0gIHZpcnR1YWwgfkNCQ19Db21tb25CaXRBcnJheSgpOwotCi0gIGludDMyX3QgR2V0U2l6ZSgpOwotICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiYgR2V0Qml0cygpOwotICBpbnQzMl90IEdldFNpemVJbkJ5dGVzKCk7Ci0gIGJvb2wgR2V0KGludDMyX3QgaSk7Ci0gIHZvaWQgU2V0KGludDMyX3QgaSk7Ci0gIHZvaWQgRmxpcChpbnQzMl90IGkpOwotICB2b2lkIFNldEJ1bGsoaW50MzJfdCBpLCBpbnQzMl90IG5ld0JpdHMpOwotICBib29sIElzUmFuZ2UoaW50MzJfdCBzdGFydCwgaW50MzJfdCBlbmQsIGJvb2wgdmFsdWUsIGludDMyX3QmIGUpOwotICBpbnQzMl90KiBHZXRCaXRBcnJheSgpOwotICB2b2lkIFJldmVyc2UoKTsKLSAgdm9pZCBDbGVhcigpOwotCi0gcHJpdmF0ZToKLSAgaW50MzJfdCBtX3NpemU7Ci0gIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+IG1fYml0czsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYQkFSQ09ERV9DT01NT05fQkNfQ09NTU9OQklUQVJSQVlfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5jcHAgYi94ZmEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWIyMThjLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgotLyoKLSAqIENvcHlyaWdodCAyMDA3IFpYaW5nIGF1dGhvcnMKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS91dGlscy5oIgotCi1DQkNfQ29tbW9uQml0TWF0cml4OjpDQkNfQ29tbW9uQml0TWF0cml4KCkgewotICBtX3dpZHRoID0gMDsKLSAgbV9oZWlnaHQgPSAwOwotICBtX3Jvd1NpemUgPSAwOwotICBtX2JpdHMgPSBudWxscHRyOwotfQotdm9pZCBDQkNfQ29tbW9uQml0TWF0cml4OjpJbml0KGludDMyX3QgZGltZW5zaW9uKSB7Ci0gIG1fd2lkdGggPSBkaW1lbnNpb247Ci0gIG1faGVpZ2h0ID0gZGltZW5zaW9uOwotICBpbnQzMl90IHJvd1NpemUgPSAobV9oZWlnaHQgKyAzMSkgPj4gNTsKLSAgbV9yb3dTaXplID0gcm93U2l6ZTsKLSAgbV9iaXRzID0gRlhfQWxsb2MyRChpbnQzMl90LCBtX3Jvd1NpemUsIG1faGVpZ2h0KTsKLSAgRlhTWVNfbWVtc2V0KG1fYml0cywgMCwgbV9yb3dTaXplICogbV9oZWlnaHQgKiBzaXplb2YoaW50MzJfdCkpOwotfQotdm9pZCBDQkNfQ29tbW9uQml0TWF0cml4OjpJbml0KGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7Ci0gIG1fd2lkdGggPSB3aWR0aDsKLSAgbV9oZWlnaHQgPSBoZWlnaHQ7Ci0gIGludDMyX3Qgcm93U2l6ZSA9ICh3aWR0aCArIDMxKSA+PiA1OwotICBtX3Jvd1NpemUgPSByb3dTaXplOwotICBtX2JpdHMgPSBGWF9BbGxvYzJEKGludDMyX3QsIG1fcm93U2l6ZSwgbV9oZWlnaHQpOwotICBGWFNZU19tZW1zZXQobV9iaXRzLCAwLCBtX3Jvd1NpemUgKiBtX2hlaWdodCAqIHNpemVvZihpbnQzMl90KSk7Ci19Ci1DQkNfQ29tbW9uQml0TWF0cml4Ojp+Q0JDX0NvbW1vbkJpdE1hdHJpeCgpIHsKLSAgRlhfRnJlZShtX2JpdHMpOwotfQotYm9vbCBDQkNfQ29tbW9uQml0TWF0cml4OjpHZXQoaW50MzJfdCB4LCBpbnQzMl90IHkpIHsKLSAgaW50MzJfdCBvZmZzZXQgPSB5ICogbV9yb3dTaXplICsgKHggPj4gNSk7Ci0gIGlmIChvZmZzZXQgPj0gbV9yb3dTaXplICogbV9oZWlnaHQgfHwgb2Zmc2V0IDwgMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gKCgoKHVpbnQzMl90KW1fYml0c1tvZmZzZXRdKSA+PiAoeCAmIDB4MWYpKSAmIDEpICE9IDA7Ci19Ci1pbnQzMl90KiBDQkNfQ29tbW9uQml0TWF0cml4OjpHZXRCaXRzKCkgewotICByZXR1cm4gbV9iaXRzOwotfQotdm9pZCBDQkNfQ29tbW9uQml0TWF0cml4OjpTZXQoaW50MzJfdCB4LCBpbnQzMl90IHkpIHsKLSAgaW50MzJfdCBvZmZzZXQgPSB5ICogbV9yb3dTaXplICsgKHggPj4gNSk7Ci0gIGlmIChvZmZzZXQgPj0gbV9yb3dTaXplICogbV9oZWlnaHQgfHwgb2Zmc2V0IDwgMCkgewotICAgIHJldHVybjsKLSAgfQotICBtX2JpdHNbb2Zmc2V0XSB8PSAxIDw8ICh4ICYgMHgxZik7Ci19Ci12b2lkIENCQ19Db21tb25CaXRNYXRyaXg6OkZsaXAoaW50MzJfdCB4LCBpbnQzMl90IHkpIHsKLSAgaW50MzJfdCBvZmZzZXQgPSB5ICogbV9yb3dTaXplICsgKHggPj4gNSk7Ci0gIG1fYml0c1tvZmZzZXRdIF49IDEgPDwgKHggJiAweDFmKTsKLX0KLXZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6Q2xlYXIoKSB7Ci0gIEZYU1lTX21lbXNldChtX2JpdHMsIDAsIG1fcm93U2l6ZSAqIG1faGVpZ2h0ICogc2l6ZW9mKGludDMyX3QpKTsKLX0KLXZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6U2V0UmVnaW9uKGludDMyX3QgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBpZiAodG9wIDwgMCB8fCBsZWZ0IDwgMCkgewotICAgIGUgPSBCQ0V4Y2VwdGlvbkxlZnRBbmRUb3BNdXN0QmVOb25uZWdhdGl2ZTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGhlaWdodCA8IDEgfHwgd2lkdGggPCAxKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uSGVpZ2h0QW5kV2lkdGhNdXN0QmVBdExlYXN0MTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50MzJfdCByaWdodCA9IGxlZnQgKyB3aWR0aDsKLSAgaW50MzJfdCBib3R0b20gPSB0b3AgKyBoZWlnaHQ7Ci0gIGlmIChtX2hlaWdodCA8IGJvdHRvbSB8fCBtX3dpZHRoIDwgcmlnaHQpIHsKLSAgICBlID0gQkNFeGNlcHRpb25SZWdpb25NdXN0Rml0SW5zaWRlTWF0cml4OwotICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IHk7Ci0gIGZvciAoeSA9IHRvcDsgeSA8IGJvdHRvbTsgeSsrKSB7Ci0gICAgaW50MzJfdCBvZmZzZXQgPSB5ICogbV9yb3dTaXplOwotICAgIGludDMyX3QgeDsKLSAgICBmb3IgKHggPSBsZWZ0OyB4IDwgcmlnaHQ7IHgrKykgewotICAgICAgbV9iaXRzW29mZnNldCArICh4ID4+IDUpXSB8PSAxIDw8ICh4ICYgMHgxZik7Ci0gICAgfQotICB9Ci19Ci1DQkNfQ29tbW9uQml0QXJyYXkqIENCQ19Db21tb25CaXRNYXRyaXg6OkdldFJvdyhpbnQzMl90IHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQml0QXJyYXkqIHJvdykgewotICBDQkNfQ29tbW9uQml0QXJyYXkqIHJvd0FycmF5ID0gbnVsbHB0cjsKLSAgaWYgKCFyb3cgfHwgcm93LT5HZXRTaXplKCkgPCBtX3dpZHRoKSB7Ci0gICAgcm93QXJyYXkgPSBuZXcgQ0JDX0NvbW1vbkJpdEFycmF5KG1fd2lkdGgpOwotICB9IGVsc2UgewotICAgIHJvd0FycmF5ID0gbmV3IENCQ19Db21tb25CaXRBcnJheShyb3cpOwotICB9Ci0gIGludDMyX3Qgb2Zmc2V0ID0geSAqIG1fcm93U2l6ZTsKLSAgaW50MzJfdCB4OwotICBmb3IgKHggPSAwOyB4IDwgbV9yb3dTaXplOyB4KyspIHsKLSAgICByb3dBcnJheS0+U2V0QnVsayh4IDw8IDUsIG1fYml0c1tvZmZzZXQgKyB4XSk7Ci0gIH0KLSAgcmV0dXJuIHJvd0FycmF5OwotfQotdm9pZCBDQkNfQ29tbW9uQml0TWF0cml4OjpTZXRSb3coaW50MzJfdCB5LCBDQkNfQ29tbW9uQml0QXJyYXkqIHJvdykgewotICBpbnQzMl90IGwgPSB5ICogbV9yb3dTaXplOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX3Jvd1NpemU7IGkrKykgewotICAgIG1fYml0c1tsXSA9IHJvdy0+R2V0Qml0QXJyYXkoKVtpXTsKLSAgICBsKys7Ci0gIH0KLX0KLXZvaWQgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6U2V0Q29sKGludDMyX3QgeSwgQ0JDX0NvbW1vbkJpdEFycmF5KiBjb2wpIHsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29sLT5HZXRCaXRzKCkuR2V0U2l6ZSgpOyBpKyspIHsKLSAgICBtX2JpdHNbaSAqIG1fcm93U2l6ZSArIHldID0gY29sLT5HZXRCaXRBcnJheSgpW2ldOwotICB9Ci19Ci1pbnQzMl90IENCQ19Db21tb25CaXRNYXRyaXg6OkdldFdpZHRoKCkgewotICByZXR1cm4gbV93aWR0aDsKLX0KLWludDMyX3QgQ0JDX0NvbW1vbkJpdE1hdHJpeDo6R2V0SGVpZ2h0KCkgewotICByZXR1cm4gbV9oZWlnaHQ7Ci19Ci1pbnQzMl90IENCQ19Db21tb25CaXRNYXRyaXg6OkdldFJvd1NpemUoKSB7Ci0gIHJldHVybiBtX3Jvd1NpemU7Ci19Ci1pbnQzMl90IENCQ19Db21tb25CaXRNYXRyaXg6OkdldERpbWVuc2lvbihpbnQzMl90JiBlKSB7Ci0gIGlmIChtX3dpZHRoICE9IG1faGVpZ2h0KSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uQ2FuTm90Q2FsbEdldERpbWVuc2lvbk9uTm9uU3F1YXJlTWF0cml4OwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBtX3dpZHRoOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmggYi94ZmEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQxZjY4NC4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaAorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhCQVJDT0RFX0NPTU1PTl9CQ19DT01NT05CSVRNQVRSSVhfSF8KLSNkZWZpbmUgWEZBX0ZYQkFSQ09ERV9DT01NT05fQkNfQ09NTU9OQklUTUFUUklYX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotCi1jbGFzcyBDQkNfQ29tbW9uQml0QXJyYXk7Ci0KLWNsYXNzIENCQ19Db21tb25CaXRNYXRyaXggewotIHB1YmxpYzoKLSAgQ0JDX0NvbW1vbkJpdE1hdHJpeCgpOwotICB2aXJ0dWFsIH5DQkNfQ29tbW9uQml0TWF0cml4KCk7Ci0KLSAgdmlydHVhbCB2b2lkIEluaXQoaW50MzJfdCBkaW1lbnNpb24pOwotICB2aXJ0dWFsIHZvaWQgSW5pdChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7Ci0KLSAgYm9vbCBHZXQoaW50MzJfdCB4LCBpbnQzMl90IHkpOwotICB2b2lkIFNldChpbnQzMl90IHgsIGludDMyX3QgeSk7Ci0gIHZvaWQgRmxpcChpbnQzMl90IHgsIGludDMyX3QgeSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgdm9pZCBTZXRSZWdpb24oaW50MzJfdCBsZWZ0LAotICAgICAgICAgICAgICAgICBpbnQzMl90IHRvcCwKLSAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotICBDQkNfQ29tbW9uQml0QXJyYXkqIEdldFJvdyhpbnQzMl90IHksIENCQ19Db21tb25CaXRBcnJheSogcm93KTsKLSAgdm9pZCBTZXRSb3coaW50MzJfdCB5LCBDQkNfQ29tbW9uQml0QXJyYXkqIHJvdyk7Ci0gIENCQ19Db21tb25CaXRBcnJheSogR2V0Q29sKGludDMyX3QgeSwgQ0JDX0NvbW1vbkJpdEFycmF5KiByb3cpOwotICB2b2lkIFNldENvbChpbnQzMl90IHksIENCQ19Db21tb25CaXRBcnJheSogY29sKTsKLSAgaW50MzJfdCBHZXRXaWR0aCgpOwotICBpbnQzMl90IEdldEhlaWdodCgpOwotICBpbnQzMl90IEdldFJvd1NpemUoKTsKLSAgaW50MzJfdCBHZXREaW1lbnNpb24oaW50MzJfdCYgZSk7Ci0gIGludDMyX3QqIEdldEJpdHMoKTsKLQotIHByaXZhdGU6Ci0gIGludDMyX3QgbV93aWR0aDsKLSAgaW50MzJfdCBtX2hlaWdodDsKLSAgaW50MzJfdCBtX3Jvd1NpemU7Ci0gIGludDMyX3QqIG1fYml0czsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYQkFSQ09ERV9DT01NT05fQkNfQ09NTU9OQklUTUFUUklYX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlQXJyYXkuY3BwIGIveGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZUFycmF5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUwZWNiMC4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlQXJyYXkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgotLyoKLSAqIENvcHlyaWdodCAyMDA4IFpYaW5nIGF1dGhvcnMKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVBcnJheS5oIgotCi1DQkNfQ29tbW9uQnl0ZUFycmF5OjpDQkNfQ29tbW9uQnl0ZUFycmF5KCkgewotICBtX2J5dGVzID0gbnVsbHB0cjsKLSAgbV9zaXplID0gMDsKLSAgbV9pbmRleCA9IDA7Ci19Ci1DQkNfQ29tbW9uQnl0ZUFycmF5OjpDQkNfQ29tbW9uQnl0ZUFycmF5KGludDMyX3Qgc2l6ZSkgewotICBtX3NpemUgPSBzaXplOwotICBtX2J5dGVzID0gRlhfQWxsb2ModWludDhfdCwgc2l6ZSk7Ci0gIEZYU1lTX21lbXNldChtX2J5dGVzLCAwLCBzaXplKTsKLSAgbV9pbmRleCA9IDA7Ci19Ci1DQkNfQ29tbW9uQnl0ZUFycmF5OjpDQkNfQ29tbW9uQnl0ZUFycmF5KHVpbnQ4X3QqIGJ5dGVBcnJheSwgaW50MzJfdCBzaXplKSB7Ci0gIG1fc2l6ZSA9IHNpemU7Ci0gIG1fYnl0ZXMgPSBGWF9BbGxvYyh1aW50OF90LCBzaXplKTsKLSAgRlhTWVNfbWVtY3B5KG1fYnl0ZXMsIGJ5dGVBcnJheSwgc2l6ZSk7Ci0gIG1faW5kZXggPSBzaXplOwotfQotQ0JDX0NvbW1vbkJ5dGVBcnJheTo6fkNCQ19Db21tb25CeXRlQXJyYXkoKSB7Ci0gIEZYX0ZyZWUobV9ieXRlcyk7Ci19Ci1pbnQzMl90IENCQ19Db21tb25CeXRlQXJyYXk6OkF0KGludDMyX3QgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fYnl0ZXNbaW5kZXhdICYgMHhmZjsKLX0KLXZvaWQgQ0JDX0NvbW1vbkJ5dGVBcnJheTo6U2V0KGludDMyX3QgaW5kZXgsIGludDMyX3QgdmFsdWUpIHsKLSAgbV9ieXRlc1tpbmRleF0gPSAodWludDhfdCl2YWx1ZTsKLX0KLWludDMyX3QgQ0JDX0NvbW1vbkJ5dGVBcnJheTo6U2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fc2l6ZTsKLX0KLWJvb2wgQ0JDX0NvbW1vbkJ5dGVBcnJheTo6SXNFbXB0eSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fc2l6ZSA9PSAwOwotfQotdm9pZCBDQkNfQ29tbW9uQnl0ZUFycmF5OjpBcHBlbmRCeXRlKGludDMyX3QgdmFsdWUpIHsKLSAgaWYgKG1fc2l6ZSA9PSAwIHx8IG1faW5kZXggPj0gbV9zaXplKSB7Ci0gICAgaW50MzJfdCBuZXdTaXplID0gc3RkOjptYXgoMzIsIG1fc2l6ZSA8PCAxKTsKLSAgICBSZXNlcnZlKG5ld1NpemUpOwotICB9Ci0gIG1fYnl0ZXNbbV9pbmRleF0gPSAodWludDhfdCl2YWx1ZTsKLSAgbV9pbmRleCsrOwotfQotdm9pZCBDQkNfQ29tbW9uQnl0ZUFycmF5OjpSZXNlcnZlKGludDMyX3QgY2FwYWNpdHkpIHsKLSAgaWYgKCFtX2J5dGVzIHx8IG1fc2l6ZSA8IGNhcGFjaXR5KSB7Ci0gICAgdWludDhfdCogbmV3QXJyYXkgPSBGWF9BbGxvYyh1aW50OF90LCBjYXBhY2l0eSk7Ci0gICAgaWYgKG1fYnl0ZXMpIHsKLSAgICAgIEZYU1lTX21lbWNweShuZXdBcnJheSwgbV9ieXRlcywgbV9zaXplKTsKLSAgICAgIEZYU1lTX21lbXNldChuZXdBcnJheSArIG1fc2l6ZSwgMCwgY2FwYWNpdHkgLSBtX3NpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBGWFNZU19tZW1zZXQobmV3QXJyYXksIDAsIGNhcGFjaXR5KTsKLSAgICB9Ci0gICAgRlhfRnJlZShtX2J5dGVzKTsKLSAgICBtX2J5dGVzID0gbmV3QXJyYXk7Ci0gICAgbV9zaXplID0gY2FwYWNpdHk7Ci0gIH0KLX0KLXZvaWQgQ0JDX0NvbW1vbkJ5dGVBcnJheTo6U2V0KHVpbnQ4X3QqIHNvdXJjZSwgaW50MzJfdCBvZmZzZXQsIGludDMyX3QgY291bnQpIHsKLSAgRlhfRnJlZShtX2J5dGVzKTsKLSAgbV9ieXRlcyA9IEZYX0FsbG9jKHVpbnQ4X3QsIGNvdW50KTsKLSAgbV9zaXplID0gY291bnQ7Ci0gIEZYU1lTX21lbWNweShtX2J5dGVzLCBzb3VyY2UgKyBvZmZzZXQsIGNvdW50KTsKLSAgbV9pbmRleCA9IGNvdW50OwotfQotdm9pZCBDQkNfQ29tbW9uQnl0ZUFycmF5OjpTZXQoQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdD4qIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCkgewotICBGWF9GcmVlKG1fYnl0ZXMpOwotICBtX2J5dGVzID0gRlhfQWxsb2ModWludDhfdCwgY291bnQpOwotICBtX3NpemUgPSBjb3VudDsKLSAgaW50MzJfdCBpOwotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgIG1fYnl0ZXNbaV0gPSBzb3VyY2UtPm9wZXJhdG9yW10oaSArIG9mZnNldCk7Ci0gIH0KLSAgbV9pbmRleCA9IG1fc2l6ZTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVBcnJheS5oIGIveGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZUFycmF5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwOWY2MjUuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZUFycmF5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYQkFSQ09ERV9DT01NT05fQkNfQ09NTU9OQllURUFSUkFZX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfQ09NTU9OX0JDX0NPTU1PTkJZVEVBUlJBWV9IXwotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgotCi0vLyBUT0RPKHdlaWxpKTogVGhlIHVzYWdlIG9mIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5Ci0vLyBzdGQ6OnZlY3Rvcjx1aW50OF90Pi4KLWNsYXNzIENCQ19Db21tb25CeXRlQXJyYXkgewotIHB1YmxpYzoKLSAgQ0JDX0NvbW1vbkJ5dGVBcnJheSgpOwotICBleHBsaWNpdCBDQkNfQ29tbW9uQnl0ZUFycmF5KGludDMyX3Qgc2l6ZSk7Ci0gIENCQ19Db21tb25CeXRlQXJyYXkodWludDhfdCogYnl0ZUFycmF5LCBpbnQzMl90IHNpemUpOwotICB2aXJ0dWFsIH5DQkNfQ29tbW9uQnl0ZUFycmF5KCk7Ci0KLSAgaW50MzJfdCBBdChpbnQzMl90IGluZGV4KSBjb25zdDsKLSAgaW50MzJfdCBTaXplKCkgY29uc3Q7Ci0gIGJvb2wgSXNFbXB0eSgpIGNvbnN0OwotICB2b2lkIFNldChpbnQzMl90IGluZGV4LCBpbnQzMl90IHZhbHVlKTsKLSAgdm9pZCBBcHBlbmRCeXRlKGludDMyX3QgdmFsdWUpOwotICB2b2lkIFJlc2VydmUoaW50MzJfdCBjYXBhY2l0eSk7Ci0gIHZvaWQgU2V0KHVpbnQ4X3QqIHNvdXJjZSwgaW50MzJfdCBvZmZzZXQsIGludDMyX3QgY291bnQpOwotICB2b2lkIFNldChDRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90Piogc291cmNlLCBpbnQzMl90IG9mZnNldCwgaW50MzJfdCBjb3VudCk7Ci0KLSBwcml2YXRlOgotICBpbnQzMl90IG1fc2l6ZTsKLSAgaW50MzJfdCBtX2luZGV4OwotICB1aW50OF90KiBtX2J5dGVzOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhCQVJDT0RFX0NPTU1PTl9CQ19DT01NT05CWVRFQVJSQVlfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVNYXRyaXguY3BwIGIveGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlN2NlODAuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0vLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6Ci0vKgotICogQ29weXJpZ2h0IDIwMDggWlhpbmcgYXV0aG9ycwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9tZW1vcnkuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlTWF0cml4LmgiCi0KLUNCQ19Db21tb25CeXRlTWF0cml4OjpDQkNfQ29tbW9uQnl0ZU1hdHJpeChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgewotICBtX2hlaWdodCA9IGhlaWdodDsKLSAgbV93aWR0aCA9IHdpZHRoOwotICBtX2J5dGVzID0gbnVsbHB0cjsKLX0KLXZvaWQgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6OkluaXQoKSB7Ci0gIG1fYnl0ZXMgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIG1faGVpZ2h0LCBtX3dpZHRoKTsKLSAgRlhTWVNfbWVtc2V0KG1fYnl0ZXMsIDB4ZmYsIG1faGVpZ2h0ICogbV93aWR0aCk7Ci19Ci1DQkNfQ29tbW9uQnl0ZU1hdHJpeDo6fkNCQ19Db21tb25CeXRlTWF0cml4KCkgewotICBGWF9GcmVlKG1fYnl0ZXMpOwotfQotaW50MzJfdCBDQkNfQ29tbW9uQnl0ZU1hdHJpeDo6R2V0SGVpZ2h0KCkgewotICByZXR1cm4gbV9oZWlnaHQ7Ci19Ci1pbnQzMl90IENCQ19Db21tb25CeXRlTWF0cml4OjpHZXRXaWR0aCgpIHsKLSAgcmV0dXJuIG1fd2lkdGg7Ci19Ci11aW50OF90IENCQ19Db21tb25CeXRlTWF0cml4OjpHZXQoaW50MzJfdCB4LCBpbnQzMl90IHkpIHsKLSAgcmV0dXJuIG1fYnl0ZXNbeSAqIG1fd2lkdGggKyB4XTsKLX0KLXZvaWQgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6OlNldChpbnQzMl90IHgsIGludDMyX3QgeSwgaW50MzJfdCB2YWx1ZSkgewotICBtX2J5dGVzW3kgKiBtX3dpZHRoICsgeF0gPSAodWludDhfdCl2YWx1ZTsKLX0KLXZvaWQgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6OlNldChpbnQzMl90IHgsIGludDMyX3QgeSwgdWludDhfdCB2YWx1ZSkgewotICBtX2J5dGVzW3kgKiBtX3dpZHRoICsgeF0gPSB2YWx1ZTsKLX0KLXZvaWQgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg6OmNsZWFyKHVpbnQ4X3QgdmFsdWUpIHsKLSAgaW50MzJfdCB5OwotICBmb3IgKHkgPSAwOyB5IDwgbV9oZWlnaHQ7IHkrKykgewotICAgIGludDMyX3QgeDsKLSAgICBmb3IgKHggPSAwOyB4IDwgbV93aWR0aDsgeCsrKSB7Ci0gICAgICBtX2J5dGVzW3kgKiBtX3dpZHRoICsgeF0gPSB2YWx1ZTsKLSAgICB9Ci0gIH0KLX0KLXVpbnQ4X3QqIENCQ19Db21tb25CeXRlTWF0cml4OjpHZXRBcnJheSgpIHsKLSAgcmV0dXJuIG1fYnl0ZXM7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlTWF0cml4LmggYi94ZmEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlTWF0cml4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzY2Y1YzMuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfQ09NTU9OX0JDX0NPTU1PTkJZVEVNQVRSSVhfSF8KLSNkZWZpbmUgWEZBX0ZYQkFSQ09ERV9DT01NT05fQkNfQ09NTU9OQllURU1BVFJJWF9IXwotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotCi1jbGFzcyBDQkNfQ29tbW9uQnl0ZU1hdHJpeCB7Ci0gcHVibGljOgotICBDQkNfQ29tbW9uQnl0ZU1hdHJpeChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCk7Ci0gIHZpcnR1YWwgfkNCQ19Db21tb25CeXRlTWF0cml4KCk7Ci0KLSAgaW50MzJfdCBHZXRIZWlnaHQoKTsKLSAgaW50MzJfdCBHZXRXaWR0aCgpOwotICB1aW50OF90IEdldChpbnQzMl90IHgsIGludDMyX3QgeSk7Ci0gIHVpbnQ4X3QqIEdldEFycmF5KCk7Ci0KLSAgdm9pZCBTZXQoaW50MzJfdCB4LCBpbnQzMl90IHksIGludDMyX3QgdmFsdWUpOwotICB2b2lkIFNldChpbnQzMl90IHgsIGludDMyX3QgeSwgdWludDhfdCB2YWx1ZSk7Ci0gIHZvaWQgY2xlYXIodWludDhfdCB2YWx1ZSk7Ci0gIHZpcnR1YWwgdm9pZCBJbml0KCk7Ci0KLSBwcml2YXRlOgotICB1aW50OF90KiBtX2J5dGVzOwotICBpbnQzMl90IG1fd2lkdGg7Ci0gIGludDMyX3QgbV9oZWlnaHQ7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfQ09NTU9OX0JDX0NPTU1PTkJZVEVNQVRSSVhfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uLmNwcCBiL3hmYS9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5ODg5MC4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgotLyoKLSAqIENvcHlyaWdodCAyMDA3IFpYaW5nIGF1dGhvcnMKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uLmgiCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuaCIKLQotQ0JDX1JlZWRTb2xvbW9uRW5jb2Rlcjo6Q0JDX1JlZWRTb2xvbW9uRW5jb2RlcihDQkNfUmVlZFNvbG9tb25HRjI1NiogZmllbGQpIHsKLSAgbV9maWVsZCA9IGZpZWxkOwotfQotdm9pZCBDQkNfUmVlZFNvbG9tb25FbmNvZGVyOjpJbml0KCkgewotICBtX2NhY2hlZEdlbmVyYXRvcnMuQWRkKG5ldyBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkobV9maWVsZCwgMSkpOwotfQotQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBDQkNfUmVlZFNvbG9tb25FbmNvZGVyOjpCdWlsZEdlbmVyYXRvcihpbnQzMl90IGRlZ3JlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBpZiAoZGVncmVlID49IG1fY2FjaGVkR2VuZXJhdG9ycy5HZXRTaXplKCkpIHsKLSAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIGxhc3RHZW5lcmF0b3IgPQotICAgICAgICBtX2NhY2hlZEdlbmVyYXRvcnNbbV9jYWNoZWRHZW5lcmF0b3JzLkdldFNpemUoKSAtIDFdOwotICAgIGZvciAoaW50MzJfdCBkID0gbV9jYWNoZWRHZW5lcmF0b3JzLkdldFNpemUoKTsgZCA8PSBkZWdyZWU7IGQrKykgewotICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4gdGVtcDsKLSAgICAgIHRlbXAuQWRkKDEpOwotICAgICAgdGVtcC5BZGQobV9maWVsZC0+RXhwKGQgLSAxKSk7Ci0gICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkgdGVtcF9wb2x5OwotICAgICAgdGVtcF9wb2x5LkluaXQobV9maWVsZCwgJnRlbXAsIGUpOwotICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIG5leHRHZW5lcmF0b3IgPQotICAgICAgICAgIGxhc3RHZW5lcmF0b3ItPk11bHRpcGx5KCZ0ZW1wX3BvbHksIGUpOwotICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICBtX2NhY2hlZEdlbmVyYXRvcnMuQWRkKG5leHRHZW5lcmF0b3IpOwotICAgICAgbGFzdEdlbmVyYXRvciA9IG5leHRHZW5lcmF0b3I7Ci0gICAgfQotICB9Ci0gIHJldHVybiBtX2NhY2hlZEdlbmVyYXRvcnNbZGVncmVlXTsKLX0KLXZvaWQgQ0JDX1JlZWRTb2xvbW9uRW5jb2Rlcjo6RW5jb2RlKENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+KiB0b0VuY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZWNCeXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgaWYgKGVjQnl0ZXMgPT0gMCkgewotICAgIGUgPSBCQ0V4Y2VwdGlvbk5vQ29ycmVjdGlvbkJ5dGVzOwotICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IGRhdGFCeXRlcyA9IHRvRW5jb2RlLT5HZXRTaXplKCkgLSBlY0J5dGVzOwotICBpZiAoZGF0YUJ5dGVzIDw9IDApIHsKLSAgICBlID0gQkNFeGNlcHRpb25Ob0RhdGFCeXRlc1Byb3ZpZGVkOwotICAgIHJldHVybjsKLSAgfQotICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIGdlbmVyYXRvciA9IEJ1aWxkR2VuZXJhdG9yKGVjQnl0ZXMsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybjsKLSAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4gaW5mb0NvZWZmaWNpZW50czsKLSAgaW5mb0NvZWZmaWNpZW50cy5TZXRTaXplKGRhdGFCeXRlcyk7Ci0gIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IGRhdGFCeXRlczsgeCsrKSB7Ci0gICAgaW5mb0NvZWZmaWNpZW50c1t4XSA9IHRvRW5jb2RlLT5vcGVyYXRvcltdKHgpOwotICB9Ci0gIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSBpbmZvOwotICBpbmZvLkluaXQobV9maWVsZCwgJmluZm9Db2VmZmljaWVudHMsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybjsKLSAgc3RkOjp1bmlxdWVfcHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gaW5mb1RlbXAoCi0gICAgICBpbmZvLk11bHRpcGx5QnlNb25vbWlhbChlY0J5dGVzLCAxLCBlKSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0FycmF5VGVtcGxhdGU8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5Kj4+IHRlbXAoCi0gICAgICBpbmZvVGVtcC0+RGl2aWRlKGdlbmVyYXRvciwgZSkpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybjsKLSAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiByZW1haW5kZXIgPSAoKnRlbXApWzFdOwotICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiogY29lZmZpY2llbnRzID0gcmVtYWluZGVyLT5HZXRDb2VmZmljaWVudHMoKTsKLSAgaW50MzJfdCBudW1aZXJvQ29lZmZpY2llbnRzID0gZWNCeXRlcyAtIGNvZWZmaWNpZW50cy0+R2V0U2l6ZSgpOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1aZXJvQ29lZmZpY2llbnRzOyBpKyspIHsKLSAgICAoKnRvRW5jb2RlKVtkYXRhQnl0ZXMgKyBpXSA9IDA7Ci0gIH0KLSAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgY29lZmZpY2llbnRzLT5HZXRTaXplKCk7IHkrKykgewotICAgICgqdG9FbmNvZGUpW2RhdGFCeXRlcyArIG51bVplcm9Db2VmZmljaWVudHMgKyB5XSA9Ci0gICAgICAgIGNvZWZmaWNpZW50cy0+b3BlcmF0b3JbXSh5KTsKLSAgfQotICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCB0ZW1wLT5HZXRTaXplKCk7IGsrKykgewotICAgIGRlbGV0ZSAoKnRlbXApW2tdOwotICB9Ci19Ci1DQkNfUmVlZFNvbG9tb25FbmNvZGVyOjp+Q0JDX1JlZWRTb2xvbW9uRW5jb2RlcigpIHsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9jYWNoZWRHZW5lcmF0b3JzLkdldFNpemUoKTsgaSsrKQotICAgIGRlbGV0ZSBtX2NhY2hlZEdlbmVyYXRvcnNbaV07Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbi5oIGIveGZhL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4MjhmMS4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfQ09NTU9OX1JFRURTT0xPTU9OX0JDX1JFRURTT0xPTU9OX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfQ09NTU9OX1JFRURTT0xPTU9OX0JDX1JFRURTT0xPTU9OX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0KLWNsYXNzIENCQ19SZWVkU29sb21vbkdGMjU2OwotY2xhc3MgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OwotCi1jbGFzcyBDQkNfUmVlZFNvbG9tb25FbmNvZGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENCQ19SZWVkU29sb21vbkVuY29kZXIoQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIGZpZWxkKTsKLSAgdmlydHVhbCB+Q0JDX1JlZWRTb2xvbW9uRW5jb2RlcigpOwotCi0gIHZvaWQgRW5jb2RlKENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+KiB0b0VuY29kZSwKLSAgICAgICAgICAgICAgaW50MzJfdCBlY0J5dGVzLAotICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgdmlydHVhbCB2b2lkIEluaXQoKTsKLQotIHByaXZhdGU6Ci0gIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogQnVpbGRHZW5lcmF0b3IoaW50MzJfdCBkZWdyZWUsIGludDMyX3QmIGUpOwotCi0gIENCQ19SZWVkU29sb21vbkdGMjU2KiBtX2ZpZWxkOwotICBDRlhfQXJyYXlUZW1wbGF0ZTxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqPiBtX2NhY2hlZEdlbmVyYXRvcnM7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfQ09NTU9OX1JFRURTT0xPTU9OX0JDX1JFRURTT0xPTU9OX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2LmNwcCBiL3hmYS9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTYuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTg0ZDhlLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTYuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLS8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2LmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuaCIKLQotQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIENCQ19SZWVkU29sb21vbkdGMjU2OjpRUkNvZGVGaWVsZCA9IG51bGxwdHI7Ci1DQkNfUmVlZFNvbG9tb25HRjI1NiogQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkRhdGFNYXRyaXhGaWVsZCA9IG51bGxwdHI7Ci0KLXZvaWQgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkluaXRpYWxpemUoKSB7Ci0gIFFSQ29kZUZpZWxkID0gbmV3IENCQ19SZWVkU29sb21vbkdGMjU2KDB4MDExRCk7Ci0gIFFSQ29kZUZpZWxkLT5Jbml0KCk7Ci0gIERhdGFNYXRyaXhGaWVsZCA9IG5ldyBDQkNfUmVlZFNvbG9tb25HRjI1NigweDAxMkQpOwotICBEYXRhTWF0cml4RmllbGQtPkluaXQoKTsKLX0KLQotdm9pZCBDQkNfUmVlZFNvbG9tb25HRjI1Njo6RmluYWxpemUoKSB7Ci0gIGRlbGV0ZSBRUkNvZGVGaWVsZDsKLSAgUVJDb2RlRmllbGQgPSBudWxscHRyOwotICBkZWxldGUgRGF0YU1hdHJpeEZpZWxkOwotICBEYXRhTWF0cml4RmllbGQgPSBudWxscHRyOwotfQotCi1DQkNfUmVlZFNvbG9tb25HRjI1Njo6Q0JDX1JlZWRTb2xvbW9uR0YyNTYoaW50MzJfdCBwcmltaXRpdmUpIHsKLSAgaW50MzJfdCB4ID0gMTsKLSAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgMjU2OyBqKyspIHsKLSAgICBtX2V4cFRhYmxlW2pdID0geDsKLSAgICB4IDw8PSAxOwotICAgIGlmICh4ID49IDB4MTAwKSB7Ci0gICAgICB4IF49IHByaW1pdGl2ZTsKLSAgICB9Ci0gIH0KLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMjU1OyBpKyspIHsKLSAgICBtX2xvZ1RhYmxlW21fZXhwVGFibGVbaV1dID0gaTsKLSAgfQotICBtX2xvZ1RhYmxlWzBdID0gMDsKLX0KLQotdm9pZCBDQkNfUmVlZFNvbG9tb25HRjI1Njo6SW5pdCgpIHsKLSAgbV96ZXJvID0gcGRmaXVtOjpNYWtlVW5pcXVlPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4odGhpcywgMCk7Ci0gIG1fb25lID0gcGRmaXVtOjpNYWtlVW5pcXVlPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4odGhpcywgMSk7Ci19Ci0KLUNCQ19SZWVkU29sb21vbkdGMjU2Ojp+Q0JDX1JlZWRTb2xvbW9uR0YyNTYoKSB7fQotCi1DQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIENCQ19SZWVkU29sb21vbkdGMjU2OjpHZXRaZXJvKCkgY29uc3QgewotICByZXR1cm4gbV96ZXJvLmdldCgpOwotfQotCi1DQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIENCQ19SZWVkU29sb21vbkdGMjU2OjpHZXRPbmUoKSBjb25zdCB7Ci0gIHJldHVybiBtX29uZS5nZXQoKTsKLX0KLQotQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBDQkNfUmVlZFNvbG9tb25HRjI1Njo6QnVpbGRNb25vbWlhbCgKLSAgICBpbnQzMl90IGRlZ3JlZSwKLSAgICBpbnQzMl90IGNvZWZmaWNpZW50LAotICAgIGludDMyX3QmIGUpIHsKLSAgaWYgKGRlZ3JlZSA8IDApIHsKLSAgICBlID0gQkNFeGNlcHRpb25EZWdyZWVJc05lZ2F0aXZlOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIGlmIChjb2VmZmljaWVudCA9PSAwKSB7Ci0gICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiB0ZW1wID0gbV96ZXJvLT5DbG9uZShlKTsKLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgcmV0dXJuIHRlbXA7Ci0gIH0KLSAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4gY29lZmZpY2llbnRzOwotICBjb2VmZmljaWVudHMuU2V0U2l6ZShkZWdyZWUgKyAxKTsKLSAgY29lZmZpY2llbnRzWzBdID0gY29lZmZpY2llbnQ7Ci0gIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogdGVtcCA9IG5ldyBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKTsKLSAgdGVtcC0+SW5pdCh0aGlzLCAmY29lZmZpY2llbnRzLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIHRlbXA7Ci19Ci0KLWludDMyX3QgQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkFkZE9yU3VidHJhY3QoaW50MzJfdCBhLCBpbnQzMl90IGIpIHsKLSAgcmV0dXJuIGEgXiBiOwotfQotCi1pbnQzMl90IENCQ19SZWVkU29sb21vbkdGMjU2OjpFeHAoaW50MzJfdCBhKSB7Ci0gIHJldHVybiBtX2V4cFRhYmxlW2FdOwotfQotCi1pbnQzMl90IENCQ19SZWVkU29sb21vbkdGMjU2OjpMb2coaW50MzJfdCBhLCBpbnQzMl90JiBlKSB7Ci0gIGlmIChhID09IDApIHsKLSAgICBlID0gQkNFeGNlcHRpb25BSXNaZXJvOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiBtX2xvZ1RhYmxlW2FdOwotfQotCi1pbnQzMl90IENCQ19SZWVkU29sb21vbkdGMjU2OjpJbnZlcnNlKGludDMyX3QgYSwgaW50MzJfdCYgZSkgewotICBpZiAoYSA9PSAwKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uQUlzWmVybzsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gbV9leHBUYWJsZVsyNTUgLSBtX2xvZ1RhYmxlW2FdXTsKLX0KLQotaW50MzJfdCBDQkNfUmVlZFNvbG9tb25HRjI1Njo6TXVsdGlwbHkoaW50MzJfdCBhLCBpbnQzMl90IGIpIHsKLSAgaWYgKGEgPT0gMCB8fCBiID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAoYSA9PSAxKSB7Ci0gICAgcmV0dXJuIGI7Ci0gIH0KLSAgaWYgKGIgPT0gMSkgewotICAgIHJldHVybiBhOwotICB9Ci0gIHJldHVybiBtX2V4cFRhYmxlWyhtX2xvZ1RhYmxlW2FdICsgbV9sb2dUYWJsZVtiXSkgJSAyNTVdOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1Ni5oIGIveGZhL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1Ni5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmYxYWQxLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uR0YyNTYuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhCQVJDT0RFX0NPTU1PTl9SRUVEU09MT01PTl9CQ19SRUVEU09MT01PTkdGMjU2X0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfQ09NTU9OX1JFRURTT0xPTU9OX0JDX1JFRURTT0xPTU9OR0YyNTZfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3V0aWxzLmgiCi0KLWNsYXNzIENCQ19SZWVkU29sb21vbkdGMjU2UG9seTsKLQotY2xhc3MgQ0JDX1JlZWRTb2xvbW9uR0YyNTYgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ0JDX1JlZWRTb2xvbW9uR0YyNTYoaW50MzJfdCBwcmltaXRpdmUpOwotICB2aXJ0dWFsIH5DQkNfUmVlZFNvbG9tb25HRjI1NigpOwotCi0gIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsKLSAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsKLQotICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIEdldFplcm8oKSBjb25zdDsKLSAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBHZXRPbmUoKSBjb25zdDsKLSAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBCdWlsZE1vbm9taWFsKGludDMyX3QgZGVncmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2VmZmljaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotICBzdGF0aWMgaW50MzJfdCBBZGRPclN1YnRyYWN0KGludDMyX3QgYSwgaW50MzJfdCBiKTsKLSAgaW50MzJfdCBFeHAoaW50MzJfdCBhKTsKLSAgaW50MzJfdCBMb2coaW50MzJfdCBhLCBpbnQzMl90JiBlKTsKLSAgaW50MzJfdCBJbnZlcnNlKGludDMyX3QgYSwgaW50MzJfdCYgZSk7Ci0gIGludDMyX3QgTXVsdGlwbHkoaW50MzJfdCBhLCBpbnQzMl90IGIpOwotICB2aXJ0dWFsIHZvaWQgSW5pdCgpOwotCi0gIHN0YXRpYyBDQkNfUmVlZFNvbG9tb25HRjI1NiogUVJDb2RlRmllbGQ7Ci0gIHN0YXRpYyBDQkNfUmVlZFNvbG9tb25HRjI1NiogRGF0YU1hdHJpeEZpZWxkOwotCi0gcHJpdmF0ZToKLSAgaW50MzJfdCBtX2V4cFRhYmxlWzI1Nl07Ci0gIGludDMyX3QgbV9sb2dUYWJsZVsyNTZdOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBtX3plcm87Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IG1fb25lOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhCQVJDT0RFX0NPTU1PTl9SRUVEU09MT01PTl9CQ19SRUVEU09MT01PTkdGMjU2X0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2UG9seS5jcHAgYi94ZmEvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2UG9seS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYmJjMDIuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLS8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2UG9seS5oIgotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1Ni5oIgotCi1DQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkNCQ19SZWVkU29sb21vbkdGMjU2UG9seShDQkNfUmVlZFNvbG9tb25HRjI1NiogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZWZmaWNpZW50cykgewotICBpZiAoIWZpZWxkKQotICAgIHJldHVybjsKLQotICBtX2ZpZWxkID0gZmllbGQ7Ci0gIG1fY29lZmZpY2llbnRzLkFkZChjb2VmZmljaWVudHMpOwotfQotQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKSB7Ci0gIG1fZmllbGQgPSBudWxscHRyOwotfQotdm9pZCBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkluaXQoQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4qIGNvZWZmaWNpZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgaWYgKCFjb2VmZmljaWVudHMgfHwgY29lZmZpY2llbnRzLT5HZXRTaXplKCkgPT0gMCkgewotICAgIGUgPSBCQ0V4Y2VwdGlvbkNvZWZmaWNpZW50c1NpemVJc051bGw7Ci0gICAgcmV0dXJuOwotICB9Ci0gIG1fZmllbGQgPSBmaWVsZDsKLSAgaW50MzJfdCBjb2VmZmljaWVudHNMZW5ndGggPSBjb2VmZmljaWVudHMtPkdldFNpemUoKTsKLSAgaWYgKChjb2VmZmljaWVudHNMZW5ndGggPiAxICYmICgqY29lZmZpY2llbnRzKVswXSA9PSAwKSkgewotICAgIGludDMyX3QgZmlyc3ROb25aZXJvID0gMTsKLSAgICB3aGlsZSAoKGZpcnN0Tm9uWmVybyA8IGNvZWZmaWNpZW50c0xlbmd0aCkgJiYKLSAgICAgICAgICAgKCgqY29lZmZpY2llbnRzKVtmaXJzdE5vblplcm9dID09IDApKSB7Ci0gICAgICBmaXJzdE5vblplcm8rKzsKLSAgICB9Ci0gICAgaWYgKGZpcnN0Tm9uWmVybyA9PSBjb2VmZmljaWVudHNMZW5ndGgpIHsKLSAgICAgIG1fY29lZmZpY2llbnRzLkNvcHkoKihtX2ZpZWxkLT5HZXRaZXJvKCktPkdldENvZWZmaWNpZW50cygpKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1fY29lZmZpY2llbnRzLlNldFNpemUoY29lZmZpY2llbnRzTGVuZ3RoIC0gZmlyc3ROb25aZXJvKTsKLSAgICAgIGZvciAoaW50MzJfdCBpID0gZmlyc3ROb25aZXJvLCBqID0gMDsgaSA8IGNvZWZmaWNpZW50c0xlbmd0aDsgaSsrLCBqKyspIHsKLSAgICAgICAgbV9jb2VmZmljaWVudHNbal0gPSBjb2VmZmljaWVudHMtPm9wZXJhdG9yW10oaSk7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIG1fY29lZmZpY2llbnRzLkNvcHkoKmNvZWZmaWNpZW50cyk7Ci0gIH0KLX0KLUNGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+KiBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkdldENvZWZmaWNpZW50cygpIHsKLSAgcmV0dXJuICZtX2NvZWZmaWNpZW50czsKLX0KLWludDMyX3QgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpHZXREZWdyZWUoKSB7Ci0gIHJldHVybiBtX2NvZWZmaWNpZW50cy5HZXRTaXplKCkgLSAxOwotfQotYm9vbCBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OklzWmVybygpIHsKLSAgcmV0dXJuIG1fY29lZmZpY2llbnRzWzBdID09IDA7Ci19Ci1pbnQzMl90IENCQ19SZWVkU29sb21vbkdGMjU2UG9seTo6R2V0Q29lZmZpY2llbnRzKGludDMyX3QgZGVncmVlKSB7Ci0gIHJldHVybiBtX2NvZWZmaWNpZW50c1ttX2NvZWZmaWNpZW50cy5HZXRTaXplKCkgLSAxIC0gZGVncmVlXTsKLX0KLWludDMyX3QgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpFdmFsdWF0ZUF0KGludDMyX3QgYSkgewotICBpZiAoYSA9PSAwKSB7Ci0gICAgcmV0dXJuIEdldENvZWZmaWNpZW50cygwKTsKLSAgfQotICBpbnQzMl90IHNpemUgPSBtX2NvZWZmaWNpZW50cy5HZXRTaXplKCk7Ci0gIGlmIChhID09IDEpIHsKLSAgICBpbnQzMl90IHJlc3VsdCA9IDA7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICByZXN1bHQgPSBDQkNfUmVlZFNvbG9tb25HRjI1Njo6QWRkT3JTdWJ0cmFjdChyZXN1bHQsIG1fY29lZmZpY2llbnRzW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICBpbnQzMl90IHJlc3VsdCA9IG1fY29lZmZpY2llbnRzWzBdOwotICBmb3IgKGludDMyX3QgaiA9IDE7IGogPCBzaXplOyBqKyspIHsKLSAgICByZXN1bHQgPSBDQkNfUmVlZFNvbG9tb25HRjI1Njo6QWRkT3JTdWJ0cmFjdChtX2ZpZWxkLT5NdWx0aXBseShhLCByZXN1bHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY29lZmZpY2llbnRzW2pdKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkNsb25lKGludDMyX3QmIGUpIHsKLSAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiB0ZW1wID0gbmV3IENCQ19SZWVkU29sb21vbkdGMjU2UG9seSgpOwotICB0ZW1wLT5Jbml0KG1fZmllbGQsICZtX2NvZWZmaWNpZW50cywgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIHJldHVybiB0ZW1wOwotfQotQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6OkFkZE9yU3VidHJhY3QoCi0gICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBvdGhlciwKLSAgICBpbnQzMl90JiBlKSB7Ci0gIGlmIChJc1plcm8oKSkKLSAgICByZXR1cm4gb3RoZXItPkNsb25lKGUpOwotICBpZiAob3RoZXItPklzWmVybygpKQotICAgIHJldHVybiBDbG9uZShlKTsKLQotICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiBzbWFsbGVyQ29lZmZpY2llbnRzOwotICBzbWFsbGVyQ29lZmZpY2llbnRzLkNvcHkobV9jb2VmZmljaWVudHMpOwotICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiBsYXJnZXJDb2VmZmljaWVudHM7Ci0gIGxhcmdlckNvZWZmaWNpZW50cy5Db3B5KCoob3RoZXItPkdldENvZWZmaWNpZW50cygpKSk7Ci0gIGlmIChzbWFsbGVyQ29lZmZpY2llbnRzLkdldFNpemUoKSA+IGxhcmdlckNvZWZmaWNpZW50cy5HZXRTaXplKCkpIHsKLSAgICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiB0ZW1wOwotICAgIHRlbXAuQ29weShzbWFsbGVyQ29lZmZpY2llbnRzKTsKLSAgICBzbWFsbGVyQ29lZmZpY2llbnRzLkNvcHkobGFyZ2VyQ29lZmZpY2llbnRzKTsKLSAgICBsYXJnZXJDb2VmZmljaWVudHMuQ29weSh0ZW1wKTsKLSAgfQotICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiBzdW1EaWZmOwotICBzdW1EaWZmLlNldFNpemUobGFyZ2VyQ29lZmZpY2llbnRzLkdldFNpemUoKSk7Ci0gIGludDMyX3QgbGVuZ3RoRGlmZiA9Ci0gICAgICBsYXJnZXJDb2VmZmljaWVudHMuR2V0U2l6ZSgpIC0gc21hbGxlckNvZWZmaWNpZW50cy5HZXRTaXplKCk7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxlbmd0aERpZmY7IGkrKykgewotICAgIHN1bURpZmZbaV0gPSBsYXJnZXJDb2VmZmljaWVudHNbaV07Ci0gIH0KLSAgZm9yIChpbnQzMl90IGogPSBsZW5ndGhEaWZmOyBqIDwgbGFyZ2VyQ29lZmZpY2llbnRzLkdldFNpemUoKTsgaisrKSB7Ci0gICAgc3VtRGlmZltqXSA9IChDQkNfUmVlZFNvbG9tb25HRjI1Njo6QWRkT3JTdWJ0cmFjdCgKLSAgICAgICAgc21hbGxlckNvZWZmaWNpZW50c1tqIC0gbGVuZ3RoRGlmZl0sIGxhcmdlckNvZWZmaWNpZW50c1tqXSkpOwotICB9Ci0gIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogdGVtcCA9IG5ldyBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKTsKLSAgdGVtcC0+SW5pdChtX2ZpZWxkLCAmc3VtRGlmZiwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIHJldHVybiB0ZW1wOwotfQotQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk6Ok11bHRpcGx5KAotICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogb3RoZXIsCi0gICAgaW50MzJfdCYgZSkgewotICBpZiAoSXNaZXJvKCkgfHwgb3RoZXItPklzWmVybygpKQotICAgIHJldHVybiBtX2ZpZWxkLT5HZXRaZXJvKCktPkNsb25lKGUpOwotCi0gIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+IGFDb2VmZmljaWVudHM7Ci0gIGFDb2VmZmljaWVudHMuQ29weShtX2NvZWZmaWNpZW50cyk7Ci0gIGludDMyX3QgYUxlbmd0aCA9IG1fY29lZmZpY2llbnRzLkdldFNpemUoKTsKLSAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4gYkNvZWZmaWNpZW50czsKLSAgYkNvZWZmaWNpZW50cy5Db3B5KCoob3RoZXItPkdldENvZWZmaWNpZW50cygpKSk7Ci0gIGludDMyX3QgYkxlbmd0aCA9IG90aGVyLT5HZXRDb2VmZmljaWVudHMoKS0+R2V0U2l6ZSgpOwotICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiBwcm9kdWN0OwotICBwcm9kdWN0LlNldFNpemUoYUxlbmd0aCArIGJMZW5ndGggLSAxKTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYUxlbmd0aDsgaSsrKSB7Ci0gICAgaW50MzJfdCBhQ29lZmYgPSBtX2NvZWZmaWNpZW50c1tpXTsKLSAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBiTGVuZ3RoOyBqKyspIHsKLSAgICAgIHByb2R1Y3RbaSArIGpdID0gQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OkFkZE9yU3VidHJhY3QoCi0gICAgICAgICAgcHJvZHVjdFtpICsgal0sCi0gICAgICAgICAgbV9maWVsZC0+TXVsdGlwbHkoYUNvZWZmLCBvdGhlci0+R2V0Q29lZmZpY2llbnRzKCktPm9wZXJhdG9yW10oaikpKTsKLSAgICB9Ci0gIH0KLSAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiB0ZW1wID0gbmV3IENCQ19SZWVkU29sb21vbkdGMjU2UG9seSgpOwotICB0ZW1wLT5Jbml0KG1fZmllbGQsICZwcm9kdWN0LCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIHRlbXA7Ci19Ci1DQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIENCQ19SZWVkU29sb21vbkdGMjU2UG9seTo6TXVsdGlwbHkoaW50MzJfdCBzY2FsYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBpZiAoc2NhbGFyID09IDApCi0gICAgcmV0dXJuIG1fZmllbGQtPkdldFplcm8oKS0+Q2xvbmUoZSk7Ci0gIGlmIChzY2FsYXIgPT0gMSkKLSAgICByZXR1cm4gQ2xvbmUoZSk7Ci0KLSAgaW50MzJfdCBzaXplID0gbV9jb2VmZmljaWVudHMuR2V0U2l6ZSgpOwotICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiBwcm9kdWN0OwotICBwcm9kdWN0LlNldFNpemUoc2l6ZSk7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgIHByb2R1Y3RbaV0gPSBtX2ZpZWxkLT5NdWx0aXBseShtX2NvZWZmaWNpZW50c1tpXSwgc2NhbGFyKTsKLSAgfQotICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHRlbXAgPSBuZXcgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KCk7Ci0gIHRlbXAtPkluaXQobV9maWVsZCwgJnByb2R1Y3QsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBudWxscHRyOwotICByZXR1cm4gdGVtcDsKLX0KLUNCQ19SZWVkU29sb21vbkdGMjU2UG9seSogQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5OjpNdWx0aXBseUJ5TW9ub21pYWwoCi0gICAgaW50MzJfdCBkZWdyZWUsCi0gICAgaW50MzJfdCBjb2VmZmljaWVudCwKLSAgICBpbnQzMl90JiBlKSB7Ci0gIGlmIChkZWdyZWUgPCAwKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uRGVncmVlSXNOZWdhdGl2ZTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBpZiAoY29lZmZpY2llbnQgPT0gMCkKLSAgICByZXR1cm4gbV9maWVsZC0+R2V0WmVybygpLT5DbG9uZShlKTsKLQotICBpbnQzMl90IHNpemUgPSBtX2NvZWZmaWNpZW50cy5HZXRTaXplKCk7Ci0gIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+IHByb2R1Y3Q7Ci0gIHByb2R1Y3QuU2V0U2l6ZShzaXplICsgZGVncmVlKTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgcHJvZHVjdFtpXSA9IChtX2ZpZWxkLT5NdWx0aXBseShtX2NvZWZmaWNpZW50c1tpXSwgY29lZmZpY2llbnQpKTsKLSAgfQotICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIHRlbXAgPSBuZXcgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KCk7Ci0gIHRlbXAtPkluaXQobV9maWVsZCwgJnByb2R1Y3QsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBudWxscHRyOwotICByZXR1cm4gdGVtcDsKLX0KLQotQ0ZYX0FycmF5VGVtcGxhdGU8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5Kj4qIENCQ19SZWVkU29sb21vbkdGMjU2UG9seTo6RGl2aWRlKAotICAgIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogb3RoZXIsCi0gICAgaW50MzJfdCYgZSkgewotICBpZiAob3RoZXItPklzWmVybygpKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uRGl2aWRlQnlaZXJvOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHF1b3RpZW50KAotICAgICAgbV9maWVsZC0+R2V0WmVybygpLT5DbG9uZShlKSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHk+IHJlbWFpbmRlcihDbG9uZShlKSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIGludDMyX3QgZGVub21pbmF0b3JMZWFkaW5nVGVybSA9IG90aGVyLT5HZXRDb2VmZmljaWVudHMob3RoZXItPkdldERlZ3JlZSgpKTsKLSAgaW50MzJfdCBpbnZlcnNlRGVub21pbmF0b3JMZWFkaW5nVGVhbSA9Ci0gICAgICBtX2ZpZWxkLT5JbnZlcnNlKGRlbm9taW5hdG9yTGVhZGluZ1Rlcm0sIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBudWxscHRyOwotICB3aGlsZSAocmVtYWluZGVyLT5HZXREZWdyZWUoKSA+PSBvdGhlci0+R2V0RGVncmVlKCkgJiYgIXJlbWFpbmRlci0+SXNaZXJvKCkpIHsKLSAgICBpbnQzMl90IGRlZ3JlZURpZmZlcmVuY2UgPSByZW1haW5kZXItPkdldERlZ3JlZSgpIC0gb3RoZXItPkdldERlZ3JlZSgpOwotICAgIGludDMyX3Qgc2NhbGUgPQotICAgICAgICBtX2ZpZWxkLT5NdWx0aXBseShyZW1haW5kZXItPkdldENvZWZmaWNpZW50cygocmVtYWluZGVyLT5HZXREZWdyZWUoKSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZlcnNlRGVub21pbmF0b3JMZWFkaW5nVGVhbSk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENCQ19SZWVkU29sb21vbkdGMjU2UG9seT4gdGVybSgKLSAgICAgICAgb3RoZXItPk11bHRpcGx5QnlNb25vbWlhbChkZWdyZWVEaWZmZXJlbmNlLCBzY2FsZSwgZSkpOwotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5PiBpdGVyYXRvclF1b3RpZW50KAotICAgICAgICBtX2ZpZWxkLT5CdWlsZE1vbm9taWFsKGRlZ3JlZURpZmZlcmVuY2UsIHNjYWxlLCBlKSk7Ci0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIHF1b3RpZW50LnJlc2V0KHF1b3RpZW50LT5BZGRPclN1YnRyYWN0KGl0ZXJhdG9yUXVvdGllbnQuZ2V0KCksIGUpKTsKLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgcmVtYWluZGVyLnJlc2V0KHJlbWFpbmRlci0+QWRkT3JTdWJ0cmFjdCh0ZXJtLmdldCgpLCBlKSk7Ci0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIENGWF9BcnJheVRlbXBsYXRlPENCQ19SZWVkU29sb21vbkdGMjU2UG9seSo+KiB0ZW1wUHRyQSA9Ci0gICAgICBuZXcgQ0ZYX0FycmF5VGVtcGxhdGU8Q0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5Kj4oKTsKLSAgdGVtcFB0ckEtPkFkZChxdW90aWVudC5yZWxlYXNlKCkpOwotICB0ZW1wUHRyQS0+QWRkKHJlbWFpbmRlci5yZWxlYXNlKCkpOwotICByZXR1cm4gdGVtcFB0ckE7Ci19Ci0KLUNCQ19SZWVkU29sb21vbkdGMjU2UG9seTo6fkNCQ19SZWVkU29sb21vbkdGMjU2UG9seSgpIHsKLSAgbV9jb2VmZmljaWVudHMuUmVtb3ZlQWxsKCk7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2UG9seS5oIGIveGZhL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY5MzI2NC4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2UG9seS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfQ09NTU9OX1JFRURTT0xPTU9OX0JDX1JFRURTT0xPTU9OR0YyNTZQT0xZX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfQ09NTU9OX1JFRURTT0xPTU9OX0JDX1JFRURTT0xPTU9OR0YyNTZQT0xZX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0KLWNsYXNzIENCQ19SZWVkU29sb21vbkdGMjU2OwotCi1jbGFzcyBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkgZmluYWwgewotIHB1YmxpYzoKLSAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KENCQ19SZWVkU29sb21vbkdGMjU2KiBmaWVsZCwgaW50MzJfdCBjb2VmZmljaWVudHMpOwotICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkoKTsKLSAgfkNCQ19SZWVkU29sb21vbkdGMjU2UG9seSgpOwotICB2b2lkIEluaXQoQ0JDX1JlZWRTb2xvbW9uR0YyNTYqIGZpZWxkLAotICAgICAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4qIGNvZWZmaWNpZW50cywKLSAgICAgICAgICAgIGludDMyX3QmIGUpOwotCi0gIGludDMyX3QgR2V0Q29lZmZpY2llbnRzKGludDMyX3QgZGVncmVlKTsKLSAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4qIEdldENvZWZmaWNpZW50cygpOwotICBpbnQzMl90IEdldERlZ3JlZSgpOwotICBib29sIElzWmVybygpOwotICBpbnQzMl90IEV2YWx1YXRlQXQoaW50MzJfdCBhKTsKLSAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBBZGRPclN1YnRyYWN0KENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogb3RoZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBNdWx0aXBseShDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIG90aGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotICBDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqIE11bHRpcGx5KGludDMyX3Qgc2NhbGFyLCBpbnQzMl90JiBlKTsKLSAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBNdWx0aXBseUJ5TW9ub21pYWwoaW50MzJfdCBkZWdyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29lZmZpY2llbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotICBDRlhfQXJyYXlUZW1wbGF0ZTxDQkNfUmVlZFNvbG9tb25HRjI1NlBvbHkqPiogRGl2aWRlKAotICAgICAgQ0JDX1JlZWRTb2xvbW9uR0YyNTZQb2x5KiBvdGhlciwKLSAgICAgIGludDMyX3QmIGUpOwotCi0gIENCQ19SZWVkU29sb21vbkdGMjU2UG9seSogQ2xvbmUoaW50MzJfdCYgZSk7Ci0KLSBwcml2YXRlOgotICBDQkNfUmVlZFNvbG9tb25HRjI1NiogbV9maWVsZDsKLSAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4gbV9jb2VmZmljaWVudHM7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfQ09NTU9OX1JFRURTT0xPTU9OX0JDX1JFRURTT0xPTU9OR0YyNTZQT0xZX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQVNDSUlFbmNvZGVyLmNwcCBiL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19BU0NJSUVuY29kZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGQ4ZmMxLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19BU0NJSUVuY29kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgotLyoKLSAqIENvcHlyaWdodCAyMDA2LTIwMDcgSmVyZW1pYXMgTWFlcmtpLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9CQ19EaW1lbnNpb24uaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQVNDSUlFbmNvZGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2RlckNvbnRleHQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfSGlnaExldmVsRW5jb2Rlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbFNoYXBlSGludC5oIgotCi1DQkNfQVNDSUlFbmNvZGVyOjpDQkNfQVNDSUlFbmNvZGVyKCkge30KLUNCQ19BU0NJSUVuY29kZXI6On5DQkNfQVNDSUlFbmNvZGVyKCkge30KLWludDMyX3QgQ0JDX0FTQ0lJRW5jb2Rlcjo6Z2V0RW5jb2RpbmdNb2RlKCkgewotICByZXR1cm4gQVNDSUlfRU5DT0RBVElPTjsKLX0KLXZvaWQgQ0JDX0FTQ0lJRW5jb2Rlcjo6RW5jb2RlKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwgaW50MzJfdCYgZSkgewotICBpbnQzMl90IG4gPSBDQkNfSGlnaExldmVsRW5jb2Rlcjo6ZGV0ZXJtaW5lQ29uc2VjdXRpdmVEaWdpdENvdW50KAotICAgICAgY29udGV4dC5tX21zZywgY29udGV4dC5tX3Bvcyk7Ci0gIGlmIChuID49IDIpIHsKLSAgICBGWF9XQ0hBUiBjb2RlID0KLSAgICAgICAgZW5jb2RlQVNDSUlEaWdpdHMoY29udGV4dC5tX21zZy5HZXRBdChjb250ZXh0Lm1fcG9zKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5tX21zZy5HZXRBdChjb250ZXh0Lm1fcG9zICsgMSksIGUpOwotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY29udGV4dC53cml0ZUNvZGV3b3JkKGNvZGUpOwotICAgIGNvbnRleHQubV9wb3MgKz0gMjsKLSAgfSBlbHNlIHsKLSAgICBGWF9XQ0hBUiBjID0gY29udGV4dC5nZXRDdXJyZW50Q2hhcigpOwotICAgIGludDMyX3QgbmV3TW9kZSA9IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpsb29rQWhlYWRUZXN0KAotICAgICAgICBjb250ZXh0Lm1fbXNnLCBjb250ZXh0Lm1fcG9zLCBnZXRFbmNvZGluZ01vZGUoKSk7Ci0gICAgaWYgKG5ld01vZGUgIT0gZ2V0RW5jb2RpbmdNb2RlKCkpIHsKLSAgICAgIHN3aXRjaCAobmV3TW9kZSkgewotICAgICAgICBjYXNlIEJBU0UyNTZfRU5DT0RBVElPTjoKLSAgICAgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OkxBVENIX1RPX0JBU0UyNTYpOwotICAgICAgICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShCQVNFMjU2X0VOQ09EQVRJT04pOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgY2FzZSBDNDBfRU5DT0RBVElPTjoKLSAgICAgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OkxBVENIX1RPX0M0MCk7Ci0gICAgICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKEM0MF9FTkNPREFUSU9OKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIGNhc2UgWDEyX0VOQ09EQVRJT046Ci0gICAgICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpMQVRDSF9UT19BTlNJWDEyKTsKLSAgICAgICAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoWDEyX0VOQ09EQVRJT04pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRFWFRfRU5DT0RBVElPTjoKLSAgICAgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OkxBVENIX1RPX1RFWFQpOwotICAgICAgICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShURVhUX0VOQ09EQVRJT04pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVESUZBQ1RfRU5DT0RBVElPTjoKLSAgICAgICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OkxBVENIX1RPX0VESUZBQ1QpOwotICAgICAgICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShFRElGQUNUX0VOQ09EQVRJT04pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxTdGF0ZUlsbGVnYWxNb2RlOwotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc0V4dGVuZGVkQVNDSUkoYykpIHsKLSAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6VVBQRVJfU0hJRlQpOwotICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKChGWF9XQ0hBUikoYyAtIDEyOCArIDEpKTsKLSAgICAgIGNvbnRleHQubV9wb3MrKzsKLSAgICB9IGVsc2UgewotICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKChGWF9XQ0hBUikoYyArIDEpKTsKLSAgICAgIGNvbnRleHQubV9wb3MrKzsKLSAgICB9Ci0gIH0KLX0KLUZYX1dDSEFSIENCQ19BU0NJSUVuY29kZXI6OmVuY29kZUFTQ0lJRGlnaXRzKEZYX1dDSEFSIGRpZ2l0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIGRpZ2l0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgaWYgKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc0RpZ2l0KGRpZ2l0MSkgJiYKLSAgICAgIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc0RpZ2l0KGRpZ2l0MikpIHsKLSAgICBpbnQzMl90IG51bSA9IChkaWdpdDEgLSA0OCkgKiAxMCArIChkaWdpdDIgLSA0OCk7Ci0gICAgcmV0dXJuIChGWF9XQ0hBUikobnVtICsgMTMwKTsKLSAgfQotICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnROb3RHaWdpdHM7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0FTQ0lJRW5jb2Rlci5oIGIveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0FTQ0lJRW5jb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDU1OWI1Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19BU0NJSUVuY29kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfQVNDSUlFTkNPREVSX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19BU0NJSUVOQ09ERVJfSF8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmgiCi0KLWNsYXNzIENCQ19FbmNvZGVyQ29udGV4dDsKLQotY2xhc3MgQ0JDX0FTQ0lJRW5jb2RlciA6IHB1YmxpYyBDQkNfRW5jb2RlciB7Ci0gcHVibGljOgotICBDQkNfQVNDSUlFbmNvZGVyKCk7Ci0gIH5DQkNfQVNDSUlFbmNvZGVyKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ0JDX0VuY29kZXIKLSAgaW50MzJfdCBnZXRFbmNvZGluZ01vZGUoKSBvdmVycmlkZTsKLSAgdm9pZCBFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LCBpbnQzMl90JiBlKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBGWF9XQ0hBUiBlbmNvZGVBU0NJSURpZ2l0cyhGWF9XQ0hBUiBkaWdpdDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiBkaWdpdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX0FTQ0lJRU5DT0RFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Jhc2UyNTZFbmNvZGVyLmNwcCBiL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19CYXNlMjU2RW5jb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZTQyN2MuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Jhc2UyNTZFbmNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLS8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNi0yMDA3IEplcmVtaWFzIE1hZXJraS4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvQkNfRGltZW5zaW9uLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Jhc2UyNTZFbmNvZGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2RlckNvbnRleHQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfSGlnaExldmVsRW5jb2Rlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbFNoYXBlSGludC5oIgotCi1DQkNfQmFzZTI1NkVuY29kZXI6OkNCQ19CYXNlMjU2RW5jb2RlcigpIHt9Ci1DQkNfQmFzZTI1NkVuY29kZXI6On5DQkNfQmFzZTI1NkVuY29kZXIoKSB7fQotaW50MzJfdCBDQkNfQmFzZTI1NkVuY29kZXI6OmdldEVuY29kaW5nTW9kZSgpIHsKLSAgcmV0dXJuIEJBU0UyNTZfRU5DT0RBVElPTjsKLX0KLXZvaWQgQ0JDX0Jhc2UyNTZFbmNvZGVyOjpFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LCBpbnQzMl90JiBlKSB7Ci0gIENGWF9XaWRlU3RyaW5nIGJ1ZmZlcjsKLSAgYnVmZmVyICs9IChGWF9XQ0hBUiknXDAnOwotICB3aGlsZSAoY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpKSB7Ci0gICAgRlhfV0NIQVIgYyA9IGNvbnRleHQuZ2V0Q3VycmVudENoYXIoKTsKLSAgICBidWZmZXIgKz0gYzsKLSAgICBjb250ZXh0Lm1fcG9zKys7Ci0gICAgaW50MzJfdCBuZXdNb2RlID0gQ0JDX0hpZ2hMZXZlbEVuY29kZXI6Omxvb2tBaGVhZFRlc3QoCi0gICAgICAgIGNvbnRleHQubV9tc2csIGNvbnRleHQubV9wb3MsIGdldEVuY29kaW5nTW9kZSgpKTsKLSAgICBpZiAobmV3TW9kZSAhPSBnZXRFbmNvZGluZ01vZGUoKSkgewotICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKG5ld01vZGUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGludDMyX3QgZGF0YUNvdW50ID0gYnVmZmVyLkdldExlbmd0aCgpIC0gMTsKLSAgRlhfQ0hBUiBidWZbMTI4XTsKLSAgRlhTWVNfaXRvYShkYXRhQ291bnQsIGJ1ZiwgMTApOwotICBidWZmZXIuU2V0QXQoMCwgRlhfV0NIQVIoKmJ1ZikgLSAnMCcpOwotICBpbnQzMl90IGxlbmd0aEZpZWxkU2l6ZSA9IDE7Ci0gIGludDMyX3QgY3VycmVudFNpemUgPQotICAgICAgY29udGV4dC5nZXRDb2Rld29yZENvdW50KCkgKyBkYXRhQ291bnQgKyBsZW5ndGhGaWVsZFNpemU7Ci0gIGNvbnRleHQudXBkYXRlU3ltYm9sSW5mbyhjdXJyZW50U2l6ZSwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgYm9vbCBtdXN0UGFkID0gKGNvbnRleHQubV9zeW1ib2xJbmZvLT5tX2RhdGFDYXBhY2l0eSAtIGN1cnJlbnRTaXplKSA+IDA7Ci0gIGlmIChjb250ZXh0Lmhhc01vcmVDaGFyYWN0ZXJzKCkgfHwgbXVzdFBhZCkgewotICAgIGlmIChkYXRhQ291bnQgPD0gMjQ5KSB7Ci0gICAgICBidWZmZXIuU2V0QXQoMCwgKEZYX1dDSEFSKWRhdGFDb3VudCk7Ci0gICAgfSBlbHNlIGlmIChkYXRhQ291bnQgPiAyNDkgJiYgZGF0YUNvdW50IDw9IDE1NTUpIHsKLSAgICAgIGJ1ZmZlci5TZXRBdCgwLCAoRlhfV0NIQVIpKChkYXRhQ291bnQgLyAyNTApICsgMjQ5KSk7Ci0gICAgICBidWZmZXIuSW5zZXJ0KDEsIChGWF9XQ0hBUikoZGF0YUNvdW50ICUgMjUwKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxTdGF0ZU1lc3NhZ2VMZW5ndGhJbnZhbGlkOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICBmb3IgKGludDMyX3QgaSA9IDAsIGMgPSBidWZmZXIuR2V0TGVuZ3RoKCk7IGkgPCBjOyBpKyspIHsKLSAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoCi0gICAgICAgIHJhbmRvbWl6ZTI1NVN0YXRlKGJ1ZmZlci5HZXRBdChpKSwgY29udGV4dC5nZXRDb2Rld29yZENvdW50KCkgKyAxKSk7Ci0gIH0KLX0KLUZYX1dDSEFSIENCQ19CYXNlMjU2RW5jb2Rlcjo6cmFuZG9taXplMjU1U3RhdGUoRlhfV0NIQVIgY2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZXdvcmRQb3NpdGlvbikgewotICBpbnQzMl90IHBzZXVkb1JhbmRvbSA9ICgoMTQ5ICogY29kZXdvcmRQb3NpdGlvbikgJSAyNTUpICsgMTsKLSAgaW50MzJfdCB0ZW1wVmFyaWFibGUgPSBjaCArIHBzZXVkb1JhbmRvbTsKLSAgaWYgKHRlbXBWYXJpYWJsZSA8PSAyNTUpIHsKLSAgICByZXR1cm4gKEZYX1dDSEFSKXRlbXBWYXJpYWJsZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gKEZYX1dDSEFSKSh0ZW1wVmFyaWFibGUgLSAyNTYpOwotICB9Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQmFzZTI1NkVuY29kZXIuaCBiL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19CYXNlMjU2RW5jb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDFjNzlkLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19CYXNlMjU2RW5jb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19CQVNFMjU2RU5DT0RFUl9IXwotI2RlZmluZSBYRkFfRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfQkFTRTI1NkVOQ09ERVJfSF8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmgiCi0KLWNsYXNzIENCQ19CYXNlMjU2RW5jb2RlciA6IHB1YmxpYyBDQkNfRW5jb2RlciB7Ci0gcHVibGljOgotICBDQkNfQmFzZTI1NkVuY29kZXIoKTsKLSAgfkNCQ19CYXNlMjU2RW5jb2RlcigpIG92ZXJyaWRlOwotCi0gIC8vIENCQ19FbmNvZGVyCi0gIGludDMyX3QgZ2V0RW5jb2RpbmdNb2RlKCkgb3ZlcnJpZGU7Ci0gIHZvaWQgRW5jb2RlKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgRlhfV0NIQVIgcmFuZG9taXplMjU1U3RhdGUoRlhfV0NIQVIgY2gsIGludDMyX3QgY29kZXdvcmRQb3NpdGlvbik7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19CQVNFMjU2RU5DT0RFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0M0MEVuY29kZXIuY3BwIGIveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0M0MEVuY29kZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGYwMmNhLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19DNDBFbmNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0vLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6Ci0vKgotICogQ29weXJpZ2h0IDIwMDYtMjAwNyBKZXJlbWlhcyBNYWVya2kuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL0JDX0RpbWVuc2lvbi5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19DNDBFbmNvZGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2RlckNvbnRleHQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfSGlnaExldmVsRW5jb2Rlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbFNoYXBlSGludC5oIgotCi1DQkNfQzQwRW5jb2Rlcjo6Q0JDX0M0MEVuY29kZXIoKSB7fQotQ0JDX0M0MEVuY29kZXI6On5DQkNfQzQwRW5jb2RlcigpIHt9Ci1pbnQzMl90IENCQ19DNDBFbmNvZGVyOjpnZXRFbmNvZGluZ01vZGUoKSB7Ci0gIHJldHVybiBDNDBfRU5DT0RBVElPTjsKLX0KLXZvaWQgQ0JDX0M0MEVuY29kZXI6OkVuY29kZShDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsIGludDMyX3QmIGUpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgYnVmZmVyOwotICB3aGlsZSAoY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpKSB7Ci0gICAgRlhfV0NIQVIgYyA9IGNvbnRleHQuZ2V0Q3VycmVudENoYXIoKTsKLSAgICBjb250ZXh0Lm1fcG9zKys7Ci0gICAgaW50MzJfdCBsYXN0Q2hhclNpemUgPSBlbmNvZGVDaGFyKGMsIGJ1ZmZlciwgZSk7Ci0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQzMl90IHVud3JpdHRlbiA9IChidWZmZXIuR2V0TGVuZ3RoKCkgLyAzKSAqIDI7Ci0gICAgaW50MzJfdCBjdXJDb2Rld29yZENvdW50ID0gY29udGV4dC5nZXRDb2Rld29yZENvdW50KCkgKyB1bndyaXR0ZW47Ci0gICAgY29udGV4dC51cGRhdGVTeW1ib2xJbmZvKGN1ckNvZGV3b3JkQ291bnQsIGUpOwotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50MzJfdCBhdmFpbGFibGUgPSBjb250ZXh0Lm1fc3ltYm9sSW5mby0+bV9kYXRhQ2FwYWNpdHkgLSBjdXJDb2Rld29yZENvdW50OwotICAgIGlmICghY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyByZW1vdmVkOwotICAgICAgaWYgKChidWZmZXIuR2V0TGVuZ3RoKCkgJSAzKSA9PSAyKSB7Ci0gICAgICAgIGlmIChhdmFpbGFibGUgPCAyIHx8IGF2YWlsYWJsZSA+IDIpIHsKLSAgICAgICAgICBsYXN0Q2hhclNpemUgPQotICAgICAgICAgICAgICBiYWNrdHJhY2tPbmVDaGFyYWN0ZXIoY29udGV4dCwgYnVmZmVyLCByZW1vdmVkLCBsYXN0Q2hhclNpemUsIGUpOwotICAgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHdoaWxlICgoYnVmZmVyLkdldExlbmd0aCgpICUgMykgPT0gMSAmJgotICAgICAgICAgICAgICgobGFzdENoYXJTaXplIDw9IDMgJiYgYXZhaWxhYmxlICE9IDEpIHx8IGxhc3RDaGFyU2l6ZSA+IDMpKSB7Ci0gICAgICAgIGxhc3RDaGFyU2l6ZSA9Ci0gICAgICAgICAgICBiYWNrdHJhY2tPbmVDaGFyYWN0ZXIoY29udGV4dCwgYnVmZmVyLCByZW1vdmVkLCBsYXN0Q2hhclNpemUsIGUpOwotICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaW50MzJfdCBjb3VudCA9IGJ1ZmZlci5HZXRMZW5ndGgoKTsKLSAgICBpZiAoKGNvdW50ICUgMykgPT0gMCkgewotICAgICAgaW50MzJfdCBuZXdNb2RlID0gQ0JDX0hpZ2hMZXZlbEVuY29kZXI6Omxvb2tBaGVhZFRlc3QoCi0gICAgICAgICAgY29udGV4dC5tX21zZywgY29udGV4dC5tX3BvcywgZ2V0RW5jb2RpbmdNb2RlKCkpOwotICAgICAgaWYgKG5ld01vZGUgIT0gZ2V0RW5jb2RpbmdNb2RlKCkpIHsKLSAgICAgICAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKG5ld01vZGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaGFuZGxlRU9EKGNvbnRleHQsIGJ1ZmZlciwgZSk7Ci19Ci12b2lkIENCQ19DNDBFbmNvZGVyOjp3cml0ZU5leHRUcmlwbGV0KENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIGJ1ZmZlcikgewotICBjb250ZXh0LndyaXRlQ29kZXdvcmRzKGVuY29kZVRvQ29kZXdvcmRzKGJ1ZmZlciwgMCkpOwotICBidWZmZXIuRGVsZXRlKDAsIDMpOwotfQotdm9pZCBDQkNfQzQwRW5jb2Rlcjo6aGFuZGxlRU9EKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgaW50MzJfdCB1bndyaXR0ZW4gPSAoYnVmZmVyLkdldExlbmd0aCgpIC8gMykgKiAyOwotICBpbnQzMl90IHJlc3QgPSBidWZmZXIuR2V0TGVuZ3RoKCkgJSAzOwotICBpbnQzMl90IGN1ckNvZGV3b3JkQ291bnQgPSBjb250ZXh0LmdldENvZGV3b3JkQ291bnQoKSArIHVud3JpdHRlbjsKLSAgY29udGV4dC51cGRhdGVTeW1ib2xJbmZvKGN1ckNvZGV3b3JkQ291bnQsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGludDMyX3QgYXZhaWxhYmxlID0gY29udGV4dC5tX3N5bWJvbEluZm8tPm1fZGF0YUNhcGFjaXR5IC0gY3VyQ29kZXdvcmRDb3VudDsKLSAgaWYgKHJlc3QgPT0gMikgewotICAgIGJ1ZmZlciArPSAoRlhfV0NIQVIpJ1wwJzsKLSAgICB3aGlsZSAoYnVmZmVyLkdldExlbmd0aCgpID49IDMpIHsKLSAgICAgIHdyaXRlTmV4dFRyaXBsZXQoY29udGV4dCwgYnVmZmVyKTsKLSAgICB9Ci0gICAgaWYgKGNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSkgewotICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpDNDBfVU5MQVRDSCk7Ci0gICAgfQotICB9IGVsc2UgaWYgKGF2YWlsYWJsZSA9PSAxICYmIHJlc3QgPT0gMSkgewotICAgIHdoaWxlIChidWZmZXIuR2V0TGVuZ3RoKCkgPj0gMykgewotICAgICAgd3JpdGVOZXh0VHJpcGxldChjb250ZXh0LCBidWZmZXIpOwotICAgIH0KLSAgICBpZiAoY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpKSB7Ci0gICAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OkM0MF9VTkxBVENIKTsKLSAgICB9Ci0gICAgY29udGV4dC5tX3Bvcy0tOwotICB9IGVsc2UgaWYgKHJlc3QgPT0gMCkgewotICAgIHdoaWxlIChidWZmZXIuR2V0TGVuZ3RoKCkgPj0gMykgewotICAgICAgd3JpdGVOZXh0VHJpcGxldChjb250ZXh0LCBidWZmZXIpOwotICAgIH0KLSAgICBpZiAoYXZhaWxhYmxlID4gMCB8fCBjb250ZXh0Lmhhc01vcmVDaGFyYWN0ZXJzKCkpIHsKLSAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6QzQwX1VOTEFUQ0gpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsU3RhdGVVbmV4cGVjdGVkQ2FzZTsKLSAgICByZXR1cm47Ci0gIH0KLSAgY29udGV4dC5zaWduYWxFbmNvZGVyQ2hhbmdlKEFTQ0lJX0VOQ09EQVRJT04pOwotfQotaW50MzJfdCBDQkNfQzQwRW5jb2Rlcjo6ZW5jb2RlQ2hhcihGWF9XQ0hBUiBjLCBDRlhfV2lkZVN0cmluZyYgc2IsIGludDMyX3QmIGUpIHsKLSAgaWYgKGMgPT0gJyAnKSB7Ci0gICAgc2IgKz0gKEZYX1dDSEFSKSdcMyc7Ci0gICAgcmV0dXJuIDE7Ci0gIH0gZWxzZSBpZiAoKGMgPj0gJzAnKSAmJiAoYyA8PSAnOScpKSB7Ci0gICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gNDggKyA0KTsKLSAgICByZXR1cm4gMTsKLSAgfSBlbHNlIGlmICgoYyA+PSAnQScpICYmIChjIDw9ICdaJykpIHsKLSAgICBzYiArPSAoRlhfV0NIQVIpKGMgLSA2NSArIDE0KTsKLSAgICByZXR1cm4gMTsKLSAgfSBlbHNlIGlmIChjIDw9IDB4MWYpIHsKLSAgICBzYiArPSAoRlhfV0NIQVIpJ1wwJzsKLSAgICBzYiArPSBjOwotICAgIHJldHVybiAyOwotICB9IGVsc2UgaWYgKChjID49ICchJykgJiYgKGMgPD0gJy8nKSkgewotICAgIHNiICs9IChGWF9XQ0hBUiknXDEnOwotICAgIHNiICs9IChGWF9XQ0hBUikoYyAtIDMzKTsKLSAgICByZXR1cm4gMjsKLSAgfSBlbHNlIGlmICgoYyA+PSAnOicpICYmIChjIDw9ICdAJykpIHsKLSAgICBzYiArPSAoRlhfV0NIQVIpJ1wxJzsKLSAgICBzYiArPSAoRlhfV0NIQVIpKGMgLSA1OCArIDE1KTsKLSAgICByZXR1cm4gMjsKLSAgfSBlbHNlIGlmICgoYyA+PSAnWycpICYmIChjIDw9ICdfJykpIHsKLSAgICBzYiArPSAoRlhfV0NIQVIpJ1wxJzsKLSAgICBzYiArPSAoRlhfV0NIQVIpKGMgLSA5MSArIDIyKTsKLSAgICByZXR1cm4gMjsKLSAgfSBlbHNlIGlmICgoYyA+PSA2MCkgJiYgKGMgPD0gMHg3ZikpIHsKLSAgICBzYiArPSAoRlhfV0NIQVIpJ1wyJzsKLSAgICBzYiArPSAoRlhfV0NIQVIpKGMgLSA5Nik7Ci0gICAgcmV0dXJuIDI7Ci0gIH0gZWxzZSBpZiAoYyA+PSA4MCkgewotICAgIHNiICs9IChGWF9XQ0hBUiknXDEnOwotICAgIHNiICs9IChGWF9XQ0hBUikweDAwMWU7Ci0gICAgaW50MzJfdCBsZW4gPSAyOwotICAgIGxlbiArPSBlbmNvZGVDaGFyKChjIC0gMTI4KSwgc2IsIGUpOwotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICByZXR1cm4gMDsKLSAgICByZXR1cm4gbGVuOwotICB9IGVsc2UgewotICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsKLSAgICByZXR1cm4gMDsKLSAgfQotfQotaW50MzJfdCBDQkNfQzQwRW5jb2Rlcjo6YmFja3RyYWNrT25lQ2hhcmFjdGVyKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiByZW1vdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGFzdENoYXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgaW50MzJfdCBjb3VudCA9IGJ1ZmZlci5HZXRMZW5ndGgoKTsKLSAgYnVmZmVyLkRlbGV0ZShjb3VudCAtIGxhc3RDaGFyU2l6ZSwgY291bnQpOwotICBjb250ZXh0Lm1fcG9zLS07Ci0gIEZYX1dDSEFSIGMgPSBjb250ZXh0LmdldEN1cnJlbnRDaGFyKCk7Ci0gIGxhc3RDaGFyU2l6ZSA9IGVuY29kZUNoYXIoYywgcmVtb3ZlZCwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIC0xOwotICBjb250ZXh0LnJlc2V0U3ltYm9sSW5mbygpOwotICByZXR1cm4gbGFzdENoYXJTaXplOwotfQotQ0ZYX1dpZGVTdHJpbmcgQ0JDX0M0MEVuY29kZXI6OmVuY29kZVRvQ29kZXdvcmRzKENGWF9XaWRlU3RyaW5nIHNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRQb3MpIHsKLSAgRlhfV0NIQVIgYzEgPSBzYi5HZXRBdChzdGFydFBvcyk7Ci0gIEZYX1dDSEFSIGMyID0gc2IuR2V0QXQoc3RhcnRQb3MgKyAxKTsKLSAgRlhfV0NIQVIgYzMgPSBzYi5HZXRBdChzdGFydFBvcyArIDIpOwotICBpbnQzMl90IHYgPSAoMTYwMCAqIGMxKSArICg0MCAqIGMyKSArIGMzICsgMTsKLSAgRlhfV0NIQVIgY3cxID0gKEZYX1dDSEFSKSh2IC8gMjU2KTsKLSAgRlhfV0NIQVIgY3cyID0gKEZYX1dDSEFSKSh2ICUgMjU2KTsKLSAgQ0ZYX1dpZGVTdHJpbmcgYjEoY3cxKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgYjIoY3cyKTsKLSAgcmV0dXJuIGIxICsgYjI7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQzQwRW5jb2Rlci5oIGIveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0M0MEVuY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTczNzk4MS4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQzQwRW5jb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19DNDBFTkNPREVSX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19DNDBFTkNPREVSX0hfCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2Rlci5oIgotCi1jbGFzcyBDQkNfQzQwRW5jb2RlciA6IHB1YmxpYyBDQkNfRW5jb2RlciB7Ci0gcHVibGljOgotICBDQkNfQzQwRW5jb2RlcigpOwotICB+Q0JDX0M0MEVuY29kZXIoKSBvdmVycmlkZTsKLQotICAvLyBDQkNfRW5jb2RlcgotICBpbnQzMl90IGdldEVuY29kaW5nTW9kZSgpIG92ZXJyaWRlOwotICB2b2lkIEVuY29kZShDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsIGludDMyX3QmIGUpIG92ZXJyaWRlOwotCi0gIHN0YXRpYyB2b2lkIHdyaXRlTmV4dFRyaXBsZXQoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBidWZmZXIpOwotCi0gIHZpcnR1YWwgdm9pZCBoYW5kbGVFT0QoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7Ci0gIHZpcnR1YWwgaW50MzJfdCBlbmNvZGVDaGFyKEZYX1dDSEFSIGMsIENGWF9XaWRlU3RyaW5nJiBzYiwgaW50MzJfdCYgZSk7Ci0KLSBwcml2YXRlOgotICBpbnQzMl90IGJhY2t0cmFja09uZUNoYXJhY3RlcihDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiByZW1vdmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxhc3RDaGFyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7Ci0gIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBlbmNvZGVUb0NvZGV3b3JkcyhDRlhfV2lkZVN0cmluZyBzYiwgaW50MzJfdCBzdGFydFBvcyk7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19DNDBFTkNPREVSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQuY3BwIGIveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU4MGJiNS4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgotLyoKLSAqIENvcHlyaWdodCAyMDA2IEplcmVtaWFzIE1hZXJraQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sSW5mby5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xTaGFwZUhpbnQuaCIKLQotQ0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0OjpDQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQoKQotICAgIDogQ0JDX1N5bWJvbEluZm8oZmFsc2UsIDE1NTgsIDYyMCwgMjIsIDIyLCAzNikgewotICBtX3JzQmxvY2tEYXRhID0gLTE7Ci0gIG1fcnNCbG9ja0Vycm9yID0gNjI7Ci19Ci1DQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQ6On5DQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQoKSB7fQotaW50MzJfdCBDQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQ6OmdldEludGVybGVhdmVkQmxvY2tDb3VudCgpIHsKLSAgcmV0dXJuIDEwOwotfQotaW50MzJfdCBDQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDRnZXREYXRhTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jaygKLSAgICBpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiAoaW5kZXggPD0gOCkgPyAxNTYgOiAxNTU7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQuaCBiL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2QwY2QwLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19EQVRBTUFUUklYU1lNQk9MSU5GTzE0NF9IXwotI2RlZmluZSBYRkFfRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfREFUQU1BVFJJWFNZTUJPTElORk8xNDRfSF8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmgiCi0KLWNsYXNzIENCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NCA6IHB1YmxpYyBDQkNfU3ltYm9sSW5mbyB7Ci0gcHVibGljOgotICBDQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQoKTsKLSAgfkNCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NCgpIG92ZXJyaWRlOwotCi0gIGludDMyX3QgZ2V0SW50ZXJsZWF2ZWRCbG9ja0NvdW50KCk7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19EQVRBTUFUUklYU1lNQk9MSU5GTzE0NF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhXcml0ZXIuY3BwIGIveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhXcml0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWNlNzk4Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EYXRhTWF0cml4V3JpdGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0vLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6Ci0vKgotICogQ29weXJpZ2h0IDIwMDggWlhpbmcgYXV0aG9ycwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9CQ19EaW1lbnNpb24uaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL0JDX1R3b0RpbVdyaXRlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL0JDX1dyaXRlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVNYXRyaXguaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfQVNDSUlFbmNvZGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Jhc2UyNTZFbmNvZGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0M0MEVuY29kZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFN5bWJvbEluZm8xNDQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFdyaXRlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EZWZhdWx0UGxhY2VtZW50LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VkaWZhY3RFbmNvZGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2RlckNvbnRleHQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRXJyb3JDb3JyZWN0aW9uLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0hpZ2hMZXZlbEVuY29kZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sSW5mby5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xTaGFwZUhpbnQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfVGV4dEVuY29kZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfWDEyRW5jb2Rlci5oIgotCi1DQkNfRGF0YU1hdHJpeFdyaXRlcjo6Q0JDX0RhdGFNYXRyaXhXcml0ZXIoKSB7fQotQ0JDX0RhdGFNYXRyaXhXcml0ZXI6On5DQkNfRGF0YU1hdHJpeFdyaXRlcigpIHt9Ci1ib29sIENCQ19EYXRhTWF0cml4V3JpdGVyOjpTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGxldmVsKSB7Ci0gIG1faUNvcnJlY3RMZXZlbCA9IGxldmVsOwotICByZXR1cm4gdHJ1ZTsKLX0KLXVpbnQ4X3QqIENCQ19EYXRhTWF0cml4V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGlmIChvdXRXaWR0aCA8IDAgfHwgb3V0SGVpZ2h0IDwgMCkgewotICAgIGUgPSBCQ0V4Y2VwdGlvbkhlaWdodEFuZFdpZHRoTXVzdEJlQXRMZWFzdDE7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgQ0JDX1N5bWJvbFNoYXBlSGludDo6U3ltYm9sU2hhcGVIaW50IHNoYXBlID0KLSAgICAgIENCQ19TeW1ib2xTaGFwZUhpbnQ6OkZPUkNFX1NRVUFSRTsKLSAgQ0JDX0RpbWVuc2lvbiogbWluU2l6ZSA9IG51bGxwdHI7Ci0gIENCQ19EaW1lbnNpb24qIG1heFNpemUgPSBudWxscHRyOwotICBDRlhfV2lkZVN0cmluZyBlY0xldmVsOwotICBDRlhfV2lkZVN0cmluZyBlbmNvZGVkID0gQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmVuY29kZUhpZ2hMZXZlbCgKLSAgICAgIGNvbnRlbnRzLCBlY0xldmVsLCBzaGFwZSwgbWluU2l6ZSwgbWF4U2l6ZSwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIENCQ19TeW1ib2xJbmZvKiBzeW1ib2xJbmZvID0gQ0JDX1N5bWJvbEluZm86Omxvb2t1cCgKLSAgICAgIGVuY29kZWQuR2V0TGVuZ3RoKCksIHNoYXBlLCBtaW5TaXplLCBtYXhTaXplLCB0cnVlLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgQ0ZYX1dpZGVTdHJpbmcgY29kZXdvcmRzID0KLSAgICAgIENCQ19FcnJvckNvcnJlY3Rpb246OmVuY29kZUVDQzIwMChlbmNvZGVkLCBzeW1ib2xJbmZvLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgQ0JDX0RlZmF1bHRQbGFjZW1lbnQqIHBsYWNlbWVudCA9Ci0gICAgICBuZXcgQ0JDX0RlZmF1bHRQbGFjZW1lbnQoY29kZXdvcmRzLCBzeW1ib2xJbmZvLT5nZXRTeW1ib2xEYXRhV2lkdGgoZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sSW5mby0+Z2V0U3ltYm9sRGF0YUhlaWdodChlKSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIHBsYWNlbWVudC0+cGxhY2UoKTsKLSAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIGJ5dGVtYXRyaXggPSBlbmNvZGVMb3dMZXZlbChwbGFjZW1lbnQsIHN5bWJvbEluZm8sIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBudWxscHRyOwotICBvdXRXaWR0aCA9IGJ5dGVtYXRyaXgtPkdldFdpZHRoKCk7Ci0gIG91dEhlaWdodCA9IGJ5dGVtYXRyaXgtPkdldEhlaWdodCgpOwotICB1aW50OF90KiByZXN1bHQgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIG91dFdpZHRoLCBvdXRIZWlnaHQpOwotICBGWFNZU19tZW1jcHkocmVzdWx0LCBieXRlbWF0cml4LT5HZXRBcnJheSgpLCBvdXRXaWR0aCAqIG91dEhlaWdodCk7Ci0gIGRlbGV0ZSBieXRlbWF0cml4OwotICBkZWxldGUgcGxhY2VtZW50OwotICByZXR1cm4gcmVzdWx0OwotfQotQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIENCQ19EYXRhTWF0cml4V3JpdGVyOjplbmNvZGVMb3dMZXZlbCgKLSAgICBDQkNfRGVmYXVsdFBsYWNlbWVudCogcGxhY2VtZW50LAotICAgIENCQ19TeW1ib2xJbmZvKiBzeW1ib2xJbmZvLAotICAgIGludDMyX3QmIGUpIHsKLSAgaW50MzJfdCBzeW1ib2xXaWR0aCA9IHN5bWJvbEluZm8tPmdldFN5bWJvbERhdGFXaWR0aChlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgaW50MzJfdCBzeW1ib2xIZWlnaHQgPSBzeW1ib2xJbmZvLT5nZXRTeW1ib2xEYXRhSGVpZ2h0KGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBudWxscHRyOwotICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4ID0gbmV3IENCQ19Db21tb25CeXRlTWF0cml4KAotICAgICAgc3ltYm9sSW5mby0+Z2V0U3ltYm9sV2lkdGgoZSksIHN5bWJvbEluZm8tPmdldFN5bWJvbEhlaWdodChlKSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIG1hdHJpeC0+SW5pdCgpOwotICBpbnQzMl90IG1hdHJpeFkgPSAwOwotICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCBzeW1ib2xIZWlnaHQ7IHkrKykgewotICAgIGludDMyX3QgbWF0cml4WDsKLSAgICBpZiAoKHkgJSBzeW1ib2xJbmZvLT5tX21hdHJpeEhlaWdodCkgPT0gMCkgewotICAgICAgbWF0cml4WCA9IDA7Ci0gICAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBzeW1ib2xJbmZvLT5nZXRTeW1ib2xXaWR0aChlKTsgeCsrKSB7Ci0gICAgICAgIG1hdHJpeC0+U2V0KG1hdHJpeFgsIG1hdHJpeFksICh4ICUgMikgPT0gMCk7Ci0gICAgICAgIG1hdHJpeFgrKzsKLSAgICAgIH0KLSAgICAgIG1hdHJpeFkrKzsKLSAgICB9Ci0gICAgbWF0cml4WCA9IDA7Ci0gICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgc3ltYm9sV2lkdGg7IHgrKykgewotICAgICAgaWYgKCh4ICUgc3ltYm9sSW5mby0+bV9tYXRyaXhXaWR0aCkgPT0gMCkgewotICAgICAgICBtYXRyaXgtPlNldChtYXRyaXhYLCBtYXRyaXhZLCB0cnVlKTsKLSAgICAgICAgbWF0cml4WCsrOwotICAgICAgfQotICAgICAgbWF0cml4LT5TZXQobWF0cml4WCwgbWF0cml4WSwgcGxhY2VtZW50LT5nZXRCaXQoeCwgeSkpOwotICAgICAgbWF0cml4WCsrOwotICAgICAgaWYgKCh4ICUgc3ltYm9sSW5mby0+bV9tYXRyaXhXaWR0aCkgPT0gc3ltYm9sSW5mby0+bV9tYXRyaXhXaWR0aCAtIDEpIHsKLSAgICAgICAgbWF0cml4LT5TZXQobWF0cml4WCwgbWF0cml4WSwgKHkgJSAyKSA9PSAwKTsKLSAgICAgICAgbWF0cml4WCsrOwotICAgICAgfQotICAgIH0KLSAgICBtYXRyaXhZKys7Ci0gICAgaWYgKCh5ICUgc3ltYm9sSW5mby0+bV9tYXRyaXhIZWlnaHQpID09IHN5bWJvbEluZm8tPm1fbWF0cml4SGVpZ2h0IC0gMSkgewotICAgICAgbWF0cml4WCA9IDA7Ci0gICAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBzeW1ib2xJbmZvLT5nZXRTeW1ib2xXaWR0aChlKTsgeCsrKSB7Ci0gICAgICAgIG1hdHJpeC0+U2V0KG1hdHJpeFgsIG1hdHJpeFksIHRydWUpOwotICAgICAgICBtYXRyaXhYKys7Ci0gICAgICB9Ci0gICAgICBtYXRyaXhZKys7Ci0gICAgfQotICB9Ci0gIHJldHVybiBtYXRyaXg7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFdyaXRlci5oIGIveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhXcml0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYxNDE3Yi4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGF0YU1hdHJpeFdyaXRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19EQVRBTUFUUklYV1JJVEVSX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19EQVRBTUFUUklYV1JJVEVSX0hfCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL0JDX1R3b0RpbVdyaXRlci5oIgotCi1jbGFzcyBDQkNfQ29tbW9uQnl0ZU1hdHJpeDsKLWNsYXNzIENCQ19EZWZhdWx0UGxhY2VtZW50OwotY2xhc3MgQ0JDX1N5bWJvbEluZm87Ci0KLWNsYXNzIENCQ19EYXRhTWF0cml4V3JpdGVyIDogcHVibGljIENCQ19Ud29EaW1Xcml0ZXIgewotIHB1YmxpYzoKLSAgQ0JDX0RhdGFNYXRyaXhXcml0ZXIoKTsKLSAgfkNCQ19EYXRhTWF0cml4V3JpdGVyKCkgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLQotICAvLyBDQkNfVHdvRGltV3JpdGVyCi0gIGJvb2wgU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBsZXZlbCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIGVuY29kZUxvd0xldmVsKENCQ19EZWZhdWx0UGxhY2VtZW50KiBwbGFjZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1N5bWJvbEluZm8qIHN5bWJvbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7Ci0gIGludDMyX3QgbV9pQ29ycmVjdExldmVsOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfREFUQU1BVFJJWFdSSVRFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RlZmF1bHRQbGFjZW1lbnQuY3BwIGIveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RlZmF1bHRQbGFjZW1lbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2VlZjA3Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19EZWZhdWx0UGxhY2VtZW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0vLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6Ci0vKgotICogQ29weXJpZ2h0IDIwMDYgSmVyZW1pYXMgTWFlcmtpLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RlZmF1bHRQbGFjZW1lbnQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2Rlci5oIgotCi1DQkNfRGVmYXVsdFBsYWNlbWVudDo6Q0JDX0RlZmF1bHRQbGFjZW1lbnQoQ0ZYX1dpZGVTdHJpbmcgY29kZXdvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtY29scywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bXJvd3MpIHsKLSAgbV9jb2Rld29yZHMgPSBjb2Rld29yZHM7Ci0gIG1fbnVtY29scyA9IG51bWNvbHM7Ci0gIG1fbnVtcm93cyA9IG51bXJvd3M7Ci0gIG1fYml0cy5TZXRTaXplKG51bWNvbHMgKiBudW1yb3dzKTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtY29scyAqIG51bXJvd3M7IGkrKykgewotICAgIG1fYml0c1tpXSA9ICh1aW50OF90KTI7Ci0gIH0KLX0KLUNCQ19EZWZhdWx0UGxhY2VtZW50Ojp+Q0JDX0RlZmF1bHRQbGFjZW1lbnQoKSB7Ci0gIG1fYml0cy5SZW1vdmVBbGwoKTsKLX0KLWludDMyX3QgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OmdldE51bXJvd3MoKSB7Ci0gIHJldHVybiBtX251bXJvd3M7Ci19Ci1pbnQzMl90IENCQ19EZWZhdWx0UGxhY2VtZW50OjpnZXROdW1jb2xzKCkgewotICByZXR1cm4gbV9udW1jb2xzOwotfQotQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdD4mIENCQ19EZWZhdWx0UGxhY2VtZW50OjpnZXRCaXRzKCkgewotICByZXR1cm4gbV9iaXRzOwotfQotYm9vbCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6Z2V0Qml0KGludDMyX3QgY29sLCBpbnQzMl90IHJvdykgewotICByZXR1cm4gbV9iaXRzW3JvdyAqIG1fbnVtY29scyArIGNvbF0gPT0gMTsKLX0KLXZvaWQgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OnNldEJpdChpbnQzMl90IGNvbCwgaW50MzJfdCByb3csIGJvb2wgYml0KSB7Ci0gIG1fYml0c1tyb3cgKiBtX251bWNvbHMgKyBjb2xdID0gYml0ID8gKHVpbnQ4X3QpMSA6ICh1aW50OF90KTA7Ci19Ci1ib29sIENCQ19EZWZhdWx0UGxhY2VtZW50OjpoYXNCaXQoaW50MzJfdCBjb2wsIGludDMyX3Qgcm93KSB7Ci0gIHJldHVybiBtX2JpdHNbcm93ICogbV9udW1jb2xzICsgY29sXSAhPSAyOwotfQotdm9pZCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6cGxhY2UoKSB7Ci0gIGludDMyX3QgcG9zID0gMDsKLSAgaW50MzJfdCByb3cgPSA0OwotICBpbnQzMl90IGNvbCA9IDA7Ci0gIGRvIHsKLSAgICBpZiAoKHJvdyA9PSBtX251bXJvd3MpICYmIChjb2wgPT0gMCkpIHsKLSAgICAgIGNvcm5lcjEocG9zKyspOwotICAgIH0KLSAgICBpZiAoKHJvdyA9PSBtX251bXJvd3MgLSAyKSAmJiAoY29sID09IDApICYmICgobV9udW1jb2xzICUgNCkgIT0gMCkpIHsKLSAgICAgIGNvcm5lcjIocG9zKyspOwotICAgIH0KLSAgICBpZiAoKHJvdyA9PSBtX251bXJvd3MgLSAyKSAmJiAoY29sID09IDApICYmIChtX251bWNvbHMgJSA4ID09IDQpKSB7Ci0gICAgICBjb3JuZXIzKHBvcysrKTsKLSAgICB9Ci0gICAgaWYgKChyb3cgPT0gbV9udW1yb3dzICsgNCkgJiYgKGNvbCA9PSAyKSAmJiAoKG1fbnVtY29scyAlIDgpID09IDApKSB7Ci0gICAgICBjb3JuZXI0KHBvcysrKTsKLSAgICB9Ci0gICAgZG8gewotICAgICAgaWYgKChyb3cgPCBtX251bXJvd3MpICYmIChjb2wgPj0gMCkgJiYgIWhhc0JpdChjb2wsIHJvdykpIHsKLSAgICAgICAgdXRhaChyb3csIGNvbCwgcG9zKyspOwotICAgICAgfQotICAgICAgcm93IC09IDI7Ci0gICAgICBjb2wgKz0gMjsKLSAgICB9IHdoaWxlIChyb3cgPj0gMCAmJiAoY29sIDwgbV9udW1jb2xzKSk7Ci0gICAgcm93Kys7Ci0gICAgY29sICs9IDM7Ci0gICAgZG8gewotICAgICAgaWYgKChyb3cgPj0gMCkgJiYgKGNvbCA8IG1fbnVtY29scykgJiYgIWhhc0JpdChjb2wsIHJvdykpIHsKLSAgICAgICAgdXRhaChyb3csIGNvbCwgcG9zKyspOwotICAgICAgfQotICAgICAgcm93ICs9IDI7Ci0gICAgICBjb2wgLT0gMjsKLSAgICB9IHdoaWxlICgocm93IDwgbV9udW1yb3dzKSAmJiAoY29sID49IDApKTsKLSAgICByb3cgKz0gMzsKLSAgICBjb2wrKzsKLSAgfSB3aGlsZSAoKHJvdyA8IG1fbnVtcm93cykgfHwgKGNvbCA8IG1fbnVtY29scykpOwotICBpZiAoIWhhc0JpdChtX251bWNvbHMgLSAxLCBtX251bXJvd3MgLSAxKSkgewotICAgIHNldEJpdChtX251bWNvbHMgLSAxLCBtX251bXJvd3MgLSAxLCB0cnVlKTsKLSAgICBzZXRCaXQobV9udW1jb2xzIC0gMiwgbV9udW1yb3dzIC0gMiwgdHJ1ZSk7Ci0gIH0KLX0KLXZvaWQgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6Om1vZHVsZShpbnQzMl90IHJvdywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJpdCkgewotICBpZiAocm93IDwgMCkgewotICAgIHJvdyArPSBtX251bXJvd3M7Ci0gICAgY29sICs9IDQgLSAoKG1fbnVtcm93cyArIDQpICUgOCk7Ci0gIH0KLSAgaWYgKGNvbCA8IDApIHsKLSAgICBjb2wgKz0gbV9udW1jb2xzOwotICAgIHJvdyArPSA0IC0gKChtX251bWNvbHMgKyA0KSAlIDgpOwotICB9Ci0gIGludDMyX3QgdiA9IG1fY29kZXdvcmRzLkdldEF0KHBvcyk7Ci0gIHYgJj0gMSA8PCAoOCAtIGJpdCk7Ci0gIHNldEJpdChjb2wsIHJvdywgdiAhPSAwKTsKLX0KLXZvaWQgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OnV0YWgoaW50MzJfdCByb3csIGludDMyX3QgY29sLCBpbnQzMl90IHBvcykgewotICBtb2R1bGUocm93IC0gMiwgY29sIC0gMiwgcG9zLCAxKTsKLSAgbW9kdWxlKHJvdyAtIDIsIGNvbCAtIDEsIHBvcywgMik7Ci0gIG1vZHVsZShyb3cgLSAxLCBjb2wgLSAyLCBwb3MsIDMpOwotICBtb2R1bGUocm93IC0gMSwgY29sIC0gMSwgcG9zLCA0KTsKLSAgbW9kdWxlKHJvdyAtIDEsIGNvbCwgcG9zLCA1KTsKLSAgbW9kdWxlKHJvdywgY29sIC0gMiwgcG9zLCA2KTsKLSAgbW9kdWxlKHJvdywgY29sIC0gMSwgcG9zLCA3KTsKLSAgbW9kdWxlKHJvdywgY29sLCBwb3MsIDgpOwotfQotdm9pZCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6Y29ybmVyMShpbnQzMl90IHBvcykgewotICBtb2R1bGUobV9udW1yb3dzIC0gMSwgMCwgcG9zLCAxKTsKLSAgbW9kdWxlKG1fbnVtcm93cyAtIDEsIDEsIHBvcywgMik7Ci0gIG1vZHVsZShtX251bXJvd3MgLSAxLCAyLCBwb3MsIDMpOwotICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMiwgcG9zLCA0KTsKLSAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDEsIHBvcywgNSk7Ci0gIG1vZHVsZSgxLCBtX251bWNvbHMgLSAxLCBwb3MsIDYpOwotICBtb2R1bGUoMiwgbV9udW1jb2xzIC0gMSwgcG9zLCA3KTsKLSAgbW9kdWxlKDMsIG1fbnVtY29scyAtIDEsIHBvcywgOCk7Ci19Ci12b2lkIENCQ19EZWZhdWx0UGxhY2VtZW50Ojpjb3JuZXIyKGludDMyX3QgcG9zKSB7Ci0gIG1vZHVsZShtX251bXJvd3MgLSAzLCAwLCBwb3MsIDEpOwotICBtb2R1bGUobV9udW1yb3dzIC0gMiwgMCwgcG9zLCAyKTsKLSAgbW9kdWxlKG1fbnVtcm93cyAtIDEsIDAsIHBvcywgMyk7Ci0gIG1vZHVsZSgwLCBtX251bWNvbHMgLSA0LCBwb3MsIDQpOwotICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMywgcG9zLCA1KTsKLSAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDIsIHBvcywgNik7Ci0gIG1vZHVsZSgwLCBtX251bWNvbHMgLSAxLCBwb3MsIDcpOwotICBtb2R1bGUoMSwgbV9udW1jb2xzIC0gMSwgcG9zLCA4KTsKLX0KLXZvaWQgQ0JDX0RlZmF1bHRQbGFjZW1lbnQ6OmNvcm5lcjMoaW50MzJfdCBwb3MpIHsKLSAgbW9kdWxlKG1fbnVtcm93cyAtIDMsIDAsIHBvcywgMSk7Ci0gIG1vZHVsZShtX251bXJvd3MgLSAyLCAwLCBwb3MsIDIpOwotICBtb2R1bGUobV9udW1yb3dzIC0gMSwgMCwgcG9zLCAzKTsKLSAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDIsIHBvcywgNCk7Ci0gIG1vZHVsZSgwLCBtX251bWNvbHMgLSAxLCBwb3MsIDUpOwotICBtb2R1bGUoMSwgbV9udW1jb2xzIC0gMSwgcG9zLCA2KTsKLSAgbW9kdWxlKDIsIG1fbnVtY29scyAtIDEsIHBvcywgNyk7Ci0gIG1vZHVsZSgzLCBtX251bWNvbHMgLSAxLCBwb3MsIDgpOwotfQotdm9pZCBDQkNfRGVmYXVsdFBsYWNlbWVudDo6Y29ybmVyNChpbnQzMl90IHBvcykgewotICBtb2R1bGUobV9udW1yb3dzIC0gMSwgMCwgcG9zLCAxKTsKLSAgbW9kdWxlKG1fbnVtcm93cyAtIDEsIG1fbnVtY29scyAtIDEsIHBvcywgMik7Ci0gIG1vZHVsZSgwLCBtX251bWNvbHMgLSAzLCBwb3MsIDMpOwotICBtb2R1bGUoMCwgbV9udW1jb2xzIC0gMiwgcG9zLCA0KTsKLSAgbW9kdWxlKDAsIG1fbnVtY29scyAtIDEsIHBvcywgNSk7Ci0gIG1vZHVsZSgxLCBtX251bWNvbHMgLSAzLCBwb3MsIDYpOwotICBtb2R1bGUoMSwgbV9udW1jb2xzIC0gMiwgcG9zLCA3KTsKLSAgbW9kdWxlKDEsIG1fbnVtY29scyAtIDEsIHBvcywgOCk7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGVmYXVsdFBsYWNlbWVudC5oIGIveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RlZmF1bHRQbGFjZW1lbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhN2FiMi4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRGVmYXVsdFBsYWNlbWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19ERUZBVUxUUExBQ0VNRU5UX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19ERUZBVUxUUExBQ0VNRU5UX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0KLWNsYXNzIENCQ19EZWZhdWx0UGxhY2VtZW50IHsKLSBwdWJsaWM6Ci0gIENCQ19EZWZhdWx0UGxhY2VtZW50KENGWF9XaWRlU3RyaW5nIGNvZGV3b3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1jb2xzLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bXJvd3MpOwotICB2aXJ0dWFsIH5DQkNfRGVmYXVsdFBsYWNlbWVudCgpOwotCi0gIGludDMyX3QgZ2V0TnVtcm93cygpOwotICBpbnQzMl90IGdldE51bWNvbHMoKTsKLSAgQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdD4mIGdldEJpdHMoKTsKLSAgYm9vbCBnZXRCaXQoaW50MzJfdCBjb2wsIGludDMyX3Qgcm93KTsKLSAgdm9pZCBzZXRCaXQoaW50MzJfdCBjb2wsIGludDMyX3Qgcm93LCBib29sIGJpdCk7Ci0gIGJvb2wgaGFzQml0KGludDMyX3QgY29sLCBpbnQzMl90IHJvdyk7Ci0gIHZvaWQgcGxhY2UoKTsKLQotIHByaXZhdGU6Ci0gIENGWF9XaWRlU3RyaW5nIG1fY29kZXdvcmRzOwotICBpbnQzMl90IG1fbnVtcm93czsKLSAgaW50MzJfdCBtX251bWNvbHM7Ci0gIENGWF9BcnJheVRlbXBsYXRlPHVpbnQ4X3Q+IG1fYml0czsKLSAgdm9pZCBtb2R1bGUoaW50MzJfdCByb3csIGludDMyX3QgY29sLCBpbnQzMl90IHBvcywgaW50MzJfdCBiaXQpOwotICB2b2lkIHV0YWgoaW50MzJfdCByb3csIGludDMyX3QgY29sLCBpbnQzMl90IHBvcyk7Ci0gIHZvaWQgY29ybmVyMShpbnQzMl90IHBvcyk7Ci0gIHZvaWQgY29ybmVyMihpbnQzMl90IHBvcyk7Ci0gIHZvaWQgY29ybmVyMyhpbnQzMl90IHBvcyk7Ci0gIHZvaWQgY29ybmVyNChpbnQzMl90IHBvcyk7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19ERUZBVUxUUExBQ0VNRU5UX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRWRpZmFjdEVuY29kZXIuY3BwIGIveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VkaWZhY3RFbmNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RiMTE3ZC4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRWRpZmFjdEVuY29kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLS8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNi0yMDA3IEplcmVtaWFzIE1hZXJraS4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvQkNfRGltZW5zaW9uLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VkaWZhY3RFbmNvZGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2RlckNvbnRleHQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfSGlnaExldmVsRW5jb2Rlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbFNoYXBlSGludC5oIgotCi1DQkNfRWRpZmFjdEVuY29kZXI6OkNCQ19FZGlmYWN0RW5jb2RlcigpIHt9Ci1DQkNfRWRpZmFjdEVuY29kZXI6On5DQkNfRWRpZmFjdEVuY29kZXIoKSB7fQotaW50MzJfdCBDQkNfRWRpZmFjdEVuY29kZXI6OmdldEVuY29kaW5nTW9kZSgpIHsKLSAgcmV0dXJuIEVESUZBQ1RfRU5DT0RBVElPTjsKLX0KLXZvaWQgQ0JDX0VkaWZhY3RFbmNvZGVyOjpFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LCBpbnQzMl90JiBlKSB7Ci0gIENGWF9XaWRlU3RyaW5nIGJ1ZmZlcjsKLSAgd2hpbGUgKGNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSkgewotICAgIEZYX1dDSEFSIGMgPSBjb250ZXh0LmdldEN1cnJlbnRDaGFyKCk7Ci0gICAgZW5jb2RlQ2hhcihjLCBidWZmZXIsIGUpOwotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY29udGV4dC5tX3BvcysrOwotICAgIGludDMyX3QgY291bnQgPSBidWZmZXIuR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKGNvdW50ID49IDQpIHsKLSAgICAgIGNvbnRleHQud3JpdGVDb2Rld29yZHMoZW5jb2RlVG9Db2Rld29yZHMoYnVmZmVyLCAwLCBlKSk7Ci0gICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGJ1ZmZlci5EZWxldGUoMCwgNCk7Ci0gICAgICBpbnQzMl90IG5ld01vZGUgPSBDQkNfSGlnaExldmVsRW5jb2Rlcjo6bG9va0FoZWFkVGVzdCgKLSAgICAgICAgICBjb250ZXh0Lm1fbXNnLCBjb250ZXh0Lm1fcG9zLCBnZXRFbmNvZGluZ01vZGUoKSk7Ci0gICAgICBpZiAobmV3TW9kZSAhPSBnZXRFbmNvZGluZ01vZGUoKSkgewotICAgICAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoQVNDSUlfRU5DT0RBVElPTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICBidWZmZXIgKz0gKEZYX1dDSEFSKTMxOwotICBoYW5kbGVFT0QoY29udGV4dCwgYnVmZmVyLCBlKTsKLX0KLXZvaWQgQ0JDX0VkaWZhY3RFbmNvZGVyOjpoYW5kbGVFT0QoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgaW50MzJfdCBjb3VudCA9IGJ1ZmZlci5HZXRMZW5ndGgoKTsKLSAgaWYgKGNvdW50ID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGNvdW50ID09IDEpIHsKLSAgICBjb250ZXh0LnVwZGF0ZVN5bWJvbEluZm8oZSk7Ci0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQzMl90IGF2YWlsYWJsZSA9Ci0gICAgICAgIGNvbnRleHQubV9zeW1ib2xJbmZvLT5tX2RhdGFDYXBhY2l0eSAtIGNvbnRleHQuZ2V0Q29kZXdvcmRDb3VudCgpOwotICAgIGludDMyX3QgcmVtYWluaW5nID0gY29udGV4dC5nZXRSZW1haW5pbmdDaGFyYWN0ZXJzKCk7Ci0gICAgaWYgKHJlbWFpbmluZyA9PSAwICYmIGF2YWlsYWJsZSA8PSAyKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIGlmIChjb3VudCA+IDQpIHsKLSAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsU3RhdGVDb3VudE11c3ROb3RFeGNlZWQ0OwotICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IHJlc3RDaGFycyA9IGNvdW50IC0gMTsKLSAgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlZCA9IGVuY29kZVRvQ29kZXdvcmRzKGJ1ZmZlciwgMCwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgYm9vbCBlbmRPZlN5bWJvbFJlYWNoZWQgPSAhY29udGV4dC5oYXNNb3JlQ2hhcmFjdGVycygpOwotICBib29sIHJlc3RJbkFzY2lpID0gZW5kT2ZTeW1ib2xSZWFjaGVkICYmIHJlc3RDaGFycyA8PSAyOwotICBpZiAocmVzdENoYXJzIDw9IDIpIHsKLSAgICBjb250ZXh0LnVwZGF0ZVN5bWJvbEluZm8oY29udGV4dC5nZXRDb2Rld29yZENvdW50KCkgKyByZXN0Q2hhcnMsIGUpOwotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50MzJfdCBhdmFpbGFibGUgPQotICAgICAgICBjb250ZXh0Lm1fc3ltYm9sSW5mby0+bV9kYXRhQ2FwYWNpdHkgLSBjb250ZXh0LmdldENvZGV3b3JkQ291bnQoKTsKLSAgICBpZiAoYXZhaWxhYmxlID49IDMpIHsKLSAgICAgIHJlc3RJbkFzY2lpID0gZmFsc2U7Ci0gICAgICBjb250ZXh0LnVwZGF0ZVN5bWJvbEluZm8oY29udGV4dC5nZXRDb2Rld29yZENvdW50KCkgKyBlbmNvZGVkLkdldExlbmd0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGlmIChyZXN0SW5Bc2NpaSkgewotICAgIGNvbnRleHQucmVzZXRTeW1ib2xJbmZvKCk7Ci0gICAgY29udGV4dC5tX3BvcyAtPSByZXN0Q2hhcnM7Ci0gIH0gZWxzZSB7Ci0gICAgY29udGV4dC53cml0ZUNvZGV3b3JkcyhlbmNvZGVkKTsKLSAgfQotICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoQVNDSUlfRU5DT0RBVElPTik7Ci19Ci12b2lkIENCQ19FZGlmYWN0RW5jb2Rlcjo6ZW5jb2RlQ2hhcihGWF9XQ0hBUiBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBpZiAoYyA+PSAnICcgJiYgYyA8PSAnPycpIHsKLSAgICBzYiArPSBjOwotICB9IGVsc2UgaWYgKGMgPj0gJ0AnICYmIGMgPD0gJ14nKSB7Ci0gICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gNjQpOwotICB9IGVsc2UgewotICAgIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppbGxlZ2FsQ2hhcmFjdGVyKGMsIGUpOwotICB9Ci19Ci1DRlhfV2lkZVN0cmluZyBDQkNfRWRpZmFjdEVuY29kZXI6OmVuY29kZVRvQ29kZXdvcmRzKENGWF9XaWRlU3RyaW5nIHNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0UG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGludDMyX3QgbGVuID0gc2IuR2V0TGVuZ3RoKCkgLSBzdGFydFBvczsKLSAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uTm9Db250ZW50czsKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgfQotICBGWF9XQ0hBUiBjMSA9IHNiLkdldEF0KHN0YXJ0UG9zKTsKLSAgRlhfV0NIQVIgYzIgPSBsZW4gPj0gMiA/IHNiLkdldEF0KHN0YXJ0UG9zICsgMSkgOiAwOwotICBGWF9XQ0hBUiBjMyA9IGxlbiA+PSAzID8gc2IuR2V0QXQoc3RhcnRQb3MgKyAyKSA6IDA7Ci0gIEZYX1dDSEFSIGM0ID0gbGVuID49IDQgPyBzYi5HZXRBdChzdGFydFBvcyArIDMpIDogMDsKLSAgaW50MzJfdCB2ID0gKGMxIDw8IDE4KSArIChjMiA8PCAxMikgKyAoYzMgPDwgNikgKyBjNDsKLSAgRlhfV0NIQVIgY3cxID0gKEZYX1dDSEFSKSgodiA+PiAxNikgJiAyNTUpOwotICBGWF9XQ0hBUiBjdzIgPSAoRlhfV0NIQVIpKCh2ID4+IDgpICYgMjU1KTsKLSAgRlhfV0NIQVIgY3czID0gKEZYX1dDSEFSKSh2ICYgMjU1KTsKLSAgQ0ZYX1dpZGVTdHJpbmcgcmVzOwotICByZXMgKz0gY3cxOwotICBpZiAobGVuID49IDIpIHsKLSAgICByZXMgKz0gY3cyOwotICB9Ci0gIGlmIChsZW4gPj0gMykgewotICAgIHJlcyArPSBjdzM7Ci0gIH0KLSAgcmV0dXJuIHJlczsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FZGlmYWN0RW5jb2Rlci5oIGIveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VkaWZhY3RFbmNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYjc2MmYuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VkaWZhY3RFbmNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX0VESUZBQ1RFTkNPREVSX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19FRElGQUNURU5DT0RFUl9IXwotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuaCIKLQotY2xhc3MgQ0JDX0VkaWZhY3RFbmNvZGVyIDogcHVibGljIENCQ19FbmNvZGVyIHsKLSBwdWJsaWM6Ci0gIENCQ19FZGlmYWN0RW5jb2RlcigpOwotICB+Q0JDX0VkaWZhY3RFbmNvZGVyKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ0JDX0VuY29kZXIKLSAgaW50MzJfdCBnZXRFbmNvZGluZ01vZGUoKSBvdmVycmlkZTsKLSAgdm9pZCBFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LCBpbnQzMl90JiBlKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHN0YXRpYyB2b2lkIGhhbmRsZUVPRChDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIHZvaWQgZW5jb2RlQ2hhcihGWF9XQ0hBUiBjLCBDRlhfV2lkZVN0cmluZyYgc2IsIGludDMyX3QmIGUpOwotICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlVG9Db2Rld29yZHMoQ0ZYX1dpZGVTdHJpbmcgc2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0UG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19FRElGQUNURU5DT0RFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuY3BwIGIveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjgxNWJkLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmgiCi0KLUNCQ19FbmNvZGVyOjpDQkNfRW5jb2RlcigpIHt9Ci1DQkNfRW5jb2Rlcjo6fkNCQ19FbmNvZGVyKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmggYi94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGEyMjNmLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX0VOQ09ERVJfSF8KLSNkZWZpbmUgWEZBX0ZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX0VOQ09ERVJfSF8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvdXRpbHMuaCIKLQotY2xhc3MgQ0JDX0VuY29kZXJDb250ZXh0OwotCi1jbGFzcyBDQkNfRW5jb2RlciB7Ci0gcHVibGljOgotICBDQkNfRW5jb2RlcigpOwotICB2aXJ0dWFsIH5DQkNfRW5jb2RlcigpOwotCi0gIHZpcnR1YWwgaW50MzJfdCBnZXRFbmNvZGluZ01vZGUoKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LCBpbnQzMl90JiBlKSA9IDA7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19FTkNPREVSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2RlckNvbnRleHQuY3BwIGIveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXJDb250ZXh0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAxYjMxMi4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2RlckNvbnRleHQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLS8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNi0yMDA3IEplcmVtaWFzIE1hZXJraS4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvQkNfRGltZW5zaW9uLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9CQ19VdGlsQ29kaW5nQ29udmVydC5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXJDb250ZXh0LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sU2hhcGVIaW50LmgiCi0KLUNCQ19FbmNvZGVyQ29udGV4dDo6Q0JDX0VuY29kZXJDb250ZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nIG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIGVjTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIENGWF9CeXRlU3RyaW5nIGRzdHN0cjsKLSAgQ0JDX1V0aWxDb2RpbmdDb252ZXJ0OjpVbmljb2RlVG9VVEY4KG1zZywgZHN0c3RyKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgc2I7Ci0gIGludDMyX3QgYyA9IGRzdHN0ci5HZXRMZW5ndGgoKTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYzsgaSsrKSB7Ci0gICAgRlhfV0NIQVIgY2ggPSAoRlhfV0NIQVIpKGRzdHN0ci5HZXRBdChpKSAmIDB4ZmYpOwotICAgIGlmIChjaCA9PSAnPycgJiYgZHN0c3RyLkdldEF0KGkpICE9ICc/JykgewotICAgICAgZSA9IEJDRXhjZXB0aW9uQ2hhcmFjdGVyc091dHNpZGVJU084ODU5MUVuY29kaW5nOwotICAgIH0KLSAgICBzYiArPSBjaDsKLSAgfQotICBtX21zZyA9IHNiOwotICBtX3NoYXBlID0gRk9SQ0VfTk9ORTsKLSAgbV9uZXdFbmNvZGluZyA9IC0xOwotICBtX3BvcyA9IDA7Ci0gIG1fc3ltYm9sSW5mbyA9IG51bGxwdHI7Ci0gIG1fc2tpcEF0RW5kID0gMDsKLSAgbV9tYXhTaXplID0gbnVsbHB0cjsKLSAgbV9taW5TaXplID0gbnVsbHB0cjsKLX0KLUNCQ19FbmNvZGVyQ29udGV4dDo6fkNCQ19FbmNvZGVyQ29udGV4dCgpIHt9Ci12b2lkIENCQ19FbmNvZGVyQ29udGV4dDo6c2V0U3ltYm9sU2hhcGUoU3ltYm9sU2hhcGVIaW50IHNoYXBlKSB7Ci0gIG1fc2hhcGUgPSBzaGFwZTsKLX0KLXZvaWQgQ0JDX0VuY29kZXJDb250ZXh0OjpzZXRTaXplQ29uc3RyYWludHMoQ0JDX0RpbWVuc2lvbiogbWluU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0RpbWVuc2lvbiogbWF4U2l6ZSkgewotICBtX21heFNpemUgPSBtYXhTaXplOwotICBtX21pblNpemUgPSBtaW5TaXplOwotfQotQ0ZYX1dpZGVTdHJpbmcgQ0JDX0VuY29kZXJDb250ZXh0OjpnZXRNZXNzYWdlKCkgewotICByZXR1cm4gbV9tc2c7Ci19Ci12b2lkIENCQ19FbmNvZGVyQ29udGV4dDo6c2V0U2tpcEF0RW5kKGludDMyX3QgY291bnQpIHsKLSAgbV9za2lwQXRFbmQgPSBjb3VudDsKLX0KLUZYX1dDSEFSIENCQ19FbmNvZGVyQ29udGV4dDo6Z2V0Q3VycmVudENoYXIoKSB7Ci0gIHJldHVybiBtX21zZy5HZXRBdChtX3Bvcyk7Ci19Ci1GWF9XQ0hBUiBDQkNfRW5jb2RlckNvbnRleHQ6OmdldEN1cnJlbnQoKSB7Ci0gIHJldHVybiBtX21zZy5HZXRBdChtX3Bvcyk7Ci19Ci12b2lkIENCQ19FbmNvZGVyQ29udGV4dDo6d3JpdGVDb2Rld29yZHMoQ0ZYX1dpZGVTdHJpbmcgY29kZXdvcmRzKSB7Ci0gIG1fY29kZXdvcmRzICs9IGNvZGV3b3JkczsKLX0KLXZvaWQgQ0JDX0VuY29kZXJDb250ZXh0Ojp3cml0ZUNvZGV3b3JkKEZYX1dDSEFSIGNvZGV3b3JkKSB7Ci0gIG1fY29kZXdvcmRzICs9IGNvZGV3b3JkOwotfQotaW50MzJfdCBDQkNfRW5jb2RlckNvbnRleHQ6OmdldENvZGV3b3JkQ291bnQoKSB7Ci0gIHJldHVybiBtX2NvZGV3b3Jkcy5HZXRMZW5ndGgoKTsKLX0KLXZvaWQgQ0JDX0VuY29kZXJDb250ZXh0OjpzaWduYWxFbmNvZGVyQ2hhbmdlKGludDMyX3QgZW5jb2RpbmcpIHsKLSAgbV9uZXdFbmNvZGluZyA9IGVuY29kaW5nOwotfQotdm9pZCBDQkNfRW5jb2RlckNvbnRleHQ6OnJlc2V0RW5jb2RlclNpZ25hbCgpIHsKLSAgbV9uZXdFbmNvZGluZyA9IC0xOwotfQotYm9vbCBDQkNfRW5jb2RlckNvbnRleHQ6Omhhc01vcmVDaGFyYWN0ZXJzKCkgewotICByZXR1cm4gbV9wb3MgPCBnZXRUb3RhbE1lc3NhZ2VDaGFyQ291bnQoKTsKLX0KLWludDMyX3QgQ0JDX0VuY29kZXJDb250ZXh0OjpnZXRSZW1haW5pbmdDaGFyYWN0ZXJzKCkgewotICByZXR1cm4gZ2V0VG90YWxNZXNzYWdlQ2hhckNvdW50KCkgLSBtX3BvczsKLX0KLXZvaWQgQ0JDX0VuY29kZXJDb250ZXh0Ojp1cGRhdGVTeW1ib2xJbmZvKGludDMyX3QmIGUpIHsKLSAgdXBkYXRlU3ltYm9sSW5mbyhnZXRDb2Rld29yZENvdW50KCksIGUpOwotfQotdm9pZCBDQkNfRW5jb2RlckNvbnRleHQ6OnVwZGF0ZVN5bWJvbEluZm8oaW50MzJfdCBsZW4sIGludDMyX3QmIGUpIHsKLSAgaWYgKCFtX3N5bWJvbEluZm8gfHwgbGVuID4gbV9zeW1ib2xJbmZvLT5tX2RhdGFDYXBhY2l0eSkgewotICAgIG1fc3ltYm9sSW5mbyA9Ci0gICAgICAgIENCQ19TeW1ib2xJbmZvOjpsb29rdXAobGVuLCBtX3NoYXBlLCBtX21pblNpemUsIG1fbWF4U2l6ZSwgdHJ1ZSwgZSk7Ci0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgIHJldHVybjsKLSAgfQotfQotdm9pZCBDQkNfRW5jb2RlckNvbnRleHQ6OnJlc2V0U3ltYm9sSW5mbygpIHsKLSAgbV9zaGFwZSA9IEZPUkNFX05PTkU7Ci19Ci1pbnQzMl90IENCQ19FbmNvZGVyQ29udGV4dDo6Z2V0VG90YWxNZXNzYWdlQ2hhckNvdW50KCkgewotICByZXR1cm4gbV9tc2cuR2V0TGVuZ3RoKCkgLSBtX3NraXBBdEVuZDsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyQ29udGV4dC5oIGIveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXJDb250ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMGVhNWQuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXJDb250ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX0VOQ09ERVJDT05URVhUX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19FTkNPREVSQ09OVEVYVF9IXwotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbFNoYXBlSGludC5oIgotCi1jbGFzcyBDQkNfU3ltYm9sSW5mbzsKLWNsYXNzIENCQ19EaW1lbnNpb247Ci0KLWNsYXNzIENCQ19FbmNvZGVyQ29udGV4dCA6IHB1YmxpYyBDQkNfU3ltYm9sU2hhcGVIaW50IHsKLSBwdWJsaWM6Ci0gIENCQ19FbmNvZGVyQ29udGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyBtc2csCi0gICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBlY0xldmVsLAotICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7Ci0gIH5DQkNfRW5jb2RlckNvbnRleHQoKSBvdmVycmlkZTsKLQotICB2b2lkIHNldFN5bWJvbFNoYXBlKFN5bWJvbFNoYXBlSGludCBzaGFwZSk7Ci0gIHZvaWQgc2V0U2l6ZUNvbnN0cmFpbnRzKENCQ19EaW1lbnNpb24qIG1pblNpemUsIENCQ19EaW1lbnNpb24qIG1heFNpemUpOwotICBDRlhfV2lkZVN0cmluZyBnZXRNZXNzYWdlKCk7Ci0gIHZvaWQgc2V0U2tpcEF0RW5kKGludDMyX3QgY291bnQpOwotICBGWF9XQ0hBUiBnZXRDdXJyZW50Q2hhcigpOwotICBGWF9XQ0hBUiBnZXRDdXJyZW50KCk7Ci0gIHZvaWQgd3JpdGVDb2Rld29yZHMoQ0ZYX1dpZGVTdHJpbmcgY29kZXdvcmRzKTsKLSAgdm9pZCB3cml0ZUNvZGV3b3JkKEZYX1dDSEFSIGNvZGV3b3JkKTsKLSAgaW50MzJfdCBnZXRDb2Rld29yZENvdW50KCk7Ci0gIHZvaWQgc2lnbmFsRW5jb2RlckNoYW5nZShpbnQzMl90IGVuY29kaW5nKTsKLSAgdm9pZCByZXNldEVuY29kZXJTaWduYWwoKTsKLSAgYm9vbCBoYXNNb3JlQ2hhcmFjdGVycygpOwotICBpbnQzMl90IGdldFJlbWFpbmluZ0NoYXJhY3RlcnMoKTsKLSAgdm9pZCB1cGRhdGVTeW1ib2xJbmZvKGludDMyX3QmIGUpOwotICB2b2lkIHVwZGF0ZVN5bWJvbEluZm8oaW50MzJfdCBsZW4sIGludDMyX3QmIGUpOwotICB2b2lkIHJlc2V0U3ltYm9sSW5mbygpOwotCi0gcHVibGljOgotICBDRlhfV2lkZVN0cmluZyBtX21zZzsKLSAgQ0ZYX1dpZGVTdHJpbmcgbV9jb2Rld29yZHM7Ci0gIGludDMyX3QgbV9wb3M7Ci0gIGludDMyX3QgbV9uZXdFbmNvZGluZzsKLSAgQ0JDX1N5bWJvbEluZm8qIG1fc3ltYm9sSW5mbzsKLQotIHByaXZhdGU6Ci0gIGludDMyX3QgZ2V0VG90YWxNZXNzYWdlQ2hhckNvdW50KCk7Ci0KLSBwcml2YXRlOgotICBTeW1ib2xTaGFwZUhpbnQgbV9zaGFwZTsKLSAgQ0JDX0RpbWVuc2lvbiogbV9taW5TaXplOwotICBDQkNfRGltZW5zaW9uKiBtX21heFNpemU7Ci0gIGludDMyX3QgbV9za2lwQXRFbmQ7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19FTkNPREVSQ09OVEVYVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Vycm9yQ29ycmVjdGlvbi5jcHAgYi94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRXJyb3JDb3JyZWN0aW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdlZWMxZS4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRXJyb3JDb3JyZWN0aW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0vLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6Ci0vKgotICogQ29weXJpZ2h0IDIwMDYgSmVyZW1pYXMgTWFlcmtpLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRXJyb3JDb3JyZWN0aW9uLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sU2hhcGVIaW50LmgiCi0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IHVpbnQ4X3QgRkFDVE9SX1NFVFNbXSA9IHs1LCAgNywgIDEwLCAxMSwgMTIsIDE0LCAxOCwgMjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQsIDI4LCAzNiwgNDIsIDQ4LCA1NiwgNjIsIDY4fTsKLQotY29uc3QgdWludDhfdCBGQUNUT1JTXzBbNV0gPSB7MjI4LCA0OCwgMTUsIDExMSwgNjJ9OwotY29uc3QgdWludDhfdCBGQUNUT1JTXzFbN10gPSB7MjMsIDY4LCAxNDQsIDEzNCwgMjQwLCA5MiwgMjU0fTsKLWNvbnN0IHVpbnQ4X3QgRkFDVE9SU18yWzEwXSA9IHsyOCwgMjQsIDE4NSwgMTY2LCAyMjMsIDI0OCwgMTE2LCAyNTUsIDExMCwgNjF9OwotY29uc3QgdWludDhfdCBGQUNUT1JTXzNbMTFdID0gezE3NSwgMTM4LCAyMDUsIDEyLCAxOTQsIDE2OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOSwgIDI0NSwgNjAsICA5NywgMTIwfTsKLQotY29uc3QgdWludDhfdCBGQUNUT1JTXzRbMTJdID0gezQxLCAgMTUzLCAxNTgsIDkxLCAgNjEsICA0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDIsIDIxMywgOTcsICAxNzgsIDEwMCwgMjQyfTsKLQotY29uc3QgdWludDhfdCBGQUNUT1JTXzVbMTRdID0gezE1NiwgOTcsICAxOTIsIDI1MiwgOTUsICA5LCAgMTU3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExOSwgMTM4LCA0NSwgIDE4LCAgMTg2LCA4MywgMTg1fTsKLQotY29uc3QgdWludDhfdCBGQUNUT1JTXzZbMThdID0gezgzLCAgMTk1LCAxMDAsIDM5LCAxODgsIDc1LCAgNjYsIDYxLCAyNDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEzLCAxMDksIDEyOSwgOTQsIDI1NCwgMjI1LCA0OCwgOTAsIDE4OH07Ci0KLWNvbnN0IHVpbnQ4X3QgRkFDVE9SU183WzIwXSA9IHsxNSwgIDE5NSwgMjQ0LCA5LCAgMjMzLCA3MSwgMTY4LCAyLCAgIDE4OCwgMTYwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1MywgMTQ1LCAyNTMsIDc5LCAxMDgsIDgyLCAyNywgIDE3NCwgMTg2LCAxNzJ9OwotCi1jb25zdCB1aW50OF90IEZBQ1RPUlNfOFsyNF0gPSB7NTIsICAxOTAsIDg4LCAgMjA1LCAxMDksIDM5LCAxNzYsIDIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1NSwgMTk3LCAyNTEsIDIyMywgMTU1LCAyMSwgNSwgICAxNzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU0LCAxMjQsIDEyLCAgMTgxLCAxODQsIDk2LCA1MCwgIDE5M307Ci0KLWNvbnN0IHVpbnQ4X3QgRkFDVE9SU185WzI4XSA9IHsyMTEsIDIzMSwgNDMsICA5NywgIDcxLCAgOTYsICAxMDMsIDE3NCwgMzcsICAxNTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcwLCA1MywgIDc1LCAgMzQsICAyNDksIDEyMSwgMTcsICAxMzgsIDExMCwgMjEzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0MSwgMTM2LCAxMjAsIDE1MSwgMjMzLCAxNjgsIDkzLCAgMjU1fTsKLQotY29uc3QgdWludDhfdCBGQUNUT1JTXzEwWzM2XSA9IHsyNDUsIDEyNywgMjQyLCAyMTgsIDEzMCwgMjUwLCAxNjIsIDE4MSwgMTAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAsIDg0LCAgMTc5LCAyMjAsIDI1MSwgODAsICAxODIsIDIyOSwgMTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsICAgNCwgICA2OCwgIDMzLCAgMTAxLCAxMzcsIDk1LCAgMTE5LCAxMTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0LCAgMTc1LCAxODQsIDU5LCAgMjUsICAyMjUsIDk4LCAgODEsICAxMTJ9OwotCi1jb25zdCB1aW50OF90IEZBQ1RPUlNfMTFbNDJdID0gewotICAgIDc3LCAgMTkzLCAxMzcsIDMxLCAgMTksICAzOCwgIDIyLCAgMTUzLCAyNDcsIDEwNSwgMTIyLCAyLCAgIDI0NSwgMTMzLAotICAgIDI0MiwgOCwgICAxNzUsIDk1LCAgMTAwLCA5LCAgIDE2NywgMTA1LCAyMTQsIDExMSwgNTcsICAxMjEsIDIxLCAgMSwKLSAgICAyNTMsIDU3LCAgNTQsICAxMDEsIDI0OCwgMjAyLCA2OSwgIDUwLCAgMTUwLCAxNzcsIDIyNiwgNSwgICA5LCAgIDV9OwotCi1jb25zdCB1aW50OF90IEZBQ1RPUlNfMTJbNDhdID0gewotICAgIDI0NSwgMTMyLCAxNzIsIDIyMywgOTYsICAzMiwgIDExNywgMjIsICAyMzgsIDEzMywgMjM4LCAyMzEsCi0gICAgMjA1LCAxODgsIDIzNywgODcsICAxOTEsIDEwNiwgMTYsICAxNDcsIDExOCwgMjMsICAzNywgIDkwLAotICAgIDE3MCwgMjA1LCAxMzEsIDg4LCAgMTIwLCAxMDAsIDY2LCAgMTM4LCAxODYsIDI0MCwgODIsICA0NCwKLSAgICAxNzYsIDg3LCAgMTg3LCAxNDcsIDE2MCwgMTc1LCA2OSwgIDIxMywgOTIsICAyNTMsIDIyNSwgMTl9OwotCi1jb25zdCB1aW50OF90IEZBQ1RPUlNfMTNbNTZdID0gewotICAgIDE3NSwgOSwgICAyMjMsIDIzOCwgMTIsICAxNywgIDIyMCwgMjA4LCAxMDAsIDI5LCAgMTc1LCAxNzAsIDIzMCwgMTkyLAotICAgIDIxNSwgMjM1LCAxNTAsIDE1OSwgMzYsICAyMjMsIDM4LCAgMjAwLCAxMzIsIDU0LCAgMjI4LCAxNDYsIDIxOCwgMjM0LAotICAgIDExNywgMjAzLCAyOSwgIDIzMiwgMTQ0LCAyMzgsIDIyLCAgMTUwLCAyMDEsIDExNywgNjIsICAyMDcsIDE2NCwgMTMsCi0gICAgMTM3LCAyNDUsIDEyNywgNjcsICAyNDcsIDI4LCAgMTU1LCA0MywgIDIwMywgMTA3LCAyMzMsIDUzLCAgMTQzLCA0Nn07Ci0KLWNvbnN0IHVpbnQ4X3QgRkFDVE9SU18xNFs2Ml0gPSB7Ci0gICAgMjQyLCA5MywgIDE2OSwgNTAsICAxNDQsIDIxMCwgMzksICAxMTgsIDIwMiwgMTg4LCAyMDEsIDE4OSwgMTQzLAotICAgIDEwOCwgMTk2LCAzNywgIDE4NSwgMTEyLCAxMzQsIDIzMCwgMjQ1LCA2MywgIDE5NywgMTkwLCAyNTAsIDEwNiwKLSAgICAxODUsIDIyMSwgMTc1LCA2NCwgIDExNCwgNzEsICAxNjEsIDQ0LCAgMTQ3LCA2LCAgIDI3LCAgMjE4LCA1MSwKLSAgICA2MywgIDg3LCAgMTAsICA0MCwgIDEzMCwgMTg4LCAxNywgIDE2MywgMzEsICAxNzYsIDE3MCwgNCwgICAxMDcsCi0gICAgMjMyLCA3LCAgIDk0LCAgMTY2LCAyMjQsIDEyNCwgODYsICA0NywgIDExLCAgMjA0fTsKLQotY29uc3QgdWludDhfdCBGQUNUT1JTXzE1WzY4XSA9IHsKLSAgICAyMjAsIDIyOCwgMTczLCA4OSwgIDI1MSwgMTQ5LCAxNTksIDU2LCAgODksICAzMywgIDE0NywgMjQ0LCAxNTQsIDM2LAotICAgIDczLCAgMTI3LCAyMTMsIDEzNiwgMjQ4LCAxODAsIDIzNCwgMTk3LCAxNTgsIDE3NywgNjgsICAxMjIsIDkzLCAgMjEzLAotICAgIDE1LCAgMTYwLCAyMjcsIDIzNiwgNjYsICAxMzksIDE1MywgMTg1LCAyMDIsIDE2NywgMTc5LCAyNSwgIDIyMCwgMjMyLAotICAgIDk2LCAgMjEwLCAyMzEsIDEzNiwgMjIzLCAyMzksIDE4MSwgMjQxLCA1OSwgIDUyLCAgMTcyLCAyNSwgIDQ5LCAgMjMyLAotICAgIDIxMSwgMTg5LCA2NCwgIDU0LCAgMTA4LCAxNTMsIDEzMiwgNjMsICA5NiwgIDEwMywgODIsICAxODZ9OwotCi1jb25zdCB1aW50OF90KiBjb25zdCBGQUNUT1JTWzE2XSA9IHsKLSAgICBGQUNUT1JTXzAsICBGQUNUT1JTXzEsICBGQUNUT1JTXzIsICBGQUNUT1JTXzMsIEZBQ1RPUlNfNCwgIEZBQ1RPUlNfNSwKLSAgICBGQUNUT1JTXzYsICBGQUNUT1JTXzcsICBGQUNUT1JTXzgsICBGQUNUT1JTXzksIEZBQ1RPUlNfMTAsIEZBQ1RPUlNfMTEsCi0gICAgRkFDVE9SU18xMiwgRkFDVE9SU18xMywgRkFDVE9SU18xNCwgRkFDVE9SU18xNX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1pbnQzMl90IENCQ19FcnJvckNvcnJlY3Rpb246Ok1PRFVMT19WQUxVRSA9IDB4MTJEOwotaW50MzJfdCBDQkNfRXJyb3JDb3JyZWN0aW9uOjpMT0dbMjU2XSA9IHswfTsKLWludDMyX3QgQ0JDX0Vycm9yQ29ycmVjdGlvbjo6QUxPR1syNTZdID0gezB9Owotdm9pZCBDQkNfRXJyb3JDb3JyZWN0aW9uOjpJbml0aWFsaXplKCkgewotICBpbnQzMl90IHAgPSAxOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAyNTU7IGkrKykgewotICAgIEFMT0dbaV0gPSBwOwotICAgIExPR1twXSA9IGk7Ci0gICAgcCA8PD0gMTsKLSAgICBpZiAocCA+PSAyNTYpIHsKLSAgICAgIHAgXj0gTU9EVUxPX1ZBTFVFOwotICAgIH0KLSAgfQotfQotdm9pZCBDQkNfRXJyb3JDb3JyZWN0aW9uOjpGaW5hbGl6ZSgpIHt9Ci1DQkNfRXJyb3JDb3JyZWN0aW9uOjpDQkNfRXJyb3JDb3JyZWN0aW9uKCkge30KLUNCQ19FcnJvckNvcnJlY3Rpb246On5DQkNfRXJyb3JDb3JyZWN0aW9uKCkge30KLUNGWF9XaWRlU3RyaW5nIENCQ19FcnJvckNvcnJlY3Rpb246OmVuY29kZUVDQzIwMChDRlhfV2lkZVN0cmluZyBjb2Rld29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1N5bWJvbEluZm8qIHN5bWJvbEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBpZiAoY29kZXdvcmRzLkdldExlbmd0aCgpICE9IHN5bWJvbEluZm8tPm1fZGF0YUNhcGFjaXR5KSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50OwotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotICB9Ci0gIENGWF9XaWRlU3RyaW5nIHNiOwotICBzYiArPSBjb2Rld29yZHM7Ci0gIGludDMyX3QgYmxvY2tDb3VudCA9IHN5bWJvbEluZm8tPmdldEludGVybGVhdmVkQmxvY2tDb3VudCgpOwotICBpZiAoYmxvY2tDb3VudCA9PSAxKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgZWNjID0KLSAgICAgICAgY3JlYXRlRUNDQmxvY2soY29kZXdvcmRzLCBzeW1ib2xJbmZvLT5tX2Vycm9yQ29kZXdvcmRzLCBlKTsKLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgc2IgKz0gZWNjOwotICB9IGVsc2UgewotICAgIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+IGRhdGFTaXplczsKLSAgICBkYXRhU2l6ZXMuU2V0U2l6ZShibG9ja0NvdW50KTsKLSAgICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiBlcnJvclNpemVzOwotICAgIGVycm9yU2l6ZXMuU2V0U2l6ZShibG9ja0NvdW50KTsKLSAgICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiBzdGFydFBvczsKLSAgICBzdGFydFBvcy5TZXRTaXplKGJsb2NrQ291bnQpOwotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGJsb2NrQ291bnQ7IGkrKykgewotICAgICAgZGF0YVNpemVzW2ldID0gc3ltYm9sSW5mby0+Z2V0RGF0YUxlbmd0aEZvckludGVybGVhdmVkQmxvY2soaSArIDEpOwotICAgICAgZXJyb3JTaXplc1tpXSA9IHN5bWJvbEluZm8tPmdldEVycm9yTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jayhpICsgMSk7Ci0gICAgICBzdGFydFBvc1tpXSA9IDA7Ci0gICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgc3RhcnRQb3NbaV0gPSBzdGFydFBvc1tpIC0gMV0gKyBkYXRhU2l6ZXNbaV07Ci0gICAgICB9Ci0gICAgfQotICAgIGZvciAoaW50MzJfdCBibG9jayA9IDA7IGJsb2NrIDwgYmxvY2tDb3VudDsgYmxvY2srKykgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgdGVtcDsKLSAgICAgIGZvciAoaW50MzJfdCBkID0gYmxvY2s7IGQgPCBzeW1ib2xJbmZvLT5tX2RhdGFDYXBhY2l0eTsgZCArPSBibG9ja0NvdW50KSB7Ci0gICAgICAgIHRlbXAgKz0gKEZYX1dDSEFSKWNvZGV3b3Jkcy5HZXRBdChkKTsKLSAgICAgIH0KLSAgICAgIENGWF9XaWRlU3RyaW5nIGVjYyA9IGNyZWF0ZUVDQ0Jsb2NrKHRlbXAsIGVycm9yU2l6ZXNbYmxvY2tdLCBlKTsKLSAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotICAgICAgaW50MzJfdCBwb3MgPSAwOwotICAgICAgZm9yIChpbnQzMl90IGwgPSBibG9jazsgbCA8IGVycm9yU2l6ZXNbYmxvY2tdICogYmxvY2tDb3VudDsKLSAgICAgICAgICAgbCArPSBibG9ja0NvdW50KSB7Ci0gICAgICAgIHNiLlNldEF0KHN5bWJvbEluZm8tPm1fZGF0YUNhcGFjaXR5ICsgbCwgZWNjLkdldEF0KHBvcysrKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzYjsKLX0KLUNGWF9XaWRlU3RyaW5nIENCQ19FcnJvckNvcnJlY3Rpb246OmNyZWF0ZUVDQ0Jsb2NrKENGWF9XaWRlU3RyaW5nIGNvZGV3b3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRUNXb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgcmV0dXJuIGNyZWF0ZUVDQ0Jsb2NrKGNvZGV3b3JkcywgMCwgY29kZXdvcmRzLkdldExlbmd0aCgpLCBudW1FQ1dvcmRzLCBlKTsKLX0KLUNGWF9XaWRlU3RyaW5nIENCQ19FcnJvckNvcnJlY3Rpb246OmNyZWF0ZUVDQ0Jsb2NrKENGWF9XaWRlU3RyaW5nIGNvZGV3b3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRUNXb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgc3RhdGljIGNvbnN0IHNpemVfdCBrRmFjdG9yVGFibGVOdW0gPSBzaXplb2YoRkFDVE9SX1NFVFMpIC8gc2l6ZW9mKGludDMyX3QpOwotICBzaXplX3QgdGFibGUgPSAwOwotICB3aGlsZSAodGFibGUgPCBrRmFjdG9yVGFibGVOdW0gJiYgRkFDVE9SX1NFVFNbdGFibGVdICE9IG51bUVDV29yZHMpCi0gICAgdGFibGUrKzsKLQotICBpZiAodGFibGUgPj0ga0ZhY3RvclRhYmxlTnVtKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50OwotICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotICB9Ci0gIHVpbnQxNl90KiBlY2MgPSBGWF9BbGxvYyh1aW50MTZfdCwgbnVtRUNXb3Jkcyk7Ci0gIEZYU1lTX21lbXNldChlY2MsIDAsIG51bUVDV29yZHMgKiBzaXplb2YodWludDE2X3QpKTsKLSAgZm9yIChpbnQzMl90IGwgPSBzdGFydDsgbCA8IHN0YXJ0ICsgbGVuOyBsKyspIHsKLSAgICB1aW50MTZfdCBtID0gZWNjW251bUVDV29yZHMgLSAxXSBeIGNvZGV3b3Jkcy5HZXRBdChsKTsKLSAgICBmb3IgKGludDMyX3QgayA9IG51bUVDV29yZHMgLSAxOyBrID4gMDsgay0tKSB7Ci0gICAgICBpZiAobSAhPSAwICYmIEZBQ1RPUlNbdGFibGVdW2tdICE9IDApIHsKLSAgICAgICAgZWNjW2tdID0gKHVpbnQxNl90KShlY2NbayAtIDFdIF4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HWyhMT0dbbV0gKyBMT0dbRkFDVE9SU1t0YWJsZV1ba11dKSAlIDI1NV0pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZWNjW2tdID0gZWNjW2sgLSAxXTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG0gIT0gMCAmJiBGQUNUT1JTW3RhYmxlXVswXSAhPSAwKSB7Ci0gICAgICBlY2NbMF0gPSAodWludDE2X3QpQUxPR1soTE9HW21dICsgTE9HW0ZBQ1RPUlNbdGFibGVdWzBdXSkgJSAyNTVdOwotICAgIH0gZWxzZSB7Ci0gICAgICBlY2NbMF0gPSAwOwotICAgIH0KLSAgfQotICBDRlhfV2lkZVN0cmluZyBzdHJlY2M7Ci0gIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IG51bUVDV29yZHM7IGorKykgewotICAgIHN0cmVjYyArPSAoRlhfV0NIQVIpZWNjW251bUVDV29yZHMgLSBqIC0gMV07Ci0gIH0KLSAgRlhfRnJlZShlY2MpOwotICByZXR1cm4gc3RyZWNjOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Vycm9yQ29ycmVjdGlvbi5oIGIveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0Vycm9yQ29ycmVjdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2I5ZGE4Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FcnJvckNvcnJlY3Rpb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfRVJST1JDT1JSRUNUSU9OX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19FUlJPUkNPUlJFQ1RJT05fSF8KLQotY2xhc3MgQ0JDX1N5bWJvbEluZm87Ci0KLWNsYXNzIENCQ19FcnJvckNvcnJlY3Rpb24gewotIHB1YmxpYzoKLSAgQ0JDX0Vycm9yQ29ycmVjdGlvbigpOwotICB2aXJ0dWFsIH5DQkNfRXJyb3JDb3JyZWN0aW9uKCk7Ci0KLSAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZSgpOwotICBzdGF0aWMgdm9pZCBGaW5hbGl6ZSgpOwotICBzdGF0aWMgQ0ZYX1dpZGVTdHJpbmcgZW5jb2RlRUNDMjAwKENGWF9XaWRlU3RyaW5nIGNvZGV3b3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfU3ltYm9sSW5mbyogc3ltYm9sSW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBpbnQzMl90IE1PRFVMT19WQUxVRTsKLSAgc3RhdGljIGludDMyX3QgTE9HWzI1Nl07Ci0gIHN0YXRpYyBpbnQzMl90IEFMT0dbMjU2XTsKLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBjcmVhdGVFQ0NCbG9jayhDRlhfV2lkZVN0cmluZyBjb2Rld29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUVDV29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIENGWF9XaWRlU3RyaW5nIGNyZWF0ZUVDQ0Jsb2NrKENGWF9XaWRlU3RyaW5nIGNvZGV3b3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRUNXb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfRVJST1JDT1JSRUNUSU9OX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfSGlnaExldmVsRW5jb2Rlci5jcHAgYi94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfSGlnaExldmVsRW5jb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDM1ODQuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0hpZ2hMZXZlbEVuY29kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzcxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLS8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNi0yMDA3IEplcmVtaWFzIE1hZXJraS4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGxpbWl0cz4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9CQ19EaW1lbnNpb24uaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL0JDX1V0aWxDb2RpbmdDb252ZXJ0LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0FTQ0lJRW5jb2Rlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19CYXNlMjU2RW5jb2Rlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19DNDBFbmNvZGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VkaWZhY3RFbmNvZGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2RlckNvbnRleHQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfSGlnaExldmVsRW5jb2Rlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbFNoYXBlSGludC5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19UZXh0RW5jb2Rlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19YMTJFbmNvZGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS91dGlscy5oIgotCi1GWF9XQ0hBUiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fQzQwID0gMjMwOwotRlhfV0NIQVIgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OkxBVENIX1RPX0JBU0UyNTYgPSAyMzE7Ci1GWF9XQ0hBUiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6VVBQRVJfU0hJRlQgPSAyMzU7Ci1GWF9XQ0hBUiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fQU5TSVgxMiA9IDIzODsKLUZYX1dDSEFSIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpMQVRDSF9UT19URVhUID0gMjM5OwotRlhfV0NIQVIgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OkxBVENIX1RPX0VESUZBQ1QgPSAyNDA7Ci1GWF9XQ0hBUiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6QzQwX1VOTEFUQ0ggPSAyNTQ7Ci1GWF9XQ0hBUiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6WDEyX1VOTEFUQ0ggPSAyNTQ7Ci1GWF9XQ0hBUiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6UEFEID0gMTI5OwotRlhfV0NIQVIgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6Ok1BQ1JPXzA1ID0gMjM2OwotRlhfV0NIQVIgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6Ok1BQ1JPXzA2ID0gMjM3OwotY29uc3Qgd2NoYXJfdCogQ0JDX0hpZ2hMZXZlbEVuY29kZXI6Ok1BQ1JPXzA1X0hFQURFUiA9IEwiWyk+HjA1IjsKLWNvbnN0IHdjaGFyX3QqIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpNQUNST18wNl9IRUFERVIgPSBMIlspPh4wNiI7Ci1jb25zdCB3Y2hhcl90IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpNQUNST19UUkFJTEVSID0gMHgwMDA0OwotCi1DQkNfSGlnaExldmVsRW5jb2Rlcjo6Q0JDX0hpZ2hMZXZlbEVuY29kZXIoKSB7fQotQ0JDX0hpZ2hMZXZlbEVuY29kZXI6On5DQkNfSGlnaExldmVsRW5jb2RlcigpIHt9Ci0KLUNGWF9BcnJheVRlbXBsYXRlPHVpbnQ4X3Q+JiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6Z2V0Qnl0ZXNGb3JNZXNzYWdlKAotICAgIENGWF9XaWRlU3RyaW5nIG1zZykgewotICBDRlhfQnl0ZVN0cmluZyBieXRlc3RyOwotICBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OlVuaWNvZGVUb1VURjgobXNnLCBieXRlc3RyKTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYnl0ZXN0ci5HZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgbV9ieXRlYXJyYXkuQWRkKGJ5dGVzdHIuR2V0QXQoaSkpOwotICB9Ci0gIHJldHVybiBtX2J5dGVhcnJheTsKLX0KLUNGWF9XaWRlU3RyaW5nIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVIaWdoTGV2ZWwoQ0ZYX1dpZGVTdHJpbmcgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBlY0xldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIHJldHVybiBlbmNvZGVIaWdoTGV2ZWwobXNnLCBlY0xldmVsLCBGT1JDRV9OT05FLCBudWxscHRyLCBudWxscHRyLCBlKTsKLX0KLUNGWF9XaWRlU3RyaW5nIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVIaWdoTGV2ZWwoQ0ZYX1dpZGVTdHJpbmcgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyBlY0xldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xTaGFwZUhpbnQgc2hhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19EaW1lbnNpb24qIG1pblNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19EaW1lbnNpb24qIG1heFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgQ0JDX0VuY29kZXJDb250ZXh0IGNvbnRleHQobXNnLCBlY0xldmVsLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLSAgY29udGV4dC5zZXRTeW1ib2xTaGFwZShzaGFwZSk7Ci0gIGNvbnRleHQuc2V0U2l6ZUNvbnN0cmFpbnRzKG1pblNpemUsIG1heFNpemUpOwotICBpZiAoKG1zZy5NaWQoMCwgNikgPT0gTUFDUk9fMDVfSEVBREVSKSAmJgotICAgICAgKG1zZy5NaWQobXNnLkdldExlbmd0aCgpIC0gMSwgMSkgPT0gTUFDUk9fVFJBSUxFUikpIHsKLSAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoTUFDUk9fMDUpOwotICAgIGNvbnRleHQuc2V0U2tpcEF0RW5kKDIpOwotICAgIGNvbnRleHQubV9wb3MgKz0gNjsKLSAgfSBlbHNlIGlmICgobXNnLk1pZCgwLCA2KSA9PSBNQUNST18wNl9IRUFERVIpICYmCi0gICAgICAgICAgICAgKG1zZy5NaWQobXNnLkdldExlbmd0aCgpIC0gMSwgMSkgPT0gTUFDUk9fVFJBSUxFUikpIHsKLSAgICBjb250ZXh0LndyaXRlQ29kZXdvcmQoTUFDUk9fMDYpOwotICAgIGNvbnRleHQuc2V0U2tpcEF0RW5kKDIpOwotICAgIGNvbnRleHQubV9wb3MgKz0gNjsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDQkNfRW5jb2Rlcj4+IGVuY29kZXJzOwotICBlbmNvZGVycy5wdXNoX2JhY2soc3RkOjp1bmlxdWVfcHRyPENCQ19FbmNvZGVyPihuZXcgQ0JDX0FTQ0lJRW5jb2RlcigpKSk7Ci0gIGVuY29kZXJzLnB1c2hfYmFjayhzdGQ6OnVuaXF1ZV9wdHI8Q0JDX0VuY29kZXI+KG5ldyBDQkNfQzQwRW5jb2RlcigpKSk7Ci0gIGVuY29kZXJzLnB1c2hfYmFjayhzdGQ6OnVuaXF1ZV9wdHI8Q0JDX0VuY29kZXI+KG5ldyBDQkNfVGV4dEVuY29kZXIoKSkpOwotICBlbmNvZGVycy5wdXNoX2JhY2soc3RkOjp1bmlxdWVfcHRyPENCQ19FbmNvZGVyPihuZXcgQ0JDX1gxMkVuY29kZXIoKSkpOwotICBlbmNvZGVycy5wdXNoX2JhY2soc3RkOjp1bmlxdWVfcHRyPENCQ19FbmNvZGVyPihuZXcgQ0JDX0VkaWZhY3RFbmNvZGVyKCkpKTsKLSAgZW5jb2RlcnMucHVzaF9iYWNrKHN0ZDo6dW5pcXVlX3B0cjxDQkNfRW5jb2Rlcj4obmV3IENCQ19CYXNlMjU2RW5jb2RlcigpKSk7Ci0gIGludDMyX3QgZW5jb2RpbmdNb2RlID0gQVNDSUlfRU5DT0RBVElPTjsKLSAgd2hpbGUgKGNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSkgewotICAgIGVuY29kZXJzW2VuY29kaW5nTW9kZV0tPkVuY29kZShjb250ZXh0LCBlKTsKLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgcmV0dXJuIEwiIjsKLQotICAgIGlmIChjb250ZXh0Lm1fbmV3RW5jb2RpbmcgPj0gMCkgewotICAgICAgZW5jb2RpbmdNb2RlID0gY29udGV4dC5tX25ld0VuY29kaW5nOwotICAgICAgY29udGV4dC5yZXNldEVuY29kZXJTaWduYWwoKTsKLSAgICB9Ci0gIH0KLSAgaW50MzJfdCBsZW4gPSBjb250ZXh0Lm1fY29kZXdvcmRzLkdldExlbmd0aCgpOwotICBjb250ZXh0LnVwZGF0ZVN5bWJvbEluZm8oZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIEwiIjsKLQotICBpbnQzMl90IGNhcGFjaXR5ID0gY29udGV4dC5tX3N5bWJvbEluZm8tPm1fZGF0YUNhcGFjaXR5OwotICBpZiAobGVuIDwgY2FwYWNpdHkpIHsKLSAgICBpZiAoZW5jb2RpbmdNb2RlICE9IEFTQ0lJX0VOQ09EQVRJT04gJiYKLSAgICAgICAgZW5jb2RpbmdNb2RlICE9IEJBU0UyNTZfRU5DT0RBVElPTikgewotICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKDB4MDBmZSk7Ci0gICAgfQotICB9Ci0gIENGWF9XaWRlU3RyaW5nIGNvZGV3b3JkcyA9IGNvbnRleHQubV9jb2Rld29yZHM7Ci0gIGlmIChjb2Rld29yZHMuR2V0TGVuZ3RoKCkgPCBjYXBhY2l0eSkgewotICAgIGNvZGV3b3JkcyArPSBQQUQ7Ci0gIH0KLSAgd2hpbGUgKGNvZGV3b3Jkcy5HZXRMZW5ndGgoKSA8IGNhcGFjaXR5KSB7Ci0gICAgY29kZXdvcmRzICs9IChyYW5kb21pemUyNTNTdGF0ZShQQUQsIGNvZGV3b3Jkcy5HZXRMZW5ndGgoKSArIDEpKTsKLSAgfQotICByZXR1cm4gY29kZXdvcmRzOwotfQotaW50MzJfdCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6bG9va0FoZWFkVGVzdChDRlhfV2lkZVN0cmluZyBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY3VycmVudE1vZGUpIHsKLSAgaWYgKHN0YXJ0cG9zID49IG1zZy5HZXRMZW5ndGgoKSkgewotICAgIHJldHVybiBjdXJyZW50TW9kZTsKLSAgfQotICBzdGQ6OnZlY3RvcjxGWF9GTE9BVD4gY2hhckNvdW50czsKLSAgaWYgKGN1cnJlbnRNb2RlID09IEFTQ0lJX0VOQ09EQVRJT04pIHsKLSAgICBjaGFyQ291bnRzLnB1c2hfYmFjaygwKTsKLSAgICBjaGFyQ291bnRzLnB1c2hfYmFjaygxKTsKLSAgICBjaGFyQ291bnRzLnB1c2hfYmFjaygxKTsKLSAgICBjaGFyQ291bnRzLnB1c2hfYmFjaygxKTsKLSAgICBjaGFyQ291bnRzLnB1c2hfYmFjaygxKTsKLSAgICBjaGFyQ291bnRzLnB1c2hfYmFjaygxLjI1Zik7Ci0gIH0gZWxzZSB7Ci0gICAgY2hhckNvdW50cy5wdXNoX2JhY2soMSk7Ci0gICAgY2hhckNvdW50cy5wdXNoX2JhY2soMik7Ci0gICAgY2hhckNvdW50cy5wdXNoX2JhY2soMik7Ci0gICAgY2hhckNvdW50cy5wdXNoX2JhY2soMik7Ci0gICAgY2hhckNvdW50cy5wdXNoX2JhY2soMik7Ci0gICAgY2hhckNvdW50cy5wdXNoX2JhY2soMi4yNWYpOwotICAgIGNoYXJDb3VudHNbY3VycmVudE1vZGVdID0gMDsKLSAgfQotICBpbnQzMl90IGNoYXJzUHJvY2Vzc2VkID0gMDsKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBpZiAoKHN0YXJ0cG9zICsgY2hhcnNQcm9jZXNzZWQpID09IG1zZy5HZXRMZW5ndGgoKSkgewotICAgICAgaW50MzJfdCBtaW4gPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgoKTsKLSAgICAgIENGWF9BcnJheVRlbXBsYXRlPHVpbnQ4X3Q+IG1pbnM7Ci0gICAgICBtaW5zLlNldFNpemUoNik7Ci0gICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiBpbnRDaGFyQ291bnRzOwotICAgICAgaW50Q2hhckNvdW50cy5TZXRTaXplKDYpOwotICAgICAgbWluID0gZmluZE1pbmltdW1zKGNoYXJDb3VudHMsIGludENoYXJDb3VudHMsIG1pbiwgbWlucyk7Ci0gICAgICBpbnQzMl90IG1pbkNvdW50ID0gZ2V0TWluaW11bUNvdW50KG1pbnMpOwotICAgICAgaWYgKGludENoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gPT0gbWluKSB7Ci0gICAgICAgIHJldHVybiBBU0NJSV9FTkNPREFUSU9OOwotICAgICAgfQotICAgICAgaWYgKG1pbkNvdW50ID09IDEgJiYgbWluc1tCQVNFMjU2X0VOQ09EQVRJT05dID4gMCkgewotICAgICAgICByZXR1cm4gQkFTRTI1Nl9FTkNPREFUSU9OOwotICAgICAgfQotICAgICAgaWYgKG1pbkNvdW50ID09IDEgJiYgbWluc1tFRElGQUNUX0VOQ09EQVRJT05dID4gMCkgewotICAgICAgICByZXR1cm4gRURJRkFDVF9FTkNPREFUSU9OOwotICAgICAgfQotICAgICAgaWYgKG1pbkNvdW50ID09IDEgJiYgbWluc1tURVhUX0VOQ09EQVRJT05dID4gMCkgewotICAgICAgICByZXR1cm4gVEVYVF9FTkNPREFUSU9OOwotICAgICAgfQotICAgICAgaWYgKG1pbkNvdW50ID09IDEgJiYgbWluc1tYMTJfRU5DT0RBVElPTl0gPiAwKSB7Ci0gICAgICAgIHJldHVybiBYMTJfRU5DT0RBVElPTjsKLSAgICAgIH0KLSAgICAgIHJldHVybiBDNDBfRU5DT0RBVElPTjsKLSAgICB9Ci0gICAgRlhfV0NIQVIgYyA9IG1zZy5HZXRBdChzdGFydHBvcyArIGNoYXJzUHJvY2Vzc2VkKTsKLSAgICBjaGFyc1Byb2Nlc3NlZCsrOwotICAgIGlmIChpc0RpZ2l0KGMpKSB7Ci0gICAgICBjaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dICs9IDAuNTsKLSAgICB9IGVsc2UgaWYgKGlzRXh0ZW5kZWRBU0NJSShjKSkgewotICAgICAgY2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSA9Ci0gICAgICAgICAgKEZYX0ZMT0FUKWNlaWwoY2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSk7Ci0gICAgICBjaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dICs9IDI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gPQotICAgICAgICAgIChGWF9GTE9BVCljZWlsKGNoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0pOwotICAgICAgY2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSsrOwotICAgIH0KLSAgICBpZiAoaXNOYXRpdmVDNDAoYykpIHsKLSAgICAgIGNoYXJDb3VudHNbQzQwX0VOQ09EQVRJT05dICs9IDIuMGYgLyAzLjBmOwotICAgIH0gZWxzZSBpZiAoaXNFeHRlbmRlZEFTQ0lJKGMpKSB7Ci0gICAgICBjaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSArPSA4LjBmIC8gMy4wZjsKLSAgICB9IGVsc2UgewotICAgICAgY2hhckNvdW50c1tDNDBfRU5DT0RBVElPTl0gKz0gNC4wZiAvIDMuMGY7Ci0gICAgfQotICAgIGlmIChpc05hdGl2ZVRleHQoYykpIHsKLSAgICAgIGNoYXJDb3VudHNbVEVYVF9FTkNPREFUSU9OXSArPSAyLjBmIC8gMy4wZjsKLSAgICB9IGVsc2UgaWYgKGlzRXh0ZW5kZWRBU0NJSShjKSkgewotICAgICAgY2hhckNvdW50c1tURVhUX0VOQ09EQVRJT05dICs9IDguMGYgLyAzLjBmOwotICAgIH0gZWxzZSB7Ci0gICAgICBjaGFyQ291bnRzW1RFWFRfRU5DT0RBVElPTl0gKz0gNC4wZiAvIDMuMGY7Ci0gICAgfQotICAgIGlmIChpc05hdGl2ZVgxMihjKSkgewotICAgICAgY2hhckNvdW50c1tYMTJfRU5DT0RBVElPTl0gKz0gMi4wZiAvIDMuMGY7Ci0gICAgfSBlbHNlIGlmIChpc0V4dGVuZGVkQVNDSUkoYykpIHsKLSAgICAgIGNoYXJDb3VudHNbWDEyX0VOQ09EQVRJT05dICs9IDEzLjBmIC8gMy4wZjsKLSAgICB9IGVsc2UgewotICAgICAgY2hhckNvdW50c1tYMTJfRU5DT0RBVElPTl0gKz0gMTAuMGYgLyAzLjBmOwotICAgIH0KLSAgICBpZiAoaXNOYXRpdmVFRElGQUNUKGMpKSB7Ci0gICAgICBjaGFyQ291bnRzW0VESUZBQ1RfRU5DT0RBVElPTl0gKz0gMy4wZiAvIDQuMGY7Ci0gICAgfSBlbHNlIGlmIChpc0V4dGVuZGVkQVNDSUkoYykpIHsKLSAgICAgIGNoYXJDb3VudHNbRURJRkFDVF9FTkNPREFUSU9OXSArPSAxNy4wZiAvIDQuMGY7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNoYXJDb3VudHNbRURJRkFDVF9FTkNPREFUSU9OXSArPSAxMy4wZiAvIDQuMGY7Ci0gICAgfQotICAgIGlmIChpc1NwZWNpYWxCMjU2KGMpKSB7Ci0gICAgICBjaGFyQ291bnRzW0JBU0UyNTZfRU5DT0RBVElPTl0gKz0gNDsKLSAgICB9IGVsc2UgewotICAgICAgY2hhckNvdW50c1tCQVNFMjU2X0VOQ09EQVRJT05dKys7Ci0gICAgfQotICAgIGlmIChjaGFyc1Byb2Nlc3NlZCA+PSA0KSB7Ci0gICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiBpbnRDaGFyQ291bnRzOwotICAgICAgaW50Q2hhckNvdW50cy5TZXRTaXplKDYpOwotICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdD4gbWluczsKLSAgICAgIG1pbnMuU2V0U2l6ZSg2KTsKLSAgICAgIGZpbmRNaW5pbXVtcyhjaGFyQ291bnRzLCBpbnRDaGFyQ291bnRzLAotICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpLCBtaW5zKTsKLSAgICAgIGludDMyX3QgbWluQ291bnQgPSBnZXRNaW5pbXVtQ291bnQobWlucyk7Ci0gICAgICBpZiAoaW50Q2hhckNvdW50c1tBU0NJSV9FTkNPREFUSU9OXSA8IGludENoYXJDb3VudHNbQkFTRTI1Nl9FTkNPREFUSU9OXSAmJgotICAgICAgICAgIGludENoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gPCBpbnRDaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSAmJgotICAgICAgICAgIGludENoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gPCBpbnRDaGFyQ291bnRzW1RFWFRfRU5DT0RBVElPTl0gJiYKLSAgICAgICAgICBpbnRDaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dIDwgaW50Q2hhckNvdW50c1tYMTJfRU5DT0RBVElPTl0gJiYKLSAgICAgICAgICBpbnRDaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dIDwgaW50Q2hhckNvdW50c1tFRElGQUNUX0VOQ09EQVRJT05dKSB7Ci0gICAgICAgIHJldHVybiBBU0NJSV9FTkNPREFUSU9OOwotICAgICAgfQotICAgICAgaWYgKGludENoYXJDb3VudHNbQkFTRTI1Nl9FTkNPREFUSU9OXSA8IGludENoYXJDb3VudHNbQVNDSUlfRU5DT0RBVElPTl0gfHwKLSAgICAgICAgICAobWluc1tDNDBfRU5DT0RBVElPTl0gKyBtaW5zW1RFWFRfRU5DT0RBVElPTl0gKyBtaW5zW1gxMl9FTkNPREFUSU9OXSArCi0gICAgICAgICAgIG1pbnNbRURJRkFDVF9FTkNPREFUSU9OXSkgPT0gMCkgewotICAgICAgICByZXR1cm4gQkFTRTI1Nl9FTkNPREFUSU9OOwotICAgICAgfQotICAgICAgaWYgKG1pbkNvdW50ID09IDEgJiYgbWluc1tFRElGQUNUX0VOQ09EQVRJT05dID4gMCkgewotICAgICAgICByZXR1cm4gRURJRkFDVF9FTkNPREFUSU9OOwotICAgICAgfQotICAgICAgaWYgKG1pbkNvdW50ID09IDEgJiYgbWluc1tURVhUX0VOQ09EQVRJT05dID4gMCkgewotICAgICAgICByZXR1cm4gVEVYVF9FTkNPREFUSU9OOwotICAgICAgfQotICAgICAgaWYgKG1pbkNvdW50ID09IDEgJiYgbWluc1tYMTJfRU5DT0RBVElPTl0gPiAwKSB7Ci0gICAgICAgIHJldHVybiBYMTJfRU5DT0RBVElPTjsKLSAgICAgIH0KLSAgICAgIGlmIChpbnRDaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSArIDEgPCBpbnRDaGFyQ291bnRzW0FTQ0lJX0VOQ09EQVRJT05dICYmCi0gICAgICAgICAgaW50Q2hhckNvdW50c1tDNDBfRU5DT0RBVElPTl0gKyAxIDwKLSAgICAgICAgICAgICAgaW50Q2hhckNvdW50c1tCQVNFMjU2X0VOQ09EQVRJT05dICYmCi0gICAgICAgICAgaW50Q2hhckNvdW50c1tDNDBfRU5DT0RBVElPTl0gKyAxIDwKLSAgICAgICAgICAgICAgaW50Q2hhckNvdW50c1tFRElGQUNUX0VOQ09EQVRJT05dICYmCi0gICAgICAgICAgaW50Q2hhckNvdW50c1tDNDBfRU5DT0RBVElPTl0gKyAxIDwgaW50Q2hhckNvdW50c1tURVhUX0VOQ09EQVRJT05dKSB7Ci0gICAgICAgIGlmIChpbnRDaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSA8IGludENoYXJDb3VudHNbWDEyX0VOQ09EQVRJT05dKSB7Ci0gICAgICAgICAgcmV0dXJuIEM0MF9FTkNPREFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnRDaGFyQ291bnRzW0M0MF9FTkNPREFUSU9OXSA9PSBpbnRDaGFyQ291bnRzW1gxMl9FTkNPREFUSU9OXSkgewotICAgICAgICAgIGludDMyX3QgcCA9IHN0YXJ0cG9zICsgY2hhcnNQcm9jZXNzZWQgKyAxOwotICAgICAgICAgIHdoaWxlIChwIDwgbXNnLkdldExlbmd0aCgpKSB7Ci0gICAgICAgICAgICBGWF9XQ0hBUiB0YyA9IG1zZy5HZXRBdChwKTsKLSAgICAgICAgICAgIGlmIChpc1gxMlRlcm1TZXAodGMpKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBYMTJfRU5DT0RBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaXNOYXRpdmVYMTIodGMpKSB7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcCsrOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gQzQwX0VOQ09EQVRJT047Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLWJvb2wgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlzRGlnaXQoRlhfV0NIQVIgY2gpIHsKLSAgcmV0dXJuIGNoID49ICcwJyAmJiBjaCA8PSAnOSc7Ci19Ci1ib29sIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc0V4dGVuZGVkQVNDSUkoRlhfV0NIQVIgY2gpIHsKLSAgcmV0dXJuIGNoID49IDEyOCAmJiBjaCA8PSAyNTU7Ci19Ci1pbnQzMl90IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpkZXRlcm1pbmVDb25zZWN1dGl2ZURpZ2l0Q291bnQoQ0ZYX1dpZGVTdHJpbmcgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MpIHsKLSAgaW50MzJfdCBjb3VudCA9IDA7Ci0gIGludDMyX3QgbGVuID0gbXNnLkdldExlbmd0aCgpOwotICBpbnQzMl90IGlkeCA9IHN0YXJ0cG9zOwotICBpZiAoaWR4IDwgbGVuKSB7Ci0gICAgRlhfV0NIQVIgY2ggPSBtc2cuR2V0QXQoaWR4KTsKLSAgICB3aGlsZSAoaXNEaWdpdChjaCkgJiYgaWR4IDwgbGVuKSB7Ci0gICAgICBjb3VudCsrOwotICAgICAgaWR4Kys7Ci0gICAgICBpZiAoaWR4IDwgbGVuKSB7Ci0gICAgICAgIGNoID0gbXNnLkdldEF0KGlkeCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBjb3VudDsKLX0KLXZvaWQgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlsbGVnYWxDaGFyYWN0ZXIoRlhfV0NIQVIgYywgaW50MzJfdCYgZSkgewotICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7Ci19Ci1GWF9XQ0hBUiBDQkNfSGlnaExldmVsRW5jb2Rlcjo6cmFuZG9taXplMjUzU3RhdGUoRlhfV0NIQVIgY2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2Rld29yZFBvc2l0aW9uKSB7Ci0gIGludDMyX3QgcHNldWRvUmFuZG9tID0gKCgxNDkgKiBjb2Rld29yZFBvc2l0aW9uKSAlIDI1MykgKyAxOwotICBpbnQzMl90IHRlbXBWYXJpYWJsZSA9IGNoICsgcHNldWRvUmFuZG9tOwotICByZXR1cm4gdGVtcFZhcmlhYmxlIDw9IDI1NCA/IChGWF9XQ0hBUil0ZW1wVmFyaWFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoRlhfV0NIQVIpKHRlbXBWYXJpYWJsZSAtIDI1NCk7Ci19Ci1pbnQzMl90IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpmaW5kTWluaW11bXMoCi0gICAgc3RkOjp2ZWN0b3I8RlhfRkxPQVQ+JiBjaGFyQ291bnRzLAotICAgIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+JiBpbnRDaGFyQ291bnRzLAotICAgIGludDMyX3QgbWluLAotICAgIENGWF9BcnJheVRlbXBsYXRlPHVpbnQ4X3Q+JiBtaW5zKSB7Ci0gIGZvciAoaW50MzJfdCBsID0gMDsgbCA8IG1pbnMuR2V0U2l6ZSgpOyBsKyspIHsKLSAgICBtaW5zW2xdID0gKHVpbnQ4X3QpMDsKLSAgfQotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICBpbnRDaGFyQ291bnRzW2ldID0gKGludDMyX3QpY2VpbChjaGFyQ291bnRzW2ldKTsKLSAgICBpbnQzMl90IGN1cnJlbnQgPSBpbnRDaGFyQ291bnRzW2ldOwotICAgIGlmIChtaW4gPiBjdXJyZW50KSB7Ci0gICAgICBtaW4gPSBjdXJyZW50OwotICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbWlucy5HZXRTaXplKCk7IGorKykgewotICAgICAgICBtaW5zW2pdID0gKHVpbnQ4X3QpMDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1pbiA9PSBjdXJyZW50KSB7Ci0gICAgICBtaW5zW2ldKys7Ci0gICAgfQotICB9Ci0gIHJldHVybiBtaW47Ci19Ci1pbnQzMl90IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpnZXRNaW5pbXVtQ291bnQoCi0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdD4mIG1pbnMpIHsKLSAgaW50MzJfdCBtaW5Db3VudCA9IDA7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDY7IGkrKykgewotICAgIG1pbkNvdW50ICs9IG1pbnNbaV07Ci0gIH0KLSAgcmV0dXJuIG1pbkNvdW50OwotfQotYm9vbCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aXNOYXRpdmVDNDAoRlhfV0NIQVIgY2gpIHsKLSAgcmV0dXJuIChjaCA9PSAnICcpIHx8IChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB8fCAoY2ggPj0gJ0EnICYmIGNoIDw9ICdaJyk7Ci19Ci1ib29sIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc05hdGl2ZVRleHQoRlhfV0NIQVIgY2gpIHsKLSAgcmV0dXJuIChjaCA9PSAnICcpIHx8IChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB8fCAoY2ggPj0gJ2EnICYmIGNoIDw9ICd6Jyk7Ci19Ci1ib29sIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppc05hdGl2ZVgxMihGWF9XQ0hBUiBjaCkgewotICByZXR1cm4gaXNYMTJUZXJtU2VwKGNoKSB8fCAoY2ggPT0gJyAnKSB8fCAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgfHwKLSAgICAgICAgIChjaCA+PSAnQScgJiYgY2ggPD0gJ1onKTsKLX0KLWJvb2wgQ0JDX0hpZ2hMZXZlbEVuY29kZXI6OmlzWDEyVGVybVNlcChGWF9XQ0hBUiBjaCkgewotICByZXR1cm4gKGNoID09ICdccicpIHx8IChjaCA9PSAnKicpIHx8IChjaCA9PSAnPicpOwotfQotYm9vbCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aXNOYXRpdmVFRElGQUNUKEZYX1dDSEFSIGNoKSB7Ci0gIHJldHVybiBjaCA+PSAnICcgJiYgY2ggPD0gJ14nOwotfQotYm9vbCBDQkNfSGlnaExldmVsRW5jb2Rlcjo6aXNTcGVjaWFsQjI1NihGWF9XQ0hBUiBjaCkgewotICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfSGlnaExldmVsRW5jb2Rlci5oIGIveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0hpZ2hMZXZlbEVuY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ3MmYxMC4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfSGlnaExldmVsRW5jb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19ISUdITEVWRUxFTkNPREVSX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19ISUdITEVWRUxFTkNPREVSX0hfCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sU2hhcGVIaW50LmgiCi0KLSNkZWZpbmUgQVNDSUlfRU5DT0RBVElPTiAwCi0jZGVmaW5lIEM0MF9FTkNPREFUSU9OIDEKLSNkZWZpbmUgVEVYVF9FTkNPREFUSU9OIDIKLSNkZWZpbmUgWDEyX0VOQ09EQVRJT04gMwotI2RlZmluZSBFRElGQUNUX0VOQ09EQVRJT04gNAotI2RlZmluZSBCQVNFMjU2X0VOQ09EQVRJT04gNQotCi1jbGFzcyBDQkNfSGlnaExldmVsRW5jb2RlciA6IHB1YmxpYyBDQkNfU3ltYm9sU2hhcGVIaW50IHsKLSBwdWJsaWM6Ci0gIENCQ19IaWdoTGV2ZWxFbmNvZGVyKCk7Ci0gIH5DQkNfSGlnaExldmVsRW5jb2RlcigpIG92ZXJyaWRlOwotCi0gIENGWF9BcnJheVRlbXBsYXRlPHVpbnQ4X3Q+JiBnZXRCeXRlc0Zvck1lc3NhZ2UoQ0ZYX1dpZGVTdHJpbmcgbXNnKTsKLSAgc3RhdGljIENGWF9XaWRlU3RyaW5nIGVuY29kZUhpZ2hMZXZlbChDRlhfV2lkZVN0cmluZyBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgZWNMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIENGWF9XaWRlU3RyaW5nIGVuY29kZUhpZ2hMZXZlbChDRlhfV2lkZVN0cmluZyBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgZWNMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xTaGFwZUhpbnQgc2hhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0RpbWVuc2lvbiogbWluU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfRGltZW5zaW9uKiBtYXhTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotICBzdGF0aWMgaW50MzJfdCBsb29rQWhlYWRUZXN0KENGWF9XaWRlU3RyaW5nIG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0cG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY3VycmVudE1vZGUpOwotICBzdGF0aWMgYm9vbCBpc0RpZ2l0KEZYX1dDSEFSIGNoKTsKLSAgc3RhdGljIGJvb2wgaXNFeHRlbmRlZEFTQ0lJKEZYX1dDSEFSIGNoKTsKLSAgc3RhdGljIGludDMyX3QgZGV0ZXJtaW5lQ29uc2VjdXRpdmVEaWdpdENvdW50KENGWF9XaWRlU3RyaW5nIG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MpOwotICBzdGF0aWMgdm9pZCBpbGxlZ2FsQ2hhcmFjdGVyKEZYX1dDSEFSIGMsIGludDMyX3QmIGUpOwotCi0gcHVibGljOgotICBzdGF0aWMgRlhfV0NIQVIgTEFUQ0hfVE9fQzQwOwotICBzdGF0aWMgRlhfV0NIQVIgTEFUQ0hfVE9fQkFTRTI1NjsKLSAgc3RhdGljIEZYX1dDSEFSIFVQUEVSX1NISUZUOwotICBzdGF0aWMgRlhfV0NIQVIgTEFUQ0hfVE9fQU5TSVgxMjsKLSAgc3RhdGljIEZYX1dDSEFSIExBVENIX1RPX1RFWFQ7Ci0gIHN0YXRpYyBGWF9XQ0hBUiBMQVRDSF9UT19FRElGQUNUOwotICBzdGF0aWMgRlhfV0NIQVIgQzQwX1VOTEFUQ0g7Ci0gIHN0YXRpYyBGWF9XQ0hBUiBYMTJfVU5MQVRDSDsKLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBGWF9XQ0hBUiBQQUQ7Ci0gIHN0YXRpYyBGWF9XQ0hBUiBNQUNST18wNTsKLSAgc3RhdGljIEZYX1dDSEFSIE1BQ1JPXzA2OwotICBzdGF0aWMgY29uc3Qgd2NoYXJfdCogTUFDUk9fMDVfSEVBREVSOwotICBzdGF0aWMgY29uc3Qgd2NoYXJfdCogTUFDUk9fMDZfSEVBREVSOwotICBzdGF0aWMgY29uc3Qgd2NoYXJfdCBNQUNST19UUkFJTEVSOwotICBDRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90PiBtX2J5dGVhcnJheTsKLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBGWF9XQ0hBUiByYW5kb21pemUyNTNTdGF0ZShGWF9XQ0hBUiBjaCwgaW50MzJfdCBjb2Rld29yZFBvc2l0aW9uKTsKLSAgc3RhdGljIGludDMyX3QgZmluZE1pbmltdW1zKHN0ZDo6dmVjdG9yPEZYX0ZMT0FUPiYgY2hhckNvdW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+JiBpbnRDaGFyQ291bnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90PiYgbWlucyk7Ci0gIHN0YXRpYyBpbnQzMl90IGdldE1pbmltdW1Db3VudChDRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90PiYgbWlucyk7Ci0gIHN0YXRpYyBib29sIGlzTmF0aXZlQzQwKEZYX1dDSEFSIGNoKTsKLSAgc3RhdGljIGJvb2wgaXNOYXRpdmVUZXh0KEZYX1dDSEFSIGNoKTsKLSAgc3RhdGljIGJvb2wgaXNOYXRpdmVYMTIoRlhfV0NIQVIgY2gpOwotICBzdGF0aWMgYm9vbCBpc1gxMlRlcm1TZXAoRlhfV0NIQVIgY2gpOwotICBzdGF0aWMgYm9vbCBpc05hdGl2ZUVESUZBQ1QoRlhfV0NIQVIgY2gpOwotICBzdGF0aWMgYm9vbCBpc1NwZWNpYWxCMjU2KEZYX1dDSEFSIGNoKTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX0hJR0hMRVZFTEVOQ09ERVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmNwcCBiL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU3NGI4Yi4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sSW5mby5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgotLyoKLSAqIENvcHlyaWdodCAyMDA2IEplcmVtaWFzIE1hZXJraQotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uaCIKLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvQkNfRGltZW5zaW9uLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0RhdGFNYXRyaXhTeW1ib2xJbmZvMTQ0LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sU2hhcGVIaW50LmgiCi0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IHNpemVfdCBrU3ltYm9sc0NvdW50ID0gMzA7Ci0KLUNCQ19TeW1ib2xJbmZvKiBnX3N5bWJvbHNba1N5bWJvbHNDb3VudF0gPSB7Ci0gICAgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwKLSAgICBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLAotICAgIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsCi0gICAgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cn07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi12b2lkIENCQ19TeW1ib2xJbmZvOjpJbml0aWFsaXplKCkgewotICBnX3N5bWJvbHNbMF0gPSBuZXcgQ0JDX1N5bWJvbEluZm8oZmFsc2UsIDMsIDUsIDgsIDgsIDEpOwotICBnX3N5bWJvbHNbMV0gPSBuZXcgQ0JDX1N5bWJvbEluZm8oZmFsc2UsIDUsIDcsIDEwLCAxMCwgMSk7Ci0gIGdfc3ltYm9sc1syXSA9IG5ldyBDQkNfU3ltYm9sSW5mbyh0cnVlLCA1LCA3LCAxNiwgNiwgMSk7Ci0gIGdfc3ltYm9sc1szXSA9IG5ldyBDQkNfU3ltYm9sSW5mbyhmYWxzZSwgOCwgMTAsIDEyLCAxMiwgMSk7Ci0gIGdfc3ltYm9sc1s0XSA9IG5ldyBDQkNfU3ltYm9sSW5mbyh0cnVlLCAxMCwgMTEsIDE0LCA2LCAyKTsKLSAgZ19zeW1ib2xzWzVdID0gbmV3IENCQ19TeW1ib2xJbmZvKGZhbHNlLCAxMiwgMTIsIDE0LCAxNCwgMSk7Ci0gIGdfc3ltYm9sc1s2XSA9IG5ldyBDQkNfU3ltYm9sSW5mbyh0cnVlLCAxNiwgMTQsIDI0LCAxMCwgMSk7Ci0gIGdfc3ltYm9sc1s3XSA9IG5ldyBDQkNfU3ltYm9sSW5mbyhmYWxzZSwgMTgsIDE0LCAxNiwgMTYsIDEpOwotICBnX3N5bWJvbHNbOF0gPSBuZXcgQ0JDX1N5bWJvbEluZm8oZmFsc2UsIDIyLCAxOCwgMTgsIDE4LCAxKTsKLSAgZ19zeW1ib2xzWzldID0gbmV3IENCQ19TeW1ib2xJbmZvKHRydWUsIDIyLCAxOCwgMTYsIDEwLCAyKTsKLSAgZ19zeW1ib2xzWzEwXSA9IG5ldyBDQkNfU3ltYm9sSW5mbyhmYWxzZSwgMzAsIDIwLCAyMCwgMjAsIDEpOwotICBnX3N5bWJvbHNbMTFdID0gbmV3IENCQ19TeW1ib2xJbmZvKHRydWUsIDMyLCAyNCwgMTYsIDE0LCAyKTsKLSAgZ19zeW1ib2xzWzEyXSA9IG5ldyBDQkNfU3ltYm9sSW5mbyhmYWxzZSwgMzYsIDI0LCAyMiwgMjIsIDEpOwotICBnX3N5bWJvbHNbMTNdID0gbmV3IENCQ19TeW1ib2xJbmZvKGZhbHNlLCA0NCwgMjgsIDI0LCAyNCwgMSk7Ci0gIGdfc3ltYm9sc1sxNF0gPSBuZXcgQ0JDX1N5bWJvbEluZm8odHJ1ZSwgNDksIDI4LCAyMiwgMTQsIDIpOwotICBnX3N5bWJvbHNbMTVdID0gbmV3IENCQ19TeW1ib2xJbmZvKGZhbHNlLCA2MiwgMzYsIDE0LCAxNCwgNCk7Ci0gIGdfc3ltYm9sc1sxNl0gPSBuZXcgQ0JDX1N5bWJvbEluZm8oZmFsc2UsIDg2LCA0MiwgMTYsIDE2LCA0KTsKLSAgZ19zeW1ib2xzWzE3XSA9IG5ldyBDQkNfU3ltYm9sSW5mbyhmYWxzZSwgMTE0LCA0OCwgMTgsIDE4LCA0KTsKLSAgZ19zeW1ib2xzWzE4XSA9IG5ldyBDQkNfU3ltYm9sSW5mbyhmYWxzZSwgMTQ0LCA1NiwgMjAsIDIwLCA0KTsKLSAgZ19zeW1ib2xzWzE5XSA9IG5ldyBDQkNfU3ltYm9sSW5mbyhmYWxzZSwgMTc0LCA2OCwgMjIsIDIyLCA0KTsKLSAgZ19zeW1ib2xzWzIwXSA9IG5ldyBDQkNfU3ltYm9sSW5mbyhmYWxzZSwgMjA0LCA4NCwgMjQsIDI0LCA0LCAxMDIsIDQyKTsKLSAgZ19zeW1ib2xzWzIxXSA9IG5ldyBDQkNfU3ltYm9sSW5mbyhmYWxzZSwgMjgwLCAxMTIsIDE0LCAxNCwgMTYsIDE0MCwgNTYpOwotICBnX3N5bWJvbHNbMjJdID0gbmV3IENCQ19TeW1ib2xJbmZvKGZhbHNlLCAzNjgsIDE0NCwgMTYsIDE2LCAxNiwgOTIsIDM2KTsKLSAgZ19zeW1ib2xzWzIzXSA9IG5ldyBDQkNfU3ltYm9sSW5mbyhmYWxzZSwgNDU2LCAxOTIsIDE4LCAxOCwgMTYsIDExNCwgNDgpOwotICBnX3N5bWJvbHNbMjRdID0gbmV3IENCQ19TeW1ib2xJbmZvKGZhbHNlLCA1NzYsIDIyNCwgMjAsIDIwLCAxNiwgMTQ0LCA1Nik7Ci0gIGdfc3ltYm9sc1syNV0gPSBuZXcgQ0JDX1N5bWJvbEluZm8oZmFsc2UsIDY5NiwgMjcyLCAyMiwgMjIsIDE2LCAxNzQsIDY4KTsKLSAgZ19zeW1ib2xzWzI2XSA9IG5ldyBDQkNfU3ltYm9sSW5mbyhmYWxzZSwgODE2LCAzMzYsIDI0LCAyNCwgMTYsIDEzNiwgNTYpOwotICBnX3N5bWJvbHNbMjddID0gbmV3IENCQ19TeW1ib2xJbmZvKGZhbHNlLCAxMDUwLCA0MDgsIDE4LCAxOCwgMzYsIDE3NSwgNjgpOwotICBnX3N5bWJvbHNbMjhdID0gbmV3IENCQ19TeW1ib2xJbmZvKGZhbHNlLCAxMzA0LCA0OTYsIDIwLCAyMCwgMzYsIDE2MywgNjIpOwotICBnX3N5bWJvbHNbMjldID0gbmV3IENCQ19EYXRhTWF0cml4U3ltYm9sSW5mbzE0NCgpOwotfQotCi12b2lkIENCQ19TeW1ib2xJbmZvOjpGaW5hbGl6ZSgpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrU3ltYm9sc0NvdW50OyBpKyspIHsKLSAgICBkZWxldGUgZ19zeW1ib2xzW2ldOwotICAgIGdfc3ltYm9sc1tpXSA9IG51bGxwdHI7Ci0gIH0KLX0KLQotQ0JDX1N5bWJvbEluZm86OkNCQ19TeW1ib2xJbmZvKGJvb2wgcmVjdGFuZ3VsYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXRhQ2FwYWNpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlcnJvckNvZGV3b3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1hdHJpeFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF0cml4SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGF0YVJlZ2lvbnMpIHsKLSAgbV9yZWN0YW5ndWxhciA9IHJlY3Rhbmd1bGFyOwotICBtX2RhdGFDYXBhY2l0eSA9IGRhdGFDYXBhY2l0eTsKLSAgbV9lcnJvckNvZGV3b3JkcyA9IGVycm9yQ29kZXdvcmRzOwotICBtX21hdHJpeFdpZHRoID0gbWF0cml4V2lkdGg7Ci0gIG1fbWF0cml4SGVpZ2h0ID0gbWF0cml4SGVpZ2h0OwotICBtX2RhdGFSZWdpb25zID0gZGF0YVJlZ2lvbnM7Ci0gIG1fcnNCbG9ja0RhdGEgPSBkYXRhQ2FwYWNpdHk7Ci0gIG1fcnNCbG9ja0Vycm9yID0gZXJyb3JDb2Rld29yZHM7Ci19Ci1DQkNfU3ltYm9sSW5mbzo6Q0JDX1N5bWJvbEluZm8oYm9vbCByZWN0YW5ndWxhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRhdGFDYXBhY2l0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVycm9yQ29kZXdvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWF0cml4V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXRyaXhIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXRhUmVnaW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJzQmxvY2tEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcnNCbG9ja0Vycm9yKSB7Ci0gIG1fcmVjdGFuZ3VsYXIgPSByZWN0YW5ndWxhcjsKLSAgbV9kYXRhQ2FwYWNpdHkgPSBkYXRhQ2FwYWNpdHk7Ci0gIG1fZXJyb3JDb2Rld29yZHMgPSBlcnJvckNvZGV3b3JkczsKLSAgbV9tYXRyaXhXaWR0aCA9IG1hdHJpeFdpZHRoOwotICBtX21hdHJpeEhlaWdodCA9IG1hdHJpeEhlaWdodDsKLSAgbV9kYXRhUmVnaW9ucyA9IGRhdGFSZWdpb25zOwotICBtX3JzQmxvY2tEYXRhID0gcnNCbG9ja0RhdGE7Ci0gIG1fcnNCbG9ja0Vycm9yID0gcnNCbG9ja0Vycm9yOwotfQotQ0JDX1N5bWJvbEluZm86On5DQkNfU3ltYm9sSW5mbygpIHt9Ci0KLUNCQ19TeW1ib2xJbmZvKiBDQkNfU3ltYm9sSW5mbzo6bG9va3VwKGludDMyX3QgZGF0YUNvZGV3b3JkcywgaW50MzJfdCYgZSkgewotICByZXR1cm4gbG9va3VwKGRhdGFDb2Rld29yZHMsIEZPUkNFX05PTkUsIHRydWUsIGUpOwotfQotQ0JDX1N5bWJvbEluZm8qIENCQ19TeW1ib2xJbmZvOjpsb29rdXAoaW50MzJfdCBkYXRhQ29kZXdvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sU2hhcGVIaW50IHNoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICByZXR1cm4gbG9va3VwKGRhdGFDb2Rld29yZHMsIHNoYXBlLCB0cnVlLCBlKTsKLX0KLUNCQ19TeW1ib2xJbmZvKiBDQkNfU3ltYm9sSW5mbzo6bG9va3VwKGludDMyX3QgZGF0YUNvZGV3b3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb3dSZWN0YW5ndWxhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZmFpbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgU3ltYm9sU2hhcGVIaW50IHNoYXBlID0gYWxsb3dSZWN0YW5ndWxhciA/IEZPUkNFX05PTkUgOiBGT1JDRV9TUVVBUkU7Ci0gIHJldHVybiBsb29rdXAoZGF0YUNvZGV3b3Jkcywgc2hhcGUsIGZhaWwsIGUpOwotfQotQ0JDX1N5bWJvbEluZm8qIENCQ19TeW1ib2xJbmZvOjpsb29rdXAoaW50MzJfdCBkYXRhQ29kZXdvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sU2hhcGVIaW50IHNoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmYWlsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICByZXR1cm4gbG9va3VwKGRhdGFDb2Rld29yZHMsIHNoYXBlLCBudWxscHRyLCBudWxscHRyLCBmYWlsLCBlKTsKLX0KLUNCQ19TeW1ib2xJbmZvKiBDQkNfU3ltYm9sSW5mbzo6bG9va3VwKGludDMyX3QgZGF0YUNvZGV3b3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbFNoYXBlSGludCBzaGFwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19EaW1lbnNpb24qIG1pblNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfRGltZW5zaW9uKiBtYXhTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmYWlsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtTeW1ib2xzQ291bnQ7IGkrKykgewotICAgIENCQ19TeW1ib2xJbmZvKiBzeW1ib2wgPSBnX3N5bWJvbHNbaV07Ci0gICAgaWYgKHNoYXBlID09IEZPUkNFX1NRVUFSRSAmJiBzeW1ib2wtPm1fcmVjdGFuZ3VsYXIpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAoc2hhcGUgPT0gRk9SQ0VfUkVDVEFOR0xFICYmICFzeW1ib2wtPm1fcmVjdGFuZ3VsYXIpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAobWluU2l6ZSAmJiAoc3ltYm9sLT5nZXRTeW1ib2xXaWR0aChlKSA8IG1pblNpemUtPmdldFdpZHRoKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgc3ltYm9sLT5nZXRTeW1ib2xIZWlnaHQoZSkgPCBtaW5TaXplLT5nZXRIZWlnaHQoKSkpIHsKLSAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChtYXhTaXplICYmIChzeW1ib2wtPmdldFN5bWJvbFdpZHRoKGUpID4gbWF4U2l6ZS0+Z2V0V2lkdGgoKSB8fAotICAgICAgICAgICAgICAgICAgICBzeW1ib2wtPmdldFN5bWJvbEhlaWdodChlKSA+IG1heFNpemUtPmdldEhlaWdodCgpKSkgewotICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKGRhdGFDb2Rld29yZHMgPD0gc3ltYm9sLT5tX2RhdGFDYXBhY2l0eSkgewotICAgICAgcmV0dXJuIHN5bWJvbDsKLSAgICB9Ci0gIH0KLSAgaWYgKGZhaWwpCi0gICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbERhdGFDb2Rld29yZHM7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1pbnQzMl90IENCQ19TeW1ib2xJbmZvOjpnZXRIb3Jpem9udGFsRGF0YVJlZ2lvbnMoaW50MzJfdCYgZSkgewotICBzd2l0Y2ggKG1fZGF0YVJlZ2lvbnMpIHsKLSAgICBjYXNlIDE6Ci0gICAgICByZXR1cm4gMTsKLSAgICBjYXNlIDI6Ci0gICAgICByZXR1cm4gMjsKLSAgICBjYXNlIDQ6Ci0gICAgICByZXR1cm4gMjsKLSAgICBjYXNlIDE2OgotICAgICAgcmV0dXJuIDQ7Ci0gICAgY2FzZSAzNjoKLSAgICAgIHJldHVybiA2OwotICAgIGRlZmF1bHQ6Ci0gICAgICBlID0gQkNFeGNlcHRpb25DYW5ub3RIYW5kbGVUaGlzTnVtYmVyT2ZEYXRhUmVnaW9uczsKLSAgICAgIHJldHVybiAwOwotICB9Ci19Ci1pbnQzMl90IENCQ19TeW1ib2xJbmZvOjpnZXRWZXJ0aWNhbERhdGFSZWdpb25zKGludDMyX3QmIGUpIHsKLSAgc3dpdGNoIChtX2RhdGFSZWdpb25zKSB7Ci0gICAgY2FzZSAxOgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSAyOgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSA0OgotICAgICAgcmV0dXJuIDI7Ci0gICAgY2FzZSAxNjoKLSAgICAgIHJldHVybiA0OwotICAgIGNhc2UgMzY6Ci0gICAgICByZXR1cm4gNjsKLSAgICBkZWZhdWx0OgotICAgICAgZSA9IEJDRXhjZXB0aW9uQ2Fubm90SGFuZGxlVGhpc051bWJlck9mRGF0YVJlZ2lvbnM7Ci0gICAgICByZXR1cm4gMDsKLSAgfQotfQotaW50MzJfdCBDQkNfU3ltYm9sSW5mbzo6Z2V0U3ltYm9sRGF0YVdpZHRoKGludDMyX3QmIGUpIHsKLSAgcmV0dXJuIGdldEhvcml6b250YWxEYXRhUmVnaW9ucyhlKSAqIG1fbWF0cml4V2lkdGg7Ci19Ci1pbnQzMl90IENCQ19TeW1ib2xJbmZvOjpnZXRTeW1ib2xEYXRhSGVpZ2h0KGludDMyX3QmIGUpIHsKLSAgcmV0dXJuIGdldFZlcnRpY2FsRGF0YVJlZ2lvbnMoZSkgKiBtX21hdHJpeEhlaWdodDsKLX0KLWludDMyX3QgQ0JDX1N5bWJvbEluZm86OmdldFN5bWJvbFdpZHRoKGludDMyX3QmIGUpIHsKLSAgcmV0dXJuIGdldFN5bWJvbERhdGFXaWR0aChlKSArIChnZXRIb3Jpem9udGFsRGF0YVJlZ2lvbnMoZSkgKiAyKTsKLX0KLWludDMyX3QgQ0JDX1N5bWJvbEluZm86OmdldFN5bWJvbEhlaWdodChpbnQzMl90JiBlKSB7Ci0gIHJldHVybiBnZXRTeW1ib2xEYXRhSGVpZ2h0KGUpICsgKGdldFZlcnRpY2FsRGF0YVJlZ2lvbnMoZSkgKiAyKTsKLX0KLWludDMyX3QgQ0JDX1N5bWJvbEluZm86OmdldENvZGV3b3JkQ291bnQoKSB7Ci0gIHJldHVybiBtX2RhdGFDYXBhY2l0eSArIG1fZXJyb3JDb2Rld29yZHM7Ci19Ci1pbnQzMl90IENCQ19TeW1ib2xJbmZvOjpnZXRJbnRlcmxlYXZlZEJsb2NrQ291bnQoKSB7Ci0gIHJldHVybiBtX2RhdGFDYXBhY2l0eSAvIG1fcnNCbG9ja0RhdGE7Ci19Ci1pbnQzMl90IENCQ19TeW1ib2xJbmZvOjpnZXREYXRhTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jayhpbnQzMl90IGluZGV4KSB7Ci0gIHJldHVybiBtX3JzQmxvY2tEYXRhOwotfQotaW50MzJfdCBDQkNfU3ltYm9sSW5mbzo6Z2V0RXJyb3JMZW5ndGhGb3JJbnRlcmxlYXZlZEJsb2NrKGludDMyX3QgaW5kZXgpIHsKLSAgcmV0dXJuIG1fcnNCbG9ja0Vycm9yOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uaCBiL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNzMwMDIuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfU1lNQk9MSU5GT19IXwotI2RlZmluZSBYRkFfRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfU1lNQk9MSU5GT19IXwotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xTaGFwZUhpbnQuaCIKLQotY2xhc3MgQ0JDX0RpbWVuc2lvbjsKLQotY2xhc3MgQ0JDX1N5bWJvbEluZm8gOiBwdWJsaWMgQ0JDX1N5bWJvbFNoYXBlSGludCB7Ci0gcHVibGljOgotICBDQkNfU3ltYm9sSW5mbyhib29sIHJlY3Rhbmd1bGFyLAotICAgICAgICAgICAgICAgICBpbnQzMl90IGRhdGFDYXBhY2l0eSwKLSAgICAgICAgICAgICAgICAgaW50MzJfdCBlcnJvckNvZGV3b3JkcywKLSAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXRyaXhXaWR0aCwKLSAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXRyaXhIZWlnaHQsCi0gICAgICAgICAgICAgICAgIGludDMyX3QgZGF0YVJlZ2lvbnMpOwotICB+Q0JDX1N5bWJvbEluZm8oKSBvdmVycmlkZTsKLQotICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKCk7Ci0gIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7Ci0gIHN0YXRpYyB2b2lkIG92ZXJyaWRlU3ltYm9sU2V0KENCQ19TeW1ib2xJbmZvKiBvdmVycmlkZSk7Ci0gIHN0YXRpYyBDQkNfU3ltYm9sSW5mbyogbG9va3VwKGludDMyX3QgZGF0YUNvZGV3b3JkcywgaW50MzJfdCYgZSk7Ci0gIHN0YXRpYyBDQkNfU3ltYm9sSW5mbyogbG9va3VwKGludDMyX3QgZGF0YUNvZGV3b3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sU2hhcGVIaW50IHNoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIENCQ19TeW1ib2xJbmZvKiBsb29rdXAoaW50MzJfdCBkYXRhQ29kZXdvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG93UmVjdGFuZ3VsYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZmFpbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7Ci0gIHN0YXRpYyBDQkNfU3ltYm9sSW5mbyogbG9va3VwKGludDMyX3QgZGF0YUNvZGV3b3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sU2hhcGVIaW50IHNoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZhaWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotICBzdGF0aWMgQ0JDX1N5bWJvbEluZm8qIGxvb2t1cChpbnQzMl90IGRhdGFDb2Rld29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbFNoYXBlSGludCBzaGFwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0RpbWVuc2lvbiogbWluU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0RpbWVuc2lvbiogbWF4U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmYWlsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgaW50MzJfdCBnZXRIb3Jpem9udGFsRGF0YVJlZ2lvbnMoaW50MzJfdCYgZSk7Ci0gIGludDMyX3QgZ2V0VmVydGljYWxEYXRhUmVnaW9ucyhpbnQzMl90JiBlKTsKLSAgaW50MzJfdCBnZXRTeW1ib2xEYXRhV2lkdGgoaW50MzJfdCYgZSk7Ci0gIGludDMyX3QgZ2V0U3ltYm9sRGF0YUhlaWdodChpbnQzMl90JiBlKTsKLSAgaW50MzJfdCBnZXRTeW1ib2xXaWR0aChpbnQzMl90JiBlKTsKLSAgaW50MzJfdCBnZXRTeW1ib2xIZWlnaHQoaW50MzJfdCYgZSk7Ci0gIGludDMyX3QgZ2V0Q29kZXdvcmRDb3VudCgpOwotICBpbnQzMl90IGdldEludGVybGVhdmVkQmxvY2tDb3VudCgpOwotICBpbnQzMl90IGdldERhdGFMZW5ndGhGb3JJbnRlcmxlYXZlZEJsb2NrKGludDMyX3QgaW5kZXgpOwotICBpbnQzMl90IGdldEVycm9yTGVuZ3RoRm9ySW50ZXJsZWF2ZWRCbG9jayhpbnQzMl90IGluZGV4KTsKLQotICBpbnQzMl90IG1fZGF0YUNhcGFjaXR5OwotICBpbnQzMl90IG1fZXJyb3JDb2Rld29yZHM7Ci0gIGludDMyX3QgbV9tYXRyaXhXaWR0aDsKLSAgaW50MzJfdCBtX21hdHJpeEhlaWdodDsKLSAgaW50MzJfdCBtX3JzQmxvY2tEYXRhOwotICBpbnQzMl90IG1fcnNCbG9ja0Vycm9yOwotCi0gcHJpdmF0ZToKLSAgQ0JDX1N5bWJvbEluZm8oYm9vbCByZWN0YW5ndWxhciwKLSAgICAgICAgICAgICAgICAgaW50MzJfdCBkYXRhQ2FwYWNpdHksCi0gICAgICAgICAgICAgICAgIGludDMyX3QgZXJyb3JDb2Rld29yZHMsCi0gICAgICAgICAgICAgICAgIGludDMyX3QgbWF0cml4V2lkdGgsCi0gICAgICAgICAgICAgICAgIGludDMyX3QgbWF0cml4SGVpZ2h0LAotICAgICAgICAgICAgICAgICBpbnQzMl90IGRhdGFSZWdpb25zLAotICAgICAgICAgICAgICAgICBpbnQzMl90IHJzQmxvY2tEYXRhLAotICAgICAgICAgICAgICAgICBpbnQzMl90IHJzQmxvY2tFcnJvcik7Ci0KLSAgYm9vbCBtX3JlY3Rhbmd1bGFyOwotICBpbnQzMl90IG1fZGF0YVJlZ2lvbnM7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19TWU1CT0xJTkZPX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sU2hhcGVIaW50LmNwcCBiL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xTaGFwZUhpbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjkxZGQ4Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xTaGFwZUhpbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgotLyoKLSAqIENvcHlyaWdodCAyMDA3IEplcmVtaWFzIE1hZXJraS4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xTaGFwZUhpbnQuaCIKLQotQ0JDX1N5bWJvbFNoYXBlSGludDo6Q0JDX1N5bWJvbFNoYXBlSGludCgpIHt9Ci1DQkNfU3ltYm9sU2hhcGVIaW50Ojp+Q0JDX1N5bWJvbFNoYXBlSGludCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sU2hhcGVIaW50LmggYi94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sU2hhcGVIaW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZDRjODYuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbFNoYXBlSGludC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19TWU1CT0xTSEFQRUhJTlRfSF8KLSNkZWZpbmUgWEZBX0ZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX1NZTUJPTFNIQVBFSElOVF9IXwotCi1jbGFzcyBDQkNfU3ltYm9sU2hhcGVIaW50IHsKLSBwdWJsaWM6Ci0gIENCQ19TeW1ib2xTaGFwZUhpbnQoKTsKLSAgdmlydHVhbCB+Q0JDX1N5bWJvbFNoYXBlSGludCgpOwotCi0gIGVudW0gU3ltYm9sU2hhcGVIaW50IHsKLSAgICBGT1JDRV9OT05FLAotICAgIEZPUkNFX1NRVUFSRSwKLSAgICBGT1JDRV9SRUNUQU5HTEUsCi0gIH07Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19TWU1CT0xTSEFQRUhJTlRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19UZXh0RW5jb2Rlci5jcHAgYi94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfVGV4dEVuY29kZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2ViNGE4Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19UZXh0RW5jb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0vLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6Ci0vKgotICogQ29weXJpZ2h0IDIwMDYtMjAwNyBKZXJlbWlhcyBNYWVya2kuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL0JDX0RpbWVuc2lvbi5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdE1hdHJpeC5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19DNDBFbmNvZGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0VuY29kZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2RlckNvbnRleHQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfSGlnaExldmVsRW5jb2Rlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19TeW1ib2xJbmZvLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbFNoYXBlSGludC5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19UZXh0RW5jb2Rlci5oIgotCi1DQkNfVGV4dEVuY29kZXI6OkNCQ19UZXh0RW5jb2RlcigpIHt9Ci1DQkNfVGV4dEVuY29kZXI6On5DQkNfVGV4dEVuY29kZXIoKSB7fQotaW50MzJfdCBDQkNfVGV4dEVuY29kZXI6OmdldEVuY29kaW5nTW9kZSgpIHsKLSAgcmV0dXJuIFRFWFRfRU5DT0RBVElPTjsKLX0KLWludDMyX3QgQ0JDX1RleHRFbmNvZGVyOjplbmNvZGVDaGFyKEZYX1dDSEFSIGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGlmIChjID09ICcgJykgewotICAgIHNiICs9IChGWF9XQ0hBUiknXDMnOwotICAgIHJldHVybiAxOwotICB9Ci0gIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgewotICAgIHNiICs9IChGWF9XQ0hBUikoYyAtIDQ4ICsgNCk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7Ci0gICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gOTcgKyAxNCk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgaWYgKGMgPD0gMHgxZikgewotICAgIHNiICs9IChGWF9XQ0hBUiknXDAnOwotICAgIHNiICs9IGM7Ci0gICAgcmV0dXJuIDI7Ci0gIH0KLSAgaWYgKGMgPj0gJyEnICYmIGMgPD0gJy8nKSB7Ci0gICAgc2IgKz0gKEZYX1dDSEFSKSdcMSc7Ci0gICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gMzMpOwotICAgIHJldHVybiAyOwotICB9Ci0gIGlmIChjID49ICc6JyAmJiBjIDw9ICdAJykgewotICAgIHNiICs9IChGWF9XQ0hBUiknXDEnOwotICAgIHNiICs9IChGWF9XQ0hBUikoYyAtIDU4ICsgMTUpOwotICAgIHJldHVybiAyOwotICB9Ci0gIGlmIChjID49ICdbJyAmJiBjIDw9ICdfJykgewotICAgIHNiICs9IChGWF9XQ0hBUiknXDEnOwotICAgIHNiICs9IChGWF9XQ0hBUikoYyAtIDkxICsgMjIpOwotICAgIHJldHVybiAyOwotICB9Ci0gIGlmIChjID09IDB4MDA2MCkgewotICAgIHNiICs9IChGWF9XQ0hBUiknXDInOwotICAgIHNiICs9IChGWF9XQ0hBUikoYyAtIDk2KTsKLSAgICByZXR1cm4gMjsKLSAgfQotICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKLSAgICBzYiArPSAoRlhfV0NIQVIpJ1wyJzsKLSAgICBzYiArPSAoRlhfV0NIQVIpKGMgLSA2NSArIDEpOwotICAgIHJldHVybiAyOwotICB9Ci0gIGlmIChjID49ICd7JyAmJiBjIDw9IDB4MDA3ZikgewotICAgIHNiICs9IChGWF9XQ0hBUiknXDInOwotICAgIHNiICs9IChGWF9XQ0hBUikoYyAtIDEyMyArIDI3KTsKLSAgICByZXR1cm4gMjsKLSAgfQotICBpZiAoYyA+PSAweDAwODApIHsKLSAgICBzYiArPSAoRlhfV0NIQVIpJ1wxJzsKLSAgICBzYiArPSAoRlhfV0NIQVIpMHgwMDFlOwotICAgIGludDMyX3QgbGVuID0gMjsKLSAgICBsZW4gKz0gZW5jb2RlQ2hhcigoRlhfV0NIQVIpKGMgLSAxMjgpLCBzYiwgZSk7Ci0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgIHJldHVybiAtMTsKLSAgICByZXR1cm4gbGVuOwotICB9Ci0gIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppbGxlZ2FsQ2hhcmFjdGVyKGMsIGUpOwotICByZXR1cm4gLTE7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfVGV4dEVuY29kZXIuaCBiL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19UZXh0RW5jb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjAxM2I5Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19UZXh0RW5jb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19URVhURU5DT0RFUl9IXwotI2RlZmluZSBYRkFfRlhCQVJDT0RFX0RBVEFNQVRSSVhfQkNfVEVYVEVOQ09ERVJfSF8KLQotY2xhc3MgQ0JDX1RleHRFbmNvZGVyOwotCi1jbGFzcyBDQkNfVGV4dEVuY29kZXIgOiBwdWJsaWMgQ0JDX0M0MEVuY29kZXIgewotIHB1YmxpYzoKLSAgQ0JDX1RleHRFbmNvZGVyKCk7Ci0gIH5DQkNfVGV4dEVuY29kZXIoKSBvdmVycmlkZTsKLQotICAvLyBDQkNfQzQwRW5jb2RlcgotICBpbnQzMl90IGdldEVuY29kaW5nTW9kZSgpIG92ZXJyaWRlOwotICBpbnQzMl90IGVuY29kZUNoYXIoRlhfV0NIQVIgYywgQ0ZYX1dpZGVTdHJpbmcmIHNiLCBpbnQzMl90JiBlKSBvdmVycmlkZTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX1RFWFRFTkNPREVSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfWDEyRW5jb2Rlci5jcHAgYi94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfWDEyRW5jb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3N2FmOTMuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1gxMkVuY29kZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLS8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNi0yMDA3IEplcmVtaWFzIE1hZXJraS4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvQkNfRGltZW5zaW9uLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX0M0MEVuY29kZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfRW5jb2Rlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19FbmNvZGVyQ29udGV4dC5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvZGF0YW1hdHJpeC9CQ19IaWdoTGV2ZWxFbmNvZGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1N5bWJvbEluZm8uaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfU3ltYm9sU2hhcGVIaW50LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1gxMkVuY29kZXIuaCIKLQotQ0JDX1gxMkVuY29kZXI6OkNCQ19YMTJFbmNvZGVyKCkge30KLUNCQ19YMTJFbmNvZGVyOjp+Q0JDX1gxMkVuY29kZXIoKSB7fQotaW50MzJfdCBDQkNfWDEyRW5jb2Rlcjo6Z2V0RW5jb2RpbmdNb2RlKCkgewotICByZXR1cm4gWDEyX0VOQ09EQVRJT047Ci19Ci12b2lkIENCQ19YMTJFbmNvZGVyOjpFbmNvZGUoQ0JDX0VuY29kZXJDb250ZXh0JiBjb250ZXh0LCBpbnQzMl90JiBlKSB7Ci0gIENGWF9XaWRlU3RyaW5nIGJ1ZmZlcjsKLSAgd2hpbGUgKGNvbnRleHQuaGFzTW9yZUNoYXJhY3RlcnMoKSkgewotICAgIEZYX1dDSEFSIGMgPSBjb250ZXh0LmdldEN1cnJlbnRDaGFyKCk7Ci0gICAgY29udGV4dC5tX3BvcysrOwotICAgIGVuY29kZUNoYXIoYywgYnVmZmVyLCBlKTsKLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGludDMyX3QgY291bnQgPSBidWZmZXIuR2V0TGVuZ3RoKCk7Ci0gICAgaWYgKChjb3VudCAlIDMpID09IDApIHsKLSAgICAgIHdyaXRlTmV4dFRyaXBsZXQoY29udGV4dCwgYnVmZmVyKTsKLSAgICAgIGludDMyX3QgbmV3TW9kZSA9IENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpsb29rQWhlYWRUZXN0KAotICAgICAgICAgIGNvbnRleHQubV9tc2csIGNvbnRleHQubV9wb3MsIGdldEVuY29kaW5nTW9kZSgpKTsKLSAgICAgIGlmIChuZXdNb2RlICE9IGdldEVuY29kaW5nTW9kZSgpKSB7Ci0gICAgICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShuZXdNb2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGhhbmRsZUVPRChjb250ZXh0LCBidWZmZXIsIGUpOwotfQotdm9pZCBDQkNfWDEyRW5jb2Rlcjo6aGFuZGxlRU9EKENCQ19FbmNvZGVyQ29udGV4dCYgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgY29udGV4dC51cGRhdGVTeW1ib2xJbmZvKGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGludDMyX3QgYXZhaWxhYmxlID0KLSAgICAgIGNvbnRleHQubV9zeW1ib2xJbmZvLT5tX2RhdGFDYXBhY2l0eSAtIGNvbnRleHQuZ2V0Q29kZXdvcmRDb3VudCgpOwotICBpbnQzMl90IGNvdW50ID0gYnVmZmVyLkdldExlbmd0aCgpOwotICBpZiAoY291bnQgPT0gMikgewotICAgIGNvbnRleHQud3JpdGVDb2Rld29yZChDQkNfSGlnaExldmVsRW5jb2Rlcjo6WDEyX1VOTEFUQ0gpOwotICAgIGNvbnRleHQubV9wb3MgLT0gMjsKLSAgICBjb250ZXh0LnNpZ25hbEVuY29kZXJDaGFuZ2UoQVNDSUlfRU5DT0RBVElPTik7Ci0gIH0gZWxzZSBpZiAoY291bnQgPT0gMSkgewotICAgIGNvbnRleHQubV9wb3MtLTsKLSAgICBpZiAoYXZhaWxhYmxlID4gMSkgewotICAgICAgY29udGV4dC53cml0ZUNvZGV3b3JkKENCQ19IaWdoTGV2ZWxFbmNvZGVyOjpYMTJfVU5MQVRDSCk7Ci0gICAgfQotICAgIGNvbnRleHQuc2lnbmFsRW5jb2RlckNoYW5nZShBU0NJSV9FTkNPREFUSU9OKTsKLSAgfQotfQotaW50MzJfdCBDQkNfWDEyRW5jb2Rlcjo6ZW5jb2RlQ2hhcihGWF9XQ0hBUiBjLCBDRlhfV2lkZVN0cmluZyYgc2IsIGludDMyX3QmIGUpIHsKLSAgaWYgKGMgPT0gJ1xyJykgewotICAgIHNiICs9IChGWF9XQ0hBUiknXDAnOwotICB9IGVsc2UgaWYgKGMgPT0gJyonKSB7Ci0gICAgc2IgKz0gKEZYX1dDSEFSKSdcMSc7Ci0gIH0gZWxzZSBpZiAoYyA9PSAnPicpIHsKLSAgICBzYiArPSAoRlhfV0NIQVIpJ1wyJzsKLSAgfSBlbHNlIGlmIChjID09ICcgJykgewotICAgIHNiICs9IChGWF9XQ0hBUiknXDMnOwotICB9IGVsc2UgaWYgKGMgPj0gJzAnICYmIGMgPD0gJzknKSB7Ci0gICAgc2IgKz0gKEZYX1dDSEFSKShjIC0gNDggKyA0KTsKLSAgfSBlbHNlIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgewotICAgIHNiICs9IChGWF9XQ0hBUikoYyAtIDY1ICsgMTQpOwotICB9IGVsc2UgewotICAgIENCQ19IaWdoTGV2ZWxFbmNvZGVyOjppbGxlZ2FsQ2hhcmFjdGVyKGMsIGUpOwotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfWDEyRW5jb2Rlci5oIGIveGZhL2Z4YmFyY29kZS9kYXRhbWF0cml4L0JDX1gxMkVuY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIyMzljZS4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL2RhdGFtYXRyaXgvQkNfWDEyRW5jb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19YMTJFTkNPREVSX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfREFUQU1BVFJJWF9CQ19YMTJFTkNPREVSX0hfCi0KLWNsYXNzIENCQ19DNDBFbmNvZGVyOwotY2xhc3MgQ0JDX1gxMkVuY29kZXI7Ci1jbGFzcyBDQkNfWDEyRW5jb2RlciA6IHB1YmxpYyBDQkNfQzQwRW5jb2RlciB7Ci0gcHVibGljOgotICBDQkNfWDEyRW5jb2RlcigpOwotICB+Q0JDX1gxMkVuY29kZXIoKSBvdmVycmlkZTsKLQotICAvLyBDQkNfQzQwRW5jb2RlcgotICBpbnQzMl90IGdldEVuY29kaW5nTW9kZSgpIG92ZXJyaWRlOwotICB2b2lkIEVuY29kZShDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICB2b2lkIGhhbmRsZUVPRChDQkNfRW5jb2RlckNvbnRleHQmIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBidWZmZXIsCi0gICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICBpbnQzMl90IGVuY29kZUNoYXIoRlhfV0NIQVIgYywgQ0ZYX1dpZGVTdHJpbmcmIHNiLCBpbnQzMl90JiBlKSBvdmVycmlkZTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYQkFSQ09ERV9EQVRBTUFUUklYX0JDX1gxMkVOQ09ERVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuY3BwIGIveGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMGQ2MWYuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0ODUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgotLyoKLSAqIENvcHlyaWdodCAyMDExIFpYaW5nIGF1dGhvcnMKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2Z4Z2VkZXZpY2UuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dlbW9kdWxlLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9ncmFwaHN0YXRlZGF0YS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcGF0aGRhdGEuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfdW5pY29kZWVuY29kaW5nZXguaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9CQ19Xcml0ZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCIKLQotQ0JDX09uZURpbVdyaXRlcjo6Q0JDX09uZURpbVdyaXRlcigpIHsKLSAgbV9sb2NUZXh0TG9jID0gQkNfVEVYVF9MT0NfQkVMT1dFTUJFRDsKLSAgbV9iUHJpbnRDaGVja3N1bSA9IHRydWU7Ci0gIG1faURhdGFMZW50aCA9IDA7Ci0gIG1fYkNhbGNDaGVja3N1bSA9IGZhbHNlOwotICBtX3BGb250ID0gbnVsbHB0cjsKLSAgbV9mRm9udFNpemUgPSAxMDsKLSAgbV9pRm9udFN0eWxlID0gMDsKLSAgbV9mb250Q29sb3IgPSAweGZmMDAwMDAwOwotICBtX2lDb250ZW50TGVuID0gMDsKLSAgbV9iTGVmdFBhZGRpbmcgPSBmYWxzZTsKLSAgbV9iUmlnaHRQYWRkaW5nID0gZmFsc2U7Ci19Ci0KLUNCQ19PbmVEaW1Xcml0ZXI6On5DQkNfT25lRGltV3JpdGVyKCkge30KLQotdm9pZCBDQkNfT25lRGltV3JpdGVyOjpTZXRQcmludENoZWNrc3VtKGJvb2wgY2hlY2tzdW0pIHsKLSAgbV9iUHJpbnRDaGVja3N1bSA9IGNoZWNrc3VtOwotfQotCi12b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpIHsKLSAgbV9pRGF0YUxlbnRoID0gbGVuZ3RoOwotfQotCi12b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlNldENhbGNDaGVja3N1bShib29sIHN0YXRlKSB7Ci0gIG1fYkNhbGNDaGVja3N1bSA9IHN0YXRlOwotfQotCi1ib29sIENCQ19PbmVEaW1Xcml0ZXI6OlNldEZvbnQoQ0ZYX0ZvbnQqIGNGb250KSB7Ci0gIGlmICghY0ZvbnQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG1fcEZvbnQgPSBjRm9udDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ0JDX09uZURpbVdyaXRlcjo6U2V0Rm9udFNpemUoRlhfRkxPQVQgc2l6ZSkgewotICBtX2ZGb250U2l6ZSA9IHNpemU7Ci19Ci0KLXZvaWQgQ0JDX09uZURpbVdyaXRlcjo6U2V0Rm9udFN0eWxlKGludDMyX3Qgc3R5bGUpIHsKLSAgbV9pRm9udFN0eWxlID0gc3R5bGU7Ci19Ci0KLXZvaWQgQ0JDX09uZURpbVdyaXRlcjo6U2V0Rm9udENvbG9yKEZYX0FSR0IgY29sb3IpIHsKLSAgbV9mb250Q29sb3IgPSBjb2xvcjsKLX0KLQotRlhfV0NIQVIgQ0JDX09uZURpbVdyaXRlcjo6VXBwZXIoRlhfV0NIQVIgY2gpIHsKLSAgaWYgKGNoID49ICdhJyAmJiBjaCA8PSAneicpIHsKLSAgICBjaCA9IGNoIC0gKCdhJyAtICdBJyk7Ci0gIH0KLSAgcmV0dXJuIGNoOwotfQotCi11aW50OF90KiBDQkNfT25lRGltV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIHVpbnQ4X3QqIHJldCA9IG51bGxwdHI7Ci0gIG91dEhlaWdodCA9IDE7Ci0gIGlmIChtX1dpZHRoID49IDIwKSB7Ci0gICAgcmV0ID0gRW5jb2RlKGNvbnRlbnRzLCBvdXRXaWR0aCwgZSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0ID0gRW5jb2RlKGNvbnRlbnRzLCBvdXRXaWR0aCwgZSk7Ci0gIH0KLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIHJldDsKLX0KLQotdWludDhfdCogQ0JDX09uZURpbVdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgdWludDhfdCogcmV0ID0gRW5jb2RlKGNvbnRlbnRzLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIDAsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBudWxscHRyOwotICByZXR1cm4gcmV0OwotfQotCi11aW50OF90KiBDQkNfT25lRGltV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dExlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1pbnQzMl90IENCQ19PbmVEaW1Xcml0ZXI6OkFwcGVuZFBhdHRlcm4odWludDhfdCogdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QqIHBhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwYXR0ZXJuTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRDb2xvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGlmIChzdGFydENvbG9yICE9IDAgJiYgc3RhcnRDb2xvciAhPSAxKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uVmFsdWVNdXN0QmVFaXRoZXIwb3IxOwotICAgIHJldHVybiAwOwotICB9Ci0gIHVpbnQ4X3QgY29sb3IgPSAodWludDhfdClzdGFydENvbG9yOwotICBpbnQzMl90IG51bUFkZGVkID0gMDsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcGF0dGVybkxlbmd0aDsgaSsrKSB7Ci0gICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgcGF0dGVybltpXTsgaisrKSB7Ci0gICAgICB0YXJnZXRbcG9zXSA9IGNvbG9yOwotICAgICAgcG9zICs9IDE7Ci0gICAgICBudW1BZGRlZCArPSAxOwotICAgIH0KLSAgICBjb2xvciBePSAxOwotICB9Ci0gIHJldHVybiBudW1BZGRlZDsKLX0KLQotdm9pZCBDQkNfT25lRGltV3JpdGVyOjpDYWxjVGV4dEluZm8oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyogY2hhclBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBjRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGdlV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZvbnRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGNoYXJzTGVuKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfVW5pY29kZUVuY29kaW5nRXg+IGVuY29kaW5nKAotICAgICAgRlhfQ3JlYXRlRm9udEVuY29kaW5nRXgoY0ZvbnQpKTsKLQotICBpbnQzMl90IGxlbmd0aCA9IHRleHQuR2V0TGVuZ3RoKCk7Ci0gIHVpbnQzMl90KiBwQ2hhckNvZGUgPSBGWF9BbGxvYyh1aW50MzJfdCwgdGV4dC5HZXRMZW5ndGgoKSk7Ci0gIEZYX0ZMT0FUIGNoYXJXaWR0aCA9IDA7Ci0gIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IHRleHQuR2V0TGVuZ3RoKCk7IGorKykgewotICAgIHBDaGFyQ29kZVtqXSA9IGVuY29kaW5nLT5DaGFyQ29kZUZyb21Vbmljb2RlKHRleHRbal0pOwotICAgIGludDMyX3QgZ2x5cF9jb2RlID0gZW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKHBDaGFyQ29kZVtqXSk7Ci0gICAgaW50MzJfdCBnbHlwX3ZhbHVlID0gY0ZvbnQtPkdldEdseXBoV2lkdGgoZ2x5cF9jb2RlKTsKLSAgICBGWF9GTE9BVCB0ZW1wID0gKEZYX0ZMT0FUKSgoZ2x5cF92YWx1ZSkqZm9udFNpemUgLyAxMDAwLjApOwotICAgIGNoYXJXaWR0aCArPSB0ZW1wOwotICB9Ci0gIGNoYXJzTGVuID0gY2hhcldpZHRoOwotICBGWF9GTE9BVCBsZWZ0UG9zaXRvbiA9IChGWF9GTE9BVCkoZ2VXaWR0aCAtIGNoYXJzTGVuKSAvIDIuMGY7Ci0gIGlmIChsZWZ0UG9zaXRvbiA8IDAgJiYgZ2VXaWR0aCA9PSAwKSB7Ci0gICAgbGVmdFBvc2l0b24gPSAwOwotICB9Ci0gIEZYX0ZMT0FUIHBlblggPSAwLjA7Ci0gIEZYX0ZMT0FUIHBlblkgPQotICAgICAgKEZYX0ZMT0FUKUZYU1lTX2FicyhjRm9udC0+R2V0RGVzY2VudCgpKSAqIChGWF9GTE9BVClmb250U2l6ZSAvIDEwMDAuMGY7Ci0gIEZYX0ZMT0FUIGxlZnQgPSBsZWZ0UG9zaXRvbjsKLSAgRlhfRkxPQVQgdG9wID0gMC4wOwotICBjaGFyUG9zWzBdLm1fT3JpZ2luID0gQ0ZYX1BvaW50RihwZW5YICsgbGVmdCwgcGVuWSArIHRvcCk7Ci0gIGNoYXJQb3NbMF0ubV9HbHlwaEluZGV4ID0gZW5jb2RpbmctPkdseXBoRnJvbUNoYXJDb2RlKHBDaGFyQ29kZVswXSk7Ci0gIGNoYXJQb3NbMF0ubV9Gb250Q2hhcldpZHRoID0gY0ZvbnQtPkdldEdseXBoV2lkdGgoY2hhclBvc1swXS5tX0dseXBoSW5kZXgpOwotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCi0gIGNoYXJQb3NbMF0ubV9FeHRHSUQgPSBjaGFyUG9zWzBdLm1fR2x5cGhJbmRleDsKLSNlbmRpZgotICBwZW5YICs9IChGWF9GTE9BVCkoY2hhclBvc1swXS5tX0ZvbnRDaGFyV2lkdGgpICogKEZYX0ZMT0FUKWZvbnRTaXplIC8gMTAwMC4wZjsKLSAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICBjaGFyUG9zW2ldLm1fT3JpZ2luID0gQ0ZYX1BvaW50RihwZW5YICsgbGVmdCwgcGVuWSArIHRvcCk7Ci0gICAgY2hhclBvc1tpXS5tX0dseXBoSW5kZXggPSBlbmNvZGluZy0+R2x5cGhGcm9tQ2hhckNvZGUocENoYXJDb2RlW2ldKTsKLSAgICBjaGFyUG9zW2ldLm1fRm9udENoYXJXaWR0aCA9IGNGb250LT5HZXRHbHlwaFdpZHRoKGNoYXJQb3NbaV0ubV9HbHlwaEluZGV4KTsKLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotICAgIGNoYXJQb3NbaV0ubV9FeHRHSUQgPSBjaGFyUG9zW2ldLm1fR2x5cGhJbmRleDsKLSNlbmRpZgotICAgIHBlblggKz0KLSAgICAgICAgKEZYX0ZMT0FUKShjaGFyUG9zW2ldLm1fRm9udENoYXJXaWR0aCkgKiAoRlhfRkxPQVQpZm9udFNpemUgLyAxMDAwLjBmOwotICB9Ci0gIEZYX0ZyZWUocENoYXJDb2RlKTsKLX0KLQotdm9pZCBDQkNfT25lRGltV3JpdGVyOjpTaG93RGV2aWNlQ2hhcnMoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZ2VXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGxvY1gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBsb2NZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiYXJXaWR0aCkgewotICBpbnQzMl90IGlGb250U2l6ZSA9IChpbnQzMl90KWZhYnMobV9mRm9udFNpemUpOwotICBpbnQzMl90IGlUZXh0SGVpZ2h0ID0gaUZvbnRTaXplICsgMTsKLSAgQ0ZYX0Zsb2F0UmVjdCByZWN0KChGWF9GTE9BVClsb2NYLCAoRlhfRkxPQVQpbG9jWSwgKEZYX0ZMT0FUKShsb2NYICsgZ2VXaWR0aCksCi0gICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKGxvY1kgKyBpVGV4dEhlaWdodCkpOwotICBpZiAoZ2VXaWR0aCAhPSBtX1dpZHRoKSB7Ci0gICAgcmVjdC5yaWdodCAtPSAxOwotICB9Ci0gIG1hdHJpeC0+VHJhbnNmb3JtUmVjdChyZWN0KTsKLSAgRlhfUkVDVCByZSA9IHJlY3QuR2V0T3V0ZXJSZWN0KCk7Ci0gIGRldmljZS0+RmlsbFJlY3QoJnJlLCBtX2JhY2tncm91bmRDb2xvcik7Ci0gIENGWF9NYXRyaXggYWZmaW5lX21hdHJpeCgxLjAsIDAuMCwgMC4wLCAtMS4wLCAoRlhfRkxPQVQpbG9jWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChGWF9GTE9BVCkobG9jWSArIGlGb250U2l6ZSkpOwotICBpZiAobWF0cml4KSB7Ci0gICAgYWZmaW5lX21hdHJpeC5Db25jYXQoKm1hdHJpeCk7Ci0gIH0KLSAgZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChzdHIuR2V0TGVuZ3RoKCksIHBDaGFyUG9zLCBtX3BGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihpRm9udFNpemUpLCAmYWZmaW5lX21hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7Ci19Ci0KLXZvaWQgQ0JDX09uZURpbVdyaXRlcjo6U2hvd0JpdG1hcENoYXJzKENGWF9ESUJpdG1hcCogcE91dEJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGdlV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBsb2NYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbG9jWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYmFyV2lkdGgpIHsKLSAgaW50MzJfdCBpRm9udFNpemUgPSAoaW50MzJfdClmYWJzKG1fZkZvbnRTaXplKTsKLSAgaW50MzJfdCBpVGV4dEhlaWdodCA9IGlGb250U2l6ZSArIDE7Ci0gIENGWF9GeGdlRGV2aWNlIGdlOwotICBnZS5DcmVhdGUoKGludClnZVdpZHRoLCBpVGV4dEhlaWdodCwgbV9jb2xvclNwYWNlLCBudWxscHRyKTsKLSAgRlhfUkVDVCBnZVJlY3QoMCwgMCwgKGludClnZVdpZHRoLCBpVGV4dEhlaWdodCk7Ci0gIGdlLkZpbGxSZWN0KCZnZVJlY3QsIG1fYmFja2dyb3VuZENvbG9yKTsKLSAgQ0ZYX01hdHJpeCBhZmZpbmVfbWF0cml4KDEuMCwgMC4wLCAwLjAsIC0xLjAsIDAuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihpRm9udFNpemUpKTsKLSAgZ2UuRHJhd05vcm1hbFRleHQoc3RyLkdldExlbmd0aCgpLCBwQ2hhclBvcywgbV9wRm9udCwKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KGlGb250U2l6ZSksICZhZmZpbmVfbWF0cml4LAotICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7Ci0gIENGWF9GeGdlRGV2aWNlIGdlQml0bWFwOwotICBnZUJpdG1hcC5BdHRhY2gocE91dEJpdG1hcCwgZmFsc2UsIG51bGxwdHIsIGZhbHNlKTsKLSAgZ2VCaXRtYXAuU2V0RElCaXRzKGdlLkdldEJpdG1hcCgpLCAoaW50KWxvY1gsIChpbnQpbG9jWSk7Ci19Ci0KLXZvaWQgQ0JDX09uZURpbVdyaXRlcjo6U2hvd0NoYXJzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPdXRCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJhcldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtdWx0aXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgaWYgKCFkZXZpY2UgJiYgIXBPdXRCaXRtYXApIHsKLSAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnQ7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmICghbV9wRm9udCkgewotICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOwotICAgIHJldHVybjsKLSAgfQotICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBGWF9VVEY4RW5jb2RlKGNvbnRlbnRzKTsKLSAgaW50MzJfdCBpTGVuID0gc3RyLkdldExlbmd0aCgpOwotICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MgPSBGWF9BbGxvYyhGWFRFWFRfQ0hBUlBPUywgaUxlbik7Ci0gIEZYU1lTX21lbXNldChwQ2hhclBvcywgMCwgc2l6ZW9mKEZYVEVYVF9DSEFSUE9TKSAqIGlMZW4pOwotICBGWF9GTE9BVCBjaGFyc0xlbiA9IDA7Ci0gIEZYX0ZMT0FUIGdlV2lkdGggPSAwOwotICBpZiAobV9sb2NUZXh0TG9jID09IEJDX1RFWFRfTE9DX0FCT1ZFRU1CRUQgfHwKLSAgICAgIG1fbG9jVGV4dExvYyA9PSBCQ19URVhUX0xPQ19CRUxPV0VNQkVEKSB7Ci0gICAgZ2VXaWR0aCA9IDA7Ci0gIH0gZWxzZSBpZiAobV9sb2NUZXh0TG9jID09IEJDX1RFWFRfTE9DX0FCT1ZFIHx8Ci0gICAgICAgICAgICAgbV9sb2NUZXh0TG9jID09IEJDX1RFWFRfTE9DX0JFTE9XKSB7Ci0gICAgZ2VXaWR0aCA9IChGWF9GTE9BVCliYXJXaWR0aDsKLSAgfQotICBpbnQzMl90IGlGb250U2l6ZSA9IChpbnQzMl90KWZhYnMobV9mRm9udFNpemUpOwotICBpbnQzMl90IGlUZXh0SGVpZ2h0ID0gaUZvbnRTaXplICsgMTsKLSAgQ2FsY1RleHRJbmZvKHN0ciwgcENoYXJQb3MsIG1fcEZvbnQsIGdlV2lkdGgsIGlGb250U2l6ZSwgY2hhcnNMZW4pOwotICBpZiAoY2hhcnNMZW4gPCAxKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGludDMyX3QgbG9jWCA9IDA7Ci0gIGludDMyX3QgbG9jWSA9IDA7Ci0gIHN3aXRjaCAobV9sb2NUZXh0TG9jKSB7Ci0gICAgY2FzZSBCQ19URVhUX0xPQ19BQk9WRUVNQkVEOgotICAgICAgbG9jWCA9IChpbnQzMl90KShiYXJXaWR0aCAtIGNoYXJzTGVuKSAvIDI7Ci0gICAgICBsb2NZID0gMDsKLSAgICAgIGdlV2lkdGggPSBjaGFyc0xlbjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkNfVEVYVF9MT0NfQUJPVkU6Ci0gICAgICBsb2NYID0gMDsKLSAgICAgIGxvY1kgPSAwOwotICAgICAgZ2VXaWR0aCA9IChGWF9GTE9BVCliYXJXaWR0aDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQkNfVEVYVF9MT0NfQkVMT1dFTUJFRDoKLSAgICAgIGxvY1ggPSAoaW50MzJfdCkoYmFyV2lkdGggLSBjaGFyc0xlbikgLyAyOwotICAgICAgbG9jWSA9IG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQ7Ci0gICAgICBnZVdpZHRoID0gY2hhcnNMZW47Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEJDX1RFWFRfTE9DX0JFTE9XOgotICAgIGRlZmF1bHQ6Ci0gICAgICBsb2NYID0gMDsKLSAgICAgIGxvY1kgPSBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0OwotICAgICAgZ2VXaWR0aCA9IChGWF9GTE9BVCliYXJXaWR0aDsKLSAgICAgIGJyZWFrOwotICB9Ci0gIGlmIChkZXZpY2UpIHsKLSAgICBTaG93RGV2aWNlQ2hhcnMoZGV2aWNlLCBtYXRyaXgsIHN0ciwgZ2VXaWR0aCwgcENoYXJQb3MsIChGWF9GTE9BVClsb2NYLAotICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpbG9jWSwgYmFyV2lkdGgpOwotICB9IGVsc2UgewotICAgIFNob3dCaXRtYXBDaGFycyhwT3V0Qml0bWFwLCBzdHIsIGdlV2lkdGgsIHBDaGFyUG9zLCAoRlhfRkxPQVQpbG9jWCwKLSAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWxvY1ksIGJhcldpZHRoKTsKLSAgfQotICBGWF9GcmVlKHBDaGFyUG9zKTsKLX0KLQotdm9pZCBDQkNfT25lRGltV3JpdGVyOjpSZW5kZXJCaXRtYXBSZXN1bHQoQ0ZYX0RJQml0bWFwKiYgcE91dEJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGlmICghbV9vdXRwdXQpCi0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgIHJldHVybjsKLQotICBwT3V0Qml0bWFwID0gQ3JlYXRlRElCaXRtYXAobV9vdXRwdXQtPkdldFdpZHRoKCksIG1fb3V0cHV0LT5HZXRIZWlnaHQoKSk7Ci0gIHBPdXRCaXRtYXAtPkNsZWFyKG1fYmFja2dyb3VuZENvbG9yKTsKLSAgaWYgKCFwT3V0Qml0bWFwKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uRmFpbFRvQ3JlYXRlQml0bWFwOwotICAgIHJldHVybjsKLSAgfQotICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBtX291dHB1dC0+R2V0V2lkdGgoKTsgeCsrKSB7Ci0gICAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgbV9vdXRwdXQtPkdldEhlaWdodCgpOyB5KyspIHsKLSAgICAgIGlmIChtX291dHB1dC0+R2V0KHgsIHkpKSB7Ci0gICAgICAgIHBPdXRCaXRtYXAtPlNldFBpeGVsKHgsIHksIG1fYmFyQ29sb3IpOwotICAgICAgfQotICAgIH0KLSAgfQotICBpbnQzMl90IGkgPSAwOwotICBmb3IgKDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspCi0gICAgaWYgKGNvbnRlbnRzLkdldEF0KGkpICE9ICcgJykgewotICAgICAgYnJlYWs7Ci0gICAgfQotICBpZiAobV9sb2NUZXh0TG9jICE9IEJDX1RFWFRfTE9DX05PTkUgJiYgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpKSB7Ci0gICAgU2hvd0NoYXJzKGNvbnRlbnRzLCBwT3V0Qml0bWFwLCBudWxscHRyLCBudWxscHRyLCBtX2JhcldpZHRoLCBtX211bHRpcGxlLAotICAgICAgICAgICAgICBlKTsKLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgcmV0dXJuOwotICB9Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IHBTdHJldGNoQml0bWFwID0KLSAgICAgIHBPdXRCaXRtYXAtPlN0cmV0Y2hUbyhtX1dpZHRoLCBtX0hlaWdodCk7Ci0gIGRlbGV0ZSBwT3V0Qml0bWFwOwotICBwT3V0Qml0bWFwID0gcFN0cmV0Y2hCaXRtYXAucmVsZWFzZSgpOwotfQotCi12b2lkIENCQ19PbmVEaW1Xcml0ZXI6OlJlbmRlckRldmljZVJlc3VsdChDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBpZiAoIW1fb3V0cHV0KQotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICByZXR1cm47Ci0KLSAgQ0ZYX0dyYXBoU3RhdGVEYXRhIHN0YXRlRGF0YTsKLSAgQ0ZYX1BhdGhEYXRhIHBhdGg7Ci0gIHBhdGguQXBwZW5kUmVjdCgwLCAwLCAoRlhfRkxPQVQpbV9XaWR0aCwgKEZYX0ZMT0FUKW1fSGVpZ2h0KTsKLSAgZGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgbWF0cml4LCAmc3RhdGVEYXRhLCBtX2JhY2tncm91bmRDb2xvciwKLSAgICAgICAgICAgICAgICAgICBtX2JhY2tncm91bmRDb2xvciwgRlhGSUxMX0FMVEVSTkFURSk7Ci0gIENGWF9NYXRyaXggbWF0cmkobV9vdXRwdXRIU2NhbGUsIDAuMCwgMC4wLCAoRlhfRkxPQVQpbV9IZWlnaHQsIDAuMCwgMC4wKTsKLSAgbWF0cmkuQ29uY2F0KCptYXRyaXgpOwotICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBtX291dHB1dC0+R2V0V2lkdGgoKTsgeCsrKSB7Ci0gICAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgbV9vdXRwdXQtPkdldEhlaWdodCgpOyB5KyspIHsKLSAgICAgIENGWF9QYXRoRGF0YSByZWN0OwotICAgICAgcmVjdC5BcHBlbmRSZWN0KChGWF9GTE9BVCl4LCAoRlhfRkxPQVQpeSwgKEZYX0ZMT0FUKSh4ICsgMSksCi0gICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKSh5ICsgMSkpOwotICAgICAgaWYgKG1fb3V0cHV0LT5HZXQoeCwgeSkpIHsKLSAgICAgICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGRhdGE7Ci0gICAgICAgIGRldmljZS0+RHJhd1BhdGgoJnJlY3QsICZtYXRyaSwgJmRhdGEsIG1fYmFyQ29sb3IsIDAsIEZYRklMTF9XSU5ESU5HKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaW50MzJfdCBpID0gMDsKLSAgZm9yICg7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKQotICAgIGlmIChjb250ZW50cy5HZXRBdChpKSAhPSAnICcpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgaWYgKG1fbG9jVGV4dExvYyAhPSBCQ19URVhUX0xPQ19OT05FICYmIGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKSkgewotICAgIFNob3dDaGFycyhjb250ZW50cywgbnVsbHB0ciwgZGV2aWNlLCBtYXRyaXgsIG1fYmFyV2lkdGgsIG1fbXVsdGlwbGUsIGUpOwotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICByZXR1cm47Ci0gIH0KLX0KLQotdm9pZCBDQkNfT25lRGltV3JpdGVyOjpSZW5kZXJSZXN1bHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBpZiAoY29kZUxlbmd0aCA8IDEpIHsKLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgcmV0dXJuOwotICB9Ci0gIGlmIChtX01vZHVsZUhlaWdodCA8IDIwLjApIHsKLSAgICBtX01vZHVsZUhlaWdodCA9IDIwOwotICB9Ci0gIGludDMyX3QgY29kZU9sZExlbmd0aCA9IGNvZGVMZW5ndGg7Ci0gIGludDMyX3QgbGVmdFBhZGRpbmcgPSAwOwotICBpbnQzMl90IHJpZ2h0UGFkZGluZyA9IDA7Ci0gIGlmIChtX2JMZWZ0UGFkZGluZykgewotICAgIGxlZnRQYWRkaW5nID0gNzsKLSAgfQotICBpZiAobV9iUmlnaHRQYWRkaW5nKSB7Ci0gICAgcmlnaHRQYWRkaW5nID0gNzsKLSAgfQotICBjb2RlTGVuZ3RoICs9IGxlZnRQYWRkaW5nOwotICBjb2RlTGVuZ3RoICs9IHJpZ2h0UGFkZGluZzsKLSAgbV9vdXRwdXRIU2NhbGUgPSAxLjA7Ci0gIGlmIChtX1dpZHRoID4gMCkgewotICAgIG1fb3V0cHV0SFNjYWxlID0gKEZYX0ZMT0FUKW1fV2lkdGggLyAoRlhfRkxPQVQpY29kZUxlbmd0aDsKLSAgfQotICBpZiAoIWlzRGV2aWNlKSB7Ci0gICAgbV9vdXRwdXRIU2NhbGUgPQotICAgICAgICBzdGQ6Om1heChtX291dHB1dEhTY2FsZSwgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KG1fTW9kdWxlV2lkdGgpKTsKLSAgfQotICBGWF9GTE9BVCBkYXRhTGVuZ3RoU2NhbGUgPSAxLjA7Ci0gIGlmIChtX2lEYXRhTGVudGggPiAwICYmIGNvbnRlbnRzLkdldExlbmd0aCgpICE9IDApIHsKLSAgICBkYXRhTGVuZ3RoU2NhbGUgPSBGWF9GTE9BVChjb250ZW50cy5HZXRMZW5ndGgoKSkgLyBGWF9GTE9BVChtX2lEYXRhTGVudGgpOwotICB9Ci0gIGlmIChtX2lEYXRhTGVudGggPiAwICYmIGNvbnRlbnRzLkdldExlbmd0aCgpID09IDApIHsKLSAgICBkYXRhTGVuZ3RoU2NhbGUgPSBGWF9GTE9BVCgxKSAvIEZYX0ZMT0FUKG1faURhdGFMZW50aCk7Ci0gIH0KLSAgbV9tdWx0aXBsZSA9IDE7Ci0gIGlmICghaXNEZXZpY2UpIHsKLSAgICBtX211bHRpcGxlID0gKGludDMyX3QpY2VpbChtX291dHB1dEhTY2FsZSAqIGRhdGFMZW5ndGhTY2FsZSk7Ci0gIH0KLSAgaW50MzJfdCBvdXRwdXRIZWlnaHQgPSAxOwotICBpZiAoIWlzRGV2aWNlKSB7Ci0gICAgaWYgKG1fSGVpZ2h0ID09IDApIHsKLSAgICAgIG91dHB1dEhlaWdodCA9IHN0ZDo6bWF4KDIwLCBtX01vZHVsZUhlaWdodCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dHB1dEhlaWdodCA9IG1fSGVpZ2h0OwotICAgIH0KLSAgfQotICBpbnQzMl90IG91dHB1dFdpZHRoID0gY29kZUxlbmd0aDsKLSAgaWYgKCFpc0RldmljZSkgewotICAgIG91dHB1dFdpZHRoID0gKGludDMyX3QpKGNvZGVMZW5ndGggKiBtX211bHRpcGxlIC8gZGF0YUxlbmd0aFNjYWxlKTsKLSAgfQotICBtX2JhcldpZHRoID0gbV9XaWR0aDsKLSAgaWYgKCFpc0RldmljZSkgewotICAgIG1fYmFyV2lkdGggPSBjb2RlTGVuZ3RoICogbV9tdWx0aXBsZTsKLSAgfQotICBtX291dHB1dCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDQkNfQ29tbW9uQml0TWF0cml4PigpOwotICBtX291dHB1dC0+SW5pdChvdXRwdXRXaWR0aCwgb3V0cHV0SGVpZ2h0KTsKLSAgaW50MzJfdCBvdXRwdXRYID0gbGVmdFBhZGRpbmcgKiBtX211bHRpcGxlOwotICBmb3IgKGludDMyX3QgaW5wdXRYID0gMDsgaW5wdXRYIDwgY29kZU9sZExlbmd0aDsgaW5wdXRYKyspIHsKLSAgICBpZiAoY29kZVtpbnB1dFhdID09IDEpIHsKLSAgICAgIGlmIChvdXRwdXRYID49IG91dHB1dFdpZHRoKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKG91dHB1dFggKyBtX211bHRpcGxlID4gb3V0cHV0V2lkdGggJiYgb3V0cHV0V2lkdGggLSBvdXRwdXRYID4gMCkgewotICAgICAgICBtX291dHB1dC0+U2V0UmVnaW9uKG91dHB1dFgsIDAsIG91dHB1dFdpZHRoIC0gb3V0cHV0WCwgb3V0cHV0SGVpZ2h0LCBlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBtX291dHB1dC0+U2V0UmVnaW9uKG91dHB1dFgsIDAsIG1fbXVsdGlwbGUsIG91dHB1dEhlaWdodCwgZSk7Ci0gICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG91dHB1dFggKz0gbV9tdWx0aXBsZTsKLSAgfQotfQotCi1ib29sIENCQ19PbmVEaW1Xcml0ZXI6OkNoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENCQ19PbmVEaW1Xcml0ZXI6OkZpbHRlckNvbnRlbnRzKAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsKLSAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENCQ19PbmVEaW1Xcml0ZXI6OlJlbmRlclRleHRDb250ZW50cygKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7Ci0gIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5oIGIveGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzdkNzc0Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYQkFSQ09ERV9PTkVEX0JDX09ORURJTVdSSVRFUl9IXwotI2RlZmluZSBYRkFfRlhCQVJDT0RFX09ORURfQkNfT05FRElNV1JJVEVSX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvQkNfTGlicmFyeS5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvQkNfV3JpdGVyLmgiCi0KLWNsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7Ci1jbGFzcyBDRlhfRm9udDsKLWNsYXNzIENGWF9SZW5kZXJEZXZpY2U7Ci0KLWNsYXNzIENCQ19PbmVEaW1Xcml0ZXIgOiBwdWJsaWMgQ0JDX1dyaXRlciB7Ci0gcHVibGljOgotICBDQkNfT25lRGltV3JpdGVyKCk7Ci0gIH5DQkNfT25lRGltV3JpdGVyKCkgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotICB2aXJ0dWFsIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7Ci0gIHZpcnR1YWwgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLQotICB2aXJ0dWFsIHZvaWQgUmVuZGVyUmVzdWx0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgdmlydHVhbCB2b2lkIFJlbmRlckJpdG1hcFJlc3VsdChDRlhfRElCaXRtYXAqJiBwT3V0Qml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7Ci0gIHZpcnR1YWwgdm9pZCBSZW5kZXJEZXZpY2VSZXN1bHQoQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotICB2aXJ0dWFsIGJvb2wgQ2hlY2tDb250ZW50VmFsaWRpdHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7Ci0gIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgRmlsdGVyQ29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cyk7Ci0gIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgUmVuZGVyVGV4dENvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpOwotICB2aXJ0dWFsIHZvaWQgU2V0UHJpbnRDaGVja3N1bShib29sIGNoZWNrc3VtKTsKLSAgdmlydHVhbCB2b2lkIFNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpOwotICB2aXJ0dWFsIHZvaWQgU2V0Q2FsY0NoZWNrc3VtKGJvb2wgc3RhdGUpOwotICB2aXJ0dWFsIHZvaWQgU2V0Rm9udFNpemUoRlhfRkxPQVQgc2l6ZSk7Ci0gIHZpcnR1YWwgdm9pZCBTZXRGb250U3R5bGUoaW50MzJfdCBzdHlsZSk7Ci0gIHZpcnR1YWwgdm9pZCBTZXRGb250Q29sb3IoRlhfQVJHQiBjb2xvcik7Ci0gIGJvb2wgU2V0Rm9udChDRlhfRm9udCogY0ZvbnQpOwotCi0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgQ2FsY1RleHRJbmZvKGNvbnN0IENGWF9CeXRlU3RyaW5nJiB0ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBjaGFyUG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9Gb250KiBjRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBnZVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZm9udFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGNoYXJzTGVuKTsKLSAgdmlydHVhbCB2b2lkIFNob3dDaGFycyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE91dEJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYmFyV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtdWx0aXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgdmlydHVhbCB2b2lkIFNob3dCaXRtYXBDaGFycyhDRlhfRElCaXRtYXAqIHBPdXRCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcgc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGdlV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGxvY1gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgbG9jWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJhcldpZHRoKTsKLSAgdmlydHVhbCB2b2lkIFNob3dEZXZpY2VDaGFycyhDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBnZVdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBsb2NYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGxvY1ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiYXJXaWR0aCk7Ci0gIHZpcnR1YWwgaW50MzJfdCBBcHBlbmRQYXR0ZXJuKHVpbnQ4X3QqIHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QqIHBhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGF0dGVybkxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydENvbG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLQotICBGWF9XQ0hBUiBVcHBlcihGWF9XQ0hBUiBjaCk7Ci0KLSAgYm9vbCBtX2JQcmludENoZWNrc3VtOwotICBpbnQzMl90IG1faURhdGFMZW50aDsKLSAgYm9vbCBtX2JDYWxjQ2hlY2tzdW07Ci0gIENGWF9Gb250KiBtX3BGb250OwotICBGWF9GTE9BVCBtX2ZGb250U2l6ZTsKLSAgaW50MzJfdCBtX2lGb250U3R5bGU7Ci0gIHVpbnQzMl90IG1fZm9udENvbG9yOwotICBCQ19URVhUX0xPQyBtX2xvY1RleHRMb2M7Ci0gIGludDMyX3QgbV9pQ29udGVudExlbjsKLSAgYm9vbCBtX2JMZWZ0UGFkZGluZzsKLSAgYm9vbCBtX2JSaWdodFBhZGRpbmc7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDQkNfQ29tbW9uQml0TWF0cml4PiBtX291dHB1dDsKLSAgaW50MzJfdCBtX2JhcldpZHRoOwotICBpbnQzMl90IG1fbXVsdGlwbGU7Ci0gIEZYX0ZMT0FUIG1fb3V0cHV0SFNjYWxlOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhCQVJDT0RFX09ORURfQkNfT05FRElNV1JJVEVSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJXcml0ZXIuY3BwIGIveGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyV3JpdGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk5ZTVlNy4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJXcml0ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLS8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMSBaWGluZyBhdXRob3JzCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL0JDX1dyaXRlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJpdEFycmF5LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kYUJhcldyaXRlci5oIgotCi1uYW1lc3BhY2UgewotCi1jb25zdCBGWF9DSEFSIEFMUEhBQkVUX1NUUklOR1tdID0gIjAxMjM0NTY3ODktJDovLitBQkNEVE4iOwotCi1jb25zdCBpbnQzMl90IENIQVJBQ1RFUl9FTkNPRElOR1NbMjJdID0gewotICAgIDB4MDAzLCAweDAwNiwgMHgwMDksIDB4MDYwLCAweDAxMiwgMHgwNDIsIDB4MDIxLCAweDAyNCwKLSAgICAweDAzMCwgMHgwNDgsIDB4MDBjLCAweDAxOCwgMHgwNDUsIDB4MDUxLCAweDA1NCwgMHgwMTUsCi0gICAgMHgwMUEsIDB4MDI5LCAweDAwQiwgMHgwMEUsIDB4MDFBLCAweDAyOX07Ci0KLWNvbnN0IEZYX0NIQVIgU1RBUlRfRU5EX0NIQVJTW10gPSB7J0EnLCAnQicsICdDJywgJ0QnLCAnVCcsICdOJywgJyonLCAnRScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhJywgJ2InLCAnYycsICdkJywgJ3QnLCAnbicsICdlJ307Ci1jb25zdCBGWF9DSEFSIENPTlRFTlRfQ0hBUlNbXSA9IHsnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc4JywgJzknLCAnLScsICckJywgJy8nLCAnOicsICcrJywgJy4nfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLUNCQ19PbmVkQ29kYUJhcldyaXRlcjo6Q0JDX09uZWRDb2RhQmFyV3JpdGVyKCkgewotICBtX2NoU3RhcnQgPSAnQSc7Ci0gIG1fY2hFbmQgPSAnQic7Ci0gIG1faVdpZGVOYXJyUmF0aW8gPSAyOwotfQotQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjp+Q0JDX09uZWRDb2RhQmFyV3JpdGVyKCkge30KLWJvb2wgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpTZXRTdGFydENoYXIoRlhfQ0hBUiBzdGFydCkgewotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShTVEFSVF9FTkRfQ0hBUlMpOyArK2kpIHsKLSAgICBpZiAoU1RBUlRfRU5EX0NIQVJTW2ldID09IHN0YXJ0KSB7Ci0gICAgICBtX2NoU3RhcnQgPSBzdGFydDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpTZXRFbmRDaGFyKEZYX0NIQVIgZW5kKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKFNUQVJUX0VORF9DSEFSUyk7ICsraSkgewotICAgIGlmIChTVEFSVF9FTkRfQ0hBUlNbaV0gPT0gZW5kKSB7Ci0gICAgICBtX2NoRW5kID0gZW5kOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLXZvaWQgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpTZXREYXRhTGVuZ3RoKGludDMyX3QgbGVuZ3RoKSB7Ci0gIG1faURhdGFMZW50aCA9IGxlbmd0aCArIDI7Ci19Ci1ib29sIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6U2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKSB7Ci0gIGlmIChsb2NhdGlvbiA8IEJDX1RFWFRfTE9DX05PTkUgfHwgbG9jYXRpb24gPiBCQ19URVhUX0xPQ19CRUxPV0VNQkVEKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIG1fbG9jVGV4dExvYyA9IGxvY2F0aW9uOwotICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpTZXRXaWRlTmFycm93UmF0aW8oaW50MzJfdCByYXRpbykgewotICBpZiAocmF0aW8gPCAyIHx8IHJhdGlvID4gMykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBtX2lXaWRlTmFyclJhdGlvID0gcmF0aW87Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDQkNfT25lZENvZGFCYXJXcml0ZXI6OkZpbmRDaGFyKEZYX1dDSEFSIGNoLCBib29sIGlzQ29udGVudCkgewotICBpZiAoaXNDb250ZW50KSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoQ09OVEVOVF9DSEFSUyk7ICsraSkgewotICAgICAgaWYgKGNoID09IChGWF9XQ0hBUilDT05URU5UX0NIQVJTW2ldKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IEZYX0FycmF5U2l6ZShTVEFSVF9FTkRfQ0hBUlMpOyArK2opIHsKLSAgICAgIGlmIChjaCA9PSAoRlhfV0NIQVIpU1RBUlRfRU5EX0NIQVJTW2pdKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoQ09OVEVOVF9DSEFSUyk7ICsraSkgewotICAgICAgaWYgKGNoID09IChGWF9XQ0hBUilDT05URU5UX0NIQVJTW2ldKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLWJvb2wgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpDaGVja0NvbnRlbnRWYWxpZGl0eSgKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7Ci0gIEZYX1dDSEFSIGNoOwotICBpbnQzMl90IGluZGV4ID0gMDsKLSAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGluZGV4KyspIHsKLSAgICBjaCA9IGNvbnRlbnRzLkdldEF0KGluZGV4KTsKLSAgICBpZiAoRmluZENoYXIoY2gsIGZhbHNlKSkgewotICAgICAgY29udGludWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci1DRlhfV2lkZVN0cmluZyBDQkNfT25lZENvZGFCYXJXcml0ZXI6OkZpbHRlckNvbnRlbnRzKAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgZmlsdGVyY29udGVudHM7Ci0gIEZYX1dDSEFSIGNoOwotICBmb3IgKGludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpbmRleCsrKSB7Ci0gICAgY2ggPSBjb250ZW50cy5HZXRBdChpbmRleCk7Ci0gICAgaWYgKGNoID4gMTc1KSB7Ci0gICAgICBpbmRleCsrOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChGaW5kQ2hhcihjaCwgdHJ1ZSkpIHsKLSAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZpbHRlcmNvbnRlbnRzOwotfQotdWludDhfdCogQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIHVpbnQ4X3QqIHJldCA9IEVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCAwLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIHJldDsKLX0KLXVpbnQ4X3QqIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgaWYgKGZvcm1hdCAhPSBCQ0ZPUk1BVF9DT0RBQkFSKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uT25seUVuY29kZUNPREVCQVI7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgdWludDhfdCogcmV0ID0KLSAgICAgIENCQ19PbmVEaW1Xcml0ZXI6OkVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBoaW50cywgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIHJldHVybiByZXQ7Ci19Ci11aW50OF90KiBDQkNfT25lZENvZGFCYXJXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIENGWF9CeXRlU3RyaW5nIGRhdGEgPSBtX2NoU3RhcnQgKyBjb250ZW50cyArIG1fY2hFbmQ7Ci0gIG1faUNvbnRlbnRMZW4gPSBkYXRhLkdldExlbmd0aCgpOwotICB1aW50OF90KiByZXN1bHQgPSBGWF9BbGxvYzJEKHVpbnQ4X3QsIG1faVdpZGVOYXJyUmF0aW8gKiA3LCBkYXRhLkdldExlbmd0aCgpKTsKLSAgRlhfQ0hBUiBjaDsKLSAgaW50MzJfdCBwb3NpdGlvbiA9IDA7Ci0gIGZvciAoaW50MzJfdCBpbmRleCA9IDA7IGluZGV4IDwgZGF0YS5HZXRMZW5ndGgoKTsgaW5kZXgrKykgewotICAgIGNoID0gZGF0YS5HZXRBdChpbmRleCk7Ci0gICAgaWYgKCgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ3onKSkpIHsKLSAgICAgIGNoID0gY2ggLSAzMjsKLSAgICB9Ci0gICAgc3dpdGNoIChjaCkgewotICAgICAgY2FzZSAnVCc6Ci0gICAgICAgIGNoID0gJ0EnOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ04nOgotICAgICAgICBjaCA9ICdCJzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICcqJzoKLSAgICAgICAgY2ggPSAnQyc7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnRSc6Ci0gICAgICAgIGNoID0gJ0QnOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpbnQzMl90IGNvZGUgPSAwOwotICAgIGludDMyX3QgbGVuID0gKGludDMyX3Qpc3RybGVuKEFMUEhBQkVUX1NUUklORyk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgIGlmIChjaCA9PSBBTFBIQUJFVF9TVFJJTkdbaV0pIHsKLSAgICAgICAgY29kZSA9IENIQVJBQ1RFUl9FTkNPRElOR1NbaV07Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICB1aW50OF90IGNvbG9yID0gMTsKLSAgICBpbnQzMl90IGNvdW50ZXIgPSAwOwotICAgIGludDMyX3QgYml0ID0gMDsKLSAgICB3aGlsZSAoYml0IDwgNykgewotICAgICAgcmVzdWx0W3Bvc2l0aW9uXSA9IGNvbG9yOwotICAgICAgcG9zaXRpb24rKzsKLSAgICAgIGlmICgoKGNvZGUgPj4gKDYgLSBiaXQpKSAmIDEpID09IDAgfHwgY291bnRlciA9PSBtX2lXaWRlTmFyclJhdGlvIC0gMSkgewotICAgICAgICBjb2xvciA9ICFjb2xvcjsKLSAgICAgICAgYml0Kys7Ci0gICAgICAgIGNvdW50ZXIgPSAwOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY291bnRlcisrOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoaW5kZXggPCBkYXRhLkdldExlbmd0aCgpIC0gMSkgewotICAgICAgcmVzdWx0W3Bvc2l0aW9uXSA9IDA7Ci0gICAgICBwb3NpdGlvbisrOwotICAgIH0KLSAgfQotICBvdXRMZW5ndGggPSBwb3NpdGlvbjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLUNGWF9XaWRlU3RyaW5nIENCQ19PbmVkQ29kYUJhcldyaXRlcjo6ZW5jb2RlZENvbnRlbnRzKAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgc3RyU3RhcnQobV9jaFN0YXJ0KTsKLSAgQ0ZYX1dpZGVTdHJpbmcgc3RyRW5kKG1fY2hFbmQpOwotICByZXR1cm4gc3RyU3RhcnQgKyBjb250ZW50cyArIHN0ckVuZDsKLX0KLXZvaWQgQ0JDX09uZWRDb2RhQmFyV3JpdGVyOjpSZW5kZXJSZXN1bHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2RlTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIENCQ19PbmVEaW1Xcml0ZXI6OlJlbmRlclJlc3VsdChlbmNvZGVkQ29udGVudHMoY29udGVudHMpLkFzU3RyaW5nQygpLCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZUxlbmd0aCwgaXNEZXZpY2UsIGUpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RhQmFyV3JpdGVyLmggYi94ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJXcml0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYzM0YS4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGFCYXJXcml0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhCQVJDT0RFX09ORURfQkNfT05FRENPREFCQVJXUklURVJfSF8KLSNkZWZpbmUgWEZBX0ZYQkFSQ09ERV9PTkVEX0JDX09ORURDT0RBQkFSV1JJVEVSX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9CQ19MaWJyYXJ5LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5oIgotCi1jbGFzcyBDQkNfT25lZENvZGFCYXJXcml0ZXIgOiBwdWJsaWMgQ0JDX09uZURpbVdyaXRlciB7Ci0gcHVibGljOgotICBDQkNfT25lZENvZGFCYXJXcml0ZXIoKTsKLSAgfkNCQ19PbmVkQ29kYUJhcldyaXRlcigpIG92ZXJyaWRlOwotCi0gIC8vIENCQ19PbmVEaW1Xcml0ZXIKLSAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dExlbmd0aCwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSBvdmVycmlkZTsKLSAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICBib29sIENoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIG92ZXJyaWRlOwotICBDRlhfV2lkZVN0cmluZyBGaWx0ZXJDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSBvdmVycmlkZTsKLSAgdm9pZCBTZXREYXRhTGVuZ3RoKGludDMyX3QgbGVuZ3RoKSBvdmVycmlkZTsKLQotICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIGVuY29kZWRDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKTsKLSAgdmlydHVhbCBib29sIFNldFN0YXJ0Q2hhcihGWF9DSEFSIHN0YXJ0KTsKLSAgdmlydHVhbCBib29sIFNldEVuZENoYXIoRlhfQ0hBUiBlbmQpOwotICB2aXJ0dWFsIGJvb2wgU2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKTsKLSAgdmlydHVhbCBib29sIFNldFdpZGVOYXJyb3dSYXRpbyhpbnQzMl90IHJhdGlvKTsKLSAgdmlydHVhbCBib29sIEZpbmRDaGFyKEZYX1dDSEFSIGNoLCBib29sIGlzQ29udGVudCk7Ci0KLSBwcml2YXRlOgotICB2b2lkIFJlbmRlclJlc3VsdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb2RlLAotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIG92ZXJyaWRlOwotCi0gIEZYX0NIQVIgbV9jaFN0YXJ0OwotICBGWF9DSEFSIG1fY2hFbmQ7Ci0gIGludDMyX3QgbV9pV2lkZU5hcnJSYXRpbzsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYQkFSQ09ERV9PTkVEX0JDX09ORURDT0RBQkFSV1JJVEVSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhXcml0ZXIuY3BwIGIveGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMTI4V3JpdGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2M2IxOC4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhXcml0ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLS8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMCBaWGluZyBhdXRob3JzCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL0JDX1dyaXRlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUxMjhXcml0ZXIuaCIKLQotbmFtZXNwYWNlIHsKLQotY29uc3QgaW50MzJfdCBDT0RFX1BBVFRFUk5TWzEwN11bN10gPSB7Ci0gICAgezIsIDEsIDIsIDIsIDIsIDIsIDB9LCB7MiwgMiwgMiwgMSwgMiwgMiwgMH0sIHsyLCAyLCAyLCAyLCAyLCAxLCAwfSwKLSAgICB7MSwgMiwgMSwgMiwgMiwgMywgMH0sIHsxLCAyLCAxLCAzLCAyLCAyLCAwfSwgezEsIDMsIDEsIDIsIDIsIDIsIDB9LAotICAgIHsxLCAyLCAyLCAyLCAxLCAzLCAwfSwgezEsIDIsIDIsIDMsIDEsIDIsIDB9LCB7MSwgMywgMiwgMiwgMSwgMiwgMH0sCi0gICAgezIsIDIsIDEsIDIsIDEsIDMsIDB9LCB7MiwgMiwgMSwgMywgMSwgMiwgMH0sIHsyLCAzLCAxLCAyLCAxLCAyLCAwfSwKLSAgICB7MSwgMSwgMiwgMiwgMywgMiwgMH0sIHsxLCAyLCAyLCAxLCAzLCAyLCAwfSwgezEsIDIsIDIsIDIsIDMsIDEsIDB9LAotICAgIHsxLCAxLCAzLCAyLCAyLCAyLCAwfSwgezEsIDIsIDMsIDEsIDIsIDIsIDB9LCB7MSwgMiwgMywgMiwgMiwgMSwgMH0sCi0gICAgezIsIDIsIDMsIDIsIDEsIDEsIDB9LCB7MiwgMiwgMSwgMSwgMywgMiwgMH0sIHsyLCAyLCAxLCAyLCAzLCAxLCAwfSwKLSAgICB7MiwgMSwgMywgMiwgMSwgMiwgMH0sIHsyLCAyLCAzLCAxLCAxLCAyLCAwfSwgezMsIDEsIDIsIDEsIDMsIDEsIDB9LAotICAgIHszLCAxLCAxLCAyLCAyLCAyLCAwfSwgezMsIDIsIDEsIDEsIDIsIDIsIDB9LCB7MywgMiwgMSwgMiwgMiwgMSwgMH0sCi0gICAgezMsIDEsIDIsIDIsIDEsIDIsIDB9LCB7MywgMiwgMiwgMSwgMSwgMiwgMH0sIHszLCAyLCAyLCAyLCAxLCAxLCAwfSwKLSAgICB7MiwgMSwgMiwgMSwgMiwgMywgMH0sIHsyLCAxLCAyLCAzLCAyLCAxLCAwfSwgezIsIDMsIDIsIDEsIDIsIDEsIDB9LAotICAgIHsxLCAxLCAxLCAzLCAyLCAzLCAwfSwgezEsIDMsIDEsIDEsIDIsIDMsIDB9LCB7MSwgMywgMSwgMywgMiwgMSwgMH0sCi0gICAgezEsIDEsIDIsIDMsIDEsIDMsIDB9LCB7MSwgMywgMiwgMSwgMSwgMywgMH0sIHsxLCAzLCAyLCAzLCAxLCAxLCAwfSwKLSAgICB7MiwgMSwgMSwgMywgMSwgMywgMH0sIHsyLCAzLCAxLCAxLCAxLCAzLCAwfSwgezIsIDMsIDEsIDMsIDEsIDEsIDB9LAotICAgIHsxLCAxLCAyLCAxLCAzLCAzLCAwfSwgezEsIDEsIDIsIDMsIDMsIDEsIDB9LCB7MSwgMywgMiwgMSwgMywgMSwgMH0sCi0gICAgezEsIDEsIDMsIDEsIDIsIDMsIDB9LCB7MSwgMSwgMywgMywgMiwgMSwgMH0sIHsxLCAzLCAzLCAxLCAyLCAxLCAwfSwKLSAgICB7MywgMSwgMywgMSwgMiwgMSwgMH0sIHsyLCAxLCAxLCAzLCAzLCAxLCAwfSwgezIsIDMsIDEsIDEsIDMsIDEsIDB9LAotICAgIHsyLCAxLCAzLCAxLCAxLCAzLCAwfSwgezIsIDEsIDMsIDMsIDEsIDEsIDB9LCB7MiwgMSwgMywgMSwgMywgMSwgMH0sCi0gICAgezMsIDEsIDEsIDEsIDIsIDMsIDB9LCB7MywgMSwgMSwgMywgMiwgMSwgMH0sIHszLCAzLCAxLCAxLCAyLCAxLCAwfSwKLSAgICB7MywgMSwgMiwgMSwgMSwgMywgMH0sIHszLCAxLCAyLCAzLCAxLCAxLCAwfSwgezMsIDMsIDIsIDEsIDEsIDEsIDB9LAotICAgIHszLCAxLCA0LCAxLCAxLCAxLCAwfSwgezIsIDIsIDEsIDQsIDEsIDEsIDB9LCB7NCwgMywgMSwgMSwgMSwgMSwgMH0sCi0gICAgezEsIDEsIDEsIDIsIDIsIDQsIDB9LCB7MSwgMSwgMSwgNCwgMiwgMiwgMH0sIHsxLCAyLCAxLCAxLCAyLCA0LCAwfSwKLSAgICB7MSwgMiwgMSwgNCwgMiwgMSwgMH0sIHsxLCA0LCAxLCAxLCAyLCAyLCAwfSwgezEsIDQsIDEsIDIsIDIsIDEsIDB9LAotICAgIHsxLCAxLCAyLCAyLCAxLCA0LCAwfSwgezEsIDEsIDIsIDQsIDEsIDIsIDB9LCB7MSwgMiwgMiwgMSwgMSwgNCwgMH0sCi0gICAgezEsIDIsIDIsIDQsIDEsIDEsIDB9LCB7MSwgNCwgMiwgMSwgMSwgMiwgMH0sIHsxLCA0LCAyLCAyLCAxLCAxLCAwfSwKLSAgICB7MiwgNCwgMSwgMiwgMSwgMSwgMH0sIHsyLCAyLCAxLCAxLCAxLCA0LCAwfSwgezQsIDEsIDMsIDEsIDEsIDEsIDB9LAotICAgIHsyLCA0LCAxLCAxLCAxLCAyLCAwfSwgezEsIDMsIDQsIDEsIDEsIDEsIDB9LCB7MSwgMSwgMSwgMiwgNCwgMiwgMH0sCi0gICAgezEsIDIsIDEsIDEsIDQsIDIsIDB9LCB7MSwgMiwgMSwgMiwgNCwgMSwgMH0sIHsxLCAxLCA0LCAyLCAxLCAyLCAwfSwKLSAgICB7MSwgMiwgNCwgMSwgMSwgMiwgMH0sIHsxLCAyLCA0LCAyLCAxLCAxLCAwfSwgezQsIDEsIDEsIDIsIDEsIDIsIDB9LAotICAgIHs0LCAyLCAxLCAxLCAxLCAyLCAwfSwgezQsIDIsIDEsIDIsIDEsIDEsIDB9LCB7MiwgMSwgMiwgMSwgNCwgMSwgMH0sCi0gICAgezIsIDEsIDQsIDEsIDIsIDEsIDB9LCB7NCwgMSwgMiwgMSwgMiwgMSwgMH0sIHsxLCAxLCAxLCAxLCA0LCAzLCAwfSwKLSAgICB7MSwgMSwgMSwgMywgNCwgMSwgMH0sIHsxLCAzLCAxLCAxLCA0LCAxLCAwfSwgezEsIDEsIDQsIDEsIDEsIDMsIDB9LAotICAgIHsxLCAxLCA0LCAzLCAxLCAxLCAwfSwgezQsIDEsIDEsIDEsIDEsIDMsIDB9LCB7NCwgMSwgMSwgMywgMSwgMSwgMH0sCi0gICAgezEsIDEsIDMsIDEsIDQsIDEsIDB9LCB7MSwgMSwgNCwgMSwgMywgMSwgMH0sIHszLCAxLCAxLCAxLCA0LCAxLCAwfSwKLSAgICB7NCwgMSwgMSwgMSwgMywgMSwgMH0sIHsyLCAxLCAxLCA0LCAxLCAyLCAwfSwgezIsIDEsIDEsIDIsIDEsIDQsIDB9LAotICAgIHsyLCAxLCAxLCAyLCAzLCAyLCAwfSwgezIsIDMsIDMsIDEsIDEsIDEsIDJ9fTsKLQotY29uc3QgaW50MzJfdCBDT0RFX1NUQVJUX0IgPSAxMDQ7Ci1jb25zdCBpbnQzMl90IENPREVfU1RBUlRfQyA9IDEwNTsKLWNvbnN0IGludDMyX3QgQ09ERV9TVE9QID0gMTA2OwotCi19ICAvLyBuYW1lc3BhY2UKLQotQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpDQkNfT25lZENvZGUxMjhXcml0ZXIoKSB7Ci0gIG1fY29kZUZvcm1hdCA9IEJDX0NPREUxMjhfQjsKLX0KLUNCQ19PbmVkQ29kZTEyOFdyaXRlcjo6Q0JDX09uZWRDb2RlMTI4V3JpdGVyKEJDX1RZUEUgdHlwZSkgewotICBtX2NvZGVGb3JtYXQgPSB0eXBlOwotfQotQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjp+Q0JDX09uZWRDb2RlMTI4V3JpdGVyKCkge30KLUJDX1RZUEUgQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpHZXRUeXBlKCkgewotICByZXR1cm4gbV9jb2RlRm9ybWF0OwotfQotYm9vbCBDQkNfT25lZENvZGUxMjhXcml0ZXI6OkNoZWNrQ29udGVudFZhbGlkaXR5KAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsKLSAgYm9vbCByZXQgPSB0cnVlOwotICBpbnQzMl90IHBvc2l0aW9uID0gMDsKLSAgaW50MzJfdCBwYXR0ZXJuSW5kZXggPSAtMTsKLSAgaWYgKG1fY29kZUZvcm1hdCA9PSBCQ19DT0RFMTI4X0IgfHwgbV9jb2RlRm9ybWF0ID09IEJDX0NPREUxMjhfQykgewotICAgIHdoaWxlIChwb3NpdGlvbiA8IGNvbnRlbnRzLkdldExlbmd0aCgpKSB7Ci0gICAgICBwYXR0ZXJuSW5kZXggPSAoaW50MzJfdCljb250ZW50cy5HZXRBdChwb3NpdGlvbik7Ci0gICAgICBpZiAocGF0dGVybkluZGV4IDwgMzIgfHwgcGF0dGVybkluZGV4ID4gMTI2IHx8IHBhdHRlcm5JbmRleCA9PSAzNCkgewotICAgICAgICByZXQgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBwb3NpdGlvbisrOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICByZXQgPSBmYWxzZTsKLSAgfQotICByZXR1cm4gcmV0OwotfQotQ0ZYX1dpZGVTdHJpbmcgQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpGaWx0ZXJDb250ZW50cygKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7Ci0gIENGWF9XaWRlU3RyaW5nIGZpbHRlckNoaW5lc2VDaGFyOwotICBGWF9XQ0hBUiBjaDsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgewotICAgIGNoID0gY29udGVudHMuR2V0QXQoaSk7Ci0gICAgaWYgKGNoID4gMTc1KSB7Ci0gICAgICBpKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgZmlsdGVyQ2hpbmVzZUNoYXIgKz0gY2g7Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgZmlsdGVyY29udGVudHM7Ci0gIGlmIChtX2NvZGVGb3JtYXQgPT0gQkNfQ09ERTEyOF9CKSB7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZmlsdGVyQ2hpbmVzZUNoYXIuR2V0TGVuZ3RoKCk7IGkrKykgewotICAgICAgY2ggPSBmaWx0ZXJDaGluZXNlQ2hhci5HZXRBdChpKTsKLSAgICAgIGlmIChjaCA+PSAzMiAmJiBjaCA8PSAxMjYpIHsKLSAgICAgICAgZmlsdGVyY29udGVudHMgKz0gY2g7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZiAobV9jb2RlRm9ybWF0ID09IEJDX0NPREUxMjhfQykgewotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGZpbHRlckNoaW5lc2VDaGFyLkdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgIGNoID0gZmlsdGVyQ2hpbmVzZUNoYXIuR2V0QXQoaSk7Ci0gICAgICBpZiAoY2ggPj0gMzIgJiYgY2ggPD0gMTA2KSB7Ci0gICAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIGZpbHRlcmNvbnRlbnRzID0gY29udGVudHM7Ci0gIH0KLSAgcmV0dXJuIGZpbHRlcmNvbnRlbnRzOwotfQotYm9vbCBDQkNfT25lZENvZGUxMjhXcml0ZXI6OlNldFRleHRMb2NhdGlvbihCQ19URVhUX0xPQyBsb2NhdGlvbikgewotICBpZiAobG9jYXRpb24gPCBCQ19URVhUX0xPQ19OT05FIHx8IGxvY2F0aW9uID4gQkNfVEVYVF9MT0NfQkVMT1dFTUJFRCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBtX2xvY1RleHRMb2MgPSBsb2NhdGlvbjsKLSAgcmV0dXJuIHRydWU7Ci19Ci11aW50OF90KiBDQkNfT25lZENvZGUxMjhXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGlmIChmb3JtYXQgIT0gQkNGT1JNQVRfQ09ERV8xMjgpIHsKLSAgICBlID0gQkNFeGNlcHRpb25Pbmx5RW5jb2RlQ09ERV8xMjg7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgdWludDhfdCogcmV0ID0KLSAgICAgIENCQ19PbmVEaW1Xcml0ZXI6OkVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBoaW50cywgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIHJldHVybiByZXQ7Ci19Ci11aW50OF90KiBDQkNfT25lZENvZGUxMjhXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgdWludDhfdCogcmV0ID0gRW5jb2RlKGNvbnRlbnRzLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIDAsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBudWxscHRyOwotICByZXR1cm4gcmV0OwotfQotYm9vbCBDQkNfT25lZENvZGUxMjhXcml0ZXI6OklzRGlnaXRzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGVuZ3RoKSB7Ci0gIGludDMyX3QgZW5kID0gc3RhcnQgKyBsZW5ndGg7Ci0gIGZvciAoaW50MzJfdCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewotICAgIGlmIChjb250ZW50c1tpXSA8ICcwJyB8fCBjb250ZW50c1tpXSA+ICc5JykgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdWludDhfdCogQ0JDX09uZWRDb2RlMTI4V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBpZiAoY29udGVudHMuR2V0TGVuZ3RoKCkgPCAxIHx8IGNvbnRlbnRzLkdldExlbmd0aCgpID4gODApIHsKLSAgICBlID0gQkNFeGNlcHRpb25Db250ZW50c0xlbmd0aFNob3VsZEJldHdlZW4xYW5kODA7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgQ0ZYX0FycmF5VGVtcGxhdGU8Y29uc3QgaW50MzJfdCo+IHBhdHRlcm5zOwotICBpbnQzMl90IGNoZWNrU3VtID0gMDsKLSAgaWYgKG1fY29kZUZvcm1hdCA9PSBCQ19DT0RFMTI4X0IpIHsKLSAgICBjaGVja1N1bSA9IEVuY29kZTEyOEIoY29udGVudHMsICZwYXR0ZXJucyk7Ci0gIH0gZWxzZSBpZiAobV9jb2RlRm9ybWF0ID09IEJDX0NPREUxMjhfQykgewotICAgIGNoZWNrU3VtID0gRW5jb2RlMTI4Qyhjb250ZW50cywgJnBhdHRlcm5zKTsKLSAgfSBlbHNlIHsKLSAgICBlID0gQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb247Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgY2hlY2tTdW0gJT0gMTAzOwotICBwYXR0ZXJucy5BZGQoQ09ERV9QQVRURVJOU1tjaGVja1N1bV0pOwotICBwYXR0ZXJucy5BZGQoQ09ERV9QQVRURVJOU1tDT0RFX1NUT1BdKTsKLSAgbV9pQ29udGVudExlbiA9IGNvbnRlbnRzLkdldExlbmd0aCgpICsgMzsKLSAgaW50MzJfdCBjb2RlV2lkdGggPSAwOwotICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBwYXR0ZXJucy5HZXRTaXplKCk7IGsrKykgewotICAgIGNvbnN0IGludDMyX3QqIHBhdHRlcm4gPSBwYXR0ZXJuc1trXTsKLSAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCA3OyBqKyspIHsKLSAgICAgIGNvZGVXaWR0aCArPSBwYXR0ZXJuW2pdOwotICAgIH0KLSAgfQotICBvdXRMZW5ndGggPSBjb2RlV2lkdGg7Ci0gIHVpbnQ4X3QqIHJlc3VsdCA9IEZYX0FsbG9jKHVpbnQ4X3QsIG91dExlbmd0aCk7Ci0gIGludDMyX3QgcG9zID0gMDsKLSAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgcGF0dGVybnMuR2V0U2l6ZSgpOyBqKyspIHsKLSAgICBjb25zdCBpbnQzMl90KiBwYXR0ZXJuID0gcGF0dGVybnNbal07Ci0gICAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIHBhdHRlcm4sIDcsIDEsIGUpOwotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsKLSAgICAgIEZYX0ZyZWUocmVzdWx0KTsKLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1pbnQzMl90IENCQ19PbmVkQ29kZTEyOFdyaXRlcjo6RW5jb2RlMTI4QigKLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsCi0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8Y29uc3QgaW50MzJfdCo+KiBwYXR0ZXJucykgewotICBpbnQzMl90IGNoZWNrU3VtID0gMDsKLSAgaW50MzJfdCBjaGVja1dlaWdodCA9IDE7Ci0gIGludDMyX3QgcG9zaXRpb24gPSAwOwotICBwYXR0ZXJucy0+QWRkKENPREVfUEFUVEVSTlNbQ09ERV9TVEFSVF9CXSk7Ci0gIGNoZWNrU3VtICs9IENPREVfU1RBUlRfQiAqIGNoZWNrV2VpZ2h0OwotICB3aGlsZSAocG9zaXRpb24gPCBjb250ZW50cy5HZXRMZW5ndGgoKSkgewotICAgIGludDMyX3QgcGF0dGVybkluZGV4ID0gMDsKLSAgICBwYXR0ZXJuSW5kZXggPSBjb250ZW50c1twb3NpdGlvbl0gLSAnICc7Ci0gICAgcG9zaXRpb24gKz0gMTsKLSAgICBwYXR0ZXJucy0+QWRkKENPREVfUEFUVEVSTlNbcGF0dGVybkluZGV4XSk7Ci0gICAgY2hlY2tTdW0gKz0gcGF0dGVybkluZGV4ICogY2hlY2tXZWlnaHQ7Ci0gICAgaWYgKHBvc2l0aW9uICE9IDApIHsKLSAgICAgIGNoZWNrV2VpZ2h0Kys7Ci0gICAgfQotICB9Ci0gIHJldHVybiBjaGVja1N1bTsKLX0KLQotaW50MzJfdCBDQkNfT25lZENvZGUxMjhXcml0ZXI6OkVuY29kZTEyOEMoCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgIENGWF9BcnJheVRlbXBsYXRlPGNvbnN0IGludDMyX3QqPiogcGF0dGVybnMpIHsKLSAgaW50MzJfdCBjaGVja1N1bSA9IDA7Ci0gIGludDMyX3QgY2hlY2tXZWlnaHQgPSAxOwotICBpbnQzMl90IHBvc2l0aW9uID0gMDsKLSAgcGF0dGVybnMtPkFkZChDT0RFX1BBVFRFUk5TW0NPREVfU1RBUlRfQ10pOwotICBjaGVja1N1bSArPSBDT0RFX1NUQVJUX0MgKiBjaGVja1dlaWdodDsKLSAgd2hpbGUgKHBvc2l0aW9uIDwgY29udGVudHMuR2V0TGVuZ3RoKCkpIHsKLSAgICBpbnQzMl90IHBhdHRlcm5JbmRleCA9IDA7Ci0gICAgRlhfQ0hBUiBjaCA9IGNvbnRlbnRzLkdldEF0KHBvc2l0aW9uKTsKLSAgICBpZiAoY2ggPCAnMCcgfHwgY2ggPiAnOScpIHsKLSAgICAgIHBhdHRlcm5JbmRleCA9IChpbnQzMl90KWNoOwotICAgICAgcG9zaXRpb24rKzsKLSAgICB9IGVsc2UgewotICAgICAgcGF0dGVybkluZGV4ID0gRlhTWVNfYXRvaShjb250ZW50cy5NaWQocG9zaXRpb24sIDIpLmNfc3RyKCkpOwotICAgICAgaWYgKGNvbnRlbnRzLkdldEF0KHBvc2l0aW9uICsgMSkgPCAnMCcgfHwKLSAgICAgICAgICBjb250ZW50cy5HZXRBdChwb3NpdGlvbiArIDEpID4gJzknKSB7Ci0gICAgICAgIHBvc2l0aW9uICs9IDE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwb3NpdGlvbiArPSAyOwotICAgICAgfQotICAgIH0KLSAgICBwYXR0ZXJucy0+QWRkKENPREVfUEFUVEVSTlNbcGF0dGVybkluZGV4XSk7Ci0gICAgY2hlY2tTdW0gKz0gcGF0dGVybkluZGV4ICogY2hlY2tXZWlnaHQ7Ci0gICAgaWYgKHBvc2l0aW9uICE9IDApIHsKLSAgICAgIGNoZWNrV2VpZ2h0Kys7Ci0gICAgfQotICB9Ci0gIHJldHVybiBjaGVja1N1bTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTEyOFdyaXRlci5oIGIveGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMTI4V3JpdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYTJmMDMuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMTI4V3JpdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYQkFSQ09ERV9PTkVEX0JDX09ORURDT0RFMTI4V1JJVEVSX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfT05FRF9CQ19PTkVEQ09ERTEyOFdSSVRFUl9IXwotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVEaW1Xcml0ZXIuaCIKLQotY2xhc3MgQ0JDX09uZWRDb2RlMTI4V3JpdGVyIDogcHVibGljIENCQ19PbmVEaW1Xcml0ZXIgewotIHB1YmxpYzoKLSAgQ0JDX09uZWRDb2RlMTI4V3JpdGVyKCk7Ci0gIGV4cGxpY2l0IENCQ19PbmVkQ29kZTEyOFdyaXRlcihCQ19UWVBFIHR5cGUpOwotICB+Q0JDX09uZWRDb2RlMTI4V3JpdGVyKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ0JDX09uZURpbVdyaXRlcgotICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0gIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0KLSAgYm9vbCBDaGVja0NvbnRlbnRWYWxpZGl0eShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSBvdmVycmlkZTsKLSAgQ0ZYX1dpZGVTdHJpbmcgRmlsdGVyQ29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgb3ZlcnJpZGU7Ci0KLSAgYm9vbCBTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pOwotCi0gIEJDX1RZUEUgR2V0VHlwZSgpOwotCi0gcHJpdmF0ZToKLSAgYm9vbCBJc0RpZ2l0cyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsIGludDMyX3Qgc3RhcnQsIGludDMyX3QgbGVuZ3RoKTsKLSAgaW50MzJfdCBFbmNvZGUxMjhCKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgIENGWF9BcnJheVRlbXBsYXRlPGNvbnN0IGludDMyX3QqPiogcGF0dGVybnMpOwotICBpbnQzMl90IEVuY29kZTEyOEMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Y29uc3QgaW50MzJfdCo+KiBwYXR0ZXJucyk7Ci0KLSAgQkNfVFlQRSBtX2NvZGVGb3JtYXQ7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfT05FRF9CQ19PTkVEQ09ERTEyOFdSSVRFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlXcml0ZXIuY3BwIGIveGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlXcml0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWJhNWM4Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkQ29kZTM5V3JpdGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0vLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6Ci0vKgotICogQ29weXJpZ2h0IDIwMTAgWlhpbmcgYXV0aG9ycwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9CQ19Xcml0ZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lRGltV3JpdGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlXcml0ZXIuaCIKLQotbmFtZXNwYWNlIHsKLQotY29uc3QgRlhfQ0hBUiBBTFBIQUJFVF9TVFJJTkdbXSA9Ci0gICAgIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWi0uICokLyslIjsKLQotY29uc3QgRlhfQ0hBUiBDSEVDS1NVTV9TVFJJTkdbXSA9ICIwMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVotLiAkLyslIjsKLQotY29uc3QgaW50MzJfdCBDSEFSQUNURVJfRU5DT0RJTkdTWzQ0XSA9IHsKLSAgICAweDAzNCwgMHgxMjEsIDB4MDYxLCAweDE2MCwgMHgwMzEsIDB4MTMwLCAweDA3MCwgMHgwMjUsIDB4MTI0LAotICAgIDB4MDY0LCAweDEwOSwgMHgwNDksIDB4MTQ4LCAweDAxOSwgMHgxMTgsIDB4MDU4LCAweDAwRCwgMHgxMEMsCi0gICAgMHgwNEMsIDB4MDFDLCAweDEwMywgMHgwNDMsIDB4MTQyLCAweDAxMywgMHgxMTIsIDB4MDUyLCAweDAwNywKLSAgICAweDEwNiwgMHgwNDYsIDB4MDE2LCAweDE4MSwgMHgwQzEsIDB4MUMwLCAweDA5MSwgMHgxOTAsIDB4MEQwLAotICAgIDB4MDg1LCAweDE4NCwgMHgwQzQsIDB4MDk0LCAweDBBOCwgMHgwQTIsIDB4MDhBLCAweDAyQX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1DQkNfT25lZENvZGUzOVdyaXRlcjo6Q0JDX09uZWRDb2RlMzlXcml0ZXIoKSB7Ci0gIG1faVdpZGVOYXJyUmF0aW8gPSAzOwotfQotQ0JDX09uZWRDb2RlMzlXcml0ZXI6On5DQkNfT25lZENvZGUzOVdyaXRlcigpIHt9Ci1ib29sIENCQ19PbmVkQ29kZTM5V3JpdGVyOjpDaGVja0NvbnRlbnRWYWxpZGl0eSgKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspIHsKLSAgICBGWF9XQ0hBUiBjaCA9IGNvbnRlbnRzLkdldEF0KGkpOwotICAgIGlmICgoY2ggPj0gKEZYX1dDSEFSKScwJyAmJiBjaCA8PSAoRlhfV0NIQVIpJzknKSB8fAotICAgICAgICAoY2ggPj0gKEZYX1dDSEFSKSdBJyAmJiBjaCA8PSAoRlhfV0NIQVIpJ1onKSB8fCBjaCA9PSAoRlhfV0NIQVIpJy0nIHx8Ci0gICAgICAgIGNoID09IChGWF9XQ0hBUiknLicgfHwgY2ggPT0gKEZYX1dDSEFSKScgJyB8fCBjaCA9PSAoRlhfV0NIQVIpJyonIHx8Ci0gICAgICAgIGNoID09IChGWF9XQ0hBUiknJCcgfHwgY2ggPT0gKEZYX1dDSEFSKScvJyB8fCBjaCA9PSAoRlhfV0NIQVIpJysnIHx8Ci0gICAgICAgIGNoID09IChGWF9XQ0hBUiknJScpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENCQ19PbmVkQ29kZTM5V3JpdGVyOjpGaWx0ZXJDb250ZW50cygKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7Ci0gIENGWF9XaWRlU3RyaW5nIGZpbHRlcmNvbnRlbnRzOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgRlhfV0NIQVIgY2ggPSBjb250ZW50cy5HZXRBdChpKTsKLSAgICBpZiAoY2ggPT0gKEZYX1dDSEFSKScqJyAmJiAoaSA9PSAwIHx8IGkgPT0gY29udGVudHMuR2V0TGVuZ3RoKCkgLSAxKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChjaCA+IDE3NSkgewotICAgICAgaSsrOwotICAgICAgY29udGludWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNoID0gVXBwZXIoY2gpOwotICAgIH0KLSAgICBpZiAoKGNoID49IChGWF9XQ0hBUiknMCcgJiYgY2ggPD0gKEZYX1dDSEFSKSc5JykgfHwKLSAgICAgICAgKGNoID49IChGWF9XQ0hBUiknQScgJiYgY2ggPD0gKEZYX1dDSEFSKSdaJykgfHwgY2ggPT0gKEZYX1dDSEFSKSctJyB8fAotICAgICAgICBjaCA9PSAoRlhfV0NIQVIpJy4nIHx8IGNoID09IChGWF9XQ0hBUiknICcgfHwgY2ggPT0gKEZYX1dDSEFSKScqJyB8fAotICAgICAgICBjaCA9PSAoRlhfV0NIQVIpJyQnIHx8IGNoID09IChGWF9XQ0hBUiknLycgfHwgY2ggPT0gKEZYX1dDSEFSKScrJyB8fAotICAgICAgICBjaCA9PSAoRlhfV0NIQVIpJyUnKSB7Ci0gICAgICBmaWx0ZXJjb250ZW50cyArPSBjaDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZpbHRlcmNvbnRlbnRzOwotfQotCi1DRlhfV2lkZVN0cmluZyBDQkNfT25lZENvZGUzOVdyaXRlcjo6UmVuZGVyVGV4dENvbnRlbnRzKAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgcmVuZGVyQ29udGVudHM7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvbnRlbnRzLkdldExlbmd0aCgpOyBpKyspIHsKLSAgICBGWF9XQ0hBUiBjaCA9IGNvbnRlbnRzLkdldEF0KGkpOwotICAgIGlmIChjaCA9PSAoRlhfV0NIQVIpJyonICYmIChpID09IDAgfHwgaSA9PSBjb250ZW50cy5HZXRMZW5ndGgoKSAtIDEpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKGNoID4gMTc1KSB7Ci0gICAgICBpKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKChjaCA+PSAoRlhfV0NIQVIpJzAnICYmIGNoIDw9IChGWF9XQ0hBUiknOScpIHx8Ci0gICAgICAgIChjaCA+PSAoRlhfV0NIQVIpJ0EnICYmIGNoIDw9IChGWF9XQ0hBUiknWicpIHx8Ci0gICAgICAgIChjaCA+PSAoRlhfV0NIQVIpJ2EnICYmIGNoIDw9IChGWF9XQ0hBUikneicpIHx8IGNoID09IChGWF9XQ0hBUiknLScgfHwKLSAgICAgICAgY2ggPT0gKEZYX1dDSEFSKScuJyB8fCBjaCA9PSAoRlhfV0NIQVIpJyAnIHx8IGNoID09IChGWF9XQ0hBUiknKicgfHwKLSAgICAgICAgY2ggPT0gKEZYX1dDSEFSKSckJyB8fCBjaCA9PSAoRlhfV0NIQVIpJy8nIHx8IGNoID09IChGWF9XQ0hBUiknKycgfHwKLSAgICAgICAgY2ggPT0gKEZYX1dDSEFSKSclJykgewotICAgICAgcmVuZGVyQ29udGVudHMgKz0gY2g7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZW5kZXJDb250ZW50czsKLX0KLQotYm9vbCBDQkNfT25lZENvZGUzOVdyaXRlcjo6U2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKSB7Ci0gIGlmIChsb2NhdGlvbiA8IEJDX1RFWFRfTE9DX05PTkUgfHwgbG9jYXRpb24gPiBCQ19URVhUX0xPQ19CRUxPV0VNQkVEKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIG1fbG9jVGV4dExvYyA9IGxvY2F0aW9uOwotICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgQ0JDX09uZWRDb2RlMzlXcml0ZXI6OlNldFdpZGVOYXJyb3dSYXRpbyhpbnQzMl90IHJhdGlvKSB7Ci0gIGlmIChyYXRpbyA8IDIgfHwgcmF0aW8gPiAzKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIG1faVdpZGVOYXJyUmF0aW8gPSByYXRpbzsKLSAgcmV0dXJuIHRydWU7Ci19Ci11aW50OF90KiBDQkNfT25lZENvZGUzOVdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIHVpbnQ4X3QqIHJldCA9IEVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCAwLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIHJldDsKLX0KLXVpbnQ4X3QqIENCQ19PbmVkQ29kZTM5V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgaWYgKGZvcm1hdCAhPSBCQ0ZPUk1BVF9DT0RFXzM5KSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uT25seUVuY29kZUNPREVfMzk7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgdWludDhfdCogcmV0ID0KLSAgICAgIENCQ19PbmVEaW1Xcml0ZXI6OkVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCBoaW50cywgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIHJldHVybiByZXQ7Ci19Ci12b2lkIENCQ19PbmVkQ29kZTM5V3JpdGVyOjpUb0ludEFycmF5KGludDMyX3QgYSwgaW50MzJfdCogdG9SZXR1cm4pIHsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgOTsgaSsrKSB7Ci0gICAgdG9SZXR1cm5baV0gPSAoYSAmICgxIDw8IGkpKSA9PSAwID8gMSA6IG1faVdpZGVOYXJyUmF0aW87Ci0gIH0KLX0KLUZYX0NIQVIgQ0JDX09uZWRDb2RlMzlXcml0ZXI6OkNhbGNDaGVja1N1bShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBpbnQzMl90IGxlbmd0aCA9IGNvbnRlbnRzLkdldExlbmd0aCgpOwotICBpZiAobGVuZ3RoID4gODApIHsKLSAgICBlID0gQkNFeGNlcHRpb25Db250ZW50c0xlbmd0aFNob3VsZEJldHdlZW4xYW5kODA7Ci0gICAgcmV0dXJuICcqJzsKLSAgfQotICBpbnQzMl90IGNoZWNrc3VtID0gMDsKLSAgaW50MzJfdCBsZW4gPSAoaW50MzJfdClzdHJsZW4oQUxQSEFCRVRfU1RSSU5HKTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgewotICAgIGludDMyX3QgaiA9IDA7Ci0gICAgZm9yICg7IGogPCBsZW47IGorKykgewotICAgICAgaWYgKEFMUEhBQkVUX1NUUklOR1tqXSA9PSBjb250ZW50c1tpXSkgewotICAgICAgICBpZiAoY29udGVudHNbaV0gIT0gJyonKSB7Ci0gICAgICAgICAgY2hlY2tzdW0gKz0gajsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpZiAoaiA+PSBsZW4pIHsKLSAgICAgIGUgPSBCQ0V4Y2VwdGlvblVuU3VwcG9ydGVkU3RyaW5nOwotICAgICAgcmV0dXJuICcqJzsKLSAgICB9Ci0gIH0KLSAgY2hlY2tzdW0gPSBjaGVja3N1bSAlIDQzOwotICByZXR1cm4gQ0hFQ0tTVU1fU1RSSU5HW2NoZWNrc3VtXTsKLX0KLXVpbnQ4X3QqIENCQ19PbmVkQ29kZTM5V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRsZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgRlhfQ0hBUiBjaGVja3N1bSA9IENhbGNDaGVja1N1bShjb250ZW50cywgZSk7Ci0gIGlmIChjaGVja3N1bSA9PSAnKicpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBpbnQzMl90IHdpZHRoc1s5XSA9IHswfTsKLSAgaW50MzJfdCB3aWRlU3RyaWRlTnVtID0gMzsKLSAgaW50MzJfdCBuYXJyU3RyaWRlTnVtID0gOSAtIHdpZGVTdHJpZGVOdW07Ci0gIENGWF9CeXRlU3RyaW5nIGVuY29kZWRDb250ZW50cyA9IGNvbnRlbnRzOwotICBpZiAobV9iQ2FsY0NoZWNrc3VtKSB7Ci0gICAgZW5jb2RlZENvbnRlbnRzICs9IGNoZWNrc3VtOwotICB9Ci0gIG1faUNvbnRlbnRMZW4gPSBlbmNvZGVkQ29udGVudHMuR2V0TGVuZ3RoKCk7Ci0gIGludDMyX3QgY29kZVdpZHRoID0gKHdpZGVTdHJpZGVOdW0gKiBtX2lXaWRlTmFyclJhdGlvICsgbmFyclN0cmlkZU51bSkgKiAyICsKLSAgICAgICAgICAgICAgICAgICAgICAxICsgbV9pQ29udGVudExlbjsKLSAgaW50MzJfdCBsZW4gPSAoaW50MzJfdClzdHJsZW4oQUxQSEFCRVRfU1RSSU5HKTsKLSAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbV9pQ29udGVudExlbjsgaisrKSB7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgIGlmIChBTFBIQUJFVF9TVFJJTkdbaV0gPT0gZW5jb2RlZENvbnRlbnRzW2pdKSB7Ci0gICAgICAgIFRvSW50QXJyYXkoQ0hBUkFDVEVSX0VOQ09ESU5HU1tpXSwgd2lkdGhzKTsKLSAgICAgICAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgOTsgaysrKSB7Ci0gICAgICAgICAgY29kZVdpZHRoICs9IHdpZHRoc1trXTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICBvdXRsZW5ndGggPSBjb2RlV2lkdGg7Ci0gIHVpbnQ4X3QqIHJlc3VsdCA9IEZYX0FsbG9jKHVpbnQ4X3QsIGNvZGVXaWR0aCk7Ci0gIFRvSW50QXJyYXkoQ0hBUkFDVEVSX0VOQ09ESU5HU1szOV0sIHdpZHRocyk7Ci0gIGludDMyX3QgcG9zID0gQXBwZW5kUGF0dGVybihyZXN1bHQsIDAsIHdpZHRocywgOSwgMSwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsKLSAgICBGWF9GcmVlKHJlc3VsdCk7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgaW50MzJfdCBuYXJyb3dXaGl0ZVtdID0gezF9OwotICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQsIHBvcywgbmFycm93V2hpdGUsIDEsIDAsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7Ci0gICAgRlhfRnJlZShyZXN1bHQpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIGZvciAoaW50MzJfdCBsID0gbV9pQ29udGVudExlbiAtIDE7IGwgPj0gMDsgbC0tKSB7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICAgIGlmIChBTFBIQUJFVF9TVFJJTkdbaV0gPT0gZW5jb2RlZENvbnRlbnRzW2xdKSB7Ci0gICAgICAgIFRvSW50QXJyYXkoQ0hBUkFDVEVSX0VOQ09ESU5HU1tpXSwgd2lkdGhzKTsKLSAgICAgICAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIHdpZHRocywgOSwgMSwgZSk7Ci0gICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsKLSAgICAgICAgICBGWF9GcmVlKHJlc3VsdCk7Ci0gICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIG5hcnJvd1doaXRlLCAxLCAwLCBlKTsKLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7Ci0gICAgICBGWF9GcmVlKHJlc3VsdCk7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gIH0KLSAgVG9JbnRBcnJheShDSEFSQUNURVJfRU5DT0RJTkdTWzM5XSwgd2lkdGhzKTsKLSAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIHdpZHRocywgOSwgMSwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsKLSAgICBGWF9GcmVlKHJlc3VsdCk7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29kZVdpZHRoIC8gMjsgaSsrKSB7Ci0gICAgcmVzdWx0W2ldIF49IHJlc3VsdFtjb2RlV2lkdGggLSAxIC0gaV07Ci0gICAgcmVzdWx0W2NvZGVXaWR0aCAtIDEgLSBpXSBePSByZXN1bHRbaV07Ci0gICAgcmVzdWx0W2ldIF49IHJlc3VsdFtjb2RlV2lkdGggLSAxIC0gaV07Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLUNGWF9XaWRlU3RyaW5nIENCQ19PbmVkQ29kZTM5V3JpdGVyOjplbmNvZGVkQ29udGVudHMoCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywKLSAgICBpbnQzMl90JiBlKSB7Ci0gIENGWF9XaWRlU3RyaW5nIGVuY29kZWRDb250ZW50cyhjb250ZW50cyk7Ci0gIGlmIChtX2JDYWxjQ2hlY2tzdW0gJiYgbV9iUHJpbnRDaGVja3N1bSkgewotICAgIENGWF9XaWRlU3RyaW5nIGNoZWNrc3VtQ29udGVudCA9IEZpbHRlckNvbnRlbnRzKGNvbnRlbnRzKTsKLSAgICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBjaGVja3N1bUNvbnRlbnQuVVRGOEVuY29kZSgpOwotICAgIEZYX0NIQVIgY2hlY2tzdW07Ci0gICAgY2hlY2tzdW0gPSBDYWxjQ2hlY2tTdW0oc3RyLCBlKTsKLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgcmV0dXJuIENGWF9XaWRlU3RyaW5nKCk7Ci0gICAgc3RyICs9IGNoZWNrc3VtOwotICAgIGVuY29kZWRDb250ZW50cyArPSBjaGVja3N1bTsKLSAgfQotICByZXR1cm4gZW5jb2RlZENvbnRlbnRzOwotfQotdm9pZCBDQkNfT25lZENvZGUzOVdyaXRlcjo6UmVuZGVyUmVzdWx0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIENGWF9XaWRlU3RyaW5nIGVuY29kZWRDb24gPSBlbmNvZGVkQ29udGVudHMoY29udGVudHMsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybjsKLSAgQ0JDX09uZURpbVdyaXRlcjo6UmVuZGVyUmVzdWx0KGVuY29kZWRDb24uQXNTdHJpbmdDKCksIGNvZGUsIGNvZGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0RldmljZSwgZSk7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVdyaXRlci5oIGIveGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRDb2RlMzlXcml0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg3NTVhMy4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lZENvZGUzOVdyaXRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfT05FRF9CQ19PTkVEQ09ERTM5V1JJVEVSX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfT05FRF9CQ19PTkVEQ09ERTM5V1JJVEVSX0hfCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL0JDX0xpYnJhcnkuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lRGltV3JpdGVyLmgiCi0KLWNsYXNzIENCQ19PbmVkQ29kZTM5V3JpdGVyIDogcHVibGljIENCQ19PbmVEaW1Xcml0ZXIgewotIHB1YmxpYzoKLSAgQ0JDX09uZWRDb2RlMzlXcml0ZXIoKTsKLSAgfkNCQ19PbmVkQ29kZTM5V3JpdGVyKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ0JDX09uZURpbVdyaXRlcgotICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSBvdmVycmlkZTsKLSAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgUmVuZGVyUmVzdWx0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvZGUsCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgQ2hlY2tDb250ZW50VmFsaWRpdHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgb3ZlcnJpZGU7Ci0gIENGWF9XaWRlU3RyaW5nIEZpbHRlckNvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIG92ZXJyaWRlOwotICBDRlhfV2lkZVN0cmluZyBSZW5kZXJUZXh0Q29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBDRlhfV2lkZVN0cmluZyBlbmNvZGVkQ29udGVudHMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7Ci0gIHZpcnR1YWwgYm9vbCBTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jdGlvbik7Ci0gIHZpcnR1YWwgYm9vbCBTZXRXaWRlTmFycm93UmF0aW8oaW50MzJfdCByYXRpbyk7Ci0KLSBwcml2YXRlOgotICB2b2lkIFRvSW50QXJyYXkoaW50MzJfdCBhLCBpbnQzMl90KiB0b1JldHVybik7Ci0gIEZYX0NIQVIgQ2FsY0NoZWNrU3VtKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywgaW50MzJfdCYgZSk7Ci0KLSAgaW50MzJfdCBtX2lXaWRlTmFyclJhdGlvOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhCQVJDT0RFX09ORURfQkNfT05FRENPREUzOVdSSVRFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU4xM1dyaXRlci5jcHAgYi94ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzV3JpdGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNiYzgwYS4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjEzV3JpdGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMwOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0vLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6Ci0vKgotICogQ29weXJpZ2h0IDIwMDkgWlhpbmcgYXV0aG9ycwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9meGdlZGV2aWNlLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9nZW1vZHVsZS5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvQkNfV3JpdGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNXcml0ZXIuaCIKLQotbmFtZXNwYWNlIHsKLQotY29uc3QgaW50MzJfdCBGSVJTVF9ESUdJVF9FTkNPRElOR1NbMTBdID0gezB4MDAsIDB4MEIsIDB4MEQsIDB4RSwgIDB4MTMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxOSwgMHgxQywgMHgxNSwgMHgxNiwgMHgxQX07Ci1jb25zdCBpbnQzMl90IFNUQVJUX0VORF9QQVRURVJOWzNdID0gezEsIDEsIDF9OwotY29uc3QgaW50MzJfdCBNSURETEVfUEFUVEVSTls1XSA9IHsxLCAxLCAxLCAxLCAxfTsKLWNvbnN0IGludDMyX3QgTF9QQVRURVJOU1sxMF1bNF0gPSB7Ci0gICAgezMsIDIsIDEsIDF9LCB7MiwgMiwgMiwgMX0sIHsyLCAxLCAyLCAyfSwgezEsIDQsIDEsIDF9LCB7MSwgMSwgMywgMn0sCi0gICAgezEsIDIsIDMsIDF9LCB7MSwgMSwgMSwgNH0sIHsxLCAzLCAxLCAyfSwgezEsIDIsIDEsIDN9LCB7MywgMSwgMSwgMn19OwotY29uc3QgaW50MzJfdCBMX0FORF9HX1BBVFRFUk5TWzIwXVs0XSA9IHsKLSAgICB7MywgMiwgMSwgMX0sIHsyLCAyLCAyLCAxfSwgezIsIDEsIDIsIDJ9LCB7MSwgNCwgMSwgMX0sIHsxLCAxLCAzLCAyfSwKLSAgICB7MSwgMiwgMywgMX0sIHsxLCAxLCAxLCA0fSwgezEsIDMsIDEsIDJ9LCB7MSwgMiwgMSwgM30sIHszLCAxLCAxLCAyfSwKLSAgICB7MSwgMSwgMiwgM30sIHsxLCAyLCAyLCAyfSwgezIsIDIsIDEsIDJ9LCB7MSwgMSwgNCwgMX0sIHsyLCAzLCAxLCAxfSwKLSAgICB7MSwgMywgMiwgMX0sIHs0LCAxLCAxLCAxfSwgezIsIDEsIDMsIDF9LCB7MywgMSwgMiwgMX0sIHsyLCAxLCAxLCAzfX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1DQkNfT25lZEVBTjEzV3JpdGVyOjpDQkNfT25lZEVBTjEzV3JpdGVyKCkgewotICBtX2JMZWZ0UGFkZGluZyA9IHRydWU7Ci0gIG1fY29kZVdpZHRoID0gMyArICg3ICogNikgKyA1ICsgKDcgKiA2KSArIDM7Ci19Ci1DQkNfT25lZEVBTjEzV3JpdGVyOjp+Q0JDX09uZWRFQU4xM1dyaXRlcigpIHt9Ci1ib29sIENCQ19PbmVkRUFOMTNXcml0ZXI6OkNoZWNrQ29udGVudFZhbGlkaXR5KAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgewotICAgIGlmIChjb250ZW50cy5HZXRBdChpKSA+PSAnMCcgJiYgY29udGVudHMuR2V0QXQoaSkgPD0gJzknKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLUNGWF9XaWRlU3RyaW5nIENCQ19PbmVkRUFOMTNXcml0ZXI6OkZpbHRlckNvbnRlbnRzKAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgZmlsdGVyY29udGVudHM7Ci0gIEZYX1dDSEFSIGNoOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgY2ggPSBjb250ZW50cy5HZXRBdChpKTsKLSAgICBpZiAoY2ggPiAxNzUpIHsKLSAgICAgIGkrKzsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgewotICAgICAgZmlsdGVyY29udGVudHMgKz0gY2g7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmaWx0ZXJjb250ZW50czsKLX0KLWludDMyX3QgQ0JDX09uZWRFQU4xM1dyaXRlcjo6Q2FsY0NoZWNrc3VtKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cykgewotICBpbnQzMl90IG9kZCA9IDA7Ci0gIGludDMyX3QgZXZlbiA9IDA7Ci0gIGludDMyX3QgaiA9IDE7Ci0gIGZvciAoaW50MzJfdCBpID0gY29udGVudHMuR2V0TGVuZ3RoKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgIGlmIChqICUgMikgewotICAgICAgb2RkICs9IEZYU1lTX2F0b2koY29udGVudHMuTWlkKGksIDEpLmNfc3RyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldmVuICs9IEZYU1lTX2F0b2koY29udGVudHMuTWlkKGksIDEpLmNfc3RyKCkpOwotICAgIH0KLSAgICBqKys7Ci0gIH0KLSAgaW50MzJfdCBjaGVja3N1bSA9IChvZGQgKiAzICsgZXZlbikgJSAxMDsKLSAgY2hlY2tzdW0gPSAoMTAgLSBjaGVja3N1bSkgJSAxMDsKLSAgcmV0dXJuIChjaGVja3N1bSk7Ci19Ci11aW50OF90KiBDQkNfT25lZEVBTjEzV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICB1aW50OF90KiByZXQgPSBFbmNvZGUoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgMCwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIHJldHVybiByZXQ7Ci19Ci11aW50OF90KiBDQkNfT25lZEVBTjEzV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGlmIChmb3JtYXQgIT0gQkNGT1JNQVRfRUFOXzEzKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uT25seUVuY29kZUVBTl8xMzsKLSAgfQotICB1aW50OF90KiByZXQgPQotICAgICAgQ0JDX09uZURpbVdyaXRlcjo6RW5jb2RlKGNvbnRlbnRzLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIGhpbnRzLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIHJldDsKLX0KLXVpbnQ4X3QqIENCQ19PbmVkRUFOMTNXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgaWYgKGNvbnRlbnRzLkdldExlbmd0aCgpICE9IDEzKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uRGlnaXRMZW5ndGhTaG91bGQxMzsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBtX2lEYXRhTGVudGggPSAxMzsKLSAgaW50MzJfdCBmaXJzdERpZ2l0ID0gRlhTWVNfYXRvaShjb250ZW50cy5NaWQoMCwgMSkuY19zdHIoKSk7Ci0gIGludDMyX3QgcGFyaXRpZXMgPSBGSVJTVF9ESUdJVF9FTkNPRElOR1NbZmlyc3REaWdpdF07Ci0gIG91dExlbmd0aCA9IG1fY29kZVdpZHRoOwotICB1aW50OF90KiByZXN1bHQgPSBGWF9BbGxvYyh1aW50OF90LCBtX2NvZGVXaWR0aCk7Ci0gIGludDMyX3QgcG9zID0gMDsKLSAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIFNUQVJUX0VORF9QQVRURVJOLCAzLCAxLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgewotICAgIEZYX0ZyZWUocmVzdWx0KTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBpbnQzMl90IGkgPSAwOwotICBmb3IgKGkgPSAxOyBpIDw9IDY7IGkrKykgewotICAgIGludDMyX3QgZGlnaXQgPSBGWFNZU19hdG9pKGNvbnRlbnRzLk1pZChpLCAxKS5jX3N0cigpKTsKLSAgICBpZiAoKHBhcml0aWVzID4+ICg2IC0gaSkgJiAxKSA9PSAxKSB7Ci0gICAgICBkaWdpdCArPSAxMDsKLSAgICB9Ci0gICAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIExfQU5EX0dfUEFUVEVSTlNbZGlnaXRdLCA0LCAwLCBlKTsKLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7Ci0gICAgICBGWF9GcmVlKHJlc3VsdCk7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gIH0KLSAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIE1JRERMRV9QQVRURVJOLCA1LCAwLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgewotICAgIEZYX0ZyZWUocmVzdWx0KTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBmb3IgKGkgPSA3OyBpIDw9IDEyOyBpKyspIHsKLSAgICBpbnQzMl90IGRpZ2l0ID0gRlhTWVNfYXRvaShjb250ZW50cy5NaWQoaSwgMSkuY19zdHIoKSk7Ci0gICAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIExfUEFUVEVSTlNbZGlnaXRdLCA0LCAxLCBlKTsKLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7Ci0gICAgICBGWF9GcmVlKHJlc3VsdCk7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gIH0KLSAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIFNUQVJUX0VORF9QQVRURVJOLCAzLCAxLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgewotICAgIEZYX0ZyZWUocmVzdWx0KTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIENCQ19PbmVkRUFOMTNXcml0ZXI6OlNob3dDaGFycyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwT3V0Qml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiYXJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbXVsdGlwbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGlmICghZGV2aWNlICYmICFwT3V0Qml0bWFwKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50OwotICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IGxlZnRQYWRkaW5nID0gNyAqIG11bHRpcGxlOwotICBpbnQzMl90IGxlZnRQb3NpdGlvbiA9IDMgKiBtdWx0aXBsZSArIGxlZnRQYWRkaW5nOwotICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBGWF9VVEY4RW5jb2RlKGNvbnRlbnRzKTsKLSAgaW50MzJfdCBpTGVuID0gc3RyLkdldExlbmd0aCgpOwotICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MgPSBGWF9BbGxvYyhGWFRFWFRfQ0hBUlBPUywgaUxlbik7Ci0gIEZYU1lTX21lbXNldChwQ2hhclBvcywgMCwgc2l6ZW9mKEZYVEVYVF9DSEFSUE9TKSAqIGlMZW4pOwotICBDRlhfRnhnZURldmljZSBnZUJpdG1hcDsKLSAgaWYgKHBPdXRCaXRtYXApCi0gICAgZ2VCaXRtYXAuQXR0YWNoKHBPdXRCaXRtYXAsIGZhbHNlLCBudWxscHRyLCBmYWxzZSk7Ci0KLSAgaW50MzJfdCBpRm9udFNpemUgPSAoaW50MzJfdClmYWJzKG1fZkZvbnRTaXplKTsKLSAgaW50MzJfdCBpVGV4dEhlaWdodCA9IGlGb250U2l6ZSArIDE7Ci0gIENGWF9CeXRlU3RyaW5nIHRlbXBTdHIgPSBzdHIuTWlkKDEsIDYpOwotICBpbnQzMl90IHN0cldpZHRoID0gbXVsdGlwbGUgKiA0MjsKLSAgaWYgKCFwT3V0Qml0bWFwKSB7Ci0gICAgQ0ZYX01hdHJpeCBtYXRyKG1fb3V0cHV0SFNjYWxlLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByZWN0KAotICAgICAgICAoRlhfRkxPQVQpbGVmdFBvc2l0aW9uLCAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpLAotICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIHN0cldpZHRoIC0gMC41KSwgKEZYX0ZMT0FUKW1fSGVpZ2h0KTsKLSAgICBtYXRyLkNvbmNhdCgqbWF0cml4KTsKLSAgICBtYXRyLlRyYW5zZm9ybVJlY3QocmVjdCk7Ci0gICAgRlhfUkVDVCByZSA9IHJlY3QuR2V0T3V0ZXJSZWN0KCk7Ci0gICAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsKLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QxKAotICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIDQ3ICogbXVsdGlwbGUpLAotICAgICAgICAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpLAotICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIDQ3ICogbXVsdGlwbGUgKyBzdHJXaWR0aCAtIDAuNSksCi0gICAgICAgIChGWF9GTE9BVCltX0hlaWdodCk7Ci0gICAgQ0ZYX01hdHJpeCBtYXRyMShtX291dHB1dEhTY2FsZSwgMC4wLCAwLjAsIDEuMCwgMC4wLCAwLjApOwotICAgIG1hdHIxLkNvbmNhdCgqbWF0cml4KTsKLSAgICBtYXRyMS5UcmFuc2Zvcm1SZWN0KHJlY3QxKTsKLSAgICByZSA9IHJlY3QxLkdldE91dGVyUmVjdCgpOwotICAgIGRldmljZS0+RmlsbFJlY3QoJnJlLCBtX2JhY2tncm91bmRDb2xvcik7Ci0gICAgaW50MzJfdCBzdHJXaWR0aDEgPSBtdWx0aXBsZSAqIDc7Ci0gICAgQ0ZYX01hdHJpeCBtYXRyMihtX291dHB1dEhTY2FsZSwgMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMC4wZik7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByZWN0MigwLjBmLCAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKXN0cldpZHRoMSAtIDAuNWYsIChGWF9GTE9BVCltX0hlaWdodCk7Ci0gICAgbWF0cjIuQ29uY2F0KCptYXRyaXgpOwotICAgIG1hdHIyLlRyYW5zZm9ybVJlY3QocmVjdDIpOwotICAgIHJlID0gcmVjdDIuR2V0T3V0ZXJSZWN0KCk7Ci0gICAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsKLSAgfQotICBGWF9GTE9BVCBibGFuayA9IDAuMDsKLSAgaUxlbiA9IHRlbXBTdHIuR2V0TGVuZ3RoKCk7Ci0gIGlmICghcE91dEJpdG1hcCkgewotICAgIHN0cldpZHRoID0gKGludDMyX3QpKHN0cldpZHRoICogbV9vdXRwdXRIU2NhbGUpOwotICB9Ci0gIENhbGNUZXh0SW5mbyh0ZW1wU3RyLCBwQ2hhclBvcyArIDEsIG1fcEZvbnQsIChGWF9GTE9BVClzdHJXaWR0aCwgaUZvbnRTaXplLAotICAgICAgICAgICAgICAgYmxhbmspOwotICBDRlhfTWF0cml4IGFmZmluZV9tYXRyaXgoMS4wLCAwLjAsIDAuMCwgLTEuMCwgMC4wLCAoRlhfRkxPQVQpaUZvbnRTaXplKTsKLSAgQ0ZYX0Z4Z2VEZXZpY2UgZ2U7Ci0gIGlmIChwT3V0Qml0bWFwKSB7Ci0gICAgZ2UuQ3JlYXRlKHN0cldpZHRoLCBpVGV4dEhlaWdodCwgRlhESUJfQXJnYiwgbnVsbHB0cik7Ci0gICAgRlhfUkVDVCByZWN0KDAsIDAsIHN0cldpZHRoLCBpVGV4dEhlaWdodCk7Ci0gICAgZ2UuRmlsbFJlY3QoJnJlY3QsIG1fYmFja2dyb3VuZENvbG9yKTsKLSAgICBnZS5EcmF3Tm9ybWFsVGV4dChpTGVuLCBwQ2hhclBvcyArIDEsIG1fcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KGlGb250U2l6ZSksICZhZmZpbmVfbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsKLSAgICBnZUJpdG1hcC5TZXRESUJpdHMoZ2UuR2V0Qml0bWFwKCksIGxlZnRQb3NpdGlvbiwgbV9IZWlnaHQgLSBpVGV4dEhlaWdodCk7Ci0gIH0gZWxzZSB7Ci0gICAgQ0ZYX01hdHJpeCBhZmZpbmVfbWF0cml4MSgxLjAsIDAuMCwgMC4wLCAtMS4wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWxlZnRQb3NpdGlvbiAqIG1fb3V0cHV0SFNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KSArIGlGb250U2l6ZSk7Ci0gICAgaWYgKG1hdHJpeCkgewotICAgICAgYWZmaW5lX21hdHJpeDEuQ29uY2F0KCptYXRyaXgpOwotICAgIH0KLSAgICBkZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlMZW4sIHBDaGFyUG9zICsgMSwgbV9wRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihpRm9udFNpemUpLCAmYWZmaW5lX21hdHJpeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7Ci0gIH0KLSAgdGVtcFN0ciA9IHN0ci5NaWQoNywgNik7Ci0gIGlMZW4gPSB0ZW1wU3RyLkdldExlbmd0aCgpOwotICBDYWxjVGV4dEluZm8odGVtcFN0ciwgcENoYXJQb3MgKyA3LCBtX3BGb250LCAoRlhfRkxPQVQpc3RyV2lkdGgsIGlGb250U2l6ZSwKLSAgICAgICAgICAgICAgIGJsYW5rKTsKLSAgaWYgKHBPdXRCaXRtYXApIHsKLSAgICBGWF9SRUNUIHJlY3QxKDAsIDAsIHN0cldpZHRoLCBpVGV4dEhlaWdodCk7Ci0gICAgZ2UuRmlsbFJlY3QoJnJlY3QxLCBtX2JhY2tncm91bmRDb2xvcik7Ci0gICAgZ2UuRHJhd05vcm1hbFRleHQoaUxlbiwgcENoYXJQb3MgKyA3LCBtX3BGb250LAotICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihpRm9udFNpemUpLCAmYWZmaW5lX21hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7Ci0gICAgZ2VCaXRtYXAuU2V0RElCaXRzKGdlLkdldEJpdG1hcCgpLCBsZWZ0UG9zaXRpb24gKyA0NyAqIG11bHRpcGxlLAotICAgICAgICAgICAgICAgICAgICAgICBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KTsKLSAgfSBlbHNlIHsKLSAgICBDRlhfTWF0cml4IGFmZmluZV9tYXRyaXgxKAotICAgICAgICAxLjAsIDAuMCwgMC4wLCAtMS4wLAotICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIDQ3ICogbXVsdGlwbGUpICogbV9vdXRwdXRIU2NhbGUsCi0gICAgICAgIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCArIGlGb250U2l6ZSkpOwotICAgIGlmIChtYXRyaXgpIHsKLSAgICAgIGFmZmluZV9tYXRyaXgxLkNvbmNhdCgqbWF0cml4KTsKLSAgICB9Ci0gICAgZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChpTGVuLCBwQ2hhclBvcyArIDcsIG1fcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGWF9GTE9BVD4oaUZvbnRTaXplKSwgJmFmZmluZV9tYXRyaXgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOwotICB9Ci0gIHRlbXBTdHIgPSBzdHIuTWlkKDAsIDEpOwotICBpTGVuID0gdGVtcFN0ci5HZXRMZW5ndGgoKTsKLSAgc3RyV2lkdGggPSBtdWx0aXBsZSAqIDc7Ci0gIGlmICghcE91dEJpdG1hcCkKLSAgICBzdHJXaWR0aCA9IChpbnQzMl90KShzdHJXaWR0aCAqIG1fb3V0cHV0SFNjYWxlKTsKLQotICBDYWxjVGV4dEluZm8odGVtcFN0ciwgcENoYXJQb3MsIG1fcEZvbnQsIChGWF9GTE9BVClzdHJXaWR0aCwgaUZvbnRTaXplLAotICAgICAgICAgICAgICAgYmxhbmspOwotICBpZiAocE91dEJpdG1hcCkgewotICAgIGRlbGV0ZSBnZS5HZXRCaXRtYXAoKTsKLSAgICBnZS5DcmVhdGUoc3RyV2lkdGgsIGlUZXh0SGVpZ2h0LCBGWERJQl9BcmdiLCBudWxscHRyKTsKLSAgICBnZS5HZXRCaXRtYXAoKS0+Q2xlYXIobV9iYWNrZ3JvdW5kQ29sb3IpOwotICAgIGdlLkRyYXdOb3JtYWxUZXh0KGlMZW4sIHBDaGFyUG9zLCBtX3BGb250LCBzdGF0aWNfY2FzdDxGWF9GTE9BVD4oaUZvbnRTaXplKSwKLSAgICAgICAgICAgICAgICAgICAgICAmYWZmaW5lX21hdHJpeCwgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOwotICAgIGdlQml0bWFwLlNldERJQml0cyhnZS5HZXRCaXRtYXAoKSwgMCwgbV9IZWlnaHQgLSBpVGV4dEhlaWdodCk7Ci0gIH0gZWxzZSB7Ci0gICAgQ0ZYX01hdHJpeCBhZmZpbmVfbWF0cml4MSgxLjAsIDAuMCwgMC4wLCAtMS4wLCAwLjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQgKyBpRm9udFNpemUpKTsKLSAgICBpZiAobWF0cml4KSB7Ci0gICAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7Ci0gICAgfQotICAgIGRldmljZS0+RHJhd05vcm1hbFRleHQoaUxlbiwgcENoYXJQb3MsIG1fcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGWF9GTE9BVD4oaUZvbnRTaXplKSwgJmFmZmluZV9tYXRyaXgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOwotICB9Ci0gIEZYX0ZyZWUocENoYXJQb3MpOwotfQotCi12b2lkIENCQ19PbmVkRUFOMTNXcml0ZXI6OlJlbmRlclJlc3VsdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIENCQ19PbmVEaW1Xcml0ZXI6OlJlbmRlclJlc3VsdChjb250ZW50cywgY29kZSwgY29kZUxlbmd0aCwgaXNEZXZpY2UsIGUpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU4xM1dyaXRlci5oIGIveGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU4xM1dyaXRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Nzc1Zjg5Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOMTNXcml0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhCQVJDT0RFX09ORURfQkNfT05FREVBTjEzV1JJVEVSX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfT05FRF9CQ19PTkVERUFOMTNXUklURVJfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lRGltV3JpdGVyLmgiCi0KLWNsYXNzIENGWF9ESUJpdG1hcDsKLWNsYXNzIENGWF9SZW5kZXJEZXZpY2U7Ci0KLWNsYXNzIENCQ19PbmVkRUFOMTNXcml0ZXIgOiBwdWJsaWMgQ0JDX09uZURpbVdyaXRlciB7Ci0gcHVibGljOgotICBDQkNfT25lZEVBTjEzV3JpdGVyKCk7Ci0gIH5DQkNfT25lZEVBTjEzV3JpdGVyKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ0JDX09uZURpbVdyaXRlcgotICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSBvdmVycmlkZTsKLSAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgaW50MzJfdCBoaW50cywKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgUmVuZGVyUmVzdWx0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvZGUsCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgQ2hlY2tDb250ZW50VmFsaWRpdHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgb3ZlcnJpZGU7Ci0gIENGWF9XaWRlU3RyaW5nIEZpbHRlckNvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIG92ZXJyaWRlOwotCi0gIGludDMyX3QgQ2FsY0NoZWNrc3VtKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cyk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2hvd0NoYXJzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgIENGWF9ESUJpdG1hcCogcE91dEJpdG1hcCwKLSAgICAgICAgICAgICAgICAgQ0ZYX1JlbmRlckRldmljZSogZGV2aWNlLAotICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgIGludDMyX3QgYmFyV2lkdGgsCi0gICAgICAgICAgICAgICAgIGludDMyX3QgbXVsdGlwbGUsCi0gICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgaW50MzJfdCBtX2NvZGVXaWR0aDsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYQkFSQ09ERV9PTkVEX0JDX09ORURFQU4xM1dSSVRFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU44V3JpdGVyLmNwcCBiL3hmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFdyaXRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MDIyMzguLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU44V3JpdGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0vLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6Ci0vKgotICogQ29weXJpZ2h0IDIwMDkgWlhpbmcgYXV0aG9ycwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9meGdlZGV2aWNlLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9nZW1vZHVsZS5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvQkNfV3JpdGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0TWF0cml4LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkRUFOOFdyaXRlci5oIgotCi1uYW1lc3BhY2UgewotCi1jb25zdCBpbnQzMl90IFNUQVJUX0VORF9QQVRURVJOWzNdID0gezEsIDEsIDF9OwotY29uc3QgaW50MzJfdCBNSURETEVfUEFUVEVSTls1XSA9IHsxLCAxLCAxLCAxLCAxfTsKLWNvbnN0IGludDMyX3QgTF9QQVRURVJOU1sxMF1bNF0gPSB7Ci0gICAgezMsIDIsIDEsIDF9LCB7MiwgMiwgMiwgMX0sIHsyLCAxLCAyLCAyfSwgezEsIDQsIDEsIDF9LCB7MSwgMSwgMywgMn0sCi0gICAgezEsIDIsIDMsIDF9LCB7MSwgMSwgMSwgNH0sIHsxLCAzLCAxLCAyfSwgezEsIDIsIDEsIDN9LCB7MywgMSwgMSwgMn19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotQ0JDX09uZWRFQU44V3JpdGVyOjpDQkNfT25lZEVBTjhXcml0ZXIoKSB7Ci0gIG1faURhdGFMZW50aCA9IDg7Ci0gIG1fY29kZVdpZHRoID0gMyArICg3ICogNCkgKyA1ICsgKDcgKiA0KSArIDM7Ci19Ci1DQkNfT25lZEVBTjhXcml0ZXI6On5DQkNfT25lZEVBTjhXcml0ZXIoKSB7fQotdm9pZCBDQkNfT25lZEVBTjhXcml0ZXI6OlNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpIHsKLSAgbV9pRGF0YUxlbnRoID0gODsKLX0KLWJvb2wgQ0JDX09uZWRFQU44V3JpdGVyOjpTZXRUZXh0TG9jYXRpb24oQkNfVEVYVF9MT0MgbG9jYXRpb24pIHsKLSAgaWYgKGxvY2F0aW9uID09IEJDX1RFWFRfTE9DX0JFTE9XRU1CRUQpIHsKLSAgICBtX2xvY1RleHRMb2MgPSBsb2NhdGlvbjsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIENCQ19PbmVkRUFOOFdyaXRlcjo6Q2hlY2tDb250ZW50VmFsaWRpdHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgewotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50cy5HZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgaWYgKGNvbnRlbnRzLkdldEF0KGkpID49ICcwJyAmJiBjb250ZW50cy5HZXRBdChpKSA8PSAnOScpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotQ0ZYX1dpZGVTdHJpbmcgQ0JDX09uZWRFQU44V3JpdGVyOjpGaWx0ZXJDb250ZW50cygKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7Ci0gIENGWF9XaWRlU3RyaW5nIGZpbHRlcmNvbnRlbnRzOwotICBGWF9XQ0hBUiBjaDsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgewotICAgIGNoID0gY29udGVudHMuR2V0QXQoaSk7Ci0gICAgaWYgKGNoID4gMTc1KSB7Ci0gICAgICBpKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKLSAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOwotICAgIH0KLSAgfQotICByZXR1cm4gZmlsdGVyY29udGVudHM7Ci19Ci1pbnQzMl90IENCQ19PbmVkRUFOOFdyaXRlcjo6Q2FsY0NoZWNrc3VtKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cykgewotICBpbnQzMl90IG9kZCA9IDA7Ci0gIGludDMyX3QgZXZlbiA9IDA7Ci0gIGludDMyX3QgaiA9IDE7Ci0gIGZvciAoaW50MzJfdCBpID0gY29udGVudHMuR2V0TGVuZ3RoKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgIGlmIChqICUgMikgewotICAgICAgb2RkICs9IEZYU1lTX2F0b2koY29udGVudHMuTWlkKGksIDEpLmNfc3RyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBldmVuICs9IEZYU1lTX2F0b2koY29udGVudHMuTWlkKGksIDEpLmNfc3RyKCkpOwotICAgIH0KLSAgICBqKys7Ci0gIH0KLSAgaW50MzJfdCBjaGVja3N1bSA9IChvZGQgKiAzICsgZXZlbikgJSAxMDsKLSAgY2hlY2tzdW0gPSAoMTAgLSBjaGVja3N1bSkgJSAxMDsKLSAgcmV0dXJuIChjaGVja3N1bSk7Ci19Ci11aW50OF90KiBDQkNfT25lZEVBTjhXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgdWludDhfdCogcmV0ID0gRW5jb2RlKGNvbnRlbnRzLCBmb3JtYXQsIG91dFdpZHRoLCBvdXRIZWlnaHQsIDAsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBudWxscHRyOwotICByZXR1cm4gcmV0OwotfQotdWludDhfdCogQ0JDX09uZWRFQU44V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBpZiAoZm9ybWF0ICE9IEJDRk9STUFUX0VBTl84KSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uT25seUVuY29kZUVBTl84OwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHVpbnQ4X3QqIHJldCA9Ci0gICAgICBDQkNfT25lRGltV3JpdGVyOjpFbmNvZGUoY29udGVudHMsIGZvcm1hdCwgb3V0V2lkdGgsIG91dEhlaWdodCwgaGludHMsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBudWxscHRyOwotICByZXR1cm4gcmV0OwotfQotdWludDhfdCogQ0JDX09uZWRFQU44V3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBpZiAoY29udGVudHMuR2V0TGVuZ3RoKCkgIT0gOCkgewotICAgIGUgPSBCQ0V4Y2VwdGlvbkRpZ2l0TGVuZ3RoTXVzdEJlODsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBvdXRMZW5ndGggPSBtX2NvZGVXaWR0aDsKLSAgdWludDhfdCogcmVzdWx0ID0gRlhfQWxsb2ModWludDhfdCwgbV9jb2RlV2lkdGgpOwotICBpbnQzMl90IHBvcyA9IDA7Ci0gIHBvcyArPSBBcHBlbmRQYXR0ZXJuKHJlc3VsdCwgcG9zLCBTVEFSVF9FTkRfUEFUVEVSTiwgMywgMSwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsKLSAgICBGWF9GcmVlKHJlc3VsdCk7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgaW50MzJfdCBpID0gMDsKLSAgZm9yIChpID0gMDsgaSA8PSAzOyBpKyspIHsKLSAgICBpbnQzMl90IGRpZ2l0ID0gRlhTWVNfYXRvaShjb250ZW50cy5NaWQoaSwgMSkuY19zdHIoKSk7Ci0gICAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIExfUEFUVEVSTlNbZGlnaXRdLCA0LCAwLCBlKTsKLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7Ci0gICAgICBGWF9GcmVlKHJlc3VsdCk7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gIH0KLSAgcG9zICs9IEFwcGVuZFBhdHRlcm4ocmVzdWx0LCBwb3MsIE1JRERMRV9QQVRURVJOLCA1LCAwLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgewotICAgIEZYX0ZyZWUocmVzdWx0KTsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBmb3IgKGkgPSA0OyBpIDw9IDc7IGkrKykgewotICAgIGludDMyX3QgZGlnaXQgPSBGWFNZU19hdG9pKGNvbnRlbnRzLk1pZChpLCAxKS5jX3N0cigpKTsKLSAgICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQsIHBvcywgTF9QQVRURVJOU1tkaWdpdF0sIDQsIDEsIGUpOwotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsKLSAgICAgIEZYX0ZyZWUocmVzdWx0KTsKLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgfQotICBwb3MgKz0gQXBwZW5kUGF0dGVybihyZXN1bHQsIHBvcywgU1RBUlRfRU5EX1BBVFRFUk4sIDMsIDEsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKSB7Ci0gICAgRlhfRnJlZShyZXN1bHQpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgQ0JDX09uZWRFQU44V3JpdGVyOjpTaG93Q2hhcnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwT3V0Qml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBiYXJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtdWx0aXBsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBpZiAoIWRldmljZSAmJiAhcE91dEJpdG1hcCkgewotICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbnQzMl90IGxlZnRQb3NpdGlvbiA9IDMgKiBtdWx0aXBsZTsKLSAgQ0ZYX0J5dGVTdHJpbmcgc3RyID0gRlhfVVRGOEVuY29kZShjb250ZW50cyk7Ci0gIGludDMyX3QgaUxlbmd0aCA9IHN0ci5HZXRMZW5ndGgoKTsKLSAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zID0gRlhfQWxsb2MoRlhURVhUX0NIQVJQT1MsIGlMZW5ndGgpOwotICBGWFNZU19tZW1zZXQocENoYXJQb3MsIDAsIHNpemVvZihGWFRFWFRfQ0hBUlBPUykgKiBpTGVuZ3RoKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgdGVtcFN0ciA9IHN0ci5NaWQoMCwgNCk7Ci0gIGludDMyX3QgaUxlbiA9IHRlbXBTdHIuR2V0TGVuZ3RoKCk7Ci0gIGludDMyX3Qgc3RyV2lkdGggPSA3ICogbXVsdGlwbGUgKiA0OwotICBGWF9GTE9BVCBibGFuayA9IDAuMDsKLSAgQ0ZYX0Z4Z2VEZXZpY2UgZ2VCaXRtYXA7Ci0gIGlmIChwT3V0Qml0bWFwKQotICAgIGdlQml0bWFwLkF0dGFjaChwT3V0Qml0bWFwLCBmYWxzZSwgbnVsbHB0ciwgZmFsc2UpOwotCi0gIGludDMyX3QgaUZvbnRTaXplID0gKGludDMyX3QpZmFicyhtX2ZGb250U2l6ZSk7Ci0gIGludDMyX3QgaVRleHRIZWlnaHQgPSBpRm9udFNpemUgKyAxOwotICBpZiAoIXBPdXRCaXRtYXApIHsKLSAgICBDRlhfTWF0cml4IG1hdHIobV9vdXRwdXRIU2NhbGUsIDAuMCwgMC4wLCAxLjAsIDAuMCwgMC4wKTsKLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QoCi0gICAgICAgIChGWF9GTE9BVClsZWZ0UG9zaXRpb24sIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCksCi0gICAgICAgIChGWF9GTE9BVCkobGVmdFBvc2l0aW9uICsgc3RyV2lkdGggLSAwLjUpLCAoRlhfRkxPQVQpbV9IZWlnaHQpOwotICAgIG1hdHIuQ29uY2F0KCptYXRyaXgpOwotICAgIG1hdHIuVHJhbnNmb3JtUmVjdChyZWN0KTsKLSAgICBGWF9SRUNUIHJlID0gcmVjdC5HZXRPdXRlclJlY3QoKTsKLSAgICBkZXZpY2UtPkZpbGxSZWN0KCZyZSwgbV9iYWNrZ3JvdW5kQ29sb3IpOwotICAgIENGWF9NYXRyaXggbWF0cjEobV9vdXRwdXRIU2NhbGUsIDAuMCwgMC4wLCAxLjAsIDAuMCwgMC4wKTsKLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QxKAotICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIDMzICogbXVsdGlwbGUpLAotICAgICAgICAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpLAotICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIDMzICogbXVsdGlwbGUgKyBzdHJXaWR0aCAtIDAuNSksCi0gICAgICAgIChGWF9GTE9BVCltX0hlaWdodCk7Ci0gICAgbWF0cjEuQ29uY2F0KCptYXRyaXgpOwotICAgIG1hdHIxLlRyYW5zZm9ybVJlY3QocmVjdDEpOwotICAgIHJlID0gcmVjdDEuR2V0T3V0ZXJSZWN0KCk7Ci0gICAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsKLSAgfQotICBpZiAoIXBPdXRCaXRtYXApCi0gICAgc3RyV2lkdGggPSAoaW50MzJfdCkoc3RyV2lkdGggKiBtX291dHB1dEhTY2FsZSk7Ci0KLSAgQ2FsY1RleHRJbmZvKHRlbXBTdHIsIHBDaGFyUG9zLCBtX3BGb250LCAoRlhfRkxPQVQpc3RyV2lkdGgsIGlGb250U2l6ZSwKLSAgICAgICAgICAgICAgIGJsYW5rKTsKLSAgQ0ZYX01hdHJpeCBhZmZpbmVfbWF0cml4KDEuMCwgMC4wLCAwLjAsIC0xLjAsIDAuMCwgKEZYX0ZMT0FUKWlGb250U2l6ZSk7Ci0gIENGWF9GeGdlRGV2aWNlIGdlOwotICBpZiAocE91dEJpdG1hcCkgewotICAgIGRlbGV0ZSBnZS5HZXRCaXRtYXAoKTsKLSAgICBnZS5DcmVhdGUoc3RyV2lkdGgsIGlUZXh0SGVpZ2h0LCBGWERJQl9BcmdiLCBudWxscHRyKTsKLSAgICBnZS5HZXRCaXRtYXAoKS0+Q2xlYXIobV9iYWNrZ3JvdW5kQ29sb3IpOwotICAgIGdlLkRyYXdOb3JtYWxUZXh0KGlMZW4sIHBDaGFyUG9zLCBtX3BGb250LCBzdGF0aWNfY2FzdDxGWF9GTE9BVD4oaUZvbnRTaXplKSwKLSAgICAgICAgICAgICAgICAgICAgICAmYWZmaW5lX21hdHJpeCwgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOwotICAgIGdlQml0bWFwLlNldERJQml0cyhnZS5HZXRCaXRtYXAoKSwgbGVmdFBvc2l0aW9uLCBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KTsKLSAgfSBlbHNlIHsKLSAgICBDRlhfTWF0cml4IGFmZmluZV9tYXRyaXgxKDEuMCwgMC4wLCAwLjAsIC0xLjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpbGVmdFBvc2l0aW9uICogbV9vdXRwdXRIU2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQgKyBpRm9udFNpemUpKTsKLSAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7Ci0gICAgZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChpTGVuLCBwQ2hhclBvcywgbV9wRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihpRm9udFNpemUpLCAmYWZmaW5lX21hdHJpeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7Ci0gIH0KLSAgdGVtcFN0ciA9IHN0ci5NaWQoNCwgNCk7Ci0gIGlMZW4gPSB0ZW1wU3RyLkdldExlbmd0aCgpOwotICBDYWxjVGV4dEluZm8odGVtcFN0ciwgcENoYXJQb3MgKyA0LCBtX3BGb250LCAoRlhfRkxPQVQpc3RyV2lkdGgsIGlGb250U2l6ZSwKLSAgICAgICAgICAgICAgIGJsYW5rKTsKLSAgaWYgKHBPdXRCaXRtYXApIHsKLSAgICBkZWxldGUgZ2UuR2V0Qml0bWFwKCk7Ci0gICAgZ2UuQ3JlYXRlKHN0cldpZHRoLCBpVGV4dEhlaWdodCwgRlhESUJfQXJnYiwgbnVsbHB0cik7Ci0gICAgZ2UuR2V0Qml0bWFwKCktPkNsZWFyKG1fYmFja2dyb3VuZENvbG9yKTsKLSAgICBnZS5EcmF3Tm9ybWFsVGV4dChpTGVuLCBwQ2hhclBvcyArIDQsIG1fcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KGlGb250U2l6ZSksICZhZmZpbmVfbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsKLSAgICBnZUJpdG1hcC5TZXRESUJpdHMoZ2UuR2V0Qml0bWFwKCksIGxlZnRQb3NpdGlvbiArIDMzICogbXVsdGlwbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpOwotICB9IGVsc2UgewotICAgIENGWF9NYXRyaXggYWZmaW5lX21hdHJpeDEoCi0gICAgICAgIDEuMCwgMC4wLCAwLjAsIC0xLjAsCi0gICAgICAgIChGWF9GTE9BVCkobGVmdFBvc2l0aW9uICsgMzMgKiBtdWx0aXBsZSkgKiBtX291dHB1dEhTY2FsZSwKLSAgICAgICAgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0ICsgaUZvbnRTaXplKSk7Ci0gICAgaWYgKG1hdHJpeCkgewotICAgICAgYWZmaW5lX21hdHJpeDEuQ29uY2F0KCptYXRyaXgpOwotICAgIH0KLSAgICBkZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlMZW4sIHBDaGFyUG9zICsgNCwgbV9wRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihpRm9udFNpemUpLCAmYWZmaW5lX21hdHJpeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7Ci0gIH0KLSAgRlhfRnJlZShwQ2hhclBvcyk7Ci19Ci0KLXZvaWQgQ0JDX09uZWRFQU44V3JpdGVyOjpSZW5kZXJSZXN1bHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb2RlTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIENCQ19PbmVEaW1Xcml0ZXI6OlJlbmRlclJlc3VsdChjb250ZW50cywgY29kZSwgY29kZUxlbmd0aCwgaXNEZXZpY2UsIGUpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU44V3JpdGVyLmggYi94ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjhXcml0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ0ZmMzMy4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lZEVBTjhXcml0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhCQVJDT0RFX09ORURfQkNfT05FREVBTjhXUklURVJfSF8KLSNkZWZpbmUgWEZBX0ZYQkFSQ09ERV9PTkVEX0JDX09ORURFQU44V1JJVEVSX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9CQ19MaWJyYXJ5LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZURpbVdyaXRlci5oIgotCi1jbGFzcyBDRlhfRElCaXRtYXA7Ci1jbGFzcyBDRlhfUmVuZGVyRGV2aWNlOwotCi1jbGFzcyBDQkNfT25lZEVBTjhXcml0ZXIgOiBwdWJsaWMgQ0JDX09uZURpbVdyaXRlciB7Ci0gcHVibGljOgotICBDQkNfT25lZEVBTjhXcml0ZXIoKTsKLSAgfkNCQ19PbmVkRUFOOFdyaXRlcigpIG92ZXJyaWRlOwotCi0gIC8vIENCQ19PbmVEaW1Xcml0ZXIKLSAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgIEJDRk9STUFUIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0gIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSBvdmVycmlkZTsKLSAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dExlbmd0aCwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIG92ZXJyaWRlOwotCi0gIHZvaWQgUmVuZGVyUmVzdWx0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvZGUsCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29kZUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0RldmljZSwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgQ2hlY2tDb250ZW50VmFsaWRpdHkoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cykgb3ZlcnJpZGU7Ci0gIENGWF9XaWRlU3RyaW5nIEZpbHRlckNvbnRlbnRzKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIG92ZXJyaWRlOwotICB2b2lkIFNldERhdGFMZW5ndGgoaW50MzJfdCBsZW5ndGgpIG92ZXJyaWRlOwotCi0gIGJvb2wgU2V0VGV4dExvY2F0aW9uKEJDX1RFWFRfTE9DIGxvY2F0aW9uKTsKLSAgaW50MzJfdCBDYWxjQ2hlY2tzdW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzKTsKLQotIHByb3RlY3RlZDoKLSAgdm9pZCBTaG93Q2hhcnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwT3V0Qml0bWFwLAotICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgaW50MzJfdCBiYXJXaWR0aCwKLSAgICAgICAgICAgICAgICAgaW50MzJfdCBtdWx0aXBsZSwKLSAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBpbnQzMl90IG1fY29kZVdpZHRoOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhCQVJDT0RFX09ORURfQkNfT05FREVBTjhXUklURVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkVVBDQVdyaXRlci5jcHAgYi94ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FXcml0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDZlNzk2Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkVVBDQVdyaXRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgotLyoKLSAqIENvcHlyaWdodCAyMDEwIFpYaW5nIGF1dGhvcnMKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZnhnZWRldmljZS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZ2Vtb2R1bGUuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9CQ19Xcml0ZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lRGltV3JpdGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9vbmVkL0JDX09uZWRFQU4xM1dyaXRlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkVVBDQVdyaXRlci5oIgotCi1DQkNfT25lZFVQQ0FXcml0ZXI6OkNCQ19PbmVkVVBDQVdyaXRlcigpIHsKLSAgbV9iTGVmdFBhZGRpbmcgPSB0cnVlOwotICBtX2JSaWdodFBhZGRpbmcgPSB0cnVlOwotfQotCi12b2lkIENCQ19PbmVkVVBDQVdyaXRlcjo6SW5pdCgpIHsKLSAgbV9zdWJXcml0ZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0JDX09uZWRFQU4xM1dyaXRlcj4oKTsKLX0KLQotQ0JDX09uZWRVUENBV3JpdGVyOjp+Q0JDX09uZWRVUENBV3JpdGVyKCkge30KLQotYm9vbCBDQkNfT25lZFVQQ0FXcml0ZXI6OkNoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIHsKLSAgZm9yIChGWF9TVFJTSVpFIGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7ICsraSkgewotICAgIGlmIChjb250ZW50cy5HZXRBdChpKSA8ICcwJyB8fCBjb250ZW50cy5HZXRBdChpKSA+ICc5JykKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ0JDX09uZWRVUENBV3JpdGVyOjpGaWx0ZXJDb250ZW50cygKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSB7Ci0gIENGWF9XaWRlU3RyaW5nIGZpbHRlcmNvbnRlbnRzOwotICBGWF9XQ0hBUiBjaDsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudHMuR2V0TGVuZ3RoKCk7IGkrKykgewotICAgIGNoID0gY29udGVudHMuR2V0QXQoaSk7Ci0gICAgaWYgKGNoID4gMTc1KSB7Ci0gICAgICBpKys7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKLSAgICAgIGZpbHRlcmNvbnRlbnRzICs9IGNoOwotICAgIH0KLSAgfQotICByZXR1cm4gZmlsdGVyY29udGVudHM7Ci19Ci0KLWludDMyX3QgQ0JDX09uZWRVUENBV3JpdGVyOjpDYWxjQ2hlY2tzdW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzKSB7Ci0gIGludDMyX3Qgb2RkID0gMDsKLSAgaW50MzJfdCBldmVuID0gMDsKLSAgaW50MzJfdCBqID0gMTsKLSAgZm9yIChpbnQzMl90IGkgPSBjb250ZW50cy5HZXRMZW5ndGgoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgaWYgKGogJSAyKSB7Ci0gICAgICBvZGQgKz0gRlhTWVNfYXRvaShjb250ZW50cy5NaWQoaSwgMSkuY19zdHIoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV2ZW4gKz0gRlhTWVNfYXRvaShjb250ZW50cy5NaWQoaSwgMSkuY19zdHIoKSk7Ci0gICAgfQotICAgIGorKzsKLSAgfQotICBpbnQzMl90IGNoZWNrc3VtID0gKG9kZCAqIDMgKyBldmVuKSAlIDEwOwotICBjaGVja3N1bSA9ICgxMCAtIGNoZWNrc3VtKSAlIDEwOwotICByZXR1cm4gKGNoZWNrc3VtKTsKLX0KLQotdWludDhfdCogQ0JDX09uZWRVUENBV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIHVpbnQ4X3QqIHJldCA9IEVuY29kZShjb250ZW50cywgZm9ybWF0LCBvdXRXaWR0aCwgb3V0SGVpZ2h0LCAwLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIHJldDsKLX0KLQotdWludDhfdCogQ0JDX09uZWRVUENBV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBpZiAoZm9ybWF0ICE9IEJDRk9STUFUX1VQQ19BKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uT25seUVuY29kZVVQQ19BOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIENGWF9CeXRlU3RyaW5nIHRvRUFOMTNTdHJpbmcgPSAnMCcgKyBjb250ZW50czsKLSAgbV9pRGF0YUxlbnRoID0gMTM7Ci0gIHVpbnQ4X3QqIHJldCA9IG1fc3ViV3JpdGVyLT5FbmNvZGUodG9FQU4xM1N0cmluZywgQkNGT1JNQVRfRUFOXzEzLCBvdXRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRIZWlnaHQsIGhpbnRzLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIHJldDsKLX0KLQotdWludDhfdCogQ0JDX09uZWRVUENBV3JpdGVyOjpFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0TGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotdm9pZCBDQkNfT25lZFVQQ0FXcml0ZXI6OlNob3dDaGFycyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBPdXRCaXRtYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZW5kZXJEZXZpY2UqIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJhcldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG11bHRpcGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGlmICghZGV2aWNlICYmICFwT3V0Qml0bWFwKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50OwotICAgIHJldHVybjsKLSAgfQotCi0gIGludDMyX3QgbGVmdFBhZGRpbmcgPSA3ICogbXVsdGlwbGU7Ci0gIGludDMyX3QgbGVmdFBvc2l0aW9uID0gMTAgKiBtdWx0aXBsZSArIGxlZnRQYWRkaW5nOwotICBDRlhfQnl0ZVN0cmluZyBzdHIgPSBGWF9VVEY4RW5jb2RlKGNvbnRlbnRzKTsKLSAgaW50MzJfdCBpTGVuID0gc3RyLkdldExlbmd0aCgpOwotICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MgPSBGWF9BbGxvYyhGWFRFWFRfQ0hBUlBPUywgaUxlbik7Ci0gIEZYU1lTX21lbXNldChwQ2hhclBvcywgMCwgc2l6ZW9mKEZYVEVYVF9DSEFSUE9TKSAqIGlMZW4pOwotICBDRlhfQnl0ZVN0cmluZyB0ZW1wU3RyID0gc3RyLk1pZCgxLCA1KTsKLSAgRlhfRkxPQVQgc3RyV2lkdGggPSAoRlhfRkxPQVQpMzUgKiBtdWx0aXBsZTsKLSAgRlhfRkxPQVQgYmxhbmsgPSAwLjA7Ci0gIENGWF9GeGdlRGV2aWNlIGdlQml0bWFwOwotICBpZiAocE91dEJpdG1hcCkKLSAgICBnZUJpdG1hcC5BdHRhY2gocE91dEJpdG1hcCwgZmFsc2UsIG51bGxwdHIsIGZhbHNlKTsKLQotICBpTGVuID0gdGVtcFN0ci5HZXRMZW5ndGgoKTsKLSAgaW50MzJfdCBpRm9udFNpemUgPSAoaW50MzJfdClmYWJzKG1fZkZvbnRTaXplKTsKLSAgaW50MzJfdCBpVGV4dEhlaWdodCA9IGlGb250U2l6ZSArIDE7Ci0gIGlmICghcE91dEJpdG1hcCkgewotICAgIENGWF9NYXRyaXggbWF0cihtX291dHB1dEhTY2FsZSwgMC4wLCAwLjAsIDEuMCwgMC4wLCAwLjApOwotICAgIENGWF9GbG9hdFJlY3QgcmVjdCgKLSAgICAgICAgKEZYX0ZMT0FUKWxlZnRQb3NpdGlvbiwgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KSwKLSAgICAgICAgKEZYX0ZMT0FUKShsZWZ0UG9zaXRpb24gKyBzdHJXaWR0aCAtIDAuNSksIChGWF9GTE9BVCltX0hlaWdodCk7Ci0gICAgbWF0ci5Db25jYXQoKm1hdHJpeCk7Ci0gICAgbWF0ci5UcmFuc2Zvcm1SZWN0KHJlY3QpOwotICAgIEZYX1JFQ1QgcmUgPSByZWN0LkdldE91dGVyUmVjdCgpOwotICAgIGRldmljZS0+RmlsbFJlY3QoJnJlLCBtX2JhY2tncm91bmRDb2xvcik7Ci0gICAgQ0ZYX01hdHJpeCBtYXRyMShtX291dHB1dEhTY2FsZSwgMC4wLCAwLjAsIDEuMCwgMC4wLCAwLjApOwotICAgIENGWF9GbG9hdFJlY3QgcmVjdDEoCi0gICAgICAgIChGWF9GTE9BVCkobGVmdFBvc2l0aW9uICsgNDAgKiBtdWx0aXBsZSksCi0gICAgICAgIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCksCi0gICAgICAgIChGWF9GTE9BVCkoKGxlZnRQb3NpdGlvbiArIDQwICogbXVsdGlwbGUpICsgc3RyV2lkdGggLSAwLjUpLAotICAgICAgICAoRlhfRkxPQVQpbV9IZWlnaHQpOwotICAgIG1hdHIxLkNvbmNhdCgqbWF0cml4KTsKLSAgICBtYXRyMS5UcmFuc2Zvcm1SZWN0KHJlY3QxKTsKLSAgICByZSA9IHJlY3QxLkdldE91dGVyUmVjdCgpOwotICAgIGRldmljZS0+RmlsbFJlY3QoJnJlLCBtX2JhY2tncm91bmRDb2xvcik7Ci0gICAgRlhfRkxPQVQgc3RyV2lkdGgxID0gKEZYX0ZMT0FUKW11bHRpcGxlICogNzsKLSAgICBDRlhfTWF0cml4IG1hdHIyKG1fb3V0cHV0SFNjYWxlLCAwLjAsIDAuMCwgMS4wLCAwLjAsIDAuMCk7Ci0gICAgQ0ZYX0Zsb2F0UmVjdCByZWN0MigwLjAsIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCksCi0gICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpc3RyV2lkdGgxIC0gMSwgKEZYX0ZMT0FUKW1fSGVpZ2h0KTsKLSAgICBtYXRyMi5Db25jYXQoKm1hdHJpeCk7Ci0gICAgbWF0cjIuVHJhbnNmb3JtUmVjdChyZWN0Mik7Ci0gICAgcmUgPSByZWN0Mi5HZXRPdXRlclJlY3QoKTsKLSAgICBkZXZpY2UtPkZpbGxSZWN0KCZyZSwgbV9iYWNrZ3JvdW5kQ29sb3IpOwotICAgIENGWF9NYXRyaXggbWF0cjMobV9vdXRwdXRIU2NhbGUsIDAuMCwgMC4wLCAxLjAsIDAuMCwgMC4wKTsKLSAgICBDRlhfRmxvYXRSZWN0IHJlY3QzKAotICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIDg1ICogbXVsdGlwbGUpLAotICAgICAgICAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQpLAotICAgICAgICAoRlhfRkxPQVQpKChsZWZ0UG9zaXRpb24gKyA4NSAqIG11bHRpcGxlKSArIHN0cldpZHRoMSAtIDAuNSksCi0gICAgICAgIChGWF9GTE9BVCltX0hlaWdodCk7Ci0gICAgbWF0cjMuQ29uY2F0KCptYXRyaXgpOwotICAgIG1hdHIzLlRyYW5zZm9ybVJlY3QocmVjdDMpOwotICAgIHJlID0gcmVjdDMuR2V0T3V0ZXJSZWN0KCk7Ci0gICAgZGV2aWNlLT5GaWxsUmVjdCgmcmUsIG1fYmFja2dyb3VuZENvbG9yKTsKLSAgfQotICBpZiAoIXBPdXRCaXRtYXApCi0gICAgc3RyV2lkdGggPSBzdHJXaWR0aCAqIG1fb3V0cHV0SFNjYWxlOwotCi0gIENhbGNUZXh0SW5mbyh0ZW1wU3RyLCBwQ2hhclBvcyArIDEsIG1fcEZvbnQsIHN0cldpZHRoLCBpRm9udFNpemUsIGJsYW5rKTsKLSAgQ0ZYX01hdHJpeCBhZmZpbmVfbWF0cml4KDEuMCwgMC4wLCAwLjAsIC0xLjAsIDAuMCwgKEZYX0ZMT0FUKWlGb250U2l6ZSk7Ci0gIENGWF9GeGdlRGV2aWNlIGdlOwotICBpZiAocE91dEJpdG1hcCkgewotICAgIGdlLkNyZWF0ZSgoaW50KXN0cldpZHRoLCBpVGV4dEhlaWdodCwgRlhESUJfQXJnYiwgbnVsbHB0cik7Ci0gICAgZ2UuR2V0Qml0bWFwKCktPkNsZWFyKG1fYmFja2dyb3VuZENvbG9yKTsKLSAgICBnZS5EcmF3Tm9ybWFsVGV4dChpTGVuLCBwQ2hhclBvcyArIDEsIG1fcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KGlGb250U2l6ZSksICZhZmZpbmVfbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsKLSAgICBnZUJpdG1hcC5TZXRESUJpdHMoZ2UuR2V0Qml0bWFwKCksIGxlZnRQb3NpdGlvbiwgbV9IZWlnaHQgLSBpVGV4dEhlaWdodCk7Ci0gIH0gZWxzZSB7Ci0gICAgQ0ZYX01hdHJpeCBhZmZpbmVfbWF0cml4MSgxLjAsIDAuMCwgMC4wLCAtMS4wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKWxlZnRQb3NpdGlvbiAqIG1fb3V0cHV0SFNjYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZYX0ZMT0FUKShtX0hlaWdodCAtIGlUZXh0SGVpZ2h0ICsgaUZvbnRTaXplKSk7Ci0gICAgaWYgKG1hdHJpeCkgewotICAgICAgYWZmaW5lX21hdHJpeDEuQ29uY2F0KCptYXRyaXgpOwotICAgIH0KLSAgICBkZXZpY2UtPkRyYXdOb3JtYWxUZXh0KGlMZW4sIHBDaGFyUG9zICsgMSwgbV9wRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihpRm9udFNpemUpLCAmYWZmaW5lX21hdHJpeDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7Ci0gIH0KLSAgdGVtcFN0ciA9IHN0ci5NaWQoNiwgNSk7Ci0gIGlMZW4gPSB0ZW1wU3RyLkdldExlbmd0aCgpOwotICBDYWxjVGV4dEluZm8odGVtcFN0ciwgcENoYXJQb3MgKyA2LCBtX3BGb250LCBzdHJXaWR0aCwgaUZvbnRTaXplLCBibGFuayk7Ci0gIGlmIChwT3V0Qml0bWFwKSB7Ci0gICAgRlhfUkVDVCByZWN0MigwLCAwLCAoaW50KXN0cldpZHRoLCBpVGV4dEhlaWdodCk7Ci0gICAgZ2UuRmlsbFJlY3QoJnJlY3QyLCBtX2JhY2tncm91bmRDb2xvcik7Ci0gICAgZ2UuRHJhd05vcm1hbFRleHQoaUxlbiwgcENoYXJQb3MgKyA2LCBtX3BGb250LAotICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihpRm9udFNpemUpLCAmYWZmaW5lX21hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7Ci0gICAgZ2VCaXRtYXAuU2V0RElCaXRzKGdlLkdldEJpdG1hcCgpLCBsZWZ0UG9zaXRpb24gKyA0MCAqIG11bHRpcGxlLAotICAgICAgICAgICAgICAgICAgICAgICBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KTsKLSAgfSBlbHNlIHsKLSAgICBDRlhfTWF0cml4IGFmZmluZV9tYXRyaXgxKAotICAgICAgICAxLjAsIDAuMCwgMC4wLCAtMS4wLAotICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIDQwICogbXVsdGlwbGUpICogbV9vdXRwdXRIU2NhbGUsCi0gICAgICAgIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCArIGlGb250U2l6ZSkpOwotICAgIGlmIChtYXRyaXgpIHsKLSAgICAgIGFmZmluZV9tYXRyaXgxLkNvbmNhdCgqbWF0cml4KTsKLSAgICB9Ci0gICAgZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChpTGVuLCBwQ2hhclBvcyArIDYsIG1fcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGWF9GTE9BVD4oaUZvbnRTaXplKSwgJmFmZmluZV9tYXRyaXgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOwotICB9Ci0gIHRlbXBTdHIgPSBzdHIuTWlkKDAsIDEpOwotICBpTGVuID0gdGVtcFN0ci5HZXRMZW5ndGgoKTsKLSAgc3RyV2lkdGggPSAoRlhfRkxPQVQpbXVsdGlwbGUgKiA3OwotICBpZiAoIXBPdXRCaXRtYXApCi0gICAgc3RyV2lkdGggPSBzdHJXaWR0aCAqIG1fb3V0cHV0SFNjYWxlOwotCi0gIENhbGNUZXh0SW5mbyh0ZW1wU3RyLCBwQ2hhclBvcywgbV9wRm9udCwgc3RyV2lkdGgsIGlGb250U2l6ZSwgYmxhbmspOwotICBpZiAocE91dEJpdG1hcCkgewotICAgIGRlbGV0ZSBnZS5HZXRCaXRtYXAoKTsKLSAgICBnZS5DcmVhdGUoKGludClzdHJXaWR0aCwgaVRleHRIZWlnaHQsIEZYRElCX0FyZ2IsIG51bGxwdHIpOwotICAgIGdlLkdldEJpdG1hcCgpLT5DbGVhcihtX2JhY2tncm91bmRDb2xvcik7Ci0gICAgZ2UuRHJhd05vcm1hbFRleHQoaUxlbiwgcENoYXJQb3MsIG1fcEZvbnQsIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihpRm9udFNpemUpLAotICAgICAgICAgICAgICAgICAgICAgICZhZmZpbmVfbWF0cml4LCBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7Ci0gICAgZ2VCaXRtYXAuU2V0RElCaXRzKGdlLkdldEJpdG1hcCgpLCAwLCBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KTsKLSAgfSBlbHNlIHsKLSAgICBDRlhfTWF0cml4IGFmZmluZV9tYXRyaXgxKDEuMCwgMC4wLCAwLjAsIC0xLjAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRlhfRkxPQVQpKG1fSGVpZ2h0IC0gaVRleHRIZWlnaHQgKyBpRm9udFNpemUpKTsKLSAgICBpZiAobWF0cml4KSB7Ci0gICAgICBhZmZpbmVfbWF0cml4MS5Db25jYXQoKm1hdHJpeCk7Ci0gICAgfQotICAgIGRldmljZS0+RHJhd05vcm1hbFRleHQoaUxlbiwgcENoYXJQb3MsIG1fcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGWF9GTE9BVD4oaUZvbnRTaXplKSwgJmFmZmluZV9tYXRyaXgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9mb250Q29sb3IsIEZYVEVYVF9DTEVBUlRZUEUpOwotICB9Ci0gIHRlbXBTdHIgPSBzdHIuTWlkKDExLCAxKTsKLSAgaUxlbiA9IHRlbXBTdHIuR2V0TGVuZ3RoKCk7Ci0gIENhbGNUZXh0SW5mbyh0ZW1wU3RyLCBwQ2hhclBvcyArIDExLCBtX3BGb250LCBzdHJXaWR0aCwgaUZvbnRTaXplLCBibGFuayk7Ci0gIGlmIChwT3V0Qml0bWFwKSB7Ci0gICAgZGVsZXRlIGdlLkdldEJpdG1hcCgpOwotICAgIGdlLkNyZWF0ZSgoaW50KXN0cldpZHRoLCBpVGV4dEhlaWdodCwgRlhESUJfQXJnYiwgbnVsbHB0cik7Ci0gICAgZ2UuR2V0Qml0bWFwKCktPkNsZWFyKG1fYmFja2dyb3VuZENvbG9yKTsKLSAgICBnZS5EcmF3Tm9ybWFsVGV4dChpTGVuLCBwQ2hhclBvcyArIDExLCBtX3BGb250LAotICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEZYX0ZMT0FUPihpRm9udFNpemUpLCAmYWZmaW5lX21hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICBtX2ZvbnRDb2xvciwgRlhURVhUX0NMRUFSVFlQRSk7Ci0gICAgZ2VCaXRtYXAuU2V0RElCaXRzKGdlLkdldEJpdG1hcCgpLCBsZWZ0UG9zaXRpb24gKyA4NSAqIG11bHRpcGxlLAotICAgICAgICAgICAgICAgICAgICAgICBtX0hlaWdodCAtIGlUZXh0SGVpZ2h0KTsKLSAgfSBlbHNlIHsKLSAgICBDRlhfTWF0cml4IGFmZmluZV9tYXRyaXgxKAotICAgICAgICAxLjAsIDAuMCwgMC4wLCAtMS4wLAotICAgICAgICAoRlhfRkxPQVQpKGxlZnRQb3NpdGlvbiArIDg1ICogbXVsdGlwbGUpICogbV9vdXRwdXRIU2NhbGUsCi0gICAgICAgIChGWF9GTE9BVCkobV9IZWlnaHQgLSBpVGV4dEhlaWdodCArIGlGb250U2l6ZSkpOwotICAgIGlmIChtYXRyaXgpIHsKLSAgICAgIGFmZmluZV9tYXRyaXgxLkNvbmNhdCgqbWF0cml4KTsKLSAgICB9Ci0gICAgZGV2aWNlLT5EcmF3Tm9ybWFsVGV4dChpTGVuLCBwQ2hhclBvcyArIDExLCBtX3BGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RlhfRkxPQVQ+KGlGb250U2l6ZSksICZhZmZpbmVfbWF0cml4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZm9udENvbG9yLCBGWFRFWFRfQ0xFQVJUWVBFKTsKLSAgfQotICBGWF9GcmVlKHBDaGFyUG9zKTsKLX0KLQotdm9pZCBDQkNfT25lZFVQQ0FXcml0ZXI6OlJlbmRlclJlc3VsdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgQ0JDX09uZURpbVdyaXRlcjo6UmVuZGVyUmVzdWx0KGNvbnRlbnRzLCBjb2RlLCBjb2RlTGVuZ3RoLCBpc0RldmljZSwgZSk7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lZFVQQ0FXcml0ZXIuaCBiL3hmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkVVBDQVdyaXRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yjc4NmNlLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvb25lZC9CQ19PbmVkVVBDQVdyaXRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfT05FRF9CQ19PTkVEVVBDQVdSSVRFUl9IXwotI2RlZmluZSBYRkFfRlhCQVJDT0RFX09ORURfQkNfT05FRFVQQ0FXUklURVJfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL29uZWQvQkNfT25lRGltV3JpdGVyLmgiCi0KLWNsYXNzIENCQ19PbmVkRUFOMTNXcml0ZXI7Ci1jbGFzcyBDRlhfRElCaXRtYXA7Ci1jbGFzcyBDRlhfTWF0cml4OwotY2xhc3MgQ0ZYX1JlbmRlckRldmljZTsKLQotY2xhc3MgQ0JDX09uZWRVUENBV3JpdGVyIDogcHVibGljIENCQ19PbmVEaW1Xcml0ZXIgewotIHB1YmxpYzoKLSAgQ0JDX09uZWRVUENBV3JpdGVyKCk7Ci0gIH5DQkNfT25lZFVQQ0FXcml0ZXIoKSBvdmVycmlkZTsKLQotICAvLyBDQkNfT25lRGltV3JpdGVyCi0gIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0gIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRMZW5ndGgsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSBvdmVycmlkZTsKLQotICB2b2lkIFJlbmRlclJlc3VsdChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb2RlLAotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNvZGVMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgaXNEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIG92ZXJyaWRlOwotICBib29sIENoZWNrQ29udGVudFZhbGlkaXR5KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgY29udGVudHMpIG92ZXJyaWRlOwotICBDRlhfV2lkZVN0cmluZyBGaWx0ZXJDb250ZW50cyhjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGNvbnRlbnRzKSBvdmVycmlkZTsKLQotICB2b2lkIEluaXQoKTsKLSAgaW50MzJfdCBDYWxjQ2hlY2tzdW0oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzKTsKLQotIHByb3RlY3RlZDoKLSAgdm9pZCBTaG93Q2hhcnMoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgQ0ZYX0RJQml0bWFwKiBwT3V0Qml0bWFwLAotICAgICAgICAgICAgICAgICBDRlhfUmVuZGVyRGV2aWNlKiBkZXZpY2UsCi0gICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgaW50MzJfdCBiYXJXaWR0aCwKLSAgICAgICAgICAgICAgICAgaW50MzJfdCBtdWx0aXBsZSwKLSAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnVuaXF1ZV9wdHI8Q0JDX09uZWRFQU4xM1dyaXRlcj4gbV9zdWJXcml0ZXI7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfT05FRF9CQ19PTkVEVVBDQVdSSVRFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3LmNwcCBiL3hmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxNy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMDE1NjQuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU4NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0vLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6Ci0vKgotICogQ29weXJpZ2h0IDIwMDYgSmVyZW1pYXMgTWFlcmtpIGluIHBhcnQsIGFuZCBaWGluZyBBdXRob3JzIGluIHBhcnQKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTcuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWF0cml4LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZVJvdy5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbXBhY3Rpb24uaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFcnJvckNvcnJlY3Rpb24uaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS91dGlscy5oIgotCi1jb25zdCBpbnQzMl90IENCQ19QREY0MTc6OkNPREVXT1JEX1RBQkxFW11bOTI5XSA9IHsKLSAgICB7MHgxZDVjMCwgMHgxZWFmMCwgMHgxZjU3YywgMHgxZDRlMCwgMHgxZWE3OCwgMHgxZjUzZSwgMHgxYThjMCwgMHgxZDQ3MCwKLSAgICAgMHgxYTg2MCwgMHgxNTA0MCwgMHgxYTgzMCwgMHgxNTAyMCwgMHgxYWRjMCwgMHgxZDZmMCwgMHgxZWI3YywgMHgxYWNlMCwKLSAgICAgMHgxZDY3OCwgMHgxZWIzZSwgMHgxNThjMCwgMHgxYWM3MCwgMHgxNTg2MCwgMHgxNWRjMCwgMHgxYWVmMCwgMHgxZDc3YywKLSAgICAgMHgxNWNlMCwgMHgxYWU3OCwgMHgxZDczZSwgMHgxNWM3MCwgMHgxYWUzYywgMHgxNWVmMCwgMHgxYWY3YywgMHgxNWU3OCwKLSAgICAgMHgxYWYzZSwgMHgxNWY3YywgMHgxZjVmYSwgMHgxZDJlMCwgMHgxZTk3OCwgMHgxZjRiZSwgMHgxYTRjMCwgMHgxZDI3MCwKLSAgICAgMHgxZTkzYywgMHgxYTQ2MCwgMHgxZDIzOCwgMHgxNDg0MCwgMHgxYTQzMCwgMHgxZDIxYywgMHgxNDgyMCwgMHgxYTQxOCwKLSAgICAgMHgxNDgxMCwgMHgxYTZlMCwgMHgxZDM3OCwgMHgxZTliZSwgMHgxNGNjMCwgMHgxYTY3MCwgMHgxZDMzYywgMHgxNGM2MCwKLSAgICAgMHgxYTYzOCwgMHgxZDMxZSwgMHgxNGMzMCwgMHgxYTYxYywgMHgxNGVlMCwgMHgxYTc3OCwgMHgxZDNiZSwgMHgxNGU3MCwKLSAgICAgMHgxYTczYywgMHgxNGUzOCwgMHgxYTcxZSwgMHgxNGY3OCwgMHgxYTdiZSwgMHgxNGYzYywgMHgxNGYxZSwgMHgxYTJjMCwKLSAgICAgMHgxZDE3MCwgMHgxZThiYywgMHgxYTI2MCwgMHgxZDEzOCwgMHgxZTg5ZSwgMHgxNDQ0MCwgMHgxYTIzMCwgMHgxZDExYywKLSAgICAgMHgxNDQyMCwgMHgxYTIxOCwgMHgxNDQxMCwgMHgxNDQwOCwgMHgxNDZjMCwgMHgxYTM3MCwgMHgxZDFiYywgMHgxNDY2MCwKLSAgICAgMHgxYTMzOCwgMHgxZDE5ZSwgMHgxNDYzMCwgMHgxYTMxYywgMHgxNDYxOCwgMHgxNDYwYywgMHgxNDc3MCwgMHgxYTNiYywKLSAgICAgMHgxNDczOCwgMHgxYTM5ZSwgMHgxNDcxYywgMHgxNDdiYywgMHgxYTE2MCwgMHgxZDBiOCwgMHgxZTg1ZSwgMHgxNDI0MCwKLSAgICAgMHgxYTEzMCwgMHgxZDA5YywgMHgxNDIyMCwgMHgxYTExOCwgMHgxZDA4ZSwgMHgxNDIxMCwgMHgxYTEwYywgMHgxNDIwOCwKLSAgICAgMHgxYTEwNiwgMHgxNDM2MCwgMHgxYTFiOCwgMHgxZDBkZSwgMHgxNDMzMCwgMHgxYTE5YywgMHgxNDMxOCwgMHgxYTE4ZSwKLSAgICAgMHgxNDMwYywgMHgxNDMwNiwgMHgxYTFkZSwgMHgxNDM4ZSwgMHgxNDE0MCwgMHgxYTBiMCwgMHgxZDA1YywgMHgxNDEyMCwKLSAgICAgMHgxYTA5OCwgMHgxZDA0ZSwgMHgxNDExMCwgMHgxYTA4YywgMHgxNDEwOCwgMHgxYTA4NiwgMHgxNDEwNCwgMHgxNDFiMCwKLSAgICAgMHgxNDE5OCwgMHgxNDE4YywgMHgxNDBhMCwgMHgxZDAyZSwgMHgxYTA0YywgMHgxYTA0NiwgMHgxNDA4MiwgMHgxY2FlMCwKLSAgICAgMHgxZTU3OCwgMHgxZjJiZSwgMHgxOTRjMCwgMHgxY2E3MCwgMHgxZTUzYywgMHgxOTQ2MCwgMHgxY2EzOCwgMHgxZTUxZSwKLSAgICAgMHgxMjg0MCwgMHgxOTQzMCwgMHgxMjgyMCwgMHgxOTZlMCwgMHgxY2I3OCwgMHgxZTViZSwgMHgxMmNjMCwgMHgxOTY3MCwKLSAgICAgMHgxY2IzYywgMHgxMmM2MCwgMHgxOTYzOCwgMHgxMmMzMCwgMHgxMmMxOCwgMHgxMmVlMCwgMHgxOTc3OCwgMHgxY2JiZSwKLSAgICAgMHgxMmU3MCwgMHgxOTczYywgMHgxMmUzOCwgMHgxMmUxYywgMHgxMmY3OCwgMHgxOTdiZSwgMHgxMmYzYywgMHgxMmZiZSwKLSAgICAgMHgxZGFjMCwgMHgxZWQ3MCwgMHgxZjZiYywgMHgxZGE2MCwgMHgxZWQzOCwgMHgxZjY5ZSwgMHgxYjQ0MCwgMHgxZGEzMCwKLSAgICAgMHgxZWQxYywgMHgxYjQyMCwgMHgxZGExOCwgMHgxZWQwZSwgMHgxYjQxMCwgMHgxZGEwYywgMHgxOTJjMCwgMHgxYzk3MCwKLSAgICAgMHgxZTRiYywgMHgxYjZjMCwgMHgxOTI2MCwgMHgxYzkzOCwgMHgxZTQ5ZSwgMHgxYjY2MCwgMHgxZGIzOCwgMHgxZWQ5ZSwKLSAgICAgMHgxNmM0MCwgMHgxMjQyMCwgMHgxOTIxOCwgMHgxYzkwZSwgMHgxNmMyMCwgMHgxYjYxOCwgMHgxNmMxMCwgMHgxMjZjMCwKLSAgICAgMHgxOTM3MCwgMHgxYzliYywgMHgxNmVjMCwgMHgxMjY2MCwgMHgxOTMzOCwgMHgxYzk5ZSwgMHgxNmU2MCwgMHgxYjczOCwKLSAgICAgMHgxZGI5ZSwgMHgxNmUzMCwgMHgxMjYxOCwgMHgxNmUxOCwgMHgxMjc3MCwgMHgxOTNiYywgMHgxNmY3MCwgMHgxMjczOCwKLSAgICAgMHgxOTM5ZSwgMHgxNmYzOCwgMHgxYjc5ZSwgMHgxNmYxYywgMHgxMjdiYywgMHgxNmZiYywgMHgxMjc5ZSwgMHgxNmY5ZSwKLSAgICAgMHgxZDk2MCwgMHgxZWNiOCwgMHgxZjY1ZSwgMHgxYjI0MCwgMHgxZDkzMCwgMHgxZWM5YywgMHgxYjIyMCwgMHgxZDkxOCwKLSAgICAgMHgxZWM4ZSwgMHgxYjIxMCwgMHgxZDkwYywgMHgxYjIwOCwgMHgxYjIwNCwgMHgxOTE2MCwgMHgxYzhiOCwgMHgxZTQ1ZSwKLSAgICAgMHgxYjM2MCwgMHgxOTEzMCwgMHgxYzg5YywgMHgxNjY0MCwgMHgxMjIyMCwgMHgxZDk5YywgMHgxYzg4ZSwgMHgxNjYyMCwKLSAgICAgMHgxMjIxMCwgMHgxOTEwYywgMHgxNjYxMCwgMHgxYjMwYywgMHgxOTEwNiwgMHgxMjIwNCwgMHgxMjM2MCwgMHgxOTFiOCwKLSAgICAgMHgxYzhkZSwgMHgxNjc2MCwgMHgxMjMzMCwgMHgxOTE5YywgMHgxNjczMCwgMHgxYjM5YywgMHgxOTE4ZSwgMHgxNjcxOCwKLSAgICAgMHgxMjMwYywgMHgxMjMwNiwgMHgxMjNiOCwgMHgxOTFkZSwgMHgxNjdiOCwgMHgxMjM5YywgMHgxNjc5YywgMHgxMjM4ZSwKLSAgICAgMHgxNjc4ZSwgMHgxNjdkZSwgMHgxYjE0MCwgMHgxZDhiMCwgMHgxZWM1YywgMHgxYjEyMCwgMHgxZDg5OCwgMHgxZWM0ZSwKLSAgICAgMHgxYjExMCwgMHgxZDg4YywgMHgxYjEwOCwgMHgxZDg4NiwgMHgxYjEwNCwgMHgxYjEwMiwgMHgxMjE0MCwgMHgxOTBiMCwKLSAgICAgMHgxYzg1YywgMHgxNjM0MCwgMHgxMjEyMCwgMHgxOTA5OCwgMHgxYzg0ZSwgMHgxNjMyMCwgMHgxYjE5OCwgMHgxZDhjZSwKLSAgICAgMHgxNjMxMCwgMHgxMjEwOCwgMHgxOTA4NiwgMHgxNjMwOCwgMHgxYjE4NiwgMHgxNjMwNCwgMHgxMjFiMCwgMHgxOTBkYywKLSAgICAgMHgxNjNiMCwgMHgxMjE5OCwgMHgxOTBjZSwgMHgxNjM5OCwgMHgxYjFjZSwgMHgxNjM4YywgMHgxMjE4NiwgMHgxNjM4NiwKLSAgICAgMHgxNjNkYywgMHgxNjNjZSwgMHgxYjBhMCwgMHgxZDg1OCwgMHgxZWMyZSwgMHgxYjA5MCwgMHgxZDg0YywgMHgxYjA4OCwKLSAgICAgMHgxZDg0NiwgMHgxYjA4NCwgMHgxYjA4MiwgMHgxMjBhMCwgMHgxOTA1OCwgMHgxYzgyZSwgMHgxNjFhMCwgMHgxMjA5MCwKLSAgICAgMHgxOTA0YywgMHgxNjE5MCwgMHgxYjBjYywgMHgxOTA0NiwgMHgxNjE4OCwgMHgxMjA4NCwgMHgxNjE4NCwgMHgxMjA4MiwKLSAgICAgMHgxMjBkOCwgMHgxNjFkOCwgMHgxNjFjYywgMHgxNjFjNiwgMHgxZDgyYywgMHgxZDgyNiwgMHgxYjA0MiwgMHgxOTAyYywKLSAgICAgMHgxMjA0OCwgMHgxNjBjOCwgMHgxNjBjNCwgMHgxNjBjMiwgMHgxOGFjMCwgMHgxYzU3MCwgMHgxZTJiYywgMHgxOGE2MCwKLSAgICAgMHgxYzUzOCwgMHgxMTQ0MCwgMHgxOGEzMCwgMHgxYzUxYywgMHgxMTQyMCwgMHgxOGExOCwgMHgxMTQxMCwgMHgxMTQwOCwKLSAgICAgMHgxMTZjMCwgMHgxOGI3MCwgMHgxYzViYywgMHgxMTY2MCwgMHgxOGIzOCwgMHgxYzU5ZSwgMHgxMTYzMCwgMHgxOGIxYywKLSAgICAgMHgxMTYxOCwgMHgxMTYwYywgMHgxMTc3MCwgMHgxOGJiYywgMHgxMTczOCwgMHgxOGI5ZSwgMHgxMTcxYywgMHgxMTdiYywKLSAgICAgMHgxMTc5ZSwgMHgxY2Q2MCwgMHgxZTZiOCwgMHgxZjM1ZSwgMHgxOWE0MCwgMHgxY2QzMCwgMHgxZTY5YywgMHgxOWEyMCwKLSAgICAgMHgxY2QxOCwgMHgxZTY4ZSwgMHgxOWExMCwgMHgxY2QwYywgMHgxOWEwOCwgMHgxY2QwNiwgMHgxODk2MCwgMHgxYzRiOCwKLSAgICAgMHgxZTI1ZSwgMHgxOWI2MCwgMHgxODkzMCwgMHgxYzQ5YywgMHgxMzY0MCwgMHgxMTIyMCwgMHgxY2Q5YywgMHgxYzQ4ZSwKLSAgICAgMHgxMzYyMCwgMHgxOWIxOCwgMHgxODkwYywgMHgxMzYxMCwgMHgxMTIwOCwgMHgxMzYwOCwgMHgxMTM2MCwgMHgxODliOCwKLSAgICAgMHgxYzRkZSwgMHgxMzc2MCwgMHgxMTMzMCwgMHgxY2RkZSwgMHgxMzczMCwgMHgxOWI5YywgMHgxODk4ZSwgMHgxMzcxOCwKLSAgICAgMHgxMTMwYywgMHgxMzcwYywgMHgxMTNiOCwgMHgxODlkZSwgMHgxMzdiOCwgMHgxMTM5YywgMHgxMzc5YywgMHgxMTM4ZSwKLSAgICAgMHgxMTNkZSwgMHgxMzdkZSwgMHgxZGQ0MCwgMHgxZWViMCwgMHgxZjc1YywgMHgxZGQyMCwgMHgxZWU5OCwgMHgxZjc0ZSwKLSAgICAgMHgxZGQxMCwgMHgxZWU4YywgMHgxZGQwOCwgMHgxZWU4NiwgMHgxZGQwNCwgMHgxOTk0MCwgMHgxY2NiMCwgMHgxZTY1YywKLSAgICAgMHgxYmI0MCwgMHgxOTkyMCwgMHgxZWVkYywgMHgxZTY0ZSwgMHgxYmIyMCwgMHgxZGQ5OCwgMHgxZWVjZSwgMHgxYmIxMCwKLSAgICAgMHgxOTkwOCwgMHgxY2M4NiwgMHgxYmIwOCwgMHgxZGQ4NiwgMHgxOTkwMiwgMHgxMTE0MCwgMHgxODhiMCwgMHgxYzQ1YywKLSAgICAgMHgxMzM0MCwgMHgxMTEyMCwgMHgxODg5OCwgMHgxYzQ0ZSwgMHgxNzc0MCwgMHgxMzMyMCwgMHgxOTk5OCwgMHgxY2NjZSwKLSAgICAgMHgxNzcyMCwgMHgxYmI5OCwgMHgxZGRjZSwgMHgxODg4NiwgMHgxNzcxMCwgMHgxMzMwOCwgMHgxOTk4NiwgMHgxNzcwOCwKLSAgICAgMHgxMTEwMiwgMHgxMTFiMCwgMHgxODhkYywgMHgxMzNiMCwgMHgxMTE5OCwgMHgxODhjZSwgMHgxNzdiMCwgMHgxMzM5OCwKLSAgICAgMHgxOTljZSwgMHgxNzc5OCwgMHgxYmJjZSwgMHgxMTE4NiwgMHgxMzM4NiwgMHgxMTFkYywgMHgxMzNkYywgMHgxMTFjZSwKLSAgICAgMHgxNzdkYywgMHgxMzNjZSwgMHgxZGNhMCwgMHgxZWU1OCwgMHgxZjcyZSwgMHgxZGM5MCwgMHgxZWU0YywgMHgxZGM4OCwKLSAgICAgMHgxZWU0NiwgMHgxZGM4NCwgMHgxZGM4MiwgMHgxOThhMCwgMHgxY2M1OCwgMHgxZTYyZSwgMHgxYjlhMCwgMHgxOTg5MCwKLSAgICAgMHgxZWU2ZSwgMHgxYjk5MCwgMHgxZGNjYywgMHgxY2M0NiwgMHgxYjk4OCwgMHgxOTg4NCwgMHgxYjk4NCwgMHgxOTg4MiwKLSAgICAgMHgxYjk4MiwgMHgxMTBhMCwgMHgxODg1OCwgMHgxYzQyZSwgMHgxMzFhMCwgMHgxMTA5MCwgMHgxODg0YywgMHgxNzNhMCwKLSAgICAgMHgxMzE5MCwgMHgxOThjYywgMHgxODg0NiwgMHgxNzM5MCwgMHgxYjljYywgMHgxMTA4NCwgMHgxNzM4OCwgMHgxMzE4NCwKLSAgICAgMHgxMTA4MiwgMHgxMzE4MiwgMHgxMTBkOCwgMHgxODg2ZSwgMHgxMzFkOCwgMHgxMTBjYywgMHgxNzNkOCwgMHgxMzFjYywKLSAgICAgMHgxMTBjNiwgMHgxNzNjYywgMHgxMzFjNiwgMHgxMTBlZSwgMHgxNzNlZSwgMHgxZGM1MCwgMHgxZWUyYywgMHgxZGM0OCwKLSAgICAgMHgxZWUyNiwgMHgxZGM0NCwgMHgxZGM0MiwgMHgxOTg1MCwgMHgxY2MyYywgMHgxYjhkMCwgMHgxOTg0OCwgMHgxY2MyNiwKLSAgICAgMHgxYjhjOCwgMHgxZGM2NiwgMHgxYjhjNCwgMHgxOTg0MiwgMHgxYjhjMiwgMHgxMTA1MCwgMHgxODgyYywgMHgxMzBkMCwKLSAgICAgMHgxMTA0OCwgMHgxODgyNiwgMHgxNzFkMCwgMHgxMzBjOCwgMHgxOTg2NiwgMHgxNzFjOCwgMHgxYjhlNiwgMHgxMTA0MiwKLSAgICAgMHgxNzFjNCwgMHgxMzBjMiwgMHgxNzFjMiwgMHgxMzBlYywgMHgxNzFlYywgMHgxNzFlNiwgMHgxZWUxNiwgMHgxZGMyMiwKLSAgICAgMHgxY2MxNiwgMHgxOTgyNCwgMHgxOTgyMiwgMHgxMTAyOCwgMHgxMzA2OCwgMHgxNzBlOCwgMHgxMTAyMiwgMHgxMzA2MiwKLSAgICAgMHgxODU2MCwgMHgxMGE0MCwgMHgxODUzMCwgMHgxMGEyMCwgMHgxODUxOCwgMHgxYzI4ZSwgMHgxMGExMCwgMHgxODUwYywKLSAgICAgMHgxMGEwOCwgMHgxODUwNiwgMHgxMGI2MCwgMHgxODViOCwgMHgxYzJkZSwgMHgxMGIzMCwgMHgxODU5YywgMHgxMGIxOCwKLSAgICAgMHgxODU4ZSwgMHgxMGIwYywgMHgxMGIwNiwgMHgxMGJiOCwgMHgxODVkZSwgMHgxMGI5YywgMHgxMGI4ZSwgMHgxMGJkZSwKLSAgICAgMHgxOGQ0MCwgMHgxYzZiMCwgMHgxZTM1YywgMHgxOGQyMCwgMHgxYzY5OCwgMHgxOGQxMCwgMHgxYzY4YywgMHgxOGQwOCwKLSAgICAgMHgxYzY4NiwgMHgxOGQwNCwgMHgxMDk0MCwgMHgxODRiMCwgMHgxYzI1YywgMHgxMWI0MCwgMHgxMDkyMCwgMHgxYzZkYywKLSAgICAgMHgxYzI0ZSwgMHgxMWIyMCwgMHgxOGQ5OCwgMHgxYzZjZSwgMHgxMWIxMCwgMHgxMDkwOCwgMHgxODQ4NiwgMHgxMWIwOCwKLSAgICAgMHgxOGQ4NiwgMHgxMDkwMiwgMHgxMDliMCwgMHgxODRkYywgMHgxMWJiMCwgMHgxMDk5OCwgMHgxODRjZSwgMHgxMWI5OCwKLSAgICAgMHgxOGRjZSwgMHgxMWI4YywgMHgxMDk4NiwgMHgxMDlkYywgMHgxMWJkYywgMHgxMDljZSwgMHgxMWJjZSwgMHgxY2VhMCwKLSAgICAgMHgxZTc1OCwgMHgxZjNhZSwgMHgxY2U5MCwgMHgxZTc0YywgMHgxY2U4OCwgMHgxZTc0NiwgMHgxY2U4NCwgMHgxY2U4MiwKLSAgICAgMHgxOGNhMCwgMHgxYzY1OCwgMHgxOWRhMCwgMHgxOGM5MCwgMHgxYzY0YywgMHgxOWQ5MCwgMHgxY2VjYywgMHgxYzY0NiwKLSAgICAgMHgxOWQ4OCwgMHgxOGM4NCwgMHgxOWQ4NCwgMHgxOGM4MiwgMHgxOWQ4MiwgMHgxMDhhMCwgMHgxODQ1OCwgMHgxMTlhMCwKLSAgICAgMHgxMDg5MCwgMHgxYzY2ZSwgMHgxM2JhMCwgMHgxMTk5MCwgMHgxOGNjYywgMHgxODQ0NiwgMHgxM2I5MCwgMHgxOWRjYywKLSAgICAgMHgxMDg4NCwgMHgxM2I4OCwgMHgxMTk4NCwgMHgxMDg4MiwgMHgxMTk4MiwgMHgxMDhkOCwgMHgxODQ2ZSwgMHgxMTlkOCwKLSAgICAgMHgxMDhjYywgMHgxM2JkOCwgMHgxMTljYywgMHgxMDhjNiwgMHgxM2JjYywgMHgxMTljNiwgMHgxMDhlZSwgMHgxMTllZSwKLSAgICAgMHgxM2JlZSwgMHgxZWY1MCwgMHgxZjdhYywgMHgxZWY0OCwgMHgxZjdhNiwgMHgxZWY0NCwgMHgxZWY0MiwgMHgxY2U1MCwKLSAgICAgMHgxZTcyYywgMHgxZGVkMCwgMHgxZWY2YywgMHgxZTcyNiwgMHgxZGVjOCwgMHgxZWY2NiwgMHgxZGVjNCwgMHgxY2U0MiwKLSAgICAgMHgxZGVjMiwgMHgxOGM1MCwgMHgxYzYyYywgMHgxOWNkMCwgMHgxOGM0OCwgMHgxYzYyNiwgMHgxYmRkMCwgMHgxOWNjOCwKLSAgICAgMHgxY2U2NiwgMHgxYmRjOCwgMHgxZGVlNiwgMHgxOGM0MiwgMHgxYmRjNCwgMHgxOWNjMiwgMHgxYmRjMiwgMHgxMDg1MCwKLSAgICAgMHgxODQyYywgMHgxMThkMCwgMHgxMDg0OCwgMHgxODQyNiwgMHgxMzlkMCwgMHgxMThjOCwgMHgxOGM2NiwgMHgxN2JkMCwKLSAgICAgMHgxMzljOCwgMHgxOWNlNiwgMHgxMDg0MiwgMHgxN2JjOCwgMHgxYmRlNiwgMHgxMThjMiwgMHgxN2JjNCwgMHgxMDg2YywKLSAgICAgMHgxMThlYywgMHgxMDg2NiwgMHgxMzllYywgMHgxMThlNiwgMHgxN2JlYywgMHgxMzllNiwgMHgxN2JlNiwgMHgxZWYyOCwKLSAgICAgMHgxZjc5NiwgMHgxZWYyNCwgMHgxZWYyMiwgMHgxY2UyOCwgMHgxZTcxNiwgMHgxZGU2OCwgMHgxZWYzNiwgMHgxZGU2NCwKLSAgICAgMHgxY2UyMiwgMHgxZGU2MiwgMHgxOGMyOCwgMHgxYzYxNiwgMHgxOWM2OCwgMHgxOGMyNCwgMHgxYmNlOCwgMHgxOWM2NCwKLSAgICAgMHgxOGMyMiwgMHgxYmNlNCwgMHgxOWM2MiwgMHgxYmNlMiwgMHgxMDgyOCwgMHgxODQxNiwgMHgxMTg2OCwgMHgxOGMzNiwKLSAgICAgMHgxMzhlOCwgMHgxMTg2NCwgMHgxMDgyMiwgMHgxNzllOCwgMHgxMzhlNCwgMHgxMTg2MiwgMHgxNzllNCwgMHgxMzhlMiwKLSAgICAgMHgxNzllMiwgMHgxMTg3NiwgMHgxNzlmNiwgMHgxZWYxMiwgMHgxZGUzNCwgMHgxZGUzMiwgMHgxOWMzNCwgMHgxYmM3NCwKLSAgICAgMHgxYmM3MiwgMHgxMTgzNCwgMHgxMzg3NCwgMHgxNzhmNCwgMHgxNzhmMiwgMHgxMDU0MCwgMHgxMDUyMCwgMHgxODI5OCwKLSAgICAgMHgxMDUxMCwgMHgxMDUwOCwgMHgxMDUwNCwgMHgxMDViMCwgMHgxMDU5OCwgMHgxMDU4YywgMHgxMDU4NiwgMHgxMDVkYywKLSAgICAgMHgxMDVjZSwgMHgxODZhMCwgMHgxODY5MCwgMHgxYzM0YywgMHgxODY4OCwgMHgxYzM0NiwgMHgxODY4NCwgMHgxODY4MiwKLSAgICAgMHgxMDRhMCwgMHgxODI1OCwgMHgxMGRhMCwgMHgxODZkOCwgMHgxODI0YywgMHgxMGQ5MCwgMHgxODZjYywgMHgxMGQ4OCwKLSAgICAgMHgxODZjNiwgMHgxMGQ4NCwgMHgxMDQ4MiwgMHgxMGQ4MiwgMHgxMDRkOCwgMHgxODI2ZSwgMHgxMGRkOCwgMHgxODZlZSwKLSAgICAgMHgxMGRjYywgMHgxMDRjNiwgMHgxMGRjNiwgMHgxMDRlZSwgMHgxMGRlZSwgMHgxYzc1MCwgMHgxYzc0OCwgMHgxYzc0NCwKLSAgICAgMHgxYzc0MiwgMHgxODY1MCwgMHgxOGVkMCwgMHgxYzc2YywgMHgxYzMyNiwgMHgxOGVjOCwgMHgxYzc2NiwgMHgxOGVjNCwKLSAgICAgMHgxODY0MiwgMHgxOGVjMiwgMHgxMDQ1MCwgMHgxMGNkMCwgMHgxMDQ0OCwgMHgxODIyNiwgMHgxMWRkMCwgMHgxMGNjOCwKLSAgICAgMHgxMDQ0NCwgMHgxMWRjOCwgMHgxMGNjNCwgMHgxMDQ0MiwgMHgxMWRjNCwgMHgxMGNjMiwgMHgxMDQ2YywgMHgxMGNlYywKLSAgICAgMHgxMDQ2NiwgMHgxMWRlYywgMHgxMGNlNiwgMHgxMWRlNiwgMHgxZTdhOCwgMHgxZTdhNCwgMHgxZTdhMiwgMHgxYzcyOCwKLSAgICAgMHgxY2Y2OCwgMHgxZTdiNiwgMHgxY2Y2NCwgMHgxYzcyMiwgMHgxY2Y2MiwgMHgxODYyOCwgMHgxYzMxNiwgMHgxOGU2OCwKLSAgICAgMHgxYzczNiwgMHgxOWVlOCwgMHgxOGU2NCwgMHgxODYyMiwgMHgxOWVlNCwgMHgxOGU2MiwgMHgxOWVlMiwgMHgxMDQyOCwKLSAgICAgMHgxODIxNiwgMHgxMGM2OCwgMHgxODYzNiwgMHgxMWNlOCwgMHgxMGM2NCwgMHgxMDQyMiwgMHgxM2RlOCwgMHgxMWNlNCwKLSAgICAgMHgxMGM2MiwgMHgxM2RlNCwgMHgxMWNlMiwgMHgxMDQzNiwgMHgxMGM3NiwgMHgxMWNmNiwgMHgxM2RmNiwgMHgxZjdkNCwKLSAgICAgMHgxZjdkMiwgMHgxZTc5NCwgMHgxZWZiNCwgMHgxZTc5MiwgMHgxZWZiMiwgMHgxYzcxNCwgMHgxY2YzNCwgMHgxYzcxMiwKLSAgICAgMHgxZGY3NCwgMHgxY2YzMiwgMHgxZGY3MiwgMHgxODYxNCwgMHgxOGUzNCwgMHgxODYxMiwgMHgxOWU3NCwgMHgxOGUzMiwKLSAgICAgMHgxYmVmNH0sCi0gICAgezB4MWY1NjAsIDB4MWZhYjgsIDB4MWVhNDAsIDB4MWY1MzAsIDB4MWZhOWMsIDB4MWVhMjAsIDB4MWY1MTgsIDB4MWZhOGUsCi0gICAgIDB4MWVhMTAsIDB4MWY1MGMsIDB4MWVhMDgsIDB4MWY1MDYsIDB4MWVhMDQsIDB4MWViNjAsIDB4MWY1YjgsIDB4MWZhZGUsCi0gICAgIDB4MWQ2NDAsIDB4MWViMzAsIDB4MWY1OWMsIDB4MWQ2MjAsIDB4MWViMTgsIDB4MWY1OGUsIDB4MWQ2MTAsIDB4MWViMGMsCi0gICAgIDB4MWQ2MDgsIDB4MWViMDYsIDB4MWQ2MDQsIDB4MWQ3NjAsIDB4MWViYjgsIDB4MWY1ZGUsIDB4MWFlNDAsIDB4MWQ3MzAsCi0gICAgIDB4MWViOWMsIDB4MWFlMjAsIDB4MWQ3MTgsIDB4MWViOGUsIDB4MWFlMTAsIDB4MWQ3MGMsIDB4MWFlMDgsIDB4MWQ3MDYsCi0gICAgIDB4MWFlMDQsIDB4MWFmNjAsIDB4MWQ3YjgsIDB4MWViZGUsIDB4MTVlNDAsIDB4MWFmMzAsIDB4MWQ3OWMsIDB4MTVlMjAsCi0gICAgIDB4MWFmMTgsIDB4MWQ3OGUsIDB4MTVlMTAsIDB4MWFmMGMsIDB4MTVlMDgsIDB4MWFmMDYsIDB4MTVmNjAsIDB4MWFmYjgsCi0gICAgIDB4MWQ3ZGUsIDB4MTVmMzAsIDB4MWFmOWMsIDB4MTVmMTgsIDB4MWFmOGUsIDB4MTVmMGMsIDB4MTVmYjgsIDB4MWFmZGUsCi0gICAgIDB4MTVmOWMsIDB4MTVmOGUsIDB4MWU5NDAsIDB4MWY0YjAsIDB4MWZhNWMsIDB4MWU5MjAsIDB4MWY0OTgsIDB4MWZhNGUsCi0gICAgIDB4MWU5MTAsIDB4MWY0OGMsIDB4MWU5MDgsIDB4MWY0ODYsIDB4MWU5MDQsIDB4MWU5MDIsIDB4MWQzNDAsIDB4MWU5YjAsCi0gICAgIDB4MWY0ZGMsIDB4MWQzMjAsIDB4MWU5OTgsIDB4MWY0Y2UsIDB4MWQzMTAsIDB4MWU5OGMsIDB4MWQzMDgsIDB4MWU5ODYsCi0gICAgIDB4MWQzMDQsIDB4MWQzMDIsIDB4MWE3NDAsIDB4MWQzYjAsIDB4MWU5ZGMsIDB4MWE3MjAsIDB4MWQzOTgsIDB4MWU5Y2UsCi0gICAgIDB4MWE3MTAsIDB4MWQzOGMsIDB4MWE3MDgsIDB4MWQzODYsIDB4MWE3MDQsIDB4MWE3MDIsIDB4MTRmNDAsIDB4MWE3YjAsCi0gICAgIDB4MWQzZGMsIDB4MTRmMjAsIDB4MWE3OTgsIDB4MWQzY2UsIDB4MTRmMTAsIDB4MWE3OGMsIDB4MTRmMDgsIDB4MWE3ODYsCi0gICAgIDB4MTRmMDQsIDB4MTRmYjAsIDB4MWE3ZGMsIDB4MTRmOTgsIDB4MWE3Y2UsIDB4MTRmOGMsIDB4MTRmODYsIDB4MTRmZGMsCi0gICAgIDB4MTRmY2UsIDB4MWU4YTAsIDB4MWY0NTgsIDB4MWZhMmUsIDB4MWU4OTAsIDB4MWY0NGMsIDB4MWU4ODgsIDB4MWY0NDYsCi0gICAgIDB4MWU4ODQsIDB4MWU4ODIsIDB4MWQxYTAsIDB4MWU4ZDgsIDB4MWY0NmUsIDB4MWQxOTAsIDB4MWU4Y2MsIDB4MWQxODgsCi0gICAgIDB4MWU4YzYsIDB4MWQxODQsIDB4MWQxODIsIDB4MWEzYTAsIDB4MWQxZDgsIDB4MWU4ZWUsIDB4MWEzOTAsIDB4MWQxY2MsCi0gICAgIDB4MWEzODgsIDB4MWQxYzYsIDB4MWEzODQsIDB4MWEzODIsIDB4MTQ3YTAsIDB4MWEzZDgsIDB4MWQxZWUsIDB4MTQ3OTAsCi0gICAgIDB4MWEzY2MsIDB4MTQ3ODgsIDB4MWEzYzYsIDB4MTQ3ODQsIDB4MTQ3ODIsIDB4MTQ3ZDgsIDB4MWEzZWUsIDB4MTQ3Y2MsCi0gICAgIDB4MTQ3YzYsIDB4MTQ3ZWUsIDB4MWU4NTAsIDB4MWY0MmMsIDB4MWU4NDgsIDB4MWY0MjYsIDB4MWU4NDQsIDB4MWU4NDIsCi0gICAgIDB4MWQwZDAsIDB4MWU4NmMsIDB4MWQwYzgsIDB4MWU4NjYsIDB4MWQwYzQsIDB4MWQwYzIsIDB4MWExZDAsIDB4MWQwZWMsCi0gICAgIDB4MWExYzgsIDB4MWQwZTYsIDB4MWExYzQsIDB4MWExYzIsIDB4MTQzZDAsIDB4MWExZWMsIDB4MTQzYzgsIDB4MWExZTYsCi0gICAgIDB4MTQzYzQsIDB4MTQzYzIsIDB4MTQzZWMsIDB4MTQzZTYsIDB4MWU4MjgsIDB4MWY0MTYsIDB4MWU4MjQsIDB4MWU4MjIsCi0gICAgIDB4MWQwNjgsIDB4MWU4MzYsIDB4MWQwNjQsIDB4MWQwNjIsIDB4MWEwZTgsIDB4MWQwNzYsIDB4MWEwZTQsIDB4MWEwZTIsCi0gICAgIDB4MTQxZTgsIDB4MWEwZjYsIDB4MTQxZTQsIDB4MTQxZTIsIDB4MWU4MTQsIDB4MWU4MTIsIDB4MWQwMzQsIDB4MWQwMzIsCi0gICAgIDB4MWEwNzQsIDB4MWEwNzIsIDB4MWU1NDAsIDB4MWYyYjAsIDB4MWY5NWMsIDB4MWU1MjAsIDB4MWYyOTgsIDB4MWY5NGUsCi0gICAgIDB4MWU1MTAsIDB4MWYyOGMsIDB4MWU1MDgsIDB4MWYyODYsIDB4MWU1MDQsIDB4MWU1MDIsIDB4MWNiNDAsIDB4MWU1YjAsCi0gICAgIDB4MWYyZGMsIDB4MWNiMjAsIDB4MWU1OTgsIDB4MWYyY2UsIDB4MWNiMTAsIDB4MWU1OGMsIDB4MWNiMDgsIDB4MWU1ODYsCi0gICAgIDB4MWNiMDQsIDB4MWNiMDIsIDB4MTk3NDAsIDB4MWNiYjAsIDB4MWU1ZGMsIDB4MTk3MjAsIDB4MWNiOTgsIDB4MWU1Y2UsCi0gICAgIDB4MTk3MTAsIDB4MWNiOGMsIDB4MTk3MDgsIDB4MWNiODYsIDB4MTk3MDQsIDB4MTk3MDIsIDB4MTJmNDAsIDB4MTk3YjAsCi0gICAgIDB4MWNiZGMsIDB4MTJmMjAsIDB4MTk3OTgsIDB4MWNiY2UsIDB4MTJmMTAsIDB4MTk3OGMsIDB4MTJmMDgsIDB4MTk3ODYsCi0gICAgIDB4MTJmMDQsIDB4MTJmYjAsIDB4MTk3ZGMsIDB4MTJmOTgsIDB4MTk3Y2UsIDB4MTJmOGMsIDB4MTJmODYsIDB4MTJmZGMsCi0gICAgIDB4MTJmY2UsIDB4MWY2YTAsIDB4MWZiNTgsIDB4MTZiZjAsIDB4MWY2OTAsIDB4MWZiNGMsIDB4MTY5ZjgsIDB4MWY2ODgsCi0gICAgIDB4MWZiNDYsIDB4MTY4ZmMsIDB4MWY2ODQsIDB4MWY2ODIsIDB4MWU0YTAsIDB4MWYyNTgsIDB4MWY5MmUsIDB4MWVkYTAsCi0gICAgIDB4MWU0OTAsIDB4MWZiNmUsIDB4MWVkOTAsIDB4MWY2Y2MsIDB4MWYyNDYsIDB4MWVkODgsIDB4MWU0ODQsIDB4MWVkODQsCi0gICAgIDB4MWU0ODIsIDB4MWVkODIsIDB4MWM5YTAsIDB4MWU0ZDgsIDB4MWYyNmUsIDB4MWRiYTAsIDB4MWM5OTAsIDB4MWU0Y2MsCi0gICAgIDB4MWRiOTAsIDB4MWVkY2MsIDB4MWU0YzYsIDB4MWRiODgsIDB4MWM5ODQsIDB4MWRiODQsIDB4MWM5ODIsIDB4MWRiODIsCi0gICAgIDB4MTkzYTAsIDB4MWM5ZDgsIDB4MWU0ZWUsIDB4MWI3YTAsIDB4MTkzOTAsIDB4MWM5Y2MsIDB4MWI3OTAsIDB4MWRiY2MsCi0gICAgIDB4MWM5YzYsIDB4MWI3ODgsIDB4MTkzODQsIDB4MWI3ODQsIDB4MTkzODIsIDB4MWI3ODIsIDB4MTI3YTAsIDB4MTkzZDgsCi0gICAgIDB4MWM5ZWUsIDB4MTZmYTAsIDB4MTI3OTAsIDB4MTkzY2MsIDB4MTZmOTAsIDB4MWI3Y2MsIDB4MTkzYzYsIDB4MTZmODgsCi0gICAgIDB4MTI3ODQsIDB4MTZmODQsIDB4MTI3ODIsIDB4MTI3ZDgsIDB4MTkzZWUsIDB4MTZmZDgsIDB4MTI3Y2MsIDB4MTZmY2MsCi0gICAgIDB4MTI3YzYsIDB4MTZmYzYsIDB4MTI3ZWUsIDB4MWY2NTAsIDB4MWZiMmMsIDB4MTY1ZjgsIDB4MWY2NDgsIDB4MWZiMjYsCi0gICAgIDB4MTY0ZmMsIDB4MWY2NDQsIDB4MTY0N2UsIDB4MWY2NDIsIDB4MWU0NTAsIDB4MWYyMmMsIDB4MWVjZDAsIDB4MWU0NDgsCi0gICAgIDB4MWYyMjYsIDB4MWVjYzgsIDB4MWY2NjYsIDB4MWVjYzQsIDB4MWU0NDIsIDB4MWVjYzIsIDB4MWM4ZDAsIDB4MWU0NmMsCi0gICAgIDB4MWQ5ZDAsIDB4MWM4YzgsIDB4MWU0NjYsIDB4MWQ5YzgsIDB4MWVjZTYsIDB4MWQ5YzQsIDB4MWM4YzIsIDB4MWQ5YzIsCi0gICAgIDB4MTkxZDAsIDB4MWM4ZWMsIDB4MWIzZDAsIDB4MTkxYzgsIDB4MWM4ZTYsIDB4MWIzYzgsIDB4MWQ5ZTYsIDB4MWIzYzQsCi0gICAgIDB4MTkxYzIsIDB4MWIzYzIsIDB4MTIzZDAsIDB4MTkxZWMsIDB4MTY3ZDAsIDB4MTIzYzgsIDB4MTkxZTYsIDB4MTY3YzgsCi0gICAgIDB4MWIzZTYsIDB4MTY3YzQsIDB4MTIzYzIsIDB4MTY3YzIsIDB4MTIzZWMsIDB4MTY3ZWMsIDB4MTIzZTYsIDB4MTY3ZTYsCi0gICAgIDB4MWY2MjgsIDB4MWZiMTYsIDB4MTYyZmMsIDB4MWY2MjQsIDB4MTYyN2UsIDB4MWY2MjIsIDB4MWU0MjgsIDB4MWYyMTYsCi0gICAgIDB4MWVjNjgsIDB4MWY2MzYsIDB4MWVjNjQsIDB4MWU0MjIsIDB4MWVjNjIsIDB4MWM4NjgsIDB4MWU0MzYsIDB4MWQ4ZTgsCi0gICAgIDB4MWM4NjQsIDB4MWQ4ZTQsIDB4MWM4NjIsIDB4MWQ4ZTIsIDB4MTkwZTgsIDB4MWM4NzYsIDB4MWIxZTgsIDB4MWQ4ZjYsCi0gICAgIDB4MWIxZTQsIDB4MTkwZTIsIDB4MWIxZTIsIDB4MTIxZTgsIDB4MTkwZjYsIDB4MTYzZTgsIDB4MTIxZTQsIDB4MTYzZTQsCi0gICAgIDB4MTIxZTIsIDB4MTYzZTIsIDB4MTIxZjYsIDB4MTYzZjYsIDB4MWY2MTQsIDB4MTYxN2UsIDB4MWY2MTIsIDB4MWU0MTQsCi0gICAgIDB4MWVjMzQsIDB4MWU0MTIsIDB4MWVjMzIsIDB4MWM4MzQsIDB4MWQ4NzQsIDB4MWM4MzIsIDB4MWQ4NzIsIDB4MTkwNzQsCi0gICAgIDB4MWIwZjQsIDB4MTkwNzIsIDB4MWIwZjIsIDB4MTIwZjQsIDB4MTYxZjQsIDB4MTIwZjIsIDB4MTYxZjIsIDB4MWY2MGEsCi0gICAgIDB4MWU0MGEsIDB4MWVjMWEsIDB4MWM4MWEsIDB4MWQ4M2EsIDB4MTkwM2EsIDB4MWIwN2EsIDB4MWUyYTAsIDB4MWYxNTgsCi0gICAgIDB4MWY4YWUsIDB4MWUyOTAsIDB4MWYxNGMsIDB4MWUyODgsIDB4MWYxNDYsIDB4MWUyODQsIDB4MWUyODIsIDB4MWM1YTAsCi0gICAgIDB4MWUyZDgsIDB4MWYxNmUsIDB4MWM1OTAsIDB4MWUyY2MsIDB4MWM1ODgsIDB4MWUyYzYsIDB4MWM1ODQsIDB4MWM1ODIsCi0gICAgIDB4MThiYTAsIDB4MWM1ZDgsIDB4MWUyZWUsIDB4MThiOTAsIDB4MWM1Y2MsIDB4MThiODgsIDB4MWM1YzYsIDB4MThiODQsCi0gICAgIDB4MThiODIsIDB4MTE3YTAsIDB4MThiZDgsIDB4MWM1ZWUsIDB4MTE3OTAsIDB4MThiY2MsIDB4MTE3ODgsIDB4MThiYzYsCi0gICAgIDB4MTE3ODQsIDB4MTE3ODIsIDB4MTE3ZDgsIDB4MThiZWUsIDB4MTE3Y2MsIDB4MTE3YzYsIDB4MTE3ZWUsIDB4MWYzNTAsCi0gICAgIDB4MWY5YWMsIDB4MTM1ZjgsIDB4MWYzNDgsIDB4MWY5YTYsIDB4MTM0ZmMsIDB4MWYzNDQsIDB4MTM0N2UsIDB4MWYzNDIsCi0gICAgIDB4MWUyNTAsIDB4MWYxMmMsIDB4MWU2ZDAsIDB4MWUyNDgsIDB4MWYxMjYsIDB4MWU2YzgsIDB4MWYzNjYsIDB4MWU2YzQsCi0gICAgIDB4MWUyNDIsIDB4MWU2YzIsIDB4MWM0ZDAsIDB4MWUyNmMsIDB4MWNkZDAsIDB4MWM0YzgsIDB4MWUyNjYsIDB4MWNkYzgsCi0gICAgIDB4MWU2ZTYsIDB4MWNkYzQsIDB4MWM0YzIsIDB4MWNkYzIsIDB4MTg5ZDAsIDB4MWM0ZWMsIDB4MTliZDAsIDB4MTg5YzgsCi0gICAgIDB4MWM0ZTYsIDB4MTliYzgsIDB4MWNkZTYsIDB4MTliYzQsIDB4MTg5YzIsIDB4MTliYzIsIDB4MTEzZDAsIDB4MTg5ZWMsCi0gICAgIDB4MTM3ZDAsIDB4MTEzYzgsIDB4MTg5ZTYsIDB4MTM3YzgsIDB4MTliZTYsIDB4MTM3YzQsIDB4MTEzYzIsIDB4MTM3YzIsCi0gICAgIDB4MTEzZWMsIDB4MTM3ZWMsIDB4MTEzZTYsIDB4MTM3ZTYsIDB4MWZiYTgsIDB4MTc1ZjAsIDB4MWJhZmMsIDB4MWZiYTQsCi0gICAgIDB4MTc0ZjgsIDB4MWJhN2UsIDB4MWZiYTIsIDB4MTc0N2MsIDB4MTc0M2UsIDB4MWYzMjgsIDB4MWY5OTYsIDB4MTMyZmMsCi0gICAgIDB4MWY3NjgsIDB4MWZiYjYsIDB4MTc2ZmMsIDB4MTMyN2UsIDB4MWY3NjQsIDB4MWYzMjIsIDB4MTc2N2UsIDB4MWY3NjIsCi0gICAgIDB4MWUyMjgsIDB4MWYxMTYsIDB4MWU2NjgsIDB4MWUyMjQsIDB4MWVlZTgsIDB4MWY3NzYsIDB4MWUyMjIsIDB4MWVlZTQsCi0gICAgIDB4MWU2NjIsIDB4MWVlZTIsIDB4MWM0NjgsIDB4MWUyMzYsIDB4MWNjZTgsIDB4MWM0NjQsIDB4MWRkZTgsIDB4MWNjZTQsCi0gICAgIDB4MWM0NjIsIDB4MWRkZTQsIDB4MWNjZTIsIDB4MWRkZTIsIDB4MTg4ZTgsIDB4MWM0NzYsIDB4MTk5ZTgsIDB4MTg4ZTQsCi0gICAgIDB4MWJiZTgsIDB4MTk5ZTQsIDB4MTg4ZTIsIDB4MWJiZTQsIDB4MTk5ZTIsIDB4MWJiZTIsIDB4MTExZTgsIDB4MTg4ZjYsCi0gICAgIDB4MTMzZTgsIDB4MTExZTQsIDB4MTc3ZTgsIDB4MTMzZTQsIDB4MTExZTIsIDB4MTc3ZTQsIDB4MTMzZTIsIDB4MTc3ZTIsCi0gICAgIDB4MTExZjYsIDB4MTMzZjYsIDB4MWZiOTQsIDB4MTcyZjgsIDB4MWI5N2UsIDB4MWZiOTIsIDB4MTcyN2MsIDB4MTcyM2UsCi0gICAgIDB4MWYzMTQsIDB4MTMxN2UsIDB4MWY3MzQsIDB4MWYzMTIsIDB4MTczN2UsIDB4MWY3MzIsIDB4MWUyMTQsIDB4MWU2MzQsCi0gICAgIDB4MWUyMTIsIDB4MWVlNzQsIDB4MWU2MzIsIDB4MWVlNzIsIDB4MWM0MzQsIDB4MWNjNzQsIDB4MWM0MzIsIDB4MWRjZjQsCi0gICAgIDB4MWNjNzIsIDB4MWRjZjIsIDB4MTg4NzQsIDB4MTk4ZjQsIDB4MTg4NzIsIDB4MWI5ZjQsIDB4MTk4ZjIsIDB4MWI5ZjIsCi0gICAgIDB4MTEwZjQsIDB4MTMxZjQsIDB4MTEwZjIsIDB4MTczZjQsIDB4MTMxZjIsIDB4MTczZjIsIDB4MWZiOGEsIDB4MTcxN2MsCi0gICAgIDB4MTcxM2UsIDB4MWYzMGEsIDB4MWY3MWEsIDB4MWUyMGEsIDB4MWU2MWEsIDB4MWVlM2EsIDB4MWM0MWEsIDB4MWNjM2EsCi0gICAgIDB4MWRjN2EsIDB4MTg4M2EsIDB4MTk4N2EsIDB4MWI4ZmEsIDB4MTEwN2EsIDB4MTMwZmEsIDB4MTcxZmEsIDB4MTcwYmUsCi0gICAgIDB4MWUxNTAsIDB4MWYwYWMsIDB4MWUxNDgsIDB4MWYwYTYsIDB4MWUxNDQsIDB4MWUxNDIsIDB4MWMyZDAsIDB4MWUxNmMsCi0gICAgIDB4MWMyYzgsIDB4MWUxNjYsIDB4MWMyYzQsIDB4MWMyYzIsIDB4MTg1ZDAsIDB4MWMyZWMsIDB4MTg1YzgsIDB4MWMyZTYsCi0gICAgIDB4MTg1YzQsIDB4MTg1YzIsIDB4MTBiZDAsIDB4MTg1ZWMsIDB4MTBiYzgsIDB4MTg1ZTYsIDB4MTBiYzQsIDB4MTBiYzIsCi0gICAgIDB4MTBiZWMsIDB4MTBiZTYsIDB4MWYxYTgsIDB4MWY4ZDYsIDB4MTFhZmMsIDB4MWYxYTQsIDB4MTFhN2UsIDB4MWYxYTIsCi0gICAgIDB4MWUxMjgsIDB4MWYwOTYsIDB4MWUzNjgsIDB4MWUxMjQsIDB4MWUzNjQsIDB4MWUxMjIsIDB4MWUzNjIsIDB4MWMyNjgsCi0gICAgIDB4MWUxMzYsIDB4MWM2ZTgsIDB4MWMyNjQsIDB4MWM2ZTQsIDB4MWMyNjIsIDB4MWM2ZTIsIDB4MTg0ZTgsIDB4MWMyNzYsCi0gICAgIDB4MThkZTgsIDB4MTg0ZTQsIDB4MThkZTQsIDB4MTg0ZTIsIDB4MThkZTIsIDB4MTA5ZTgsIDB4MTg0ZjYsIDB4MTFiZTgsCi0gICAgIDB4MTA5ZTQsIDB4MTFiZTQsIDB4MTA5ZTIsIDB4MTFiZTIsIDB4MTA5ZjYsIDB4MTFiZjYsIDB4MWY5ZDQsIDB4MTNhZjgsCi0gICAgIDB4MTlkN2UsIDB4MWY5ZDIsIDB4MTNhN2MsIDB4MTNhM2UsIDB4MWYxOTQsIDB4MTE5N2UsIDB4MWYzYjQsIDB4MWYxOTIsCi0gICAgIDB4MTNiN2UsIDB4MWYzYjIsIDB4MWUxMTQsIDB4MWUzMzQsIDB4MWUxMTIsIDB4MWU3NzQsIDB4MWUzMzIsIDB4MWU3NzIsCi0gICAgIDB4MWMyMzQsIDB4MWM2NzQsIDB4MWMyMzIsIDB4MWNlZjQsIDB4MWM2NzIsIDB4MWNlZjIsIDB4MTg0NzQsIDB4MThjZjQsCi0gICAgIDB4MTg0NzIsIDB4MTlkZjQsIDB4MThjZjIsIDB4MTlkZjIsIDB4MTA4ZjQsIDB4MTE5ZjQsIDB4MTA4ZjIsIDB4MTNiZjQsCi0gICAgIDB4MTE5ZjIsIDB4MTNiZjIsIDB4MTdhZjAsIDB4MWJkN2MsIDB4MTdhNzgsIDB4MWJkM2UsIDB4MTdhM2MsIDB4MTdhMWUsCi0gICAgIDB4MWY5Y2EsIDB4MTM5N2MsIDB4MWZiZGEsIDB4MTdiN2MsIDB4MTM5M2UsIDB4MTdiM2UsIDB4MWYxOGEsIDB4MWYzOWEsCi0gICAgIDB4MWY3YmEsIDB4MWUxMGEsIDB4MWUzMWEsIDB4MWU3M2EsIDB4MWVmN2EsIDB4MWMyMWEsIDB4MWM2M2EsIDB4MWNlN2EsCi0gICAgIDB4MWRlZmEsIDB4MTg0M2EsIDB4MThjN2EsIDB4MTljZmEsIDB4MWJkZmEsIDB4MTA4N2EsIDB4MTE4ZmEsIDB4MTM5ZmEsCi0gICAgIDB4MTc5NzgsIDB4MWJjYmUsIDB4MTc5M2MsIDB4MTc5MWUsIDB4MTM4YmUsIDB4MTc5YmUsIDB4MTc4YmMsIDB4MTc4OWUsCi0gICAgIDB4MTc4NWUsIDB4MWUwYTgsIDB4MWUwYTQsIDB4MWUwYTIsIDB4MWMxNjgsIDB4MWUwYjYsIDB4MWMxNjQsIDB4MWMxNjIsCi0gICAgIDB4MTgyZTgsIDB4MWMxNzYsIDB4MTgyZTQsIDB4MTgyZTIsIDB4MTA1ZTgsIDB4MTgyZjYsIDB4MTA1ZTQsIDB4MTA1ZTIsCi0gICAgIDB4MTA1ZjYsIDB4MWYwZDQsIDB4MTBkN2UsIDB4MWYwZDIsIDB4MWUwOTQsIDB4MWUxYjQsIDB4MWUwOTIsIDB4MWUxYjIsCi0gICAgIDB4MWMxMzQsIDB4MWMzNzQsIDB4MWMxMzIsIDB4MWMzNzIsIDB4MTgyNzQsIDB4MTg2ZjQsIDB4MTgyNzIsIDB4MTg2ZjIsCi0gICAgIDB4MTA0ZjQsIDB4MTBkZjQsIDB4MTA0ZjIsIDB4MTBkZjIsIDB4MWY4ZWEsIDB4MTFkN2MsIDB4MTFkM2UsIDB4MWYwY2EsCi0gICAgIDB4MWYxZGEsIDB4MWUwOGEsIDB4MWUxOWEsIDB4MWUzYmEsIDB4MWMxMWEsIDB4MWMzM2EsIDB4MWM3N2EsIDB4MTgyM2EsCi0gICAgIDB4MTg2N2EsIDB4MThlZmEsIDB4MTA0N2EsIDB4MTBjZmEsIDB4MTFkZmEsIDB4MTNkNzgsIDB4MTllYmUsIDB4MTNkM2MsCi0gICAgIDB4MTNkMWUsIDB4MTFjYmUsIDB4MTNkYmUsIDB4MTdkNzAsIDB4MWJlYmMsIDB4MTdkMzgsIDB4MWJlOWUsIDB4MTdkMWMsCi0gICAgIDB4MTdkMGUsIDB4MTNjYmMsIDB4MTdkYmMsIDB4MTNjOWUsIDB4MTdkOWUsIDB4MTdjYjgsIDB4MWJlNWUsIDB4MTdjOWMsCi0gICAgIDB4MTdjOGUsIDB4MTNjNWUsIDB4MTdjZGUsIDB4MTdjNWMsIDB4MTdjNGUsIDB4MTdjMmUsIDB4MWMwYjQsIDB4MWMwYjIsCi0gICAgIDB4MTgxNzQsIDB4MTgxNzIsIDB4MTAyZjQsIDB4MTAyZjIsIDB4MWUwZGEsIDB4MWMwOWEsIDB4MWMxYmEsIDB4MTgxM2EsCi0gICAgIDB4MTgzN2EsIDB4MTAyN2EsIDB4MTA2ZmEsIDB4MTBlYmUsIDB4MTFlYmMsIDB4MTFlOWUsIDB4MTNlYjgsIDB4MTlmNWUsCi0gICAgIDB4MTNlOWMsIDB4MTNlOGUsIDB4MTFlNWUsIDB4MTNlZGUsIDB4MTdlYjAsIDB4MWJmNWMsIDB4MTdlOTgsIDB4MWJmNGUsCi0gICAgIDB4MTdlOGMsIDB4MTdlODYsIDB4MTNlNWMsIDB4MTdlZGMsIDB4MTNlNGUsIDB4MTdlY2UsIDB4MTdlNTgsIDB4MWJmMmUsCi0gICAgIDB4MTdlNGMsIDB4MTdlNDYsIDB4MTNlMmUsIDB4MTdlNmUsIDB4MTdlMmMsIDB4MTdlMjYsIDB4MTBmNWUsIDB4MTFmNWMsCi0gICAgIDB4MTFmNGUsIDB4MTNmNTgsIDB4MTlmYWUsIDB4MTNmNGMsIDB4MTNmNDYsIDB4MTFmMmUsIDB4MTNmNmUsIDB4MTNmMmMsCi0gICAgIDB4MTNmMjZ9LAotICAgIHsweDFhYmUwLCAweDFkNWY4LCAweDE1M2MwLCAweDFhOWYwLCAweDFkNGZjLCAweDE1MWUwLCAweDFhOGY4LCAweDFkNDdlLAotICAgICAweDE1MGYwLCAweDFhODdjLCAweDE1MDc4LCAweDFmYWQwLCAweDE1YmUwLCAweDFhZGY4LCAweDFmYWM4LCAweDE1OWYwLAotICAgICAweDFhY2ZjLCAweDFmYWM0LCAweDE1OGY4LCAweDFhYzdlLCAweDFmYWMyLCAweDE1ODdjLCAweDFmNWQwLCAweDFmYWVjLAotICAgICAweDE1ZGY4LCAweDFmNWM4LCAweDFmYWU2LCAweDE1Y2ZjLCAweDFmNWM0LCAweDE1YzdlLCAweDFmNWMyLCAweDFlYmQwLAotICAgICAweDFmNWVjLCAweDFlYmM4LCAweDFmNWU2LCAweDFlYmM0LCAweDFlYmMyLCAweDFkN2QwLCAweDFlYmVjLCAweDFkN2M4LAotICAgICAweDFlYmU2LCAweDFkN2M0LCAweDFkN2MyLCAweDFhZmQwLCAweDFkN2VjLCAweDFhZmM4LCAweDFkN2U2LCAweDFhZmM0LAotICAgICAweDE0YmMwLCAweDFhNWYwLCAweDFkMmZjLCAweDE0OWUwLCAweDFhNGY4LCAweDFkMjdlLCAweDE0OGYwLCAweDFhNDdjLAotICAgICAweDE0ODc4LCAweDFhNDNlLCAweDE0ODNjLCAweDFmYTY4LCAweDE0ZGYwLCAweDFhNmZjLCAweDFmYTY0LCAweDE0Y2Y4LAotICAgICAweDFhNjdlLCAweDFmYTYyLCAweDE0YzdjLCAweDE0YzNlLCAweDFmNGU4LCAweDFmYTc2LCAweDE0ZWZjLCAweDFmNGU0LAotICAgICAweDE0ZTdlLCAweDFmNGUyLCAweDFlOWU4LCAweDFmNGY2LCAweDFlOWU0LCAweDFlOWUyLCAweDFkM2U4LCAweDFlOWY2LAotICAgICAweDFkM2U0LCAweDFkM2UyLCAweDFhN2U4LCAweDFkM2Y2LCAweDFhN2U0LCAweDFhN2UyLCAweDE0NWUwLCAweDFhMmY4LAotICAgICAweDFkMTdlLCAweDE0NGYwLCAweDFhMjdjLCAweDE0NDc4LCAweDFhMjNlLCAweDE0NDNjLCAweDE0NDFlLCAweDFmYTM0LAotICAgICAweDE0NmY4LCAweDFhMzdlLCAweDFmYTMyLCAweDE0NjdjLCAweDE0NjNlLCAweDFmNDc0LCAweDE0NzdlLCAweDFmNDcyLAotICAgICAweDFlOGY0LCAweDFlOGYyLCAweDFkMWY0LCAweDFkMWYyLCAweDFhM2Y0LCAweDFhM2YyLCAweDE0MmYwLCAweDFhMTdjLAotICAgICAweDE0Mjc4LCAweDFhMTNlLCAweDE0MjNjLCAweDE0MjFlLCAweDFmYTFhLCAweDE0MzdjLCAweDE0MzNlLCAweDFmNDNhLAotICAgICAweDFlODdhLCAweDFkMGZhLCAweDE0MTc4LCAweDFhMGJlLCAweDE0MTNjLCAweDE0MTFlLCAweDE0MWJlLCAweDE0MGJjLAotICAgICAweDE0MDllLCAweDEyYmMwLCAweDE5NWYwLCAweDFjYWZjLCAweDEyOWUwLCAweDE5NGY4LCAweDFjYTdlLCAweDEyOGYwLAotICAgICAweDE5NDdjLCAweDEyODc4LCAweDE5NDNlLCAweDEyODNjLCAweDFmOTY4LCAweDEyZGYwLCAweDE5NmZjLCAweDFmOTY0LAotICAgICAweDEyY2Y4LCAweDE5NjdlLCAweDFmOTYyLCAweDEyYzdjLCAweDEyYzNlLCAweDFmMmU4LCAweDFmOTc2LCAweDEyZWZjLAotICAgICAweDFmMmU0LCAweDEyZTdlLCAweDFmMmUyLCAweDFlNWU4LCAweDFmMmY2LCAweDFlNWU0LCAweDFlNWUyLCAweDFjYmU4LAotICAgICAweDFlNWY2LCAweDFjYmU0LCAweDFjYmUyLCAweDE5N2U4LCAweDFjYmY2LCAweDE5N2U0LCAweDE5N2UyLCAweDFiNWUwLAotICAgICAweDFkYWY4LCAweDFlZDdlLCAweDE2OWMwLCAweDFiNGYwLCAweDFkYTdjLCAweDE2OGUwLCAweDFiNDc4LCAweDFkYTNlLAotICAgICAweDE2ODcwLCAweDFiNDNjLCAweDE2ODM4LCAweDFiNDFlLCAweDE2ODFjLCAweDEyNWUwLCAweDE5MmY4LCAweDFjOTdlLAotICAgICAweDE2ZGUwLCAweDEyNGYwLCAweDE5MjdjLCAweDE2Y2YwLCAweDFiNjdjLCAweDE5MjNlLCAweDE2Yzc4LCAweDEyNDNjLAotICAgICAweDE2YzNjLCAweDEyNDFlLCAweDE2YzFlLCAweDFmOTM0LCAweDEyNmY4LCAweDE5MzdlLCAweDFmYjc0LCAweDFmOTMyLAotICAgICAweDE2ZWY4LCAweDEyNjdjLCAweDFmYjcyLCAweDE2ZTdjLCAweDEyNjNlLCAweDE2ZTNlLCAweDFmMjc0LCAweDEyNzdlLAotICAgICAweDFmNmY0LCAweDFmMjcyLCAweDE2ZjdlLCAweDFmNmYyLCAweDFlNGY0LCAweDFlZGY0LCAweDFlNGYyLCAweDFlZGYyLAotICAgICAweDFjOWY0LCAweDFkYmY0LCAweDFjOWYyLCAweDFkYmYyLCAweDE5M2Y0LCAweDE5M2YyLCAweDE2NWMwLCAweDFiMmYwLAotICAgICAweDFkOTdjLCAweDE2NGUwLCAweDFiMjc4LCAweDFkOTNlLCAweDE2NDcwLCAweDFiMjNjLCAweDE2NDM4LCAweDFiMjFlLAotICAgICAweDE2NDFjLCAweDE2NDBlLCAweDEyMmYwLCAweDE5MTdjLCAweDE2NmYwLCAweDEyMjc4LCAweDE5MTNlLCAweDE2Njc4LAotICAgICAweDFiMzNlLCAweDE2NjNjLCAweDEyMjFlLCAweDE2NjFlLCAweDFmOTFhLCAweDEyMzdjLCAweDFmYjNhLCAweDE2NzdjLAotICAgICAweDEyMzNlLCAweDE2NzNlLCAweDFmMjNhLCAweDFmNjdhLCAweDFlNDdhLCAweDFlY2ZhLCAweDFjOGZhLCAweDFkOWZhLAotICAgICAweDE5MWZhLCAweDE2MmUwLCAweDFiMTc4LCAweDFkOGJlLCAweDE2MjcwLCAweDFiMTNjLCAweDE2MjM4LCAweDFiMTFlLAotICAgICAweDE2MjFjLCAweDE2MjBlLCAweDEyMTc4LCAweDE5MGJlLCAweDE2Mzc4LCAweDEyMTNjLCAweDE2MzNjLCAweDEyMTFlLAotICAgICAweDE2MzFlLCAweDEyMWJlLCAweDE2M2JlLCAweDE2MTcwLCAweDFiMGJjLCAweDE2MTM4LCAweDFiMDllLCAweDE2MTFjLAotICAgICAweDE2MTBlLCAweDEyMGJjLCAweDE2MWJjLCAweDEyMDllLCAweDE2MTllLCAweDE2MGI4LCAweDFiMDVlLCAweDE2MDljLAotICAgICAweDE2MDhlLCAweDEyMDVlLCAweDE2MGRlLCAweDE2MDVjLCAweDE2MDRlLCAweDExNWUwLCAweDE4YWY4LCAweDFjNTdlLAotICAgICAweDExNGYwLCAweDE4YTdjLCAweDExNDc4LCAweDE4YTNlLCAweDExNDNjLCAweDExNDFlLCAweDFmOGI0LCAweDExNmY4LAotICAgICAweDE4YjdlLCAweDFmOGIyLCAweDExNjdjLCAweDExNjNlLCAweDFmMTc0LCAweDExNzdlLCAweDFmMTcyLCAweDFlMmY0LAotICAgICAweDFlMmYyLCAweDFjNWY0LCAweDFjNWYyLCAweDE4YmY0LCAweDE4YmYyLCAweDEzNWMwLCAweDE5YWYwLCAweDFjZDdjLAotICAgICAweDEzNGUwLCAweDE5YTc4LCAweDFjZDNlLCAweDEzNDcwLCAweDE5YTNjLCAweDEzNDM4LCAweDE5YTFlLCAweDEzNDFjLAotICAgICAweDEzNDBlLCAweDExMmYwLCAweDE4OTdjLCAweDEzNmYwLCAweDExMjc4LCAweDE4OTNlLCAweDEzNjc4LCAweDE5YjNlLAotICAgICAweDEzNjNjLCAweDExMjFlLCAweDEzNjFlLCAweDFmODlhLCAweDExMzdjLCAweDFmOWJhLCAweDEzNzdjLCAweDExMzNlLAotICAgICAweDEzNzNlLCAweDFmMTNhLCAweDFmMzdhLCAweDFlMjdhLCAweDFlNmZhLCAweDFjNGZhLCAweDFjZGZhLCAweDE4OWZhLAotICAgICAweDFiYWUwLCAweDFkZDc4LCAweDFlZWJlLCAweDE3NGMwLCAweDFiYTcwLCAweDFkZDNjLCAweDE3NDYwLCAweDFiYTM4LAotICAgICAweDFkZDFlLCAweDE3NDMwLCAweDFiYTFjLCAweDE3NDE4LCAweDFiYTBlLCAweDE3NDBjLCAweDEzMmUwLCAweDE5OTc4LAotICAgICAweDFjY2JlLCAweDE3NmUwLCAweDEzMjcwLCAweDE5OTNjLCAweDE3NjcwLCAweDFiYjNjLCAweDE5OTFlLCAweDE3NjM4LAotICAgICAweDEzMjFjLCAweDE3NjFjLCAweDEzMjBlLCAweDE3NjBlLCAweDExMTc4LCAweDE4OGJlLCAweDEzMzc4LCAweDExMTNjLAotICAgICAweDE3Nzc4LCAweDEzMzNjLCAweDExMTFlLCAweDE3NzNjLCAweDEzMzFlLCAweDE3NzFlLCAweDExMWJlLCAweDEzM2JlLAotICAgICAweDE3N2JlLCAweDE3MmMwLCAweDFiOTcwLCAweDFkY2JjLCAweDE3MjYwLCAweDFiOTM4LCAweDFkYzllLCAweDE3MjMwLAotICAgICAweDFiOTFjLCAweDE3MjE4LCAweDFiOTBlLCAweDE3MjBjLCAweDE3MjA2LCAweDEzMTcwLCAweDE5OGJjLCAweDE3MzcwLAotICAgICAweDEzMTM4LCAweDE5ODllLCAweDE3MzM4LCAweDFiOTllLCAweDE3MzFjLCAweDEzMTBlLCAweDE3MzBlLCAweDExMGJjLAotICAgICAweDEzMWJjLCAweDExMDllLCAweDE3M2JjLCAweDEzMTllLCAweDE3MzllLCAweDE3MTYwLCAweDFiOGI4LCAweDFkYzVlLAotICAgICAweDE3MTMwLCAweDFiODljLCAweDE3MTE4LCAweDFiODhlLCAweDE3MTBjLCAweDE3MTA2LCAweDEzMGI4LCAweDE5ODVlLAotICAgICAweDE3MWI4LCAweDEzMDljLCAweDE3MTljLCAweDEzMDhlLCAweDE3MThlLCAweDExMDVlLCAweDEzMGRlLCAweDE3MWRlLAotICAgICAweDE3MGIwLCAweDFiODVjLCAweDE3MDk4LCAweDFiODRlLCAweDE3MDhjLCAweDE3MDg2LCAweDEzMDVjLCAweDE3MGRjLAotICAgICAweDEzMDRlLCAweDE3MGNlLCAweDE3MDU4LCAweDFiODJlLCAweDE3MDRjLCAweDE3MDQ2LCAweDEzMDJlLCAweDE3MDZlLAotICAgICAweDE3MDJjLCAweDE3MDI2LCAweDEwYWYwLCAweDE4NTdjLCAweDEwYTc4LCAweDE4NTNlLCAweDEwYTNjLCAweDEwYTFlLAotICAgICAweDEwYjdjLCAweDEwYjNlLCAweDFmMGJhLCAweDFlMTdhLCAweDFjMmZhLCAweDE4NWZhLCAweDExYWUwLCAweDE4ZDc4LAotICAgICAweDFjNmJlLCAweDExYTcwLCAweDE4ZDNjLCAweDExYTM4LCAweDE4ZDFlLCAweDExYTFjLCAweDExYTBlLCAweDEwOTc4LAotICAgICAweDE4NGJlLCAweDExYjc4LCAweDEwOTNjLCAweDExYjNjLCAweDEwOTFlLCAweDExYjFlLCAweDEwOWJlLCAweDExYmJlLAotICAgICAweDEzYWMwLCAweDE5ZDcwLCAweDFjZWJjLCAweDEzYTYwLCAweDE5ZDM4LCAweDFjZTllLCAweDEzYTMwLCAweDE5ZDFjLAotICAgICAweDEzYTE4LCAweDE5ZDBlLCAweDEzYTBjLCAweDEzYTA2LCAweDExOTcwLCAweDE4Y2JjLCAweDEzYjcwLCAweDExOTM4LAotICAgICAweDE4YzllLCAweDEzYjM4LCAweDExOTFjLCAweDEzYjFjLCAweDExOTBlLCAweDEzYjBlLCAweDEwOGJjLCAweDExOWJjLAotICAgICAweDEwODllLCAweDEzYmJjLCAweDExOTllLCAweDEzYjllLCAweDFiZDYwLCAweDFkZWI4LCAweDFlZjVlLCAweDE3YTQwLAotICAgICAweDFiZDMwLCAweDFkZTljLCAweDE3YTIwLCAweDFiZDE4LCAweDFkZThlLCAweDE3YTEwLCAweDFiZDBjLCAweDE3YTA4LAotICAgICAweDFiZDA2LCAweDE3YTA0LCAweDEzOTYwLCAweDE5Y2I4LCAweDFjZTVlLCAweDE3YjYwLCAweDEzOTMwLCAweDE5YzljLAotICAgICAweDE3YjMwLCAweDFiZDljLCAweDE5YzhlLCAweDE3YjE4LCAweDEzOTBjLCAweDE3YjBjLCAweDEzOTA2LCAweDE3YjA2LAotICAgICAweDExOGI4LCAweDE4YzVlLCAweDEzOWI4LCAweDExODljLCAweDE3YmI4LCAweDEzOTljLCAweDExODhlLCAweDE3YjljLAotICAgICAweDEzOThlLCAweDE3YjhlLCAweDEwODVlLCAweDExOGRlLCAweDEzOWRlLCAweDE3YmRlLCAweDE3OTQwLCAweDFiY2IwLAotICAgICAweDFkZTVjLCAweDE3OTIwLCAweDFiYzk4LCAweDFkZTRlLCAweDE3OTEwLCAweDFiYzhjLCAweDE3OTA4LCAweDFiYzg2LAotICAgICAweDE3OTA0LCAweDE3OTAyLCAweDEzOGIwLCAweDE5YzVjLCAweDE3OWIwLCAweDEzODk4LCAweDE5YzRlLCAweDE3OTk4LAotICAgICAweDFiY2NlLCAweDE3OThjLCAweDEzODg2LCAweDE3OTg2LCAweDExODVjLCAweDEzOGRjLCAweDExODRlLCAweDE3OWRjLAotICAgICAweDEzOGNlLCAweDE3OWNlLCAweDE3OGEwLCAweDFiYzU4LCAweDFkZTJlLCAweDE3ODkwLCAweDFiYzRjLCAweDE3ODg4LAotICAgICAweDFiYzQ2LCAweDE3ODg0LCAweDE3ODgyLCAweDEzODU4LCAweDE5YzJlLCAweDE3OGQ4LCAweDEzODRjLCAweDE3OGNjLAotICAgICAweDEzODQ2LCAweDE3OGM2LCAweDExODJlLCAweDEzODZlLCAweDE3OGVlLCAweDE3ODUwLCAweDFiYzJjLCAweDE3ODQ4LAotICAgICAweDFiYzI2LCAweDE3ODQ0LCAweDE3ODQyLCAweDEzODJjLCAweDE3ODZjLCAweDEzODI2LCAweDE3ODY2LCAweDE3ODI4LAotICAgICAweDFiYzE2LCAweDE3ODI0LCAweDE3ODIyLCAweDEzODE2LCAweDE3ODM2LCAweDEwNTc4LCAweDE4MmJlLCAweDEwNTNjLAotICAgICAweDEwNTFlLCAweDEwNWJlLCAweDEwZDcwLCAweDE4NmJjLCAweDEwZDM4LCAweDE4NjllLCAweDEwZDFjLCAweDEwZDBlLAotICAgICAweDEwNGJjLCAweDEwZGJjLCAweDEwNDllLCAweDEwZDllLCAweDExZDYwLCAweDE4ZWI4LCAweDFjNzVlLCAweDExZDMwLAotICAgICAweDE4ZTljLCAweDExZDE4LCAweDE4ZThlLCAweDExZDBjLCAweDExZDA2LCAweDEwY2I4LCAweDE4NjVlLCAweDExZGI4LAotICAgICAweDEwYzljLCAweDExZDljLCAweDEwYzhlLCAweDExZDhlLCAweDEwNDVlLCAweDEwY2RlLCAweDExZGRlLCAweDEzZDQwLAotICAgICAweDE5ZWIwLCAweDFjZjVjLCAweDEzZDIwLCAweDE5ZTk4LCAweDFjZjRlLCAweDEzZDEwLCAweDE5ZThjLCAweDEzZDA4LAotICAgICAweDE5ZTg2LCAweDEzZDA0LCAweDEzZDAyLCAweDExY2IwLCAweDE4ZTVjLCAweDEzZGIwLCAweDExYzk4LCAweDE4ZTRlLAotICAgICAweDEzZDk4LCAweDE5ZWNlLCAweDEzZDhjLCAweDExYzg2LCAweDEzZDg2LCAweDEwYzVjLCAweDExY2RjLCAweDEwYzRlLAotICAgICAweDEzZGRjLCAweDExY2NlLCAweDEzZGNlLCAweDFiZWEwLCAweDFkZjU4LCAweDFlZmFlLCAweDFiZTkwLCAweDFkZjRjLAotICAgICAweDFiZTg4LCAweDFkZjQ2LCAweDFiZTg0LCAweDFiZTgyLCAweDEzY2EwLCAweDE5ZTU4LCAweDFjZjJlLCAweDE3ZGEwLAotICAgICAweDEzYzkwLCAweDE5ZTRjLCAweDE3ZDkwLCAweDFiZWNjLCAweDE5ZTQ2LCAweDE3ZDg4LCAweDEzYzg0LCAweDE3ZDg0LAotICAgICAweDEzYzgyLCAweDE3ZDgyLCAweDExYzU4LCAweDE4ZTJlLCAweDEzY2Q4LCAweDExYzRjLCAweDE3ZGQ4LCAweDEzY2NjLAotICAgICAweDExYzQ2LCAweDE3ZGNjLCAweDEzY2M2LCAweDE3ZGM2LCAweDEwYzJlLCAweDExYzZlLCAweDEzY2VlLCAweDE3ZGVlLAotICAgICAweDFiZTUwLCAweDFkZjJjLCAweDFiZTQ4LCAweDFkZjI2LCAweDFiZTQ0LCAweDFiZTQyLCAweDEzYzUwLCAweDE5ZTJjLAotICAgICAweDE3Y2QwLCAweDEzYzQ4LCAweDE5ZTI2LCAweDE3Y2M4LCAweDFiZTY2LCAweDE3Y2M0LCAweDEzYzQyLCAweDE3Y2MyLAotICAgICAweDExYzJjLCAweDEzYzZjLCAweDExYzI2LCAweDE3Y2VjLCAweDEzYzY2LCAweDE3Y2U2LCAweDFiZTI4LCAweDFkZjE2LAotICAgICAweDFiZTI0LCAweDFiZTIyLCAweDEzYzI4LCAweDE5ZTE2LCAweDE3YzY4LCAweDEzYzI0LCAweDE3YzY0LCAweDEzYzIyLAotICAgICAweDE3YzYyLCAweDExYzE2LCAweDEzYzM2LCAweDE3Yzc2LCAweDFiZTE0LCAweDFiZTEyLCAweDEzYzE0LCAweDE3YzM0LAotICAgICAweDEzYzEyLCAweDE3YzMyLCAweDEwMmJjLCAweDEwMjllLCAweDEwNmI4LCAweDE4MzVlLCAweDEwNjljLCAweDEwNjhlLAotICAgICAweDEwMjVlLCAweDEwNmRlLCAweDEwZWIwLCAweDE4NzVjLCAweDEwZTk4LCAweDE4NzRlLCAweDEwZThjLCAweDEwZTg2LAotICAgICAweDEwNjVjLCAweDEwZWRjLCAweDEwNjRlLCAweDEwZWNlLCAweDExZWEwLCAweDE4ZjU4LCAweDFjN2FlLCAweDExZTkwLAotICAgICAweDE4ZjRjLCAweDExZTg4LCAweDE4ZjQ2LCAweDExZTg0LCAweDExZTgyLCAweDEwZTU4LCAweDE4NzJlLCAweDExZWQ4LAotICAgICAweDE4ZjZlLCAweDExZWNjLCAweDEwZTQ2LCAweDExZWM2LCAweDEwNjJlLCAweDEwZTZlLCAweDExZWVlLCAweDE5ZjUwLAotICAgICAweDFjZmFjLCAweDE5ZjQ4LCAweDFjZmE2LCAweDE5ZjQ0LCAweDE5ZjQyLCAweDExZTUwLCAweDE4ZjJjLCAweDEzZWQwLAotICAgICAweDE5ZjZjLCAweDE4ZjI2LCAweDEzZWM4LCAweDExZTQ0LCAweDEzZWM0LCAweDExZTQyLCAweDEzZWMyLCAweDEwZTJjLAotICAgICAweDExZTZjLCAweDEwZTI2LCAweDEzZWVjLCAweDExZTY2LCAweDEzZWU2LCAweDFkZmE4LCAweDFlZmQ2LCAweDFkZmE0LAotICAgICAweDFkZmEyLCAweDE5ZjI4LCAweDFjZjk2LCAweDFiZjY4LCAweDE5ZjI0LCAweDFiZjY0LCAweDE5ZjIyLCAweDFiZjYyLAotICAgICAweDExZTI4LCAweDE4ZjE2LCAweDEzZTY4LCAweDExZTI0LCAweDE3ZWU4LCAweDEzZTY0LCAweDExZTIyLCAweDE3ZWU0LAotICAgICAweDEzZTYyLCAweDE3ZWUyLCAweDEwZTE2LCAweDExZTM2LCAweDEzZTc2LCAweDE3ZWY2LCAweDFkZjk0LCAweDFkZjkyLAotICAgICAweDE5ZjE0LCAweDFiZjM0LCAweDE5ZjEyLCAweDFiZjMyLCAweDExZTE0LCAweDEzZTM0LCAweDExZTEyLCAweDE3ZTc0LAotICAgICAweDEzZTMyLCAweDE3ZTcyLCAweDFkZjhhLCAweDE5ZjBhLCAweDFiZjFhLCAweDExZTBhLCAweDEzZTFhLCAweDE3ZTNhLAotICAgICAweDEwMzVjLCAweDEwMzRlLCAweDEwNzU4LCAweDE4M2FlLCAweDEwNzRjLCAweDEwNzQ2LCAweDEwMzJlLCAweDEwNzZlLAotICAgICAweDEwZjUwLCAweDE4N2FjLCAweDEwZjQ4LCAweDE4N2E2LCAweDEwZjQ0LCAweDEwZjQyLCAweDEwNzJjLCAweDEwZjZjLAotICAgICAweDEwNzI2LCAweDEwZjY2LCAweDE4ZmE4LCAweDFjN2Q2LCAweDE4ZmE0LCAweDE4ZmEyLCAweDEwZjI4LCAweDE4Nzk2LAotICAgICAweDExZjY4LCAweDE4ZmI2LCAweDExZjY0LCAweDEwZjIyLCAweDExZjYyLCAweDEwNzE2LCAweDEwZjM2LCAweDExZjc2LAotICAgICAweDFjZmQ0LCAweDFjZmQyLCAweDE4Zjk0LCAweDE5ZmI0LCAweDE4ZjkyLCAweDE5ZmIyLCAweDEwZjE0LCAweDExZjM0LAotICAgICAweDEwZjEyLCAweDEzZjc0LCAweDExZjMyLCAweDEzZjcyLCAweDFjZmNhLCAweDE4ZjhhLCAweDE5ZjlhLCAweDEwZjBhLAotICAgICAweDExZjFhLCAweDEzZjNhLCAweDEwM2FjLCAweDEwM2E2LCAweDEwN2E4LCAweDE4M2Q2LCAweDEwN2E0LCAweDEwN2EyLAotICAgICAweDEwMzk2LCAweDEwN2I2LCAweDE4N2Q0LCAweDE4N2QyLCAweDEwNzk0LCAweDEwZmI0LCAweDEwNzkyLCAweDEwZmIyLAotICAgICAweDFjN2VhfX07Ci0KLUNCQ19QREY0MTc6OkNCQ19QREY0MTcoKSA6IENCQ19QREY0MTcoZmFsc2UpIHt9Ci0KLUNCQ19QREY0MTc6OkNCQ19QREY0MTcoYm9vbCBjb21wYWN0KQotICAgIDogbV9jb21wYWN0KGNvbXBhY3QpLAotICAgICAgbV9jb21wYWN0aW9uKEFVVE8pLAotICAgICAgbV9taW5Db2xzKDEpLAotICAgICAgbV9tYXhDb2xzKDMwKSwKLSAgICAgIG1fbWF4Um93cyg5MCksCi0gICAgICBtX21pblJvd3MoMykge30KLQotQ0JDX1BERjQxNzo6fkNCQ19QREY0MTcoKSB7fQotCi1DQkNfQmFyY29kZU1hdHJpeCogQ0JDX1BERjQxNzo6Z2V0QmFyY29kZU1hdHJpeCgpIHsKLSAgcmV0dXJuIG1fYmFyY29kZU1hdHJpeC5nZXQoKTsKLX0KLQotdm9pZCBDQkNfUERGNDE3OjpnZW5lcmF0ZUJhcmNvZGVMb2dpYyhDRlhfV2lkZVN0cmluZyBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXJyb3JDb3JyZWN0aW9uTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgaW50MzJfdCBlcnJvckNvcnJlY3Rpb25Db2RlV29yZHMgPQotICAgICAgQ0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbjo6Z2V0RXJyb3JDb3JyZWN0aW9uQ29kZXdvcmRDb3VudCgKLSAgICAgICAgICBlcnJvckNvcnJlY3Rpb25MZXZlbCwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotICBDRlhfV2lkZVN0cmluZyBoaWdoTGV2ZWwgPQotICAgICAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmVuY29kZUhpZ2hMZXZlbChtc2csIG1fY29tcGFjdGlvbiwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotICBpbnQzMl90IHNvdXJjZUNvZGVXb3JkcyA9IGhpZ2hMZXZlbC5HZXRMZW5ndGgoKTsKLSAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4qIGRpbWVuc2lvbiA9Ci0gICAgICBkZXRlcm1pbmVEaW1lbnNpb25zKHNvdXJjZUNvZGVXb3JkcywgZXJyb3JDb3JyZWN0aW9uQ29kZVdvcmRzLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm47Ci0gIGludDMyX3QgY29scyA9IGRpbWVuc2lvbi0+R2V0QXQoMCk7Ci0gIGludDMyX3Qgcm93cyA9IGRpbWVuc2lvbi0+R2V0QXQoMSk7Ci0gIGRlbGV0ZSBkaW1lbnNpb247Ci0gIGludDMyX3QgcGFkID0gZ2V0TnVtYmVyT2ZQYWRDb2Rld29yZHMoc291cmNlQ29kZVdvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29ycmVjdGlvbkNvZGVXb3JkcywgY29scywgcm93cyk7Ci0gIGlmIChzb3VyY2VDb2RlV29yZHMgKyBlcnJvckNvcnJlY3Rpb25Db2RlV29yZHMgKyAxID4gOTI5KSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uRW5jb2RlZE1lc3NhZ2VDb250YWluc1Rvb01hbnlDb2RlV29yZHM7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGludDMyX3QgbiA9IHNvdXJjZUNvZGVXb3JkcyArIHBhZCArIDE7Ci0gIENGWF9XaWRlU3RyaW5nIHNiOwotICBzYiArPSAoRlhfV0NIQVIpbjsKLSAgc2IgKz0gaGlnaExldmVsOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwYWQ7IGkrKykgewotICAgIHNiICs9IChGWF9XQ0hBUik5MDA7Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgZGF0YUNvZGV3b3JkcyhzYik7Ci0gIENGWF9XaWRlU3RyaW5nIGVjID0gQ0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbjo6Z2VuZXJhdGVFcnJvckNvcnJlY3Rpb24oCi0gICAgICBkYXRhQ29kZXdvcmRzLCBlcnJvckNvcnJlY3Rpb25MZXZlbCwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotICBDRlhfV2lkZVN0cmluZyBmdWxsQ29kZXdvcmRzID0gZGF0YUNvZGV3b3JkcyArIGVjOwotICBtX2JhcmNvZGVNYXRyaXggPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0JDX0JhcmNvZGVNYXRyaXg+KHJvd3MsIGNvbHMpOwotICBlbmNvZGVMb3dMZXZlbChmdWxsQ29kZXdvcmRzLCBjb2xzLCByb3dzLCBlcnJvckNvcnJlY3Rpb25MZXZlbCwKLSAgICAgICAgICAgICAgICAgbV9iYXJjb2RlTWF0cml4LmdldCgpKTsKLX0KLQotdm9pZCBDQkNfUERGNDE3OjpzZXREaW1lbnNpb25zKGludDMyX3QgbWF4Q29scywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1pbkNvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhSb3dzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWluUm93cykgewotICBtX21heENvbHMgPSBtYXhDb2xzOwotICBtX21pbkNvbHMgPSBtaW5Db2xzOwotICBtX21heFJvd3MgPSBtYXhSb3dzOwotICBtX21pblJvd3MgPSBtaW5Sb3dzOwotfQotCi12b2lkIENCQ19QREY0MTc6OnNldENvbXBhY3Rpb24oQ29tcGFjdGlvbiBjb21wYWN0aW9uKSB7Ci0gIG1fY29tcGFjdGlvbiA9IGNvbXBhY3Rpb247Ci19Ci0KLXZvaWQgQ0JDX1BERjQxNzo6c2V0Q29tcGFjdChib29sIGNvbXBhY3QpIHsKLSAgbV9jb21wYWN0ID0gY29tcGFjdDsKLX0KLQotaW50MzJfdCBDQkNfUERGNDE3OjpjYWxjdWxhdGVOdW1iZXJPZlJvd3MoaW50MzJfdCBtLCBpbnQzMl90IGssIGludDMyX3QgYykgewotICBpbnQzMl90IHIgPSAoKG0gKyAxICsgaykgLyBjKSArIDE7Ci0gIGlmIChjICogciA+PSAobSArIDEgKyBrICsgYykpIHsKLSAgICByLS07Ci0gIH0KLSAgcmV0dXJuIHI7Ci19Ci0KLWludDMyX3QgQ0JDX1BERjQxNzo6Z2V0TnVtYmVyT2ZQYWRDb2Rld29yZHMoaW50MzJfdCBtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByKSB7Ci0gIGludDMyX3QgbiA9IGMgKiByIC0gazsKLSAgcmV0dXJuIG4gPiBtICsgMSA/IG4gLSBtIC0gMSA6IDA7Ci19Ci0KLXZvaWQgQ0JDX1BERjQxNzo6ZW5jb2RlQ2hhcihpbnQzMl90IHBhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0JhcmNvZGVSb3cqIGxvZ2ljKSB7Ci0gIGludDMyX3QgbWFwID0gMSA8PCAobGVuIC0gMSk7Ci0gIGJvb2wgbGFzdCA9ICgocGF0dGVybiAmIG1hcCkgIT0gMCk7Ci0gIGludDMyX3Qgd2lkdGggPSAwOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgIGJvb2wgYmxhY2sgPSAoKHBhdHRlcm4gJiBtYXApICE9IDApOwotICAgIGlmIChsYXN0ID09IGJsYWNrKSB7Ci0gICAgICB3aWR0aCsrOwotICAgIH0gZWxzZSB7Ci0gICAgICBsb2dpYy0+YWRkQmFyKGxhc3QsIHdpZHRoKTsKLSAgICAgIGxhc3QgPSBibGFjazsKLSAgICAgIHdpZHRoID0gMTsKLSAgICB9Ci0gICAgbWFwID4+PSAxOwotICB9Ci0gIGxvZ2ljLT5hZGRCYXIobGFzdCwgd2lkdGgpOwotfQotCi12b2lkIENCQ19QREY0MTc6OmVuY29kZUxvd0xldmVsKENGWF9XaWRlU3RyaW5nIGZ1bGxDb2Rld29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVycm9yQ29ycmVjdGlvbkxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQmFyY29kZU1hdHJpeCogbG9naWMpIHsKLSAgaW50MzJfdCBpZHggPSAwOwotICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCByOyB5KyspIHsKLSAgICBpbnQzMl90IGNsdXN0ZXIgPSB5ICUgMzsKLSAgICBsb2dpYy0+c3RhcnRSb3coKTsKLSAgICBlbmNvZGVDaGFyKFNUQVJUX1BBVFRFUk4sIDE3LCBsb2dpYy0+Z2V0Q3VycmVudFJvdygpKTsKLSAgICBpbnQzMl90IGxlZnQ7Ci0gICAgaW50MzJfdCByaWdodDsKLSAgICBpZiAoY2x1c3RlciA9PSAwKSB7Ci0gICAgICBsZWZ0ID0gKDMwICogKHkgLyAzKSkgKyAoKHIgLSAxKSAvIDMpOwotICAgICAgcmlnaHQgPSAoMzAgKiAoeSAvIDMpKSArIChjIC0gMSk7Ci0gICAgfSBlbHNlIGlmIChjbHVzdGVyID09IDEpIHsKLSAgICAgIGxlZnQgPSAoMzAgKiAoeSAvIDMpKSArIChlcnJvckNvcnJlY3Rpb25MZXZlbCAqIDMpICsgKChyIC0gMSkgJSAzKTsKLSAgICAgIHJpZ2h0ID0gKDMwICogKHkgLyAzKSkgKyAoKHIgLSAxKSAvIDMpOwotICAgIH0gZWxzZSB7Ci0gICAgICBsZWZ0ID0gKDMwICogKHkgLyAzKSkgKyAoYyAtIDEpOwotICAgICAgcmlnaHQgPSAoMzAgKiAoeSAvIDMpKSArIChlcnJvckNvcnJlY3Rpb25MZXZlbCAqIDMpICsgKChyIC0gMSkgJSAzKTsKLSAgICB9Ci0gICAgaW50MzJfdCBwYXR0ZXJuID0gQ09ERVdPUkRfVEFCTEVbY2x1c3Rlcl1bbGVmdF07Ci0gICAgZW5jb2RlQ2hhcihwYXR0ZXJuLCAxNywgbG9naWMtPmdldEN1cnJlbnRSb3coKSk7Ci0gICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgYzsgeCsrKSB7Ci0gICAgICBwYXR0ZXJuID0gQ09ERVdPUkRfVEFCTEVbY2x1c3Rlcl1bZnVsbENvZGV3b3Jkcy5HZXRBdChpZHgpXTsKLSAgICAgIGVuY29kZUNoYXIocGF0dGVybiwgMTcsIGxvZ2ljLT5nZXRDdXJyZW50Um93KCkpOwotICAgICAgaWR4Kys7Ci0gICAgfQotICAgIGlmIChtX2NvbXBhY3QpIHsKLSAgICAgIGVuY29kZUNoYXIoU1RPUF9QQVRURVJOLCAxLCBsb2dpYy0+Z2V0Q3VycmVudFJvdygpKTsKLSAgICB9IGVsc2UgewotICAgICAgcGF0dGVybiA9IENPREVXT1JEX1RBQkxFW2NsdXN0ZXJdW3JpZ2h0XTsKLSAgICAgIGVuY29kZUNoYXIocGF0dGVybiwgMTcsIGxvZ2ljLT5nZXRDdXJyZW50Um93KCkpOwotICAgICAgZW5jb2RlQ2hhcihTVE9QX1BBVFRFUk4sIDE4LCBsb2dpYy0+Z2V0Q3VycmVudFJvdygpKTsKLSAgICB9Ci0gIH0KLX0KLQotQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4qIENCQ19QREY0MTc6OmRldGVybWluZURpbWVuc2lvbnMoCi0gICAgaW50MzJfdCBzb3VyY2VDb2RlV29yZHMsCi0gICAgaW50MzJfdCBlcnJvckNvcnJlY3Rpb25Db2RlV29yZHMsCi0gICAgaW50MzJfdCYgZSkgewotICBGWF9GTE9BVCByYXRpbyA9IDAuMGY7Ci0gIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+KiBkaW1lbnNpb24gPSBudWxscHRyOwotICBmb3IgKGludDMyX3QgY29scyA9IG1fbWluQ29sczsgY29scyA8PSBtX21heENvbHM7IGNvbHMrKykgewotICAgIGludDMyX3Qgcm93cyA9Ci0gICAgICAgIGNhbGN1bGF0ZU51bWJlck9mUm93cyhzb3VyY2VDb2RlV29yZHMsIGVycm9yQ29ycmVjdGlvbkNvZGVXb3JkcywgY29scyk7Ci0gICAgaWYgKHJvd3MgPCBtX21pblJvd3MpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAocm93cyA+IG1fbWF4Um93cykgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIEZYX0ZMT0FUIG5ld1JhdGlvID0KLSAgICAgICAgKCgxNyAqIGNvbHMgKyA2OSkgKiBERUZBVUxUX01PRFVMRV9XSURUSCkgLyAocm93cyAqIEhFSUdIVCk7Ci0gICAgaWYgKGRpbWVuc2lvbiAmJgotICAgICAgICBmYWJzZihuZXdSYXRpbyAtIFBSRUZFUlJFRF9SQVRJTykgPiBmYWJzZihyYXRpbyAtIFBSRUZFUlJFRF9SQVRJTykpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICByYXRpbyA9IG5ld1JhdGlvOwotICAgIGRlbGV0ZSBkaW1lbnNpb247Ci0gICAgZGltZW5zaW9uID0gbmV3IENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+OwotICAgIGRpbWVuc2lvbi0+QWRkKGNvbHMpOwotICAgIGRpbWVuc2lvbi0+QWRkKHJvd3MpOwotICB9Ci0gIGlmICghZGltZW5zaW9uKSB7Ci0gICAgaW50MzJfdCByb3dzID0gY2FsY3VsYXRlTnVtYmVyT2ZSb3dzKHNvdXJjZUNvZGVXb3JkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb3JyZWN0aW9uQ29kZVdvcmRzLCBtX21pbkNvbHMpOwotICAgIGlmIChyb3dzIDwgbV9taW5Sb3dzKSB7Ci0gICAgICBkaW1lbnNpb24gPSBuZXcgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD47Ci0gICAgICBkaW1lbnNpb24tPkFkZChtX21pbkNvbHMpOwotICAgICAgZGltZW5zaW9uLT5BZGQobV9taW5Sb3dzKTsKLSAgICB9IGVsc2UgaWYgKHJvd3MgPj0gMyAmJiByb3dzIDw9IDkwKSB7Ci0gICAgICBkaW1lbnNpb24gPSBuZXcgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD47Ci0gICAgICBkaW1lbnNpb24tPkFkZChtX21pbkNvbHMpOwotICAgICAgZGltZW5zaW9uLT5BZGQocm93cyk7Ci0gICAgfQotICB9Ci0gIGlmICghZGltZW5zaW9uKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uVW5hYmxlVG9GaXRNZXNzYWdlSW5Db2x1bW5zOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHJldHVybiBkaW1lbnNpb247Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTcuaCBiL3hmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxNy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmE1YWEyLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxNy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfUERGNDE3X0JDX1BERjQxN19IXwotI2RlZmluZSBYRkFfRlhCQVJDT0RFX1BERjQxN19CQ19QREY0MTdfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21wYWN0aW9uLmgiCi0KLWNsYXNzIENCQ19CYXJjb2RlUm93OwotY2xhc3MgQ0JDX0JhcmNvZGVNYXRyaXg7Ci0KLWNsYXNzIENCQ19QREY0MTcgewotIHB1YmxpYzoKLSAgQ0JDX1BERjQxNygpOwotICBleHBsaWNpdCBDQkNfUERGNDE3KGJvb2wgY29tcGFjdCk7Ci0gIHZpcnR1YWwgfkNCQ19QREY0MTcoKTsKLQotICBDQkNfQmFyY29kZU1hdHJpeCogZ2V0QmFyY29kZU1hdHJpeCgpOwotICB2b2lkIGdlbmVyYXRlQmFyY29kZUxvZ2ljKENGWF9XaWRlU3RyaW5nIG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVycm9yQ29ycmVjdGlvbkxldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotICB2b2lkIHNldERpbWVuc2lvbnMoaW50MzJfdCBtYXhDb2xzLAotICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW5Db2xzLAotICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhSb3dzLAotICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtaW5Sb3dzKTsKLSAgdm9pZCBzZXRDb21wYWN0aW9uKENvbXBhY3Rpb24gY29tcGFjdGlvbik7Ci0gIHZvaWQgc2V0Q29tcGFjdChib29sIGNvbXBhY3QpOwotCi0gcHJpdmF0ZToKLSAgc3RhdGljIGNvbnN0IGludDMyX3QgU1RBUlRfUEFUVEVSTiA9IDB4MWZlYTg7Ci0gIHN0YXRpYyBjb25zdCBpbnQzMl90IFNUT1BfUEFUVEVSTiA9IDB4M2ZhMjk7Ci0gIHN0YXRpYyBjb25zdCBpbnQzMl90IENPREVXT1JEX1RBQkxFW11bOTI5XTsKLSAgc3RhdGljIGNvbnN0ZXhwciBGWF9GTE9BVCBQUkVGRVJSRURfUkFUSU8gPSAzLjBmOwotICBzdGF0aWMgY29uc3RleHByIEZYX0ZMT0FUIERFRkFVTFRfTU9EVUxFX1dJRFRIID0gMC4zNTdmOwotICBzdGF0aWMgY29uc3RleHByIEZYX0ZMT0FUIEhFSUdIVCA9IDIuMGY7Ci0KLSAgc3RhdGljIGludDMyX3QgY2FsY3VsYXRlTnVtYmVyT2ZSb3dzKGludDMyX3QgbSwgaW50MzJfdCBrLCBpbnQzMl90IGMpOwotICBzdGF0aWMgaW50MzJfdCBnZXROdW1iZXJPZlBhZENvZGV3b3JkcyhpbnQzMl90IG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHIpOwotICBzdGF0aWMgdm9pZCBlbmNvZGVDaGFyKGludDMyX3QgcGF0dGVybiwgaW50MzJfdCBsZW4sIENCQ19CYXJjb2RlUm93KiBsb2dpYyk7Ci0gIHZvaWQgZW5jb2RlTG93TGV2ZWwoQ0ZYX1dpZGVTdHJpbmcgZnVsbENvZGV3b3JkcywKLSAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGMsCi0gICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByLAotICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZXJyb3JDb3JyZWN0aW9uTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgQ0JDX0JhcmNvZGVNYXRyaXgqIGxvZ2ljKTsKLSAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4qIGRldGVybWluZURpbWVuc2lvbnMoCi0gICAgICBpbnQzMl90IHNvdXJjZUNvZGVXb3JkcywKLSAgICAgIGludDMyX3QgZXJyb3JDb3JyZWN0aW9uQ29kZVdvcmRzLAotICAgICAgaW50MzJfdCYgZSk7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENCQ19CYXJjb2RlTWF0cml4PiBtX2JhcmNvZGVNYXRyaXg7Ci0gIGJvb2wgbV9jb21wYWN0OwotICBDb21wYWN0aW9uIG1fY29tcGFjdGlvbjsKLSAgaW50MzJfdCBtX21pbkNvbHM7Ci0gIGludDMyX3QgbV9tYXhDb2xzOwotICBpbnQzMl90IG1fbWF4Um93czsKLSAgaW50MzJfdCBtX21pblJvd3M7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfUERGNDE3X0JDX1BERjQxN19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZU1hdHJpeC5jcHAgYi94ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWF0cml4LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFmNGRhMS4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWF0cml4LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLS8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMSBaWGluZyBhdXRob3JzCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWF0cml4LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZVJvdy5oIgotCi1DQkNfQmFyY29kZU1hdHJpeDo6Q0JDX0JhcmNvZGVNYXRyaXgoaW50MzJfdCBoZWlnaHQsIGludDMyX3Qgd2lkdGgpIHsKLSAgbV9tYXRyaXguU2V0U2l6ZShoZWlnaHQgKyAyKTsKLSAgZm9yIChpbnQzMl90IGkgPSAwLCBtYXRyaXhMZW5ndGggPSBtX21hdHJpeC5HZXRTaXplKCk7IGkgPCBtYXRyaXhMZW5ndGg7Ci0gICAgICAgaSsrKSB7Ci0gICAgbV9tYXRyaXhbaV0gPSBuZXcgQ0JDX0JhcmNvZGVSb3coKHdpZHRoICsgNCkgKiAxNyArIDEpOwotICB9Ci0gIG1fd2lkdGggPSB3aWR0aCAqIDE3OwotICBtX2hlaWdodCA9IGhlaWdodCArIDI7Ci0gIG1fY3VycmVudFJvdyA9IDA7Ci0gIG1fb3V0SGVpZ2h0ID0gMDsKLSAgbV9vdXRXaWR0aCA9IDA7Ci19Ci1DQkNfQmFyY29kZU1hdHJpeDo6fkNCQ19CYXJjb2RlTWF0cml4KCkgewotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX21hdHJpeC5HZXRTaXplKCk7IGkrKykKLSAgICBkZWxldGUgbV9tYXRyaXguR2V0QXQoaSk7Ci0KLSAgbV9tYXRyaXhPdXQuUmVtb3ZlQWxsKCk7Ci19Ci12b2lkIENCQ19CYXJjb2RlTWF0cml4OjpzZXQoaW50MzJfdCB4LCBpbnQzMl90IHksIHVpbnQ4X3QgdmFsdWUpIHsKLSAgbV9tYXRyaXhbeV0tPnNldCh4LCB2YWx1ZSk7Ci19Ci12b2lkIENCQ19CYXJjb2RlTWF0cml4OjpzZXRNYXRyaXgoaW50MzJfdCB4LCBpbnQzMl90IHksIGJvb2wgYmxhY2spIHsKLSAgc2V0KHgsIHksICh1aW50OF90KShibGFjayA/IDEgOiAwKSk7Ci19Ci12b2lkIENCQ19CYXJjb2RlTWF0cml4OjpzdGFydFJvdygpIHsKLSAgKyttX2N1cnJlbnRSb3c7Ci19Ci1DQkNfQmFyY29kZVJvdyogQ0JDX0JhcmNvZGVNYXRyaXg6OmdldEN1cnJlbnRSb3coKSB7Ci0gIHJldHVybiBtX21hdHJpeFttX2N1cnJlbnRSb3ddOwotfQotaW50MzJfdCBDQkNfQmFyY29kZU1hdHJpeDo6Z2V0V2lkdGgoKSB7Ci0gIHJldHVybiBtX291dFdpZHRoOwotfQotaW50MzJfdCBDQkNfQmFyY29kZU1hdHJpeDo6Z2V0SGVpZ2h0KCkgewotICByZXR1cm4gbV9vdXRIZWlnaHQ7Ci19Ci1DRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90PiYgQ0JDX0JhcmNvZGVNYXRyaXg6OmdldE1hdHJpeCgpIHsKLSAgcmV0dXJuIGdldFNjYWxlZE1hdHJpeCgxLCAxKTsKLX0KLUNGWF9BcnJheVRlbXBsYXRlPHVpbnQ4X3Q+JiBDQkNfQmFyY29kZU1hdHJpeDo6Z2V0U2NhbGVkTWF0cml4KGludDMyX3Qgc2NhbGUpIHsKLSAgcmV0dXJuIGdldFNjYWxlZE1hdHJpeChzY2FsZSwgc2NhbGUpOwotfQotQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdD4mIENCQ19CYXJjb2RlTWF0cml4OjpnZXRTY2FsZWRNYXRyaXgoaW50MzJfdCB4U2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHlTY2FsZSkgewotICBpbnQzMl90IHlNYXggPSBtX2hlaWdodCAqIHlTY2FsZTsKLSAgQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdD4gYnl0ZWFycmF5OwotICBieXRlYXJyYXkuQ29weShtX21hdHJpeFswXS0+Z2V0U2NhbGVkUm93KHhTY2FsZSkpOwotICBpbnQzMl90IHhNYXggPSBieXRlYXJyYXkuR2V0U2l6ZSgpOwotICBtX21hdHJpeE91dC5TZXRTaXplKHhNYXggKiB5TWF4KTsKLSAgbV9vdXRXaWR0aCA9IHhNYXg7Ci0gIG1fb3V0SGVpZ2h0ID0geU1heDsKLSAgaW50MzJfdCBrID0gMDsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgeU1heDsgaSsrKSB7Ci0gICAgaWYgKGkgIT0gMCkgewotICAgICAgYnl0ZWFycmF5LkNvcHkobV9tYXRyaXhbaSAvIHlTY2FsZV0tPmdldFNjYWxlZFJvdyh4U2NhbGUpKTsKLSAgICB9Ci0gICAgayA9IGkgKiB4TWF4OwotICAgIGZvciAoaW50MzJfdCBsID0gMDsgbCA8IHhNYXg7IGwrKykgewotICAgICAgbV9tYXRyaXhPdXRbayArIGxdID0gYnl0ZWFycmF5LkdldEF0KGwpOwotICAgIH0KLSAgfQotICByZXR1cm4gbV9tYXRyaXhPdXQ7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWF0cml4LmggYi94ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWF0cml4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YWI1NDcuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3QmFyY29kZU1hdHJpeC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfUERGNDE3X0JDX1BERjQxN0JBUkNPREVNQVRSSVhfSF8KLSNkZWZpbmUgWEZBX0ZYQkFSQ09ERV9QREY0MTdfQkNfUERGNDE3QkFSQ09ERU1BVFJJWF9IXwotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgotCi1jbGFzcyBDQkNfQmFyY29kZVJvdzsKLQotY2xhc3MgQ0JDX0JhcmNvZGVNYXRyaXggewotIHB1YmxpYzoKLSAgQ0JDX0JhcmNvZGVNYXRyaXgoKTsKLSAgQ0JDX0JhcmNvZGVNYXRyaXgoaW50MzJfdCBoZWlnaHQsIGludDMyX3Qgd2lkdGgpOwotICB2aXJ0dWFsIH5DQkNfQmFyY29kZU1hdHJpeCgpOwotCi0gIHZvaWQgc2V0KGludDMyX3QgeCwgaW50MzJfdCB5LCB1aW50OF90IHZhbHVlKTsKLSAgdm9pZCBzZXRNYXRyaXgoaW50MzJfdCB4LCBpbnQzMl90IHksIGJvb2wgYmxhY2spOwotICB2b2lkIHN0YXJ0Um93KCk7Ci0gIENCQ19CYXJjb2RlUm93KiBnZXRDdXJyZW50Um93KCk7Ci0gIENGWF9BcnJheVRlbXBsYXRlPHVpbnQ4X3Q+JiBnZXRNYXRyaXgoKTsKLSAgQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdD4mIGdldFNjYWxlZE1hdHJpeChpbnQzMl90IHNjYWxlKTsKLSAgQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdD4mIGdldFNjYWxlZE1hdHJpeChpbnQzMl90IHhTY2FsZSwgaW50MzJfdCB5U2NhbGUpOwotICBpbnQzMl90IGdldFdpZHRoKCk7Ci0gIGludDMyX3QgZ2V0SGVpZ2h0KCk7Ci0KLSBwcml2YXRlOgotICBDRlhfQXJyYXlUZW1wbGF0ZTxDQkNfQmFyY29kZVJvdyo+IG1fbWF0cml4OwotICBDRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90PiBtX21hdHJpeE91dDsKLSAgaW50MzJfdCBtX2N1cnJlbnRSb3c7Ci0gIGludDMyX3QgbV9oZWlnaHQ7Ci0gIGludDMyX3QgbV93aWR0aDsKLSAgaW50MzJfdCBtX291dFdpZHRoOwotICBpbnQzMl90IG1fb3V0SGVpZ2h0OwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhCQVJDT0RFX1BERjQxN19CQ19QREY0MTdCQVJDT0RFTUFUUklYX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlUm93LmNwcCBiL3hmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVSb3cuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDNhZjcwLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVSb3cuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgotLyoKLSAqIENvcHlyaWdodCAyMDExIFpYaW5nIGF1dGhvcnMKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVSb3cuaCIKLQotQ0JDX0JhcmNvZGVSb3c6OkNCQ19CYXJjb2RlUm93KGludDMyX3Qgd2lkdGgpIHsKLSAgbV9yb3cuU2V0U2l6ZSh3aWR0aCk7Ci0gIG1fY3VycmVudExvY2F0aW9uID0gMDsKLX0KLUNCQ19CYXJjb2RlUm93Ojp+Q0JDX0JhcmNvZGVSb3coKSB7Ci0gIG1fb3V0cHV0LlJlbW92ZUFsbCgpOwotICBtX3Jvdy5SZW1vdmVBbGwoKTsKLX0KLXZvaWQgQ0JDX0JhcmNvZGVSb3c6OnNldChpbnQzMl90IHgsIHVpbnQ4X3QgdmFsdWUpIHsKLSAgbV9yb3cuU2V0QXQoeCwgdmFsdWUpOwotfQotdm9pZCBDQkNfQmFyY29kZVJvdzo6c2V0KGludDMyX3QgeCwgYm9vbCBibGFjaykgewotICBtX3Jvdy5TZXRBdCh4LCAodWludDhfdCkoYmxhY2sgPyAxIDogMCkpOwotfQotdm9pZCBDQkNfQmFyY29kZVJvdzo6YWRkQmFyKGJvb2wgYmxhY2ssIGludDMyX3Qgd2lkdGgpIHsKLSAgZm9yIChpbnQzMl90IGlpID0gMDsgaWkgPCB3aWR0aDsgaWkrKykgewotICAgIHNldChtX2N1cnJlbnRMb2NhdGlvbisrLCBibGFjayk7Ci0gIH0KLX0KLUNGWF9BcnJheVRlbXBsYXRlPHVpbnQ4X3Q+JiBDQkNfQmFyY29kZVJvdzo6Z2V0Um93KCkgewotICByZXR1cm4gbV9yb3c7Ci19Ci1DRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90PiYgQ0JDX0JhcmNvZGVSb3c6OmdldFNjYWxlZFJvdyhpbnQzMl90IHNjYWxlKSB7Ci0gIG1fb3V0cHV0LlNldFNpemUobV9yb3cuR2V0U2l6ZSgpICogc2NhbGUpOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBtX291dHB1dC5HZXRTaXplKCk7IGkrKykgewotICAgIG1fb3V0cHV0W2ldID0gKG1fcm93W2kgLyBzY2FsZV0pOwotICB9Ci0gIHJldHVybiBtX291dHB1dDsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVSb3cuaCBiL3hmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0JhcmNvZGVSb3cuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q5ZDE5Yy4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlUm93LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYQkFSQ09ERV9QREY0MTdfQkNfUERGNDE3QkFSQ09ERVJPV19IXwotI2RlZmluZSBYRkFfRlhCQVJDT0RFX1BERjQxN19CQ19QREY0MTdCQVJDT0RFUk9XX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0KLWNsYXNzIENCQ19CYXJjb2RlUm93IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENCQ19CYXJjb2RlUm93KGludDMyX3Qgd2lkdGgpOwotICB2aXJ0dWFsIH5DQkNfQmFyY29kZVJvdygpOwotCi0gIHZvaWQgc2V0KGludDMyX3QgeCwgdWludDhfdCB2YWx1ZSk7Ci0gIHZvaWQgc2V0KGludDMyX3QgeCwgYm9vbCBibGFjayk7Ci0gIHZvaWQgYWRkQmFyKGJvb2wgYmxhY2ssIGludDMyX3Qgd2lkdGgpOwotICBDRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90PiYgZ2V0Um93KCk7Ci0gIENGWF9BcnJheVRlbXBsYXRlPHVpbnQ4X3Q+JiBnZXRTY2FsZWRSb3coaW50MzJfdCBzY2FsZSk7Ci0KLSBwcml2YXRlOgotICBDRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90PiBtX3JvdzsKLSAgQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdD4gbV9vdXRwdXQ7Ci0gIGludDMyX3QgbV9jdXJyZW50TG9jYXRpb247Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfUERGNDE3X0JDX1BERjQxN0JBUkNPREVST1dfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbXBhY3Rpb24uY3BwIGIveGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29tcGFjdGlvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYTE2NjMuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29tcGFjdGlvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0vLyBPcmlnaW5hbCBjb2RlIGlzIGxpY2Vuc2VkIGFzIGZvbGxvd3M6Ci0vKgotICogQ29weXJpZ2h0IDIwMTEgWlhpbmcgYXV0aG9ycwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29tcGFjdGlvbi5oIgotCi1DQkNfQ29tcGFjdGlvbjo6Q0JDX0NvbXBhY3Rpb24oKSB7fQotQ0JDX0NvbXBhY3Rpb246On5DQkNfQ29tcGFjdGlvbigpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21wYWN0aW9uLmggYi94ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21wYWN0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZjBmY2UuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29tcGFjdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfUERGNDE3X0JDX1BERjQxN0NPTVBBQ1RJT05fSF8KLSNkZWZpbmUgWEZBX0ZYQkFSQ09ERV9QREY0MTdfQkNfUERGNDE3Q09NUEFDVElPTl9IXwotCi1jbGFzcyBDQkNfQ29tcGFjdGlvbjsKLWVudW0gQ29tcGFjdGlvbiB7IEFVVE8sIFRFWFQsIEJZVEVTLCBOVU1FUklDIH07Ci1jbGFzcyBDQkNfQ29tcGFjdGlvbiB7Ci0gcHVibGljOgotICBDQkNfQ29tcGFjdGlvbigpOwotICB2aXJ0dWFsIH5DQkNfQ29tcGFjdGlvbigpOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhCQVJDT0RFX1BERjQxN19CQ19QREY0MTdDT01QQUNUSU9OX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFcnJvckNvcnJlY3Rpb24uY3BwIGIveGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRlYzQwMy4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFcnJvckNvcnJlY3Rpb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLS8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNiBKZXJlbWlhcyBNYWVya2kgaW4gcGFydCwgYW5kIFpYaW5nIEF1dGhvcnMgaW4gcGFydAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbi5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvdXRpbHMuaCIKLQotbmFtZXNwYWNlIHsKLQotY29uc3QgdWludDE2X3QgRUNfTEVWRUxfMF9DT0VGRklDSUVOVFNbMl0gPSB7MjcsIDkxN307Ci1jb25zdCB1aW50MTZfdCBFQ19MRVZFTF8xX0NPRUZGSUNJRU5UU1s0XSA9IHs1MjIsIDU2OCwgNzIzLCA4MDl9OwotY29uc3QgdWludDE2X3QgRUNfTEVWRUxfMl9DT0VGRklDSUVOVFNbOF0gPSB7MjM3LCAzMDgsIDQzNiwgMjg0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQ2LCA2NTMsIDQyOCwgMzc5fTsKLQotY29uc3QgdWludDE2X3QgRUNfTEVWRUxfM19DT0VGRklDSUVOVFNbMTZdID0gezI3NCwgNTYyLCAyMzIsIDc1NSwgNTk5LCA1MjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODAxLCAxMzIsIDI5NSwgMTE2LCA0NDIsIDQyOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOTUsIDQyLCAgMTc2LCA2NX07Ci0KLWNvbnN0IHVpbnQxNl90IEVDX0xFVkVMXzRfQ09FRkZJQ0lFTlRTWzMyXSA9IHsKLSAgICAzNjEsIDU3NSwgOTIyLCA1MjUsIDE3NiwgNTg2LCA2NDAsIDMyMSwgNTM2LCA3NDIsIDY3NywKLSAgICA3NDIsIDY4NywgMjg0LCAxOTMsIDUxNywgMjczLCA0OTQsIDI2MywgMTQ3LCA1OTMsIDgwMCwKLSAgICA1NzEsIDMyMCwgODAzLCAxMzMsIDIzMSwgMzkwLCA2ODUsIDMzMCwgNjMsICA0MTB9OwotCi1jb25zdCB1aW50MTZfdCBFQ19MRVZFTF81X0NPRUZGSUNJRU5UU1s2NF0gPSB7Ci0gICAgNTM5LCA0MjIsIDYsICAgOTMsICA4NjIsIDc3MSwgNDUzLCAxMDYsIDYxMCwgMjg3LCAxMDcsIDUwNSwgNzMzLAotICAgIDg3NywgMzgxLCA2MTIsIDcyMywgNDc2LCA0NjIsIDE3MiwgNDMwLCA2MDksIDg1OCwgODIyLCA1NDMsIDM3NiwKLSAgICA1MTEsIDQwMCwgNjcyLCA3NjIsIDI4MywgMTg0LCA0NDAsIDM1LCAgNTE5LCAzMSwgIDQ2MCwgNTk0LCAyMjUsCi0gICAgNTM1LCA1MTcsIDM1MiwgNjA1LCAxNTgsIDY1MSwgMjAxLCA0ODgsIDUwMiwgNjQ4LCA3MzMsIDcxNywgODMsCi0gICAgNDA0LCA5NywgIDI4MCwgNzcxLCA4NDAsIDYyOSwgNCwgICAzODEsIDg0MywgNjIzLCAyNjQsIDU0M307Ci0KLWNvbnN0IHVpbnQxNl90IEVDX0xFVkVMXzZfQ09FRkZJQ0lFTlRTWzEyOF0gPSB7Ci0gICAgNTIxLCAzMTAsIDg2NCwgNTQ3LCA4NTgsIDU4MCwgMjk2LCAzNzksIDUzLCAgNzc5LCA4OTcsIDQ0NCwgNDAwLCA5MjUsIDc0OSwKLSAgICA0MTUsIDgyMiwgOTMsICAyMTcsIDIwOCwgOTI4LCAyNDQsIDU4MywgNjIwLCAyNDYsIDE0OCwgNDQ3LCA2MzEsIDI5MiwgOTA4LAotICAgIDQ5MCwgNzA0LCA1MTYsIDI1OCwgNDU3LCA5MDcsIDU5NCwgNzIzLCA2NzQsIDI5MiwgMjcyLCA5NiwgIDY4NCwgNDMyLCA2ODYsCi0gICAgNjA2LCA4NjAsIDU2OSwgMTkzLCAyMTksIDEyOSwgMTg2LCAyMzYsIDI4NywgMTkyLCA3NzUsIDI3OCwgMTczLCA0MCwgIDM3OSwKLSAgICA3MTIsIDQ2MywgNjQ2LCA3NzYsIDE3MSwgNDkxLCAyOTcsIDc2MywgMTU2LCA3MzIsIDk1LCAgMjcwLCA0NDcsIDkwLCAgNTA3LAotICAgIDQ4LCAgMjI4LCA4MjEsIDgwOCwgODk4LCA3ODQsIDY2MywgNjI3LCAzNzgsIDM4MiwgMjYyLCAzODAsIDYwMiwgNzU0LCAzMzYsCi0gICAgODksICA2MTQsIDg3LCAgNDMyLCA2NzAsIDYxNiwgMTU3LCAzNzQsIDI0MiwgNzI2LCA2MDAsIDI2OSwgMzc1LCA4OTgsIDg0NSwKLSAgICA0NTQsIDM1NCwgMTMwLCA4MTQsIDU4NywgODA0LCAzNCwgIDIxMSwgMzMwLCA1MzksIDI5NywgODI3LCA4NjUsIDM3LCAgNTE3LAotICAgIDgzNCwgMzE1LCA1NTAsIDg2LCAgODAxLCA0LCAgIDEwOCwgNTM5fTsKLQotY29uc3QgdWludDE2X3QgRUNfTEVWRUxfN19DT0VGRklDSUVOVFNbMjU2XSA9IHsKLSAgICA1MjQsIDg5NCwgNzUsICA3NjYsIDg4MiwgODU3LCA3NCwgIDIwNCwgODIsICA1ODYsIDcwOCwgMjUwLCA5MDUsIDc4NiwgMTM4LAotICAgIDcyMCwgODU4LCAxOTQsIDMxMSwgOTEzLCAyNzUsIDE5MCwgMzc1LCA4NTAsIDQzOCwgNzMzLCAxOTQsIDI4MCwgMjAxLCAyODAsCi0gICAgODI4LCA3NTcsIDcxMCwgODE0LCA5MTksIDg5LCAgNjgsICA1NjksIDExLCAgMjA0LCA3OTYsIDYwNSwgNTQwLCA5MTMsIDgwMSwKLSAgICA3MDAsIDc5OSwgMTM3LCA0MzksIDQxOCwgNTkyLCA2NjgsIDM1MywgODU5LCAzNzAsIDY5NCwgMzI1LCAyNDAsIDIxNiwgMjU3LAotICAgIDI4NCwgNTQ5LCAyMDksIDg4NCwgMzE1LCA3MCwgIDMyOSwgNzkzLCA0OTAsIDI3NCwgODc3LCAxNjIsIDc0OSwgODEyLCA2ODQsCi0gICAgNDYxLCAzMzQsIDM3NiwgODQ5LCA1MjEsIDMwNywgMjkxLCA4MDMsIDcxMiwgMTksICAzNTgsIDM5OSwgOTA4LCAxMDMsIDUxMSwKLSAgICA1MSwgIDgsICAgNTE3LCAyMjUsIDI4OSwgNDcwLCA2MzcsIDczMSwgNjYsICAyNTUsIDkxNywgMjY5LCA0NjMsIDgzMCwgNzMwLAotICAgIDQzMywgODQ4LCA1ODUsIDEzNiwgNTM4LCA5MDYsIDkwLCAgMiwgICAyOTAsIDc0MywgMTk5LCA2NTUsIDkwMywgMzI5LCA0OSwKLSAgICA4MDIsIDU4MCwgMzU1LCA1ODgsIDE4OCwgNDYyLCAxMCwgIDEzNCwgNjI4LCAzMjAsIDQ3OSwgMTMwLCA3MzksIDcxLCAgMjYzLAotICAgIDMxOCwgMzc0LCA2MDEsIDE5MiwgNjA1LCAxNDIsIDY3MywgNjg3LCAyMzQsIDcyMiwgMzg0LCAxNzcsIDc1MiwgNjA3LCA2NDAsCi0gICAgNDU1LCAxOTMsIDY4OSwgNzA3LCA4MDUsIDY0MSwgNDgsICA2MCwgIDczMiwgNjIxLCA4OTUsIDU0NCwgMjYxLCA4NTIsIDY1NSwKLSAgICAzMDksIDY5NywgNzU1LCA3NTYsIDYwLCAgMjMxLCA3NzMsIDQzNCwgNDIxLCA3MjYsIDUyOCwgNTAzLCAxMTgsIDQ5LCAgNzk1LAotICAgIDMyLCAgMTQ0LCA1MDAsIDIzOCwgODM2LCAzOTQsIDI4MCwgNTY2LCAzMTksIDksICAgNjQ3LCA1NTAsIDczLCAgOTE0LCAzNDIsCi0gICAgMTI2LCAzMiwgIDY4MSwgMzMxLCA3OTIsIDYyMCwgNjAsICA2MDksIDQ0MSwgMTgwLCA3OTEsIDg5MywgNzU0LCA2MDUsIDM4MywKLSAgICAyMjgsIDc0OSwgNzYwLCAyMTMsIDU0LCAgMjk3LCAxMzQsIDU0LCAgODM0LCAyOTksIDkyMiwgMTkxLCA5MTAsIDUzMiwgNjA5LAotICAgIDgyOSwgMTg5LCAyMCwgIDE2NywgMjksICA4NzIsIDQ0OSwgODMsICA0MDIsIDQxLCAgNjU2LCA1MDUsIDU3OSwgNDgxLCAxNzMsCi0gICAgNDA0LCAyNTEsIDY4OCwgOTUsICA0OTcsIDU1NSwgNjQyLCA1NDMsIDMwNywgMTU5LCA5MjQsIDU1OCwgNjQ4LCA1NSwgIDQ5NywKLSAgICAxMH07Ci0KLWNvbnN0IHVpbnQxNl90IEVDX0xFVkVMXzhfQ09FRkZJQ0lFTlRTWzUxMl0gPSB7Ci0gICAgMzUyLCA3NywgIDM3MywgNTA0LCAzNSwgIDU5OSwgNDI4LCAyMDcsIDQwOSwgNTc0LCAxMTgsIDQ5OCwgMjg1LCAzODAsIDM1MCwKLSAgICA0OTIsIDE5NywgMjY1LCA5MjAsIDE1NSwgOTE0LCAyOTksIDIyOSwgNjQzLCAyOTQsIDg3MSwgMzA2LCA4OCwgIDg3LCAgMTkzLAotICAgIDM1MiwgNzgxLCA4NDYsIDc1LCAgMzI3LCA1MjAsIDQzNSwgNTQzLCAyMDMsIDY2NiwgMjQ5LCAzNDYsIDc4MSwgNjIxLCA2NDAsCi0gICAgMjY4LCA3OTQsIDUzNCwgNTM5LCA3ODEsIDQwOCwgMzkwLCA2NDQsIDEwMiwgNDc2LCA0OTksIDI5MCwgNjMyLCA1NDUsIDM3LAotICAgIDg1OCwgOTE2LCA1NTIsIDQxLCAgNTQyLCAyODksIDEyMiwgMjcyLCAzODMsIDgwMCwgNDg1LCA5OCwgIDc1MiwgNDcyLCA3NjEsCi0gICAgMTA3LCA3ODQsIDg2MCwgNjU4LCA3NDEsIDI5MCwgMjA0LCA2ODEsIDQwNywgODU1LCA4NSwgIDk5LCAgNjIsICA0ODIsIDE4MCwKLSAgICAyMCwgIDI5NywgNDUxLCA1OTMsIDkxMywgMTQyLCA4MDgsIDY4NCwgMjg3LCA1MzYsIDU2MSwgNzYsICA2NTMsIDg5OSwgNzI5LAotICAgIDU2NywgNzQ0LCAzOTAsIDUxMywgMTkyLCA1MTYsIDI1OCwgMjQwLCA1MTgsIDc5NCwgMzk1LCA3NjgsIDg0OCwgNTEsICA2MTAsCi0gICAgMzg0LCAxNjgsIDE5MCwgODI2LCAzMjgsIDU5NiwgNzg2LCAzMDMsIDU3MCwgMzgxLCA0MTUsIDY0MSwgMTU2LCAyMzcsIDE1MSwKLSAgICA0MjksIDUzMSwgMjA3LCA2NzYsIDcxMCwgODksICAxNjgsIDMwNCwgNDAyLCA0MCwgIDcwOCwgNTc1LCAxNjIsIDg2NCwgMjI5LAotICAgIDY1LCAgODYxLCA4NDEsIDUxMiwgMTY0LCA0NzcsIDIyMSwgOTIsICAzNTgsIDc4NSwgMjg4LCAzNTcsIDg1MCwgODM2LCA4MjcsCi0gICAgNzM2LCA3MDcsIDk0LCAgOCwgICA0OTQsIDExNCwgNTIxLCAyLCAgIDQ5OSwgODUxLCA1NDMsIDE1MiwgNzI5LCA3NzEsIDk1LAotICAgIDI0OCwgMzYxLCA1NzgsIDMyMywgODU2LCA3OTcsIDI4OSwgNTEsICA2ODQsIDQ2NiwgNTMzLCA4MjAsIDY2OSwgNDUsICA5MDIsCi0gICAgNDUyLCAxNjcsIDM0MiwgMjQ0LCAxNzMsIDM1LCAgNDYzLCA2NTEsIDUxLCAgNjk5LCA1OTEsIDQ1MiwgNTc4LCAzNywgIDEyNCwKLSAgICAyOTgsIDMzMiwgNTUyLCA0MywgIDQyNywgMTE5LCA2NjIsIDc3NywgNDc1LCA4NTAsIDc2NCwgMzY0LCA1NzgsIDkxMSwgMjgzLAotICAgIDcxMSwgNDcyLCA0MjAsIDI0NSwgMjg4LCA1OTQsIDM5NCwgNTExLCAzMjcsIDU4OSwgNzc3LCA2OTksIDY4OCwgNDMsICA0MDgsCi0gICAgODQyLCAzODMsIDcyMSwgNTIxLCA1NjAsIDY0NCwgNzE0LCA1NTksIDYyLCAgMTQ1LCA4NzMsIDY2MywgNzEzLCAxNTksIDY3MiwKLSAgICA3MjksIDYyNCwgNTksICAxOTMsIDQxNywgMTU4LCAyMDksIDU2MywgNTY0LCAzNDMsIDY5MywgMTA5LCA2MDgsIDU2MywgMzY1LAotICAgIDE4MSwgNzcyLCA2NzcsIDMxMCwgMjQ4LCAzNTMsIDcwOCwgNDEwLCA1NzksIDg3MCwgNjE3LCA4NDEsIDYzMiwgODYwLCAyODksCi0gICAgNTM2LCAzNSwgIDc3NywgNjE4LCA1ODYsIDQyNCwgODMzLCA3NywgIDU5NywgMzQ2LCAyNjksIDc1NywgNjMyLCA2OTUsIDc1MSwKLSAgICAzMzEsIDI0NywgMTg0LCA0NSwgIDc4NywgNjgwLCAxOCwgIDY2LCAgNDA3LCAzNjksIDU0LCAgNDkyLCAyMjgsIDYxMywgODMwLAotICAgIDkyMiwgNDM3LCA1MTksIDY0NCwgOTA1LCA3ODksIDQyMCwgMzA1LCA0NDEsIDIwNywgMzAwLCA4OTIsIDgyNywgMTQxLCA1MzcsCi0gICAgMzgxLCA2NjIsIDUxMywgNTYsICAyNTIsIDM0MSwgMjQyLCA3OTcsIDgzOCwgODM3LCA3MjAsIDIyNCwgMzA3LCA2MzEsIDYxLAotICAgIDg3LCAgNTYwLCAzMTAsIDc1NiwgNjY1LCAzOTcsIDgwOCwgODUxLCAzMDksIDQ3MywgNzk1LCAzNzgsIDMxLCAgNjQ3LCA5MTUsCi0gICAgNDU5LCA4MDYsIDU5MCwgNzMxLCA0MjUsIDIxNiwgNTQ4LCAyNDksIDMyMSwgODgxLCA2OTksIDUzNSwgNjczLCA3ODIsIDIxMCwKLSAgICA4MTUsIDkwNSwgMzAzLCA4NDMsIDkyMiwgMjgxLCA3MywgIDQ2OSwgNzkxLCA2NjAsIDE2MiwgNDk4LCAzMDgsIDE1NSwgNDIyLAotICAgIDkwNywgODE3LCAxODcsIDYyLCAgMTYsICA0MjUsIDUzNSwgMzM2LCAyODYsIDQzNywgMzc1LCAyNzMsIDYxMCwgMjk2LCAxODMsCi0gICAgOTIzLCAxMTYsIDY2NywgNzUxLCAzNTMsIDYyLCAgMzY2LCA2OTEsIDM3OSwgNjg3LCA4NDIsIDM3LCAgMzU3LCA3MjAsIDc0MiwKLSAgICAzMzAsIDUsICAgMzksICA5MjMsIDMxMSwgNDI0LCAyNDIsIDc0OSwgMzIxLCA1NCwgIDY2OSwgMzE2LCAzNDIsIDI5OSwgNTM0LAotICAgIDEwNSwgNjY3LCA0ODgsIDY0MCwgNjcyLCA1NzYsIDU0MCwgMzE2LCA0ODYsIDcyMSwgNjEwLCA0NiwgIDY1NiwgNDQ3LCAxNzEsCi0gICAgNjE2LCA0NjQsIDE5MCwgNTMxLCAyOTcsIDMyMSwgNzYyLCA3NTIsIDUzMywgMTc1LCAxMzQsIDE0LCAgMzgxLCA0MzMsIDcxNywKLSAgICA0NSwgIDExMSwgMjAsICA1OTYsIDI4NCwgNzM2LCAxMzgsIDY0NiwgNDExLCA4NzcsIDY2OSwgMTQxLCA5MTksIDQ1LCAgNzgwLAotICAgIDQwNywgMTY0LCAzMzIsIDg5OSwgMTY1LCA3MjYsIDYwMCwgMzI1LCA0OTgsIDY1NSwgMzU3LCA3NTIsIDc2OCwgMjIzLCA4NDksCi0gICAgNjQ3LCA2MywgIDMxMCwgODYzLCAyNTEsIDM2NiwgMzA0LCAyODIsIDczOCwgNjc1LCA0MTAsIDM4OSwgMjQ0LCAzMSwgIDEyMSwKLSAgICAzMDMsIDI2M307Ci0KLWNvbnN0IHVpbnQxNl90KiBjb25zdCBFQ19DT0VGRklDSUVOVFNbOV0gPSB7Ci0gICAgRUNfTEVWRUxfMF9DT0VGRklDSUVOVFMsIEVDX0xFVkVMXzFfQ09FRkZJQ0lFTlRTLCBFQ19MRVZFTF8yX0NPRUZGSUNJRU5UUywKLSAgICBFQ19MRVZFTF8zX0NPRUZGSUNJRU5UUywgRUNfTEVWRUxfNF9DT0VGRklDSUVOVFMsIEVDX0xFVkVMXzVfQ09FRkZJQ0lFTlRTLAotICAgIEVDX0xFVkVMXzZfQ09FRkZJQ0lFTlRTLCBFQ19MRVZFTF83X0NPRUZGSUNJRU5UUywgRUNfTEVWRUxfOF9DT0VGRklDSUVOVFN9OwotCi19ICAvLyBuYW1lc3BhY2UKLQotQ0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbjo6Q0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbigpIHt9Ci1DQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uOjp+Q0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbigpIHt9Ci1pbnQzMl90IENCQ19QREY0MTdFcnJvckNvcnJlY3Rpb246OmdldEVycm9yQ29ycmVjdGlvbkNvZGV3b3JkQ291bnQoCi0gICAgaW50MzJfdCBlcnJvckNvcnJlY3Rpb25MZXZlbCwKLSAgICBpbnQzMl90JiBlKSB7Ci0gIGlmIChlcnJvckNvcnJlY3Rpb25MZXZlbCA8IDAgfHwgZXJyb3JDb3JyZWN0aW9uTGV2ZWwgPiA4KSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uRXJyb3JDb3JyZWN0aW9uTGV2ZWxNdXN0QmVCZXR3ZWVuMEFuZDg7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiAxIDw8IChlcnJvckNvcnJlY3Rpb25MZXZlbCArIDEpOwotfQotCi1pbnQzMl90IENCQ19QREY0MTdFcnJvckNvcnJlY3Rpb246OmdldFJlY29tbWVuZGVkTWluaW11bUVycm9yQ29ycmVjdGlvbkxldmVsKAotICAgIGludDMyX3QgbiwKLSAgICBpbnQzMl90JiBlKSB7Ci0gIGlmIChuIDw9IDApIHsKLSAgICBlID0gQkNFeGNlcHRpb25JbGxlZ2FsQXJndW1lbnRuTXVzdEJlQWJvdmUwOwotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAobiA8PSA0MCkgewotICAgIHJldHVybiAyOwotICB9Ci0gIGlmIChuIDw9IDE2MCkgewotICAgIHJldHVybiAzOwotICB9Ci0gIGlmIChuIDw9IDMyMCkgewotICAgIHJldHVybiA0OwotICB9Ci0gIGlmIChuIDw9IDg2MykgewotICAgIHJldHVybiA1OwotICB9Ci0gIGUgPSBCQ0V4Y2VwdGlvbk5vUmVjb21tZW5kYXRpb25Qb3NzaWJsZTsKLSAgcmV0dXJuIC0xOwotfQotCi1DRlhfV2lkZVN0cmluZyBDQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uOjpnZW5lcmF0ZUVycm9yQ29ycmVjdGlvbigKLSAgICBDRlhfV2lkZVN0cmluZyBkYXRhQ29kZXdvcmRzLAotICAgIGludDMyX3QgZXJyb3JDb3JyZWN0aW9uTGV2ZWwsCi0gICAgaW50MzJfdCYgZSkgewotICBpbnQzMl90IGsgPSBnZXRFcnJvckNvcnJlY3Rpb25Db2Rld29yZENvdW50KGVycm9yQ29ycmVjdGlvbkxldmVsLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gTCIgIjsKLSAgRlhfV0NIQVIqIGVjaCA9IEZYX0FsbG9jKEZYX1dDSEFSLCBrKTsKLSAgRlhTWVNfbWVtc2V0KGVjaCwgMCwgayAqIHNpemVvZihGWF9XQ0hBUikpOwotICBpbnQzMl90IHNsZCA9IGRhdGFDb2Rld29yZHMuR2V0TGVuZ3RoKCk7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNsZDsgaSsrKSB7Ci0gICAgaW50MzJfdCB0MSA9IChkYXRhQ29kZXdvcmRzLkdldEF0KGkpICsgZWNoW2sgLSAxXSkgJSA5Mjk7Ci0gICAgaW50MzJfdCB0MjsKLSAgICBpbnQzMl90IHQzOwotICAgIGZvciAoaW50MzJfdCBqID0gayAtIDE7IGogPj0gMTsgai0tKSB7Ci0gICAgICB0MiA9ICh0MSAqIEVDX0NPRUZGSUNJRU5UU1tlcnJvckNvcnJlY3Rpb25MZXZlbF1bal0pICUgOTI5OwotICAgICAgdDMgPSA5MjkgLSB0MjsKLSAgICAgIGVjaFtqXSA9IChGWF9XQ0hBUikoKGVjaFtqIC0gMV0gKyB0MykgJSA5MjkpOwotICAgIH0KLSAgICB0MiA9ICh0MSAqIEVDX0NPRUZGSUNJRU5UU1tlcnJvckNvcnJlY3Rpb25MZXZlbF1bMF0pICUgOTI5OwotICAgIHQzID0gOTI5IC0gdDI7Ci0gICAgZWNoWzBdID0gKEZYX1dDSEFSKSh0MyAlIDkyOSk7Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgc2I7Ci0gIGZvciAoaW50MzJfdCBqID0gayAtIDE7IGogPj0gMDsgai0tKSB7Ci0gICAgaWYgKGVjaFtqXSAhPSAwKSB7Ci0gICAgICBlY2hbal0gPSAoRlhfV0NIQVIpKDkyOSAtIGVjaFtqXSk7Ci0gICAgfQotICAgIHNiICs9IChGWF9XQ0hBUillY2hbal07Ci0gIH0KLSAgRlhfRnJlZShlY2gpOwotICByZXR1cm4gc2I7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdFcnJvckNvcnJlY3Rpb24uaCBiL3hmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODIyYWU0Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfUERGNDE3X0JDX1BERjQxN0VSUk9SQ09SUkVDVElPTl9IXwotI2RlZmluZSBYRkFfRlhCQVJDT0RFX1BERjQxN19CQ19QREY0MTdFUlJPUkNPUlJFQ1RJT05fSF8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLQotY2xhc3MgQ0JDX1BERjQxN0Vycm9yQ29ycmVjdGlvbiB7Ci0gcHVibGljOgotICBDQkNfUERGNDE3RXJyb3JDb3JyZWN0aW9uKCk7Ci0gIHZpcnR1YWwgfkNCQ19QREY0MTdFcnJvckNvcnJlY3Rpb24oKTsKLQotICBzdGF0aWMgaW50MzJfdCBnZXRFcnJvckNvcnJlY3Rpb25Db2Rld29yZENvdW50KGludDMyX3QgZXJyb3JDb3JyZWN0aW9uTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7Ci0gIHN0YXRpYyBpbnQzMl90IGdldFJlY29tbWVuZGVkTWluaW11bUVycm9yQ29ycmVjdGlvbkxldmVsKGludDMyX3QgbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7Ci0gIHN0YXRpYyBDRlhfV2lkZVN0cmluZyBnZW5lcmF0ZUVycm9yQ29ycmVjdGlvbihDRlhfV2lkZVN0cmluZyBkYXRhQ29kZXdvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlcnJvckNvcnJlY3Rpb25MZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhCQVJDT0RFX1BERjQxN19CQ19QREY0MTdFUlJPUkNPUlJFQ1RJT05fSF8KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXIuY3BwIGIveGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YTQwYzUuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgotLyoKLSAqIENvcHlyaWdodCAyMDA2IEplcmVtaWFzIE1hZXJraSBpbiBwYXJ0LCBhbmQgWlhpbmcgQXV0aG9ycyBpbiBwYXJ0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmlnaW50L0JpZ0ludGVnZXJMaWJyYXJ5LmhoIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvQkNfVXRpbENvZGluZ0NvbnZlcnQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdDb21wYWN0aW9uLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS91dGlscy5oIgotCi0jZGVmaW5lIFNVQk1PREVfQUxQSEEgMAotI2RlZmluZSBTVUJNT0RFX0xPV0VSIDEKLSNkZWZpbmUgU1VCTU9ERV9NSVhFRCAyCi0KLWludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OlRFWFRfQ09NUEFDVElPTiA9IDA7Ci1pbnQzMl90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpCWVRFX0NPTVBBQ1RJT04gPSAxOwotaW50MzJfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6TlVNRVJJQ19DT01QQUNUSU9OID0gMjsKLWludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OlNVQk1PREVfUFVOQ1RVQVRJT04gPSAzOwotaW50MzJfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fVEVYVCA9IDkwMDsKLWludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkxBVENIX1RPX0JZVEVfUEFEREVEID0gOTAxOwotaW50MzJfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6TEFUQ0hfVE9fTlVNRVJJQyA9IDkwMjsKLWludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OlNISUZUX1RPX0JZVEUgPSA5MTM7Ci1pbnQzMl90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpMQVRDSF9UT19CWVRFID0gOTI0OwotdWludDhfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6VEVYVF9NSVhFRF9SQVdbXSA9IHsKLSAgICA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgMzgsIDEzLCA5LCA0NCwgNTgsCi0gICAgMzUsIDQ1LCA0NiwgMzYsIDQ3LCA0MywgMzcsIDQyLCA2MSwgOTQsIDAsICAzMiwgMCwgMCwgIDB9OwotdWludDhfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6VEVYVF9QVU5DVFVBVElPTl9SQVdbXSA9IHsKLSAgICA1OSwgNjAsIDYyLCA2NCwgOTEsIDkyLCA5MywgIDk1LCA5NiwgMTI2LCAzMywgMTMsICA5LCAgIDQ0LCA1OCwKLSAgICAxMCwgNDUsIDQ2LCAzNiwgNDcsIDM0LCAxMjQsIDQyLCA0MCwgNDEsICA2MywgMTIzLCAxMjUsIDM5LCAwfTsKLWludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6Ok1JWEVEWzEyOF0gPSB7MH07Ci1pbnQzMl90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpQVU5DVFVBVElPTlsxMjhdID0gezB9OwotCi12b2lkIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpJbml0aWFsaXplKCkgewotICBJbnZlcnNlKCk7Ci19Ci0KLXZvaWQgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkZpbmFsaXplKCkge30KLQotQ0ZYX1dpZGVTdHJpbmcgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmVuY29kZUhpZ2hMZXZlbCgKLSAgICBDRlhfV2lkZVN0cmluZyB3aWRlTXNnLAotICAgIENvbXBhY3Rpb24gY29tcGFjdGlvbiwKLSAgICBpbnQzMl90JiBlKSB7Ci0gIENGWF9CeXRlU3RyaW5nIGJ5dGVzOwotICBDQkNfVXRpbENvZGluZ0NvbnZlcnQ6OlVuaWNvZGVUb1VURjgod2lkZU1zZywgYnl0ZXMpOwotICBDRlhfV2lkZVN0cmluZyBtc2c7Ci0gIGludDMyX3QgbGVuID0gYnl0ZXMuR2V0TGVuZ3RoKCk7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgRlhfV0NIQVIgY2ggPSAoRlhfV0NIQVIpKGJ5dGVzLkdldEF0KGkpICYgMHhmZik7Ci0gICAgaWYgKGNoID09ICc/JyAmJiBieXRlcy5HZXRBdChpKSAhPSAnPycpIHsKLSAgICAgIGUgPSBCQ0V4Y2VwdGlvbkNoYXJhY3RlcnNPdXRzaWRlSVNPODg1OTFFbmNvZGluZzsKLSAgICAgIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotICAgIH0KLSAgICBtc2cgKz0gY2g7Ci0gIH0KLSAgQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdD4gYnl0ZUFycjsKLSAgZm9yIChpbnQzMl90IGsgPSAwOyBrIDwgYnl0ZXMuR2V0TGVuZ3RoKCk7IGsrKykgewotICAgIGJ5dGVBcnIuQWRkKGJ5dGVzLkdldEF0KGspKTsKLSAgfQotICBDRlhfV2lkZVN0cmluZyBzYjsKLSAgbGVuID0gbXNnLkdldExlbmd0aCgpOwotICBpbnQzMl90IHAgPSAwOwotICBpbnQzMl90IHRleHRTdWJNb2RlID0gU1VCTU9ERV9BTFBIQTsKLSAgaWYgKGNvbXBhY3Rpb24gPT0gVEVYVCkgewotICAgIGVuY29kZVRleHQobXNnLCBwLCBsZW4sIHNiLCB0ZXh0U3ViTW9kZSk7Ci0gIH0gZWxzZSBpZiAoY29tcGFjdGlvbiA9PSBCWVRFUykgewotICAgIGVuY29kZUJpbmFyeSgmYnl0ZUFyciwgcCwgYnl0ZUFyci5HZXRTaXplKCksIEJZVEVfQ09NUEFDVElPTiwgc2IpOwotICB9IGVsc2UgaWYgKGNvbXBhY3Rpb24gPT0gTlVNRVJJQykgewotICAgIHNiICs9IChGWF9XQ0hBUilMQVRDSF9UT19OVU1FUklDOwotICAgIGVuY29kZU51bWVyaWMobXNnLCBwLCBsZW4sIHNiKTsKLSAgfSBlbHNlIHsKLSAgICBpbnQzMl90IGVuY29kaW5nTW9kZSA9IExBVENIX1RPX1RFWFQ7Ci0gICAgd2hpbGUgKHAgPCBsZW4pIHsKLSAgICAgIGludDMyX3QgbiA9IGRldGVybWluZUNvbnNlY3V0aXZlRGlnaXRDb3VudChtc2csIHApOwotICAgICAgaWYgKG4gPj0gMTMpIHsKLSAgICAgICAgc2IgKz0gKEZYX1dDSEFSKUxBVENIX1RPX05VTUVSSUM7Ci0gICAgICAgIGVuY29kaW5nTW9kZSA9IE5VTUVSSUNfQ09NUEFDVElPTjsKLSAgICAgICAgdGV4dFN1Yk1vZGUgPSBTVUJNT0RFX0FMUEhBOwotICAgICAgICBlbmNvZGVOdW1lcmljKG1zZywgcCwgbiwgc2IpOwotICAgICAgICBwICs9IG47Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbnQzMl90IHQgPSBkZXRlcm1pbmVDb25zZWN1dGl2ZVRleHRDb3VudChtc2csIHApOwotICAgICAgICBpZiAodCA+PSA1IHx8IG4gPT0gbGVuKSB7Ci0gICAgICAgICAgaWYgKGVuY29kaW5nTW9kZSAhPSBURVhUX0NPTVBBQ1RJT04pIHsKLSAgICAgICAgICAgIHNiICs9IChGWF9XQ0hBUilMQVRDSF9UT19URVhUOwotICAgICAgICAgICAgZW5jb2RpbmdNb2RlID0gVEVYVF9DT01QQUNUSU9OOwotICAgICAgICAgICAgdGV4dFN1Yk1vZGUgPSBTVUJNT0RFX0FMUEhBOwotICAgICAgICAgIH0KLSAgICAgICAgICB0ZXh0U3ViTW9kZSA9IGVuY29kZVRleHQobXNnLCBwLCB0LCBzYiwgdGV4dFN1Yk1vZGUpOwotICAgICAgICAgIHAgKz0gdDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpbnQzMl90IGIgPSBkZXRlcm1pbmVDb25zZWN1dGl2ZUJpbmFyeUNvdW50KG1zZywgJmJ5dGVBcnIsIHAsIGUpOwotICAgICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICAgICAgICByZXR1cm4gTCIgIjsKLSAgICAgICAgICBpZiAoYiA9PSAwKSB7Ci0gICAgICAgICAgICBiID0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGIgPT0gMSAmJiBlbmNvZGluZ01vZGUgPT0gVEVYVF9DT01QQUNUSU9OKSB7Ci0gICAgICAgICAgICBlbmNvZGVCaW5hcnkoJmJ5dGVBcnIsIHAsIDEsIFRFWFRfQ09NUEFDVElPTiwgc2IpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlbmNvZGVCaW5hcnkoJmJ5dGVBcnIsIHAsIGIsIGVuY29kaW5nTW9kZSwgc2IpOwotICAgICAgICAgICAgZW5jb2RpbmdNb2RlID0gQllURV9DT01QQUNUSU9OOwotICAgICAgICAgICAgdGV4dFN1Yk1vZGUgPSBTVUJNT0RFX0FMUEhBOwotICAgICAgICAgIH0KLSAgICAgICAgICBwICs9IGI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNiOwotfQotCi12b2lkIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpJbnZlcnNlKCkgewotICBmb3IgKHNpemVfdCBsID0gMDsgbCA8IEZYX0FycmF5U2l6ZShNSVhFRCk7ICsrbCkKLSAgICBNSVhFRFtsXSA9IC0xOwotCi0gIGZvciAodWludDhfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShURVhUX01JWEVEX1JBVyk7ICsraSkgewotICAgIHVpbnQ4X3QgYiA9IFRFWFRfTUlYRURfUkFXW2ldOwotICAgIGlmIChiICE9IDApCi0gICAgICBNSVhFRFtiXSA9IGk7Ci0gIH0KLQotICBmb3IgKHNpemVfdCBsID0gMDsgbCA8IEZYX0FycmF5U2l6ZShQVU5DVFVBVElPTik7ICsrbCkKLSAgICBQVU5DVFVBVElPTltsXSA9IC0xOwotCi0gIGZvciAodWludDhfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShURVhUX1BVTkNUVUFUSU9OX1JBVyk7ICsraSkgewotICAgIHVpbnQ4X3QgYiA9IFRFWFRfUFVOQ1RVQVRJT05fUkFXW2ldOwotICAgIGlmIChiICE9IDApCi0gICAgICBQVU5DVFVBVElPTltiXSA9IGk7Ci0gIH0KLX0KLQotaW50MzJfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZW5jb2RlVGV4dChDRlhfV2lkZVN0cmluZyBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbml0aWFsU3VibW9kZSkgewotICBDRlhfV2lkZVN0cmluZyB0bXA7Ci0gIGludDMyX3Qgc3VibW9kZSA9IGluaXRpYWxTdWJtb2RlOwotICBpbnQzMl90IGlkeCA9IDA7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgRlhfV0NIQVIgY2ggPSBtc2cuR2V0QXQoc3RhcnRwb3MgKyBpZHgpOwotICAgIHN3aXRjaCAoc3VibW9kZSkgewotICAgICAgY2FzZSBTVUJNT0RFX0FMUEhBOgotICAgICAgICBpZiAoaXNBbHBoYVVwcGVyKGNoKSkgewotICAgICAgICAgIGlmIChjaCA9PSAnICcpIHsKLSAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpMjY7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpKGNoIC0gNjUpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoaXNBbHBoYUxvd2VyKGNoKSkgewotICAgICAgICAgICAgc3VibW9kZSA9IFNVQk1PREVfTE9XRVI7Ci0gICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKTI3OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfSBlbHNlIGlmIChpc01peGVkKGNoKSkgewotICAgICAgICAgICAgc3VibW9kZSA9IFNVQk1PREVfTUlYRUQ7Ci0gICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKTI4OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpMjk7Ci0gICAgICAgICAgICB0bXAgKz0gUFVOQ1RVQVRJT05bY2hdOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTVUJNT0RFX0xPV0VSOgotICAgICAgICBpZiAoaXNBbHBoYUxvd2VyKGNoKSkgewotICAgICAgICAgIGlmIChjaCA9PSAnICcpIHsKLSAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpMjY7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpKGNoIC0gOTcpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoaXNBbHBoYVVwcGVyKGNoKSkgewotICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikyNzsKLSAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpKGNoIC0gNjUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSBlbHNlIGlmIChpc01peGVkKGNoKSkgewotICAgICAgICAgICAgc3VibW9kZSA9IFNVQk1PREVfTUlYRUQ7Ci0gICAgICAgICAgICB0bXAgKz0gKEZYX1dDSEFSKTI4OwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpMjk7Ci0gICAgICAgICAgICB0bXAgKz0gUFVOQ1RVQVRJT05bY2hdOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTVUJNT0RFX01JWEVEOgotICAgICAgICBpZiAoaXNNaXhlZChjaCkpIHsKLSAgICAgICAgICB0bXAgKz0gTUlYRURbY2hdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChpc0FscGhhVXBwZXIoY2gpKSB7Ci0gICAgICAgICAgICBzdWJtb2RlID0gU1VCTU9ERV9BTFBIQTsKLSAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpMjg7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGlzQWxwaGFMb3dlcihjaCkpIHsKLSAgICAgICAgICAgIHN1Ym1vZGUgPSBTVUJNT0RFX0xPV0VSOwotICAgICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikyNzsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoc3RhcnRwb3MgKyBpZHggKyAxIDwgY291bnQpIHsKLSAgICAgICAgICAgICAgRlhfV0NIQVIgbmV4dCA9IG1zZy5HZXRBdChzdGFydHBvcyArIGlkeCArIDEpOwotICAgICAgICAgICAgICBpZiAoaXNQdW5jdHVhdGlvbihuZXh0KSkgewotICAgICAgICAgICAgICAgIHN1Ym1vZGUgPSBTVUJNT0RFX1BVTkNUVUFUSU9OOwotICAgICAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpMjU7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRtcCArPSAoRlhfV0NIQVIpMjk7Ci0gICAgICAgICAgICB0bXAgKz0gUFVOQ1RVQVRJT05bY2hdOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmIChpc1B1bmN0dWF0aW9uKGNoKSkgewotICAgICAgICAgIHRtcCArPSBQVU5DVFVBVElPTltjaF07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3VibW9kZSA9IFNVQk1PREVfQUxQSEE7Ci0gICAgICAgICAgdG1wICs9IChGWF9XQ0hBUikyOTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZHgrKzsKLSAgICBpZiAoaWR4ID49IGNvdW50KSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgRlhfV0NIQVIgaCA9IDA7Ci0gIGludDMyX3QgbGVuID0gdG1wLkdldExlbmd0aCgpOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgIGJvb2wgb2RkID0gKGkgJSAyKSAhPSAwOwotICAgIGlmIChvZGQpIHsKLSAgICAgIGggPSAoRlhfV0NIQVIpKChoICogMzApICsgdG1wLkdldEF0KGkpKTsKLSAgICAgIHNiICs9IGg7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGggPSB0bXAuR2V0QXQoaSk7Ci0gICAgfQotICB9Ci0gIGlmICgobGVuICUgMikgIT0gMCkgewotICAgIHNiICs9IChGWF9XQ0hBUikoKGggKiAzMCkgKyAyOSk7Ci0gIH0KLSAgcmV0dXJuIHN1Ym1vZGU7Ci19Ci12b2lkIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVCaW5hcnkoQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdD4qIGJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0bW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc2IpIHsKLSAgaWYgKGNvdW50ID09IDEgJiYgc3RhcnRtb2RlID09IFRFWFRfQ09NUEFDVElPTikgewotICAgIHNiICs9IChGWF9XQ0hBUilTSElGVF9UT19CWVRFOwotICB9Ci0gIGludDMyX3QgaWR4ID0gc3RhcnRwb3M7Ci0gIGludDMyX3QgaSA9IDA7Ci0gIGlmIChjb3VudCA+PSA2KSB7Ci0gICAgc2IgKz0gKEZYX1dDSEFSKUxBVENIX1RPX0JZVEU7Ci0gICAgRlhfV0NIQVIgY2hhcnNbNV07Ci0gICAgd2hpbGUgKChzdGFydHBvcyArIGNvdW50IC0gaWR4KSA+PSA2KSB7Ci0gICAgICBpbnQ2NF90IHQgPSAwOwotICAgICAgZm9yIChpID0gMDsgaSA8IDY7IGkrKykgewotICAgICAgICB0IDw8PSA4OwotICAgICAgICB0ICs9IGJ5dGVzLT5HZXRBdChpZHggKyBpKSAmIDB4ZmY7Ci0gICAgICB9Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0gICAgICAgIGNoYXJzW2ldID0gKEZYX1dDSEFSKSh0ICUgOTAwKTsKLSAgICAgICAgdCAvPSA5MDA7Ci0gICAgICB9Ci0gICAgICBmb3IgKGkgPSA0OyBpID49IDA7IGktLSkgewotICAgICAgICBzYiArPSAoY2hhcnNbaV0pOwotICAgICAgfQotICAgICAgaWR4ICs9IDY7Ci0gICAgfQotICB9Ci0gIGlmIChpZHggPCBzdGFydHBvcyArIGNvdW50KSB7Ci0gICAgc2IgKz0gKEZYX1dDSEFSKUxBVENIX1RPX0JZVEVfUEFEREVEOwotICB9Ci0gIGZvciAoaSA9IGlkeDsgaSA8IHN0YXJ0cG9zICsgY291bnQ7IGkrKykgewotICAgIGludDMyX3QgY2ggPSBieXRlcy0+R2V0QXQoaSkgJiAweGZmOwotICAgIHNiICs9IChGWF9XQ0hBUiljaDsKLSAgfQotfQotdm9pZCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZW5jb2RlTnVtZXJpYyhDRlhfV2lkZVN0cmluZyBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzYikgewotICBpbnQzMl90IGlkeCA9IDA7Ci0gIEJpZ0ludGVnZXIgbnVtOTAwID0gOTAwOwotICB3aGlsZSAoaWR4IDwgY291bnQpIHsKLSAgICBDRlhfV2lkZVN0cmluZyB0bXA7Ci0gICAgaW50MzJfdCBsZW4gPSA0NCA8IGNvdW50IC0gaWR4ID8gNDQgOiBjb3VudCAtIGlkeDsKLSAgICBDRlhfQnl0ZVN0cmluZyBwYXJ0ID0KLSAgICAgICAgKChGWF9XQ0hBUiknMScgKyBtc2cuTWlkKHN0YXJ0cG9zICsgaWR4LCBsZW4pKS5VVEY4RW5jb2RlKCk7Ci0gICAgQmlnSW50ZWdlciBiaWdpbnQgPSBzdHJpbmdUb0JpZ0ludGVnZXIocGFydC5jX3N0cigpKTsKLSAgICBkbyB7Ci0gICAgICBpbnQzMl90IGMgPSAoYmlnaW50ICUgbnVtOTAwKS50b0ludCgpOwotICAgICAgdG1wICs9IChGWF9XQ0hBUikoYyk7Ci0gICAgICBiaWdpbnQgPSBiaWdpbnQgLyBudW05MDA7Ci0gICAgfSB3aGlsZSAoIWJpZ2ludC5pc1plcm8oKSk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSB0bXAuR2V0TGVuZ3RoKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgc2IgKz0gdG1wLkdldEF0KGkpOwotICAgIH0KLSAgICBpZHggKz0gbGVuOwotICB9Ci19Ci1ib29sIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjppc0RpZ2l0KEZYX1dDSEFSIGNoKSB7Ci0gIHJldHVybiBjaCA+PSAnMCcgJiYgY2ggPD0gJzknOwotfQotYm9vbCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6aXNBbHBoYVVwcGVyKEZYX1dDSEFSIGNoKSB7Ci0gIHJldHVybiBjaCA9PSAnICcgfHwgKGNoID49ICdBJyAmJiBjaCA8PSAnWicpOwotfQotYm9vbCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6aXNBbHBoYUxvd2VyKEZYX1dDSEFSIGNoKSB7Ci0gIHJldHVybiBjaCA9PSAnICcgfHwgKGNoID49ICdhJyAmJiBjaCA8PSAneicpOwotfQotYm9vbCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6aXNNaXhlZChGWF9XQ0hBUiBjaCkgewotICByZXR1cm4gTUlYRURbY2hdICE9IC0xOwotfQotYm9vbCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6aXNQdW5jdHVhdGlvbihGWF9XQ0hBUiBjaCkgewotICByZXR1cm4gUFVOQ1RVQVRJT05bY2hdICE9IC0xOwotfQotYm9vbCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6aXNUZXh0KEZYX1dDSEFSIGNoKSB7Ci0gIHJldHVybiBjaCA9PSAnXHQnIHx8IGNoID09ICdcbicgfHwgY2ggPT0gJ1xyJyB8fCAoY2ggPj0gMzIgJiYgY2ggPD0gMTI2KTsKLX0KLWludDMyX3QgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OmRldGVybWluZUNvbnNlY3V0aXZlRGlnaXRDb3VudCgKLSAgICBDRlhfV2lkZVN0cmluZyBtc2csCi0gICAgaW50MzJfdCBzdGFydHBvcykgewotICBpbnQzMl90IGNvdW50ID0gMDsKLSAgaW50MzJfdCBsZW4gPSBtc2cuR2V0TGVuZ3RoKCk7Ci0gIGludDMyX3QgaWR4ID0gc3RhcnRwb3M7Ci0gIGlmIChpZHggPCBsZW4pIHsKLSAgICBGWF9XQ0hBUiBjaCA9IG1zZy5HZXRBdChpZHgpOwotICAgIHdoaWxlIChpc0RpZ2l0KGNoKSAmJiBpZHggPCBsZW4pIHsKLSAgICAgIGNvdW50Kys7Ci0gICAgICBpZHgrKzsKLSAgICAgIGlmIChpZHggPCBsZW4pIHsKLSAgICAgICAgY2ggPSBtc2cuR2V0QXQoaWR4KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGNvdW50OwotfQotaW50MzJfdCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZGV0ZXJtaW5lQ29uc2VjdXRpdmVUZXh0Q291bnQoCi0gICAgQ0ZYX1dpZGVTdHJpbmcgbXNnLAotICAgIGludDMyX3Qgc3RhcnRwb3MpIHsKLSAgaW50MzJfdCBsZW4gPSBtc2cuR2V0TGVuZ3RoKCk7Ci0gIGludDMyX3QgaWR4ID0gc3RhcnRwb3M7Ci0gIHdoaWxlIChpZHggPCBsZW4pIHsKLSAgICBGWF9XQ0hBUiBjaCA9IG1zZy5HZXRBdChpZHgpOwotICAgIGludDMyX3QgbnVtZXJpY0NvdW50ID0gMDsKLSAgICB3aGlsZSAobnVtZXJpY0NvdW50IDwgMTMgJiYgaXNEaWdpdChjaCkgJiYgaWR4IDwgbGVuKSB7Ci0gICAgICBudW1lcmljQ291bnQrKzsKLSAgICAgIGlkeCsrOwotICAgICAgaWYgKGlkeCA8IGxlbikgewotICAgICAgICBjaCA9IG1zZy5HZXRBdChpZHgpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAobnVtZXJpY0NvdW50ID49IDEzKSB7Ci0gICAgICByZXR1cm4gaWR4IC0gc3RhcnRwb3MgLSBudW1lcmljQ291bnQ7Ci0gICAgfQotICAgIGlmIChudW1lcmljQ291bnQgPiAwKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgY2ggPSBtc2cuR2V0QXQoaWR4KTsKLSAgICBpZiAoIWlzVGV4dChjaCkpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZHgrKzsKLSAgfQotICByZXR1cm4gaWR4IC0gc3RhcnRwb3M7Ci19Ci1pbnQzMl90IENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpkZXRlcm1pbmVDb25zZWN1dGl2ZUJpbmFyeUNvdW50KAotICAgIENGWF9XaWRlU3RyaW5nIG1zZywKLSAgICBDRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90PiogYnl0ZXMsCi0gICAgaW50MzJfdCBzdGFydHBvcywKLSAgICBpbnQzMl90JiBlKSB7Ci0gIGludDMyX3QgbGVuID0gbXNnLkdldExlbmd0aCgpOwotICBpbnQzMl90IGlkeCA9IHN0YXJ0cG9zOwotICB3aGlsZSAoaWR4IDwgbGVuKSB7Ci0gICAgRlhfV0NIQVIgY2ggPSBtc2cuR2V0QXQoaWR4KTsKLSAgICBpbnQzMl90IG51bWVyaWNDb3VudCA9IDA7Ci0gICAgd2hpbGUgKG51bWVyaWNDb3VudCA8IDEzICYmIGlzRGlnaXQoY2gpKSB7Ci0gICAgICBudW1lcmljQ291bnQrKzsKLSAgICAgIGludDMyX3QgaSA9IGlkeCArIG51bWVyaWNDb3VudDsKLSAgICAgIGlmIChpID49IGxlbikgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNoID0gbXNnLkdldEF0KGkpOwotICAgIH0KLSAgICBpZiAobnVtZXJpY0NvdW50ID49IDEzKSB7Ci0gICAgICByZXR1cm4gaWR4IC0gc3RhcnRwb3M7Ci0gICAgfQotICAgIGludDMyX3QgdGV4dENvdW50ID0gMDsKLSAgICB3aGlsZSAodGV4dENvdW50IDwgNSAmJiBpc1RleHQoY2gpKSB7Ci0gICAgICB0ZXh0Q291bnQrKzsKLSAgICAgIGludDMyX3QgaSA9IGlkeCArIHRleHRDb3VudDsKLSAgICAgIGlmIChpID49IGxlbikgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNoID0gbXNnLkdldEF0KGkpOwotICAgIH0KLSAgICBpZiAodGV4dENvdW50ID49IDUpIHsKLSAgICAgIHJldHVybiBpZHggLSBzdGFydHBvczsKLSAgICB9Ci0gICAgY2ggPSBtc2cuR2V0QXQoaWR4KTsKLSAgICBpZiAoYnl0ZXMtPkdldEF0KGlkeCkgPT0gNjMgJiYgY2ggIT0gJz8nKSB7Ci0gICAgICBlID0gQkNFeGNlcHRpb25Ob25FbmNvZGFibGVDaGFyYWN0ZXJEZXRlY3RlZDsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaWR4Kys7Ci0gIH0KLSAgcmV0dXJuIGlkeCAtIHN0YXJ0cG9zOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5oIGIveGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODM4MmM4Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhCQVJDT0RFX1BERjQxN19CQ19QREY0MTdISUdITEVWRUxFTkNPREVSX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfUERGNDE3X0JDX1BERjQxN0hJR0hMRVZFTEVOQ09ERVJfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0NvbXBhY3Rpb24uaCIKLQotY2xhc3MgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXIgewotIHB1YmxpYzoKLSAgc3RhdGljIENGWF9XaWRlU3RyaW5nIGVuY29kZUhpZ2hMZXZlbChDRlhfV2lkZVN0cmluZyBtc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGFjdGlvbiBjb21wYWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotICBzdGF0aWMgdm9pZCBJbnZlcnNlKCk7Ci0gIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsKLSAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsKLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBpbnQzMl90IFRFWFRfQ09NUEFDVElPTjsKLSAgc3RhdGljIGludDMyX3QgQllURV9DT01QQUNUSU9OOwotICBzdGF0aWMgaW50MzJfdCBOVU1FUklDX0NPTVBBQ1RJT047Ci0gIHN0YXRpYyBpbnQzMl90IFNVQk1PREVfUFVOQ1RVQVRJT047Ci0gIHN0YXRpYyBpbnQzMl90IExBVENIX1RPX1RFWFQ7Ci0gIHN0YXRpYyBpbnQzMl90IExBVENIX1RPX0JZVEVfUEFEREVEOwotICBzdGF0aWMgaW50MzJfdCBMQVRDSF9UT19OVU1FUklDOwotICBzdGF0aWMgaW50MzJfdCBTSElGVF9UT19CWVRFOwotICBzdGF0aWMgaW50MzJfdCBMQVRDSF9UT19CWVRFOwotICBzdGF0aWMgdWludDhfdCBURVhUX01JWEVEX1JBV1tdOwotICBzdGF0aWMgdWludDhfdCBURVhUX1BVTkNUVUFUSU9OX1JBV1tdOwotICBzdGF0aWMgaW50MzJfdCBNSVhFRFsxMjhdOwotICBzdGF0aWMgaW50MzJfdCBQVU5DVFVBVElPTlsxMjhdOwotICBzdGF0aWMgaW50MzJfdCBlbmNvZGVUZXh0KENGWF9XaWRlU3RyaW5nIG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0cG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHNiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5pdGlhbFN1Ym1vZGUpOwotICBzdGF0aWMgdm9pZCBlbmNvZGVCaW5hcnkoQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdD4qIGJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydHBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXJ0bW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiBzYik7Ci0gIHN0YXRpYyB2b2lkIGVuY29kZU51bWVyaWMoQ0ZYX1dpZGVTdHJpbmcgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RhcnRwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgc2IpOwotICBzdGF0aWMgYm9vbCBpc0RpZ2l0KEZYX1dDSEFSIGNoKTsKLSAgc3RhdGljIGJvb2wgaXNBbHBoYVVwcGVyKEZYX1dDSEFSIGNoKTsKLSAgc3RhdGljIGJvb2wgaXNBbHBoYUxvd2VyKEZYX1dDSEFSIGNoKTsKLSAgc3RhdGljIGJvb2wgaXNNaXhlZChGWF9XQ0hBUiBjaCk7Ci0gIHN0YXRpYyBib29sIGlzUHVuY3R1YXRpb24oRlhfV0NIQVIgY2gpOwotICBzdGF0aWMgYm9vbCBpc1RleHQoRlhfV0NIQVIgY2gpOwotICBzdGF0aWMgaW50MzJfdCBkZXRlcm1pbmVDb25zZWN1dGl2ZURpZ2l0Q291bnQoQ0ZYX1dpZGVTdHJpbmcgbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydHBvcyk7Ci0gIHN0YXRpYyBpbnQzMl90IGRldGVybWluZUNvbnNlY3V0aXZlVGV4dENvdW50KENGWF9XaWRlU3RyaW5nIG1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFydHBvcyk7Ci0gIHN0YXRpYyBpbnQzMl90IGRldGVybWluZUNvbnNlY3V0aXZlQmluYXJ5Q291bnQoCi0gICAgICBDRlhfV2lkZVN0cmluZyBtc2csCi0gICAgICBDRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90PiogYnl0ZXMsCi0gICAgICBpbnQzMl90IHN0YXJ0cG9zLAotICAgICAgaW50MzJfdCYgZSk7Ci0KLSAgZnJpZW5kIGNsYXNzIFBERjQxN0hpZ2hMZXZlbEVuY29kZXJfRW5jb2RlTnVtZXJpY19UZXN0OwotICBmcmllbmQgY2xhc3MgUERGNDE3SGlnaExldmVsRW5jb2Rlcl9FbmNvZGVCaW5hcnlfVGVzdDsKLSAgZnJpZW5kIGNsYXNzIFBERjQxN0hpZ2hMZXZlbEVuY29kZXJfRW5jb2RlVGV4dF9UZXN0OwotICBmcmllbmQgY2xhc3MgUERGNDE3SGlnaExldmVsRW5jb2Rlcl9Db25zZWN1dGl2ZURpZ2l0Q291bnRfVGVzdDsKLSAgZnJpZW5kIGNsYXNzIFBERjQxN0hpZ2hMZXZlbEVuY29kZXJfQ29uc2VjdXRpdmVUZXh0Q291bnRfVGVzdDsKLSAgZnJpZW5kIGNsYXNzIFBERjQxN0hpZ2hMZXZlbEVuY29kZXJfQ29uc2VjdXRpdmVCaW5hcnlDb3VudF9UZXN0OwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhCQVJDT0RFX1BERjQxN19CQ19QREY0MTdISUdITEVWRUxFTkNPREVSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyX3VuaXR0ZXN0LmNwcCBiL3hmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXJfdW5pdHRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2Q2MGZlLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXJfdW5pdHRlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjMxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2Z4X3N0cmluZ190ZXN0aGVscGVycy5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXIuaCIKLQotVEVTVChQREY0MTdIaWdoTGV2ZWxFbmNvZGVyLCBFbmNvZGVIaWdoTGV2ZWwpIHsKLSAgLy8gVE9ETyh0c2VwZXopOiBpbXBsZW1lbnQgdGVzdCBjYXNlcy4KLX0KLQotVEVTVChQREY0MTdIaWdoTGV2ZWxFbmNvZGVyLCBFbmNvZGVUZXh0KSB7Ci0gIC8vIFRPRE8odHNlcGV6KTogaW1wbGVtZW50IHRlc3QgY2FzZXMuCi19Ci0KLVRFU1QoUERGNDE3SGlnaExldmVsRW5jb2RlciwgRW5jb2RlQmluYXJ5KSB7Ci0gIHN0cnVjdCBFbmNvZGVCaW5hcnlDYXNlIHsKLSAgICBjb25zdCBjaGFyKiBpbnB1dDsKLSAgICBpbnQgb2Zmc2V0OwotICAgIGludCBjb3VudDsKLSAgICBpbnQgc3RhcnRtb2RlOwotICAgIGNvbnN0IHdjaGFyX3QqIGV4cGVjdGVkOwotICAgIGludCBleHBlY3RlZF9sZW5ndGg7Ci0gIH0gZW5jb2RlX2JpbmFyeV9jYXNlc1tdID0gewotICAgICAgLy8gRW1wdHkgc3RyaW5nIGVuY29kZXMgYXMgZW1wdHkgc3RyaW5nLgotICAgICAgeyIiLCAwLCAwLCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6VEVYVF9DT01QQUNUSU9OLCBMIiIsIDB9LAotCi0gICAgICAvLyBGZXdlciB0aGFuIDYgY2hhcmFjdGVycyBlbmNvZGVzIGFzIHByZWZpeCB3aXRob3V0IGNvbXBhY3Rpb24uCi0gICAgICB7Inh4eHh4IiwgMCwgNSwgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OlRFWFRfQ09NUEFDVElPTiwKLSAgICAgICBMIlx4MDM4NXh4eHh4IiwgNn0sCi0KLSAgICAgIC8vIDYgY2hhcmN0ZXJzIHRyaWdnZXJzdCB0ZXh0IGVuY29kaW5nIGNvbXBhY3Rpb24uCi0gICAgICB7Inh4eHh4eCIsIDAsIDYsIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpURVhUX0NPTVBBQ1RJT04sCi0gICAgICAgTCJcdTAzOWNcdTAwYzlcdTAzMWZcdTAxMmFcdTAwZDJcdTAyZDAiLCA2fSwKLQotICAgICAgLy8gU2FtZSByZXN1bHQgaWYgaW5pdGlhbGx5IGluIG51bWVyaWMgY29tcGFjdGlvbiBtb2RlLgotICAgICAgeyJ4eHh4eHgiLCAwLCA2LCBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6TlVNRVJJQ19DT01QQUNUSU9OLAotICAgICAgIEwiXHUwMzljXHUwMGM5XHUwMzFmXHUwMTJhXHUwMGQyXHUwMmQwIiwgNn0sCi0gIH07Ci0KLSAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkluaXRpYWxpemUoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoZW5jb2RlX2JpbmFyeV9jYXNlcyk7ICsraSkgewotICAgIEVuY29kZUJpbmFyeUNhc2UqIHB0ciA9ICZlbmNvZGVfYmluYXJ5X2Nhc2VzW2ldOwotICAgIENGWF9BcnJheVRlbXBsYXRlPHVpbnQ4X3Q+IGlucHV0X2FycmF5OwotICAgIHNpemVfdCBpbnB1dF9sZW5ndGggPSBzdHJsZW4ocHRyLT5pbnB1dCk7Ci0gICAgaW5wdXRfYXJyYXkuU2V0U2l6ZShpbnB1dF9sZW5ndGgpOwotICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5wdXRfbGVuZ3RoOyArK2opIHsKLSAgICAgIGlucHV0X2FycmF5LlNldEF0KGosIHB0ci0+aW5wdXRbal0pOwotICAgIH0KLSAgICBDRlhfV2lkZVN0cmluZyBleHBlY3RlZChwdHItPmV4cGVjdGVkLCBwdHItPmV4cGVjdGVkX2xlbmd0aCk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0OwotICAgIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjplbmNvZGVCaW5hcnkoCi0gICAgICAgICZpbnB1dF9hcnJheSwgcHRyLT5vZmZzZXQsIHB0ci0+Y291bnQsIHB0ci0+c3RhcnRtb2RlLCByZXN1bHQpOwotICAgIEVYUEVDVF9FUShleHBlY3RlZCwgcmVzdWx0KSA8PCAiIGZvciBjYXNlIG51bWJlciAiIDw8IGk7Ci0gIH0KLSAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkZpbmFsaXplKCk7Ci19Ci0KLVRFU1QoUERGNDE3SGlnaExldmVsRW5jb2RlciwgRW5jb2RlTnVtZXJpYykgewotICBzdHJ1Y3QgRW5jb2RlTnVtZXJpY0Nhc2UgewotICAgIGNvbnN0IHdjaGFyX3QqIGlucHV0OwotICAgIGludCBvZmZzZXQ7Ci0gICAgaW50IGNvdW50OwotICAgIGNvbnN0IHdjaGFyX3QqIGV4cGVjdGVkOwotICAgIGludCBleHBlY3RlZF9sZW5ndGg7Ci0gIH0gZW5jb2RlX251bWVyaWNfY2FzZXNbXSA9IHsKLSAgICAgIC8vIEVtcHR5IHN0cmluZyBlbmNvZGVzIGFzIGVtcHR5IHN0cmluZy4KLSAgICAgIHtMIiIsIDAsIDAsIEwiIiwgMH0sCi0KLSAgICAgIC8vIFNpbmdsZSAwIHNob3VsZCBlbmNvZGUgYXMgMTAgYmFzZS05MDAgPT0gYS4KLSAgICAgIHtMIjAiLCAwLCAxLCBMIlx4MDAwYSIsIDF9LAotCi0gICAgICAvLyA4MDAgc2hvdWxkIGVuY29kZSBhcyAxODAwIGJhc2UtOTAwID09IDIsMC4KLSAgICAgIHtMIjgwMCIsIDAsIDMsIEwiXHgwMDAyXHgwMDAwIiwgMn0sCi0KLSAgICAgIC8vIFRlc3QgbG9uZ2VyIHN0cmluZ3MgYW5kIHN1Yi1zdHJpbmdzLgotICAgICAge0wiMTIzNDU2IiwgMCwgNiwgTCJceDAwMDFceDAxNWNceDAxMDAiLCAzfSwKLSAgICAgIHtMIjEyMzQ1NiIsIDAsIDUsIEwiXHgwMDdjXHgwMmU5IiwgMn0sCi0gICAgICB7TCIxMjM0NTYiLCAxLCA1LCBMIlx4MDA4OVx4MDA5YyIsIDJ9LAotICAgICAge0wiMTIzNDU2IiwgMiwgMiwgTCJceDAwODYiLCAxfSwKLQotICAgICAgLy8gVXAgdG8gNDQgY2hhcmFjdGVycyBlbmNvZGVzIGFzIDE1IGJhc2UtOTAwIHdvcmRzLgotICAgICAge0wiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCAwLCA0NCwKLSAgICAgICBMIlx4MDFiNVx4MDA2Zlx4MDJjY1x4MDA4NFx4MDFiY1x4MDA3Nlx4MDBiM1x4MDA1Y1x4MDFmMFx4MDM0Zlx4MDFlNiIKLSAgICAgICBMIlx4MDA5MFx4MDIwYlx4MDE5Ylx4MDA2NCIsCi0gICAgICAgMTV9LAotCi0gICAgICAvLyA0NSBjaGFyYWN0ZXJzIHNob3VsZCBlbmNvZGUgYXMgc2FtZSAxNSB3b3JkcyBmb2xsb3dlZCBieSBvbmUgYWRkaXRpb25hbAotICAgICAgLy8gd29yZC4KLSAgICAgIHtMIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIsIDAsIDQ1LAotICAgICAgIEwiXHgwMWI1XHgwMDZmXHgwMmNjXHgwMDg0XHgwMWJjXHgwMDc2XHgwMGIzXHgwMDVjXHgwMWYwXHgwMzRmXHgwMWU2IgotICAgICAgIEwiXHgwMDkwXHgwMjBiXHgwMTliXHgwMDY0XHgwMDBhIiwKLSAgICAgICAxNn0sCi0KLSAgICAgIC8vIDQ0IGNoYXJhY3RlcnMgZm9sbG93ZWQgYnkgODAwIHNob3VsZCBlbmNvZGUgYXMgMTUgd29yZHMgZm9sbG93ZWQgYnkKLSAgICAgIC8vIDE4MDAgYmFzZS05MDAgPT0gMiwwLgotICAgICAge0wiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MDAiLCAwLCA0NywKLSAgICAgICBMIlx4MDFiNVx4MDA2Zlx4MDJjY1x4MDA4NFx4MDFiY1x4MDA3Nlx4MDBiM1x4MDA1Y1x4MDFmMFx4MDM0Zlx4MDFlNiIKLSAgICAgICBMIlx4MDA5MFx4MDIwYlx4MDE5Ylx4MDA2NFx4MDAwMlx4MDAwMCIsCi0gICAgICAgMTd9LAotCi0gICAgICAvLyBFdmVuIGxvbmdlciBpbnB1dC4KLSAgICAgIHtMIjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwgMCwgNTAsCi0gICAgICAgTCJceDAxZTBceDAyZjBceDAzNmRceDAyYWRceDAyOWNceDAxZWFceDAwMTFceDAwMGJceDAyZDZceDAyM2NceDAxMDgiCi0gICAgICAgTCJceDAyYmJceDAwMjNceDAyZDJceDAwYzhceDAwMDFceDAwZDNceDAwNjQiLAotICAgICAgIDE4fSwKLSAgfTsKLQotICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6SW5pdGlhbGl6ZSgpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShlbmNvZGVfbnVtZXJpY19jYXNlcyk7ICsraSkgewotICAgIEVuY29kZU51bWVyaWNDYXNlKiBwdHIgPSAmZW5jb2RlX251bWVyaWNfY2FzZXNbaV07Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgaW5wdXQocHRyLT5pbnB1dCk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgZXhwZWN0ZWQocHRyLT5leHBlY3RlZCwgcHRyLT5leHBlY3RlZF9sZW5ndGgpOwotICAgIENGWF9XaWRlU3RyaW5nIHJlc3VsdDsKLSAgICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZW5jb2RlTnVtZXJpYyhpbnB1dCwgcHRyLT5vZmZzZXQsIHB0ci0+Y291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKLSAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIHJlc3VsdCkgPDwgIiBmb3IgY2FzZSBudW1iZXIgIiA8PCBpOwotICB9Ci0gIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpGaW5hbGl6ZSgpOwotfQotCi1URVNUKFBERjQxN0hpZ2hMZXZlbEVuY29kZXIsIENvbnNlY3V0aXZlRGlnaXRDb3VudCkgewotICBzdHJ1Y3QgQ29uc2VjdXRpdmVEaWdpdENhc2UgewotICAgIGNvbnN0IHdjaGFyX3QqIGlucHV0OwotICAgIGludCBvZmZzZXQ7Ci0gICAgaW50IGV4cGVjdGVkX2NvdW50OwotICB9IGNvbnNlY3V0aXZlX2RpZ2l0X2Nhc2VzW10gPSB7Ci0gICAgICAvLyBFbXB0eSBzdHJpbmcgY29udGFpbnMgMCBjb25zZWN1aXR2ZSBkaWdpdHMuCi0gICAgICB7TCIiLCAwLCAwfSwKLQotICAgICAgLy8gU2luZ2xlIG5vbi1kaWdpdCBjaGFyYWN0ZXIgY29udGFpbnMgMCBjb25zZWN1dGl2ZSBkaWdpdHMuCi0gICAgICB7TCJYIiwgMCwgMH0sCi0KLSAgICAgIC8vIExlYWRpbmcgbm9uLWRpZ2l0IGZvbGxvd2VkIGJ5IGRpZ2l0cyBjb250YWlucyAwIGNvbnNlY3V0aXZlLgotICAgICAge0wiWDEyMyIsIDAsIDB9LAotCi0gICAgICAvLyBTaW5nbGUgZGlnaXQgY29udGFpbnMgMSBjb25zZWN1dGl2ZSBkaWdpdC4KLSAgICAgIHtMIjEiLCAwLCAxfSwKLQotICAgICAgLy8gU2luZ2xlIGRpZ2l0IGZvbGxvd2UgYnkgbm9uLWRpZ2l0IGNvbnRhaW5zIDEgY29uc2VjdXRpdmUgZGlnaXQuCi0gICAgICB7TCIxWiIsIDAsIDF9LAotCi0gICAgICAvLyBUZXN0IGxvbmdlciBzdHJpbmdzLgotICAgICAge0wiMTIzRk9PNDU2NzgiLCAwLCAzfSwKLQotICAgICAgLy8gVGVzdCBzdWJ0cmluZyBzdGFydGluZyBpbiBkaWdpdHMgZmllbGQuCi0gICAgICB7TCIxMjNGT080NTY3OCIsIDMsIDB9LAotCi0gICAgICAvLyBUZXN0IHN1YnRyaW5nIHN0YXJ0aW5nIGluIG5vbi1kaWdpdHMgZmllbGQuCi0gICAgICB7TCIxMjNGT080NTY3OCIsIDMsIDB9LAotCi0gICAgICAvLyBUZXN0IHN1YnN0cmluZyBzdGFydGluZyBpbiBkaWdpdHMgZmllbGQgZm9sbG93aW5nIG5vbi1kaWdpdCBmaWVsZC4KLSAgICAgIHtMIjEyM0ZPTzQ1Njc4IiwgNiwgNX0sCi0gIH07Ci0KLSAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkluaXRpYWxpemUoKTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBGWF9BcnJheVNpemUoY29uc2VjdXRpdmVfZGlnaXRfY2FzZXMpOyArK2kpIHsKLSAgICBDb25zZWN1dGl2ZURpZ2l0Q2FzZSogcHRyID0gJmNvbnNlY3V0aXZlX2RpZ2l0X2Nhc2VzW2ldOwotICAgIENGWF9XaWRlU3RyaW5nIGlucHV0KHB0ci0+aW5wdXQpOwotICAgIGludCBhY3R1YWxfY291bnQgPQotICAgICAgICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6ZGV0ZXJtaW5lQ29uc2VjdXRpdmVEaWdpdENvdW50KGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0+b2Zmc2V0KTsKLSAgICBFWFBFQ1RfRVEocHRyLT5leHBlY3RlZF9jb3VudCwgYWN0dWFsX2NvdW50KSA8PCAiIGZvciBjYXNlIG51bWJlciAiIDw8IGk7Ci0gIH0KLSAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkZpbmFsaXplKCk7Ci19Ci0KLVRFU1QoUERGNDE3SGlnaExldmVsRW5jb2RlciwgQ29uc2VjdXRpdmVUZXh0Q291bnQpIHsKLSAgc3RydWN0IENvbnNlY3V0aXZlVGV4dENhc2UgewotICAgIGNvbnN0IHdjaGFyX3QqIGlucHV0OwotICAgIGludCBvZmZzZXQ7Ci0gICAgaW50IGV4cGVjdGVkX2NvdW50OwotICB9IGNvbnNlY3V0aXZlX3RleHRfY2FzZXNbXSA9IHsKLSAgICAgIC8vIEVtcHR5IHN0cmluZyBjb250YWlucyAwIGNvbnNlY3V0aXZlIHRleHQgY2hhcmFjdGVycy4KLSAgICAgIHtMIiIsIDAsIDB9LAotCi0gICAgICAvLyBTaW5nbGUgdGV4dCBjaGFyYWN0ZXIgaXMgMSBjb25zZWN1dGl2ZSB0ZXh0IGNoYXJhY3RlcnMuCi0gICAgICB7TCJYIiwgMCwgMX0sCi0KLSAgICAgIC8vIFRyYWlsaW5nIG51bWJlcnMgY291bnQgYXMgdGV4dCBjaGFyYWN0ZXJzLgotICAgICAge0wiWDEyMyIsIDAsIDR9LAotCi0gICAgICAvLyBMZWFkaW5nIG51bWJlcnMgY291bnQgYXMgdGV4dCBjaGFyYWN0ZXJzLgotICAgICAge0wiMTIzWCIsIDAsIDR9LAotCi0gICAgICAvLyBFbWJlZGRlZCBsby12YWx1ZSBiaW5hcnkgY2hhcmFjdGVycyB0ZXJtaW5hdGUgdGV4dCBydW5zLgotICAgICAge0wiQUJDXHgwMDAxWFhYWCIsIDAsIDN9LAotCi0gICAgICAvLyBFbWJlZGRlZCBoaS12YWx1ZSBiaW5hcnkgY2hhcmFjdGVycyB0ZXJtaW5hdGUgdGV4dCBydW5zLgotICAgICAge0wiQUJDXHgwMTAwWFhYWCIsIDAsIDN9LAotCi0gICAgICAvLyBUZXh0IHJ1biBzdGlsbCBmb3VuZCBhZnRlciBpbmRleGluZyBwYXN0IGxvLXZhbHVlIGNoYXJhY3Rlci4KLSAgICAgIHtMIkFCQ1x4MDAwMVhYWFgiLCA0LCA0fSwKLQotICAgICAgLy8gVGV4dCBydW4gc3RpbGwgZm91bmQgYWZ0ZXIgaW5kZXhpbmcgcGFzdCBoaS12YWx1ZSBjaGFyYWN0ZXIuCi0gICAgICB7TCJBQkNceDAxMDBYWFhYIiwgNCwgNH0sCi0KLSAgICAgIC8vIExlYWRpbmcgaGktdmFsdWUgY2hhcmFjdGVyIHJlc3VsdHMgaW4gMCBjb25zZWN1dGl2ZSBjaGFyYWN0ZXJzLgotICAgICAge0wiXHgwMTAwWFhYIiwgMCwgMH0sCi0KLSAgICAgIC8vIFVwIHRvIDEyIG51bWJlcnMgY291bnQgYXMgdGV4dC4KLSAgICAgIHtMIjEyMzQ1Njc4OTAxMiIsIDAsIDEyfSwKLQotICAgICAgLy8gMTMgb3IgbW9yZSBudW1iZXJzIGFyZSBjb21wcmVzc3NlZCB1c2luZyBudW1lcmljIGNvbXByZXNzaW9uLCBub3QgdGV4dC4KLSAgICAgIHtMIjEyMzQ1Njc4OTAxMjMiLCAwLCAwfSwKLQotICAgICAgLy8gTGVhZGluZyBUZXh0IGNoYXJhY3RlciBkb2Vzbid0IGFmZmVjdCB0aGUgMTIgY2hhcmFjdGVyIGNhc2UuCi0gICAgICB7TCJYMTIzNDU2Nzg5MDEyIiwgMCwgMTN9LAotCi0gICAgICAvLyBMZWFkaW5nIFRleHQgY2hhcmFjdGVyIGRvZXNuJ3QgYWZmZWN0IHRoZSAxMyBjaGFyYWN0ZXIgY2FzZS4KLSAgICAgIHtMIlgxMjM0NTY3ODkwMTIzIiwgMCwgMX0sCi0KLSAgICAgIC8vIEp1bXBpbmcgYmV0d2VlbiBudW1iZXJzIGFuZCBsZXR0ZXJzIHdvcmtzIHByb3Blcmx5LgotICAgICAge0wiWFhYMTIxWFhYMTIzNDU2Nzg5MDEyMzQiLCAwLCA5fSwKLSAgfTsKLQotICBDQkNfUERGNDE3SGlnaExldmVsRW5jb2Rlcjo6SW5pdGlhbGl6ZSgpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEZYX0FycmF5U2l6ZShjb25zZWN1dGl2ZV90ZXh0X2Nhc2VzKTsgKytpKSB7Ci0gICAgQ29uc2VjdXRpdmVUZXh0Q2FzZSogcHRyID0gJmNvbnNlY3V0aXZlX3RleHRfY2FzZXNbaV07Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgaW5wdXQocHRyLT5pbnB1dCk7Ci0gICAgaW50IGFjdHVhbF9jb3VudCA9Ci0gICAgICAgIENCQ19QREY0MTdIaWdoTGV2ZWxFbmNvZGVyOjpkZXRlcm1pbmVDb25zZWN1dGl2ZVRleHRDb3VudChpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ci0+b2Zmc2V0KTsKLSAgICBFWFBFQ1RfRVEocHRyLT5leHBlY3RlZF9jb3VudCwgYWN0dWFsX2NvdW50KSA8PCAiIGZvciBjYXNlIG51bWJlciAiIDw8IGk7Ci0gIH0KLSAgQ0JDX1BERjQxN0hpZ2hMZXZlbEVuY29kZXI6OkZpbmFsaXplKCk7Ci19Ci0KLVRFU1QoUERGNDE3SGlnaExldmVsRW5jb2RlciwgQ29uc2VjdXRpdmVCaW5hcnlDb3VudCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1dyaXRlci5jcHAgYi94ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdXcml0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzc1YTE0Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1dyaXRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgotLyoKLSAqIENvcHlyaWdodCAyMDEyIFpYaW5nIGF1dGhvcnMKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvQkNfVHdvRGltV3JpdGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQml0QXJyYXkuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTcuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3BkZjQxNy9CQ19QREY0MTdCYXJjb2RlTWF0cml4LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3Q29tcGFjdGlvbi5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1dyaXRlci5oIgotCi1DQkNfUERGNDE3V3JpdGVyOjpDQkNfUERGNDE3V3JpdGVyKCkgewotICBtX2JGaXhlZFNpemUgPSBmYWxzZTsKLX0KLUNCQ19QREY0MTdXcml0ZXI6On5DQkNfUERGNDE3V3JpdGVyKCkgewotICBtX2JUcnVuY2F0ZWQgPSB0cnVlOwotfQotYm9vbCBDQkNfUERGNDE3V3JpdGVyOjpTZXRFcnJvckNvcnJlY3Rpb25MZXZlbChpbnQzMl90IGxldmVsKSB7Ci0gIGlmIChsZXZlbCA8IDAgfHwgbGV2ZWwgPiA4KSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIG1faUNvcnJlY3RMZXZlbCA9IGxldmVsOwotICByZXR1cm4gdHJ1ZTsKLX0KLXZvaWQgQ0JDX1BERjQxN1dyaXRlcjo6U2V0VHJ1bmNhdGVkKGJvb2wgdHJ1bmNhdGVkKSB7Ci0gIG1fYlRydW5jYXRlZCA9IHRydW5jYXRlZDsKLX0KLXVpbnQ4X3QqIENCQ19QREY0MTdXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgQ0JDX1BERjQxNyBlbmNvZGVyOwotICBpbnQzMl90IGNvbCA9IChtX1dpZHRoIC8gbV9Nb2R1bGVXaWR0aCAtIDY5KSAvIDE3OwotICBpbnQzMl90IHJvdyA9IG1fSGVpZ2h0IC8gKG1fTW9kdWxlV2lkdGggKiAyMCk7Ci0gIGlmIChyb3cgPj0gMyAmJiByb3cgPD0gOTAgJiYgY29sID49IDEgJiYgY29sIDw9IDMwKSB7Ci0gICAgZW5jb2Rlci5zZXREaW1lbnNpb25zKGNvbCwgY29sLCByb3csIHJvdyk7Ci0gIH0gZWxzZSBpZiAoY29sID49IDEgJiYgY29sIDw9IDMwKSB7Ci0gICAgZW5jb2Rlci5zZXREaW1lbnNpb25zKGNvbCwgY29sLCA5MCwgMyk7Ci0gIH0gZWxzZSBpZiAocm93ID49IDMgJiYgcm93IDw9IDkwKSB7Ci0gICAgZW5jb2Rlci5zZXREaW1lbnNpb25zKDMwLCAxLCByb3csIHJvdyk7Ci0gIH0KLSAgZW5jb2Rlci5nZW5lcmF0ZUJhcmNvZGVMb2dpYyhjb250ZW50cywgbV9pQ29ycmVjdExldmVsLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgaW50MzJfdCBsaW5lVGhpY2tuZXNzID0gMjsKLSAgaW50MzJfdCBhc3BlY3RSYXRpbyA9IDQ7Ci0gIENCQ19CYXJjb2RlTWF0cml4KiBiYXJjb2RlTWF0cml4ID0gZW5jb2Rlci5nZXRCYXJjb2RlTWF0cml4KCk7Ci0gIENGWF9BcnJheVRlbXBsYXRlPHVpbnQ4X3Q+IG9yaWdpbmFsU2NhbGU7Ci0gIG9yaWdpbmFsU2NhbGUuQ29weShiYXJjb2RlTWF0cml4LT5nZXRTY2FsZWRNYXRyaXgoCi0gICAgICBsaW5lVGhpY2tuZXNzLCBhc3BlY3RSYXRpbyAqIGxpbmVUaGlja25lc3MpKTsKLSAgaW50MzJfdCB3aWR0aCA9IG91dFdpZHRoOwotICBpbnQzMl90IGhlaWdodCA9IG91dEhlaWdodDsKLSAgb3V0V2lkdGggPSBiYXJjb2RlTWF0cml4LT5nZXRXaWR0aCgpOwotICBvdXRIZWlnaHQgPSBiYXJjb2RlTWF0cml4LT5nZXRIZWlnaHQoKTsKLSAgYm9vbCByb3RhdGVkID0gZmFsc2U7Ci0gIGlmICgoaGVpZ2h0ID4gd2lkdGgpIF4gKG91dFdpZHRoIDwgb3V0SGVpZ2h0KSkgewotICAgIHJvdGF0ZUFycmF5KG9yaWdpbmFsU2NhbGUsIG91dEhlaWdodCwgb3V0V2lkdGgpOwotICAgIHJvdGF0ZWQgPSB0cnVlOwotICAgIGludDMyX3QgdGVtcCA9IG91dEhlaWdodDsKLSAgICBvdXRIZWlnaHQgPSBvdXRXaWR0aDsKLSAgICBvdXRXaWR0aCA9IHRlbXA7Ci0gIH0KLSAgaW50MzJfdCBzY2FsZVggPSB3aWR0aCAvIG91dFdpZHRoOwotICBpbnQzMl90IHNjYWxlWSA9IGhlaWdodCAvIG91dEhlaWdodDsKLSAgaW50MzJfdCBzY2FsZTsKLSAgaWYgKHNjYWxlWCA8IHNjYWxlWSkgewotICAgIHNjYWxlID0gc2NhbGVYOwotICB9IGVsc2UgewotICAgIHNjYWxlID0gc2NhbGVZOwotICB9Ci0gIGlmIChzY2FsZSA+IDEpIHsKLSAgICBvcmlnaW5hbFNjYWxlLlJlbW92ZUFsbCgpOwotICAgIG9yaWdpbmFsU2NhbGUuQ29weShiYXJjb2RlTWF0cml4LT5nZXRTY2FsZWRNYXRyaXgoCi0gICAgICAgIHNjYWxlICogbGluZVRoaWNrbmVzcywgc2NhbGUgKiBhc3BlY3RSYXRpbyAqIGxpbmVUaGlja25lc3MpKTsKLSAgICBpZiAocm90YXRlZCkgewotICAgICAgcm90YXRlQXJyYXkob3JpZ2luYWxTY2FsZSwgb3V0SGVpZ2h0LCBvdXRXaWR0aCk7Ci0gICAgICBpbnQzMl90IHRlbXAgPSBvdXRIZWlnaHQ7Ci0gICAgICBvdXRIZWlnaHQgPSBvdXRXaWR0aDsKLSAgICAgIG91dFdpZHRoID0gdGVtcDsKLSAgICB9Ci0gIH0KLSAgdWludDhfdCogcmVzdWx0ID0gRlhfQWxsb2MyRCh1aW50OF90LCBvdXRIZWlnaHQsIG91dFdpZHRoKTsKLSAgRlhTWVNfbWVtY3B5KHJlc3VsdCwgb3JpZ2luYWxTY2FsZS5HZXREYXRhKCksIG91dEhlaWdodCAqIG91dFdpZHRoKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLXZvaWQgQ0JDX1BERjQxN1dyaXRlcjo6cm90YXRlQXJyYXkoQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdD4mIGJpdGFycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCkgewotICBDRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90PiB0ZW1wOwotICB0ZW1wLkNvcHkoYml0YXJyYXkpOwotICBmb3IgKGludDMyX3QgaWkgPSAwOyBpaSA8IGhlaWdodDsgaWkrKykgewotICAgIGludDMyX3QgaW52ZXJzZWlpID0gaGVpZ2h0IC0gaWkgLSAxOwotICAgIGZvciAoaW50MzJfdCBqaiA9IDA7IGpqIDwgd2lkdGg7IGpqKyspIHsKLSAgICAgIGJpdGFycmF5W2pqICogaGVpZ2h0ICsgaW52ZXJzZWlpXSA9IHRlbXBbaWkgKiB3aWR0aCArIGpqXTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvcGRmNDE3L0JDX1BERjQxN1dyaXRlci5oIGIveGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3V3JpdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMGM0NDEuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9wZGY0MTcvQkNfUERGNDE3V3JpdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYQkFSQ09ERV9QREY0MTdfQkNfUERGNDE3V1JJVEVSX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfUERGNDE3X0JDX1BERjQxN1dSSVRFUl9IXwotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvQkNfVHdvRGltV3JpdGVyLmgiCi0KLWNsYXNzIENCQ19QREY0MTdXcml0ZXIgOiBwdWJsaWMgQ0JDX1R3b0RpbVdyaXRlciB7Ci0gcHVibGljOgotICBDQkNfUERGNDE3V3JpdGVyKCk7Ci0gIH5DQkNfUERGNDE3V3JpdGVyKCkgb3ZlcnJpZGU7Ci0KLSAgdWludDhfdCogRW5jb2RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7Ci0KLSAgLy8gQ0JDX1R3b0RpbVdyaXRlcgotICBib29sIFNldEVycm9yQ29ycmVjdGlvbkxldmVsKGludDMyX3QgbGV2ZWwpIG92ZXJyaWRlOwotCi0gIHZvaWQgU2V0VHJ1bmNhdGVkKGJvb2wgdHJ1bmNhdGVkKTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgcm90YXRlQXJyYXkoQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdD4mIGJpdGFycmF5LAotICAgICAgICAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQpOwotICBib29sIG1fYlRydW5jYXRlZDsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYQkFSQ09ERV9QREY0MTdfQkNfUERGNDE3V1JJVEVSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVXcml0ZXIuY3BwIGIveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlV3JpdGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2NDk5Yy4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVXcml0ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLS8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOCBaWGluZyBhdXRob3JzCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL0JDX1R3b0RpbVdyaXRlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY29tbW9uL0JDX0NvbW1vbkJ5dGVNYXRyaXguaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2NvbW1vbi9yZWVkc29sb21vbi9CQ19SZWVkU29sb21vbkdGMjU2LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlV3JpdGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFbmNvZGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1vZGUuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyVmVyc2lvbi5oIgotCi1DQkNfUVJDb2RlV3JpdGVyOjpDQkNfUVJDb2RlV3JpdGVyKCkgewotICBtX2JGaXhlZFNpemUgPSB0cnVlOwotICBtX2lDb3JyZWN0TGV2ZWwgPSAxOwotICBtX2lWZXJzaW9uID0gMDsKLX0KLQotQ0JDX1FSQ29kZVdyaXRlcjo6fkNCQ19RUkNvZGVXcml0ZXIoKSB7fQotCi12b2lkIENCQ19RUkNvZGVXcml0ZXI6OlJlbGVhc2VBbGwoKSB7Ci0gIGRlbGV0ZSBDQkNfUmVlZFNvbG9tb25HRjI1Njo6UVJDb2RlRmllbGQ7Ci0gIENCQ19SZWVkU29sb21vbkdGMjU2OjpRUkNvZGVGaWVsZCA9IG51bGxwdHI7Ci0gIGRlbGV0ZSBDQkNfUmVlZFNvbG9tb25HRjI1Njo6RGF0YU1hdHJpeEZpZWxkOwotICBDQkNfUmVlZFNvbG9tb25HRjI1Njo6RGF0YU1hdHJpeEZpZWxkID0gbnVsbHB0cjsKLSAgQ0JDX1FSQ29kZXJNb2RlOjpEZXN0cm95KCk7Ci0gIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OkRlc3Ryb3koKTsKLSAgQ0JDX1FSQ29kZXJWZXJzaW9uOjpEZXN0cm95KCk7Ci19Ci0KLWJvb2wgQ0JDX1FSQ29kZVdyaXRlcjo6U2V0VmVyc2lvbihpbnQzMl90IHZlcnNpb24pIHsKLSAgaWYgKHZlcnNpb24gPCAwIHx8IHZlcnNpb24gPiA0MCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBtX2lWZXJzaW9uID0gdmVyc2lvbjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ0JDX1FSQ29kZVdyaXRlcjo6U2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBsZXZlbCkgewotICBpZiAobGV2ZWwgPCAwIHx8IGxldmVsID4gMykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBtX2lDb3JyZWN0TGV2ZWwgPSBsZXZlbDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXVpbnQ4X3QqIENCQ19RUkNvZGVXcml0ZXI6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBlY0xldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjID0gbnVsbHB0cjsKLSAgc3dpdGNoIChlY0xldmVsKSB7Ci0gICAgY2FzZSAwOgotICAgICAgZWMgPSBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpMOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgZWMgPSBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpNOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgZWMgPSBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpROwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgZWMgPSBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpIOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDogewotICAgICAgZSA9IEJDRXhjZXB0aW9uVW5TdXBwb3J0RWNsZXZlbDsKLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgfQotICBDQkNfUVJDb2RlciBxcjsKLSAgaWYgKG1faVZlcnNpb24gPiAwICYmIG1faVZlcnNpb24gPCA0MSkgewotICAgIENGWF9CeXRlU3RyaW5nIGJ5dGVTdHIgPSBjb250ZW50cy5VVEY4RW5jb2RlKCk7Ci0gICAgQ0JDX1FSQ29kZXJFbmNvZGVyOjpFbmNvZGUoYnl0ZVN0ciwgZWMsICZxciwgZSwgbV9pVmVyc2lvbik7Ci0gIH0gZWxzZSB7Ci0gICAgQ0JDX1FSQ29kZXJFbmNvZGVyOjpFbmNvZGUoY29udGVudHMsIGVjLCAmcXIsIGUpOwotICB9Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIG91dFdpZHRoID0gcXIuR2V0TWF0cml4V2lkdGgoKTsKLSAgb3V0SGVpZ2h0ID0gcXIuR2V0TWF0cml4V2lkdGgoKTsKLSAgdWludDhfdCogcmVzdWx0ID0gRlhfQWxsb2MyRCh1aW50OF90LCBvdXRXaWR0aCwgb3V0SGVpZ2h0KTsKLSAgRlhTWVNfbWVtY3B5KHJlc3VsdCwgcXIuR2V0TWF0cml4KCktPkdldEFycmF5KCksIG91dFdpZHRoICogb3V0SGVpZ2h0KTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdWludDhfdCogQ0JDX1FSQ29kZVdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotdWludDhfdCogQ0JDX1FSQ29kZVdyaXRlcjo6RW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgcmV0dXJuIG51bGxwdHI7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVXcml0ZXIuaCBiL3hmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZVdyaXRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTg1ZmE1Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZVdyaXRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfUVJDT0RFX0JDX1FSQ09ERVdSSVRFUl9IXwotI2RlZmluZSBYRkFfRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVXUklURVJfSF8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvQkNfVHdvRGltV3JpdGVyLmgiCi0KLWNsYXNzIENCQ19Ud29EaW1Xcml0ZXI7Ci1jbGFzcyBDQkNfUVJDb2RlV3JpdGVyIDogcHVibGljIENCQ19Ud29EaW1Xcml0ZXIgewotIHB1YmxpYzoKLSAgQ0JDX1FSQ29kZVdyaXRlcigpOwotICB+Q0JDX1FSQ29kZVdyaXRlcigpIG92ZXJyaWRlOwotCi0gIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90IGVjTGV2ZWwsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotICB1aW50OF90KiBFbmNvZGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgQkNGT1JNQVQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgb3V0V2lkdGgsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90IGhpbnRzLAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7Ci0gIHVpbnQ4X3QqIEVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudHMsCi0gICAgICAgICAgICAgICAgICBCQ0ZPUk1BVCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90JiBvdXRXaWR0aCwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIG91dEhlaWdodCwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotICBib29sIFNldFZlcnNpb24oaW50MzJfdCB2ZXJzaW9uKTsKLQotICAvLyBDQkNfVHdvRGltV3JpdGVyCi0gIGJvb2wgU2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoaW50MzJfdCBsZXZlbCkgb3ZlcnJpZGU7Ci0KLSAgc3RhdGljIHZvaWQgUmVsZWFzZUFsbCgpOwotCi0gcHJpdmF0ZToKLSAgaW50MzJfdCBtX2lWZXJzaW9uOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVXUklURVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXIuY3BwIGIveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Yzg0OTcuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgotLyoKLSAqIENvcHlyaWdodCAyMDA4IFpYaW5nIGF1dGhvcnMKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlTWF0cml4LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbC5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNb2RlLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS91dGlscy5oIgotCi1DQkNfUVJDb2Rlcjo6Q0JDX1FSQ29kZXIoKQotICAgIDogbV9tb2RlKG51bGxwdHIpLAotICAgICAgbV9lY0xldmVsKG51bGxwdHIpLAotICAgICAgbV92ZXJzaW9uKC0xKSwKLSAgICAgIG1fbWF0cml4V2lkdGgoLTEpLAotICAgICAgbV9tYXNrUGF0dGVybigtMSksCi0gICAgICBtX251bVRvdGFsQnl0ZXMoLTEpLAotICAgICAgbV9udW1EYXRhQnl0ZXMoLTEpLAotICAgICAgbV9udW1FQ0J5dGVzKC0xKSwKLSAgICAgIG1fbnVtUlNCbG9ja3MoLTEpIHt9Ci0KLUNCQ19RUkNvZGVyOjp+Q0JDX1FSQ29kZXIoKSB7fQotCi1DQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyOjpHZXRNb2RlKCkgY29uc3QgewotICByZXR1cm4gbV9tb2RlOwotfQotCi1DQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBDQkNfUVJDb2Rlcjo6R2V0RUNMZXZlbCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fZWNMZXZlbDsKLX0KLQotaW50MzJfdCBDQkNfUVJDb2Rlcjo6R2V0VmVyc2lvbigpIGNvbnN0IHsKLSAgcmV0dXJuIG1fdmVyc2lvbjsKLX0KLQotaW50MzJfdCBDQkNfUVJDb2Rlcjo6R2V0TWF0cml4V2lkdGgoKSBjb25zdCB7Ci0gIHJldHVybiBtX21hdHJpeFdpZHRoOwotfQotCi1pbnQzMl90IENCQ19RUkNvZGVyOjpHZXRNYXNrUGF0dGVybigpIGNvbnN0IHsKLSAgcmV0dXJuIG1fbWFza1BhdHRlcm47Ci19Ci0KLWludDMyX3QgQ0JDX1FSQ29kZXI6OkdldE51bVRvdGFsQnl0ZXMoKSBjb25zdCB7Ci0gIHJldHVybiBtX251bVRvdGFsQnl0ZXM7Ci19Ci0KLWludDMyX3QgQ0JDX1FSQ29kZXI6OkdldE51bURhdGFCeXRlcygpIGNvbnN0IHsKLSAgcmV0dXJuIG1fbnVtRGF0YUJ5dGVzOwotfQotCi1pbnQzMl90IENCQ19RUkNvZGVyOjpHZXROdW1FQ0J5dGVzKCkgY29uc3QgewotICByZXR1cm4gbV9udW1FQ0J5dGVzOwotfQotCi1pbnQzMl90IENCQ19RUkNvZGVyOjpHZXROdW1SU0Jsb2NrcygpIGNvbnN0IHsKLSAgcmV0dXJuIG1fbnVtUlNCbG9ja3M7Ci19Ci0KLUNCQ19Db21tb25CeXRlTWF0cml4KiBDQkNfUVJDb2Rlcjo6R2V0TWF0cml4KCkgY29uc3QgewotICByZXR1cm4gbV9tYXRyaXguZ2V0KCk7Ci19Ci0KLWludDMyX3QgQ0JDX1FSQ29kZXI6OkF0KGludDMyX3QgeCwgaW50MzJfdCB5LCBpbnQzMl90JiBlKSB7Ci0gIGludDMyX3QgdmFsdWUgPSBtX21hdHJpeC0+R2V0KHgsIHkpOwotICBpZiAoISh2YWx1ZSA9PSAwIHx8IHZhbHVlID09IDEpKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uVmFsdWVNdXN0QmVFaXRoZXIwb3IxOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotYm9vbCBDQkNfUVJDb2Rlcjo6SXNWYWxpZCgpIHsKLSAgcmV0dXJuIG1fbW9kZSAmJiBtX2VjTGV2ZWwgJiYgbV92ZXJzaW9uICE9IC0xICYmIG1fbWF0cml4V2lkdGggIT0gLTEgJiYKLSAgICAgICAgIG1fbWFza1BhdHRlcm4gIT0gLTEgJiYgbV9udW1Ub3RhbEJ5dGVzICE9IC0xICYmIG1fbnVtRGF0YUJ5dGVzICE9IC0xICYmCi0gICAgICAgICBtX251bUVDQnl0ZXMgIT0gLTEgJiYgbV9udW1SU0Jsb2NrcyAhPSAtMSAmJgotICAgICAgICAgSXNWYWxpZE1hc2tQYXR0ZXJuKG1fbWFza1BhdHRlcm4pICYmCi0gICAgICAgICBtX251bVRvdGFsQnl0ZXMgPT0gbV9udW1EYXRhQnl0ZXMgKyBtX251bUVDQnl0ZXMgJiYgbV9tYXRyaXggJiYKLSAgICAgICAgIG1fbWF0cml4V2lkdGggPT0gbV9tYXRyaXgtPkdldFdpZHRoKCkgJiYKLSAgICAgICAgIG1fbWF0cml4LT5HZXRXaWR0aCgpID09IG1fbWF0cml4LT5HZXRIZWlnaHQoKTsKLX0KLQotdm9pZCBDQkNfUVJDb2Rlcjo6U2V0TW9kZShDQkNfUVJDb2Rlck1vZGUqIHZhbHVlKSB7Ci0gIG1fbW9kZSA9IHZhbHVlOwotfQotCi12b2lkIENCQ19RUkNvZGVyOjpTZXRFQ0xldmVsKENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwpIHsKLSAgbV9lY0xldmVsID0gZWNMZXZlbDsKLX0KLQotdm9pZCBDQkNfUVJDb2Rlcjo6U2V0VmVyc2lvbihpbnQzMl90IHZlcnNpb24pIHsKLSAgbV92ZXJzaW9uID0gdmVyc2lvbjsKLX0KLQotdm9pZCBDQkNfUVJDb2Rlcjo6U2V0TWF0cml4V2lkdGgoaW50MzJfdCB3aWR0aCkgewotICBtX21hdHJpeFdpZHRoID0gd2lkdGg7Ci19Ci0KLXZvaWQgQ0JDX1FSQ29kZXI6OlNldE1hc2tQYXR0ZXJuKGludDMyX3QgcGF0dGVybikgewotICBtX21hc2tQYXR0ZXJuID0gcGF0dGVybjsKLX0KLQotdm9pZCBDQkNfUVJDb2Rlcjo6U2V0TnVtRGF0YUJ5dGVzKGludDMyX3QgYnl0ZXMpIHsKLSAgbV9udW1EYXRhQnl0ZXMgPSBieXRlczsKLX0KLQotdm9pZCBDQkNfUVJDb2Rlcjo6U2V0TnVtVG90YWxCeXRlcyhpbnQzMl90IHZhbHVlKSB7Ci0gIG1fbnVtVG90YWxCeXRlcyA9IHZhbHVlOwotfQotCi12b2lkIENCQ19RUkNvZGVyOjpTZXROdW1SU0Jsb2NrcyhpbnQzMl90IGJsb2NrKSB7Ci0gIG1fbnVtUlNCbG9ja3MgPSBibG9jazsKLX0KLQotdm9pZCBDQkNfUVJDb2Rlcjo6U2V0TnVtRUNCeXRlcyhpbnQzMl90IHZhbHVlKSB7Ci0gIG1fbnVtRUNCeXRlcyA9IHZhbHVlOwotfQotCi1ib29sIENCQ19RUkNvZGVyOjpJc1ZhbGlkTWFza1BhdHRlcm4oaW50MzJfdCBtYXNrUGF0dGVybikgewotICByZXR1cm4gbWFza1BhdHRlcm4gPj0gMCAmJiBtYXNrUGF0dGVybiA8IGtOdW1NYXNrUGF0dGVybnM7Ci19Ci0KLXZvaWQgQ0JDX1FSQ29kZXI6OlNldE1hdHJpeChzdGQ6OnVuaXF1ZV9wdHI8Q0JDX0NvbW1vbkJ5dGVNYXRyaXg+IHBNYXRyaXgpIHsKLSAgbV9tYXRyaXggPSBzdGQ6Om1vdmUocE1hdHJpeCk7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyLmggYi94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOTQ5OTIuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfUVJDT0RFX0JDX1FSQ09ERVJfSF8KLSNkZWZpbmUgWEZBX0ZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUl9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi1jbGFzcyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOwotY2xhc3MgQ0JDX1FSQ29kZXJNb2RlOwotY2xhc3MgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg7Ci0KLWNsYXNzIENCQ19RUkNvZGVyIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrTnVtTWFza1BhdHRlcm5zID0gODsKLQotICBDQkNfUVJDb2RlcigpOwotICB2aXJ0dWFsIH5DQkNfUVJDb2RlcigpOwotCi0gIHN0YXRpYyBib29sIElzVmFsaWRNYXNrUGF0dGVybihpbnQzMl90IG1hc2tQYXR0ZXJuKTsKLQotICBDQkNfUVJDb2Rlck1vZGUqIEdldE1vZGUoKSBjb25zdDsKLSAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogR2V0RUNMZXZlbCgpIGNvbnN0OwotICBpbnQzMl90IEdldFZlcnNpb24oKSBjb25zdDsKLSAgaW50MzJfdCBHZXRNYXRyaXhXaWR0aCgpIGNvbnN0OwotICBpbnQzMl90IEdldE1hc2tQYXR0ZXJuKCkgY29uc3Q7Ci0gIGludDMyX3QgR2V0TnVtVG90YWxCeXRlcygpIGNvbnN0OwotICBpbnQzMl90IEdldE51bURhdGFCeXRlcygpIGNvbnN0OwotICBpbnQzMl90IEdldE51bUVDQnl0ZXMoKSBjb25zdDsKLSAgaW50MzJfdCBHZXROdW1SU0Jsb2NrcygpIGNvbnN0OwotICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogR2V0TWF0cml4KCkgY29uc3Q7Ci0KLSAgaW50MzJfdCBBdChpbnQzMl90IHgsIGludDMyX3QgeSwgaW50MzJfdCYgZSk7Ci0gIGJvb2wgSXNWYWxpZCgpOwotCi0gIHZvaWQgU2V0TW9kZShDQkNfUVJDb2Rlck1vZGUqIHZhbHVlKTsKLSAgdm9pZCBTZXRFQ0xldmVsKENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwpOwotICB2b2lkIFNldFZlcnNpb24oaW50MzJfdCB2ZXJzaW9uKTsKLSAgdm9pZCBTZXRNYXRyaXhXaWR0aChpbnQzMl90IHdpZHRoKTsKLSAgdm9pZCBTZXRNYXNrUGF0dGVybihpbnQzMl90IHBhdHRlcm4pOwotICB2b2lkIFNldE51bURhdGFCeXRlcyhpbnQzMl90IGJ5dGVzKTsKLSAgdm9pZCBTZXROdW1Ub3RhbEJ5dGVzKGludDMyX3QgdmFsdWUpOwotICB2b2lkIFNldE51bUVDQnl0ZXMoaW50MzJfdCB2YWx1ZSk7Ci0gIHZvaWQgU2V0TnVtUlNCbG9ja3MoaW50MzJfdCBibG9jayk7Ci0gIHZvaWQgU2V0TWF0cml4KHN0ZDo6dW5pcXVlX3B0cjxDQkNfQ29tbW9uQnl0ZU1hdHJpeD4gcE1hdHJpeCk7Ci0KLSBwcml2YXRlOgotICBDQkNfUVJDb2Rlck1vZGUqIG1fbW9kZTsKLSAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogbV9lY0xldmVsOwotICBpbnQzMl90IG1fdmVyc2lvbjsKLSAgaW50MzJfdCBtX21hdHJpeFdpZHRoOwotICBpbnQzMl90IG1fbWFza1BhdHRlcm47Ci0gIGludDMyX3QgbV9udW1Ub3RhbEJ5dGVzOwotICBpbnQzMl90IG1fbnVtRGF0YUJ5dGVzOwotICBpbnQzMl90IG1fbnVtRUNCeXRlczsKLSAgaW50MzJfdCBtX251bVJTQmxvY2tzOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0JDX0NvbW1vbkJ5dGVNYXRyaXg+IG1fbWF0cml4OwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQml0VmVjdG9yLmNwcCBiL3hmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCaXRWZWN0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDE0MGE4Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCaXRWZWN0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLS8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCaXRWZWN0b3IuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3V0aWxzLmgiCi0KLUNCQ19RUkNvZGVyQml0VmVjdG9yOjpDQkNfUVJDb2RlckJpdFZlY3RvcigpIHsKLSAgbV9zaXplSW5CaXRzID0gMDsKLSAgbV9zaXplID0gMzI7Ci19Ci12b2lkIENCQ19RUkNvZGVyQml0VmVjdG9yOjpJbml0KCkgewotICBtX2FycmF5ID0gRlhfQWxsb2ModWludDhfdCwgbV9zaXplKTsKLX0KLUNCQ19RUkNvZGVyQml0VmVjdG9yOjp+Q0JDX1FSQ29kZXJCaXRWZWN0b3IoKSB7Ci0gIEZYX0ZyZWUobV9hcnJheSk7Ci19Ci12b2lkIENCQ19RUkNvZGVyQml0VmVjdG9yOjpDbGVhcigpIHsKLSAgRlhfRnJlZShtX2FycmF5KTsKLSAgbV9zaXplSW5CaXRzID0gMDsKLSAgbV9zaXplID0gMzI7Ci0gIG1fYXJyYXkgPSBGWF9BbGxvYyh1aW50OF90LCBtX3NpemUpOwotfQotaW50MzJfdCBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6QXQoaW50MzJfdCBpbmRleCwgaW50MzJfdCYgZSkgewotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG1fc2l6ZUluQml0cykgewotICAgIGUgPSBCQ0V4Y2VwdGlvbkJhZEluZGV4RXhjZXB0aW9uOwotICAgIHJldHVybiAwOwotICB9Ci0gIGludDMyX3QgdmFsdWUgPSBtX2FycmF5W2luZGV4ID4+IDNdICYgMHhmZjsKLSAgcmV0dXJuICh2YWx1ZSA+PiAoNyAtIChpbmRleCAmIDB4NykpKSAmIDE7Ci19Ci1pbnQzMl90IENCQ19RUkNvZGVyQml0VmVjdG9yOjpzaXplSW5CeXRlcygpIHsKLSAgcmV0dXJuIChtX3NpemVJbkJpdHMgKyA3KSA+PiAzOwotfQotaW50MzJfdCBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6U2l6ZSgpIHsKLSAgcmV0dXJuIG1fc2l6ZUluQml0czsKLX0KLXZvaWQgQ0JDX1FSQ29kZXJCaXRWZWN0b3I6OkFwcGVuZEJpdChpbnQzMl90IGJpdCwgaW50MzJfdCYgZSkgewotICBpZiAoIShiaXQgPT0gMCB8fCBiaXQgPT0gMSkpIHsKLSAgICBlID0gQkNFeGNlcHRpb25CYWRWYWx1ZUV4Y2VwdGlvbjsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50MzJfdCBudW1CaXRzSW5MYXN0Qnl0ZSA9IG1fc2l6ZUluQml0cyAmIDB4NzsKLSAgaWYgKG51bUJpdHNJbkxhc3RCeXRlID09IDApIHsKLSAgICBBcHBlbmRCeXRlKDApOwotICAgIG1fc2l6ZUluQml0cyAtPSA4OwotICB9Ci0gIG1fYXJyYXlbbV9zaXplSW5CaXRzID4+IDNdIHw9IChiaXQgPDwgKDcgLSBudW1CaXRzSW5MYXN0Qnl0ZSkpOwotICArK21fc2l6ZUluQml0czsKLX0KLXZvaWQgQ0JDX1FSQ29kZXJCaXRWZWN0b3I6OkFwcGVuZEJpdHMoaW50MzJfdCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1CaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGlmIChudW1CaXRzIDwgMCB8fCBudW1CaXRzID4gMzIpIHsKLSAgICBlID0gQkNFeGNlcHRpb25CYWROdW1CaXRzRXhjZXB0aW9uOwotICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IG51bUJpdHNMZWZ0ID0gbnVtQml0czsKLSAgd2hpbGUgKG51bUJpdHNMZWZ0ID4gMCkgewotICAgIGlmICgobV9zaXplSW5CaXRzICYgMHg3KSA9PSAwICYmIG51bUJpdHNMZWZ0ID49IDgpIHsKLSAgICAgIGludDMyX3QgbmV3Qnl0ZSA9ICh2YWx1ZSA+PiAobnVtQml0c0xlZnQgLSA4KSkgJiAweGZmOwotICAgICAgQXBwZW5kQnl0ZShuZXdCeXRlKTsKLSAgICAgIG51bUJpdHNMZWZ0IC09IDg7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGludDMyX3QgYml0ID0gKHZhbHVlID4+IChudW1CaXRzTGVmdCAtIDEpKSAmIDE7Ci0gICAgICBBcHBlbmRCaXQoYml0LCBlKTsKLSAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICAgIHJldHVybjsKLSAgICAgIC0tbnVtQml0c0xlZnQ7Ci0gICAgfQotICB9Ci19Ci12b2lkIENCQ19RUkNvZGVyQml0VmVjdG9yOjpBcHBlbmRCaXRWZWN0b3IoQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBpbnQzMl90IHNpemUgPSBiaXRzLT5TaXplKCk7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgIGludDMyX3QgbnVtID0gYml0cy0+QXQoaSwgZSk7Ci0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgIHJldHVybjsKLSAgICBBcHBlbmRCaXQobnVtLCBlKTsKLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgcmV0dXJuOwotICB9Ci19Ci12b2lkIENCQ19RUkNvZGVyQml0VmVjdG9yOjpYT1IoQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIG90aGVyLCBpbnQzMl90JiBlKSB7Ci0gIGlmIChtX3NpemVJbkJpdHMgIT0gb3RoZXItPlNpemUoKSkgewotICAgIGUgPSBCQ0V4Y2VwdGlvbmNhbk5vdE9wZXJhdGV4b3JPcGVyYXRvcjsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50MzJfdCBzaXplSW5CeXRlcyA9IChtX3NpemVJbkJpdHMgKyA3KSA+PiAzOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplSW5CeXRlczsgKytpKSB7Ci0gICAgbV9hcnJheVtpXSBePSAob3RoZXItPkdldEFycmF5KCkpW2ldOwotICB9Ci19Ci11aW50OF90KiBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6R2V0QXJyYXkoKSB7Ci0gIHJldHVybiBtX2FycmF5OwotfQotdm9pZCBDQkNfUVJDb2RlckJpdFZlY3Rvcjo6QXBwZW5kQnl0ZShpbnQzMl90IHZhbHVlKSB7Ci0gIGlmICgobV9zaXplSW5CaXRzID4+IDMpID09IG1fc2l6ZSkgewotICAgIHVpbnQ4X3QqIG5ld0FycmF5ID0gRlhfQWxsb2ModWludDhfdCwgbV9zaXplIDw8IDEpOwotICAgIEZYU1lTX21lbWNweShuZXdBcnJheSwgbV9hcnJheSwgbV9zaXplKTsKLSAgICBGWF9GcmVlKG1fYXJyYXkpOwotICAgIG1fYXJyYXkgPSBuZXdBcnJheTsKLSAgICBtX3NpemUgPSBtX3NpemUgPDwgMTsKLSAgfQotICBtX2FycmF5W21fc2l6ZUluQml0cyA+PiAzXSA9ICh1aW50OF90KXZhbHVlOwotICBtX3NpemVJbkJpdHMgKz0gODsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCaXRWZWN0b3IuaCBiL3hmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCaXRWZWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc0MjU0MS4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQml0VmVjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUkJJVFZFQ1RPUl9IXwotI2RlZmluZSBYRkFfRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSQklUVkVDVE9SX0hfCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotY2xhc3MgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgewotIHByaXZhdGU6Ci0gIGludDMyX3QgbV9zaXplSW5CaXRzOwotICB1aW50OF90KiBtX2FycmF5OwotICBpbnQzMl90IG1fc2l6ZTsKLQotICB2b2lkIEFwcGVuZEJ5dGUoaW50MzJfdCB2YWx1ZSk7Ci0KLSBwdWJsaWM6Ci0gIENCQ19RUkNvZGVyQml0VmVjdG9yKCk7Ci0gIHZpcnR1YWwgfkNCQ19RUkNvZGVyQml0VmVjdG9yKCk7Ci0gIGludDMyX3QgQXQoaW50MzJfdCBpbmRleCwgaW50MzJfdCYgZSk7Ci0gIGludDMyX3QgU2l6ZSgpOwotICBpbnQzMl90IHNpemVJbkJ5dGVzKCk7Ci0gIHZvaWQgQXBwZW5kQml0KGludDMyX3QgYml0LCBpbnQzMl90JiBlKTsKLSAgdm9pZCBBcHBlbmRCaXRzKGludDMyX3QgdmFsdWUsIGludDMyX3QgbnVtQml0cywgaW50MzJfdCYgZSk7Ci0gIHZvaWQgQXBwZW5kQml0VmVjdG9yKENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLCBpbnQzMl90JiBlKTsKLSAgdm9pZCBYT1IoQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIG90aGVyLCBpbnQzMl90JiBlKTsKLSAgdWludDhfdCogR2V0QXJyYXkoKTsKLSAgdm9pZCBDbGVhcigpOwotICB2aXJ0dWFsIHZvaWQgSW5pdCgpOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSQklUVkVDVE9SX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQmxvY2tQYWlyLmNwcCBiL3hmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCbG9ja1BhaXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGM3M2M0Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCbG9ja1BhaXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgotLyoKLSAqIENvcHlyaWdodCAyMDA4IFpYaW5nIGF1dGhvcnMKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCbG9ja1BhaXIuaCIKLQotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlQXJyYXkuaCIKLQotQ0JDX1FSQ29kZXJCbG9ja1BhaXI6OkNCQ19RUkNvZGVyQmxvY2tQYWlyKAotICAgIHN0ZDo6dW5pcXVlX3B0cjxDQkNfQ29tbW9uQnl0ZUFycmF5PiBkYXRhLAotICAgIHN0ZDo6dW5pcXVlX3B0cjxDQkNfQ29tbW9uQnl0ZUFycmF5PiBlcnJvckNvcnJlY3Rpb24pCi0gICAgOiBtX2RhdGFCeXRlcyhzdGQ6Om1vdmUoZGF0YSkpLAotICAgICAgbV9lcnJvckNvcnJlY3Rpb25CeXRlcyhzdGQ6Om1vdmUoZXJyb3JDb3JyZWN0aW9uKSkge30KLQotQ0JDX1FSQ29kZXJCbG9ja1BhaXI6On5DQkNfUVJDb2RlckJsb2NrUGFpcigpIHt9Ci0KLWNvbnN0IENCQ19Db21tb25CeXRlQXJyYXkqIENCQ19RUkNvZGVyQmxvY2tQYWlyOjpHZXREYXRhQnl0ZXMoKSBjb25zdCB7Ci0gIHJldHVybiBtX2RhdGFCeXRlcy5nZXQoKTsKLX0KLQotY29uc3QgQ0JDX0NvbW1vbkJ5dGVBcnJheSogQ0JDX1FSQ29kZXJCbG9ja1BhaXI6OkdldEVycm9yQ29ycmVjdGlvbkJ5dGVzKCkKLSAgICBjb25zdCB7Ci0gIHJldHVybiBtX2Vycm9yQ29ycmVjdGlvbkJ5dGVzLmdldCgpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJsb2NrUGFpci5oIGIveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJsb2NrUGFpci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjU5ZDZiLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCbG9ja1BhaXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSQkxPQ0tQQUlSX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfUVJDT0RFX0JDX1FSQ09ERVJCTE9DS1BBSVJfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotY2xhc3MgQ0JDX0NvbW1vbkJ5dGVBcnJheTsKLQotY2xhc3MgQ0JDX1FSQ29kZXJCbG9ja1BhaXIgewotIHB1YmxpYzoKLSAgQ0JDX1FSQ29kZXJCbG9ja1BhaXIoc3RkOjp1bmlxdWVfcHRyPENCQ19Db21tb25CeXRlQXJyYXk+IGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDQkNfQ29tbW9uQnl0ZUFycmF5PiBlcnJvckNvcnJlY3Rpb24pOwotICB2aXJ0dWFsIH5DQkNfUVJDb2RlckJsb2NrUGFpcigpOwotCi0gIGNvbnN0IENCQ19Db21tb25CeXRlQXJyYXkqIEdldERhdGFCeXRlcygpIGNvbnN0OwotICBjb25zdCBDQkNfQ29tbW9uQnl0ZUFycmF5KiBHZXRFcnJvckNvcnJlY3Rpb25CeXRlcygpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgc3RkOjp1bmlxdWVfcHRyPENCQ19Db21tb25CeXRlQXJyYXk+IG1fZGF0YUJ5dGVzOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0JDX0NvbW1vbkJ5dGVBcnJheT4gbV9lcnJvckNvcnJlY3Rpb25CeXRlczsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUkJMT0NLUEFJUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQi5jcHAgYi94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1YTJhNi4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLS8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCLmgiCi0KLUNCQ19RUkNvZGVyRUNCOjpDQkNfUVJDb2RlckVDQihpbnQzMl90IGNvdW50LCBpbnQzMl90IGRhdGFDb2RlV29yZHMpIHsKLSAgbV9kYXRhQ29kZVdvcmRzID0gZGF0YUNvZGVXb3JkczsKLSAgbV9jb3VudCA9IGNvdW50OwotfQotQ0JDX1FSQ29kZXJFQ0I6On5DQkNfUVJDb2RlckVDQigpIHt9Ci1pbnQzMl90IENCQ19RUkNvZGVyRUNCOjpHZXRDb3VudCgpIHsKLSAgcmV0dXJuIG1fY291bnQ7Ci19Ci1pbnQzMl90IENCQ19RUkNvZGVyRUNCOjpHZXREYXRhQ29kZVdvcmRzKCkgewotICByZXR1cm4gbV9kYXRhQ29kZVdvcmRzOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQi5oIGIveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWIwYjIwLi4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0IuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSRUNCX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfUVJDT0RFX0JDX1FSQ09ERVJFQ0JfSF8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi1jbGFzcyBDQkNfUVJDb2RlckVDQiB7Ci0gcHJpdmF0ZToKLSAgaW50MzJfdCBtX2NvdW50OwotICBpbnQzMl90IG1fZGF0YUNvZGVXb3JkczsKLQotIHB1YmxpYzoKLSAgQ0JDX1FSQ29kZXJFQ0IoaW50MzJfdCBjb3VudCwgaW50MzJfdCBkYXRhQ29kZVdvcmRzKTsKLSAgdmlydHVhbCB+Q0JDX1FSQ29kZXJFQ0IoKTsKLSAgaW50MzJfdCBHZXRDb3VudCgpOwotICBpbnQzMl90IEdldERhdGFDb2RlV29yZHMoKTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUkVDQl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQmxvY2tzLmNwcCBiL3hmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwN2M5MTguLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQmxvY2tzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLS8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQmxvY2tzLmgiCi0KLUNCQ19RUkNvZGVyRUNCbG9ja3M6OkNCQ19RUkNvZGVyRUNCbG9ja3MoaW50MzJfdCBlY0NvZGVXb3Jkc1BlckJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVDQiogZWNCbG9ja3MpCi0gICAgOiBtX2VjQ29kZVdvcmRzUGVyQmxvY2soZWNDb2RlV29yZHNQZXJCbG9jaykgewotICBtX2VjQmxvY2tzQXJyYXkuQWRkKGVjQmxvY2tzKTsKLX0KLQotQ0JDX1FSQ29kZXJFQ0Jsb2Nrczo6Q0JDX1FSQ29kZXJFQ0Jsb2NrcyhpbnQzMl90IGVjQ29kZVdvcmRzUGVyQmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRUNCKiBlY0Jsb2NrczEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRUNCKiBlY0Jsb2NrczIpCi0gICAgOiBtX2VjQ29kZVdvcmRzUGVyQmxvY2soZWNDb2RlV29yZHNQZXJCbG9jaykgewotICBtX2VjQmxvY2tzQXJyYXkuQWRkKGVjQmxvY2tzMSk7Ci0gIG1fZWNCbG9ja3NBcnJheS5BZGQoZWNCbG9ja3MyKTsKLX0KLQotQ0JDX1FSQ29kZXJFQ0Jsb2Nrczo6fkNCQ19RUkNvZGVyRUNCbG9ja3MoKSB7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fZWNCbG9ja3NBcnJheS5HZXRTaXplKCk7IGkrKykKLSAgICBkZWxldGUgbV9lY0Jsb2Nrc0FycmF5W2ldOwotfQotCi1pbnQzMl90IENCQ19RUkNvZGVyRUNCbG9ja3M6OkdldEVDQ29kZVdvcmRzUGVyQmxvY2soKSBjb25zdCB7Ci0gIHJldHVybiBtX2VjQ29kZVdvcmRzUGVyQmxvY2s7Ci19Ci0KLWludDMyX3QgQ0JDX1FSQ29kZXJFQ0Jsb2Nrczo6R2V0TnVtQmxvY2tzKCkgY29uc3QgewotICBpbnQzMl90IHRvdGFsID0gMDsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9lY0Jsb2Nrc0FycmF5LkdldFNpemUoKTsgaSsrKQotICAgIHRvdGFsICs9IG1fZWNCbG9ja3NBcnJheVtpXS0+R2V0Q291bnQoKTsKLQotICByZXR1cm4gdG90YWw7Ci19Ci0KLWludDMyX3QgQ0JDX1FSQ29kZXJFQ0Jsb2Nrczo6R2V0VG90YWxFQ0NvZGVXb3JkcygpIGNvbnN0IHsKLSAgcmV0dXJuIG1fZWNDb2RlV29yZHNQZXJCbG9jayAqIEdldE51bUJsb2NrcygpOwotfQotCi1DRlhfQXJyYXlUZW1wbGF0ZTxDQkNfUVJDb2RlckVDQio+KiBDQkNfUVJDb2RlckVDQmxvY2tzOjpHZXRFQ0Jsb2NrcygpIHsKLSAgcmV0dXJuICZtX2VjQmxvY2tzQXJyYXk7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRUNCbG9ja3MuaCBiL3hmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDI4ZjA2Li4wMDAwMDAwCi0tLSBhL3hmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfUVJDT0RFX0JDX1FSQ09ERVJFQ0JMT0NLU19IXwotI2RlZmluZSBYRkFfRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSRUNCTE9DS1NfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLQotY2xhc3MgQ0JDX1FSQ29kZXJFQ0I7Ci0KLWNsYXNzIENCQ19RUkNvZGVyRUNCbG9ja3MgewotIHB1YmxpYzoKLSAgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyhpbnQzMl90IGVjQ29kZVdvcmRzUGVyQmxvY2ssIENCQ19RUkNvZGVyRUNCKiBlY0Jsb2Nrcyk7Ci0gIENCQ19RUkNvZGVyRUNCbG9ja3MoaW50MzJfdCBlY0NvZGVXb3Jkc1BlckJsb2NrLAotICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRUNCKiBlY0Jsb2NrczEsCi0gICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFQ0IqIGVjQmxvY2tzMik7Ci0gIH5DQkNfUVJDb2RlckVDQmxvY2tzKCk7Ci0KLSAgaW50MzJfdCBHZXRFQ0NvZGVXb3Jkc1BlckJsb2NrKCkgY29uc3Q7Ci0gIGludDMyX3QgR2V0TnVtQmxvY2tzKCkgY29uc3Q7Ci0gIGludDMyX3QgR2V0VG90YWxFQ0NvZGVXb3JkcygpIGNvbnN0OwotICBDRlhfQXJyYXlUZW1wbGF0ZTxDQkNfUVJDb2RlckVDQio+KiBHZXRFQ0Jsb2NrcygpOwotCi0gcHJpdmF0ZToKLSAgaW50MzJfdCBtX2VjQ29kZVdvcmRzUGVyQmxvY2s7Ci0gIENGWF9BcnJheVRlbXBsYXRlPENCQ19RUkNvZGVyRUNCKj4gbV9lY0Jsb2Nrc0FycmF5OwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSRUNCTE9DS1NfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFbmNvZGVyLmNwcCBiL3hmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFbmNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMyNjJmMC4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRW5jb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5NzEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgotLyoKLSAqIENvcHlyaWdodCAyMDA4IFpYaW5nIGF1dGhvcnMKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFbmNvZGVyLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL0JDX1V0aWxDb2RpbmdDb252ZXJ0LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZUFycmF5LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jb21tb24vQkNfQ29tbW9uQnl0ZU1hdHJpeC5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvY29tbW9uL3JlZWRzb2xvbW9uL0JDX1JlZWRTb2xvbW9uLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9jb21tb24vcmVlZHNvbG9tb24vQkNfUmVlZFNvbG9tb25HRjI1Ni5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQml0VmVjdG9yLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckJsb2NrUGFpci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrcy5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNYXNrVXRpbC5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNYXRyaXhVdGlsLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1vZGUuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyVmVyc2lvbi5oIgotCi1uYW1lc3BhY2UgewotCi1jb25zdCBpbnQ4X3QgZ19hbHBoYU51bWVyaWNUYWJsZVtdID0gewotICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgIDM2LCAtMSwgLTEsIC0xLCAzNywgMzgsIC0xLCAtMSwgLTEsIC0xLCAzOSwgNDAsIC0xLCA0MSwgNDIsIDQzLAotICAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksICA0NCwgLTEsIC0xLCAtMSwgLTEsIC0xLAotICAgIC0xLCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LAotICAgIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLUNCQ19RUkNvZGVyRW5jb2Rlcjo6Q0JDX1FSQ29kZXJFbmNvZGVyKCkge30KLQotQ0JDX1FSQ29kZXJFbmNvZGVyOjp+Q0JDX1FSQ29kZXJFbmNvZGVyKCkge30KLQotdm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkVuY29kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXIqIHFyQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2ZXJzaW9uU3BlY2lmeSkgewotICBpZiAodmVyc2lvblNwZWNpZnkgPT0gMCkgewotICAgIEVuY29kZVdpdGhBdXRvVmVyc2lvbihjb250ZW50LCBlY0xldmVsLCBxckNvZGUsIGUpOwotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICByZXR1cm47Ci0gIH0gZWxzZSBpZiAodmVyc2lvblNwZWNpZnkgPiAwICYmIHZlcnNpb25TcGVjaWZ5IDw9IDQwKSB7Ci0gICAgRW5jb2RlV2l0aFNwZWNpZnlWZXJzaW9uKGNvbnRlbnQsIGVjTGV2ZWwsIHFyQ29kZSwgdmVyc2lvblNwZWNpZnksIGUpOwotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICByZXR1cm47Ci0gIH0gZWxzZSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uVmVyc2lvbk11c3QxXzQwOwotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICByZXR1cm47Ci0gIH0KLX0KLQotdm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkFwcGVuZEVDSShDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cykge30KLQotdm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkFwcGVuZERhdGFNb2RlTGVuZ2hJbmZvKAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDQkNfUVJDb2Rlck1vZGUqLCBDRlhfQnl0ZVN0cmluZz4+JgotICAgICAgICBzcGxpdFJlc3VsdHMsCi0gICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3ImIGhlYWRlckFuZERhdGFCaXRzLAotICAgIENCQ19RUkNvZGVyTW9kZSogdGVtcE1vZGUsCi0gICAgQ0JDX1FSQ29kZXIqIHFyQ29kZSwKLSAgICBDRlhfQnl0ZVN0cmluZyYgZW5jb2RpbmcsCi0gICAgaW50MzJfdCYgZSkgewotICBmb3IgKGNvbnN0IGF1dG8mIHNwbGl0UmVzdWx0IDogc3BsaXRSZXN1bHRzKSB7Ci0gICAgdGVtcE1vZGUgPSBzcGxpdFJlc3VsdC5maXJzdDsKLSAgICBpZiAodGVtcE1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzR0JLKSB7Ci0gICAgICBBcHBlbmRNb2RlSW5mbyh0ZW1wTW9kZSwgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsKLSAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICAgIHJldHVybjsKLSAgICAgIEFwcGVuZExlbmd0aEluZm8oc3BsaXRSZXN1bHQuc2Vjb25kLkdldExlbmd0aCgpLCBxckNvZGUtPkdldFZlcnNpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgdGVtcE1vZGUsICZoZWFkZXJBbmREYXRhQml0cywgZSk7Ci0gICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgICByZXR1cm47Ci0gICAgICBBcHBlbmRCeXRlcyhzcGxpdFJlc3VsdC5zZWNvbmQsIHRlbXBNb2RlLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmICh0ZW1wTW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFKSB7Ci0gICAgICBDRlhfQXJyYXlUZW1wbGF0ZTx1aW50OF90PiBieXRlczsKLSAgICAgIENCQ19VdGlsQ29kaW5nQ29udmVydDo6TG9jYWxlVG9VdGY4KHNwbGl0UmVzdWx0LnNlY29uZCwgYnl0ZXMpOwotICAgICAgQXBwZW5kTW9kZUluZm8odGVtcE1vZGUsICZoZWFkZXJBbmREYXRhQml0cywgZSk7Ci0gICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgICByZXR1cm47Ci0gICAgICBBcHBlbmRMZW5ndGhJbmZvKGJ5dGVzLkdldFNpemUoKSwgcXJDb2RlLT5HZXRWZXJzaW9uKCksIHRlbXBNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOwotICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgICAgcmV0dXJuOwotICAgICAgQXBwZW5kOEJpdEJ5dGVzKGJ5dGVzLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGUpOwotICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAodGVtcE1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQUxQSEFOVU1FUklDKSB7Ci0gICAgICBBcHBlbmRNb2RlSW5mbyh0ZW1wTW9kZSwgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsKLSAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICAgIHJldHVybjsKLSAgICAgIEFwcGVuZExlbmd0aEluZm8oc3BsaXRSZXN1bHQuc2Vjb25kLkdldExlbmd0aCgpLCBxckNvZGUtPkdldFZlcnNpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgdGVtcE1vZGUsICZoZWFkZXJBbmREYXRhQml0cywgZSk7Ci0gICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgICByZXR1cm47Ci0gICAgICBBcHBlbmRCeXRlcyhzcGxpdFJlc3VsdC5zZWNvbmQsIHRlbXBNb2RlLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmICh0ZW1wTW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDKSB7Ci0gICAgICBBcHBlbmRNb2RlSW5mbyh0ZW1wTW9kZSwgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsKLSAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICAgIHJldHVybjsKLSAgICAgIEFwcGVuZExlbmd0aEluZm8oc3BsaXRSZXN1bHQuc2Vjb25kLkdldExlbmd0aCgpLCBxckNvZGUtPkdldFZlcnNpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgdGVtcE1vZGUsICZoZWFkZXJBbmREYXRhQml0cywgZSk7Ci0gICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgICByZXR1cm47Ci0gICAgICBBcHBlbmRCeXRlcyhzcGxpdFJlc3VsdC5zZWNvbmQsIHRlbXBNb2RlLCAmaGVhZGVyQW5kRGF0YUJpdHMsIGVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIHsKLSAgICAgIGUgPSBCQ0V4Y2VwdGlvblVua25vd247Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpTcGxpdFN0cmluZygKLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudCwKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Q0JDX1FSQ29kZXJNb2RlKiwgQ0ZYX0J5dGVTdHJpbmc+PiogcmVzdWx0KSB7Ci0gIGludDMyX3QgaW5kZXggPSAwLCBmbGFnID0gMDsKLSAgd2hpbGUgKAotICAgICAgKCgodWludDhfdCljb250ZW50W2luZGV4XSA+PSAweEExICYmICh1aW50OF90KWNvbnRlbnRbaW5kZXhdIDw9IDB4QUEpIHx8Ci0gICAgICAgKCh1aW50OF90KWNvbnRlbnRbaW5kZXhdID49IDB4QjAgJiYgKHVpbnQ4X3QpY29udGVudFtpbmRleF0gPD0gMHhGQSkpICYmCi0gICAgICAoaW5kZXggPCBjb250ZW50LkdldExlbmd0aCgpKSkgewotICAgIGluZGV4ICs9IDI7Ci0gIH0KLSAgaWYgKGluZGV4ICE9IGZsYWcpIHsKLSAgICByZXN1bHQtPnB1c2hfYmFjayh7Q0JDX1FSQ29kZXJNb2RlOjpzR0JLLCBjb250ZW50Lk1pZChmbGFnLCBpbmRleCAtIGZsYWcpfSk7Ci0gIH0KLSAgZmxhZyA9IGluZGV4OwotICBpZiAoaW5kZXggPj0gY29udGVudC5HZXRMZW5ndGgoKSkgewotICAgIHJldHVybjsKLSAgfQotICB3aGlsZSAoCi0gICAgICBHZXRBbHBoYU51bWVyaWNDb2RlKCh1aW50OF90KWNvbnRlbnRbaW5kZXhdKSA9PSAtMSAmJgotICAgICAgISgoKHVpbnQ4X3QpY29udGVudFtpbmRleF0gPj0gMHhBMSAmJiAodWludDhfdCljb250ZW50W2luZGV4XSA8PSAweEFBKSB8fAotICAgICAgICAoKHVpbnQ4X3QpY29udGVudFtpbmRleF0gPj0gMHhCMCAmJiAodWludDhfdCljb250ZW50W2luZGV4XSA8PSAweEZBKSkgJiYKLSAgICAgIChpbmRleCA8IGNvbnRlbnQuR2V0TGVuZ3RoKCkpKSB7Ci0jaWYgX0ZYTV9QTEFURk9STV8gPT0gX0ZYTV9QTEFURk9STV9XSU5ET1dTXwotICAgIGlmIChJc0RCQ1NMZWFkQnl0ZSgodWludDhfdCljb250ZW50W2luZGV4XSkpCi0jZWxzZQotICAgIGlmICgodWludDhfdCljb250ZW50W2luZGV4XSA+IDEyNykKLSNlbmRpZgotICAgIHsKLSAgICAgIGluZGV4ICs9IDI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGluZGV4Kys7Ci0gICAgfQotICB9Ci0gIGlmIChpbmRleCAhPSBmbGFnKSB7Ci0gICAgcmVzdWx0LT5wdXNoX2JhY2soCi0gICAgICAgIHtDQkNfUVJDb2Rlck1vZGU6OnNCWVRFLCBjb250ZW50Lk1pZChmbGFnLCBpbmRleCAtIGZsYWcpfSk7Ci0gIH0KLSAgZmxhZyA9IGluZGV4OwotICBpZiAoaW5kZXggPj0gY29udGVudC5HZXRMZW5ndGgoKSkgewotICAgIHJldHVybjsKLSAgfQotICB3aGlsZSAoRlhTWVNfSXNkaWdpdCgodWludDhfdCljb250ZW50W2luZGV4XSkgJiYKLSAgICAgICAgIChpbmRleCA8IGNvbnRlbnQuR2V0TGVuZ3RoKCkpKSB7Ci0gICAgaW5kZXgrKzsKLSAgfQotICBpZiAoaW5kZXggIT0gZmxhZykgewotICAgIHJlc3VsdC0+cHVzaF9iYWNrKAotICAgICAgICB7Q0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQywgY29udGVudC5NaWQoZmxhZywgaW5kZXggLSBmbGFnKX0pOwotICB9Ci0gIGZsYWcgPSBpbmRleDsKLSAgaWYgKGluZGV4ID49IGNvbnRlbnQuR2V0TGVuZ3RoKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgd2hpbGUgKEdldEFscGhhTnVtZXJpY0NvZGUoKHVpbnQ4X3QpY29udGVudFtpbmRleF0pICE9IC0xICYmCi0gICAgICAgICAoaW5kZXggPCBjb250ZW50LkdldExlbmd0aCgpKSkgewotICAgIGluZGV4Kys7Ci0gIH0KLSAgaWYgKGluZGV4ICE9IGZsYWcpIHsKLSAgICByZXN1bHQtPnB1c2hfYmFjaygKLSAgICAgICAge0NCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQywgY29udGVudC5NaWQoZmxhZywgaW5kZXggLSBmbGFnKX0pOwotICB9Ci0gIGZsYWcgPSBpbmRleDsKLSAgaWYgKGluZGV4IDwgY29udGVudC5HZXRMZW5ndGgoKSkKLSAgICBTcGxpdFN0cmluZyhjb250ZW50Lk1pZChpbmRleCwgY29udGVudC5HZXRMZW5ndGgoKSAtIGluZGV4KSwgcmVzdWx0KTsKLX0KLQotaW50MzJfdCBDQkNfUVJDb2RlckVuY29kZXI6OkdldFNwYW5CeVZlcnNpb24oQ0JDX1FSQ29kZXJNb2RlKiBtb2RlRmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2Rlck1vZGUqIG1vZGVTZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZlcnNpb25OdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGlmICh2ZXJzaW9uTnVtID09IDApCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKG1vZGVGaXJzdCA9PSBDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUMgJiYKLSAgICAgIG1vZGVTZWNvbmQgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURSkgewotICAgIGlmICh2ZXJzaW9uTnVtID49IDEgJiYgdmVyc2lvbk51bSA8PSA5KQotICAgICAgcmV0dXJuIDExOwotICAgIGlmICh2ZXJzaW9uTnVtID49IDEwICYmIHZlcnNpb25OdW0gPD0gMjYpCi0gICAgICByZXR1cm4gMTU7Ci0gICAgaWYgKHZlcnNpb25OdW0gPj0gMjcgJiYgdmVyc2lvbk51bSA8PSA0MCkKLSAgICAgIHJldHVybiAxNjsKLSAgICBlID0gQkNFeGNlcHRpb25Ob1N1Y2hWZXJzaW9uOwotICAgIHJldHVybiAwOwotICB9Ci0gIGlmIChtb2RlU2Vjb25kID09IENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQyAmJgotICAgICAgbW9kZUZpcnN0ID09IENCQ19RUkNvZGVyTW9kZTo6c05VTUVSSUMpIHsKLSAgICBpZiAodmVyc2lvbk51bSA+PSAxICYmIHZlcnNpb25OdW0gPD0gOSkKLSAgICAgIHJldHVybiAxMzsKLSAgICBpZiAodmVyc2lvbk51bSA+PSAxMCAmJiB2ZXJzaW9uTnVtIDw9IDI2KQotICAgICAgcmV0dXJuIDE1OwotICAgIGlmICh2ZXJzaW9uTnVtID49IDI3ICYmIHZlcnNpb25OdW0gPD0gNDApCi0gICAgICByZXR1cm4gMTc7Ci0gICAgZSA9IEJDRXhjZXB0aW9uTm9TdWNoVmVyc2lvbjsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAobW9kZVNlY29uZCA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFICYmCi0gICAgICBtb2RlRmlyc3QgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQykgewotICAgIGlmICh2ZXJzaW9uTnVtID49IDEgJiYgdmVyc2lvbk51bSA8PSA5KQotICAgICAgcmV0dXJuIDY7Ci0gICAgaWYgKHZlcnNpb25OdW0gPj0gMTAgJiYgdmVyc2lvbk51bSA8PSAyNikKLSAgICAgIHJldHVybiA4OwotICAgIGlmICh2ZXJzaW9uTnVtID49IDI3ICYmIHZlcnNpb25OdW0gPD0gNDApCi0gICAgICByZXR1cm4gOTsKLSAgICBlID0gQkNFeGNlcHRpb25Ob1N1Y2hWZXJzaW9uOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiAtMTsKLX0KLQotdm9pZCBDQkNfUVJDb2RlckVuY29kZXI6Ok1lcmdlU3RyaW5nKAotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDQkNfUVJDb2Rlck1vZGUqLCBDRlhfQnl0ZVN0cmluZz4+KiByZXN1bHQsCi0gICAgaW50MzJfdCB2ZXJzaW9uTnVtLAotICAgIGludDMyX3QmIGUpIHsKLSAgc2l6ZV90IG1lcmdlTnVtID0gMDsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgKyAxIDwgcmVzdWx0LT5zaXplKCk7IGkrKykgewotICAgIGF1dG8gZWxlbWVudDEgPSAmKCpyZXN1bHQpW2ldOwotICAgIGF1dG8gZWxlbWVudDIgPSAmKCpyZXN1bHQpW2kgKyAxXTsKLSAgICBpZiAoZWxlbWVudDEtPmZpcnN0ID09IENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQykgewotICAgICAgaW50MzJfdCB0bXAgPSBHZXRTcGFuQnlWZXJzaW9uKENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFLCB2ZXJzaW9uTnVtLCBlKTsKLSAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICAgIHJldHVybjsKLSAgICAgIGlmIChlbGVtZW50Mi0+Zmlyc3QgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURSAmJgotICAgICAgICAgIGVsZW1lbnQxLT5zZWNvbmQuR2V0TGVuZ3RoKCkgPCB0bXApIHsKLSAgICAgICAgZWxlbWVudDItPnNlY29uZCA9IGVsZW1lbnQxLT5zZWNvbmQgKyBlbGVtZW50Mi0+c2Vjb25kOwotICAgICAgICByZXN1bHQtPmVyYXNlKHJlc3VsdC0+YmVnaW4oKSArIGkpOwotICAgICAgICBpLS07Ci0gICAgICAgIG1lcmdlTnVtKys7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChlbGVtZW50MS0+Zmlyc3QgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURSkgewotICAgICAgaWYgKGVsZW1lbnQyLT5maXJzdCA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFKSB7Ci0gICAgICAgIGVsZW1lbnQxLT5zZWNvbmQgKz0gZWxlbWVudDItPnNlY29uZDsKLSAgICAgICAgcmVzdWx0LT5lcmFzZShyZXN1bHQtPmJlZ2luKCkgKyBpICsgMSk7Ci0gICAgICAgIGktLTsKLSAgICAgICAgbWVyZ2VOdW0rKzsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGVsZW1lbnQxLT5maXJzdCA9PSBDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDKSB7Ci0gICAgICBpbnQzMl90IHRtcCA9IEdldFNwYW5CeVZlcnNpb24oQ0JDX1FSQ29kZXJNb2RlOjpzTlVNRVJJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFLCB2ZXJzaW9uTnVtLCBlKTsKLSAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICAgIHJldHVybjsKLSAgICAgIGlmIChlbGVtZW50Mi0+Zmlyc3QgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURSAmJgotICAgICAgICAgIGVsZW1lbnQxLT5zZWNvbmQuR2V0TGVuZ3RoKCkgPCB0bXApIHsKLSAgICAgICAgZWxlbWVudDItPnNlY29uZCA9IGVsZW1lbnQxLT5zZWNvbmQgKyBlbGVtZW50Mi0+c2Vjb25kOwotICAgICAgICByZXN1bHQtPmVyYXNlKHJlc3VsdC0+YmVnaW4oKSArIGkpOwotICAgICAgICBpLS07Ci0gICAgICAgIG1lcmdlTnVtKys7Ci0gICAgICB9Ci0gICAgICB0bXAgPSBHZXRTcGFuQnlWZXJzaW9uKENCQ19RUkNvZGVyTW9kZTo6c05VTUVSSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQywgdmVyc2lvbk51bSwgZSk7Ci0gICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgICByZXR1cm47Ci0gICAgICBpZiAoZWxlbWVudDItPmZpcnN0ID09IENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQyAmJgotICAgICAgICAgIGVsZW1lbnQxLT5zZWNvbmQuR2V0TGVuZ3RoKCkgPCB0bXApIHsKLSAgICAgICAgZWxlbWVudDItPnNlY29uZCA9IGVsZW1lbnQxLT5zZWNvbmQgKyBlbGVtZW50Mi0+c2Vjb25kOwotICAgICAgICByZXN1bHQtPmVyYXNlKHJlc3VsdC0+YmVnaW4oKSArIGkpOwotICAgICAgICBpLS07Ci0gICAgICAgIG1lcmdlTnVtKys7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGlmIChtZXJnZU51bSA9PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIE1lcmdlU3RyaW5nKHJlc3VsdCwgdmVyc2lvbk51bSwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotfQotCi12b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6SW5pdFFSQ29kZShpbnQzMl90IG51bUlucHV0Qnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZlcnNpb25OdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXIqIHFyQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgcXJDb2RlLT5TZXRFQ0xldmVsKGVjTGV2ZWwpOwotICBxckNvZGUtPlNldE1vZGUobW9kZSk7Ci0gIENCQ19RUkNvZGVyVmVyc2lvbiogdmVyc2lvbiA9Ci0gICAgICBDQkNfUVJDb2RlclZlcnNpb246OkdldFZlcnNpb25Gb3JOdW1iZXIodmVyc2lvbk51bWJlciwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotICBpbnQzMl90IG51bUJ5dGVzID0gdmVyc2lvbi0+R2V0VG90YWxDb2RlV29yZHMoKTsKLSAgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyogZWNCbG9ja3MgPSB2ZXJzaW9uLT5HZXRFQ0Jsb2Nrc0ZvckxldmVsKGVjTGV2ZWwpOwotICBpbnQzMl90IG51bUVjQnl0ZXMgPSBlY0Jsb2Nrcy0+R2V0VG90YWxFQ0NvZGVXb3JkcygpOwotICBpbnQzMl90IG51bVJTQmxvY2tzID0gZWNCbG9ja3MtPkdldE51bUJsb2NrcygpOwotICBpbnQzMl90IG51bURhdGFCeXRlcyA9IG51bUJ5dGVzIC0gbnVtRWNCeXRlczsKLSAgaWYgKG51bURhdGFCeXRlcyA8IG51bUlucHV0Qnl0ZXMgKyAzKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uQ2Fubm90RmluZEJsb2NrSW5mbzsKLSAgICByZXR1cm47Ci0gIH0KLSAgcXJDb2RlLT5TZXRWZXJzaW9uKHZlcnNpb25OdW1iZXIpOwotICBxckNvZGUtPlNldE51bVRvdGFsQnl0ZXMobnVtQnl0ZXMpOwotICBxckNvZGUtPlNldE51bURhdGFCeXRlcyhudW1EYXRhQnl0ZXMpOwotICBxckNvZGUtPlNldE51bVJTQmxvY2tzKG51bVJTQmxvY2tzKTsKLSAgcXJDb2RlLT5TZXROdW1FQ0J5dGVzKG51bUVjQnl0ZXMpOwotICBxckNvZGUtPlNldE1hdHJpeFdpZHRoKHZlcnNpb24tPkdldERpbWVuc2lvbkZvclZlcnNpb24oKSk7Ci19Ci0KLXZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpFbmNvZGVXaXRoU3BlY2lmeVZlcnNpb24oCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsCi0gICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwKLSAgICBDQkNfUVJDb2RlciogcXJDb2RlLAotICAgIGludDMyX3QgdmVyc2lvblNwZWNpZnksCi0gICAgaW50MzJfdCYgZSkgewotICBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZyA9ICJ1dGY4IjsKLSAgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlID0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPENCQ19RUkNvZGVyTW9kZSosIENGWF9CeXRlU3RyaW5nPj4gc3BsaXRSZXN1bHQ7Ci0gIENCQ19RUkNvZGVyQml0VmVjdG9yIGRhdGFCaXRzOwotICBkYXRhQml0cy5Jbml0KCk7Ci0gIFNwbGl0U3RyaW5nKGNvbnRlbnQsICZzcGxpdFJlc3VsdCk7Ci0gIE1lcmdlU3RyaW5nKCZzcGxpdFJlc3VsdCwgdmVyc2lvblNwZWNpZnksIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybjsKLSAgQ0JDX1FSQ29kZXJNb2RlKiB0ZW1wTW9kZSA9IG51bGxwdHI7Ci0gIGZvciAoY29uc3QgYXV0byYgcmVzdWx0IDogc3BsaXRSZXN1bHQpIHsKLSAgICBBcHBlbmRCeXRlcyhyZXN1bHQuc2Vjb25kLCByZXN1bHQuZmlyc3QsICZkYXRhQml0cywgZW5jb2RpbmcsIGUpOwotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICByZXR1cm47Ci0gIH0KLSAgaW50MzJfdCBudW1JbnB1dEJ5dGVzID0gZGF0YUJpdHMuc2l6ZUluQnl0ZXMoKTsKLSAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgaGVhZGVyQW5kRGF0YUJpdHM7Ci0gIGhlYWRlckFuZERhdGFCaXRzLkluaXQoKTsKLSAgSW5pdFFSQ29kZShudW1JbnB1dEJ5dGVzLCB2ZXJzaW9uU3BlY2lmeSwgZWNMZXZlbCwgbW9kZSwgcXJDb2RlLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm47Ci0KLSAgQXBwZW5kRGF0YU1vZGVMZW5naEluZm8oc3BsaXRSZXN1bHQsIGhlYWRlckFuZERhdGFCaXRzLCB0ZW1wTW9kZSwgcXJDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotCi0gIG51bUlucHV0Qnl0ZXMgPSBoZWFkZXJBbmREYXRhQml0cy5zaXplSW5CeXRlcygpOwotICBUZXJtaW5hdGVCaXRzKHFyQ29kZS0+R2V0TnVtRGF0YUJ5dGVzKCksICZoZWFkZXJBbmREYXRhQml0cywgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotCi0gIENCQ19RUkNvZGVyQml0VmVjdG9yIGZpbmFsQml0czsKLSAgZmluYWxCaXRzLkluaXQoKTsKLSAgSW50ZXJsZWF2ZVdpdGhFQ0J5dGVzKCZoZWFkZXJBbmREYXRhQml0cywgcXJDb2RlLT5HZXROdW1Ub3RhbEJ5dGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBxckNvZGUtPkdldE51bURhdGFCeXRlcygpLCBxckNvZGUtPkdldE51bVJTQmxvY2tzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAmZmluYWxCaXRzLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm47Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENCQ19Db21tb25CeXRlTWF0cml4PiBtYXRyaXgobmV3IENCQ19Db21tb25CeXRlTWF0cml4KAotICAgICAgcXJDb2RlLT5HZXRNYXRyaXhXaWR0aCgpLCBxckNvZGUtPkdldE1hdHJpeFdpZHRoKCkpKTsKLSAgbWF0cml4LT5Jbml0KCk7Ci0gIGludDMyX3QgbWFza1BhdHRlcm4gPSBDaG9vc2VNYXNrUGF0dGVybigKLSAgICAgICZmaW5hbEJpdHMsIHFyQ29kZS0+R2V0RUNMZXZlbCgpLCBxckNvZGUtPkdldFZlcnNpb24oKSwgbWF0cml4LmdldCgpLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm47Ci0KLSAgcXJDb2RlLT5TZXRNYXNrUGF0dGVybihtYXNrUGF0dGVybik7Ci0gIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6QnVpbGRNYXRyaXgoJmZpbmFsQml0cywgcXJDb2RlLT5HZXRFQ0xldmVsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXJDb2RlLT5HZXRWZXJzaW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXJDb2RlLT5HZXRNYXNrUGF0dGVybigpLCBtYXRyaXguZ2V0KCksIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybjsKLQotICBxckNvZGUtPlNldE1hdHJpeChzdGQ6Om1vdmUobWF0cml4KSk7Ci0gIGlmICghcXJDb2RlLT5Jc1ZhbGlkKCkpCi0gICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZFFSQ29kZTsKLX0KLQotdm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkVuY29kZVdpdGhBdXRvVmVyc2lvbigKLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudCwKLSAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLAotICAgIENCQ19RUkNvZGVyKiBxckNvZGUsCi0gICAgaW50MzJfdCYgZSkgewotICBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZyA9ICJ1dGY4IjsKLSAgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlID0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPENCQ19RUkNvZGVyTW9kZSosIENGWF9CeXRlU3RyaW5nPj4gc3BsaXRSZXN1bHQ7Ci0gIENCQ19RUkNvZGVyQml0VmVjdG9yIGRhdGFCaXRzOwotICBkYXRhQml0cy5Jbml0KCk7Ci0gIFNwbGl0U3RyaW5nKGNvbnRlbnQsICZzcGxpdFJlc3VsdCk7Ci0gIE1lcmdlU3RyaW5nKCZzcGxpdFJlc3VsdCwgOCwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotICBDQkNfUVJDb2Rlck1vZGUqIHRlbXBNb2RlID0gbnVsbHB0cjsKLSAgZm9yIChjb25zdCBhdXRvJiByZXN1bHQgOiBzcGxpdFJlc3VsdCkgewotICAgIEFwcGVuZEJ5dGVzKHJlc3VsdC5zZWNvbmQsIHJlc3VsdC5maXJzdCwgJmRhdGFCaXRzLCBlbmNvZGluZywgZSk7Ci0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IG51bUlucHV0Qnl0ZXMgPSBkYXRhQml0cy5zaXplSW5CeXRlcygpOwotICBJbml0UVJDb2RlKG51bUlucHV0Qnl0ZXMsIGVjTGV2ZWwsIG1vZGUsIHFyQ29kZSwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotICBDQkNfUVJDb2RlckJpdFZlY3RvciBoZWFkZXJBbmREYXRhQml0czsKLSAgaGVhZGVyQW5kRGF0YUJpdHMuSW5pdCgpOwotICB0ZW1wTW9kZSA9IG51bGxwdHI7Ci0gIGludDMyX3QgdmVyc2lvbk51bSA9IHFyQ29kZS0+R2V0VmVyc2lvbigpOwotc2lnbjoKLSAgQXBwZW5kRGF0YU1vZGVMZW5naEluZm8oc3BsaXRSZXN1bHQsIGhlYWRlckFuZERhdGFCaXRzLCB0ZW1wTW9kZSwgcXJDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsKLSAgICBnb3RvIGNhdGNoRXhjZXB0aW9uOwotICB9Ci0gIG51bUlucHV0Qnl0ZXMgPSBoZWFkZXJBbmREYXRhQml0cy5zaXplSW5CeXRlcygpOwotICBUZXJtaW5hdGVCaXRzKHFyQ29kZS0+R2V0TnVtRGF0YUJ5dGVzKCksICZoZWFkZXJBbmREYXRhQml0cywgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pIHsKLSAgICBnb3RvIGNhdGNoRXhjZXB0aW9uOwotICB9Ci1jYXRjaEV4Y2VwdGlvbjoKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykgewotICAgIGludDMyX3QgZTEgPSBCQ0V4Y2VwdGlvbk5POwotICAgIEluaXRRUkNvZGUobnVtSW5wdXRCeXRlcywgZWNMZXZlbCwgbW9kZSwgcXJDb2RlLCBlMSk7Ci0gICAgaWYgKGUxICE9IEJDRXhjZXB0aW9uTk8pIHsKLSAgICAgIGUgPSBlMTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdmVyc2lvbk51bSsrOwotICAgIGlmICh2ZXJzaW9uTnVtIDw9IDQwKSB7Ci0gICAgICBoZWFkZXJBbmREYXRhQml0cy5DbGVhcigpOwotICAgICAgZSA9IEJDRXhjZXB0aW9uTk87Ci0gICAgICBnb3RvIHNpZ247Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICBDQkNfUVJDb2RlckJpdFZlY3RvciBmaW5hbEJpdHM7Ci0gIGZpbmFsQml0cy5Jbml0KCk7Ci0gIEludGVybGVhdmVXaXRoRUNCeXRlcygmaGVhZGVyQW5kRGF0YUJpdHMsIHFyQ29kZS0+R2V0TnVtVG90YWxCeXRlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgcXJDb2RlLT5HZXROdW1EYXRhQnl0ZXMoKSwgcXJDb2RlLT5HZXROdW1SU0Jsb2NrcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgJmZpbmFsQml0cywgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDQkNfQ29tbW9uQnl0ZU1hdHJpeD4gbWF0cml4KG5ldyBDQkNfQ29tbW9uQnl0ZU1hdHJpeCgKLSAgICAgIHFyQ29kZS0+R2V0TWF0cml4V2lkdGgoKSwgcXJDb2RlLT5HZXRNYXRyaXhXaWR0aCgpKSk7Ci0gIG1hdHJpeC0+SW5pdCgpOwotICBpbnQzMl90IG1hc2tQYXR0ZXJuID0gQ2hvb3NlTWFza1BhdHRlcm4oCi0gICAgICAmZmluYWxCaXRzLCBxckNvZGUtPkdldEVDTGV2ZWwoKSwgcXJDb2RlLT5HZXRWZXJzaW9uKCksIG1hdHJpeC5nZXQoKSwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotCi0gIHFyQ29kZS0+U2V0TWFza1BhdHRlcm4obWFza1BhdHRlcm4pOwotICBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkJ1aWxkTWF0cml4KCZmaW5hbEJpdHMsIHFyQ29kZS0+R2V0RUNMZXZlbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFyQ29kZS0+R2V0VmVyc2lvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFyQ29kZS0+R2V0TWFza1BhdHRlcm4oKSwgbWF0cml4LmdldCgpLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gcXJDb2RlLT5TZXRNYXRyaXgoc3RkOjptb3ZlKG1hdHJpeCkpOwotCi0gIGlmICghcXJDb2RlLT5Jc1ZhbGlkKCkpCi0gICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZFFSQ29kZTsKLX0KLQotdm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkVuY29kZShjb25zdCBDRlhfV2lkZVN0cmluZyYgY29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXIqIHFyQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZyA9ICJ1dGY4IjsKLSAgQ0ZYX0J5dGVTdHJpbmcgdXRmOERhdGE7Ci0gIENCQ19VdGlsQ29kaW5nQ29udmVydDo6VW5pY29kZVRvVVRGOChjb250ZW50LCB1dGY4RGF0YSk7Ci0gIENCQ19RUkNvZGVyTW9kZSogbW9kZSA9IENob29zZU1vZGUodXRmOERhdGEsIGVuY29kaW5nKTsKLSAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgZGF0YUJpdHM7Ci0gIGRhdGFCaXRzLkluaXQoKTsKLSAgQXBwZW5kQnl0ZXModXRmOERhdGEsIG1vZGUsICZkYXRhQml0cywgZW5jb2RpbmcsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybjsKLSAgaW50MzJfdCBudW1JbnB1dEJ5dGVzID0gZGF0YUJpdHMuc2l6ZUluQnl0ZXMoKTsKLSAgSW5pdFFSQ29kZShudW1JbnB1dEJ5dGVzLCBlY0xldmVsLCBtb2RlLCBxckNvZGUsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybjsKLSAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgaGVhZGVyQW5kRGF0YUJpdHM7Ci0gIGhlYWRlckFuZERhdGFCaXRzLkluaXQoKTsKLSAgQXBwZW5kTW9kZUluZm8obW9kZSwgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm47Ci0gIGludDMyX3QgbnVtTGV0dGVycyA9IG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzQllURSA/IGRhdGFCaXRzLnNpemVJbkJ5dGVzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29udGVudC5HZXRMZW5ndGgoKTsKLSAgQXBwZW5kTGVuZ3RoSW5mbyhudW1MZXR0ZXJzLCBxckNvZGUtPkdldFZlcnNpb24oKSwgbW9kZSwgJmhlYWRlckFuZERhdGFCaXRzLAotICAgICAgICAgICAgICAgICAgIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybjsKLSAgaGVhZGVyQW5kRGF0YUJpdHMuQXBwZW5kQml0VmVjdG9yKCZkYXRhQml0cywgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIFRlcm1pbmF0ZUJpdHMocXJDb2RlLT5HZXROdW1EYXRhQnl0ZXMoKSwgJmhlYWRlckFuZERhdGFCaXRzLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm47Ci0gIENCQ19RUkNvZGVyQml0VmVjdG9yIGZpbmFsQml0czsKLSAgZmluYWxCaXRzLkluaXQoKTsKLSAgSW50ZXJsZWF2ZVdpdGhFQ0J5dGVzKCZoZWFkZXJBbmREYXRhQml0cywgcXJDb2RlLT5HZXROdW1Ub3RhbEJ5dGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBxckNvZGUtPkdldE51bURhdGFCeXRlcygpLCBxckNvZGUtPkdldE51bVJTQmxvY2tzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAmZmluYWxCaXRzLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm47Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENCQ19Db21tb25CeXRlTWF0cml4PiBtYXRyaXgobmV3IENCQ19Db21tb25CeXRlTWF0cml4KAotICAgICAgcXJDb2RlLT5HZXRNYXRyaXhXaWR0aCgpLCBxckNvZGUtPkdldE1hdHJpeFdpZHRoKCkpKTsKLSAgbWF0cml4LT5Jbml0KCk7Ci0gIGludDMyX3QgbWFza1BhdHRlcm4gPSBDaG9vc2VNYXNrUGF0dGVybigKLSAgICAgICZmaW5hbEJpdHMsIHFyQ29kZS0+R2V0RUNMZXZlbCgpLCBxckNvZGUtPkdldFZlcnNpb24oKSwgbWF0cml4LmdldCgpLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm47Ci0KLSAgcXJDb2RlLT5TZXRNYXNrUGF0dGVybihtYXNrUGF0dGVybik7Ci0gIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6QnVpbGRNYXRyaXgoJmZpbmFsQml0cywgcXJDb2RlLT5HZXRFQ0xldmVsKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXJDb2RlLT5HZXRWZXJzaW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXJDb2RlLT5HZXRNYXNrUGF0dGVybigpLCBtYXRyaXguZ2V0KCksIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBxckNvZGUtPlNldE1hdHJpeChzdGQ6Om1vdmUobWF0cml4KSk7Ci0KLSAgaWYgKCFxckNvZGUtPklzVmFsaWQoKSkKLSAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkUVJDb2RlOwotfQotCi12b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6VGVybWluYXRlQml0cyhpbnQzMl90IG51bURhdGFCeXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBpbnQzMl90IGNhcGFjaXR5ID0gbnVtRGF0YUJ5dGVzIDw8IDM7Ci0gIGlmIChiaXRzLT5TaXplKCkgPiBjYXBhY2l0eSkgewotICAgIGUgPSBCQ0V4Y2VwdGlvbkRhdGFUb29NYW55OwotICAgIHJldHVybjsKLSAgfQotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA0ICYmIGJpdHMtPlNpemUoKSA8IGNhcGFjaXR5OyArK2kpIHsKLSAgICBiaXRzLT5BcHBlbmRCaXQoMCwgZSk7Ci0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IG51bUJpdHNJbkxhc3RCeXRlID0gYml0cy0+U2l6ZSgpICUgODsKLSAgaWYgKG51bUJpdHNJbkxhc3RCeXRlID4gMCkgewotICAgIGludDMyX3QgbnVtUGFkZGluZ0JpdHMgPSA4IC0gbnVtQml0c0luTGFzdEJ5dGU7Ci0gICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbnVtUGFkZGluZ0JpdHM7ICsraikgewotICAgICAgYml0cy0+QXBwZW5kQml0KDAsIGUpOwotICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICBpZiAoYml0cy0+U2l6ZSgpICUgOCAhPSAwKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uRGlnaXRMZW5ndGhNdXN0QmU4OwotICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IG51bVBhZGRpbmdCeXRlcyA9IG51bURhdGFCeXRlcyAtIGJpdHMtPnNpemVJbkJ5dGVzKCk7Ci0gIGZvciAoaW50MzJfdCBrID0gMDsgayA8IG51bVBhZGRpbmdCeXRlczsgKytrKSB7Ci0gICAgaWYgKGsgJSAyID09IDApIHsKLSAgICAgIGJpdHMtPkFwcGVuZEJpdHMoMHhlYywgOCwgZSk7Ci0gICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJpdHMtPkFwcGVuZEJpdHMoMHgxMSwgOCwgZSk7Ci0gICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIGlmIChiaXRzLT5TaXplKCkgIT0gY2FwYWNpdHkpCi0gICAgZSA9IEJDRXhjZXB0aW9uQml0c05vdEVxdWFsQ2FjaXR5OwotfQotCi1pbnQzMl90IENCQ19RUkNvZGVyRW5jb2Rlcjo6Q2hvb3NlTWFza1BhdHRlcm4oCi0gICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsCi0gICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwKLSAgICBpbnQzMl90IHZlcnNpb24sCi0gICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwKLSAgICBpbnQzMl90JiBlKSB7Ci0gIGludDMyX3QgbWluUGVuYWx0eSA9IDY1NTM1OwotICBpbnQzMl90IGJlc3RNYXNrUGF0dGVybiA9IC0xOwotICBmb3IgKGludDMyX3QgbWFza1BhdHRlcm4gPSAwOyBtYXNrUGF0dGVybiA8IENCQ19RUkNvZGVyOjprTnVtTWFza1BhdHRlcm5zOwotICAgICAgIG1hc2tQYXR0ZXJuKyspIHsKLSAgICBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkJ1aWxkTWF0cml4KGJpdHMsIGVjTGV2ZWwsIHZlcnNpb24sIG1hc2tQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LCBlKTsKLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgcmV0dXJuIDA7Ci0gICAgaW50MzJfdCBwZW5hbHR5ID0gQ2FsY3VsYXRlTWFza1BlbmFsdHkobWF0cml4KTsKLSAgICBpZiAocGVuYWx0eSA8IG1pblBlbmFsdHkpIHsKLSAgICAgIG1pblBlbmFsdHkgPSBwZW5hbHR5OwotICAgICAgYmVzdE1hc2tQYXR0ZXJuID0gbWFza1BhdHRlcm47Ci0gICAgfQotICB9Ci0gIHJldHVybiBiZXN0TWFza1BhdHRlcm47Ci19Ci0KLWludDMyX3QgQ0JDX1FSQ29kZXJFbmNvZGVyOjpDYWxjdWxhdGVNYXNrUGVuYWx0eShDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4KSB7Ci0gIGludDMyX3QgcGVuYWx0eSA9IDA7Ci0gIHBlbmFsdHkgKz0gQ0JDX1FSQ29kZXJNYXNrVXRpbDo6QXBwbHlNYXNrUGVuYWx0eVJ1bGUxKG1hdHJpeCk7Ci0gIHBlbmFsdHkgKz0gQ0JDX1FSQ29kZXJNYXNrVXRpbDo6QXBwbHlNYXNrUGVuYWx0eVJ1bGUyKG1hdHJpeCk7Ci0gIHBlbmFsdHkgKz0gQ0JDX1FSQ29kZXJNYXNrVXRpbDo6QXBwbHlNYXNrUGVuYWx0eVJ1bGUzKG1hdHJpeCk7Ci0gIHBlbmFsdHkgKz0gQ0JDX1FSQ29kZXJNYXNrVXRpbDo6QXBwbHlNYXNrUGVuYWx0eVJ1bGU0KG1hdHJpeCk7Ci0gIHJldHVybiBwZW5hbHR5OwotfQotCi1DQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyRW5jb2Rlcjo6Q2hvb3NlTW9kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGVuY29kaW5nKSB7Ci0gIGlmIChlbmNvZGluZy5Db21wYXJlKCJTSElGVF9KSVMiKSA9PSAwKSB7Ci0gICAgcmV0dXJuIENCQ19RUkNvZGVyTW9kZTo6c0tBTkpJOwotICB9Ci0gIGJvb2wgaGFzTnVtZXJpYyA9IGZhbHNlOwotICBib29sIGhhc0FscGhhTnVtZXJpYyA9IGZhbHNlOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb250ZW50LkdldExlbmd0aCgpOyBpKyspIHsKLSAgICBpZiAoaXNkaWdpdCgodWludDhfdCljb250ZW50W2ldKSkgewotICAgICAgaGFzTnVtZXJpYyA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChHZXRBbHBoYU51bWVyaWNDb2RlKCh1aW50OF90KWNvbnRlbnRbaV0pICE9IC0xKSB7Ci0gICAgICBoYXNBbHBoYU51bWVyaWMgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gQ0JDX1FSQ29kZXJNb2RlOjpzQllURTsKLSAgICB9Ci0gIH0KLSAgaWYgKGhhc0FscGhhTnVtZXJpYykgewotICAgIHJldHVybiBDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUM7Ci0gIH0gZWxzZSBpZiAoaGFzTnVtZXJpYykgewotICAgIHJldHVybiBDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDOwotICB9Ci0gIHJldHVybiBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFOwotfQotCi1pbnQzMl90IENCQ19RUkNvZGVyRW5jb2Rlcjo6R2V0QWxwaGFOdW1lcmljQ29kZShpbnQzMl90IGNvZGUpIHsKLSAgcmV0dXJuIChjb2RlID49IDAgJiYgY29kZSA8IDk2KSA/IGdfYWxwaGFOdW1lcmljVGFibGVbY29kZV0gOiAtMTsKLX0KLQotdm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkFwcGVuZEJ5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyTW9kZSogbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGlmIChtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c05VTUVSSUMpCi0gICAgQXBwZW5kTnVtZXJpY0J5dGVzKGNvbnRlbnQsIGJpdHMsIGUpOwotICBlbHNlIGlmIChtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0FMUEhBTlVNRVJJQykKLSAgICBBcHBlbmRBbHBoYU51bWVyaWNCeXRlcyhjb250ZW50LCBiaXRzLCBlKTsKLSAgZWxzZSBpZiAobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNCWVRFKQotICAgIEFwcGVuZDhCaXRCeXRlcyhjb250ZW50LCBiaXRzLCBlbmNvZGluZywgZSk7Ci0gIGVsc2UgaWYgKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzS0FOSkkpCi0gICAgQXBwZW5kS2FuamlCeXRlcyhjb250ZW50LCBiaXRzLCBlKTsKLSAgZWxzZSBpZiAobW9kZSA9PSBDQkNfUVJDb2Rlck1vZGU6OnNHQkspCi0gICAgQXBwZW5kR0JLQnl0ZXMoY29udGVudCwgYml0cywgZSk7Ci0gIGVsc2UKLSAgICBlID0gQkNFeGNlcHRpb25VbnN1cHBvcnRlZE1vZGU7Ci19Ci0KLXZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpBcHBlbmROdW1lcmljQnl0ZXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGludDMyX3QgbGVuZ3RoID0gY29udGVudC5HZXRMZW5ndGgoKTsKLSAgaW50MzJfdCBpID0gMDsKLSAgd2hpbGUgKGkgPCBsZW5ndGgpIHsKLSAgICBpbnQzMl90IG51bTEgPSBjb250ZW50W2ldIC0gJzAnOwotICAgIGlmIChpICsgMiA8IGxlbmd0aCkgewotICAgICAgaW50MzJfdCBudW0yID0gY29udGVudFtpICsgMV0gLSAnMCc7Ci0gICAgICBpbnQzMl90IG51bTMgPSBjb250ZW50W2kgKyAyXSAtICcwJzsKLSAgICAgIGJpdHMtPkFwcGVuZEJpdHMobnVtMSAqIDEwMCArIG51bTIgKiAxMCArIG51bTMsIDEwLCBlKTsKLSAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICAgIHJldHVybjsKLSAgICAgIGkgKz0gMzsKLSAgICB9IGVsc2UgaWYgKGkgKyAxIDwgbGVuZ3RoKSB7Ci0gICAgICBpbnQzMl90IG51bTIgPSBjb250ZW50W2kgKyAxXSAtICcwJzsKLSAgICAgIGJpdHMtPkFwcGVuZEJpdHMobnVtMSAqIDEwICsgbnVtMiwgNywgZSk7Ci0gICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgICByZXR1cm47Ci0gICAgICBpICs9IDI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJpdHMtPkFwcGVuZEJpdHMobnVtMSwgNCwgZSk7Ci0gICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgICByZXR1cm47Ci0gICAgICBpKys7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpBcHBlbmRBbHBoYU51bWVyaWNCeXRlcyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGludDMyX3QgbGVuZ3RoID0gY29udGVudC5HZXRMZW5ndGgoKTsKLSAgaW50MzJfdCBpID0gMDsKLSAgd2hpbGUgKGkgPCBsZW5ndGgpIHsKLSAgICBpbnQzMl90IGNvZGUxID0gR2V0QWxwaGFOdW1lcmljQ29kZShjb250ZW50W2ldKTsKLSAgICBpZiAoY29kZTEgPT0gLTEpIHsKLSAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVDaGFyYWN0ZXI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChpICsgMSA8IGxlbmd0aCkgewotICAgICAgaW50MzJfdCBjb2RlMiA9IEdldEFscGhhTnVtZXJpY0NvZGUoY29udGVudFtpICsgMV0pOwotICAgICAgaWYgKGNvZGUyID09IC0xKSB7Ci0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVDaGFyYWN0ZXI7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGJpdHMtPkFwcGVuZEJpdHMoY29kZTEgKiA0NSArIGNvZGUyLCAxMSwgZSk7Ci0gICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgICByZXR1cm47Ci0gICAgICBpICs9IDI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJpdHMtPkFwcGVuZEJpdHMoY29kZTEsIDYsIGUpOwotICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgICAgcmV0dXJuOwotICAgICAgaSsrOwotICAgIH0KLSAgfQotfQotCi12b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6QXBwZW5kR0JLQnl0ZXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBpbnQzMl90IGxlbmd0aCA9IGNvbnRlbnQuR2V0TGVuZ3RoKCk7Ci0gIHVpbnQzMl90IHZhbHVlID0gMDsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDIpIHsKLSAgICB2YWx1ZSA9ICh1aW50MzJfdCkoKHVpbnQ4X3QpY29udGVudFtpXSA8PCA4IHwgKHVpbnQ4X3QpY29udGVudFtpICsgMV0pOwotICAgIGlmICh2YWx1ZSA8PSAweEFBRkUgJiYgdmFsdWUgPj0gMHhBMUExKSB7Ci0gICAgICB2YWx1ZSAtPSAweEExQTE7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZSA8PSAweEZBRkUgJiYgdmFsdWUgPj0gMHhCMEExKSB7Ci0gICAgICB2YWx1ZSAtPSAweEE2QTE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVDaGFyYWN0ZXI7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHZhbHVlID0gKHVpbnQzMl90KSgodmFsdWUgPj4gOCkgKiAweDYwKSArICh1aW50MzJfdCkodmFsdWUgJiAweGZmKTsKLSAgICBiaXRzLT5BcHBlbmRCaXRzKHZhbHVlLCAxMywgZSk7Ci0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgIHJldHVybjsKLSAgfQotfQotCi12b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6QXBwZW5kOEJpdEJ5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcgZW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY29udGVudC5HZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgYml0cy0+QXBwZW5kQml0cyhjb250ZW50W2ldLCA4LCBlKTsKLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgcmV0dXJuOwotICB9Ci19Ci0KLXZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpBcHBlbmQ4Qml0Qnl0ZXMoQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdD4mIGJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBieXRlcy5HZXRTaXplKCk7IGkrKykgewotICAgIGJpdHMtPkFwcGVuZEJpdHMoYnl0ZXNbaV0sIDgsIGUpOwotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICByZXR1cm47Ci0gIH0KLX0KLQotdm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkFwcGVuZEthbmppQnl0ZXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdD4gYnl0ZXM7Ci0gIHVpbnQzMl90IHZhbHVlID0gMDsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYnl0ZXMuR2V0U2l6ZSgpOyBpICs9IDIpIHsKLSAgICB2YWx1ZSA9ICh1aW50MzJfdCkoKHVpbnQ4X3QpKGNvbnRlbnRbaV0gPDwgOCkgfCAodWludDhfdCljb250ZW50W2kgKyAxXSk7Ci0gICAgaWYgKHZhbHVlIDw9IDB4OWZmYyAmJiB2YWx1ZSA+PSAweDgxNDApIHsKLSAgICAgIHZhbHVlIC09IDB4ODE0MDsKLSAgICB9IGVsc2UgaWYgKHZhbHVlIDw9IDB4ZWJiZiAmJiB2YWx1ZSA+PSAweGUwNDApIHsKLSAgICAgIHZhbHVlIC09IDB4YzE0MDsKLSAgICB9IGVsc2UgewotICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZUNoYXJhY3RlcjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdmFsdWUgPSAodWludDMyX3QpKCh2YWx1ZSA+PiA4KSAqIDB4YzApICsgKHVpbnQzMl90KSh2YWx1ZSAmIDB4ZmYpOwotICAgIGJpdHMtPkFwcGVuZEJpdHModmFsdWUsIDEzLCBlKTsKLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgcmV0dXJuOwotICB9Ci19Ci0KLXZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpJbml0UVJDb2RlKGludDMyX3QgbnVtSW5wdXRCeXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2Rlck1vZGUqIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlciogcXJDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBxckNvZGUtPlNldEVDTGV2ZWwoZWNMZXZlbCk7Ci0gIHFyQ29kZS0+U2V0TW9kZShtb2RlKTsKLSAgZm9yIChpbnQzMl90IHZlcnNpb25OdW0gPSAxOyB2ZXJzaW9uTnVtIDw9IDQwOyB2ZXJzaW9uTnVtKyspIHsKLSAgICBDQkNfUVJDb2RlclZlcnNpb24qIHZlcnNpb24gPQotICAgICAgICBDQkNfUVJDb2RlclZlcnNpb246OkdldFZlcnNpb25Gb3JOdW1iZXIodmVyc2lvbk51bSwgZSk7Ci0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgIHJldHVybjsKLSAgICBpbnQzMl90IG51bUJ5dGVzID0gdmVyc2lvbi0+R2V0VG90YWxDb2RlV29yZHMoKTsKLSAgICBDQkNfUVJDb2RlckVDQmxvY2tzKiBlY0Jsb2NrcyA9IHZlcnNpb24tPkdldEVDQmxvY2tzRm9yTGV2ZWwoZWNMZXZlbCk7Ci0gICAgaW50MzJfdCBudW1FY0J5dGVzID0gZWNCbG9ja3MtPkdldFRvdGFsRUNDb2RlV29yZHMoKTsKLSAgICBpbnQzMl90IG51bVJTQmxvY2tzID0gZWNCbG9ja3MtPkdldE51bUJsb2NrcygpOwotICAgIGludDMyX3QgbnVtRGF0YUJ5dGVzID0gbnVtQnl0ZXMgLSBudW1FY0J5dGVzOwotICAgIGlmIChudW1EYXRhQnl0ZXMgPj0gbnVtSW5wdXRCeXRlcyArIDMpIHsKLSAgICAgIHFyQ29kZS0+U2V0VmVyc2lvbih2ZXJzaW9uTnVtKTsKLSAgICAgIHFyQ29kZS0+U2V0TnVtVG90YWxCeXRlcyhudW1CeXRlcyk7Ci0gICAgICBxckNvZGUtPlNldE51bURhdGFCeXRlcyhudW1EYXRhQnl0ZXMpOwotICAgICAgcXJDb2RlLT5TZXROdW1SU0Jsb2NrcyhudW1SU0Jsb2Nrcyk7Ci0gICAgICBxckNvZGUtPlNldE51bUVDQnl0ZXMobnVtRWNCeXRlcyk7Ci0gICAgICBxckNvZGUtPlNldE1hdHJpeFdpZHRoKHZlcnNpb24tPkdldERpbWVuc2lvbkZvclZlcnNpb24oKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIGUgPSBCQ0V4Y2VwdGlvbkNhbm5vdEZpbmRCbG9ja0luZm87Ci19Ci0KLXZvaWQgQ0JDX1FSQ29kZXJFbmNvZGVyOjpBcHBlbmRNb2RlSW5mbyhDQkNfUVJDb2Rlck1vZGUqIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgewotICBiaXRzLT5BcHBlbmRCaXRzKG1vZGUtPkdldEJpdHMoKSwgNCwgZSk7Ci0gIGlmIChtb2RlID09IENCQ19RUkNvZGVyTW9kZTo6c0dCSykKLSAgICBiaXRzLT5BcHBlbmRCaXRzKDEsIDQsIGUpOwotfQotCi12b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6QXBwZW5kTGVuZ3RoSW5mbyhpbnQzMl90IG51bUxldHRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2Rlck1vZGUqIG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgQ0JDX1FSQ29kZXJWZXJzaW9uKiBxY3YgPSBDQkNfUVJDb2RlclZlcnNpb246OkdldFZlcnNpb25Gb3JOdW1iZXIodmVyc2lvbiwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotICBpbnQzMl90IG51bUJpdHMgPSBtb2RlLT5HZXRDaGFyYWN0ZXJDb3VudEJpdHMocWN2LCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm47Ci0gIGlmIChudW1CaXRzID4gKCgxIDw8IG51bUJpdHMpIC0gMSkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKG1vZGUgPT0gQ0JDX1FSQ29kZXJNb2RlOjpzR0JLKSB7Ci0gICAgYml0cy0+QXBwZW5kQml0cyhudW1MZXR0ZXJzIC8gMiwgbnVtQml0cywgZSk7Ci0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgIHJldHVybjsKLSAgfQotICBiaXRzLT5BcHBlbmRCaXRzKG51bUxldHRlcnMsIG51bUJpdHMsIGUpOwotfQotCi12b2lkIENCQ19RUkNvZGVyRW5jb2Rlcjo6SW50ZXJsZWF2ZVdpdGhFQ0J5dGVzKENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVRvdGFsQnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRGF0YUJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVJTQmxvY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGlmIChiaXRzLT5zaXplSW5CeXRlcygpICE9IG51bURhdGFCeXRlcykgewotICAgIGUgPSBCQ0V4Y2VwdGlvbkJpdHNCeXRlc05vdE1hdGNoOwotICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IGRhdGFCeXRlc09mZnNldCA9IDA7Ci0gIGludDMyX3QgbWF4TnVtRGF0YUJ5dGVzID0gMDsKLSAgaW50MzJfdCBtYXhOdW1FY0J5dGVzID0gMDsKLSAgQ0ZYX0FycmF5VGVtcGxhdGU8Q0JDX1FSQ29kZXJCbG9ja1BhaXIqPiBibG9ja3M7Ci0gIGludDMyX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IG51bVJTQmxvY2tzOyBpKyspIHsKLSAgICBpbnQzMl90IG51bURhdGFCeXRlc0luQmxvY2s7Ci0gICAgaW50MzJfdCBudW1FY0J5dGVzSW5CbG9zazsKLSAgICBHZXROdW1EYXRhQnl0ZXNBbmROdW1FQ0J5dGVzRm9yQmxvY2tJRChudW1Ub3RhbEJ5dGVzLCBudW1EYXRhQnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtUlNCbG9ja3MsIGksIG51bURhdGFCeXRlc0luQmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRWNCeXRlc0luQmxvc2spOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxDQkNfQ29tbW9uQnl0ZUFycmF5PiBkYXRhQnl0ZXMobmV3IENCQ19Db21tb25CeXRlQXJyYXkpOwotICAgIGRhdGFCeXRlcy0+U2V0KGJpdHMtPkdldEFycmF5KCksIGRhdGFCeXRlc09mZnNldCwgbnVtRGF0YUJ5dGVzSW5CbG9jayk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENCQ19Db21tb25CeXRlQXJyYXk+IGVjQnl0ZXMoCi0gICAgICAgIEdlbmVyYXRlRUNCeXRlcyhkYXRhQnl0ZXMuZ2V0KCksIG51bUVjQnl0ZXNJbkJsb3NrLCBlKSk7Ci0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgIHJldHVybjsKLSAgICBtYXhOdW1EYXRhQnl0ZXMgPSBzdGQ6Om1heChtYXhOdW1EYXRhQnl0ZXMsIGRhdGFCeXRlcy0+U2l6ZSgpKTsKLSAgICBtYXhOdW1FY0J5dGVzID0gc3RkOjptYXgobWF4TnVtRWNCeXRlcywgZWNCeXRlcy0+U2l6ZSgpKTsKLSAgICBibG9ja3MuQWRkKAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJCbG9ja1BhaXIoc3RkOjptb3ZlKGRhdGFCeXRlcyksIHN0ZDo6bW92ZShlY0J5dGVzKSkpOwotICAgIGRhdGFCeXRlc09mZnNldCArPSBudW1EYXRhQnl0ZXNJbkJsb2NrOwotICB9Ci0gIGlmIChudW1EYXRhQnl0ZXMgIT0gZGF0YUJ5dGVzT2Zmc2V0KSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uQnl0ZXNOb3RNYXRjaE9mZnNldDsKLSAgICByZXR1cm47Ci0gIH0KLSAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgbWF4TnVtRGF0YUJ5dGVzOyB4KyspIHsKLSAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBibG9ja3MuR2V0U2l6ZSgpOyBqKyspIHsKLSAgICAgIGNvbnN0IENCQ19Db21tb25CeXRlQXJyYXkqIGRhdGFCeXRlcyA9IGJsb2Nrc1tqXS0+R2V0RGF0YUJ5dGVzKCk7Ci0gICAgICBpZiAoeCA8IGRhdGFCeXRlcy0+U2l6ZSgpKSB7Ci0gICAgICAgIHJlc3VsdC0+QXBwZW5kQml0cyhkYXRhQnl0ZXMtPkF0KHgpLCA4LCBlKTsKLSAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IG1heE51bUVjQnl0ZXM7IHkrKykgewotICAgIGZvciAoaW50MzJfdCBsID0gMDsgbCA8IGJsb2Nrcy5HZXRTaXplKCk7IGwrKykgewotICAgICAgY29uc3QgQ0JDX0NvbW1vbkJ5dGVBcnJheSogZWNCeXRlcyA9IGJsb2Nrc1tsXS0+R2V0RXJyb3JDb3JyZWN0aW9uQnl0ZXMoKTsKLSAgICAgIGlmICh5IDwgZWNCeXRlcy0+U2l6ZSgpKSB7Ci0gICAgICAgIHJlc3VsdC0+QXBwZW5kQml0cyhlY0J5dGVzLT5BdCh5KSwgOCwgZSk7Ci0gICAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotICBmb3IgKGludDMyX3QgayA9IDA7IGsgPCBibG9ja3MuR2V0U2l6ZSgpOyBrKyspIHsKLSAgICBkZWxldGUgYmxvY2tzW2tdOwotICB9Ci0gIGlmIChudW1Ub3RhbEJ5dGVzICE9IHJlc3VsdC0+c2l6ZUluQnl0ZXMoKSkKLSAgICBlID0gQkNFeGNlcHRpb25TaXplSW5CeXRlc0RpZmZlcjsKLX0KLQotdm9pZCBDQkNfUVJDb2RlckVuY29kZXI6OkdldE51bURhdGFCeXRlc0FuZE51bUVDQnl0ZXNGb3JCbG9ja0lEKAotICAgIGludDMyX3QgbnVtVG90YWxCeXRlcywKLSAgICBpbnQzMl90IG51bURhdGFCeXRlcywKLSAgICBpbnQzMl90IG51bVJTQmxvY2tzLAotICAgIGludDMyX3QgYmxvY2tJRCwKLSAgICBpbnQzMl90JiBudW1EYXRhQnl0ZXNJbkJsb2NrLAotICAgIGludDMyX3QmIG51bUVDQnl0ZXNJbkJsb2NrKSB7Ci0gIGlmIChibG9ja0lEID49IG51bVJTQmxvY2tzKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGludDMyX3QgbnVtUnNCbG9ja3NJbkdyb3VwMiA9IG51bVRvdGFsQnl0ZXMgJSBudW1SU0Jsb2NrczsKLSAgaW50MzJfdCBudW1Sc0Jsb2Nrc0luR3JvdXAxID0gbnVtUlNCbG9ja3MgLSBudW1Sc0Jsb2Nrc0luR3JvdXAyOwotICBpbnQzMl90IG51bVRvdGFsQnl0ZXNJbkdyb3VwMSA9IG51bVRvdGFsQnl0ZXMgLyBudW1SU0Jsb2NrczsKLSAgaW50MzJfdCBudW1Ub3RhbEJ5dGVzSW5Hcm91cDIgPSBudW1Ub3RhbEJ5dGVzSW5Hcm91cDEgKyAxOwotICBpbnQzMl90IG51bURhdGFCeXRlc0luR3JvdXAxID0gbnVtRGF0YUJ5dGVzIC8gbnVtUlNCbG9ja3M7Ci0gIGludDMyX3QgbnVtRGF0YUJ5dGVzSW5Hcm91cDIgPSBudW1EYXRhQnl0ZXNJbkdyb3VwMSArIDE7Ci0gIGludDMyX3QgbnVtRWNCeXRlc0luR3JvdXAxID0gbnVtVG90YWxCeXRlc0luR3JvdXAxIC0gbnVtRGF0YUJ5dGVzSW5Hcm91cDE7Ci0gIGludDMyX3QgbnVtRWNCeXRlc0luR3JvdXAyID0gbnVtVG90YWxCeXRlc0luR3JvdXAyIC0gbnVtRGF0YUJ5dGVzSW5Hcm91cDI7Ci0gIGlmIChibG9ja0lEIDwgbnVtUnNCbG9ja3NJbkdyb3VwMSkgewotICAgIG51bURhdGFCeXRlc0luQmxvY2sgPSBudW1EYXRhQnl0ZXNJbkdyb3VwMTsKLSAgICBudW1FQ0J5dGVzSW5CbG9jayA9IG51bUVjQnl0ZXNJbkdyb3VwMTsKLSAgfSBlbHNlIHsKLSAgICBudW1EYXRhQnl0ZXNJbkJsb2NrID0gbnVtRGF0YUJ5dGVzSW5Hcm91cDI7Ci0gICAgbnVtRUNCeXRlc0luQmxvY2sgPSBudW1FY0J5dGVzSW5Hcm91cDI7Ci0gIH0KLX0KLQotQ0JDX0NvbW1vbkJ5dGVBcnJheSogQ0JDX1FSQ29kZXJFbmNvZGVyOjpHZW5lcmF0ZUVDQnl0ZXMoCi0gICAgQ0JDX0NvbW1vbkJ5dGVBcnJheSogZGF0YUJ5dGVzLAotICAgIGludDMyX3QgbnVtRWNCeXRlc0luQmxvY2ssCi0gICAgaW50MzJfdCYgZSkgewotICBpbnQzMl90IG51bURhdGFCeXRlcyA9IGRhdGFCeXRlcy0+U2l6ZSgpOwotICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiB0b0VuY29kZTsKLSAgdG9FbmNvZGUuU2V0U2l6ZShudW1EYXRhQnl0ZXMgKyBudW1FY0J5dGVzSW5CbG9jayk7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bURhdGFCeXRlczsgaSsrKSB7Ci0gICAgdG9FbmNvZGVbaV0gPSAoZGF0YUJ5dGVzLT5BdChpKSk7Ci0gIH0KLSAgQ0JDX1JlZWRTb2xvbW9uRW5jb2RlciBlbmNvZGUoQ0JDX1JlZWRTb2xvbW9uR0YyNTY6OlFSQ29kZUZpZWxkKTsKLSAgZW5jb2RlLkluaXQoKTsKLSAgZW5jb2RlLkVuY29kZSgmdG9FbmNvZGUsIG51bUVjQnl0ZXNJbkJsb2NrLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgQ0JDX0NvbW1vbkJ5dGVBcnJheSogZWNCeXRlcyA9IG5ldyBDQkNfQ29tbW9uQnl0ZUFycmF5KG51bUVjQnl0ZXNJbkJsb2NrKTsKLSAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbnVtRWNCeXRlc0luQmxvY2s7IGorKykgewotICAgIGVjQnl0ZXMtPlNldChqLCB0b0VuY29kZVtudW1EYXRhQnl0ZXMgKyBqXSk7Ci0gIH0KLSAgcmV0dXJuIGVjQnl0ZXM7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRW5jb2Rlci5oIGIveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVuY29kZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFiMDc4Zi4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRW5jb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSRU5DT0RFUl9IXwotI2RlZmluZSBYRkFfRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSRU5DT0RFUl9IXwotCi0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLQotY2xhc3MgQ0JDX1FSQ29kZXI7Ci1jbGFzcyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOwotY2xhc3MgQ0JDX1FSQ29kZXJNb2RlOwotY2xhc3MgQ0JDX1FSQ29kZXJCaXRWZWN0b3I7Ci1jbGFzcyBDQkNfQ29tbW9uQnl0ZUFycmF5OwotY2xhc3MgQ0JDX0NvbW1vbkJ5dGVNYXRyaXg7Ci0KLWNsYXNzIENCQ19RUkNvZGVyRW5jb2RlciB7Ci0gcHVibGljOgotICBDQkNfUVJDb2RlckVuY29kZXIoKTsKLSAgdmlydHVhbCB+Q0JDX1FSQ29kZXJFbmNvZGVyKCk7Ci0KLSAgc3RhdGljIHZvaWQgRW5jb2RlKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LAotICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyKiBxckNvZGUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlLAotICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2ZXJzaW9uU3BlY2lmeSA9IDApOwotICBzdGF0aWMgdm9pZCBFbmNvZGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIGNvbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLAotICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXIqIHFyQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotICBzdGF0aWMgdm9pZCBFbmNvZGVXaXRoU3BlY2lmeVZlcnNpb24oY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXIqIHFyQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmVyc2lvblNwZWNpZnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIHZvaWQgRW5jb2RlV2l0aEF1dG9WZXJzaW9uKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyKiBxckNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogQ2hvb3NlTW9kZShjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZyk7Ci0gIHN0YXRpYyBpbnQzMl90IEdldEFscGhhTnVtZXJpY0NvZGUoaW50MzJfdCBjb2RlKTsKLSAgc3RhdGljIHZvaWQgQXBwZW5kRUNJKENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzKTsKLSAgc3RhdGljIHZvaWQgQXBwZW5kQnl0ZXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyTW9kZSogbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIGVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIHZvaWQgQXBwZW5kTnVtZXJpY0J5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIHZvaWQgQXBwZW5kQWxwaGFOdW1lcmljQnl0ZXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIHZvaWQgQXBwZW5kOEJpdEJ5dGVzKGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBlbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotICBzdGF0aWMgdm9pZCBBcHBlbmQ4Qml0Qnl0ZXMoQ0ZYX0FycmF5VGVtcGxhdGU8dWludDhfdD4mIGJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIHZvaWQgQXBwZW5kS2FuamlCeXRlcyhjb25zdCBDRlhfQnl0ZVN0cmluZyYgY29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIHZvaWQgQXBwZW5kR0JLQnl0ZXMoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGNvbnRlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIHZvaWQgSW5pdFFSQ29kZShpbnQzMl90IG51bUlucHV0Qnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2ZXJzaW9uTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyKiBxckNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7Ci0gIHN0YXRpYyB2b2lkIEluaXRRUkNvZGUoaW50MzJfdCBudW1JbnB1dEJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyKiBxckNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7Ci0gIHN0YXRpYyB2b2lkIEFwcGVuZE1vZGVJbmZvKENCQ19RUkNvZGVyTW9kZSogbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotICBzdGF0aWMgdm9pZCBBcHBlbmRMZW5ndGhJbmZvKGludDMyX3QgbnVtTGV0dGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJNb2RlKiBtb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotCi0gIHN0YXRpYyB2b2lkIEludGVybGVhdmVXaXRoRUNCeXRlcyhDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtVG90YWxCeXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRGF0YUJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1SU0Jsb2NrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiByZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIHZvaWQgR2V0TnVtRGF0YUJ5dGVzQW5kTnVtRUNCeXRlc0ZvckJsb2NrSUQoCi0gICAgICBpbnQzMl90IG51bVRvdGFsQnl0ZXMsCi0gICAgICBpbnQzMl90IG51bURhdGFCeXRlcywKLSAgICAgIGludDMyX3QgbnVtUlNCbG9ja3MsCi0gICAgICBpbnQzMl90IGJsb2NrSUQsCi0gICAgICBpbnQzMl90JiBudW1EYXRhQnl0ZXNJbkJsb2NrLAotICAgICAgaW50MzJfdCYgbnVtRUNCeXRlc0luQmxvY2tzKTsKLSAgc3RhdGljIENCQ19Db21tb25CeXRlQXJyYXkqIEdlbmVyYXRlRUNCeXRlcyhDQkNfQ29tbW9uQnl0ZUFycmF5KiBkYXRhQnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1FY0J5dGVzSW5CbG9jaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIGludDMyX3QgQ2hvb3NlTWFza1BhdHRlcm4oQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7Ci0gIHN0YXRpYyBpbnQzMl90IENhbGN1bGF0ZU1hc2tQZW5hbHR5KENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpOwotICBzdGF0aWMgdm9pZCBUZXJtaW5hdGVCaXRzKGludDMyX3QgbnVtRGF0YUJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotICBzdGF0aWMgaW50MzJfdCBHZXRTcGFuQnlWZXJzaW9uKENCQ19RUkNvZGVyTW9kZSogbW9kZUZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyTW9kZSogbW9kZVNlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZlcnNpb25OdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7Ci0gIHN0YXRpYyB2b2lkIE1lcmdlU3RyaW5nKAotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPENCQ19RUkNvZGVyTW9kZSosIENGWF9CeXRlU3RyaW5nPj4qIHJlc3VsdCwKLSAgICAgIGludDMyX3QgdmVyc2lvbk51bSwKLSAgICAgIGludDMyX3QmIGUpOwotICBzdGF0aWMgdm9pZCBTcGxpdFN0cmluZygKLSAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBjb250ZW50LAotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPENCQ19RUkNvZGVyTW9kZSosIENGWF9CeXRlU3RyaW5nPj4qIHJlc3VsdCk7Ci0gIHN0YXRpYyB2b2lkIEFwcGVuZERhdGFNb2RlTGVuZ2hJbmZvKAotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPENCQ19RUkNvZGVyTW9kZSosIENGWF9CeXRlU3RyaW5nPj4mCi0gICAgICAgICAgc3BsaXRSZXN1bHQsCi0gICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciYgaGVhZGVyQW5kRGF0YUJpdHMsCi0gICAgICBDQkNfUVJDb2Rlck1vZGUqIHRlbXBNb2RlLAotICAgICAgQ0JDX1FSQ29kZXIqIHFyQ29kZSwKLSAgICAgIENGWF9CeXRlU3RyaW5nJiBlbmNvZGluZywKLSAgICAgIGludDMyX3QmIGUpOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSRU5DT0RFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmNwcCBiL3hmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NDUwY2YuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLS8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaCIKLQotQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6TCA9IG51bGxwdHI7Ci1DQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpNID0gbnVsbHB0cjsKLUNCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OlEgPSBudWxscHRyOwotQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6SCA9IG51bGxwdHI7Ci0KLUNCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6OkNCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwoCi0gICAgaW50MzJfdCBvcmRpbmFsLAotICAgIGludDMyX3QgYml0cywKLSAgICBjb25zdCBGWF9DSEFSKiBuYW1lKQotICAgIDogbV9vcmRpbmFsKG9yZGluYWwpLCBtX2JpdHMoYml0cyksIG1fbmFtZShuYW1lKSB7fQotCi1DQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjp+Q0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCgpIHt9Ci0KLXZvaWQgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6SW5pdGlhbGl6ZSgpIHsKLSAgTCA9IG5ldyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKDAsIDB4MDEsICJMIik7Ci0gIE0gPSBuZXcgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCgxLCAweDAwLCAiTSIpOwotICBRID0gbmV3IENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwoMiwgMHgwMywgIlEiKTsKLSAgSCA9IG5ldyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKDMsIDB4MDIsICJIIik7Ci19Ci0KLXZvaWQgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6RmluYWxpemUoKSB7Ci0gIGRlbGV0ZSBMOwotICBkZWxldGUgTTsKLSAgZGVsZXRlIFE7Ci0gIGRlbGV0ZSBIOwotfQotCi1DQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpGb3JCaXRzKAotICAgIGludDMyX3QgYml0cykgewotICBzd2l0Y2ggKGJpdHMpIHsKLSAgICBjYXNlIDB4MDA6Ci0gICAgICByZXR1cm4gTTsKLSAgICBjYXNlIDB4MDE6Ci0gICAgICByZXR1cm4gTDsKLSAgICBjYXNlIDB4MDI6Ci0gICAgICByZXR1cm4gSDsKLSAgICBjYXNlIDB4MDM6Ci0gICAgICByZXR1cm4gUTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLX0KLXZvaWQgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6RGVzdHJveSgpIHsKLSAgaWYgKEwpIHsKLSAgICBkZWxldGUgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6TDsKLSAgICBMID0gbnVsbHB0cjsKLSAgfQotICBpZiAoTSkgewotICAgIGRlbGV0ZSBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsOjpNOwotICAgIE0gPSBudWxscHRyOwotICB9Ci0gIGlmIChIKSB7Ci0gICAgZGVsZXRlIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw6Okg7Ci0gICAgSCA9IG51bGxwdHI7Ci0gIH0KLSAgaWYgKFEpIHsKLSAgICBkZWxldGUgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDo6UTsKLSAgICBRID0gbnVsbHB0cjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsLmggYi94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQzM2VlMS4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSRVJST1JDT1JSRUNUSU9OTEVWRUxfSF8KLSNkZWZpbmUgWEZBX0ZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUkVSUk9SQ09SUkVDVElPTkxFVkVMX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotCi1jbGFzcyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBMOwotICBzdGF0aWMgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogTTsKLSAgc3RhdGljIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIFE7Ci0gIHN0YXRpYyBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBIOwotCi0gIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsKLSAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsKLSAgc3RhdGljIHZvaWQgRGVzdHJveSgpOwotICBzdGF0aWMgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogRm9yQml0cyhpbnQzMl90IGJpdHMpOwotCi0gIH5DQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKCk7Ci0KLSAgaW50MzJfdCBPcmRpbmFsKCkgY29uc3QgeyByZXR1cm4gbV9vcmRpbmFsOyB9Ci0gIGludDMyX3QgR2V0Qml0cygpIGNvbnN0IHsgcmV0dXJuIG1fYml0czsgfQotICBDRlhfQnl0ZVN0cmluZyBHZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbV9uYW1lOyB9Ci0KLSBwcml2YXRlOgotICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKGludDMyX3Qgb3JkaW5hbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogbmFtZSk7Ci0gIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwoKTsKLQotICBpbnQzMl90IG1fb3JkaW5hbDsKLSAgaW50MzJfdCBtX2JpdHM7Ci0gIENGWF9CeXRlU3RyaW5nIG1fbmFtZTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUkVSUk9SQ09SUkVDVElPTkxFVkVMX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWFza1V0aWwuY3BwIGIveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hc2tVdGlsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk1MzcwMS4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWFza1V0aWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLS8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOCBaWGluZyBhdXRob3JzCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlTWF0cml4LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbC5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNYXNrVXRpbC5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvdXRpbHMuaCIKLQotQ0JDX1FSQ29kZXJNYXNrVXRpbDo6Q0JDX1FSQ29kZXJNYXNrVXRpbCgpIHt9Ci1DQkNfUVJDb2Rlck1hc2tVdGlsOjp+Q0JDX1FSQ29kZXJNYXNrVXRpbCgpIHt9Ci1pbnQzMl90IENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlMSgKLSAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4KSB7Ci0gIHJldHVybiBBcHBseU1hc2tQZW5hbHR5UnVsZTFJbnRlcm5hbChtYXRyaXgsIHRydWUpICsKLSAgICAgICAgIEFwcGx5TWFza1BlbmFsdHlSdWxlMUludGVybmFsKG1hdHJpeCwgZmFsc2UpOwotfQotCi1pbnQzMl90IENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlMigKLSAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4KSB7Ci0gIGludDMyX3QgcGVuYWx0eSA9IDA7Ci0gIHVpbnQ4X3QqIGFycmF5ID0gbWF0cml4LT5HZXRBcnJheSgpOwotICBpbnQzMl90IHdpZHRoID0gbWF0cml4LT5HZXRXaWR0aCgpOwotICBpbnQzMl90IGhlaWdodCA9IG1hdHJpeC0+R2V0SGVpZ2h0KCk7Ci0gIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IGhlaWdodCAtIDE7IHkrKykgewotICAgIGZvciAoaW50MzJfdCB4ID0gMDsgeCA8IHdpZHRoIC0gMTsgeCsrKSB7Ci0gICAgICBpbnQzMl90IHZhbHVlID0gYXJyYXlbeSAqIHdpZHRoICsgeF07Ci0gICAgICBpZiAodmFsdWUgPT0gYXJyYXlbeSAqIHdpZHRoICsgeCArIDFdICYmCi0gICAgICAgICAgdmFsdWUgPT0gYXJyYXlbKHkgKyAxKSAqIHdpZHRoICsgeF0gJiYKLSAgICAgICAgICB2YWx1ZSA9PSBhcnJheVsoeSArIDEpICogd2lkdGggKyB4ICsgMV0pIHsKLSAgICAgICAgcGVuYWx0eSsrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gMyAqIHBlbmFsdHk7Ci19Ci0KLWludDMyX3QgQ0JDX1FSQ29kZXJNYXNrVXRpbDo6QXBwbHlNYXNrUGVuYWx0eVJ1bGUzKAotICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpIHsKLSAgaW50MzJfdCBwZW5hbHR5ID0gMDsKLSAgdWludDhfdCogYXJyYXkgPSBtYXRyaXgtPkdldEFycmF5KCk7Ci0gIGludDMyX3Qgd2lkdGggPSBtYXRyaXgtPkdldFdpZHRoKCk7Ci0gIGludDMyX3QgaGVpZ2h0ID0gbWF0cml4LT5HZXRIZWlnaHQoKTsKLSAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKLSAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7Ci0gICAgICBpZiAoeCA9PSAwICYmCi0gICAgICAgICAgKCh5ID49IDAgJiYgeSA8PSA2KSB8fCAoeSA+PSBoZWlnaHQgLSA3ICYmIHkgPD0gaGVpZ2h0IC0gMSkpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYgKHggPT0gd2lkdGggLSA3ICYmICh5ID49IDAgJiYgeSA8PSA2KSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmICh5ID09IDAgJiYKLSAgICAgICAgICAoKHggPj0gMCAmJiB4IDw9IDYpIHx8ICh4ID49IHdpZHRoIC0gNyAmJiB4IDw9IHdpZHRoIC0gMSkpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYgKHkgPT0gaGVpZ2h0IC0gNyAmJiAoeCA+PSAwICYmIHggPD0gNikpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoeCArIDYgPCB3aWR0aCAmJiBhcnJheVt5ICogd2lkdGggKyB4XSA9PSAxICYmCi0gICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCArIDFdID09IDAgJiYgYXJyYXlbeSAqIHdpZHRoICsgeCArIDJdID09IDEgJiYKLSAgICAgICAgICBhcnJheVt5ICogd2lkdGggKyB4ICsgM10gPT0gMSAmJiBhcnJheVt5ICogd2lkdGggKyB4ICsgNF0gPT0gMSAmJgotICAgICAgICAgIGFycmF5W3kgKiB3aWR0aCArIHggKyA1XSA9PSAwICYmIGFycmF5W3kgKiB3aWR0aCArIHggKyA2XSA9PSAxICYmCi0gICAgICAgICAgKCh4ICsgMTAgPCB3aWR0aCAmJiBhcnJheVt5ICogd2lkdGggKyB4ICsgN10gPT0gMCAmJgotICAgICAgICAgICAgYXJyYXlbeSAqIHdpZHRoICsgeCArIDhdID09IDAgJiYgYXJyYXlbeSAqIHdpZHRoICsgeCArIDldID09IDAgJiYKLSAgICAgICAgICAgIGFycmF5W3kgKiB3aWR0aCArIHggKyAxMF0gPT0gMCkgfHwKLSAgICAgICAgICAgKHggLSA0ID49IDAgJiYgYXJyYXlbeSAqIHdpZHRoICsgeCAtIDFdID09IDAgJiYKLSAgICAgICAgICAgIGFycmF5W3kgKiB3aWR0aCArIHggLSAyXSA9PSAwICYmIGFycmF5W3kgKiB3aWR0aCArIHggLSAzXSA9PSAwICYmCi0gICAgICAgICAgICBhcnJheVt5ICogd2lkdGggKyB4IC0gNF0gPT0gMCkpKSB7Ci0gICAgICAgIHBlbmFsdHkgKz0gNDA7Ci0gICAgICB9Ci0gICAgICBpZiAoeSArIDYgPCBoZWlnaHQgJiYgYXJyYXlbeSAqIHdpZHRoICsgeF0gPT0gMSAmJgotICAgICAgICAgIGFycmF5Wyh5ICsgMSkgKiB3aWR0aCArIHhdID09IDAgJiYgYXJyYXlbKHkgKyAyKSAqIHdpZHRoICsgeF0gPT0gMSAmJgotICAgICAgICAgIGFycmF5Wyh5ICsgMykgKiB3aWR0aCArIHhdID09IDEgJiYgYXJyYXlbKHkgKyA0KSAqIHdpZHRoICsgeF0gPT0gMSAmJgotICAgICAgICAgIGFycmF5Wyh5ICsgNSkgKiB3aWR0aCArIHhdID09IDAgJiYgYXJyYXlbKHkgKyA2KSAqIHdpZHRoICsgeF0gPT0gMSAmJgotICAgICAgICAgICgoeSArIDEwIDwgaGVpZ2h0ICYmIGFycmF5Wyh5ICsgNykgKiB3aWR0aCArIHhdID09IDAgJiYKLSAgICAgICAgICAgIGFycmF5Wyh5ICsgOCkgKiB3aWR0aCArIHhdID09IDAgJiYKLSAgICAgICAgICAgIGFycmF5Wyh5ICsgOSkgKiB3aWR0aCArIHhdID09IDAgJiYKLSAgICAgICAgICAgIGFycmF5Wyh5ICsgMTApICogd2lkdGggKyB4XSA9PSAwKSB8fAotICAgICAgICAgICAoeSAtIDQgPj0gMCAmJiBhcnJheVsoeSAtIDEpICogd2lkdGggKyB4XSA9PSAwICYmCi0gICAgICAgICAgICBhcnJheVsoeSAtIDIpICogd2lkdGggKyB4XSA9PSAwICYmCi0gICAgICAgICAgICBhcnJheVsoeSAtIDMpICogd2lkdGggKyB4XSA9PSAwICYmCi0gICAgICAgICAgICBhcnJheVsoeSAtIDQpICogd2lkdGggKyB4XSA9PSAwKSkpIHsKLSAgICAgICAgcGVuYWx0eSArPSA0MDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHBlbmFsdHk7Ci19Ci1pbnQzMl90IENCQ19RUkNvZGVyTWFza1V0aWw6OkFwcGx5TWFza1BlbmFsdHlSdWxlNCgKLSAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4KSB7Ci0gIGludDMyX3QgbnVtRGFya0NlbGxzID0gMDsKLSAgdWludDhfdCogYXJyYXkgPSBtYXRyaXgtPkdldEFycmF5KCk7Ci0gIGludDMyX3Qgd2lkdGggPSBtYXRyaXgtPkdldFdpZHRoKCk7Ci0gIGludDMyX3QgaGVpZ2h0ID0gbWF0cml4LT5HZXRIZWlnaHQoKTsKLSAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKLSAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7Ci0gICAgICBpZiAoYXJyYXlbeSAqIHdpZHRoICsgeF0gPT0gMSkgewotICAgICAgICBudW1EYXJrQ2VsbHMgKz0gMTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaW50MzJfdCBudW1Ub3RhbENlbGxzID0gbWF0cml4LT5HZXRIZWlnaHQoKSAqIG1hdHJpeC0+R2V0V2lkdGgoKTsKLSAgZG91YmxlIGRhcmtSYXRpbyA9IChkb3VibGUpbnVtRGFya0NlbGxzIC8gbnVtVG90YWxDZWxsczsKLSAgcmV0dXJuIGFicygoaW50MzJfdCkoZGFya1JhdGlvICogMTAwIC0gNTApIC8gNSkgKiA1ICogMTA7Ci19Ci1ib29sIENCQ19RUkNvZGVyTWFza1V0aWw6OkdldERhdGFNYXNrQml0KGludDMyX3QgbWFza1BhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGlmICghQ0JDX1FSQ29kZXI6OklzVmFsaWRNYXNrUGF0dGVybihtYXNrUGF0dGVybikpIHsKLSAgICBlID0gKEJDRXhjZXB0aW9uSW52YWxpZGF0ZU1hc2tQYXR0ZXJuKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaW50MzJfdCBpbnRlcm1lZGlhdGUgPSAwLCB0ZW1wID0gMDsKLSAgc3dpdGNoIChtYXNrUGF0dGVybikgewotICAgIGNhc2UgMDoKLSAgICAgIGludGVybWVkaWF0ZSA9ICh5ICsgeCkgJiAweDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICBpbnRlcm1lZGlhdGUgPSB5ICYgMHgxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgaW50ZXJtZWRpYXRlID0geCAlIDM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBpbnRlcm1lZGlhdGUgPSAoeSArIHgpICUgMzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIGludGVybWVkaWF0ZSA9ICgoeSA+PiAxKSArICh4IC8gMykpICYgMHgxOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1OgotICAgICAgdGVtcCA9IHkgKiB4OwotICAgICAgaW50ZXJtZWRpYXRlID0gKHRlbXAgJiAweDEpICsgKHRlbXAgJSAzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNjoKLSAgICAgIHRlbXAgPSB5ICogeDsKLSAgICAgIGludGVybWVkaWF0ZSA9ICgoKHRlbXAgJiAweDEpICsgKHRlbXAgJSAzKSkgJiAweDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA3OgotICAgICAgdGVtcCA9IHkgKiB4OwotICAgICAgaW50ZXJtZWRpYXRlID0gKCgodGVtcCAlIDMpICsgKCh5ICsgeCkgJiAweDEpKSAmIDB4MSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OiB7Ci0gICAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkYXRlTWFza1BhdHRlcm47Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiBpbnRlcm1lZGlhdGUgPT0gMDsKLX0KLWludDMyX3QgQ0JDX1FSQ29kZXJNYXNrVXRpbDo6QXBwbHlNYXNrUGVuYWx0eVJ1bGUxSW50ZXJuYWwoCi0gICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwKLSAgICBib29sIGlzSG9yaXpvbnRhbCkgewotICBpbnQzMl90IHBlbmFsdHkgPSAwOwotICBpbnQzMl90IG51bVNhbWVCaXRDZWxscyA9IDA7Ci0gIGludDMyX3QgcHJldkJpdCA9IC0xOwotICBpbnQzMl90IHdpZHRoID0gbWF0cml4LT5HZXRXaWR0aCgpOwotICBpbnQzMl90IGhlaWdodCA9IG1hdHJpeC0+R2V0SGVpZ2h0KCk7Ci0gIGludDMyX3QgaUxpbWl0ID0gaXNIb3Jpem9udGFsID8gaGVpZ2h0IDogd2lkdGg7Ci0gIGludDMyX3QgakxpbWl0ID0gaXNIb3Jpem9udGFsID8gd2lkdGggOiBoZWlnaHQ7Ci0gIHVpbnQ4X3QqIGFycmF5ID0gbWF0cml4LT5HZXRBcnJheSgpOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGltaXQ7ICsraSkgewotICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGpMaW1pdDsgKytqKSB7Ci0gICAgICBpbnQzMl90IGJpdCA9IGlzSG9yaXpvbnRhbCA/IGFycmF5W2kgKiB3aWR0aCArIGpdIDogYXJyYXlbaiAqIHdpZHRoICsgaV07Ci0gICAgICBpZiAoYml0ID09IHByZXZCaXQpIHsKLSAgICAgICAgbnVtU2FtZUJpdENlbGxzICs9IDE7Ci0gICAgICAgIGlmIChudW1TYW1lQml0Q2VsbHMgPT0gNSkgewotICAgICAgICAgIHBlbmFsdHkgKz0gMzsKLSAgICAgICAgfSBlbHNlIGlmIChudW1TYW1lQml0Q2VsbHMgPiA1KSB7Ci0gICAgICAgICAgcGVuYWx0eSArPSAxOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBudW1TYW1lQml0Q2VsbHMgPSAxOwotICAgICAgICBwcmV2Qml0ID0gYml0OwotICAgICAgfQotICAgIH0KLSAgICBudW1TYW1lQml0Q2VsbHMgPSAwOwotICB9Ci0gIHJldHVybiBwZW5hbHR5OwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hc2tVdGlsLmggYi94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWFza1V0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZiZTA3My4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWFza1V0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSTUFTS1VUSUxfSF8KLSNkZWZpbmUgWEZBX0ZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUk1BU0tVVElMX0hfCi1jbGFzcyBDQkNfQ29tbW9uQnl0ZU1hdHJpeDsKLWNsYXNzIENCQ19RUkNvZGVyTWFza1V0aWwgewotIHB1YmxpYzoKLSAgQ0JDX1FSQ29kZXJNYXNrVXRpbCgpOwotICB2aXJ0dWFsIH5DQkNfUVJDb2Rlck1hc2tVdGlsKCk7Ci0gIHN0YXRpYyBib29sIEdldERhdGFNYXNrQml0KGludDMyX3QgbWFza1BhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLQotICBzdGF0aWMgaW50MzJfdCBBcHBseU1hc2tQZW5hbHR5UnVsZTEoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCk7Ci0gIHN0YXRpYyBpbnQzMl90IEFwcGx5TWFza1BlbmFsdHlSdWxlMihDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4KTsKLSAgc3RhdGljIGludDMyX3QgQXBwbHlNYXNrUGVuYWx0eVJ1bGUzKENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgpOwotICBzdGF0aWMgaW50MzJfdCBBcHBseU1hc2tQZW5hbHR5UnVsZTQoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCk7Ci0gIHN0YXRpYyBpbnQzMl90IEFwcGx5TWFza1BlbmFsdHlSdWxlMUludGVybmFsKENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNIb3Jpem9udGFsKTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUk1BU0tVVElMX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWF0cml4VXRpbC5jcHAgYi94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWF0cml4VXRpbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0OGQ4MWMuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hdHJpeFV0aWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTA2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLS8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKLS8qCi0gKiBDb3B5cmlnaHQgMjAwOCBaWGluZyBhdXRob3JzCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CeXRlTWF0cml4LmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlci5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJCaXRWZWN0b3IuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWFza1V0aWwuaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTWF0cml4VXRpbC5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvdXRpbHMuaCIKLQotY29uc3QgaW50MzJfdCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OlBPU0lUSU9OX0RFVEVDVElPTl9QQVRURVJOWzddWzddID0gewotICAgIHsxLCAxLCAxLCAxLCAxLCAxLCAxfSwgezEsIDAsIDAsIDAsIDAsIDAsIDF9LCB7MSwgMCwgMSwgMSwgMSwgMCwgMX0sCi0gICAgezEsIDAsIDEsIDEsIDEsIDAsIDF9LCB7MSwgMCwgMSwgMSwgMSwgMCwgMX0sIHsxLCAwLCAwLCAwLCAwLCAwLCAxfSwKLSAgICB7MSwgMSwgMSwgMSwgMSwgMSwgMX19OwotY29uc3QgaW50MzJfdCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkhPUklaT05UQUxfU0VQQVJBVElPTl9QQVRURVJOWzFdWzhdID0gewotICAgIHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwfX07Ci1jb25zdCBpbnQzMl90IENCQ19RUkNvZGVyTWF0cml4VXRpbDo6VkVSVElDQUxfU0VQQVJBVElPTl9QQVRURVJOWzddWzFdID0gewotICAgIHswfSwgezB9LCB7MH0sIHswfSwgezB9LCB7MH0sIHswfX07Ci1jb25zdCBpbnQzMl90IENCQ19RUkNvZGVyTWF0cml4VXRpbDo6UE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOWzVdWzVdID0gewotICAgIHsxLCAxLCAxLCAxLCAxfSwKLSAgICB7MSwgMCwgMCwgMCwgMX0sCi0gICAgezEsIDAsIDEsIDAsIDF9LAotICAgIHsxLCAwLCAwLCAwLCAxfSwKLSAgICB7MSwgMSwgMSwgMSwgMX19OwotY29uc3QgaW50MzJfdAotICAgIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6UE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOX0NPT1JESU5BVEVfVEFCTEVbNDBdWzddID0KLSAgICAgICAgLy8gTk9MSU5UTkVYVExJTkUKLSAgICB7Ci0gICAgICAgIHstMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX0sICAgezYsIDE4LCAtMSwgLTEsIC0xLCAtMSwgLTF9LAotICAgICAgICB7NiwgMjIsIC0xLCAtMSwgLTEsIC0xLCAtMX0sICAgIHs2LCAyNiwgLTEsIC0xLCAtMSwgLTEsIC0xfSwKLSAgICAgICAgezYsIDMwLCAtMSwgLTEsIC0xLCAtMSwgLTF9LCAgICB7NiwgMzQsIC0xLCAtMSwgLTEsIC0xLCAtMX0sCi0gICAgICAgIHs2LCAyMiwgMzgsIC0xLCAtMSwgLTEsIC0xfSwgICAgezYsIDI0LCA0MiwgLTEsIC0xLCAtMSwgLTF9LAotICAgICAgICB7NiwgMjYsIDQ2LCAtMSwgLTEsIC0xLCAtMX0sICAgIHs2LCAyOCwgNTAsIC0xLCAtMSwgLTEsIC0xfSwKLSAgICAgICAgezYsIDMwLCA1NCwgLTEsIC0xLCAtMSwgLTF9LCAgICB7NiwgMzIsIDU4LCAtMSwgLTEsIC0xLCAtMX0sCi0gICAgICAgIHs2LCAzNCwgNjIsIC0xLCAtMSwgLTEsIC0xfSwgICAgezYsIDI2LCA0NiwgNjYsIC0xLCAtMSwgLTF9LAotICAgICAgICB7NiwgMjYsIDQ4LCA3MCwgLTEsIC0xLCAtMX0sICAgIHs2LCAyNiwgNTAsIDc0LCAtMSwgLTEsIC0xfSwKLSAgICAgICAgezYsIDMwLCA1NCwgNzgsIC0xLCAtMSwgLTF9LCAgICB7NiwgMzAsIDU2LCA4MiwgLTEsIC0xLCAtMX0sCi0gICAgICAgIHs2LCAzMCwgNTgsIDg2LCAtMSwgLTEsIC0xfSwgICAgezYsIDM0LCA2MiwgOTAsIC0xLCAtMSwgLTF9LAotICAgICAgICB7NiwgMjgsIDUwLCA3MiwgOTQsIC0xLCAtMX0sICAgIHs2LCAyNiwgNTAsIDc0LCA5OCwgLTEsIC0xfSwKLSAgICAgICAgezYsIDMwLCA1NCwgNzgsIDEwMiwgLTEsIC0xfSwgICB7NiwgMjgsIDU0LCA4MCwgMTA2LCAtMSwgLTF9LAotICAgICAgICB7NiwgMzIsIDU4LCA4NCwgMTEwLCAtMSwgLTF9LCAgIHs2LCAzMCwgNTgsIDg2LCAxMTQsIC0xLCAtMX0sCi0gICAgICAgIHs2LCAzNCwgNjIsIDkwLCAxMTgsIC0xLCAtMX0sICAgezYsIDI2LCA1MCwgNzQsIDk4LCAxMjIsIC0xfSwKLSAgICAgICAgezYsIDMwLCA1NCwgNzgsIDEwMiwgMTI2LCAtMX0sICB7NiwgMjYsIDUyLCA3OCwgMTA0LCAxMzAsIC0xfSwKLSAgICAgICAgezYsIDMwLCA1NiwgODIsIDEwOCwgMTM0LCAtMX0sICB7NiwgMzQsIDYwLCA4NiwgMTEyLCAxMzgsIC0xfSwKLSAgICAgICAgezYsIDMwLCA1OCwgODYsIDExNCwgMTQyLCAtMX0sICB7NiwgMzQsIDYyLCA5MCwgMTE4LCAxNDYsIC0xfSwKLSAgICAgICAgezYsIDMwLCA1NCwgNzgsIDEwMiwgMTI2LCAxNTB9LCB7NiwgMjQsIDUwLCA3NiwgMTAyLCAxMjgsIDE1NH0sCi0gICAgICAgIHs2LCAyOCwgNTQsIDgwLCAxMDYsIDEzMiwgMTU4fSwgezYsIDMyLCA1OCwgODQsIDExMCwgMTM2LCAxNjJ9LAotICAgICAgICB7NiwgMjYsIDU0LCA4MiwgMTEwLCAxMzgsIDE2Nn0sIHs2LCAzMCwgNTgsIDg2LCAxMTQsIDE0MiwgMTcwfSwKLX07Ci1jb25zdCBpbnQzMl90IENCQ19RUkNvZGVyTWF0cml4VXRpbDo6VFlQRV9JTkZPX0NPT1JESU5BVEVTWzE1XVsyXSA9IHsKLSAgICB7OCwgMH0sIHs4LCAxfSwgezgsIDJ9LCB7OCwgM30sIHs4LCA0fSwgezgsIDV9LCB7OCwgN30sIHs4LCA4fSwKLSAgICB7NywgOH0sIHs1LCA4fSwgezQsIDh9LCB7MywgOH0sIHsyLCA4fSwgezEsIDh9LCB7MCwgOH0sCi19OwotY29uc3QgaW50MzJfdCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OlZFUlNJT05fSU5GT19QT0xZID0gMHgxZjI1OwotY29uc3QgaW50MzJfdCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OlRZUEVfSU5GT19QT0xZID0gMHgwNTM3OwotY29uc3QgaW50MzJfdCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OlRZUEVfSU5GT19NQVNLX1BBVFRFUk4gPSAweDU0MTI7Ci0KLXZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpDbGVhck1hdHJpeChDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgaWYgKCFtYXRyaXgpIHsKLSAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsKLSAgICByZXR1cm47Ci0gIH0KLSAgbWF0cml4LT5jbGVhcigodWludDhfdCktMSk7Ci19Ci12b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6QnVpbGRNYXRyaXgoCi0gICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGRhdGFCaXRzLAotICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsCi0gICAgaW50MzJfdCB2ZXJzaW9uLAotICAgIGludDMyX3QgbWFza1BhdHRlcm4sCi0gICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwKLSAgICBpbnQzMl90JiBlKSB7Ci0gIGlmICghbWF0cml4KSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENsZWFyTWF0cml4KG1hdHJpeCwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotICBFbWJlZEJhc2ljUGF0dGVybnModmVyc2lvbiwgbWF0cml4LCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm47Ci0gIEVtYmVkVHlwZUluZm8oZWNMZXZlbCwgbWFza1BhdHRlcm4sIG1hdHJpeCwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotICBNYXliZUVtYmVkVmVyc2lvbkluZm8odmVyc2lvbiwgbWF0cml4LCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm47Ci0gIEVtYmVkRGF0YUJpdHMoZGF0YUJpdHMsIG1hc2tQYXR0ZXJuLCBtYXRyaXgsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybjsKLX0KLXZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpFbWJlZEJhc2ljUGF0dGVybnMoaW50MzJfdCB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGlmICghbWF0cml4KSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIEVtYmVkUG9zaXRpb25EZXRlY3Rpb25QYXR0ZXJuc0FuZFNlcGFyYXRvcnMobWF0cml4LCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm47Ci0gIEVtYmVkRGFya0RvdEF0TGVmdEJvdHRvbUNvcm5lcihtYXRyaXgsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybjsKLSAgTWF5YmVFbWJlZFBvc2l0aW9uQWRqdXN0bWVudFBhdHRlcm5zKHZlcnNpb24sIG1hdHJpeCwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotICBFbWJlZFRpbWluZ1BhdHRlcm5zKG1hdHJpeCwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotfQotdm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkVHlwZUluZm8oCi0gICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwKLSAgICBpbnQzMl90IG1hc2tQYXR0ZXJuLAotICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCi0gICAgaW50MzJfdCYgZSkgewotICBpZiAoIW1hdHJpeCkgewotICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOwotICAgIHJldHVybjsKLSAgfQotICBDQkNfUVJDb2RlckJpdFZlY3RvciB0eXBlSW5mb0JpdHM7Ci0gIHR5cGVJbmZvQml0cy5Jbml0KCk7Ci0gIE1ha2VUeXBlSW5mb0JpdHMoZWNMZXZlbCwgbWFza1BhdHRlcm4sICZ0eXBlSW5mb0JpdHMsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybjsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgdHlwZUluZm9CaXRzLlNpemUoKTsgaSsrKSB7Ci0gICAgaW50MzJfdCBiaXQgPSB0eXBlSW5mb0JpdHMuQXQodHlwZUluZm9CaXRzLlNpemUoKSAtIDEgLSBpLCBlKTsKLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgcmV0dXJuOwotICAgIGludDMyX3QgeDEgPSBUWVBFX0lORk9fQ09PUkRJTkFURVNbaV1bMF07Ci0gICAgaW50MzJfdCB5MSA9IFRZUEVfSU5GT19DT09SRElOQVRFU1tpXVsxXTsKLSAgICBtYXRyaXgtPlNldCh4MSwgeTEsIGJpdCk7Ci0gICAgaWYgKGkgPCA4KSB7Ci0gICAgICBpbnQzMl90IHgyID0gbWF0cml4LT5HZXRXaWR0aCgpIC0gaSAtIDE7Ci0gICAgICBpbnQzMl90IHkyID0gODsKLSAgICAgIG1hdHJpeC0+U2V0KHgyLCB5MiwgYml0KTsKLSAgICB9IGVsc2UgewotICAgICAgaW50MzJfdCB4MiA9IDg7Ci0gICAgICBpbnQzMl90IHkyID0gbWF0cml4LT5HZXRIZWlnaHQoKSAtIDcgKyAoaSAtIDgpOwotICAgICAgbWF0cml4LT5TZXQoeDIsIHkyLCBiaXQpOwotICAgIH0KLSAgfQotfQotdm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6Ok1heWJlRW1iZWRWZXJzaW9uSW5mbyhpbnQzMl90IHZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgaWYgKCFtYXRyaXgpIHsKLSAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHZlcnNpb24gPCA3KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENCQ19RUkNvZGVyQml0VmVjdG9yIHZlcnNpb25JbmZvQml0czsKLSAgdmVyc2lvbkluZm9CaXRzLkluaXQoKTsKLSAgTWFrZVZlcnNpb25JbmZvQml0cyh2ZXJzaW9uLCAmdmVyc2lvbkluZm9CaXRzLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm47Ci0gIGludDMyX3QgYml0SW5kZXggPSA2ICogMyAtIDE7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDY7IGkrKykgewotICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IDM7IGorKykgewotICAgICAgaW50MzJfdCBiaXQgPSB2ZXJzaW9uSW5mb0JpdHMuQXQoYml0SW5kZXgsIGUpOwotICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgICAgcmV0dXJuOwotICAgICAgYml0SW5kZXgtLTsKLSAgICAgIG1hdHJpeC0+U2V0KGksIG1hdHJpeC0+R2V0SGVpZ2h0KCkgLSAxMSArIGosIGJpdCk7Ci0gICAgICBtYXRyaXgtPlNldChtYXRyaXgtPkdldEhlaWdodCgpIC0gMTEgKyBqLCBpLCBiaXQpOwotICAgIH0KLSAgfQotfQotdm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkRGF0YUJpdHMoQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGRhdGFCaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXNrUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKSB7Ci0gIGlmICghbWF0cml4IHx8ICFkYXRhQml0cykgewotICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOwotICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IGJpdEluZGV4ID0gMDsKLSAgaW50MzJfdCBkaXJlY3Rpb24gPSAtMTsKLSAgaW50MzJfdCB4ID0gbWF0cml4LT5HZXRXaWR0aCgpIC0gMTsKLSAgaW50MzJfdCB5ID0gbWF0cml4LT5HZXRIZWlnaHQoKSAtIDE7Ci0gIHdoaWxlICh4ID4gMCkgewotICAgIGlmICh4ID09IDYpIHsKLSAgICAgIHggLT0gMTsKLSAgICB9Ci0gICAgd2hpbGUgKHkgPj0gMCAmJiB5IDwgbWF0cml4LT5HZXRIZWlnaHQoKSkgewotICAgICAgaWYgKHkgPT0gNikgewotICAgICAgICB5ICs9IGRpcmVjdGlvbjsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgICAgaW50MzJfdCB4eCA9IHggLSBpOwotICAgICAgICBpZiAoIUlzRW1wdHkobWF0cml4LT5HZXQoeHgsIHkpKSkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludDMyX3QgYml0OwotICAgICAgICBpZiAoYml0SW5kZXggPCBkYXRhQml0cy0+U2l6ZSgpKSB7Ci0gICAgICAgICAgYml0ID0gZGF0YUJpdHMtPkF0KGJpdEluZGV4LCBlKTsKLSAgICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIGJpdEluZGV4Kys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYml0ID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAobWFza1BhdHRlcm4gIT0gLTEpIHsKLSAgICAgICAgICBib29sIGJvbCA9IENCQ19RUkNvZGVyTWFza1V0aWw6OkdldERhdGFNYXNrQml0KG1hc2tQYXR0ZXJuLCB4eCwgeSwgZSk7Ci0gICAgICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICBpZiAoYm9sKSB7Ci0gICAgICAgICAgICBiaXQgXj0gMHgwMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbWF0cml4LT5TZXQoeHgsIHksIGJpdCk7Ci0gICAgICB9Ci0gICAgICB5ICs9IGRpcmVjdGlvbjsKLSAgICB9Ci0gICAgZGlyZWN0aW9uID0gLWRpcmVjdGlvbjsKLSAgICB5ICs9IGRpcmVjdGlvbjsKLSAgICB4IC09IDI7Ci0gIH0KLSAgaWYgKGJpdEluZGV4ICE9IGRhdGFCaXRzLT5TaXplKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLX0KLWludDMyX3QgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpDYWxjdWxhdGVCQ0hDb2RlKGludDMyX3QgdmFsdWUsIGludDMyX3QgcG9seSkgewotICBpbnQzMl90IG1zYlNldEluUG9seSA9IEZpbmRNU0JTZXQocG9seSk7Ci0gIHZhbHVlIDw8PSBtc2JTZXRJblBvbHkgLSAxOwotICB3aGlsZSAoRmluZE1TQlNldCh2YWx1ZSkgPj0gbXNiU2V0SW5Qb2x5KSB7Ci0gICAgdmFsdWUgXj0gcG9seSA8PCAoRmluZE1TQlNldCh2YWx1ZSkgLSBtc2JTZXRJblBvbHkpOwotICB9Ci0gIHJldHVybiB2YWx1ZTsKLX0KLXZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpNYWtlVHlwZUluZm9CaXRzKAotICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwsCi0gICAgaW50MzJfdCBtYXNrUGF0dGVybiwKLSAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywKLSAgICBpbnQzMl90JiBlKSB7Ci0gIGlmICghYml0cykgewotICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoIUNCQ19RUkNvZGVyOjpJc1ZhbGlkTWFza1BhdHRlcm4obWFza1BhdHRlcm4pKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uQmFkTWFzazsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50MzJfdCB0eXBlSW5mbyA9IChlY0xldmVsLT5HZXRCaXRzKCkgPDwgMykgfCBtYXNrUGF0dGVybjsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm47Ci0gIGJpdHMtPkFwcGVuZEJpdHModHlwZUluZm8sIDUsIGUpOwotICBpbnQzMl90IGJjaENvZGUgPSBDYWxjdWxhdGVCQ0hDb2RlKHR5cGVJbmZvLCBUWVBFX0lORk9fUE9MWSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotICBiaXRzLT5BcHBlbmRCaXRzKGJjaENvZGUsIDEwLCBlKTsKLSAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IgbWFza0JpdHM7Ci0gIG1hc2tCaXRzLkluaXQoKTsKLSAgbWFza0JpdHMuQXBwZW5kQml0cyhUWVBFX0lORk9fTUFTS19QQVRURVJOLCAxNSwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotICBiaXRzLT5YT1IoJm1hc2tCaXRzLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm47Ci0gIGlmIChiaXRzLT5TaXplKCkgIT0gMTUpCi0gICAgZSA9IEJDRXhjZXB0aW9uQml0U2l6ZU5vdDE1OwotfQotCi12b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6TWFrZVZlcnNpb25JbmZvQml0cyhpbnQzMl90IHZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckJpdFZlY3RvciogYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgaWYgKCFiaXRzKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGJpdHMtPkFwcGVuZEJpdHModmVyc2lvbiwgNiwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotCi0gIGludDMyX3QgYmNoQ29kZSA9IENhbGN1bGF0ZUJDSENvZGUodmVyc2lvbiwgVkVSU0lPTl9JTkZPX1BPTFkpOwotICBiaXRzLT5BcHBlbmRCaXRzKGJjaENvZGUsIDEyLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm47Ci0KLSAgaWYgKGJpdHMtPlNpemUoKSAhPSAxOCkKLSAgICBlID0gQkNFeGNlcHRpb25CaXRTaXplTm90MTg7Ci19Ci0KLWJvb2wgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpJc0VtcHR5KGludDMyX3QgdmFsdWUpIHsKLSAgcmV0dXJuICh1aW50OF90KXZhbHVlID09IDB4ZmY7Ci19Ci1ib29sIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6SXNWYWxpZFZhbHVlKGludDMyX3QgdmFsdWUpIHsKLSAgcmV0dXJuICgodWludDhfdCl2YWx1ZSA9PSAweGZmIHx8ICh1aW50OF90KXZhbHVlID09IDB4MDAgfHwKLSAgICAgICAgICAodWludDhfdCl2YWx1ZSA9PSAweDAxKTsKLX0KLQotdm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkVGltaW5nUGF0dGVybnMoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpIHsKLSAgaWYgKCFtYXRyaXgpIHsKLSAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsKLSAgICByZXR1cm47Ci0gIH0KLSAgZm9yIChpbnQzMl90IGkgPSA4OyBpIDwgbWF0cml4LT5HZXRXaWR0aCgpIC0gODsgaSsrKSB7Ci0gICAgaW50MzJfdCBiaXQgPSAoaSArIDEpICUgMjsKLSAgICBpZiAoIUlzVmFsaWRWYWx1ZShtYXRyaXgtPkdldChpLCA2KSkpIHsKLSAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVJbWFnZURhdGE7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChJc0VtcHR5KG1hdHJpeC0+R2V0KGksIDYpKSkgewotICAgICAgbWF0cml4LT5TZXQoaSwgNiwgYml0KTsKLSAgICB9Ci0gICAgaWYgKCFJc1ZhbGlkVmFsdWUobWF0cml4LT5HZXQoNiwgaSkpKSB7Ci0gICAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkYXRlSW1hZ2VEYXRhOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoSXNFbXB0eShtYXRyaXgtPkdldCg2LCBpKSkpIHsKLSAgICAgIG1hdHJpeC0+U2V0KDYsIGksIGJpdCk7Ci0gICAgfQotICB9Ci19Ci12b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RW1iZWREYXJrRG90QXRMZWZ0Qm90dG9tQ29ybmVyKAotICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCi0gICAgaW50MzJfdCYgZSkgewotICBpZiAoIW1hdHJpeCkgewotICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOwotICAgIHJldHVybjsKLSAgfQotICBpZiAobWF0cml4LT5HZXQoOCwgbWF0cml4LT5HZXRIZWlnaHQoKSAtIDgpID09IDApIHsKLSAgICBlID0gQkNFeGNlcHRpb25IZWlnaHRfOEJlWmVybzsKLSAgICByZXR1cm47Ci0gIH0KLSAgbWF0cml4LT5TZXQoOCwgbWF0cml4LT5HZXRIZWlnaHQoKSAtIDgsIDEpOwotfQotdm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkSG9yaXpvbnRhbFNlcGFyYXRpb25QYXR0ZXJuKAotICAgIGludDMyX3QgeFN0YXJ0LAotICAgIGludDMyX3QgeVN0YXJ0LAotICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCi0gICAgaW50MzJfdCYgZSkgewotICBpZiAoIW1hdHJpeCkgewotICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOwotICAgIHJldHVybjsKLSAgfQotICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCA4OyB4KyspIHsKLSAgICBpZiAoIUlzRW1wdHkobWF0cml4LT5HZXQoeFN0YXJ0ICsgeCwgeVN0YXJ0KSkpIHsKLSAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVEYXRhOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtYXRyaXgtPlNldCh4U3RhcnQgKyB4LCB5U3RhcnQsIEhPUklaT05UQUxfU0VQQVJBVElPTl9QQVRURVJOWzBdW3hdKTsKLSAgfQotfQotdm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkVmVydGljYWxTZXBhcmF0aW9uUGF0dGVybigKLSAgICBpbnQzMl90IHhTdGFydCwKLSAgICBpbnQzMl90IHlTdGFydCwKLSAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LAotICAgIGludDMyX3QmIGUpIHsKLSAgaWYgKCFtYXRyaXgpIHsKLSAgICBlID0gQkNFeGNlcHRpb25OdWxsUG9pbnRlcjsKLSAgICByZXR1cm47Ci0gIH0KLSAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgNzsgeSsrKSB7Ci0gICAgaWYgKCFJc0VtcHR5KG1hdHJpeC0+R2V0KHhTdGFydCwgeVN0YXJ0ICsgeSkpKSB7Ci0gICAgICBlID0gQkNFeGNlcHRpb25JbnZhbGlkYXRlRGF0YTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbWF0cml4LT5TZXQoeFN0YXJ0LCB5U3RhcnQgKyB5LCBWRVJUSUNBTF9TRVBBUkFUSU9OX1BBVFRFUk5beV1bMF0pOwotICB9Ci19Ci12b2lkIENCQ19RUkNvZGVyTWF0cml4VXRpbDo6RW1iZWRQb3NpdGlvbkFkanVzdG1lbnRQYXR0ZXJuKAotICAgIGludDMyX3QgeFN0YXJ0LAotICAgIGludDMyX3QgeVN0YXJ0LAotICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCi0gICAgaW50MzJfdCYgZSkgewotICBpZiAoIW1hdHJpeCkgewotICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOwotICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICByZXR1cm47Ci0gIH0KLSAgZm9yIChpbnQzMl90IHkgPSAwOyB5IDwgNTsgeSsrKSB7Ci0gICAgZm9yIChpbnQzMl90IHggPSAwOyB4IDwgNTsgeCsrKSB7Ci0gICAgICBpZiAoIUlzRW1wdHkobWF0cml4LT5HZXQoeFN0YXJ0ICsgeCwgeSArIHlTdGFydCkpKSB7Ci0gICAgICAgIGUgPSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVEYXRhOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBtYXRyaXgtPlNldCh4U3RhcnQgKyB4LCB5U3RhcnQgKyB5LCBQT1NJVElPTl9BREpVU1RNRU5UX1BBVFRFUk5beV1beF0pOwotICAgIH0KLSAgfQotfQotdm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkVtYmVkUG9zaXRpb25EZXRlY3Rpb25QYXR0ZXJuKAotICAgIGludDMyX3QgeFN0YXJ0LAotICAgIGludDMyX3QgeVN0YXJ0LAotICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCi0gICAgaW50MzJfdCYgZSkgewotICBpZiAoIW1hdHJpeCkgewotICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOwotICAgIHJldHVybjsKLSAgfQotICBmb3IgKGludDMyX3QgeSA9IDA7IHkgPCA3OyB5KyspIHsKLSAgICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCA3OyB4KyspIHsKLSAgICAgIGlmICghSXNFbXB0eShtYXRyaXgtPkdldCh4U3RhcnQgKyB4LCB5U3RhcnQgKyB5KSkpIHsKLSAgICAgICAgZSA9IEJDRXhjZXB0aW9uSW52YWxpZGF0ZURhdGE7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIG1hdHJpeC0+U2V0KHhTdGFydCArIHgsIHlTdGFydCArIHksIFBPU0lUSU9OX0RFVEVDVElPTl9QQVRURVJOW3ldW3hdKTsKLSAgICB9Ci0gIH0KLX0KLXZvaWQgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpFbWJlZFBvc2l0aW9uRGV0ZWN0aW9uUGF0dGVybnNBbmRTZXBhcmF0b3JzKAotICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCi0gICAgaW50MzJfdCYgZSkgewotICBpZiAoIW1hdHJpeCkgewotICAgIGUgPSBCQ0V4Y2VwdGlvbk51bGxQb2ludGVyOwotICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IHBkcFdpZHRoID0gNzsKLSAgRW1iZWRQb3NpdGlvbkRldGVjdGlvblBhdHRlcm4oMCwgMCwgbWF0cml4LCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm47Ci0gIEVtYmVkUG9zaXRpb25EZXRlY3Rpb25QYXR0ZXJuKG1hdHJpeC0+R2V0V2lkdGgoKSAtIHBkcFdpZHRoLCAwLCBtYXRyaXgsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybjsKLSAgRW1iZWRQb3NpdGlvbkRldGVjdGlvblBhdHRlcm4oMCwgbWF0cml4LT5HZXRXaWR0aCgpIC0gcGRwV2lkdGgsIG1hdHJpeCwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotICBpbnQzMl90IGhzcFdpZHRoID0gODsKLSAgRW1iZWRIb3Jpem9udGFsU2VwYXJhdGlvblBhdHRlcm4oMCwgaHNwV2lkdGggLSAxLCBtYXRyaXgsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybjsKLSAgRW1iZWRIb3Jpem9udGFsU2VwYXJhdGlvblBhdHRlcm4obWF0cml4LT5HZXRXaWR0aCgpIC0gaHNwV2lkdGgsIGhzcFdpZHRoIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm47Ci0gIEVtYmVkSG9yaXpvbnRhbFNlcGFyYXRpb25QYXR0ZXJuKDAsIG1hdHJpeC0+R2V0V2lkdGgoKSAtIGhzcFdpZHRoLCBtYXRyaXgsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybjsKLSAgaW50MzJfdCB2c3BTaXplID0gNzsKLSAgRW1iZWRWZXJ0aWNhbFNlcGFyYXRpb25QYXR0ZXJuKHZzcFNpemUsIDAsIG1hdHJpeCwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotICBFbWJlZFZlcnRpY2FsU2VwYXJhdGlvblBhdHRlcm4obWF0cml4LT5HZXRIZWlnaHQoKSAtIHZzcFNpemUgLSAxLCAwLCBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm47Ci0gIEVtYmVkVmVydGljYWxTZXBhcmF0aW9uUGF0dGVybih2c3BTaXplLCBtYXRyaXgtPkdldEhlaWdodCgpIC0gdnNwU2l6ZSwgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuOwotfQotdm9pZCBDQkNfUVJDb2Rlck1hdHJpeFV0aWw6Ok1heWJlRW1iZWRQb3NpdGlvbkFkanVzdG1lbnRQYXR0ZXJucygKLSAgICBpbnQzMl90IHZlcnNpb24sCi0gICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwKLSAgICBpbnQzMl90JiBlKSB7Ci0gIGlmICghbWF0cml4KSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uTnVsbFBvaW50ZXI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmICh2ZXJzaW9uIDwgMikgewotICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IGluZGV4ID0gdmVyc2lvbiAtIDE7Ci0gIGludDMyX3QgY29uc3QqIGNvb3JkaW5hdGVzID0KLSAgICAgICYoUE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOX0NPT1JESU5BVEVfVEFCTEVbaW5kZXhdWzBdKTsKLSAgaW50MzJfdCBudW1Db29yZGluYXRlID0gNzsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtQ29vcmRpbmF0ZTsgaSsrKSB7Ci0gICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbnVtQ29vcmRpbmF0ZTsgaisrKSB7Ci0gICAgICBpbnQzMl90IHkgPSBjb29yZGluYXRlc1tpXTsKLSAgICAgIGludDMyX3QgeCA9IGNvb3JkaW5hdGVzW2pdOwotICAgICAgaWYgKHggPT0gLTEgfHwgeSA9PSAtMSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmIChJc0VtcHR5KG1hdHJpeC0+R2V0KHgsIHkpKSkgewotICAgICAgICBFbWJlZFBvc2l0aW9uQWRqdXN0bWVudFBhdHRlcm4oeCAtIDIsIHkgLSAyLCBtYXRyaXgsIGUpOwotICAgICAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLWludDMyX3QgQ0JDX1FSQ29kZXJNYXRyaXhVdGlsOjpGaW5kTVNCU2V0KGludDMyX3QgdmFsdWUpIHsKLSAgaW50MzJfdCBudW1EaWdpdHMgPSAwOwotICB3aGlsZSAodmFsdWUgIT0gMCkgewotICAgIHZhbHVlID4+PSAxOwotICAgICsrbnVtRGlnaXRzOwotICB9Ci0gIHJldHVybiBudW1EaWdpdHM7Ci19Ci1DQkNfUVJDb2Rlck1hdHJpeFV0aWw6OkNCQ19RUkNvZGVyTWF0cml4VXRpbCgpIHt9Ci1DQkNfUVJDb2Rlck1hdHJpeFV0aWw6On5DQkNfUVJDb2Rlck1hdHJpeFV0aWwoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hdHJpeFV0aWwuaCBiL3hmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNYXRyaXhVdGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZTRiNzUuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1hdHJpeFV0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSTUFUUklYVVRJTF9IXwotI2RlZmluZSBYRkFfRlhCQVJDT0RFX1FSQ09ERV9CQ19RUkNPREVSTUFUUklYVVRJTF9IXwotCi1jbGFzcyBDQkNfQ29tbW9uQnl0ZU1hdHJpeDsKLWNsYXNzIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWw7Ci1jbGFzcyBDQkNfUVJDb2RlckJpdFZlY3RvcjsKLWNsYXNzIENCQ19RUkNvZGVyTWF0cml4VXRpbCB7Ci0gcHJpdmF0ZToKLSAgc3RhdGljIGNvbnN0IGludDMyX3QgUE9TSVRJT05fREVURUNUSU9OX1BBVFRFUk5bN11bN107Ci0gIHN0YXRpYyBjb25zdCBpbnQzMl90IFZFUlRJQ0FMX1NFUEFSQVRJT05fUEFUVEVSTls3XVsxXTsKLSAgc3RhdGljIGNvbnN0IGludDMyX3QgSE9SSVpPTlRBTF9TRVBBUkFUSU9OX1BBVFRFUk5bMV1bOF07Ci0gIHN0YXRpYyBjb25zdCBpbnQzMl90IFBPU0lUSU9OX0FESlVTVE1FTlRfUEFUVEVSTls1XVs1XTsKLSAgc3RhdGljIGNvbnN0IGludDMyX3QgUE9TSVRJT05fQURKVVNUTUVOVF9QQVRURVJOX0NPT1JESU5BVEVfVEFCTEVbNDBdWzddOwotICBzdGF0aWMgY29uc3QgaW50MzJfdCBUWVBFX0lORk9fQ09PUkRJTkFURVNbMTVdWzJdOwotICBzdGF0aWMgY29uc3QgaW50MzJfdCBWRVJTSU9OX0lORk9fUE9MWTsKLSAgc3RhdGljIGNvbnN0IGludDMyX3QgVFlQRV9JTkZPX1BPTFk7Ci0gIHN0YXRpYyBjb25zdCBpbnQzMl90IFRZUEVfSU5GT19NQVNLX1BBVFRFUk47Ci0KLSBwdWJsaWM6Ci0gIENCQ19RUkNvZGVyTWF0cml4VXRpbCgpOwotICB2aXJ0dWFsIH5DQkNfUVJDb2Rlck1hdHJpeFV0aWwoKTsKLSAgc3RhdGljIHZvaWQgQ2xlYXJNYXRyaXgoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgaW50MzJfdCYgZSk7Ci0gIHN0YXRpYyB2b2lkIEJ1aWxkTWF0cml4KENCQ19RUkNvZGVyQml0VmVjdG9yKiBkYXRhQml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbCogZWNMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1hc2tQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIHZvaWQgRW1iZWRCYXNpY1BhdHRlcm5zKGludDMyX3QgdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIHZvaWQgRW1iZWRUeXBlSW5mbyhDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWFza1BhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIHZvaWQgRW1iZWREYXRhQml0cyhDQkNfUVJDb2RlckJpdFZlY3RvciogZGF0YUJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXNrUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotICBzdGF0aWMgdm9pZCBNYXliZUVtYmVkVmVyc2lvbkluZm8oaW50MzJfdCB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotICBzdGF0aWMgaW50MzJfdCBGaW5kTVNCU2V0KGludDMyX3QgdmFsdWUpOwotICBzdGF0aWMgaW50MzJfdCBDYWxjdWxhdGVCQ0hDb2RlKGludDMyX3QgY29kZSwgaW50MzJfdCBwb2x5KTsKLSAgc3RhdGljIHZvaWQgTWFrZVR5cGVJbmZvQml0cyhDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWFza1BhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX1FSQ29kZXJCaXRWZWN0b3IqIGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7Ci0gIHN0YXRpYyB2b2lkIE1ha2VWZXJzaW9uSW5mb0JpdHMoaW50MzJfdCB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyQml0VmVjdG9yKiBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotICBzdGF0aWMgYm9vbCBJc0VtcHR5KGludDMyX3QgdmFsdWUpOwotICBzdGF0aWMgYm9vbCBJc1ZhbGlkVmFsdWUoaW50MzJfdCB2YWx1ZSk7Ci0gIHN0YXRpYyB2b2lkIEVtYmVkVGltaW5nUGF0dGVybnMoQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwgaW50MzJfdCYgZSk7Ci0gIHN0YXRpYyB2b2lkIEVtYmVkRGFya0RvdEF0TGVmdEJvdHRvbUNvcm5lcihDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7Ci0gIHN0YXRpYyB2b2lkIEVtYmVkSG9yaXpvbnRhbFNlcGFyYXRpb25QYXR0ZXJuKGludDMyX3QgeFN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHlTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSk7Ci0gIHN0YXRpYyB2b2lkIEVtYmVkVmVydGljYWxTZXBhcmF0aW9uUGF0dGVybihpbnQzMl90IHhTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeVN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0JDX0NvbW1vbkJ5dGVNYXRyaXgqIG1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGUpOwotICBzdGF0aWMgdm9pZCBFbWJlZFBvc2l0aW9uQWRqdXN0bWVudFBhdHRlcm4oaW50MzJfdCB4U3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHlTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIHZvaWQgRW1iZWRQb3NpdGlvbkRldGVjdGlvblBhdHRlcm4oaW50MzJfdCB4U3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgeVN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQkNfQ29tbW9uQnl0ZU1hdHJpeCogbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIHZvaWQgRW1iZWRQb3NpdGlvbkRldGVjdGlvblBhdHRlcm5zQW5kU2VwYXJhdG9ycygKLSAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCi0gICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIHZvaWQgTWF5YmVFbWJlZFBvc2l0aW9uQWRqdXN0bWVudFBhdHRlcm5zKGludDMyX3QgdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19Db21tb25CeXRlTWF0cml4KiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUk1BVFJJWFVUSUxfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNb2RlLmNwcCBiL3hmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNb2RlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTEyODNkZC4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTW9kZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotLy8gT3JpZ2luYWwgY29kZSBpcyBsaWNlbnNlZCBhcyBmb2xsb3dzOgotLyoKLSAqIENvcHlyaWdodCAyMDA3IFpYaW5nIGF1dGhvcnMKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJNb2RlLmgiCi0KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlclZlcnNpb24uaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3V0aWxzLmgiCi0KLUNCQ19RUkNvZGVyTW9kZSogQ0JDX1FSQ29kZXJNb2RlOjpzQllURSA9IG51bGxwdHI7Ci1DQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyTW9kZTo6c05VTUVSSUMgPSBudWxscHRyOwotQ0JDX1FSQ29kZXJNb2RlKiBDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUMgPSBudWxscHRyOwotQ0JDX1FSQ29kZXJNb2RlKiBDQkNfUVJDb2Rlck1vZGU6OnNLQU5KSSA9IG51bGxwdHI7Ci1DQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyTW9kZTo6c0VDSSA9IG51bGxwdHI7Ci1DQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyTW9kZTo6c0dCSyA9IG51bGxwdHI7Ci1DQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyTW9kZTo6c1RFUk1JTkFUT1IgPSBudWxscHRyOwotQ0JDX1FSQ29kZXJNb2RlKiBDQkNfUVJDb2Rlck1vZGU6OnNGTkMxX0ZJUlNUX1BPU0lUSU9OID0gbnVsbHB0cjsKLUNCQ19RUkNvZGVyTW9kZSogQ0JDX1FSQ29kZXJNb2RlOjpzRk5DMV9TRUNPTkRfUE9TSVRJT04gPSBudWxscHRyOwotQ0JDX1FSQ29kZXJNb2RlKiBDQkNfUVJDb2Rlck1vZGU6OnNTVFJVQ1RVUkVEX0FQUEVORCA9IG51bGxwdHI7Ci0KLUNCQ19RUkNvZGVyTW9kZTo6Q0JDX1FSQ29kZXJNb2RlKHN0ZDo6dmVjdG9yPGludDMyX3Q+IGNoYXJDb3VudEJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyBuYW1lKQotICAgIDogbV9jaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9ucyhzdGQ6Om1vdmUoY2hhckNvdW50Qml0cykpLAotICAgICAgbV9iaXRzKGJpdHMpLAotICAgICAgbV9uYW1lKG5hbWUpIHt9Ci0KLUNCQ19RUkNvZGVyTW9kZTo6fkNCQ19RUkNvZGVyTW9kZSgpIHt9Ci0KLXZvaWQgQ0JDX1FSQ29kZXJNb2RlOjpJbml0aWFsaXplKCkgewotICBzQllURSA9IG5ldyBDQkNfUVJDb2Rlck1vZGUoezgsIDE2LCAxNn0sIDB4NCwgIkJZVEUiKTsKLSAgc0FMUEhBTlVNRVJJQyA9IG5ldyBDQkNfUVJDb2Rlck1vZGUoezksIDExLCAxM30sIDB4MiwgIkFMUEhBTlVNRVJJQyIpOwotICBzRUNJID0gbmV3IENCQ19RUkNvZGVyTW9kZShzdGQ6OnZlY3RvcjxpbnQzMl90PigpLCAweDcsICJFQ0kiKTsKLSAgc0tBTkpJID0gbmV3IENCQ19RUkNvZGVyTW9kZSh7OCwgMTAsIDEyfSwgMHg4LCAiS0FOSkkiKTsKLSAgc05VTUVSSUMgPSBuZXcgQ0JDX1FSQ29kZXJNb2RlKHsxMCwgMTIsIDE0fSwgMHgxLCAiTlVNRVJJQyIpOwotICBzR0JLID0gbmV3IENCQ19RUkNvZGVyTW9kZSh7OCwgMTAsIDEyfSwgMHgwRCwgIkdCSyIpOwotICBzVEVSTUlOQVRPUiA9IG5ldyBDQkNfUVJDb2Rlck1vZGUoc3RkOjp2ZWN0b3I8aW50MzJfdD4oKSwgMHgwMCwgIlRFUk1JTkFUT1IiKTsKLSAgc0ZOQzFfRklSU1RfUE9TSVRJT04gPQotICAgICAgbmV3IENCQ19RUkNvZGVyTW9kZShzdGQ6OnZlY3RvcjxpbnQzMl90PigpLCAweDA1LCAiRk5DMV9GSVJTVF9QT1NJVElPTiIpOwotICBzRk5DMV9TRUNPTkRfUE9TSVRJT04gPQotICAgICAgbmV3IENCQ19RUkNvZGVyTW9kZShzdGQ6OnZlY3RvcjxpbnQzMl90PigpLCAweDA5LCAiRk5DMV9TRUNPTkRfUE9TSVRJT04iKTsKLSAgc1NUUlVDVFVSRURfQVBQRU5EID0KLSAgICAgIG5ldyBDQkNfUVJDb2Rlck1vZGUoc3RkOjp2ZWN0b3I8aW50MzJfdD4oKSwgMHgwMywgIlNUUlVDVFVSRURfQVBQRU5EIik7Ci19Ci0KLXZvaWQgQ0JDX1FSQ29kZXJNb2RlOjpGaW5hbGl6ZSgpIHsKLSAgZGVsZXRlIHNCWVRFOwotICBkZWxldGUgc0FMUEhBTlVNRVJJQzsKLSAgZGVsZXRlIHNFQ0k7Ci0gIGRlbGV0ZSBzS0FOSkk7Ci0gIGRlbGV0ZSBzTlVNRVJJQzsKLSAgZGVsZXRlIHNHQks7Ci0gIGRlbGV0ZSBzVEVSTUlOQVRPUjsKLSAgZGVsZXRlIHNGTkMxX0ZJUlNUX1BPU0lUSU9OOwotICBkZWxldGUgc0ZOQzFfU0VDT05EX1BPU0lUSU9OOwotICBkZWxldGUgc1NUUlVDVFVSRURfQVBQRU5EOwotfQotCi1DQkNfUVJDb2Rlck1vZGUqIENCQ19RUkNvZGVyTW9kZTo6Rm9yQml0cyhpbnQzMl90IGJpdHMsIGludDMyX3QmIGUpIHsKLSAgc3dpdGNoIChiaXRzKSB7Ci0gICAgY2FzZSAweDA6Ci0gICAgICByZXR1cm4gc1RFUk1JTkFUT1I7Ci0gICAgY2FzZSAweDE6Ci0gICAgICByZXR1cm4gc05VTUVSSUM7Ci0gICAgY2FzZSAweDI6Ci0gICAgICByZXR1cm4gc0FMUEhBTlVNRVJJQzsKLSAgICBjYXNlIDB4MzoKLSAgICAgIHJldHVybiBzU1RSVUNUVVJFRF9BUFBFTkQ7Ci0gICAgY2FzZSAweDQ6Ci0gICAgICByZXR1cm4gc0JZVEU7Ci0gICAgY2FzZSAweDU6Ci0gICAgICByZXR1cm4gc0ZOQzFfRklSU1RfUE9TSVRJT047Ci0gICAgY2FzZSAweDc6Ci0gICAgICByZXR1cm4gc0VDSTsKLSAgICBjYXNlIDB4ODoKLSAgICAgIHJldHVybiBzS0FOSkk7Ci0gICAgY2FzZSAweDk6Ci0gICAgICByZXR1cm4gc0ZOQzFfU0VDT05EX1BPU0lUSU9OOwotICAgIGNhc2UgMHgwRDoKLSAgICAgIHJldHVybiBzR0JLOwotICAgIGRlZmF1bHQ6Ci0gICAgICBlID0gQkNFeGNlcHRpb25VbnN1cHBvcnRlZE1vZGU7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotfQotCi1pbnQzMl90IENCQ19RUkNvZGVyTW9kZTo6R2V0Qml0cygpIGNvbnN0IHsKLSAgcmV0dXJuIG1fYml0czsKLX0KLQotQ0ZYX0J5dGVTdHJpbmcgQ0JDX1FSQ29kZXJNb2RlOjpHZXROYW1lKCkgY29uc3QgewotICByZXR1cm4gbV9uYW1lOwotfQotCi1pbnQzMl90IENCQ19RUkNvZGVyTW9kZTo6R2V0Q2hhcmFjdGVyQ291bnRCaXRzKENCQ19RUkNvZGVyVmVyc2lvbiogdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgZSkgY29uc3QgewotICBpZiAobV9jaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9ucy5lbXB0eSgpKSB7Ci0gICAgZSA9IEJDRXhjZXB0aW9uQ2hhcmFjdGVyTm90VGhpc01vZGU7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaW50MzJfdCBudW1iZXIgPSB2ZXJzaW9uLT5HZXRWZXJzaW9uTnVtYmVyKCk7Ci0gIGludDMyX3Qgb2Zmc2V0OwotICBpZiAobnVtYmVyIDw9IDkpIHsKLSAgICBvZmZzZXQgPSAwOwotICB9IGVsc2UgaWYgKG51bWJlciA8PSAyNikgewotICAgIG9mZnNldCA9IDE7Ci0gIH0gZWxzZSB7Ci0gICAgb2Zmc2V0ID0gMjsKLSAgfQotICByZXR1cm4gbV9jaGFyYWN0ZXJDb3VudEJpdHNGb3JWZXJzaW9uc1tvZmZzZXRdOwotfQotCi12b2lkIENCQ19RUkNvZGVyTW9kZTo6RGVzdHJveSgpIHsKLSAgaWYgKHNCWVRFKSB7Ci0gICAgZGVsZXRlIENCQ19RUkNvZGVyTW9kZTo6c0JZVEU7Ci0gICAgc0JZVEUgPSBudWxscHRyOwotICB9Ci0gIGlmIChzTlVNRVJJQykgewotICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNOVU1FUklDOwotICAgIHNOVU1FUklDID0gbnVsbHB0cjsKLSAgfQotICBpZiAoc0FMUEhBTlVNRVJJQykgewotICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNBTFBIQU5VTUVSSUM7Ci0gICAgc0FMUEhBTlVNRVJJQyA9IG51bGxwdHI7Ci0gIH0KLSAgaWYgKHNLQU5KSSkgewotICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNLQU5KSTsKLSAgICBzS0FOSkkgPSBudWxscHRyOwotICB9Ci0gIGlmIChzRUNJKSB7Ci0gICAgZGVsZXRlIENCQ19RUkNvZGVyTW9kZTo6c0VDSTsKLSAgICBzRUNJID0gbnVsbHB0cjsKLSAgfQotICBpZiAoc0dCSykgewotICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNHQks7Ci0gICAgc0dCSyA9IG51bGxwdHI7Ci0gIH0KLSAgaWYgKHNURVJNSU5BVE9SKSB7Ci0gICAgZGVsZXRlIENCQ19RUkNvZGVyTW9kZTo6c1RFUk1JTkFUT1I7Ci0gICAgc1RFUk1JTkFUT1IgPSBudWxscHRyOwotICB9Ci0gIGlmIChzRk5DMV9GSVJTVF9QT1NJVElPTikgewotICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNGTkMxX0ZJUlNUX1BPU0lUSU9OOwotICAgIHNGTkMxX0ZJUlNUX1BPU0lUSU9OID0gbnVsbHB0cjsKLSAgfQotICBpZiAoc0ZOQzFfU0VDT05EX1BPU0lUSU9OKSB7Ci0gICAgZGVsZXRlIENCQ19RUkNvZGVyTW9kZTo6c0ZOQzFfU0VDT05EX1BPU0lUSU9OOwotICAgIHNGTkMxX1NFQ09ORF9QT1NJVElPTiA9IG51bGxwdHI7Ci0gIH0KLSAgaWYgKHNTVFJVQ1RVUkVEX0FQUEVORCkgewotICAgIGRlbGV0ZSBDQkNfUVJDb2Rlck1vZGU6OnNTVFJVQ1RVUkVEX0FQUEVORDsKLSAgICBzU1RSVUNUVVJFRF9BUFBFTkQgPSBudWxscHRyOwotICB9Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTW9kZS5oIGIveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2Rlck1vZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg3NmQ4MS4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyTW9kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfUVJDT0RFX0JDX1FSQ09ERVJNT0RFX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfUVJDT0RFX0JDX1FSQ09ERVJNT0RFX0hfCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0KLWNsYXNzIENCQ19RUkNvZGVyVmVyc2lvbjsKLQotY2xhc3MgQ0JDX1FSQ29kZXJNb2RlIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkNCQ19RUkNvZGVyTW9kZSgpOwotCi0gIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsKLSAgc3RhdGljIHZvaWQgRmluYWxpemUoKTsKLSAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogRm9yQml0cyhpbnQzMl90IGJpdHMsIGludDMyX3QmIGUpOwotICBzdGF0aWMgdm9pZCBEZXN0cm95KCk7Ci0KLSAgaW50MzJfdCBHZXRDaGFyYWN0ZXJDb3VudEJpdHMoQ0JDX1FSQ29kZXJWZXJzaW9uKiB2ZXJzaW9uLCBpbnQzMl90JiBlKSBjb25zdDsKLSAgaW50MzJfdCBHZXRCaXRzKCkgY29uc3Q7Ci0gIENGWF9CeXRlU3RyaW5nIEdldE5hbWUoKSBjb25zdDsKLQotICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBzQllURTsKLSAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc05VTUVSSUM7Ci0gIHN0YXRpYyBDQkNfUVJDb2Rlck1vZGUqIHNBTFBIQU5VTUVSSUM7Ci0gIHN0YXRpYyBDQkNfUVJDb2Rlck1vZGUqIHNLQU5KSTsKLSAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc0VDSTsKLSAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc0dCSzsKLSAgc3RhdGljIENCQ19RUkNvZGVyTW9kZSogc1RFUk1JTkFUT1I7Ci0gIHN0YXRpYyBDQkNfUVJDb2Rlck1vZGUqIHNGTkMxX0ZJUlNUX1BPU0lUSU9OOwotICBzdGF0aWMgQ0JDX1FSQ29kZXJNb2RlKiBzRk5DMV9TRUNPTkRfUE9TSVRJT047Ci0gIHN0YXRpYyBDQkNfUVJDb2Rlck1vZGUqIHNTVFJVQ1RVUkVEX0FQUEVORDsKLQotIHByaXZhdGU6Ci0gIENCQ19RUkNvZGVyTW9kZSgpOwotICBDQkNfUVJDb2Rlck1vZGUoc3RkOjp2ZWN0b3I8aW50MzJfdD4gY2hhckNvdW50Qml0cywKLSAgICAgICAgICAgICAgICAgIGludDMyX3QgYml0cywKLSAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nIG5hbWUpOwotCi0gIHN0ZDo6dmVjdG9yPGludDMyX3Q+IG1fY2hhcmFjdGVyQ291bnRCaXRzRm9yVmVyc2lvbnM7Ci0gIGNvbnN0IGludDMyX3QgbV9iaXRzOwotICBjb25zdCBDRlhfQnl0ZVN0cmluZyBtX25hbWU7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEJBUkNPREVfUVJDT0RFX0JDX1FSQ09ERVJNT0RFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyVmVyc2lvbi5jcHAgYi94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyVmVyc2lvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZmRjMTcuLjAwMDAwMDAKLS0tIGEveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlclZlcnNpb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzk0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLS8vIE9yaWdpbmFsIGNvZGUgaXMgbGljZW5zZWQgYXMgZm9sbG93czoKLS8qCi0gKiBDb3B5cmlnaHQgMjAwNyBaWGluZyBhdXRob3JzCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL2NvbW1vbi9CQ19Db21tb25CaXRNYXRyaXguaCIKLSNpbmNsdWRlICJ4ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyQml0VmVjdG9yLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlckVDQi5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFQ0Jsb2Nrcy5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbC5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvcXJjb2RlL0JDX1FSQ29kZXJWZXJzaW9uLmgiCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS91dGlscy5oIgotCi1uYW1lc3BhY2UgewotCi1jb25zdCB1aW50OF90IEJJVFNfU0VUX0lOX0hBTEZfQllURVtdID0gezAsIDEsIDEsIDIsIDEsIDIsIDIsIDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDIsIDIsIDMsIDIsIDMsIDMsIDR9OwotCi1pbnQzMl90IE51bUJpdHNEaWZmZXJpbmcoaW50MzJfdCBhLCBpbnQzMl90IGIpIHsKLSAgYSBePSBiOwotICByZXR1cm4gQklUU19TRVRfSU5fSEFMRl9CWVRFW2EgJiAweDBGXSArCi0gICAgICAgICBCSVRTX1NFVF9JTl9IQUxGX0JZVEVbKGEgPj4gNCkgJiAweDBGXSArCi0gICAgICAgICBCSVRTX1NFVF9JTl9IQUxGX0JZVEVbKGEgPj4gOCkgJiAweDBGXSArCi0gICAgICAgICBCSVRTX1NFVF9JTl9IQUxGX0JZVEVbKGEgPj4gMTIpICYgMHgwRl0gKwotICAgICAgICAgQklUU19TRVRfSU5fSEFMRl9CWVRFWyhhID4+IDE2KSAmIDB4MEZdICsKLSAgICAgICAgIEJJVFNfU0VUX0lOX0hBTEZfQllURVsoYSA+PiAyMCkgJiAweDBGXSArCi0gICAgICAgICBCSVRTX1NFVF9JTl9IQUxGX0JZVEVbKGEgPj4gMjQpICYgMHgwRl0gKwotICAgICAgICAgQklUU19TRVRfSU5fSEFMRl9CWVRFWyhhID4+IDI4KSAmIDB4MEZdOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotY29uc3QgaW50MzJfdCBDQkNfUVJDb2RlclZlcnNpb246OlZFUlNJT05fREVDT0RFX0lORk9bXSA9IHsKLSAgICAweDA3Qzk0LCAweDA4NUJDLCAweDA5QTk5LCAweDBBNEQzLCAweDBCQkY2LCAweDBDNzYyLCAweDBEODQ3LAotICAgIDB4MEU2MEQsIDB4MEY5MjgsIDB4MTBCNzgsIDB4MTE0NUQsIDB4MTJBMTcsIDB4MTM1MzIsIDB4MTQ5QTYsCi0gICAgMHgxNTY4MywgMHgxNjhDOSwgMHgxNzdFQywgMHgxOEVDNCwgMHgxOTFFMSwgMHgxQUZBQiwgMHgxQjA4RSwKLSAgICAweDFDQzFBLCAweDFEMzNGLCAweDFFRDc1LCAweDFGMjUwLCAweDIwOUQ1LCAweDIxNkYwLCAweDIyOEJBLAotICAgIDB4MjM3OUYsIDB4MjRCMEIsIDB4MjU0MkUsIDB4MjZBNjQsIDB4Mjc1NDEsIDB4MjhDNjl9OwotCi1DRlhfQXJyYXlUZW1wbGF0ZTxDQkNfUVJDb2RlclZlcnNpb24qPiogQ0JDX1FSQ29kZXJWZXJzaW9uOjpWRVJTSU9OID0gbnVsbHB0cjsKLQotdm9pZCBDQkNfUVJDb2RlclZlcnNpb246OkluaXRpYWxpemUoKSB7Ci0gIFZFUlNJT04gPSBuZXcgQ0ZYX0FycmF5VGVtcGxhdGU8Q0JDX1FSQ29kZXJWZXJzaW9uKj4oKTsKLX0KLXZvaWQgQ0JDX1FSQ29kZXJWZXJzaW9uOjpGaW5hbGl6ZSgpIHsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgVkVSU0lPTi0+R2V0U2l6ZSgpOyBpKyspCi0gICAgZGVsZXRlIFZFUlNJT04tPkdldEF0KGkpOwotCi0gIGRlbGV0ZSBWRVJTSU9OOwotICBWRVJTSU9OID0gbnVsbHB0cjsKLX0KLUNCQ19RUkNvZGVyVmVyc2lvbjo6Q0JDX1FSQ29kZXJWZXJzaW9uKGludDMyX3QgdmVyc2lvbk51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRUNCbG9ja3MqIGVjQmxvY2tzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRUNCbG9ja3MqIGVjQmxvY2tzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRUNCbG9ja3MqIGVjQmxvY2tzMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENCQ19RUkNvZGVyRUNCbG9ja3MqIGVjQmxvY2tzNCkgewotICBtX3ZlcnNpb25OdW1iZXIgPSB2ZXJzaW9uTnVtYmVyOwotICBtX2VjQmxvY2tzQXJyYXkuQWRkKGVjQmxvY2tzMSk7Ci0gIG1fZWNCbG9ja3NBcnJheS5BZGQoZWNCbG9ja3MyKTsKLSAgbV9lY0Jsb2Nrc0FycmF5LkFkZChlY0Jsb2NrczMpOwotICBtX2VjQmxvY2tzQXJyYXkuQWRkKGVjQmxvY2tzNCk7Ci0gIGludDMyX3QgdG90YWwgPSAwOwotICBpbnQzMl90IGVjQ29kZVdvcmRzID0gZWNCbG9ja3MxLT5HZXRFQ0NvZGVXb3Jkc1BlckJsb2NrKCk7Ci0gIENGWF9BcnJheVRlbXBsYXRlPENCQ19RUkNvZGVyRUNCKj4qIGVjYkFycmF5ID0gZWNCbG9ja3MxLT5HZXRFQ0Jsb2NrcygpOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBlY2JBcnJheS0+R2V0U2l6ZSgpOyBpKyspIHsKLSAgICBDQkNfUVJDb2RlckVDQiogZWNCbG9jayA9ICgqZWNiQXJyYXkpW2ldOwotICAgIHRvdGFsICs9IGVjQmxvY2stPkdldENvdW50KCkgKiAoZWNCbG9jay0+R2V0RGF0YUNvZGVXb3JkcygpICsgZWNDb2RlV29yZHMpOwotICB9Ci0gIG1fdG90YWxDb2RlV29yZHMgPSB0b3RhbDsKLSAgc3dpdGNoICh2ZXJzaW9uTnVtYmVyKSB7Ci0gICAgY2FzZSAxOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDIyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA1OgotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgzMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDY6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDM0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNzoKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjIpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA4OgotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgyNCk7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg0Mik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDk6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDQ2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTA6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI4KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDUwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTE6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTI6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMyKTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTM6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDM0KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTQ6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDQ2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDY2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTU6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDQ4KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDcwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTY6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDUwKTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDc0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTc6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU0KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDc4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTg6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDgyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMTk6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU4KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDg2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjA6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDM0KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYyKTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDkwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjE6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI4KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDUwKTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDcyKTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDk0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjI6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDUwKTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDc0KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDk4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjM6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU0KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDc0KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEwMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI0OgotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgyOCk7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1NCk7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4MCk7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMDYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyNToKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzIpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTgpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoODQpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTEwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjY6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU4KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDExNCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI3OgotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgzNCk7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2Mik7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg5MCk7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMTgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyODoKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjYpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTApOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNzQpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoOTgpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTIyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjk6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU0KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDc4KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEwMik7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMjYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMDoKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMjYpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTIpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNzgpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTA0KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEzMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDMxOgotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgzMCk7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg1Nik7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg4Mik7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMDgpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTM0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzI6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDM0KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYwKTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDExMik7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMzgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzMzoKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDYpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMzApOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNTgpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoODYpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTE0KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDE0Mik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM0OgotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoNik7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgzNCk7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2Mik7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg5MCk7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMTgpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTQ2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzU6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU0KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDc4KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEwMik7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMjYpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTUwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzY6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI0KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDUwKTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDc2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEwMik7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMjgpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTU0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzc6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI4KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU0KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDgwKTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDEwNik7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMzIpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTU4KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzg6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMyKTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU4KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDg0KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDExMCk7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMzYpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTYyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzk6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDI2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU0KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDgyKTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDExMCk7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxMzgpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTY2KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDA6Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDMwKTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDU4KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDg2KTsKLSAgICAgIG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuQWRkKDExNCk7Ci0gICAgICBtX2FsaWdubWVudFBhdHRlcm5DZW50ZXJzLkFkZCgxNDIpOwotICAgICAgbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVycy5BZGQoMTcwKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLUNCQ19RUkNvZGVyVmVyc2lvbjo6fkNCQ19RUkNvZGVyVmVyc2lvbigpIHsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbV9lY0Jsb2Nrc0FycmF5LkdldFNpemUoKTsgKytpKQotICAgIGRlbGV0ZSBtX2VjQmxvY2tzQXJyYXlbaV07Ci19Ci0KLWludDMyX3QgQ0JDX1FSQ29kZXJWZXJzaW9uOjpHZXRWZXJzaW9uTnVtYmVyKCkgewotICByZXR1cm4gbV92ZXJzaW9uTnVtYmVyOwotfQotQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4qIENCQ19RUkNvZGVyVmVyc2lvbjo6R2V0QWxpZ25tZW50UGF0dGVybkNlbnRlcnMoKSB7Ci0gIHJldHVybiAmbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVyczsKLX0KLWludDMyX3QgQ0JDX1FSQ29kZXJWZXJzaW9uOjpHZXRUb3RhbENvZGVXb3JkcygpIHsKLSAgcmV0dXJuIG1fdG90YWxDb2RlV29yZHM7Ci19Ci1pbnQzMl90IENCQ19RUkNvZGVyVmVyc2lvbjo6R2V0RGltZW5zaW9uRm9yVmVyc2lvbigpIHsKLSAgcmV0dXJuIDE3ICsgNCAqIG1fdmVyc2lvbk51bWJlcjsKLX0KLUNCQ19RUkNvZGVyRUNCbG9ja3MqIENCQ19RUkNvZGVyVmVyc2lvbjo6R2V0RUNCbG9ja3NGb3JMZXZlbCgKLSAgICBDQkNfUVJDb2RlckVycm9yQ29ycmVjdGlvbkxldmVsKiBlY0xldmVsKSB7Ci0gIHJldHVybiBtX2VjQmxvY2tzQXJyYXlbZWNMZXZlbC0+T3JkaW5hbCgpXTsKLX0KLUNCQ19RUkNvZGVyVmVyc2lvbiogQ0JDX1FSQ29kZXJWZXJzaW9uOjpHZXRQcm92aXNpb25hbFZlcnNpb25Gb3JEaW1lbnNpb24oCi0gICAgaW50MzJfdCBkaW1lbnNpb24sCi0gICAgaW50MzJfdCYgZSkgewotICBpZiAoKGRpbWVuc2lvbiAlIDQpICE9IDEpIHsKLSAgICBlID0gQkNFeGNlcHRpb25SZWFkOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIENCQ19RUkNvZGVyVmVyc2lvbiogcWN2ID0gR2V0VmVyc2lvbkZvck51bWJlcigoZGltZW5zaW9uIC0gMTcpID4+IDIsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBudWxscHRyOwotICByZXR1cm4gcWN2OwotfQotQ0JDX1FSQ29kZXJWZXJzaW9uKiBDQkNfUVJDb2RlclZlcnNpb246OkRlY29kZVZlcnNpb25JbmZvcm1hdGlvbigKLSAgICBpbnQzMl90IHZlcnNpb25CaXRzLAotICAgIGludDMyX3QmIGUpIHsKLSAgaW50MzJfdCBiZXN0RGlmZmVyZW5jZSA9IEZYU1lTX0ludE1heDsKLSAgaW50MzJfdCBiZXN0VmVyc2lvbiA9IDA7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDM0OyBpKyspIHsKLSAgICBpbnQzMl90IHRhcmdldFZlcnNpb24gPSBWRVJTSU9OX0RFQ09ERV9JTkZPW2ldOwotICAgIGlmICh0YXJnZXRWZXJzaW9uID09IHZlcnNpb25CaXRzKSB7Ci0gICAgICBDQkNfUVJDb2RlclZlcnNpb24qIHFjdiA9IEdldFZlcnNpb25Gb3JOdW1iZXIoaSArIDcsIGUpOwotICAgICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICByZXR1cm4gcWN2OwotICAgIH0KLSAgICBpbnQzMl90IGJpdHNEaWZmZXJlbmNlID0gTnVtQml0c0RpZmZlcmluZyh2ZXJzaW9uQml0cywgdGFyZ2V0VmVyc2lvbik7Ci0gICAgaWYgKGJpdHNEaWZmZXJlbmNlIDwgYmVzdERpZmZlcmVuY2UpIHsKLSAgICAgIGJlc3RWZXJzaW9uID0gaSArIDc7Ci0gICAgICBiZXN0RGlmZmVyZW5jZSA9IGJpdHNEaWZmZXJlbmNlOwotICAgIH0KLSAgfQotICBpZiAoYmVzdERpZmZlcmVuY2UgPD0gMykgewotICAgIENCQ19RUkNvZGVyVmVyc2lvbiogcWN2ID0gR2V0VmVyc2lvbkZvck51bWJlcihiZXN0VmVyc2lvbiwgZSk7Ci0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIHJldHVybiBxY3Y7Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1DQkNfQ29tbW9uQml0TWF0cml4KiBDQkNfUVJDb2RlclZlcnNpb246OkJ1aWxkRnVuY3Rpb25QYXR0ZXJuKGludDMyX3QmIGUpIHsKLSAgaW50MzJfdCBkaW1lbnNpb24gPSBHZXREaW1lbnNpb25Gb3JWZXJzaW9uKCk7Ci0gIENCQ19Db21tb25CaXRNYXRyaXgqIGJpdE1hdHJpeCA9IG5ldyBDQkNfQ29tbW9uQml0TWF0cml4KCk7Ci0gIGJpdE1hdHJpeC0+SW5pdChkaW1lbnNpb24pOwotICBiaXRNYXRyaXgtPlNldFJlZ2lvbigwLCAwLCA5LCA5LCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgYml0TWF0cml4LT5TZXRSZWdpb24oZGltZW5zaW9uIC0gOCwgMCwgOCwgOSwgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIGJpdE1hdHJpeC0+U2V0UmVnaW9uKDAsIGRpbWVuc2lvbiAtIDgsIDksIDgsIGUpOwotICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgIHJldHVybiBudWxscHRyOwotICBpbnQzMl90IG1heCA9IG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnMuR2V0U2l6ZSgpOwotICBmb3IgKGludDMyX3QgeCA9IDA7IHggPCBtYXg7IHgrKykgewotICAgIGludDMyX3QgaSA9IG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnNbeF0gLSAyOwotICAgIGZvciAoaW50MzJfdCB5ID0gMDsgeSA8IG1heDsgeSsrKSB7Ci0gICAgICBpZiAoKHggPT0gMCAmJiAoeSA9PSAwIHx8IHkgPT0gbWF4IC0gMSkpIHx8ICh4ID09IG1heCAtIDEgJiYgeSA9PSAwKSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGJpdE1hdHJpeC0+U2V0UmVnaW9uKG1fYWxpZ25tZW50UGF0dGVybkNlbnRlcnNbeV0gLSAyLCBpLCA1LCA1LCBlKTsKLSAgICAgIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgfQotICBiaXRNYXRyaXgtPlNldFJlZ2lvbig2LCA5LCAxLCBkaW1lbnNpb24gLSAxNywgZSk7Ci0gIGlmIChlICE9IEJDRXhjZXB0aW9uTk8pCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIGJpdE1hdHJpeC0+U2V0UmVnaW9uKDksIDYsIGRpbWVuc2lvbiAtIDE3LCAxLCBlKTsKLSAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgaWYgKG1fdmVyc2lvbk51bWJlciA+IDYpIHsKLSAgICBiaXRNYXRyaXgtPlNldFJlZ2lvbihkaW1lbnNpb24gLSAxMSwgMCwgMywgNiwgZSk7Ci0gICAgaWYgKGUgIT0gQkNFeGNlcHRpb25OTykKLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIGJpdE1hdHJpeC0+U2V0UmVnaW9uKDAsIGRpbWVuc2lvbiAtIDExLCA2LCAzLCBlKTsKLSAgICBpZiAoZSAhPSBCQ0V4Y2VwdGlvbk5PKQotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgcmV0dXJuIGJpdE1hdHJpeDsKLX0KLUNCQ19RUkNvZGVyVmVyc2lvbiogQ0JDX1FSQ29kZXJWZXJzaW9uOjpHZXRWZXJzaW9uRm9yTnVtYmVyKAotICAgIGludDMyX3QgdmVyc2lvbk51bWJlciwKLSAgICBpbnQzMl90JiBlKSB7Ci0gIGlmIChWRVJTSU9OLT5HZXRTaXplKCkgPT0gMCkgewotICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKAotICAgICAgICAxLCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2Nrcyg3LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgMTkpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMTAsIG5ldyBDQkNfUVJDb2RlckVDQigxLCAxNikpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygxMywgbmV3IENCQ19RUkNvZGVyRUNCKDEsIDEzKSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDE3LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgOSkpKSk7Ci0gICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oCi0gICAgICAgIDIsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDEwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgMzQpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMTYsIG5ldyBDQkNfUVJDb2RlckVDQigxLCAyOCkpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMiwgbmV3IENCQ19RUkNvZGVyRUNCKDEsIDIyKSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgMTYpKSkpOwotICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKAotICAgICAgICAzLCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygxNSwgbmV3IENCQ19RUkNvZGVyRUNCKDEsIDU1KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgNDQpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMTgsIG5ldyBDQkNfUVJDb2RlckVDQigyLCAxNykpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMiwgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDEzKSkpKTsKLSAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigKLSAgICAgICAgNCwgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjAsIG5ldyBDQkNfUVJDb2RlckVDQigxLCA4MCkpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygxOCwgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDMyKSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgMjQpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMTYsIG5ldyBDQkNfUVJDb2RlckVDQig0LCA5KSkpKTsKLSAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigKLSAgICAgICAgNSwgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIG5ldyBDQkNfUVJDb2RlckVDQigxLCAxMDgpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIG5ldyBDQkNfUVJDb2RlckVDQigyLCA0MykpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygxOCwgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDE1KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDE2KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTIpKSkpOwotICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKAotICAgICAgICA2LCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygxOCwgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDY4KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDE2LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgMjcpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIG5ldyBDQkNfUVJDb2RlckVDQig0LCAxOSkpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDE1KSkpKTsKLSAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigKLSAgICAgICAgNywgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjAsIG5ldyBDQkNfUVJDb2RlckVDQigyLCA3OCkpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygxOCwgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDMxKSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDE4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTUpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIG5ldyBDQkNfUVJDb2RlckVDQig0LCAxMyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxLCAxNCkpKSk7Ci0gICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oCi0gICAgICAgIDgsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgOTcpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjIsIG5ldyBDQkNfUVJDb2RlckVDQigyLCAzOCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigyLCAzOSkpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMiwgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDE4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDE5KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTUpKSkpOwotICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKAotICAgICAgICA5LCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDExNikpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMiwgbmV3IENCQ19RUkNvZGVyRUNCKDMsIDM2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDM3KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDIwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTcpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIG5ldyBDQkNfUVJDb2RlckVDQig0LCAxMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig0LCAxMykpKSk7Ci0gICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oCi0gICAgICAgIDEwLCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygxOCwgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDY4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigyLCA2OSkpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNiwgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDQzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDEsIDQ0KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNiwgMTkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgMjApKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQig2LCAxNSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigyLCAxNikpKSk7Ci0gICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oCi0gICAgICAgIDExLCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMCwgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDgxKSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgNTApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgNTEpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQig0LCAyMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig0LCAyMykpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNCwgbmV3IENCQ19RUkNvZGVyRUNCKDMsIDEyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDgsIDEzKSkpKTsKLSAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigKLSAgICAgICAgMTIsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgOTIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDkzKSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNiwgMzYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgMzcpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjYsIG5ldyBDQkNfUVJDb2RlckVDQig0LCAyMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig2LCAyMSkpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDcsIDE0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDE1KSkpKTsKLSAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigKLSAgICAgICAgMTMsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTA3KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDIyLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoOCwgMzcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgMzgpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIG5ldyBDQkNfUVJDb2RlckVDQig4LCAyMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig0LCAyMSkpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyMiwgbmV3IENCQ19RUkNvZGVyRUNCKDEyLCAxMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig0LCAxMikpKSk7Ci0gICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oCi0gICAgICAgIDE0LCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDMsIDExNSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgMTE2KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgNDApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNSwgNDEpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjAsIG5ldyBDQkNfUVJDb2RlckVDQigxMSwgMTYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNSwgMTcpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIG5ldyBDQkNfUVJDb2RlckVDQigxMSwgMTIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNSwgMTMpKSkpOwotICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKAotICAgICAgICAxNSwgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjIsIG5ldyBDQkNfUVJDb2RlckVDQig1LCA4NyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgODgpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIG5ldyBDQkNfUVJDb2RlckVDQig1LCA0MSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig1LCA0MikpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDUsIDI0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDcsIDI1KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTEsIDEyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDcsIDEzKSkpKTsKLSAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigKLSAgICAgICAgMTYsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI0LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNSwgOTgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDEsIDk5KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNywgNDUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMywgNDYpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIG5ldyBDQkNfUVJDb2RlckVDQigxNSwgMTkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgMjApKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigzLCAxNSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxMywgMTYpKSkpOwotICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKAotICAgICAgICAxNywgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQigxLCAxMDcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDUsIDEwOCkpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDEwLCA0NiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxLCA0NykpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDEsIDIyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDE1LCAyMykpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDE0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDE3LCAxNSkpKSk7Ci0gICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oCi0gICAgICAgIDE4LCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDUsIDEyMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgMTIxKSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoOSwgNDMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgNDQpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQigxNywgMjIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgMjMpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQigyLCAxNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxOSwgMTUpKSkpOwotICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKAotICAgICAgICAxOSwgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQigzLCAxMTMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDExNCkpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNiwgbmV3IENCQ19RUkNvZGVyRUNCKDMsIDQ0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDExLCA0NSkpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNiwgbmV3IENCQ19RUkNvZGVyRUNCKDE3LCAyMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig0LCAyMikpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyNiwgbmV3IENCQ19RUkNvZGVyRUNCKDksIDEzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDE2LCAxNCkpKSk7Ci0gICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oCi0gICAgICAgIDIwLCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDMsIDEwNyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNSwgMTA4KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMywgNDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTMsIDQyKSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTUsIDI0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDUsIDI1KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTUsIDE1KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDEwLCAxNikpKSk7Ci0gICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oCi0gICAgICAgIDIxLCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDExNiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgMTE3KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTcsIDQyKSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTcsIDIyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDYsIDIzKSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTksIDE2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDYsIDE3KSkpKTsKLSAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigKLSAgICAgICAgMjIsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTExKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig3LCAxMTIpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQigxNywgNDYpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQig3LCAyNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxNiwgMjUpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjQsIG5ldyBDQkNfUVJDb2RlckVDQigzNCwgMTMpKSkpOwotICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKAotICAgICAgICAyMywgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQig0LCAxMjEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDUsIDEyMikpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDQ3KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDE0LCA0OCkpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDExLCAyNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxNCwgMjUpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigxNiwgMTUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTQsIDE2KSkpKTsKLSAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigKLSAgICAgICAgMjQsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNiwgMTE3KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig0LCAxMTgpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQig2LCA0NSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxNCwgNDYpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigxMSwgMjQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTYsIDI1KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMzAsIDE2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDE3KSkpKTsKLSAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigKLSAgICAgICAgMjUsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI2LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoOCwgMTA2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig0LCAxMDcpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQig4LCA0NyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxMywgNDgpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQig3LCAyNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigyMiwgMjUpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigyMiwgMTUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTMsIDE2KSkpKTsKLSAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigKLSAgICAgICAgMjYsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTAsIDExNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMiwgMTE1KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTksIDQ2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDQ3KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMjgsIDIyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDYsIDIzKSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMzMsIDE2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDQsIDE3KSkpKTsKLSAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigKLSAgICAgICAgMjcsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoOCwgMTIyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig0LCAxMjMpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQigyMiwgNDUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMywgNDYpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQig4LCAyMyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigyNiwgMjQpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigxMiwgMTUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMjgsIDE2KSkpKTsKLSAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigKLSAgICAgICAgMjgsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMywgMTE3KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxMCwgMTE4KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMywgNDUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMjMsIDQ2KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNCwgMjQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMzEsIDI1KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTEsIDE1KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDMxLCAxNikpKSk7Ci0gICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oCi0gICAgICAgIDI5LCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDcsIDExNiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNywgMTE3KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMjEsIDQ1KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDcsIDQ2KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgMjMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMzcsIDI0KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTksIDE1KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDI2LCAxNikpKSk7Ci0gICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oCi0gICAgICAgIDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDUsIDExNSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTAsIDExNikpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDE5LCA0NyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxMCwgNDgpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigxNSwgMjQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMjUsIDI1KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMjMsIDE1KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDI1LCAxNikpKSk7Ci0gICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oCi0gICAgICAgIDMxLCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDEzLCAxMTUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDMsIDExNikpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDIsIDQ2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDI5LCA0NykpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDQyLCAyNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxLCAyNSkpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDIzLCAxNSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigyOCwgMTYpKSkpOwotICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKAotICAgICAgICAzMiwgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigxNywgMTE1KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTAsIDQ2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDIzLCA0NykpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDEwLCAyNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigzNSwgMjUpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigxOSwgMTUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMzUsIDE2KSkpKTsKLSAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigKLSAgICAgICAgMzMsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTcsIDExNSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMSwgMTE2KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTQsIDQ2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDIxLCA0NykpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDI5LCAyNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxOSwgMjUpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigxMSwgMTUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNDYsIDE2KSkpKTsKLSAgICBWRVJTSU9OLT5BZGQobmV3IENCQ19RUkNvZGVyVmVyc2lvbigKLSAgICAgICAgMzQsIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTMsIDExNSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNiwgMTE2KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDI4LCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTQsIDQ2KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDIzLCA0NykpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDQ0LCAyNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig3LCAyNSkpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDU5LCAxNiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxLCAxNykpKSk7Ci0gICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oCi0gICAgICAgIDM1LCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDEyLCAxMjEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDcsIDEyMikpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDEyLCA0NyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigyNiwgNDgpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigzOSwgMjQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTQsIDI1KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMjIsIDE1KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDQxLCAxNikpKSk7Ci0gICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oCi0gICAgICAgIDM2LCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDYsIDEyMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTQsIDEyMikpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDYsIDQ3KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDM0LCA0OCkpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDQ2LCAyNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigxMCwgMjUpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigyLCAxNSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig2NCwgMTYpKSkpOwotICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKAotICAgICAgICAzNywgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigxNywgMTIyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig0LCAxMjMpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQigyOSwgNDYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTQsIDQ3KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNDksIDI0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDEwLCAyNSkpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDI0LCAxNSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig0NiwgMTYpKSkpOwotICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKAotICAgICAgICAzOCwgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQig0LCAxMjIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDE4LCAxMjMpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQigxMywgNDYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMzIsIDQ3KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoNDgsIDI0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDE0LCAyNSkpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDQyLCAxNSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigzMiwgMTYpKSkpOwotICAgIFZFUlNJT04tPkFkZChuZXcgQ0JDX1FSQ29kZXJWZXJzaW9uKAotICAgICAgICAzOSwgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigyMCwgMTE3KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQig0LCAxMTgpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMjgsIG5ldyBDQkNfUVJDb2RlckVDQig0MCwgNDcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoNywgNDgpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQig0MywgMjQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMjIsIDI1KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMTAsIDE1KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDY3LCAxNikpKSk7Ci0gICAgVkVSU0lPTi0+QWRkKG5ldyBDQkNfUVJDb2RlclZlcnNpb24oCi0gICAgICAgIDQwLCBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygzMCwgbmV3IENCQ19RUkNvZGVyRUNCKDE5LCAxMTgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDYsIDExOSkpLAotICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0Jsb2NrcygyOCwgbmV3IENCQ19RUkNvZGVyRUNCKDE4LCA0NyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQigzMSwgNDgpKSwKLSAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCbG9ja3MoMzAsIG5ldyBDQkNfUVJDb2RlckVDQigzNCwgMjQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ0JDX1FSQ29kZXJFQ0IoMzQsIDI1KSksCi0gICAgICAgIG5ldyBDQkNfUVJDb2RlckVDQmxvY2tzKDMwLCBuZXcgQ0JDX1FSQ29kZXJFQ0IoMjAsIDE1KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENCQ19RUkNvZGVyRUNCKDYxLCAxNikpKSk7Ci0gIH0KLSAgaWYgKHZlcnNpb25OdW1iZXIgPCAxIHx8IHZlcnNpb25OdW1iZXIgPiA0MCkgewotICAgIGUgPSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudDsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICByZXR1cm4gKCpWRVJTSU9OKVt2ZXJzaW9uTnVtYmVyIC0gMV07Ci19Ci0KLXZvaWQgQ0JDX1FSQ29kZXJWZXJzaW9uOjpEZXN0cm95KCkgewotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBWRVJTSU9OLT5HZXRTaXplKCk7IGkrKykKLSAgICBkZWxldGUgKCpWRVJTSU9OKVtpXTsKLSAgVkVSU0lPTi0+UmVtb3ZlQWxsKCk7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyVmVyc2lvbi5oIGIveGZhL2Z4YmFyY29kZS9xcmNvZGUvQkNfUVJDb2RlclZlcnNpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwZGQ1MS4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL3FyY29kZS9CQ19RUkNvZGVyVmVyc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfUVJDT0RFX0JDX1FSQ09ERVJWRVJTSU9OX0hfCi0jZGVmaW5lIFhGQV9GWEJBUkNPREVfUVJDT0RFX0JDX1FSQ09ERVJWRVJTSU9OX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0KLWNsYXNzIENCQ19Db21tb25CaXRNYXRyaXg7Ci1jbGFzcyBDQkNfUVJDb2RlckVDQmxvY2tzOwotY2xhc3MgQ0JDX1FSQ29kZXJFcnJvckNvcnJlY3Rpb25MZXZlbDsKLQotY2xhc3MgQ0JDX1FSQ29kZXJWZXJzaW9uIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkNCQ19RUkNvZGVyVmVyc2lvbigpOwotICBzdGF0aWMgdm9pZCBJbml0aWFsaXplKCk7Ci0gIHN0YXRpYyB2b2lkIEZpbmFsaXplKCk7Ci0KLSAgaW50MzJfdCBHZXRWZXJzaW9uTnVtYmVyKCk7Ci0gIGludDMyX3QgR2V0VG90YWxDb2RlV29yZHMoKTsKLSAgaW50MzJfdCBHZXREaW1lbnNpb25Gb3JWZXJzaW9uKCk7Ci0gIENCQ19Db21tb25CaXRNYXRyaXgqIEJ1aWxkRnVuY3Rpb25QYXR0ZXJuKGludDMyX3QmIGUpOwotICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiogR2V0QWxpZ25tZW50UGF0dGVybkNlbnRlcnMoKTsKLSAgQ0JDX1FSQ29kZXJFQ0Jsb2NrcyogR2V0RUNCbG9ja3NGb3JMZXZlbCgKLSAgICAgIENCQ19RUkNvZGVyRXJyb3JDb3JyZWN0aW9uTGV2ZWwqIGVjTGV2ZWwpOwotICBzdGF0aWMgQ0JDX1FSQ29kZXJWZXJzaW9uKiBHZXRWZXJzaW9uRm9yTnVtYmVyKGludDMyX3QgdmVyc2lvbk51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIENCQ19RUkNvZGVyVmVyc2lvbiogR2V0UHJvdmlzaW9uYWxWZXJzaW9uRm9yRGltZW5zaW9uKAotICAgICAgaW50MzJfdCBkaW1lbnNpb24sCi0gICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIENCQ19RUkNvZGVyVmVyc2lvbiogRGVjb2RlVmVyc2lvbkluZm9ybWF0aW9uKGludDMyX3QgdmVyc2lvbkJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBlKTsKLSAgc3RhdGljIHZvaWQgRGVzdHJveSgpOwotCi0gcHJpdmF0ZToKLSAgQ0JDX1FSQ29kZXJWZXJzaW9uKCk7Ci0gIENCQ19RUkNvZGVyVmVyc2lvbihpbnQzMl90IHZlcnNpb25OdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVDQmxvY2tzKiBlY0Jsb2NrczEsCi0gICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVDQmxvY2tzKiBlY0Jsb2NrczIsCi0gICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVDQmxvY2tzKiBlY0Jsb2NrczMsCi0gICAgICAgICAgICAgICAgICAgICBDQkNfUVJDb2RlckVDQmxvY2tzKiBlY0Jsb2NrczQpOwotCi0gIHN0YXRpYyBjb25zdCBpbnQzMl90IFZFUlNJT05fREVDT0RFX0lORk9bMzRdOwotICBzdGF0aWMgQ0ZYX0FycmF5VGVtcGxhdGU8Q0JDX1FSQ29kZXJWZXJzaW9uKj4qIFZFUlNJT047Ci0KLSAgaW50MzJfdCBtX3ZlcnNpb25OdW1iZXI7Ci0gIGludDMyX3QgbV90b3RhbENvZGVXb3JkczsKLSAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4gbV9hbGlnbm1lbnRQYXR0ZXJuQ2VudGVyczsKLSAgQ0ZYX0FycmF5VGVtcGxhdGU8Q0JDX1FSQ29kZXJFQ0Jsb2Nrcyo+IG1fZWNCbG9ja3NBcnJheTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYQkFSQ09ERV9RUkNPREVfQkNfUVJDT0RFUlZFUlNJT05fSF8KZGlmZiAtLWdpdCBhL3hmYS9meGJhcmNvZGUvdXRpbHMuaCBiL3hmYS9meGJhcmNvZGUvdXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNiOGQ4NS4uMDAwMDAwMAotLS0gYS94ZmEvZnhiYXJjb2RlL3V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEJBUkNPREVfVVRJTFNfSF8KLSNkZWZpbmUgWEZBX0ZYQkFSQ09ERV9VVElMU19IXwotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgotCi1ib29sIEJDX0ZYX0J5dGVTdHJpbmdfUmVwbGFjZShDRlhfQnl0ZVN0cmluZyYgZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsYXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0NIQVIgYyk7Ci12b2lkIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKENGWF9CeXRlU3RyaW5nJiBkc3QsIGludDMyX3QgY291bnQsIEZYX0NIQVIgYyk7Ci12b2lkIEJDX0ZYX0J5dGVTdHJpbmdfQXBwZW5kKENGWF9CeXRlU3RyaW5nJiBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BcnJheVRlbXBsYXRlPHVpbnQ4X3Q+JiBiYSk7Ci0KLSNpZiAoX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lONjRfKQotI2luY2x1ZGUgPGxpbWl0cz4KLSNlbGlmKF9GWF9PU18gPT0gX0ZYX01BQ09TWF8gfHwgX0ZYX09TXyA9PSBfRlhfTElOVVhfREVTS1RPUF8gfHwgXAotICAgICAgX0ZYX09TXyA9PSBfRlhfSU9TXykKLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNlbmRpZgotI2lmIChfRlhfT1NfID09IF9GWF9XSU4zMl9ERVNLVE9QXyB8fCBfRlhfT1NfID09IF9GWF9XSU42NF8pCi0jZGVmaW5lIEZYU1lTX2lzbmFuKHgpIF9pc25hbih4KQotI2VsaWYoX0ZYX09TXyA9PSBfRlhfTUFDT1NYXyB8fCBfRlhfT1NfID09IF9GWF9JT1NfIHx8IFwKLSAgICAgIF9GWF9PU18gPT0gX0ZYX0xJTlVYX0RFU0tUT1BfIHx8IF9GWF9PU18gPT0gX0ZYX0FORFJPSURfKQotI2luY2x1ZGUgPGNtYXRoPgotI2RlZmluZSBGWFNZU19pc25hbih4KSBzdGQ6OmlzbmFuKHgpCi0jZW5kaWYKLSNpZiAoX0ZYX09TXyA9PSBfRlhfV0lOMzJfREVTS1RPUF8gfHwgX0ZYX09TXyA9PSBfRlhfV0lONjRfKQotI2RlZmluZSBGWFNZU19uYW4oKSAoc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OnF1aWV0X05hTigpKQotI2VsaWYoX0ZYX09TXyA9PSBfRlhfTUFDT1NYXyB8fCBfRlhfT1NfID09IF9GWF9MSU5VWF9ERVNLVE9QXyB8fCBcCi0gICAgICBfRlhfT1NfID09IF9GWF9JT1NfIHx8IF9GWF9PU18gPT0gX0ZYX0FORFJPSURfKQotI2RlZmluZSBGWFNZU19uYW4oKSBOQU4KLSNlbmRpZgotZW51bSBCQ0ZPUk1BVCB7Ci0gIEJDRk9STUFUX1VOU1BFQ0lGWSA9IC0xLAotICBCQ0ZPUk1BVF9DT0RBQkFSLAotICBCQ0ZPUk1BVF9DT0RFXzM5LAotICBCQ0ZPUk1BVF9DT0RFXzEyOCwKLSAgQkNGT1JNQVRfQ09ERV8xMjhCLAotICBCQ0ZPUk1BVF9DT0RFXzEyOEMsCi0gIEJDRk9STUFUX0VBTl84LAotICBCQ0ZPUk1BVF9VUENfQSwKLSAgQkNGT1JNQVRfRUFOXzEzLAotICBCQ0ZPUk1BVF9QREZfNDE3LAotICBCQ0ZPUk1BVF9EQVRBTUFUUklYLAotICBCQ0ZPUk1BVF9RUl9DT0RFCi19OwotI2RlZmluZSBCQ0ZPUk1BVF9FQ0xFVkVMX0wgMAotI2RlZmluZSBCQ0ZPUk1BVF9FQ0xFVkVMX00gMQotI2RlZmluZSBCQ0ZPUk1BVF9FQ0xFVkVMX1EgMgotI2RlZmluZSBCQ0ZPUk1BVF9FQ0xFVkVMX0ggMwotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZGVmaW5lIEZYU1lTX0ludE1heCBJTlRfTUFYCi0jZGVmaW5lIEZYU1lTX0lzZGlnaXQgaXNkaWdpdAotI2RlZmluZSBCQ0V4Y2VwdGlvbk5PIDAKLSNkZWZpbmUgQkNFeGNlcHRpb25Ob3RGb3VuZCAxCi0jZGVmaW5lIEJDRXhjZXB0aW9uRW5kTGVzc1RoYW5TdGFydCAyCi0jZGVmaW5lIEJDRXhjZXB0aW9uVW5rbm93bkRlY29kZXIgMwotI2RlZmluZSBCQ0V4Y2VwdGlvblJvdGF0ZU5vdFN1cHBvcnRlZCA0Ci0jZGVmaW5lIEJDRXhjZXB0aW9uSGVpZ2h0QW5kV2lkdGhNdXN0QmVBdExlYXN0MSA1Ci0jZGVmaW5lIEJDRXhjZXB0aW9uUmVnaW9uTXVzdEZpdEluc2lkZU1hdHJpeCA2Ci0jZGVmaW5lIEJDRXhjZXB0aW9uQ2FuTm90Q2FsbEdldERpbWVuc2lvbk9uTm9uU3F1YXJlTWF0cml4IDcKLSNkZWZpbmUgQkNFeGNlcHRpb25Gb3JtYXRFeGNlcHRpb24gOAotI2RlZmluZSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudE11c3RNYXRjaFZlcnNpb25TaXplIDkKLSNkZWZpbmUgQkNFeGNlcHRpb25DaGVja3N1bUV4Y2VwdGlvbiAxMAotI2RlZmluZSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudEludmFsaWRGaXJzdERpZ2l0IDExCi0jZGVmaW5lIEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50SW52YWxpZFNlY29uZERpZ2l0IDEyCi0jZGVmaW5lIEJDRXhjZXB0aW9uUnVudGltZURlY29kaW5nSW52YWxpZElTT19JRUMgMTMKLSNkZWZpbmUgQkNFeGNlcHRpb25SdW50aW1lRGVjb2RpbmdJbnZhbGlkQWxwaGFudW1lcmljIDE0Ci0jZGVmaW5lIEJDRXhjZXB0aW9uTGVmdEFuZFRvcE11c3RCZU5vbm5lZ2F0aXZlIDE1Ci0jZGVmaW5lIEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50IDE2Ci0jZGVmaW5lIEJDRXhjZXB0aW9uQmFkRUNJIDE3Ci0jZGVmaW5lIEJDRXhjZXB0aW9uVW5TdXBwb3J0ZWRCYXJjb2RlIDE4Ci0jZGVmaW5lIEJDRXhjZXB0aW9uVW5TdXBwb3J0ZWRTdHJpbmcgMTkKLSNkZWZpbmUgQkNFeGNlcHRpb25EaWdpdExlbmd0aE11c3RCZTggMjAKLSNkZWZpbmUgQkNFeGNlcHRpb25EYXRhQ2hlY2tFeGNlcHRpb24gMjEKLSNkZWZpbmUgQkNFeGNlcHRpb25FeHRyYWN0TnVtYmVyVmFsdWVGcm9tQml0QXJyYXkgMjIKLSNkZWZpbmUgQkNFeGNlcHRpb25SZWFkIDIzCi0jZGVmaW5lIEJDRXhjZXB0aW9uUmVxdWVzdGVkUm93SXNPdXRTaXplVGhlSW1hZ2UgMjQKLSNkZWZpbmUgQkNFeGNlcHRpb25Ob0NvbnRlbnRzIDI2Ci0jZGVmaW5lIEJDRXhjZXB0aW9uVW5TdXBwb3J0RWNsZXZlbCAyNwotI2RlZmluZSBCQ0V4Y2VwdGlvblVuU3VwcG9ydE1vZGUgMjgKLSNkZWZpbmUgQkNFeGNlcHRpb25SZWZlcmVuY2VNdXN0QmVCZXR3ZWVuMEFuZDcgMjkKLSNkZWZpbmUgQkNFeGNlcHRpb25CYWRFcnJvckxvY2F0aW9uIDMwCi0jZGVmaW5lIEJDRXhjZXB0aW9uRGVncmVlSXNOZWdhdGl2ZSAzMQotI2RlZmluZSBCQ0V4Y2VwdGlvbkRpdmlkZUJ5WmVybyAzMgotI2RlZmluZSBCQ0V4Y2VwdGlvbkNvZWZmaWNpZW50c1NpemVJc051bGwgMzMKLSNkZWZpbmUgQkNFeGNlcHRpb25Ob0NvcnJlY3Rpb25CeXRlcyAzNAotI2RlZmluZSBCQ0V4Y2VwdGlvbk5vRGF0YUJ5dGVzUHJvdmlkZWQgMzUKLSNkZWZpbmUgQkNFeGNlcHRpb25SX0lfMUlzWmVybyAzNgotI2RlZmluZSBCQ0V4Y2VwdGlvbkFJc1plcm8gMzcKLSNkZWZpbmUgQkNFeGNlcHRpb25Jc1plcm8gMzgKLSNkZWZpbmUgQkNFeGNlcHRpb25EZWdyZWVOb3RNYXRjaFJvb3RzIDM5Ci0jZGVmaW5lIEJDRXhjZXB0aW9uQ29udGVudHNMZW5ndGhTaG91bGRCZXR3ZWVuMWFuZDgwIDQwCi0jZGVmaW5lIEJDRXhjZXB0aW9uT25seUVuY29kZUNPREVfMTI4IDQxCi0jZGVmaW5lIEJDRXhjZXB0aW9uT25seUVuY29kZUNPREVfMzkgNDIKLSNkZWZpbmUgQkNFeGNlcHRpb25Pbmx5RW5jb2RlRUFOXzEzIDQzCi0jZGVmaW5lIEJDRXhjZXB0aW9uT25seUVuY29kZUVBTl84IDQ0Ci0jZGVmaW5lIEJDRXhjZXB0aW9uT25seUVuY29kZUlURiA0NQotI2RlZmluZSBCQ0V4Y2VwdGlvbkRpZ2l0TGVuZ3RoU2hvdWxkMTMgNDYKLSNkZWZpbmUgQkNFeGNlcHRpb25EaWdpdExlbmd0aE11c3RCZTZvcjhvcjEwb3IxMm9yMTRvcjE2b3IyMG9yMjRvcjQ0IDQ3Ci0jZGVmaW5lIEJDRXhjZXB0aW9uT25seUVuY29kZVVQQ19BIDQ4Ci0jZGVmaW5lIEJDRXhjZXB0aW9uRGlnaXRMZW5ndGhTaG91bGRCZTEyIDQ5Ci0jZGVmaW5lIEJDRXhjZXB0aW9uVmFsdWVNdXN0QmVFaXRoZXIwb3IxIDUwCi0jZGVmaW5lIEJDRXhjZXB0aW9uUmVlZHNvbG9tbkRlY29kZUV4Y2VwdGlvbiA1MQotI2RlZmluZSBCQ0V4Y2VwdGlvbkJhZEluZGV4RXhjZXB0aW9uIDUyCi0jZGVmaW5lIEJDRXhjZXB0aW9uQmFkVmFsdWVFeGNlcHRpb24gNTMKLSNkZWZpbmUgQkNFeGNlcHRpb25CYWROdW1CaXRzRXhjZXB0aW9uIDU0Ci0jZGVmaW5lIEJDRXhjZXB0aW9uY2FuTm90T3BlcmF0ZXhvck9wZXJhdG9yIDU1Ci0jZGVmaW5lIEJDRXhjZXB0aW9uVmVyc2lvbk11c3QxXzQwIDU2Ci0jZGVmaW5lIEJDRXhjZXB0aW9uVW5rbm93biA1NwotI2RlZmluZSBCQ0V4Y2VwdGlvbk5vU3VjaFZlcnNpb24gNTgKLSNkZWZpbmUgQkNFeGNlcHRpb25DYW5ub3RGaW5kQmxvY2tJbmZvIDU5Ci0jZGVmaW5lIEJDRXhjZXB0aW9uRGF0YVRvb0JpZyA2MAotI2RlZmluZSBCQ0V4Y2VwdGlvbkludmFsaWRRUkNvZGUgNjEKLSNkZWZpbmUgQkNFeGNlcHRpb25EYXRhVG9vTWFueSA2MgotI2RlZmluZSBCQ0V4Y2VwdGlvbkJpdHNOb3RFcXVhbENhY2l0eSA2MwotI2RlZmluZSBCQ0V4Y2VwdGlvblVuc3VwcG9ydGVkTW9kZSA2NAotI2RlZmluZSBCQ0V4Y2VwdGlvbkludmFsaWRhdGVDaGFyYWN0ZXIgNjUKLSNkZWZpbmUgQkNFeGNlcHRpb25CeXRlc05vdE1hdGNoT2Zmc2V0IDY2Ci0jZGVmaW5lIEJDRXhjZXB0aW9uU2l6ZUluQnl0ZXNEaWZmZXIgNjcKLSNkZWZpbmUgQkNFeGNlcHRpb25JbnZhbGlkYXRlTWFza1BhdHRlcm4gNjgKLSNkZWZpbmUgQkNFeGNlcHRpb25OdWxsUG9pbnRlciA2OQotI2RlZmluZSBCQ0V4Y2VwdGlvbkJhZE1hc2sgNzAKLSNkZWZpbmUgQkNFeGNlcHRpb25CaXRTaXplTm90MTUgNzEKLSNkZWZpbmUgQkNFeGNlcHRpb25CaXRTaXplTm90MTggNzIKLSNkZWZpbmUgQkNFeGNlcHRpb25JbnZhbGlkYXRlSW1hZ2VEYXRhIDczCi0jZGVmaW5lIEJDRXhjZXB0aW9uSGVpZ2h0XzhCZVplcm8gNzQKLSNkZWZpbmUgQkNFeGNlcHRpb25DaGFyYWN0ZXJOb3RUaGlzTW9kZSA3NQotI2RlZmluZSBCQ0V4Y2VwdGlvbkJpdHNCeXRlc05vdE1hdGNoIDc2Ci0jZGVmaW5lIEJDRXhjZXB0aW9uSW52YWxpZGF0ZURhdGEgNzcKLSNkZWZpbmUgQkNFeGNlcHRpb25Mb2FkRmlsZSA3OAotI2RlZmluZSBCQ0V4Y2VwdGlvblBERjQxN0VuY29kZUZhaWwgNzkKLSNkZWZpbmUgQkNFeGNlcHRpb25GYWlsVG9DcmVhdGVCaXRtYXAgODAKLSNkZWZpbmUgQkNFeGNlcHRpb25Mb2FkRm9udEZhaWwgODEKLSNkZWZpbmUgQkNFeGNlcHRpb25Pbmx5RW5jb2RlQ09ERUJBUiA4MgotI2RlZmluZSBCQ0V4Y2VwdGlvbkNvZGFiYXJTaG91bGRTdGFydFdpdGhPbmVPZkFCQ0QgODMKLSNkZWZpbmUgQkNFeGNlcHRpb25Db2RhYmFyU2hvdWxkRW5kV2l0aE9uZU9mVE5FIDg0Ci0jZGVmaW5lIEJDRXhjZXB0aW9uQ29kYWJhckVuY29kZUNoYXJzSW52YWxpZCA4NQotI2RlZmluZSBCQ0V4Y2VwdGlvbk9ubHlFbmNvZGVEQVRBTUFUUklYIDg2Ci0jZGVmaW5lIEJDRXhjZXB0aW9uQ2hhcmFjdGVyc091dHNpZGVJU084ODU5MUVuY29kaW5nIDg3Ci0jZGVmaW5lIEJDRXhjZXB0aW9uSWxsZWdhbERhdGFDb2Rld29yZHMgODgKLSNkZWZpbmUgQkNFeGNlcHRpb25DYW5ub3RIYW5kbGVUaGlzTnVtYmVyT2ZEYXRhUmVnaW9ucyA4OQotI2RlZmluZSBCQ0V4Y2VwdGlvbklsbGVnYWxTdGF0ZVVuZXhwZWN0ZWRDYXNlIDkwCi0jZGVmaW5lIEJDRXhjZXB0aW9uSWxsZWdhbFN0YXRlQ291bnRNdXN0Tm90RXhjZWVkNCA5MQotI2RlZmluZSBCQ0V4Y2VwdGlvbklsbGVnYWxTdGF0ZU1lc3NhZ2VMZW5ndGhJbnZhbGlkIDkyCi0jZGVmaW5lIEJDRXhjZXB0aW9uSWxsZWdhbEFyZ3VtZW50Tm90R2lnaXRzIDkzCi0jZGVmaW5lIEJDRXhjZXB0aW9uSWxsZWdhbFN0YXRlSWxsZWdhbE1vZGUgOTQKLSNkZWZpbmUgQkNFeGNlcHRpb25Pbmx5RW5jb2RlUERGNDE3IDk1Ci0jZGVmaW5lIEJDRXhjZXB0aW9uTm9uRW5jb2RhYmxlQ2hhcmFjdGVyRGV0ZWN0ZWQgOTYKLSNkZWZpbmUgQkNFeGNlcHRpb25FcnJvckNvcnJlY3Rpb25MZXZlbE11c3RCZUJldHdlZW4wQW5kOCA5NwotI2RlZmluZSBCQ0V4Y2VwdGlvbk5vUmVjb21tZW5kYXRpb25Qb3NzaWJsZSA5OAotI2RlZmluZSBCQ0V4Y2VwdGlvbklsbGVnYWxBcmd1bWVudG5NdXN0QmVBYm92ZTAgOTkKLSNkZWZpbmUgQkNFeGNlcHRpb25VbmFibGVUb0ZpdE1lc3NhZ2VJbkNvbHVtbnMgMTAwCi0jZGVmaW5lIEJDRXhjZXB0aW9uRW5jb2RlZE1lc3NhZ2VDb250YWluc1Rvb01hbnlDb2RlV29yZHMgMTAxCi0jZGVmaW5lIEJDRXhjZXB0aW9uQml0bWFwU2l6ZUVycm9yIDEwMgotI2RlZmluZSBCQ0V4Y2VwdGlvbkZvcm1hdEluc3RhbmNlIDEwMgotI2RlZmluZSBCQ0V4Y2VwdGlvbkNoZWNrc3VtSW5zdGFuY2UgMTAzCi0jZGVmaW5lIEJDRXhjZXB0aW9udE5vdEZvdW5kSW5zdGFuY2UgMTA0Ci0jZGVmaW5lIEJDRXhjZXB0aW9uTm90Rm91bmRJbnN0YW5jZSAxMDUKLSNkZWZpbmUgQkNFeGNlcHRpb25DYW5ub3RNZXRhZGF0YSAxMDYKLQotI2VuZGlmICAvLyBYRkFfRlhCQVJDT0RFX1VUSUxTX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9ERVBTIGIveGZhL2Z4ZmEvREVQUwppbmRleCA5M2E5YWNiLi44ODZlZThlIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9ERVBTCisrKyBiL3hmYS9meGZhL0RFUFMKQEAgLTEsNSArMSwzIEBACiBpbmNsdWRlX3J1bGVzID0gWwotICAnK2NvcmUvZmRybS9jcnlwdG8nLAotICAnK2NvcmUvZnhjb2RlYycsCiAgICcrZnhqcycsCiBdCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9SRUFETUUubWQgYi94ZmEvZnhmYS9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1NGNlMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL1JFQURNRS5tZApAQCAtMCwwICsxLDQ2IEBACit4ZmEvZnhmYSBjb250YWlucyBhIHNldCBvZiBDWEZBX0xheW91dEl0ZW1zIHRoYXQgbW9kZWwgZm9ybXMgY29udGFpbmluZyB3aWRnZXRzLgorCitUaGUgbWFpbiBoaWVyYXJjaHkgaW4gdGhpcyBkaXJlY3RvcnkgYXJlIHRoZSBmb3JtIGVsZW1lbnRzOgorCisqIENYRkFfTGF5b3V0SXRlbQorICAgICogQ1hGQV9Db250ZW50TGF5b3V0SXRlbQorICAgICAgICAqIENYRkFfRkZQYWdlVmlldworICAgICAgICAqIENYRkFfRkZXaWRnZXQKKyAgICAgICAgICAgICogQ1hGQV9GRkRyYXcKKyAgICAgICAgICAgICAgICAqIENYRkFfRkZBcmMKKyAgICAgICAgICAgICAgICAqIENYRkFfRkZJbWFnZQorICAgICAgICAgICAgICAgICogQ1hGQV9GRkxpbmUKKyAgICAgICAgICAgICAgICAqIENYRkFfRkZSZWN0YW5nbGUKKyAgICAgICAgICAgICAgICAqIENYRkFfRkZUZXh0CisgICAgICAgICAgICAqIENYRkFfRkZFeGNsR3JvdXAKKyAgICAgICAgICAgICogQ1hGQV9GRkZpZWxkCisgICAgICAgICAgICAgICAgKiBDWEZBX0ZGQ2hlY2tCdXR0b24KKyAgICAgICAgICAgICAgICAqIENYRkFfRkZDb21ib0JveAorICAgICAgICAgICAgICAgICogQ1hGQV9GRkltYWdlRWRpdAorICAgICAgICAgICAgICAgICogQ1hGQV9GRkxpc3RCb3gKKyAgICAgICAgICAgICAgICAqIENYRkFfRkZQdXNoQnV0dG9uCisgICAgICAgICAgICAgICAgKiBDWEZBX0ZGU2lnbmF0dXJlCisgICAgICAgICAgICAgICAgKiBDWEZBX0ZGVGV4dEVkaXQKKyAgICAgICAgICAgICAgICAgICAgKiBDWEZBX0ZGQmFyY29kZQorICAgICAgICAgICAgICAgICAgICAqIENYRkFfRkZEYXRlVGltZUVkaXQKKyAgICAgICAgICAgICAgICAgICAgKiBDWEZBX0ZGTnVtZXJpY0VkaXQKKyAgICAgICAgICAgICAgICAgICAgKiBDWEZBX0ZGUGFzc3dvcmRFZGl0CisgICAgICAgICAgICAqIENYRkFfRkZTdWJmb3JtCisKK0NYRkFfRkZEcmF3IGlzIHRoZSBiYXNlIGNsYXNzIGZvciBzdGF0aWMgZWxlbWVudHMgbGlrZSB0ZXh0IGFuZCBpbWFnZXMuCisKK0NYRkFfRkZGaWVsZCBpcyB0aGUgYmFzZSBjbGFzcyBmb3Igd2lkZ2V0cy4gSXQgb3ducyBhIGxvd2VyIGxldmVsIENGV0wgd2lkZ2V0CitpbnN0YW5jZSBmcm9tIHhmYS9md2wuIFRoZSBjb3JyZXNwb25kZW5jZSBpczoKKworKiBDWEZBX0ZGQ2hlY2tCdXR0b24gLT4gQ0ZXTF9DaGVja0JveAorKiBDWEZBX0ZGQ29tYm9Cb3ggLT4gQ0ZXTF9Db21ib0JveAorKiBDWEZBX0ZGSW1hZ2VFZGl0IC0+IENGV0xfUGljdHVyZUJveAorKiBDWEZBX0ZGTGlzdEJveCAtPiBDRldMX0xpc3RCb3gKKyogQ1hGQV9GRlB1c2hCdXR0b24gLT4gQ0ZXTF9QdXNoQnV0dG9uCisqIENYRkFfRkZTaWduYXR1cmUgLT4gbm9uZQorKiBDWEZBX0ZGVGV4dEVkaXQgLT4gQ0ZXTF9FZGl0CisgICAgKiBDWEZBX0ZGQmFyY29kZSAtPiBDRldMX0JhcmNvZGUKKyAgICAqIENYRkFfRkZEYXRlVGltZUVkaXQgLT4gQ0ZXTF9EYXRlVGltZVBpY2tlcgorICAgICogQ1hGQV9GRk51bWVyaWNFZGl0IC0+IENGV0xfRWRpdAorICAgICogQ1hGQV9GRlBhc3N3b3JkRWRpdCA+IENGV0xfRWRpdAorCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAvREVQUyBiL3hmYS9meGZhL2FwcC9ERVBTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzcyZDFkLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC9ERVBTCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1pbmNsdWRlX3J1bGVzID0gWwotICAnK2NvcmUvZmRybS9jcnlwdG8nLAotICAnK2NvcmUvZnBkZmFwaS9mb250JywKLSAgJytjb3JlL2ZwZGZhcGkvcGFnZScsCi0gICcrY29yZS9mcGRmZG9jJywKLV0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2FwcC9jeGZhX2Nzc3RhZ3Byb3ZpZGVyLmNwcCBiL3hmYS9meGZhL2FwcC9jeGZhX2Nzc3RhZ3Byb3ZpZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY1MTMzZS4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAvY3hmYV9jc3N0YWdwcm92aWRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAvY3hmYV9jc3N0YWdwcm92aWRlci5oIgotCi1DWEZBX0NTU1RhZ1Byb3ZpZGVyOjpDWEZBX0NTU1RhZ1Byb3ZpZGVyKCkKLSAgICA6IG1fYlRhZ0F2YWlsYWJsZShmYWxzZSksIG1fYkNvbnRlbnQoZmFsc2UpIHt9Ci0KLUNYRkFfQ1NTVGFnUHJvdmlkZXI6On5DWEZBX0NTU1RhZ1Byb3ZpZGVyKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2FwcC9jeGZhX2Nzc3RhZ3Byb3ZpZGVyLmggYi94ZmEvZnhmYS9hcHAvY3hmYV9jc3N0YWdwcm92aWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWRiODY3Li4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC9jeGZhX2Nzc3RhZ3Byb3ZpZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYRkFfQVBQX0NYRkFfQ1NTVEFHUFJPVklERVJfSF8KLSNkZWZpbmUgWEZBX0ZYRkFfQVBQX0NYRkFfQ1NTVEFHUFJPVklERVJfSF8KLQotI2luY2x1ZGUgPG1hcD4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0KLWNsYXNzIENYRkFfQ1NTVGFnUHJvdmlkZXIgewotIHB1YmxpYzoKLSAgQ1hGQV9DU1NUYWdQcm92aWRlcigpOwotICB+Q1hGQV9DU1NUYWdQcm92aWRlcigpOwotCi0gIENGWF9XaWRlU3RyaW5nIEdldFRhZ05hbWUoKSB7IHJldHVybiBtX3dzVGFnTmFtZTsgfQotCi0gIHZvaWQgU2V0VGFnTmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NOYW1lKSB7IG1fd3NUYWdOYW1lID0gd3NOYW1lOyB9Ci0gIHZvaWQgU2V0QXR0cmlidXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0F0dHIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKSB7Ci0gICAgbV9BdHRyaWJ1dGVzLmluc2VydCh7d3NBdHRyLCB3c1ZhbHVlfSk7Ci0gIH0KLQotICBDRlhfV2lkZVN0cmluZyBHZXRBdHRyaWJ1dGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0cikgewotICAgIHJldHVybiBtX0F0dHJpYnV0ZXNbd3NBdHRyXTsKLSAgfQotCi0gIGJvb2wgbV9iVGFnQXZhaWxhYmxlOwotICBib29sIG1fYkNvbnRlbnQ7Ci0KLSBwcml2YXRlOgotICBDRlhfV2lkZVN0cmluZyBtX3dzVGFnTmFtZTsKLSAgc3RkOjptYXA8Q0ZYX1dpZGVTdHJpbmcsIENGWF9XaWRlU3RyaW5nPiBtX0F0dHJpYnV0ZXM7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEZBX0FQUF9DWEZBX0NTU1RBR1BST1ZJREVSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAvY3hmYV9ldmVudHBhcmFtLmNwcCBiL3hmYS9meGZhL2FwcC9jeGZhX2V2ZW50cGFyYW0uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2NlNzIxLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC9jeGZhX2V2ZW50cGFyYW0uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9ldmVudHBhcmFtLmgiCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9meGZhLmgiCi0KLUNYRkFfRXZlbnRQYXJhbTo6Q1hGQV9FdmVudFBhcmFtKCkKLSAgICA6IG1fcFRhcmdldChudWxscHRyKSwKLSAgICAgIG1fZVR5cGUoWEZBX0VWRU5UX1Vua25vd24pLAotICAgICAgbV9iQ2FuY2VsQWN0aW9uKGZhbHNlKSwKLSAgICAgIG1faUNvbW1pdEtleSgwKSwKLSAgICAgIG1fYktleURvd24oZmFsc2UpLAotICAgICAgbV9iTW9kaWZpZXIoZmFsc2UpLAotICAgICAgbV9iUmVlbnRlcihmYWxzZSksCi0gICAgICBtX2lTZWxFbmQoMCksCi0gICAgICBtX2lTZWxTdGFydCgwKSwKLSAgICAgIG1fYlNoaWZ0KGZhbHNlKSwKLSAgICAgIG1fYklzRm9ybVJlYWR5KGZhbHNlKSwKLSAgICAgIG1faVZhbGlkYXRlQWN0aXZpdGllcyhYRkFfVkFMSURBVEVfcHJlU3VibWl0KSB7fQotCi1DWEZBX0V2ZW50UGFyYW06On5DWEZBX0V2ZW50UGFyYW0oKSB7fQotCi1DWEZBX0V2ZW50UGFyYW06OkNYRkFfRXZlbnRQYXJhbShjb25zdCBDWEZBX0V2ZW50UGFyYW0mIG90aGVyKSA9IGRlZmF1bHQ7Ci0KLXZvaWQgQ1hGQV9FdmVudFBhcmFtOjpSZXNldCgpIHsKLSAgbV93c0NoYW5nZS5jbGVhcigpOwotICBtX2JDYW5jZWxBY3Rpb24gPSBmYWxzZTsKLSAgbV9pQ29tbWl0S2V5ID0gMDsKLSAgbV93c0Z1bGxUZXh0LmNsZWFyKCk7Ci0gIG1fYktleURvd24gPSBmYWxzZTsKLSAgbV9iTW9kaWZpZXIgPSBmYWxzZTsKLSAgbV93c05ld0NvbnRlbnRUeXBlLmNsZWFyKCk7Ci0gIG1fd3NOZXdUZXh0LmNsZWFyKCk7Ci0gIG1fd3NQcmV2Q29udGVudFR5cGUuY2xlYXIoKTsKLSAgbV93c1ByZXZUZXh0LmNsZWFyKCk7Ci0gIG1fYlJlZW50ZXIgPSBmYWxzZTsKLSAgbV9pU2VsRW5kID0gMDsKLSAgbV9pU2VsU3RhcnQgPSAwOwotICBtX2JTaGlmdCA9IGZhbHNlOwotICBtX3dzU29hcEZhdWx0Q29kZS5jbGVhcigpOwotICBtX3dzU29hcEZhdWx0U3RyaW5nLmNsZWFyKCk7Ci0gIG1fYklzRm9ybVJlYWR5ID0gZmFsc2U7Ci0gIG1faVZhbGlkYXRlQWN0aXZpdGllcyA9IFhGQV9WQUxJREFURV9wcmVTdWJtaXQ7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAvY3hmYV9saW5rdXNlcmRhdGEuY3BwIGIveGZhL2Z4ZmEvYXBwL2N4ZmFfbGlua3VzZXJkYXRhLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEyOGNkOC4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAvY3hmYV9saW5rdXNlcmRhdGEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL2N4ZmFfbGlua3VzZXJkYXRhLmgiCi0KLUNYRkFfTGlua1VzZXJEYXRhOjpDWEZBX0xpbmtVc2VyRGF0YShGWF9XQ0hBUiogcHN6VGV4dCkKLSAgICA6IG1fd3NVUkxDb250ZW50KHBzelRleHQpIHt9Ci0KLUNYRkFfTGlua1VzZXJEYXRhOjp+Q1hGQV9MaW5rVXNlckRhdGEoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL2N4ZmFfbGlua3VzZXJkYXRhLmggYi94ZmEvZnhmYS9hcHAvY3hmYV9saW5rdXNlcmRhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUyYjQ2Ny4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAvY3hmYV9saW5rdXNlcmRhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhGQV9BUFBfQ1hGQV9MSU5LVVNFUkRBVEFfSF8KLSNkZWZpbmUgWEZBX0ZYRkFfQVBQX0NYRkFfTElOS1VTRVJEQVRBX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLQotY2xhc3MgQ1hGQV9MaW5rVXNlckRhdGEgOiBwdWJsaWMgQ0ZYX1JldGFpbmFibGUgewotIHB1YmxpYzoKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIEFyZ3M+Ci0gIGZyaWVuZCBDRlhfUmV0YWluUHRyPFQ+IHBkZml1bTo6TWFrZVJldGFpbihBcmdzJiYuLi4gYXJncyk7Ci0KLSAgY29uc3QgRlhfV0NIQVIqIEdldExpbmtVUkwoKSBjb25zdCB7IHJldHVybiBtX3dzVVJMQ29udGVudC5jX3N0cigpOyB9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGV4cGxpY2l0IENYRkFfTGlua1VzZXJEYXRhKEZYX1dDSEFSKiBwc3pUZXh0KTsKLSAgfkNYRkFfTGlua1VzZXJEYXRhKCkgb3ZlcnJpZGU7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgbV93c1VSTENvbnRlbnQ7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEZBX0FQUF9DWEZBX0xJTktVU0VSREFUQV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL2N4ZmFfbG9hZGVyY29udGV4dC5jcHAgYi94ZmEvZnhmYS9hcHAvY3hmYV9sb2FkZXJjb250ZXh0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDczM2M1Mi4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAvY3hmYV9sb2FkZXJjb250ZXh0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL2FwcC9jeGZhX2xvYWRlcmNvbnRleHQuaCIKLQotQ1hGQV9Mb2FkZXJDb250ZXh0OjpDWEZBX0xvYWRlckNvbnRleHQoKQotICAgIDogbV9iU2F2ZUxpbmVIZWlnaHQoZmFsc2UpLAotICAgICAgbV9mV2lkdGgoMCksCi0gICAgICBtX2ZIZWlnaHQoMCksCi0gICAgICBtX2ZMYXN0UG9zKDApLAotICAgICAgbV9mU3RhcnRMaW5lT2Zmc2V0KDApLAotICAgICAgbV9pQ2hhcigwKSwKLSAgICAgIG1faVRvdGFsTGluZXMoLTEpLAotICAgICAgbV9wWE1MTm9kZShudWxscHRyKSwKLSAgICAgIG1fcE5vZGUobnVsbHB0ciksCi0gICAgICBtX2R3RmxhZ3MoMCkge30KLQotQ1hGQV9Mb2FkZXJDb250ZXh0Ojp+Q1hGQV9Mb2FkZXJDb250ZXh0KCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2FwcC9jeGZhX2xvYWRlcmNvbnRleHQuaCBiL3hmYS9meGZhL2FwcC9jeGZhX2xvYWRlcmNvbnRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhjY2RiZS4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAvY3hmYV9sb2FkZXJjb250ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYRkFfQVBQX0NYRkFfTE9BREVSQ09OVEVYVF9IXwotI2RlZmluZSBYRkFfRlhGQV9BUFBfQ1hGQV9MT0FERVJDT05URVhUX0hfCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc2NvbXB1dGVkc3R5bGUuaCIKLQotY2xhc3MgQ0ZERV9YTUxOb2RlOwotY2xhc3MgQ1hGQV9Ob2RlOwotCi1jbGFzcyBDWEZBX0xvYWRlckNvbnRleHQgewotIHB1YmxpYzoKLSAgQ1hGQV9Mb2FkZXJDb250ZXh0KCk7Ci0gIH5DWEZBX0xvYWRlckNvbnRleHQoKTsKLQotICBib29sIG1fYlNhdmVMaW5lSGVpZ2h0OwotICBGWF9GTE9BVCBtX2ZXaWR0aDsKLSAgRlhfRkxPQVQgbV9mSGVpZ2h0OwotICBGWF9GTE9BVCBtX2ZMYXN0UG9zOwotICBGWF9GTE9BVCBtX2ZTdGFydExpbmVPZmZzZXQ7Ci0gIGludDMyX3QgbV9pQ2hhcjsKLSAgaW50MzJfdCBtX2lMaW5lczsKLSAgaW50MzJfdCBtX2lUb3RhbExpbmVzOwotICBDRkRFX1hNTE5vZGUqIG1fcFhNTE5vZGU7Ci0gIENYRkFfTm9kZSogbV9wTm9kZTsKLSAgQ0ZYX1JldGFpblB0cjxDRkRFX0NTU0NvbXB1dGVkU3R5bGU+IG1fcFBhcmVudFN0eWxlOwotICBDRlhfQXJyYXlUZW1wbGF0ZTxGWF9GTE9BVD4gbV9saW5lSGVpZ2h0czsKLSAgdWludDMyX3QgbV9kd0ZsYWdzOwotICBzdGQ6OnZlY3RvcjxGWF9GTE9BVD4gbV9CbG9ja3NIZWlnaHQ7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEZBX0FQUF9DWEZBX0xPQURFUkNPTlRFWFRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2FwcC9jeGZhX3BpZWNlbGluZS5jcHAgYi94ZmEvZnhmYS9hcHAvY3hmYV9waWVjZWxpbmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTA2Y2YyLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC9jeGZhX3BpZWNlbGluZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAvY3hmYV9waWVjZWxpbmUuaCIKLQotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfdGV4dHBpZWNlLmgiCi0KLUNYRkFfUGllY2VMaW5lOjpDWEZBX1BpZWNlTGluZSgpIHt9Ci0KLUNYRkFfUGllY2VMaW5lOjp+Q1hGQV9QaWVjZUxpbmUoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL2N4ZmFfcGllY2VsaW5lLmggYi94ZmEvZnhmYS9hcHAvY3hmYV9waWVjZWxpbmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2YmI5OS4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAvY3hmYV9waWVjZWxpbmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhGQV9BUFBfQ1hGQV9QSUVDRUxJTkVfSF8KLSNkZWZpbmUgWEZBX0ZYRkFfQVBQX0NYRkFfUElFQ0VMSU5FX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgotCi1jbGFzcyBYRkFfVGV4dFBpZWNlOwotCi1jbGFzcyBDWEZBX1BpZWNlTGluZSB7Ci0gcHVibGljOgotICBDWEZBX1BpZWNlTGluZSgpOwotICB+Q1hGQV9QaWVjZUxpbmUoKTsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8WEZBX1RleHRQaWVjZT4+IG1fdGV4dFBpZWNlczsKLSAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4gbV9jaGFyQ291bnRzOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhGQV9BUFBfQ1hGQV9QSUVDRUxJTkVfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2FwcC9jeGZhX3RleHRsYXlvdXQuY3BwIGIveGZhL2Z4ZmEvYXBwL2N4ZmFfdGV4dGxheW91dC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2Y2JmZTAuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvYXBwL2N4ZmFfdGV4dGxheW91dC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL2FwcC9jeGZhX3RleHRsYXlvdXQuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2NmZGVfcGF0aC5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3NzY29tcHV0ZWRzdHlsZS5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3Nzc3R5bGVzZWxlY3Rvci5oIgotI2luY2x1ZGUgInhmYS9mZGUvZmRlX2dlZGV2aWNlLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9mZGVfb2JqZWN0LmgiCi0jaW5jbHVkZSAieGZhL2ZkZS94bWwvZmRlX3htbF9pbXAuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAvY3hmYV9saW5rdXNlcmRhdGEuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAvY3hmYV9sb2FkZXJjb250ZXh0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL2N4ZmFfcGllY2VsaW5lLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL2N4ZmFfdGV4dHBhcnNlY29udGV4dC5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC9jeGZhX3RleHR0YWJzdG9wc2NvbnRleHQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAvY3hmYV90ZXh0dXNlcmRhdGEuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2Zmd2lkZ2V0YWNjLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV90ZXh0cGllY2UuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9mb250LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFyYS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfb2JqZWN0LmgiCi0KLSNkZWZpbmUgWEZBX0xPQURFUkNOVFhURkxHX0ZJTFRFUlNQQUNFIDB4MDAxCi0KLUNYRkFfVGV4dExheW91dDo6Q1hGQV9UZXh0TGF5b3V0KENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyKQotICAgIDogbV9iSGFzQmxvY2soZmFsc2UpLAotICAgICAgbV9wVGV4dFByb3ZpZGVyKHBUZXh0UHJvdmlkZXIpLAotICAgICAgbV9wVGV4dERhdGFOb2RlKG51bGxwdHIpLAotICAgICAgbV9iUmljaFRleHQoZmFsc2UpLAotICAgICAgbV9pTGluZXMoMCksCi0gICAgICBtX2ZNYXhXaWR0aCgwKSwKLSAgICAgIG1fYkJsb2NrQ29udGludWUodHJ1ZSkgewotICBBU1NFUlQobV9wVGV4dFByb3ZpZGVyKTsKLX0KLQotQ1hGQV9UZXh0TGF5b3V0Ojp+Q1hGQV9UZXh0TGF5b3V0KCkgewotICBtX3RleHRQYXJzZXIuUmVzZXQoKTsKLSAgVW5sb2FkKCk7Ci19Ci0KLXZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpVbmxvYWQoKSB7Ci0gIG1fcGllY2VMaW5lcy5jbGVhcigpOwotICBtX3BCcmVhay5yZXNldCgpOwotfQotCi12b2lkIENYRkFfVGV4dExheW91dDo6R2V0VGV4dERhdGFOb2RlKCkgewotICBpZiAoIW1fcFRleHRQcm92aWRlcikKLSAgICByZXR1cm47Ci0KLSAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcFRleHRQcm92aWRlci0+R2V0VGV4dE5vZGUobV9iUmljaFRleHQpOwotICBpZiAocE5vZGUgJiYgbV9iUmljaFRleHQpCi0gICAgbV90ZXh0UGFyc2VyLlJlc2V0KCk7Ci0KLSAgbV9wVGV4dERhdGFOb2RlID0gcE5vZGU7Ci19Ci0KLUNGREVfWE1MTm9kZSogQ1hGQV9UZXh0TGF5b3V0OjpHZXRYTUxDb250YWluZXJOb2RlKCkgewotICBpZiAoIW1fYlJpY2hUZXh0KQotICAgIHJldHVybiBudWxscHRyOwotCi0gIENGREVfWE1MTm9kZSogcFhNTFJvb3QgPSBtX3BUZXh0RGF0YU5vZGUtPkdldFhNTE1hcHBpbmdOb2RlKCk7Ci0gIGlmICghcFhNTFJvb3QpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgQ0ZERV9YTUxOb2RlKiBwWE1MQ29udGFpbmVyID0gbnVsbHB0cjsKLSAgZm9yIChDRkRFX1hNTE5vZGUqIHBYTUxDaGlsZCA9Ci0gICAgICAgICAgIHBYTUxSb290LT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOwotICAgICAgIHBYTUxDaGlsZDsKLSAgICAgICBwWE1MQ2hpbGQgPSBwWE1MQ2hpbGQtPkdldE5vZGVJdGVtKENGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7Ci0gICAgaWYgKHBYTUxDaGlsZC0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsKLSAgICAgIENGREVfWE1MRWxlbWVudCogcFhNTEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwWE1MQ2hpbGQpOwotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUYWc7Ci0gICAgICBwWE1MRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKHdzVGFnKTsKLSAgICAgIGlmICh3c1RhZyA9PSBMImJvZHkiIHx8IHdzVGFnID09IEwiaHRtbCIpIHsKLSAgICAgICAgcFhNTENvbnRhaW5lciA9IHBYTUxDaGlsZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBwWE1MQ29udGFpbmVyOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1JURkJyZWFrPiBDWEZBX1RleHRMYXlvdXQ6OkNyZWF0ZUJyZWFrKGJvb2wgYkRlZmF1bHQpIHsKLSAgdWludDMyX3QgZHdTdHlsZSA9IEZYX1JURkxBWU9VVFNUWUxFX0V4cGFuZFRhYjsKLSAgaWYgKCFiRGVmYXVsdCkKLSAgICBkd1N0eWxlIHw9IEZYX1JURkxBWU9VVFNUWUxFX1BhZ2luYXRpb247Ci0KLSAgYXV0byBwQnJlYWsgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX1JURkJyZWFrPihkd1N0eWxlKTsKLSAgcEJyZWFrLT5TZXRMaW5lQnJlYWtUb2xlcmFuY2UoMSk7Ci0gIHBCcmVhay0+U2V0Rm9udChtX3RleHRQYXJzZXIuR2V0Rm9udChtX3BUZXh0UHJvdmlkZXIsIG51bGxwdHIpKTsKLSAgcEJyZWFrLT5TZXRGb250U2l6ZShtX3RleHRQYXJzZXIuR2V0Rm9udFNpemUobV9wVGV4dFByb3ZpZGVyLCBudWxscHRyKSk7Ci0gIHJldHVybiBwQnJlYWs7Ci19Ci0KLXZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpJbml0QnJlYWsoRlhfRkxPQVQgZkxpbmVXaWR0aCkgewotICBDWEZBX0ZvbnQgZm9udCA9IG1fcFRleHRQcm92aWRlci0+R2V0Rm9udE5vZGUoKTsKLSAgQ1hGQV9QYXJhIHBhcmEgPSBtX3BUZXh0UHJvdmlkZXItPkdldFBhcmFOb2RlKCk7Ci0gIEZYX0ZMT0FUIGZTdGFydCA9IDA7Ci0gIEZYX0ZMT0FUIGZTdGFydFBvcyA9IDA7Ci0gIGlmIChwYXJhKSB7Ci0gICAgQ0ZYX1JURkxpbmVBbGlnbm1lbnQgaUFsaWduID0gQ0ZYX1JURkxpbmVBbGlnbm1lbnQ6OkxlZnQ7Ci0gICAgc3dpdGNoIChwYXJhLkdldEhvcml6b250YWxBbGlnbigpKSB7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlcjoKLSAgICAgICAgaUFsaWduID0gQ0ZYX1JURkxpbmVBbGlnbm1lbnQ6OkNlbnRlcjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0OgotICAgICAgICBpQWxpZ24gPSBDRlhfUlRGTGluZUFsaWdubWVudDo6UmlnaHQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5OgotICAgICAgICBpQWxpZ24gPSBDRlhfUlRGTGluZUFsaWdubWVudDo6SnVzdGlmaWVkOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeUFsbDoKLSAgICAgICAgaUFsaWduID0gQ0ZYX1JURkxpbmVBbGlnbm1lbnQ6OkRpc3RyaWJ1dGVkOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgbV9wQnJlYWstPlNldEFsaWdubWVudChpQWxpZ24pOwotCi0gICAgZlN0YXJ0ID0gcGFyYS5HZXRNYXJnaW5MZWZ0KCk7Ci0gICAgaWYgKG1fcFRleHRQcm92aWRlci0+SXNDaGVja0J1dHRvbkFuZEF1dG9XaWR0aCgpKSB7Ci0gICAgICBpZiAoaUFsaWduICE9IENGWF9SVEZMaW5lQWxpZ25tZW50OjpMZWZ0KQotICAgICAgICBmTGluZVdpZHRoIC09IHBhcmEuR2V0TWFyZ2luUmlnaHQoKTsKLSAgICB9IGVsc2UgewotICAgICAgZkxpbmVXaWR0aCAtPSBwYXJhLkdldE1hcmdpblJpZ2h0KCk7Ci0gICAgfQotICAgIGlmIChmTGluZVdpZHRoIDwgMCkKLSAgICAgIGZMaW5lV2lkdGggPSBmU3RhcnQ7Ci0KLSAgICBmU3RhcnRQb3MgPSBmU3RhcnQ7Ci0gICAgRlhfRkxPQVQgZkluZGVudCA9IHBhcmEuR2V0VGV4dEluZGVudCgpOwotICAgIGlmIChmSW5kZW50ID4gMCkKLSAgICAgIGZTdGFydFBvcyArPSBmSW5kZW50OwotICB9Ci0KLSAgbV9wQnJlYWstPlNldExpbmVCb3VuZGFyeShmU3RhcnQsIGZMaW5lV2lkdGgpOwotICBtX3BCcmVhay0+U2V0TGluZVN0YXJ0UG9zKGZTdGFydFBvcyk7Ci0gIGlmIChmb250KSB7Ci0gICAgbV9wQnJlYWstPlNldEhvcml6b250YWxTY2FsZSgoaW50MzJfdClmb250LkdldEhvcml6b250YWxTY2FsZSgpKTsKLSAgICBtX3BCcmVhay0+U2V0VmVydGljYWxTY2FsZSgoaW50MzJfdClmb250LkdldFZlcnRpY2FsU2NhbGUoKSk7Ci0gICAgbV9wQnJlYWstPlNldENoYXJTcGFjZShmb250LkdldExldHRlclNwYWNpbmcoKSk7Ci0gIH0KLQotICBGWF9GTE9BVCBmRm9udFNpemUgPSBtX3RleHRQYXJzZXIuR2V0Rm9udFNpemUobV9wVGV4dFByb3ZpZGVyLCBudWxscHRyKTsKLSAgbV9wQnJlYWstPlNldEZvbnRTaXplKGZGb250U2l6ZSk7Ci0gIG1fcEJyZWFrLT5TZXRGb250KG1fdGV4dFBhcnNlci5HZXRGb250KG1fcFRleHRQcm92aWRlciwgbnVsbHB0cikpOwotICBtX3BCcmVhay0+U2V0TGluZUJyZWFrVG9sZXJhbmNlKGZGb250U2l6ZSAqIDAuMmYpOwotfQotCi12b2lkIENYRkFfVGV4dExheW91dDo6SW5pdEJyZWFrKENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGREVfQ1NTRGlzcGxheSBlRGlzcGxheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkxpbmVXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9YTUxOb2RlKiBwWE1MTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9DU1NDb21wdXRlZFN0eWxlKiBwUGFyZW50U3R5bGUpIHsKLSAgaWYgKCFwU3R5bGUpIHsKLSAgICBJbml0QnJlYWsoZkxpbmVXaWR0aCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGVEaXNwbGF5ID09IEZERV9DU1NEaXNwbGF5OjpCbG9jayB8fAotICAgICAgZURpc3BsYXkgPT0gRkRFX0NTU0Rpc3BsYXk6Okxpc3RJdGVtKSB7Ci0gICAgQ0ZYX1JURkxpbmVBbGlnbm1lbnQgaUFsaWduID0gQ0ZYX1JURkxpbmVBbGlnbm1lbnQ6OkxlZnQ7Ci0gICAgc3dpdGNoIChwU3R5bGUtPkdldFRleHRBbGlnbigpKSB7Ci0gICAgICBjYXNlIEZERV9DU1NUZXh0QWxpZ246OlJpZ2h0OgotICAgICAgICBpQWxpZ24gPSBDRlhfUlRGTGluZUFsaWdubWVudDo6UmlnaHQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGREVfQ1NTVGV4dEFsaWduOjpDZW50ZXI6Ci0gICAgICAgIGlBbGlnbiA9IENGWF9SVEZMaW5lQWxpZ25tZW50OjpDZW50ZXI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGREVfQ1NTVGV4dEFsaWduOjpKdXN0aWZ5OgotICAgICAgICBpQWxpZ24gPSBDRlhfUlRGTGluZUFsaWdubWVudDo6SnVzdGlmaWVkOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX0NTU1RleHRBbGlnbjo6SnVzdGlmeUFsbDoKLSAgICAgICAgaUFsaWduID0gQ0ZYX1JURkxpbmVBbGlnbm1lbnQ6OkRpc3RyaWJ1dGVkOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBtX3BCcmVhay0+U2V0QWxpZ25tZW50KGlBbGlnbik7Ci0KLSAgICBGWF9GTE9BVCBmU3RhcnQgPSAwOwotICAgIGNvbnN0IEZERV9DU1NSZWN0KiBwUmVjdCA9IHBTdHlsZS0+R2V0TWFyZ2luV2lkdGgoKTsKLSAgICBjb25zdCBGREVfQ1NTUmVjdCogcFBhZGRpbmdSZWN0ID0gcFN0eWxlLT5HZXRQYWRkaW5nV2lkdGgoKTsKLSAgICBpZiAocFJlY3QpIHsKLSAgICAgIGZTdGFydCA9IHBSZWN0LT5sZWZ0LkdldFZhbHVlKCk7Ci0gICAgICBmTGluZVdpZHRoIC09IHBSZWN0LT5yaWdodC5HZXRWYWx1ZSgpOwotICAgICAgaWYgKHBQYWRkaW5nUmVjdCkgewotICAgICAgICBmU3RhcnQgKz0gcFBhZGRpbmdSZWN0LT5sZWZ0LkdldFZhbHVlKCk7Ci0gICAgICAgIGZMaW5lV2lkdGggLT0gcFBhZGRpbmdSZWN0LT5yaWdodC5HZXRWYWx1ZSgpOwotICAgICAgfQotICAgICAgaWYgKGVEaXNwbGF5ID09IEZERV9DU1NEaXNwbGF5OjpMaXN0SXRlbSkgewotICAgICAgICBjb25zdCBGREVfQ1NTUmVjdCogcFBhclJlY3QgPSBwUGFyZW50U3R5bGUtPkdldE1hcmdpbldpZHRoKCk7Ci0gICAgICAgIGNvbnN0IEZERV9DU1NSZWN0KiBwUGFyUGFkZGluZ1JlY3QgPSBwUGFyZW50U3R5bGUtPkdldFBhZGRpbmdXaWR0aCgpOwotICAgICAgICBpZiAocFBhclJlY3QpIHsKLSAgICAgICAgICBmU3RhcnQgKz0gcFBhclJlY3QtPmxlZnQuR2V0VmFsdWUoKTsKLSAgICAgICAgICBmTGluZVdpZHRoIC09IHBQYXJSZWN0LT5yaWdodC5HZXRWYWx1ZSgpOwotICAgICAgICAgIGlmIChwUGFyUGFkZGluZ1JlY3QpIHsKLSAgICAgICAgICAgIGZTdGFydCArPSBwUGFyUGFkZGluZ1JlY3QtPmxlZnQuR2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGZMaW5lV2lkdGggLT0gcFBhclBhZGRpbmdSZWN0LT5yaWdodC5HZXRWYWx1ZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBGREVfQ1NTUmVjdCBwTmV3UmVjdDsKLSAgICAgICAgcE5ld1JlY3QubGVmdC5TZXQoRkRFX0NTU0xlbmd0aFVuaXQ6OlBvaW50LCBmU3RhcnQpOwotICAgICAgICBwTmV3UmVjdC5yaWdodC5TZXQoRkRFX0NTU0xlbmd0aFVuaXQ6OlBvaW50LCBwUmVjdC0+cmlnaHQuR2V0VmFsdWUoKSk7Ci0gICAgICAgIHBOZXdSZWN0LnRvcC5TZXQoRkRFX0NTU0xlbmd0aFVuaXQ6OlBvaW50LCBwUmVjdC0+dG9wLkdldFZhbHVlKCkpOwotICAgICAgICBwTmV3UmVjdC5ib3R0b20uU2V0KEZERV9DU1NMZW5ndGhVbml0OjpQb2ludCwgcFJlY3QtPmJvdHRvbS5HZXRWYWx1ZSgpKTsKLSAgICAgICAgcFN0eWxlLT5TZXRNYXJnaW5XaWR0aChwTmV3UmVjdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIG1fcEJyZWFrLT5TZXRMaW5lQm91bmRhcnkoZlN0YXJ0LCBmTGluZVdpZHRoKTsKLSAgICBGWF9GTE9BVCBmSW5kZW50ID0gcFN0eWxlLT5HZXRUZXh0SW5kZW50KCkuR2V0VmFsdWUoKTsKLSAgICBpZiAoZkluZGVudCA+IDApCi0gICAgICBmU3RhcnQgKz0gZkluZGVudDsKLQotICAgIG1fcEJyZWFrLT5TZXRMaW5lU3RhcnRQb3MoZlN0YXJ0KTsKLSAgICBtX3BCcmVhay0+U2V0VGFiV2lkdGgobV90ZXh0UGFyc2VyLkdldFRhYkludGVydmFsKHBTdHlsZSkpOwotICAgIGlmICghbV9wVGFic3RvcENvbnRleHQpCi0gICAgICBtX3BUYWJzdG9wQ29udGV4dCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1RleHRUYWJzdG9wc0NvbnRleHQ+KCk7Ci0gICAgbV90ZXh0UGFyc2VyLkdldFRhYnN0b3BzKHBTdHlsZSwgbV9wVGFic3RvcENvbnRleHQuZ2V0KCkpOwotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG1fcFRhYnN0b3BDb250ZXh0LT5tX2lUYWJDb3VudDsgaSsrKSB7Ci0gICAgICBYRkFfVEFCU1RPUFMqIHBUYWIgPSBtX3BUYWJzdG9wQ29udGV4dC0+bV90YWJzdG9wcy5HZXREYXRhUHRyKGkpOwotICAgICAgbV9wQnJlYWstPkFkZFBvc2l0aW9uZWRUYWIocFRhYi0+ZlRhYnN0b3BzKTsKLSAgICB9Ci0gIH0KLQotICBGWF9GTE9BVCBmRm9udFNpemUgPSBtX3RleHRQYXJzZXIuR2V0Rm9udFNpemUobV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUpOwotICBtX3BCcmVhay0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKLSAgbV9wQnJlYWstPlNldExpbmVCcmVha1RvbGVyYW5jZShmRm9udFNpemUgKiAwLjJmKTsKLSAgbV9wQnJlYWstPlNldEZvbnQobV90ZXh0UGFyc2VyLkdldEZvbnQobV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUpKTsKLSAgbV9wQnJlYWstPlNldEhvcml6b250YWxTY2FsZSgKLSAgICAgIG1fdGV4dFBhcnNlci5HZXRIb3JTY2FsZShtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZSwgcFhNTE5vZGUpKTsKLSAgbV9wQnJlYWstPlNldFZlcnRpY2FsU2NhbGUobV90ZXh0UGFyc2VyLkdldFZlclNjYWxlKG1fcFRleHRQcm92aWRlciwgcFN0eWxlKSk7Ci0gIG1fcEJyZWFrLT5TZXRDaGFyU3BhY2UocFN0eWxlLT5HZXRMZXR0ZXJTcGFjaW5nKCkuR2V0VmFsdWUoKSk7Ci19Ci0KLWludDMyX3QgQ1hGQV9UZXh0TGF5b3V0OjpHZXRUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsKLSAgR2V0VGV4dERhdGFOb2RlKCk7Ci0gIHdzVGV4dC5jbGVhcigpOwotICBpZiAoIW1fYlJpY2hUZXh0KQotICAgIHdzVGV4dCA9IG1fcFRleHREYXRhTm9kZS0+R2V0Q29udGVudCgpOwotICByZXR1cm4gd3NUZXh0LkdldExlbmd0aCgpOwotfQotCi1GWF9GTE9BVCBDWEZBX1RleHRMYXlvdXQ6OkdldExheW91dEhlaWdodCgpIHsKLSAgaWYgKCFtX3BMb2FkZXIpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaW50MzJfdCBpQ291bnQgPSBtX3BMb2FkZXItPm1fbGluZUhlaWdodHMuR2V0U2l6ZSgpOwotICBpZiAoaUNvdW50ID09IDAgJiYgbV9wTG9hZGVyLT5tX2ZXaWR0aCA+IDApIHsKLSAgICBDRlhfU2l6ZUYgc3pNYXgobV9wTG9hZGVyLT5tX2ZXaWR0aCwgbV9wTG9hZGVyLT5tX2ZIZWlnaHQpOwotICAgIENGWF9TaXplRiBzekRlZjsKLSAgICBtX3BMb2FkZXItPm1fYlNhdmVMaW5lSGVpZ2h0ID0gdHJ1ZTsKLSAgICBtX3BMb2FkZXItPm1fZkxhc3RQb3MgPSAwOwotICAgIENhbGNTaXplKHN6TWF4LCBzek1heCwgc3pEZWYpOwotICAgIG1fcExvYWRlci0+bV9iU2F2ZUxpbmVIZWlnaHQgPSBmYWxzZTsKLSAgICByZXR1cm4gc3pEZWYuaGVpZ2h0OwotICB9Ci0KLSAgRlhfRkxPQVQgZkhlaWdodCA9IG1fcExvYWRlci0+bV9mSGVpZ2h0OwotICBpZiAoZkhlaWdodCA8IDAuMWYpIHsKLSAgICBmSGVpZ2h0ID0gMDsKLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykKLSAgICAgIGZIZWlnaHQgKz0gbV9wTG9hZGVyLT5tX2xpbmVIZWlnaHRzLkVsZW1lbnRBdChpKTsKLSAgfQotICByZXR1cm4gZkhlaWdodDsKLX0KLQotRlhfRkxPQVQgQ1hGQV9UZXh0TGF5b3V0OjpTdGFydExheW91dChGWF9GTE9BVCBmV2lkdGgpIHsKLSAgaWYgKCFtX3BMb2FkZXIpCi0gICAgbV9wTG9hZGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfTG9hZGVyQ29udGV4dD4oKTsKLQotICBpZiAoZldpZHRoIDwgMCB8fCAobV9wTG9hZGVyLT5tX2ZXaWR0aCA+IC0xICYmCi0gICAgICAgICAgICAgICAgICAgICBGWFNZU19mYWJzKGZXaWR0aCAtIG1fcExvYWRlci0+bV9mV2lkdGgpID4gMCkpIHsKLSAgICBtX3BMb2FkZXItPm1fbGluZUhlaWdodHMuUmVtb3ZlQWxsKCk7Ci0gICAgbV9CbG9ja3MuUmVtb3ZlQWxsKCk7Ci0gICAgVW5sb2FkKCk7Ci0gICAgbV9wTG9hZGVyLT5tX2ZTdGFydExpbmVPZmZzZXQgPSAwOwotICB9Ci0gIG1fcExvYWRlci0+bV9mV2lkdGggPSBmV2lkdGg7Ci0KLSAgaWYgKGZXaWR0aCA8IDApIHsKLSAgICBDRlhfU2l6ZUYgc3pNYXg7Ci0gICAgQ0ZYX1NpemVGIHN6RGVmOwotICAgIG1fcExvYWRlci0+bV9iU2F2ZUxpbmVIZWlnaHQgPSB0cnVlOwotICAgIG1fcExvYWRlci0+bV9mTGFzdFBvcyA9IDA7Ci0gICAgQ2FsY1NpemUoc3pNYXgsIHN6TWF4LCBzekRlZik7Ci0gICAgbV9wTG9hZGVyLT5tX2JTYXZlTGluZUhlaWdodCA9IGZhbHNlOwotICAgIGZXaWR0aCA9IHN6RGVmLndpZHRoOwotICB9Ci0gIHJldHVybiBmV2lkdGg7Ci19Ci0KLWJvb2wgQ1hGQV9UZXh0TGF5b3V0OjpEb0xheW91dChpbnQzMl90IGlCbG9ja0luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmQ2FsY0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ29udGVudEFyZWFIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRleHRIZWlnaHQpIHsKLSAgaWYgKCFtX3BMb2FkZXIpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGludDMyX3QgaUJsb2NrQ291bnQgPSBtX0Jsb2Nrcy5HZXRTaXplKCk7Ci0gIEZYX0ZMT0FUIGZIZWlnaHQgPSBmVGV4dEhlaWdodDsKLSAgaWYgKGZIZWlnaHQgPCAwKQotICAgIGZIZWlnaHQgPSBHZXRMYXlvdXRIZWlnaHQoKTsKLQotICBtX3BMb2FkZXItPm1fZkhlaWdodCA9IGZIZWlnaHQ7Ci0gIGlmIChmQ29udGVudEFyZWFIZWlnaHQgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBtX2JIYXNCbG9jayA9IHRydWU7Ci0gIGlmIChpQmxvY2tDb3VudCA9PSAwICYmIGZIZWlnaHQgPiAwKSB7Ci0gICAgZkhlaWdodCA9IGZUZXh0SGVpZ2h0IC0gR2V0TGF5b3V0SGVpZ2h0KCk7Ci0gICAgaWYgKGZIZWlnaHQgPiAwKSB7Ci0gICAgICBpbnQzMl90IGlBbGlnbiA9IG1fdGV4dFBhcnNlci5HZXRWQWxpZ24obV9wVGV4dFByb3ZpZGVyKTsKLSAgICAgIGlmIChpQWxpZ24gPT0gWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlKQotICAgICAgICBmSGVpZ2h0IC89IDIuMGY7Ci0gICAgICBlbHNlIGlmIChpQWxpZ24gIT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tKQotICAgICAgICBmSGVpZ2h0ID0gMDsKLSAgICAgIG1fcExvYWRlci0+bV9mU3RhcnRMaW5lT2Zmc2V0ID0gZkhlaWdodDsKLSAgICB9Ci0gIH0KLQotICBGWF9GTE9BVCBmTGluZVBvcyA9IG1fcExvYWRlci0+bV9mU3RhcnRMaW5lT2Zmc2V0OwotICBpbnQzMl90IGlMaW5lSW5kZXggPSAwOwotICBpZiAoaUJsb2NrQ291bnQgPiAxKSB7Ci0gICAgaWYgKGlCbG9ja0NvdW50ID49IChpQmxvY2tJbmRleCArIDEpICogMikgewotICAgICAgaUxpbmVJbmRleCA9IG1fQmxvY2tzLkVsZW1lbnRBdChpQmxvY2tJbmRleCAqIDIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpTGluZUluZGV4ID0gbV9CbG9ja3MuRWxlbWVudEF0KGlCbG9ja0NvdW50IC0gMSkgKwotICAgICAgICAgICAgICAgICAgIG1fQmxvY2tzLkVsZW1lbnRBdChpQmxvY2tDb3VudCAtIDIpOwotICAgIH0KLSAgICBpZiAoIW1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQuZW1wdHkoKSkgewotICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUJsb2NrSW5kZXg7IGkrKykKLSAgICAgICAgZkxpbmVQb3MgLT0gbV9wTG9hZGVyLT5tX0Jsb2Nrc0hlaWdodFtpICogMiArIDFdOwotICAgIH0KLSAgfQotCi0gIGludDMyX3QgaUNvdW50ID0gbV9wTG9hZGVyLT5tX2xpbmVIZWlnaHRzLkdldFNpemUoKTsKLSAgaW50MzJfdCBpID0gMDsKLSAgZm9yIChpID0gaUxpbmVJbmRleDsgaSA8IGlDb3VudDsgaSsrKSB7Ci0gICAgRlhfRkxPQVQgZkxpbmVIZWlnaHQgPSBtX3BMb2FkZXItPm1fbGluZUhlaWdodHMuRWxlbWVudEF0KGkpOwotICAgIGlmICgoaSA9PSBpTGluZUluZGV4KSAmJiAoZkxpbmVIZWlnaHQgLSBmQ29udGVudEFyZWFIZWlnaHQgPiAwLjAwMSkpIHsKLSAgICAgIGZDYWxjSGVpZ2h0ID0gMDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAoZkxpbmVQb3MgKyBmTGluZUhlaWdodCAtIGZDb250ZW50QXJlYUhlaWdodCA+IDAuMDAxKSB7Ci0gICAgICBpZiAoaUJsb2NrQ291bnQgPj0gKGlCbG9ja0luZGV4ICsgMSkgKiAyKSB7Ci0gICAgICAgIG1fQmxvY2tzLlNldEF0KGlCbG9ja0luZGV4ICogMiwgaUxpbmVJbmRleCk7Ci0gICAgICAgIG1fQmxvY2tzLlNldEF0KGlCbG9ja0luZGV4ICogMiArIDEsIGkgLSBpTGluZUluZGV4KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG1fQmxvY2tzLkFkZChpTGluZUluZGV4KTsKLSAgICAgICAgbV9CbG9ja3MuQWRkKGkgLSBpTGluZUluZGV4KTsKLSAgICAgIH0KLSAgICAgIGlmIChpID09IGlMaW5lSW5kZXgpIHsKLSAgICAgICAgaWYgKGZDYWxjSGVpZ2h0IDw9IGZMaW5lUG9zKSB7Ci0gICAgICAgICAgaWYgKHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9wTG9hZGVyLT5tX0Jsb2Nrc0hlaWdodCkgPgotICAgICAgICAgICAgICAgICAgaUJsb2NrSW5kZXggKiAyICYmCi0gICAgICAgICAgICAgIChtX3BMb2FkZXItPm1fQmxvY2tzSGVpZ2h0W2lCbG9ja0luZGV4ICogMl0gPT0gaUJsb2NrSW5kZXgpKSB7Ci0gICAgICAgICAgICBtX3BMb2FkZXItPm1fQmxvY2tzSGVpZ2h0W2lCbG9ja0luZGV4ICogMiArIDFdID0gZkNhbGNIZWlnaHQ7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQucHVzaF9iYWNrKChGWF9GTE9BVClpQmxvY2tJbmRleCk7Ci0gICAgICAgICAgICBtX3BMb2FkZXItPm1fQmxvY2tzSGVpZ2h0LnB1c2hfYmFjayhmQ2FsY0hlaWdodCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotCi0gICAgICBmQ2FsY0hlaWdodCA9IGZMaW5lUG9zOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGZMaW5lUG9zICs9IGZMaW5lSGVpZ2h0OwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotaW50MzJfdCBDWEZBX1RleHRMYXlvdXQ6OkNvdW50QmxvY2tzKCkgY29uc3QgewotICBpbnQzMl90IGlDb3VudCA9IG1fQmxvY2tzLkdldFNpemUoKSAvIDI7Ci0gIHJldHVybiBpQ291bnQgPiAwID8gaUNvdW50IDogMTsKLX0KLQotYm9vbCBDWEZBX1RleHRMYXlvdXQ6OkNhbGNTaXplKGNvbnN0IENGWF9TaXplRiYgbWluU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfU2l6ZUYmIG1heFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1NpemVGJiBkZWZhdWx0U2l6ZSkgewotICBkZWZhdWx0U2l6ZS53aWR0aCA9IG1heFNpemUud2lkdGg7Ci0gIGlmIChkZWZhdWx0U2l6ZS53aWR0aCA8IDEpCi0gICAgZGVmYXVsdFNpemUud2lkdGggPSAweEZGRkY7Ci0KLSAgbV9wQnJlYWsgPSBDcmVhdGVCcmVhayhmYWxzZSk7Ci0gIEZYX0ZMT0FUIGZMaW5lUG9zID0gMDsKLSAgbV9pTGluZXMgPSAwOwotICBtX2ZNYXhXaWR0aCA9IDA7Ci0gIExvYWRlcihkZWZhdWx0U2l6ZSwgZkxpbmVQb3MsIGZhbHNlKTsKLSAgaWYgKGZMaW5lUG9zIDwgMC4xZikKLSAgICBmTGluZVBvcyA9IG1fdGV4dFBhcnNlci5HZXRGb250U2l6ZShtX3BUZXh0UHJvdmlkZXIsIG51bGxwdHIpOwotCi0gIG1fcFRhYnN0b3BDb250ZXh0LnJlc2V0KCk7Ci0gIGRlZmF1bHRTaXplID0gQ0ZYX1NpemVGKG1fZk1heFdpZHRoLCBmTGluZVBvcyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENYRkFfVGV4dExheW91dDo6TGF5b3V0KGNvbnN0IENGWF9TaXplRiYgc2l6ZSwgRlhfRkxPQVQqIGZIZWlnaHQpIHsKLSAgaWYgKHNpemUud2lkdGggPCAxKQotICAgIHJldHVybiBmYWxzZTsKLQotICBVbmxvYWQoKTsKLSAgbV9wQnJlYWsgPSBDcmVhdGVCcmVhayh0cnVlKTsKLSAgaWYgKG1fcExvYWRlcikgewotICAgIG1fcExvYWRlci0+bV9pVG90YWxMaW5lcyA9IC0xOwotICAgIG1fcExvYWRlci0+bV9pQ2hhciA9IDA7Ci0gIH0KLQotICBtX2lMaW5lcyA9IDA7Ci0gIEZYX0ZMT0FUIGZMaW5lUG9zID0gMDsKLSAgTG9hZGVyKHNpemUsIGZMaW5lUG9zLCB0cnVlKTsKLSAgVXBkYXRlQWxpZ24oc2l6ZS5oZWlnaHQsIGZMaW5lUG9zKTsKLSAgbV9wVGFic3RvcENvbnRleHQucmVzZXQoKTsKLSAgaWYgKGZIZWlnaHQpCi0gICAgKmZIZWlnaHQgPSBmTGluZVBvczsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1hGQV9UZXh0TGF5b3V0OjpMYXlvdXQoaW50MzJfdCBpQmxvY2spIHsKLSAgaWYgKCFtX3BMb2FkZXIgfHwgaUJsb2NrIDwgMCB8fCBpQmxvY2sgPj0gQ291bnRCbG9ja3MoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChtX3BMb2FkZXItPm1fZldpZHRoIDwgMSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzID0gLTE7Ci0gIG1faUxpbmVzID0gMDsKLSAgRlhfRkxPQVQgZkxpbmVQb3MgPSAwOwotICBDWEZBX05vZGUqIHBOb2RlID0gbnVsbHB0cjsKLSAgQ0ZYX1NpemVGIHN6VGV4dChtX3BMb2FkZXItPm1fZldpZHRoLCBtX3BMb2FkZXItPm1fZkhlaWdodCk7Ci0gIGludDMyX3QgaUNvdW50ID0gbV9CbG9ja3MuR2V0U2l6ZSgpOwotICBpbnQzMl90IGlCbG9ja3NIZWlnaHRDb3VudCA9Ci0gICAgICBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQpOwotICBpQmxvY2tzSGVpZ2h0Q291bnQgLz0gMjsKLSAgaWYgKGlCbG9jayA8IGlCbG9ja3NIZWlnaHRDb3VudCkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKGlCbG9jayA9PSBpQmxvY2tzSGVpZ2h0Q291bnQpIHsKLSAgICBVbmxvYWQoKTsKLSAgICBtX3BCcmVhayA9IENyZWF0ZUJyZWFrKHRydWUpOwotICAgIGZMaW5lUG9zID0gbV9wTG9hZGVyLT5tX2ZTdGFydExpbmVPZmZzZXQ7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUJsb2Nrc0hlaWdodENvdW50OyBpKyspCi0gICAgICBmTGluZVBvcyAtPSBtX3BMb2FkZXItPm1fQmxvY2tzSGVpZ2h0W2kgKiAyICsgMV07Ci0KLSAgICBtX3BMb2FkZXItPm1faUNoYXIgPSAwOwotICAgIGlmIChpQ291bnQgPiAxKQotICAgICAgbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzID0gbV9CbG9ja3MuRWxlbWVudEF0KGlCbG9jayAqIDIgKyAxKTsKLQotICAgIExvYWRlcihzelRleHQsIGZMaW5lUG9zLCB0cnVlKTsKLSAgICBpZiAoaUNvdW50ID09IDAgJiYgbV9wTG9hZGVyLT5tX2ZTdGFydExpbmVPZmZzZXQgPCAwLjFmKQotICAgICAgVXBkYXRlQWxpZ24oc3pUZXh0LmhlaWdodCwgZkxpbmVQb3MpOwotICB9IGVsc2UgaWYgKG1fcFRleHREYXRhTm9kZSkgewotICAgIGlCbG9jayAqPSAyOwotICAgIGlmIChpQmxvY2sgPCBpQ291bnQgLSAyKQotICAgICAgbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzID0gbV9CbG9ja3MuRWxlbWVudEF0KGlCbG9jayArIDEpOwotCi0gICAgbV9wQnJlYWstPlJlc2V0KCk7Ci0gICAgaWYgKG1fYlJpY2hUZXh0KSB7Ci0gICAgICBDRkRFX1hNTE5vZGUqIHBDb250YWluZXJOb2RlID0gR2V0WE1MQ29udGFpbmVyTm9kZSgpOwotICAgICAgaWYgKCFwQ29udGFpbmVyTm9kZSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgIENGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBtX3BMb2FkZXItPm1fcFhNTE5vZGU7Ci0gICAgICBpZiAoIXBYTUxOb2RlKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgQ0ZERV9YTUxOb2RlKiBwU2F2ZVhNTE5vZGUgPSBtX3BMb2FkZXItPm1fcFhNTE5vZGU7Ci0gICAgICBmb3IgKDsgcFhNTE5vZGU7Ci0gICAgICAgICAgIHBYTUxOb2RlID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKENGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7Ci0gICAgICAgIGlmICghTG9hZFJpY2hUZXh0KHBYTUxOb2RlLCBzelRleHQsIGZMaW5lUG9zLCBtX3BMb2FkZXItPm1fcFBhcmVudFN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCBudWxscHRyKSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB3aGlsZSAoIXBYTUxOb2RlKSB7Ci0gICAgICAgIHBYTUxOb2RlID0gcFNhdmVYTUxOb2RlLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6OlBhcmVudCk7Ci0gICAgICAgIGlmIChwWE1MTm9kZSA9PSBwQ29udGFpbmVyTm9kZSkKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgaWYgKCFMb2FkUmljaFRleHQocFhNTE5vZGUsIHN6VGV4dCwgZkxpbmVQb3MsIG1fcExvYWRlci0+bV9wUGFyZW50U3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIG51bGxwdHIsIGZhbHNlKSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHBTYXZlWE1MTm9kZSA9IHBYTUxOb2RlOwotICAgICAgICBwWE1MTm9kZSA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKTsKLSAgICAgICAgaWYgKCFwWE1MTm9kZSkKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgZm9yICg7IHBYTUxOb2RlOwotICAgICAgICAgICAgIHBYTUxOb2RlID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKENGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7Ci0gICAgICAgICAgaWYgKCFMb2FkUmljaFRleHQocFhNTE5vZGUsIHN6VGV4dCwgZkxpbmVQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wTG9hZGVyLT5tX3BQYXJlbnRTdHlsZSwgdHJ1ZSwgbnVsbHB0cikpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBwTm9kZSA9IG1fcExvYWRlci0+bV9wTm9kZTsKLSAgICAgIGlmICghcE5vZGUpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgTG9hZFRleHQocE5vZGUsIHN6VGV4dCwgZkxpbmVQb3MsIHRydWUpOwotICAgIH0KLSAgfQotICBpZiAoaUJsb2NrID09IGlDb3VudCkgewotICAgIG1fcFRhYnN0b3BDb250ZXh0LnJlc2V0KCk7Ci0gICAgbV9wTG9hZGVyLnJlc2V0KCk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpJdGVtQmxvY2tzKGNvbnN0IENGWF9SZWN0RiYgcnRUZXh0LCBpbnQzMl90IGlCbG9ja0luZGV4KSB7Ci0gIGlmICghbV9wTG9hZGVyKQotICAgIHJldHVybjsKLQotICBpbnQzMl90IGlDb3VudEhlaWdodCA9IG1fcExvYWRlci0+bV9saW5lSGVpZ2h0cy5HZXRTaXplKCk7Ci0gIGlmIChpQ291bnRIZWlnaHQgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgYm9vbCBiRW5kSXRlbSA9IHRydWU7Ci0gIGludDMyX3QgaUJsb2NrQ291bnQgPSBtX0Jsb2Nrcy5HZXRTaXplKCk7Ci0gIEZYX0ZMT0FUIGZMaW5lUG9zID0gbV9wTG9hZGVyLT5tX2ZTdGFydExpbmVPZmZzZXQ7Ci0gIGludDMyX3QgaUxpbmVJbmRleCA9IDA7Ci0gIGlmIChpQmxvY2tJbmRleCA+IDApIHsKLSAgICBpbnQzMl90IGlCbG9ja0hlaWdodENvdW50ID0KLSAgICAgICAgcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX3BMb2FkZXItPm1fQmxvY2tzSGVpZ2h0KTsKLSAgICBpQmxvY2tIZWlnaHRDb3VudCAvPSAyOwotICAgIGlmIChpQmxvY2tIZWlnaHRDb3VudCA+PSBpQmxvY2tJbmRleCkgewotICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUJsb2NrSW5kZXg7IGkrKykKLSAgICAgICAgZkxpbmVQb3MgLT0gbV9wTG9hZGVyLT5tX0Jsb2Nrc0hlaWdodFtpICogMiArIDFdOwotICAgIH0gZWxzZSB7Ci0gICAgICBmTGluZVBvcyA9IDA7Ci0gICAgfQotICAgIGlMaW5lSW5kZXggPSBtX0Jsb2Nrc1tpQmxvY2tDb3VudCAtIDFdICsgbV9CbG9ja3NbaUJsb2NrQ291bnQgLSAyXTsKLSAgfQotCi0gIGludDMyX3QgaSA9IDA7Ci0gIGZvciAoaSA9IGlMaW5lSW5kZXg7IGkgPCBpQ291bnRIZWlnaHQ7IGkrKykgewotICAgIEZYX0ZMT0FUIGZMaW5lSGVpZ2h0ID0gbV9wTG9hZGVyLT5tX2xpbmVIZWlnaHRzLkVsZW1lbnRBdChpKTsKLSAgICBpZiAoZkxpbmVQb3MgKyBmTGluZUhlaWdodCAtIHJ0VGV4dC5oZWlnaHQgPiAwLjAwMSkgewotICAgICAgbV9CbG9ja3MuQWRkKGlMaW5lSW5kZXgpOwotICAgICAgbV9CbG9ja3MuQWRkKGkgLSBpTGluZUluZGV4KTsKLSAgICAgIGJFbmRJdGVtID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZkxpbmVQb3MgKz0gZkxpbmVIZWlnaHQ7Ci0gIH0KLSAgaWYgKGlDb3VudEhlaWdodCA+IDAgJiYgKGkgLSBpTGluZUluZGV4KSA+IDAgJiYgYkVuZEl0ZW0pIHsKLSAgICBtX0Jsb2Nrcy5BZGQoaUxpbmVJbmRleCk7Ci0gICAgbV9CbG9ja3MuQWRkKGkgLSBpTGluZUluZGV4KTsKLSAgfQotfQotCi1ib29sIENYRkFfVGV4dExheW91dDo6RHJhd1N0cmluZyhDRlhfUmVuZGVyRGV2aWNlKiBwRnhEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiB0bURvYzJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJsb2NrKSB7Ci0gIGlmICghcEZ4RGV2aWNlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZERV9SZW5kZXJEZXZpY2U+IHBEZXZpY2UoCi0gICAgICBuZXcgQ0ZERV9SZW5kZXJEZXZpY2UocEZ4RGV2aWNlLCBmYWxzZSkpOwotICBwRGV2aWNlLT5TYXZlU3RhdGUoKTsKLSAgcERldmljZS0+U2V0Q2xpcFJlY3QocnRDbGlwKTsKLQotICBhdXRvIHBTb2xpZEJydXNoID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGREVfQnJ1c2g+KCk7Ci0gIGF1dG8gcFBlbiA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRkRFX1Blbj4oKTsKLSAgaWYgKG1fcGllY2VMaW5lcy5lbXB0eSgpKSB7Ci0gICAgaW50MzJfdCBpQmxvY2tDb3VudCA9IENvdW50QmxvY2tzKCk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUJsb2NrQ291bnQ7IGkrKykKLSAgICAgIExheW91dChpKTsKLSAgfQotCi0gIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcyA9IG51bGxwdHI7Ci0gIGludDMyX3QgaUNoYXJDb3VudCA9IDA7Ci0gIGludDMyX3QgaUxpbmVTdGFydCA9IDA7Ci0gIGludDMyX3QgaVBpZWNlTGluZXMgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fcGllY2VMaW5lcyk7Ci0gIGludDMyX3QgaUNvdW50ID0gbV9CbG9ja3MuR2V0U2l6ZSgpOwotICBpZiAoaUNvdW50ID4gMCkgewotICAgIGlCbG9jayAqPSAyOwotICAgIGlmIChpQmxvY2sgPCBpQ291bnQpIHsKLSAgICAgIGlMaW5lU3RhcnQgPSBtX0Jsb2Nrcy5FbGVtZW50QXQoaUJsb2NrKTsKLSAgICAgIGlQaWVjZUxpbmVzID0gbV9CbG9ja3MuRWxlbWVudEF0KGlCbG9jayArIDEpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpUGllY2VMaW5lcyA9IDA7Ci0gICAgfQotICB9Ci0KLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVBpZWNlTGluZXM7IGkrKykgewotICAgIGlmIChpICsgaUxpbmVTdGFydCA+PSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fcGllY2VMaW5lcykpCi0gICAgICBicmVhazsKLQotICAgIENYRkFfUGllY2VMaW5lKiBwUGllY2VMaW5lID0gbV9waWVjZUxpbmVzW2kgKyBpTGluZVN0YXJ0XS5nZXQoKTsKLSAgICBpbnQzMl90IGlQaWVjZXMgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcyk7Ci0gICAgaW50MzJfdCBqID0gMDsKLSAgICBmb3IgKGogPSAwOyBqIDwgaVBpZWNlczsgaisrKSB7Ci0gICAgICBjb25zdCBYRkFfVGV4dFBpZWNlKiBwUGllY2UgPSBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXNbal0uZ2V0KCk7Ci0gICAgICBpbnQzMl90IGlDaGFycyA9IHBQaWVjZS0+aUNoYXJzOwotICAgICAgaWYgKGlDaGFyQ291bnQgPCBpQ2hhcnMpIHsKLSAgICAgICAgRlhfRnJlZShwQ2hhclBvcyk7Ci0gICAgICAgIHBDaGFyUG9zID0gRlhfQWxsb2MoRlhURVhUX0NIQVJQT1MsIGlDaGFycyk7Ci0gICAgICAgIGlDaGFyQ291bnQgPSBpQ2hhcnM7Ci0gICAgICB9Ci0gICAgICBGWFNZU19tZW1zZXQocENoYXJQb3MsIDAsIGlDaGFyQ291bnQgKiBzaXplb2YoRlhURVhUX0NIQVJQT1MpKTsKLSAgICAgIFJlbmRlclN0cmluZyhwRGV2aWNlLmdldCgpLCBwU29saWRCcnVzaC5nZXQoKSwgcFBpZWNlTGluZSwgaiwgcENoYXJQb3MsCi0gICAgICAgICAgICAgICAgICAgdG1Eb2MyRGV2aWNlKTsKLSAgICB9Ci0gICAgZm9yIChqID0gMDsgaiA8IGlQaWVjZXM7IGorKykgewotICAgICAgUmVuZGVyUGF0aChwRGV2aWNlLmdldCgpLCBwUGVuLmdldCgpLCBwUGllY2VMaW5lLCBqLCBwQ2hhclBvcywKLSAgICAgICAgICAgICAgICAgdG1Eb2MyRGV2aWNlKTsKLSAgICB9Ci0gIH0KLSAgcERldmljZS0+UmVzdG9yZVN0YXRlKCk7Ci0gIEZYX0ZyZWUocENoYXJQb3MpOwotICByZXR1cm4gaVBpZWNlTGluZXMgPiAwOwotfQotCi12b2lkIENYRkFfVGV4dExheW91dDo6VXBkYXRlQWxpZ24oRlhfRkxPQVQgZkhlaWdodCwgRlhfRkxPQVQgZkJvdHRvbSkgewotICBmSGVpZ2h0IC09IGZCb3R0b207Ci0gIGlmIChmSGVpZ2h0IDwgMC4xZikKLSAgICByZXR1cm47Ci0KLSAgc3dpdGNoIChtX3RleHRQYXJzZXIuR2V0VkFsaWduKG1fcFRleHRQcm92aWRlcikpIHsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZToKLSAgICAgIGZIZWlnaHQgLz0gMi4wZjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tOgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybjsKLSAgfQotCi0gIGZvciAoY29uc3QgYXV0byYgcFBpZWNlTGluZSA6IG1fcGllY2VMaW5lcykgewotICAgIGZvciAoY29uc3QgYXV0byYgcFBpZWNlIDogcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzKQotICAgICAgcFBpZWNlLT5ydFBpZWNlLnRvcCArPSBmSGVpZ2h0OwotICB9Ci19Ci0KLWJvb2wgQ1hGQV9UZXh0TGF5b3V0OjpMb2FkZXIoY29uc3QgQ0ZYX1NpemVGJiBzelRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmTGluZVBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2F2ZVBpZWNlcykgewotICBHZXRUZXh0RGF0YU5vZGUoKTsKLSAgaWYgKCFtX3BUZXh0RGF0YU5vZGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgaWYgKG1fYlJpY2hUZXh0KSB7Ci0gICAgQ0ZERV9YTUxOb2RlKiBwWE1MQ29udGFpbmVyID0gR2V0WE1MQ29udGFpbmVyTm9kZSgpOwotICAgIGlmIChwWE1MQ29udGFpbmVyKSB7Ci0gICAgICBpZiAoIW1fdGV4dFBhcnNlci5Jc1BhcnNlZCgpKQotICAgICAgICBtX3RleHRQYXJzZXIuRG9QYXJzZShwWE1MQ29udGFpbmVyLCBtX3BUZXh0UHJvdmlkZXIpOwotCi0gICAgICBhdXRvIHBSb290U3R5bGUgPSBtX3RleHRQYXJzZXIuQ3JlYXRlUm9vdFN0eWxlKG1fcFRleHRQcm92aWRlcik7Ci0gICAgICBMb2FkUmljaFRleHQocFhNTENvbnRhaW5lciwgc3pUZXh0LCBmTGluZVBvcywgcFJvb3RTdHlsZSwgYlNhdmVQaWVjZXMsCi0gICAgICAgICAgICAgICAgICAgbnVsbHB0cik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIExvYWRUZXh0KG1fcFRleHREYXRhTm9kZSwgc3pUZXh0LCBmTGluZVBvcywgYlNhdmVQaWVjZXMpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIENYRkFfVGV4dExheW91dDo6TG9hZFRleHQoQ1hGQV9Ob2RlKiBwTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfU2l6ZUYmIHN6VGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkxpbmVQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2F2ZVBpZWNlcykgewotICBJbml0QnJlYWsoc3pUZXh0LndpZHRoKTsKLQotICBDWEZBX1BhcmEgcGFyYSA9IG1fcFRleHRQcm92aWRlci0+R2V0UGFyYU5vZGUoKTsKLSAgRlhfRkxPQVQgZlNwYWNlQWJvdmUgPSAwOwotICBpZiAocGFyYSkgewotICAgIGZTcGFjZUFib3ZlID0gcGFyYS5HZXRTcGFjZUFib3ZlKCk7Ci0gICAgaWYgKGZTcGFjZUFib3ZlIDwgMC4xZikgewotICAgICAgZlNwYWNlQWJvdmUgPSAwOwotICAgIH0KLSAgICBpbnQzMl90IHZlckFsaWduID0gcGFyYS5HZXRWZXJ0aWNhbEFsaWduKCk7Ci0gICAgc3dpdGNoICh2ZXJBbGlnbikgewotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3A6Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZToKLSAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tOiB7Ci0gICAgICAgIGZMaW5lUG9zICs9IGZTcGFjZUFib3ZlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBDRlhfV2lkZVN0cmluZyB3c1RleHQgPSBwTm9kZS0+R2V0Q29udGVudCgpOwotICB3c1RleHQuVHJpbVJpZ2h0KEwiICIpOwotICBib29sIGJSZXQgPSBBcHBlbmRDaGFyKHdzVGV4dCwgZkxpbmVQb3MsIGZTcGFjZUFib3ZlLCBiU2F2ZVBpZWNlcyk7Ci0gIGlmIChiUmV0ICYmIG1fcExvYWRlcikKLSAgICBtX3BMb2FkZXItPm1fcE5vZGUgPSBwTm9kZTsKLSAgZWxzZQotICAgIEVuZEJyZWFrKENGWF9SVEZCcmVha1R5cGU6OlBhcmFncmFwaCwgZkxpbmVQb3MsIGJTYXZlUGllY2VzKTsKLX0KLQotYm9vbCBDWEZBX1RleHRMYXlvdXQ6OkxvYWRSaWNoVGV4dCgKLSAgICBDRkRFX1hNTE5vZGUqIHBYTUxOb2RlLAotICAgIGNvbnN0IENGWF9TaXplRiYgc3pUZXh0LAotICAgIEZYX0ZMT0FUJiBmTGluZVBvcywKLSAgICBjb25zdCBDRlhfUmV0YWluUHRyPENGREVfQ1NTQ29tcHV0ZWRTdHlsZT4mIHBQYXJlbnRTdHlsZSwKLSAgICBib29sIGJTYXZlUGllY2VzLAotICAgIENGWF9SZXRhaW5QdHI8Q1hGQV9MaW5rVXNlckRhdGE+IHBMaW5rRGF0YSwKLSAgICBib29sIGJFbmRCcmVhaywKLSAgICBib29sIGJJc09sLAotICAgIGludDMyX3QgaUxpQ291bnQpIHsKLSAgaWYgKCFwWE1MTm9kZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1hGQV9UZXh0UGFyc2VDb250ZXh0KiBwQ29udGV4dCA9Ci0gICAgICBtX3RleHRQYXJzZXIuR2V0UGFyc2VDb250ZXh0RnJvbU1hcChwWE1MTm9kZSk7Ci0gIEZERV9DU1NEaXNwbGF5IGVEaXNwbGF5ID0gRkRFX0NTU0Rpc3BsYXk6Ok5vbmU7Ci0gIGJvb2wgYkNvbnRlbnROb2RlID0gZmFsc2U7Ci0gIEZYX0ZMT0FUIGZTcGFjZUJlbG93ID0gMDsKLSAgQ0ZYX1JldGFpblB0cjxDRkRFX0NTU0NvbXB1dGVkU3R5bGU+IHBTdHlsZTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOwotICBpZiAoYkVuZEJyZWFrKSB7Ci0gICAgYm9vbCBiQ3VyT2wgPSBmYWxzZTsKLSAgICBib29sIGJDdXJMaSA9IGZhbHNlOwotICAgIENGREVfWE1MRWxlbWVudCogcEVsZW1lbnQgPSBudWxscHRyOwotICAgIGlmIChwQ29udGV4dCkgewotICAgICAgaWYgKG1fYkJsb2NrQ29udGludWUgfHwKLSAgICAgICAgICAobV9wTG9hZGVyICYmIHBYTUxOb2RlID09IG1fcExvYWRlci0+bV9wWE1MTm9kZSkpIHsKLSAgICAgICAgbV9iQmxvY2tDb250aW51ZSA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9UZXh0KSB7Ci0gICAgICAgIGJDb250ZW50Tm9kZSA9IHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgewotICAgICAgICBwRWxlbWVudCA9IHN0YXRpY19jYXN0PENGREVfWE1MRWxlbWVudCo+KHBYTUxOb2RlKTsKLSAgICAgICAgcEVsZW1lbnQtPkdldExvY2FsVGFnTmFtZSh3c05hbWUpOwotICAgICAgfQotICAgICAgaWYgKHdzTmFtZSA9PSBMIm9sIikgewotICAgICAgICBiSXNPbCA9IHRydWU7Ci0gICAgICAgIGJDdXJPbCA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAobV9iQmxvY2tDb250aW51ZSB8fCBiQ29udGVudE5vZGUgPT0gZmFsc2UpIHsKLSAgICAgICAgZURpc3BsYXkgPSBwQ29udGV4dC0+R2V0RGlzcGxheSgpOwotICAgICAgICBpZiAoZURpc3BsYXkgIT0gRkRFX0NTU0Rpc3BsYXk6OkJsb2NrICYmCi0gICAgICAgICAgICBlRGlzcGxheSAhPSBGREVfQ1NTRGlzcGxheTo6SW5saW5lICYmCi0gICAgICAgICAgICBlRGlzcGxheSAhPSBGREVfQ1NTRGlzcGxheTo6TGlzdEl0ZW0pIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHBTdHlsZSA9IG1fdGV4dFBhcnNlci5Db21wdXRlU3R5bGUocFhNTE5vZGUsIHBQYXJlbnRTdHlsZS5HZXQoKSk7Ci0gICAgICAgIEluaXRCcmVhayhiQ29udGVudE5vZGUgPyBwUGFyZW50U3R5bGUuR2V0KCkgOiBwU3R5bGUuR2V0KCksIGVEaXNwbGF5LAotICAgICAgICAgICAgICAgICAgc3pUZXh0LndpZHRoLCBwWE1MTm9kZSwgcFBhcmVudFN0eWxlLkdldCgpKTsKLSAgICAgICAgaWYgKChlRGlzcGxheSA9PSBGREVfQ1NTRGlzcGxheTo6QmxvY2sgfHwKLSAgICAgICAgICAgICBlRGlzcGxheSA9PSBGREVfQ1NTRGlzcGxheTo6TGlzdEl0ZW0pICYmCi0gICAgICAgICAgICBwU3R5bGUgJiYKLSAgICAgICAgICAgICh3c05hbWUuSXNFbXB0eSgpIHx8ICh3c05hbWUgIT0gTCJib2R5IiAmJiB3c05hbWUgIT0gTCJodG1sIiAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzTmFtZSAhPSBMIm9sIiAmJiB3c05hbWUgIT0gTCJ1bCIpKSkgewotICAgICAgICAgIGNvbnN0IEZERV9DU1NSZWN0KiBwUmVjdCA9IHBTdHlsZS0+R2V0TWFyZ2luV2lkdGgoKTsKLSAgICAgICAgICBpZiAocFJlY3QpIHsKLSAgICAgICAgICAgIGZMaW5lUG9zICs9IHBSZWN0LT50b3AuR2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGZTcGFjZUJlbG93ID0gcFJlY3QtPmJvdHRvbS5HZXRWYWx1ZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICh3c05hbWUgPT0gTCJhIikgewotICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTGlua0NvbnRlbnQ7Ci0gICAgICAgICAgQVNTRVJUKHBFbGVtZW50KTsKLSAgICAgICAgICBwRWxlbWVudC0+R2V0U3RyaW5nKEwiaHJlZiIsIHdzTGlua0NvbnRlbnQpOwotICAgICAgICAgIGlmICghd3NMaW5rQ29udGVudC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHBMaW5rRGF0YSA9IHBkZml1bTo6TWFrZVJldGFpbjxDWEZBX0xpbmtVc2VyRGF0YT4oCi0gICAgICAgICAgICAgICAgd3NMaW5rQ29udGVudC5HZXRCdWZmZXIod3NMaW5rQ29udGVudC5HZXRMZW5ndGgoKSkpOwotICAgICAgICAgICAgd3NMaW5rQ29udGVudC5SZWxlYXNlQnVmZmVyKHdzTGlua0NvbnRlbnQuR2V0TGVuZ3RoKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludDMyX3QgaVRhYkNvdW50ID0gbV90ZXh0UGFyc2VyLkNvdW50VGFicygKLSAgICAgICAgICAgIGJDb250ZW50Tm9kZSA/IHBQYXJlbnRTdHlsZS5HZXQoKSA6IHBTdHlsZS5HZXQoKSk7Ci0gICAgICAgIGJvb2wgYlNwYWNlUnVuID0gbV90ZXh0UGFyc2VyLklzU3BhY2VSdW4oCi0gICAgICAgICAgICBiQ29udGVudE5vZGUgPyBwUGFyZW50U3R5bGUuR2V0KCkgOiBwU3R5bGUuR2V0KCkpOwotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7Ci0gICAgICAgIGlmIChiQ29udGVudE5vZGUgJiYgaVRhYkNvdW50ID09IDApIHsKLSAgICAgICAgICBzdGF0aWNfY2FzdDxDRkRFX1hNTFRleHQqPihwWE1MTm9kZSktPkdldFRleHQod3NUZXh0KTsKLSAgICAgICAgfSBlbHNlIGlmICh3c05hbWUgPT0gTCJiciIpIHsKLSAgICAgICAgICB3c1RleHQgPSBMJ1xuJzsKLSAgICAgICAgfSBlbHNlIGlmICh3c05hbWUgPT0gTCJsaSIpIHsKLSAgICAgICAgICBiQ3VyTGkgPSB0cnVlOwotICAgICAgICAgIGlmIChiSXNPbCkKLSAgICAgICAgICAgIHdzVGV4dC5Gb3JtYXQoTCIlZC4gICIsIGlMaUNvdW50KTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB3c1RleHQgPSAweDAwQjcgKyBDRlhfV2lkZVN0cmluZ0MoTCIgICIsIDEpOwotICAgICAgICB9IGVsc2UgaWYgKCFiQ29udGVudE5vZGUpIHsKLSAgICAgICAgICBpZiAoaVRhYkNvdW50ID4gMCkgewotICAgICAgICAgICAgd2hpbGUgKGlUYWJDb3VudC0tID4gMCkKLSAgICAgICAgICAgICAgd3NUZXh0ICs9IEwnXHQnOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtX3RleHRQYXJzZXIuR2V0RW1iYmVkT2JqKG1fcFRleHRQcm92aWRlciwgcFhNTE5vZGUsIHdzVGV4dCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50MzJfdCBpTGVuZ3RoID0gd3NUZXh0LkdldExlbmd0aCgpOwotICAgICAgICBpZiAoaUxlbmd0aCA+IDAgJiYgYkNvbnRlbnROb2RlICYmICFiU3BhY2VSdW4pCi0gICAgICAgICAgUHJvY2Vzc1RleHQod3NUZXh0KTsKLQotICAgICAgICBpZiAobV9wTG9hZGVyKSB7Ci0gICAgICAgICAgaWYgKHdzVGV4dC5HZXRMZW5ndGgoKSA+IDAgJiYKLSAgICAgICAgICAgICAgKG1fcExvYWRlci0+bV9kd0ZsYWdzICYgWEZBX0xPQURFUkNOVFhURkxHX0ZJTFRFUlNQQUNFKSkgewotICAgICAgICAgICAgd3NUZXh0LlRyaW1MZWZ0KDB4MjApOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoRkRFX0NTU0Rpc3BsYXk6OkJsb2NrID09IGVEaXNwbGF5KSB7Ci0gICAgICAgICAgICBtX3BMb2FkZXItPm1fZHdGbGFncyB8PSBYRkFfTE9BREVSQ05UWFRGTEdfRklMVEVSU1BBQ0U7Ci0gICAgICAgICAgfSBlbHNlIGlmIChGREVfQ1NTRGlzcGxheTo6SW5saW5lID09IGVEaXNwbGF5ICYmCi0gICAgICAgICAgICAgICAgICAgICAobV9wTG9hZGVyLT5tX2R3RmxhZ3MgJiBYRkFfTE9BREVSQ05UWFRGTEdfRklMVEVSU1BBQ0UpKSB7Ci0gICAgICAgICAgICBtX3BMb2FkZXItPm1fZHdGbGFncyAmPSB+WEZBX0xPQURFUkNOVFhURkxHX0ZJTFRFUlNQQUNFOwotICAgICAgICAgIH0gZWxzZSBpZiAod3NUZXh0LkdldExlbmd0aCgpID4gMCAmJgotICAgICAgICAgICAgICAgICAgICAgKDB4MjAgPT0gd3NUZXh0LkdldEF0KHdzVGV4dC5HZXRMZW5ndGgoKSAtIDEpKSkgewotICAgICAgICAgICAgbV9wTG9hZGVyLT5tX2R3RmxhZ3MgfD0gWEZBX0xPQURFUkNOVFhURkxHX0ZJTFRFUlNQQUNFOwotICAgICAgICAgIH0gZWxzZSBpZiAod3NUZXh0LkdldExlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgIG1fcExvYWRlci0+bV9kd0ZsYWdzICY9IH5YRkFfTE9BREVSQ05UWFRGTEdfRklMVEVSU1BBQ0U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHdzVGV4dC5HZXRMZW5ndGgoKSA+IDApIHsKLSAgICAgICAgICBpZiAoIW1fcExvYWRlciB8fCBtX3BMb2FkZXItPm1faUNoYXIgPT0gMCkgewotICAgICAgICAgICAgYXV0byBwVXNlckRhdGEgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q1hGQV9UZXh0VXNlckRhdGE+KAotICAgICAgICAgICAgICAgIGJDb250ZW50Tm9kZSA/IHBQYXJlbnRTdHlsZSA6IHBTdHlsZSwgcExpbmtEYXRhKTsKLSAgICAgICAgICAgIG1fcEJyZWFrLT5TZXRVc2VyRGF0YShwVXNlckRhdGEpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChBcHBlbmRDaGFyKHdzVGV4dCwgZkxpbmVQb3MsIDAsIGJTYXZlUGllY2VzKSkgewotICAgICAgICAgICAgaWYgKG1fcExvYWRlcikKLSAgICAgICAgICAgICAgbV9wTG9hZGVyLT5tX2R3RmxhZ3MgJj0gflhGQV9MT0FERVJDTlRYVEZMR19GSUxURVJTUEFDRTsKLSAgICAgICAgICAgIGlmIChJc0VuZChiU2F2ZVBpZWNlcykpIHsKLSAgICAgICAgICAgICAgaWYgKG1fcExvYWRlciAmJiBtX3BMb2FkZXItPm1faVRvdGFsTGluZXMgPiAtMSkgewotICAgICAgICAgICAgICAgIG1fcExvYWRlci0+bV9wWE1MTm9kZSA9IHBYTUxOb2RlOwotICAgICAgICAgICAgICAgIG1fcExvYWRlci0+bV9wUGFyZW50U3R5bGUgPSBwUGFyZW50U3R5bGU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChDRkRFX1hNTE5vZGUqIHBDaGlsZE5vZGUgPQotICAgICAgICAgICAgIHBYTUxOb2RlLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOwotICAgICAgICAgcENoaWxkTm9kZTsKLSAgICAgICAgIHBDaGlsZE5vZGUgPSBwQ2hpbGROb2RlLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgewotICAgICAgaWYgKGJDdXJPbCkKLSAgICAgICAgaUxpQ291bnQrKzsKLQotICAgICAgaWYgKCFMb2FkUmljaFRleHQocENoaWxkTm9kZSwgc3pUZXh0LCBmTGluZVBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0ID8gcFN0eWxlIDogcFBhcmVudFN0eWxlLCBiU2F2ZVBpZWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHBMaW5rRGF0YSwgdHJ1ZSwgYklzT2wsIGlMaUNvdW50KSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChtX3BMb2FkZXIpIHsKLSAgICAgIGlmIChGREVfQ1NTRGlzcGxheTo6QmxvY2sgPT0gZURpc3BsYXkpCi0gICAgICAgIG1fcExvYWRlci0+bV9kd0ZsYWdzIHw9IFhGQV9MT0FERVJDTlRYVEZMR19GSUxURVJTUEFDRTsKLSAgICB9Ci0gICAgaWYgKGJDdXJMaSkKLSAgICAgIEVuZEJyZWFrKENGWF9SVEZCcmVha1R5cGU6OkxpbmUsIGZMaW5lUG9zLCBiU2F2ZVBpZWNlcyk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKHBDb250ZXh0KQotICAgICAgZURpc3BsYXkgPSBwQ29udGV4dC0+R2V0RGlzcGxheSgpOwotICB9Ci0KLSAgaWYgKG1fYkJsb2NrQ29udGludWUpIHsKLSAgICBpZiAocENvbnRleHQgJiYgIWJDb250ZW50Tm9kZSkgewotICAgICAgQ0ZYX1JURkJyZWFrVHlwZSBkd1N0YXR1cyA9IChlRGlzcGxheSA9PSBGREVfQ1NTRGlzcGxheTo6QmxvY2spCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQ0ZYX1JURkJyZWFrVHlwZTo6UGFyYWdyYXBoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ0ZYX1JURkJyZWFrVHlwZTo6UGllY2U7Ci0gICAgICBFbmRCcmVhayhkd1N0YXR1cywgZkxpbmVQb3MsIGJTYXZlUGllY2VzKTsKLSAgICAgIGlmIChlRGlzcGxheSA9PSBGREVfQ1NTRGlzcGxheTo6QmxvY2spIHsKLSAgICAgICAgZkxpbmVQb3MgKz0gZlNwYWNlQmVsb3c7Ci0gICAgICAgIGlmIChtX3BUYWJzdG9wQ29udGV4dCkKLSAgICAgICAgICBtX3BUYWJzdG9wQ29udGV4dC0+UmVtb3ZlQWxsKCk7Ci0gICAgICB9Ci0gICAgICBpZiAoSXNFbmQoYlNhdmVQaWVjZXMpKSB7Ci0gICAgICAgIGlmIChtX3BMb2FkZXIgJiYgbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzID4gLTEpIHsKLSAgICAgICAgICBtX3BMb2FkZXItPm1fcFhNTE5vZGUgPQotICAgICAgICAgICAgICBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZERV9YTUxOb2RlOjpOZXh0U2libGluZyk7Ci0gICAgICAgICAgbV9wTG9hZGVyLT5tX3BQYXJlbnRTdHlsZSA9IHBQYXJlbnRTdHlsZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENYRkFfVGV4dExheW91dDo6QXBwZW5kQ2hhcihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZMaW5lUG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlNwYWNlQWJvdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTYXZlUGllY2VzKSB7Ci0gIENGWF9SVEZCcmVha1R5cGUgZHdTdGF0dXMgPSBDRlhfUlRGQnJlYWtUeXBlOjpOb25lOwotICBpbnQzMl90IGlDaGFyID0gMDsKLSAgaWYgKG1fcExvYWRlcikKLSAgICBpQ2hhciA9IG1fcExvYWRlci0+bV9pQ2hhcjsKLQotICBpbnQzMl90IGlMZW5ndGggPSB3c1RleHQuR2V0TGVuZ3RoKCk7Ci0gIGZvciAoaW50MzJfdCBpID0gaUNoYXI7IGkgPCBpTGVuZ3RoOyBpKyspIHsKLSAgICBGWF9XQ0hBUiB3Y2ggPSB3c1RleHQuR2V0QXQoaSk7Ci0gICAgaWYgKHdjaCA9PSAweEEwKQotICAgICAgd2NoID0gMHgyMDsKLQotICAgIGR3U3RhdHVzID0gbV9wQnJlYWstPkFwcGVuZENoYXIod2NoKTsKLSAgICBpZiAoZHdTdGF0dXMgIT0gQ0ZYX1JURkJyZWFrVHlwZTo6Tm9uZSAmJgotICAgICAgICBkd1N0YXR1cyAhPSBDRlhfUlRGQnJlYWtUeXBlOjpQaWVjZSkgewotICAgICAgQXBwZW5kVGV4dExpbmUoZHdTdGF0dXMsIGZMaW5lUG9zLCBiU2F2ZVBpZWNlcyk7Ci0gICAgICBpZiAoSXNFbmQoYlNhdmVQaWVjZXMpKSB7Ci0gICAgICAgIGlmIChtX3BMb2FkZXIpCi0gICAgICAgICAgbV9wTG9hZGVyLT5tX2lDaGFyID0gaTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoZHdTdGF0dXMgPT0gQ0ZYX1JURkJyZWFrVHlwZTo6UGFyYWdyYXBoICYmIG1fYlJpY2hUZXh0KQotICAgICAgICBmTGluZVBvcyArPSBmU3BhY2VBYm92ZTsKLSAgICB9Ci0gIH0KLSAgaWYgKG1fcExvYWRlcikKLSAgICBtX3BMb2FkZXItPm1faUNoYXIgPSAwOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX1RleHRMYXlvdXQ6OklzRW5kKGJvb2wgYlNhdmVQaWVjZXMpIHsKLSAgaWYgKCFiU2F2ZVBpZWNlcykKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChtX3BMb2FkZXIgJiYgbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzID4gMCkKLSAgICByZXR1cm4gbV9pTGluZXMgPj0gbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpQcm9jZXNzVGV4dChDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7Ci0gIGludDMyX3QgaUxlbiA9IHdzVGV4dC5HZXRMZW5ndGgoKTsKLSAgaWYgKGlMZW4gPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgRlhfV0NIQVIqIHBzeiA9IHdzVGV4dC5HZXRCdWZmZXIoaUxlbik7Ci0gIGludDMyX3QgaVRyaW1MZWZ0ID0gMDsKLSAgRlhfV0NIQVIgd2NoID0gMCwgd1ByZXYgPSAwOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGVuOyBpKyspIHsKLSAgICB3Y2ggPSBwc3pbaV07Ci0gICAgaWYgKHdjaCA8IDB4MjApCi0gICAgICB3Y2ggPSAweDIwOwotICAgIGlmICh3Y2ggPT0gMHgyMCAmJiB3UHJldiA9PSAweDIwKQotICAgICAgY29udGludWU7Ci0KLSAgICB3UHJldiA9IHdjaDsKLSAgICBwc3pbaVRyaW1MZWZ0KytdID0gd2NoOwotICB9Ci0gIHdzVGV4dC5SZWxlYXNlQnVmZmVyKGlMZW4pOwotICB3c1RleHQgPSB3c1RleHQuTGVmdChpVHJpbUxlZnQpOwotfQotCi12b2lkIENYRkFfVGV4dExheW91dDo6RW5kQnJlYWsoQ0ZYX1JURkJyZWFrVHlwZSBkd1N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkxpbmVQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2F2ZVBpZWNlcykgewotICBkd1N0YXR1cyA9IG1fcEJyZWFrLT5FbmRCcmVhayhkd1N0YXR1cyk7Ci0gIGlmIChkd1N0YXR1cyAhPSBDRlhfUlRGQnJlYWtUeXBlOjpOb25lICYmIGR3U3RhdHVzICE9IENGWF9SVEZCcmVha1R5cGU6OlBpZWNlKQotICAgIEFwcGVuZFRleHRMaW5lKGR3U3RhdHVzLCBmTGluZVBvcywgYlNhdmVQaWVjZXMsIHRydWUpOwotfQotCi12b2lkIENYRkFfVGV4dExheW91dDo6RG9UYWJzdG9wcyhDRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfUGllY2VMaW5lKiBwUGllY2VMaW5lKSB7Ci0gIGlmICghbV9wVGFic3RvcENvbnRleHQgfHwgbV9wVGFic3RvcENvbnRleHQtPm1faVRhYkNvdW50ID09IDApCi0gICAgcmV0dXJuOwotICBpZiAoIXBTdHlsZSB8fCAhcFBpZWNlTGluZSkKLSAgICByZXR1cm47Ci0KLSAgaW50MzJfdCBpUGllY2VzID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihwUGllY2VMaW5lLT5tX3RleHRQaWVjZXMpOwotICBpZiAoaVBpZWNlcyA9PSAwKQotICAgIHJldHVybjsKLQotICBYRkFfVGV4dFBpZWNlKiBwUGllY2UgPSBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXNbaVBpZWNlcyAtIDFdLmdldCgpOwotICBpbnQzMl90JiBpVGFic3RvcHNJbmRleCA9IG1fcFRhYnN0b3BDb250ZXh0LT5tX2lUYWJJbmRleDsKLSAgaW50MzJfdCBpQ291bnQgPSBtX3RleHRQYXJzZXIuQ291bnRUYWJzKHBTdHlsZSk7Ci0gIGlmIChpVGFic3RvcHNJbmRleCA+IG1fcFRhYnN0b3BDb250ZXh0LT5tX2lUYWJDb3VudCAtIDEpCi0gICAgcmV0dXJuOwotCi0gIGlmIChpQ291bnQgPiAwKSB7Ci0gICAgaVRhYnN0b3BzSW5kZXgrKzsKLSAgICBtX3BUYWJzdG9wQ29udGV4dC0+bV9iVGFic3RvcHMgPSB0cnVlOwotICAgIEZYX0ZMT0FUIGZSaWdodCA9IDA7Ci0gICAgaWYgKGlQaWVjZXMgPiAxKSB7Ci0gICAgICBYRkFfVGV4dFBpZWNlKiBwID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzW2lQaWVjZXMgLSAyXS5nZXQoKTsKLSAgICAgIGZSaWdodCA9IHAtPnJ0UGllY2UucmlnaHQoKTsKLSAgICB9Ci0gICAgbV9wVGFic3RvcENvbnRleHQtPm1fZlRhYldpZHRoID0KLSAgICAgICAgcFBpZWNlLT5ydFBpZWNlLndpZHRoICsgcFBpZWNlLT5ydFBpZWNlLmxlZnQgLSBmUmlnaHQ7Ci0gIH0gZWxzZSBpZiAoaVRhYnN0b3BzSW5kZXggPiAtMSkgewotICAgIEZYX0ZMT0FUIGZMZWZ0ID0gMDsKLSAgICBpZiAobV9wVGFic3RvcENvbnRleHQtPm1fYlRhYnN0b3BzKSB7Ci0gICAgICBYRkFfVEFCU1RPUFMqIHBUYWJzdG9wcyA9Ci0gICAgICAgICAgbV9wVGFic3RvcENvbnRleHQtPm1fdGFic3RvcHMuR2V0RGF0YVB0cihpVGFic3RvcHNJbmRleCk7Ci0gICAgICB1aW50MzJfdCBkd0FsaWduID0gcFRhYnN0b3BzLT5kd0FsaWduOwotICAgICAgaWYgKGR3QWxpZ24gPT0gRlhfSGFzaENvZGVfR2V0VyhMImNlbnRlciIsIGZhbHNlKSkgewotICAgICAgICBmTGVmdCA9IHBQaWVjZS0+cnRQaWVjZS53aWR0aCAvIDIuMGY7Ci0gICAgICB9IGVsc2UgaWYgKGR3QWxpZ24gPT0gRlhfSGFzaENvZGVfR2V0VyhMInJpZ2h0IiwgZmFsc2UpIHx8Ci0gICAgICAgICAgICAgICAgIGR3QWxpZ24gPT0gRlhfSGFzaENvZGVfR2V0VyhMImJlZm9yZSIsIGZhbHNlKSkgewotICAgICAgICBmTGVmdCA9IHBQaWVjZS0+cnRQaWVjZS53aWR0aDsKLSAgICAgIH0gZWxzZSBpZiAoZHdBbGlnbiA9PSBGWF9IYXNoQ29kZV9HZXRXKEwiZGVjaW1hbCIsIGZhbHNlKSkgewotICAgICAgICBpbnQzMl90IGlDaGFycyA9IHBQaWVjZS0+aUNoYXJzOwotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ2hhcnM7IGkrKykgewotICAgICAgICAgIGlmIChwUGllY2UtPnN6VGV4dFtpXSA9PSBMJy4nKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBmTGVmdCArPSBwUGllY2UtPldpZHRoc1tpXSAvIDIwMDAwLjBmOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBtX3BUYWJzdG9wQ29udGV4dC0+bV9mTGVmdCA9Ci0gICAgICAgICAgc3RkOjptaW4oZkxlZnQsIG1fcFRhYnN0b3BDb250ZXh0LT5tX2ZUYWJXaWR0aCk7Ci0gICAgICBtX3BUYWJzdG9wQ29udGV4dC0+bV9iVGFic3RvcHMgPSBmYWxzZTsKLSAgICAgIG1fcFRhYnN0b3BDb250ZXh0LT5tX2ZUYWJXaWR0aCA9IDA7Ci0gICAgfQotICAgIHBQaWVjZS0+cnRQaWVjZS5sZWZ0IC09IG1fcFRhYnN0b3BDb250ZXh0LT5tX2ZMZWZ0OwotICB9Ci19Ci0KLXZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpBcHBlbmRUZXh0TGluZShDRlhfUlRGQnJlYWtUeXBlIGR3U3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmTGluZVBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTYXZlUGllY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkVuZEJyZWFrKSB7Ci0gIGludDMyX3QgaVBpZWNlcyA9IG1fcEJyZWFrLT5Db3VudEJyZWFrUGllY2VzKCk7Ci0gIGlmIChpUGllY2VzIDwgMSkKLSAgICByZXR1cm47Ci0KLSAgQ0ZYX1JldGFpblB0cjxDRkRFX0NTU0NvbXB1dGVkU3R5bGU+IHBTdHlsZTsKLSAgaWYgKGJTYXZlUGllY2VzKSB7Ci0gICAgYXV0byBwTmV3ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfUGllY2VMaW5lPigpOwotICAgIENYRkFfUGllY2VMaW5lKiBwUGllY2VMaW5lID0gcE5ldy5nZXQoKTsKLSAgICBtX3BpZWNlTGluZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShwTmV3KSk7Ci0gICAgaWYgKG1fcFRhYnN0b3BDb250ZXh0KQotICAgICAgbV9wVGFic3RvcENvbnRleHQtPlJlc2V0KCk7Ci0KLSAgICBGWF9GTE9BVCBmTGluZVN0ZXAgPSAwLCBmQmFzZUxpbmUgPSAwOwotICAgIGludDMyX3QgaSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IGlQaWVjZXM7IGkrKykgewotICAgICAgY29uc3QgQ0ZYX1JURlBpZWNlKiBwUGllY2UgPSBtX3BCcmVhay0+R2V0QnJlYWtQaWVjZShpKTsKLSAgICAgIENYRkFfVGV4dFVzZXJEYXRhKiBwVXNlckRhdGEgPQotICAgICAgICAgIHN0YXRpY19jYXN0PENYRkFfVGV4dFVzZXJEYXRhKj4ocFBpZWNlLT5tX3BVc2VyRGF0YS5HZXQoKSk7Ci0gICAgICBpZiAocFVzZXJEYXRhKQotICAgICAgICBwU3R5bGUgPSBwVXNlckRhdGEtPm1fcFN0eWxlOwotICAgICAgRlhfRkxPQVQgZlZlclNjYWxlID0gcFBpZWNlLT5tX2lWZXJ0aWNhbFNjYWxlIC8gMTAwLjBmOwotCi0gICAgICBhdXRvIHBUUCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxYRkFfVGV4dFBpZWNlPigpOwotICAgICAgcFRQLT5pQ2hhcnMgPSBwUGllY2UtPm1faUNoYXJzOwotICAgICAgcFRQLT5zelRleHQgPSBwUGllY2UtPkdldFN0cmluZygpOwotICAgICAgcFRQLT5XaWR0aHMgPSBwUGllY2UtPkdldFdpZHRocygpOwotICAgICAgcFRQLT5pQmlkaUxldmVsID0gcFBpZWNlLT5tX2lCaWRpTGV2ZWw7Ci0gICAgICBwVFAtPmlIb3JTY2FsZSA9IHBQaWVjZS0+bV9pSG9yaXpvbnRhbFNjYWxlOwotICAgICAgcFRQLT5pVmVyU2NhbGUgPSBwUGllY2UtPm1faVZlcnRpY2FsU2NhbGU7Ci0gICAgICBtX3RleHRQYXJzZXIuR2V0VW5kZXJsaW5lKG1fcFRleHRQcm92aWRlciwgcFN0eWxlLkdldCgpLCBwVFAtPmlVbmRlcmxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUUC0+aVBlcmlvZCk7Ci0gICAgICBtX3RleHRQYXJzZXIuR2V0TGluZXRocm91Z2gobV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUuR2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRQLT5pTGluZVRocm91Z2gpOwotICAgICAgcFRQLT5kd0NvbG9yID0gbV90ZXh0UGFyc2VyLkdldENvbG9yKG1fcFRleHRQcm92aWRlciwgcFN0eWxlLkdldCgpKTsKLSAgICAgIHBUUC0+cEZvbnQgPSBtX3RleHRQYXJzZXIuR2V0Rm9udChtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZS5HZXQoKSk7Ci0gICAgICBwVFAtPmZGb250U2l6ZSA9IG1fdGV4dFBhcnNlci5HZXRGb250U2l6ZShtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZS5HZXQoKSk7Ci0gICAgICBwVFAtPnJ0UGllY2UubGVmdCA9IHBQaWVjZS0+bV9pU3RhcnRQb3MgLyAyMDAwMC4wZjsKLSAgICAgIHBUUC0+cnRQaWVjZS53aWR0aCA9IHBQaWVjZS0+bV9pV2lkdGggLyAyMDAwMC4wZjsKLSAgICAgIHBUUC0+cnRQaWVjZS5oZWlnaHQgPSAoRlhfRkxPQVQpcFBpZWNlLT5tX2lGb250U2l6ZSAqIGZWZXJTY2FsZSAvIDIwLjBmOwotICAgICAgRlhfRkxPQVQgZkJhc2VMaW5lVGVtcCA9Ci0gICAgICAgICAgbV90ZXh0UGFyc2VyLkdldEJhc2VsaW5lKG1fcFRleHRQcm92aWRlciwgcFN0eWxlLkdldCgpKTsKLSAgICAgIHBUUC0+cnRQaWVjZS50b3AgPSBmQmFzZUxpbmVUZW1wOwotCi0gICAgICBGWF9GTE9BVCBmTGluZUhlaWdodCA9IG1fdGV4dFBhcnNlci5HZXRMaW5lSGVpZ2h0KAotICAgICAgICAgIG1fcFRleHRQcm92aWRlciwgcFN0eWxlLkdldCgpLCBtX2lMaW5lcyA9PSAwLCBmVmVyU2NhbGUpOwotICAgICAgaWYgKGZCYXNlTGluZVRlbXAgPiAwKSB7Ci0gICAgICAgIEZYX0ZMT0FUIGZMaW5lSGVpZ2h0VG1wID0gZkJhc2VMaW5lVGVtcCArIHBUUC0+cnRQaWVjZS5oZWlnaHQ7Ci0gICAgICAgIGlmIChmTGluZUhlaWdodCA8IGZMaW5lSGVpZ2h0VG1wKQotICAgICAgICAgIGZMaW5lSGVpZ2h0ID0gZkxpbmVIZWlnaHRUbXA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBmQmFzZUxpbmVUZW1wID0gMDsKLSAgICAgIH0gZWxzZSBpZiAoZkJhc2VMaW5lIDwgLWZCYXNlTGluZVRlbXApIHsKLSAgICAgICAgZkJhc2VMaW5lID0gLWZCYXNlTGluZVRlbXA7Ci0gICAgICB9Ci0gICAgICBmTGluZVN0ZXAgPSBzdGQ6Om1heChmTGluZVN0ZXAsIGZMaW5lSGVpZ2h0KTsKLSAgICAgIHBUUC0+cExpbmtEYXRhID0gcFVzZXJEYXRhID8gcFVzZXJEYXRhLT5tX3BMaW5rRGF0YSA6IG51bGxwdHI7Ci0gICAgICBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShwVFApKTsKLSAgICAgIERvVGFic3RvcHMocFN0eWxlLkdldCgpLCBwUGllY2VMaW5lKTsKLSAgICB9Ci0gICAgZm9yIChjb25zdCBhdXRvJiBwVFAgOiBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXMpIHsKLSAgICAgIEZYX0ZMT0FUJiBmVG9wID0gcFRQLT5ydFBpZWNlLnRvcDsKLSAgICAgIEZYX0ZMT0FUIGZCYXNlTGluZVRlbXAgPSBmVG9wOwotICAgICAgZlRvcCA9IGZMaW5lUG9zICsgZkxpbmVTdGVwIC0gcFRQLT5ydFBpZWNlLmhlaWdodCAtIGZCYXNlTGluZVRlbXA7Ci0gICAgICBmVG9wID0gc3RkOjptYXgoMC4wZiwgZlRvcCk7Ci0gICAgfQotICAgIGZMaW5lUG9zICs9IGZMaW5lU3RlcCArIGZCYXNlTGluZTsKLSAgfSBlbHNlIHsKLSAgICBGWF9GTE9BVCBmTGluZVN0ZXAgPSAwOwotICAgIEZYX0ZMT0FUIGZMaW5lV2lkdGggPSAwOwotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlQaWVjZXM7IGkrKykgewotICAgICAgY29uc3QgQ0ZYX1JURlBpZWNlKiBwUGllY2UgPSBtX3BCcmVhay0+R2V0QnJlYWtQaWVjZShpKTsKLSAgICAgIENYRkFfVGV4dFVzZXJEYXRhKiBwVXNlckRhdGEgPQotICAgICAgICAgIHN0YXRpY19jYXN0PENYRkFfVGV4dFVzZXJEYXRhKj4ocFBpZWNlLT5tX3BVc2VyRGF0YS5HZXQoKSk7Ci0gICAgICBpZiAocFVzZXJEYXRhKQotICAgICAgICBwU3R5bGUgPSBwVXNlckRhdGEtPm1fcFN0eWxlOwotICAgICAgRlhfRkxPQVQgZlZlclNjYWxlID0gcFBpZWNlLT5tX2lWZXJ0aWNhbFNjYWxlIC8gMTAwLjBmOwotICAgICAgRlhfRkxPQVQgZkJhc2VMaW5lID0KLSAgICAgICAgICBtX3RleHRQYXJzZXIuR2V0QmFzZWxpbmUobV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUuR2V0KCkpOwotICAgICAgRlhfRkxPQVQgZkxpbmVIZWlnaHQgPSBtX3RleHRQYXJzZXIuR2V0TGluZUhlaWdodCgKLSAgICAgICAgICBtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZS5HZXQoKSwgbV9pTGluZXMgPT0gMCwgZlZlclNjYWxlKTsKLSAgICAgIGlmIChmQmFzZUxpbmUgPiAwKSB7Ci0gICAgICAgIEZYX0ZMT0FUIGZMaW5lSGVpZ2h0VG1wID0KLSAgICAgICAgICAgIGZCYXNlTGluZSArIChGWF9GTE9BVClwUGllY2UtPm1faUZvbnRTaXplICogZlZlclNjYWxlIC8gMjAuMGY7Ci0gICAgICAgIGlmIChmTGluZUhlaWdodCA8IGZMaW5lSGVpZ2h0VG1wKSB7Ci0gICAgICAgICAgZkxpbmVIZWlnaHQgPSBmTGluZUhlaWdodFRtcDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZkxpbmVTdGVwID0gc3RkOjptYXgoZkxpbmVTdGVwLCBmTGluZUhlaWdodCk7Ci0gICAgICBmTGluZVdpZHRoICs9IHBQaWVjZS0+bV9pV2lkdGggLyAyMDAwMC4wZjsKLSAgICB9Ci0gICAgZkxpbmVQb3MgKz0gZkxpbmVTdGVwOwotICAgIG1fZk1heFdpZHRoID0gc3RkOjptYXgobV9mTWF4V2lkdGgsIGZMaW5lV2lkdGgpOwotICAgIGlmIChtX3BMb2FkZXIgJiYgbV9wTG9hZGVyLT5tX2JTYXZlTGluZUhlaWdodCkgewotICAgICAgRlhfRkxPQVQgZkhlaWdodCA9IGZMaW5lUG9zIC0gbV9wTG9hZGVyLT5tX2ZMYXN0UG9zOwotICAgICAgbV9wTG9hZGVyLT5tX2ZMYXN0UG9zID0gZkxpbmVQb3M7Ci0gICAgICBtX3BMb2FkZXItPm1fbGluZUhlaWdodHMuQWRkKGZIZWlnaHQpOwotICAgIH0KLSAgfQotCi0gIG1fcEJyZWFrLT5DbGVhckJyZWFrUGllY2VzKCk7Ci0gIGlmIChkd1N0YXR1cyA9PSBDRlhfUlRGQnJlYWtUeXBlOjpQYXJhZ3JhcGgpIHsKLSAgICBtX3BCcmVhay0+UmVzZXQoKTsKLSAgICBpZiAoIXBTdHlsZSAmJiBiRW5kQnJlYWspIHsKLSAgICAgIENYRkFfUGFyYSBwYXJhID0gbV9wVGV4dFByb3ZpZGVyLT5HZXRQYXJhTm9kZSgpOwotICAgICAgaWYgKHBhcmEpIHsKLSAgICAgICAgRlhfRkxPQVQgZlN0YXJ0UG9zID0gcGFyYS5HZXRNYXJnaW5MZWZ0KCk7Ci0gICAgICAgIEZYX0ZMT0FUIGZJbmRlbnQgPSBwYXJhLkdldFRleHRJbmRlbnQoKTsKLSAgICAgICAgaWYgKGZJbmRlbnQgPiAwKQotICAgICAgICAgIGZTdGFydFBvcyArPSBmSW5kZW50OwotCi0gICAgICAgIEZYX0ZMT0FUIGZTcGFjZUJlbG93ID0gcGFyYS5HZXRTcGFjZUJlbG93KCk7Ci0gICAgICAgIGlmIChmU3BhY2VCZWxvdyA8IDAuMWYpCi0gICAgICAgICAgZlNwYWNlQmVsb3cgPSAwOwotCi0gICAgICAgIG1fcEJyZWFrLT5TZXRMaW5lU3RhcnRQb3MoZlN0YXJ0UG9zKTsKLSAgICAgICAgZkxpbmVQb3MgKz0gZlNwYWNlQmVsb3c7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKHBTdHlsZSkgewotICAgIEZYX0ZMT0FUIGZTdGFydCA9IDA7Ci0gICAgY29uc3QgRkRFX0NTU1JlY3QqIHBSZWN0ID0gcFN0eWxlLT5HZXRNYXJnaW5XaWR0aCgpOwotICAgIGlmIChwUmVjdCkKLSAgICAgIGZTdGFydCA9IHBSZWN0LT5sZWZ0LkdldFZhbHVlKCk7Ci0KLSAgICBGWF9GTE9BVCBmVGV4dEluZGVudCA9IHBTdHlsZS0+R2V0VGV4dEluZGVudCgpLkdldFZhbHVlKCk7Ci0gICAgaWYgKGZUZXh0SW5kZW50IDwgMCkKLSAgICAgIGZTdGFydCAtPSBmVGV4dEluZGVudDsKLQotICAgIG1fcEJyZWFrLT5TZXRMaW5lU3RhcnRQb3MoZlN0YXJ0KTsKLSAgfQotICBtX2lMaW5lcysrOwotfQotCi12b2lkIENYRkFfVGV4dExheW91dDo6UmVuZGVyU3RyaW5nKENGREVfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX0JydXNoKiBwQnJ1c2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfUGllY2VMaW5lKiBwUGllY2VMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQaWVjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiB0bURvYzJEZXZpY2UpIHsKLSAgY29uc3QgWEZBX1RleHRQaWVjZSogcFBpZWNlID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzW2lQaWVjZV0uZ2V0KCk7Ci0gIGludDMyX3QgaUNvdW50ID0gR2V0RGlzcGxheVBvcyhwUGllY2UsIHBDaGFyUG9zKTsKLSAgaWYgKGlDb3VudCA+IDApIHsKLSAgICBwQnJ1c2gtPlNldENvbG9yKHBQaWVjZS0+ZHdDb2xvcik7Ci0gICAgcERldmljZS0+RHJhd1N0cmluZyhwQnJ1c2gsIHBQaWVjZS0+cEZvbnQsIHBDaGFyUG9zLCBpQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBwUGllY2UtPmZGb250U2l6ZSwgJnRtRG9jMkRldmljZSk7Ci0gIH0KLSAgcFBpZWNlTGluZS0+bV9jaGFyQ291bnRzLkFkZChpQ291bnQpOwotfQotCi12b2lkIENYRkFfVGV4dExheW91dDo6UmVuZGVyUGF0aChDRkRFX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfUGVuKiBwUGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9QaWVjZUxpbmUqIHBQaWVjZUxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQaWVjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIHRtRG9jMkRldmljZSkgewotICBYRkFfVGV4dFBpZWNlKiBwUGllY2UgPSBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXNbaVBpZWNlXS5nZXQoKTsKLSAgYm9vbCBiTm9VbmRlcmxpbmUgPSBwUGllY2UtPmlVbmRlcmxpbmUgPCAxIHx8IHBQaWVjZS0+aVVuZGVybGluZSA+IDI7Ci0gIGJvb2wgYk5vTGluZVRocm91Z2ggPSBwUGllY2UtPmlMaW5lVGhyb3VnaCA8IDEgfHwgcFBpZWNlLT5pTGluZVRocm91Z2ggPiAyOwotICBpZiAoYk5vVW5kZXJsaW5lICYmIGJOb0xpbmVUaHJvdWdoKQotICAgIHJldHVybjsKLQotICBwUGVuLT5TZXRDb2xvcihwUGllY2UtPmR3Q29sb3IpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZERV9QYXRoPiBwUGF0aChuZXcgQ0ZERV9QYXRoKTsKLSAgaW50MzJfdCBpQ2hhcnMgPSBHZXREaXNwbGF5UG9zKHBQaWVjZSwgcENoYXJQb3MpOwotICBpZiAoaUNoYXJzID4gMCkgewotICAgIENGWF9Qb2ludEYgcHQxLCBwdDI7Ci0gICAgRlhfRkxPQVQgZkVuZFkgPSBwQ2hhclBvc1swXS5tX09yaWdpbi55ICsgMS4wNWY7Ci0gICAgaWYgKHBQaWVjZS0+aVBlcmlvZCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Xb3JkKSB7Ci0gICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwUGllY2UtPmlVbmRlcmxpbmU7IGkrKykgewotICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpQ2hhcnM7IGorKykgewotICAgICAgICAgIHB0MS54ID0gcENoYXJQb3Nbal0ubV9PcmlnaW4ueDsKLSAgICAgICAgICBwdDIueCA9Ci0gICAgICAgICAgICAgIHB0MS54ICsgcENoYXJQb3Nbal0ubV9Gb250Q2hhcldpZHRoICogcFBpZWNlLT5mRm9udFNpemUgLyAxMDAwLjBmOwotICAgICAgICAgIHB0MS55ID0gcHQyLnkgPSBmRW5kWTsKLSAgICAgICAgICBwUGF0aC0+QWRkTGluZShwdDEsIHB0Mik7Ci0gICAgICAgIH0KLSAgICAgICAgZkVuZFkgKz0gMi4wZjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcHQxLnggPSBwQ2hhclBvc1swXS5tX09yaWdpbi54OwotICAgICAgcHQyLnggPQotICAgICAgICAgIHBDaGFyUG9zW2lDaGFycyAtIDFdLm1fT3JpZ2luLnggKwotICAgICAgICAgIHBDaGFyUG9zW2lDaGFycyAtIDFdLm1fRm9udENoYXJXaWR0aCAqIHBQaWVjZS0+ZkZvbnRTaXplIC8gMTAwMC4wZjsKLSAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHBQaWVjZS0+aVVuZGVybGluZTsgaSsrKSB7Ci0gICAgICAgIHB0MS55ID0gcHQyLnkgPSBmRW5kWTsKLSAgICAgICAgcFBhdGgtPkFkZExpbmUocHQxLCBwdDIpOwotICAgICAgICBmRW5kWSArPSAyLjBmOwotICAgICAgfQotICAgIH0KLSAgICBmRW5kWSA9IHBDaGFyUG9zWzBdLm1fT3JpZ2luLnkgLSBwUGllY2UtPnJ0UGllY2UuaGVpZ2h0ICogMC4yNWY7Ci0gICAgcHQxLnggPSBwQ2hhclBvc1swXS5tX09yaWdpbi54OwotICAgIHB0Mi54ID0gcENoYXJQb3NbaUNoYXJzIC0gMV0ubV9PcmlnaW4ueCArCi0gICAgICAgICAgICBwQ2hhclBvc1tpQ2hhcnMgLSAxXS5tX0ZvbnRDaGFyV2lkdGggKiBwUGllY2UtPmZGb250U2l6ZSAvIDEwMDAuMGY7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcFBpZWNlLT5pTGluZVRocm91Z2g7IGkrKykgewotICAgICAgcHQxLnkgPSBwdDIueSA9IGZFbmRZOwotICAgICAgcFBhdGgtPkFkZExpbmUocHQxLCBwdDIpOwotICAgICAgZkVuZFkgKz0gMi4wZjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGJOb0xpbmVUaHJvdWdoICYmCi0gICAgICAgIChiTm9VbmRlcmxpbmUgfHwgcFBpZWNlLT5pUGVyaW9kICE9IFhGQV9BVFRSSUJVVEVFTlVNX0FsbCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50MzJfdCBpQ2hhcnNUbXAgPSAwOwotICAgIGludDMyX3QgaVBpZWNlUHJldiA9IGlQaWVjZSwgaVBpZWNlTmV4dCA9IGlQaWVjZTsKLSAgICB3aGlsZSAoaVBpZWNlUHJldiA+IDApIHsKLSAgICAgIGlQaWVjZVByZXYtLTsKLSAgICAgIGlDaGFyc1RtcCA9IHBQaWVjZUxpbmUtPm1fY2hhckNvdW50cy5HZXRBdChpUGllY2VQcmV2KTsKLSAgICAgIGlmIChpQ2hhcnNUbXAgPiAwKQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGlDaGFyc1RtcCA9PSAwKQotICAgICAgcmV0dXJuOwotCi0gICAgaUNoYXJzVG1wID0gMDsKLSAgICBpbnQzMl90IGlQaWVjZXMgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcyk7Ci0gICAgd2hpbGUgKGlQaWVjZU5leHQgPCBpUGllY2VzIC0gMSkgewotICAgICAgaVBpZWNlTmV4dCsrOwotICAgICAgaUNoYXJzVG1wID0gcFBpZWNlTGluZS0+bV9jaGFyQ291bnRzLkdldEF0KGlQaWVjZU5leHQpOwotICAgICAgaWYgKGlDaGFyc1RtcCA+IDApCi0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoaUNoYXJzVG1wID09IDApCi0gICAgICByZXR1cm47Ci0KLSAgICBGWF9GTE9BVCBmT3JnWCA9IDAuMGY7Ci0gICAgRlhfRkxPQVQgZkVuZFggPSAwLjBmOwotICAgIHBQaWVjZSA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlc1tpUGllY2VQcmV2XS5nZXQoKTsKLSAgICBpQ2hhcnMgPSBHZXREaXNwbGF5UG9zKHBQaWVjZSwgcENoYXJQb3MpOwotICAgIGlmIChpQ2hhcnMgPCAxKQotICAgICAgcmV0dXJuOwotCi0gICAgZk9yZ1ggPSBwQ2hhclBvc1tpQ2hhcnMgLSAxXS5tX09yaWdpbi54ICsKLSAgICAgICAgICAgIHBDaGFyUG9zW2lDaGFycyAtIDFdLm1fRm9udENoYXJXaWR0aCAqIHBQaWVjZS0+ZkZvbnRTaXplIC8gMTAwMC4wZjsKLSAgICBwUGllY2UgPSBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXNbaVBpZWNlTmV4dF0uZ2V0KCk7Ci0gICAgaUNoYXJzID0gR2V0RGlzcGxheVBvcyhwUGllY2UsIHBDaGFyUG9zKTsKLSAgICBpZiAoaUNoYXJzIDwgMSkKLSAgICAgIHJldHVybjsKLQotICAgIGZFbmRYID0gcENoYXJQb3NbMF0ubV9PcmlnaW4ueDsKLSAgICBDRlhfUG9pbnRGIHB0MTsKLSAgICBDRlhfUG9pbnRGIHB0MjsKLSAgICBwdDEueCA9IGZPcmdYOwotICAgIHB0Mi54ID0gZkVuZFg7Ci0gICAgRlhfRkxPQVQgZkVuZFkgPSBwQ2hhclBvc1swXS5tX09yaWdpbi55ICsgMS4wNWY7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcFBpZWNlLT5pVW5kZXJsaW5lOyBpKyspIHsKLSAgICAgIHB0MS55ID0gZkVuZFk7Ci0gICAgICBwdDIueSA9IGZFbmRZOwotICAgICAgcFBhdGgtPkFkZExpbmUocHQxLCBwdDIpOwotICAgICAgZkVuZFkgKz0gMi4wZjsKLSAgICB9Ci0gICAgZkVuZFkgPSBwQ2hhclBvc1swXS5tX09yaWdpbi55IC0gcFBpZWNlLT5ydFBpZWNlLmhlaWdodCAqIDAuMjVmOwotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHBQaWVjZS0+aUxpbmVUaHJvdWdoOyBpKyspIHsKLSAgICAgIHB0MS55ID0gZkVuZFk7Ci0gICAgICBwdDIueSA9IGZFbmRZOwotICAgICAgcFBhdGgtPkFkZExpbmUocHQxLCBwdDIpOwotICAgICAgZkVuZFkgKz0gMi4wZjsKLSAgICB9Ci0gIH0KLSAgcERldmljZS0+RHJhd1BhdGgocFBlbiwgMSwgcFBhdGguZ2V0KCksICZ0bURvYzJEZXZpY2UpOwotfQotCi1pbnQzMl90IENYRkFfVGV4dExheW91dDo6R2V0RGlzcGxheVBvcyhjb25zdCBYRkFfVGV4dFBpZWNlKiBwUGllY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJDaGFyQ29kZSkgewotICBpZiAoIXBQaWVjZSkKLSAgICByZXR1cm4gMDsKLQotICBGWF9SVEZURVhUT0JKIHRyOwotICBpZiAoIVRvUnVuKHBQaWVjZSwgJnRyKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIG1fcEJyZWFrLT5HZXREaXNwbGF5UG9zKCZ0ciwgcENoYXJQb3MsIGJDaGFyQ29kZSk7Ci19Ci0KLWJvb2wgQ1hGQV9UZXh0TGF5b3V0OjpUb1J1bihjb25zdCBYRkFfVGV4dFBpZWNlKiBwUGllY2UsIEZYX1JURlRFWFRPQkoqIHRyKSB7Ci0gIGludDMyX3QgaUxlbmd0aCA9IHBQaWVjZS0+aUNoYXJzOwotICBpZiAoaUxlbmd0aCA8IDEpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHRyLT5wU3RyID0gcFBpZWNlLT5zelRleHQ7Ci0gIHRyLT5wRm9udCA9IHBQaWVjZS0+cEZvbnQ7Ci0gIHRyLT5wUmVjdCA9ICZwUGllY2UtPnJ0UGllY2U7Ci0gIHRyLT5wV2lkdGhzID0gcFBpZWNlLT5XaWR0aHM7Ci0gIHRyLT5pTGVuZ3RoID0gaUxlbmd0aDsKLSAgdHItPmZGb250U2l6ZSA9IHBQaWVjZS0+ZkZvbnRTaXplOwotICB0ci0+aUJpZGlMZXZlbCA9IHBQaWVjZS0+aUJpZGlMZXZlbDsKLSAgdHItPndMaW5lQnJlYWtDaGFyID0gTCdcbic7Ci0gIHRyLT5pVmVydGljYWxTY2FsZSA9IHBQaWVjZS0+aVZlclNjYWxlOwotICB0ci0+aUhvcml6b250YWxTY2FsZSA9IHBQaWVjZS0+aUhvclNjYWxlOwotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2FwcC9jeGZhX3RleHRsYXlvdXQuaCBiL3hmYS9meGZhL2FwcC9jeGZhX3RleHRsYXlvdXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRkNjBjZi4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAvY3hmYV90ZXh0bGF5b3V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEZBX0FQUF9DWEZBX1RFWFRMQVlPVVRfSF8KLSNkZWZpbmUgWEZBX0ZYRkFfQVBQX0NYRkFfVEVYVExBWU9VVF9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9mZGVfY3NzLmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvbGF5b3V0L2ZnYXNfcnRmYnJlYWsuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAvY3hmYV90ZXh0cGFyc2VyLmgiCi0KLWNsYXNzIENGREVfQnJ1c2g7Ci1jbGFzcyBDRkRFX0NTU0NvbXB1dGVkU3R5bGU7Ci1jbGFzcyBDRkRFX1BlbjsKLWNsYXNzIENGREVfUmVuZGVyRGV2aWNlOwotY2xhc3MgQ0ZERV9YTUxOb2RlOwotY2xhc3MgQ0ZYX1JURkJyZWFrOwotY2xhc3MgQ1hGQV9Mb2FkZXJDb250ZXh0OwotY2xhc3MgQ1hGQV9MaW5rVXNlckRhdGE7Ci1jbGFzcyBDWEZBX05vZGU7Ci1jbGFzcyBDWEZBX1BpZWNlTGluZTsKLWNsYXNzIENYRkFfVGV4dFByb3ZpZGVyOwotY2xhc3MgQ1hGQV9UZXh0VGFic3RvcHNDb250ZXh0OwotY2xhc3MgWEZBX1RleHRQaWVjZTsKLQotY2xhc3MgQ1hGQV9UZXh0TGF5b3V0IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfVGV4dExheW91dChDWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlcik7Ci0gIH5DWEZBX1RleHRMYXlvdXQoKTsKLQotICBpbnQzMl90IEdldFRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7Ci0gIEZYX0ZMT0FUIEdldExheW91dEhlaWdodCgpOwotICBGWF9GTE9BVCBTdGFydExheW91dChGWF9GTE9BVCBmV2lkdGggPSAtMSk7Ci0gIGJvb2wgRG9MYXlvdXQoaW50MzJfdCBpQmxvY2tJbmRleCwKLSAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkNhbGNIZWlnaHQsCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQgZkNvbnRlbnRBcmVhSGVpZ2h0ID0gLTEsCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRleHRIZWlnaHQgPSAtMSk7Ci0KLSAgYm9vbCBDYWxjU2l6ZShjb25zdCBDRlhfU2l6ZUYmIG1pblNpemUsCi0gICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1NpemVGJiBtYXhTaXplLAotICAgICAgICAgICAgICAgIENGWF9TaXplRiYgZGVmYXVsdFNpemUpOwotICBib29sIExheW91dChjb25zdCBDRlhfU2l6ZUYmIHNpemUsIEZYX0ZMT0FUKiBmSGVpZ2h0ID0gbnVsbHB0cik7Ci0gIHZvaWQgSXRlbUJsb2Nrcyhjb25zdCBDRlhfUmVjdEYmIHJ0VGV4dCwgaW50MzJfdCBpQmxvY2tJbmRleCk7Ci0gIGJvb2wgRHJhd1N0cmluZyhDRlhfUmVuZGVyRGV2aWNlKiBwRnhEZXZpY2UsCi0gICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiB0bURvYzJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJsb2NrID0gMCk7Ci0gIGJvb2wgSXNMb2FkZWQoKSBjb25zdCB7IHJldHVybiAhbV9waWVjZUxpbmVzLmVtcHR5KCk7IH0KLSAgdm9pZCBVbmxvYWQoKTsKLSAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfUGllY2VMaW5lPj4qIEdldFBpZWNlTGluZXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuICZtX3BpZWNlTGluZXM7Ci0gIH0KLQotICBib29sIG1fYkhhc0Jsb2NrOwotICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiBtX0Jsb2NrczsKLQotIHByaXZhdGU6Ci0gIHZvaWQgR2V0VGV4dERhdGFOb2RlKCk7Ci0gIENGREVfWE1MTm9kZSogR2V0WE1MQ29udGFpbmVyTm9kZSgpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1JURkJyZWFrPiBDcmVhdGVCcmVhayhib29sIGJEZWZhdWx0KTsKLSAgdm9pZCBJbml0QnJlYWsoRlhfRkxPQVQgZkxpbmVXaWR0aCk7Ci0gIHZvaWQgSW5pdEJyZWFrKENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlLAotICAgICAgICAgICAgICAgICBGREVfQ1NTRGlzcGxheSBlRGlzcGxheSwKLSAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkxpbmVXaWR0aCwKLSAgICAgICAgICAgICAgICAgQ0ZERV9YTUxOb2RlKiBwWE1MTm9kZSwKLSAgICAgICAgICAgICAgICAgQ0ZERV9DU1NDb21wdXRlZFN0eWxlKiBwUGFyZW50U3R5bGUgPSBudWxscHRyKTsKLSAgYm9vbCBMb2FkZXIoY29uc3QgQ0ZYX1NpemVGJiBzelRleHQsCi0gICAgICAgICAgICAgIEZYX0ZMT0FUJiBmTGluZVBvcywKLSAgICAgICAgICAgICAgYm9vbCBiU2F2ZVBpZWNlcyA9IHRydWUpOwotICB2b2lkIExvYWRUZXh0KENYRkFfTm9kZSogcE5vZGUsCi0gICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1NpemVGJiBzelRleHQsCi0gICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZMaW5lUG9zLAotICAgICAgICAgICAgICAgIGJvb2wgYlNhdmVQaWVjZXMpOwotICBib29sIExvYWRSaWNoVGV4dChDRkRFX1hNTE5vZGUqIHBYTUxOb2RlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfU2l6ZUYmIHN6VGV4dCwKLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZMaW5lUG9zLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmV0YWluUHRyPENGREVfQ1NTQ29tcHV0ZWRTdHlsZT4mIHBQYXJlbnRTdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2F2ZVBpZWNlcywKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1JldGFpblB0cjxDWEZBX0xpbmtVc2VyRGF0YT4gcExpbmtEYXRhLAotICAgICAgICAgICAgICAgICAgICBib29sIGJFbmRCcmVhayA9IHRydWUsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgYklzT2wgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGlDb3VudCA9IDApOwotICBib29sIEFwcGVuZENoYXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwKLSAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmTGluZVBvcywKLSAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTcGFjZUFib3ZlLAotICAgICAgICAgICAgICAgICAgYm9vbCBiU2F2ZVBpZWNlcyk7Ci0gIHZvaWQgQXBwZW5kVGV4dExpbmUoQ0ZYX1JURkJyZWFrVHlwZSBkd1N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkxpbmVQb3MsCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2F2ZVBpZWNlcywKLSAgICAgICAgICAgICAgICAgICAgICBib29sIGJFbmRCcmVhayA9IGZhbHNlKTsKLSAgdm9pZCBFbmRCcmVhayhDRlhfUlRGQnJlYWtUeXBlIGR3U3RhdHVzLCBGWF9GTE9BVCYgZkxpbmVQb3MsIGJvb2wgYkRlZmF1bHQpOwotICBib29sIElzRW5kKGJvb2wgYlNhdmVQaWVjZXMpOwotICB2b2lkIFByb2Nlc3NUZXh0KENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOwotICB2b2lkIFVwZGF0ZUFsaWduKEZYX0ZMT0FUIGZIZWlnaHQsIEZYX0ZMT0FUIGZCb3R0b20pOwotICB2b2lkIFJlbmRlclN0cmluZyhDRkRFX1JlbmRlckRldmljZSogcERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZERV9CcnVzaCogcEJydXNoLAotICAgICAgICAgICAgICAgICAgICBDWEZBX1BpZWNlTGluZSogcFBpZWNlTGluZSwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUGllY2UsCi0gICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgdG1Eb2MyRGV2aWNlKTsKLSAgdm9pZCBSZW5kZXJQYXRoKENGREVfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAotICAgICAgICAgICAgICAgICAgQ0ZERV9QZW4qIHBQZW4sCi0gICAgICAgICAgICAgICAgICBDWEZBX1BpZWNlTGluZSogcFBpZWNlTGluZSwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBpZWNlLAotICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAotICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgdG1Eb2MyRGV2aWNlKTsKLSAgaW50MzJfdCBHZXREaXNwbGF5UG9zKGNvbnN0IFhGQV9UZXh0UGllY2UqIHBQaWVjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNoYXJDb2RlID0gZmFsc2UpOwotICBib29sIFRvUnVuKGNvbnN0IFhGQV9UZXh0UGllY2UqIHBQaWVjZSwgRlhfUlRGVEVYVE9CSiogdHIpOwotICB2b2lkIERvVGFic3RvcHMoQ0ZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUsIENYRkFfUGllY2VMaW5lKiBwUGllY2VMaW5lKTsKLSAgYm9vbCBMYXlvdXQoaW50MzJfdCBpQmxvY2spOwotICBpbnQzMl90IENvdW50QmxvY2tzKCkgY29uc3Q7Ci0KLSAgQ1hGQV9UZXh0UHJvdmlkZXIqIG1fcFRleHRQcm92aWRlcjsKLSAgQ1hGQV9Ob2RlKiBtX3BUZXh0RGF0YU5vZGU7Ci0gIGJvb2wgbV9iUmljaFRleHQ7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfUlRGQnJlYWs+IG1fcEJyZWFrOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9Mb2FkZXJDb250ZXh0PiBtX3BMb2FkZXI7Ci0gIGludDMyX3QgbV9pTGluZXM7Ci0gIEZYX0ZMT0FUIG1fZk1heFdpZHRoOwotICBDWEZBX1RleHRQYXJzZXIgbV90ZXh0UGFyc2VyOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9QaWVjZUxpbmU+PiBtX3BpZWNlTGluZXM7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX1RleHRUYWJzdG9wc0NvbnRleHQ+IG1fcFRhYnN0b3BDb250ZXh0OwotICBib29sIG1fYkJsb2NrQ29udGludWU7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEZBX0FQUF9DWEZBX1RFWFRMQVlPVVRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2FwcC9jeGZhX3RleHRwYXJzZWNvbnRleHQuY3BwIGIveGZhL2Z4ZmEvYXBwL2N4ZmFfdGV4dHBhcnNlY29udGV4dC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MWQ4NDQuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvYXBwL2N4ZmFfdGV4dHBhcnNlY29udGV4dC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAvY3hmYV90ZXh0cGFyc2Vjb250ZXh0LmgiCi0KLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc2NvbXB1dGVkc3R5bGUuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc2RlY2xhcmF0aW9uLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NzdHlsZXNlbGVjdG9yLmgiCi0KLUNYRkFfVGV4dFBhcnNlQ29udGV4dDo6Q1hGQV9UZXh0UGFyc2VDb250ZXh0KCkKLSAgICA6IG1fcFBhcmVudFN0eWxlKG51bGxwdHIpLAotICAgICAgbV9lRGlzcGxheShGREVfQ1NTRGlzcGxheTo6Tm9uZSkge30KLQotQ1hGQV9UZXh0UGFyc2VDb250ZXh0Ojp+Q1hGQV9UZXh0UGFyc2VDb250ZXh0KCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2FwcC9jeGZhX3RleHRwYXJzZWNvbnRleHQuaCBiL3hmYS9meGZhL2FwcC9jeGZhX3RleHRwYXJzZWNvbnRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVhNjhlOS4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAvY3hmYV90ZXh0cGFyc2Vjb250ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYRkFfQVBQX0NYRkFfVEVYVFBBUlNFQ09OVEVYVF9IXwotI2RlZmluZSBYRkFfRlhGQV9BUFBfQ1hGQV9URVhUUEFSU0VDT05URVhUX0hfCi0KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2Nzcy9jZmRlX2Nzc2RlY2xhcmF0aW9uLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvZmRlX2Nzcy5oIgotCi1jbGFzcyBDRkRFX0NTU0NvbXB1dGVkU3R5bGU7Ci0KLWNsYXNzIENYRkFfVGV4dFBhcnNlQ29udGV4dCB7Ci0gcHVibGljOgotICBDWEZBX1RleHRQYXJzZUNvbnRleHQoKTsKLSAgfkNYRkFfVGV4dFBhcnNlQ29udGV4dCgpOwotCi0gIHZvaWQgU2V0RGlzcGxheShGREVfQ1NTRGlzcGxheSBlRGlzcGxheSkgeyBtX2VEaXNwbGF5ID0gZURpc3BsYXk7IH0KLSAgRkRFX0NTU0Rpc3BsYXkgR2V0RGlzcGxheSgpIGNvbnN0IHsgcmV0dXJuIG1fZURpc3BsYXk7IH0KLQotICB2b2lkIFNldERlY2xzKHN0ZDo6dmVjdG9yPGNvbnN0IENGREVfQ1NTRGVjbGFyYXRpb24qPiYmIGRlY2wpIHsKLSAgICBkZWNsc18gPSBzdGQ6Om1vdmUoZGVjbCk7Ci0gIH0KLSAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgQ0ZERV9DU1NEZWNsYXJhdGlvbio+JiBHZXREZWNscygpIHsgcmV0dXJuIGRlY2xzXzsgfQotCi0gIENGWF9SZXRhaW5QdHI8Q0ZERV9DU1NDb21wdXRlZFN0eWxlPiBtX3BQYXJlbnRTdHlsZTsKLQotIHByb3RlY3RlZDoKLSAgc3RkOjp2ZWN0b3I8Y29uc3QgQ0ZERV9DU1NEZWNsYXJhdGlvbio+IGRlY2xzXzsKLSAgRkRFX0NTU0Rpc3BsYXkgbV9lRGlzcGxheTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYRkFfQVBQX0NYRkFfVEVYVFBBUlNFQ09OVEVYVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL2N4ZmFfdGV4dHBhcnNlci5jcHAgYi94ZmEvZnhmYS9hcHAvY3hmYV90ZXh0cGFyc2VyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc1OWNiMi4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAvY3hmYV90ZXh0cGFyc2VyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY0MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAvY3hmYV90ZXh0cGFyc2VyLmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3Njb21wdXRlZHN0eWxlLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NzdHlsZXNlbGVjdG9yLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvY2ZkZV9jc3NzdHlsZXNoZWV0LmgiCi0jaW5jbHVkZSAieGZhL2ZkZS9jc3MvZmRlX2Nzcy5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2NydC9mZ2FzX2NvZGVwYWdlLmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9jZmdhc19mb250bWdyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL2N4ZmFfY3NzdGFncHJvdmlkZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAvY3hmYV90ZXh0cGFyc2Vjb250ZXh0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL2N4ZmFfdGV4dHRhYnN0b3BzY29udGV4dC5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZ3aWRnZXRhY2MuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWFzdXJlbWVudC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmFwcC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmRvYy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mb250bWdyLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLWVudW0gY2xhc3MgVGFiU3RvcFN0YXR1cyB7Ci0gIEVycm9yLAotICBFT1MsCi0gIE5vbmUsCi0gIEFsaWdubWVudCwKLSAgU3RhcnRMZWFkZXIsCi0gIExlYWRlciwKLSAgTG9jYXRpb24sCi19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotQ1hGQV9UZXh0UGFyc2VyOjpDWEZBX1RleHRQYXJzZXIoKQotICAgIDogbV9iUGFyc2VkKGZhbHNlKSwgbV9jc3NJbml0aWFsaXplZChmYWxzZSkge30KLQotQ1hGQV9UZXh0UGFyc2VyOjp+Q1hGQV9UZXh0UGFyc2VyKCkgewotICBmb3IgKGF1dG8mIHBhaXIgOiBtX21hcFhNTE5vZGVUb1BhcnNlQ29udGV4dCkgewotICAgIGlmIChwYWlyLnNlY29uZCkKLSAgICAgIGRlbGV0ZSBwYWlyLnNlY29uZDsKLSAgfQotfQotCi12b2lkIENYRkFfVGV4dFBhcnNlcjo6UmVzZXQoKSB7Ci0gIGZvciAoYXV0byYgcGFpciA6IG1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0KSB7Ci0gICAgaWYgKHBhaXIuc2Vjb25kKQotICAgICAgZGVsZXRlIHBhaXIuc2Vjb25kOwotICB9Ci0gIG1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LmNsZWFyKCk7Ci0gIG1fYlBhcnNlZCA9IGZhbHNlOwotfQotdm9pZCBDWEZBX1RleHRQYXJzZXI6OkluaXRDU1NEYXRhKENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyKSB7Ci0gIGlmICghcFRleHRQcm92aWRlcikKLSAgICByZXR1cm47Ci0KLSAgaWYgKCFtX3BTZWxlY3RvcikgewotICAgIENYRkFfRkZEb2MqIHBEb2MgPSBwVGV4dFByb3ZpZGVyLT5HZXREb2NOb2RlKCk7Ci0gICAgQ0ZHQVNfRm9udE1nciogcEZvbnRNZ3IgPSBwRG9jLT5HZXRBcHAoKS0+R2V0RkRFRm9udE1ncigpOwotICAgIEFTU0VSVChwRm9udE1ncik7Ci0gICAgbV9wU2VsZWN0b3IgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZERV9DU1NTdHlsZVNlbGVjdG9yPihwRm9udE1ncik7Ci0gICAgRlhfRkxPQVQgZkZvbnRTaXplID0gMTA7Ci0gICAgQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpOwotICAgIGlmIChmb250KSB7Ci0gICAgICBmRm9udFNpemUgPSBmb250LkdldEZvbnRTaXplKCk7Ci0gICAgfQotICAgIG1fcFNlbGVjdG9yLT5TZXREZWZGb250U2l6ZShmRm9udFNpemUpOwotICB9Ci0KLSAgaWYgKG1fY3NzSW5pdGlhbGl6ZWQpCi0gICAgcmV0dXJuOwotCi0gIG1fY3NzSW5pdGlhbGl6ZWQgPSB0cnVlOwotICBhdXRvIHVhU2hlZXQgPSBMb2FkRGVmYXVsdFNoZWV0U3R5bGUoKTsKLSAgbV9wU2VsZWN0b3ItPlNldFVBU3R5bGVTaGVldChzdGQ6Om1vdmUodWFTaGVldCkpOwotICBtX3BTZWxlY3Rvci0+VXBkYXRlU3R5bGVJbmRleCgpOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8Q0ZERV9DU1NTdHlsZVNoZWV0PiBDWEZBX1RleHRQYXJzZXI6OkxvYWREZWZhdWx0U2hlZXRTdHlsZSgpIHsKLSAgc3RhdGljIGNvbnN0IEZYX1dDSEFSIHNfcFN0eWxlW10gPQotICAgICAgTCJodG1sLGJvZHksb2wscCx1bHtkaXNwbGF5OmJsb2NrfSIKLSAgICAgIEwibGl7ZGlzcGxheTpsaXN0LWl0ZW19IgotICAgICAgTCJvbCx1bHtwYWRkaW5nLWxlZnQ6MzNweDttYXJnaW46MS4xMmVtIDB9IgotICAgICAgTCJvbHtsaXN0LXN0eWxlLXR5cGU6ZGVjaW1hbH0iCi0gICAgICBMImF7Y29sb3I6IzAwMDBmZjt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfSIKLSAgICAgIEwiYntmb250LXdlaWdodDpib2xkZXJ9IgotICAgICAgTCJpe2ZvbnQtc3R5bGU6aXRhbGljfSIKLSAgICAgIEwic3Vwe3ZlcnRpY2FsLWFsaWduOisxNWVtO2ZvbnQtc2l6ZTouNjZlbX0iCi0gICAgICBMInN1Ynt2ZXJ0aWNhbC1hbGlnbjotMTVlbTtmb250LXNpemU6LjY2ZW19IjsKLQotICBhdXRvIHNoZWV0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGREVfQ1NTU3R5bGVTaGVldD4oKTsKLSAgcmV0dXJuIHNoZWV0LT5Mb2FkQnVmZmVyKHNfcFN0eWxlLCBGWFNZU193Y3NsZW4oc19wU3R5bGUpKSA/IHN0ZDo6bW92ZShzaGVldCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHI7Ci19Ci0KLUNGWF9SZXRhaW5QdHI8Q0ZERV9DU1NDb21wdXRlZFN0eWxlPiBDWEZBX1RleHRQYXJzZXI6OkNyZWF0ZVJvb3RTdHlsZSgKLSAgICBDWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlcikgewotICBDWEZBX0ZvbnQgZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnROb2RlKCk7Ci0gIENYRkFfUGFyYSBwYXJhID0gcFRleHRQcm92aWRlci0+R2V0UGFyYU5vZGUoKTsKLSAgYXV0byBwU3R5bGUgPSBtX3BTZWxlY3Rvci0+Q3JlYXRlQ29tcHV0ZWRTdHlsZShudWxscHRyKTsKLSAgRlhfRkxPQVQgZkxpbmVIZWlnaHQgPSAwOwotICBGWF9GTE9BVCBmRm9udFNpemUgPSAxMDsKLQotICBpZiAocGFyYSkgewotICAgIGZMaW5lSGVpZ2h0ID0gcGFyYS5HZXRMaW5lSGVpZ2h0KCk7Ci0gICAgRkRFX0NTU0xlbmd0aCBpbmRlbnQ7Ci0gICAgaW5kZW50LlNldChGREVfQ1NTTGVuZ3RoVW5pdDo6UG9pbnQsIHBhcmEuR2V0VGV4dEluZGVudCgpKTsKLSAgICBwU3R5bGUtPlNldFRleHRJbmRlbnQoaW5kZW50KTsKLSAgICBGREVfQ1NTVGV4dEFsaWduIGhBbGlnbiA9IEZERV9DU1NUZXh0QWxpZ246OkxlZnQ7Ci0gICAgc3dpdGNoIChwYXJhLkdldEhvcml6b250YWxBbGlnbigpKSB7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlcjoKLSAgICAgICAgaEFsaWduID0gRkRFX0NTU1RleHRBbGlnbjo6Q2VudGVyOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ6Ci0gICAgICAgIGhBbGlnbiA9IEZERV9DU1NUZXh0QWxpZ246OlJpZ2h0OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeToKLSAgICAgICAgaEFsaWduID0gRkRFX0NTU1RleHRBbGlnbjo6SnVzdGlmeTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnlBbGw6Ci0gICAgICAgIGhBbGlnbiA9IEZERV9DU1NUZXh0QWxpZ246Okp1c3RpZnlBbGw7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBwU3R5bGUtPlNldFRleHRBbGlnbihoQWxpZ24pOwotICAgIEZERV9DU1NSZWN0IHJ0TWFyZ2luV2lkdGg7Ci0gICAgcnRNYXJnaW5XaWR0aC5sZWZ0LlNldChGREVfQ1NTTGVuZ3RoVW5pdDo6UG9pbnQsIHBhcmEuR2V0TWFyZ2luTGVmdCgpKTsKLSAgICBydE1hcmdpbldpZHRoLnRvcC5TZXQoRkRFX0NTU0xlbmd0aFVuaXQ6OlBvaW50LCBwYXJhLkdldFNwYWNlQWJvdmUoKSk7Ci0gICAgcnRNYXJnaW5XaWR0aC5yaWdodC5TZXQoRkRFX0NTU0xlbmd0aFVuaXQ6OlBvaW50LCBwYXJhLkdldE1hcmdpblJpZ2h0KCkpOwotICAgIHJ0TWFyZ2luV2lkdGguYm90dG9tLlNldChGREVfQ1NTTGVuZ3RoVW5pdDo6UG9pbnQsIHBhcmEuR2V0U3BhY2VCZWxvdygpKTsKLSAgICBwU3R5bGUtPlNldE1hcmdpbldpZHRoKHJ0TWFyZ2luV2lkdGgpOwotICB9Ci0KLSAgaWYgKGZvbnQpIHsKLSAgICBwU3R5bGUtPlNldENvbG9yKGZvbnQuR2V0Q29sb3IoKSk7Ci0gICAgcFN0eWxlLT5TZXRGb250U3R5bGUoZm9udC5Jc0l0YWxpYygpID8gRkRFX0NTU0ZvbnRTdHlsZTo6SXRhbGljCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRkRFX0NTU0ZvbnRTdHlsZTo6Tm9ybWFsKTsKLSAgICBwU3R5bGUtPlNldEZvbnRXZWlnaHQoZm9udC5Jc0JvbGQoKSA/IEZYRk9OVF9GV19CT0xEIDogRlhGT05UX0ZXX05PUk1BTCk7Ci0gICAgcFN0eWxlLT5TZXROdW1iZXJWZXJ0aWNhbEFsaWduKC1mb250LkdldEJhc2VsaW5lU2hpZnQoKSk7Ci0gICAgZkZvbnRTaXplID0gZm9udC5HZXRGb250U2l6ZSgpOwotICAgIEZERV9DU1NMZW5ndGggbGV0dGVyU3BhY2luZzsKLSAgICBsZXR0ZXJTcGFjaW5nLlNldChGREVfQ1NTTGVuZ3RoVW5pdDo6UG9pbnQsIGZvbnQuR2V0TGV0dGVyU3BhY2luZygpKTsKLSAgICBwU3R5bGUtPlNldExldHRlclNwYWNpbmcobGV0dGVyU3BhY2luZyk7Ci0gICAgdWludDMyX3QgZHdEZWNvcmF0aW9uID0gMDsKLSAgICBpZiAoZm9udC5HZXRMaW5lVGhyb3VnaCgpID4gMCkKLSAgICAgIGR3RGVjb3JhdGlvbiB8PSBGREVfQ1NTVEVYVERFQ09SQVRJT05fTGluZVRocm91Z2g7Ci0gICAgaWYgKGZvbnQuR2V0VW5kZXJsaW5lKCkgPiAxKQotICAgICAgZHdEZWNvcmF0aW9uIHw9IEZERV9DU1NURVhUREVDT1JBVElPTl9Eb3VibGU7Ci0gICAgZWxzZSBpZiAoZm9udC5HZXRVbmRlcmxpbmUoKSA+IDApCi0gICAgICBkd0RlY29yYXRpb24gfD0gRkRFX0NTU1RFWFRERUNPUkFUSU9OX1VuZGVybGluZTsKLQotICAgIHBTdHlsZS0+U2V0VGV4dERlY29yYXRpb24oZHdEZWNvcmF0aW9uKTsKLSAgfQotICBwU3R5bGUtPlNldExpbmVIZWlnaHQoZkxpbmVIZWlnaHQpOwotICBwU3R5bGUtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7Ci0gIHJldHVybiBwU3R5bGU7Ci19Ci0KLUNGWF9SZXRhaW5QdHI8Q0ZERV9DU1NDb21wdXRlZFN0eWxlPiBDWEZBX1RleHRQYXJzZXI6OkNyZWF0ZVN0eWxlKAotICAgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFBhcmVudFN0eWxlKSB7Ci0gIGF1dG8gcE5ld1N0eWxlID0gbV9wU2VsZWN0b3ItPkNyZWF0ZUNvbXB1dGVkU3R5bGUocFBhcmVudFN0eWxlKTsKLSAgQVNTRVJUKHBOZXdTdHlsZSk7Ci0gIGlmICghcFBhcmVudFN0eWxlKQotICAgIHJldHVybiBwTmV3U3R5bGU7Ci0KLSAgdWludDMyX3QgZHdEZWNvcmF0aW9uID0gcFBhcmVudFN0eWxlLT5HZXRUZXh0RGVjb3JhdGlvbigpOwotICBGWF9GTE9BVCBmQmFzZUxpbmUgPSAwOwotICBpZiAocFBhcmVudFN0eWxlLT5HZXRWZXJ0aWNhbEFsaWduKCkgPT0gRkRFX0NTU1ZlcnRpY2FsQWxpZ246Ok51bWJlcikKLSAgICBmQmFzZUxpbmUgPSBwUGFyZW50U3R5bGUtPkdldE51bWJlclZlcnRpY2FsQWxpZ24oKTsKLQotICBwTmV3U3R5bGUtPlNldFRleHREZWNvcmF0aW9uKGR3RGVjb3JhdGlvbik7Ci0gIHBOZXdTdHlsZS0+U2V0TnVtYmVyVmVydGljYWxBbGlnbihmQmFzZUxpbmUpOwotCi0gIGNvbnN0IEZERV9DU1NSZWN0KiBwUmVjdCA9IHBQYXJlbnRTdHlsZS0+R2V0TWFyZ2luV2lkdGgoKTsKLSAgaWYgKHBSZWN0KQotICAgIHBOZXdTdHlsZS0+U2V0TWFyZ2luV2lkdGgoKnBSZWN0KTsKLSAgcmV0dXJuIHBOZXdTdHlsZTsKLX0KLQotQ0ZYX1JldGFpblB0cjxDRkRFX0NTU0NvbXB1dGVkU3R5bGU+IENYRkFfVGV4dFBhcnNlcjo6Q29tcHV0ZVN0eWxlKAotICAgIENGREVfWE1MTm9kZSogcFhNTE5vZGUsCi0gICAgQ0ZERV9DU1NDb21wdXRlZFN0eWxlKiBwUGFyZW50U3R5bGUpIHsKLSAgYXV0byBpdCA9IG1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LmZpbmQocFhNTE5vZGUpOwotICBpZiAoaXQgPT0gbV9tYXBYTUxOb2RlVG9QYXJzZUNvbnRleHQuZW5kKCkpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgQ1hGQV9UZXh0UGFyc2VDb250ZXh0KiBwQ29udGV4dCA9IGl0LT5zZWNvbmQ7Ci0gIGlmICghcENvbnRleHQpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgcENvbnRleHQtPm1fcFBhcmVudFN0eWxlLlJlc2V0KHBQYXJlbnRTdHlsZSk7Ci0KLSAgYXV0byB0YWdQcm92aWRlciA9IFBhcnNlVGFnSW5mbyhwWE1MTm9kZSk7Ci0gIGlmICh0YWdQcm92aWRlci0+bV9iQ29udGVudCkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBhdXRvIHBTdHlsZSA9IENyZWF0ZVN0eWxlKHBQYXJlbnRTdHlsZSk7Ci0gIG1fcFNlbGVjdG9yLT5Db21wdXRlU3R5bGUocENvbnRleHQtPkdldERlY2xzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvdmlkZXItPkdldEF0dHJpYnV0ZShMInN0eWxlIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvdmlkZXItPkdldEF0dHJpYnV0ZShMImFsaWduIiksIHBTdHlsZS5HZXQoKSk7Ci0gIHJldHVybiBwU3R5bGU7Ci19Ci0KLXZvaWQgQ1hGQV9UZXh0UGFyc2VyOjpEb1BhcnNlKENGREVfWE1MTm9kZSogcFhNTENvbnRhaW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyKSB7Ci0gIGlmICghcFhNTENvbnRhaW5lciB8fCAhcFRleHRQcm92aWRlciB8fCBtX2JQYXJzZWQpCi0gICAgcmV0dXJuOwotCi0gIG1fYlBhcnNlZCA9IHRydWU7Ci0gIEluaXRDU1NEYXRhKHBUZXh0UHJvdmlkZXIpOwotICBhdXRvIHBSb290U3R5bGUgPSBDcmVhdGVSb290U3R5bGUocFRleHRQcm92aWRlcik7Ci0gIFBhcnNlUmljaFRleHQocFhNTENvbnRhaW5lciwgcFJvb3RTdHlsZS5HZXQoKSk7Ci19Ci0KLXZvaWQgQ1hGQV9UZXh0UGFyc2VyOjpQYXJzZVJpY2hUZXh0KENGREVfWE1MTm9kZSogcFhNTE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBQYXJlbnRTdHlsZSkgewotICBpZiAoIXBYTUxOb2RlKQotICAgIHJldHVybjsKLQotICBhdXRvIHRhZ1Byb3ZpZGVyID0gUGFyc2VUYWdJbmZvKHBYTUxOb2RlKTsKLSAgaWYgKCF0YWdQcm92aWRlci0+bV9iVGFnQXZhaWxhYmxlKQotICAgIHJldHVybjsKLQotICBDRlhfUmV0YWluUHRyPENGREVfQ1NTQ29tcHV0ZWRTdHlsZT4gcE5ld1N0eWxlOwotICBpZiAoKHRhZ1Byb3ZpZGVyLT5HZXRUYWdOYW1lKCkgIT0gTCJib2R5IikgfHwKLSAgICAgICh0YWdQcm92aWRlci0+R2V0VGFnTmFtZSgpICE9IEwiaHRtbCIpKSB7Ci0gICAgQ1hGQV9UZXh0UGFyc2VDb250ZXh0KiBwVGV4dENvbnRleHQgPSBuZXcgQ1hGQV9UZXh0UGFyc2VDb250ZXh0OwotICAgIEZERV9DU1NEaXNwbGF5IGVEaXNwbGF5ID0gRkRFX0NTU0Rpc3BsYXk6OklubGluZTsKLSAgICBpZiAoIXRhZ1Byb3ZpZGVyLT5tX2JDb250ZW50KSB7Ci0gICAgICBhdXRvIGRlY2xBcnJheSA9Ci0gICAgICAgICAgbV9wU2VsZWN0b3ItPk1hdGNoRGVjbGFyYXRpb25zKHRhZ1Byb3ZpZGVyLT5HZXRUYWdOYW1lKCkpOwotICAgICAgcE5ld1N0eWxlID0gQ3JlYXRlU3R5bGUocFBhcmVudFN0eWxlKTsKLSAgICAgIG1fcFNlbGVjdG9yLT5Db21wdXRlU3R5bGUoZGVjbEFycmF5LCB0YWdQcm92aWRlci0+R2V0QXR0cmlidXRlKEwic3R5bGUiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvdmlkZXItPkdldEF0dHJpYnV0ZShMImFsaWduIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOZXdTdHlsZS5HZXQoKSk7Ci0KLSAgICAgIGlmICghZGVjbEFycmF5LmVtcHR5KCkpCi0gICAgICAgIHBUZXh0Q29udGV4dC0+U2V0RGVjbHMoc3RkOjptb3ZlKGRlY2xBcnJheSkpOwotCi0gICAgICBlRGlzcGxheSA9IHBOZXdTdHlsZS0+R2V0RGlzcGxheSgpOwotICAgIH0KLSAgICBwVGV4dENvbnRleHQtPlNldERpc3BsYXkoZURpc3BsYXkpOwotICAgIG1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0W3BYTUxOb2RlXSA9IHBUZXh0Q29udGV4dDsKLSAgfQotCi0gIGZvciAoQ0ZERV9YTUxOb2RlKiBwWE1MQ2hpbGQgPQotICAgICAgICAgICBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsKLSAgICAgICBwWE1MQ2hpbGQ7Ci0gICAgICAgcFhNTENoaWxkID0gcFhNTENoaWxkLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgewotICAgIFBhcnNlUmljaFRleHQocFhNTENoaWxkLCBwTmV3U3R5bGUuR2V0KCkpOwotICB9Ci19Ci0KLWJvb2wgQ1hGQV9UZXh0UGFyc2VyOjpUYWdWYWxpZGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NOYW1lKSBjb25zdCB7Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBzX1hGQVRhZ05hbWVbXSA9IHsKLSAgICAgIDB4NjEsICAgICAgICAvLyBhCi0gICAgICAweDYyLCAgICAgICAgLy8gYgotICAgICAgMHg2OSwgICAgICAgIC8vIGkKLSAgICAgIDB4NzAsICAgICAgICAvLyBwCi0gICAgICAweDAwMDFmNzE0LCAgLy8gYnIKLSAgICAgIDB4MDAwMjJhNTUsICAvLyBsaQotICAgICAgMHgwMDAyMzliYiwgIC8vIG9sCi0gICAgICAweDAwMDI1ODgxLCAgLy8gdWwKLSAgICAgIDB4MGJkMzdmYWEsICAvLyBzdWIKLSAgICAgIDB4MGJkMzdmYjgsICAvLyBzdXAKLSAgICAgIDB4YTczZTNhZjIsICAvLyBzcGFuCi0gICAgICAweGIxODJlYWFlLCAgLy8gYm9keQotICAgICAgMHhkYjhhYzQ1NSwgIC8vIGh0bWwKLSAgfTsKLSAgc3RhdGljIGNvbnN0IGludDMyX3Qgc19pQ291bnQgPSBGWF9BcnJheVNpemUoc19YRkFUYWdOYW1lKTsKLQotICByZXR1cm4gc3RkOjpiaW5hcnlfc2VhcmNoKHNfWEZBVGFnTmFtZSwgc19YRkFUYWdOYW1lICsgc19pQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSGFzaENvZGVfR2V0Vyh3c05hbWUuQXNTdHJpbmdDKCksIHRydWUpKTsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPENYRkFfQ1NTVGFnUHJvdmlkZXI+IENYRkFfVGV4dFBhcnNlcjo6UGFyc2VUYWdJbmZvKAotICAgIENGREVfWE1MTm9kZSogcFhNTE5vZGUpIHsKLSAgYXV0byB0YWdQcm92aWRlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0NTU1RhZ1Byb3ZpZGVyPigpOwotCi0gIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsKLSAgaWYgKHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgewotICAgIENGREVfWE1MRWxlbWVudCogcFhNTEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwWE1MTm9kZSk7Ci0gICAgcFhNTEVsZW1lbnQtPkdldExvY2FsVGFnTmFtZSh3c05hbWUpOwotICAgIHRhZ1Byb3ZpZGVyLT5TZXRUYWdOYW1lKHdzTmFtZSk7Ci0gICAgdGFnUHJvdmlkZXItPm1fYlRhZ0F2YWlsYWJsZSA9IFRhZ1ZhbGlkYXRlKHdzTmFtZSk7Ci0KLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOwotICAgIHBYTUxFbGVtZW50LT5HZXRTdHJpbmcoTCJzdHlsZSIsIHdzVmFsdWUpOwotICAgIGlmICghd3NWYWx1ZS5Jc0VtcHR5KCkpCi0gICAgICB0YWdQcm92aWRlci0+U2V0QXR0cmlidXRlKEwic3R5bGUiLCB3c1ZhbHVlKTsKLSAgfSBlbHNlIGlmIChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX1RleHQpIHsKLSAgICB0YWdQcm92aWRlci0+bV9iVGFnQXZhaWxhYmxlID0gdHJ1ZTsKLSAgICB0YWdQcm92aWRlci0+bV9iQ29udGVudCA9IHRydWU7Ci0gIH0KLSAgcmV0dXJuIHRhZ1Byb3ZpZGVyOwotfQotCi1pbnQzMl90IENYRkFfVGV4dFBhcnNlcjo6R2V0VkFsaWduKENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyKSBjb25zdCB7Ci0gIENYRkFfUGFyYSBwYXJhID0gcFRleHRQcm92aWRlci0+R2V0UGFyYU5vZGUoKTsKLSAgcmV0dXJuIHBhcmEgPyBwYXJhLkdldFZlcnRpY2FsQWxpZ24oKSA6IFhGQV9BVFRSSUJVVEVFTlVNX1RvcDsKLX0KLQotRlhfRkxPQVQgQ1hGQV9UZXh0UGFyc2VyOjpHZXRUYWJJbnRlcnZhbChDRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3QgewotICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOwotICBpZiAocFN0eWxlICYmIHBTdHlsZS0+R2V0Q3VzdG9tU3R5bGUoTCJ0YWItaW50ZXJ2YWwiLCB3c1ZhbHVlKSkKLSAgICByZXR1cm4gQ1hGQV9NZWFzdXJlbWVudCh3c1ZhbHVlLkFzU3RyaW5nQygpKS5Ub1VuaXQoWEZBX1VOSVRfUHQpOwotICByZXR1cm4gMzY7Ci19Ci0KLWludDMyX3QgQ1hGQV9UZXh0UGFyc2VyOjpDb3VudFRhYnMoQ0ZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUpIGNvbnN0IHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsKLSAgaWYgKHBTdHlsZSAmJiBwU3R5bGUtPkdldEN1c3RvbVN0eWxlKEwieGZhLXRhYi1jb3VudCIsIHdzVmFsdWUpKQotICAgIHJldHVybiB3c1ZhbHVlLkdldEludGVnZXIoKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWJvb2wgQ1hGQV9UZXh0UGFyc2VyOjpJc1NwYWNlUnVuKENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdCB7Ci0gIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7Ci0gIGlmIChwU3R5bGUgJiYgcFN0eWxlLT5HZXRDdXN0b21TdHlsZShMInhmYS1zcGFjZXJ1biIsIHdzVmFsdWUpKSB7Ci0gICAgd3NWYWx1ZS5NYWtlTG93ZXIoKTsKLSAgICByZXR1cm4gd3NWYWx1ZSA9PSBMInllcyI7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1DRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gQ1hGQV9UZXh0UGFyc2VyOjpHZXRGb250KAotICAgIENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLAotICAgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdCB7Ci0gIENGWF9XaWRlU3RyaW5nQyB3c0ZhbWlseSA9IEwiQ291cmllciI7Ci0gIHVpbnQzMl90IGR3U3R5bGUgPSAwOwotICBDWEZBX0ZvbnQgZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnROb2RlKCk7Ci0gIGlmIChmb250KSB7Ci0gICAgZm9udC5HZXRUeXBlZmFjZSh3c0ZhbWlseSk7Ci0gICAgaWYgKGZvbnQuSXNCb2xkKCkpCi0gICAgICBkd1N0eWxlIHw9IEZYX0ZPTlRTVFlMRV9Cb2xkOwotICAgIGlmIChmb250LklzSXRhbGljKCkpCi0gICAgICBkd1N0eWxlIHw9IEZYX0ZPTlRTVFlMRV9JdGFsaWM7Ci0gIH0KLQotICBpZiAocFN0eWxlKSB7Ci0gICAgaW50MzJfdCBpQ291bnQgPSBwU3R5bGUtPkNvdW50Rm9udEZhbWlsaWVzKCk7Ci0gICAgaWYgKGlDb3VudCA+IDApCi0gICAgICB3c0ZhbWlseSA9IHBTdHlsZS0+R2V0Rm9udEZhbWlseShpQ291bnQgLSAxKS5Bc1N0cmluZ0MoKTsKLQotICAgIGR3U3R5bGUgPSAwOwotICAgIGlmIChwU3R5bGUtPkdldEZvbnRXZWlnaHQoKSA+IEZYRk9OVF9GV19OT1JNQUwpCi0gICAgICBkd1N0eWxlIHw9IEZYX0ZPTlRTVFlMRV9Cb2xkOwotICAgIGlmIChwU3R5bGUtPkdldEZvbnRTdHlsZSgpID09IEZERV9DU1NGb250U3R5bGU6Okl0YWxpYykKLSAgICAgIGR3U3R5bGUgfD0gRlhfRk9OVFNUWUxFX0l0YWxpYzsKLSAgfQotCi0gIENYRkFfRkZEb2MqIHBEb2MgPSBwVGV4dFByb3ZpZGVyLT5HZXREb2NOb2RlKCk7Ci0gIENYRkFfRm9udE1nciogcEZvbnRNZ3IgPSBwRG9jLT5HZXRBcHAoKS0+R2V0WEZBRm9udE1ncigpOwotICByZXR1cm4gcEZvbnRNZ3ItPkdldEZvbnQocERvYywgd3NGYW1pbHksIGR3U3R5bGUpOwotfQotCi1GWF9GTE9BVCBDWEZBX1RleHRQYXJzZXI6OkdldEZvbnRTaXplKENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3QgewotICBpZiAocFN0eWxlKQotICAgIHJldHVybiBwU3R5bGUtPkdldEZvbnRTaXplKCk7Ci0KLSAgQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpOwotICBpZiAoZm9udCkKLSAgICByZXR1cm4gZm9udC5HZXRGb250U2l6ZSgpOwotICByZXR1cm4gMTA7Ci19Ci0KLWludDMyX3QgQ1hGQV9UZXh0UGFyc2VyOjpHZXRIb3JTY2FsZShDWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1hNTE5vZGUqIHBYTUxOb2RlKSBjb25zdCB7Ci0gIGlmIChwU3R5bGUpIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOwotICAgIGlmIChwU3R5bGUtPkdldEN1c3RvbVN0eWxlKEwieGZhLWZvbnQtaG9yaXpvbnRhbC1zY2FsZSIsIHdzVmFsdWUpKQotICAgICAgcmV0dXJuIHdzVmFsdWUuR2V0SW50ZWdlcigpOwotCi0gICAgd2hpbGUgKHBYTUxOb2RlKSB7Ci0gICAgICBhdXRvIGl0ID0gbV9tYXBYTUxOb2RlVG9QYXJzZUNvbnRleHQuZmluZChwWE1MTm9kZSk7Ci0gICAgICBpZiAoaXQgIT0gbV9tYXBYTUxOb2RlVG9QYXJzZUNvbnRleHQuZW5kKCkpIHsKLSAgICAgICAgQ1hGQV9UZXh0UGFyc2VDb250ZXh0KiBwQ29udGV4dCA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIGlmIChwQ29udGV4dCAmJiBwQ29udGV4dC0+bV9wUGFyZW50U3R5bGUgJiYKLSAgICAgICAgICAgIHBDb250ZXh0LT5tX3BQYXJlbnRTdHlsZS0+R2V0Q3VzdG9tU3R5bGUoCi0gICAgICAgICAgICAgICAgTCJ4ZmEtZm9udC1ob3Jpem9udGFsLXNjYWxlIiwgd3NWYWx1ZSkpIHsKLSAgICAgICAgICByZXR1cm4gd3NWYWx1ZS5HZXRJbnRlZ2VyKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHBYTUxOb2RlID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKENGREVfWE1MTm9kZTo6UGFyZW50KTsKLSAgICB9Ci0gIH0KLQotICBpZiAoQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpKQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90Pihmb250LkdldEhvcml6b250YWxTY2FsZSgpKTsKLSAgcmV0dXJuIDEwMDsKLX0KLQotaW50MzJfdCBDWEZBX1RleHRQYXJzZXI6OkdldFZlclNjYWxlKENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdCB7Ci0gIGlmIChwU3R5bGUpIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOwotICAgIGlmIChwU3R5bGUtPkdldEN1c3RvbVN0eWxlKEwieGZhLWZvbnQtdmVydGljYWwtc2NhbGUiLCB3c1ZhbHVlKSkKLSAgICAgIHJldHVybiB3c1ZhbHVlLkdldEludGVnZXIoKTsKLSAgfQotCi0gIGlmIChDWEZBX0ZvbnQgZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnROb2RlKCkpCi0gICAgcmV0dXJuIChpbnQzMl90KWZvbnQuR2V0VmVydGljYWxTY2FsZSgpOwotICByZXR1cm4gMTAwOwotfQotCi12b2lkIENYRkFfVGV4dFBhcnNlcjo6R2V0VW5kZXJsaW5lKENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVVuZGVybGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVBlcmlvZCkgY29uc3QgewotICBpVW5kZXJsaW5lID0gMDsKLSAgaVBlcmlvZCA9IFhGQV9BVFRSSUJVVEVFTlVNX0FsbDsKLSAgaWYgKCFwU3R5bGUpIHsKLSAgICBDWEZBX0ZvbnQgZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnROb2RlKCk7Ci0gICAgaWYgKGZvbnQpIHsKLSAgICAgIGlVbmRlcmxpbmUgPSBmb250LkdldFVuZGVybGluZSgpOwotICAgICAgaVBlcmlvZCA9IGZvbnQuR2V0VW5kZXJsaW5lUGVyaW9kKCk7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIHVpbnQzMl90IGR3RGVjb3JhdGlvbiA9IHBTdHlsZS0+R2V0VGV4dERlY29yYXRpb24oKTsKLSAgaWYgKGR3RGVjb3JhdGlvbiAmIEZERV9DU1NURVhUREVDT1JBVElPTl9Eb3VibGUpCi0gICAgaVVuZGVybGluZSA9IDI7Ci0gIGVsc2UgaWYgKGR3RGVjb3JhdGlvbiAmIEZERV9DU1NURVhUREVDT1JBVElPTl9VbmRlcmxpbmUpCi0gICAgaVVuZGVybGluZSA9IDE7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsKLSAgaWYgKHBTdHlsZS0+R2V0Q3VzdG9tU3R5bGUoTCJ1bmRlcmxpbmVQZXJpb2QiLCB3c1ZhbHVlKSkgewotICAgIGlmICh3c1ZhbHVlID09IEwid29yZCIpCi0gICAgICBpUGVyaW9kID0gWEZBX0FUVFJJQlVURUVOVU1fV29yZDsKLSAgfSBlbHNlIGlmIChDWEZBX0ZvbnQgZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnROb2RlKCkpIHsKLSAgICBpUGVyaW9kID0gZm9udC5HZXRVbmRlcmxpbmVQZXJpb2QoKTsKLSAgfQotfQotCi12b2lkIENYRkFfVGV4dFBhcnNlcjo6R2V0TGluZXRocm91Z2goQ1hGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUxpbmV0aHJvdWdoKSBjb25zdCB7Ci0gIGlmIChwU3R5bGUpIHsKLSAgICB1aW50MzJfdCBkd0RlY29yYXRpb24gPSBwU3R5bGUtPkdldFRleHREZWNvcmF0aW9uKCk7Ci0gICAgaUxpbmV0aHJvdWdoID0gKGR3RGVjb3JhdGlvbiAmIEZERV9DU1NURVhUREVDT1JBVElPTl9MaW5lVGhyb3VnaCkgPyAxIDogMDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDWEZBX0ZvbnQgZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnROb2RlKCk7Ci0gIGlmIChmb250KQotICAgIGlMaW5ldGhyb3VnaCA9IGZvbnQuR2V0TGluZVRocm91Z2goKTsKLX0KLQotRlhfQVJHQiBDWEZBX1RleHRQYXJzZXI6OkdldENvbG9yKENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdCB7Ci0gIGlmIChwU3R5bGUpCi0gICAgcmV0dXJuIHBTdHlsZS0+R2V0Q29sb3IoKTsKLSAgaWYgKENYRkFfRm9udCBmb250ID0gcFRleHRQcm92aWRlci0+R2V0Rm9udE5vZGUoKSkKLSAgICByZXR1cm4gZm9udC5HZXRDb2xvcigpOwotCi0gIHJldHVybiAweEZGMDAwMDAwOwotfQotCi1GWF9GTE9BVCBDWEZBX1RleHRQYXJzZXI6OkdldEJhc2VsaW5lKENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3QgewotICBpZiAocFN0eWxlKSB7Ci0gICAgaWYgKHBTdHlsZS0+R2V0VmVydGljYWxBbGlnbigpID09IEZERV9DU1NWZXJ0aWNhbEFsaWduOjpOdW1iZXIpCi0gICAgICByZXR1cm4gcFN0eWxlLT5HZXROdW1iZXJWZXJ0aWNhbEFsaWduKCk7Ci0gIH0gZWxzZSBpZiAoQ1hGQV9Gb250IGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250Tm9kZSgpKSB7Ci0gICAgcmV0dXJuIGZvbnQuR2V0QmFzZWxpbmVTaGlmdCgpOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1GWF9GTE9BVCBDWEZBX1RleHRQYXJzZXI6OkdldExpbmVIZWlnaHQoQ1hGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlZlclNjYWxlKSBjb25zdCB7Ci0gIEZYX0ZMT0FUIGZMaW5lSGVpZ2h0ID0gMDsKLSAgaWYgKHBTdHlsZSkKLSAgICBmTGluZUhlaWdodCA9IHBTdHlsZS0+R2V0TGluZUhlaWdodCgpOwotICBlbHNlIGlmIChDWEZBX1BhcmEgcGFyYSA9IHBUZXh0UHJvdmlkZXItPkdldFBhcmFOb2RlKCkpCi0gICAgZkxpbmVIZWlnaHQgPSBwYXJhLkdldExpbmVIZWlnaHQoKTsKLQotICBpZiAoYkZpcnN0KSB7Ci0gICAgRlhfRkxPQVQgZkZvbnRTaXplID0gR2V0Rm9udFNpemUocFRleHRQcm92aWRlciwgcFN0eWxlKTsKLSAgICBpZiAoZkxpbmVIZWlnaHQgPCAwLjFmKQotICAgICAgZkxpbmVIZWlnaHQgPSBmRm9udFNpemU7Ci0gICAgZWxzZQotICAgICAgZkxpbmVIZWlnaHQgPSBzdGQ6Om1pbihmTGluZUhlaWdodCwgZkZvbnRTaXplKTsKLSAgfSBlbHNlIGlmIChmTGluZUhlaWdodCA8IDAuMWYpIHsKLSAgICBmTGluZUhlaWdodCA9IEdldEZvbnRTaXplKHBUZXh0UHJvdmlkZXIsIHBTdHlsZSkgKiAxLjJmOwotICB9Ci0gIGZMaW5lSGVpZ2h0ICo9IGZWZXJTY2FsZTsKLSAgcmV0dXJuIGZMaW5lSGVpZ2h0OwotfQotCi1ib29sIENYRkFfVGV4dFBhcnNlcjo6R2V0RW1iYmVkT2JqKENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1hNTE5vZGUqIHBYTUxOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSkgewotICB3c1ZhbHVlLmNsZWFyKCk7Ci0gIGlmICghcFhNTE5vZGUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGJvb2wgYlJldCA9IGZhbHNlOwotICBpZiAocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7Ci0gICAgQ0ZERV9YTUxFbGVtZW50KiBwRWxlbWVudCA9IHN0YXRpY19jYXN0PENGREVfWE1MRWxlbWVudCo+KHBYTUxOb2RlKTsKLSAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHI7Ci0gICAgcEVsZW1lbnQtPkdldFN0cmluZyhMInhmYTplbWJlZCIsIHdzQXR0cik7Ci0gICAgaWYgKHdzQXR0ci5Jc0VtcHR5KCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgaWYgKHdzQXR0ci5HZXRBdCgwKSA9PSBMJyMnKQotICAgICAgd3NBdHRyLkRlbGV0ZSgwKTsKLQotICAgIENGWF9XaWRlU3RyaW5nIHdzOwotICAgIHBFbGVtZW50LT5HZXRTdHJpbmcoTCJ4ZmE6ZW1iZWRUeXBlIiwgd3MpOwotICAgIGlmICh3cy5Jc0VtcHR5KCkpCi0gICAgICB3cyA9IEwic29tIjsKLSAgICBlbHNlCi0gICAgICB3cy5NYWtlTG93ZXIoKTsKLQotICAgIGJvb2wgYlVSSSA9ICh3cyA9PSBMInVyaSIpOwotICAgIGlmICghYlVSSSAmJiB3cyAhPSBMInNvbSIpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICB3cy5jbGVhcigpOwotICAgIHBFbGVtZW50LT5HZXRTdHJpbmcoTCJ4ZmE6ZW1iZWRNb2RlIiwgd3MpOwotICAgIGlmICh3cy5Jc0VtcHR5KCkpCi0gICAgICB3cyA9IEwiZm9ybWF0dGVkIjsKLSAgICBlbHNlCi0gICAgICB3cy5NYWtlTG93ZXIoKTsKLQotICAgIGJvb2wgYlJhdyA9ICh3cyA9PSBMInJhdyIpOwotICAgIGlmICghYlJhdyAmJiB3cyAhPSBMImZvcm1hdHRlZCIpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBiUmV0ID0gcFRleHRQcm92aWRlci0+R2V0RW1iYmVkT2JqKGJVUkksIGJSYXcsIHdzQXR0ciwgd3NWYWx1ZSk7Ci0gIH0KLSAgcmV0dXJuIGJSZXQ7Ci19Ci0KLUNYRkFfVGV4dFBhcnNlQ29udGV4dCogQ1hGQV9UZXh0UGFyc2VyOjpHZXRQYXJzZUNvbnRleHRGcm9tTWFwKAotICAgIENGREVfWE1MTm9kZSogcFhNTE5vZGUpIHsKLSAgYXV0byBpdCA9IG1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LmZpbmQocFhNTE5vZGUpOwotICByZXR1cm4gaXQgIT0gbV9tYXBYTUxOb2RlVG9QYXJzZUNvbnRleHQuZW5kKCkgPyBpdC0+c2Vjb25kIDogbnVsbHB0cjsKLX0KLQotYm9vbCBDWEZBX1RleHRQYXJzZXI6OkdldFRhYnN0b3BzKENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVGV4dFRhYnN0b3BzQ29udGV4dCogcFRhYnN0b3BDb250ZXh0KSB7Ci0gIGlmICghcFN0eWxlIHx8ICFwVGFic3RvcENvbnRleHQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7Ci0gIGlmICghcFN0eWxlLT5HZXRDdXN0b21TdHlsZShMInhmYS10YWItc3RvcHMiLCB3c1ZhbHVlKSAmJgotICAgICAgIXBTdHlsZS0+R2V0Q3VzdG9tU3R5bGUoTCJ0YWItc3RvcHMiLCB3c1ZhbHVlKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGludDMyX3QgaUxlbmd0aCA9IHdzVmFsdWUuR2V0TGVuZ3RoKCk7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwVGFiU3RvcHMgPSB3c1ZhbHVlLmNfc3RyKCk7Ci0gIGludDMyX3QgaUN1ciA9IDA7Ci0gIGludDMyX3QgaUxhc3QgPSAwOwotICBDRlhfV2lkZVN0cmluZyB3c0FsaWduOwotICBUYWJTdG9wU3RhdHVzIGVTdGF0dXMgPSBUYWJTdG9wU3RhdHVzOjpOb25lOwotICBGWF9XQ0hBUiBjaDsKLSAgd2hpbGUgKGlDdXIgPCBpTGVuZ3RoKSB7Ci0gICAgY2ggPSBwVGFiU3RvcHNbaUN1cl07Ci0gICAgc3dpdGNoIChlU3RhdHVzKSB7Ci0gICAgICBjYXNlIFRhYlN0b3BTdGF0dXM6Ok5vbmU6Ci0gICAgICAgIGlmIChjaCA8PSAnICcpIHsKLSAgICAgICAgICBpQ3VyKys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZVN0YXR1cyA9IFRhYlN0b3BTdGF0dXM6OkFsaWdubWVudDsKLSAgICAgICAgICBpTGFzdCA9IGlDdXI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRhYlN0b3BTdGF0dXM6OkFsaWdubWVudDoKLSAgICAgICAgaWYgKGNoID09ICcgJykgewotICAgICAgICAgIHdzQWxpZ24gPSBDRlhfV2lkZVN0cmluZ0MocFRhYlN0b3BzICsgaUxhc3QsIGlDdXIgLSBpTGFzdCk7Ci0gICAgICAgICAgZVN0YXR1cyA9IFRhYlN0b3BTdGF0dXM6OlN0YXJ0TGVhZGVyOwotICAgICAgICAgIGlDdXIrKzsKLSAgICAgICAgICB3aGlsZSAoaUN1ciA8IGlMZW5ndGggJiYgcFRhYlN0b3BzW2lDdXJdIDw9ICcgJykKLSAgICAgICAgICAgIGlDdXIrKzsKLSAgICAgICAgICBpTGFzdCA9IGlDdXI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaUN1cisrOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUYWJTdG9wU3RhdHVzOjpTdGFydExlYWRlcjoKLSAgICAgICAgaWYgKGNoICE9ICdsJykgewotICAgICAgICAgIGVTdGF0dXMgPSBUYWJTdG9wU3RhdHVzOjpMb2NhdGlvbjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpbnQzMl90IGlDb3VudCA9IDA7Ci0gICAgICAgICAgd2hpbGUgKGlDdXIgPCBpTGVuZ3RoKSB7Ci0gICAgICAgICAgICBjaCA9IHBUYWJTdG9wc1tpQ3VyXTsKLSAgICAgICAgICAgIGlDdXIrKzsKLSAgICAgICAgICAgIGlmIChjaCA9PSAnKCcpIHsKLSAgICAgICAgICAgICAgaUNvdW50Kys7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcpJykgewotICAgICAgICAgICAgICBpQ291bnQtLTsKLSAgICAgICAgICAgICAgaWYgKGlDb3VudCA9PSAwKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICB3aGlsZSAoaUN1ciA8IGlMZW5ndGggJiYgcFRhYlN0b3BzW2lDdXJdIDw9ICcgJykKLSAgICAgICAgICAgIGlDdXIrKzsKLQotICAgICAgICAgIGlMYXN0ID0gaUN1cjsKLSAgICAgICAgICBlU3RhdHVzID0gVGFiU3RvcFN0YXR1czo6TG9jYXRpb247Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRhYlN0b3BTdGF0dXM6OkxvY2F0aW9uOgotICAgICAgICBpZiAoY2ggPT0gJyAnKSB7Ci0gICAgICAgICAgdWludDMyX3QgZHdIYXNoQ29kZSA9IEZYX0hhc2hDb2RlX0dldFcod3NBbGlnbi5Bc1N0cmluZ0MoKSwgdHJ1ZSk7Ci0gICAgICAgICAgQ1hGQV9NZWFzdXJlbWVudCBtcyhDRlhfV2lkZVN0cmluZ0MocFRhYlN0b3BzICsgaUxhc3QsIGlDdXIgLSBpTGFzdCkpOwotICAgICAgICAgIEZYX0ZMT0FUIGZQb3MgPSBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOwotICAgICAgICAgIHBUYWJzdG9wQ29udGV4dC0+QXBwZW5kKGR3SGFzaENvZGUsIGZQb3MpOwotICAgICAgICAgIHdzQWxpZ24uY2xlYXIoKTsKLSAgICAgICAgICBlU3RhdHVzID0gVGFiU3RvcFN0YXR1czo6Tm9uZTsKLSAgICAgICAgfQotICAgICAgICBpQ3VyKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCF3c0FsaWduLklzRW1wdHkoKSkgewotICAgIHVpbnQzMl90IGR3SGFzaENvZGUgPSBGWF9IYXNoQ29kZV9HZXRXKHdzQWxpZ24uQXNTdHJpbmdDKCksIHRydWUpOwotICAgIENYRkFfTWVhc3VyZW1lbnQgbXMoQ0ZYX1dpZGVTdHJpbmdDKHBUYWJTdG9wcyArIGlMYXN0LCBpQ3VyIC0gaUxhc3QpKTsKLSAgICBGWF9GTE9BVCBmUG9zID0gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsKLSAgICBwVGFic3RvcENvbnRleHQtPkFwcGVuZChkd0hhc2hDb2RlLCBmUG9zKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2FwcC9jeGZhX3RleHRwYXJzZXIuaCBiL3hmYS9meGZhL2FwcC9jeGZhX3RleHRwYXJzZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZkYTUwMi4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAvY3hmYV90ZXh0cGFyc2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEZBX0FQUF9DWEZBX1RFWFRQQVJTRVJfSF8KLSNkZWZpbmUgWEZBX0ZYRkFfQVBQX0NYRkFfVEVYVFBBUlNFUl9IXwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3JldGFpbl9wdHIuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2ZvbnQvY2ZnYXNfZ2Vmb250LmgiCi0KLWNsYXNzIENGREVfQ1NTQ29tcHV0ZWRTdHlsZTsKLWNsYXNzIENGREVfQ1NTU3R5bGVTZWxlY3RvcjsKLWNsYXNzIENGREVfQ1NTU3R5bGVTaGVldDsKLWNsYXNzIENGREVfWE1MTm9kZTsKLWNsYXNzIENYRkFfQ1NTVGFnUHJvdmlkZXI7Ci1jbGFzcyBDWEZBX1RleHRQYXJzZUNvbnRleHQ7Ci1jbGFzcyBDWEZBX1RleHRQcm92aWRlcjsKLWNsYXNzIENYRkFfVGV4dFRhYnN0b3BzQ29udGV4dDsKLQotY2xhc3MgQ1hGQV9UZXh0UGFyc2VyIHsKLSBwdWJsaWM6Ci0gIENYRkFfVGV4dFBhcnNlcigpOwotICB2aXJ0dWFsIH5DWEZBX1RleHRQYXJzZXIoKTsKLQotICB2b2lkIFJlc2V0KCk7Ci0gIHZvaWQgRG9QYXJzZShDRkRFX1hNTE5vZGUqIHBYTUxDb250YWluZXIsIENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyKTsKLQotICBDRlhfUmV0YWluUHRyPENGREVfQ1NTQ29tcHV0ZWRTdHlsZT4gQ3JlYXRlUm9vdFN0eWxlKAotICAgICAgQ1hGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIpOwotICBDRlhfUmV0YWluUHRyPENGREVfQ1NTQ29tcHV0ZWRTdHlsZT4gQ29tcHV0ZVN0eWxlKAotICAgICAgQ0ZERV9YTUxOb2RlKiBwWE1MTm9kZSwKLSAgICAgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFBhcmVudFN0eWxlKTsKLQotICBib29sIElzUGFyc2VkKCkgY29uc3QgeyByZXR1cm4gbV9iUGFyc2VkOyB9Ci0KLSAgaW50MzJfdCBHZXRWQWxpZ24oQ1hGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIpIGNvbnN0OwotCi0gIEZYX0ZMT0FUIEdldFRhYkludGVydmFsKENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdDsKLSAgaW50MzJfdCBDb3VudFRhYnMoQ0ZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUpIGNvbnN0OwotCi0gIGJvb2wgSXNTcGFjZVJ1bihDRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3Q7Ci0gIGJvb2wgR2V0VGFic3RvcHMoQ0ZERV9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUsCi0gICAgICAgICAgICAgICAgICAgQ1hGQV9UZXh0VGFic3RvcHNDb250ZXh0KiBwVGFic3RvcENvbnRleHQpOwotCi0gIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBHZXRGb250KENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3Q7Ci0gIEZYX0ZMT0FUIEdldEZvbnRTaXplKENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICAgICBDRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3Q7Ci0KLSAgaW50MzJfdCBHZXRIb3JTY2FsZShDWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwKLSAgICAgICAgICAgICAgICAgICAgICBDRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICBDRkRFX1hNTE5vZGUqIHBYTUxOb2RlKSBjb25zdDsKLSAgaW50MzJfdCBHZXRWZXJTY2FsZShDWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwKLSAgICAgICAgICAgICAgICAgICAgICBDRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3Q7Ci0KLSAgdm9pZCBHZXRVbmRlcmxpbmUoQ1hGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlLAotICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpVW5kZXJsaW5lLAotICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpUGVyaW9kKSBjb25zdDsKLSAgdm9pZCBHZXRMaW5ldGhyb3VnaChDWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwKLSAgICAgICAgICAgICAgICAgICAgICBDRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTGluZXRocm91Z2gpIGNvbnN0OwotICBGWF9BUkdCIEdldENvbG9yKENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdDsKLSAgRlhfRkxPQVQgR2V0QmFzZWxpbmUoQ1hGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdDsKLSAgRlhfRkxPQVQgR2V0TGluZUhlaWdodChDWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGaXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVmVyU2NhbGUpIGNvbnN0OwotCi0gIGJvb2wgR2V0RW1iYmVkT2JqKENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICBDRkRFX1hNTE5vZGUqIHBYTUxOb2RlLAotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSk7Ci0gIENYRkFfVGV4dFBhcnNlQ29udGV4dCogR2V0UGFyc2VDb250ZXh0RnJvbU1hcChDRkRFX1hNTE5vZGUqIHBYTUxOb2RlKTsKLQotIHByb3RlY3RlZDoKLSAgYm9vbCBUYWdWYWxpZGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgc3RyKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIHZvaWQgSW5pdENTU0RhdGEoQ1hGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIpOwotICB2b2lkIFBhcnNlUmljaFRleHQoQ0ZERV9YTUxOb2RlKiBwWE1MTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFBhcmVudFN0eWxlKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfQ1NTVGFnUHJvdmlkZXI+IFBhcnNlVGFnSW5mbyhDRkRFX1hNTE5vZGUqIHBYTUxOb2RlKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGREVfQ1NTU3R5bGVTaGVldD4gTG9hZERlZmF1bHRTaGVldFN0eWxlKCk7Ci0gIENGWF9SZXRhaW5QdHI8Q0ZERV9DU1NDb21wdXRlZFN0eWxlPiBDcmVhdGVTdHlsZSgKLSAgICAgIENGREVfQ1NTQ29tcHV0ZWRTdHlsZSogcFBhcmVudFN0eWxlKTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZERV9DU1NTdHlsZVNlbGVjdG9yPiBtX3BTZWxlY3RvcjsKLSAgc3RkOjptYXA8Q0ZERV9YTUxOb2RlKiwgQ1hGQV9UZXh0UGFyc2VDb250ZXh0Kj4gbV9tYXBYTUxOb2RlVG9QYXJzZUNvbnRleHQ7Ci0gIGJvb2wgbV9iUGFyc2VkOwotICBib29sIG1fY3NzSW5pdGlhbGl6ZWQ7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEZBX0FQUF9DWEZBX1RFWFRQQVJTRVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2FwcC9jeGZhX3RleHRwYXJzZXJfdW5pdHRlc3QuY3BwIGIveGZhL2Z4ZmEvYXBwL2N4ZmFfdGV4dHBhcnNlcl91bml0dGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYTAxMTAuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvYXBwL2N4ZmFfdGV4dHBhcnNlcl91bml0dGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAvY3hmYV90ZXh0cGFyc2VyLmgiCi0KLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotY2xhc3MgQ1hGQV9UZXN0VGV4dFBhcnNlciA6IHB1YmxpYyBDWEZBX1RleHRQYXJzZXIgewotIHB1YmxpYzoKLSAgQ1hGQV9UZXN0VGV4dFBhcnNlcigpIDogQ1hGQV9UZXh0UGFyc2VyKCkge30KLQotIHByaXZhdGU6Ci0gIC8vIEFkZCB0ZXN0IGNhc2VzIGFzIGZyaWVuZHMgdG8gYWNjZXNzIHByb3RlY3RlZCBtZW1iZXIgZnVuY3Rpb25zLgotICBGUklFTkRfVEVTVChDWEZBX1RleHRQYXJzZXIsIFRhZ1ZhbGlkYXRlKTsKLX07Ci0KLVRFU1QoQ1hGQV9UZXh0UGFyc2VyLCBUYWdWYWxpZGF0ZSkgewotICBDWEZBX1Rlc3RUZXh0UGFyc2VyIHBhcnNlcjsKLSAgRVhQRUNUX1RSVUUocGFyc2VyLlRhZ1ZhbGlkYXRlKEwiYnIiKSk7Ci0gIEVYUEVDVF9UUlVFKHBhcnNlci5UYWdWYWxpZGF0ZShMIkJyIikpOwotICBFWFBFQ1RfVFJVRShwYXJzZXIuVGFnVmFsaWRhdGUoTCJCUiIpKTsKLSAgRVhQRUNUX1RSVUUocGFyc2VyLlRhZ1ZhbGlkYXRlKEwiYSIpKTsKLSAgRVhQRUNUX1RSVUUocGFyc2VyLlRhZ1ZhbGlkYXRlKEwiYiIpKTsKLSAgRVhQRUNUX1RSVUUocGFyc2VyLlRhZ1ZhbGlkYXRlKEwiaSIpKTsKLSAgRVhQRUNUX1RSVUUocGFyc2VyLlRhZ1ZhbGlkYXRlKEwicCIpKTsKLSAgRVhQRUNUX1RSVUUocGFyc2VyLlRhZ1ZhbGlkYXRlKEwibGkiKSk7Ci0gIEVYUEVDVF9UUlVFKHBhcnNlci5UYWdWYWxpZGF0ZShMIm9sIikpOwotICBFWFBFQ1RfVFJVRShwYXJzZXIuVGFnVmFsaWRhdGUoTCJ1bCIpKTsKLSAgRVhQRUNUX1RSVUUocGFyc2VyLlRhZ1ZhbGlkYXRlKEwic3ViIikpOwotICBFWFBFQ1RfVFJVRShwYXJzZXIuVGFnVmFsaWRhdGUoTCJzdXAiKSk7Ci0gIEVYUEVDVF9UUlVFKHBhcnNlci5UYWdWYWxpZGF0ZShMInNwYW4iKSk7Ci0gIEVYUEVDVF9UUlVFKHBhcnNlci5UYWdWYWxpZGF0ZShMImJvZHkiKSk7Ci0gIEVYUEVDVF9UUlVFKHBhcnNlci5UYWdWYWxpZGF0ZShMImh0bWwiKSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKHBhcnNlci5UYWdWYWxpZGF0ZShMIiIpKTsKLSAgRVhQRUNUX0ZBTFNFKHBhcnNlci5UYWdWYWxpZGF0ZShMInRtbCIpKTsKLSAgRVhQRUNUX0ZBTFNFKHBhcnNlci5UYWdWYWxpZGF0ZShMInhodG1sIikpOwotICBFWFBFQ1RfRkFMU0UocGFyc2VyLlRhZ1ZhbGlkYXRlKEwiaHRtbHgiKSk7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAvY3hmYV90ZXh0dGFic3RvcHNjb250ZXh0LmNwcCBiL3hmYS9meGZhL2FwcC9jeGZhX3RleHR0YWJzdG9wc2NvbnRleHQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjA5NjAzLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC9jeGZhX3RleHR0YWJzdG9wc2NvbnRleHQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL2N4ZmFfdGV4dHRhYnN0b3BzY29udGV4dC5oIgotCi1DWEZBX1RleHRUYWJzdG9wc0NvbnRleHQ6OkNYRkFfVGV4dFRhYnN0b3BzQ29udGV4dCgpCi0gICAgOiBtX2lUYWJDb3VudCgwKSwKLSAgICAgIG1faVRhYkluZGV4KC0xKSwKLSAgICAgIG1fYlRhYnN0b3BzKGZhbHNlKSwKLSAgICAgIG1fZlRhYldpZHRoKDApLAotICAgICAgbV9mTGVmdCgwKSB7fQotCi1DWEZBX1RleHRUYWJzdG9wc0NvbnRleHQ6On5DWEZBX1RleHRUYWJzdG9wc0NvbnRleHQoKSB7fQotCi12b2lkIENYRkFfVGV4dFRhYnN0b3BzQ29udGV4dDo6QXBwZW5kKHVpbnQzMl90IGR3QWxpZ24sIEZYX0ZMT0FUIGZUYWJzdG9wcykgewotICBpbnQzMl90IGkgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgbV9pVGFiQ291bnQ7IGkrKykgewotICAgIFhGQV9UQUJTVE9QUyogcFRhYnN0b3AgPSBtX3RhYnN0b3BzLkdldERhdGFQdHIoaSk7Ci0gICAgaWYgKGZUYWJzdG9wcyA8IHBUYWJzdG9wLT5mVGFic3RvcHMpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBtX3RhYnN0b3BzLkluc2VydFNwYWNlQXQoaSwgMSk7Ci0gIFhGQV9UQUJTVE9QUyB0YWJzdG9wOwotICB0YWJzdG9wLmR3QWxpZ24gPSBkd0FsaWduOwotICB0YWJzdG9wLmZUYWJzdG9wcyA9IGZUYWJzdG9wczsKLSAgbV90YWJzdG9wcy5TZXRBdChpLCB0YWJzdG9wKTsKLSAgbV9pVGFiQ291bnQrKzsKLX0KLQotdm9pZCBDWEZBX1RleHRUYWJzdG9wc0NvbnRleHQ6OlJlbW92ZUFsbCgpIHsKLSAgbV90YWJzdG9wcy5SZW1vdmVBbGwoKTsKLSAgbV9pVGFiQ291bnQgPSAwOwotfQotCi12b2lkIENYRkFfVGV4dFRhYnN0b3BzQ29udGV4dDo6UmVzZXQoKSB7Ci0gIG1faVRhYkluZGV4ID0gLTE7Ci0gIG1fYlRhYnN0b3BzID0gZmFsc2U7Ci0gIG1fZlRhYldpZHRoID0gMDsKLSAgbV9mTGVmdCA9IDA7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAvY3hmYV90ZXh0dGFic3RvcHNjb250ZXh0LmggYi94ZmEvZnhmYS9hcHAvY3hmYV90ZXh0dGFic3RvcHNjb250ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZTBlNjIuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvYXBwL2N4ZmFfdGV4dHRhYnN0b3BzY29udGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEZBX0FQUF9DWEZBX1RFWFRUQUJTVE9QU0NPTlRFWFRfSF8KLSNkZWZpbmUgWEZBX0ZYRkFfQVBQX0NYRkFfVEVYVFRBQlNUT1BTQ09OVEVYVF9IXwotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgotCi1zdHJ1Y3QgWEZBX1RBQlNUT1BTIHsKLSAgdWludDMyX3QgZHdBbGlnbjsKLSAgRlhfRkxPQVQgZlRhYnN0b3BzOwotfTsKLQotY2xhc3MgQ1hGQV9UZXh0VGFic3RvcHNDb250ZXh0IHsKLSBwdWJsaWM6Ci0gIENYRkFfVGV4dFRhYnN0b3BzQ29udGV4dCgpOwotICB+Q1hGQV9UZXh0VGFic3RvcHNDb250ZXh0KCk7Ci0KLSAgdm9pZCBBcHBlbmQodWludDMyX3QgZHdBbGlnbiwgRlhfRkxPQVQgZlRhYnN0b3BzKTsKLSAgdm9pZCBSZW1vdmVBbGwoKTsKLSAgdm9pZCBSZXNldCgpOwotCi0gIENGWF9BcnJheVRlbXBsYXRlPFhGQV9UQUJTVE9QUz4gbV90YWJzdG9wczsKLSAgaW50MzJfdCBtX2lUYWJDb3VudDsKLSAgaW50MzJfdCBtX2lUYWJJbmRleDsKLSAgYm9vbCBtX2JUYWJzdG9wczsKLSAgRlhfRkxPQVQgbV9mVGFiV2lkdGg7Ci0gIEZYX0ZMT0FUIG1fZkxlZnQ7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEZBX0FQUF9DWEZBX1RFWFRUQUJTVE9QU0NPTlRFWFRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2FwcC9jeGZhX3RleHR1c2VyZGF0YS5jcHAgYi94ZmEvZnhmYS9hcHAvY3hmYV90ZXh0dXNlcmRhdGEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGU1NDkzLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC9jeGZhX3RleHR1c2VyZGF0YS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAvY3hmYV90ZXh0dXNlcmRhdGEuaCIKLQotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3NzY29tcHV0ZWRzdHlsZS5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2NmZGVfY3Nzc3R5bGVzZWxlY3Rvci5oIgotI2luY2x1ZGUgInhmYS9mZGUvY3NzL2ZkZV9jc3MuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAvY3hmYV9saW5rdXNlcmRhdGEuaCIKLQotQ1hGQV9UZXh0VXNlckRhdGE6OkNYRkFfVGV4dFVzZXJEYXRhKAotICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8Q0ZERV9DU1NDb21wdXRlZFN0eWxlPiYgcFN0eWxlKQotICAgIDogbV9wU3R5bGUocFN0eWxlKSB7fQotCi1DWEZBX1RleHRVc2VyRGF0YTo6Q1hGQV9UZXh0VXNlckRhdGEoCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxDRkRFX0NTU0NvbXB1dGVkU3R5bGU+JiBwU3R5bGUsCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxDWEZBX0xpbmtVc2VyRGF0YT4mIHBMaW5rRGF0YSkKLSAgICA6IG1fcFN0eWxlKHBTdHlsZSksIG1fcExpbmtEYXRhKHBMaW5rRGF0YSkge30KLQotQ1hGQV9UZXh0VXNlckRhdGE6On5DWEZBX1RleHRVc2VyRGF0YSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAvY3hmYV90ZXh0dXNlcmRhdGEuaCBiL3hmYS9meGZhL2FwcC9jeGZhX3RleHR1c2VyZGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGVmZjczLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC9jeGZhX3RleHR1c2VyZGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEZBX0FQUF9DWEZBX1RFWFRVU0VSREFUQV9IXwotI2RlZmluZSBYRkFfRlhGQV9BUFBfQ1hGQV9URVhUVVNFUkRBVEFfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3JldGFpbl9wdHIuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0KLWNsYXNzIENGREVfQ1NTQ29tcHV0ZWRTdHlsZTsKLWNsYXNzIENYRkFfTGlua1VzZXJEYXRhOwotCi1jbGFzcyBDWEZBX1RleHRVc2VyRGF0YSA6IHB1YmxpYyBDRlhfUmV0YWluYWJsZSB7Ci0gcHVibGljOgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KLSAgZnJpZW5kIENGWF9SZXRhaW5QdHI8VD4gcGRmaXVtOjpNYWtlUmV0YWluKEFyZ3MmJi4uLiBhcmdzKTsKLQotICBDRlhfUmV0YWluUHRyPENGREVfQ1NTQ29tcHV0ZWRTdHlsZT4gbV9wU3R5bGU7Ci0gIENGWF9SZXRhaW5QdHI8Q1hGQV9MaW5rVXNlckRhdGE+IG1fcExpbmtEYXRhOwotCi0gcHJvdGVjdGVkOgotICBleHBsaWNpdCBDWEZBX1RleHRVc2VyRGF0YSgKLSAgICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8Q0ZERV9DU1NDb21wdXRlZFN0eWxlPiYgcFN0eWxlKTsKLSAgQ1hGQV9UZXh0VXNlckRhdGEoY29uc3QgQ0ZYX1JldGFpblB0cjxDRkRFX0NTU0NvbXB1dGVkU3R5bGU+JiBwU3R5bGUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8Q1hGQV9MaW5rVXNlckRhdGE+JiBwTGlua0RhdGEpOwotICB+Q1hGQV9UZXh0VXNlckRhdGEoKSBvdmVycmlkZTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYRkFfQVBQX0NYRkFfVEVYVFVTRVJEQVRBX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAveGZhX2NoZWNrc3VtLmNwcCBiL3hmYS9meGZhL2FwcC94ZmFfY2hlY2tzdW0uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWM0MjcxLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfY2hlY2tzdW0uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9jaGVja3N1bS5oIgotCi0jaW5jbHVkZSAiY29yZS9mZHJtL2NyeXB0by9meF9jcnlwdC5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLQotbmFtZXNwYWNlIHsKLQotc3RydWN0IEZYX0JBU0U2NERBVEEgewotICB1aW50MzJfdCBkYXRhMSA6IDI7Ci0gIHVpbnQzMl90IGRhdGEyIDogNjsKLSAgdWludDMyX3QgZGF0YTMgOiA0OwotICB1aW50MzJfdCBkYXRhNCA6IDQ7Ci0gIHVpbnQzMl90IGRhdGE1IDogNjsKLSAgdWludDMyX3QgZGF0YTYgOiAyOwotICB1aW50MzJfdCBkYXRhNyA6IDg7Ci19OwotCi1jb25zdCBGWF9DSEFSIGdfRlhCYXNlNjRFbmNvZGVyTWFwWzY0XSA9IHsKLSAgICAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnLCAnRycsICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsCi0gICAgJ04nLCAnTycsICdQJywgJ1EnLCAnUicsICdTJywgJ1QnLCAnVScsICdWJywgJ1cnLCAnWCcsICdZJywgJ1onLAotICAgICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCcsICdtJywKLSAgICAnbicsICdvJywgJ3AnLCAncScsICdyJywgJ3MnLCAndCcsICd1JywgJ3YnLCAndycsICd4JywgJ3knLCAneicsCi0gICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnKycsICcvJywKLX07Ci0KLXZvaWQgQmFzZTY0RW5jb2RlUGllY2UoY29uc3QgRlhfQkFTRTY0REFUQSYgc3JjLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCeXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfQ0hBUiBkc3RbNF0pIHsKLSAgZHN0WzBdID0gZ19GWEJhc2U2NEVuY29kZXJNYXBbc3JjLmRhdGEyXTsKLSAgdWludDMyX3QgYiA9IHNyYy5kYXRhMSA8PCA0OwotICBpZiAoaUJ5dGVzID4gMSkgewotICAgIGIgfD0gc3JjLmRhdGE0OwotICB9Ci0gIGRzdFsxXSA9IGdfRlhCYXNlNjRFbmNvZGVyTWFwW2JdOwotICBpZiAoaUJ5dGVzID4gMSkgewotICAgIGIgPSBzcmMuZGF0YTMgPDwgMjsKLSAgICBpZiAoaUJ5dGVzID4gMikgewotICAgICAgYiB8PSBzcmMuZGF0YTY7Ci0gICAgfQotICAgIGRzdFsyXSA9IGdfRlhCYXNlNjRFbmNvZGVyTWFwW2JdOwotICAgIGlmIChpQnl0ZXMgPiAyKSB7Ci0gICAgICBkc3RbM10gPSBnX0ZYQmFzZTY0RW5jb2Rlck1hcFtzcmMuZGF0YTVdOwotICAgIH0gZWxzZSB7Ci0gICAgICBkc3RbM10gPSAnPSc7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGRzdFsyXSA9IGRzdFszXSA9ICc9JzsKLSAgfQotfQotCi1pbnQzMl90IEJhc2U2NEVuY29kZUEoY29uc3QgdWludDhfdCogcFNyYywgaW50MzJfdCBpU3JjTGVuLCBGWF9DSEFSKiBwRHN0KSB7Ci0gIEFTU0VSVChwU3JjKTsKLSAgaWYgKGlTcmNMZW4gPCAxKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKCFwRHN0KSB7Ci0gICAgaW50MzJfdCBpRHN0TGVuID0gaVNyY0xlbiAvIDMgKiA0OwotICAgIGlmICgoaVNyY0xlbiAlIDMpICE9IDApIHsKLSAgICAgIGlEc3RMZW4gKz0gNDsKLSAgICB9Ci0gICAgcmV0dXJuIGlEc3RMZW47Ci0gIH0KLSAgRlhfQkFTRTY0REFUQSBzcmNEYXRhOwotICBpbnQzMl90IGlCeXRlcyA9IDM7Ci0gIEZYX0NIQVIqIHBEc3RFbmQgPSBwRHN0OwotICB3aGlsZSAoaVNyY0xlbiA+IDApIHsKLSAgICBpZiAoaVNyY0xlbiA+IDIpIHsKLSAgICAgICgodWludDhfdCopJnNyY0RhdGEpWzBdID0gKnBTcmMrKzsKLSAgICAgICgodWludDhfdCopJnNyY0RhdGEpWzFdID0gKnBTcmMrKzsKLSAgICAgICgodWludDhfdCopJnNyY0RhdGEpWzJdID0gKnBTcmMrKzsKLSAgICAgIGlTcmNMZW4gLT0gMzsKLSAgICB9IGVsc2UgewotICAgICAgKigodWludDMyX3QqKSZzcmNEYXRhKSA9IDA7Ci0gICAgICAoKHVpbnQ4X3QqKSZzcmNEYXRhKVswXSA9ICpwU3JjKys7Ci0gICAgICBpZiAoaVNyY0xlbiA+IDEpIHsKLSAgICAgICAgKCh1aW50OF90Kikmc3JjRGF0YSlbMV0gPSAqcFNyYysrOwotICAgICAgfQotICAgICAgaUJ5dGVzID0gaVNyY0xlbjsKLSAgICAgIGlTcmNMZW4gPSAwOwotICAgIH0KLSAgICBCYXNlNjRFbmNvZGVQaWVjZShzcmNEYXRhLCBpQnl0ZXMsIHBEc3RFbmQpOwotICAgIHBEc3RFbmQgKz0gNDsKLSAgfQotICByZXR1cm4gcERzdEVuZCAtIHBEc3Q7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1DWEZBX1NBWFJlYWRlckhhbmRsZXI6OkNYRkFfU0FYUmVhZGVySGFuZGxlcihDWEZBX0NoZWNrc3VtQ29udGV4dCogcENvbnRleHQpCi0gICAgOiBtX3BDb250ZXh0KHBDb250ZXh0KSB7Ci0gIEFTU0VSVChtX3BDb250ZXh0KTsKLX0KLUNYRkFfU0FYUmVhZGVySGFuZGxlcjo6fkNYRkFfU0FYUmVhZGVySGFuZGxlcigpIHt9Ci1DWEZBX1NBWENvbnRleHQqIENYRkFfU0FYUmVhZGVySGFuZGxlcjo6T25UYWdFbnRlcigKLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVGFnTmFtZSwKLSAgICBDRlhfU0FYSXRlbTo6VHlwZSBlVHlwZSwKLSAgICB1aW50MzJfdCBkd1N0YXJ0UG9zKSB7Ci0gIFVwZGF0ZUNoZWNrc3VtKHRydWUpOwotICBpZiAoZVR5cGUgIT0gQ0ZYX1NBWEl0ZW06OlR5cGU6OlRhZyAmJgotICAgICAgZVR5cGUgIT0gQ0ZYX1NBWEl0ZW06OlR5cGU6Okluc3RydWN0aW9uKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgbV9TQVhDb250ZXh0Lm1fZU5vZGUgPSBlVHlwZTsKLSAgQ0ZYX0J5dGVUZXh0QnVmJiB0ZXh0QnVmID0gbV9TQVhDb250ZXh0Lm1fVGV4dEJ1ZjsKLSAgdGV4dEJ1ZiA8PCAiPCI7Ci0gIGlmIChlVHlwZSA9PSBDRlhfU0FYSXRlbTo6VHlwZTo6SW5zdHJ1Y3Rpb24pIHsKLSAgICB0ZXh0QnVmIDw8ICI/IjsKLSAgfQotICB0ZXh0QnVmIDw8IGJzVGFnTmFtZTsKLSAgbV9TQVhDb250ZXh0Lm1fYnNUYWdOYW1lID0gYnNUYWdOYW1lOwotICByZXR1cm4gJm1fU0FYQ29udGV4dDsKLX0KLQotdm9pZCBDWEZBX1NBWFJlYWRlckhhbmRsZXI6Ok9uVGFnQXR0cmlidXRlKENYRkFfU0FYQ29udGV4dCogcFRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzQXR0cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1ZhbHVlKSB7Ci0gIGlmICghcFRhZykKLSAgICByZXR1cm47Ci0KLSAgcFRhZy0+bV9UZXh0QnVmIDw8ICIgIiA8PCBic0F0dHJpIDw8ICI9XCIiIDw8IGJzVmFsdWUgPDwgIlwiIjsKLX0KLQotdm9pZCBDWEZBX1NBWFJlYWRlckhhbmRsZXI6Ok9uVGFnQnJlYWsoQ1hGQV9TQVhDb250ZXh0KiBwVGFnKSB7Ci0gIGlmICghcFRhZykKLSAgICByZXR1cm47Ci0KLSAgcFRhZy0+bV9UZXh0QnVmIDw8ICI+IjsKLSAgVXBkYXRlQ2hlY2tzdW0oZmFsc2UpOwotfQotCi12b2lkIENYRkFfU0FYUmVhZGVySGFuZGxlcjo6T25UYWdEYXRhKENYRkFfU0FYQ29udGV4dCogcFRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1NBWEl0ZW06OlR5cGUgZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXJ0UG9zKSB7Ci0gIGlmICghcFRhZykKLSAgICByZXR1cm47Ci0KLSAgQ0ZYX0J5dGVUZXh0QnVmJiB0ZXh0QnVmID0gcFRhZy0+bV9UZXh0QnVmOwotICBpZiAoZVR5cGUgPT0gQ0ZYX1NBWEl0ZW06OlR5cGU6OkNoYXJEYXRhKQotICAgIHRleHRCdWYgPDwgIjwhW0NEQVRBWyI7Ci0KLSAgdGV4dEJ1ZiA8PCBic0RhdGE7Ci0gIGlmIChlVHlwZSA9PSBDRlhfU0FYSXRlbTo6VHlwZTo6Q2hhckRhdGEpCi0gICAgdGV4dEJ1ZiA8PCAiXV0+IjsKLX0KLQotdm9pZCBDWEZBX1NBWFJlYWRlckhhbmRsZXI6Ok9uVGFnQ2xvc2UoQ1hGQV9TQVhDb250ZXh0KiBwVGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdFbmRQb3MpIHsKLSAgaWYgKCFwVGFnKQotICAgIHJldHVybjsKLQotICBDRlhfQnl0ZVRleHRCdWYmIHRleHRCdWYgPSBwVGFnLT5tX1RleHRCdWY7Ci0gIGlmIChwVGFnLT5tX2VOb2RlID09IENGWF9TQVhJdGVtOjpUeXBlOjpJbnN0cnVjdGlvbikKLSAgICB0ZXh0QnVmIDw8ICI/PiI7Ci0gIGVsc2UgaWYgKHBUYWctPm1fZU5vZGUgPT0gQ0ZYX1NBWEl0ZW06OlR5cGU6OlRhZykKLSAgICB0ZXh0QnVmIDw8ICI+PC8iIDw8IHBUYWctPm1fYnNUYWdOYW1lLkFzU3RyaW5nQygpIDw8ICI+IjsKLQotICBVcGRhdGVDaGVja3N1bShmYWxzZSk7Ci19Ci0KLXZvaWQgQ1hGQV9TQVhSZWFkZXJIYW5kbGVyOjpPblRhZ0VuZChDWEZBX1NBWENvbnRleHQqIHBUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1RhZ05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdFbmRQb3MpIHsKLSAgaWYgKCFwVGFnKQotICAgIHJldHVybjsKLQotICBwVGFnLT5tX1RleHRCdWYgPDwgIjwvIiA8PCBic1RhZ05hbWUgPDwgIj4iOwotICBVcGRhdGVDaGVja3N1bShmYWxzZSk7Ci19Ci0KLXZvaWQgQ1hGQV9TQVhSZWFkZXJIYW5kbGVyOjpPblRhcmdldERhdGEoQ1hGQV9TQVhDb250ZXh0KiBwVGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfU0FYSXRlbTo6VHlwZSBlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhcnRQb3MpIHsKLSAgaWYgKCFwVGFnICYmIGVUeXBlICE9IENGWF9TQVhJdGVtOjpUeXBlOjpDb21tZW50KQotICAgIHJldHVybjsKLQotICBpZiAoZVR5cGUgPT0gQ0ZYX1NBWEl0ZW06OlR5cGU6OkNvbW1lbnQpIHsKLSAgICBtX1NBWENvbnRleHQubV9UZXh0QnVmIDw8ICI8IS0tIiA8PCBic0RhdGEgPDwgIi0tPiI7Ci0gICAgVXBkYXRlQ2hlY2tzdW0oZmFsc2UpOwotICB9IGVsc2UgewotICAgIHBUYWctPm1fVGV4dEJ1ZiA8PCAiICIgPDwgYnNEYXRhOwotICB9Ci19Ci0KLXZvaWQgQ1hGQV9TQVhSZWFkZXJIYW5kbGVyOjpVcGRhdGVDaGVja3N1bShib29sIGJDaGVja1NwYWNlKSB7Ci0gIGludDMyX3QgaUxlbmd0aCA9IG1fU0FYQ29udGV4dC5tX1RleHRCdWYuR2V0TGVuZ3RoKCk7Ci0gIGlmIChpTGVuZ3RoIDwgMSkgewotICAgIHJldHVybjsKLSAgfQotICB1aW50OF90KiBwQnVmZmVyID0gbV9TQVhDb250ZXh0Lm1fVGV4dEJ1Zi5HZXRCdWZmZXIoKTsKLSAgYm9vbCBiVXBkYXRhID0gdHJ1ZTsKLSAgaWYgKGJDaGVja1NwYWNlKSB7Ci0gICAgYlVwZGF0YSA9IGZhbHNlOwotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGg7IGkrKykgewotICAgICAgYlVwZGF0YSA9IChwQnVmZmVyW2ldID4gMHgyMCk7Ci0gICAgICBpZiAoYlVwZGF0YSkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaWYgKGJVcGRhdGEpIHsKLSAgICBtX3BDb250ZXh0LT5VcGRhdGUoQ0ZYX0J5dGVTdHJpbmdDKHBCdWZmZXIsIGlMZW5ndGgpKTsKLSAgfQotICBtX1NBWENvbnRleHQubV9UZXh0QnVmLkNsZWFyKCk7Ci19Ci0KLUNYRkFfQ2hlY2tzdW1Db250ZXh0OjpDWEZBX0NoZWNrc3VtQ29udGV4dCgpIHt9Ci0KLUNYRkFfQ2hlY2tzdW1Db250ZXh0Ojp+Q1hGQV9DaGVja3N1bUNvbnRleHQoKSB7fQotCi12b2lkIENYRkFfQ2hlY2tzdW1Db250ZXh0OjpTdGFydENoZWNrc3VtKCkgewotICBGaW5pc2hDaGVja3N1bSgpOwotICBtX3BCeXRlQ29udGV4dCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUllQVF9zaGExX2NvbnRleHQ+KCk7Ci0gIENSWVBUX1NIQTFTdGFydChtX3BCeXRlQ29udGV4dC5nZXQoKSk7Ci0gIG1fYnNDaGVja3N1bS5jbGVhcigpOwotICBtX3BTQVhSZWFkZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX1NBWFJlYWRlcj4oKTsKLX0KLQotYm9vbCBDWEZBX0NoZWNrc3VtQ29udGV4dDo6VXBkYXRlQ2hlY2tzdW0oCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcFNyY0ZpbGUsCi0gICAgRlhfRklMRVNJWkUgb2Zmc2V0LAotICAgIHNpemVfdCBzaXplKSB7Ci0gIGlmICghbV9wU0FYUmVhZGVyIHx8ICFwU3JjRmlsZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHNpemUgPCAxKQotICAgIHNpemUgPSBwU3JjRmlsZS0+R2V0U2l6ZSgpOwotCi0gIENYRkFfU0FYUmVhZGVySGFuZGxlciBoYW5kbGVyKHRoaXMpOwotICBtX3BTQVhSZWFkZXItPlNldEhhbmRsZXIoJmhhbmRsZXIpOwotICBpZiAobV9wU0FYUmVhZGVyLT5TdGFydFBhcnNlKAotICAgICAgICAgIHBTcmNGaWxlLCAodWludDMyX3Qpb2Zmc2V0LCAodWludDMyX3Qpc2l6ZSwKLSAgICAgICAgICBDRlhfU2F4UGFyc2VNb2RlX05vdFNraXBTcGFjZSB8IENGWF9TYXhQYXJzZU1vZGVfTm90Q29udmVydF9hbXAgfAotICAgICAgICAgICAgICBDRlhfU2F4UGFyc2VNb2RlX05vdENvbnZlcnRfbHQgfCBDRlhfU2F4UGFyc2VNb2RlX05vdENvbnZlcnRfZ3QgfAotICAgICAgICAgICAgICBDRlhfU2F4UGFyc2VNb2RlX05vdENvbnZlcnRfc2hhcnApIDwgMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gbV9wU0FYUmVhZGVyLT5Db250aW51ZVBhcnNlKG51bGxwdHIpID4gOTk7Ci19Ci0KLXZvaWQgQ1hGQV9DaGVja3N1bUNvbnRleHQ6OkZpbmlzaENoZWNrc3VtKCkgewotICBtX3BTQVhSZWFkZXIucmVzZXQoKTsKLSAgaWYgKG1fcEJ5dGVDb250ZXh0KSB7Ci0gICAgdWludDhfdCBkaWdlc3RbMjBdOwotICAgIEZYU1lTX21lbXNldChkaWdlc3QsIDAsIDIwKTsKLSAgICBDUllQVF9TSEExRmluaXNoKG1fcEJ5dGVDb250ZXh0LmdldCgpLCBkaWdlc3QpOwotICAgIGludDMyX3QgbkxlbiA9IEJhc2U2NEVuY29kZUEoZGlnZXN0LCAyMCwgbnVsbHB0cik7Ci0gICAgRlhfQ0hBUiogcEJ1ZmZlciA9IG1fYnNDaGVja3N1bS5HZXRCdWZmZXIobkxlbik7Ci0gICAgQmFzZTY0RW5jb2RlQShkaWdlc3QsIDIwLCBwQnVmZmVyKTsKLSAgICBtX2JzQ2hlY2tzdW0uUmVsZWFzZUJ1ZmZlcihuTGVuKTsKLSAgICBtX3BCeXRlQ29udGV4dC5yZXNldCgpOwotICB9Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENYRkFfQ2hlY2tzdW1Db250ZXh0OjpHZXRDaGVja3N1bSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fYnNDaGVja3N1bTsKLX0KLQotdm9pZCBDWEZBX0NoZWNrc3VtQ29udGV4dDo6VXBkYXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNUZXh0KSB7Ci0gIGlmICghbV9wQnl0ZUNvbnRleHQpCi0gICAgcmV0dXJuOwotCi0gIENSWVBUX1NIQTFVcGRhdGUobV9wQnl0ZUNvbnRleHQuZ2V0KCksIGJzVGV4dC5yYXdfc3RyKCksIGJzVGV4dC5HZXRMZW5ndGgoKSk7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAveGZhX2ZmYXBwLmNwcCBiL3hmYS9meGZhL2FwcC94ZmFfZmZhcHAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTlmMDZlLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfZmZhcHAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmFwcC5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9jZmdhc19mb250bWdyLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX25vdGVkcml2ZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfd2lkZ2V0bWdyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9md2xhZGFwdGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9md2x0aGVtZS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmRvYy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmRvY2hhbmRsZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZ3aWRnZXRoYW5kbGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZvbnRtZ3IuaCIKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgQ1hGQV9GaWxlUmVhZCA6IHB1YmxpYyBJRlhfU2Vla2FibGVSZWFkU3RyZWFtIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfRmlsZVJlYWQoY29uc3Qgc3RkOjp2ZWN0b3I8Q1BERl9TdHJlYW0qPiYgc3RyZWFtcyk7Ci0gIH5DWEZBX0ZpbGVSZWFkKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gSUZYX1NlZWthYmxlUmVhZFN0cmVhbQotICBGWF9GSUxFU0laRSBHZXRTaXplKCkgb3ZlcnJpZGU7Ci0gIGJvb2wgUmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1BERl9TdHJlYW1BY2M+PiBtX0RhdGE7Ci19OwotCi1DWEZBX0ZpbGVSZWFkOjpDWEZBX0ZpbGVSZWFkKGNvbnN0IHN0ZDo6dmVjdG9yPENQREZfU3RyZWFtKj4mIHN0cmVhbXMpIHsKLSAgZm9yIChDUERGX1N0cmVhbSogcFN0cmVhbSA6IHN0cmVhbXMpIHsKLSAgICBtX0RhdGEucHVzaF9iYWNrKHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmVhbUFjYz4oKSk7Ci0gICAgbV9EYXRhLmJhY2soKS0+TG9hZEFsbERhdGEocFN0cmVhbSk7Ci0gIH0KLX0KLQotQ1hGQV9GaWxlUmVhZDo6fkNYRkFfRmlsZVJlYWQoKSB7fQotCi1GWF9GSUxFU0laRSBDWEZBX0ZpbGVSZWFkOjpHZXRTaXplKCkgewotICB1aW50MzJfdCBkd1NpemUgPSAwOwotICBmb3IgKGNvbnN0IGF1dG8mIGFjYyA6IG1fRGF0YSkKLSAgICBkd1NpemUgKz0gYWNjLT5HZXRTaXplKCk7Ci0gIHJldHVybiBkd1NpemU7Ci19Ci0KLWJvb2wgQ1hGQV9GaWxlUmVhZDo6UmVhZEJsb2NrKHZvaWQqIGJ1ZmZlciwgRlhfRklMRVNJWkUgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewotICBpbnQzMl90IGlDb3VudCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9EYXRhKTsKLSAgaW50MzJfdCBpbmRleCA9IDA7Ci0gIHdoaWxlIChpbmRleCA8IGlDb3VudCkgewotICAgIGNvbnN0IGF1dG8mIGFjYyA9IG1fRGF0YVtpbmRleF07Ci0gICAgRlhfRklMRVNJWkUgZHdTaXplID0gYWNjLT5HZXRTaXplKCk7Ci0gICAgaWYgKG9mZnNldCA8IGR3U2l6ZSkKLSAgICAgIGJyZWFrOwotCi0gICAgb2Zmc2V0IC09IGR3U2l6ZTsKLSAgICBpbmRleCsrOwotICB9Ci0gIHdoaWxlIChpbmRleCA8IGlDb3VudCkgewotICAgIGNvbnN0IGF1dG8mIGFjYyA9IG1fRGF0YVtpbmRleF07Ci0gICAgdWludDMyX3QgZHdTaXplID0gYWNjLT5HZXRTaXplKCk7Ci0gICAgc2l6ZV90IGR3UmVhZCA9IHN0ZDo6bWluKHNpemUsIHN0YXRpY19jYXN0PHNpemVfdD4oZHdTaXplIC0gb2Zmc2V0KSk7Ci0gICAgRlhTWVNfbWVtY3B5KGJ1ZmZlciwgYWNjLT5HZXREYXRhKCkgKyBvZmZzZXQsIGR3UmVhZCk7Ci0gICAgc2l6ZSAtPSBkd1JlYWQ7Ci0gICAgaWYgKHNpemUgPT0gMCkKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgYnVmZmVyID0gKHVpbnQ4X3QqKWJ1ZmZlciArIGR3UmVhZDsKLSAgICBvZmZzZXQgPSAwOwotICAgIGluZGV4Kys7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBNYWtlU2Vla2FibGVSZWFkU3RyZWFtKAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENQREZfU3RyZWFtKj4mIHN0cmVhbXMpIHsKLSAgcmV0dXJuIENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4obmV3IENYRkFfRmlsZVJlYWQoc3RyZWFtcykpOwotfQotCi1DWEZBX0ZGQXBwOjpDWEZBX0ZGQXBwKElYRkFfQXBwUHJvdmlkZXIqIHBQcm92aWRlcikKLSAgICA6IG1fcFByb3ZpZGVyKHBQcm92aWRlciksCi0gICAgICBtX3BXaWRnZXRNZ3JEZWxlZ2F0ZShudWxscHRyKSwKLSAgICAgIG1fcEZXTEFwcChuZXcgQ0ZXTF9BcHAodGhpcykpIHt9Ci0KLUNYRkFfRkZBcHA6On5DWEZBX0ZGQXBwKCkge30KLQotQ1hGQV9GRkRvY0hhbmRsZXIqIENYRkFfRkZBcHA6OkdldERvY0hhbmRsZXIoKSB7Ci0gIGlmICghbV9wRG9jSGFuZGxlcikKLSAgICBtX3BEb2NIYW5kbGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRkZEb2NIYW5kbGVyPigpOwotICByZXR1cm4gbV9wRG9jSGFuZGxlci5nZXQoKTsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPENYRkFfRkZEb2M+IENYRkFfRkZBcHA6OkNyZWF0ZURvYygKLSAgICBJWEZBX0RvY0Vudmlyb25tZW50KiBwRG9jRW52aXJvbm1lbnQsCi0gICAgQ1BERl9Eb2N1bWVudCogcFBERkRvYykgewotICBpZiAoIXBQREZEb2MpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgYXV0byBwRG9jID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRkZEb2M+KHRoaXMsIHBEb2NFbnZpcm9ubWVudCk7Ci0gIGlmICghcERvYy0+T3BlbkRvYyhwUERGRG9jKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICByZXR1cm4gcERvYzsKLX0KLQotdm9pZCBDWEZBX0ZGQXBwOjpTZXREZWZhdWx0Rm9udE1ncihzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9EZWZGb250TWdyPiBwRm9udE1ncikgewotICBpZiAoIW1fcEZvbnRNZ3IpCi0gICAgbV9wRm9udE1nciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZvbnRNZ3I+KCk7Ci0gIG1fcEZvbnRNZ3ItPlNldERlZkZvbnRNZ3Ioc3RkOjptb3ZlKHBGb250TWdyKSk7Ci19Ci0KLUNYRkFfRm9udE1nciogQ1hGQV9GRkFwcDo6R2V0WEZBRm9udE1ncigpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcEZvbnRNZ3IuZ2V0KCk7Ci19Ci0KLUNGR0FTX0ZvbnRNZ3IqIENYRkFfRkZBcHA6OkdldEZERUZvbnRNZ3IoKSB7Ci0gIGlmICghbV9wRkRFRm9udE1ncikgewotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgICBtX3BGREVGb250TWdyID0gQ0ZHQVNfRm9udE1ncjo6Q3JlYXRlKEZYX0dldERlZkZvbnRFbnVtZXJhdG9yKCkpOwotI2Vsc2UKLSAgICBtX3BGb250U291cmNlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9Gb250U291cmNlRW51bV9GaWxlPigpOwotICAgIG1fcEZERUZvbnRNZ3IgPSBDRkdBU19Gb250TWdyOjpDcmVhdGUobV9wRm9udFNvdXJjZS5nZXQoKSk7Ci0jZW5kaWYKLSAgfQotICByZXR1cm4gbV9wRkRFRm9udE1nci5nZXQoKTsKLX0KLQotQ1hGQV9GV0xUaGVtZSogQ1hGQV9GRkFwcDo6R2V0RldMVGhlbWUoKSB7Ci0gIGlmICghbV9wRldMVGhlbWUpCi0gICAgbV9wRldMVGhlbWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GV0xUaGVtZT4odGhpcyk7Ci0gIHJldHVybiBtX3BGV0xUaGVtZS5nZXQoKTsKLX0KLQotQ1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyKiBDWEZBX0ZGQXBwOjpHZXRXaWRnZXRNZ3IoCi0gICAgQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZSogcERlbGVnYXRlKSB7Ci0gIGlmICghbV9wQWRhcHRlcldpZGdldE1ncikgewotICAgIG1fcEFkYXB0ZXJXaWRnZXRNZ3IgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyPigpOwotICAgIHBEZWxlZ2F0ZS0+T25TZXRDYXBhYmlsaXR5KEZXTF9XR1RNR1JfRGlzYWJsZUZvcm0pOwotICAgIG1fcFdpZGdldE1nckRlbGVnYXRlID0gcERlbGVnYXRlOwotICB9Ci0gIHJldHVybiBtX3BBZGFwdGVyV2lkZ2V0TWdyLmdldCgpOwotfQotCi1JRldMX0FkYXB0ZXJUaW1lck1nciogQ1hGQV9GRkFwcDo6R2V0VGltZXJNZ3IoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BQcm92aWRlci0+R2V0VGltZXJNZ3IoKTsKLX0KLQotdm9pZCBDWEZBX0ZGQXBwOjpDbGVhckV2ZW50VGFyZ2V0cygpIHsKLSAgbV9wRldMQXBwLT5HZXROb3RlRHJpdmVyKCktPkNsZWFyRXZlbnRUYXJnZXRzKGZhbHNlKTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2FwcC94ZmFfZmZhcHBfdW5pdHRlc3QuY3BwIGIveGZhL2Z4ZmEvYXBwL3hmYV9mZmFwcF91bml0dGVzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwODc5MDEuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvYXBwL3hmYV9mZmFwcF91bml0dGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZhcHAuaCIKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zdHJlYW0uaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLQotVEVTVChDWEZBRmlsZVJlYWQsIE5vU3RyZWFtcykgewotICBzdGQ6OnZlY3RvcjxDUERGX1N0cmVhbSo+IHN0cmVhbXM7Ci0gIENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gZmlsZXJlYWQgPQotICAgICAgTWFrZVNlZWthYmxlUmVhZFN0cmVhbShzdHJlYW1zKTsKLQotICB1aW50OF90IG91dHB1dF9idWZmZXJbMTZdOwotICBtZW1zZXQob3V0cHV0X2J1ZmZlciwgMHhiZCwgc2l6ZW9mKG91dHB1dF9idWZmZXIpKTsKLSAgRVhQRUNUX0ZBTFNFKGZpbGVyZWFkLT5SZWFkQmxvY2sob3V0cHV0X2J1ZmZlciwgMCwgMCkpOwotICBFWFBFQ1RfRVEoMHhiZCwgb3V0cHV0X2J1ZmZlclswXSk7Ci19Ci0KLVRFU1QoQ1hGQUZpbGVSZWFkLCBFbXB0eVN0cmVhbXMpIHsKLSAgc3RkOjp2ZWN0b3I8Q1BERl9TdHJlYW0qPiBzdHJlYW1zOwotICBhdXRvIHN0cmVhbTEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJlYW0+KCk7Ci0gIHN0cmVhbXMucHVzaF9iYWNrKHN0cmVhbTEuZ2V0KCkpOwotICBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IGZpbGVyZWFkID0KLSAgICAgIE1ha2VTZWVrYWJsZVJlYWRTdHJlYW0oc3RyZWFtcyk7Ci0KLSAgdWludDhfdCBvdXRwdXRfYnVmZmVyWzE2XTsKLSAgbWVtc2V0KG91dHB1dF9idWZmZXIsIDB4YmQsIHNpemVvZihvdXRwdXRfYnVmZmVyKSk7Ci0gIEVYUEVDVF9GQUxTRShmaWxlcmVhZC0+UmVhZEJsb2NrKG91dHB1dF9idWZmZXIsIDAsIDApKTsKLSAgRVhQRUNUX0VRKDB4YmQsIG91dHB1dF9idWZmZXJbMF0pOwotfQotCi1URVNUKENYRkFGaWxlUmVhZCwgTm9ybWFsU3RyZWFtcykgewotICBzdGQ6OnZlY3RvcjxDUERGX1N0cmVhbSo+IHN0cmVhbXM7Ci0gIGF1dG8gc3RyZWFtMSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmVhbT4oKTsKLSAgYXV0byBzdHJlYW0yID0gcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfU3RyZWFtPigpOwotICBhdXRvIHN0cmVhbTMgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1BERl9TdHJlYW0+KCk7Ci0KLSAgLy8gMTYgY2hhcnMgdG90YWwuCi0gIHN0cmVhbTEtPkluaXRTdHJlYW0ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oIm9uZSB0IiksIDUsCi0gICAgICAgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENQREZfRGljdGlvbmFyeT4oKSk7Ci0gIHN0cmVhbTItPkluaXRTdHJlYW0ocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oIndvICIpLCAzLAotICAgICAgICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCkpOwotICBzdHJlYW0zLT5Jbml0U3RyZWFtKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCJ0aHJlZSEhISIpLCA4LAotICAgICAgICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX0RpY3Rpb25hcnk+KCkpOwotCi0gIHN0cmVhbXMucHVzaF9iYWNrKHN0cmVhbTEuZ2V0KCkpOwotICBzdHJlYW1zLnB1c2hfYmFjayhzdHJlYW0yLmdldCgpKTsKLSAgc3RyZWFtcy5wdXNoX2JhY2soc3RyZWFtMy5nZXQoKSk7Ci0gIENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gZmlsZXJlYWQgPQotICAgICAgTWFrZVNlZWthYmxlUmVhZFN0cmVhbShzdHJlYW1zKTsKLQotICB1aW50OF90IG91dHB1dF9idWZmZXJbMTZdOwotICBtZW1zZXQob3V0cHV0X2J1ZmZlciwgMHhiZCwgc2l6ZW9mKG91dHB1dF9idWZmZXIpKTsKLSAgRVhQRUNUX1RSVUUoZmlsZXJlYWQtPlJlYWRCbG9jayhvdXRwdXRfYnVmZmVyLCAwLCAwKSk7Ci0gIEVYUEVDVF9FUSgweGJkLCBvdXRwdXRfYnVmZmVyWzBdKTsKLQotICBtZW1zZXQob3V0cHV0X2J1ZmZlciwgMHhiZCwgc2l6ZW9mKG91dHB1dF9idWZmZXIpKTsKLSAgRVhQRUNUX1RSVUUoZmlsZXJlYWQtPlJlYWRCbG9jayhvdXRwdXRfYnVmZmVyLCAxLCAwKSk7Ci0gIEVYUEVDVF9FUSgweGJkLCBvdXRwdXRfYnVmZmVyWzBdKTsKLQotICBtZW1zZXQob3V0cHV0X2J1ZmZlciwgMHhiZCwgc2l6ZW9mKG91dHB1dF9idWZmZXIpKTsKLSAgRVhQRUNUX1RSVUUoZmlsZXJlYWQtPlJlYWRCbG9jayhvdXRwdXRfYnVmZmVyLCAwLCAxKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZW1jbXAob3V0cHV0X2J1ZmZlciwgIm8iLCAxKSk7Ci0gIEVYUEVDVF9FUSgweGJkLCBvdXRwdXRfYnVmZmVyWzFdKTsKLQotICBtZW1zZXQob3V0cHV0X2J1ZmZlciwgMHhiZCwgc2l6ZW9mKG91dHB1dF9idWZmZXIpKTsKLSAgRVhQRUNUX1RSVUUoZmlsZXJlYWQtPlJlYWRCbG9jayhvdXRwdXRfYnVmZmVyLCAwLCBzaXplb2Yob3V0cHV0X2J1ZmZlcikpKTsKLSAgRVhQRUNUX0VRKDAsIG1lbWNtcChvdXRwdXRfYnVmZmVyLCAib25lIHR3byB0aHJlZSEhISIsIDE2KSk7Ci0KLSAgbWVtc2V0KG91dHB1dF9idWZmZXIsIDB4YmQsIHNpemVvZihvdXRwdXRfYnVmZmVyKSk7Ci0gIEVYUEVDVF9UUlVFKGZpbGVyZWFkLT5SZWFkQmxvY2sob3V0cHV0X2J1ZmZlciwgMiwgMTApKTsKLSAgRVhQRUNUX0VRKDAsIG1lbWNtcChvdXRwdXRfYnVmZmVyLCAiZSB0d28gdGhyZSIsIDEwKSk7Ci0gIEVYUEVDVF9FUSgweGJkLCBvdXRwdXRfYnVmZmVyWzExXSk7Ci0KLSAgbWVtc2V0KG91dHB1dF9idWZmZXIsIDB4YmQsIHNpemVvZihvdXRwdXRfYnVmZmVyKSk7Ci0gIEVYUEVDVF9GQUxTRShmaWxlcmVhZC0+UmVhZEJsb2NrKG91dHB1dF9idWZmZXIsIDEsIHNpemVvZihvdXRwdXRfYnVmZmVyKSkpOwotICBFWFBFQ1RfRVEoMCwgbWVtY21wKG91dHB1dF9idWZmZXIsICJuZSB0d28gdGhyZWUhISEiLCAxNSkpOwotICBFWFBFQ1RfRVEoMHhiZCwgb3V0cHV0X2J1ZmZlclsxNV0pOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL3hmYV9mZmJhcmNvZGUuY3BwIGIveGZhL2Z4ZmEvYXBwL3hmYV9mZmJhcmNvZGUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTM2YjhkLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfZmZiYXJjb2RlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIzOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmYmFyY29kZS5oIgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9leHQuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfYXBwLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX2JhcmNvZGUuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfbm90ZWRyaXZlci5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZmaWVsZC5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZ0ZXh0ZWRpdC5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZndsYWRhcHRlci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZnBhZ2V2aWV3LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0LmgiCi0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IFhGQV9CQVJDT0RFVFlQRUVOVU1JTkZPIGdfWEZBQmFyQ29kZVR5cGVFbnVtRGF0YVtdID0gewotICAgIHsweDdmYjRhMTgsIEwiZWFuMTMiLCBYRkFfQkFSQ09ERVRZUEVfZWFuMTMsIEJDX0VBTjEzfSwKLSAgICB7MHg4ZDEzYTNkLCBMImNvZGUxMSIsIFhGQV9CQVJDT0RFVFlQRV9jb2RlMTEsIEJDX1VOS05PV059LAotICAgIHsweDhkMTQ5YTgsIEwiY29kZTQ5IiwgWEZBX0JBUkNPREVUWVBFX2NvZGU0OSwgQkNfVU5LTk9XTn0sCi0gICAgezB4OGQxNjM0NywgTCJjb2RlOTMiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTkzLCBCQ19VTktOT1dOfSwKLSAgICB7MHg5MWE5MmUyLCBMInVwc01heGljb2RlIiwgWEZBX0JBUkNPREVUWVBFX3Vwc01heGljb2RlLCBCQ19VTktOT1dOfSwKLSAgICB7MHhhN2Q0OGRjLCBMImZpbSIsIFhGQV9CQVJDT0RFVFlQRV9maW0sIEJDX1VOS05PV059LAotICAgIHsweGIzNTlmZTksIEwibXNpIiwgWEZBX0JBUkNPREVUWVBFX21zaSwgQkNfVU5LTk9XTn0sCi0gICAgezB4MTIxZjczOGMsIEwiY29kZTJPZjVNYXRyaXgiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTJPZjVNYXRyaXgsIEJDX1VOS05PV059LAotICAgIHsweDE1MzU4NjE2LCBMInVjYzEyOCIsIFhGQV9CQVJDT0RFVFlQRV91Y2MxMjgsIEJDX1VOS05PV059LAotICAgIHsweDFmNGJmYTA1LCBMInJmaWQiLCBYRkFfQkFSQ09ERVRZUEVfcmZpZCwgQkNfVU5LTk9XTn0sCi0gICAgezB4MWZkYTcxYmMsIEwicnNzMTRTdGFja2VkIiwgWEZBX0JBUkNPREVUWVBFX3JzczE0U3RhY2tlZCwgQkNfVU5LTk9XTn0sCi0gICAgezB4MjIwNjUwODcsIEwiZWFuOGFkZDIiLCBYRkFfQkFSQ09ERVRZUEVfZWFuOGFkZDIsIEJDX1VOS05PV059LAotICAgIHsweDIyMDY1MDhhLCBMImVhbjhhZGQ1IiwgWEZBX0JBUkNPREVUWVBFX2VhbjhhZGQ1LCBCQ19VTktOT1dOfSwKLSAgICB7MHgyMjc4MzY2YywgTCJjb2RhYmFyIiwgWEZBX0JBUkNPREVUWVBFX2NvZGFiYXIsIEJDX0NPREFCQVJ9LAotICAgIHsweDJhMDM5YThkLCBMInRlbGVwZW4iLCBYRkFfQkFSQ09ERVRZUEVfdGVsZXBlbiwgQkNfVU5LTk9XTn0sCi0gICAgezB4MzIzZWQzMzcsIEwidXBjQXB3Y2QiLCBYRkFfQkFSQ09ERVRZUEVfdXBjQXB3Y2QsIEJDX1VOS05PV059LAotICAgIHsweDM0N2ExODQ2LCBMInBvc3RVU0lNQiIsIFhGQV9CQVJDT0RFVFlQRV9wb3N0VVNJTUIsIEJDX1VOS05PV059LAotICAgIHsweDM5MWJiODM2LCBMImNvZGUxMjgiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTEyOCwgQkNfQ09ERTEyOH0sCi0gICAgezB4Mzk4ZWRkYWYsIEwiZGF0YU1hdHJpeCIsIFhGQV9CQVJDT0RFVFlQRV9kYXRhTWF0cml4LCBCQ19EQVRBTUFUUklYfSwKLSAgICB7MHgzY2ZmNjBhOCwgTCJ1cGNFYWRkMiIsIFhGQV9CQVJDT0RFVFlQRV91cGNFYWRkMiwgQkNfVU5LTk9XTn0sCi0gICAgezB4M2NmZjYwYWIsIEwidXBjRWFkZDUiLCBYRkFfQkFSQ09ERVRZUEVfdXBjRWFkZDUsIEJDX1VOS05PV059LAotICAgIHsweDQwMmNiMTg4LCBMImNvZGUyT2Y1U3RhbmRhcmQiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTJPZjVTdGFuZGFyZCwKLSAgICAgQkNfVU5LTk9XTn0sCi0gICAgezB4NDExNzY0ZjcsIEwiYXp0ZWMiLCBYRkFfQkFSQ09ERVRZUEVfYXp0ZWMsIEJDX1VOS05PV059LAotICAgIHsweDQ0ZDRlODRjLCBMImVhbjgiLCBYRkFfQkFSQ09ERVRZUEVfZWFuOCwgQkNfRUFOOH0sCi0gICAgezB4NDg0Njg5MDIsIEwidWNjMTI4c3NjYyIsIFhGQV9CQVJDT0RFVFlQRV91Y2MxMjhzc2NjLCBCQ19VTktOT1dOfSwKLSAgICB7MHg0ODgwYWVhNCwgTCJ1cGNBYWRkMiIsIFhGQV9CQVJDT0RFVFlQRV91cGNBYWRkMiwgQkNfVU5LTk9XTn0sCi0gICAgezB4NDg4MGFlYTcsIEwidXBjQWFkZDUiLCBYRkFfQkFSQ09ERVRZUEVfdXBjQWFkZDUsIEJDX1VOS05PV059LAotICAgIHsweDU0ZjE4MjU2LCBMImNvZGUyT2Y1SW5kdXN0cmlhbCIsIFhGQV9CQVJDT0RFVFlQRV9jb2RlMk9mNUluZHVzdHJpYWwsCi0gICAgIEJDX1VOS05PV059LAotICAgIHsweDU4ZTE1ZjI1LCBMInJzczE0TGltaXRlZCIsIFhGQV9CQVJDT0RFVFlQRV9yc3MxNExpbWl0ZWQsIEJDX1VOS05PV059LAotICAgIHsweDVjMDhkMWI5LCBMInBvc3RBVVNSZXBseVBhaWQiLCBYRkFfQkFSQ09ERVRZUEVfcG9zdEFVU1JlcGx5UGFpZCwKLSAgICAgQkNfVU5LTk9XTn0sCi0gICAgezB4NWZhNzAwYmQsIEwicnNzMTQiLCBYRkFfQkFSQ09ERVRZUEVfcnNzMTQsIEJDX1VOS05PV059LAotICAgIHsweDYzMWE3ZTM1LCBMImxvZ21hcnMiLCBYRkFfQkFSQ09ERVRZUEVfbG9nbWFycywgQkNfVU5LTk9XTn0sCi0gICAgezB4NmEyMzYyMzYsIEwicGRmNDE3IiwgWEZBX0JBUkNPREVUWVBFX3BkZjQxNywgQkNfUERGNDE3fSwKLSAgICB7MHg2ZDA5OGVjZSwgTCJ1cGNlYW4yIiwgWEZBX0JBUkNPREVUWVBFX3VwY2VhbjIsIEJDX1VOS05PV059LAotICAgIHsweDZkMDk4ZWQxLCBMInVwY2VhbjUiLCBYRkFfQkFSQ09ERVRZUEVfdXBjZWFuNSwgQkNfVU5LTk9XTn0sCi0gICAgezB4NzZiMDRlZWQsIEwiY29kZTNPZjlleHRlbmRlZCIsIFhGQV9CQVJDT0RFVFlQRV9jb2RlM09mOWV4dGVuZGVkLAotICAgICBCQ19VTktOT1dOfSwKLSAgICB7MHg3YzdkYjg0YSwgTCJtYXhpY29kZSIsIFhGQV9CQVJDT0RFVFlQRV9tYXhpY29kZSwgQkNfVU5LTk9XTn0sCi0gICAgezB4ODI2NmY3ZjcsIEwidWNjMTI4cmFuZG9tIiwgWEZBX0JBUkNPREVUWVBFX3VjYzEyOHJhbmRvbSwgQkNfVU5LTk9XTn0sCi0gICAgezB4ODNlY2ExNDcsIEwicG9zdFVTRFBCQyIsIFhGQV9CQVJDT0RFVFlQRV9wb3N0VVNEUEJDLCBCQ19VTktOT1dOfSwKLSAgICB7MHg4ZGQ3MWRlMCwgTCJwb3N0QVVTU3RhbmRhcmQiLCBYRkFfQkFSQ09ERVRZUEVfcG9zdEFVU1N0YW5kYXJkLAotICAgICBCQ19VTktOT1dOfSwKLSAgICB7MHg5OGFkYWQ4NSwgTCJwbGVzc2V5IiwgWEZBX0JBUkNPREVUWVBFX3BsZXNzZXksIEJDX1VOS05PV059LAotICAgIHsweDlmODRjY2U2LCBMImVhbjEzcHdjZCIsIFhGQV9CQVJDT0RFVFlQRV9lYW4xM3B3Y2QsIEJDX1VOS05PV059LAotICAgIHsweGI1MTRmYmU5LCBMInVwY0EiLCBYRkFfQkFSQ09ERVRZUEVfdXBjQSwgQkNfVVBDQX0sCi0gICAgezB4YjUxNGZiZWQsIEwidXBjRSIsIFhGQV9CQVJDT0RFVFlQRV91cGNFLCBCQ19VTktOT1dOfSwKLSAgICB7MHhiNWM2YTg1MywgTCJlYW4xM2FkZDIiLCBYRkFfQkFSQ09ERVRZUEVfZWFuMTNhZGQyLCBCQ19VTktOT1dOfSwKLSAgICB7MHhiNWM2YTg1NiwgTCJlYW4xM2FkZDUiLCBYRkFfQkFSQ09ERVRZUEVfZWFuMTNhZGQ1LCBCQ19VTktOT1dOfSwKLSAgICB7MHhiODFmYzUxMiwgTCJwb3N0VUtSTTRTQ0MiLCBYRkFfQkFSQ09ERVRZUEVfcG9zdFVLUk00U0NDLCBCQ19VTktOT1dOfSwKLSAgICB7MHhiYWQzNGIyMiwgTCJjb2RlMTI4U1NDQyIsIFhGQV9CQVJDT0RFVFlQRV9jb2RlMTI4U1NDQywgQkNfVU5LTk9XTn0sCi0gICAgezB4YmZiZTBjZjYsIEwicG9zdFVTNVppcCIsIFhGQV9CQVJDT0RFVFlQRV9wb3N0VVM1WmlwLCBCQ19VTktOT1dOfSwKLSAgICB7MHhjNTY2MThlOCwgTCJwZGY0MTdtYWNybyIsIFhGQV9CQVJDT0RFVFlQRV9wZGY0MTdtYWNybywgQkNfVU5LTk9XTn0sCi0gICAgezB4Y2E3MzBmOGEsIEwiY29kZTJPZjVJbnRlcmxlYXZlZCIsIFhGQV9CQVJDT0RFVFlQRV9jb2RlMk9mNUludGVybGVhdmVkLAotICAgICBCQ19VTktOT1dOfSwKLSAgICB7MHhkMDA5N2FjNiwgTCJyc3MxNEV4cGFuZGVkIiwgWEZBX0JBUkNPREVUWVBFX3JzczE0RXhwYW5kZWQsIEJDX1VOS05PV059LAotICAgIHsweGQyNWEwMjQwLCBMInBvc3RBVVNDdXN0MiIsIFhGQV9CQVJDT0RFVFlQRV9wb3N0QVVTQ3VzdDIsIEJDX1VOS05PV059LAotICAgIHsweGQyNWEwMjQxLCBMInBvc3RBVVNDdXN0MyIsIFhGQV9CQVJDT0RFVFlQRV9wb3N0QVVTQ3VzdDMsIEJDX1VOS05PV059LAotICAgIHsweGQ1M2VkM2U3LCBMInJzczE0VHJ1bmNhdGVkIiwgWEZBX0JBUkNPREVUWVBFX3JzczE0VHJ1bmNhdGVkLCBCQ19VTktOT1dOfSwKLSAgICB7MHhlNzJiY2Q1NywgTCJjb2RlMTI4QSIsIFhGQV9CQVJDT0RFVFlQRV9jb2RlMTI4QSwgQkNfVU5LTk9XTn0sCi0gICAgezB4ZTcyYmNkNTgsIEwiY29kZTEyOEIiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTEyOEIsIEJDX0NPREUxMjhfQn0sCi0gICAgezB4ZTcyYmNkNTksIEwiY29kZTEyOEMiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTEyOEMsIEJDX0NPREUxMjhfQ30sCi0gICAgezB4ZWU4M2M1MGYsIEwicnNzMTRTdGFja2VkT21uaSIsIFhGQV9CQVJDT0RFVFlQRV9yc3MxNFN0YWNrZWRPbW5pLAotICAgICBCQ19VTktOT1dOfSwKLSAgICB7MHhmMmExOGY3ZSwgTCJRUkNvZGUiLCBYRkFfQkFSQ09ERVRZUEVfUVJDb2RlLCBCQ19RUl9DT0RFfSwKLSAgICB7MHhmYWVhZjM3ZiwgTCJwb3N0VVNTdGFuZGFyZCIsIFhGQV9CQVJDT0RFVFlQRV9wb3N0VVNTdGFuZGFyZCwgQkNfVU5LTk9XTn0sCi0gICAgezB4ZmI0ODE1NWMsIEwiY29kZTNPZjkiLCBYRkFfQkFSQ09ERVRZUEVfY29kZTNPZjksIEJDX0NPREUzOX0sCi19OwotY29uc3QgaW50MzJfdCBnX2lYRkFCYXJjb2RlVHlwZUNvdW50ID0KLSAgICBzaXplb2YoZ19YRkFCYXJDb2RlVHlwZUVudW1EYXRhKSAvIHNpemVvZihYRkFfQkFSQ09ERVRZUEVFTlVNSU5GTyk7Ci0KLWNvbnN0IFhGQV9CQVJDT0RFVFlQRUVOVU1JTkZPKiBYRkFfR2V0QmFyY29kZVR5cGVCeU5hbWUoCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIHsKLSAgaWYgKHdzTmFtZS5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgdWludDMyX3QgdUhhc2ggPSBGWF9IYXNoQ29kZV9HZXRXKHdzTmFtZSwgdHJ1ZSk7Ci0gIGludDMyX3QgaVN0YXJ0ID0gMDsKLSAgaW50MzJfdCBpRW5kID0gZ19pWEZBQmFyY29kZVR5cGVDb3VudCAtIDE7Ci0gIGRvIHsKLSAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOwotICAgIGNvbnN0IFhGQV9CQVJDT0RFVFlQRUVOVU1JTkZPKiBwSW5mbyA9IGdfWEZBQmFyQ29kZVR5cGVFbnVtRGF0YSArIGlNaWQ7Ci0gICAgaWYgKHVIYXNoID09IHBJbmZvLT51SGFzaCkgewotICAgICAgcmV0dXJuIHBJbmZvOwotICAgIH0gZWxzZSBpZiAodUhhc2ggPCBwSW5mby0+dUhhc2gpIHsKLSAgICAgIGlFbmQgPSBpTWlkIC0gMTsKLSAgICB9IGVsc2UgewotICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7Ci0gICAgfQotICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi19ICAvLyBuYW1lc3BhY2UuCi0KLUNYRkFfRkZCYXJjb2RlOjpDWEZBX0ZGQmFyY29kZShDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpCi0gICAgOiBDWEZBX0ZGVGV4dEVkaXQocERhdGFBY2MpIHt9Ci0KLUNYRkFfRkZCYXJjb2RlOjp+Q1hGQV9GRkJhcmNvZGUoKSB7fQotCi1ib29sIENYRkFfRkZCYXJjb2RlOjpMb2FkV2lkZ2V0KCkgewotICBDRldMX0JhcmNvZGUqIHBGV0xCYXJjb2RlID0gbmV3IENGV0xfQmFyY29kZShHZXRGV0xBcHAoKSk7Ci0KLSAgbV9wTm9ybWFsV2lkZ2V0ID0gcEZXTEJhcmNvZGU7Ci0gIG1fcE5vcm1hbFdpZGdldC0+U2V0TGF5b3V0SXRlbSh0aGlzKTsKLSAgQ0ZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9Ci0gICAgICBtX3BOb3JtYWxXaWRnZXQtPkdldE93bmVyQXBwKCktPkdldE5vdGVEcml2ZXIoKTsKLSAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQobV9wTm9ybWFsV2lkZ2V0LCBtX3BOb3JtYWxXaWRnZXQpOwotCi0gIG1fcE9sZERlbGVnYXRlID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXREZWxlZ2F0ZSgpOwotICBtX3BOb3JtYWxXaWRnZXQtPlNldERlbGVnYXRlKHRoaXMpOwotICBtX3BOb3JtYWxXaWRnZXQtPkxvY2tVcGRhdGUoKTsKLQotICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7Ci0gIG1fcERhdGFBY2MtPkdldFZhbHVlKHdzVGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsKLSAgcEZXTEJhcmNvZGUtPlNldFRleHQod3NUZXh0KTsKLSAgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsKLSAgbV9wTm9ybWFsV2lkZ2V0LT5VbmxvY2tVcGRhdGUoKTsKLSAgcmV0dXJuIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpOwotfQotdm9pZCBDWEZBX0ZGQmFyY29kZTo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGF0dXMpIHsKLSAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpCi0gICAgcmV0dXJuOwotCi0gIENGWF9NYXRyaXggbXRSb3RhdGUgPSBHZXRSb3RhdGVNYXRyaXgoKTsKLSAgaWYgKHBNYXRyaXgpCi0gICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsKLQotICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzKTsKLSAgQ1hGQV9Cb3JkZXIgYm9yZGVyVUkgPSBtX3BEYXRhQWNjLT5HZXRVSUJvcmRlcigpOwotICBEcmF3Qm9yZGVyKHBHUywgYm9yZGVyVUksIG1fcnRVSSwgJm10Um90YXRlKTsKLSAgUmVuZGVyQ2FwdGlvbihwR1MsICZtdFJvdGF0ZSk7Ci0gIENGWF9SZWN0RiBydFdpZGdldCA9IG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0UmVjdCgpOwotCi0gIENGWF9NYXRyaXggbXQoMSwgMCwgMCwgMSwgcnRXaWRnZXQubGVmdCwgcnRXaWRnZXQudG9wKTsKLSAgbXQuQ29uY2F0KG10Um90YXRlKTsKLSAgbV9wTm9ybWFsV2lkZ2V0LT5EcmF3V2lkZ2V0KHBHUywgJm10KTsKLX0KLQotdm9pZCBDWEZBX0ZGQmFyY29kZTo6VXBkYXRlV2lkZ2V0UHJvcGVydHkoKSB7Ci0gIENYRkFfRkZUZXh0RWRpdDo6VXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsKLSAgQ0ZXTF9CYXJjb2RlKiBwQmFyQ29kZVdpZGdldCA9IChDRldMX0JhcmNvZGUqKW1fcE5vcm1hbFdpZGdldDsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NUeXBlID0gR2V0RGF0YUFjYygpLT5HZXRCYXJjb2RlVHlwZSgpOwotICBjb25zdCBYRkFfQkFSQ09ERVRZUEVFTlVNSU5GTyogcEJhcmNvZGVUeXBlSW5mbyA9Ci0gICAgICBYRkFfR2V0QmFyY29kZVR5cGVCeU5hbWUod3NUeXBlLkFzU3RyaW5nQygpKTsKLSAgaWYgKCFwQmFyY29kZVR5cGVJbmZvKQotICAgIHJldHVybjsKLQotICBwQmFyQ29kZVdpZGdldC0+U2V0VHlwZShwQmFyY29kZVR5cGVJbmZvLT5lQkNUeXBlKTsKLSAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBHZXREYXRhQWNjKCk7Ci0gIGludDMyX3QgaW50VmFsOwotICBGWF9DSEFSIGNoYXJWYWw7Ci0gIGJvb2wgYm9vbFZhbDsKLSAgRlhfRkxPQVQgZmxvYXRWYWw7Ci0gIGlmIChwQWNjLT5HZXRCYXJjb2RlQXR0cmlidXRlX0NoYXJFbmNvZGluZyhpbnRWYWwpKSB7Ci0gICAgcEJhckNvZGVXaWRnZXQtPlNldENoYXJFbmNvZGluZygoQkNfQ0hBUl9FTkNPRElORylpbnRWYWwpOwotICB9Ci0gIGlmIChwQWNjLT5HZXRCYXJjb2RlQXR0cmlidXRlX0NoZWNrc3VtKGJvb2xWYWwpKSB7Ci0gICAgcEJhckNvZGVXaWRnZXQtPlNldENhbENoZWNrc3VtKGJvb2xWYWwpOwotICB9Ci0gIGlmIChwQWNjLT5HZXRCYXJjb2RlQXR0cmlidXRlX0RhdGFMZW5ndGgoaW50VmFsKSkgewotICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXREYXRhTGVuZ3RoKGludFZhbCk7Ci0gIH0KLSAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfU3RhcnRDaGFyKGNoYXJWYWwpKSB7Ci0gICAgcEJhckNvZGVXaWRnZXQtPlNldFN0YXJ0Q2hhcihjaGFyVmFsKTsKLSAgfQotICBpZiAocEFjYy0+R2V0QmFyY29kZUF0dHJpYnV0ZV9FbmRDaGFyKGNoYXJWYWwpKSB7Ci0gICAgcEJhckNvZGVXaWRnZXQtPlNldEVuZENoYXIoY2hhclZhbCk7Ci0gIH0KLSAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfRUNMZXZlbChpbnRWYWwpKSB7Ci0gICAgcEJhckNvZGVXaWRnZXQtPlNldEVycm9yQ29ycmVjdGlvbkxldmVsKGludFZhbCk7Ci0gIH0KLSAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfTW9kdWxlV2lkdGgoaW50VmFsKSkgewotICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRNb2R1bGVXaWR0aChpbnRWYWwpOwotICB9Ci0gIGlmIChwQWNjLT5HZXRCYXJjb2RlQXR0cmlidXRlX01vZHVsZUhlaWdodChpbnRWYWwpKSB7Ci0gICAgcEJhckNvZGVXaWRnZXQtPlNldE1vZHVsZUhlaWdodChpbnRWYWwpOwotICB9Ci0gIGlmIChwQWNjLT5HZXRCYXJjb2RlQXR0cmlidXRlX1ByaW50Q2hlY2tzdW0oYm9vbFZhbCkpIHsKLSAgICBwQmFyQ29kZVdpZGdldC0+U2V0UHJpbnRDaGVja3N1bShib29sVmFsKTsKLSAgfQotICBpZiAocEFjYy0+R2V0QmFyY29kZUF0dHJpYnV0ZV9UZXh0TG9jYXRpb24oaW50VmFsKSkgewotICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRUZXh0TG9jYXRpb24oKEJDX1RFWFRfTE9DKWludFZhbCk7Ci0gIH0KLSAgaWYgKHBBY2MtPkdldEJhcmNvZGVBdHRyaWJ1dGVfVHJ1bmNhdGUoYm9vbFZhbCkpIHsKLSAgICBwQmFyQ29kZVdpZGdldC0+U2V0VHJ1bmNhdGVkKGJvb2xWYWwpOwotICB9Ci0gIGlmIChwQWNjLT5HZXRCYXJjb2RlQXR0cmlidXRlX1dpZGVOYXJyb3dSYXRpbyhmbG9hdFZhbCkpIHsKLSAgICBwQmFyQ29kZVdpZGdldC0+U2V0V2lkZU5hcnJvd1JhdGlvKChpbnQzMl90KWZsb2F0VmFsKTsKLSAgfQotICBpZiAocEJhcmNvZGVUeXBlSW5mby0+ZU5hbWUgPT0gWEZBX0JBUkNPREVUWVBFX2NvZGUzT2Y5IHx8Ci0gICAgICBwQmFyY29kZVR5cGVJbmZvLT5lTmFtZSA9PSBYRkFfQkFSQ09ERVRZUEVfZWFuOCB8fAotICAgICAgcEJhcmNvZGVUeXBlSW5mby0+ZU5hbWUgPT0gWEZBX0JBUkNPREVUWVBFX2VhbjEzIHx8Ci0gICAgICBwQmFyY29kZVR5cGVJbmZvLT5lTmFtZSA9PSBYRkFfQkFSQ09ERVRZUEVfdXBjQSkgewotICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRQcmludENoZWNrc3VtKHRydWUpOwotICB9Ci19Ci0KLWJvb2wgQ1hGQV9GRkJhcmNvZGU6Ok9uTEJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgQ0ZXTF9CYXJjb2RlKiBwQmFyQ29kZVdpZGdldCA9IChDRldMX0JhcmNvZGUqKW1fcE5vcm1hbFdpZGdldDsKLSAgaWYgKCFwQmFyQ29kZVdpZGdldCB8fCBwQmFyQ29kZVdpZGdldC0+SXNQcm90ZWN0ZWRUeXBlKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAobV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3BlbikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiBDWEZBX0ZGVGV4dEVkaXQ6Ok9uTEJ1dHRvbkRvd24oZHdGbGFncywgcG9pbnQpOwotfQotCi1ib29sIENYRkFfRkZCYXJjb2RlOjpPblJCdXR0b25Eb3duKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIENGV0xfQmFyY29kZSogcEJhckNvZGVXaWRnZXQgPSAoQ0ZXTF9CYXJjb2RlKiltX3BOb3JtYWxXaWRnZXQ7Ci0gIGlmICghcEJhckNvZGVXaWRnZXQgfHwgcEJhckNvZGVXaWRnZXQtPklzUHJvdGVjdGVkVHlwZSgpKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIENYRkFfRkZUZXh0RWRpdDo6T25SQnV0dG9uRG93bihkd0ZsYWdzLCBwb2ludCk7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAveGZhX2ZmYmFyY29kZS5oIGIveGZhL2Z4ZmEvYXBwL3hmYV9mZmJhcmNvZGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIwZmViNS4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAveGZhX2ZmYmFyY29kZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhGQV9BUFBfWEZBX0ZGQkFSQ09ERV9IXwotI2RlZmluZSBYRkFfRlhGQV9BUFBfWEZBX0ZGQkFSQ09ERV9IXwotCi0jaW5jbHVkZSAieGZhL2Z4YmFyY29kZS9CQ19MaWJyYXJ5LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZnRleHRlZGl0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmcGFnZXZpZXcuaCIKLQotY2xhc3MgQ1hGQV9GRkJhcmNvZGUgOiBwdWJsaWMgQ1hGQV9GRlRleHRFZGl0IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfRkZCYXJjb2RlKENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7Ci0gIH5DWEZBX0ZGQmFyY29kZSgpIG92ZXJyaWRlOwotCi0gIC8vIENYRkFfRkZUZXh0RWRpdAotICBib29sIExvYWRXaWRnZXQoKSBvdmVycmlkZTsKLSAgdm9pZCBSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsCi0gICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSBvdmVycmlkZTsKLSAgdm9pZCBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIG92ZXJyaWRlOwotICBib29sIE9uTEJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOwotICBib29sIE9uUkJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOwotfTsKLQotZW51bSBYRkFfQkFSQ09ERVRZUEVFTlVNIHsKLSAgWEZBX0JBUkNPREVUWVBFX2F6dGVjLAotICBYRkFfQkFSQ09ERVRZUEVfY29kYWJhciwKLSAgWEZBX0JBUkNPREVUWVBFX2NvZGUxMSwKLSAgWEZBX0JBUkNPREVUWVBFX2NvZGUxMjgsCi0gIFhGQV9CQVJDT0RFVFlQRV9jb2RlMTI4QSwKLSAgWEZBX0JBUkNPREVUWVBFX2NvZGUxMjhCLAotICBYRkFfQkFSQ09ERVRZUEVfY29kZTEyOEMsCi0gIFhGQV9CQVJDT0RFVFlQRV9jb2RlMTI4U1NDQywKLSAgWEZBX0JBUkNPREVUWVBFX2NvZGUyT2Y1SW5kdXN0cmlhbCwKLSAgWEZBX0JBUkNPREVUWVBFX2NvZGUyT2Y1SW50ZXJsZWF2ZWQsCi0gIFhGQV9CQVJDT0RFVFlQRV9jb2RlMk9mNU1hdHJpeCwKLSAgWEZBX0JBUkNPREVUWVBFX2NvZGUyT2Y1U3RhbmRhcmQsCi0gIFhGQV9CQVJDT0RFVFlQRV9jb2RlM09mOSwKLSAgWEZBX0JBUkNPREVUWVBFX2NvZGUzT2Y5ZXh0ZW5kZWQsCi0gIFhGQV9CQVJDT0RFVFlQRV9jb2RlNDksCi0gIFhGQV9CQVJDT0RFVFlQRV9jb2RlOTMsCi0gIFhGQV9CQVJDT0RFVFlQRV9kYXRhTWF0cml4LAotICBYRkFfQkFSQ09ERVRZUEVfZWFuMTMsCi0gIFhGQV9CQVJDT0RFVFlQRV9lYW4xM2FkZDIsCi0gIFhGQV9CQVJDT0RFVFlQRV9lYW4xM2FkZDUsCi0gIFhGQV9CQVJDT0RFVFlQRV9lYW4xM3B3Y2QsCi0gIFhGQV9CQVJDT0RFVFlQRV9lYW44LAotICBYRkFfQkFSQ09ERVRZUEVfZWFuOGFkZDIsCi0gIFhGQV9CQVJDT0RFVFlQRV9lYW44YWRkNSwKLSAgWEZBX0JBUkNPREVUWVBFX2ZpbSwKLSAgWEZBX0JBUkNPREVUWVBFX2xvZ21hcnMsCi0gIFhGQV9CQVJDT0RFVFlQRV9tYXhpY29kZSwKLSAgWEZBX0JBUkNPREVUWVBFX21zaSwKLSAgWEZBX0JBUkNPREVUWVBFX3BkZjQxNywKLSAgWEZBX0JBUkNPREVUWVBFX3BkZjQxN21hY3JvLAotICBYRkFfQkFSQ09ERVRZUEVfcGxlc3NleSwKLSAgWEZBX0JBUkNPREVUWVBFX3Bvc3RBVVNDdXN0MiwKLSAgWEZBX0JBUkNPREVUWVBFX3Bvc3RBVVNDdXN0MywKLSAgWEZBX0JBUkNPREVUWVBFX3Bvc3RBVVNSZXBseVBhaWQsCi0gIFhGQV9CQVJDT0RFVFlQRV9wb3N0QVVTU3RhbmRhcmQsCi0gIFhGQV9CQVJDT0RFVFlQRV9wb3N0VUtSTTRTQ0MsCi0gIFhGQV9CQVJDT0RFVFlQRV9wb3N0VVM1WmlwLAotICBYRkFfQkFSQ09ERVRZUEVfcG9zdFVTRFBCQywKLSAgWEZBX0JBUkNPREVUWVBFX3Bvc3RVU0lNQiwKLSAgWEZBX0JBUkNPREVUWVBFX3Bvc3RVU1N0YW5kYXJkLAotICBYRkFfQkFSQ09ERVRZUEVfUVJDb2RlLAotICBYRkFfQkFSQ09ERVRZUEVfcmZpZCwKLSAgWEZBX0JBUkNPREVUWVBFX3JzczE0LAotICBYRkFfQkFSQ09ERVRZUEVfcnNzMTRFeHBhbmRlZCwKLSAgWEZBX0JBUkNPREVUWVBFX3JzczE0TGltaXRlZCwKLSAgWEZBX0JBUkNPREVUWVBFX3JzczE0U3RhY2tlZCwKLSAgWEZBX0JBUkNPREVUWVBFX3JzczE0U3RhY2tlZE9tbmksCi0gIFhGQV9CQVJDT0RFVFlQRV9yc3MxNFRydW5jYXRlZCwKLSAgWEZBX0JBUkNPREVUWVBFX3RlbGVwZW4sCi0gIFhGQV9CQVJDT0RFVFlQRV91Y2MxMjgsCi0gIFhGQV9CQVJDT0RFVFlQRV91Y2MxMjhyYW5kb20sCi0gIFhGQV9CQVJDT0RFVFlQRV91Y2MxMjhzc2NjLAotICBYRkFfQkFSQ09ERVRZUEVfdXBjQSwKLSAgWEZBX0JBUkNPREVUWVBFX3VwY0FhZGQyLAotICBYRkFfQkFSQ09ERVRZUEVfdXBjQWFkZDUsCi0gIFhGQV9CQVJDT0RFVFlQRV91cGNBcHdjZCwKLSAgWEZBX0JBUkNPREVUWVBFX3VwY0UsCi0gIFhGQV9CQVJDT0RFVFlQRV91cGNFYWRkMiwKLSAgWEZBX0JBUkNPREVUWVBFX3VwY0VhZGQ1LAotICBYRkFfQkFSQ09ERVRZUEVfdXBjZWFuMiwKLSAgWEZBX0JBUkNPREVUWVBFX3VwY2VhbjUsCi0gIFhGQV9CQVJDT0RFVFlQRV91cHNNYXhpY29kZQotfTsKLQotc3RydWN0IFhGQV9CQVJDT0RFVFlQRUVOVU1JTkZPIHsKLSAgdWludDMyX3QgdUhhc2g7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwTmFtZTsKLSAgWEZBX0JBUkNPREVUWVBFRU5VTSBlTmFtZTsKLSAgQkNfVFlQRSBlQkNUeXBlOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhGQV9BUFBfWEZBX0ZGQkFSQ09ERV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL3hmYV9mZmNoZWNrYnV0dG9uLmNwcCBiL3hmYS9meGZhL2FwcC94ZmFfZmZjaGVja2J1dHRvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwODhiNWQuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvYXBwL3hmYV9mZmNoZWNrYnV0dG9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmY2hlY2tidXR0b24uaCIKLQotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9jaGVja2JveC5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9tZXNzYWdlbW91c2UuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfbm90ZWRyaXZlci5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF93aWRnZXRtZ3IuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmZXhjbGdyb3VwLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZmZpZWxkLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmYXBwLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jdmlldy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZnBhZ2V2aWV3LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0LmgiCi0KLUNYRkFfRkZDaGVja0J1dHRvbjo6Q1hGQV9GRkNoZWNrQnV0dG9uKENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykKLSAgICA6IENYRkFfRkZGaWVsZChwRGF0YUFjYyksIG1fcE9sZERlbGVnYXRlKG51bGxwdHIpIHt9Ci0KLUNYRkFfRkZDaGVja0J1dHRvbjo6fkNYRkFfRkZDaGVja0J1dHRvbigpIHt9Ci0KLWJvb2wgQ1hGQV9GRkNoZWNrQnV0dG9uOjpMb2FkV2lkZ2V0KCkgewotICBDRldMX0NoZWNrQm94KiBwQ2hlY2tCb3ggPSBuZXcgQ0ZXTF9DaGVja0JveChHZXRGV0xBcHAoKSk7Ci0gIG1fcE5vcm1hbFdpZGdldCA9IHBDaGVja0JveDsKLSAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRMYXlvdXRJdGVtKHRoaXMpOwotCi0gIENGV0xfTm90ZURyaXZlciogcE5vdGVEcml2ZXIgPQotICAgICAgbV9wTm9ybWFsV2lkZ2V0LT5HZXRPd25lckFwcCgpLT5HZXROb3RlRHJpdmVyKCk7Ci0gIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KG1fcE5vcm1hbFdpZGdldCwgbV9wTm9ybWFsV2lkZ2V0KTsKLQotICBtX3BPbGREZWxlZ2F0ZSA9IG1fcE5vcm1hbFdpZGdldC0+R2V0RGVsZWdhdGUoKTsKLSAgbV9wTm9ybWFsV2lkZ2V0LT5TZXREZWxlZ2F0ZSh0aGlzKTsKLQotICBpZiAobV9wRGF0YUFjYy0+SXNSYWRpb0J1dHRvbigpKQotICAgIHBDaGVja0JveC0+TW9kaWZ5U3R5bGVzRXgoRldMX1NUWUxFRVhUX0NLQl9SYWRpb0J1dHRvbiwgMHhGRkZGRkZGRik7Ci0KLSAgbV9wTm9ybWFsV2lkZ2V0LT5Mb2NrVXBkYXRlKCk7Ci0gIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7Ci0gIFNldEZXTENoZWNrU3RhdGUobV9wRGF0YUFjYy0+R2V0Q2hlY2tTdGF0ZSgpKTsKLSAgbV9wTm9ybWFsV2lkZ2V0LT5VbmxvY2tVcGRhdGUoKTsKLSAgcmV0dXJuIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpOwotfQotdm9pZCBDWEZBX0ZGQ2hlY2tCdXR0b246OlVwZGF0ZVdpZGdldFByb3BlcnR5KCkgewotICBDRldMX0NoZWNrQm94KiBwQ2hlY2tCb3ggPSAoQ0ZXTF9DaGVja0JveCopbV9wTm9ybWFsV2lkZ2V0OwotICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgewotICAgIHJldHVybjsKLSAgfQotICBGWF9GTE9BVCBmU2l6ZSA9IG1fcERhdGFBY2MtPkdldENoZWNrQnV0dG9uU2l6ZSgpOwotICBwQ2hlY2tCb3gtPlNldEJveFNpemUoZlNpemUpOwotICB1aW50MzJfdCBkd1N0eWxlRXggPSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZUNyb3NzOwotICBpbnQzMl90IGlDaGVja01hcmsgPSBtX3BEYXRhQWNjLT5HZXRDaGVja0J1dHRvbk1hcmsoKTsKLSAgc3dpdGNoIChpQ2hlY2tNYXJrKSB7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DaGVjazoKLSAgICAgIGR3U3R5bGVFeCA9IEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ2hlY2s7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0NpcmNsZToKLSAgICAgIGR3U3R5bGVFeCA9IEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ2lyY2xlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Dcm9zczoKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRGlhbW9uZDoKLSAgICAgIGR3U3R5bGVFeCA9IEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlRGlhbW9uZDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fU3F1YXJlOgotICAgICAgZHdTdHlsZUV4ID0gRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVTcXVhcmU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1N0YXI6Ci0gICAgICBkd1N0eWxlRXggPSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZVN0YXI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OiB7Ci0gICAgICBpbnQzMl90IGlTaGFwZSA9IG1fcERhdGFBY2MtPkdldENoZWNrQnV0dG9uU2hhcGUoKTsKLSAgICAgIGlmIChpU2hhcGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm91bmQpIHsKLSAgICAgICAgZHdTdHlsZUV4ID0gRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVDaXJjbGU7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLSAgfQotICBpZiAobV9wRGF0YUFjYy0+SXNBbGxvd05ldXRyYWwoKSkgewotICAgIGR3U3R5bGVFeCB8PSBGV0xfU1RZTEVFWFRfQ0tCXzNTdGF0ZTsKLSAgfQotICBwQ2hlY2tCb3gtPk1vZGlmeVN0eWxlc0V4KAotICAgICAgZHdTdHlsZUV4LCBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZU1hc2sgfCBGV0xfU1RZTEVFWFRfQ0tCXzNTdGF0ZSk7Ci19Ci1ib29sIENYRkFfRkZDaGVja0J1dHRvbjo6UGVyZm9ybUxheW91dCgpIHsKLSAgQ1hGQV9GRldpZGdldDo6UGVyZm9ybUxheW91dCgpOwotICBGWF9GTE9BVCBmQ2hlY2tTaXplID0gbV9wRGF0YUFjYy0+R2V0Q2hlY2tCdXR0b25TaXplKCk7Ci0gIENYRkFfTWFyZ2luIG1nV2lkZ2V0ID0gbV9wRGF0YUFjYy0+R2V0TWFyZ2luKCk7Ci0gIENGWF9SZWN0RiBydFdpZGdldCA9IEdldFJlY3RXaXRob3V0Um90YXRlKCk7Ci0gIGlmIChtZ1dpZGdldCkgewotICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4ocnRXaWRnZXQsIG1nV2lkZ2V0KTsKLSAgfQotICBpbnQzMl90IGlDYXBQbGFjZW1lbnQgPSAtMTsKLSAgRlhfRkxPQVQgZkNhcFJlc2VydmUgPSAwOwotICBDWEZBX0NhcHRpb24gY2FwdGlvbiA9IG1fcERhdGFBY2MtPkdldENhcHRpb24oKTsKLSAgaWYgKGNhcHRpb24gJiYgY2FwdGlvbi5HZXRQcmVzZW5jZSgpKSB7Ci0gICAgbV9ydENhcHRpb24gPSBydFdpZGdldDsKLSAgICBpQ2FwUGxhY2VtZW50ID0gY2FwdGlvbi5HZXRQbGFjZW1lbnRUeXBlKCk7Ci0gICAgZkNhcFJlc2VydmUgPSBjYXB0aW9uLkdldFJlc2VydmUoKTsKLSAgICBpZiAoZkNhcFJlc2VydmUgPD0gMCkgewotICAgICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fVG9wIHx8Ci0gICAgICAgICAgaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b20pIHsKLSAgICAgICAgZkNhcFJlc2VydmUgPSBydFdpZGdldC5oZWlnaHQgLSBmQ2hlY2tTaXplOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZkNhcFJlc2VydmUgPSBydFdpZGdldC53aWR0aCAtIGZDaGVja1NpemU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGludDMyX3QgaUhvcnpBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ7Ci0gIGludDMyX3QgaVZlcnRBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX1RvcDsKLSAgaWYgKENYRkFfUGFyYSBwYXJhID0gbV9wRGF0YUFjYy0+R2V0UGFyYSgpKSB7Ci0gICAgaUhvcnpBbGlnbiA9IHBhcmEuR2V0SG9yaXpvbnRhbEFsaWduKCk7Ci0gICAgaVZlcnRBbGlnbiA9IHBhcmEuR2V0VmVydGljYWxBbGlnbigpOwotICB9Ci0gIG1fcnRVSSA9IHJ0V2lkZ2V0OwotICBDWEZBX01hcmdpbiBtZ0NhcCA9IGNhcHRpb24uR2V0TWFyZ2luKCk7Ci0gIHN3aXRjaCAoaUNhcFBsYWNlbWVudCkgewotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDogewotICAgICAgbV9ydENhcHRpb24ud2lkdGggPSBmQ2FwUmVzZXJ2ZTsKLSAgICAgIENhcExlZnRSaWdodFBsYWNlbWVudChtZ0NhcCk7Ci0gICAgICBtX3J0VUkud2lkdGggLT0gZkNhcFJlc2VydmU7Ci0gICAgICBtX3J0VUkubGVmdCArPSBmQ2FwUmVzZXJ2ZTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9wOiB7Ci0gICAgICBtX3J0Q2FwdGlvbi5oZWlnaHQgPSBmQ2FwUmVzZXJ2ZTsKLSAgICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4obV9ydENhcHRpb24sIG1nQ2FwKTsKLSAgICAgIG1fcnRVSS5oZWlnaHQgLT0gZkNhcFJlc2VydmU7Ci0gICAgICBtX3J0VUkudG9wICs9IGZDYXBSZXNlcnZlOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDogewotICAgICAgbV9ydENhcHRpb24ubGVmdCA9IG1fcnRDYXB0aW9uLnJpZ2h0KCkgLSBmQ2FwUmVzZXJ2ZTsKLSAgICAgIG1fcnRDYXB0aW9uLndpZHRoID0gZkNhcFJlc2VydmU7Ci0gICAgICBDYXBMZWZ0UmlnaHRQbGFjZW1lbnQobWdDYXApOwotICAgICAgbV9ydFVJLndpZHRoIC09IGZDYXBSZXNlcnZlOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b206IHsKLSAgICAgIG1fcnRDYXB0aW9uLnRvcCA9IG1fcnRDYXB0aW9uLmJvdHRvbSgpIC0gZkNhcFJlc2VydmU7Ci0gICAgICBtX3J0Q2FwdGlvbi5oZWlnaHQgPSBmQ2FwUmVzZXJ2ZTsKLSAgICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4obV9ydENhcHRpb24sIG1nQ2FwKTsKLSAgICAgIG1fcnRVSS5oZWlnaHQgLT0gZkNhcFJlc2VydmU7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0lubGluZToKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBpSG9yekFsaWduID0gWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ7Ci0gICAgICBicmVhazsKLSAgfQotICBpZiAoaUhvcnpBbGlnbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXIpIHsKLSAgICBtX3J0VUkubGVmdCArPSAobV9ydFVJLndpZHRoIC0gZkNoZWNrU2l6ZSkgLyAyOwotICB9IGVsc2UgaWYgKGlIb3J6QWxpZ24gPT0gWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQpIHsKLSAgICBtX3J0VUkubGVmdCA9IG1fcnRVSS5yaWdodCgpIC0gZkNoZWNrU2l6ZTsKLSAgfQotICBpZiAoaVZlcnRBbGlnbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGUpIHsKLSAgICBtX3J0VUkudG9wICs9IChtX3J0VUkuaGVpZ2h0IC0gZkNoZWNrU2l6ZSkgLyAyOwotICB9IGVsc2UgaWYgKGlWZXJ0QWxpZ24gPT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tKSB7Ci0gICAgbV9ydFVJLnRvcCA9IG1fcnRVSS5ib3R0b20oKSAtIGZDaGVja1NpemU7Ci0gIH0KLSAgbV9ydFVJLndpZHRoID0gZkNoZWNrU2l6ZTsKLSAgbV9ydFVJLmhlaWdodCA9IGZDaGVja1NpemU7Ci0gIEFkZFVJTWFyZ2luKGlDYXBQbGFjZW1lbnQpOwotICBtX3J0Q2hlY2tCb3ggPSBtX3J0VUk7Ci0gIENYRkFfQm9yZGVyIGJvcmRlclVJID0gbV9wRGF0YUFjYy0+R2V0VUlCb3JkZXIoKTsKLSAgaWYgKGJvcmRlclVJKSB7Ci0gICAgQ1hGQV9NYXJnaW4gbWFyZ2luID0gYm9yZGVyVUkuR2V0TWFyZ2luKCk7Ci0gICAgaWYgKG1hcmdpbikgewotICAgICAgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihtX3J0VUksIG1hcmdpbik7Ci0gICAgfQotICB9Ci0gIG1fcnRVSS5Ob3JtYWxpemUoKTsKLSAgTGF5b3V0Q2FwdGlvbigpOwotICBTZXRGV0xSZWN0KCk7Ci0gIGlmIChtX3BOb3JtYWxXaWRnZXQpIHsKLSAgICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotdm9pZCBDWEZBX0ZGQ2hlY2tCdXR0b246OkNhcExlZnRSaWdodFBsYWNlbWVudChDWEZBX01hcmdpbiBtZ0NhcCkgewotICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKG1fcnRDYXB0aW9uLCBtZ0NhcCk7Ci0gIGlmIChtX3J0Q2FwdGlvbi5oZWlnaHQgPCAwKSB7Ci0gICAgbV9ydENhcHRpb24udG9wICs9IG1fcnRDYXB0aW9uLmhlaWdodDsKLSAgfQotICBpZiAobV9ydENhcHRpb24ud2lkdGggPCAwKSB7Ci0gICAgbV9ydENhcHRpb24ubGVmdCArPSBtX3J0Q2FwdGlvbi53aWR0aDsKLSAgICBtX3J0Q2FwdGlvbi53aWR0aCA9IC1tX3J0Q2FwdGlvbi53aWR0aDsKLSAgfQotfQotdm9pZCBDWEZBX0ZGQ2hlY2tCdXR0b246OkFkZFVJTWFyZ2luKGludDMyX3QgaUNhcFBsYWNlbWVudCkgewotICBDRlhfUmVjdEYgcnRVSU1hcmdpbiA9IG1fcERhdGFBY2MtPkdldFVJTWFyZ2luKCk7Ci0gIG1fcnRVSS50b3AgLT0gcnRVSU1hcmdpbi50b3AgLyAyIC0gcnRVSU1hcmdpbi5oZWlnaHQgLyAyOwotICBGWF9GTE9BVCBmTGVmdEFkZFJpZ2h0ID0gcnRVSU1hcmdpbi5sZWZ0ICsgcnRVSU1hcmdpbi53aWR0aDsKLSAgRlhfRkxPQVQgZlRvcEFkZEJvdHRvbSA9IHJ0VUlNYXJnaW4udG9wICsgcnRVSU1hcmdpbi5oZWlnaHQ7Ci0gIGlmIChtX3J0VUkud2lkdGggPCBmTGVmdEFkZFJpZ2h0KSB7Ci0gICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQgfHwKLSAgICAgICAgaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0KSB7Ci0gICAgICBtX3J0VUkubGVmdCAtPSBmTGVmdEFkZFJpZ2h0IC0gbV9ydFVJLndpZHRoOwotICAgIH0gZWxzZSB7Ci0gICAgICBtX3J0VUkubGVmdCAtPSAyICogKGZMZWZ0QWRkUmlnaHQgLSBtX3J0VUkud2lkdGgpOwotICAgIH0KLSAgICBtX3J0VUkud2lkdGggKz0gMiAqIChmTGVmdEFkZFJpZ2h0IC0gbV9ydFVJLndpZHRoKTsKLSAgfQotICBpZiAobV9ydFVJLmhlaWdodCA8IGZUb3BBZGRCb3R0b20pIHsKLSAgICBpZiAoaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCkgewotICAgICAgbV9ydFVJLmxlZnQgLT0gZlRvcEFkZEJvdHRvbSAtIG1fcnRVSS5oZWlnaHQ7Ci0gICAgfQotICAgIG1fcnRVSS50b3AgLT0gZlRvcEFkZEJvdHRvbSAtIG1fcnRVSS5oZWlnaHQ7Ci0gICAgbV9ydFVJLmhlaWdodCArPSAyICogKGZUb3BBZGRCb3R0b20gLSBtX3J0VUkuaGVpZ2h0KTsKLSAgfQotfQotdm9pZCBDWEZBX0ZGQ2hlY2tCdXR0b246OlJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGF0dXMpIHsKLSAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpCi0gICAgcmV0dXJuOwotCi0gIENGWF9NYXRyaXggbXRSb3RhdGUgPSBHZXRSb3RhdGVNYXRyaXgoKTsKLSAgaWYgKHBNYXRyaXgpCi0gICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsKLQotICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzKTsKLSAgQ1hGQV9Cb3JkZXIgYm9yZGVyVUkgPSBtX3BEYXRhQWNjLT5HZXRVSUJvcmRlcigpOwotICBEcmF3Qm9yZGVyKHBHUywgYm9yZGVyVUksIG1fcnRVSSwgJm10Um90YXRlLAotICAgICAgICAgICAgIG1fcERhdGFBY2MtPkdldENoZWNrQnV0dG9uU2hhcGUoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Sb3VuZAotICAgICAgICAgICAgICAgICA/IFhGQV9EUkFXQk9YX0ZvcmNlUm91bmQKLSAgICAgICAgICAgICAgICAgOiAwKTsKLSAgUmVuZGVyQ2FwdGlvbihwR1MsICZtdFJvdGF0ZSk7Ci0gIERyYXdIaWdobGlnaHQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzLAotICAgICAgICAgICAgICAgIG1fcERhdGFBY2MtPkdldENoZWNrQnV0dG9uU2hhcGUoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Sb3VuZCk7Ci0gIENGWF9NYXRyaXggbXQoMSwgMCwgMCwgMSwgbV9ydENoZWNrQm94LmxlZnQsIG1fcnRDaGVja0JveC50b3ApOwotICBtdC5Db25jYXQobXRSb3RhdGUpOwotICBHZXRBcHAoKS0+R2V0V2lkZ2V0TWdyRGVsZWdhdGUoKS0+T25EcmF3V2lkZ2V0KG1fcE5vcm1hbFdpZGdldCwgcEdTLCAmbXQpOwotfQotYm9vbCBDWEZBX0ZGQ2hlY2tCdXR0b246Ok9uTEJ1dHRvblVwKHVpbnQzMl90IGR3RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgaWYgKCFtX3BOb3JtYWxXaWRnZXQgfHwgIUlzQnV0dG9uRG93bigpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBTZXRCdXR0b25Eb3duKGZhbHNlKTsKLSAgQ0ZXTF9NZXNzYWdlTW91c2UgbXMobnVsbHB0ciwgbV9wTm9ybWFsV2lkZ2V0KTsKLSAgbXMubV9kd0NtZCA9IEZXTF9Nb3VzZUNvbW1hbmQ6OkxlZnRCdXR0b25VcDsKLSAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsKLSAgbXMubV9wb3MgPSBGV0xUb0NsaWVudChwb2ludCk7Ci0gIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLVhGQV9DSEVDS1NUQVRFIENYRkFfRkZDaGVja0J1dHRvbjo6RldMU3RhdGUyWEZBU3RhdGUoKSB7Ci0gIHVpbnQzMl90IGR3U3RhdGUgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFN0YXRlcygpOwotICBpZiAoZHdTdGF0ZSAmIEZXTF9TVEFURV9DS0JfQ2hlY2tlZCkKLSAgICByZXR1cm4gWEZBX0NIRUNLU1RBVEVfT247Ci0gIGlmIChkd1N0YXRlICYgRldMX1NUQVRFX0NLQl9OZXV0cmFsKQotICAgIHJldHVybiBYRkFfQ0hFQ0tTVEFURV9OZXV0cmFsOwotICByZXR1cm4gWEZBX0NIRUNLU1RBVEVfT2ZmOwotfQotCi1ib29sIENYRkFfRkZDaGVja0J1dHRvbjo6Q29tbWl0RGF0YSgpIHsKLSAgWEZBX0NIRUNLU1RBVEUgZUNoZWNrU3RhdGUgPSBGV0xTdGF0ZTJYRkFTdGF0ZSgpOwotICBtX3BEYXRhQWNjLT5TZXRDaGVja1N0YXRlKGVDaGVja1N0YXRlLCB0cnVlKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1hGQV9GRkNoZWNrQnV0dG9uOjpJc0RhdGFDaGFuZ2VkKCkgewotICBYRkFfQ0hFQ0tTVEFURSBlQ2hlY2tTdGF0ZSA9IEZXTFN0YXRlMlhGQVN0YXRlKCk7Ci0gIHJldHVybiBtX3BEYXRhQWNjLT5HZXRDaGVja1N0YXRlKCkgIT0gZUNoZWNrU3RhdGU7Ci19Ci12b2lkIENYRkFfRkZDaGVja0J1dHRvbjo6U2V0RldMQ2hlY2tTdGF0ZShYRkFfQ0hFQ0tTVEFURSBlQ2hlY2tTdGF0ZSkgewotICBpZiAoZUNoZWNrU3RhdGUgPT0gWEZBX0NIRUNLU1RBVEVfTmV1dHJhbCkgewotICAgIG1fcE5vcm1hbFdpZGdldC0+U2V0U3RhdGVzKEZXTF9TVEFURV9DS0JfTmV1dHJhbCk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGVDaGVja1N0YXRlID09IFhGQV9DSEVDS1NUQVRFX09uKQotICAgICAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRTdGF0ZXMoRldMX1NUQVRFX0NLQl9DaGVja2VkKTsKLSAgICBlbHNlCi0gICAgICBtX3BOb3JtYWxXaWRnZXQtPlJlbW92ZVN0YXRlcyhGV0xfU1RBVEVfQ0tCX0NoZWNrZWQpOwotICB9Ci19Ci1ib29sIENYRkFfRkZDaGVja0J1dHRvbjo6VXBkYXRlRldMRGF0YSgpIHsKLSAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgWEZBX0NIRUNLU1RBVEUgZVN0YXRlID0gbV9wRGF0YUFjYy0+R2V0Q2hlY2tTdGF0ZSgpOwotICBTZXRGV0xDaGVja1N0YXRlKGVTdGF0ZSk7Ci0gIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIENYRkFfRkZDaGVja0J1dHRvbjo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7Ci0gIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsKLX0KLQotdm9pZCBDWEZBX0ZGQ2hlY2tCdXR0b246Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgewotICBDWEZBX0ZGRmllbGQ6Ok9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7Ci0gIHN3aXRjaCAocEV2ZW50LT5HZXRUeXBlKCkpIHsKLSAgICBjYXNlIENGV0xfRXZlbnQ6OlR5cGU6OkNoZWNrU3RhdGVDaGFuZ2VkOiB7Ci0gICAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOwotICAgICAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfQ2hhbmdlOwotICAgICAgbV9wRGF0YUFjYy0+R2V0VmFsdWUoZVBhcmFtLm1fd3NOZXdUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7Ci0gICAgICBDWEZBX1dpZGdldEFjYyogcEZGRXhjbEdyb3VwID0gbV9wRGF0YUFjYy0+R2V0RXhjbEdyb3VwKCk7Ci0gICAgICBpZiAoUHJvY2Vzc0NvbW1pdHRlZERhdGEoKSkgewotICAgICAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gcEZGRXhjbEdyb3VwOwotICAgICAgICBpZiAocEZGRXhjbEdyb3VwKSB7Ci0gICAgICAgICAgbV9wRG9jVmlldy0+QWRkVmFsaWRhdGVXaWRnZXQocEZGRXhjbEdyb3VwKTsKLSAgICAgICAgICBtX3BEb2NWaWV3LT5BZGRDYWxjdWxhdGVXaWRnZXRBY2MocEZGRXhjbEdyb3VwKTsKLSAgICAgICAgICBwRkZFeGNsR3JvdXAtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9DaGFuZ2UsICZlUGFyYW0pOwotICAgICAgICB9Ci0gICAgICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOwotICAgICAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fQ2hhbmdlLCAmZVBhcmFtKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFNldEZXTENoZWNrU3RhdGUobV9wRGF0YUFjYy0+R2V0Q2hlY2tTdGF0ZSgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChwRkZFeGNsR3JvdXApIHsKLSAgICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IHBGRkV4Y2xHcm91cDsKLSAgICAgICAgcEZGRXhjbEdyb3VwLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fQ2xpY2ssICZlUGFyYW0pOwotICAgICAgfQotICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7Ci0gICAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fQ2xpY2ssICZlUGFyYW0pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICBtX3BPbGREZWxlZ2F0ZS0+T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsKLX0KLQotdm9pZCBDWEZBX0ZGQ2hlY2tCdXR0b246Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBtX3BPbGREZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAveGZhX2ZmY2hlY2tidXR0b24uaCBiL3hmYS9meGZhL2FwcC94ZmFfZmZjaGVja2J1dHRvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzBhY2Q2Li4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfZmZjaGVja2J1dHRvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEZBX0FQUF9YRkFfRkZDSEVDS0JVVFRPTl9IXwotI2RlZmluZSBYRkFfRlhGQV9BUFBfWEZBX0ZGQ0hFQ0tCVVRUT05fSF8KLQotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZmaWVsZC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZnBhZ2V2aWV3LmgiCi0KLWNsYXNzIENYRkFfRkZDaGVja0J1dHRvbiA6IHB1YmxpYyBDWEZBX0ZGRmllbGQgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9GRkNoZWNrQnV0dG9uKENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7Ci0gIH5DWEZBX0ZGQ2hlY2tCdXR0b24oKSBvdmVycmlkZTsKLQotICAvLyBDWEZBX0ZGRmllbGQKLSAgdm9pZCBSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsCi0gICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSBvdmVycmlkZTsKLQotICBib29sIExvYWRXaWRnZXQoKSBvdmVycmlkZTsKLSAgYm9vbCBQZXJmb3JtTGF5b3V0KCkgb3ZlcnJpZGU7Ci0gIGJvb2wgVXBkYXRlRldMRGF0YSgpIG92ZXJyaWRlOwotICB2b2lkIFVwZGF0ZVdpZGdldFByb3BlcnR5KCkgb3ZlcnJpZGU7Ci0gIGJvb2wgT25MQnV0dG9uVXAodWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOwotICB2b2lkIE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSBvdmVycmlkZTsKLSAgdm9pZCBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBudWxscHRyKSBvdmVycmlkZTsKLQotICB2b2lkIFNldEZXTENoZWNrU3RhdGUoWEZBX0NIRUNLU1RBVEUgZUNoZWNrU3RhdGUpOwotCi0gcHJvdGVjdGVkOgotICBib29sIENvbW1pdERhdGEoKSBvdmVycmlkZTsKLSAgYm9vbCBJc0RhdGFDaGFuZ2VkKCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBDYXBMZWZ0UmlnaHRQbGFjZW1lbnQoQ1hGQV9NYXJnaW4gbWdDYXApOwotICB2b2lkIEFkZFVJTWFyZ2luKGludDMyX3QgaUNhcFBsYWNlbWVudCk7Ci0gIFhGQV9DSEVDS1NUQVRFIEZXTFN0YXRlMlhGQVN0YXRlKCk7Ci0gIElGV0xfV2lkZ2V0RGVsZWdhdGUqIG1fcE9sZERlbGVnYXRlOwotICBDRlhfUmVjdEYgbV9ydENoZWNrQm94OwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhGQV9BUFBfWEZBX0ZGQ0hFQ0tCVVRUT05fSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2FwcC94ZmFfZmZjaG9pY2VsaXN0LmNwcCBiL3hmYS9meGZhL2FwcC94ZmFfZmZjaG9pY2VsaXN0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FhYmRlOC4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAveGZhX2ZmY2hvaWNlbGlzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MzcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZmNob2ljZWxpc3QuaCIKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX2FwcC5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9jb21ib2JveC5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9lZGl0LmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX2V2ZW50c2VsZWN0Y2hhbmdlZC5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9saXN0Ym94LmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX25vdGVkcml2ZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfd2lkZ2V0cHJvcGVydGllcy5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZmaWVsZC5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZndsYWRhcHRlci5oIgotI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZXZlbnRwYXJhbS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmRvYy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmRvY3ZpZXcuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZwYWdldmlldy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZndpZGdldC5oIgotCi1DWEZBX0ZGTGlzdEJveDo6Q1hGQV9GRkxpc3RCb3goQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQotICAgIDogQ1hGQV9GRkZpZWxkKHBEYXRhQWNjKSwgbV9wT2xkRGVsZWdhdGUobnVsbHB0cikge30KLQotQ1hGQV9GRkxpc3RCb3g6On5DWEZBX0ZGTGlzdEJveCgpIHsKLSAgaWYgKG1fcE5vcm1hbFdpZGdldCkgewotICAgIENGV0xfTm90ZURyaXZlciogcE5vdGVEcml2ZXIgPQotICAgICAgICBtX3BOb3JtYWxXaWRnZXQtPkdldE93bmVyQXBwKCktPkdldE5vdGVEcml2ZXIoKTsKLSAgICBwTm90ZURyaXZlci0+VW5yZWdpc3RlckV2ZW50VGFyZ2V0KG1fcE5vcm1hbFdpZGdldCk7Ci0gIH0KLX0KLQotYm9vbCBDWEZBX0ZGTGlzdEJveDo6TG9hZFdpZGdldCgpIHsKLSAgQ0ZXTF9MaXN0Qm94KiBwTGlzdEJveCA9IG5ldyBDRldMX0xpc3RCb3goCi0gICAgICBHZXRGV0xBcHAoKSwgcGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfV2lkZ2V0UHJvcGVydGllcz4oKSwgbnVsbHB0cik7Ci0gIHBMaXN0Qm94LT5Nb2RpZnlTdHlsZXMoRldMX1dHVFNUWUxFX1ZTY3JvbGwgfCBGV0xfV0dUU1RZTEVfTm9CYWNrZ3JvdW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYpOwotICBtX3BOb3JtYWxXaWRnZXQgPSAoQ0ZXTF9XaWRnZXQqKXBMaXN0Qm94OwotICBtX3BOb3JtYWxXaWRnZXQtPlNldExheW91dEl0ZW0odGhpcyk7Ci0KLSAgQ0ZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9Ci0gICAgICBtX3BOb3JtYWxXaWRnZXQtPkdldE93bmVyQXBwKCktPkdldE5vdGVEcml2ZXIoKTsKLSAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQobV9wTm9ybWFsV2lkZ2V0LCBtX3BOb3JtYWxXaWRnZXQpOwotCi0gIG1fcE9sZERlbGVnYXRlID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXREZWxlZ2F0ZSgpOwotICBtX3BOb3JtYWxXaWRnZXQtPlNldERlbGVnYXRlKHRoaXMpOwotICBtX3BOb3JtYWxXaWRnZXQtPkxvY2tVcGRhdGUoKTsKLQotICBzdGQ6OnZlY3RvcjxDRlhfV2lkZVN0cmluZz4gd3NMYWJlbEFycmF5OwotICBtX3BEYXRhQWNjLT5HZXRDaG9pY2VMaXN0SXRlbXMod3NMYWJlbEFycmF5LCBmYWxzZSk7Ci0gIGludDMyX3QgaUl0ZW1zID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90Pih3c0xhYmVsQXJyYXkpOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpSXRlbXM7IGkrKykgewotICAgIHBMaXN0Qm94LT5BZGRTdHJpbmcod3NMYWJlbEFycmF5W2ldLkFzU3RyaW5nQygpKTsKLSAgfQotICB1aW50MzJfdCBkd0V4dGVuZGVkU3R5bGUgPSBGV0xfU1RZTEVFWFRfTFRCX1Nob3dTY3JvbGxCYXJGb2N1czsKLSAgaWYgKG1fcERhdGFBY2MtPkdldENob2ljZUxpc3RPcGVuKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3QpIHsKLSAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0xUQl9NdWx0aVNlbGVjdGlvbjsKLSAgfQotICBkd0V4dGVuZGVkU3R5bGUgfD0gR2V0QWxpZ25tZW50KCk7Ci0gIG1fcE5vcm1hbFdpZGdldC0+TW9kaWZ5U3R5bGVzRXgoZHdFeHRlbmRlZFN0eWxlLCAweEZGRkZGRkZGKTsKLSAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4gaVNlbEFycmF5OwotICBtX3BEYXRhQWNjLT5HZXRTZWxlY3RlZEl0ZW1zKGlTZWxBcnJheSk7Ci0gIGludDMyX3QgaVNlbENvdW50ID0gaVNlbEFycmF5LkdldFNpemUoKTsKLSAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVNlbENvdW50OyBqKyspIHsKLSAgICBDRldMX0xpc3RJdGVtKiBpdGVtID0gcExpc3RCb3gtPkdldEl0ZW0obnVsbHB0ciwgaVNlbEFycmF5W2pdKTsKLSAgICBwTGlzdEJveC0+U2V0U2VsSXRlbShpdGVtLCB0cnVlKTsKLSAgfQotICBtX3BOb3JtYWxXaWRnZXQtPlVubG9ja1VwZGF0ZSgpOwotICByZXR1cm4gQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCk7Ci19Ci0KLWJvb2wgQ1hGQV9GRkxpc3RCb3g6Ok9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdGb2N1cykgewotICBpZiAoIVByb2Nlc3NDb21taXR0ZWREYXRhKCkpCi0gICAgVXBkYXRlRldMRGF0YSgpOwotICBDWEZBX0ZGRmllbGQ6Ok9uS2lsbEZvY3VzKHBOZXdGb2N1cyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENYRkFfRkZMaXN0Qm94OjpDb21taXREYXRhKCkgewotICBDRldMX0xpc3RCb3gqIHBMaXN0Qm94ID0gc3RhdGljX2Nhc3Q8Q0ZXTF9MaXN0Qm94Kj4obV9wTm9ybWFsV2lkZ2V0KTsKLSAgaW50MzJfdCBpU2VscyA9IHBMaXN0Qm94LT5Db3VudFNlbEl0ZW1zKCk7Ci0gIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+IGlTZWxBcnJheTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNlbHM7ICsraSkKLSAgICBpU2VsQXJyYXkuQWRkKHBMaXN0Qm94LT5HZXRTZWxJbmRleChpKSk7Ci0gIG1fcERhdGFBY2MtPlNldFNlbGVjdGVkSXRlbXMoaVNlbEFycmF5LCB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENYRkFfRkZMaXN0Qm94OjpJc0RhdGFDaGFuZ2VkKCkgewotICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiBpU2VsQXJyYXk7Ci0gIG1fcERhdGFBY2MtPkdldFNlbGVjdGVkSXRlbXMoaVNlbEFycmF5KTsKLSAgaW50MzJfdCBpT2xkU2VscyA9IGlTZWxBcnJheS5HZXRTaXplKCk7Ci0gIENGV0xfTGlzdEJveCogcExpc3RCb3ggPSAoQ0ZXTF9MaXN0Qm94KiltX3BOb3JtYWxXaWRnZXQ7Ci0gIGludDMyX3QgaVNlbHMgPSBwTGlzdEJveC0+Q291bnRTZWxJdGVtcygpOwotICBpZiAoaU9sZFNlbHMgIT0gaVNlbHMpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNlbHM7ICsraSkgewotICAgIENGV0xfTGlzdEl0ZW0qIGhsaXN0SXRlbSA9IHBMaXN0Qm94LT5HZXRJdGVtKG51bGxwdHIsIGlTZWxBcnJheVtpXSk7Ci0gICAgaWYgKCEoaGxpc3RJdGVtLT5HZXRTdGF0ZXMoKSAmIEZXTF9JVEVNU1RBVEVfTFRCX1NlbGVjdGVkKSkKLSAgICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdWludDMyX3QgQ1hGQV9GRkxpc3RCb3g6OkdldEFsaWdubWVudCgpIHsKLSAgdWludDMyX3QgZHdFeHRlbmRlZFN0eWxlID0gMDsKLSAgaWYgKENYRkFfUGFyYSBwYXJhID0gbV9wRGF0YUFjYy0+R2V0UGFyYSgpKSB7Ci0gICAgaW50MzJfdCBpSG9yeiA9IHBhcmEuR2V0SG9yaXpvbnRhbEFsaWduKCk7Ci0gICAgc3dpdGNoIChpSG9yeikgewotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6Ci0gICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfTFRCX0NlbnRlckFsaWduOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeToKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnlBbGw6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SYWRpeDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0OgotICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0xUQl9SaWdodEFsaWduOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfTFRCX0xlZnRBbGlnbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBkd0V4dGVuZGVkU3R5bGU7Ci19Ci1ib29sIENYRkFfRkZMaXN0Qm94OjpVcGRhdGVGV0xEYXRhKCkgewotICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBDRldMX0xpc3RCb3gqIHBMaXN0Qm94ID0gKChDRldMX0xpc3RCb3gqKW1fcE5vcm1hbFdpZGdldCk7Ci0gIENGWF9BcnJheVRlbXBsYXRlPENGV0xfTGlzdEl0ZW0qPiBzZWxJdGVtQXJyYXk7Ci0gIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+IGlTZWxBcnJheTsKLSAgbV9wRGF0YUFjYy0+R2V0U2VsZWN0ZWRJdGVtcyhpU2VsQXJyYXkpOwotICBpbnQzMl90IGlTZWxDb3VudCA9IGlTZWxBcnJheS5HZXRTaXplKCk7Ci0gIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlTZWxDb3VudDsgaisrKSB7Ci0gICAgQ0ZXTF9MaXN0SXRlbSogbHBJdGVtU2VsID0gcExpc3RCb3gtPkdldFNlbEl0ZW0oaVNlbEFycmF5W2pdKTsKLSAgICBzZWxJdGVtQXJyYXkuQWRkKGxwSXRlbVNlbCk7Ci0gIH0KLSAgcExpc3RCb3gtPlNldFNlbEl0ZW0ocExpc3RCb3gtPkdldFNlbEl0ZW0oLTEpLCBmYWxzZSk7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTZWxDb3VudDsgaSsrKSB7Ci0gICAgKChDRldMX0xpc3RCb3gqKW1fcE5vcm1hbFdpZGdldCktPlNldFNlbEl0ZW0oc2VsSXRlbUFycmF5W2ldLCB0cnVlKTsKLSAgfQotICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLXZvaWQgQ1hGQV9GRkxpc3RCb3g6Ok9uU2VsZWN0Q2hhbmdlZCgKLSAgICBDRldMX1dpZGdldCogcFdpZGdldCwKLSAgICBjb25zdCBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiYgYXJyU2VscykgewotICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOwotICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9DaGFuZ2U7Ci0gIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOwotICBtX3BEYXRhQWNjLT5HZXRWYWx1ZShlUGFyYW0ubV93c1ByZXZUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7Ci0gIENGV0xfTGlzdEJveCogcExpc3RCb3ggPSAoQ0ZXTF9MaXN0Qm94KiltX3BOb3JtYWxXaWRnZXQ7Ci0gIGludDMyX3QgaVNlbHMgPSBwTGlzdEJveC0+Q291bnRTZWxJdGVtcygpOwotICBpZiAoaVNlbHMgPiAwKSB7Ci0gICAgQ0ZXTF9MaXN0SXRlbSogaXRlbSA9IHBMaXN0Qm94LT5HZXRTZWxJdGVtKDApOwotICAgIGVQYXJhbS5tX3dzTmV3VGV4dCA9IGl0ZW0gPyBpdGVtLT5HZXRUZXh0KCkgOiBMIiI7Ci0gIH0KLQotICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fQ2hhbmdlLCAmZVBhcmFtKTsKLX0KLXZvaWQgQ1hGQV9GRkxpc3RCb3g6OlNldEl0ZW1TdGF0ZShpbnQzMl90IG5JbmRleCwgYm9vbCBiU2VsZWN0ZWQpIHsKLSAgQ0ZXTF9MaXN0SXRlbSogaXRlbSA9ICgoQ0ZXTF9MaXN0Qm94KiltX3BOb3JtYWxXaWRnZXQpLT5HZXRTZWxJdGVtKG5JbmRleCk7Ci0gICgoQ0ZXTF9MaXN0Qm94KiltX3BOb3JtYWxXaWRnZXQpLT5TZXRTZWxJdGVtKGl0ZW0sIGJTZWxlY3RlZCk7Ci0gIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7Ci0gIEFkZEludmFsaWRhdGVSZWN0KCk7Ci19Ci12b2lkIENYRkFfRkZMaXN0Qm94OjpJbnNlcnRJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wKHdzTGFiZWwpOwotICAoKENGV0xfTGlzdEJveCopbV9wTm9ybWFsV2lkZ2V0KS0+QWRkU3RyaW5nKHdzVGVtcC5Bc1N0cmluZ0MoKSk7Ci0gIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7Ci0gIEFkZEludmFsaWRhdGVSZWN0KCk7Ci19Ci12b2lkIENYRkFfRkZMaXN0Qm94OjpEZWxldGVJdGVtKGludDMyX3QgbkluZGV4KSB7Ci0gIENGV0xfTGlzdEJveCogbGlzdEJveCA9IHN0YXRpY19jYXN0PENGV0xfTGlzdEJveCo+KG1fcE5vcm1hbFdpZGdldCk7Ci0gIGlmIChuSW5kZXggPCAwKQotICAgIGxpc3RCb3gtPkRlbGV0ZUFsbCgpOwotICBlbHNlCi0gICAgbGlzdEJveC0+RGVsZXRlU3RyaW5nKGxpc3RCb3gtPkdldEl0ZW0obnVsbHB0ciwgbkluZGV4KSk7Ci0KLSAgbGlzdEJveC0+VXBkYXRlKCk7Ci0gIEFkZEludmFsaWRhdGVSZWN0KCk7Ci19Ci0KLXZvaWQgQ1hGQV9GRkxpc3RCb3g6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgewotICBtX3BPbGREZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7Ci19Ci0KLXZvaWQgQ1hGQV9GRkxpc3RCb3g6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgewotICBDWEZBX0ZGRmllbGQ6Ok9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7Ci0gIHN3aXRjaCAocEV2ZW50LT5HZXRUeXBlKCkpIHsKLSAgICBjYXNlIENGV0xfRXZlbnQ6OlR5cGU6OlNlbGVjdENoYW5nZWQ6IHsKLSAgICAgIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+IGFyclNlbHM7Ci0gICAgICBPblNlbGVjdENoYW5nZWQobV9wTm9ybWFsV2lkZ2V0LCBhcnJTZWxzKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLSAgbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7Ci19Ci12b2lkIENYRkFfRkZMaXN0Qm94OjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBtX3BPbGREZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7Ci19Ci0KLUNYRkFfRkZDb21ib0JveDo6Q1hGQV9GRkNvbWJvQm94KENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykKLSAgICA6IENYRkFfRkZGaWVsZChwRGF0YUFjYyksIG1fcE9sZERlbGVnYXRlKG51bGxwdHIpIHt9Ci0KLUNYRkFfRkZDb21ib0JveDo6fkNYRkFfRkZDb21ib0JveCgpIHt9Ci0KLUNGWF9SZWN0RiBDWEZBX0ZGQ29tYm9Cb3g6OkdldEJCb3godWludDMyX3QgZHdTdGF0dXMsIGJvb2wgYkRyYXdGb2N1cykgewotICBpZiAoYkRyYXdGb2N1cykKLSAgICByZXR1cm4gQ0ZYX1JlY3RGKCk7Ci0gIHJldHVybiBDWEZBX0ZGV2lkZ2V0OjpHZXRCQm94KGR3U3RhdHVzKTsKLX0KLQotYm9vbCBDWEZBX0ZGQ29tYm9Cb3g6OlB0SW5BY3RpdmVSZWN0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIGF1dG8gcENvbWJvQm94ID0gc3RhdGljX2Nhc3Q8Q0ZXTF9Db21ib0JveCo+KG1fcE5vcm1hbFdpZGdldCk7Ci0gIHJldHVybiBwQ29tYm9Cb3ggJiYgcENvbWJvQm94LT5HZXRCQm94KCkuQ29udGFpbnMocG9pbnQpOwotfQotCi1ib29sIENYRkFfRkZDb21ib0JveDo6TG9hZFdpZGdldCgpIHsKLSAgQ0ZXTF9Db21ib0JveCogcENvbWJvQm94ID0gbmV3IENGV0xfQ29tYm9Cb3goR2V0RldMQXBwKCkpOwotICBtX3BOb3JtYWxXaWRnZXQgPSAoQ0ZXTF9XaWRnZXQqKXBDb21ib0JveDsKLSAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRMYXlvdXRJdGVtKHRoaXMpOwotCi0gIENGV0xfTm90ZURyaXZlciogcE5vdGVEcml2ZXIgPQotICAgICAgbV9wTm9ybWFsV2lkZ2V0LT5HZXRPd25lckFwcCgpLT5HZXROb3RlRHJpdmVyKCk7Ci0gIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KG1fcE5vcm1hbFdpZGdldCwgbV9wTm9ybWFsV2lkZ2V0KTsKLQotICBtX3BPbGREZWxlZ2F0ZSA9IG1fcE5vcm1hbFdpZGdldC0+R2V0RGVsZWdhdGUoKTsKLSAgbV9wTm9ybWFsV2lkZ2V0LT5TZXREZWxlZ2F0ZSh0aGlzKTsKLSAgbV9wTm9ybWFsV2lkZ2V0LT5Mb2NrVXBkYXRlKCk7Ci0KLSAgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+IHdzTGFiZWxBcnJheTsKLSAgbV9wRGF0YUFjYy0+R2V0Q2hvaWNlTGlzdEl0ZW1zKHdzTGFiZWxBcnJheSwgZmFsc2UpOwotICBpbnQzMl90IGlJdGVtcyA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4od3NMYWJlbEFycmF5KTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUl0ZW1zOyBpKyspIHsKLSAgICBwQ29tYm9Cb3gtPkFkZFN0cmluZyh3c0xhYmVsQXJyYXlbaV0uQXNTdHJpbmdDKCkpOwotICB9Ci0gIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+IGlTZWxBcnJheTsKLSAgbV9wRGF0YUFjYy0+R2V0U2VsZWN0ZWRJdGVtcyhpU2VsQXJyYXkpOwotICBpbnQzMl90IGlTZWxDb3VudCA9IGlTZWxBcnJheS5HZXRTaXplKCk7Ci0gIGlmIChpU2VsQ291bnQgPiAwKSB7Ci0gICAgcENvbWJvQm94LT5TZXRDdXJTZWwoaVNlbEFycmF5WzBdKTsKLSAgfSBlbHNlIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7Ci0gICAgbV9wRGF0YUFjYy0+R2V0VmFsdWUod3NUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7Ci0gICAgcENvbWJvQm94LT5TZXRFZGl0VGV4dCh3c1RleHQpOwotICB9Ci0gIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7Ci0gIG1fcE5vcm1hbFdpZGdldC0+VW5sb2NrVXBkYXRlKCk7Ci0gIHJldHVybiBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsKLX0KLXZvaWQgQ1hGQV9GRkNvbWJvQm94OjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIHsKLSAgQ0ZXTF9Db21ib0JveCogcENvbWJvQm94ID0gKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldDsKLSAgaWYgKCFwQ29tYm9Cb3gpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgdWludDMyX3QgZHdFeHRlbmRlZFN0eWxlID0gMDsKLSAgdWludDMyX3QgZHdFZGl0U3R5bGVzID0KLSAgICAgIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHkgfCBGV0xfU1RZTEVFWFRfRURUX0xhc3RMaW5lSGVpZ2h0OwotICBkd0V4dGVuZGVkU3R5bGUgfD0gVXBkYXRlVUlQcm9wZXJ0eSgpOwotICBpZiAobV9wRGF0YUFjYy0+SXNDaG9pY2VMaXN0QWxsb3dUZXh0RW50cnkoKSkgewotICAgIGR3RWRpdFN0eWxlcyAmPSB+RldMX1NUWUxFRVhUX0VEVF9SZWFkT25seTsKLSAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0NNQl9Ecm9wRG93bjsKLSAgfQotICBpZiAobV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3BlbiB8fAotICAgICAgIW1fcERhdGFBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKSB7Ci0gICAgZHdFZGl0U3R5bGVzIHw9IEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHk7Ci0gICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9DTUJfUmVhZE9ubHk7Ci0gIH0KLSAgZHdFeHRlbmRlZFN0eWxlIHw9IEdldEFsaWdubWVudCgpOwotICBtX3BOb3JtYWxXaWRnZXQtPk1vZGlmeVN0eWxlc0V4KGR3RXh0ZW5kZWRTdHlsZSwgMHhGRkZGRkZGRik7Ci0gIGlmIChtX3BEYXRhQWNjLT5HZXRIb3Jpem9udGFsU2Nyb2xsUG9saWN5KCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT2ZmKSB7Ci0gICAgZHdFZGl0U3R5bGVzIHw9IEZXTF9TVFlMRUVYVF9FRFRfQXV0b0hTY3JvbGw7Ci0gIH0KLSAgcENvbWJvQm94LT5FZGl0TW9kaWZ5U3R5bGVzRXgoZHdFZGl0U3R5bGVzLCAweEZGRkZGRkZGKTsKLX0KLQotYm9vbCBDWEZBX0ZGQ29tYm9Cb3g6Ok9uUkJ1dHRvblVwKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIGlmICghQ1hGQV9GRkZpZWxkOjpPblJCdXR0b25VcChkd0ZsYWdzLCBwb2ludCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIEdldERvYygpLT5HZXREb2NFbnZpcm9ubWVudCgpLT5Qb3B1cE1lbnUodGhpcywgcG9pbnQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDWEZBX0ZGQ29tYm9Cb3g6Ok9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdXaWRnZXQpIHsKLSAgYm9vbCBmbGFnID0gUHJvY2Vzc0NvbW1pdHRlZERhdGEoKTsKLSAgaWYgKCFmbGFnKSB7Ci0gICAgVXBkYXRlRldMRGF0YSgpOwotICB9Ci0gIENYRkFfRkZGaWVsZDo6T25LaWxsRm9jdXMocE5ld1dpZGdldCk7Ci0gIHJldHVybiB0cnVlOwotfQotdm9pZCBDWEZBX0ZGQ29tYm9Cb3g6Ok9wZW5Ecm9wRG93bkxpc3QoKSB7Ci0gICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+T3BlbkRyb3BEb3duTGlzdCh0cnVlKTsKLX0KLWJvb2wgQ1hGQV9GRkNvbWJvQm94OjpDb21taXREYXRhKCkgewotICByZXR1cm4gbV9wRGF0YUFjYy0+U2V0VmFsdWUobV93c05ld1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7Ci19Ci1ib29sIENYRkFfRkZDb21ib0JveDo6SXNEYXRhQ2hhbmdlZCgpIHsKLSAgQ0ZXTF9Db21ib0JveCogcEZXTGNvbWJvYm94ID0gKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpOwotICBDRlhfV2lkZVN0cmluZyB3c1RleHQgPSBwRldMY29tYm9ib3gtPkdldEVkaXRUZXh0KCk7Ci0gIGludDMyX3QgaUN1cnNlbCA9IHBGV0xjb21ib2JveC0+R2V0Q3VyU2VsKCk7Ci0gIGlmIChpQ3Vyc2VsID49IDApIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1NlbCA9IHBGV0xjb21ib2JveC0+R2V0VGV4dEJ5SW5kZXgoaUN1cnNlbCk7Ci0gICAgaWYgKHdzU2VsID09IHdzVGV4dCkKLSAgICAgIG1fcERhdGFBY2MtPkdldENob2ljZUxpc3RJdGVtKHdzVGV4dCwgaUN1cnNlbCwgdHJ1ZSk7Ci0gIH0KLQotICBDRlhfV2lkZVN0cmluZyB3c09sZFZhbHVlOwotICBtX3BEYXRhQWNjLT5HZXRWYWx1ZSh3c09sZFZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7Ci0gIGlmICh3c09sZFZhbHVlICE9IHdzVGV4dCkgewotICAgIG1fd3NOZXdWYWx1ZSA9IHdzVGV4dDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci12b2lkIENYRkFfRkZDb21ib0JveDo6RldMRXZlbnRTZWxDaGFuZ2UoQ1hGQV9FdmVudFBhcmFtKiBwUGFyYW0pIHsKLSAgcFBhcmFtLT5tX2VUeXBlID0gWEZBX0VWRU5UX0NoYW5nZTsKLSAgcFBhcmFtLT5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOwotICBDRldMX0NvbWJvQm94KiBwRldMY29tYm9ib3ggPSAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCk7Ci0gIHBQYXJhbS0+bV93c05ld1RleHQgPSBwRldMY29tYm9ib3gtPkdldEVkaXRUZXh0KCk7Ci0gIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9DaGFuZ2UsIHBQYXJhbSk7Ci19Ci11aW50MzJfdCBDWEZBX0ZGQ29tYm9Cb3g6OkdldEFsaWdubWVudCgpIHsKLSAgdWludDMyX3QgZHdFeHRlbmRlZFN0eWxlID0gMDsKLSAgaWYgKENYRkFfUGFyYSBwYXJhID0gbV9wRGF0YUFjYy0+R2V0UGFyYSgpKSB7Ci0gICAgaW50MzJfdCBpSG9yeiA9IHBhcmEuR2V0SG9yaXpvbnRhbEFsaWduKCk7Ci0gICAgc3dpdGNoIChpSG9yeikgewotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6Ci0gICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PQotICAgICAgICAgICAgRldMX1NUWUxFRVhUX0NNQl9FZGl0SENlbnRlciB8IEZXTF9TVFlMRUVYVF9DTUJfTGlzdEl0ZW1DZW50ZXJBbGlnbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnk6Ci0gICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRKdXN0aWZpZWQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5QWxsOgotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmFkaXg6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0KLSAgICAgICAgICAgIEZXTF9TVFlMRUVYVF9DTUJfRWRpdEhOZWFyIHwgRldMX1NUWUxFRVhUX0NNQl9MaXN0SXRlbUxlZnRBbGlnbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGludDMyX3QgaVZlcnQgPSBwYXJhLkdldFZlcnRpY2FsQWxpZ24oKTsKLSAgICBzd2l0Y2ggKGlWZXJ0KSB7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZToKLSAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9DTUJfRWRpdFZDZW50ZXI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b206Ci0gICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRWRmFyOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRWTmVhcjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBkd0V4dGVuZGVkU3R5bGU7Ci19Ci1ib29sIENYRkFfRkZDb21ib0JveDo6VXBkYXRlRldMRGF0YSgpIHsKLSAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4gaVNlbEFycmF5OwotICBtX3BEYXRhQWNjLT5HZXRTZWxlY3RlZEl0ZW1zKGlTZWxBcnJheSk7Ci0gIGludDMyX3QgaVNlbENvdW50ID0gaVNlbEFycmF5LkdldFNpemUoKTsKLSAgaWYgKGlTZWxDb3VudCA+IDApIHsKLSAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPlNldEN1clNlbChpU2VsQXJyYXlbMF0pOwotICB9IGVsc2UgewotICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsKLSAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPlNldEN1clNlbCgtMSk7Ci0gICAgbV9wRGF0YUFjYy0+R2V0VmFsdWUod3NUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7Ci0gICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5TZXRFZGl0VGV4dCh3c1RleHQpOwotICB9Ci0gIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDWEZBX0ZGQ29tYm9Cb3g6OkNhblVuZG8oKSB7Ci0gIHJldHVybiBtX3BEYXRhQWNjLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpICYmCi0gICAgICAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXRDYW5VbmRvKCk7Ci19Ci1ib29sIENYRkFfRkZDb21ib0JveDo6Q2FuUmVkbygpIHsKLSAgcmV0dXJuIG1fcERhdGFBY2MtPklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkgJiYKLSAgICAgICAgICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+RWRpdENhblJlZG8oKTsKLX0KLWJvb2wgQ1hGQV9GRkNvbWJvQm94OjpVbmRvKCkgewotICByZXR1cm4gbV9wRGF0YUFjYy0+SXNDaG9pY2VMaXN0QWxsb3dUZXh0RW50cnkoKSAmJgotICAgICAgICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0VW5kbygpOwotfQotYm9vbCBDWEZBX0ZGQ29tYm9Cb3g6OlJlZG8oKSB7Ci0gIHJldHVybiBtX3BEYXRhQWNjLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpICYmCi0gICAgICAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXRSZWRvKCk7Ci19Ci1ib29sIENYRkFfRkZDb21ib0JveDo6Q2FuQ29weSgpIHsKLSAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+RWRpdENhbkNvcHkoKTsKLX0KLWJvb2wgQ1hGQV9GRkNvbWJvQm94OjpDYW5DdXQoKSB7Ci0gIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBtX3BEYXRhQWNjLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpICYmCi0gICAgICAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXRDYW5DdXQoKTsKLX0KLWJvb2wgQ1hGQV9GRkNvbWJvQm94OjpDYW5QYXN0ZSgpIHsKLSAgcmV0dXJuIG1fcERhdGFBY2MtPklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkgJiYKLSAgICAgICAgIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuKTsKLX0KLWJvb2wgQ1hGQV9GRkNvbWJvQm94OjpDYW5TZWxlY3RBbGwoKSB7Ci0gIHJldHVybiAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXRDYW5TZWxlY3RBbGwoKTsKLX0KLWJvb2wgQ1hGQV9GRkNvbWJvQm94OjpDb3B5KENGWF9XaWRlU3RyaW5nJiB3c0NvcHkpIHsKLSAgcmV0dXJuICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+RWRpdENvcHkod3NDb3B5KTsKLX0KLWJvb2wgQ1hGQV9GRkNvbWJvQm94OjpDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KSB7Ci0gIHJldHVybiBtX3BEYXRhQWNjLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpICYmCi0gICAgICAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXRDdXQod3NDdXQpOwotfQotYm9vbCBDWEZBX0ZGQ29tYm9Cb3g6OlBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Bhc3RlKSB7Ci0gIHJldHVybiBtX3BEYXRhQWNjLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpICYmCi0gICAgICAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPkVkaXRQYXN0ZSh3c1Bhc3RlKTsKLX0KLXZvaWQgQ1hGQV9GRkNvbWJvQm94OjpTZWxlY3RBbGwoKSB7Ci0gICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+RWRpdFNlbGVjdEFsbCgpOwotfQotdm9pZCBDWEZBX0ZGQ29tYm9Cb3g6OkRlbGV0ZSgpIHsKLSAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5FZGl0RGVsZXRlKCk7Ci19Ci12b2lkIENYRkFfRkZDb21ib0JveDo6RGVTZWxlY3QoKSB7Ci0gICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+RWRpdERlU2VsZWN0KCk7Ci19Ci12b2lkIENYRkFfRkZDb21ib0JveDo6U2V0SXRlbVN0YXRlKGludDMyX3QgbkluZGV4LCBib29sIGJTZWxlY3RlZCkgewotICBpZiAoYlNlbGVjdGVkKSB7Ci0gICAgKChDRldMX0NvbWJvQm94KiltX3BOb3JtYWxXaWRnZXQpLT5TZXRDdXJTZWwobkluZGV4KTsKLSAgfSBlbHNlIHsKLSAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPlNldEN1clNlbCgtMSk7Ci0gIH0KLSAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsKLSAgQWRkSW52YWxpZGF0ZVJlY3QoKTsKLX0KLXZvaWQgQ1hGQV9GRkNvbWJvQm94OjpJbnNlcnRJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4KSB7Ci0gICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+QWRkU3RyaW5nKHdzTGFiZWwpOwotICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOwotICBBZGRJbnZhbGlkYXRlUmVjdCgpOwotfQotdm9pZCBDWEZBX0ZGQ29tYm9Cb3g6OkRlbGV0ZUl0ZW0oaW50MzJfdCBuSW5kZXgpIHsKLSAgaWYgKG5JbmRleCA8IDApIHsKLSAgICAoKENGV0xfQ29tYm9Cb3gqKW1fcE5vcm1hbFdpZGdldCktPlJlbW92ZUFsbCgpOwotICB9IGVsc2UgewotICAgICgoQ0ZXTF9Db21ib0JveCopbV9wTm9ybWFsV2lkZ2V0KS0+UmVtb3ZlQXQobkluZGV4KTsKLSAgfQotICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOwotICBBZGRJbnZhbGlkYXRlUmVjdCgpOwotfQotdm9pZCBDWEZBX0ZGQ29tYm9Cb3g6Ok9uVGV4dENoYW5nZWQoQ0ZXTF9XaWRnZXQqIHBXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDaGFuZ2VkKSB7Ci0gIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07Ci0gIG1fcERhdGFBY2MtPkdldFZhbHVlKGVQYXJhbS5tX3dzUHJldlRleHQsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsKLSAgZVBhcmFtLm1fd3NDaGFuZ2UgPSB3c0NoYW5nZWQ7Ci0gIEZXTEV2ZW50U2VsQ2hhbmdlKCZlUGFyYW0pOwotfQotdm9pZCBDWEZBX0ZGQ29tYm9Cb3g6Ok9uU2VsZWN0Q2hhbmdlZChDRldMX1dpZGdldCogcFdpZGdldCwgYm9vbCBiTEJ1dHRvblVwKSB7Ci0gIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07Ci0gIG1fcERhdGFBY2MtPkdldFZhbHVlKGVQYXJhbS5tX3dzUHJldlRleHQsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsKLSAgRldMRXZlbnRTZWxDaGFuZ2UoJmVQYXJhbSk7Ci0gIGlmIChtX3BEYXRhQWNjLT5HZXRDaG9pY2VMaXN0Q29tbWl0T24oKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9TZWxlY3QgJiYKLSAgICAgIGJMQnV0dG9uVXApIHsKLSAgICBtX3BEb2NWaWV3LT5TZXRGb2N1c1dpZGdldEFjYyhudWxscHRyKTsKLSAgfQotfQotdm9pZCBDWEZBX0ZGQ29tYm9Cb3g6Ok9uUHJlT3BlbihDRldMX1dpZGdldCogcFdpZGdldCkgewotICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOwotICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9QcmVPcGVuOwotICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsKLSAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX1ByZU9wZW4sICZlUGFyYW0pOwotfQotdm9pZCBDWEZBX0ZGQ29tYm9Cb3g6Ok9uUG9zdE9wZW4oQ0ZXTF9XaWRnZXQqIHBXaWRnZXQpIHsKLSAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsKLSAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfUG9zdE9wZW47Ci0gIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOwotICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fUG9zdE9wZW4sICZlUGFyYW0pOwotfQotCi12b2lkIENYRkFfRkZDb21ib0JveDo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7Ci0gIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsKLX0KLQotdm9pZCBDWEZBX0ZGQ29tYm9Cb3g6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgewotICBDWEZBX0ZGRmllbGQ6Ok9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7Ci0gIHN3aXRjaCAocEV2ZW50LT5HZXRUeXBlKCkpIHsKLSAgICBjYXNlIENGV0xfRXZlbnQ6OlR5cGU6OlNlbGVjdENoYW5nZWQ6IHsKLSAgICAgIENGV0xfRXZlbnRTZWxlY3RDaGFuZ2VkKiBwb3N0RXZlbnQgPQotICAgICAgICAgIHN0YXRpY19jYXN0PENGV0xfRXZlbnRTZWxlY3RDaGFuZ2VkKj4ocEV2ZW50KTsKLSAgICAgIE9uU2VsZWN0Q2hhbmdlZChtX3BOb3JtYWxXaWRnZXQsIHBvc3RFdmVudC0+YkxCdXR0b25VcCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBDRldMX0V2ZW50OjpUeXBlOjpFZGl0Q2hhbmdlZDogewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGFuZ2VkOwotICAgICAgT25UZXh0Q2hhbmdlZChtX3BOb3JtYWxXaWRnZXQsIHdzQ2hhbmdlZCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBDRldMX0V2ZW50OjpUeXBlOjpQcmVEcm9wRG93bjogewotICAgICAgT25QcmVPcGVuKG1fcE5vcm1hbFdpZGdldCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBDRldMX0V2ZW50OjpUeXBlOjpQb3N0RHJvcERvd246IHsKLSAgICAgIE9uUG9zdE9wZW4obV9wTm9ybWFsV2lkZ2V0KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLSAgbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7Ci19Ci0KLXZvaWQgQ1hGQV9GRkNvbWJvQm94OjpPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgbV9wT2xkRGVsZWdhdGUtPk9uRHJhd1dpZGdldChwR3JhcGhpY3MsIHBNYXRyaXgpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL3hmYV9mZmNob2ljZWxpc3QuaCBiL3hmYS9meGZhL2FwcC94ZmFfZmZjaG9pY2VsaXN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4OTM2NmEuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvYXBwL3hmYV9mZmNob2ljZWxpc3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhGQV9BUFBfWEZBX0ZGQ0hPSUNFTElTVF9IXwotI2RlZmluZSBYRkFfRlhGQV9BUFBfWEZBX0ZGQ0hPSUNFTElTVF9IXwotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZmZpZWxkLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmcGFnZXZpZXcuaCIKLQotY2xhc3MgQ1hGQV9GRkxpc3RCb3ggOiBwdWJsaWMgQ1hGQV9GRkZpZWxkIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfRkZMaXN0Qm94KENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7Ci0gIH5DWEZBX0ZGTGlzdEJveCgpIG92ZXJyaWRlOwotCi0gIC8vIENYRkFfRkZGaWVsZAotICBib29sIExvYWRXaWRnZXQoKSBvdmVycmlkZTsKLSAgYm9vbCBPbktpbGxGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwTmV3V2lkZ2V0KSBvdmVycmlkZTsKLSAgdm9pZCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIG92ZXJyaWRlOwotICB2b2lkIE9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gbnVsbHB0cikgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBPblNlbGVjdENoYW5nZWQoQ0ZXTF9XaWRnZXQqIHBXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+JiBhcnJTZWxzKTsKLSAgdm9pZCBTZXRJdGVtU3RhdGUoaW50MzJfdCBuSW5kZXgsIGJvb2wgYlNlbGVjdGVkKTsKLSAgdm9pZCBJbnNlcnRJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMYWJlbCwgaW50MzJfdCBuSW5kZXggPSAtMSk7Ci0gIHZvaWQgRGVsZXRlSXRlbShpbnQzMl90IG5JbmRleCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGJvb2wgQ29tbWl0RGF0YSgpIG92ZXJyaWRlOwotICBib29sIFVwZGF0ZUZXTERhdGEoKSBvdmVycmlkZTsKLSAgYm9vbCBJc0RhdGFDaGFuZ2VkKCkgb3ZlcnJpZGU7Ci0KLSAgdWludDMyX3QgR2V0QWxpZ25tZW50KCk7Ci0KLSAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogbV9wT2xkRGVsZWdhdGU7Ci19OwotCi1jbGFzcyBDWEZBX0ZGQ29tYm9Cb3ggOiBwdWJsaWMgQ1hGQV9GRkZpZWxkIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfRkZDb21ib0JveChDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOwotICB+Q1hGQV9GRkNvbWJvQm94KCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ1hGQV9GRkZpZWxkCi0gIENGWF9SZWN0RiBHZXRCQm94KHVpbnQzMl90IGR3U3RhdHVzLCBib29sIGJEcmF3Rm9jdXMgPSBmYWxzZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgTG9hZFdpZGdldCgpIG92ZXJyaWRlOwotICB2b2lkIFVwZGF0ZVdpZGdldFByb3BlcnR5KCkgb3ZlcnJpZGU7Ci0gIGJvb2wgT25SQnV0dG9uVXAodWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOwotICBib29sIE9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdXaWRnZXQpIG92ZXJyaWRlOwotICBib29sIENhblVuZG8oKSBvdmVycmlkZTsKLSAgYm9vbCBDYW5SZWRvKCkgb3ZlcnJpZGU7Ci0gIGJvb2wgVW5kbygpIG92ZXJyaWRlOwotICBib29sIFJlZG8oKSBvdmVycmlkZTsKLQotICBib29sIENhbkNvcHkoKSBvdmVycmlkZTsKLSAgYm9vbCBDYW5DdXQoKSBvdmVycmlkZTsKLSAgYm9vbCBDYW5QYXN0ZSgpIG92ZXJyaWRlOwotICBib29sIENhblNlbGVjdEFsbCgpIG92ZXJyaWRlOwotICBib29sIENvcHkoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29weSkgb3ZlcnJpZGU7Ci0gIGJvb2wgQ3V0KENGWF9XaWRlU3RyaW5nJiB3c0N1dCkgb3ZlcnJpZGU7Ci0gIGJvb2wgUGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGFzdGUpIG92ZXJyaWRlOwotICB2b2lkIFNlbGVjdEFsbCgpIG92ZXJyaWRlOwotICB2b2lkIERlbGV0ZSgpIG92ZXJyaWRlOwotICB2b2lkIERlU2VsZWN0KCkgb3ZlcnJpZGU7Ci0KLSAgLy8gSUZXTF9XaWRnZXREZWxlZ2F0ZQotICB2b2lkIE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSBvdmVycmlkZTsKLSAgdm9pZCBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBudWxscHRyKSBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgT3BlbkRyb3BEb3duTGlzdCgpOwotCi0gIHZvaWQgT25UZXh0Q2hhbmdlZChDRldMX1dpZGdldCogcFdpZGdldCwgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ2hhbmdlZCk7Ci0gIHZvaWQgT25TZWxlY3RDaGFuZ2VkKENGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBib29sIGJMQnV0dG9uVXApOwotICB2b2lkIE9uUHJlT3BlbihDRldMX1dpZGdldCogcFdpZGdldCk7Ci0gIHZvaWQgT25Qb3N0T3BlbihDRldMX1dpZGdldCogcFdpZGdldCk7Ci0gIHZvaWQgU2V0SXRlbVN0YXRlKGludDMyX3QgbkluZGV4LCBib29sIGJTZWxlY3RlZCk7Ci0gIHZvaWQgSW5zZXJ0SXRlbShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTGFiZWwsIGludDMyX3QgbkluZGV4ID0gLTEpOwotICB2b2lkIERlbGV0ZUl0ZW0oaW50MzJfdCBuSW5kZXgpOwotCi0gcHJvdGVjdGVkOgotICAvLyBDWEZBX0ZGRmllbGQKLSAgYm9vbCBQdEluQWN0aXZlUmVjdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7Ci0gIGJvb2wgQ29tbWl0RGF0YSgpIG92ZXJyaWRlOwotICBib29sIFVwZGF0ZUZXTERhdGEoKSBvdmVycmlkZTsKLSAgYm9vbCBJc0RhdGFDaGFuZ2VkKCkgb3ZlcnJpZGU7Ci0KLSAgdWludDMyX3QgR2V0QWxpZ25tZW50KCk7Ci0gIHZvaWQgRldMRXZlbnRTZWxDaGFuZ2UoQ1hGQV9FdmVudFBhcmFtKiBwUGFyYW0pOwotCi0gIENGWF9XaWRlU3RyaW5nIG1fd3NOZXdWYWx1ZTsKLSAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogbV9wT2xkRGVsZWdhdGU7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEZBX0FQUF9YRkFfRkZDSE9JQ0VMSVNUX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAveGZhX2ZmZG9jLmNwcCBiL3hmYS9meGZhL2FwcC94ZmFfZmZkb2MuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTFiZGY4Li4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfZmZkb2MuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDQxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmRvYy5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZS5oIgotI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX25hbWV0cmVlLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9leHQuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X21lbW9yeS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL3htbC9mZGVfeG1sX2ltcC5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9ub3RlZHJpdmVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZm5vdGlmeS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGFleHBvcnRlci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGFpbXBvcnRlci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2NoZWNrc3VtLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmYXBwLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jdmlldy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZndpZGdldC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mb250bWdyLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLXN0cnVjdCBGWF9CQVNFNjREQVRBIHsKLSAgdWludDMyX3QgZGF0YTEgOiAyOwotICB1aW50MzJfdCBkYXRhMiA6IDY7Ci0gIHVpbnQzMl90IGRhdGEzIDogNDsKLSAgdWludDMyX3QgZGF0YTQgOiA0OwotICB1aW50MzJfdCBkYXRhNSA6IDY7Ci0gIHVpbnQzMl90IGRhdGE2IDogMjsKLSAgdWludDMyX3QgZGF0YTcgOiA4OwotfTsKLQotY29uc3QgdWludDhfdCBrU3RhcnRWYWx1ZXNSZW1vdmVkID0gNDM7Ci1jb25zdCB1aW50OF90IGtEZWNvZGVyTWFwU2l6ZSA9IDgwOwotY29uc3QgdWludDhfdCBnX0ZYQmFzZTY0RGVjb2Rlck1hcFtrRGVjb2Rlck1hcFNpemVdID0gewotICAgIDB4M0UsIDB4RkYsIDB4RkYsIDB4RkYsIDB4M0YsIDB4MzQsIDB4MzUsIDB4MzYsIDB4MzcsIDB4MzgsIDB4MzksIDB4M0EsCi0gICAgMHgzQiwgMHgzQywgMHgzRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMSwKLSAgICAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELAotICAgIDB4MEUsIDB4MEYsIDB4MTAsIDB4MTEsIDB4MTIsIDB4MTMsIDB4MTQsIDB4MTUsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksCi0gICAgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxQSwgMHgxQiwgMHgxQywgMHgxRCwgMHgxRSwgMHgxRiwKLSAgICAweDIwLCAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJBLCAweDJCLAotICAgIDB4MkMsIDB4MkQsIDB4MkUsIDB4MkYsIDB4MzAsIDB4MzEsIDB4MzIsIDB4MzMsCi19OwotCi11aW50OF90IGJhc2U2NERlY29kZXJWYWx1ZSh1aW50OF90IHZhbCkgewotICBpZiAodmFsIDwga1N0YXJ0VmFsdWVzUmVtb3ZlZCB8fCB2YWwgPj0ga1N0YXJ0VmFsdWVzUmVtb3ZlZCArIGtEZWNvZGVyTWFwU2l6ZSkKLSAgICByZXR1cm4gMHhGRjsKLSAgcmV0dXJuIGdfRlhCYXNlNjREZWNvZGVyTWFwW3ZhbCAtIGtTdGFydFZhbHVlc1JlbW92ZWRdOwotfQotCi12b2lkIEJhc2U2NERlY29kZVBpZWNlKGNvbnN0IEZYX0NIQVIgc3JjWzRdLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDaGFycywKLSAgICAgICAgICAgICAgICAgICAgICAgRlhfQkFTRTY0REFUQSYgZHN0LAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpQnl0ZXMpIHsKLSAgQVNTRVJUKGlDaGFycyA+IDAgJiYgaUNoYXJzIDwgNSk7Ci0gIGlCeXRlcyA9IDE7Ci0gIGRzdC5kYXRhMiA9IGJhc2U2NERlY29kZXJWYWx1ZShzdGF0aWNfY2FzdDx1aW50OF90PihzcmNbMF0pKTsKLSAgaWYgKGlDaGFycyA+IDEpIHsKLSAgICB1aW50OF90IGIgPSBiYXNlNjREZWNvZGVyVmFsdWUoc3RhdGljX2Nhc3Q8dWludDhfdD4oc3JjWzFdKSk7Ci0gICAgZHN0LmRhdGExID0gYiA+PiA0OwotICAgIGRzdC5kYXRhNCA9IGI7Ci0gICAgaWYgKGlDaGFycyA+IDIpIHsKLSAgICAgIGlCeXRlcyA9IDI7Ci0gICAgICBiID0gYmFzZTY0RGVjb2RlclZhbHVlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyY1syXSkpOwotICAgICAgZHN0LmRhdGEzID0gYiA+PiAyOwotICAgICAgZHN0LmRhdGE2ID0gYjsKLSAgICAgIGlmIChpQ2hhcnMgPiAzKSB7Ci0gICAgICAgIGlCeXRlcyA9IDM7Ci0gICAgICAgIGRzdC5kYXRhNSA9IGJhc2U2NERlY29kZXJWYWx1ZShzdGF0aWNfY2FzdDx1aW50OF90PihzcmNbM10pKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGRzdC5kYXRhNSA9IDA7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGRzdC5kYXRhMyA9IDA7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGRzdC5kYXRhMSA9IDA7Ci0gIH0KLX0KLQotaW50MzJfdCBCYXNlNjREZWNvZGVXKGNvbnN0IEZYX1dDSEFSKiBwU3JjLCBpbnQzMl90IGlTcmNMZW4sIHVpbnQ4X3QqIHBEc3QpIHsKLSAgQVNTRVJUKHBTcmMpOwotICBpZiAoaVNyY0xlbiA8IDEpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICB3aGlsZSAoaVNyY0xlbiA+IDAgJiYgcFNyY1tpU3JjTGVuIC0gMV0gPT0gJz0nKSB7Ci0gICAgaVNyY0xlbi0tOwotICB9Ci0gIGlmIChpU3JjTGVuIDwgMSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIGlmICghcERzdCkgewotICAgIGludDMyX3QgaURzdExlbiA9IGlTcmNMZW4gLyA0ICogMzsKLSAgICBpU3JjTGVuICU9IDQ7Ci0gICAgaWYgKGlTcmNMZW4gPT0gMSkgewotICAgICAgaURzdExlbiArPSAxOwotICAgIH0gZWxzZSBpZiAoaVNyY0xlbiA9PSAyKSB7Ci0gICAgICBpRHN0TGVuICs9IDE7Ci0gICAgfSBlbHNlIGlmIChpU3JjTGVuID09IDMpIHsKLSAgICAgIGlEc3RMZW4gKz0gMjsKLSAgICB9Ci0gICAgcmV0dXJuIGlEc3RMZW47Ci0gIH0KLSAgRlhfQ0hBUiBzcmNEYXRhWzRdOwotICBGWF9CQVNFNjREQVRBIGRzdERhdGE7Ci0gIGludDMyX3QgaUNoYXJzID0gNCwgaUJ5dGVzOwotICB1aW50OF90KiBwRHN0RW5kID0gcERzdDsKLSAgd2hpbGUgKGlTcmNMZW4gPiAwKSB7Ci0gICAgaWYgKGlTcmNMZW4gPiAzKSB7Ci0gICAgICBzcmNEYXRhWzBdID0gKEZYX0NIQVIpKnBTcmMrKzsKLSAgICAgIHNyY0RhdGFbMV0gPSAoRlhfQ0hBUikqcFNyYysrOwotICAgICAgc3JjRGF0YVsyXSA9IChGWF9DSEFSKSpwU3JjKys7Ci0gICAgICBzcmNEYXRhWzNdID0gKEZYX0NIQVIpKnBTcmMrKzsKLSAgICAgIGlTcmNMZW4gLT0gNDsKLSAgICB9IGVsc2UgewotICAgICAgKigodWludDMyX3QqKSZkc3REYXRhKSA9IDA7Ci0gICAgICAqKCh1aW50MzJfdCopc3JjRGF0YSkgPSAwOwotICAgICAgc3JjRGF0YVswXSA9IChGWF9DSEFSKSpwU3JjKys7Ci0gICAgICBpZiAoaVNyY0xlbiA+IDEpIHsKLSAgICAgICAgc3JjRGF0YVsxXSA9IChGWF9DSEFSKSpwU3JjKys7Ci0gICAgICB9Ci0gICAgICBpZiAoaVNyY0xlbiA+IDIpIHsKLSAgICAgICAgc3JjRGF0YVsyXSA9IChGWF9DSEFSKSpwU3JjKys7Ci0gICAgICB9Ci0gICAgICBpQ2hhcnMgPSBpU3JjTGVuOwotICAgICAgaVNyY0xlbiA9IDA7Ci0gICAgfQotICAgIEJhc2U2NERlY29kZVBpZWNlKHNyY0RhdGEsIGlDaGFycywgZHN0RGF0YSwgaUJ5dGVzKTsKLSAgICAqcERzdEVuZCsrID0gKCh1aW50OF90KikmZHN0RGF0YSlbMF07Ci0gICAgaWYgKGlCeXRlcyA+IDEpIHsKLSAgICAgICpwRHN0RW5kKysgPSAoKHVpbnQ4X3QqKSZkc3REYXRhKVsxXTsKLSAgICB9Ci0gICAgaWYgKGlCeXRlcyA+IDIpIHsKLSAgICAgICpwRHN0RW5kKysgPSAoKHVpbnQ4X3QqKSZkc3REYXRhKVsyXTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHBEc3RFbmQgLSBwRHN0OwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotQ1hGQV9GRkRvYzo6Q1hGQV9GRkRvYyhDWEZBX0ZGQXBwKiBwQXBwLCBJWEZBX0RvY0Vudmlyb25tZW50KiBwRG9jRW52aXJvbm1lbnQpCi0gICAgOiBtX3BEb2NFbnZpcm9ubWVudChwRG9jRW52aXJvbm1lbnQpLAotICAgICAgbV9wRG9jdW1lbnRQYXJzZXIobnVsbHB0ciksCi0gICAgICBtX3BBcHAocEFwcCksCi0gICAgICBtX3BOb3RpZnkobnVsbHB0ciksCi0gICAgICBtX3BQREZEb2MobnVsbHB0ciksCi0gICAgICBtX2R3RG9jVHlwZShYRkFfRE9DVFlQRV9TdGF0aWMpIHt9Ci0KLUNYRkFfRkZEb2M6On5DWEZBX0ZGRG9jKCkgewotICBDbG9zZURvYygpOwotfQotCi11aW50MzJfdCBDWEZBX0ZGRG9jOjpHZXREb2NUeXBlKCkgewotICByZXR1cm4gbV9kd0RvY1R5cGU7Ci19Ci0KLWludDMyX3QgQ1hGQV9GRkRvYzo6U3RhcnRMb2FkKCkgewotICBtX3BOb3RpZnkgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GRk5vdGlmeT4odGhpcyk7Ci0gIG1fcERvY3VtZW50UGFyc2VyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRG9jdW1lbnRQYXJzZXI+KG1fcE5vdGlmeS5nZXQoKSk7Ci0gIHJldHVybiBtX3BEb2N1bWVudFBhcnNlci0+U3RhcnRQYXJzZShtX3BTdHJlYW0sIFhGQV9YRFBQQUNLRVRfWERQKTsKLX0KLQotYm9vbCBYRkFfR2V0UERGQ29udGVudHNGcm9tUERGWE1MKENGREVfWE1MTm9kZSogcFBERkVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdComIHBCeXRlQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlCdWZmZXJTaXplKSB7Ci0gIENGREVfWE1MRWxlbWVudCogcERvY3VtZW50RWxlbWVudCA9IG51bGxwdHI7Ci0gIGZvciAoQ0ZERV9YTUxOb2RlKiBwWE1MTm9kZSA9Ci0gICAgICAgICAgIHBQREZFbGVtZW50LT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOwotICAgICAgIHBYTUxOb2RlOyBwWE1MTm9kZSA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgewotICAgIGlmIChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGFnTmFtZTsKLSAgICAgIENGREVfWE1MRWxlbWVudCogcFhNTEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwWE1MTm9kZSk7Ci0gICAgICBwWE1MRWxlbWVudC0+R2V0VGFnTmFtZSh3c1RhZ05hbWUpOwotICAgICAgaWYgKHdzVGFnTmFtZSA9PSBMImRvY3VtZW50IikgewotICAgICAgICBwRG9jdW1lbnRFbGVtZW50ID0gcFhNTEVsZW1lbnQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICBpZiAoIXBEb2N1bWVudEVsZW1lbnQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQ0ZERV9YTUxFbGVtZW50KiBwQ2h1bmtFbGVtZW50ID0gbnVsbHB0cjsKLSAgZm9yIChDRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0KLSAgICAgICAgICAgcERvY3VtZW50RWxlbWVudC0+R2V0Tm9kZUl0ZW0oQ0ZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsKLSAgICAgICBwWE1MTm9kZTsgcFhNTE5vZGUgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsKLSAgICBpZiAocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c1RhZ05hbWU7Ci0gICAgICBDRkRFX1hNTEVsZW1lbnQqIHBYTUxFbGVtZW50ID0gc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4ocFhNTE5vZGUpOwotICAgICAgcFhNTEVsZW1lbnQtPkdldFRhZ05hbWUod3NUYWdOYW1lKTsKLSAgICAgIGlmICh3c1RhZ05hbWUgPT0gTCJjaHVuayIpIHsKLSAgICAgICAgcENodW5rRWxlbWVudCA9IHBYTUxFbGVtZW50OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaWYgKCFwQ2h1bmtFbGVtZW50KSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIENGWF9XaWRlU3RyaW5nIHdzUERGQ29udGVudDsKLSAgcENodW5rRWxlbWVudC0+R2V0VGV4dERhdGEod3NQREZDb250ZW50KTsKLSAgaUJ1ZmZlclNpemUgPQotICAgICAgQmFzZTY0RGVjb2RlVyh3c1BERkNvbnRlbnQuY19zdHIoKSwgd3NQREZDb250ZW50LkdldExlbmd0aCgpLCBudWxscHRyKTsKLSAgcEJ5dGVCdWZmZXIgPSBGWF9BbGxvYyh1aW50OF90LCBpQnVmZmVyU2l6ZSArIDEpOwotICBwQnl0ZUJ1ZmZlcltpQnVmZmVyU2l6ZV0gPSAnMCc7ICAvLyBGSVhNRTogSSBiZXQgdGhpcyBpcyB3cm9uZy4KLSAgQmFzZTY0RGVjb2RlVyh3c1BERkNvbnRlbnQuY19zdHIoKSwgd3NQREZDb250ZW50LkdldExlbmd0aCgpLCBwQnl0ZUJ1ZmZlcik7Ci0gIHJldHVybiB0cnVlOwotfQotdm9pZCBYRkFfWFBEUGFja2V0X01lcmdlUm9vdE5vZGUoQ1hGQV9Ob2RlKiBwT3JpZ2luUm9vdCwgQ1hGQV9Ob2RlKiBwTmV3Um9vdCkgewotICBDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwTmV3Um9vdC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICB3aGlsZSAocENoaWxkTm9kZSkgewotICAgIENYRkFfTm9kZSogcE9yaWdpbkNoaWxkID0KLSAgICAgICAgcE9yaWdpblJvb3QtPkdldEZpcnN0Q2hpbGRCeU5hbWUocENoaWxkTm9kZS0+R2V0TmFtZUhhc2goKSk7Ci0gICAgaWYgKHBPcmlnaW5DaGlsZCkgewotICAgICAgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIENYRkFfTm9kZSogcE5leHRTaWJsaW5nID0KLSAgICAgICAgICBwQ2hpbGROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOwotICAgICAgcE5ld1Jvb3QtPlJlbW92ZUNoaWxkKHBDaGlsZE5vZGUpOwotICAgICAgcE9yaWdpblJvb3QtPkluc2VydENoaWxkKHBDaGlsZE5vZGUpOwotICAgICAgcENoaWxkTm9kZSA9IHBOZXh0U2libGluZzsKLSAgICAgIHBOZXh0U2libGluZyA9IG51bGxwdHI7Ci0gICAgfQotICB9Ci19Ci0KLWludDMyX3QgQ1hGQV9GRkRvYzo6RG9Mb2FkKElGWF9QYXVzZSogcFBhdXNlKSB7Ci0gIGludDMyX3QgaVN0YXR1cyA9IG1fcERvY3VtZW50UGFyc2VyLT5Eb1BhcnNlKHBQYXVzZSk7Ci0gIGlmIChpU3RhdHVzID09IFhGQV9QQVJTRVNUQVRVU19Eb25lICYmICFtX3BQREZEb2MpCi0gICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TeW50YXhFcnI7Ci0gIHJldHVybiBpU3RhdHVzOwotfQotCi12b2lkIENYRkFfRkZEb2M6OlN0b3BMb2FkKCkgewotICBtX3BBcHAtPkdldFhGQUZvbnRNZ3IoKS0+TG9hZERvY0ZvbnRzKHRoaXMpOwotICBtX2R3RG9jVHlwZSA9IFhGQV9ET0NUWVBFX1N0YXRpYzsKLSAgQ1hGQV9Ob2RlKiBwQ29uZmlnID0gVG9Ob2RlKAotICAgICAgbV9wRG9jdW1lbnRQYXJzZXItPkdldERvY3VtZW50KCktPkdldFhGQU9iamVjdChYRkFfSEFTSENPREVfQ29uZmlnKSk7Ci0gIGlmICghcENvbmZpZykgewotICAgIHJldHVybjsKLSAgfQotICBDWEZBX05vZGUqIHBBY3JvYmF0ID0gcENvbmZpZy0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VsZW1lbnQ6OkFjcm9iYXQpOwotICBpZiAoIXBBY3JvYmF0KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfTm9kZSogcEFjcm9iYXQ3ID0gcEFjcm9iYXQtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpBY3JvYmF0Nyk7Ci0gIGlmICghcEFjcm9iYXQ3KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfTm9kZSogcER5bmFtaWNSZW5kZXIgPQotICAgICAgcEFjcm9iYXQ3LT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRWxlbWVudDo6RHluYW1pY1JlbmRlcik7Ci0gIGlmICghcER5bmFtaWNSZW5kZXIpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NUeXBlOwotICBpZiAocER5bmFtaWNSZW5kZXItPlRyeUNvbnRlbnQod3NUeXBlKSAmJiB3c1R5cGUgPT0gTCJyZXF1aXJlZCIpIHsKLSAgICBtX2R3RG9jVHlwZSA9IFhGQV9ET0NUWVBFX0R5bmFtaWM7Ci0gIH0KLX0KLQotQ1hGQV9GRkRvY1ZpZXcqIENYRkFfRkZEb2M6OkNyZWF0ZURvY1ZpZXcodWludDMyX3QgZHdWaWV3KSB7Ci0gIGlmICghbV9UeXBlVG9Eb2NWaWV3TWFwW2R3Vmlld10pCi0gICAgbV9UeXBlVG9Eb2NWaWV3TWFwW2R3Vmlld10gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GRkRvY1ZpZXc+KHRoaXMpOwotCi0gIHJldHVybiBtX1R5cGVUb0RvY1ZpZXdNYXBbZHdWaWV3XS5nZXQoKTsKLX0KLQotQ1hGQV9GRkRvY1ZpZXcqIENYRkFfRkZEb2M6OkdldERvY1ZpZXcoQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXQpIHsKLSAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbV9UeXBlVG9Eb2NWaWV3TWFwKSB7Ci0gICAgaWYgKHBhaXIuc2Vjb25kLT5HZXRYRkFMYXlvdXQoKSA9PSBwTGF5b3V0KQotICAgICAgcmV0dXJuIHBhaXIuc2Vjb25kLmdldCgpOwotICB9Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1DWEZBX0ZGRG9jVmlldyogQ1hGQV9GRkRvYzo6R2V0RG9jVmlldygpIHsKLSAgYXV0byBpdCA9IG1fVHlwZVRvRG9jVmlld01hcC5iZWdpbigpOwotICByZXR1cm4gaXQgIT0gbV9UeXBlVG9Eb2NWaWV3TWFwLmVuZCgpID8gaXQtPnNlY29uZC5nZXQoKSA6IG51bGxwdHI7Ci19Ci0KLWJvb2wgQ1hGQV9GRkRvYzo6T3BlbkRvYyhjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwU3RyZWFtKSB7Ci0gIG1fcFN0cmVhbSA9IHBTdHJlYW07Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDWEZBX0ZGRG9jOjpPcGVuRG9jKENQREZfRG9jdW1lbnQqIHBQREZEb2MpIHsKLSAgaWYgKCFwUERGRG9jKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDUERGX0RpY3Rpb25hcnkqIHBSb290ID0gcFBERkRvYy0+R2V0Um9vdCgpOwotICBpZiAoIXBSb290KQotICAgIHJldHVybiBmYWxzZTsKLQotICBDUERGX0RpY3Rpb25hcnkqIHBBY3JvRm9ybSA9IHBSb290LT5HZXREaWN0Rm9yKCJBY3JvRm9ybSIpOwotICBpZiAoIXBBY3JvRm9ybSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1BERl9PYmplY3QqIHBFbGVtZW50WEZBID0gcEFjcm9Gb3JtLT5HZXREaXJlY3RPYmplY3RGb3IoIlhGQSIpOwotICBpZiAoIXBFbGVtZW50WEZBKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzdGQ6OnZlY3RvcjxDUERGX1N0cmVhbSo+IHhmYVN0cmVhbXM7Ci0gIGlmIChwRWxlbWVudFhGQS0+SXNBcnJheSgpKSB7Ci0gICAgQ1BERl9BcnJheSogcFhGQUFycmF5ID0gKENQREZfQXJyYXkqKXBFbGVtZW50WEZBOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcFhGQUFycmF5LT5HZXRDb3VudCgpIC8gMjsgaSsrKSB7Ci0gICAgICBpZiAoQ1BERl9TdHJlYW0qIHBTdHJlYW0gPSBwWEZBQXJyYXktPkdldFN0cmVhbUF0KGkgKiAyICsgMSkpCi0gICAgICAgIHhmYVN0cmVhbXMucHVzaF9iYWNrKHBTdHJlYW0pOwotICAgIH0KLSAgfSBlbHNlIGlmIChwRWxlbWVudFhGQS0+SXNTdHJlYW0oKSkgewotICAgIHhmYVN0cmVhbXMucHVzaF9iYWNrKChDUERGX1N0cmVhbSopcEVsZW1lbnRYRkEpOwotICB9Ci0gIGlmICh4ZmFTdHJlYW1zLmVtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG1fcFBERkRvYyA9IHBQREZEb2M7Ci0gIG1fcFN0cmVhbSA9IE1ha2VTZWVrYWJsZVJlYWRTdHJlYW0oeGZhU3RyZWFtcyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENYRkFfRkZEb2M6OkNsb3NlRG9jKCkgewotICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtX1R5cGVUb0RvY1ZpZXdNYXApCi0gICAgcGFpci5zZWNvbmQtPlJ1bkRvY0Nsb3NlKCk7Ci0KLSAgQ1hGQV9Eb2N1bWVudCogZG9jID0KLSAgICAgIG1fcERvY3VtZW50UGFyc2VyID8gbV9wRG9jdW1lbnRQYXJzZXItPkdldERvY3VtZW50KCkgOiBudWxscHRyOwotICBpZiAoZG9jKQotICAgIGRvYy0+Q2xlYXJMYXlvdXREYXRhKCk7Ci0KLSAgbV9UeXBlVG9Eb2NWaWV3TWFwLmNsZWFyKCk7Ci0KLSAgbV9wTm90aWZ5LnJlc2V0KG51bGxwdHIpOwotICBtX3BBcHAtPkdldFhGQUZvbnRNZ3IoKS0+UmVsZWFzZURvY0ZvbnRzKHRoaXMpOwotCi0gIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1fSGFzaFRvRGliRHBpTWFwKQotICAgIGRlbGV0ZSBwYWlyLnNlY29uZC5wRGliU291cmNlOwotCi0gIG1fSGFzaFRvRGliRHBpTWFwLmNsZWFyKCk7Ci0gIG1fcEFwcC0+Q2xlYXJFdmVudFRhcmdldHMoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci12b2lkIENYRkFfRkZEb2M6OlNldERvY1R5cGUodWludDMyX3QgZHdUeXBlKSB7Ci0gIG1fZHdEb2NUeXBlID0gZHdUeXBlOwotfQotQ1BERl9Eb2N1bWVudCogQ1hGQV9GRkRvYzo6R2V0UERGRG9jKCkgewotICByZXR1cm4gbV9wUERGRG9jOwotfQotCi1DRlhfRElCaXRtYXAqIENYRkFfRkZEb2M6OkdldFBERk5hbWVkSW1hZ2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUltYWdlWERwaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSW1hZ2VZRHBpKSB7Ci0gIGlmICghbV9wUERGRG9jKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIHVpbnQzMl90IGR3SGFzaCA9IEZYX0hhc2hDb2RlX0dldFcod3NOYW1lLCBmYWxzZSk7Ci0gIGF1dG8gaXQgPSBtX0hhc2hUb0RpYkRwaU1hcC5maW5kKGR3SGFzaCk7Ci0gIGlmIChpdCAhPSBtX0hhc2hUb0RpYkRwaU1hcC5lbmQoKSkgewotICAgIGlJbWFnZVhEcGkgPSBpdC0+c2Vjb25kLmlJbWFnZVhEcGk7Ci0gICAgaUltYWdlWURwaSA9IGl0LT5zZWNvbmQuaUltYWdlWURwaTsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZYX0RJQml0bWFwKj4oaXQtPnNlY29uZC5wRGliU291cmNlKTsKLSAgfQotCi0gIENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BQREZEb2MtPkdldFJvb3QoKTsKLSAgaWYgKCFwUm9vdCkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBDUERGX0RpY3Rpb25hcnkqIHBOYW1lcyA9IHBSb290LT5HZXREaWN0Rm9yKCJOYW1lcyIpOwotICBpZiAoIXBOYW1lcykKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBDUERGX0RpY3Rpb25hcnkqIHBYRkFJbWFnZXMgPSBwTmFtZXMtPkdldERpY3RGb3IoIlhGQUltYWdlcyIpOwotICBpZiAoIXBYRkFJbWFnZXMpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgQ1BERl9OYW1lVHJlZSBuYW1ldHJlZShwWEZBSW1hZ2VzKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgYnNOYW1lID0gUERGX0VuY29kZVRleHQod3NOYW1lLmNfc3RyKCksIHdzTmFtZS5HZXRMZW5ndGgoKSk7Ci0gIENQREZfT2JqZWN0KiBwT2JqZWN0ID0gbmFtZXRyZWUuTG9va3VwVmFsdWUoYnNOYW1lKTsKLSAgaWYgKCFwT2JqZWN0KSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuYW1ldHJlZS5HZXRDb3VudCgpOyBpKyspIHsKLSAgICAgIENGWF9CeXRlU3RyaW5nIGJzVGVtcDsKLSAgICAgIENQREZfT2JqZWN0KiBwVGVtcE9iamVjdCA9IG5hbWV0cmVlLkxvb2t1cFZhbHVlKGksIGJzVGVtcCk7Ci0gICAgICBpZiAoYnNUZW1wID09IGJzTmFtZSkgewotICAgICAgICBwT2JqZWN0ID0gcFRlbXBPYmplY3Q7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIENQREZfU3RyZWFtKiBwU3RyZWFtID0gVG9TdHJlYW0ocE9iamVjdCk7Ci0gIGlmICghcFN0cmVhbSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBDUERGX1N0cmVhbUFjYyBzdHJlYW1BY2M7Ci0gIHN0cmVhbUFjYy5Mb2FkQWxsRGF0YShwU3RyZWFtKTsKLQotICBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IHBJbWFnZUZpbGVSZWFkID0KLSAgICAgIElGWF9NZW1vcnlTdHJlYW06OkNyZWF0ZSgodWludDhfdCopc3RyZWFtQWNjLkdldERhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1BY2MuR2V0U2l6ZSgpKTsKLQotICBDRlhfRElCaXRtYXAqIHBEaWJTb3VyY2UgPSBYRkFfTG9hZEltYWdlRnJvbUJ1ZmZlcigKLSAgICAgIHBJbWFnZUZpbGVSZWFkLCBGWENPREVDX0lNQUdFX1VOS05PV04sIGlJbWFnZVhEcGksIGlJbWFnZVlEcGkpOwotICBtX0hhc2hUb0RpYkRwaU1hcFtkd0hhc2hdID0ge3BEaWJTb3VyY2UsIGlJbWFnZVhEcGksIGlJbWFnZVlEcGl9OwotICByZXR1cm4gcERpYlNvdXJjZTsKLX0KLQotYm9vbCBDWEZBX0ZGRG9jOjpTYXZlUGFja2FnZSgKLSAgICBYRkFfSGFzaENvZGUgY29kZSwKLSAgICBjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVdyaXRlU3RyZWFtPiYgcEZpbGUsCi0gICAgQ1hGQV9DaGVja3N1bUNvbnRleHQqIHBDU0NvbnRleHQpIHsKLSAgQ1hGQV9Eb2N1bWVudCogZG9jID0gbV9wRG9jdW1lbnRQYXJzZXItPkdldERvY3VtZW50KCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0RhdGFFeHBvcnRlcj4gcEV4cG9ydChuZXcgQ1hGQV9EYXRhRXhwb3J0ZXIoZG9jKSk7Ci0gIENYRkFfTm9kZSogcE5vZGUgPSBjb2RlID09IFhGQV9IQVNIQ09ERV9YZmEgPyBkb2MtPkdldFJvb3QoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVG9Ob2RlKGRvYy0+R2V0WEZBT2JqZWN0KGNvZGUpKTsKLSAgaWYgKCFwTm9kZSkKLSAgICByZXR1cm4gISFwRXhwb3J0LT5FeHBvcnQocEZpbGUpOwotCi0gIENGWF9CeXRlU3RyaW5nIGJzQ2hlY2tzdW07Ci0gIGlmIChwQ1NDb250ZXh0KQotICAgIGJzQ2hlY2tzdW0gPSBwQ1NDb250ZXh0LT5HZXRDaGVja3N1bSgpOwotCi0gIHJldHVybiAhIXBFeHBvcnQtPkV4cG9ydCgKLSAgICAgIHBGaWxlLCBwTm9kZSwgMCwgYnNDaGVja3N1bS5HZXRMZW5ndGgoKSA/IGJzQ2hlY2tzdW0uY19zdHIoKSA6IG51bGxwdHIpOwotfQotCi1ib29sIENYRkFfRkZEb2M6OkltcG9ydERhdGEoCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcFN0cmVhbSwKLSAgICBib29sIGJYRFApIHsKLSAgYXV0byBpbXBvcnRlciA9Ci0gICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9EYXRhSW1wb3J0ZXI+KG1fcERvY3VtZW50UGFyc2VyLT5HZXREb2N1bWVudCgpKTsKLSAgcmV0dXJuIGltcG9ydGVyLT5JbXBvcnREYXRhKHBTdHJlYW0pOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL3hmYV9mZmRvY2hhbmRsZXIuY3BwIGIveGZhL2Z4ZmEvYXBwL3hmYV9mZmRvY2hhbmRsZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjczNTMxLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfZmZkb2NoYW5kbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmRvY2hhbmRsZXIuaCIKLQotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NjcmlwdGNvbnRleHQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX3Jlc29sdmVub2RlX3JzLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2NoZWNrc3VtLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jLmgiCi0KLUNYRkFfRkZEb2NIYW5kbGVyOjpDWEZBX0ZGRG9jSGFuZGxlcigpIHt9Ci0KLUNYRkFfRkZEb2NIYW5kbGVyOjp+Q1hGQV9GRkRvY0hhbmRsZXIoKSB7fQotCi1DRlhKU0VfVmFsdWUqIENYRkFfRkZEb2NIYW5kbGVyOjpHZXRYRkFTY3JpcHRPYmplY3QoQ1hGQV9GRkRvYyogaERvYykgewotICBDWEZBX0RvY3VtZW50KiBwWEZBRG9jID0gaERvYy0+R2V0WEZBRG9jKCk7Ci0gIGlmICghcFhGQURvYykKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBDWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gcFhGQURvYy0+R2V0U2NyaXB0Q29udGV4dCgpOwotICBpZiAoIXBTY3JpcHRDb250ZXh0KQotICAgIHJldHVybiBudWxscHRyOwotICByZXR1cm4gcFNjcmlwdENvbnRleHQtPkdldEpTVmFsdWVGcm9tTWFwKHBYRkFEb2MtPkdldFJvb3QoKSk7Ci19Ci0KLVhGQV9BVFRSSUJVVEVFTlVNIENYRkFfRkZEb2NIYW5kbGVyOjpHZXRSZXN0b3JlU3RhdGUoQ1hGQV9GRkRvYyogaERvYykgewotICBDWEZBX0RvY3VtZW50KiBwWEZBRG9jID0gaERvYy0+R2V0WEZBRG9jKCk7Ci0gIGlmICghcFhGQURvYykKLSAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93bjsKLQotICBDWEZBX05vZGUqIHBGb3JtID0gVG9Ob2RlKHBYRkFEb2MtPkdldFhGQU9iamVjdChYRkFfSEFTSENPREVfRm9ybSkpOwotICBpZiAoIXBGb3JtKQotICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duOwotCi0gIENYRkFfTm9kZSogcFN1YkZvcm0gPSBwRm9ybS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VsZW1lbnQ6OlN1YmZvcm0pOwotICBpZiAoIXBTdWJGb3JtKQotICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duOwotICByZXR1cm4gcFN1YkZvcm0tPkdldEVudW0oWEZBX0FUVFJJQlVURV9SZXN0b3JlU3RhdGUpOwotfQotCi1ib29sIENYRkFfRkZEb2NIYW5kbGVyOjpSdW5Eb2NTY3JpcHQoQ1hGQV9GRkRvYyogaERvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfU0NSSVBUVFlQRSBlU2NyaXB0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzU2NyaXB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFJldFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFRoaXNWYWx1ZSkgewotICBDWEZBX0RvY3VtZW50KiBwWEZBRG9jID0gaERvYy0+R2V0WEZBRG9jKCk7Ci0gIGlmICghcFhGQURvYykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1hGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IHBYRkFEb2MtPkdldFNjcmlwdENvbnRleHQoKTsKLSAgaWYgKCFwU2NyaXB0Q29udGV4dCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHBTY3JpcHRDb250ZXh0LT5SdW5TY3JpcHQoCi0gICAgICAoWEZBX1NDUklQVExBTkdUWVBFKWVTY3JpcHRUeXBlLCB3c1NjcmlwdCwgcFJldFZhbHVlLAotICAgICAgcFRoaXNWYWx1ZSA/IENYRkFfU2NyaXB0Q29udGV4dDo6VG9PYmplY3QocFRoaXNWYWx1ZSwgbnVsbHB0cikgOiBudWxscHRyKTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2FwcC94ZmFfZmZkb2N2aWV3LmNwcCBiL3hmYS9meGZhL2FwcC94ZmFfZmZkb2N2aWV3LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc0NDE4MS4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAveGZhX2ZmZG9jdmlldy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw4NTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jdmlldy5oIgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9leHQuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZiYXJjb2RlLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZmNoZWNrYnV0dG9uLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZmNob2ljZWxpc3QuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmZHJhdy5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZleGNsZ3JvdXAuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmZmllbGQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmaW1hZ2UuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmaW1hZ2VlZGl0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZnBhdGguaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmcHVzaGJ1dHRvbi5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZzaWduYXR1cmUuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2Zmc3ViZm9ybS5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZ0ZXh0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZnRleHRlZGl0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZndpZGdldGFjYy5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZndsYWRhcHRlci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2JpbmRpdGVtcy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dHByb2Nlc3Nvci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NjcmlwdGNvbnRleHQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX3Jlc29sdmVub2RlX3JzLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmYXBwLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmcGFnZXZpZXcuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZ3aWRnZXQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZ3aWRnZXRoYW5kbGVyLmgiCi0KLWNvbnN0IFhGQV9BVFRSSUJVVEVFTlVNIGdzX0V2ZW50QWN0aXZpdHlbXSA9IHsKLSAgICBYRkFfQVRUUklCVVRFRU5VTV9DbGljaywgICAgICBYRkFfQVRUUklCVVRFRU5VTV9DaGFuZ2UsCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fRG9jQ2xvc2UsICAgWEZBX0FUVFJJQlVURUVOVU1fRG9jUmVhZHksCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fRW50ZXIsICAgICAgWEZBX0FUVFJJQlVURUVOVU1fRXhpdCwKLSAgICBYRkFfQVRUUklCVVRFRU5VTV9GdWxsLCAgICAgICBYRkFfQVRUUklCVVRFRU5VTV9JbmRleENoYW5nZSwKLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Jbml0aWFsaXplLCBYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZURvd24sCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fTW91c2VFbnRlciwgWEZBX0FUVFJJQlVURUVOVU1fTW91c2VFeGl0LAotICAgIFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlVXAsICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RFeGVjdXRlLAotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RPcGVuLCAgIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RQcmludCwKLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0U2F2ZSwgICBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0U2lnbiwKLSAgICBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0U3VibWl0LCBYRkFfQVRUUklCVVRFRU5VTV9QcmVFeGVjdXRlLAotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZU9wZW4sICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVByaW50LAotICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVNhdmUsICAgIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVNpZ24sCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fUHJlU3VibWl0LCAgWEZBX0FUVFJJQlVURUVOVU1fUmVhZHksCi0gICAgWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93biwKLX07Ci0KLUNYRkFfRkZEb2NWaWV3OjpDWEZBX0ZGRG9jVmlldyhDWEZBX0ZGRG9jKiBwRG9jKQotICAgIDogbV9iTGF5b3V0RXZlbnQoZmFsc2UpLAotICAgICAgbV9wTGlzdEZvY3VzV2lkZ2V0KG51bGxwdHIpLAotICAgICAgbV9iSW5MYXlvdXRTdGF0dXMoZmFsc2UpLAotICAgICAgbV9wRG9jKHBEb2MpLAotICAgICAgbV9wWEZBRG9jTGF5b3V0KG51bGxwdHIpLAotICAgICAgbV9wRm9jdXNBY2MobnVsbHB0ciksCi0gICAgICBtX3BGb2N1c1dpZGdldChudWxscHRyKSwKLSAgICAgIG1fcE9sZEZvY3VzV2lkZ2V0KG51bGxwdHIpLAotICAgICAgbV9pU3RhdHVzKFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19Ob25lKSwKLSAgICAgIG1faUxvY2soMCkge30KLQotQ1hGQV9GRkRvY1ZpZXc6On5DWEZBX0ZGRG9jVmlldygpIHsKLSAgRGVzdHJveURvY1ZpZXcoKTsKLX0KLQotdm9pZCBDWEZBX0ZGRG9jVmlldzo6SW5pdExheW91dChDWEZBX05vZGUqIHBOb2RlKSB7Ci0gIFJ1bkJpbmRJdGVtcygpOwotICBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBOb2RlLCBYRkFfRVZFTlRfSW5pdGlhbGl6ZSwgZmFsc2UsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7Ci0gIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocE5vZGUsIFhGQV9FVkVOVF9JbmRleENoYW5nZSwgZmFsc2UsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7Ci19Ci1pbnQzMl90IENYRkFfRkZEb2NWaWV3OjpTdGFydExheW91dChpbnQzMl90IGlTdGFydFBhZ2UpIHsKLSAgbV9pU3RhdHVzID0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX1N0YXJ0OwotICBtX3BEb2MtPkdldFhGQURvYygpLT5Eb1Byb3RvTWVyZ2UoKTsKLSAgbV9wRG9jLT5HZXRYRkFEb2MoKS0+RG9EYXRhTWVyZ2UoKTsKLSAgbV9wWEZBRG9jTGF5b3V0ID0gR2V0WEZBTGF5b3V0KCk7Ci0gIGludDMyX3QgaVN0YXR1cyA9IG1fcFhGQURvY0xheW91dC0+U3RhcnRMYXlvdXQoKTsKLSAgaWYgKGlTdGF0dXMgPCAwKSB7Ci0gICAgcmV0dXJuIGlTdGF0dXM7Ci0gIH0KLSAgQ1hGQV9Ob2RlKiBwUm9vdEl0ZW0gPQotICAgICAgVG9Ob2RlKG1fcERvYy0+R2V0WEZBRG9jKCktPkdldFhGQU9iamVjdChYRkFfSEFTSENPREVfRm9ybSkpOwotICBpZiAoIXBSb290SXRlbSkgewotICAgIHJldHVybiBpU3RhdHVzOwotICB9Ci0gIEluaXRMYXlvdXQocFJvb3RJdGVtKTsKLSAgSW5pdENhbGN1bGF0ZShwUm9vdEl0ZW0pOwotICBJbml0VmFsaWRhdGUocFJvb3RJdGVtKTsKLSAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwUm9vdEl0ZW0sIFhGQV9FVkVOVF9SZWFkeSwgdHJ1ZSwgdHJ1ZSwgbnVsbHB0cik7Ci0gIG1faVN0YXR1cyA9IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19TdGFydDsKLSAgcmV0dXJuIGlTdGF0dXM7Ci19Ci1pbnQzMl90IENYRkFfRkZEb2NWaWV3OjpEb0xheW91dChJRlhfUGF1c2UqIHBQYXVzZSkgewotICBpbnQzMl90IGlTdGF0dXMgPSAxMDA7Ci0gIGlTdGF0dXMgPSBtX3BYRkFEb2NMYXlvdXQtPkRvTGF5b3V0KHBQYXVzZSk7Ci0gIGlmIChpU3RhdHVzICE9IDEwMCkgewotICAgIHJldHVybiBpU3RhdHVzOwotICB9Ci0gIG1faVN0YXR1cyA9IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19Eb2luZzsKLSAgcmV0dXJuIGlTdGF0dXM7Ci19Ci12b2lkIENYRkFfRkZEb2NWaWV3OjpTdG9wTGF5b3V0KCkgewotICBDWEZBX05vZGUqIHBSb290SXRlbSA9Ci0gICAgICBUb05vZGUobV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0WEZBT2JqZWN0KFhGQV9IQVNIQ09ERV9Gb3JtKSk7Ci0gIGlmICghcFJvb3RJdGVtKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfTm9kZSogcFN1YmZvcm1Ob2RlID0gcFJvb3RJdGVtLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6U3ViZm9ybSk7Ci0gIGlmICghcFN1YmZvcm1Ob2RlKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfTm9kZSogcFBhZ2VTZXROb2RlID0KLSAgICAgIHBTdWJmb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VsZW1lbnQ6OlBhZ2VTZXQpOwotICBpZiAoIXBQYWdlU2V0Tm9kZSkgewotICAgIHJldHVybjsKLSAgfQotICBSdW5DYWxjdWxhdGVXaWRnZXRzKCk7Ci0gIFJ1blZhbGlkYXRlKCk7Ci0gIEluaXRMYXlvdXQocFBhZ2VTZXROb2RlKTsKLSAgSW5pdENhbGN1bGF0ZShwUGFnZVNldE5vZGUpOwotICBJbml0VmFsaWRhdGUocFBhZ2VTZXROb2RlKTsKLSAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwUGFnZVNldE5vZGUsIFhGQV9FVkVOVF9SZWFkeSwgdHJ1ZSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKLSAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwUm9vdEl0ZW0sIFhGQV9FVkVOVF9SZWFkeSwgZmFsc2UsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7Ci0gIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocFJvb3RJdGVtLCBYRkFfRVZFTlRfRG9jUmVhZHksIGZhbHNlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOwotICBSdW5DYWxjdWxhdGVXaWRnZXRzKCk7Ci0gIFJ1blZhbGlkYXRlKCk7Ci0gIGlmIChSdW5MYXlvdXQoKSkgewotICAgIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocFJvb3RJdGVtLCBYRkFfRVZFTlRfUmVhZHksIGZhbHNlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7Ci0gIH0KLSAgbV9DYWxjdWxhdGVBY2NzLmNsZWFyKCk7Ci0gIGlmIChtX3BGb2N1c0FjYyAmJiAhbV9wRm9jdXNXaWRnZXQpIHsKLSAgICBTZXRGb2N1c1dpZGdldEFjYyhtX3BGb2N1c0FjYyk7Ci0gIH0KLSAgbV9pU3RhdHVzID0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZDsKLX0KLWludDMyX3QgQ1hGQV9GRkRvY1ZpZXc6OkdldExheW91dFN0YXR1cygpIHsKLSAgcmV0dXJuIG1faVN0YXR1czsKLX0KLXZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlNob3dOdWxsVGVzdE1zZygpIHsKLSAgaW50MzJfdCBpQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fYXJyTnVsbFRlc3RNc2cpOwotICBDWEZBX0ZGQXBwKiBwQXBwID0gbV9wRG9jLT5HZXRBcHAoKTsKLSAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0gcEFwcC0+R2V0QXBwUHJvdmlkZXIoKTsKLSAgaWYgKHBBcHBQcm92aWRlciAmJiBpQ291bnQpIHsKLSAgICBpbnQzMl90IGlSZW1haW4gPSBpQ291bnQgPiA3ID8gaUNvdW50IC0gNyA6IDA7Ci0gICAgaUNvdW50IC09IGlSZW1haW47Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NNc2c7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKLSAgICAgIHdzTXNnICs9IG1fYXJyTnVsbFRlc3RNc2dbaV0gKyBMIlxuIjsKLSAgICB9Ci0gICAgaWYgKGlSZW1haW4gPiAwKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c1RlbXA7Ci0gICAgICB3c1RlbXAuRm9ybWF0KAotICAgICAgICAgIEwiTWVzc2FnZSBsaW1pdCBleGNlZWRlZC4gUmVtYWluaW5nICVkICIKLSAgICAgICAgICBMInZhbGlkYXRpb24gZXJyb3JzIG5vdCByZXBvcnRlZC4iLAotICAgICAgICAgIGlSZW1haW4pOwotICAgICAgd3NNc2cgKz0gTCJcbiIgKyB3c1RlbXA7Ci0gICAgfQotICAgIHBBcHBQcm92aWRlci0+TXNnQm94KHdzTXNnLCBwQXBwUHJvdmlkZXItPkdldEFwcFRpdGxlKCksIFhGQV9NQklDT05fU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9NQl9PSyk7Ci0gIH0KLSAgbV9hcnJOdWxsVGVzdE1zZy5jbGVhcigpOwotfQotCi12b2lkIENYRkFfRkZEb2NWaWV3OjpVcGRhdGVEb2NWaWV3KCkgewotICBpZiAoSXNVcGRhdGVMb2NrZWQoKSkKLSAgICByZXR1cm47Ci0KLSAgTG9ja1VwZGF0ZSgpOwotICBmb3IgKENYRkFfTm9kZSogcE5vZGUgOiBtX05ld0FkZGVkTm9kZXMpIHsKLSAgICBJbml0Q2FsY3VsYXRlKHBOb2RlKTsKLSAgICBJbml0VmFsaWRhdGUocE5vZGUpOwotICAgIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocE5vZGUsIFhGQV9FVkVOVF9SZWFkeSwgdHJ1ZSwgdHJ1ZSwgbnVsbHB0cik7Ci0gIH0KLSAgbV9OZXdBZGRlZE5vZGVzLmNsZWFyKCk7Ci0gIFJ1blN1YmZvcm1JbmRleENoYW5nZSgpOwotICBSdW5DYWxjdWxhdGVXaWRnZXRzKCk7Ci0gIFJ1blZhbGlkYXRlKCk7Ci0gIFNob3dOdWxsVGVzdE1zZygpOwotICBpZiAoUnVuTGF5b3V0KCkgJiYgbV9iTGF5b3V0RXZlbnQpCi0gICAgUnVuRXZlbnRMYXlvdXRSZWFkeSgpOwotCi0gIG1fYkxheW91dEV2ZW50ID0gZmFsc2U7Ci0gIG1fQ2FsY3VsYXRlQWNjcy5jbGVhcigpOwotICBSdW5JbnZhbGlkYXRlKCk7Ci0gIFVubG9ja1VwZGF0ZSgpOwotfQotCi1pbnQzMl90IENYRkFfRkZEb2NWaWV3OjpDb3VudFBhZ2VWaWV3cygpIHsKLSAgaWYgKCFtX3BYRkFEb2NMYXlvdXQpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gbV9wWEZBRG9jTGF5b3V0LT5Db3VudFBhZ2VzKCk7Ci19Ci1DWEZBX0ZGUGFnZVZpZXcqIENYRkFfRkZEb2NWaWV3OjpHZXRQYWdlVmlldyhpbnQzMl90IG5JbmRleCkgewotICBpZiAoIW1fcFhGQURvY0xheW91dCkgewotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGUGFnZVZpZXcqPihtX3BYRkFEb2NMYXlvdXQtPkdldFBhZ2UobkluZGV4KSk7Ci19Ci0KLUNYRkFfTGF5b3V0UHJvY2Vzc29yKiBDWEZBX0ZGRG9jVmlldzo6R2V0WEZBTGF5b3V0KCkgY29uc3QgewotICByZXR1cm4gbV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0RG9jTGF5b3V0KCk7Ci19Ci1ib29sIENYRkFfRkZEb2NWaWV3OjpSZXNldFNpbmdsZVdpZGdldEFjY0RhdGEoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpIHsKLSAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBXaWRnZXRBY2MtPkdldE5vZGUoKTsKLSAgWEZBX0VsZW1lbnQgZVR5cGUgPSBwTm9kZS0+R2V0RWxlbWVudFR5cGUoKTsKLSAgaWYgKGVUeXBlICE9IFhGQV9FbGVtZW50OjpGaWVsZCAmJiBlVHlwZSAhPSBYRkFfRWxlbWVudDo6RXhjbEdyb3VwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHBXaWRnZXRBY2MtPlJlc2V0RGF0YSgpOwotICBwV2lkZ2V0QWNjLT5VcGRhdGVVSURpc3BsYXkoKTsKLSAgaWYgKENYRkFfVmFsaWRhdGUgdmFsaWRhdGUgPSBwV2lkZ2V0QWNjLT5HZXRWYWxpZGF0ZSgpKSB7Ci0gICAgQWRkVmFsaWRhdGVXaWRnZXQocFdpZGdldEFjYyk7Ci0gICAgdmFsaWRhdGUuR2V0Tm9kZSgpLT5TZXRGbGFnKFhGQV9Ob2RlRmxhZ19OZWVkc0luaXRBcHAsIGZhbHNlKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLXZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlJlc2V0V2lkZ2V0RGF0YShDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYykgewotICBtX2JMYXlvdXRFdmVudCA9IHRydWU7Ci0gIGJvb2wgYkNoYW5nZWQgPSBmYWxzZTsKLSAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUgPSBudWxscHRyOwotICBpZiAocFdpZGdldEFjYykgewotICAgIGJDaGFuZ2VkID0gUmVzZXRTaW5nbGVXaWRnZXRBY2NEYXRhKHBXaWRnZXRBY2MpOwotICAgIHBGb3JtTm9kZSA9IHBXaWRnZXRBY2MtPkdldE5vZGUoKTsKLSAgfSBlbHNlIHsKLSAgICBwRm9ybU5vZGUgPSBHZXRSb290U3ViZm9ybSgpOwotICB9Ci0gIGlmICghcEZvcm1Ob2RlKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChwRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OkZpZWxkICYmCi0gICAgICBwRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OkV4Y2xHcm91cCkgewotICAgIENYRkFfV2lkZ2V0QWNjSXRlcmF0b3IgSXRlcmF0b3IodGhpcywgcEZvcm1Ob2RlKTsKLSAgICB3aGlsZSAoQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsKLSAgICAgIGJDaGFuZ2VkIHw9IFJlc2V0U2luZ2xlV2lkZ2V0QWNjRGF0YShwQWNjKTsKLSAgICAgIGlmIChwQWNjLT5HZXROb2RlKCktPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkV4Y2xHcm91cCkgewotICAgICAgICBJdGVyYXRvci5Ta2lwVHJlZSgpOwotICAgICAgfQotICAgIH0KLSAgfQotICBpZiAoYkNoYW5nZWQpIHsKLSAgICBtX3BEb2MtPkdldERvY0Vudmlyb25tZW50KCktPlNldENoYW5nZU1hcmsobV9wRG9jKTsKLSAgfQotfQotaW50MzJfdCBDWEZBX0ZGRG9jVmlldzo6UHJvY2Vzc1dpZGdldEV2ZW50KENYRkFfRXZlbnRQYXJhbSogcFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjKSB7Ci0gIGlmICghcFBhcmFtKQotICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9FcnJvcjsKLQotICBpZiAocFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9WYWxpZGF0ZSkgewotICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsaWRhdGVTdHIoTCJwcmVTdWJtaXQiKTsKLSAgICBDWEZBX05vZGUqIHBDb25maWdJdGVtID0KLSAgICAgICAgVG9Ob2RlKG1fcERvYy0+R2V0WEZBRG9jKCktPkdldFhGQU9iamVjdChYRkFfSEFTSENPREVfQ29uZmlnKSk7Ci0gICAgaWYgKHBDb25maWdJdGVtKSB7Ci0gICAgICBDWEZBX05vZGUqIHBWYWxpZGF0ZU5vZGUgPSBudWxscHRyOwotICAgICAgQ1hGQV9Ob2RlKiBwQWNyb2JhdE5vZGUgPSBwQ29uZmlnSXRlbS0+R2V0Q2hpbGQoMCwgWEZBX0VsZW1lbnQ6OkFjcm9iYXQpOwotICAgICAgcFZhbGlkYXRlTm9kZSA9IHBBY3JvYmF0Tm9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBBY3JvYmF0Tm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VsZW1lbnQ6OlZhbGlkYXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHI7Ci0gICAgICBpZiAoIXBWYWxpZGF0ZU5vZGUpIHsKLSAgICAgICAgQ1hGQV9Ob2RlKiBwUHJlc2VudE5vZGUgPQotICAgICAgICAgICAgcENvbmZpZ0l0ZW0tPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpQcmVzZW50KTsKLSAgICAgICAgcFZhbGlkYXRlTm9kZSA9IHBQcmVzZW50Tm9kZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcFByZXNlbnROb2RlLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6VmFsaWRhdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyOwotICAgICAgfQotICAgICAgaWYgKHBWYWxpZGF0ZU5vZGUpIHsKLSAgICAgICAgd3NWYWxpZGF0ZVN0ciA9IHBWYWxpZGF0ZU5vZGUtPkdldENvbnRlbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgYm9vbCBiVmFsaWRhdGUgPSBmYWxzZTsKLSAgICBzd2l0Y2ggKHBQYXJhbS0+bV9pVmFsaWRhdGVBY3Rpdml0aWVzKSB7Ci0gICAgICBjYXNlIFhGQV9WQUxJREFURV9wcmVTdWJtaXQ6Ci0gICAgICAgIGJWYWxpZGF0ZSA9IHdzVmFsaWRhdGVTdHIuRmluZChMInByZVN1Ym1pdCIpICE9IC0xOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWEZBX1ZBTElEQVRFX3ByZVByaW50OgotICAgICAgICBiVmFsaWRhdGUgPSB3c1ZhbGlkYXRlU3RyLkZpbmQoTCJwcmVQcmludCIpICE9IC0xOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWEZBX1ZBTElEQVRFX3ByZUV4ZWN1dGU6Ci0gICAgICAgIGJWYWxpZGF0ZSA9IHdzVmFsaWRhdGVTdHIuRmluZChMInByZUV4ZWN1dGUiKSAhPSAtMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9WQUxJREFURV9wcmVTYXZlOgotICAgICAgICBiVmFsaWRhdGUgPSB3c1ZhbGlkYXRlU3RyLkZpbmQoTCJwcmVTYXZlIikgIT0gLTE7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAoIWJWYWxpZGF0ZSkgewotICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2Nlc3M7Ci0gICAgfQotICB9Ci0gIENYRkFfTm9kZSogcE5vZGUgPSBwV2lkZ2V0QWNjID8gcFdpZGdldEFjYy0+R2V0Tm9kZSgpIDogbnVsbHB0cjsKLSAgaWYgKCFwTm9kZSkgewotICAgIENYRkFfTm9kZSogcFJvb3RJdGVtID0KLSAgICAgICAgVG9Ob2RlKG1fcERvYy0+R2V0WEZBRG9jKCktPkdldFhGQU9iamVjdChYRkFfSEFTSENPREVfRm9ybSkpOwotICAgIGlmICghcFJvb3RJdGVtKSB7Ci0gICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRXJyb3I7Ci0gICAgfQotICAgIHBOb2RlID0gcFJvb3RJdGVtLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6U3ViZm9ybSk7Ci0gIH0KLSAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwTm9kZSwgcFBhcmFtLT5tX2VUeXBlLCBwUGFyYW0tPm1fYklzRm9ybVJlYWR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIG51bGxwdHIpOwotICByZXR1cm4gWEZBX0VWRU5URVJST1JfU3VjY2VzczsKLX0KLUNYRkFfRkZXaWRnZXRIYW5kbGVyKiBDWEZBX0ZGRG9jVmlldzo6R2V0V2lkZ2V0SGFuZGxlcigpIHsKLSAgaWYgKCFtX3BXaWRnZXRIYW5kbGVyKQotICAgIG1fcFdpZGdldEhhbmRsZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GRldpZGdldEhhbmRsZXI+KHRoaXMpOwotCi0gIHJldHVybiBtX3BXaWRnZXRIYW5kbGVyLmdldCgpOwotfQotCi1DWEZBX1dpZGdldEFjY0l0ZXJhdG9yKiBDWEZBX0ZGRG9jVmlldzo6Q3JlYXRlV2lkZ2V0QWNjSXRlcmF0b3IoCi0gICAgWEZBX1dJREdFVE9SREVSIGVPcmRlcikgewotICBDWEZBX05vZGUqIHBGb3JtUm9vdCA9IEdldFJvb3RTdWJmb3JtKCk7Ci0gIHJldHVybiBwRm9ybVJvb3QgPyBuZXcgQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcih0aGlzLCBwRm9ybVJvb3QpIDogbnVsbHB0cjsKLX0KLUNYRkFfRkZXaWRnZXQqIENYRkFfRkZEb2NWaWV3OjpHZXRGb2N1c1dpZGdldCgpIHsKLSAgcmV0dXJuIG1fcEZvY3VzV2lkZ2V0OwotfQotdm9pZCBDWEZBX0ZGRG9jVmlldzo6S2lsbEZvY3VzKCkgewotICBpZiAobV9wRm9jdXNXaWRnZXQgJiYKLSAgICAgIChtX3BGb2N1c1dpZGdldC0+R2V0U3RhdHVzKCkgJiBYRkFfV2lkZ2V0U3RhdHVzX0ZvY3VzZWQpKSB7Ci0gICAgKG1fcEZvY3VzV2lkZ2V0KS0+T25LaWxsRm9jdXMobnVsbHB0cik7Ci0gIH0KLSAgbV9wRm9jdXNBY2MgPSBudWxscHRyOwotICBtX3BGb2N1c1dpZGdldCA9IG51bGxwdHI7Ci0gIG1fcE9sZEZvY3VzV2lkZ2V0ID0gbnVsbHB0cjsKLX0KLWJvb2wgQ1hGQV9GRkRvY1ZpZXc6OlNldEZvY3VzKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQpIHsKLSAgQ1hGQV9GRldpZGdldCogcE5ld0ZvY3VzID0gaFdpZGdldDsKLSAgaWYgKG1fcE9sZEZvY3VzV2lkZ2V0ID09IHBOZXdGb2N1cykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBDWEZBX0ZGV2lkZ2V0KiBwT2xkRm9jdXMgPSBtX3BPbGRGb2N1c1dpZGdldDsKLSAgbV9wT2xkRm9jdXNXaWRnZXQgPSBwTmV3Rm9jdXM7Ci0gIGlmIChwT2xkRm9jdXMpIHsKLSAgICBpZiAobV9wRm9jdXNXaWRnZXQgIT0gbV9wT2xkRm9jdXNXaWRnZXQgJiYKLSAgICAgICAgKHBPbGRGb2N1cy0+R2V0U3RhdHVzKCkgJiBYRkFfV2lkZ2V0U3RhdHVzX0ZvY3VzZWQpKSB7Ci0gICAgICBtX3BGb2N1c1dpZGdldCA9IHBPbGRGb2N1czsKLSAgICAgIHBPbGRGb2N1cy0+T25LaWxsRm9jdXMocE5ld0ZvY3VzKTsKLSAgICB9IGVsc2UgaWYgKChwT2xkRm9jdXMtPkdldFN0YXR1cygpICYgWEZBX1dpZGdldFN0YXR1c19WaXNpYmxlKSkgewotICAgICAgaWYgKCFwT2xkRm9jdXMtPklzTG9hZGVkKCkpIHsKLSAgICAgICAgcE9sZEZvY3VzLT5Mb2FkV2lkZ2V0KCk7Ci0gICAgICB9Ci0gICAgICBwT2xkRm9jdXMtPk9uU2V0Rm9jdXMobV9wRm9jdXNXaWRnZXQpOwotICAgICAgbV9wRm9jdXNXaWRnZXQgPSBwT2xkRm9jdXM7Ci0gICAgICBwT2xkRm9jdXMtPk9uS2lsbEZvY3VzKHBOZXdGb2N1cyk7Ci0gICAgfQotICB9Ci0gIGlmIChtX3BGb2N1c1dpZGdldCA9PSBtX3BPbGRGb2N1c1dpZGdldCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBwTmV3Rm9jdXMgPSBtX3BPbGRGb2N1c1dpZGdldDsKLSAgaWYgKG1fcExpc3RGb2N1c1dpZGdldCAmJiBwTmV3Rm9jdXMgPT0gbV9wTGlzdEZvY3VzV2lkZ2V0KSB7Ci0gICAgbV9wRm9jdXNBY2MgPSBudWxscHRyOwotICAgIG1fcEZvY3VzV2lkZ2V0ID0gbnVsbHB0cjsKLSAgICBtX3BMaXN0Rm9jdXNXaWRnZXQgPSBudWxscHRyOwotICAgIG1fcE9sZEZvY3VzV2lkZ2V0ID0gbnVsbHB0cjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKHBOZXdGb2N1cyAmJiAocE5ld0ZvY3VzLT5HZXRTdGF0dXMoKSAmIFhGQV9XaWRnZXRTdGF0dXNfVmlzaWJsZSkpIHsKLSAgICBpZiAoIXBOZXdGb2N1cy0+SXNMb2FkZWQoKSkgewotICAgICAgcE5ld0ZvY3VzLT5Mb2FkV2lkZ2V0KCk7Ci0gICAgfQotICAgIHBOZXdGb2N1cy0+T25TZXRGb2N1cyhtX3BGb2N1c1dpZGdldCk7Ci0gIH0KLSAgbV9wRm9jdXNBY2MgPSBwTmV3Rm9jdXMgPyBwTmV3Rm9jdXMtPkdldERhdGFBY2MoKSA6IG51bGxwdHI7Ci0gIG1fcEZvY3VzV2lkZ2V0ID0gcE5ld0ZvY3VzOwotICBtX3BPbGRGb2N1c1dpZGdldCA9IG1fcEZvY3VzV2lkZ2V0OwotICByZXR1cm4gdHJ1ZTsKLX0KLUNYRkFfV2lkZ2V0QWNjKiBDWEZBX0ZGRG9jVmlldzo6R2V0Rm9jdXNXaWRnZXRBY2MoKSB7Ci0gIHJldHVybiBtX3BGb2N1c0FjYzsKLX0KLXZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlNldEZvY3VzV2lkZ2V0QWNjKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjKSB7Ci0gIENYRkFfRkZXaWRnZXQqIHBOZXdGb2N1cyA9Ci0gICAgICBwV2lkZ2V0QWNjID8gcFdpZGdldEFjYy0+R2V0TmV4dFdpZGdldChudWxscHRyKSA6IG51bGxwdHI7Ci0gIGlmIChTZXRGb2N1cyhwTmV3Rm9jdXMpKSB7Ci0gICAgbV9wRm9jdXNBY2MgPSBwV2lkZ2V0QWNjOwotICAgIGlmIChtX2lTdGF0dXMgPT0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZCkgewotICAgICAgbV9wRG9jLT5HZXREb2NFbnZpcm9ubWVudCgpLT5TZXRGb2N1c1dpZGdldChtX3BEb2MsIG1fcEZvY3VzV2lkZ2V0KTsKLSAgICB9Ci0gIH0KLX0KLXZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkRlbGV0ZUxheW91dEl0ZW0oQ1hGQV9GRldpZGdldCogcFdpZGdldCkgewotICBpZiAobV9wRm9jdXNBY2MgPT0gcFdpZGdldC0+R2V0RGF0YUFjYygpKSB7Ci0gICAgbV9wRm9jdXNBY2MgPSBudWxscHRyOwotICAgIG1fcEZvY3VzV2lkZ2V0ID0gbnVsbHB0cjsKLSAgICBtX3BPbGRGb2N1c1dpZGdldCA9IG51bGxwdHI7Ci0gIH0KLX0KLXN0YXRpYyBpbnQzMl90IFhGQV9Qcm9jZXNzRXZlbnQoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9FdmVudFBhcmFtKiBwUGFyYW0pIHsKLSAgaWYgKCFwUGFyYW0gfHwgcFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9Vbmtub3duKSB7Ci0gICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0OwotICB9Ci0gIGlmICghcFdpZGdldEFjYyB8fCBwV2lkZ2V0QWNjLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpEcmF3KSB7Ci0gICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0OwotICB9Ci0gIHN3aXRjaCAocFBhcmFtLT5tX2VUeXBlKSB7Ci0gICAgY2FzZSBYRkFfRVZFTlRfQ2FsY3VsYXRlOgotICAgICAgcmV0dXJuIHBXaWRnZXRBY2MtPlByb2Nlc3NDYWxjdWxhdGUoKTsKLSAgICBjYXNlIFhGQV9FVkVOVF9WYWxpZGF0ZToKLSAgICAgIGlmICgoKENYRkFfRkZEb2MqKXBEb2NWaWV3LT5HZXREb2MoKSkKLSAgICAgICAgICAgICAgLT5HZXREb2NFbnZpcm9ubWVudCgpCi0gICAgICAgICAgICAgIC0+SXNWYWxpZGF0aW9uc0VuYWJsZWQocERvY1ZpZXctPkdldERvYygpKSkgewotICAgICAgICByZXR1cm4gcFdpZGdldEFjYy0+UHJvY2Vzc1ZhbGlkYXRlKDB4MDEpOwotICAgICAgfQotICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Rpc2FibGVkOwotICAgIGNhc2UgWEZBX0VWRU5UX0luaXRDYWxjdWxhdGU6IHsKLSAgICAgIENYRkFfQ2FsY3VsYXRlIGNhbGMgPSBwV2lkZ2V0QWNjLT5HZXRDYWxjdWxhdGUoKTsKLSAgICAgIGlmICghY2FsYykgewotICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7Ci0gICAgICB9Ci0gICAgICBpZiAocFdpZGdldEFjYy0+R2V0Tm9kZSgpLT5Jc1VzZXJJbnRlcmFjdGl2ZSgpKQotICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRGlzYWJsZWQ7Ci0KLSAgICAgIENYRkFfU2NyaXB0IHNjcmlwdCA9IGNhbGMuR2V0U2NyaXB0KCk7Ci0gICAgICByZXR1cm4gcFdpZGdldEFjYy0+RXhlY3V0ZVNjcmlwdChzY3JpcHQsIHBQYXJhbSk7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICBpbnQzMl90IGlSZXQgPQotICAgICAgcFdpZGdldEFjYy0+UHJvY2Vzc0V2ZW50KGdzX0V2ZW50QWN0aXZpdHlbcFBhcmFtLT5tX2VUeXBlXSwgcFBhcmFtKTsKLSAgcmV0dXJuIGlSZXQ7Ci19Ci1pbnQzMl90IENYRkFfRkZEb2NWaWV3OjpFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KENYRkFfTm9kZSogcEZvcm1Ob2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYklzRm9ybVJlYWR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZWN1cnNpdmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEV4Y2x1ZGUpIHsKLSAgaW50MzJfdCBpUmV0ID0gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7Ci0gIGlmIChwRm9ybU5vZGUgPT0gcEV4Y2x1ZGUpIHsKLSAgICByZXR1cm4gaVJldDsKLSAgfQotICBYRkFfRWxlbWVudCBlbGVtZW50VHlwZSA9IHBGb3JtTm9kZS0+R2V0RWxlbWVudFR5cGUoKTsKLSAgaWYgKGVsZW1lbnRUeXBlID09IFhGQV9FbGVtZW50OjpGaWVsZCkgewotICAgIGlmIChlRXZlbnRUeXBlID09IFhGQV9FVkVOVF9JbmRleENoYW5nZSkgewotICAgICAgcmV0dXJuIGlSZXQ7Ci0gICAgfQotICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gKENYRkFfV2lkZ2V0QWNjKilwRm9ybU5vZGUtPkdldFdpZGdldERhdGEoKTsKLSAgICBpZiAoIXBXaWRnZXRBY2MpIHsKLSAgICAgIHJldHVybiBpUmV0OwotICAgIH0KLSAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOwotICAgIGVQYXJhbS5tX2VUeXBlID0gZUV2ZW50VHlwZTsKLSAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gcFdpZGdldEFjYzsKLSAgICBlUGFyYW0ubV9iSXNGb3JtUmVhZHkgPSBiSXNGb3JtUmVhZHk7Ci0gICAgcmV0dXJuIFhGQV9Qcm9jZXNzRXZlbnQodGhpcywgcFdpZGdldEFjYywgJmVQYXJhbSk7Ci0gIH0KLSAgaWYgKGJSZWN1cnNpdmUpIHsKLSAgICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBwRm9ybU5vZGUtPkdldE5vZGVJdGVtKAotICAgICAgICAgICAgIFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkLCBYRkFfT2JqZWN0VHlwZTo6Q29udGFpbmVyTm9kZSk7Ci0gICAgICAgICBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250YWluZXJOb2RlKSkgewotICAgICAgZWxlbWVudFR5cGUgPSBwTm9kZS0+R2V0RWxlbWVudFR5cGUoKTsKLSAgICAgIGlmIChlbGVtZW50VHlwZSAhPSBYRkFfRWxlbWVudDo6VmFyaWFibGVzICYmCi0gICAgICAgICAgZWxlbWVudFR5cGUgIT0gWEZBX0VsZW1lbnQ6OkRyYXcpIHsKLSAgICAgICAgaVJldCB8PSBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBOb2RlLCBlRXZlbnRUeXBlLCBiSXNGb3JtUmVhZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiUmVjdXJzaXZlLCBwRXhjbHVkZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gKENYRkFfV2lkZ2V0QWNjKilwRm9ybU5vZGUtPkdldFdpZGdldERhdGEoKTsKLSAgaWYgKCFwV2lkZ2V0QWNjKSB7Ci0gICAgcmV0dXJuIGlSZXQ7Ci0gIH0KLSAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsKLSAgZVBhcmFtLm1fZVR5cGUgPSBlRXZlbnRUeXBlOwotICBlUGFyYW0ubV9wVGFyZ2V0ID0gcFdpZGdldEFjYzsKLSAgZVBhcmFtLm1fYklzRm9ybVJlYWR5ID0gYklzRm9ybVJlYWR5OwotICBpUmV0IHw9IFhGQV9Qcm9jZXNzRXZlbnQodGhpcywgcFdpZGdldEFjYywgJmVQYXJhbSk7Ci0gIHJldHVybiBpUmV0OwotfQotCi1DWEZBX0ZGV2lkZ2V0KiBDWEZBX0ZGRG9jVmlldzo6R2V0V2lkZ2V0QnlOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRkZXaWRnZXQqIHBSZWZXaWRnZXQpIHsKLSAgQ1hGQV9XaWRnZXRBY2MqIHBSZWZBY2MgPSBwUmVmV2lkZ2V0ID8gcFJlZldpZGdldC0+R2V0RGF0YUFjYygpIDogbnVsbHB0cjsKLSAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBHZXRXaWRnZXRBY2NCeU5hbWUod3NOYW1lLCBwUmVmQWNjKTsKLSAgcmV0dXJuIHBBY2MgPyBwQWNjLT5HZXROZXh0V2lkZ2V0KG51bGxwdHIpIDogbnVsbHB0cjsKLX0KLQotQ1hGQV9XaWRnZXRBY2MqIENYRkFfRkZEb2NWaWV3OjpHZXRXaWRnZXRBY2NCeU5hbWUoCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSwKLSAgICBDWEZBX1dpZGdldEFjYyogcFJlZldpZGdldEFjYykgewotICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247Ci0gIHVpbnQzMl90IGR3U3R5bGUgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyB8Ci0gICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MgfCBYRkFfUkVTT0xWRU5PREVfUGFyZW50OwotICBDWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0U2NyaXB0Q29udGV4dCgpOwotICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgQ1hGQV9Ob2RlKiByZWZOb2RlID0gbnVsbHB0cjsKLSAgaWYgKHBSZWZXaWRnZXRBY2MpIHsKLSAgICByZWZOb2RlID0gcFJlZldpZGdldEFjYy0+R2V0Tm9kZSgpOwotICAgIHdzRXhwcmVzc2lvbiA9IHdzTmFtZTsKLSAgfSBlbHNlIHsKLSAgICB3c0V4cHJlc3Npb24gPSBMIiRmb3JtLiIgKyB3c05hbWU7Ci0gIH0KLSAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc292ZU5vZGVSUzsKLSAgaW50MzJfdCBpUmV0ID0gcFNjcmlwdENvbnRleHQtPlJlc29sdmVPYmplY3RzKAotICAgICAgcmVmTm9kZSwgd3NFeHByZXNzaW9uLkFzU3RyaW5nQygpLCByZXNvdmVOb2RlUlMsIGR3U3R5bGUpOwotICBpZiAoaVJldCA8IDEpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBpZiAocmVzb3ZlTm9kZVJTLmR3RmxhZ3MgPT0gWEZBX1JFU09WRU5PREVfUlNUWVBFX05vZGVzKSB7Ci0gICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHJlc292ZU5vZGVSUy5ub2Rlc1swXS0+QXNOb2RlKCk7Ci0gICAgaWYgKHBOb2RlKSB7Ci0gICAgICByZXR1cm4gKENYRkFfV2lkZ2V0QWNjKilwTm9kZS0+R2V0V2lkZ2V0RGF0YSgpOwotICAgIH0KLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotdm9pZCBDWEZBX0ZGRG9jVmlldzo6T25QYWdlRXZlbnQoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwU2VuZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdFdmVudCkgewotICBDWEZBX0ZGUGFnZVZpZXcqIHBGRlBhZ2VWaWV3ID0gc3RhdGljX2Nhc3Q8Q1hGQV9GRlBhZ2VWaWV3Kj4ocFNlbmRlcik7Ci0gIG1fcERvYy0+R2V0RG9jRW52aXJvbm1lbnQoKS0+UGFnZVZpZXdFdmVudChwRkZQYWdlVmlldywgZHdFdmVudCk7Ci19Ci0KLXZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkxvY2tVcGRhdGUoKSB7Ci0gIG1faUxvY2srKzsKLX0KLXZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlVubG9ja1VwZGF0ZSgpIHsKLSAgbV9pTG9jay0tOwotfQotYm9vbCBDWEZBX0ZGRG9jVmlldzo6SXNVcGRhdGVMb2NrZWQoKSB7Ci0gIHJldHVybiBtX2lMb2NrID4gMDsKLX0KLXZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkNsZWFySW52YWxpZGF0ZUxpc3QoKSB7Ci0gIG1fbWFwUGFnZUludmFsaWRhdGUuY2xlYXIoKTsKLX0KLXZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkFkZEludmFsaWRhdGVSZWN0KENYRkFfRkZXaWRnZXQqIHBXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0SW52YWxpZGF0ZSkgewotICBBZGRJbnZhbGlkYXRlUmVjdChwV2lkZ2V0LT5HZXRQYWdlVmlldygpLCBydEludmFsaWRhdGUpOwotfQotCi12b2lkIENYRkFfRkZEb2NWaWV3OjpBZGRJbnZhbGlkYXRlUmVjdChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRJbnZhbGlkYXRlKSB7Ci0gIGlmIChtX21hcFBhZ2VJbnZhbGlkYXRlW3BQYWdlVmlld10pIHsKLSAgICBtX21hcFBhZ2VJbnZhbGlkYXRlW3BQYWdlVmlld10tPlVuaW9uKHJ0SW52YWxpZGF0ZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIG1fbWFwUGFnZUludmFsaWRhdGVbcFBhZ2VWaWV3XSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfUmVjdEY+KHJ0SW52YWxpZGF0ZSk7Ci19Ci0KLXZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlJ1bkludmFsaWRhdGUoKSB7Ci0gIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1fbWFwUGFnZUludmFsaWRhdGUpCi0gICAgbV9wRG9jLT5HZXREb2NFbnZpcm9ubWVudCgpLT5JbnZhbGlkYXRlUmVjdChwYWlyLmZpcnN0LCAqcGFpci5zZWNvbmQsIDApOwotICBtX21hcFBhZ2VJbnZhbGlkYXRlLmNsZWFyKCk7Ci19Ci0KLWJvb2wgQ1hGQV9GRkRvY1ZpZXc6OlJ1bkxheW91dCgpIHsKLSAgTG9ja1VwZGF0ZSgpOwotICBtX2JJbkxheW91dFN0YXR1cyA9IHRydWU7Ci0gIGlmICghbV9wWEZBRG9jTGF5b3V0LT5JbmNyZW1lbnRMYXlvdXQoKSAmJgotICAgICAgbV9wWEZBRG9jTGF5b3V0LT5TdGFydExheW91dCgpIDwgMTAwKSB7Ci0gICAgbV9wWEZBRG9jTGF5b3V0LT5Eb0xheW91dCgpOwotICAgIFVubG9ja1VwZGF0ZSgpOwotICAgIG1fYkluTGF5b3V0U3RhdHVzID0gZmFsc2U7Ci0gICAgbV9wRG9jLT5HZXREb2NFbnZpcm9ubWVudCgpLT5QYWdlVmlld0V2ZW50KG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QQUdFVklFV0VWRU5UX1N0b3BMYXlvdXQpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIG1fYkluTGF5b3V0U3RhdHVzID0gZmFsc2U7Ci0gIG1fcERvYy0+R2V0RG9jRW52aXJvbm1lbnQoKS0+UGFnZVZpZXdFdmVudChudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BBR0VWSUVXRVZFTlRfU3RvcExheW91dCk7Ci0gIFVubG9ja1VwZGF0ZSgpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlJ1blN1YmZvcm1JbmRleENoYW5nZSgpIHsKLSAgZm9yIChDWEZBX05vZGUqIHBTdWJmb3JtTm9kZSA6IG1fSW5kZXhDaGFuZ2VkU3ViZm9ybXMpIHsKLSAgICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9Ci0gICAgICAgIHN0YXRpY19jYXN0PENYRkFfV2lkZ2V0QWNjKj4ocFN1YmZvcm1Ob2RlLT5HZXRXaWRnZXREYXRhKCkpOwotICAgIGlmICghcFdpZGdldEFjYykKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsKLSAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9JbmRleENoYW5nZTsKLSAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gcFdpZGdldEFjYzsKLSAgICBwV2lkZ2V0QWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fSW5kZXhDaGFuZ2UsICZlUGFyYW0pOwotICB9Ci0gIG1fSW5kZXhDaGFuZ2VkU3ViZm9ybXMuY2xlYXIoKTsKLX0KLQotdm9pZCBDWEZBX0ZGRG9jVmlldzo6QWRkTmV3Rm9ybU5vZGUoQ1hGQV9Ob2RlKiBwTm9kZSkgewotICBtX05ld0FkZGVkTm9kZXMucHVzaF9iYWNrKHBOb2RlKTsKLSAgSW5pdExheW91dChwTm9kZSk7Ci19Ci0KLXZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkFkZEluZGV4Q2hhbmdlZFN1YmZvcm0oQ1hGQV9Ob2RlKiBwTm9kZSkgewotICBBU1NFUlQocE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm0pOwotICBtX0luZGV4Q2hhbmdlZFN1YmZvcm1zLnB1c2hfYmFjayhwTm9kZSk7Ci19Ci0KLXZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlJ1bkRvY0Nsb3NlKCkgewotICBDWEZBX05vZGUqIHBSb290SXRlbSA9Ci0gICAgICBUb05vZGUobV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0WEZBT2JqZWN0KFhGQV9IQVNIQ09ERV9Gb3JtKSk7Ci0gIGlmICghcFJvb3RJdGVtKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocFJvb3RJdGVtLCBYRkFfRVZFTlRfRG9jQ2xvc2UsIGZhbHNlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOwotfQotdm9pZCBDWEZBX0ZGRG9jVmlldzo6RGVzdHJveURvY1ZpZXcoKSB7Ci0gIENsZWFySW52YWxpZGF0ZUxpc3QoKTsKLSAgbV9pU3RhdHVzID0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX05vbmU7Ci0gIG1faUxvY2sgPSAwOwotICBtX1ZhbGlkYXRlQWNjcy5jbGVhcigpOwotICBtX0JpbmRJdGVtcy5jbGVhcigpOwotICBtX0NhbGN1bGF0ZUFjY3MuY2xlYXIoKTsKLX0KLWJvb2wgQ1hGQV9GRkRvY1ZpZXc6OklzU3RhdGljTm90aWZ5KCkgewotICByZXR1cm4gbV9wRG9jLT5HZXREb2NUeXBlKCkgPT0gWEZBX0RPQ1RZUEVfU3RhdGljOwotfQotCi12b2lkIENYRkFfRkZEb2NWaWV3OjpBZGRDYWxjdWxhdGVXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpIHsKLSAgQ1hGQV9XaWRnZXRBY2MqIHBDdXJyZW50QWNjID0KLSAgICAgICFtX0NhbGN1bGF0ZUFjY3MuZW1wdHkoKSA/IG1fQ2FsY3VsYXRlQWNjcy5iYWNrKCkgOiBudWxscHRyOwotICBpZiAocEN1cnJlbnRBY2MgIT0gcFdpZGdldEFjYykKLSAgICBtX0NhbGN1bGF0ZUFjY3MucHVzaF9iYWNrKHBXaWRnZXRBY2MpOwotfQotCi12b2lkIENYRkFfRkZEb2NWaWV3OjpBZGRDYWxjdWxhdGVOb2RlTm90aWZ5KENYRkFfTm9kZSogcE5vZGVDaGFuZ2UpIHsKLSAgYXV0byBwR2xvYmFsRGF0YSA9Ci0gICAgICBzdGF0aWNfY2FzdDxDWEZBX0NhbGNEYXRhKj4ocE5vZGVDaGFuZ2UtPkdldFVzZXJEYXRhKFhGQV9DYWxjRGF0YSkpOwotICBpZiAoIXBHbG9iYWxEYXRhKQotICAgIHJldHVybjsKLQotICBmb3IgKGNvbnN0IGF1dG8mIHBSZXN1bHRBY2MgOiBwR2xvYmFsRGF0YS0+bV9HbG9iYWxzKSB7Ci0gICAgaWYgKCFwUmVzdWx0QWNjLT5HZXROb2RlKCktPkhhc1JlbW92ZWRDaGlsZHJlbigpKQotICAgICAgQWRkQ2FsY3VsYXRlV2lkZ2V0QWNjKHBSZXN1bHRBY2MpOwotICB9Ci19Ci0KLXZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlJ1bkNhbGN1bGF0ZVJlY3Vyc2l2ZShpbnQzMl90JiBpSW5kZXgpIHsKLSAgd2hpbGUgKGlJbmRleCA8IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9DYWxjdWxhdGVBY2NzKSkgewotICAgIENYRkFfV2lkZ2V0QWNjKiBwQ3VyQWNjID0gbV9DYWxjdWxhdGVBY2NzW2lJbmRleF07Ci0gICAgQWRkQ2FsY3VsYXRlTm9kZU5vdGlmeShwQ3VyQWNjLT5HZXROb2RlKCkpOwotICAgIGludDMyX3QgaVJlZkNvdW50ID0KLSAgICAgICAgKGludDMyX3QpKHVpbnRwdHJfdClwQ3VyQWNjLT5HZXROb2RlKCktPkdldFVzZXJEYXRhKFhGQV9DYWxjUmVmQ291bnQpOwotICAgIGlSZWZDb3VudCsrOwotICAgIHBDdXJBY2MtPkdldE5vZGUoKS0+U2V0VXNlckRhdGEoWEZBX0NhbGNSZWZDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikodWludHB0cl90KWlSZWZDb3VudCk7Ci0gICAgaWYgKGlSZWZDb3VudCA+IDExKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKChwQ3VyQWNjLT5Qcm9jZXNzQ2FsY3VsYXRlKCkpID09IFhGQV9FVkVOVEVSUk9SX1N1Y2Nlc3MpIHsKLSAgICAgIEFkZFZhbGlkYXRlV2lkZ2V0KHBDdXJBY2MpOwotICAgIH0KLSAgICBpSW5kZXgrKzsKLSAgICBSdW5DYWxjdWxhdGVSZWN1cnNpdmUoaUluZGV4KTsKLSAgfQotfQotCi1pbnQzMl90IENYRkFfRkZEb2NWaWV3OjpSdW5DYWxjdWxhdGVXaWRnZXRzKCkgewotICBpZiAoIW1fcERvYy0+R2V0RG9jRW52aXJvbm1lbnQoKS0+SXNDYWxjdWxhdGlvbnNFbmFibGVkKG1fcERvYykpIHsKLSAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRGlzYWJsZWQ7Ci0gIH0KLSAgaW50MzJfdCBpQ291bnRzID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX0NhbGN1bGF0ZUFjY3MpOwotICBpbnQzMl90IGlJbmRleCA9IDA7Ci0gIGlmIChpQ291bnRzID4gMCkKLSAgICBSdW5DYWxjdWxhdGVSZWN1cnNpdmUoaUluZGV4KTsKLQotICBmb3IgKENYRkFfV2lkZ2V0QWNjKiBwQ3VyQWNjIDogbV9DYWxjdWxhdGVBY2NzKQotICAgIHBDdXJBY2MtPkdldE5vZGUoKS0+U2V0VXNlckRhdGEoWEZBX0NhbGNSZWZDb3VudCwgKHZvaWQqKSh1aW50cHRyX3QpMCk7Ci0KLSAgbV9DYWxjdWxhdGVBY2NzLmNsZWFyKCk7Ci0gIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNjZXNzOwotfQotCi12b2lkIENYRkFfRkZEb2NWaWV3OjpBZGRWYWxpZGF0ZVdpZGdldChDWEZBX1dpZGdldEFjYyogcFdpZGdldCkgewotICBpZiAoIXBkZml1bTo6Q29udGFpbnNWYWx1ZShtX1ZhbGlkYXRlQWNjcywgcFdpZGdldCkpCi0gICAgbV9WYWxpZGF0ZUFjY3MucHVzaF9iYWNrKHBXaWRnZXQpOwotfQotCi1ib29sIENYRkFfRkZEb2NWaWV3OjpJbml0Q2FsY3VsYXRlKENYRkFfTm9kZSogcE5vZGUpIHsKLSAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwTm9kZSwgWEZBX0VWRU5UX0luaXRDYWxjdWxhdGUsIGZhbHNlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDWEZBX0ZGRG9jVmlldzo6SW5pdFZhbGlkYXRlKENYRkFfTm9kZSogcE5vZGUpIHsKLSAgaWYgKCFtX3BEb2MtPkdldERvY0Vudmlyb25tZW50KCktPklzVmFsaWRhdGlvbnNFbmFibGVkKG1fcERvYykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocE5vZGUsIFhGQV9FVkVOVF9WYWxpZGF0ZSwgZmFsc2UsIHRydWUsIG51bGxwdHIpOwotICBtX1ZhbGlkYXRlQWNjcy5jbGVhcigpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDWEZBX0ZGRG9jVmlldzo6UnVuVmFsaWRhdGUoKSB7Ci0gIGlmICghbV9wRG9jLT5HZXREb2NFbnZpcm9ubWVudCgpLT5Jc1ZhbGlkYXRpb25zRW5hYmxlZChtX3BEb2MpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBmb3IgKENYRkFfV2lkZ2V0QWNjKiBwQWNjIDogbV9WYWxpZGF0ZUFjY3MpIHsKLSAgICBpZiAoIXBBY2MtPkdldE5vZGUoKS0+SGFzUmVtb3ZlZENoaWxkcmVuKCkpCi0gICAgICBwQWNjLT5Qcm9jZXNzVmFsaWRhdGUoKTsKLSAgfQotICBtX1ZhbGlkYXRlQWNjcy5jbGVhcigpOwotICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgQ1hGQV9GRkRvY1ZpZXc6OlJ1bkV2ZW50TGF5b3V0UmVhZHkoKSB7Ci0gIENYRkFfTm9kZSogcFJvb3RJdGVtID0KLSAgICAgIFRvTm9kZShtX3BEb2MtPkdldFhGQURvYygpLT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0Zvcm0pKTsKLSAgaWYgKCFwUm9vdEl0ZW0pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwUm9vdEl0ZW0sIFhGQV9FVkVOVF9SZWFkeSwgZmFsc2UsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7Ci0gIFJ1bkxheW91dCgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLXZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlJ1bkJpbmRJdGVtcygpIHsKLSAgZm9yIChjb25zdCBhdXRvJiBpdGVtIDogbV9CaW5kSXRlbXMpIHsKLSAgICBpZiAoaXRlbS0+SGFzUmVtb3ZlZENoaWxkcmVuKCkpCi0gICAgICBjb250aW51ZTsKLQotICAgIENYRkFfTm9kZSogcFdpZGdldE5vZGUgPSBpdGVtLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsKLSAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9Ci0gICAgICAgIHN0YXRpY19jYXN0PENYRkFfV2lkZ2V0QWNjKj4ocFdpZGdldE5vZGUtPkdldFdpZGdldERhdGEoKSk7Ci0gICAgaWYgKCFwQWNjKQotICAgICAgY29udGludWU7Ci0KLSAgICBDWEZBX0JpbmRJdGVtcyBiaW5kaXRlbXMoaXRlbSk7Ci0gICAgQ1hGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9Ci0gICAgICAgIHBXaWRnZXROb2RlLT5HZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdzUmVmOwotICAgIGJpbmRpdGVtcy5HZXRSZWYod3NSZWYpOwotICAgIHVpbnQzMl90IGR3U3R5bGUgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyB8Ci0gICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfAotICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfQUxMOwotICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByczsKLSAgICBwU2NyaXB0Q29udGV4dC0+UmVzb2x2ZU9iamVjdHMocFdpZGdldE5vZGUsIHdzUmVmLCBycywgZHdTdHlsZSk7Ci0gICAgaW50MzJfdCBpQ291bnQgPSBycy5ub2Rlcy5HZXRTaXplKCk7Ci0gICAgcEFjYy0+RGVsZXRlSXRlbSgtMSk7Ci0gICAgaWYgKHJzLmR3RmxhZ3MgIT0gWEZBX1JFU09WRU5PREVfUlNUWVBFX05vZGVzIHx8IGlDb3VudCA8IDEpCi0gICAgICBjb250aW51ZTsKLQotICAgIENGWF9XaWRlU3RyaW5nQyB3c1ZhbHVlUmVmLCB3c0xhYmVsUmVmOwotICAgIGJpbmRpdGVtcy5HZXRWYWx1ZVJlZih3c1ZhbHVlUmVmKTsKLSAgICBiaW5kaXRlbXMuR2V0TGFiZWxSZWYod3NMYWJlbFJlZik7Ci0gICAgY29uc3QgYm9vbCBiVXNlVmFsdWUgPSB3c0xhYmVsUmVmLklzRW1wdHkoKSB8fCB3c0xhYmVsUmVmID09IHdzVmFsdWVSZWY7Ci0gICAgY29uc3QgYm9vbCBiTGFiZWxVc2VDb250ZW50ID0gd3NMYWJlbFJlZi5Jc0VtcHR5KCkgfHwgd3NMYWJlbFJlZiA9PSBMIiQiOwotICAgIGNvbnN0IGJvb2wgYlZhbHVlVXNlQ29udGVudCA9IHdzVmFsdWVSZWYuSXNFbXB0eSgpIHx8IHdzVmFsdWVSZWYgPT0gTCIkIjsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOwotICAgIENGWF9XaWRlU3RyaW5nIHdzTGFiZWw7Ci0gICAgdWludDMyX3QgdVZhbHVlSGFzaCA9IEZYX0hhc2hDb2RlX0dldFcod3NWYWx1ZVJlZiwgZmFsc2UpOwotICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlDb3VudDsgaisrKSB7Ci0gICAgICBDWEZBX09iamVjdCogcmVmT2JqID0gcnMubm9kZXNbal07Ci0gICAgICBpZiAoIXJlZk9iai0+SXNOb2RlKCkpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBDWEZBX05vZGUqIHJlZk5vZGUgPSByZWZPYmotPkFzTm9kZSgpOwotICAgICAgaWYgKGJWYWx1ZVVzZUNvbnRlbnQpIHsKLSAgICAgICAgd3NWYWx1ZSA9IHJlZk5vZGUtPkdldENvbnRlbnQoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIENYRkFfTm9kZSogbm9kZVZhbHVlID0gcmVmTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZSh1VmFsdWVIYXNoKTsKLSAgICAgICAgd3NWYWx1ZSA9IG5vZGVWYWx1ZSA/IG5vZGVWYWx1ZS0+R2V0Q29udGVudCgpIDogcmVmTm9kZS0+R2V0Q29udGVudCgpOwotICAgICAgfQotICAgICAgaWYgKCFiVXNlVmFsdWUpIHsKLSAgICAgICAgaWYgKGJMYWJlbFVzZUNvbnRlbnQpIHsKLSAgICAgICAgICB3c0xhYmVsID0gcmVmTm9kZS0+R2V0Q29udGVudCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIENYRkFfTm9kZSogbm9kZUxhYmVsID0gcmVmTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZSh3c0xhYmVsUmVmKTsKLSAgICAgICAgICBpZiAobm9kZUxhYmVsKQotICAgICAgICAgICAgd3NMYWJlbCA9IG5vZGVMYWJlbC0+R2V0Q29udGVudCgpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICB3c0xhYmVsID0gd3NWYWx1ZTsKLSAgICAgIH0KLSAgICAgIHBBY2MtPkluc2VydEl0ZW0od3NMYWJlbCwgd3NWYWx1ZSk7Ci0gICAgfQotICB9Ci0gIG1fQmluZEl0ZW1zLmNsZWFyKCk7Ci19Ci12b2lkIENYRkFfRkZEb2NWaWV3OjpTZXRDaGFuZ2VNYXJrKCkgewotICBpZiAobV9pU3RhdHVzIDwgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZCkgewotICAgIHJldHVybjsKLSAgfQotICBtX3BEb2MtPkdldERvY0Vudmlyb25tZW50KCktPlNldENoYW5nZU1hcmsobV9wRG9jKTsKLX0KLUNYRkFfTm9kZSogQ1hGQV9GRkRvY1ZpZXc6OkdldFJvb3RTdWJmb3JtKCkgewotICBDWEZBX05vZGUqIHBGb3JtUGFja2V0Tm9kZSA9Ci0gICAgICBUb05vZGUobV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0WEZBT2JqZWN0KFhGQV9IQVNIQ09ERV9Gb3JtKSk7Ci0gIGlmICghcEZvcm1QYWNrZXROb2RlKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgcmV0dXJuIHBGb3JtUGFja2V0Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VsZW1lbnQ6OlN1YmZvcm0pOwotfQotCi1DWEZBX1dpZGdldEFjY0l0ZXJhdG9yOjpDWEZBX1dpZGdldEFjY0l0ZXJhdG9yKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVHJhdmVsUm9vdCkKLSAgICA6IG1fQ29udGVudEl0ZXJhdG9yKHBUcmF2ZWxSb290KSwKLSAgICAgIG1fcERvY1ZpZXcocERvY1ZpZXcpLAotICAgICAgbV9wQ3VyV2lkZ2V0QWNjKG51bGxwdHIpIHt9Ci0KLUNYRkFfV2lkZ2V0QWNjSXRlcmF0b3I6On5DWEZBX1dpZGdldEFjY0l0ZXJhdG9yKCkge30KLXZvaWQgQ1hGQV9XaWRnZXRBY2NJdGVyYXRvcjo6UmVzZXQoKSB7Ci0gIG1fcEN1cldpZGdldEFjYyA9IG51bGxwdHI7Ci0gIG1fQ29udGVudEl0ZXJhdG9yLlJlc2V0KCk7Ci19Ci0KLUNYRkFfV2lkZ2V0QWNjKiBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yOjpNb3ZlVG9GaXJzdCgpIHsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLUNYRkFfV2lkZ2V0QWNjKiBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yOjpNb3ZlVG9MYXN0KCkgewotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotQ1hGQV9XaWRnZXRBY2MqIENYRkFfV2lkZ2V0QWNjSXRlcmF0b3I6Ok1vdmVUb05leHQoKSB7Ci0gIENYRkFfTm9kZSogcEl0ZW0gPSBtX3BDdXJXaWRnZXRBY2MgPyBtX0NvbnRlbnRJdGVyYXRvci5Nb3ZlVG9OZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fQ29udGVudEl0ZXJhdG9yLkdldEN1cnJlbnQoKTsKLSAgd2hpbGUgKHBJdGVtKSB7Ci0gICAgbV9wQ3VyV2lkZ2V0QWNjID0gc3RhdGljX2Nhc3Q8Q1hGQV9XaWRnZXRBY2MqPihwSXRlbS0+R2V0V2lkZ2V0RGF0YSgpKTsKLSAgICBpZiAobV9wQ3VyV2lkZ2V0QWNjKQotICAgICAgcmV0dXJuIG1fcEN1cldpZGdldEFjYzsKLSAgICBwSXRlbSA9IG1fQ29udGVudEl0ZXJhdG9yLk1vdmVUb05leHQoKTsKLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotQ1hGQV9XaWRnZXRBY2MqIENYRkFfV2lkZ2V0QWNjSXRlcmF0b3I6Ok1vdmVUb1ByZXZpb3VzKCkgewotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotQ1hGQV9XaWRnZXRBY2MqIENYRkFfV2lkZ2V0QWNjSXRlcmF0b3I6OkdldEN1cnJlbnRXaWRnZXRBY2MoKSB7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1ib29sIENYRkFfV2lkZ2V0QWNjSXRlcmF0b3I6OlNldEN1cnJlbnRXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIGhXaWRnZXQpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIENYRkFfV2lkZ2V0QWNjSXRlcmF0b3I6OlNraXBUcmVlKCkgewotICBtX0NvbnRlbnRJdGVyYXRvci5Ta2lwQ2hpbGRyZW5BbmRNb3ZlVG9OZXh0KCk7Ci0gIG1fcEN1cldpZGdldEFjYyA9IG51bGxwdHI7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAveGZhX2ZmZHJhdy5jcHAgYi94ZmEvZnhmYS9hcHAveGZhX2ZmZHJhdy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MDk1ZGQuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvYXBwL3hmYV9mZmRyYXcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZmRyYXcuaCIKLQotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmFwcC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmRvYy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZnBhZ2V2aWV3LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0LmgiCi0KLUNYRkFfRkZEcmF3OjpDWEZBX0ZGRHJhdyhDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpIDogQ1hGQV9GRldpZGdldChwRGF0YUFjYykge30KLQotQ1hGQV9GRkRyYXc6On5DWEZBX0ZGRHJhdygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAveGZhX2ZmZHJhdy5oIGIveGZhL2Z4ZmEvYXBwL3hmYV9mZmRyYXcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIxMmRjYy4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAveGZhX2ZmZHJhdy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEZBX0FQUF9YRkFfRkZEUkFXX0hfCi0jZGVmaW5lIFhGQV9GWEZBX0FQUF9YRkFfRkZEUkFXX0hfCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZwYWdldmlldy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZndpZGdldC5oIgotCi1jbGFzcyBDWEZBX0ZGRHJhdyA6IHB1YmxpYyBDWEZBX0ZGV2lkZ2V0IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfRkZEcmF3KENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7Ci0gIH5DWEZBX0ZGRHJhdygpIG92ZXJyaWRlOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhGQV9BUFBfWEZBX0ZGRFJBV19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL3hmYV9mZmV4Y2xncm91cC5jcHAgYi94ZmEvZnhmYS9hcHAveGZhX2ZmZXhjbGdyb3VwLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q2M2RhZC4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAveGZhX2ZmZXhjbGdyb3VwLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZleGNsZ3JvdXAuaCIKLQotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmFwcC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmRvYy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZnBhZ2V2aWV3LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0LmgiCi0KLUNYRkFfRkZFeGNsR3JvdXA6OkNYRkFfRkZFeGNsR3JvdXAoQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQotICAgIDogQ1hGQV9GRldpZGdldChwRGF0YUFjYykge30KLQotQ1hGQV9GRkV4Y2xHcm91cDo6fkNYRkFfRkZFeGNsR3JvdXAoKSB7fQotCi12b2lkIENYRkFfRkZFeGNsR3JvdXA6OlJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cykgewotICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkKLSAgICByZXR1cm47Ci0KLSAgQ0ZYX01hdHJpeCBtdFJvdGF0ZSA9IEdldFJvdGF0ZU1hdHJpeCgpOwotICBpZiAocE1hdHJpeCkKLSAgICBtdFJvdGF0ZS5Db25jYXQoKnBNYXRyaXgpOwotCi0gIENYRkFfRkZXaWRnZXQ6OlJlbmRlcldpZGdldChwR1MsICZtdFJvdGF0ZSwgZHdTdGF0dXMpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL3hmYV9mZmV4Y2xncm91cC5oIGIveGZhL2Z4ZmEvYXBwL3hmYV9mZmV4Y2xncm91cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmExM2FlLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfZmZleGNsZ3JvdXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhGQV9BUFBfWEZBX0ZGRVhDTEdST1VQX0hfCi0jZGVmaW5lIFhGQV9GWEZBX0FQUF9YRkFfRkZFWENMR1JPVVBfSF8KLQotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZnBhZ2V2aWV3LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0LmgiCi0KLWNsYXNzIENYRkFfRkZFeGNsR3JvdXAgOiBwdWJsaWMgQ1hGQV9GRldpZGdldCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDWEZBX0ZGRXhjbEdyb3VwKENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7Ci0gIH5DWEZBX0ZGRXhjbEdyb3VwKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ1hGQV9GRldpZGdldAotICB2b2lkIFJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGF0dXMpIG92ZXJyaWRlOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhGQV9BUFBfWEZBX0ZGRVhDTEdST1VQX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAveGZhX2ZmZmllbGQuY3BwIGIveGZhL2Z4ZmEvYXBwL3hmYV9mZmZpZWxkLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMwZDA0My4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAveGZhX2ZmZmllbGQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzQ5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZmaWVsZC5oIgotCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX2VkaXQuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfZXZlbnRtb3VzZS5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9tZXNzYWdla2V5LmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX21lc3NhZ2VraWxsZm9jdXMuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfbWVzc2FnZW1vdXNlLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX21lc3NhZ2Vtb3VzZXdoZWVsLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX21lc3NhZ2VzZXRmb2N1cy5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9waWN0dXJlYm94LmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX3dpZGdldG1nci5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC9jeGZhX3RleHRsYXlvdXQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2Z3bHRoZW1lLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmYXBwLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jdmlldy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZnBhZ2V2aWV3LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0LmgiCi0jaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY2Z4X2NvbG9yLmgiCi0jaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY2Z4X3BhdGguaCIKLQotQ1hGQV9GRkZpZWxkOjpDWEZBX0ZGRmllbGQoQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQotICAgIDogQ1hGQV9GRldpZGdldChwRGF0YUFjYyksIG1fcE5vcm1hbFdpZGdldChudWxscHRyKSB7fQotCi1DWEZBX0ZGRmllbGQ6On5DWEZBX0ZGRmllbGQoKSB7Ci0gIENYRkFfRkZGaWVsZDo6VW5sb2FkV2lkZ2V0KCk7Ci19Ci0KLUNGWF9SZWN0RiBDWEZBX0ZGRmllbGQ6OkdldEJCb3godWludDMyX3QgZHdTdGF0dXMsIGJvb2wgYkRyYXdGb2N1cykgewotICBpZiAoIWJEcmF3Rm9jdXMpCi0gICAgcmV0dXJuIENYRkFfRkZXaWRnZXQ6OkdldEJCb3goZHdTdGF0dXMpOwotCi0gIFhGQV9FbGVtZW50IHR5cGUgPSBtX3BEYXRhQWNjLT5HZXRVSVR5cGUoKTsKLSAgaWYgKHR5cGUgIT0gWEZBX0VsZW1lbnQ6OkJ1dHRvbiAmJiB0eXBlICE9IFhGQV9FbGVtZW50OjpDaGVja0J1dHRvbiAmJgotICAgICAgdHlwZSAhPSBYRkFfRWxlbWVudDo6SW1hZ2VFZGl0ICYmIHR5cGUgIT0gWEZBX0VsZW1lbnQ6OlNpZ25hdHVyZSAmJgotICAgICAgdHlwZSAhPSBYRkFfRWxlbWVudDo6Q2hvaWNlTGlzdCkgewotICAgIHJldHVybiBDRlhfUmVjdEYoKTsKLSAgfQotCi0gIENGWF9SZWN0RiBydEJveCA9IG1fcnRVSTsKLSAgR2V0Um90YXRlTWF0cml4KCkuVHJhbnNmb3JtUmVjdChydEJveCk7Ci0gIHJldHVybiBydEJveDsKLX0KLQotdm9pZCBDWEZBX0ZGRmllbGQ6OlJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGF0dXMpIHsKLSAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpCi0gICAgcmV0dXJuOwotCi0gIENGWF9NYXRyaXggbXRSb3RhdGUgPSBHZXRSb3RhdGVNYXRyaXgoKTsKLSAgaWYgKHBNYXRyaXgpCi0gICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsKLQotICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzKTsKLSAgQ1hGQV9Cb3JkZXIgYm9yZGVyVUkgPSBtX3BEYXRhQWNjLT5HZXRVSUJvcmRlcigpOwotICBEcmF3Qm9yZGVyKHBHUywgYm9yZGVyVUksIG1fcnRVSSwgJm10Um90YXRlKTsKLSAgUmVuZGVyQ2FwdGlvbihwR1MsICZtdFJvdGF0ZSk7Ci0gIERyYXdIaWdobGlnaHQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzLCBmYWxzZSk7Ci0KLSAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KCk7Ci0gIENGWF9NYXRyaXggbXQoMSwgMCwgMCwgMSwgcnRXaWRnZXQubGVmdCwgcnRXaWRnZXQudG9wKTsKLSAgbXQuQ29uY2F0KG10Um90YXRlKTsKLSAgR2V0QXBwKCktPkdldFdpZGdldE1nckRlbGVnYXRlKCktPk9uRHJhd1dpZGdldChtX3BOb3JtYWxXaWRnZXQsIHBHUywgJm10KTsKLX0KLXZvaWQgQ1hGQV9GRkZpZWxkOjpEcmF3SGlnaGxpZ2h0KENGWF9HcmFwaGljcyogcEdTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRWxsaXBzZSkgewotICBpZiAobV9ydFVJLklzRW1wdHkoKSB8fCAhbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKChkd1N0YXR1cyAmIFhGQV9XaWRnZXRTdGF0dXNfSGlnaGxpZ2h0KSAmJgotICAgICAgbV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fT3BlbikgewotICAgIENYRkFfRkZEb2MqIHBEb2MgPSBHZXREb2MoKTsKLSAgICBDRlhfQ29sb3IgY3JIaWdobGlnaHQocERvYy0+R2V0RG9jRW52aXJvbm1lbnQoKS0+R2V0SGlnaGxpZ2h0Q29sb3IocERvYykpOwotICAgIHBHUy0+U2V0RmlsbENvbG9yKCZjckhpZ2hsaWdodCk7Ci0gICAgQ0ZYX1BhdGggcGF0aDsKLSAgICBpZiAoYkVsbGlwc2UpCi0gICAgICBwYXRoLkFkZEVsbGlwc2UobV9ydFVJKTsKLSAgICBlbHNlCi0gICAgICBwYXRoLkFkZFJlY3RhbmdsZShtX3J0VUkubGVmdCwgbV9ydFVJLnRvcCwgbV9ydFVJLndpZHRoLCBtX3J0VUkuaGVpZ2h0KTsKLQotICAgIHBHUy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsKLSAgfQotfQotdm9pZCBDWEZBX0ZGRmllbGQ6OkRyYXdGb2N1cyhDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBpZiAobV9kd1N0YXR1cyAmIFhGQV9XaWRnZXRTdGF0dXNfRm9jdXNlZCkgewotICAgIENGWF9Db2xvciBjcigweEZGMDAwMDAwKTsKLSAgICBwR1MtPlNldFN0cm9rZUNvbG9yKCZjcik7Ci0gICAgRlhfRkxPQVQgRGFzaFBhdHRlcm5bMl0gPSB7MSwgMX07Ci0gICAgcEdTLT5TZXRMaW5lRGFzaCgwLjBmLCBEYXNoUGF0dGVybiwgMik7Ci0gICAgcEdTLT5TZXRMaW5lV2lkdGgoMCwgZmFsc2UpOwotCi0gICAgQ0ZYX1BhdGggcGF0aDsKLSAgICBwYXRoLkFkZFJlY3RhbmdsZShtX3J0VUkubGVmdCwgbV9ydFVJLnRvcCwgbV9ydFVJLndpZHRoLCBtX3J0VUkuaGVpZ2h0KTsKLSAgICBwR1MtPlN0cm9rZVBhdGgoJnBhdGgsIHBNYXRyaXgpOwotICB9Ci19Ci12b2lkIENYRkFfRkZGaWVsZDo6U2V0RldMVGhlbWVQcm92aWRlcigpIHsKLSAgaWYgKG1fcE5vcm1hbFdpZGdldCkKLSAgICBtX3BOb3JtYWxXaWRnZXQtPlNldFRoZW1lUHJvdmlkZXIoR2V0QXBwKCktPkdldEZXTFRoZW1lKCkpOwotfQotYm9vbCBDWEZBX0ZGRmllbGQ6OklzTG9hZGVkKCkgewotICByZXR1cm4gbV9wTm9ybWFsV2lkZ2V0ICYmIENYRkFfRkZXaWRnZXQ6OklzTG9hZGVkKCk7Ci19Ci1ib29sIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpIHsKLSAgU2V0RldMVGhlbWVQcm92aWRlcigpOwotICBtX3BEYXRhQWNjLT5Mb2FkQ2FwdGlvbigpOwotICBQZXJmb3JtTGF5b3V0KCk7Ci0gIHJldHVybiB0cnVlOwotfQotdm9pZCBDWEZBX0ZGRmllbGQ6OlVubG9hZFdpZGdldCgpIHsKLSAgZGVsZXRlIG1fcE5vcm1hbFdpZGdldDsKLSAgbV9wTm9ybWFsV2lkZ2V0ID0gbnVsbHB0cjsKLX0KLXZvaWQgQ1hGQV9GRkZpZWxkOjpTZXRFZGl0U2Nyb2xsT2Zmc2V0KCkgewotICBYRkFfRWxlbWVudCBlVHlwZSA9IG1fcERhdGFBY2MtPkdldFVJVHlwZSgpOwotICBpZiAoZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OlRleHRFZGl0IHx8IGVUeXBlID09IFhGQV9FbGVtZW50OjpOdW1lcmljRWRpdCB8fAotICAgICAgZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OlBhc3N3b3JkRWRpdCkgewotICAgIEZYX0ZMT0FUIGZTY3JvbGxPZmZzZXQgPSAwOwotICAgIENYRkFfRkZGaWVsZCogcFByZXYgPSBzdGF0aWNfY2FzdDxDWEZBX0ZGRmllbGQqPihHZXRQcmV2KCkpOwotICAgIGlmIChwUHJldikgewotICAgICAgQ0ZYX1JlY3RGIHJ0TWFyZ2luID0gbV9wRGF0YUFjYy0+R2V0VUlNYXJnaW4oKTsKLSAgICAgIGZTY3JvbGxPZmZzZXQgPSAtcnRNYXJnaW4udG9wOwotICAgIH0KLSAgICB3aGlsZSAocFByZXYpIHsKLSAgICAgIGZTY3JvbGxPZmZzZXQgKz0gcFByZXYtPm1fcnRVSS5oZWlnaHQ7Ci0gICAgICBwUHJldiA9IHN0YXRpY19jYXN0PENYRkFfRkZGaWVsZCo+KHBQcmV2LT5HZXRQcmV2KCkpOwotICAgIH0KLSAgICAoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+U2V0U2Nyb2xsT2Zmc2V0KGZTY3JvbGxPZmZzZXQpOwotICB9Ci19Ci1ib29sIENYRkFfRkZGaWVsZDo6UGVyZm9ybUxheW91dCgpIHsKLSAgQ1hGQV9GRldpZGdldDo6UGVyZm9ybUxheW91dCgpOwotICBDYXBQbGFjZW1lbnQoKTsKLSAgTGF5b3V0Q2FwdGlvbigpOwotICBTZXRGV0xSZWN0KCk7Ci0gIFNldEVkaXRTY3JvbGxPZmZzZXQoKTsKLSAgaWYgKG1fcE5vcm1hbFdpZGdldCkgewotICAgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci12b2lkIENYRkFfRkZGaWVsZDo6Q2FwUGxhY2VtZW50KCkgewotICBDRlhfUmVjdEYgcnRXaWRnZXQgPSBHZXRSZWN0V2l0aG91dFJvdGF0ZSgpOwotICBDWEZBX01hcmdpbiBtZ1dpZGdldCA9IG1fcERhdGFBY2MtPkdldE1hcmdpbigpOwotICBpZiAobWdXaWRnZXQpIHsKLSAgICBDWEZBX0xheW91dEl0ZW0qIHBJdGVtID0gdGhpczsKLSAgICBGWF9GTE9BVCBmTGVmdEluc2V0ID0gMCwgZlJpZ2h0SW5zZXQgPSAwLCBmVG9wSW5zZXQgPSAwLCBmQm90dG9tSW5zZXQgPSAwOwotICAgIG1nV2lkZ2V0LkdldExlZnRJbnNldChmTGVmdEluc2V0KTsKLSAgICBtZ1dpZGdldC5HZXRSaWdodEluc2V0KGZSaWdodEluc2V0KTsKLSAgICBtZ1dpZGdldC5HZXRUb3BJbnNldChmVG9wSW5zZXQpOwotICAgIG1nV2lkZ2V0LkdldEJvdHRvbUluc2V0KGZCb3R0b21JbnNldCk7Ci0gICAgaWYgKCFwSXRlbS0+R2V0UHJldigpICYmICFwSXRlbS0+R2V0TmV4dCgpKSB7Ci0gICAgICBydFdpZGdldC5EZWZsYXRlKGZMZWZ0SW5zZXQsIGZUb3BJbnNldCwgZlJpZ2h0SW5zZXQsIGZCb3R0b21JbnNldCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghcEl0ZW0tPkdldFByZXYoKSkKLSAgICAgICAgcnRXaWRnZXQuRGVmbGF0ZShmTGVmdEluc2V0LCBmVG9wSW5zZXQsIGZSaWdodEluc2V0LCAwKTsKLSAgICAgIGVsc2UgaWYgKCFwSXRlbS0+R2V0TmV4dCgpKQotICAgICAgICBydFdpZGdldC5EZWZsYXRlKGZMZWZ0SW5zZXQsIDAsIGZSaWdodEluc2V0LCBmQm90dG9tSW5zZXQpOwotICAgICAgZWxzZQotICAgICAgICBydFdpZGdldC5EZWZsYXRlKGZMZWZ0SW5zZXQsIDAsIGZSaWdodEluc2V0LCAwKTsKLSAgICB9Ci0gIH0KLQotICBYRkFfQVRUUklCVVRFRU5VTSBpQ2FwUGxhY2VtZW50ID0gWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93bjsKLSAgRlhfRkxPQVQgZkNhcFJlc2VydmUgPSAwOwotICBDWEZBX0NhcHRpb24gY2FwdGlvbiA9IG1fcERhdGFBY2MtPkdldENhcHRpb24oKTsKLSAgaWYgKGNhcHRpb24gJiYgY2FwdGlvbi5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX0hpZGRlbikgewotICAgIGlDYXBQbGFjZW1lbnQgPSAoWEZBX0FUVFJJQlVURUVOVU0pY2FwdGlvbi5HZXRQbGFjZW1lbnRUeXBlKCk7Ci0gICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fVG9wICYmIEdldFByZXYoKSkgewotICAgICAgbV9ydENhcHRpb24uUmVzZXQoKTsKLSAgICB9IGVsc2UgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tICYmIEdldE5leHQoKSkgewotICAgICAgbV9ydENhcHRpb24uUmVzZXQoKTsKLSAgICB9IGVsc2UgewotICAgICAgZkNhcFJlc2VydmUgPSBjYXB0aW9uLkdldFJlc2VydmUoKTsKLSAgICAgIENYRkFfTGF5b3V0SXRlbSogcEl0ZW0gPSB0aGlzOwotICAgICAgaWYgKCFwSXRlbS0+R2V0UHJldigpICYmICFwSXRlbS0+R2V0TmV4dCgpKSB7Ci0gICAgICAgIG1fcnRDYXB0aW9uID0gcnRXaWRnZXQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwSXRlbSA9IHBJdGVtLT5HZXRGaXJzdCgpOwotICAgICAgICBtX3J0Q2FwdGlvbiA9IHBJdGVtLT5HZXRSZWN0KGZhbHNlKTsKLSAgICAgICAgcEl0ZW0gPSBwSXRlbS0+R2V0TmV4dCgpOwotICAgICAgICB3aGlsZSAocEl0ZW0pIHsKLSAgICAgICAgICBtX3J0Q2FwdGlvbi5oZWlnaHQgKz0gcEl0ZW0tPkdldFJlY3QoZmFsc2UpLkhlaWdodCgpOwotICAgICAgICAgIHBJdGVtID0gcEl0ZW0tPkdldE5leHQoKTsKLSAgICAgICAgfQotICAgICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKG1fcnRDYXB0aW9uLCBtZ1dpZGdldCk7Ci0gICAgICB9Ci0gICAgICBDWEZBX1RleHRMYXlvdXQqIHBDYXBUZXh0TGF5b3V0ID0gbV9wRGF0YUFjYy0+R2V0Q2FwdGlvblRleHRMYXlvdXQoKTsKLSAgICAgIGlmIChmQ2FwUmVzZXJ2ZSA8PSAwICYmIHBDYXBUZXh0TGF5b3V0KSB7Ci0gICAgICAgIENGWF9TaXplRiBzaXplOwotICAgICAgICBDRlhfU2l6ZUYgbWluU2l6ZTsKLSAgICAgICAgQ0ZYX1NpemVGIG1heFNpemU7Ci0gICAgICAgIHBDYXBUZXh0TGF5b3V0LT5DYWxjU2l6ZShtaW5TaXplLCBtYXhTaXplLCBzaXplKTsKLSAgICAgICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fVG9wIHx8Ci0gICAgICAgICAgICBpQ2FwUGxhY2VtZW50ID09IFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbSkgewotICAgICAgICAgIGZDYXBSZXNlcnZlID0gc2l6ZS5oZWlnaHQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZkNhcFJlc2VydmUgPSBzaXplLndpZHRoOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIG1fcnRVSSA9IHJ0V2lkZ2V0OwotICBzd2l0Y2ggKGlDYXBQbGFjZW1lbnQpIHsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6IHsKLSAgICAgIG1fcnRDYXB0aW9uLndpZHRoID0gZkNhcFJlc2VydmU7Ci0gICAgICBDYXBMZWZ0UmlnaHRQbGFjZW1lbnQoY2FwdGlvbiwgcnRXaWRnZXQsIGlDYXBQbGFjZW1lbnQpOwotICAgICAgbV9ydFVJLndpZHRoIC09IGZDYXBSZXNlcnZlOwotICAgICAgbV9ydFVJLmxlZnQgKz0gZkNhcFJlc2VydmU7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcDogewotICAgICAgbV9ydENhcHRpb24uaGVpZ2h0ID0gZkNhcFJlc2VydmU7Ci0gICAgICBDYXBUb3BCb3R0b21QbGFjZW1lbnQoY2FwdGlvbiwgcnRXaWRnZXQsIGlDYXBQbGFjZW1lbnQpOwotICAgICAgbV9ydFVJLnRvcCArPSBmQ2FwUmVzZXJ2ZTsKLSAgICAgIG1fcnRVSS5oZWlnaHQgLT0gZkNhcFJlc2VydmU7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0OiB7Ci0gICAgICBtX3J0Q2FwdGlvbi5sZWZ0ID0gbV9ydENhcHRpb24ucmlnaHQoKSAtIGZDYXBSZXNlcnZlOwotICAgICAgbV9ydENhcHRpb24ud2lkdGggPSBmQ2FwUmVzZXJ2ZTsKLSAgICAgIENhcExlZnRSaWdodFBsYWNlbWVudChjYXB0aW9uLCBydFdpZGdldCwgaUNhcFBsYWNlbWVudCk7Ci0gICAgICBtX3J0VUkud2lkdGggLT0gZkNhcFJlc2VydmU7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbTogewotICAgICAgbV9ydENhcHRpb24udG9wID0gbV9ydENhcHRpb24uYm90dG9tKCkgLSBmQ2FwUmVzZXJ2ZTsKLSAgICAgIG1fcnRDYXB0aW9uLmhlaWdodCA9IGZDYXBSZXNlcnZlOwotICAgICAgQ2FwVG9wQm90dG9tUGxhY2VtZW50KGNhcHRpb24sIHJ0V2lkZ2V0LCBpQ2FwUGxhY2VtZW50KTsKLSAgICAgIG1fcnRVSS5oZWlnaHQgLT0gZkNhcFJlc2VydmU7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0lubGluZToKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICBDWEZBX0JvcmRlciBib3JkZXJVSSA9IG1fcERhdGFBY2MtPkdldFVJQm9yZGVyKCk7Ci0gIGlmIChib3JkZXJVSSkgewotICAgIENYRkFfTWFyZ2luIG1hcmdpbiA9IGJvcmRlclVJLkdldE1hcmdpbigpOwotICAgIGlmIChtYXJnaW4pIHsKLSAgICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4obV9ydFVJLCBtYXJnaW4pOwotICAgIH0KLSAgfQotICBtX3J0VUkuTm9ybWFsaXplKCk7Ci19Ci12b2lkIENYRkFfRkZGaWVsZDo6Q2FwVG9wQm90dG9tUGxhY2VtZW50KENYRkFfQ2FwdGlvbiBjYXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0V2lkZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDYXBQbGFjZW1lbnQpIHsKLSAgQ0ZYX1JlY3RGIHJ0VUlNYXJnaW4gPSBtX3BEYXRhQWNjLT5HZXRVSU1hcmdpbigpOwotICBtX3J0Q2FwdGlvbi5sZWZ0ICs9IHJ0VUlNYXJnaW4ubGVmdDsKLSAgaWYgKENYRkFfTWFyZ2luIG1nQ2FwID0gY2FwdGlvbi5HZXRNYXJnaW4oKSkgewotICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4obV9ydENhcHRpb24sIG1nQ2FwKTsKLSAgICBpZiAobV9ydENhcHRpb24uaGVpZ2h0IDwgMCkgewotICAgICAgbV9ydENhcHRpb24udG9wICs9IG1fcnRDYXB0aW9uLmhlaWdodDsKLSAgICB9Ci0gIH0KLSAgRlhfRkxPQVQgZldpZHRoID0gcnRVSU1hcmdpbi5sZWZ0ICsgcnRVSU1hcmdpbi53aWR0aDsKLSAgRlhfRkxPQVQgZkhlaWdodCA9IG1fcnRDYXB0aW9uLmhlaWdodCArIHJ0VUlNYXJnaW4udG9wICsgcnRVSU1hcmdpbi5oZWlnaHQ7Ci0gIGlmIChmV2lkdGggPiBydFdpZGdldC53aWR0aCkgewotICAgIG1fcnRVSS53aWR0aCArPSBmV2lkdGggLSBydFdpZGdldC53aWR0aDsKLSAgfQotICBpZiAoZkhlaWdodCA9PSBYRkFfREVGQVVMVFVJX0hFSUdIVCAmJiBtX3J0VUkuaGVpZ2h0IDwgWEZBX01JTlVJX0hFSUdIVCkgewotICAgIG1fcnRVSS5oZWlnaHQgPSBYRkFfTUlOVUlfSEVJR0hUOwotICAgIG1fcnRDYXB0aW9uLnRvcCArPSBydFVJTWFyZ2luLnRvcCArIHJ0VUlNYXJnaW4uaGVpZ2h0OwotICB9IGVsc2UgaWYgKGZIZWlnaHQgPiBydFdpZGdldC5oZWlnaHQpIHsKLSAgICBtX3J0VUkuaGVpZ2h0ICs9IGZIZWlnaHQgLSBydFdpZGdldC5oZWlnaHQ7Ci0gICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tKSB7Ci0gICAgICBtX3J0Q2FwdGlvbi50b3AgKz0gZkhlaWdodCAtIHJ0V2lkZ2V0LmhlaWdodDsKLSAgICB9Ci0gIH0KLX0KLXZvaWQgQ1hGQV9GRkZpZWxkOjpDYXBMZWZ0UmlnaHRQbGFjZW1lbnQoQ1hGQV9DYXB0aW9uIGNhcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNhcFBsYWNlbWVudCkgewotICBDRlhfUmVjdEYgcnRVSU1hcmdpbiA9IG1fcERhdGFBY2MtPkdldFVJTWFyZ2luKCk7Ci0gIG1fcnRDYXB0aW9uLnRvcCArPSBydFVJTWFyZ2luLnRvcDsKLSAgbV9ydENhcHRpb24uaGVpZ2h0IC09IHJ0VUlNYXJnaW4udG9wOwotICBpZiAoQ1hGQV9NYXJnaW4gbWdDYXAgPSBjYXB0aW9uLkdldE1hcmdpbigpKSB7Ci0gICAgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihtX3J0Q2FwdGlvbiwgbWdDYXApOwotICAgIGlmIChtX3J0Q2FwdGlvbi5oZWlnaHQgPCAwKSB7Ci0gICAgICBtX3J0Q2FwdGlvbi50b3AgKz0gbV9ydENhcHRpb24uaGVpZ2h0OwotICAgIH0KLSAgfQotICBGWF9GTE9BVCBmV2lkdGggPSBtX3J0Q2FwdGlvbi53aWR0aCArIHJ0VUlNYXJnaW4ubGVmdCArIHJ0VUlNYXJnaW4ud2lkdGg7Ci0gIEZYX0ZMT0FUIGZIZWlnaHQgPSBydFVJTWFyZ2luLnRvcCArIHJ0VUlNYXJnaW4uaGVpZ2h0OwotICBpZiAoZldpZHRoID4gcnRXaWRnZXQud2lkdGgpIHsKLSAgICBtX3J0VUkud2lkdGggKz0gZldpZHRoIC0gcnRXaWRnZXQud2lkdGg7Ci0gICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQpIHsKLSAgICAgIG1fcnRDYXB0aW9uLmxlZnQgKz0gZldpZHRoIC0gcnRXaWRnZXQud2lkdGg7Ci0gICAgfQotICB9Ci0gIGlmIChmSGVpZ2h0ID09IFhGQV9ERUZBVUxUVUlfSEVJR0hUICYmIG1fcnRVSS5oZWlnaHQgPCBYRkFfTUlOVUlfSEVJR0hUKSB7Ci0gICAgbV9ydFVJLmhlaWdodCA9IFhGQV9NSU5VSV9IRUlHSFQ7Ci0gICAgbV9ydENhcHRpb24udG9wICs9IHJ0VUlNYXJnaW4udG9wICsgcnRVSU1hcmdpbi5oZWlnaHQ7Ci0gIH0gZWxzZSBpZiAoZkhlaWdodCA+IHJ0V2lkZ2V0LmhlaWdodCkgewotICAgIG1fcnRVSS5oZWlnaHQgKz0gZkhlaWdodCAtIHJ0V2lkZ2V0LmhlaWdodDsKLSAgfQotfQotdm9pZCBDWEZBX0ZGRmllbGQ6OlVwZGF0ZUZXTCgpIHsKLSAgaWYgKG1fcE5vcm1hbFdpZGdldCkgewotICAgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7Ci0gIH0KLX0KLXVpbnQzMl90IENYRkFfRkZGaWVsZDo6VXBkYXRlVUlQcm9wZXJ0eSgpIHsKLSAgQ1hGQV9Ob2RlKiBwVWlOb2RlID0gbV9wRGF0YUFjYy0+R2V0VUlDaGlsZCgpOwotICB1aW50MzJfdCBkd1N0eWxlID0gMDsKLSAgaWYgKHBVaU5vZGUgJiYgcFVpTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6RGVmYXVsdFVpKSB7Ci0gICAgZHdTdHlsZSA9IEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHk7Ci0gIH0KLSAgcmV0dXJuIGR3U3R5bGU7Ci19Ci12b2lkIENYRkFfRkZGaWVsZDo6U2V0RldMUmVjdCgpIHsKLSAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ0ZYX1JlY3RGIHJ0VWkgPSBtX3J0VUk7Ci0gIGlmIChydFVpLndpZHRoIDwgMS4wKQotICAgIHJ0VWkud2lkdGggPSAxLjA7Ci0gIGlmICghbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsKLSAgICBGWF9GTE9BVCBmRm9udFNpemUgPSBtX3BEYXRhQWNjLT5HZXRGb250U2l6ZSgpOwotICAgIGlmIChydFVpLmhlaWdodCA8IGZGb250U2l6ZSkgewotICAgICAgcnRVaS5oZWlnaHQgPSBmRm9udFNpemU7Ci0gICAgfQotICB9Ci0gIG1fcE5vcm1hbFdpZGdldC0+U2V0V2lkZ2V0UmVjdChydFVpKTsKLX0KLWJvb2wgQ1hGQV9GRkZpZWxkOjpPbk1vdXNlRW50ZXIoKSB7Ci0gIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIENGV0xfTWVzc2FnZU1vdXNlIG1zKG51bGxwdHIsIG1fcE5vcm1hbFdpZGdldCk7Ci0gIG1zLm1fZHdDbWQgPSBGV0xfTW91c2VDb21tYW5kOjpFbnRlcjsKLSAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOwotICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgQ1hGQV9GRkZpZWxkOjpPbk1vdXNlRXhpdCgpIHsKLSAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQ0ZXTF9NZXNzYWdlTW91c2UgbXMobnVsbHB0ciwgbV9wTm9ybWFsV2lkZ2V0KTsKLSAgbXMubV9kd0NtZCA9IEZXTF9Nb3VzZUNvbW1hbmQ6OkxlYXZlOwotICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1DRlhfUG9pbnRGIENYRkFfRkZGaWVsZDo6RldMVG9DbGllbnQoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgcmV0dXJuIG1fcE5vcm1hbFdpZGdldCA/IHBvaW50IC0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KCkuVG9wTGVmdCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgOiBwb2ludDsKLX0KLQotYm9vbCBDWEZBX0ZGRmllbGQ6Ok9uTEJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAobV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3BlbiB8fAotICAgICAgIW1fcERhdGFBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghUHRJbkFjdGl2ZVJlY3QocG9pbnQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBTZXRCdXR0b25Eb3duKHRydWUpOwotICBDRldMX01lc3NhZ2VNb3VzZSBtcyhudWxscHRyLCBtX3BOb3JtYWxXaWRnZXQpOwotICBtcy5tX2R3Q21kID0gRldMX01vdXNlQ29tbWFuZDo6TGVmdEJ1dHRvbkRvd247Ci0gIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7Ci0gIG1zLm1fcG9zID0gRldMVG9DbGllbnQocG9pbnQpOwotICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENYRkFfRkZGaWVsZDo6T25MQnV0dG9uVXAodWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoIUlzQnV0dG9uRG93bigpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBTZXRCdXR0b25Eb3duKGZhbHNlKTsKLSAgQ0ZXTF9NZXNzYWdlTW91c2UgbXMobnVsbHB0ciwgbV9wTm9ybWFsV2lkZ2V0KTsKLSAgbXMubV9kd0NtZCA9IEZXTF9Nb3VzZUNvbW1hbmQ6OkxlZnRCdXR0b25VcDsKLSAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsKLSAgbXMubV9wb3MgPSBGV0xUb0NsaWVudChwb2ludCk7Ci0gIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1hGQV9GRkZpZWxkOjpPbkxCdXR0b25EYmxDbGsodWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENGV0xfTWVzc2FnZU1vdXNlIG1zKG51bGxwdHIsIG1fcE5vcm1hbFdpZGdldCk7Ci0gIG1zLm1fZHdDbWQgPSBGV0xfTW91c2VDb21tYW5kOjpMZWZ0QnV0dG9uRGJsQ2xrOwotICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOwotICBtcy5tX3BvcyA9IEZXTFRvQ2xpZW50KHBvaW50KTsKLSAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDWEZBX0ZGRmllbGQ6Ok9uTW91c2VNb3ZlKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIGlmICghbV9wTm9ybWFsV2lkZ2V0KQotICAgIHJldHVybiBmYWxzZTsKLQotICBDRldMX01lc3NhZ2VNb3VzZSBtcyhudWxscHRyLCBtX3BOb3JtYWxXaWRnZXQpOwotICBtcy5tX2R3Q21kID0gRldMX01vdXNlQ29tbWFuZDo6TW92ZTsKLSAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsKLSAgbXMubV9wb3MgPSBGV0xUb0NsaWVudChwb2ludCk7Ci0gIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1hGQV9GRkZpZWxkOjpPbk1vdXNlV2hlZWwodWludDMyX3QgZHdGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCB6RGVsdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIGlmICghbV9wTm9ybWFsV2lkZ2V0KQotICAgIHJldHVybiBmYWxzZTsKLQotICBDRldMX01lc3NhZ2VNb3VzZVdoZWVsIG1zKG51bGxwdHIsIG1fcE5vcm1hbFdpZGdldCk7Ci0gIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7Ci0gIG1zLm1fcG9zID0gRldMVG9DbGllbnQocG9pbnQpOwotICBtcy5tX2RlbHRhID0gQ0ZYX1BvaW50Rih6RGVsdGEsIDApOwotICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENYRkFfRkZGaWVsZDo6T25SQnV0dG9uRG93bih1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewotICBpZiAoIW1fcE5vcm1hbFdpZGdldCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuIHx8Ci0gICAgICAhbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFQdEluQWN0aXZlUmVjdChwb2ludCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIFNldEJ1dHRvbkRvd24odHJ1ZSk7Ci0KLSAgQ0ZXTF9NZXNzYWdlTW91c2UgbXMobnVsbHB0ciwgbV9wTm9ybWFsV2lkZ2V0KTsKLSAgbXMubV9kd0NtZCA9IEZXTF9Nb3VzZUNvbW1hbmQ6OlJpZ2h0QnV0dG9uRG93bjsKLSAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsKLSAgbXMubV9wb3MgPSBGV0xUb0NsaWVudChwb2ludCk7Ci0gIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1hGQV9GRkZpZWxkOjpPblJCdXR0b25VcCh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewotICBpZiAoIW1fcE5vcm1hbFdpZGdldCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghSXNCdXR0b25Eb3duKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIFNldEJ1dHRvbkRvd24oZmFsc2UpOwotICBDRldMX01lc3NhZ2VNb3VzZSBtcyhudWxscHRyLCBtX3BOb3JtYWxXaWRnZXQpOwotICBtcy5tX2R3Q21kID0gRldMX01vdXNlQ29tbWFuZDo6UmlnaHRCdXR0b25VcDsKLSAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsKLSAgbXMubV9wb3MgPSBGV0xUb0NsaWVudChwb2ludCk7Ci0gIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1hGQV9GRkZpZWxkOjpPblJCdXR0b25EYmxDbGsodWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENGV0xfTWVzc2FnZU1vdXNlIG1zKG51bGxwdHIsIG1fcE5vcm1hbFdpZGdldCk7Ci0gIG1zLm1fZHdDbWQgPSBGV0xfTW91c2VDb21tYW5kOjpSaWdodEJ1dHRvbkRibENsazsKLSAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsKLSAgbXMubV9wb3MgPSBGV0xUb0NsaWVudChwb2ludCk7Ci0gIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1hGQV9GRkZpZWxkOjpPblNldEZvY3VzKENYRkFfRkZXaWRnZXQqIHBPbGRXaWRnZXQpIHsKLSAgQ1hGQV9GRldpZGdldDo6T25TZXRGb2N1cyhwT2xkV2lkZ2V0KTsKLSAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQ0ZXTF9NZXNzYWdlU2V0Rm9jdXMgbXMobnVsbHB0ciwgbV9wTm9ybWFsV2lkZ2V0KTsKLSAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOwotICBtX2R3U3RhdHVzIHw9IFhGQV9XaWRnZXRTdGF0dXNfRm9jdXNlZDsKLSAgQWRkSW52YWxpZGF0ZVJlY3QoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci1ib29sIENYRkFfRkZGaWVsZDo6T25LaWxsRm9jdXMoQ1hGQV9GRldpZGdldCogcE5ld1dpZGdldCkgewotICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgewotICAgIHJldHVybiBDWEZBX0ZGV2lkZ2V0OjpPbktpbGxGb2N1cyhwTmV3V2lkZ2V0KTsKLSAgfQotICBDRldMX01lc3NhZ2VLaWxsRm9jdXMgbXMobnVsbHB0ciwgbV9wTm9ybWFsV2lkZ2V0KTsKLSAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOwotICBtX2R3U3RhdHVzICY9IH5YRkFfV2lkZ2V0U3RhdHVzX0ZvY3VzZWQ7Ci0gIEFkZEludmFsaWRhdGVSZWN0KCk7Ci0gIENYRkFfRkZXaWRnZXQ6Ok9uS2lsbEZvY3VzKHBOZXdXaWRnZXQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgQ1hGQV9GRkZpZWxkOjpPbktleURvd24odWludDMyX3QgZHdLZXlDb2RlLCB1aW50MzJfdCBkd0ZsYWdzKSB7Ci0gIGlmICghbV9wTm9ybWFsV2lkZ2V0IHx8ICFtX3BEYXRhQWNjLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBDRldMX01lc3NhZ2VLZXkgbXMobnVsbHB0ciwgbV9wTm9ybWFsV2lkZ2V0KTsKLSAgbXMubV9kd0NtZCA9IEZXTF9LZXlDb21tYW5kOjpLZXlEb3duOwotICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOwotICBtcy5tX2R3S2V5Q29kZSA9IGR3S2V5Q29kZTsKLSAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOwotICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgQ1hGQV9GRkZpZWxkOjpPbktleVVwKHVpbnQzMl90IGR3S2V5Q29kZSwgdWludDMyX3QgZHdGbGFncykgewotICBpZiAoIW1fcE5vcm1hbFdpZGdldCB8fCAhbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQ0ZXTF9NZXNzYWdlS2V5IG1zKG51bGxwdHIsIG1fcE5vcm1hbFdpZGdldCk7Ci0gIG1zLm1fZHdDbWQgPSBGV0xfS2V5Q29tbWFuZDo6S2V5VXA7Ci0gIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7Ci0gIG1zLm1fZHdLZXlDb2RlID0gZHdLZXlDb2RlOwotICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDWEZBX0ZGRmllbGQ6Ok9uQ2hhcih1aW50MzJfdCBkd0NoYXIsIHVpbnQzMl90IGR3RmxhZ3MpIHsKLSAgaWYgKCFtX3BEYXRhQWNjLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoZHdDaGFyID09IEZXTF9WS0VZX1RhYikgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIENGV0xfTWVzc2FnZUtleSBtcyhudWxscHRyLCBtX3BOb3JtYWxXaWRnZXQpOwotICBtcy5tX2R3Q21kID0gRldMX0tleUNvbW1hbmQ6OkNoYXI7Ci0gIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7Ci0gIG1zLm1fZHdLZXlDb2RlID0gZHdDaGFyOwotICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7Ci0gIHJldHVybiB0cnVlOwotfQotRldMX1dpZGdldEhpdCBDWEZBX0ZGRmllbGQ6Ok9uSGl0VGVzdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewotICBpZiAobV9wTm9ybWFsV2lkZ2V0ICYmCi0gICAgICBtX3BOb3JtYWxXaWRnZXQtPkhpdFRlc3QoRldMVG9DbGllbnQocG9pbnQpKSAhPSBGV0xfV2lkZ2V0SGl0OjpVbmtub3duKSB7Ci0gICAgcmV0dXJuIEZXTF9XaWRnZXRIaXQ6OkNsaWVudDsKLSAgfQotCi0gIGlmICghR2V0UmVjdFdpdGhvdXRSb3RhdGUoKS5Db250YWlucyhwb2ludCkpCi0gICAgcmV0dXJuIEZXTF9XaWRnZXRIaXQ6OlVua25vd247Ci0gIGlmIChtX3J0Q2FwdGlvbi5Db250YWlucyhwb2ludCkpCi0gICAgcmV0dXJuIEZXTF9XaWRnZXRIaXQ6OlRpdGxlYmFyOwotICByZXR1cm4gRldMX1dpZGdldEhpdDo6Qm9yZGVyOwotfQotCi1ib29sIENYRkFfRkZGaWVsZDo6T25TZXRDdXJzb3IoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1hGQV9GRkZpZWxkOjpQdEluQWN0aXZlUmVjdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewotICByZXR1cm4gbV9wTm9ybWFsV2lkZ2V0ICYmIG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0UmVjdCgpLkNvbnRhaW5zKHBvaW50KTsKLX0KLQotdm9pZCBDWEZBX0ZGRmllbGQ6OkxheW91dENhcHRpb24oKSB7Ci0gIENYRkFfVGV4dExheW91dCogcENhcFRleHRMYXlvdXQgPSBtX3BEYXRhQWNjLT5HZXRDYXB0aW9uVGV4dExheW91dCgpOwotICBpZiAoIXBDYXBUZXh0TGF5b3V0KQotICAgIHJldHVybjsKLQotICBGWF9GTE9BVCBmSGVpZ2h0ID0gMDsKLSAgcENhcFRleHRMYXlvdXQtPkxheW91dChDRlhfU2l6ZUYobV9ydENhcHRpb24ud2lkdGgsIG1fcnRDYXB0aW9uLmhlaWdodCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgJmZIZWlnaHQpOwotICBpZiAobV9ydENhcHRpb24uaGVpZ2h0IDwgZkhlaWdodCkKLSAgICBtX3J0Q2FwdGlvbi5oZWlnaHQgPSBmSGVpZ2h0OwotfQotCi12b2lkIENYRkFfRkZGaWVsZDo6UmVuZGVyQ2FwdGlvbihDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBDWEZBX1RleHRMYXlvdXQqIHBDYXBUZXh0TGF5b3V0ID0gbV9wRGF0YUFjYy0+R2V0Q2FwdGlvblRleHRMYXlvdXQoKTsKLSAgaWYgKCFwQ2FwVGV4dExheW91dCkKLSAgICByZXR1cm47Ci0KLSAgQ1hGQV9DYXB0aW9uIGNhcHRpb24gPSBtX3BEYXRhQWNjLT5HZXRDYXB0aW9uKCk7Ci0gIGlmICghY2FwdGlvbiB8fCBjYXB0aW9uLkdldFByZXNlbmNlKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKCFwQ2FwVGV4dExheW91dC0+SXNMb2FkZWQoKSkKLSAgICBwQ2FwVGV4dExheW91dC0+TGF5b3V0KENGWF9TaXplRihtX3J0Q2FwdGlvbi53aWR0aCwgbV9ydENhcHRpb24uaGVpZ2h0KSk7Ci0KLSAgQ0ZYX1JlY3RGIHJ0Q2xpcCA9IG1fcnRDYXB0aW9uOwotICBydENsaXAuSW50ZXJzZWN0KEdldFJlY3RXaXRob3V0Um90YXRlKCkpOwotICBDRlhfUmVuZGVyRGV2aWNlKiBwUmVuZGVyRGV2aWNlID0gcEdTLT5HZXRSZW5kZXJEZXZpY2UoKTsKLSAgQ0ZYX01hdHJpeCBtdCgxLCAwLCAwLCAxLCBtX3J0Q2FwdGlvbi5sZWZ0LCBtX3J0Q2FwdGlvbi50b3ApOwotICBpZiAocE1hdHJpeCkgewotICAgIHBNYXRyaXgtPlRyYW5zZm9ybVJlY3QocnRDbGlwKTsKLSAgICBtdC5Db25jYXQoKnBNYXRyaXgpOwotICB9Ci0gIHBDYXBUZXh0TGF5b3V0LT5EcmF3U3RyaW5nKHBSZW5kZXJEZXZpY2UsIG10LCBydENsaXApOwotfQotCi1ib29sIENYRkFfRkZGaWVsZDo6UHJvY2Vzc0NvbW1pdHRlZERhdGEoKSB7Ci0gIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCFJc0RhdGFDaGFuZ2VkKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoQ2FsY3VsYXRlT3ZlcnJpZGUoKSAhPSAxKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCFDb21taXREYXRhKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG1fcERvY1ZpZXctPlNldENoYW5nZU1hcmsoKTsKLSAgbV9wRG9jVmlldy0+QWRkVmFsaWRhdGVXaWRnZXQobV9wRGF0YUFjYyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1pbnQzMl90IENYRkFfRkZGaWVsZDo6Q2FsY3VsYXRlT3ZlcnJpZGUoKSB7Ci0gIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gbV9wRGF0YUFjYy0+R2V0RXhjbEdyb3VwKCk7Ci0gIGlmICghcEFjYykgewotICAgIHJldHVybiBDYWxjdWxhdGVXaWRnZXRBY2MobV9wRGF0YUFjYyk7Ci0gIH0KLSAgaWYgKENhbGN1bGF0ZVdpZGdldEFjYyhwQWNjKSA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBBY2MtPkdldEV4Y2xHcm91cEZpcnN0TWVtYmVyKCk7Ci0gIGlmICghcE5vZGUpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IG51bGxwdHI7Ci0gIHdoaWxlIChwTm9kZSkgewotICAgIHBXaWRnZXRBY2MgPSBzdGF0aWNfY2FzdDxDWEZBX1dpZGdldEFjYyo+KHBOb2RlLT5HZXRXaWRnZXREYXRhKCkpOwotICAgIGlmICghcFdpZGdldEFjYykgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChDYWxjdWxhdGVXaWRnZXRBY2MocFdpZGdldEFjYykgPT0gMCkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHBOb2RlID0gcFdpZGdldEFjYy0+R2V0RXhjbEdyb3VwTmV4dE1lbWJlcihwTm9kZSk7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci1pbnQzMl90IENYRkFfRkZGaWVsZDo6Q2FsY3VsYXRlV2lkZ2V0QWNjKENYRkFfV2lkZ2V0QWNjKiBwQWNjKSB7Ci0gIENYRkFfQ2FsY3VsYXRlIGNhbGMgPSBwQWNjLT5HZXRDYWxjdWxhdGUoKTsKLSAgaWYgKCFjYWxjKSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgWEZBX1ZFUlNJT04gdmVyc2lvbiA9IHBBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+R2V0Q3VyVmVyc2lvbk1vZGUoKTsKLSAgaWYgKGNhbGMpIHsKLSAgICBpbnQzMl90IGlPdmVycmlkZSA9IGNhbGMuR2V0T3ZlcnJpZGUoKTsKLSAgICBzd2l0Y2ggKGlPdmVycmlkZSkgewotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9FcnJvcjogewotICAgICAgICBpZiAodmVyc2lvbiA8PSBYRkFfVkVSU0lPTl8yMDQpIHsKLSAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotICAgICAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBHZXRBcHAoKS0+R2V0QXBwUHJvdmlkZXIoKTsKLSAgICAgICAgaWYgKHBBcHBQcm92aWRlcikgewotICAgICAgICAgIHBBcHBQcm92aWRlci0+TXNnQm94KEwiWW91IGFyZSBub3QgYWxsb3dlZCB0byBtb2RpZnkgdGhpcyBmaWVsZC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiQ2FsY3VsYXRlIE92ZXJyaWRlIiwgWEZBX01CSUNPTl9XYXJuaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9NQl9PSyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1dhcm5pbmc6IHsKLSAgICAgICAgaWYgKHZlcnNpb24gPD0gWEZBX1ZFUlNJT05fMjA0KSB7Ci0gICAgICAgICAgQ1hGQV9TY3JpcHQgc2NyaXB0ID0gY2FsYy5HZXRTY3JpcHQoKTsKLSAgICAgICAgICBpZiAoIXNjcmlwdCkgewotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgfQotICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsKLSAgICAgICAgICBzY3JpcHQuR2V0RXhwcmVzc2lvbih3c0V4cHJlc3Npb24pOwotICAgICAgICAgIGlmICh3c0V4cHJlc3Npb24uSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBBY2MtPkdldE5vZGUoKS0+SXNVc2VySW50ZXJhY3RpdmUoKSkKLSAgICAgICAgICByZXR1cm4gMTsKLQotICAgICAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBHZXRBcHAoKS0+R2V0QXBwUHJvdmlkZXIoKTsKLSAgICAgICAgaWYgKHBBcHBQcm92aWRlcikgewotICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZTsKLSAgICAgICAgICBjYWxjLkdldE1lc3NhZ2VUZXh0KHdzTWVzc2FnZSk7Ci0gICAgICAgICAgaWYgKCF3c01lc3NhZ2UuSXNFbXB0eSgpKQotICAgICAgICAgICAgd3NNZXNzYWdlICs9IEwiXHJcbiI7Ci0gICAgICAgICAgd3NNZXNzYWdlICs9IEwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIG1vZGlmeSB0aGlzIGZpZWxkPyI7Ci0gICAgICAgICAgaWYgKHBBcHBQcm92aWRlci0+TXNnQm94KHdzTWVzc2FnZSwgTCJDYWxjdWxhdGUgT3ZlcnJpZGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTUJJQ09OX1dhcm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9NQl9ZZXNObykgPT0gWEZBX0lEWWVzKSB7Ci0gICAgICAgICAgICBwQWNjLT5HZXROb2RlKCktPlNldEZsYWcoWEZBX05vZGVGbGFnX1VzZXJJbnRlcmFjdGl2ZSwgZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuIDE7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9JZ25vcmU6Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EaXNhYmxlZDoKLSAgICAgICAgcEFjYy0+R2V0Tm9kZSgpLT5TZXRGbGFnKFhGQV9Ob2RlRmxhZ19Vc2VySW50ZXJhY3RpdmUsIGZhbHNlKTsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotICByZXR1cm4gMTsKLX0KLWJvb2wgQ1hGQV9GRkZpZWxkOjpDb21taXREYXRhKCkgewotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIENYRkFfRkZGaWVsZDo6SXNEYXRhQ2hhbmdlZCgpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotdm9pZCBDWEZBX0ZGRmllbGQ6OlRyYW5zbGF0ZUZXTE1lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgewotICBHZXRBcHAoKS0+R2V0V2lkZ2V0TWdyRGVsZWdhdGUoKS0+T25Qcm9jZXNzTWVzc2FnZVRvRm9ybShwTWVzc2FnZSk7Ci19Ci12b2lkIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7fQotCi12b2lkIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSB7Ci0gIHN3aXRjaCAocEV2ZW50LT5HZXRUeXBlKCkpIHsKLSAgICBjYXNlIENGV0xfRXZlbnQ6OlR5cGU6Ok1vdXNlOiB7Ci0gICAgICBDRldMX0V2ZW50TW91c2UqIGV2ZW50ID0gKENGV0xfRXZlbnRNb3VzZSopcEV2ZW50OwotICAgICAgaWYgKGV2ZW50LT5tX2R3Q21kID09IEZXTF9Nb3VzZUNvbW1hbmQ6OkVudGVyKSB7Ci0gICAgICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07Ci0gICAgICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX01vdXNlRW50ZXI7Ci0gICAgICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOwotICAgICAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fTW91c2VFbnRlciwgJmVQYXJhbSk7Ci0gICAgICB9IGVsc2UgaWYgKGV2ZW50LT5tX2R3Q21kID09IEZXTF9Nb3VzZUNvbW1hbmQ6OkxlYXZlKSB7Ci0gICAgICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07Ci0gICAgICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX01vdXNlRXhpdDsKLSAgICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7Ci0gICAgICAgIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZUV4aXQsICZlUGFyYW0pOwotICAgICAgfSBlbHNlIGlmIChldmVudC0+bV9kd0NtZCA9PSBGV0xfTW91c2VDb21tYW5kOjpMZWZ0QnV0dG9uRG93bikgewotICAgICAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOwotICAgICAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9Nb3VzZURvd247Ci0gICAgICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOwotICAgICAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fTW91c2VEb3duLCAmZVBhcmFtKTsKLSAgICAgIH0gZWxzZSBpZiAoZXZlbnQtPm1fZHdDbWQgPT0gRldMX01vdXNlQ29tbWFuZDo6TGVmdEJ1dHRvblVwKSB7Ci0gICAgICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07Ci0gICAgICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX01vdXNlVXA7Ci0gICAgICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOwotICAgICAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fTW91c2VVcCwgJmVQYXJhbSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBDRldMX0V2ZW50OjpUeXBlOjpDbGljazogewotICAgICAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsKLSAgICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX0NsaWNrOwotICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7Ci0gICAgICBtX3BEYXRhQWNjLT5Qcm9jZXNzRXZlbnQoWEZBX0FUVFJJQlVURUVOVU1fQ2xpY2ssICZlUGFyYW0pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIENYRkFfRkZGaWVsZDo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4KSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL3hmYV9mZmZpZWxkLmggYi94ZmEvZnhmYS9hcHAveGZhX2ZmZmllbGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwY2U2MS4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAveGZhX2ZmZmllbGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhGQV9BUFBfWEZBX0ZGRklFTERfSF8KLSNkZWZpbmUgWEZBX0ZYRkFfQVBQX1hGQV9GRkZJRUxEX0hfCi0KLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfd2lkZ2V0LmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9pZndsX3dpZGdldGRlbGVnYXRlLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmcGFnZXZpZXcuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZ3aWRnZXQuaCIKLQotI2RlZmluZSBYRkFfTUlOVUlfSEVJR0hUIDQuMzJmCi0jZGVmaW5lIFhGQV9ERUZBVUxUVUlfSEVJR0hUIDIuMGYKLQotY2xhc3MgQ1hGQV9GRkZpZWxkIDogcHVibGljIENYRkFfRkZXaWRnZXQsIHB1YmxpYyBJRldMX1dpZGdldERlbGVnYXRlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfRkZGaWVsZChDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpOwotICB+Q1hGQV9GRkZpZWxkKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ1hGQV9GRldpZGdldAotICBDRlhfUmVjdEYgR2V0QkJveCh1aW50MzJfdCBkd1N0YXR1cywgYm9vbCBiRHJhd0ZvY3VzID0gZmFsc2UpIG92ZXJyaWRlOwotICB2b2lkIFJlbmRlcldpZGdldChDRlhfR3JhcGhpY3MqIHBHUywKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGF0dXMpIG92ZXJyaWRlOwotICBib29sIElzTG9hZGVkKCkgb3ZlcnJpZGU7Ci0gIGJvb2wgTG9hZFdpZGdldCgpIG92ZXJyaWRlOwotICB2b2lkIFVubG9hZFdpZGdldCgpIG92ZXJyaWRlOwotICBib29sIFBlcmZvcm1MYXlvdXQoKSBvdmVycmlkZTsKLSAgYm9vbCBPbk1vdXNlRW50ZXIoKSBvdmVycmlkZTsKLSAgYm9vbCBPbk1vdXNlRXhpdCgpIG92ZXJyaWRlOwotICBib29sIE9uTEJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOwotICBib29sIE9uTEJ1dHRvblVwKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKLSAgYm9vbCBPbkxCdXR0b25EYmxDbGsodWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOwotICBib29sIE9uTW91c2VNb3ZlKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKLSAgYm9vbCBPbk1vdXNlV2hlZWwodWludDMyX3QgZHdGbGFncywKLSAgICAgICAgICAgICAgICAgICAgaW50MTZfdCB6RGVsdGEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKLSAgYm9vbCBPblJCdXR0b25Eb3duKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKLSAgYm9vbCBPblJCdXR0b25VcCh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7Ci0gIGJvb2wgT25SQnV0dG9uRGJsQ2xrKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKLQotICBib29sIE9uU2V0Rm9jdXMoQ1hGQV9GRldpZGdldCogcE9sZFdpZGdldCkgb3ZlcnJpZGU7Ci0gIGJvb2wgT25LaWxsRm9jdXMoQ1hGQV9GRldpZGdldCogcE5ld1dpZGdldCkgb3ZlcnJpZGU7Ci0gIGJvb2wgT25LZXlEb3duKHVpbnQzMl90IGR3S2V5Q29kZSwgdWludDMyX3QgZHdGbGFncykgb3ZlcnJpZGU7Ci0gIGJvb2wgT25LZXlVcCh1aW50MzJfdCBkd0tleUNvZGUsIHVpbnQzMl90IGR3RmxhZ3MpIG92ZXJyaWRlOwotICBib29sIE9uQ2hhcih1aW50MzJfdCBkd0NoYXIsIHVpbnQzMl90IGR3RmxhZ3MpIG92ZXJyaWRlOwotICBGV0xfV2lkZ2V0SGl0IE9uSGl0VGVzdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7Ci0gIGJvb2wgT25TZXRDdXJzb3IoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOwotCi0gIC8vIElGV0xfV2lkZ2V0RGVsZWdhdGUKLSAgdm9pZCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIG92ZXJyaWRlOwotICB2b2lkIE9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwTWF0cml4ID0gbnVsbHB0cikgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBVcGRhdGVGV0woKTsKLSAgdWludDMyX3QgVXBkYXRlVUlQcm9wZXJ0eSgpOwotCi0gcHJvdGVjdGVkOgotICBib29sIFB0SW5BY3RpdmVSZWN0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKLQotICB2aXJ0dWFsIHZvaWQgU2V0RldMUmVjdCgpOwotICB2b2lkIFNldEZXTFRoZW1lUHJvdmlkZXIoKTsKLSAgQ0ZXTF9XaWRnZXQqIEdldE5vcm1hbFdpZGdldCgpIHsgcmV0dXJuIG1fcE5vcm1hbFdpZGdldDsgfQotICBDRlhfUG9pbnRGIEZXTFRvQ2xpZW50KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKLSAgdm9pZCBMYXlvdXRDYXB0aW9uKCk7Ci0gIHZvaWQgUmVuZGVyQ2FwdGlvbihDRlhfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IG51bGxwdHIpOwotCi0gIGludDMyX3QgQ2FsY3VsYXRlT3ZlcnJpZGUoKTsKLSAgaW50MzJfdCBDYWxjdWxhdGVXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIHBBY2MpOwotICBib29sIFByb2Nlc3NDb21taXR0ZWREYXRhKCk7Ci0gIHZpcnR1YWwgYm9vbCBDb21taXREYXRhKCk7Ci0gIHZpcnR1YWwgYm9vbCBJc0RhdGFDaGFuZ2VkKCk7Ci0gIHZvaWQgRHJhd0hpZ2hsaWdodChDRlhfR3JhcGhpY3MqIHBHUywKLSAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkVsbGlwc2UgPSBmYWxzZSk7Ci0gIHZvaWQgRHJhd0ZvY3VzKENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4KTsKLSAgdm9pZCBUcmFuc2xhdGVGV0xNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpOwotICB2b2lkIENhcFBsYWNlbWVudCgpOwotICB2b2lkIENhcFRvcEJvdHRvbVBsYWNlbWVudChDWEZBX0NhcHRpb24gY2FwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ2FwUGxhY2VtZW50KTsKLSAgdm9pZCBDYXBMZWZ0UmlnaHRQbGFjZW1lbnQoQ1hGQV9DYXB0aW9uIGNhcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNhcFBsYWNlbWVudCk7Ci0gIHZvaWQgU2V0RWRpdFNjcm9sbE9mZnNldCgpOwotCi0gIENGV0xfV2lkZ2V0KiBtX3BOb3JtYWxXaWRnZXQ7Ci0gIENGWF9SZWN0RiBtX3J0VUk7Ci0gIENGWF9SZWN0RiBtX3J0Q2FwdGlvbjsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYRkFfQVBQX1hGQV9GRkZJRUxEX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAveGZhX2ZmaW1hZ2UuY3BwIGIveGZhL2Z4ZmEvYXBwL3hmYV9mZmltYWdlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYxMzIyMS4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAveGZhX2ZmaW1hZ2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZmltYWdlLmgiCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmZHJhdy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmFwcC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmRvYy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZnBhZ2V2aWV3LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0LmgiCi0KLUNYRkFfRkZJbWFnZTo6Q1hGQV9GRkltYWdlKENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykgOiBDWEZBX0ZGRHJhdyhwRGF0YUFjYykge30KLQotQ1hGQV9GRkltYWdlOjp+Q1hGQV9GRkltYWdlKCkgewotICBDWEZBX0ZGSW1hZ2U6OlVubG9hZFdpZGdldCgpOwotfQotCi1ib29sIENYRkFfRkZJbWFnZTo6SXNMb2FkZWQoKSB7Ci0gIHJldHVybiAhIUdldERhdGFBY2MoKS0+R2V0SW1hZ2VJbWFnZSgpOwotfQotYm9vbCBDWEZBX0ZGSW1hZ2U6OkxvYWRXaWRnZXQoKSB7Ci0gIGlmIChHZXREYXRhQWNjKCktPkdldEltYWdlSW1hZ2UoKSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIEdldERhdGFBY2MoKS0+TG9hZEltYWdlSW1hZ2UoKTsKLSAgcmV0dXJuIENYRkFfRkZEcmF3OjpMb2FkV2lkZ2V0KCk7Ci19Ci12b2lkIENYRkFfRkZJbWFnZTo6VW5sb2FkV2lkZ2V0KCkgewotICBHZXREYXRhQWNjKCktPlNldEltYWdlSW1hZ2UobnVsbHB0cik7Ci19Ci12b2lkIENYRkFfRkZJbWFnZTo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cykgewotICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkKLSAgICByZXR1cm47Ci0KLSAgQ0ZYX01hdHJpeCBtdFJvdGF0ZSA9IEdldFJvdGF0ZU1hdHJpeCgpOwotICBpZiAocE1hdHJpeCkKLSAgICBtdFJvdGF0ZS5Db25jYXQoKnBNYXRyaXgpOwotCi0gIENYRkFfRkZXaWRnZXQ6OlJlbmRlcldpZGdldChwR1MsICZtdFJvdGF0ZSwgZHdTdGF0dXMpOwotCi0gIENGWF9ESUJpdG1hcCogcERJQml0bWFwID0gR2V0RGF0YUFjYygpLT5HZXRJbWFnZUltYWdlKCk7Ci0gIGlmICghcERJQml0bWFwKQotICAgIHJldHVybjsKLQotICBDRlhfUmVjdEYgcnRJbWFnZSA9IEdldFJlY3RXaXRob3V0Um90YXRlKCk7Ci0gIGlmIChDWEZBX01hcmdpbiBtZ1dpZGdldCA9IG1fcERhdGFBY2MtPkdldE1hcmdpbigpKQotICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4ocnRJbWFnZSwgbWdXaWRnZXQpOwotCi0gIGludDMyX3QgaUhvcnpBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ7Ci0gIGludDMyX3QgaVZlcnRBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX1RvcDsKLSAgaWYgKENYRkFfUGFyYSBwYXJhID0gbV9wRGF0YUFjYy0+R2V0UGFyYSgpKSB7Ci0gICAgaUhvcnpBbGlnbiA9IHBhcmEuR2V0SG9yaXpvbnRhbEFsaWduKCk7Ci0gICAgaVZlcnRBbGlnbiA9IHBhcmEuR2V0VmVydGljYWxBbGlnbigpOwotICB9Ci0KLSAgQ1hGQV9WYWx1ZSB2YWx1ZSA9IG1fcERhdGFBY2MtPkdldEZvcm1WYWx1ZSgpOwotICBDWEZBX0ltYWdlIGltYWdlT2JqID0gdmFsdWUuR2V0SW1hZ2UoKTsKLSAgaW50MzJfdCBpQXNwZWN0ID0gaW1hZ2VPYmouR2V0QXNwZWN0KCk7Ci0gIGludDMyX3QgaUltYWdlWERwaSA9IDA7Ci0gIGludDMyX3QgaUltYWdlWURwaSA9IDA7Ci0gIG1fcERhdGFBY2MtPkdldEltYWdlRHBpKGlJbWFnZVhEcGksIGlJbWFnZVlEcGkpOwotICBYRkFfRHJhd0ltYWdlKHBHUywgcnRJbWFnZSwgJm10Um90YXRlLCBwRElCaXRtYXAsIGlBc3BlY3QsIGlJbWFnZVhEcGksCi0gICAgICAgICAgICAgICAgaUltYWdlWURwaSwgaUhvcnpBbGlnbiwgaVZlcnRBbGlnbik7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAveGZhX2ZmaW1hZ2UuaCBiL3hmYS9meGZhL2FwcC94ZmFfZmZpbWFnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzQyNzkxLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfZmZpbWFnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEZBX0FQUF9YRkFfRkZJTUFHRV9IXwotI2RlZmluZSBYRkFfRlhGQV9BUFBfWEZBX0ZGSU1BR0VfSF8KLQotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZkcmF3LmgiCi0KLWNsYXNzIENYRkFfRkZJbWFnZSA6IHB1YmxpYyBDWEZBX0ZGRHJhdyB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDWEZBX0ZGSW1hZ2UoQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsKLSAgfkNYRkFfRkZJbWFnZSgpIG92ZXJyaWRlOwotCi0gIC8vIENYRkFfRkZXaWRnZXQKLSAgdm9pZCBSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsCi0gICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSBvdmVycmlkZTsKLSAgYm9vbCBJc0xvYWRlZCgpIG92ZXJyaWRlOwotICBib29sIExvYWRXaWRnZXQoKSBvdmVycmlkZTsKLSAgdm9pZCBVbmxvYWRXaWRnZXQoKSBvdmVycmlkZTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYRkFfQVBQX1hGQV9GRklNQUdFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAveGZhX2ZmaW1hZ2VlZGl0LmNwcCBiL3hmYS9meGZhL2FwcC94ZmFfZmZpbWFnZWVkaXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWQyOWVlLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfZmZpbWFnZWVkaXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZpbWFnZWVkaXQuaCIKLQotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9hcHAuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfbWVzc2FnZW1vdXNlLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX25vdGVkcml2ZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfcGljdHVyZWJveC5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZmaWVsZC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmRvYy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmRvY3ZpZXcuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZwYWdldmlldy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZndpZGdldC5oIgotCi1DWEZBX0ZGSW1hZ2VFZGl0OjpDWEZBX0ZGSW1hZ2VFZGl0KENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykKLSAgICA6IENYRkFfRkZGaWVsZChwRGF0YUFjYyksIG1fcE9sZERlbGVnYXRlKG51bGxwdHIpIHt9Ci0KLUNYRkFfRkZJbWFnZUVkaXQ6On5DWEZBX0ZGSW1hZ2VFZGl0KCkgewotICBDWEZBX0ZGSW1hZ2VFZGl0OjpVbmxvYWRXaWRnZXQoKTsKLX0KLQotYm9vbCBDWEZBX0ZGSW1hZ2VFZGl0OjpMb2FkV2lkZ2V0KCkgewotICBDRldMX1BpY3R1cmVCb3gqIHBQaWN0dXJlQm94ID0gbmV3IENGV0xfUGljdHVyZUJveChHZXRGV0xBcHAoKSk7Ci0gIG1fcE5vcm1hbFdpZGdldCA9IHBQaWN0dXJlQm94OwotICBtX3BOb3JtYWxXaWRnZXQtPlNldExheW91dEl0ZW0odGhpcyk7Ci0KLSAgQ0ZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9Ci0gICAgICBtX3BOb3JtYWxXaWRnZXQtPkdldE93bmVyQXBwKCktPkdldE5vdGVEcml2ZXIoKTsKLSAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQobV9wTm9ybWFsV2lkZ2V0LCBtX3BOb3JtYWxXaWRnZXQpOwotCi0gIG1fcE9sZERlbGVnYXRlID0gcFBpY3R1cmVCb3gtPkdldERlbGVnYXRlKCk7Ci0gIHBQaWN0dXJlQm94LT5TZXREZWxlZ2F0ZSh0aGlzKTsKLQotICBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsKLSAgaWYgKG1fcERhdGFBY2MtPkdldEltYWdlRWRpdEltYWdlKCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBVcGRhdGVGV0xEYXRhKCk7Ci0gIHJldHVybiB0cnVlOwotfQotdm9pZCBDWEZBX0ZGSW1hZ2VFZGl0OjpVbmxvYWRXaWRnZXQoKSB7Ci0gIG1fcERhdGFBY2MtPlNldEltYWdlRWRpdEltYWdlKG51bGxwdHIpOwotICBDWEZBX0ZGRmllbGQ6OlVubG9hZFdpZGdldCgpOwotfQotdm9pZCBDWEZBX0ZGSW1hZ2VFZGl0OjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGF0dXMpIHsKLSAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpCi0gICAgcmV0dXJuOwotCi0gIENGWF9NYXRyaXggbXRSb3RhdGUgPSBHZXRSb3RhdGVNYXRyaXgoKTsKLSAgaWYgKHBNYXRyaXgpCi0gICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsKLQotICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzKTsKLSAgQ1hGQV9Cb3JkZXIgYm9yZGVyVUkgPSBtX3BEYXRhQWNjLT5HZXRVSUJvcmRlcigpOwotICBEcmF3Qm9yZGVyKHBHUywgYm9yZGVyVUksIG1fcnRVSSwgJm10Um90YXRlKTsKLSAgUmVuZGVyQ2FwdGlvbihwR1MsICZtdFJvdGF0ZSk7Ci0gIENGWF9ESUJpdG1hcCogcERJQml0bWFwID0gbV9wRGF0YUFjYy0+R2V0SW1hZ2VFZGl0SW1hZ2UoKTsKLSAgaWYgKCFwRElCaXRtYXApCi0gICAgcmV0dXJuOwotCi0gIENGWF9SZWN0RiBydEltYWdlID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KCk7Ci0gIGludDMyX3QgaUhvcnpBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ7Ci0gIGludDMyX3QgaVZlcnRBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX1RvcDsKLSAgaWYgKENYRkFfUGFyYSBwYXJhID0gbV9wRGF0YUFjYy0+R2V0UGFyYSgpKSB7Ci0gICAgaUhvcnpBbGlnbiA9IHBhcmEuR2V0SG9yaXpvbnRhbEFsaWduKCk7Ci0gICAgaVZlcnRBbGlnbiA9IHBhcmEuR2V0VmVydGljYWxBbGlnbigpOwotICB9Ci0KLSAgaW50MzJfdCBpQXNwZWN0ID0gWEZBX0FUVFJJQlVURUVOVU1fRml0OwotICBpZiAoQ1hGQV9WYWx1ZSB2YWx1ZSA9IG1fcERhdGFBY2MtPkdldEZvcm1WYWx1ZSgpKSB7Ci0gICAgaWYgKENYRkFfSW1hZ2UgaW1hZ2VPYmogPSB2YWx1ZS5HZXRJbWFnZSgpKQotICAgICAgaUFzcGVjdCA9IGltYWdlT2JqLkdldEFzcGVjdCgpOwotICB9Ci0KLSAgaW50MzJfdCBpSW1hZ2VYRHBpID0gMDsKLSAgaW50MzJfdCBpSW1hZ2VZRHBpID0gMDsKLSAgbV9wRGF0YUFjYy0+R2V0SW1hZ2VFZGl0RHBpKGlJbWFnZVhEcGksIGlJbWFnZVlEcGkpOwotICBYRkFfRHJhd0ltYWdlKHBHUywgcnRJbWFnZSwgJm10Um90YXRlLCBwRElCaXRtYXAsIGlBc3BlY3QsIGlJbWFnZVhEcGksCi0gICAgICAgICAgICAgICAgaUltYWdlWURwaSwgaUhvcnpBbGlnbiwgaVZlcnRBbGlnbik7Ci19Ci0KLWJvb2wgQ1hGQV9GRkltYWdlRWRpdDo6T25MQnV0dG9uRG93bih1aW50MzJfdCBkd0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCFQdEluQWN0aXZlUmVjdChwb2ludCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIFNldEJ1dHRvbkRvd24odHJ1ZSk7Ci0KLSAgQ0ZXTF9NZXNzYWdlTW91c2UgbXMobnVsbHB0ciwgbV9wTm9ybWFsV2lkZ2V0KTsKLSAgbXMubV9kd0NtZCA9IEZXTF9Nb3VzZUNvbW1hbmQ6OkxlZnRCdXR0b25Eb3duOwotICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOwotICBtcy5tX3BvcyA9IEZXTFRvQ2xpZW50KHBvaW50KTsKLSAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDWEZBX0ZGSW1hZ2VFZGl0OjpTZXRGV0xSZWN0KCkgewotICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgewotICAgIHJldHVybjsKLSAgfQotICBDRlhfUmVjdEYgcnRVSU1hcmdpbiA9IG1fcERhdGFBY2MtPkdldFVJTWFyZ2luKCk7Ci0gIENGWF9SZWN0RiBydEltYWdlKG1fcnRVSSk7Ci0gIHJ0SW1hZ2UuRGVmbGF0ZShydFVJTWFyZ2luLmxlZnQsIHJ0VUlNYXJnaW4udG9wLCBydFVJTWFyZ2luLndpZHRoLAotICAgICAgICAgICAgICAgICAgcnRVSU1hcmdpbi5oZWlnaHQpOwotICBtX3BOb3JtYWxXaWRnZXQtPlNldFdpZGdldFJlY3QocnRJbWFnZSk7Ci19Ci1ib29sIENYRkFfRkZJbWFnZUVkaXQ6OkNvbW1pdERhdGEoKSB7Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDWEZBX0ZGSW1hZ2VFZGl0OjpVcGRhdGVGV0xEYXRhKCkgewotICBtX3BEYXRhQWNjLT5TZXRJbWFnZUVkaXRJbWFnZShudWxscHRyKTsKLSAgbV9wRGF0YUFjYy0+TG9hZEltYWdlRWRpdEltYWdlKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIENYRkFfRkZJbWFnZUVkaXQ6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgewotICBtX3BPbGREZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7Ci19Ci0KLXZvaWQgQ1hGQV9GRkltYWdlRWRpdDo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSB7Ci0gIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsKLSAgbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7Ci19Ci0KLXZvaWQgQ1hGQV9GRkltYWdlRWRpdDo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBtX3BPbGREZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAveGZhX2ZmaW1hZ2VlZGl0LmggYi94ZmEvZnhmYS9hcHAveGZhX2ZmaW1hZ2VlZGl0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMDMyYjkuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvYXBwL3hmYV9mZmltYWdlZWRpdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEZBX0FQUF9YRkFfRkZJTUFHRUVESVRfSF8KLSNkZWZpbmUgWEZBX0ZYRkFfQVBQX1hGQV9GRklNQUdFRURJVF9IXwotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZmZpZWxkLmgiCi0KLWNsYXNzIENYRkFfRkZJbWFnZUVkaXQgOiBwdWJsaWMgQ1hGQV9GRkZpZWxkIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfRkZJbWFnZUVkaXQoQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsKLSAgfkNYRkFfRkZJbWFnZUVkaXQoKSBvdmVycmlkZTsKLQotICAvLyBDWEZBX0ZGRmllbGQKLSAgdm9pZCBSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsCi0gICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSBvdmVycmlkZTsKLSAgYm9vbCBMb2FkV2lkZ2V0KCkgb3ZlcnJpZGU7Ci0gIHZvaWQgVW5sb2FkV2lkZ2V0KCkgb3ZlcnJpZGU7Ci0gIGJvb2wgT25MQnV0dG9uRG93bih1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSBvdmVycmlkZTsKLSAgdm9pZCBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIG92ZXJyaWRlOwotICB2b2lkIE9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IG51bGxwdHIpIG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICB2b2lkIFNldEZXTFJlY3QoKSBvdmVycmlkZTsKLSAgYm9vbCBVcGRhdGVGV0xEYXRhKCkgb3ZlcnJpZGU7Ci0gIGJvb2wgQ29tbWl0RGF0YSgpIG92ZXJyaWRlOwotCi0gIElGV0xfV2lkZ2V0RGVsZWdhdGUqIG1fcE9sZERlbGVnYXRlOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhGQV9BUFBfWEZBX0ZGSU1BR0VFRElUX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAveGZhX2Zmbm90aWZ5LmNwcCBiL3hmYS9meGZhL2FwcC94ZmFfZmZub3RpZnkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTFiNGZkLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfZmZub3RpZnkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTExICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZub3RpZnkuaCIKLQotI2luY2x1ZGUgImZ4anMvY2Z4anNlX3ZhbHVlLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL2N4ZmFfdGV4dGxheW91dC5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZiYXJjb2RlLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZmNoZWNrYnV0dG9uLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZmNob2ljZWxpc3QuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmZHJhdy5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZleGNsZ3JvdXAuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmZmllbGQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmaW1hZ2UuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmaW1hZ2VlZGl0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZnBhdGguaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmcHVzaGJ1dHRvbi5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZzaWduYXR1cmUuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2Zmc3ViZm9ybS5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZ0ZXh0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZnRleHRlZGl0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZndpZGdldGFjYy5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZndsYWRhcHRlci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmFwcC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmRvYy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmRvY3ZpZXcuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZwYWdldmlldy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZndpZGdldC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZndpZGdldGhhbmRsZXIuaCIKLQotc3RhdGljIHZvaWQgWEZBX0ZGRGVsZXRlV2lkZ2V0QWNjKHZvaWQqIHBEYXRhKSB7Ci0gIGRlbGV0ZSBzdGF0aWNfY2FzdDxDWEZBX1dpZGdldEFjYyo+KHBEYXRhKTsKLX0KLQotc3RhdGljIFhGQV9NQVBEQVRBQkxPQ0tDQUxMQkFDS0lORk8gZ3NfWEZBRGVsZXRlV2lkZ2V0QWNjID0gewotICAgIFhGQV9GRkRlbGV0ZVdpZGdldEFjYywgbnVsbHB0cn07Ci0KLUNYRkFfRkZOb3RpZnk6OkNYRkFfRkZOb3RpZnkoQ1hGQV9GRkRvYyogcERvYykgOiBtX3BEb2MocERvYykge30KLUNYRkFfRkZOb3RpZnk6On5DWEZBX0ZGTm90aWZ5KCkge30KLQotdm9pZCBDWEZBX0ZGTm90aWZ5OjpPblBhZ2VFdmVudChDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBTZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RXZlbnQpIHsKLSAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KHBTZW5kZXItPkdldExheW91dCgpKTsKLSAgaWYgKHBEb2NWaWV3KQotICAgIHBEb2NWaWV3LT5PblBhZ2VFdmVudChwU2VuZGVyLCBkd0V2ZW50KTsKLX0KLQotdm9pZCBDWEZBX0ZGTm90aWZ5OjpPbldpZGdldExpc3RJdGVtQWRkZWQoQ1hGQV9XaWRnZXREYXRhKiBwU2VuZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBMYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlJbmRleCkgewotICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHN0YXRpY19jYXN0PENYRkFfV2lkZ2V0QWNjKj4ocFNlbmRlcik7Ci0gIGlmIChwV2lkZ2V0QWNjLT5HZXRVSVR5cGUoKSAhPSBYRkFfRWxlbWVudDo6Q2hvaWNlTGlzdCkKLSAgICByZXR1cm47Ci0KLSAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IG51bGxwdHI7Ci0gIHdoaWxlICgocFdpZGdldCA9IHBXaWRnZXRBY2MtPkdldE5leHRXaWRnZXQocFdpZGdldCkpICE9IG51bGxwdHIpIHsKLSAgICBpZiAocFdpZGdldC0+SXNMb2FkZWQoKSkgewotICAgICAgaWYgKHBXaWRnZXRBY2MtPklzTGlzdEJveCgpKSB7Ci0gICAgICAgIHN0YXRpY19jYXN0PENYRkFfRkZMaXN0Qm94Kj4ocFdpZGdldCktPkluc2VydEl0ZW0ocExhYmVsLCBpSW5kZXgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9GRkNvbWJvQm94Kj4ocFdpZGdldCktPkluc2VydEl0ZW0ocExhYmVsLCBpSW5kZXgpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIENYRkFfRkZOb3RpZnk6Ok9uV2lkZ2V0TGlzdEl0ZW1SZW1vdmVkKENYRkFfV2lkZ2V0RGF0YSogcFNlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpSW5kZXgpIHsKLSAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBzdGF0aWNfY2FzdDxDWEZBX1dpZGdldEFjYyo+KHBTZW5kZXIpOwotICBpZiAocFdpZGdldEFjYy0+R2V0VUlUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OkNob2ljZUxpc3QpCi0gICAgcmV0dXJuOwotCi0gIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBudWxscHRyOwotICB3aGlsZSAoKHBXaWRnZXQgPSBwV2lkZ2V0QWNjLT5HZXROZXh0V2lkZ2V0KHBXaWRnZXQpKSAhPSBudWxscHRyKSB7Ci0gICAgaWYgKHBXaWRnZXQtPklzTG9hZGVkKCkpIHsKLSAgICAgIGlmIChwV2lkZ2V0QWNjLT5Jc0xpc3RCb3goKSkgewotICAgICAgICBzdGF0aWNfY2FzdDxDWEZBX0ZGTGlzdEJveCo+KHBXaWRnZXQpLT5EZWxldGVJdGVtKGlJbmRleCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzdGF0aWNfY2FzdDxDWEZBX0ZGQ29tYm9Cb3gqPihwV2lkZ2V0KS0+RGVsZXRlSXRlbShpSW5kZXgpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1DWEZBX0xheW91dEl0ZW0qIENYRkFfRkZOb3RpZnk6Ok9uQ3JlYXRlTGF5b3V0SXRlbShDWEZBX05vZGUqIHBOb2RlKSB7Ci0gIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0ID0gbV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0RG9jTGF5b3V0KCk7Ci0gIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldyhwTGF5b3V0KTsKLSAgWEZBX0VsZW1lbnQgZVR5cGUgPSBwTm9kZS0+R2V0RWxlbWVudFR5cGUoKTsKLSAgaWYgKGVUeXBlID09IFhGQV9FbGVtZW50OjpQYWdlQXJlYSkKLSAgICByZXR1cm4gbmV3IENYRkFfRkZQYWdlVmlldyhwRG9jVmlldywgcE5vZGUpOwotICBpZiAoZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OkNvbnRlbnRBcmVhKQotICAgIHJldHVybiBuZXcgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKHBOb2RlKTsKLQotICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IHN0YXRpY19jYXN0PENYRkFfV2lkZ2V0QWNjKj4ocE5vZGUtPkdldFdpZGdldERhdGEoKSk7Ci0gIGlmICghcEFjYykKLSAgICByZXR1cm4gbmV3IENYRkFfQ29udGVudExheW91dEl0ZW0ocE5vZGUpOwotCi0gIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQ7Ci0gIHN3aXRjaCAocEFjYy0+R2V0VUlUeXBlKCkpIHsKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpCYXJjb2RlOgotICAgICAgcFdpZGdldCA9IG5ldyBDWEZBX0ZGQmFyY29kZShwQWNjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJ1dHRvbjoKLSAgICAgIHBXaWRnZXQgPSBuZXcgQ1hGQV9GRlB1c2hCdXR0b24ocEFjYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpDaGVja0J1dHRvbjoKLSAgICAgIHBXaWRnZXQgPSBuZXcgQ1hGQV9GRkNoZWNrQnV0dG9uKHBBY2MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6Q2hvaWNlTGlzdDogewotICAgICAgaWYgKHBBY2MtPklzTGlzdEJveCgpKSB7Ci0gICAgICAgIHBXaWRnZXQgPSBuZXcgQ1hGQV9GRkxpc3RCb3gocEFjYyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwV2lkZ2V0ID0gbmV3IENYRkFfRkZDb21ib0JveChwQWNjKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRhdGVUaW1lRWRpdDoKLSAgICAgIHBXaWRnZXQgPSBuZXcgQ1hGQV9GRkRhdGVUaW1lRWRpdChwQWNjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkltYWdlRWRpdDoKLSAgICAgIHBXaWRnZXQgPSBuZXcgQ1hGQV9GRkltYWdlRWRpdChwQWNjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok51bWVyaWNFZGl0OgotICAgICAgcFdpZGdldCA9IG5ldyBDWEZBX0ZGTnVtZXJpY0VkaXQocEFjYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpQYXNzd29yZEVkaXQ6Ci0gICAgICBwV2lkZ2V0ID0gbmV3IENYRkFfRkZQYXNzd29yZEVkaXQocEFjYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpTaWduYXR1cmU6Ci0gICAgICBwV2lkZ2V0ID0gbmV3IENYRkFfRkZTaWduYXR1cmUocEFjYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpUZXh0RWRpdDoKLSAgICAgIHBXaWRnZXQgPSBuZXcgQ1hGQV9GRlRleHRFZGl0KHBBY2MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6QXJjOgotICAgICAgcFdpZGdldCA9IG5ldyBDWEZBX0ZGQXJjKHBBY2MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6TGluZToKLSAgICAgIHBXaWRnZXQgPSBuZXcgQ1hGQV9GRkxpbmUocEFjYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpSZWN0YW5nbGU6Ci0gICAgICBwV2lkZ2V0ID0gbmV3IENYRkFfRkZSZWN0YW5nbGUocEFjYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpUZXh0OgotICAgICAgcFdpZGdldCA9IG5ldyBDWEZBX0ZGVGV4dChwQWNjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkltYWdlOgotICAgICAgcFdpZGdldCA9IG5ldyBDWEZBX0ZGSW1hZ2UocEFjYyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpEcmF3OgotICAgICAgcFdpZGdldCA9IG5ldyBDWEZBX0ZGRHJhdyhwQWNjKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlN1YmZvcm06Ci0gICAgICBwV2lkZ2V0ID0gbmV3IENYRkFfRkZTdWJGb3JtKHBBY2MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6RXhjbEdyb3VwOgotICAgICAgcFdpZGdldCA9IG5ldyBDWEZBX0ZGRXhjbEdyb3VwKHBBY2MpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6RGVmYXVsdFVpOgotICAgIGRlZmF1bHQ6Ci0gICAgICBwV2lkZ2V0ID0gbnVsbHB0cjsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKHBXaWRnZXQpCi0gICAgcFdpZGdldC0+U2V0RG9jVmlldyhwRG9jVmlldyk7Ci0gIHJldHVybiBwV2lkZ2V0OwotfQotCi12b2lkIENYRkFfRkZOb3RpZnk6OlN0YXJ0RmllbGREcmF3TGF5b3V0KENYRkFfTm9kZSogcEl0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmQ2FsY1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkNhbGNIZWlnaHQpIHsKLSAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBzdGF0aWNfY2FzdDxDWEZBX1dpZGdldEFjYyo+KHBJdGVtLT5HZXRXaWRnZXREYXRhKCkpOwotICBpZiAoIXBBY2MpCi0gICAgcmV0dXJuOwotCi0gIHBBY2MtPlN0YXJ0V2lkZ2V0TGF5b3V0KGZDYWxjV2lkdGgsIGZDYWxjSGVpZ2h0KTsKLX0KLQotYm9vbCBDWEZBX0ZGTm90aWZ5OjpGaW5kU3BsaXRQb3MoQ1hGQV9Ob2RlKiBwSXRlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJsb2NrSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkNhbGNIZWlnaHRQb3MpIHsKLSAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBzdGF0aWNfY2FzdDxDWEZBX1dpZGdldEFjYyo+KHBJdGVtLT5HZXRXaWRnZXREYXRhKCkpOwotICByZXR1cm4gcEFjYyAmJiBwQWNjLT5GaW5kU3BsaXRQb3MoaUJsb2NrSW5kZXgsIGZDYWxjSGVpZ2h0UG9zKTsKLX0KLQotYm9vbCBDWEZBX0ZGTm90aWZ5OjpSdW5TY3JpcHQoQ1hGQV9Ob2RlKiBwU2NyaXB0LCBDWEZBX05vZGUqIHBGb3JtSXRlbSkgewotICBib29sIGJSZXQgPSBmYWxzZTsKLSAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7Ci0gIGlmICghcERvY1ZpZXcpIHsKLSAgICByZXR1cm4gYlJldDsKLSAgfQotICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9Ci0gICAgICBzdGF0aWNfY2FzdDxDWEZBX1dpZGdldEFjYyo+KHBGb3JtSXRlbS0+R2V0V2lkZ2V0RGF0YSgpKTsKLSAgaWYgKCFwV2lkZ2V0QWNjKSB7Ci0gICAgcmV0dXJuIGJSZXQ7Ci0gIH0KLSAgQ1hGQV9FdmVudFBhcmFtIEV2ZW50UGFyYW07Ci0gIEV2ZW50UGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9Vbmtub3duOwotICBDRlhKU0VfVmFsdWUqIHBSZXRWYWx1ZSA9IG51bGxwdHI7Ci0gIGludDMyX3QgaVJldCA9Ci0gICAgICBwV2lkZ2V0QWNjLT5FeGVjdXRlU2NyaXB0KENYRkFfU2NyaXB0KHBTY3JpcHQpLCAmRXZlbnRQYXJhbSwgJnBSZXRWYWx1ZSk7Ci0gIGlmIChpUmV0ID09IFhGQV9FVkVOVEVSUk9SX1N1Y2Nlc3MgJiYgcFJldFZhbHVlKSB7Ci0gICAgYlJldCA9IHBSZXRWYWx1ZS0+VG9Cb29sZWFuKCk7Ci0gICAgZGVsZXRlIHBSZXRWYWx1ZTsKLSAgfQotICByZXR1cm4gYlJldDsKLX0KLWludDMyX3QgQ1hGQV9GRk5vdGlmeTo6RXhlY0V2ZW50QnlEZWVwRmlyc3QoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXNGb3JtUmVhZHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJlY3Vyc2l2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBFeGNsdWRlKSB7Ci0gIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOwotICBpZiAoIXBEb2NWaWV3KSB7Ci0gICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0OwotICB9Ci0gIHJldHVybiBwRG9jVmlldy0+RXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdCgKLSAgICAgIHBGb3JtTm9kZSwgZUV2ZW50VHlwZSwgYklzRm9ybVJlYWR5LCBiUmVjdXJzaXZlLAotICAgICAgcEV4Y2x1ZGUgPyBwRXhjbHVkZS0+R2V0Tm9kZSgpIDogbnVsbHB0cik7Ci19Ci12b2lkIENYRkFfRkZOb3RpZnk6OkFkZENhbGNWYWxpZGF0ZShDWEZBX05vZGUqIHBOb2RlKSB7Ci0gIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOwotICBpZiAoIXBEb2NWaWV3KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0KLSAgICAgIHN0YXRpY19jYXN0PENYRkFfV2lkZ2V0QWNjKj4ocE5vZGUtPkdldFdpZGdldERhdGEoKSk7Ci0gIGlmICghcFdpZGdldEFjYykgewotICAgIHJldHVybjsKLSAgfQotICBwRG9jVmlldy0+QWRkQ2FsY3VsYXRlV2lkZ2V0QWNjKHBXaWRnZXRBY2MpOwotICBwRG9jVmlldy0+QWRkVmFsaWRhdGVXaWRnZXQocFdpZGdldEFjYyk7Ci19Ci1DWEZBX0ZGRG9jKiBDWEZBX0ZGTm90aWZ5OjpHZXRIRE9DKCkgewotICByZXR1cm4gbV9wRG9jOwotfQotSVhGQV9Eb2NFbnZpcm9ubWVudCogQ1hGQV9GRk5vdGlmeTo6R2V0RG9jRW52aXJvbm1lbnQoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BEb2MtPkdldERvY0Vudmlyb25tZW50KCk7Ci19Ci1JWEZBX0FwcFByb3ZpZGVyKiBDWEZBX0ZGTm90aWZ5OjpHZXRBcHBQcm92aWRlcigpIHsKLSAgcmV0dXJuIG1fcERvYy0+R2V0QXBwKCktPkdldEFwcFByb3ZpZGVyKCk7Ci19Ci1DWEZBX0ZGV2lkZ2V0SGFuZGxlciogQ1hGQV9GRk5vdGlmeTo6R2V0V2lkZ2V0SGFuZGxlcigpIHsKLSAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7Ci0gIHJldHVybiBwRG9jVmlldyA/IHBEb2NWaWV3LT5HZXRXaWRnZXRIYW5kbGVyKCkgOiBudWxscHRyOwotfQotQ1hGQV9GRldpZGdldCogQ1hGQV9GRk5vdGlmeTo6R2V0SFdpZGdldChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKSB7Ci0gIHJldHVybiBYRkFfR2V0V2lkZ2V0RnJvbUxheW91dEl0ZW0ocExheW91dEl0ZW0pOwotfQotdm9pZCBDWEZBX0ZGTm90aWZ5OjpPcGVuRHJvcERvd25MaXN0KENYRkFfRkZXaWRnZXQqIGhXaWRnZXQpIHsKLSAgaWYgKGhXaWRnZXQtPkdldERhdGFBY2MoKS0+R2V0VUlUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OkNob2ljZUxpc3QpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7Ci0gIHBEb2NWaWV3LT5Mb2NrVXBkYXRlKCk7Ci0gIHN0YXRpY19jYXN0PENYRkFfRkZDb21ib0JveCo+KGhXaWRnZXQpLT5PcGVuRHJvcERvd25MaXN0KCk7Ci0gIHBEb2NWaWV3LT5VbmxvY2tVcGRhdGUoKTsKLSAgcERvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsKLX0KLUNGWF9XaWRlU3RyaW5nIENYRkFfRkZOb3RpZnk6OkdldEN1cnJlbnREYXRlVGltZSgpIHsKLSAgQ0ZYX1VuaXRpbWUgZGF0YVRpbWU7Ci0gIGRhdGFUaW1lLk5vdygpOwotICBDRlhfV2lkZVN0cmluZyB3c0RhdGVUaW1lOwotICB3c0RhdGVUaW1lLkZvcm1hdChMIiVkJTAyZCUwMmRUJTAyZCUwMmQlMDJkIiwgZGF0YVRpbWUuR2V0WWVhcigpLAotICAgICAgICAgICAgICAgICAgICBkYXRhVGltZS5HZXRNb250aCgpLCBkYXRhVGltZS5HZXREYXkoKSwgZGF0YVRpbWUuR2V0SG91cigpLAotICAgICAgICAgICAgICAgICAgICBkYXRhVGltZS5HZXRNaW51dGUoKSwgZGF0YVRpbWUuR2V0U2Vjb25kKCkpOwotICByZXR1cm4gd3NEYXRlVGltZTsKLX0KLXZvaWQgQ1hGQV9GRk5vdGlmeTo6UmVzZXREYXRhKENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEpIHsKLSAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7Ci0gIGlmICghcERvY1ZpZXcpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgcERvY1ZpZXctPlJlc2V0V2lkZ2V0RGF0YShzdGF0aWNfY2FzdDxDWEZBX1dpZGdldEFjYyo+KHBXaWRnZXREYXRhKSk7Ci19Ci1pbnQzMl90IENYRkFfRkZOb3RpZnk6OkdldExheW91dFN0YXR1cygpIHsKLSAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7Ci0gIHJldHVybiBwRG9jVmlldyA/IHBEb2NWaWV3LT5HZXRMYXlvdXRTdGF0dXMoKSA6IDA7Ci19Ci12b2lkIENYRkFfRkZOb3RpZnk6OlJ1bk5vZGVJbml0aWFsaXplKENYRkFfTm9kZSogcE5vZGUpIHsKLSAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7Ci0gIGlmICghcERvY1ZpZXcpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgcERvY1ZpZXctPkFkZE5ld0Zvcm1Ob2RlKHBOb2RlKTsKLX0KLXZvaWQgQ1hGQV9GRk5vdGlmeTo6UnVuU3ViZm9ybUluZGV4Q2hhbmdlKENYRkFfTm9kZSogcFN1YmZvcm1Ob2RlKSB7Ci0gIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOwotICBpZiAoIXBEb2NWaWV3KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBEb2NWaWV3LT5BZGRJbmRleENoYW5nZWRTdWJmb3JtKHBTdWJmb3JtTm9kZSk7Ci19Ci1DWEZBX05vZGUqIENYRkFfRkZOb3RpZnk6OkdldEZvY3VzV2lkZ2V0Tm9kZSgpIHsKLSAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7Ci0gIGlmICghcERvY1ZpZXcpIHsKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IHBEb2NWaWV3LT5HZXRGb2N1c1dpZGdldEFjYygpOwotICByZXR1cm4gcEFjYyA/IHBBY2MtPkdldE5vZGUoKSA6IG51bGxwdHI7Ci19Ci12b2lkIENYRkFfRkZOb3RpZnk6OlNldEZvY3VzV2lkZ2V0Tm9kZShDWEZBX05vZGUqIHBOb2RlKSB7Ci0gIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOwotICBpZiAoIXBEb2NWaWV3KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0KLSAgICAgIHBOb2RlID8gc3RhdGljX2Nhc3Q8Q1hGQV9XaWRnZXRBY2MqPihwTm9kZS0+R2V0V2lkZ2V0RGF0YSgpKSA6IG51bGxwdHI7Ci0gIHBEb2NWaWV3LT5TZXRGb2N1c1dpZGdldEFjYyhwQWNjKTsKLX0KLQotdm9pZCBDWEZBX0ZGTm90aWZ5OjpPbk5vZGVSZWFkeShDWEZBX05vZGUqIHBOb2RlKSB7Ci0gIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOwotICBpZiAoIXBEb2NWaWV3KQotICAgIHJldHVybjsKLQotICBYRkFfRWxlbWVudCBlVHlwZSA9IHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpOwotICBpZiAoWEZBX0lzQ3JlYXRlV2lkZ2V0KGVUeXBlKSkgewotICAgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gbmV3IENYRkFfV2lkZ2V0QWNjKHBEb2NWaWV3LCBwTm9kZSk7Ci0gICAgcE5vZGUtPlNldE9iamVjdChYRkFfQVRUUklCVVRFX1dpZGdldERhdGEsIHBBY2MsICZnc19YRkFEZWxldGVXaWRnZXRBY2MpOwotICAgIHJldHVybjsKLSAgfQotICBzd2l0Y2ggKGVUeXBlKSB7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6QmluZEl0ZW1zOgotICAgICAgcERvY1ZpZXctPm1fQmluZEl0ZW1zLnB1c2hfYmFjayhwTm9kZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpWYWxpZGF0ZTogewotICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05vZGVGbGFnX05lZWRzSW5pdEFwcCwgZmFsc2UpOwotICAgIH0gYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgQ1hGQV9GRk5vdGlmeTo6T25WYWx1ZUNoYW5naW5nKENYRkFfTm9kZSogcFNlbmRlciwgWEZBX0FUVFJJQlVURSBlQXR0cikgewotICBpZiAoZUF0dHIgIT0gWEZBX0FUVFJJQlVURV9QcmVzZW5jZSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHBTZW5kZXItPkdldFBhY2tldElEKCkgJiBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKQotICAgIHJldHVybjsKLQotICBpZiAoIXBTZW5kZXItPklzRm9ybUNvbnRhaW5lcigpKQotICAgIHJldHVybjsKLQotICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsKLSAgaWYgKCFwRG9jVmlldykKLSAgICByZXR1cm47Ci0KLSAgaWYgKHBEb2NWaWV3LT5HZXRMYXlvdXRTdGF0dXMoKSA8IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19FbmQpCi0gICAgcmV0dXJuOwotCi0gIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0KLSAgICAgIHN0YXRpY19jYXN0PENYRkFfV2lkZ2V0QWNjKj4ocFNlbmRlci0+R2V0V2lkZ2V0RGF0YSgpKTsKLSAgaWYgKCFwV2lkZ2V0QWNjKQotICAgIHJldHVybjsKLQotICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gbnVsbHB0cjsKLSAgd2hpbGUgKChwV2lkZ2V0ID0gcFdpZGdldEFjYy0+R2V0TmV4dFdpZGdldChwV2lkZ2V0KSkgIT0gbnVsbHB0cikgewotICAgIGlmIChwV2lkZ2V0LT5Jc0xvYWRlZCgpKQotICAgICAgcFdpZGdldC0+QWRkSW52YWxpZGF0ZVJlY3QoKTsKLSAgfQotfQotCi12b2lkIENYRkFfRkZOb3RpZnk6Ok9uVmFsdWVDaGFuZ2VkKENYRkFfTm9kZSogcFNlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwV2lkZ2V0Tm9kZSkgewotICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsKLSAgaWYgKCFwRG9jVmlldykKLSAgICByZXR1cm47Ci0KLSAgaWYgKCEocFNlbmRlci0+R2V0UGFja2V0SUQoKSAmIFhGQV9YRFBQQUNLRVRfRm9ybSkpIHsKLSAgICBpZiAoZUF0dHIgPT0gWEZBX0FUVFJJQlVURV9WYWx1ZSkKLSAgICAgIHBEb2NWaWV3LT5BZGRDYWxjdWxhdGVOb2RlTm90aWZ5KHBTZW5kZXIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIFhGQV9FbGVtZW50IGVUeXBlID0gcFBhcmVudE5vZGUtPkdldEVsZW1lbnRUeXBlKCk7Ci0gIGJvb2wgYklzQ29udGFpbmVyTm9kZSA9IHBQYXJlbnROb2RlLT5Jc0NvbnRhaW5lck5vZGUoKTsKLSAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPQotICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9XaWRnZXRBY2MqPihwV2lkZ2V0Tm9kZS0+R2V0V2lkZ2V0RGF0YSgpKTsKLSAgaWYgKCFwV2lkZ2V0QWNjKQotICAgIHJldHVybjsKLQotICBib29sIGJVcGRhdGVQcm9wZXJ0eSA9IGZhbHNlOwotICBwRG9jVmlldy0+U2V0Q2hhbmdlTWFyaygpOwotICBzd2l0Y2ggKGVUeXBlKSB7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6Q2FwdGlvbjogewotICAgICAgQ1hGQV9UZXh0TGF5b3V0KiBwQ2FwT3V0ID0gcFdpZGdldEFjYy0+R2V0Q2FwdGlvblRleHRMYXlvdXQoKTsKLSAgICAgIGlmICghcENhcE91dCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBwQ2FwT3V0LT5VbmxvYWQoKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlVpOgotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBhcmE6Ci0gICAgICBiVXBkYXRlUHJvcGVydHkgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0gIGlmIChiSXNDb250YWluZXJOb2RlICYmIGVBdHRyID09IFhGQV9BVFRSSUJVVEVfQWNjZXNzKQotICAgIGJVcGRhdGVQcm9wZXJ0eSA9IHRydWU7Ci0KLSAgaWYgKGVBdHRyID09IFhGQV9BVFRSSUJVVEVfVmFsdWUpIHsKLSAgICBwRG9jVmlldy0+QWRkQ2FsY3VsYXRlTm9kZU5vdGlmeShwU2VuZGVyKTsKLSAgICBpZiAoZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OlZhbHVlIHx8IGJJc0NvbnRhaW5lck5vZGUpIHsKLSAgICAgIGlmIChiSXNDb250YWluZXJOb2RlKSB7Ci0gICAgICAgIHBXaWRnZXRBY2MtPlVwZGF0ZVVJRGlzcGxheSgpOwotICAgICAgICBwRG9jVmlldy0+QWRkQ2FsY3VsYXRlV2lkZ2V0QWNjKHBXaWRnZXRBY2MpOwotICAgICAgICBwRG9jVmlldy0+QWRkVmFsaWRhdGVXaWRnZXQocFdpZGdldEFjYyk7Ci0gICAgICB9IGVsc2UgaWYgKHBXaWRnZXROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KQotICAgICAgICAgICAgICAgICAgICAgLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpFeGNsR3JvdXApIHsKLSAgICAgICAgcFdpZGdldEFjYy0+VXBkYXRlVUlEaXNwbGF5KCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBudWxscHRyOwotICB3aGlsZSAoKHBXaWRnZXQgPSBwV2lkZ2V0QWNjLT5HZXROZXh0V2lkZ2V0KHBXaWRnZXQpKSAhPSBudWxscHRyKSB7Ci0gICAgaWYgKCFwV2lkZ2V0LT5Jc0xvYWRlZCgpKQotICAgICAgY29udGludWU7Ci0KLSAgICBpZiAoYlVwZGF0ZVByb3BlcnR5KQotICAgICAgcFdpZGdldC0+VXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsKLSAgICBwV2lkZ2V0LT5QZXJmb3JtTGF5b3V0KCk7Ci0gICAgcFdpZGdldC0+QWRkSW52YWxpZGF0ZVJlY3QoKTsKLSAgfQotfQotCi12b2lkIENYRkFfRkZOb3RpZnk6Ok9uQ2hpbGRBZGRlZChDWEZBX05vZGUqIHBTZW5kZXIpIHsKLSAgaWYgKCFwU2VuZGVyLT5Jc0Zvcm1Db250YWluZXIoKSkgewotICAgIHJldHVybjsKLSAgfQotICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsKLSAgaWYgKCFwRG9jVmlldykgewotICAgIHJldHVybjsKLSAgfQotICBib29sIGJMYXlvdXRSZWFkeSA9Ci0gICAgICAhKHBEb2NWaWV3LT5tX2JJbkxheW91dFN0YXR1cykgJiYKLSAgICAgIChwRG9jVmlldy0+R2V0TGF5b3V0U3RhdHVzKCkgPT0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZCk7Ci0gIGlmIChiTGF5b3V0UmVhZHkpCi0gICAgbV9wRG9jLT5HZXREb2NFbnZpcm9ubWVudCgpLT5TZXRDaGFuZ2VNYXJrKG1fcERvYyk7Ci19Ci0KLXZvaWQgQ1hGQV9GRk5vdGlmeTo6T25DaGlsZFJlbW92ZWQoKSB7Ci0gIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOwotICBpZiAoIXBEb2NWaWV3KQotICAgIHJldHVybjsKLQotICBib29sIGJMYXlvdXRSZWFkeSA9Ci0gICAgICAhKHBEb2NWaWV3LT5tX2JJbkxheW91dFN0YXR1cykgJiYKLSAgICAgIChwRG9jVmlldy0+R2V0TGF5b3V0U3RhdHVzKCkgPT0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZCk7Ci0gIGlmIChiTGF5b3V0UmVhZHkpCi0gICAgbV9wRG9jLT5HZXREb2NFbnZpcm9ubWVudCgpLT5TZXRDaGFuZ2VNYXJrKG1fcERvYyk7Ci19Ci0KLXZvaWQgQ1hGQV9GRk5vdGlmeTo6T25MYXlvdXRJdGVtQWRkZWQoQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcFNlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUGFnZUlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGF0dXMpIHsKLSAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KHBMYXlvdXQpOwotICBpZiAoIXBEb2NWaWV3KQotICAgIHJldHVybjsKLQotICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX0dldFdpZGdldEZyb21MYXlvdXRJdGVtKHBTZW5kZXIpOwotICBpZiAoIXBXaWRnZXQpCi0gICAgcmV0dXJuOwotCi0gIENYRkFfRkZQYWdlVmlldyogcE5ld1BhZ2VWaWV3ID0gcERvY1ZpZXctPkdldFBhZ2VWaWV3KGlQYWdlSWR4KTsKLSAgdWludDMyX3QgZHdGaWx0ZXIgPSBYRkFfV2lkZ2V0U3RhdHVzX1Zpc2libGUgfCBYRkFfV2lkZ2V0U3RhdHVzX1ZpZXdhYmxlIHwKLSAgICAgICAgICAgICAgICAgICAgICBYRkFfV2lkZ2V0U3RhdHVzX1ByaW50YWJsZTsKLSAgcFdpZGdldC0+TW9kaWZ5U3RhdHVzKGR3U3RhdHVzLCBkd0ZpbHRlcik7Ci0gIENYRkFfRkZQYWdlVmlldyogcFByZVBhZ2VWaWV3ID0gcFdpZGdldC0+R2V0UGFnZVZpZXcoKTsKLSAgaWYgKHBQcmVQYWdlVmlldyAhPSBwTmV3UGFnZVZpZXcgfHwKLSAgICAgIChkd1N0YXR1cyAmIChYRkFfV2lkZ2V0U3RhdHVzX1Zpc2libGUgfCBYRkFfV2lkZ2V0U3RhdHVzX1ZpZXdhYmxlKSkgPT0KLSAgICAgICAgICAoWEZBX1dpZGdldFN0YXR1c19WaXNpYmxlIHwgWEZBX1dpZGdldFN0YXR1c19WaWV3YWJsZSkpIHsKLSAgICBwV2lkZ2V0LT5TZXRQYWdlVmlldyhwTmV3UGFnZVZpZXcpOwotICAgIG1fcERvYy0+R2V0RG9jRW52aXJvbm1lbnQoKS0+V2lkZ2V0UG9zdEFkZChwV2lkZ2V0LCBwV2lkZ2V0LT5HZXREYXRhQWNjKCkpOwotICB9Ci0gIGlmIChwRG9jVmlldy0+R2V0TGF5b3V0U3RhdHVzKCkgIT0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZCB8fAotICAgICAgIShkd1N0YXR1cyAmIFhGQV9XaWRnZXRTdGF0dXNfVmlzaWJsZSkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHBXaWRnZXQtPklzTG9hZGVkKCkpIHsKLSAgICBpZiAocFdpZGdldC0+R2V0V2lkZ2V0UmVjdCgpICE9IHBXaWRnZXQtPlJlY2FjaGVXaWRnZXRSZWN0KCkpCi0gICAgICBwV2lkZ2V0LT5QZXJmb3JtTGF5b3V0KCk7Ci0gIH0gZWxzZSB7Ci0gICAgcFdpZGdldC0+TG9hZFdpZGdldCgpOwotICB9Ci0gIHBXaWRnZXQtPkFkZEludmFsaWRhdGVSZWN0KG51bGxwdHIpOwotfQotCi12b2lkIENYRkFfRkZOb3RpZnk6Ok9uTGF5b3V0SXRlbVJlbW92aW5nKENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBTZW5kZXIpIHsKLSAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KHBMYXlvdXQpOwotICBpZiAoIXBEb2NWaWV3KQotICAgIHJldHVybjsKLQotICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX0dldFdpZGdldEZyb21MYXlvdXRJdGVtKHBTZW5kZXIpOwotICBpZiAoIXBXaWRnZXQpCi0gICAgcmV0dXJuOwotCi0gIHBEb2NWaWV3LT5EZWxldGVMYXlvdXRJdGVtKHBXaWRnZXQpOwotICBtX3BEb2MtPkdldERvY0Vudmlyb25tZW50KCktPldpZGdldFByZVJlbW92ZShwV2lkZ2V0LCBwV2lkZ2V0LT5HZXREYXRhQWNjKCkpOwotICBwV2lkZ2V0LT5BZGRJbnZhbGlkYXRlUmVjdChudWxscHRyKTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2FwcC94ZmFfZmZub3RpZnkuaCBiL3hmYS9meGZhL2FwcC94ZmFfZmZub3RpZnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJmYWZmZS4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAveGZhX2Zmbm90aWZ5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYRkFfQVBQX1hGQV9GRk5PVElGWV9IXwotI2RlZmluZSBYRkFfRlhGQV9BUFBfWEZBX0ZGTk9USUZZX0hfCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgotCi1jbGFzcyBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjsKLQotY2xhc3MgQ1hGQV9GRk5vdGlmeSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDWEZBX0ZGTm90aWZ5KENYRkFfRkZEb2MqIHBEb2MpOwotICB+Q1hGQV9GRk5vdGlmeSgpOwotCi0gIHZvaWQgT25QYWdlRXZlbnQoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwU2VuZGVyLCB1aW50MzJfdCBkd0V2ZW50KTsKLQotICB2b2lkIE9uV2lkZ2V0TGlzdEl0ZW1BZGRlZChDWEZBX1dpZGdldERhdGEqIHBTZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwTGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUluZGV4KTsKLSAgdm9pZCBPbldpZGdldExpc3RJdGVtUmVtb3ZlZChDWEZBX1dpZGdldERhdGEqIHBTZW5kZXIsIGludDMyX3QgaUluZGV4KTsKLQotICAvLyBOb2RlIGV2ZW50cwotICB2b2lkIE9uTm9kZVJlYWR5KENYRkFfTm9kZSogcE5vZGUpOwotICB2b2lkIE9uVmFsdWVDaGFuZ2luZyhDWEZBX05vZGUqIHBTZW5kZXIsIFhGQV9BVFRSSUJVVEUgZUF0dHIpOwotICB2b2lkIE9uVmFsdWVDaGFuZ2VkKENYRkFfTm9kZSogcFNlbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyLAotICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwV2lkZ2V0Tm9kZSk7Ci0gIHZvaWQgT25DaGlsZEFkZGVkKENYRkFfTm9kZSogcFNlbmRlcik7Ci0gIHZvaWQgT25DaGlsZFJlbW92ZWQoKTsKLQotICBDWEZBX0xheW91dEl0ZW0qIE9uQ3JlYXRlTGF5b3V0SXRlbShDWEZBX05vZGUqIHBOb2RlKTsKLSAgdm9pZCBPbkxheW91dEl0ZW1BZGRlZChDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBTZW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUGFnZUlkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cyk7Ci0gIHZvaWQgT25MYXlvdXRJdGVtUmVtb3ZpbmcoQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRJdGVtKiBwU2VuZGVyKTsKLQotICB2b2lkIFN0YXJ0RmllbGREcmF3TGF5b3V0KENYRkFfTm9kZSogcEl0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZDYWxjV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZDYWxjSGVpZ2h0KTsKLSAgYm9vbCBGaW5kU3BsaXRQb3MoQ1hGQV9Ob2RlKiBwSXRlbSwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQmxvY2tJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZDYWxjSGVpZ2h0UG9zKTsKLSAgYm9vbCBSdW5TY3JpcHQoQ1hGQV9Ob2RlKiBwU2NyaXB0LCBDWEZBX05vZGUqIHBGb3JtSXRlbSk7Ci0gIGludDMyX3QgRXhlY0V2ZW50QnlEZWVwRmlyc3QoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VWRU5UVFlQRSBlRXZlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYklzRm9ybVJlYWR5ID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmVjdXJzaXZlID0gdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcEV4Y2x1ZGUgPSBudWxscHRyKTsKLSAgdm9pZCBBZGRDYWxjVmFsaWRhdGUoQ1hGQV9Ob2RlKiBwTm9kZSk7Ci0gIENYRkFfRkZEb2MqIEdldEhET0MoKTsKLSAgSVhGQV9Eb2NFbnZpcm9ubWVudCogR2V0RG9jRW52aXJvbm1lbnQoKSBjb25zdDsKLSAgSVhGQV9BcHBQcm92aWRlciogR2V0QXBwUHJvdmlkZXIoKTsKLSAgQ1hGQV9GRldpZGdldEhhbmRsZXIqIEdldFdpZGdldEhhbmRsZXIoKTsKLSAgQ1hGQV9GRldpZGdldCogR2V0SFdpZGdldChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKTsKLSAgdm9pZCBPcGVuRHJvcERvd25MaXN0KENYRkFfRkZXaWRnZXQqIGhXaWRnZXQpOwotICBDRlhfV2lkZVN0cmluZyBHZXRDdXJyZW50RGF0ZVRpbWUoKTsKLSAgdm9pZCBSZXNldERhdGEoQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IG51bGxwdHIpOwotICBpbnQzMl90IEdldExheW91dFN0YXR1cygpOwotICB2b2lkIFJ1bk5vZGVJbml0aWFsaXplKENYRkFfTm9kZSogcE5vZGUpOwotICB2b2lkIFJ1blN1YmZvcm1JbmRleENoYW5nZShDWEZBX05vZGUqIHBTdWJmb3JtTm9kZSk7Ci0gIENYRkFfTm9kZSogR2V0Rm9jdXNXaWRnZXROb2RlKCk7Ci0gIHZvaWQgU2V0Rm9jdXNXaWRnZXROb2RlKENYRkFfTm9kZSogcE5vZGUpOwotCi0gcHJpdmF0ZToKLSAgQ1hGQV9GRkRvYyogY29uc3QgbV9wRG9jOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhGQV9BUFBfWEZBX0ZGTk9USUZZX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAveGZhX2ZmcGFnZXZpZXcuY3BwIGIveGZhL2Z4ZmEvYXBwL3hmYV9mZnBhZ2V2aWV3LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FlNTQ5My4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAveGZhX2ZmcGFnZXZpZXcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDY4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZnBhZ2V2aWV3LmgiCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL2ZkZV9yZW5kZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmY2hlY2tidXR0b24uaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmY2hvaWNlbGlzdC5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZmaWVsZC5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZpbWFnZWVkaXQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmcHVzaGJ1dHRvbi5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZ0ZXh0ZWRpdC5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZndsYWRhcHRlci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmRvYy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmRvY3ZpZXcuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZ3aWRnZXQuaCIKLQotbmFtZXNwYWNlIHsKLQotQ0ZYX01hdHJpeCBHZXRQYWdlTWF0cml4KGNvbnN0IENGWF9SZWN0RiYgZG9jUGFnZVJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3QmIGRldmljZVBhZ2VSZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0Nvb3JkaW5hdGVzVHlwZSkgewotICBBU1NFUlQoaVJvdGF0ZSA+PSAwICYmIGlSb3RhdGUgPD0gMyk7Ci0KLSAgYm9vbCBiRmxpcFggPSAoZHdDb29yZGluYXRlc1R5cGUgJiAweDAxKSAhPSAwOwotICBib29sIGJGbGlwWSA9IChkd0Nvb3JkaW5hdGVzVHlwZSAmIDB4MDIpICE9IDA7Ci0gIENGWF9NYXRyaXggbSgoYkZsaXBYID8gLTEuMGYgOiAxLjBmKSwgMCwgMCwgKGJGbGlwWSA/IC0xLjBmIDogMS4wZiksIDAsIDApOwotICBpZiAoaVJvdGF0ZSA9PSAwIHx8IGlSb3RhdGUgPT0gMikgewotICAgIG0uYSAqPSAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3Qud2lkdGggLyBkb2NQYWdlUmVjdC53aWR0aDsKLSAgICBtLmQgKj0gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LmhlaWdodCAvIGRvY1BhZ2VSZWN0LmhlaWdodDsKLSAgfSBlbHNlIHsKLSAgICBtLmEgKj0gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LmhlaWdodCAvIGRvY1BhZ2VSZWN0LndpZHRoOwotICAgIG0uZCAqPSAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3Qud2lkdGggLyBkb2NQYWdlUmVjdC5oZWlnaHQ7Ci0gIH0KLSAgbS5Sb3RhdGUoaVJvdGF0ZSAqIDEuNTcwNzk2MzI2NzVmKTsKLSAgc3dpdGNoIChpUm90YXRlKSB7Ci0gICAgY2FzZSAwOgotICAgICAgbS5lID0gYkZsaXBYID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnJpZ2h0KCkKLSAgICAgICAgICAgICAgICAgICA6IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5sZWZ0OwotICAgICAgbS5mID0gYkZsaXBZID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LmJvdHRvbSgpCi0gICAgICAgICAgICAgICAgICAgOiAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3QudG9wOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgbS5lID0gYkZsaXBZID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LmxlZnQKLSAgICAgICAgICAgICAgICAgICA6IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5yaWdodCgpOwotICAgICAgbS5mID0gYkZsaXBYID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LmJvdHRvbSgpCi0gICAgICAgICAgICAgICAgICAgOiAoRlhfRkxPQVQpZGV2aWNlUGFnZVJlY3QudG9wOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgbS5lID0gYkZsaXBYID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LmxlZnQKLSAgICAgICAgICAgICAgICAgICA6IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5yaWdodCgpOwotICAgICAgbS5mID0gYkZsaXBZID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnRvcAotICAgICAgICAgICAgICAgICAgIDogKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LmJvdHRvbSgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgbS5lID0gYkZsaXBZID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnJpZ2h0KCkKLSAgICAgICAgICAgICAgICAgICA6IChGWF9GTE9BVClkZXZpY2VQYWdlUmVjdC5sZWZ0OwotICAgICAgbS5mID0gYkZsaXBYID8gKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LnRvcAotICAgICAgICAgICAgICAgICAgIDogKEZYX0ZMT0FUKWRldmljZVBhZ2VSZWN0LmJvdHRvbSgpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBtOwotfQotCi1ib29sIFBhZ2VXaWRnZXRGaWx0ZXIoQ1hGQV9GRldpZGdldCogcFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICBib29sIGJUcmF2ZXJzYWwsCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSWdub3JlcmVsZXZhbnQpIHsKLSAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwV2lkZ2V0LT5HZXREYXRhQWNjKCk7Ci0KLSAgaWYgKCEhKGR3RmlsdGVyICYgWEZBX1dpZGdldFN0YXR1c19Gb2N1c2VkKSAmJgotICAgICAgcFdpZGdldEFjYy0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6RmllbGQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB1aW50MzJfdCBkd1N0YXR1cyA9IHBXaWRnZXQtPkdldFN0YXR1cygpOwotICBpZiAoYlRyYXZlcnNhbCAmJiAoZHdTdGF0dXMgJiBYRkFfV2lkZ2V0U3RhdHVzX0Rpc2FibGVkKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChiSWdub3JlcmVsZXZhbnQpCi0gICAgcmV0dXJuICEhKGR3U3RhdHVzICYgWEZBX1dpZGdldFN0YXR1c19WaXNpYmxlKTsKLQotICBkd0ZpbHRlciAmPSAoWEZBX1dpZGdldFN0YXR1c19WaXNpYmxlIHwgWEZBX1dpZGdldFN0YXR1c19WaWV3YWJsZSB8Ci0gICAgICAgICAgICAgICBYRkFfV2lkZ2V0U3RhdHVzX1ByaW50YWJsZSk7Ci0gIHJldHVybiAoZHdGaWx0ZXIgJiBkd1N0YXR1cykgPT0gZHdGaWx0ZXI7Ci19Ci0KLWJvb2wgSXNMYXlvdXRFbGVtZW50KFhGQV9FbGVtZW50IGVFbGVtZW50LCBib29sIGJMYXlvdXRDb250YWluZXIpIHsKLSAgc3dpdGNoIChlRWxlbWVudCkgewotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRyYXc6Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6RmllbGQ6Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6SW5zdGFuY2VNYW5hZ2VyOgotICAgICAgcmV0dXJuICFiTGF5b3V0Q29udGFpbmVyOwotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkFyZWE6Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6U3ViZm9ybToKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpFeGNsR3JvdXA6Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6U3ViZm9ybVNldDoKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpQYWdlQXJlYToKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpGb3JtOgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotQ1hGQV9GRlBhZ2VWaWV3OjpDWEZBX0ZGUGFnZVZpZXcoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LCBDWEZBX05vZGUqIHBQYWdlQXJlYSkKLSAgICA6IENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbShwUGFnZUFyZWEpLCBtX3BEb2NWaWV3KHBEb2NWaWV3KSB7fQotCi1DWEZBX0ZGUGFnZVZpZXc6On5DWEZBX0ZGUGFnZVZpZXcoKSB7fQotCi1DWEZBX0ZGRG9jVmlldyogQ1hGQV9GRlBhZ2VWaWV3OjpHZXREb2NWaWV3KCkgY29uc3QgewotICByZXR1cm4gbV9wRG9jVmlldzsKLX0KLQotQ0ZYX1JlY3RGIENYRkFfRkZQYWdlVmlldzo6R2V0UGFnZVZpZXdSZWN0KCkgY29uc3QgewotICByZXR1cm4gQ0ZYX1JlY3RGKDAsIDAsIEdldFBhZ2VTaXplKCkpOwotfQotCi1DRlhfTWF0cml4IENYRkFfRkZQYWdlVmlldzo6R2V0RGlzcGxheU1hdHJpeChjb25zdCBDRlhfUmVjdCYgcnREaXNwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlKSBjb25zdCB7Ci0gIHJldHVybiBHZXRQYWdlTWF0cml4KENGWF9SZWN0RigwLCAwLCBHZXRQYWdlU2l6ZSgpKSwgcnREaXNwLCBpUm90YXRlLCAwKTsKLX0KLQotSVhGQV9XaWRnZXRJdGVyYXRvciogQ1hGQV9GRlBhZ2VWaWV3OjpDcmVhdGVXaWRnZXRJdGVyYXRvcigKLSAgICB1aW50MzJfdCBkd1RyYXZlcnNlV2F5LAotICAgIHVpbnQzMl90IGR3V2lkZ2V0RmlsdGVyKSB7Ci0gIHN3aXRjaCAoZHdUcmF2ZXJzZVdheSkgewotICAgIGNhc2UgWEZBX1RSQVZFUlNFV0FZX1RyYW52YWxzZToKLSAgICAgIHJldHVybiBuZXcgQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yKHRoaXMsIGR3V2lkZ2V0RmlsdGVyKTsKLSAgICBjYXNlIFhGQV9UUkFWRVJTRVdBWV9Gb3JtOgotICAgICAgcmV0dXJuIG5ldyBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yKHRoaXMsIGR3V2lkZ2V0RmlsdGVyKTsKLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcjo6Q1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcihDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGaWx0ZXIpIHsKLSAgbV9wUGFnZVZpZXcgPSBwUGFnZVZpZXc7Ci0gIG1fZHdGaWx0ZXIgPSBkd0ZpbHRlcjsKLSAgbV9zSXRlcmF0b3IuSW5pdChwUGFnZVZpZXcpOwotICBtX2JJZ25vcmVyZWxldmFudCA9Ci0gICAgICBtX3BQYWdlVmlldy0+R2V0RG9jVmlldygpLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPkdldEN1clZlcnNpb25Nb2RlKCkgPAotICAgICAgWEZBX1ZFUlNJT05fMjA1OwotfQotQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcjo6fkNYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3IoKSB7fQotdm9pZCBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yOjpSZXNldCgpIHsKLSAgbV9zSXRlcmF0b3IuUmVzZXQoKTsKLX0KLUNYRkFfRkZXaWRnZXQqIENYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb0ZpcnN0KCkgewotICBtX3NJdGVyYXRvci5SZXNldCgpOwotICBmb3IgKENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0gPSBtX3NJdGVyYXRvci5HZXRDdXJyZW50KCk7IHBMYXlvdXRJdGVtOwotICAgICAgIHBMYXlvdXRJdGVtID0gbV9zSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7Ci0gICAgaWYgKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQgPSBHZXRXaWRnZXQocExheW91dEl0ZW0pKSB7Ci0gICAgICByZXR1cm4gaFdpZGdldDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1DWEZBX0ZGV2lkZ2V0KiBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yOjpNb3ZlVG9MYXN0KCkgewotICBtX3NJdGVyYXRvci5TZXRDdXJyZW50KG51bGxwdHIpOwotICByZXR1cm4gTW92ZVRvUHJldmlvdXMoKTsKLX0KLUNYRkFfRkZXaWRnZXQqIENYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb05leHQoKSB7Ci0gIGZvciAoQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSA9IG1fc0l0ZXJhdG9yLk1vdmVUb05leHQoKTsgcExheW91dEl0ZW07Ci0gICAgICAgcExheW91dEl0ZW0gPSBtX3NJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsKLSAgICBpZiAoQ1hGQV9GRldpZGdldCogaFdpZGdldCA9IEdldFdpZGdldChwTGF5b3V0SXRlbSkpIHsKLSAgICAgIHJldHVybiBoV2lkZ2V0OwotICAgIH0KLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLUNYRkFfRkZXaWRnZXQqIENYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb1ByZXZpb3VzKCkgewotICBmb3IgKENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0gPSBtX3NJdGVyYXRvci5Nb3ZlVG9QcmV2KCk7IHBMYXlvdXRJdGVtOwotICAgICAgIHBMYXlvdXRJdGVtID0gbV9zSXRlcmF0b3IuTW92ZVRvUHJldigpKSB7Ci0gICAgaWYgKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQgPSBHZXRXaWRnZXQocExheW91dEl0ZW0pKSB7Ci0gICAgICByZXR1cm4gaFdpZGdldDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1DWEZBX0ZGV2lkZ2V0KiBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yOjpHZXRDdXJyZW50V2lkZ2V0KCkgewotICBDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gbV9zSXRlcmF0b3IuR2V0Q3VycmVudCgpOwotICByZXR1cm4gcExheW91dEl0ZW0gPyBYRkFfR2V0V2lkZ2V0RnJvbUxheW91dEl0ZW0ocExheW91dEl0ZW0pIDogbnVsbHB0cjsKLX0KLWJvb2wgQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcjo6U2V0Q3VycmVudFdpZGdldChDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0KSB7Ci0gIHJldHVybiBoV2lkZ2V0ICYmIG1fc0l0ZXJhdG9yLlNldEN1cnJlbnQoaFdpZGdldCk7Ci19Ci1DWEZBX0ZGV2lkZ2V0KiBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yOjpHZXRXaWRnZXQoCi0gICAgQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSkgewotICBpZiAoQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9HZXRXaWRnZXRGcm9tTGF5b3V0SXRlbShwTGF5b3V0SXRlbSkpIHsKLSAgICBpZiAoIVBhZ2VXaWRnZXRGaWx0ZXIocFdpZGdldCwgbV9kd0ZpbHRlciwgZmFsc2UsIG1fYklnbm9yZXJlbGV2YW50KSkgewotICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIGlmICghcFdpZGdldC0+SXNMb2FkZWQoKSAmJgotICAgICAgICAocFdpZGdldC0+R2V0U3RhdHVzKCkgJiBYRkFfV2lkZ2V0U3RhdHVzX1Zpc2libGUpICE9IDApIHsKLSAgICAgIHBXaWRnZXQtPkxvYWRXaWRnZXQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBXaWRnZXQ7Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLUNYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6Q1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yKAotICAgIENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LAotICAgIHVpbnQzMl90IGR3RmlsdGVyKQotICAgIDogbV9wUGFnZVZpZXcocFBhZ2VWaWV3KSwgbV9kd0ZpbHRlcihkd0ZpbHRlciksIG1faUN1cldpZGdldCgtMSkgewotICBtX2JJZ25vcmVyZWxldmFudCA9Ci0gICAgICBtX3BQYWdlVmlldy0+R2V0RG9jVmlldygpLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPkdldEN1clZlcnNpb25Nb2RlKCkgPAotICAgICAgWEZBX1ZFUlNJT05fMjA1OwotICBSZXNldCgpOwotfQotCi1DWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6On5DWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3IoKSB7fQotCi12b2lkIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6UmVzZXQoKSB7Ci0gIENyZWF0ZVRhYk9yZGVyV2lkZ2V0QXJyYXkoKTsKLSAgbV9pQ3VyV2lkZ2V0ID0gLTE7Ci19Ci0KLUNYRkFfRkZXaWRnZXQqIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6TW92ZVRvRmlyc3QoKSB7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsKLSAgICAgICBpIDwgcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX1RhYk9yZGVyV2lkZ2V0QXJyYXkpOyBpKyspIHsKLSAgICBpZiAoUGFnZVdpZGdldEZpbHRlcihtX1RhYk9yZGVyV2lkZ2V0QXJyYXlbaV0sIG1fZHdGaWx0ZXIsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbV9iSWdub3JlcmVsZXZhbnQpKSB7Ci0gICAgICBtX2lDdXJXaWRnZXQgPSBpOwotICAgICAgcmV0dXJuIG1fVGFiT3JkZXJXaWRnZXRBcnJheVttX2lDdXJXaWRnZXRdOwotICAgIH0KLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotQ1hGQV9GRldpZGdldCogQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpNb3ZlVG9MYXN0KCkgewotICBmb3IgKGludDMyX3QgaSA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9UYWJPcmRlcldpZGdldEFycmF5KSAtIDE7Ci0gICAgICAgaSA+PSAwOyBpLS0pIHsKLSAgICBpZiAoUGFnZVdpZGdldEZpbHRlcihtX1RhYk9yZGVyV2lkZ2V0QXJyYXlbaV0sIG1fZHdGaWx0ZXIsIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbV9iSWdub3JlcmVsZXZhbnQpKSB7Ci0gICAgICBtX2lDdXJXaWRnZXQgPSBpOwotICAgICAgcmV0dXJuIG1fVGFiT3JkZXJXaWRnZXRBcnJheVttX2lDdXJXaWRnZXRdOwotICAgIH0KLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotQ1hGQV9GRldpZGdldCogQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpNb3ZlVG9OZXh0KCkgewotICBmb3IgKGludDMyX3QgaSA9IG1faUN1cldpZGdldCArIDE7Ci0gICAgICAgaSA8IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9UYWJPcmRlcldpZGdldEFycmF5KTsgaSsrKSB7Ci0gICAgaWYgKFBhZ2VXaWRnZXRGaWx0ZXIobV9UYWJPcmRlcldpZGdldEFycmF5W2ldLCBtX2R3RmlsdGVyLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1fYklnbm9yZXJlbGV2YW50KSkgewotICAgICAgbV9pQ3VyV2lkZ2V0ID0gaTsKLSAgICAgIHJldHVybiBtX1RhYk9yZGVyV2lkZ2V0QXJyYXlbbV9pQ3VyV2lkZ2V0XTsKLSAgICB9Ci0gIH0KLSAgbV9pQ3VyV2lkZ2V0ID0gLTE7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1DWEZBX0ZGV2lkZ2V0KiBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb1ByZXZpb3VzKCkgewotICBmb3IgKGludDMyX3QgaSA9IG1faUN1cldpZGdldCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgaWYgKFBhZ2VXaWRnZXRGaWx0ZXIobV9UYWJPcmRlcldpZGdldEFycmF5W2ldLCBtX2R3RmlsdGVyLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1fYklnbm9yZXJlbGV2YW50KSkgewotICAgICAgbV9pQ3VyV2lkZ2V0ID0gaTsKLSAgICAgIHJldHVybiBtX1RhYk9yZGVyV2lkZ2V0QXJyYXlbbV9pQ3VyV2lkZ2V0XTsKLSAgICB9Ci0gIH0KLSAgbV9pQ3VyV2lkZ2V0ID0gLTE7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1DWEZBX0ZGV2lkZ2V0KiBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6OkdldEN1cnJlbnRXaWRnZXQoKSB7Ci0gIHJldHVybiBtX2lDdXJXaWRnZXQgPj0gMCA/IG1fVGFiT3JkZXJXaWRnZXRBcnJheVttX2lDdXJXaWRnZXRdIDogbnVsbHB0cjsKLX0KLQotYm9vbCBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6OlNldEN1cnJlbnRXaWRnZXQoCi0gICAgQ1hGQV9GRldpZGdldCogaFdpZGdldCkgewotICBhdXRvIGl0ID0gc3RkOjpmaW5kKG1fVGFiT3JkZXJXaWRnZXRBcnJheS5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgIG1fVGFiT3JkZXJXaWRnZXRBcnJheS5lbmQoKSwgaFdpZGdldCk7Ci0gIGlmIChpdCA9PSBtX1RhYk9yZGVyV2lkZ2V0QXJyYXkuZW5kKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG1faUN1cldpZGdldCA9IGl0IC0gbV9UYWJPcmRlcldpZGdldEFycmF5LmJlZ2luKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1DWEZBX0ZGV2lkZ2V0KiBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6OkdldFRyYXZlcnNlV2lkZ2V0KAotICAgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQpIHsKLSAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBwV2lkZ2V0LT5HZXREYXRhQWNjKCk7Ci0gIENYRkFfTm9kZSogcFRyYXZlcnNhbCA9IHBBY2MtPkdldE5vZGUoKS0+R2V0Q2hpbGQoMCwgWEZBX0VsZW1lbnQ6OlRyYXZlcnNhbCk7Ci0gIGlmIChwVHJhdmVyc2FsKSB7Ci0gICAgQ1hGQV9Ob2RlKiBwVHJhdmVyc2UgPSBwVHJhdmVyc2FsLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6VHJhdmVyc2UpOwotICAgIGlmIChwVHJhdmVyc2UpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzVHJhdmVyc2VXaWRnZXROYW1lOwotICAgICAgaWYgKHBUcmF2ZXJzZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfUmVmLCB3c1RyYXZlcnNlV2lkZ2V0TmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIEZpbmRXaWRnZXRCeU5hbWUod3NUcmF2ZXJzZVdpZGdldE5hbWUsIHBXaWRnZXQpOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLUNYRkFfRkZXaWRnZXQqIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6RmluZFdpZGdldEJ5TmFtZSgKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NXaWRnZXROYW1lLAotICAgIENYRkFfRkZXaWRnZXQqIHBSZWZXaWRnZXQpIHsKLSAgcmV0dXJuIHBSZWZXaWRnZXQtPkdldERvY1ZpZXcoKS0+R2V0V2lkZ2V0QnlOYW1lKHdzV2lkZ2V0TmFtZSwgcFJlZldpZGdldCk7Ci19Ci0KLXZvaWQgQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpDcmVhdGVUYWJPcmRlcldpZGdldEFycmF5KCkgewotICBtX1RhYk9yZGVyV2lkZ2V0QXJyYXkuY2xlYXIoKTsKLQotICBzdGQ6OnZlY3RvcjxDWEZBX0ZGV2lkZ2V0Kj4gU3BhY2VPcmRlcldpZGdldEFycmF5OwotICBDcmVhdGVTcGFjZU9yZGVyV2lkZ2V0QXJyYXkoJlNwYWNlT3JkZXJXaWRnZXRBcnJheSk7Ci0gIGlmIChTcGFjZU9yZGVyV2lkZ2V0QXJyYXkuZW1wdHkoKSkKLSAgICByZXR1cm47Ci0KLSAgaW50MzJfdCBuV2lkZ2V0Q291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KFNwYWNlT3JkZXJXaWRnZXRBcnJheSk7Ci0gIENYRkFfRkZXaWRnZXQqIGhXaWRnZXQgPSBTcGFjZU9yZGVyV2lkZ2V0QXJyYXlbMF07Ci0gIHdoaWxlIChwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fVGFiT3JkZXJXaWRnZXRBcnJheSkgPAotICAgICAgICAgbldpZGdldENvdW50KSB7Ci0gICAgaWYgKCFwZGZpdW06OkNvbnRhaW5zVmFsdWUobV9UYWJPcmRlcldpZGdldEFycmF5LCBoV2lkZ2V0KSkgewotICAgICAgbV9UYWJPcmRlcldpZGdldEFycmF5LnB1c2hfYmFjayhoV2lkZ2V0KTsKLSAgICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gaFdpZGdldC0+R2V0RGF0YUFjYygpOwotICAgICAgaWYgKHBXaWRnZXRBY2MtPkdldFVJVHlwZSgpID09IFhGQV9FbGVtZW50OjpFeGNsR3JvdXApIHsKLSAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZChTcGFjZU9yZGVyV2lkZ2V0QXJyYXkuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFjZU9yZGVyV2lkZ2V0QXJyYXkuZW5kKCksIGhXaWRnZXQpOwotICAgICAgICBpbnQzMl90IGlXaWRnZXRJbmRleCA9IGl0ICE9IFNwYWNlT3JkZXJXaWRnZXRBcnJheS5lbmQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGl0IC0gU3BhY2VPcmRlcldpZGdldEFycmF5LmJlZ2luKCkgKyAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICBDWEZBX0ZGV2lkZ2V0KiBwUmFkaW8gPQotICAgICAgICAgICAgICBTcGFjZU9yZGVyV2lkZ2V0QXJyYXlbaVdpZGdldEluZGV4ICUgbldpZGdldENvdW50XTsKLSAgICAgICAgICBpZiAocFJhZGlvLT5HZXREYXRhQWNjKCktPkdldEV4Y2xHcm91cCgpICE9IHBXaWRnZXRBY2MpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoIXBkZml1bTo6Q29udGFpbnNWYWx1ZShtX1RhYk9yZGVyV2lkZ2V0QXJyYXksIGhXaWRnZXQpKSB7Ci0gICAgICAgICAgICBtX1RhYk9yZGVyV2lkZ2V0QXJyYXkucHVzaF9iYWNrKHBSYWRpbyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlXaWRnZXRJbmRleCsrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoQ1hGQV9GRldpZGdldCogaFRyYXZlcnNlV2lkZ2V0ID0gR2V0VHJhdmVyc2VXaWRnZXQoaFdpZGdldCkpIHsKLSAgICAgICAgaFdpZGdldCA9IGhUcmF2ZXJzZVdpZGdldDsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmQoU3BhY2VPcmRlcldpZGdldEFycmF5LmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBTcGFjZU9yZGVyV2lkZ2V0QXJyYXkuZW5kKCksIGhXaWRnZXQpOwotICAgIGludDMyX3QgaVdpZGdldEluZGV4ID0gaXQgIT0gU3BhY2VPcmRlcldpZGdldEFycmF5LmVuZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpdCAtIFNwYWNlT3JkZXJXaWRnZXRBcnJheS5iZWdpbigpICsgMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKLSAgICBoV2lkZ2V0ID0gU3BhY2VPcmRlcldpZGdldEFycmF5W2lXaWRnZXRJbmRleCAlIG5XaWRnZXRDb3VudF07Ci0gIH0KLX0KLQotc3RhdGljIGludDMyX3QgWEZBX1RhYk9yZGVyV2lkZ2V0Q29tcGFyYXRvcihjb25zdCB2b2lkKiBwaFdpZGdldDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHBoV2lkZ2V0MikgewotICBhdXRvIHBhcmFtMSA9ICpzdGF0aWNfY2FzdDxDWEZBX1RhYlBhcmFtKio+KGNvbnN0X2Nhc3Q8dm9pZCo+KHBoV2lkZ2V0MSkpOwotICBhdXRvIHBhcmFtMiA9ICpzdGF0aWNfY2FzdDxDWEZBX1RhYlBhcmFtKio+KGNvbnN0X2Nhc3Q8dm9pZCo+KHBoV2lkZ2V0MikpOwotICBDRlhfUmVjdEYgcnQxID0gcGFyYW0xLT5tX3BXaWRnZXQtPkdldFdpZGdldFJlY3QoKTsKLSAgQ0ZYX1JlY3RGIHJ0MiA9IHBhcmFtMi0+bV9wV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KCk7Ci0gIEZYX0ZMT0FUIHgxID0gcnQxLmxlZnQsIHkxID0gcnQxLnRvcCwgeDIgPSBydDIubGVmdCwgeTIgPSBydDIudG9wOwotICBpZiAoeTEgPCB5MiB8fCAoeTEgLSB5MiA8IFhGQV9GTE9BVF9QRVJDSVNJT04gJiYgeDEgPCB4MikpCi0gICAgcmV0dXJuIC0xOwotICByZXR1cm4gMTsKLX0KLQotdm9pZCBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6Ok9yZGVyQ29udGFpbmVyKAotICAgIENYRkFfTGF5b3V0SXRlbUl0ZXJhdG9yKiBzSXRlcmF0b3IsCi0gICAgQ1hGQV9MYXlvdXRJdGVtKiBwQ29udGFpbmVySXRlbSwKLSAgICBDWEZBX1RhYlBhcmFtKiBwQ29udGFpbmVyLAotICAgIGJvb2wmIGJDdXJyZW50SXRlbSwKLSAgICBib29sJiBiQ29udGVudEFyZWEsCi0gICAgYm9vbCBiTWFyc3RlclBhZ2UpIHsKLSAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9UYWJQYXJhbSo+IHRhYlBhcmFtczsKLSAgQ1hGQV9MYXlvdXRJdGVtKiBwU2VhcmNoSXRlbSA9IHNJdGVyYXRvci0+TW92ZVRvTmV4dCgpOwotICB3aGlsZSAocFNlYXJjaEl0ZW0pIHsKLSAgICBpZiAoIXBTZWFyY2hJdGVtLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkpIHsKLSAgICAgIGJDb250ZW50QXJlYSA9IHRydWU7Ci0gICAgICBwU2VhcmNoSXRlbSA9IHNJdGVyYXRvci0+TW92ZVRvTmV4dCgpOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChiTWFyc3RlclBhZ2UgJiYgYkNvbnRlbnRBcmVhKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGJNYXJzdGVyUGFnZSB8fCBiQ29udGVudEFyZWEpIHsKLSAgICAgIENYRkFfRkZXaWRnZXQqIGhXaWRnZXQgPSBHZXRXaWRnZXQocFNlYXJjaEl0ZW0pOwotICAgICAgaWYgKCFoV2lkZ2V0KSB7Ci0gICAgICAgIHBTZWFyY2hJdGVtID0gc0l0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYgKHBDb250YWluZXJJdGVtICYmIChwU2VhcmNoSXRlbS0+R2V0UGFyZW50KCkgIT0gcENvbnRhaW5lckl0ZW0pKSB7Ci0gICAgICAgIGJDdXJyZW50SXRlbSA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgQ1hGQV9UYWJQYXJhbSogcFBhcmFtID0gbmV3IENYRkFfVGFiUGFyYW07Ci0gICAgICBwUGFyYW0tPm1fcFdpZGdldCA9IGhXaWRnZXQ7Ci0gICAgICB0YWJQYXJhbXMuQWRkKHBQYXJhbSk7Ci0gICAgICBpZiAoSXNMYXlvdXRFbGVtZW50KHBTZWFyY2hJdGVtLT5HZXRGb3JtTm9kZSgpLT5HZXRFbGVtZW50VHlwZSgpLCB0cnVlKSkgewotICAgICAgICBPcmRlckNvbnRhaW5lcihzSXRlcmF0b3IsIHBTZWFyY2hJdGVtLCBwUGFyYW0sIGJDdXJyZW50SXRlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgYkNvbnRlbnRBcmVhLCBiTWFyc3RlclBhZ2UpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoYkN1cnJlbnRJdGVtKSB7Ci0gICAgICBwU2VhcmNoSXRlbSA9IHNJdGVyYXRvci0+R2V0Q3VycmVudCgpOwotICAgICAgYkN1cnJlbnRJdGVtID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBTZWFyY2hJdGVtID0gc0l0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7Ci0gICAgfQotICB9Ci0gIGludDMyX3QgaUNoaWxkcmVuID0gdGFiUGFyYW1zLkdldFNpemUoKTsKLSAgaWYgKGlDaGlsZHJlbiA+IDEpIHsKLSAgICBGWFNZU19xc29ydCh0YWJQYXJhbXMuR2V0RGF0YSgpLCBpQ2hpbGRyZW4sIHNpemVvZih2b2lkKiksCi0gICAgICAgICAgICAgICAgWEZBX1RhYk9yZGVyV2lkZ2V0Q29tcGFyYXRvcik7Ci0gIH0KLSAgZm9yIChpbnQzMl90IGlTdGFydCA9IDA7IGlTdGFydCA8IGlDaGlsZHJlbjsgaVN0YXJ0KyspIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9UYWJQYXJhbT4gcFBhcmFtKHRhYlBhcmFtc1tpU3RhcnRdKTsKLSAgICBwQ29udGFpbmVyLT5tX0NoaWxkcmVuLnB1c2hfYmFjayhwUGFyYW0tPm1fcFdpZGdldCk7Ci0gICAgcENvbnRhaW5lci0+bV9DaGlsZHJlbi5pbnNlcnQocENvbnRhaW5lci0+bV9DaGlsZHJlbi5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPm1fQ2hpbGRyZW4uYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPm1fQ2hpbGRyZW4uZW5kKCkpOwotICB9Ci0gIHRhYlBhcmFtcy5SZW1vdmVBbGwoKTsKLX0KLXZvaWQgQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpDcmVhdGVTcGFjZU9yZGVyV2lkZ2V0QXJyYXkoCi0gICAgc3RkOjp2ZWN0b3I8Q1hGQV9GRldpZGdldCo+KiBXaWRnZXRBcnJheSkgewotICBDWEZBX0xheW91dEl0ZW1JdGVyYXRvciBzSXRlcmF0b3I7Ci0gIHNJdGVyYXRvci5Jbml0KG1fcFBhZ2VWaWV3KTsKLSAgYXV0byBwUGFyYW0gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9UYWJQYXJhbT4oKTsKLSAgYm9vbCBiQ3VycmVudEl0ZW0gPSBmYWxzZTsKLSAgYm9vbCBiQ29udGVudEFyZWEgPSBmYWxzZTsKLSAgT3JkZXJDb250YWluZXIoJnNJdGVyYXRvciwgbnVsbHB0ciwgcFBhcmFtLmdldCgpLCBiQ3VycmVudEl0ZW0sIGJDb250ZW50QXJlYSk7Ci0gIFdpZGdldEFycmF5LT5pbnNlcnQoV2lkZ2V0QXJyYXktPmVuZCgpLCBwUGFyYW0tPm1fQ2hpbGRyZW4uYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPm1fQ2hpbGRyZW4uZW5kKCkpOwotCi0gIHNJdGVyYXRvci5SZXNldCgpOwotICBiQ3VycmVudEl0ZW0gPSBmYWxzZTsKLSAgYkNvbnRlbnRBcmVhID0gZmFsc2U7Ci0gIHBQYXJhbS0+bV9DaGlsZHJlbi5jbGVhcigpOwotICBPcmRlckNvbnRhaW5lcigmc0l0ZXJhdG9yLCBudWxscHRyLCBwUGFyYW0uZ2V0KCksIGJDdXJyZW50SXRlbSwgYkNvbnRlbnRBcmVhLAotICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgV2lkZ2V0QXJyYXktPmluc2VydChXaWRnZXRBcnJheS0+ZW5kKCksIHBQYXJhbS0+bV9DaGlsZHJlbi5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+bV9DaGlsZHJlbi5lbmQoKSk7Ci19Ci0KLUNYRkFfRkZXaWRnZXQqIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6R2V0V2lkZ2V0KAotICAgIENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0pIHsKLSAgaWYgKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBYRkFfR2V0V2lkZ2V0RnJvbUxheW91dEl0ZW0ocExheW91dEl0ZW0pKSB7Ci0gICAgaWYgKCFwV2lkZ2V0LT5Jc0xvYWRlZCgpICYmCi0gICAgICAgIChwV2lkZ2V0LT5HZXRTdGF0dXMoKSAmIFhGQV9XaWRnZXRTdGF0dXNfVmlzaWJsZSkpIHsKLSAgICAgIHBXaWRnZXQtPkxvYWRXaWRnZXQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBXaWRnZXQ7Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLUNYRkFfVGFiUGFyYW06OkNYRkFfVGFiUGFyYW0oKSA6IG1fcFdpZGdldChudWxscHRyKSB7fQotCi1DWEZBX1RhYlBhcmFtOjp+Q1hGQV9UYWJQYXJhbSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAveGZhX2ZmcGF0aC5jcHAgYi94ZmEvZnhmYS9hcHAveGZhX2ZmcGF0aC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMDE2ZmUuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvYXBwL3hmYV9mZnBhdGguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZwYXRoLmgiCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmZHJhdy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmFwcC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZmRvYy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZnBhZ2V2aWV3LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0LmgiCi0jaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY2Z4X2NvbG9yLmgiCi0jaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY2Z4X3BhdGguaCIKLQotQ1hGQV9GRkxpbmU6OkNYRkFfRkZMaW5lKENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykgOiBDWEZBX0ZGRHJhdyhwRGF0YUFjYykge30KLQotQ1hGQV9GRkxpbmU6On5DWEZBX0ZGTGluZSgpIHt9Ci0KLXZvaWQgQ1hGQV9GRkxpbmU6OkdldFJlY3RGcm9tSGFuZChDRlhfUmVjdEYmIHJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpSGFuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTGluZVdpZHRoKSB7Ci0gIEZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmTGluZVdpZHRoIC8gMi4wZjsKLSAgaWYgKHJlY3QuaGVpZ2h0IDwgMS4wZikgewotICAgIHN3aXRjaCAoaUhhbmQpIHsKLSAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDoKLSAgICAgICAgcmVjdC50b3AgLT0gZkhhbGZXaWR0aDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0OgotICAgICAgICByZWN0LnRvcCArPSBmSGFsZldpZHRoOwotICAgIH0KLSAgfSBlbHNlIGlmIChyZWN0LndpZHRoIDwgMS4wZikgewotICAgIHN3aXRjaCAoaUhhbmQpIHsKLSAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDoKLSAgICAgICAgcmVjdC5sZWZ0ICs9IGZIYWxmV2lkdGg7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoKLSAgICAgICAgcmVjdC5sZWZ0ICs9IGZIYWxmV2lkdGg7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBzd2l0Y2ggKGlIYW5kKSB7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6Ci0gICAgICAgIHJlY3QuSW5mbGF0ZShmSGFsZldpZHRoLCBmSGFsZldpZHRoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0OgotICAgICAgICByZWN0LkRlZmxhdGUoZkhhbGZXaWR0aCwgZkhhbGZXaWR0aCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi12b2lkIENYRkFfRkZMaW5lOjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cykgewotICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkKLSAgICByZXR1cm47Ci0KLSAgQ1hGQV9WYWx1ZSB2YWx1ZSA9IG1fcERhdGFBY2MtPkdldEZvcm1WYWx1ZSgpOwotICBpZiAoIXZhbHVlKQotICAgIHJldHVybjsKLQotICBDWEZBX0xpbmUgbGluZU9iaiA9IHZhbHVlLkdldExpbmUoKTsKLSAgRlhfQVJHQiBsaW5lQ29sb3IgPSAweEZGMDAwMDAwOwotICBpbnQzMl90IGlTdHJva2VUeXBlID0gMDsKLSAgRlhfRkxPQVQgZkxpbmVXaWR0aCA9IDEuMGY7Ci0gIGludDMyX3QgaUNhcCA9IDA7Ci0gIENYRkFfRWRnZSBlZGdlID0gbGluZU9iai5HZXRFZGdlKCk7Ci0gIGlmIChlZGdlKSB7Ci0gICAgaWYgKGVkZ2UuR2V0UHJlc2VuY2UoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlKQotICAgICAgcmV0dXJuOwotCi0gICAgbGluZUNvbG9yID0gZWRnZS5HZXRDb2xvcigpOwotICAgIGlTdHJva2VUeXBlID0gZWRnZS5HZXRTdHJva2VUeXBlKCk7Ci0gICAgZkxpbmVXaWR0aCA9IGVkZ2UuR2V0VGhpY2tuZXNzKCk7Ci0gICAgaUNhcCA9IGVkZ2UuR2V0Q2FwVHlwZSgpOwotICB9Ci0KLSAgQ0ZYX01hdHJpeCBtdFJvdGF0ZSA9IEdldFJvdGF0ZU1hdHJpeCgpOwotICBpZiAocE1hdHJpeCkKLSAgICBtdFJvdGF0ZS5Db25jYXQoKnBNYXRyaXgpOwotCi0gIENGWF9SZWN0RiBydExpbmUgPSBHZXRSZWN0V2l0aG91dFJvdGF0ZSgpOwotICBpZiAoQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSBtX3BEYXRhQWNjLT5HZXRNYXJnaW4oKSkKLSAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKHJ0TGluZSwgbWdXaWRnZXQpOwotCi0gIEdldFJlY3RGcm9tSGFuZChydExpbmUsIGxpbmVPYmouR2V0SGFuZCgpLCBmTGluZVdpZHRoKTsKLSAgQ0ZYX1BhdGggbGluZVBhdGg7Ci0gIGlmIChsaW5lT2JqLkdldFNsb3BlKCkgJiYgcnRMaW5lLnJpZ2h0KCkgPiAwLjBmICYmIHJ0TGluZS5ib3R0b20oKSA+IDAuMGYpCi0gICAgbGluZVBhdGguQWRkTGluZShydExpbmUuVG9wUmlnaHQoKSwgcnRMaW5lLkJvdHRvbUxlZnQoKSk7Ci0gIGVsc2UKLSAgICBsaW5lUGF0aC5BZGRMaW5lKHJ0TGluZS5Ub3BMZWZ0KCksIHJ0TGluZS5Cb3R0b21SaWdodCgpKTsKLQotICBDRlhfQ29sb3IgY29sb3IobGluZUNvbG9yKTsKLSAgcEdTLT5TYXZlR3JhcGhTdGF0ZSgpOwotICBwR1MtPlNldExpbmVXaWR0aChmTGluZVdpZHRoLCB0cnVlKTsKLSAgWEZBX1N0cm9rZVR5cGVTZXRMaW5lRGFzaChwR1MsIGlTdHJva2VUeXBlLCBpQ2FwKTsKLSAgcEdTLT5TZXRTdHJva2VDb2xvcigmY29sb3IpOwotICBwR1MtPlNldExpbmVDYXAoWEZBX0xpbmVDYXBUb0ZYR0UoaUNhcCkpOwotICBwR1MtPlN0cm9rZVBhdGgoJmxpbmVQYXRoLCAmbXRSb3RhdGUpOwotICBwR1MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7Ci19Ci0KLUNYRkFfRkZBcmM6OkNYRkFfRkZBcmMoQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKSA6IENYRkFfRkZEcmF3KHBEYXRhQWNjKSB7fQotCi1DWEZBX0ZGQXJjOjp+Q1hGQV9GRkFyYygpIHt9Ci0KLXZvaWQgQ1hGQV9GRkFyYzo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSB7Ci0gIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKQotICAgIHJldHVybjsKLQotICBDWEZBX1ZhbHVlIHZhbHVlID0gbV9wRGF0YUFjYy0+R2V0Rm9ybVZhbHVlKCk7Ci0gIGlmICghdmFsdWUpCi0gICAgcmV0dXJuOwotCi0gIENYRkFfQXJjIGFyY09iaiA9IHZhbHVlLkdldEFyYygpOwotICBDRlhfTWF0cml4IG10Um90YXRlID0gR2V0Um90YXRlTWF0cml4KCk7Ci0gIGlmIChwTWF0cml4KQotICAgIG10Um90YXRlLkNvbmNhdCgqcE1hdHJpeCk7Ci0KLSAgQ0ZYX1JlY3RGIHJ0QXJjID0gR2V0UmVjdFdpdGhvdXRSb3RhdGUoKTsKLSAgaWYgKENYRkFfTWFyZ2luIG1nV2lkZ2V0ID0gbV9wRGF0YUFjYy0+R2V0TWFyZ2luKCkpCi0gICAgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihydEFyYywgbWdXaWRnZXQpOwotCi0gIERyYXdCb3JkZXIocEdTLCBhcmNPYmosIHJ0QXJjLCAmbXRSb3RhdGUpOwotfQotCi1DWEZBX0ZGUmVjdGFuZ2xlOjpDWEZBX0ZGUmVjdGFuZ2xlKENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykKLSAgICA6IENYRkFfRkZEcmF3KHBEYXRhQWNjKSB7fQotCi1DWEZBX0ZGUmVjdGFuZ2xlOjp+Q1hGQV9GRlJlY3RhbmdsZSgpIHt9Ci0KLXZvaWQgQ1hGQV9GRlJlY3RhbmdsZTo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSB7Ci0gIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKQotICAgIHJldHVybjsKLQotICBDWEZBX1ZhbHVlIHZhbHVlID0gbV9wRGF0YUFjYy0+R2V0Rm9ybVZhbHVlKCk7Ci0gIGlmICghdmFsdWUpCi0gICAgcmV0dXJuOwotCi0gIENYRkFfUmVjdGFuZ2xlIHJ0T2JqID0gdmFsdWUuR2V0UmVjdGFuZ2xlKCk7Ci0gIENGWF9SZWN0RiByZWN0ID0gR2V0UmVjdFdpdGhvdXRSb3RhdGUoKTsKLSAgaWYgKENYRkFfTWFyZ2luIG1nV2lkZ2V0ID0gbV9wRGF0YUFjYy0+R2V0TWFyZ2luKCkpCi0gICAgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihyZWN0LCBtZ1dpZGdldCk7Ci0KLSAgQ0ZYX01hdHJpeCBtdFJvdGF0ZSA9IEdldFJvdGF0ZU1hdHJpeCgpOwotICBpZiAocE1hdHJpeCkKLSAgICBtdFJvdGF0ZS5Db25jYXQoKnBNYXRyaXgpOwotCi0gIERyYXdCb3JkZXIocEdTLCBydE9iaiwgcmVjdCwgJm10Um90YXRlKTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2FwcC94ZmFfZmZwYXRoLmggYi94ZmEvZnhmYS9hcHAveGZhX2ZmcGF0aC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDJmNzVkLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfZmZwYXRoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYRkFfQVBQX1hGQV9GRlBBVEhfSF8KLSNkZWZpbmUgWEZBX0ZYRkFfQVBQX1hGQV9GRlBBVEhfSF8KLQotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZkcmF3LmgiCi0KLWNsYXNzIENYRkFfRkZMaW5lIDogcHVibGljIENYRkFfRkZEcmF3IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfRkZMaW5lKENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7Ci0gIH5DWEZBX0ZGTGluZSgpIG92ZXJyaWRlOwotCi0gIC8vIENYRkFfRkZXaWRnZXQKLSAgdm9pZCBSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsCi0gICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgR2V0UmVjdEZyb21IYW5kKENGWF9SZWN0RiYgcmVjdCwgaW50MzJfdCBpSGFuZCwgRlhfRkxPQVQgZkxpbmVXaWR0aCk7Ci19OwotCi1jbGFzcyBDWEZBX0ZGQXJjIDogcHVibGljIENYRkFfRkZEcmF3IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfRkZBcmMoQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsKLSAgfkNYRkFfRkZBcmMoKSBvdmVycmlkZTsKLQotICAvLyBDWEZBX0ZGV2lkZ2V0Ci0gIHZvaWQgUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLAotICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cykgb3ZlcnJpZGU7Ci19OwotCi1jbGFzcyBDWEZBX0ZGUmVjdGFuZ2xlIDogcHVibGljIENYRkFfRkZEcmF3IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfRkZSZWN0YW5nbGUoQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsKLSAgfkNYRkFfRkZSZWN0YW5nbGUoKSBvdmVycmlkZTsKLQotICAvLyBDWEZBX0ZGV2lkZ2V0Ci0gIHZvaWQgUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLAotICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cykgb3ZlcnJpZGU7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEZBX0FQUF9YRkFfRkZQQVRIX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAveGZhX2ZmcHVzaGJ1dHRvbi5jcHAgYi94ZmEvZnhmYS9hcHAveGZhX2ZmcHVzaGJ1dHRvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNmJlODIuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvYXBwL3hmYV9mZnB1c2hidXR0b24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZwdXNoYnV0dG9uLmgiCi0KLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfbm90ZWRyaXZlci5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9wdXNoYnV0dG9uLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX3dpZGdldG1nci5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC9jeGZhX3RleHRsYXlvdXQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmZmllbGQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2Zmd2lkZ2V0YWNjLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmYXBwLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmcGFnZXZpZXcuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZ3aWRnZXQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfY29sb3IuaCIKLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfcGF0aC5oIgotCi1DWEZBX0ZGUHVzaEJ1dHRvbjo6Q1hGQV9GRlB1c2hCdXR0b24oQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQotICAgIDogQ1hGQV9GRkZpZWxkKHBEYXRhQWNjKSwKLSAgICAgIG1fcFJvbGxvdmVyVGV4dExheW91dChudWxscHRyKSwKLSAgICAgIG1fcERvd25UZXh0TGF5b3V0KG51bGxwdHIpLAotICAgICAgbV9wRG93blByb3ZpZGVyKG51bGxwdHIpLAotICAgICAgbV9wUm9sbFByb3ZpZGVyKG51bGxwdHIpLAotICAgICAgbV9wT2xkRGVsZWdhdGUobnVsbHB0cikge30KLQotQ1hGQV9GRlB1c2hCdXR0b246On5DWEZBX0ZGUHVzaEJ1dHRvbigpIHsKLSAgQ1hGQV9GRlB1c2hCdXR0b246OlVubG9hZFdpZGdldCgpOwotfQotCi12b2lkIENYRkFfRkZQdXNoQnV0dG9uOjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cykgewotICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkKLSAgICByZXR1cm47Ci0KLSAgQ0ZYX01hdHJpeCBtdFJvdGF0ZSA9IEdldFJvdGF0ZU1hdHJpeCgpOwotICBpZiAocE1hdHJpeCkKLSAgICBtdFJvdGF0ZS5Db25jYXQoKnBNYXRyaXgpOwotCi0gIENYRkFfRkZXaWRnZXQ6OlJlbmRlcldpZGdldChwR1MsICZtdFJvdGF0ZSwgZHdTdGF0dXMpOwotICBSZW5kZXJIaWdobGlnaHRDYXB0aW9uKHBHUywgJm10Um90YXRlKTsKLQotICBDRlhfUmVjdEYgcnRXaWRnZXQgPSBHZXRSZWN0V2l0aG91dFJvdGF0ZSgpOwotICBDRlhfTWF0cml4IG10KDEsIDAsIDAsIDEsIHJ0V2lkZ2V0LmxlZnQsIHJ0V2lkZ2V0LnRvcCk7Ci0gIG10LkNvbmNhdChtdFJvdGF0ZSk7Ci0gIEdldEFwcCgpLT5HZXRXaWRnZXRNZ3JEZWxlZ2F0ZSgpLT5PbkRyYXdXaWRnZXQobV9wTm9ybWFsV2lkZ2V0LCBwR1MsICZtdCk7Ci19Ci0KLWJvb2wgQ1hGQV9GRlB1c2hCdXR0b246OkxvYWRXaWRnZXQoKSB7Ci0gIEFTU0VSVCghbV9wTm9ybWFsV2lkZ2V0KTsKLSAgQ0ZXTF9QdXNoQnV0dG9uKiBwUHVzaEJ1dHRvbiA9IG5ldyBDRldMX1B1c2hCdXR0b24oR2V0RldMQXBwKCkpOwotICBtX3BPbGREZWxlZ2F0ZSA9IHBQdXNoQnV0dG9uLT5HZXREZWxlZ2F0ZSgpOwotICBwUHVzaEJ1dHRvbi0+U2V0RGVsZWdhdGUodGhpcyk7Ci0KLSAgbV9wTm9ybWFsV2lkZ2V0ID0gcFB1c2hCdXR0b247Ci0gIG1fcE5vcm1hbFdpZGdldC0+U2V0TGF5b3V0SXRlbSh0aGlzKTsKLQotICBDRldMX05vdGVEcml2ZXIqIHBOb3RlRHJpdmVyID0KLSAgICAgIG1fcE5vcm1hbFdpZGdldC0+R2V0T3duZXJBcHAoKS0+R2V0Tm90ZURyaXZlcigpOwotICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChtX3BOb3JtYWxXaWRnZXQsIG1fcE5vcm1hbFdpZGdldCk7Ci0gIG1fcE5vcm1hbFdpZGdldC0+TG9ja1VwZGF0ZSgpOwotICBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOwotICBMb2FkSGlnaGxpZ2h0Q2FwdGlvbigpOwotICBtX3BOb3JtYWxXaWRnZXQtPlVubG9ja1VwZGF0ZSgpOwotICByZXR1cm4gQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCk7Ci19Ci12b2lkIENYRkFfRkZQdXNoQnV0dG9uOjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIHsKLSAgdWludDMyX3QgZHdTdHlsZUV4ID0gMDsKLSAgc3dpdGNoIChtX3BEYXRhQWNjLT5HZXRCdXR0b25IaWdobGlnaHQoKSkgewotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSW52ZXJ0ZWQ6Ci0gICAgICBkd1N0eWxlRXggPSBYRkFfRldMX1BTQlNUWUxFRVhUX0hpbGl0ZUludmVydGVkOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9PdXRsaW5lOgotICAgICAgZHdTdHlsZUV4ID0gWEZBX0ZXTF9QU0JTVFlMRUVYVF9IaWxpdGVPdXRMaW5lOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9QdXNoOgotICAgICAgZHdTdHlsZUV4ID0gWEZBX0ZXTF9QU0JTVFlMRUVYVF9IaWxpdGVQdXNoOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0gIG1fcE5vcm1hbFdpZGdldC0+TW9kaWZ5U3R5bGVzRXgoZHdTdHlsZUV4LCAweEZGRkZGRkZGKTsKLX0KLQotdm9pZCBDWEZBX0ZGUHVzaEJ1dHRvbjo6VW5sb2FkV2lkZ2V0KCkgewotICBkZWxldGUgbV9wUm9sbG92ZXJUZXh0TGF5b3V0OwotICBtX3BSb2xsb3ZlclRleHRMYXlvdXQgPSBudWxscHRyOwotICBkZWxldGUgbV9wRG93blRleHRMYXlvdXQ7Ci0gIG1fcERvd25UZXh0TGF5b3V0ID0gbnVsbHB0cjsKLSAgZGVsZXRlIG1fcERvd25Qcm92aWRlcjsKLSAgbV9wRG93blByb3ZpZGVyID0gbnVsbHB0cjsKLSAgZGVsZXRlIG1fcFJvbGxQcm92aWRlcjsKLSAgbV9wUm9sbFByb3ZpZGVyID0gbnVsbHB0cjsKLSAgQ1hGQV9GRkZpZWxkOjpVbmxvYWRXaWRnZXQoKTsKLX0KLQotYm9vbCBDWEZBX0ZGUHVzaEJ1dHRvbjo6UGVyZm9ybUxheW91dCgpIHsKLSAgQ1hGQV9GRldpZGdldDo6UGVyZm9ybUxheW91dCgpOwotICBDRlhfUmVjdEYgcnRXaWRnZXQgPSBHZXRSZWN0V2l0aG91dFJvdGF0ZSgpOwotCi0gIG1fcnRVSSA9IHJ0V2lkZ2V0OwotICBpZiAoQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSBtX3BEYXRhQWNjLT5HZXRNYXJnaW4oKSkKLSAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKHJ0V2lkZ2V0LCBtZ1dpZGdldCk7Ci0KLSAgQ1hGQV9DYXB0aW9uIGNhcHRpb24gPSBtX3BEYXRhQWNjLT5HZXRDYXB0aW9uKCk7Ci0gIG1fcnRDYXB0aW9uID0gcnRXaWRnZXQ7Ci0gIGlmIChDWEZBX01hcmdpbiBtZ0NhcCA9IGNhcHRpb24uR2V0TWFyZ2luKCkpCi0gICAgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihtX3J0Q2FwdGlvbiwgbWdDYXApOwotCi0gIExheW91dEhpZ2hsaWdodENhcHRpb24oKTsKLSAgU2V0RldMUmVjdCgpOwotICBpZiAobV9wTm9ybWFsV2lkZ2V0KQotICAgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci1GWF9GTE9BVCBDWEZBX0ZGUHVzaEJ1dHRvbjo6R2V0TGluZVdpZHRoKCkgewotICBDWEZBX0JvcmRlciBib3JkZXIgPSBtX3BEYXRhQWNjLT5HZXRCb3JkZXIoKTsKLSAgaWYgKGJvcmRlciAmJiBib3JkZXIuR2V0UHJlc2VuY2UoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlKSB7Ci0gICAgQ1hGQV9FZGdlIGVkZ2UgPSBib3JkZXIuR2V0RWRnZSgwKTsKLSAgICByZXR1cm4gZWRnZS5HZXRUaGlja25lc3MoKTsKLSAgfQotICByZXR1cm4gMDsKLX0KLUZYX0FSR0IgQ1hGQV9GRlB1c2hCdXR0b246OkdldExpbmVDb2xvcigpIHsKLSAgcmV0dXJuIDB4RkYwMDAwMDA7Ci19Ci1GWF9BUkdCIENYRkFfRkZQdXNoQnV0dG9uOjpHZXRGaWxsQ29sb3IoKSB7Ci0gIHJldHVybiAweEZGRkZGRkZGOwotfQotdm9pZCBDWEZBX0ZGUHVzaEJ1dHRvbjo6TG9hZEhpZ2hsaWdodENhcHRpb24oKSB7Ci0gIENYRkFfQ2FwdGlvbiBjYXB0aW9uID0gbV9wRGF0YUFjYy0+R2V0Q2FwdGlvbigpOwotICBpZiAoY2FwdGlvbiAmJiBjYXB0aW9uLkdldFByZXNlbmNlKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fSGlkZGVuKSB7Ci0gICAgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NSb2xsb3ZlcjsKLSAgICAgIGJvb2wgYlJpY2hUZXh0OwotICAgICAgaWYgKG1fcERhdGFBY2MtPkdldEJ1dHRvblJvbGxvdmVyKHdzUm9sbG92ZXIsIGJSaWNoVGV4dCkpIHsKLSAgICAgICAgaWYgKCFtX3BSb2xsUHJvdmlkZXIpIHsKLSAgICAgICAgICBtX3BSb2xsUHJvdmlkZXIgPQotICAgICAgICAgICAgICBuZXcgQ1hGQV9UZXh0UHJvdmlkZXIobV9wRGF0YUFjYywgWEZBX1RFWFRQUk9WSURFUlRZUEVfUm9sbG92ZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1fcFJvbGxvdmVyVGV4dExheW91dCA9IG5ldyBDWEZBX1RleHRMYXlvdXQobV9wUm9sbFByb3ZpZGVyKTsKLSAgICAgIH0KLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzRG93bjsKLSAgICAgIGlmIChtX3BEYXRhQWNjLT5HZXRCdXR0b25Eb3duKHdzRG93biwgYlJpY2hUZXh0KSkgewotICAgICAgICBpZiAoIW1fcERvd25Qcm92aWRlcikgewotICAgICAgICAgIG1fcERvd25Qcm92aWRlciA9Ci0gICAgICAgICAgICAgIG5ldyBDWEZBX1RleHRQcm92aWRlcihtX3BEYXRhQWNjLCBYRkFfVEVYVFBST1ZJREVSVFlQRV9Eb3duKTsKLSAgICAgICAgfQotICAgICAgICBtX3BEb3duVGV4dExheW91dCA9IG5ldyBDWEZBX1RleHRMYXlvdXQobV9wRG93blByb3ZpZGVyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLXZvaWQgQ1hGQV9GRlB1c2hCdXR0b246OkxheW91dEhpZ2hsaWdodENhcHRpb24oKSB7Ci0gIENGWF9TaXplRiBzeihtX3J0Q2FwdGlvbi53aWR0aCwgbV9ydENhcHRpb24uaGVpZ2h0KTsKLSAgTGF5b3V0Q2FwdGlvbigpOwotICBpZiAobV9wUm9sbG92ZXJUZXh0TGF5b3V0KSB7Ci0gICAgbV9wUm9sbG92ZXJUZXh0TGF5b3V0LT5MYXlvdXQoc3opOwotICB9Ci0gIGlmIChtX3BEb3duVGV4dExheW91dCkgewotICAgIG1fcERvd25UZXh0TGF5b3V0LT5MYXlvdXQoc3opOwotICB9Ci19Ci12b2lkIENYRkFfRkZQdXNoQnV0dG9uOjpSZW5kZXJIaWdobGlnaHRDYXB0aW9uKENGWF9HcmFwaGljcyogcEdTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7Ci0gIENYRkFfVGV4dExheW91dCogcENhcFRleHRMYXlvdXQgPSBtX3BEYXRhQWNjLT5HZXRDYXB0aW9uVGV4dExheW91dCgpOwotICBDWEZBX0NhcHRpb24gY2FwdGlvbiA9IG1fcERhdGFBY2MtPkdldENhcHRpb24oKTsKLSAgaWYgKCFjYXB0aW9uIHx8IGNhcHRpb24uR2V0UHJlc2VuY2UoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlKQotICAgIHJldHVybjsKLQotICBDRlhfUmVuZGVyRGV2aWNlKiBwUmVuZGVyRGV2aWNlID0gcEdTLT5HZXRSZW5kZXJEZXZpY2UoKTsKLSAgQ0ZYX1JlY3RGIHJ0Q2xpcCA9IG1fcnRDYXB0aW9uOwotICBydENsaXAuSW50ZXJzZWN0KEdldFJlY3RXaXRob3V0Um90YXRlKCkpOwotICBDRlhfTWF0cml4IG10KDEsIDAsIDAsIDEsIG1fcnRDYXB0aW9uLmxlZnQsIG1fcnRDYXB0aW9uLnRvcCk7Ci0gIGlmIChwTWF0cml4KSB7Ci0gICAgcE1hdHJpeC0+VHJhbnNmb3JtUmVjdChydENsaXApOwotICAgIG10LkNvbmNhdCgqcE1hdHJpeCk7Ci0gIH0KLQotICB1aW50MzJfdCBkd1N0YXRlID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRTdGF0ZXMoKTsKLSAgaWYgKG1fcERvd25UZXh0TGF5b3V0ICYmIChkd1N0YXRlICYgRldMX1NUQVRFX1BTQl9QcmVzc2VkKSAmJgotICAgICAgKGR3U3RhdGUgJiBGV0xfU1RBVEVfUFNCX0hvdmVyZWQpKSB7Ci0gICAgaWYgKG1fcERvd25UZXh0TGF5b3V0LT5EcmF3U3RyaW5nKHBSZW5kZXJEZXZpY2UsIG10LCBydENsaXApKQotICAgICAgcmV0dXJuOwotICB9IGVsc2UgaWYgKG1fcFJvbGxvdmVyVGV4dExheW91dCAmJiAoZHdTdGF0ZSAmIEZXTF9TVEFURV9QU0JfSG92ZXJlZCkpIHsKLSAgICBpZiAobV9wUm9sbG92ZXJUZXh0TGF5b3V0LT5EcmF3U3RyaW5nKHBSZW5kZXJEZXZpY2UsIG10LCBydENsaXApKQotICAgICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKHBDYXBUZXh0TGF5b3V0KQotICAgIHBDYXBUZXh0TGF5b3V0LT5EcmF3U3RyaW5nKHBSZW5kZXJEZXZpY2UsIG10LCBydENsaXApOwotfQotCi12b2lkIENYRkFfRkZQdXNoQnV0dG9uOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsKLSAgbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOwotfQotCi12b2lkIENYRkFfRkZQdXNoQnV0dG9uOjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsKLSAgbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7Ci0gIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsKLX0KLQotdm9pZCBDWEZBX0ZGUHVzaEJ1dHRvbjo6T25EcmF3V2lkZ2V0KENGWF9HcmFwaGljcyogcEdyYXBoaWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgaWYgKG1fcE5vcm1hbFdpZGdldC0+R2V0U3R5bGVzRXgoKSAmIFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlSW52ZXJ0ZWQpIHsKLSAgICBpZiAoKG1fcE5vcm1hbFdpZGdldC0+R2V0U3RhdGVzKCkgJiBGV0xfU1RBVEVfUFNCX1ByZXNzZWQpICYmCi0gICAgICAgIChtX3BOb3JtYWxXaWRnZXQtPkdldFN0YXRlcygpICYgRldMX1NUQVRFX1BTQl9Ib3ZlcmVkKSkgewotICAgICAgQ0ZYX1JlY3RGIHJ0RmlsbCgwLCAwLCBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldFJlY3QoKS5TaXplKCkpOwotICAgICAgRlhfRkxPQVQgZkxpbmVXaXRoID0gR2V0TGluZVdpZHRoKCk7Ci0gICAgICBydEZpbGwuRGVmbGF0ZShmTGluZVdpdGgsIGZMaW5lV2l0aCk7Ci0gICAgICBDRlhfQ29sb3IgY3IoRlhBUkdCX01BS0UoMTI4LCAxMjgsIDI1NSwgMjU1KSk7Ci0gICAgICBwR3JhcGhpY3MtPlNldEZpbGxDb2xvcigmY3IpOwotCi0gICAgICBDRlhfUGF0aCBwYXRoOwotICAgICAgcGF0aC5BZGRSZWN0YW5nbGUocnRGaWxsLmxlZnQsIHJ0RmlsbC50b3AsIHJ0RmlsbC53aWR0aCwgcnRGaWxsLmhlaWdodCk7Ci0gICAgICBwR3JhcGhpY3MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgKENGWF9NYXRyaXgqKXBNYXRyaXgpOwotICAgIH0KLSAgfSBlbHNlIGlmIChtX3BOb3JtYWxXaWRnZXQtPkdldFN0eWxlc0V4KCkgJgotICAgICAgICAgICAgIFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlT3V0TGluZSkgewotICAgIGlmICgobV9wTm9ybWFsV2lkZ2V0LT5HZXRTdGF0ZXMoKSAmIEZXTF9TVEFURV9QU0JfUHJlc3NlZCkgJiYKLSAgICAgICAgKG1fcE5vcm1hbFdpZGdldC0+R2V0U3RhdGVzKCkgJiBGV0xfU1RBVEVfUFNCX0hvdmVyZWQpKSB7Ci0gICAgICBGWF9GTE9BVCBmTGluZVdpZHRoID0gR2V0TGluZVdpZHRoKCk7Ci0gICAgICBDRlhfQ29sb3IgY3IoRlhBUkdCX01BS0UoMjU1LCAxMjgsIDI1NSwgMjU1KSk7Ci0gICAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKCZjcik7Ci0gICAgICBwR3JhcGhpY3MtPlNldExpbmVXaWR0aChmTGluZVdpZHRoKTsKLQotICAgICAgQ0ZYX1BhdGggcGF0aDsKLSAgICAgIENGWF9SZWN0RiByZWN0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KCk7Ci0gICAgICBwYXRoLkFkZFJlY3RhbmdsZSgwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7Ci0gICAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsIChDRlhfTWF0cml4KilwTWF0cml4KTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2FwcC94ZmFfZmZwdXNoYnV0dG9uLmggYi94ZmEvZnhmYS9hcHAveGZhX2ZmcHVzaGJ1dHRvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjE4Y2NiLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfZmZwdXNoYnV0dG9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYRkFfQVBQX1hGQV9GRlBVU0hCVVRUT05fSF8KLSNkZWZpbmUgWEZBX0ZYRkFfQVBQX1hGQV9GRlBVU0hCVVRUT05fSF8KLQotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZmaWVsZC5oIgotCi0jZGVmaW5lIFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlTm9uZSAoMEwgPDwgMCkKLSNkZWZpbmUgWEZBX0ZXTF9QU0JTVFlMRUVYVF9IaWxpdGVJbnZlcnRlZCAoMUwgPDwgMCkKLSNkZWZpbmUgWEZBX0ZXTF9QU0JTVFlMRUVYVF9IaWxpdGVQdXNoICgyTCA8PCAwKQotI2RlZmluZSBYRkFfRldMX1BTQlNUWUxFRVhUX0hpbGl0ZU91dExpbmUgKDRMIDw8IDApCi0KLWNsYXNzIENYRkFfVGV4dFByb3ZpZGVyOwotCi1jbGFzcyBDWEZBX0ZGUHVzaEJ1dHRvbiA6IHB1YmxpYyBDWEZBX0ZGRmllbGQgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9GRlB1c2hCdXR0b24oQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsKLSAgfkNYRkFfRkZQdXNoQnV0dG9uKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ1hGQV9GRkZpZWxkCi0gIHZvaWQgUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLAotICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cykgb3ZlcnJpZGU7Ci0gIGJvb2wgTG9hZFdpZGdldCgpIG92ZXJyaWRlOwotICB2b2lkIFVubG9hZFdpZGdldCgpIG92ZXJyaWRlOwotICBib29sIFBlcmZvcm1MYXlvdXQoKSBvdmVycmlkZTsKLSAgdm9pZCBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIG92ZXJyaWRlOwotICB2b2lkIE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSBvdmVycmlkZTsKLSAgdm9pZCBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBudWxscHRyKSBvdmVycmlkZTsKLQotIHByb3RlY3RlZDoKLSAgdm9pZCBMb2FkSGlnaGxpZ2h0Q2FwdGlvbigpOwotICB2b2lkIExheW91dEhpZ2hsaWdodENhcHRpb24oKTsKLSAgdm9pZCBSZW5kZXJIaWdobGlnaHRDYXB0aW9uKENGWF9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4ID0gbnVsbHB0cik7Ci0gIEZYX0ZMT0FUIEdldExpbmVXaWR0aCgpOwotICBGWF9BUkdCIEdldExpbmVDb2xvcigpOwotICBGWF9BUkdCIEdldEZpbGxDb2xvcigpOwotCi0gIENYRkFfVGV4dExheW91dCogbV9wUm9sbG92ZXJUZXh0TGF5b3V0OwotICBDWEZBX1RleHRMYXlvdXQqIG1fcERvd25UZXh0TGF5b3V0OwotICBDWEZBX1RleHRQcm92aWRlciogbV9wRG93blByb3ZpZGVyOwotICBDWEZBX1RleHRQcm92aWRlciogbV9wUm9sbFByb3ZpZGVyOwotICBJRldMX1dpZGdldERlbGVnYXRlKiBtX3BPbGREZWxlZ2F0ZTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYRkFfQVBQX1hGQV9GRlBVU0hCVVRUT05fSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2FwcC94ZmFfZmZzaWduYXR1cmUuY3BwIGIveGZhL2Z4ZmEvYXBwL3hmYV9mZnNpZ25hdHVyZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMmJiYTMuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvYXBwL3hmYV9mZnNpZ25hdHVyZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZnNpZ25hdHVyZS5oIgotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZmZpZWxkLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmcGFnZXZpZXcuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZ3aWRnZXQuaCIKLQotQ1hGQV9GRlNpZ25hdHVyZTo6Q1hGQV9GRlNpZ25hdHVyZShDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpCi0gICAgOiBDWEZBX0ZGRmllbGQocERhdGFBY2MpIHt9Ci0KLUNYRkFfRkZTaWduYXR1cmU6On5DWEZBX0ZGU2lnbmF0dXJlKCkge30KLQotYm9vbCBDWEZBX0ZGU2lnbmF0dXJlOjpMb2FkV2lkZ2V0KCkgewotICByZXR1cm4gQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCk7Ci19Ci0KLXZvaWQgQ1hGQV9GRlNpZ25hdHVyZTo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSB7Ci0gIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKQotICAgIHJldHVybjsKLQotICBDRlhfTWF0cml4IG10Um90YXRlID0gR2V0Um90YXRlTWF0cml4KCk7Ci0gIGlmIChwTWF0cml4KQotICAgIG10Um90YXRlLkNvbmNhdCgqcE1hdHJpeCk7Ci0KLSAgQ1hGQV9GRldpZGdldDo6UmVuZGVyV2lkZ2V0KHBHUywgJm10Um90YXRlLCBkd1N0YXR1cyk7Ci0KLSAgQ1hGQV9Cb3JkZXIgYm9yZGVyVUkgPSBtX3BEYXRhQWNjLT5HZXRVSUJvcmRlcigpOwotICBEcmF3Qm9yZGVyKHBHUywgYm9yZGVyVUksIG1fcnRVSSwgJm10Um90YXRlKTsKLSAgUmVuZGVyQ2FwdGlvbihwR1MsICZtdFJvdGF0ZSk7Ci0gIERyYXdIaWdobGlnaHQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzLCBmYWxzZSk7Ci19Ci0KLWJvb2wgQ1hGQV9GRlNpZ25hdHVyZTo6T25Nb3VzZUVudGVyKCkgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1hGQV9GRlNpZ25hdHVyZTo6T25Nb3VzZUV4aXQoKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX0ZGU2lnbmF0dXJlOjpPbkxCdXR0b25Eb3duKHVpbnQzMl90IGR3RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfRkZTaWduYXR1cmU6Ok9uTEJ1dHRvblVwKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX0ZGU2lnbmF0dXJlOjpPbkxCdXR0b25EYmxDbGsodWludDMyX3QgZHdGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX0ZGU2lnbmF0dXJlOjpPbk1vdXNlTW92ZSh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1hGQV9GRlNpZ25hdHVyZTo6T25Nb3VzZVdoZWVsKHVpbnQzMl90IGR3RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHpEZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX0ZGU2lnbmF0dXJlOjpPblJCdXR0b25Eb3duKHVpbnQzMl90IGR3RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfRkZTaWduYXR1cmU6Ok9uUkJ1dHRvblVwKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX0ZGU2lnbmF0dXJlOjpPblJCdXR0b25EYmxDbGsodWludDMyX3QgZHdGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX0ZGU2lnbmF0dXJlOjpPbktleURvd24odWludDMyX3QgZHdLZXlDb2RlLCB1aW50MzJfdCBkd0ZsYWdzKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX0ZGU2lnbmF0dXJlOjpPbktleVVwKHVpbnQzMl90IGR3S2V5Q29kZSwgdWludDMyX3QgZHdGbGFncykgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1hGQV9GRlNpZ25hdHVyZTo6T25DaGFyKHVpbnQzMl90IGR3Q2hhciwgdWludDMyX3QgZHdGbGFncykgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLUZXTF9XaWRnZXRIaXQgQ1hGQV9GRlNpZ25hdHVyZTo6T25IaXRUZXN0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIGlmIChtX3BOb3JtYWxXaWRnZXQgJiYKLSAgICAgIG1fcE5vcm1hbFdpZGdldC0+SGl0VGVzdChGV0xUb0NsaWVudChwb2ludCkpICE9IEZXTF9XaWRnZXRIaXQ6OlVua25vd24pIHsKLSAgICByZXR1cm4gRldMX1dpZGdldEhpdDo6Q2xpZW50OwotICB9Ci0KLSAgaWYgKCFHZXRSZWN0V2l0aG91dFJvdGF0ZSgpLkNvbnRhaW5zKHBvaW50KSkKLSAgICByZXR1cm4gRldMX1dpZGdldEhpdDo6VW5rbm93bjsKLSAgaWYgKG1fcnRDYXB0aW9uLkNvbnRhaW5zKHBvaW50KSkKLSAgICByZXR1cm4gRldMX1dpZGdldEhpdDo6VGl0bGViYXI7Ci0gIHJldHVybiBGV0xfV2lkZ2V0SGl0OjpDbGllbnQ7Ci19Ci0KLWJvb2wgQ1hGQV9GRlNpZ25hdHVyZTo6T25TZXRDdXJzb3IoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL3hmYV9mZnNpZ25hdHVyZS5oIGIveGZhL2Z4ZmEvYXBwL3hmYV9mZnNpZ25hdHVyZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzQzMjNmLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfZmZzaWduYXR1cmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhGQV9BUFBfWEZBX0ZGU0lHTkFUVVJFX0hfCi0jZGVmaW5lIFhGQV9GWEZBX0FQUF9YRkFfRkZTSUdOQVRVUkVfSF8KLQotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZmaWVsZC5oIgotCi1jbGFzcyBDWEZBX0ZGU2lnbmF0dXJlIGZpbmFsIDogcHVibGljIENYRkFfRkZGaWVsZCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDWEZBX0ZGU2lnbmF0dXJlKENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7Ci0gIH5DWEZBX0ZGU2lnbmF0dXJlKCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ1hGQV9GRkZpZWxkCi0gIHZvaWQgUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLAotICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cykgb3ZlcnJpZGU7Ci0gIGJvb2wgTG9hZFdpZGdldCgpIG92ZXJyaWRlOwotICBib29sIE9uTW91c2VFbnRlcigpIG92ZXJyaWRlOwotICBib29sIE9uTW91c2VFeGl0KCkgb3ZlcnJpZGU7Ci0gIGJvb2wgT25MQnV0dG9uRG93bih1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7Ci0gIGJvb2wgT25MQnV0dG9uVXAodWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOwotICBib29sIE9uTEJ1dHRvbkRibENsayh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7Ci0gIGJvb2wgT25Nb3VzZU1vdmUodWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOwotICBib29sIE9uTW91c2VXaGVlbCh1aW50MzJfdCBkd0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHpEZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnR5KSBvdmVycmlkZTsKLSAgYm9vbCBPblJCdXR0b25Eb3duKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKLSAgYm9vbCBPblJCdXR0b25VcCh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7Ci0gIGJvb2wgT25SQnV0dG9uRGJsQ2xrKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKLQotICBib29sIE9uS2V5RG93bih1aW50MzJfdCBkd0tleUNvZGUsIHVpbnQzMl90IGR3RmxhZ3MpIG92ZXJyaWRlOwotICBib29sIE9uS2V5VXAodWludDMyX3QgZHdLZXlDb2RlLCB1aW50MzJfdCBkd0ZsYWdzKSBvdmVycmlkZTsKLSAgYm9vbCBPbkNoYXIodWludDMyX3QgZHdDaGFyLCB1aW50MzJfdCBkd0ZsYWdzKSBvdmVycmlkZTsKLSAgRldMX1dpZGdldEhpdCBPbkhpdFRlc3QoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOwotICBib29sIE9uU2V0Q3Vyc29yKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYRkFfQVBQX1hGQV9GRlNJR05BVFVSRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL3hmYV9mZnN1YmZvcm0uY3BwIGIveGZhL2Z4ZmEvYXBwL3hmYV9mZnN1YmZvcm0uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjQ3OWY0Li4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfZmZzdWJmb3JtLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZzdWJmb3JtLmgiCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZhcHAuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZkb2MuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZwYWdldmlldy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZndpZGdldC5oIgotCi1DWEZBX0ZGU3ViRm9ybTo6Q1hGQV9GRlN1YkZvcm0oQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQotICAgIDogQ1hGQV9GRldpZGdldChwRGF0YUFjYykge30KLQotQ1hGQV9GRlN1YkZvcm06On5DWEZBX0ZGU3ViRm9ybSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAveGZhX2Zmc3ViZm9ybS5oIGIveGZhL2Z4ZmEvYXBwL3hmYV9mZnN1YmZvcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZiNzdhOC4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAveGZhX2Zmc3ViZm9ybS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEZBX0FQUF9YRkFfRkZTVUJGT1JNX0hfCi0jZGVmaW5lIFhGQV9GWEZBX0FQUF9YRkFfRkZTVUJGT1JNX0hfCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZwYWdldmlldy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZndpZGdldC5oIgotCi1jbGFzcyBDWEZBX0ZGU3ViRm9ybSA6IHB1YmxpYyBDWEZBX0ZGV2lkZ2V0IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfRkZTdWJGb3JtKENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7Ci0gIH5DWEZBX0ZGU3ViRm9ybSgpIG92ZXJyaWRlOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhGQV9BUFBfWEZBX0ZGU1VCRk9STV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL3hmYV9mZnRleHQuY3BwIGIveGZhL2Z4ZmEvYXBwL3hmYV9mZnRleHQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGQ3YWEzLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfZmZ0ZXh0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmdGV4dC5oIgotCi0jaW5jbHVkZSAieGZhL2Z3bC9md2xfd2lkZ2V0ZGVmLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9md2xfd2lkZ2V0aGl0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL2N4ZmFfbGlua3VzZXJkYXRhLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL2N4ZmFfcGllY2VsaW5lLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL2N4ZmFfdGV4dGxheW91dC5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZkcmF3LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV90ZXh0cGllY2UuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZhcHAuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZkb2MuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZwYWdldmlldy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZndpZGdldC5oIgotI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2NmeF9ncmFwaGljcy5oIgotCi1DWEZBX0ZGVGV4dDo6Q1hGQV9GRlRleHQoQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKSA6IENYRkFfRkZEcmF3KHBEYXRhQWNjKSB7fQotCi1DWEZBX0ZGVGV4dDo6fkNYRkFfRkZUZXh0KCkge30KLQotdm9pZCBDWEZBX0ZGVGV4dDo6UmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGF0dXMpIHsKLSAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpCi0gICAgcmV0dXJuOwotCi0gIENGWF9NYXRyaXggbXRSb3RhdGUgPSBHZXRSb3RhdGVNYXRyaXgoKTsKLSAgaWYgKHBNYXRyaXgpCi0gICAgbXRSb3RhdGUuQ29uY2F0KCpwTWF0cml4KTsKLQotICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCAmbXRSb3RhdGUsIGR3U3RhdHVzKTsKLQotICBDWEZBX1RleHRMYXlvdXQqIHBUZXh0TGF5b3V0ID0gbV9wRGF0YUFjYy0+R2V0VGV4dExheW91dCgpOwotICBpZiAoIXBUZXh0TGF5b3V0KQotICAgIHJldHVybjsKLQotICBDRlhfUmVuZGVyRGV2aWNlKiBwUmVuZGVyRGV2aWNlID0gcEdTLT5HZXRSZW5kZXJEZXZpY2UoKTsKLSAgQ0ZYX1JlY3RGIHJ0VGV4dCA9IEdldFJlY3RXaXRob3V0Um90YXRlKCk7Ci0gIGlmIChDWEZBX01hcmdpbiBtZ1dpZGdldCA9IG1fcERhdGFBY2MtPkdldE1hcmdpbigpKSB7Ci0gICAgQ1hGQV9MYXlvdXRJdGVtKiBwSXRlbSA9IHRoaXM7Ci0gICAgaWYgKCFwSXRlbS0+R2V0UHJldigpICYmICFwSXRlbS0+R2V0TmV4dCgpKSB7Ci0gICAgICBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKHJ0VGV4dCwgbWdXaWRnZXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBGWF9GTE9BVCBmTGVmdEluc2V0OwotICAgICAgRlhfRkxPQVQgZlJpZ2h0SW5zZXQ7Ci0gICAgICBGWF9GTE9BVCBmVG9wSW5zZXQgPSAwOwotICAgICAgRlhfRkxPQVQgZkJvdHRvbUluc2V0ID0gMDsKLSAgICAgIG1nV2lkZ2V0LkdldExlZnRJbnNldChmTGVmdEluc2V0KTsKLSAgICAgIG1nV2lkZ2V0LkdldFJpZ2h0SW5zZXQoZlJpZ2h0SW5zZXQpOwotICAgICAgaWYgKCFwSXRlbS0+R2V0UHJldigpKQotICAgICAgICBtZ1dpZGdldC5HZXRUb3BJbnNldChmVG9wSW5zZXQpOwotICAgICAgZWxzZSBpZiAoIXBJdGVtLT5HZXROZXh0KCkpCi0gICAgICAgIG1nV2lkZ2V0LkdldEJvdHRvbUluc2V0KGZCb3R0b21JbnNldCk7Ci0KLSAgICAgIHJ0VGV4dC5EZWZsYXRlKGZMZWZ0SW5zZXQsIGZUb3BJbnNldCwgZlJpZ2h0SW5zZXQsIGZCb3R0b21JbnNldCk7Ci0gICAgfQotICB9Ci0KLSAgQ0ZYX01hdHJpeCBtdCgxLCAwLCAwLCAxLCBydFRleHQubGVmdCwgcnRUZXh0LnRvcCk7Ci0gIENGWF9SZWN0RiBydENsaXAgPSBydFRleHQ7Ci0gIG10Um90YXRlLlRyYW5zZm9ybVJlY3QocnRDbGlwKTsKLSAgbXQuQ29uY2F0KG10Um90YXRlKTsKLSAgcFRleHRMYXlvdXQtPkRyYXdTdHJpbmcocFJlbmRlckRldmljZSwgbXQsIHJ0Q2xpcCwgR2V0SW5kZXgoKSk7Ci19Ci0KLWJvb2wgQ1hGQV9GRlRleHQ6OklzTG9hZGVkKCkgewotICBDWEZBX1RleHRMYXlvdXQqIHBUZXh0TGF5b3V0ID0gbV9wRGF0YUFjYy0+R2V0VGV4dExheW91dCgpOwotICByZXR1cm4gcFRleHRMYXlvdXQgJiYgIXBUZXh0TGF5b3V0LT5tX2JIYXNCbG9jazsKLX0KLWJvb2wgQ1hGQV9GRlRleHQ6OlBlcmZvcm1MYXlvdXQoKSB7Ci0gIENYRkFfRkZEcmF3OjpQZXJmb3JtTGF5b3V0KCk7Ci0gIENYRkFfVGV4dExheW91dCogcFRleHRMYXlvdXQgPSBtX3BEYXRhQWNjLT5HZXRUZXh0TGF5b3V0KCk7Ci0gIGlmICghcFRleHRMYXlvdXQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFwVGV4dExheW91dC0+bV9iSGFzQmxvY2spIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBwVGV4dExheW91dC0+bV9CbG9ja3MuUmVtb3ZlQWxsKCk7Ci0gIENYRkFfTGF5b3V0SXRlbSogcEl0ZW0gPSB0aGlzOwotICBpZiAoIXBJdGVtLT5HZXRQcmV2KCkgJiYgIXBJdGVtLT5HZXROZXh0KCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBwSXRlbSA9IHBJdGVtLT5HZXRGaXJzdCgpOwotICB3aGlsZSAocEl0ZW0pIHsKLSAgICBDRlhfUmVjdEYgcnRUZXh0ID0gcEl0ZW0tPkdldFJlY3QoZmFsc2UpOwotICAgIGlmIChDWEZBX01hcmdpbiBtZ1dpZGdldCA9IG1fcERhdGFBY2MtPkdldE1hcmdpbigpKSB7Ci0gICAgICBpZiAoIXBJdGVtLT5HZXRQcmV2KCkpIHsKLSAgICAgICAgRlhfRkxPQVQgZlRvcEluc2V0OwotICAgICAgICBtZ1dpZGdldC5HZXRUb3BJbnNldChmVG9wSW5zZXQpOwotICAgICAgICBydFRleHQuaGVpZ2h0IC09IGZUb3BJbnNldDsKLSAgICAgIH0gZWxzZSBpZiAoIXBJdGVtLT5HZXROZXh0KCkpIHsKLSAgICAgICAgRlhfRkxPQVQgZkJvdHRvbUluc2V0OwotICAgICAgICBtZ1dpZGdldC5HZXRCb3R0b21JbnNldChmQm90dG9tSW5zZXQpOwotICAgICAgICBydFRleHQuaGVpZ2h0IC09IGZCb3R0b21JbnNldDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcFRleHRMYXlvdXQtPkl0ZW1CbG9ja3MocnRUZXh0LCBwSXRlbS0+R2V0SW5kZXgoKSk7Ci0gICAgcEl0ZW0gPSBwSXRlbS0+R2V0TmV4dCgpOwotICB9Ci0gIHBUZXh0TGF5b3V0LT5tX2JIYXNCbG9jayA9IGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDWEZBX0ZGVGV4dDo6T25MQnV0dG9uRG93bih1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewotICBpZiAoIUdldFJlY3RXaXRob3V0Um90YXRlKCkuQ29udGFpbnMocG9pbnQpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBjb25zdCBGWF9XQ0hBUiogd3NVUkxDb250ZW50ID0gR2V0TGlua1VSTEF0UG9pbnQocG9pbnQpOwotICBpZiAoIXdzVVJMQ29udGVudCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgU2V0QnV0dG9uRG93bih0cnVlKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1hGQV9GRlRleHQ6Ok9uTW91c2VNb3ZlKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIHJldHVybiBHZXRSZWN0V2l0aG91dFJvdGF0ZSgpLkNvbnRhaW5zKHBvaW50KSAmJiAhIUdldExpbmtVUkxBdFBvaW50KHBvaW50KTsKLX0KLQotYm9vbCBDWEZBX0ZGVGV4dDo6T25MQnV0dG9uVXAodWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgaWYgKCFJc0J1dHRvbkRvd24oKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgU2V0QnV0dG9uRG93bihmYWxzZSk7Ci0gIGNvbnN0IEZYX1dDSEFSKiB3c1VSTENvbnRlbnQgPSBHZXRMaW5rVVJMQXRQb2ludChwb2ludCk7Ci0gIGlmICghd3NVUkxDb250ZW50KQotICAgIHJldHVybiBmYWxzZTsKLQotICBDWEZBX0ZGRG9jKiBwRG9jID0gR2V0RG9jKCk7Ci0gIHBEb2MtPkdldERvY0Vudmlyb25tZW50KCktPkdvdG9VUkwocERvYywgd3NVUkxDb250ZW50KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUZXTF9XaWRnZXRIaXQgQ1hGQV9GRlRleHQ6Ok9uSGl0VGVzdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewotICBpZiAoIUdldFJlY3RXaXRob3V0Um90YXRlKCkuQ29udGFpbnMocG9pbnQpKQotICAgIHJldHVybiBGV0xfV2lkZ2V0SGl0OjpVbmtub3duOwotICBpZiAoIUdldExpbmtVUkxBdFBvaW50KHBvaW50KSkKLSAgICByZXR1cm4gRldMX1dpZGdldEhpdDo6VW5rbm93bjsKLSAgcmV0dXJuIEZXTF9XaWRnZXRIaXQ6Okh5cGVyTGluazsKLX0KLQotY29uc3QgRlhfV0NIQVIqIENYRkFfRkZUZXh0OjpHZXRMaW5rVVJMQXRQb2ludChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewotICBDWEZBX1RleHRMYXlvdXQqIHBUZXh0TGF5b3V0ID0gbV9wRGF0YUFjYy0+R2V0VGV4dExheW91dCgpOwotICBpZiAoIXBUZXh0TGF5b3V0KQotICAgIHJldHVybiBudWxscHRyOwotCi0gIENGWF9SZWN0RiByZWN0ID0gR2V0UmVjdFdpdGhvdXRSb3RhdGUoKTsKLSAgZm9yIChjb25zdCBhdXRvJiBwUGllY2VMaW5lIDogKnBUZXh0TGF5b3V0LT5HZXRQaWVjZUxpbmVzKCkpIHsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHBQaWVjZSA6IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcykgewotICAgICAgaWYgKHBQaWVjZS0+cExpbmtEYXRhICYmCi0gICAgICAgICAgcFBpZWNlLT5ydFBpZWNlLkNvbnRhaW5zKHBvaW50IC0gcmVjdC5Ub3BMZWZ0KCkpKSB7Ci0gICAgICAgIHJldHVybiBwUGllY2UtPnBMaW5rRGF0YS0+R2V0TGlua1VSTCgpOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2FwcC94ZmFfZmZ0ZXh0LmggYi94ZmEvZnhmYS9hcHAveGZhX2ZmdGV4dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTUzODIxLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfZmZ0ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYRkFfQVBQX1hGQV9GRlRFWFRfSF8KLSNkZWZpbmUgWEZBX0ZYRkFfQVBQX1hGQV9GRlRFWFRfSF8KLQotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZkcmF3LmgiCi0KLWNsYXNzIENYRkFfRkZUZXh0IDogcHVibGljIENYRkFfRkZEcmF3IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfRkZUZXh0KENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7Ci0gIH5DWEZBX0ZGVGV4dCgpIG92ZXJyaWRlOwotCi0gIC8vIENYRkFfRkZXaWRnZXQKLSAgYm9vbCBPbkxCdXR0b25Eb3duKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKLSAgYm9vbCBPbkxCdXR0b25VcCh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7Ci0gIGJvb2wgT25Nb3VzZU1vdmUodWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOwotICBGV0xfV2lkZ2V0SGl0IE9uSGl0VGVzdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7Ci0gIHZvaWQgUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLAotICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cykgb3ZlcnJpZGU7Ci0gIGJvb2wgSXNMb2FkZWQoKSBvdmVycmlkZTsKLSAgYm9vbCBQZXJmb3JtTGF5b3V0KCkgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBjb25zdCBGWF9XQ0hBUiogR2V0TGlua1VSTEF0UG9pbnQoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhGQV9BUFBfWEZBX0ZGVEVYVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL3hmYV9mZnRleHRlZGl0LmNwcCBiL3hmYS9meGZhL2FwcC94ZmFfZmZ0ZXh0ZWRpdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NDgzOWYuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvYXBwL3hmYV9mZnRleHRlZGl0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY3NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmdGV4dGVkaXQuaCIKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9kYXRldGltZXBpY2tlci5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9lZGl0LmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX2V2ZW50Y2hlY2t3b3JkLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX2V2ZW50c2VsZWN0Y2hhbmdlZC5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9ldmVudHRleHRjaGFuZ2VkLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX2V2ZW50dmFsaWRhdGUuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfbWVzc2FnZWtpbGxmb2N1cy5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9tZXNzYWdlbW91c2UuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfbWVzc2FnZXNldGZvY3VzLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX25vdGVkcml2ZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmZmllbGQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2Z3bGFkYXB0ZXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX2xvY2FsZXZhbHVlLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmYXBwLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jdmlldy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZnBhZ2V2aWV3LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0LmgiCi0KLUNYRkFfRkZUZXh0RWRpdDo6Q1hGQV9GRlRleHRFZGl0KENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykKLSAgICA6IENYRkFfRkZGaWVsZChwRGF0YUFjYyksIG1fcE9sZERlbGVnYXRlKG51bGxwdHIpIHt9Ci0KLUNYRkFfRkZUZXh0RWRpdDo6fkNYRkFfRkZUZXh0RWRpdCgpIHsKLSAgaWYgKG1fcE5vcm1hbFdpZGdldCkgewotICAgIENGV0xfTm90ZURyaXZlciogcE5vdGVEcml2ZXIgPQotICAgICAgICBtX3BOb3JtYWxXaWRnZXQtPkdldE93bmVyQXBwKCktPkdldE5vdGVEcml2ZXIoKTsKLSAgICBwTm90ZURyaXZlci0+VW5yZWdpc3RlckV2ZW50VGFyZ2V0KG1fcE5vcm1hbFdpZGdldCk7Ci0gIH0KLX0KLQotYm9vbCBDWEZBX0ZGVGV4dEVkaXQ6OkxvYWRXaWRnZXQoKSB7Ci0gIENGV0xfRWRpdCogcEZXTEVkaXQgPSBuZXcgQ0ZXTF9FZGl0KAotICAgICAgR2V0RldMQXBwKCksIHBkZml1bTo6TWFrZVVuaXF1ZTxDRldMX1dpZGdldFByb3BlcnRpZXM+KCksIG51bGxwdHIpOwotICBtX3BOb3JtYWxXaWRnZXQgPSBwRldMRWRpdDsKLSAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRMYXlvdXRJdGVtKHRoaXMpOwotCi0gIENGV0xfTm90ZURyaXZlciogcE5vdGVEcml2ZXIgPQotICAgICAgbV9wTm9ybWFsV2lkZ2V0LT5HZXRPd25lckFwcCgpLT5HZXROb3RlRHJpdmVyKCk7Ci0gIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KG1fcE5vcm1hbFdpZGdldCwgbV9wTm9ybWFsV2lkZ2V0KTsKLQotICBtX3BPbGREZWxlZ2F0ZSA9IG1fcE5vcm1hbFdpZGdldC0+R2V0RGVsZWdhdGUoKTsKLSAgbV9wTm9ybWFsV2lkZ2V0LT5TZXREZWxlZ2F0ZSh0aGlzKTsKLSAgbV9wTm9ybWFsV2lkZ2V0LT5Mb2NrVXBkYXRlKCk7Ci0KLSAgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0OwotICBtX3BEYXRhQWNjLT5HZXRWYWx1ZSh3c1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7Ci0gIHBGV0xFZGl0LT5TZXRUZXh0KHdzVGV4dCk7Ci0gIG1fcE5vcm1hbFdpZGdldC0+VW5sb2NrVXBkYXRlKCk7Ci0gIHJldHVybiBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsKLX0KLXZvaWQgQ1hGQV9GRlRleHRFZGl0OjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIHsKLSAgQ0ZXTF9FZGl0KiBwV2lkZ2V0ID0gKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0OwotICBpZiAoIXBXaWRnZXQpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgdWludDMyX3QgZHdTdHlsZSA9IDA7Ci0gIHVpbnQzMl90IGR3RXh0ZW5kZWRTdHlsZSA9IEZXTF9TVFlMRUVYVF9FRFRfU2hvd1Njcm9sbGJhckZvY3VzIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhciB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9TVFlMRUVYVF9FRFRfTGFzdExpbmVIZWlnaHQ7Ci0gIGR3RXh0ZW5kZWRTdHlsZSB8PSBVcGRhdGVVSVByb3BlcnR5KCk7Ci0gIGlmIChtX3BEYXRhQWNjLT5Jc011bHRpTGluZSgpKSB7Ci0gICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfTXVsdGlMaW5lIHwgRldMX1NUWUxFRVhUX0VEVF9XYW50UmV0dXJuOwotICAgIGlmIChtX3BEYXRhQWNjLT5HZXRWZXJ0aWNhbFNjcm9sbFBvbGljeSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09mZikgewotICAgICAgZHdTdHlsZSB8PSBGV0xfV0dUU1RZTEVfVlNjcm9sbDsKLSAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX0F1dG9WU2Nyb2xsOwotICAgIH0KLSAgfSBlbHNlIGlmIChtX3BEYXRhQWNjLT5HZXRIb3Jpem9udGFsU2Nyb2xsUG9saWN5KCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT2ZmKSB7Ci0gICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfQXV0b0hTY3JvbGw7Ci0gIH0KLSAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4gfHwKLSAgICAgICFtX3BEYXRhQWNjLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkgewotICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5OwotICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX011bHRpTGluZTsKLSAgfQotICBYRkFfRWxlbWVudCBlVHlwZSA9IFhGQV9FbGVtZW50OjpVbmtub3duOwotICBpbnQzMl90IGlNYXhDaGFycyA9IG1fcERhdGFBY2MtPkdldE1heENoYXJzKGVUeXBlKTsKLSAgaWYgKGVUeXBlID09IFhGQV9FbGVtZW50OjpFeERhdGEpIHsKLSAgICBpTWF4Q2hhcnMgPSAwOwotICB9Ci0gIGludDMyX3QgaU51bUNlbGxzID0gbV9wRGF0YUFjYy0+R2V0TnVtYmVyT2ZDZWxscygpOwotICBpZiAoaU51bUNlbGxzID09IDApIHsKLSAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9Db21iVGV4dDsKLSAgICBwV2lkZ2V0LT5TZXRMaW1pdChpTWF4Q2hhcnMgPiAwID8gaU1heENoYXJzIDogMSk7Ci0gIH0gZWxzZSBpZiAoaU51bUNlbGxzID4gMCkgewotICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX0NvbWJUZXh0OwotICAgIHBXaWRnZXQtPlNldExpbWl0KGlOdW1DZWxscyk7Ci0gIH0gZWxzZSB7Ci0gICAgcFdpZGdldC0+U2V0TGltaXQoaU1heENoYXJzKTsKLSAgfQotICBkd0V4dGVuZGVkU3R5bGUgfD0gR2V0QWxpZ25tZW50KCk7Ci0gIG1fcE5vcm1hbFdpZGdldC0+TW9kaWZ5U3R5bGVzKGR3U3R5bGUsIDB4RkZGRkZGRkYpOwotICBtX3BOb3JtYWxXaWRnZXQtPk1vZGlmeVN0eWxlc0V4KGR3RXh0ZW5kZWRTdHlsZSwgMHhGRkZGRkZGRik7Ci19Ci0KLWJvb2wgQ1hGQV9GRlRleHRFZGl0OjpPbkxCdXR0b25Eb3duKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIGlmICghUHRJbkFjdGl2ZVJlY3QocG9pbnQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCFJc0ZvY3VzZWQoKSkgewotICAgIG1fZHdTdGF0dXMgfD0gWEZBX1dpZGdldFN0YXR1c19Gb2N1c2VkOwotICAgIFVwZGF0ZUZXTERhdGEoKTsKLSAgICBBZGRJbnZhbGlkYXRlUmVjdCgpOwotICB9Ci0KLSAgU2V0QnV0dG9uRG93bih0cnVlKTsKLSAgQ0ZXTF9NZXNzYWdlTW91c2UgbXMobnVsbHB0ciwgbV9wTm9ybWFsV2lkZ2V0KTsKLSAgbXMubV9kd0NtZCA9IEZXTF9Nb3VzZUNvbW1hbmQ6OkxlZnRCdXR0b25Eb3duOwotICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOwotICBtcy5tX3BvcyA9IEZXTFRvQ2xpZW50KHBvaW50KTsKLSAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uUkJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4pCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoIVB0SW5BY3RpdmVSZWN0KHBvaW50KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmICghSXNGb2N1c2VkKCkpIHsKLSAgICBtX2R3U3RhdHVzIHw9IFhGQV9XaWRnZXRTdGF0dXNfRm9jdXNlZDsKLSAgICBVcGRhdGVGV0xEYXRhKCk7Ci0gICAgQWRkSW52YWxpZGF0ZVJlY3QoKTsKLSAgfQotCi0gIFNldEJ1dHRvbkRvd24odHJ1ZSk7Ci0gIENGV0xfTWVzc2FnZU1vdXNlIG1zKG51bGxwdHIsIG51bGxwdHIpOwotICBtcy5tX2R3Q21kID0gRldMX01vdXNlQ29tbWFuZDo6UmlnaHRCdXR0b25Eb3duOwotICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOwotICBtcy5tX3BvcyA9IEZXTFRvQ2xpZW50KHBvaW50KTsKLSAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uUkJ1dHRvblVwKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIGlmICghQ1hGQV9GRkZpZWxkOjpPblJCdXR0b25VcChkd0ZsYWdzLCBwb2ludCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIEdldERvYygpLT5HZXREb2NFbnZpcm9ubWVudCgpLT5Qb3B1cE1lbnUodGhpcywgcG9pbnQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uU2V0Rm9jdXMoQ1hGQV9GRldpZGdldCogcE9sZFdpZGdldCkgewotICBtX2R3U3RhdHVzICY9IH5YRkFfV2lkZ2V0U3RhdHVzX1RleHRFZGl0VmFsdWVDaGFuZ2VkOwotICBpZiAoIUlzRm9jdXNlZCgpKSB7Ci0gICAgbV9kd1N0YXR1cyB8PSBYRkFfV2lkZ2V0U3RhdHVzX0ZvY3VzZWQ7Ci0gICAgVXBkYXRlRldMRGF0YSgpOwotICAgIEFkZEludmFsaWRhdGVSZWN0KCk7Ci0gIH0KLSAgQ1hGQV9GRldpZGdldDo6T25TZXRGb2N1cyhwT2xkV2lkZ2V0KTsKLSAgQ0ZXTF9NZXNzYWdlU2V0Rm9jdXMgbXMobnVsbHB0ciwgbV9wTm9ybWFsV2lkZ2V0KTsKLSAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOwotICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgQ1hGQV9GRlRleHRFZGl0OjpPbktpbGxGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwTmV3V2lkZ2V0KSB7Ci0gIENGV0xfTWVzc2FnZUtpbGxGb2N1cyBtcyhudWxscHRyLCBtX3BOb3JtYWxXaWRnZXQpOwotICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7Ci0gIG1fZHdTdGF0dXMgJj0gflhGQV9XaWRnZXRTdGF0dXNfRm9jdXNlZDsKLSAgU2V0RWRpdFNjcm9sbE9mZnNldCgpOwotICBQcm9jZXNzQ29tbWl0dGVkRGF0YSgpOwotICBVcGRhdGVGV0xEYXRhKCk7Ci0gIEFkZEludmFsaWRhdGVSZWN0KCk7Ci0gIENYRkFfRkZXaWRnZXQ6Ok9uS2lsbEZvY3VzKHBOZXdXaWRnZXQpOwotICBtX2R3U3RhdHVzICY9IH5YRkFfV2lkZ2V0U3RhdHVzX1RleHRFZGl0VmFsdWVDaGFuZ2VkOwotICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgQ1hGQV9GRlRleHRFZGl0OjpDb21taXREYXRhKCkgewotICBDRlhfV2lkZVN0cmluZyB3c1RleHQgPSBzdGF0aWNfY2FzdDxDRldMX0VkaXQqPihtX3BOb3JtYWxXaWRnZXQpLT5HZXRUZXh0KCk7Ci0gIGlmIChtX3BEYXRhQWNjLT5TZXRWYWx1ZSh3c1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCkpIHsKLSAgICBtX3BEYXRhQWNjLT5VcGRhdGVVSURpc3BsYXkodGhpcyk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgVmFsaWRhdGVOdW1iZXJGaWVsZCh3c1RleHQpOwotICByZXR1cm4gZmFsc2U7Ci19Ci12b2lkIENYRkFfRkZUZXh0RWRpdDo6VmFsaWRhdGVOdW1iZXJGaWVsZChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7Ci0gIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gR2V0RGF0YUFjYygpOwotICBpZiAocEFjYyAmJiBwQWNjLT5HZXRVSVR5cGUoKSA9PSBYRkFfRWxlbWVudDo6TnVtZXJpY0VkaXQpIHsKLSAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBHZXRBcHAoKS0+R2V0QXBwUHJvdmlkZXIoKTsKLSAgICBpZiAocEFwcFByb3ZpZGVyKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c1NvbUZpZWxkOwotICAgICAgcEFjYy0+R2V0Tm9kZSgpLT5HZXRTT01FeHByZXNzaW9uKHdzU29tRmllbGQpOwotCi0gICAgICBDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2U7Ci0gICAgICB3c01lc3NhZ2UuRm9ybWF0KEwiJXMgY2FuIG5vdCBjb250YWluICVzIiwgd3NUZXh0LmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgIHdzU29tRmllbGQuY19zdHIoKSk7Ci0gICAgICBwQXBwUHJvdmlkZXItPk1zZ0JveCh3c01lc3NhZ2UsIHBBcHBQcm92aWRlci0+R2V0QXBwVGl0bGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9NQklDT05fRXJyb3IsIFhGQV9NQl9PSyk7Ci0gICAgfQotICB9Ci19Ci1ib29sIENYRkFfRkZUZXh0RWRpdDo6SXNEYXRhQ2hhbmdlZCgpIHsKLSAgcmV0dXJuIChtX2R3U3RhdHVzICYgWEZBX1dpZGdldFN0YXR1c19UZXh0RWRpdFZhbHVlQ2hhbmdlZCkgIT0gMDsKLX0KLXVpbnQzMl90IENYRkFfRkZUZXh0RWRpdDo6R2V0QWxpZ25tZW50KCkgewotICB1aW50MzJfdCBkd0V4dGVuZGVkU3R5bGUgPSAwOwotICBpZiAoQ1hGQV9QYXJhIHBhcmEgPSBtX3BEYXRhQWNjLT5HZXRQYXJhKCkpIHsKLSAgICBpbnQzMl90IGlIb3J6ID0gcGFyYS5HZXRIb3Jpem9udGFsQWxpZ24oKTsKLSAgICBzd2l0Y2ggKGlIb3J6KSB7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlcjoKLSAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfSENlbnRlcjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnk6Ci0gICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX0p1c3RpZmllZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnlBbGw6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SYWRpeDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0OgotICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9IRmFyOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX0hOZWFyOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaW50MzJfdCBpVmVydCA9IHBhcmEuR2V0VmVydGljYWxBbGlnbigpOwotICAgIHN3aXRjaCAoaVZlcnQpIHsKLSAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlOgotICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9WQ2VudGVyOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tOgotICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9WRmFyOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX1ZOZWFyOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGR3RXh0ZW5kZWRTdHlsZTsKLX0KLWJvb2wgQ1hGQV9GRlRleHRFZGl0OjpVcGRhdGVGV0xEYXRhKCkgewotICBpZiAoIW1fcE5vcm1hbFdpZGdldCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBYRkFfVkFMVUVQSUNUVVJFIGVUeXBlID0gWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5OwotICBpZiAoSXNGb2N1c2VkKCkpIHsKLSAgICBlVHlwZSA9IFhGQV9WQUxVRVBJQ1RVUkVfRWRpdDsKLSAgfQotICBib29sIGJVcGRhdGUgPSBmYWxzZTsKLSAgaWYgKG1fcERhdGFBY2MtPkdldFVJVHlwZSgpID09IFhGQV9FbGVtZW50OjpUZXh0RWRpdCAmJgotICAgICAgbV9wRGF0YUFjYy0+R2V0TnVtYmVyT2ZDZWxscygpIDwgMCkgewotICAgIFhGQV9FbGVtZW50IGVsZW1lbnRUeXBlID0gWEZBX0VsZW1lbnQ6OlVua25vd247Ci0gICAgaW50MzJfdCBpTWF4Q2hhcnMgPSBtX3BEYXRhQWNjLT5HZXRNYXhDaGFycyhlbGVtZW50VHlwZSk7Ci0gICAgaWYgKGVsZW1lbnRUeXBlID09IFhGQV9FbGVtZW50OjpFeERhdGEpIHsKLSAgICAgIGlNYXhDaGFycyA9IGVUeXBlID09IFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCA/IGlNYXhDaGFycyA6IDA7Ci0gICAgfQotICAgIGlmICgoKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0KS0+R2V0TGltaXQoKSAhPSBpTWF4Q2hhcnMpIHsKLSAgICAgICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpLT5TZXRMaW1pdChpTWF4Q2hhcnMpOwotICAgICAgYlVwZGF0ZSA9IHRydWU7Ci0gICAgfQotICB9Ci0gIGlmIChtX3BEYXRhQWNjLT5HZXRVSVR5cGUoKSA9PSBYRkFfRWxlbWVudDo6QmFyY29kZSkgewotICAgIGludDMyX3QgbkRhdGFMZW4gPSAwOwotICAgIGlmIChlVHlwZSA9PSBYRkFfVkFMVUVQSUNUVVJFX0VkaXQpCi0gICAgICBtX3BEYXRhQWNjLT5HZXRCYXJjb2RlQXR0cmlidXRlX0RhdGFMZW5ndGgobkRhdGFMZW4pOwotICAgIHN0YXRpY19jYXN0PENGV0xfRWRpdCo+KG1fcE5vcm1hbFdpZGdldCktPlNldExpbWl0KG5EYXRhTGVuKTsKLSAgICBiVXBkYXRlID0gdHJ1ZTsKLSAgfQotICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7Ci0gIG1fcERhdGFBY2MtPkdldFZhbHVlKHdzVGV4dCwgZVR5cGUpOwotICBDRlhfV2lkZVN0cmluZyB3c09sZFRleHQgPQotICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9FZGl0Kj4obV9wTm9ybWFsV2lkZ2V0KS0+R2V0VGV4dCgpOwotICBpZiAod3NUZXh0ICE9IHdzT2xkVGV4dCB8fCAoZVR5cGUgPT0gWEZBX1ZBTFVFUElDVFVSRV9FZGl0ICYmIGJVcGRhdGUpKSB7Ci0gICAgKChDRldMX0VkaXQqKW1fcE5vcm1hbFdpZGdldCktPlNldFRleHQod3NUZXh0KTsKLSAgICBiVXBkYXRlID0gdHJ1ZTsKLSAgfQotICBpZiAoYlVwZGF0ZSkgewotICAgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci12b2lkIENYRkFfRkZUZXh0RWRpdDo6T25UZXh0Q2hhbmdlZChDRldMX1dpZGdldCogcFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NoYW5nZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQcmV2VGV4dCkgewotICBtX2R3U3RhdHVzIHw9IFhGQV9XaWRnZXRTdGF0dXNfVGV4dEVkaXRWYWx1ZUNoYW5nZWQ7Ci0gIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07Ci0gIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX0NoYW5nZTsKLSAgZVBhcmFtLm1fd3NDaGFuZ2UgPSB3c0NoYW5nZWQ7Ci0gIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOwotICBlUGFyYW0ubV93c1ByZXZUZXh0ID0gd3NQcmV2VGV4dDsKLSAgQ0ZXTF9FZGl0KiBwRWRpdCA9ICgoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQpOwotICBpZiAobV9wRGF0YUFjYy0+R2V0VUlUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkRhdGVUaW1lRWRpdCkgewotICAgIENGV0xfRGF0ZVRpbWVQaWNrZXIqIHBEYXRlVGltZSA9IChDRldMX0RhdGVUaW1lUGlja2VyKilwRWRpdDsKLSAgICBlUGFyYW0ubV93c05ld1RleHQgPSBwRGF0ZVRpbWUtPkdldEVkaXRUZXh0KCk7Ci0gICAgaW50MzJfdCBpU2VscyA9IHBEYXRlVGltZS0+Q291bnRTZWxSYW5nZXMoKTsKLSAgICBpZiAoaVNlbHMpIHsKLSAgICAgIGVQYXJhbS5tX2lTZWxFbmQgPSBwRGF0ZVRpbWUtPkdldFNlbFJhbmdlKDAsICZlUGFyYW0ubV9pU2VsU3RhcnQpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBlUGFyYW0ubV93c05ld1RleHQgPSBwRWRpdC0+R2V0VGV4dCgpOwotICAgIGludDMyX3QgaVNlbHMgPSBwRWRpdC0+Q291bnRTZWxSYW5nZXMoKTsKLSAgICBpZiAoaVNlbHMpIHsKLSAgICAgIGVQYXJhbS5tX2lTZWxFbmQgPSBwRWRpdC0+R2V0U2VsUmFuZ2UoMCwgJmVQYXJhbS5tX2lTZWxTdGFydCk7Ci0gICAgfQotICB9Ci0gIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9DaGFuZ2UsICZlUGFyYW0pOwotfQotdm9pZCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uVGV4dEZ1bGwoQ0ZXTF9XaWRnZXQqIHBXaWRnZXQpIHsKLSAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsKLSAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfRnVsbDsKLSAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7Ci0gIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9GdWxsLCAmZVBhcmFtKTsKLX0KLQotYm9vbCBDWEZBX0ZGVGV4dEVkaXQ6OkNoZWNrV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNXb3JkKSB7Ci0gIGlmIChzV29yZC5Jc0VtcHR5KCkgfHwgbV9wRGF0YUFjYy0+R2V0VUlUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlRleHRFZGl0KQotICAgIHJldHVybiB0cnVlOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQ1hGQV9GRlRleHRFZGl0OjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsKLSAgbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOwotfQotCi12b2lkIENYRkFfRkZUZXh0RWRpdDo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSB7Ci0gIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsKLSAgc3dpdGNoIChwRXZlbnQtPkdldFR5cGUoKSkgewotICAgIGNhc2UgQ0ZXTF9FdmVudDo6VHlwZTo6VGV4dENoYW5nZWQ6IHsKLSAgICAgIENGV0xfRXZlbnRUZXh0Q2hhbmdlZCogZXZlbnQgPQotICAgICAgICAgIHN0YXRpY19jYXN0PENGV0xfRXZlbnRUZXh0Q2hhbmdlZCo+KHBFdmVudCk7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c0NoYW5nZTsKLSAgICAgIE9uVGV4dENoYW5nZWQobV9wTm9ybWFsV2lkZ2V0LCB3c0NoYW5nZSwgZXZlbnQtPndzUHJldlRleHQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgQ0ZXTF9FdmVudDo6VHlwZTo6VGV4dEZ1bGw6IHsKLSAgICAgIE9uVGV4dEZ1bGwobV9wTm9ybWFsV2lkZ2V0KTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIENGV0xfRXZlbnQ6OlR5cGU6OkNoZWNrV29yZDogewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3N0cihMIkZXTF9FVkVOVF9EVFBfU2VsZWN0Q2hhbmdlZCIpOwotICAgICAgQ0ZXTF9FdmVudENoZWNrV29yZCogZXZlbnQgPSBzdGF0aWNfY2FzdDxDRldMX0V2ZW50Q2hlY2tXb3JkKj4ocEV2ZW50KTsKLSAgICAgIGV2ZW50LT5iQ2hlY2tXb3JkID0gQ2hlY2tXb3JkKGV2ZW50LT5ic1dvcmQuQXNTdHJpbmdDKCkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICBtX3BPbGREZWxlZ2F0ZS0+T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsKLX0KLQotdm9pZCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uRHJhd1dpZGdldChDRlhfR3JhcGhpY3MqIHBHcmFwaGljcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBtX3BPbGREZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBHcmFwaGljcywgcE1hdHJpeCk7Ci19Ci0KLUNYRkFfRkZOdW1lcmljRWRpdDo6Q1hGQV9GRk51bWVyaWNFZGl0KENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykKLSAgICA6IENYRkFfRkZUZXh0RWRpdChwRGF0YUFjYykge30KLQotQ1hGQV9GRk51bWVyaWNFZGl0Ojp+Q1hGQV9GRk51bWVyaWNFZGl0KCkge30KLQotYm9vbCBDWEZBX0ZGTnVtZXJpY0VkaXQ6OkxvYWRXaWRnZXQoKSB7Ci0gIENGV0xfRWRpdCogcFdpZGdldCA9IG5ldyBDRldMX0VkaXQoCi0gICAgICBHZXRGV0xBcHAoKSwgcGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfV2lkZ2V0UHJvcGVydGllcz4oKSwgbnVsbHB0cik7Ci0gIG1fcE5vcm1hbFdpZGdldCA9IHBXaWRnZXQ7Ci0KLSAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRMYXlvdXRJdGVtKHRoaXMpOwotICBDRldMX05vdGVEcml2ZXIqIHBOb3RlRHJpdmVyID0KLSAgICAgIG1fcE5vcm1hbFdpZGdldC0+R2V0T3duZXJBcHAoKS0+R2V0Tm90ZURyaXZlcigpOwotICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChtX3BOb3JtYWxXaWRnZXQsIG1fcE5vcm1hbFdpZGdldCk7Ci0KLSAgbV9wT2xkRGVsZWdhdGUgPSBtX3BOb3JtYWxXaWRnZXQtPkdldERlbGVnYXRlKCk7Ci0gIG1fcE5vcm1hbFdpZGdldC0+U2V0RGVsZWdhdGUodGhpcyk7Ci0gIG1fcE5vcm1hbFdpZGdldC0+TG9ja1VwZGF0ZSgpOwotCi0gIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsKLSAgbV9wRGF0YUFjYy0+R2V0VmFsdWUod3NUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOwotICBwV2lkZ2V0LT5TZXRUZXh0KHdzVGV4dCk7Ci0gIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7Ci0gIG1fcE5vcm1hbFdpZGdldC0+VW5sb2NrVXBkYXRlKCk7Ci0gIHJldHVybiBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsKLX0KLXZvaWQgQ1hGQV9GRk51bWVyaWNFZGl0OjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIHsKLSAgQ0ZXTF9FZGl0KiBwV2lkZ2V0ID0gKENGV0xfRWRpdCopbV9wTm9ybWFsV2lkZ2V0OwotICBpZiAoIXBXaWRnZXQpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgdWludDMyX3QgZHdFeHRlbmRlZFN0eWxlID0KLSAgICAgIEZXTF9TVFlMRUVYVF9FRFRfU2hvd1Njcm9sbGJhckZvY3VzIHwgRldMX1NUWUxFRVhUX0VEVF9PdXRlclNjcm9sbGJhciB8Ci0gICAgICBGV0xfU1RZTEVFWFRfRURUX1ZhbGlkYXRlIHwgRldMX1NUWUxFRVhUX0VEVF9OdW1iZXIgfAotICAgICAgRldMX1NUWUxFRVhUX0VEVF9MYXN0TGluZUhlaWdodDsKLSAgZHdFeHRlbmRlZFN0eWxlIHw9IFVwZGF0ZVVJUHJvcGVydHkoKTsKLSAgaWYgKG1fcERhdGFBY2MtPkdldEhvcml6b250YWxTY3JvbGxQb2xpY3koKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PZmYpIHsKLSAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9BdXRvSFNjcm9sbDsKLSAgfQotICBpbnQzMl90IGlOdW1DZWxscyA9IG1fcERhdGFBY2MtPkdldE51bWJlck9mQ2VsbHMoKTsKLSAgaWYgKGlOdW1DZWxscyA+IDApIHsKLSAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9Db21iVGV4dDsKLSAgICBwV2lkZ2V0LT5TZXRMaW1pdChpTnVtQ2VsbHMpOwotICB9Ci0gIGR3RXh0ZW5kZWRTdHlsZSB8PSBHZXRBbGlnbm1lbnQoKTsKLSAgaWYgKG1fcERhdGFBY2MtPkdldEFjY2VzcygpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09wZW4gfHwKLSAgICAgICFtX3BEYXRhQWNjLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkgewotICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5OwotICB9Ci0gIG1fcE5vcm1hbFdpZGdldC0+TW9kaWZ5U3R5bGVzRXgoZHdFeHRlbmRlZFN0eWxlLCAweEZGRkZGRkZGKTsKLX0KLQotdm9pZCBDWEZBX0ZGTnVtZXJpY0VkaXQ6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgewotICBpZiAocEV2ZW50LT5HZXRUeXBlKCkgPT0gQ0ZXTF9FdmVudDo6VHlwZTo6VmFsaWRhdGUpIHsKLSAgICBDRldMX0V2ZW50VmFsaWRhdGUqIGV2ZW50ID0gc3RhdGljX2Nhc3Q8Q0ZXTF9FdmVudFZhbGlkYXRlKj4ocEV2ZW50KTsKLSAgICBldmVudC0+YlZhbGlkYXRlID0gT25WYWxpZGF0ZShtX3BOb3JtYWxXaWRnZXQsIGV2ZW50LT53c0luc2VydCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfRkZUZXh0RWRpdDo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsKLX0KLQotYm9vbCBDWEZBX0ZGTnVtZXJpY0VkaXQ6Ok9uVmFsaWRhdGUoQ0ZXTF9XaWRnZXQqIHBXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NUZXh0KSB7Ci0gIENGWF9XaWRlU3RyaW5nIHdzUGF0dGVybjsKLSAgbV9wRGF0YUFjYy0+R2V0UGljdHVyZUNvbnRlbnQod3NQYXR0ZXJuLCBYRkFfVkFMVUVQSUNUVVJFX0VkaXQpOwotICBpZiAoIXdzUGF0dGVybi5Jc0VtcHR5KCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpbnQzMl90IGlMZWFkcyA9IDA7Ci0gIG1fcERhdGFBY2MtPkdldExlYWREaWdpdHMoaUxlYWRzKTsKLSAgaW50MzJfdCBpRnJhY3MgPSAwOwotICBtX3BEYXRhQWNjLT5HZXRGcmFjRGlnaXRzKGlGcmFjcyk7Ci0gIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0OwotICBDWEZBX0xvY2FsZVZhbHVlIHdpZGdldFZhbHVlID0gWEZBX0dldExvY2FsZVZhbHVlKG1fcERhdGFBY2MpOwotICB3aWRnZXRWYWx1ZS5HZXROdW1iZXJpY0Zvcm1hdCh3c0Zvcm1hdCwgaUxlYWRzLCBpRnJhY3MpOwotICByZXR1cm4gd2lkZ2V0VmFsdWUuVmFsaWRhdGVOdW1lcmljVGVtcCh3c1RleHQsIHdzRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BEYXRhQWNjLT5HZXRMb2NhbCgpKTsKLX0KLQotQ1hGQV9GRlBhc3N3b3JkRWRpdDo6Q1hGQV9GRlBhc3N3b3JkRWRpdChDWEZBX1dpZGdldEFjYyogcERhdGFBY2MpCi0gICAgOiBDWEZBX0ZGVGV4dEVkaXQocERhdGFBY2MpIHt9Ci0KLUNYRkFfRkZQYXNzd29yZEVkaXQ6On5DWEZBX0ZGUGFzc3dvcmRFZGl0KCkge30KLQotYm9vbCBDWEZBX0ZGUGFzc3dvcmRFZGl0OjpMb2FkV2lkZ2V0KCkgewotICBDRldMX0VkaXQqIHBXaWRnZXQgPSBuZXcgQ0ZXTF9FZGl0KAotICAgICAgR2V0RldMQXBwKCksIHBkZml1bTo6TWFrZVVuaXF1ZTxDRldMX1dpZGdldFByb3BlcnRpZXM+KCksIG51bGxwdHIpOwotICBtX3BOb3JtYWxXaWRnZXQgPSBwV2lkZ2V0OwotICBtX3BOb3JtYWxXaWRnZXQtPlNldExheW91dEl0ZW0odGhpcyk7Ci0KLSAgQ0ZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9Ci0gICAgICBtX3BOb3JtYWxXaWRnZXQtPkdldE93bmVyQXBwKCktPkdldE5vdGVEcml2ZXIoKTsKLSAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQobV9wTm9ybWFsV2lkZ2V0LCBtX3BOb3JtYWxXaWRnZXQpOwotCi0gIG1fcE9sZERlbGVnYXRlID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXREZWxlZ2F0ZSgpOwotICBtX3BOb3JtYWxXaWRnZXQtPlNldERlbGVnYXRlKHRoaXMpOwotICBtX3BOb3JtYWxXaWRnZXQtPkxvY2tVcGRhdGUoKTsKLQotICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7Ci0gIG1fcERhdGFBY2MtPkdldFZhbHVlKHdzVGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsKLSAgcFdpZGdldC0+U2V0VGV4dCh3c1RleHQpOwotICBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOwotICBtX3BOb3JtYWxXaWRnZXQtPlVubG9ja1VwZGF0ZSgpOwotICByZXR1cm4gQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCk7Ci19Ci12b2lkIENYRkFfRkZQYXNzd29yZEVkaXQ6OlVwZGF0ZVdpZGdldFByb3BlcnR5KCkgewotICBDRldMX0VkaXQqIHBXaWRnZXQgPSAoQ0ZXTF9FZGl0KiltX3BOb3JtYWxXaWRnZXQ7Ci0gIGlmICghcFdpZGdldCkgewotICAgIHJldHVybjsKLSAgfQotICB1aW50MzJfdCBkd0V4dGVuZGVkU3R5bGUgPQotICAgICAgRldMX1NUWUxFRVhUX0VEVF9TaG93U2Nyb2xsYmFyRm9jdXMgfCBGV0xfU1RZTEVFWFRfRURUX091dGVyU2Nyb2xsYmFyIHwKLSAgICAgIEZXTF9TVFlMRUVYVF9FRFRfUGFzc3dvcmQgfCBGV0xfU1RZTEVFWFRfRURUX0xhc3RMaW5lSGVpZ2h0OwotICBkd0V4dGVuZGVkU3R5bGUgfD0gVXBkYXRlVUlQcm9wZXJ0eSgpOwotICBDRlhfV2lkZVN0cmluZyB3c1Bhc3NXb3JkOwotICBtX3BEYXRhQWNjLT5HZXRQYXNzd29yZENoYXIod3NQYXNzV29yZCk7Ci0gIGlmICghd3NQYXNzV29yZC5Jc0VtcHR5KCkpIHsKLSAgICBwV2lkZ2V0LT5TZXRBbGlhc0NoYXIod3NQYXNzV29yZC5HZXRBdCgwKSk7Ci0gIH0KLSAgaWYgKG1fcERhdGFBY2MtPkdldEhvcml6b250YWxTY3JvbGxQb2xpY3koKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PZmYpIHsKLSAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9BdXRvSFNjcm9sbDsKLSAgfQotICBpZiAobV9wRGF0YUFjYy0+R2V0QWNjZXNzKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3BlbiB8fAotICAgICAgIW1fcERhdGFBY2MtPkdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKSB7Ci0gICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHk7Ci0gIH0KLSAgZHdFeHRlbmRlZFN0eWxlIHw9IEdldEFsaWdubWVudCgpOwotICBtX3BOb3JtYWxXaWRnZXQtPk1vZGlmeVN0eWxlc0V4KGR3RXh0ZW5kZWRTdHlsZSwgMHhGRkZGRkZGRik7Ci19Ci1DWEZBX0ZGRGF0ZVRpbWVFZGl0OjpDWEZBX0ZGRGF0ZVRpbWVFZGl0KENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYykKLSAgICA6IENYRkFfRkZUZXh0RWRpdChwRGF0YUFjYykge30KLQotQ1hGQV9GRkRhdGVUaW1lRWRpdDo6fkNYRkFfRkZEYXRlVGltZUVkaXQoKSB7fQotCi1DRlhfUmVjdEYgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6R2V0QkJveCh1aW50MzJfdCBkd1N0YXR1cywgYm9vbCBiRHJhd0ZvY3VzKSB7Ci0gIGlmIChiRHJhd0ZvY3VzKQotICAgIHJldHVybiBDRlhfUmVjdEYoKTsKLSAgcmV0dXJuIENYRkFfRkZXaWRnZXQ6OkdldEJCb3goZHdTdGF0dXMpOwotfQotCi1ib29sIENYRkFfRkZEYXRlVGltZUVkaXQ6OlB0SW5BY3RpdmVSZWN0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIHJldHVybiBtX3BOb3JtYWxXaWRnZXQgJiYKLSAgICAgICAgIHN0YXRpY19jYXN0PENGV0xfRGF0ZVRpbWVQaWNrZXIqPihtX3BOb3JtYWxXaWRnZXQpCi0gICAgICAgICAgICAgLT5HZXRCQm94KCkKLSAgICAgICAgICAgICAuQ29udGFpbnMocG9pbnQpOwotfQotCi1ib29sIENYRkFfRkZEYXRlVGltZUVkaXQ6OkxvYWRXaWRnZXQoKSB7Ci0gIENGV0xfRGF0ZVRpbWVQaWNrZXIqIHBXaWRnZXQgPSBuZXcgQ0ZXTF9EYXRlVGltZVBpY2tlcihHZXRGV0xBcHAoKSk7Ci0gIG1fcE5vcm1hbFdpZGdldCA9IHBXaWRnZXQ7Ci0gIG1fcE5vcm1hbFdpZGdldC0+U2V0TGF5b3V0SXRlbSh0aGlzKTsKLSAgQ0ZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9Ci0gICAgICBtX3BOb3JtYWxXaWRnZXQtPkdldE93bmVyQXBwKCktPkdldE5vdGVEcml2ZXIoKTsKLSAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQobV9wTm9ybWFsV2lkZ2V0LCBtX3BOb3JtYWxXaWRnZXQpOwotCi0gIG1fcE9sZERlbGVnYXRlID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXREZWxlZ2F0ZSgpOwotICBtX3BOb3JtYWxXaWRnZXQtPlNldERlbGVnYXRlKHRoaXMpOwotICBtX3BOb3JtYWxXaWRnZXQtPkxvY2tVcGRhdGUoKTsKLQotICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7Ci0gIG1fcERhdGFBY2MtPkdldFZhbHVlKHdzVGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsKLSAgcFdpZGdldC0+U2V0RWRpdFRleHQod3NUZXh0KTsKLSAgaWYgKENYRkFfVmFsdWUgdmFsdWUgPSBtX3BEYXRhQWNjLT5HZXRGb3JtVmFsdWUoKSkgewotICAgIHN3aXRjaCAodmFsdWUuR2V0Q2hpbGRWYWx1ZUNsYXNzSUQoKSkgewotICAgICAgY2FzZSBYRkFfRWxlbWVudDo6RGF0ZTogewotICAgICAgICBpZiAoIXdzVGV4dC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIGxjVmFsdWUgPSBYRkFfR2V0TG9jYWxlVmFsdWUobV9wRGF0YUFjYyk7Ci0gICAgICAgICAgQ0ZYX1VuaXRpbWUgZGF0ZSA9IGxjVmFsdWUuR2V0RGF0ZSgpOwotICAgICAgICAgIGlmICgoRlhfVU5JVElNRSlkYXRlICE9IDApIHsKLSAgICAgICAgICAgIHBXaWRnZXQtPlNldEN1clNlbChkYXRlLkdldFllYXIoKSwgZGF0ZS5HZXRNb250aCgpLCBkYXRlLkdldERheSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsKLSAgbV9wTm9ybWFsV2lkZ2V0LT5VbmxvY2tVcGRhdGUoKTsKLSAgcmV0dXJuIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpOwotfQotdm9pZCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIHsKLSAgQ0ZXTF9EYXRlVGltZVBpY2tlciogcFdpZGdldCA9IChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQ7Ci0gIGlmICghcFdpZGdldCkgewotICAgIHJldHVybjsKLSAgfQotICB1aW50MzJfdCBkd0V4dGVuZGVkU3R5bGUgPSBGV0xfU1RZTEVFWFRfRFRQX1Nob3J0RGF0ZUZvcm1hdDsKLSAgZHdFeHRlbmRlZFN0eWxlIHw9IFVwZGF0ZVVJUHJvcGVydHkoKTsKLSAgZHdFeHRlbmRlZFN0eWxlIHw9IEdldEFsaWdubWVudCgpOwotICBtX3BOb3JtYWxXaWRnZXQtPk1vZGlmeVN0eWxlc0V4KGR3RXh0ZW5kZWRTdHlsZSwgMHhGRkZGRkZGRik7Ci0gIHVpbnQzMl90IGR3RWRpdFN0eWxlcyA9IEZXTF9TVFlMRUVYVF9FRFRfTGFzdExpbmVIZWlnaHQ7Ci0gIGludDMyX3QgaU51bUNlbGxzID0gbV9wRGF0YUFjYy0+R2V0TnVtYmVyT2ZDZWxscygpOwotICBpZiAoaU51bUNlbGxzID4gMCkgewotICAgIGR3RWRpdFN0eWxlcyB8PSBGV0xfU1RZTEVFWFRfRURUX0NvbWJUZXh0OwotICAgIHBXaWRnZXQtPlNldEVkaXRMaW1pdChpTnVtQ2VsbHMpOwotICB9Ci0gIGlmIChtX3BEYXRhQWNjLT5HZXRBY2Nlc3MoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9PcGVuIHx8Ci0gICAgICAhbV9wRGF0YUFjYy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpIHsKLSAgICBkd0VkaXRTdHlsZXMgfD0gRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seTsKLSAgfQotICBpZiAobV9wRGF0YUFjYy0+R2V0SG9yaXpvbnRhbFNjcm9sbFBvbGljeSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX09mZikgewotICAgIGR3RWRpdFN0eWxlcyB8PSBGV0xfU1RZTEVFWFRfRURUX0F1dG9IU2Nyb2xsOwotICB9Ci0gIHBXaWRnZXQtPk1vZGlmeUVkaXRTdHlsZXNFeChkd0VkaXRTdHlsZXMsIDB4RkZGRkZGRkYpOwotfQotdWludDMyX3QgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6R2V0QWxpZ25tZW50KCkgewotICB1aW50MzJfdCBkd0V4dGVuZGVkU3R5bGUgPSAwOwotICBpZiAoQ1hGQV9QYXJhIHBhcmEgPSBtX3BEYXRhQWNjLT5HZXRQYXJhKCkpIHsKLSAgICBpbnQzMl90IGlIb3J6ID0gcGFyYS5HZXRIb3Jpem9udGFsQWxpZ24oKTsKLSAgICBzd2l0Y2ggKGlIb3J6KSB7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlcjoKLSAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9EVFBfRWRpdEhDZW50ZXI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5OgotICAgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0RUUF9FZGl0SnVzdGlmaWVkOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeUFsbDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JhZGl4OgotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ6Ci0gICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRIRmFyOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRITmVhcjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGludDMyX3QgaVZlcnQgPSBwYXJhLkdldFZlcnRpY2FsQWxpZ24oKTsKLSAgICBzd2l0Y2ggKGlWZXJ0KSB7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZToKLSAgICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9EVFBfRWRpdFZDZW50ZXI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b206Ci0gICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRWRmFyOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRWTmVhcjsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBkd0V4dGVuZGVkU3R5bGU7Ci19Ci1ib29sIENYRkFfRkZEYXRlVGltZUVkaXQ6OkNvbW1pdERhdGEoKSB7Ci0gIENGWF9XaWRlU3RyaW5nIHdzVGV4dCA9Ci0gICAgICBzdGF0aWNfY2FzdDxDRldMX0RhdGVUaW1lUGlja2VyKj4obV9wTm9ybWFsV2lkZ2V0KS0+R2V0RWRpdFRleHQoKTsKLSAgaWYgKG1fcERhdGFBY2MtPlNldFZhbHVlKHdzVGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9FZGl0KSkgewotICAgIG1fcERhdGFBY2MtPlVwZGF0ZVVJRGlzcGxheSh0aGlzKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIENYRkFfRkZEYXRlVGltZUVkaXQ6OlVwZGF0ZUZXTERhdGEoKSB7Ci0gIGlmICghbV9wTm9ybWFsV2lkZ2V0KSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIFhGQV9WQUxVRVBJQ1RVUkUgZVR5cGUgPSBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXk7Ci0gIGlmIChJc0ZvY3VzZWQoKSkgewotICAgIGVUeXBlID0gWEZBX1ZBTFVFUElDVFVSRV9FZGl0OwotICB9Ci0gIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsKLSAgbV9wRGF0YUFjYy0+R2V0VmFsdWUod3NUZXh0LCBlVHlwZSk7Ci0gICgoQ0ZXTF9EYXRlVGltZVBpY2tlciopbV9wTm9ybWFsV2lkZ2V0KS0+U2V0RWRpdFRleHQod3NUZXh0KTsKLSAgaWYgKElzRm9jdXNlZCgpICYmICF3c1RleHQuSXNFbXB0eSgpKSB7Ci0gICAgQ1hGQV9Mb2NhbGVWYWx1ZSBsY1ZhbHVlID0gWEZBX0dldExvY2FsZVZhbHVlKG1fcERhdGFBY2MpOwotICAgIENGWF9Vbml0aW1lIGRhdGUgPSBsY1ZhbHVlLkdldERhdGUoKTsKLSAgICBpZiAobGNWYWx1ZS5Jc1ZhbGlkKCkpIHsKLSAgICAgIGlmICgoRlhfVU5JVElNRSlkYXRlICE9IDApIHsKLSAgICAgICAgKChDRldMX0RhdGVUaW1lUGlja2VyKiltX3BOb3JtYWxXaWRnZXQpCi0gICAgICAgICAgICAtPlNldEN1clNlbChkYXRlLkdldFllYXIoKSwgZGF0ZS5HZXRNb250aCgpLCBkYXRlLkdldERheSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci1ib29sIENYRkFfRkZEYXRlVGltZUVkaXQ6OklzRGF0YUNoYW5nZWQoKSB7Ci0gIGlmIChtX2R3U3RhdHVzICYgWEZBX1dpZGdldFN0YXR1c19UZXh0RWRpdFZhbHVlQ2hhbmdlZCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIENGWF9XaWRlU3RyaW5nIHdzVGV4dCA9Ci0gICAgICBzdGF0aWNfY2FzdDxDRldMX0RhdGVUaW1lUGlja2VyKj4obV9wTm9ybWFsV2lkZ2V0KS0+R2V0RWRpdFRleHQoKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NPbGRWYWx1ZTsKLSAgbV9wRGF0YUFjYy0+R2V0VmFsdWUod3NPbGRWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRV9FZGl0KTsKLSAgcmV0dXJuIHdzT2xkVmFsdWUgIT0gd3NUZXh0OwotfQotCi12b2lkIENYRkFfRkZEYXRlVGltZUVkaXQ6Ok9uU2VsZWN0Q2hhbmdlZChDRldMX1dpZGdldCogcFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVllYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNb250aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURheSkgewotICBDRlhfV2lkZVN0cmluZyB3c1BpY3R1cmU7Ci0gIG1fcERhdGFBY2MtPkdldFBpY3R1cmVDb250ZW50KHdzUGljdHVyZSwgWEZBX1ZBTFVFUElDVFVSRV9FZGl0KTsKLSAgQ1hGQV9Mb2NhbGVWYWx1ZSBkYXRlKFhGQV9WVF9EQVRFLCBHZXREb2MoKS0+R2V0WEZBRG9jKCktPkdldExvY2FsTWdyKCkpOwotICBDRlhfVW5pdGltZSBkdDsKLSAgZHQuU2V0KGlZZWFyLCBpTW9udGgsIGlEYXkpOwotICBkYXRlLlNldERhdGUoZHQpOwotICBDRlhfV2lkZVN0cmluZyB3c0RhdGU7Ci0gIGRhdGUuRm9ybWF0UGF0dGVybnMod3NEYXRlLCB3c1BpY3R1cmUsIG1fcERhdGFBY2MtPkdldExvY2FsKCksCi0gICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRV9FZGl0KTsKLSAgQ0ZXTF9EYXRlVGltZVBpY2tlciogcERhdGVUaW1lID0gKENGV0xfRGF0ZVRpbWVQaWNrZXIqKW1fcE5vcm1hbFdpZGdldDsKLSAgcERhdGVUaW1lLT5TZXRFZGl0VGV4dCh3c0RhdGUpOwotICBwRGF0ZVRpbWUtPlVwZGF0ZSgpOwotICBHZXREb2MoKS0+R2V0RG9jRW52aXJvbm1lbnQoKS0+U2V0Rm9jdXNXaWRnZXQoR2V0RG9jKCksIG51bGxwdHIpOwotICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOwotICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9DaGFuZ2U7Ci0gIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BEYXRhQWNjOwotICBtX3BEYXRhQWNjLT5HZXRWYWx1ZShlUGFyYW0ubV93c05ld1RleHQsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsKLSAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX0NoYW5nZSwgJmVQYXJhbSk7Ci19Ci0KLXZvaWQgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSB7Ci0gIGlmIChwRXZlbnQtPkdldFR5cGUoKSA9PSBDRldMX0V2ZW50OjpUeXBlOjpTZWxlY3RDaGFuZ2VkKSB7Ci0gICAgQ0ZXTF9FdmVudFNlbGVjdENoYW5nZWQqIGV2ZW50ID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9FdmVudFNlbGVjdENoYW5nZWQqPihwRXZlbnQpOwotICAgIE9uU2VsZWN0Q2hhbmdlZChtX3BOb3JtYWxXaWRnZXQsIGV2ZW50LT5pWWVhciwgZXZlbnQtPmlNb250aCwgZXZlbnQtPmlEYXkpOwotICAgIHJldHVybjsKLSAgfQotICBDWEZBX0ZGVGV4dEVkaXQ6Ok9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAveGZhX2ZmdGV4dGVkaXQuaCBiL3hmYS9meGZhL2FwcC94ZmFfZmZ0ZXh0ZWRpdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTA1NjJhLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfZmZ0ZXh0ZWRpdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhGQV9BUFBfWEZBX0ZGVEVYVEVESVRfSF8KLSNkZWZpbmUgWEZBX0ZYRkFfQVBQX1hGQV9GRlRFWFRFRElUX0hfCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmZmllbGQuaCIKLQotY2xhc3MgQ1hGQV9GRlRleHRFZGl0IDogcHVibGljIENYRkFfRkZGaWVsZCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDWEZBX0ZGVGV4dEVkaXQoQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsKLSAgfkNYRkFfRkZUZXh0RWRpdCgpIG92ZXJyaWRlOwotCi0gIC8vIENYRkFfRkZGaWVsZAotICBib29sIExvYWRXaWRnZXQoKSBvdmVycmlkZTsKLSAgdm9pZCBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIG92ZXJyaWRlOwotICBib29sIE9uTEJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOwotICBib29sIE9uUkJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOwotICBib29sIE9uUkJ1dHRvblVwKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKLSAgYm9vbCBPblNldEZvY3VzKENYRkFfRkZXaWRnZXQqIHBPbGRXaWRnZXQpIG92ZXJyaWRlOwotICBib29sIE9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdXaWRnZXQpIG92ZXJyaWRlOwotICB2b2lkIE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgb3ZlcnJpZGU7Ci0gIHZvaWQgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSBvdmVycmlkZTsKLSAgdm9pZCBPbkRyYXdXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBudWxscHRyKSBvdmVycmlkZTsKLQotICB2b2lkIE9uVGV4dENoYW5nZWQoQ0ZXTF9XaWRnZXQqIHBXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDaGFuZ2VkLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUHJldlRleHQpOwotICB2b2lkIE9uVGV4dEZ1bGwoQ0ZXTF9XaWRnZXQqIHBXaWRnZXQpOwotICBib29sIENoZWNrV29yZChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHNXb3JkKTsKLQotIHByb3RlY3RlZDoKLSAgYm9vbCBDb21taXREYXRhKCkgb3ZlcnJpZGU7Ci0gIGJvb2wgVXBkYXRlRldMRGF0YSgpIG92ZXJyaWRlOwotICBib29sIElzRGF0YUNoYW5nZWQoKSBvdmVycmlkZTsKLQotICB1aW50MzJfdCBHZXRBbGlnbm1lbnQoKTsKLSAgdm9pZCBWYWxpZGF0ZU51bWJlckZpZWxkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOwotCi0gIElGV0xfV2lkZ2V0RGVsZWdhdGUqIG1fcE9sZERlbGVnYXRlOwotfTsKLQotY2xhc3MgQ1hGQV9GRk51bWVyaWNFZGl0IDogcHVibGljIENYRkFfRkZUZXh0RWRpdCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDWEZBX0ZGTnVtZXJpY0VkaXQoQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsKLSAgfkNYRkFfRkZOdW1lcmljRWRpdCgpIG92ZXJyaWRlOwotCi0gIC8vIENYRkFfRkZUZXh0RWRpdAotICBib29sIExvYWRXaWRnZXQoKSBvdmVycmlkZTsKLSAgdm9pZCBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIG92ZXJyaWRlOwotICB2b2lkIE9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgb3ZlcnJpZGU7Ci0KLSBwdWJsaWM6Ci0gIGJvb2wgT25WYWxpZGF0ZShDRldMX1dpZGdldCogcFdpZGdldCwgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCk7Ci19OwotCi1jbGFzcyBDWEZBX0ZGUGFzc3dvcmRFZGl0IDogcHVibGljIENYRkFfRkZUZXh0RWRpdCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDWEZBX0ZGUGFzc3dvcmRFZGl0KENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7Ci0gIH5DWEZBX0ZGUGFzc3dvcmRFZGl0KCkgb3ZlcnJpZGU7Ci0KLSAgLy8gQ1hGQV9GRlRleHRFZGl0Ci0gIGJvb2wgTG9hZFdpZGdldCgpIG92ZXJyaWRlOwotICB2b2lkIFVwZGF0ZVdpZGdldFByb3BlcnR5KCkgb3ZlcnJpZGU7Ci0KLSBwcm90ZWN0ZWQ6Ci19OwotCi1lbnVtIFhGQV9EQVRFVElNRVRZUEUgewotICBYRkFfREFURVRJTUVUWVBFX0RhdGUgPSAwLAotICBYRkFfREFURVRJTUVUWVBFX1RpbWUsCi0gIFhGQV9EQVRFVElNRVRZUEVfRGF0ZUFuZFRpbWUKLX07Ci0KLWNsYXNzIENYRkFfRkZEYXRlVGltZUVkaXQgOiBwdWJsaWMgQ1hGQV9GRlRleHRFZGl0IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfRkZEYXRlVGltZUVkaXQoQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKTsKLSAgfkNYRkFfRkZEYXRlVGltZUVkaXQoKSBvdmVycmlkZTsKLQotICAvLyBDWEZBX0ZGVGV4dEVkaXQKLSAgQ0ZYX1JlY3RGIEdldEJCb3godWludDMyX3QgZHdTdGF0dXMsIGJvb2wgYkRyYXdGb2N1cyA9IGZhbHNlKSBvdmVycmlkZTsKLSAgYm9vbCBMb2FkV2lkZ2V0KCkgb3ZlcnJpZGU7Ci0gIHZvaWQgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKSBvdmVycmlkZTsKLSAgdm9pZCBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIG92ZXJyaWRlOwotCi0gIHZvaWQgT25TZWxlY3RDaGFuZ2VkKENGV0xfV2lkZ2V0KiBwV2lkZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlZZWFyLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNb250aCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGF5KTsKLQotIHByb3RlY3RlZDoKLSAgYm9vbCBQdEluQWN0aXZlUmVjdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7Ci0gIGJvb2wgQ29tbWl0RGF0YSgpIG92ZXJyaWRlOwotICBib29sIFVwZGF0ZUZXTERhdGEoKSBvdmVycmlkZTsKLSAgYm9vbCBJc0RhdGFDaGFuZ2VkKCkgb3ZlcnJpZGU7Ci0KLSAgdWludDMyX3QgR2V0QWxpZ25tZW50KCk7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEZBX0FQUF9YRkFfRkZURVhURURJVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL3hmYV9mZndpZGdldC5jcHAgYi94ZmEvZnhmYS9hcHAveGZhX2Zmd2lkZ2V0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk5NWZkMS4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAveGZhX2Zmd2lkZ2V0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwNTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0LmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYWdlL2NwZGZfcGFnZW9iamVjdGhvbGRlci5oIgotI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfcHJvZ3Jlc3NpdmVkZWNvZGVyLmgiCi0jaW5jbHVkZSAiY29yZS9meGNvZGVjL2Z4X2NvZGVjLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfbWF5YmVfb3duZWQuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dlbW9kdWxlLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9md2xfd2lkZ2V0aGl0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL2N4ZmFfdGV4dGxheW91dC5oIgotI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZXZlbnRwYXJhbS5oIgotI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmFfd2lkZ2V0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29ybmVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmYXBwLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jdmlldy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZnBhZ2V2aWV3LmgiCi0jaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY2Z4X2NvbG9yLmgiCi0jaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY2Z4X2dyYXBoaWNzLmgiCi0jaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY2Z4X3BhdGguaCIKLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfcGF0dGVybi5oIgotI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2NmeF9zaGFkaW5nLmgiCi0KLUNYRkFfRkZXaWRnZXQ6OkNYRkFfRkZXaWRnZXQoQ1hGQV9XaWRnZXRBY2MqIHBEYXRhQWNjKQotICAgIDogQ1hGQV9Db250ZW50TGF5b3V0SXRlbShwRGF0YUFjYy0+R2V0Tm9kZSgpKSwKLSAgICAgIG1fcFBhZ2VWaWV3KG51bGxwdHIpLAotICAgICAgbV9wRGF0YUFjYyhwRGF0YUFjYykge30KLQotQ1hGQV9GRldpZGdldDo6fkNYRkFfRkZXaWRnZXQoKSB7fQotCi1jb25zdCBDRldMX0FwcCogQ1hGQV9GRldpZGdldDo6R2V0RldMQXBwKCkgewotICByZXR1cm4gR2V0UGFnZVZpZXcoKS0+R2V0RG9jVmlldygpLT5HZXREb2MoKS0+R2V0QXBwKCktPkdldEZXTEFwcCgpOwotfQotCi1DRlhfUmVjdEYgQ1hGQV9GRldpZGdldDo6R2V0V2lkZ2V0UmVjdCgpIHsKLSAgaWYgKChtX2R3U3RhdHVzICYgWEZBX1dpZGdldFN0YXR1c19SZWN0Q2FjaGVkKSA9PSAwKQotICAgIFJlY2FjaGVXaWRnZXRSZWN0KCk7Ci0gIHJldHVybiBtX3J0V2lkZ2V0OwotfQotCi1DRlhfUmVjdEYgQ1hGQV9GRldpZGdldDo6UmVjYWNoZVdpZGdldFJlY3QoKSB7Ci0gIG1fZHdTdGF0dXMgfD0gWEZBX1dpZGdldFN0YXR1c19SZWN0Q2FjaGVkOwotICBtX3J0V2lkZ2V0ID0gR2V0UmVjdChmYWxzZSk7Ci0gIHJldHVybiBtX3J0V2lkZ2V0OwotfQotCi1DRlhfUmVjdEYgQ1hGQV9GRldpZGdldDo6R2V0UmVjdFdpdGhvdXRSb3RhdGUoKSB7Ci0gIENGWF9SZWN0RiBydFdpZGdldCA9IEdldFdpZGdldFJlY3QoKTsKLSAgRlhfRkxPQVQgZlZhbHVlID0gMDsKLSAgc3dpdGNoIChtX3BEYXRhQWNjLT5HZXRSb3RhdGUoKSkgewotICAgIGNhc2UgOTA6Ci0gICAgICBydFdpZGdldC50b3AgPSBydFdpZGdldC5ib3R0b20oKTsKLSAgICAgIGZWYWx1ZSA9IHJ0V2lkZ2V0LndpZHRoOwotICAgICAgcnRXaWRnZXQud2lkdGggPSBydFdpZGdldC5oZWlnaHQ7Ci0gICAgICBydFdpZGdldC5oZWlnaHQgPSBmVmFsdWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE4MDoKLSAgICAgIHJ0V2lkZ2V0LmxlZnQgPSBydFdpZGdldC5yaWdodCgpOwotICAgICAgcnRXaWRnZXQudG9wID0gcnRXaWRnZXQuYm90dG9tKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI3MDoKLSAgICAgIHJ0V2lkZ2V0LmxlZnQgPSBydFdpZGdldC5yaWdodCgpOwotICAgICAgZlZhbHVlID0gcnRXaWRnZXQud2lkdGg7Ci0gICAgICBydFdpZGdldC53aWR0aCA9IHJ0V2lkZ2V0LmhlaWdodDsKLSAgICAgIHJ0V2lkZ2V0LmhlaWdodCA9IGZWYWx1ZTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBydFdpZGdldDsKLX0KLQotdWludDMyX3QgQ1hGQV9GRldpZGdldDo6R2V0U3RhdHVzKCkgewotICByZXR1cm4gbV9kd1N0YXR1czsKLX0KLQotdm9pZCBDWEZBX0ZGV2lkZ2V0OjpNb2RpZnlTdGF0dXModWludDMyX3QgZHdBZGRlZCwgdWludDMyX3QgZHdSZW1vdmVkKSB7Ci0gIG1fZHdTdGF0dXMgPSAobV9kd1N0YXR1cyAmIH5kd1JlbW92ZWQpIHwgZHdBZGRlZDsKLX0KLQotQ0ZYX1JlY3RGIENYRkFfRkZXaWRnZXQ6OkdldEJCb3godWludDMyX3QgZHdTdGF0dXMsIGJvb2wgYkRyYXdGb2N1cykgewotICBpZiAoYkRyYXdGb2N1cyB8fCAhbV9wUGFnZVZpZXcpCi0gICAgcmV0dXJuIENGWF9SZWN0RigpOwotICByZXR1cm4gbV9wUGFnZVZpZXctPkdldFBhZ2VWaWV3UmVjdCgpOwotfQotCi1DWEZBX1dpZGdldEFjYyogQ1hGQV9GRldpZGdldDo6R2V0RGF0YUFjYygpIHsKLSAgcmV0dXJuIG1fcERhdGFBY2M7Ci19Ci0KLWJvb2wgQ1hGQV9GRldpZGdldDo6R2V0VG9vbFRpcChDRlhfV2lkZVN0cmluZyYgd3NUb29sVGlwKSB7Ci0gIGlmIChDWEZBX0Fzc2lzdCBhc3Npc3QgPSBtX3BEYXRhQWNjLT5HZXRBc3Npc3QoKSkgewotICAgIGlmIChDWEZBX1Rvb2xUaXAgdG9vbFRpcCA9IGFzc2lzdC5HZXRUb29sVGlwKCkpIHsKLSAgICAgIHJldHVybiB0b29sVGlwLkdldFRpcCh3c1Rvb2xUaXApOwotICAgIH0KLSAgfQotICByZXR1cm4gR2V0Q2FwdGlvblRleHQod3NUb29sVGlwKTsKLX0KLQotdm9pZCBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQoQ0ZYX0dyYXBoaWNzKiBwR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGF0dXMpIHsKLSAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpCi0gICAgcmV0dXJuOwotCi0gIENYRkFfQm9yZGVyIGJvcmRlciA9IG1fcERhdGFBY2MtPkdldEJvcmRlcigpOwotICBpZiAoIWJvcmRlcikKLSAgICByZXR1cm47Ci0KLSAgQ0ZYX1JlY3RGIHJ0Qm9yZGVyID0gR2V0UmVjdFdpdGhvdXRSb3RhdGUoKTsKLSAgQ1hGQV9NYXJnaW4gbWFyZ2luID0gYm9yZGVyLkdldE1hcmdpbigpOwotICBpZiAobWFyZ2luKQotICAgIFhGQV9SZWN0V2lkdGhvdXRNYXJnaW4ocnRCb3JkZXIsIG1hcmdpbik7Ci0KLSAgcnRCb3JkZXIuTm9ybWFsaXplKCk7Ci0gIERyYXdCb3JkZXIocEdTLCBib3JkZXIsIHJ0Qm9yZGVyLCBwTWF0cml4KTsKLX0KLQotYm9vbCBDWEZBX0ZGV2lkZ2V0OjpJc0xvYWRlZCgpIHsKLSAgcmV0dXJuICEhbV9wUGFnZVZpZXc7Ci19Ci1ib29sIENYRkFfRkZXaWRnZXQ6OkxvYWRXaWRnZXQoKSB7Ci0gIFBlcmZvcm1MYXlvdXQoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci12b2lkIENYRkFfRkZXaWRnZXQ6OlVubG9hZFdpZGdldCgpIHt9Ci1ib29sIENYRkFfRkZXaWRnZXQ6OlBlcmZvcm1MYXlvdXQoKSB7Ci0gIFJlY2FjaGVXaWRnZXRSZWN0KCk7Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDWEZBX0ZGV2lkZ2V0OjpVcGRhdGVGV0xEYXRhKCkgewotICByZXR1cm4gZmFsc2U7Ci19Ci12b2lkIENYRkFfRkZXaWRnZXQ6OlVwZGF0ZVdpZGdldFByb3BlcnR5KCkge30KLXZvaWQgQ1hGQV9GRldpZGdldDo6RHJhd0JvcmRlcihDRlhfR3JhcGhpY3MqIHBHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0JveCBib3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEJvcmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZ3MpIHsKLSAgWEZBX0RyYXdCb3goYm94LCBwR1MsIHJ0Qm9yZGVyLCBwTWF0cml4LCBkd0ZsYWdzKTsKLX0KLQotdm9pZCBDWEZBX0ZGV2lkZ2V0OjpJbnZhbGlkYXRlV2lkZ2V0KGNvbnN0IENGWF9SZWN0RiogcFJlY3QpIHsKLSAgaWYgKHBSZWN0KSB7Ci0gICAgR2V0RG9jKCktPkdldERvY0Vudmlyb25tZW50KCktPkludmFsaWRhdGVSZWN0KG1fcFBhZ2VWaWV3LCAqcFJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9JTlZBTElEQVRFX0N1cnJlbnRQYWdlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDRlhfUmVjdEYgcnRXaWRnZXQgPSBHZXRCQm94KFhGQV9XaWRnZXRTdGF0dXNfRm9jdXNlZCk7Ci0gIHJ0V2lkZ2V0LkluZmxhdGUoMiwgMik7Ci0gIEdldERvYygpLT5HZXREb2NFbnZpcm9ubWVudCgpLT5JbnZhbGlkYXRlUmVjdChtX3BQYWdlVmlldywgcnRXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfSU5WQUxJREFURV9DdXJyZW50UGFnZSk7Ci19Ci0KLXZvaWQgQ1hGQV9GRldpZGdldDo6QWRkSW52YWxpZGF0ZVJlY3QoY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCkgewotICBDRlhfUmVjdEYgcnRXaWRnZXQ7Ci0gIGlmIChwUmVjdCkgewotICAgIHJ0V2lkZ2V0ID0gKnBSZWN0OwotICB9IGVsc2UgewotICAgIHJ0V2lkZ2V0ID0gR2V0QkJveChYRkFfV2lkZ2V0U3RhdHVzX0ZvY3VzZWQpOwotICAgIHJ0V2lkZ2V0LkluZmxhdGUoMiwgMik7Ci0gIH0KLSAgbV9wRG9jVmlldy0+QWRkSW52YWxpZGF0ZVJlY3QobV9wUGFnZVZpZXcsIHJ0V2lkZ2V0KTsKLX0KLQotYm9vbCBDWEZBX0ZGV2lkZ2V0OjpHZXRDYXB0aW9uVGV4dChDRlhfV2lkZVN0cmluZyYgd3NDYXApIHsKLSAgQ1hGQV9UZXh0TGF5b3V0KiBwQ2FwVGV4dGxheW91dCA9IG1fcERhdGFBY2MtPkdldENhcHRpb25UZXh0TGF5b3V0KCk7Ci0gIGlmICghcENhcFRleHRsYXlvdXQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcENhcFRleHRsYXlvdXQtPkdldFRleHQod3NDYXApOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDWEZBX0ZGV2lkZ2V0OjpJc0ZvY3VzZWQoKSB7Ci0gIHJldHVybiAhIShtX2R3U3RhdHVzICYgWEZBX1dpZGdldFN0YXR1c19Gb2N1c2VkKTsKLX0KLQotYm9vbCBDWEZBX0ZGV2lkZ2V0OjpPbk1vdXNlRW50ZXIoKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX0ZGV2lkZ2V0OjpPbk1vdXNlRXhpdCgpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfRkZXaWRnZXQ6Ok9uTEJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfRkZXaWRnZXQ6Ok9uTEJ1dHRvblVwKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX0ZGV2lkZ2V0OjpPbkxCdXR0b25EYmxDbGsodWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfRkZXaWRnZXQ6Ok9uTW91c2VNb3ZlKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX0ZGV2lkZ2V0OjpPbk1vdXNlV2hlZWwodWludDMyX3QgZHdGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgekRlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfRkZXaWRnZXQ6Ok9uUkJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfRkZXaWRnZXQ6Ok9uUkJ1dHRvblVwKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX0ZGV2lkZ2V0OjpPblJCdXR0b25EYmxDbGsodWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfRkZXaWRnZXQ6Ok9uU2V0Rm9jdXMoQ1hGQV9GRldpZGdldCogcE9sZFdpZGdldCkgewotICBDWEZBX0ZGV2lkZ2V0KiBwUGFyZW50ID0gR2V0UGFyZW50KCk7Ci0gIGlmIChwUGFyZW50ICYmICFwUGFyZW50LT5Jc0FuY2VzdG9yT2YocE9sZFdpZGdldCkpIHsKLSAgICBwUGFyZW50LT5PblNldEZvY3VzKHBPbGRXaWRnZXQpOwotICB9Ci0gIG1fZHdTdGF0dXMgfD0gWEZBX1dpZGdldFN0YXR1c19Gb2N1c2VkOwotICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOwotICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9FbnRlcjsKLSAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcERhdGFBY2M7Ci0gIG1fcERhdGFBY2MtPlByb2Nlc3NFdmVudChYRkFfQVRUUklCVVRFRU5VTV9FbnRlciwgJmVQYXJhbSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENYRkFfRkZXaWRnZXQ6Ok9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdXaWRnZXQpIHsKLSAgbV9kd1N0YXR1cyAmPSB+WEZBX1dpZGdldFN0YXR1c19Gb2N1c2VkOwotICBFdmVudEtpbGxGb2N1cygpOwotICBpZiAocE5ld1dpZGdldCkgewotICAgIENYRkFfRkZXaWRnZXQqIHBQYXJlbnQgPSBHZXRQYXJlbnQoKTsKLSAgICBpZiAocFBhcmVudCAmJiAhcFBhcmVudC0+SXNBbmNlc3Rvck9mKHBOZXdXaWRnZXQpKSB7Ci0gICAgICBwUGFyZW50LT5PbktpbGxGb2N1cyhwTmV3V2lkZ2V0KTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1hGQV9GRldpZGdldDo6T25LZXlEb3duKHVpbnQzMl90IGR3S2V5Q29kZSwgdWludDMyX3QgZHdGbGFncykgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1hGQV9GRldpZGdldDo6T25LZXlVcCh1aW50MzJfdCBkd0tleUNvZGUsIHVpbnQzMl90IGR3RmxhZ3MpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfRkZXaWRnZXQ6Ok9uQ2hhcih1aW50MzJfdCBkd0NoYXIsIHVpbnQzMl90IGR3RmxhZ3MpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1GV0xfV2lkZ2V0SGl0IENYRkFfRkZXaWRnZXQ6Ok9uSGl0VGVzdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewotICByZXR1cm4gRldMX1dpZGdldEhpdDo6VW5rbm93bjsKLX0KLQotYm9vbCBDWEZBX0ZGV2lkZ2V0OjpPblNldEN1cnNvcihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1hGQV9GRldpZGdldDo6Q2FuVW5kbygpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfRkZXaWRnZXQ6OkNhblJlZG8oKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX0ZGV2lkZ2V0OjpVbmRvKCkgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1hGQV9GRldpZGdldDo6UmVkbygpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfRkZXaWRnZXQ6OkNhbkNvcHkoKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX0ZGV2lkZ2V0OjpDYW5DdXQoKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX0ZGV2lkZ2V0OjpDYW5QYXN0ZSgpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfRkZXaWRnZXQ6OkNhblNlbGVjdEFsbCgpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfRkZXaWRnZXQ6OkNhbkRlbGV0ZSgpIHsKLSAgcmV0dXJuIENhbkN1dCgpOwotfQotCi1ib29sIENYRkFfRkZXaWRnZXQ6OkNhbkRlU2VsZWN0KCkgewotICByZXR1cm4gQ2FuQ29weSgpOwotfQotCi1ib29sIENYRkFfRkZXaWRnZXQ6OkNvcHkoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29weSkgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1hGQV9GRldpZGdldDo6Q3V0KENGWF9XaWRlU3RyaW5nJiB3c0N1dCkgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1hGQV9GRldpZGdldDo6UGFzdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGFzdGUpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIENYRkFfRkZXaWRnZXQ6OlNlbGVjdEFsbCgpIHt9Ci0KLXZvaWQgQ1hGQV9GRldpZGdldDo6RGVsZXRlKCkge30KLQotdm9pZCBDWEZBX0ZGV2lkZ2V0OjpEZVNlbGVjdCgpIHt9Ci0KLWJvb2wgQ1hGQV9GRldpZGdldDo6R2V0U3VnZ2VzdFdvcmRzKENGWF9Qb2ludEYgcG9pbnRmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q0ZYX0J5dGVTdHJpbmc+JiBzU3VnZ2VzdCkgewotICByZXR1cm4gZmFsc2U7Ci19Ci1ib29sIENYRkFfRkZXaWRnZXQ6OlJlcGxhY2VTcGVsbENoZWNrV29yZChDRlhfUG9pbnRGIHBvaW50ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZXBsYWNlKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotQ0ZYX1BvaW50RiBDWEZBX0ZGV2lkZ2V0OjpSb3RhdGUyTm9ybWFsKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIENGWF9NYXRyaXggbXQgPSBHZXRSb3RhdGVNYXRyaXgoKTsKLSAgaWYgKG10LklzSWRlbnRpdHkoKSkKLSAgICByZXR1cm4gcG9pbnQ7Ci0KLSAgQ0ZYX01hdHJpeCBtdFJldmVyc2U7Ci0gIG10UmV2ZXJzZS5TZXRSZXZlcnNlKG10KTsKLSAgcmV0dXJuIG10UmV2ZXJzZS5UcmFuc2Zvcm0ocG9pbnQpOwotfQotCi1zdGF0aWMgdm9pZCBYRkFfR2V0TWF0cml4KENGWF9NYXRyaXgmIG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnQpIHsKLSAgaWYgKCFpUm90YXRlKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIEZYX0ZMT0FUIGZBbmNob3JYID0gMDsKLSAgRlhfRkxPQVQgZkFuY2hvclkgPSAwOwotICBzd2l0Y2ggKGF0KSB7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3BMZWZ0OgotICAgICAgZkFuY2hvclggPSBydC5sZWZ0LCBmQW5jaG9yWSA9IHJ0LnRvcDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9wQ2VudGVyOgotICAgICAgZkFuY2hvclggPSAocnQubGVmdCArIHJ0LnJpZ2h0KCkpIC8gMiwgZkFuY2hvclkgPSBydC50b3A7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcFJpZ2h0OgotICAgICAgZkFuY2hvclggPSBydC5yaWdodCgpLCBmQW5jaG9yWSA9IHJ0LnRvcDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlTGVmdDoKLSAgICAgIGZBbmNob3JYID0gcnQubGVmdCwgZkFuY2hvclkgPSAocnQudG9wICsgcnQuYm90dG9tKCkpIC8gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlQ2VudGVyOgotICAgICAgZkFuY2hvclggPSAocnQubGVmdCArIHJ0LnJpZ2h0KCkpIC8gMiwKLSAgICAgIGZBbmNob3JZID0gKHJ0LnRvcCArIHJ0LmJvdHRvbSgpKSAvIDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZVJpZ2h0OgotICAgICAgZkFuY2hvclggPSBydC5yaWdodCgpLCBmQW5jaG9yWSA9IChydC50b3AgKyBydC5ib3R0b20oKSkgLyAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21MZWZ0OgotICAgICAgZkFuY2hvclggPSBydC5sZWZ0LCBmQW5jaG9yWSA9IHJ0LmJvdHRvbSgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21DZW50ZXI6Ci0gICAgICBmQW5jaG9yWCA9IChydC5sZWZ0ICsgcnQucmlnaHQoKSkgLyAyLCBmQW5jaG9yWSA9IHJ0LmJvdHRvbSgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21SaWdodDoKLSAgICAgIGZBbmNob3JYID0gcnQucmlnaHQoKSwgZkFuY2hvclkgPSBydC5ib3R0b20oKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICBzd2l0Y2ggKGlSb3RhdGUpIHsKLSAgICBjYXNlIDkwOgotICAgICAgbS5hID0gMCwgbS5iID0gLTEsIG0uYyA9IDEsIG0uZCA9IDAsIG0uZSA9IGZBbmNob3JYIC0gZkFuY2hvclksCi0gICAgICBtLmYgPSBmQW5jaG9yWCArIGZBbmNob3JZOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxODA6Ci0gICAgICBtLmEgPSAtMSwgbS5iID0gMCwgbS5jID0gMCwgbS5kID0gLTEsIG0uZSA9IGZBbmNob3JYICogMiwKLSAgICAgIG0uZiA9IGZBbmNob3JZICogMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMjcwOgotICAgICAgbS5hID0gMCwgbS5iID0gMSwgbS5jID0gLTEsIG0uZCA9IDAsIG0uZSA9IGZBbmNob3JYICsgZkFuY2hvclksCi0gICAgICBtLmYgPSBmQW5jaG9yWSAtIGZBbmNob3JYOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotQ0ZYX01hdHJpeCBDWEZBX0ZGV2lkZ2V0OjpHZXRSb3RhdGVNYXRyaXgoKSB7Ci0gIENGWF9NYXRyaXggbXQ7Ci0gIGludDMyX3QgaVJvdGF0ZSA9IG1fcERhdGFBY2MtPkdldFJvdGF0ZSgpOwotICBpZiAoIWlSb3RhdGUpCi0gICAgcmV0dXJuIG10OwotCi0gIENGWF9SZWN0RiByY1dpZGdldCA9IEdldFJlY3RXaXRob3V0Um90YXRlKCk7Ci0gIFhGQV9BVFRSSUJVVEVFTlVNIGF0ID0gWEZBX0FUVFJJQlVURUVOVU1fVG9wTGVmdDsKLSAgWEZBX0dldE1hdHJpeChtdCwgaVJvdGF0ZSwgYXQsIHJjV2lkZ2V0KTsKLQotICByZXR1cm4gbXQ7Ci19Ci0KLWJvb2wgQ1hGQV9GRldpZGdldDo6SXNMYXlvdXRSZWN0RW1wdHkoKSB7Ci0gIENGWF9SZWN0RiBydExheW91dCA9IEdldFJlY3RXaXRob3V0Um90YXRlKCk7Ci0gIHJldHVybiBydExheW91dC53aWR0aCA8IDAuMWYgJiYgcnRMYXlvdXQuaGVpZ2h0IDwgMC4xZjsKLX0KLUNYRkFfRkZXaWRnZXQqIENYRkFfRkZXaWRnZXQ6OkdldFBhcmVudCgpIHsKLSAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9Ci0gICAgICBtX3BEYXRhQWNjLT5HZXROb2RlKCktPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOwotICBpZiAocFBhcmVudE5vZGUpIHsKLSAgICBDWEZBX1dpZGdldEFjYyogcFBhcmVudFdpZGdldEFjYyA9Ci0gICAgICAgIHN0YXRpY19jYXN0PENYRkFfV2lkZ2V0QWNjKj4ocFBhcmVudE5vZGUtPkdldFdpZGdldERhdGEoKSk7Ci0gICAgaWYgKHBQYXJlbnRXaWRnZXRBY2MpIHsKLSAgICAgIHJldHVybiBwUGFyZW50V2lkZ2V0QWNjLT5HZXROZXh0V2lkZ2V0KG51bGxwdHIpOwotICAgIH0KLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotYm9vbCBDWEZBX0ZGV2lkZ2V0OjpJc0FuY2VzdG9yT2YoQ1hGQV9GRldpZGdldCogcFdpZGdldCkgewotICBpZiAoIXBXaWRnZXQpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENYRkFfTm9kZSogcE5vZGUgPSBtX3BEYXRhQWNjLT5HZXROb2RlKCk7Ci0gIENYRkFfTm9kZSogcENoaWxkTm9kZSA9IHBXaWRnZXQtPkdldERhdGFBY2MoKS0+R2V0Tm9kZSgpOwotICB3aGlsZSAocENoaWxkTm9kZSkgewotICAgIGlmIChwQ2hpbGROb2RlID09IHBOb2RlKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfRkZXaWRnZXQ6OlB0SW5BY3RpdmVSZWN0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIHJldHVybiBHZXRXaWRnZXRSZWN0KCkuQ29udGFpbnMocG9pbnQpOwotfQotCi1DWEZBX0ZGRG9jVmlldyogQ1hGQV9GRldpZGdldDo6R2V0RG9jVmlldygpIHsKLSAgcmV0dXJuIG1fcERvY1ZpZXc7Ci19Ci0KLXZvaWQgQ1hGQV9GRldpZGdldDo6U2V0RG9jVmlldyhDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcpIHsKLSAgbV9wRG9jVmlldyA9IHBEb2NWaWV3OwotfQotCi1DWEZBX0ZGRG9jKiBDWEZBX0ZGV2lkZ2V0OjpHZXREb2MoKSB7Ci0gIHJldHVybiBtX3BEb2NWaWV3LT5HZXREb2MoKTsKLX0KLQotQ1hGQV9GRkFwcCogQ1hGQV9GRldpZGdldDo6R2V0QXBwKCkgewotICByZXR1cm4gR2V0RG9jKCktPkdldEFwcCgpOwotfQotCi1JWEZBX0FwcFByb3ZpZGVyKiBDWEZBX0ZGV2lkZ2V0OjpHZXRBcHBQcm92aWRlcigpIHsKLSAgcmV0dXJuIEdldEFwcCgpLT5HZXRBcHBQcm92aWRlcigpOwotfQotCi1ib29sIENYRkFfRkZXaWRnZXQ6OklzTWF0Y2hWaXNpYmxlU3RhdHVzKHVpbnQzMl90IGR3U3RhdHVzKSB7Ci0gIHJldHVybiAhIShtX2R3U3RhdHVzICYgWEZBX1dpZGdldFN0YXR1c19WaXNpYmxlKTsKLX0KLQotdm9pZCBDWEZBX0ZGV2lkZ2V0OjpFdmVudEtpbGxGb2N1cygpIHsKLSAgaWYgKG1fZHdTdGF0dXMgJiBYRkFfV2lkZ2V0U3RhdHVzX0FjY2VzcykgewotICAgIG1fZHdTdGF0dXMgJj0gflhGQV9XaWRnZXRTdGF0dXNfQWNjZXNzOwotICAgIHJldHVybjsKLSAgfQotICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOwotICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9FeGl0OwotICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wRGF0YUFjYzsKLSAgbV9wRGF0YUFjYy0+UHJvY2Vzc0V2ZW50KFhGQV9BVFRSSUJVVEVFTlVNX0V4aXQsICZlUGFyYW0pOwotfQotYm9vbCBDWEZBX0ZGV2lkZ2V0OjpJc0J1dHRvbkRvd24oKSB7Ci0gIHJldHVybiAobV9kd1N0YXR1cyAmIFhGQV9XaWRnZXRTdGF0dXNfQnV0dG9uRG93bikgIT0gMDsKLX0KLXZvaWQgQ1hGQV9GRldpZGdldDo6U2V0QnV0dG9uRG93bihib29sIGJTZXQpIHsKLSAgYlNldCA/IG1fZHdTdGF0dXMgfD0gWEZBX1dpZGdldFN0YXR1c19CdXR0b25Eb3duCi0gICAgICAgOiBtX2R3U3RhdHVzICY9IH5YRkFfV2lkZ2V0U3RhdHVzX0J1dHRvbkRvd247Ci19Ci1pbnQzMl90IFhGQV9TdHJva2VUeXBlU2V0TGluZURhc2goQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3Ryb2tlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDYXBUeXBlKSB7Ci0gIHN3aXRjaCAoaVN0cm9rZVR5cGUpIHsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Rhc2hEb3Q6IHsKLSAgICAgIEZYX0ZMT0FUIGRhc2hBcnJheVtdID0gezQsIDEsIDIsIDF9OwotICAgICAgaWYgKGlDYXBUeXBlICE9IFhGQV9BVFRSSUJVVEVFTlVNX0J1dHQpIHsKLSAgICAgICAgZGFzaEFycmF5WzFdID0gMjsKLSAgICAgICAgZGFzaEFycmF5WzNdID0gMjsKLSAgICAgIH0KLSAgICAgIHBHcmFwaGljcy0+U2V0TGluZURhc2goMCwgZGFzaEFycmF5LCA0KTsKLSAgICAgIHJldHVybiBGWF9EQVNIU1RZTEVfRGFzaERvdDsKLSAgICB9Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EYXNoRG90RG90OiB7Ci0gICAgICBGWF9GTE9BVCBkYXNoQXJyYXlbXSA9IHs0LCAxLCAyLCAxLCAyLCAxfTsKLSAgICAgIGlmIChpQ2FwVHlwZSAhPSBYRkFfQVRUUklCVVRFRU5VTV9CdXR0KSB7Ci0gICAgICAgIGRhc2hBcnJheVsxXSA9IDI7Ci0gICAgICAgIGRhc2hBcnJheVszXSA9IDI7Ci0gICAgICAgIGRhc2hBcnJheVs1XSA9IDI7Ci0gICAgICB9Ci0gICAgICBwR3JhcGhpY3MtPlNldExpbmVEYXNoKDAsIGRhc2hBcnJheSwgNik7Ci0gICAgICByZXR1cm4gRlhfREFTSFNUWUxFX0Rhc2hEb3REb3Q7Ci0gICAgfQotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRGFzaGVkOiB7Ci0gICAgICBGWF9GTE9BVCBkYXNoQXJyYXlbXSA9IHs1LCAxfTsKLSAgICAgIGlmIChpQ2FwVHlwZSAhPSBYRkFfQVRUUklCVVRFRU5VTV9CdXR0KSB7Ci0gICAgICAgIGRhc2hBcnJheVsxXSA9IDI7Ci0gICAgICB9Ci0gICAgICBwR3JhcGhpY3MtPlNldExpbmVEYXNoKDAsIGRhc2hBcnJheSwgMik7Ci0gICAgICByZXR1cm4gRlhfREFTSFNUWUxFX0Rhc2g7Ci0gICAgfQotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRG90dGVkOiB7Ci0gICAgICBGWF9GTE9BVCBkYXNoQXJyYXlbXSA9IHsyLCAxfTsKLSAgICAgIGlmIChpQ2FwVHlwZSAhPSBYRkFfQVRUUklCVVRFRU5VTV9CdXR0KSB7Ci0gICAgICAgIGRhc2hBcnJheVsxXSA9IDI7Ci0gICAgICB9Ci0gICAgICBwR3JhcGhpY3MtPlNldExpbmVEYXNoKDAsIGRhc2hBcnJheSwgMik7Ci0gICAgICByZXR1cm4gRlhfREFTSFNUWUxFX0RvdDsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0gIHBHcmFwaGljcy0+U2V0TGluZURhc2goRlhfREFTSFNUWUxFX1NvbGlkKTsKLSAgcmV0dXJuIEZYX0RBU0hTVFlMRV9Tb2xpZDsKLX0KLUNGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcCBYRkFfTGluZUNhcFRvRlhHRShpbnQzMl90IGlMaW5lQ2FwKSB7Ci0gIHN3aXRjaCAoaUxpbmVDYXApIHsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JvdW5kOgotICAgICAgcmV0dXJuIENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcFJvdW5kOwotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQnV0dDoKLSAgICAgIHJldHVybiBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBCdXR0OwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwU3F1YXJlOwotfQotCi1jbGFzcyBDWEZBX0ltYWdlUmVuZGVyZXIgewotIHB1YmxpYzoKLSAgQ1hGQV9JbWFnZVJlbmRlcmVyKCk7Ci0gIH5DWEZBX0ltYWdlUmVuZGVyZXIoKTsKLQotICBib29sIFN0YXJ0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgQ0ZYX0RJQlNvdXJjZSogcERJQlNvdXJjZSwKLSAgICAgICAgICAgICBGWF9BUkdCIGJpdG1hcF9hcmdiLAotICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCi0gICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcEltYWdlMkRldmljZSwKLSAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKLSAgICAgICAgICAgICBpbnQgYmxlbmRUeXBlID0gRlhESUJfQkxFTkRfTk9STUFMKTsKLSAgYm9vbCBDb250aW51ZShJRlhfUGF1c2UqIHBQYXVzZSk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGJvb2wgU3RhcnRESUJTb3VyY2UoKTsKLSAgdm9pZCBDb21wb3NpdGVESUJpdG1hcChDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgbWFza19hcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsZW5kX21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IFRyYW5zcGFyZW5jeSk7Ci0KLSAgQ0ZYX1JlbmRlckRldmljZSogbV9wRGV2aWNlOwotICBpbnQgbV9TdGF0dXM7Ci0gIENGWF9NYXRyaXggbV9JbWFnZU1hdHJpeDsKLSAgQ0ZYX0RJQlNvdXJjZSogbV9wRElCU291cmNlOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBtX3BDbG9uZUNvbnZlcnQ7Ci0gIGludCBtX0JpdG1hcEFscGhhOwotICBGWF9BUkdCIG1fRmlsbEFyZ2I7Ci0gIHVpbnQzMl90IG1fRmxhZ3M7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfSW1hZ2VUcmFuc2Zvcm1lcj4gbV9wVHJhbnNmb3JtZXI7Ci0gIHZvaWQqIG1fRGV2aWNlSGFuZGxlOwotICBpbnQzMl90IG1fQmxlbmRUeXBlOwotICBib29sIG1fUmVzdWx0OwotICBib29sIG1fYlByaW50OwotfTsKLQotQ1hGQV9JbWFnZVJlbmRlcmVyOjpDWEZBX0ltYWdlUmVuZGVyZXIoKQotICAgIDogbV9wRGV2aWNlKG51bGxwdHIpLAotICAgICAgbV9TdGF0dXMoMCksCi0gICAgICBtX3BESUJTb3VyY2UobnVsbHB0ciksCi0gICAgICBtX0JpdG1hcEFscGhhKDI1NSksCi0gICAgICBtX0ZpbGxBcmdiKDApLAotICAgICAgbV9GbGFncygwKSwKLSAgICAgIG1fRGV2aWNlSGFuZGxlKG51bGxwdHIpLAotICAgICAgbV9CbGVuZFR5cGUoRlhESUJfQkxFTkRfTk9STUFMKSwKLSAgICAgIG1fUmVzdWx0KHRydWUpLAotICAgICAgbV9iUHJpbnQoZmFsc2UpIHt9Ci0KLUNYRkFfSW1hZ2VSZW5kZXJlcjo6fkNYRkFfSW1hZ2VSZW5kZXJlcigpIHsKLSAgaWYgKG1fRGV2aWNlSGFuZGxlKQotICAgIG1fcERldmljZS0+Q2FuY2VsRElCaXRzKG1fRGV2aWNlSGFuZGxlKTsKLX0KLQotYm9vbCBDWEZBX0ltYWdlUmVuZGVyZXI6OlN0YXJ0KENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0RJQlNvdXJjZSogcERJQlNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGJpdG1hcF9hcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRtYXBfYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCogcEltYWdlMkRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRUeXBlKSB7Ci0gIG1fcERldmljZSA9IHBEZXZpY2U7Ci0gIG1fcERJQlNvdXJjZSA9IHBESUJTb3VyY2U7Ci0gIG1fRmlsbEFyZ2IgPSBiaXRtYXBfYXJnYjsKLSAgbV9CaXRtYXBBbHBoYSA9IGJpdG1hcF9hbHBoYTsKLSAgbV9JbWFnZU1hdHJpeCA9ICpwSW1hZ2UyRGV2aWNlOwotICBtX0ZsYWdzID0gZmxhZ3M7Ci0gIG1fQmxlbmRUeXBlID0gYmxlbmRUeXBlOwotICByZXR1cm4gU3RhcnRESUJTb3VyY2UoKTsKLX0KLQotYm9vbCBDWEZBX0ltYWdlUmVuZGVyZXI6OlN0YXJ0RElCU291cmNlKCkgewotICBpZiAobV9wRGV2aWNlLT5TdGFydERJQml0c1dpdGhCbGVuZChtX3BESUJTb3VyY2UsIG1fQml0bWFwQWxwaGEsIG1fRmlsbEFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX0ltYWdlTWF0cml4LCBtX0ZsYWdzLCBtX0RldmljZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9CbGVuZFR5cGUpKSB7Ci0gICAgaWYgKG1fRGV2aWNlSGFuZGxlKSB7Ci0gICAgICBtX1N0YXR1cyA9IDM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIENGWF9GbG9hdFJlY3QgaW1hZ2VfcmVjdF9mID0gbV9JbWFnZU1hdHJpeC5HZXRVbml0UmVjdCgpOwotICBGWF9SRUNUIGltYWdlX3JlY3QgPSBpbWFnZV9yZWN0X2YuR2V0T3V0ZXJSZWN0KCk7Ci0gIGludCBkZXN0X3dpZHRoID0gaW1hZ2VfcmVjdC5XaWR0aCgpOwotICBpbnQgZGVzdF9oZWlnaHQgPSBpbWFnZV9yZWN0LkhlaWdodCgpOwotICBpZiAoKEZYU1lTX2ZhYnMobV9JbWFnZU1hdHJpeC5iKSA+PSAwLjVmIHx8IG1fSW1hZ2VNYXRyaXguYSA9PSAwKSB8fAotICAgICAgKEZYU1lTX2ZhYnMobV9JbWFnZU1hdHJpeC5jKSA+PSAwLjVmIHx8IG1fSW1hZ2VNYXRyaXguZCA9PSAwKSkgewotICAgIGlmIChtX2JQcmludCAmJiAhKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19CTEVORF9NT0RFKSkgewotICAgICAgbV9SZXN1bHQgPSBmYWxzZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgQ0ZYX0RJQlNvdXJjZSogcERpYiA9IG1fcERJQlNvdXJjZTsKLSAgICBpZiAobV9wRElCU291cmNlLT5IYXNBbHBoYSgpICYmCi0gICAgICAgICEobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0FMUEhBX0lNQUdFKSAmJgotICAgICAgICAhKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19HRVRfQklUUykpIHsKLSAgICAgIG1fcENsb25lQ29udmVydCA9IG1fcERJQlNvdXJjZS0+Q2xvbmVDb252ZXJ0KEZYRElCX1JnYik7Ci0gICAgICBpZiAoIW1fcENsb25lQ29udmVydCkgewotICAgICAgICBtX1Jlc3VsdCA9IGZhbHNlOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBwRGliID0gbV9wQ2xvbmVDb252ZXJ0LmdldCgpOwotICAgIH0KLSAgICBGWF9SRUNUIGNsaXBfYm94ID0gbV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7Ci0gICAgY2xpcF9ib3guSW50ZXJzZWN0KGltYWdlX3JlY3QpOwotICAgIG1fU3RhdHVzID0gMjsKLSAgICBtX3BUcmFuc2Zvcm1lci5yZXNldCgKLSAgICAgICAgbmV3IENGWF9JbWFnZVRyYW5zZm9ybWVyKHBEaWIsICZtX0ltYWdlTWF0cml4LCBtX0ZsYWdzLCAmY2xpcF9ib3gpKTsKLSAgICBtX3BUcmFuc2Zvcm1lci0+U3RhcnQoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAobV9JbWFnZU1hdHJpeC5hIDwgMCkgewotICAgIGRlc3Rfd2lkdGggPSAtZGVzdF93aWR0aDsKLSAgfQotICBpZiAobV9JbWFnZU1hdHJpeC5kID4gMCkgewotICAgIGRlc3RfaGVpZ2h0ID0gLWRlc3RfaGVpZ2h0OwotICB9Ci0gIGludCBkZXN0X2xlZnQsIGRlc3RfdG9wOwotICBkZXN0X2xlZnQgPSBkZXN0X3dpZHRoID4gMCA/IGltYWdlX3JlY3QubGVmdCA6IGltYWdlX3JlY3QucmlnaHQ7Ci0gIGRlc3RfdG9wID0gZGVzdF9oZWlnaHQgPiAwID8gaW1hZ2VfcmVjdC50b3AgOiBpbWFnZV9yZWN0LmJvdHRvbTsKLSAgaWYgKG1fcERJQlNvdXJjZS0+SXNPcGFxdWVJbWFnZSgpICYmIG1fQml0bWFwQWxwaGEgPT0gMjU1KSB7Ci0gICAgaWYgKG1fcERldmljZS0+U3RyZXRjaERJQml0c1dpdGhGbGFnc0FuZEJsZW5kKAotICAgICAgICAgICAgbV9wRElCU291cmNlLCBkZXN0X2xlZnQsIGRlc3RfdG9wLCBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgbV9GbGFncywKLSAgICAgICAgICAgIG1fQmxlbmRUeXBlKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICBpZiAobV9wRElCU291cmNlLT5Jc0FscGhhTWFzaygpKSB7Ci0gICAgaWYgKG1fQml0bWFwQWxwaGEgIT0gMjU1KSB7Ci0gICAgICBtX0ZpbGxBcmdiID0gRlhBUkdCX01VTF9BTFBIQShtX0ZpbGxBcmdiLCBtX0JpdG1hcEFscGhhKTsKLSAgICB9Ci0gICAgaWYgKG1fcERldmljZS0+U3RyZXRjaEJpdE1hc2tXaXRoRmxhZ3MobV9wRElCU291cmNlLCBkZXN0X2xlZnQsIGRlc3RfdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LCBtX0ZpbGxBcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fRmxhZ3MpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIGlmIChtX2JQcmludCAmJiAhKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19CTEVORF9NT0RFKSkgewotICAgIG1fUmVzdWx0ID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgRlhfUkVDVCBjbGlwX2JveCA9IG1fcERldmljZS0+R2V0Q2xpcEJveCgpOwotICBGWF9SRUNUIGRlc3RfcmVjdCA9IGNsaXBfYm94OwotICBkZXN0X3JlY3QuSW50ZXJzZWN0KGltYWdlX3JlY3QpOwotICBGWF9SRUNUIGRlc3RfY2xpcCgKLSAgICAgIGRlc3RfcmVjdC5sZWZ0IC0gaW1hZ2VfcmVjdC5sZWZ0LCBkZXN0X3JlY3QudG9wIC0gaW1hZ2VfcmVjdC50b3AsCi0gICAgICBkZXN0X3JlY3QucmlnaHQgLSBpbWFnZV9yZWN0LmxlZnQsIGRlc3RfcmVjdC5ib3R0b20gLSBpbWFnZV9yZWN0LnRvcCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IHBTdHJldGNoZWQoCi0gICAgICBtX3BESUJTb3VyY2UtPlN0cmV0Y2hUbyhkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgbV9GbGFncywgJmRlc3RfY2xpcCkpOwotICBpZiAocFN0cmV0Y2hlZCkgewotICAgIENvbXBvc2l0ZURJQml0bWFwKHBTdHJldGNoZWQuZ2V0KCksIGRlc3RfcmVjdC5sZWZ0LCBkZXN0X3JlY3QudG9wLAotICAgICAgICAgICAgICAgICAgICAgIG1fRmlsbEFyZ2IsIG1fQml0bWFwQWxwaGEsIG1fQmxlbmRUeXBlLCBmYWxzZSk7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfSW1hZ2VSZW5kZXJlcjo6Q29udGludWUoSUZYX1BhdXNlKiBwUGF1c2UpIHsKLSAgaWYgKG1fU3RhdHVzID09IDIpIHsKLSAgICBpZiAobV9wVHJhbnNmb3JtZXItPkNvbnRpbnVlKHBQYXVzZSkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IHBCaXRtYXAobV9wVHJhbnNmb3JtZXItPkRldGFjaEJpdG1hcCgpKTsKLSAgICBpZiAoIXBCaXRtYXApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAocEJpdG1hcC0+SXNBbHBoYU1hc2soKSkgewotICAgICAgaWYgKG1fQml0bWFwQWxwaGEgIT0gMjU1KQotICAgICAgICBtX0ZpbGxBcmdiID0gRlhBUkdCX01VTF9BTFBIQShtX0ZpbGxBcmdiLCBtX0JpdG1hcEFscGhhKTsKLSAgICAgIG1fUmVzdWx0ID0KLSAgICAgICAgICBtX3BEZXZpY2UtPlNldEJpdE1hc2socEJpdG1hcC5nZXQoKSwgbV9wVHJhbnNmb3JtZXItPnJlc3VsdCgpLmxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFRyYW5zZm9ybWVyLT5yZXN1bHQoKS50b3AsIG1fRmlsbEFyZ2IpOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAobV9CaXRtYXBBbHBoYSAhPSAyNTUpCi0gICAgICAgIHBCaXRtYXAtPk11bHRpcGx5QWxwaGEobV9CaXRtYXBBbHBoYSk7Ci0gICAgICBtX1Jlc3VsdCA9IG1fcERldmljZS0+U2V0RElCaXRzV2l0aEJsZW5kKAotICAgICAgICAgIHBCaXRtYXAuZ2V0KCksIG1fcFRyYW5zZm9ybWVyLT5yZXN1bHQoKS5sZWZ0LAotICAgICAgICAgIG1fcFRyYW5zZm9ybWVyLT5yZXN1bHQoKS50b3AsIG1fQmxlbmRUeXBlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChtX1N0YXR1cyA9PSAzKQotICAgIHJldHVybiBtX3BEZXZpY2UtPkNvbnRpbnVlRElCaXRzKG1fRGV2aWNlSGFuZGxlLCBwUGF1c2UpOwotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBDWEZBX0ltYWdlUmVuZGVyZXI6OkNvbXBvc2l0ZURJQml0bWFwKENGWF9ESUJpdG1hcCogcERJQml0bWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBtYXNrX2FyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdG1hcF9hbHBoYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxlbmRfbW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgVHJhbnNwYXJlbmN5KSB7Ci0gIGlmICghcERJQml0bWFwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGJvb2wgYklzb2xhdGVkID0gISEoVHJhbnNwYXJlbmN5ICYgUERGVFJBTlNfSVNPTEFURUQpOwotICBib29sIGJHcm91cCA9ICEhKFRyYW5zcGFyZW5jeSAmIFBERlRSQU5TX0dST1VQKTsKLSAgaWYgKGJsZW5kX21vZGUgPT0gRlhESUJfQkxFTkRfTk9STUFMKSB7Ci0gICAgaWYgKCFwRElCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgIGlmIChiaXRtYXBfYWxwaGEgPCAyNTUpIHsKLSAgICAgICAgcERJQml0bWFwLT5NdWx0aXBseUFscGhhKGJpdG1hcF9hbHBoYSk7Ci0gICAgICB9Ci0gICAgICBpZiAobV9wRGV2aWNlLT5TZXRESUJpdHMocERJQml0bWFwLCBsZWZ0LCB0b3ApKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgdWludDMyX3QgZmlsbF9hcmdiID0gKG1hc2tfYXJnYik7Ci0gICAgICBpZiAoYml0bWFwX2FscGhhIDwgMjU1KSB7Ci0gICAgICAgICgodWludDhfdCopJmZpbGxfYXJnYilbM10gPQotICAgICAgICAgICAgKCh1aW50OF90KikmZmlsbF9hcmdiKVszXSAqIGJpdG1hcF9hbHBoYSAvIDI1NTsKLSAgICAgIH0KLSAgICAgIGlmIChtX3BEZXZpY2UtPlNldEJpdE1hc2socERJQml0bWFwLCBsZWZ0LCB0b3AsIGZpbGxfYXJnYikpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfQotICBib29sIGJCYWNrQWxwaGFSZXF1aXJlZCA9IGJsZW5kX21vZGUgJiYgYklzb2xhdGVkOwotICBib29sIGJHZXRCYWNrR3JvdW5kID0KLSAgICAgICgobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0FMUEhBX09VVFBVVCkpIHx8Ci0gICAgICAoIShtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQUxQSEFfT1VUUFVUKSAmJgotICAgICAgIChtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfR0VUX0JJVFMpICYmICFiQmFja0FscGhhUmVxdWlyZWQpOwotICBpZiAoYkdldEJhY2tHcm91bmQpIHsKLSAgICBpZiAoYklzb2xhdGVkIHx8ICFiR3JvdXApIHsKLSAgICAgIGlmIChwRElCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHNXaXRoQmxlbmQocERJQml0bWFwLCBsZWZ0LCB0b3AsIGJsZW5kX21vZGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBGWF9SRUNUIHJlY3QobGVmdCwgdG9wLCBsZWZ0ICsgcERJQml0bWFwLT5HZXRXaWR0aCgpLAotICAgICAgICAgICAgICAgICAgIHRvcCArIHBESUJpdG1hcC0+R2V0SGVpZ2h0KCkpOwotICAgICAgcmVjdC5JbnRlcnNlY3QobV9wRGV2aWNlLT5HZXRDbGlwQm94KCkpOwotICAgICAgQ0ZYX01heWJlT3duZWQ8Q0ZYX0RJQml0bWFwPiBwQ2xvbmU7Ci0gICAgICBpZiAobV9wRGV2aWNlLT5HZXRCYWNrRHJvcCgpICYmIG1fcERldmljZS0+R2V0Qml0bWFwKCkpIHsKLSAgICAgICAgcENsb25lID0gbV9wRGV2aWNlLT5HZXRCYWNrRHJvcCgpLT5DbG9uZSgmcmVjdCk7Ci0gICAgICAgIENGWF9ESUJpdG1hcCogcEZvcmVCaXRtYXAgPSBtX3BEZXZpY2UtPkdldEJpdG1hcCgpOwotICAgICAgICBwQ2xvbmUtPkNvbXBvc2l0ZUJpdG1hcCgwLCAwLCBwQ2xvbmUtPkdldFdpZHRoKCksIHBDbG9uZS0+R2V0SGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JlQml0bWFwLCByZWN0LmxlZnQsIHJlY3QudG9wKTsKLSAgICAgICAgbGVmdCA9IGxlZnQgPj0gMCA/IDAgOiBsZWZ0OwotICAgICAgICB0b3AgPSB0b3AgPj0gMCA/IDAgOiB0b3A7Ci0gICAgICAgIGlmICghcERJQml0bWFwLT5Jc0FscGhhTWFzaygpKQotICAgICAgICAgIHBDbG9uZS0+Q29tcG9zaXRlQml0bWFwKDAsIDAsIHBDbG9uZS0+R2V0V2lkdGgoKSwgcENsb25lLT5HZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRElCaXRtYXAsIGxlZnQsIHRvcCwgYmxlbmRfbW9kZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBwQ2xvbmUtPkNvbXBvc2l0ZU1hc2soMCwgMCwgcENsb25lLT5HZXRXaWR0aCgpLCBwQ2xvbmUtPkdldEhlaWdodCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRElCaXRtYXAsIG1hc2tfYXJnYiwgbGVmdCwgdG9wLCBibGVuZF9tb2RlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBDbG9uZSA9IHBESUJpdG1hcDsKLSAgICAgIH0KLSAgICAgIGlmIChtX3BEZXZpY2UtPkdldEJhY2tEcm9wKCkpIHsKLSAgICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHMocENsb25lLkdldCgpLCByZWN0LmxlZnQsIHJlY3QudG9wKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwRElCaXRtYXAtPklzQWxwaGFNYXNrKCkpCi0gICAgICAgICAgcmV0dXJuOwotICAgICAgICBtX3BEZXZpY2UtPlNldERJQml0c1dpdGhCbGVuZChwRElCaXRtYXAsIHJlY3QubGVmdCwgcmVjdC50b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kX21vZGUpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKCFwRElCaXRtYXAtPkhhc0FscGhhKCkgfHwKLSAgICAgIChtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQUxQSEFfSU1BR0UpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IHBDbG9uZUNvbnZlcnQgPQotICAgICAgcERJQml0bWFwLT5DbG9uZUNvbnZlcnQoRlhESUJfUmdiKTsKLSAgaWYgKCFwQ2xvbmVDb252ZXJ0KQotICAgIHJldHVybjsKLQotICBDWEZBX0ltYWdlUmVuZGVyZXIgaW1hZ2VSZW5kZXI7Ci0gIGlmICghaW1hZ2VSZW5kZXIuU3RhcnQobV9wRGV2aWNlLCBwQ2xvbmVDb252ZXJ0LmdldCgpLCBtX0ZpbGxBcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1fQml0bWFwQWxwaGEsICZtX0ltYWdlTWF0cml4LCBtX0ZsYWdzKSkgewotICAgIHJldHVybjsKLSAgfQotICB3aGlsZSAoaW1hZ2VSZW5kZXIuQ29udGludWUobnVsbHB0cikpCi0gICAgY29udGludWU7Ci19Ci0KLXZvaWQgWEZBX0RyYXdJbWFnZShDRlhfR3JhcGhpY3MqIHBHUywKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0SW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlBc3BlY3QsCi0gICAgICAgICAgICAgICAgICAgaW50MzJfdCBpSW1hZ2VYRHBpLAotICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUltYWdlWURwaSwKLSAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlIb3J6QWxpZ24sCi0gICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVmVydEFsaWduKSB7Ci0gIGlmIChydEltYWdlLklzRW1wdHkoKSkKLSAgICByZXR1cm47Ci0gIGlmICghcERJQml0bWFwIHx8ICFwRElCaXRtYXAtPkdldEJ1ZmZlcigpKQotICAgIHJldHVybjsKLQotICBDRlhfUmVjdEYgcnRGaXQoCi0gICAgICBydEltYWdlLlRvcExlZnQoKSwKLSAgICAgIFhGQV9Vbml0UHgyUHQoKEZYX0ZMT0FUKXBESUJpdG1hcC0+R2V0V2lkdGgoKSwgKEZYX0ZMT0FUKWlJbWFnZVhEcGkpLAotICAgICAgWEZBX1VuaXRQeDJQdCgoRlhfRkxPQVQpcERJQml0bWFwLT5HZXRIZWlnaHQoKSwgKEZYX0ZMT0FUKWlJbWFnZVlEcGkpKTsKLSAgc3dpdGNoIChpQXNwZWN0KSB7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9GaXQ6IHsKLSAgICAgIEZYX0ZMT0FUIGYxID0gcnRJbWFnZS5oZWlnaHQgLyBydEZpdC5oZWlnaHQ7Ci0gICAgICBGWF9GTE9BVCBmMiA9IHJ0SW1hZ2Uud2lkdGggLyBydEZpdC53aWR0aDsKLSAgICAgIGYxID0gc3RkOjptaW4oZjEsIGYyKTsKLSAgICAgIHJ0Rml0LmhlaWdodCA9IHJ0Rml0LmhlaWdodCAqIGYxOwotICAgICAgcnRGaXQud2lkdGggPSBydEZpdC53aWR0aCAqIGYxOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9BY3R1YWw6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0hlaWdodDogewotICAgICAgRlhfRkxPQVQgZjEgPSBydEltYWdlLmhlaWdodCAvIHJ0Rml0LmhlaWdodDsKLSAgICAgIHJ0Rml0LmhlaWdodCA9IHJ0SW1hZ2UuaGVpZ2h0OwotICAgICAgcnRGaXQud2lkdGggPSBmMSAqIHJ0Rml0LndpZHRoOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOgotICAgICAgcnRGaXQuaGVpZ2h0ID0gcnRJbWFnZS5oZWlnaHQ7Ci0gICAgICBydEZpdC53aWR0aCA9IHJ0SW1hZ2Uud2lkdGg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1dpZHRoOiB7Ci0gICAgICBGWF9GTE9BVCBmMSA9IHJ0SW1hZ2Uud2lkdGggLyBydEZpdC53aWR0aDsKLSAgICAgIHJ0Rml0LndpZHRoID0gcnRJbWFnZS53aWR0aDsKLSAgICAgIHJ0Rml0LmhlaWdodCA9IHJ0Rml0LmhlaWdodCAqIGYxOwotICAgIH0gYnJlYWs7Ci0gIH0KLSAgaWYgKGlIb3J6QWxpZ24gPT0gWEZBX0FUVFJJQlVURUVOVU1fQ2VudGVyKSB7Ci0gICAgcnRGaXQubGVmdCArPSAocnRJbWFnZS53aWR0aCAtIHJ0Rml0LndpZHRoKSAvIDI7Ci0gIH0gZWxzZSBpZiAoaUhvcnpBbGlnbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCkgewotICAgIHJ0Rml0LmxlZnQgPSBydEltYWdlLnJpZ2h0KCkgLSBydEZpdC53aWR0aDsKLSAgfQotICBpZiAoaVZlcnRBbGlnbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGUpIHsKLSAgICBydEZpdC50b3AgKz0gKHJ0SW1hZ2UuaGVpZ2h0IC0gcnRGaXQuaGVpZ2h0KSAvIDI7Ci0gIH0gZWxzZSBpZiAoaVZlcnRBbGlnbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b20pIHsKLSAgICBydEZpdC50b3AgPSBydEltYWdlLmJvdHRvbSgpIC0gcnRJbWFnZS5oZWlnaHQ7Ci0gIH0KLSAgQ0ZYX1JlbmRlckRldmljZSogcFJlbmRlckRldmljZSA9IHBHUy0+R2V0UmVuZGVyRGV2aWNlKCk7Ci0gIHBSZW5kZXJEZXZpY2UtPlNhdmVTdGF0ZSgpOwotCi0gIENGWF9QYXRoRGF0YSBwYXRoOwotICBwYXRoLkFwcGVuZFJlY3QocnRJbWFnZS5sZWZ0LCBydEltYWdlLmJvdHRvbSgpLCBydEltYWdlLnJpZ2h0KCksIHJ0SW1hZ2UudG9wKTsKLSAgcFJlbmRlckRldmljZS0+U2V0Q2xpcF9QYXRoRmlsbCgmcGF0aCwgcE1hdHJpeCwgRlhGSUxMX1dJTkRJTkcpOwotCi0gIENGWF9NYXRyaXggbXRJbWFnZSgxLCAwLCAwLCAtMSwgMCwgMSk7Ci0gIG10SW1hZ2UuQ29uY2F0KAotICAgICAgQ0ZYX01hdHJpeChydEZpdC53aWR0aCwgMCwgMCwgcnRGaXQuaGVpZ2h0LCBydEZpdC5sZWZ0LCBydEZpdC50b3ApKTsKLSAgbXRJbWFnZS5Db25jYXQoKnBNYXRyaXgpOwotCi0gIENYRkFfSW1hZ2VSZW5kZXJlciBpbWFnZVJlbmRlcjsKLSAgYm9vbCBiUmV0ID0gaW1hZ2VSZW5kZXIuU3RhcnQocFJlbmRlckRldmljZSwgcERJQml0bWFwLCAwLCAyNTUsICZtdEltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9JTlRFUlBPTCk7Ci0gIHdoaWxlIChiUmV0KQotICAgIGJSZXQgPSBpbWFnZVJlbmRlci5Db250aW51ZShudWxscHRyKTsKLQotICBwUmVuZGVyRGV2aWNlLT5SZXN0b3JlU3RhdGUoZmFsc2UpOwotfQotCi1zdGF0aWMgY29uc3QgdWludDhfdCBnX2ludl9iYXNlNjRbMTI4XSA9IHsKLSAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAotICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCi0gICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCA2MiwgIDI1NSwKLSAgICAyNTUsIDI1NSwgNjMsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDI1NSwgMjU1LAotICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LAotICAgIDEwLCAgMTEsICAxMiwgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwKLSAgICAyNSwgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwgIDMyLCAgMzMsCi0gICAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywgIDQ4LAotICAgIDQ5LCAgNTAsICA1MSwgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAotfTsKLQotc3RhdGljIHVpbnQ4X3QqIFhGQV9SZW1vdmVCYXNlNjRXaGl0ZXNwYWNlKGNvbnN0IHVpbnQ4X3QqIHBTdHIsIGludDMyX3QgaUxlbikgewotICB1aW50OF90KiBwQ1A7Ci0gIGludDMyX3QgaSA9IDAsIGogPSAwOwotICBpZiAoaUxlbiA9PSAwKSB7Ci0gICAgaUxlbiA9IEZYU1lTX3N0cmxlbigoRlhfQ0hBUiopcFN0cik7Ci0gIH0KLSAgcENQID0gRlhfQWxsb2ModWludDhfdCwgaUxlbiArIDEpOwotICBmb3IgKDsgaSA8IGlMZW47IGkrKykgewotICAgIGlmICgocFN0cltpXSAmIDEyOCkgPT0gMCkgewotICAgICAgaWYgKGdfaW52X2Jhc2U2NFtwU3RyW2ldXSAhPSAweEZGIHx8IHBTdHJbaV0gPT0gJz0nKSB7Ci0gICAgICAgIHBDUFtqKytdID0gcFN0cltpXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcENQW2pdID0gJ1wwJzsKLSAgcmV0dXJuIHBDUDsKLX0KLXN0YXRpYyBpbnQzMl90IFhGQV9CYXNlNjREZWNvZGUoY29uc3QgRlhfQ0hBUiogcFN0ciwgdWludDhfdCogcE91dEJ1ZmZlcikgewotICBpZiAoIXBTdHIpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICB1aW50OF90KiBwQnVmZmVyID0KLSAgICAgIFhGQV9SZW1vdmVCYXNlNjRXaGl0ZXNwYWNlKCh1aW50OF90KilwU3RyLCBGWFNZU19zdHJsZW4oKEZYX0NIQVIqKXBTdHIpKTsKLSAgaWYgKCFwQnVmZmVyKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaW50MzJfdCBpTGVuID0gRlhTWVNfc3RybGVuKChGWF9DSEFSKilwQnVmZmVyKTsKLSAgaW50MzJfdCBpID0gMCwgaiA9IDA7Ci0gIHVpbnQzMl90IGR3TGltYiA9IDA7Ci0gIGZvciAoOyBpICsgMyA8IGlMZW47IGkgKz0gNCkgewotICAgIGlmIChwQnVmZmVyW2ldID09ICc9JyB8fCBwQnVmZmVyW2kgKyAxXSA9PSAnPScgfHwgcEJ1ZmZlcltpICsgMl0gPT0gJz0nIHx8Ci0gICAgICAgIHBCdWZmZXJbaSArIDNdID09ICc9JykgewotICAgICAgaWYgKHBCdWZmZXJbaV0gPT0gJz0nIHx8IHBCdWZmZXJbaSArIDFdID09ICc9JykgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChwQnVmZmVyW2kgKyAyXSA9PSAnPScpIHsKLSAgICAgICAgZHdMaW1iID0gKCh1aW50MzJfdClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpXV0gPDwgNikgfAotICAgICAgICAgICAgICAgICAoKHVpbnQzMl90KWdfaW52X2Jhc2U2NFtwQnVmZmVyW2kgKyAxXV0pOwotICAgICAgICBwT3V0QnVmZmVyW2pdID0gKHVpbnQ4X3QpKGR3TGltYiA+PiA0KSAmIDB4RkY7Ci0gICAgICAgIGorKzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGR3TGltYiA9ICgodWludDMyX3QpZ19pbnZfYmFzZTY0W3BCdWZmZXJbaV1dIDw8IDEyKSB8Ci0gICAgICAgICAgICAgICAgICgodWludDMyX3QpZ19pbnZfYmFzZTY0W3BCdWZmZXJbaSArIDFdXSA8PCA2KSB8Ci0gICAgICAgICAgICAgICAgICgodWludDMyX3QpZ19pbnZfYmFzZTY0W3BCdWZmZXJbaSArIDJdXSk7Ci0gICAgICAgIHBPdXRCdWZmZXJbal0gPSAodWludDhfdCkoZHdMaW1iID4+IDEwKSAmIDB4RkY7Ci0gICAgICAgIHBPdXRCdWZmZXJbaiArIDFdID0gKHVpbnQ4X3QpKGR3TGltYiA+PiAyKSAmIDB4RkY7Ci0gICAgICAgIGogKz0gMjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZHdMaW1iID0gKCh1aW50MzJfdClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpXV0gPDwgMTgpIHwKLSAgICAgICAgICAgICAgICgodWludDMyX3QpZ19pbnZfYmFzZTY0W3BCdWZmZXJbaSArIDFdXSA8PCAxMikgfAotICAgICAgICAgICAgICAgKCh1aW50MzJfdClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpICsgMl1dIDw8IDYpIHwKLSAgICAgICAgICAgICAgICgodWludDMyX3QpZ19pbnZfYmFzZTY0W3BCdWZmZXJbaSArIDNdXSk7Ci0gICAgICBwT3V0QnVmZmVyW2pdID0gKHVpbnQ4X3QpKGR3TGltYiA+PiAxNikgJiAweGZmOwotICAgICAgcE91dEJ1ZmZlcltqICsgMV0gPSAodWludDhfdCkoZHdMaW1iID4+IDgpICYgMHhmZjsKLSAgICAgIHBPdXRCdWZmZXJbaiArIDJdID0gKHVpbnQ4X3QpKGR3TGltYikmMHhmZjsKLSAgICAgIGogKz0gMzsKLSAgICB9Ci0gIH0KLSAgRlhfRnJlZShwQnVmZmVyKTsKLSAgcmV0dXJuIGo7Ci19Ci0KLXN0YXRpYyBjb25zdCBGWF9DSEFSIGdfYmFzZTY0X2NoYXJzW10gPQotICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKLQotRlhfQ0hBUiogWEZBX0Jhc2U2NEVuY29kZShjb25zdCB1aW50OF90KiBidWYsIGludDMyX3QgYnVmX2xlbikgewotICBGWF9DSEFSKiBvdXQgPSBudWxscHRyOwotICBpbnQgaSwgajsKLSAgdWludDMyX3QgbGltYjsKLSAgb3V0ID0gRlhfQWxsb2MoRlhfQ0hBUiwgKChidWZfbGVuICogOCArIDUpIC8gNikgKyA1KTsKLSAgZm9yIChpID0gMCwgaiA9IDAsIGxpbWIgPSAwOyBpICsgMiA8IGJ1Zl9sZW47IGkgKz0gMywgaiArPSA0KSB7Ci0gICAgbGltYiA9ICgodWludDMyX3QpYnVmW2ldIDw8IDE2KSB8ICgodWludDMyX3QpYnVmW2kgKyAxXSA8PCA4KSB8Ci0gICAgICAgICAgICgodWludDMyX3QpYnVmW2kgKyAyXSk7Ci0gICAgb3V0W2pdID0gZ19iYXNlNjRfY2hhcnNbKGxpbWIgPj4gMTgpICYgNjNdOwotICAgIG91dFtqICsgMV0gPSBnX2Jhc2U2NF9jaGFyc1sobGltYiA+PiAxMikgJiA2M107Ci0gICAgb3V0W2ogKyAyXSA9IGdfYmFzZTY0X2NoYXJzWyhsaW1iID4+IDYpICYgNjNdOwotICAgIG91dFtqICsgM10gPSBnX2Jhc2U2NF9jaGFyc1sobGltYikmNjNdOwotICB9Ci0gIHN3aXRjaCAoYnVmX2xlbiAtIGkpIHsKLSAgICBjYXNlIDA6Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICBsaW1iID0gKCh1aW50MzJfdClidWZbaV0pOwotICAgICAgb3V0W2orK10gPSBnX2Jhc2U2NF9jaGFyc1sobGltYiA+PiAyKSAmIDYzXTsKLSAgICAgIG91dFtqKytdID0gZ19iYXNlNjRfY2hhcnNbKGxpbWIgPDwgNCkgJiA2M107Ci0gICAgICBvdXRbaisrXSA9ICc9JzsKLSAgICAgIG91dFtqKytdID0gJz0nOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgbGltYiA9ICgodWludDMyX3QpYnVmW2ldIDw8IDgpIHwgKCh1aW50MzJfdClidWZbaSArIDFdKTsKLSAgICAgIG91dFtqKytdID0gZ19iYXNlNjRfY2hhcnNbKGxpbWIgPj4gMTApICYgNjNdOwotICAgICAgb3V0W2orK10gPSBnX2Jhc2U2NF9jaGFyc1sobGltYiA+PiA0KSAmIDYzXTsKLSAgICAgIG91dFtqKytdID0gZ19iYXNlNjRfY2hhcnNbKGxpbWIgPDwgMikgJiA2M107Ci0gICAgICBvdXRbaisrXSA9ICc9JzsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICBvdXRbal0gPSAnXDAnOwotICByZXR1cm4gb3V0OwotfQotRlhDT0RFQ19JTUFHRV9UWVBFIFhGQV9HZXRJbWFnZVR5cGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVHlwZSkgewotICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlKHdzVHlwZSk7Ci0gIHdzQ29udGVudFR5cGUuTWFrZUxvd2VyKCk7Ci0gIGlmICh3c0NvbnRlbnRUeXBlID09IEwiaW1hZ2UvanBnIikKLSAgICByZXR1cm4gRlhDT0RFQ19JTUFHRV9KUEc7Ci0gIGlmICh3c0NvbnRlbnRUeXBlID09IEwiaW1hZ2UvcG5nIikKLSAgICByZXR1cm4gRlhDT0RFQ19JTUFHRV9QTkc7Ci0gIGlmICh3c0NvbnRlbnRUeXBlID09IEwiaW1hZ2UvZ2lmIikKLSAgICByZXR1cm4gRlhDT0RFQ19JTUFHRV9HSUY7Ci0gIGlmICh3c0NvbnRlbnRUeXBlID09IEwiaW1hZ2UvYm1wIikKLSAgICByZXR1cm4gRlhDT0RFQ19JTUFHRV9CTVA7Ci0gIGlmICh3c0NvbnRlbnRUeXBlID09IEwiaW1hZ2UvdGlmIikKLSAgICByZXR1cm4gRlhDT0RFQ19JTUFHRV9USUY7Ci0gIHJldHVybiBGWENPREVDX0lNQUdFX1VOS05PV047Ci19Ci1DRlhfRElCaXRtYXAqIFhGQV9Mb2FkSW1hZ2VEYXRhKENYRkFfRkZEb2MqIHBEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfSW1hZ2UqIHBJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYk5hbWVJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUltYWdlWERwaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUltYWdlWURwaSkgewotICBDRlhfV2lkZVN0cmluZyB3c0hyZWY7Ci0gIHBJbWFnZS0+R2V0SHJlZih3c0hyZWYpOwotICBDRlhfV2lkZVN0cmluZyB3c0ltYWdlOwotICBwSW1hZ2UtPkdldENvbnRlbnQod3NJbWFnZSk7Ci0gIGlmICh3c0hyZWYuSXNFbXB0eSgpICYmIHdzSW1hZ2UuSXNFbXB0eSgpKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZTsKLSAgcEltYWdlLT5HZXRDb250ZW50VHlwZSh3c0NvbnRlbnRUeXBlKTsKLSAgRlhDT0RFQ19JTUFHRV9UWVBFIHR5cGUgPSBYRkFfR2V0SW1hZ2VUeXBlKHdzQ29udGVudFR5cGUpOwotICBDRlhfQnl0ZVN0cmluZyBic0NvbnRlbnQ7Ci0gIHVpbnQ4X3QqIHBJbWFnZUJ1ZmZlciA9IG51bGxwdHI7Ci0gIENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4gcEltYWdlRmlsZVJlYWQ7Ci0gIGlmICh3c0ltYWdlLkdldExlbmd0aCgpID4gMCkgewotICAgIFhGQV9BVFRSSUJVVEVFTlVNIGlFbmNvZGluZyA9Ci0gICAgICAgIChYRkFfQVRUUklCVVRFRU5VTSlwSW1hZ2UtPkdldFRyYW5zZmVyRW5jb2RpbmcoKTsKLSAgICBpZiAoaUVuY29kaW5nID09IFhGQV9BVFRSSUJVVEVFTlVNX0Jhc2U2NCkgewotICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEYXRhID0gd3NJbWFnZS5VVEY4RW5jb2RlKCk7Ci0gICAgICBpbnQzMl90IGlMZW5ndGggPSBic0RhdGEuR2V0TGVuZ3RoKCk7Ci0gICAgICBwSW1hZ2VCdWZmZXIgPSBGWF9BbGxvYyh1aW50OF90LCBpTGVuZ3RoKTsKLSAgICAgIGludDMyX3QgaVJlYWQgPSBYRkFfQmFzZTY0RGVjb2RlKGJzRGF0YS5jX3N0cigpLCBwSW1hZ2VCdWZmZXIpOwotICAgICAgaWYgKGlSZWFkID4gMCkgewotICAgICAgICBwSW1hZ2VGaWxlUmVhZCA9IElGWF9NZW1vcnlTdHJlYW06OkNyZWF0ZShwSW1hZ2VCdWZmZXIsIGlSZWFkKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgYnNDb250ZW50ID0gQ0ZYX0J5dGVTdHJpbmc6OkZyb21Vbmljb2RlKHdzSW1hZ2UpOwotICAgICAgcEltYWdlRmlsZVJlYWQgPSBJRlhfTWVtb3J5U3RyZWFtOjpDcmVhdGUoCi0gICAgICAgICAgY29uc3RfY2FzdDx1aW50OF90Kj4oYnNDb250ZW50LnJhd19zdHIoKSksIGJzQ29udGVudC5HZXRMZW5ndGgoKSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIENGWF9XaWRlU3RyaW5nIHdzVVJMID0gd3NIcmVmOwotICAgIGlmICh3c1VSTC5MZWZ0KDcpICE9IEwiaHR0cDovLyIgJiYgd3NVUkwuTGVmdCg2KSAhPSBMImZ0cDovLyIpIHsKLSAgICAgIENGWF9ESUJpdG1hcCogcEJpdG1hcCA9Ci0gICAgICAgICAgcERvYy0+R2V0UERGTmFtZWRJbWFnZSh3c1VSTC5Bc1N0cmluZ0MoKSwgaUltYWdlWERwaSwgaUltYWdlWURwaSk7Ci0gICAgICBpZiAocEJpdG1hcCkgewotICAgICAgICBiTmFtZUltYWdlID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIHBCaXRtYXA7Ci0gICAgICB9Ci0gICAgfQotICAgIHBJbWFnZUZpbGVSZWFkID0gcERvYy0+R2V0RG9jRW52aXJvbm1lbnQoKS0+T3BlbkxpbmtlZEZpbGUocERvYywgd3NVUkwpOwotICB9Ci0gIGlmICghcEltYWdlRmlsZVJlYWQpIHsKLSAgICBGWF9GcmVlKHBJbWFnZUJ1ZmZlcik7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgYk5hbWVJbWFnZSA9IGZhbHNlOwotICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPQotICAgICAgWEZBX0xvYWRJbWFnZUZyb21CdWZmZXIocEltYWdlRmlsZVJlYWQsIHR5cGUsIGlJbWFnZVhEcGksIGlJbWFnZVlEcGkpOwotICBGWF9GcmVlKHBJbWFnZUJ1ZmZlcik7Ci0gIHJldHVybiBwQml0bWFwOwotfQotc3RhdGljIEZYRElCX0Zvcm1hdCBYRkFfR2V0RElCRm9ybWF0KEZYQ09ERUNfSU1BR0VfVFlQRSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQml0c1BlckNvbXBvbmVudCkgewotICBGWERJQl9Gb3JtYXQgZGliRm9ybWF0ID0gRlhESUJfQXJnYjsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBGWENPREVDX0lNQUdFX0JNUDoKLSAgICBjYXNlIEZYQ09ERUNfSU1BR0VfSlBHOgotICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9USUY6IHsKLSAgICAgIGRpYkZvcm1hdCA9IEZYRElCX1JnYjMyOwotICAgICAgaW50MzJfdCBicHAgPSBpQ29tcG9uZW50cyAqIGlCaXRzUGVyQ29tcG9uZW50OwotICAgICAgaWYgKGJwcCA8PSAyNCkgewotICAgICAgICBkaWJGb3JtYXQgPSBGWERJQl9SZ2I7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEZYQ09ERUNfSU1BR0VfUE5HOgotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gZGliRm9ybWF0OwotfQotCi1DRlhfRElCaXRtYXAqIFhGQV9Mb2FkSW1hZ2VGcm9tQnVmZmVyKAotICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBJbWFnZUZpbGVSZWFkLAotICAgIEZYQ09ERUNfSU1BR0VfVFlQRSB0eXBlLAotICAgIGludDMyX3QmIGlJbWFnZVhEcGksCi0gICAgaW50MzJfdCYgaUltYWdlWURwaSkgewotICBDRlhfR0VNb2R1bGUqIHBHZU1vZHVsZSA9IENGWF9HRU1vZHVsZTo6R2V0KCk7Ci0gIGlmICghcEdlTW9kdWxlKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIENDb2RlY19Nb2R1bGVNZ3IqIHBDb2RlY01nciA9IHBHZU1vZHVsZS0+R2V0Q29kZWNNb2R1bGUoKTsKLSAgaWYgKCFwQ29kZWNNZ3IpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgQ0ZYX0RJQkF0dHJpYnV0ZSBkaWJBdHRyOwotICBDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBudWxscHRyOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0NvZGVjX1Byb2dyZXNzaXZlRGVjb2Rlcj4gcFByb2dyZXNzaXZlRGVjb2RlciA9Ci0gICAgICBwQ29kZWNNZ3ItPkNyZWF0ZVByb2dyZXNzaXZlRGVjb2RlcigpOwotICBwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5Mb2FkSW1hZ2VJbmZvKHBJbWFnZUZpbGVSZWFkLCB0eXBlLCAmZGliQXR0ciwgZmFsc2UpOwotICBzd2l0Y2ggKGRpYkF0dHIubV93RFBJVW5pdCkgewotICAgIGNhc2UgRlhDT0RFQ19SRVNVTklUX0NFTlRJTUVURVI6Ci0gICAgICBkaWJBdHRyLm1fblhEUEkgPSAoaW50MzJfdCkoZGliQXR0ci5tX25YRFBJICogMi41NGYpOwotICAgICAgZGliQXR0ci5tX25ZRFBJID0gKGludDMyX3QpKGRpYkF0dHIubV9uWURQSSAqIDIuNTRmKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlhDT0RFQ19SRVNVTklUX01FVEVSOgotICAgICAgZGliQXR0ci5tX25YRFBJID0gKGludDMyX3QpKGRpYkF0dHIubV9uWERQSSAvIChGWF9GTE9BVCkxMDAgKiAyLjU0Zik7Ci0gICAgICBkaWJBdHRyLm1fbllEUEkgPSAoaW50MzJfdCkoZGliQXR0ci5tX25ZRFBJIC8gKEZYX0ZMT0FUKTEwMCAqIDIuNTRmKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICBpSW1hZ2VYRHBpID0gZGliQXR0ci5tX25YRFBJID4gMSA/IGRpYkF0dHIubV9uWERQSSA6ICg5Nik7Ci0gIGlJbWFnZVlEcGkgPSBkaWJBdHRyLm1fbllEUEkgPiAxID8gZGliQXR0ci5tX25ZRFBJIDogKDk2KTsKLSAgaWYgKHBQcm9ncmVzc2l2ZURlY29kZXItPkdldFdpZHRoKCkgPiAwICYmCi0gICAgICBwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5HZXRIZWlnaHQoKSA+IDApIHsKLSAgICB0eXBlID0gcFByb2dyZXNzaXZlRGVjb2Rlci0+R2V0VHlwZSgpOwotICAgIGludDMyX3QgaUNvbXBvbmVudHMgPSBwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5HZXROdW1Db21wb25lbnRzKCk7Ci0gICAgaW50MzJfdCBpQnBjID0gcFByb2dyZXNzaXZlRGVjb2Rlci0+R2V0QlBDKCk7Ci0gICAgRlhESUJfRm9ybWF0IGRpYkZvcm1hdCA9IFhGQV9HZXRESUJGb3JtYXQodHlwZSwgaUNvbXBvbmVudHMsIGlCcGMpOwotICAgIHBCaXRtYXAgPSBuZXcgQ0ZYX0RJQml0bWFwKCk7Ci0gICAgcEJpdG1hcC0+Q3JlYXRlKHBQcm9ncmVzc2l2ZURlY29kZXItPkdldFdpZHRoKCksCi0gICAgICAgICAgICAgICAgICAgIHBQcm9ncmVzc2l2ZURlY29kZXItPkdldEhlaWdodCgpLCBkaWJGb3JtYXQpOwotICAgIHBCaXRtYXAtPkNsZWFyKDB4ZmZmZmZmZmYpOwotICAgIGludDMyX3QgbkZyYW1lczsKLSAgICBpZiAoKHBQcm9ncmVzc2l2ZURlY29kZXItPkdldEZyYW1lcyhuRnJhbWVzKSA9PQotICAgICAgICAgRlhDT0RFQ19TVEFUVVNfREVDT0RFX1JFQURZKSAmJgotICAgICAgICAobkZyYW1lcyA+IDApKSB7Ci0gICAgICBwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5TdGFydERlY29kZShwQml0bWFwLCAwLCAwLCBwQml0bWFwLT5HZXRXaWR0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEJpdG1hcC0+R2V0SGVpZ2h0KCkpOwotICAgICAgcFByb2dyZXNzaXZlRGVjb2Rlci0+Q29udGludWVEZWNvZGUoKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHBCaXRtYXA7Ci19Ci0KLXZvaWQgWEZBX1JlY3RXaWR0aG91dE1hcmdpbihDRlhfUmVjdEYmIHJ0LCBjb25zdCBDWEZBX01hcmdpbiYgbWcsIGJvb2wgYlVJKSB7Ci0gIGlmICghbWcpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgRlhfRkxPQVQgZkxlZnRJbnNldCwgZlRvcEluc2V0LCBmUmlnaHRJbnNldCwgZkJvdHRvbUluc2V0OwotICBtZy5HZXRMZWZ0SW5zZXQoZkxlZnRJbnNldCk7Ci0gIG1nLkdldFRvcEluc2V0KGZUb3BJbnNldCk7Ci0gIG1nLkdldFJpZ2h0SW5zZXQoZlJpZ2h0SW5zZXQpOwotICBtZy5HZXRCb3R0b21JbnNldChmQm90dG9tSW5zZXQpOwotICBydC5EZWZsYXRlKGZMZWZ0SW5zZXQsIGZUb3BJbnNldCwgZlJpZ2h0SW5zZXQsIGZCb3R0b21JbnNldCk7Ci19Ci1DWEZBX0ZGV2lkZ2V0KiBYRkFfR2V0V2lkZ2V0RnJvbUxheW91dEl0ZW0oQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSkgewotICBpZiAoWEZBX0lzQ3JlYXRlV2lkZ2V0KHBMYXlvdXRJdGVtLT5HZXRGb3JtTm9kZSgpLT5HZXRFbGVtZW50VHlwZSgpKSkKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KHBMYXlvdXRJdGVtKTsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci1ib29sIFhGQV9Jc0NyZWF0ZVdpZGdldChYRkFfRWxlbWVudCBlVHlwZSkgewotICByZXR1cm4gZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OkZpZWxkIHx8IGVUeXBlID09IFhGQV9FbGVtZW50OjpEcmF3IHx8Ci0gICAgICAgICBlVHlwZSA9PSBYRkFfRWxlbWVudDo6U3ViZm9ybSB8fCBlVHlwZSA9PSBYRkFfRWxlbWVudDo6RXhjbEdyb3VwOwotfQotc3RhdGljIHZvaWQgWEZBX0JPWF9HZXRQYXRoX0FyYyhDWEZBX0JveCBib3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydERyYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoJiBmaWxsUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFncykgewotICBGWF9GTE9BVCBhLCBiOwotICBhID0gcnREcmF3LndpZHRoIC8gMi4wZjsKLSAgYiA9IHJ0RHJhdy5oZWlnaHQgLyAyLjBmOwotICBpZiAoYm94LklzQ2lyY3VsYXIoKSB8fCAoZHdGbGFncyAmIFhGQV9EUkFXQk9YX0ZvcmNlUm91bmQpICE9IDApIHsKLSAgICBhID0gYiA9IHN0ZDo6bWluKGEsIGIpOwotICB9Ci0gIENGWF9Qb2ludEYgY2VudGVyID0gcnREcmF3LkNlbnRlcigpOwotICBydERyYXcubGVmdCA9IGNlbnRlci54IC0gYTsKLSAgcnREcmF3LnRvcCA9IGNlbnRlci55IC0gYjsKLSAgcnREcmF3LndpZHRoID0gYSArIGE7Ci0gIHJ0RHJhdy5oZWlnaHQgPSBiICsgYjsKLSAgRlhfRkxPQVQgc3RhcnRBbmdsZSA9IDAsIHN3ZWVwQW5nbGUgPSAzNjA7Ci0gIGJvb2wgYlN0YXJ0ID0gYm94LkdldFN0YXJ0QW5nbGUoc3RhcnRBbmdsZSk7Ci0gIGJvb2wgYkVuZCA9IGJveC5HZXRTd2VlcEFuZ2xlKHN3ZWVwQW5nbGUpOwotICBpZiAoIWJTdGFydCAmJiAhYkVuZCkgewotICAgIGZpbGxQYXRoLkFkZEVsbGlwc2UocnREcmF3KTsKLSAgICByZXR1cm47Ci0gIH0KLSAgc3RhcnRBbmdsZSA9IC1zdGFydEFuZ2xlICogRlhfUEkgLyAxODAuMGY7Ci0gIHN3ZWVwQW5nbGUgPSAtc3dlZXBBbmdsZSAqIEZYX1BJIC8gMTgwLjBmOwotICBmaWxsUGF0aC5BZGRBcmMocnREcmF3LlRvcExlZnQoKSwgcnREcmF3LlNpemUoKSwgc3RhcnRBbmdsZSwgc3dlZXBBbmdsZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFhGQV9CT1hfR2V0UGF0aChDWEZBX0JveCBib3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q1hGQV9TdHJva2U+JiBzdHJva2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aCYgcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJDb3JuZXIpIHsKLSAgQVNTRVJUKG5JbmRleCA+PSAwICYmIG5JbmRleCA8IDgpOwotICBpbnQzMl90IG4gPSAobkluZGV4ICYgMSkgPyBuSW5kZXggLSAxIDogbkluZGV4OwotICBDWEZBX0Nvcm5lciBjb3JuZXIxKHN0cm9rZXNbbl0uR2V0Tm9kZSgpKTsKLSAgQ1hGQV9Db3JuZXIgY29ybmVyMihzdHJva2VzWyhuICsgMikgJSA4XS5HZXROb2RlKCkpOwotICBGWF9GTE9BVCBmUmFkaXVzMSA9IGJDb3JuZXIgPyBjb3JuZXIxLkdldFJhZGl1cygpIDogMC4wZjsKLSAgRlhfRkxPQVQgZlJhZGl1czIgPSBiQ29ybmVyID8gY29ybmVyMi5HZXRSYWRpdXMoKSA6IDAuMGY7Ci0gIGJvb2wgYkludmVydGVkID0gY29ybmVyMS5Jc0ludmVydGVkKCk7Ci0gIEZYX0ZMT0FUIG9mZnNldFkgPSAwLjBmOwotICBGWF9GTE9BVCBvZmZzZXRYID0gMC4wZjsKLSAgYm9vbCBiUm91bmQgPSBjb3JuZXIxLkdldEpvaW5UeXBlKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm91bmQ7Ci0gIEZYX0ZMT0FUIGhhbGZBZnRlciA9IDAuMGY7Ci0gIEZYX0ZMT0FUIGhhbGZCZWZvcmUgPSAwLjBmOwotICBDWEZBX1N0cm9rZSBzdHJva2UgPSBzdHJva2VzW25JbmRleF07Ci0gIGlmIChzdHJva2UuSXNDb3JuZXIoKSkgewotICAgIENYRkFfU3Ryb2tlIGVkZ2VCZWZvcmUgPSBzdHJva2VzWyhuSW5kZXggKyAxICogOCAtIDEpICUgOF07Ci0gICAgQ1hGQV9TdHJva2UgZWRnZUFmdGVyID0gc3Ryb2tlc1tuSW5kZXggKyAxXTsKLSAgICBpZiAoc3Ryb2tlLklzSW52ZXJ0ZWQoKSkgewotICAgICAgaWYgKCFzdHJva2UuU2FtZVN0eWxlcyhlZGdlQmVmb3JlKSkgewotICAgICAgICBoYWxmQmVmb3JlID0gZWRnZUJlZm9yZS5HZXRUaGlja25lc3MoKSAvIDI7Ci0gICAgICB9Ci0gICAgICBpZiAoIXN0cm9rZS5TYW1lU3R5bGVzKGVkZ2VBZnRlcikpIHsKLSAgICAgICAgaGFsZkFmdGVyID0gZWRnZUFmdGVyLkdldFRoaWNrbmVzcygpIC8gMjsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgQ1hGQV9TdHJva2UgZWRnZUJlZm9yZSA9IHN0cm9rZXNbKG5JbmRleCArIDggLSAyKSAlIDhdOwotICAgIENYRkFfU3Ryb2tlIGVkZ2VBZnRlciA9IHN0cm9rZXNbKG5JbmRleCArIDIpICUgOF07Ci0gICAgaWYgKCFiUm91bmQgJiYgIWJJbnZlcnRlZCkgewotICAgICAgaGFsZkJlZm9yZSA9IGVkZ2VCZWZvcmUuR2V0VGhpY2tuZXNzKCkgLyAyOwotICAgICAgaGFsZkFmdGVyID0gZWRnZUFmdGVyLkdldFRoaWNrbmVzcygpIC8gMjsKLSAgICB9Ci0gIH0KLSAgRlhfRkxPQVQgb2Zmc2V0RVggPSAwLjBmOwotICBGWF9GTE9BVCBvZmZzZXRFWSA9IDAuMGY7Ci0gIEZYX0ZMT0FUIHN4ID0gMC4wZjsKLSAgRlhfRkxPQVQgc3kgPSAwLjBmOwotICBGWF9GTE9BVCB2eCA9IDEuMGY7Ci0gIEZYX0ZMT0FUIHZ5ID0gMS4wZjsKLSAgRlhfRkxPQVQgbnggPSAxLjBmOwotICBGWF9GTE9BVCBueSA9IDEuMGY7Ci0gIENGWF9Qb2ludEYgY3BTdGFydDsKLSAgQ0ZYX1BvaW50RiBjcDE7Ci0gIENGWF9Qb2ludEYgY3AyOwotICBpZiAoYlJvdW5kKSB7Ci0gICAgc3kgPSBGWF9QSSAvIDI7Ci0gIH0KLSAgc3dpdGNoIChuSW5kZXgpIHsKLSAgICBjYXNlIDA6Ci0gICAgY2FzZSAxOgotICAgICAgY3AxID0gcnRXaWRnZXQuVG9wTGVmdCgpOwotICAgICAgY3AyID0gcnRXaWRnZXQuVG9wUmlnaHQoKTsKLSAgICAgIGlmIChuSW5kZXggPT0gMCkgewotICAgICAgICBjcFN0YXJ0LnggPSBjcDEueCAtIGhhbGZCZWZvcmU7Ci0gICAgICAgIGNwU3RhcnQueSA9IGNwMS55ICsgZlJhZGl1czEsIG9mZnNldFkgPSAtaGFsZkFmdGVyOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY3BTdGFydC54ID0gY3AxLnggKyBmUmFkaXVzMSAtIGhhbGZCZWZvcmUsIGNwU3RhcnQueSA9IGNwMS55LAotICAgICAgICBvZmZzZXRFWCA9IGhhbGZBZnRlcjsKLSAgICAgIH0KLSAgICAgIHZ4ID0gMSwgdnkgPSAxOwotICAgICAgbnggPSAtMSwgbnkgPSAwOwotICAgICAgaWYgKGJSb3VuZCkgewotICAgICAgICBzeCA9IGJJbnZlcnRlZCA/IEZYX1BJIC8gMiA6IEZYX1BJOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3ggPSAxLCBzeSA9IDA7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSAzOgotICAgICAgY3AxID0gcnRXaWRnZXQuVG9wUmlnaHQoKTsKLSAgICAgIGNwMiA9IHJ0V2lkZ2V0LkJvdHRvbVJpZ2h0KCk7Ci0gICAgICBpZiAobkluZGV4ID09IDIpIHsKLSAgICAgICAgY3BTdGFydC54ID0gY3AxLnggLSBmUmFkaXVzMSwgY3BTdGFydC55ID0gY3AxLnkgLSBoYWxmQmVmb3JlLAotICAgICAgICBvZmZzZXRYID0gaGFsZkFmdGVyOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY3BTdGFydC54ID0gY3AxLngsIGNwU3RhcnQueSA9IGNwMS55ICsgZlJhZGl1czEgLSBoYWxmQmVmb3JlLAotICAgICAgICBvZmZzZXRFWSA9IGhhbGZBZnRlcjsKLSAgICAgIH0KLSAgICAgIHZ4ID0gLTEsIHZ5ID0gMTsKLSAgICAgIG54ID0gMCwgbnkgPSAtMTsKLSAgICAgIGlmIChiUm91bmQpIHsKLSAgICAgICAgc3ggPSBiSW52ZXJ0ZWQgPyBGWF9QSSA6IEZYX1BJICogMyAvIDI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzeCA9IDAsIHN5ID0gMTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICBjYXNlIDU6Ci0gICAgICBjcDEgPSBydFdpZGdldC5Cb3R0b21SaWdodCgpOwotICAgICAgY3AyID0gcnRXaWRnZXQuQm90dG9tTGVmdCgpOwotICAgICAgaWYgKG5JbmRleCA9PSA0KSB7Ci0gICAgICAgIGNwU3RhcnQueCA9IGNwMS54ICsgaGFsZkJlZm9yZSwgY3BTdGFydC55ID0gY3AxLnkgLSBmUmFkaXVzMSwKLSAgICAgICAgb2Zmc2V0WSA9IGhhbGZBZnRlcjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNwU3RhcnQueCA9IGNwMS54IC0gZlJhZGl1czEgKyBoYWxmQmVmb3JlLCBjcFN0YXJ0LnkgPSBjcDEueSwKLSAgICAgICAgb2Zmc2V0RVggPSAtaGFsZkFmdGVyOwotICAgICAgfQotICAgICAgdnggPSAtMSwgdnkgPSAtMTsKLSAgICAgIG54ID0gMSwgbnkgPSAwOwotICAgICAgaWYgKGJSb3VuZCkgewotICAgICAgICBzeCA9IGJJbnZlcnRlZCA/IEZYX1BJICogMyAvIDIgOiAwOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3ggPSAtMSwgc3kgPSAwOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSA2OgotICAgIGNhc2UgNzoKLSAgICAgIGNwMSA9IHJ0V2lkZ2V0LkJvdHRvbUxlZnQoKTsKLSAgICAgIGNwMiA9IHJ0V2lkZ2V0LlRvcExlZnQoKTsKLSAgICAgIGlmIChuSW5kZXggPT0gNikgewotICAgICAgICBjcFN0YXJ0LnggPSBjcDEueCArIGZSYWRpdXMxLCBjcFN0YXJ0LnkgPSBjcDEueSArIGhhbGZCZWZvcmUsCi0gICAgICAgIG9mZnNldFggPSAtaGFsZkFmdGVyOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY3BTdGFydC54ID0gY3AxLngsIGNwU3RhcnQueSA9IGNwMS55IC0gZlJhZGl1czEgKyBoYWxmQmVmb3JlLAotICAgICAgICBvZmZzZXRFWSA9IC1oYWxmQWZ0ZXI7Ci0gICAgICB9Ci0gICAgICB2eCA9IDE7Ci0gICAgICB2eSA9IC0xOwotICAgICAgbnggPSAwOwotICAgICAgbnkgPSAxOwotICAgICAgaWYgKGJSb3VuZCkgewotICAgICAgICBzeCA9IGJJbnZlcnRlZCA/IDAgOiBGWF9QSSAvIDI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzeCA9IDA7Ci0gICAgICAgIHN5ID0gLTE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgfQotICBpZiAoYlN0YXJ0KSB7Ci0gICAgcGF0aC5Nb3ZlVG8oY3BTdGFydCk7Ci0gIH0KLSAgaWYgKG5JbmRleCAmIDEpIHsKLSAgICBwYXRoLkxpbmVUbyhDRlhfUG9pbnRGKGNwMi54ICsgZlJhZGl1czIgKiBueCArIG9mZnNldEVYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AyLnkgKyBmUmFkaXVzMiAqIG55ICsgb2Zmc2V0RVkpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGJSb3VuZCkgewotICAgIGlmIChmUmFkaXVzMSA8IDApCi0gICAgICBzeCAtPSBGWF9QSTsKLSAgICBpZiAoYkludmVydGVkKQotICAgICAgc3kgKj0gLTE7Ci0KLSAgICBDRlhfUmVjdEYgcnRSYWRpdXMoY3AxLnggKyBvZmZzZXRYICogMiwgY3AxLnkgKyBvZmZzZXRZICogMiwKLSAgICAgICAgICAgICAgICAgICAgICAgZlJhZGl1czEgKiAyICogdnggLSBvZmZzZXRYICogMiwKLSAgICAgICAgICAgICAgICAgICAgICAgZlJhZGl1czEgKiAyICogdnkgLSBvZmZzZXRZICogMik7Ci0gICAgcnRSYWRpdXMuTm9ybWFsaXplKCk7Ci0gICAgaWYgKGJJbnZlcnRlZCkKLSAgICAgIHJ0UmFkaXVzLk9mZnNldCgtZlJhZGl1czEgKiB2eCwgLWZSYWRpdXMxICogdnkpOwotCi0gICAgcGF0aC5BcmNUbyhydFJhZGl1cy5Ub3BMZWZ0KCksIHJ0UmFkaXVzLlNpemUoKSwgc3gsIHN5KTsKLSAgfSBlbHNlIHsKLSAgICBDRlhfUG9pbnRGIGNwOwotICAgIGlmIChiSW52ZXJ0ZWQpIHsKLSAgICAgIGNwLnggPSBjcDEueCArIGZSYWRpdXMxICogdng7Ci0gICAgICBjcC55ID0gY3AxLnkgKyBmUmFkaXVzMSAqIHZ5OwotICAgIH0gZWxzZSB7Ci0gICAgICBjcCA9IGNwMTsKLSAgICB9Ci0gICAgcGF0aC5MaW5lVG8oY3ApOwotICAgIHBhdGguTGluZVRvKENGWF9Qb2ludEYoY3AxLnggKyBmUmFkaXVzMSAqIHN4ICsgb2Zmc2V0WCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwMS55ICsgZlJhZGl1czEgKiBzeSArIG9mZnNldFkpKTsKLSAgfQotfQotc3RhdGljIHZvaWQgWEZBX0JPWF9HZXRGaWxsUGF0aChDWEZBX0JveCBib3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENYRkFfU3Ryb2tlPiYgc3Ryb2tlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aCYgZmlsbFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGR3RmxhZ3MpIHsKLSAgaWYgKGJveC5Jc0FyYygpIHx8IChkd0ZsYWdzICYgWEZBX0RSQVdCT1hfRm9yY2VSb3VuZCkgIT0gMCkgewotICAgIENYRkFfRWRnZSBlZGdlID0gYm94LkdldEVkZ2UoMCk7Ci0gICAgRlhfRkxPQVQgZlRoaWNrbmVzcyA9IGVkZ2UuR2V0VGhpY2tuZXNzKCk7Ci0gICAgaWYgKGZUaGlja25lc3MgPCAwKSB7Ci0gICAgICBmVGhpY2tuZXNzID0gMDsKLSAgICB9Ci0gICAgRlhfRkxPQVQgZkhhbGYgPSBmVGhpY2tuZXNzIC8gMjsKLSAgICBpbnQzMl90IGlIYW5kID0gYm94LkdldEhhbmQoKTsKLSAgICBpZiAoaUhhbmQgPT0gWEZBX0FUVFJJQlVURUVOVU1fTGVmdCkgewotICAgICAgcnRXaWRnZXQuSW5mbGF0ZShmSGFsZiwgZkhhbGYpOwotICAgIH0gZWxzZSBpZiAoaUhhbmQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQpIHsKLSAgICAgIHJ0V2lkZ2V0LkRlZmxhdGUoZkhhbGYsIGZIYWxmKTsKLSAgICB9Ci0gICAgWEZBX0JPWF9HZXRQYXRoX0FyYyhib3gsIHJ0V2lkZ2V0LCBmaWxsUGF0aCwgZHdGbGFncyk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGJvb2wgYlNhbWVTdHlsZXMgPSB0cnVlOwotICBDWEZBX1N0cm9rZSBzdHJva2UxID0gc3Ryb2tlc1swXTsKLSAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgODsgaSsrKSB7Ci0gICAgQ1hGQV9TdHJva2Ugc3Ryb2tlMiA9IHN0cm9rZXNbaV07Ci0gICAgaWYgKCFzdHJva2UxLlNhbWVTdHlsZXMoc3Ryb2tlMikpIHsKLSAgICAgIGJTYW1lU3R5bGVzID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgc3Ryb2tlMSA9IHN0cm9rZTI7Ci0gIH0KLSAgaWYgKGJTYW1lU3R5bGVzKSB7Ci0gICAgc3Ryb2tlMSA9IHN0cm9rZXNbMF07Ci0gICAgZm9yIChpbnQzMl90IGkgPSAyOyBpIDwgODsgaSArPSAyKSB7Ci0gICAgICBDWEZBX1N0cm9rZSBzdHJva2UyID0gc3Ryb2tlc1tpXTsKLSAgICAgIGlmICghc3Ryb2tlMS5TYW1lU3R5bGVzKHN0cm9rZTIsIFhGQV9TVFJPS0VfU0FNRVNUWUxFX05vUHJlc2VuY2UgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9TVFJPS0VfU0FNRVNUWUxFX0Nvcm5lcikpIHsKLSAgICAgICAgYlNhbWVTdHlsZXMgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBzdHJva2UxID0gc3Ryb2tlMjsKLSAgICB9Ci0gICAgaWYgKGJTYW1lU3R5bGVzKSB7Ci0gICAgICBzdHJva2UxID0gc3Ryb2tlc1swXTsKLSAgICAgIGlmIChzdHJva2UxLklzSW52ZXJ0ZWQoKSkgewotICAgICAgICBiU2FtZVN0eWxlcyA9IGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKHN0cm9rZTEuR2V0Sm9pblR5cGUoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9TcXVhcmUpIHsKLSAgICAgICAgYlNhbWVTdHlsZXMgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaWYgKGJTYW1lU3R5bGVzKSB7Ci0gICAgZmlsbFBhdGguQWRkUmVjdGFuZ2xlKHJ0V2lkZ2V0LmxlZnQsIHJ0V2lkZ2V0LnRvcCwgcnRXaWRnZXQud2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJ0V2lkZ2V0LmhlaWdodCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgODsgaSArPSAyKSB7Ci0gICAgRlhfRkxPQVQgc3ggPSAwLjBmOwotICAgIEZYX0ZMT0FUIHN5ID0gMC4wZjsKLSAgICBGWF9GTE9BVCB2eCA9IDEuMGY7Ci0gICAgRlhfRkxPQVQgdnkgPSAxLjBmOwotICAgIEZYX0ZMT0FUIG54ID0gMS4wZjsKLSAgICBGWF9GTE9BVCBueSA9IDEuMGY7Ci0gICAgQ0ZYX1BvaW50RiBjcDEsIGNwMjsKLSAgICBDWEZBX0Nvcm5lciBjb3JuZXIxKHN0cm9rZXNbaV0uR2V0Tm9kZSgpKTsKLSAgICBDWEZBX0Nvcm5lciBjb3JuZXIyKHN0cm9rZXNbKGkgKyAyKSAlIDhdLkdldE5vZGUoKSk7Ci0gICAgRlhfRkxPQVQgZlJhZGl1czEgPSBjb3JuZXIxLkdldFJhZGl1cygpOwotICAgIEZYX0ZMT0FUIGZSYWRpdXMyID0gY29ybmVyMi5HZXRSYWRpdXMoKTsKLSAgICBib29sIGJJbnZlcnRlZCA9IGNvcm5lcjEuSXNJbnZlcnRlZCgpOwotICAgIGJvb2wgYlJvdW5kID0gY29ybmVyMS5HZXRKb2luVHlwZSgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1JvdW5kOwotICAgIGlmIChiUm91bmQpIHsKLSAgICAgIHN5ID0gRlhfUEkgLyAyOwotICAgIH0KLSAgICBzd2l0Y2ggKGkpIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgY3AxID0gcnRXaWRnZXQuVG9wTGVmdCgpOwotICAgICAgICBjcDIgPSBydFdpZGdldC5Ub3BSaWdodCgpOwotICAgICAgICB2eCA9IDEsIHZ5ID0gMTsKLSAgICAgICAgbnggPSAtMSwgbnkgPSAwOwotICAgICAgICBpZiAoYlJvdW5kKSB7Ci0gICAgICAgICAgc3ggPSBiSW52ZXJ0ZWQgPyBGWF9QSSAvIDIgOiBGWF9QSTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzeCA9IDEsIHN5ID0gMDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgY3AxID0gcnRXaWRnZXQuVG9wUmlnaHQoKTsKLSAgICAgICAgY3AyID0gcnRXaWRnZXQuQm90dG9tUmlnaHQoKTsKLSAgICAgICAgdnggPSAtMSwgdnkgPSAxOwotICAgICAgICBueCA9IDAsIG55ID0gLTE7Ci0gICAgICAgIGlmIChiUm91bmQpIHsKLSAgICAgICAgICBzeCA9IGJJbnZlcnRlZCA/IEZYX1BJIDogRlhfUEkgKiAzIC8gMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzeCA9IDAsIHN5ID0gMTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNDoKLSAgICAgICAgY3AxID0gcnRXaWRnZXQuQm90dG9tUmlnaHQoKTsKLSAgICAgICAgY3AyID0gcnRXaWRnZXQuQm90dG9tTGVmdCgpOwotICAgICAgICB2eCA9IC0xLCB2eSA9IC0xOwotICAgICAgICBueCA9IDEsIG55ID0gMDsKLSAgICAgICAgaWYgKGJSb3VuZCkgewotICAgICAgICAgIHN4ID0gYkludmVydGVkID8gRlhfUEkgKiAzIC8gMiA6IDA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3ggPSAtMSwgc3kgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA2OgotICAgICAgICBjcDEgPSBydFdpZGdldC5Cb3R0b21MZWZ0KCk7Ci0gICAgICAgIGNwMiA9IHJ0V2lkZ2V0LlRvcExlZnQoKTsKLSAgICAgICAgdnggPSAxLCB2eSA9IC0xOwotICAgICAgICBueCA9IDAsIG55ID0gMTsKLSAgICAgICAgaWYgKGJSb3VuZCkgewotICAgICAgICAgIHN4ID0gYkludmVydGVkID8gMCA6IEZYX1BJIC8gMjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzeCA9IDA7Ci0gICAgICAgICAgc3kgPSAtMTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGkgPT0gMCkKLSAgICAgIGZpbGxQYXRoLk1vdmVUbyhDRlhfUG9pbnRGKGNwMS54LCBjcDEueSArIGZSYWRpdXMxKSk7Ci0KLSAgICBpZiAoYlJvdW5kKSB7Ci0gICAgICBpZiAoZlJhZGl1czEgPCAwKQotICAgICAgICBzeCAtPSBGWF9QSTsKLSAgICAgIGlmIChiSW52ZXJ0ZWQpCi0gICAgICAgIHN5ICo9IC0xOwotCi0gICAgICBDRlhfUmVjdEYgcnRSYWRpdXMoY3AxLngsIGNwMS55LCBmUmFkaXVzMSAqIDIgKiB2eCwgZlJhZGl1czEgKiAyICogdnkpOwotICAgICAgcnRSYWRpdXMuTm9ybWFsaXplKCk7Ci0gICAgICBpZiAoYkludmVydGVkKQotICAgICAgICBydFJhZGl1cy5PZmZzZXQoLWZSYWRpdXMxICogdngsIC1mUmFkaXVzMSAqIHZ5KTsKLQotICAgICAgZmlsbFBhdGguQXJjVG8ocnRSYWRpdXMuVG9wTGVmdCgpLCBydFJhZGl1cy5TaXplKCksIHN4LCBzeSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIENGWF9Qb2ludEYgY3A7Ci0gICAgICBpZiAoYkludmVydGVkKSB7Ci0gICAgICAgIGNwLnggPSBjcDEueCArIGZSYWRpdXMxICogdng7Ci0gICAgICAgIGNwLnkgPSBjcDEueSArIGZSYWRpdXMxICogdnk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjcCA9IGNwMTsKLSAgICAgIH0KLSAgICAgIGZpbGxQYXRoLkxpbmVUbyhjcCk7Ci0gICAgICBmaWxsUGF0aC5MaW5lVG8oQ0ZYX1BvaW50RihjcDEueCArIGZSYWRpdXMxICogc3gsIGNwMS55ICsgZlJhZGl1czEgKiBzeSkpOwotICAgIH0KLSAgICBmaWxsUGF0aC5MaW5lVG8oQ0ZYX1BvaW50RihjcDIueCArIGZSYWRpdXMyICogbngsIGNwMi55ICsgZlJhZGl1czIgKiBueSkpOwotICB9Ci19Ci1zdGF0aWMgdm9pZCBYRkFfQk9YX0ZpbGxfUmFkaWFsKENYRkFfQm94IGJveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoJiBmaWxsUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0RmlsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBDWEZBX0ZpbGwgZmlsbCA9IGJveC5HZXRGaWxsKCk7Ci0gIEZYX0FSR0IgY3JTdGFydCwgY3JFbmQ7Ci0gIGNyU3RhcnQgPSBmaWxsLkdldENvbG9yKCk7Ci0gIGludDMyX3QgaVR5cGUgPSBmaWxsLkdldFJhZGlhbChjckVuZCk7Ci0gIGlmIChpVHlwZSAhPSBYRkFfQVRUUklCVVRFRU5VTV9Ub0VkZ2UpIHsKLSAgICBGWF9BUkdCIHRlbXAgPSBjckVuZDsKLSAgICBjckVuZCA9IGNyU3RhcnQ7Ci0gICAgY3JTdGFydCA9IHRlbXA7Ci0gIH0KLSAgQ0ZYX1NoYWRpbmcgc2hhZGluZyhydEZpbGwuQ2VudGVyKCksIHJ0RmlsbC5DZW50ZXIoKSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICBGWFNZU19zcXJ0KHJ0RmlsbC5XaWR0aCgpICogcnRGaWxsLldpZHRoKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRGaWxsLkhlaWdodCgpICogcnRGaWxsLkhlaWdodCgpKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDIsCi0gICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgdHJ1ZSwgY3JTdGFydCwgY3JFbmQpOwotICBDRlhfQ29sb3IgY3IoJnNoYWRpbmcpOwotICBwR1MtPlNldEZpbGxDb2xvcigmY3IpOwotICBwR1MtPkZpbGxQYXRoKCZmaWxsUGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOwotfQotc3RhdGljIHZvaWQgWEZBX0JPWF9GaWxsX1BhdHRlcm4oQ1hGQV9Cb3ggYm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUGF0aCYgZmlsbFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnRGaWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBDWEZBX0ZpbGwgZmlsbCA9IGJveC5HZXRGaWxsKCk7Ci0gIEZYX0FSR0IgY3JTdGFydCwgY3JFbmQ7Ci0gIGNyU3RhcnQgPSBmaWxsLkdldENvbG9yKCk7Ci0gIGludDMyX3QgaVR5cGUgPSBmaWxsLkdldFBhdHRlcm4oY3JFbmQpOwotICBGWF9IYXRjaFN0eWxlIGlIYXRjaCA9IEZYX0hhdGNoU3R5bGU6OkNyb3NzOwotICBzd2l0Y2ggKGlUeXBlKSB7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Dcm9zc0RpYWdvbmFsOgotICAgICAgaUhhdGNoID0gRlhfSGF0Y2hTdHlsZTo6RGlhZ29uYWxDcm9zczsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRGlhZ29uYWxMZWZ0OgotICAgICAgaUhhdGNoID0gRlhfSGF0Y2hTdHlsZTo6Rm9yd2FyZERpYWdvbmFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9EaWFnb25hbFJpZ2h0OgotICAgICAgaUhhdGNoID0gRlhfSGF0Y2hTdHlsZTo6QmFja3dhcmREaWFnb25hbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSG9yaXpvbnRhbDoKLSAgICAgIGlIYXRjaCA9IEZYX0hhdGNoU3R5bGU6Okhvcml6b250YWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1ZlcnRpY2FsOgotICAgICAgaUhhdGNoID0gRlhfSGF0Y2hTdHlsZTo6VmVydGljYWw7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICBDRlhfUGF0dGVybiBwYXR0ZXJuKGlIYXRjaCwgY3JFbmQsIGNyU3RhcnQpOwotICBDRlhfQ29sb3IgY3IoJnBhdHRlcm4sIDB4MCk7Ci0gIHBHUy0+U2V0RmlsbENvbG9yKCZjcik7Ci0gIHBHUy0+RmlsbFBhdGgoJmZpbGxQYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7Ci19Ci1zdGF0aWMgdm9pZCBYRkFfQk9YX0ZpbGxfTGluZWFyKENYRkFfQm94IGJveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9QYXRoJiBmaWxsUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0RmlsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBDWEZBX0ZpbGwgZmlsbCA9IGJveC5HZXRGaWxsKCk7Ci0gIEZYX0FSR0IgY3JTdGFydCA9IGZpbGwuR2V0Q29sb3IoKTsKLSAgRlhfQVJHQiBjckVuZDsKLSAgaW50MzJfdCBpVHlwZSA9IGZpbGwuR2V0TGluZWFyKGNyRW5kKTsKLSAgQ0ZYX1BvaW50RiBwdFN0YXJ0OwotICBDRlhfUG9pbnRGIHB0RW5kOwotICBzd2l0Y2ggKGlUeXBlKSB7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub1JpZ2h0OgotICAgICAgcHRTdGFydCA9IENGWF9Qb2ludEYocnRGaWxsLmxlZnQsIHJ0RmlsbC50b3ApOwotICAgICAgcHRFbmQgPSBDRlhfUG9pbnRGKHJ0RmlsbC5yaWdodCgpLCBydEZpbGwudG9wKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9Cb3R0b206Ci0gICAgICBwdFN0YXJ0ID0gQ0ZYX1BvaW50RihydEZpbGwubGVmdCwgcnRGaWxsLnRvcCk7Ci0gICAgICBwdEVuZCA9IENGWF9Qb2ludEYocnRGaWxsLmxlZnQsIHJ0RmlsbC5ib3R0b20oKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvTGVmdDoKLSAgICAgIHB0U3RhcnQgPSBDRlhfUG9pbnRGKHJ0RmlsbC5yaWdodCgpLCBydEZpbGwudG9wKTsKLSAgICAgIHB0RW5kID0gQ0ZYX1BvaW50RihydEZpbGwubGVmdCwgcnRGaWxsLnRvcCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvVG9wOgotICAgICAgcHRTdGFydCA9IENGWF9Qb2ludEYocnRGaWxsLmxlZnQsIHJ0RmlsbC5ib3R0b20oKSk7Ci0gICAgICBwdEVuZCA9IENGWF9Qb2ludEYocnRGaWxsLmxlZnQsIHJ0RmlsbC50b3ApOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0gIENGWF9TaGFkaW5nIHNoYWRpbmcocHRTdGFydCwgcHRFbmQsIGZhbHNlLCBmYWxzZSwgY3JTdGFydCwgY3JFbmQpOwotICBDRlhfQ29sb3IgY3IoJnNoYWRpbmcpOwotICBwR1MtPlNldEZpbGxDb2xvcigmY3IpOwotICBwR1MtPkZpbGxQYXRoKCZmaWxsUGF0aCwgRlhGSUxMX1dJTkRJTkcsIHBNYXRyaXgpOwotfQotc3RhdGljIHZvaWQgWEZBX0JPWF9GaWxsKENYRkFfQm94IGJveCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDWEZBX1N0cm9rZT4mIHN0cm9rZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZ3MpIHsKLSAgQ1hGQV9GaWxsIGZpbGwgPSBib3guR2V0RmlsbCgpOwotICBpZiAoIWZpbGwgfHwgZmlsbC5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUpCi0gICAgcmV0dXJuOwotCi0gIHBHUy0+U2F2ZUdyYXBoU3RhdGUoKTsKLSAgQ0ZYX1BhdGggZmlsbFBhdGg7Ci0gIFhGQV9CT1hfR2V0RmlsbFBhdGgoYm94LCBzdHJva2VzLCBydFdpZGdldCwgZmlsbFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgKGR3RmxhZ3MgJiBYRkFfRFJBV0JPWF9Gb3JjZVJvdW5kKSAhPSAwKTsKLSAgZmlsbFBhdGguQ2xvc2UoKTsKLSAgWEZBX0VsZW1lbnQgZVR5cGUgPSBmaWxsLkdldEZpbGxUeXBlKCk7Ci0gIHN3aXRjaCAoZVR5cGUpIHsKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpSYWRpYWw6Ci0gICAgICBYRkFfQk9YX0ZpbGxfUmFkaWFsKGJveCwgcEdTLCBmaWxsUGF0aCwgcnRXaWRnZXQsIHBNYXRyaXgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6UGF0dGVybjoKLSAgICAgIFhGQV9CT1hfRmlsbF9QYXR0ZXJuKGJveCwgcEdTLCBmaWxsUGF0aCwgcnRXaWRnZXQsIHBNYXRyaXgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6TGluZWFyOgotICAgICAgWEZBX0JPWF9GaWxsX0xpbmVhcihib3gsIHBHUywgZmlsbFBhdGgsIHJ0V2lkZ2V0LCBwTWF0cml4KTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6IHsKLSAgICAgIEZYX0FSR0IgY3I7Ci0gICAgICBpZiAoZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OlN0aXBwbGUpIHsKLSAgICAgICAgaW50MzJfdCBpUmF0ZSA9IGZpbGwuR2V0U3RpcHBsZShjcik7Ci0gICAgICAgIGlmIChpUmF0ZSA9PSAwKSB7Ci0gICAgICAgICAgaVJhdGUgPSAxMDA7Ci0gICAgICAgIH0KLSAgICAgICAgaW50MzJfdCBhID0gMDsKLSAgICAgICAgRlhfQ09MT1JSRUYgcmdiOwotICAgICAgICBBcmdiRGVjb2RlKGNyLCBhLCByZ2IpOwotICAgICAgICBjciA9IEFyZ2JFbmNvZGUoaVJhdGUgKiBhIC8gMTAwLCByZ2IpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY3IgPSBmaWxsLkdldENvbG9yKCk7Ci0gICAgICB9Ci0gICAgICBDRlhfQ29sb3IgZmlsbENvbG9yKGNyKTsKLSAgICAgIHBHUy0+U2V0RmlsbENvbG9yKCZmaWxsQ29sb3IpOwotICAgICAgcEdTLT5GaWxsUGF0aCgmZmlsbFBhdGgsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsKLSAgICB9IGJyZWFrOwotICB9Ci0gIHBHUy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsKLX0KLXN0YXRpYyB2b2lkIFhGQV9CT1hfU3Ryb2tlUGF0aChDWEZBX1N0cm9rZSBzdHJva2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1BhdGgqIHBQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgaWYgKCFzdHJva2UgfHwgIXN0cm9rZS5Jc1Zpc2libGUoKSkgewotICAgIHJldHVybjsKLSAgfQotICBGWF9GTE9BVCBmVGhpY2tuZXNzID0gc3Ryb2tlLkdldFRoaWNrbmVzcygpOwotICBpZiAoZlRoaWNrbmVzcyA8IDAuMDAxZikgewotICAgIHJldHVybjsKLSAgfQotICBwR1MtPlNhdmVHcmFwaFN0YXRlKCk7Ci0gIGlmIChzdHJva2UuSXNDb3JuZXIoKSAmJiBmVGhpY2tuZXNzID4gMiAqIHN0cm9rZS5HZXRSYWRpdXMoKSkgewotICAgIGZUaGlja25lc3MgPSAyICogc3Ryb2tlLkdldFJhZGl1cygpOwotICB9Ci0gIHBHUy0+U2V0TGluZVdpZHRoKGZUaGlja25lc3MsIHRydWUpOwotICBwR1MtPlNldExpbmVDYXAoQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwQnV0dCk7Ci0gIFhGQV9TdHJva2VUeXBlU2V0TGluZURhc2gocEdTLCBzdHJva2UuR2V0U3Ryb2tlVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX0J1dHQpOwotICBDRlhfQ29sb3IgZnhDb2xvcihzdHJva2UuR2V0Q29sb3IoKSk7Ci0gIHBHUy0+U2V0U3Ryb2tlQ29sb3IoJmZ4Q29sb3IpOwotICBwR1MtPlN0cm9rZVBhdGgocFBhdGgsIHBNYXRyaXgpOwotICBwR1MtPlJlc3RvcmVHcmFwaFN0YXRlKCk7Ci19Ci1zdGF0aWMgdm9pZCBYRkFfQk9YX1N0cm9rZUFyYyhDWEZBX0JveCBib3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzKSB7Ci0gIENYRkFfRWRnZSBlZGdlID0gYm94LkdldEVkZ2UoMCk7Ci0gIGlmICghZWRnZSB8fCAhZWRnZS5Jc1Zpc2libGUoKSkgewotICAgIHJldHVybjsKLSAgfQotICBib29sIGJWaXNpYmxlID0gZmFsc2U7Ci0gIEZYX0ZMT0FUIGZUaGlja25lc3MgPSAwOwotICBpbnQzMl90IGkzRFR5cGUgPSBib3guR2V0M0RTdHlsZShiVmlzaWJsZSwgZlRoaWNrbmVzcyk7Ci0gIGlmIChpM0RUeXBlKSB7Ci0gICAgaWYgKGJWaXNpYmxlICYmIGZUaGlja25lc3MgPj0gMC4wMDFmKSB7Ci0gICAgICBkd0ZsYWdzIHw9IFhGQV9EUkFXQk9YX0xvd2VyZWQzRDsKLSAgICB9Ci0gIH0KLSAgRlhfRkxPQVQgZkhhbGYgPSBlZGdlLkdldFRoaWNrbmVzcygpIC8gMjsKLSAgaWYgKGZIYWxmIDwgMCkgewotICAgIGZIYWxmID0gMDsKLSAgfQotICBpbnQzMl90IGlIYW5kID0gYm94LkdldEhhbmQoKTsKLSAgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQpIHsKLSAgICBydFdpZGdldC5JbmZsYXRlKGZIYWxmLCBmSGFsZik7Ci0gIH0gZWxzZSBpZiAoaUhhbmQgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQpIHsKLSAgICBydFdpZGdldC5EZWZsYXRlKGZIYWxmLCBmSGFsZik7Ci0gIH0KLSAgaWYgKChkd0ZsYWdzICYgWEZBX0RSQVdCT1hfRm9yY2VSb3VuZCkgPT0gMCB8fAotICAgICAgKGR3RmxhZ3MgJiBYRkFfRFJBV0JPWF9Mb3dlcmVkM0QpID09IDApIHsKLSAgICBpZiAoZkhhbGYgPCAwLjAwMWYpCi0gICAgICByZXR1cm47Ci0KLSAgICBDRlhfUGF0aCBhcmNQYXRoOwotICAgIFhGQV9CT1hfR2V0UGF0aF9BcmMoYm94LCBydFdpZGdldCwgYXJjUGF0aCwgZHdGbGFncyk7Ci0gICAgWEZBX0JPWF9TdHJva2VQYXRoKGVkZ2UsICZhcmNQYXRoLCBwR1MsIHBNYXRyaXgpOwotICAgIHJldHVybjsKLSAgfQotICBwR1MtPlNhdmVHcmFwaFN0YXRlKCk7Ci0gIHBHUy0+U2V0TGluZVdpZHRoKGZIYWxmKTsKLQotICBGWF9GTE9BVCBhLCBiOwotICBhID0gcnRXaWRnZXQud2lkdGggLyAyLjBmOwotICBiID0gcnRXaWRnZXQuaGVpZ2h0IC8gMi4wZjsKLSAgaWYgKGR3RmxhZ3MgJiBYRkFfRFJBV0JPWF9Gb3JjZVJvdW5kKSB7Ci0gICAgYSA9IHN0ZDo6bWluKGEsIGIpOwotICAgIGIgPSBhOwotICB9Ci0KLSAgQ0ZYX1BvaW50RiBjZW50ZXIgPSBydFdpZGdldC5DZW50ZXIoKTsKLSAgcnRXaWRnZXQubGVmdCA9IGNlbnRlci54IC0gYTsKLSAgcnRXaWRnZXQudG9wID0gY2VudGVyLnkgLSBiOwotICBydFdpZGdldC53aWR0aCA9IGEgKyBhOwotICBydFdpZGdldC5oZWlnaHQgPSBiICsgYjsKLQotICBGWF9GTE9BVCBzdGFydEFuZ2xlID0gMCwgc3dlZXBBbmdsZSA9IDM2MDsKLSAgc3RhcnRBbmdsZSA9IHN0YXJ0QW5nbGUgKiBGWF9QSSAvIDE4MC4wZjsKLSAgc3dlZXBBbmdsZSA9IC1zd2VlcEFuZ2xlICogRlhfUEkgLyAxODAuMGY7Ci0KLSAgQ0ZYX1BhdGggYXJjUGF0aDsKLSAgYXJjUGF0aC5BZGRBcmMocnRXaWRnZXQuVG9wTGVmdCgpLCBydFdpZGdldC5TaXplKCksIDMuMGYgKiBGWF9QSSAvIDQuMGYsCi0gICAgICAgICAgICAgICAgIEZYX1BJKTsKLQotICBDRlhfQ29sb3IgY3IoMHhGRjgwODA4MCk7Ci0gIHBHUy0+U2V0U3Ryb2tlQ29sb3IoJmNyKTsKLSAgcEdTLT5TdHJva2VQYXRoKCZhcmNQYXRoLCBwTWF0cml4KTsKLSAgYXJjUGF0aC5DbGVhcigpOwotICBhcmNQYXRoLkFkZEFyYyhydFdpZGdldC5Ub3BMZWZ0KCksIHJ0V2lkZ2V0LlNpemUoKSwgLTEuMGYgKiBGWF9QSSAvIDQuMGYsCi0gICAgICAgICAgICAgICAgIEZYX1BJKTsKLQotICBjci5TZXQoMHhGRkZGRkZGRik7Ci0gIHBHUy0+U2V0U3Ryb2tlQ29sb3IoJmNyKTsKLSAgcEdTLT5TdHJva2VQYXRoKCZhcmNQYXRoLCBwTWF0cml4KTsKLSAgcnRXaWRnZXQuRGVmbGF0ZShmSGFsZiwgZkhhbGYpOwotICBhcmNQYXRoLkNsZWFyKCk7Ci0gIGFyY1BhdGguQWRkQXJjKHJ0V2lkZ2V0LlRvcExlZnQoKSwgcnRXaWRnZXQuU2l6ZSgpLCAzLjBmICogRlhfUEkgLyA0LjBmLAotICAgICAgICAgICAgICAgICBGWF9QSSk7Ci0KLSAgY3IuU2V0KDB4RkY0MDQwNDApOwotICBwR1MtPlNldFN0cm9rZUNvbG9yKCZjcik7Ci0gIHBHUy0+U3Ryb2tlUGF0aCgmYXJjUGF0aCwgcE1hdHJpeCk7Ci0gIGFyY1BhdGguQ2xlYXIoKTsKLSAgYXJjUGF0aC5BZGRBcmMocnRXaWRnZXQuVG9wTGVmdCgpLCBydFdpZGdldC5TaXplKCksIC0xLjBmICogRlhfUEkgLyA0LjBmLAotICAgICAgICAgICAgICAgICBGWF9QSSk7Ci0KLSAgY3IuU2V0KDB4RkZDMEMwQzApOwotICBwR1MtPlNldFN0cm9rZUNvbG9yKCZjcik7Ci0gIHBHUy0+U3Ryb2tlUGF0aCgmYXJjUGF0aCwgcE1hdHJpeCk7Ci0gIHBHUy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsKLX0KLXN0YXRpYyB2b2lkIFhGQV9EcmF3M0RSZWN0KENGWF9HcmFwaGljcyogcEdyYXBoaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkxpbmVXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2JUb3BMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiQm90dG9tUmlnaHQpIHsKLSAgQ0ZYX0NvbG9yIGNyTFQoYXJnYlRvcExlZnQpOwotICBwR3JhcGhpYy0+U2V0RmlsbENvbG9yKCZjckxUKTsKLSAgRlhfRkxPQVQgZkJvdHRvbSA9IHJ0LmJvdHRvbSgpOwotICBGWF9GTE9BVCBmUmlnaHQgPSBydC5yaWdodCgpOwotICBDRlhfUGF0aCBwYXRoTFQ7Ci0gIHBhdGhMVC5Nb3ZlVG8oQ0ZYX1BvaW50RihydC5sZWZ0LCBmQm90dG9tKSk7Ci0gIHBhdGhMVC5MaW5lVG8oQ0ZYX1BvaW50RihydC5sZWZ0LCBydC50b3ApKTsKLSAgcGF0aExULkxpbmVUbyhDRlhfUG9pbnRGKGZSaWdodCwgcnQudG9wKSk7Ci0gIHBhdGhMVC5MaW5lVG8oQ0ZYX1BvaW50RihmUmlnaHQgLSBmTGluZVdpZHRoLCBydC50b3AgKyBmTGluZVdpZHRoKSk7Ci0gIHBhdGhMVC5MaW5lVG8oQ0ZYX1BvaW50RihydC5sZWZ0ICsgZkxpbmVXaWR0aCwgcnQudG9wICsgZkxpbmVXaWR0aCkpOwotICBwYXRoTFQuTGluZVRvKENGWF9Qb2ludEYocnQubGVmdCArIGZMaW5lV2lkdGgsIGZCb3R0b20gLSBmTGluZVdpZHRoKSk7Ci0gIHBhdGhMVC5MaW5lVG8oQ0ZYX1BvaW50RihydC5sZWZ0LCBmQm90dG9tKSk7Ci0gIHBHcmFwaGljLT5GaWxsUGF0aCgmcGF0aExULCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7Ci0KLSAgQ0ZYX0NvbG9yIGNyUkIoYXJnYkJvdHRvbVJpZ2h0KTsKLSAgcEdyYXBoaWMtPlNldEZpbGxDb2xvcigmY3JSQik7Ci0KLSAgQ0ZYX1BhdGggcGF0aFJCOwotICBwYXRoUkIuTW92ZVRvKENGWF9Qb2ludEYoZlJpZ2h0LCBydC50b3ApKTsKLSAgcGF0aFJCLkxpbmVUbyhDRlhfUG9pbnRGKGZSaWdodCwgZkJvdHRvbSkpOwotICBwYXRoUkIuTGluZVRvKENGWF9Qb2ludEYocnQubGVmdCwgZkJvdHRvbSkpOwotICBwYXRoUkIuTGluZVRvKENGWF9Qb2ludEYocnQubGVmdCArIGZMaW5lV2lkdGgsIGZCb3R0b20gLSBmTGluZVdpZHRoKSk7Ci0gIHBhdGhSQi5MaW5lVG8oQ0ZYX1BvaW50RihmUmlnaHQgLSBmTGluZVdpZHRoLCBmQm90dG9tIC0gZkxpbmVXaWR0aCkpOwotICBwYXRoUkIuTGluZVRvKENGWF9Qb2ludEYoZlJpZ2h0IC0gZkxpbmVXaWR0aCwgcnQudG9wICsgZkxpbmVXaWR0aCkpOwotICBwYXRoUkIuTGluZVRvKENGWF9Qb2ludEYoZlJpZ2h0LCBydC50b3ApKTsKLSAgcEdyYXBoaWMtPkZpbGxQYXRoKCZwYXRoUkIsIEZYRklMTF9XSU5ESU5HLCBwTWF0cml4KTsKLX0KLXN0YXRpYyB2b2lkIFhGQV9CT1hfU3Ryb2tlXzNEUmVjdF9Mb3dlcmVkKENGWF9HcmFwaGljcyogcEdTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRoaWNrbmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKLSAgRlhfRkxPQVQgZkhhbGZXaWR0aCA9IGZUaGlja25lc3MgLyAyLjBmOwotICBDRlhfUmVjdEYgcnRJbm5lcihydCk7Ci0gIHJ0SW5uZXIuRGVmbGF0ZShmSGFsZldpZHRoLCBmSGFsZldpZHRoKTsKLSAgQ0ZYX0NvbG9yIGNyKDB4RkYwMDAwMDApOwotICBwR1MtPlNldEZpbGxDb2xvcigmY3IpOwotICBDRlhfUGF0aCBwYXRoOwotICBwYXRoLkFkZFJlY3RhbmdsZShydC5sZWZ0LCBydC50b3AsIHJ0LndpZHRoLCBydC5oZWlnaHQpOwotICBwYXRoLkFkZFJlY3RhbmdsZShydElubmVyLmxlZnQsIHJ0SW5uZXIudG9wLCBydElubmVyLndpZHRoLCBydElubmVyLmhlaWdodCk7Ci0gIHBHUy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9BTFRFUk5BVEUsIHBNYXRyaXgpOwotICBYRkFfRHJhdzNEUmVjdChwR1MsIHJ0SW5uZXIsIGZIYWxmV2lkdGgsIHBNYXRyaXgsIDB4RkY4MDgwODAsIDB4RkZDMEMwQzApOwotfQotc3RhdGljIHZvaWQgWEZBX0JPWF9TdHJva2VfM0RSZWN0X1JhaXNlZChDRlhfR3JhcGhpY3MqIHBHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmVGhpY2tuZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7Ci0gIEZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmVGhpY2tuZXNzIC8gMi4wZjsKLSAgQ0ZYX1JlY3RGIHJ0SW5uZXIocnQpOwotICBydElubmVyLkRlZmxhdGUoZkhhbGZXaWR0aCwgZkhhbGZXaWR0aCk7Ci0gIENGWF9Db2xvciBjcigweEZGMDAwMDAwKTsKLSAgcEdTLT5TZXRGaWxsQ29sb3IoJmNyKTsKLSAgQ0ZYX1BhdGggcGF0aDsKLSAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCwgcnQudG9wLCBydC53aWR0aCwgcnQuaGVpZ2h0KTsKLSAgcGF0aC5BZGRSZWN0YW5nbGUocnRJbm5lci5sZWZ0LCBydElubmVyLnRvcCwgcnRJbm5lci53aWR0aCwgcnRJbm5lci5oZWlnaHQpOwotICBwR1MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfQUxURVJOQVRFLCBwTWF0cml4KTsKLSAgWEZBX0RyYXczRFJlY3QocEdTLCBydElubmVyLCBmSGFsZldpZHRoLCBwTWF0cml4LCAweEZGRkZGRkZGLCAweEZGODA4MDgwKTsKLX0KLXN0YXRpYyB2b2lkIFhGQV9CT1hfU3Ryb2tlXzNEUmVjdF9FdGNoZWQoQ0ZYX0dyYXBoaWNzKiBwR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRoaWNrbmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBGWF9GTE9BVCBmSGFsZldpZHRoID0gZlRoaWNrbmVzcyAvIDIuMGY7Ci0gIFhGQV9EcmF3M0RSZWN0KHBHUywgcnQsIGZUaGlja25lc3MsIHBNYXRyaXgsIDB4RkY4MDgwODAsIDB4RkZGRkZGRkYpOwotICBDRlhfUmVjdEYgcnRJbm5lcihydCk7Ci0gIHJ0SW5uZXIuRGVmbGF0ZShmSGFsZldpZHRoLCBmSGFsZldpZHRoKTsKLSAgWEZBX0RyYXczRFJlY3QocEdTLCBydElubmVyLCBmSGFsZldpZHRoLCBwTWF0cml4LCAweEZGRkZGRkZGLCAweEZGODA4MDgwKTsKLX0KLXN0YXRpYyB2b2lkIFhGQV9CT1hfU3Ryb2tlXzNEUmVjdF9FbWJvc3NlZChDRlhfR3JhcGhpY3MqIHBHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZlRoaWNrbmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4KSB7Ci0gIEZYX0ZMT0FUIGZIYWxmV2lkdGggPSBmVGhpY2tuZXNzIC8gMi4wZjsKLSAgWEZBX0RyYXczRFJlY3QocEdTLCBydCwgZlRoaWNrbmVzcywgcE1hdHJpeCwgMHhGRjgwODA4MCwgMHhGRjAwMDAwMCk7Ci0gIENGWF9SZWN0RiBydElubmVyKHJ0KTsKLSAgcnRJbm5lci5EZWZsYXRlKGZIYWxmV2lkdGgsIGZIYWxmV2lkdGgpOwotICBYRkFfRHJhdzNEUmVjdChwR1MsIHJ0SW5uZXIsIGZIYWxmV2lkdGgsIHBNYXRyaXgsIDB4RkYwMDAwMDAsIDB4RkY4MDgwODApOwotfQotc3RhdGljIHZvaWQgWEZBX0JPWF9TdHJva2VfUmVjdChDWEZBX0JveCBib3gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENYRkFfU3Ryb2tlPiYgc3Ryb2tlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgewotICBib29sIGJWaXNpYmxlID0gZmFsc2U7Ci0gIEZYX0ZMT0FUIGZUaGlja25lc3MgPSAwOwotICBpbnQzMl90IGkzRFR5cGUgPSBib3guR2V0M0RTdHlsZShiVmlzaWJsZSwgZlRoaWNrbmVzcyk7Ci0gIGlmIChpM0RUeXBlKSB7Ci0gICAgaWYgKCFiVmlzaWJsZSB8fCBmVGhpY2tuZXNzIDwgMC4wMDFmKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHN3aXRjaCAoaTNEVHlwZSkgewotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Mb3dlcmVkOgotICAgICAgICBYRkFfQk9YX1N0cm9rZV8zRFJlY3RfTG93ZXJlZChwR1MsIHJ0V2lkZ2V0LCBmVGhpY2tuZXNzLCBwTWF0cml4KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JhaXNlZDoKLSAgICAgICAgWEZBX0JPWF9TdHJva2VfM0RSZWN0X1JhaXNlZChwR1MsIHJ0V2lkZ2V0LCBmVGhpY2tuZXNzLCBwTWF0cml4KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0V0Y2hlZDoKLSAgICAgICAgWEZBX0JPWF9TdHJva2VfM0RSZWN0X0V0Y2hlZChwR1MsIHJ0V2lkZ2V0LCBmVGhpY2tuZXNzLCBwTWF0cml4KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0VtYm9zc2VkOgotICAgICAgICBYRkFfQk9YX1N0cm9rZV8zRFJlY3RfRW1ib3NzZWQocEdTLCBydFdpZGdldCwgZlRoaWNrbmVzcywgcE1hdHJpeCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLSAgYm9vbCBiQ2xvc2UgPSBmYWxzZTsKLSAgYm9vbCBiU2FtZVN0eWxlcyA9IHRydWU7Ci0gIENYRkFfU3Ryb2tlIHN0cm9rZTEgPSBzdHJva2VzWzBdOwotICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCA4OyBpKyspIHsKLSAgICBDWEZBX1N0cm9rZSBzdHJva2UyID0gc3Ryb2tlc1tpXTsKLSAgICBpZiAoIXN0cm9rZTEuU2FtZVN0eWxlcyhzdHJva2UyKSkgewotICAgICAgYlNhbWVTdHlsZXMgPSBmYWxzZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBzdHJva2UxID0gc3Ryb2tlMjsKLSAgfQotICBpZiAoYlNhbWVTdHlsZXMpIHsKLSAgICBzdHJva2UxID0gc3Ryb2tlc1swXTsKLSAgICBiQ2xvc2UgPSB0cnVlOwotICAgIGZvciAoaW50MzJfdCBpID0gMjsgaSA8IDg7IGkgKz0gMikgewotICAgICAgQ1hGQV9TdHJva2Ugc3Ryb2tlMiA9IHN0cm9rZXNbaV07Ci0gICAgICBpZiAoIXN0cm9rZTEuU2FtZVN0eWxlcyhzdHJva2UyLCBYRkFfU1RST0tFX1NBTUVTVFlMRV9Ob1ByZXNlbmNlIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfU1RST0tFX1NBTUVTVFlMRV9Db3JuZXIpKSB7Ci0gICAgICAgIGJTYW1lU3R5bGVzID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgc3Ryb2tlMSA9IHN0cm9rZTI7Ci0gICAgfQotICAgIGlmIChiU2FtZVN0eWxlcykgewotICAgICAgc3Ryb2tlMSA9IHN0cm9rZXNbMF07Ci0gICAgICBpZiAoc3Ryb2tlMS5Jc0ludmVydGVkKCkpCi0gICAgICAgIGJTYW1lU3R5bGVzID0gZmFsc2U7Ci0gICAgICBpZiAoc3Ryb2tlMS5HZXRKb2luVHlwZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX1NxdWFyZSkKLSAgICAgICAgYlNhbWVTdHlsZXMgPSBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgYm9vbCBiU3RhcnQgPSB0cnVlOwotICBDRlhfUGF0aCBwYXRoOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA4OyBpKyspIHsKLSAgICBDWEZBX1N0cm9rZSBzdHJva2UgPSBzdHJva2VzW2ldOwotICAgIGlmICgoaSAlIDEpID09IDAgJiYgc3Ryb2tlLkdldFJhZGl1cygpIDwgMCkgewotICAgICAgYm9vbCBiRW1wdHkgPSBwYXRoLklzRW1wdHkoKTsKLSAgICAgIGlmICghYkVtcHR5KSB7Ci0gICAgICAgIFhGQV9CT1hfU3Ryb2tlUGF0aChzdHJva2UsICZwYXRoLCBwR1MsIHBNYXRyaXgpOwotICAgICAgICBwYXRoLkNsZWFyKCk7Ci0gICAgICB9Ci0gICAgICBiU3RhcnQgPSB0cnVlOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIFhGQV9CT1hfR2V0UGF0aChib3gsIHN0cm9rZXMsIHJ0V2lkZ2V0LCBwYXRoLCBpLCBiU3RhcnQsICFiU2FtZVN0eWxlcyk7Ci0gICAgQ1hGQV9TdHJva2Ugc3Ryb2tlMiA9IHN0cm9rZXNbKGkgKyAxKSAlIDhdOwotICAgIGJTdGFydCA9ICFzdHJva2UuU2FtZVN0eWxlcyhzdHJva2UyKTsKLSAgICBpZiAoYlN0YXJ0KSB7Ci0gICAgICBYRkFfQk9YX1N0cm9rZVBhdGgoc3Ryb2tlLCAmcGF0aCwgcEdTLCBwTWF0cml4KTsKLSAgICAgIHBhdGguQ2xlYXIoKTsKLSAgICB9Ci0gIH0KLSAgYm9vbCBiRW1wdHkgPSBwYXRoLklzRW1wdHkoKTsKLSAgaWYgKCFiRW1wdHkpIHsKLSAgICBpZiAoYkNsb3NlKSB7Ci0gICAgICBwYXRoLkNsb3NlKCk7Ci0gICAgfQotICAgIFhGQV9CT1hfU3Ryb2tlUGF0aChzdHJva2VzWzddLCAmcGF0aCwgcEdTLCBwTWF0cml4KTsKLSAgfQotfQotc3RhdGljIHZvaWQgWEZBX0JPWF9TdHJva2UoQ1hGQV9Cb3ggYm94LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q1hGQV9TdHJva2U+JiBzdHJva2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnRXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFncykgewotICBpZiAoYm94LklzQXJjKCkgfHwgKGR3RmxhZ3MgJiBYRkFfRFJBV0JPWF9Gb3JjZVJvdW5kKSAhPSAwKSB7Ci0gICAgWEZBX0JPWF9TdHJva2VBcmMoYm94LCBwR1MsIHJ0V2lkZ2V0LCBwTWF0cml4LCBkd0ZsYWdzKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgYm9vbCBiVmlzaWJsZSA9IGZhbHNlOwotICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCA0OyBqKyspIHsKLSAgICBpZiAoc3Ryb2tlc1tqICogMiArIDFdLklzVmlzaWJsZSgpKSB7Ci0gICAgICBiVmlzaWJsZSA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgaWYgKCFiVmlzaWJsZSkgewotICAgIHJldHVybjsKLSAgfQotICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCA4OyBpICs9IDIpIHsKLSAgICBDWEZBX0VkZ2UgZWRnZShzdHJva2VzW2ldLkdldE5vZGUoKSk7Ci0gICAgRlhfRkxPQVQgZlRoaWNrbmVzcyA9IGVkZ2UuR2V0VGhpY2tuZXNzKCk7Ci0gICAgaWYgKGZUaGlja25lc3MgPCAwKSB7Ci0gICAgICBmVGhpY2tuZXNzID0gMDsKLSAgICB9Ci0gICAgRlhfRkxPQVQgZkhhbGYgPSBmVGhpY2tuZXNzIC8gMjsKLSAgICBpbnQzMl90IGlIYW5kID0gYm94LkdldEhhbmQoKTsKLSAgICBzd2l0Y2ggKGkpIHsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQpIHsKLSAgICAgICAgICBydFdpZGdldC50b3AgLT0gZkhhbGY7Ci0gICAgICAgICAgcnRXaWRnZXQuaGVpZ2h0ICs9IGZIYWxmOwotICAgICAgICB9IGVsc2UgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0KSB7Ci0gICAgICAgICAgcnRXaWRnZXQudG9wICs9IGZIYWxmOwotICAgICAgICAgIHJ0V2lkZ2V0LmhlaWdodCAtPSBmSGFsZjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMzoKLSAgICAgICAgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQpIHsKLSAgICAgICAgICBydFdpZGdldC53aWR0aCArPSBmSGFsZjsKLSAgICAgICAgfSBlbHNlIGlmIChpSGFuZCA9PSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCkgewotICAgICAgICAgIHJ0V2lkZ2V0LndpZHRoIC09IGZIYWxmOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA1OgotICAgICAgICBpZiAoaUhhbmQgPT0gWEZBX0FUVFJJQlVURUVOVU1fTGVmdCkgewotICAgICAgICAgIHJ0V2lkZ2V0LmhlaWdodCArPSBmSGFsZjsKLSAgICAgICAgfSBlbHNlIGlmIChpSGFuZCA9PSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCkgewotICAgICAgICAgIHJ0V2lkZ2V0LmhlaWdodCAtPSBmSGFsZjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNzoKLSAgICAgICAgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQpIHsKLSAgICAgICAgICBydFdpZGdldC5sZWZ0IC09IGZIYWxmOwotICAgICAgICAgIHJ0V2lkZ2V0LndpZHRoICs9IGZIYWxmOwotICAgICAgICB9IGVsc2UgaWYgKGlIYW5kID09IFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0KSB7Ci0gICAgICAgICAgcnRXaWRnZXQubGVmdCArPSBmSGFsZjsKLSAgICAgICAgICBydFdpZGdldC53aWR0aCAtPSBmSGFsZjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgWEZBX0JPWF9TdHJva2VfUmVjdChib3gsIHN0cm9rZXMsIHBHUywgcnRXaWRnZXQsIHBNYXRyaXgpOwotfQotdm9pZCBYRkFfRHJhd0JveChDWEZBX0JveCBib3gsCi0gICAgICAgICAgICAgICAgIENGWF9HcmFwaGljcyogcEdTLAotICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0V2lkZ2V0LAotICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzKSB7Ci0gIGlmICghYm94IHx8IGJveC5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUpCi0gICAgcmV0dXJuOwotCi0gIFhGQV9FbGVtZW50IGVUeXBlID0gYm94LkdldEVsZW1lbnRUeXBlKCk7Ci0gIGlmIChlVHlwZSAhPSBYRkFfRWxlbWVudDo6QXJjICYmIGVUeXBlICE9IFhGQV9FbGVtZW50OjpCb3JkZXIgJiYKLSAgICAgIGVUeXBlICE9IFhGQV9FbGVtZW50OjpSZWN0YW5nbGUpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgc3RkOjp2ZWN0b3I8Q1hGQV9TdHJva2U+IHN0cm9rZXM7Ci0gIGlmICghKGR3RmxhZ3MgJiBYRkFfRFJBV0JPWF9Gb3JjZVJvdW5kKSAmJiBlVHlwZSAhPSBYRkFfRWxlbWVudDo6QXJjKQotICAgIGJveC5HZXRTdHJva2VzKCZzdHJva2VzKTsKLQotICBYRkFfQk9YX0ZpbGwoYm94LCBzdHJva2VzLCBwR1MsIHJ0V2lkZ2V0LCBwTWF0cml4LCBkd0ZsYWdzKTsKLSAgWEZBX0JPWF9TdHJva2UoYm94LCBzdHJva2VzLCBwR1MsIHJ0V2lkZ2V0LCBwTWF0cml4LCBkd0ZsYWdzKTsKLX0KLQotQ1hGQV9DYWxjRGF0YTo6Q1hGQV9DYWxjRGF0YSgpIDogbV9pUmVmQ291bnQoMCkge30KLQotQ1hGQV9DYWxjRGF0YTo6fkNYRkFfQ2FsY0RhdGEoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL3hmYV9mZndpZGdldGFjYy5jcHAgYi94ZmEvZnhmYS9hcHAveGZhX2Zmd2lkZ2V0YWNjLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRjNWMzMS4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAveGZhX2Zmd2lkZ2V0YWNjLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE2NzQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZndpZGdldGFjYy5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJmeGpzL2NmeGpzZV92YWx1ZS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS90dG8vZmRlX3RleHRvdXQuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL3htbC9mZGVfeG1sX2ltcC5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZjaGVja2J1dHRvbi5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZjaG9pY2VsaXN0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZmZpZWxkLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9md2xhZGFwdGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9ldmVudHBhcmFtLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0cHJvY2Vzc29yLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2NyaXB0Y29udGV4dC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxldmFsdWUuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX3Jlc29sdmVub2RlX3JzLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmYXBwLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jdmlldy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZnBhZ2V2aWV3LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZvbnRtZ3IuaCIKLQotc3RhdGljIHZvaWQgWEZBX0ZGRGVsZXRlQ2FsY0RhdGEodm9pZCogcERhdGEpIHsKLSAgaWYgKHBEYXRhKSB7Ci0gICAgZGVsZXRlICgoQ1hGQV9DYWxjRGF0YSopcERhdGEpOwotICB9Ci19Ci0KLXN0YXRpYyBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPIGdzX1hGQURlbGV0ZUNhbGNEYXRhID0gewotICAgIFhGQV9GRkRlbGV0ZUNhbGNEYXRhLCBudWxscHRyfTsKLQotY2xhc3MgQ1hGQV9XaWRnZXRMYXlvdXREYXRhIHsKLSBwdWJsaWM6Ci0gIENYRkFfV2lkZ2V0TGF5b3V0RGF0YSgpIDogbV9mV2lkZ2V0SGVpZ2h0KC0xKSB7fQotICB2aXJ0dWFsIH5DWEZBX1dpZGdldExheW91dERhdGEoKSB7fQotCi0gIEZYX0ZMT0FUIG1fZldpZGdldEhlaWdodDsKLX07Ci0KLWNsYXNzIENYRkFfVGV4dExheW91dERhdGEgOiBwdWJsaWMgQ1hGQV9XaWRnZXRMYXlvdXREYXRhIHsKLSBwdWJsaWM6Ci0gIENYRkFfVGV4dExheW91dERhdGEoKSB7fQotICB+Q1hGQV9UZXh0TGF5b3V0RGF0YSgpIG92ZXJyaWRlIHt9Ci0KLSAgQ1hGQV9UZXh0TGF5b3V0KiBHZXRUZXh0TGF5b3V0KCkgY29uc3QgeyByZXR1cm4gbV9wVGV4dExheW91dC5nZXQoKTsgfQotICBDWEZBX1RleHRQcm92aWRlciogR2V0VGV4dFByb3ZpZGVyKCkgY29uc3QgeyByZXR1cm4gbV9wVGV4dFByb3ZpZGVyLmdldCgpOyB9Ci0KLSAgdm9pZCBMb2FkVGV4dChDWEZBX1dpZGdldEFjYyogcEFjYykgewotICAgIGlmIChtX3BUZXh0TGF5b3V0KQotICAgICAgcmV0dXJuOwotCi0gICAgbV9wVGV4dFByb3ZpZGVyID0KLSAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfVGV4dFByb3ZpZGVyPihwQWNjLCBYRkFfVEVYVFBST1ZJREVSVFlQRV9UZXh0KTsKLSAgICBtX3BUZXh0TGF5b3V0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfVGV4dExheW91dD4obV9wVGV4dFByb3ZpZGVyLmdldCgpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfVGV4dExheW91dD4gbV9wVGV4dExheW91dDsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfVGV4dFByb3ZpZGVyPiBtX3BUZXh0UHJvdmlkZXI7Ci19OwotCi1jbGFzcyBDWEZBX0ltYWdlTGF5b3V0RGF0YSA6IHB1YmxpYyBDWEZBX1dpZGdldExheW91dERhdGEgewotIHB1YmxpYzoKLSAgQ1hGQV9JbWFnZUxheW91dERhdGEoKQotICAgICAgOiBtX3BESUJpdG1hcChudWxscHRyKSwKLSAgICAgICAgbV9iTmFtZWRJbWFnZShmYWxzZSksCi0gICAgICAgIG1faUltYWdlWERwaSgwKSwKLSAgICAgICAgbV9pSW1hZ2VZRHBpKDApIHt9Ci0KLSAgfkNYRkFfSW1hZ2VMYXlvdXREYXRhKCkgb3ZlcnJpZGUgewotICAgIGlmIChtX3BESUJpdG1hcCAmJiAhbV9iTmFtZWRJbWFnZSkKLSAgICAgIGRlbGV0ZSBtX3BESUJpdG1hcDsKLSAgfQotCi0gIGJvb2wgTG9hZEltYWdlRGF0YShDWEZBX1dpZGdldEFjYyogcEFjYykgewotICAgIGlmIChtX3BESUJpdG1hcCkKLSAgICAgIHJldHVybiB0cnVlOwotCi0gICAgQ1hGQV9WYWx1ZSB2YWx1ZSA9IHBBY2MtPkdldEZvcm1WYWx1ZSgpOwotICAgIGlmICghdmFsdWUpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBDWEZBX0ltYWdlIGltYWdlT2JqID0gdmFsdWUuR2V0SW1hZ2UoKTsKLSAgICBpZiAoIWltYWdlT2JqKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ1hGQV9GRkRvYyogcEZGRG9jID0gcEFjYy0+R2V0RG9jKCk7Ci0gICAgcEFjYy0+U2V0SW1hZ2VJbWFnZShYRkFfTG9hZEltYWdlRGF0YShwRkZEb2MsICZpbWFnZU9iaiwgbV9iTmFtZWRJbWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faUltYWdlWERwaSwgbV9pSW1hZ2VZRHBpKSk7Ci0gICAgcmV0dXJuICEhbV9wRElCaXRtYXA7Ci0gIH0KLQotICBDRlhfRElCaXRtYXAqIG1fcERJQml0bWFwOwotICBib29sIG1fYk5hbWVkSW1hZ2U7Ci0gIGludDMyX3QgbV9pSW1hZ2VYRHBpOwotICBpbnQzMl90IG1faUltYWdlWURwaTsKLX07Ci0KLWNsYXNzIENYRkFfRmllbGRMYXlvdXREYXRhIDogcHVibGljIENYRkFfV2lkZ2V0TGF5b3V0RGF0YSB7Ci0gcHVibGljOgotICBDWEZBX0ZpZWxkTGF5b3V0RGF0YSgpIHt9Ci0gIH5DWEZBX0ZpZWxkTGF5b3V0RGF0YSgpIG92ZXJyaWRlIHt9Ci0KLSAgYm9vbCBMb2FkQ2FwdGlvbihDWEZBX1dpZGdldEFjYyogcEFjYykgewotICAgIGlmIChtX3BDYXBUZXh0TGF5b3V0KQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgQ1hGQV9DYXB0aW9uIGNhcHRpb24gPSBwQWNjLT5HZXRDYXB0aW9uKCk7Ci0gICAgaWYgKCFjYXB0aW9uIHx8IGNhcHRpb24uR2V0UHJlc2VuY2UoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9IaWRkZW4pCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgbV9wQ2FwVGV4dFByb3ZpZGVyLnJlc2V0KAotICAgICAgICBuZXcgQ1hGQV9UZXh0UHJvdmlkZXIocEFjYywgWEZBX1RFWFRQUk9WSURFUlRZUEVfQ2FwdGlvbikpOwotICAgIG1fcENhcFRleHRMYXlvdXQgPQotICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9UZXh0TGF5b3V0PihtX3BDYXBUZXh0UHJvdmlkZXIuZ2V0KCkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfVGV4dExheW91dD4gbV9wQ2FwVGV4dExheW91dDsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfVGV4dFByb3ZpZGVyPiBtX3BDYXBUZXh0UHJvdmlkZXI7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRkRFX1RleHRPdXQ+IG1fcFRleHRPdXQ7Ci0gIHN0ZDo6dmVjdG9yPEZYX0ZMT0FUPiBtX0ZpZWxkU3BsaXRBcnJheTsKLX07Ci0KLWNsYXNzIENYRkFfVGV4dEVkaXREYXRhIDogcHVibGljIENYRkFfRmllbGRMYXlvdXREYXRhIHsKLSBwdWJsaWM6Ci19OwotCi1jbGFzcyBDWEZBX0ltYWdlRWRpdERhdGEgOiBwdWJsaWMgQ1hGQV9GaWVsZExheW91dERhdGEgewotIHB1YmxpYzoKLSAgQ1hGQV9JbWFnZUVkaXREYXRhKCkKLSAgICAgIDogbV9wRElCaXRtYXAobnVsbHB0ciksCi0gICAgICAgIG1fYk5hbWVkSW1hZ2UoZmFsc2UpLAotICAgICAgICBtX2lJbWFnZVhEcGkoMCksCi0gICAgICAgIG1faUltYWdlWURwaSgwKSB7fQotCi0gIH5DWEZBX0ltYWdlRWRpdERhdGEoKSBvdmVycmlkZSB7Ci0gICAgaWYgKG1fcERJQml0bWFwICYmICFtX2JOYW1lZEltYWdlKQotICAgICAgZGVsZXRlIG1fcERJQml0bWFwOwotICB9Ci0KLSAgYm9vbCBMb2FkSW1hZ2VEYXRhKENYRkFfV2lkZ2V0QWNjKiBwQWNjKSB7Ci0gICAgaWYgKG1fcERJQml0bWFwKQotICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICBDWEZBX1ZhbHVlIHZhbHVlID0gcEFjYy0+R2V0Rm9ybVZhbHVlKCk7Ci0gICAgaWYgKCF2YWx1ZSkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIENYRkFfSW1hZ2UgaW1hZ2VPYmogPSB2YWx1ZS5HZXRJbWFnZSgpOwotICAgIENYRkFfRkZEb2MqIHBGRkRvYyA9IHBBY2MtPkdldERvYygpOwotICAgIHBBY2MtPlNldEltYWdlRWRpdEltYWdlKFhGQV9Mb2FkSW1hZ2VEYXRhKHBGRkRvYywgJmltYWdlT2JqLCBtX2JOYW1lZEltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faUltYWdlWERwaSwgbV9pSW1hZ2VZRHBpKSk7Ci0gICAgcmV0dXJuICEhbV9wRElCaXRtYXA7Ci0gIH0KLQotICBDRlhfRElCaXRtYXAqIG1fcERJQml0bWFwOwotICBib29sIG1fYk5hbWVkSW1hZ2U7Ci0gIGludDMyX3QgbV9pSW1hZ2VYRHBpOwotICBpbnQzMl90IG1faUltYWdlWURwaTsKLX07Ci0KLUNYRkFfV2lkZ2V0QWNjOjpDWEZBX1dpZGdldEFjYyhDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsIENYRkFfTm9kZSogcE5vZGUpCi0gICAgOiBDWEZBX1dpZGdldERhdGEocE5vZGUpLAotICAgICAgbV9wRG9jVmlldyhwRG9jVmlldyksCi0gICAgICBtX25SZWN1cnNpb25EZXB0aCgwKSB7fQotCi1DWEZBX1dpZGdldEFjYzo6fkNYRkFfV2lkZ2V0QWNjKCkge30KLQotYm9vbCBDWEZBX1dpZGdldEFjYzo6R2V0TmFtZShDRlhfV2lkZVN0cmluZyYgd3NOYW1lLCBpbnQzMl90IGlOYW1lVHlwZSkgewotICBpZiAoaU5hbWVUeXBlID09IDApIHsKLSAgICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7Ci0gICAgcmV0dXJuICF3c05hbWUuSXNFbXB0eSgpOwotICB9Ci0gIG1fcE5vZGUtPkdldFNPTUV4cHJlc3Npb24od3NOYW1lKTsKLSAgaWYgKGlOYW1lVHlwZSA9PSAyICYmIHdzTmFtZS5HZXRMZW5ndGgoKSA+PSAxNSkgewotICAgIENGWF9XaWRlU3RyaW5nQyB3c1ByZSA9IEwieGZhWzBdLmZvcm1bMF0uIjsKLSAgICBpZiAod3NQcmUgPT0gQ0ZYX1dpZGVTdHJpbmdDKHdzTmFtZS5jX3N0cigpLCB3c1ByZS5HZXRMZW5ndGgoKSkpIHsKLSAgICAgIHdzTmFtZS5EZWxldGUoMCwgd3NQcmUuR2V0TGVuZ3RoKCkpOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLUNYRkFfTm9kZSogQ1hGQV9XaWRnZXRBY2M6OkdldERhdGFzZXRzKCkgewotICByZXR1cm4gbV9wTm9kZS0+R2V0QmluZERhdGEoKTsKLX0KLWJvb2wgQ1hGQV9XaWRnZXRBY2M6OlByb2Nlc3NWYWx1ZUNoYW5nZWQoKSB7Ci0gIG1fcERvY1ZpZXctPkFkZFZhbGlkYXRlV2lkZ2V0KHRoaXMpOwotICBtX3BEb2NWaWV3LT5BZGRDYWxjdWxhdGVXaWRnZXRBY2ModGhpcyk7Ci0gIG1fcERvY1ZpZXctPlJ1bkNhbGN1bGF0ZVdpZGdldHMoKTsKLSAgbV9wRG9jVmlldy0+UnVuVmFsaWRhdGUoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci12b2lkIENYRkFfV2lkZ2V0QWNjOjpSZXNldERhdGEoKSB7Ci0gIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7Ci0gIFhGQV9FbGVtZW50IGVVSVR5cGUgPSBHZXRVSVR5cGUoKTsKLSAgc3dpdGNoIChlVUlUeXBlKSB7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6SW1hZ2VFZGl0OiB7Ci0gICAgICBDWEZBX1ZhbHVlIGltYWdlVmFsdWUgPSBHZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgIENYRkFfSW1hZ2UgaW1hZ2UgPSBpbWFnZVZhbHVlLkdldEltYWdlKCk7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlLCB3c0hyZWY7Ci0gICAgICBpZiAoaW1hZ2UpIHsKLSAgICAgICAgaW1hZ2UuR2V0Q29udGVudCh3c1ZhbHVlKTsKLSAgICAgICAgaW1hZ2UuR2V0Q29udGVudFR5cGUod3NDb250ZW50VHlwZSk7Ci0gICAgICAgIGltYWdlLkdldEhyZWYod3NIcmVmKTsKLSAgICAgIH0KLSAgICAgIFNldEltYWdlRWRpdCh3c0NvbnRlbnRUeXBlLCB3c0hyZWYsIHdzVmFsdWUpOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6RXhjbEdyb3VwOiB7Ci0gICAgICBDWEZBX05vZGUqIHBOZXh0Q2hpbGQgPSBtX3BOb2RlLT5HZXROb2RlSXRlbSgKLSAgICAgICAgICBYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCwgWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGUpOwotICAgICAgd2hpbGUgKHBOZXh0Q2hpbGQpIHsKLSAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBwTmV4dENoaWxkOwotICAgICAgICBDWEZBX1dpZGdldEFjYyogcEFjYyA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxDWEZBX1dpZGdldEFjYyo+KHBDaGlsZC0+R2V0V2lkZ2V0RGF0YSgpKTsKLSAgICAgICAgaWYgKCFwQWNjKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgQ1hGQV9WYWx1ZSBkZWZWYWx1ZShudWxscHRyKTsKLSAgICAgICAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpICYmIChkZWZWYWx1ZSA9IHBBY2MtPkdldERlZmF1bHRWYWx1ZSgpKSkgewotICAgICAgICAgIGRlZlZhbHVlLkdldENoaWxkVmFsdWVDb250ZW50KHdzVmFsdWUpOwotICAgICAgICAgIFNldFZhbHVlKHdzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsKLSAgICAgICAgICBwQWNjLT5TZXRWYWx1ZSh3c1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgQ1hGQV9Ob2RlKiBwSXRlbXMgPSBwQ2hpbGQtPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpJdGVtcyk7Ci0gICAgICAgICAgaWYgKCFwSXRlbXMpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBDRlhfV2lkZVN0cmluZyBpdGVtVGV4dDsKLSAgICAgICAgICBpZiAocEl0ZW1zLT5Db3VudENoaWxkcmVuKFhGQV9FbGVtZW50OjpVbmtub3duKSA+IDEpIHsKLSAgICAgICAgICAgIGl0ZW1UZXh0ID0gcEl0ZW1zLT5HZXRDaGlsZCgxLCBYRkFfRWxlbWVudDo6VW5rbm93biktPkdldENvbnRlbnQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcEFjYy0+U2V0VmFsdWUoaXRlbVRleHQsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsKLSAgICAgICAgfQotICAgICAgICBwTmV4dENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250YWluZXJOb2RlKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNob2ljZUxpc3Q6Ci0gICAgICBDbGVhckFsbFNlbGVjdGlvbnMoKTsKLSAgICBkZWZhdWx0OgotICAgICAgaWYgKENYRkFfVmFsdWUgZGVmVmFsdWUgPSBHZXREZWZhdWx0VmFsdWUoKSkgewotICAgICAgICBkZWZWYWx1ZS5HZXRDaGlsZFZhbHVlQ29udGVudCh3c1ZhbHVlKTsKLSAgICAgIH0KLSAgICAgIFNldFZhbHVlKHdzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci12b2lkIENYRkFfV2lkZ2V0QWNjOjpTZXRJbWFnZUVkaXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzSHJlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRhKSB7Ci0gIENYRkFfSW1hZ2UgaW1hZ2UgPSBHZXRGb3JtVmFsdWUoKS5HZXRJbWFnZSgpOwotICBpZiAoaW1hZ2UpIHsKLSAgICBpbWFnZS5TZXRDb250ZW50VHlwZShDRlhfV2lkZVN0cmluZyh3c0NvbnRlbnRUeXBlKSk7Ci0gICAgaW1hZ2UuU2V0SHJlZih3c0hyZWYpOwotICB9Ci0gIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0VmFsdWUod3NEYXRhKTsKLSAgR2V0Rm9ybWF0RGF0YVZhbHVlKHdzRGF0YSwgd3NGb3JtYXRWYWx1ZSk7Ci0gIG1fcE5vZGUtPlNldENvbnRlbnQod3NEYXRhLCB3c0Zvcm1hdFZhbHVlLCB0cnVlKTsKLSAgQ1hGQV9Ob2RlKiBwQmluZCA9IEdldERhdGFzZXRzKCk7Ci0gIGlmICghcEJpbmQpIHsKLSAgICBpbWFnZS5TZXRUcmFuc2ZlckVuY29kaW5nKFhGQV9BVFRSSUJVVEVFTlVNX0Jhc2U2NCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBCaW5kLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlKTsKLSAgQ1hGQV9Ob2RlKiBwSHJlZk5vZGUgPSBwQmluZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICBpZiAocEhyZWZOb2RlKSB7Ci0gICAgcEhyZWZOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0hyZWYpOwotICB9IGVsc2UgewotICAgIENGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBwQmluZC0+R2V0WE1MTWFwcGluZ05vZGUoKTsKLSAgICBBU1NFUlQocFhNTE5vZGUgJiYgcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KTsKLSAgICBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwWE1MTm9kZSktPlNldFN0cmluZyhMImhyZWYiLCB3c0hyZWYpOwotICB9Ci19Ci0KLUNYRkFfV2lkZ2V0QWNjKiBDWEZBX1dpZGdldEFjYzo6R2V0RXhjbEdyb3VwKCkgewotICBDWEZBX05vZGUqIHBFeGNsID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7Ci0gIGlmICghcEV4Y2wgfHwgcEV4Y2wtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OkV4Y2xHcm91cCkgewotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX1dpZGdldEFjYyo+KHBFeGNsLT5HZXRXaWRnZXREYXRhKCkpOwotfQotQ1hGQV9GRkRvY1ZpZXcqIENYRkFfV2lkZ2V0QWNjOjpHZXREb2NWaWV3KCkgewotICByZXR1cm4gbV9wRG9jVmlldzsKLX0KLUNYRkFfRkZEb2MqIENYRkFfV2lkZ2V0QWNjOjpHZXREb2MoKSB7Ci0gIHJldHVybiBtX3BEb2NWaWV3LT5HZXREb2MoKTsKLX0KLUNYRkFfRkZBcHAqIENYRkFfV2lkZ2V0QWNjOjpHZXRBcHAoKSB7Ci0gIHJldHVybiBHZXREb2MoKS0+R2V0QXBwKCk7Ci19Ci1JWEZBX0FwcFByb3ZpZGVyKiBDWEZBX1dpZGdldEFjYzo6R2V0QXBwUHJvdmlkZXIoKSB7Ci0gIHJldHVybiBHZXRBcHAoKS0+R2V0QXBwUHJvdmlkZXIoKTsKLX0KLWludDMyX3QgQ1hGQV9XaWRnZXRBY2M6OlByb2Nlc3NFdmVudChpbnQzMl90IGlBY3Rpdml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtKSB7Ci0gIGlmIChHZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpEcmF3KSB7Ci0gICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0OwotICB9Ci0gIGludDMyX3QgaVJldCA9IFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0OwotICBDWEZBX05vZGVBcnJheSBldmVudEFycmF5OwotICBpbnQzMl90IGlDb3VudHMgPQotICAgICAgR2V0RXZlbnRCeUFjdGl2aXR5KGlBY3Rpdml0eSwgZXZlbnRBcnJheSwgcEV2ZW50UGFyYW0tPm1fYklzRm9ybVJlYWR5KTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50czsgaSsrKSB7Ci0gICAgQ1hGQV9FdmVudCBldmVudChldmVudEFycmF5W2ldKTsKLSAgICBpbnQzMl90IHJlc3VsdCA9IFByb2Nlc3NFdmVudChldmVudCwgcEV2ZW50UGFyYW0pOwotICAgIGlmIChpID09IDApIHsKLSAgICAgIGlSZXQgPSByZXN1bHQ7Ci0gICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gWEZBX0VWRU5URVJST1JfU3VjY2VzcykgewotICAgICAgaVJldCA9IHJlc3VsdDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGlSZXQ7Ci19Ci1pbnQzMl90IENYRkFfV2lkZ2V0QWNjOjpQcm9jZXNzRXZlbnQoQ1hGQV9FdmVudCYgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSkgewotICBpZiAoIWV2ZW50KQotICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKLQotICBzd2l0Y2ggKGV2ZW50LkdldEV2ZW50VHlwZSgpKSB7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6RXhlY3V0ZToKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlNjcmlwdDogewotICAgICAgQ1hGQV9TY3JpcHQgc2NyaXB0ID0gZXZlbnQuR2V0U2NyaXB0KCk7Ci0gICAgICByZXR1cm4gRXhlY3V0ZVNjcmlwdChzY3JpcHQsIHBFdmVudFBhcmFtKTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlNpZ25EYXRhOgotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6U3VibWl0OiB7Ci0gICAgICBDWEZBX1N1Ym1pdCBzdWJtaXQgPSBldmVudC5HZXRTdWJtaXQoKTsKLSAgICAgIHJldHVybiBHZXREb2MoKS0+R2V0RG9jRW52aXJvbm1lbnQoKS0+U3VibWl0RGF0YShHZXREb2MoKSwgc3VibWl0KTsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKLX0KLQotaW50MzJfdCBDWEZBX1dpZGdldEFjYzo6UHJvY2Vzc0NhbGN1bGF0ZSgpIHsKLSAgaWYgKEdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkRyYXcpCi0gICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0OwotCi0gIENYRkFfQ2FsY3VsYXRlIGNhbGMgPSBHZXRDYWxjdWxhdGUoKTsKLSAgaWYgKCFjYWxjKQotICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKLSAgaWYgKEdldE5vZGUoKS0+SXNVc2VySW50ZXJhY3RpdmUoKSkKLSAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRGlzYWJsZWQ7Ci0KLSAgQ1hGQV9FdmVudFBhcmFtIEV2ZW50UGFyYW07Ci0gIEV2ZW50UGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9DYWxjdWxhdGU7Ci0gIENYRkFfU2NyaXB0IHNjcmlwdCA9IGNhbGMuR2V0U2NyaXB0KCk7Ci0gIGludDMyX3QgaVJldCA9IEV4ZWN1dGVTY3JpcHQoc2NyaXB0LCAmRXZlbnRQYXJhbSk7Ci0gIGlmIChpUmV0ICE9IFhGQV9FVkVOVEVSUk9SX1N1Y2Nlc3MpCi0gICAgcmV0dXJuIGlSZXQ7Ci0KLSAgaWYgKEdldFJhd1ZhbHVlKCkgIT0gRXZlbnRQYXJhbS5tX3dzUmVzdWx0KSB7Ci0gICAgU2V0VmFsdWUoRXZlbnRQYXJhbS5tX3dzUmVzdWx0LCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7Ci0gICAgVXBkYXRlVUlEaXNwbGF5KCk7Ci0gIH0KLSAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2Nlc3M7Ci19Ci0KLXZvaWQgQ1hGQV9XaWRnZXRBY2M6OlByb2Nlc3NTY3JpcHRUZXN0VmFsaWRhdGUoQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUmV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHBSZXRWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVmVyc2lvbkZsYWcpIHsKLSAgaWYgKGlSZXQgPT0gWEZBX0VWRU5URVJST1JfU3VjY2VzcyAmJiBwUmV0VmFsdWUpIHsKLSAgICBpZiAocFJldFZhbHVlLT5Jc0Jvb2xlYW4oKSAmJiAhcFJldFZhbHVlLT5Ub0Jvb2xlYW4oKSkgewotICAgICAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0gR2V0QXBwUHJvdmlkZXIoKTsKLSAgICAgIGlmICghcEFwcFByb3ZpZGVyKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGl0bGUgPSBwQXBwUHJvdmlkZXItPkdldEFwcFRpdGxlKCk7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c1NjcmlwdE1zZzsKLSAgICAgIHZhbGlkYXRlLkdldFNjcmlwdE1lc3NhZ2VUZXh0KHdzU2NyaXB0TXNnKTsKLSAgICAgIGludDMyX3QgZVNjcmlwdFRlc3QgPSB2YWxpZGF0ZS5HZXRTY3JpcHRUZXN0KCk7Ci0gICAgICBpZiAoZVNjcmlwdFRlc3QgPT0gWEZBX0FUVFJJQlVURUVOVU1fV2FybmluZykgewotICAgICAgICBpZiAoR2V0Tm9kZSgpLT5Jc1VzZXJJbnRlcmFjdGl2ZSgpKQotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgaWYgKHdzU2NyaXB0TXNnLklzRW1wdHkoKSkKLSAgICAgICAgICB3c1NjcmlwdE1zZyA9IEdldFZhbGlkYXRlTWVzc2FnZShmYWxzZSwgYlZlcnNpb25GbGFnKTsKLQotICAgICAgICBpZiAoYlZlcnNpb25GbGFnKSB7Ci0gICAgICAgICAgcEFwcFByb3ZpZGVyLT5Nc2dCb3god3NTY3JpcHRNc2csIHdzVGl0bGUsIFhGQV9NQklDT05fV2FybmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTUJfT0spOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocEFwcFByb3ZpZGVyLT5Nc2dCb3god3NTY3JpcHRNc2csIHdzVGl0bGUsIFhGQV9NQklDT05fV2FybmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9NQl9ZZXNObykgPT0gWEZBX0lEWWVzKSB7Ci0gICAgICAgICAgR2V0Tm9kZSgpLT5TZXRGbGFnKFhGQV9Ob2RlRmxhZ19Vc2VySW50ZXJhY3RpdmUsIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHdzU2NyaXB0TXNnLklzRW1wdHkoKSkKLSAgICAgICAgICB3c1NjcmlwdE1zZyA9IEdldFZhbGlkYXRlTWVzc2FnZSh0cnVlLCBiVmVyc2lvbkZsYWcpOwotICAgICAgICBwQXBwUHJvdmlkZXItPk1zZ0JveCh3c1NjcmlwdE1zZywgd3NUaXRsZSwgWEZBX01CSUNPTl9FcnJvciwgWEZBX01CX09LKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLWludDMyX3QgQ1hGQV9XaWRnZXRBY2M6OlByb2Nlc3NGb3JtYXRUZXN0VmFsaWRhdGUoQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVmVyc2lvbkZsYWcpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NSYXdWYWx1ZSA9IEdldFJhd1ZhbHVlKCk7Ci0gIGlmICghd3NSYXdWYWx1ZS5Jc0VtcHR5KCkpIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1BpY3R1cmU7Ci0gICAgdmFsaWRhdGUuR2V0UGljdHVyZSh3c1BpY3R1cmUpOwotICAgIGlmICh3c1BpY3R1cmUuSXNFbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7Ci0gICAgfQotICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXRMb2NhbCgpOwotICAgIGlmICghcExvY2FsZSkgewotICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0OwotICAgIH0KLSAgICBDWEZBX0xvY2FsZVZhbHVlIGxjVmFsdWUgPSBYRkFfR2V0TG9jYWxlVmFsdWUodGhpcyk7Ci0gICAgaWYgKCFsY1ZhbHVlLlZhbGlkYXRlVmFsdWUobGNWYWx1ZS5HZXRWYWx1ZSgpLCB3c1BpY3R1cmUsIHBMb2NhbGUpKSB7Ci0gICAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBHZXRBcHBQcm92aWRlcigpOwotICAgICAgaWYgKCFwQXBwUHJvdmlkZXIpIHsKLSAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0OwotICAgICAgfQotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXRNc2c7Ci0gICAgICB2YWxpZGF0ZS5HZXRGb3JtYXRNZXNzYWdlVGV4dCh3c0Zvcm1hdE1zZyk7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c1RpdGxlID0gcEFwcFByb3ZpZGVyLT5HZXRBcHBUaXRsZSgpOwotICAgICAgaW50MzJfdCBlRm9ybWF0VGVzdCA9IHZhbGlkYXRlLkdldEZvcm1hdFRlc3QoKTsKLSAgICAgIGlmIChlRm9ybWF0VGVzdCA9PSBYRkFfQVRUUklCVVRFRU5VTV9FcnJvcikgewotICAgICAgICBpZiAod3NGb3JtYXRNc2cuSXNFbXB0eSgpKQotICAgICAgICAgIHdzRm9ybWF0TXNnID0gR2V0VmFsaWRhdGVNZXNzYWdlKHRydWUsIGJWZXJzaW9uRmxhZyk7Ci0gICAgICAgIHBBcHBQcm92aWRlci0+TXNnQm94KHdzRm9ybWF0TXNnLCB3c1RpdGxlLCBYRkFfTUJJQ09OX0Vycm9yLCBYRkFfTUJfT0spOwotICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfU3VjY2VzczsKLSAgICAgIH0KLSAgICAgIGlmIChHZXROb2RlKCktPklzVXNlckludGVyYWN0aXZlKCkpCi0gICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKLSAgICAgIGlmICh3c0Zvcm1hdE1zZy5Jc0VtcHR5KCkpCi0gICAgICAgIHdzRm9ybWF0TXNnID0gR2V0VmFsaWRhdGVNZXNzYWdlKGZhbHNlLCBiVmVyc2lvbkZsYWcpOwotCi0gICAgICBpZiAoYlZlcnNpb25GbGFnKSB7Ci0gICAgICAgIHBBcHBQcm92aWRlci0+TXNnQm94KHdzRm9ybWF0TXNnLCB3c1RpdGxlLCBYRkFfTUJJQ09OX1dhcm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9NQl9PSyk7Ci0gICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNjZXNzOwotICAgICAgfQotICAgICAgaWYgKHBBcHBQcm92aWRlci0+TXNnQm94KHdzRm9ybWF0TXNnLCB3c1RpdGxlLCBYRkFfTUJJQ09OX1dhcm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX01CX1llc05vKSA9PSBYRkFfSURZZXMpIHsKLSAgICAgICAgR2V0Tm9kZSgpLT5TZXRGbGFnKFhGQV9Ob2RlRmxhZ19Vc2VySW50ZXJhY3RpdmUsIGZhbHNlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNjZXNzOwotICAgIH0KLSAgfQotICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7Ci19Ci1pbnQzMl90IENYRkFfV2lkZ2V0QWNjOjpQcm9jZXNzTnVsbFRlc3RWYWxpZGF0ZShDWEZBX1ZhbGlkYXRlIHZhbGlkYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJWZXJzaW9uRmxhZykgewotICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOwotICBHZXRWYWx1ZSh3c1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7Ci0gIGlmICghd3NWYWx1ZS5Jc0VtcHR5KCkpIHsKLSAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfU3VjY2VzczsKLSAgfQotICBpZiAobV9iSXNOdWxsICYmIChtX2JQcmVOdWxsID09IG1fYklzTnVsbCkpIHsKLSAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfU3VjY2VzczsKLSAgfQotICBpbnQzMl90IGVOdWxsVGVzdCA9IHZhbGlkYXRlLkdldE51bGxUZXN0KCk7Ci0gIENGWF9XaWRlU3RyaW5nIHdzTnVsbE1zZzsKLSAgdmFsaWRhdGUuR2V0TnVsbE1lc3NhZ2VUZXh0KHdzTnVsbE1zZyk7Ci0gIGlmIChpRmxhZ3MgJiAweDAxKSB7Ci0gICAgaW50MzJfdCBpUmV0ID0gWEZBX0VWRU5URVJST1JfU3VjY2VzczsKLSAgICBpZiAoZU51bGxUZXN0ICE9IFhGQV9BVFRSSUJVVEVFTlVNX0Rpc2FibGVkKSB7Ci0gICAgICBpUmV0ID0gWEZBX0VWRU5URVJST1JfRXJyb3I7Ci0gICAgfQotICAgIGlmICghd3NOdWxsTXNnLklzRW1wdHkoKSkgewotICAgICAgaWYgKGVOdWxsVGVzdCAhPSBYRkFfQVRUUklCVVRFRU5VTV9EaXNhYmxlZCkgewotICAgICAgICBtX3BEb2NWaWV3LT5tX2Fyck51bGxUZXN0TXNnLnB1c2hfYmFjayh3c051bGxNc2cpOwotICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRXJyb3I7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfU3VjY2VzczsKLSAgICB9Ci0gICAgcmV0dXJuIGlSZXQ7Ci0gIH0KLSAgaWYgKHdzTnVsbE1zZy5Jc0VtcHR5KCkgJiYgYlZlcnNpb25GbGFnICYmCi0gICAgICBlTnVsbFRlc3QgIT0gWEZBX0FUVFJJQlVURUVOVU1fRGlzYWJsZWQpIHsKLSAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRXJyb3I7Ci0gIH0KLSAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0gR2V0QXBwUHJvdmlkZXIoKTsKLSAgaWYgKCFwQXBwUHJvdmlkZXIpIHsKLSAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NDYXB0aW9uTmFtZTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NUaXRsZSA9IHBBcHBQcm92aWRlci0+R2V0QXBwVGl0bGUoKTsKLSAgc3dpdGNoIChlTnVsbFRlc3QpIHsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Vycm9yOiB7Ci0gICAgICBpZiAod3NOdWxsTXNnLklzRW1wdHkoKSkgewotICAgICAgICB3c0NhcHRpb25OYW1lID0gR2V0VmFsaWRhdGVDYXB0aW9uTmFtZShiVmVyc2lvbkZsYWcpOwotICAgICAgICB3c051bGxNc2cuRm9ybWF0KEwiJXMgY2Fubm90IGJlIGJsYW5rLiIsIHdzQ2FwdGlvbk5hbWUuY19zdHIoKSk7Ci0gICAgICB9Ci0gICAgICBwQXBwUHJvdmlkZXItPk1zZ0JveCh3c051bGxNc2csIHdzVGl0bGUsIFhGQV9NQklDT05fU3RhdHVzLCBYRkFfTUJfT0spOwotICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Vycm9yOwotICAgIH0KLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1dhcm5pbmc6IHsKLSAgICAgIGlmIChHZXROb2RlKCktPklzVXNlckludGVyYWN0aXZlKCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICBpZiAod3NOdWxsTXNnLklzRW1wdHkoKSkgewotICAgICAgICB3c0NhcHRpb25OYW1lID0gR2V0VmFsaWRhdGVDYXB0aW9uTmFtZShiVmVyc2lvbkZsYWcpOwotICAgICAgICB3c051bGxNc2cuRm9ybWF0KAotICAgICAgICAgICAgTCIlcyBjYW5ub3QgYmUgYmxhbmsuIFRvIGlnbm9yZSB2YWxpZGF0aW9ucyBmb3IgJXMsIGNsaWNrIElnbm9yZS4iLAotICAgICAgICAgICAgd3NDYXB0aW9uTmFtZS5jX3N0cigpLCB3c0NhcHRpb25OYW1lLmNfc3RyKCkpOwotICAgICAgfQotICAgICAgaWYgKHBBcHBQcm92aWRlci0+TXNnQm94KHdzTnVsbE1zZywgd3NUaXRsZSwgWEZBX01CSUNPTl9XYXJuaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9NQl9ZZXNObykgPT0gWEZBX0lEWWVzKSB7Ci0gICAgICAgIEdldE5vZGUoKS0+U2V0RmxhZyhYRkFfTm9kZUZsYWdfVXNlckludGVyYWN0aXZlLCBmYWxzZSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRXJyb3I7Ci0gICAgfQotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fRGlzYWJsZWQ6Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNjZXNzOwotfQotCi1DRlhfV2lkZVN0cmluZyBDWEZBX1dpZGdldEFjYzo6R2V0VmFsaWRhdGVDYXB0aW9uTmFtZShib29sIGJWZXJzaW9uRmxhZykgewotICBDRlhfV2lkZVN0cmluZyB3c0NhcHRpb25OYW1lOwotCi0gIGlmICghYlZlcnNpb25GbGFnKSB7Ci0gICAgaWYgKENYRkFfQ2FwdGlvbiBjYXB0aW9uID0gR2V0Q2FwdGlvbigpKSB7Ci0gICAgICBpZiAoQ1hGQV9WYWx1ZSBjYXBWYWx1ZSA9IGNhcHRpb24uR2V0VmFsdWUoKSkgewotICAgICAgICBpZiAoQ1hGQV9UZXh0IGNhcFRleHQgPSBjYXBWYWx1ZS5HZXRUZXh0KCkpCi0gICAgICAgICAgY2FwVGV4dC5HZXRDb250ZW50KHdzQ2FwdGlvbk5hbWUpOwotICAgICAgfQotICAgIH0KLSAgfQotICBpZiAod3NDYXB0aW9uTmFtZS5Jc0VtcHR5KCkpCi0gICAgR2V0TmFtZSh3c0NhcHRpb25OYW1lKTsKLQotICByZXR1cm4gd3NDYXB0aW9uTmFtZTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9XaWRnZXRBY2M6OkdldFZhbGlkYXRlTWVzc2FnZShib29sIGJFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVmVyc2lvbkZsYWcpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NDYXB0aW9uTmFtZSA9IEdldFZhbGlkYXRlQ2FwdGlvbk5hbWUoYlZlcnNpb25GbGFnKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NNZXNzYWdlOwotICBpZiAoYlZlcnNpb25GbGFnKSB7Ci0gICAgd3NNZXNzYWdlLkZvcm1hdChMIiVzIHZhbGlkYXRpb24gZmFpbGVkIiwgd3NDYXB0aW9uTmFtZS5jX3N0cigpKTsKLSAgICByZXR1cm4gd3NNZXNzYWdlOwotICB9Ci0gIGlmIChiRXJyb3IpIHsKLSAgICB3c01lc3NhZ2UuRm9ybWF0KEwiVGhlIHZhbHVlIHlvdSBlbnRlcmVkIGZvciAlcyBpcyBpbnZhbGlkLiIsCi0gICAgICAgICAgICAgICAgICAgICB3c0NhcHRpb25OYW1lLmNfc3RyKCkpOwotICAgIHJldHVybiB3c01lc3NhZ2U7Ci0gIH0KLSAgd3NNZXNzYWdlLkZvcm1hdCgKLSAgICAgIEwiVGhlIHZhbHVlIHlvdSBlbnRlcmVkIGZvciAlcyBpcyBpbnZhbGlkLiBUbyBpZ25vcmUgIgotICAgICAgTCJ2YWxpZGF0aW9ucyBmb3IgJXMsIGNsaWNrIElnbm9yZS4iLAotICAgICAgd3NDYXB0aW9uTmFtZS5jX3N0cigpLCB3c0NhcHRpb25OYW1lLmNfc3RyKCkpOwotICByZXR1cm4gd3NNZXNzYWdlOwotfQotCi1pbnQzMl90IENYRkFfV2lkZ2V0QWNjOjpQcm9jZXNzVmFsaWRhdGUoaW50MzJfdCBpRmxhZ3MpIHsKLSAgaWYgKEdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkRyYXcpIHsKLSAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7Ci0gIH0KLSAgQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSA9IEdldFZhbGlkYXRlKCk7Ci0gIGlmICghdmFsaWRhdGUpIHsKLSAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7Ci0gIH0KLSAgYm9vbCBiSW5pdERvYyA9IHZhbGlkYXRlLkdldE5vZGUoKS0+TmVlZHNJbml0QXBwKCk7Ci0gIGJvb2wgYlN0YXR1cyA9IG1fcERvY1ZpZXctPkdldExheW91dFN0YXR1cygpIDwgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZDsKLSAgaW50MzJfdCBpRm9ybWF0ID0gMDsKLSAgQ0ZYSlNFX1ZhbHVlKiBwUmV0VmFsdWUgPSBudWxscHRyOwotICBpbnQzMl90IGlSZXQgPSBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKLSAgQ1hGQV9TY3JpcHQgc2NyaXB0ID0gdmFsaWRhdGUuR2V0U2NyaXB0KCk7Ci0gIGlmIChzY3JpcHQpIHsKLSAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOwotICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX1ZhbGlkYXRlOwotICAgIGVQYXJhbS5tX3BUYXJnZXQgPSB0aGlzOwotICAgIGlSZXQgPSBFeGVjdXRlU2NyaXB0KHNjcmlwdCwgJmVQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoKGJJbml0RG9jIHx8IGJTdGF0dXMpICYmIEdldFJhd1ZhbHVlKCkuSXNFbXB0eSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG51bGxwdHIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmcFJldFZhbHVlKTsKLSAgfQotICBYRkFfVkVSU0lPTiB2ZXJzaW9uID0gR2V0RG9jKCktPkdldFhGQURvYygpLT5HZXRDdXJWZXJzaW9uTW9kZSgpOwotICBib29sIGJWZXJzaW9uRmxhZyA9IGZhbHNlOwotICBpZiAodmVyc2lvbiA8IFhGQV9WRVJTSU9OXzIwOCkgewotICAgIGJWZXJzaW9uRmxhZyA9IHRydWU7Ci0gIH0KLSAgaWYgKGJJbml0RG9jKSB7Ci0gICAgdmFsaWRhdGUuR2V0Tm9kZSgpLT5DbGVhckZsYWcoWEZBX05vZGVGbGFnX05lZWRzSW5pdEFwcCk7Ci0gIH0gZWxzZSB7Ci0gICAgaUZvcm1hdCA9IFByb2Nlc3NGb3JtYXRUZXN0VmFsaWRhdGUodmFsaWRhdGUsIGJWZXJzaW9uRmxhZyk7Ci0gICAgaWYgKCFiVmVyc2lvbkZsYWcpIHsKLSAgICAgIGJWZXJzaW9uRmxhZyA9IEdldERvYygpLT5HZXRYRkFEb2MoKS0+SGFzRmxhZyhYRkFfRE9DRkxBR19TY3JpcHRpbmcpOwotICAgIH0KLSAgICBpUmV0IHw9IFByb2Nlc3NOdWxsVGVzdFZhbGlkYXRlKHZhbGlkYXRlLCBpRmxhZ3MsIGJWZXJzaW9uRmxhZyk7Ci0gIH0KLSAgaWYgKGlGb3JtYXQgIT0gWEZBX0VWRU5URVJST1JfU3VjY2VzcykgewotICAgIFByb2Nlc3NTY3JpcHRUZXN0VmFsaWRhdGUodmFsaWRhdGUsIGlSZXQsIHBSZXRWYWx1ZSwgYlZlcnNpb25GbGFnKTsKLSAgfQotICBkZWxldGUgcFJldFZhbHVlOwotCi0gIHJldHVybiBpUmV0IHwgaUZvcm1hdDsKLX0KLWludDMyX3QgQ1hGQV9XaWRnZXRBY2M6OkV4ZWN1dGVTY3JpcHQoQ1hGQV9TY3JpcHQgc2NyaXB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqKiBwUmV0VmFsdWUpIHsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9SRUNVUlNJT05fREVQVEggPSAyOwotICBpZiAobV9uUmVjdXJzaW9uRGVwdGggPiBNQVhfUkVDVVJTSU9OX0RFUFRIKQotICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNjZXNzOwotICBBU1NFUlQocEV2ZW50UGFyYW0pOwotICBpZiAoIXNjcmlwdCkgewotICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKLSAgfQotICBpZiAoc2NyaXB0LkdldFJ1bkF0KCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fU2VydmVyKSB7Ci0gICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Rpc2FibGVkOwotICB9Ci0gIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsKLSAgc2NyaXB0LkdldEV4cHJlc3Npb24od3NFeHByZXNzaW9uKTsKLSAgaWYgKHdzRXhwcmVzc2lvbi5Jc0VtcHR5KCkpIHsKLSAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7Ci0gIH0KLSAgWEZBX1NDUklQVFRZUEUgZVNjcmlwdFR5cGUgPSBzY3JpcHQuR2V0Q29udGVudFR5cGUoKTsKLSAgaWYgKGVTY3JpcHRUeXBlID09IFhGQV9TQ1JJUFRUWVBFX1Vua293bikgewotICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNjZXNzOwotICB9Ci0gIENYRkFfRkZEb2MqIHBEb2MgPSBHZXREb2MoKTsKLSAgQ1hGQV9TY3JpcHRDb250ZXh0KiBwQ29udGV4dCA9IHBEb2MtPkdldFhGQURvYygpLT5HZXRTY3JpcHRDb250ZXh0KCk7Ci0gIHBDb250ZXh0LT5TZXRFdmVudFBhcmFtKCpwRXZlbnRQYXJhbSk7Ci0gIHBDb250ZXh0LT5TZXRSdW5BdFR5cGUoKFhGQV9BVFRSSUJVVEVFTlVNKXNjcmlwdC5HZXRSdW5BdCgpKTsKLSAgQ1hGQV9Ob2RlQXJyYXkgcmVmTm9kZXM7Ci0gIGlmIChwRXZlbnRQYXJhbS0+bV9lVHlwZSA9PSBYRkFfRVZFTlRfSW5pdENhbGN1bGF0ZSB8fAotICAgICAgcEV2ZW50UGFyYW0tPm1fZVR5cGUgPT0gWEZBX0VWRU5UX0NhbGN1bGF0ZSkgewotICAgIHBDb250ZXh0LT5TZXROb2Rlc09mUnVuU2NyaXB0KCZyZWZOb2Rlcyk7Ci0gIH0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gcFRtcFJldFZhbHVlKAotICAgICAgbmV3IENGWEpTRV9WYWx1ZShwQ29udGV4dC0+R2V0UnVudGltZSgpKSk7Ci0gICsrbV9uUmVjdXJzaW9uRGVwdGg7Ci0gIGJvb2wgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoKFhGQV9TQ1JJUFRMQU5HVFlQRSllU2NyaXB0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0V4cHJlc3Npb24uQXNTdHJpbmdDKCksIHBUbXBSZXRWYWx1ZS5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BOb2RlKTsKLSAgLS1tX25SZWN1cnNpb25EZXB0aDsKLSAgaW50MzJfdCBpUmV0ID0gWEZBX0VWRU5URVJST1JfRXJyb3I7Ci0gIGlmIChiUmV0KSB7Ci0gICAgaVJldCA9IFhGQV9FVkVOVEVSUk9SX1N1Y2Nlc3M7Ci0gICAgaWYgKHBFdmVudFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9DYWxjdWxhdGUgfHwKLSAgICAgICAgcEV2ZW50UGFyYW0tPm1fZVR5cGUgPT0gWEZBX0VWRU5UX0luaXRDYWxjdWxhdGUpIHsKLSAgICAgIGlmICghcFRtcFJldFZhbHVlLT5Jc1VuZGVmaW5lZCgpKSB7Ci0gICAgICAgIGlmICghcFRtcFJldFZhbHVlLT5Jc051bGwoKSkKLSAgICAgICAgICBwRXZlbnRQYXJhbS0+bV93c1Jlc3VsdCA9IHBUbXBSZXRWYWx1ZS0+VG9XaWRlU3RyaW5nKCk7Ci0KLSAgICAgICAgaVJldCA9IFhGQV9FVkVOVEVSUk9SX1N1Y2Nlc3M7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpUmV0ID0gWEZBX0VWRU5URVJST1JfRXJyb3I7Ci0gICAgICB9Ci0gICAgICBpZiAocEV2ZW50UGFyYW0tPm1fZVR5cGUgPT0gWEZBX0VWRU5UX0luaXRDYWxjdWxhdGUpIHsKLSAgICAgICAgaWYgKChpUmV0ID09IFhGQV9FVkVOVEVSUk9SX1N1Y2Nlc3MpICYmCi0gICAgICAgICAgICAoR2V0UmF3VmFsdWUoKSAhPSBwRXZlbnRQYXJhbS0+bV93c1Jlc3VsdCkpIHsKLSAgICAgICAgICBTZXRWYWx1ZShwRXZlbnRQYXJhbS0+bV93c1Jlc3VsdCwgWEZBX1ZBTFVFUElDVFVSRV9SYXcpOwotICAgICAgICAgIG1fcERvY1ZpZXctPkFkZFZhbGlkYXRlV2lkZ2V0KHRoaXMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbnQzMl90IGlSZWZzID0gcmVmTm9kZXMuR2V0U2l6ZSgpOwotICAgICAgZm9yIChpbnQzMl90IHIgPSAwOyByIDwgaVJlZnM7IHIrKykgewotICAgICAgICBDWEZBX1dpZGdldEFjYyogcFJlZkFjYyA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxDWEZBX1dpZGdldEFjYyo+KHJlZk5vZGVzW3JdLT5HZXRXaWRnZXREYXRhKCkpOwotICAgICAgICBpZiAocFJlZkFjYyAmJiBwUmVmQWNjID09IHRoaXMpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBDWEZBX05vZGUqIHBSZWZOb2RlID0gcmVmTm9kZXNbcl07Ci0gICAgICAgIENYRkFfQ2FsY0RhdGEqIHBHbG9iYWxEYXRhID0KLSAgICAgICAgICAgIChDWEZBX0NhbGNEYXRhKilwUmVmTm9kZS0+R2V0VXNlckRhdGEoWEZBX0NhbGNEYXRhKTsKLSAgICAgICAgaWYgKCFwR2xvYmFsRGF0YSkgewotICAgICAgICAgIHBHbG9iYWxEYXRhID0gbmV3IENYRkFfQ2FsY0RhdGE7Ci0gICAgICAgICAgcFJlZk5vZGUtPlNldFVzZXJEYXRhKFhGQV9DYWxjRGF0YSwgcEdsb2JhbERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnc19YRkFEZWxldGVDYWxjRGF0YSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwZGZpdW06OkNvbnRhaW5zVmFsdWUocEdsb2JhbERhdGEtPm1fR2xvYmFscywgdGhpcykpCi0gICAgICAgICAgcEdsb2JhbERhdGEtPm1fR2xvYmFscy5wdXNoX2JhY2sodGhpcyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGlmIChwUmV0VmFsdWUpCi0gICAgKnBSZXRWYWx1ZSA9IHBUbXBSZXRWYWx1ZS5yZWxlYXNlKCk7Ci0KLSAgcENvbnRleHQtPlNldE5vZGVzT2ZSdW5TY3JpcHQobnVsbHB0cik7Ci0gIHJldHVybiBpUmV0OwotfQotQ1hGQV9GRldpZGdldCogQ1hGQV9XaWRnZXRBY2M6OkdldE5leHRXaWRnZXQoQ1hGQV9GRldpZGdldCogcFdpZGdldCkgewotICBDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXQgPSBudWxscHRyOwotICBpZiAocFdpZGdldCkgewotICAgIHBMYXlvdXQgPSBwV2lkZ2V0LT5HZXROZXh0KCk7Ci0gIH0gZWxzZSB7Ci0gICAgcExheW91dCA9IG1fcERvY1ZpZXctPkdldFhGQUxheW91dCgpLT5HZXRMYXlvdXRJdGVtKG1fcE5vZGUpOwotICB9Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4ocExheW91dCk7Ci19Ci12b2lkIENYRkFfV2lkZ2V0QWNjOjpVcGRhdGVVSURpc3BsYXkoQ1hGQV9GRldpZGdldCogcEV4Y2VwdCkgewotICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gbnVsbHB0cjsKLSAgd2hpbGUgKChwV2lkZ2V0ID0gR2V0TmV4dFdpZGdldChwV2lkZ2V0KSkgIT0gbnVsbHB0cikgewotICAgIGlmIChwV2lkZ2V0ID09IHBFeGNlcHQgfHwgIXBXaWRnZXQtPklzTG9hZGVkKCkgfHwKLSAgICAgICAgKEdldFVJVHlwZSgpICE9IFhGQV9FbGVtZW50OjpDaGVja0J1dHRvbiAmJiBwV2lkZ2V0LT5Jc0ZvY3VzZWQoKSkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBwV2lkZ2V0LT5VcGRhdGVGV0xEYXRhKCk7Ci0gICAgcFdpZGdldC0+QWRkSW52YWxpZGF0ZVJlY3QoKTsKLSAgfQotfQotCi12b2lkIENYRkFfV2lkZ2V0QWNjOjpDYWxjQ2FwdGlvblNpemUoQ0ZYX1NpemVGJiBzekNhcCkgewotICBDWEZBX0NhcHRpb24gY2FwdGlvbiA9IEdldENhcHRpb24oKTsKLSAgaWYgKCFjYXB0aW9uIHx8IGNhcHRpb24uR2V0UHJlc2VuY2UoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIExvYWRDYXB0aW9uKCk7Ci0gIFhGQV9FbGVtZW50IGVVSVR5cGUgPSBHZXRVSVR5cGUoKTsKLSAgaW50MzJfdCBpQ2FwUGxhY2VtZW50ID0gY2FwdGlvbi5HZXRQbGFjZW1lbnRUeXBlKCk7Ci0gIEZYX0ZMT0FUIGZDYXBSZXNlcnZlID0gY2FwdGlvbi5HZXRSZXNlcnZlKCk7Ci0gIGNvbnN0IGJvb2wgYlZlcnQgPSBpQ2FwUGxhY2VtZW50ID09IFhGQV9BVFRSSUJVVEVFTlVNX1RvcCB8fAotICAgICAgICAgICAgICAgICAgICAgaUNhcFBsYWNlbWVudCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b207Ci0gIGNvbnN0IGJvb2wgYlJlc2VydmVFeGl0ID0gZkNhcFJlc2VydmUgPiAwLjAxOwotICBDWEZBX1RleHRMYXlvdXQqIHBDYXBUZXh0TGF5b3V0ID0KLSAgICAgIHN0YXRpY19jYXN0PENYRkFfRmllbGRMYXlvdXREYXRhKj4obV9wTGF5b3V0RGF0YS5nZXQoKSkKLSAgICAgICAgICAtPm1fcENhcFRleHRMYXlvdXQuZ2V0KCk7Ci0gIGlmIChwQ2FwVGV4dExheW91dCkgewotICAgIGlmICghYlZlcnQgJiYgZVVJVHlwZSAhPSBYRkFfRWxlbWVudDo6QnV0dG9uKSB7Ci0gICAgICBzekNhcC53aWR0aCA9IGZDYXBSZXNlcnZlOwotICAgIH0KLSAgICBDRlhfU2l6ZUYgbWluU2l6ZTsKLSAgICBwQ2FwVGV4dExheW91dC0+Q2FsY1NpemUobWluU2l6ZSwgc3pDYXAsIHN6Q2FwKTsKLSAgICBpZiAoYlJlc2VydmVFeGl0KSB7Ci0gICAgICBiVmVydCA/IHN6Q2FwLmhlaWdodCA9IGZDYXBSZXNlcnZlIDogc3pDYXAud2lkdGggPSBmQ2FwUmVzZXJ2ZTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgRlhfRkxPQVQgZkZvbnRTaXplID0gMTAuMGY7Ci0gICAgaWYgKENYRkFfRm9udCBmb250ID0gY2FwdGlvbi5HZXRGb250KCkpIHsKLSAgICAgIGZGb250U2l6ZSA9IGZvbnQuR2V0Rm9udFNpemUoKTsKLSAgICB9IGVsc2UgaWYgKENYRkFfRm9udCB3aWRnZXRmb250ID0gR2V0Rm9udCgpKSB7Ci0gICAgICBmRm9udFNpemUgPSB3aWRnZXRmb250LkdldEZvbnRTaXplKCk7Ci0gICAgfQotICAgIGlmIChiVmVydCkgewotICAgICAgc3pDYXAuaGVpZ2h0ID0gZkNhcFJlc2VydmUgPiAwID8gZkNhcFJlc2VydmUgOiBmRm9udFNpemU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN6Q2FwLndpZHRoID0gZkNhcFJlc2VydmUgPiAwID8gZkNhcFJlc2VydmUgOiAwOwotICAgICAgc3pDYXAuaGVpZ2h0ID0gZkZvbnRTaXplOwotICAgIH0KLSAgfQotICBpZiAoQ1hGQV9NYXJnaW4gbWdDYXAgPSBjYXB0aW9uLkdldE1hcmdpbigpKSB7Ci0gICAgRlhfRkxPQVQgZkxlZnRJbnNldCwgZlRvcEluc2V0LCBmUmlnaHRJbnNldCwgZkJvdHRvbUluc2V0OwotICAgIG1nQ2FwLkdldExlZnRJbnNldChmTGVmdEluc2V0KTsKLSAgICBtZ0NhcC5HZXRUb3BJbnNldChmVG9wSW5zZXQpOwotICAgIG1nQ2FwLkdldFJpZ2h0SW5zZXQoZlJpZ2h0SW5zZXQpOwotICAgIG1nQ2FwLkdldEJvdHRvbUluc2V0KGZCb3R0b21JbnNldCk7Ci0gICAgaWYgKGJSZXNlcnZlRXhpdCkgewotICAgICAgYlZlcnQgPyAoc3pDYXAud2lkdGggKz0gZkxlZnRJbnNldCArIGZSaWdodEluc2V0KQotICAgICAgICAgICAgOiAoc3pDYXAuaGVpZ2h0ICs9IGZUb3BJbnNldCArIGZCb3R0b21JbnNldCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN6Q2FwLndpZHRoICs9IGZMZWZ0SW5zZXQgKyBmUmlnaHRJbnNldDsKLSAgICAgIHN6Q2FwLmhlaWdodCArPSBmVG9wSW5zZXQgKyBmQm90dG9tSW5zZXQ7Ci0gICAgfQotICB9Ci19Ci1ib29sIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVGaWVsZEF1dG9TaXplKENGWF9TaXplRiYgc2l6ZSkgewotICBDRlhfU2l6ZUYgc3pDYXA7Ci0gIENhbGNDYXB0aW9uU2l6ZShzekNhcCk7Ci0gIENGWF9SZWN0RiBydFVJTWFyZ2luID0gR2V0VUlNYXJnaW4oKTsKLSAgc2l6ZS53aWR0aCArPSBydFVJTWFyZ2luLmxlZnQgKyBydFVJTWFyZ2luLndpZHRoOwotICBzaXplLmhlaWdodCArPSBydFVJTWFyZ2luLnRvcCArIHJ0VUlNYXJnaW4uaGVpZ2h0OwotICBpZiAoc3pDYXAud2lkdGggPiAwICYmIHN6Q2FwLmhlaWdodCA+IDApIHsKLSAgICBpbnQzMl90IGlDYXBQbGFjZW1lbnQgPSBHZXRDYXB0aW9uKCkuR2V0UGxhY2VtZW50VHlwZSgpOwotICAgIHN3aXRjaCAoaUNhcFBsYWNlbWVudCkgewotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0OgotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoKLSAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fSW5saW5lOiB7Ci0gICAgICAgIHNpemUud2lkdGggKz0gc3pDYXAud2lkdGg7Ci0gICAgICAgIHNpemUuaGVpZ2h0ID0gc3RkOjptYXgoc2l6ZS5oZWlnaHQsIHN6Q2FwLmhlaWdodCk7Ci0gICAgICB9IGJyZWFrOwotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3A6Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbTogewotICAgICAgICBzaXplLmhlaWdodCArPSBzekNhcC5oZWlnaHQ7Ci0gICAgICAgIHNpemUud2lkdGggPSBzdGQ6Om1heChzaXplLndpZHRoLCBzekNhcC53aWR0aCk7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIENhbGN1bGF0ZVdpZGdldEF1dG9TaXplKHNpemUpOwotfQotYm9vbCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlV2lkZ2V0QXV0b1NpemUoQ0ZYX1NpemVGJiBzaXplKSB7Ci0gIENYRkFfTWFyZ2luIG1nV2lkZ2V0ID0gR2V0TWFyZ2luKCk7Ci0gIGlmIChtZ1dpZGdldCkgewotICAgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQsIGZUb3BJbnNldCwgZlJpZ2h0SW5zZXQsIGZCb3R0b21JbnNldDsKLSAgICBtZ1dpZGdldC5HZXRMZWZ0SW5zZXQoZkxlZnRJbnNldCk7Ci0gICAgbWdXaWRnZXQuR2V0VG9wSW5zZXQoZlRvcEluc2V0KTsKLSAgICBtZ1dpZGdldC5HZXRSaWdodEluc2V0KGZSaWdodEluc2V0KTsKLSAgICBtZ1dpZGdldC5HZXRCb3R0b21JbnNldChmQm90dG9tSW5zZXQpOwotICAgIHNpemUud2lkdGggKz0gZkxlZnRJbnNldCArIGZSaWdodEluc2V0OwotICAgIHNpemUuaGVpZ2h0ICs9IGZUb3BJbnNldCArIGZCb3R0b21JbnNldDsKLSAgfQotICBDWEZBX1BhcmEgcGFyYSA9IEdldFBhcmEoKTsKLSAgaWYgKHBhcmEpCi0gICAgc2l6ZS53aWR0aCArPSBwYXJhLkdldE1hcmdpbkxlZnQoKSArIHBhcmEuR2V0VGV4dEluZGVudCgpOwotCi0gIEZYX0ZMT0FUIGZWYWwgPSAwOwotICBGWF9GTE9BVCBmTWluID0gMDsKLSAgRlhfRkxPQVQgZk1heCA9IDA7Ci0gIGlmIChHZXRXaWR0aChmVmFsKSkgewotICAgIHNpemUud2lkdGggPSBmVmFsOwotICB9IGVsc2UgewotICAgIGlmIChHZXRNaW5XaWR0aChmTWluKSkKLSAgICAgIHNpemUud2lkdGggPSBzdGQ6Om1heChzaXplLndpZHRoLCBmTWluKTsKLSAgICBpZiAoR2V0TWF4V2lkdGgoZk1heCkgJiYgZk1heCA+IDApCi0gICAgICBzaXplLndpZHRoID0gc3RkOjptaW4oc2l6ZS53aWR0aCwgZk1heCk7Ci0gIH0KLSAgZlZhbCA9IDA7Ci0gIGZNaW4gPSAwOwotICBmTWF4ID0gMDsKLSAgaWYgKEdldEhlaWdodChmVmFsKSkgewotICAgIHNpemUuaGVpZ2h0ID0gZlZhbDsKLSAgfSBlbHNlIHsKLSAgICBpZiAoR2V0TWluSGVpZ2h0KGZNaW4pKQotICAgICAgc2l6ZS5oZWlnaHQgPSBzdGQ6Om1heChzaXplLmhlaWdodCwgZk1pbik7Ci0gICAgaWYgKEdldE1heEhlaWdodChmTWF4KSAmJiBmTWF4ID4gMCkKLSAgICAgIHNpemUuaGVpZ2h0ID0gc3RkOjptaW4oc2l6ZS5oZWlnaHQsIGZNYXgpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVUZXh0Q29udGVudFNpemUoQ0ZYX1NpemVGJiBzaXplKSB7Ci0gIEZYX0ZMT0FUIGZGb250U2l6ZSA9IEdldEZvbnRTaXplKCk7Ci0gIENGWF9XaWRlU3RyaW5nIHdzVGV4dDsKLSAgR2V0VmFsdWUod3NUZXh0LCBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOwotICBpZiAod3NUZXh0LklzRW1wdHkoKSkgewotICAgIHNpemUuaGVpZ2h0ICs9IGZGb250U2l6ZTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBGWF9XQ0hBUiB3Y0VudGVyID0gJ1xuJzsKLSAgRlhfV0NIQVIgd3NMYXN0ID0gd3NUZXh0LkdldEF0KHdzVGV4dC5HZXRMZW5ndGgoKSAtIDEpOwotICBpZiAod3NMYXN0ID09IHdjRW50ZXIpIHsKLSAgICB3c1RleHQgPSB3c1RleHQgKyB3Y0VudGVyOwotICB9Ci0KLSAgQ1hGQV9GaWVsZExheW91dERhdGEqIGxheW91dERhdGEgPQotICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9GaWVsZExheW91dERhdGEqPihtX3BMYXlvdXREYXRhLmdldCgpKTsKLSAgaWYgKCFsYXlvdXREYXRhLT5tX3BUZXh0T3V0KSB7Ci0gICAgbGF5b3V0RGF0YS0+bV9wVGV4dE91dCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRkRFX1RleHRPdXQ+KCk7Ci0gICAgQ0ZERV9UZXh0T3V0KiBwVGV4dE91dCA9IGxheW91dERhdGEtPm1fcFRleHRPdXQuZ2V0KCk7Ci0gICAgcFRleHRPdXQtPlNldEZvbnQoR2V0RkRFRm9udCgpKTsKLSAgICBwVGV4dE91dC0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKLSAgICBwVGV4dE91dC0+U2V0TGluZUJyZWFrVG9sZXJhbmNlKGZGb250U2l6ZSAqIDAuMmYpOwotICAgIHBUZXh0T3V0LT5TZXRMaW5lU3BhY2UoR2V0TGluZUhlaWdodCgpKTsKLSAgICB1aW50MzJfdCBkd1N0eWxlcyA9IEZERV9UVE9TVFlMRV9MYXN0TGluZUhlaWdodDsKLSAgICBpZiAoR2V0VUlUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlRleHRFZGl0ICYmIElzTXVsdGlMaW5lKCkpIHsKLSAgICAgIGR3U3R5bGVzIHw9IEZERV9UVE9TVFlMRV9MaW5lV3JhcDsKLSAgICB9Ci0gICAgcFRleHRPdXQtPlNldFN0eWxlcyhkd1N0eWxlcyk7Ci0gIH0KLSAgbGF5b3V0RGF0YS0+bV9wVGV4dE91dC0+Q2FsY0xvZ2ljU2l6ZSh3c1RleHQuY19zdHIoKSwgd3NUZXh0LkdldExlbmd0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotfQotYm9vbCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlVGV4dEVkaXRBdXRvU2l6ZShDRlhfU2l6ZUYmIHNpemUpIHsKLSAgaWYgKHNpemUud2lkdGggPiAwKSB7Ci0gICAgQ0ZYX1NpemVGIHN6T3J6ID0gc2l6ZTsKLSAgICBDRlhfU2l6ZUYgc3pDYXA7Ci0gICAgQ2FsY0NhcHRpb25TaXplKHN6Q2FwKTsKLSAgICBib29sIGJDYXBFeGl0ID0gc3pDYXAud2lkdGggPiAwLjAxICYmIHN6Q2FwLmhlaWdodCA+IDAuMDE7Ci0gICAgaW50MzJfdCBpQ2FwUGxhY2VtZW50ID0gWEZBX0FUVFJJQlVURUVOVU1fVW5rbm93bjsKLSAgICBpZiAoYkNhcEV4aXQpIHsKLSAgICAgIGlDYXBQbGFjZW1lbnQgPSBHZXRDYXB0aW9uKCkuR2V0UGxhY2VtZW50VHlwZSgpOwotICAgICAgc3dpdGNoIChpQ2FwUGxhY2VtZW50KSB7Ci0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDoKLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoKLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9JbmxpbmU6IHsKLSAgICAgICAgICBzaXplLndpZHRoIC09IHN6Q2FwLndpZHRoOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIENGWF9SZWN0RiBydFVJTWFyZ2luID0gR2V0VUlNYXJnaW4oKTsKLSAgICBzaXplLndpZHRoIC09IHJ0VUlNYXJnaW4ubGVmdCArIHJ0VUlNYXJnaW4ud2lkdGg7Ci0gICAgQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSBHZXRNYXJnaW4oKTsKLSAgICBpZiAobWdXaWRnZXQpIHsKLSAgICAgIEZYX0ZMT0FUIGZMZWZ0SW5zZXQsIGZSaWdodEluc2V0OwotICAgICAgbWdXaWRnZXQuR2V0TGVmdEluc2V0KGZMZWZ0SW5zZXQpOwotICAgICAgbWdXaWRnZXQuR2V0UmlnaHRJbnNldChmUmlnaHRJbnNldCk7Ci0gICAgICBzaXplLndpZHRoIC09IGZMZWZ0SW5zZXQgKyBmUmlnaHRJbnNldDsKLSAgICB9Ci0gICAgQ2FsY3VsYXRlVGV4dENvbnRlbnRTaXplKHNpemUpOwotICAgIHNpemUuaGVpZ2h0ICs9IHJ0VUlNYXJnaW4udG9wICsgcnRVSU1hcmdpbi5oZWlnaHQ7Ci0gICAgaWYgKGJDYXBFeGl0KSB7Ci0gICAgICBzd2l0Y2ggKGlDYXBQbGFjZW1lbnQpIHsKLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0OgotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JpZ2h0OgotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0lubGluZTogewotICAgICAgICAgIHNpemUuaGVpZ2h0ID0gc3RkOjptYXgoc2l6ZS5oZWlnaHQsIHN6Q2FwLmhlaWdodCk7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9wOgotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbTogewotICAgICAgICAgIHNpemUuaGVpZ2h0ICs9IHN6Q2FwLmhlaWdodDsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBzaXplLndpZHRoID0gc3pPcnoud2lkdGg7Ci0gICAgcmV0dXJuIENhbGN1bGF0ZVdpZGdldEF1dG9TaXplKHNpemUpOwotICB9Ci0gIENhbGN1bGF0ZVRleHRDb250ZW50U2l6ZShzaXplKTsKLSAgcmV0dXJuIENhbGN1bGF0ZUZpZWxkQXV0b1NpemUoc2l6ZSk7Ci19Ci1ib29sIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVDaGVja0J1dHRvbkF1dG9TaXplKENGWF9TaXplRiYgc2l6ZSkgewotICBGWF9GTE9BVCBmQ2hlY2tTaXplID0gR2V0Q2hlY2tCdXR0b25TaXplKCk7Ci0gIHNpemUgPSBDRlhfU2l6ZUYoZkNoZWNrU2l6ZSwgZkNoZWNrU2l6ZSk7Ci0gIHJldHVybiBDYWxjdWxhdGVGaWVsZEF1dG9TaXplKHNpemUpOwotfQotYm9vbCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlUHVzaEJ1dHRvbkF1dG9TaXplKENGWF9TaXplRiYgc2l6ZSkgewotICBDYWxjQ2FwdGlvblNpemUoc2l6ZSk7Ci0gIHJldHVybiBDYWxjdWxhdGVXaWRnZXRBdXRvU2l6ZShzaXplKTsKLX0KLWJvb2wgQ1hGQV9XaWRnZXRBY2M6OkNhbGN1bGF0ZUltYWdlQXV0b1NpemUoQ0ZYX1NpemVGJiBzaXplKSB7Ci0gIGlmICghR2V0SW1hZ2VJbWFnZSgpKSB7Ci0gICAgTG9hZEltYWdlSW1hZ2UoKTsKLSAgfQotICBzaXplLmNsZWFyKCk7Ci0gIGlmIChDRlhfRElCaXRtYXAqIHBCaXRtYXAgPSBHZXRJbWFnZUltYWdlKCkpIHsKLSAgICBpbnQzMl90IGlJbWFnZVhEcGkgPSAwOwotICAgIGludDMyX3QgaUltYWdlWURwaSA9IDA7Ci0gICAgR2V0SW1hZ2VEcGkoaUltYWdlWERwaSwgaUltYWdlWURwaSk7Ci0gICAgQ0ZYX1JlY3RGIHJ0SW1hZ2UoCi0gICAgICAgIDAsIDAsCi0gICAgICAgIFhGQV9Vbml0UHgyUHQoKEZYX0ZMT0FUKXBCaXRtYXAtPkdldFdpZHRoKCksIChGWF9GTE9BVClpSW1hZ2VYRHBpKSwKLSAgICAgICAgWEZBX1VuaXRQeDJQdCgoRlhfRkxPQVQpcEJpdG1hcC0+R2V0SGVpZ2h0KCksIChGWF9GTE9BVClpSW1hZ2VZRHBpKSk7Ci0KLSAgICBDRlhfUmVjdEYgcnRGaXQ7Ci0gICAgaWYgKEdldFdpZHRoKHJ0Rml0LndpZHRoKSkgewotICAgICAgR2V0V2lkdGhXaXRob3V0TWFyZ2luKHJ0Rml0LndpZHRoKTsKLSAgICB9IGVsc2UgewotICAgICAgcnRGaXQud2lkdGggPSBydEltYWdlLndpZHRoOwotICAgIH0KLSAgICBpZiAoR2V0SGVpZ2h0KHJ0Rml0LmhlaWdodCkpIHsKLSAgICAgIEdldEhlaWdodFdpdGhvdXRNYXJnaW4ocnRGaXQuaGVpZ2h0KTsKLSAgICB9IGVsc2UgewotICAgICAgcnRGaXQuaGVpZ2h0ID0gcnRJbWFnZS5oZWlnaHQ7Ci0gICAgfQotICAgIHNpemUgPSBydEZpdC5TaXplKCk7Ci0gIH0KLSAgcmV0dXJuIENhbGN1bGF0ZVdpZGdldEF1dG9TaXplKHNpemUpOwotfQotYm9vbCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlSW1hZ2VFZGl0QXV0b1NpemUoQ0ZYX1NpemVGJiBzaXplKSB7Ci0gIGlmICghR2V0SW1hZ2VFZGl0SW1hZ2UoKSkgewotICAgIExvYWRJbWFnZUVkaXRJbWFnZSgpOwotICB9Ci0gIHNpemUuY2xlYXIoKTsKLSAgaWYgKENGWF9ESUJpdG1hcCogcEJpdG1hcCA9IEdldEltYWdlRWRpdEltYWdlKCkpIHsKLSAgICBpbnQzMl90IGlJbWFnZVhEcGkgPSAwOwotICAgIGludDMyX3QgaUltYWdlWURwaSA9IDA7Ci0gICAgR2V0SW1hZ2VFZGl0RHBpKGlJbWFnZVhEcGksIGlJbWFnZVlEcGkpOwotICAgIENGWF9SZWN0RiBydEltYWdlKAotICAgICAgICAwLCAwLAotICAgICAgICBYRkFfVW5pdFB4MlB0KChGWF9GTE9BVClwQml0bWFwLT5HZXRXaWR0aCgpLCAoRlhfRkxPQVQpaUltYWdlWERwaSksCi0gICAgICAgIFhGQV9Vbml0UHgyUHQoKEZYX0ZMT0FUKXBCaXRtYXAtPkdldEhlaWdodCgpLCAoRlhfRkxPQVQpaUltYWdlWURwaSkpOwotCi0gICAgQ0ZYX1JlY3RGIHJ0Rml0OwotICAgIGlmIChHZXRXaWR0aChydEZpdC53aWR0aCkpIHsKLSAgICAgIEdldFdpZHRoV2l0aG91dE1hcmdpbihydEZpdC53aWR0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJ0Rml0LndpZHRoID0gcnRJbWFnZS53aWR0aDsKLSAgICB9Ci0gICAgaWYgKEdldEhlaWdodChydEZpdC5oZWlnaHQpKSB7Ci0gICAgICBHZXRIZWlnaHRXaXRob3V0TWFyZ2luKHJ0Rml0LmhlaWdodCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJ0Rml0LmhlaWdodCA9IHJ0SW1hZ2UuaGVpZ2h0OwotICAgIH0KLSAgICBzaXplLndpZHRoID0gcnRGaXQud2lkdGg7Ci0gICAgc2l6ZS5oZWlnaHQgPSBydEZpdC5oZWlnaHQ7Ci0gIH0KLSAgcmV0dXJuIENhbGN1bGF0ZUZpZWxkQXV0b1NpemUoc2l6ZSk7Ci19Ci1ib29sIENYRkFfV2lkZ2V0QWNjOjpMb2FkSW1hZ2VJbWFnZSgpIHsKLSAgSW5pdExheW91dERhdGEoKTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfSW1hZ2VMYXlvdXREYXRhKj4obV9wTGF5b3V0RGF0YS5nZXQoKSkKLSAgICAgIC0+TG9hZEltYWdlRGF0YSh0aGlzKTsKLX0KLWJvb2wgQ1hGQV9XaWRnZXRBY2M6OkxvYWRJbWFnZUVkaXRJbWFnZSgpIHsKLSAgSW5pdExheW91dERhdGEoKTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfSW1hZ2VFZGl0RGF0YSo+KG1fcExheW91dERhdGEuZ2V0KCkpCi0gICAgICAtPkxvYWRJbWFnZURhdGEodGhpcyk7Ci19Ci12b2lkIENYRkFfV2lkZ2V0QWNjOjpHZXRJbWFnZURwaShpbnQzMl90JiBpSW1hZ2VYRHBpLCBpbnQzMl90JiBpSW1hZ2VZRHBpKSB7Ci0gIENYRkFfSW1hZ2VMYXlvdXREYXRhKiBwRGF0YSA9Ci0gICAgICBzdGF0aWNfY2FzdDxDWEZBX0ltYWdlTGF5b3V0RGF0YSo+KG1fcExheW91dERhdGEuZ2V0KCkpOwotICBpSW1hZ2VYRHBpID0gcERhdGEtPm1faUltYWdlWERwaTsKLSAgaUltYWdlWURwaSA9IHBEYXRhLT5tX2lJbWFnZVlEcGk7Ci19Ci12b2lkIENYRkFfV2lkZ2V0QWNjOjpHZXRJbWFnZUVkaXREcGkoaW50MzJfdCYgaUltYWdlWERwaSwgaW50MzJfdCYgaUltYWdlWURwaSkgewotICBDWEZBX0ltYWdlRWRpdERhdGEqIHBEYXRhID0KLSAgICAgIHN0YXRpY19jYXN0PENYRkFfSW1hZ2VFZGl0RGF0YSo+KG1fcExheW91dERhdGEuZ2V0KCkpOwotICBpSW1hZ2VYRHBpID0gcERhdGEtPm1faUltYWdlWERwaTsKLSAgaUltYWdlWURwaSA9IHBEYXRhLT5tX2lJbWFnZVlEcGk7Ci19Ci1ib29sIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVUZXh0QXV0b1NpemUoQ0ZYX1NpemVGJiBzaXplKSB7Ci0gIExvYWRUZXh0KCk7Ci0gIENYRkFfVGV4dExheW91dCogcFRleHRMYXlvdXQgPQotICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9UZXh0TGF5b3V0RGF0YSo+KG1fcExheW91dERhdGEuZ2V0KCkpLT5HZXRUZXh0TGF5b3V0KCk7Ci0gIGlmIChwVGV4dExheW91dCkgewotICAgIHNpemUud2lkdGggPSBwVGV4dExheW91dC0+U3RhcnRMYXlvdXQoc2l6ZS53aWR0aCk7Ci0gICAgc2l6ZS5oZWlnaHQgPSBwVGV4dExheW91dC0+R2V0TGF5b3V0SGVpZ2h0KCk7Ci0gIH0KLSAgcmV0dXJuIENhbGN1bGF0ZVdpZGdldEF1dG9TaXplKHNpemUpOwotfQotdm9pZCBDWEZBX1dpZGdldEFjYzo6TG9hZFRleHQoKSB7Ci0gIEluaXRMYXlvdXREYXRhKCk7Ci0gIHN0YXRpY19jYXN0PENYRkFfVGV4dExheW91dERhdGEqPihtX3BMYXlvdXREYXRhLmdldCgpKS0+TG9hZFRleHQodGhpcyk7Ci19Ci1GWF9GTE9BVCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlV2lkZ2V0QXV0b1dpZHRoKEZYX0ZMT0FUIGZXaWR0aENhbGMpIHsKLSAgQ1hGQV9NYXJnaW4gbWdXaWRnZXQgPSBHZXRNYXJnaW4oKTsKLSAgaWYgKG1nV2lkZ2V0KSB7Ci0gICAgRlhfRkxPQVQgZkxlZnRJbnNldCwgZlJpZ2h0SW5zZXQ7Ci0gICAgbWdXaWRnZXQuR2V0TGVmdEluc2V0KGZMZWZ0SW5zZXQpOwotICAgIG1nV2lkZ2V0LkdldFJpZ2h0SW5zZXQoZlJpZ2h0SW5zZXQpOwotICAgIGZXaWR0aENhbGMgKz0gZkxlZnRJbnNldCArIGZSaWdodEluc2V0OwotICB9Ci0gIEZYX0ZMT0FUIGZNaW4gPSAwLCBmTWF4ID0gMDsKLSAgaWYgKEdldE1pbldpZHRoKGZNaW4pKSB7Ci0gICAgZldpZHRoQ2FsYyA9IHN0ZDo6bWF4KGZXaWR0aENhbGMsIGZNaW4pOwotICB9Ci0gIGlmIChHZXRNYXhXaWR0aChmTWF4KSAmJiBmTWF4ID4gMCkgewotICAgIGZXaWR0aENhbGMgPSBzdGQ6Om1pbihmV2lkdGhDYWxjLCBmTWF4KTsKLSAgfQotICByZXR1cm4gZldpZHRoQ2FsYzsKLX0KLUZYX0ZMT0FUIENYRkFfV2lkZ2V0QWNjOjpHZXRXaWR0aFdpdGhvdXRNYXJnaW4oRlhfRkxPQVQgZldpZHRoQ2FsYykgewotICBDWEZBX01hcmdpbiBtZ1dpZGdldCA9IEdldE1hcmdpbigpOwotICBpZiAobWdXaWRnZXQpIHsKLSAgICBGWF9GTE9BVCBmTGVmdEluc2V0LCBmUmlnaHRJbnNldDsKLSAgICBtZ1dpZGdldC5HZXRMZWZ0SW5zZXQoZkxlZnRJbnNldCk7Ci0gICAgbWdXaWRnZXQuR2V0UmlnaHRJbnNldChmUmlnaHRJbnNldCk7Ci0gICAgZldpZHRoQ2FsYyAtPSBmTGVmdEluc2V0ICsgZlJpZ2h0SW5zZXQ7Ci0gIH0KLSAgcmV0dXJuIGZXaWR0aENhbGM7Ci19Ci1GWF9GTE9BVCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlV2lkZ2V0QXV0b0hlaWdodChGWF9GTE9BVCBmSGVpZ2h0Q2FsYykgewotICBDWEZBX01hcmdpbiBtZ1dpZGdldCA9IEdldE1hcmdpbigpOwotICBpZiAobWdXaWRnZXQpIHsKLSAgICBGWF9GTE9BVCBmVG9wSW5zZXQsIGZCb3R0b21JbnNldDsKLSAgICBtZ1dpZGdldC5HZXRUb3BJbnNldChmVG9wSW5zZXQpOwotICAgIG1nV2lkZ2V0LkdldEJvdHRvbUluc2V0KGZCb3R0b21JbnNldCk7Ci0gICAgZkhlaWdodENhbGMgKz0gZlRvcEluc2V0ICsgZkJvdHRvbUluc2V0OwotICB9Ci0gIEZYX0ZMT0FUIGZNaW4gPSAwLCBmTWF4ID0gMDsKLSAgaWYgKEdldE1pbkhlaWdodChmTWluKSkgewotICAgIGZIZWlnaHRDYWxjID0gc3RkOjptYXgoZkhlaWdodENhbGMsIGZNaW4pOwotICB9Ci0gIGlmIChHZXRNYXhIZWlnaHQoZk1heCkgJiYgZk1heCA+IDApIHsKLSAgICBmSGVpZ2h0Q2FsYyA9IHN0ZDo6bWluKGZIZWlnaHRDYWxjLCBmTWF4KTsKLSAgfQotICByZXR1cm4gZkhlaWdodENhbGM7Ci19Ci1GWF9GTE9BVCBDWEZBX1dpZGdldEFjYzo6R2V0SGVpZ2h0V2l0aG91dE1hcmdpbihGWF9GTE9BVCBmSGVpZ2h0Q2FsYykgewotICBDWEZBX01hcmdpbiBtZ1dpZGdldCA9IEdldE1hcmdpbigpOwotICBpZiAobWdXaWRnZXQpIHsKLSAgICBGWF9GTE9BVCBmVG9wSW5zZXQsIGZCb3R0b21JbnNldDsKLSAgICBtZ1dpZGdldC5HZXRUb3BJbnNldChmVG9wSW5zZXQpOwotICAgIG1nV2lkZ2V0LkdldEJvdHRvbUluc2V0KGZCb3R0b21JbnNldCk7Ci0gICAgZkhlaWdodENhbGMgLT0gZlRvcEluc2V0ICsgZkJvdHRvbUluc2V0OwotICB9Ci0gIHJldHVybiBmSGVpZ2h0Q2FsYzsKLX0KLXZvaWQgQ1hGQV9XaWRnZXRBY2M6OlN0YXJ0V2lkZ2V0TGF5b3V0KEZYX0ZMT0FUJiBmQ2FsY1dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZDYWxjSGVpZ2h0KSB7Ci0gIEluaXRMYXlvdXREYXRhKCk7Ci0gIFhGQV9FbGVtZW50IGVVSVR5cGUgPSBHZXRVSVR5cGUoKTsKLSAgaWYgKGVVSVR5cGUgPT0gWEZBX0VsZW1lbnQ6OlRleHQpIHsKLSAgICBtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQgPSAtMTsKLSAgICBHZXRIZWlnaHQobV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0KTsKLSAgICBTdGFydFRleHRMYXlvdXQoZkNhbGNXaWR0aCwgZkNhbGNIZWlnaHQpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoZkNhbGNXaWR0aCA+IDAgJiYgZkNhbGNIZWlnaHQgPiAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCA9IC0xOwotICBGWF9GTE9BVCBmV2lkdGggPSAwOwotICBpZiAoZkNhbGNXaWR0aCA+IDAgJiYgZkNhbGNIZWlnaHQgPCAwKSB7Ci0gICAgaWYgKCFHZXRIZWlnaHQoZkNhbGNIZWlnaHQpKSB7Ci0gICAgICBDYWxjdWxhdGVBY2NXaWR0aEFuZEhlaWdodChlVUlUeXBlLCBmQ2FsY1dpZHRoLCBmQ2FsY0hlaWdodCk7Ci0gICAgfQotICAgIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCA9IGZDYWxjSGVpZ2h0OwotICAgIHJldHVybjsKLSAgfQotICBpZiAoZkNhbGNXaWR0aCA8IDAgJiYgZkNhbGNIZWlnaHQgPCAwKSB7Ci0gICAgaWYgKCFHZXRXaWR0aChmV2lkdGgpIHx8ICFHZXRIZWlnaHQoZkNhbGNIZWlnaHQpKSB7Ci0gICAgICBDYWxjdWxhdGVBY2NXaWR0aEFuZEhlaWdodChlVUlUeXBlLCBmV2lkdGgsIGZDYWxjSGVpZ2h0KTsKLSAgICB9Ci0gICAgZkNhbGNXaWR0aCA9IGZXaWR0aDsKLSAgfQotICBtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQgPSBmQ2FsY0hlaWdodDsKLX0KLXZvaWQgQ1hGQV9XaWRnZXRBY2M6OkNhbGN1bGF0ZUFjY1dpZHRoQW5kSGVpZ2h0KFhGQV9FbGVtZW50IGVVSVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQmIGZDYWxjSGVpZ2h0KSB7Ci0gIENGWF9TaXplRiBzeihmV2lkdGgsIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCk7Ci0gIHN3aXRjaCAoZVVJVHlwZSkgewotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJhcmNvZGU6Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6Q2hvaWNlTGlzdDoKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpTaWduYXR1cmU6Ci0gICAgICBDYWxjdWxhdGVGaWVsZEF1dG9TaXplKHN6KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkltYWdlRWRpdDoKLSAgICAgIENhbGN1bGF0ZUltYWdlRWRpdEF1dG9TaXplKHN6KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJ1dHRvbjoKLSAgICAgIENhbGN1bGF0ZVB1c2hCdXR0b25BdXRvU2l6ZShzeik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpDaGVja0J1dHRvbjoKLSAgICAgIENhbGN1bGF0ZUNoZWNrQnV0dG9uQXV0b1NpemUoc3opOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6RGF0ZVRpbWVFZGl0OgotICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok51bWVyaWNFZGl0OgotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBhc3N3b3JkRWRpdDoKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpUZXh0RWRpdDoKLSAgICAgIENhbGN1bGF0ZVRleHRFZGl0QXV0b1NpemUoc3opOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6SW1hZ2U6Ci0gICAgICBDYWxjdWxhdGVJbWFnZUF1dG9TaXplKHN6KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkFyYzoKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpMaW5lOgotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlJlY3RhbmdsZToKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpTdWJmb3JtOgotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkV4Y2xHcm91cDoKLSAgICAgIENhbGN1bGF0ZVdpZGdldEF1dG9TaXplKHN6KTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICBmV2lkdGggPSBzei53aWR0aDsKLSAgbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0ID0gc3ouaGVpZ2h0OwotICBmQ2FsY0hlaWdodCA9IHN6LmhlaWdodDsKLX0KLWJvb2wgQ1hGQV9XaWRnZXRBY2M6OkZpbmRTcGxpdFBvcyhpbnQzMl90IGlCbG9ja0luZGV4LCBGWF9GTE9BVCYgZkNhbGNIZWlnaHQpIHsKLSAgWEZBX0VsZW1lbnQgZVVJVHlwZSA9IEdldFVJVHlwZSgpOwotICBpZiAoZVVJVHlwZSA9PSBYRkFfRWxlbWVudDo6U3ViZm9ybSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoZVVJVHlwZSAhPSBYRkFfRWxlbWVudDo6VGV4dCAmJiBlVUlUeXBlICE9IFhGQV9FbGVtZW50OjpUZXh0RWRpdCAmJgotICAgICAgZVVJVHlwZSAhPSBYRkFfRWxlbWVudDo6TnVtZXJpY0VkaXQgJiYKLSAgICAgIGVVSVR5cGUgIT0gWEZBX0VsZW1lbnQ6OlBhc3N3b3JkRWRpdCkgewotICAgIGZDYWxjSGVpZ2h0ID0gMDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBGWF9GTE9BVCBmVG9wSW5zZXQgPSAwOwotICBGWF9GTE9BVCBmQm90dG9tSW5zZXQgPSAwOwotICBpZiAoaUJsb2NrSW5kZXggPT0gMCkgewotICAgIENYRkFfTWFyZ2luIG1nV2lkZ2V0ID0gR2V0TWFyZ2luKCk7Ci0gICAgaWYgKG1nV2lkZ2V0KSB7Ci0gICAgICBtZ1dpZGdldC5HZXRUb3BJbnNldChmVG9wSW5zZXQpOwotICAgICAgbWdXaWRnZXQuR2V0Qm90dG9tSW5zZXQoZkJvdHRvbUluc2V0KTsKLSAgICB9Ci0gICAgQ0ZYX1JlY3RGIHJ0VUlNYXJnaW4gPSBHZXRVSU1hcmdpbigpOwotICAgIGZUb3BJbnNldCArPSBydFVJTWFyZ2luLnRvcDsKLSAgICBmQm90dG9tSW5zZXQgKz0gcnRVSU1hcmdpbi53aWR0aDsKLSAgfQotICBpZiAoZVVJVHlwZSA9PSBYRkFfRWxlbWVudDo6VGV4dCkgewotICAgIEZYX0ZMT0FUIGZIZWlnaHQgPSBmQ2FsY0hlaWdodDsKLSAgICBpZiAoaUJsb2NrSW5kZXggPT0gMCkgewotICAgICAgZkNhbGNIZWlnaHQgPSBmQ2FsY0hlaWdodCAtIGZUb3BJbnNldDsKLSAgICAgIGlmIChmQ2FsY0hlaWdodCA8IDApIHsKLSAgICAgICAgZkNhbGNIZWlnaHQgPSAwOwotICAgICAgfQotICAgIH0KLSAgICBDWEZBX1RleHRMYXlvdXQqIHBUZXh0TGF5b3V0ID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9UZXh0TGF5b3V0RGF0YSo+KG1fcExheW91dERhdGEuZ2V0KCkpLT5HZXRUZXh0TGF5b3V0KCk7Ci0gICAgcFRleHRMYXlvdXQtPkRvTGF5b3V0KGlCbG9ja0luZGV4LCBmQ2FsY0hlaWdodCwgZkNhbGNIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCAtIGZUb3BJbnNldCk7Ci0gICAgaWYgKGZDYWxjSGVpZ2h0ICE9IDApIHsKLSAgICAgIGlmIChpQmxvY2tJbmRleCA9PSAwKSB7Ci0gICAgICAgIGZDYWxjSGVpZ2h0ID0gZkNhbGNIZWlnaHQgKyBmVG9wSW5zZXQ7Ci0gICAgICB9Ci0gICAgICBpZiAoZmFicyhmSGVpZ2h0IC0gZkNhbGNIZWlnaHQpIDwgWEZBX0ZMT0FUX1BFUkNJU0lPTikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIFhGQV9BVFRSSUJVVEVFTlVNIGlDYXBQbGFjZW1lbnQgPSBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duOwotICBGWF9GTE9BVCBmQ2FwUmVzZXJ2ZSA9IDA7Ci0gIGlmIChpQmxvY2tJbmRleCA9PSAwKSB7Ci0gICAgQ1hGQV9DYXB0aW9uIGNhcHRpb24gPSBHZXRDYXB0aW9uKCk7Ci0gICAgaWYgKGNhcHRpb24gJiYgY2FwdGlvbi5HZXRQcmVzZW5jZSgpICE9IFhGQV9BVFRSSUJVVEVFTlVNX0hpZGRlbikgewotICAgICAgaUNhcFBsYWNlbWVudCA9IChYRkFfQVRUUklCVVRFRU5VTSljYXB0aW9uLkdldFBsYWNlbWVudFR5cGUoKTsKLSAgICAgIGZDYXBSZXNlcnZlID0gY2FwdGlvbi5HZXRSZXNlcnZlKCk7Ci0gICAgfQotICAgIGlmIChpQ2FwUGxhY2VtZW50ID09IFhGQV9BVFRSSUJVVEVFTlVNX1RvcCAmJgotICAgICAgICBmQ2FsY0hlaWdodCA8IGZDYXBSZXNlcnZlICsgZlRvcEluc2V0KSB7Ci0gICAgICBmQ2FsY0hlaWdodCA9IDA7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tICYmCi0gICAgICAgIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCAtIGZDYXBSZXNlcnZlIC0gZkJvdHRvbUluc2V0KSB7Ci0gICAgICBmQ2FsY0hlaWdodCA9IDA7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGlDYXBQbGFjZW1lbnQgIT0gWEZBX0FUVFJJQlVURUVOVU1fVG9wKSB7Ci0gICAgICBmQ2FwUmVzZXJ2ZSA9IDA7Ci0gICAgfQotICB9Ci0gIENYRkFfRmllbGRMYXlvdXREYXRhKiBwRmllbGREYXRhID0KLSAgICAgIHN0YXRpY19jYXN0PENYRkFfRmllbGRMYXlvdXREYXRhKj4obV9wTGF5b3V0RGF0YS5nZXQoKSk7Ci0gIGludDMyX3QgaUxpbmVzQ291bnQgPSAwOwotICBGWF9GTE9BVCBmSGVpZ2h0ID0gbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0OwotICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7Ci0gIEdldFZhbHVlKHdzVGV4dCwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsKLSAgaWYgKHdzVGV4dC5Jc0VtcHR5KCkpIHsKLSAgICBpTGluZXNDb3VudCA9IDE7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKCFwRmllbGREYXRhLT5tX3BUZXh0T3V0KSB7Ci0gICAgICBGWF9GTE9BVCBmV2lkdGggPSAwOwotICAgICAgR2V0V2lkdGgoZldpZHRoKTsKLSAgICAgIENhbGN1bGF0ZUFjY1dpZHRoQW5kSGVpZ2h0KGVVSVR5cGUsIGZXaWR0aCwgZkhlaWdodCk7Ci0gICAgfQotICAgIGlMaW5lc0NvdW50ID0gcEZpZWxkRGF0YS0+bV9wVGV4dE91dC0+R2V0VG90YWxMaW5lcygpOwotICB9Ci0gIHN0ZDo6dmVjdG9yPEZYX0ZMT0FUPiogcEZpZWxkQXJyYXkgPSAmcEZpZWxkRGF0YS0+bV9GaWVsZFNwbGl0QXJyYXk7Ci0gIGludDMyX3QgaUZpZWxkU3BsaXRDb3VudCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4oKnBGaWVsZEFycmF5KTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUJsb2NrSW5kZXggKiAzOyBpICs9IDMpIHsKLSAgICBpTGluZXNDb3VudCAtPSAoaW50MzJfdCkoKnBGaWVsZEFycmF5KVtpICsgMV07Ci0gICAgZkhlaWdodCAtPSAoKnBGaWVsZEFycmF5KVtpICsgMl07Ci0gIH0KLSAgaWYgKGlMaW5lc0NvdW50ID09IDApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRlhfRkxPQVQgZkxpbmVIZWlnaHQgPSBHZXRMaW5lSGVpZ2h0KCk7Ci0gIEZYX0ZMT0FUIGZGb250U2l6ZSA9IEdldEZvbnRTaXplKCk7Ci0gIEZYX0ZMT0FUIGZUZXh0SGVpZ2h0ID0gaUxpbmVzQ291bnQgKiBmTGluZUhlaWdodCAtIGZMaW5lSGVpZ2h0ICsgZkZvbnRTaXplOwotICBGWF9GTE9BVCBmU3BhY2VBYm92ZSA9IDA7Ci0gIEZYX0ZMT0FUIGZTdGFydE9mZnNldCA9IDA7Ci0gIGlmIChmSGVpZ2h0ID4gMC4xZiAmJiBpQmxvY2tJbmRleCA9PSAwKSB7Ci0gICAgZlN0YXJ0T2Zmc2V0ID0gZlRvcEluc2V0OwotICAgIGZIZWlnaHQgLT0gKGZUb3BJbnNldCArIGZCb3R0b21JbnNldCk7Ci0gICAgaWYgKENYRkFfUGFyYSBwYXJhID0gR2V0UGFyYSgpKSB7Ci0gICAgICBmU3BhY2VBYm92ZSA9IHBhcmEuR2V0U3BhY2VBYm92ZSgpOwotICAgICAgRlhfRkxPQVQgZlNwYWNlQmVsb3cgPSBwYXJhLkdldFNwYWNlQmVsb3coKTsKLSAgICAgIGZIZWlnaHQgLT0gKGZTcGFjZUFib3ZlICsgZlNwYWNlQmVsb3cpOwotICAgICAgc3dpdGNoIChwYXJhLkdldFZlcnRpY2FsQWxpZ24oKSkgewotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcDoKLSAgICAgICAgICBmU3RhcnRPZmZzZXQgKz0gZlNwYWNlQWJvdmU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlOgotICAgICAgICAgIGZTdGFydE9mZnNldCArPSAoKGZIZWlnaHQgLSBmVGV4dEhlaWdodCkgLyAyICsgZlNwYWNlQWJvdmUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbToKLSAgICAgICAgICBmU3RhcnRPZmZzZXQgKz0gKGZIZWlnaHQgLSBmVGV4dEhlaWdodCArIGZTcGFjZUFib3ZlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGZTdGFydE9mZnNldCA8IDAuMWYpCi0gICAgICBmU3RhcnRPZmZzZXQgPSAwOwotICB9Ci0gIGZvciAoaW50MzJfdCBpID0gaUJsb2NrSW5kZXggLSAxOyBpQmxvY2tJbmRleCA+IDAgJiYgaSA8IGlCbG9ja0luZGV4OyBpKyspIHsKLSAgICBmU3RhcnRPZmZzZXQgPSAoKnBGaWVsZEFycmF5KVtpICogM10gLSAoKnBGaWVsZEFycmF5KVtpICogMyArIDJdOwotICAgIGlmIChmU3RhcnRPZmZzZXQgPCAwLjFmKQotICAgICAgZlN0YXJ0T2Zmc2V0ID0gMDsKLSAgfQotICBpZiAoaUZpZWxkU3BsaXRDb3VudCAvIDMgPT0gKGlCbG9ja0luZGV4ICsgMSkpIHsKLSAgICAoKnBGaWVsZEFycmF5KVswXSA9IGZTdGFydE9mZnNldDsKLSAgfSBlbHNlIHsKLSAgICBwRmllbGRBcnJheS0+cHVzaF9iYWNrKGZTdGFydE9mZnNldCk7Ci0gIH0KLSAgWEZBX1ZFUlNJT04gdmVyc2lvbiA9IEdldERvYygpLT5HZXRYRkFEb2MoKS0+R2V0Q3VyVmVyc2lvbk1vZGUoKTsKLSAgYm9vbCBiQ2FuU3BsaXROb0NvbnRlbnQgPSBmYWxzZTsKLSAgWEZBX0FUVFJJQlVURUVOVU0gZUxheW91dE1vZGU7Ci0gIEdldE5vZGUoKQotICAgICAgLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KQotICAgICAgLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0LCBlTGF5b3V0TW9kZSwgdHJ1ZSk7Ci0gIGlmICgoZUxheW91dE1vZGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fUG9zaXRpb24gfHwKLSAgICAgICBlTGF5b3V0TW9kZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9UYiB8fAotICAgICAgIGVMYXlvdXRNb2RlID09IFhGQV9BVFRSSUJVVEVFTlVNX1JvdyB8fAotICAgICAgIGVMYXlvdXRNb2RlID09IFhGQV9BVFRSSUJVVEVFTlVNX1RhYmxlKSAmJgotICAgICAgdmVyc2lvbiA+IFhGQV9WRVJTSU9OXzIwOCkgewotICAgIGJDYW5TcGxpdE5vQ29udGVudCA9IHRydWU7Ci0gIH0KLSAgaWYgKChlTGF5b3V0TW9kZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9UYiB8fAotICAgICAgIGVMYXlvdXRNb2RlID09IFhGQV9BVFRSSUJVVEVFTlVNX1JvdyB8fAotICAgICAgIGVMYXlvdXRNb2RlID09IFhGQV9BVFRSSUJVVEVFTlVNX1RhYmxlKSAmJgotICAgICAgdmVyc2lvbiA8PSBYRkFfVkVSU0lPTl8yMDgpIHsKLSAgICBpZiAoZlN0YXJ0T2Zmc2V0IDwgZkNhbGNIZWlnaHQpIHsKLSAgICAgIGJDYW5TcGxpdE5vQ29udGVudCA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZDYWxjSGVpZ2h0ID0gMDsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICBpZiAoYkNhblNwbGl0Tm9Db250ZW50KSB7Ci0gICAgaWYgKChmQ2FsY0hlaWdodCAtIGZUb3BJbnNldCAtIGZTcGFjZUFib3ZlIDwgZkxpbmVIZWlnaHQpKSB7Ci0gICAgICBmQ2FsY0hlaWdodCA9IDA7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGZTdGFydE9mZnNldCArIFhGQV9GTE9BVF9QRVJDSVNJT04gPj0gZkNhbGNIZWlnaHQpIHsKLSAgICAgIGlmIChpRmllbGRTcGxpdENvdW50IC8gMyA9PSAoaUJsb2NrSW5kZXggKyAxKSkgewotICAgICAgICAoKnBGaWVsZEFycmF5KVtpQmxvY2tJbmRleCAqIDMgKyAxXSA9IDA7Ci0gICAgICAgICgqcEZpZWxkQXJyYXkpW2lCbG9ja0luZGV4ICogMyArIDJdID0gZkNhbGNIZWlnaHQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwRmllbGRBcnJheS0+cHVzaF9iYWNrKDApOwotICAgICAgICBwRmllbGRBcnJheS0+cHVzaF9iYWNrKGZDYWxjSGVpZ2h0KTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGZDYWxjSGVpZ2h0IC0gZlN0YXJ0T2Zmc2V0IDwgZkxpbmVIZWlnaHQpIHsKLSAgICAgIGZDYWxjSGVpZ2h0ID0gZlN0YXJ0T2Zmc2V0OwotICAgICAgaWYgKGlGaWVsZFNwbGl0Q291bnQgLyAzID09IChpQmxvY2tJbmRleCArIDEpKSB7Ci0gICAgICAgICgqcEZpZWxkQXJyYXkpW2lCbG9ja0luZGV4ICogMyArIDFdID0gMDsKLSAgICAgICAgKCpwRmllbGRBcnJheSlbaUJsb2NrSW5kZXggKiAzICsgMl0gPSBmQ2FsY0hlaWdodDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBGaWVsZEFycmF5LT5wdXNoX2JhY2soMCk7Ci0gICAgICAgIHBGaWVsZEFycmF5LT5wdXNoX2JhY2soZkNhbGNIZWlnaHQpOwotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIEZYX0ZMT0FUIGZUZXh0TnVtID0KLSAgICAgICAgZkNhbGNIZWlnaHQgKyBYRkFfRkxPQVRfUEVSQ0lTSU9OIC0gZkNhcFJlc2VydmUgLSBmU3RhcnRPZmZzZXQ7Ci0gICAgaW50MzJfdCBpTGluZU51bSA9Ci0gICAgICAgIChpbnQzMl90KSgoZlRleHROdW0gKyAoZkxpbmVIZWlnaHQgLSBmRm9udFNpemUpKSAvIGZMaW5lSGVpZ2h0KTsKLSAgICBpZiAoaUxpbmVOdW0gPj0gaUxpbmVzQ291bnQpIHsKLSAgICAgIGlmIChmQ2FsY0hlaWdodCAtIGZTdGFydE9mZnNldCAtIGZUZXh0SGVpZ2h0ID49IGZGb250U2l6ZSkgewotICAgICAgICBpZiAoaUZpZWxkU3BsaXRDb3VudCAvIDMgPT0gKGlCbG9ja0luZGV4ICsgMSkpIHsKLSAgICAgICAgICAoKnBGaWVsZEFycmF5KVtpQmxvY2tJbmRleCAqIDMgKyAxXSA9IChGWF9GTE9BVClpTGluZXNDb3VudDsKLSAgICAgICAgICAoKnBGaWVsZEFycmF5KVtpQmxvY2tJbmRleCAqIDMgKyAyXSA9IGZDYWxjSGVpZ2h0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBGaWVsZEFycmF5LT5wdXNoX2JhY2soKEZYX0ZMT0FUKWlMaW5lc0NvdW50KTsKLSAgICAgICAgICBwRmllbGRBcnJheS0+cHVzaF9iYWNrKGZDYWxjSGVpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoZkhlaWdodCAtIGZTdGFydE9mZnNldCAtIGZUZXh0SGVpZ2h0IDwgZkZvbnRTaXplKSB7Ci0gICAgICAgIGlMaW5lTnVtIC09IDE7Ci0gICAgICAgIGlmIChpTGluZU51bSA9PSAwKSB7Ci0gICAgICAgICAgZkNhbGNIZWlnaHQgPSAwOwotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpTGluZU51bSA9IChpbnQzMl90KShmVGV4dE51bSAvIGZMaW5lSGVpZ2h0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGlMaW5lTnVtID4gMCkgewotICAgICAgRlhfRkxPQVQgZlNwbGl0SGVpZ2h0ID0KLSAgICAgICAgICBpTGluZU51bSAqIGZMaW5lSGVpZ2h0ICsgZkNhcFJlc2VydmUgKyBmU3RhcnRPZmZzZXQ7Ci0gICAgICBpZiAoaUZpZWxkU3BsaXRDb3VudCAvIDMgPT0gKGlCbG9ja0luZGV4ICsgMSkpIHsKLSAgICAgICAgKCpwRmllbGRBcnJheSlbaUJsb2NrSW5kZXggKiAzICsgMV0gPSAoRlhfRkxPQVQpaUxpbmVOdW07Ci0gICAgICAgICgqcEZpZWxkQXJyYXkpW2lCbG9ja0luZGV4ICogMyArIDJdID0gZlNwbGl0SGVpZ2h0OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcEZpZWxkQXJyYXktPnB1c2hfYmFjaygoRlhfRkxPQVQpaUxpbmVOdW0pOwotICAgICAgICBwRmllbGRBcnJheS0+cHVzaF9iYWNrKGZTcGxpdEhlaWdodCk7Ci0gICAgICB9Ci0gICAgICBpZiAoZmFicyhmU3BsaXRIZWlnaHQgLSBmQ2FsY0hlaWdodCkgPCBYRkFfRkxPQVRfUEVSQ0lTSU9OKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGZDYWxjSGVpZ2h0ID0gZlNwbGl0SGVpZ2h0OwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIGZDYWxjSGVpZ2h0ID0gMDsKLSAgcmV0dXJuIHRydWU7Ci19Ci12b2lkIENYRkFfV2lkZ2V0QWNjOjpJbml0TGF5b3V0RGF0YSgpIHsKLSAgaWYgKG1fcExheW91dERhdGEpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgc3dpdGNoIChHZXRVSVR5cGUoKSkgewotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRleHQ6Ci0gICAgICBtX3BMYXlvdXREYXRhID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfVGV4dExheW91dERhdGE+KCk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6VGV4dEVkaXQ6Ci0gICAgICBtX3BMYXlvdXREYXRhID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfVGV4dEVkaXREYXRhPigpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkltYWdlOgotICAgICAgbV9wTGF5b3V0RGF0YSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ltYWdlTGF5b3V0RGF0YT4oKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpJbWFnZUVkaXQ6Ci0gICAgICBtX3BMYXlvdXREYXRhID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfSW1hZ2VFZGl0RGF0YT4oKTsKLSAgICAgIHJldHVybjsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLSAgaWYgKEdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkZpZWxkKSB7Ci0gICAgbV9wTGF5b3V0RGF0YSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZpZWxkTGF5b3V0RGF0YT4oKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgbV9wTGF5b3V0RGF0YSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1dpZGdldExheW91dERhdGE+KCk7Ci19Ci0KLXZvaWQgQ1hGQV9XaWRnZXRBY2M6OlN0YXJ0VGV4dExheW91dChGWF9GTE9BVCYgZkNhbGNXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZkNhbGNIZWlnaHQpIHsKLSAgTG9hZFRleHQoKTsKLSAgQ1hGQV9UZXh0TGF5b3V0KiBwVGV4dExheW91dCA9Ci0gICAgICBzdGF0aWNfY2FzdDxDWEZBX1RleHRMYXlvdXREYXRhKj4obV9wTGF5b3V0RGF0YS5nZXQoKSktPkdldFRleHRMYXlvdXQoKTsKLSAgRlhfRkxPQVQgZlRleHRIZWlnaHQgPSAwOwotICBpZiAoZkNhbGNXaWR0aCA+IDAgJiYgZkNhbGNIZWlnaHQgPiAwKSB7Ci0gICAgRlhfRkxPQVQgZldpZHRoID0gR2V0V2lkdGhXaXRob3V0TWFyZ2luKGZDYWxjV2lkdGgpOwotICAgIHBUZXh0TGF5b3V0LT5TdGFydExheW91dChmV2lkdGgpOwotICAgIGZUZXh0SGVpZ2h0ID0gZkNhbGNIZWlnaHQ7Ci0gICAgZlRleHRIZWlnaHQgPSBHZXRIZWlnaHRXaXRob3V0TWFyZ2luKGZUZXh0SGVpZ2h0KTsKLSAgICBwVGV4dExheW91dC0+RG9MYXlvdXQoMCwgZlRleHRIZWlnaHQsIC0xLCBmVGV4dEhlaWdodCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChmQ2FsY1dpZHRoID4gMCAmJiBmQ2FsY0hlaWdodCA8IDApIHsKLSAgICBGWF9GTE9BVCBmV2lkdGggPSBHZXRXaWR0aFdpdGhvdXRNYXJnaW4oZkNhbGNXaWR0aCk7Ci0gICAgcFRleHRMYXlvdXQtPlN0YXJ0TGF5b3V0KGZXaWR0aCk7Ci0gIH0KLSAgaWYgKGZDYWxjV2lkdGggPCAwICYmIGZDYWxjSGVpZ2h0IDwgMCkgewotICAgIEZYX0ZMT0FUIGZNYXhXaWR0aCA9IC0xOwotICAgIGJvb2wgYlJldCA9IEdldFdpZHRoKGZNYXhXaWR0aCk7Ci0gICAgaWYgKGJSZXQpIHsKLSAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IEdldFdpZHRoV2l0aG91dE1hcmdpbihmTWF4V2lkdGgpOwotICAgICAgcFRleHRMYXlvdXQtPlN0YXJ0TGF5b3V0KGZXaWR0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEZYX0ZMT0FUIGZXaWR0aCA9IHBUZXh0TGF5b3V0LT5TdGFydExheW91dChmTWF4V2lkdGgpOwotICAgICAgZk1heFdpZHRoID0gQ2FsY3VsYXRlV2lkZ2V0QXV0b1dpZHRoKGZXaWR0aCk7Ci0gICAgICBmV2lkdGggPSBHZXRXaWR0aFdpdGhvdXRNYXJnaW4oZk1heFdpZHRoKTsKLSAgICAgIHBUZXh0TGF5b3V0LT5TdGFydExheW91dChmV2lkdGgpOwotICAgIH0KLSAgICBmQ2FsY1dpZHRoID0gZk1heFdpZHRoOwotICB9Ci0gIGlmIChtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQgPCAwKSB7Ci0gICAgbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0ID0gcFRleHRMYXlvdXQtPkdldExheW91dEhlaWdodCgpOwotICAgIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCA9Ci0gICAgICAgIENhbGN1bGF0ZVdpZGdldEF1dG9IZWlnaHQobV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0KTsKLSAgfQotICBmVGV4dEhlaWdodCA9IG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodDsKLSAgZlRleHRIZWlnaHQgPSBHZXRIZWlnaHRXaXRob3V0TWFyZ2luKGZUZXh0SGVpZ2h0KTsKLSAgcFRleHRMYXlvdXQtPkRvTGF5b3V0KDAsIGZUZXh0SGVpZ2h0LCAtMSwgZlRleHRIZWlnaHQpOwotICBmQ2FsY0hlaWdodCA9IG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodDsKLX0KLWJvb2wgQ1hGQV9XaWRnZXRBY2M6OkxvYWRDYXB0aW9uKCkgewotICBJbml0TGF5b3V0RGF0YSgpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GaWVsZExheW91dERhdGEqPihtX3BMYXlvdXREYXRhLmdldCgpKQotICAgICAgLT5Mb2FkQ2FwdGlvbih0aGlzKTsKLX0KLUNYRkFfVGV4dExheW91dCogQ1hGQV9XaWRnZXRBY2M6OkdldENhcHRpb25UZXh0TGF5b3V0KCkgewotICByZXR1cm4gbV9wTGF5b3V0RGF0YQotICAgICAgICAgICAgID8gc3RhdGljX2Nhc3Q8Q1hGQV9GaWVsZExheW91dERhdGEqPihtX3BMYXlvdXREYXRhLmdldCgpKQotICAgICAgICAgICAgICAgICAgIC0+bV9wQ2FwVGV4dExheW91dC5nZXQoKQotICAgICAgICAgICAgIDogbnVsbHB0cjsKLX0KLUNYRkFfVGV4dExheW91dCogQ1hGQV9XaWRnZXRBY2M6OkdldFRleHRMYXlvdXQoKSB7Ci0gIHJldHVybiBtX3BMYXlvdXREYXRhCi0gICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxDWEZBX1RleHRMYXlvdXREYXRhKj4obV9wTGF5b3V0RGF0YS5nZXQoKSkKLSAgICAgICAgICAgICAgICAgICAtPkdldFRleHRMYXlvdXQoKQotICAgICAgICAgICAgIDogbnVsbHB0cjsKLX0KLUNGWF9ESUJpdG1hcCogQ1hGQV9XaWRnZXRBY2M6OkdldEltYWdlSW1hZ2UoKSB7Ci0gIHJldHVybiBtX3BMYXlvdXREYXRhCi0gICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxDWEZBX0ltYWdlTGF5b3V0RGF0YSo+KG1fcExheW91dERhdGEuZ2V0KCkpCi0gICAgICAgICAgICAgICAgICAgLT5tX3BESUJpdG1hcAotICAgICAgICAgICAgIDogbnVsbHB0cjsKLX0KLUNGWF9ESUJpdG1hcCogQ1hGQV9XaWRnZXRBY2M6OkdldEltYWdlRWRpdEltYWdlKCkgewotICByZXR1cm4gbV9wTGF5b3V0RGF0YQotICAgICAgICAgICAgID8gc3RhdGljX2Nhc3Q8Q1hGQV9JbWFnZUVkaXREYXRhKj4obV9wTGF5b3V0RGF0YS5nZXQoKSkKLSAgICAgICAgICAgICAgICAgICAtPm1fcERJQml0bWFwCi0gICAgICAgICAgICAgOiBudWxscHRyOwotfQotCi12b2lkIENYRkFfV2lkZ2V0QWNjOjpTZXRJbWFnZUltYWdlKENGWF9ESUJpdG1hcCogbmV3SW1hZ2UpIHsKLSAgQ1hGQV9JbWFnZUxheW91dERhdGEqIHBEYXRhID0KLSAgICAgIHN0YXRpY19jYXN0PENYRkFfSW1hZ2VMYXlvdXREYXRhKj4obV9wTGF5b3V0RGF0YS5nZXQoKSk7Ci0gIGlmIChwRGF0YS0+bV9wRElCaXRtYXAgPT0gbmV3SW1hZ2UpCi0gICAgcmV0dXJuOwotCi0gIGlmIChwRGF0YS0+bV9wRElCaXRtYXAgJiYgIXBEYXRhLT5tX2JOYW1lZEltYWdlKQotICAgIGRlbGV0ZSBwRGF0YS0+bV9wRElCaXRtYXA7Ci0KLSAgcERhdGEtPm1fcERJQml0bWFwID0gbmV3SW1hZ2U7Ci19Ci0KLXZvaWQgQ1hGQV9XaWRnZXRBY2M6OlNldEltYWdlRWRpdEltYWdlKENGWF9ESUJpdG1hcCogbmV3SW1hZ2UpIHsKLSAgQ1hGQV9JbWFnZUVkaXREYXRhKiBwRGF0YSA9Ci0gICAgICBzdGF0aWNfY2FzdDxDWEZBX0ltYWdlRWRpdERhdGEqPihtX3BMYXlvdXREYXRhLmdldCgpKTsKLSAgaWYgKHBEYXRhLT5tX3BESUJpdG1hcCA9PSBuZXdJbWFnZSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHBEYXRhLT5tX3BESUJpdG1hcCAmJiAhcERhdGEtPm1fYk5hbWVkSW1hZ2UpCi0gICAgZGVsZXRlIHBEYXRhLT5tX3BESUJpdG1hcDsKLQotICBwRGF0YS0+bV9wRElCaXRtYXAgPSBuZXdJbWFnZTsKLX0KLQotQ1hGQV9XaWRnZXRMYXlvdXREYXRhKiBDWEZBX1dpZGdldEFjYzo6R2V0V2lkZ2V0TGF5b3V0RGF0YSgpIHsKLSAgcmV0dXJuIG1fcExheW91dERhdGEuZ2V0KCk7Ci19Ci0KLUNGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBDWEZBX1dpZGdldEFjYzo6R2V0RkRFRm9udCgpIHsKLSAgQ0ZYX1dpZGVTdHJpbmdDIHdzRm9udE5hbWUgPSBMIkNvdXJpZXIiOwotICB1aW50MzJfdCBkd0ZvbnRTdHlsZSA9IDA7Ci0gIGlmIChDWEZBX0ZvbnQgZm9udCA9IEdldEZvbnQoKSkgewotICAgIGlmIChmb250LklzQm9sZCgpKQotICAgICAgZHdGb250U3R5bGUgfD0gRlhfRk9OVFNUWUxFX0JvbGQ7Ci0gICAgaWYgKGZvbnQuSXNJdGFsaWMoKSkKLSAgICAgIGR3Rm9udFN0eWxlIHw9IEZYX0ZPTlRTVFlMRV9JdGFsaWM7Ci0gICAgZm9udC5HZXRUeXBlZmFjZSh3c0ZvbnROYW1lKTsKLSAgfQotCi0gIGF1dG8gcERvYyA9IEdldERvYygpOwotICByZXR1cm4gcERvYy0+R2V0QXBwKCktPkdldFhGQUZvbnRNZ3IoKS0+R2V0Rm9udChwRG9jLCB3c0ZvbnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ZvbnRTdHlsZSk7Ci19Ci1GWF9GTE9BVCBDWEZBX1dpZGdldEFjYzo6R2V0Rm9udFNpemUoKSB7Ci0gIEZYX0ZMT0FUIGZGb250U2l6ZSA9IDEwLjBmOwotICBpZiAoQ1hGQV9Gb250IGZvbnQgPSBHZXRGb250KCkpIHsKLSAgICBmRm9udFNpemUgPSBmb250LkdldEZvbnRTaXplKCk7Ci0gIH0KLSAgcmV0dXJuIGZGb250U2l6ZSA8IDAuMWYgPyAxMC4wZiA6IGZGb250U2l6ZTsKLX0KLUZYX0ZMT0FUIENYRkFfV2lkZ2V0QWNjOjpHZXRMaW5lSGVpZ2h0KCkgewotICBGWF9GTE9BVCBmTGluZUhlaWdodCA9IDA7Ci0gIGlmIChDWEZBX1BhcmEgcGFyYSA9IEdldFBhcmEoKSkgewotICAgIGZMaW5lSGVpZ2h0ID0gcGFyYS5HZXRMaW5lSGVpZ2h0KCk7Ci0gIH0KLSAgaWYgKGZMaW5lSGVpZ2h0IDwgMSkgewotICAgIGZMaW5lSGVpZ2h0ID0gR2V0Rm9udFNpemUoKSAqIDEuMmY7Ci0gIH0KLSAgcmV0dXJuIGZMaW5lSGVpZ2h0OwotfQotRlhfQVJHQiBDWEZBX1dpZGdldEFjYzo6R2V0VGV4dENvbG9yKCkgewotICBpZiAoQ1hGQV9Gb250IGZvbnQgPSBHZXRGb250KCkpIHsKLSAgICByZXR1cm4gZm9udC5HZXRDb2xvcigpOwotICB9Ci0gIHJldHVybiAweEZGMDAwMDAwOwotfQotQ1hGQV9Ob2RlKiBDWEZBX1RleHRQcm92aWRlcjo6R2V0VGV4dE5vZGUoYm9vbCYgYlJpY2hUZXh0KSB7Ci0gIGJSaWNoVGV4dCA9IGZhbHNlOwotICBpZiAobV9wVGV4dE5vZGUpIHsKLSAgICBpZiAobV9wVGV4dE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkV4RGF0YSkgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZTsKLSAgICAgIG1fcFRleHROb2RlLT5HZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgICAgaWYgKHdzQ29udGVudFR5cGUgPT0gTCJ0ZXh0L2h0bWwiKSB7Ci0gICAgICAgIGJSaWNoVGV4dCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtX3BUZXh0Tm9kZTsKLSAgfQotICBpZiAobV9lVHlwZSA9PSBYRkFfVEVYVFBST1ZJREVSVFlQRV9UZXh0KSB7Ci0gICAgQ1hGQV9Ob2RlKiBwRWxlbWVudE5vZGUgPSBtX3BXaWRnZXRBY2MtPkdldE5vZGUoKTsKLSAgICBDWEZBX05vZGUqIHBWYWx1ZU5vZGUgPSBwRWxlbWVudE5vZGUtPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpWYWx1ZSk7Ci0gICAgaWYgKCFwVmFsdWVOb2RlKSB7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcFZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgIGlmIChwQ2hpbGROb2RlICYmIHBDaGlsZE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkV4RGF0YSkgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZTsKLSAgICAgIHBDaGlsZE5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlLCBmYWxzZSk7Ci0gICAgICBpZiAod3NDb250ZW50VHlwZSA9PSBMInRleHQvaHRtbCIpIHsKLSAgICAgICAgYlJpY2hUZXh0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHBDaGlsZE5vZGU7Ci0gIH0gZWxzZSBpZiAobV9lVHlwZSA9PSBYRkFfVEVYVFBST1ZJREVSVFlQRV9EYXRhc2V0cykgewotICAgIENYRkFfTm9kZSogcEJpbmQgPSBtX3BXaWRnZXRBY2MtPkdldERhdGFzZXRzKCk7Ci0gICAgQ0ZERV9YTUxOb2RlKiBwWE1MTm9kZSA9IHBCaW5kLT5HZXRYTUxNYXBwaW5nTm9kZSgpOwotICAgIEFTU0VSVChwWE1MTm9kZSk7Ci0gICAgZm9yIChDRkRFX1hNTE5vZGUqIHBYTUxDaGlsZCA9Ci0gICAgICAgICAgICAgcFhNTE5vZGUtPkdldE5vZGVJdGVtKENGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7Ci0gICAgICAgICBwWE1MQ2hpbGQ7Ci0gICAgICAgICBwWE1MQ2hpbGQgPSBwWE1MQ2hpbGQtPkdldE5vZGVJdGVtKENGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7Ci0gICAgICBpZiAocFhNTENoaWxkLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgewotICAgICAgICBDRkRFX1hNTEVsZW1lbnQqIHBFbGVtZW50ID0gc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4ocFhNTENoaWxkKTsKLSAgICAgICAgaWYgKFhGQV9SZWNvZ25pemVSaWNoVGV4dChwRWxlbWVudCkpIHsKLSAgICAgICAgICBiUmljaFRleHQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBwQmluZDsKLSAgfSBlbHNlIGlmIChtX2VUeXBlID09IFhGQV9URVhUUFJPVklERVJUWVBFX0NhcHRpb24pIHsKLSAgICBDWEZBX05vZGUqIHBDYXB0aW9uTm9kZSA9Ci0gICAgICAgIG1fcFdpZGdldEFjYy0+R2V0Tm9kZSgpLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6Q2FwdGlvbik7Ci0gICAgaWYgKCFwQ2FwdGlvbk5vZGUpIHsKLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICBDWEZBX05vZGUqIHBWYWx1ZU5vZGUgPSBwQ2FwdGlvbk5vZGUtPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpWYWx1ZSk7Ci0gICAgaWYgKCFwVmFsdWVOb2RlKSB7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcFZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgIGlmIChwQ2hpbGROb2RlICYmIHBDaGlsZE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkV4RGF0YSkgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZTsKLSAgICAgIHBDaGlsZE5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlLCBmYWxzZSk7Ci0gICAgICBpZiAod3NDb250ZW50VHlwZSA9PSBMInRleHQvaHRtbCIpIHsKLSAgICAgICAgYlJpY2hUZXh0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHBDaGlsZE5vZGU7Ci0gIH0KLSAgQ1hGQV9Ob2RlKiBwSXRlbU5vZGUgPQotICAgICAgbV9wV2lkZ2V0QWNjLT5HZXROb2RlKCktPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpJdGVtcyk7Ci0gIGlmICghcEl0ZW1Ob2RlKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBJdGVtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICB3aGlsZSAocE5vZGUpIHsKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd3NOYW1lOwotICAgIHBOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7Ci0gICAgaWYgKG1fZVR5cGUgPT0gWEZBX1RFWFRQUk9WSURFUlRZUEVfUm9sbG92ZXIgJiYgd3NOYW1lID09IEwicm9sbG92ZXIiKSB7Ci0gICAgICByZXR1cm4gcE5vZGU7Ci0gICAgfQotICAgIGlmIChtX2VUeXBlID09IFhGQV9URVhUUFJPVklERVJUWVBFX0Rvd24gJiYgd3NOYW1lID09IEwiZG93biIpIHsKLSAgICAgIHJldHVybiBwTm9kZTsKLSAgICB9Ci0gICAgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsKLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLUNYRkFfUGFyYSBDWEZBX1RleHRQcm92aWRlcjo6R2V0UGFyYU5vZGUoKSB7Ci0gIGlmIChtX2VUeXBlID09IFhGQV9URVhUUFJPVklERVJUWVBFX1RleHQpIHsKLSAgICByZXR1cm4gbV9wV2lkZ2V0QWNjLT5HZXRQYXJhKCk7Ci0gIH0KLSAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcFdpZGdldEFjYy0+R2V0Tm9kZSgpLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6Q2FwdGlvbik7Ci0gIHJldHVybiBDWEZBX1BhcmEocE5vZGUtPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpQYXJhKSk7Ci19Ci1DWEZBX0ZvbnQgQ1hGQV9UZXh0UHJvdmlkZXI6OkdldEZvbnROb2RlKCkgewotICBpZiAobV9lVHlwZSA9PSBYRkFfVEVYVFBST1ZJREVSVFlQRV9UZXh0KSB7Ci0gICAgcmV0dXJuIG1fcFdpZGdldEFjYy0+R2V0Rm9udCgpOwotICB9Ci0gIENYRkFfTm9kZSogcE5vZGUgPSBtX3BXaWRnZXRBY2MtPkdldE5vZGUoKS0+R2V0Q2hpbGQoMCwgWEZBX0VsZW1lbnQ6OkNhcHRpb24pOwotICBwTm9kZSA9IHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6Rm9udCk7Ci0gIGlmIChwTm9kZSkgewotICAgIHJldHVybiBDWEZBX0ZvbnQocE5vZGUpOwotICB9Ci0gIHJldHVybiBtX3BXaWRnZXRBY2MtPkdldEZvbnQoKTsKLX0KLWJvb2wgQ1hGQV9UZXh0UHJvdmlkZXI6OklzQ2hlY2tCdXR0b25BbmRBdXRvV2lkdGgoKSB7Ci0gIFhGQV9FbGVtZW50IGVUeXBlID0gbV9wV2lkZ2V0QWNjLT5HZXRVSVR5cGUoKTsKLSAgaWYgKGVUeXBlID09IFhGQV9FbGVtZW50OjpDaGVja0J1dHRvbikgewotICAgIEZYX0ZMT0FUIGZXaWR0aCA9IDA7Ci0gICAgcmV0dXJuICFtX3BXaWRnZXRBY2MtPkdldFdpZHRoKGZXaWR0aCk7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotYm9vbCBDWEZBX1RleHRQcm92aWRlcjo6R2V0RW1iYmVkT2JqKGJvb2wgYlVSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSYXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSkgewotICBpZiAobV9lVHlwZSAhPSBYRkFfVEVYVFBST1ZJREVSVFlQRV9UZXh0KSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChiVVJJKSB7Ci0gICAgQ1hGQV9Ob2RlKiBwV2lkZ2V0Tm9kZSA9IG1fcFdpZGdldEFjYy0+R2V0Tm9kZSgpOwotICAgIENYRkFfTm9kZSogcFBhcmVudCA9IHBXaWRnZXROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsKLSAgICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwV2lkZ2V0Tm9kZS0+R2V0RG9jdW1lbnQoKTsKLSAgICBDWEZBX05vZGUqIHBJRE5vZGUgPSBudWxscHRyOwotICAgIENYRkFfV2lkZ2V0QWNjKiBwRW1iQWNjID0gbnVsbHB0cjsKLSAgICBpZiAocFBhcmVudCkgewotICAgICAgcElETm9kZSA9IHBEb2N1bWVudC0+R2V0Tm9kZUJ5SUQocFBhcmVudCwgd3NBdHRyLkFzU3RyaW5nQygpKTsKLSAgICB9Ci0gICAgaWYgKCFwSUROb2RlKSB7Ci0gICAgICBwSUROb2RlID0gcERvY3VtZW50LT5HZXROb2RlQnlJRCgKLSAgICAgICAgICBUb05vZGUocERvY3VtZW50LT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0Zvcm0pKSwKLSAgICAgICAgICB3c0F0dHIuQXNTdHJpbmdDKCkpOwotICAgIH0KLSAgICBpZiAocElETm9kZSkgewotICAgICAgcEVtYkFjYyA9IHN0YXRpY19jYXN0PENYRkFfV2lkZ2V0QWNjKj4ocElETm9kZS0+R2V0V2lkZ2V0RGF0YSgpKTsKLSAgICB9Ci0gICAgaWYgKHBFbWJBY2MpIHsKLSAgICAgIHBFbWJBY2MtPkdldFZhbHVlKHdzVmFsdWUsIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL3hmYV9mZndpZGdldGFjYy5oIGIveGZhL2Z4ZmEvYXBwL3hmYV9mZndpZGdldGFjYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGFhMzVlLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfZmZ3aWRnZXRhY2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhGQV9BUFBfWEZBX0ZGV0lER0VUQUNDX0hfCi0jZGVmaW5lIFhGQV9GWEZBX0FQUF9YRkFfRkZXSURHRVRBQ0NfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL2N4ZmFfdGV4dGxheW91dC5oIgotI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmFfd2lkZ2V0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9udC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhcmEuaCIKLQotY2xhc3MgQ1hGQV9GRkRvYzsKLWNsYXNzIENYRkFfTm9kZTsKLQotZW51bSBYRkFfVEVYVFBST1ZJREVSVFlQRSB7Ci0gIFhGQV9URVhUUFJPVklERVJUWVBFX1RleHQsCi0gIFhGQV9URVhUUFJPVklERVJUWVBFX0RhdGFzZXRzLAotICBYRkFfVEVYVFBST1ZJREVSVFlQRV9DYXB0aW9uLAotICBYRkFfVEVYVFBST1ZJREVSVFlQRV9Sb2xsb3ZlciwKLSAgWEZBX1RFWFRQUk9WSURFUlRZUEVfRG93biwKLX07Ci0KLWNsYXNzIENYRkFfVGV4dFByb3ZpZGVyIHsKLSBwdWJsaWM6Ci0gIENYRkFfVGV4dFByb3ZpZGVyKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjLAotICAgICAgICAgICAgICAgICAgICBYRkFfVEVYVFBST1ZJREVSVFlQRSBlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGV4dE5vZGUgPSBudWxscHRyKQotICAgICAgOiBtX3BXaWRnZXRBY2MocFdpZGdldEFjYyksIG1fZVR5cGUoZVR5cGUpLCBtX3BUZXh0Tm9kZShwVGV4dE5vZGUpIHsKLSAgICBBU1NFUlQobV9wV2lkZ2V0QWNjKTsKLSAgfQotICB+Q1hGQV9UZXh0UHJvdmlkZXIoKSB7fQotCi0gIENYRkFfTm9kZSogR2V0VGV4dE5vZGUoYm9vbCYgYlJpY2hUZXh0KTsKLSAgQ1hGQV9QYXJhIEdldFBhcmFOb2RlKCk7Ci0gIENYRkFfRm9udCBHZXRGb250Tm9kZSgpOwotICBib29sIElzQ2hlY2tCdXR0b25BbmRBdXRvV2lkdGgoKTsKLSAgQ1hGQV9GRkRvYyogR2V0RG9jTm9kZSgpIHsgcmV0dXJuIG1fcFdpZGdldEFjYy0+R2V0RG9jKCk7IH0KLSAgYm9vbCBHZXRFbWJiZWRPYmooYm9vbCBiVVJJLAotICAgICAgICAgICAgICAgICAgICBib29sIGJSYXcsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0F0dHIsCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKTsKLQotIHByb3RlY3RlZDoKLSAgQ1hGQV9XaWRnZXRBY2MqIG1fcFdpZGdldEFjYzsKLSAgWEZBX1RFWFRQUk9WSURFUlRZUEUgbV9lVHlwZTsKLSAgQ1hGQV9Ob2RlKiBtX3BUZXh0Tm9kZTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYRkFfQVBQX1hGQV9GRldJREdFVEFDQ19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL3hmYV9mZndpZGdldGhhbmRsZXIuY3BwIGIveGZhL2Z4ZmEvYXBwL3hmYV9mZndpZGdldGhhbmRsZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmRkZmI2Li4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfZmZ3aWRnZXRoYW5kbGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUzMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZ3aWRnZXRoYW5kbGVyLmgiCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmY2hvaWNlbGlzdC5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZmaWVsZC5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZndsYWRhcHRlci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dHByb2Nlc3Nvci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21lYXN1cmVtZW50LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2ZmZG9jdmlldy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZndpZGdldC5oIgotCi1DWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q1hGQV9GRldpZGdldEhhbmRsZXIoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3KQotICAgIDogbV9wRG9jVmlldyhwRG9jVmlldykge30KLQotQ1hGQV9GRldpZGdldEhhbmRsZXI6On5DWEZBX0ZGV2lkZ2V0SGFuZGxlcigpIHt9Ci0KLWJvb2wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uTW91c2VFbnRlcihDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0KSB7Ci0gIG1fcERvY1ZpZXctPkxvY2tVcGRhdGUoKTsKLSAgYm9vbCBiUmV0ID0gaFdpZGdldC0+T25Nb3VzZUVudGVyKCk7Ci0gIG1fcERvY1ZpZXctPlVubG9ja1VwZGF0ZSgpOwotICBtX3BEb2NWaWV3LT5VcGRhdGVEb2NWaWV3KCk7Ci0gIHJldHVybiBiUmV0OwotfQotCi1ib29sIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpPbk1vdXNlRXhpdChDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0KSB7Ci0gIG1fcERvY1ZpZXctPkxvY2tVcGRhdGUoKTsKLSAgYm9vbCBiUmV0ID0gaFdpZGdldC0+T25Nb3VzZUV4aXQoKTsKLSAgbV9wRG9jVmlldy0+VW5sb2NrVXBkYXRlKCk7Ci0gIG1fcERvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsKLSAgcmV0dXJuIGJSZXQ7Ci19Ci0KLWJvb2wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uTEJ1dHRvbkRvd24oQ1hGQV9GRldpZGdldCogaFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgbV9wRG9jVmlldy0+TG9ja1VwZGF0ZSgpOwotICBib29sIGJSZXQgPSBoV2lkZ2V0LT5PbkxCdXR0b25Eb3duKGR3RmxhZ3MsIGhXaWRnZXQtPlJvdGF0ZTJOb3JtYWwocG9pbnQpKTsKLSAgaWYgKGJSZXQgJiYgbV9wRG9jVmlldy0+U2V0Rm9jdXMoaFdpZGdldCkpIHsKLSAgICBtX3BEb2NWaWV3LT5HZXREb2MoKS0+R2V0RG9jRW52aXJvbm1lbnQoKS0+U2V0Rm9jdXNXaWRnZXQoCi0gICAgICAgIG1fcERvY1ZpZXctPkdldERvYygpLCBoV2lkZ2V0KTsKLSAgfQotICBtX3BEb2NWaWV3LT5VbmxvY2tVcGRhdGUoKTsKLSAgbV9wRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOwotICByZXR1cm4gYlJldDsKLX0KLQotYm9vbCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25MQnV0dG9uVXAoQ1hGQV9GRldpZGdldCogaFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewotICBtX3BEb2NWaWV3LT5Mb2NrVXBkYXRlKCk7Ci0gIG1fcERvY1ZpZXctPm1fYkxheW91dEV2ZW50ID0gdHJ1ZTsKLSAgYm9vbCBiUmV0ID0gaFdpZGdldC0+T25MQnV0dG9uVXAoZHdGbGFncywgaFdpZGdldC0+Um90YXRlMk5vcm1hbChwb2ludCkpOwotICBtX3BEb2NWaWV3LT5VbmxvY2tVcGRhdGUoKTsKLSAgbV9wRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOwotICByZXR1cm4gYlJldDsKLX0KLQotYm9vbCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25MQnV0dG9uRGJsQ2xrKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewotICBib29sIGJSZXQgPSBoV2lkZ2V0LT5PbkxCdXR0b25EYmxDbGsoZHdGbGFncywgaFdpZGdldC0+Um90YXRlMk5vcm1hbChwb2ludCkpOwotICBtX3BEb2NWaWV3LT5SdW5JbnZhbGlkYXRlKCk7Ci0gIHJldHVybiBiUmV0OwotfQotCi1ib29sIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpPbk1vdXNlTW92ZShDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIGJvb2wgYlJldCA9IGhXaWRnZXQtPk9uTW91c2VNb3ZlKGR3RmxhZ3MsIGhXaWRnZXQtPlJvdGF0ZTJOb3JtYWwocG9pbnQpKTsKLSAgbV9wRG9jVmlldy0+UnVuSW52YWxpZGF0ZSgpOwotICByZXR1cm4gYlJldDsKLX0KLQotYm9vbCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25Nb3VzZVdoZWVsKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHpEZWx0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewotICBib29sIGJSZXQgPQotICAgICAgaFdpZGdldC0+T25Nb3VzZVdoZWVsKGR3RmxhZ3MsIHpEZWx0YSwgaFdpZGdldC0+Um90YXRlMk5vcm1hbChwb2ludCkpOwotICBtX3BEb2NWaWV3LT5SdW5JbnZhbGlkYXRlKCk7Ci0gIHJldHVybiBiUmV0OwotfQotCi1ib29sIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpPblJCdXR0b25Eb3duKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIGJvb2wgYlJldCA9IGhXaWRnZXQtPk9uUkJ1dHRvbkRvd24oZHdGbGFncywgaFdpZGdldC0+Um90YXRlMk5vcm1hbChwb2ludCkpOwotICBpZiAoYlJldCAmJiBtX3BEb2NWaWV3LT5TZXRGb2N1cyhoV2lkZ2V0KSkgewotICAgIG1fcERvY1ZpZXctPkdldERvYygpLT5HZXREb2NFbnZpcm9ubWVudCgpLT5TZXRGb2N1c1dpZGdldCgKLSAgICAgICAgbV9wRG9jVmlldy0+R2V0RG9jKCksIGhXaWRnZXQpOwotICB9Ci0gIG1fcERvY1ZpZXctPlJ1bkludmFsaWRhdGUoKTsKLSAgcmV0dXJuIGJSZXQ7Ci19Ci0KLWJvb2wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uUkJ1dHRvblVwKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKLSAgYm9vbCBiUmV0ID0gaFdpZGdldC0+T25SQnV0dG9uVXAoZHdGbGFncywgaFdpZGdldC0+Um90YXRlMk5vcm1hbChwb2ludCkpOwotICBtX3BEb2NWaWV3LT5SdW5JbnZhbGlkYXRlKCk7Ci0gIHJldHVybiBiUmV0OwotfQotCi1ib29sIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpPblJCdXR0b25EYmxDbGsoQ1hGQV9GRldpZGdldCogaFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIGJvb2wgYlJldCA9IGhXaWRnZXQtPk9uUkJ1dHRvbkRibENsayhkd0ZsYWdzLCBoV2lkZ2V0LT5Sb3RhdGUyTm9ybWFsKHBvaW50KSk7Ci0gIG1fcERvY1ZpZXctPlJ1bkludmFsaWRhdGUoKTsKLSAgcmV0dXJuIGJSZXQ7Ci19Ci0KLWJvb2wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uS2V5RG93bihDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3S2V5Q29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzKSB7Ci0gIGJvb2wgYlJldCA9IGhXaWRnZXQtPk9uS2V5RG93bihkd0tleUNvZGUsIGR3RmxhZ3MpOwotICBtX3BEb2NWaWV3LT5SdW5JbnZhbGlkYXRlKCk7Ci0gIG1fcERvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsKLSAgcmV0dXJuIGJSZXQ7Ci19Ci0KLWJvb2wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uS2V5VXAoQ1hGQV9GRldpZGdldCogaFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdLZXlDb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzKSB7Ci0gIGJvb2wgYlJldCA9IGhXaWRnZXQtPk9uS2V5VXAoZHdLZXlDb2RlLCBkd0ZsYWdzKTsKLSAgbV9wRG9jVmlldy0+UnVuSW52YWxpZGF0ZSgpOwotICByZXR1cm4gYlJldDsKLX0KLQotYm9vbCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25DaGFyKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdDaGFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZ3MpIHsKLSAgYm9vbCBiUmV0ID0gaFdpZGdldC0+T25DaGFyKGR3Q2hhciwgZHdGbGFncyk7Ci0gIG1fcERvY1ZpZXctPlJ1bkludmFsaWRhdGUoKTsKLSAgcmV0dXJuIGJSZXQ7Ci19Ci0KLUZXTF9XaWRnZXRIaXQgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uSGl0VGVzdChDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIGlmICghKGhXaWRnZXQtPkdldFN0YXR1cygpICYgWEZBX1dpZGdldFN0YXR1c19WaXNpYmxlKSkKLSAgICByZXR1cm4gRldMX1dpZGdldEhpdDo6VW5rbm93bjsKLSAgcmV0dXJuIGhXaWRnZXQtPk9uSGl0VGVzdChoV2lkZ2V0LT5Sb3RhdGUyTm9ybWFsKHBvaW50KSk7Ci19Ci0KLWJvb2wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uU2V0Q3Vyc29yKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewotICByZXR1cm4gaFdpZGdldC0+T25TZXRDdXJzb3IoaFdpZGdldC0+Um90YXRlMk5vcm1hbChwb2ludCkpOwotfQotCi12b2lkIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpSZW5kZXJXaWRnZXQoQ1hGQV9GRldpZGdldCogaFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkhpZ2hsaWdodCkgewotICBoV2lkZ2V0LT5SZW5kZXJXaWRnZXQocEdTLCBwTWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgYkhpZ2hsaWdodCA/IFhGQV9XaWRnZXRTdGF0dXNfSGlnaGxpZ2h0IDogMCk7Ci19Ci0KLWJvb2wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Okhhc0V2ZW50KENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VWRU5UVFlQRSBlRXZlbnRUeXBlKSB7Ci0gIGlmICghcFdpZGdldEFjYyB8fCBlRXZlbnRUeXBlID09IFhGQV9FVkVOVF9Vbmtub3duKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHBXaWRnZXRBY2MtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkRyYXcpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN3aXRjaCAoZUV2ZW50VHlwZSkgewotICAgIGNhc2UgWEZBX0VWRU5UX0NhbGN1bGF0ZTogewotICAgICAgQ1hGQV9DYWxjdWxhdGUgY2FsYyA9IHBXaWRnZXRBY2MtPkdldENhbGN1bGF0ZSgpOwotICAgICAgaWYgKCFjYWxjKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoY2FsYy5HZXRTY3JpcHQoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGNhc2UgWEZBX0VWRU5UX1ZhbGlkYXRlOiB7Ci0gICAgICBDWEZBX1ZhbGlkYXRlIHZhbCA9IHBXaWRnZXRBY2MtPkdldFZhbGlkYXRlKCk7Ci0gICAgICBpZiAoIXZhbCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHZhbC5HZXRTY3JpcHQoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICBDWEZBX05vZGVBcnJheSBldmVudEFycmF5OwotICByZXR1cm4gcFdpZGdldEFjYy0+R2V0RXZlbnRCeUFjdGl2aXR5KGdzX0V2ZW50QWN0aXZpdHlbZUV2ZW50VHlwZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRBcnJheSkgPiAwOwotfQotCi1pbnQzMl90IENYRkFfRkZXaWRnZXRIYW5kbGVyOjpQcm9jZXNzRXZlbnQoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9FdmVudFBhcmFtKiBwUGFyYW0pIHsKLSAgaWYgKCFwUGFyYW0gfHwgcFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9Vbmtub3duKQotICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKLSAgaWYgKCFwV2lkZ2V0QWNjIHx8IHBXaWRnZXRBY2MtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkRyYXcpCi0gICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0OwotCi0gIHN3aXRjaCAocFBhcmFtLT5tX2VUeXBlKSB7Ci0gICAgY2FzZSBYRkFfRVZFTlRfQ2FsY3VsYXRlOgotICAgICAgcmV0dXJuIHBXaWRnZXRBY2MtPlByb2Nlc3NDYWxjdWxhdGUoKTsKLSAgICBjYXNlIFhGQV9FVkVOVF9WYWxpZGF0ZToKLSAgICAgIGlmIChtX3BEb2NWaWV3LT5HZXREb2MoKS0+R2V0RG9jRW52aXJvbm1lbnQoKS0+SXNWYWxpZGF0aW9uc0VuYWJsZWQoCi0gICAgICAgICAgICAgIG1fcERvY1ZpZXctPkdldERvYygpKSkgewotICAgICAgICByZXR1cm4gcFdpZGdldEFjYy0+UHJvY2Vzc1ZhbGlkYXRlKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRGlzYWJsZWQ7Ci0gICAgY2FzZSBYRkFfRVZFTlRfSW5pdENhbGN1bGF0ZTogewotICAgICAgQ1hGQV9DYWxjdWxhdGUgY2FsYyA9IHBXaWRnZXRBY2MtPkdldENhbGN1bGF0ZSgpOwotICAgICAgaWYgKCFjYWxjKQotICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7Ci0gICAgICBpZiAocFdpZGdldEFjYy0+R2V0Tm9kZSgpLT5Jc1VzZXJJbnRlcmFjdGl2ZSgpKQotICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRGlzYWJsZWQ7Ci0KLSAgICAgIENYRkFfU2NyaXB0IHNjcmlwdCA9IGNhbGMuR2V0U2NyaXB0KCk7Ci0gICAgICByZXR1cm4gcFdpZGdldEFjYy0+RXhlY3V0ZVNjcmlwdChzY3JpcHQsIHBQYXJhbSk7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICBpbnQzMl90IGlSZXQgPQotICAgICAgcFdpZGdldEFjYy0+UHJvY2Vzc0V2ZW50KGdzX0V2ZW50QWN0aXZpdHlbcFBhcmFtLT5tX2VUeXBlXSwgcFBhcmFtKTsKLSAgcmV0dXJuIGlSZXQ7Ci19Ci0KLUNYRkFfRkZXaWRnZXQqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVXaWRnZXQoQ1hGQV9GRldpZGdldCogaFBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1dJREdFVFRZUEUgZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRkZXaWRnZXQqIGhCZWZvcmUpIHsKLSAgQ1hGQV9Ob2RlKiBwUGFyZW50Rm9ybUl0ZW0gPQotICAgICAgaFBhcmVudCA/IGhQYXJlbnQtPkdldERhdGFBY2MoKS0+R2V0Tm9kZSgpIDogbnVsbHB0cjsKLSAgQ1hGQV9Ob2RlKiBwQmVmb3JlRm9ybUl0ZW0gPQotICAgICAgaEJlZm9yZSA/IGhCZWZvcmUtPkdldERhdGFBY2MoKS0+R2V0Tm9kZSgpIDogbnVsbHB0cjsKLSAgQ1hGQV9Ob2RlKiBwTmV3Rm9ybUl0ZW0gPQotICAgICAgQ3JlYXRlV2lkZ2V0Rm9ybUl0ZW0oZVR5cGUsIHBQYXJlbnRGb3JtSXRlbSwgcEJlZm9yZUZvcm1JdGVtKTsKLSAgaWYgKCFwTmV3Rm9ybUl0ZW0pCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgcE5ld0Zvcm1JdGVtLT5HZXRUZW1wbGF0ZU5vZGUoKS0+U2V0RmxhZyhYRkFfTm9kZUZsYWdfSW5pdGlhbGl6ZWQsIHRydWUpOwotICBwTmV3Rm9ybUl0ZW0tPlNldEZsYWcoWEZBX05vZGVGbGFnX0luaXRpYWxpemVkLCB0cnVlKTsKLSAgbV9wRG9jVmlldy0+UnVuTGF5b3V0KCk7Ci0gIENYRkFfTGF5b3V0SXRlbSogcExheW91dCA9Ci0gICAgICBtX3BEb2NWaWV3LT5HZXRYRkFMYXlvdXQoKS0+R2V0TGF5b3V0SXRlbShwTmV3Rm9ybUl0ZW0pOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRldpZGdldCo+KHBMYXlvdXQpOwotfQotCi1DWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVXaWRnZXRGb3JtSXRlbSgKLSAgICBYRkFfV0lER0VUVFlQRSBlVHlwZSwKLSAgICBDWEZBX05vZGUqIHBQYXJlbnQsCi0gICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7Ci0gIHN3aXRjaCAoZVR5cGUpIHsKLSAgICBjYXNlIFhGQV9XSURHRVRUWVBFX0JhcmNvZGU6Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICBjYXNlIFhGQV9XSURHRVRUWVBFX1B1c2hCdXR0b246Ci0gICAgICByZXR1cm4gQ3JlYXRlUHVzaEJ1dHRvbihwUGFyZW50LCBwQmVmb3JlKTsKLSAgICBjYXNlIFhGQV9XSURHRVRUWVBFX0NoZWNrQnV0dG9uOgotICAgICAgcmV0dXJuIENyZWF0ZUNoZWNrQnV0dG9uKHBQYXJlbnQsIHBCZWZvcmUpOwotICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfRXhjbHVkZUdyb3VwOgotICAgICAgcmV0dXJuIENyZWF0ZUV4Y2xHcm91cChwUGFyZW50LCBwQmVmb3JlKTsKLSAgICBjYXNlIFhGQV9XSURHRVRUWVBFX1JhZGlvQnV0dG9uOgotICAgICAgcmV0dXJuIENyZWF0ZVJhZGlvQnV0dG9uKHBQYXJlbnQsIHBCZWZvcmUpOwotICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfQXJjOgotICAgICAgcmV0dXJuIENyZWF0ZUFyYyhwUGFyZW50LCBwQmVmb3JlKTsKLSAgICBjYXNlIFhGQV9XSURHRVRUWVBFX1JlY3RhbmdsZToKLSAgICAgIHJldHVybiBDcmVhdGVSZWN0YW5nbGUocFBhcmVudCwgcEJlZm9yZSk7Ci0gICAgY2FzZSBYRkFfV0lER0VUVFlQRV9JbWFnZToKLSAgICAgIHJldHVybiBDcmVhdGVJbWFnZShwUGFyZW50LCBwQmVmb3JlKTsKLSAgICBjYXNlIFhGQV9XSURHRVRUWVBFX0xpbmU6Ci0gICAgICByZXR1cm4gQ3JlYXRlTGluZShwUGFyZW50LCBwQmVmb3JlKTsKLSAgICBjYXNlIFhGQV9XSURHRVRUWVBFX1RleHQ6Ci0gICAgICByZXR1cm4gQ3JlYXRlVGV4dChwUGFyZW50LCBwQmVmb3JlKTsKLSAgICBjYXNlIFhGQV9XSURHRVRUWVBFX0RhdGV0aW1lRWRpdDoKLSAgICAgIHJldHVybiBDcmVhdGVEYXRldGltZUVkaXQocFBhcmVudCwgcEJlZm9yZSk7Ci0gICAgY2FzZSBYRkFfV0lER0VUVFlQRV9EZWNpbWFsRmllbGQ6Ci0gICAgICByZXR1cm4gQ3JlYXRlRGVjaW1hbEZpZWxkKHBQYXJlbnQsIHBCZWZvcmUpOwotICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfTnVtZXJpY0ZpZWxkOgotICAgICAgcmV0dXJuIENyZWF0ZU51bWVyaWNGaWVsZChwUGFyZW50LCBwQmVmb3JlKTsKLSAgICBjYXNlIFhGQV9XSURHRVRUWVBFX1NpZ25hdHVyZToKLSAgICAgIHJldHVybiBDcmVhdGVTaWduYXR1cmUocFBhcmVudCwgcEJlZm9yZSk7Ci0gICAgY2FzZSBYRkFfV0lER0VUVFlQRV9UZXh0RWRpdDoKLSAgICAgIHJldHVybiBDcmVhdGVUZXh0RWRpdChwUGFyZW50LCBwQmVmb3JlKTsKLSAgICBjYXNlIFhGQV9XSURHRVRUWVBFX0Ryb3Bkb3duTGlzdDoKLSAgICAgIHJldHVybiBDcmVhdGVEcm9wZG93bkxpc3QocFBhcmVudCwgcEJlZm9yZSk7Ci0gICAgY2FzZSBYRkFfV0lER0VUVFlQRV9MaXN0Qm94OgotICAgICAgcmV0dXJuIENyZWF0ZUxpc3RCb3gocFBhcmVudCwgcEJlZm9yZSk7Ci0gICAgY2FzZSBYRkFfV0lER0VUVFlQRV9JbWFnZUZpZWxkOgotICAgICAgcmV0dXJuIENyZWF0ZUltYWdlRmllbGQocFBhcmVudCwgcEJlZm9yZSk7Ci0gICAgY2FzZSBYRkFfV0lER0VUVFlQRV9QYXNzd29yZEVkaXQ6Ci0gICAgICByZXR1cm4gQ3JlYXRlUGFzc3dvcmRFZGl0KHBQYXJlbnQsIHBCZWZvcmUpOwotICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfU3ViZm9ybToKLSAgICAgIHJldHVybiBDcmVhdGVTdWJmb3JtKHBQYXJlbnQsIHBCZWZvcmUpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotfQotCi1DWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVQdXNoQnV0dG9uKENYRkFfTm9kZSogcFBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7Ci0gIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRmllbGQoWEZBX0VsZW1lbnQ6OkJ1dHRvbiwgcFBhcmVudCwgcEJlZm9yZSk7Ci0gIENYRkFfTm9kZSogcENhcHRpb24gPSBDcmVhdGVDb3B5Tm9kZShYRkFfRWxlbWVudDo6Q2FwdGlvbiwgcEZpZWxkKTsKLSAgQ1hGQV9Ob2RlKiBwVmFsdWUgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRWxlbWVudDo6VmFsdWUsIHBDYXB0aW9uKTsKLSAgQ1hGQV9Ob2RlKiBwVGV4dCA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FbGVtZW50OjpUZXh0LCBwVmFsdWUpOwotICBwVGV4dC0+U2V0Q29udGVudChMIkJ1dHRvbiIsIEwiQnV0dG9uIiwgZmFsc2UpOwotCi0gIENYRkFfTm9kZSogcFBhcmEgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRWxlbWVudDo6UGFyYSwgcENhcHRpb24pOwotICBwUGFyYS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1ZBbGlnbiwgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlLCBmYWxzZSk7Ci0gIHBQYXJhLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfSEFsaWduLCBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXIsIGZhbHNlKTsKLSAgQ3JlYXRlRm9udE5vZGUocENhcHRpb24pOwotCi0gIENYRkFfTm9kZSogcEJvcmRlciA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FbGVtZW50OjpCb3JkZXIsIHBGaWVsZCk7Ci0gIHBCb3JkZXItPlNldEVudW0oWEZBX0FUVFJJQlVURV9IYW5kLCBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCwgZmFsc2UpOwotCi0gIENYRkFfTm9kZSogcEVkZ2UgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRWxlbWVudDo6RWRnZSwgcEJvcmRlcik7Ci0gIHBFZGdlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfU3Ryb2tlLCBYRkFfQVRUUklCVVRFRU5VTV9SYWlzZWQsIGZhbHNlKTsKLQotICBDWEZBX05vZGUqIHBGaWxsID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VsZW1lbnQ6OkZpbGwsIHBCb3JkZXIpOwotICBDWEZBX05vZGUqIHBDb2xvciA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FbGVtZW50OjpDb2xvciwgcEZpbGwpOwotICBwQ29sb3ItPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIEwiMjEyLCAyMDgsIDIwMCIsIGZhbHNlKTsKLQotICBDWEZBX05vZGUqIHBCaW5kID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VsZW1lbnQ6OkJpbmQsIHBGaWVsZCk7Ci0gIHBCaW5kLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfTWF0Y2gsIFhGQV9BVFRSSUJVVEVFTlVNX05vbmUpOwotCi0gIHJldHVybiBwRmllbGQ7Ci19Ci0KLUNYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUNoZWNrQnV0dG9uKENYRkFfTm9kZSogcFBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QgewotICByZXR1cm4gQ3JlYXRlRmllbGQoWEZBX0VsZW1lbnQ6OkNoZWNrQnV0dG9uLCBwUGFyZW50LCBwQmVmb3JlKTsKLX0KLQotQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlRXhjbEdyb3VwKENYRkFfTm9kZSogcFBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsKLSAgcmV0dXJuIENyZWF0ZUZvcm1JdGVtKFhGQV9FbGVtZW50OjpFeGNsR3JvdXAsIHBQYXJlbnQsIHBCZWZvcmUpOwotfQotCi1DWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVSYWRpb0J1dHRvbihDWEZBX05vZGUqIHBQYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsKLSAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVGaWVsZChYRkFfRWxlbWVudDo6Q2hlY2tCdXR0b24sIHBQYXJlbnQsIHBCZWZvcmUpOwotICBDWEZBX05vZGUqIHBVaSA9IHBGaWVsZC0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VsZW1lbnQ6OlVpKTsKLSAgQ1hGQV9Ob2RlKiBwV2lkZ2V0ID0gcFVpLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRWxlbWVudDo6Q2hlY2tCdXR0b24pOwotICBwV2lkZ2V0LT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfU2hhcGUsIFhGQV9BVFRSSUJVVEVFTlVNX1JvdW5kKTsKLSAgcmV0dXJuIHBGaWVsZDsKLX0KLQotQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlRGF0ZXRpbWVFZGl0KENYRkFfTm9kZSogcFBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsKLSAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVGaWVsZChYRkFfRWxlbWVudDo6RGF0ZVRpbWVFZGl0LCBwUGFyZW50LCBwQmVmb3JlKTsKLSAgQ3JlYXRlVmFsdWVOb2RlKFhGQV9FbGVtZW50OjpEYXRlLCBwRmllbGQpOwotICByZXR1cm4gcEZpZWxkOwotfQotCi1DWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVEZWNpbWFsRmllbGQoQ1hGQV9Ob2RlKiBwUGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QgewotICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZU51bWVyaWNGaWVsZChwUGFyZW50LCBwQmVmb3JlKTsKLSAgQ3JlYXRlVmFsdWVOb2RlKFhGQV9FbGVtZW50OjpEZWNpbWFsLCBwRmllbGQpOwotICByZXR1cm4gcEZpZWxkOwotfQotCi1DWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVOdW1lcmljRmllbGQoQ1hGQV9Ob2RlKiBwUGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QgewotICByZXR1cm4gQ3JlYXRlRmllbGQoWEZBX0VsZW1lbnQ6Ok51bWVyaWNFZGl0LCBwUGFyZW50LCBwQmVmb3JlKTsKLX0KLQotQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlU2lnbmF0dXJlKENYRkFfTm9kZSogcFBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsKLSAgcmV0dXJuIENyZWF0ZUZpZWxkKFhGQV9FbGVtZW50OjpTaWduYXR1cmUsIHBQYXJlbnQsIHBCZWZvcmUpOwotfQotCi1DWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVUZXh0RWRpdChDWEZBX05vZGUqIHBQYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsKLSAgcmV0dXJuIENyZWF0ZUZpZWxkKFhGQV9FbGVtZW50OjpUZXh0RWRpdCwgcFBhcmVudCwgcEJlZm9yZSk7Ci19Ci0KLUNYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZURyb3Bkb3duTGlzdChDWEZBX05vZGUqIHBQYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7Ci0gIHJldHVybiBDcmVhdGVGaWVsZChYRkFfRWxlbWVudDo6Q2hvaWNlTGlzdCwgcFBhcmVudCwgcEJlZm9yZSk7Ci19Ci0KLUNYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUxpc3RCb3goQ1hGQV9Ob2RlKiBwUGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsKLSAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVEcm9wZG93bkxpc3QocFBhcmVudCwgcEJlZm9yZSk7Ci0gIENYRkFfTm9kZSogcFVpID0gcEZpZWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gIENYRkFfTm9kZSogcExpc3RCb3ggPSBwVWktPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsKLSAgcExpc3RCb3gtPlNldEVudW0oWEZBX0FUVFJJQlVURV9PcGVuLCBYRkFfQVRUUklCVVRFRU5VTV9BbHdheXMpOwotICBwTGlzdEJveC0+U2V0RW51bShYRkFfQVRUUklCVVRFX0NvbW1pdE9uLCBYRkFfQVRUUklCVVRFRU5VTV9FeGl0KTsKLSAgcmV0dXJuIHBGaWVsZDsKLX0KLQotQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlSW1hZ2VGaWVsZChDWEZBX05vZGUqIHBQYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QgewotICByZXR1cm4gQ3JlYXRlRmllbGQoWEZBX0VsZW1lbnQ6OkltYWdlRWRpdCwgcFBhcmVudCwgcEJlZm9yZSk7Ci19Ci0KLUNYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZVBhc3N3b3JkRWRpdChDWEZBX05vZGUqIHBQYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7Ci0gIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRmllbGQoWEZBX0VsZW1lbnQ6OlBhc3N3b3JkRWRpdCwgcFBhcmVudCwgcEJlZm9yZSk7Ci0gIENYRkFfTm9kZSogcEJpbmQgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRWxlbWVudDo6QmluZCwgcEZpZWxkKTsKLSAgcEJpbmQtPlNldEVudW0oWEZBX0FUVFJJQlVURV9NYXRjaCwgWEZBX0FUVFJJQlVURUVOVU1fTm9uZSwgZmFsc2UpOwotICByZXR1cm4gcEZpZWxkOwotfQotCi1DWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVGaWVsZChYRkFfRWxlbWVudCBlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QgewotICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZUZvcm1JdGVtKFhGQV9FbGVtZW50OjpGaWVsZCwgcFBhcmVudCwgcEJlZm9yZSk7Ci0gIENyZWF0ZUNvcHlOb2RlKGVFbGVtZW50LCBDcmVhdGVDb3B5Tm9kZShYRkFfRWxlbWVudDo6VWksIHBGaWVsZCkpOwotICBDcmVhdGVGb250Tm9kZShwRmllbGQpOwotICByZXR1cm4gcEZpZWxkOwotfQotCi1DWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVBcmMoQ1hGQV9Ob2RlKiBwUGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QgewotICByZXR1cm4gQ3JlYXRlRHJhdyhYRkFfRWxlbWVudDo6QXJjLCBwUGFyZW50LCBwQmVmb3JlKTsKLX0KLQotQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlUmVjdGFuZ2xlKENYRkFfTm9kZSogcFBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsKLSAgcmV0dXJuIENyZWF0ZURyYXcoWEZBX0VsZW1lbnQ6OlJlY3RhbmdsZSwgcFBhcmVudCwgcEJlZm9yZSk7Ci19Ci0KLUNYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUltYWdlKENYRkFfTm9kZSogcFBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QgewotICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZURyYXcoWEZBX0VsZW1lbnQ6OkltYWdlLCBwUGFyZW50LCBwQmVmb3JlKTsKLSAgQ3JlYXRlQ29weU5vZGUoWEZBX0VsZW1lbnQ6OkltYWdlRWRpdCwKLSAgICAgICAgICAgICAgICAgQ3JlYXRlQ29weU5vZGUoWEZBX0VsZW1lbnQ6OlVpLCBwRmllbGQpKTsKLSAgcmV0dXJuIHBGaWVsZDsKLX0KLQotQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlTGluZShDWEZBX05vZGUqIHBQYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QgewotICByZXR1cm4gQ3JlYXRlRHJhdyhYRkFfRWxlbWVudDo6TGluZSwgcFBhcmVudCwgcEJlZm9yZSk7Ci19Ci0KLUNYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZVRleHQoQ1hGQV9Ob2RlKiBwUGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsKLSAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVEcmF3KFhGQV9FbGVtZW50OjpUZXh0LCBwUGFyZW50LCBwQmVmb3JlKTsKLSAgQ3JlYXRlQ29weU5vZGUoWEZBX0VsZW1lbnQ6OlRleHRFZGl0LAotICAgICAgICAgICAgICAgICBDcmVhdGVDb3B5Tm9kZShYRkFfRWxlbWVudDo6VWksIHBGaWVsZCkpOwotICBDcmVhdGVGb250Tm9kZShwRmllbGQpOwotICByZXR1cm4gcEZpZWxkOwotfQotCi1DWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVEcmF3KFhGQV9FbGVtZW50IGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QgewotICBDWEZBX05vZGUqIHBEcmF3ID0gQ3JlYXRlRm9ybUl0ZW0oWEZBX0VsZW1lbnQ6OkRyYXcsIHBQYXJlbnQsIHBCZWZvcmUpOwotICBDcmVhdGVWYWx1ZU5vZGUoZUVsZW1lbnQsIHBEcmF3KTsKLSAgcmV0dXJuIHBEcmF3OwotfQotCi1DWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVTdWJmb3JtKENYRkFfTm9kZSogcFBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7Ci0gIHJldHVybiBDcmVhdGVGb3JtSXRlbShYRkFfRWxlbWVudDo6U3ViZm9ybSwgcFBhcmVudCwgcEJlZm9yZSk7Ci19Ci0KLUNYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUZvcm1JdGVtKFhGQV9FbGVtZW50IGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7Ci0gIENYRkFfTm9kZSogcFRlbXBsYXRlUGFyZW50ID0gcFBhcmVudCA/IHBQYXJlbnQtPkdldFRlbXBsYXRlTm9kZSgpIDogbnVsbHB0cjsKLSAgQ1hGQV9Ob2RlKiBwTmV3Rm9ybUl0ZW0gPSBwVGVtcGxhdGVQYXJlbnQtPkNsb25lVGVtcGxhdGVUb0Zvcm0oZmFsc2UpOwotICBpZiAocFBhcmVudCkKLSAgICBwUGFyZW50LT5JbnNlcnRDaGlsZChwTmV3Rm9ybUl0ZW0sIHBCZWZvcmUpOwotICByZXR1cm4gcE5ld0Zvcm1JdGVtOwotfQotCi1DWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVDb3B5Tm9kZShYRkFfRWxlbWVudCBlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QgewotICBDWEZBX05vZGUqIHBUZW1wbGF0ZVBhcmVudCA9IHBQYXJlbnQgPyBwUGFyZW50LT5HZXRUZW1wbGF0ZU5vZGUoKSA6IG51bGxwdHI7Ci0gIENYRkFfTm9kZSogcE5ld05vZGUgPQotICAgICAgQ3JlYXRlVGVtcGxhdGVOb2RlKGVFbGVtZW50LCBwVGVtcGxhdGVQYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcEJlZm9yZSA/IHBCZWZvcmUtPkdldFRlbXBsYXRlTm9kZSgpIDogbnVsbHB0cikKLSAgICAgICAgICAtPkNsb25lKGZhbHNlKTsKLSAgaWYgKHBQYXJlbnQpCi0gICAgcFBhcmVudC0+SW5zZXJ0Q2hpbGQocE5ld05vZGUsIHBCZWZvcmUpOwotICByZXR1cm4gcE5ld05vZGU7Ci19Ci0KLUNYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZVRlbXBsYXRlTm9kZShYRkFfRWxlbWVudCBlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7Ci0gIENYRkFfRG9jdW1lbnQqIHBYRkFEb2MgPSBHZXRYRkFEb2MoKTsKLSAgQ1hGQV9Ob2RlKiBwTmV3VGVtcGxhdGVOb2RlID0KLSAgICAgIHBYRkFEb2MtPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSwgZUVsZW1lbnQpOwotICBpZiAocFBhcmVudCkKLSAgICBwUGFyZW50LT5JbnNlcnRDaGlsZChwTmV3VGVtcGxhdGVOb2RlLCBwQmVmb3JlKTsKLSAgcmV0dXJuIHBOZXdUZW1wbGF0ZU5vZGU7Ci19Ci0KLUNYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUZvbnROb2RlKENYRkFfTm9kZSogcFBhcmVudCkgY29uc3QgewotICBDWEZBX05vZGUqIHBGb250ID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VsZW1lbnQ6OkZvbnQsIHBQYXJlbnQpOwotICBwRm9udC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9UeXBlZmFjZSwgTCJNeXJpYWQgUHJvIiwgZmFsc2UpOwotICByZXR1cm4gcEZvbnQ7Ci19Ci0KLUNYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZU1hcmdpbk5vZGUoQ1hGQV9Ob2RlKiBwUGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmSW5zZXRzWzRdKSBjb25zdCB7Ci0gIENYRkFfTm9kZSogcE1hcmdpbiA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FbGVtZW50OjpNYXJnaW4sIHBQYXJlbnQpOwotICBpZiAoZHdGbGFncyAmIDB4MDEpCi0gICAgcE1hcmdpbi0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0xlZnRJbnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTWVhc3VyZW1lbnQoZkluc2V0c1swXSwgWEZBX1VOSVRfUHQpLCBmYWxzZSk7Ci0gIGlmIChkd0ZsYWdzICYgMHgwMikKLSAgICBwTWFyZ2luLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50KGZJbnNldHNbMV0sIFhGQV9VTklUX1B0KSwgZmFsc2UpOwotICBpZiAoZHdGbGFncyAmIDB4MDQpCi0gICAgcE1hcmdpbi0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1JpZ2h0SW5zZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50KGZJbnNldHNbMl0sIFhGQV9VTklUX1B0KSwgZmFsc2UpOwotICBpZiAoZHdGbGFncyAmIDB4MDgpCi0gICAgcE1hcmdpbi0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9NZWFzdXJlbWVudChmSW5zZXRzWzNdLCBYRkFfVU5JVF9QdCksIGZhbHNlKTsKLSAgcmV0dXJuIHBNYXJnaW47Ci19Ci0KLUNYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZVZhbHVlTm9kZShYRkFfRWxlbWVudCBlVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50KSBjb25zdCB7Ci0gIENYRkFfTm9kZSogcFZhbHVlID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VsZW1lbnQ6OlZhbHVlLCBwUGFyZW50KTsKLSAgQ3JlYXRlQ29weU5vZGUoZVZhbHVlLCBwVmFsdWUpOwotICByZXR1cm4gcFZhbHVlOwotfQotCi1DWEZBX0RvY3VtZW50KiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6R2V0T2JqRmFjdG9yeSgpIGNvbnN0IHsKLSAgcmV0dXJuIEdldFhGQURvYygpOwotfQotCi1DWEZBX0RvY3VtZW50KiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6R2V0WEZBRG9jKCkgY29uc3QgewotICByZXR1cm4gbV9wRG9jVmlldy0+R2V0RG9jKCktPkdldFhGQURvYygpOwotfQotCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAveGZhX2ZvbnRtZ3IuY3BwIGIveGZhL2Z4ZmEvYXBwL3hmYV9mb250bWdyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiMzg5Ni4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAveGZhX2ZvbnRtZ3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjA1NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZm9udG1nci5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL2ZvbnQvY3BkZl9mb250LmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX2RpY3Rpb25hcnkuaCIKLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9jZmdhc19nZWZvbnQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZhcHAuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZkb2MuaCIKLQotbmFtZXNwYWNlIHsKLQotLy8gVGhlIDUgbmFtZXMgcGVyIGVudHJ5IGFyZTogUHNOYW1lLCBOb3JtYWwsIEJvbGQsIEl0YWxpYywgQm9sZEl0YWxpYy4KLWNvbnN0IGNoYXIqIGNvbnN0IGdfWEZBUERGRm9udE5hbWVbXVs1XSA9IHsKLSAgICB7IkFkb2JlIFBJIFN0ZCIsICJBZG9iZVBJU3RkIiwgIkFkb2JlUElTdGQiLCAiQWRvYmVQSVN0ZCIsICJBZG9iZVBJU3RkIn0sCi0gICAgeyJNeXJpYWQgUHJvIExpZ2h0IiwgIk15cmlhZFByby1MaWdodCIsICJNeXJpYWRQcm8tU2VtaWJvbGQiLAotICAgICAiTXlyaWFkUHJvLUxpZ2h0SXQiLCAiTXlyaWFkUHJvLVNlbWlib2xkSXQifSwKLX07Ci0KLSNpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX1dJTkRPV1NfCi1jb25zdCBYRkFfRk9OVElORk8gZ19YRkFGb250c01hcFtdID0gewotICAgIHsweDAxZDVkMzNlLCBMIlNpbVN1biIsIEwiQXJpYWwiLCAwLCA5MzZ9LAotICAgIHsweDAxZTRmMTAyLCBMIllvdVl1YW4iLCBMIkFyaWFsIiwgMSwgOTM2fSwKLSAgICB7MHgwMzA1NDlkYywgTCJMaVN1IiwgTCJBcmlhbCIsIDEsIDkzNn0sCi0gICAgezB4MDMyZWRkNDQsIEwiU2ltaGVpIiwgTCJBcmlhbCIsIDEsIDkzNn0sCi0gICAgezB4MDNlYWM2ZmMsIEwiUG9vclJpY2hhcmQtUmVndWxhciIsIEwiQXJpYWwiLCAyLCAxMjUyfSwKLSAgICB7MHgwM2VkOTBlNiwgTCJOaW5hIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweDA3N2I1NmIzLCBMIktpbmdzb2Z0UGhvbmV0aWNQbGFpbiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHgwNzhlZDUyNCwgTCJNaWNyb3NvZnRTYW5zU2VyaWYiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4MDg5YjE4YTksIEwiQXJpYWwiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4MGIyY2FkNzIsIEwiTW9ub3R5cGVDb3JzaXZhIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LAotICAgIHsweDBiYjAwM2U3LCBMIkthcnRpa2EiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCi0gICAgezB4MGJiNDY5ZGYsIEwiVmluZXJIYW5kSVRDIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LAotICAgIHsweDBiYzFhODUxLCBMIlNlZ29lVUkiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4MGMxMTJlYmQsIEwiS296dWthR290aGljUHJvLVZJTSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHgwY2ZjYjljMSwgTCJBZG9iZVRoYWkiLCBMIktva2lsYSxBcmlhbCBOYXJyb3ciLCAwLCA4NDd9LAotICAgIHsweDBlN2RlMGY5LCBMIlBsYXliaWxsIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweDBlZmY0N2MzLCBMIlNUSHVwbyIsIEwiQXJpYWwiLCAwLCA5MzZ9LAotICAgIHsweDEwN2FkMzc0LCBMIkNvbnN0YW50aWEiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCi0gICAgezB4MTIxOTRjMmQsIEwiS3Vuc3RsZXJTY3JpcHQiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sCi0gICAgezB4MTM1ZWY2YTEsIEwiTWluaW9uUHJvU21CZCIsCi0gICAgIEwiQmVsbCBNVCxDb3JiZWwsVGltZXMgTmV3IFJvbWFuLENhbWJyaWEsQmVybGluIFNhbnMgRkIiLCAwLCAxMjUyfSwKLSAgICB7MHgxNThjNDA0OSwgTCJHYXJhbW9uZCIsIEwiQXJpYWwiLCAyLCAxMjUyfSwKLSAgICB7MHgxNjBlY2IyNCwgTCJTVFpob25nc29uZyIsIEwiQXJpYWwiLCAwLCA5MzZ9LAotICAgIHsweDE2MWVkMDdlLCBMIk1TR290aGljIiwgTCJBcmlhbCIsIDEsIDEyNTJ9LAotICAgIHsweDE3MWQxZWQxLCBMIlNuYXBJVEMtUmVndWxhciIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHgxOGQxMTg4ZiwgTCJDYW1icmlhIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAotICAgIHsweDE4ZWFmMzUwLCBMIkFyaWFsVW5pY29kZU1TIiwgTCJBcmlhbCIsIDAsIDkzNn0sCi0gICAgezB4MWE5MmQxMTUsIEwiTWluZ0xpVSIsIEwiQXJpYWwiLCAxLCAxMjUyfSwKLSAgICB7MHgxY2MyMTdjNiwgTCJUcmVidWNoZXRNUyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHgxZDY0OTU5NiwgTCJCYXNlbWljVGltZXMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4MWUzNGVlNjAsIEwiQmVsbE1UIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAotICAgIHsweDFlYjM2OTQ1LCBMIkNvb3BlckJsYWNrIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAotICAgIHsweDFlZjc3ODdkLCBMIkJhdGFuZ0NoZSIsIEwiQXJpYWwiLCAxLCAxMjUyfSwKLSAgICB7MHgyMGIzYmQzYSwgTCJCcnVzaFNjcmlwdE1UIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LAotICAgIHsweDIyMDg3N2FhLCBMIkNhbmRhcmEiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4MjIxMzUwMDcsIEwiRnJlZXN0eWxlU2NyaXB0LVJlZ3VsYXIiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sCi0gICAgezB4MjUxMDU5YzMsIEwiQ2hpbGxlciIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHgyNWJlZDZkZCwgTCJNU1JlZmVyZW5jZVNhbnNTZXJpZiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHgyODE1NGM4MSwgTCJQYXJjaG1lbnQtUmVndWxhciIsIEwiQXJpYWwiLCA4LCAxMjUyfSwKLSAgICB7MHgyOTcxMWViOSwgTCJTVExpdGkiLCBMIkFyaWFsIiwgMCwgOTM2fSwKLSAgICB7MHgyYjE5OTNiNCwgTCJCYXNlbWljIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweDJiMzE2MzM5LCBMIk5pYWdhcmFTb2xpZC1SZWciLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4MmMxNDc1MjksIEwiRm9vdGxpZ2h0TVRMaWdodCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHgyYzE5ODkyOCwgTCJIYXJsb3dTb2xpZCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHgyYzZhYzZiMiwgTCJMdWNpZGFCcmlnaHQiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCi0gICAgezB4MmM5ZjM4ZTIsIEwiS296dWthTWluY2hvUHJvLVZJUiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHgyZDVhNDdiMCwgTCJTVENhaXl1biIsIEwiQXJpYWwiLCAwLCA5MzZ9LAotICAgIHsweDJkZWYyNmJmLCBMIkJlcm5hcmRNVC1Db25kZW5zZWQiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4MmZkODkzMGIsIEwiS296dWthTWluY2hvUHI2TlIiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4MzExNTUyNWEsIEwiRmFuZ1NvbmdfR0IyMzEyIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweDMxMzI3ODE3LCBMIk15cmlhZFBybyIsCi0gICAgIEwiQ2FsaWJyaSxDb3JiZWwsQ2FuZGFyYSxDYW1icmlhIE1hdGgsRnJhbmtsaW4gR290aGljIE1lZGl1bSxBcmlhbCAiCi0gICAgIEwiTmFycm93LFRpbWVzIE5ldyBSb21hbiIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweDMyMjQ0OTc1LCBMIkhlbHZldGljYSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHgzMmFjOTk1YywgTCJUZXJtaW5hbCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHgzMzhkNjQ4YSwgTCJOaWFnYXJhRW5ncmF2ZWQtUmVnIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweDMzYmI2NWYyLCBMIlN5bGZhZW4iLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCi0gICAgezB4MzQwMmMzMGUsIEwiTVNQTWluY2hvIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAotICAgIHsweDM0MTJiZjMxLCBMIlNpbVN1bi1QVUEiLCBMIkFyaWFsIiwgMCwgOTM2fSwKLSAgICB7MHgzNmViMzliOSwgTCJCZXJsaW5TYW5zRkIiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4MzZmNDIwNTUsIEwiVW5pdmVyc0FUVCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYiLCAwLCAxMjUyfSwKLSAgICB7MHgzODY0YzRmNiwgTCJIaWdoVG93ZXJUZXh0IiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAotICAgIHsweDNhMjU3ZDAzLCBMIkZhbmdTb25nX0dCMjMxMiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHgzY2RhZTY2OCwgTCJGcmVlc3R5bGVTY3JpcHQiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sCi0gICAgezB4M2Q1NWFlZDcsIEwiSm9rZXJtYW4iLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4M2Q1YjQzODUsIEwiUE1pbmdMaVUiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCi0gICAgezB4M2Q5Yjc2NjksIEwiRXN0cmFuZ2Vsb0VkZXNzYSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHgzZTUzMmQ3NCwgTCJGcmFua2xpbkdvdGhpY01lZGl1bSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHgzZTZhYTMyZCwgTCJOU2ltU3VuIiwgTCJBcmlhbCIsIDEsIDkzNn0sCi0gICAgezB4M2Y2YzM2YTgsIEwiR2F1dGFtaSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHgzZmYzMjY2MiwgTCJDaGlsbGVyLVJlZ3VsYXIiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4NDA5ZGUzMTIsIEwiTW9kZXJuTm8uMjAiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCi0gICAgezB4NDE0NDNjNWUsIEwiR2VvcmdpYSIsIEwiQXJpYWwiLCAyLCAxMjUyfSwKLSAgICB7MHg0MTYwYWRlNSwgTCJCZWxsR290aGljU3RkQmxhY2siLAotICAgICBMIkFyaWFsLEFyaWFsIFVuaWNvZGUgTVMsQm9vayBBbnRpcXVhLERvdHVtLEdlb3JnaWEiLCAwLCAxMjUyfSwKLSAgICB7MHg0MjE5NzZjNCwgTCJNb2Rlcm4tUmVndWxhciIsIEwiQXJpYWwiLCAyLCAxMjUyfSwKLSAgICB7MHg0MjJhNzI1MiwgTCJTdGVuY2lsIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweDQyYzg1NTRmLCBMIkZpeGVkc3lzIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweDQzNWNiNDFkLCBMIlJvbWFuIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweDQ3ODgyMzgzLCBMIkNvdXJpZXJOZXciLCBMIkFyaWFsIiwgMSwgMTI1Mn0sCi0gICAgezB4NDgwYTIzMzgsIEwiQmVybGluU2Fuc0ZCRGVtaSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHg0ODBiZjdhNCwgTCJDb3VyaWVyU3RkIiwgTCJDb3VyaWVyIE5ldyxWZXJkYW5hIiwgMCwgMTI1Mn0sCi0gICAgezB4NDgxYWQ2ZWQsIEwiVmxhZGltaXJTY3JpcHQiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sCi0gICAgezB4NDkxMTU3N2EsIEwiWW91WXVhbiIsIEwiQXJpYWwiLCAxLCA5MzZ9LAotICAgIHsweDRhNzg4ZDcyLCBMIlNUWGluZ2thaSIsIEwiQXJpYWwiLCAwLCA5MzZ9LAotICAgIHsweDRiZjg4NTY2LCBMIlNlZ29lQ29uZGVuc2VkIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweDRjY2Y1MWE0LCBMIkJlcmxpblNhbnNGQi1SZWciLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4NGVhOTY3Y2UsIEwiR3VsaW1DaGUiLCBMIkFyaWFsIiwgMSwgMTI1Mn0sCi0gICAgezB4NGY2OGJkNzksIEwiTGV0dGVyR290aGljU3RkIiwgTCJDb3VyaWVyIE5ldyxWZXJkYW5hIiwgMCwgMTI1Mn0sCi0gICAgezB4NTFhMGQwZTYsIEwiS296dWthR290aGljUHI2Tk0iLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4NTMxYjNkZWEsIEwiQmFzZW1pY1N5bWJvbCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHg1MzMzZmQzOSwgTCJDYWxpZm9ybmlhbkZCLVJlZyIsIEwiQXJpYWwiLCAyLCAxMjUyfSwKLSAgICB7MHg1MzU2MWE1NCwgTCJGWllUSy0tR0JLMS0wIiwgTCJBcmlhbCIsIDAsIDkzNn0sCi0gICAgezB4NTVlMGRkZTYsIEwiTHVjaWRhU2Fuc1R5cGV3cml0ZXIiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4NTc0ZDRkM2QsIEwiQWRvYmVBcmFiaWMiLCBMIkFyaWFsIE5hcnJvdyIsIDAsIDEyNTJ9LAotICAgIHsweDU3OTJlNzU5LCBMIlNUS2FpdGkiLCBMIkFyaWFsIiwgMCwgOTM2fSwKLSAgICB7MHg1OTIxOTc4ZSwgTCJMdWNpZGFTYW5zVW5pY29kZSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHg1OTRlMmRhNCwgTCJWcmluZGEiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4NTliYWE5YTIsIEwiS2FpVGlfR0IyMzEyIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweDVjZmVkZjRmLCBMIkJhc2tPbGRGYWNlIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweDVmOTc5MjFjLCBMIkFkb2JlTXl1bmdqb1N0ZE0iLAotICAgICBMIkJhdGFuZyxCb29rbWFuIE9sZCBTdHlsZSxDb25zb2xhcyxTVFpob25nc29uZyIsIDAsIDkzNn0sCi0gICAgezB4NWZlZmJmYWQsIEwiQmF0YW5nIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAotICAgIHsweDYwNTM0MmI5LCBMIkRvdHVtQ2hlIiwgTCJBcmlhbCIsIDEsIDEyNTJ9LAotICAgIHsweDYwOGM1ZjlhLCBMIkthaVRpX0dCMjMxMiIsIEwiQXJpYWwiLCAwLCA5MzZ9LAotICAgIHsweDYxZWZkMGQxLCBMIk1hdHVyYU1UU2NyaXB0Q2FwaXRhbHMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4NjI2NjA4YTksIEwiTVZCb2xpIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweDYzMDUwMWEzLCBMIlNtYWxsRm9udHMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4NjVkMGUyYTksIEwiRlpZVEstLUdCSzEtMCIsIEwiQXJpYWwiLCAwLCA5MzZ9LAotICAgIHsweDY2OWYyOWUxLCBMIkZaU1RLLS1HQksxLTAiLCBMIkFyaWFsIiwgMCwgOTM2fSwKLSAgICB7MHg2NzNhOWU1ZiwgTCJUdW5nYSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHg2OTFhYTRjZSwgTCJOaWFnYXJhU29saWQiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4Njk2MjU5YjcsIEwiQ29yYmVsIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweDY5NmVlOWJlLCBMIlNUWGloZWkiLCBMIkFyaWFsIiwgMCwgOTM2fSwKLSAgICB7MHg2YzU5Y2Y2OSwgTCJEb3R1bSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHg3MDdmYTU2MSwgTCJHdW5nc3VoIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAotICAgIHsweDcxNDE2YmIyLCBMIlpXQWRvYmVGIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweDcxYjQxODAxLCBMIlZlcmRhbmEiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4NzNmMjVlNGMsIEwiUGFsYXRpbm9MaW5vdHlwZSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHg3M2Y0ZDE5ZiwgTCJOaWFnYXJhRW5ncmF2ZWQiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4NzQwMDE2OTQsIEwiTXlyaWFkUHJvQmxhY2siLCBMIkJvb2sgQW50aXF1YSxDb25zdGFudGlhLERvdHVtLEdlb3JnaWEiLCAwLAotICAgICAxMjUyfSwKLSAgICB7MHg3NGIxNGQ4ZiwgTCJIYWV0dGVuc2Nod2VpbGVyIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweDc0Y2I0NGVlLCBMIk5TaW1TdW4iLCBMIkFyaWFsIiwgMSwgOTM2fSwKLSAgICB7MHg3NmI0ZDdmZiwgTCJTaHJ1dGkiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4Nzg4YjM1MzMsIEwiV2ViZGluZ3MiLCBMIkFyaWFsIiwgNiwgNDJ9LAotICAgIHsweDc5N2RkZTk5LCBMIk1TU2VyaWYiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4N2EwZjllOWUsIEwiTVNNaW5jaG8iLCBMIkFyaWFsIiwgMSwgMTI1Mn0sCi0gICAgezB4N2I0MzljYWYsIEwiT2xkRW5nbGlzaFRleHRNVCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHg4MjEzYTQzMywgTCJMdWNpZGFTYW5zLVR5cGV3cml0ZXIiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4ODJmZWM5MjksIEwiQWRvYmVTb25nU3RkTCIsCi0gICAgIEwiQ2VudGF1cixDYWxpYnJpLFNUU29uZyxCZWxsIE1ULEdhcmFtb25kLFRpbWVzIE5ldyBSb21hbiIsIDAsIDkzNn0sCi0gICAgezB4ODM1ODE4MjUsIEwiTW9kZXJuIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweDgzNWEyODIzLCBMIkFsZ2VyaWFuIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweDgzZGFiOWY1LCBMIlNjcmlwdCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHg4NDdiNTZkYSwgTCJUYWhvbWEiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4OGE3ODNjYjIsIEwiU2ltU3VuLVBVQSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHg4YjVjYWMwZSwgTCJPbnl4IiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweDhjNmE0OTllLCBMIkd1bGltIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweDhlMGFmNzkwLCBMIkp1aWNlSVRDIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweDhlOGQ0M2IyLCBMIkNlbnRhdXIiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCi0gICAgezB4OGVlNGRjY2EsIEwiQm9va3NoZWxmU3ltYm9sNyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHg5MDc5NDgwMCwgTCJCZWxsR290aGljU3RkTGlnaHQiLCBMIkJlbGwgTVQsQ2FsaWJyaSxUaW1lcyBOZXcgUm9tYW4iLCAwLAotICAgICAxMjUyfSwKLSAgICB7MHg5MDliNTE2YSwgTCJDZW50dXJ5IiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAotICAgIHsweDkyYWUzNzBkLCBMIk1TT3V0bG9vayIsIEwiQXJpYWwiLCA0LCA0Mn0sCi0gICAgezB4OTNjOWZiZjEsIEwiTHVjaWRhRmF4IiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAotICAgIHsweDk1NjUwODVlLCBMIkJvb2tBbnRpcXVhIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAotICAgIHsweDk4NTZkOTVkLCBMIkFkb2JlTWluZ1N0ZEwiLCBMIkFyaWFsLEFyaWFsIFVuaWNvZGUgTVMsQ2FtYnJpYSxCYXRhbmdDaGUiLAotICAgICAwLCA5NDl9LAotICAgIHsweDliYmFkZDZiLCBMIkNvbG9ubmFNVCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHg5Y2JkMTZhNCwgTCJTaG93Y2FyZEdvdGhpYy1SZWciLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4OWQ3MzAwOGUsIEwiTVNTYW5zU2VyaWYiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4YTA2MDdkYjEsIEwiR3VuZ3N1aENoZSIsIEwiQXJpYWwiLCAxLCAxMjUyfSwKLSAgICB7MHhhMGJjZjZhMSwgTCJMYXRpbldpZGUiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCi0gICAgezB4YTE0MjliMzYsIEwiU3ltYm9sIiwgTCJBcmlhbCIsIDYsIDQyfSwKLSAgICB7MHhhMWZhNWFiYywgTCJXaW5nZGluZ3MyIiwgTCJBcmlhbCIsIDYsIDQyfSwKLSAgICB7MHhhMWZhNWFiZCwgTCJXaW5nZGluZ3MzIiwgTCJBcmlhbCIsIDYsIDQyfSwKLSAgICB7MHhhNDI3YmFkNCwgTCJJbmZvcm1hbFJvbWFuLVJlZ3VsYXIiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sCi0gICAgezB4YThiOTJlY2UsIEwiRlpTVEstLUdCSzEtMCIsIEwiQXJpYWwiLCAwLCA5MzZ9LAotICAgIHsweGE4ZDgzZWNlLCBMIkNhbGlmb3JuaWFuRkIiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCi0gICAgezB4YWEzZTA4MmMsIEwiS2luZ3NvZnQtUGhvbmV0aWMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4YWE2YmNhYmUsIEwiSGFybG93U29saWRJdGFsaWMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4YWRlNTMzN2MsIEwiTVNVSUdvdGhpYyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHhiMDhkZDk0MSwgTCJXaWRlTGF0aW4iLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCi0gICAgezB4YjIwN2YwNWQsIEwiUG9vclJpY2hhcmQiLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCi0gICAgezB4YjNiYzQ5MmYsIEwiSnVpY2VJVEMtUmVndWxhciIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHhiNTU0NTM5OSwgTCJNYXJsZXR0IiwgTCJBcmlhbCIsIDQsIDQyfSwKLSAgICB7MHhiNWRkMWViYiwgTCJCcml0YW5uaWNCb2xkIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweGI2OTljMWM1LCBMIkx1Y2lkYUNhbGxpZ3JhcGh5LUl0YWxpYyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHhiNzI1ZDYyOSwgTCJUaW1lc05ld1JvbWFuIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAotICAgIHsweGI3ZWFlYmViLCBMIkFkb2JlSGVpdGlTdGRSIiwgTCJCYXRhbmcsQ2VudHVyeSxEb3R1bSIsIDAsIDkzNn0sCi0gICAgezB4YmQyOWM0ODYsIEwiQmVybGluU2Fuc0ZCRGVtaS1Cb2xkIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweGJlOGE4ZGI0LCBMIkJvb2tzaGVsZlN5bWJvbFNldmVuIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweGMxNmMwMTE4LCBMIkFkb2JlSGVicmV3IiwgTCJCZWxsIE1ULEJlcmxpbiBTYW5zIEZCLENhbGlicmkiLCAwLCAxMjUyfSwKLSAgICB7MHhjMzE4YjBhZiwgTCJNeXJpYWRQcm9MaWdodCIsIEwiQ2FsaWJyaSxTVEZhbmdzb25nLFRpbWVzIE5ldyBSb21hbiIsIDAsCi0gICAgIDEyNTJ9LAotICAgIHsweGM2NWU1NjU5LCBMIkNhbWJyaWFNYXRoIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAotICAgIHsweGM3NWM4ZjA1LCBMIkx1Y2lkYUNvbnNvbGUiLCBMIkFyaWFsIiwgMSwgMTI1Mn0sCi0gICAgezB4Y2E3YzM1ZDYsIEwiQ2FsaWJyaSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHhjYjA1M2Y1MywgTCJNaWNyb3NvZnRZYUhlaSIsIEwiQXJpYWwiLCAwLCA5MzZ9LAotICAgIHsweGNiNzE5MGY5LCBMIk1hZ25ldG8tQm9sZCIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHhjY2EwMGNjNSwgTCJTeXN0ZW0iLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4Y2NhZDZmNzYsIEwiSm9rZXJtYW4tUmVndWxhciIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHhjY2M1ODE4YywgTCJFdXJvU2lnbiIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHhjZjNkNzIzNCwgTCJMdWNpZGFIYW5kd3JpdGluZy1JdGFsaWMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4Y2Y3YjhmZGIsIEwiTWluaW9uUHJvIiwKLSAgICAgTCJCZWxsIE1ULENvcmJlbCxUaW1lcyBOZXcgUm9tYW4sQ2FtYnJpYSxCZXJsaW4gU2FucyBGQiIsIDAsIDEyNTJ9LAotICAgIHsweGNmZTU3NTVmLCBMIlNpbWhlaSIsIEwiQXJpYWwiLCAxLCA5MzZ9LAotICAgIHsweGQwMTFmNGVlLCBMIk1TUEdvdGhpYyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHhkMDYwZTdlZiwgTCJWaXZhbGRpIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LAotICAgIHsweGQwN2VkZWMxLCBMIkZyYW5rbGluR290aGljLU1lZGl1bSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHhkMTA3MjQzZiwgTCJTaW1TdW4iLCBMIkFyaWFsIiwgMCwgOTM2fSwKLSAgICB7MHhkMTg4MTU2MiwgTCJBcmlhbE5hcnJvdyIsIEwiQXJpYWwgTmFycm93IiwgMCwgMTI1Mn0sCi0gICAgezB4ZDIyYjdkY2UsIEwiQm9kb25pTVRQb3N0ZXJDb21wcmVzc2VkIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweGQyMmJmYTYwLCBMIkNvbWljU2Fuc01TIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LAotICAgIHsweGQzYmQwZTM1LCBMIkJhdWhhdXM5MyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHhkNDI5ZWU3YSwgTCJTVEZhbmdzb25nIiwgTCJBcmlhbCIsIDAsIDkzNn0sCi0gICAgezB4ZDY2NzljMTIsIEwiQmVybmFyZE1UQ29uZGVuc2VkIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweGQ4ZThhMDI3LCBMIkx1Y2lkYVNhbnMiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4ZDlmZTc3NjEsIEwiSGlnaFRvd2VyVGV4dC1SZWciLCBMIkFyaWFsIiwgMiwgMTI1Mn0sCi0gICAgezB4ZGE3ZTU1MWUsIEwiU1RTb25nIiwgTCJBcmlhbCIsIDAsIDkzNn0sCi0gICAgezB4ZGFhNjg0MmQsIEwiU1RaaG9uZ3NvbmciLCBMIkFyaWFsIiwgMCwgOTM2fSwKLSAgICB7MHhkYWFhYjkzZiwgTCJTVEZhbmdzb25nIiwgTCJBcmlhbCIsIDAsIDkzNn0sCi0gICAgezB4ZGFlYjA3MTMsIEwiU1RTb25nIiwgTCJBcmlhbCIsIDAsIDkzNn0sCi0gICAgezB4ZGFmZWRiZWYsIEwiU1RDYWl5dW4iLCBMIkFyaWFsIiwgMCwgOTM2fSwKLSAgICB7MHhkYjAwYTNkOSwgTCJCcm9hZHdheSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHhkYjFmNWFkNCwgTCJTVFhpbndlaSIsIEwiQXJpYWwiLCAwLCA5MzZ9LAotICAgIHsweGRiMzI2ZTdmLCBMIlNUS2FpdGkiLCBMIkFyaWFsIiwgMCwgOTM2fSwKLSAgICB7MHhkYjY5NTk1YSwgTCJTVEh1cG8iLCBMIkFyaWFsIiwgMCwgOTM2fSwKLSAgICB7MHhkYmEwMDgyYywgTCJTVFhpaGVpIiwgTCJBcmlhbCIsIDAsIDkzNn0sCi0gICAgezB4ZGJkMGFiMTgsIEwiU1RYaW5na2FpIiwgTCJBcmlhbCIsIDAsIDkzNn0sCi0gICAgezB4ZGMxYTdkYjEsIEwiU1RMaXRpIiwgTCJBcmlhbCIsIDAsIDkzNn0sCi0gICAgezB4ZGMzMzA3NWYsIEwiS3Jpc3RlbklUQy1SZWd1bGFyIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LAotICAgIHsweGRjYzcwMDljLCBMIkhhcnJpbmd0b24iLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4ZGQ3MTI0NjYsIEwiQXJpYWxCbGFjayIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHhkZGU4N2IzZSwgTCJJbXBhY3QiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4ZGY2OWZiMzIsIEwiU25hcElUQyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHhkZjhiMjVlOCwgTCJDZW50dXJ5R290aGljIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweGUwZjcwNWMwLCBMIktyaXN0ZW5JVEMiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sCi0gICAgezB4ZTE0Mjc1NzMsIEwiUmFhdmkiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4ZTJjZWEwY2IsIEwiTWFnbmV0byIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHhlMzZhOWUxNywgTCJSYXZpZSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHhlNDMzZjhlMiwgTCJQYXJjaG1lbnQiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sCi0gICAgezB4ZTQzZGZmNGEsIEwiV2luZ2RpbmdzIiwgTCJBcmlhbCIsIDQsIDQyfSwKLSAgICB7MHhlNGUyYzQwNSwgTCJNVEV4dHJhIiwgTCJBcmlhbCIsIDYsIDQyfSwKLSAgICB7MHhlNjE4Y2MzNSwgTCJJbmZvcm1hbFJvbWFuIiwgTCJBcmlhbCIsIDgsIDEyNTJ9LAotICAgIHsweGU2YzI3ZmZjLCBMIk1pc3RyYWwiLCBMIkFyaWFsIiwgOCwgMTI1Mn0sCi0gICAgezB4ZTdlYmY0YjksIEwiQ291cmllciIsIEwiQ291cmllciBOZXciLCAwLCAxMjUyfSwKLSAgICB7MHhlOGJjNGE5ZCwgTCJNU1JlZmVyZW5jZVNwZWNpYWx0eSIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHhlOTBmYjAxMywgTCJUZW1wdXNTYW5zSVRDIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweGVjNjM3YjQyLCBMIkNvbnNvbGFzIiwgTCJWZXJkYW5hIiwgMSwgMTI1Mn0sCi0gICAgezB4ZWQzYTY4M2IsIEwiU1RYaW53ZWkiLCBMIkFyaWFsIiwgMCwgOTM2fSwKLSAgICB7MHhlZjI2NGNkMSwgTCJMdWNpZGFIYW5kd3JpdGluZyIsIEwiQXJpYWwiLCAwLCAxMjUyfSwKLSAgICB7MHhmMDg2YmNhMiwgTCJCYXNrZXJ2aWxsZU9sZEZhY2UiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4ZjEwMjgwMzAsIEwiTWFuZ2FsIiwgTCJBcmlhbCIsIDIsIDEyNTJ9LAotICAgIHsweGYxZGE3ZWI5LCBMIlNob3djYXJkR290aGljIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweGYyMTBmMDZhLCBMIkFyaWFsTVQiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4ZjQ3N2YxNmEsIEwiTGF0aGEiLCBMIkFyaWFsIiwgMCwgMTI1Mn0sCi0gICAgezB4ZjYxNmYzZGQsIEwiTGlTdSIsIEwiQXJpYWwiLCAxLCA5MzZ9LAotICAgIHsweGZhNDc5YWE2LCBMIk1pY3Jvc29mdFlhSGVpIiwgTCJBcmlhbCIsIDAsIDkzNn0sCi0gICAgezB4ZmNkMTk2OTcsIEwiQm9va21hbk9sZFN0eWxlIiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweGZlMjA5YTgyLCBMIkx1Y2lkYUNhbGxpZ3JhcGh5IiwgTCJBcmlhbCIsIDAsIDEyNTJ9LAotICAgIHsweGZlZjEzNWY4LCBMIkFkb2JlSGVpdGlTdGQtUmVndWxhciIsIEwiQmF0YW5nLENlbnR1cnksRG90dW0iLCAwLCA5MzZ9LAotfTsKLSNlbGlmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fTElOVVhfCi1jb25zdCBYRkFfRk9OVElORk8gZ19YRkFGb250c01hcFtdID0gewotICAgIHsweDAxZDVkMzNlLCBMIlNpbVN1biIsCi0gICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyxBUiAiCi0gICAgIEwiUEwgVU1pbmcgVFcgTUJFIiwKLSAgICAgMCwgOTM2fSwKLSAgICB7MHgwMWU0ZjEwMiwgTCJZb3VZdWFuIiwKLSAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXLEFSICIKLSAgICAgTCJQTCBVTWluZyBUVyBNQkUiLAotICAgICAxLCA5MzZ9LAotICAgIHsweDAzMDU0OWRjLCBMIkxpU3UiLAotICAgICBMIldlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwLFdlblF1YW5ZaSBaZW4gSGVpICIKLSAgICAgTCJNb25vLFdlblF1YW5ZaSBNaWNybyBIZWkiLAotICAgICAxLCA5MzZ9LAotICAgIHsweDAzMmVkZDQ0LCBMIlNpbWhlaSIsCi0gICAgIEwiV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAsV2VuUXVhbllpIFplbiBIZWkgIgotICAgICBMIk1vbm8sV2VuUXVhbllpIE1pY3JvIEhlaSIsCi0gICAgIDEsIDkzNn0sCi0gICAgezB4MDNlYWM2ZmMsIEwiUG9vclJpY2hhcmQtUmVndWxhciIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYiLCAyLAotICAgICAxMjUyfSwKLSAgICB7MHgwM2VkOTBlNiwgTCJOaW5hIiwgTCJGcmVlU2VyaWYiLCAwLCAxMjUyfSwKLSAgICB7MHgwNzdiNTZiMywgTCJLaW5nc29mdFBob25ldGljUGxhaW4iLAotICAgICBMIlRpYmV0YW4gTWFjaGluZSBVbmksTEtMVUcsU2FteWFrIEd1amFyYXRpLERyb2lkIFNhbnMgVGhhaSxEcm9pZCBTYW5zICIKLSAgICAgTCJBcm1lbmlhbixVbnRpdGxlZDEsdXRrYWwsTG9oaXQgT3JpeWEiLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHgwNzhlZDUyNCwgTCJNaWNyb3NvZnRTYW5zU2VyaWYiLAotICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNlcmlmLFdlblF1YW5ZaSBNaWNybyBIZWkiLCAwLCAxMjUyfSwKLSAgICB7MHgwODliMThhOSwgTCJBcmlhbCIsCi0gICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyBDb25kZW5zZWQsRnJlZVNlcmlmLFdlblF1YW5ZaSBNaWNybyBIZWkiLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHgwYjJjYWQ3MiwgTCJNb25vdHlwZUNvcnNpdmEiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNlcmlmIiwgOCwgMTI1Mn0sCi0gICAgezB4MGJiMDAzZTcsIEwiS2FydGlrYSIsCi0gICAgIEwiRnJlZVNhbnMsTGliZXJhdGlvbiBTYW5zLExpYmVyYXRpb24gU2FucyBOYXJyb3csTmltYnVzIFNhbnMgIgotICAgICBMIkwsR2FydWRhLEZyZWVTZXJpZixXZW5RdWFuWWkgTWljcm8gSGVpIiwKLSAgICAgMiwgMTI1Mn0sCi0gICAgezB4MGJiNDY5ZGYsIEwiVmluZXJIYW5kSVRDIiwKLSAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLFVidW50dSxMaWJlcmF0aW9uIFNhbnMsTGliZXJhdGlvbiBTZXJpZiIsIDgsIDEyNTJ9LAotICAgIHsweDBiYzFhODUxLCBMIlNlZ29lVUkiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMiLCAwLCAxMjUyfSwKLSAgICB7MHgwYzExMmViZCwgTCJLb3p1a2FHb3RoaWNQcm8tVklNIiwgTCJGcmVlU2VyaWYiLCAwLCAxMjUyfSwKLSAgICB7MHgwY2ZjYjljMSwgTCJBZG9iZVRoYWkiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsV2FyZWUiLCAwLCA4NDd9LAotICAgIHsweDBlN2RlMGY5LCBMIlBsYXliaWxsIiwKLSAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCAiCi0gICAgIEwiU2FucyBFdGhpb3BpYyxEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZiIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweDBlZmY0N2MzLCBMIlNUSHVwbyIsIEwiQVIgUEwgVUthaSBISyxBUiBQTCBVTWluZyBISyxBUiBQTCBVS2FpIENOIiwgMCwKLSAgICAgOTM2fSwKLSAgICB7MHgxMDdhZDM3NCwgTCJDb25zdGFudGlhIiwKLSAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZixXZW5RdWFuWWkgTWljcm8gSGVpLFVidW50dSIsIDIsIDEyNTJ9LAotICAgIHsweDEyMTk0YzJkLCBMIkt1bnN0bGVyU2NyaXB0IiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2VyaWYiLCA4LAotICAgICAxMjUyfSwKLSAgICB7MHgxMzVlZjZhMSwgTCJNaW5pb25Qcm9TbUJkIiwgTCJMaWJlcmF0aW9uIFNlcmlmIiwgMCwgMTI1Mn0sCi0gICAgezB4MTU4YzQwNDksIEwiR2FyYW1vbmQiLAotICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZixVYnVudHUsRnJlZVNlcmlmIiwgMiwgMTI1Mn0sCi0gICAgezB4MTYwZWNiMjQsIEwiU1RaaG9uZ3NvbmciLAotICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIgotICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAotICAgICAwLCA5MzZ9LAotICAgIHsweDE2MWVkMDdlLCBMIk1TR290aGljIiwKLSAgICAgTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxBUiBQTCAiCi0gICAgIEwiVU1pbmcgQ04sQVIgUEwgVU1pbmcgSEssQVIgUEwgVU1pbmcgVFciLAotICAgICAxLCAxMjUyfSwKLSAgICB7MHgxNzFkMWVkMSwgTCJTbmFwSVRDLVJlZ3VsYXIiLAotICAgICBMIkxpYmVyYXRpb24gU2FucyBOYXJyb3csVWJ1bnR1IENvbmRlbnNlZCxOaW1idXMgU2FucyBMLERlamFWdSBTYW5zIiwgMCwKLSAgICAgMTI1Mn0sCi0gICAgezB4MThkMTE4OGYsIEwiQ2FtYnJpYSIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYsRnJlZU1vbm8iLCAyLAotICAgICAxMjUyfSwKLSAgICB7MHgxOGVhZjM1MCwgTCJBcmlhbFVuaWNvZGVNUyIsCi0gICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiCi0gICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCi0gICAgIDAsIDkzNn0sCi0gICAgezB4MWE5MmQxMTUsIEwiTWluZ0xpVSIsCi0gICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiCi0gICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCi0gICAgIDEsIDEyNTJ9LAotICAgIHsweDFjYzIxN2M2LCBMIlRyZWJ1Y2hldE1TIiwKLSAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2VyaWYsRnJlZVNlcmlmLFVidW50dSIsIDAsIDEyNTJ9LAotICAgIHsweDFkNjQ5NTk2LCBMIkJhc2VtaWNUaW1lcyIsCi0gICAgIEwiTGliZXJhdGlvbiBTZXJpZixUaW1lcyBOZXcgUm9tYW4sRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYsVWJ1bnR1IiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4MWUzNGVlNjAsIEwiQmVsbE1UIiwKLSAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxVYnVudHUsTGliZXJhdGlvbiBTZXJpZiIsIDIsIDEyNTJ9LAotICAgIHsweDFlYjM2OTQ1LCBMIkNvb3BlckJsYWNrIiwKLSAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlTW9ubyxMaWJlcmF0aW9uIE1vbm8sIFdlblF1YW5ZaSBNaWNybyAiCi0gICAgIEwiSGVpIE1vbm8iLAotICAgICAyLCAxMjUyfSwKLSAgICB7MHgxZWY3Nzg3ZCwgTCJCYXRhbmdDaGUiLAotICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgSEssQVIgUEwgVU1pbmcgIgotICAgICBMIlRXLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBNaWNybyBIZWkiLAotICAgICAxLCAxMjUyfSwKLSAgICB7MHgyMGIzYmQzYSwgTCJCcnVzaFNjcmlwdE1UIiwKLSAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2FucyAiCi0gICAgIEwiSmFwYW5lc2UsVVJXIENoYW5jZXJ5IEwsTGliZXJhdGlvbiBTYW5zIiwKLSAgICAgOCwgMTI1Mn0sCi0gICAgezB4MjIwODc3YWEsIEwiQ2FuZGFyYSIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyIsIDAsIDEyNTJ9LAotICAgIHsweDIyMTM1MDA3LCBMIkZyZWVzdHlsZVNjcmlwdC1SZWd1bGFyIiwKLSAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMiLCA4LCAxMjUyfSwKLSAgICB7MHgyNTEwNTljMywgTCJDaGlsbGVyIiwKLSAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2FucyAiCi0gICAgIEwiSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zIiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4MjViZWQ2ZGQsIEwiTVNSZWZlcmVuY2VTYW5zU2VyaWYiLAotICAgICBMIkRlamFWdSBTYW5zIENvbmRlbnNlZCxVYnVudHUgQ29uZGVuc2VkLERyb2lkIFNhbnMgSmFwYW5lc2UsQVIgUEwgVUthaSAiCi0gICAgIEwiSEsiLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHgyODE1NGM4MSwgTCJQYXJjaG1lbnQtUmVndWxhciIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMiLAotICAgICA4LCAxMjUyfSwKLSAgICB7MHgyOTcxMWViOSwgTCJTVExpdGkiLCBMIkFSIFBMIFVLYWkgSEsiLCAwLCA5MzZ9LAotICAgIHsweDJiMTk5M2I0LCBMIkJhc2VtaWMiLAotICAgICBMIkxpYmVyYXRpb24gU2VyaWYsRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMiLCAwLCAxMjUyfSwKLSAgICB7MHgyYjMxNjMzOSwgTCJOaWFnYXJhU29saWQtUmVnIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsIDAsCi0gICAgIDEyNTJ9LAotICAgIHsweDJjMTQ3NTI5LCBMIkZvb3RsaWdodE1UTGlnaHQiLAotICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsIDAsIDEyNTJ9LAotICAgIHsweDJjMTk4OTI4LCBMIkhhcmxvd1NvbGlkIiwKLSAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMiLCAwLCAxMjUyfSwKLSAgICB7MHgyYzZhYzZiMiwgTCJMdWNpZGFCcmlnaHQiLAotICAgICBMIkthY3N0UXVybixEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERyb2lkICIKLSAgICAgTCJTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsCi0gICAgIDIsIDEyNTJ9LAotICAgIHsweDJjOWYzOGUyLCBMIktvenVrYU1pbmNob1Byby1WSVIiLCBMIkRlamFWdSBTYW5zIiwgMCwgMTI1Mn0sCi0gICAgezB4MmQ1YTQ3YjAsIEwiU1RDYWl5dW4iLCBMIkFSIFBMIFVLYWkgSEsiLCAwLCA5MzZ9LAotICAgIHsweDJkZWYyNmJmLCBMIkJlcm5hcmRNVC1Db25kZW5zZWQiLAotICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTZXJpZiIsIDAsIDEyNTJ9LAotICAgIHsweDJmZDg5MzBiLCBMIktvenVrYU1pbmNob1ByNk5SIiwgTCJEZWphVnUgU2VyaWYiLCAwLCAxMjUyfSwKLSAgICB7MHgzMTE1NTI1YSwgTCJGYW5nU29uZ19HQjIzMTIiLAotICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIgotICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHgzMTMyNzgxNywgTCJNeXJpYWRQcm8iLAotICAgICBMIlVidW50dSBDb25kZW5zZWQsRHJvaWQgU2FucyBKYXBhbmVzZSwgRnJlZVNlcmlmIiwgMCwgMTI1Mn0sCi0gICAgezB4MzIyNDQ5NzUsIEwiSGVsdmV0aWNhIiwKLSAgICAgTCJVYnVudHUsRGVqYVZ1IFNhbnMgQ29uZGVuc2VkLExpYmVyYXRpb24gU2FucyxMaWJlcmF0aW9uIFNhbnMgIgotICAgICBMIk5hcnJvdyxOaW1idXMgU2FucyBMIiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4MzJhYzk5NWMsIEwiVGVybWluYWwiLCBMIkRlamFWdSBTZXJpZiIsIDAsIDEyNTJ9LAotICAgIHsweDMzOGQ2NDhhLCBMIk5pYWdhcmFFbmdyYXZlZC1SZWciLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwgMCwKLSAgICAgMTI1Mn0sCi0gICAgezB4MzNiYjY1ZjIsIEwiU3lsZmFlbiIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyIsIDIsIDEyNTJ9LAotICAgIHsweDM0MDJjMzBlLCBMIk1TUE1pbmNobyIsCi0gICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyIsIDIsCi0gICAgIDEyNTJ9LAotICAgIHsweDM0MTJiZjMxLCBMIlNpbVN1bi1QVUEiLAotICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgSEsiLCAwLAotICAgICA5MzZ9LAotICAgIHsweDM2ZWIzOWI5LCBMIkJlcmxpblNhbnNGQiIsCi0gICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNlcmlmLFVidW50dSxGcmVlU2VyaWYiLCAwLCAxMjUyfSwKLSAgICB7MHgzNmY0MjA1NSwgTCJVbml2ZXJzQVRUIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZiIsIDAsIDEyNTJ9LAotICAgIHsweDM4NjRjNGY2LCBMIkhpZ2hUb3dlclRleHQiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwgMiwKLSAgICAgMTI1Mn0sCi0gICAgezB4M2EyNTdkMDMsIEwiRmFuZ1NvbmdfR0IyMzEyIiwKLSAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpIiwgMCwgMTI1Mn0sCi0gICAgezB4M2M3ZDFkMDcsIEwiR2FyYW1vbmQzTFRTdGQiLAotICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsVWJ1bnR1IENvbmRlbnNlZCxEZWphVnUgU2FucyBDb25kZW5zZWQsTGliZXJhdGlvbiAiCi0gICAgIEwiU2VyaWYsVWJ1bnR1LEZyZWVTZXJpZiIsCi0gICAgIDIsIDEyNTJ9LAotICAgIHsweDNjZGFlNjY4LCBMIkZyZWVzdHlsZVNjcmlwdCIsCi0gICAgIEwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMiLCA4LCAxMjUyfSwKLSAgICB7MHgzZDU1YWVkNywgTCJKb2tlcm1hbiIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyIsIDAsIDEyNTJ9LAotICAgIHsweDNkNWI0Mzg1LCBMIlBNaW5nTGlVIiwKLSAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICIKLSAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwKLSAgICAgMiwgMTI1Mn0sCi0gICAgezB4M2Q5Yjc2NjksIEwiRXN0cmFuZ2Vsb0VkZXNzYSIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyIsIDAsCi0gICAgIDEyNTJ9LAotICAgIHsweDNlNTMyZDc0LCBMIkZyYW5rbGluR290aGljTWVkaXVtIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLFVidW50dSIsIDAsCi0gICAgIDEyNTJ9LAotICAgIHsweDNlNmFhMzJkLCBMIk5TaW1TdW4iLAotICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIgotICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAotICAgICAxLCA5MzZ9LAotICAgIHsweDNmNmMzNmE4LCBMIkdhdXRhbWkiLAotICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLCBtcnlfS2Fjc3RRdXJuLERyb2lkIFNhbnMgIgotICAgICBMIkphcGFuZXNlLEZyZWVTYW5zIiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4M2ZmMzI2NjIsIEwiQ2hpbGxlci1SZWd1bGFyIiwKLSAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRnJlZVNhbnMiLCAwLCAxMjUyfSwKLSAgICB7MHg0MDlkZTMxMiwgTCJNb2Rlcm5Oby4yMCIsCi0gICAgIEwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsTmltYnVzIFNhbnMgTCxOaW1idXMgU2FucyBMLEZyZWVTYW5zIiwgMiwKLSAgICAgMTI1Mn0sCi0gICAgezB4NDE0NDNjNWUsIEwiR2VvcmdpYSIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2FucyIsIDIsIDEyNTJ9LAotICAgIHsweDQxNjBhZGU1LCBMIkJlbGxHb3RoaWNTdGRCbGFjayIsIEwiRnJlZVNhbnMiLCAwLCAxMjUyfSwKLSAgICB7MHg0MjE5NzZjNCwgTCJNb2Rlcm4tUmVndWxhciIsIEwiRnJlZVNhbnMiLCAyLCAxMjUyfSwKLSAgICB7MHg0MjJhNzI1MiwgTCJTdGVuY2lsIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTYW5zLExpYmVyYXRpb24gU2FucyIsIDAsCi0gICAgIDEyNTJ9LAotICAgIHsweDQyYzg1NTRmLCBMIkZpeGVkc3lzIiwgTCJGcmVlU2VyaWYiLCAwLCAxMjUyfSwKLSAgICB7MHg0MzVjYjQxZCwgTCJSb21hbiIsIEwiRnJlZVNlcmlmIiwgMCwgMTI1Mn0sCi0gICAgezB4NDc4ODIzODMsIEwiQ291cmllck5ldyIsCi0gICAgIEwiRnJlZU1vbm8sV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vLEFSIFBMIFVLYWkgQ04sQVIgUEwgVUthaSBISyxBUiBQTCAiCi0gICAgIEwiVUthaSBUVyxBUiBQTCBVS2FpIFRXIE1CRSxEZWphVnUgU2FucyIsCi0gICAgIDEsIDEyNTJ9LAotICAgIHsweDQ4MGEyMzM4LCBMIkJlcmxpblNhbnNGQkRlbWkiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZiIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweDQ4MGJmN2E0LCBMIkNvdXJpZXJTdGQiLCBMIkRlamFWdSBTYW5zIiwgMCwgMTI1Mn0sCi0gICAgezB4NDgxYWQ2ZWQsIEwiVmxhZGltaXJTY3JpcHQiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwgOCwKLSAgICAgMTI1Mn0sCi0gICAgezB4NDkxMTU3N2EsIEwiWW91WXVhbiIsCi0gICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyIsIDEsCi0gICAgIDkzNn0sCi0gICAgezB4NGE3ODhkNzIsIEwiU1RYaW5na2FpIiwgTCJBUiBQTCBVS2FpIEhLLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVLYWkgQ04iLCAwLAotICAgICA5MzZ9LAotICAgIHsweDRiZjg4NTY2LCBMIlNlZ29lQ29uZGVuc2VkIiwgTCJGcmVlU2VyaWYiLCAwLCAxMjUyfSwKLSAgICB7MHg0Y2NmNTFhNCwgTCJCZXJsaW5TYW5zRkItUmVnIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2VyaWYiLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHg0ZWE5NjdjZSwgTCJHdWxpbUNoZSIsCi0gICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVS2FpIENOLEFSIFBMIFVLYWkgSEssQVIgUEwgVUthaSBUVyxBUiBQTCAiCi0gICAgIEwiVUthaSBUVyBNQkUiLAotICAgICAxLCAxMjUyfSwKLSAgICB7MHg0ZjY4YmQ3OSwgTCJMZXR0ZXJHb3RoaWNTdGQiLAotICAgICBMIkZyZWVNb25vLExpYmVyYXRpb24gTW9ubyxBbmRhbGUgTW9ubyxXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8iLCAwLCAxMjUyfSwKLSAgICB7MHg1MWEwZDBlNiwgTCJLb3p1a2FHb3RoaWNQcjZOTSIsIEwiRnJlZVNlcmlmIiwgMCwgMTI1Mn0sCi0gICAgezB4NTMxYjNkZWEsIEwiQmFzZW1pY1N5bWJvbCIsIEwiRnJlZVNlcmlmIiwgMCwgMTI1Mn0sCi0gICAgezB4NTMzM2ZkMzksIEwiQ2FsaWZvcm5pYW5GQi1SZWciLAotICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsVVJXIENoYW5jZXJ5IEwsRnJlZVNlcmlmIiwgMiwgMTI1Mn0sCi0gICAgezB4NTM1NjFhNTQsIEwiRlpZVEstLUdCSzEtMCIsCi0gICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiCi0gICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCi0gICAgIDAsIDkzNn0sCi0gICAgezB4NTVlMGRkZTYsIEwiTHVjaWRhU2Fuc1R5cGV3cml0ZXIiLAotICAgICBMIlVidW50dSBNb25vLERlamFWdSBTYW5zIE1vbm8sTmltYnVzIE1vbm8gTCxMaWJlcmF0aW9uIE1vbm8sQ291cmllciAxMCAiCi0gICAgIEwiUGl0Y2gsRnJlZU1vbm8iLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHg1NzRkNGQzZCwgTCJBZG9iZUFyYWJpYyIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyIsIDAsIDEyNTJ9LAotICAgIHsweDU3OTJlNzU5LCBMIlNUS2FpdGkiLCBMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyIsIDAsIDkzNn0sCi0gICAgezB4NTkyMTk3OGUsIEwiTHVjaWRhU2Fuc1VuaWNvZGUiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMiLCAwLAotICAgICAxMjUyfSwKLSAgICB7MHg1OTRlMmRhNCwgTCJWcmluZGEiLAotICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIEFyYWJpYyAiCi0gICAgIEwiTmFza2gsbXJ5X0thY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTYW5zLEZyZWVTZXJpZiIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweDU5YmFhOWEyLCBMIkthaVRpX0dCMjMxMiIsCi0gICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiCi0gICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweDVjZmVkZjRmLCBMIkJhc2tPbGRGYWNlIiwKLSAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxVYnVudHUsTGliZXJhdGlvbiBTZXJpZiIsIDAsIDEyNTJ9LAotICAgIHsweDVlMTZhYzkxLCBMIlRyYWphblBybyIsCi0gICAgIEwiTmltYnVzIFNhbnMgTCxBUiBQTCBVTWluZyBISyxBUiBQTCBVS2FpIEhLLEFSIFBMIFVNaW5nIFRXLEFSIFBMIFVNaW5nICIKLSAgICAgTCJUVyBNQkUsRGVqYVZ1IFNhbnMsRGVqYVZ1IFNlcmlmIiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4NWYzODgxOTYsIEwiSVRDTGVnYWN5U2Fuc1N0ZE1lZGl1bSIsCi0gICAgIEwiTGliZXJhdGlvbiBTZXJpZixGcmVlU2VyaWYsRnJlZVNhbnMsVWJ1bnR1IiwgMCwgMTI1Mn0sCi0gICAgezB4NWY5NzkyMWMsIEwiQWRvYmVNeXVuZ2pvU3RkTSIsCi0gICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiCi0gICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCi0gICAgIDAsIDkzNn0sCi0gICAgezB4NWZlZmJmYWQsIEwiQmF0YW5nIiwKLSAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICIKLSAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwKLSAgICAgMiwgMTI1Mn0sCi0gICAgezB4NjA1MzQyYjksIEwiRG90dW1DaGUiLAotICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgSEssQVIgUEwgVU1pbmcgVFciLCAxLAotICAgICAxMjUyfSwKLSAgICB7MHg2MDhjNWY5YSwgTCJLYWlUaV9HQjIzMTIiLAotICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIgotICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAotICAgICAwLCA5MzZ9LAotICAgIHsweDYxZWZkMGQxLCBMIk1hdHVyYU1UU2NyaXB0Q2FwaXRhbHMiLAotICAgICBMIkthY3N0UXVybixEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERyb2lkICIKLSAgICAgTCJTYW5zIEphcGFuZXNlLERlamFWdSBTZXJpZixEZWphVnUgU2FucyIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweDYyNjYwOGE5LCBMIk1WQm9saSIsCi0gICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCBTYW5zICIKLSAgICAgTCJFdGhpb3BpYyxEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4NjMwNTAxYTMsIEwiU21hbGxGb250cyIsIEwiRGVqYVZ1IFNlcmlmIiwgMCwgMTI1Mn0sCi0gICAgezB4NjVkMGUyYTksIEwiRlpZVEstLUdCSzEtMCIsCi0gICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiCi0gICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCi0gICAgIDAsIDkzNn0sCi0gICAgezB4NjY5ZjI5ZTEsIEwiRlpTVEstLUdCSzEtMCIsCi0gICAgIEwiQVIgUEwgVU1pbmcgQ04sQVIgUEwgVUthaSBDTiwgQVIgUEwgVU1pbmcgSEsiLCAwLCA5MzZ9LAotICAgIHsweDY3M2E5ZTVmLCBMIlR1bmdhIiwKLSAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERyb2lkIFNhbnMgIgotICAgICBMIkphcGFuZXNlLERlamFWdSBTZXJpZiIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweDY5MWFhNGNlLCBMIk5pYWdhcmFTb2xpZCIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLCAwLCAxMjUyfSwKLSAgICB7MHg2OTYyNTliNywgTCJDb3JiZWwiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNhbnMiLCAwLCAxMjUyfSwKLSAgICB7MHg2OTZlZTliZSwgTCJTVFhpaGVpIiwgTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8iLCAwLCA5MzZ9LAotICAgIHsweDZjNTljZjY5LCBMIkRvdHVtIiwgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vIiwgMCwgMTI1Mn0sCi0gICAgezB4NzA3ZmE1NjEsIEwiR3VuZ3N1aCIsIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyIsIDIsIDEyNTJ9LAotICAgIHsweDcxNDE2YmIyLCBMIlpXQWRvYmVGIiwKLSAgICAgTCJLYWNzdEFydCxLYWNzdEJvb2ttLEthY3N0RGVjb3JhdGl2ZSxLYWNzdERpZ2l0YWwsS2Fjc3RGYXJzaSxLYWNzdExldHRlciwiCi0gICAgIEwiS2Fjc3RPZmZpY2UsRGluZ2JhdHMsRnJlZVNlcmlmIiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4NzFiNDE4MDEsIEwiVmVyZGFuYSIsCi0gICAgIEwiRGVqYVZ1IFNhbnMgQ29uZGVuc2VkLFVidW50dSBDb25kZW5zZWQsRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweDczZjI1ZTRjLCBMIlBhbGF0aW5vTGlub3R5cGUiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRnJlZVNlcmlmIiwgMCwKLSAgICAgMTI1Mn0sCi0gICAgezB4NzNmNGQxOWYsIEwiTmlhZ2FyYUVuZ3JhdmVkIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZiIsIDAsIDEyNTJ9LAotICAgIHsweDc0MDAxNjk0LCBMIk15cmlhZFByb0JsYWNrIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLEFSIFBMIFVLYWkgSEsiLCAwLAotICAgICAxMjUyfSwKLSAgICB7MHg3NGIxNGQ4ZiwgTCJIYWV0dGVuc2Nod2VpbGVyIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTZXJpZiIsIDAsCi0gICAgIDEyNTJ9LAotICAgIHsweDc0Y2I0NGVlLCBMIk5TaW1TdW4iLCBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8iLCAxLCA5MzZ9LAotICAgIHsweDc2YjRkN2ZmLCBMIlNocnV0aSIsCi0gICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCBTYW5zICIKLSAgICAgTCJKYXBhbmVzZSxGcmVlU2FucyIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweDc4OGIzNTMzLCBMIldlYmRpbmdzIiwgTCJGcmVlU2FucyIsIDYsIDQyfSwKLSAgICB7MHg3OTdkZGU5OSwgTCJNU1NlcmlmIiwgTCJGcmVlU2FucyIsIDAsIDEyNTJ9LAotICAgIHsweDdhMGY5ZTllLCBMIk1TTWluY2hvIiwKLSAgICAgTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgSEssQVIgUEwgVU1pbmcgVFciLAotICAgICAxLCAxMjUyfSwKLSAgICB7MHg3YjQzOWNhZiwgTCJPbGRFbmdsaXNoVGV4dE1UIiwKLSAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyxVYnVudHUiLCAwLCAxMjUyfSwKLSAgICB7MHg4MjEzYTQzMywgTCJMdWNpZGFTYW5zLVR5cGV3cml0ZXIiLAotICAgICBMIlVidW50dSBNb25vLExpYmVyYXRpb24gTW9ubyxEZWphVnUgU2FucyBNb25vIiwgMCwgMTI1Mn0sCi0gICAgezB4ODJmZWM5MjksIEwiQWRvYmVTb25nU3RkTCIsCi0gICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiCi0gICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCi0gICAgIDAsIDkzNn0sCi0gICAgezB4ODM1ODE4MjUsIEwiTW9kZXJuIiwgTCJGcmVlU2FucyIsIDAsIDEyNTJ9LAotICAgIHsweDgzNWEyODIzLCBMIkFsZ2VyaWFuIiwKLSAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2FucyxMaWJlcmF0aW9uIFNhbnMsVWJ1bnR1IiwgMCwgMTI1Mn0sCi0gICAgezB4ODNkYWI5ZjUsIEwiU2NyaXB0IiwgTCJGcmVlU2FucyIsIDAsIDEyNTJ9LAotICAgIHsweDg0N2I1NmRhLCBMIlRhaG9tYSIsCi0gICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyBDb25kZW5zZWQsRnJlZVNlcmlmIiwgMCwgMTI1Mn0sCi0gICAgezB4OGE3ODNjYjIsIEwiU2ltU3VuLVBVQSIsCi0gICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSxXZW5RdWFuWWkgWmVuIEhlaSAiCi0gICAgIEwiU2hhcnAsV2VuUXVhbllpIE1pY3JvIEhlaSIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweDhiNWNhYzBlLCBMIk9ueXgiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zIiwgMCwgMTI1Mn0sCi0gICAgezB4OGM2YTQ5OWUsIEwiR3VsaW0iLAotICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIgotICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHg4ZTBhZjc5MCwgTCJKdWljZUlUQyIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNhbnMiLCAwLCAxMjUyfSwKLSAgICB7MHg4ZThkNDNiMiwgTCJDZW50YXVyIiwKLSAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxLaG1lciBPUyxLaG1lciBPUyBTeXN0ZW0iLCAyLCAxMjUyfSwKLSAgICB7MHg4ZWU0ZGNjYSwgTCJCb29rc2hlbGZTeW1ib2w3IiwgTCJMaWJlcmF0aW9uIFNhbnMiLCAwLCAxMjUyfSwKLSAgICB7MHg5MDc5NDgwMCwgTCJCZWxsR290aGljU3RkTGlnaHQiLCBMIkxpYmVyYXRpb24gU2FucyIsIDAsIDEyNTJ9LAotICAgIHsweDkwOWI1MTZhLCBMIkNlbnR1cnkiLAotICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zLExpYmVyYXRpb24gTW9ubyxMaWJlcmF0aW9uIFNlcmlmIiwgMiwKLSAgICAgMTI1Mn0sCi0gICAgezB4OTJhZTM3MGQsIEwiTVNPdXRsb29rIiwgTCJMaWJlcmF0aW9uIFNhbnMiLCA0LCA0Mn0sCi0gICAgezB4OTNjOWZiZjEsIEwiTHVjaWRhRmF4IiwKLSAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgIgotICAgICBMIkV0aGlvcGljLG1yeV9LYWNzdFF1cm4sTGliZXJhdGlvbiBTYW5zIiwKLSAgICAgMiwgMTI1Mn0sCi0gICAgezB4OTU2NTA4NWUsIEwiQm9va0FudGlxdWEiLAotICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zLExpYmVyYXRpb24gU2VyaWYiLCAyLCAxMjUyfSwKLSAgICB7MHg5ODU2ZDk1ZCwgTCJBZG9iZU1pbmdTdGRMIiwgTCJBUiBQTCBVTWluZyBISyIsIDAsIDk0OX0sCi0gICAgezB4OWJiYWRkNmIsIEwiQ29sb25uYU1UIiwKLSAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxLaG1lciBPUyxLaG1lciBPUyBTeXN0ZW0iLCAwLCAxMjUyfSwKLSAgICB7MHg5Y2JkMTZhNCwgTCJTaG93Y2FyZEdvdGhpYy1SZWciLAotICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTYW5zLFVidW50dSIsIDAsIDEyNTJ9LAotICAgIHsweDlkNzMwMDhlLCBMIk1TU2Fuc1NlcmlmIiwgTCJGcmVlU2VyaWYiLCAwLCAxMjUyfSwKLSAgICB7MHhhMDYwN2RiMSwgTCJHdW5nc3VoQ2hlIiwKLSAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICIKLSAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwKLSAgICAgMSwgMTI1Mn0sCi0gICAgezB4YTBiY2Y2YTEsIEwiTGF0aW5XaWRlIiwgTCJGcmVlU2VyaWYiLCAyLCAxMjUyfSwKLSAgICB7MHhhMTQyOWIzNiwgTCJTeW1ib2wiLCBMIkZyZWVTZXJpZiIsIDYsIDQyfSwKLSAgICB7MHhhMWZhNWFiYywgTCJXaW5nZGluZ3MyIiwgTCJGcmVlU2VyaWYiLCA2LCA0Mn0sCi0gICAgezB4YTFmYTVhYmQsIEwiV2luZ2RpbmdzMyIsIEwiRnJlZVNlcmlmIiwgNiwgNDJ9LAotICAgIHsweGE0MjdiYWQ0LCBMIkluZm9ybWFsUm9tYW4tUmVndWxhciIsCi0gICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCBTYW5zICIKLSAgICAgTCJKYXBhbmVzZSxGcmVlU2VyaWYiLAotICAgICA4LCAxMjUyfSwKLSAgICB7MHhhOGI5MmVjZSwgTCJGWlNUSy0tR0JLMS0wIiwgTCJBUiBQTCBVTWluZyBDTiIsIDAsIDkzNn0sCi0gICAgezB4YThkODNlY2UsIEwiQ2FsaWZvcm5pYW5GQiIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYiLCAyLCAxMjUyfSwKLSAgICB7MHhhYTNlMDgyYywgTCJLaW5nc29mdC1QaG9uZXRpYyIsCi0gICAgIEwiVGliZXRhbiBNYWNoaW5lIFVuaSxMS0xVRyxTYW15YWsgR3VqYXJhdGksRHJvaWQgU2FucyAiCi0gICAgIEwiVGhhaSx1dGthbCxLZWRhZ2UsTWFsbGlnZSxBUiBQTCBVS2FpIENOIiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4YWE2YmNhYmUsIEwiSGFybG93U29saWRJdGFsaWMiLAotICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2VyaWYiLCAwLCAxMjUyfSwKLSAgICB7MHhhZGU1MzM3YywgTCJNU1VJR290aGljIiwKLSAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICIKLSAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4YjA4ZGQ5NDEsIEwiV2lkZUxhdGluIiwKLSAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCAiCi0gICAgIEwiU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNlcmlmIiwKLSAgICAgMiwgMTI1Mn0sCi0gICAgezB4YjEyNzY1ZTAsIEwiSVRDTGVnYWN5U2Fuc1N0ZEJvb2siLAotICAgICBMIkFSIFBMIFVNaW5nIEhLLEFSIFBMIFVLYWkgSEssRnJlZVNlcmlmLFVidW50dSxGcmVlU2FucyIsIDAsIDEyNTJ9LAotICAgIHsweGIyMDdmMDVkLCBMIlBvb3JSaWNoYXJkIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2VyaWYiLCAyLAotICAgICAxMjUyfSwKLSAgICB7MHhiM2JjNDkyZiwgTCJKdWljZUlUQy1SZWd1bGFyIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2VyaWYiLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHhiNTU0NTM5OSwgTCJNYXJsZXR0IiwgTCJMaWJlcmF0aW9uIFNlcmlmIiwgNCwgNDJ9LAotICAgIHsweGI1ZGQxZWJiLCBMIkJyaXRhbm5pY0JvbGQiLAotICAgICBMIkthY3N0UXVybixEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyAiCi0gICAgIEwiRXRoaW9waWMsbXJ5X0thY3N0UXVybixMaWJlcmF0aW9uIFNlcmlmIiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4YjY5OWMxYzUsIEwiTHVjaWRhQ2FsbGlncmFwaHktSXRhbGljIiwKLSAgICAgTCJLYWNzdFF1cm4sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCAiCi0gICAgIEwiU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHhiNzI1ZDYyOSwgTCJUaW1lc05ld1JvbWFuIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyIsIDIsCi0gICAgIDEyNTJ9LAotICAgIHsweGI3ZWFlYmViLCBMIkFkb2JlSGVpdGlTdGRSIiwKLSAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICIKLSAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwKLSAgICAgMCwgOTM2fSwKLSAgICB7MHhiZDI5YzQ4NiwgTCJCZXJsaW5TYW5zRkJEZW1pLUJvbGQiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4YmU4YThkYjQsIEwiQm9va3NoZWxmU3ltYm9sU2V2ZW4iLCBMIkRlamFWdSBTYW5zIiwgMCwgMTI1Mn0sCi0gICAgezB4YzE2YzAxMTgsIEwiQWRvYmVIZWJyZXciLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsVWJ1bnR1LExpYmVyYXRpb24gU2VyaWYiLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHhjMzE4YjBhZiwgTCJNeXJpYWRQcm9MaWdodCIsCi0gICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxBUiBQTCBVS2FpIEhLLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVLYWkgQ04iLCAwLAotICAgICAxMjUyfSwKLSAgICB7MHhjNjVlNTY1OSwgTCJDYW1icmlhTWF0aCIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlU2VyaWYsRnJlZU1vbm8iLCAyLAotICAgICAxMjUyfSwKLSAgICB7MHhjNzVjOGYwNSwgTCJMdWNpZGFDb25zb2xlIiwKLSAgICAgTCJMaWJlcmF0aW9uIE1vbm8sRGVqYVZ1IFNhbnMgTW9ubyxGcmVlTW9ubyxXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8iLCAxLAotICAgICAxMjUyfSwKLSAgICB7MHhjYTdjMzVkNiwgTCJDYWxpYnJpIiwgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zIiwgMCwgMTI1Mn0sCi0gICAgezB4Y2IwNTNmNTMsIEwiTWljcm9zb2Z0WWFIZWkiLAotICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIgotICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAotICAgICAwLCA5MzZ9LAotICAgIHsweGNiNzE5MGY5LCBMIk1hZ25ldG8tQm9sZCIsCi0gICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEcm9pZCBTYW5zICIKLSAgICAgTCJKYXBhbmVzZSxEZWphVnUgU2VyaWYiLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHhjY2EwMGNjNSwgTCJTeXN0ZW0iLCBMIkRlamFWdSBTYW5zIiwgMCwgMTI1Mn0sCi0gICAgezB4Y2NhZDZmNzYsIEwiSm9rZXJtYW4tUmVndWxhciIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyIsIDAsCi0gICAgIDEyNTJ9LAotICAgIHsweGNjYzU4MThjLCBMIkV1cm9TaWduIiwgTCJEZWphVnUgU2VyaWYiLCAwLCAxMjUyfSwKLSAgICB7MHhjZjNkNzIzNCwgTCJMdWNpZGFIYW5kd3JpdGluZy1JdGFsaWMiLAotICAgICBMIkxpYmVyYXRpb24gU2FucyBOYXJyb3csVWJ1bnR1IENvbmRlbnNlZCxOaW1idXMgU2FucyBMLERlamFWdSBTZXJpZiIsIDAsCi0gICAgIDEyNTJ9LAotICAgIHsweGNmN2I4ZmRiLCBMIk1pbmlvblBybyIsIEwiRGVqYVZ1IFNhbnMiLCAwLCAxMjUyfSwKLSAgICB7MHhjZmU1NzU1ZiwgTCJTaW1oZWkiLAotICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIgotICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAotICAgICAxLCA5MzZ9LAotICAgIHsweGQwMTFmNGVlLCBMIk1TUEdvdGhpYyIsCi0gICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyIsIDAsCi0gICAgIDEyNTJ9LAotICAgIHsweGQwNjBlN2VmLCBMIlZpdmFsZGkiLAotICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyxVYnVudHUiLCA4LCAxMjUyfSwKLSAgICB7MHhkMDdlZGVjMSwgTCJGcmFua2xpbkdvdGhpYy1NZWRpdW0iLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsVWJ1bnR1IiwgMCwKLSAgICAgMTI1Mn0sCi0gICAgezB4ZDEwNzI0M2YsIEwiU2ltU3VuIiwgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vIiwgMCwgOTM2fSwKLSAgICB7MHhkMTg4MTU2MiwgTCJBcmlhbE5hcnJvdyIsCi0gICAgIEwiTGliZXJhdGlvbiBTYW5zIE5hcnJvdyxEcm9pZCBTYW5zIEphcGFuZXNlLEZyZWVTZXJpZiIsIDAsIDEyNTJ9LAotICAgIHsweGQyMmI3ZGNlLCBMIkJvZG9uaU1UUG9zdGVyQ29tcHJlc3NlZCIsCi0gICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLCAwLCAxMjUyfSwKLSAgICB7MHhkMjJiZmE2MCwgTCJDb21pY1NhbnNNUyIsCi0gICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxGcmVlTW9ubyxMaWJlcmF0aW9uIE1vbm8iLCA4LCAxMjUyfSwKLSAgICB7MHhkM2JkMGUzNSwgTCJCYXVoYXVzOTMiLAotICAgICBMIkthY3N0UXVybixEcm9pZCBTYW5zIEphcGFuZXNlLExpYmVyYXRpb24gU2FucyxVYnVudHUiLCAwLCAxMjUyfSwKLSAgICB7MHhkNDI5ZWU3YSwgTCJTVEZhbmdzb25nIiwgTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8iLCAwLCA5MzZ9LAotICAgIHsweGQ2Njc5YzEyLCBMIkJlcm5hcmRNVENvbmRlbnNlZCIsCi0gICAgIEwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsTmltYnVzIFNhbnMgTCxVUlcgQ2hhbmNlcnkgIgotICAgICBMIkwsS2Fjc3RPbmUsTGliZXJhdGlvbiBTYW5zIiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4ZDhlOGEwMjcsIEwiTHVjaWRhU2FucyIsCi0gICAgIEwiTGliZXJhdGlvbiBTYW5zIE5hcnJvdyxOaW1idXMgU2FucyBMLEthY3N0UXVybixEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgIgotICAgICBMIlNhbnMgRXRoaW9waWMsRGVqYVZ1IFNlcmlmIENvbmRlbnNlZCxMaWJlcmF0aW9uIE1vbm8sVWJ1bnR1IiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4ZDlmZTc3NjEsIEwiSGlnaFRvd2VyVGV4dC1SZWciLAotICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsVWJ1bnR1LExpYmVyYXRpb24gU2VyaWYiLCAyLCAxMjUyfSwKLSAgICB7MHhkYTdlNTUxZSwgTCJTVFNvbmciLCBMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyIsIDAsIDkzNn0sCi0gICAgezB4ZGFhNjg0MmQsIEwiU1RaaG9uZ3NvbmciLAotICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIgotICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAotICAgICAwLCA5MzZ9LAotICAgIHsweGRhYWFiOTNmLCBMIlNURmFuZ3NvbmciLAotICAgICBMIldlblF1YW5ZaSBNaWNybyBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gIgotICAgICBMIkhlaSxXZW5RdWFuWWkgWmVuIEhlaSBTaGFycCIsCi0gICAgIDAsIDkzNn0sCi0gICAgezB4ZGFlYjA3MTMsIEwiU1RTb25nIiwKLSAgICAgTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuICIKLSAgICAgTCJIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAiLAotICAgICAwLCA5MzZ9LAotICAgIHsweGRhZmVkYmVmLCBMIlNUQ2FpeXVuIiwgTCJBUiBQTCBVS2FpIEhLLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVLYWkgQ04iLCAwLAotICAgICA5MzZ9LAotICAgIHsweGRiMDBhM2Q5LCBMIkJyb2Fkd2F5IiwKLSAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2FucyxGcmVlTW9ubyxMaWJlcmF0aW9uIE1vbm8iLCAwLAotICAgICAxMjUyfSwKLSAgICB7MHhkYjFmNWFkNCwgTCJTVFhpbndlaSIsIEwiQVIgUEwgVUthaSBISyxBUiBQTCBVTWluZyBISyxBUiBQTCBVS2FpIENOIiwgMCwKLSAgICAgOTM2fSwKLSAgICB7MHhkYjMyNmU3ZiwgTCJTVEthaXRpIiwKLSAgICAgTCJXZW5RdWFuWWkgTWljcm8gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWkgTW9ubyxXZW5RdWFuWWkgWmVuICIKLSAgICAgTCJIZWksV2VuUXVhbllpIFplbiBIZWkgU2hhcnAiLAotICAgICAwLCA5MzZ9LAotICAgIHsweGRiNjk1OTVhLCBMIlNUSHVwbyIsCi0gICAgIEwiV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiAiCi0gICAgIEwiSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwIiwKLSAgICAgMCwgOTM2fSwKLSAgICB7MHhkYmEwMDgyYywgTCJTVFhpaGVpIiwKLSAgICAgTCIgV2VuUXVhbllpIE1pY3JvIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiAiCi0gICAgIEwiSGVpLFdlblF1YW5ZaSBaZW4gSGVpIFNoYXJwIiwKLSAgICAgMCwgOTM2fSwKLSAgICB7MHhkYmQwYWIxOCwgTCJTVFhpbmdrYWkiLCBMIkFSIFBMIFVLYWkgSEssQVIgUEwgVU1pbmcgSEssQVIgUEwgVUthaSBDTiIsIDAsCi0gICAgIDkzNn0sCi0gICAgezB4ZGMxYTdkYjEsIEwiU1RMaXRpIiwgTCJBUiBQTCBVS2FpIEhLLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVLYWkgQ04iLCAwLAotICAgICA5MzZ9LAotICAgIHsweGRjMzMwNzVmLCBMIktyaXN0ZW5JVEMtUmVndWxhciIsCi0gICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEZWphVnUgU2FucyAiCi0gICAgIEwiQ29uZGVuc2VkLFVidW50dSxMaWJlcmF0aW9uIFNhbnMiLAotICAgICA4LCAxMjUyfSwKLSAgICB7MHhkY2M3MDA5YywgTCJIYXJyaW5ndG9uIiwKLSAgICAgTCJLYWNzdFF1cm4sRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIFNlcmlmLEZyZWVTZXJpZixVYnVudHUiLCAwLAotICAgICAxMjUyfSwKLSAgICB7MHhkZDcxMjQ2NiwgTCJBcmlhbEJsYWNrIiwKLSAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLERlamFWdSBTYW5zLERlamFWdSBTZXJpZixGcmVlTW9ubyIsIDAsIDEyNTJ9LAotICAgIHsweGRkZTg3YjNlLCBMIkltcGFjdCIsIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxEZWphVnUgU2VyaWYiLCAwLCAxMjUyfSwKLSAgICB7MHhkZjY5ZmIzMiwgTCJTbmFwSVRDIiwKLSAgICAgTCJMaWJlcmF0aW9uIFNhbnMgTmFycm93LFVidW50dSBDb25kZW5zZWQsRGVqYVZ1IFNhbnMsRGVqYVZ1ICIKLSAgICAgTCJTZXJpZixGcmVlTW9ubyIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweGRmOGIyNWU4LCBMIkNlbnR1cnlHb3RoaWMiLAotICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBNb25vLExpYmVyYXRpb24gU2FucyxMaWJlcmF0aW9uIFNlcmlmIiwgMCwKLSAgICAgMTI1Mn0sCi0gICAgezB4ZTBmNzA1YzAsIEwiS3Jpc3RlbklUQyIsCi0gICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsbXJ5X0thY3N0UXVybixEZWphVnUgU2FucyAiCi0gICAgIEwiQ29uZGVuc2VkLFVidW50dSxMaWJlcmF0aW9uIFNhbnMiLAotICAgICA4LCAxMjUyfSwKLSAgICB7MHhlMTQyNzU3MywgTCJSYWF2aSIsCi0gICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgIgotICAgICBMIkV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRnJlZVNlcmlmLExpYmVyYXRpb24gU2VyaWYsS2htZXIgT1MiLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHhlMmNlYTBjYiwgTCJNYWduZXRvIiwKLSAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERlamFWdSAiCi0gICAgIEwiU2VyaWYsRGVqYVZ1IFNlcmlmIENvbmRlbnNlZCxEZWphVnUgU2FucyIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweGUzNmE5ZTE3LCBMIlJhdmllIiwKLSAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxtcnlfS2Fjc3RRdXJuLERlamFWdSAiCi0gICAgIEwiU2VyaWYsRGVqYVZ1IFNhbnMsRnJlZU1vbm8iLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHhlNDMzZjhlMiwgTCJQYXJjaG1lbnQiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwgOCwgMTI1Mn0sCi0gICAgezB4ZTQzZGZmNGEsIEwiV2luZ2RpbmdzIiwgTCJEZWphVnUgU2VyaWYiLCA0LCA0Mn0sCi0gICAgezB4ZTRlMmM0MDUsIEwiTVRFeHRyYSIsIEwiRGVqYVZ1IFNlcmlmIiwgNiwgNDJ9LAotICAgIHsweGU2MThjYzM1LCBMIkluZm9ybWFsUm9tYW4iLAotICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRHJvaWQgU2FucyAiCi0gICAgIEwiSmFwYW5lc2UsTmltYnVzIFNhbnMgTCxEZWphVnUgU2FucyBDb25kZW5zZWQsVWJ1bnR1LExpYmVyYXRpb24gU2FucyIsCi0gICAgIDgsIDEyNTJ9LAotICAgIHsweGU2YzI3ZmZjLCBMIk1pc3RyYWwiLCBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIiwgOCwgMTI1Mn0sCi0gICAgezB4ZTdlYmY0YjksIEwiQ291cmllciIsIEwiRGVqYVZ1IFNhbnMsRGVqYVZ1IFNhbnMgQ29uZGVuc2VkLEZyZWVTZXJpZiIsIDAsCi0gICAgIDEyNTJ9LAotICAgIHsweGU4YmM0YTlkLCBMIk1TUmVmZXJlbmNlU3BlY2lhbHR5IiwgTCJEZWphVnUgU2VyaWYiLCAwLCAxMjUyfSwKLSAgICB7MHhlOTBmYjAxMywgTCJUZW1wdXNTYW5zSVRDIiwKLSAgICAgTCJEcm9pZCBTYW5zIEphcGFuZXNlLFVidW50dSxMaWJlcmF0aW9uIFNlcmlmLEZyZWVTZXJpZiIsIDAsIDEyNTJ9LAotICAgIHsweGVjNjM3YjQyLCBMIkNvbnNvbGFzIiwKLSAgICAgTCJEZWphVnUgU2FucyBDb25kZW5zZWQsQVIgUEwgVUthaSBDTixBUiBQTCBVS2FpIEhLLEFSIFBMIFVLYWkgIgotICAgICBMIlRXLEZyZWVTZXJpZixGcmVlU2FucyIsCi0gICAgIDEsIDEyNTJ9LAotICAgIHsweGVkM2E2ODNiLCBMIlNUWGlud2VpIiwgTCJBUiBQTCBVS2FpIEhLLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVLYWkgQ04iLCAwLAotICAgICA5MzZ9LAotICAgIHsweGVmMjY0Y2QxLCBMIkx1Y2lkYUhhbmR3cml0aW5nIiwKLSAgICAgTCJMaWJlcmF0aW9uIFNhbnMgTmFycm93LFVidW50dSBDb25kZW5zZWQsTmltYnVzIFNhbnMgIgotICAgICBMIkwsS2Fjc3RRdXJuLExpYmVyYXRpb24gTW9ubyIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweGYwODZiY2EyLCBMIkJhc2tlcnZpbGxlT2xkRmFjZSIsCi0gICAgIEwiS2Fjc3RRdXJuLERyb2lkIFNhbnMgSmFwYW5lc2UsTGliZXJhdGlvbiBTZXJpZixVYnVudHUsRnJlZVNlcmlmIiwgMCwKLSAgICAgMTI1Mn0sCi0gICAgezB4ZjEwMjgwMzAsIEwiTWFuZ2FsIiwKLSAgICAgTCJGcmVlU2FucyxUU0N1X1BhcmFuYXIsR2FydWRhLExpYmVyYXRpb24gU2FucyxMaWJlcmF0aW9uIFNhbnMgIgotICAgICBMIk5hcnJvdyxOaW1idXMgU2FucyBMIiwKLSAgICAgMiwgMTI1Mn0sCi0gICAgezB4ZjFkYTdlYjksIEwiU2hvd2NhcmRHb3RoaWMiLAotICAgICBMIkRyb2lkIFNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmIENvbmRlbnNlZCxEZWphVnUgU2FucyAiCi0gICAgIEwiQ29uZGVuc2VkLExpYmVyYXRpb24gU2FucyxVYnVudHUiLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHhmMjEwZjA2YSwgTCJBcmlhbE1UIiwKLSAgICAgTCJMaWJlcmF0aW9uIFNhbnMsTGliZXJhdGlvbiBTYW5zIE5hcnJvdyxGcmVlU2FucyxOaW1idXMgU2FucyBMLEtobWVyIE9TICIKLSAgICAgTCJTeXN0ZW0sS2htZXIgT1MiLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHhmNDc3ZjE2YSwgTCJMYXRoYSIsCi0gICAgIEwiTGliZXJhdGlvbiBTYW5zIE5hcnJvdyxOaW1idXMgU2FucyBMLERyb2lkIEFyYWJpYyAiCi0gICAgIEwiTmFza2gsbXJ5X0thY3N0UXVybixGcmVlU2VyaWYsTmltYnVzIFNhbnMgTCIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweGY2MTZmM2RkLCBMIkxpU3UiLAotICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sQVIgUEwgVU1pbmcgQ04sQVIgUEwgVU1pbmcgSEssQVIgUEwgVU1pbmcgVFcsQVIgIgotICAgICBMIlBMIFVNaW5nIFRXIE1CRSIsCi0gICAgIDEsIDkzNn0sCi0gICAgezB4ZmE0NzlhYTYsIEwiTWljcm9zb2Z0WWFIZWkiLAotICAgICBMIldlblF1YW5ZaSBaZW4gSGVpIE1vbm8sV2VuUXVhbllpIFplbiBIZWksV2VuUXVhbllpIFplbiBIZWkgIgotICAgICBMIlNoYXJwLFdlblF1YW5ZaSBNaWNybyBIZWkiLAotICAgICAwLCA5MzZ9LAotICAgIHsweGZjZDE5Njk3LCBMIkJvb2ttYW5PbGRTdHlsZSIsCi0gICAgIEwiRHJvaWQgU2FucyBKYXBhbmVzZSxMaWJlcmF0aW9uIE1vbm8sTGliZXJhdGlvbiBTYW5zLExpYmVyYXRpb24gU2VyaWYiLCAwLAotICAgICAxMjUyfSwKLSAgICB7MHhmZTIwOWE4MiwgTCJMdWNpZGFDYWxsaWdyYXBoeSIsCi0gICAgIEwiS2Fjc3RRdXJuLERyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLG1yeV9LYWNzdFF1cm4sRHJvaWQgIgotICAgICBMIlNhbnMgSmFwYW5lc2UsRGVqYVZ1IFNlcmlmLERlamFWdSBTYW5zLEZyZWVNb25vIiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4ZmVmMTM1ZjgsIEwiQWRvYmVIZWl0aVN0ZC1SZWd1bGFyIiwKLSAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLFdlblF1YW5ZaSBaZW4gSGVpLFdlblF1YW5ZaSBaZW4gSGVpICIKLSAgICAgTCJTaGFycCxXZW5RdWFuWWkgTWljcm8gSGVpIiwKLSAgICAgMCwgOTM2fSwKLX07Ci0jZWxpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FQUExFXwotY29uc3QgWEZBX0ZPTlRJTkZPIGdfWEZBRm9udHNNYXBbXSA9IHsKLSAgICB7MHgwMWQ1ZDMzZSwgTCJTaW1TdW4iLCBMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsIDAsIDkzNn0sCi0gICAgezB4MDFlNGYxMDIsIEwiWW91WXVhbiIsIEwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwgMSwgOTM2fSwKLSAgICB7MHgwMzA1NDlkYywgTCJMaVN1IiwgTCJTVEhlaXRpLEhlaXRpIFRDLFNURmFuZ3NvbmciLCAxLCA5MzZ9LAotICAgIHsweDAzMmVkZDQ0LCBMIlNpbWhlaSIsIEwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwgMSwgOTM2fSwKLSAgICB7MHgwM2VhYzZmYywgTCJQb29yUmljaGFyZC1SZWd1bGFyIiwKLSAgICAgTCJOb3Rld29ydGh5LEF2ZW5pciBOZXh0IENvbmRlbnNlZCxJbXBhY3QiLCAyLCAxMjUyfSwKLSAgICB7MHgwM2VkOTBlNiwgTCJOaW5hIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZiIsIDAsIDEyNTJ9LAotICAgIHsweDA3N2I1NmIzLCBMIktpbmdzb2Z0UGhvbmV0aWNQbGFpbiIsCi0gICAgIEwiTGFzdFJlc29ydCxBcHBsZSAiCi0gICAgIEwiQ2hhbmNlcnksU1RJWFZhcmlhbnRzLFNUSVhTaXplT25lU3ltLFNUSVhTaXplT25lU3ltLEFwcGxlIEJyYWlsbGUiLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHgwNzhlZDUyNCwgTCJNaWNyb3NvZnRTYW5zU2VyaWYiLCBMIlNvbmd0aSBTQyxBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sCi0gICAgezB4MDg5YjE4YTksIEwiQXJpYWwiLAotICAgICBMIkFyaWFsIFVuaWNvZGUgTVMsTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LAotICAgIHsweDBiMmNhZDcyLCBMIk1vbm90eXBlQ29yc2l2YSIsIEwiQXJpYWwgTmFycm93LEltcGFjdCIsIDgsIDEyNTJ9LAotICAgIHsweDBiYjAwM2U3LCBMIkthcnRpa2EiLAotICAgICBMIkFyaWFsIFVuaWNvZGUgTVMsTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXJpYWwgTmFycm93LERhbWFzY3VzIiwgMiwgMTI1Mn0sCi0gICAgezB4MGJiNDY5ZGYsIEwiVmluZXJIYW5kSVRDIiwgTCJDb21pYyBTYW5zIE1TLFNvbmd0aSBTQyxTVFNvbmciLCA4LCAxMjUyfSwKLSAgICB7MHgwYmMxYTg1MSwgTCJTZWdvZVVJIiwgTCJBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sCi0gICAgezB4MGMxMTJlYmQsIEwiS296dWthR290aGljUHJvLVZJTSIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweDBjZmNiOWMxLCBMIkFkb2JlVGhhaSIsIEwiQXZlbmlyIE5leHQgQ29uZGVuc2VkIFVsdHJhIExpZ2h0IiwgMCwgODQ3fSwKLSAgICB7MHgwZTdkZTBmOSwgTCJQbGF5YmlsbCIsIEwiU1RJWE5vblVuaWNvZGUiLCAwLCAxMjUyfSwKLSAgICB7MHgwZWZmNDdjMywgTCJTVEh1cG8iLCBMIkthaXRpIFNDLFNvbmd0aSBTQyxTVEhlaXRpIiwgMCwgOTM2fSwKLSAgICB7MHgxMDdhZDM3NCwgTCJDb25zdGFudGlhIiwgTCJBcmlhbCBVbmljb2RlIE1TLFBhbGF0aW5vLEJhc2tlcnZpbGxlIiwgMiwKLSAgICAgMTI1Mn0sCi0gICAgezB4MTIxOTRjMmQsIEwiS3Vuc3RsZXJTY3JpcHQiLAotICAgICBMIkF2ZW5pciBOZXh0IENvbmRlbnNlZCBEZW1pIEJvbGQsQXJpYWwgTmFycm93IiwgOCwgMTI1Mn0sCi0gICAgezB4MTM1ZWY2YTEsIEwiTWluaW9uUHJvU21CZCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsCi0gICAgIDEyNTJ9LAotICAgIHsweDE1OGM0MDQ5LCBMIkdhcmFtb25kIiwgTCJJbXBhY3QsQXJpYWwgTmFycm93IiwgMiwgMTI1Mn0sCi0gICAgezB4MTYwZWNiMjQsIEwiU1RaaG9uZ3NvbmciLCBMIlNURmFuZ3NvbmcsU29uZ3RpIFNDIiwgMCwgOTM2fSwKLSAgICB7MHgxNjFlZDA3ZSwgTCJNU0dvdGhpYyIsCi0gICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyAiCi0gICAgIEwiVFcsTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCi0gICAgIDEsIDEyNTJ9LAotICAgIHsweDE3MWQxZWQxLCBMIlNuYXBJVEMtUmVndWxhciIsIEwiU1RIZWl0aSxBcmlhbCBCbGFjayIsIDAsIDEyNTJ9LAotICAgIHsweDE4ZDExODhmLCBMIkNhbWJyaWEiLCBMIkFyaWFsIFVuaWNvZGUgTVMiLCAyLCAxMjUyfSwKLSAgICB7MHgxOGVhZjM1MCwgTCJBcmlhbFVuaWNvZGVNUyIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsCi0gICAgIDkzNn0sCi0gICAgezB4MWE5MmQxMTUsIEwiTWluZ0xpVSIsIEwiSGVpdGkgU0MsU1RIZWl0aSIsIDEsIDEyNTJ9LAotICAgIHsweDFjYzIxN2M2LCBMIlRyZWJ1Y2hldE1TIiwgTCJEYW1hc2N1cyxJbXBhY3QsQXJpYWwgTmFycm93IiwgMCwgMTI1Mn0sCi0gICAgezB4MWQ2NDk1OTYsIEwiQmFzZW1pY1RpbWVzIiwgTCJMaWJlcmF0aW9uIFNlcmlmLEltcGFjdCxBcmlhbCBOYXJyb3ciLCAwLAotICAgICAxMjUyfSwKLSAgICB7MHgxZTM0ZWU2MCwgTCJCZWxsTVQiLAotICAgICBMIlBhcHlydXMsU1RJWE5vblVuaWNvZGUsTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXZlbmlyIExpZ2h0IiwgMiwgMTI1Mn0sCi0gICAgezB4MWViMzY5NDUsIEwiQ29vcGVyQmxhY2siLAotICAgICBMIk1hcmlvbixTVElYTm9uVW5pY29kZSxBcmlhbCBSb3VuZGVkIE1UIEJvbGQsTHVjaWRhIEdyYW5kZSIsIDIsIDEyNTJ9LAotICAgIHsweDFlZjc3ODdkLCBMIkJhdGFuZ0NoZSIsCi0gICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTiwsQVIgUEwgVU1pbmcgSEssQVIgUEwgVU1pbmcgVFcsQVIgIgotICAgICBMIlBMIFVNaW5nIFRXIE1CRSxBcmlhbCBVbmljb2RlIE1TLEhlaXRpIFRDIiwKLSAgICAgMSwgMTI1Mn0sCi0gICAgezB4MjBiM2JkM2EsIEwiQnJ1c2hTY3JpcHRNVCIsCi0gICAgIEwiU1RJWE5vblVuaWNvZGUsRGFtYXNjdXMsQXJpYWwgTmFycm93LEF2ZW5pciBOZXh0IENvbmRlbnNlZCxDb2NoaW4iLCA4LAotICAgICAxMjUyfSwKLSAgICB7MHgyMjA4NzdhYSwgTCJDYW5kYXJhIiwgTCJDb2NoaW4sQmFza2VydmlsbGUsTWFyaW9uIiwgMCwgMTI1Mn0sCi0gICAgezB4MjIxMzUwMDcsIEwiRnJlZXN0eWxlU2NyaXB0LVJlZ3VsYXIiLAotICAgICBMIlNUSVhOb25Vbmljb2RlLE5hZGVlbSxaYXBmIERpbmdiYXRzIiwgOCwgMTI1Mn0sCi0gICAgezB4MjUxMDU5YzMsIEwiQ2hpbGxlciIsCi0gICAgIEwiWmFwZiBEaW5nYmF0cyxEYW1hc2N1cyxTVElYTm9uVW5pY29kZSxQYXB5cnVzLEt1ZmlTdGFuZGFyZEdLLEJhZ2hkYWQiLCAwLAotICAgICAxMjUyfSwKLSAgICB7MHgyNWJlZDZkZCwgTCJNU1JlZmVyZW5jZVNhbnNTZXJpZiIsCi0gICAgIEwiVGFob21hLEFwcGxlIFN5bWJvbHMsQXBwbGUgTGlHb3RoaWMsQXJpYWwgVW5pY29kZSBNUyxMdWNpZGEgIgotICAgICBMIkdyYW5kZSxNaWNyb3NvZnQgU2FucyBTZXJpZiIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweDI4MTU0YzgxLCBMIlBhcmNobWVudC1SZWd1bGFyIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgOCwKLSAgICAgMTI1Mn0sCi0gICAgezB4Mjk3MTFlYjksIEwiU1RMaXRpIiwgTCJLYWl0aSBTQyxTb25ndGkgU0MiLCAwLCA5MzZ9LAotICAgIHsweDJiMTk5M2I0LCBMIkJhc2VtaWMiLCBMIkltcGFjdCxBcmlhbCBOYXJyb3ciLCAwLCAxMjUyfSwKLSAgICB7MHgyYjMxNjMzOSwgTCJOaWFnYXJhU29saWQtUmVnIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwKLSAgICAgMTI1Mn0sCi0gICAgezB4MmMxNDc1MjksIEwiRm9vdGxpZ2h0TVRMaWdodCIsCi0gICAgIEwiU1RJWE5vblVuaWNvZGUsQXZlbmlyIE5leHQgQ29uZGVuc2VkIEhlYXZ5LFBUIFNhbnMsTm90ZXdvcnRoeSIsIDAsIDEyNTJ9LAotICAgIHsweDJjMTk4OTI4LCBMIkhhcmxvd1NvbGlkIiwKLSAgICAgTCJBdmVuaXIgTWVkaXVtLEF2ZW5pciBOZXh0IE1lZGl1bSxBcmlhbCBVbmljb2RlIE1TIiwgMCwgMTI1Mn0sCi0gICAgezB4MmM2YWM2YjIsIEwiTHVjaWRhQnJpZ2h0IiwKLSAgICAgTCJQVCBTYW5zIE5hcnJvdyxQYXB5cnVzLERhbWFzY3VzLFNUSVhOb25Vbmljb2RlLEFyaWFsIFJvdW5kZWQgTVQgIgotICAgICBMIkJvbGQsQ29taWMgU2FucyBNUyxBdmVuaXIgTmV4dCIsCi0gICAgIDIsIDEyNTJ9LAotICAgIHsweDJjOWYzOGUyLCBMIktvenVrYU1pbmNob1Byby1WSVIiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHgyZDVhNDdiMCwgTCJTVENhaXl1biIsIEwiS2FpdGkgU0MsU29uZ3RpIFNDIiwgMCwgOTM2fSwKLSAgICB7MHgyZGVmMjZiZiwgTCJCZXJuYXJkTVQtQ29uZGVuc2VkIiwKLSAgICAgTCJJbXBhY3QsQXZlbmlyIE5leHQgQ29uZGVuc2VkIERlbWkgQm9sZCxBbWVyaWNhbiBUeXBld3JpdGVyIiwgMCwgMTI1Mn0sCi0gICAgezB4MmZkODkzMGIsIEwiS296dWthTWluY2hvUHI2TlIiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLAotICAgICAxMjUyfSwKLSAgICB7MHgzMTE1NTI1YSwgTCJGYW5nU29uZ19HQjIzMTIiLCBMIkhpcmFnaW5vIFNhbnMgR0IsU1RIZWl0aSIsIDAsIDEyNTJ9LAotICAgIHsweDMxMzI3ODE3LCBMIk15cmlhZFBybyIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LAotICAgIHsweDMyMjQ0OTc1LCBMIkhlbHZldGljYSIsCi0gICAgIEwiQXJpYWwgTmFycm93LEFyaWFsIFVuaWNvZGUgTVMsRGFtYXNjdXMsU1RJWE5vblVuaWNvZGUiLCAwLCAxMjUyfSwKLSAgICB7MHgzMmFjOTk1YywgTCJUZXJtaW5hbCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LAotICAgIHsweDMzOGQ2NDhhLCBMIk5pYWdhcmFFbmdyYXZlZC1SZWciLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHgzM2JiNjVmMiwgTCJTeWxmYWVuIiwgTCJBcmlhbCBVbmljb2RlIE1TLE1hcmlvbiIsIDIsIDEyNTJ9LAotICAgIHsweDM0MDJjMzBlLCBMIk1TUE1pbmNobyIsIEwiQXJpYWwgVW5pY29kZSBNUyxBcHBsZSBTRCBHb3RoaWMgTmVvIiwgMiwKLSAgICAgMTI1Mn0sCi0gICAgezB4MzQxMmJmMzEsIEwiU2ltU3VuLVBVQSIsIEwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwgMCwgOTM2fSwKLSAgICB7MHgzNmViMzliOSwgTCJCZXJsaW5TYW5zRkIiLCBMIkFtZXJpY2FuIFR5cGV3cml0ZXIsSW1wYWN0IiwgMCwgMTI1Mn0sCi0gICAgezB4MzZmNDIwNTUsIEwiVW5pdmVyc0FUVCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYiLCAwLCAxMjUyfSwKLSAgICB7MHgzODY0YzRmNiwgTCJIaWdoVG93ZXJUZXh0IiwgTCJTVElYR2VuZXJhbCwuSGVsdmV0aWNhIE5ldWUgRGVzayBVSSIsIDIsCi0gICAgIDEyNTJ9LAotICAgIHsweDNhMjU3ZDAzLCBMIkZhbmdTb25nX0dCMjMxMiIsIEwiSGlyYWdpbm8gU2FucyBHQixTVEhlaXRpIiwgMCwgMTI1Mn0sCi0gICAgezB4M2NkYWU2NjgsIEwiRnJlZXN0eWxlU2NyaXB0IiwgTCJOYWRlZW0sWmFwZiBEaW5nYmF0cyxTVElYTm9uVW5pY29kZSIsIDgsCi0gICAgIDEyNTJ9LAotICAgIHsweDNkNTVhZWQ3LCBMIkpva2VybWFuIiwKLSAgICAgTCJQYXB5cnVzLEx1Y2lkYSBHcmFuZGUsSGVpdGkgVEMsQW1lcmljYW4gVHlwZXdyaXRlciIsIDAsIDEyNTJ9LAotICAgIHsweDNkNWI0Mzg1LCBMIlBNaW5nTGlVIiwgTCJIZWl0aSBTQyxTVEhlaXRpIiwgMiwgMTI1Mn0sCi0gICAgezB4M2Q5Yjc2NjksIEwiRXN0cmFuZ2Vsb0VkZXNzYSIsIEwiQW1lcmljYW4gVHlwZXdyaXRlcixNYXJpb24iLCAwLCAxMjUyfSwKLSAgICB7MHgzZTUzMmQ3NCwgTCJGcmFua2xpbkdvdGhpY01lZGl1bSIsIEwiSW1wYWN0LEFyaWFsIE5hcnJvdyIsIDAsIDEyNTJ9LAotICAgIHsweDNlNmFhMzJkLCBMIk5TaW1TdW4iLCBMIlNUSGVpdGksU1RGYW5nc29uZyIsIDEsIDkzNn0sCi0gICAgezB4M2Y2YzM2YTgsIEwiR2F1dGFtaSIsCi0gICAgIEwiRGFtYXNjdXMsU1RJWE5vblVuaWNvZGUsU1RJWEdlbmVyYWwsQW1lcmljYW4gVHlwZXdyaXRlciIsIDAsIDEyNTJ9LAotICAgIHsweDNmZjMyNjYyLCBMIkNoaWxsZXItUmVndWxhciIsIEwiUGFweXJ1cyxLdWZpU3RhbmRhcmRHSyxCYWdoZGFkIiwgMCwKLSAgICAgMTI1Mn0sCi0gICAgezB4NDA5ZGUzMTIsIEwiTW9kZXJuTm8uMjAiLCBMIkF2ZW5pciBOZXh0IENvbmRlbnNlZCxJbXBhY3QiLCAyLCAxMjUyfSwKLSAgICB7MHg0MTQ0M2M1ZSwgTCJHZW9yZ2lhIiwgTCIuSGVsdmV0aWNhIE5ldWUgRGVzayBVSSxBcmlhbCBVbmljb2RlIE1TIiwgMiwKLSAgICAgMTI1Mn0sCi0gICAgezB4NDE2MGFkZTUsIEwiQmVsbEdvdGhpY1N0ZEJsYWNrIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4NDIxOTc2YzQsIEwiTW9kZXJuLVJlZ3VsYXIiLCBMIkltcGFjdCIsIDIsIDEyNTJ9LAotICAgIHsweDQyMmE3MjUyLCBMIlN0ZW5jaWwiLCBMIlNUSVhOb25Vbmljb2RlLFNvbmd0aSBTQyxHZW9yZ2lhLEJhc2tlcnZpbGxlIiwgMCwKLSAgICAgMTI1Mn0sCi0gICAgezB4NDJjODU1NGYsIEwiRml4ZWRzeXMiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLCAxMjUyfSwKLSAgICB7MHg0MzVjYjQxZCwgTCJSb21hbiIsIEwiQXJpYWwgTmFycm93IiwgMCwgMTI1Mn0sCi0gICAgezB4NDc4ODIzODMsIEwiQ291cmllck5ldyIsIEwiUENNeXVuZ2pvLE9zYWthLEFyaWFsIFVuaWNvZGUgTVMsU29uZ3RpIFNDIiwKLSAgICAgMSwgMTI1Mn0sCi0gICAgezB4NDgwYTIzMzgsIEwiQmVybGluU2Fuc0ZCRGVtaSIsCi0gICAgIEwiU1RJWE5vblVuaWNvZGUsQW1lcmljYW4gVHlwZXdyaXRlcixBdmVuaXIgTmV4dCBDb25kZW5zZWQgSGVhdnkiLCAwLAotICAgICAxMjUyfSwKLSAgICB7MHg0ODBiZjdhNCwgTCJDb3VyaWVyU3RkIiwgTCJDb3VyaWVyIE5ldyIsIDAsIDEyNTJ9LAotICAgIHsweDQ4MWFkNmVkLCBMIlZsYWRpbWlyU2NyaXB0IiwKLSAgICAgTCJTVElYTm9uVW5pY29kZSxBdmVuaXIgTmV4dCBDb25kZW5zZWQsSW1wYWN0IiwgOCwgMTI1Mn0sCi0gICAgezB4NDkxMTU3N2EsIEwiWW91WXVhbiIsIEwiU1RIZWl0aSxIZWl0aSBUQyIsIDEsIDkzNn0sCi0gICAgezB4NGE3ODhkNzIsIEwiU1RYaW5na2FpIiwgTCJLYWl0aSBTQyxTb25ndGkgU0MiLCAwLCA5MzZ9LAotICAgIHsweDRiZjg4NTY2LCBMIlNlZ29lQ29uZGVuc2VkIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwKLSAgICAgMTI1Mn0sCi0gICAgezB4NGNjZjUxYTQsIEwiQmVybGluU2Fuc0ZCLVJlZyIsCi0gICAgIEwiU1RJWE5vblVuaWNvZGUsQW1lcmljYW4gVHlwZXdyaXRlcixJbXBhY3QiLCAwLCAxMjUyfSwKLSAgICB7MHg0ZWE5NjdjZSwgTCJHdWxpbUNoZSIsIEwiQXJpYWwgVW5pY29kZSBNUyxIZWl0aSBUQyxTVEZhbmdzb25nIiwgMSwgMTI1Mn0sCi0gICAgezB4NGY2OGJkNzksIEwiTGV0dGVyR290aGljU3RkIiwKLSAgICAgTCJDb3VyaWVyIE5ldyxBbmRhbGUgTW9ubyxBeXV0aGF5YSxQQ015dW5nam8sT3Nha2EiLCAwLCAxMjUyfSwKLSAgICB7MHg1MWEwZDBlNiwgTCJLb3p1a2FHb3RoaWNQcjZOTSIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsCi0gICAgIDEyNTJ9LAotICAgIHsweDUzMWIzZGVhLCBMIkJhc2VtaWNTeW1ib2wiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLAotICAgICAxMjUyfSwKLSAgICB7MHg1MzMzZmQzOSwgTCJDYWxpZm9ybmlhbkZCLVJlZyIsCi0gICAgIEwiQW1lcmljYW4gVHlwZXdyaXRlcixBdmVuaXIgTmV4dCBDb25kZW5zZWQsSW1wYWN0IiwgMiwgMTI1Mn0sCi0gICAgezB4NTM1NjFhNTQsIEwiRlpZVEstLUdCSzEtMCIsIEwiU1RGYW5nc29uZyxTb25ndGkgU0MsU1RTb25nIiwgMCwgOTM2fSwKLSAgICB7MHg1NWUwZGRlNiwgTCJMdWNpZGFTYW5zVHlwZXdyaXRlciIsIEwiTWVubG8sQ291cmllciBOZXcsQW5kYWxlIE1vbm8iLCAwLAotICAgICAxMjUyfSwKLSAgICB7MHg1NzRkNGQzZCwgTCJBZG9iZUFyYWJpYyIsIEwiQXJpYWwgTmFycm93IiwgMCwgMTI1Mn0sCi0gICAgezB4NTc5MmU3NTksIEwiU1RLYWl0aSIsIEwiU29uZ3RpIFNDLEFyaWFsIFVuaWNvZGUgTVMiLCAwLCA5MzZ9LAotICAgIHsweDU5MjE5NzhlLCBMIkx1Y2lkYVNhbnNVbmljb2RlIiwgTCJMdWNpZGEgR3JhbmRlLEFyaWFsIFVuaWNvZGUgTVMsTWVubG8iLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHg1OTRlMmRhNCwgTCJWcmluZGEiLCBMIkdlZXphIFBybyxEYW1hc2N1cyxTVElYR2VuZXJhbCxHaWxsIFNhbnMiLCAwLAotICAgICAxMjUyfSwKLSAgICB7MHg1OWJhYTlhMiwgTCJLYWlUaV9HQjIzMTIiLCBMIkhpcmFnaW5vIFNhbnMgR0IsU1RIZWl0aSIsIDAsIDEyNTJ9LAotICAgIHsweDVjZmVkZjRmLCBMIkJhc2tPbGRGYWNlIiwKLSAgICAgTCJBdmVuaXIgTmV4dCBDb25kZW5zZWQgSGVhdnksUFQgU2FucyxBdmVuaXIgTmV4dCBDb25kZW5zZWQiLCAwLCAxMjUyfSwKLSAgICB7MHg1ZTE2YWM5MSwgTCJUcmFqYW5Qcm8iLCBMIkFyaWFsIE5hcnJvdyxQVCBTYW5zIE5hcnJvdyxEYW1hc2N1cyIsIDAsCi0gICAgIDEyNTJ9LAotICAgIHsweDVmOTc5MjFjLCBMIkFkb2JlTXl1bmdqb1N0ZE0iLAotICAgICBMIkFwcGxlTXl1bmdqbyxBcHBsZUdvdGhpYyxBcmlhbCBVbmljb2RlIE1TIiwgMCwgOTM2fSwKLSAgICB7MHg1ZmVmYmZhZCwgTCJCYXRhbmciLCBMIkFyaWFsIFVuaWNvZGUgTVMsU29uZ3RpIFNDIiwgMiwgMTI1Mn0sCi0gICAgezB4NjA1MzQyYjksIEwiRG90dW1DaGUiLCBMIkFyaWFsIFVuaWNvZGUgTVMsSGVpdGkgVEMiLCAxLCAxMjUyfSwKLSAgICB7MHg2MDhjNWY5YSwgTCJLYWlUaV9HQjIzMTIiLCBMIkhpcmFnaW5vIFNhbnMgR0IsU1RIZWl0aSxIZWl0aSBUQyIsIDAsIDkzNn0sCi0gICAgezB4NjFlZmQwZDEsIEwiTWF0dXJhTVRTY3JpcHRDYXBpdGFscyIsCi0gICAgIEwiS29rb25vcixEYW1hc2N1cyxTVElYTm9uVW5pY29kZSxTVEhlaXRpLEFyaWFsIEJsYWNrLEF2ZW5pciBOZXh0IEhlYXZ5IiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4NjI2NjA4YTksIEwiTVZCb2xpIiwKLSAgICAgTCJBcHBsZSBCcmFpbGxlLEdlZXphIFBybyxNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sCi0gICAgezB4NjMwNTAxYTMsIEwiU21hbGxGb250cyIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LAotICAgIHsweDY1ZDBlMmE5LCBMIkZaWVRLLS1HQksxLTAiLCBMIlNURmFuZ3NvbmcsU29uZ3RpIFNDLFNUU29uZyIsIDAsIDkzNn0sCi0gICAgezB4NjY5ZjI5ZTEsIEwiRlpTVEstLUdCSzEtMCIsIEwiU1RIZWl0aSxIZWl0aSBUQyIsIDAsIDkzNn0sCi0gICAgezB4NjczYTllNWYsIEwiVHVuZ2EiLAotICAgICBMIkRhbWFzY3VzLFNUSVhOb25Vbmljb2RlLEF2ZW5pciBOZXh0IENvbmRlbnNlZCxBdmVuaXIgTmV4dCBDb25kZW5zZWQgIgotICAgICBMIlVsdHJhIExpZ2h0LEZ1dHVyYSIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweDY5MWFhNGNlLCBMIk5pYWdhcmFTb2xpZCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsCi0gICAgIDEyNTJ9LAotICAgIHsweDY5NjI1OWI3LCBMIkNvcmJlbCIsIEwiQ29jaGluLEJhc2tlcnZpbGxlLE1hcmlvbiIsIDAsIDEyNTJ9LAotICAgIHsweDY5NmVlOWJlLCBMIlNUWGloZWkiLCBMIlNUSGVpdGksSGVpdGkgVEMsU29uZ3RpIFNDLEFyaWFsIFVuaWNvZGUgTVMiLCAwLAotICAgICA5MzZ9LAotICAgIHsweDZjNTljZjY5LCBMIkRvdHVtIiwgTCJBcmlhbCBVbmljb2RlIE1TLFNvbmd0aSBTQyIsIDAsIDEyNTJ9LAotICAgIHsweDcwN2ZhNTYxLCBMIkd1bmdzdWgiLCBMIkFyaWFsIFVuaWNvZGUgTVMsSGVpdGkgVEMiLCAyLCAxMjUyfSwKLSAgICB7MHg3MTQxNmJiMiwgTCJaV0Fkb2JlRiIsCi0gICAgIEwiU1RJWFNpemVGb3VyU3ltLFNUSVhTaXplVGhyZWVTeW0sU1RJWFNpemVUd29TeW0sU1RJWFNpemVPbmVTeW0iLCAwLAotICAgICAxMjUyfSwKLSAgICB7MHg3MWI0MTgwMSwgTCJWZXJkYW5hIiwKLSAgICAgTCJUYWhvbWEsTWFyaW9uLEFwcGxlIFN5bWJvbHMsLkhlbHZldGljYSBOZXVlIERlc2sgVUksTHVjaWRhICIKLSAgICAgTCJHcmFuZGUsQ291cmllciBOZXciLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHg3M2YyNWU0YywgTCJQYWxhdGlub0xpbm90eXBlIiwgTCJQYWxhdGlubyxBcmlhbCBVbmljb2RlIE1TIiwgMCwgMTI1Mn0sCi0gICAgezB4NzNmNGQxOWYsIEwiTmlhZ2FyYUVuZ3JhdmVkIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwKLSAgICAgMTI1Mn0sCi0gICAgezB4NzQwMDE2OTQsIEwiTXlyaWFkUHJvQmxhY2siLCBMIlBhbGF0aW5vLEJhc2tlcnZpbGxlLE1hcmlvbixDb2NoaW4iLCAwLAotICAgICAxMjUyfSwKLSAgICB7MHg3NGIxNGQ4ZiwgTCJIYWV0dGVuc2Nod2VpbGVyIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwKLSAgICAgMTI1Mn0sCi0gICAgezB4NzRjYjQ0ZWUsIEwiTlNpbVN1biIsIEwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwgMSwgOTM2fSwKLSAgICB7MHg3NmI0ZDdmZiwgTCJTaHJ1dGkiLAotICAgICBMIkRhbWFzY3VzLFNUSVhOb25Vbmljb2RlLEFyaWFsIFVuaWNvZGUgTVMsQW1lcmljYW4gVHlwZXdyaXRlciIsIDAsIDEyNTJ9LAotICAgIHsweDc4OGIzNTMzLCBMIldlYmRpbmdzIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgNiwgNDJ9LAotICAgIHsweDc5N2RkZTk5LCBMIk1TU2VyaWYiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLCAxMjUyfSwKLSAgICB7MHg3YTBmOWU5ZSwgTCJNU01pbmNobyIsCi0gICAgIEwiV2VuUXVhbllpIFplbiBIZWkgTW9ubyxBUiBQTCBVTWluZyBDTixBUiBQTCBVTWluZyBISyxBUiBQTCBVTWluZyBUVyxBUiAiCi0gICAgIEwiUEwgVU1pbmcgVFcgTUJFLEFyaWFsIFVuaWNvZGUgTVMsQXBwbGUgU0QgR290aGljIE5lbyIsCi0gICAgIDEsIDEyNTJ9LAotICAgIHsweDdiNDM5Y2FmLCBMIk9sZEVuZ2xpc2hUZXh0TVQiLAotICAgICBMIlNUSVhOb25Vbmljb2RlLEFyaWFsIFVuaWNvZGUgTVMsQmFza2VydmlsbGUsQXZlbmlyIE5leHQgTWVkaXVtIiwgMCwKLSAgICAgMTI1Mn0sCi0gICAgezB4ODIxM2E0MzMsIEwiTHVjaWRhU2Fucy1UeXBld3JpdGVyIiwKLSAgICAgTCJDb21pYyBTYW5zIE1TLEF2ZW5pciBOZXh0LEFyaWFsIFJvdW5kZWQgTVQgQm9sZCIsIDAsIDEyNTJ9LAotICAgIHsweDgyZmVjOTI5LCBMIkFkb2JlU29uZ1N0ZEwiLCBMIkhlaXRpIFRDLFNUSGVpdGkiLCAwLCA5MzZ9LAotICAgIHsweDgzNTgxODI1LCBMIk1vZGVybiIsIEwiQXZlbmlyIE5leHQgQ29uZGVuc2VkLEltcGFjdCIsIDAsIDEyNTJ9LAotICAgIHsweDgzNWEyODIzLCBMIkFsZ2VyaWFuIiwKLSAgICAgTCJTVElYTm9uVW5pY29kZSxCYXNrZXJ2aWxsZSxBdmVuaXIgTmV4dCBNZWRpdW0sQW1lcmljYW4gVHlwZXdyaXRlciIsIDAsCi0gICAgIDEyNTJ9LAotICAgIHsweDgzZGFiOWY1LCBMIlNjcmlwdCIsIEwiQXJpYWwgTmFycm93IiwgMCwgMTI1Mn0sCi0gICAgezB4ODQ3YjU2ZGEsIEwiVGFob21hIiwgTCJTb25ndGkgU0MsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LAotICAgIHsweDhhNzgzY2IyLCBMIlNpbVN1bi1QVUEiLCBMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsIDAsIDEyNTJ9LAotICAgIHsweDhiNWNhYzBlLCBMIk9ueXgiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAwLCAxMjUyfSwKLSAgICB7MHg4YzZhNDk5ZSwgTCJHdWxpbSIsIEwiQXJpYWwgVW5pY29kZSBNUyxTb25ndGkgU0MiLCAwLCAxMjUyfSwKLSAgICB7MHg4ZTBhZjc5MCwgTCJKdWljZUlUQyIsIEwiTmFkZWVtLEFsIEJheWFuIiwgMCwgMTI1Mn0sCi0gICAgezB4OGU4ZDQzYjIsIEwiQ2VudGF1ciIsIEwiQXZlbmlyIE5leHQgQ29uZGVuc2VkLE5vdGV3b3J0aHksSW1wYWN0IiwgMiwKLSAgICAgMTI1Mn0sCi0gICAgezB4OGVlNGRjY2EsIEwiQm9va3NoZWxmU3ltYm9sNyIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsCi0gICAgIDEyNTJ9LAotICAgIHsweDkwNzk0ODAwLCBMIkJlbGxHb3RoaWNTdGRMaWdodCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweDkwOWI1MTZhLCBMIkNlbnR1cnkiLCBMIkRhbWFzY3VzLEFuZGFsZSBNb25vLFNvbmd0aSBTQyxBcmlhbCBVbmljb2RlIE1TIiwKLSAgICAgMiwgMTI1Mn0sCi0gICAgezB4OTJhZTM3MGQsIEwiTVNPdXRsb29rIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgNCwgNDJ9LAotICAgIHsweDkzYzlmYmYxLCBMIkx1Y2lkYUZheCIsCi0gICAgIEwiUFQgU2FucyBOYXJyb3csUGFweXJ1cyxLb2tvbm9yLEdlZXphIFBybyxBcmlhbCBSb3VuZGVkIE1UIEJvbGQsTHVjaWRhICIKLSAgICAgTCJHcmFuZGUsRnV0dXJhIiwKLSAgICAgMiwgMTI1Mn0sCi0gICAgezB4OTU2NTA4NWUsIEwiQm9va0FudGlxdWEiLCBMIlBhbGF0aW5vLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAotICAgICAyLCAxMjUyfSwKLSAgICB7MHg5ODU2ZDk1ZCwgTCJBZG9iZU1pbmdTdGRMIiwgTCJBSGlyYWdpbm8gU2FucyBHQixIZWl0aSBUQyxTVEhlaXRpIiwgMCwKLSAgICAgOTQ5fSwKLSAgICB7MHg5YmJhZGQ2YiwgTCJDb2xvbm5hTVQiLCBMIk5vdGV3b3J0aHksQXZlbmlyIE5leHQgQ29uZGVuc2VkLEltcGFjdCIsIDAsCi0gICAgIDEyNTJ9LAotICAgIHsweDljYmQxNmE0LCBMIlNob3djYXJkR290aGljLVJlZyIsCi0gICAgIEwiQXJpYWwgVW5pY29kZSBNUyxHZW9yZ2lhLEFtZXJpY2FuIFR5cGV3cml0ZXIiLCAwLCAxMjUyfSwKLSAgICB7MHg5ZDczMDA4ZSwgTCJNU1NhbnNTZXJpZiIsIEwiU29uZ3RpIFNDLEFwcGxlIFN5bWJvbHMiLCAwLCAxMjUyfSwKLSAgICB7MHhhMDYwN2RiMSwgTCJHdW5nc3VoQ2hlIiwKLSAgICAgTCJXZW5RdWFuWWkgWmVuIEhlaSBNb25vLEFSIFBMIFVNaW5nIENOLEFSIFBMIFVNaW5nIEhLLEFSIFBMIFVNaW5nIFRXLEFSICIKLSAgICAgTCJQTCBVTWluZyBUVyBNQkUsQXJpYWwgVW5pY29kZSBNUyxIZWl0aSBUQyxTVEZhbmdzb25nIiwKLSAgICAgMSwgMTI1Mn0sCi0gICAgezB4YTBiY2Y2YTEsIEwiTGF0aW5XaWRlIiwgTCJaYXBmaW5vLEFyaWFsIEJsYWNrLFNUSGVpdGkiLCAyLCAxMjUyfSwKLSAgICB7MHhhMTQyOWIzNiwgTCJTeW1ib2wiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCA2LCA0Mn0sCi0gICAgezB4YTFmYTVhYmMsIEwiV2luZ2RpbmdzMiIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDYsIDQyfSwKLSAgICB7MHhhMWZhNWFiZCwgTCJXaW5nZGluZ3MzIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgNiwgNDJ9LAotICAgIHsweGE0MjdiYWQ0LCBMIkluZm9ybWFsUm9tYW4tUmVndWxhciIsCi0gICAgIEwiU1RJWE5vblVuaWNvZGUsQXJpYWwgTmFycm93LEF2ZW5pciBOZXh0IENvbmRlbnNlZCBEZW1pIEJvbGQiLCA4LCAxMjUyfSwKLSAgICB7MHhhOGI5MmVjZSwgTCJGWlNUSy0tR0JLMS0wIiwgTCJTVEhlaXRpLEhlaXRpIFRDLFNURmFuZ3NvbmciLCAwLCA5MzZ9LAotICAgIHsweGE4ZDgzZWNlLCBMIkNhbGlmb3JuaWFuRkIiLAotICAgICBMIkFtZXJpY2FuIFR5cGV3cml0ZXIsQXZlbmlyIE5leHQgQ29uZGVuc2VkLEltcGFjdCIsIDIsIDEyNTJ9LAotICAgIHsweGFhM2UwODJjLCBMIktpbmdzb2Z0LVBob25ldGljIiwKLSAgICAgTCJTVElYVmFyaWFudHMsU1RJWFNpemVPbmVTeW0sQXBwbGUgQnJhaWxsZSIsIDAsIDEyNTJ9LAotICAgIHsweGFhNmJjYWJlLCBMIkhhcmxvd1NvbGlkSXRhbGljIiwKLSAgICAgTCJTVElYTm9uVW5pY29kZSxBdmVuaXIgTWVkaXVtLEF2ZW5pciBOZXh0IE1lZGl1bSxBcmlhbCBVbmljb2RlIE1TIiwgMCwKLSAgICAgMTI1Mn0sCi0gICAgezB4YWRlNTMzN2MsIEwiTVNVSUdvdGhpYyIsIEwiQXJpYWwgVW5pY29kZSBNUyxBcHBsZSBTRCBHb3RoaWMgTmVvIiwgMCwKLSAgICAgMTI1Mn0sCi0gICAgezB4YjA4ZGQ5NDEsIEwiV2lkZUxhdGluIiwKLSAgICAgTCJNYXJpb24sUGFweXJ1cyxOYW51bSBQZW4gU2NyaXB0LFphcGYgRGluZ2JhdHMsRGFtYXNjdXMsWmFwZmlubyxBcmlhbCAiCi0gICAgIEwiQmxhY2ssU1RIZWl0aSIsCi0gICAgIDIsIDEyNTJ9LAotICAgIHsweGIxMjc2NWUwLCBMIklUQ0xlZ2FjeVNhbnNTdGRCb29rIiwKLSAgICAgTCJMYXN0UmVzb3J0LC5IZWx2ZXRpY2EgTmV1ZSBEZXNrIFVJLEFyaWFsIFVuaWNvZGUgTVMsUGFsYXRpbm8iLCAwLCAxMjUyfSwKLSAgICB7MHhiMjA3ZjA1ZCwgTCJQb29yUmljaGFyZCIsIEwiTm90ZXdvcnRoeSxBdmVuaXIgTmV4dCBDb25kZW5zZWQsSW1wYWN0IiwgMiwKLSAgICAgMTI1Mn0sCi0gICAgezB4YjNiYzQ5MmYsIEwiSnVpY2VJVEMtUmVndWxhciIsIEwiTmFkZWVtLEFsIEJheWFuLFNUSVhOb25Vbmljb2RlIiwgMCwKLSAgICAgMTI1Mn0sCi0gICAgezB4YjU1NDUzOTksIEwiTWFybGV0dCIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDQsIDQyfSwKLSAgICB7MHhiNWRkMWViYiwgTCJCcml0YW5uaWNCb2xkIiwKLSAgICAgTCJEYW1hc2N1cyxTVElYTm9uVW5pY29kZSxBdmVuaXIgTmV4dCBDb25kZW5zZWQgSGVhdnksUFQgU2FucyIsIDAsIDEyNTJ9LAotICAgIHsweGI2OTljMWM1LCBMIkx1Y2lkYUNhbGxpZ3JhcGh5LUl0YWxpYyIsIEwiU1RIZWl0aSxBcmlhbCBCbGFjayIsIDAsIDEyNTJ9LAotICAgIHsweGI3MjVkNjI5LCBMIlRpbWVzTmV3Um9tYW4iLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCAyLAotICAgICAxMjUyfSwKLSAgICB7MHhiN2VhZWJlYiwgTCJBZG9iZUhlaXRpU3RkUiIsIEwiSGVpdGkgVEMsU1RIZWl0aSIsIDAsIDkzNn0sCi0gICAgezB4YmQyOWM0ODYsIEwiQmVybGluU2Fuc0ZCRGVtaS1Cb2xkIiwKLSAgICAgTCJBbWVyaWNhbiBUeXBld3JpdGVyLEF2ZW5pciBOZXh0IENvbmRlbnNlZCBIZWF2eSIsIDAsIDEyNTJ9LAotICAgIHsweGJlOGE4ZGI0LCBMIkJvb2tzaGVsZlN5bWJvbFNldmVuIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4YzE2YzAxMTgsIEwiQWRvYmVIZWJyZXciLAotICAgICBMIi5IZWx2ZXRpY2EgTmV1ZSBEZXNrIFVJLFBhbGF0aW5vLEFtZXJpY2FuIFR5cGV3cml0ZXIiLCAwLCAxMjUyfSwKLSAgICB7MHhjMzE4YjBhZiwgTCJNeXJpYWRQcm9MaWdodCIsIEwiUGFsYXRpbm8sQmFza2VydmlsbGUsTWFyaW9uIiwgMCwgMTI1Mn0sCi0gICAgezB4YzY1ZTU2NTksIEwiQ2FtYnJpYU1hdGgiLCBMIkFyaWFsIFVuaWNvZGUgTVMiLCAyLCAxMjUyfSwKLSAgICB7MHhjNzVjOGYwNSwgTCJMdWNpZGFDb25zb2xlIiwgTCJDb3VyaWVyIE5ldyxNZW5sbyxBbmRhbGUgTW9ubyIsIDEsIDEyNTJ9LAotICAgIHsweGNhN2MzNWQ2LCBMIkNhbGlicmkiLCBMIkFwcGxlIFN5bWJvbHMsSGVhZExpbmVBIiwgMCwgMTI1Mn0sCi0gICAgezB4Y2IwNTNmNTMsIEwiTWljcm9zb2Z0WWFIZWkiLCBMIkFyaWFsIFVuaWNvZGUgTVMiLCAwLCA5MzZ9LAotICAgIHsweGNiNzE5MGY5LCBMIk1hZ25ldG8tQm9sZCIsIEwiTHVjaWRhIEdyYW5kZSIsIDAsIDEyNTJ9LAotICAgIHsweGNjYTAwY2M1LCBMIlN5c3RlbSIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LAotICAgIHsweGNjYWQ2Zjc2LCBMIkpva2VybWFuLVJlZ3VsYXIiLCBMIkx1Y2lkYSBHcmFuZGUiLCAwLCAxMjUyfSwKLSAgICB7MHhjY2M1ODE4YywgTCJFdXJvU2lnbiIsIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LAotICAgIHsweGNmM2Q3MjM0LCBMIkx1Y2lkYUhhbmR3cml0aW5nLUl0YWxpYyIsCi0gICAgIEwiTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgU3ltYm9scyIsIDAsIDEyNTJ9LAotICAgIHsweGNmN2I4ZmRiLCBMIk1pbmlvblBybyIsCi0gICAgIEwiQmVsbCBNVCxDb3JiZWwsVGltZXMgTmV3IFJvbWFuLENhbWJyaWEsQmVybGluIFNhbnMgRkIiLCAwLCAxMjUyfSwKLSAgICB7MHhjZmU1NzU1ZiwgTCJTaW1oZWkiLCBMIlNUSGVpdGksSGVpdGkgVEMsU1RGYW5nc29uZyIsIDEsIDkzNn0sCi0gICAgezB4ZDAxMWY0ZWUsIEwiTVNQR290aGljIiwgTCJBcmlhbCBVbmljb2RlIE1TLEFwcGxlIFNEIEdvdGhpYyBOZW8iLCAwLAotICAgICAxMjUyfSwKLSAgICB7MHhkMDYwZTdlZiwgTCJWaXZhbGRpIiwKLSAgICAgTCJTVElYTm9uVW5pY29kZSxBcmlhbCBVbmljb2RlIE1TLEF2ZW5pciBNZWRpdW0sQXZlbmlyIE5leHQgTWVkaXVtIiwgOCwKLSAgICAgMTI1Mn0sCi0gICAgezB4ZDA3ZWRlYzEsIEwiRnJhbmtsaW5Hb3RoaWMtTWVkaXVtIiwgTCJJbXBhY3QsQXJpYWwgTmFycm93IiwgMCwgMTI1Mn0sCi0gICAgezB4ZDEwNzI0M2YsIEwiU2ltU3VuIiwgTCJTVEhlaXRpLEhlaXRpIFRDLFNURmFuZ3NvbmciLCAwLCA5MzZ9LAotICAgIHsweGQxODgxNTYyLCBMIkFyaWFsTmFycm93IiwgTCJQVCBTYW5zIE5hcnJvdyxBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sCi0gICAgezB4ZDIyYjdkY2UsIEwiQm9kb25pTVRQb3N0ZXJDb21wcmVzc2VkIiwKLSAgICAgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgMCwgMTI1Mn0sCi0gICAgezB4ZDIyYmZhNjAsIEwiQ29taWNTYW5zTVMiLAotICAgICBMIkRhbWFzY3VzLEdlb3JnaWEsLkhlbHZldGljYSBOZXVlIERlc2sgVUksTHVjaWRhIEdyYW5kZSxBcmlhbCBVbmljb2RlIE1TIiwKLSAgICAgOCwgMTI1Mn0sCi0gICAgezB4ZDNiZDBlMzUsIEwiQmF1aGF1czkzIiwKLSAgICAgTCJTVElYTm9uVW5pY29kZSxBcmlhbCBVbmljb2RlIE1TLEF2ZW5pciBOZXh0LEF2ZW5pciIsIDAsIDEyNTJ9LAotICAgIHsweGQ0MjllZTdhLCBMIlNURmFuZ3NvbmciLCBMIlNvbmd0aSBTQyxBcmlhbCBVbmljb2RlIE1TIiwgMCwgOTM2fSwKLSAgICB7MHhkNjY3OWMxMiwgTCJCZXJuYXJkTVRDb25kZW5zZWQiLAotICAgICBMIkltcGFjdCxBdmVuaXIgTmV4dCBDb25kZW5zZWQgRGVtaSBCb2xkIiwgMCwgMTI1Mn0sCi0gICAgezB4ZDhlOGEwMjcsIEwiTHVjaWRhU2FucyIsCi0gICAgIEwiQXJpYWwgTmFycm93LEtobWVyIE1OLEtva29ub3IsRGFtYXNjdXMsTWljcm9zb2Z0IFNhbnMgU2VyaWYsQXBwbGUgIgotICAgICBMIlN5bWJvbHMiLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHhkOWZlNzc2MSwgTCJIaWdoVG93ZXJUZXh0LVJlZyIsCi0gICAgIEwiU1RJWEdlbmVyYWwsLkhlbHZldGljYSBOZXVlIERlc2sgVUksVHJlYnVjaGV0IE1TIiwgMiwgMTI1Mn0sCi0gICAgezB4ZGE3ZTU1MWUsIEwiU1RTb25nIiwgTCJBcmlhbCBVbmljb2RlIE1TIiwgMCwgOTM2fSwKLSAgICB7MHhkYWE2ODQyZCwgTCJTVFpob25nc29uZyIsIEwiU1RGYW5nc29uZyxTb25ndGkgU0MsU1RTb25nIiwgMCwgOTM2fSwKLSAgICB7MHhkYWFhYjkzZiwgTCJTVEZhbmdzb25nIiwgTCJTb25ndGkgU0MsQXJpYWwgVW5pY29kZSBNUyIsIDAsIDkzNn0sCi0gICAgezB4ZGFlYjA3MTMsIEwiU1RTb25nIiwgTCJTb25ndGkgU0MsQXJpYWwgVW5pY29kZSBNUyIsIDAsIDkzNn0sCi0gICAgezB4ZGFmZWRiZWYsIEwiU1RDYWl5dW4iLCBMIkthaXRpIFNDLFNvbmd0aSBTQyxTVEhlaXRpIiwgMCwgOTM2fSwKLSAgICB7MHhkYjAwYTNkOSwgTCJCcm9hZHdheSIsCi0gICAgIEwiUGFweXJ1cyxTVElYTm9uVW5pY29kZSxBcmlhbCBCbGFjayxBdmVuaXIgTmV4dCBIZWF2eSxIZWl0aSBUQyIsIDAsIDEyNTJ9LAotICAgIHsweGRiMWY1YWQ0LCBMIlNUWGlud2VpIiwgTCJLYWl0aSBTQyxTb25ndGkgU0MsU1RIZWl0aSIsIDAsIDkzNn0sCi0gICAgezB4ZGIzMjZlN2YsIEwiU1RLYWl0aSIsIEwiU29uZ3RpIFNDLEFyaWFsIFVuaWNvZGUgTVMiLCAwLCA5MzZ9LAotICAgIHsweGRiNjk1OTVhLCBMIlNUSHVwbyIsIEwiS2FpdGkgU0MsU29uZ3RpIFNDLFNUSGVpdGkiLCAwLCA5MzZ9LAotICAgIHsweGRiYTAwODJjLCBMIlNUWGloZWkiLCBMIlNvbmd0aSBTQyxBcmlhbCBVbmljb2RlIE1TIiwgMCwgOTM2fSwKLSAgICB7MHhkYmQwYWIxOCwgTCJTVFhpbmdrYWkiLCBMIkthaXRpIFNDLFNvbmd0aSBTQyIsIDAsIDkzNn0sCi0gICAgezB4ZGMxYTdkYjEsIEwiU1RMaXRpIiwgTCJLYWl0aSBTQyxTb25ndGkgU0MiLCAwLCA5MzZ9LAotICAgIHsweGRjMzMwNzVmLCBMIktyaXN0ZW5JVEMtUmVndWxhciIsCi0gICAgIEwiU1RJWE5vblVuaWNvZGUsRGFtYXNjdXMsU29uZ3RpIFNDLFNUU29uZyIsIDgsIDEyNTJ9LAotICAgIHsweGRjYzcwMDljLCBMIkhhcnJpbmd0b24iLAotICAgICBMIlNUSVhOb25Vbmljb2RlLEF2ZW5pciBOZXh0IENvbmRlbnNlZCBIZWF2eSxOb3Rld29ydGh5IiwgMCwgMTI1Mn0sCi0gICAgezB4ZGQ3MTI0NjYsIEwiQXJpYWxCbGFjayIsIEwiR2VlemEgUHJvLERhbWFzY3VzLFNvbmd0aSBTQyxTVFNvbmciLCAwLAotICAgICAxMjUyfSwKLSAgICB7MHhkZGU4N2IzZSwgTCJJbXBhY3QiLCBMIkFyaWFsIE5hcnJvdyxNYXJpb24iLCAwLCAxMjUyfSwKLSAgICB7MHhkZjY5ZmIzMiwgTCJTbmFwSVRDIiwKLSAgICAgTCJBcmlhbCBOYXJyb3csUFQgU2FucyBOYXJyb3csTWFyaW9uLFNUSGVpdGksQXJpYWwgQmxhY2siLCAwLCAxMjUyfSwKLSAgICB7MHhkZjhiMjVlOCwgTCJDZW50dXJ5R290aGljIiwKLSAgICAgTCJEYW1hc2N1cyxBbmRhbGUgTW9ubyxTb25ndGkgU0MsQXJpYWwgVW5pY29kZSBNUyIsIDAsIDEyNTJ9LAotICAgIHsweGUwZjcwNWMwLCBMIktyaXN0ZW5JVEMiLCBMIlNvbmd0aSBTQyxTVFNvbmciLCA4LCAxMjUyfSwKLSAgICB7MHhlMTQyNzU3MywgTCJSYWF2aSIsCi0gICAgIEwiRGFtYXNjdXMsU1RJWE5vblVuaWNvZGUsTWFyaW9uLFBhcHlydXMsQXZlbmlyIE5leHQgQ29uZGVuc2VkICIKLSAgICAgTCJIZWF2eSxBbWVyaWNhbiBUeXBld3JpdGVyIiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4ZTJjZWEwY2IsIEwiTWFnbmV0byIsCi0gICAgIEwiU1RJWE5vblVuaWNvZGUsRGFtYXNjdXMsR2VlemEgUHJvLEx1Y2lkYSBHcmFuZGUsR2VvcmdpYSxIZWl0aSBUQyIsIDAsCi0gICAgIDEyNTJ9LAotICAgIHsweGUzNmE5ZTE3LCBMIlJhdmllIiwgTCJTVEhlaXRpLEFyaWFsIEJsYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4ZTQzM2Y4ZTIsIEwiUGFyY2htZW50IiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgOCwgMTI1Mn0sCi0gICAgezB4ZTQzZGZmNGEsIEwiV2luZ2RpbmdzIiwgTCJNaWNyb3NvZnQgU2FucyBTZXJpZixBcHBsZSBTeW1ib2xzIiwgNCwgNDJ9LAotICAgIHsweGU0ZTJjNDA1LCBMIk1URXh0cmEiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLCA2LCA0Mn0sCi0gICAgezB4ZTYxOGNjMzUsIEwiSW5mb3JtYWxSb21hbiIsIEwiQXJpYWwgTmFycm93IiwgOCwgMTI1Mn0sCi0gICAgezB4ZTZjMjdmZmMsIEwiTWlzdHJhbCIsIEwiQXBwbGUgU3ltYm9scyIsIDgsIDEyNTJ9LAotICAgIHsweGU3ZWJmNGI5LCBMIkNvdXJpZXIiLCBMIkNvdXJpZXIgTmV3IiwgMCwgMTI1Mn0sCi0gICAgezB4ZThiYzRhOWQsIEwiTVNSZWZlcmVuY2VTcGVjaWFsdHkiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmLEFwcGxlIFN5bWJvbHMiLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHhlOTBmYjAxMywgTCJUZW1wdXNTYW5zSVRDIiwKLSAgICAgTCJTVElYTm9uVW5pY29kZSxNaWNyb3NvZnQgU2FucyBTZXJpZixBdmVuaXIgTGlnaHQiLCAwLCAxMjUyfSwKLSAgICB7MHhlYzYzN2I0MiwgTCJDb25zb2xhcyIsCi0gICAgIEwiQVIgUEwgVUthaSBDTixBUiBQTCBVS2FpIEhLLEFSIFBMIFVLYWkgVFcsQVIgUEwgVUthaSBUVyBNQkUsQVIgUEwgVU1pbmcgIgotICAgICBMIkNOLEFSIFBMIFVNaW5nIEhLLE1pY3Jvc29mdCBTYW5zIFNlcmlmLFRhaG9tYSIsCi0gICAgIDEsIDEyNTJ9LAotICAgIHsweGVkM2E2ODNiLCBMIlNUWGlud2VpIiwgTCJLYWl0aSBTQyxTb25ndGkgU0MsIiwgMCwgOTM2fSwKLSAgICB7MHhlZjI2NGNkMSwgTCJMdWNpZGFIYW5kd3JpdGluZyIsCi0gICAgIEwiQXJpYWwgTmFycm93LEF2ZW5pciBOZXh0IENvbmRlbnNlZCBEZW1pIEJvbGQsQXZlbmlyIE5leHQgIgotICAgICBMIkNvbmRlbnNlZCxBdmVuaXIgTmV4dCBDb25kZW5zZWQgTWVkaXVtLFNUSGVpdGksQXJpYWwgQmxhY2siLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHhmMDg2YmNhMiwgTCJCYXNrZXJ2aWxsZU9sZEZhY2UiLAotICAgICBMIlNUSVhOb25Vbmljb2RlLEF2ZW5pciBOZXh0IENvbmRlbnNlZCBIZWF2eSxQVCBTYW5zIiwgMCwgMTI1Mn0sCi0gICAgezB4ZjEwMjgwMzAsIEwiTWFuZ2FsIiwKLSAgICAgTCJBcmlhbCBVbmljb2RlIE1TLE1pY3Jvc29mdCBTYW5zIFNlcmlmLEFyaWFsIE5hcnJvdyxUYWhvbWEiLCAyLCAxMjUyfSwKLSAgICB7MHhmMWRhN2ViOSwgTCJTaG93Y2FyZEdvdGhpYyIsCi0gICAgIEwiUGFweXJ1cyxBcmlhbCBVbmljb2RlIE1TLEdlb3JnaWEsQW1lcmljYW4gVHlwZXdyaXRlciIsIDAsIDEyNTJ9LAotICAgIHsweGYyMTBmMDZhLCBMIkFyaWFsTVQiLAotICAgICBMIkFyaWFsIFVuaWNvZGUgTVMsQXJpYWwgTmFycm93LFNUSVhOb25Vbmljb2RlLERhbWFzY3VzLEF2ZW5pciBOZXh0ICIKLSAgICAgTCJDb25kZW5zZWQgRGVtaSBCb2xkLEF2ZW5pciBOZXh0IENvbmRlbnNlZCBNZWRpdW0sQXZlbmlyIE5leHQgQ29uZGVuc2VkIiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4ZjQ3N2YxNmEsIEwiTGF0aGEiLAotICAgICBMIkFyaWFsIE5hcnJvdyxEYW1hc2N1cyxTVElYTm9uVW5pY29kZSxBbWVyaWNhbiBUeXBld3JpdGVyIiwgMCwgMTI1Mn0sCi0gICAgezB4ZjYxNmYzZGQsIEwiTGlTdSIsIEwiU1RIZWl0aSxIZWl0aSBUQyxTVEZhbmdzb25nIiwgMSwgOTM2fSwKLSAgICB7MHhmYTQ3OWFhNiwgTCJNaWNyb3NvZnRZYUhlaSIsIEwiQXJpYWwgVW5pY29kZSBNUyIsIDAsIDkzNn0sCi0gICAgezB4ZmNkMTk2OTcsIEwiQm9va21hbk9sZFN0eWxlIiwKLSAgICAgTCJHZWV6YSBQcm8sRGFtYXNjdXMsQW5kYWxlIE1vbm8sU29uZ3RpIFNDLEFyaWFsIFVuaWNvZGUgTVMiLCAwLCAxMjUyfSwKLSAgICB7MHhmZTIwOWE4MiwgTCJMdWNpZGFDYWxsaWdyYXBoeSIsCi0gICAgIEwiS29rb25vcixEYW1hc2N1cyxTVElYTm9uVW5pY29kZSxTVEhlaXRpLEFyaWFsIEJsYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4ZmVmMTM1ZjgsIEwiQWRvYmVIZWl0aVN0ZC1SZWd1bGFyIiwgTCJIZWl0aSBUQyxTVEhlaXRpIiwgMCwgOTM2fSwKLX07Ci0jZWxpZiBfRlhNX1BMQVRGT1JNXyA9PSBfRlhNX1BMQVRGT1JNX0FORFJPSURfCi1jb25zdCBYRkFfRk9OVElORk8gZ19YRkFGb250c01hcFtdID0gewotICAgIHsweDAxZDVkMzNlLCBMIlNpbVN1biIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sCi0gICAgezB4MDFlNGYxMDIsIEwiWW91WXVhbiIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDkzNn0sCi0gICAgezB4MDMwNTQ5ZGMsIEwiTGlTdSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDkzNn0sCi0gICAgezB4MDMyZWRkNDQsIEwiU2ltaGVpIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMSwgOTM2fSwKLSAgICB7MHgwM2VhYzZmYywgTCJQb29yUmljaGFyZC1SZWd1bGFyIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2ssRHJvaWQgQXJhYmljICIKLSAgICAgTCJOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljIiwKLSAgICAgMiwgMTI1Mn0sCi0gICAgezB4MDNlZDkwZTYsIEwiTmluYSIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4MDc3YjU2YjMsIEwiS2luZ3NvZnRQaG9uZXRpY1BsYWluIiwKLSAgICAgTCJEcm9pZCBTYW5zIFRoYWksRHJvaWQgU2FucyBBcm1lbmlhbixEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyAiCi0gICAgIEwiRXRoaW9waWMsRHJvaWQgU2FucyBGYWxsYmFjayIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweDA3OGVkNTI0LCBMIk1pY3Jvc29mdFNhbnNTZXJpZiIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweDA4OWIxOGE5LCBMIkFyaWFsIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4MGIyY2FkNzIsIEwiTW9ub3R5cGVDb3JzaXZhIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA4LCAxMjUyfSwKLSAgICB7MHgwYmIwMDNlNywgTCJLYXJ0aWthIiwKLSAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyAiCi0gICAgIEwiTW9ubyIsCi0gICAgIDIsIDEyNTJ9LAotICAgIHsweDBiYjQ2OWRmLCBMIlZpbmVySGFuZElUQyIsCi0gICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgOCwgMTI1Mn0sCi0gICAgezB4MGJjMWE4NTEsIEwiU2Vnb2VVSSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweDBjMTEyZWJkLCBMIktvenVrYUdvdGhpY1Byby1WSU0iLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweDBjZmNiOWMxLCBMIkFkb2JlVGhhaSIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgODQ3fSwKLSAgICB7MHgwZTdkZTBmOSwgTCJQbGF5YmlsbCIsCi0gICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgIgotICAgICBMIk1vbm8iLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHgwZWZmNDdjMywgTCJTVEh1cG8iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAotICAgIHsweDEwN2FkMzc0LCBMIkNvbnN0YW50aWEiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LAotICAgIHsweDEyMTk0YzJkLCBMIkt1bnN0bGVyU2NyaXB0IiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA4LCAxMjUyfSwKLSAgICB7MHgxMzVlZjZhMSwgTCJNaW5pb25Qcm9TbUJkIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHgxNThjNDA0OSwgTCJHYXJhbW9uZCIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sCi0gICAgezB4MTYwZWNiMjQsIEwiU1RaaG9uZ3NvbmciLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAotICAgIHsweDE2MWVkMDdlLCBMIk1TR290aGljIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMSwgMTI1Mn0sCi0gICAgezB4MTcxZDFlZDEsIEwiU25hcElUQy1SZWd1bGFyIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHgxOGQxMTg4ZiwgTCJDYW1icmlhIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sCi0gICAgezB4MThlYWYzNTAsIEwiQXJpYWxVbmljb2RlTVMiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAotICAgIHsweDFhOTJkMTE1LCBMIk1pbmdMaVUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwKLSAgICB7MHgxY2MyMTdjNiwgTCJUcmVidWNoZXRNUyIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4MWQ2NDk1OTYsIEwiQmFzZW1pY1RpbWVzIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHgxZTM0ZWU2MCwgTCJCZWxsTVQiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LAotICAgIHsweDFlYjM2OTQ1LCBMIkNvb3BlckJsYWNrIiwKLSAgICAgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwKLSAgICB7MHgxZWY3Nzg3ZCwgTCJCYXRhbmdDaGUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwKLSAgICB7MHgyMGIzYmQzYSwgTCJCcnVzaFNjcmlwdE1UIiwgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyIsIDgsCi0gICAgIDEyNTJ9LAotICAgIHsweDIyMDg3N2FhLCBMIkNhbmRhcmEiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweDIyMTM1MDA3LCBMIkZyZWVzdHlsZVNjcmlwdC1SZWd1bGFyIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA4LCAxMjUyfSwKLSAgICB7MHgyNTEwNTljMywgTCJDaGlsbGVyIiwKLSAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxSb2JvdG8sRHJvaWQgU2VyaWYiLCAwLCAxMjUyfSwKLSAgICB7MHgyNWJlZDZkZCwgTCJNU1JlZmVyZW5jZVNhbnNTZXJpZiIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweDI4MTU0YzgxLCBMIlBhcmNobWVudC1SZWd1bGFyIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA4LCAxMjUyfSwKLSAgICB7MHgyOTcxMWViOSwgTCJTVExpdGkiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAotICAgIHsweDJiMTk5M2I0LCBMIkJhc2VtaWMiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweDJiMzE2MzM5LCBMIk5pYWdhcmFTb2xpZC1SZWciLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweDJjMTQ3NTI5LCBMIkZvb3RsaWdodE1UTGlnaHQiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweDJjMTk4OTI4LCBMIkhhcmxvd1NvbGlkIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHgyYzZhYzZiMiwgTCJMdWNpZGFCcmlnaHQiLAotICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIFNlcmlmLFJvYm90byIsIDIsIDEyNTJ9LAotICAgIHsweDJjOWYzOGUyLCBMIktvenVrYU1pbmNob1Byby1WSVIiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweDJkNWE0N2IwLCBMIlNUQ2FpeXVuIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKLSAgICB7MHgyZGVmMjZiZiwgTCJCZXJuYXJkTVQtQ29uZGVuc2VkIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHgyZmQ4OTMwYiwgTCJLb3p1a2FNaW5jaG9QcjZOUiIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4MzExNTUyNWEsIEwiRmFuZ1NvbmdfR0IyMzEyIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4MzEzMjc4MTcsIEwiTXlyaWFkUHJvIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHgzMjI0NDk3NSwgTCJIZWx2ZXRpY2EiLAotICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIFNlcmlmLFJvYm90byIsIDAsIDEyNTJ9LAotICAgIHsweDMyYWM5OTVjLCBMIlRlcm1pbmFsIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHgzMzhkNjQ4YSwgTCJOaWFnYXJhRW5ncmF2ZWQtUmVnIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHgzM2JiNjVmMiwgTCJTeWxmYWVuIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwKLSAgICB7MHgzNDAyYzMwZSwgTCJNU1BNaW5jaG8iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwKLSAgICB7MHgzNDEyYmYzMSwgTCJTaW1TdW4tUFVBIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKLSAgICB7MHgzNmViMzliOSwgTCJCZXJsaW5TYW5zRkIiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweDM2ZjQyMDU1LCBMIlVuaXZlcnNBVFQiLCBMIk1pY3Jvc29mdCBTYW5zIFNlcmlmIiwgMCwgMTI1Mn0sCi0gICAgezB4Mzg2NGM0ZjYsIEwiSGlnaFRvd2VyVGV4dCIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sCi0gICAgezB4M2EyNTdkMDMsIEwiRmFuZ1NvbmdfR0IyMzEyIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4M2NkYWU2NjgsIEwiRnJlZXN0eWxlU2NyaXB0IiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA4LCAxMjUyfSwKLSAgICB7MHgzZDU1YWVkNywgTCJKb2tlcm1hbiIsCi0gICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4M2Q1YjQzODUsIEwiUE1pbmdMaVUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwKLSAgICB7MHgzZDliNzY2OSwgTCJFc3RyYW5nZWxvRWRlc3NhIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHgzZTUzMmQ3NCwgTCJGcmFua2xpbkdvdGhpY01lZGl1bSIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4M2U2YWEzMmQsIEwiTlNpbVN1biIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDkzNn0sCi0gICAgezB4M2Y2YzM2YTgsIEwiR2F1dGFtaSIsCi0gICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgIgotICAgICBMIk1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweDNmZjMyNjYyLCBMIkNoaWxsZXItUmVndWxhciIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4NDA5ZGUzMTIsIEwiTW9kZXJuTm8uMjAiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LAotICAgIHsweDQxNDQzYzVlLCBMIkdlb3JnaWEiLAotICAgICBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LAotICAgIHsweDQxNjBhZGU1LCBMIkJlbGxHb3RoaWNTdGRCbGFjayIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4NDIxOTc2YzQsIEwiTW9kZXJuLVJlZ3VsYXIiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LAotICAgIHsweDQyMmE3MjUyLCBMIlN0ZW5jaWwiLAotICAgICBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweDQyYzg1NTRmLCBMIkZpeGVkc3lzIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHg0MzVjYjQxZCwgTCJSb21hbiIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4NDc4ODIzODMsIEwiQ291cmllck5ldyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDEyNTJ9LAotICAgIHsweDQ4MGEyMzM4LCBMIkJlcmxpblNhbnNGQkRlbWkiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweDQ4MGJmN2E0LCBMIkNvdXJpZXJTdGQiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHg0ODFhZDZlZCwgTCJWbGFkaW1pclNjcmlwdCIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgOCwgMTI1Mn0sCi0gICAgezB4NDkxMTU3N2EsIEwiWW91WXVhbiIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDkzNn0sCi0gICAgezB4NGE3ODhkNzIsIEwiU1RYaW5na2FpIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKLSAgICB7MHg0YmY4ODU2NiwgTCJTZWdvZUNvbmRlbnNlZCIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4NGNjZjUxYTQsIEwiQmVybGluU2Fuc0ZCLVJlZyIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4NGVhOTY3Y2UsIEwiR3VsaW1DaGUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwKLSAgICB7MHg0ZjY4YmQ3OSwgTCJMZXR0ZXJHb3RoaWNTdGQiLAotICAgICBMIkRyb2lkIFNhbnMgTW9ubyxEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTYW5zICIKLSAgICAgTCJNb25vLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgRmFsbGJhY2siLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHg1MWEwZDBlNiwgTCJLb3p1a2FHb3RoaWNQcjZOTSIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4NTMxYjNkZWEsIEwiQmFzZW1pY1N5bWJvbCIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4NTMzM2ZkMzksIEwiQ2FsaWZvcm5pYW5GQi1SZWciLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LAotICAgIHsweDUzNTYxYTU0LCBMIkZaWVRLLS1HQksxLTAiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAotICAgIHsweDU1ZTBkZGU2LCBMIkx1Y2lkYVNhbnNUeXBld3JpdGVyIiwKLSAgICAgTCJEcm9pZCBTYW5zIE1vbm8sRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMiLCAwLCAxMjUyfSwKLSAgICB7MHg1NzRkNGQzZCwgTCJBZG9iZUFyYWJpYyIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4NTc5MmU3NTksIEwiU1RLYWl0aSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sCi0gICAgezB4NTkyMTk3OGUsIEwiTHVjaWRhU2Fuc1VuaWNvZGUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHg1OTRlMmRhNCwgTCJWcmluZGEiLAotICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLFJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zICIKLSAgICAgTCJNb25vIiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4NTliYWE5YTIsIEwiS2FpVGlfR0IyMzEyIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4NWNmZWRmNGYsIEwiQmFza09sZEZhY2UiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweDVmOTc5MjFjLCBMIkFkb2JlTXl1bmdqb1N0ZE0iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAotICAgIHsweDVmZWZiZmFkLCBMIkJhdGFuZyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LAotICAgIHsweDYwNTM0MmI5LCBMIkRvdHVtQ2hlIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMSwgMTI1Mn0sCi0gICAgezB4NjA4YzVmOWEsIEwiS2FpVGlfR0IyMzEyIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKLSAgICB7MHg2MWVmZDBkMSwgTCJNYXR1cmFNVFNjcmlwdENhcGl0YWxzIiwKLSAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyAiCi0gICAgIEwiTW9ubyIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweDYyNjYwOGE5LCBMIk1WQm9saSIsCi0gICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgIgotICAgICBMIk1vbm8iLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHg2MzA1MDFhMywgTCJTbWFsbEZvbnRzIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHg2NWQwZTJhOSwgTCJGWllUSy0tR0JLMS0wIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKLSAgICB7MHg2NjlmMjllMSwgTCJGWlNUSy0tR0JLMS0wIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKLSAgICB7MHg2NzNhOWU1ZiwgTCJUdW5nYSIsCi0gICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgIgotICAgICBMIk1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweDY5MWFhNGNlLCBMIk5pYWdhcmFTb2xpZCIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4Njk2MjU5YjcsIEwiQ29yYmVsIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHg2OTZlZTliZSwgTCJTVFhpaGVpIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKLSAgICB7MHg2YzU5Y2Y2OSwgTCJEb3R1bSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweDcwN2ZhNTYxLCBMIkd1bmdzdWgiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwKLSAgICB7MHg3MTQxNmJiMiwgTCJaV0Fkb2JlRiIsCi0gICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgQXJtZW5pYW4sRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTYW5zICIKLSAgICAgTCJHZW9yZ2lhbixEcm9pZCBTYW5zIEhlYnJldyxEcm9pZCBTYW5zIFRoYWkiLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHg3MWI0MTgwMSwgTCJWZXJkYW5hIiwKLSAgICAgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHg3M2YyNWU0YywgTCJQYWxhdGlub0xpbm90eXBlIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4NzNmNGQxOWYsIEwiTmlhZ2FyYUVuZ3JhdmVkIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHg3NDAwMTY5NCwgTCJNeXJpYWRQcm9CbGFjayIsIEwiQm9vayBBbnRpcXVhLENvbnN0YW50aWEsRG90dW0sR2VvcmdpYSIsIDAsCi0gICAgIDEyNTJ9LAotICAgIHsweDc0YjE0ZDhmLCBMIkhhZXR0ZW5zY2h3ZWlsZXIiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweDc0Y2I0NGVlLCBMIk5TaW1TdW4iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCA5MzZ9LAotICAgIHsweDc2YjRkN2ZmLCBMIlNocnV0aSIsCi0gICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgIgotICAgICBMIk1vbm8iLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHg3ODhiMzUzMywgTCJXZWJkaW5ncyIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgNiwgNDJ9LAotICAgIHsweDc5N2RkZTk5LCBMIk1TU2VyaWYiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweDdhMGY5ZTllLCBMIk1TTWluY2hvIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMSwgMTI1Mn0sCi0gICAgezB4N2I0MzljYWYsIEwiT2xkRW5nbGlzaFRleHRNVCIsCi0gICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4ODIxM2E0MzMsIEwiTHVjaWRhU2Fucy1UeXBld3JpdGVyIiwKLSAgICAgTCJEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHg4MmZlYzkyOSwgTCJBZG9iZVNvbmdTdGRMIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKLSAgICB7MHg4MzU4MTgyNSwgTCJNb2Rlcm4iLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweDgzNWEyODIzLCBMIkFsZ2VyaWFuIiwKLSAgICAgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHg4M2RhYjlmNSwgTCJTY3JpcHQiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweDg0N2I1NmRhLCBMIlRhaG9tYSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweDhhNzgzY2IyLCBMIlNpbVN1bi1QVUEiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHg4YjVjYWMwZSwgTCJPbnl4IiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHg4YzZhNDk5ZSwgTCJHdWxpbSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweDhlMGFmNzkwLCBMIkp1aWNlSVRDIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHg4ZThkNDNiMiwgTCJDZW50YXVyIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwKLSAgICB7MHg4ZWU0ZGNjYSwgTCJCb29rc2hlbGZTeW1ib2w3IiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHg5MDc5NDgwMCwgTCJCZWxsR290aGljU3RkTGlnaHQiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweDkwOWI1MTZhLCBMIkNlbnR1cnkiLAotICAgICBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LAotICAgIHsweDkyYWUzNzBkLCBMIk1TT3V0bG9vayIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgNCwgNDJ9LAotICAgIHsweDkzYzlmYmYxLCBMIkx1Y2lkYUZheCIsCi0gICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgIgotICAgICBMIk1vbm8iLAotICAgICAyLCAxMjUyfSwKLSAgICB7MHg5NTY1MDg1ZSwgTCJCb29rQW50aXF1YSIsCi0gICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sCi0gICAgezB4OTg1NmQ5NWQsIEwiQWRvYmVNaW5nU3RkTCIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDk0OX0sCi0gICAgezB4OWJiYWRkNmIsIEwiQ29sb25uYU1UIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHg5Y2JkMTZhNCwgTCJTaG93Y2FyZEdvdGhpYy1SZWciLAotICAgICBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjIiwgMCwgMTI1Mn0sCi0gICAgezB4OWQ3MzAwOGUsIEwiTVNTYW5zU2VyaWYiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweGEwNjA3ZGIxLCBMIkd1bmdzdWhDaGUiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwKLSAgICB7MHhhMGJjZjZhMSwgTCJMYXRpbldpZGUiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LAotICAgIHsweGExNDI5YjM2LCBMIlN5bWJvbCIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgNiwgNDJ9LAotICAgIHsweGExZmE1YWJjLCBMIldpbmdkaW5nczIiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDYsIDQyfSwKLSAgICB7MHhhMWZhNWFiZCwgTCJXaW5nZGluZ3MzIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA2LCA0Mn0sCi0gICAgezB4YTQyN2JhZDQsIEwiSW5mb3JtYWxSb21hbi1SZWd1bGFyIiwKLSAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyIsIDgsIDEyNTJ9LAotICAgIHsweGE4YjkyZWNlLCBMIkZaU1RLLS1HQksxLTAiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAotICAgIHsweGE4ZDgzZWNlLCBMIkNhbGlmb3JuaWFuRkIiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDIsIDEyNTJ9LAotICAgIHsweGFhM2UwODJjLCBMIktpbmdzb2Z0LVBob25ldGljIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHhhYTZiY2FiZSwgTCJIYXJsb3dTb2xpZEl0YWxpYyIsCi0gICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4YWRlNTMzN2MsIEwiTVNVSUdvdGhpYyIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4YjA4ZGQ5NDEsIEwiV2lkZUxhdGluIiwKLSAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyAiCi0gICAgIEwiTW9ubyIsCi0gICAgIDIsIDEyNTJ9LAotICAgIHsweGIyMDdmMDVkLCBMIlBvb3JSaWNoYXJkIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwKLSAgICB7MHhiM2JjNDkyZiwgTCJKdWljZUlUQy1SZWd1bGFyIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHhiNTU0NTM5OSwgTCJNYXJsZXR0IiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA0LCA0Mn0sCi0gICAgezB4YjVkZDFlYmIsIEwiQnJpdGFubmljQm9sZCIsIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMiLCAwLAotICAgICAxMjUyfSwKLSAgICB7MHhiNjk5YzFjNSwgTCJMdWNpZGFDYWxsaWdyYXBoeS1JdGFsaWMiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweGI3MjVkNjI5LCBMIlRpbWVzTmV3Um9tYW4iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwKLSAgICB7MHhiN2VhZWJlYiwgTCJBZG9iZUhlaXRpU3RkUiIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sCi0gICAgezB4YmQyOWM0ODYsIEwiQmVybGluU2Fuc0ZCRGVtaS1Cb2xkIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHhiZThhOGRiNCwgTCJCb29rc2hlbGZTeW1ib2xTZXZlbiIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4YzE2YzAxMTgsIEwiQWRvYmVIZWJyZXciLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayxEcm9pZCBBcmFiaWMgIgotICAgICBMIk5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMiLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHhjMzE4YjBhZiwgTCJNeXJpYWRQcm9MaWdodCIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4YzY1ZTU2NTksIEwiQ2FtYnJpYU1hdGgiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAyLCAxMjUyfSwKLSAgICB7MHhjNzVjOGYwNSwgTCJMdWNpZGFDb25zb2xlIiwKLSAgICAgTCJEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwKLSAgICB7MHhjYTdjMzVkNiwgTCJDYWxpYnJpIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4Y2IwNTNmNTMsIEwiTWljcm9zb2Z0WWFIZWkiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAotICAgIHsweGNiNzE5MGY5LCBMIk1hZ25ldG8tQm9sZCIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4Y2NhMDBjYzUsIEwiU3lzdGVtIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHhjY2FkNmY3NiwgTCJKb2tlcm1hbi1SZWd1bGFyIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHhjY2M1ODE4YywgTCJFdXJvU2lnbiIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4Y2YzZDcyMzQsIEwiTHVjaWRhSGFuZHdyaXRpbmctSXRhbGljIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHhjZjdiOGZkYiwgTCJNaW5pb25Qcm8iLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweGNmZTU3NTVmLCBMIlNpbWhlaSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDkzNn0sCi0gICAgezB4ZDAxMWY0ZWUsIEwiTVNQR290aGljIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4ZDA2MGU3ZWYsIEwiVml2YWxkaSIsCi0gICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgOCwgMTI1Mn0sCi0gICAgezB4ZDA3ZWRlYzEsIEwiRnJhbmtsaW5Hb3RoaWMtTWVkaXVtIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHhkMTA3MjQzZiwgTCJTaW1TdW4iLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAotICAgIHsweGQxODgxNTYyLCBMIkFyaWFsTmFycm93IiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHhkMjJiN2RjZSwgTCJCb2RvbmlNVFBvc3RlckNvbXByZXNzZWQiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDEyNTJ9LAotICAgIHsweGQyMmJmYTYwLCBMIkNvbWljU2Fuc01TIiwgTCJEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDgsCi0gICAgIDEyNTJ9LAotICAgIHsweGQzYmQwZTM1LCBMIkJhdWhhdXM5MyIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4ZDQyOWVlN2EsIEwiU1RGYW5nc29uZyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sCi0gICAgezB4ZDY2NzljMTIsIEwiQmVybmFyZE1UQ29uZGVuc2VkIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHhkOGU4YTAyNywgTCJMdWNpZGFTYW5zIiwKLSAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8iLCAwLCAxMjUyfSwKLSAgICB7MHhkOWZlNzc2MSwgTCJIaWdoVG93ZXJUZXh0LVJlZyIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMiwgMTI1Mn0sCi0gICAgezB4ZGE3ZTU1MWUsIEwiU1RTb25nIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKLSAgICB7MHhkYWE2ODQyZCwgTCJTVFpob25nc29uZyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sCi0gICAgezB4ZGFhYWI5M2YsIEwiU1RGYW5nc29uZyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sCi0gICAgezB4ZGFlYjA3MTMsIEwiU1RTb25nIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAotICAgIHsweGRhZmVkYmVmLCBMIlNUQ2FpeXVuIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKLSAgICB7MHhkYjAwYTNkOSwgTCJCcm9hZHdheSIsCi0gICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4ZGIxZjVhZDQsIEwiU1RYaW53ZWkiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAotICAgIHsweGRiMzI2ZTdmLCBMIlNUS2FpdGkiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAotICAgIHsweGRiNjk1OTVhLCBMIlNUSHVwbyIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sCi0gICAgezB4ZGJhMDA4MmMsIEwiU1RYaWhlaSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sCi0gICAgezB4ZGJkMGFiMTgsIEwiU1RYaW5na2FpIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKLSAgICB7MHhkYzFhN2RiMSwgTCJTVExpdGkiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAotICAgIHsweGRjMzMwNzVmLCBMIktyaXN0ZW5JVEMtUmVndWxhciIsCi0gICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsRHJvaWQgU2VyaWYsUm9ib3RvIiwgOCwgMTI1Mn0sCi0gICAgezB4ZGNjNzAwOWMsIEwiSGFycmluZ3RvbiIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4ZGQ3MTI0NjYsIEwiQXJpYWxCbGFjayIsCi0gICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4ZGRlODdiM2UsIEwiSW1wYWN0IiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHhkZjY5ZmIzMiwgTCJTbmFwSVRDIiwKLSAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyAiCi0gICAgIEwiTW9ubyIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweGRmOGIyNWU4LCBMIkNlbnR1cnlHb3RoaWMiLAotICAgICBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8iLCAwLCAxMjUyfSwKLSAgICB7MHhlMGY3MDVjMCwgTCJLcmlzdGVuSVRDIiwKLSAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8iLCA4LCAxMjUyfSwKLSAgICB7MHhlMTQyNzU3MywgTCJSYWF2aSIsCi0gICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgIgotICAgICBMIk1vbm8iLAotICAgICAwLCAxMjUyfSwKLSAgICB7MHhlMmNlYTBjYiwgTCJNYWduZXRvIiwKLSAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxEcm9pZCBTZXJpZixSb2JvdG8sRHJvaWQgU2FucyAiCi0gICAgIEwiTW9ubyIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweGUzNmE5ZTE3LCBMIlJhdmllIiwKLSAgICAgTCJEcm9pZCBBcmFiaWMgTmFza2gsRHJvaWQgU2FucyBFdGhpb3BpYyxSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyAiCi0gICAgIEwiTW9ubyIsCi0gICAgIDAsIDEyNTJ9LAotICAgIHsweGU0MzNmOGUyLCBMIlBhcmNobWVudCIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgOCwgMTI1Mn0sCi0gICAgezB4ZTQzZGZmNGEsIEwiV2luZ2RpbmdzIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCA0LCA0Mn0sCi0gICAgezB4ZTRlMmM0MDUsIEwiTVRFeHRyYSIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgNiwgNDJ9LAotICAgIHsweGU2MThjYzM1LCBMIkluZm9ybWFsUm9tYW4iLAotICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLFJvYm90byxEcm9pZCBTZXJpZiIsIDgsIDEyNTJ9LAotICAgIHsweGU2YzI3ZmZjLCBMIk1pc3RyYWwiLAotICAgICBMIlJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjayIsIDgsIDEyNTJ9LAotICAgIHsweGU3ZWJmNGI5LCBMIkNvdXJpZXIiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHhlOGJjNGE5ZCwgTCJNU1JlZmVyZW5jZVNwZWNpYWx0eSIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4ZTkwZmIwMTMsIEwiVGVtcHVzU2Fuc0lUQyIsCi0gICAgIEwiUm9ib3RvLERyb2lkIFNlcmlmLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4ZWM2MzdiNDIsIEwiQ29uc29sYXMiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAxLCAxMjUyfSwKLSAgICB7MHhlZDNhNjgzYiwgTCJTVFhpbndlaSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDAsIDkzNn0sCi0gICAgezB4ZWYyNjRjZDEsIEwiTHVjaWRhSGFuZHdyaXRpbmciLAotICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zICIKLSAgICAgTCJNb25vIiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4ZjA4NmJjYTIsIEwiQmFza2VydmlsbGVPbGRGYWNlIiwKLSAgICAgTCJSb2JvdG8sRHJvaWQgU2VyaWYsRHJvaWQgU2FucyBNb25vLERyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCAxMjUyfSwKLSAgICB7MHhmMTAyODAzMCwgTCJNYW5nYWwiLAotICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zICIKLSAgICAgTCJNb25vIiwKLSAgICAgMiwgMTI1Mn0sCi0gICAgezB4ZjFkYTdlYjksIEwiU2hvd2NhcmRHb3RoaWMiLAotICAgICBMIkRyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zIE1vbm8sRHJvaWQgU2FucyBGYWxsYmFjIiwgMCwgMTI1Mn0sCi0gICAgezB4ZjIxMGYwNmEsIEwiQXJpYWxNVCIsCi0gICAgIEwiRHJvaWQgQXJhYmljIE5hc2toLERyb2lkIFNhbnMgRXRoaW9waWMsUm9ib3RvLERyb2lkIFNlcmlmIiwgMCwgMTI1Mn0sCi0gICAgezB4ZjQ3N2YxNmEsIEwiTGF0aGEiLAotICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLFJvYm90byxEcm9pZCBTZXJpZixEcm9pZCBTYW5zICIKLSAgICAgTCJNb25vIiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4ZjYxNmYzZGQsIEwiTGlTdSIsIEwiRHJvaWQgU2FucyBGYWxsYmFjayIsIDEsIDkzNn0sCi0gICAgezB4ZmE0NzlhYTYsIEwiTWljcm9zb2Z0WWFIZWkiLCBMIkRyb2lkIFNhbnMgRmFsbGJhY2siLCAwLCA5MzZ9LAotICAgIHsweGZjZDE5Njk3LCBMIkJvb2ttYW5PbGRTdHlsZSIsCi0gICAgIEwiRHJvaWQgU2VyaWYsUm9ib3RvLERyb2lkIFNhbnMgTW9ubyxEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgMTI1Mn0sCi0gICAgezB4ZmUyMDlhODIsIEwiTHVjaWRhQ2FsbGlncmFwaHkiLAotICAgICBMIkRyb2lkIEFyYWJpYyBOYXNraCxEcm9pZCBTYW5zIEV0aGlvcGljLERyb2lkIFNlcmlmLFJvYm90byxEcm9pZCBTYW5zICIKLSAgICAgTCJNb25vIiwKLSAgICAgMCwgMTI1Mn0sCi0gICAgezB4ZmVmMTM1ZjgsIEwiQWRvYmVIZWl0aVN0ZC1SZWd1bGFyIiwgTCJEcm9pZCBTYW5zIEZhbGxiYWNrIiwgMCwgOTM2fSwKLX07Ci0jZW5kaWYKLQotQ0ZYX1dpZGVTdHJpbmcgWEZBX0xvY2FsRm9udE5hbWVUb0VuZ2xpc2hOYW1lKAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMb2NhbE5hbWUpIHsKLSAgdWludDMyX3QgZHdMb2NhbE5hbWVIYXNoID0gRlhfSGFzaENvZGVfR2V0Vyh3c0xvY2FsTmFtZSwgdHJ1ZSk7Ci0gIGNvbnN0IFhGQV9GT05USU5GTyogcEVuZCA9IGdfWEZBRm9udHNNYXAgKyBGWF9BcnJheVNpemUoZ19YRkFGb250c01hcCk7Ci0gIGNvbnN0IFhGQV9GT05USU5GTyogcEZvbnRJbmZvID0KLSAgICAgIHN0ZDo6bG93ZXJfYm91bmQoZ19YRkFGb250c01hcCwgcEVuZCwgZHdMb2NhbE5hbWVIYXNoLAotICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBYRkFfRk9OVElORk8mIGVudHJ5LCB1aW50MzJfdCBoYXNoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmR3Rm9udE5hbWVIYXNoIDwgaGFzaDsKLSAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gIGlmIChwRm9udEluZm8gPCBwRW5kICYmIHBGb250SW5mby0+ZHdGb250TmFtZUhhc2ggPT0gZHdMb2NhbE5hbWVIYXNoKQotICAgIHJldHVybiBwRm9udEluZm8tPnBQc05hbWU7Ci0gIHJldHVybiBDRlhfV2lkZVN0cmluZyh3c0xvY2FsTmFtZSk7Ci19Ci0KLWNvbnN0IFhGQV9GT05USU5GTyogWEZBX0dldEZvbnRJTkZPQnlGb250TmFtZSgKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9udE5hbWUpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NGb250TmFtZVRlbXAod3NGb250TmFtZSk7Ci0gIHdzRm9udE5hbWVUZW1wLlJlbW92ZShMJyAnKTsKLSAgdWludDMyX3QgZHdDdXJGb250TmFtZUhhc2ggPQotICAgICAgRlhfSGFzaENvZGVfR2V0Vyh3c0ZvbnROYW1lVGVtcC5Bc1N0cmluZ0MoKSwgdHJ1ZSk7Ci0gIGNvbnN0IFhGQV9GT05USU5GTyogcEVuZCA9IGdfWEZBRm9udHNNYXAgKyBGWF9BcnJheVNpemUoZ19YRkFGb250c01hcCk7Ci0gIGNvbnN0IFhGQV9GT05USU5GTyogcEZvbnRJbmZvID0KLSAgICAgIHN0ZDo6bG93ZXJfYm91bmQoZ19YRkFGb250c01hcCwgcEVuZCwgZHdDdXJGb250TmFtZUhhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IFhGQV9GT05USU5GTyYgZW50cnksIHVpbnQzMl90IGhhc2gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkuZHdGb250TmFtZUhhc2ggPCBoYXNoOwotICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgaWYgKHBGb250SW5mbyA8IHBFbmQgJiYgcEZvbnRJbmZvLT5kd0ZvbnROYW1lSGFzaCA9PSBkd0N1ckZvbnROYW1lSGFzaCkKLSAgICByZXR1cm4gcEZvbnRJbmZvOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLUNYRkFfRGVmRm9udE1ncjo6Q1hGQV9EZWZGb250TWdyKCkge30KLQotQ1hGQV9EZWZGb250TWdyOjp+Q1hGQV9EZWZGb250TWdyKCkge30KLQotQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IENYRkFfRGVmRm9udE1ncjo6R2V0Rm9udCgKLSAgICBDWEZBX0ZGRG9jKiBoRG9jLAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LAotICAgIHVpbnQzMl90IGR3Rm9udFN0eWxlcywKLSAgICB1aW50MTZfdCB3Q29kZVBhZ2UpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NGb250TmFtZSh3c0ZvbnRGYW1pbHkpOwotICBDRkdBU19Gb250TWdyKiBwRkRFRm9udE1nciA9IGhEb2MtPkdldEFwcCgpLT5HZXRGREVGb250TWdyKCk7Ci0gIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBwRm9udCA9Ci0gICAgICBwRkRFRm9udE1nci0+TG9hZEZvbnQod3NGb250TmFtZS5jX3N0cigpLCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7Ci0gIGlmICghcEZvbnQpIHsKLSAgICBjb25zdCBYRkFfRk9OVElORk8qIHBDdXJGb250ID0KLSAgICAgICAgWEZBX0dldEZvbnRJTkZPQnlGb250TmFtZSh3c0ZvbnROYW1lLkFzU3RyaW5nQygpKTsKLSAgICBpZiAocEN1ckZvbnQgJiYgcEN1ckZvbnQtPnBSZXBsYWNlRm9udCkgewotICAgICAgdWludDMyX3QgZHdTdHlsZSA9IDA7Ci0gICAgICBpZiAoZHdGb250U3R5bGVzICYgRlhfRk9OVFNUWUxFX0JvbGQpIHsKLSAgICAgICAgZHdTdHlsZSB8PSBGWF9GT05UU1RZTEVfQm9sZDsKLSAgICAgIH0KLSAgICAgIGlmIChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfSXRhbGljKSB7Ci0gICAgICAgIGR3U3R5bGUgfD0gRlhfRk9OVFNUWUxFX0l0YWxpYzsKLSAgICAgIH0KLSAgICAgIGNvbnN0IEZYX1dDSEFSKiBwUmVwbGFjZSA9IHBDdXJGb250LT5wUmVwbGFjZUZvbnQ7Ci0gICAgICBpbnQzMl90IGlMZW5ndGggPSBGWFNZU193Y3NsZW4ocFJlcGxhY2UpOwotICAgICAgd2hpbGUgKGlMZW5ndGggPiAwKSB7Ci0gICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwTmFtZVRleHQgPSBwUmVwbGFjZTsKLSAgICAgICAgd2hpbGUgKCpwTmFtZVRleHQgIT0gTCcsJyAmJiBpTGVuZ3RoID4gMCkgewotICAgICAgICAgIHBOYW1lVGV4dCsrOwotICAgICAgICAgIGlMZW5ndGgtLTsKLSAgICAgICAgfQotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1JlcGxhY2UgPQotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcocFJlcGxhY2UsIHBOYW1lVGV4dCAtIHBSZXBsYWNlKTsKLSAgICAgICAgcEZvbnQgPSBwRkRFRm9udE1nci0+TG9hZEZvbnQod3NSZXBsYWNlLmNfc3RyKCksIGR3U3R5bGUsIHdDb2RlUGFnZSk7Ci0gICAgICAgIGlmIChwRm9udCkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBpTGVuZ3RoLS07Ci0gICAgICAgIHBOYW1lVGV4dCsrOwotICAgICAgICBwUmVwbGFjZSA9IHBOYW1lVGV4dDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaWYgKHBGb250KQotICAgIG1fQ2FjaGVGb250cy5wdXNoX2JhY2socEZvbnQpOwotICByZXR1cm4gcEZvbnQ7Ci19Ci0KLUNGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBDWEZBX0RlZkZvbnRNZ3I6OkdldERlZmF1bHRGb250KAotICAgIENYRkFfRkZEb2MqIGhEb2MsCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksCi0gICAgdWludDMyX3QgZHdGb250U3R5bGVzLAotICAgIHVpbnQxNl90IHdDb2RlUGFnZSkgewotICBDRkdBU19Gb250TWdyKiBwRkRFRm9udE1nciA9IGhEb2MtPkdldEFwcCgpLT5HZXRGREVGb250TWdyKCk7Ci0gIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBwRm9udCA9Ci0gICAgICBwRkRFRm9udE1nci0+TG9hZEZvbnQoTCJBcmlhbCBOYXJyb3ciLCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7Ci0gIGlmICghcEZvbnQpIHsKLSAgICBwRm9udCA9IHBGREVGb250TWdyLT5Mb2FkRm9udChzdGF0aWNfY2FzdDxjb25zdCBGWF9XQ0hBUio+KG51bGxwdHIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsKLSAgfQotICBpZiAocEZvbnQpCi0gICAgbV9DYWNoZUZvbnRzLnB1c2hfYmFjayhwRm9udCk7Ci0gIHJldHVybiBwRm9udDsKLX0KLQotQ1hGQV9QREZGb250TWdyOjpDWEZBX1BERkZvbnRNZ3IoQ1hGQV9GRkRvYyogcERvYykgOiBtX3BEb2MocERvYykge30KLQotQ1hGQV9QREZGb250TWdyOjp+Q1hGQV9QREZGb250TWdyKCkge30KLQotQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IENYRkFfUERGRm9udE1ncjo6RmluZEZvbnQoCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0clBzTmFtZSwKLSAgICBib29sIGJCb2xkLAotICAgIGJvb2wgYkl0YWxpYywKLSAgICBDUERGX0ZvbnQqKiBwRHN0UERGRm9udCwKLSAgICBib29sIGJTdHJpY3RNYXRjaCkgewotICBDUERGX0RvY3VtZW50KiBwRG9jID0gbV9wRG9jLT5HZXRQREZEb2MoKTsKLSAgaWYgKCFwRG9jKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIENQREZfRGljdGlvbmFyeSogcEZvbnRTZXREaWN0ID0KLSAgICAgIHBEb2MtPkdldFJvb3QoKS0+R2V0RGljdEZvcigiQWNyb0Zvcm0iKS0+R2V0RGljdEZvcigiRFIiKTsKLSAgaWYgKCFwRm9udFNldERpY3QpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgcEZvbnRTZXREaWN0ID0gcEZvbnRTZXREaWN0LT5HZXREaWN0Rm9yKCJGb250Iik7Ci0gIGlmICghcEZvbnRTZXREaWN0KQotICAgIHJldHVybiBudWxscHRyOwotCi0gIENGWF9CeXRlU3RyaW5nIG5hbWUgPSBzdHJQc05hbWU7Ci0gIG5hbWUuUmVtb3ZlKCcgJyk7Ci0gIENGR0FTX0ZvbnRNZ3IqIHBGREVGb250TWdyID0gbV9wRG9jLT5HZXRBcHAoKS0+R2V0RkRFRm9udE1ncigpOwotICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogKnBGb250U2V0RGljdCkgewotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBrZXkgPSBpdC5maXJzdDsKLSAgICBDUERGX09iamVjdCogcE9iaiA9IGl0LnNlY29uZC5nZXQoKTsKLSAgICBpZiAoIVBzTmFtZU1hdGNoRFJGb250TmFtZShuYW1lLkFzU3RyaW5nQygpLCBiQm9sZCwgYkl0YWxpYywga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTdHJpY3RNYXRjaCkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBDUERGX0RpY3Rpb25hcnkqIHBGb250RGljdCA9IFRvRGljdGlvbmFyeShwT2JqLT5HZXREaXJlY3QoKSk7Ci0gICAgaWYgKCFwRm9udERpY3QgfHwgcEZvbnREaWN0LT5HZXRTdHJpbmdGb3IoIlR5cGUiKSAhPSAiRm9udCIpIHsKLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICBDUERGX0ZvbnQqIHBQREZGb250ID0gcERvYy0+TG9hZEZvbnQocEZvbnREaWN0KTsKLSAgICBpZiAoIXBQREZGb250KSB7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gICAgaWYgKCFwUERGRm9udC0+SXNFbWJlZGRlZCgpKSB7Ci0gICAgICAqcERzdFBERkZvbnQgPSBwUERGRm9udDsKLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICByZXR1cm4gQ0ZHQVNfR0VGb250OjpMb2FkRm9udCgmcFBERkZvbnQtPm1fRm9udCwgcEZERUZvbnRNZ3IpOwotICB9Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1DRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gQ1hGQV9QREZGb250TWdyOjpHZXRGb250KAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LAotICAgIHVpbnQzMl90IGR3Rm9udFN0eWxlcywKLSAgICBDUERGX0ZvbnQqKiBwUERGRm9udCwKLSAgICBib29sIGJTdHJpY3RNYXRjaCkgewotICB1aW50MzJfdCBkd0hhc2hDb2RlID0gRlhfSGFzaENvZGVfR2V0Vyh3c0ZvbnRGYW1pbHksIGZhbHNlKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgc3RyS2V5OwotICBzdHJLZXkuRm9ybWF0KCIldSV1IiwgZHdIYXNoQ29kZSwgZHdGb250U3R5bGVzKTsKLSAgYXV0byBpdCA9IG1fRm9udE1hcC5maW5kKHN0cktleSk7Ci0gIGlmIChpdCAhPSBtX0ZvbnRNYXAuZW5kKCkpCi0gICAgcmV0dXJuIGl0LT5zZWNvbmQ7Ci0gIENGWF9CeXRlU3RyaW5nIGJzUHNOYW1lID0KLSAgICAgIENGWF9CeXRlU3RyaW5nOjpGcm9tVW5pY29kZShDRlhfV2lkZVN0cmluZyh3c0ZvbnRGYW1pbHkpKTsKLSAgYm9vbCBiQm9sZCA9IChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfQm9sZCkgPT0gRlhfRk9OVFNUWUxFX0JvbGQ7Ci0gIGJvb2wgYkl0YWxpYyA9IChkd0ZvbnRTdHlsZXMgJiBGWF9GT05UU1RZTEVfSXRhbGljKSA9PSBGWF9GT05UU1RZTEVfSXRhbGljOwotICBDRlhfQnl0ZVN0cmluZyBzdHJGb250TmFtZSA9IFBzTmFtZVRvRm9udE5hbWUoYnNQc05hbWUsIGJCb2xkLCBiSXRhbGljKTsKLSAgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IHBGb250ID0KLSAgICAgIEZpbmRGb250KHN0ckZvbnROYW1lLCBiQm9sZCwgYkl0YWxpYywgcFBERkZvbnQsIGJTdHJpY3RNYXRjaCk7Ci0gIGlmIChwRm9udCkKLSAgICBtX0ZvbnRNYXBbc3RyS2V5XSA9IHBGb250OwotICByZXR1cm4gcEZvbnQ7Ci19Ci0KLUNGWF9CeXRlU3RyaW5nIENYRkFfUERGRm9udE1ncjo6UHNOYW1lVG9Gb250TmFtZSgKLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZyYgc3RyUHNOYW1lLAotICAgIGJvb2wgYkJvbGQsCi0gICAgYm9vbCBiSXRhbGljKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKGdfWEZBUERGRm9udE5hbWUpOyArK2kpIHsKLSAgICBpZiAoc3RyUHNOYW1lID09IGdfWEZBUERGRm9udE5hbWVbaV1bMF0pIHsKLSAgICAgIHNpemVfdCBpbmRleCA9IDE7Ci0gICAgICBpZiAoYkJvbGQpCi0gICAgICAgICsraW5kZXg7Ci0gICAgICBpZiAoYkl0YWxpYykKLSAgICAgICAgaW5kZXggKz0gMjsKLSAgICAgIHJldHVybiBnX1hGQVBERkZvbnROYW1lW2ldW2luZGV4XTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHN0clBzTmFtZTsKLX0KLQotYm9vbCBDWEZBX1BERkZvbnRNZ3I6OlBzTmFtZU1hdGNoRFJGb250TmFtZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzUHNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJCb2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJdGFsaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nJiBic0RSRm9udE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0cmljdE1hdGNoKSB7Ci0gIENGWF9CeXRlU3RyaW5nIGJzRFJOYW1lID0gYnNEUkZvbnROYW1lOwotICBic0RSTmFtZS5SZW1vdmUoJy0nKTsKLSAgaW50MzJfdCBpUHNMZW4gPSBic1BzTmFtZS5HZXRMZW5ndGgoKTsKLSAgaW50MzJfdCBuSW5kZXggPSBic0RSTmFtZS5GaW5kKGJzUHNOYW1lKTsKLSAgaWYgKG5JbmRleCAhPSAtMSAmJiAhYlN0cmljdE1hdGNoKQotICAgIHJldHVybiB0cnVlOwotCi0gIGlmIChuSW5kZXggIT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaW50MzJfdCBpRGlmZmVyTGVuZ3RoID0gYnNEUk5hbWUuR2V0TGVuZ3RoKCkgLSBpUHNMZW47Ci0gIGlmIChpRGlmZmVyTGVuZ3RoID4gMSB8fCAoYkJvbGQgfHwgYkl0YWxpYykpIHsKLSAgICBpbnQzMl90IGlCb2xkSW5kZXggPSBic0RSTmFtZS5GaW5kKCJCb2xkIik7Ci0gICAgYm9vbCBiQm9sZEZvbnQgPSBpQm9sZEluZGV4ID4gMDsKLSAgICBpZiAoYkJvbGQgIT0gYkJvbGRGb250KQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaWYgKGJCb2xkRm9udCkgewotICAgICAgaURpZmZlckxlbmd0aCA9Ci0gICAgICAgICAgc3RkOjptaW4oaURpZmZlckxlbmd0aCAtIDQsIGJzRFJOYW1lLkdldExlbmd0aCgpIC0gaUJvbGRJbmRleCAtIDQpOwotICAgIH0KLSAgICBib29sIGJJdGFsaWNGb250ID0gdHJ1ZTsKLSAgICBpZiAoYnNEUk5hbWUuRmluZCgiSXRhbGljIikgPiAwKSB7Ci0gICAgICBpRGlmZmVyTGVuZ3RoIC09IDY7Ci0gICAgfSBlbHNlIGlmIChic0RSTmFtZS5GaW5kKCJJdCIpID4gMCkgewotICAgICAgaURpZmZlckxlbmd0aCAtPSAyOwotICAgIH0gZWxzZSBpZiAoYnNEUk5hbWUuRmluZCgiT2JsaXF1ZSIpID4gMCkgewotICAgICAgaURpZmZlckxlbmd0aCAtPSA3OwotICAgIH0gZWxzZSB7Ci0gICAgICBiSXRhbGljRm9udCA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAoYkl0YWxpYyAhPSBiSXRhbGljRm9udCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChpRGlmZmVyTGVuZ3RoID4gMSkgewotICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNEUlRhaWxlciA9IGJzRFJOYW1lLlJpZ2h0KGlEaWZmZXJMZW5ndGgpOwotICAgICAgaWYgKGJzRFJUYWlsZXIgPT0gIk1UIiB8fCBic0RSVGFpbGVyID09ICJQU01UIiB8fAotICAgICAgICAgIGJzRFJUYWlsZXIgPT0gIlJlZ3VsYXIiIHx8IGJzRFJUYWlsZXIgPT0gIlJlZyIpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoYkJvbGRGb250IHx8IGJJdGFsaWNGb250KQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGJvb2wgYk1hdGNoID0gZmFsc2U7Ci0gICAgICBzd2l0Y2ggKGJzUHNOYW1lLkdldEF0KGlQc0xlbiAtIDEpKSB7Ci0gICAgICAgIGNhc2UgJ0wnOiB7Ci0gICAgICAgICAgaWYgKGJzRFJOYW1lLlJpZ2h0KDUpID09ICJMaWdodCIpIHsKLSAgICAgICAgICAgIGJNYXRjaCA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlICdSJzogewotICAgICAgICAgIGlmIChic0RSTmFtZS5SaWdodCg3KSA9PSAiUmVndWxhciIgfHwgYnNEUk5hbWUuUmlnaHQoMykgPT0gIlJlZyIpIHsKLSAgICAgICAgICAgIGJNYXRjaCA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9IGJyZWFrOwotICAgICAgICBjYXNlICdNJzogewotICAgICAgICAgIGlmIChic0RSTmFtZS5SaWdodCg1KSA9PSAiTWVkaXVtIikgewotICAgICAgICAgICAgYk1hdGNoID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gYk1hdGNoOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDWEZBX1BERkZvbnRNZ3I6OkdldENoYXJXaWR0aChjb25zdCBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4mIHBGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9XQ0hBUiB3VW5pY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ2hhckNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBXaWR0aCkgewotICBpZiAod1VuaWNvZGUgIT0gMHgyMCB8fCBiQ2hhckNvZGUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGF1dG8gaXQgPSBtX0ZERTJQREZGb250LmZpbmQocEZvbnQpOwotICBpZiAoaXQgPT0gbV9GREUyUERGRm9udC5lbmQoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1BERl9Gb250KiBwUERGRm9udCA9IGl0LT5zZWNvbmQ7Ci0gICpwV2lkdGggPSBwUERGRm9udC0+R2V0Q2hhcldpZHRoRihwUERGRm9udC0+Q2hhckNvZGVGcm9tVW5pY29kZSh3VW5pY29kZSkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDWEZBX1BERkZvbnRNZ3I6OlNldEZvbnQoY29uc3QgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+JiBwRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCogcFBERkZvbnQpIHsKLSAgbV9GREUyUERGRm9udFtwRm9udF0gPSBwUERGRm9udDsKLX0KLQotQ1hGQV9Gb250TWdyOjpDWEZBX0ZvbnRNZ3IoKSB7fQotCi1DWEZBX0ZvbnRNZ3I6On5DWEZBX0ZvbnRNZ3IoKSB7fQotCi1DRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gQ1hGQV9Gb250TWdyOjpHZXRGb250KAotICAgIENYRkFfRkZEb2MqIGhEb2MsCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0ZvbnRGYW1pbHksCi0gICAgdWludDMyX3QgZHdGb250U3R5bGVzLAotICAgIHVpbnQxNl90IHdDb2RlUGFnZSkgewotICB1aW50MzJfdCBkd0hhc2ggPSBGWF9IYXNoQ29kZV9HZXRXKHdzRm9udEZhbWlseSwgZmFsc2UpOwotICBDRlhfQnl0ZVN0cmluZyBic0tleTsKLSAgYnNLZXkuRm9ybWF0KCIldSV1JXUiLCBkd0hhc2gsIGR3Rm9udFN0eWxlcywgd0NvZGVQYWdlKTsKLSAgYXV0byBpdGVyID0gbV9Gb250TWFwLmZpbmQoYnNLZXkpOwotICBpZiAoaXRlciAhPSBtX0ZvbnRNYXAuZW5kKCkpCi0gICAgcmV0dXJuIGl0ZXItPnNlY29uZDsKLQotICBDRlhfV2lkZVN0cmluZyB3c0VuZ2xpc2hOYW1lID0gWEZBX0xvY2FsRm9udE5hbWVUb0VuZ2xpc2hOYW1lKHdzRm9udEZhbWlseSk7Ci0gIGF1dG8gaXQgPSBtX1BERkZvbnRNZ3JNYXAuZmluZChoRG9jKTsKLSAgQ1hGQV9QREZGb250TWdyKiBwTWdyID0KLSAgICAgIGl0ICE9IG1fUERGRm9udE1nck1hcC5lbmQoKSA/IGl0LT5zZWNvbmQuZ2V0KCkgOiBudWxscHRyOwotICBDUERGX0ZvbnQqIHBQREZGb250ID0gbnVsbHB0cjsKLSAgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IHBGb250OwotICBpZiAocE1ncikgewotICAgIHBGb250ID0KLSAgICAgICAgcE1nci0+R2V0Rm9udCh3c0VuZ2xpc2hOYW1lLkFzU3RyaW5nQygpLCBkd0ZvbnRTdHlsZXMsICZwUERGRm9udCwgdHJ1ZSk7Ci0gICAgaWYgKHBGb250KQotICAgICAgcmV0dXJuIHBGb250OwotICB9Ci0gIGlmICghcEZvbnQgJiYgbV9wRGVmRm9udE1ncikKLSAgICBwRm9udCA9IG1fcERlZkZvbnRNZ3ItPkdldEZvbnQoaERvYywgd3NGb250RmFtaWx5LCBkd0ZvbnRTdHlsZXMsIHdDb2RlUGFnZSk7Ci0KLSAgaWYgKCFwRm9udCAmJiBwTWdyKSB7Ci0gICAgcFBERkZvbnQgPSBudWxscHRyOwotICAgIHBGb250ID0gcE1nci0+R2V0Rm9udCh3c0VuZ2xpc2hOYW1lLkFzU3RyaW5nQygpLCBkd0ZvbnRTdHlsZXMsICZwUERGRm9udCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgIGlmIChwRm9udCkKLSAgICAgIHJldHVybiBwRm9udDsKLSAgfQotICBpZiAoIXBGb250ICYmIG1fcERlZkZvbnRNZ3IpIHsKLSAgICBwRm9udCA9IG1fcERlZkZvbnRNZ3ItPkdldERlZmF1bHRGb250KGhEb2MsIHdzRm9udEZhbWlseSwgZHdGb250U3R5bGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0NvZGVQYWdlKTsKLSAgfQotICBpZiAocEZvbnQpIHsKLSAgICBpZiAocFBERkZvbnQpIHsKLSAgICAgIHBNZ3ItPlNldEZvbnQocEZvbnQsIHBQREZGb250KTsKLSAgICAgIHBGb250LT5TZXRGb250UHJvdmlkZXIocE1ncik7Ci0gICAgfQotICAgIG1fRm9udE1hcFtic0tleV0gPSBwRm9udDsKLSAgfQotICByZXR1cm4gcEZvbnQ7Ci19Ci0KLXZvaWQgQ1hGQV9Gb250TWdyOjpMb2FkRG9jRm9udHMoQ1hGQV9GRkRvYyogaERvYykgewotICBpZiAoIW1fUERGRm9udE1nck1hcFtoRG9jXSkKLSAgICBtX1BERkZvbnRNZ3JNYXBbaERvY10gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9QREZGb250TWdyPihoRG9jKTsKLX0KLQotdm9pZCBDWEZBX0ZvbnRNZ3I6OlJlbGVhc2VEb2NGb250cyhDWEZBX0ZGRG9jKiBoRG9jKSB7Ci0gIG1fUERGRm9udE1nck1hcC5lcmFzZShoRG9jKTsKLX0KLQotdm9pZCBDWEZBX0ZvbnRNZ3I6OlNldERlZkZvbnRNZ3Ioc3RkOjp1bmlxdWVfcHRyPENYRkFfRGVmRm9udE1ncj4gcEZvbnRNZ3IpIHsKLSAgbV9wRGVmRm9udE1nciA9IHN0ZDo6bW92ZShwRm9udE1ncik7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAveGZhX2Z3bGFkYXB0ZXIuY3BwIGIveGZhL2Z4ZmEvYXBwL3hmYV9md2xhZGFwdGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFmM2UyMC4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAveGZhX2Z3bGFkYXB0ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9md2xhZGFwdGVyLmgiCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2ZmZmllbGQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZkb2MuaCIKLQotQ1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyOjpDWEZBX0ZXTEFkYXB0ZXJXaWRnZXRNZ3IoKSB7fQotCi1DWEZBX0ZXTEFkYXB0ZXJXaWRnZXRNZ3I6On5DWEZBX0ZXTEFkYXB0ZXJXaWRnZXRNZ3IoKSB7fQotCi12b2lkIENYRkFfRldMQWRhcHRlcldpZGdldE1ncjo6UmVwYWludFdpZGdldChDRldMX1dpZGdldCogcFdpZGdldCkgewotICBpZiAoIXBXaWRnZXQpCi0gICAgcmV0dXJuOwotCi0gIENYRkFfRkZXaWRnZXQqIHBGRldpZGdldCA9IHBXaWRnZXQtPkdldExheW91dEl0ZW0oKTsKLSAgaWYgKCFwRkZXaWRnZXQpCi0gICAgcmV0dXJuOwotCi0gIHBGRldpZGdldC0+QWRkSW52YWxpZGF0ZVJlY3QobnVsbHB0cik7Ci19Ci0KLWJvb2wgQ1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyOjpHZXRQb3B1cFBvcyhDRldMX1dpZGdldCogcFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmTWluSGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXhIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0UG9wdXApIHsKLSAgQ1hGQV9GRldpZGdldCogcEZGV2lkZ2V0ID0gcFdpZGdldC0+R2V0TGF5b3V0SXRlbSgpOwotICBDRlhfUmVjdEYgcnRSb3RhdGVBbmNob3IocnRBbmNob3IpOwotICBwRkZXaWRnZXQtPkdldFJvdGF0ZU1hdHJpeCgpLlRyYW5zZm9ybVJlY3QocnRSb3RhdGVBbmNob3IpOwotICBwRkZXaWRnZXQtPkdldERvYygpLT5HZXREb2NFbnZpcm9ubWVudCgpLT5HZXRQb3B1cFBvcygKLSAgICAgIHBGRldpZGdldCwgZk1pbkhlaWdodCwgZk1heEhlaWdodCwgcnRSb3RhdGVBbmNob3IsIHJ0UG9wdXApOwotICByZXR1cm4gdHJ1ZTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2FwcC94ZmFfZndsYWRhcHRlci5oIGIveGZhL2Z4ZmEvYXBwL3hmYV9md2xhZGFwdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OGZiNzAuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvYXBwL3hmYV9md2xhZGFwdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYRkFfQVBQX1hGQV9GV0xBREFQVEVSX0hfCi0jZGVmaW5lIFhGQV9GWEZBX0FQUF9YRkFfRldMQURBUFRFUl9IXwotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0KLWNsYXNzIENGV0xfV2lkZ2V0OwotCi1jbGFzcyBDWEZBX0ZXTEFkYXB0ZXJXaWRnZXRNZ3IgewotIHB1YmxpYzoKLSAgQ1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyKCk7Ci0gIH5DWEZBX0ZXTEFkYXB0ZXJXaWRnZXRNZ3IoKTsKLQotICB2b2lkIFJlcGFpbnRXaWRnZXQoQ0ZXTF9XaWRnZXQqIHBXaWRnZXQpOwotICBib29sIEdldFBvcHVwUG9zKENGV0xfV2lkZ2V0KiBwV2lkZ2V0LAotICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNaW5IZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZk1heEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yLAotICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCk7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEZBX0FQUF9YRkFfRldMQURBUFRFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL3hmYV9md2x0aGVtZS5jcHAgYi94ZmEvZnhmYS9hcHAveGZhX2Z3bHRoZW1lLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNhYmFlYy4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAveGZhX2Z3bHRoZW1lLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2Z3bHRoZW1lLmgiCi0KLSNpbmNsdWRlICJ4ZmEvZmRlL3R0by9mZGVfdGV4dG91dC5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2NydC9mZ2FzX2NvZGVwYWdlLmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9jZmdhc19nZWZvbnQuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfYmFyY29kZS5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9jYXJldC5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9jaGVja2JveC5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9jb21ib2JveC5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9kYXRldGltZXBpY2tlci5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9lZGl0LmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX2xpc3Rib3guaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfbW9udGhjYWxlbmRhci5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9waWN0dXJlYm94LmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX3B1c2hidXR0b24uaCIKLSNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfc2Nyb2xsYmFyLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX3RoZW1lYmFja2dyb3VuZC5oIgotI2luY2x1ZGUgInhmYS9md2wvY2Z3bF90aGVtZXRleHQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZhcHAuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZ3aWRnZXQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfY29sb3IuaCIKLQotbmFtZXNwYWNlIHsKLQotY29uc3QgRlhfV0NIQVIqIGNvbnN0IGdfRldMVGhlbWVfQ2FsRm9udHNbXSA9IHsKLSAgICBMIkFyaWFsIiwgTCJDb3VyaWVyIE5ldyIsIEwiRGVqYVZ1IFNhbnMiLAotfTsKLQotY29uc3QgZmxvYXQga0xpbmVIZWlnaHQgPSAxMi4wZjsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLUNYRkFfRkZXaWRnZXQqIFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KENGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7Ci0gIENGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBwV2lkZ2V0OwotICB3aGlsZSAocE91dGVyICYmIHBPdXRlci0+R2V0T3V0ZXIoKSkKLSAgICBwT3V0ZXIgPSBwT3V0ZXItPkdldE91dGVyKCk7Ci0gIHJldHVybiBwT3V0ZXIgPyBwT3V0ZXItPkdldExheW91dEl0ZW0oKSA6IG51bGxwdHI7Ci19Ci0KLUNYRkFfRldMVGhlbWU6OkNYRkFfRldMVGhlbWUoQ1hGQV9GRkFwcCogcEFwcCkKLSAgICA6IG1fcENoZWNrQm94VFAobmV3IENGV0xfQ2hlY2tCb3hUUCksCi0gICAgICBtX3BMaXN0Qm94VFAobmV3IENGV0xfTGlzdEJveFRQKSwKLSAgICAgIG1fcFBpY3R1cmVCb3hUUChuZXcgQ0ZXTF9QaWN0dXJlQm94VFApLAotICAgICAgbV9wU3JvbGxCYXJUUChuZXcgQ0ZXTF9TY3JvbGxCYXJUUCksCi0gICAgICBtX3BFZGl0VFAobmV3IENGV0xfRWRpdFRQKSwKLSAgICAgIG1fcENvbWJvQm94VFAobmV3IENGV0xfQ29tYm9Cb3hUUCksCi0gICAgICBtX3BNb250aENhbGVuZGFyVFAobmV3IENGV0xfTW9udGhDYWxlbmRhclRQKSwKLSAgICAgIG1fcERhdGVUaW1lUGlja2VyVFAobmV3IENGV0xfRGF0ZVRpbWVQaWNrZXJUUCksCi0gICAgICBtX3BQdXNoQnV0dG9uVFAobmV3IENGV0xfUHVzaEJ1dHRvblRQKSwKLSAgICAgIG1fcENhcmV0VFAobmV3IENGV0xfQ2FyZXRUUCksCi0gICAgICBtX3BCYXJjb2RlVFAobmV3IENGV0xfQmFyY29kZVRQKSwKLSAgICAgIG1fcFRleHRPdXQobmV3IENGREVfVGV4dE91dCksCi0gICAgICBtX3BDYWxlbmRhckZvbnQobnVsbHB0ciksCi0gICAgICBtX3BBcHAocEFwcCkgewotICBtX1JlY3QuUmVzZXQoKTsKLQotICBmb3IgKHNpemVfdCBpID0gMDsgIW1fcENhbGVuZGFyRm9udCAmJiBpIDwgRlhfQXJyYXlTaXplKGdfRldMVGhlbWVfQ2FsRm9udHMpOwotICAgICAgICsraSkgewotICAgIG1fcENhbGVuZGFyRm9udCA9IENGR0FTX0dFRm9udDo6TG9hZEZvbnQoZ19GV0xUaGVtZV9DYWxGb250c1tpXSwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEFwcC0+R2V0RkRFRm9udE1ncigpKTsKLSAgfQotICBpZiAoIW1fcENhbGVuZGFyRm9udCkgewotICAgIG1fcENhbGVuZGFyRm9udCA9IG1fcEFwcC0+R2V0RkRFRm9udE1ncigpLT5HZXRGb250QnlDb2RlUGFnZSgKLSAgICAgICAgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFuLCAwLCBudWxscHRyKTsKLSAgfQotCi0gIEFTU0VSVChtX3BDYWxlbmRhckZvbnQpOwotfQotCi1DWEZBX0ZXTFRoZW1lOjp+Q1hGQV9GV0xUaGVtZSgpIHsKLSAgbV9wVGV4dE91dC5yZXNldCgpOwotICBGV0xUSEVNRV9SZWxlYXNlKCk7Ci19Ci0KLXZvaWQgQ1hGQV9GV0xUaGVtZTo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpIHsKLSAgR2V0VGhlbWUocFBhcmFtcy0+bV9wV2lkZ2V0KS0+RHJhd0JhY2tncm91bmQocFBhcmFtcyk7Ci19Ci0KLXZvaWQgQ1hGQV9GV0xUaGVtZTo6RHJhd1RleHQoQ0ZXTF9UaGVtZVRleHQqIHBQYXJhbXMpIHsKLSAgaWYgKHBQYXJhbXMtPm1fd3NUZXh0LklzRW1wdHkoKSkKLSAgICByZXR1cm47Ci0KLSAgaWYgKHBQYXJhbXMtPm1fcFdpZGdldC0+R2V0Q2xhc3NJRCgpID09IEZXTF9UeXBlOjpNb250aENhbGVuZGFyKSB7Ci0gICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBQYXJhbXMtPm1fcFdpZGdldCk7Ci0gICAgaWYgKCFwV2lkZ2V0KQotICAgICAgcmV0dXJuOwotCi0gICAgbV9wVGV4dE91dC0+U2V0U3R5bGVzKHBQYXJhbXMtPm1fZHdUVE9TdHlsZXMpOwotICAgIG1fcFRleHRPdXQtPlNldEFsaWdubWVudChwUGFyYW1zLT5tX2lUVE9BbGlnbik7Ci0gICAgbV9wVGV4dE91dC0+U2V0Rm9udChtX3BDYWxlbmRhckZvbnQpOwotICAgIG1fcFRleHRPdXQtPlNldEZvbnRTaXplKEZXTFRIRU1FX0NBUEFDSVRZX0ZvbnRTaXplKTsKLSAgICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IoRldMVEhFTUVfQ0FQQUNJVFlfVGV4dENvbG9yKTsKLSAgICBpZiAoKHBQYXJhbXMtPm1faVBhcnQgPT0gQ0ZXTF9QYXJ0OjpEYXRlc0luKSAmJgotICAgICAgICAhKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfSVRFTVNUQVRFX01DRF9GbGFnKSAmJgotICAgICAgICAocFBhcmFtcy0+bV9kd1N0YXRlcyAmCi0gICAgICAgICAoQ0ZXTF9QYXJ0U3RhdGVfSG92ZXJlZCB8IENGV0xfUGFydFN0YXRlX1NlbGVjdGVkKSkpIHsKLSAgICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcigweEZGRkZGRkZGKTsKLSAgICB9Ci0gICAgaWYgKHBQYXJhbXMtPm1faVBhcnQgPT0gQ0ZXTF9QYXJ0OjpDYXB0aW9uKQotICAgICAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKEFyZ2JFbmNvZGUoMHhmZiwgMCwgMTUzLCAyNTUpKTsKLQotICAgIENGWF9HcmFwaGljcyogcEdyYXBoaWNzID0gcFBhcmFtcy0+bV9wR3JhcGhpY3M7Ci0gICAgQ0ZYX1JlbmRlckRldmljZSogcFJlbmRlckRldmljZSA9IHBHcmFwaGljcy0+R2V0UmVuZGVyRGV2aWNlKCk7Ci0gICAgaWYgKCFwUmVuZGVyRGV2aWNlKQotICAgICAgcmV0dXJuOwotCi0gICAgbV9wVGV4dE91dC0+U2V0UmVuZGVyRGV2aWNlKHBSZW5kZXJEZXZpY2UpOwotICAgIENGWF9NYXRyaXggbXRQYXJ0ID0gcFBhcmFtcy0+bV9tYXRyaXg7Ci0gICAgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IHBHcmFwaGljcy0+R2V0TWF0cml4KCk7Ci0gICAgaWYgKHBNYXRyaXgpIHsKLSAgICAgIG10UGFydC5Db25jYXQoKnBNYXRyaXgpOwotICAgIH0KLSAgICBtX3BUZXh0T3V0LT5TZXRNYXRyaXgobXRQYXJ0KTsKLSAgICBtX3BUZXh0T3V0LT5EcmF3TG9naWNUZXh0KHBQYXJhbXMtPm1fd3NUZXh0LmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3dzVGV4dC5HZXRMZW5ndGgoKSwgcFBhcmFtcy0+bV9ydFBhcnQpOwotICAgIHJldHVybjsKLSAgfQotICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQocFBhcmFtcy0+bV9wV2lkZ2V0KTsKLSAgaWYgKCFwV2lkZ2V0KQotICAgIHJldHVybjsKLQotICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IHBXaWRnZXQtPkdldERhdGFBY2MoKTsKLSAgQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MgPSBwUGFyYW1zLT5tX3BHcmFwaGljczsKLSAgQ0ZYX1JlbmRlckRldmljZSogcFJlbmRlckRldmljZSA9IHBHcmFwaGljcy0+R2V0UmVuZGVyRGV2aWNlKCk7Ci0gIGlmICghcFJlbmRlckRldmljZSkKLSAgICByZXR1cm47Ci0KLSAgbV9wVGV4dE91dC0+U2V0UmVuZGVyRGV2aWNlKHBSZW5kZXJEZXZpY2UpOwotICBtX3BUZXh0T3V0LT5TZXRTdHlsZXMocFBhcmFtcy0+bV9kd1RUT1N0eWxlcyk7Ci0gIG1fcFRleHRPdXQtPlNldEFsaWdubWVudChwUGFyYW1zLT5tX2lUVE9BbGlnbik7Ci0gIG1fcFRleHRPdXQtPlNldEZvbnQocEFjYy0+R2V0RkRFRm9udCgpKTsKLSAgbV9wVGV4dE91dC0+U2V0Rm9udFNpemUocEFjYy0+R2V0Rm9udFNpemUoKSk7Ci0gIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihwQWNjLT5HZXRUZXh0Q29sb3IoKSk7Ci0gIENGWF9NYXRyaXggbXRQYXJ0ID0gcFBhcmFtcy0+bV9tYXRyaXg7Ci0gIENGWF9NYXRyaXgqIHBNYXRyaXggPSBwR3JhcGhpY3MtPkdldE1hdHJpeCgpOwotICBpZiAocE1hdHJpeCkKLSAgICBtdFBhcnQuQ29uY2F0KCpwTWF0cml4KTsKLQotICBtX3BUZXh0T3V0LT5TZXRNYXRyaXgobXRQYXJ0KTsKLSAgbV9wVGV4dE91dC0+RHJhd0xvZ2ljVGV4dChwUGFyYW1zLT5tX3dzVGV4dC5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fd3NUZXh0LkdldExlbmd0aCgpLCBwUGFyYW1zLT5tX3J0UGFydCk7Ci19Ci0KLUNGWF9SZWN0RiBDWEZBX0ZXTFRoZW1lOjpHZXRVSU1hcmdpbihDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCkgY29uc3QgewotICBDRlhfUmVjdEYgcmVjdDsKLSAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBUaGVtZVBhcnQtPm1fcFdpZGdldCk7Ci0gIGlmICghcFdpZGdldCkKLSAgICByZXR1cm4gcmVjdDsKLQotICBDWEZBX0xheW91dEl0ZW0qIHBJdGVtID0gcFdpZGdldDsKLSAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwV2lkZ2V0LT5HZXREYXRhQWNjKCk7Ci0gIHJlY3QgPSBwV2lkZ2V0QWNjLT5HZXRVSU1hcmdpbigpOwotICBpZiAoQ1hGQV9QYXJhIHBhcmEgPSBwV2lkZ2V0QWNjLT5HZXRQYXJhKCkpIHsKLSAgICByZWN0LmxlZnQgKz0gcGFyYS5HZXRNYXJnaW5MZWZ0KCk7Ci0gICAgaWYgKHBXaWRnZXRBY2MtPklzTXVsdGlMaW5lKCkpCi0gICAgICByZWN0LndpZHRoICs9IHBhcmEuR2V0TWFyZ2luUmlnaHQoKTsKLSAgfQotICBpZiAoIXBJdGVtLT5HZXRQcmV2KCkpIHsKLSAgICBpZiAocEl0ZW0tPkdldE5leHQoKSkKLSAgICAgIHJlY3QuaGVpZ2h0ID0gMDsKLSAgfSBlbHNlIGlmICghcEl0ZW0tPkdldE5leHQoKSkgewotICAgIHJlY3QudG9wID0gMDsKLSAgfSBlbHNlIHsKLSAgICByZWN0LnRvcCA9IDA7Ci0gICAgcmVjdC5oZWlnaHQgPSAwOwotICB9Ci0gIHJldHVybiByZWN0OwotfQotCi1mbG9hdCBDWEZBX0ZXTFRoZW1lOjpHZXRDWEJvcmRlclNpemUoKSBjb25zdCB7Ci0gIHJldHVybiAxLjBmOwotfQotCi1mbG9hdCBDWEZBX0ZXTFRoZW1lOjpHZXRDWUJvcmRlclNpemUoKSBjb25zdCB7Ci0gIHJldHVybiAxLjBmOwotfQotCi1mbG9hdCBDWEZBX0ZXTFRoZW1lOjpHZXRGb250U2l6ZShDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCkgY29uc3QgewotICBpZiAoQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBUaGVtZVBhcnQtPm1fcFdpZGdldCkpCi0gICAgcmV0dXJuIHBXaWRnZXQtPkdldERhdGFBY2MoKS0+R2V0Rm9udFNpemUoKTsKLSAgcmV0dXJuIEZXTFRIRU1FX0NBUEFDSVRZX0ZvbnRTaXplOwotfQotCi1DRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gQ1hGQV9GV0xUaGVtZTo6R2V0Rm9udCgKLSAgICBDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCkgY29uc3QgewotICBpZiAoQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBUaGVtZVBhcnQtPm1fcFdpZGdldCkpCi0gICAgcmV0dXJuIHBXaWRnZXQtPkdldERhdGFBY2MoKS0+R2V0RkRFRm9udCgpOwotICByZXR1cm4gR2V0VGhlbWUocFRoZW1lUGFydC0+bV9wV2lkZ2V0KS0+R2V0Rm9udCgpOwotfQotCi1mbG9hdCBDWEZBX0ZXTFRoZW1lOjpHZXRMaW5lSGVpZ2h0KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0KSBjb25zdCB7Ci0gIGlmIChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQocFRoZW1lUGFydC0+bV9wV2lkZ2V0KSkKLSAgICByZXR1cm4gcFdpZGdldC0+R2V0RGF0YUFjYygpLT5HZXRMaW5lSGVpZ2h0KCk7Ci0gIHJldHVybiBrTGluZUhlaWdodDsKLX0KLQotZmxvYXQgQ1hGQV9GV0xUaGVtZTo6R2V0U2Nyb2xsQmFyV2lkdGgoKSBjb25zdCB7Ci0gIHJldHVybiA5LjBmOwotfQotCi1GWF9DT0xPUlJFRiBDWEZBX0ZXTFRoZW1lOjpHZXRUZXh0Q29sb3IoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQpIGNvbnN0IHsKLSAgaWYgKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBYRkFfVGhlbWVHZXRPdXRlcldpZGdldChwVGhlbWVQYXJ0LT5tX3BXaWRnZXQpKQotICAgIHJldHVybiBwV2lkZ2V0LT5HZXREYXRhQWNjKCktPkdldFRleHRDb2xvcigpOwotICByZXR1cm4gRldMVEhFTUVfQ0FQQUNJVFlfVGV4dENvbG9yOwotfQotCi1DRlhfU2l6ZUYgQ1hGQV9GV0xUaGVtZTo6R2V0U3BhY2VBYm92ZUJlbG93KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0KSBjb25zdCB7Ci0gIENGWF9TaXplRiBzaXplQWJvdmVCZWxvdzsKLSAgaWYgKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBYRkFfVGhlbWVHZXRPdXRlcldpZGdldChwVGhlbWVQYXJ0LT5tX3BXaWRnZXQpKSB7Ci0gICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwV2lkZ2V0LT5HZXREYXRhQWNjKCk7Ci0gICAgaWYgKENYRkFfUGFyYSBwYXJhID0gcFdpZGdldEFjYy0+R2V0UGFyYSgpKSB7Ci0gICAgICBzaXplQWJvdmVCZWxvdy53aWR0aCA9IHBhcmEuR2V0U3BhY2VBYm92ZSgpOwotICAgICAgc2l6ZUFib3ZlQmVsb3cuaGVpZ2h0ID0gcGFyYS5HZXRTcGFjZUJlbG93KCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBzaXplQWJvdmVCZWxvdzsKLX0KLQotdm9pZCBDWEZBX0ZXTFRoZW1lOjpDYWxjVGV4dFJlY3QoQ0ZXTF9UaGVtZVRleHQqIHBQYXJhbXMsIENGWF9SZWN0RiYgcmVjdCkgewotICBpZiAocFBhcmFtcy0+bV9wV2lkZ2V0LT5HZXRDbGFzc0lEKCkgPT0gRldMX1R5cGU6Ok1vbnRoQ2FsZW5kYXIpIHsKLSAgICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQocFBhcmFtcy0+bV9wV2lkZ2V0KTsKLSAgICBpZiAoIXBXaWRnZXQgfHwgIXBQYXJhbXMgfHwgIW1fcFRleHRPdXQpCi0gICAgICByZXR1cm47Ci0KLSAgICBtX3BUZXh0T3V0LT5TZXRGb250KG1fcENhbGVuZGFyRm9udCk7Ci0gICAgbV9wVGV4dE91dC0+U2V0Rm9udFNpemUoRldMVEhFTUVfQ0FQQUNJVFlfRm9udFNpemUpOwotICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcihGV0xUSEVNRV9DQVBBQ0lUWV9UZXh0Q29sb3IpOwotICAgIG1fcFRleHRPdXQtPlNldEFsaWdubWVudChwUGFyYW1zLT5tX2lUVE9BbGlnbik7Ci0gICAgbV9wVGV4dE91dC0+U2V0U3R5bGVzKHBQYXJhbXMtPm1fZHdUVE9TdHlsZXMpOwotICAgIG1fcFRleHRPdXQtPkNhbGNMb2dpY1NpemUocFBhcmFtcy0+bV93c1RleHQuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fd3NUZXh0LkdldExlbmd0aCgpLCByZWN0KTsKLSAgfQotCi0gIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBYRkFfVGhlbWVHZXRPdXRlcldpZGdldChwUGFyYW1zLT5tX3BXaWRnZXQpOwotICBpZiAoIXBXaWRnZXQpCi0gICAgcmV0dXJuOwotCi0gIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gcFdpZGdldC0+R2V0RGF0YUFjYygpOwotICBtX3BUZXh0T3V0LT5TZXRGb250KHBBY2MtPkdldEZERUZvbnQoKSk7Ci0gIG1fcFRleHRPdXQtPlNldEZvbnRTaXplKHBBY2MtPkdldEZvbnRTaXplKCkpOwotICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IocEFjYy0+R2V0VGV4dENvbG9yKCkpOwotICBpZiAoIXBQYXJhbXMpCi0gICAgcmV0dXJuOwotCi0gIG1fcFRleHRPdXQtPlNldEFsaWdubWVudChwUGFyYW1zLT5tX2lUVE9BbGlnbik7Ci0gIG1fcFRleHRPdXQtPlNldFN0eWxlcyhwUGFyYW1zLT5tX2R3VFRPU3R5bGVzKTsKLSAgbV9wVGV4dE91dC0+Q2FsY0xvZ2ljU2l6ZShwUGFyYW1zLT5tX3dzVGV4dC5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMtPm1fd3NUZXh0LkdldExlbmd0aCgpLCByZWN0KTsKLX0KLQotQ0ZXTF9XaWRnZXRUUCogQ1hGQV9GV0xUaGVtZTo6R2V0VGhlbWUoQ0ZXTF9XaWRnZXQqIHBXaWRnZXQpIGNvbnN0IHsKLSAgc3dpdGNoIChwV2lkZ2V0LT5HZXRDbGFzc0lEKCkpIHsKLSAgICBjYXNlIEZXTF9UeXBlOjpDaGVja0JveDoKLSAgICAgIHJldHVybiBtX3BDaGVja0JveFRQLmdldCgpOwotICAgIGNhc2UgRldMX1R5cGU6Okxpc3RCb3g6Ci0gICAgICByZXR1cm4gbV9wTGlzdEJveFRQLmdldCgpOwotICAgIGNhc2UgRldMX1R5cGU6OlBpY3R1cmVCb3g6Ci0gICAgICByZXR1cm4gbV9wUGljdHVyZUJveFRQLmdldCgpOwotICAgIGNhc2UgRldMX1R5cGU6OlNjcm9sbEJhcjoKLSAgICAgIHJldHVybiBtX3BTcm9sbEJhclRQLmdldCgpOwotICAgIGNhc2UgRldMX1R5cGU6OkVkaXQ6Ci0gICAgICByZXR1cm4gbV9wRWRpdFRQLmdldCgpOwotICAgIGNhc2UgRldMX1R5cGU6OkNvbWJvQm94OgotICAgICAgcmV0dXJuIG1fcENvbWJvQm94VFAuZ2V0KCk7Ci0gICAgY2FzZSBGV0xfVHlwZTo6TW9udGhDYWxlbmRhcjoKLSAgICAgIHJldHVybiBtX3BNb250aENhbGVuZGFyVFAuZ2V0KCk7Ci0gICAgY2FzZSBGV0xfVHlwZTo6RGF0ZVRpbWVQaWNrZXI6Ci0gICAgICByZXR1cm4gbV9wRGF0ZVRpbWVQaWNrZXJUUC5nZXQoKTsKLSAgICBjYXNlIEZXTF9UeXBlOjpQdXNoQnV0dG9uOgotICAgICAgcmV0dXJuIG1fcFB1c2hCdXR0b25UUC5nZXQoKTsKLSAgICBjYXNlIEZXTF9UeXBlOjpDYXJldDoKLSAgICAgIHJldHVybiBtX3BDYXJldFRQLmdldCgpOwotICAgIGNhc2UgRldMX1R5cGU6OkJhcmNvZGU6Ci0gICAgICByZXR1cm4gbV9wQmFyY29kZVRQLmdldCgpOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL3hmYV9md2x0aGVtZS5oIGIveGZhL2Z4ZmEvYXBwL3hmYV9md2x0aGVtZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGVmYWQwLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfZndsdGhlbWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhGQV9BUFBfWEZBX0ZXTFRIRU1FX0hfCi0jZGVmaW5lIFhGQV9GWEZBX0FQUF9YRkFfRldMVEhFTUVfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgInhmYS9md2wvaWZ3bF90aGVtZXByb3ZpZGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC90aGVtZS9jZndsX2JhcmNvZGV0cC5oIgotI2luY2x1ZGUgInhmYS9md2wvdGhlbWUvY2Z3bF9jYXJldHRwLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC90aGVtZS9jZndsX2NoZWNrYm94dHAuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL3RoZW1lL2Nmd2xfY29tYm9ib3h0cC5oIgotI2luY2x1ZGUgInhmYS9md2wvdGhlbWUvY2Z3bF9kYXRldGltZXBpY2tlcnRwLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC90aGVtZS9jZndsX2VkaXR0cC5oIgotI2luY2x1ZGUgInhmYS9md2wvdGhlbWUvY2Z3bF9saXN0Ym94dHAuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL3RoZW1lL2Nmd2xfbW9udGhjYWxlbmRhcnRwLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC90aGVtZS9jZndsX3BpY3R1cmVib3h0cC5oIgotI2luY2x1ZGUgInhmYS9md2wvdGhlbWUvY2Z3bF9wdXNoYnV0dG9udHAuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL3RoZW1lL2Nmd2xfc2Nyb2xsYmFydHAuaCIKLSNpbmNsdWRlICJ4ZmEvZndsL3RoZW1lL2Nmd2xfd2lkZ2V0dHAuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZhcHAuaCIKLQotY2xhc3MgQ1hGQV9GV0xUaGVtZSBmaW5hbCA6IHB1YmxpYyBJRldMX1RoZW1lUHJvdmlkZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9GV0xUaGVtZShDWEZBX0ZGQXBwKiBwQXBwKTsKLSAgfkNYRkFfRldMVGhlbWUoKSBvdmVycmlkZTsKLQotICAvLyBJRldMX1RoZW1lUHJvdmlkZXI6Ci0gIHZvaWQgRHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpIG92ZXJyaWRlOwotICB2b2lkIERyYXdUZXh0KENGV0xfVGhlbWVUZXh0KiBwUGFyYW1zKSBvdmVycmlkZTsKLSAgdm9pZCBDYWxjVGV4dFJlY3QoQ0ZXTF9UaGVtZVRleHQqIHBQYXJhbXMsIENGWF9SZWN0RiYgcmVjdCkgb3ZlcnJpZGU7Ci0gIGZsb2F0IEdldENYQm9yZGVyU2l6ZSgpIGNvbnN0IG92ZXJyaWRlOwotICBmbG9hdCBHZXRDWUJvcmRlclNpemUoKSBjb25zdCBvdmVycmlkZTsKLSAgQ0ZYX1JlY3RGIEdldFVJTWFyZ2luKENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0KSBjb25zdCBvdmVycmlkZTsKLSAgZmxvYXQgR2V0Rm9udFNpemUoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQpIGNvbnN0IG92ZXJyaWRlOwotICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gR2V0Rm9udCgKLSAgICAgIENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0KSBjb25zdCBvdmVycmlkZTsKLSAgZmxvYXQgR2V0TGluZUhlaWdodChDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGZsb2F0IEdldFNjcm9sbEJhcldpZHRoKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIEZYX0NPTE9SUkVGIEdldFRleHRDb2xvcihDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIENGWF9TaXplRiBHZXRTcGFjZUFib3ZlQmVsb3coQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQpIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgQ0ZXTF9XaWRnZXRUUCogR2V0VGhlbWUoQ0ZXTF9XaWRnZXQqIHBXaWRnZXQpIGNvbnN0OwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRldMX0NoZWNrQm94VFA+IG1fcENoZWNrQm94VFA7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRldMX0xpc3RCb3hUUD4gbV9wTGlzdEJveFRQOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZXTF9QaWN0dXJlQm94VFA+IG1fcFBpY3R1cmVCb3hUUDsKLSAgc3RkOjp1bmlxdWVfcHRyPENGV0xfU2Nyb2xsQmFyVFA+IG1fcFNyb2xsQmFyVFA7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRldMX0VkaXRUUD4gbV9wRWRpdFRQOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZXTF9Db21ib0JveFRQPiBtX3BDb21ib0JveFRQOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZXTF9Nb250aENhbGVuZGFyVFA+IG1fcE1vbnRoQ2FsZW5kYXJUUDsKLSAgc3RkOjp1bmlxdWVfcHRyPENGV0xfRGF0ZVRpbWVQaWNrZXJUUD4gbV9wRGF0ZVRpbWVQaWNrZXJUUDsKLSAgc3RkOjp1bmlxdWVfcHRyPENGV0xfUHVzaEJ1dHRvblRQPiBtX3BQdXNoQnV0dG9uVFA7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRldMX0NhcmV0VFA+IG1fcENhcmV0VFA7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRldMX0JhcmNvZGVUUD4gbV9wQmFyY29kZVRQOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZERV9UZXh0T3V0PiBtX3BUZXh0T3V0OwotICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gbV9wQ2FsZW5kYXJGb250OwotICBDRlhfV2lkZVN0cmluZyBtX3dzUmVzb3VyY2U7Ci0gIENYRkFfRkZBcHAqIGNvbnN0IG1fcEFwcDsKLSAgQ0ZYX1JlY3RGIG1fUmVjdDsKLX07Ci0KLUNYRkFfRkZXaWRnZXQqIFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KENGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsKLQotI2VuZGlmICAvLyBYRkFfRlhGQV9BUFBfWEZBX0ZXTFRIRU1FX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9hcHAveGZhX3JlbmRlcmNvbnRleHQuY3BwIGIveGZhL2Z4ZmEvYXBwL3hmYV9yZW5kZXJjb250ZXh0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg1NTEwNS4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9hcHAveGZhX3JlbmRlcmNvbnRleHQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX3JlbmRlcmNvbnRleHQuaCIKLQotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9mZnBhZ2V2aWV3LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0LmgiCi0jaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY2Z4X2dyYXBoaWNzLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IGludDMyX3Qga01heENvdW50ID0gMzA7Ci0KLX0gIC8vIG5hbXNlcGFjZQotCi1DWEZBX1JlbmRlckNvbnRleHQ6OkNYRkFfUmVuZGVyQ29udGV4dCgpCi0gICAgOiBtX3BXaWRnZXQobnVsbHB0ciksIG1fcFBhZ2VWaWV3KG51bGxwdHIpLCBtX3BHUyhudWxscHRyKSwgbV9kd1N0YXR1cygwKSB7Ci0gIG1fbWF0cml4LlNldElkZW50aXR5KCk7Ci0gIG1fcnRDbGlwUmVjdC5SZXNldCgpOwotfQotCi1DWEZBX1JlbmRlckNvbnRleHQ6On5DWEZBX1JlbmRlckNvbnRleHQoKSB7fQotCi1pbnQzMl90IENYRkFfUmVuZGVyQ29udGV4dDo6U3RhcnRSZW5kZXIoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR1MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENYRkFfUmVuZGVyT3B0aW9ucyYgb3B0aW9ucykgewotICBtX3BQYWdlVmlldyA9IHBQYWdlVmlldzsKLSAgbV9wR1MgPSBwR1M7Ci0gIG1fbWF0cml4ID0gbWF0cml4OwotICBtX29wdGlvbnMgPSBvcHRpb25zOwotCi0gIENGWF9NYXRyaXggbXRSZXM7Ci0gIG10UmVzLlNldFJldmVyc2UobWF0cml4KTsKLSAgbV9ydENsaXBSZWN0ID0gcEdTLT5HZXRDbGlwUmVjdCgpOwotICBtdFJlcy5UcmFuc2Zvcm1SZWN0KG1fcnRDbGlwUmVjdCk7Ci0gIG1fZHdTdGF0dXMgPSBtX29wdGlvbnMubV9iSGlnaGxpZ2h0ID8gWEZBX1dpZGdldFN0YXR1c19IaWdobGlnaHQgOiAwOwotICB1aW50MzJfdCBkd0ZpbHRlclR5cGUgPSBYRkFfV2lkZ2V0U3RhdHVzX1Zpc2libGUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAobV9vcHRpb25zLm1fYlByaW50ID8gWEZBX1dpZGdldFN0YXR1c19QcmludGFibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFhGQV9XaWRnZXRTdGF0dXNfVmlld2FibGUpOwotICBtX3BXaWRnZXRJdGVyYXRvci5yZXNldCgKLSAgICAgIG1fcFBhZ2VWaWV3LT5DcmVhdGVXaWRnZXRJdGVyYXRvcihYRkFfVFJBVkVSU0VXQVlfRm9ybSwgZHdGaWx0ZXJUeXBlKSk7Ci0gIG1fcFdpZGdldCA9IG1fcFdpZGdldEl0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7Ci0gIHJldHVybiBYRkFfUkVOREVSU1RBVFVTX1JlYWR5OwotfQotCi1pbnQzMl90IENYRkFfUmVuZGVyQ29udGV4dDo6RG9SZW5kZXIoSUZYX1BhdXNlKiBwUGF1c2UpIHsKLSAgaW50MzJfdCBpQ291bnQgPSAwOwotICB3aGlsZSAobV9wV2lkZ2V0KSB7Ci0gICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IG1fcFdpZGdldDsKLSAgICBDRlhfUmVjdEYgcnRXaWRnZXRCb3ggPSBwV2lkZ2V0LT5HZXRCQm94KFhGQV9XaWRnZXRTdGF0dXNfVmlzaWJsZSk7Ci0gICAgcnRXaWRnZXRCb3gud2lkdGggKz0gMTsKLSAgICBydFdpZGdldEJveC5oZWlnaHQgKz0gMTsKLSAgICBpZiAocnRXaWRnZXRCb3guSW50ZXJzZWN0V2l0aChtX3J0Q2xpcFJlY3QpKQotICAgICAgcFdpZGdldC0+UmVuZGVyV2lkZ2V0KG1fcEdTLCAmbV9tYXRyaXgsIG1fZHdTdGF0dXMpOwotCi0gICAgbV9wV2lkZ2V0ID0gbV9wV2lkZ2V0SXRlcmF0b3ItPk1vdmVUb05leHQoKTsKLSAgICBpQ291bnQrKzsKLSAgICBpZiAoaUNvdW50ID4ga01heENvdW50ICYmIHBQYXVzZSAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpCi0gICAgICByZXR1cm4gWEZBX1JFTkRFUlNUQVRVU19Ub0JlQ29udGludWVkOwotICB9Ci0gIHJldHVybiBYRkFfUkVOREVSU1RBVFVTX0RvbmU7Ci19Ci0KLXZvaWQgQ1hGQV9SZW5kZXJDb250ZXh0OjpTdG9wUmVuZGVyKCkgewotICBtX3BXaWRnZXRJdGVyYXRvci5yZXNldCgpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvYXBwL3hmYV90ZXh0cGllY2UuY3BwIGIveGZhL2Z4ZmEvYXBwL3hmYV90ZXh0cGllY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTNlNDVmLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfdGV4dHBpZWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfdGV4dHBpZWNlLmgiCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAvY3hmYV9saW5rdXNlcmRhdGEuaCIKLQotWEZBX1RleHRQaWVjZTo6WEZBX1RleHRQaWVjZSgpIHt9Ci0KLVhGQV9UZXh0UGllY2U6On5YRkFfVGV4dFBpZWNlKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2FwcC94ZmFfdGV4dHBpZWNlLmggYi94ZmEvZnhmYS9hcHAveGZhX3RleHRwaWVjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODAyZGY1Li4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2FwcC94ZmFfdGV4dHBpZWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYRkFfQVBQX1hGQV9URVhUUElFQ0VfSF8KLSNkZWZpbmUgWEZBX0ZYRkFfQVBQX1hGQV9URVhUUElFQ0VfSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9jZmdhc19nZWZvbnQuaCIKLQotY2xhc3MgQ1hGQV9MaW5rVXNlckRhdGE7Ci0KLWNsYXNzIFhGQV9UZXh0UGllY2UgewotIHB1YmxpYzoKLSAgWEZBX1RleHRQaWVjZSgpOwotICB+WEZBX1RleHRQaWVjZSgpOwotCi0gIENGWF9XaWRlU3RyaW5nIHN6VGV4dDsKLSAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gV2lkdGhzOwotICBpbnQzMl90IGlDaGFyczsKLSAgaW50MzJfdCBpSG9yU2NhbGU7Ci0gIGludDMyX3QgaVZlclNjYWxlOwotICBpbnQzMl90IGlCaWRpTGV2ZWw7Ci0gIGludDMyX3QgaVVuZGVybGluZTsKLSAgaW50MzJfdCBpUGVyaW9kOwotICBpbnQzMl90IGlMaW5lVGhyb3VnaDsKLSAgRlhfQVJHQiBkd0NvbG9yOwotICBGWF9GTE9BVCBmRm9udFNpemU7Ci0gIENGWF9SZWN0RiBydFBpZWNlOwotICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gcEZvbnQ7Ci0gIENGWF9SZXRhaW5QdHI8Q1hGQV9MaW5rVXNlckRhdGE+IHBMaW5rRGF0YTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYRkFfQVBQX1hGQV9URVhUUElFQ0VfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfZXZlbnRwYXJhbS5jcHAgYi94ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNjc0MmYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZXZlbnRwYXJhbS5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvZnhmYS5oIgorCitDWEZBX0V2ZW50UGFyYW06OkNYRkFfRXZlbnRQYXJhbSgpCisgICAgOiBtX3BUYXJnZXQobnVsbHB0ciksCisgICAgICBtX2VUeXBlKFhGQV9FVkVOVF9Vbmtub3duKSwKKyAgICAgIG1fYkNhbmNlbEFjdGlvbihmYWxzZSksCisgICAgICBtX2lDb21taXRLZXkoMCksCisgICAgICBtX2JLZXlEb3duKGZhbHNlKSwKKyAgICAgIG1fYk1vZGlmaWVyKGZhbHNlKSwKKyAgICAgIG1fYlJlZW50ZXIoZmFsc2UpLAorICAgICAgbV9pU2VsRW5kKDApLAorICAgICAgbV9pU2VsU3RhcnQoMCksCisgICAgICBtX2JTaGlmdChmYWxzZSksCisgICAgICBtX2JJc0Zvcm1SZWFkeShmYWxzZSkge30KKworQ1hGQV9FdmVudFBhcmFtOjp+Q1hGQV9FdmVudFBhcmFtKCkge30KKworQ1hGQV9FdmVudFBhcmFtOjpDWEZBX0V2ZW50UGFyYW0oY29uc3QgQ1hGQV9FdmVudFBhcmFtJiBvdGhlcikgPSBkZWZhdWx0OworCit2b2lkIENYRkFfRXZlbnRQYXJhbTo6UmVzZXQoKSB7CisgIG1fd3NDaGFuZ2UuY2xlYXIoKTsKKyAgbV9iQ2FuY2VsQWN0aW9uID0gZmFsc2U7CisgIG1faUNvbW1pdEtleSA9IDA7CisgIG1fd3NGdWxsVGV4dC5jbGVhcigpOworICBtX2JLZXlEb3duID0gZmFsc2U7CisgIG1fYk1vZGlmaWVyID0gZmFsc2U7CisgIG1fd3NOZXdDb250ZW50VHlwZS5jbGVhcigpOworICBtX3dzTmV3VGV4dC5jbGVhcigpOworICBtX3dzUHJldkNvbnRlbnRUeXBlLmNsZWFyKCk7CisgIG1fd3NQcmV2VGV4dC5jbGVhcigpOworICBtX2JSZWVudGVyID0gZmFsc2U7CisgIG1faVNlbEVuZCA9IDA7CisgIG1faVNlbFN0YXJ0ID0gMDsKKyAgbV9iU2hpZnQgPSBmYWxzZTsKKyAgbV93c1NvYXBGYXVsdENvZGUuY2xlYXIoKTsKKyAgbV93c1NvYXBGYXVsdFN0cmluZy5jbGVhcigpOworICBtX2JJc0Zvcm1SZWFkeSA9IGZhbHNlOworfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9ldmVudHBhcmFtLmggYi94ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uaAppbmRleCAzYmE3YThiLi5lYWZkNzZjIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uaAorKysgYi94ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uaApAQCAtNTUsNyArNTUsNyBAQAogCiAgIENYRkFfV2lkZ2V0QWNjKiBtX3BUYXJnZXQ7CiAgIFhGQV9FVkVOVFRZUEUgbV9lVHlwZTsKLSAgQ0ZYX1dpZGVTdHJpbmcgbV93c1Jlc3VsdDsKKyAgV2lkZVN0cmluZyBtX3dzUmVzdWx0OwogICBib29sIG1fYkNhbmNlbEFjdGlvbjsKICAgaW50MzJfdCBtX2lDb21taXRLZXk7CiAgIGJvb2wgbV9iS2V5RG93bjsKQEAgLTY0LDE2ICs2NCwxNSBAQAogICBpbnQzMl90IG1faVNlbEVuZDsKICAgaW50MzJfdCBtX2lTZWxTdGFydDsKICAgYm9vbCBtX2JTaGlmdDsKLSAgQ0ZYX1dpZGVTdHJpbmcgbV93c0NoYW5nZTsKLSAgQ0ZYX1dpZGVTdHJpbmcgbV93c0Z1bGxUZXh0OwotICBDRlhfV2lkZVN0cmluZyBtX3dzTmV3Q29udGVudFR5cGU7Ci0gIENGWF9XaWRlU3RyaW5nIG1fd3NOZXdUZXh0OwotICBDRlhfV2lkZVN0cmluZyBtX3dzUHJldkNvbnRlbnRUeXBlOwotICBDRlhfV2lkZVN0cmluZyBtX3dzUHJldlRleHQ7Ci0gIENGWF9XaWRlU3RyaW5nIG1fd3NTb2FwRmF1bHRDb2RlOwotICBDRlhfV2lkZVN0cmluZyBtX3dzU29hcEZhdWx0U3RyaW5nOworICBXaWRlU3RyaW5nIG1fd3NDaGFuZ2U7CisgIFdpZGVTdHJpbmcgbV93c0Z1bGxUZXh0OworICBXaWRlU3RyaW5nIG1fd3NOZXdDb250ZW50VHlwZTsKKyAgV2lkZVN0cmluZyBtX3dzTmV3VGV4dDsKKyAgV2lkZVN0cmluZyBtX3dzUHJldkNvbnRlbnRUeXBlOworICBXaWRlU3RyaW5nIG1fd3NQcmV2VGV4dDsKKyAgV2lkZVN0cmluZyBtX3dzU29hcEZhdWx0Q29kZTsKKyAgV2lkZVN0cmluZyBtX3dzU29hcEZhdWx0U3RyaW5nOwogICBib29sIG1fYklzRm9ybVJlYWR5OwotICBpbnQzMl90IG1faVZhbGlkYXRlQWN0aXZpdGllczsKIH07CiAKICNlbmRpZiAgLy8gWEZBX0ZYRkFfQ1hGQV9FVkVOVFBBUkFNX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX2ZmYXBwLmNwcCBiL3hmYS9meGZhL2N4ZmFfZmZhcHAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYjlkZWIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2ZmYXBwLmNwcApAQCAtMCwwICsxLDgzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmYXBwLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKKyNpbmNsdWRlICJ4ZmEvZmdhcy9mb250L2NmZ2FzX2ZvbnRtZ3IuaCIKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfbm90ZWRyaXZlci5oIgorI2luY2x1ZGUgInhmYS9md2wvY2Z3bF93aWRnZXRtZ3IuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZG9jLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZndpZGdldGhhbmRsZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZvbnRtZ3IuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Z3bGFkYXB0ZXJ3aWRnZXRtZ3IuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Z3bHRoZW1lLmgiCisKK0NYRkFfRkZBcHA6OkNYRkFfRkZBcHAoSVhGQV9BcHBQcm92aWRlciogcFByb3ZpZGVyKSA6IG1fcFByb3ZpZGVyKHBQcm92aWRlcikgeworICAvLyBFbnN1cmUgZnVsbHkgaW5pdGlhbGl6ZWQgYmVmb3JlIG1ha2luZyBhbiBhcHAgYmFzZWQgb24gfHRoaXN8LgorICBtX3BGV0xBcHAgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZXTF9BcHA+KHRoaXMpOworfQorCitDWEZBX0ZGQXBwOjp+Q1hGQV9GRkFwcCgpIHt9CisKK3N0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZGRG9jPiBDWEZBX0ZGQXBwOjpDcmVhdGVEb2MoCisgICAgSVhGQV9Eb2NFbnZpcm9ubWVudCogcERvY0Vudmlyb25tZW50LAorICAgIENQREZfRG9jdW1lbnQqIHBQREZEb2MpIHsKKyAgaWYgKCFwUERGRG9jKQorICAgIHJldHVybiBudWxscHRyOworCisgIGF1dG8gcERvYyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZGRG9jPih0aGlzLCBwRG9jRW52aXJvbm1lbnQpOworICBpZiAoIXBEb2MtPk9wZW5Eb2MocFBERkRvYykpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgcmV0dXJuIHBEb2M7Cit9CisKK3ZvaWQgQ1hGQV9GRkFwcDo6U2V0RGVmYXVsdEZvbnRNZ3IoCisgICAgc3RkOjp1bmlxdWVfcHRyPENGR0FTX0RlZmF1bHRGb250TWFuYWdlcj4gcEZvbnRNZ3IpIHsKKyAgaWYgKCFtX3BGb250TWdyKQorICAgIG1fcEZvbnRNZ3IgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Gb250TWdyPigpOworICBtX3BGb250TWdyLT5TZXREZWZGb250TWdyKHN0ZDo6bW92ZShwRm9udE1ncikpOworfQorCitDWEZBX0ZvbnRNZ3IqIENYRkFfRkZBcHA6OkdldFhGQUZvbnRNZ3IoKSBjb25zdCB7CisgIHJldHVybiBtX3BGb250TWdyLmdldCgpOworfQorCitDRkdBU19Gb250TWdyKiBDWEZBX0ZGQXBwOjpHZXRGREVGb250TWdyKCkgeworICBpZiAoIW1fcEZERUZvbnRNZ3IpIHsKKyAgICBtX3BGREVGb250TWdyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGR0FTX0ZvbnRNZ3I+KCk7CisgICAgaWYgKCFtX3BGREVGb250TWdyLT5FbnVtRm9udHMoKSkKKyAgICAgIG1fcEZERUZvbnRNZ3IgPSBudWxscHRyOworICB9CisgIHJldHVybiBtX3BGREVGb250TWdyLmdldCgpOworfQorCitDWEZBX0ZXTFRoZW1lKiBDWEZBX0ZGQXBwOjpHZXRGV0xUaGVtZSgpIHsKKyAgaWYgKCFtX3BGV0xUaGVtZSkKKyAgICBtX3BGV0xUaGVtZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZXTFRoZW1lPih0aGlzKTsKKyAgcmV0dXJuIG1fcEZXTFRoZW1lLmdldCgpOworfQorCitDWEZBX0ZXTEFkYXB0ZXJXaWRnZXRNZ3IqIENYRkFfRkZBcHA6OkdldEZXTEFkYXB0ZXJXaWRnZXRNZ3IoKSB7CisgIGlmICghbV9wQWRhcHRlcldpZGdldE1ncikKKyAgICBtX3BBZGFwdGVyV2lkZ2V0TWdyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRldMQWRhcHRlcldpZGdldE1ncj4oKTsKKyAgcmV0dXJuIG1fcEFkYXB0ZXJXaWRnZXRNZ3IuZ2V0KCk7Cit9CisKK0lGV0xfQWRhcHRlclRpbWVyTWdyKiBDWEZBX0ZGQXBwOjpHZXRUaW1lck1ncigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcFByb3ZpZGVyLT5HZXRUaW1lck1ncigpOworfQorCit2b2lkIENYRkFfRkZBcHA6OkNsZWFyRXZlbnRUYXJnZXRzKCkgeworICBtX3BGV0xBcHAtPkdldE5vdGVEcml2ZXIoKS0+Q2xlYXJFdmVudFRhcmdldHMoKTsKK30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfZmZhcHAuaCBiL3hmYS9meGZhL2N4ZmFfZmZhcHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmZkNjU3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9mZmFwcC5oCkBAIC0wLDAgKzEsNzYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9DWEZBX0ZGQVBQX0hfCisjZGVmaW5lIFhGQV9GWEZBX0NYRkFfRkZBUFBfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbV9hY2MuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2FwcC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmEuaCIKKworY2xhc3MgQ0ZHQVNfRGVmYXVsdEZvbnRNYW5hZ2VyOworY2xhc3MgQ0ZHQVNfRm9udE1ncjsKK2NsYXNzIENGV0xfV2lkZ2V0TWdyOworY2xhc3MgQ1BERl9Eb2N1bWVudDsKK2NsYXNzIENYRkFfRkZEb2NIYW5kbGVyOworY2xhc3MgQ1hGQV9Gb250TWdyOworY2xhc3MgQ1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyOworY2xhc3MgQ1hGQV9GV0xUaGVtZTsKK2NsYXNzIElGV0xfQWRhcHRlclRpbWVyTWdyOworCitjbGFzcyBDWEZBX0ZGQXBwIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENYRkFfRkZBcHAoSVhGQV9BcHBQcm92aWRlciogcFByb3ZpZGVyKTsKKyAgfkNYRkFfRkZBcHAoKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GRkRvYz4gQ3JlYXRlRG9jKElYRkFfRG9jRW52aXJvbm1lbnQqIHBEb2NFbnZpcm9ubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDUERGX0RvY3VtZW50KiBwUERGRG9jKTsKKyAgdm9pZCBTZXREZWZhdWx0Rm9udE1ncihzdGQ6OnVuaXF1ZV9wdHI8Q0ZHQVNfRGVmYXVsdEZvbnRNYW5hZ2VyPiBwRm9udE1ncik7CisKKyAgQ1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyKiBHZXRGV0xBZGFwdGVyV2lkZ2V0TWdyKCk7CisgIENGV0xfV2lkZ2V0TWdyKiBHZXRGV0xXaWRnZXRNZ3IoKSBjb25zdCB7IHJldHVybiBtX3BGV0xBcHAtPkdldFdpZGdldE1ncigpOyB9CisKKyAgQ0ZHQVNfRm9udE1nciogR2V0RkRFRm9udE1ncigpOworICBDWEZBX0ZXTFRoZW1lKiBHZXRGV0xUaGVtZSgpOworCisgIElYRkFfQXBwUHJvdmlkZXIqIEdldEFwcFByb3ZpZGVyKCkgY29uc3QgeyByZXR1cm4gbV9wUHJvdmlkZXIuR2V0KCk7IH0KKyAgY29uc3QgQ0ZXTF9BcHAqIEdldEZXTEFwcCgpIGNvbnN0IHsgcmV0dXJuIG1fcEZXTEFwcC5nZXQoKTsgfQorICBJRldMX0FkYXB0ZXJUaW1lck1nciogR2V0VGltZXJNZ3IoKSBjb25zdDsKKyAgQ1hGQV9Gb250TWdyKiBHZXRYRkFGb250TWdyKCkgY29uc3Q7CisKKyAgdm9pZCBDbGVhckV2ZW50VGFyZ2V0cygpOworCisgcHJpdmF0ZToKKyAgVW5vd25lZFB0cjxJWEZBX0FwcFByb3ZpZGVyPiBjb25zdCBtX3BQcm92aWRlcjsKKworICAvLyBUaGUgZm9udHMgc3RvcmVkIGluIHRoZSBmb250IG1hbmFnZXIgbWF5IGhhdmUgYmVlbiBjcmVhdGVkIGJ5IHRoZSBkZWZhdWx0CisgIC8vIGZvbnQgbWFuYWdlci4gVGhlIEdFRm9udDo6TG9hZEZvbnQgY2FsbCB0YWtlcyB0aGUgbWFuYWdlciBhcyBhIHBhcmFtIGFuZAorICAvLyBzdG9yZXMgaXQgaW50ZXJuYWxseS4gV2hlbiB5b3UgZGVzdHJveSB0aGUgR0VGb250IGl0IHRyaWVzIHRvIHVucmVnaXN0ZXIKKyAgLy8gZnJvbSB0aGUgZm9udCBtYW5hZ2VyIGFuZCBpZiB0aGUgZGVmYXVsdCBmb250IG1hbmFnZXIgd2FzIGRlc3Ryb3llZCBmaXJzdAorICAvLyBnZXQgZ2V0IGEgdXNlLWFmdGVyLWZyZWUuIFRoZSBtX3BGV0xUaGVtZSBjYW4gdHJ5IHRvIGNsZWFudXAgYSBHRUZvbnQKKyAgLy8gd2hlbiBpdCBmcmVlcywgc28gbWFrZSBzdXJlIGl0IGdldHMgY2xlYW5lZCB1cCBmaXJzdC4gVGhhdCByZXF1aXJlcworICAvLyBtX3BGV0xBcHAgdG8gYmUgY2xlYW5lZCB1cCBhcyB3ZWxsLgorICAvLworICAvLyBUT0RPKGRzaW5jbGFpcik6IFRoZSBHRUZvbnQgc2hvdWxkIGhhdmUgdGhlIEZvbnRNZ3IgYXMgdGhlIHBvaW50ZXIgaW5zdGVhZAorICAvLyBvZiB0aGUgREVGRm9udE1nciBzbyB0aGlzIGdvZXMgYXdheS4gQnVnIDU2MS4KKyAgc3RkOjp1bmlxdWVfcHRyPENGR0FTX0ZvbnRNZ3I+IG1fcEZERUZvbnRNZ3I7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZvbnRNZ3I+IG1fcEZvbnRNZ3I7CisKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRldMQWRhcHRlcldpZGdldE1ncj4gbV9wQWRhcHRlcldpZGdldE1ncjsKKworICAvLyB8bV9wRldMQXBwfCBoYXMgdG8gYmUgcmVsZWFzZWQgZmlyc3QsIHRoZW4gfG1fcEZXTFRoZW1lfCBzaW5jZSB0aGUgZm9ybWVyCisgIC8vIG1heSByZWZlcnMgdG8gdGhlbWUgbWFuYWdlciBhbmQgdGhlIGxhdHRlciByZWZlcnMgdG8gZm9udCBtYW5hZ2VyLgorICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GV0xUaGVtZT4gbV9wRldMVGhlbWU7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRldMX0FwcD4gbV9wRldMQXBwOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9DWEZBX0ZGQVBQX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX2ZmYXJjLmNwcCBiL3hmYS9meGZhL2N4ZmFfZmZhcmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YTRmNzAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2ZmYXJjLmNwcApAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmYXJjLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hcmMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWx1ZS5oIgorCitDWEZBX0ZGQXJjOjpDWEZBX0ZGQXJjKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9GRkRyYXcocE5vZGUpIHt9CisKK0NYRkFfRkZBcmM6On5DWEZBX0ZGQXJjKCkge30KKwordm9pZCBDWEZBX0ZGQXJjOjpSZW5kZXJXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGF0dXMpIHsKKyAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpCisgICAgcmV0dXJuOworCisgIENYRkFfVmFsdWUqIHZhbHVlID0gbV9wTm9kZS0+R2V0Rm9ybVZhbHVlSWZFeGlzdHMoKTsKKyAgaWYgKCF2YWx1ZSkKKyAgICByZXR1cm47CisKKyAgQ0ZYX1JlY3RGIHJ0QXJjID0gR2V0UmVjdFdpdGhvdXRSb3RhdGUoKTsKKyAgQ1hGQV9NYXJnaW4qIG1hcmdpbiA9IG1fcE5vZGUtPkdldE1hcmdpbklmRXhpc3RzKCk7CisgIGlmIChtYXJnaW4pCisgICAgWEZBX1JlY3RXaXRob3V0TWFyZ2luKHJ0QXJjLCBtYXJnaW4pOworCisgIENGWF9NYXRyaXggbXRSb3RhdGUgPSBHZXRSb3RhdGVNYXRyaXgoKTsKKyAgbXRSb3RhdGUuQ29uY2F0KG1hdHJpeCk7CisKKyAgRHJhd0JvcmRlcihwR1MsIHZhbHVlLT5HZXRBcmNJZkV4aXN0cygpLCBydEFyYywgbXRSb3RhdGUpOworfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZmFyYy5oIGIveGZhL2Z4ZmEvY3hmYV9mZmFyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NjUxMTkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2ZmYXJjLmgKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX0NYRkFfRkZBUkNfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfQ1hGQV9GRkFSQ19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRyYXcuaCIKKworY2xhc3MgQ1hGQV9GRkFyYyA6IHB1YmxpYyBDWEZBX0ZGRHJhdyB7CisgcHVibGljOgorICBleHBsaWNpdCBDWEZBX0ZGQXJjKENYRkFfTm9kZSogcG5vZGUpOworICB+Q1hGQV9GRkFyYygpIG92ZXJyaWRlOworCisgIC8vIENYRkFfRkZXaWRnZXQKKyAgdm9pZCBSZW5kZXJXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfQ1hGQV9GRkFSQ19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZmJhcmNvZGUuY3BwIGIveGZhL2Z4ZmEvY3hmYV9mZmJhcmNvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZDU3YjkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2ZmYmFyY29kZS5jcHAKQEAgLTAsMCArMSwyMzkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZiYXJjb2RlLmgiCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9leHRlbnNpb24uaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2FwcC5oIgorI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9iYXJjb2RlLmgiCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX25vdGVkcml2ZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZmllbGQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9md2xhZGFwdGVyd2lkZ2V0bWdyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYm9yZGVyLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IEJhckNvZGVJbmZvIGdfQmFyQ29kZURhdGFbXSA9IHsKKyAgICB7MHg3ZmI0YTE4LCBMImVhbjEzIiwgQmFyY29kZVR5cGU6OmVhbjEzLCBCQ19FQU4xM30sCisgICAgezB4OGQxM2EzZCwgTCJjb2RlMTEiLCBCYXJjb2RlVHlwZTo6Y29kZTExLCBCQ19VTktOT1dOfSwKKyAgICB7MHg4ZDE0OWE4LCBMImNvZGU0OSIsIEJhcmNvZGVUeXBlOjpjb2RlNDksIEJDX1VOS05PV059LAorICAgIHsweDhkMTYzNDcsIEwiY29kZTkzIiwgQmFyY29kZVR5cGU6OmNvZGU5MywgQkNfVU5LTk9XTn0sCisgICAgezB4OTFhOTJlMiwgTCJ1cHNNYXhpY29kZSIsIEJhcmNvZGVUeXBlOjp1cHNNYXhpY29kZSwgQkNfVU5LTk9XTn0sCisgICAgezB4YTdkNDhkYywgTCJmaW0iLCBCYXJjb2RlVHlwZTo6ZmltLCBCQ19VTktOT1dOfSwKKyAgICB7MHhiMzU5ZmU5LCBMIm1zaSIsIEJhcmNvZGVUeXBlOjptc2ksIEJDX1VOS05PV059LAorICAgIHsweDEyMWY3MzhjLCBMImNvZGUyT2Y1TWF0cml4IiwgQmFyY29kZVR5cGU6OmNvZGUyT2Y1TWF0cml4LCBCQ19VTktOT1dOfSwKKyAgICB7MHgxNTM1ODYxNiwgTCJ1Y2MxMjgiLCBCYXJjb2RlVHlwZTo6dWNjMTI4LCBCQ19VTktOT1dOfSwKKyAgICB7MHgxZjRiZmEwNSwgTCJyZmlkIiwgQmFyY29kZVR5cGU6OnJmaWQsIEJDX1VOS05PV059LAorICAgIHsweDFmZGE3MWJjLCBMInJzczE0U3RhY2tlZCIsIEJhcmNvZGVUeXBlOjpyc3MxNFN0YWNrZWQsIEJDX1VOS05PV059LAorICAgIHsweDIyMDY1MDg3LCBMImVhbjhhZGQyIiwgQmFyY29kZVR5cGU6OmVhbjhhZGQyLCBCQ19VTktOT1dOfSwKKyAgICB7MHgyMjA2NTA4YSwgTCJlYW44YWRkNSIsIEJhcmNvZGVUeXBlOjplYW44YWRkNSwgQkNfVU5LTk9XTn0sCisgICAgezB4MjI3ODM2NmMsIEwiY29kYWJhciIsIEJhcmNvZGVUeXBlOjpjb2RhYmFyLCBCQ19DT0RBQkFSfSwKKyAgICB7MHgyYTAzOWE4ZCwgTCJ0ZWxlcGVuIiwgQmFyY29kZVR5cGU6OnRlbGVwZW4sIEJDX1VOS05PV059LAorICAgIHsweDMyM2VkMzM3LCBMInVwY0Fwd2NkIiwgQmFyY29kZVR5cGU6OnVwY0Fwd2NkLCBCQ19VTktOT1dOfSwKKyAgICB7MHgzNDdhMTg0NiwgTCJwb3N0VVNJTUIiLCBCYXJjb2RlVHlwZTo6cG9zdFVTSU1CLCBCQ19VTktOT1dOfSwKKyAgICB7MHgzOTFiYjgzNiwgTCJjb2RlMTI4IiwgQmFyY29kZVR5cGU6OmNvZGUxMjgsIEJDX0NPREUxMjh9LAorICAgIHsweDM5OGVkZGFmLCBMImRhdGFNYXRyaXgiLCBCYXJjb2RlVHlwZTo6ZGF0YU1hdHJpeCwgQkNfREFUQU1BVFJJWH0sCisgICAgezB4M2NmZjYwYTgsIEwidXBjRWFkZDIiLCBCYXJjb2RlVHlwZTo6dXBjRWFkZDIsIEJDX1VOS05PV059LAorICAgIHsweDNjZmY2MGFiLCBMInVwY0VhZGQ1IiwgQmFyY29kZVR5cGU6OnVwY0VhZGQ1LCBCQ19VTktOT1dOfSwKKyAgICB7MHg0MDJjYjE4OCwgTCJjb2RlMk9mNVN0YW5kYXJkIiwgQmFyY29kZVR5cGU6OmNvZGUyT2Y1U3RhbmRhcmQsCisgICAgIEJDX1VOS05PV059LAorICAgIHsweDQxMTc2NGY3LCBMImF6dGVjIiwgQmFyY29kZVR5cGU6OmF6dGVjLCBCQ19VTktOT1dOfSwKKyAgICB7MHg0NGQ0ZTg0YywgTCJlYW44IiwgQmFyY29kZVR5cGU6OmVhbjgsIEJDX0VBTjh9LAorICAgIHsweDQ4NDY4OTAyLCBMInVjYzEyOHNzY2MiLCBCYXJjb2RlVHlwZTo6dWNjMTI4c3NjYywgQkNfVU5LTk9XTn0sCisgICAgezB4NDg4MGFlYTQsIEwidXBjQWFkZDIiLCBCYXJjb2RlVHlwZTo6dXBjQWFkZDIsIEJDX1VOS05PV059LAorICAgIHsweDQ4ODBhZWE3LCBMInVwY0FhZGQ1IiwgQmFyY29kZVR5cGU6OnVwY0FhZGQ1LCBCQ19VTktOT1dOfSwKKyAgICB7MHg1NGYxODI1NiwgTCJjb2RlMk9mNUluZHVzdHJpYWwiLCBCYXJjb2RlVHlwZTo6Y29kZTJPZjVJbmR1c3RyaWFsLAorICAgICBCQ19VTktOT1dOfSwKKyAgICB7MHg1OGUxNWYyNSwgTCJyc3MxNExpbWl0ZWQiLCBCYXJjb2RlVHlwZTo6cnNzMTRMaW1pdGVkLCBCQ19VTktOT1dOfSwKKyAgICB7MHg1YzA4ZDFiOSwgTCJwb3N0QVVTUmVwbHlQYWlkIiwgQmFyY29kZVR5cGU6OnBvc3RBVVNSZXBseVBhaWQsCisgICAgIEJDX1VOS05PV059LAorICAgIHsweDVmYTcwMGJkLCBMInJzczE0IiwgQmFyY29kZVR5cGU6OnJzczE0LCBCQ19VTktOT1dOfSwKKyAgICB7MHg2MzFhN2UzNSwgTCJsb2dtYXJzIiwgQmFyY29kZVR5cGU6OmxvZ21hcnMsIEJDX1VOS05PV059LAorICAgIHsweDZhMjM2MjM2LCBMInBkZjQxNyIsIEJhcmNvZGVUeXBlOjpwZGY0MTcsIEJDX1BERjQxN30sCisgICAgezB4NmQwOThlY2UsIEwidXBjZWFuMiIsIEJhcmNvZGVUeXBlOjp1cGNlYW4yLCBCQ19VTktOT1dOfSwKKyAgICB7MHg2ZDA5OGVkMSwgTCJ1cGNlYW41IiwgQmFyY29kZVR5cGU6OnVwY2VhbjUsIEJDX1VOS05PV059LAorICAgIHsweDc2YjA0ZWVkLCBMImNvZGUzT2Y5ZXh0ZW5kZWQiLCBCYXJjb2RlVHlwZTo6Y29kZTNPZjlleHRlbmRlZCwKKyAgICAgQkNfVU5LTk9XTn0sCisgICAgezB4N2M3ZGI4NGEsIEwibWF4aWNvZGUiLCBCYXJjb2RlVHlwZTo6bWF4aWNvZGUsIEJDX1VOS05PV059LAorICAgIHsweDgyNjZmN2Y3LCBMInVjYzEyOHJhbmRvbSIsIEJhcmNvZGVUeXBlOjp1Y2MxMjhyYW5kb20sIEJDX1VOS05PV059LAorICAgIHsweDgzZWNhMTQ3LCBMInBvc3RVU0RQQkMiLCBCYXJjb2RlVHlwZTo6cG9zdFVTRFBCQywgQkNfVU5LTk9XTn0sCisgICAgezB4OGRkNzFkZTAsIEwicG9zdEFVU1N0YW5kYXJkIiwgQmFyY29kZVR5cGU6OnBvc3RBVVNTdGFuZGFyZCwgQkNfVU5LTk9XTn0sCisgICAgezB4OThhZGFkODUsIEwicGxlc3NleSIsIEJhcmNvZGVUeXBlOjpwbGVzc2V5LCBCQ19VTktOT1dOfSwKKyAgICB7MHg5Zjg0Y2NlNiwgTCJlYW4xM3B3Y2QiLCBCYXJjb2RlVHlwZTo6ZWFuMTNwd2NkLCBCQ19VTktOT1dOfSwKKyAgICB7MHhiNTE0ZmJlOSwgTCJ1cGNBIiwgQmFyY29kZVR5cGU6OnVwY0EsIEJDX1VQQ0F9LAorICAgIHsweGI1MTRmYmVkLCBMInVwY0UiLCBCYXJjb2RlVHlwZTo6dXBjRSwgQkNfVU5LTk9XTn0sCisgICAgezB4YjVjNmE4NTMsIEwiZWFuMTNhZGQyIiwgQmFyY29kZVR5cGU6OmVhbjEzYWRkMiwgQkNfVU5LTk9XTn0sCisgICAgezB4YjVjNmE4NTYsIEwiZWFuMTNhZGQ1IiwgQmFyY29kZVR5cGU6OmVhbjEzYWRkNSwgQkNfVU5LTk9XTn0sCisgICAgezB4YjgxZmM1MTIsIEwicG9zdFVLUk00U0NDIiwgQmFyY29kZVR5cGU6OnBvc3RVS1JNNFNDQywgQkNfVU5LTk9XTn0sCisgICAgezB4YmFkMzRiMjIsIEwiY29kZTEyOFNTQ0MiLCBCYXJjb2RlVHlwZTo6Y29kZTEyOFNTQ0MsIEJDX1VOS05PV059LAorICAgIHsweGJmYmUwY2Y2LCBMInBvc3RVUzVaaXAiLCBCYXJjb2RlVHlwZTo6cG9zdFVTNVppcCwgQkNfVU5LTk9XTn0sCisgICAgezB4YzU2NjE4ZTgsIEwicGRmNDE3bWFjcm8iLCBCYXJjb2RlVHlwZTo6cGRmNDE3bWFjcm8sIEJDX1VOS05PV059LAorICAgIHsweGNhNzMwZjhhLCBMImNvZGUyT2Y1SW50ZXJsZWF2ZWQiLCBCYXJjb2RlVHlwZTo6Y29kZTJPZjVJbnRlcmxlYXZlZCwKKyAgICAgQkNfVU5LTk9XTn0sCisgICAgezB4ZDAwOTdhYzYsIEwicnNzMTRFeHBhbmRlZCIsIEJhcmNvZGVUeXBlOjpyc3MxNEV4cGFuZGVkLCBCQ19VTktOT1dOfSwKKyAgICB7MHhkMjVhMDI0MCwgTCJwb3N0QVVTQ3VzdDIiLCBCYXJjb2RlVHlwZTo6cG9zdEFVU0N1c3QyLCBCQ19VTktOT1dOfSwKKyAgICB7MHhkMjVhMDI0MSwgTCJwb3N0QVVTQ3VzdDMiLCBCYXJjb2RlVHlwZTo6cG9zdEFVU0N1c3QzLCBCQ19VTktOT1dOfSwKKyAgICB7MHhkNTNlZDNlNywgTCJyc3MxNFRydW5jYXRlZCIsIEJhcmNvZGVUeXBlOjpyc3MxNFRydW5jYXRlZCwgQkNfVU5LTk9XTn0sCisgICAgezB4ZTcyYmNkNTcsIEwiY29kZTEyOEEiLCBCYXJjb2RlVHlwZTo6Y29kZTEyOEEsIEJDX1VOS05PV059LAorICAgIHsweGU3MmJjZDU4LCBMImNvZGUxMjhCIiwgQmFyY29kZVR5cGU6OmNvZGUxMjhCLCBCQ19DT0RFMTI4X0J9LAorICAgIHsweGU3MmJjZDU5LCBMImNvZGUxMjhDIiwgQmFyY29kZVR5cGU6OmNvZGUxMjhDLCBCQ19DT0RFMTI4X0N9LAorICAgIHsweGVlODNjNTBmLCBMInJzczE0U3RhY2tlZE9tbmkiLCBCYXJjb2RlVHlwZTo6cnNzMTRTdGFja2VkT21uaSwKKyAgICAgQkNfVU5LTk9XTn0sCisgICAgezB4ZjJhMThmN2UsIEwiUVJDb2RlIiwgQmFyY29kZVR5cGU6OlFSQ29kZSwgQkNfUVJfQ09ERX0sCisgICAgezB4ZmFlYWYzN2YsIEwicG9zdFVTU3RhbmRhcmQiLCBCYXJjb2RlVHlwZTo6cG9zdFVTU3RhbmRhcmQsIEJDX1VOS05PV059LAorICAgIHsweGZiNDgxNTVjLCBMImNvZGUzT2Y5IiwgQmFyY29kZVR5cGU6OmNvZGUzT2Y5LCBCQ19DT0RFMzl9LAorfTsKKworfSAgLy8gbmFtZXNwYWNlLgorCisvLyBzdGF0aWMKK2NvbnN0IEJhckNvZGVJbmZvKiBDWEZBX0ZGQmFyY29kZTo6R2V0QmFyY29kZVR5cGVCeU5hbWUoCisgICAgY29uc3QgV2lkZVN0cmluZyYgd3NOYW1lKSB7CisgIGlmICh3c05hbWUuSXNFbXB0eSgpKQorICAgIHJldHVybiBudWxscHRyOworCisgIGF1dG8qIGl0ID0gc3RkOjpsb3dlcl9ib3VuZCgKKyAgICAgIHN0ZDo6YmVnaW4oZ19CYXJDb2RlRGF0YSksIHN0ZDo6ZW5kKGdfQmFyQ29kZURhdGEpLAorICAgICAgRlhfSGFzaENvZGVfR2V0Vyh3c05hbWUuQXNTdHJpbmdWaWV3KCksIHRydWUpLAorICAgICAgW10oY29uc3QgQmFyQ29kZUluZm8mIGFyZywgdWludDMyX3QgaGFzaCkgeyByZXR1cm4gYXJnLnVIYXNoIDwgaGFzaDsgfSk7CisKKyAgaWYgKGl0ICE9IHN0ZDo6ZW5kKGdfQmFyQ29kZURhdGEpICYmIHdzTmFtZS5Bc1N0cmluZ1ZpZXcoKSA9PSBpdC0+cE5hbWUpCisgICAgcmV0dXJuIGl0OworCisgIHJldHVybiBudWxscHRyOworfQorCitDWEZBX0ZGQmFyY29kZTo6Q1hGQV9GRkJhcmNvZGUoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0ZGVGV4dEVkaXQocE5vZGUpIHt9CisKK0NYRkFfRkZCYXJjb2RlOjp+Q1hGQV9GRkJhcmNvZGUoKSB7fQorCitib29sIENYRkFfRkZCYXJjb2RlOjpMb2FkV2lkZ2V0KCkgeworICBhdXRvIHBOZXcgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZXTF9CYXJjb2RlPihHZXRGV0xBcHAoKSk7CisgIENGV0xfQmFyY29kZSogcEZXTEJhcmNvZGUgPSBwTmV3LmdldCgpOworICBtX3BOb3JtYWxXaWRnZXQgPSBzdGQ6Om1vdmUocE5ldyk7CisgIG1fcE5vcm1hbFdpZGdldC0+U2V0TGF5b3V0SXRlbSh0aGlzKTsKKworICBDRldMX05vdGVEcml2ZXIqIHBOb3RlRHJpdmVyID0KKyAgICAgIG1fcE5vcm1hbFdpZGdldC0+R2V0T3duZXJBcHAoKS0+R2V0Tm90ZURyaXZlcigpOworICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChtX3BOb3JtYWxXaWRnZXQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE5vcm1hbFdpZGdldC5nZXQoKSk7CisgIG1fcE9sZERlbGVnYXRlID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXREZWxlZ2F0ZSgpOworICBtX3BOb3JtYWxXaWRnZXQtPlNldERlbGVnYXRlKHRoaXMpOworICBtX3BOb3JtYWxXaWRnZXQtPkxvY2tVcGRhdGUoKTsKKworICBwRldMQmFyY29kZS0+U2V0VGV4dCgKKyAgICAgIG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRWYWx1ZShYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpKTsKKyAgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsKKyAgbV9wTm9ybWFsV2lkZ2V0LT5VbmxvY2tVcGRhdGUoKTsKKyAgcmV0dXJuIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpOworfQorCit2b2lkIENYRkFfRkZCYXJjb2RlOjpSZW5kZXJXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cykgeworICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkKKyAgICByZXR1cm47CisKKyAgQ0ZYX01hdHJpeCBtdFJvdGF0ZSA9IEdldFJvdGF0ZU1hdHJpeCgpOworICBtdFJvdGF0ZS5Db25jYXQobWF0cml4KTsKKworICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCBtdFJvdGF0ZSwgZHdTdGF0dXMpOworICBEcmF3Qm9yZGVyKHBHUywgbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldFVJQm9yZGVyKCksIG1fcnRVSSwgbXRSb3RhdGUpOworICBSZW5kZXJDYXB0aW9uKHBHUywgJm10Um90YXRlKTsKKyAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KCk7CisKKyAgQ0ZYX01hdHJpeCBtdCgxLCAwLCAwLCAxLCBydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3ApOworICBtdC5Db25jYXQobXRSb3RhdGUpOworICBtX3BOb3JtYWxXaWRnZXQtPkRyYXdXaWRnZXQocEdTLCBtdCk7Cit9CisKK3ZvaWQgQ1hGQV9GRkJhcmNvZGU6OlVwZGF0ZVdpZGdldFByb3BlcnR5KCkgeworICBDWEZBX0ZGVGV4dEVkaXQ6OlVwZGF0ZVdpZGdldFByb3BlcnR5KCk7CisKKyAgYXV0byogbm9kZSA9IEdldE5vZGUoKTsKKyAgY29uc3QgQmFyQ29kZUluZm8qIGluZm8gPSBHZXRCYXJjb2RlVHlwZUJ5TmFtZShub2RlLT5HZXRCYXJjb2RlVHlwZSgpKTsKKyAgaWYgKCFpbmZvKQorICAgIHJldHVybjsKKworICBhdXRvKiBwQmFyQ29kZVdpZGdldCA9IHN0YXRpY19jYXN0PENGV0xfQmFyY29kZSo+KG1fcE5vcm1hbFdpZGdldC5nZXQoKSk7CisgIHBCYXJDb2RlV2lkZ2V0LT5TZXRUeXBlKGluZm8tPmVCQ1R5cGUpOworCisgIE9wdGlvbmFsPEJDX0NIQVJfRU5DT0RJTkc+IGVuY29kaW5nID0KKyAgICAgIG5vZGUtPkdldEJhcmNvZGVBdHRyaWJ1dGVfQ2hhckVuY29kaW5nKCk7CisgIGlmIChlbmNvZGluZykKKyAgICBwQmFyQ29kZVdpZGdldC0+U2V0Q2hhckVuY29kaW5nKCplbmNvZGluZyk7CisKKyAgT3B0aW9uYWw8Ym9vbD4gY2FsY0NoZWNrc3VtID0gbm9kZS0+R2V0QmFyY29kZUF0dHJpYnV0ZV9DaGVja3N1bSgpOworICBpZiAoY2FsY0NoZWNrc3VtKQorICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRDYWxDaGVja3N1bSgqY2FsY0NoZWNrc3VtKTsKKworICBPcHRpb25hbDxpbnQzMl90PiBkYXRhTGVuID0gbm9kZS0+R2V0QmFyY29kZUF0dHJpYnV0ZV9EYXRhTGVuZ3RoKCk7CisgIGlmIChkYXRhTGVuKQorICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXREYXRhTGVuZ3RoKCpkYXRhTGVuKTsKKworICBPcHRpb25hbDxjaGFyPiBzdGFydENoYXIgPSBub2RlLT5HZXRCYXJjb2RlQXR0cmlidXRlX1N0YXJ0Q2hhcigpOworICBpZiAoc3RhcnRDaGFyKQorICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRTdGFydENoYXIoKnN0YXJ0Q2hhcik7CisKKyAgT3B0aW9uYWw8Y2hhcj4gZW5kQ2hhciA9IG5vZGUtPkdldEJhcmNvZGVBdHRyaWJ1dGVfRW5kQ2hhcigpOworICBpZiAoZW5kQ2hhcikKKyAgICBwQmFyQ29kZVdpZGdldC0+U2V0RW5kQ2hhcigqZW5kQ2hhcik7CisKKyAgT3B0aW9uYWw8aW50MzJfdD4gZWNMZXZlbCA9IG5vZGUtPkdldEJhcmNvZGVBdHRyaWJ1dGVfRUNMZXZlbCgpOworICBpZiAoZWNMZXZlbCkKKyAgICBwQmFyQ29kZVdpZGdldC0+U2V0RXJyb3JDb3JyZWN0aW9uTGV2ZWwoKmVjTGV2ZWwpOworCisgIE9wdGlvbmFsPGludDMyX3Q+IHdpZHRoID0gbm9kZS0+R2V0QmFyY29kZUF0dHJpYnV0ZV9Nb2R1bGVXaWR0aCgpOworICBpZiAod2lkdGgpCisgICAgcEJhckNvZGVXaWRnZXQtPlNldE1vZHVsZVdpZHRoKCp3aWR0aCk7CisKKyAgT3B0aW9uYWw8aW50MzJfdD4gaGVpZ2h0ID0gbm9kZS0+R2V0QmFyY29kZUF0dHJpYnV0ZV9Nb2R1bGVIZWlnaHQoKTsKKyAgaWYgKGhlaWdodCkKKyAgICBwQmFyQ29kZVdpZGdldC0+U2V0TW9kdWxlSGVpZ2h0KCpoZWlnaHQpOworCisgIE9wdGlvbmFsPGJvb2w+IHByaW50Q2hlY2sgPSBub2RlLT5HZXRCYXJjb2RlQXR0cmlidXRlX1ByaW50Q2hlY2tzdW0oKTsKKyAgaWYgKHByaW50Q2hlY2spCisgICAgcEJhckNvZGVXaWRnZXQtPlNldFByaW50Q2hlY2tzdW0oKnByaW50Q2hlY2spOworCisgIE9wdGlvbmFsPEJDX1RFWFRfTE9DPiB0ZXh0TG9jID0gbm9kZS0+R2V0QmFyY29kZUF0dHJpYnV0ZV9UZXh0TG9jYXRpb24oKTsKKyAgaWYgKHRleHRMb2MpCisgICAgcEJhckNvZGVXaWRnZXQtPlNldFRleHRMb2NhdGlvbigqdGV4dExvYyk7CisKKyAgT3B0aW9uYWw8Ym9vbD4gdHJ1bmNhdGUgPSBub2RlLT5HZXRCYXJjb2RlQXR0cmlidXRlX1RydW5jYXRlKCk7CisgIGlmICh0cnVuY2F0ZSkKKyAgICBwQmFyQ29kZVdpZGdldC0+U2V0VHJ1bmNhdGVkKCp0cnVuY2F0ZSk7CisKKyAgT3B0aW9uYWw8aW50OF90PiByYXRpbyA9IG5vZGUtPkdldEJhcmNvZGVBdHRyaWJ1dGVfV2lkZU5hcnJvd1JhdGlvKCk7CisgIGlmIChyYXRpbykKKyAgICBwQmFyQ29kZVdpZGdldC0+U2V0V2lkZU5hcnJvd1JhdGlvKCpyYXRpbyk7CisKKyAgaWYgKGluZm8tPmVOYW1lID09IEJhcmNvZGVUeXBlOjpjb2RlM09mOSB8fAorICAgICAgaW5mby0+ZU5hbWUgPT0gQmFyY29kZVR5cGU6OmVhbjggfHwgaW5mby0+ZU5hbWUgPT0gQmFyY29kZVR5cGU6OmVhbjEzIHx8CisgICAgICBpbmZvLT5lTmFtZSA9PSBCYXJjb2RlVHlwZTo6dXBjQSkgeworICAgIHBCYXJDb2RlV2lkZ2V0LT5TZXRQcmludENoZWNrc3VtKHRydWUpOworICB9Cit9CisKK2Jvb2wgQ1hGQV9GRkJhcmNvZGU6Ok9uTEJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKKyAgYXV0byogcEJhckNvZGVXaWRnZXQgPSBzdGF0aWNfY2FzdDxDRldMX0JhcmNvZGUqPihtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpOworICBpZiAoIXBCYXJDb2RlV2lkZ2V0IHx8IHBCYXJDb2RlV2lkZ2V0LT5Jc1Byb3RlY3RlZFR5cGUoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghbV9wTm9kZS0+SXNPcGVuQWNjZXNzKCkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gQ1hGQV9GRlRleHRFZGl0OjpPbkxCdXR0b25Eb3duKGR3RmxhZ3MsIHBvaW50KTsKK30KKworYm9vbCBDWEZBX0ZGQmFyY29kZTo6T25SQnV0dG9uRG93bih1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICBhdXRvKiBwQmFyQ29kZVdpZGdldCA9IHN0YXRpY19jYXN0PENGV0xfQmFyY29kZSo+KG1fcE5vcm1hbFdpZGdldC5nZXQoKSk7CisgIGlmICghcEJhckNvZGVXaWRnZXQgfHwgcEJhckNvZGVXaWRnZXQtPklzUHJvdGVjdGVkVHlwZSgpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIENYRkFfRkZUZXh0RWRpdDo6T25SQnV0dG9uRG93bihkd0ZsYWdzLCBwb2ludCk7Cit9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX2ZmYmFyY29kZS5oIGIveGZhL2Z4ZmEvY3hmYV9mZmJhcmNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzk4NDcwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9mZmJhcmNvZGUuaApAQCAtMCwwICsxLDEwMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX0NYRkFfRkZCQVJDT0RFX0hfCisjZGVmaW5lIFhGQV9GWEZBX0NYRkFfRkZCQVJDT0RFX0hfCisKKyNpbmNsdWRlICJmeGJhcmNvZGUvQkNfTGlicmFyeS5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZwYWdldmlldy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZ0ZXh0ZWRpdC5oIgorCitlbnVtIGNsYXNzIEJhcmNvZGVUeXBlIHsKKyAgYXp0ZWMsCisgIGNvZGFiYXIsCisgIGNvZGUxMSwKKyAgY29kZTEyOCwKKyAgY29kZTEyOEEsCisgIGNvZGUxMjhCLAorICBjb2RlMTI4QywKKyAgY29kZTEyOFNTQ0MsCisgIGNvZGUyT2Y1SW5kdXN0cmlhbCwKKyAgY29kZTJPZjVJbnRlcmxlYXZlZCwKKyAgY29kZTJPZjVNYXRyaXgsCisgIGNvZGUyT2Y1U3RhbmRhcmQsCisgIGNvZGUzT2Y5LAorICBjb2RlM09mOWV4dGVuZGVkLAorICBjb2RlNDksCisgIGNvZGU5MywKKyAgZGF0YU1hdHJpeCwKKyAgZWFuMTMsCisgIGVhbjEzYWRkMiwKKyAgZWFuMTNhZGQ1LAorICBlYW4xM3B3Y2QsCisgIGVhbjgsCisgIGVhbjhhZGQyLAorICBlYW44YWRkNSwKKyAgZmltLAorICBsb2dtYXJzLAorICBtYXhpY29kZSwKKyAgbXNpLAorICBwZGY0MTcsCisgIHBkZjQxN21hY3JvLAorICBwbGVzc2V5LAorICBwb3N0QVVTQ3VzdDIsCisgIHBvc3RBVVNDdXN0MywKKyAgcG9zdEFVU1JlcGx5UGFpZCwKKyAgcG9zdEFVU1N0YW5kYXJkLAorICBwb3N0VUtSTTRTQ0MsCisgIHBvc3RVUzVaaXAsCisgIHBvc3RVU0RQQkMsCisgIHBvc3RVU0lNQiwKKyAgcG9zdFVTU3RhbmRhcmQsCisgIFFSQ29kZSwKKyAgcmZpZCwKKyAgcnNzMTQsCisgIHJzczE0RXhwYW5kZWQsCisgIHJzczE0TGltaXRlZCwKKyAgcnNzMTRTdGFja2VkLAorICByc3MxNFN0YWNrZWRPbW5pLAorICByc3MxNFRydW5jYXRlZCwKKyAgdGVsZXBlbiwKKyAgdWNjMTI4LAorICB1Y2MxMjhyYW5kb20sCisgIHVjYzEyOHNzY2MsCisgIHVwY0EsCisgIHVwY0FhZGQyLAorICB1cGNBYWRkNSwKKyAgdXBjQXB3Y2QsCisgIHVwY0UsCisgIHVwY0VhZGQyLAorICB1cGNFYWRkNSwKKyAgdXBjZWFuMiwKKyAgdXBjZWFuNSwKKyAgdXBzTWF4aWNvZGUKK307CisKK3N0cnVjdCBCYXJDb2RlSW5mbyB7CisgIHVpbnQzMl90IHVIYXNoOworICBjb25zdCB3Y2hhcl90KiBwTmFtZTsKKyAgQmFyY29kZVR5cGUgZU5hbWU7CisgIEJDX1RZUEUgZUJDVHlwZTsKK307CisKK2NsYXNzIENYRkFfRkZCYXJjb2RlIDogcHVibGljIENYRkFfRkZUZXh0RWRpdCB7CisgcHVibGljOgorICBzdGF0aWMgY29uc3QgQmFyQ29kZUluZm8qIEdldEJhcmNvZGVUeXBlQnlOYW1lKGNvbnN0IFdpZGVTdHJpbmcmIHdzTmFtZSk7CisKKyAgZXhwbGljaXQgQ1hGQV9GRkJhcmNvZGUoQ1hGQV9Ob2RlKiBwTm9kZSk7CisgIH5DWEZBX0ZGQmFyY29kZSgpIG92ZXJyaWRlOworCisgIC8vIENYRkFfRkZUZXh0RWRpdAorICBib29sIExvYWRXaWRnZXQoKSBvdmVycmlkZTsKKyAgdm9pZCBSZW5kZXJXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSBvdmVycmlkZTsKKyAgdm9pZCBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIG92ZXJyaWRlOworICBib29sIE9uTEJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOworICBib29sIE9uUkJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9DWEZBX0ZGQkFSQ09ERV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZmJhcmNvZGVfdW5pdHRlc3QuY3BwIGIveGZhL2Z4ZmEvY3hmYV9mZmJhcmNvZGVfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NWI1YTYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2ZmYmFyY29kZV91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmJhcmNvZGUuaCIKKworI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworVEVTVChYRkFfRkZCYXJjb2RlLCBHZXRCYXJjb2RlVHlwZUJ5TmFtZSkgeworICBFWFBFQ1RfRVEobnVsbHB0ciwgQ1hGQV9GRkJhcmNvZGU6OkdldEJhcmNvZGVUeXBlQnlOYW1lKEwiIikpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgQ1hGQV9GRkJhcmNvZGU6OkdldEJhcmNvZGVUeXBlQnlOYW1lKEwibm90X2ZvdW5kIikpOworCisgIGF1dG8qIGRhdGEgPSBDWEZBX0ZGQmFyY29kZTo6R2V0QmFyY29kZVR5cGVCeU5hbWUoTCJlYW4xMyIpOworICBBU1NFUlRfTkUobnVsbHB0ciwgZGF0YSk7CisgIEVYUEVDVF9FUShCYXJjb2RlVHlwZTo6ZWFuMTMsIGRhdGEtPmVOYW1lKTsKKworICBkYXRhID0gQ1hGQV9GRkJhcmNvZGU6OkdldEJhcmNvZGVUeXBlQnlOYW1lKEwicGRmNDE3Iik7CisgIEFTU0VSVF9ORShudWxscHRyLCBkYXRhKTsKKyAgRVhQRUNUX0VRKEJhcmNvZGVUeXBlOjpwZGY0MTcsIGRhdGEtPmVOYW1lKTsKKworICBkYXRhID0gQ1hGQV9GRkJhcmNvZGU6OkdldEJhcmNvZGVUeXBlQnlOYW1lKEwiY29kZTNPZjkiKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIGRhdGEpOworICBFWFBFQ1RfRVEoQmFyY29kZVR5cGU6OmNvZGUzT2Y5LCBkYXRhLT5lTmFtZSk7Cit9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX2ZmY2hlY2tidXR0b24uY3BwIGIveGZhL2Z4ZmEvY3hmYV9mZmNoZWNrYnV0dG9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWFmODJjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9mZmNoZWNrYnV0dG9uLmNwcApAQCAtMCwwICsxLDM0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmNoZWNrYnV0dG9uLmgiCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfY2hlY2tib3guaCIKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfbWVzc2FnZW1vdXNlLmgiCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX25vdGVkcml2ZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfd2lkZ2V0bWdyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmFwcC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZkb2MuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZG9jdmlldy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZleGNsZ3JvdXAuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZmllbGQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYm9yZGVyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2FwdGlvbi5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhcmEuaCIKKworQ1hGQV9GRkNoZWNrQnV0dG9uOjpDWEZBX0ZGQ2hlY2tCdXR0b24oQ1hGQV9Ob2RlKiBwTm9kZSkKKyAgICA6IENYRkFfRkZGaWVsZChwTm9kZSksIG1fcE9sZERlbGVnYXRlKG51bGxwdHIpIHt9CisKK0NYRkFfRkZDaGVja0J1dHRvbjo6fkNYRkFfRkZDaGVja0J1dHRvbigpIHt9CisKK2Jvb2wgQ1hGQV9GRkNoZWNrQnV0dG9uOjpMb2FkV2lkZ2V0KCkgeworICBhdXRvIHBOZXcgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZXTF9DaGVja0JveD4oR2V0RldMQXBwKCkpOworICBDRldMX0NoZWNrQm94KiBwQ2hlY2tCb3ggPSBwTmV3LmdldCgpOworICBtX3BOb3JtYWxXaWRnZXQgPSBzdGQ6Om1vdmUocE5ldyk7CisgIG1fcE5vcm1hbFdpZGdldC0+U2V0TGF5b3V0SXRlbSh0aGlzKTsKKworICBDRldMX05vdGVEcml2ZXIqIHBOb3RlRHJpdmVyID0KKyAgICAgIG1fcE5vcm1hbFdpZGdldC0+R2V0T3duZXJBcHAoKS0+R2V0Tm90ZURyaXZlcigpOworICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChtX3BOb3JtYWxXaWRnZXQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE5vcm1hbFdpZGdldC5nZXQoKSk7CisgIG1fcE9sZERlbGVnYXRlID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXREZWxlZ2F0ZSgpOworICBtX3BOb3JtYWxXaWRnZXQtPlNldERlbGVnYXRlKHRoaXMpOworICBpZiAobV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPklzUmFkaW9CdXR0b24oKSkKKyAgICBwQ2hlY2tCb3gtPk1vZGlmeVN0eWxlc0V4KEZXTF9TVFlMRUVYVF9DS0JfUmFkaW9CdXR0b24sIDB4RkZGRkZGRkYpOworCisgIG1fcE5vcm1hbFdpZGdldC0+TG9ja1VwZGF0ZSgpOworICBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOworICBTZXRGV0xDaGVja1N0YXRlKG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRDaGVja1N0YXRlKCkpOworICBtX3BOb3JtYWxXaWRnZXQtPlVubG9ja1VwZGF0ZSgpOworICByZXR1cm4gQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCk7Cit9CisKK3ZvaWQgQ1hGQV9GRkNoZWNrQnV0dG9uOjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIHsKKyAgYXV0byogcENoZWNrQm94ID0gc3RhdGljX2Nhc3Q8Q0ZXTF9DaGVja0JveCo+KG1fcE5vcm1hbFdpZGdldC5nZXQoKSk7CisgIGlmICghcENoZWNrQm94KQorICAgIHJldHVybjsKKworICBwQ2hlY2tCb3gtPlNldEJveFNpemUobV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldENoZWNrQnV0dG9uU2l6ZSgpKTsKKyAgdWludDMyX3QgZHdTdHlsZUV4ID0gRldMX1NUWUxFRVhUX0NLQl9TaWduU2hhcGVDcm9zczsKKyAgc3dpdGNoIChtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0Q2hlY2tCdXR0b25NYXJrKCkpIHsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpDaGVjazoKKyAgICAgIGR3U3R5bGVFeCA9IEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ2hlY2s7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpDaXJjbGU6CisgICAgICBkd1N0eWxlRXggPSBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZUNpcmNsZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkNyb3NzOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6RGlhbW9uZDoKKyAgICAgIGR3U3R5bGVFeCA9IEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlRGlhbW9uZDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OlNxdWFyZToKKyAgICAgIGR3U3R5bGVFeCA9IEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlU3F1YXJlOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6U3RhcjoKKyAgICAgIGR3U3R5bGVFeCA9IEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlU3RhcjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6IHsKKyAgICAgIGlmIChtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+SXNDaGVja0J1dHRvblJvdW5kKCkpCisgICAgICAgIGR3U3R5bGVFeCA9IEZXTF9TVFlMRUVYVF9DS0JfU2lnblNoYXBlQ2lyY2xlOworICAgIH0gYnJlYWs7CisgIH0KKyAgaWYgKG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5Jc0FsbG93TmV1dHJhbCgpKQorICAgIGR3U3R5bGVFeCB8PSBGV0xfU1RZTEVFWFRfQ0tCXzNTdGF0ZTsKKworICBwQ2hlY2tCb3gtPk1vZGlmeVN0eWxlc0V4KAorICAgICAgZHdTdHlsZUV4LCBGV0xfU1RZTEVFWFRfQ0tCX1NpZ25TaGFwZU1hc2sgfCBGV0xfU1RZTEVFWFRfQ0tCXzNTdGF0ZSk7Cit9CisKK2Jvb2wgQ1hGQV9GRkNoZWNrQnV0dG9uOjpQZXJmb3JtTGF5b3V0KCkgeworICBDWEZBX0ZGV2lkZ2V0OjpQZXJmb3JtTGF5b3V0KCk7CisKKyAgZmxvYXQgZkNoZWNrU2l6ZSA9IG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRDaGVja0J1dHRvblNpemUoKTsKKyAgQ1hGQV9NYXJnaW4qIG1hcmdpbiA9IG1fcE5vZGUtPkdldE1hcmdpbklmRXhpc3RzKCk7CisgIENGWF9SZWN0RiBydFdpZGdldCA9IEdldFJlY3RXaXRob3V0Um90YXRlKCk7CisgIGlmIChtYXJnaW4pCisgICAgWEZBX1JlY3RXaXRob3V0TWFyZ2luKHJ0V2lkZ2V0LCBtYXJnaW4pOworCisgIFhGQV9BdHRyaWJ1dGVFbnVtIGlDYXBQbGFjZW1lbnQgPSBYRkFfQXR0cmlidXRlRW51bTo6VW5rbm93bjsKKyAgZmxvYXQgZkNhcFJlc2VydmUgPSAwOworICBDWEZBX0NhcHRpb24qIGNhcHRpb24gPSBtX3BOb2RlLT5HZXRDYXB0aW9uSWZFeGlzdHMoKTsKKyAgaWYgKGNhcHRpb24gJiYgY2FwdGlvbi0+SXNWaXNpYmxlKCkpIHsKKyAgICBtX3J0Q2FwdGlvbiA9IHJ0V2lkZ2V0OworICAgIGlDYXBQbGFjZW1lbnQgPSBjYXB0aW9uLT5HZXRQbGFjZW1lbnRUeXBlKCk7CisgICAgZkNhcFJlc2VydmUgPSBjYXB0aW9uLT5HZXRSZXNlcnZlKCk7CisgICAgaWYgKGZDYXBSZXNlcnZlIDw9IDApIHsKKyAgICAgIGlmIChpQ2FwUGxhY2VtZW50ID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpUb3AgfHwKKyAgICAgICAgICBpQ2FwUGxhY2VtZW50ID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpCb3R0b20pIHsKKyAgICAgICAgZkNhcFJlc2VydmUgPSBydFdpZGdldC5oZWlnaHQgLSBmQ2hlY2tTaXplOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZkNhcFJlc2VydmUgPSBydFdpZGdldC53aWR0aCAtIGZDaGVja1NpemU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgWEZBX0F0dHJpYnV0ZUVudW0gaUhvcnpBbGlnbiA9IFhGQV9BdHRyaWJ1dGVFbnVtOjpMZWZ0OworICBYRkFfQXR0cmlidXRlRW51bSBpVmVydEFsaWduID0gWEZBX0F0dHJpYnV0ZUVudW06OlRvcDsKKyAgQ1hGQV9QYXJhKiBwYXJhID0gbV9wTm9kZS0+R2V0UGFyYUlmRXhpc3RzKCk7CisgIGlmIChwYXJhKSB7CisgICAgaUhvcnpBbGlnbiA9IHBhcmEtPkdldEhvcml6b250YWxBbGlnbigpOworICAgIGlWZXJ0QWxpZ24gPSBwYXJhLT5HZXRWZXJ0aWNhbEFsaWduKCk7CisgIH0KKworICBtX3J0VUkgPSBydFdpZGdldDsKKyAgQ1hGQV9NYXJnaW4qIGNhcHRpb25NYXJnaW4gPSBjYXB0aW9uID8gY2FwdGlvbi0+R2V0TWFyZ2luSWZFeGlzdHMoKSA6IG51bGxwdHI7CisgIHN3aXRjaCAoaUNhcFBsYWNlbWVudCkgeworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkxlZnQ6IHsKKyAgICAgIG1fcnRDYXB0aW9uLndpZHRoID0gZkNhcFJlc2VydmU7CisgICAgICBDYXBMZWZ0UmlnaHRQbGFjZW1lbnQoY2FwdGlvbk1hcmdpbik7CisgICAgICBtX3J0VUkud2lkdGggLT0gZkNhcFJlc2VydmU7CisgICAgICBtX3J0VUkubGVmdCArPSBmQ2FwUmVzZXJ2ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpUb3A6IHsKKyAgICAgIG1fcnRDYXB0aW9uLmhlaWdodCA9IGZDYXBSZXNlcnZlOworICAgICAgWEZBX1JlY3RXaXRob3V0TWFyZ2luKG1fcnRDYXB0aW9uLCBjYXB0aW9uTWFyZ2luKTsKKyAgICAgIG1fcnRVSS5oZWlnaHQgLT0gZkNhcFJlc2VydmU7CisgICAgICBtX3J0VUkudG9wICs9IGZDYXBSZXNlcnZlOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OlJpZ2h0OiB7CisgICAgICBtX3J0Q2FwdGlvbi5sZWZ0ID0gbV9ydENhcHRpb24ucmlnaHQoKSAtIGZDYXBSZXNlcnZlOworICAgICAgbV9ydENhcHRpb24ud2lkdGggPSBmQ2FwUmVzZXJ2ZTsKKyAgICAgIENhcExlZnRSaWdodFBsYWNlbWVudChjYXB0aW9uTWFyZ2luKTsKKyAgICAgIG1fcnRVSS53aWR0aCAtPSBmQ2FwUmVzZXJ2ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpCb3R0b206IHsKKyAgICAgIG1fcnRDYXB0aW9uLnRvcCA9IG1fcnRDYXB0aW9uLmJvdHRvbSgpIC0gZkNhcFJlc2VydmU7CisgICAgICBtX3J0Q2FwdGlvbi5oZWlnaHQgPSBmQ2FwUmVzZXJ2ZTsKKyAgICAgIFhGQV9SZWN0V2l0aG91dE1hcmdpbihtX3J0Q2FwdGlvbiwgY2FwdGlvbk1hcmdpbik7CisgICAgICBtX3J0VUkuaGVpZ2h0IC09IGZDYXBSZXNlcnZlOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OklubGluZToKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBpSG9yekFsaWduID0gWEZBX0F0dHJpYnV0ZUVudW06OlJpZ2h0OworICAgICAgYnJlYWs7CisgIH0KKworICBpZiAoaUhvcnpBbGlnbiA9PSBYRkFfQXR0cmlidXRlRW51bTo6Q2VudGVyKQorICAgIG1fcnRVSS5sZWZ0ICs9IChtX3J0VUkud2lkdGggLSBmQ2hlY2tTaXplKSAvIDI7CisgIGVsc2UgaWYgKGlIb3J6QWxpZ24gPT0gWEZBX0F0dHJpYnV0ZUVudW06OlJpZ2h0KQorICAgIG1fcnRVSS5sZWZ0ID0gbV9ydFVJLnJpZ2h0KCkgLSBmQ2hlY2tTaXplOworCisgIGlmIChpVmVydEFsaWduID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpNaWRkbGUpCisgICAgbV9ydFVJLnRvcCArPSAobV9ydFVJLmhlaWdodCAtIGZDaGVja1NpemUpIC8gMjsKKyAgZWxzZSBpZiAoaVZlcnRBbGlnbiA9PSBYRkFfQXR0cmlidXRlRW51bTo6Qm90dG9tKQorICAgIG1fcnRVSS50b3AgPSBtX3J0VUkuYm90dG9tKCkgLSBmQ2hlY2tTaXplOworCisgIG1fcnRVSS53aWR0aCA9IGZDaGVja1NpemU7CisgIG1fcnRVSS5oZWlnaHQgPSBmQ2hlY2tTaXplOworICBBZGRVSU1hcmdpbihpQ2FwUGxhY2VtZW50KTsKKyAgbV9ydENoZWNrQm94ID0gbV9ydFVJOworICBDWEZBX0JvcmRlciogYm9yZGVyVUkgPSBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0VUlCb3JkZXIoKTsKKyAgaWYgKGJvcmRlclVJKSB7CisgICAgQ1hGQV9NYXJnaW4qIGJvcmRlck1hcmdpbiA9IGJvcmRlclVJLT5HZXRNYXJnaW5JZkV4aXN0cygpOworICAgIGlmIChib3JkZXJNYXJnaW4pCisgICAgICBYRkFfUmVjdFdpdGhvdXRNYXJnaW4obV9ydFVJLCBib3JkZXJNYXJnaW4pOworICB9CisKKyAgbV9ydFVJLk5vcm1hbGl6ZSgpOworICBMYXlvdXRDYXB0aW9uKCk7CisgIFNldEZXTFJlY3QoKTsKKyAgaWYgKG1fcE5vcm1hbFdpZGdldCkKKyAgICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOworCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENYRkFfRkZDaGVja0J1dHRvbjo6Q2FwTGVmdFJpZ2h0UGxhY2VtZW50KAorICAgIGNvbnN0IENYRkFfTWFyZ2luKiBjYXB0aW9uTWFyZ2luKSB7CisgIFhGQV9SZWN0V2l0aG91dE1hcmdpbihtX3J0Q2FwdGlvbiwgY2FwdGlvbk1hcmdpbik7CisgIGlmIChtX3J0Q2FwdGlvbi5oZWlnaHQgPCAwKQorICAgIG1fcnRDYXB0aW9uLnRvcCArPSBtX3J0Q2FwdGlvbi5oZWlnaHQ7CisgIGlmIChtX3J0Q2FwdGlvbi53aWR0aCA8IDApIHsKKyAgICBtX3J0Q2FwdGlvbi5sZWZ0ICs9IG1fcnRDYXB0aW9uLndpZHRoOworICAgIG1fcnRDYXB0aW9uLndpZHRoID0gLW1fcnRDYXB0aW9uLndpZHRoOworICB9Cit9CisKK3ZvaWQgQ1hGQV9GRkNoZWNrQnV0dG9uOjpBZGRVSU1hcmdpbihYRkFfQXR0cmlidXRlRW51bSBpQ2FwUGxhY2VtZW50KSB7CisgIENGWF9SZWN0RiBydFVJTWFyZ2luID0gbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldFVJTWFyZ2luKCk7CisgIG1fcnRVSS50b3AgLT0gcnRVSU1hcmdpbi50b3AgLyAyIC0gcnRVSU1hcmdpbi5oZWlnaHQgLyAyOworCisgIGZsb2F0IGZMZWZ0QWRkUmlnaHQgPSBydFVJTWFyZ2luLmxlZnQgKyBydFVJTWFyZ2luLndpZHRoOworICBmbG9hdCBmVG9wQWRkQm90dG9tID0gcnRVSU1hcmdpbi50b3AgKyBydFVJTWFyZ2luLmhlaWdodDsKKyAgaWYgKG1fcnRVSS53aWR0aCA8IGZMZWZ0QWRkUmlnaHQpIHsKKyAgICBpZiAoaUNhcFBsYWNlbWVudCA9PSBYRkFfQXR0cmlidXRlRW51bTo6UmlnaHQgfHwKKyAgICAgICAgaUNhcFBsYWNlbWVudCA9PSBYRkFfQXR0cmlidXRlRW51bTo6TGVmdCkgeworICAgICAgbV9ydFVJLmxlZnQgLT0gZkxlZnRBZGRSaWdodCAtIG1fcnRVSS53aWR0aDsKKyAgICB9IGVsc2UgeworICAgICAgbV9ydFVJLmxlZnQgLT0gMiAqIChmTGVmdEFkZFJpZ2h0IC0gbV9ydFVJLndpZHRoKTsKKyAgICB9CisgICAgbV9ydFVJLndpZHRoICs9IDIgKiAoZkxlZnRBZGRSaWdodCAtIG1fcnRVSS53aWR0aCk7CisgIH0KKyAgaWYgKG1fcnRVSS5oZWlnaHQgPCBmVG9wQWRkQm90dG9tKSB7CisgICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0F0dHJpYnV0ZUVudW06OlJpZ2h0KQorICAgICAgbV9ydFVJLmxlZnQgLT0gZlRvcEFkZEJvdHRvbSAtIG1fcnRVSS5oZWlnaHQ7CisKKyAgICBtX3J0VUkudG9wIC09IGZUb3BBZGRCb3R0b20gLSBtX3J0VUkuaGVpZ2h0OworICAgIG1fcnRVSS5oZWlnaHQgKz0gMiAqIChmVG9wQWRkQm90dG9tIC0gbV9ydFVJLmhlaWdodCk7CisgIH0KK30KKwordm9pZCBDWEZBX0ZGQ2hlY2tCdXR0b246OlJlbmRlcldpZGdldChDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGF0dXMpIHsKKyAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpCisgICAgcmV0dXJuOworCisgIENGWF9NYXRyaXggbXRSb3RhdGUgPSBHZXRSb3RhdGVNYXRyaXgoKTsKKyAgbXRSb3RhdGUuQ29uY2F0KG1hdHJpeCk7CisKKyAgQ1hGQV9GRldpZGdldDo6UmVuZGVyV2lkZ2V0KHBHUywgbXRSb3RhdGUsIGR3U3RhdHVzKTsKKyAgRHJhd0JvcmRlcldpdGhGbGFnKHBHUywgbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldFVJQm9yZGVyKCksIG1fcnRVSSwKKyAgICAgICAgICAgICAgICAgICAgIG10Um90YXRlLCBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+SXNDaGVja0J1dHRvblJvdW5kKCkpOworICBSZW5kZXJDYXB0aW9uKHBHUywgJm10Um90YXRlKTsKKyAgRHJhd0hpZ2hsaWdodChwR1MsICZtdFJvdGF0ZSwgZHdTdGF0dXMsCisgICAgICAgICAgICAgICAgbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPklzQ2hlY2tCdXR0b25Sb3VuZCgpKTsKKyAgQ0ZYX01hdHJpeCBtdCgxLCAwLCAwLCAxLCBtX3J0Q2hlY2tCb3gubGVmdCwgbV9ydENoZWNrQm94LnRvcCk7CisgIG10LkNvbmNhdChtdFJvdGF0ZSk7CisgIEdldEFwcCgpLT5HZXRGV0xXaWRnZXRNZ3IoKS0+T25EcmF3V2lkZ2V0KG1fcE5vcm1hbFdpZGdldC5nZXQoKSwgcEdTLCBtdCk7Cit9CisKK2Jvb2wgQ1hGQV9GRkNoZWNrQnV0dG9uOjpPbkxCdXR0b25VcCh1aW50MzJfdCBkd0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIGlmICghbV9wTm9ybWFsV2lkZ2V0IHx8ICFJc0J1dHRvbkRvd24oKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgU2V0QnV0dG9uRG93bihmYWxzZSk7CisgIENGV0xfTWVzc2FnZU1vdXNlIG1zKG51bGxwdHIsIG1fcE5vcm1hbFdpZGdldC5nZXQoKSk7CisgIG1zLm1fZHdDbWQgPSBGV0xfTW91c2VDb21tYW5kOjpMZWZ0QnV0dG9uVXA7CisgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7CisgIG1zLm1fcG9zID0gRldMVG9DbGllbnQocG9pbnQpOworICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7CisgIHJldHVybiB0cnVlOworfQorCitYRkFfQ0hFQ0tTVEFURSBDWEZBX0ZGQ2hlY2tCdXR0b246OkZXTFN0YXRlMlhGQVN0YXRlKCkgeworICB1aW50MzJfdCBkd1N0YXRlID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRTdGF0ZXMoKTsKKyAgaWYgKGR3U3RhdGUgJiBGV0xfU1RBVEVfQ0tCX0NoZWNrZWQpCisgICAgcmV0dXJuIFhGQV9DSEVDS1NUQVRFX09uOworICBpZiAoZHdTdGF0ZSAmIEZXTF9TVEFURV9DS0JfTmV1dHJhbCkKKyAgICByZXR1cm4gWEZBX0NIRUNLU1RBVEVfTmV1dHJhbDsKKyAgcmV0dXJuIFhGQV9DSEVDS1NUQVRFX09mZjsKK30KKworYm9vbCBDWEZBX0ZGQ2hlY2tCdXR0b246OkNvbW1pdERhdGEoKSB7CisgIFhGQV9DSEVDS1NUQVRFIGVDaGVja1N0YXRlID0gRldMU3RhdGUyWEZBU3RhdGUoKTsKKyAgbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPlNldENoZWNrU3RhdGUoZUNoZWNrU3RhdGUsIHRydWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDWEZBX0ZGQ2hlY2tCdXR0b246OklzRGF0YUNoYW5nZWQoKSB7CisgIFhGQV9DSEVDS1NUQVRFIGVDaGVja1N0YXRlID0gRldMU3RhdGUyWEZBU3RhdGUoKTsKKyAgcmV0dXJuIG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRDaGVja1N0YXRlKCkgIT0gZUNoZWNrU3RhdGU7Cit9CisKK3ZvaWQgQ1hGQV9GRkNoZWNrQnV0dG9uOjpTZXRGV0xDaGVja1N0YXRlKFhGQV9DSEVDS1NUQVRFIGVDaGVja1N0YXRlKSB7CisgIGlmIChlQ2hlY2tTdGF0ZSA9PSBYRkFfQ0hFQ0tTVEFURV9OZXV0cmFsKQorICAgIG1fcE5vcm1hbFdpZGdldC0+U2V0U3RhdGVzKEZXTF9TVEFURV9DS0JfTmV1dHJhbCk7CisgIGVsc2UgaWYgKGVDaGVja1N0YXRlID09IFhGQV9DSEVDS1NUQVRFX09uKQorICAgIG1fcE5vcm1hbFdpZGdldC0+U2V0U3RhdGVzKEZXTF9TVEFURV9DS0JfQ2hlY2tlZCk7CisgIGVsc2UKKyAgICBtX3BOb3JtYWxXaWRnZXQtPlJlbW92ZVN0YXRlcyhGV0xfU1RBVEVfQ0tCX0NoZWNrZWQpOworfQorCitib29sIENYRkFfRkZDaGVja0J1dHRvbjo6VXBkYXRlRldMRGF0YSgpIHsKKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIFhGQV9DSEVDS1NUQVRFIGVTdGF0ZSA9IG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRDaGVja1N0YXRlKCk7CisgIFNldEZXTENoZWNrU3RhdGUoZVN0YXRlKTsKKyAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ1hGQV9GRkNoZWNrQnV0dG9uOjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsKKyAgbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOworfQorCit2b2lkIENYRkFfRkZDaGVja0J1dHRvbjo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSB7CisgIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsKKyAgc3dpdGNoIChwRXZlbnQtPkdldFR5cGUoKSkgeworICAgIGNhc2UgQ0ZXTF9FdmVudDo6VHlwZTo6Q2hlY2tTdGF0ZUNoYW5nZWQ6IHsKKyAgICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07CisgICAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9DaGFuZ2U7CisgICAgICBlUGFyYW0ubV93c05ld1RleHQgPQorICAgICAgICAgIG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRWYWx1ZShYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7CisKKyAgICAgIENYRkFfTm9kZSogZXhjbE5vZGUgPSBtX3BOb2RlLT5HZXRFeGNsR3JvdXBJZkV4aXN0cygpOworICAgICAgaWYgKFByb2Nlc3NDb21taXR0ZWREYXRhKCkpIHsKKyAgICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IGV4Y2xOb2RlID8gZXhjbE5vZGUtPkdldFdpZGdldEFjYygpIDogbnVsbHB0cjsKKyAgICAgICAgaWYgKGV4Y2xOb2RlKSB7CisgICAgICAgICAgbV9wRG9jVmlldy0+QWRkVmFsaWRhdGVXaWRnZXQoZXhjbE5vZGUtPkdldFdpZGdldEFjYygpKTsKKyAgICAgICAgICBtX3BEb2NWaWV3LT5BZGRDYWxjdWxhdGVXaWRnZXRBY2MoZXhjbE5vZGUtPkdldFdpZGdldEFjYygpKTsKKyAgICAgICAgICBleGNsTm9kZS0+UHJvY2Vzc0V2ZW50KEdldERvY1ZpZXcoKSwgWEZBX0F0dHJpYnV0ZUVudW06OkNoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlUGFyYW0pOworICAgICAgICB9CisgICAgICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKTsKKyAgICAgICAgbV9wTm9kZS0+UHJvY2Vzc0V2ZW50KEdldERvY1ZpZXcoKSwgWEZBX0F0dHJpYnV0ZUVudW06OkNoYW5nZSwgJmVQYXJhbSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBTZXRGV0xDaGVja1N0YXRlKG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRDaGVja1N0YXRlKCkpOworICAgICAgfQorICAgICAgaWYgKGV4Y2xOb2RlKSB7CisgICAgICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBleGNsTm9kZS0+R2V0V2lkZ2V0QWNjKCk7CisgICAgICAgIGV4Y2xOb2RlLT5Qcm9jZXNzRXZlbnQoR2V0RG9jVmlldygpLCBYRkFfQXR0cmlidXRlRW51bTo6Q2xpY2ssICZlUGFyYW0pOworICAgICAgfQorICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcE5vZGUtPkdldFdpZGdldEFjYygpOworICAgICAgbV9wTm9kZS0+UHJvY2Vzc0V2ZW50KEdldERvY1ZpZXcoKSwgWEZBX0F0dHJpYnV0ZUVudW06OkNsaWNrLCAmZVBhcmFtKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7Cit9CisKK3ZvaWQgQ1hGQV9GRkNoZWNrQnV0dG9uOjpPbkRyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKKyAgbV9wT2xkRGVsZWdhdGUtPk9uRHJhd1dpZGdldChwR3JhcGhpY3MsIG1hdHJpeCk7Cit9CisKK0Zvcm1GaWVsZFR5cGUgQ1hGQV9GRkNoZWNrQnV0dG9uOjpHZXRGb3JtRmllbGRUeXBlKCkgeworICByZXR1cm4gRm9ybUZpZWxkVHlwZTo6a1hGQV9DaGVja0JveDsKK30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfZmZjaGVja2J1dHRvbi5oIGIveGZhL2Z4ZmEvY3hmYV9mZmNoZWNrYnV0dG9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg0MWQ3OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZmZjaGVja2J1dHRvbi5oCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9DWEZBX0ZGQ0hFQ0tCVVRUT05fSF8KKyNkZWZpbmUgWEZBX0ZYRkFfQ1hGQV9GRkNIRUNLQlVUVE9OX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZmllbGQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuaCIKKworY2xhc3MgQ1hGQV9GRkNoZWNrQnV0dG9uIDogcHVibGljIENYRkFfRkZGaWVsZCB7CisgcHVibGljOgorICBleHBsaWNpdCBDWEZBX0ZGQ2hlY2tCdXR0b24oQ1hGQV9Ob2RlKiBwTm9kZSk7CisgIH5DWEZBX0ZGQ2hlY2tCdXR0b24oKSBvdmVycmlkZTsKKworICAvLyBDWEZBX0ZGRmllbGQKKyAgdm9pZCBSZW5kZXJXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSBvdmVycmlkZTsKKworICBib29sIExvYWRXaWRnZXQoKSBvdmVycmlkZTsKKyAgYm9vbCBQZXJmb3JtTGF5b3V0KCkgb3ZlcnJpZGU7CisgIGJvb2wgVXBkYXRlRldMRGF0YSgpIG92ZXJyaWRlOworICB2b2lkIFVwZGF0ZVdpZGdldFByb3BlcnR5KCkgb3ZlcnJpZGU7CisgIGJvb2wgT25MQnV0dG9uVXAodWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOworICB2b2lkIE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgb3ZlcnJpZGU7CisgIHZvaWQgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSBvdmVycmlkZTsKKyAgdm9pZCBPbkRyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIG92ZXJyaWRlOworICBGb3JtRmllbGRUeXBlIEdldEZvcm1GaWVsZFR5cGUoKSBvdmVycmlkZTsKKworICB2b2lkIFNldEZXTENoZWNrU3RhdGUoWEZBX0NIRUNLU1RBVEUgZUNoZWNrU3RhdGUpOworCisgcHJpdmF0ZToKKyAgYm9vbCBDb21taXREYXRhKCkgb3ZlcnJpZGU7CisgIGJvb2wgSXNEYXRhQ2hhbmdlZCgpIG92ZXJyaWRlOworICB2b2lkIENhcExlZnRSaWdodFBsYWNlbWVudChjb25zdCBDWEZBX01hcmdpbiogY2FwdGlvbk1hcmdpbik7CisgIHZvaWQgQWRkVUlNYXJnaW4oWEZBX0F0dHJpYnV0ZUVudW0gaUNhcFBsYWNlbWVudCk7CisgIFhGQV9DSEVDS1NUQVRFIEZXTFN0YXRlMlhGQVN0YXRlKCk7CisKKyAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogbV9wT2xkRGVsZWdhdGU7CisgIENGWF9SZWN0RiBtX3J0Q2hlY2tCb3g7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX0NYRkFfRkZDSEVDS0JVVFRPTl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZmNvbWJvYm94LmNwcCBiL3hmYS9meGZhL2N4ZmFfZmZjb21ib2JveC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMwMjRmYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZmZjb21ib2JveC5jcHAKQEAgLTAsMCArMSwzNjAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZjb21ib2JveC5oIgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfY29tYm9ib3guaCIKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfZXZlbnRzZWxlY3RjaGFuZ2VkLmgiCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX25vdGVkcml2ZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZG9jdmlldy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhcmEuaCIKKworbmFtZXNwYWNlIHsKKworQ0ZXTF9Db21ib0JveCogVG9Db21ib0JveChDRldMX1dpZGdldCogd2lkZ2V0KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxDRldMX0NvbWJvQm94Kj4od2lkZ2V0KTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRkZDb21ib0JveDo6Q1hGQV9GRkNvbWJvQm94KENYRkFfTm9kZSogcE5vZGUpCisgICAgOiBDWEZBX0ZGRmllbGQocE5vZGUpLCBtX3BPbGREZWxlZ2F0ZShudWxscHRyKSB7fQorCitDWEZBX0ZGQ29tYm9Cb3g6On5DWEZBX0ZGQ29tYm9Cb3goKSB7fQorCitDRlhfUmVjdEYgQ1hGQV9GRkNvbWJvQm94OjpHZXRCQm94KHVpbnQzMl90IGR3U3RhdHVzLCBib29sIGJEcmF3Rm9jdXMpIHsKKyAgcmV0dXJuIGJEcmF3Rm9jdXMgPyBDRlhfUmVjdEYoKSA6IENYRkFfRkZXaWRnZXQ6OkdldEJCb3goZHdTdGF0dXMpOworfQorCitib29sIENYRkFfRkZDb21ib0JveDo6UHRJbkFjdGl2ZVJlY3QoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKKyAgYXV0byogcENvbWJvQm94ID0gVG9Db21ib0JveChtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpOworICByZXR1cm4gcENvbWJvQm94ICYmIHBDb21ib0JveC0+R2V0QkJveCgpLkNvbnRhaW5zKHBvaW50KTsKK30KKworYm9vbCBDWEZBX0ZGQ29tYm9Cb3g6OkxvYWRXaWRnZXQoKSB7CisgIGF1dG8gcE5ldyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRldMX0NvbWJvQm94PihHZXRGV0xBcHAoKSk7CisgIENGV0xfQ29tYm9Cb3gqIHBDb21ib0JveCA9IHBOZXcuZ2V0KCk7CisgIG1fcE5vcm1hbFdpZGdldCA9IHN0ZDo6bW92ZShwTmV3KTsKKyAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRMYXlvdXRJdGVtKHRoaXMpOworCisgIENGV0xfTm90ZURyaXZlciogcE5vdGVEcml2ZXIgPQorICAgICAgbV9wTm9ybWFsV2lkZ2V0LT5HZXRPd25lckFwcCgpLT5HZXROb3RlRHJpdmVyKCk7CisgIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KG1fcE5vcm1hbFdpZGdldC5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wTm9ybWFsV2lkZ2V0LmdldCgpKTsKKyAgbV9wT2xkRGVsZWdhdGUgPSBtX3BOb3JtYWxXaWRnZXQtPkdldERlbGVnYXRlKCk7CisgIG1fcE5vcm1hbFdpZGdldC0+U2V0RGVsZWdhdGUodGhpcyk7CisgIG1fcE5vcm1hbFdpZGdldC0+TG9ja1VwZGF0ZSgpOworCisgIGZvciAoY29uc3QgYXV0byYgbGFiZWwgOiBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0Q2hvaWNlTGlzdEl0ZW1zKGZhbHNlKSkKKyAgICBwQ29tYm9Cb3gtPkFkZFN0cmluZyhsYWJlbC5Bc1N0cmluZ1ZpZXcoKSk7CisKKyAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gaVNlbEFycmF5ID0gbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldFNlbGVjdGVkSXRlbXMoKTsKKyAgaWYgKGlTZWxBcnJheS5lbXB0eSgpKSB7CisgICAgcENvbWJvQm94LT5TZXRFZGl0VGV4dCgKKyAgICAgICAgbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldFZhbHVlKFhGQV9WQUxVRVBJQ1RVUkVfUmF3KSk7CisgIH0gZWxzZSB7CisgICAgcENvbWJvQm94LT5TZXRDdXJTZWwoaVNlbEFycmF5LmZyb250KCkpOworICB9CisKKyAgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsKKyAgbV9wTm9ybWFsV2lkZ2V0LT5VbmxvY2tVcGRhdGUoKTsKKyAgcmV0dXJuIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpOworfQorCit2b2lkIENYRkFfRkZDb21ib0JveDo6VXBkYXRlV2lkZ2V0UHJvcGVydHkoKSB7CisgIGF1dG8qIHBDb21ib0JveCA9IFRvQ29tYm9Cb3gobV9wTm9ybWFsV2lkZ2V0LmdldCgpKTsKKyAgaWYgKCFwQ29tYm9Cb3gpCisgICAgcmV0dXJuOworCisgIHVpbnQzMl90IGR3RXh0ZW5kZWRTdHlsZSA9IDA7CisgIHVpbnQzMl90IGR3RWRpdFN0eWxlcyA9IEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHk7CisgIGR3RXh0ZW5kZWRTdHlsZSB8PSBVcGRhdGVVSVByb3BlcnR5KCk7CisgIGlmIChtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+SXNDaG9pY2VMaXN0QWxsb3dUZXh0RW50cnkoKSkgeworICAgIGR3RWRpdFN0eWxlcyAmPSB+RldMX1NUWUxFRVhUX0VEVF9SZWFkT25seTsKKyAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0NNQl9Ecm9wRG93bjsKKyAgfQorICBpZiAoIW1fcE5vZGUtPklzT3BlbkFjY2VzcygpIHx8ICFHZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkgeworICAgIGR3RWRpdFN0eWxlcyB8PSBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5OworICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfQ01CX1JlYWRPbmx5OworICB9CisgIGR3RXh0ZW5kZWRTdHlsZSB8PSBHZXRBbGlnbm1lbnQoKTsKKyAgbV9wTm9ybWFsV2lkZ2V0LT5Nb2RpZnlTdHlsZXNFeChkd0V4dGVuZGVkU3R5bGUsIDB4RkZGRkZGRkYpOworCisgIGlmICghbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPklzSG9yaXpvbnRhbFNjcm9sbFBvbGljeU9mZigpKQorICAgIGR3RWRpdFN0eWxlcyB8PSBGV0xfU1RZTEVFWFRfRURUX0F1dG9IU2Nyb2xsOworCisgIHBDb21ib0JveC0+RWRpdE1vZGlmeVN0eWxlc0V4KGR3RWRpdFN0eWxlcywgMHhGRkZGRkZGRik7Cit9CisKK2Jvb2wgQ1hGQV9GRkNvbWJvQm94OjpPblJCdXR0b25VcCh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICBpZiAoIUNYRkFfRkZGaWVsZDo6T25SQnV0dG9uVXAoZHdGbGFncywgcG9pbnQpKQorICAgIHJldHVybiBmYWxzZTsKKworICBHZXREb2MoKS0+R2V0RG9jRW52aXJvbm1lbnQoKS0+UG9wdXBNZW51KHRoaXMsIHBvaW50KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1hGQV9GRkNvbWJvQm94OjpPbktpbGxGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwTmV3V2lkZ2V0KSB7CisgIGlmICghUHJvY2Vzc0NvbW1pdHRlZERhdGEoKSkKKyAgICBVcGRhdGVGV0xEYXRhKCk7CisKKyAgQ1hGQV9GRkZpZWxkOjpPbktpbGxGb2N1cyhwTmV3V2lkZ2V0KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ1hGQV9GRkNvbWJvQm94OjpPcGVuRHJvcERvd25MaXN0KCkgeworICBUb0NvbWJvQm94KG1fcE5vcm1hbFdpZGdldC5nZXQoKSktPk9wZW5Ecm9wRG93bkxpc3QodHJ1ZSk7Cit9CisKK2Jvb2wgQ1hGQV9GRkNvbWJvQm94OjpDb21taXREYXRhKCkgeworICByZXR1cm4gbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPlNldFZhbHVlKFhGQV9WQUxVRVBJQ1RVUkVfUmF3LCBtX3dzTmV3VmFsdWUpOworfQorCitib29sIENYRkFfRkZDb21ib0JveDo6SXNEYXRhQ2hhbmdlZCgpIHsKKyAgYXV0byogcEZXTGNvbWJvYm94ID0gVG9Db21ib0JveChtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpOworICBXaWRlU3RyaW5nIHdzVGV4dCA9IHBGV0xjb21ib2JveC0+R2V0RWRpdFRleHQoKTsKKyAgaW50MzJfdCBpQ3Vyc2VsID0gcEZXTGNvbWJvYm94LT5HZXRDdXJTZWwoKTsKKyAgaWYgKGlDdXJzZWwgPj0gMCkgeworICAgIFdpZGVTdHJpbmcgd3NTZWwgPSBwRldMY29tYm9ib3gtPkdldFRleHRCeUluZGV4KGlDdXJzZWwpOworICAgIGlmICh3c1NlbCA9PSB3c1RleHQpCisgICAgICB3c1RleHQgPSBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKQorICAgICAgICAgICAgICAgICAgIC0+R2V0Q2hvaWNlTGlzdEl0ZW0oaUN1cnNlbCwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAudmFsdWVfb3IoTCIiKTsKKyAgfQorICBpZiAobV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldFZhbHVlKFhGQV9WQUxVRVBJQ1RVUkVfUmF3KSA9PSB3c1RleHQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG1fd3NOZXdWYWx1ZSA9IHdzVGV4dDsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ1hGQV9GRkNvbWJvQm94OjpGV0xFdmVudFNlbENoYW5nZShDWEZBX0V2ZW50UGFyYW0qIHBQYXJhbSkgeworICBwUGFyYW0tPm1fZVR5cGUgPSBYRkFfRVZFTlRfQ2hhbmdlOworICBwUGFyYW0tPm1fcFRhcmdldCA9IG1fcE5vZGUtPkdldFdpZGdldEFjYygpOworICBwUGFyYW0tPm1fd3NOZXdUZXh0ID0gVG9Db21ib0JveChtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpLT5HZXRFZGl0VGV4dCgpOworICBtX3BOb2RlLT5Qcm9jZXNzRXZlbnQoR2V0RG9jVmlldygpLCBYRkFfQXR0cmlidXRlRW51bTo6Q2hhbmdlLCBwUGFyYW0pOworfQorCit1aW50MzJfdCBDWEZBX0ZGQ29tYm9Cb3g6OkdldEFsaWdubWVudCgpIHsKKyAgQ1hGQV9QYXJhKiBwYXJhID0gbV9wTm9kZS0+R2V0UGFyYUlmRXhpc3RzKCk7CisgIGlmICghcGFyYSkKKyAgICByZXR1cm4gMDsKKworICB1aW50MzJfdCBkd0V4dGVuZGVkU3R5bGUgPSAwOworICBzd2l0Y2ggKHBhcmEtPkdldEhvcml6b250YWxBbGlnbigpKSB7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6Q2VudGVyOgorICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9CisgICAgICAgICAgRldMX1NUWUxFRVhUX0NNQl9FZGl0SENlbnRlciB8IEZXTF9TVFlMRUVYVF9DTUJfTGlzdEl0ZW1DZW50ZXJBbGlnbjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06Okp1c3RpZnk6CisgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0NNQl9FZGl0SnVzdGlmaWVkOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6SnVzdGlmeUFsbDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OlJhZGl4OgorICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6UmlnaHQ6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9CisgICAgICAgICAgRldMX1NUWUxFRVhUX0NNQl9FZGl0SE5lYXIgfCBGV0xfU1RZTEVFWFRfQ01CX0xpc3RJdGVtTGVmdEFsaWduOworICAgICAgYnJlYWs7CisgIH0KKworICBzd2l0Y2ggKHBhcmEtPkdldFZlcnRpY2FsQWxpZ24oKSkgeworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06Ok1pZGRsZToKKyAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfQ01CX0VkaXRWQ2VudGVyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6Qm90dG9tOgorICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9DTUJfRWRpdFZGYXI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9DTUJfRWRpdFZOZWFyOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGR3RXh0ZW5kZWRTdHlsZTsKK30KKworYm9vbCBDWEZBX0ZGQ29tYm9Cb3g6OlVwZGF0ZUZXTERhdGEoKSB7CisgIGF1dG8qIHBDb21ib0JveCA9IFRvQ29tYm9Cb3gobV9wTm9ybWFsV2lkZ2V0LmdldCgpKTsKKyAgaWYgKCFwQ29tYm9Cb3gpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGlTZWxBcnJheSA9IG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRTZWxlY3RlZEl0ZW1zKCk7CisgIGlmICghaVNlbEFycmF5LmVtcHR5KCkpIHsKKyAgICBwQ29tYm9Cb3gtPlNldEN1clNlbChpU2VsQXJyYXkuZnJvbnQoKSk7CisgIH0gZWxzZSB7CisgICAgcENvbWJvQm94LT5TZXRDdXJTZWwoLTEpOworICAgIHBDb21ib0JveC0+U2V0RWRpdFRleHQoCisgICAgICAgIG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRWYWx1ZShYRkFfVkFMVUVQSUNUVVJFX1JhdykpOworICB9CisgIHBDb21ib0JveC0+VXBkYXRlKCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENYRkFfRkZDb21ib0JveDo6Q2FuVW5kbygpIHsKKyAgcmV0dXJuIG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpICYmCisgICAgICAgICBUb0NvbWJvQm94KG1fcE5vcm1hbFdpZGdldC5nZXQoKSktPkVkaXRDYW5VbmRvKCk7Cit9CisKK2Jvb2wgQ1hGQV9GRkNvbWJvQm94OjpDYW5SZWRvKCkgeworICByZXR1cm4gbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkgJiYKKyAgICAgICAgIFRvQ29tYm9Cb3gobV9wTm9ybWFsV2lkZ2V0LmdldCgpKS0+RWRpdENhblJlZG8oKTsKK30KKworYm9vbCBDWEZBX0ZGQ29tYm9Cb3g6OlVuZG8oKSB7CisgIHJldHVybiBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+SXNDaG9pY2VMaXN0QWxsb3dUZXh0RW50cnkoKSAmJgorICAgICAgICAgVG9Db21ib0JveChtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpLT5FZGl0VW5kbygpOworfQorCitib29sIENYRkFfRkZDb21ib0JveDo6UmVkbygpIHsKKyAgcmV0dXJuIG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpICYmCisgICAgICAgICBUb0NvbWJvQm94KG1fcE5vcm1hbFdpZGdldC5nZXQoKSktPkVkaXRSZWRvKCk7Cit9CisKK2Jvb2wgQ1hGQV9GRkNvbWJvQm94OjpDYW5Db3B5KCkgeworICByZXR1cm4gVG9Db21ib0JveChtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpLT5FZGl0Q2FuQ29weSgpOworfQorCitib29sIENYRkFfRkZDb21ib0JveDo6Q2FuQ3V0KCkgeworICByZXR1cm4gbV9wTm9kZS0+SXNPcGVuQWNjZXNzKCkgJiYKKyAgICAgICAgIG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpICYmCisgICAgICAgICBUb0NvbWJvQm94KG1fcE5vcm1hbFdpZGdldC5nZXQoKSktPkVkaXRDYW5DdXQoKTsKK30KKworYm9vbCBDWEZBX0ZGQ29tYm9Cb3g6OkNhblBhc3RlKCkgeworICByZXR1cm4gbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkgJiYKKyAgICAgICAgIG1fcE5vZGUtPklzT3BlbkFjY2VzcygpOworfQorCitib29sIENYRkFfRkZDb21ib0JveDo6Q2FuU2VsZWN0QWxsKCkgeworICByZXR1cm4gVG9Db21ib0JveChtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpLT5FZGl0Q2FuU2VsZWN0QWxsKCk7Cit9CisKK09wdGlvbmFsPFdpZGVTdHJpbmc+IENYRkFfRkZDb21ib0JveDo6Q29weSgpIHsKKyAgcmV0dXJuIFRvQ29tYm9Cb3gobV9wTm9ybWFsV2lkZ2V0LmdldCgpKS0+RWRpdENvcHkoKTsKK30KKworT3B0aW9uYWw8V2lkZVN0cmluZz4gQ1hGQV9GRkNvbWJvQm94OjpDdXQoKSB7CisgIGlmICghbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkpCisgICAgcmV0dXJuIHt9OworCisgIHJldHVybiBUb0NvbWJvQm94KG1fcE5vcm1hbFdpZGdldC5nZXQoKSktPkVkaXRDdXQoKTsKK30KKworYm9vbCBDWEZBX0ZGQ29tYm9Cb3g6OlBhc3RlKGNvbnN0IFdpZGVTdHJpbmcmIHdzUGFzdGUpIHsKKyAgcmV0dXJuIG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5Jc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpICYmCisgICAgICAgICBUb0NvbWJvQm94KG1fcE5vcm1hbFdpZGdldC5nZXQoKSktPkVkaXRQYXN0ZSh3c1Bhc3RlKTsKK30KKwordm9pZCBDWEZBX0ZGQ29tYm9Cb3g6OlNlbGVjdEFsbCgpIHsKKyAgVG9Db21ib0JveChtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpLT5FZGl0U2VsZWN0QWxsKCk7Cit9CisKK3ZvaWQgQ1hGQV9GRkNvbWJvQm94OjpEZWxldGUoKSB7CisgIFRvQ29tYm9Cb3gobV9wTm9ybWFsV2lkZ2V0LmdldCgpKS0+RWRpdERlbGV0ZSgpOworfQorCit2b2lkIENYRkFfRkZDb21ib0JveDo6RGVTZWxlY3QoKSB7CisgIFRvQ29tYm9Cb3gobV9wTm9ybWFsV2lkZ2V0LmdldCgpKS0+RWRpdERlU2VsZWN0KCk7Cit9CisKK0Zvcm1GaWVsZFR5cGUgQ1hGQV9GRkNvbWJvQm94OjpHZXRGb3JtRmllbGRUeXBlKCkgeworICByZXR1cm4gRm9ybUZpZWxkVHlwZTo6a1hGQV9Db21ib0JveDsKK30KKwordm9pZCBDWEZBX0ZGQ29tYm9Cb3g6OlNldEl0ZW1TdGF0ZShpbnQzMl90IG5JbmRleCwgYm9vbCBiU2VsZWN0ZWQpIHsKKyAgVG9Db21ib0JveChtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpLT5TZXRDdXJTZWwoYlNlbGVjdGVkID8gbkluZGV4IDogLTEpOworICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOworICBBZGRJbnZhbGlkYXRlUmVjdCgpOworfQorCit2b2lkIENYRkFfRkZDb21ib0JveDo6SW5zZXJ0SXRlbShjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4KSB7CisgIFRvQ29tYm9Cb3gobV9wTm9ybWFsV2lkZ2V0LmdldCgpKS0+QWRkU3RyaW5nKHdzTGFiZWwpOworICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOworICBBZGRJbnZhbGlkYXRlUmVjdCgpOworfQorCit2b2lkIENYRkFfRkZDb21ib0JveDo6RGVsZXRlSXRlbShpbnQzMl90IG5JbmRleCkgeworICBpZiAobkluZGV4IDwgMCkKKyAgICBUb0NvbWJvQm94KG1fcE5vcm1hbFdpZGdldC5nZXQoKSktPlJlbW92ZUFsbCgpOworICBlbHNlCisgICAgVG9Db21ib0JveChtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpLT5SZW1vdmVBdChuSW5kZXgpOworCisgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7CisgIEFkZEludmFsaWRhdGVSZWN0KCk7Cit9CisKK3ZvaWQgQ1hGQV9GRkNvbWJvQm94OjpPblRleHRDaGFuZ2VkKENGV0xfV2lkZ2V0KiBwV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NDaGFuZ2VkKSB7CisgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07CisgIGVQYXJhbS5tX3dzUHJldlRleHQgPSBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0VmFsdWUoWEZBX1ZBTFVFUElDVFVSRV9SYXcpOworICBlUGFyYW0ubV93c0NoYW5nZSA9IHdzQ2hhbmdlZDsKKyAgRldMRXZlbnRTZWxDaGFuZ2UoJmVQYXJhbSk7Cit9CisKK3ZvaWQgQ1hGQV9GRkNvbWJvQm94OjpPblNlbGVjdENoYW5nZWQoQ0ZXTF9XaWRnZXQqIHBXaWRnZXQsIGJvb2wgYkxCdXR0b25VcCkgeworICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOworICBlUGFyYW0ubV93c1ByZXZUZXh0ID0gbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldFZhbHVlKFhGQV9WQUxVRVBJQ1RVUkVfUmF3KTsKKyAgRldMRXZlbnRTZWxDaGFuZ2UoJmVQYXJhbSk7CisgIGlmIChtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+SXNDaG9pY2VMaXN0Q29tbWl0T25TZWxlY3QoKSAmJiBiTEJ1dHRvblVwKQorICAgIG1fcERvY1ZpZXctPlNldEZvY3VzV2lkZ2V0QWNjKG51bGxwdHIpOworfQorCit2b2lkIENYRkFfRkZDb21ib0JveDo6T25QcmVPcGVuKENGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7CisgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07CisgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX1ByZU9wZW47CisgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKTsKKyAgbV9wTm9kZS0+UHJvY2Vzc0V2ZW50KEdldERvY1ZpZXcoKSwgWEZBX0F0dHJpYnV0ZUVudW06OlByZU9wZW4sICZlUGFyYW0pOworfQorCit2b2lkIENYRkFfRkZDb21ib0JveDo6T25Qb3N0T3BlbihDRldMX1dpZGdldCogcFdpZGdldCkgeworICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOworICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9Qb3N0T3BlbjsKKyAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcE5vZGUtPkdldFdpZGdldEFjYygpOworICBtX3BOb2RlLT5Qcm9jZXNzRXZlbnQoR2V0RG9jVmlldygpLCBYRkFfQXR0cmlidXRlRW51bTo6UG9zdE9wZW4sICZlUGFyYW0pOworfQorCit2b2lkIENYRkFfRkZDb21ib0JveDo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7CisgIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsKK30KKwordm9pZCBDWEZBX0ZGQ29tYm9Cb3g6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgeworICBDWEZBX0ZGRmllbGQ6Ok9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7CisgIHN3aXRjaCAocEV2ZW50LT5HZXRUeXBlKCkpIHsKKyAgICBjYXNlIENGV0xfRXZlbnQ6OlR5cGU6OlNlbGVjdENoYW5nZWQ6IHsKKyAgICAgIGF1dG8qIHBvc3RFdmVudCA9IHN0YXRpY19jYXN0PENGV0xfRXZlbnRTZWxlY3RDaGFuZ2VkKj4ocEV2ZW50KTsKKyAgICAgIE9uU2VsZWN0Q2hhbmdlZChtX3BOb3JtYWxXaWRnZXQuZ2V0KCksIHBvc3RFdmVudC0+YkxCdXR0b25VcCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBDRldMX0V2ZW50OjpUeXBlOjpFZGl0Q2hhbmdlZDogeworICAgICAgV2lkZVN0cmluZyB3c0NoYW5nZWQ7CisgICAgICBPblRleHRDaGFuZ2VkKG1fcE5vcm1hbFdpZGdldC5nZXQoKSwgd3NDaGFuZ2VkKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIENGV0xfRXZlbnQ6OlR5cGU6OlByZURyb3BEb3duOiB7CisgICAgICBPblByZU9wZW4obV9wTm9ybWFsV2lkZ2V0LmdldCgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIENGV0xfRXZlbnQ6OlR5cGU6OlBvc3REcm9wRG93bjogeworICAgICAgT25Qb3N0T3BlbihtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICBtX3BPbGREZWxlZ2F0ZS0+T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsKK30KKwordm9pZCBDWEZBX0ZGQ29tYm9Cb3g6Ok9uRHJhd1dpZGdldChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBtX3BPbGREZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBHcmFwaGljcywgbWF0cml4KTsKK30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfZmZjb21ib2JveC5oIGIveGZhL2Z4ZmEvY3hmYV9mZmNvbWJvYm94LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIwMzE5ZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZmZjb21ib2JveC5oCkBAIC0wLDAgKzEsNzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9DWEZBX0ZGQ09NQk9CT1hfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfQ1hGQV9GRkNPTUJPQk9YX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZmllbGQuaCIKKworY2xhc3MgQ1hGQV9GRkNvbWJvQm94IDogcHVibGljIENYRkFfRkZGaWVsZCB7CisgcHVibGljOgorICBleHBsaWNpdCBDWEZBX0ZGQ29tYm9Cb3goQ1hGQV9Ob2RlKiBwTm9kZSk7CisgIH5DWEZBX0ZGQ29tYm9Cb3goKSBvdmVycmlkZTsKKworICAvLyBDWEZBX0ZGRmllbGQKKyAgQ0ZYX1JlY3RGIEdldEJCb3godWludDMyX3QgZHdTdGF0dXMsIGJvb2wgYkRyYXdGb2N1cyA9IGZhbHNlKSBvdmVycmlkZTsKKyAgYm9vbCBMb2FkV2lkZ2V0KCkgb3ZlcnJpZGU7CisgIHZvaWQgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKSBvdmVycmlkZTsKKyAgYm9vbCBPblJCdXR0b25VcCh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7CisgIGJvb2wgT25LaWxsRm9jdXMoQ1hGQV9GRldpZGdldCogcE5ld1dpZGdldCkgb3ZlcnJpZGU7CisgIGJvb2wgQ2FuVW5kbygpIG92ZXJyaWRlOworICBib29sIENhblJlZG8oKSBvdmVycmlkZTsKKyAgYm9vbCBVbmRvKCkgb3ZlcnJpZGU7CisgIGJvb2wgUmVkbygpIG92ZXJyaWRlOworCisgIGJvb2wgQ2FuQ29weSgpIG92ZXJyaWRlOworICBib29sIENhbkN1dCgpIG92ZXJyaWRlOworICBib29sIENhblBhc3RlKCkgb3ZlcnJpZGU7CisgIGJvb2wgQ2FuU2VsZWN0QWxsKCkgb3ZlcnJpZGU7CisgIE9wdGlvbmFsPFdpZGVTdHJpbmc+IENvcHkoKSBvdmVycmlkZTsKKyAgT3B0aW9uYWw8V2lkZVN0cmluZz4gQ3V0KCkgb3ZlcnJpZGU7CisgIGJvb2wgUGFzdGUoY29uc3QgV2lkZVN0cmluZyYgd3NQYXN0ZSkgb3ZlcnJpZGU7CisgIHZvaWQgU2VsZWN0QWxsKCkgb3ZlcnJpZGU7CisgIHZvaWQgRGVsZXRlKCkgb3ZlcnJpZGU7CisgIHZvaWQgRGVTZWxlY3QoKSBvdmVycmlkZTsKKyAgRm9ybUZpZWxkVHlwZSBHZXRGb3JtRmllbGRUeXBlKCkgb3ZlcnJpZGU7CisKKyAgLy8gSUZXTF9XaWRnZXREZWxlZ2F0ZQorICB2b2lkIE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgb3ZlcnJpZGU7CisgIHZvaWQgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSBvdmVycmlkZTsKKyAgdm9pZCBPbkRyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIG92ZXJyaWRlOworCisgIHZpcnR1YWwgdm9pZCBPcGVuRHJvcERvd25MaXN0KCk7CisKKyAgdm9pZCBPblRleHRDaGFuZ2VkKENGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBjb25zdCBXaWRlU3RyaW5nJiB3c0NoYW5nZWQpOworICB2b2lkIE9uU2VsZWN0Q2hhbmdlZChDRldMX1dpZGdldCogcFdpZGdldCwgYm9vbCBiTEJ1dHRvblVwKTsKKyAgdm9pZCBPblByZU9wZW4oQ0ZXTF9XaWRnZXQqIHBXaWRnZXQpOworICB2b2lkIE9uUG9zdE9wZW4oQ0ZXTF9XaWRnZXQqIHBXaWRnZXQpOworICB2b2lkIFNldEl0ZW1TdGF0ZShpbnQzMl90IG5JbmRleCwgYm9vbCBiU2VsZWN0ZWQpOworICB2b2lkIEluc2VydEl0ZW0oY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzTGFiZWwsIGludDMyX3QgbkluZGV4KTsKKyAgdm9pZCBEZWxldGVJdGVtKGludDMyX3QgbkluZGV4KTsKKworIHByaXZhdGU6CisgIC8vIENYRkFfRkZGaWVsZAorICBib29sIFB0SW5BY3RpdmVSZWN0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKKyAgYm9vbCBDb21taXREYXRhKCkgb3ZlcnJpZGU7CisgIGJvb2wgVXBkYXRlRldMRGF0YSgpIG92ZXJyaWRlOworICBib29sIElzRGF0YUNoYW5nZWQoKSBvdmVycmlkZTsKKworICB1aW50MzJfdCBHZXRBbGlnbm1lbnQoKTsKKyAgdm9pZCBGV0xFdmVudFNlbENoYW5nZShDWEZBX0V2ZW50UGFyYW0qIHBQYXJhbSk7CisKKyAgV2lkZVN0cmluZyBtX3dzTmV3VmFsdWU7CisgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIG1fcE9sZERlbGVnYXRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9DWEZBX0ZGQ09NQk9CT1hfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfZmZkYXRldGltZWVkaXQuY3BwIGIveGZhL2Z4ZmEvY3hmYV9mZmRhdGV0aW1lZWRpdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZiZDA5NgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZmZkYXRldGltZWVkaXQuY3BwCkBAIC0wLDAgKzEsMjE2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZGF0ZXRpbWVlZGl0LmgiCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2RhdGV0aW1lcGlja2VyLmgiCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2V2ZW50c2VsZWN0Y2hhbmdlZC5oIgorI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9ub3RlZHJpdmVyLmgiCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3dpZGdldC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZXZlbnRwYXJhbS5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZkb2MuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGV2YWx1ZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhcmEuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWx1ZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfdXRpbHMuaCIKKworQ1hGQV9GRkRhdGVUaW1lRWRpdDo6Q1hGQV9GRkRhdGVUaW1lRWRpdChDWEZBX05vZGUqIHBOb2RlKQorICAgIDogQ1hGQV9GRlRleHRFZGl0KHBOb2RlKSB7fQorCitDWEZBX0ZGRGF0ZVRpbWVFZGl0Ojp+Q1hGQV9GRkRhdGVUaW1lRWRpdCgpIHt9CisKK0NGWF9SZWN0RiBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpHZXRCQm94KHVpbnQzMl90IGR3U3RhdHVzLCBib29sIGJEcmF3Rm9jdXMpIHsKKyAgaWYgKGJEcmF3Rm9jdXMpCisgICAgcmV0dXJuIENGWF9SZWN0RigpOworICByZXR1cm4gQ1hGQV9GRldpZGdldDo6R2V0QkJveChkd1N0YXR1cyk7Cit9CisKK2Jvb2wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6UHRJbkFjdGl2ZVJlY3QoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKKyAgYXV0byogcFBpY2tlciA9IHN0YXRpY19jYXN0PENGV0xfRGF0ZVRpbWVQaWNrZXIqPihtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpOworICByZXR1cm4gcFBpY2tlciAmJiBwUGlja2VyLT5HZXRCQm94KCkuQ29udGFpbnMocG9pbnQpOworfQorCitib29sIENYRkFfRkZEYXRlVGltZUVkaXQ6OkxvYWRXaWRnZXQoKSB7CisgIGF1dG8gcE5ld1BpY2tlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRldMX0RhdGVUaW1lUGlja2VyPihHZXRGV0xBcHAoKSk7CisgIENGV0xfRGF0ZVRpbWVQaWNrZXIqIHBXaWRnZXQgPSBwTmV3UGlja2VyLmdldCgpOworICBtX3BOb3JtYWxXaWRnZXQgPSBzdGQ6Om1vdmUocE5ld1BpY2tlcik7CisgIG1fcE5vcm1hbFdpZGdldC0+U2V0TGF5b3V0SXRlbSh0aGlzKTsKKworICBDRldMX05vdGVEcml2ZXIqIHBOb3RlRHJpdmVyID0KKyAgICAgIG1fcE5vcm1hbFdpZGdldC0+R2V0T3duZXJBcHAoKS0+R2V0Tm90ZURyaXZlcigpOworICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChtX3BOb3JtYWxXaWRnZXQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE5vcm1hbFdpZGdldC5nZXQoKSk7CisgIG1fcE9sZERlbGVnYXRlID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXREZWxlZ2F0ZSgpOworICBtX3BOb3JtYWxXaWRnZXQtPlNldERlbGVnYXRlKHRoaXMpOworICBtX3BOb3JtYWxXaWRnZXQtPkxvY2tVcGRhdGUoKTsKKworICBXaWRlU3RyaW5nIHdzVGV4dCA9CisgICAgICBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0VmFsdWUoWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsKKyAgcFdpZGdldC0+U2V0RWRpdFRleHQod3NUZXh0KTsKKworICBDWEZBX1ZhbHVlKiB2YWx1ZSA9IG1fcE5vZGUtPkdldEZvcm1WYWx1ZUlmRXhpc3RzKCk7CisgIGlmICh2YWx1ZSkgeworICAgIHN3aXRjaCAodmFsdWUtPkdldENoaWxkVmFsdWVDbGFzc0lEKCkpIHsKKyAgICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRhdGU6IHsKKyAgICAgICAgaWYgKCF3c1RleHQuSXNFbXB0eSgpKSB7CisgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSBsY1ZhbHVlID0gWEZBX0dldExvY2FsZVZhbHVlKG1fcE5vZGUuR2V0KCkpOworICAgICAgICAgIENGWF9EYXRlVGltZSBkYXRlID0gbGNWYWx1ZS5HZXREYXRlKCk7CisgICAgICAgICAgaWYgKGRhdGUuSXNTZXQoKSkKKyAgICAgICAgICAgIHBXaWRnZXQtPlNldEN1clNlbChkYXRlLkdldFllYXIoKSwgZGF0ZS5HZXRNb250aCgpLCBkYXRlLkdldERheSgpKTsKKyAgICAgICAgfQorICAgICAgfSBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOworICBtX3BOb3JtYWxXaWRnZXQtPlVubG9ja1VwZGF0ZSgpOworICByZXR1cm4gQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCk7Cit9CisKK3ZvaWQgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6VXBkYXRlV2lkZ2V0UHJvcGVydHkoKSB7CisgIENGV0xfRGF0ZVRpbWVQaWNrZXIqIHBXaWRnZXQgPQorICAgICAgc3RhdGljX2Nhc3Q8Q0ZXTF9EYXRlVGltZVBpY2tlcio+KG1fcE5vcm1hbFdpZGdldC5nZXQoKSk7CisgIGlmICghcFdpZGdldCkKKyAgICByZXR1cm47CisKKyAgdWludDMyX3QgZHdFeHRlbmRlZFN0eWxlID0gRldMX1NUWUxFRVhUX0RUUF9TaG9ydERhdGVGb3JtYXQ7CisgIGR3RXh0ZW5kZWRTdHlsZSB8PSBVcGRhdGVVSVByb3BlcnR5KCk7CisgIGR3RXh0ZW5kZWRTdHlsZSB8PSBHZXRBbGlnbm1lbnQoKTsKKyAgbV9wTm9ybWFsV2lkZ2V0LT5Nb2RpZnlTdHlsZXNFeChkd0V4dGVuZGVkU3R5bGUsIDB4RkZGRkZGRkYpOworCisgIHVpbnQzMl90IGR3RWRpdFN0eWxlcyA9IDA7CisgIE9wdGlvbmFsPGludDMyX3Q+IG51bUNlbGxzID0gbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldE51bWJlck9mQ2VsbHMoKTsKKyAgaWYgKG51bUNlbGxzICYmICpudW1DZWxscyA+IDApIHsKKyAgICBkd0VkaXRTdHlsZXMgfD0gRldMX1NUWUxFRVhUX0VEVF9Db21iVGV4dDsKKyAgICBwV2lkZ2V0LT5TZXRFZGl0TGltaXQoKm51bUNlbGxzKTsKKyAgfQorICBpZiAoIW1fcE5vZGUtPklzT3BlbkFjY2VzcygpIHx8ICFHZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkKKyAgICBkd0VkaXRTdHlsZXMgfD0gRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seTsKKyAgaWYgKCFtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+SXNIb3Jpem9udGFsU2Nyb2xsUG9saWN5T2ZmKCkpCisgICAgZHdFZGl0U3R5bGVzIHw9IEZXTF9TVFlMRUVYVF9FRFRfQXV0b0hTY3JvbGw7CisKKyAgcFdpZGdldC0+TW9kaWZ5RWRpdFN0eWxlc0V4KGR3RWRpdFN0eWxlcywgMHhGRkZGRkZGRik7Cit9CisKK3VpbnQzMl90IENYRkFfRkZEYXRlVGltZUVkaXQ6OkdldEFsaWdubWVudCgpIHsKKyAgQ1hGQV9QYXJhKiBwYXJhID0gbV9wTm9kZS0+R2V0UGFyYUlmRXhpc3RzKCk7CisgIGlmICghcGFyYSkKKyAgICByZXR1cm4gMDsKKworICB1aW50MzJfdCBkd0V4dGVuZGVkU3R5bGUgPSAwOworICBzd2l0Y2ggKHBhcmEtPkdldEhvcml6b250YWxBbGlnbigpKSB7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6Q2VudGVyOgorICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9EVFBfRWRpdEhDZW50ZXI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpKdXN0aWZ5OgorICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9EVFBfRWRpdEp1c3RpZmllZDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06Okp1c3RpZnlBbGw6CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6UmFkaXg6CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpSaWdodDoKKyAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRIRmFyOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRITmVhcjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgc3dpdGNoIChwYXJhLT5HZXRWZXJ0aWNhbEFsaWduKCkpIHsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpNaWRkbGU6CisgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0RUUF9FZGl0VkNlbnRlcjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkJvdHRvbToKKyAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRWRmFyOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRFRQX0VkaXRWTmVhcjsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBkd0V4dGVuZGVkU3R5bGU7Cit9CisKK2Jvb2wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6Q29tbWl0RGF0YSgpIHsKKyAgYXV0byogcFBpY2tlciA9IHN0YXRpY19jYXN0PENGV0xfRGF0ZVRpbWVQaWNrZXIqPihtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpOworICBpZiAoIW1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5TZXRWYWx1ZShYRkFfVkFMVUVQSUNUVVJFX0VkaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQaWNrZXItPkdldEVkaXRUZXh0KCkpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPlVwZGF0ZVVJRGlzcGxheShHZXREb2MoKS0+R2V0RG9jVmlldygpLCB0aGlzKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1hGQV9GRkRhdGVUaW1lRWRpdDo6VXBkYXRlRldMRGF0YSgpIHsKKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIFhGQV9WQUxVRVBJQ1RVUkUgZVR5cGUgPSBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXk7CisgIGlmIChJc0ZvY3VzZWQoKSkKKyAgICBlVHlwZSA9IFhGQV9WQUxVRVBJQ1RVUkVfRWRpdDsKKworICBXaWRlU3RyaW5nIHdzVGV4dCA9IG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRWYWx1ZShlVHlwZSk7CisgIGF1dG8qIG5vcm1hbFdpZGdldCA9IHN0YXRpY19jYXN0PENGV0xfRGF0ZVRpbWVQaWNrZXIqPihtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpOworICBub3JtYWxXaWRnZXQtPlNldEVkaXRUZXh0KHdzVGV4dCk7CisgIGlmIChJc0ZvY3VzZWQoKSAmJiAhd3NUZXh0LklzRW1wdHkoKSkgeworICAgIENYRkFfTG9jYWxlVmFsdWUgbGNWYWx1ZSA9IFhGQV9HZXRMb2NhbGVWYWx1ZShtX3BOb2RlLkdldCgpKTsKKyAgICBDRlhfRGF0ZVRpbWUgZGF0ZSA9IGxjVmFsdWUuR2V0RGF0ZSgpOworICAgIGlmIChsY1ZhbHVlLklzVmFsaWQoKSkgeworICAgICAgaWYgKGRhdGUuSXNTZXQoKSkKKyAgICAgICAgbm9ybWFsV2lkZ2V0LT5TZXRDdXJTZWwoZGF0ZS5HZXRZZWFyKCksIGRhdGUuR2V0TW9udGgoKSwgZGF0ZS5HZXREYXkoKSk7CisgICAgfQorICB9CisgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENYRkFfRkZEYXRlVGltZUVkaXQ6OklzRGF0YUNoYW5nZWQoKSB7CisgIGlmIChtX2R3U3RhdHVzICYgWEZBX1dpZGdldFN0YXR1c19UZXh0RWRpdFZhbHVlQ2hhbmdlZCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBXaWRlU3RyaW5nIHdzVGV4dCA9CisgICAgICBzdGF0aWNfY2FzdDxDRldMX0RhdGVUaW1lUGlja2VyKj4obV9wTm9ybWFsV2lkZ2V0LmdldCgpKS0+R2V0RWRpdFRleHQoKTsKKyAgcmV0dXJuIG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRWYWx1ZShYRkFfVkFMVUVQSUNUVVJFX0VkaXQpICE9IHdzVGV4dDsKK30KKwordm9pZCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpPblNlbGVjdENoYW5nZWQoQ0ZXTF9XaWRnZXQqIHBXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlZZWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTW9udGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlEYXkpIHsKKyAgV2lkZVN0cmluZyB3c1BpY3R1cmUgPQorICAgICAgbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldFBpY3R1cmVDb250ZW50KFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCk7CisKKyAgQ1hGQV9Mb2NhbGVWYWx1ZSBkYXRlKFhGQV9WVF9EQVRFLCBHZXREb2MoKS0+R2V0WEZBRG9jKCktPkdldExvY2FsTWdyKCkpOworICBkYXRlLlNldERhdGUoQ0ZYX0RhdGVUaW1lKGlZZWFyLCBpTW9udGgsIGlEYXksIDAsIDAsIDAsIDApKTsKKworICBXaWRlU3RyaW5nIHdzRGF0ZTsKKyAgZGF0ZS5Gb3JtYXRQYXR0ZXJucyh3c0RhdGUsIHdzUGljdHVyZSwgbV9wTm9kZS0+R2V0TG9jYWxlKCksCisgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRV9FZGl0KTsKKworICBhdXRvKiBwRGF0ZVRpbWUgPSBzdGF0aWNfY2FzdDxDRldMX0RhdGVUaW1lUGlja2VyKj4obV9wTm9ybWFsV2lkZ2V0LmdldCgpKTsKKyAgcERhdGVUaW1lLT5TZXRFZGl0VGV4dCh3c0RhdGUpOworICBwRGF0ZVRpbWUtPlVwZGF0ZSgpOworICBHZXREb2MoKS0+R2V0RG9jRW52aXJvbm1lbnQoKS0+U2V0Rm9jdXNXaWRnZXQoR2V0RG9jKCksIG51bGxwdHIpOworCisgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07CisgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX0NoYW5nZTsKKyAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcE5vZGUtPkdldFdpZGdldEFjYygpOworICBlUGFyYW0ubV93c05ld1RleHQgPSBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0VmFsdWUoWEZBX1ZBTFVFUElDVFVSRV9SYXcpOworICBtX3BOb2RlLT5Qcm9jZXNzRXZlbnQoR2V0RG9jVmlldygpLCBYRkFfQXR0cmlidXRlRW51bTo6Q2hhbmdlLCAmZVBhcmFtKTsKK30KKwordm9pZCBDWEZBX0ZGRGF0ZVRpbWVFZGl0OjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsKKyAgaWYgKHBFdmVudC0+R2V0VHlwZSgpID09IENGV0xfRXZlbnQ6OlR5cGU6OlNlbGVjdENoYW5nZWQpIHsKKyAgICBhdXRvKiBldmVudCA9IHN0YXRpY19jYXN0PENGV0xfRXZlbnRTZWxlY3RDaGFuZ2VkKj4ocEV2ZW50KTsKKyAgICBPblNlbGVjdENoYW5nZWQobV9wTm9ybWFsV2lkZ2V0LmdldCgpLCBldmVudC0+aVllYXIsIGV2ZW50LT5pTW9udGgsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50LT5pRGF5KTsKKyAgICByZXR1cm47CisgIH0KKyAgQ1hGQV9GRlRleHRFZGl0OjpPblByb2Nlc3NFdmVudChwRXZlbnQpOworfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZmRhdGV0aW1lZWRpdC5oIGIveGZhL2Z4ZmEvY3hmYV9mZmRhdGV0aW1lZWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NDljYmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2ZmZGF0ZXRpbWVlZGl0LmgKQEAgLTAsMCArMSw0NyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX0NYRkFfRkZEQVRFVElNRUVESVRfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfQ1hGQV9GRkRBVEVUSU1FRURJVF9IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZ0ZXh0ZWRpdC5oIgorCitlbnVtIFhGQV9EQVRFVElNRVRZUEUgeworICBYRkFfREFURVRJTUVUWVBFX0RhdGUgPSAwLAorICBYRkFfREFURVRJTUVUWVBFX1RpbWUsCisgIFhGQV9EQVRFVElNRVRZUEVfRGF0ZUFuZFRpbWUKK307CisKK2NsYXNzIENGV0xfRXZlbnQ7CitjbGFzcyBDRldMX1dpZGdldDsKKworY2xhc3MgQ1hGQV9GRkRhdGVUaW1lRWRpdCA6IHB1YmxpYyBDWEZBX0ZGVGV4dEVkaXQgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1hGQV9GRkRhdGVUaW1lRWRpdChDWEZBX05vZGUqIHBOb2RlKTsKKyAgfkNYRkFfRkZEYXRlVGltZUVkaXQoKSBvdmVycmlkZTsKKworICAvLyBDWEZBX0ZGVGV4dEVkaXQKKyAgQ0ZYX1JlY3RGIEdldEJCb3godWludDMyX3QgZHdTdGF0dXMsIGJvb2wgYkRyYXdGb2N1cyA9IGZhbHNlKSBvdmVycmlkZTsKKyAgYm9vbCBMb2FkV2lkZ2V0KCkgb3ZlcnJpZGU7CisgIHZvaWQgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKSBvdmVycmlkZTsKKyAgdm9pZCBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIG92ZXJyaWRlOworCisgIHZvaWQgT25TZWxlY3RDaGFuZ2VkKENGV0xfV2lkZ2V0KiBwV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlZZWFyLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlNb250aCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGF5KTsKKworIHByaXZhdGU6CisgIGJvb2wgUHRJbkFjdGl2ZVJlY3QoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOworICBib29sIENvbW1pdERhdGEoKSBvdmVycmlkZTsKKyAgYm9vbCBVcGRhdGVGV0xEYXRhKCkgb3ZlcnJpZGU7CisgIGJvb2wgSXNEYXRhQ2hhbmdlZCgpIG92ZXJyaWRlOworCisgIHVpbnQzMl90IEdldEFsaWdubWVudCgpOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9DWEZBX0ZGREFURVRJTUVFRElUX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX2ZmZG9jLmNwcCBiL3hmYS9meGZhL2N4ZmFfZmZkb2MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZmE3OGUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2ZmZG9jLmNwcApAQCAtMCwwICsxLDQxNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRvYy5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfYXJyYXkuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZG9jdW1lbnQuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2ZwZGZfcGFyc2VyX2RlY29kZS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmRvYy9jcGRmX25hbWV0cmVlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfY2hlY2tzdW1jb250ZXh0LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfbWVtb3J5c3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfc2Vla2FibGVtdWx0aXN0cmVhbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9tZW1vcnkuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sZWxlbWVudC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWxub2RlLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X29iamVjdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfbm90ZWRyaXZlci5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZhcHAuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZG9jdmlldy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZub3RpZnkuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mb250bWdyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWNyb2JhdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2Fjcm9iYXQ3LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YWV4cG9ydGVyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YWltcG9ydGVyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9keW5hbWljcmVuZGVyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCituYW1lc3BhY2UgeworCitzdHJ1Y3QgRlhfQkFTRTY0REFUQSB7CisgIHVpbnQzMl90IGRhdGExIDogMjsKKyAgdWludDMyX3QgZGF0YTIgOiA2OworICB1aW50MzJfdCBkYXRhMyA6IDQ7CisgIHVpbnQzMl90IGRhdGE0IDogNDsKKyAgdWludDMyX3QgZGF0YTUgOiA2OworICB1aW50MzJfdCBkYXRhNiA6IDI7CisgIHVpbnQzMl90IGRhdGE3IDogODsKK307CisKK2NvbnN0IHVpbnQ4X3Qga1N0YXJ0VmFsdWVzUmVtb3ZlZCA9IDQzOworY29uc3QgdWludDhfdCBrRGVjb2Rlck1hcFNpemUgPSA4MDsKK2NvbnN0IHVpbnQ4X3QgZ19GWEJhc2U2NERlY29kZXJNYXBba0RlY29kZXJNYXBTaXplXSA9IHsKKyAgICAweDNFLCAweEZGLCAweEZGLCAweEZGLCAweDNGLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNBLAorICAgIDB4M0IsIDB4M0MsIDB4M0QsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDEsCisgICAgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwQSwgMHgwQiwgMHgwQywgMHgwRCwKKyAgICAweDBFLCAweDBGLCAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LAorICAgIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MUEsIDB4MUIsIDB4MUMsIDB4MUQsIDB4MUUsIDB4MUYsCisgICAgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyQSwgMHgyQiwKKyAgICAweDJDLCAweDJELCAweDJFLCAweDJGLCAweDMwLCAweDMxLCAweDMyLCAweDMzLAorfTsKKwordWludDhfdCBiYXNlNjREZWNvZGVyVmFsdWUodWludDhfdCB2YWwpIHsKKyAgaWYgKHZhbCA8IGtTdGFydFZhbHVlc1JlbW92ZWQgfHwgdmFsID49IGtTdGFydFZhbHVlc1JlbW92ZWQgKyBrRGVjb2Rlck1hcFNpemUpCisgICAgcmV0dXJuIDB4RkY7CisgIHJldHVybiBnX0ZYQmFzZTY0RGVjb2Rlck1hcFt2YWwgLSBrU3RhcnRWYWx1ZXNSZW1vdmVkXTsKK30KKwordm9pZCBCYXNlNjREZWNvZGVQaWVjZShjb25zdCBjaGFyIHNyY1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ2hhcnMsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0JBU0U2NERBVEEmIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUJ5dGVzKSB7CisgIEFTU0VSVChpQ2hhcnMgPiAwICYmIGlDaGFycyA8IDUpOworICBpQnl0ZXMgPSAxOworICBkc3QuZGF0YTIgPSBiYXNlNjREZWNvZGVyVmFsdWUoc3RhdGljX2Nhc3Q8dWludDhfdD4oc3JjWzBdKSk7CisgIGlmIChpQ2hhcnMgPiAxKSB7CisgICAgdWludDhfdCBiID0gYmFzZTY0RGVjb2RlclZhbHVlKHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHNyY1sxXSkpOworICAgIGRzdC5kYXRhMSA9IGIgPj4gNDsKKyAgICBkc3QuZGF0YTQgPSBiOworICAgIGlmIChpQ2hhcnMgPiAyKSB7CisgICAgICBpQnl0ZXMgPSAyOworICAgICAgYiA9IGJhc2U2NERlY29kZXJWYWx1ZShzdGF0aWNfY2FzdDx1aW50OF90PihzcmNbMl0pKTsKKyAgICAgIGRzdC5kYXRhMyA9IGIgPj4gMjsKKyAgICAgIGRzdC5kYXRhNiA9IGI7CisgICAgICBpZiAoaUNoYXJzID4gMykgeworICAgICAgICBpQnl0ZXMgPSAzOworICAgICAgICBkc3QuZGF0YTUgPSBiYXNlNjREZWNvZGVyVmFsdWUoc3RhdGljX2Nhc3Q8dWludDhfdD4oc3JjWzNdKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkc3QuZGF0YTUgPSAwOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBkc3QuZGF0YTMgPSAwOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBkc3QuZGF0YTEgPSAwOworICB9Cit9CisKK2ludDMyX3QgQmFzZTY0RGVjb2RlVyhjb25zdCB3Y2hhcl90KiBwU3JjLCBpbnQzMl90IGlTcmNMZW4sIHVpbnQ4X3QqIHBEc3QpIHsKKyAgQVNTRVJUKHBTcmMpOworICBpZiAoaVNyY0xlbiA8IDEpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICB3aGlsZSAoaVNyY0xlbiA+IDAgJiYgcFNyY1tpU3JjTGVuIC0gMV0gPT0gJz0nKSB7CisgICAgaVNyY0xlbi0tOworICB9CisgIGlmIChpU3JjTGVuIDwgMSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmICghcERzdCkgeworICAgIGludDMyX3QgaURzdExlbiA9IGlTcmNMZW4gLyA0ICogMzsKKyAgICBpU3JjTGVuICU9IDQ7CisgICAgaWYgKGlTcmNMZW4gPT0gMSkgeworICAgICAgaURzdExlbiArPSAxOworICAgIH0gZWxzZSBpZiAoaVNyY0xlbiA9PSAyKSB7CisgICAgICBpRHN0TGVuICs9IDE7CisgICAgfSBlbHNlIGlmIChpU3JjTGVuID09IDMpIHsKKyAgICAgIGlEc3RMZW4gKz0gMjsKKyAgICB9CisgICAgcmV0dXJuIGlEc3RMZW47CisgIH0KKyAgY2hhciBzcmNEYXRhWzRdOworICBGWF9CQVNFNjREQVRBIGRzdERhdGE7CisgIGludDMyX3QgaUNoYXJzID0gNCwgaUJ5dGVzOworICB1aW50OF90KiBwRHN0RW5kID0gcERzdDsKKyAgd2hpbGUgKGlTcmNMZW4gPiAwKSB7CisgICAgaWYgKGlTcmNMZW4gPiAzKSB7CisgICAgICBzcmNEYXRhWzBdID0gKGNoYXIpKnBTcmMrKzsKKyAgICAgIHNyY0RhdGFbMV0gPSAoY2hhcikqcFNyYysrOworICAgICAgc3JjRGF0YVsyXSA9IChjaGFyKSpwU3JjKys7CisgICAgICBzcmNEYXRhWzNdID0gKGNoYXIpKnBTcmMrKzsKKyAgICAgIGlTcmNMZW4gLT0gNDsKKyAgICB9IGVsc2UgeworICAgICAgKigodWludDMyX3QqKSZkc3REYXRhKSA9IDA7CisgICAgICAqKCh1aW50MzJfdCopc3JjRGF0YSkgPSAwOworICAgICAgc3JjRGF0YVswXSA9IChjaGFyKSpwU3JjKys7CisgICAgICBpZiAoaVNyY0xlbiA+IDEpIHsKKyAgICAgICAgc3JjRGF0YVsxXSA9IChjaGFyKSpwU3JjKys7CisgICAgICB9CisgICAgICBpZiAoaVNyY0xlbiA+IDIpIHsKKyAgICAgICAgc3JjRGF0YVsyXSA9IChjaGFyKSpwU3JjKys7CisgICAgICB9CisgICAgICBpQ2hhcnMgPSBpU3JjTGVuOworICAgICAgaVNyY0xlbiA9IDA7CisgICAgfQorICAgIEJhc2U2NERlY29kZVBpZWNlKHNyY0RhdGEsIGlDaGFycywgZHN0RGF0YSwgaUJ5dGVzKTsKKyAgICAqcERzdEVuZCsrID0gKCh1aW50OF90KikmZHN0RGF0YSlbMF07CisgICAgaWYgKGlCeXRlcyA+IDEpIHsKKyAgICAgICpwRHN0RW5kKysgPSAoKHVpbnQ4X3QqKSZkc3REYXRhKVsxXTsKKyAgICB9CisgICAgaWYgKGlCeXRlcyA+IDIpIHsKKyAgICAgICpwRHN0RW5kKysgPSAoKHVpbnQ4X3QqKSZkc3REYXRhKVsyXTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHBEc3RFbmQgLSBwRHN0OworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9GRkRvYzo6Q1hGQV9GRkRvYyhDWEZBX0ZGQXBwKiBwQXBwLCBJWEZBX0RvY0Vudmlyb25tZW50KiBwRG9jRW52aXJvbm1lbnQpCisgICAgOiBtX3BEb2NFbnZpcm9ubWVudChwRG9jRW52aXJvbm1lbnQpLCBtX3BBcHAocEFwcCkge30KKworQ1hGQV9GRkRvYzo6fkNYRkFfRkZEb2MoKSB7CisgIENsb3NlRG9jKCk7Cit9CisKK2ludDMyX3QgQ1hGQV9GRkRvYzo6U3RhcnRMb2FkKCkgeworICBtX3BOb3RpZnkgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GRk5vdGlmeT4odGhpcyk7CisgIG1fcERvY3VtZW50UGFyc2VyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRG9jdW1lbnRQYXJzZXI+KG1fcE5vdGlmeS5nZXQoKSk7CisgIHJldHVybiBtX3BEb2N1bWVudFBhcnNlci0+U3RhcnRQYXJzZShtX3BTdHJlYW0sIFhGQV9QYWNrZXRUeXBlOjpYZHApOworfQorCitib29sIFhGQV9HZXRQREZDb250ZW50c0Zyb21QREZYTUwoQ0ZYX1hNTE5vZGUqIHBQREZFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqJiBwQnl0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpQnVmZmVyU2l6ZSkgeworICBDRlhfWE1MRWxlbWVudCogcERvY3VtZW50RWxlbWVudCA9IG51bGxwdHI7CisgIGZvciAoQ0ZYX1hNTE5vZGUqIHBYTUxOb2RlID0KKyAgICAgICAgICAgcFBERkVsZW1lbnQtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpGaXJzdENoaWxkKTsKKyAgICAgICBwWE1MTm9kZTsgcFhNTE5vZGUgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZYX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgeworICAgIGlmIChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZYX1hNTE5PREVfRWxlbWVudCkgeworICAgICAgQ0ZYX1hNTEVsZW1lbnQqIHBYTUxFbGVtZW50ID0gc3RhdGljX2Nhc3Q8Q0ZYX1hNTEVsZW1lbnQqPihwWE1MTm9kZSk7CisgICAgICBXaWRlU3RyaW5nIHdzVGFnTmFtZSA9IHBYTUxFbGVtZW50LT5HZXROYW1lKCk7CisgICAgICBpZiAod3NUYWdOYW1lID09IEwiZG9jdW1lbnQiKSB7CisgICAgICAgIHBEb2N1bWVudEVsZW1lbnQgPSBwWE1MRWxlbWVudDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIGlmICghcERvY3VtZW50RWxlbWVudCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBDRlhfWE1MRWxlbWVudCogcENodW5rRWxlbWVudCA9IG51bGxwdHI7CisgIGZvciAoQ0ZYX1hNTE5vZGUqIHBYTUxOb2RlID0KKyAgICAgICAgICAgcERvY3VtZW50RWxlbWVudC0+R2V0Tm9kZUl0ZW0oQ0ZYX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOworICAgICAgIHBYTUxOb2RlOyBwWE1MTm9kZSA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShDRlhfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7CisgICAgaWYgKHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRlhfWE1MTk9ERV9FbGVtZW50KSB7CisgICAgICBDRlhfWE1MRWxlbWVudCogcFhNTEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxDRlhfWE1MRWxlbWVudCo+KHBYTUxOb2RlKTsKKyAgICAgIFdpZGVTdHJpbmcgd3NUYWdOYW1lID0gcFhNTEVsZW1lbnQtPkdldE5hbWUoKTsKKyAgICAgIGlmICh3c1RhZ05hbWUgPT0gTCJjaHVuayIpIHsKKyAgICAgICAgcENodW5rRWxlbWVudCA9IHBYTUxFbGVtZW50OworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKCFwQ2h1bmtFbGVtZW50KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIFdpZGVTdHJpbmcgd3NQREZDb250ZW50ID0gcENodW5rRWxlbWVudC0+R2V0VGV4dERhdGEoKTsKKyAgaUJ1ZmZlclNpemUgPQorICAgICAgQmFzZTY0RGVjb2RlVyh3c1BERkNvbnRlbnQuY19zdHIoKSwgd3NQREZDb250ZW50LkdldExlbmd0aCgpLCBudWxscHRyKTsKKyAgcEJ5dGVCdWZmZXIgPSBGWF9BbGxvYyh1aW50OF90LCBpQnVmZmVyU2l6ZSArIDEpOworICBwQnl0ZUJ1ZmZlcltpQnVmZmVyU2l6ZV0gPSAnMCc7ICAvLyBGSVhNRTogSSBiZXQgdGhpcyBpcyB3cm9uZy4KKyAgQmFzZTY0RGVjb2RlVyh3c1BERkNvbnRlbnQuY19zdHIoKSwgd3NQREZDb250ZW50LkdldExlbmd0aCgpLCBwQnl0ZUJ1ZmZlcik7CisgIHJldHVybiB0cnVlOworfQordm9pZCBYRkFfWFBEUGFja2V0X01lcmdlUm9vdE5vZGUoQ1hGQV9Ob2RlKiBwT3JpZ2luUm9vdCwgQ1hGQV9Ob2RlKiBwTmV3Um9vdCkgeworICBDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwTmV3Um9vdC0+R2V0Rmlyc3RDaGlsZCgpOworICB3aGlsZSAocENoaWxkTm9kZSkgeworICAgIENYRkFfTm9kZSogcE9yaWdpbkNoaWxkID0KKyAgICAgICAgcE9yaWdpblJvb3QtPkdldEZpcnN0Q2hpbGRCeU5hbWUocENoaWxkTm9kZS0+R2V0TmFtZUhhc2goKSk7CisgICAgaWYgKHBPcmlnaW5DaGlsZCkgeworICAgICAgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5leHRTaWJsaW5nKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIENYRkFfTm9kZSogcE5leHRTaWJsaW5nID0gcENoaWxkTm9kZS0+R2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgIHBOZXdSb290LT5SZW1vdmVDaGlsZChwQ2hpbGROb2RlLCB0cnVlKTsKKyAgICAgIHBPcmlnaW5Sb290LT5JbnNlcnRDaGlsZChwQ2hpbGROb2RlLCBudWxscHRyKTsKKyAgICAgIHBDaGlsZE5vZGUgPSBwTmV4dFNpYmxpbmc7CisgICAgICBwTmV4dFNpYmxpbmcgPSBudWxscHRyOworICAgIH0KKyAgfQorfQorCitpbnQzMl90IENYRkFfRkZEb2M6OkRvTG9hZCgpIHsKKyAgaW50MzJfdCBpU3RhdHVzID0gbV9wRG9jdW1lbnRQYXJzZXItPkRvUGFyc2UoKTsKKyAgaWYgKGlTdGF0dXMgPT0gWEZBX1BBUlNFU1RBVFVTX0RvbmUgJiYgIW1fcFBERkRvYykKKyAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1N5bnRheEVycjsKKyAgcmV0dXJuIGlTdGF0dXM7Cit9CisKK3ZvaWQgQ1hGQV9GRkRvYzo6U3RvcExvYWQoKSB7CisgIG1fcFBERkZvbnRNZ3IgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZHQVNfUERGRm9udE1ncj4oCisgICAgICBHZXRQREZEb2MoKSwgR2V0QXBwKCktPkdldEZERUZvbnRNZ3IoKSk7CisKKyAgbV9Gb3JtVHlwZSA9IEZvcm1UeXBlOjprWEZBRm9yZWdyb3VuZDsKKyAgQ1hGQV9Ob2RlKiBwQ29uZmlnID0gVG9Ob2RlKAorICAgICAgbV9wRG9jdW1lbnRQYXJzZXItPkdldERvY3VtZW50KCktPkdldFhGQU9iamVjdChYRkFfSEFTSENPREVfQ29uZmlnKSk7CisgIGlmICghcENvbmZpZykKKyAgICByZXR1cm47CisKKyAgQ1hGQV9BY3JvYmF0KiBwQWNyb2JhdCA9CisgICAgICBwQ29uZmlnLT5HZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX0Fjcm9iYXQ+KFhGQV9FbGVtZW50OjpBY3JvYmF0KTsKKyAgaWYgKCFwQWNyb2JhdCkKKyAgICByZXR1cm47CisKKyAgQ1hGQV9BY3JvYmF0NyogcEFjcm9iYXQ3ID0KKyAgICAgIHBBY3JvYmF0LT5HZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX0Fjcm9iYXQ3PihYRkFfRWxlbWVudDo6QWNyb2JhdDcpOworICBpZiAoIXBBY3JvYmF0NykKKyAgICByZXR1cm47CisKKyAgQ1hGQV9EeW5hbWljUmVuZGVyKiBwRHluYW1pY1JlbmRlciA9CisgICAgICBwQWNyb2JhdDctPkdldEZpcnN0Q2hpbGRCeUNsYXNzPENYRkFfRHluYW1pY1JlbmRlcj4oCisgICAgICAgICAgWEZBX0VsZW1lbnQ6OkR5bmFtaWNSZW5kZXIpOworICBpZiAoIXBEeW5hbWljUmVuZGVyKQorICAgIHJldHVybjsKKworICBXaWRlU3RyaW5nIHdzVHlwZSA9IHBEeW5hbWljUmVuZGVyLT5KU09iamVjdCgpLT5HZXRDb250ZW50KGZhbHNlKTsKKyAgaWYgKHdzVHlwZSA9PSBMInJlcXVpcmVkIikKKyAgICBtX0Zvcm1UeXBlID0gRm9ybVR5cGU6OmtYRkFGdWxsOworfQorCitDWEZBX0ZGRG9jVmlldyogQ1hGQV9GRkRvYzo6Q3JlYXRlRG9jVmlldygpIHsKKyAgaWYgKCFtX0RvY1ZpZXcpCisgICAgbV9Eb2NWaWV3ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRkZEb2NWaWV3Pih0aGlzKTsKKworICByZXR1cm4gbV9Eb2NWaWV3LmdldCgpOworfQorCitDWEZBX0ZGRG9jVmlldyogQ1hGQV9GRkRvYzo6R2V0RG9jVmlldyhDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dCkgeworICByZXR1cm4gbV9Eb2NWaWV3ICYmIG1fRG9jVmlldy0+R2V0WEZBTGF5b3V0KCkgPT0gcExheW91dCA/IG1fRG9jVmlldy5nZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHI7Cit9CisKK0NYRkFfRkZEb2NWaWV3KiBDWEZBX0ZGRG9jOjpHZXREb2NWaWV3KCkgeworICByZXR1cm4gbV9Eb2NWaWV3LmdldCgpOworfQorCitib29sIENYRkFfRkZEb2M6Ok9wZW5Eb2MoQ1BERl9Eb2N1bWVudCogcFBERkRvYykgeworICBpZiAoIXBQREZEb2MpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBwUERGRG9jLT5HZXRSb290KCk7CisgIGlmICghcFJvb3QpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENQREZfRGljdGlvbmFyeSogcEFjcm9Gb3JtID0gcFJvb3QtPkdldERpY3RGb3IoIkFjcm9Gb3JtIik7CisgIGlmICghcEFjcm9Gb3JtKQorICAgIHJldHVybiBmYWxzZTsKKworICBDUERGX09iamVjdCogcEVsZW1lbnRYRkEgPSBwQWNyb0Zvcm0tPkdldERpcmVjdE9iamVjdEZvcigiWEZBIik7CisgIGlmICghcEVsZW1lbnRYRkEpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHN0ZDo6dmVjdG9yPENQREZfU3RyZWFtKj4geGZhU3RyZWFtczsKKyAgaWYgKHBFbGVtZW50WEZBLT5Jc0FycmF5KCkpIHsKKyAgICBDUERGX0FycmF5KiBwWEZBQXJyYXkgPSAoQ1BERl9BcnJheSopcEVsZW1lbnRYRkE7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwWEZBQXJyYXktPkdldENvdW50KCkgLyAyOyBpKyspIHsKKyAgICAgIGlmIChDUERGX1N0cmVhbSogcFN0cmVhbSA9IHBYRkFBcnJheS0+R2V0U3RyZWFtQXQoaSAqIDIgKyAxKSkKKyAgICAgICAgeGZhU3RyZWFtcy5wdXNoX2JhY2socFN0cmVhbSk7CisgICAgfQorICB9IGVsc2UgaWYgKHBFbGVtZW50WEZBLT5Jc1N0cmVhbSgpKSB7CisgICAgeGZhU3RyZWFtcy5wdXNoX2JhY2soKENQREZfU3RyZWFtKilwRWxlbWVudFhGQSk7CisgIH0KKyAgaWYgKHhmYVN0cmVhbXMuZW1wdHkoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbV9wUERGRG9jID0gcFBERkRvYzsKKyAgbV9wU3RyZWFtID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9TZWVrYWJsZU11bHRpU3RyZWFtPih4ZmFTdHJlYW1zKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ1hGQV9GRkRvYzo6Q2xvc2VEb2MoKSB7CisgIGlmIChtX0RvY1ZpZXcpIHsKKyAgICBtX0RvY1ZpZXctPlJ1bkRvY0Nsb3NlKCk7CisgICAgbV9Eb2NWaWV3LnJlc2V0KCk7CisgIH0KKyAgQ1hGQV9Eb2N1bWVudCogZG9jID0KKyAgICAgIG1fcERvY3VtZW50UGFyc2VyID8gbV9wRG9jdW1lbnRQYXJzZXItPkdldERvY3VtZW50KCkgOiBudWxscHRyOworICBpZiAoZG9jKQorICAgIGRvYy0+Q2xlYXJMYXlvdXREYXRhKCk7CisKKyAgbV9wRG9jdW1lbnRQYXJzZXIucmVzZXQoKTsKKyAgbV9wTm90aWZ5LnJlc2V0KCk7CisgIG1fcFBERkZvbnRNZ3IucmVzZXQoKTsKKyAgbV9IYXNoVG9EaWJEcGlNYXAuY2xlYXIoKTsKKyAgbV9wQXBwLT5DbGVhckV2ZW50VGFyZ2V0cygpOworfQorCitSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBDWEZBX0ZGRG9jOjpHZXRQREZOYW1lZEltYWdlKAorICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c05hbWUsCisgICAgaW50MzJfdCYgaUltYWdlWERwaSwKKyAgICBpbnQzMl90JiBpSW1hZ2VZRHBpKSB7CisgIGlmICghbV9wUERGRG9jKQorICAgIHJldHVybiBudWxscHRyOworCisgIHVpbnQzMl90IGR3SGFzaCA9IEZYX0hhc2hDb2RlX0dldFcod3NOYW1lLCBmYWxzZSk7CisgIGF1dG8gaXQgPSBtX0hhc2hUb0RpYkRwaU1hcC5maW5kKGR3SGFzaCk7CisgIGlmIChpdCAhPSBtX0hhc2hUb0RpYkRwaU1hcC5lbmQoKSkgeworICAgIGlJbWFnZVhEcGkgPSBpdC0+c2Vjb25kLmlJbWFnZVhEcGk7CisgICAgaUltYWdlWURwaSA9IGl0LT5zZWNvbmQuaUltYWdlWURwaTsKKyAgICByZXR1cm4gaXQtPnNlY29uZC5wRGliU291cmNlLkFzPENGWF9ESUJpdG1hcD4oKTsKKyAgfQorCisgIGNvbnN0IENQREZfRGljdGlvbmFyeSogcFJvb3QgPSBtX3BQREZEb2MtPkdldFJvb3QoKTsKKyAgaWYgKCFwUm9vdCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBDUERGX0RpY3Rpb25hcnkqIHBOYW1lcyA9IHBSb290LT5HZXREaWN0Rm9yKCJOYW1lcyIpOworICBpZiAoIXBOYW1lcykKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBDUERGX0RpY3Rpb25hcnkqIHBYRkFJbWFnZXMgPSBwTmFtZXMtPkdldERpY3RGb3IoIlhGQUltYWdlcyIpOworICBpZiAoIXBYRkFJbWFnZXMpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQ1BERl9OYW1lVHJlZSBuYW1ldHJlZShwWEZBSW1hZ2VzKTsKKyAgQ1BERl9PYmplY3QqIHBPYmplY3QgPSBuYW1ldHJlZS5Mb29rdXBWYWx1ZShXaWRlU3RyaW5nKHdzTmFtZSkpOworICBpZiAoIXBPYmplY3QpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5hbWV0cmVlLkdldENvdW50KCk7IGkrKykgeworICAgICAgV2lkZVN0cmluZyB3c1RlbXA7CisgICAgICBDUERGX09iamVjdCogcFRlbXBPYmplY3QgPSBuYW1ldHJlZS5Mb29rdXBWYWx1ZUFuZE5hbWUoaSwgJndzVGVtcCk7CisgICAgICBpZiAod3NUZW1wID09IHdzTmFtZSkgeworICAgICAgICBwT2JqZWN0ID0gcFRlbXBPYmplY3Q7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIENQREZfU3RyZWFtKiBwU3RyZWFtID0gVG9TdHJlYW0ocE9iamVjdCk7CisgIGlmICghcFN0cmVhbSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBhdXRvIHBBY2MgPSBwZGZpdW06Ok1ha2VSZXRhaW48Q1BERl9TdHJlYW1BY2M+KHBTdHJlYW0pOworICBwQWNjLT5Mb2FkQWxsRGF0YUZpbHRlcmVkKCk7CisKKyAgUmV0YWluUHRyPElGWF9TZWVrYWJsZVN0cmVhbT4gcEltYWdlRmlsZVJlYWQgPQorICAgICAgcGRmaXVtOjpNYWtlUmV0YWluPENGWF9NZW1vcnlTdHJlYW0+KAorICAgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCo+KHBBY2MtPkdldERhdGEoKSksIHBBY2MtPkdldFNpemUoKSwgZmFsc2UpOworCisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBEaWJTb3VyY2UgPSBYRkFfTG9hZEltYWdlRnJvbUJ1ZmZlcigKKyAgICAgIHBJbWFnZUZpbGVSZWFkLCBGWENPREVDX0lNQUdFX1VOS05PV04sIGlJbWFnZVhEcGksIGlJbWFnZVlEcGkpOworICBtX0hhc2hUb0RpYkRwaU1hcFtkd0hhc2hdID0ge3BEaWJTb3VyY2UsIGlJbWFnZVhEcGksIGlJbWFnZVlEcGl9OworICByZXR1cm4gcERpYlNvdXJjZTsKK30KKworYm9vbCBDWEZBX0ZGRG9jOjpTYXZlUGFja2FnZShDWEZBX05vZGUqIHBOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8SUZYX1NlZWthYmxlU3RyZWFtPiYgcEZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DaGVja3N1bUNvbnRleHQqIHBDU0NvbnRleHQpIHsKKyAgYXV0byBwRXhwb3J0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRGF0YUV4cG9ydGVyPihHZXRYRkFEb2MoKSk7CisgIGlmICghcE5vZGUpCisgICAgcmV0dXJuICEhcEV4cG9ydC0+RXhwb3J0KHBGaWxlKTsKKworICBCeXRlU3RyaW5nIGJzQ2hlY2tzdW07CisgIGlmIChwQ1NDb250ZXh0KQorICAgIGJzQ2hlY2tzdW0gPSBwQ1NDb250ZXh0LT5HZXRDaGVja3N1bSgpOworCisgIHJldHVybiAhIXBFeHBvcnQtPkV4cG9ydCgKKyAgICAgIHBGaWxlLCBwTm9kZSwgMCwgYnNDaGVja3N1bS5HZXRMZW5ndGgoKSA/IGJzQ2hlY2tzdW0uY19zdHIoKSA6IG51bGxwdHIpOworfQorCitib29sIENYRkFfRkZEb2M6OkltcG9ydERhdGEoY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVN0cmVhbT4mIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiWERQKSB7CisgIGF1dG8gaW1wb3J0ZXIgPQorICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRGF0YUltcG9ydGVyPihtX3BEb2N1bWVudFBhcnNlci0+R2V0RG9jdW1lbnQoKSk7CisgIHJldHVybiBpbXBvcnRlci0+SW1wb3J0RGF0YShwU3RyZWFtKTsKK30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfZmZkb2MuaCBiL3hmYS9meGZhL2N4ZmFfZmZkb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTgzNTY4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9mZmRvYy5oCkBAIC0wLDAgKzEsOTggQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9DWEZBX0ZGRE9DX0hfCisjZGVmaW5lIFhGQV9GWEZBX0NYRkFfRkZET0NfSF8KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvZnhmYS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnRfcGFyc2VyLmgiCisKK2NsYXNzIENGR0FTX1BERkZvbnRNZ3I7CitjbGFzcyBDRlhfQ2hlY2tzdW1Db250ZXh0OworY2xhc3MgQ1BERl9Eb2N1bWVudDsKK2NsYXNzIENYRkFfRkZBcHA7CitjbGFzcyBDWEZBX0ZGTm90aWZ5OworY2xhc3MgQ1hGQV9GRkRvY1ZpZXc7CisKK3N0cnVjdCBGWF9JTUFHRURJQl9BTkRfRFBJIHsKKyAgRlhfSU1BR0VESUJfQU5EX0RQSSgpOworICBGWF9JTUFHRURJQl9BTkRfRFBJKGNvbnN0IEZYX0lNQUdFRElCX0FORF9EUEkmIHRoYXQpOworICBGWF9JTUFHRURJQl9BTkRfRFBJKGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcERpYiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHhEcGksCisgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB5RHBpKTsKKyAgfkZYX0lNQUdFRElCX0FORF9EUEkoKTsKKworICBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4gcERpYlNvdXJjZTsKKyAgaW50MzJfdCBpSW1hZ2VYRHBpOworICBpbnQzMl90IGlJbWFnZVlEcGk7Cit9OworCitpbmxpbmUgRlhfSU1BR0VESUJfQU5EX0RQSTo6RlhfSU1BR0VESUJfQU5EX0RQSSgpID0gZGVmYXVsdDsKK2lubGluZSBGWF9JTUFHRURJQl9BTkRfRFBJOjpGWF9JTUFHRURJQl9BTkRfRFBJKAorICAgIGNvbnN0IEZYX0lNQUdFRElCX0FORF9EUEkmIHRoYXQpID0gZGVmYXVsdDsKKworaW5saW5lIEZYX0lNQUdFRElCX0FORF9EUEk6OkZYX0lNQUdFRElCX0FORF9EUEkoCisgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+JiBwRGliLAorICAgIGludDMyX3QgeERwaSwKKyAgICBpbnQzMl90IHlEcGkpCisgICAgOiBwRGliU291cmNlKHBEaWIpLCBpSW1hZ2VYRHBpKHhEcGkpLCBpSW1hZ2VZRHBpKHlEcGkpIHt9CisKK2lubGluZSBGWF9JTUFHRURJQl9BTkRfRFBJOjp+RlhfSU1BR0VESUJfQU5EX0RQSSgpID0gZGVmYXVsdDsKKworY2xhc3MgQ1hGQV9GRkRvYyB7CisgcHVibGljOgorICBDWEZBX0ZGRG9jKENYRkFfRkZBcHAqIHBBcHAsIElYRkFfRG9jRW52aXJvbm1lbnQqIHBEb2NFbnZpcm9ubWVudCk7CisgIH5DWEZBX0ZGRG9jKCk7CisKKyAgSVhGQV9Eb2NFbnZpcm9ubWVudCogR2V0RG9jRW52aXJvbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fcERvY0Vudmlyb25tZW50LkdldCgpOworICB9CisgIEZvcm1UeXBlIEdldEZvcm1UeXBlKCkgY29uc3QgeyByZXR1cm4gbV9Gb3JtVHlwZTsgfQorCisgIGludDMyX3QgU3RhcnRMb2FkKCk7CisgIGludDMyX3QgRG9Mb2FkKCk7CisgIHZvaWQgU3RvcExvYWQoKTsKKworICBDWEZBX0ZGRG9jVmlldyogQ3JlYXRlRG9jVmlldygpOworCisgIGJvb2wgT3BlbkRvYyhDUERGX0RvY3VtZW50KiBwUERGRG9jKTsKKyAgdm9pZCBDbG9zZURvYygpOworCisgIENYRkFfRG9jdW1lbnQqIEdldFhGQURvYygpIGNvbnN0IHsgcmV0dXJuIG1fcERvY3VtZW50UGFyc2VyLT5HZXREb2N1bWVudCgpOyB9CisgIENYRkFfRkZBcHAqIEdldEFwcCgpIGNvbnN0IHsgcmV0dXJuIG1fcEFwcC5HZXQoKTsgfQorICBDUERGX0RvY3VtZW50KiBHZXRQREZEb2MoKSBjb25zdCB7IHJldHVybiBtX3BQREZEb2MuR2V0KCk7IH0KKyAgQ1hGQV9GRkRvY1ZpZXcqIEdldERvY1ZpZXcoQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXQpOworICBDWEZBX0ZGRG9jVmlldyogR2V0RG9jVmlldygpOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBHZXRQREZOYW1lZEltYWdlKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUltYWdlWERwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSW1hZ2VZRHBpKTsKKyAgQ0ZHQVNfUERGRm9udE1nciogR2V0UERGRm9udE1ncigpIGNvbnN0IHsgcmV0dXJuIG1fcFBERkZvbnRNZ3IuZ2V0KCk7IH0KKworICBib29sIFNhdmVQYWNrYWdlKENYRkFfTm9kZSogcE5vZGUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVN0cmVhbT4mIHBGaWxlLAorICAgICAgICAgICAgICAgICAgIENGWF9DaGVja3N1bUNvbnRleHQqIHBDU0NvbnRleHQpOworICBib29sIEltcG9ydERhdGEoY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVN0cmVhbT4mIHBTdHJlYW0sCisgICAgICAgICAgICAgICAgICBib29sIGJYRFAgPSB0cnVlKTsKKworIHByaXZhdGU6CisgIFVub3duZWRQdHI8SVhGQV9Eb2NFbnZpcm9ubWVudD4gY29uc3QgbV9wRG9jRW52aXJvbm1lbnQ7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0RvY3VtZW50UGFyc2VyPiBtX3BEb2N1bWVudFBhcnNlcjsKKyAgUmV0YWluUHRyPElGWF9TZWVrYWJsZVN0cmVhbT4gbV9wU3RyZWFtOworICBVbm93bmVkUHRyPENYRkFfRkZBcHA+IGNvbnN0IG1fcEFwcDsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRkZOb3RpZnk+IG1fcE5vdGlmeTsKKyAgVW5vd25lZFB0cjxDUERGX0RvY3VtZW50PiBtX3BQREZEb2M7CisgIHN0ZDo6bWFwPHVpbnQzMl90LCBGWF9JTUFHRURJQl9BTkRfRFBJPiBtX0hhc2hUb0RpYkRwaU1hcDsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRkZEb2NWaWV3PiBtX0RvY1ZpZXc7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRkdBU19QREZGb250TWdyPiBtX3BQREZGb250TWdyOworICBGb3JtVHlwZSBtX0Zvcm1UeXBlID0gRm9ybVR5cGU6OmtYRkFGb3JlZ3JvdW5kOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9DWEZBX0ZGRE9DX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX2ZmZG9jdmlldy5jcHAgYi94ZmEvZnhmYS9jeGZhX2ZmZG9jdmlldy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRlNTI5OQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZmZkb2N2aWV3LmNwcApAQCAtMCwwICsxLDgwMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRvY3ZpZXcuaCIKKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAiZnhqcy9jZnhqc2VfZW5naW5lLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X29iamVjdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmFwcC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZiYXJjb2RlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmNoZWNrYnV0dG9uLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRvYy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZkcmF3LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmV4Y2xncm91cC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZmaWVsZC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZpbWFnZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZpbWFnZWVkaXQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmcHVzaGJ1dHRvbi5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZzaWduYXR1cmUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmc3ViZm9ybS5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZ0ZXh0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZndpZGdldC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZ3aWRnZXRoYW5kbGVyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9md2xhZGFwdGVyd2lkZ2V0bWdyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV90ZXh0cHJvdmlkZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX3dpZGdldGFjY2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWNyb2JhdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2JpbmRpdGVtcy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NhbGN1bGF0ZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dHByb2Nlc3Nvci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2VzZXQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmVzZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3ViZm9ybS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZhbGlkYXRlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9yZXNvbHZlbm9kZV9ycy5oIgorCitjb25zdCBYRkFfQXR0cmlidXRlRW51bSBnc19FdmVudEFjdGl2aXR5W10gPSB7CisgICAgWEZBX0F0dHJpYnV0ZUVudW06OkNsaWNrLCAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpDaGFuZ2UsCisgICAgWEZBX0F0dHJpYnV0ZUVudW06OkRvY0Nsb3NlLCAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpEb2NSZWFkeSwKKyAgICBYRkFfQXR0cmlidXRlRW51bTo6RW50ZXIsICAgICAgWEZBX0F0dHJpYnV0ZUVudW06OkV4aXQsCisgICAgWEZBX0F0dHJpYnV0ZUVudW06OkZ1bGwsICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpJbmRleENoYW5nZSwKKyAgICBYRkFfQXR0cmlidXRlRW51bTo6SW5pdGlhbGl6ZSwgWEZBX0F0dHJpYnV0ZUVudW06Ok1vdXNlRG93biwKKyAgICBYRkFfQXR0cmlidXRlRW51bTo6TW91c2VFbnRlciwgWEZBX0F0dHJpYnV0ZUVudW06Ok1vdXNlRXhpdCwKKyAgICBYRkFfQXR0cmlidXRlRW51bTo6TW91c2VVcCwgICAgWEZBX0F0dHJpYnV0ZUVudW06OlBvc3RFeGVjdXRlLAorICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpQb3N0T3BlbiwgICBYRkFfQXR0cmlidXRlRW51bTo6UG9zdFByaW50LAorICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpQb3N0U2F2ZSwgICBYRkFfQXR0cmlidXRlRW51bTo6UG9zdFNpZ24sCisgICAgWEZBX0F0dHJpYnV0ZUVudW06OlBvc3RTdWJtaXQsIFhGQV9BdHRyaWJ1dGVFbnVtOjpQcmVFeGVjdXRlLAorICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpQcmVPcGVuLCAgICBYRkFfQXR0cmlidXRlRW51bTo6UHJlUHJpbnQsCisgICAgWEZBX0F0dHJpYnV0ZUVudW06OlByZVNhdmUsICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpQcmVTaWduLAorICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpQcmVTdWJtaXQsICBYRkFfQXR0cmlidXRlRW51bTo6UmVhZHksCisgICAgWEZBX0F0dHJpYnV0ZUVudW06OlVua25vd24sCit9OworCitDWEZBX0ZGRG9jVmlldzo6Q1hGQV9GRkRvY1ZpZXcoQ1hGQV9GRkRvYyogcERvYykKKyAgICA6IG1fYkxheW91dEV2ZW50KGZhbHNlKSwKKyAgICAgIG1fcExpc3RGb2N1c1dpZGdldChudWxscHRyKSwKKyAgICAgIG1fYkluTGF5b3V0U3RhdHVzKGZhbHNlKSwKKyAgICAgIG1fcERvYyhwRG9jKSwKKyAgICAgIG1fcFhGQURvY0xheW91dChudWxscHRyKSwKKyAgICAgIG1faVN0YXR1cyhYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfTm9uZSksCisgICAgICBtX2lMb2NrKDApIHt9CisKK0NYRkFfRkZEb2NWaWV3Ojp+Q1hGQV9GRkRvY1ZpZXcoKSB7CisgIERlc3Ryb3lEb2NWaWV3KCk7Cit9CisKK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkluaXRMYXlvdXQoQ1hGQV9Ob2RlKiBwTm9kZSkgeworICBSdW5CaW5kSXRlbXMoKTsKKyAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwTm9kZSwgWEZBX0VWRU5UX0luaXRpYWxpemUsIGZhbHNlLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBOb2RlLCBYRkFfRVZFTlRfSW5kZXhDaGFuZ2UsIGZhbHNlLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworfQorCitpbnQzMl90IENYRkFfRkZEb2NWaWV3OjpTdGFydExheW91dChpbnQzMl90IGlTdGFydFBhZ2UpIHsKKyAgbV9pU3RhdHVzID0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX1N0YXJ0OworICBtX3BEb2MtPkdldFhGQURvYygpLT5Eb1Byb3RvTWVyZ2UoKTsKKyAgbV9wRG9jLT5HZXRYRkFEb2MoKS0+RG9EYXRhTWVyZ2UoKTsKKyAgbV9wWEZBRG9jTGF5b3V0ID0gR2V0WEZBTGF5b3V0KCk7CisKKyAgaW50MzJfdCBpU3RhdHVzID0gbV9wWEZBRG9jTGF5b3V0LT5TdGFydExheW91dCgpOworICBpZiAoaVN0YXR1cyA8IDApCisgICAgcmV0dXJuIGlTdGF0dXM7CisKKyAgQ1hGQV9Ob2RlKiBwUm9vdEl0ZW0gPQorICAgICAgVG9Ob2RlKG1fcERvYy0+R2V0WEZBRG9jKCktPkdldFhGQU9iamVjdChYRkFfSEFTSENPREVfRm9ybSkpOworICBpZiAoIXBSb290SXRlbSkKKyAgICByZXR1cm4gaVN0YXR1czsKKworICBJbml0TGF5b3V0KHBSb290SXRlbSk7CisgIEluaXRDYWxjdWxhdGUocFJvb3RJdGVtKTsKKyAgSW5pdFZhbGlkYXRlKHBSb290SXRlbSk7CisKKyAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwUm9vdEl0ZW0sIFhGQV9FVkVOVF9SZWFkeSwgdHJ1ZSwgdHJ1ZSwgbnVsbHB0cik7CisgIG1faVN0YXR1cyA9IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19TdGFydDsKKyAgcmV0dXJuIGlTdGF0dXM7Cit9CisKK2ludDMyX3QgQ1hGQV9GRkRvY1ZpZXc6OkRvTGF5b3V0KCkgeworICBpbnQzMl90IGlTdGF0dXMgPSAxMDA7CisgIGlTdGF0dXMgPSBtX3BYRkFEb2NMYXlvdXQtPkRvTGF5b3V0KCk7CisgIGlmIChpU3RhdHVzICE9IDEwMCkKKyAgICByZXR1cm4gaVN0YXR1czsKKworICBtX2lTdGF0dXMgPSBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRG9pbmc7CisgIHJldHVybiBpU3RhdHVzOworfQorCit2b2lkIENYRkFfRkZEb2NWaWV3OjpTdG9wTGF5b3V0KCkgeworICBDWEZBX05vZGUqIHBSb290SXRlbSA9CisgICAgICBUb05vZGUobV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0WEZBT2JqZWN0KFhGQV9IQVNIQ09ERV9Gb3JtKSk7CisgIGlmICghcFJvb3RJdGVtKQorICAgIHJldHVybjsKKworICBDWEZBX1N1YmZvcm0qIHBTdWJmb3JtTm9kZSA9CisgICAgICBwUm9vdEl0ZW0tPkdldENoaWxkPENYRkFfU3ViZm9ybT4oMCwgWEZBX0VsZW1lbnQ6OlN1YmZvcm0sIGZhbHNlKTsKKyAgaWYgKCFwU3ViZm9ybU5vZGUpCisgICAgcmV0dXJuOworCisgIENYRkFfUGFnZVNldCogcFBhZ2VTZXROb2RlID0KKyAgICAgIHBTdWJmb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9QYWdlU2V0PihYRkFfRWxlbWVudDo6UGFnZVNldCk7CisgIGlmICghcFBhZ2VTZXROb2RlKQorICAgIHJldHVybjsKKworICBSdW5DYWxjdWxhdGVXaWRnZXRzKCk7CisgIFJ1blZhbGlkYXRlKCk7CisKKyAgSW5pdExheW91dChwUGFnZVNldE5vZGUpOworICBJbml0Q2FsY3VsYXRlKHBQYWdlU2V0Tm9kZSk7CisgIEluaXRWYWxpZGF0ZShwUGFnZVNldE5vZGUpOworCisgIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocFBhZ2VTZXROb2RlLCBYRkFfRVZFTlRfUmVhZHksIHRydWUsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgIEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QocFJvb3RJdGVtLCBYRkFfRVZFTlRfUmVhZHksIGZhbHNlLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBSb290SXRlbSwgWEZBX0VWRU5UX0RvY1JlYWR5LCBmYWxzZSwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKworICBSdW5DYWxjdWxhdGVXaWRnZXRzKCk7CisgIFJ1blZhbGlkYXRlKCk7CisKKyAgaWYgKFJ1bkxheW91dCgpKSB7CisgICAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwUm9vdEl0ZW0sIFhGQV9FVkVOVF9SZWFkeSwgZmFsc2UsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgfQorCisgIG1fQ2FsY3VsYXRlQWNjcy5jbGVhcigpOworICBpZiAobV9wRm9jdXNBY2MgJiYgIW1fcEZvY3VzV2lkZ2V0KQorICAgIFNldEZvY3VzV2lkZ2V0QWNjKG1fcEZvY3VzQWNjLkdldCgpKTsKKworICBtX2lTdGF0dXMgPSBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRW5kOworfQorCit2b2lkIENYRkFfRkZEb2NWaWV3OjpTaG93TnVsbFRlc3RNc2coKSB7CisgIGludDMyX3QgaUNvdW50ID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX2Fyck51bGxUZXN0TXNnKTsKKyAgQ1hGQV9GRkFwcCogcEFwcCA9IG1fcERvYy0+R2V0QXBwKCk7CisgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IHBBcHAtPkdldEFwcFByb3ZpZGVyKCk7CisgIGlmIChwQXBwUHJvdmlkZXIgJiYgaUNvdW50KSB7CisgICAgaW50MzJfdCBpUmVtYWluID0gaUNvdW50ID4gNyA/IGlDb3VudCAtIDcgOiAwOworICAgIGlDb3VudCAtPSBpUmVtYWluOworICAgIFdpZGVTdHJpbmcgd3NNc2c7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspCisgICAgICB3c01zZyArPSBtX2Fyck51bGxUZXN0TXNnW2ldICsgTCJcbiI7CisKKyAgICBpZiAoaVJlbWFpbiA+IDApIHsKKyAgICAgIHdzTXNnICs9IEwiXG4iICsgV2lkZVN0cmluZzo6Rm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJNZXNzYWdlIGxpbWl0IGV4Y2VlZGVkLiBSZW1haW5pbmcgJWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJ2YWxpZGF0aW9uIGVycm9ycyBub3QgcmVwb3J0ZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlSZW1haW4pOworICAgIH0KKyAgICBwQXBwUHJvdmlkZXItPk1zZ0JveCh3c01zZywgcEFwcFByb3ZpZGVyLT5HZXRBcHBUaXRsZSgpLCBYRkFfTUJJQ09OX1N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTUJfT0spOworICB9CisgIG1fYXJyTnVsbFRlc3RNc2cuY2xlYXIoKTsKK30KKwordm9pZCBDWEZBX0ZGRG9jVmlldzo6VXBkYXRlRG9jVmlldygpIHsKKyAgaWYgKElzVXBkYXRlTG9ja2VkKCkpCisgICAgcmV0dXJuOworCisgIExvY2tVcGRhdGUoKTsKKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlIDogbV9OZXdBZGRlZE5vZGVzKSB7CisgICAgSW5pdENhbGN1bGF0ZShwTm9kZSk7CisgICAgSW5pdFZhbGlkYXRlKHBOb2RlKTsKKyAgICBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBOb2RlLCBYRkFfRVZFTlRfUmVhZHksIHRydWUsIHRydWUsIG51bGxwdHIpOworICB9CisgIG1fTmV3QWRkZWROb2Rlcy5jbGVhcigpOworCisgIFJ1blN1YmZvcm1JbmRleENoYW5nZSgpOworICBSdW5DYWxjdWxhdGVXaWRnZXRzKCk7CisgIFJ1blZhbGlkYXRlKCk7CisKKyAgU2hvd051bGxUZXN0TXNnKCk7CisKKyAgaWYgKFJ1bkxheW91dCgpICYmIG1fYkxheW91dEV2ZW50KQorICAgIFJ1bkV2ZW50TGF5b3V0UmVhZHkoKTsKKworICBtX2JMYXlvdXRFdmVudCA9IGZhbHNlOworICBtX0NhbGN1bGF0ZUFjY3MuY2xlYXIoKTsKKyAgUnVuSW52YWxpZGF0ZSgpOworICBVbmxvY2tVcGRhdGUoKTsKK30KKworaW50MzJfdCBDWEZBX0ZGRG9jVmlldzo6Q291bnRQYWdlVmlld3MoKSBjb25zdCB7CisgIHJldHVybiBtX3BYRkFEb2NMYXlvdXQgPyBtX3BYRkFEb2NMYXlvdXQtPkNvdW50UGFnZXMoKSA6IDA7Cit9CisKK0NYRkFfRkZQYWdlVmlldyogQ1hGQV9GRkRvY1ZpZXc6OkdldFBhZ2VWaWV3KGludDMyX3QgbkluZGV4KSBjb25zdCB7CisgIGlmICghbV9wWEZBRG9jTGF5b3V0KQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRlBhZ2VWaWV3Kj4obV9wWEZBRG9jTGF5b3V0LT5HZXRQYWdlKG5JbmRleCkpOworfQorCitDWEZBX0xheW91dFByb2Nlc3NvciogQ1hGQV9GRkRvY1ZpZXc6OkdldFhGQUxheW91dCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcERvYy0+R2V0WEZBRG9jKCktPkdldERvY0xheW91dCgpOworfQorCitib29sIENYRkFfRkZEb2NWaWV3OjpSZXNldFNpbmdsZVdpZGdldEFjY0RhdGEoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpIHsKKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBXaWRnZXRBY2MtPkdldE5vZGUoKTsKKyAgWEZBX0VsZW1lbnQgZVR5cGUgPSBwTm9kZS0+R2V0RWxlbWVudFR5cGUoKTsKKyAgaWYgKGVUeXBlICE9IFhGQV9FbGVtZW50OjpGaWVsZCAmJiBlVHlwZSAhPSBYRkFfRWxlbWVudDo6RXhjbEdyb3VwKQorICAgIHJldHVybiBmYWxzZTsKKworICBwV2lkZ2V0QWNjLT5SZXNldERhdGEoKTsKKyAgcFdpZGdldEFjYy0+VXBkYXRlVUlEaXNwbGF5KHRoaXMsIG51bGxwdHIpOworICBDWEZBX1ZhbGlkYXRlKiB2YWxpZGF0ZSA9IHBOb2RlLT5HZXRWYWxpZGF0ZUlmRXhpc3RzKCk7CisgIGlmICghdmFsaWRhdGUpCisgICAgcmV0dXJuIHRydWU7CisKKyAgQWRkVmFsaWRhdGVXaWRnZXQocFdpZGdldEFjYyk7CisgIHZhbGlkYXRlLT5TZXRGbGFnKFhGQV9Ob2RlRmxhZ19OZWVkc0luaXRBcHAsIGZhbHNlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlJlc2V0V2lkZ2V0QWNjKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjKSB7CisgIG1fYkxheW91dEV2ZW50ID0gdHJ1ZTsKKyAgYm9vbCBiQ2hhbmdlZCA9IGZhbHNlOworICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IG51bGxwdHI7CisgIGlmIChwV2lkZ2V0QWNjKSB7CisgICAgYkNoYW5nZWQgPSBSZXNldFNpbmdsZVdpZGdldEFjY0RhdGEocFdpZGdldEFjYyk7CisgICAgcEZvcm1Ob2RlID0gcFdpZGdldEFjYy0+R2V0Tm9kZSgpOworICB9IGVsc2UgeworICAgIHBGb3JtTm9kZSA9IEdldFJvb3RTdWJmb3JtKCk7CisgIH0KKyAgaWYgKCFwRm9ybU5vZGUpCisgICAgcmV0dXJuOworCisgIGlmIChwRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OkZpZWxkICYmCisgICAgICBwRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OkV4Y2xHcm91cCkgeworICAgIENYRkFfV2lkZ2V0QWNjSXRlcmF0b3IgSXRlcmF0b3IocEZvcm1Ob2RlKTsKKyAgICB3aGlsZSAoQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsKKyAgICAgIGJDaGFuZ2VkIHw9IFJlc2V0U2luZ2xlV2lkZ2V0QWNjRGF0YShwQWNjKTsKKyAgICAgIGlmIChwQWNjLT5HZXROb2RlKCktPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkV4Y2xHcm91cCkKKyAgICAgICAgSXRlcmF0b3IuU2tpcFRyZWUoKTsKKyAgICB9CisgIH0KKyAgaWYgKGJDaGFuZ2VkKQorICAgIG1fcERvYy0+R2V0RG9jRW52aXJvbm1lbnQoKS0+U2V0Q2hhbmdlTWFyayhtX3BEb2MuR2V0KCkpOworfQorCitpbnQzMl90IENYRkFfRkZEb2NWaWV3OjpQcm9jZXNzV2lkZ2V0RXZlbnQoQ1hGQV9FdmVudFBhcmFtKiBwUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpIHsKKyAgaWYgKCFwUGFyYW0pCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Vycm9yOworCisgIGlmIChwUGFyYW0tPm1fZVR5cGUgPT0gWEZBX0VWRU5UX1ZhbGlkYXRlKSB7CisgICAgV2lkZVN0cmluZyB3c1ZhbGlkYXRlU3RyKEwicHJlU3VibWl0Iik7CisgICAgQ1hGQV9Ob2RlKiBwQ29uZmlnSXRlbSA9CisgICAgICAgIFRvTm9kZShtX3BEb2MtPkdldFhGQURvYygpLT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0NvbmZpZykpOworICAgIGlmIChwQ29uZmlnSXRlbSkgeworICAgICAgQ1hGQV9BY3JvYmF0KiBwQWNyb2JhdE5vZGUgPQorICAgICAgICAgIHBDb25maWdJdGVtLT5HZXRDaGlsZDxDWEZBX0Fjcm9iYXQ+KDAsIFhGQV9FbGVtZW50OjpBY3JvYmF0LCBmYWxzZSk7CisgICAgICBDWEZBX1ZhbGlkYXRlKiBwVmFsaWRhdGVOb2RlID0KKyAgICAgICAgICBwQWNyb2JhdE5vZGUgPyBwQWNyb2JhdE5vZGUtPkdldENoaWxkPENYRkFfVmFsaWRhdGU+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBYRkFfRWxlbWVudDo6VmFsaWRhdGUsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHI7CisgICAgICBpZiAoIXBWYWxpZGF0ZU5vZGUpIHsKKyAgICAgICAgQ1hGQV9QcmVzZW50KiBwUHJlc2VudE5vZGUgPQorICAgICAgICAgICAgcENvbmZpZ0l0ZW0tPkdldENoaWxkPENYRkFfUHJlc2VudD4oMCwgWEZBX0VsZW1lbnQ6OlByZXNlbnQsIGZhbHNlKTsKKyAgICAgICAgcFZhbGlkYXRlTm9kZSA9IHBQcmVzZW50Tm9kZSA/IHBQcmVzZW50Tm9kZS0+R2V0Q2hpbGQ8Q1hGQV9WYWxpZGF0ZT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgWEZBX0VsZW1lbnQ6OlZhbGlkYXRlLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHI7CisgICAgICB9CisgICAgICBpZiAocFZhbGlkYXRlTm9kZSkKKyAgICAgICAgd3NWYWxpZGF0ZVN0ciA9IHBWYWxpZGF0ZU5vZGUtPkpTT2JqZWN0KCktPkdldENvbnRlbnQoZmFsc2UpOworICAgIH0KKworICAgIGlmICghd3NWYWxpZGF0ZVN0ci5Db250YWlucyhMInByZVN1Ym1pdCIpKQorICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2Nlc3M7CisgIH0KKworICBDWEZBX05vZGUqIHBOb2RlID0gcFdpZGdldEFjYyA/IHBXaWRnZXRBY2MtPkdldE5vZGUoKSA6IG51bGxwdHI7CisgIGlmICghcE5vZGUpIHsKKyAgICBDWEZBX05vZGUqIHBSb290SXRlbSA9CisgICAgICAgIFRvTm9kZShtX3BEb2MtPkdldFhGQURvYygpLT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0Zvcm0pKTsKKyAgICBpZiAoIXBSb290SXRlbSkKKyAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9FcnJvcjsKKworICAgIHBOb2RlID0gcFJvb3RJdGVtLT5HZXRDaGlsZDxDWEZBX05vZGU+KDAsIFhGQV9FbGVtZW50OjpTdWJmb3JtLCBmYWxzZSk7CisgIH0KKworICBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBOb2RlLCBwUGFyYW0tPm1fZVR5cGUsIHBQYXJhbS0+bV9iSXNGb3JtUmVhZHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgbnVsbHB0cik7CisgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNjZXNzOworfQorCitDWEZBX0ZGV2lkZ2V0KiBDWEZBX0ZGRG9jVmlldzo6R2V0V2lkZ2V0Rm9yTm9kZShDWEZBX05vZGUqIG5vZGUpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihHZXRYRkFMYXlvdXQoKS0+R2V0TGF5b3V0SXRlbShub2RlKSk7Cit9CisKK0NYRkFfRkZXaWRnZXRIYW5kbGVyKiBDWEZBX0ZGRG9jVmlldzo6R2V0V2lkZ2V0SGFuZGxlcigpIHsKKyAgaWYgKCFtX3BXaWRnZXRIYW5kbGVyKQorICAgIG1fcFdpZGdldEhhbmRsZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GRldpZGdldEhhbmRsZXI+KHRoaXMpOworICByZXR1cm4gbV9wV2lkZ2V0SGFuZGxlci5nZXQoKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPENYRkFfV2lkZ2V0QWNjSXRlcmF0b3I+CitDWEZBX0ZGRG9jVmlldzo6Q3JlYXRlV2lkZ2V0QWNjSXRlcmF0b3IoKSB7CisgIENYRkFfU3ViZm9ybSogcEZvcm1Sb290ID0gR2V0Um9vdFN1YmZvcm0oKTsKKyAgcmV0dXJuIHBGb3JtUm9vdCA/IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1dpZGdldEFjY0l0ZXJhdG9yPihwRm9ybVJvb3QpCisgICAgICAgICAgICAgICAgICAgOiBudWxscHRyOworfQorCit2b2lkIENYRkFfRkZEb2NWaWV3OjpLaWxsRm9jdXMoKSB7CisgIGlmIChtX3BGb2N1c1dpZGdldCAmJgorICAgICAgKG1fcEZvY3VzV2lkZ2V0LT5HZXRTdGF0dXMoKSAmIFhGQV9XaWRnZXRTdGF0dXNfRm9jdXNlZCkpIHsKKyAgICBtX3BGb2N1c1dpZGdldC0+T25LaWxsRm9jdXMobnVsbHB0cik7CisgIH0KKyAgbV9wRm9jdXNBY2MgPSBudWxscHRyOworICBtX3BGb2N1c1dpZGdldCA9IG51bGxwdHI7CisgIG1fcE9sZEZvY3VzV2lkZ2V0ID0gbnVsbHB0cjsKK30KKworYm9vbCBDWEZBX0ZGRG9jVmlldzo6U2V0Rm9jdXMoQ1hGQV9GRldpZGdldCogaFdpZGdldCkgeworICBDWEZBX0ZGV2lkZ2V0KiBwTmV3Rm9jdXMgPSBoV2lkZ2V0OworICBpZiAobV9wT2xkRm9jdXNXaWRnZXQgPT0gcE5ld0ZvY3VzKQorICAgIHJldHVybiBmYWxzZTsKKworICBDWEZBX0ZGV2lkZ2V0KiBwT2xkRm9jdXMgPSBtX3BPbGRGb2N1c1dpZGdldC5HZXQoKTsKKyAgbV9wT2xkRm9jdXNXaWRnZXQgPSBwTmV3Rm9jdXM7CisgIGlmIChwT2xkRm9jdXMpIHsKKyAgICBpZiAobV9wRm9jdXNXaWRnZXQgIT0gbV9wT2xkRm9jdXNXaWRnZXQgJiYKKyAgICAgICAgKHBPbGRGb2N1cy0+R2V0U3RhdHVzKCkgJiBYRkFfV2lkZ2V0U3RhdHVzX0ZvY3VzZWQpKSB7CisgICAgICBtX3BGb2N1c1dpZGdldCA9IHBPbGRGb2N1czsKKyAgICAgIHBPbGRGb2N1cy0+T25LaWxsRm9jdXMocE5ld0ZvY3VzKTsKKyAgICB9IGVsc2UgaWYgKChwT2xkRm9jdXMtPkdldFN0YXR1cygpICYgWEZBX1dpZGdldFN0YXR1c19WaXNpYmxlKSkgeworICAgICAgaWYgKCFwT2xkRm9jdXMtPklzTG9hZGVkKCkpCisgICAgICAgIHBPbGRGb2N1cy0+TG9hZFdpZGdldCgpOworCisgICAgICBwT2xkRm9jdXMtPk9uU2V0Rm9jdXMobV9wRm9jdXNXaWRnZXQuR2V0KCkpOworICAgICAgbV9wRm9jdXNXaWRnZXQgPSBwT2xkRm9jdXM7CisgICAgICBwT2xkRm9jdXMtPk9uS2lsbEZvY3VzKHBOZXdGb2N1cyk7CisgICAgfQorICB9CisgIGlmIChtX3BGb2N1c1dpZGdldCA9PSBtX3BPbGRGb2N1c1dpZGdldCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgcE5ld0ZvY3VzID0gbV9wT2xkRm9jdXNXaWRnZXQuR2V0KCk7CisgIGlmIChtX3BMaXN0Rm9jdXNXaWRnZXQgJiYgcE5ld0ZvY3VzID09IG1fcExpc3RGb2N1c1dpZGdldCkgeworICAgIG1fcEZvY3VzQWNjID0gbnVsbHB0cjsKKyAgICBtX3BGb2N1c1dpZGdldCA9IG51bGxwdHI7CisgICAgbV9wTGlzdEZvY3VzV2lkZ2V0ID0gbnVsbHB0cjsKKyAgICBtX3BPbGRGb2N1c1dpZGdldCA9IG51bGxwdHI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChwTmV3Rm9jdXMgJiYgKHBOZXdGb2N1cy0+R2V0U3RhdHVzKCkgJiBYRkFfV2lkZ2V0U3RhdHVzX1Zpc2libGUpKSB7CisgICAgaWYgKCFwTmV3Rm9jdXMtPklzTG9hZGVkKCkpCisgICAgICBwTmV3Rm9jdXMtPkxvYWRXaWRnZXQoKTsKKyAgICBwTmV3Rm9jdXMtPk9uU2V0Rm9jdXMobV9wRm9jdXNXaWRnZXQuR2V0KCkpOworICB9CisgIG1fcEZvY3VzQWNjID0gcE5ld0ZvY3VzID8gcE5ld0ZvY3VzLT5HZXROb2RlKCktPkdldFdpZGdldEFjYygpIDogbnVsbHB0cjsKKyAgbV9wRm9jdXNXaWRnZXQgPSBwTmV3Rm9jdXM7CisgIG1fcE9sZEZvY3VzV2lkZ2V0ID0gbV9wRm9jdXNXaWRnZXQ7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENYRkFfRkZEb2NWaWV3OjpTZXRGb2N1c1dpZGdldEFjYyhDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYykgeworICBDWEZBX0ZGV2lkZ2V0KiBwTmV3Rm9jdXMgPSBudWxscHRyOworICBpZiAocFdpZGdldEFjYykKKyAgICBwTmV3Rm9jdXMgPSBHZXRXaWRnZXRGb3JOb2RlKHBXaWRnZXRBY2MtPkdldE5vZGUoKSk7CisgIGlmICghU2V0Rm9jdXMocE5ld0ZvY3VzKSkKKyAgICByZXR1cm47CisKKyAgbV9wRm9jdXNBY2MgPSBwV2lkZ2V0QWNjOworICBpZiAobV9pU3RhdHVzICE9IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19FbmQpCisgICAgcmV0dXJuOworCisgIG1fcERvYy0+R2V0RG9jRW52aXJvbm1lbnQoKS0+U2V0Rm9jdXNXaWRnZXQobV9wRG9jLkdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZvY3VzV2lkZ2V0LkdldCgpKTsKK30KKwordm9pZCBDWEZBX0ZGRG9jVmlldzo6RGVsZXRlTGF5b3V0SXRlbShDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0KSB7CisgIGlmIChtX3BGb2N1c0FjYyAmJiBtX3BGb2N1c0FjYy0+R2V0Tm9kZSgpICE9IHBXaWRnZXQtPkdldE5vZGUoKSkKKyAgICByZXR1cm47CisKKyAgbV9wRm9jdXNBY2MgPSBudWxscHRyOworICBtX3BGb2N1c1dpZGdldCA9IG51bGxwdHI7CisgIG1fcE9sZEZvY3VzV2lkZ2V0ID0gbnVsbHB0cjsKK30KKworc3RhdGljIGludDMyX3QgWEZBX1Byb2Nlc3NFdmVudChDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0V2ZW50UGFyYW0qIHBQYXJhbSkgeworICBpZiAoIXBQYXJhbSB8fCBwUGFyYW0tPm1fZVR5cGUgPT0gWEZBX0VWRU5UX1Vua25vd24pCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0OworICBpZiAoIXBXaWRnZXRBY2MpCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0OworCisgIENYRkFfTm9kZSogbm9kZSA9IHBXaWRnZXRBY2MtPkdldE5vZGUoKTsKKyAgaWYgKG5vZGUgJiYgbm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6RHJhdykKKyAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7CisKKyAgc3dpdGNoIChwUGFyYW0tPm1fZVR5cGUpIHsKKyAgICBjYXNlIFhGQV9FVkVOVF9DYWxjdWxhdGU6CisgICAgICByZXR1cm4gbm9kZS0+UHJvY2Vzc0NhbGN1bGF0ZShwRG9jVmlldyk7CisgICAgY2FzZSBYRkFfRVZFTlRfVmFsaWRhdGU6CisgICAgICBpZiAocERvY1ZpZXctPkdldERvYygpLT5HZXREb2NFbnZpcm9ubWVudCgpLT5Jc1ZhbGlkYXRpb25zRW5hYmxlZCgKKyAgICAgICAgICAgICAgcERvY1ZpZXctPkdldERvYygpKSkgeworICAgICAgICByZXR1cm4gbm9kZS0+UHJvY2Vzc1ZhbGlkYXRlKHBEb2NWaWV3LCAweDAxKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9EaXNhYmxlZDsKKyAgICBjYXNlIFhGQV9FVkVOVF9Jbml0Q2FsY3VsYXRlOiB7CisgICAgICBDWEZBX0NhbGN1bGF0ZSogY2FsYyA9IG5vZGUtPkdldENhbGN1bGF0ZUlmRXhpc3RzKCk7CisgICAgICBpZiAoIWNhbGMpCisgICAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKKyAgICAgIGlmIChub2RlLT5Jc1VzZXJJbnRlcmFjdGl2ZSgpKQorICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRGlzYWJsZWQ7CisKKyAgICAgIHJldHVybiBub2RlLT5FeGVjdXRlU2NyaXB0KHBEb2NWaWV3LCBjYWxjLT5HZXRTY3JpcHRJZkV4aXN0cygpLCBwUGFyYW0pOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICByZXR1cm4gbm9kZS0+UHJvY2Vzc0V2ZW50KHBEb2NWaWV3LCBnc19FdmVudEFjdGl2aXR5W3BQYXJhbS0+bV9lVHlwZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtKTsKK30KKworaW50MzJfdCBDWEZBX0ZGRG9jVmlldzo6RXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChDWEZBX05vZGUqIHBGb3JtTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VWRU5UVFlQRSBlRXZlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJc0Zvcm1SZWFkeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmVjdXJzaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBFeGNsdWRlKSB7CisgIGlmIChwRm9ybU5vZGUgPT0gcEV4Y2x1ZGUpCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0OworCisgIFhGQV9FbGVtZW50IGVsZW1lbnRUeXBlID0gcEZvcm1Ob2RlLT5HZXRFbGVtZW50VHlwZSgpOworICBpZiAoZWxlbWVudFR5cGUgPT0gWEZBX0VsZW1lbnQ6OkZpZWxkKSB7CisgICAgaWYgKGVFdmVudFR5cGUgPT0gWEZBX0VWRU5UX0luZGV4Q2hhbmdlKQorICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0OworCisgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwRm9ybU5vZGUtPkdldFdpZGdldEFjYygpOworICAgIGlmICghcFdpZGdldEFjYykKKyAgICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKKworICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07CisgICAgZVBhcmFtLm1fZVR5cGUgPSBlRXZlbnRUeXBlOworICAgIGVQYXJhbS5tX3BUYXJnZXQgPSBwV2lkZ2V0QWNjOworICAgIGVQYXJhbS5tX2JJc0Zvcm1SZWFkeSA9IGJJc0Zvcm1SZWFkeTsKKyAgICByZXR1cm4gWEZBX1Byb2Nlc3NFdmVudCh0aGlzLCBwV2lkZ2V0QWNjLCAmZVBhcmFtKTsKKyAgfQorCisgIGludDMyX3QgaVJldCA9IFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0OworICBpZiAoYlJlY3Vyc2l2ZSkgeworICAgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHBGb3JtTm9kZS0+R2V0Rmlyc3RDb250YWluZXJDaGlsZCgpOyBwTm9kZTsKKyAgICAgICAgIHBOb2RlID0gcE5vZGUtPkdldE5leHRDb250YWluZXJTaWJsaW5nKCkpIHsKKyAgICAgIGVsZW1lbnRUeXBlID0gcE5vZGUtPkdldEVsZW1lbnRUeXBlKCk7CisgICAgICBpZiAoZWxlbWVudFR5cGUgIT0gWEZBX0VsZW1lbnQ6OlZhcmlhYmxlcyAmJgorICAgICAgICAgIGVsZW1lbnRUeXBlICE9IFhGQV9FbGVtZW50OjpEcmF3KSB7CisgICAgICAgIGlSZXQgfD0gRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwTm9kZSwgZUV2ZW50VHlwZSwgYklzRm9ybVJlYWR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJlY3Vyc2l2ZSwgcEV4Y2x1ZGUpOworICAgICAgfQorICAgIH0KKyAgfQorICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBGb3JtTm9kZS0+R2V0V2lkZ2V0QWNjKCk7CisgIGlmICghcFdpZGdldEFjYykKKyAgICByZXR1cm4gaVJldDsKKworICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOworICBlUGFyYW0ubV9lVHlwZSA9IGVFdmVudFR5cGU7CisgIGVQYXJhbS5tX3BUYXJnZXQgPSBwV2lkZ2V0QWNjOworICBlUGFyYW0ubV9iSXNGb3JtUmVhZHkgPSBiSXNGb3JtUmVhZHk7CisgIGlSZXQgfD0gWEZBX1Byb2Nlc3NFdmVudCh0aGlzLCBwV2lkZ2V0QWNjLCAmZVBhcmFtKTsKKworICByZXR1cm4gaVJldDsKK30KKworQ1hGQV9GRldpZGdldCogQ1hGQV9GRkRvY1ZpZXc6OkdldFdpZGdldEJ5TmFtZShjb25zdCBXaWRlU3RyaW5nJiB3c05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRkZXaWRnZXQqIHBSZWZXaWRnZXQpIHsKKyAgQ1hGQV9XaWRnZXRBY2MqIHBSZWZBY2MgPQorICAgICAgcFJlZldpZGdldCA/IHBSZWZXaWRnZXQtPkdldE5vZGUoKS0+R2V0V2lkZ2V0QWNjKCkgOiBudWxscHRyOworICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IEdldFdpZGdldEFjY0J5TmFtZSh3c05hbWUsIHBSZWZBY2MpOworICBpZiAoIXBBY2MpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBHZXRXaWRnZXRGb3JOb2RlKHBBY2MtPkdldE5vZGUoKSk7Cit9CisKK0NYRkFfV2lkZ2V0QWNjKiBDWEZBX0ZGRG9jVmlldzo6R2V0V2lkZ2V0QWNjQnlOYW1lKAorICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzTmFtZSwKKyAgICBDWEZBX1dpZGdldEFjYyogcFJlZldpZGdldEFjYykgeworICBXaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsKKyAgdWludDMyX3QgZHdTdHlsZSA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzIHwKKyAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQ7CisgIENGWEpTRV9FbmdpbmUqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0U2NyaXB0Q29udGV4dCgpOworICBpZiAoIXBTY3JpcHRDb250ZXh0KQorICAgIHJldHVybiBudWxscHRyOworCisgIENYRkFfTm9kZSogcmVmTm9kZSA9IG51bGxwdHI7CisgIGlmIChwUmVmV2lkZ2V0QWNjKSB7CisgICAgcmVmTm9kZSA9IHBSZWZXaWRnZXRBY2MtPkdldE5vZGUoKTsKKyAgICB3c0V4cHJlc3Npb24gPSB3c05hbWU7CisgIH0gZWxzZSB7CisgICAgd3NFeHByZXNzaW9uID0gTCIkZm9ybS4iICsgd3NOYW1lOworICB9CisKKyAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc29sdmVOb2RlUlM7CisgIGlmICghcFNjcmlwdENvbnRleHQtPlJlc29sdmVPYmplY3RzKHJlZk5vZGUsIHdzRXhwcmVzc2lvbi5Bc1N0cmluZ1ZpZXcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc29sdmVOb2RlUlMsIGR3U3R5bGUsIG51bGxwdHIpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBpZiAocmVzb2x2ZU5vZGVSUy5kd0ZsYWdzID09IFhGQV9SZXNvbHZlTm9kZV9SU1R5cGVfTm9kZXMpIHsKKyAgICBDWEZBX05vZGUqIHBOb2RlID0gcmVzb2x2ZU5vZGVSUy5vYmplY3RzLmZyb250KCktPkFzTm9kZSgpOworICAgIGlmIChwTm9kZSkKKyAgICAgIHJldHVybiBwTm9kZS0+R2V0V2lkZ2V0QWNjKCk7CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6Ok9uUGFnZUV2ZW50KENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcFNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RXZlbnQpIHsKKyAgQ1hGQV9GRlBhZ2VWaWV3KiBwRkZQYWdlVmlldyA9IHN0YXRpY19jYXN0PENYRkFfRkZQYWdlVmlldyo+KHBTZW5kZXIpOworICBtX3BEb2MtPkdldERvY0Vudmlyb25tZW50KCktPlBhZ2VWaWV3RXZlbnQocEZGUGFnZVZpZXcsIGR3RXZlbnQpOworfQorCisKK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkFkZEludmFsaWRhdGVSZWN0KENYRkFfRkZXaWRnZXQqIHBXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0SW52YWxpZGF0ZSkgeworICBBZGRJbnZhbGlkYXRlUmVjdChwV2lkZ2V0LT5HZXRQYWdlVmlldygpLCBydEludmFsaWRhdGUpOworfQorCit2b2lkIENYRkFfRkZEb2NWaWV3OjpBZGRJbnZhbGlkYXRlUmVjdChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRJbnZhbGlkYXRlKSB7CisgIGlmIChtX21hcFBhZ2VJbnZhbGlkYXRlW3BQYWdlVmlld10pIHsKKyAgICBtX21hcFBhZ2VJbnZhbGlkYXRlW3BQYWdlVmlld10tPlVuaW9uKHJ0SW52YWxpZGF0ZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgbV9tYXBQYWdlSW52YWxpZGF0ZVtwUGFnZVZpZXddID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9SZWN0Rj4ocnRJbnZhbGlkYXRlKTsKK30KKwordm9pZCBDWEZBX0ZGRG9jVmlldzo6UnVuSW52YWxpZGF0ZSgpIHsKKyAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbV9tYXBQYWdlSW52YWxpZGF0ZSkKKyAgICBtX3BEb2MtPkdldERvY0Vudmlyb25tZW50KCktPkludmFsaWRhdGVSZWN0KHBhaXIuZmlyc3QsICpwYWlyLnNlY29uZCk7CisKKyAgbV9tYXBQYWdlSW52YWxpZGF0ZS5jbGVhcigpOworfQorCitib29sIENYRkFfRkZEb2NWaWV3OjpSdW5MYXlvdXQoKSB7CisgIExvY2tVcGRhdGUoKTsKKyAgbV9iSW5MYXlvdXRTdGF0dXMgPSB0cnVlOworICBpZiAoIW1fcFhGQURvY0xheW91dC0+SW5jcmVtZW50TGF5b3V0KCkgJiYKKyAgICAgIG1fcFhGQURvY0xheW91dC0+U3RhcnRMYXlvdXQoKSA8IDEwMCkgeworICAgIG1fcFhGQURvY0xheW91dC0+RG9MYXlvdXQoKTsKKyAgICBVbmxvY2tVcGRhdGUoKTsKKyAgICBtX2JJbkxheW91dFN0YXR1cyA9IGZhbHNlOworICAgIG1fcERvYy0+R2V0RG9jRW52aXJvbm1lbnQoKS0+UGFnZVZpZXdFdmVudChudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUEFHRVZJRVdFVkVOVF9TdG9wTGF5b3V0KTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIG1fYkluTGF5b3V0U3RhdHVzID0gZmFsc2U7CisgIG1fcERvYy0+R2V0RG9jRW52aXJvbm1lbnQoKS0+UGFnZVZpZXdFdmVudChudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BBR0VWSUVXRVZFTlRfU3RvcExheW91dCk7CisgIFVubG9ja1VwZGF0ZSgpOworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlJ1blN1YmZvcm1JbmRleENoYW5nZSgpIHsKKyAgZm9yIChDWEZBX05vZGUqIHBTdWJmb3JtTm9kZSA6IG1fSW5kZXhDaGFuZ2VkU3ViZm9ybXMpIHsKKyAgICBpZiAoIXBTdWJmb3JtTm9kZS0+R2V0V2lkZ2V0QWNjKCkpCisgICAgICBjb250aW51ZTsKKworICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07CisgICAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfSW5kZXhDaGFuZ2U7CisgICAgZVBhcmFtLm1fcFRhcmdldCA9IHBTdWJmb3JtTm9kZS0+R2V0V2lkZ2V0QWNjKCk7CisgICAgcFN1YmZvcm1Ob2RlLT5Qcm9jZXNzRXZlbnQodGhpcywgWEZBX0F0dHJpYnV0ZUVudW06OkluZGV4Q2hhbmdlLCAmZVBhcmFtKTsKKyAgfQorICBtX0luZGV4Q2hhbmdlZFN1YmZvcm1zLmNsZWFyKCk7Cit9CisKK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkFkZE5ld0Zvcm1Ob2RlKENYRkFfTm9kZSogcE5vZGUpIHsKKyAgbV9OZXdBZGRlZE5vZGVzLnB1c2hfYmFjayhwTm9kZSk7CisgIEluaXRMYXlvdXQocE5vZGUpOworfQorCit2b2lkIENYRkFfRkZEb2NWaWV3OjpBZGRJbmRleENoYW5nZWRTdWJmb3JtKENYRkFfTm9kZSogcE5vZGUpIHsKKyAgQVNTRVJUKHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpTdWJmb3JtKTsKKyAgbV9JbmRleENoYW5nZWRTdWJmb3Jtcy5wdXNoX2JhY2socE5vZGUpOworfQorCit2b2lkIENYRkFfRkZEb2NWaWV3OjpSdW5Eb2NDbG9zZSgpIHsKKyAgQ1hGQV9Ob2RlKiBwUm9vdEl0ZW0gPQorICAgICAgVG9Ob2RlKG1fcERvYy0+R2V0WEZBRG9jKCktPkdldFhGQU9iamVjdChYRkFfSEFTSENPREVfRm9ybSkpOworICBpZiAoIXBSb290SXRlbSkKKyAgICByZXR1cm47CisKKyAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwUm9vdEl0ZW0sIFhGQV9FVkVOVF9Eb2NDbG9zZSwgZmFsc2UsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7Cit9CisKK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkRlc3Ryb3lEb2NWaWV3KCkgeworICBDbGVhckludmFsaWRhdGVMaXN0KCk7CisgIG1faVN0YXR1cyA9IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19Ob25lOworICBtX2lMb2NrID0gMDsKKyAgbV9WYWxpZGF0ZUFjY3MuY2xlYXIoKTsKKyAgbV9CaW5kSXRlbXMuY2xlYXIoKTsKKyAgbV9DYWxjdWxhdGVBY2NzLmNsZWFyKCk7Cit9CisKK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkFkZENhbGN1bGF0ZVdpZGdldEFjYyhDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYykgeworICBDWEZBX1dpZGdldEFjYyogcEN1cnJlbnRBY2MgPQorICAgICAgIW1fQ2FsY3VsYXRlQWNjcy5lbXB0eSgpID8gbV9DYWxjdWxhdGVBY2NzLmJhY2soKSA6IG51bGxwdHI7CisgIGlmIChwQ3VycmVudEFjYyAhPSBwV2lkZ2V0QWNjKQorICAgIG1fQ2FsY3VsYXRlQWNjcy5wdXNoX2JhY2socFdpZGdldEFjYyk7Cit9CisKK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkFkZENhbGN1bGF0ZU5vZGVOb3RpZnkoQ1hGQV9Ob2RlKiBwTm9kZUNoYW5nZSkgeworICBDWEZBX0NhbGNEYXRhKiBwR2xvYmFsRGF0YSA9IHBOb2RlQ2hhbmdlLT5KU09iamVjdCgpLT5HZXRDYWxjRGF0YSgpOworICBpZiAoIXBHbG9iYWxEYXRhKQorICAgIHJldHVybjsKKworICBmb3IgKGF1dG8qIHBSZXN1bHQgOiBwR2xvYmFsRGF0YS0+bV9HbG9iYWxzKSB7CisgICAgaWYgKCFwUmVzdWx0LT5IYXNSZW1vdmVkQ2hpbGRyZW4oKSkKKyAgICAgIEFkZENhbGN1bGF0ZVdpZGdldEFjYyhwUmVzdWx0LT5HZXRXaWRnZXRBY2MoKSk7CisgIH0KK30KKworc2l6ZV90IENYRkFfRkZEb2NWaWV3OjpSdW5DYWxjdWxhdGVSZWN1cnNpdmUoc2l6ZV90IGluZGV4KSB7CisgIHdoaWxlIChpbmRleCA8IG1fQ2FsY3VsYXRlQWNjcy5zaXplKCkpIHsKKyAgICBDWEZBX05vZGUqIG5vZGUgPSBtX0NhbGN1bGF0ZUFjY3NbaW5kZXhdLT5HZXROb2RlKCk7CisKKyAgICBBZGRDYWxjdWxhdGVOb2RlTm90aWZ5KG5vZGUpOworICAgIHNpemVfdCByZWN1cnNlID0gbm9kZS0+SlNPYmplY3QoKS0+R2V0Q2FsY1JlY3Vyc2lvbkNvdW50KCkgKyAxOworICAgIG5vZGUtPkpTT2JqZWN0KCktPlNldENhbGNSZWN1cnNpb25Db3VudChyZWN1cnNlKTsKKyAgICBpZiAocmVjdXJzZSA+IDExKQorICAgICAgYnJlYWs7CisgICAgaWYgKG5vZGUtPlByb2Nlc3NDYWxjdWxhdGUodGhpcykgPT0gWEZBX0VWRU5URVJST1JfU3VjY2VzcykKKyAgICAgIEFkZFZhbGlkYXRlV2lkZ2V0KG5vZGUtPkdldFdpZGdldEFjYygpKTsKKworICAgIGluZGV4ID0gUnVuQ2FsY3VsYXRlUmVjdXJzaXZlKCsraW5kZXgpOworICB9CisgIHJldHVybiBpbmRleDsKK30KKworaW50MzJfdCBDWEZBX0ZGRG9jVmlldzo6UnVuQ2FsY3VsYXRlV2lkZ2V0cygpIHsKKyAgaWYgKCFtX3BEb2MtPkdldERvY0Vudmlyb25tZW50KCktPklzQ2FsY3VsYXRpb25zRW5hYmxlZChtX3BEb2MuR2V0KCkpKQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9EaXNhYmxlZDsKKyAgaWYgKCFtX0NhbGN1bGF0ZUFjY3MuZW1wdHkoKSkKKyAgICBSdW5DYWxjdWxhdGVSZWN1cnNpdmUoMCk7CisKKyAgZm9yIChDWEZBX1dpZGdldEFjYyogcEN1ckFjYyA6IG1fQ2FsY3VsYXRlQWNjcykKKyAgICBwQ3VyQWNjLT5HZXROb2RlKCktPkpTT2JqZWN0KCktPlNldENhbGNSZWN1cnNpb25Db3VudCgwKTsKKworICBtX0NhbGN1bGF0ZUFjY3MuY2xlYXIoKTsKKyAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2Nlc3M7Cit9CisKK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkFkZFZhbGlkYXRlV2lkZ2V0KENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0KSB7CisgIGlmICghcGRmaXVtOjpDb250YWluc1ZhbHVlKG1fVmFsaWRhdGVBY2NzLCBwV2lkZ2V0KSkKKyAgICBtX1ZhbGlkYXRlQWNjcy5wdXNoX2JhY2socFdpZGdldCk7Cit9CisKK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OkluaXRDYWxjdWxhdGUoQ1hGQV9Ob2RlKiBwTm9kZSkgeworICBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBOb2RlLCBYRkFfRVZFTlRfSW5pdENhbGN1bGF0ZSwgZmFsc2UsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7Cit9CisKK3ZvaWQgQ1hGQV9GRkRvY1ZpZXc6OlByb2Nlc3NWYWx1ZUNoYW5nZWQoQ1hGQV9XaWRnZXRBY2MqIHdpZGdldEFjYykgeworICBBZGRWYWxpZGF0ZVdpZGdldCh3aWRnZXRBY2MpOworICBBZGRDYWxjdWxhdGVXaWRnZXRBY2Mod2lkZ2V0QWNjKTsKKyAgUnVuQ2FsY3VsYXRlV2lkZ2V0cygpOworICBSdW5WYWxpZGF0ZSgpOworfQorCitib29sIENYRkFfRkZEb2NWaWV3OjpJbml0VmFsaWRhdGUoQ1hGQV9Ob2RlKiBwTm9kZSkgeworICBpZiAoIW1fcERvYy0+R2V0RG9jRW52aXJvbm1lbnQoKS0+SXNWYWxpZGF0aW9uc0VuYWJsZWQobV9wRG9jLkdldCgpKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChwTm9kZSwgWEZBX0VWRU5UX1ZhbGlkYXRlLCBmYWxzZSwgdHJ1ZSwgbnVsbHB0cik7CisgIG1fVmFsaWRhdGVBY2NzLmNsZWFyKCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENYRkFfRkZEb2NWaWV3OjpSdW5WYWxpZGF0ZSgpIHsKKyAgaWYgKCFtX3BEb2MtPkdldERvY0Vudmlyb25tZW50KCktPklzVmFsaWRhdGlvbnNFbmFibGVkKG1fcERvYy5HZXQoKSkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZvciAoQ1hGQV9XaWRnZXRBY2MqIHBBY2MgOiBtX1ZhbGlkYXRlQWNjcykgeworICAgIENYRkFfTm9kZSogbm9kZSA9IHBBY2MtPkdldE5vZGUoKTsKKyAgICBpZiAoIW5vZGUtPkhhc1JlbW92ZWRDaGlsZHJlbigpKQorICAgICAgbm9kZS0+UHJvY2Vzc1ZhbGlkYXRlKHRoaXMsIDApOworICB9CisgIG1fVmFsaWRhdGVBY2NzLmNsZWFyKCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENYRkFfRkZEb2NWaWV3OjpSdW5FdmVudExheW91dFJlYWR5KCkgeworICBDWEZBX05vZGUqIHBSb290SXRlbSA9CisgICAgICBUb05vZGUobV9wRG9jLT5HZXRYRkFEb2MoKS0+R2V0WEZBT2JqZWN0KFhGQV9IQVNIQ09ERV9Gb3JtKSk7CisgIGlmICghcFJvb3RJdGVtKQorICAgIHJldHVybiBmYWxzZTsKKworICBFeGVjRXZlbnRBY3Rpdml0eUJ5RGVlcEZpcnN0KHBSb290SXRlbSwgWEZBX0VWRU5UX1JlYWR5LCBmYWxzZSwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgUnVuTGF5b3V0KCk7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENYRkFfRkZEb2NWaWV3OjpSdW5CaW5kSXRlbXMoKSB7CisgIGZvciAoYXV0byogaXRlbSA6IG1fQmluZEl0ZW1zKSB7CisgICAgaWYgKGl0ZW0tPkhhc1JlbW92ZWRDaGlsZHJlbigpKQorICAgICAgY29udGludWU7CisKKyAgICBDWEZBX05vZGUqIHBXaWRnZXROb2RlID0gaXRlbS0+R2V0UGFyZW50KCk7CisgICAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBwV2lkZ2V0Tm9kZS0+R2V0V2lkZ2V0QWNjKCk7CisgICAgaWYgKCFwQWNjKQorICAgICAgY29udGludWU7CisKKyAgICBDRlhKU0VfRW5naW5lKiBwU2NyaXB0Q29udGV4dCA9CisgICAgICAgIHBXaWRnZXROb2RlLT5HZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCk7CisgICAgV2lkZVN0cmluZyB3c1JlZiA9IGl0ZW0tPkdldFJlZigpOworICAgIHVpbnQzMl90IGR3U3R5bGUgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyB8CisgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfQUxMOworICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByczsKKyAgICBwU2NyaXB0Q29udGV4dC0+UmVzb2x2ZU9iamVjdHMocFdpZGdldE5vZGUsIHdzUmVmLkFzU3RyaW5nVmlldygpLCAmcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3U3R5bGUsIG51bGxwdHIpOworICAgIHBBY2MtPkRlbGV0ZUl0ZW0oLTEsIGZhbHNlLCBmYWxzZSk7CisgICAgaWYgKHJzLmR3RmxhZ3MgIT0gWEZBX1Jlc29sdmVOb2RlX1JTVHlwZV9Ob2RlcyB8fCBycy5vYmplY3RzLmVtcHR5KCkpCisgICAgICBjb250aW51ZTsKKworICAgIFdpZGVTdHJpbmcgd3NWYWx1ZVJlZiA9IGl0ZW0tPkdldFZhbHVlUmVmKCk7CisgICAgV2lkZVN0cmluZyB3c0xhYmVsUmVmID0gaXRlbS0+R2V0TGFiZWxSZWYoKTsKKyAgICBjb25zdCBib29sIGJVc2VWYWx1ZSA9IHdzTGFiZWxSZWYuSXNFbXB0eSgpIHx8IHdzTGFiZWxSZWYgPT0gd3NWYWx1ZVJlZjsKKyAgICBjb25zdCBib29sIGJMYWJlbFVzZUNvbnRlbnQgPSB3c0xhYmVsUmVmLklzRW1wdHkoKSB8fCB3c0xhYmVsUmVmID09IEwiJCI7CisgICAgY29uc3QgYm9vbCBiVmFsdWVVc2VDb250ZW50ID0gd3NWYWx1ZVJlZi5Jc0VtcHR5KCkgfHwgd3NWYWx1ZVJlZiA9PSBMIiQiOworICAgIFdpZGVTdHJpbmcgd3NWYWx1ZTsKKyAgICBXaWRlU3RyaW5nIHdzTGFiZWw7CisgICAgdWludDMyX3QgdVZhbHVlSGFzaCA9IEZYX0hhc2hDb2RlX0dldFcod3NWYWx1ZVJlZi5Bc1N0cmluZ1ZpZXcoKSwgZmFsc2UpOworICAgIGZvciAoQ1hGQV9PYmplY3QqIHJlZk9iamVjdCA6IHJzLm9iamVjdHMpIHsKKyAgICAgIENYRkFfTm9kZSogcmVmTm9kZSA9IHJlZk9iamVjdC0+QXNOb2RlKCk7CisgICAgICBpZiAoIXJlZk5vZGUpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAoYlZhbHVlVXNlQ29udGVudCkgeworICAgICAgICB3c1ZhbHVlID0gcmVmTm9kZS0+SlNPYmplY3QoKS0+R2V0Q29udGVudChmYWxzZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBDWEZBX05vZGUqIG5vZGVWYWx1ZSA9IHJlZk5vZGUtPkdldEZpcnN0Q2hpbGRCeU5hbWUodVZhbHVlSGFzaCk7CisgICAgICAgIHdzVmFsdWUgPSBub2RlVmFsdWUgPyBub2RlVmFsdWUtPkpTT2JqZWN0KCktPkdldENvbnRlbnQoZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByZWZOb2RlLT5KU09iamVjdCgpLT5HZXRDb250ZW50KGZhbHNlKTsKKyAgICAgIH0KKworICAgICAgaWYgKCFiVXNlVmFsdWUpIHsKKyAgICAgICAgaWYgKGJMYWJlbFVzZUNvbnRlbnQpIHsKKyAgICAgICAgICB3c0xhYmVsID0gcmVmTm9kZS0+SlNPYmplY3QoKS0+R2V0Q29udGVudChmYWxzZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgQ1hGQV9Ob2RlKiBub2RlTGFiZWwgPQorICAgICAgICAgICAgICByZWZOb2RlLT5HZXRGaXJzdENoaWxkQnlOYW1lKHdzTGFiZWxSZWYuQXNTdHJpbmdWaWV3KCkpOworICAgICAgICAgIGlmIChub2RlTGFiZWwpCisgICAgICAgICAgICB3c0xhYmVsID0gbm9kZUxhYmVsLT5KU09iamVjdCgpLT5HZXRDb250ZW50KGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgd3NMYWJlbCA9IHdzVmFsdWU7CisgICAgICB9CisgICAgICBwQWNjLT5JbnNlcnRJdGVtKHdzTGFiZWwsIHdzVmFsdWUsIGZhbHNlKTsKKyAgICB9CisgIH0KKyAgbV9CaW5kSXRlbXMuY2xlYXIoKTsKK30KKwordm9pZCBDWEZBX0ZGRG9jVmlldzo6U2V0Q2hhbmdlTWFyaygpIHsKKyAgaWYgKG1faVN0YXR1cyA8IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19FbmQpCisgICAgcmV0dXJuOworCisgIG1fcERvYy0+R2V0RG9jRW52aXJvbm1lbnQoKS0+U2V0Q2hhbmdlTWFyayhtX3BEb2MuR2V0KCkpOworfQorCitDWEZBX1N1YmZvcm0qIENYRkFfRkZEb2NWaWV3OjpHZXRSb290U3ViZm9ybSgpIHsKKyAgQ1hGQV9Ob2RlKiBwRm9ybVBhY2tldE5vZGUgPQorICAgICAgVG9Ob2RlKG1fcERvYy0+R2V0WEZBRG9jKCktPkdldFhGQU9iamVjdChYRkFfSEFTSENPREVfRm9ybSkpOworICBpZiAoIXBGb3JtUGFja2V0Tm9kZSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICByZXR1cm4gcEZvcm1QYWNrZXROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX1N1YmZvcm0+KAorICAgICAgWEZBX0VsZW1lbnQ6OlN1YmZvcm0pOworfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZmRvY3ZpZXcuaCBiL3hmYS9meGZhL2N4ZmFfZmZkb2N2aWV3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4ZjAxNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZmZkb2N2aWV3LmgKQEAgLTAsMCArMSwxNDMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9DWEZBX0ZGRE9DVklFV19IXworI2RlZmluZSBYRkFfRlhGQV9DWEZBX0ZGRE9DVklFV19IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9ldmVudHBhcmFtLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRvYy5oIgorCitjbGFzcyBDWEZBX0JpbmRJdGVtczsKK2NsYXNzIENYRkFfRkZXaWRnZXRIYW5kbGVyOworY2xhc3MgQ1hGQV9GRkRvYzsKK2NsYXNzIENYRkFfRkZXaWRnZXQ7CitjbGFzcyBDWEZBX1N1YmZvcm07CitjbGFzcyBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yOworCitleHRlcm4gY29uc3QgWEZBX0F0dHJpYnV0ZUVudW0gZ3NfRXZlbnRBY3Rpdml0eVtdOworZW51bSBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVMgeworICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfTm9uZSwKKyAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX1N0YXJ0LAorICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRm9ybUluaXRpYWxpemUsCisgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19Gb3JtSW5pdENhbGN1bGF0ZSwKKyAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0Zvcm1Jbml0VmFsaWRhdGUsCisgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19Gb3JtRm9ybVJlYWR5LAorICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRG9pbmcsCisgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19QYWdlc2V0SW5pdGlhbGl6ZSwKKyAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX1BhZ2VzZXRJbml0Q2FsY3VsYXRlLAorICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfUGFnZXNldEluaXRWYWxpZGF0ZSwKKyAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX1BhZ2VzZXRGb3JtUmVhZHksCisgIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19MYXlvdXRSZWFkeSwKKyAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0RvY1JlYWR5LAorICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRW5kCit9OworCitjbGFzcyBDWEZBX0ZGRG9jVmlldyB7CisgcHVibGljOgorICBleHBsaWNpdCBDWEZBX0ZGRG9jVmlldyhDWEZBX0ZGRG9jKiBwRG9jKTsKKyAgfkNYRkFfRkZEb2NWaWV3KCk7CisKKyAgQ1hGQV9GRkRvYyogR2V0RG9jKCkgeyByZXR1cm4gbV9wRG9jLkdldCgpOyB9CisgIGludDMyX3QgU3RhcnRMYXlvdXQoaW50MzJfdCBpU3RhcnRQYWdlID0gMCk7CisgIGludDMyX3QgRG9MYXlvdXQoKTsKKyAgdm9pZCBTdG9wTGF5b3V0KCk7CisgIGludDMyX3QgR2V0TGF5b3V0U3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbV9pU3RhdHVzOyB9CisgIHZvaWQgVXBkYXRlRG9jVmlldygpOworICBpbnQzMl90IENvdW50UGFnZVZpZXdzKCkgY29uc3Q7CisgIENYRkFfRkZQYWdlVmlldyogR2V0UGFnZVZpZXcoaW50MzJfdCBuSW5kZXgpIGNvbnN0OworCisgIHZvaWQgUmVzZXRXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpOworICBpbnQzMl90IFByb2Nlc3NXaWRnZXRFdmVudChDWEZBX0V2ZW50UGFyYW0qIHBQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpOworICBDWEZBX0ZGV2lkZ2V0SGFuZGxlciogR2V0V2lkZ2V0SGFuZGxlcigpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9XaWRnZXRBY2NJdGVyYXRvcj4gQ3JlYXRlV2lkZ2V0QWNjSXRlcmF0b3IoKTsKKyAgQ1hGQV9GRldpZGdldCogR2V0Rm9jdXNXaWRnZXQoKSBjb25zdCB7IHJldHVybiBtX3BGb2N1c1dpZGdldC5HZXQoKTsgfQorICB2b2lkIEtpbGxGb2N1cygpOworICBib29sIFNldEZvY3VzKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQpOworICBDWEZBX0ZGV2lkZ2V0KiBHZXRXaWRnZXRGb3JOb2RlKENYRkFfTm9kZSogbm9kZSk7CisgIENYRkFfRkZXaWRnZXQqIEdldFdpZGdldEJ5TmFtZShjb25zdCBXaWRlU3RyaW5nJiB3c05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZGV2lkZ2V0KiBwUmVmV2lkZ2V0KTsKKyAgQ1hGQV9XaWRnZXRBY2MqIEdldFdpZGdldEFjY0J5TmFtZShjb25zdCBXaWRlU3RyaW5nJiB3c05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBSZWZXaWRnZXRBY2MpOworICBDWEZBX0xheW91dFByb2Nlc3NvciogR2V0WEZBTGF5b3V0KCkgY29uc3Q7CisgIHZvaWQgT25QYWdlRXZlbnQoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwU2VuZGVyLCB1aW50MzJfdCBkd0V2ZW50KTsKKyAgdm9pZCBMb2NrVXBkYXRlKCkgeyBtX2lMb2NrKys7IH0KKyAgdm9pZCBVbmxvY2tVcGRhdGUoKSB7IG1faUxvY2stLTsgfQorICBib29sIElzVXBkYXRlTG9ja2VkKCkgeyByZXR1cm4gbV9pTG9jayA+IDA7IH0KKyAgdm9pZCBDbGVhckludmFsaWRhdGVMaXN0KCkgeyBtX21hcFBhZ2VJbnZhbGlkYXRlLmNsZWFyKCk7IH0KKyAgdm9pZCBBZGRJbnZhbGlkYXRlUmVjdChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0LCBjb25zdCBDRlhfUmVjdEYmIHJ0SW52YWxpZGF0ZSk7CisgIHZvaWQgQWRkSW52YWxpZGF0ZVJlY3QoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEludmFsaWRhdGUpOworICB2b2lkIFJ1bkludmFsaWRhdGUoKTsKKyAgdm9pZCBSdW5Eb2NDbG9zZSgpOworICB2b2lkIERlc3Ryb3lEb2NWaWV3KCk7CisKKyAgdm9pZCBQcm9jZXNzVmFsdWVDaGFuZ2VkKENYRkFfV2lkZ2V0QWNjKiB3aWRnZXRBY2MpOworCisgIGJvb2wgSW5pdFZhbGlkYXRlKENYRkFfTm9kZSogcE5vZGUpOworICBib29sIFJ1blZhbGlkYXRlKCk7CisKKyAgdm9pZCBTZXRDaGFuZ2VNYXJrKCk7CisKKyAgdm9pZCBBZGRWYWxpZGF0ZVdpZGdldChDWEZBX1dpZGdldEFjYyogcFdpZGdldCk7CisgIHZvaWQgQWRkQ2FsY3VsYXRlTm9kZU5vdGlmeShDWEZBX05vZGUqIHBOb2RlQ2hhbmdlKTsKKyAgdm9pZCBBZGRDYWxjdWxhdGVXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpOworICBpbnQzMl90IFJ1bkNhbGN1bGF0ZVdpZGdldHMoKTsKKyAgYm9vbCBJc1N0YXRpY05vdGlmeSgpIHsKKyAgICByZXR1cm4gbV9wRG9jLT5HZXRGb3JtVHlwZSgpID09IEZvcm1UeXBlOjprWEZBRm9yZWdyb3VuZDsKKyAgfQorICBib29sIFJ1bkxheW91dCgpOworICB2b2lkIFJ1blN1YmZvcm1JbmRleENoYW5nZSgpOworICB2b2lkIEFkZE5ld0Zvcm1Ob2RlKENYRkFfTm9kZSogcE5vZGUpOworICB2b2lkIEFkZEluZGV4Q2hhbmdlZFN1YmZvcm0oQ1hGQV9Ob2RlKiBwTm9kZSk7CisgIENYRkFfV2lkZ2V0QWNjKiBHZXRGb2N1c1dpZGdldEFjYygpIGNvbnN0IHsgcmV0dXJuIG1fcEZvY3VzQWNjLkdldCgpOyB9CisgIHZvaWQgU2V0Rm9jdXNXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpOworICB2b2lkIERlbGV0ZUxheW91dEl0ZW0oQ1hGQV9GRldpZGdldCogcFdpZGdldCk7CisgIGludDMyX3QgRXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdChDWEZBX05vZGUqIHBGb3JtTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYklzRm9ybVJlYWR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmVjdXJzaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRXhjbHVkZSk7CisKKyAgdm9pZCBBZGRCaW5kSXRlbShDWEZBX0JpbmRJdGVtcyogaXRlbSkgeyBtX0JpbmRJdGVtcy5wdXNoX2JhY2soaXRlbSk7IH0KKworICBib29sIG1fYkxheW91dEV2ZW50OworICBzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nPiBtX2Fyck51bGxUZXN0TXNnOworICBDWEZBX0ZGV2lkZ2V0KiBtX3BMaXN0Rm9jdXNXaWRnZXQ7CisgIGJvb2wgbV9iSW5MYXlvdXRTdGF0dXM7CisKKyBwcml2YXRlOgorICBib29sIFJ1bkV2ZW50TGF5b3V0UmVhZHkoKTsKKyAgdm9pZCBSdW5CaW5kSXRlbXMoKTsKKyAgdm9pZCBJbml0Q2FsY3VsYXRlKENYRkFfTm9kZSogcE5vZGUpOworICB2b2lkIEluaXRMYXlvdXQoQ1hGQV9Ob2RlKiBwTm9kZSk7CisgIHNpemVfdCBSdW5DYWxjdWxhdGVSZWN1cnNpdmUoc2l6ZV90IGluZGV4KTsKKyAgdm9pZCBTaG93TnVsbFRlc3RNc2coKTsKKyAgYm9vbCBSZXNldFNpbmdsZVdpZGdldEFjY0RhdGEoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpOworICBDWEZBX1N1YmZvcm0qIEdldFJvb3RTdWJmb3JtKCk7CisKKyAgVW5vd25lZFB0cjxDWEZBX0ZGRG9jPiBjb25zdCBtX3BEb2M7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZGV2lkZ2V0SGFuZGxlcj4gbV9wV2lkZ2V0SGFuZGxlcjsKKyAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIG1fcFhGQURvY0xheW91dDsgIC8vIE5vdCBvd25lZC4KKyAgVW5vd25lZFB0cjxDWEZBX1dpZGdldEFjYz4gbV9wRm9jdXNBY2M7CisgIFVub3duZWRQdHI8Q1hGQV9GRldpZGdldD4gbV9wRm9jdXNXaWRnZXQ7CisgIFVub3duZWRQdHI8Q1hGQV9GRldpZGdldD4gbV9wT2xkRm9jdXNXaWRnZXQ7CisgIHN0ZDo6bWFwPENYRkFfRkZQYWdlVmlldyosIHN0ZDo6dW5pcXVlX3B0cjxDRlhfUmVjdEY+PiBtX21hcFBhZ2VJbnZhbGlkYXRlOworICBzdGQ6OnZlY3RvcjxDWEZBX1dpZGdldEFjYyo+IG1fVmFsaWRhdGVBY2NzOworICBzdGQ6OnZlY3RvcjxDWEZBX1dpZGdldEFjYyo+IG1fQ2FsY3VsYXRlQWNjczsKKyAgc3RkOjp2ZWN0b3I8Q1hGQV9CaW5kSXRlbXMqPiBtX0JpbmRJdGVtczsKKyAgc3RkOjp2ZWN0b3I8Q1hGQV9Ob2RlKj4gbV9OZXdBZGRlZE5vZGVzOworICBzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPiBtX0luZGV4Q2hhbmdlZFN1YmZvcm1zOworICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVMgbV9pU3RhdHVzOworICBpbnQzMl90IG1faUxvY2s7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX0NYRkFfRkZET0NWSUVXX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX2ZmZHJhdy5jcHAgYi94ZmEvZnhmYS9jeGZhX2ZmZHJhdy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwYmRlMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZmZkcmF3LmNwcApAQCAtMCwwICsxLDE2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZHJhdy5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmFwcC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZkb2MuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0LmgiCisKK0NYRkFfRkZEcmF3OjpDWEZBX0ZGRHJhdyhDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRkZXaWRnZXQocE5vZGUpIHt9CisKK0NYRkFfRkZEcmF3Ojp+Q1hGQV9GRkRyYXcoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZmRyYXcuaCBiL3hmYS9meGZhL2N4ZmFfZmZkcmF3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU5Y2ZjZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZmZkcmF3LmgKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX0NYRkFfRkZEUkFXX0hfCisjZGVmaW5lIFhGQV9GWEZBX0NYRkFfRkZEUkFXX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0LmgiCisKK2NsYXNzIENYRkFfRkZEcmF3IDogcHVibGljIENYRkFfRkZXaWRnZXQgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1hGQV9GRkRyYXcoQ1hGQV9Ob2RlKiBwTm9kZSk7CisgIH5DWEZBX0ZGRHJhdygpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9DWEZBX0ZGRFJBV19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZmV4Y2xncm91cC5jcHAgYi94ZmEvZnhmYS9jeGZhX2ZmZXhjbGdyb3VwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTg3NTJiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9mZmV4Y2xncm91cC5jcHAKQEAgLTAsMCArMSwyOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmV4Y2xncm91cC5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmFwcC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZkb2MuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0LmgiCisKK0NYRkFfRkZFeGNsR3JvdXA6OkNYRkFfRkZFeGNsR3JvdXAoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0ZGV2lkZ2V0KHBOb2RlKSB7fQorCitDWEZBX0ZGRXhjbEdyb3VwOjp+Q1hGQV9GRkV4Y2xHcm91cCgpIHt9CisKK3ZvaWQgQ1hGQV9GRkV4Y2xHcm91cDo6UmVuZGVyV2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSB7CisgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKQorICAgIHJldHVybjsKKworICBDRlhfTWF0cml4IG10Um90YXRlID0gR2V0Um90YXRlTWF0cml4KCk7CisgIG10Um90YXRlLkNvbmNhdChtYXRyaXgpOworCisgIENYRkFfRkZXaWRnZXQ6OlJlbmRlcldpZGdldChwR1MsIG10Um90YXRlLCBkd1N0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX2ZmZXhjbGdyb3VwLmggYi94ZmEvZnhmYS9jeGZhX2ZmZXhjbGdyb3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkwNDMwMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZmZleGNsZ3JvdXAuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfQ1hGQV9GRkVYQ0xHUk9VUF9IXworI2RlZmluZSBYRkFfRlhGQV9DWEZBX0ZGRVhDTEdST1VQX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0LmgiCisKK2NsYXNzIENYRkFfRkZFeGNsR3JvdXAgOiBwdWJsaWMgQ1hGQV9GRldpZGdldCB7CisgcHVibGljOgorICBleHBsaWNpdCBDWEZBX0ZGRXhjbEdyb3VwKENYRkFfTm9kZSogcE5vZGUpOworICB+Q1hGQV9GRkV4Y2xHcm91cCgpIG92ZXJyaWRlOworCisgIC8vIENYRkFfRkZXaWRnZXQKKyAgdm9pZCBSZW5kZXJXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfQ1hGQV9GRkVYQ0xHUk9VUF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZmZpZWxkLmNwcCBiL3hmYS9meGZhL2N4ZmFfZmZmaWVsZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0MzU5ZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZmZmaWVsZC5jcHAKQEAgLTAsMCArMSw3ODEgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZmaWVsZC5oIgorCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2VkaXQuaCIKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfZXZlbnRtb3VzZS5oIgorI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9tZXNzYWdla2V5LmgiCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX21lc3NhZ2VraWxsZm9jdXMuaCIKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfbWVzc2FnZW1vdXNlLmgiCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX21lc3NhZ2Vtb3VzZXdoZWVsLmgiCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX21lc3NhZ2VzZXRmb2N1cy5oIgorI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9waWN0dXJlYm94LmgiCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3dpZGdldG1nci5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZhcHAuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZG9jLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRvY3ZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9md2x0aGVtZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfdGV4dGxheW91dC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2JvcmRlci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NhbGN1bGF0ZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NhcHRpb24uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tYXJnaW4uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2NyaXB0LmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZWNvbG9yLmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXBhdGguaCIKKworbmFtZXNwYWNlIHsKKworQ1hGQV9GRkZpZWxkKiBUb0ZpZWxkKENYRkFfTGF5b3V0SXRlbSogd2lkZ2V0KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGRmllbGQqPih3aWRnZXQpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9GRkZpZWxkOjpDWEZBX0ZGRmllbGQoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0ZGV2lkZ2V0KHBOb2RlKSB7fQorCitDWEZBX0ZGRmllbGQ6On5DWEZBX0ZGRmllbGQoKSB7CisgIENYRkFfRkZGaWVsZDo6VW5sb2FkV2lkZ2V0KCk7Cit9CisKK0NGWF9SZWN0RiBDWEZBX0ZGRmllbGQ6OkdldEJCb3godWludDMyX3QgZHdTdGF0dXMsIGJvb2wgYkRyYXdGb2N1cykgeworICBpZiAoIWJEcmF3Rm9jdXMpCisgICAgcmV0dXJuIENYRkFfRkZXaWRnZXQ6OkdldEJCb3goZHdTdGF0dXMpOworCisgIFhGQV9FbGVtZW50IHR5cGUgPSBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0VUlUeXBlKCk7CisgIGlmICh0eXBlICE9IFhGQV9FbGVtZW50OjpCdXR0b24gJiYgdHlwZSAhPSBYRkFfRWxlbWVudDo6Q2hlY2tCdXR0b24gJiYKKyAgICAgIHR5cGUgIT0gWEZBX0VsZW1lbnQ6OkltYWdlRWRpdCAmJiB0eXBlICE9IFhGQV9FbGVtZW50OjpTaWduYXR1cmUgJiYKKyAgICAgIHR5cGUgIT0gWEZBX0VsZW1lbnQ6OkNob2ljZUxpc3QpIHsKKyAgICByZXR1cm4gQ0ZYX1JlY3RGKCk7CisgIH0KKworICByZXR1cm4gR2V0Um90YXRlTWF0cml4KCkuVHJhbnNmb3JtUmVjdChtX3J0VUkpOworfQorCit2b2lkIENYRkFfRkZGaWVsZDo6UmVuZGVyV2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cykgeworICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkKKyAgICByZXR1cm47CisKKyAgQ0ZYX01hdHJpeCBtdFJvdGF0ZSA9IEdldFJvdGF0ZU1hdHJpeCgpOworICBtdFJvdGF0ZS5Db25jYXQobWF0cml4KTsKKworICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCBtdFJvdGF0ZSwgZHdTdGF0dXMpOworICBEcmF3Qm9yZGVyKHBHUywgbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldFVJQm9yZGVyKCksIG1fcnRVSSwgbXRSb3RhdGUpOworICBSZW5kZXJDYXB0aW9uKHBHUywgJm10Um90YXRlKTsKKyAgRHJhd0hpZ2hsaWdodChwR1MsICZtdFJvdGF0ZSwgZHdTdGF0dXMsIGZhbHNlKTsKKworICBDRlhfUmVjdEYgcnRXaWRnZXQgPSBtX3BOb3JtYWxXaWRnZXQtPkdldFdpZGdldFJlY3QoKTsKKyAgQ0ZYX01hdHJpeCBtdCgxLCAwLCAwLCAxLCBydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3ApOworICBtdC5Db25jYXQobXRSb3RhdGUpOworICBHZXRBcHAoKS0+R2V0RldMV2lkZ2V0TWdyKCktPk9uRHJhd1dpZGdldChtX3BOb3JtYWxXaWRnZXQuZ2V0KCksIHBHUywgbXQpOworfQorCit2b2lkIENYRkFfRkZGaWVsZDo6RHJhd0hpZ2hsaWdodChDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBwTWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJFbGxpcHNlKSB7CisgIGlmIChtX3J0VUkuSXNFbXB0eSgpIHx8ICFHZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkKKyAgICByZXR1cm47CisgIGlmICghKGR3U3RhdHVzICYgWEZBX1dpZGdldFN0YXR1c19IaWdobGlnaHQpIHx8ICFtX3BOb2RlLT5Jc09wZW5BY2Nlc3MoKSkKKyAgICByZXR1cm47CisKKyAgQ1hGQV9GRkRvYyogcERvYyA9IEdldERvYygpOworICBwR1MtPlNldEZpbGxDb2xvcigKKyAgICAgIENYRkFfR0VDb2xvcihwRG9jLT5HZXREb2NFbnZpcm9ubWVudCgpLT5HZXRIaWdobGlnaHRDb2xvcihwRG9jKSkpOworICBDWEZBX0dFUGF0aCBwYXRoOworICBpZiAoYkVsbGlwc2UpCisgICAgcGF0aC5BZGRFbGxpcHNlKG1fcnRVSSk7CisgIGVsc2UKKyAgICBwYXRoLkFkZFJlY3RhbmdsZShtX3J0VUkubGVmdCwgbV9ydFVJLnRvcCwgbV9ydFVJLndpZHRoLCBtX3J0VUkuaGVpZ2h0KTsKKworICBwR1MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfV0lORElORywgcE1hdHJpeCk7Cit9CisKK3ZvaWQgQ1hGQV9GRkZpZWxkOjpEcmF3Rm9jdXMoQ1hGQV9HcmFwaGljcyogcEdTLCBDRlhfTWF0cml4KiBwTWF0cml4KSB7CisgIGlmICghKG1fZHdTdGF0dXMgJiBYRkFfV2lkZ2V0U3RhdHVzX0ZvY3VzZWQpKQorICAgIHJldHVybjsKKworICBwR1MtPlNldFN0cm9rZUNvbG9yKENYRkFfR0VDb2xvcigweEZGMDAwMDAwKSk7CisKKyAgZmxvYXQgRGFzaFBhdHRlcm5bMl0gPSB7MSwgMX07CisgIHBHUy0+U2V0TGluZURhc2goMC4wZiwgRGFzaFBhdHRlcm4sIDIpOworICBwR1MtPlNldExpbmVXaWR0aCgwKTsKKworICBDWEZBX0dFUGF0aCBwYXRoOworICBwYXRoLkFkZFJlY3RhbmdsZShtX3J0VUkubGVmdCwgbV9ydFVJLnRvcCwgbV9ydFVJLndpZHRoLCBtX3J0VUkuaGVpZ2h0KTsKKyAgcEdTLT5TdHJva2VQYXRoKCZwYXRoLCBwTWF0cml4KTsKK30KKwordm9pZCBDWEZBX0ZGRmllbGQ6OlNldEZXTFRoZW1lUHJvdmlkZXIoKSB7CisgIGlmIChtX3BOb3JtYWxXaWRnZXQpCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRUaGVtZVByb3ZpZGVyKEdldEFwcCgpLT5HZXRGV0xUaGVtZSgpKTsKK30KKworYm9vbCBDWEZBX0ZGRmllbGQ6OklzTG9hZGVkKCkgeworICByZXR1cm4gbV9wTm9ybWFsV2lkZ2V0ICYmIENYRkFfRkZXaWRnZXQ6OklzTG9hZGVkKCk7Cit9CisKK2Jvb2wgQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCkgeworICBTZXRGV0xUaGVtZVByb3ZpZGVyKCk7CisgIG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5Mb2FkQ2FwdGlvbihHZXREb2MoKSk7CisgIFBlcmZvcm1MYXlvdXQoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ1hGQV9GRkZpZWxkOjpVbmxvYWRXaWRnZXQoKSB7CisgIG1fcE5vcm1hbFdpZGdldC5yZXNldCgpOworfQorCit2b2lkIENYRkFfRkZGaWVsZDo6U2V0RWRpdFNjcm9sbE9mZnNldCgpIHsKKyAgWEZBX0VsZW1lbnQgZVR5cGUgPSBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0VUlUeXBlKCk7CisgIGlmIChlVHlwZSAhPSBYRkFfRWxlbWVudDo6VGV4dEVkaXQgJiYgZVR5cGUgIT0gWEZBX0VsZW1lbnQ6Ok51bWVyaWNFZGl0ICYmCisgICAgICBlVHlwZSAhPSBYRkFfRWxlbWVudDo6UGFzc3dvcmRFZGl0KSB7CisgICAgcmV0dXJuOworICB9CisKKyAgZmxvYXQgZlNjcm9sbE9mZnNldCA9IDA7CisgIENYRkFfRkZGaWVsZCogcFByZXYgPSBUb0ZpZWxkKEdldFByZXYoKSk7CisgIGlmIChwUHJldikgeworICAgIENGWF9SZWN0RiBydE1hcmdpbiA9IG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRVSU1hcmdpbigpOworICAgIGZTY3JvbGxPZmZzZXQgPSAtcnRNYXJnaW4udG9wOworICB9CisKKyAgd2hpbGUgKHBQcmV2KSB7CisgICAgZlNjcm9sbE9mZnNldCArPSBwUHJldi0+bV9ydFVJLmhlaWdodDsKKyAgICBwUHJldiA9IFRvRmllbGQocFByZXYtPkdldFByZXYoKSk7CisgIH0KKyAgc3RhdGljX2Nhc3Q8Q0ZXTF9FZGl0Kj4obV9wTm9ybWFsV2lkZ2V0LmdldCgpKQorICAgICAgLT5TZXRTY3JvbGxPZmZzZXQoZlNjcm9sbE9mZnNldCk7Cit9CisKK2Jvb2wgQ1hGQV9GRkZpZWxkOjpQZXJmb3JtTGF5b3V0KCkgeworICBDWEZBX0ZGV2lkZ2V0OjpQZXJmb3JtTGF5b3V0KCk7CisgIENhcFBsYWNlbWVudCgpOworICBMYXlvdXRDYXB0aW9uKCk7CisgIFNldEZXTFJlY3QoKTsKKyAgU2V0RWRpdFNjcm9sbE9mZnNldCgpOworICBpZiAobV9wTm9ybWFsV2lkZ2V0KQorICAgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENYRkFfRkZGaWVsZDo6Q2FwUGxhY2VtZW50KCkgeworICBDRlhfUmVjdEYgcnRXaWRnZXQgPSBHZXRSZWN0V2l0aG91dFJvdGF0ZSgpOworICBDWEZBX01hcmdpbiogbWFyZ2luID0gbV9wTm9kZS0+R2V0TWFyZ2luSWZFeGlzdHMoKTsKKyAgaWYgKG1hcmdpbikgeworICAgIENYRkFfTGF5b3V0SXRlbSogcEl0ZW0gPSB0aGlzOworICAgIGZsb2F0IGZMZWZ0SW5zZXQgPSBtYXJnaW4tPkdldExlZnRJbnNldCgpOworICAgIGZsb2F0IGZSaWdodEluc2V0ID0gbWFyZ2luLT5HZXRSaWdodEluc2V0KCk7CisgICAgZmxvYXQgZlRvcEluc2V0ID0gbWFyZ2luLT5HZXRUb3BJbnNldCgpOworICAgIGZsb2F0IGZCb3R0b21JbnNldCA9IG1hcmdpbi0+R2V0Qm90dG9tSW5zZXQoKTsKKyAgICBpZiAoIXBJdGVtLT5HZXRQcmV2KCkgJiYgIXBJdGVtLT5HZXROZXh0KCkpIHsKKyAgICAgIHJ0V2lkZ2V0LkRlZmxhdGUoZkxlZnRJbnNldCwgZlRvcEluc2V0LCBmUmlnaHRJbnNldCwgZkJvdHRvbUluc2V0KTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFwSXRlbS0+R2V0UHJldigpKQorICAgICAgICBydFdpZGdldC5EZWZsYXRlKGZMZWZ0SW5zZXQsIGZUb3BJbnNldCwgZlJpZ2h0SW5zZXQsIDApOworICAgICAgZWxzZSBpZiAoIXBJdGVtLT5HZXROZXh0KCkpCisgICAgICAgIHJ0V2lkZ2V0LkRlZmxhdGUoZkxlZnRJbnNldCwgMCwgZlJpZ2h0SW5zZXQsIGZCb3R0b21JbnNldCk7CisgICAgICBlbHNlCisgICAgICAgIHJ0V2lkZ2V0LkRlZmxhdGUoZkxlZnRJbnNldCwgMCwgZlJpZ2h0SW5zZXQsIDApOworICAgIH0KKyAgfQorCisgIFhGQV9BdHRyaWJ1dGVFbnVtIGlDYXBQbGFjZW1lbnQgPSBYRkFfQXR0cmlidXRlRW51bTo6VW5rbm93bjsKKyAgZmxvYXQgZkNhcFJlc2VydmUgPSAwOworICBDWEZBX0NhcHRpb24qIGNhcHRpb24gPSBtX3BOb2RlLT5HZXRDYXB0aW9uSWZFeGlzdHMoKTsKKyAgaWYgKGNhcHRpb24gJiYgIWNhcHRpb24tPklzSGlkZGVuKCkpIHsKKyAgICBpQ2FwUGxhY2VtZW50ID0gY2FwdGlvbi0+R2V0UGxhY2VtZW50VHlwZSgpOworICAgIGlmIChpQ2FwUGxhY2VtZW50ID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpUb3AgJiYgR2V0UHJldigpKSB7CisgICAgICBtX3J0Q2FwdGlvbi5SZXNldCgpOworICAgIH0gZWxzZSBpZiAoaUNhcFBsYWNlbWVudCA9PSBYRkFfQXR0cmlidXRlRW51bTo6Qm90dG9tICYmIEdldE5leHQoKSkgeworICAgICAgbV9ydENhcHRpb24uUmVzZXQoKTsKKyAgICB9IGVsc2UgeworICAgICAgZkNhcFJlc2VydmUgPSBjYXB0aW9uLT5HZXRSZXNlcnZlKCk7CisgICAgICBDWEZBX0xheW91dEl0ZW0qIHBJdGVtID0gdGhpczsKKyAgICAgIGlmICghcEl0ZW0tPkdldFByZXYoKSAmJiAhcEl0ZW0tPkdldE5leHQoKSkgeworICAgICAgICBtX3J0Q2FwdGlvbiA9IHJ0V2lkZ2V0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcEl0ZW0gPSBwSXRlbS0+R2V0Rmlyc3QoKTsKKyAgICAgICAgbV9ydENhcHRpb24gPSBwSXRlbS0+R2V0UmVjdChmYWxzZSk7CisgICAgICAgIHBJdGVtID0gcEl0ZW0tPkdldE5leHQoKTsKKyAgICAgICAgd2hpbGUgKHBJdGVtKSB7CisgICAgICAgICAgbV9ydENhcHRpb24uaGVpZ2h0ICs9IHBJdGVtLT5HZXRSZWN0KGZhbHNlKS5IZWlnaHQoKTsKKyAgICAgICAgICBwSXRlbSA9IHBJdGVtLT5HZXROZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgWEZBX1JlY3RXaXRob3V0TWFyZ2luKG1fcnRDYXB0aW9uLCBtYXJnaW4pOworICAgICAgfQorCisgICAgICBDWEZBX1RleHRMYXlvdXQqIHBDYXBUZXh0TGF5b3V0ID0KKyAgICAgICAgICBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0Q2FwdGlvblRleHRMYXlvdXQoKTsKKyAgICAgIGlmIChmQ2FwUmVzZXJ2ZSA8PSAwICYmIHBDYXBUZXh0TGF5b3V0KSB7CisgICAgICAgIENGWF9TaXplRiBtaW5TaXplOworICAgICAgICBDRlhfU2l6ZUYgbWF4U2l6ZTsKKyAgICAgICAgQ0ZYX1NpemVGIHNpemUgPSBwQ2FwVGV4dExheW91dC0+Q2FsY1NpemUobWluU2l6ZSwgbWF4U2l6ZSk7CisgICAgICAgIGlmIChpQ2FwUGxhY2VtZW50ID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpUb3AgfHwKKyAgICAgICAgICAgIGlDYXBQbGFjZW1lbnQgPT0gWEZBX0F0dHJpYnV0ZUVudW06OkJvdHRvbSkgeworICAgICAgICAgIGZDYXBSZXNlcnZlID0gc2l6ZS5oZWlnaHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZkNhcFJlc2VydmUgPSBzaXplLndpZHRoOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgbV9ydFVJID0gcnRXaWRnZXQ7CisgIENYRkFfTWFyZ2luKiBjYXBNYXJnaW4gPSBjYXB0aW9uID8gY2FwdGlvbi0+R2V0TWFyZ2luSWZFeGlzdHMoKSA6IG51bGxwdHI7CisgIHN3aXRjaCAoaUNhcFBsYWNlbWVudCkgeworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkxlZnQ6IHsKKyAgICAgIG1fcnRDYXB0aW9uLndpZHRoID0gZkNhcFJlc2VydmU7CisgICAgICBDYXBMZWZ0UmlnaHRQbGFjZW1lbnQoY2FwTWFyZ2luLCBydFdpZGdldCwgaUNhcFBsYWNlbWVudCk7CisgICAgICBtX3J0VUkud2lkdGggLT0gZkNhcFJlc2VydmU7CisgICAgICBtX3J0VUkubGVmdCArPSBmQ2FwUmVzZXJ2ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpUb3A6IHsKKyAgICAgIG1fcnRDYXB0aW9uLmhlaWdodCA9IGZDYXBSZXNlcnZlOworICAgICAgQ2FwVG9wQm90dG9tUGxhY2VtZW50KGNhcE1hcmdpbiwgcnRXaWRnZXQsIGlDYXBQbGFjZW1lbnQpOworICAgICAgbV9ydFVJLnRvcCArPSBmQ2FwUmVzZXJ2ZTsKKyAgICAgIG1fcnRVSS5oZWlnaHQgLT0gZkNhcFJlc2VydmU7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6UmlnaHQ6IHsKKyAgICAgIG1fcnRDYXB0aW9uLmxlZnQgPSBtX3J0Q2FwdGlvbi5yaWdodCgpIC0gZkNhcFJlc2VydmU7CisgICAgICBtX3J0Q2FwdGlvbi53aWR0aCA9IGZDYXBSZXNlcnZlOworICAgICAgQ2FwTGVmdFJpZ2h0UGxhY2VtZW50KGNhcE1hcmdpbiwgcnRXaWRnZXQsIGlDYXBQbGFjZW1lbnQpOworICAgICAgbV9ydFVJLndpZHRoIC09IGZDYXBSZXNlcnZlOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkJvdHRvbTogeworICAgICAgbV9ydENhcHRpb24udG9wID0gbV9ydENhcHRpb24uYm90dG9tKCkgLSBmQ2FwUmVzZXJ2ZTsKKyAgICAgIG1fcnRDYXB0aW9uLmhlaWdodCA9IGZDYXBSZXNlcnZlOworICAgICAgQ2FwVG9wQm90dG9tUGxhY2VtZW50KGNhcE1hcmdpbiwgcnRXaWRnZXQsIGlDYXBQbGFjZW1lbnQpOworICAgICAgbV9ydFVJLmhlaWdodCAtPSBmQ2FwUmVzZXJ2ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpJbmxpbmU6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKworICBDWEZBX0JvcmRlciogYm9yZGVyVUkgPSBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0VUlCb3JkZXIoKTsKKyAgaWYgKGJvcmRlclVJKSB7CisgICAgQ1hGQV9NYXJnaW4qIGJvcmRlck1hcmdpbiA9IGJvcmRlclVJLT5HZXRNYXJnaW5JZkV4aXN0cygpOworICAgIGlmIChib3JkZXJNYXJnaW4pCisgICAgICBYRkFfUmVjdFdpdGhvdXRNYXJnaW4obV9ydFVJLCBib3JkZXJNYXJnaW4pOworICB9CisgIG1fcnRVSS5Ob3JtYWxpemUoKTsKK30KKwordm9pZCBDWEZBX0ZGRmllbGQ6OkNhcFRvcEJvdHRvbVBsYWNlbWVudChjb25zdCBDWEZBX01hcmdpbiogbWFyZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0V2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlRW51bSBpQ2FwUGxhY2VtZW50KSB7CisgIENGWF9SZWN0RiBydFVJTWFyZ2luID0gbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldFVJTWFyZ2luKCk7CisgIG1fcnRDYXB0aW9uLmxlZnQgKz0gcnRVSU1hcmdpbi5sZWZ0OworICBpZiAobWFyZ2luKSB7CisgICAgWEZBX1JlY3RXaXRob3V0TWFyZ2luKG1fcnRDYXB0aW9uLCBtYXJnaW4pOworICAgIGlmIChtX3J0Q2FwdGlvbi5oZWlnaHQgPCAwKQorICAgICAgbV9ydENhcHRpb24udG9wICs9IG1fcnRDYXB0aW9uLmhlaWdodDsKKyAgfQorCisgIGZsb2F0IGZXaWR0aCA9IHJ0VUlNYXJnaW4ubGVmdCArIHJ0VUlNYXJnaW4ud2lkdGg7CisgIGZsb2F0IGZIZWlnaHQgPSBtX3J0Q2FwdGlvbi5oZWlnaHQgKyBydFVJTWFyZ2luLnRvcCArIHJ0VUlNYXJnaW4uaGVpZ2h0OworICBpZiAoZldpZHRoID4gcnRXaWRnZXQud2lkdGgpCisgICAgbV9ydFVJLndpZHRoICs9IGZXaWR0aCAtIHJ0V2lkZ2V0LndpZHRoOworCisgIGlmIChmSGVpZ2h0ID09IFhGQV9ERUZBVUxUVUlfSEVJR0hUICYmIG1fcnRVSS5oZWlnaHQgPCBYRkFfTUlOVUlfSEVJR0hUKSB7CisgICAgbV9ydFVJLmhlaWdodCA9IFhGQV9NSU5VSV9IRUlHSFQ7CisgICAgbV9ydENhcHRpb24udG9wICs9IHJ0VUlNYXJnaW4udG9wICsgcnRVSU1hcmdpbi5oZWlnaHQ7CisgIH0gZWxzZSBpZiAoZkhlaWdodCA+IHJ0V2lkZ2V0LmhlaWdodCkgeworICAgIG1fcnRVSS5oZWlnaHQgKz0gZkhlaWdodCAtIHJ0V2lkZ2V0LmhlaWdodDsKKyAgICBpZiAoaUNhcFBsYWNlbWVudCA9PSBYRkFfQXR0cmlidXRlRW51bTo6Qm90dG9tKQorICAgICAgbV9ydENhcHRpb24udG9wICs9IGZIZWlnaHQgLSBydFdpZGdldC5oZWlnaHQ7CisgIH0KK30KKwordm9pZCBDWEZBX0ZGRmllbGQ6OkNhcExlZnRSaWdodFBsYWNlbWVudChjb25zdCBDWEZBX01hcmdpbiogbWFyZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0V2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlRW51bSBpQ2FwUGxhY2VtZW50KSB7CisgIENGWF9SZWN0RiBydFVJTWFyZ2luID0gbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldFVJTWFyZ2luKCk7CisgIG1fcnRDYXB0aW9uLnRvcCArPSBydFVJTWFyZ2luLnRvcDsKKyAgbV9ydENhcHRpb24uaGVpZ2h0IC09IHJ0VUlNYXJnaW4udG9wOworICBpZiAobWFyZ2luKSB7CisgICAgWEZBX1JlY3RXaXRob3V0TWFyZ2luKG1fcnRDYXB0aW9uLCBtYXJnaW4pOworICAgIGlmIChtX3J0Q2FwdGlvbi5oZWlnaHQgPCAwKQorICAgICAgbV9ydENhcHRpb24udG9wICs9IG1fcnRDYXB0aW9uLmhlaWdodDsKKyAgfQorCisgIGZsb2F0IGZXaWR0aCA9IG1fcnRDYXB0aW9uLndpZHRoICsgcnRVSU1hcmdpbi5sZWZ0ICsgcnRVSU1hcmdpbi53aWR0aDsKKyAgZmxvYXQgZkhlaWdodCA9IHJ0VUlNYXJnaW4udG9wICsgcnRVSU1hcmdpbi5oZWlnaHQ7CisgIGlmIChmV2lkdGggPiBydFdpZGdldC53aWR0aCkgeworICAgIG1fcnRVSS53aWR0aCArPSBmV2lkdGggLSBydFdpZGdldC53aWR0aDsKKyAgICBpZiAoaUNhcFBsYWNlbWVudCA9PSBYRkFfQXR0cmlidXRlRW51bTo6UmlnaHQpCisgICAgICBtX3J0Q2FwdGlvbi5sZWZ0ICs9IGZXaWR0aCAtIHJ0V2lkZ2V0LndpZHRoOworICB9CisKKyAgaWYgKGZIZWlnaHQgPT0gWEZBX0RFRkFVTFRVSV9IRUlHSFQgJiYgbV9ydFVJLmhlaWdodCA8IFhGQV9NSU5VSV9IRUlHSFQpIHsKKyAgICBtX3J0VUkuaGVpZ2h0ID0gWEZBX01JTlVJX0hFSUdIVDsKKyAgICBtX3J0Q2FwdGlvbi50b3AgKz0gcnRVSU1hcmdpbi50b3AgKyBydFVJTWFyZ2luLmhlaWdodDsKKyAgfSBlbHNlIGlmIChmSGVpZ2h0ID4gcnRXaWRnZXQuaGVpZ2h0KSB7CisgICAgbV9ydFVJLmhlaWdodCArPSBmSGVpZ2h0IC0gcnRXaWRnZXQuaGVpZ2h0OworICB9Cit9CisKK3ZvaWQgQ1hGQV9GRkZpZWxkOjpVcGRhdGVGV0woKSB7CisgIGlmIChtX3BOb3JtYWxXaWRnZXQpCisgICAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsKK30KKwordWludDMyX3QgQ1hGQV9GRkZpZWxkOjpVcGRhdGVVSVByb3BlcnR5KCkgeworICBDWEZBX05vZGUqIHBVaU5vZGUgPSBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0VUlDaGlsZCgpOworICBpZiAocFVpTm9kZSAmJiBwVWlOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpEZWZhdWx0VWkpCisgICAgcmV0dXJuIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHk7CisgIHJldHVybiAwOworfQorCit2b2lkIENYRkFfRkZGaWVsZDo6U2V0RldMUmVjdCgpIHsKKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpCisgICAgcmV0dXJuOworCisgIENGWF9SZWN0RiBydFVpID0gbV9ydFVJOworICBpZiAocnRVaS53aWR0aCA8IDEuMCkKKyAgICBydFVpLndpZHRoID0gMS4wOworICBpZiAoIUdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKSB7CisgICAgZmxvYXQgZkZvbnRTaXplID0gbV9wTm9kZS0+R2V0Rm9udFNpemUoKTsKKyAgICBpZiAocnRVaS5oZWlnaHQgPCBmRm9udFNpemUpCisgICAgICBydFVpLmhlaWdodCA9IGZGb250U2l6ZTsKKyAgfQorICBtX3BOb3JtYWxXaWRnZXQtPlNldFdpZGdldFJlY3QocnRVaSk7Cit9CisKK2Jvb2wgQ1hGQV9GRkZpZWxkOjpPbk1vdXNlRW50ZXIoKSB7CisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KQorICAgIHJldHVybiBmYWxzZTsKKworICBDRldMX01lc3NhZ2VNb3VzZSBtcyhudWxscHRyLCBtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpOworICBtcy5tX2R3Q21kID0gRldMX01vdXNlQ29tbWFuZDo6RW50ZXI7CisgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1hGQV9GRkZpZWxkOjpPbk1vdXNlRXhpdCgpIHsKKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENGV0xfTWVzc2FnZU1vdXNlIG1zKG51bGxwdHIsIG1fcE5vcm1hbFdpZGdldC5nZXQoKSk7CisgIG1zLm1fZHdDbWQgPSBGV0xfTW91c2VDb21tYW5kOjpMZWF2ZTsKKyAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOworICByZXR1cm4gdHJ1ZTsKK30KKworQ0ZYX1BvaW50RiBDWEZBX0ZGRmllbGQ6OkZXTFRvQ2xpZW50KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIHJldHVybiBtX3BOb3JtYWxXaWRnZXQgPyBwb2ludCAtIG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0UmVjdCgpLlRvcExlZnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDogcG9pbnQ7Cit9CisKK2Jvb2wgQ1hGQV9GRkZpZWxkOjpPbkxCdXR0b25Eb3duKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFtX3BOb2RlLT5Jc09wZW5BY2Nlc3MoKSB8fCAhR2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIVB0SW5BY3RpdmVSZWN0KHBvaW50KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgU2V0QnV0dG9uRG93bih0cnVlKTsKKyAgQ0ZXTF9NZXNzYWdlTW91c2UgbXMobnVsbHB0ciwgbV9wTm9ybWFsV2lkZ2V0LmdldCgpKTsKKyAgbXMubV9kd0NtZCA9IEZXTF9Nb3VzZUNvbW1hbmQ6OkxlZnRCdXR0b25Eb3duOworICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOworICBtcy5tX3BvcyA9IEZXTFRvQ2xpZW50KHBvaW50KTsKKyAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDWEZBX0ZGRmllbGQ6Ok9uTEJ1dHRvblVwKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFJc0J1dHRvbkRvd24oKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgU2V0QnV0dG9uRG93bihmYWxzZSk7CisgIENGV0xfTWVzc2FnZU1vdXNlIG1zKG51bGxwdHIsIG1fcE5vcm1hbFdpZGdldC5nZXQoKSk7CisgIG1zLm1fZHdDbWQgPSBGV0xfTW91c2VDb21tYW5kOjpMZWZ0QnV0dG9uVXA7CisgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7CisgIG1zLm1fcG9zID0gRldMVG9DbGllbnQocG9pbnQpOworICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENYRkFfRkZGaWVsZDo6T25MQnV0dG9uRGJsQ2xrKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KQorICAgIHJldHVybiBmYWxzZTsKKworICBDRldMX01lc3NhZ2VNb3VzZSBtcyhudWxscHRyLCBtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpOworICBtcy5tX2R3Q21kID0gRldMX01vdXNlQ29tbWFuZDo6TGVmdEJ1dHRvbkRibENsazsKKyAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsKKyAgbXMubV9wb3MgPSBGV0xUb0NsaWVudChwb2ludCk7CisgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1hGQV9GRkZpZWxkOjpPbk1vdXNlTW92ZSh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICBpZiAoIW1fcE5vcm1hbFdpZGdldCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQ0ZXTF9NZXNzYWdlTW91c2UgbXMobnVsbHB0ciwgbV9wTm9ybWFsV2lkZ2V0LmdldCgpKTsKKyAgbXMubV9kd0NtZCA9IEZXTF9Nb3VzZUNvbW1hbmQ6Ok1vdmU7CisgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7CisgIG1zLm1fcG9zID0gRldMVG9DbGllbnQocG9pbnQpOworICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENYRkFfRkZGaWVsZDo6T25Nb3VzZVdoZWVsKHVpbnQzMl90IGR3RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICBpZiAoIW1fcE5vcm1hbFdpZGdldCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQ0ZXTF9NZXNzYWdlTW91c2VXaGVlbCBtcyhudWxscHRyLCBtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpOworICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOworICBtcy5tX3BvcyA9IEZXTFRvQ2xpZW50KHBvaW50KTsKKyAgbXMubV9kZWx0YSA9IENGWF9Qb2ludEYoekRlbHRhLCAwKTsKKyAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDWEZBX0ZGRmllbGQ6Ok9uUkJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIW1fcE5vZGUtPklzT3BlbkFjY2VzcygpIHx8ICFHZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghUHRJbkFjdGl2ZVJlY3QocG9pbnQpKQorICAgIHJldHVybiBmYWxzZTsKKworICBTZXRCdXR0b25Eb3duKHRydWUpOworCisgIENGV0xfTWVzc2FnZU1vdXNlIG1zKG51bGxwdHIsIG1fcE5vcm1hbFdpZGdldC5nZXQoKSk7CisgIG1zLm1fZHdDbWQgPSBGV0xfTW91c2VDb21tYW5kOjpSaWdodEJ1dHRvbkRvd247CisgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7CisgIG1zLm1fcG9zID0gRldMVG9DbGllbnQocG9pbnQpOworICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENYRkFfRkZGaWVsZDo6T25SQnV0dG9uVXAodWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIUlzQnV0dG9uRG93bigpKQorICAgIHJldHVybiBmYWxzZTsKKworICBTZXRCdXR0b25Eb3duKGZhbHNlKTsKKyAgQ0ZXTF9NZXNzYWdlTW91c2UgbXMobnVsbHB0ciwgbV9wTm9ybWFsV2lkZ2V0LmdldCgpKTsKKyAgbXMubV9kd0NtZCA9IEZXTF9Nb3VzZUNvbW1hbmQ6OlJpZ2h0QnV0dG9uVXA7CisgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7CisgIG1zLm1fcG9zID0gRldMVG9DbGllbnQocG9pbnQpOworICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENYRkFfRkZGaWVsZDo6T25SQnV0dG9uRGJsQ2xrKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KQorICAgIHJldHVybiBmYWxzZTsKKworICBDRldMX01lc3NhZ2VNb3VzZSBtcyhudWxscHRyLCBtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpOworICBtcy5tX2R3Q21kID0gRldMX01vdXNlQ29tbWFuZDo6UmlnaHRCdXR0b25EYmxDbGs7CisgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7CisgIG1zLm1fcG9zID0gRldMVG9DbGllbnQocG9pbnQpOworICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENYRkFfRkZGaWVsZDo6T25TZXRGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwT2xkV2lkZ2V0KSB7CisgIENYRkFfRkZXaWRnZXQ6Ok9uU2V0Rm9jdXMocE9sZFdpZGdldCk7CisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KQorICAgIHJldHVybiBmYWxzZTsKKworICBDRldMX01lc3NhZ2VTZXRGb2N1cyBtcyhudWxscHRyLCBtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpOworICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7CisgIG1fZHdTdGF0dXMgfD0gWEZBX1dpZGdldFN0YXR1c19Gb2N1c2VkOworICBBZGRJbnZhbGlkYXRlUmVjdCgpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDWEZBX0ZGRmllbGQ6Ok9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdXaWRnZXQpIHsKKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpCisgICAgcmV0dXJuIENYRkFfRkZXaWRnZXQ6Ok9uS2lsbEZvY3VzKHBOZXdXaWRnZXQpOworCisgIENGV0xfTWVzc2FnZUtpbGxGb2N1cyBtcyhudWxscHRyLCBtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpOworICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7CisgIG1fZHdTdGF0dXMgJj0gflhGQV9XaWRnZXRTdGF0dXNfRm9jdXNlZDsKKyAgQWRkSW52YWxpZGF0ZVJlY3QoKTsKKyAgQ1hGQV9GRldpZGdldDo6T25LaWxsRm9jdXMocE5ld1dpZGdldCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENYRkFfRkZGaWVsZDo6T25LZXlEb3duKHVpbnQzMl90IGR3S2V5Q29kZSwgdWludDMyX3QgZHdGbGFncykgeworICBpZiAoIW1fcE5vcm1hbFdpZGdldCB8fCAhR2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENGV0xfTWVzc2FnZUtleSBtcyhudWxscHRyLCBtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpOworICBtcy5tX2R3Q21kID0gRldMX0tleUNvbW1hbmQ6OktleURvd247CisgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7CisgIG1zLm1fZHdLZXlDb2RlID0gZHdLZXlDb2RlOworICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENYRkFfRkZGaWVsZDo6T25LZXlVcCh1aW50MzJfdCBkd0tleUNvZGUsIHVpbnQzMl90IGR3RmxhZ3MpIHsKKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQgfHwgIUdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBDRldMX01lc3NhZ2VLZXkgbXMobnVsbHB0ciwgbV9wTm9ybWFsV2lkZ2V0LmdldCgpKTsKKyAgbXMubV9kd0NtZCA9IEZXTF9LZXlDb21tYW5kOjpLZXlVcDsKKyAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsKKyAgbXMubV9kd0tleUNvZGUgPSBkd0tleUNvZGU7CisgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1hGQV9GRkZpZWxkOjpPbkNoYXIodWludDMyX3QgZHdDaGFyLCB1aW50MzJfdCBkd0ZsYWdzKSB7CisgIGlmICghR2V0RG9jKCktPkdldFhGQURvYygpLT5Jc0ludGVyYWN0aXZlKCkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoZHdDaGFyID09IEZXTF9WS0VZX1RhYikKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIW1fcE5vZGUtPklzT3BlbkFjY2VzcygpKQorICAgIHJldHVybiBmYWxzZTsKKworICBDRldMX01lc3NhZ2VLZXkgbXMobnVsbHB0ciwgbV9wTm9ybWFsV2lkZ2V0LmdldCgpKTsKKyAgbXMubV9kd0NtZCA9IEZXTF9LZXlDb21tYW5kOjpDaGFyOworICBtcy5tX2R3RmxhZ3MgPSBkd0ZsYWdzOworICBtcy5tX2R3S2V5Q29kZSA9IGR3Q2hhcjsKKyAgVHJhbnNsYXRlRldMTWVzc2FnZSgmbXMpOworICByZXR1cm4gdHJ1ZTsKK30KKworRldMX1dpZGdldEhpdCBDWEZBX0ZGRmllbGQ6Ok9uSGl0VGVzdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICBpZiAobV9wTm9ybWFsV2lkZ2V0ICYmCisgICAgICBtX3BOb3JtYWxXaWRnZXQtPkhpdFRlc3QoRldMVG9DbGllbnQocG9pbnQpKSAhPSBGV0xfV2lkZ2V0SGl0OjpVbmtub3duKSB7CisgICAgcmV0dXJuIEZXTF9XaWRnZXRIaXQ6OkNsaWVudDsKKyAgfQorCisgIGlmICghR2V0UmVjdFdpdGhvdXRSb3RhdGUoKS5Db250YWlucyhwb2ludCkpCisgICAgcmV0dXJuIEZXTF9XaWRnZXRIaXQ6OlVua25vd247CisgIGlmIChtX3J0Q2FwdGlvbi5Db250YWlucyhwb2ludCkpCisgICAgcmV0dXJuIEZXTF9XaWRnZXRIaXQ6OlRpdGxlYmFyOworICByZXR1cm4gRldMX1dpZGdldEhpdDo6Qm9yZGVyOworfQorCitib29sIENYRkFfRkZGaWVsZDo6T25TZXRDdXJzb3IoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1hGQV9GRkZpZWxkOjpQdEluQWN0aXZlUmVjdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICByZXR1cm4gbV9wTm9ybWFsV2lkZ2V0ICYmIG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0UmVjdCgpLkNvbnRhaW5zKHBvaW50KTsKK30KKwordm9pZCBDWEZBX0ZGRmllbGQ6OkxheW91dENhcHRpb24oKSB7CisgIENYRkFfVGV4dExheW91dCogcENhcFRleHRMYXlvdXQgPQorICAgICAgbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldENhcHRpb25UZXh0TGF5b3V0KCk7CisgIGlmICghcENhcFRleHRMYXlvdXQpCisgICAgcmV0dXJuOworCisgIGZsb2F0IGZIZWlnaHQgPQorICAgICAgcENhcFRleHRMYXlvdXQtPkxheW91dChDRlhfU2l6ZUYobV9ydENhcHRpb24ud2lkdGgsIG1fcnRDYXB0aW9uLmhlaWdodCkpOworICBpZiAobV9ydENhcHRpb24uaGVpZ2h0IDwgZkhlaWdodCkKKyAgICBtX3J0Q2FwdGlvbi5oZWlnaHQgPSBmSGVpZ2h0OworfQorCit2b2lkIENYRkFfRkZGaWVsZDo6UmVuZGVyQ2FwdGlvbihDWEZBX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXgpIHsKKyAgQ1hGQV9UZXh0TGF5b3V0KiBwQ2FwVGV4dExheW91dCA9CisgICAgICBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0Q2FwdGlvblRleHRMYXlvdXQoKTsKKyAgaWYgKCFwQ2FwVGV4dExheW91dCkKKyAgICByZXR1cm47CisKKyAgQ1hGQV9DYXB0aW9uKiBjYXB0aW9uID0gbV9wTm9kZS0+R2V0Q2FwdGlvbklmRXhpc3RzKCk7CisgIGlmICghY2FwdGlvbiB8fCAhY2FwdGlvbi0+SXNWaXNpYmxlKCkpCisgICAgcmV0dXJuOworCisgIGlmICghcENhcFRleHRMYXlvdXQtPklzTG9hZGVkKCkpCisgICAgcENhcFRleHRMYXlvdXQtPkxheW91dChDRlhfU2l6ZUYobV9ydENhcHRpb24ud2lkdGgsIG1fcnRDYXB0aW9uLmhlaWdodCkpOworCisgIENGWF9SZWN0RiBydENsaXAgPSBtX3J0Q2FwdGlvbjsKKyAgcnRDbGlwLkludGVyc2VjdChHZXRSZWN0V2l0aG91dFJvdGF0ZSgpKTsKKyAgQ0ZYX1JlbmRlckRldmljZSogcFJlbmRlckRldmljZSA9IHBHUy0+R2V0UmVuZGVyRGV2aWNlKCk7CisgIENGWF9NYXRyaXggbXQoMSwgMCwgMCwgMSwgbV9ydENhcHRpb24ubGVmdCwgbV9ydENhcHRpb24udG9wKTsKKyAgaWYgKHBNYXRyaXgpIHsKKyAgICBydENsaXAgPSBwTWF0cml4LT5UcmFuc2Zvcm1SZWN0KHJ0Q2xpcCk7CisgICAgbXQuQ29uY2F0KCpwTWF0cml4KTsKKyAgfQorICBwQ2FwVGV4dExheW91dC0+RHJhd1N0cmluZyhwUmVuZGVyRGV2aWNlLCBtdCwgcnRDbGlwLCAwKTsKK30KKworYm9vbCBDWEZBX0ZGRmllbGQ6OlByb2Nlc3NDb21taXR0ZWREYXRhKCkgeworICBpZiAoIW1fcE5vZGUtPklzT3BlbkFjY2VzcygpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFJc0RhdGFDaGFuZ2VkKCkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoQ2FsY3VsYXRlT3ZlcnJpZGUoKSAhPSAxKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFDb21taXREYXRhKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIG1fcERvY1ZpZXctPlNldENoYW5nZU1hcmsoKTsKKyAgbV9wRG9jVmlldy0+QWRkVmFsaWRhdGVXaWRnZXQobV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCkpOworICByZXR1cm4gdHJ1ZTsKK30KKworaW50MzJfdCBDWEZBX0ZGRmllbGQ6OkNhbGN1bGF0ZU92ZXJyaWRlKCkgeworICBDWEZBX05vZGUqIGV4Y2xOb2RlID0gbV9wTm9kZS0+R2V0RXhjbEdyb3VwSWZFeGlzdHMoKTsKKyAgaWYgKCFleGNsTm9kZSkKKyAgICByZXR1cm4gQ2FsY3VsYXRlV2lkZ2V0QWNjKG1fcE5vZGUtPkdldFdpZGdldEFjYygpKTsKKworICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IGV4Y2xOb2RlLT5HZXRXaWRnZXRBY2MoKTsKKyAgaWYgKCFwQWNjKQorICAgIHJldHVybiBDYWxjdWxhdGVXaWRnZXRBY2MobV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCkpOworICBpZiAoQ2FsY3VsYXRlV2lkZ2V0QWNjKHBBY2MpID09IDApCisgICAgcmV0dXJuIDA7CisKKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBBY2MtPkdldEV4Y2xHcm91cEZpcnN0TWVtYmVyKCk7CisgIGlmICghcE5vZGUpCisgICAgcmV0dXJuIDE7CisKKyAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBudWxscHRyOworICB3aGlsZSAocE5vZGUpIHsKKyAgICBwV2lkZ2V0QWNjID0gcE5vZGUtPkdldFdpZGdldEFjYygpOworICAgIGlmICghcFdpZGdldEFjYykKKyAgICAgIHJldHVybiAxOworICAgIGlmIChDYWxjdWxhdGVXaWRnZXRBY2MocFdpZGdldEFjYykgPT0gMCkKKyAgICAgIHJldHVybiAwOworCisgICAgcE5vZGUgPSBwV2lkZ2V0QWNjLT5HZXRFeGNsR3JvdXBOZXh0TWVtYmVyKHBOb2RlKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50MzJfdCBDWEZBX0ZGRmllbGQ6OkNhbGN1bGF0ZVdpZGdldEFjYyhDWEZBX1dpZGdldEFjYyogcEFjYykgeworICBDWEZBX0NhbGN1bGF0ZSogY2FsYyA9IHBBY2MtPkdldE5vZGUoKS0+R2V0Q2FsY3VsYXRlSWZFeGlzdHMoKTsKKyAgaWYgKCFjYWxjKQorICAgIHJldHVybiAxOworCisgIFhGQV9WRVJTSU9OIHZlcnNpb24gPSBHZXREb2MoKS0+R2V0WEZBRG9jKCktPkdldEN1clZlcnNpb25Nb2RlKCk7CisgIHN3aXRjaCAoY2FsYy0+R2V0T3ZlcnJpZGUoKSkgeworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkVycm9yOiB7CisgICAgICBpZiAodmVyc2lvbiA8PSBYRkFfVkVSU0lPTl8yMDQpCisgICAgICAgIHJldHVybiAxOworCisgICAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBHZXRBcHAoKS0+R2V0QXBwUHJvdmlkZXIoKTsKKyAgICAgIGlmIChwQXBwUHJvdmlkZXIpIHsKKyAgICAgICAgcEFwcFByb3ZpZGVyLT5Nc2dCb3goTCJZb3UgYXJlIG5vdCBhbGxvd2VkIHRvIG1vZGlmeSB0aGlzIGZpZWxkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiQ2FsY3VsYXRlIE92ZXJyaWRlIiwgWEZBX01CSUNPTl9XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTUJfT0spOworICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06Oldhcm5pbmc6IHsKKyAgICAgIGlmICh2ZXJzaW9uIDw9IFhGQV9WRVJTSU9OXzIwNCkgeworICAgICAgICBDWEZBX1NjcmlwdCogc2NyaXB0ID0gY2FsYy0+R2V0U2NyaXB0SWZFeGlzdHMoKTsKKyAgICAgICAgaWYgKCFzY3JpcHQpCisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIGlmIChzY3JpcHQtPkdldEV4cHJlc3Npb24oKS5Jc0VtcHR5KCkpCisgICAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisKKyAgICAgIGlmIChwQWNjLT5HZXROb2RlKCktPklzVXNlckludGVyYWN0aXZlKCkpCisgICAgICAgIHJldHVybiAxOworCisgICAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBHZXRBcHAoKS0+R2V0QXBwUHJvdmlkZXIoKTsKKyAgICAgIGlmICghcEFwcFByb3ZpZGVyKQorICAgICAgICByZXR1cm4gMDsKKworICAgICAgV2lkZVN0cmluZyB3c01lc3NhZ2UgPSBjYWxjLT5HZXRNZXNzYWdlVGV4dCgpOworICAgICAgaWYgKCF3c01lc3NhZ2UuSXNFbXB0eSgpKQorICAgICAgICB3c01lc3NhZ2UgKz0gTCJcclxuIjsKKworICAgICAgd3NNZXNzYWdlICs9IEwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIG1vZGlmeSB0aGlzIGZpZWxkPyI7CisgICAgICBpZiAocEFwcFByb3ZpZGVyLT5Nc2dCb3god3NNZXNzYWdlLCBMIkNhbGN1bGF0ZSBPdmVycmlkZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX01CSUNPTl9XYXJuaW5nLCBYRkFfTUJfWWVzTm8pID09IFhGQV9JRFllcykgeworICAgICAgICBwQWNjLT5HZXROb2RlKCktPlNldEZsYWcoWEZBX05vZGVGbGFnX1VzZXJJbnRlcmFjdGl2ZSwgZmFsc2UpOworICAgICAgICByZXR1cm4gMTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpJZ25vcmU6CisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpEaXNhYmxlZDoKKyAgICAgIHBBY2MtPkdldE5vZGUoKS0+U2V0RmxhZyhYRkFfTm9kZUZsYWdfVXNlckludGVyYWN0aXZlLCBmYWxzZSk7CisgICAgICByZXR1cm4gMTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDE7CisgIH0KK30KKworYm9vbCBDWEZBX0ZGRmllbGQ6OkNvbW1pdERhdGEoKSB7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDWEZBX0ZGRmllbGQ6OklzRGF0YUNoYW5nZWQoKSB7CisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBDWEZBX0ZGRmllbGQ6OlRyYW5zbGF0ZUZXTE1lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgeworICBHZXRBcHAoKS0+R2V0RldMV2lkZ2V0TWdyKCktPk9uUHJvY2Vzc01lc3NhZ2VUb0Zvcm0ocE1lc3NhZ2UpOworfQorCit2b2lkIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7fQorCit2b2lkIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSB7CisgIHN3aXRjaCAocEV2ZW50LT5HZXRUeXBlKCkpIHsKKyAgICBjYXNlIENGV0xfRXZlbnQ6OlR5cGU6Ok1vdXNlOiB7CisgICAgICBDRldMX0V2ZW50TW91c2UqIGV2ZW50ID0gc3RhdGljX2Nhc3Q8Q0ZXTF9FdmVudE1vdXNlKj4ocEV2ZW50KTsKKyAgICAgIGlmIChldmVudC0+bV9kd0NtZCA9PSBGV0xfTW91c2VDb21tYW5kOjpFbnRlcikgeworICAgICAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOworICAgICAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9Nb3VzZUVudGVyOworICAgICAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCk7CisgICAgICAgIG1fcE5vZGUtPlByb2Nlc3NFdmVudChHZXREb2NWaWV3KCksIFhGQV9BdHRyaWJ1dGVFbnVtOjpNb3VzZUVudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVQYXJhbSk7CisgICAgICB9IGVsc2UgaWYgKGV2ZW50LT5tX2R3Q21kID09IEZXTF9Nb3VzZUNvbW1hbmQ6OkxlYXZlKSB7CisgICAgICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07CisgICAgICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX01vdXNlRXhpdDsKKyAgICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcE5vZGUtPkdldFdpZGdldEFjYygpOworICAgICAgICBtX3BOb2RlLT5Qcm9jZXNzRXZlbnQoR2V0RG9jVmlldygpLCBYRkFfQXR0cmlidXRlRW51bTo6TW91c2VFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVQYXJhbSk7CisgICAgICB9IGVsc2UgaWYgKGV2ZW50LT5tX2R3Q21kID09IEZXTF9Nb3VzZUNvbW1hbmQ6OkxlZnRCdXR0b25Eb3duKSB7CisgICAgICAgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07CisgICAgICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX01vdXNlRG93bjsKKyAgICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcE5vZGUtPkdldFdpZGdldEFjYygpOworICAgICAgICBtX3BOb2RlLT5Qcm9jZXNzRXZlbnQoR2V0RG9jVmlldygpLCBYRkFfQXR0cmlidXRlRW51bTo6TW91c2VEb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVQYXJhbSk7CisgICAgICB9IGVsc2UgaWYgKGV2ZW50LT5tX2R3Q21kID09IEZXTF9Nb3VzZUNvbW1hbmQ6OkxlZnRCdXR0b25VcCkgeworICAgICAgICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOworICAgICAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9Nb3VzZVVwOworICAgICAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCk7CisgICAgICAgIG1fcE5vZGUtPlByb2Nlc3NFdmVudChHZXREb2NWaWV3KCksIFhGQV9BdHRyaWJ1dGVFbnVtOjpNb3VzZVVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVQYXJhbSk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBDRldMX0V2ZW50OjpUeXBlOjpDbGljazogeworICAgICAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsKKyAgICAgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX0NsaWNrOworICAgICAgZVBhcmFtLm1fcFRhcmdldCA9IG1fcE5vZGUtPkdldFdpZGdldEFjYygpOworICAgICAgbV9wTm9kZS0+UHJvY2Vzc0V2ZW50KEdldERvY1ZpZXcoKSwgWEZBX0F0dHJpYnV0ZUVudW06OkNsaWNrLCAmZVBhcmFtKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCBDWEZBX0ZGRmllbGQ6Ok9uRHJhd1dpZGdldChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfZmZmaWVsZC5oIGIveGZhL2Z4ZmEvY3hmYV9mZmZpZWxkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiYTM2YwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZmZmaWVsZC5oCkBAIC0wLDAgKzEsOTkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9DWEZBX0ZGRklFTERfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfQ1hGQV9GRkZJRUxEX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfd2lkZ2V0LmgiCisjaW5jbHVkZSAieGZhL2Z3bC9pZndsX3dpZGdldGRlbGVnYXRlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZnBhZ2V2aWV3LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZndpZGdldC5oIgorCisjZGVmaW5lIFhGQV9NSU5VSV9IRUlHSFQgNC4zMmYKKyNkZWZpbmUgWEZBX0RFRkFVTFRVSV9IRUlHSFQgMi4wZgorCitjbGFzcyBDWEZBX0ZGRmllbGQgOiBwdWJsaWMgQ1hGQV9GRldpZGdldCwgcHVibGljIElGV0xfV2lkZ2V0RGVsZWdhdGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1hGQV9GRkZpZWxkKENYRkFfTm9kZSogcE5vZGUpOworICB+Q1hGQV9GRkZpZWxkKCkgb3ZlcnJpZGU7CisKKyAgLy8gQ1hGQV9GRldpZGdldAorICBDRlhfUmVjdEYgR2V0QkJveCh1aW50MzJfdCBkd1N0YXR1cywgYm9vbCBiRHJhd0ZvY3VzID0gZmFsc2UpIG92ZXJyaWRlOworICB2b2lkIFJlbmRlcldpZGdldChDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGF0dXMpIG92ZXJyaWRlOworICBib29sIElzTG9hZGVkKCkgb3ZlcnJpZGU7CisgIGJvb2wgTG9hZFdpZGdldCgpIG92ZXJyaWRlOworICB2b2lkIFVubG9hZFdpZGdldCgpIG92ZXJyaWRlOworICBib29sIFBlcmZvcm1MYXlvdXQoKSBvdmVycmlkZTsKKyAgYm9vbCBPbk1vdXNlRW50ZXIoKSBvdmVycmlkZTsKKyAgYm9vbCBPbk1vdXNlRXhpdCgpIG92ZXJyaWRlOworICBib29sIE9uTEJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOworICBib29sIE9uTEJ1dHRvblVwKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKKyAgYm9vbCBPbkxCdXR0b25EYmxDbGsodWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOworICBib29sIE9uTW91c2VNb3ZlKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKKyAgYm9vbCBPbk1vdXNlV2hlZWwodWludDMyX3QgZHdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgaW50MTZfdCB6RGVsdGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKKyAgYm9vbCBPblJCdXR0b25Eb3duKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKKyAgYm9vbCBPblJCdXR0b25VcCh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7CisgIGJvb2wgT25SQnV0dG9uRGJsQ2xrKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKKworICBib29sIE9uU2V0Rm9jdXMoQ1hGQV9GRldpZGdldCogcE9sZFdpZGdldCkgb3ZlcnJpZGU7CisgIGJvb2wgT25LaWxsRm9jdXMoQ1hGQV9GRldpZGdldCogcE5ld1dpZGdldCkgb3ZlcnJpZGU7CisgIGJvb2wgT25LZXlEb3duKHVpbnQzMl90IGR3S2V5Q29kZSwgdWludDMyX3QgZHdGbGFncykgb3ZlcnJpZGU7CisgIGJvb2wgT25LZXlVcCh1aW50MzJfdCBkd0tleUNvZGUsIHVpbnQzMl90IGR3RmxhZ3MpIG92ZXJyaWRlOworICBib29sIE9uQ2hhcih1aW50MzJfdCBkd0NoYXIsIHVpbnQzMl90IGR3RmxhZ3MpIG92ZXJyaWRlOworICBGV0xfV2lkZ2V0SGl0IE9uSGl0VGVzdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7CisgIGJvb2wgT25TZXRDdXJzb3IoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOworCisgIC8vIElGV0xfV2lkZ2V0RGVsZWdhdGUKKyAgdm9pZCBPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIG92ZXJyaWRlOworICB2b2lkIE9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgb3ZlcnJpZGU7CisgIHZvaWQgT25EcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSBvdmVycmlkZTsKKworICB2b2lkIFVwZGF0ZUZXTCgpOworICB1aW50MzJfdCBVcGRhdGVVSVByb3BlcnR5KCk7CisKKyBwcm90ZWN0ZWQ6CisgIGJvb2wgUHRJbkFjdGl2ZVJlY3QoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOworCisgIHZpcnR1YWwgdm9pZCBTZXRGV0xSZWN0KCk7CisgIHZvaWQgU2V0RldMVGhlbWVQcm92aWRlcigpOworICBDRldMX1dpZGdldCogR2V0Tm9ybWFsV2lkZ2V0KCkgeyByZXR1cm4gbV9wTm9ybWFsV2lkZ2V0LmdldCgpOyB9CisgIENGWF9Qb2ludEYgRldMVG9DbGllbnQoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOworICB2b2lkIExheW91dENhcHRpb24oKTsKKyAgdm9pZCBSZW5kZXJDYXB0aW9uKENYRkFfR3JhcGhpY3MqIHBHUywgQ0ZYX01hdHJpeCogcE1hdHJpeCk7CisKKyAgaW50MzJfdCBDYWxjdWxhdGVPdmVycmlkZSgpOworICBpbnQzMl90IENhbGN1bGF0ZVdpZGdldEFjYyhDWEZBX1dpZGdldEFjYyogcEFjYyk7CisgIGJvb2wgUHJvY2Vzc0NvbW1pdHRlZERhdGEoKTsKKyAgdmlydHVhbCBib29sIENvbW1pdERhdGEoKTsKKyAgdmlydHVhbCBib29sIElzRGF0YUNoYW5nZWQoKTsKKyAgdm9pZCBEcmF3SGlnaGxpZ2h0KENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkVsbGlwc2UpOworICB2b2lkIERyYXdGb2N1cyhDWEZBX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXgpOworICB2b2lkIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSk7CisgIHZvaWQgQ2FwUGxhY2VtZW50KCk7CisgIHZvaWQgQ2FwVG9wQm90dG9tUGxhY2VtZW50KGNvbnN0IENYRkFfTWFyZ2luKiBtYXJnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtIGlDYXBQbGFjZW1lbnQpOworICB2b2lkIENhcExlZnRSaWdodFBsYWNlbWVudChjb25zdCBDWEZBX01hcmdpbiogbWFyZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0V2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlRW51bSBpQ2FwUGxhY2VtZW50KTsKKyAgdm9pZCBTZXRFZGl0U2Nyb2xsT2Zmc2V0KCk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPENGV0xfV2lkZ2V0PiBtX3BOb3JtYWxXaWRnZXQ7CisgIENGWF9SZWN0RiBtX3J0VUk7CisgIENGWF9SZWN0RiBtX3J0Q2FwdGlvbjsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfQ1hGQV9GRkZJRUxEX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX2ZmaW1hZ2UuY3BwIGIveGZhL2Z4ZmEvY3hmYV9mZmltYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGEwZDMyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9mZmltYWdlLmNwcApAQCAtMCwwICsxLDgwIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmaW1hZ2UuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZhcHAuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZG9jLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRyYXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW1hZ2UuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYXJhLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsdWUuaCIKKworQ1hGQV9GRkltYWdlOjpDWEZBX0ZGSW1hZ2UoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0ZGRHJhdyhwTm9kZSkge30KKworQ1hGQV9GRkltYWdlOjp+Q1hGQV9GRkltYWdlKCkgeworICBDWEZBX0ZGSW1hZ2U6OlVubG9hZFdpZGdldCgpOworfQorCitib29sIENYRkFfRkZJbWFnZTo6SXNMb2FkZWQoKSB7CisgIHJldHVybiAhIUdldE5vZGUoKS0+R2V0V2lkZ2V0QWNjKCktPkdldEltYWdlSW1hZ2UoKTsKK30KKworYm9vbCBDWEZBX0ZGSW1hZ2U6OkxvYWRXaWRnZXQoKSB7CisgIGlmIChHZXROb2RlKCktPkdldFdpZGdldEFjYygpLT5HZXRJbWFnZUltYWdlKCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIEdldE5vZGUoKS0+R2V0V2lkZ2V0QWNjKCktPkxvYWRJbWFnZUltYWdlKEdldERvYygpKQorICAgICAgICAgICAgID8gQ1hGQV9GRkRyYXc6OkxvYWRXaWRnZXQoKQorICAgICAgICAgICAgIDogZmFsc2U7Cit9CisKK3ZvaWQgQ1hGQV9GRkltYWdlOjpVbmxvYWRXaWRnZXQoKSB7CisgIEdldE5vZGUoKS0+R2V0V2lkZ2V0QWNjKCktPlNldEltYWdlSW1hZ2UobnVsbHB0cik7Cit9CisKK3ZvaWQgQ1hGQV9GRkltYWdlOjpSZW5kZXJXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSB7CisgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKQorICAgIHJldHVybjsKKworICBDRlhfTWF0cml4IG10Um90YXRlID0gR2V0Um90YXRlTWF0cml4KCk7CisgIG10Um90YXRlLkNvbmNhdChtYXRyaXgpOworCisgIENYRkFfRkZXaWRnZXQ6OlJlbmRlcldpZGdldChwR1MsIG10Um90YXRlLCBkd1N0YXR1cyk7CisKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcERJQml0bWFwID0KKyAgICAgIEdldE5vZGUoKS0+R2V0V2lkZ2V0QWNjKCktPkdldEltYWdlSW1hZ2UoKTsKKyAgaWYgKCFwRElCaXRtYXApCisgICAgcmV0dXJuOworCisgIENGWF9SZWN0RiBydEltYWdlID0gR2V0UmVjdFdpdGhvdXRSb3RhdGUoKTsKKyAgQ1hGQV9NYXJnaW4qIG1hcmdpbiA9IG1fcE5vZGUtPkdldE1hcmdpbklmRXhpc3RzKCk7CisgIGlmIChtYXJnaW4pCisgICAgWEZBX1JlY3RXaXRob3V0TWFyZ2luKHJ0SW1hZ2UsIG1hcmdpbik7CisKKyAgWEZBX0F0dHJpYnV0ZUVudW0gaUhvcnpBbGlnbiA9IFhGQV9BdHRyaWJ1dGVFbnVtOjpMZWZ0OworICBYRkFfQXR0cmlidXRlRW51bSBpVmVydEFsaWduID0gWEZBX0F0dHJpYnV0ZUVudW06OlRvcDsKKyAgQ1hGQV9QYXJhKiBwYXJhID0gbV9wTm9kZS0+R2V0UGFyYUlmRXhpc3RzKCk7CisgIGlmIChwYXJhKSB7CisgICAgaUhvcnpBbGlnbiA9IHBhcmEtPkdldEhvcml6b250YWxBbGlnbigpOworICAgIGlWZXJ0QWxpZ24gPSBwYXJhLT5HZXRWZXJ0aWNhbEFsaWduKCk7CisgIH0KKworICBpbnQzMl90IGlJbWFnZVhEcGkgPSAwOworICBpbnQzMl90IGlJbWFnZVlEcGkgPSAwOworICBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0SW1hZ2VEcGkoaUltYWdlWERwaSwgaUltYWdlWURwaSk7CisKKyAgYXV0byogdmFsdWUgPSBtX3BOb2RlLT5HZXRGb3JtVmFsdWVJZkV4aXN0cygpOworICBDWEZBX0ltYWdlKiBpbWFnZSA9IHZhbHVlID8gdmFsdWUtPkdldEltYWdlSWZFeGlzdHMoKSA6IG51bGxwdHI7CisgIGlmIChpbWFnZSkgeworICAgIFhGQV9EcmF3SW1hZ2UocEdTLCBydEltYWdlLCBtdFJvdGF0ZSwgcERJQml0bWFwLCBpbWFnZS0+R2V0QXNwZWN0KCksCisgICAgICAgICAgICAgICAgICBpSW1hZ2VYRHBpLCBpSW1hZ2VZRHBpLCBpSG9yekFsaWduLCBpVmVydEFsaWduKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZmltYWdlLmggYi94ZmEvZnhmYS9jeGZhX2ZmaW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzIxYjExCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9mZmltYWdlLmgKQEAgLTAsMCArMSwyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX0NYRkFfRkZJTUFHRV9IXworI2RlZmluZSBYRkFfRlhGQV9DWEZBX0ZGSU1BR0VfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZkcmF3LmgiCisKK2NsYXNzIENYRkFfRkZJbWFnZSA6IHB1YmxpYyBDWEZBX0ZGRHJhdyB7CisgcHVibGljOgorICBleHBsaWNpdCBDWEZBX0ZGSW1hZ2UoQ1hGQV9Ob2RlKiBwTm9kZSk7CisgIH5DWEZBX0ZGSW1hZ2UoKSBvdmVycmlkZTsKKworICAvLyBDWEZBX0ZGV2lkZ2V0CisgIHZvaWQgUmVuZGVyV2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cykgb3ZlcnJpZGU7CisgIGJvb2wgSXNMb2FkZWQoKSBvdmVycmlkZTsKKyAgYm9vbCBMb2FkV2lkZ2V0KCkgb3ZlcnJpZGU7CisgIHZvaWQgVW5sb2FkV2lkZ2V0KCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX0NYRkFfRkZJTUFHRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZmltYWdlZWRpdC5jcHAgYi94ZmEvZnhmYS9jeGZhX2ZmaW1hZ2VlZGl0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTk3NTU5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9mZmltYWdlZWRpdC5jcHAKQEAgLTAsMCArMSwxNTMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZpbWFnZWVkaXQuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2FwcC5oIgorI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9tZXNzYWdlbW91c2UuaCIKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfbm90ZWRyaXZlci5oIgorI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9waWN0dXJlYm94LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRvYy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZkb2N2aWV3LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmZpZWxkLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZnBhZ2V2aWV3LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZndpZGdldC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2JvcmRlci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2ltYWdlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFyYS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZhbHVlLmgiCisKK0NYRkFfRkZJbWFnZUVkaXQ6OkNYRkFfRkZJbWFnZUVkaXQoQ1hGQV9Ob2RlKiBwTm9kZSkKKyAgICA6IENYRkFfRkZGaWVsZChwTm9kZSksIG1fcE9sZERlbGVnYXRlKG51bGxwdHIpIHt9CisKK0NYRkFfRkZJbWFnZUVkaXQ6On5DWEZBX0ZGSW1hZ2VFZGl0KCkgeworICBDWEZBX0ZGSW1hZ2VFZGl0OjpVbmxvYWRXaWRnZXQoKTsKK30KKworYm9vbCBDWEZBX0ZGSW1hZ2VFZGl0OjpMb2FkV2lkZ2V0KCkgeworICBhdXRvIHBOZXcgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZXTF9QaWN0dXJlQm94PihHZXRGV0xBcHAoKSk7CisgIENGV0xfUGljdHVyZUJveCogcFBpY3R1cmVCb3ggPSBwTmV3LmdldCgpOworICBtX3BOb3JtYWxXaWRnZXQgPSBzdGQ6Om1vdmUocE5ldyk7CisgIG1fcE5vcm1hbFdpZGdldC0+U2V0TGF5b3V0SXRlbSh0aGlzKTsKKworICBDRldMX05vdGVEcml2ZXIqIHBOb3RlRHJpdmVyID0KKyAgICAgIG1fcE5vcm1hbFdpZGdldC0+R2V0T3duZXJBcHAoKS0+R2V0Tm90ZURyaXZlcigpOworICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChtX3BOb3JtYWxXaWRnZXQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE5vcm1hbFdpZGdldC5nZXQoKSk7CisgIG1fcE9sZERlbGVnYXRlID0gcFBpY3R1cmVCb3gtPkdldERlbGVnYXRlKCk7CisgIHBQaWN0dXJlQm94LT5TZXREZWxlZ2F0ZSh0aGlzKTsKKworICBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsKKyAgaWYgKCFtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0SW1hZ2VFZGl0SW1hZ2UoKSkKKyAgICBVcGRhdGVGV0xEYXRhKCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ1hGQV9GRkltYWdlRWRpdDo6VW5sb2FkV2lkZ2V0KCkgeworICBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+U2V0SW1hZ2VFZGl0SW1hZ2UobnVsbHB0cik7CisgIENYRkFfRkZGaWVsZDo6VW5sb2FkV2lkZ2V0KCk7Cit9CisKK3ZvaWQgQ1hGQV9GRkltYWdlRWRpdDo6UmVuZGVyV2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSB7CisgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKQorICAgIHJldHVybjsKKworICBDRlhfTWF0cml4IG10Um90YXRlID0gR2V0Um90YXRlTWF0cml4KCk7CisgIG10Um90YXRlLkNvbmNhdChtYXRyaXgpOworCisgIENYRkFfRkZXaWRnZXQ6OlJlbmRlcldpZGdldChwR1MsIG10Um90YXRlLCBkd1N0YXR1cyk7CisgIERyYXdCb3JkZXIocEdTLCBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0VUlCb3JkZXIoKSwgbV9ydFVJLCBtdFJvdGF0ZSk7CisgIFJlbmRlckNhcHRpb24ocEdTLCAmbXRSb3RhdGUpOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwRElCaXRtYXAgPQorICAgICAgbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldEltYWdlRWRpdEltYWdlKCk7CisgIGlmICghcERJQml0bWFwKQorICAgIHJldHVybjsKKworICBDRlhfUmVjdEYgcnRJbWFnZSA9IG1fcE5vcm1hbFdpZGdldC0+R2V0V2lkZ2V0UmVjdCgpOworICBYRkFfQXR0cmlidXRlRW51bSBpSG9yekFsaWduID0gWEZBX0F0dHJpYnV0ZUVudW06OkxlZnQ7CisgIFhGQV9BdHRyaWJ1dGVFbnVtIGlWZXJ0QWxpZ24gPSBYRkFfQXR0cmlidXRlRW51bTo6VG9wOworICBDWEZBX1BhcmEqIHBhcmEgPSBtX3BOb2RlLT5HZXRQYXJhSWZFeGlzdHMoKTsKKyAgaWYgKHBhcmEpIHsKKyAgICBpSG9yekFsaWduID0gcGFyYS0+R2V0SG9yaXpvbnRhbEFsaWduKCk7CisgICAgaVZlcnRBbGlnbiA9IHBhcmEtPkdldFZlcnRpY2FsQWxpZ24oKTsKKyAgfQorCisgIFhGQV9BdHRyaWJ1dGVFbnVtIGlBc3BlY3QgPSBYRkFfQXR0cmlidXRlRW51bTo6Rml0OworICBDWEZBX1ZhbHVlKiB2YWx1ZSA9IG1fcE5vZGUtPkdldEZvcm1WYWx1ZUlmRXhpc3RzKCk7CisgIGlmICh2YWx1ZSkgeworICAgIENYRkFfSW1hZ2UqIGltYWdlID0gdmFsdWUtPkdldEltYWdlSWZFeGlzdHMoKTsKKyAgICBpZiAoaW1hZ2UpCisgICAgICBpQXNwZWN0ID0gaW1hZ2UtPkdldEFzcGVjdCgpOworICB9CisKKyAgaW50MzJfdCBpSW1hZ2VYRHBpID0gMDsKKyAgaW50MzJfdCBpSW1hZ2VZRHBpID0gMDsKKyAgbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldEltYWdlRWRpdERwaShpSW1hZ2VYRHBpLCBpSW1hZ2VZRHBpKTsKKyAgWEZBX0RyYXdJbWFnZShwR1MsIHJ0SW1hZ2UsIG10Um90YXRlLCBwRElCaXRtYXAsIGlBc3BlY3QsIGlJbWFnZVhEcGksCisgICAgICAgICAgICAgICAgaUltYWdlWURwaSwgaUhvcnpBbGlnbiwgaVZlcnRBbGlnbik7Cit9CisKK2Jvb2wgQ1hGQV9GRkltYWdlRWRpdDo6T25MQnV0dG9uRG93bih1aW50MzJfdCBkd0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIGlmICghbV9wTm9kZS0+SXNPcGVuQWNjZXNzKCkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIVB0SW5BY3RpdmVSZWN0KHBvaW50KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgU2V0QnV0dG9uRG93bih0cnVlKTsKKworICBDRldMX01lc3NhZ2VNb3VzZSBtcyhudWxscHRyLCBtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpOworICBtcy5tX2R3Q21kID0gRldMX01vdXNlQ29tbWFuZDo6TGVmdEJ1dHRvbkRvd247CisgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7CisgIG1zLm1fcG9zID0gRldMVG9DbGllbnQocG9pbnQpOworICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENYRkFfRkZJbWFnZUVkaXQ6OlNldEZXTFJlY3QoKSB7CisgIGlmICghbV9wTm9ybWFsV2lkZ2V0KQorICAgIHJldHVybjsKKworICBDRlhfUmVjdEYgcnRVSU1hcmdpbiA9IG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRVSU1hcmdpbigpOworICBDRlhfUmVjdEYgcnRJbWFnZShtX3J0VUkpOworICBydEltYWdlLkRlZmxhdGUocnRVSU1hcmdpbi5sZWZ0LCBydFVJTWFyZ2luLnRvcCwgcnRVSU1hcmdpbi53aWR0aCwKKyAgICAgICAgICAgICAgICAgIHJ0VUlNYXJnaW4uaGVpZ2h0KTsKKyAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRXaWRnZXRSZWN0KHJ0SW1hZ2UpOworfQorCitib29sIENYRkFfRkZJbWFnZUVkaXQ6OkNvbW1pdERhdGEoKSB7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENYRkFfRkZJbWFnZUVkaXQ6OlVwZGF0ZUZXTERhdGEoKSB7CisgIG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5TZXRJbWFnZUVkaXRJbWFnZShudWxscHRyKTsKKyAgbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkxvYWRJbWFnZUVkaXRJbWFnZShHZXREb2MoKSk7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENYRkFfRkZJbWFnZUVkaXQ6Ok9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgeworICBtX3BPbGREZWxlZ2F0ZS0+T25Qcm9jZXNzTWVzc2FnZShwTWVzc2FnZSk7Cit9CisKK3ZvaWQgQ1hGQV9GRkltYWdlRWRpdDo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSB7CisgIENYRkFfRkZGaWVsZDo6T25Qcm9jZXNzRXZlbnQocEV2ZW50KTsKKyAgbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7Cit9CisKK3ZvaWQgQ1hGQV9GRkltYWdlRWRpdDo6T25EcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBtX3BPbGREZWxlZ2F0ZS0+T25EcmF3V2lkZ2V0KHBHcmFwaGljcywgbWF0cml4KTsKK30KKworRm9ybUZpZWxkVHlwZSBDWEZBX0ZGSW1hZ2VFZGl0OjpHZXRGb3JtRmllbGRUeXBlKCkgeworICByZXR1cm4gRm9ybUZpZWxkVHlwZTo6a1hGQV9JbWFnZUZpZWxkOworfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZmltYWdlZWRpdC5oIGIveGZhL2Z4ZmEvY3hmYV9mZmltYWdlZWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZWY2YTgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2ZmaW1hZ2VlZGl0LmgKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX0NYRkFfRkZJTUFHRUVESVRfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfQ1hGQV9GRklNQUdFRURJVF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmZpZWxkLmgiCisKK2NsYXNzIENYRkFfRkZJbWFnZUVkaXQgOiBwdWJsaWMgQ1hGQV9GRkZpZWxkIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENYRkFfRkZJbWFnZUVkaXQoQ1hGQV9Ob2RlKiBwTm9kZSk7CisgIH5DWEZBX0ZGSW1hZ2VFZGl0KCkgb3ZlcnJpZGU7CisKKyAgLy8gQ1hGQV9GRkZpZWxkCisgIHZvaWQgUmVuZGVyV2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cykgb3ZlcnJpZGU7CisgIGJvb2wgTG9hZFdpZGdldCgpIG92ZXJyaWRlOworICB2b2lkIFVubG9hZFdpZGdldCgpIG92ZXJyaWRlOworICBib29sIE9uTEJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOworICB2b2lkIE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgb3ZlcnJpZGU7CisgIHZvaWQgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSBvdmVycmlkZTsKKyAgdm9pZCBPbkRyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIG92ZXJyaWRlOworICBGb3JtRmllbGRUeXBlIEdldEZvcm1GaWVsZFR5cGUoKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIHZvaWQgU2V0RldMUmVjdCgpIG92ZXJyaWRlOworICBib29sIFVwZGF0ZUZXTERhdGEoKSBvdmVycmlkZTsKKyAgYm9vbCBDb21taXREYXRhKCkgb3ZlcnJpZGU7CisKKyAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogbV9wT2xkRGVsZWdhdGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX0NYRkFfRkZJTUFHRUVESVRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfZmZsaW5lLmNwcCBiL3hmYS9meGZhL2N4ZmFfZmZsaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTM3YTBlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9mZmxpbmUuY3BwCkBAIC0wLDAgKzEsMTQwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmbGluZS5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZWRnZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xpbmUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWx1ZS5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2Vjb2xvci5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2VwYXRoLmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9ncmFwaGljcy5oIgorCituYW1lc3BhY2UgeworCitDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXAgTGluZUNhcFRvRlhHRShYRkFfQXR0cmlidXRlRW51bSBpTGluZUNhcCkgeworICBzd2l0Y2ggKGlMaW5lQ2FwKSB7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6Um91bmQ6CisgICAgICByZXR1cm4gQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwUm91bmQ7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6QnV0dDoKKyAgICAgIHJldHVybiBDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBCdXR0OworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwU3F1YXJlOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9GRkxpbmU6OkNYRkFfRkZMaW5lKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9GRkRyYXcocE5vZGUpIHt9CisKK0NYRkFfRkZMaW5lOjp+Q1hGQV9GRkxpbmUoKSB7fQorCit2b2lkIENYRkFfRkZMaW5lOjpHZXRSZWN0RnJvbUhhbmQoQ0ZYX1JlY3RGJiByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtIGlIYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZMaW5lV2lkdGgpIHsKKyAgZmxvYXQgZkhhbGZXaWR0aCA9IGZMaW5lV2lkdGggLyAyLjBmOworICBpZiAocmVjdC5oZWlnaHQgPCAxLjBmKSB7CisgICAgc3dpdGNoIChpSGFuZCkgeworICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6TGVmdDoKKyAgICAgICAgcmVjdC50b3AgLT0gZkhhbGZXaWR0aDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpSaWdodDoKKyAgICAgICAgcmVjdC50b3AgKz0gZkhhbGZXaWR0aDsKKyAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkV2ZW46CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSBpZiAocmVjdC53aWR0aCA8IDEuMGYpIHsKKyAgICBzd2l0Y2ggKGlIYW5kKSB7CisgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpMZWZ0OgorICAgICAgICByZWN0LmxlZnQgKz0gZkhhbGZXaWR0aDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpSaWdodDoKKyAgICAgICAgcmVjdC5sZWZ0ICs9IGZIYWxmV2lkdGg7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6RXZlbjoKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKGlIYW5kKSB7CisgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpMZWZ0OgorICAgICAgICByZWN0LkluZmxhdGUoZkhhbGZXaWR0aCwgZkhhbGZXaWR0aCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6UmlnaHQ6CisgICAgICAgIHJlY3QuRGVmbGF0ZShmSGFsZldpZHRoLCBmSGFsZldpZHRoKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpFdmVuOgorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ1hGQV9GRkxpbmU6OlJlbmRlcldpZGdldChDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSB7CisgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKQorICAgIHJldHVybjsKKworICBDWEZBX1ZhbHVlKiB2YWx1ZSA9IG1fcE5vZGUtPkdldEZvcm1WYWx1ZUlmRXhpc3RzKCk7CisgIGlmICghdmFsdWUpCisgICAgcmV0dXJuOworCisgIEZYX0FSR0IgbGluZUNvbG9yID0gMHhGRjAwMDAwMDsKKyAgZmxvYXQgZkxpbmVXaWR0aCA9IDEuMGY7CisgIFhGQV9BdHRyaWJ1dGVFbnVtIGlTdHJva2VUeXBlID0gWEZBX0F0dHJpYnV0ZUVudW06OlVua25vd247CisgIFhGQV9BdHRyaWJ1dGVFbnVtIGlDYXAgPSBYRkFfQXR0cmlidXRlRW51bTo6VW5rbm93bjsKKworICBDWEZBX0xpbmUqIGxpbmUgPSB2YWx1ZS0+R2V0TGluZUlmRXhpc3RzKCk7CisgIGlmIChsaW5lKSB7CisgICAgQ1hGQV9FZGdlKiBlZGdlID0gbGluZS0+R2V0RWRnZUlmRXhpc3RzKCk7CisgICAgaWYgKGVkZ2UgJiYgIWVkZ2UtPklzVmlzaWJsZSgpKQorICAgICAgcmV0dXJuOworCisgICAgaWYgKGVkZ2UpIHsKKyAgICAgIGxpbmVDb2xvciA9IGVkZ2UtPkdldENvbG9yKCk7CisgICAgICBpU3Ryb2tlVHlwZSA9IGVkZ2UtPkdldFN0cm9rZVR5cGUoKTsKKyAgICAgIGZMaW5lV2lkdGggPSBlZGdlLT5HZXRUaGlja25lc3MoKTsKKyAgICAgIGlDYXAgPSBlZGdlLT5HZXRDYXBUeXBlKCk7CisgICAgfQorICB9CisKKyAgQ0ZYX01hdHJpeCBtdFJvdGF0ZSA9IEdldFJvdGF0ZU1hdHJpeCgpOworICBtdFJvdGF0ZS5Db25jYXQobWF0cml4KTsKKworICBDRlhfUmVjdEYgcnRMaW5lID0gR2V0UmVjdFdpdGhvdXRSb3RhdGUoKTsKKyAgQ1hGQV9NYXJnaW4qIG1hcmdpbiA9IG1fcE5vZGUtPkdldE1hcmdpbklmRXhpc3RzKCk7CisgIGlmIChtYXJnaW4pCisgICAgWEZBX1JlY3RXaXRob3V0TWFyZ2luKHJ0TGluZSwgbWFyZ2luKTsKKworICBHZXRSZWN0RnJvbUhhbmQocnRMaW5lLCBsaW5lID8gbGluZS0+R2V0SGFuZCgpIDogWEZBX0F0dHJpYnV0ZUVudW06OkxlZnQsCisgICAgICAgICAgICAgICAgICBmTGluZVdpZHRoKTsKKyAgQ1hGQV9HRVBhdGggbGluZVBhdGg7CisgIGlmIChsaW5lICYmIGxpbmUtPkdldFNsb3BlKCkgJiYgcnRMaW5lLnJpZ2h0KCkgPiAwLjBmICYmCisgICAgICBydExpbmUuYm90dG9tKCkgPiAwLjBmKSB7CisgICAgbGluZVBhdGguQWRkTGluZShydExpbmUuVG9wUmlnaHQoKSwgcnRMaW5lLkJvdHRvbUxlZnQoKSk7CisgIH0gZWxzZSB7CisgICAgbGluZVBhdGguQWRkTGluZShydExpbmUuVG9wTGVmdCgpLCBydExpbmUuQm90dG9tUmlnaHQoKSk7CisgIH0KKworICBwR1MtPlNhdmVHcmFwaFN0YXRlKCk7CisgIHBHUy0+U2V0TGluZVdpZHRoKGZMaW5lV2lkdGgpOworICBwR1MtPkVuYWJsZUFjdE9uRGFzaCgpOworICBYRkFfU3Ryb2tlVHlwZVNldExpbmVEYXNoKHBHUywgaVN0cm9rZVR5cGUsIGlDYXApOworCisgIHBHUy0+U2V0U3Ryb2tlQ29sb3IoQ1hGQV9HRUNvbG9yKGxpbmVDb2xvcikpOworICBwR1MtPlNldExpbmVDYXAoTGluZUNhcFRvRlhHRShpQ2FwKSk7CisgIHBHUy0+U3Ryb2tlUGF0aCgmbGluZVBhdGgsICZtdFJvdGF0ZSk7CisgIHBHUy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsKK30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfZmZsaW5lLmggYi94ZmEvZnhmYS9jeGZhX2ZmbGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZjNmZDMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2ZmbGluZS5oCkBAIC0wLDAgKzEsMjggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9DWEZBX0ZGTElORV9IXworI2RlZmluZSBYRkFfRlhGQV9DWEZBX0ZGTElORV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRyYXcuaCIKKworY2xhc3MgQ1hGQV9GRkxpbmUgOiBwdWJsaWMgQ1hGQV9GRkRyYXcgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1hGQV9GRkxpbmUoQ1hGQV9Ob2RlKiBwTm9kZSk7CisgIH5DWEZBX0ZGTGluZSgpIG92ZXJyaWRlOworCisgIC8vIENYRkFfRkZXaWRnZXQKKyAgdm9pZCBSZW5kZXJXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIHZvaWQgR2V0UmVjdEZyb21IYW5kKENGWF9SZWN0RiYgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZUVudW0gaUhhbmQsCisgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZMaW5lV2lkdGgpOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9DWEZBX0ZGTElORV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZmxpc3Rib3guY3BwIGIveGZhL2Z4ZmEvY3hmYV9mZmxpc3Rib3guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOTE5OGEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2ZmbGlzdGJveC5jcHAKQEAgLTAsMCArMSwyMTQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZsaXN0Ym94LmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfbGlzdGJveC5oIgorI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9ub3RlZHJpdmVyLmgiCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3dpZGdldC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZXZlbnRwYXJhbS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhcmEuaCIKKworbmFtZXNwYWNlIHsKKworQ0ZXTF9MaXN0Qm94KiBUb0xpc3RCb3goQ0ZXTF9XaWRnZXQqIHdpZGdldCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0ZXTF9MaXN0Qm94Kj4od2lkZ2V0KTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRkZMaXN0Qm94OjpDWEZBX0ZGTGlzdEJveChDWEZBX05vZGUqIHBOb2RlKQorICAgIDogQ1hGQV9GRkZpZWxkKHBOb2RlKSwgbV9wT2xkRGVsZWdhdGUobnVsbHB0cikge30KKworQ1hGQV9GRkxpc3RCb3g6On5DWEZBX0ZGTGlzdEJveCgpIHsKKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpCisgICAgcmV0dXJuOworCisgIENGV0xfTm90ZURyaXZlciogcE5vdGVEcml2ZXIgPQorICAgICAgbV9wTm9ybWFsV2lkZ2V0LT5HZXRPd25lckFwcCgpLT5HZXROb3RlRHJpdmVyKCk7CisgIHBOb3RlRHJpdmVyLT5VbnJlZ2lzdGVyRXZlbnRUYXJnZXQobV9wTm9ybWFsV2lkZ2V0LmdldCgpKTsKK30KKworYm9vbCBDWEZBX0ZGTGlzdEJveDo6TG9hZFdpZGdldCgpIHsKKyAgYXV0byBwTmV3ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfTGlzdEJveD4oCisgICAgICBHZXRGV0xBcHAoKSwgcGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfV2lkZ2V0UHJvcGVydGllcz4oKSwgbnVsbHB0cik7CisgIENGV0xfTGlzdEJveCogcExpc3RCb3ggPSBwTmV3LmdldCgpOworICBwTGlzdEJveC0+TW9kaWZ5U3R5bGVzKEZXTF9XR1RTVFlMRV9WU2Nyb2xsIHwgRldMX1dHVFNUWUxFX05vQmFja2dyb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGKTsKKyAgbV9wTm9ybWFsV2lkZ2V0ID0gc3RkOjptb3ZlKHBOZXcpOworICBtX3BOb3JtYWxXaWRnZXQtPlNldExheW91dEl0ZW0odGhpcyk7CisKKyAgQ0ZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9CisgICAgICBtX3BOb3JtYWxXaWRnZXQtPkdldE93bmVyQXBwKCktPkdldE5vdGVEcml2ZXIoKTsKKyAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQobV9wTm9ybWFsV2lkZ2V0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpOworICBtX3BPbGREZWxlZ2F0ZSA9IG1fcE5vcm1hbFdpZGdldC0+R2V0RGVsZWdhdGUoKTsKKyAgbV9wTm9ybWFsV2lkZ2V0LT5TZXREZWxlZ2F0ZSh0aGlzKTsKKyAgbV9wTm9ybWFsV2lkZ2V0LT5Mb2NrVXBkYXRlKCk7CisKKyAgZm9yIChjb25zdCBhdXRvJiBsYWJlbCA6IG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRDaG9pY2VMaXN0SXRlbXMoZmFsc2UpKQorICAgIHBMaXN0Qm94LT5BZGRTdHJpbmcobGFiZWwuQXNTdHJpbmdWaWV3KCkpOworCisgIHVpbnQzMl90IGR3RXh0ZW5kZWRTdHlsZSA9IEZXTF9TVFlMRUVYVF9MVEJfU2hvd1Njcm9sbEJhckZvY3VzOworICBpZiAobV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPklzQ2hvaWNlTGlzdE11bHRpU2VsZWN0KCkpCisgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9MVEJfTXVsdGlTZWxlY3Rpb247CisKKyAgZHdFeHRlbmRlZFN0eWxlIHw9IEdldEFsaWdubWVudCgpOworICBtX3BOb3JtYWxXaWRnZXQtPk1vZGlmeVN0eWxlc0V4KGR3RXh0ZW5kZWRTdHlsZSwgMHhGRkZGRkZGRik7CisgIGZvciAoaW50MzJfdCBzZWxlY3RlZCA6IG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRTZWxlY3RlZEl0ZW1zKCkpCisgICAgcExpc3RCb3gtPlNldFNlbEl0ZW0ocExpc3RCb3gtPkdldEl0ZW0obnVsbHB0ciwgc2VsZWN0ZWQpLCB0cnVlKTsKKworICBtX3BOb3JtYWxXaWRnZXQtPlVubG9ja1VwZGF0ZSgpOworICByZXR1cm4gQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCk7Cit9CisKK2Jvb2wgQ1hGQV9GRkxpc3RCb3g6Ok9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdGb2N1cykgeworICBpZiAoIVByb2Nlc3NDb21taXR0ZWREYXRhKCkpCisgICAgVXBkYXRlRldMRGF0YSgpOworCisgIENYRkFfRkZGaWVsZDo6T25LaWxsRm9jdXMocE5ld0ZvY3VzKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1hGQV9GRkxpc3RCb3g6OkNvbW1pdERhdGEoKSB7CisgIGF1dG8qIHBMaXN0Qm94ID0gVG9MaXN0Qm94KG1fcE5vcm1hbFdpZGdldC5nZXQoKSk7CisgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGlTZWxBcnJheTsKKyAgaW50MzJfdCBpU2VscyA9IHBMaXN0Qm94LT5Db3VudFNlbEl0ZW1zKCk7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTZWxzOyArK2kpCisgICAgaVNlbEFycmF5LnB1c2hfYmFjayhwTGlzdEJveC0+R2V0U2VsSW5kZXgoaSkpOworCisgIG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5TZXRTZWxlY3RlZEl0ZW1zKGlTZWxBcnJheSwgdHJ1ZSwgZmFsc2UsIHRydWUpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDWEZBX0ZGTGlzdEJveDo6SXNEYXRhQ2hhbmdlZCgpIHsKKyAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gaVNlbEFycmF5ID0gbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldFNlbGVjdGVkSXRlbXMoKTsKKyAgaW50MzJfdCBpT2xkU2VscyA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4oaVNlbEFycmF5KTsKKyAgYXV0byogcExpc3RCb3ggPSBUb0xpc3RCb3gobV9wTm9ybWFsV2lkZ2V0LmdldCgpKTsKKyAgaW50MzJfdCBpU2VscyA9IHBMaXN0Qm94LT5Db3VudFNlbEl0ZW1zKCk7CisgIGlmIChpT2xkU2VscyAhPSBpU2VscykKKyAgICByZXR1cm4gdHJ1ZTsKKworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2VsczsgKytpKSB7CisgICAgQ0ZXTF9MaXN0SXRlbSogaGxpc3RJdGVtID0gcExpc3RCb3gtPkdldEl0ZW0obnVsbHB0ciwgaVNlbEFycmF5W2ldKTsKKyAgICBpZiAoIShobGlzdEl0ZW0tPkdldFN0YXRlcygpICYgRldMX0lURU1TVEFURV9MVEJfU2VsZWN0ZWQpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit1aW50MzJfdCBDWEZBX0ZGTGlzdEJveDo6R2V0QWxpZ25tZW50KCkgeworICBDWEZBX1BhcmEqIHBhcmEgPSBtX3BOb2RlLT5HZXRQYXJhSWZFeGlzdHMoKTsKKyAgaWYgKCFwYXJhKQorICAgIHJldHVybiAwOworCisgIHVpbnQzMl90IGR3RXh0ZW5kZWRTdHlsZSA9IDA7CisgIHN3aXRjaCAocGFyYS0+R2V0SG9yaXpvbnRhbEFsaWduKCkpIHsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpDZW50ZXI6CisgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0xUQl9DZW50ZXJBbGlnbjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06Okp1c3RpZnk6CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpKdXN0aWZ5QWxsOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6UmFkaXg6CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpSaWdodDoKKyAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfTFRCX1JpZ2h0QWxpZ247CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9MVEJfTGVmdEFsaWduOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGR3RXh0ZW5kZWRTdHlsZTsKK30KKworYm9vbCBDWEZBX0ZGTGlzdEJveDo6VXBkYXRlRldMRGF0YSgpIHsKKyAgaWYgKCFtX3BOb3JtYWxXaWRnZXQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGF1dG8qIHBMaXN0Qm94ID0gVG9MaXN0Qm94KG1fcE5vcm1hbFdpZGdldC5nZXQoKSk7CisgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGlTZWxBcnJheSA9IG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRTZWxlY3RlZEl0ZW1zKCk7CisgIHN0ZDo6dmVjdG9yPENGV0xfTGlzdEl0ZW0qPiBzZWxJdGVtQXJyYXkoaVNlbEFycmF5LnNpemUoKSk7CisgIHN0ZDo6dHJhbnNmb3JtKGlTZWxBcnJheS5iZWdpbigpLCBpU2VsQXJyYXkuZW5kKCksIHNlbEl0ZW1BcnJheS5iZWdpbigpLAorICAgICAgICAgICAgICAgICBbcExpc3RCb3hdKGludDMyX3QgdmFsKSB7IHJldHVybiBwTGlzdEJveC0+R2V0U2VsSXRlbSh2YWwpOyB9KTsKKworICBwTGlzdEJveC0+U2V0U2VsSXRlbShwTGlzdEJveC0+R2V0U2VsSXRlbSgtMSksIGZhbHNlKTsKKyAgZm9yIChDRldMX0xpc3RJdGVtKiBwSXRlbSA6IHNlbEl0ZW1BcnJheSkKKyAgICBwTGlzdEJveC0+U2V0U2VsSXRlbShwSXRlbSwgdHJ1ZSk7CisKKyAgbV9wTm9ybWFsV2lkZ2V0LT5VcGRhdGUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ1hGQV9GRkxpc3RCb3g6Ok9uU2VsZWN0Q2hhbmdlZChDRldMX1dpZGdldCogcFdpZGdldCkgeworICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOworICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9DaGFuZ2U7CisgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKTsKKyAgZVBhcmFtLm1fd3NQcmV2VGV4dCA9IG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRWYWx1ZShYRkFfVkFMVUVQSUNUVVJFX1Jhdyk7CisKKyAgYXV0byogcExpc3RCb3ggPSBUb0xpc3RCb3gobV9wTm9ybWFsV2lkZ2V0LmdldCgpKTsKKyAgaW50MzJfdCBpU2VscyA9IHBMaXN0Qm94LT5Db3VudFNlbEl0ZW1zKCk7CisgIGlmIChpU2VscyA+IDApIHsKKyAgICBDRldMX0xpc3RJdGVtKiBpdGVtID0gcExpc3RCb3gtPkdldFNlbEl0ZW0oMCk7CisgICAgZVBhcmFtLm1fd3NOZXdUZXh0ID0gaXRlbSA/IGl0ZW0tPkdldFRleHQoKSA6IEwiIjsKKyAgfQorICBtX3BOb2RlLT5Qcm9jZXNzRXZlbnQoR2V0RG9jVmlldygpLCBYRkFfQXR0cmlidXRlRW51bTo6Q2hhbmdlLCAmZVBhcmFtKTsKK30KKwordm9pZCBDWEZBX0ZGTGlzdEJveDo6U2V0SXRlbVN0YXRlKGludDMyX3QgbkluZGV4LCBib29sIGJTZWxlY3RlZCkgeworICBhdXRvKiBwTGlzdEJveCA9IFRvTGlzdEJveChtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpOworICBwTGlzdEJveC0+U2V0U2VsSXRlbShwTGlzdEJveC0+R2V0U2VsSXRlbShuSW5kZXgpLCBiU2VsZWN0ZWQpOworICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOworICBBZGRJbnZhbGlkYXRlUmVjdCgpOworfQorCit2b2lkIENYRkFfRkZMaXN0Qm94OjpJbnNlcnRJdGVtKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c0xhYmVsLCBpbnQzMl90IG5JbmRleCkgeworICBXaWRlU3RyaW5nIHdzVGVtcCh3c0xhYmVsKTsKKyAgVG9MaXN0Qm94KG1fcE5vcm1hbFdpZGdldC5nZXQoKSktPkFkZFN0cmluZyh3c1RlbXAuQXNTdHJpbmdWaWV3KCkpOworICBtX3BOb3JtYWxXaWRnZXQtPlVwZGF0ZSgpOworICBBZGRJbnZhbGlkYXRlUmVjdCgpOworfQorCit2b2lkIENYRkFfRkZMaXN0Qm94OjpEZWxldGVJdGVtKGludDMyX3QgbkluZGV4KSB7CisgIGF1dG8qIHBMaXN0Qm94ID0gVG9MaXN0Qm94KG1fcE5vcm1hbFdpZGdldC5nZXQoKSk7CisgIGlmIChuSW5kZXggPCAwKQorICAgIHBMaXN0Qm94LT5EZWxldGVBbGwoKTsKKyAgZWxzZQorICAgIHBMaXN0Qm94LT5EZWxldGVTdHJpbmcocExpc3RCb3gtPkdldEl0ZW0obnVsbHB0ciwgbkluZGV4KSk7CisKKyAgcExpc3RCb3gtPlVwZGF0ZSgpOworICBBZGRJbnZhbGlkYXRlUmVjdCgpOworfQorCit2b2lkIENYRkFfRkZMaXN0Qm94OjpPblByb2Nlc3NNZXNzYWdlKENGV0xfTWVzc2FnZSogcE1lc3NhZ2UpIHsKKyAgbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc01lc3NhZ2UocE1lc3NhZ2UpOworfQorCit2b2lkIENYRkFfRkZMaXN0Qm94OjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsKKyAgQ1hGQV9GRkZpZWxkOjpPblByb2Nlc3NFdmVudChwRXZlbnQpOworICBzd2l0Y2ggKHBFdmVudC0+R2V0VHlwZSgpKSB7CisgICAgY2FzZSBDRldMX0V2ZW50OjpUeXBlOjpTZWxlY3RDaGFuZ2VkOgorICAgICAgT25TZWxlY3RDaGFuZ2VkKG1fcE5vcm1hbFdpZGdldC5nZXQoKSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgbV9wT2xkRGVsZWdhdGUtPk9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7Cit9CisKK3ZvaWQgQ1hGQV9GRkxpc3RCb3g6Ok9uRHJhd1dpZGdldChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7CisgIG1fcE9sZERlbGVnYXRlLT5PbkRyYXdXaWRnZXQocEdyYXBoaWNzLCBtYXRyaXgpOworfQorCitGb3JtRmllbGRUeXBlIENYRkFfRkZMaXN0Qm94OjpHZXRGb3JtRmllbGRUeXBlKCkgeworICByZXR1cm4gRm9ybUZpZWxkVHlwZTo6a1hGQV9MaXN0Qm94OworfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZmxpc3Rib3guaCBiL3hmYS9meGZhL2N4ZmFfZmZsaXN0Ym94LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmMWNkYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZmZsaXN0Ym94LmgKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX0NYRkFfRkZMSVNUQk9YX0hfCisjZGVmaW5lIFhGQV9GWEZBX0NYRkFfRkZMSVNUQk9YX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZmllbGQuaCIKKworY2xhc3MgQ1hGQV9GRkxpc3RCb3ggOiBwdWJsaWMgQ1hGQV9GRkZpZWxkIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENYRkFfRkZMaXN0Qm94KENYRkFfTm9kZSogcE5vZGUpOworICB+Q1hGQV9GRkxpc3RCb3goKSBvdmVycmlkZTsKKworICAvLyBDWEZBX0ZGRmllbGQKKyAgYm9vbCBMb2FkV2lkZ2V0KCkgb3ZlcnJpZGU7CisgIGJvb2wgT25LaWxsRm9jdXMoQ1hGQV9GRldpZGdldCogcE5ld1dpZGdldCkgb3ZlcnJpZGU7CisgIHZvaWQgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSBvdmVycmlkZTsKKyAgdm9pZCBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIG92ZXJyaWRlOworICB2b2lkIE9uRHJhd1dpZGdldChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgb3ZlcnJpZGU7CisgIEZvcm1GaWVsZFR5cGUgR2V0Rm9ybUZpZWxkVHlwZSgpIG92ZXJyaWRlOworCisgIHZvaWQgT25TZWxlY3RDaGFuZ2VkKENGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsKKyAgdm9pZCBTZXRJdGVtU3RhdGUoaW50MzJfdCBuSW5kZXgsIGJvb2wgYlNlbGVjdGVkKTsKKyAgdm9pZCBJbnNlcnRJdGVtKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c0xhYmVsLCBpbnQzMl90IG5JbmRleCk7CisgIHZvaWQgRGVsZXRlSXRlbShpbnQzMl90IG5JbmRleCk7CisKKyBwcml2YXRlOgorICBib29sIENvbW1pdERhdGEoKSBvdmVycmlkZTsKKyAgYm9vbCBVcGRhdGVGV0xEYXRhKCkgb3ZlcnJpZGU7CisgIGJvb2wgSXNEYXRhQ2hhbmdlZCgpIG92ZXJyaWRlOworCisgIHVpbnQzMl90IEdldEFsaWdubWVudCgpOworCisgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIG1fcE9sZERlbGVnYXRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9DWEZBX0ZGTElTVEJPWF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZm5vdGlmeS5jcHAgYi94ZmEvZnhmYS9jeGZhX2Zmbm90aWZ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjQxNjIwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9mZm5vdGlmeS5jcHAKQEAgLTAsMCArMSw1MzYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZub3RpZnkuaCIKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmFwcC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZhcmMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmYmFyY29kZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZjaGVja2J1dHRvbi5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZjb21ib2JveC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZkYXRldGltZWVkaXQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZG9jLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRvY3ZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZHJhdy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZleGNsZ3JvdXAuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZmllbGQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmaW1hZ2UuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmaW1hZ2VlZGl0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmxpbmUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmbGlzdGJveC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZudW1lcmljZWRpdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZwYWdldmlldy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZwYXNzd29yZGVkaXQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmcHVzaGJ1dHRvbi5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZyZWN0YW5nbGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmc2lnbmF0dXJlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZnN1YmZvcm0uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmdGV4dC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZ3aWRnZXQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0aGFuZGxlci5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZndsYWRhcHRlcndpZGdldG1nci5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfdGV4dGxheW91dC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfdGV4dHByb3ZpZGVyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmluZGl0ZW1zLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCituYW1lc3BhY2UgeworCitDWEZBX0ZGTGlzdEJveCogVG9MaXN0Qm94KENYRkFfRkZXaWRnZXQqIHdpZGdldCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GRkxpc3RCb3gqPih3aWRnZXQpOworfQorCitDWEZBX0ZGQ29tYm9Cb3gqIFRvQ29tYm9Cb3goQ1hGQV9GRldpZGdldCogd2lkZ2V0KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGQ29tYm9Cb3gqPih3aWRnZXQpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9GRk5vdGlmeTo6Q1hGQV9GRk5vdGlmeShDWEZBX0ZGRG9jKiBwRG9jKSA6IG1fcERvYyhwRG9jKSB7fQorCitDWEZBX0ZGTm90aWZ5Ojp+Q1hGQV9GRk5vdGlmeSgpIHt9CisKK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T25QYWdlRXZlbnQoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwU2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0V2ZW50KSB7CisgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldyhwU2VuZGVyLT5HZXRMYXlvdXQoKSk7CisgIGlmIChwRG9jVmlldykKKyAgICBwRG9jVmlldy0+T25QYWdlRXZlbnQocFNlbmRlciwgZHdFdmVudCk7Cit9CisKK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T25XaWRnZXRMaXN0SXRlbUFkZGVkKENYRkFfV2lkZ2V0QWNjKiBwU2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogcExhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpSW5kZXgpIHsKKyAgaWYgKHBTZW5kZXItPkdldFVJVHlwZSgpICE9IFhGQV9FbGVtZW50OjpDaG9pY2VMaXN0KQorICAgIHJldHVybjsKKworICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0KKyAgICAgIG1fcERvYy0+R2V0RG9jVmlldygpLT5HZXRXaWRnZXRGb3JOb2RlKHBTZW5kZXItPkdldE5vZGUoKSk7CisgIGZvciAoOyBwV2lkZ2V0OyBwV2lkZ2V0ID0gcFNlbmRlci0+R2V0TmV4dFdpZGdldChwV2lkZ2V0KSkgeworICAgIGlmIChwV2lkZ2V0LT5Jc0xvYWRlZCgpKSB7CisgICAgICBpZiAocFNlbmRlci0+SXNMaXN0Qm94KCkpCisgICAgICAgIFRvTGlzdEJveChwV2lkZ2V0KS0+SW5zZXJ0SXRlbShwTGFiZWwsIGlJbmRleCk7CisgICAgICBlbHNlCisgICAgICAgIFRvQ29tYm9Cb3gocFdpZGdldCktPkluc2VydEl0ZW0ocExhYmVsLCBpSW5kZXgpOworICAgIH0KKyAgfQorfQorCit2b2lkIENYRkFfRkZOb3RpZnk6Ok9uV2lkZ2V0TGlzdEl0ZW1SZW1vdmVkKENYRkFfV2lkZ2V0QWNjKiBwU2VuZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlJbmRleCkgeworICBpZiAocFNlbmRlci0+R2V0VUlUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OkNob2ljZUxpc3QpCisgICAgcmV0dXJuOworCisgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPQorICAgICAgbV9wRG9jLT5HZXREb2NWaWV3KCktPkdldFdpZGdldEZvck5vZGUocFNlbmRlci0+R2V0Tm9kZSgpKTsKKyAgZm9yICg7IHBXaWRnZXQ7IHBXaWRnZXQgPSBwU2VuZGVyLT5HZXROZXh0V2lkZ2V0KHBXaWRnZXQpKSB7CisgICAgaWYgKHBXaWRnZXQtPklzTG9hZGVkKCkpIHsKKyAgICAgIGlmIChwU2VuZGVyLT5Jc0xpc3RCb3goKSkKKyAgICAgICAgVG9MaXN0Qm94KHBXaWRnZXQpLT5EZWxldGVJdGVtKGlJbmRleCk7CisgICAgICBlbHNlCisgICAgICAgIFRvQ29tYm9Cb3gocFdpZGdldCktPkRlbGV0ZUl0ZW0oaUluZGV4KTsKKyAgICB9CisgIH0KK30KKworQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBDWEZBX0ZGTm90aWZ5OjpPbkNyZWF0ZUNvbnRhaW5lckxheW91dEl0ZW0oCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSkgeworICBYRkFfRWxlbWVudCB0eXBlID0gcE5vZGUtPkdldEVsZW1lbnRUeXBlKCk7CisgIEFTU0VSVCh0eXBlID09IFhGQV9FbGVtZW50OjpDb250ZW50QXJlYSB8fCB0eXBlID09IFhGQV9FbGVtZW50OjpQYWdlQXJlYSk7CisKKyAgaWYgKHR5cGUgPT0gWEZBX0VsZW1lbnQ6OlBhZ2VBcmVhKSB7CisgICAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXQgPSBtX3BEb2MtPkdldFhGQURvYygpLT5HZXREb2NMYXlvdXQoKTsKKyAgICByZXR1cm4gbmV3IENYRkFfRkZQYWdlVmlldyhtX3BEb2MtPkdldERvY1ZpZXcocExheW91dCksIHBOb2RlKTsKKyAgfQorICByZXR1cm4gbmV3IENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbShwTm9kZSk7Cit9CisKK0NYRkFfQ29udGVudExheW91dEl0ZW0qIENYRkFfRkZOb3RpZnk6Ok9uQ3JlYXRlQ29udGVudExheW91dEl0ZW0oCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSkgeworICBBU1NFUlQocE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OkNvbnRlbnRBcmVhKTsKKyAgQVNTRVJUKHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpQYWdlQXJlYSk7CisKKyAgLy8gV2Ugb25seSBuZWVkIHRvIGNyZWF0ZSB0aGUgd2lkZ2V0IGZvciBjZXJ0YWluIHR5cGVzIG9mIG9iamVjdHMuCisgIGlmICghcE5vZGUtPkhhc0NyZWF0ZWRVSVdpZGdldCgpKQorICAgIHJldHVybiBuZXcgQ1hGQV9Db250ZW50TGF5b3V0SXRlbShwTm9kZSk7CisKKyAgQ1hGQV9GRldpZGdldCogcFdpZGdldDsKKyAgc3dpdGNoIChwTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldFVJVHlwZSgpKSB7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QmFyY29kZToKKyAgICAgIHBXaWRnZXQgPSBuZXcgQ1hGQV9GRkJhcmNvZGUocE5vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QnV0dG9uOgorICAgICAgcFdpZGdldCA9IG5ldyBDWEZBX0ZGUHVzaEJ1dHRvbihwTm9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDaGVja0J1dHRvbjoKKyAgICAgIHBXaWRnZXQgPSBuZXcgQ1hGQV9GRkNoZWNrQnV0dG9uKHBOb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNob2ljZUxpc3Q6IHsKKyAgICAgIGlmIChwTm9kZS0+R2V0V2lkZ2V0QWNjKCktPklzTGlzdEJveCgpKQorICAgICAgICBwV2lkZ2V0ID0gbmV3IENYRkFfRkZMaXN0Qm94KHBOb2RlKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcFdpZGdldCA9IG5ldyBDWEZBX0ZGQ29tYm9Cb3gocE5vZGUpOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RGF0ZVRpbWVFZGl0OgorICAgICAgcFdpZGdldCA9IG5ldyBDWEZBX0ZGRGF0ZVRpbWVFZGl0KHBOb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkltYWdlRWRpdDoKKyAgICAgIHBXaWRnZXQgPSBuZXcgQ1hGQV9GRkltYWdlRWRpdChwTm9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpOdW1lcmljRWRpdDoKKyAgICAgIHBXaWRnZXQgPSBuZXcgQ1hGQV9GRk51bWVyaWNFZGl0KHBOb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBhc3N3b3JkRWRpdDoKKyAgICAgIHBXaWRnZXQgPSBuZXcgQ1hGQV9GRlBhc3N3b3JkRWRpdChwTm9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTaWduYXR1cmU6CisgICAgICBwV2lkZ2V0ID0gbmV3IENYRkFfRkZTaWduYXR1cmUocE5vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VGV4dEVkaXQ6CisgICAgICBwV2lkZ2V0ID0gbmV3IENYRkFfRkZUZXh0RWRpdChwTm9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpBcmM6CisgICAgICBwV2lkZ2V0ID0gbmV3IENYRkFfRkZBcmMocE5vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TGluZToKKyAgICAgIHBXaWRnZXQgPSBuZXcgQ1hGQV9GRkxpbmUocE5vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UmVjdGFuZ2xlOgorICAgICAgcFdpZGdldCA9IG5ldyBDWEZBX0ZGUmVjdGFuZ2xlKHBOb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRleHQ6CisgICAgICBwV2lkZ2V0ID0gbmV3IENYRkFfRkZUZXh0KHBOb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkltYWdlOgorICAgICAgcFdpZGdldCA9IG5ldyBDWEZBX0ZGSW1hZ2UocE5vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RHJhdzoKKyAgICAgIHBXaWRnZXQgPSBuZXcgQ1hGQV9GRkRyYXcocE5vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U3ViZm9ybToKKyAgICAgIHBXaWRnZXQgPSBuZXcgQ1hGQV9GRlN1YkZvcm0ocE5vZGUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RXhjbEdyb3VwOgorICAgICAgcFdpZGdldCA9IG5ldyBDWEZBX0ZGRXhjbEdyb3VwKHBOb2RlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRlZmF1bHRVaToKKyAgICBkZWZhdWx0OgorICAgICAgcFdpZGdldCA9IG51bGxwdHI7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChwV2lkZ2V0KSB7CisgICAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXQgPSBtX3BEb2MtPkdldFhGQURvYygpLT5HZXREb2NMYXlvdXQoKTsKKyAgICBwV2lkZ2V0LT5TZXREb2NWaWV3KG1fcERvYy0+R2V0RG9jVmlldyhwTGF5b3V0KSk7CisgIH0KKyAgcmV0dXJuIHBXaWRnZXQ7Cit9CisKK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6U3RhcnRGaWVsZERyYXdMYXlvdXQoQ1hGQV9Ob2RlKiBwSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQmIGZDYWxjV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0JiBmQ2FsY0hlaWdodCkgeworICBDWEZBX1dpZGdldEFjYyogcEFjYyA9IHBJdGVtLT5HZXRXaWRnZXRBY2MoKTsKKyAgaWYgKCFwQWNjKQorICAgIHJldHVybjsKKworICBwQWNjLT5TdGFydFdpZGdldExheW91dChtX3BEb2MuR2V0KCksIGZDYWxjV2lkdGgsIGZDYWxjSGVpZ2h0KTsKK30KKworYm9vbCBDWEZBX0ZGTm90aWZ5OjpGaW5kU3BsaXRQb3MoQ1hGQV9Ob2RlKiBwSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJsb2NrSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCYgZkNhbGNIZWlnaHRQb3MpIHsKKyAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBwSXRlbS0+R2V0V2lkZ2V0QWNjKCk7CisgIHJldHVybiBwQWNjICYmCisgICAgICAgICBwQWNjLT5GaW5kU3BsaXRQb3MobV9wRG9jLT5HZXREb2NWaWV3KCksIGlCbG9ja0luZGV4LCBmQ2FsY0hlaWdodFBvcyk7Cit9CisKK2Jvb2wgQ1hGQV9GRk5vdGlmeTo6UnVuU2NyaXB0KENYRkFfU2NyaXB0KiBzY3JpcHQsIENYRkFfTm9kZSogaXRlbSkgeworICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsKKyAgaWYgKCFwRG9jVmlldykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQ1hGQV9FdmVudFBhcmFtIEV2ZW50UGFyYW07CisgIEV2ZW50UGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9Vbmtub3duOworCisgIGludDMyX3QgaVJldDsKKyAgYm9vbCBiUmV0OworICBzdGQ6OnRpZShpUmV0LCBiUmV0KSA9IGl0ZW0tPkV4ZWN1dGVCb29sU2NyaXB0KHBEb2NWaWV3LCBzY3JpcHQsICZFdmVudFBhcmFtKTsKKyAgcmV0dXJuIGlSZXQgPT0gWEZBX0VWRU5URVJST1JfU3VjY2VzcyAmJiBiUmV0OworfQorCitpbnQzMl90IENYRkFfRkZOb3RpZnk6OkV4ZWNFdmVudEJ5RGVlcEZpcnN0KENYRkFfTm9kZSogcEZvcm1Ob2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYklzRm9ybVJlYWR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZWN1cnNpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwRXhjbHVkZSkgeworICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsKKyAgaWYgKCFwRG9jVmlldykKKyAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7CisgIHJldHVybiBwRG9jVmlldy0+RXhlY0V2ZW50QWN0aXZpdHlCeURlZXBGaXJzdCgKKyAgICAgIHBGb3JtTm9kZSwgZUV2ZW50VHlwZSwgYklzRm9ybVJlYWR5LCBiUmVjdXJzaXZlLAorICAgICAgcEV4Y2x1ZGUgPyBwRXhjbHVkZS0+R2V0Tm9kZSgpIDogbnVsbHB0cik7Cit9CisKK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6QWRkQ2FsY1ZhbGlkYXRlKENYRkFfTm9kZSogcE5vZGUpIHsKKyAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7CisgIGlmICghcERvY1ZpZXcpCisgICAgcmV0dXJuOworCisgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjID0gcE5vZGUtPkdldFdpZGdldEFjYygpOworICBpZiAoIXBXaWRnZXRBY2MpCisgICAgcmV0dXJuOworCisgIHBEb2NWaWV3LT5BZGRDYWxjdWxhdGVXaWRnZXRBY2MocFdpZGdldEFjYyk7CisgIHBEb2NWaWV3LT5BZGRWYWxpZGF0ZVdpZGdldChwV2lkZ2V0QWNjKTsKK30KKworQ1hGQV9GRkRvYyogQ1hGQV9GRk5vdGlmeTo6R2V0SERPQygpIHsKKyAgcmV0dXJuIG1fcERvYy5HZXQoKTsKK30KKworSVhGQV9Eb2NFbnZpcm9ubWVudCogQ1hGQV9GRk5vdGlmeTo6R2V0RG9jRW52aXJvbm1lbnQoKSBjb25zdCB7CisgIHJldHVybiBtX3BEb2MtPkdldERvY0Vudmlyb25tZW50KCk7Cit9CisKK0lYRkFfQXBwUHJvdmlkZXIqIENYRkFfRkZOb3RpZnk6OkdldEFwcFByb3ZpZGVyKCkgeworICByZXR1cm4gbV9wRG9jLT5HZXRBcHAoKS0+R2V0QXBwUHJvdmlkZXIoKTsKK30KKworQ1hGQV9GRldpZGdldEhhbmRsZXIqIENYRkFfRkZOb3RpZnk6OkdldFdpZGdldEhhbmRsZXIoKSB7CisgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOworICByZXR1cm4gcERvY1ZpZXcgPyBwRG9jVmlldy0+R2V0V2lkZ2V0SGFuZGxlcigpIDogbnVsbHB0cjsKK30KKworQ1hGQV9GRldpZGdldCogQ1hGQV9GRk5vdGlmeTo6R2V0SFdpZGdldChDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKSB7CisgIHJldHVybiBYRkFfR2V0V2lkZ2V0RnJvbUxheW91dEl0ZW0ocExheW91dEl0ZW0pOworfQorCit2b2lkIENYRkFfRkZOb3RpZnk6Ok9wZW5Ecm9wRG93bkxpc3QoQ1hGQV9GRldpZGdldCogaFdpZGdldCkgeworICBpZiAoaFdpZGdldC0+R2V0Tm9kZSgpLT5HZXRXaWRnZXRBY2MoKS0+R2V0VUlUeXBlKCkgIT0KKyAgICAgIFhGQV9FbGVtZW50OjpDaG9pY2VMaXN0KQorICAgIHJldHVybjsKKworICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsKKyAgcERvY1ZpZXctPkxvY2tVcGRhdGUoKTsKKyAgVG9Db21ib0JveChoV2lkZ2V0KS0+T3BlbkRyb3BEb3duTGlzdCgpOworICBwRG9jVmlldy0+VW5sb2NrVXBkYXRlKCk7CisgIHBEb2NWaWV3LT5VcGRhdGVEb2NWaWV3KCk7Cit9CisKK1dpZGVTdHJpbmcgQ1hGQV9GRk5vdGlmeTo6R2V0Q3VycmVudERhdGVUaW1lKCkgeworICBDRlhfRGF0ZVRpbWUgZGF0YVRpbWUgPSBDRlhfRGF0ZVRpbWU6Ok5vdygpOworICByZXR1cm4gV2lkZVN0cmluZzo6Rm9ybWF0KEwiJWQlMDJkJTAyZFQlMDJkJTAyZCUwMmQiLCBkYXRhVGltZS5HZXRZZWFyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVRpbWUuR2V0TW9udGgoKSwgZGF0YVRpbWUuR2V0RGF5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVRpbWUuR2V0SG91cigpLCBkYXRhVGltZS5HZXRNaW51dGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVGltZS5HZXRTZWNvbmQoKSk7Cit9CisKK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6UmVzZXREYXRhKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjKSB7CisgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOworICBpZiAoIXBEb2NWaWV3KQorICAgIHJldHVybjsKKworICBwRG9jVmlldy0+UmVzZXRXaWRnZXRBY2MocFdpZGdldEFjYyk7Cit9CisKK2ludDMyX3QgQ1hGQV9GRk5vdGlmeTo6R2V0TGF5b3V0U3RhdHVzKCkgeworICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsKKyAgcmV0dXJuIHBEb2NWaWV3ID8gcERvY1ZpZXctPkdldExheW91dFN0YXR1cygpIDogMDsKK30KKwordm9pZCBDWEZBX0ZGTm90aWZ5OjpSdW5Ob2RlSW5pdGlhbGl6ZShDWEZBX05vZGUqIHBOb2RlKSB7CisgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOworICBpZiAoIXBEb2NWaWV3KQorICAgIHJldHVybjsKKworICBwRG9jVmlldy0+QWRkTmV3Rm9ybU5vZGUocE5vZGUpOworfQorCit2b2lkIENYRkFfRkZOb3RpZnk6OlJ1blN1YmZvcm1JbmRleENoYW5nZShDWEZBX05vZGUqIHBTdWJmb3JtTm9kZSkgeworICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsKKyAgaWYgKCFwRG9jVmlldykKKyAgICByZXR1cm47CisKKyAgcERvY1ZpZXctPkFkZEluZGV4Q2hhbmdlZFN1YmZvcm0ocFN1YmZvcm1Ob2RlKTsKK30KKworQ1hGQV9Ob2RlKiBDWEZBX0ZGTm90aWZ5OjpHZXRGb2N1c1dpZGdldE5vZGUoKSB7CisgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOworICBpZiAoIXBEb2NWaWV3KQorICAgIHJldHVybiBudWxscHRyOworCisgIENYRkFfV2lkZ2V0QWNjKiBwQWNjID0gcERvY1ZpZXctPkdldEZvY3VzV2lkZ2V0QWNjKCk7CisgIHJldHVybiBwQWNjID8gcEFjYy0+R2V0Tm9kZSgpIDogbnVsbHB0cjsKK30KKwordm9pZCBDWEZBX0ZGTm90aWZ5OjpTZXRGb2N1c1dpZGdldE5vZGUoQ1hGQV9Ob2RlKiBwTm9kZSkgeworICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsKKyAgaWYgKCFwRG9jVmlldykKKyAgICByZXR1cm47CisKKyAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBwTm9kZSA/IHBOb2RlLT5HZXRXaWRnZXRBY2MoKSA6IG51bGxwdHI7CisgIHBEb2NWaWV3LT5TZXRGb2N1c1dpZGdldEFjYyhwQWNjKTsKK30KKwordm9pZCBDWEZBX0ZGTm90aWZ5OjpPbk5vZGVSZWFkeShDWEZBX05vZGUqIHBOb2RlKSB7CisgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldygpOworICBpZiAoIXBEb2NWaWV3KQorICAgIHJldHVybjsKKworICBpZiAocE5vZGUtPkhhc0NyZWF0ZWRVSVdpZGdldCgpKSB7CisgICAgcE5vZGUtPkNyZWF0ZVdpZGdldEFjYygpOworICAgIHJldHVybjsKKyAgfQorCisgIHN3aXRjaCAocE5vZGUtPkdldEVsZW1lbnRUeXBlKCkpIHsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpCaW5kSXRlbXM6CisgICAgICBwRG9jVmlldy0+QWRkQmluZEl0ZW0oc3RhdGljX2Nhc3Q8Q1hGQV9CaW5kSXRlbXMqPihwTm9kZSkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VmFsaWRhdGU6CisgICAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTm9kZUZsYWdfTmVlZHNJbml0QXBwLCBmYWxzZSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCBDWEZBX0ZGTm90aWZ5OjpPblZhbHVlQ2hhbmdpbmcoQ1hGQV9Ob2RlKiBwU2VuZGVyLCBYRkFfQXR0cmlidXRlIGVBdHRyKSB7CisgIGlmIChlQXR0ciAhPSBYRkFfQXR0cmlidXRlOjpQcmVzZW5jZSkKKyAgICByZXR1cm47CisgIGlmIChwU2VuZGVyLT5HZXRQYWNrZXRUeXBlKCkgPT0gWEZBX1BhY2tldFR5cGU6OkRhdGFzZXRzKQorICAgIHJldHVybjsKKyAgaWYgKCFwU2VuZGVyLT5Jc0Zvcm1Db250YWluZXIoKSkKKyAgICByZXR1cm47CisKKyAgQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3ID0gbV9wRG9jLT5HZXREb2NWaWV3KCk7CisgIGlmICghcERvY1ZpZXcpCisgICAgcmV0dXJuOworICBpZiAocERvY1ZpZXctPkdldExheW91dFN0YXR1cygpIDwgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZCkKKyAgICByZXR1cm47CisKKyAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwU2VuZGVyLT5HZXRXaWRnZXRBY2MoKTsKKyAgaWYgKCFwV2lkZ2V0QWNjKQorICAgIHJldHVybjsKKworICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0KKyAgICAgIG1fcERvYy0+R2V0RG9jVmlldygpLT5HZXRXaWRnZXRGb3JOb2RlKHBXaWRnZXRBY2MtPkdldE5vZGUoKSk7CisgIGZvciAoOyBwV2lkZ2V0OyBwV2lkZ2V0ID0gcFdpZGdldEFjYy0+R2V0TmV4dFdpZGdldChwV2lkZ2V0KSkgeworICAgIGlmIChwV2lkZ2V0LT5Jc0xvYWRlZCgpKQorICAgICAgcFdpZGdldC0+QWRkSW52YWxpZGF0ZVJlY3QoKTsKKyAgfQorfQorCit2b2lkIENYRkFfRkZOb3RpZnk6Ok9uVmFsdWVDaGFuZ2VkKENYRkFfTm9kZSogcFNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlQXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwV2lkZ2V0Tm9kZSkgeworICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsKKyAgaWYgKCFwRG9jVmlldykKKyAgICByZXR1cm47CisKKyAgaWYgKHBTZW5kZXItPkdldFBhY2tldFR5cGUoKSAhPSBYRkFfUGFja2V0VHlwZTo6Rm9ybSkgeworICAgIGlmIChlQXR0ciA9PSBYRkFfQXR0cmlidXRlOjpWYWx1ZSkKKyAgICAgIHBEb2NWaWV3LT5BZGRDYWxjdWxhdGVOb2RlTm90aWZ5KHBTZW5kZXIpOworICAgIHJldHVybjsKKyAgfQorCisgIFhGQV9FbGVtZW50IGVUeXBlID0gcFBhcmVudE5vZGUtPkdldEVsZW1lbnRUeXBlKCk7CisgIGJvb2wgYklzQ29udGFpbmVyTm9kZSA9IHBQYXJlbnROb2RlLT5Jc0NvbnRhaW5lck5vZGUoKTsKKyAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwV2lkZ2V0Tm9kZS0+R2V0V2lkZ2V0QWNjKCk7CisgIGlmICghcFdpZGdldEFjYykKKyAgICByZXR1cm47CisKKyAgYm9vbCBiVXBkYXRlUHJvcGVydHkgPSBmYWxzZTsKKyAgcERvY1ZpZXctPlNldENoYW5nZU1hcmsoKTsKKyAgc3dpdGNoIChlVHlwZSkgeworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNhcHRpb246IHsKKyAgICAgIENYRkFfVGV4dExheW91dCogcENhcE91dCA9IHBXaWRnZXRBY2MtPkdldENhcHRpb25UZXh0TGF5b3V0KCk7CisgICAgICBpZiAoIXBDYXBPdXQpCisgICAgICAgIHJldHVybjsKKworICAgICAgcENhcE91dC0+VW5sb2FkKCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VWk6CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UGFyYToKKyAgICAgIGJVcGRhdGVQcm9wZXJ0eSA9IHRydWU7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKGJJc0NvbnRhaW5lck5vZGUgJiYgZUF0dHIgPT0gWEZBX0F0dHJpYnV0ZTo6QWNjZXNzKQorICAgIGJVcGRhdGVQcm9wZXJ0eSA9IHRydWU7CisKKyAgaWYgKGVBdHRyID09IFhGQV9BdHRyaWJ1dGU6OlZhbHVlKSB7CisgICAgcERvY1ZpZXctPkFkZENhbGN1bGF0ZU5vZGVOb3RpZnkocFNlbmRlcik7CisgICAgaWYgKGVUeXBlID09IFhGQV9FbGVtZW50OjpWYWx1ZSB8fCBiSXNDb250YWluZXJOb2RlKSB7CisgICAgICBpZiAoYklzQ29udGFpbmVyTm9kZSkgeworICAgICAgICBwV2lkZ2V0QWNjLT5VcGRhdGVVSURpc3BsYXkobV9wRG9jLT5HZXREb2NWaWV3KCksIG51bGxwdHIpOworICAgICAgICBwRG9jVmlldy0+QWRkQ2FsY3VsYXRlV2lkZ2V0QWNjKHBXaWRnZXRBY2MpOworICAgICAgICBwRG9jVmlldy0+QWRkVmFsaWRhdGVXaWRnZXQocFdpZGdldEFjYyk7CisgICAgICB9IGVsc2UgaWYgKHBXaWRnZXROb2RlLT5HZXRQYXJlbnQoKS0+R2V0RWxlbWVudFR5cGUoKSA9PQorICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RXhjbEdyb3VwKSB7CisgICAgICAgIHBXaWRnZXRBY2MtPlVwZGF0ZVVJRGlzcGxheShtX3BEb2MtPkdldERvY1ZpZXcoKSwgbnVsbHB0cik7CisgICAgICB9CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9CisgICAgICBtX3BEb2MtPkdldERvY1ZpZXcoKS0+R2V0V2lkZ2V0Rm9yTm9kZShwV2lkZ2V0QWNjLT5HZXROb2RlKCkpOworICBmb3IgKDsgcFdpZGdldDsgcFdpZGdldCA9IHBXaWRnZXRBY2MtPkdldE5leHRXaWRnZXQocFdpZGdldCkpIHsKKyAgICBpZiAoIXBXaWRnZXQtPklzTG9hZGVkKCkpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChiVXBkYXRlUHJvcGVydHkpCisgICAgICBwV2lkZ2V0LT5VcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOworICAgIHBXaWRnZXQtPlBlcmZvcm1MYXlvdXQoKTsKKyAgICBwV2lkZ2V0LT5BZGRJbnZhbGlkYXRlUmVjdCgpOworICB9Cit9CisKK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T25DaGlsZEFkZGVkKENYRkFfTm9kZSogcFNlbmRlcikgeworICBpZiAoIXBTZW5kZXItPklzRm9ybUNvbnRhaW5lcigpKQorICAgIHJldHVybjsKKworICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsKKyAgaWYgKCFwRG9jVmlldykKKyAgICByZXR1cm47CisKKyAgYm9vbCBiTGF5b3V0UmVhZHkgPQorICAgICAgIShwRG9jVmlldy0+bV9iSW5MYXlvdXRTdGF0dXMpICYmCisgICAgICAocERvY1ZpZXctPkdldExheW91dFN0YXR1cygpID09IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19FbmQpOworICBpZiAoYkxheW91dFJlYWR5KQorICAgIG1fcERvYy0+R2V0RG9jRW52aXJvbm1lbnQoKS0+U2V0Q2hhbmdlTWFyayhtX3BEb2MuR2V0KCkpOworfQorCit2b2lkIENYRkFfRkZOb3RpZnk6Ok9uQ2hpbGRSZW1vdmVkKCkgeworICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcoKTsKKyAgaWYgKCFwRG9jVmlldykKKyAgICByZXR1cm47CisKKyAgYm9vbCBiTGF5b3V0UmVhZHkgPQorICAgICAgIShwRG9jVmlldy0+bV9iSW5MYXlvdXRTdGF0dXMpICYmCisgICAgICAocERvY1ZpZXctPkdldExheW91dFN0YXR1cygpID09IFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19FbmQpOworICBpZiAoYkxheW91dFJlYWR5KQorICAgIG1fcERvYy0+R2V0RG9jRW52aXJvbm1lbnQoKS0+U2V0Q2hhbmdlTWFyayhtX3BEb2MuR2V0KCkpOworfQorCit2b2lkIENYRkFfRkZOb3RpZnk6Ok9uTGF5b3V0SXRlbUFkZGVkKENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBTZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBhZ2VJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSB7CisgIENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyA9IG1fcERvYy0+R2V0RG9jVmlldyhwTGF5b3V0KTsKKyAgaWYgKCFwRG9jVmlldykKKyAgICByZXR1cm47CisKKyAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9HZXRXaWRnZXRGcm9tTGF5b3V0SXRlbShwU2VuZGVyKTsKKyAgaWYgKCFwV2lkZ2V0KQorICAgIHJldHVybjsKKworICBDWEZBX0ZGUGFnZVZpZXcqIHBOZXdQYWdlVmlldyA9IHBEb2NWaWV3LT5HZXRQYWdlVmlldyhpUGFnZUlkeCk7CisgIHVpbnQzMl90IGR3RmlsdGVyID0gWEZBX1dpZGdldFN0YXR1c19WaXNpYmxlIHwgWEZBX1dpZGdldFN0YXR1c19WaWV3YWJsZSB8CisgICAgICAgICAgICAgICAgICAgICAgWEZBX1dpZGdldFN0YXR1c19QcmludGFibGU7CisgIHBXaWRnZXQtPk1vZGlmeVN0YXR1cyhkd1N0YXR1cywgZHdGaWx0ZXIpOworICBDWEZBX0ZGUGFnZVZpZXcqIHBQcmVQYWdlVmlldyA9IHBXaWRnZXQtPkdldFBhZ2VWaWV3KCk7CisgIGlmIChwUHJlUGFnZVZpZXcgIT0gcE5ld1BhZ2VWaWV3IHx8CisgICAgICAoZHdTdGF0dXMgJiAoWEZBX1dpZGdldFN0YXR1c19WaXNpYmxlIHwgWEZBX1dpZGdldFN0YXR1c19WaWV3YWJsZSkpID09CisgICAgICAgICAgKFhGQV9XaWRnZXRTdGF0dXNfVmlzaWJsZSB8IFhGQV9XaWRnZXRTdGF0dXNfVmlld2FibGUpKSB7CisgICAgcFdpZGdldC0+U2V0UGFnZVZpZXcocE5ld1BhZ2VWaWV3KTsKKyAgICBtX3BEb2MtPkdldERvY0Vudmlyb25tZW50KCktPldpZGdldFBvc3RBZGQoCisgICAgICAgIHBXaWRnZXQsIHBXaWRnZXQtPkdldE5vZGUoKS0+R2V0V2lkZ2V0QWNjKCkpOworICB9CisgIGlmIChwRG9jVmlldy0+R2V0TGF5b3V0U3RhdHVzKCkgIT0gWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0VuZCB8fAorICAgICAgIShkd1N0YXR1cyAmIFhGQV9XaWRnZXRTdGF0dXNfVmlzaWJsZSkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHBXaWRnZXQtPklzTG9hZGVkKCkpIHsKKyAgICBpZiAocFdpZGdldC0+R2V0V2lkZ2V0UmVjdCgpICE9IHBXaWRnZXQtPlJlY2FjaGVXaWRnZXRSZWN0KCkpCisgICAgICBwV2lkZ2V0LT5QZXJmb3JtTGF5b3V0KCk7CisgIH0gZWxzZSB7CisgICAgcFdpZGdldC0+TG9hZFdpZGdldCgpOworICB9CisgIHBXaWRnZXQtPkFkZEludmFsaWRhdGVSZWN0KCk7Cit9CisKK3ZvaWQgQ1hGQV9GRk5vdGlmeTo6T25MYXlvdXRJdGVtUmVtb3ZpbmcoQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcFNlbmRlcikgeworICBDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcgPSBtX3BEb2MtPkdldERvY1ZpZXcocExheW91dCk7CisgIGlmICghcERvY1ZpZXcpCisgICAgcmV0dXJuOworCisgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBYRkFfR2V0V2lkZ2V0RnJvbUxheW91dEl0ZW0ocFNlbmRlcik7CisgIGlmICghcFdpZGdldCkKKyAgICByZXR1cm47CisKKyAgcERvY1ZpZXctPkRlbGV0ZUxheW91dEl0ZW0ocFdpZGdldCk7CisgIG1fcERvYy0+R2V0RG9jRW52aXJvbm1lbnQoKS0+V2lkZ2V0UHJlUmVtb3ZlKAorICAgICAgcFdpZGdldCwgcFdpZGdldC0+R2V0Tm9kZSgpLT5HZXRXaWRnZXRBY2MoKSk7CisgIHBXaWRnZXQtPkFkZEludmFsaWRhdGVSZWN0KCk7Cit9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX2Zmbm90aWZ5LmggYi94ZmEvZnhmYS9jeGZhX2Zmbm90aWZ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI0YTA2MAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZmZub3RpZnkuaApAQCAtMCwwICsxLDgxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfQ1hGQV9GRk5PVElGWV9IXworI2RlZmluZSBYRkFfRlhGQV9DWEZBX0ZGTk9USUZZX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgorCitjbGFzcyBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjsKK2NsYXNzIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbTsKK2NsYXNzIENYRkFfQ29udGVudExheW91dEl0ZW07CisKK2NsYXNzIENYRkFfRkZOb3RpZnkgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1hGQV9GRk5vdGlmeShDWEZBX0ZGRG9jKiBwRG9jKTsKKyAgfkNYRkFfRkZOb3RpZnkoKTsKKworICB2b2lkIE9uUGFnZUV2ZW50KENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcFNlbmRlciwgdWludDMyX3QgZHdFdmVudCk7CisKKyAgdm9pZCBPbldpZGdldExpc3RJdGVtQWRkZWQoQ1hGQV9XaWRnZXRBY2MqIHBTZW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QqIHBMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlJbmRleCk7CisgIHZvaWQgT25XaWRnZXRMaXN0SXRlbVJlbW92ZWQoQ1hGQV9XaWRnZXRBY2MqIHBTZW5kZXIsIGludDMyX3QgaUluZGV4KTsKKworICAvLyBOb2RlIGV2ZW50cworICB2b2lkIE9uTm9kZVJlYWR5KENYRkFfTm9kZSogcE5vZGUpOworICB2b2lkIE9uVmFsdWVDaGFuZ2luZyhDWEZBX05vZGUqIHBTZW5kZXIsIFhGQV9BdHRyaWJ1dGUgZUF0dHIpOworICB2b2lkIE9uVmFsdWVDaGFuZ2VkKENYRkFfTm9kZSogcFNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlIGVBdHRyLAorICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwV2lkZ2V0Tm9kZSk7CisgIHZvaWQgT25DaGlsZEFkZGVkKENYRkFfTm9kZSogcFNlbmRlcik7CisgIHZvaWQgT25DaGlsZFJlbW92ZWQoKTsKKworICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIE9uQ3JlYXRlQ29udGFpbmVyTGF5b3V0SXRlbShDWEZBX05vZGUqIHBOb2RlKTsKKyAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogT25DcmVhdGVDb250ZW50TGF5b3V0SXRlbShDWEZBX05vZGUqIHBOb2RlKTsKKworICB2b2lkIE9uTGF5b3V0SXRlbUFkZGVkKENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcFNlbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQYWdlSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKTsKKyAgdm9pZCBPbkxheW91dEl0ZW1SZW1vdmluZyhDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBTZW5kZXIpOworCisgIHZvaWQgU3RhcnRGaWVsZERyYXdMYXlvdXQoQ1hGQV9Ob2RlKiBwSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCYgZkNhbGNXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCYgZkNhbGNIZWlnaHQpOworICBib29sIEZpbmRTcGxpdFBvcyhDWEZBX05vZGUqIHBJdGVtLAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCbG9ja0luZGV4LAorICAgICAgICAgICAgICAgICAgICBmbG9hdCYgZkNhbGNIZWlnaHRQb3MpOworICBib29sIFJ1blNjcmlwdChDWEZBX1NjcmlwdCogcFNjcmlwdCwgQ1hGQV9Ob2RlKiBwRm9ybUl0ZW0pOworICBpbnQzMl90IEV4ZWNFdmVudEJ5RGVlcEZpcnN0KENYRkFfTm9kZSogcEZvcm1Ob2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJc0Zvcm1SZWFkeSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJlY3Vyc2l2ZSA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBFeGNsdWRlID0gbnVsbHB0cik7CisgIHZvaWQgQWRkQ2FsY1ZhbGlkYXRlKENYRkFfTm9kZSogcE5vZGUpOworICBDWEZBX0ZGRG9jKiBHZXRIRE9DKCk7CisgIElYRkFfRG9jRW52aXJvbm1lbnQqIEdldERvY0Vudmlyb25tZW50KCkgY29uc3Q7CisgIElYRkFfQXBwUHJvdmlkZXIqIEdldEFwcFByb3ZpZGVyKCk7CisgIENYRkFfRkZXaWRnZXRIYW5kbGVyKiBHZXRXaWRnZXRIYW5kbGVyKCk7CisgIENYRkFfRkZXaWRnZXQqIEdldEhXaWRnZXQoQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSk7CisgIHZvaWQgT3BlbkRyb3BEb3duTGlzdChDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0KTsKKyAgV2lkZVN0cmluZyBHZXRDdXJyZW50RGF0ZVRpbWUoKTsKKyAgdm9pZCBSZXNldERhdGEoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBudWxscHRyKTsKKyAgaW50MzJfdCBHZXRMYXlvdXRTdGF0dXMoKTsKKyAgdm9pZCBSdW5Ob2RlSW5pdGlhbGl6ZShDWEZBX05vZGUqIHBOb2RlKTsKKyAgdm9pZCBSdW5TdWJmb3JtSW5kZXhDaGFuZ2UoQ1hGQV9Ob2RlKiBwU3ViZm9ybU5vZGUpOworICBDWEZBX05vZGUqIEdldEZvY3VzV2lkZ2V0Tm9kZSgpOworICB2b2lkIFNldEZvY3VzV2lkZ2V0Tm9kZShDWEZBX05vZGUqIHBOb2RlKTsKKworIHByaXZhdGU6CisgIFVub3duZWRQdHI8Q1hGQV9GRkRvYz4gY29uc3QgbV9wRG9jOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9DWEZBX0ZGTk9USUZZX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX2ZmbnVtZXJpY2VkaXQuY3BwIGIveGZhL2Z4ZmEvY3hmYV9mZm51bWVyaWNlZGl0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDM3YmMyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9mZm51bWVyaWNlZGl0LmNwcApAQCAtMCwwICsxLDkxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmbnVtZXJpY2VkaXQuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfZWRpdC5oIgorI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9ldmVudHZhbGlkYXRlLmgiCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX25vdGVkcml2ZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZG9jLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxldmFsdWUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV91dGlscy5oIgorCitDWEZBX0ZGTnVtZXJpY0VkaXQ6OkNYRkFfRkZOdW1lcmljRWRpdChDWEZBX05vZGUqIHBOb2RlKQorICAgIDogQ1hGQV9GRlRleHRFZGl0KHBOb2RlKSB7fQorCitDWEZBX0ZGTnVtZXJpY0VkaXQ6On5DWEZBX0ZGTnVtZXJpY0VkaXQoKSB7fQorCitib29sIENYRkFfRkZOdW1lcmljRWRpdDo6TG9hZFdpZGdldCgpIHsKKyAgYXV0byBwTmV3RWRpdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRldMX0VkaXQ+KAorICAgICAgR2V0RldMQXBwKCksIHBkZml1bTo6TWFrZVVuaXF1ZTxDRldMX1dpZGdldFByb3BlcnRpZXM+KCksIG51bGxwdHIpOworICBDRldMX0VkaXQqIHBXaWRnZXQgPSBwTmV3RWRpdC5nZXQoKTsKKyAgbV9wTm9ybWFsV2lkZ2V0ID0gc3RkOjptb3ZlKHBOZXdFZGl0KTsKKyAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRMYXlvdXRJdGVtKHRoaXMpOworCisgIENGV0xfTm90ZURyaXZlciogcE5vdGVEcml2ZXIgPQorICAgICAgbV9wTm9ybWFsV2lkZ2V0LT5HZXRPd25lckFwcCgpLT5HZXROb3RlRHJpdmVyKCk7CisgIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KG1fcE5vcm1hbFdpZGdldC5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wTm9ybWFsV2lkZ2V0LmdldCgpKTsKKyAgbV9wT2xkRGVsZWdhdGUgPSBtX3BOb3JtYWxXaWRnZXQtPkdldERlbGVnYXRlKCk7CisgIG1fcE5vcm1hbFdpZGdldC0+U2V0RGVsZWdhdGUodGhpcyk7CisgIG1fcE5vcm1hbFdpZGdldC0+TG9ja1VwZGF0ZSgpOworCisgIHBXaWRnZXQtPlNldFRleHQobV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldFZhbHVlKFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSkpOworICBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpOworICBtX3BOb3JtYWxXaWRnZXQtPlVubG9ja1VwZGF0ZSgpOworICByZXR1cm4gQ1hGQV9GRkZpZWxkOjpMb2FkV2lkZ2V0KCk7Cit9CisKK3ZvaWQgQ1hGQV9GRk51bWVyaWNFZGl0OjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIHsKKyAgQ0ZXTF9FZGl0KiBwV2lkZ2V0ID0gc3RhdGljX2Nhc3Q8Q0ZXTF9FZGl0Kj4obV9wTm9ybWFsV2lkZ2V0LmdldCgpKTsKKyAgaWYgKCFwV2lkZ2V0KQorICAgIHJldHVybjsKKworICB1aW50MzJfdCBkd0V4dGVuZGVkU3R5bGUgPQorICAgICAgRldMX1NUWUxFRVhUX0VEVF9TaG93U2Nyb2xsYmFyRm9jdXMgfCBGV0xfU1RZTEVFWFRfRURUX091dGVyU2Nyb2xsYmFyIHwKKyAgICAgIEZXTF9TVFlMRUVYVF9FRFRfVmFsaWRhdGUgfCBGV0xfU1RZTEVFWFRfRURUX051bWJlcjsKKyAgZHdFeHRlbmRlZFN0eWxlIHw9IFVwZGF0ZVVJUHJvcGVydHkoKTsKKyAgaWYgKCFtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+SXNIb3Jpem9udGFsU2Nyb2xsUG9saWN5T2ZmKCkpCisgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfQXV0b0hTY3JvbGw7CisKKyAgT3B0aW9uYWw8aW50MzJfdD4gbnVtQ2VsbHMgPSBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0TnVtYmVyT2ZDZWxscygpOworICBpZiAobnVtQ2VsbHMgJiYgKm51bUNlbGxzID4gMCkgeworICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX0NvbWJUZXh0OworICAgIHBXaWRnZXQtPlNldExpbWl0KCpudW1DZWxscyk7CisgIH0KKyAgZHdFeHRlbmRlZFN0eWxlIHw9IEdldEFsaWdubWVudCgpOworICBpZiAoIW1fcE5vZGUtPklzT3BlbkFjY2VzcygpIHx8ICFHZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkKKyAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seTsKKworICBtX3BOb3JtYWxXaWRnZXQtPk1vZGlmeVN0eWxlc0V4KGR3RXh0ZW5kZWRTdHlsZSwgMHhGRkZGRkZGRik7Cit9CisKK3ZvaWQgQ1hGQV9GRk51bWVyaWNFZGl0OjpPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIHsKKyAgaWYgKHBFdmVudC0+R2V0VHlwZSgpID09IENGV0xfRXZlbnQ6OlR5cGU6OlZhbGlkYXRlKSB7CisgICAgQ0ZXTF9FdmVudFZhbGlkYXRlKiBldmVudCA9IHN0YXRpY19jYXN0PENGV0xfRXZlbnRWYWxpZGF0ZSo+KHBFdmVudCk7CisgICAgZXZlbnQtPmJWYWxpZGF0ZSA9IE9uVmFsaWRhdGUobV9wTm9ybWFsV2lkZ2V0LmdldCgpLCBldmVudC0+d3NJbnNlcnQpOworICAgIHJldHVybjsKKyAgfQorICBDWEZBX0ZGVGV4dEVkaXQ6Ok9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7Cit9CisKK2Jvb2wgQ1hGQV9GRk51bWVyaWNFZGl0OjpPblZhbGlkYXRlKENGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBXaWRlU3RyaW5nJiB3c1RleHQpIHsKKyAgV2lkZVN0cmluZyB3c1BhdHRlcm4gPQorICAgICAgbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldFBpY3R1cmVDb250ZW50KFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCk7CisgIGlmICghd3NQYXR0ZXJuLklzRW1wdHkoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBXaWRlU3RyaW5nIHdzRm9ybWF0OworICBDWEZBX0xvY2FsZVZhbHVlIHdpZGdldFZhbHVlID0gWEZBX0dldExvY2FsZVZhbHVlKG1fcE5vZGUuR2V0KCkpOworICB3aWRnZXRWYWx1ZS5HZXROdW1lcmljRm9ybWF0KHdzRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRMZWFkRGlnaXRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldEZyYWNEaWdpdHMoKSk7CisgIHJldHVybiB3aWRnZXRWYWx1ZS5WYWxpZGF0ZU51bWVyaWNUZW1wKHdzVGV4dCwgd3NGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE5vZGUtPkdldExvY2FsZSgpKTsKK30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfZmZudW1lcmljZWRpdC5oIGIveGZhL2Z4ZmEvY3hmYV9mZm51bWVyaWNlZGl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQxM2FjNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZmZudW1lcmljZWRpdC5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9DWEZBX0ZGTlVNRVJJQ0VESVRfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfQ1hGQV9GRk5VTUVSSUNFRElUX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZ0ZXh0ZWRpdC5oIgorCitjbGFzcyBDRldMX0V2ZW50OworY2xhc3MgQ0ZXTF9XaWRnZXQ7CitjbGFzcyBDWEZBX1dpZGdldEFjYzsKKworY2xhc3MgQ1hGQV9GRk51bWVyaWNFZGl0IDogcHVibGljIENYRkFfRkZUZXh0RWRpdCB7CisgcHVibGljOgorICBleHBsaWNpdCBDWEZBX0ZGTnVtZXJpY0VkaXQoQ1hGQV9Ob2RlKiBwTm9kZSk7CisgIH5DWEZBX0ZGTnVtZXJpY0VkaXQoKSBvdmVycmlkZTsKKworICAvLyBDWEZBX0ZGVGV4dEVkaXQKKyAgYm9vbCBMb2FkV2lkZ2V0KCkgb3ZlcnJpZGU7CisgIHZvaWQgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKSBvdmVycmlkZTsKKyAgdm9pZCBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgYm9vbCBPblZhbGlkYXRlKENGV0xfV2lkZ2V0KiBwV2lkZ2V0LCBXaWRlU3RyaW5nJiB3c1RleHQpOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9DWEZBX0ZGTlVNRVJJQ0VESVRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfZmZwYWdldmlldy5jcHAgYi94ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMWZiYjUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuY3BwCkBAIC0wLDAgKzEsNDY3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X29iamVjdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmNoZWNrYnV0dG9uLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRvYy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZkb2N2aWV3LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmZpZWxkLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmltYWdlZWRpdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZwdXNoYnV0dG9uLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZndpZGdldC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZndsYWRhcHRlcndpZGdldG1nci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmF2ZXJzYWwuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmF2ZXJzZS5oIgorCituYW1lc3BhY2UgeworCitDRlhfTWF0cml4IEdldFBhZ2VNYXRyaXgoY29uc3QgQ0ZYX1JlY3RGJiBkb2NQYWdlUmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdCYgZGV2aWNlUGFnZVJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUm90YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3Q29vcmRpbmF0ZXNUeXBlKSB7CisgIEFTU0VSVChpUm90YXRlID49IDAgJiYgaVJvdGF0ZSA8PSAzKTsKKworICBib29sIGJGbGlwWCA9IChkd0Nvb3JkaW5hdGVzVHlwZSAmIDB4MDEpICE9IDA7CisgIGJvb2wgYkZsaXBZID0gKGR3Q29vcmRpbmF0ZXNUeXBlICYgMHgwMikgIT0gMDsKKyAgQ0ZYX01hdHJpeCBtKChiRmxpcFggPyAtMS4wZiA6IDEuMGYpLCAwLCAwLCAoYkZsaXBZID8gLTEuMGYgOiAxLjBmKSwgMCwgMCk7CisgIGlmIChpUm90YXRlID09IDAgfHwgaVJvdGF0ZSA9PSAyKSB7CisgICAgbS5hICo9IChmbG9hdClkZXZpY2VQYWdlUmVjdC53aWR0aCAvIGRvY1BhZ2VSZWN0LndpZHRoOworICAgIG0uZCAqPSAoZmxvYXQpZGV2aWNlUGFnZVJlY3QuaGVpZ2h0IC8gZG9jUGFnZVJlY3QuaGVpZ2h0OworICB9IGVsc2UgeworICAgIG0uYSAqPSAoZmxvYXQpZGV2aWNlUGFnZVJlY3QuaGVpZ2h0IC8gZG9jUGFnZVJlY3Qud2lkdGg7CisgICAgbS5kICo9IChmbG9hdClkZXZpY2VQYWdlUmVjdC53aWR0aCAvIGRvY1BhZ2VSZWN0LmhlaWdodDsKKyAgfQorICBtLlJvdGF0ZShpUm90YXRlICogMS41NzA3OTYzMjY3NWYpOworICBzd2l0Y2ggKGlSb3RhdGUpIHsKKyAgICBjYXNlIDA6CisgICAgICBtLmUgPSBiRmxpcFggPyAoZmxvYXQpZGV2aWNlUGFnZVJlY3QucmlnaHQoKSA6IChmbG9hdClkZXZpY2VQYWdlUmVjdC5sZWZ0OworICAgICAgbS5mID0gYkZsaXBZID8gKGZsb2F0KWRldmljZVBhZ2VSZWN0LmJvdHRvbSgpIDogKGZsb2F0KWRldmljZVBhZ2VSZWN0LnRvcDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIG0uZSA9IGJGbGlwWSA/IChmbG9hdClkZXZpY2VQYWdlUmVjdC5sZWZ0IDogKGZsb2F0KWRldmljZVBhZ2VSZWN0LnJpZ2h0KCk7CisgICAgICBtLmYgPSBiRmxpcFggPyAoZmxvYXQpZGV2aWNlUGFnZVJlY3QuYm90dG9tKCkgOiAoZmxvYXQpZGV2aWNlUGFnZVJlY3QudG9wOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgbS5lID0gYkZsaXBYID8gKGZsb2F0KWRldmljZVBhZ2VSZWN0LmxlZnQgOiAoZmxvYXQpZGV2aWNlUGFnZVJlY3QucmlnaHQoKTsKKyAgICAgIG0uZiA9IGJGbGlwWSA/IChmbG9hdClkZXZpY2VQYWdlUmVjdC50b3AgOiAoZmxvYXQpZGV2aWNlUGFnZVJlY3QuYm90dG9tKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICBtLmUgPSBiRmxpcFkgPyAoZmxvYXQpZGV2aWNlUGFnZVJlY3QucmlnaHQoKSA6IChmbG9hdClkZXZpY2VQYWdlUmVjdC5sZWZ0OworICAgICAgbS5mID0gYkZsaXBYID8gKGZsb2F0KWRldmljZVBhZ2VSZWN0LnRvcCA6IChmbG9hdClkZXZpY2VQYWdlUmVjdC5ib3R0b20oKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gbTsKK30KKworYm9vbCBQYWdlV2lkZ2V0RmlsdGVyKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVHJhdmVyc2FsLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYklnbm9yZXJlbGV2YW50KSB7CisgIENYRkFfTm9kZSogcE5vZGUgPSBwV2lkZ2V0LT5HZXROb2RlKCk7CisKKyAgaWYgKCEhKGR3RmlsdGVyICYgWEZBX1dpZGdldFN0YXR1c19Gb2N1c2VkKSAmJgorICAgICAgKCFwTm9kZSB8fCBwTm9kZS0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6RmllbGQpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdWludDMyX3QgZHdTdGF0dXMgPSBwV2lkZ2V0LT5HZXRTdGF0dXMoKTsKKyAgaWYgKGJUcmF2ZXJzYWwgJiYgKGR3U3RhdHVzICYgWEZBX1dpZGdldFN0YXR1c19EaXNhYmxlZCkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoYklnbm9yZXJlbGV2YW50KQorICAgIHJldHVybiAhIShkd1N0YXR1cyAmIFhGQV9XaWRnZXRTdGF0dXNfVmlzaWJsZSk7CisKKyAgZHdGaWx0ZXIgJj0gKFhGQV9XaWRnZXRTdGF0dXNfVmlzaWJsZSB8IFhGQV9XaWRnZXRTdGF0dXNfVmlld2FibGUgfAorICAgICAgICAgICAgICAgWEZBX1dpZGdldFN0YXR1c19QcmludGFibGUpOworICByZXR1cm4gKGR3RmlsdGVyICYgZHdTdGF0dXMpID09IGR3RmlsdGVyOworfQorCitib29sIElzTGF5b3V0RWxlbWVudChYRkFfRWxlbWVudCBlRWxlbWVudCwgYm9vbCBiTGF5b3V0Q29udGFpbmVyKSB7CisgIHN3aXRjaCAoZUVsZW1lbnQpIHsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpEcmF3OgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkZpZWxkOgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6Okluc3RhbmNlTWFuYWdlcjoKKyAgICAgIHJldHVybiAhYkxheW91dENvbnRhaW5lcjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpBcmVhOgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlN1YmZvcm06CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RXhjbEdyb3VwOgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlN1YmZvcm1TZXQ6CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UGFnZUFyZWE6CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Rm9ybToKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRkZQYWdlVmlldzo6Q1hGQV9GRlBhZ2VWaWV3KENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldywgQ1hGQV9Ob2RlKiBwUGFnZUFyZWEpCisgICAgOiBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0ocFBhZ2VBcmVhKSwgbV9wRG9jVmlldyhwRG9jVmlldykge30KKworQ1hGQV9GRlBhZ2VWaWV3Ojp+Q1hGQV9GRlBhZ2VWaWV3KCkge30KKworQ1hGQV9GRkRvY1ZpZXcqIENYRkFfRkZQYWdlVmlldzo6R2V0RG9jVmlldygpIGNvbnN0IHsKKyAgcmV0dXJuIG1fcERvY1ZpZXcuR2V0KCk7Cit9CisKK0NGWF9SZWN0RiBDWEZBX0ZGUGFnZVZpZXc6OkdldFBhZ2VWaWV3UmVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIENGWF9SZWN0RigwLCAwLCBHZXRQYWdlU2l6ZSgpKTsKK30KKworQ0ZYX01hdHJpeCBDWEZBX0ZGUGFnZVZpZXc6OkdldERpc3BsYXlNYXRyaXgoY29uc3QgQ0ZYX1JlY3QmIHJ0RGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJvdGF0ZSkgY29uc3QgeworICByZXR1cm4gR2V0UGFnZU1hdHJpeChDRlhfUmVjdEYoMCwgMCwgR2V0UGFnZVNpemUoKSksIHJ0RGlzcCwgaVJvdGF0ZSwgMCk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxJWEZBX1dpZGdldEl0ZXJhdG9yPiBDWEZBX0ZGUGFnZVZpZXc6OkNyZWF0ZVdpZGdldEl0ZXJhdG9yKAorICAgIHVpbnQzMl90IGR3VHJhdmVyc2VXYXksCisgICAgdWludDMyX3QgZHdXaWRnZXRGaWx0ZXIpIHsKKyAgc3dpdGNoIChkd1RyYXZlcnNlV2F5KSB7CisgICAgY2FzZSBYRkFfVFJBVkVSU0VXQVlfVHJhbnZhbHNlOgorICAgICAgcmV0dXJuIHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I+KAorICAgICAgICAgIHRoaXMsIGR3V2lkZ2V0RmlsdGVyKTsKKyAgICBjYXNlIFhGQV9UUkFWRVJTRVdBWV9Gb3JtOgorICAgICAgcmV0dXJuIHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yPih0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd1dpZGdldEZpbHRlcik7CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK0NYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6OkNYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3IoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmlsdGVyKQorICAgIDogbV9wUGFnZVZpZXcocFBhZ2VWaWV3KSwgbV9kd0ZpbHRlcihkd0ZpbHRlciksIG1fc0l0ZXJhdG9yKHBQYWdlVmlldykgeworICBtX2JJZ25vcmVyZWxldmFudCA9CisgICAgICBtX3BQYWdlVmlldy0+R2V0RG9jVmlldygpLT5HZXREb2MoKS0+R2V0WEZBRG9jKCktPkdldEN1clZlcnNpb25Nb2RlKCkgPAorICAgICAgWEZBX1ZFUlNJT05fMjA1OworfQorCitDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yOjp+Q1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcigpIHt9CisKK3ZvaWQgQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcjo6UmVzZXQoKSB7CisgIG1fc0l0ZXJhdG9yLlJlc2V0KCk7Cit9CisKK0NYRkFfRkZXaWRnZXQqIENYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb0ZpcnN0KCkgeworICBtX3NJdGVyYXRvci5SZXNldCgpOworICBmb3IgKENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0gPSBtX3NJdGVyYXRvci5HZXRDdXJyZW50KCk7IHBMYXlvdXRJdGVtOworICAgICAgIHBMYXlvdXRJdGVtID0gbV9zSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7CisgICAgaWYgKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQgPSBHZXRXaWRnZXQocExheW91dEl0ZW0pKSB7CisgICAgICByZXR1cm4gaFdpZGdldDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK0NYRkFfRkZXaWRnZXQqIENYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb0xhc3QoKSB7CisgIG1fc0l0ZXJhdG9yLlNldEN1cnJlbnQobnVsbHB0cik7CisgIHJldHVybiBNb3ZlVG9QcmV2aW91cygpOworfQorCitDWEZBX0ZGV2lkZ2V0KiBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yOjpNb3ZlVG9OZXh0KCkgeworICBmb3IgKENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0gPSBtX3NJdGVyYXRvci5Nb3ZlVG9OZXh0KCk7IHBMYXlvdXRJdGVtOworICAgICAgIHBMYXlvdXRJdGVtID0gbV9zSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7CisgICAgaWYgKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQgPSBHZXRXaWRnZXQocExheW91dEl0ZW0pKSB7CisgICAgICByZXR1cm4gaFdpZGdldDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK0NYRkFfRkZXaWRnZXQqIENYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb1ByZXZpb3VzKCkgeworICBmb3IgKENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0gPSBtX3NJdGVyYXRvci5Nb3ZlVG9QcmV2KCk7IHBMYXlvdXRJdGVtOworICAgICAgIHBMYXlvdXRJdGVtID0gbV9zSXRlcmF0b3IuTW92ZVRvUHJldigpKSB7CisgICAgaWYgKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQgPSBHZXRXaWRnZXQocExheW91dEl0ZW0pKSB7CisgICAgICByZXR1cm4gaFdpZGdldDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK0NYRkFfRkZXaWRnZXQqIENYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6OkdldEN1cnJlbnRXaWRnZXQoKSB7CisgIENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0gPSBtX3NJdGVyYXRvci5HZXRDdXJyZW50KCk7CisgIHJldHVybiBwTGF5b3V0SXRlbSA/IFhGQV9HZXRXaWRnZXRGcm9tTGF5b3V0SXRlbShwTGF5b3V0SXRlbSkgOiBudWxscHRyOworfQorCitib29sIENYRkFfRkZQYWdlV2lkZ2V0SXRlcmF0b3I6OlNldEN1cnJlbnRXaWRnZXQoQ1hGQV9GRldpZGdldCogaFdpZGdldCkgeworICByZXR1cm4gaFdpZGdldCAmJiBtX3NJdGVyYXRvci5TZXRDdXJyZW50KGhXaWRnZXQpOworfQorCitDWEZBX0ZGV2lkZ2V0KiBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yOjpHZXRXaWRnZXQoCisgICAgQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSkgeworICBDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX0dldFdpZGdldEZyb21MYXlvdXRJdGVtKHBMYXlvdXRJdGVtKTsKKyAgaWYgKCFwV2lkZ2V0KQorICAgIHJldHVybiBudWxscHRyOworCisgIGlmICghUGFnZVdpZGdldEZpbHRlcihwV2lkZ2V0LCBtX2R3RmlsdGVyLCBmYWxzZSwgbV9iSWdub3JlcmVsZXZhbnQpKQorICAgIHJldHVybiBudWxscHRyOworCisgIGlmICghcFdpZGdldC0+SXNMb2FkZWQoKSAmJgorICAgICAgISEocFdpZGdldC0+R2V0U3RhdHVzKCkgJiBYRkFfV2lkZ2V0U3RhdHVzX1Zpc2libGUpKSB7CisgICAgaWYgKCFwV2lkZ2V0LT5Mb2FkV2lkZ2V0KCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICByZXR1cm4gcFdpZGdldDsKK30KKwordm9pZCBDWEZBX1RhYlBhcmFtOjpBcHBlbmRUYWJQYXJhbShDWEZBX1RhYlBhcmFtKiBwUGFyYW0pIHsKKyAgbV9DaGlsZHJlbi5wdXNoX2JhY2socFBhcmFtLT5HZXRXaWRnZXQoKSk7CisgIG1fQ2hpbGRyZW4uaW5zZXJ0KG1fQ2hpbGRyZW4uZW5kKCksIHBQYXJhbS0+R2V0Q2hpbGRyZW4oKS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPkdldENoaWxkcmVuKCkuZW5kKCkpOworfQorCit2b2lkIENYRkFfVGFiUGFyYW06OkNsZWFyQ2hpbGRyZW4oKSB7CisgIG1fQ2hpbGRyZW4uY2xlYXIoKTsKK30KKworQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3IoCisgICAgQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsCisgICAgdWludDMyX3QgZHdGaWx0ZXIpCisgICAgOiBtX3BQYWdlVmlldyhwUGFnZVZpZXcpLCBtX2R3RmlsdGVyKGR3RmlsdGVyKSwgbV9pQ3VyV2lkZ2V0KC0xKSB7CisgIG1fYklnbm9yZXJlbGV2YW50ID0KKyAgICAgIG1fcFBhZ2VWaWV3LT5HZXREb2NWaWV3KCktPkdldERvYygpLT5HZXRYRkFEb2MoKS0+R2V0Q3VyVmVyc2lvbk1vZGUoKSA8CisgICAgICBYRkFfVkVSU0lPTl8yMDU7CisgIFJlc2V0KCk7Cit9CisKK0NYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6fkNYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcigpIHt9CisKK3ZvaWQgQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpSZXNldCgpIHsKKyAgQ3JlYXRlVGFiT3JkZXJXaWRnZXRBcnJheSgpOworICBtX2lDdXJXaWRnZXQgPSAtMTsKK30KKworQ1hGQV9GRldpZGdldCogQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpNb3ZlVG9GaXJzdCgpIHsKKyAgZm9yIChpbnQzMl90IGkgPSAwOworICAgICAgIGkgPCBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fVGFiT3JkZXJXaWRnZXRBcnJheSk7IGkrKykgeworICAgIGlmIChQYWdlV2lkZ2V0RmlsdGVyKG1fVGFiT3JkZXJXaWRnZXRBcnJheVtpXSwgbV9kd0ZpbHRlciwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX2JJZ25vcmVyZWxldmFudCkpIHsKKyAgICAgIG1faUN1cldpZGdldCA9IGk7CisgICAgICByZXR1cm4gbV9UYWJPcmRlcldpZGdldEFycmF5W21faUN1cldpZGdldF07CisgICAgfQorICB9CisgIHJldHVybiBudWxscHRyOworfQorCitDWEZBX0ZGV2lkZ2V0KiBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb0xhc3QoKSB7CisgIGZvciAoaW50MzJfdCBpID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX1RhYk9yZGVyV2lkZ2V0QXJyYXkpIC0gMTsKKyAgICAgICBpID49IDA7IGktLSkgeworICAgIGlmIChQYWdlV2lkZ2V0RmlsdGVyKG1fVGFiT3JkZXJXaWRnZXRBcnJheVtpXSwgbV9kd0ZpbHRlciwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX2JJZ25vcmVyZWxldmFudCkpIHsKKyAgICAgIG1faUN1cldpZGdldCA9IGk7CisgICAgICByZXR1cm4gbV9UYWJPcmRlcldpZGdldEFycmF5W21faUN1cldpZGdldF07CisgICAgfQorICB9CisgIHJldHVybiBudWxscHRyOworfQorCitDWEZBX0ZGV2lkZ2V0KiBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6Ok1vdmVUb05leHQoKSB7CisgIGZvciAoaW50MzJfdCBpID0gbV9pQ3VyV2lkZ2V0ICsgMTsKKyAgICAgICBpIDwgcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX1RhYk9yZGVyV2lkZ2V0QXJyYXkpOyBpKyspIHsKKyAgICBpZiAoUGFnZVdpZGdldEZpbHRlcihtX1RhYk9yZGVyV2lkZ2V0QXJyYXlbaV0sIG1fZHdGaWx0ZXIsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9iSWdub3JlcmVsZXZhbnQpKSB7CisgICAgICBtX2lDdXJXaWRnZXQgPSBpOworICAgICAgcmV0dXJuIG1fVGFiT3JkZXJXaWRnZXRBcnJheVttX2lDdXJXaWRnZXRdOworICAgIH0KKyAgfQorICBtX2lDdXJXaWRnZXQgPSAtMTsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK0NYRkFfRkZXaWRnZXQqIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6TW92ZVRvUHJldmlvdXMoKSB7CisgIGZvciAoaW50MzJfdCBpID0gbV9pQ3VyV2lkZ2V0IC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICBpZiAoUGFnZVdpZGdldEZpbHRlcihtX1RhYk9yZGVyV2lkZ2V0QXJyYXlbaV0sIG1fZHdGaWx0ZXIsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9iSWdub3JlcmVsZXZhbnQpKSB7CisgICAgICBtX2lDdXJXaWRnZXQgPSBpOworICAgICAgcmV0dXJuIG1fVGFiT3JkZXJXaWRnZXRBcnJheVttX2lDdXJXaWRnZXRdOworICAgIH0KKyAgfQorICBtX2lDdXJXaWRnZXQgPSAtMTsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK0NYRkFfRkZXaWRnZXQqIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6R2V0Q3VycmVudFdpZGdldCgpIHsKKyAgcmV0dXJuIG1faUN1cldpZGdldCA+PSAwID8gbV9UYWJPcmRlcldpZGdldEFycmF5W21faUN1cldpZGdldF0gOiBudWxscHRyOworfQorCitib29sIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6U2V0Q3VycmVudFdpZGdldCgKKyAgICBDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0KSB7CisgIGF1dG8gaXQgPSBzdGQ6OmZpbmQobV9UYWJPcmRlcldpZGdldEFycmF5LmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgbV9UYWJPcmRlcldpZGdldEFycmF5LmVuZCgpLCBoV2lkZ2V0KTsKKyAgaWYgKGl0ID09IG1fVGFiT3JkZXJXaWRnZXRBcnJheS5lbmQoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbV9pQ3VyV2lkZ2V0ID0gaXQgLSBtX1RhYk9yZGVyV2lkZ2V0QXJyYXkuYmVnaW4oKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0NYRkFfRkZXaWRnZXQqIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6R2V0VHJhdmVyc2VXaWRnZXQoCisgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCkgeworICBDWEZBX1RyYXZlcnNhbCogcFRyYXZlcnNhbCA9IHBXaWRnZXQtPkdldE5vZGUoKS0+R2V0Q2hpbGQ8Q1hGQV9UcmF2ZXJzYWw+KAorICAgICAgMCwgWEZBX0VsZW1lbnQ6OlRyYXZlcnNhbCwgZmFsc2UpOworICBpZiAocFRyYXZlcnNhbCkgeworICAgIENYRkFfVHJhdmVyc2UqIHBUcmF2ZXJzZSA9CisgICAgICAgIHBUcmF2ZXJzYWwtPkdldENoaWxkPENYRkFfVHJhdmVyc2U+KDAsIFhGQV9FbGVtZW50OjpUcmF2ZXJzZSwgZmFsc2UpOworICAgIGlmIChwVHJhdmVyc2UpIHsKKyAgICAgIE9wdGlvbmFsPFdpZGVTdHJpbmc+IHRyYXZlcnNlV2lkZ2V0TmFtZSA9CisgICAgICAgICAgcFRyYXZlcnNlLT5KU09iamVjdCgpLT5UcnlBdHRyaWJ1dGUoWEZBX0F0dHJpYnV0ZTo6UmVmLCB0cnVlKTsKKyAgICAgIGlmICh0cmF2ZXJzZVdpZGdldE5hbWUpCisgICAgICAgIHJldHVybiBGaW5kV2lkZ2V0QnlOYW1lKCp0cmF2ZXJzZVdpZGdldE5hbWUsIHBXaWRnZXQpOworICAgIH0KKyAgfQorICByZXR1cm4gbnVsbHB0cjsKK30KK0NYRkFfRkZXaWRnZXQqIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6RmluZFdpZGdldEJ5TmFtZSgKKyAgICBjb25zdCBXaWRlU3RyaW5nJiB3c1dpZGdldE5hbWUsCisgICAgQ1hGQV9GRldpZGdldCogcFJlZldpZGdldCkgeworICByZXR1cm4gcFJlZldpZGdldC0+R2V0RG9jVmlldygpLT5HZXRXaWRnZXRCeU5hbWUod3NXaWRnZXROYW1lLCBwUmVmV2lkZ2V0KTsKK30KKwordm9pZCBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6OkNyZWF0ZVRhYk9yZGVyV2lkZ2V0QXJyYXkoKSB7CisgIG1fVGFiT3JkZXJXaWRnZXRBcnJheS5jbGVhcigpOworCisgIHN0ZDo6dmVjdG9yPENYRkFfRkZXaWRnZXQqPiBTcGFjZU9yZGVyV2lkZ2V0QXJyYXk7CisgIENyZWF0ZVNwYWNlT3JkZXJXaWRnZXRBcnJheSgmU3BhY2VPcmRlcldpZGdldEFycmF5KTsKKyAgaWYgKFNwYWNlT3JkZXJXaWRnZXRBcnJheS5lbXB0eSgpKQorICAgIHJldHVybjsKKworICBpbnQzMl90IG5XaWRnZXRDb3VudCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4oU3BhY2VPcmRlcldpZGdldEFycmF5KTsKKyAgQ1hGQV9GRldpZGdldCogaFdpZGdldCA9IFNwYWNlT3JkZXJXaWRnZXRBcnJheVswXTsKKyAgd2hpbGUgKHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9UYWJPcmRlcldpZGdldEFycmF5KSA8CisgICAgICAgICBuV2lkZ2V0Q291bnQpIHsKKyAgICBpZiAoIXBkZml1bTo6Q29udGFpbnNWYWx1ZShtX1RhYk9yZGVyV2lkZ2V0QXJyYXksIGhXaWRnZXQpKSB7CisgICAgICBtX1RhYk9yZGVyV2lkZ2V0QXJyYXkucHVzaF9iYWNrKGhXaWRnZXQpOworICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBoV2lkZ2V0LT5HZXROb2RlKCktPkdldFdpZGdldEFjYygpOworICAgICAgaWYgKHBXaWRnZXRBY2MtPkdldFVJVHlwZSgpID09IFhGQV9FbGVtZW50OjpFeGNsR3JvdXApIHsKKyAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZChTcGFjZU9yZGVyV2lkZ2V0QXJyYXkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFjZU9yZGVyV2lkZ2V0QXJyYXkuZW5kKCksIGhXaWRnZXQpOworICAgICAgICBpbnQzMl90IGlXaWRnZXRJbmRleCA9IGl0ICE9IFNwYWNlT3JkZXJXaWRnZXRBcnJheS5lbmQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGl0IC0gU3BhY2VPcmRlcldpZGdldEFycmF5LmJlZ2luKCkgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICBDWEZBX0ZGV2lkZ2V0KiByYWRpbyA9CisgICAgICAgICAgICAgIFNwYWNlT3JkZXJXaWRnZXRBcnJheVtpV2lkZ2V0SW5kZXggJSBuV2lkZ2V0Q291bnRdOworICAgICAgICAgIGlmIChyYWRpby0+R2V0Tm9kZSgpLT5HZXRFeGNsR3JvdXBJZkV4aXN0cygpICE9IHBXaWRnZXRBY2MtPkdldE5vZGUoKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmICghcGRmaXVtOjpDb250YWluc1ZhbHVlKG1fVGFiT3JkZXJXaWRnZXRBcnJheSwgaFdpZGdldCkpCisgICAgICAgICAgICBtX1RhYk9yZGVyV2lkZ2V0QXJyYXkucHVzaF9iYWNrKHJhZGlvKTsKKworICAgICAgICAgIGlXaWRnZXRJbmRleCsrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoQ1hGQV9GRldpZGdldCogaFRyYXZlcnNlV2lkZ2V0ID0gR2V0VHJhdmVyc2VXaWRnZXQoaFdpZGdldCkpIHsKKyAgICAgICAgaFdpZGdldCA9IGhUcmF2ZXJzZVdpZGdldDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgfQorICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmQoU3BhY2VPcmRlcldpZGdldEFycmF5LmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICBTcGFjZU9yZGVyV2lkZ2V0QXJyYXkuZW5kKCksIGhXaWRnZXQpOworICAgIGludDMyX3QgaVdpZGdldEluZGV4ID0gaXQgIT0gU3BhY2VPcmRlcldpZGdldEFycmF5LmVuZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpdCAtIFNwYWNlT3JkZXJXaWRnZXRBcnJheS5iZWdpbigpICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgICBoV2lkZ2V0ID0gU3BhY2VPcmRlcldpZGdldEFycmF5W2lXaWRnZXRJbmRleCAlIG5XaWRnZXRDb3VudF07CisgIH0KK30KKwordm9pZCBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3I6Ok9yZGVyQ29udGFpbmVyKAorICAgIENYRkFfTGF5b3V0SXRlbUl0ZXJhdG9yKiBzSXRlcmF0b3IsCisgICAgQ1hGQV9MYXlvdXRJdGVtKiBwQ29udGFpbmVySXRlbSwKKyAgICBDWEZBX1RhYlBhcmFtKiBwQ29udGFpbmVyLAorICAgIGJvb2wmIGJDdXJyZW50SXRlbSwKKyAgICBib29sJiBiQ29udGVudEFyZWEsCisgICAgYm9vbCBiTWFyc3RlclBhZ2UpIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfVGFiUGFyYW0+PiB0YWJQYXJhbXM7CisgIENYRkFfTGF5b3V0SXRlbSogcFNlYXJjaEl0ZW0gPSBzSXRlcmF0b3ItPk1vdmVUb05leHQoKTsKKyAgd2hpbGUgKHBTZWFyY2hJdGVtKSB7CisgICAgaWYgKCFwU2VhcmNoSXRlbS0+SXNDb250ZW50TGF5b3V0SXRlbSgpKSB7CisgICAgICBiQ29udGVudEFyZWEgPSB0cnVlOworICAgICAgcFNlYXJjaEl0ZW0gPSBzSXRlcmF0b3ItPk1vdmVUb05leHQoKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoYk1hcnN0ZXJQYWdlICYmIGJDb250ZW50QXJlYSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChiTWFyc3RlclBhZ2UgfHwgYkNvbnRlbnRBcmVhKSB7CisgICAgICBDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0ID0gR2V0V2lkZ2V0KHBTZWFyY2hJdGVtKTsKKyAgICAgIGlmICghaFdpZGdldCkgeworICAgICAgICBwU2VhcmNoSXRlbSA9IHNJdGVyYXRvci0+TW92ZVRvTmV4dCgpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChwQ29udGFpbmVySXRlbSAmJiAocFNlYXJjaEl0ZW0tPkdldFBhcmVudCgpICE9IHBDb250YWluZXJJdGVtKSkgeworICAgICAgICBiQ3VycmVudEl0ZW0gPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHRhYlBhcmFtcy5wdXNoX2JhY2socGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfVGFiUGFyYW0+KGhXaWRnZXQpKTsKKyAgICAgIGlmIChJc0xheW91dEVsZW1lbnQocFNlYXJjaEl0ZW0tPkdldEZvcm1Ob2RlKCktPkdldEVsZW1lbnRUeXBlKCksIHRydWUpKSB7CisgICAgICAgIE9yZGVyQ29udGFpbmVyKHNJdGVyYXRvciwgcFNlYXJjaEl0ZW0sIHRhYlBhcmFtcy5iYWNrKCkuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgIGJDdXJyZW50SXRlbSwgYkNvbnRlbnRBcmVhLCBiTWFyc3RlclBhZ2UpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoYkN1cnJlbnRJdGVtKSB7CisgICAgICBwU2VhcmNoSXRlbSA9IHNJdGVyYXRvci0+R2V0Q3VycmVudCgpOworICAgICAgYkN1cnJlbnRJdGVtID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHBTZWFyY2hJdGVtID0gc0l0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7CisgICAgfQorICB9CisgIHN0ZDo6c29ydCh0YWJQYXJhbXMuYmVnaW4oKSwgdGFiUGFyYW1zLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPENYRkFfVGFiUGFyYW0+JiBhcmcxLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPENYRkFfVGFiUGFyYW0+JiBhcmcyKSB7CisgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnQxID0gYXJnMS0+R2V0V2lkZ2V0KCktPkdldFdpZGdldFJlY3QoKTsKKyAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydDIgPSBhcmcyLT5HZXRXaWRnZXQoKS0+R2V0V2lkZ2V0UmVjdCgpOworICAgICAgICAgICAgICBpZiAocnQxLnRvcCAtIHJ0Mi50b3AgPj0gWEZBX0ZMT0FUX1BFUkNJU0lPTikKKyAgICAgICAgICAgICAgICByZXR1cm4gcnQxLnRvcCA8IHJ0Mi50b3A7CisgICAgICAgICAgICAgIHJldHVybiBydDEubGVmdCA8IHJ0Mi5sZWZ0OworICAgICAgICAgICAgfSk7CisgIGZvciAoY29uc3QgYXV0byYgcFBhcmFtIDogdGFiUGFyYW1zKQorICAgIHBDb250YWluZXItPkFwcGVuZFRhYlBhcmFtKHBQYXJhbS5nZXQoKSk7Cit9CisKK3ZvaWQgQ1hGQV9GRlRhYk9yZGVyUGFnZVdpZGdldEl0ZXJhdG9yOjpDcmVhdGVTcGFjZU9yZGVyV2lkZ2V0QXJyYXkoCisgICAgc3RkOjp2ZWN0b3I8Q1hGQV9GRldpZGdldCo+KiBXaWRnZXRBcnJheSkgeworICBDWEZBX0xheW91dEl0ZW1JdGVyYXRvciBzSXRlcmF0b3IobV9wUGFnZVZpZXcpOworICBhdXRvIHBQYXJhbSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1RhYlBhcmFtPihudWxscHRyKTsKKyAgYm9vbCBiQ3VycmVudEl0ZW0gPSBmYWxzZTsKKyAgYm9vbCBiQ29udGVudEFyZWEgPSBmYWxzZTsKKyAgT3JkZXJDb250YWluZXIoJnNJdGVyYXRvciwgbnVsbHB0ciwgcFBhcmFtLmdldCgpLCBiQ3VycmVudEl0ZW0sIGJDb250ZW50QXJlYSk7CisgIFdpZGdldEFycmF5LT5pbnNlcnQoV2lkZ2V0QXJyYXktPmVuZCgpLCBwUGFyYW0tPkdldENoaWxkcmVuKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0tPkdldENoaWxkcmVuKCkuZW5kKCkpOworCisgIHNJdGVyYXRvci5SZXNldCgpOworICBiQ3VycmVudEl0ZW0gPSBmYWxzZTsKKyAgYkNvbnRlbnRBcmVhID0gZmFsc2U7CisgIHBQYXJhbS0+Q2xlYXJDaGlsZHJlbigpOworICBPcmRlckNvbnRhaW5lcigmc0l0ZXJhdG9yLCBudWxscHRyLCBwUGFyYW0uZ2V0KCksIGJDdXJyZW50SXRlbSwgYkNvbnRlbnRBcmVhLAorICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgV2lkZ2V0QXJyYXktPmluc2VydChXaWRnZXRBcnJheS0+ZW5kKCksIHBQYXJhbS0+R2V0Q2hpbGRyZW4oKS5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbS0+R2V0Q2hpbGRyZW4oKS5lbmQoKSk7Cit9CisKK0NYRkFfRkZXaWRnZXQqIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcjo6R2V0V2lkZ2V0KAorICAgIENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0pIHsKKyAgaWYgKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBYRkFfR2V0V2lkZ2V0RnJvbUxheW91dEl0ZW0ocExheW91dEl0ZW0pKSB7CisgICAgaWYgKCFwV2lkZ2V0LT5Jc0xvYWRlZCgpICYmCisgICAgICAgIChwV2lkZ2V0LT5HZXRTdGF0dXMoKSAmIFhGQV9XaWRnZXRTdGF0dXNfVmlzaWJsZSkpIHsKKyAgICAgIHBXaWRnZXQtPkxvYWRXaWRnZXQoKTsKKyAgICB9CisgICAgcmV0dXJuIHBXaWRnZXQ7CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK0NYRkFfVGFiUGFyYW06OkNYRkFfVGFiUGFyYW0oQ1hGQV9GRldpZGdldCogcFdpZGdldCkgOiBtX3BXaWRnZXQocFdpZGdldCkge30KKworQ1hGQV9UYWJQYXJhbTo6fkNYRkFfVGFiUGFyYW0oKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZnBhZ2V2aWV3LmggYi94ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzNlMjVmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9mZnBhZ2V2aWV3LmgKQEAgLTAsMCArMSwxMTQgQEAKKy8vIENvcHlyaWcgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfQ1hGQV9GRlBBR0VWSUVXX0hfCisjZGVmaW5lIFhGQV9GWEZBX0NYRkFfRkZQQUdFVklFV19IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbnRhaW5lcmxheW91dGl0ZW0uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb250ZW50bGF5b3V0aXRlbS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGVpdGVyYXRvcnRlbXBsYXRlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhdmVyc2VzdHJhdGVneV9sYXlvdXRpdGVtLmgiCisKK2NsYXNzIENYRkFfRkZXaWRnZXQ7CitjbGFzcyBDWEZBX0ZGRG9jVmlldzsKKworY2xhc3MgQ1hGQV9GRlBhZ2VWaWV3IDogcHVibGljIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSB7CisgcHVibGljOgorICBDWEZBX0ZGUGFnZVZpZXcoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LCBDWEZBX05vZGUqIHBQYWdlQXJlYSk7CisgIH5DWEZBX0ZGUGFnZVZpZXcoKSBvdmVycmlkZTsKKworICBDWEZBX0ZGRG9jVmlldyogR2V0RG9jVmlldygpIGNvbnN0OworICBDRlhfUmVjdEYgR2V0UGFnZVZpZXdSZWN0KCkgY29uc3Q7CisgIENGWF9NYXRyaXggR2V0RGlzcGxheU1hdHJpeChjb25zdCBDRlhfUmVjdCYgcnREaXNwLCBpbnQzMl90IGlSb3RhdGUpIGNvbnN0OworICBzdGQ6OnVuaXF1ZV9wdHI8SVhGQV9XaWRnZXRJdGVyYXRvcj4gQ3JlYXRlV2lkZ2V0SXRlcmF0b3IoCisgICAgICB1aW50MzJfdCBkd1RyYXZlcnNlV2F5LAorICAgICAgdWludDMyX3QgZHdXaWRnZXRGaWx0ZXIpOworCisgcHJvdGVjdGVkOgorICBVbm93bmVkUHRyPENYRkFfRkZEb2NWaWV3PiBjb25zdCBtX3BEb2NWaWV3OworfTsKKwordXNpbmcgQ1hGQV9MYXlvdXRJdGVtSXRlcmF0b3IgPQorICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9MYXlvdXRJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0xheW91dEl0ZW0+OworCitjbGFzcyBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yIDogcHVibGljIElYRkFfV2lkZ2V0SXRlcmF0b3IgeworIHB1YmxpYzoKKyAgQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcihDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgdWludDMyX3QgZHdGaWx0ZXIpOworICB+Q1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcigpIG92ZXJyaWRlOworCisgIHZvaWQgUmVzZXQoKSBvdmVycmlkZTsKKyAgQ1hGQV9GRldpZGdldCogTW92ZVRvRmlyc3QoKSBvdmVycmlkZTsKKyAgQ1hGQV9GRldpZGdldCogTW92ZVRvTGFzdCgpIG92ZXJyaWRlOworICBDWEZBX0ZGV2lkZ2V0KiBNb3ZlVG9OZXh0KCkgb3ZlcnJpZGU7CisgIENYRkFfRkZXaWRnZXQqIE1vdmVUb1ByZXZpb3VzKCkgb3ZlcnJpZGU7CisgIENYRkFfRkZXaWRnZXQqIEdldEN1cnJlbnRXaWRnZXQoKSBvdmVycmlkZTsKKyAgYm9vbCBTZXRDdXJyZW50V2lkZ2V0KENYRkFfRkZXaWRnZXQqIGhXaWRnZXQpIG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICBDWEZBX0ZGV2lkZ2V0KiBHZXRXaWRnZXQoQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSk7CisKKyAgQ1hGQV9GRlBhZ2VWaWV3KiBtX3BQYWdlVmlldzsKKyAgQ1hGQV9GRldpZGdldCogbV9oQ3VyV2lkZ2V0OworICB1aW50MzJfdCBtX2R3RmlsdGVyOworICBib29sIG1fYklnbm9yZXJlbGV2YW50OworICBDWEZBX0xheW91dEl0ZW1JdGVyYXRvciBtX3NJdGVyYXRvcjsKK307CisKK2NsYXNzIENYRkFfVGFiUGFyYW0geworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1hGQV9UYWJQYXJhbShDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0KTsKKyAgfkNYRkFfVGFiUGFyYW0oKTsKKworICB2b2lkIEFwcGVuZFRhYlBhcmFtKENYRkFfVGFiUGFyYW0qIHBQYXJhbSk7CisgIHZvaWQgQ2xlYXJDaGlsZHJlbigpOworICBDWEZBX0ZGV2lkZ2V0KiBHZXRXaWRnZXQoKSBjb25zdCB7IHJldHVybiBtX3BXaWRnZXQuR2V0KCk7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Q1hGQV9GRldpZGdldCo+JiBHZXRDaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIG1fQ2hpbGRyZW47IH0KKworIHByaXZhdGU6CisgIFVub3duZWRQdHI8Q1hGQV9GRldpZGdldD4gY29uc3QgbV9wV2lkZ2V0OworICBzdGQ6OnZlY3RvcjxDWEZBX0ZGV2lkZ2V0Kj4gbV9DaGlsZHJlbjsKK307CisKK2NsYXNzIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvciA6IHB1YmxpYyBJWEZBX1dpZGdldEl0ZXJhdG9yIHsKKyBwdWJsaWM6CisgIENYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcihDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmlsdGVyKTsKKyAgfkNYRkFfRkZUYWJPcmRlclBhZ2VXaWRnZXRJdGVyYXRvcigpIG92ZXJyaWRlOworCisgIHZvaWQgUmVzZXQoKSBvdmVycmlkZTsKKyAgQ1hGQV9GRldpZGdldCogTW92ZVRvRmlyc3QoKSBvdmVycmlkZTsKKyAgQ1hGQV9GRldpZGdldCogTW92ZVRvTGFzdCgpIG92ZXJyaWRlOworICBDWEZBX0ZGV2lkZ2V0KiBNb3ZlVG9OZXh0KCkgb3ZlcnJpZGU7CisgIENYRkFfRkZXaWRnZXQqIE1vdmVUb1ByZXZpb3VzKCkgb3ZlcnJpZGU7CisgIENYRkFfRkZXaWRnZXQqIEdldEN1cnJlbnRXaWRnZXQoKSBvdmVycmlkZTsKKyAgYm9vbCBTZXRDdXJyZW50V2lkZ2V0KENYRkFfRkZXaWRnZXQqIGhXaWRnZXQpIG92ZXJyaWRlOworCisgcHJvdGVjdGVkOgorICBDWEZBX0ZGV2lkZ2V0KiBHZXRUcmF2ZXJzZVdpZGdldChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0KTsKKyAgQ1hGQV9GRldpZGdldCogRmluZFdpZGdldEJ5TmFtZShjb25zdCBXaWRlU3RyaW5nJiB3c1dpZGdldE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GRldpZGdldCogcFJlZldpZGdldCk7CisgIHZvaWQgQ3JlYXRlVGFiT3JkZXJXaWRnZXRBcnJheSgpOworICB2b2lkIENyZWF0ZVNwYWNlT3JkZXJXaWRnZXRBcnJheShzdGQ6OnZlY3RvcjxDWEZBX0ZGV2lkZ2V0Kj4qIFdpZGdldEFycmF5KTsKKyAgQ1hGQV9GRldpZGdldCogR2V0V2lkZ2V0KENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0pOworICB2b2lkIE9yZGVyQ29udGFpbmVyKENYRkFfTGF5b3V0SXRlbUl0ZXJhdG9yKiBzSXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRJdGVtKiBwQ29udGFpbmVySXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICBDWEZBX1RhYlBhcmFtKiBwQ29udGFpbmVyLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJDdXJyZW50SXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sJiBiQ29udGVudEFyZWEsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTWFyc3RlclBhZ2UgPSBmYWxzZSk7CisKKyAgc3RkOjp2ZWN0b3I8Q1hGQV9GRldpZGdldCo+IG1fVGFiT3JkZXJXaWRnZXRBcnJheTsKKyAgQ1hGQV9GRlBhZ2VWaWV3KiBtX3BQYWdlVmlldzsKKyAgdWludDMyX3QgbV9kd0ZpbHRlcjsKKyAgaW50MzJfdCBtX2lDdXJXaWRnZXQ7CisgIGJvb2wgbV9iSWdub3JlcmVsZXZhbnQ7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX0NYRkFfRkZQQUdFVklFV19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZnBhc3N3b3JkZWRpdC5jcHAgYi94ZmEvZnhmYS9jeGZhX2ZmcGFzc3dvcmRlZGl0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWJkNWZhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9mZnBhc3N3b3JkZWRpdC5jcHAKQEAgLTAsMCArMSw2MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZnBhc3N3b3JkZWRpdC5oIgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9lZGl0LmgiCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX25vdGVkcml2ZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZG9jLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitDWEZBX0ZGUGFzc3dvcmRFZGl0OjpDWEZBX0ZGUGFzc3dvcmRFZGl0KENYRkFfTm9kZSogcE5vZGUpCisgICAgOiBDWEZBX0ZGVGV4dEVkaXQocE5vZGUpIHt9CisKK0NYRkFfRkZQYXNzd29yZEVkaXQ6On5DWEZBX0ZGUGFzc3dvcmRFZGl0KCkge30KKworYm9vbCBDWEZBX0ZGUGFzc3dvcmRFZGl0OjpMb2FkV2lkZ2V0KCkgeworICBhdXRvIHBOZXdFZGl0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfRWRpdD4oCisgICAgICBHZXRGV0xBcHAoKSwgcGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfV2lkZ2V0UHJvcGVydGllcz4oKSwgbnVsbHB0cik7CisgIENGV0xfRWRpdCogcFdpZGdldCA9IHBOZXdFZGl0LmdldCgpOworICBtX3BOb3JtYWxXaWRnZXQgPSBzdGQ6Om1vdmUocE5ld0VkaXQpOworICBtX3BOb3JtYWxXaWRnZXQtPlNldExheW91dEl0ZW0odGhpcyk7CisKKyAgQ0ZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9CisgICAgICBtX3BOb3JtYWxXaWRnZXQtPkdldE93bmVyQXBwKCktPkdldE5vdGVEcml2ZXIoKTsKKyAgcE5vdGVEcml2ZXItPlJlZ2lzdGVyRXZlbnRUYXJnZXQobV9wTm9ybWFsV2lkZ2V0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpOworICBtX3BPbGREZWxlZ2F0ZSA9IG1fcE5vcm1hbFdpZGdldC0+R2V0RGVsZWdhdGUoKTsKKyAgbV9wTm9ybWFsV2lkZ2V0LT5TZXREZWxlZ2F0ZSh0aGlzKTsKKyAgbV9wTm9ybWFsV2lkZ2V0LT5Mb2NrVXBkYXRlKCk7CisKKyAgcFdpZGdldC0+U2V0VGV4dChtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0VmFsdWUoWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KSk7CisgIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7CisgIG1fcE5vcm1hbFdpZGdldC0+VW5sb2NrVXBkYXRlKCk7CisgIHJldHVybiBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsKK30KKwordm9pZCBDWEZBX0ZGUGFzc3dvcmRFZGl0OjpVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIHsKKyAgQ0ZXTF9FZGl0KiBwV2lkZ2V0ID0gc3RhdGljX2Nhc3Q8Q0ZXTF9FZGl0Kj4obV9wTm9ybWFsV2lkZ2V0LmdldCgpKTsKKyAgaWYgKCFwV2lkZ2V0KQorICAgIHJldHVybjsKKworICB1aW50MzJfdCBkd0V4dGVuZGVkU3R5bGUgPSBGV0xfU1RZTEVFWFRfRURUX1Nob3dTY3JvbGxiYXJGb2N1cyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZXTF9TVFlMRUVYVF9FRFRfT3V0ZXJTY3JvbGxiYXIgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGV0xfU1RZTEVFWFRfRURUX1Bhc3N3b3JkOworICBkd0V4dGVuZGVkU3R5bGUgfD0gVXBkYXRlVUlQcm9wZXJ0eSgpOworCisgIFdpZGVTdHJpbmcgcGFzc3dvcmQgPSBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0UGFzc3dvcmRDaGFyKCk7CisgIGlmICghcGFzc3dvcmQuSXNFbXB0eSgpKQorICAgIHBXaWRnZXQtPlNldEFsaWFzQ2hhcihwYXNzd29yZFswXSk7CisgIGlmICghbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPklzSG9yaXpvbnRhbFNjcm9sbFBvbGljeU9mZigpKQorICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX0F1dG9IU2Nyb2xsOworICBpZiAoIW1fcE5vZGUtPklzT3BlbkFjY2VzcygpIHx8ICFHZXREb2MoKS0+R2V0WEZBRG9jKCktPklzSW50ZXJhY3RpdmUoKSkKKyAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9SZWFkT25seTsKKworICBkd0V4dGVuZGVkU3R5bGUgfD0gR2V0QWxpZ25tZW50KCk7CisgIG1fcE5vcm1hbFdpZGdldC0+TW9kaWZ5U3R5bGVzRXgoZHdFeHRlbmRlZFN0eWxlLCAweEZGRkZGRkZGKTsKK30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfZmZwYXNzd29yZGVkaXQuaCBiL3hmYS9meGZhL2N4ZmFfZmZwYXNzd29yZGVkaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTcyNzlhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9mZnBhc3N3b3JkZWRpdC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9DWEZBX0ZGUEFTU1dPUkRFRElUX0hfCisjZGVmaW5lIFhGQV9GWEZBX0NYRkFfRkZQQVNTV09SREVESVRfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZ0ZXh0ZWRpdC5oIgorCitjbGFzcyBDWEZBX1dpZGdldEFjYzsKKworY2xhc3MgQ1hGQV9GRlBhc3N3b3JkRWRpdCA6IHB1YmxpYyBDWEZBX0ZGVGV4dEVkaXQgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1hGQV9GRlBhc3N3b3JkRWRpdChDWEZBX05vZGUqIHBOb2RlKTsKKyAgfkNYRkFfRkZQYXNzd29yZEVkaXQoKSBvdmVycmlkZTsKKworICAvLyBDWEZBX0ZGVGV4dEVkaXQKKyAgYm9vbCBMb2FkV2lkZ2V0KCkgb3ZlcnJpZGU7CisgIHZvaWQgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfQ1hGQV9GRlBBU1NXT1JERURJVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZnB1c2hidXR0b24uY3BwIGIveGZhL2Z4ZmEvY3hmYV9mZnB1c2hidXR0b24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZjc1MTIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2ZmcHVzaGJ1dHRvbi5jcHAKQEAgLTAsMCArMSwyNDUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZwdXNoYnV0dG9uLmgiCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9ub3RlZHJpdmVyLmgiCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3B1c2hidXR0b24uaCIKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfd2lkZ2V0bWdyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmFwcC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZmaWVsZC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZwYWdldmlldy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZ3aWRnZXQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX3RleHRsYXlvdXQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX3RleHRwcm92aWRlci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2JvcmRlci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NhcHRpb24uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lZGdlLmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZWNvbG9yLmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXBhdGguaCIKKworQ1hGQV9GRlB1c2hCdXR0b246OkNYRkFfRkZQdXNoQnV0dG9uKENYRkFfTm9kZSogcE5vZGUpCisgICAgOiBDWEZBX0ZGRmllbGQocE5vZGUpLCBtX3BPbGREZWxlZ2F0ZShudWxscHRyKSB7fQorCitDWEZBX0ZGUHVzaEJ1dHRvbjo6fkNYRkFfRkZQdXNoQnV0dG9uKCkgeworICBDWEZBX0ZGUHVzaEJ1dHRvbjo6VW5sb2FkV2lkZ2V0KCk7Cit9CisKK3ZvaWQgQ1hGQV9GRlB1c2hCdXR0b246OlJlbmRlcldpZGdldChDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSB7CisgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKQorICAgIHJldHVybjsKKworICBDRlhfTWF0cml4IG10Um90YXRlID0gR2V0Um90YXRlTWF0cml4KCk7CisgIG10Um90YXRlLkNvbmNhdChtYXRyaXgpOworCisgIENYRkFfRkZXaWRnZXQ6OlJlbmRlcldpZGdldChwR1MsIG10Um90YXRlLCBkd1N0YXR1cyk7CisgIFJlbmRlckhpZ2hsaWdodENhcHRpb24ocEdTLCAmbXRSb3RhdGUpOworCisgIENGWF9SZWN0RiBydFdpZGdldCA9IEdldFJlY3RXaXRob3V0Um90YXRlKCk7CisgIENGWF9NYXRyaXggbXQoMSwgMCwgMCwgMSwgcnRXaWRnZXQubGVmdCwgcnRXaWRnZXQudG9wKTsKKyAgbXQuQ29uY2F0KG10Um90YXRlKTsKKyAgR2V0QXBwKCktPkdldEZXTFdpZGdldE1ncigpLT5PbkRyYXdXaWRnZXQobV9wTm9ybWFsV2lkZ2V0LmdldCgpLCBwR1MsIG10KTsKK30KKworYm9vbCBDWEZBX0ZGUHVzaEJ1dHRvbjo6TG9hZFdpZGdldCgpIHsKKyAgQVNTRVJUKCFtX3BOb3JtYWxXaWRnZXQpOworICBhdXRvIHBOZXcgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZXTF9QdXNoQnV0dG9uPihHZXRGV0xBcHAoKSk7CisgIENGV0xfUHVzaEJ1dHRvbiogcFB1c2hCdXR0b24gPSBwTmV3LmdldCgpOworICBtX3BPbGREZWxlZ2F0ZSA9IHBQdXNoQnV0dG9uLT5HZXREZWxlZ2F0ZSgpOworICBwUHVzaEJ1dHRvbi0+U2V0RGVsZWdhdGUodGhpcyk7CisgIG1fcE5vcm1hbFdpZGdldCA9IHN0ZDo6bW92ZShwTmV3KTsKKyAgbV9wTm9ybWFsV2lkZ2V0LT5TZXRMYXlvdXRJdGVtKHRoaXMpOworCisgIENGV0xfTm90ZURyaXZlciogcE5vdGVEcml2ZXIgPQorICAgICAgbV9wTm9ybWFsV2lkZ2V0LT5HZXRPd25lckFwcCgpLT5HZXROb3RlRHJpdmVyKCk7CisgIHBOb3RlRHJpdmVyLT5SZWdpc3RlckV2ZW50VGFyZ2V0KG1fcE5vcm1hbFdpZGdldC5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wTm9ybWFsV2lkZ2V0LmdldCgpKTsKKyAgbV9wTm9ybWFsV2lkZ2V0LT5Mb2NrVXBkYXRlKCk7CisgIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7CisgIExvYWRIaWdobGlnaHRDYXB0aW9uKCk7CisgIG1fcE5vcm1hbFdpZGdldC0+VW5sb2NrVXBkYXRlKCk7CisgIHJldHVybiBDWEZBX0ZGRmllbGQ6OkxvYWRXaWRnZXQoKTsKK30KKwordm9pZCBDWEZBX0ZGUHVzaEJ1dHRvbjo6VXBkYXRlV2lkZ2V0UHJvcGVydHkoKSB7CisgIHVpbnQzMl90IGR3U3R5bGVFeCA9IDA7CisgIHN3aXRjaCAobV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldEJ1dHRvbkhpZ2hsaWdodCgpKSB7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6SW52ZXJ0ZWQ6CisgICAgICBkd1N0eWxlRXggPSBYRkFfRldMX1BTQlNUWUxFRVhUX0hpbGl0ZUludmVydGVkOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6T3V0bGluZToKKyAgICAgIGR3U3R5bGVFeCA9IFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlT3V0TGluZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OlB1c2g6CisgICAgICBkd1N0eWxlRXggPSBYRkFfRldMX1BTQlNUWUxFRVhUX0hpbGl0ZVB1c2g7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgbV9wTm9ybWFsV2lkZ2V0LT5Nb2RpZnlTdHlsZXNFeChkd1N0eWxlRXgsIDB4RkZGRkZGRkYpOworfQorCit2b2lkIENYRkFfRkZQdXNoQnV0dG9uOjpVbmxvYWRXaWRnZXQoKSB7CisgIG1fcFJvbGxvdmVyVGV4dExheW91dC5yZXNldCgpOworICBtX3BEb3duVGV4dExheW91dC5yZXNldCgpOworICBtX3BSb2xsUHJvdmlkZXIucmVzZXQoKTsKKyAgbV9wRG93blByb3ZpZGVyLnJlc2V0KCk7CisgIENYRkFfRkZGaWVsZDo6VW5sb2FkV2lkZ2V0KCk7Cit9CisKK2Jvb2wgQ1hGQV9GRlB1c2hCdXR0b246OlBlcmZvcm1MYXlvdXQoKSB7CisgIENYRkFfRkZXaWRnZXQ6OlBlcmZvcm1MYXlvdXQoKTsKKyAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0ID0gR2V0UmVjdFdpdGhvdXRSb3RhdGUoKTsKKworICBtX3J0VUkgPSBydFdpZGdldDsKKyAgQ1hGQV9NYXJnaW4qIG1hcmdpbiA9IG1fcE5vZGUtPkdldE1hcmdpbklmRXhpc3RzKCk7CisgIGlmIChtYXJnaW4pCisgICAgWEZBX1JlY3RXaXRob3V0TWFyZ2luKHJ0V2lkZ2V0LCBtYXJnaW4pOworCisgIG1fcnRDYXB0aW9uID0gcnRXaWRnZXQ7CisKKyAgQ1hGQV9DYXB0aW9uKiBjYXB0aW9uID0gbV9wTm9kZS0+R2V0Q2FwdGlvbklmRXhpc3RzKCk7CisgIENYRkFfTWFyZ2luKiBjYXB0aW9uTWFyZ2luID0gY2FwdGlvbiA/IGNhcHRpb24tPkdldE1hcmdpbklmRXhpc3RzKCkgOiBudWxscHRyOworICBpZiAoY2FwdGlvbk1hcmdpbikKKyAgICBYRkFfUmVjdFdpdGhvdXRNYXJnaW4obV9ydENhcHRpb24sIGNhcHRpb25NYXJnaW4pOworCisgIExheW91dEhpZ2hsaWdodENhcHRpb24oKTsKKyAgU2V0RldMUmVjdCgpOworICBpZiAobV9wTm9ybWFsV2lkZ2V0KQorICAgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Zsb2F0IENYRkFfRkZQdXNoQnV0dG9uOjpHZXRMaW5lV2lkdGgoKSB7CisgIENYRkFfQm9yZGVyKiBib3JkZXIgPSBtX3BOb2RlLT5HZXRCb3JkZXJJZkV4aXN0cygpOworICBpZiAoYm9yZGVyICYmIGJvcmRlci0+R2V0UHJlc2VuY2UoKSA9PSBYRkFfQXR0cmlidXRlRW51bTo6VmlzaWJsZSkgeworICAgIENYRkFfRWRnZSogZWRnZSA9IGJvcmRlci0+R2V0RWRnZUlmRXhpc3RzKDApOworICAgIHJldHVybiBlZGdlID8gZWRnZS0+R2V0VGhpY2tuZXNzKCkgOiAwOworICB9CisgIHJldHVybiAwOworfQorCitGWF9BUkdCIENYRkFfRkZQdXNoQnV0dG9uOjpHZXRMaW5lQ29sb3IoKSB7CisgIHJldHVybiAweEZGMDAwMDAwOworfQorCitGWF9BUkdCIENYRkFfRkZQdXNoQnV0dG9uOjpHZXRGaWxsQ29sb3IoKSB7CisgIHJldHVybiAweEZGRkZGRkZGOworfQorCit2b2lkIENYRkFfRkZQdXNoQnV0dG9uOjpMb2FkSGlnaGxpZ2h0Q2FwdGlvbigpIHsKKyAgQ1hGQV9DYXB0aW9uKiBjYXB0aW9uID0gbV9wTm9kZS0+R2V0Q2FwdGlvbklmRXhpc3RzKCk7CisgIGlmICghY2FwdGlvbiB8fCBjYXB0aW9uLT5Jc0hpZGRlbigpKQorICAgIHJldHVybjsKKworICBpZiAobV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkhhc0J1dHRvblJvbGxvdmVyKCkpIHsKKyAgICBpZiAoIW1fcFJvbGxQcm92aWRlcikgeworICAgICAgbV9wUm9sbFByb3ZpZGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfVGV4dFByb3ZpZGVyPigKKyAgICAgICAgICBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKSwgWEZBX1RFWFRQUk9WSURFUlRZUEVfUm9sbG92ZXIpOworICAgIH0KKyAgICBtX3BSb2xsb3ZlclRleHRMYXlvdXQgPQorICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9UZXh0TGF5b3V0PihHZXREb2MoKSwgbV9wUm9sbFByb3ZpZGVyLmdldCgpKTsKKyAgfQorCisgIGlmIChtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+SGFzQnV0dG9uRG93bigpKSB7CisgICAgaWYgKCFtX3BEb3duUHJvdmlkZXIpIHsKKyAgICAgIG1fcERvd25Qcm92aWRlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1RleHRQcm92aWRlcj4oCisgICAgICAgICAgbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCksIFhGQV9URVhUUFJPVklERVJUWVBFX0Rvd24pOworICAgIH0KKyAgICBtX3BEb3duVGV4dExheW91dCA9CisgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1RleHRMYXlvdXQ+KEdldERvYygpLCBtX3BEb3duUHJvdmlkZXIuZ2V0KCkpOworICB9Cit9CisKK3ZvaWQgQ1hGQV9GRlB1c2hCdXR0b246OkxheW91dEhpZ2hsaWdodENhcHRpb24oKSB7CisgIENGWF9TaXplRiBzeihtX3J0Q2FwdGlvbi53aWR0aCwgbV9ydENhcHRpb24uaGVpZ2h0KTsKKyAgTGF5b3V0Q2FwdGlvbigpOworICBpZiAobV9wUm9sbG92ZXJUZXh0TGF5b3V0KQorICAgIG1fcFJvbGxvdmVyVGV4dExheW91dC0+TGF5b3V0KHN6KTsKKyAgaWYgKG1fcERvd25UZXh0TGF5b3V0KQorICAgIG1fcERvd25UZXh0TGF5b3V0LT5MYXlvdXQoc3opOworfQorCit2b2lkIENYRkFfRkZQdXNoQnV0dG9uOjpSZW5kZXJIaWdobGlnaHRDYXB0aW9uKENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCkgeworICBDWEZBX1RleHRMYXlvdXQqIHBDYXBUZXh0TGF5b3V0ID0KKyAgICAgIG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRDYXB0aW9uVGV4dExheW91dCgpOworICBDWEZBX0NhcHRpb24qIGNhcHRpb24gPSBtX3BOb2RlLT5HZXRDYXB0aW9uSWZFeGlzdHMoKTsKKyAgaWYgKCFjYXB0aW9uIHx8ICFjYXB0aW9uLT5Jc1Zpc2libGUoKSkKKyAgICByZXR1cm47CisKKyAgQ0ZYX1JlbmRlckRldmljZSogcFJlbmRlckRldmljZSA9IHBHUy0+R2V0UmVuZGVyRGV2aWNlKCk7CisgIENGWF9SZWN0RiBydENsaXAgPSBtX3J0Q2FwdGlvbjsKKyAgcnRDbGlwLkludGVyc2VjdChHZXRSZWN0V2l0aG91dFJvdGF0ZSgpKTsKKyAgQ0ZYX01hdHJpeCBtdCgxLCAwLCAwLCAxLCBtX3J0Q2FwdGlvbi5sZWZ0LCBtX3J0Q2FwdGlvbi50b3ApOworICBpZiAocE1hdHJpeCkgeworICAgIHJ0Q2xpcCA9IHBNYXRyaXgtPlRyYW5zZm9ybVJlY3QocnRDbGlwKTsKKyAgICBtdC5Db25jYXQoKnBNYXRyaXgpOworICB9CisKKyAgdWludDMyX3QgZHdTdGF0ZSA9IG1fcE5vcm1hbFdpZGdldC0+R2V0U3RhdGVzKCk7CisgIGlmIChtX3BEb3duVGV4dExheW91dCAmJiAoZHdTdGF0ZSAmIEZXTF9TVEFURV9QU0JfUHJlc3NlZCkgJiYKKyAgICAgIChkd1N0YXRlICYgRldMX1NUQVRFX1BTQl9Ib3ZlcmVkKSkgeworICAgIGlmIChtX3BEb3duVGV4dExheW91dC0+RHJhd1N0cmluZyhwUmVuZGVyRGV2aWNlLCBtdCwgcnRDbGlwLCAwKSkKKyAgICAgIHJldHVybjsKKyAgfSBlbHNlIGlmIChtX3BSb2xsb3ZlclRleHRMYXlvdXQgJiYgKGR3U3RhdGUgJiBGV0xfU1RBVEVfUFNCX0hvdmVyZWQpKSB7CisgICAgaWYgKG1fcFJvbGxvdmVyVGV4dExheW91dC0+RHJhd1N0cmluZyhwUmVuZGVyRGV2aWNlLCBtdCwgcnRDbGlwLCAwKSkKKyAgICAgIHJldHVybjsKKyAgfQorCisgIGlmIChwQ2FwVGV4dExheW91dCkKKyAgICBwQ2FwVGV4dExheW91dC0+RHJhd1N0cmluZyhwUmVuZGVyRGV2aWNlLCBtdCwgcnRDbGlwLCAwKTsKK30KKwordm9pZCBDWEZBX0ZGUHVzaEJ1dHRvbjo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7CisgIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsKK30KKwordm9pZCBDWEZBX0ZGUHVzaEJ1dHRvbjo6T25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSB7CisgIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NFdmVudChwRXZlbnQpOworICBDWEZBX0ZGRmllbGQ6Ok9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7Cit9CisKK3ZvaWQgQ1hGQV9GRlB1c2hCdXR0b246Ok9uRHJhd1dpZGdldChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7CisgIGlmIChtX3BOb3JtYWxXaWRnZXQtPkdldFN0eWxlc0V4KCkgJiBYRkFfRldMX1BTQlNUWUxFRVhUX0hpbGl0ZUludmVydGVkKSB7CisgICAgaWYgKChtX3BOb3JtYWxXaWRnZXQtPkdldFN0YXRlcygpICYgRldMX1NUQVRFX1BTQl9QcmVzc2VkKSAmJgorICAgICAgICAobV9wTm9ybWFsV2lkZ2V0LT5HZXRTdGF0ZXMoKSAmIEZXTF9TVEFURV9QU0JfSG92ZXJlZCkpIHsKKyAgICAgIENGWF9SZWN0RiBydEZpbGwoMCwgMCwgbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KCkuU2l6ZSgpKTsKKyAgICAgIGZsb2F0IGZMaW5lV2l0aCA9IEdldExpbmVXaWR0aCgpOworICAgICAgcnRGaWxsLkRlZmxhdGUoZkxpbmVXaXRoLCBmTGluZVdpdGgpOworICAgICAgQ1hGQV9HRVBhdGggcGF0aDsKKyAgICAgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0RmlsbC5sZWZ0LCBydEZpbGwudG9wLCBydEZpbGwud2lkdGgsIHJ0RmlsbC5oZWlnaHQpOworICAgICAgcEdyYXBoaWNzLT5TZXRGaWxsQ29sb3IoQ1hGQV9HRUNvbG9yKEZYQVJHQl9NQUtFKDEyOCwgMTI4LCAyNTUsIDI1NSkpKTsKKyAgICAgIHBHcmFwaGljcy0+RmlsbFBhdGgoJnBhdGgsIEZYRklMTF9XSU5ESU5HLCAmbWF0cml4KTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKG1fcE5vcm1hbFdpZGdldC0+R2V0U3R5bGVzRXgoKSAmIFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlT3V0TGluZSkgeworICAgIGlmICgobV9wTm9ybWFsV2lkZ2V0LT5HZXRTdGF0ZXMoKSAmIEZXTF9TVEFURV9QU0JfUHJlc3NlZCkgJiYKKyAgICAgICAgKG1fcE5vcm1hbFdpZGdldC0+R2V0U3RhdGVzKCkgJiBGV0xfU1RBVEVfUFNCX0hvdmVyZWQpKSB7CisgICAgICBmbG9hdCBmTGluZVdpZHRoID0gR2V0TGluZVdpZHRoKCk7CisgICAgICBwR3JhcGhpY3MtPlNldFN0cm9rZUNvbG9yKENYRkFfR0VDb2xvcihGWEFSR0JfTUFLRSgyNTUsIDEyOCwgMjU1LCAyNTUpKSk7CisgICAgICBwR3JhcGhpY3MtPlNldExpbmVXaWR0aChmTGluZVdpZHRoKTsKKworICAgICAgQ1hGQV9HRVBhdGggcGF0aDsKKyAgICAgIENGWF9SZWN0RiByZWN0ID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXRXaWRnZXRSZWN0KCk7CisgICAgICBwYXRoLkFkZFJlY3RhbmdsZSgwLCAwLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7CisgICAgICBwR3JhcGhpY3MtPlN0cm9rZVBhdGgoJnBhdGgsICZtYXRyaXgpOworICAgIH0KKyAgfQorfQorCitGb3JtRmllbGRUeXBlIENYRkFfRkZQdXNoQnV0dG9uOjpHZXRGb3JtRmllbGRUeXBlKCkgeworICByZXR1cm4gRm9ybUZpZWxkVHlwZTo6a1hGQV9QdXNoQnV0dG9uOworfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZnB1c2hidXR0b24uaCBiL3hmYS9meGZhL2N4ZmFfZmZwdXNoYnV0dG9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyYTBlZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZmZwdXNoYnV0dG9uLmgKQEAgLTAsMCArMSw1NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX0NYRkFfRkZQVVNIQlVUVE9OX0hfCisjZGVmaW5lIFhGQV9GWEZBX0NYRkFfRkZQVVNIQlVUVE9OX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZmllbGQuaCIKKworI2RlZmluZSBYRkFfRldMX1BTQlNUWUxFRVhUX0hpbGl0ZUludmVydGVkICgxTCA8PCAwKQorI2RlZmluZSBYRkFfRldMX1BTQlNUWUxFRVhUX0hpbGl0ZVB1c2ggKDFMIDw8IDEpCisjZGVmaW5lIFhGQV9GV0xfUFNCU1RZTEVFWFRfSGlsaXRlT3V0TGluZSAoMUwgPDwgMikKKworY2xhc3MgQ1hGQV9UZXh0UHJvdmlkZXI7CisKK2NsYXNzIENYRkFfRkZQdXNoQnV0dG9uIDogcHVibGljIENYRkFfRkZGaWVsZCB7CisgcHVibGljOgorICBleHBsaWNpdCBDWEZBX0ZGUHVzaEJ1dHRvbihDWEZBX05vZGUqIHBOb2RlKTsKKyAgfkNYRkFfRkZQdXNoQnV0dG9uKCkgb3ZlcnJpZGU7CisKKyAgLy8gQ1hGQV9GRkZpZWxkCisgIHZvaWQgUmVuZGVyV2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cykgb3ZlcnJpZGU7CisgIGJvb2wgTG9hZFdpZGdldCgpIG92ZXJyaWRlOworICB2b2lkIFVubG9hZFdpZGdldCgpIG92ZXJyaWRlOworICBib29sIFBlcmZvcm1MYXlvdXQoKSBvdmVycmlkZTsKKyAgdm9pZCBVcGRhdGVXaWRnZXRQcm9wZXJ0eSgpIG92ZXJyaWRlOworICB2b2lkIE9uUHJvY2Vzc01lc3NhZ2UoQ0ZXTF9NZXNzYWdlKiBwTWVzc2FnZSkgb3ZlcnJpZGU7CisgIHZvaWQgT25Qcm9jZXNzRXZlbnQoQ0ZXTF9FdmVudCogcEV2ZW50KSBvdmVycmlkZTsKKyAgdm9pZCBPbkRyYXdXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWNzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIG92ZXJyaWRlOworICBGb3JtRmllbGRUeXBlIEdldEZvcm1GaWVsZFR5cGUoKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIHZvaWQgTG9hZEhpZ2hsaWdodENhcHRpb24oKTsKKyAgdm9pZCBMYXlvdXRIaWdobGlnaHRDYXB0aW9uKCk7CisgIHZvaWQgUmVuZGVySGlnaGxpZ2h0Q2FwdGlvbihDWEZBX0dyYXBoaWNzKiBwR1MsIENGWF9NYXRyaXgqIHBNYXRyaXgpOworICBmbG9hdCBHZXRMaW5lV2lkdGgoKTsKKyAgRlhfQVJHQiBHZXRMaW5lQ29sb3IoKTsKKyAgRlhfQVJHQiBHZXRGaWxsQ29sb3IoKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9UZXh0TGF5b3V0PiBtX3BSb2xsb3ZlclRleHRMYXlvdXQ7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX1RleHRMYXlvdXQ+IG1fcERvd25UZXh0TGF5b3V0OworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9UZXh0UHJvdmlkZXI+IG1fcFJvbGxQcm92aWRlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfVGV4dFByb3ZpZGVyPiBtX3BEb3duUHJvdmlkZXI7CisgIElGV0xfV2lkZ2V0RGVsZWdhdGUqIG1fcE9sZERlbGVnYXRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9DWEZBX0ZGUFVTSEJVVFRPTl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZnJlY3RhbmdsZS5jcHAgYi94ZmEvZnhmYS9jeGZhX2ZmcmVjdGFuZ2xlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmMxMDA5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9mZnJlY3RhbmdsZS5jcHAKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZnJlY3RhbmdsZS5oIgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVjdGFuZ2xlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsdWUuaCIKKworQ1hGQV9GRlJlY3RhbmdsZTo6Q1hGQV9GRlJlY3RhbmdsZShDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRkZEcmF3KHBOb2RlKSB7fQorCitDWEZBX0ZGUmVjdGFuZ2xlOjp+Q1hGQV9GRlJlY3RhbmdsZSgpIHt9CisKK3ZvaWQgQ1hGQV9GRlJlY3RhbmdsZTo6UmVuZGVyV2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSB7CisgIGlmICghSXNNYXRjaFZpc2libGVTdGF0dXMoZHdTdGF0dXMpKQorICAgIHJldHVybjsKKworICBDWEZBX1ZhbHVlKiB2YWx1ZSA9IG1fcE5vZGUtPkdldEZvcm1WYWx1ZUlmRXhpc3RzKCk7CisgIGlmICghdmFsdWUpCisgICAgcmV0dXJuOworCisgIENGWF9SZWN0RiByZWN0ID0gR2V0UmVjdFdpdGhvdXRSb3RhdGUoKTsKKyAgQ1hGQV9NYXJnaW4qIG1hcmdpbiA9IG1fcE5vZGUtPkdldE1hcmdpbklmRXhpc3RzKCk7CisgIGlmIChtYXJnaW4pCisgICAgWEZBX1JlY3RXaXRob3V0TWFyZ2luKHJlY3QsIG1hcmdpbik7CisKKyAgQ0ZYX01hdHJpeCBtdFJvdGF0ZSA9IEdldFJvdGF0ZU1hdHJpeCgpOworICBtdFJvdGF0ZS5Db25jYXQobWF0cml4KTsKKworICBEcmF3Qm9yZGVyKHBHUywgdmFsdWUtPkdldFJlY3RhbmdsZUlmRXhpc3RzKCksIHJlY3QsIG10Um90YXRlKTsKK30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfZmZyZWN0YW5nbGUuaCBiL3hmYS9meGZhL2N4ZmFfZmZyZWN0YW5nbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDRjNWM2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9mZnJlY3RhbmdsZS5oCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9DWEZBX0ZGUkVDVEFOR0xFX0hfCisjZGVmaW5lIFhGQV9GWEZBX0NYRkFfRkZSRUNUQU5HTEVfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZkcmF3LmgiCisKK2NsYXNzIENYRkFfRkZSZWN0YW5nbGUgOiBwdWJsaWMgQ1hGQV9GRkRyYXcgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1hGQV9GRlJlY3RhbmdsZShDWEZBX05vZGUqIHBOb2RlKTsKKyAgfkNYRkFfRkZSZWN0YW5nbGUoKSBvdmVycmlkZTsKKworICAvLyBDWEZBX0ZGV2lkZ2V0CisgIHZvaWQgUmVuZGVyV2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cykgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX0NYRkFfRkZSRUNUQU5HTEVfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfZmZzaWduYXR1cmUuY3BwIGIveGZhL2Z4ZmEvY3hmYV9mZnNpZ25hdHVyZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1NmIzOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZmZzaWduYXR1cmUuY3BwCkBAIC0wLDAgKzEsMTE2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmc2lnbmF0dXJlLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZG9jLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmZpZWxkLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZnBhZ2V2aWV3LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZndpZGdldC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2JvcmRlci5oIgorCitDWEZBX0ZGU2lnbmF0dXJlOjpDWEZBX0ZGU2lnbmF0dXJlKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9GRkZpZWxkKHBOb2RlKSB7fQorCitDWEZBX0ZGU2lnbmF0dXJlOjp+Q1hGQV9GRlNpZ25hdHVyZSgpIHt9CisKK2Jvb2wgQ1hGQV9GRlNpZ25hdHVyZTo6TG9hZFdpZGdldCgpIHsKKyAgcmV0dXJuIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpOworfQorCit2b2lkIENYRkFfRkZTaWduYXR1cmU6OlJlbmRlcldpZGdldChDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXR1cykgeworICBpZiAoIUlzTWF0Y2hWaXNpYmxlU3RhdHVzKGR3U3RhdHVzKSkKKyAgICByZXR1cm47CisKKyAgQ0ZYX01hdHJpeCBtdFJvdGF0ZSA9IEdldFJvdGF0ZU1hdHJpeCgpOworICBtdFJvdGF0ZS5Db25jYXQobWF0cml4KTsKKworICBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQocEdTLCBtdFJvdGF0ZSwgZHdTdGF0dXMpOworCisgIERyYXdCb3JkZXIocEdTLCBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0VUlCb3JkZXIoKSwgbV9ydFVJLCBtdFJvdGF0ZSk7CisgIFJlbmRlckNhcHRpb24ocEdTLCAmbXRSb3RhdGUpOworICBEcmF3SGlnaGxpZ2h0KHBHUywgJm10Um90YXRlLCBkd1N0YXR1cywgZmFsc2UpOworfQorCitib29sIENYRkFfRkZTaWduYXR1cmU6Ok9uTW91c2VFbnRlcigpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENYRkFfRkZTaWduYXR1cmU6Ok9uTW91c2VFeGl0KCkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1hGQV9GRlNpZ25hdHVyZTo6T25MQnV0dG9uRG93bih1aW50MzJfdCBkd0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDWEZBX0ZGU2lnbmF0dXJlOjpPbkxCdXR0b25VcCh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1hGQV9GRlNpZ25hdHVyZTo6T25MQnV0dG9uRGJsQ2xrKHVpbnQzMl90IGR3RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1hGQV9GRlNpZ25hdHVyZTo6T25Nb3VzZU1vdmUodWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENYRkFfRkZTaWduYXR1cmU6Ok9uTW91c2VXaGVlbCh1aW50MzJfdCBkd0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCB6RGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1hGQV9GRlNpZ25hdHVyZTo6T25SQnV0dG9uRG93bih1aW50MzJfdCBkd0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDWEZBX0ZGU2lnbmF0dXJlOjpPblJCdXR0b25VcCh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1hGQV9GRlNpZ25hdHVyZTo6T25SQnV0dG9uRGJsQ2xrKHVpbnQzMl90IGR3RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1hGQV9GRlNpZ25hdHVyZTo6T25LZXlEb3duKHVpbnQzMl90IGR3S2V5Q29kZSwgdWludDMyX3QgZHdGbGFncykgeworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1hGQV9GRlNpZ25hdHVyZTo6T25LZXlVcCh1aW50MzJfdCBkd0tleUNvZGUsIHVpbnQzMl90IGR3RmxhZ3MpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENYRkFfRkZTaWduYXR1cmU6Ok9uQ2hhcih1aW50MzJfdCBkd0NoYXIsIHVpbnQzMl90IGR3RmxhZ3MpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorCitGV0xfV2lkZ2V0SGl0IENYRkFfRkZTaWduYXR1cmU6Ok9uSGl0VGVzdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICBpZiAobV9wTm9ybWFsV2lkZ2V0ICYmCisgICAgICBtX3BOb3JtYWxXaWRnZXQtPkhpdFRlc3QoRldMVG9DbGllbnQocG9pbnQpKSAhPSBGV0xfV2lkZ2V0SGl0OjpVbmtub3duKSB7CisgICAgcmV0dXJuIEZXTF9XaWRnZXRIaXQ6OkNsaWVudDsKKyAgfQorCisgIGlmICghR2V0UmVjdFdpdGhvdXRSb3RhdGUoKS5Db250YWlucyhwb2ludCkpCisgICAgcmV0dXJuIEZXTF9XaWRnZXRIaXQ6OlVua25vd247CisgIGlmIChtX3J0Q2FwdGlvbi5Db250YWlucyhwb2ludCkpCisgICAgcmV0dXJuIEZXTF9XaWRnZXRIaXQ6OlRpdGxlYmFyOworICByZXR1cm4gRldMX1dpZGdldEhpdDo6Q2xpZW50OworfQorCitib29sIENYRkFfRkZTaWduYXR1cmU6Ok9uU2V0Q3Vyc29yKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIHJldHVybiBmYWxzZTsKK30KKworRm9ybUZpZWxkVHlwZSBDWEZBX0ZGU2lnbmF0dXJlOjpHZXRGb3JtRmllbGRUeXBlKCkgeworICByZXR1cm4gRm9ybUZpZWxkVHlwZTo6a1hGQV9TaWduYXR1cmU7Cit9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX2Zmc2lnbmF0dXJlLmggYi94ZmEvZnhmYS9jeGZhX2Zmc2lnbmF0dXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQwOTU3NgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZmZzaWduYXR1cmUuaApAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfQ1hGQV9GRlNJR05BVFVSRV9IXworI2RlZmluZSBYRkFfRlhGQV9DWEZBX0ZGU0lHTkFUVVJFX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZmllbGQuaCIKKworY2xhc3MgQ1hGQV9GRlNpZ25hdHVyZSBmaW5hbCA6IHB1YmxpYyBDWEZBX0ZGRmllbGQgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1hGQV9GRlNpZ25hdHVyZShDWEZBX05vZGUqIHBOb2RlKTsKKyAgfkNYRkFfRkZTaWduYXR1cmUoKSBvdmVycmlkZTsKKworICAvLyBDWEZBX0ZGRmllbGQKKyAgdm9pZCBSZW5kZXJXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSBvdmVycmlkZTsKKyAgYm9vbCBMb2FkV2lkZ2V0KCkgb3ZlcnJpZGU7CisgIGJvb2wgT25Nb3VzZUVudGVyKCkgb3ZlcnJpZGU7CisgIGJvb2wgT25Nb3VzZUV4aXQoKSBvdmVycmlkZTsKKyAgYm9vbCBPbkxCdXR0b25Eb3duKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKKyAgYm9vbCBPbkxCdXR0b25VcCh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7CisgIGJvb2wgT25MQnV0dG9uRGJsQ2xrKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKKyAgYm9vbCBPbk1vdXNlTW92ZSh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7CisgIGJvb2wgT25Nb3VzZVdoZWVsKHVpbnQzMl90IGR3RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIGludDE2X3QgekRlbHRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludHkpIG92ZXJyaWRlOworICBib29sIE9uUkJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOworICBib29sIE9uUkJ1dHRvblVwKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKKyAgYm9vbCBPblJCdXR0b25EYmxDbGsodWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOworCisgIGJvb2wgT25LZXlEb3duKHVpbnQzMl90IGR3S2V5Q29kZSwgdWludDMyX3QgZHdGbGFncykgb3ZlcnJpZGU7CisgIGJvb2wgT25LZXlVcCh1aW50MzJfdCBkd0tleUNvZGUsIHVpbnQzMl90IGR3RmxhZ3MpIG92ZXJyaWRlOworICBib29sIE9uQ2hhcih1aW50MzJfdCBkd0NoYXIsIHVpbnQzMl90IGR3RmxhZ3MpIG92ZXJyaWRlOworICBGV0xfV2lkZ2V0SGl0IE9uSGl0VGVzdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7CisgIGJvb2wgT25TZXRDdXJzb3IoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOworICBGb3JtRmllbGRUeXBlIEdldEZvcm1GaWVsZFR5cGUoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfQ1hGQV9GRlNJR05BVFVSRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZnN1YmZvcm0uY3BwIGIveGZhL2Z4ZmEvY3hmYV9mZnN1YmZvcm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YTA3NTAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2Zmc3ViZm9ybS5jcHAKQEAgLTAsMCArMSwxNiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZnN1YmZvcm0uaCIKKworI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZhcHAuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZG9jLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZnBhZ2V2aWV3LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZndpZGdldC5oIgorCitDWEZBX0ZGU3ViRm9ybTo6Q1hGQV9GRlN1YkZvcm0oQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0ZGV2lkZ2V0KHBOb2RlKSB7fQorCitDWEZBX0ZGU3ViRm9ybTo6fkNYRkFfRkZTdWJGb3JtKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfZmZzdWJmb3JtLmggYi94ZmEvZnhmYS9jeGZhX2Zmc3ViZm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2OWI1NzEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2Zmc3ViZm9ybS5oCkBAIC0wLDAgKzEsMTkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9DWEZBX0ZGU1VCRk9STV9IXworI2RlZmluZSBYRkFfRlhGQV9DWEZBX0ZGU1VCRk9STV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZnBhZ2V2aWV3LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZndpZGdldC5oIgorCitjbGFzcyBDWEZBX0ZGU3ViRm9ybSA6IHB1YmxpYyBDWEZBX0ZGV2lkZ2V0IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENYRkFfRkZTdWJGb3JtKENYRkFfTm9kZSogcE5vZGUpOworICB+Q1hGQV9GRlN1YkZvcm0oKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfQ1hGQV9GRlNVQkZPUk1fSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfZmZ0ZXh0LmNwcCBiL3hmYS9meGZhL2N4ZmFfZmZ0ZXh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWUzY2I2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9mZnRleHQuY3BwCkBAIC0wLDAgKzEsMTU2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmdGV4dC5oIgorCisjaW5jbHVkZSAieGZhL2Z3bC9md2xfd2lkZ2V0ZGVmLmgiCisjaW5jbHVkZSAieGZhL2Z3bC9md2xfd2lkZ2V0aGl0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmFwcC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZkb2MuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZHJhdy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZwYWdldmlldy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZ3aWRnZXQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2xpbmt1c2VyZGF0YS5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfcGllY2VsaW5lLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV90ZXh0bGF5b3V0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV90ZXh0cGllY2UuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tYXJnaW4uaCIKKyNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jeGZhX2dyYXBoaWNzLmgiCisKK0NYRkFfRkZUZXh0OjpDWEZBX0ZGVGV4dChDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRkZEcmF3KHBOb2RlKSB7fQorCitDWEZBX0ZGVGV4dDo6fkNYRkFfRkZUZXh0KCkge30KKwordm9pZCBDWEZBX0ZGVGV4dDo6UmVuZGVyV2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGF0dXMpIHsKKyAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpCisgICAgcmV0dXJuOworCisgIENGWF9NYXRyaXggbXRSb3RhdGUgPSBHZXRSb3RhdGVNYXRyaXgoKTsKKyAgbXRSb3RhdGUuQ29uY2F0KG1hdHJpeCk7CisKKyAgQ1hGQV9GRldpZGdldDo6UmVuZGVyV2lkZ2V0KHBHUywgbXRSb3RhdGUsIGR3U3RhdHVzKTsKKworICBDWEZBX1RleHRMYXlvdXQqIHBUZXh0TGF5b3V0ID0gbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldFRleHRMYXlvdXQoKTsKKyAgaWYgKCFwVGV4dExheW91dCkKKyAgICByZXR1cm47CisKKyAgQ0ZYX1JlbmRlckRldmljZSogcFJlbmRlckRldmljZSA9IHBHUy0+R2V0UmVuZGVyRGV2aWNlKCk7CisgIENGWF9SZWN0RiBydFRleHQgPSBHZXRSZWN0V2l0aG91dFJvdGF0ZSgpOworICBDWEZBX01hcmdpbiogbWFyZ2luID0gbV9wTm9kZS0+R2V0TWFyZ2luSWZFeGlzdHMoKTsKKyAgaWYgKG1hcmdpbikgeworICAgIENYRkFfTGF5b3V0SXRlbSogcEl0ZW0gPSB0aGlzOworICAgIGlmICghcEl0ZW0tPkdldFByZXYoKSAmJiAhcEl0ZW0tPkdldE5leHQoKSkgeworICAgICAgWEZBX1JlY3RXaXRob3V0TWFyZ2luKHJ0VGV4dCwgbWFyZ2luKTsKKyAgICB9IGVsc2UgeworICAgICAgZmxvYXQgZlRvcEluc2V0ID0gMDsKKyAgICAgIGZsb2F0IGZCb3R0b21JbnNldCA9IDA7CisgICAgICBpZiAoIXBJdGVtLT5HZXRQcmV2KCkpCisgICAgICAgIGZUb3BJbnNldCA9IG1hcmdpbi0+R2V0VG9wSW5zZXQoKTsKKyAgICAgIGVsc2UgaWYgKCFwSXRlbS0+R2V0TmV4dCgpKQorICAgICAgICBmQm90dG9tSW5zZXQgPSBtYXJnaW4tPkdldEJvdHRvbUluc2V0KCk7CisKKyAgICAgIHJ0VGV4dC5EZWZsYXRlKG1hcmdpbi0+R2V0TGVmdEluc2V0KCksIGZUb3BJbnNldCwgbWFyZ2luLT5HZXRSaWdodEluc2V0KCksCisgICAgICAgICAgICAgICAgICAgICBmQm90dG9tSW5zZXQpOworICAgIH0KKyAgfQorCisgIENGWF9NYXRyaXggbXQoMSwgMCwgMCwgMSwgcnRUZXh0LmxlZnQsIHJ0VGV4dC50b3ApOworICBDRlhfUmVjdEYgcnRDbGlwID0gbXRSb3RhdGUuVHJhbnNmb3JtUmVjdChydFRleHQpOworICBtdC5Db25jYXQobXRSb3RhdGUpOworICBwVGV4dExheW91dC0+RHJhd1N0cmluZyhwUmVuZGVyRGV2aWNlLCBtdCwgcnRDbGlwLCBHZXRJbmRleCgpKTsKK30KKworYm9vbCBDWEZBX0ZGVGV4dDo6SXNMb2FkZWQoKSB7CisgIENYRkFfVGV4dExheW91dCogcFRleHRMYXlvdXQgPSBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0VGV4dExheW91dCgpOworICByZXR1cm4gcFRleHRMYXlvdXQgJiYgIXBUZXh0TGF5b3V0LT5tX2JIYXNCbG9jazsKK30KKworYm9vbCBDWEZBX0ZGVGV4dDo6UGVyZm9ybUxheW91dCgpIHsKKyAgQ1hGQV9GRkRyYXc6OlBlcmZvcm1MYXlvdXQoKTsKKyAgQ1hGQV9UZXh0TGF5b3V0KiBwVGV4dExheW91dCA9IG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRUZXh0TGF5b3V0KCk7CisgIGlmICghcFRleHRMYXlvdXQpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIXBUZXh0TGF5b3V0LT5tX2JIYXNCbG9jaykKKyAgICByZXR1cm4gdHJ1ZTsKKworICBwVGV4dExheW91dC0+bV9CbG9ja3MuY2xlYXIoKTsKKyAgQ1hGQV9MYXlvdXRJdGVtKiBwSXRlbSA9IHRoaXM7CisgIGlmICghcEl0ZW0tPkdldFByZXYoKSAmJiAhcEl0ZW0tPkdldE5leHQoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBwSXRlbSA9IHBJdGVtLT5HZXRGaXJzdCgpOworICB3aGlsZSAocEl0ZW0pIHsKKyAgICBDRlhfUmVjdEYgcnRUZXh0ID0gcEl0ZW0tPkdldFJlY3QoZmFsc2UpOworICAgIENYRkFfTWFyZ2luKiBtYXJnaW4gPSBtX3BOb2RlLT5HZXRNYXJnaW5JZkV4aXN0cygpOworICAgIGlmIChtYXJnaW4pIHsKKyAgICAgIGlmICghcEl0ZW0tPkdldFByZXYoKSkKKyAgICAgICAgcnRUZXh0LmhlaWdodCAtPSBtYXJnaW4tPkdldFRvcEluc2V0KCk7CisgICAgICBlbHNlIGlmICghcEl0ZW0tPkdldE5leHQoKSkKKyAgICAgICAgcnRUZXh0LmhlaWdodCAtPSBtYXJnaW4tPkdldEJvdHRvbUluc2V0KCk7CisgICAgfQorICAgIHBUZXh0TGF5b3V0LT5JdGVtQmxvY2tzKHJ0VGV4dCwgcEl0ZW0tPkdldEluZGV4KCkpOworICAgIHBJdGVtID0gcEl0ZW0tPkdldE5leHQoKTsKKyAgfQorICBwVGV4dExheW91dC0+bV9iSGFzQmxvY2sgPSBmYWxzZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1hGQV9GRlRleHQ6Ok9uTEJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKKyAgaWYgKCFHZXRSZWN0V2l0aG91dFJvdGF0ZSgpLkNvbnRhaW5zKHBvaW50KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY29uc3Qgd2NoYXJfdCogd3NVUkxDb250ZW50ID0gR2V0TGlua1VSTEF0UG9pbnQocG9pbnQpOworICBpZiAoIXdzVVJMQ29udGVudCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgU2V0QnV0dG9uRG93bih0cnVlKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1hGQV9GRlRleHQ6Ok9uTW91c2VNb3ZlKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIHJldHVybiBHZXRSZWN0V2l0aG91dFJvdGF0ZSgpLkNvbnRhaW5zKHBvaW50KSAmJiAhIUdldExpbmtVUkxBdFBvaW50KHBvaW50KTsKK30KKworYm9vbCBDWEZBX0ZGVGV4dDo6T25MQnV0dG9uVXAodWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKKyAgaWYgKCFJc0J1dHRvbkRvd24oKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgU2V0QnV0dG9uRG93bihmYWxzZSk7CisgIGNvbnN0IHdjaGFyX3QqIHdzVVJMQ29udGVudCA9IEdldExpbmtVUkxBdFBvaW50KHBvaW50KTsKKyAgaWYgKCF3c1VSTENvbnRlbnQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENYRkFfRkZEb2MqIHBEb2MgPSBHZXREb2MoKTsKKyAgcERvYy0+R2V0RG9jRW52aXJvbm1lbnQoKS0+R290b1VSTChwRG9jLCB3c1VSTENvbnRlbnQpOworICByZXR1cm4gdHJ1ZTsKK30KKworRldMX1dpZGdldEhpdCBDWEZBX0ZGVGV4dDo6T25IaXRUZXN0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIGlmICghR2V0UmVjdFdpdGhvdXRSb3RhdGUoKS5Db250YWlucyhwb2ludCkpCisgICAgcmV0dXJuIEZXTF9XaWRnZXRIaXQ6OlVua25vd247CisgIGlmICghR2V0TGlua1VSTEF0UG9pbnQocG9pbnQpKQorICAgIHJldHVybiBGV0xfV2lkZ2V0SGl0OjpVbmtub3duOworICByZXR1cm4gRldMX1dpZGdldEhpdDo6SHlwZXJMaW5rOworfQorCitjb25zdCB3Y2hhcl90KiBDWEZBX0ZGVGV4dDo6R2V0TGlua1VSTEF0UG9pbnQoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKKyAgQ1hGQV9UZXh0TGF5b3V0KiBwVGV4dExheW91dCA9IG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRUZXh0TGF5b3V0KCk7CisgIGlmICghcFRleHRMYXlvdXQpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQ0ZYX1JlY3RGIHJlY3QgPSBHZXRSZWN0V2l0aG91dFJvdGF0ZSgpOworICBmb3IgKGNvbnN0IGF1dG8mIHBQaWVjZUxpbmUgOiAqcFRleHRMYXlvdXQtPkdldFBpZWNlTGluZXMoKSkgeworICAgIGZvciAoY29uc3QgYXV0byYgcFBpZWNlIDogcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzKSB7CisgICAgICBpZiAocFBpZWNlLT5wTGlua0RhdGEgJiYKKyAgICAgICAgICBwUGllY2UtPnJ0UGllY2UuQ29udGFpbnMocG9pbnQgLSByZWN0LlRvcExlZnQoKSkpIHsKKyAgICAgICAgcmV0dXJuIHBQaWVjZS0+cExpbmtEYXRhLT5HZXRMaW5rVVJMKCk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBudWxscHRyOworfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZnRleHQuaCBiL3hmYS9meGZhL2N4ZmFfZmZ0ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMzMjE4MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZmZ0ZXh0LmgKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX0NYRkFfRkZURVhUX0hfCisjZGVmaW5lIFhGQV9GWEZBX0NYRkFfRkZURVhUX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZHJhdy5oIgorCitjbGFzcyBDWEZBX0ZGVGV4dCA6IHB1YmxpYyBDWEZBX0ZGRHJhdyB7CisgcHVibGljOgorICBleHBsaWNpdCBDWEZBX0ZGVGV4dChDWEZBX05vZGUqIHBOb2RlKTsKKyAgfkNYRkFfRkZUZXh0KCkgb3ZlcnJpZGU7CisKKyAgLy8gQ1hGQV9GRldpZGdldAorICBib29sIE9uTEJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOworICBib29sIE9uTEJ1dHRvblVwKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKKyAgYm9vbCBPbk1vdXNlTW92ZSh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7CisgIEZXTF9XaWRnZXRIaXQgT25IaXRUZXN0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSBvdmVycmlkZTsKKyAgdm9pZCBSZW5kZXJXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKSBvdmVycmlkZTsKKyAgYm9vbCBJc0xvYWRlZCgpIG92ZXJyaWRlOworICBib29sIFBlcmZvcm1MYXlvdXQoKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIGNvbnN0IHdjaGFyX3QqIEdldExpbmtVUkxBdFBvaW50KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfQ1hGQV9GRlRFWFRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfZmZ0ZXh0ZWRpdC5jcHAgYi94ZmEvZnhmYS9jeGZhX2ZmdGV4dGVkaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZDlhOWIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2ZmdGV4dGVkaXQuY3BwCkBAIC0wLDAgKzEsNDI5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmdGV4dGVkaXQuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfZGF0ZXRpbWVwaWNrZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfZWRpdC5oIgorI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9ldmVudGNoZWNrd29yZC5oIgorI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9ldmVudHRhcmdldC5oIgorI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9ldmVudHRleHRjaGFuZ2VkLmgiCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX21lc3NhZ2VraWxsZm9jdXMuaCIKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfbWVzc2FnZXNldGZvY3VzLmgiCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX25vdGVkcml2ZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmYXBwLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRvYy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYXJhLmgiCisKK25hbWVzcGFjZSB7CisKK0NGV0xfRWRpdCogVG9FZGl0KENGV0xfV2lkZ2V0KiB3aWRnZXQpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PENGV0xfRWRpdCo+KHdpZGdldCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0ZGVGV4dEVkaXQ6OkNYRkFfRkZUZXh0RWRpdChDWEZBX05vZGUqIHBOb2RlKQorICAgIDogQ1hGQV9GRkZpZWxkKHBOb2RlKSwgbV9wT2xkRGVsZWdhdGUobnVsbHB0cikge30KKworQ1hGQV9GRlRleHRFZGl0Ojp+Q1hGQV9GRlRleHRFZGl0KCkgeworICBpZiAobV9wTm9ybWFsV2lkZ2V0KSB7CisgICAgQ0ZXTF9Ob3RlRHJpdmVyKiBwTm90ZURyaXZlciA9CisgICAgICAgIG1fcE5vcm1hbFdpZGdldC0+R2V0T3duZXJBcHAoKS0+R2V0Tm90ZURyaXZlcigpOworICAgIHBOb3RlRHJpdmVyLT5VbnJlZ2lzdGVyRXZlbnRUYXJnZXQobV9wTm9ybWFsV2lkZ2V0LmdldCgpKTsKKyAgfQorfQorCitib29sIENYRkFfRkZUZXh0RWRpdDo6TG9hZFdpZGdldCgpIHsKKyAgYXV0byBwTmV3V2lkZ2V0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfRWRpdD4oCisgICAgICBHZXRGV0xBcHAoKSwgcGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfV2lkZ2V0UHJvcGVydGllcz4oKSwgbnVsbHB0cik7CisgIENGV0xfRWRpdCogcEZXTEVkaXQgPSBwTmV3V2lkZ2V0LmdldCgpOworICBtX3BOb3JtYWxXaWRnZXQgPSBzdGQ6Om1vdmUocE5ld1dpZGdldCk7CisgIG1fcE5vcm1hbFdpZGdldC0+U2V0TGF5b3V0SXRlbSh0aGlzKTsKKworICBDRldMX05vdGVEcml2ZXIqIHBOb3RlRHJpdmVyID0KKyAgICAgIG1fcE5vcm1hbFdpZGdldC0+R2V0T3duZXJBcHAoKS0+R2V0Tm90ZURyaXZlcigpOworICBwTm90ZURyaXZlci0+UmVnaXN0ZXJFdmVudFRhcmdldChtX3BOb3JtYWxXaWRnZXQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcE5vcm1hbFdpZGdldC5nZXQoKSk7CisgIG1fcE9sZERlbGVnYXRlID0gbV9wTm9ybWFsV2lkZ2V0LT5HZXREZWxlZ2F0ZSgpOworICBtX3BOb3JtYWxXaWRnZXQtPlNldERlbGVnYXRlKHRoaXMpOworICBtX3BOb3JtYWxXaWRnZXQtPkxvY2tVcGRhdGUoKTsKKyAgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsKKworICBwRldMRWRpdC0+U2V0VGV4dCgKKyAgICAgIG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRWYWx1ZShYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpKTsKKyAgbV9wTm9ybWFsV2lkZ2V0LT5VbmxvY2tVcGRhdGUoKTsKKyAgcmV0dXJuIENYRkFfRkZGaWVsZDo6TG9hZFdpZGdldCgpOworfQorCit2b2lkIENYRkFfRkZUZXh0RWRpdDo6VXBkYXRlV2lkZ2V0UHJvcGVydHkoKSB7CisgIENGV0xfRWRpdCogcFdpZGdldCA9IHN0YXRpY19jYXN0PENGV0xfRWRpdCo+KG1fcE5vcm1hbFdpZGdldC5nZXQoKSk7CisgIGlmICghcFdpZGdldCkKKyAgICByZXR1cm47CisKKyAgdWludDMyX3QgZHdTdHlsZSA9IDA7CisgIHVpbnQzMl90IGR3RXh0ZW5kZWRTdHlsZSA9CisgICAgICBGV0xfU1RZTEVFWFRfRURUX1Nob3dTY3JvbGxiYXJGb2N1cyB8IEZXTF9TVFlMRUVYVF9FRFRfT3V0ZXJTY3JvbGxiYXI7CisgIGR3RXh0ZW5kZWRTdHlsZSB8PSBVcGRhdGVVSVByb3BlcnR5KCk7CisgIGlmIChtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+SXNNdWx0aUxpbmUoKSkgeworICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX011bHRpTGluZSB8IEZXTF9TVFlMRUVYVF9FRFRfV2FudFJldHVybjsKKyAgICBpZiAoIW1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5Jc1ZlcnRpY2FsU2Nyb2xsUG9saWN5T2ZmKCkpIHsKKyAgICAgIGR3U3R5bGUgfD0gRldMX1dHVFNUWUxFX1ZTY3JvbGw7CisgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9BdXRvVlNjcm9sbDsKKyAgICB9CisgIH0gZWxzZSBpZiAoIW1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5Jc0hvcml6b250YWxTY3JvbGxQb2xpY3lPZmYoKSkgeworICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX0F1dG9IU2Nyb2xsOworICB9CisgIGlmICghbV9wTm9kZS0+SXNPcGVuQWNjZXNzKCkgfHwgIUdldERvYygpLT5HZXRYRkFEb2MoKS0+SXNJbnRlcmFjdGl2ZSgpKSB7CisgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHk7CisgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfTXVsdGlMaW5lOworICB9CisKKyAgWEZBX0VsZW1lbnQgZVR5cGU7CisgIGludDMyX3QgaU1heENoYXJzOworICBzdGQ6OnRpZShlVHlwZSwgaU1heENoYXJzKSA9IG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRNYXhDaGFycygpOworICBpZiAoZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OkV4RGF0YSkKKyAgICBpTWF4Q2hhcnMgPSAwOworCisgIE9wdGlvbmFsPGludDMyX3Q+IG51bUNlbGxzID0gbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldE51bWJlck9mQ2VsbHMoKTsKKyAgaWYgKCFudW1DZWxscykgeworICAgIHBXaWRnZXQtPlNldExpbWl0KGlNYXhDaGFycyk7CisgIH0gZWxzZSBpZiAoKm51bUNlbGxzID09IDApIHsKKyAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9Db21iVGV4dDsKKyAgICBwV2lkZ2V0LT5TZXRMaW1pdChpTWF4Q2hhcnMgPiAwID8gaU1heENoYXJzIDogMSk7CisgIH0gZWxzZSB7CisgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfQ29tYlRleHQ7CisgICAgcFdpZGdldC0+U2V0TGltaXQoKm51bUNlbGxzKTsKKyAgfQorCisgIGR3RXh0ZW5kZWRTdHlsZSB8PSBHZXRBbGlnbm1lbnQoKTsKKyAgbV9wTm9ybWFsV2lkZ2V0LT5Nb2RpZnlTdHlsZXMoZHdTdHlsZSwgMHhGRkZGRkZGRik7CisgIG1fcE5vcm1hbFdpZGdldC0+TW9kaWZ5U3R5bGVzRXgoZHdFeHRlbmRlZFN0eWxlLCAweEZGRkZGRkZGKTsKK30KKworYm9vbCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uTEJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKKyAgaWYgKCFQdEluQWN0aXZlUmVjdChwb2ludCkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIUlzRm9jdXNlZCgpKSB7CisgICAgbV9kd1N0YXR1cyB8PSBYRkFfV2lkZ2V0U3RhdHVzX0ZvY3VzZWQ7CisgICAgVXBkYXRlRldMRGF0YSgpOworICAgIEFkZEludmFsaWRhdGVSZWN0KCk7CisgIH0KKworICBTZXRCdXR0b25Eb3duKHRydWUpOworICBDRldMX01lc3NhZ2VNb3VzZSBtcyhudWxscHRyLCBtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpOworICBtcy5tX2R3Q21kID0gRldMX01vdXNlQ29tbWFuZDo6TGVmdEJ1dHRvbkRvd247CisgIG1zLm1fZHdGbGFncyA9IGR3RmxhZ3M7CisgIG1zLm1fcG9zID0gRldMVG9DbGllbnQocG9pbnQpOworICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENYRkFfRkZUZXh0RWRpdDo6T25SQnV0dG9uRG93bih1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICBpZiAoIW1fcE5vZGUtPklzT3BlbkFjY2VzcygpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFQdEluQWN0aXZlUmVjdChwb2ludCkpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIUlzRm9jdXNlZCgpKSB7CisgICAgbV9kd1N0YXR1cyB8PSBYRkFfV2lkZ2V0U3RhdHVzX0ZvY3VzZWQ7CisgICAgVXBkYXRlRldMRGF0YSgpOworICAgIEFkZEludmFsaWRhdGVSZWN0KCk7CisgIH0KKworICBTZXRCdXR0b25Eb3duKHRydWUpOworICBDRldMX01lc3NhZ2VNb3VzZSBtcyhudWxscHRyLCBudWxscHRyKTsKKyAgbXMubV9kd0NtZCA9IEZXTF9Nb3VzZUNvbW1hbmQ6OlJpZ2h0QnV0dG9uRG93bjsKKyAgbXMubV9kd0ZsYWdzID0gZHdGbGFnczsKKyAgbXMubV9wb3MgPSBGV0xUb0NsaWVudChwb2ludCk7CisgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1hGQV9GRlRleHRFZGl0OjpPblJCdXR0b25VcCh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICBpZiAoIUNYRkFfRkZGaWVsZDo6T25SQnV0dG9uVXAoZHdGbGFncywgcG9pbnQpKQorICAgIHJldHVybiBmYWxzZTsKKworICBHZXREb2MoKS0+R2V0RG9jRW52aXJvbm1lbnQoKS0+UG9wdXBNZW51KHRoaXMsIHBvaW50KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1hGQV9GRlRleHRFZGl0OjpPblNldEZvY3VzKENYRkFfRkZXaWRnZXQqIHBPbGRXaWRnZXQpIHsKKyAgbV9kd1N0YXR1cyAmPSB+WEZBX1dpZGdldFN0YXR1c19UZXh0RWRpdFZhbHVlQ2hhbmdlZDsKKyAgaWYgKCFJc0ZvY3VzZWQoKSkgeworICAgIG1fZHdTdGF0dXMgfD0gWEZBX1dpZGdldFN0YXR1c19Gb2N1c2VkOworICAgIFVwZGF0ZUZXTERhdGEoKTsKKyAgICBBZGRJbnZhbGlkYXRlUmVjdCgpOworICB9CisgIENYRkFfRkZXaWRnZXQ6Ok9uU2V0Rm9jdXMocE9sZFdpZGdldCk7CisgIENGV0xfTWVzc2FnZVNldEZvY3VzIG1zKG51bGxwdHIsIG1fcE5vcm1hbFdpZGdldC5nZXQoKSk7CisgIFRyYW5zbGF0ZUZXTE1lc3NhZ2UoJm1zKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1hGQV9GRlRleHRFZGl0OjpPbktpbGxGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwTmV3V2lkZ2V0KSB7CisgIENGV0xfTWVzc2FnZUtpbGxGb2N1cyBtcyhudWxscHRyLCBtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpOworICBUcmFuc2xhdGVGV0xNZXNzYWdlKCZtcyk7CisgIG1fZHdTdGF0dXMgJj0gflhGQV9XaWRnZXRTdGF0dXNfRm9jdXNlZDsKKworICBTZXRFZGl0U2Nyb2xsT2Zmc2V0KCk7CisgIFByb2Nlc3NDb21taXR0ZWREYXRhKCk7CisgIFVwZGF0ZUZXTERhdGEoKTsKKyAgQWRkSW52YWxpZGF0ZVJlY3QoKTsKKyAgQ1hGQV9GRldpZGdldDo6T25LaWxsRm9jdXMocE5ld1dpZGdldCk7CisKKyAgbV9kd1N0YXR1cyAmPSB+WEZBX1dpZGdldFN0YXR1c19UZXh0RWRpdFZhbHVlQ2hhbmdlZDsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1hGQV9GRlRleHRFZGl0OjpDb21taXREYXRhKCkgeworICBXaWRlU3RyaW5nIHdzVGV4dCA9IHN0YXRpY19jYXN0PENGV0xfRWRpdCo+KG1fcE5vcm1hbFdpZGdldC5nZXQoKSktPkdldFRleHQoKTsKKyAgaWYgKG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5TZXRWYWx1ZShYRkFfVkFMVUVQSUNUVVJFX0VkaXQsIHdzVGV4dCkpIHsKKyAgICBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+VXBkYXRlVUlEaXNwbGF5KEdldERvYygpLT5HZXREb2NWaWV3KCksIHRoaXMpOworICAgIHJldHVybiB0cnVlOworICB9CisgIFZhbGlkYXRlTnVtYmVyRmllbGQod3NUZXh0KTsKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIENYRkFfRkZUZXh0RWRpdDo6VmFsaWRhdGVOdW1iZXJGaWVsZChjb25zdCBXaWRlU3RyaW5nJiB3c1RleHQpIHsKKyAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBHZXROb2RlKCktPkdldFdpZGdldEFjYygpOworICBpZiAoIXBBY2MgfHwgcEFjYy0+R2V0VUlUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6Ok51bWVyaWNFZGl0KQorICAgIHJldHVybjsKKworICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBHZXRBcHAoKS0+R2V0QXBwUHJvdmlkZXIoKTsKKyAgaWYgKCFwQXBwUHJvdmlkZXIpCisgICAgcmV0dXJuOworCisgIFdpZGVTdHJpbmcgd3NTb21GaWVsZCA9IHBBY2MtPkdldE5vZGUoKS0+R2V0U09NRXhwcmVzc2lvbigpOworICBwQXBwUHJvdmlkZXItPk1zZ0JveChXaWRlU3RyaW5nOjpGb3JtYXQoTCIlbHMgY2FuIG5vdCBjb250YWluICVscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1RleHQuY19zdHIoKSwgd3NTb21GaWVsZC5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcEFwcFByb3ZpZGVyLT5HZXRBcHBUaXRsZSgpLCBYRkFfTUJJQ09OX0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfTUJfT0spOworfQorCitib29sIENYRkFfRkZUZXh0RWRpdDo6SXNEYXRhQ2hhbmdlZCgpIHsKKyAgcmV0dXJuIChtX2R3U3RhdHVzICYgWEZBX1dpZGdldFN0YXR1c19UZXh0RWRpdFZhbHVlQ2hhbmdlZCkgIT0gMDsKK30KKwordWludDMyX3QgQ1hGQV9GRlRleHRFZGl0OjpHZXRBbGlnbm1lbnQoKSB7CisgIENYRkFfUGFyYSogcGFyYSA9IG1fcE5vZGUtPkdldFBhcmFJZkV4aXN0cygpOworICBpZiAoIXBhcmEpCisgICAgcmV0dXJuIDA7CisKKyAgdWludDMyX3QgZHdFeHRlbmRlZFN0eWxlID0gMDsKKyAgc3dpdGNoIChwYXJhLT5HZXRIb3Jpem9udGFsQWxpZ24oKSkgeworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkNlbnRlcjoKKyAgICAgIGR3RXh0ZW5kZWRTdHlsZSB8PSBGV0xfU1RZTEVFWFRfRURUX0hDZW50ZXI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpKdXN0aWZ5OgorICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfSnVzdGlmaWVkOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6SnVzdGlmeUFsbDoKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpSYWRpeDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OlJpZ2h0OgorICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfSEZhcjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9ITmVhcjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgc3dpdGNoIChwYXJhLT5HZXRWZXJ0aWNhbEFsaWduKCkpIHsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpNaWRkbGU6CisgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9WQ2VudGVyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6Qm90dG9tOgorICAgICAgZHdFeHRlbmRlZFN0eWxlIHw9IEZXTF9TVFlMRUVYVF9FRFRfVkZhcjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBkd0V4dGVuZGVkU3R5bGUgfD0gRldMX1NUWUxFRVhUX0VEVF9WTmVhcjsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBkd0V4dGVuZGVkU3R5bGU7Cit9CisKK2Jvb2wgQ1hGQV9GRlRleHRFZGl0OjpVcGRhdGVGV0xEYXRhKCkgeworICBpZiAoIW1fcE5vcm1hbFdpZGdldCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQ0ZXTF9FZGl0KiBwRWRpdCA9IHN0YXRpY19jYXN0PENGV0xfRWRpdCo+KG1fcE5vcm1hbFdpZGdldC5nZXQoKSk7CisgIFhGQV9WQUxVRVBJQ1RVUkUgZVR5cGUgPSBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXk7CisgIGlmIChJc0ZvY3VzZWQoKSkKKyAgICBlVHlwZSA9IFhGQV9WQUxVRVBJQ1RVUkVfRWRpdDsKKworICBib29sIGJVcGRhdGUgPSBmYWxzZTsKKyAgaWYgKG1fcE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRVSVR5cGUoKSA9PSBYRkFfRWxlbWVudDo6VGV4dEVkaXQgJiYKKyAgICAgICFtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0TnVtYmVyT2ZDZWxscygpKSB7CisgICAgWEZBX0VsZW1lbnQgZWxlbWVudFR5cGU7CisgICAgaW50MzJfdCBpTWF4Q2hhcnM7CisgICAgc3RkOjp0aWUoZWxlbWVudFR5cGUsIGlNYXhDaGFycykgPSBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0TWF4Q2hhcnMoKTsKKyAgICBpZiAoZWxlbWVudFR5cGUgPT0gWEZBX0VsZW1lbnQ6OkV4RGF0YSkKKyAgICAgIGlNYXhDaGFycyA9IGVUeXBlID09IFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCA/IGlNYXhDaGFycyA6IDA7CisgICAgaWYgKHBFZGl0LT5HZXRMaW1pdCgpICE9IGlNYXhDaGFycykgeworICAgICAgcEVkaXQtPlNldExpbWl0KGlNYXhDaGFycyk7CisgICAgICBiVXBkYXRlID0gdHJ1ZTsKKyAgICB9CisgIH0gZWxzZSBpZiAobV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldFVJVHlwZSgpID09IFhGQV9FbGVtZW50OjpCYXJjb2RlKSB7CisgICAgaW50MzJfdCBuRGF0YUxlbiA9IDA7CisgICAgaWYgKGVUeXBlID09IFhGQV9WQUxVRVBJQ1RVUkVfRWRpdCkKKyAgICAgIG5EYXRhTGVuID0gbV9wTm9kZS0+R2V0QmFyY29kZUF0dHJpYnV0ZV9EYXRhTGVuZ3RoKCkudmFsdWVfb3IoMCk7CisKKyAgICBwRWRpdC0+U2V0TGltaXQobkRhdGFMZW4pOworICAgIGJVcGRhdGUgPSB0cnVlOworICB9CisKKyAgV2lkZVN0cmluZyB3c1RleHQgPSBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0VmFsdWUoZVR5cGUpOworICBXaWRlU3RyaW5nIHdzT2xkVGV4dCA9IHBFZGl0LT5HZXRUZXh0KCk7CisgIGlmICh3c1RleHQgIT0gd3NPbGRUZXh0IHx8IChlVHlwZSA9PSBYRkFfVkFMVUVQSUNUVVJFX0VkaXQgJiYgYlVwZGF0ZSkpIHsKKyAgICBwRWRpdC0+U2V0VGV4dCh3c1RleHQpOworICAgIGJVcGRhdGUgPSB0cnVlOworICB9CisgIGlmIChiVXBkYXRlKQorICAgIG1fcE5vcm1hbFdpZGdldC0+VXBkYXRlKCk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ1hGQV9GRlRleHRFZGl0OjpPblRleHRDaGFuZ2VkKENGV0xfV2lkZ2V0KiBwV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NDaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NQcmV2VGV4dCkgeworICBtX2R3U3RhdHVzIHw9IFhGQV9XaWRnZXRTdGF0dXNfVGV4dEVkaXRWYWx1ZUNoYW5nZWQ7CisgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07CisgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX0NoYW5nZTsKKyAgZVBhcmFtLm1fd3NDaGFuZ2UgPSB3c0NoYW5nZWQ7CisgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKTsKKyAgZVBhcmFtLm1fd3NQcmV2VGV4dCA9IHdzUHJldlRleHQ7CisgIENGV0xfRWRpdCogcEVkaXQgPSBzdGF0aWNfY2FzdDxDRldMX0VkaXQqPihtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpOworICBpZiAobV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCktPkdldFVJVHlwZSgpID09IFhGQV9FbGVtZW50OjpEYXRlVGltZUVkaXQpIHsKKyAgICBDRldMX0RhdGVUaW1lUGlja2VyKiBwRGF0ZVRpbWUgPSAoQ0ZXTF9EYXRlVGltZVBpY2tlciopcEVkaXQ7CisgICAgZVBhcmFtLm1fd3NOZXdUZXh0ID0gcERhdGVUaW1lLT5HZXRFZGl0VGV4dCgpOworICAgIGlmIChwRGF0ZVRpbWUtPkhhc1NlbGVjdGlvbigpKSB7CisgICAgICBzaXplX3QgY291bnQ7CisgICAgICBzdGQ6OnRpZShlUGFyYW0ubV9pU2VsU3RhcnQsIGNvdW50KSA9IHBEYXRlVGltZS0+R2V0U2VsZWN0aW9uKCk7CisgICAgICBlUGFyYW0ubV9pU2VsRW5kID0gZVBhcmFtLm1faVNlbFN0YXJ0ICsgY291bnQ7CisgICAgfQorICB9IGVsc2UgeworICAgIGVQYXJhbS5tX3dzTmV3VGV4dCA9IHBFZGl0LT5HZXRUZXh0KCk7CisgICAgaWYgKHBFZGl0LT5IYXNTZWxlY3Rpb24oKSkKKyAgICAgIHN0ZDo6dGllKGVQYXJhbS5tX2lTZWxTdGFydCwgZVBhcmFtLm1faVNlbEVuZCkgPSBwRWRpdC0+R2V0U2VsZWN0aW9uKCk7CisgIH0KKyAgbV9wTm9kZS0+UHJvY2Vzc0V2ZW50KEdldERvY1ZpZXcoKSwgWEZBX0F0dHJpYnV0ZUVudW06OkNoYW5nZSwgJmVQYXJhbSk7Cit9CisKK3ZvaWQgQ1hGQV9GRlRleHRFZGl0OjpPblRleHRGdWxsKENGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7CisgIENYRkFfRXZlbnRQYXJhbSBlUGFyYW07CisgIGVQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX0Z1bGw7CisgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKTsKKyAgbV9wTm9kZS0+UHJvY2Vzc0V2ZW50KEdldERvY1ZpZXcoKSwgWEZBX0F0dHJpYnV0ZUVudW06OkZ1bGwsICZlUGFyYW0pOworfQorCitib29sIENYRkFfRkZUZXh0RWRpdDo6Q2hlY2tXb3JkKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzV29yZCkgeworICByZXR1cm4gc1dvcmQuSXNFbXB0eSgpIHx8CisgICAgICAgICBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0VUlUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlRleHRFZGl0OworfQorCit2b2lkIENYRkFfRkZUZXh0RWRpdDo6T25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSB7CisgIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NNZXNzYWdlKHBNZXNzYWdlKTsKK30KKwordm9pZCBDWEZBX0ZGVGV4dEVkaXQ6Ok9uUHJvY2Vzc0V2ZW50KENGV0xfRXZlbnQqIHBFdmVudCkgeworICBDWEZBX0ZGRmllbGQ6Ok9uUHJvY2Vzc0V2ZW50KHBFdmVudCk7CisgIHN3aXRjaCAocEV2ZW50LT5HZXRUeXBlKCkpIHsKKyAgICBjYXNlIENGV0xfRXZlbnQ6OlR5cGU6OlRleHRDaGFuZ2VkOiB7CisgICAgICBDRldMX0V2ZW50VGV4dENoYW5nZWQqIGV2ZW50ID0KKyAgICAgICAgICBzdGF0aWNfY2FzdDxDRldMX0V2ZW50VGV4dENoYW5nZWQqPihwRXZlbnQpOworICAgICAgV2lkZVN0cmluZyB3c0NoYW5nZTsKKyAgICAgIE9uVGV4dENoYW5nZWQobV9wTm9ybWFsV2lkZ2V0LmdldCgpLCB3c0NoYW5nZSwgZXZlbnQtPndzUHJldlRleHQpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQ0ZXTF9FdmVudDo6VHlwZTo6VGV4dEZ1bGw6IHsKKyAgICAgIE9uVGV4dEZ1bGwobV9wTm9ybWFsV2lkZ2V0LmdldCgpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIENGV0xfRXZlbnQ6OlR5cGU6OkNoZWNrV29yZDogeworICAgICAgV2lkZVN0cmluZyB3c3RyKEwiRldMX0VWRU5UX0RUUF9TZWxlY3RDaGFuZ2VkIik7CisgICAgICBDRldMX0V2ZW50Q2hlY2tXb3JkKiBldmVudCA9IHN0YXRpY19jYXN0PENGV0xfRXZlbnRDaGVja1dvcmQqPihwRXZlbnQpOworICAgICAgZXZlbnQtPmJDaGVja1dvcmQgPSBDaGVja1dvcmQoZXZlbnQtPmJzV29yZC5Bc1N0cmluZ1ZpZXcoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIG1fcE9sZERlbGVnYXRlLT5PblByb2Nlc3NFdmVudChwRXZlbnQpOworfQorCit2b2lkIENYRkFfRkZUZXh0RWRpdDo6T25EcmF3V2lkZ2V0KENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7CisgIG1fcE9sZERlbGVnYXRlLT5PbkRyYXdXaWRnZXQocEdyYXBoaWNzLCBtYXRyaXgpOworfQorCitib29sIENYRkFfRkZUZXh0RWRpdDo6Q2FuVW5kbygpIHsKKyAgcmV0dXJuIFRvRWRpdChtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpLT5DYW5VbmRvKCk7Cit9CisKK2Jvb2wgQ1hGQV9GRlRleHRFZGl0OjpDYW5SZWRvKCkgeworICByZXR1cm4gVG9FZGl0KG1fcE5vcm1hbFdpZGdldC5nZXQoKSktPkNhblJlZG8oKTsKK30KKworYm9vbCBDWEZBX0ZGVGV4dEVkaXQ6OlVuZG8oKSB7CisgIHJldHVybiBUb0VkaXQobV9wTm9ybWFsV2lkZ2V0LmdldCgpKS0+VW5kbygpOworfQorCitib29sIENYRkFfRkZUZXh0RWRpdDo6UmVkbygpIHsKKyAgcmV0dXJuIFRvRWRpdChtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpLT5SZWRvKCk7Cit9CisKK2Jvb2wgQ1hGQV9GRlRleHRFZGl0OjpDYW5Db3B5KCkgeworICByZXR1cm4gVG9FZGl0KG1fcE5vcm1hbFdpZGdldC5nZXQoKSktPkhhc1NlbGVjdGlvbigpOworfQorCitib29sIENYRkFfRkZUZXh0RWRpdDo6Q2FuQ3V0KCkgeworICBpZiAoVG9FZGl0KG1fcE5vcm1hbFdpZGdldC5nZXQoKSktPkdldFN0eWxlc0V4KCkgJiBGV0xfU1RZTEVFWFRfRURUX1JlYWRPbmx5KQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIFRvRWRpdChtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpLT5IYXNTZWxlY3Rpb24oKTsKK30KKworYm9vbCBDWEZBX0ZGVGV4dEVkaXQ6OkNhblBhc3RlKCkgeworICByZXR1cm4gIShUb0VkaXQobV9wTm9ybWFsV2lkZ2V0LmdldCgpKS0+R2V0U3R5bGVzRXgoKSAmCisgICAgICAgICAgIEZXTF9TVFlMRUVYVF9FRFRfUmVhZE9ubHkpOworfQorCitib29sIENYRkFfRkZUZXh0RWRpdDo6Q2FuU2VsZWN0QWxsKCkgeworICByZXR1cm4gVG9FZGl0KG1fcE5vcm1hbFdpZGdldC5nZXQoKSktPkdldFRleHRMZW5ndGgoKSA+IDA7Cit9CisKK09wdGlvbmFsPFdpZGVTdHJpbmc+IENYRkFfRkZUZXh0RWRpdDo6Q29weSgpIHsKKyAgcmV0dXJuIFRvRWRpdChtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpLT5Db3B5KCk7Cit9CisKK09wdGlvbmFsPFdpZGVTdHJpbmc+IENYRkFfRkZUZXh0RWRpdDo6Q3V0KCkgeworICByZXR1cm4gVG9FZGl0KG1fcE5vcm1hbFdpZGdldC5nZXQoKSktPkN1dCgpOworfQorCitib29sIENYRkFfRkZUZXh0RWRpdDo6UGFzdGUoY29uc3QgV2lkZVN0cmluZyYgd3NQYXN0ZSkgeworICByZXR1cm4gVG9FZGl0KG1fcE5vcm1hbFdpZGdldC5nZXQoKSktPlBhc3RlKHdzUGFzdGUpOworfQorCit2b2lkIENYRkFfRkZUZXh0RWRpdDo6U2VsZWN0QWxsKCkgeworICBUb0VkaXQobV9wTm9ybWFsV2lkZ2V0LmdldCgpKS0+U2VsZWN0QWxsKCk7Cit9CisKK3ZvaWQgQ1hGQV9GRlRleHRFZGl0OjpEZWxldGUoKSB7CisgIFRvRWRpdChtX3BOb3JtYWxXaWRnZXQuZ2V0KCkpLT5DbGVhclRleHQoKTsKK30KKwordm9pZCBDWEZBX0ZGVGV4dEVkaXQ6OkRlU2VsZWN0KCkgeworICBUb0VkaXQobV9wTm9ybWFsV2lkZ2V0LmdldCgpKS0+Q2xlYXJTZWxlY3Rpb24oKTsKK30KKworRm9ybUZpZWxkVHlwZSBDWEZBX0ZGVGV4dEVkaXQ6OkdldEZvcm1GaWVsZFR5cGUoKSB7CisgIHJldHVybiBGb3JtRmllbGRUeXBlOjprWEZBX1RleHRGaWVsZDsKK30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfZmZ0ZXh0ZWRpdC5oIGIveGZhL2Z4ZmEvY3hmYV9mZnRleHRlZGl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThlZGI0NgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZmZ0ZXh0ZWRpdC5oCkBAIC0wLDAgKzEsNzQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9DWEZBX0ZGVEVYVEVESVRfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfQ1hGQV9GRlRFWFRFRElUX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZmllbGQuaCIKKworY2xhc3MgQ0ZXTF9FdmVudDsKK2NsYXNzIENGV0xfV2lkZ2V0OworY2xhc3MgQ0ZYX01hdHJpeDsKK2NsYXNzIENYRkFfRkZXaWRnZXQ7CitjbGFzcyBDWEZBX1dpZGdldEFjYzsKK2NsYXNzIElGV0xfV2lkZ2V0RGVsZWdhdGU7CisKK2NsYXNzIENYRkFfRkZUZXh0RWRpdCA6IHB1YmxpYyBDWEZBX0ZGRmllbGQgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1hGQV9GRlRleHRFZGl0KENYRkFfTm9kZSogcE5vZGUpOworICB+Q1hGQV9GRlRleHRFZGl0KCkgb3ZlcnJpZGU7CisKKyAgLy8gQ1hGQV9GRkZpZWxkCisgIGJvb2wgTG9hZFdpZGdldCgpIG92ZXJyaWRlOworICB2b2lkIFVwZGF0ZVdpZGdldFByb3BlcnR5KCkgb3ZlcnJpZGU7CisgIGJvb2wgT25MQnV0dG9uRG93bih1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7CisgIGJvb2wgT25SQnV0dG9uRG93bih1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgb3ZlcnJpZGU7CisgIGJvb2wgT25SQnV0dG9uVXAodWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIG92ZXJyaWRlOworICBib29sIE9uU2V0Rm9jdXMoQ1hGQV9GRldpZGdldCogcE9sZFdpZGdldCkgb3ZlcnJpZGU7CisgIGJvb2wgT25LaWxsRm9jdXMoQ1hGQV9GRldpZGdldCogcE5ld1dpZGdldCkgb3ZlcnJpZGU7CisgIHZvaWQgT25Qcm9jZXNzTWVzc2FnZShDRldMX01lc3NhZ2UqIHBNZXNzYWdlKSBvdmVycmlkZTsKKyAgdm9pZCBPblByb2Nlc3NFdmVudChDRldMX0V2ZW50KiBwRXZlbnQpIG92ZXJyaWRlOworICB2b2lkIE9uRHJhd1dpZGdldChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBPblRleHRDaGFuZ2VkKENGV0xfV2lkZ2V0KiBwV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NDaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NQcmV2VGV4dCk7CisgIHZvaWQgT25UZXh0RnVsbChDRldMX1dpZGdldCogcFdpZGdldCk7CisgIGJvb2wgQ2hlY2tXb3JkKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzV29yZCk7CisKKyAgLy8gQ1hGQV9GRldpZGdldAorICBib29sIENhblVuZG8oKSBvdmVycmlkZTsKKyAgYm9vbCBDYW5SZWRvKCkgb3ZlcnJpZGU7CisgIGJvb2wgVW5kbygpIG92ZXJyaWRlOworICBib29sIFJlZG8oKSBvdmVycmlkZTsKKyAgYm9vbCBDYW5Db3B5KCkgb3ZlcnJpZGU7CisgIGJvb2wgQ2FuQ3V0KCkgb3ZlcnJpZGU7CisgIGJvb2wgQ2FuUGFzdGUoKSBvdmVycmlkZTsKKyAgYm9vbCBDYW5TZWxlY3RBbGwoKSBvdmVycmlkZTsKKyAgT3B0aW9uYWw8V2lkZVN0cmluZz4gQ29weSgpIG92ZXJyaWRlOworICBPcHRpb25hbDxXaWRlU3RyaW5nPiBDdXQoKSBvdmVycmlkZTsKKyAgYm9vbCBQYXN0ZShjb25zdCBXaWRlU3RyaW5nJiB3c1Bhc3RlKSBvdmVycmlkZTsKKyAgdm9pZCBTZWxlY3RBbGwoKSBvdmVycmlkZTsKKyAgdm9pZCBEZWxldGUoKSBvdmVycmlkZTsKKyAgdm9pZCBEZVNlbGVjdCgpIG92ZXJyaWRlOworICBGb3JtRmllbGRUeXBlIEdldEZvcm1GaWVsZFR5cGUoKSBvdmVycmlkZTsKKworIHByb3RlY3RlZDoKKyAgdWludDMyX3QgR2V0QWxpZ25tZW50KCk7CisKKyAgSUZXTF9XaWRnZXREZWxlZ2F0ZSogbV9wT2xkRGVsZWdhdGU7CisKKyBwcml2YXRlOgorICBib29sIENvbW1pdERhdGEoKSBvdmVycmlkZTsKKyAgYm9vbCBVcGRhdGVGV0xEYXRhKCkgb3ZlcnJpZGU7CisgIGJvb2wgSXNEYXRhQ2hhbmdlZCgpIG92ZXJyaWRlOworICB2b2lkIFZhbGlkYXRlTnVtYmVyRmllbGQoY29uc3QgV2lkZVN0cmluZyYgd3NUZXh0KTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfQ1hGQV9GRlRFWFRFRElUX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0LmNwcCBiL3hmYS9meGZhL2N4ZmFfZmZ3aWRnZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYzQ1YzcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0LmNwcApAQCAtMCwwICsxLDYzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZndpZGdldC5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9jcGRmX21vZHVsZW1nci5oIgorI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9jb2RlYy9jY29kZWNfcHJvZ3Jlc3NpdmVkZWNvZGVyLmgiCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2Z4X2NvZGVjLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfbWVtb3J5c3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9tYXliZV9vd25lZC5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcGF0aGRhdGEuaCIKKyNpbmNsdWRlICJ4ZmEvZndsL2Z3bF93aWRnZXRoaXQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmYXBwLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRvYy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZkb2N2aWV3LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZnBhZ2V2aWV3LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9pbWFnZXJlbmRlcmVyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV93aWRnZXRhY2MuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib3JkZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib3guaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbWFnZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dHByb2Nlc3Nvci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21hcmdpbi5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jeGZhX2dyYXBoaWNzLmgiCisKK25hbWVzcGFjZSB7CisKK0ZYRElCX0Zvcm1hdCBYRkFfR2V0RElCRm9ybWF0KEZYQ09ERUNfSU1BR0VfVFlQRSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpQ29tcG9uZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJpdHNQZXJDb21wb25lbnQpIHsKKyAgRlhESUJfRm9ybWF0IGRpYkZvcm1hdCA9IEZYRElCX0FyZ2I7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRlhDT0RFQ19JTUFHRV9CTVA6CisgICAgY2FzZSBGWENPREVDX0lNQUdFX0pQRzoKKyAgICBjYXNlIEZYQ09ERUNfSU1BR0VfVElGOiB7CisgICAgICBkaWJGb3JtYXQgPSBGWERJQl9SZ2IzMjsKKyAgICAgIGludDMyX3QgYnBwID0gaUNvbXBvbmVudHMgKiBpQml0c1BlckNvbXBvbmVudDsKKyAgICAgIGlmIChicHAgPD0gMjQpIHsKKyAgICAgICAgZGliRm9ybWF0ID0gRlhESUJfUmdiOworICAgICAgfQorICAgIH0gYnJlYWs7CisgICAgY2FzZSBGWENPREVDX0lNQUdFX1BORzoKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGRpYkZvcm1hdDsKK30KKworYm9vbCBJc0ZYQ29kZWNFcnJvclN0YXR1cyhGWENPREVDX1NUQVRVUyBzdGF0dXMpIHsKKyAgcmV0dXJuIChzdGF0dXMgPT0gRlhDT0RFQ19TVEFUVVNfRVJST1IgfHwKKyNpZmRlZiBQREZfRU5BQkxFX1hGQQorICAgICAgICAgIHN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19FUlJfTUVNT1JZIHx8CisjZW5kaWYgIC8vIFBERl9FTkFCTEVfWEZBCisgICAgICAgICAgc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0VSUl9SRUFEIHx8CisgICAgICAgICAgc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0VSUl9GTFVTSCB8fAorICAgICAgICAgIHN0YXR1cyA9PSBGWENPREVDX1NUQVRVU19FUlJfRk9STUFUIHx8CisgICAgICAgICAgc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0VSUl9QQVJBTVMpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBYRkFfRHJhd0ltYWdlKENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0SW1hZ2UsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBwRElCaXRtYXAsCisgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZUVudW0gaUFzcGVjdCwKKyAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlJbWFnZVhEcGksCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpSW1hZ2VZRHBpLAorICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtIGlIb3J6QWxpZ24sCisgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZUVudW0gaVZlcnRBbGlnbikgeworICBpZiAocnRJbWFnZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuOworICBpZiAoIXBESUJpdG1hcCB8fCAhcERJQml0bWFwLT5HZXRCdWZmZXIoKSkKKyAgICByZXR1cm47CisKKyAgQ0ZYX1JlY3RGIHJ0Rml0KAorICAgICAgcnRJbWFnZS5Ub3BMZWZ0KCksCisgICAgICBYRkFfVW5pdFB4MlB0KChmbG9hdClwRElCaXRtYXAtPkdldFdpZHRoKCksIChmbG9hdClpSW1hZ2VYRHBpKSwKKyAgICAgIFhGQV9Vbml0UHgyUHQoKGZsb2F0KXBESUJpdG1hcC0+R2V0SGVpZ2h0KCksIChmbG9hdClpSW1hZ2VZRHBpKSk7CisgIHN3aXRjaCAoaUFzcGVjdCkgeworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkZpdDogeworICAgICAgZmxvYXQgZjEgPSBydEltYWdlLmhlaWdodCAvIHJ0Rml0LmhlaWdodDsKKyAgICAgIGZsb2F0IGYyID0gcnRJbWFnZS53aWR0aCAvIHJ0Rml0LndpZHRoOworICAgICAgZjEgPSBzdGQ6Om1pbihmMSwgZjIpOworICAgICAgcnRGaXQuaGVpZ2h0ID0gcnRGaXQuaGVpZ2h0ICogZjE7CisgICAgICBydEZpdC53aWR0aCA9IHJ0Rml0LndpZHRoICogZjE7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6SGVpZ2h0OiB7CisgICAgICBmbG9hdCBmMSA9IHJ0SW1hZ2UuaGVpZ2h0IC8gcnRGaXQuaGVpZ2h0OworICAgICAgcnRGaXQuaGVpZ2h0ID0gcnRJbWFnZS5oZWlnaHQ7CisgICAgICBydEZpdC53aWR0aCA9IGYxICogcnRGaXQud2lkdGg7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6Tm9uZToKKyAgICAgIHJ0Rml0LmhlaWdodCA9IHJ0SW1hZ2UuaGVpZ2h0OworICAgICAgcnRGaXQud2lkdGggPSBydEltYWdlLndpZHRoOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6V2lkdGg6IHsKKyAgICAgIGZsb2F0IGYxID0gcnRJbWFnZS53aWR0aCAvIHJ0Rml0LndpZHRoOworICAgICAgcnRGaXQud2lkdGggPSBydEltYWdlLndpZHRoOworICAgICAgcnRGaXQuaGVpZ2h0ID0gcnRGaXQuaGVpZ2h0ICogZjE7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6QWN0dWFsOgorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChpSG9yekFsaWduID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpDZW50ZXIpCisgICAgcnRGaXQubGVmdCArPSAocnRJbWFnZS53aWR0aCAtIHJ0Rml0LndpZHRoKSAvIDI7CisgIGVsc2UgaWYgKGlIb3J6QWxpZ24gPT0gWEZBX0F0dHJpYnV0ZUVudW06OlJpZ2h0KQorICAgIHJ0Rml0LmxlZnQgPSBydEltYWdlLnJpZ2h0KCkgLSBydEZpdC53aWR0aDsKKworICBpZiAoaVZlcnRBbGlnbiA9PSBYRkFfQXR0cmlidXRlRW51bTo6TWlkZGxlKQorICAgIHJ0Rml0LnRvcCArPSAocnRJbWFnZS5oZWlnaHQgLSBydEZpdC5oZWlnaHQpIC8gMjsKKyAgZWxzZSBpZiAoaVZlcnRBbGlnbiA9PSBYRkFfQXR0cmlidXRlRW51bTo6Qm90dG9tKQorICAgIHJ0Rml0LnRvcCA9IHJ0SW1hZ2UuYm90dG9tKCkgLSBydEltYWdlLmhlaWdodDsKKworICBDRlhfUmVuZGVyRGV2aWNlKiBwUmVuZGVyRGV2aWNlID0gcEdTLT5HZXRSZW5kZXJEZXZpY2UoKTsKKyAgQ0ZYX1JlbmRlckRldmljZTo6U3RhdGVSZXN0b3JlciByZXN0b3JlcihwUmVuZGVyRGV2aWNlKTsKKyAgQ0ZYX1BhdGhEYXRhIHBhdGg7CisgIHBhdGguQXBwZW5kUmVjdChydEltYWdlLmxlZnQsIHJ0SW1hZ2UuYm90dG9tKCksIHJ0SW1hZ2UucmlnaHQoKSwgcnRJbWFnZS50b3ApOworICBwUmVuZGVyRGV2aWNlLT5TZXRDbGlwX1BhdGhGaWxsKCZwYXRoLCAmbWF0cml4LCBGWEZJTExfV0lORElORyk7CisKKyAgQ0ZYX01hdHJpeCBtdEltYWdlKDEsIDAsIDAsIC0xLCAwLCAxKTsKKyAgbXRJbWFnZS5Db25jYXQoCisgICAgICBDRlhfTWF0cml4KHJ0Rml0LndpZHRoLCAwLCAwLCBydEZpdC5oZWlnaHQsIHJ0Rml0LmxlZnQsIHJ0Rml0LnRvcCkpOworICBtdEltYWdlLkNvbmNhdChtYXRyaXgpOworCisgIENYRkFfSW1hZ2VSZW5kZXJlciBpbWFnZVJlbmRlcihwUmVuZGVyRGV2aWNlLCBwRElCaXRtYXAsICZtdEltYWdlKTsKKyAgaWYgKCFpbWFnZVJlbmRlci5TdGFydCgpKSB7CisgICAgcmV0dXJuOworICB9CisgIHdoaWxlIChpbWFnZVJlbmRlci5Db250aW51ZSgpKQorICAgIGNvbnRpbnVlOworfQorCitSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBYRkFfTG9hZEltYWdlRnJvbUJ1ZmZlcigKKyAgICBjb25zdCBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBJbWFnZUZpbGVSZWFkLAorICAgIEZYQ09ERUNfSU1BR0VfVFlQRSB0eXBlLAorICAgIGludDMyX3QmIGlJbWFnZVhEcGksCisgICAgaW50MzJfdCYgaUltYWdlWURwaSkgeworICBDQ29kZWNfTW9kdWxlTWdyKiBwQ29kZWNNZ3IgPSBDUERGX01vZHVsZU1ncjo6R2V0KCktPkdldENvZGVjTW9kdWxlKCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDQ29kZWNfUHJvZ3Jlc3NpdmVEZWNvZGVyPiBwUHJvZ3Jlc3NpdmVEZWNvZGVyID0KKyAgICAgIHBDb2RlY01nci0+Q3JlYXRlUHJvZ3Jlc3NpdmVEZWNvZGVyKCk7CisKKyAgQ0ZYX0RJQkF0dHJpYnV0ZSBkaWJBdHRyOworICBwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5Mb2FkSW1hZ2VJbmZvKHBJbWFnZUZpbGVSZWFkLCB0eXBlLCAmZGliQXR0ciwgZmFsc2UpOworICBzd2l0Y2ggKGRpYkF0dHIubV93RFBJVW5pdCkgeworICAgIGNhc2UgRlhDT0RFQ19SRVNVTklUX0NFTlRJTUVURVI6CisgICAgICBkaWJBdHRyLm1fblhEUEkgPSAoaW50MzJfdCkoZGliQXR0ci5tX25YRFBJICogMi41NGYpOworICAgICAgZGliQXR0ci5tX25ZRFBJID0gKGludDMyX3QpKGRpYkF0dHIubV9uWURQSSAqIDIuNTRmKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhDT0RFQ19SRVNVTklUX01FVEVSOgorICAgICAgZGliQXR0ci5tX25YRFBJID0gKGludDMyX3QpKGRpYkF0dHIubV9uWERQSSAvIChmbG9hdCkxMDAgKiAyLjU0Zik7CisgICAgICBkaWJBdHRyLm1fbllEUEkgPSAoaW50MzJfdCkoZGliQXR0ci5tX25ZRFBJIC8gKGZsb2F0KTEwMCAqIDIuNTRmKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICBpSW1hZ2VYRHBpID0gZGliQXR0ci5tX25YRFBJID4gMSA/IGRpYkF0dHIubV9uWERQSSA6ICg5Nik7CisgIGlJbWFnZVlEcGkgPSBkaWJBdHRyLm1fbllEUEkgPiAxID8gZGliQXR0ci5tX25ZRFBJIDogKDk2KTsKKyAgaWYgKHBQcm9ncmVzc2l2ZURlY29kZXItPkdldFdpZHRoKCkgPD0gMCB8fAorICAgICAgcFByb2dyZXNzaXZlRGVjb2Rlci0+R2V0SGVpZ2h0KCkgPD0gMCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgdHlwZSA9IHBQcm9ncmVzc2l2ZURlY29kZXItPkdldFR5cGUoKTsKKyAgaW50MzJfdCBpQ29tcG9uZW50cyA9IHBQcm9ncmVzc2l2ZURlY29kZXItPkdldE51bUNvbXBvbmVudHMoKTsKKyAgaW50MzJfdCBpQnBjID0gcFByb2dyZXNzaXZlRGVjb2Rlci0+R2V0QlBDKCk7CisgIEZYRElCX0Zvcm1hdCBkaWJGb3JtYXQgPSBYRkFfR2V0RElCRm9ybWF0KHR5cGUsIGlDb21wb25lbnRzLCBpQnBjKTsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcEJpdG1hcCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfRElCaXRtYXA+KCk7CisgIHBCaXRtYXAtPkNyZWF0ZShwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5HZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgcFByb2dyZXNzaXZlRGVjb2Rlci0+R2V0SGVpZ2h0KCksIGRpYkZvcm1hdCk7CisgIHBCaXRtYXAtPkNsZWFyKDB4ZmZmZmZmZmYpOworCisgIHNpemVfdCBuRnJhbWVzOworICBGWENPREVDX1NUQVRVUyBzdGF0dXM7CisgIHN0ZDo6dGllKHN0YXR1cywgbkZyYW1lcykgPSBwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5HZXRGcmFtZXMoKTsKKyAgaWYgKHN0YXR1cyAhPSBGWENPREVDX1NUQVRVU19ERUNPREVfUkVBRFkgfHwgbkZyYW1lcyA9PSAwKSB7CisgICAgcEJpdG1hcCA9IG51bGxwdHI7CisgICAgcmV0dXJuIHBCaXRtYXA7CisgIH0KKworICBzdGF0dXMgPSBwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5TdGFydERlY29kZShwQml0bWFwLCAwLCAwLCBwQml0bWFwLT5HZXRXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQml0bWFwLT5HZXRIZWlnaHQoKSk7CisgIGlmIChJc0ZYQ29kZWNFcnJvclN0YXR1cyhzdGF0dXMpKSB7CisgICAgcEJpdG1hcCA9IG51bGxwdHI7CisgICAgcmV0dXJuIHBCaXRtYXA7CisgIH0KKworICB3aGlsZSAoc3RhdHVzID09IEZYQ09ERUNfU1RBVFVTX0RFQ09ERV9UT0JFQ09OVElOVUUpIHsKKyAgICBzdGF0dXMgPSBwUHJvZ3Jlc3NpdmVEZWNvZGVyLT5Db250aW51ZURlY29kZSgpOworICAgIGlmIChJc0ZYQ29kZWNFcnJvclN0YXR1cyhzdGF0dXMpKSB7CisgICAgICBwQml0bWFwID0gbnVsbHB0cjsKKyAgICAgIHJldHVybiBwQml0bWFwOworICAgIH0KKyAgfQorCisgIHJldHVybiBwQml0bWFwOworfQorCit2b2lkIFhGQV9SZWN0V2l0aG91dE1hcmdpbihDRlhfUmVjdEYmIHJ0LCBjb25zdCBDWEZBX01hcmdpbiogbWFyZ2luLCBib29sIGJVSSkgeworICBpZiAoIW1hcmdpbikKKyAgICByZXR1cm47CisKKyAgcnQuRGVmbGF0ZShtYXJnaW4tPkdldExlZnRJbnNldCgpLCBtYXJnaW4tPkdldFRvcEluc2V0KCksCisgICAgICAgICAgICAgbWFyZ2luLT5HZXRSaWdodEluc2V0KCksIG1hcmdpbi0+R2V0Qm90dG9tSW5zZXQoKSk7Cit9CisKK0NYRkFfRkZXaWRnZXQqIFhGQV9HZXRXaWRnZXRGcm9tTGF5b3V0SXRlbShDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtKSB7CisgIGlmIChwTGF5b3V0SXRlbS0+R2V0Rm9ybU5vZGUoKS0+SGFzQ3JlYXRlZFVJV2lkZ2V0KCkpCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRkZXaWRnZXQqPihwTGF5b3V0SXRlbSk7CisgIHJldHVybiBudWxscHRyOworfQorCitDWEZBX0NhbGNEYXRhOjpDWEZBX0NhbGNEYXRhKCkgOiBtX2lSZWZDb3VudCgwKSB7fQorCitDWEZBX0NhbGNEYXRhOjp+Q1hGQV9DYWxjRGF0YSgpIHt9CisKK0NYRkFfRkZXaWRnZXQ6OkNYRkFfRkZXaWRnZXQoQ1hGQV9Ob2RlKiBub2RlKQorICAgIDogQ1hGQV9Db250ZW50TGF5b3V0SXRlbShub2RlKSwgbV9wTm9kZShub2RlKSB7fQorCitDWEZBX0ZGV2lkZ2V0Ojp+Q1hGQV9GRldpZGdldCgpIHt9CisKK2NvbnN0IENGV0xfQXBwKiBDWEZBX0ZGV2lkZ2V0OjpHZXRGV0xBcHAoKSB7CisgIHJldHVybiBHZXRQYWdlVmlldygpLT5HZXREb2NWaWV3KCktPkdldERvYygpLT5HZXRBcHAoKS0+R2V0RldMQXBwKCk7Cit9CisKK2NvbnN0IENGWF9SZWN0RiYgQ1hGQV9GRldpZGdldDo6R2V0V2lkZ2V0UmVjdCgpIGNvbnN0IHsKKyAgaWYgKChtX2R3U3RhdHVzICYgWEZBX1dpZGdldFN0YXR1c19SZWN0Q2FjaGVkKSA9PSAwKQorICAgIFJlY2FjaGVXaWRnZXRSZWN0KCk7CisgIHJldHVybiBtX3J0V2lkZ2V0OworfQorCitjb25zdCBDRlhfUmVjdEYmIENYRkFfRkZXaWRnZXQ6OlJlY2FjaGVXaWRnZXRSZWN0KCkgY29uc3QgeworICBtX2R3U3RhdHVzIHw9IFhGQV9XaWRnZXRTdGF0dXNfUmVjdENhY2hlZDsKKyAgbV9ydFdpZGdldCA9IEdldFJlY3QoZmFsc2UpOworICByZXR1cm4gbV9ydFdpZGdldDsKK30KKworQ0ZYX1JlY3RGIENYRkFfRkZXaWRnZXQ6OkdldFJlY3RXaXRob3V0Um90YXRlKCkgeworICBDRlhfUmVjdEYgcnRXaWRnZXQgPSBHZXRXaWRnZXRSZWN0KCk7CisgIGZsb2F0IGZWYWx1ZSA9IDA7CisgIHN3aXRjaCAobV9wTm9kZS0+R2V0Um90YXRlKCkpIHsKKyAgICBjYXNlIDkwOgorICAgICAgcnRXaWRnZXQudG9wID0gcnRXaWRnZXQuYm90dG9tKCk7CisgICAgICBmVmFsdWUgPSBydFdpZGdldC53aWR0aDsKKyAgICAgIHJ0V2lkZ2V0LndpZHRoID0gcnRXaWRnZXQuaGVpZ2h0OworICAgICAgcnRXaWRnZXQuaGVpZ2h0ID0gZlZhbHVlOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxODA6CisgICAgICBydFdpZGdldC5sZWZ0ID0gcnRXaWRnZXQucmlnaHQoKTsKKyAgICAgIHJ0V2lkZ2V0LnRvcCA9IHJ0V2lkZ2V0LmJvdHRvbSgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyNzA6CisgICAgICBydFdpZGdldC5sZWZ0ID0gcnRXaWRnZXQucmlnaHQoKTsKKyAgICAgIGZWYWx1ZSA9IHJ0V2lkZ2V0LndpZHRoOworICAgICAgcnRXaWRnZXQud2lkdGggPSBydFdpZGdldC5oZWlnaHQ7CisgICAgICBydFdpZGdldC5oZWlnaHQgPSBmVmFsdWU7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcnRXaWRnZXQ7Cit9CisKK3VpbnQzMl90IENYRkFfRkZXaWRnZXQ6OkdldFN0YXR1cygpIHsKKyAgcmV0dXJuIG1fZHdTdGF0dXM7Cit9CisKK3ZvaWQgQ1hGQV9GRldpZGdldDo6TW9kaWZ5U3RhdHVzKHVpbnQzMl90IGR3QWRkZWQsIHVpbnQzMl90IGR3UmVtb3ZlZCkgeworICBtX2R3U3RhdHVzID0gKG1fZHdTdGF0dXMgJiB+ZHdSZW1vdmVkKSB8IGR3QWRkZWQ7Cit9CisKK0NGWF9SZWN0RiBDWEZBX0ZGV2lkZ2V0OjpHZXRCQm94KHVpbnQzMl90IGR3U3RhdHVzLCBib29sIGJEcmF3Rm9jdXMpIHsKKyAgaWYgKGJEcmF3Rm9jdXMgfHwgIW1fcFBhZ2VWaWV3KQorICAgIHJldHVybiBDRlhfUmVjdEYoKTsKKyAgcmV0dXJuIG1fcFBhZ2VWaWV3LT5HZXRQYWdlVmlld1JlY3QoKTsKK30KKwordm9pZCBDWEZBX0ZGV2lkZ2V0OjpSZW5kZXJXaWRnZXQoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGF0dXMpIHsKKyAgaWYgKCFJc01hdGNoVmlzaWJsZVN0YXR1cyhkd1N0YXR1cykpCisgICAgcmV0dXJuOworCisgIENYRkFfQm9yZGVyKiBib3JkZXIgPSBtX3BOb2RlLT5HZXRCb3JkZXJJZkV4aXN0cygpOworICBpZiAoIWJvcmRlcikKKyAgICByZXR1cm47CisKKyAgQ0ZYX1JlY3RGIHJ0Qm9yZGVyID0gR2V0UmVjdFdpdGhvdXRSb3RhdGUoKTsKKyAgQ1hGQV9NYXJnaW4qIG1hcmdpbiA9IGJvcmRlci0+R2V0TWFyZ2luSWZFeGlzdHMoKTsKKyAgaWYgKG1hcmdpbikKKyAgICBYRkFfUmVjdFdpdGhvdXRNYXJnaW4ocnRCb3JkZXIsIG1hcmdpbik7CisKKyAgcnRCb3JkZXIuTm9ybWFsaXplKCk7CisgIERyYXdCb3JkZXIocEdTLCBib3JkZXIsIHJ0Qm9yZGVyLCBtYXRyaXgpOworfQorCitib29sIENYRkFfRkZXaWRnZXQ6OklzTG9hZGVkKCkgeworICByZXR1cm4gISFtX3BQYWdlVmlldzsKK30KKworYm9vbCBDWEZBX0ZGV2lkZ2V0OjpMb2FkV2lkZ2V0KCkgeworICBQZXJmb3JtTGF5b3V0KCk7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENYRkFfRkZXaWRnZXQ6OlVubG9hZFdpZGdldCgpIHt9CisKK2Jvb2wgQ1hGQV9GRldpZGdldDo6UGVyZm9ybUxheW91dCgpIHsKKyAgUmVjYWNoZVdpZGdldFJlY3QoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1hGQV9GRldpZGdldDo6VXBkYXRlRldMRGF0YSgpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIENYRkFfRkZXaWRnZXQ6OlVwZGF0ZVdpZGdldFByb3BlcnR5KCkge30KKwordm9pZCBDWEZBX0ZGV2lkZ2V0OjpEcmF3Qm9yZGVyKENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0JveCogYm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRCb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7CisgIGlmIChib3gpCisgICAgYm94LT5EcmF3KHBHUywgcnRCb3JkZXIsIG1hdHJpeCwgZmFsc2UpOworfQorCit2b2lkIENYRkFfRkZXaWRnZXQ6OkRyYXdCb3JkZXJXaXRoRmxhZyhDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0JveCogYm94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEJvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VSb3VuZCkgeworICBpZiAoYm94KQorICAgIGJveC0+RHJhdyhwR1MsIHJ0Qm9yZGVyLCBtYXRyaXgsIGZvcmNlUm91bmQpOworfQorCit2b2lkIENYRkFfRkZXaWRnZXQ6OkFkZEludmFsaWRhdGVSZWN0KCkgeworICBDRlhfUmVjdEYgcnRXaWRnZXQgPSBHZXRCQm94KFhGQV9XaWRnZXRTdGF0dXNfRm9jdXNlZCk7CisgIHJ0V2lkZ2V0LkluZmxhdGUoMiwgMik7CisgIG1fcERvY1ZpZXctPkFkZEludmFsaWRhdGVSZWN0KG1fcFBhZ2VWaWV3LCBydFdpZGdldCk7Cit9CisKK2Jvb2wgQ1hGQV9GRldpZGdldDo6T25Nb3VzZUVudGVyKCkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1hGQV9GRldpZGdldDo6T25Nb3VzZUV4aXQoKSB7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDWEZBX0ZGV2lkZ2V0OjpPbkxCdXR0b25Eb3duKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDWEZBX0ZGV2lkZ2V0OjpPbkxCdXR0b25VcCh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1hGQV9GRldpZGdldDo6T25MQnV0dG9uRGJsQ2xrKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDWEZBX0ZGV2lkZ2V0OjpPbk1vdXNlTW92ZSh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1hGQV9GRldpZGdldDo6T25Nb3VzZVdoZWVsKHVpbnQzMl90IGR3RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHpEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDWEZBX0ZGV2lkZ2V0OjpPblJCdXR0b25Eb3duKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDWEZBX0ZGV2lkZ2V0OjpPblJCdXR0b25VcCh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1hGQV9GRldpZGdldDo6T25SQnV0dG9uRGJsQ2xrKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDWEZBX0ZGV2lkZ2V0OjpPblNldEZvY3VzKENYRkFfRkZXaWRnZXQqIHBPbGRXaWRnZXQpIHsKKyAgQ1hGQV9GRldpZGdldCogcFBhcmVudCA9IEdldFBhcmVudCgpOworICBpZiAocFBhcmVudCAmJiAhcFBhcmVudC0+SXNBbmNlc3Rvck9mKHBPbGRXaWRnZXQpKSB7CisgICAgcFBhcmVudC0+T25TZXRGb2N1cyhwT2xkV2lkZ2V0KTsKKyAgfQorICBtX2R3U3RhdHVzIHw9IFhGQV9XaWRnZXRTdGF0dXNfRm9jdXNlZDsKKyAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsKKyAgZVBhcmFtLm1fZVR5cGUgPSBYRkFfRVZFTlRfRW50ZXI7CisgIGVQYXJhbS5tX3BUYXJnZXQgPSBtX3BOb2RlLT5HZXRXaWRnZXRBY2MoKTsKKyAgbV9wTm9kZS0+UHJvY2Vzc0V2ZW50KEdldERvY1ZpZXcoKSwgWEZBX0F0dHJpYnV0ZUVudW06OkVudGVyLCAmZVBhcmFtKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1hGQV9GRldpZGdldDo6T25LaWxsRm9jdXMoQ1hGQV9GRldpZGdldCogcE5ld1dpZGdldCkgeworICBtX2R3U3RhdHVzICY9IH5YRkFfV2lkZ2V0U3RhdHVzX0ZvY3VzZWQ7CisgIEV2ZW50S2lsbEZvY3VzKCk7CisgIGlmIChwTmV3V2lkZ2V0KSB7CisgICAgQ1hGQV9GRldpZGdldCogcFBhcmVudCA9IEdldFBhcmVudCgpOworICAgIGlmIChwUGFyZW50ICYmICFwUGFyZW50LT5Jc0FuY2VzdG9yT2YocE5ld1dpZGdldCkpIHsKKyAgICAgIHBQYXJlbnQtPk9uS2lsbEZvY3VzKHBOZXdXaWRnZXQpOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDWEZBX0ZGV2lkZ2V0OjpPbktleURvd24odWludDMyX3QgZHdLZXlDb2RlLCB1aW50MzJfdCBkd0ZsYWdzKSB7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDWEZBX0ZGV2lkZ2V0OjpPbktleVVwKHVpbnQzMl90IGR3S2V5Q29kZSwgdWludDMyX3QgZHdGbGFncykgeworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1hGQV9GRldpZGdldDo6T25DaGFyKHVpbnQzMl90IGR3Q2hhciwgdWludDMyX3QgZHdGbGFncykgeworICByZXR1cm4gZmFsc2U7Cit9CisKK0ZXTF9XaWRnZXRIaXQgQ1hGQV9GRldpZGdldDo6T25IaXRUZXN0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIHJldHVybiBGV0xfV2lkZ2V0SGl0OjpVbmtub3duOworfQorCitib29sIENYRkFfRkZXaWRnZXQ6Ok9uU2V0Q3Vyc29yKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDWEZBX0ZGV2lkZ2V0OjpDYW5VbmRvKCkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1hGQV9GRldpZGdldDo6Q2FuUmVkbygpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENYRkFfRkZXaWRnZXQ6OlVuZG8oKSB7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDWEZBX0ZGV2lkZ2V0OjpSZWRvKCkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1hGQV9GRldpZGdldDo6Q2FuQ29weSgpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENYRkFfRkZXaWRnZXQ6OkNhbkN1dCgpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENYRkFfRkZXaWRnZXQ6OkNhblBhc3RlKCkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1hGQV9GRldpZGdldDo6Q2FuU2VsZWN0QWxsKCkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1hGQV9GRldpZGdldDo6Q2FuRGVsZXRlKCkgeworICByZXR1cm4gQ2FuQ3V0KCk7Cit9CisKK2Jvb2wgQ1hGQV9GRldpZGdldDo6Q2FuRGVTZWxlY3QoKSB7CisgIHJldHVybiBDYW5Db3B5KCk7Cit9CisKK09wdGlvbmFsPFdpZGVTdHJpbmc+IENYRkFfRkZXaWRnZXQ6OkNvcHkoKSB7CisgIHJldHVybiB7fTsKK30KKworT3B0aW9uYWw8V2lkZVN0cmluZz4gQ1hGQV9GRldpZGdldDo6Q3V0KCkgeworICByZXR1cm4ge307Cit9CisKK2Jvb2wgQ1hGQV9GRldpZGdldDo6UGFzdGUoY29uc3QgV2lkZVN0cmluZyYgd3NQYXN0ZSkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ1hGQV9GRldpZGdldDo6U2VsZWN0QWxsKCkge30KKwordm9pZCBDWEZBX0ZGV2lkZ2V0OjpEZWxldGUoKSB7fQorCit2b2lkIENYRkFfRkZXaWRnZXQ6OkRlU2VsZWN0KCkge30KKworRm9ybUZpZWxkVHlwZSBDWEZBX0ZGV2lkZ2V0OjpHZXRGb3JtRmllbGRUeXBlKCkgeworICByZXR1cm4gRm9ybUZpZWxkVHlwZTo6a1hGQTsKK30KKwordm9pZCBDWEZBX0ZGV2lkZ2V0OjpHZXRTdWdnZXN0V29yZHMoQ0ZYX1BvaW50RiBwb2ludGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxCeXRlU3RyaW5nPiogcFdvcmRzKSB7CisgIHBXb3Jkcy0+Y2xlYXIoKTsKK30KKworYm9vbCBDWEZBX0ZGV2lkZ2V0OjpSZXBsYWNlU3BlbGxDaGVja1dvcmQoQ0ZYX1BvaW50RiBwb2ludGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlU3RyaW5nVmlldyYgYnNSZXBsYWNlKSB7CisgIHJldHVybiBmYWxzZTsKK30KKworQ0ZYX1BvaW50RiBDWEZBX0ZGV2lkZ2V0OjpSb3RhdGUyTm9ybWFsKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIENGWF9NYXRyaXggbXQgPSBHZXRSb3RhdGVNYXRyaXgoKTsKKyAgaWYgKG10LklzSWRlbnRpdHkoKSkKKyAgICByZXR1cm4gcG9pbnQ7CisKKyAgcmV0dXJuIG10LkdldEludmVyc2UoKS5UcmFuc2Zvcm0ocG9pbnQpOworfQorCitDRlhfTWF0cml4IENYRkFfRkZXaWRnZXQ6OkdldFJvdGF0ZU1hdHJpeCgpIHsKKyAgaW50MzJfdCBpUm90YXRlID0gbV9wTm9kZS0+R2V0Um90YXRlKCk7CisgIGlmICghaVJvdGF0ZSkKKyAgICByZXR1cm4gQ0ZYX01hdHJpeCgpOworCisgIENGWF9SZWN0RiByY1dpZGdldCA9IEdldFJlY3RXaXRob3V0Um90YXRlKCk7CisgIENGWF9NYXRyaXggbXQ7CisgIHN3aXRjaCAoaVJvdGF0ZSkgeworICAgIGNhc2UgOTA6CisgICAgICBtdC5hID0gMDsKKyAgICAgIG10LmIgPSAtMTsKKyAgICAgIG10LmMgPSAxOworICAgICAgbXQuZCA9IDA7CisgICAgICBtdC5lID0gcmNXaWRnZXQubGVmdCAtIHJjV2lkZ2V0LnRvcDsKKyAgICAgIG10LmYgPSByY1dpZGdldC5sZWZ0ICsgcmNXaWRnZXQudG9wOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxODA6CisgICAgICBtdC5hID0gLTE7CisgICAgICBtdC5iID0gMDsKKyAgICAgIG10LmMgPSAwOworICAgICAgbXQuZCA9IC0xOworICAgICAgbXQuZSA9IHJjV2lkZ2V0LmxlZnQgKiAyOworICAgICAgbXQuZiA9IHJjV2lkZ2V0LnRvcCAqIDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI3MDoKKyAgICAgIG10LmEgPSAwOworICAgICAgbXQuYiA9IDE7CisgICAgICBtdC5jID0gLTE7CisgICAgICBtdC5kID0gMDsKKyAgICAgIG10LmUgPSByY1dpZGdldC5sZWZ0ICsgcmNXaWRnZXQudG9wOworICAgICAgbXQuZiA9IHJjV2lkZ2V0LnRvcCAtIHJjV2lkZ2V0LmxlZnQ7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gbXQ7Cit9CisKK2Jvb2wgQ1hGQV9GRldpZGdldDo6SXNMYXlvdXRSZWN0RW1wdHkoKSB7CisgIENGWF9SZWN0RiBydExheW91dCA9IEdldFJlY3RXaXRob3V0Um90YXRlKCk7CisgIHJldHVybiBydExheW91dC53aWR0aCA8IDAuMWYgJiYgcnRMYXlvdXQuaGVpZ2h0IDwgMC4xZjsKK30KKworQ1hGQV9GRldpZGdldCogQ1hGQV9GRldpZGdldDo6R2V0UGFyZW50KCkgeworICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gbV9wTm9kZS0+R2V0UGFyZW50KCk7CisgIGlmIChwUGFyZW50Tm9kZSkgeworICAgIENYRkFfV2lkZ2V0QWNjKiBwUGFyZW50V2lkZ2V0QWNjID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9XaWRnZXRBY2MqPihwUGFyZW50Tm9kZS0+R2V0V2lkZ2V0QWNjKCkpOworICAgIGlmIChwUGFyZW50V2lkZ2V0QWNjKSB7CisgICAgICBDWEZBX0xheW91dFByb2Nlc3NvciogbGF5b3V0ID0gR2V0RG9jVmlldygpLT5HZXRYRkFMYXlvdXQoKTsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4oCisgICAgICAgICAgbGF5b3V0LT5HZXRMYXlvdXRJdGVtKHBQYXJlbnRXaWRnZXRBY2MtPkdldE5vZGUoKSkpOworICAgIH0KKyAgfQorICByZXR1cm4gbnVsbHB0cjsKK30KKworYm9vbCBDWEZBX0ZGV2lkZ2V0OjpJc0FuY2VzdG9yT2YoQ1hGQV9GRldpZGdldCogcFdpZGdldCkgeworICBpZiAoIXBXaWRnZXQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENYRkFfTm9kZSogcENoaWxkTm9kZSA9IHBXaWRnZXQtPkdldE5vZGUoKTsKKyAgd2hpbGUgKHBDaGlsZE5vZGUpIHsKKyAgICBpZiAocENoaWxkTm9kZSA9PSBtX3BOb2RlKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0UGFyZW50KCk7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENYRkFfRkZXaWRnZXQ6OlB0SW5BY3RpdmVSZWN0KGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIHJldHVybiBHZXRXaWRnZXRSZWN0KCkuQ29udGFpbnMocG9pbnQpOworfQorCitDWEZBX0ZGRG9jVmlldyogQ1hGQV9GRldpZGdldDo6R2V0RG9jVmlldygpIHsKKyAgcmV0dXJuIG1fcERvY1ZpZXc7Cit9CisKK3ZvaWQgQ1hGQV9GRldpZGdldDo6U2V0RG9jVmlldyhDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcpIHsKKyAgbV9wRG9jVmlldyA9IHBEb2NWaWV3OworfQorCitDWEZBX0ZGRG9jKiBDWEZBX0ZGV2lkZ2V0OjpHZXREb2MoKSB7CisgIHJldHVybiBtX3BEb2NWaWV3LT5HZXREb2MoKTsKK30KKworQ1hGQV9GRkFwcCogQ1hGQV9GRldpZGdldDo6R2V0QXBwKCkgeworICByZXR1cm4gR2V0RG9jKCktPkdldEFwcCgpOworfQorCitJWEZBX0FwcFByb3ZpZGVyKiBDWEZBX0ZGV2lkZ2V0OjpHZXRBcHBQcm92aWRlcigpIHsKKyAgcmV0dXJuIEdldEFwcCgpLT5HZXRBcHBQcm92aWRlcigpOworfQorCitib29sIENYRkFfRkZXaWRnZXQ6OklzTWF0Y2hWaXNpYmxlU3RhdHVzKHVpbnQzMl90IGR3U3RhdHVzKSB7CisgIHJldHVybiAhIShtX2R3U3RhdHVzICYgWEZBX1dpZGdldFN0YXR1c19WaXNpYmxlKTsKK30KKwordm9pZCBDWEZBX0ZGV2lkZ2V0OjpFdmVudEtpbGxGb2N1cygpIHsKKyAgaWYgKG1fZHdTdGF0dXMgJiBYRkFfV2lkZ2V0U3RhdHVzX0FjY2VzcykgeworICAgIG1fZHdTdGF0dXMgJj0gflhGQV9XaWRnZXRTdGF0dXNfQWNjZXNzOworICAgIHJldHVybjsKKyAgfQorICBDWEZBX0V2ZW50UGFyYW0gZVBhcmFtOworICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9FeGl0OworICBlUGFyYW0ubV9wVGFyZ2V0ID0gbV9wTm9kZS0+R2V0V2lkZ2V0QWNjKCk7CisgIG1fcE5vZGUtPlByb2Nlc3NFdmVudChHZXREb2NWaWV3KCksIFhGQV9BdHRyaWJ1dGVFbnVtOjpFeGl0LCAmZVBhcmFtKTsKK30KKworYm9vbCBDWEZBX0ZGV2lkZ2V0OjpJc0J1dHRvbkRvd24oKSB7CisgIHJldHVybiAobV9kd1N0YXR1cyAmIFhGQV9XaWRnZXRTdGF0dXNfQnV0dG9uRG93bikgIT0gMDsKK30KKwordm9pZCBDWEZBX0ZGV2lkZ2V0OjpTZXRCdXR0b25Eb3duKGJvb2wgYlNldCkgeworICBiU2V0ID8gbV9kd1N0YXR1cyB8PSBYRkFfV2lkZ2V0U3RhdHVzX0J1dHRvbkRvd24KKyAgICAgICA6IG1fZHdTdGF0dXMgJj0gflhGQV9XaWRnZXRTdGF0dXNfQnV0dG9uRG93bjsKK30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfZmZ3aWRnZXQuaCBiL3hmYS9meGZhL2N4ZmFfZmZ3aWRnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGFhMTkxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9mZndpZGdldC5oCkBAIC0wLDAgKzEsMTcxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfQ1hGQV9GRldJREdFVF9IXworI2RlZmluZSBYRkFfRlhGQV9DWEZBX0ZGV0lER0VUX0hfCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZkb2MvY3BkZl9mb3JtZmllbGQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvZnhfY29kZWNfZGVmLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9ncmFwaHN0YXRlZGF0YS5oIgorI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9hcHAuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9meGZhLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29udGVudGxheW91dGl0ZW0uaCIKKworY2xhc3MgQ1hGQV9Cb3g7CitjbGFzcyBDWEZBX0ZGUGFnZVZpZXc7CitjbGFzcyBDWEZBX0ZGRG9jVmlldzsKK2NsYXNzIENYRkFfRkZEb2M7CitjbGFzcyBDWEZBX0ZGQXBwOworY2xhc3MgQ1hGQV9HcmFwaGljczsKK2NsYXNzIENYRkFfSW1hZ2U7CitlbnVtIGNsYXNzIEZXTF9XaWRnZXRIaXQ7CisKK2lubGluZSBmbG9hdCBYRkFfVW5pdFB4MlB0KGZsb2F0IGZQeCwgZmxvYXQgZkRwaSkgeworICByZXR1cm4gZlB4ICogNzIuMGYgLyBmRHBpOworfQorCisjZGVmaW5lIFhGQV9GTE9BVF9QRVJDSVNJT04gMC4wMDFmCisKK3ZvaWQgWEZBX0RyYXdJbWFnZShDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEltYWdlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcERJQml0bWFwLAorICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtIGlBc3BlY3QsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpSW1hZ2VYRHBpLAorICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUltYWdlWURwaSwKKyAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlRW51bSBpSG9yekFsaWduID0gWEZBX0F0dHJpYnV0ZUVudW06OkxlZnQsCisgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZUVudW0gaVZlcnRBbGlnbiA9IFhGQV9BdHRyaWJ1dGVFbnVtOjpUb3ApOworCitSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBYRkFfTG9hZEltYWdlRnJvbUJ1ZmZlcigKKyAgICBjb25zdCBSZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBJbWFnZUZpbGVSZWFkLAorICAgIEZYQ09ERUNfSU1BR0VfVFlQRSB0eXBlLAorICAgIGludDMyX3QmIGlJbWFnZVhEcGksCisgICAgaW50MzJfdCYgaUltYWdlWURwaSk7CisKK3ZvaWQgWEZBX1JlY3RXaXRob3V0TWFyZ2luKENGWF9SZWN0RiYgcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDWEZBX01hcmdpbiogbWFyZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVUkgPSBmYWxzZSk7CitDWEZBX0ZGV2lkZ2V0KiBYRkFfR2V0V2lkZ2V0RnJvbUxheW91dEl0ZW0oQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSk7CisKK2NsYXNzIENYRkFfQ2FsY0RhdGEgeworIHB1YmxpYzoKKyAgQ1hGQV9DYWxjRGF0YSgpOworICB+Q1hGQV9DYWxjRGF0YSgpOworCisgIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+IG1fR2xvYmFsczsKKyAgaW50MzJfdCBtX2lSZWZDb3VudDsKK307CisKK2NsYXNzIENYRkFfRkZXaWRnZXQgOiBwdWJsaWMgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSB7CisgcHVibGljOgorICBleHBsaWNpdCBDWEZBX0ZGV2lkZ2V0KENYRkFfTm9kZSogcE5vZGUpOworICB+Q1hGQV9GRldpZGdldCgpIG92ZXJyaWRlOworCisgIHZpcnR1YWwgQ0ZYX1JlY3RGIEdldEJCb3godWludDMyX3QgZHdTdGF0dXMsIGJvb2wgYkRyYXdGb2N1cyA9IGZhbHNlKTsKKyAgdmlydHVhbCB2b2lkIFJlbmRlcldpZGdldChDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhdHVzKTsKKyAgdmlydHVhbCBib29sIElzTG9hZGVkKCk7CisgIHZpcnR1YWwgYm9vbCBMb2FkV2lkZ2V0KCk7CisgIHZpcnR1YWwgdm9pZCBVbmxvYWRXaWRnZXQoKTsKKyAgdmlydHVhbCBib29sIFBlcmZvcm1MYXlvdXQoKTsKKyAgdmlydHVhbCBib29sIFVwZGF0ZUZXTERhdGEoKTsKKyAgdmlydHVhbCB2b2lkIFVwZGF0ZVdpZGdldFByb3BlcnR5KCk7CisgIHZpcnR1YWwgYm9vbCBPbk1vdXNlRW50ZXIoKTsKKyAgdmlydHVhbCBib29sIE9uTW91c2VFeGl0KCk7CisgIHZpcnR1YWwgYm9vbCBPbkxCdXR0b25Eb3duKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKKyAgdmlydHVhbCBib29sIE9uTEJ1dHRvblVwKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKKyAgdmlydHVhbCBib29sIE9uTEJ1dHRvbkRibENsayh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7CisgIHZpcnR1YWwgYm9vbCBPbk1vdXNlTW92ZSh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7CisgIHZpcnR1YWwgYm9vbCBPbk1vdXNlV2hlZWwodWludDMyX3QgZHdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHpEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7CisgIHZpcnR1YWwgYm9vbCBPblJCdXR0b25Eb3duKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKKyAgdmlydHVhbCBib29sIE9uUkJ1dHRvblVwKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKKyAgdmlydHVhbCBib29sIE9uUkJ1dHRvbkRibENsayh1aW50MzJfdCBkd0ZsYWdzLCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7CisKKyAgdmlydHVhbCBib29sIE9uU2V0Rm9jdXMoQ1hGQV9GRldpZGdldCogcE9sZFdpZGdldCk7CisgIHZpcnR1YWwgYm9vbCBPbktpbGxGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwTmV3V2lkZ2V0KTsKKyAgdmlydHVhbCBib29sIE9uS2V5RG93bih1aW50MzJfdCBkd0tleUNvZGUsIHVpbnQzMl90IGR3RmxhZ3MpOworICB2aXJ0dWFsIGJvb2wgT25LZXlVcCh1aW50MzJfdCBkd0tleUNvZGUsIHVpbnQzMl90IGR3RmxhZ3MpOworICB2aXJ0dWFsIGJvb2wgT25DaGFyKHVpbnQzMl90IGR3Q2hhciwgdWludDMyX3QgZHdGbGFncyk7CisgIHZpcnR1YWwgRldMX1dpZGdldEhpdCBPbkhpdFRlc3QoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOworICB2aXJ0dWFsIGJvb2wgT25TZXRDdXJzb3IoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOworICB2aXJ0dWFsIGJvb2wgQ2FuVW5kbygpOworICB2aXJ0dWFsIGJvb2wgQ2FuUmVkbygpOworICB2aXJ0dWFsIGJvb2wgVW5kbygpOworICB2aXJ0dWFsIGJvb2wgUmVkbygpOworICB2aXJ0dWFsIGJvb2wgQ2FuQ29weSgpOworICB2aXJ0dWFsIGJvb2wgQ2FuQ3V0KCk7CisgIHZpcnR1YWwgYm9vbCBDYW5QYXN0ZSgpOworICB2aXJ0dWFsIGJvb2wgQ2FuU2VsZWN0QWxsKCk7CisgIHZpcnR1YWwgYm9vbCBDYW5EZWxldGUoKTsKKyAgdmlydHVhbCBib29sIENhbkRlU2VsZWN0KCk7CisgIHZpcnR1YWwgT3B0aW9uYWw8V2lkZVN0cmluZz4gQ29weSgpOworICB2aXJ0dWFsIE9wdGlvbmFsPFdpZGVTdHJpbmc+IEN1dCgpOworICB2aXJ0dWFsIGJvb2wgUGFzdGUoY29uc3QgV2lkZVN0cmluZyYgd3NQYXN0ZSk7CisgIHZpcnR1YWwgdm9pZCBTZWxlY3RBbGwoKTsKKyAgdmlydHVhbCB2b2lkIERlbGV0ZSgpOworICB2aXJ0dWFsIHZvaWQgRGVTZWxlY3QoKTsKKworICB2aXJ0dWFsIEZvcm1GaWVsZFR5cGUgR2V0Rm9ybUZpZWxkVHlwZSgpOworCisgIC8vIFRPRE8odHNlcGV6KTogSW1wbGVtZW50IG9yIHJlbW92ZS4KKyAgdm9pZCBHZXRTdWdnZXN0V29yZHMoQ0ZYX1BvaW50RiBwb2ludGYsIHN0ZDo6dmVjdG9yPEJ5dGVTdHJpbmc+KiBwV29yZHMpOworICBib29sIFJlcGxhY2VTcGVsbENoZWNrV29yZChDRlhfUG9pbnRGIHBvaW50ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzUmVwbGFjZSk7CisKKyAgQ1hGQV9GRlBhZ2VWaWV3KiBHZXRQYWdlVmlldygpIGNvbnN0IHsgcmV0dXJuIG1fcFBhZ2VWaWV3OyB9CisgIHZvaWQgU2V0UGFnZVZpZXcoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcpIHsgbV9wUGFnZVZpZXcgPSBwUGFnZVZpZXc7IH0KKyAgY29uc3QgQ0ZYX1JlY3RGJiBHZXRXaWRnZXRSZWN0KCkgY29uc3Q7CisgIGNvbnN0IENGWF9SZWN0RiYgUmVjYWNoZVdpZGdldFJlY3QoKSBjb25zdDsKKyAgdWludDMyX3QgR2V0U3RhdHVzKCk7CisgIHZvaWQgTW9kaWZ5U3RhdHVzKHVpbnQzMl90IGR3QWRkZWQsIHVpbnQzMl90IGR3UmVtb3ZlZCk7CisKKyAgQ1hGQV9Ob2RlKiBHZXROb2RlKCkgeyByZXR1cm4gbV9wTm9kZS5HZXQoKTsgfQorCisgIENYRkFfRkZEb2NWaWV3KiBHZXREb2NWaWV3KCk7CisgIHZvaWQgU2V0RG9jVmlldyhDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcpOworICBDWEZBX0ZGRG9jKiBHZXREb2MoKTsKKyAgQ1hGQV9GRkFwcCogR2V0QXBwKCk7CisgIElYRkFfQXBwUHJvdmlkZXIqIEdldEFwcFByb3ZpZGVyKCk7CisgIHZvaWQgQWRkSW52YWxpZGF0ZVJlY3QoKTsKKyAgYm9vbCBJc0ZvY3VzZWQoKSBjb25zdCB7IHJldHVybiAhIShtX2R3U3RhdHVzICYgWEZBX1dpZGdldFN0YXR1c19Gb2N1c2VkKTsgfQorICBDRlhfUG9pbnRGIFJvdGF0ZTJOb3JtYWwoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOworICBDRlhfTWF0cml4IEdldFJvdGF0ZU1hdHJpeCgpOworICBib29sIElzTGF5b3V0UmVjdEVtcHR5KCk7CisgIENYRkFfRkZXaWRnZXQqIEdldFBhcmVudCgpOworICBib29sIElzQW5jZXN0b3JPZihDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0KTsKKyAgY29uc3QgQ0ZXTF9BcHAqIEdldEZXTEFwcCgpOworCisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIGJvb2wgUHRJbkFjdGl2ZVJlY3QoY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOworCisgIHZvaWQgRHJhd0JvcmRlcihDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICAgICAgICBDWEZBX0JveCogYm94LAorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEJvcmRlciwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCk7CisgIHZvaWQgRHJhd0JvcmRlcldpdGhGbGFnKENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Cb3gqIGJveCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEJvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlUm91bmQpOworCisgIENGWF9SZWN0RiBHZXRSZWN0V2l0aG91dFJvdGF0ZSgpOworICBib29sIElzTWF0Y2hWaXNpYmxlU3RhdHVzKHVpbnQzMl90IGR3U3RhdHVzKTsKKyAgdm9pZCBFdmVudEtpbGxGb2N1cygpOworICBib29sIElzQnV0dG9uRG93bigpOworICB2b2lkIFNldEJ1dHRvbkRvd24oYm9vbCBiU2V0KTsKKworICBDWEZBX0ZGRG9jVmlldyogbV9wRG9jVmlldyA9IG51bGxwdHI7CisgIENYRkFfRkZQYWdlVmlldyogbV9wUGFnZVZpZXcgPSBudWxscHRyOworICBVbm93bmVkUHRyPENYRkFfTm9kZT4gY29uc3QgbV9wTm9kZTsKKyAgbXV0YWJsZSBDRlhfUmVjdEYgbV9ydFdpZGdldDsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfQ1hGQV9GRldJREdFVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZndpZGdldGhhbmRsZXIuY3BwIGIveGZhL2Z4ZmEvY3hmYV9mZndpZGdldGhhbmRsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMjRjOTEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0aGFuZGxlci5jcHAKQEAgLTAsMCArMSw1NzYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZ3aWRnZXRoYW5kbGVyLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfb2JqZWN0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRvYy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZkb2N2aWV3LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmZpZWxkLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZndpZGdldC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZndsYWRhcHRlcndpZGdldG1nci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NhbGN1bGF0ZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NoZWNrYnV0dG9uLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0cHJvY2Vzc29yLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVhc3VyZW1lbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdWkuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWxpZGF0ZS5oIgorCitDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q1hGQV9GRldpZGdldEhhbmRsZXIoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3KQorICAgIDogbV9wRG9jVmlldyhwRG9jVmlldykge30KKworQ1hGQV9GRldpZGdldEhhbmRsZXI6On5DWEZBX0ZGV2lkZ2V0SGFuZGxlcigpIHt9CisKK2Jvb2wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uTW91c2VFbnRlcihDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0KSB7CisgIG1fcERvY1ZpZXctPkxvY2tVcGRhdGUoKTsKKyAgYm9vbCBiUmV0ID0gaFdpZGdldC0+T25Nb3VzZUVudGVyKCk7CisgIG1fcERvY1ZpZXctPlVubG9ja1VwZGF0ZSgpOworICBtX3BEb2NWaWV3LT5VcGRhdGVEb2NWaWV3KCk7CisgIHJldHVybiBiUmV0OworfQorCitib29sIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpPbk1vdXNlRXhpdChDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0KSB7CisgIG1fcERvY1ZpZXctPkxvY2tVcGRhdGUoKTsKKyAgYm9vbCBiUmV0ID0gaFdpZGdldC0+T25Nb3VzZUV4aXQoKTsKKyAgbV9wRG9jVmlldy0+VW5sb2NrVXBkYXRlKCk7CisgIG1fcERvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsKKyAgcmV0dXJuIGJSZXQ7Cit9CisKK2Jvb2wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uTEJ1dHRvbkRvd24oQ1hGQV9GRldpZGdldCogaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKKyAgbV9wRG9jVmlldy0+TG9ja1VwZGF0ZSgpOworICBib29sIGJSZXQgPSBoV2lkZ2V0LT5PbkxCdXR0b25Eb3duKGR3RmxhZ3MsIGhXaWRnZXQtPlJvdGF0ZTJOb3JtYWwocG9pbnQpKTsKKyAgaWYgKGJSZXQgJiYgbV9wRG9jVmlldy0+U2V0Rm9jdXMoaFdpZGdldCkpIHsKKyAgICBtX3BEb2NWaWV3LT5HZXREb2MoKS0+R2V0RG9jRW52aXJvbm1lbnQoKS0+U2V0Rm9jdXNXaWRnZXQoCisgICAgICAgIG1fcERvY1ZpZXctPkdldERvYygpLCBoV2lkZ2V0KTsKKyAgfQorICBtX3BEb2NWaWV3LT5VbmxvY2tVcGRhdGUoKTsKKyAgbV9wRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOworICByZXR1cm4gYlJldDsKK30KKworYm9vbCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25MQnV0dG9uVXAoQ1hGQV9GRldpZGdldCogaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICBtX3BEb2NWaWV3LT5Mb2NrVXBkYXRlKCk7CisgIG1fcERvY1ZpZXctPm1fYkxheW91dEV2ZW50ID0gdHJ1ZTsKKyAgYm9vbCBiUmV0ID0gaFdpZGdldC0+T25MQnV0dG9uVXAoZHdGbGFncywgaFdpZGdldC0+Um90YXRlMk5vcm1hbChwb2ludCkpOworICBtX3BEb2NWaWV3LT5VbmxvY2tVcGRhdGUoKTsKKyAgbV9wRG9jVmlldy0+VXBkYXRlRG9jVmlldygpOworICByZXR1cm4gYlJldDsKK30KKworYm9vbCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25MQnV0dG9uRGJsQ2xrKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICBib29sIGJSZXQgPSBoV2lkZ2V0LT5PbkxCdXR0b25EYmxDbGsoZHdGbGFncywgaFdpZGdldC0+Um90YXRlMk5vcm1hbChwb2ludCkpOworICBtX3BEb2NWaWV3LT5SdW5JbnZhbGlkYXRlKCk7CisgIHJldHVybiBiUmV0OworfQorCitib29sIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpPbk1vdXNlTW92ZShDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIGJvb2wgYlJldCA9IGhXaWRnZXQtPk9uTW91c2VNb3ZlKGR3RmxhZ3MsIGhXaWRnZXQtPlJvdGF0ZTJOb3JtYWwocG9pbnQpKTsKKyAgbV9wRG9jVmlldy0+UnVuSW52YWxpZGF0ZSgpOworICByZXR1cm4gYlJldDsKK30KKworYm9vbCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25Nb3VzZVdoZWVsKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHpEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICBib29sIGJSZXQgPQorICAgICAgaFdpZGdldC0+T25Nb3VzZVdoZWVsKGR3RmxhZ3MsIHpEZWx0YSwgaFdpZGdldC0+Um90YXRlMk5vcm1hbChwb2ludCkpOworICBtX3BEb2NWaWV3LT5SdW5JbnZhbGlkYXRlKCk7CisgIHJldHVybiBiUmV0OworfQorCitib29sIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpPblJCdXR0b25Eb3duKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIGJvb2wgYlJldCA9IGhXaWRnZXQtPk9uUkJ1dHRvbkRvd24oZHdGbGFncywgaFdpZGdldC0+Um90YXRlMk5vcm1hbChwb2ludCkpOworICBpZiAoYlJldCAmJiBtX3BEb2NWaWV3LT5TZXRGb2N1cyhoV2lkZ2V0KSkgeworICAgIG1fcERvY1ZpZXctPkdldERvYygpLT5HZXREb2NFbnZpcm9ubWVudCgpLT5TZXRGb2N1c1dpZGdldCgKKyAgICAgICAgbV9wRG9jVmlldy0+R2V0RG9jKCksIGhXaWRnZXQpOworICB9CisgIG1fcERvY1ZpZXctPlJ1bkludmFsaWRhdGUoKTsKKyAgcmV0dXJuIGJSZXQ7Cit9CisKK2Jvb2wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uUkJ1dHRvblVwKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKKyAgYm9vbCBiUmV0ID0gaFdpZGdldC0+T25SQnV0dG9uVXAoZHdGbGFncywgaFdpZGdldC0+Um90YXRlMk5vcm1hbChwb2ludCkpOworICBtX3BEb2NWaWV3LT5SdW5JbnZhbGlkYXRlKCk7CisgIHJldHVybiBiUmV0OworfQorCitib29sIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpPblJCdXR0b25EYmxDbGsoQ1hGQV9GRldpZGdldCogaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIGJvb2wgYlJldCA9IGhXaWRnZXQtPk9uUkJ1dHRvbkRibENsayhkd0ZsYWdzLCBoV2lkZ2V0LT5Sb3RhdGUyTm9ybWFsKHBvaW50KSk7CisgIG1fcERvY1ZpZXctPlJ1bkludmFsaWRhdGUoKTsKKyAgcmV0dXJuIGJSZXQ7Cit9CisKK2Jvb2wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uS2V5RG93bihDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3S2V5Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzKSB7CisgIGJvb2wgYlJldCA9IGhXaWRnZXQtPk9uS2V5RG93bihkd0tleUNvZGUsIGR3RmxhZ3MpOworICBtX3BEb2NWaWV3LT5SdW5JbnZhbGlkYXRlKCk7CisgIG1fcERvY1ZpZXctPlVwZGF0ZURvY1ZpZXcoKTsKKyAgcmV0dXJuIGJSZXQ7Cit9CisKK2Jvb2wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uS2V5VXAoQ1hGQV9GRldpZGdldCogaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdLZXlDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzKSB7CisgIGJvb2wgYlJldCA9IGhXaWRnZXQtPk9uS2V5VXAoZHdLZXlDb2RlLCBkd0ZsYWdzKTsKKyAgbV9wRG9jVmlldy0+UnVuSW52YWxpZGF0ZSgpOworICByZXR1cm4gYlJldDsKK30KKworYm9vbCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6T25DaGFyKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZ3MpIHsKKyAgYm9vbCBiUmV0ID0gaFdpZGdldC0+T25DaGFyKGR3Q2hhciwgZHdGbGFncyk7CisgIG1fcERvY1ZpZXctPlJ1bkludmFsaWRhdGUoKTsKKyAgcmV0dXJuIGJSZXQ7Cit9CisKK1dpZGVTdHJpbmcgQ1hGQV9GRldpZGdldEhhbmRsZXI6OkdldFNlbGVjdGVkVGV4dChDWEZBX0ZGV2lkZ2V0KiB3aWRnZXQpIHsKKyAgaWYgKCF3aWRnZXQtPkNhbkNvcHkoKSkKKyAgICByZXR1cm4gV2lkZVN0cmluZygpOworCisgIHJldHVybiB3aWRnZXQtPkNvcHkoKS52YWx1ZV9vcihXaWRlU3RyaW5nKCkpOworfQorCit2b2lkIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpQYXN0ZVRleHQoQ1hGQV9GRldpZGdldCogd2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHRleHQpIHsKKyAgaWYgKCF3aWRnZXQtPkNhblBhc3RlKCkpCisgICAgcmV0dXJuOworCisgIHdpZGdldC0+UGFzdGUodGV4dCk7Cit9CisKK0ZXTF9XaWRnZXRIaXQgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uSGl0VGVzdChDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIGlmICghKGhXaWRnZXQtPkdldFN0YXR1cygpICYgWEZBX1dpZGdldFN0YXR1c19WaXNpYmxlKSkKKyAgICByZXR1cm4gRldMX1dpZGdldEhpdDo6VW5rbm93bjsKKyAgcmV0dXJuIGhXaWRnZXQtPk9uSGl0VGVzdChoV2lkZ2V0LT5Sb3RhdGUyTm9ybWFsKHBvaW50KSk7Cit9CisKK2Jvb2wgQ1hGQV9GRldpZGdldEhhbmRsZXI6Ok9uU2V0Q3Vyc29yKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgeworICByZXR1cm4gaFdpZGdldC0+T25TZXRDdXJzb3IoaFdpZGdldC0+Um90YXRlMk5vcm1hbChwb2ludCkpOworfQorCit2b2lkIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpSZW5kZXJXaWRnZXQoQ1hGQV9GRldpZGdldCogaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkhpZ2hsaWdodCkgeworICBoV2lkZ2V0LT5SZW5kZXJXaWRnZXQocEdTLCBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICBiSGlnaGxpZ2h0ID8gWEZBX1dpZGdldFN0YXR1c19IaWdobGlnaHQgOiAwKTsKK30KKworYm9vbCBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6SGFzRXZlbnQoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUpIHsKKyAgaWYgKGVFdmVudFR5cGUgPT0gWEZBX0VWRU5UX1Vua25vd24pCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAoIXBXaWRnZXRBY2MpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENYRkFfTm9kZSogbm9kZSA9IHBXaWRnZXRBY2MtPkdldE5vZGUoKTsKKyAgaWYgKCFub2RlIHx8IG5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkRyYXcpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHN3aXRjaCAoZUV2ZW50VHlwZSkgeworICAgIGNhc2UgWEZBX0VWRU5UX0NhbGN1bGF0ZTogeworICAgICAgQ1hGQV9DYWxjdWxhdGUqIGNhbGMgPSBub2RlLT5HZXRDYWxjdWxhdGVJZkV4aXN0cygpOworICAgICAgcmV0dXJuIGNhbGMgJiYgY2FsYy0+R2V0U2NyaXB0SWZFeGlzdHMoKTsKKyAgICB9CisgICAgY2FzZSBYRkFfRVZFTlRfVmFsaWRhdGU6IHsKKyAgICAgIENYRkFfVmFsaWRhdGUqIHZhbGlkYXRlID0gbm9kZS0+R2V0VmFsaWRhdGVJZkV4aXN0cygpOworICAgICAgcmV0dXJuIHZhbGlkYXRlICYmIHZhbGlkYXRlLT5HZXRTY3JpcHRJZkV4aXN0cygpOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuICFwV2lkZ2V0QWNjLT5HZXRFdmVudEJ5QWN0aXZpdHkoZ3NfRXZlbnRBY3Rpdml0eVtlRXZlbnRUeXBlXSwgZmFsc2UpCisgICAgICAgICAgICAgIC5lbXB0eSgpOworfQorCitpbnQzMl90IENYRkFfRkZXaWRnZXRIYW5kbGVyOjpQcm9jZXNzRXZlbnQoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9FdmVudFBhcmFtKiBwUGFyYW0pIHsKKyAgaWYgKCFwUGFyYW0gfHwgcFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9Vbmtub3duKQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKKyAgaWYgKCFwV2lkZ2V0QWNjKQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKKworICBDWEZBX05vZGUqIG5vZGUgPSBwV2lkZ2V0QWNjLT5HZXROb2RlKCk7CisgIGlmICghbm9kZSB8fCBub2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpEcmF3KQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKKworICBzd2l0Y2ggKHBQYXJhbS0+bV9lVHlwZSkgeworICAgIGNhc2UgWEZBX0VWRU5UX0NhbGN1bGF0ZToKKyAgICAgIHJldHVybiBub2RlLT5Qcm9jZXNzQ2FsY3VsYXRlKG1fcERvY1ZpZXcpOworICAgIGNhc2UgWEZBX0VWRU5UX1ZhbGlkYXRlOgorICAgICAgaWYgKG1fcERvY1ZpZXctPkdldERvYygpLT5HZXREb2NFbnZpcm9ubWVudCgpLT5Jc1ZhbGlkYXRpb25zRW5hYmxlZCgKKyAgICAgICAgICAgICAgbV9wRG9jVmlldy0+R2V0RG9jKCkpKSB7CisgICAgICAgIHJldHVybiBub2RlLT5Qcm9jZXNzVmFsaWRhdGUobV9wRG9jVmlldywgMCk7CisgICAgICB9CisgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRGlzYWJsZWQ7CisgICAgY2FzZSBYRkFfRVZFTlRfSW5pdENhbGN1bGF0ZTogeworICAgICAgQ1hGQV9DYWxjdWxhdGUqIGNhbGMgPSBub2RlLT5HZXRDYWxjdWxhdGVJZkV4aXN0cygpOworICAgICAgaWYgKCFjYWxjKQorICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7CisgICAgICBpZiAobm9kZS0+SXNVc2VySW50ZXJhY3RpdmUoKSkKKyAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Rpc2FibGVkOworICAgICAgcmV0dXJuIG5vZGUtPkV4ZWN1dGVTY3JpcHQobV9wRG9jVmlldywgY2FsYy0+R2V0U2NyaXB0SWZFeGlzdHMoKSwgcFBhcmFtKTsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIGludDMyX3QgaVJldCA9CisgICAgICBub2RlLT5Qcm9jZXNzRXZlbnQobV9wRG9jVmlldywgZ3NfRXZlbnRBY3Rpdml0eVtwUGFyYW0tPm1fZVR5cGVdLCBwUGFyYW0pOworICByZXR1cm4gaVJldDsKK30KKworQ1hGQV9GRldpZGdldCogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZVdpZGdldChDWEZBX0ZGV2lkZ2V0KiBoUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfV0lER0VUVFlQRSBlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GRldpZGdldCogaEJlZm9yZSkgeworICBDWEZBX05vZGUqIHBQYXJlbnRGb3JtSXRlbSA9IGhQYXJlbnQgPyBoUGFyZW50LT5HZXROb2RlKCkgOiBudWxscHRyOworICBDWEZBX05vZGUqIHBCZWZvcmVGb3JtSXRlbSA9IGhCZWZvcmUgPyBoQmVmb3JlLT5HZXROb2RlKCkgOiBudWxscHRyOworICBDWEZBX05vZGUqIHBOZXdGb3JtSXRlbSA9CisgICAgICBDcmVhdGVXaWRnZXRGb3JtSXRlbShlVHlwZSwgcFBhcmVudEZvcm1JdGVtLCBwQmVmb3JlRm9ybUl0ZW0pOworICBpZiAoIXBOZXdGb3JtSXRlbSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBDWEZBX05vZGUqIHRlbXBsYXRlTm9kZSA9IHBOZXdGb3JtSXRlbS0+R2V0VGVtcGxhdGVOb2RlSWZFeGlzdHMoKTsKKyAgaWYgKCF0ZW1wbGF0ZU5vZGUpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgdGVtcGxhdGVOb2RlLT5TZXRGbGFnKFhGQV9Ob2RlRmxhZ19Jbml0aWFsaXplZCwgdHJ1ZSk7CisgIHBOZXdGb3JtSXRlbS0+U2V0RmxhZyhYRkFfTm9kZUZsYWdfSW5pdGlhbGl6ZWQsIHRydWUpOworICBtX3BEb2NWaWV3LT5SdW5MYXlvdXQoKTsKKyAgQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0ID0KKyAgICAgIG1fcERvY1ZpZXctPkdldFhGQUxheW91dCgpLT5HZXRMYXlvdXRJdGVtKHBOZXdGb3JtSXRlbSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4ocExheW91dCk7Cit9CisKK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZVdpZGdldEZvcm1JdGVtKAorICAgIFhGQV9XSURHRVRUWVBFIGVUeXBlLAorICAgIENYRkFfTm9kZSogcFBhcmVudCwKKyAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsKKyAgc3dpdGNoIChlVHlwZSkgeworICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfQmFyY29kZToKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfUHVzaEJ1dHRvbjoKKyAgICAgIHJldHVybiBDcmVhdGVQdXNoQnV0dG9uKHBQYXJlbnQsIHBCZWZvcmUpOworICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfQ2hlY2tCdXR0b246CisgICAgICByZXR1cm4gQ3JlYXRlQ2hlY2tCdXR0b24ocFBhcmVudCwgcEJlZm9yZSk7CisgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9FeGNsdWRlR3JvdXA6CisgICAgICByZXR1cm4gQ3JlYXRlRXhjbEdyb3VwKHBQYXJlbnQsIHBCZWZvcmUpOworICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfUmFkaW9CdXR0b246CisgICAgICByZXR1cm4gQ3JlYXRlUmFkaW9CdXR0b24ocFBhcmVudCwgcEJlZm9yZSk7CisgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9BcmM6CisgICAgICByZXR1cm4gQ3JlYXRlQXJjKHBQYXJlbnQsIHBCZWZvcmUpOworICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfUmVjdGFuZ2xlOgorICAgICAgcmV0dXJuIENyZWF0ZVJlY3RhbmdsZShwUGFyZW50LCBwQmVmb3JlKTsKKyAgICBjYXNlIFhGQV9XSURHRVRUWVBFX0ltYWdlOgorICAgICAgcmV0dXJuIENyZWF0ZUltYWdlKHBQYXJlbnQsIHBCZWZvcmUpOworICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfTGluZToKKyAgICAgIHJldHVybiBDcmVhdGVMaW5lKHBQYXJlbnQsIHBCZWZvcmUpOworICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfVGV4dDoKKyAgICAgIHJldHVybiBDcmVhdGVUZXh0KHBQYXJlbnQsIHBCZWZvcmUpOworICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfRGF0ZXRpbWVFZGl0OgorICAgICAgcmV0dXJuIENyZWF0ZURhdGV0aW1lRWRpdChwUGFyZW50LCBwQmVmb3JlKTsKKyAgICBjYXNlIFhGQV9XSURHRVRUWVBFX0RlY2ltYWxGaWVsZDoKKyAgICAgIHJldHVybiBDcmVhdGVEZWNpbWFsRmllbGQocFBhcmVudCwgcEJlZm9yZSk7CisgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9OdW1lcmljRmllbGQ6CisgICAgICByZXR1cm4gQ3JlYXRlTnVtZXJpY0ZpZWxkKHBQYXJlbnQsIHBCZWZvcmUpOworICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfU2lnbmF0dXJlOgorICAgICAgcmV0dXJuIENyZWF0ZVNpZ25hdHVyZShwUGFyZW50LCBwQmVmb3JlKTsKKyAgICBjYXNlIFhGQV9XSURHRVRUWVBFX1RleHRFZGl0OgorICAgICAgcmV0dXJuIENyZWF0ZVRleHRFZGl0KHBQYXJlbnQsIHBCZWZvcmUpOworICAgIGNhc2UgWEZBX1dJREdFVFRZUEVfRHJvcGRvd25MaXN0OgorICAgICAgcmV0dXJuIENyZWF0ZURyb3Bkb3duTGlzdChwUGFyZW50LCBwQmVmb3JlKTsKKyAgICBjYXNlIFhGQV9XSURHRVRUWVBFX0xpc3RCb3g6CisgICAgICByZXR1cm4gQ3JlYXRlTGlzdEJveChwUGFyZW50LCBwQmVmb3JlKTsKKyAgICBjYXNlIFhGQV9XSURHRVRUWVBFX0ltYWdlRmllbGQ6CisgICAgICByZXR1cm4gQ3JlYXRlSW1hZ2VGaWVsZChwUGFyZW50LCBwQmVmb3JlKTsKKyAgICBjYXNlIFhGQV9XSURHRVRUWVBFX1Bhc3N3b3JkRWRpdDoKKyAgICAgIHJldHVybiBDcmVhdGVQYXNzd29yZEVkaXQocFBhcmVudCwgcEJlZm9yZSk7CisgICAgY2FzZSBYRkFfV0lER0VUVFlQRV9TdWJmb3JtOgorICAgICAgcmV0dXJuIENyZWF0ZVN1YmZvcm0ocFBhcmVudCwgcEJlZm9yZSk7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBudWxscHRyOworICB9Cit9CisKK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZVB1c2hCdXR0b24oQ1hGQV9Ob2RlKiBwUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsKKyAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVGaWVsZChYRkFfRWxlbWVudDo6QnV0dG9uLCBwUGFyZW50LCBwQmVmb3JlKTsKKyAgQ1hGQV9Ob2RlKiBwQ2FwdGlvbiA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FbGVtZW50OjpDYXB0aW9uLCBwRmllbGQpOworICBDWEZBX05vZGUqIHBWYWx1ZSA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FbGVtZW50OjpWYWx1ZSwgcENhcHRpb24pOworICBDWEZBX05vZGUqIHBUZXh0ID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VsZW1lbnQ6OlRleHQsIHBWYWx1ZSk7CisgIHBUZXh0LT5KU09iamVjdCgpLT5TZXRDb250ZW50KEwiQnV0dG9uIiwgTCJCdXR0b24iLCBmYWxzZSwgZmFsc2UsIHRydWUpOworCisgIENYRkFfTm9kZSogcFBhcmEgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRWxlbWVudDo6UGFyYSwgcENhcHRpb24pOworICBwUGFyYS0+SlNPYmplY3QoKS0+U2V0RW51bShYRkFfQXR0cmlidXRlOjpWQWxpZ24sIFhGQV9BdHRyaWJ1dGVFbnVtOjpNaWRkbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgcFBhcmEtPkpTT2JqZWN0KCktPlNldEVudW0oWEZBX0F0dHJpYnV0ZTo6SEFsaWduLCBYRkFfQXR0cmlidXRlRW51bTo6Q2VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIENyZWF0ZUZvbnROb2RlKHBDYXB0aW9uKTsKKworICBDWEZBX05vZGUqIHBCb3JkZXIgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRWxlbWVudDo6Qm9yZGVyLCBwRmllbGQpOworICBwQm9yZGVyLT5KU09iamVjdCgpLT5TZXRFbnVtKFhGQV9BdHRyaWJ1dGU6OkhhbmQsIFhGQV9BdHRyaWJ1dGVFbnVtOjpSaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisKKyAgQ1hGQV9Ob2RlKiBwRWRnZSA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FbGVtZW50OjpFZGdlLCBwQm9yZGVyKTsKKyAgcEVkZ2UtPkpTT2JqZWN0KCktPlNldEVudW0oWEZBX0F0dHJpYnV0ZTo6U3Ryb2tlLCBYRkFfQXR0cmlidXRlRW51bTo6UmFpc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisKKyAgQ1hGQV9Ob2RlKiBwRmlsbCA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FbGVtZW50OjpGaWxsLCBwQm9yZGVyKTsKKyAgQ1hGQV9Ob2RlKiBwQ29sb3IgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRWxlbWVudDo6Q29sb3IsIHBGaWxsKTsKKyAgcENvbG9yLT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpWYWx1ZSwgTCIyMTIsIDIwOCwgMjAwIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworCisgIENYRkFfTm9kZSogcEJpbmQgPSBDcmVhdGVDb3B5Tm9kZShYRkFfRWxlbWVudDo6QmluZCwgcEZpZWxkKTsKKyAgcEJpbmQtPkpTT2JqZWN0KCktPlNldEVudW0oWEZBX0F0dHJpYnV0ZTo6TWF0Y2gsIFhGQV9BdHRyaWJ1dGVFbnVtOjpOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisKKyAgcmV0dXJuIHBGaWVsZDsKK30KKworQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlQ2hlY2tCdXR0b24oQ1hGQV9Ob2RlKiBwUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7CisgIHJldHVybiBDcmVhdGVGaWVsZChYRkFfRWxlbWVudDo6Q2hlY2tCdXR0b24sIHBQYXJlbnQsIHBCZWZvcmUpOworfQorCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVFeGNsR3JvdXAoQ1hGQV9Ob2RlKiBwUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QgeworICByZXR1cm4gQ3JlYXRlRm9ybUl0ZW0oWEZBX0VsZW1lbnQ6OkV4Y2xHcm91cCwgcFBhcmVudCwgcEJlZm9yZSk7Cit9CisKK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZVJhZGlvQnV0dG9uKENYRkFfTm9kZSogcFBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QgeworICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZUZpZWxkKFhGQV9FbGVtZW50OjpDaGVja0J1dHRvbiwgcFBhcmVudCwgcEJlZm9yZSk7CisgIENYRkFfVWkqIHBVaSA9IHBGaWVsZC0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9VaT4oWEZBX0VsZW1lbnQ6OlVpKTsKKyAgQ1hGQV9DaGVja0J1dHRvbiogcFdpZGdldCA9CisgICAgICBwVWktPkdldEZpcnN0Q2hpbGRCeUNsYXNzPENYRkFfQ2hlY2tCdXR0b24+KFhGQV9FbGVtZW50OjpDaGVja0J1dHRvbik7CisgIHBXaWRnZXQtPkpTT2JqZWN0KCktPlNldEVudW0oWEZBX0F0dHJpYnV0ZTo6U2hhcGUsIFhGQV9BdHRyaWJ1dGVFbnVtOjpSb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIHJldHVybiBwRmllbGQ7Cit9CisKK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZURhdGV0aW1lRWRpdChDWEZBX05vZGUqIHBQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7CisgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRmllbGQoWEZBX0VsZW1lbnQ6OkRhdGVUaW1lRWRpdCwgcFBhcmVudCwgcEJlZm9yZSk7CisgIENyZWF0ZVZhbHVlTm9kZShYRkFfRWxlbWVudDo6RGF0ZSwgcEZpZWxkKTsKKyAgcmV0dXJuIHBGaWVsZDsKK30KKworQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlRGVjaW1hbEZpZWxkKENYRkFfTm9kZSogcFBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsKKyAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVOdW1lcmljRmllbGQocFBhcmVudCwgcEJlZm9yZSk7CisgIENyZWF0ZVZhbHVlTm9kZShYRkFfRWxlbWVudDo6RGVjaW1hbCwgcEZpZWxkKTsKKyAgcmV0dXJuIHBGaWVsZDsKK30KKworQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlTnVtZXJpY0ZpZWxkKENYRkFfTm9kZSogcFBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsKKyAgcmV0dXJuIENyZWF0ZUZpZWxkKFhGQV9FbGVtZW50OjpOdW1lcmljRWRpdCwgcFBhcmVudCwgcEJlZm9yZSk7Cit9CisKK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZVNpZ25hdHVyZShDWEZBX05vZGUqIHBQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7CisgIHJldHVybiBDcmVhdGVGaWVsZChYRkFfRWxlbWVudDo6U2lnbmF0dXJlLCBwUGFyZW50LCBwQmVmb3JlKTsKK30KKworQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlVGV4dEVkaXQoQ1hGQV9Ob2RlKiBwUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7CisgIHJldHVybiBDcmVhdGVGaWVsZChYRkFfRWxlbWVudDo6VGV4dEVkaXQsIHBQYXJlbnQsIHBCZWZvcmUpOworfQorCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVEcm9wZG93bkxpc3QoQ1hGQV9Ob2RlKiBwUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QgeworICByZXR1cm4gQ3JlYXRlRmllbGQoWEZBX0VsZW1lbnQ6OkNob2ljZUxpc3QsIHBQYXJlbnQsIHBCZWZvcmUpOworfQorCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVMaXN0Qm94KENYRkFfTm9kZSogcFBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7CisgIENYRkFfTm9kZSogcEZpZWxkID0gQ3JlYXRlRHJvcGRvd25MaXN0KHBQYXJlbnQsIHBCZWZvcmUpOworICBDWEZBX05vZGUqIHBVaSA9IHBGaWVsZC0+R2V0Rmlyc3RDaGlsZCgpOworICBDWEZBX05vZGUqIHBMaXN0Qm94ID0gcFVpLT5HZXRGaXJzdENoaWxkKCk7CisgIHBMaXN0Qm94LT5KU09iamVjdCgpLT5TZXRFbnVtKFhGQV9BdHRyaWJ1dGU6Ok9wZW4sIFhGQV9BdHRyaWJ1dGVFbnVtOjpBbHdheXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgcExpc3RCb3gtPkpTT2JqZWN0KCktPlNldEVudW0oWEZBX0F0dHJpYnV0ZTo6Q29tbWl0T24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpFeGl0LCBmYWxzZSk7CisgIHJldHVybiBwRmllbGQ7Cit9CisKK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUltYWdlRmllbGQoQ1hGQV9Ob2RlKiBwUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsKKyAgcmV0dXJuIENyZWF0ZUZpZWxkKFhGQV9FbGVtZW50OjpJbWFnZUVkaXQsIHBQYXJlbnQsIHBCZWZvcmUpOworfQorCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVQYXNzd29yZEVkaXQoQ1hGQV9Ob2RlKiBwUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QgeworICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZUZpZWxkKFhGQV9FbGVtZW50OjpQYXNzd29yZEVkaXQsIHBQYXJlbnQsIHBCZWZvcmUpOworICBDWEZBX05vZGUqIHBCaW5kID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VsZW1lbnQ6OkJpbmQsIHBGaWVsZCk7CisgIHBCaW5kLT5KU09iamVjdCgpLT5TZXRFbnVtKFhGQV9BdHRyaWJ1dGU6Ok1hdGNoLCBYRkFfQXR0cmlidXRlRW51bTo6Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICByZXR1cm4gcEZpZWxkOworfQorCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVGaWVsZChYRkFfRWxlbWVudCBlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QgeworICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZUZvcm1JdGVtKFhGQV9FbGVtZW50OjpGaWVsZCwgcFBhcmVudCwgcEJlZm9yZSk7CisgIENyZWF0ZUNvcHlOb2RlKGVFbGVtZW50LCBDcmVhdGVDb3B5Tm9kZShYRkFfRWxlbWVudDo6VWksIHBGaWVsZCkpOworICBDcmVhdGVGb250Tm9kZShwRmllbGQpOworICByZXR1cm4gcEZpZWxkOworfQorCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVBcmMoQ1hGQV9Ob2RlKiBwUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QgeworICByZXR1cm4gQ3JlYXRlRHJhdyhYRkFfRWxlbWVudDo6QXJjLCBwUGFyZW50LCBwQmVmb3JlKTsKK30KKworQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlUmVjdGFuZ2xlKENYRkFfTm9kZSogcFBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsKKyAgcmV0dXJuIENyZWF0ZURyYXcoWEZBX0VsZW1lbnQ6OlJlY3RhbmdsZSwgcFBhcmVudCwgcEJlZm9yZSk7Cit9CisKK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUltYWdlKENYRkFfTm9kZSogcFBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QgeworICBDWEZBX05vZGUqIHBGaWVsZCA9IENyZWF0ZURyYXcoWEZBX0VsZW1lbnQ6OkltYWdlLCBwUGFyZW50LCBwQmVmb3JlKTsKKyAgQ3JlYXRlQ29weU5vZGUoWEZBX0VsZW1lbnQ6OkltYWdlRWRpdCwKKyAgICAgICAgICAgICAgICAgQ3JlYXRlQ29weU5vZGUoWEZBX0VsZW1lbnQ6OlVpLCBwRmllbGQpKTsKKyAgcmV0dXJuIHBGaWVsZDsKK30KKworQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlTGluZShDWEZBX05vZGUqIHBQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QgeworICByZXR1cm4gQ3JlYXRlRHJhdyhYRkFfRWxlbWVudDo6TGluZSwgcFBhcmVudCwgcEJlZm9yZSk7Cit9CisKK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZVRleHQoQ1hGQV9Ob2RlKiBwUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsKKyAgQ1hGQV9Ob2RlKiBwRmllbGQgPSBDcmVhdGVEcmF3KFhGQV9FbGVtZW50OjpUZXh0LCBwUGFyZW50LCBwQmVmb3JlKTsKKyAgQ3JlYXRlQ29weU5vZGUoWEZBX0VsZW1lbnQ6OlRleHRFZGl0LAorICAgICAgICAgICAgICAgICBDcmVhdGVDb3B5Tm9kZShYRkFfRWxlbWVudDo6VWksIHBGaWVsZCkpOworICBDcmVhdGVGb250Tm9kZShwRmllbGQpOworICByZXR1cm4gcEZpZWxkOworfQorCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVEcmF3KFhGQV9FbGVtZW50IGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QgeworICBDWEZBX05vZGUqIHBEcmF3ID0gQ3JlYXRlRm9ybUl0ZW0oWEZBX0VsZW1lbnQ6OkRyYXcsIHBQYXJlbnQsIHBCZWZvcmUpOworICBDcmVhdGVWYWx1ZU5vZGUoZUVsZW1lbnQsIHBEcmF3KTsKKyAgcmV0dXJuIHBEcmF3OworfQorCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVTdWJmb3JtKENYRkFfTm9kZSogcFBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7CisgIHJldHVybiBDcmVhdGVGb3JtSXRlbShYRkFfRWxlbWVudDo6U3ViZm9ybSwgcFBhcmVudCwgcEJlZm9yZSk7Cit9CisKK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUZvcm1JdGVtKFhGQV9FbGVtZW50IGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdCB7CisgIGlmICghcFBhcmVudCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBDWEZBX05vZGUqIHBUZW1wbGF0ZVBhcmVudCA9IHBQYXJlbnQtPkdldFRlbXBsYXRlTm9kZUlmRXhpc3RzKCk7CisgIGlmICghcFRlbXBsYXRlUGFyZW50KQorICAgIHJldHVybiBudWxscHRyOworCisgIENYRkFfTm9kZSogcE5ld0Zvcm1JdGVtID0gcFRlbXBsYXRlUGFyZW50LT5DbG9uZVRlbXBsYXRlVG9Gb3JtKGZhbHNlKTsKKyAgaWYgKHBQYXJlbnQpCisgICAgcFBhcmVudC0+SW5zZXJ0Q2hpbGQocE5ld0Zvcm1JdGVtLCBwQmVmb3JlKTsKKyAgcmV0dXJuIHBOZXdGb3JtSXRlbTsKK30KKworQ1hGQV9Ob2RlKiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6Q3JlYXRlQ29weU5vZGUoWEZBX0VsZW1lbnQgZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0IHsKKyAgaWYgKCFwUGFyZW50KQorICAgIHJldHVybiBudWxscHRyOworCisgIENYRkFfTm9kZSogcFRlbXBsYXRlUGFyZW50ID0gcFBhcmVudC0+R2V0VGVtcGxhdGVOb2RlSWZFeGlzdHMoKTsKKyAgQ1hGQV9Ob2RlKiBwTmV3Tm9kZSA9CisgICAgICBDcmVhdGVUZW1wbGF0ZU5vZGUoZUVsZW1lbnQsIHBUZW1wbGF0ZVBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQmVmb3JlID8gcEJlZm9yZS0+R2V0VGVtcGxhdGVOb2RlSWZFeGlzdHMoKSA6IG51bGxwdHIpCisgICAgICAgICAgLT5DbG9uZShmYWxzZSk7CisgIGlmIChwUGFyZW50KQorICAgIHBQYXJlbnQtPkluc2VydENoaWxkKHBOZXdOb2RlLCBwQmVmb3JlKTsKKyAgcmV0dXJuIHBOZXdOb2RlOworfQorCitDWEZBX05vZGUqIENYRkFfRkZXaWRnZXRIYW5kbGVyOjpDcmVhdGVUZW1wbGF0ZU5vZGUoWEZBX0VsZW1lbnQgZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3QgeworICBDWEZBX0RvY3VtZW50KiBwWEZBRG9jID0gR2V0WEZBRG9jKCk7CisgIENYRkFfTm9kZSogcE5ld1RlbXBsYXRlTm9kZSA9CisgICAgICBwWEZBRG9jLT5DcmVhdGVOb2RlKFhGQV9QYWNrZXRUeXBlOjpUZW1wbGF0ZSwgZUVsZW1lbnQpOworICBpZiAocFBhcmVudCkKKyAgICBwUGFyZW50LT5JbnNlcnRDaGlsZChwTmV3VGVtcGxhdGVOb2RlLCBwQmVmb3JlKTsKKyAgcmV0dXJuIHBOZXdUZW1wbGF0ZU5vZGU7Cit9CisKK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZUZvbnROb2RlKENYRkFfTm9kZSogcFBhcmVudCkgY29uc3QgeworICBDWEZBX05vZGUqIHBGb250ID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VsZW1lbnQ6OkZvbnQsIHBQYXJlbnQpOworICBwRm9udC0+SlNPYmplY3QoKS0+U2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6VHlwZWZhY2UsIEwiTXlyaWFkIFBybyIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICByZXR1cm4gcEZvbnQ7Cit9CisKK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZU1hcmdpbk5vZGUoQ1hGQV9Ob2RlKiBwUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmSW5zZXRzWzRdKSBjb25zdCB7CisgIENYRkFfTm9kZSogcE1hcmdpbiA9IENyZWF0ZUNvcHlOb2RlKFhGQV9FbGVtZW50OjpNYXJnaW4sIHBQYXJlbnQpOworICBpZiAoZHdGbGFncyAmIDB4MDEpCisgICAgcE1hcmdpbi0+SlNPYmplY3QoKS0+U2V0TWVhc3VyZShYRkFfQXR0cmlidXRlOjpMZWZ0SW5zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50KGZJbnNldHNbMF0sIFhGQV9Vbml0OjpQdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIGlmIChkd0ZsYWdzICYgMHgwMikKKyAgICBwTWFyZ2luLT5KU09iamVjdCgpLT5TZXRNZWFzdXJlKFhGQV9BdHRyaWJ1dGU6OlRvcEluc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9NZWFzdXJlbWVudChmSW5zZXRzWzFdLCBYRkFfVW5pdDo6UHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICBpZiAoZHdGbGFncyAmIDB4MDQpCisgICAgcE1hcmdpbi0+SlNPYmplY3QoKS0+U2V0TWVhc3VyZShYRkFfQXR0cmlidXRlOjpSaWdodEluc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9NZWFzdXJlbWVudChmSW5zZXRzWzJdLCBYRkFfVW5pdDo6UHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICBpZiAoZHdGbGFncyAmIDB4MDgpCisgICAgcE1hcmdpbi0+SlNPYmplY3QoKS0+U2V0TWVhc3VyZShYRkFfQXR0cmlidXRlOjpCb3R0b21JbnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTWVhc3VyZW1lbnQoZkluc2V0c1szXSwgWEZBX1VuaXQ6OlB0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgcmV0dXJuIHBNYXJnaW47Cit9CisKK0NYRkFfTm9kZSogQ1hGQV9GRldpZGdldEhhbmRsZXI6OkNyZWF0ZVZhbHVlTm9kZShYRkFfRWxlbWVudCBlVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50KSBjb25zdCB7CisgIENYRkFfTm9kZSogcFZhbHVlID0gQ3JlYXRlQ29weU5vZGUoWEZBX0VsZW1lbnQ6OlZhbHVlLCBwUGFyZW50KTsKKyAgQ3JlYXRlQ29weU5vZGUoZVZhbHVlLCBwVmFsdWUpOworICByZXR1cm4gcFZhbHVlOworfQorCitDWEZBX0RvY3VtZW50KiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6R2V0T2JqRmFjdG9yeSgpIGNvbnN0IHsKKyAgcmV0dXJuIEdldFhGQURvYygpOworfQorCitDWEZBX0RvY3VtZW50KiBDWEZBX0ZGV2lkZ2V0SGFuZGxlcjo6R2V0WEZBRG9jKCkgY29uc3QgeworICByZXR1cm4gbV9wRG9jVmlldy0+R2V0RG9jKCktPkdldFhGQURvYygpOworfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mZndpZGdldGhhbmRsZXIuaCBiL3hmYS9meGZhL2N4ZmFfZmZ3aWRnZXRoYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVmODg1NAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZmZ3aWRnZXRoYW5kbGVyLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9DWEZBX0ZGV0lER0VUSEFORExFUl9IXworI2RlZmluZSBYRkFfRlhGQV9DWEZBX0ZGV0lER0VUSEFORExFUl9IXworCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9ldmVudHBhcmFtLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvZnhmYS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCisKK2NsYXNzIENYRkFfRkZEb2NWaWV3OworY2xhc3MgQ1hGQV9HcmFwaGljczsKK2VudW0gY2xhc3MgRldMX1dpZGdldEhpdDsKKworY2xhc3MgQ1hGQV9GRldpZGdldEhhbmRsZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1hGQV9GRldpZGdldEhhbmRsZXIoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3KTsKKyAgfkNYRkFfRkZXaWRnZXRIYW5kbGVyKCk7CisKKyAgQ1hGQV9GRldpZGdldCogQ3JlYXRlV2lkZ2V0KENYRkFfRkZXaWRnZXQqIGhQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfV0lER0VUVFlQRSBlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRkZXaWRnZXQqIGhCZWZvcmUgPSBudWxscHRyKTsKKworICBib29sIE9uTW91c2VFbnRlcihDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0KTsKKyAgYm9vbCBPbk1vdXNlRXhpdChDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0KTsKKyAgYm9vbCBPbkxCdXR0b25Eb3duKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOworICBib29sIE9uTEJ1dHRvblVwKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFncywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7CisgIGJvb2wgT25MQnV0dG9uRGJsQ2xrKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKKyAgYm9vbCBPbk1vdXNlTW92ZShDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOworICBib29sIE9uTW91c2VXaGVlbChDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHpEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOworICBib29sIE9uUkJ1dHRvbkRvd24oQ1hGQV9GRldpZGdldCogaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7CisgIGJvb2wgT25SQnV0dG9uVXAoQ1hGQV9GRldpZGdldCogaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKKyAgYm9vbCBPblJCdXR0b25EYmxDbGsoQ1hGQV9GRldpZGdldCogaFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOworCisgIFdpZGVTdHJpbmcgR2V0U2VsZWN0ZWRUZXh0KENYRkFfRkZXaWRnZXQqIHdpZGdldCk7CisgIHZvaWQgUGFzdGVUZXh0KENYRkFfRkZXaWRnZXQqIHdpZGdldCwgY29uc3QgV2lkZVN0cmluZyYgdGV4dCk7CisKKyAgYm9vbCBPbktleURvd24oQ1hGQV9GRldpZGdldCogaFdpZGdldCwgdWludDMyX3QgZHdLZXlDb2RlLCB1aW50MzJfdCBkd0ZsYWdzKTsKKyAgYm9vbCBPbktleVVwKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsIHVpbnQzMl90IGR3S2V5Q29kZSwgdWludDMyX3QgZHdGbGFncyk7CisgIGJvb2wgT25DaGFyKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsIHVpbnQzMl90IGR3Q2hhciwgdWludDMyX3QgZHdGbGFncyk7CisgIEZXTF9XaWRnZXRIaXQgT25IaXRUZXN0KENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKKyAgYm9vbCBPblNldEN1cnNvcihDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0LCBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7CisgIHZvaWQgUmVuZGVyV2lkZ2V0KENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgIENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICBib29sIGJIaWdobGlnaHQpOworICBib29sIEhhc0V2ZW50KENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjLCBYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUpOworICBpbnQzMl90IFByb2Nlc3NFdmVudChDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYywgQ1hGQV9FdmVudFBhcmFtKiBwUGFyYW0pOworCisgcHJpdmF0ZToKKyAgQ1hGQV9Ob2RlKiBDcmVhdGVXaWRnZXRGb3JtSXRlbShYRkFfV0lER0VUVFlQRSBlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsKKworICBDWEZBX05vZGUqIENyZWF0ZVB1c2hCdXR0b24oQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0OworICBDWEZBX05vZGUqIENyZWF0ZUNoZWNrQnV0dG9uKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsKKyAgQ1hGQV9Ob2RlKiBDcmVhdGVFeGNsR3JvdXAoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0OworICBDWEZBX05vZGUqIENyZWF0ZVJhZGlvQnV0dG9uKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsKKyAgQ1hGQV9Ob2RlKiBDcmVhdGVEYXRldGltZUVkaXQoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0OworICBDWEZBX05vZGUqIENyZWF0ZURlY2ltYWxGaWVsZChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7CisgIENYRkFfTm9kZSogQ3JlYXRlTnVtZXJpY0ZpZWxkKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsKKyAgQ1hGQV9Ob2RlKiBDcmVhdGVTaWduYXR1cmUoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0OworICBDWEZBX05vZGUqIENyZWF0ZVRleHRFZGl0KENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsKKyAgQ1hGQV9Ob2RlKiBDcmVhdGVEcm9wZG93bkxpc3QoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0OworICBDWEZBX05vZGUqIENyZWF0ZUxpc3RCb3goQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0OworICBDWEZBX05vZGUqIENyZWF0ZUltYWdlRmllbGQoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0OworICBDWEZBX05vZGUqIENyZWF0ZVBhc3N3b3JkRWRpdChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7CisgIENYRkFfTm9kZSogQ3JlYXRlRmllbGQoWEZBX0VsZW1lbnQgZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7CisgIENYRkFfTm9kZSogQ3JlYXRlQXJjKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsKKyAgQ1hGQV9Ob2RlKiBDcmVhdGVSZWN0YW5nbGUoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0OworICBDWEZBX05vZGUqIENyZWF0ZUltYWdlKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsKKyAgQ1hGQV9Ob2RlKiBDcmVhdGVMaW5lKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsKKyAgQ1hGQV9Ob2RlKiBDcmVhdGVUZXh0KENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsKKyAgQ1hGQV9Ob2RlKiBDcmVhdGVEcmF3KFhGQV9FbGVtZW50IGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsKKworICBDWEZBX05vZGUqIENyZWF0ZVN1YmZvcm0oQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0OworICBDWEZBX05vZGUqIENyZWF0ZUZvcm1JdGVtKFhGQV9FbGVtZW50IGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0OworICBDWEZBX05vZGUqIENyZWF0ZUNvcHlOb2RlKFhGQV9FbGVtZW50IGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUgPSBudWxscHRyKSBjb25zdDsKKyAgQ1hGQV9Ob2RlKiBDcmVhdGVUZW1wbGF0ZU5vZGUoWEZBX0VsZW1lbnQgZUVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsKKyAgQ1hGQV9Ob2RlKiBDcmVhdGVGb250Tm9kZShDWEZBX05vZGUqIHBQYXJlbnQpIGNvbnN0OworICBDWEZBX05vZGUqIENyZWF0ZU1hcmdpbk5vZGUoQ1hGQV9Ob2RlKiBwUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZJbnNldHNbNF0pIGNvbnN0OworICBDWEZBX05vZGUqIENyZWF0ZVZhbHVlTm9kZShYRkFfRWxlbWVudCBlVmFsdWUsIENYRkFfTm9kZSogcFBhcmVudCkgY29uc3Q7CisgIENYRkFfRG9jdW1lbnQqIEdldE9iakZhY3RvcnkoKSBjb25zdDsKKyAgQ1hGQV9Eb2N1bWVudCogR2V0WEZBRG9jKCkgY29uc3Q7CisKKyAgQ1hGQV9GRkRvY1ZpZXcqIG1fcERvY1ZpZXc7Cit9OworCisjZW5kaWYgIC8vICBYRkFfRlhGQV9DWEZBX0ZGV0lER0VUSEFORExFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9mb250bWdyLmNwcCBiL3hmYS9meGZhL2N4ZmFfZm9udG1nci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk1NjgwNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZm9udG1nci5jcHAKQEAgLTAsMCArMSw3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mb250bWdyLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvZm9udC9jcGRmX2ZvbnQuaCIKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfZGljdGlvbmFyeS5oIgorI2luY2x1ZGUgImNvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9kb2N1bWVudC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ4ZmEvZmdhcy9mb250L2NmZ2FzX2dlZm9udC5oIgorI2luY2x1ZGUgInhmYS9mZ2FzL2ZvbnQvZmdhc19mb250dXRpbHMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmYXBwLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRvYy5oIgorCitDWEZBX0ZvbnRNZ3I6OkNYRkFfRm9udE1ncigpIHt9CisKK0NYRkFfRm9udE1ncjo6fkNYRkFfRm9udE1ncigpIHt9CisKK1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IENYRkFfRm9udE1ncjo6R2V0Rm9udCgKKyAgICBDWEZBX0ZGRG9jKiBoRG9jLAorICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c0ZvbnRGYW1pbHksCisgICAgdWludDMyX3QgZHdGb250U3R5bGVzKSB7CisgIHVpbnQzMl90IGR3SGFzaCA9IEZYX0hhc2hDb2RlX0dldFcod3NGb250RmFtaWx5LCBmYWxzZSk7CisgIEJ5dGVTdHJpbmcgYnNLZXkgPSBCeXRlU3RyaW5nOjpGb3JtYXQoIiV1JXUldSIsIGR3SGFzaCwgZHdGb250U3R5bGVzLCAweEZGRkYpOworICBhdXRvIGl0ZXIgPSBtX0ZvbnRNYXAuZmluZChic0tleSk7CisgIGlmIChpdGVyICE9IG1fRm9udE1hcC5lbmQoKSkKKyAgICByZXR1cm4gaXRlci0+c2Vjb25kOworCisgIFdpZGVTdHJpbmcgd3NFbmdsaXNoTmFtZSA9IEZHQVNfRm9udE5hbWVUb0VuZ2xpc2hOYW1lKHdzRm9udEZhbWlseSk7CisKKyAgQ0ZHQVNfUERGRm9udE1nciogcE1nciA9IGhEb2MtPkdldFBERkZvbnRNZ3IoKTsKKyAgQ1BERl9Gb250KiBwUERGRm9udCA9IG51bGxwdHI7CisgIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+IHBGb250OworICBpZiAocE1ncikgeworICAgIHBGb250ID0gcE1nci0+R2V0Rm9udCh3c0VuZ2xpc2hOYW1lLkFzU3RyaW5nVmlldygpLCBkd0ZvbnRTdHlsZXMsICZwUERGRm9udCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgaWYgKHBGb250KQorICAgICAgcmV0dXJuIHBGb250OworICB9CisgIGlmICghcEZvbnQgJiYgbV9wRGVmRm9udE1ncikKKyAgICBwRm9udCA9IG1fcERlZkZvbnRNZ3ItPkdldEZvbnQoaERvYy0+R2V0QXBwKCktPkdldEZERUZvbnRNZ3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NGb250RmFtaWx5LCBkd0ZvbnRTdHlsZXMpOworCisgIGlmICghcEZvbnQgJiYgcE1ncikgeworICAgIHBQREZGb250ID0gbnVsbHB0cjsKKyAgICBwRm9udCA9IHBNZ3ItPkdldEZvbnQod3NFbmdsaXNoTmFtZS5Bc1N0cmluZ1ZpZXcoKSwgZHdGb250U3R5bGVzLCAmcFBERkZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICBpZiAocEZvbnQpCisgICAgICByZXR1cm4gcEZvbnQ7CisgIH0KKyAgaWYgKCFwRm9udCAmJiBtX3BEZWZGb250TWdyKSB7CisgICAgcEZvbnQgPSBtX3BEZWZGb250TWdyLT5HZXREZWZhdWx0Rm9udChoRG9jLT5HZXRBcHAoKS0+R2V0RkRFRm9udE1ncigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NGb250RmFtaWx5LCBkd0ZvbnRTdHlsZXMpOworICB9CisKKyAgaWYgKHBGb250KSB7CisgICAgaWYgKHBQREZGb250KSB7CisgICAgICBwTWdyLT5TZXRGb250KHBGb250LCBwUERGRm9udCk7CisgICAgICBwRm9udC0+U2V0Rm9udFByb3ZpZGVyKHBNZ3IpOworICAgIH0KKyAgICBtX0ZvbnRNYXBbYnNLZXldID0gcEZvbnQ7CisgIH0KKyAgcmV0dXJuIHBGb250OworfQorCit2b2lkIENYRkFfRm9udE1ncjo6U2V0RGVmRm9udE1ncigKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZHQVNfRGVmYXVsdEZvbnRNYW5hZ2VyPiBwRm9udE1ncikgeworICBtX3BEZWZGb250TWdyID0gc3RkOjptb3ZlKHBGb250TWdyKTsKK30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfZm9udG1nci5oIGIveGZhL2Z4ZmEvY3hmYV9mb250bWdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk0MGZhZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZm9udG1nci5oCkBAIC0wLDAgKzEsMzkgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9DWEZBX0ZPTlRNR1JfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfQ1hGQV9GT05UTUdSX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJ4ZmEvZmdhcy9mb250L2NmZ2FzX2RlZmF1bHRmb250bWFuYWdlci5oIgorI2luY2x1ZGUgInhmYS9mZ2FzL2ZvbnQvY2ZnYXNfZm9udG1nci5oIgorI2luY2x1ZGUgInhmYS9mZ2FzL2ZvbnQvY2ZnYXNfcGRmZm9udG1nci5oIgorI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmEuaCIKKworY2xhc3MgQ1BERl9Gb250OworCitjbGFzcyBDWEZBX0ZvbnRNZ3IgeworIHB1YmxpYzoKKyAgQ1hGQV9Gb250TWdyKCk7CisgIH5DWEZBX0ZvbnRNZ3IoKTsKKworICBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBHZXRGb250KENYRkFfRkZEb2MqIGhEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzRm9udEZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZvbnRTdHlsZXMpOworICB2b2lkIFNldERlZkZvbnRNZ3Ioc3RkOjp1bmlxdWVfcHRyPENGR0FTX0RlZmF1bHRGb250TWFuYWdlcj4gcEZvbnRNZ3IpOworCisgcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPENGR0FTX0RlZmF1bHRGb250TWFuYWdlcj4gbV9wRGVmRm9udE1ncjsKKyAgc3RkOjptYXA8Qnl0ZVN0cmluZywgUmV0YWluUHRyPENGR0FTX0dFRm9udD4+IG1fRm9udE1hcDsKK307CisKKyNlbmRpZiAgLy8gIFhGQV9GWEZBX0NYRkFfRk9OVE1HUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9md2xhZGFwdGVyd2lkZ2V0bWdyLmNwcCBiL3hmYS9meGZhL2N4ZmFfZndsYWRhcHRlcndpZGdldG1nci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZkZDU1MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfZndsYWRhcHRlcndpZGdldG1nci5jcHAKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9md2xhZGFwdGVyd2lkZ2V0bWdyLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZG9jLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmZpZWxkLmgiCisKK0NYRkFfRldMQWRhcHRlcldpZGdldE1ncjo6Q1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyKCkge30KKworQ1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyOjp+Q1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyKCkge30KKwordm9pZCBDWEZBX0ZXTEFkYXB0ZXJXaWRnZXRNZ3I6OlJlcGFpbnRXaWRnZXQoQ0ZXTF9XaWRnZXQqIHBXaWRnZXQpIHsKKyAgaWYgKCFwV2lkZ2V0KQorICAgIHJldHVybjsKKworICBDWEZBX0ZGV2lkZ2V0KiBwRkZXaWRnZXQgPSBwV2lkZ2V0LT5HZXRMYXlvdXRJdGVtKCk7CisgIGlmICghcEZGV2lkZ2V0KQorICAgIHJldHVybjsKKworICBwRkZXaWRnZXQtPkFkZEludmFsaWRhdGVSZWN0KCk7Cit9CisKK2Jvb2wgQ1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyOjpHZXRQb3B1cFBvcyhDRldMX1dpZGdldCogcFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmTWluSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZNYXhIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEFuY2hvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0UG9wdXApIHsKKyAgQ1hGQV9GRldpZGdldCogcEZGV2lkZ2V0ID0gcFdpZGdldC0+R2V0TGF5b3V0SXRlbSgpOworICBDRlhfUmVjdEYgcnRSb3RhdGVBbmNob3IgPQorICAgICAgcEZGV2lkZ2V0LT5HZXRSb3RhdGVNYXRyaXgoKS5UcmFuc2Zvcm1SZWN0KHJ0QW5jaG9yKTsKKyAgcEZGV2lkZ2V0LT5HZXREb2MoKS0+R2V0RG9jRW52aXJvbm1lbnQoKS0+R2V0UG9wdXBQb3MoCisgICAgICBwRkZXaWRnZXQsIGZNaW5IZWlnaHQsIGZNYXhIZWlnaHQsIHJ0Um90YXRlQW5jaG9yLCBydFBvcHVwKTsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX2Z3bGFkYXB0ZXJ3aWRnZXRtZ3IuaCBiL3hmYS9meGZhL2N4ZmFfZndsYWRhcHRlcndpZGdldG1nci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YzRjZTEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2Z3bGFkYXB0ZXJ3aWRnZXRtZ3IuaApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfQ1hGQV9GV0xBREFQVEVSV0lER0VUTUdSX0hfCisjZGVmaW5lIFhGQV9GWEZBX0NYRkFfRldMQURBUFRFUldJREdFVE1HUl9IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisKK2NsYXNzIENGV0xfV2lkZ2V0OworCitjbGFzcyBDWEZBX0ZXTEFkYXB0ZXJXaWRnZXRNZ3IgeworIHB1YmxpYzoKKyAgQ1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyKCk7CisgIH5DWEZBX0ZXTEFkYXB0ZXJXaWRnZXRNZ3IoKTsKKworICB2b2lkIFJlcGFpbnRXaWRnZXQoQ0ZXTF9XaWRnZXQqIHBXaWRnZXQpOworICBib29sIEdldFBvcHVwUG9zKENGV0xfV2lkZ2V0KiBwV2lkZ2V0LAorICAgICAgICAgICAgICAgICAgIGZsb2F0IGZNaW5IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgZmxvYXQgZk1heEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0QW5jaG9yLAorICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiYgcnRQb3B1cCk7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX0NYRkFfRldMQURBUFRFUldJREdFVE1HUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9md2x0aGVtZS5jcHAgYi94ZmEvZnhmYS9jeGZhX2Z3bHRoZW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjA5NjgyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9md2x0aGVtZS5jcHAKQEAgLTAsMCArMSwyODIgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZndsdGhlbWUuaCIKKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29kZXBhZ2UuaCIKKyNpbmNsdWRlICJ4ZmEvZmRlL2NmZGVfdGV4dG91dC5oIgorI2luY2x1ZGUgInhmYS9mZ2FzL2ZvbnQvY2ZnYXNfZ2Vmb250LmgiCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX2JhcmNvZGUuaCIKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfY2FyZXQuaCIKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfY2hlY2tib3guaCIKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfY29tYm9ib3guaCIKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfZGF0ZXRpbWVwaWNrZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfZWRpdC5oIgorI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9saXN0Ym94LmgiCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX21vbnRoY2FsZW5kYXIuaCIKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfcGljdHVyZWJveC5oIgorI2luY2x1ZGUgInhmYS9md2wvY2Z3bF9wdXNoYnV0dG9uLmgiCisjaW5jbHVkZSAieGZhL2Z3bC9jZndsX3Njcm9sbGJhci5oIgorI2luY2x1ZGUgInhmYS9md2wvY2Z3bF90aGVtZWJhY2tncm91bmQuaCIKKyNpbmNsdWRlICJ4ZmEvZndsL2Nmd2xfdGhlbWV0ZXh0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmFwcC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZ3aWRnZXQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYXJhLmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZWNvbG9yLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IHdjaGFyX3QqIGNvbnN0IGdfRldMVGhlbWVfQ2FsRm9udHNbXSA9IHsKKyAgICBMIkFyaWFsIiwgTCJDb3VyaWVyIE5ldyIsIEwiRGVqYVZ1IFNhbnMiLAorfTsKKworY29uc3QgZmxvYXQga0xpbmVIZWlnaHQgPSAxMi4wZjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRkZXaWRnZXQqIFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KENGV0xfV2lkZ2V0KiBwV2lkZ2V0KSB7CisgIENGV0xfV2lkZ2V0KiBwT3V0ZXIgPSBwV2lkZ2V0OworICB3aGlsZSAocE91dGVyICYmIHBPdXRlci0+R2V0T3V0ZXIoKSkKKyAgICBwT3V0ZXIgPSBwT3V0ZXItPkdldE91dGVyKCk7CisgIHJldHVybiBwT3V0ZXIgPyBwT3V0ZXItPkdldExheW91dEl0ZW0oKSA6IG51bGxwdHI7Cit9CisKK0NYRkFfRldMVGhlbWU6OkNYRkFfRldMVGhlbWUoQ1hGQV9GRkFwcCogcEFwcCkKKyAgICA6IG1fcENoZWNrQm94VFAocGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfQ2hlY2tCb3hUUD4oKSksCisgICAgICBtX3BMaXN0Qm94VFAocGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfTGlzdEJveFRQPigpKSwKKyAgICAgIG1fcFBpY3R1cmVCb3hUUChwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZXTF9QaWN0dXJlQm94VFA+KCkpLAorICAgICAgbV9wU3JvbGxCYXJUUChwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZXTF9TY3JvbGxCYXJUUD4oKSksCisgICAgICBtX3BFZGl0VFAocGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfRWRpdFRQPigpKSwKKyAgICAgIG1fcENvbWJvQm94VFAocGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfQ29tYm9Cb3hUUD4oKSksCisgICAgICBtX3BNb250aENhbGVuZGFyVFAocGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfTW9udGhDYWxlbmRhclRQPigpKSwKKyAgICAgIG1fcERhdGVUaW1lUGlja2VyVFAocGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfRGF0ZVRpbWVQaWNrZXJUUD4oKSksCisgICAgICBtX3BQdXNoQnV0dG9uVFAocGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfUHVzaEJ1dHRvblRQPigpKSwKKyAgICAgIG1fcENhcmV0VFAocGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfQ2FyZXRUUD4oKSksCisgICAgICBtX3BCYXJjb2RlVFAocGRmaXVtOjpNYWtlVW5pcXVlPENGV0xfQmFyY29kZVRQPigpKSwKKyAgICAgIG1fcFRleHRPdXQocGRmaXVtOjpNYWtlVW5pcXVlPENGREVfVGV4dE91dD4oKSksCisgICAgICBtX3BDYWxlbmRhckZvbnQobnVsbHB0ciksCisgICAgICBtX3BBcHAocEFwcCkgeworICBtX1JlY3QuUmVzZXQoKTsKKworICBmb3IgKHNpemVfdCBpID0gMDsgIW1fcENhbGVuZGFyRm9udCAmJiBpIDwgRlhfQXJyYXlTaXplKGdfRldMVGhlbWVfQ2FsRm9udHMpOworICAgICAgICsraSkgeworICAgIG1fcENhbGVuZGFyRm9udCA9IENGR0FTX0dFRm9udDo6TG9hZEZvbnQoZ19GV0xUaGVtZV9DYWxGb250c1tpXSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEFwcC0+R2V0RkRFRm9udE1ncigpKTsKKyAgfQorICBpZiAoIW1fcENhbGVuZGFyRm9udCkgeworICAgIG1fcENhbGVuZGFyRm9udCA9IG1fcEFwcC0+R2V0RkRFRm9udE1ncigpLT5HZXRGb250QnlDb2RlUGFnZSgKKyAgICAgICAgRlhfQ09ERVBBR0VfTVNXaW5fV2VzdGVybkV1cm9wZWFuLCAwLCBudWxscHRyKTsKKyAgfQorCisgIEFTU0VSVChtX3BDYWxlbmRhckZvbnQpOworfQorCitDWEZBX0ZXTFRoZW1lOjp+Q1hGQV9GV0xUaGVtZSgpIHsKKyAgbV9wVGV4dE91dC5yZXNldCgpOworICBGV0xUSEVNRV9SZWxlYXNlKCk7Cit9CisKK3ZvaWQgQ1hGQV9GV0xUaGVtZTo6RHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpIHsKKyAgR2V0VGhlbWUocFBhcmFtcy0+bV9wV2lkZ2V0KS0+RHJhd0JhY2tncm91bmQocFBhcmFtcyk7Cit9CisKK3ZvaWQgQ1hGQV9GV0xUaGVtZTo6RHJhd1RleHQoQ0ZXTF9UaGVtZVRleHQqIHBQYXJhbXMpIHsKKyAgaWYgKHBQYXJhbXMtPm1fd3NUZXh0LklzRW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgaWYgKHBQYXJhbXMtPm1fcFdpZGdldC0+R2V0Q2xhc3NJRCgpID09IEZXTF9UeXBlOjpNb250aENhbGVuZGFyKSB7CisgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBQYXJhbXMtPm1fcFdpZGdldCk7CisgICAgaWYgKCFwV2lkZ2V0KQorICAgICAgcmV0dXJuOworCisgICAgbV9wVGV4dE91dC0+U2V0U3R5bGVzKHBQYXJhbXMtPm1fZHdUVE9TdHlsZXMpOworICAgIG1fcFRleHRPdXQtPlNldEFsaWdubWVudChwUGFyYW1zLT5tX2lUVE9BbGlnbik7CisgICAgbV9wVGV4dE91dC0+U2V0Rm9udChtX3BDYWxlbmRhckZvbnQpOworICAgIG1fcFRleHRPdXQtPlNldEZvbnRTaXplKEZXTFRIRU1FX0NBUEFDSVRZX0ZvbnRTaXplKTsKKyAgICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IoRldMVEhFTUVfQ0FQQUNJVFlfVGV4dENvbG9yKTsKKyAgICBpZiAoKHBQYXJhbXMtPm1faVBhcnQgPT0gQ0ZXTF9QYXJ0OjpEYXRlc0luKSAmJgorICAgICAgICAhKHBQYXJhbXMtPm1fZHdTdGF0ZXMgJiBGV0xfSVRFTVNUQVRFX01DRF9GbGFnKSAmJgorICAgICAgICAocFBhcmFtcy0+bV9kd1N0YXRlcyAmCisgICAgICAgICAoQ0ZXTF9QYXJ0U3RhdGVfSG92ZXJlZCB8IENGV0xfUGFydFN0YXRlX1NlbGVjdGVkKSkpIHsKKyAgICAgIG1fcFRleHRPdXQtPlNldFRleHRDb2xvcigweEZGRkZGRkZGKTsKKyAgICB9CisgICAgaWYgKHBQYXJhbXMtPm1faVBhcnQgPT0gQ0ZXTF9QYXJ0OjpDYXB0aW9uKQorICAgICAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKEFyZ2JFbmNvZGUoMHhmZiwgMCwgMTUzLCAyNTUpKTsKKworICAgIENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcyA9IHBQYXJhbXMtPm1fcEdyYXBoaWNzOworICAgIENGWF9SZW5kZXJEZXZpY2UqIHBSZW5kZXJEZXZpY2UgPSBwR3JhcGhpY3MtPkdldFJlbmRlckRldmljZSgpOworICAgIGlmICghcFJlbmRlckRldmljZSkKKyAgICAgIHJldHVybjsKKworICAgIENGWF9NYXRyaXggbXRQYXJ0ID0gcFBhcmFtcy0+bV9tYXRyaXg7CisgICAgY29uc3QgQ0ZYX01hdHJpeCogcE1hdHJpeCA9IHBHcmFwaGljcy0+R2V0TWF0cml4KCk7CisgICAgaWYgKHBNYXRyaXgpCisgICAgICBtdFBhcnQuQ29uY2F0KCpwTWF0cml4KTsKKworICAgIG1fcFRleHRPdXQtPlNldE1hdHJpeChtdFBhcnQpOworICAgIG1fcFRleHRPdXQtPkRyYXdMb2dpY1RleHQocFJlbmRlckRldmljZSwgcFBhcmFtcy0+bV93c1RleHQuQXNTdHJpbmdWaWV3KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3J0UGFydCk7CisgICAgcmV0dXJuOworICB9CisgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBYRkFfVGhlbWVHZXRPdXRlcldpZGdldChwUGFyYW1zLT5tX3BXaWRnZXQpOworICBpZiAoIXBXaWRnZXQpCisgICAgcmV0dXJuOworCisgIENYRkFfTm9kZSogcE5vZGUgPSBwV2lkZ2V0LT5HZXROb2RlKCk7CisgIENYRkFfR3JhcGhpY3MqIHBHcmFwaGljcyA9IHBQYXJhbXMtPm1fcEdyYXBoaWNzOworICBDRlhfUmVuZGVyRGV2aWNlKiBwUmVuZGVyRGV2aWNlID0gcEdyYXBoaWNzLT5HZXRSZW5kZXJEZXZpY2UoKTsKKyAgaWYgKCFwUmVuZGVyRGV2aWNlKQorICAgIHJldHVybjsKKworICBtX3BUZXh0T3V0LT5TZXRTdHlsZXMocFBhcmFtcy0+bV9kd1RUT1N0eWxlcyk7CisgIG1fcFRleHRPdXQtPlNldEFsaWdubWVudChwUGFyYW1zLT5tX2lUVE9BbGlnbik7CisgIG1fcFRleHRPdXQtPlNldEZvbnQocE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRGREVGb250KHBXaWRnZXQtPkdldERvYygpKSk7CisgIG1fcFRleHRPdXQtPlNldEZvbnRTaXplKHBOb2RlLT5HZXRGb250U2l6ZSgpKTsKKyAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKHBOb2RlLT5HZXRUZXh0Q29sb3IoKSk7CisgIENGWF9NYXRyaXggbXRQYXJ0ID0gcFBhcmFtcy0+bV9tYXRyaXg7CisgIGNvbnN0IENGWF9NYXRyaXgqIHBNYXRyaXggPSBwR3JhcGhpY3MtPkdldE1hdHJpeCgpOworICBpZiAocE1hdHJpeCkKKyAgICBtdFBhcnQuQ29uY2F0KCpwTWF0cml4KTsKKworICBtX3BUZXh0T3V0LT5TZXRNYXRyaXgobXRQYXJ0KTsKKyAgbV9wVGV4dE91dC0+RHJhd0xvZ2ljVGV4dChwUmVuZGVyRGV2aWNlLCBwUGFyYW1zLT5tX3dzVGV4dC5Bc1N0cmluZ1ZpZXcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zLT5tX3J0UGFydCk7Cit9CisKK0NGWF9SZWN0RiBDWEZBX0ZXTFRoZW1lOjpHZXRVSU1hcmdpbihDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCkgY29uc3QgeworICBDRlhfUmVjdEYgcmVjdDsKKyAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBUaGVtZVBhcnQtPm1fcFdpZGdldCk7CisgIGlmICghcFdpZGdldCkKKyAgICByZXR1cm4gcmVjdDsKKworICBDWEZBX0xheW91dEl0ZW0qIHBJdGVtID0gcFdpZGdldDsKKyAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MgPSBwV2lkZ2V0LT5HZXROb2RlKCktPkdldFdpZGdldEFjYygpOworICByZWN0ID0gcFdpZGdldEFjYy0+R2V0VUlNYXJnaW4oKTsKKyAgQ1hGQV9QYXJhKiBwYXJhID0gcFdpZGdldEFjYy0+R2V0Tm9kZSgpLT5HZXRQYXJhSWZFeGlzdHMoKTsKKyAgaWYgKHBhcmEpIHsKKyAgICByZWN0LmxlZnQgKz0gcGFyYS0+R2V0TWFyZ2luTGVmdCgpOworICAgIGlmIChwV2lkZ2V0QWNjLT5Jc011bHRpTGluZSgpKQorICAgICAgcmVjdC53aWR0aCArPSBwYXJhLT5HZXRNYXJnaW5SaWdodCgpOworICB9CisgIGlmICghcEl0ZW0tPkdldFByZXYoKSkgeworICAgIGlmIChwSXRlbS0+R2V0TmV4dCgpKQorICAgICAgcmVjdC5oZWlnaHQgPSAwOworICB9IGVsc2UgaWYgKCFwSXRlbS0+R2V0TmV4dCgpKSB7CisgICAgcmVjdC50b3AgPSAwOworICB9IGVsc2UgeworICAgIHJlY3QudG9wID0gMDsKKyAgICByZWN0LmhlaWdodCA9IDA7CisgIH0KKyAgcmV0dXJuIHJlY3Q7Cit9CisKK2Zsb2F0IENYRkFfRldMVGhlbWU6OkdldENYQm9yZGVyU2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIDEuMGY7Cit9CisKK2Zsb2F0IENYRkFfRldMVGhlbWU6OkdldENZQm9yZGVyU2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIDEuMGY7Cit9CisKK2Zsb2F0IENYRkFfRldMVGhlbWU6OkdldEZvbnRTaXplKENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0KSBjb25zdCB7CisgIGlmIChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQocFRoZW1lUGFydC0+bV9wV2lkZ2V0KSkKKyAgICByZXR1cm4gcFdpZGdldC0+R2V0Tm9kZSgpLT5HZXRGb250U2l6ZSgpOworICByZXR1cm4gRldMVEhFTUVfQ0FQQUNJVFlfRm9udFNpemU7Cit9CisKK1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IENYRkFfRldMVGhlbWU6OkdldEZvbnQoCisgICAgQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQpIGNvbnN0IHsKKyAgaWYgKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBYRkFfVGhlbWVHZXRPdXRlcldpZGdldChwVGhlbWVQYXJ0LT5tX3BXaWRnZXQpKQorICAgIHJldHVybiBwV2lkZ2V0LT5HZXROb2RlKCktPkdldFdpZGdldEFjYygpLT5HZXRGREVGb250KHBXaWRnZXQtPkdldERvYygpKTsKKyAgcmV0dXJuIEdldFRoZW1lKHBUaGVtZVBhcnQtPm1fcFdpZGdldCktPkdldEZvbnQoKTsKK30KKworZmxvYXQgQ1hGQV9GV0xUaGVtZTo6R2V0TGluZUhlaWdodChDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCkgY29uc3QgeworICBpZiAoQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBUaGVtZVBhcnQtPm1fcFdpZGdldCkpCisgICAgcmV0dXJuIHBXaWRnZXQtPkdldE5vZGUoKS0+R2V0TGluZUhlaWdodCgpOworICByZXR1cm4ga0xpbmVIZWlnaHQ7Cit9CisKK2Zsb2F0IENYRkFfRldMVGhlbWU6OkdldFNjcm9sbEJhcldpZHRoKCkgY29uc3QgeworICByZXR1cm4gOS4wZjsKK30KKworRlhfQ09MT1JSRUYgQ1hGQV9GV0xUaGVtZTo6R2V0VGV4dENvbG9yKENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0KSBjb25zdCB7CisgIGlmIChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQocFRoZW1lUGFydC0+bV9wV2lkZ2V0KSkKKyAgICByZXR1cm4gcFdpZGdldC0+R2V0Tm9kZSgpLT5HZXRUZXh0Q29sb3IoKTsKKyAgcmV0dXJuIEZXTFRIRU1FX0NBUEFDSVRZX1RleHRDb2xvcjsKK30KKworQ0ZYX1NpemVGIENYRkFfRldMVGhlbWU6OkdldFNwYWNlQWJvdmVCZWxvdyhDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCkgY29uc3QgeworICBDRlhfU2l6ZUYgc2l6ZUFib3ZlQmVsb3c7CisgIGlmIChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0ID0gWEZBX1RoZW1lR2V0T3V0ZXJXaWRnZXQocFRoZW1lUGFydC0+bV9wV2lkZ2V0KSkgeworICAgIENYRkFfUGFyYSogcGFyYSA9IHBXaWRnZXQtPkdldE5vZGUoKS0+R2V0UGFyYUlmRXhpc3RzKCk7CisgICAgaWYgKHBhcmEpIHsKKyAgICAgIHNpemVBYm92ZUJlbG93LndpZHRoID0gcGFyYS0+R2V0U3BhY2VBYm92ZSgpOworICAgICAgc2l6ZUFib3ZlQmVsb3cuaGVpZ2h0ID0gcGFyYS0+R2V0U3BhY2VCZWxvdygpOworICAgIH0KKyAgfQorICByZXR1cm4gc2l6ZUFib3ZlQmVsb3c7Cit9CisKK3ZvaWQgQ1hGQV9GV0xUaGVtZTo6Q2FsY1RleHRSZWN0KENGV0xfVGhlbWVUZXh0KiBwUGFyYW1zLCBDRlhfUmVjdEYmIHJlY3QpIHsKKyAgaWYgKHBQYXJhbXMtPm1fcFdpZGdldC0+R2V0Q2xhc3NJRCgpID09IEZXTF9UeXBlOjpNb250aENhbGVuZGFyKSB7CisgICAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KHBQYXJhbXMtPm1fcFdpZGdldCk7CisgICAgaWYgKCFwV2lkZ2V0IHx8ICFwUGFyYW1zIHx8ICFtX3BUZXh0T3V0KQorICAgICAgcmV0dXJuOworCisgICAgbV9wVGV4dE91dC0+U2V0Rm9udChtX3BDYWxlbmRhckZvbnQpOworICAgIG1fcFRleHRPdXQtPlNldEZvbnRTaXplKEZXTFRIRU1FX0NBUEFDSVRZX0ZvbnRTaXplKTsKKyAgICBtX3BUZXh0T3V0LT5TZXRUZXh0Q29sb3IoRldMVEhFTUVfQ0FQQUNJVFlfVGV4dENvbG9yKTsKKyAgICBtX3BUZXh0T3V0LT5TZXRBbGlnbm1lbnQocFBhcmFtcy0+bV9pVFRPQWxpZ24pOworICAgIG1fcFRleHRPdXQtPlNldFN0eWxlcyhwUGFyYW1zLT5tX2R3VFRPU3R5bGVzKTsKKyAgICBtX3BUZXh0T3V0LT5DYWxjTG9naWNTaXplKHBQYXJhbXMtPm1fd3NUZXh0LCByZWN0KTsKKyAgfQorCisgIENYRkFfRkZXaWRnZXQqIHBXaWRnZXQgPSBYRkFfVGhlbWVHZXRPdXRlcldpZGdldChwUGFyYW1zLT5tX3BXaWRnZXQpOworICBpZiAoIXBXaWRnZXQpCisgICAgcmV0dXJuOworCisgIENYRkFfTm9kZSogcE5vZGUgPSBwV2lkZ2V0LT5HZXROb2RlKCk7CisgIG1fcFRleHRPdXQtPlNldEZvbnQocE5vZGUtPkdldFdpZGdldEFjYygpLT5HZXRGREVGb250KHBXaWRnZXQtPkdldERvYygpKSk7CisgIG1fcFRleHRPdXQtPlNldEZvbnRTaXplKHBOb2RlLT5HZXRGb250U2l6ZSgpKTsKKyAgbV9wVGV4dE91dC0+U2V0VGV4dENvbG9yKHBOb2RlLT5HZXRUZXh0Q29sb3IoKSk7CisgIGlmICghcFBhcmFtcykKKyAgICByZXR1cm47CisKKyAgbV9wVGV4dE91dC0+U2V0QWxpZ25tZW50KHBQYXJhbXMtPm1faVRUT0FsaWduKTsKKyAgbV9wVGV4dE91dC0+U2V0U3R5bGVzKHBQYXJhbXMtPm1fZHdUVE9TdHlsZXMpOworICBtX3BUZXh0T3V0LT5DYWxjTG9naWNTaXplKHBQYXJhbXMtPm1fd3NUZXh0LCByZWN0KTsKK30KKworQ0ZXTF9XaWRnZXRUUCogQ1hGQV9GV0xUaGVtZTo6R2V0VGhlbWUoQ0ZXTF9XaWRnZXQqIHBXaWRnZXQpIGNvbnN0IHsKKyAgc3dpdGNoIChwV2lkZ2V0LT5HZXRDbGFzc0lEKCkpIHsKKyAgICBjYXNlIEZXTF9UeXBlOjpDaGVja0JveDoKKyAgICAgIHJldHVybiBtX3BDaGVja0JveFRQLmdldCgpOworICAgIGNhc2UgRldMX1R5cGU6Okxpc3RCb3g6CisgICAgICByZXR1cm4gbV9wTGlzdEJveFRQLmdldCgpOworICAgIGNhc2UgRldMX1R5cGU6OlBpY3R1cmVCb3g6CisgICAgICByZXR1cm4gbV9wUGljdHVyZUJveFRQLmdldCgpOworICAgIGNhc2UgRldMX1R5cGU6OlNjcm9sbEJhcjoKKyAgICAgIHJldHVybiBtX3BTcm9sbEJhclRQLmdldCgpOworICAgIGNhc2UgRldMX1R5cGU6OkVkaXQ6CisgICAgICByZXR1cm4gbV9wRWRpdFRQLmdldCgpOworICAgIGNhc2UgRldMX1R5cGU6OkNvbWJvQm94OgorICAgICAgcmV0dXJuIG1fcENvbWJvQm94VFAuZ2V0KCk7CisgICAgY2FzZSBGV0xfVHlwZTo6TW9udGhDYWxlbmRhcjoKKyAgICAgIHJldHVybiBtX3BNb250aENhbGVuZGFyVFAuZ2V0KCk7CisgICAgY2FzZSBGV0xfVHlwZTo6RGF0ZVRpbWVQaWNrZXI6CisgICAgICByZXR1cm4gbV9wRGF0ZVRpbWVQaWNrZXJUUC5nZXQoKTsKKyAgICBjYXNlIEZXTF9UeXBlOjpQdXNoQnV0dG9uOgorICAgICAgcmV0dXJuIG1fcFB1c2hCdXR0b25UUC5nZXQoKTsKKyAgICBjYXNlIEZXTF9UeXBlOjpDYXJldDoKKyAgICAgIHJldHVybiBtX3BDYXJldFRQLmdldCgpOworICAgIGNhc2UgRldMX1R5cGU6OkJhcmNvZGU6CisgICAgICByZXR1cm4gbV9wQmFyY29kZVRQLmdldCgpOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9md2x0aGVtZS5oIGIveGZhL2Z4ZmEvY3hmYV9md2x0aGVtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYWI3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2Z3bHRoZW1lLmgKQEAgLTAsMCArMSw2OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX0NYRkFfRldMVEhFTUVfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfQ1hGQV9GV0xUSEVNRV9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAieGZhL2Z3bC9pZndsX3RoZW1lcHJvdmlkZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZndsL3RoZW1lL2Nmd2xfYmFyY29kZXRwLmgiCisjaW5jbHVkZSAieGZhL2Z3bC90aGVtZS9jZndsX2NhcmV0dHAuaCIKKyNpbmNsdWRlICJ4ZmEvZndsL3RoZW1lL2Nmd2xfY2hlY2tib3h0cC5oIgorI2luY2x1ZGUgInhmYS9md2wvdGhlbWUvY2Z3bF9jb21ib2JveHRwLmgiCisjaW5jbHVkZSAieGZhL2Z3bC90aGVtZS9jZndsX2RhdGV0aW1lcGlja2VydHAuaCIKKyNpbmNsdWRlICJ4ZmEvZndsL3RoZW1lL2Nmd2xfZWRpdHRwLmgiCisjaW5jbHVkZSAieGZhL2Z3bC90aGVtZS9jZndsX2xpc3Rib3h0cC5oIgorI2luY2x1ZGUgInhmYS9md2wvdGhlbWUvY2Z3bF9tb250aGNhbGVuZGFydHAuaCIKKyNpbmNsdWRlICJ4ZmEvZndsL3RoZW1lL2Nmd2xfcGljdHVyZWJveHRwLmgiCisjaW5jbHVkZSAieGZhL2Z3bC90aGVtZS9jZndsX3B1c2hidXR0b250cC5oIgorI2luY2x1ZGUgInhmYS9md2wvdGhlbWUvY2Z3bF9zY3JvbGxiYXJ0cC5oIgorI2luY2x1ZGUgInhmYS9md2wvdGhlbWUvY2Z3bF93aWRnZXR0cC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZhcHAuaCIKKworY2xhc3MgQ1hGQV9GV0xUaGVtZSBmaW5hbCA6IHB1YmxpYyBJRldMX1RoZW1lUHJvdmlkZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1hGQV9GV0xUaGVtZShDWEZBX0ZGQXBwKiBwQXBwKTsKKyAgfkNYRkFfRldMVGhlbWUoKSBvdmVycmlkZTsKKworICAvLyBJRldMX1RoZW1lUHJvdmlkZXI6CisgIHZvaWQgRHJhd0JhY2tncm91bmQoQ0ZXTF9UaGVtZUJhY2tncm91bmQqIHBQYXJhbXMpIG92ZXJyaWRlOworICB2b2lkIERyYXdUZXh0KENGV0xfVGhlbWVUZXh0KiBwUGFyYW1zKSBvdmVycmlkZTsKKyAgdm9pZCBDYWxjVGV4dFJlY3QoQ0ZXTF9UaGVtZVRleHQqIHBQYXJhbXMsIENGWF9SZWN0RiYgcmVjdCkgb3ZlcnJpZGU7CisgIGZsb2F0IEdldENYQm9yZGVyU2l6ZSgpIGNvbnN0IG92ZXJyaWRlOworICBmbG9hdCBHZXRDWUJvcmRlclNpemUoKSBjb25zdCBvdmVycmlkZTsKKyAgQ0ZYX1JlY3RGIEdldFVJTWFyZ2luKENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0KSBjb25zdCBvdmVycmlkZTsKKyAgZmxvYXQgR2V0Rm9udFNpemUoQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQpIGNvbnN0IG92ZXJyaWRlOworICBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBHZXRGb250KENGV0xfVGhlbWVQYXJ0KiBwVGhlbWVQYXJ0KSBjb25zdCBvdmVycmlkZTsKKyAgZmxvYXQgR2V0TGluZUhlaWdodChDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCkgY29uc3Qgb3ZlcnJpZGU7CisgIGZsb2F0IEdldFNjcm9sbEJhcldpZHRoKCkgY29uc3Qgb3ZlcnJpZGU7CisgIEZYX0NPTE9SUkVGIEdldFRleHRDb2xvcihDRldMX1RoZW1lUGFydCogcFRoZW1lUGFydCkgY29uc3Qgb3ZlcnJpZGU7CisgIENGWF9TaXplRiBHZXRTcGFjZUFib3ZlQmVsb3coQ0ZXTF9UaGVtZVBhcnQqIHBUaGVtZVBhcnQpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgQ0ZXTF9XaWRnZXRUUCogR2V0VGhlbWUoQ0ZXTF9XaWRnZXQqIHBXaWRnZXQpIGNvbnN0OworCisgIHN0ZDo6dW5pcXVlX3B0cjxDRldMX0NoZWNrQm94VFA+IG1fcENoZWNrQm94VFA7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRldMX0xpc3RCb3hUUD4gbV9wTGlzdEJveFRQOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZXTF9QaWN0dXJlQm94VFA+IG1fcFBpY3R1cmVCb3hUUDsKKyAgc3RkOjp1bmlxdWVfcHRyPENGV0xfU2Nyb2xsQmFyVFA+IG1fcFNyb2xsQmFyVFA7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRldMX0VkaXRUUD4gbV9wRWRpdFRQOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZXTF9Db21ib0JveFRQPiBtX3BDb21ib0JveFRQOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZXTF9Nb250aENhbGVuZGFyVFA+IG1fcE1vbnRoQ2FsZW5kYXJUUDsKKyAgc3RkOjp1bmlxdWVfcHRyPENGV0xfRGF0ZVRpbWVQaWNrZXJUUD4gbV9wRGF0ZVRpbWVQaWNrZXJUUDsKKyAgc3RkOjp1bmlxdWVfcHRyPENGV0xfUHVzaEJ1dHRvblRQPiBtX3BQdXNoQnV0dG9uVFA7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRldMX0NhcmV0VFA+IG1fcENhcmV0VFA7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRldMX0JhcmNvZGVUUD4gbV9wQmFyY29kZVRQOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZERV9UZXh0T3V0PiBtX3BUZXh0T3V0OworICBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBtX3BDYWxlbmRhckZvbnQ7CisgIFdpZGVTdHJpbmcgbV93c1Jlc291cmNlOworICBVbm93bmVkUHRyPENYRkFfRkZBcHA+IGNvbnN0IG1fcEFwcDsKKyAgQ0ZYX1JlY3RGIG1fUmVjdDsKK307CisKK0NYRkFfRkZXaWRnZXQqIFhGQV9UaGVtZUdldE91dGVyV2lkZ2V0KENGV0xfV2lkZ2V0KiBwV2lkZ2V0KTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9DWEZBX0ZXTFRIRU1FX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX2ltYWdlcmVuZGVyZXIuY3BwIGIveGZhL2Z4ZmEvY3hmYV9pbWFnZXJlbmRlcmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmNiNWU5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9pbWFnZXJlbmRlcmVyLmNwcApAQCAtMCwwICsxLDE1OCBAQAorLy8gQ29weXJpZ2h0IDIwMTggUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9pbWFnZXJlbmRlcmVyLmgiCisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2RpYnNvdXJjZS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2ltYWdlcmVuZGVyZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZGliL2NmeF9pbWFnZXRyYW5zZm9ybWVyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCitDWEZBX0ltYWdlUmVuZGVyZXI6OkNYRkFfSW1hZ2VSZW5kZXJlcigKKyAgICBDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgcERJQlNvdXJjZSwKKyAgICBjb25zdCBDRlhfTWF0cml4KiBwSW1hZ2UyRGV2aWNlKQorICAgIDogbV9wRGV2aWNlKHBEZXZpY2UpLAorICAgICAgbV9JbWFnZU1hdHJpeCgqcEltYWdlMkRldmljZSksCisgICAgICBtX3BESUJTb3VyY2UocERJQlNvdXJjZSkge30KKworQ1hGQV9JbWFnZVJlbmRlcmVyOjp+Q1hGQV9JbWFnZVJlbmRlcmVyKCkge30KKworYm9vbCBDWEZBX0ltYWdlUmVuZGVyZXI6OlN0YXJ0KCkgeworICBpZiAobV9wRGV2aWNlLT5TdGFydERJQml0c1dpdGhCbGVuZChtX3BESUJTb3VyY2UsIDI1NSwgMCwgJm1fSW1hZ2VNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0lOVEVSUE9MLCAmbV9EZXZpY2VIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYRElCX0JMRU5EX05PUk1BTCkpIHsKKyAgICBpZiAobV9EZXZpY2VIYW5kbGUpIHsKKyAgICAgIG1fU3RhdHVzID0gMzsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgQ0ZYX0Zsb2F0UmVjdCBpbWFnZV9yZWN0X2YgPSBtX0ltYWdlTWF0cml4LkdldFVuaXRSZWN0KCk7CisgIEZYX1JFQ1QgaW1hZ2VfcmVjdCA9IGltYWdlX3JlY3RfZi5HZXRPdXRlclJlY3QoKTsKKyAgaW50IGRlc3Rfd2lkdGggPSBpbWFnZV9yZWN0LldpZHRoKCk7CisgIGludCBkZXN0X2hlaWdodCA9IGltYWdlX3JlY3QuSGVpZ2h0KCk7CisgIGlmICgoZmFicyhtX0ltYWdlTWF0cml4LmIpID49IDAuNWYgfHwgbV9JbWFnZU1hdHJpeC5hID09IDApIHx8CisgICAgICAoZmFicyhtX0ltYWdlTWF0cml4LmMpID49IDAuNWYgfHwgbV9JbWFnZU1hdHJpeC5kID09IDApKSB7CisgICAgUmV0YWluUHRyPENGWF9ESUJTb3VyY2U+IHBEaWIgPSBtX3BESUJTb3VyY2U7CisgICAgaWYgKG1fcERJQlNvdXJjZS0+SGFzQWxwaGEoKSAmJgorICAgICAgICAhKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19BTFBIQV9JTUFHRSkgJiYKKyAgICAgICAgIShtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfR0VUX0JJVFMpKSB7CisgICAgICBtX3BDbG9uZUNvbnZlcnQgPSBtX3BESUJTb3VyY2UtPkNsb25lQ29udmVydChGWERJQl9SZ2IpOworICAgICAgaWYgKCFtX3BDbG9uZUNvbnZlcnQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgcERpYiA9IG1fcENsb25lQ29udmVydDsKKyAgICB9CisgICAgRlhfUkVDVCBjbGlwX2JveCA9IG1fcERldmljZS0+R2V0Q2xpcEJveCgpOworICAgIGNsaXBfYm94LkludGVyc2VjdChpbWFnZV9yZWN0KTsKKyAgICBtX1N0YXR1cyA9IDI7CisgICAgbV9wVHJhbnNmb3JtZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0ltYWdlVHJhbnNmb3JtZXI+KAorICAgICAgICBwRGliLCAmbV9JbWFnZU1hdHJpeCwgRlhESUJfSU5URVJQT0wsICZjbGlwX2JveCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKG1fSW1hZ2VNYXRyaXguYSA8IDApCisgICAgZGVzdF93aWR0aCA9IC1kZXN0X3dpZHRoOworICBpZiAobV9JbWFnZU1hdHJpeC5kID4gMCkKKyAgICBkZXN0X2hlaWdodCA9IC1kZXN0X2hlaWdodDsKKyAgaW50IGRlc3RfbGVmdCwgZGVzdF90b3A7CisgIGRlc3RfbGVmdCA9IGRlc3Rfd2lkdGggPiAwID8gaW1hZ2VfcmVjdC5sZWZ0IDogaW1hZ2VfcmVjdC5yaWdodDsKKyAgZGVzdF90b3AgPSBkZXN0X2hlaWdodCA+IDAgPyBpbWFnZV9yZWN0LnRvcCA6IGltYWdlX3JlY3QuYm90dG9tOworICBpZiAobV9wRElCU291cmNlLT5Jc09wYXF1ZUltYWdlKCkpIHsKKyAgICBpZiAobV9wRGV2aWNlLT5TdHJldGNoRElCaXRzV2l0aEZsYWdzQW5kQmxlbmQoCisgICAgICAgICAgICBtX3BESUJTb3VyY2UsIGRlc3RfbGVmdCwgZGVzdF90b3AsIGRlc3Rfd2lkdGgsIGRlc3RfaGVpZ2h0LAorICAgICAgICAgICAgRlhESUJfSU5URVJQT0wsIEZYRElCX0JMRU5EX05PUk1BTCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgaWYgKG1fcERJQlNvdXJjZS0+SXNBbHBoYU1hc2soKSkgeworICAgIGlmIChtX3BEZXZpY2UtPlN0cmV0Y2hCaXRNYXNrV2l0aEZsYWdzKG1fcERJQlNvdXJjZSwgZGVzdF9sZWZ0LCBkZXN0X3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X3dpZHRoLCBkZXN0X2hlaWdodCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWERJQl9JTlRFUlBPTCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBGWF9SRUNUIGNsaXBfYm94ID0gbV9wRGV2aWNlLT5HZXRDbGlwQm94KCk7CisgIEZYX1JFQ1QgZGVzdF9yZWN0ID0gY2xpcF9ib3g7CisgIGRlc3RfcmVjdC5JbnRlcnNlY3QoaW1hZ2VfcmVjdCk7CisgIEZYX1JFQ1QgZGVzdF9jbGlwKAorICAgICAgZGVzdF9yZWN0LmxlZnQgLSBpbWFnZV9yZWN0LmxlZnQsIGRlc3RfcmVjdC50b3AgLSBpbWFnZV9yZWN0LnRvcCwKKyAgICAgIGRlc3RfcmVjdC5yaWdodCAtIGltYWdlX3JlY3QubGVmdCwgZGVzdF9yZWN0LmJvdHRvbSAtIGltYWdlX3JlY3QudG9wKTsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcFN0cmV0Y2hlZCA9IG1fcERJQlNvdXJjZS0+U3RyZXRjaFRvKAorICAgICAgZGVzdF93aWR0aCwgZGVzdF9oZWlnaHQsIEZYRElCX0lOVEVSUE9MLCAmZGVzdF9jbGlwKTsKKyAgaWYgKHBTdHJldGNoZWQpCisgICAgQ29tcG9zaXRlRElCaXRtYXAocFN0cmV0Y2hlZCwgZGVzdF9yZWN0LmxlZnQsIGRlc3RfcmVjdC50b3ApOworCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDWEZBX0ltYWdlUmVuZGVyZXI6OkNvbnRpbnVlKCkgeworICBpZiAobV9TdGF0dXMgPT0gMikgeworICAgIGlmIChtX3BUcmFuc2Zvcm1lci0+Q29udGludWUobnVsbHB0cikpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBCaXRtYXAgPSBtX3BUcmFuc2Zvcm1lci0+RGV0YWNoQml0bWFwKCk7CisgICAgaWYgKCFwQml0bWFwKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHBCaXRtYXAtPklzQWxwaGFNYXNrKCkpIHsKKyAgICAgIG1fcERldmljZS0+U2V0Qml0TWFzayhwQml0bWFwLCBtX3BUcmFuc2Zvcm1lci0+cmVzdWx0KCkubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BUcmFuc2Zvcm1lci0+cmVzdWx0KCkudG9wLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgbV9wRGV2aWNlLT5TZXRESUJpdHNXaXRoQmxlbmQocEJpdG1hcCwgbV9wVHJhbnNmb3JtZXItPnJlc3VsdCgpLmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BUcmFuc2Zvcm1lci0+cmVzdWx0KCkudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhESUJfQkxFTkRfTk9STUFMKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChtX1N0YXR1cyA9PSAzKQorICAgIHJldHVybiBtX3BEZXZpY2UtPkNvbnRpbnVlRElCaXRzKG1fRGV2aWNlSGFuZGxlLmdldCgpLCBudWxscHRyKTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ1hGQV9JbWFnZVJlbmRlcmVyOjpDb21wb3NpdGVESUJpdG1hcCgKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcERJQml0bWFwLAorICAgIGludCBsZWZ0LAorICAgIGludCB0b3ApIHsKKyAgaWYgKCFwRElCaXRtYXApCisgICAgcmV0dXJuOworCisgIGlmICghcERJQml0bWFwLT5Jc0FscGhhTWFzaygpKSB7CisgICAgaWYgKG1fcERldmljZS0+U2V0RElCaXRzKHBESUJpdG1hcCwgbGVmdCwgdG9wKSkKKyAgICAgIHJldHVybjsKKyAgfSBlbHNlIGlmIChtX3BEZXZpY2UtPlNldEJpdE1hc2socERJQml0bWFwLCBsZWZ0LCB0b3AsIDApKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgYm9vbCBiR2V0QmFja0dyb3VuZCA9ICgobV9wRGV2aWNlLT5HZXRSZW5kZXJDYXBzKCkgJiBGWFJDX0FMUEhBX09VVFBVVCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoIShtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfQUxQSEFfT1VUUFVUKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChtX3BEZXZpY2UtPkdldFJlbmRlckNhcHMoKSAmIEZYUkNfR0VUX0JJVFMpKTsKKyAgaWYgKGJHZXRCYWNrR3JvdW5kKSB7CisgICAgaWYgKHBESUJpdG1hcC0+SXNBbHBoYU1hc2soKSkKKyAgICAgIHJldHVybjsKKworICAgIG1fcERldmljZS0+U2V0RElCaXRzV2l0aEJsZW5kKHBESUJpdG1hcCwgbGVmdCwgdG9wLCBGWERJQl9CTEVORF9OT1JNQUwpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIXBESUJpdG1hcC0+SGFzQWxwaGEoKSB8fAorICAgICAgKG1fcERldmljZS0+R2V0UmVuZGVyQ2FwcygpICYgRlhSQ19BTFBIQV9JTUFHRSkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwQ2xvbmVDb252ZXJ0ID0gcERJQml0bWFwLT5DbG9uZUNvbnZlcnQoRlhESUJfUmdiKTsKKyAgaWYgKCFwQ2xvbmVDb252ZXJ0KQorICAgIHJldHVybjsKKworICBDWEZBX0ltYWdlUmVuZGVyZXIgaW1hZ2VSZW5kZXIobV9wRGV2aWNlLCBwQ2xvbmVDb252ZXJ0LCAmbV9JbWFnZU1hdHJpeCk7CisgIGlmICghaW1hZ2VSZW5kZXIuU3RhcnQoKSkKKyAgICByZXR1cm47CisKKyAgd2hpbGUgKGltYWdlUmVuZGVyLkNvbnRpbnVlKCkpCisgICAgY29udGludWU7Cit9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX2ltYWdlcmVuZGVyZXIuaCBiL3hmYS9meGZhL2N4ZmFfaW1hZ2VyZW5kZXJlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZDlhYjAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2ltYWdlcmVuZGVyZXIuaApAQCAtMCwwICsxLDQ2IEBACisvLyBDb3B5cmlnaHQgMjAxOCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfQ1hGQV9JTUFHRVJFTkRFUkVSX0hfCisjZGVmaW5lIFhGQV9GWEZBX0NYRkFfSU1BR0VSRU5ERVJFUl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9meF9kaWIuaCIKKworY2xhc3MgQ0ZYX1JlbmRlckRldmljZTsKK2NsYXNzIENGWF9ESUJTb3VyY2U7CitjbGFzcyBDRlhfRElCaXRtYXA7CitjbGFzcyBDRlhfSW1hZ2VUcmFuc2Zvcm1lcjsKK2NsYXNzIENGWF9JbWFnZVJlbmRlcmVyOworCitjbGFzcyBDWEZBX0ltYWdlUmVuZGVyZXIgeworIHB1YmxpYzoKKyAgQ1hGQV9JbWFnZVJlbmRlcmVyKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHBESUJTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBwSW1hZ2UyRGV2aWNlKTsKKyAgfkNYRkFfSW1hZ2VSZW5kZXJlcigpOworCisgIGJvb2wgU3RhcnQoKTsKKyAgYm9vbCBDb250aW51ZSgpOworCisgcHJpdmF0ZToKKyAgdm9pZCBDb21wb3NpdGVESUJpdG1hcChjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiYgcERJQml0bWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3ApOworCisgIENGWF9SZW5kZXJEZXZpY2UqIG1fcERldmljZTsKKyAgaW50IG1fU3RhdHVzID0gMDsKKyAgQ0ZYX01hdHJpeCBtX0ltYWdlTWF0cml4OworICBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4gbV9wRElCU291cmNlOworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBtX3BDbG9uZUNvbnZlcnQ7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfSW1hZ2VUcmFuc2Zvcm1lcj4gbV9wVHJhbnNmb3JtZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfSW1hZ2VSZW5kZXJlcj4gbV9EZXZpY2VIYW5kbGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX0NYRkFfSU1BR0VSRU5ERVJFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9saW5rdXNlcmRhdGEuY3BwIGIveGZhL2Z4ZmEvY3hmYV9saW5rdXNlcmRhdGEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMmI3NDYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2xpbmt1c2VyZGF0YS5jcHAKQEAgLTAsMCArMSwxMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9saW5rdXNlcmRhdGEuaCIKKworQ1hGQV9MaW5rVXNlckRhdGE6OkNYRkFfTGlua1VzZXJEYXRhKHdjaGFyX3QqIHBzelRleHQpCisgICAgOiBtX3dzVVJMQ29udGVudChwc3pUZXh0KSB7fQorCitDWEZBX0xpbmtVc2VyRGF0YTo6fkNYRkFfTGlua1VzZXJEYXRhKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfbGlua3VzZXJkYXRhLmggYi94ZmEvZnhmYS9jeGZhX2xpbmt1c2VyZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMGY5NWUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2xpbmt1c2VyZGF0YS5oCkBAIC0wLDAgKzEsMjggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9DWEZBX0xJTktVU0VSREFUQV9IXworI2RlZmluZSBYRkFfRlhGQV9DWEZBX0xJTktVU0VSREFUQV9IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgorCitjbGFzcyBDWEZBX0xpbmtVc2VyRGF0YSA6IHB1YmxpYyBSZXRhaW5hYmxlIHsKKyBwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgorICBmcmllbmQgUmV0YWluUHRyPFQ+IHBkZml1bTo6TWFrZVJldGFpbihBcmdzJiYuLi4gYXJncyk7CisKKyAgY29uc3Qgd2NoYXJfdCogR2V0TGlua1VSTCgpIGNvbnN0IHsgcmV0dXJuIG1fd3NVUkxDb250ZW50LmNfc3RyKCk7IH0KKworIHByaXZhdGU6CisgIGV4cGxpY2l0IENYRkFfTGlua1VzZXJEYXRhKHdjaGFyX3QqIHBzelRleHQpOworICB+Q1hGQV9MaW5rVXNlckRhdGEoKSBvdmVycmlkZTsKKworICBXaWRlU3RyaW5nIG1fd3NVUkxDb250ZW50OworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9DWEZBX0xJTktVU0VSREFUQV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9sb2FkZXJjb250ZXh0LmNwcCBiL3hmYS9meGZhL2N4ZmFfbG9hZGVyY29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDViYTlmMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfbG9hZGVyY29udGV4dC5jcHAKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9sb2FkZXJjb250ZXh0LmgiCisKK0NYRkFfTG9hZGVyQ29udGV4dDo6Q1hGQV9Mb2FkZXJDb250ZXh0KCkKKyAgICA6IG1fYlNhdmVMaW5lSGVpZ2h0KGZhbHNlKSwKKyAgICAgIG1fZldpZHRoKDApLAorICAgICAgbV9mSGVpZ2h0KDApLAorICAgICAgbV9mTGFzdFBvcygwKSwKKyAgICAgIG1fZlN0YXJ0TGluZU9mZnNldCgwKSwKKyAgICAgIG1faUNoYXIoMCksCisgICAgICBtX2lUb3RhbExpbmVzKC0xKSwKKyAgICAgIG1fZHdGbGFncygwKSwKKyAgICAgIG1fcFhNTE5vZGUobnVsbHB0ciksCisgICAgICBtX3BOb2RlKG51bGxwdHIpIHt9CisKK0NYRkFfTG9hZGVyQ29udGV4dDo6fkNYRkFfTG9hZGVyQ29udGV4dCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX2xvYWRlcmNvbnRleHQuaCBiL3hmYS9meGZhL2N4ZmFfbG9hZGVyY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZTNmMTEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX2xvYWRlcmNvbnRleHQuaApAQCAtMCwwICsxLDM5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfQ1hGQV9MT0FERVJDT05URVhUX0hfCisjZGVmaW5lIFhGQV9GWEZBX0NYRkFfTE9BREVSQ09OVEVYVF9IXworCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc2NvbXB1dGVkc3R5bGUuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorCitjbGFzcyBDRlhfWE1MTm9kZTsKK2NsYXNzIENYRkFfTm9kZTsKKworY2xhc3MgQ1hGQV9Mb2FkZXJDb250ZXh0IHsKKyBwdWJsaWM6CisgIENYRkFfTG9hZGVyQ29udGV4dCgpOworICB+Q1hGQV9Mb2FkZXJDb250ZXh0KCk7CisKKyAgYm9vbCBtX2JTYXZlTGluZUhlaWdodDsKKyAgZmxvYXQgbV9mV2lkdGg7CisgIGZsb2F0IG1fZkhlaWdodDsKKyAgZmxvYXQgbV9mTGFzdFBvczsKKyAgZmxvYXQgbV9mU3RhcnRMaW5lT2Zmc2V0OworICBpbnQzMl90IG1faUNoYXI7CisgIGludDMyX3QgbV9pTGluZXM7CisgIGludDMyX3QgbV9pVG90YWxMaW5lczsKKyAgdWludDMyX3QgbV9kd0ZsYWdzOworICBDRlhfWE1MTm9kZSogbV9wWE1MTm9kZTsKKyAgQ1hGQV9Ob2RlKiBtX3BOb2RlOworICBSZXRhaW5QdHI8Q0ZYX0NTU0NvbXB1dGVkU3R5bGU+IG1fcFBhcmVudFN0eWxlOworICBzdGQ6OnZlY3RvcjxmbG9hdD4gbV9saW5lSGVpZ2h0czsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG1fQmxvY2tzSGVpZ2h0OworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9DWEZBX0xPQURFUkNPTlRFWFRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfcGllY2VsaW5lLmNwcCBiL3hmYS9meGZhL2N4ZmFfcGllY2VsaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTcwYWQ1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9waWVjZWxpbmUuY3BwCkBAIC0wLDAgKzEsMTMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfcGllY2VsaW5lLmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX3RleHRwaWVjZS5oIgorCitDWEZBX1BpZWNlTGluZTo6Q1hGQV9QaWVjZUxpbmUoKSB7fQorCitDWEZBX1BpZWNlTGluZTo6fkNYRkFfUGllY2VMaW5lKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfcGllY2VsaW5lLmggYi94ZmEvZnhmYS9jeGZhX3BpZWNlbGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOTVlNzMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX3BpZWNlbGluZS5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9DWEZBX1BJRUNFTElORV9IXworI2RlZmluZSBYRkFfRlhGQV9DWEZBX1BJRUNFTElORV9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworY2xhc3MgQ1hGQV9UZXh0UGllY2U7CisKK2NsYXNzIENYRkFfUGllY2VMaW5lIHsKKyBwdWJsaWM6CisgIENYRkFfUGllY2VMaW5lKCk7CisgIH5DWEZBX1BpZWNlTGluZSgpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDWEZBX1RleHRQaWVjZT4+IG1fdGV4dFBpZWNlczsKKyAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gbV9jaGFyQ291bnRzOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9DWEZBX1BJRUNFTElORV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9yZW5kZXJjb250ZXh0LmNwcCBiL3hmYS9meGZhL2N4ZmFfcmVuZGVyY29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2N2Q0NgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfcmVuZGVyY29udGV4dC5jcHAKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9yZW5kZXJjb250ZXh0LmgiCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0LmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9ncmFwaGljcy5oIgorCitDWEZBX1JlbmRlckNvbnRleHQ6OkNYRkFfUmVuZGVyQ29udGV4dChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgY2xpcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpCisgICAgOiBtX3BXaWRnZXQobnVsbHB0ciksIG1fbWF0cml4KG1hdHJpeCksIG1fcnRDbGlwUmVjdChjbGlwUmVjdCkgeworICBtYXRyaXguR2V0SW52ZXJzZSgpLlRyYW5zZm9ybVJlY3QobV9ydENsaXBSZWN0KTsKKworICBtX3BXaWRnZXRJdGVyYXRvciA9IHBQYWdlVmlldy0+Q3JlYXRlV2lkZ2V0SXRlcmF0b3IoCisgICAgICBYRkFfVFJBVkVSU0VXQVlfRm9ybSwKKyAgICAgIFhGQV9XaWRnZXRTdGF0dXNfVmlzaWJsZSB8IFhGQV9XaWRnZXRTdGF0dXNfVmlld2FibGUpOworICBtX3BXaWRnZXQgPSBtX3BXaWRnZXRJdGVyYXRvci0+TW92ZVRvTmV4dCgpOworfQorCitDWEZBX1JlbmRlckNvbnRleHQ6On5DWEZBX1JlbmRlckNvbnRleHQoKSB7fQorCit2b2lkIENYRkFfUmVuZGVyQ29udGV4dDo6RG9SZW5kZXIoQ1hGQV9HcmFwaGljcyogZ3MpIHsKKyAgd2hpbGUgKG1fcFdpZGdldCkgeworICAgIENGWF9SZWN0RiBydFdpZGdldEJveCA9IG1fcFdpZGdldC0+R2V0QkJveChYRkFfV2lkZ2V0U3RhdHVzX1Zpc2libGUpOworICAgIHJ0V2lkZ2V0Qm94LndpZHRoICs9IDE7CisgICAgcnRXaWRnZXRCb3guaGVpZ2h0ICs9IDE7CisgICAgaWYgKHJ0V2lkZ2V0Qm94LkludGVyc2VjdFdpdGgobV9ydENsaXBSZWN0KSkKKyAgICAgIG1fcFdpZGdldC0+UmVuZGVyV2lkZ2V0KGdzLCBtX21hdHJpeCwgWEZBX1dpZGdldFN0YXR1c19IaWdobGlnaHQpOworCisgICAgbV9wV2lkZ2V0ID0gbV9wV2lkZ2V0SXRlcmF0b3ItPk1vdmVUb05leHQoKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV9yZW5kZXJjb250ZXh0LmggYi94ZmEvZnhmYS9jeGZhX3JlbmRlcmNvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTE4MzBkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV9yZW5kZXJjb250ZXh0LmgKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX0NYRkFfUkVOREVSQ09OVEVYVF9IXworI2RlZmluZSBYRkFfRlhGQV9DWEZBX1JFTkRFUkNPTlRFWFRfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmEuaCIKKworY2xhc3MgQ1hGQV9HcmFwaGljczsKKworY2xhc3MgQ1hGQV9SZW5kZXJDb250ZXh0IHsKKyBwdWJsaWM6CisgIENYRkFfUmVuZGVyQ29udGV4dChDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgY2xpcFJlY3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpOworICB+Q1hGQV9SZW5kZXJDb250ZXh0KCk7CisKKyAgdm9pZCBEb1JlbmRlcihDWEZBX0dyYXBoaWNzKiBncyk7CisKKyBwcml2YXRlOgorICBzdGQ6OnVuaXF1ZV9wdHI8SVhGQV9XaWRnZXRJdGVyYXRvcj4gbV9wV2lkZ2V0SXRlcmF0b3I7CisgIENYRkFfRkZXaWRnZXQqIG1fcFdpZGdldDsKKyAgQ0ZYX01hdHJpeCBtX21hdHJpeDsKKyAgQ0ZYX1JlY3RGIG1fcnRDbGlwUmVjdDsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfQ1hGQV9SRU5ERVJDT05URVhUX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX3RleHRsYXlvdXQuY3BwIGIveGZhL2Z4ZmEvY3hmYV90ZXh0bGF5b3V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmI5ZThhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV90ZXh0bGF5b3V0LmNwcApAQCAtMCwwICsxLDEyOTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfdGV4dGxheW91dC5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzY29tcHV0ZWRzdHlsZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHlsZXNlbGVjdG9yLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbGVsZW1lbnQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sbm9kZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWx0ZXh0LmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9ncmFwaHN0YXRlZGF0YS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcGF0aGRhdGEuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfb2JqZWN0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKKyNpbmNsdWRlICJ4ZmEvZmRlL2NmZGVfdGV4dG91dC5oIgorI2luY2x1ZGUgInhmYS9mZ2FzL2ZvbnQvY2ZnYXNfZ2Vmb250LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9saW5rdXNlcmRhdGEuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2xvYWRlcmNvbnRleHQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX3BpZWNlbGluZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfdGV4dHBhcnNlY29udGV4dC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfdGV4dHBpZWNlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV90ZXh0cHJvdmlkZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX3RleHR0YWJzdG9wc2NvbnRleHQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX3RleHR1c2VyZGF0YS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2ZvbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFyYS5oIgorCisjZGVmaW5lIFhGQV9MT0FERVJDTlRYVEZMR19GSUxURVJTUEFDRSAweDAwMQorCitDWEZBX1RleHRMYXlvdXQ6OkNYRkFfVGV4dExheW91dChDWEZBX0ZGRG9jKiBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlcikKKyAgICA6IG1fYkhhc0Jsb2NrKGZhbHNlKSwKKyAgICAgIG1fcERvYyhkb2MpLAorICAgICAgbV9wVGV4dFByb3ZpZGVyKHBUZXh0UHJvdmlkZXIpLAorICAgICAgbV9wVGV4dERhdGFOb2RlKG51bGxwdHIpLAorICAgICAgbV9iUmljaFRleHQoZmFsc2UpLAorICAgICAgbV9pTGluZXMoMCksCisgICAgICBtX2ZNYXhXaWR0aCgwKSwKKyAgICAgIG1fYkJsb2NrQ29udGludWUodHJ1ZSkgeworICBBU1NFUlQobV9wVGV4dFByb3ZpZGVyKTsKK30KKworQ1hGQV9UZXh0TGF5b3V0Ojp+Q1hGQV9UZXh0TGF5b3V0KCkgeworICBtX3RleHRQYXJzZXIuUmVzZXQoKTsKKyAgVW5sb2FkKCk7Cit9CisKK3ZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpVbmxvYWQoKSB7CisgIG1fcGllY2VMaW5lcy5jbGVhcigpOworICBtX3BCcmVhay5yZXNldCgpOworfQorCit2b2lkIENYRkFfVGV4dExheW91dDo6R2V0VGV4dERhdGFOb2RlKCkgeworICBpZiAoIW1fcFRleHRQcm92aWRlcikKKyAgICByZXR1cm47CisKKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcFRleHRQcm92aWRlci0+R2V0VGV4dE5vZGUobV9iUmljaFRleHQpOworICBpZiAocE5vZGUgJiYgbV9iUmljaFRleHQpCisgICAgbV90ZXh0UGFyc2VyLlJlc2V0KCk7CisKKyAgbV9wVGV4dERhdGFOb2RlID0gcE5vZGU7Cit9CisKK0NGWF9YTUxOb2RlKiBDWEZBX1RleHRMYXlvdXQ6OkdldFhNTENvbnRhaW5lck5vZGUoKSB7CisgIGlmICghbV9iUmljaFRleHQpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQ0ZYX1hNTE5vZGUqIHBYTUxSb290ID0gbV9wVGV4dERhdGFOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpOworICBpZiAoIXBYTUxSb290KQorICAgIHJldHVybiBudWxscHRyOworCisgIENGWF9YTUxOb2RlKiBwWE1MQ29udGFpbmVyID0gbnVsbHB0cjsKKyAgZm9yIChDRlhfWE1MTm9kZSogcFhNTENoaWxkID0gcFhNTFJvb3QtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpGaXJzdENoaWxkKTsKKyAgICAgICBwWE1MQ2hpbGQ7CisgICAgICAgcFhNTENoaWxkID0gcFhNTENoaWxkLT5HZXROb2RlSXRlbShDRlhfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7CisgICAgaWYgKHBYTUxDaGlsZC0+R2V0VHlwZSgpID09IEZYX1hNTE5PREVfRWxlbWVudCkgeworICAgICAgQ0ZYX1hNTEVsZW1lbnQqIHBYTUxFbGVtZW50ID0gc3RhdGljX2Nhc3Q8Q0ZYX1hNTEVsZW1lbnQqPihwWE1MQ2hpbGQpOworICAgICAgV2lkZVN0cmluZyB3c1RhZyA9IHBYTUxFbGVtZW50LT5HZXRMb2NhbFRhZ05hbWUoKTsKKyAgICAgIGlmICh3c1RhZyA9PSBMImJvZHkiIHx8IHdzVGFnID09IEwiaHRtbCIpIHsKKyAgICAgICAgcFhNTENvbnRhaW5lciA9IHBYTUxDaGlsZDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBwWE1MQ29udGFpbmVyOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1JURkJyZWFrPiBDWEZBX1RleHRMYXlvdXQ6OkNyZWF0ZUJyZWFrKGJvb2wgYkRlZmF1bHQpIHsKKyAgdWludDMyX3QgZHdTdHlsZSA9IEZYX0xBWU9VVFNUWUxFX0V4cGFuZFRhYjsKKyAgaWYgKCFiRGVmYXVsdCkKKyAgICBkd1N0eWxlIHw9IEZYX0xBWU9VVFNUWUxFX1BhZ2luYXRpb247CisKKyAgYXV0byBwQnJlYWsgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX1JURkJyZWFrPihkd1N0eWxlKTsKKyAgcEJyZWFrLT5TZXRMaW5lQnJlYWtUb2xlcmFuY2UoMSk7CisgIHBCcmVhay0+U2V0Rm9udChtX3RleHRQYXJzZXIuR2V0Rm9udChtX3BEb2MsIG1fcFRleHRQcm92aWRlciwgbnVsbHB0cikpOworICBwQnJlYWstPlNldEZvbnRTaXplKG1fdGV4dFBhcnNlci5HZXRGb250U2l6ZShtX3BUZXh0UHJvdmlkZXIsIG51bGxwdHIpKTsKKyAgcmV0dXJuIHBCcmVhazsKK30KKwordm9pZCBDWEZBX1RleHRMYXlvdXQ6OkluaXRCcmVhayhmbG9hdCBmTGluZVdpZHRoKSB7CisgIENYRkFfUGFyYSogcGFyYSA9IG1fcFRleHRQcm92aWRlci0+R2V0UGFyYUlmRXhpc3RzKCk7CisgIGZsb2F0IGZTdGFydCA9IDA7CisgIGZsb2F0IGZTdGFydFBvcyA9IDA7CisgIGlmIChwYXJhKSB7CisgICAgQ0ZYX1JURkxpbmVBbGlnbm1lbnQgaUFsaWduID0gQ0ZYX1JURkxpbmVBbGlnbm1lbnQ6OkxlZnQ7CisgICAgc3dpdGNoIChwYXJhLT5HZXRIb3Jpem9udGFsQWxpZ24oKSkgeworICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6Q2VudGVyOgorICAgICAgICBpQWxpZ24gPSBDRlhfUlRGTGluZUFsaWdubWVudDo6Q2VudGVyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OlJpZ2h0OgorICAgICAgICBpQWxpZ24gPSBDRlhfUlRGTGluZUFsaWdubWVudDo6UmlnaHQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6SnVzdGlmeToKKyAgICAgICAgaUFsaWduID0gQ0ZYX1JURkxpbmVBbGlnbm1lbnQ6Okp1c3RpZmllZDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpKdXN0aWZ5QWxsOgorICAgICAgICBpQWxpZ24gPSBDRlhfUlRGTGluZUFsaWdubWVudDo6RGlzdHJpYnV0ZWQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6TGVmdDoKKyAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OlJhZGl4OgorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIG1fcEJyZWFrLT5TZXRBbGlnbm1lbnQoaUFsaWduKTsKKworICAgIGZTdGFydCA9IHBhcmEtPkdldE1hcmdpbkxlZnQoKTsKKyAgICBpZiAobV9wVGV4dFByb3ZpZGVyLT5Jc0NoZWNrQnV0dG9uQW5kQXV0b1dpZHRoKCkpIHsKKyAgICAgIGlmIChpQWxpZ24gIT0gQ0ZYX1JURkxpbmVBbGlnbm1lbnQ6OkxlZnQpCisgICAgICAgIGZMaW5lV2lkdGggLT0gcGFyYS0+R2V0TWFyZ2luUmlnaHQoKTsKKyAgICB9IGVsc2UgeworICAgICAgZkxpbmVXaWR0aCAtPSBwYXJhLT5HZXRNYXJnaW5SaWdodCgpOworICAgIH0KKyAgICBpZiAoZkxpbmVXaWR0aCA8IDApCisgICAgICBmTGluZVdpZHRoID0gZlN0YXJ0OworCisgICAgZlN0YXJ0UG9zID0gZlN0YXJ0OworICAgIGZsb2F0IGZJbmRlbnQgPSBwYXJhLT5HZXRUZXh0SW5kZW50KCk7CisgICAgaWYgKGZJbmRlbnQgPiAwKQorICAgICAgZlN0YXJ0UG9zICs9IGZJbmRlbnQ7CisgIH0KKworICBtX3BCcmVhay0+U2V0TGluZUJvdW5kYXJ5KGZTdGFydCwgZkxpbmVXaWR0aCk7CisgIG1fcEJyZWFrLT5TZXRMaW5lU3RhcnRQb3MoZlN0YXJ0UG9zKTsKKworICBDWEZBX0ZvbnQqIGZvbnQgPSBtX3BUZXh0UHJvdmlkZXItPkdldEZvbnRJZkV4aXN0cygpOworICBpZiAoZm9udCkgeworICAgIG1fcEJyZWFrLT5TZXRIb3Jpem9udGFsU2NhbGUoCisgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGZvbnQtPkdldEhvcml6b250YWxTY2FsZSgpKSk7CisgICAgbV9wQnJlYWstPlNldFZlcnRpY2FsU2NhbGUoc3RhdGljX2Nhc3Q8aW50MzJfdD4oZm9udC0+R2V0VmVydGljYWxTY2FsZSgpKSk7CisgICAgbV9wQnJlYWstPlNldENoYXJTcGFjZShmb250LT5HZXRMZXR0ZXJTcGFjaW5nKCkpOworICB9CisKKyAgZmxvYXQgZkZvbnRTaXplID0gbV90ZXh0UGFyc2VyLkdldEZvbnRTaXplKG1fcFRleHRQcm92aWRlciwgbnVsbHB0cik7CisgIG1fcEJyZWFrLT5TZXRGb250U2l6ZShmRm9udFNpemUpOworICBtX3BCcmVhay0+U2V0Rm9udChtX3RleHRQYXJzZXIuR2V0Rm9udChtX3BEb2MsIG1fcFRleHRQcm92aWRlciwgbnVsbHB0cikpOworICBtX3BCcmVhay0+U2V0TGluZUJyZWFrVG9sZXJhbmNlKGZGb250U2l6ZSAqIDAuMmYpOworfQorCit2b2lkIENYRkFfVGV4dExheW91dDo6SW5pdEJyZWFrKENGWF9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DU1NEaXNwbGF5IGVEaXNwbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmTGluZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfWE1MTm9kZSogcFhNTE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DU1NDb21wdXRlZFN0eWxlKiBwUGFyZW50U3R5bGUpIHsKKyAgaWYgKCFwU3R5bGUpIHsKKyAgICBJbml0QnJlYWsoZkxpbmVXaWR0aCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGVEaXNwbGF5ID09IENGWF9DU1NEaXNwbGF5OjpCbG9jayB8fAorICAgICAgZURpc3BsYXkgPT0gQ0ZYX0NTU0Rpc3BsYXk6Okxpc3RJdGVtKSB7CisgICAgQ0ZYX1JURkxpbmVBbGlnbm1lbnQgaUFsaWduID0gQ0ZYX1JURkxpbmVBbGlnbm1lbnQ6OkxlZnQ7CisgICAgc3dpdGNoIChwU3R5bGUtPkdldFRleHRBbGlnbigpKSB7CisgICAgICBjYXNlIENGWF9DU1NUZXh0QWxpZ246OlJpZ2h0OgorICAgICAgICBpQWxpZ24gPSBDRlhfUlRGTGluZUFsaWdubWVudDo6UmlnaHQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDRlhfQ1NTVGV4dEFsaWduOjpDZW50ZXI6CisgICAgICAgIGlBbGlnbiA9IENGWF9SVEZMaW5lQWxpZ25tZW50OjpDZW50ZXI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDRlhfQ1NTVGV4dEFsaWduOjpKdXN0aWZ5OgorICAgICAgICBpQWxpZ24gPSBDRlhfUlRGTGluZUFsaWdubWVudDo6SnVzdGlmaWVkOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQ0ZYX0NTU1RleHRBbGlnbjo6SnVzdGlmeUFsbDoKKyAgICAgICAgaUFsaWduID0gQ0ZYX1JURkxpbmVBbGlnbm1lbnQ6OkRpc3RyaWJ1dGVkOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBtX3BCcmVhay0+U2V0QWxpZ25tZW50KGlBbGlnbik7CisKKyAgICBmbG9hdCBmU3RhcnQgPSAwOworICAgIGNvbnN0IENGWF9DU1NSZWN0KiBwUmVjdCA9IHBTdHlsZS0+R2V0TWFyZ2luV2lkdGgoKTsKKyAgICBjb25zdCBDRlhfQ1NTUmVjdCogcFBhZGRpbmdSZWN0ID0gcFN0eWxlLT5HZXRQYWRkaW5nV2lkdGgoKTsKKyAgICBpZiAocFJlY3QpIHsKKyAgICAgIGZTdGFydCA9IHBSZWN0LT5sZWZ0LkdldFZhbHVlKCk7CisgICAgICBmTGluZVdpZHRoIC09IHBSZWN0LT5yaWdodC5HZXRWYWx1ZSgpOworICAgICAgaWYgKHBQYWRkaW5nUmVjdCkgeworICAgICAgICBmU3RhcnQgKz0gcFBhZGRpbmdSZWN0LT5sZWZ0LkdldFZhbHVlKCk7CisgICAgICAgIGZMaW5lV2lkdGggLT0gcFBhZGRpbmdSZWN0LT5yaWdodC5HZXRWYWx1ZSgpOworICAgICAgfQorICAgICAgaWYgKGVEaXNwbGF5ID09IENGWF9DU1NEaXNwbGF5OjpMaXN0SXRlbSkgeworICAgICAgICBjb25zdCBDRlhfQ1NTUmVjdCogcFBhclJlY3QgPSBwUGFyZW50U3R5bGUtPkdldE1hcmdpbldpZHRoKCk7CisgICAgICAgIGNvbnN0IENGWF9DU1NSZWN0KiBwUGFyUGFkZGluZ1JlY3QgPSBwUGFyZW50U3R5bGUtPkdldFBhZGRpbmdXaWR0aCgpOworICAgICAgICBpZiAocFBhclJlY3QpIHsKKyAgICAgICAgICBmU3RhcnQgKz0gcFBhclJlY3QtPmxlZnQuR2V0VmFsdWUoKTsKKyAgICAgICAgICBmTGluZVdpZHRoIC09IHBQYXJSZWN0LT5yaWdodC5HZXRWYWx1ZSgpOworICAgICAgICAgIGlmIChwUGFyUGFkZGluZ1JlY3QpIHsKKyAgICAgICAgICAgIGZTdGFydCArPSBwUGFyUGFkZGluZ1JlY3QtPmxlZnQuR2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGZMaW5lV2lkdGggLT0gcFBhclBhZGRpbmdSZWN0LT5yaWdodC5HZXRWYWx1ZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDRlhfQ1NTUmVjdCBwTmV3UmVjdDsKKyAgICAgICAgcE5ld1JlY3QubGVmdC5TZXQoQ0ZYX0NTU0xlbmd0aFVuaXQ6OlBvaW50LCBmU3RhcnQpOworICAgICAgICBwTmV3UmVjdC5yaWdodC5TZXQoQ0ZYX0NTU0xlbmd0aFVuaXQ6OlBvaW50LCBwUmVjdC0+cmlnaHQuR2V0VmFsdWUoKSk7CisgICAgICAgIHBOZXdSZWN0LnRvcC5TZXQoQ0ZYX0NTU0xlbmd0aFVuaXQ6OlBvaW50LCBwUmVjdC0+dG9wLkdldFZhbHVlKCkpOworICAgICAgICBwTmV3UmVjdC5ib3R0b20uU2V0KENGWF9DU1NMZW5ndGhVbml0OjpQb2ludCwgcFJlY3QtPmJvdHRvbS5HZXRWYWx1ZSgpKTsKKyAgICAgICAgcFN0eWxlLT5TZXRNYXJnaW5XaWR0aChwTmV3UmVjdCk7CisgICAgICB9CisgICAgfQorICAgIG1fcEJyZWFrLT5TZXRMaW5lQm91bmRhcnkoZlN0YXJ0LCBmTGluZVdpZHRoKTsKKyAgICBmbG9hdCBmSW5kZW50ID0gcFN0eWxlLT5HZXRUZXh0SW5kZW50KCkuR2V0VmFsdWUoKTsKKyAgICBpZiAoZkluZGVudCA+IDApCisgICAgICBmU3RhcnQgKz0gZkluZGVudDsKKworICAgIG1fcEJyZWFrLT5TZXRMaW5lU3RhcnRQb3MoZlN0YXJ0KTsKKyAgICBtX3BCcmVhay0+U2V0VGFiV2lkdGgobV90ZXh0UGFyc2VyLkdldFRhYkludGVydmFsKHBTdHlsZSkpOworICAgIGlmICghbV9wVGFic3RvcENvbnRleHQpCisgICAgICBtX3BUYWJzdG9wQ29udGV4dCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1RleHRUYWJzdG9wc0NvbnRleHQ+KCk7CisgICAgbV90ZXh0UGFyc2VyLkdldFRhYnN0b3BzKHBTdHlsZSwgbV9wVGFic3RvcENvbnRleHQuZ2V0KCkpOworICAgIGZvciAoY29uc3QgYXV0byYgc3RvcCA6IG1fcFRhYnN0b3BDb250ZXh0LT5tX3RhYnN0b3BzKQorICAgICAgbV9wQnJlYWstPkFkZFBvc2l0aW9uZWRUYWIoc3RvcC5mVGFic3RvcHMpOworICB9CisgIGZsb2F0IGZGb250U2l6ZSA9IG1fdGV4dFBhcnNlci5HZXRGb250U2l6ZShtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZSk7CisgIG1fcEJyZWFrLT5TZXRGb250U2l6ZShmRm9udFNpemUpOworICBtX3BCcmVhay0+U2V0TGluZUJyZWFrVG9sZXJhbmNlKGZGb250U2l6ZSAqIDAuMmYpOworICBtX3BCcmVhay0+U2V0Rm9udChtX3RleHRQYXJzZXIuR2V0Rm9udChtX3BEb2MsIG1fcFRleHRQcm92aWRlciwgcFN0eWxlKSk7CisgIG1fcEJyZWFrLT5TZXRIb3Jpem9udGFsU2NhbGUoCisgICAgICBtX3RleHRQYXJzZXIuR2V0SG9yU2NhbGUobV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUsIHBYTUxOb2RlKSk7CisgIG1fcEJyZWFrLT5TZXRWZXJ0aWNhbFNjYWxlKG1fdGV4dFBhcnNlci5HZXRWZXJTY2FsZShtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZSkpOworICBtX3BCcmVhay0+U2V0Q2hhclNwYWNlKHBTdHlsZS0+R2V0TGV0dGVyU3BhY2luZygpLkdldFZhbHVlKCkpOworfQorCitmbG9hdCBDWEZBX1RleHRMYXlvdXQ6OkdldExheW91dEhlaWdodCgpIHsKKyAgaWYgKCFtX3BMb2FkZXIpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKG1fcExvYWRlci0+bV9saW5lSGVpZ2h0cy5lbXB0eSgpICYmIG1fcExvYWRlci0+bV9mV2lkdGggPiAwKSB7CisgICAgQ0ZYX1NpemVGIHN6TWF4KG1fcExvYWRlci0+bV9mV2lkdGgsIG1fcExvYWRlci0+bV9mSGVpZ2h0KTsKKyAgICBtX3BMb2FkZXItPm1fYlNhdmVMaW5lSGVpZ2h0ID0gdHJ1ZTsKKyAgICBtX3BMb2FkZXItPm1fZkxhc3RQb3MgPSAwOworICAgIENGWF9TaXplRiBzekRlZiA9IENhbGNTaXplKHN6TWF4LCBzek1heCk7CisgICAgbV9wTG9hZGVyLT5tX2JTYXZlTGluZUhlaWdodCA9IGZhbHNlOworICAgIHJldHVybiBzekRlZi5oZWlnaHQ7CisgIH0KKworICBmbG9hdCBmSGVpZ2h0ID0gbV9wTG9hZGVyLT5tX2ZIZWlnaHQ7CisgIGlmIChmSGVpZ2h0IDwgMC4xZikgeworICAgIGZIZWlnaHQgPSAwOworICAgIGZvciAoZmxvYXQgdmFsdWUgOiBtX3BMb2FkZXItPm1fbGluZUhlaWdodHMpCisgICAgICBmSGVpZ2h0ICs9IHZhbHVlOworICB9CisgIHJldHVybiBmSGVpZ2h0OworfQorCitmbG9hdCBDWEZBX1RleHRMYXlvdXQ6OlN0YXJ0TGF5b3V0KGZsb2F0IGZXaWR0aCkgeworICBpZiAoIW1fcExvYWRlcikKKyAgICBtX3BMb2FkZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Mb2FkZXJDb250ZXh0PigpOworCisgIGlmIChmV2lkdGggPCAwIHx8CisgICAgICAobV9wTG9hZGVyLT5tX2ZXaWR0aCA+IC0xICYmIGZhYnMoZldpZHRoIC0gbV9wTG9hZGVyLT5tX2ZXaWR0aCkgPiAwKSkgeworICAgIG1fcExvYWRlci0+bV9saW5lSGVpZ2h0cy5jbGVhcigpOworICAgIG1fQmxvY2tzLmNsZWFyKCk7CisgICAgVW5sb2FkKCk7CisgICAgbV9wTG9hZGVyLT5tX2ZTdGFydExpbmVPZmZzZXQgPSAwOworICB9CisgIG1fcExvYWRlci0+bV9mV2lkdGggPSBmV2lkdGg7CisKKyAgaWYgKGZXaWR0aCA+PSAwKQorICAgIHJldHVybiBmV2lkdGg7CisKKyAgQ0ZYX1NpemVGIHN6TWF4OworCisgIG1fcExvYWRlci0+bV9iU2F2ZUxpbmVIZWlnaHQgPSB0cnVlOworICBtX3BMb2FkZXItPm1fZkxhc3RQb3MgPSAwOworICBDRlhfU2l6ZUYgc3pEZWYgPSBDYWxjU2l6ZShzek1heCwgc3pNYXgpOworICBtX3BMb2FkZXItPm1fYlNhdmVMaW5lSGVpZ2h0ID0gZmFsc2U7CisgIHJldHVybiBzekRlZi53aWR0aDsKK30KKworZmxvYXQgQ1hGQV9UZXh0TGF5b3V0OjpEb0xheW91dChpbnQzMl90IGlCbG9ja0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmQ2FsY0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZkNvbnRlbnRBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmVGV4dEhlaWdodCkgeworICBpZiAoIW1fcExvYWRlcikKKyAgICByZXR1cm4gZkNhbGNIZWlnaHQ7CisKKyAgaW50MzJfdCBpQmxvY2tDb3VudCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9CbG9ja3MpOworICBmbG9hdCBmSGVpZ2h0ID0gZlRleHRIZWlnaHQ7CisgIGlmIChmSGVpZ2h0IDwgMCkKKyAgICBmSGVpZ2h0ID0gR2V0TGF5b3V0SGVpZ2h0KCk7CisKKyAgbV9wTG9hZGVyLT5tX2ZIZWlnaHQgPSBmSGVpZ2h0OworICBpZiAoZkNvbnRlbnRBcmVhSGVpZ2h0IDwgMCkKKyAgICByZXR1cm4gZkNhbGNIZWlnaHQ7CisKKyAgbV9iSGFzQmxvY2sgPSB0cnVlOworICBpZiAoaUJsb2NrQ291bnQgPT0gMCAmJiBmSGVpZ2h0ID4gMCkgeworICAgIGZIZWlnaHQgPSBmVGV4dEhlaWdodCAtIEdldExheW91dEhlaWdodCgpOworICAgIGlmIChmSGVpZ2h0ID4gMCkgeworICAgICAgWEZBX0F0dHJpYnV0ZUVudW0gaUFsaWduID0gbV90ZXh0UGFyc2VyLkdldFZBbGlnbihtX3BUZXh0UHJvdmlkZXIpOworICAgICAgaWYgKGlBbGlnbiA9PSBYRkFfQXR0cmlidXRlRW51bTo6TWlkZGxlKQorICAgICAgICBmSGVpZ2h0IC89IDIuMGY7CisgICAgICBlbHNlIGlmIChpQWxpZ24gIT0gWEZBX0F0dHJpYnV0ZUVudW06OkJvdHRvbSkKKyAgICAgICAgZkhlaWdodCA9IDA7CisgICAgICBtX3BMb2FkZXItPm1fZlN0YXJ0TGluZU9mZnNldCA9IGZIZWlnaHQ7CisgICAgfQorICB9CisKKyAgZmxvYXQgZkxpbmVQb3MgPSBtX3BMb2FkZXItPm1fZlN0YXJ0TGluZU9mZnNldDsKKyAgaW50MzJfdCBpTGluZUluZGV4ID0gMDsKKyAgaWYgKGlCbG9ja0NvdW50ID4gMSkgeworICAgIGlmIChpQmxvY2tDb3VudCA+PSAoaUJsb2NrSW5kZXggKyAxKSAqIDIpIHsKKyAgICAgIGlMaW5lSW5kZXggPSBtX0Jsb2Nrc1tpQmxvY2tJbmRleCAqIDJdOworICAgIH0gZWxzZSB7CisgICAgICBpTGluZUluZGV4ID0gbV9CbG9ja3NbaUJsb2NrQ291bnQgLSAxXSArIG1fQmxvY2tzW2lCbG9ja0NvdW50IC0gMl07CisgICAgfQorICAgIGlmICghbV9wTG9hZGVyLT5tX0Jsb2Nrc0hlaWdodC5lbXB0eSgpKSB7CisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQmxvY2tJbmRleDsgaSsrKQorICAgICAgICBmTGluZVBvcyAtPSBtX3BMb2FkZXItPm1fQmxvY2tzSGVpZ2h0W2kgKiAyICsgMV07CisgICAgfQorICB9CisKKyAgaW50MzJfdCBpQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fcExvYWRlci0+bV9saW5lSGVpZ2h0cyk7CisgIGludDMyX3QgaSA9IDA7CisgIGZvciAoaSA9IGlMaW5lSW5kZXg7IGkgPCBpQ291bnQ7IGkrKykgeworICAgIGZsb2F0IGZMaW5lSGVpZ2h0ID0gbV9wTG9hZGVyLT5tX2xpbmVIZWlnaHRzW2ldOworICAgIGlmIChpID09IGlMaW5lSW5kZXggJiYgZkxpbmVIZWlnaHQgLSBmQ29udGVudEFyZWFIZWlnaHQgPiAwLjAwMSkKKyAgICAgIHJldHVybiAwOworCisgICAgaWYgKGZMaW5lUG9zICsgZkxpbmVIZWlnaHQgLSBmQ29udGVudEFyZWFIZWlnaHQgPiAwLjAwMSkgeworICAgICAgaWYgKGlCbG9ja0NvdW50ID49IChpQmxvY2tJbmRleCArIDEpICogMikgeworICAgICAgICBtX0Jsb2Nrc1tpQmxvY2tJbmRleCAqIDJdID0gaUxpbmVJbmRleDsKKyAgICAgICAgbV9CbG9ja3NbaUJsb2NrSW5kZXggKiAyICsgMV0gPSBpIC0gaUxpbmVJbmRleDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG1fQmxvY2tzLnB1c2hfYmFjayhpTGluZUluZGV4KTsKKyAgICAgICAgbV9CbG9ja3MucHVzaF9iYWNrKGkgLSBpTGluZUluZGV4KTsKKyAgICAgIH0KKyAgICAgIGlmIChpID09IGlMaW5lSW5kZXgpIHsKKyAgICAgICAgaWYgKGZDYWxjSGVpZ2h0IDw9IGZMaW5lUG9zKSB7CisgICAgICAgICAgaWYgKHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9wTG9hZGVyLT5tX0Jsb2Nrc0hlaWdodCkgPgorICAgICAgICAgICAgICAgICAgaUJsb2NrSW5kZXggKiAyICYmCisgICAgICAgICAgICAgIChtX3BMb2FkZXItPm1fQmxvY2tzSGVpZ2h0W2lCbG9ja0luZGV4ICogMl0gPT0gaUJsb2NrSW5kZXgpKSB7CisgICAgICAgICAgICBtX3BMb2FkZXItPm1fQmxvY2tzSGVpZ2h0W2lCbG9ja0luZGV4ICogMiArIDFdID0gZkNhbGNIZWlnaHQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHQucHVzaF9iYWNrKChmbG9hdClpQmxvY2tJbmRleCk7CisgICAgICAgICAgICBtX3BMb2FkZXItPm1fQmxvY2tzSGVpZ2h0LnB1c2hfYmFjayhmQ2FsY0hlaWdodCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmQ2FsY0hlaWdodDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmTGluZVBvczsKKyAgICB9CisgICAgZkxpbmVQb3MgKz0gZkxpbmVIZWlnaHQ7CisgIH0KKyAgcmV0dXJuIGZDYWxjSGVpZ2h0OworfQorCitpbnQzMl90IENYRkFfVGV4dExheW91dDo6Q291bnRCbG9ja3MoKSBjb25zdCB7CisgIGludDMyX3QgaUNvdW50ID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX0Jsb2NrcykgLyAyOworICByZXR1cm4gaUNvdW50ID4gMCA/IGlDb3VudCA6IDE7Cit9CisKK0NGWF9TaXplRiBDWEZBX1RleHRMYXlvdXQ6OkNhbGNTaXplKGNvbnN0IENGWF9TaXplRiYgbWluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9TaXplRiYgbWF4U2l6ZSkgeworICBmbG9hdCB3aWR0aCA9IG1heFNpemUud2lkdGg7CisgIGlmICh3aWR0aCA8IDEpCisgICAgd2lkdGggPSAweEZGRkY7CisKKyAgbV9wQnJlYWsgPSBDcmVhdGVCcmVhayhmYWxzZSk7CisgIGZsb2F0IGZMaW5lUG9zID0gMDsKKyAgbV9pTGluZXMgPSAwOworICBtX2ZNYXhXaWR0aCA9IDA7CisgIExvYWRlcih3aWR0aCwgZkxpbmVQb3MsIGZhbHNlKTsKKyAgaWYgKGZMaW5lUG9zIDwgMC4xZikKKyAgICBmTGluZVBvcyA9IG1fdGV4dFBhcnNlci5HZXRGb250U2l6ZShtX3BUZXh0UHJvdmlkZXIsIG51bGxwdHIpOworCisgIG1fcFRhYnN0b3BDb250ZXh0LnJlc2V0KCk7CisgIHJldHVybiBDRlhfU2l6ZUYobV9mTWF4V2lkdGgsIGZMaW5lUG9zKTsKK30KKworZmxvYXQgQ1hGQV9UZXh0TGF5b3V0OjpMYXlvdXQoY29uc3QgQ0ZYX1NpemVGJiBzaXplKSB7CisgIGlmIChzaXplLndpZHRoIDwgMSkKKyAgICByZXR1cm4gMC5mOworCisgIFVubG9hZCgpOworICBtX3BCcmVhayA9IENyZWF0ZUJyZWFrKHRydWUpOworICBpZiAobV9wTG9hZGVyKSB7CisgICAgbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzID0gLTE7CisgICAgbV9wTG9hZGVyLT5tX2lDaGFyID0gMDsKKyAgfQorCisgIG1faUxpbmVzID0gMDsKKyAgZmxvYXQgZkxpbmVQb3MgPSAwOworICBMb2FkZXIoc2l6ZS53aWR0aCwgZkxpbmVQb3MsIHRydWUpOworICBVcGRhdGVBbGlnbihzaXplLmhlaWdodCwgZkxpbmVQb3MpOworICBtX3BUYWJzdG9wQ29udGV4dC5yZXNldCgpOworICByZXR1cm4gZkxpbmVQb3M7Cit9CisKK2Jvb2wgQ1hGQV9UZXh0TGF5b3V0OjpMYXlvdXQoaW50MzJfdCBpQmxvY2spIHsKKyAgaWYgKCFtX3BMb2FkZXIgfHwgaUJsb2NrIDwgMCB8fCBpQmxvY2sgPj0gQ291bnRCbG9ja3MoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChtX3BMb2FkZXItPm1fZldpZHRoIDwgMSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzID0gLTE7CisgIG1faUxpbmVzID0gMDsKKyAgZmxvYXQgZkxpbmVQb3MgPSAwOworICBDWEZBX05vZGUqIHBOb2RlID0gbnVsbHB0cjsKKyAgQ0ZYX1NpemVGIHN6VGV4dChtX3BMb2FkZXItPm1fZldpZHRoLCBtX3BMb2FkZXItPm1fZkhlaWdodCk7CisgIGludDMyX3QgaUNvdW50ID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX0Jsb2Nrcyk7CisgIGludDMyX3QgaUJsb2Nrc0hlaWdodENvdW50ID0KKyAgICAgIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9wTG9hZGVyLT5tX0Jsb2Nrc0hlaWdodCk7CisgIGlCbG9ja3NIZWlnaHRDb3VudCAvPSAyOworICBpZiAoaUJsb2NrIDwgaUJsb2Nrc0hlaWdodENvdW50KQorICAgIHJldHVybiB0cnVlOworICBpZiAoaUJsb2NrID09IGlCbG9ja3NIZWlnaHRDb3VudCkgeworICAgIFVubG9hZCgpOworICAgIG1fcEJyZWFrID0gQ3JlYXRlQnJlYWsodHJ1ZSk7CisgICAgZkxpbmVQb3MgPSBtX3BMb2FkZXItPm1fZlN0YXJ0TGluZU9mZnNldDsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQmxvY2tzSGVpZ2h0Q291bnQ7IGkrKykKKyAgICAgIGZMaW5lUG9zIC09IG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHRbaSAqIDIgKyAxXTsKKworICAgIG1fcExvYWRlci0+bV9pQ2hhciA9IDA7CisgICAgaWYgKGlDb3VudCA+IDEpCisgICAgICBtX3BMb2FkZXItPm1faVRvdGFsTGluZXMgPSBtX0Jsb2Nrc1tpQmxvY2sgKiAyICsgMV07CisKKyAgICBMb2FkZXIoc3pUZXh0LndpZHRoLCBmTGluZVBvcywgdHJ1ZSk7CisgICAgaWYgKGlDb3VudCA9PSAwICYmIG1fcExvYWRlci0+bV9mU3RhcnRMaW5lT2Zmc2V0IDwgMC4xZikKKyAgICAgIFVwZGF0ZUFsaWduKHN6VGV4dC5oZWlnaHQsIGZMaW5lUG9zKTsKKyAgfSBlbHNlIGlmIChtX3BUZXh0RGF0YU5vZGUpIHsKKyAgICBpQmxvY2sgKj0gMjsKKyAgICBpZiAoaUJsb2NrIDwgaUNvdW50IC0gMikKKyAgICAgIG1fcExvYWRlci0+bV9pVG90YWxMaW5lcyA9IG1fQmxvY2tzW2lCbG9jayArIDFdOworCisgICAgbV9wQnJlYWstPlJlc2V0KCk7CisgICAgaWYgKG1fYlJpY2hUZXh0KSB7CisgICAgICBDRlhfWE1MTm9kZSogcENvbnRhaW5lck5vZGUgPSBHZXRYTUxDb250YWluZXJOb2RlKCk7CisgICAgICBpZiAoIXBDb250YWluZXJOb2RlKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgQ0ZYX1hNTE5vZGUqIHBYTUxOb2RlID0gbV9wTG9hZGVyLT5tX3BYTUxOb2RlOworICAgICAgaWYgKCFwWE1MTm9kZSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIENGWF9YTUxOb2RlKiBwU2F2ZVhNTE5vZGUgPSBtX3BMb2FkZXItPm1fcFhNTE5vZGU7CisgICAgICBmb3IgKDsgcFhNTE5vZGU7CisgICAgICAgICAgIHBYTUxOb2RlID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpOZXh0U2libGluZykpIHsKKyAgICAgICAgaWYgKCFMb2FkUmljaFRleHQocFhNTE5vZGUsIHN6VGV4dC53aWR0aCwgZkxpbmVQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcExvYWRlci0+bV9wUGFyZW50U3R5bGUsIHRydWUsIG51bGxwdHIpKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHdoaWxlICghcFhNTE5vZGUpIHsKKyAgICAgICAgcFhNTE5vZGUgPSBwU2F2ZVhNTE5vZGUtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpQYXJlbnQpOworICAgICAgICBpZiAocFhNTE5vZGUgPT0gcENvbnRhaW5lck5vZGUpCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmICghTG9hZFJpY2hUZXh0KHBYTUxOb2RlLCBzelRleHQud2lkdGgsIGZMaW5lUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BMb2FkZXItPm1fcFBhcmVudFN0eWxlLCB0cnVlLCBudWxscHRyLCBmYWxzZSkpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBwU2F2ZVhNTE5vZGUgPSBwWE1MTm9kZTsKKyAgICAgICAgcFhNTE5vZGUgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZYX1hNTE5vZGU6Ok5leHRTaWJsaW5nKTsKKyAgICAgICAgaWYgKCFwWE1MTm9kZSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZm9yICg7IHBYTUxOb2RlOworICAgICAgICAgICAgIHBYTUxOb2RlID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpOZXh0U2libGluZykpIHsKKyAgICAgICAgICBpZiAoIUxvYWRSaWNoVGV4dChwWE1MTm9kZSwgc3pUZXh0LndpZHRoLCBmTGluZVBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BMb2FkZXItPm1fcFBhcmVudFN0eWxlLCB0cnVlLCBudWxscHRyKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHBOb2RlID0gbV9wTG9hZGVyLT5tX3BOb2RlOworICAgICAgaWYgKCFwTm9kZSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBMb2FkVGV4dChwTm9kZSwgc3pUZXh0LndpZHRoLCBmTGluZVBvcywgdHJ1ZSk7CisgICAgfQorICB9CisgIGlmIChpQmxvY2sgPT0gaUNvdW50KSB7CisgICAgbV9wVGFic3RvcENvbnRleHQucmVzZXQoKTsKKyAgICBtX3BMb2FkZXIucmVzZXQoKTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDWEZBX1RleHRMYXlvdXQ6Okl0ZW1CbG9ja3MoY29uc3QgQ0ZYX1JlY3RGJiBydFRleHQsIGludDMyX3QgaUJsb2NrSW5kZXgpIHsKKyAgaWYgKCFtX3BMb2FkZXIpCisgICAgcmV0dXJuOworCisgIGludDMyX3QgaUNvdW50SGVpZ2h0ID0KKyAgICAgIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9wTG9hZGVyLT5tX2xpbmVIZWlnaHRzKTsKKyAgaWYgKGlDb3VudEhlaWdodCA9PSAwKQorICAgIHJldHVybjsKKworICBib29sIGJFbmRJdGVtID0gdHJ1ZTsKKyAgaW50MzJfdCBpQmxvY2tDb3VudCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9CbG9ja3MpOworICBmbG9hdCBmTGluZVBvcyA9IG1fcExvYWRlci0+bV9mU3RhcnRMaW5lT2Zmc2V0OworICBpbnQzMl90IGlMaW5lSW5kZXggPSAwOworICBpZiAoaUJsb2NrSW5kZXggPiAwKSB7CisgICAgaW50MzJfdCBpQmxvY2tIZWlnaHRDb3VudCA9CisgICAgICAgIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9wTG9hZGVyLT5tX0Jsb2Nrc0hlaWdodCk7CisgICAgaUJsb2NrSGVpZ2h0Q291bnQgLz0gMjsKKyAgICBpZiAoaUJsb2NrSGVpZ2h0Q291bnQgPj0gaUJsb2NrSW5kZXgpIHsKKyAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlCbG9ja0luZGV4OyBpKyspCisgICAgICAgIGZMaW5lUG9zIC09IG1fcExvYWRlci0+bV9CbG9ja3NIZWlnaHRbaSAqIDIgKyAxXTsKKyAgICB9IGVsc2UgeworICAgICAgZkxpbmVQb3MgPSAwOworICAgIH0KKyAgICBpTGluZUluZGV4ID0gbV9CbG9ja3NbaUJsb2NrQ291bnQgLSAxXSArIG1fQmxvY2tzW2lCbG9ja0NvdW50IC0gMl07CisgIH0KKworICBpbnQzMl90IGkgPSAwOworICBmb3IgKGkgPSBpTGluZUluZGV4OyBpIDwgaUNvdW50SGVpZ2h0OyBpKyspIHsKKyAgICBmbG9hdCBmTGluZUhlaWdodCA9IG1fcExvYWRlci0+bV9saW5lSGVpZ2h0c1tpXTsKKyAgICBpZiAoZkxpbmVQb3MgKyBmTGluZUhlaWdodCAtIHJ0VGV4dC5oZWlnaHQgPiAwLjAwMSkgeworICAgICAgbV9CbG9ja3MucHVzaF9iYWNrKGlMaW5lSW5kZXgpOworICAgICAgbV9CbG9ja3MucHVzaF9iYWNrKGkgLSBpTGluZUluZGV4KTsKKyAgICAgIGJFbmRJdGVtID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZkxpbmVQb3MgKz0gZkxpbmVIZWlnaHQ7CisgIH0KKyAgaWYgKGlDb3VudEhlaWdodCA+IDAgJiYgKGkgLSBpTGluZUluZGV4KSA+IDAgJiYgYkVuZEl0ZW0pIHsKKyAgICBtX0Jsb2Nrcy5wdXNoX2JhY2soaUxpbmVJbmRleCk7CisgICAgbV9CbG9ja3MucHVzaF9iYWNrKGkgLSBpTGluZUluZGV4KTsKKyAgfQorfQorCitib29sIENYRkFfVGV4dExheW91dDo6RHJhd1N0cmluZyhDRlhfUmVuZGVyRGV2aWNlKiBwRnhEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiB0bURvYzJEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0Q2xpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJsb2NrKSB7CisgIGlmICghcEZ4RGV2aWNlKQorICAgIHJldHVybiBmYWxzZTsKKworICBwRnhEZXZpY2UtPlNhdmVTdGF0ZSgpOworICBwRnhEZXZpY2UtPlNldENsaXBfUmVjdChydENsaXApOworCisgIGlmIChtX3BpZWNlTGluZXMuZW1wdHkoKSkgeworICAgIGludDMyX3QgaUJsb2NrQ291bnQgPSBDb3VudEJsb2NrcygpOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlCbG9ja0NvdW50OyBpKyspCisgICAgICBMYXlvdXQoaSk7CisgIH0KKworICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MgPSBudWxscHRyOworICBpbnQzMl90IGlDaGFyQ291bnQgPSAwOworICBpbnQzMl90IGlMaW5lU3RhcnQgPSAwOworICBpbnQzMl90IGlQaWVjZUxpbmVzID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX3BpZWNlTGluZXMpOworICBpbnQzMl90IGlDb3VudCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9CbG9ja3MpOworICBpZiAoaUNvdW50ID4gMCkgeworICAgIGlCbG9jayAqPSAyOworICAgIGlmIChpQmxvY2sgPCBpQ291bnQpIHsKKyAgICAgIGlMaW5lU3RhcnQgPSBtX0Jsb2Nrc1tpQmxvY2tdOworICAgICAgaVBpZWNlTGluZXMgPSBtX0Jsb2Nrc1tpQmxvY2sgKyAxXTsKKyAgICB9IGVsc2UgeworICAgICAgaVBpZWNlTGluZXMgPSAwOworICAgIH0KKyAgfQorCisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlQaWVjZUxpbmVzOyBpKyspIHsKKyAgICBpZiAoaSArIGlMaW5lU3RhcnQgPj0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX3BpZWNlTGluZXMpKQorICAgICAgYnJlYWs7CisKKyAgICBDWEZBX1BpZWNlTGluZSogcFBpZWNlTGluZSA9IG1fcGllY2VMaW5lc1tpICsgaUxpbmVTdGFydF0uZ2V0KCk7CisgICAgaW50MzJfdCBpUGllY2VzID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihwUGllY2VMaW5lLT5tX3RleHRQaWVjZXMpOworICAgIGludDMyX3QgaiA9IDA7CisgICAgZm9yIChqID0gMDsgaiA8IGlQaWVjZXM7IGorKykgeworICAgICAgY29uc3QgQ1hGQV9UZXh0UGllY2UqIHBQaWVjZSA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlc1tqXS5nZXQoKTsKKyAgICAgIGludDMyX3QgaUNoYXJzID0gcFBpZWNlLT5pQ2hhcnM7CisgICAgICBpZiAoaUNoYXJDb3VudCA8IGlDaGFycykgeworICAgICAgICBGWF9GcmVlKHBDaGFyUG9zKTsKKyAgICAgICAgcENoYXJQb3MgPSBGWF9BbGxvYyhGWFRFWFRfQ0hBUlBPUywgaUNoYXJzKTsKKyAgICAgICAgaUNoYXJDb3VudCA9IGlDaGFyczsKKyAgICAgIH0KKyAgICAgIG1lbXNldChwQ2hhclBvcywgMCwgaUNoYXJDb3VudCAqIHNpemVvZihGWFRFWFRfQ0hBUlBPUykpOworICAgICAgUmVuZGVyU3RyaW5nKHBGeERldmljZSwgcFBpZWNlTGluZSwgaiwgcENoYXJQb3MsIHRtRG9jMkRldmljZSk7CisgICAgfQorICAgIGZvciAoaiA9IDA7IGogPCBpUGllY2VzOyBqKyspCisgICAgICBSZW5kZXJQYXRoKHBGeERldmljZSwgcFBpZWNlTGluZSwgaiwgcENoYXJQb3MsIHRtRG9jMkRldmljZSk7CisgIH0KKyAgcEZ4RGV2aWNlLT5SZXN0b3JlU3RhdGUoZmFsc2UpOworICBGWF9GcmVlKHBDaGFyUG9zKTsKKyAgcmV0dXJuIGlQaWVjZUxpbmVzID4gMDsKK30KKwordm9pZCBDWEZBX1RleHRMYXlvdXQ6OlVwZGF0ZUFsaWduKGZsb2F0IGZIZWlnaHQsIGZsb2F0IGZCb3R0b20pIHsKKyAgZkhlaWdodCAtPSBmQm90dG9tOworICBpZiAoZkhlaWdodCA8IDAuMWYpCisgICAgcmV0dXJuOworCisgIHN3aXRjaCAobV90ZXh0UGFyc2VyLkdldFZBbGlnbihtX3BUZXh0UHJvdmlkZXIpKSB7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6TWlkZGxlOgorICAgICAgZkhlaWdodCAvPSAyLjBmOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6Qm90dG9tOgorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybjsKKyAgfQorCisgIGZvciAoY29uc3QgYXV0byYgcFBpZWNlTGluZSA6IG1fcGllY2VMaW5lcykgeworICAgIGZvciAoY29uc3QgYXV0byYgcFBpZWNlIDogcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzKQorICAgICAgcFBpZWNlLT5ydFBpZWNlLnRvcCArPSBmSGVpZ2h0OworICB9Cit9CisKK2Jvb2wgQ1hGQV9UZXh0TGF5b3V0OjpMb2FkZXIoZmxvYXQgdGV4dFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCYgZkxpbmVQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNhdmVQaWVjZXMpIHsKKyAgR2V0VGV4dERhdGFOb2RlKCk7CisgIGlmICghbV9wVGV4dERhdGFOb2RlKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChtX2JSaWNoVGV4dCkgeworICAgIENGWF9YTUxOb2RlKiBwWE1MQ29udGFpbmVyID0gR2V0WE1MQ29udGFpbmVyTm9kZSgpOworICAgIGlmIChwWE1MQ29udGFpbmVyKSB7CisgICAgICBpZiAoIW1fdGV4dFBhcnNlci5Jc1BhcnNlZCgpKQorICAgICAgICBtX3RleHRQYXJzZXIuRG9QYXJzZShwWE1MQ29udGFpbmVyLCBtX3BUZXh0UHJvdmlkZXIpOworCisgICAgICBhdXRvIHBSb290U3R5bGUgPSBtX3RleHRQYXJzZXIuQ3JlYXRlUm9vdFN0eWxlKG1fcFRleHRQcm92aWRlcik7CisgICAgICBMb2FkUmljaFRleHQocFhNTENvbnRhaW5lciwgdGV4dFdpZHRoLCBmTGluZVBvcywgcFJvb3RTdHlsZSwgYlNhdmVQaWVjZXMsCisgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgfQorICB9IGVsc2UgeworICAgIExvYWRUZXh0KG1fcFRleHREYXRhTm9kZSwgdGV4dFdpZHRoLCBmTGluZVBvcywgYlNhdmVQaWVjZXMpOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENYRkFfVGV4dExheW91dDo6TG9hZFRleHQoQ1hGQV9Ob2RlKiBwTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0ZXh0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQmIGZMaW5lUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNhdmVQaWVjZXMpIHsKKyAgSW5pdEJyZWFrKHRleHRXaWR0aCk7CisKKyAgQ1hGQV9QYXJhKiBwYXJhID0gbV9wVGV4dFByb3ZpZGVyLT5HZXRQYXJhSWZFeGlzdHMoKTsKKyAgZmxvYXQgZlNwYWNlQWJvdmUgPSAwOworICBpZiAocGFyYSkgeworICAgIGZTcGFjZUFib3ZlID0gcGFyYS0+R2V0U3BhY2VBYm92ZSgpOworICAgIGlmIChmU3BhY2VBYm92ZSA8IDAuMWYpCisgICAgICBmU3BhY2VBYm92ZSA9IDA7CisKKyAgICBzd2l0Y2ggKHBhcmEtPkdldFZlcnRpY2FsQWxpZ24oKSkgeworICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6VG9wOgorICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6TWlkZGxlOgorICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6Qm90dG9tOiB7CisgICAgICAgIGZMaW5lUG9zICs9IGZTcGFjZUFib3ZlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgV2lkZVN0cmluZyB3c1RleHQgPSBwTm9kZS0+SlNPYmplY3QoKS0+R2V0Q29udGVudChmYWxzZSk7CisgIHdzVGV4dC5UcmltUmlnaHQoTCIgIik7CisgIGJvb2wgYlJldCA9IEFwcGVuZENoYXIod3NUZXh0LCBmTGluZVBvcywgZlNwYWNlQWJvdmUsIGJTYXZlUGllY2VzKTsKKyAgaWYgKGJSZXQgJiYgbV9wTG9hZGVyKQorICAgIG1fcExvYWRlci0+bV9wTm9kZSA9IHBOb2RlOworICBlbHNlCisgICAgRW5kQnJlYWsoQ0ZYX0JyZWFrVHlwZTo6UGFyYWdyYXBoLCBmTGluZVBvcywgYlNhdmVQaWVjZXMpOworfQorCitib29sIENYRkFfVGV4dExheW91dDo6TG9hZFJpY2hUZXh0KAorICAgIENGWF9YTUxOb2RlKiBwWE1MTm9kZSwKKyAgICBmbG9hdCB0ZXh0V2lkdGgsCisgICAgZmxvYXQmIGZMaW5lUG9zLAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfQ1NTQ29tcHV0ZWRTdHlsZT4mIHBQYXJlbnRTdHlsZSwKKyAgICBib29sIGJTYXZlUGllY2VzLAorICAgIFJldGFpblB0cjxDWEZBX0xpbmtVc2VyRGF0YT4gcExpbmtEYXRhLAorICAgIGJvb2wgYkVuZEJyZWFrLAorICAgIGJvb2wgYklzT2wsCisgICAgaW50MzJfdCBpTGlDb3VudCkgeworICBpZiAoIXBYTUxOb2RlKQorICAgIHJldHVybiBmYWxzZTsKKworICBDWEZBX1RleHRQYXJzZUNvbnRleHQqIHBDb250ZXh0ID0KKyAgICAgIG1fdGV4dFBhcnNlci5HZXRQYXJzZUNvbnRleHRGcm9tTWFwKHBYTUxOb2RlKTsKKyAgQ0ZYX0NTU0Rpc3BsYXkgZURpc3BsYXkgPSBDRlhfQ1NTRGlzcGxheTo6Tm9uZTsKKyAgYm9vbCBiQ29udGVudE5vZGUgPSBmYWxzZTsKKyAgZmxvYXQgZlNwYWNlQmVsb3cgPSAwOworICBSZXRhaW5QdHI8Q0ZYX0NTU0NvbXB1dGVkU3R5bGU+IHBTdHlsZTsKKyAgV2lkZVN0cmluZyB3c05hbWU7CisgIGlmIChiRW5kQnJlYWspIHsKKyAgICBib29sIGJDdXJPbCA9IGZhbHNlOworICAgIGJvb2wgYkN1ckxpID0gZmFsc2U7CisgICAgQ0ZYX1hNTEVsZW1lbnQqIHBFbGVtZW50ID0gbnVsbHB0cjsKKyAgICBpZiAocENvbnRleHQpIHsKKyAgICAgIGlmIChtX2JCbG9ja0NvbnRpbnVlIHx8CisgICAgICAgICAgKG1fcExvYWRlciAmJiBwWE1MTm9kZSA9PSBtX3BMb2FkZXItPm1fcFhNTE5vZGUpKSB7CisgICAgICAgIG1fYkJsb2NrQ29udGludWUgPSB0cnVlOworICAgICAgfQorICAgICAgaWYgKHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRlhfWE1MTk9ERV9UZXh0KSB7CisgICAgICAgIGJDb250ZW50Tm9kZSA9IHRydWU7CisgICAgICB9IGVsc2UgaWYgKHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRlhfWE1MTk9ERV9FbGVtZW50KSB7CisgICAgICAgIHBFbGVtZW50ID0gc3RhdGljX2Nhc3Q8Q0ZYX1hNTEVsZW1lbnQqPihwWE1MTm9kZSk7CisgICAgICAgIHdzTmFtZSA9IHBFbGVtZW50LT5HZXRMb2NhbFRhZ05hbWUoKTsKKyAgICAgIH0KKyAgICAgIGlmICh3c05hbWUgPT0gTCJvbCIpIHsKKyAgICAgICAgYklzT2wgPSB0cnVlOworICAgICAgICBiQ3VyT2wgPSB0cnVlOworICAgICAgfQorICAgICAgaWYgKG1fYkJsb2NrQ29udGludWUgfHwgYkNvbnRlbnROb2RlID09IGZhbHNlKSB7CisgICAgICAgIGVEaXNwbGF5ID0gcENvbnRleHQtPkdldERpc3BsYXkoKTsKKyAgICAgICAgaWYgKGVEaXNwbGF5ICE9IENGWF9DU1NEaXNwbGF5OjpCbG9jayAmJgorICAgICAgICAgICAgZURpc3BsYXkgIT0gQ0ZYX0NTU0Rpc3BsYXk6OklubGluZSAmJgorICAgICAgICAgICAgZURpc3BsYXkgIT0gQ0ZYX0NTU0Rpc3BsYXk6Okxpc3RJdGVtKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwU3R5bGUgPSBtX3RleHRQYXJzZXIuQ29tcHV0ZVN0eWxlKHBYTUxOb2RlLCBwUGFyZW50U3R5bGUuR2V0KCkpOworICAgICAgICBJbml0QnJlYWsoYkNvbnRlbnROb2RlID8gcFBhcmVudFN0eWxlLkdldCgpIDogcFN0eWxlLkdldCgpLCBlRGlzcGxheSwKKyAgICAgICAgICAgICAgICAgIHRleHRXaWR0aCwgcFhNTE5vZGUsIHBQYXJlbnRTdHlsZS5HZXQoKSk7CisgICAgICAgIGlmICgoZURpc3BsYXkgPT0gQ0ZYX0NTU0Rpc3BsYXk6OkJsb2NrIHx8CisgICAgICAgICAgICAgZURpc3BsYXkgPT0gQ0ZYX0NTU0Rpc3BsYXk6Okxpc3RJdGVtKSAmJgorICAgICAgICAgICAgcFN0eWxlICYmCisgICAgICAgICAgICAod3NOYW1lLklzRW1wdHkoKSB8fCAod3NOYW1lICE9IEwiYm9keSIgJiYgd3NOYW1lICE9IEwiaHRtbCIgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c05hbWUgIT0gTCJvbCIgJiYgd3NOYW1lICE9IEwidWwiKSkpIHsKKyAgICAgICAgICBjb25zdCBDRlhfQ1NTUmVjdCogcFJlY3QgPSBwU3R5bGUtPkdldE1hcmdpbldpZHRoKCk7CisgICAgICAgICAgaWYgKHBSZWN0KSB7CisgICAgICAgICAgICBmTGluZVBvcyArPSBwUmVjdC0+dG9wLkdldFZhbHVlKCk7CisgICAgICAgICAgICBmU3BhY2VCZWxvdyA9IHBSZWN0LT5ib3R0b20uR2V0VmFsdWUoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAod3NOYW1lID09IEwiYSIpIHsKKyAgICAgICAgICBBU1NFUlQocEVsZW1lbnQpOworICAgICAgICAgIFdpZGVTdHJpbmcgd3NMaW5rQ29udGVudCA9IHBFbGVtZW50LT5HZXRTdHJpbmcoTCJocmVmIik7CisgICAgICAgICAgaWYgKCF3c0xpbmtDb250ZW50LklzRW1wdHkoKSkgeworICAgICAgICAgICAgcExpbmtEYXRhID0gcGRmaXVtOjpNYWtlUmV0YWluPENYRkFfTGlua1VzZXJEYXRhPigKKyAgICAgICAgICAgICAgICB3c0xpbmtDb250ZW50LkdldEJ1ZmZlcih3c0xpbmtDb250ZW50LkdldExlbmd0aCgpKSk7CisgICAgICAgICAgICB3c0xpbmtDb250ZW50LlJlbGVhc2VCdWZmZXIod3NMaW5rQ29udGVudC5HZXRMZW5ndGgoKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBpVGFiQ291bnQgPSBtX3RleHRQYXJzZXIuQ291bnRUYWJzKAorICAgICAgICAgICAgYkNvbnRlbnROb2RlID8gcFBhcmVudFN0eWxlLkdldCgpIDogcFN0eWxlLkdldCgpKTsKKyAgICAgICAgYm9vbCBiU3BhY2VSdW4gPSBtX3RleHRQYXJzZXIuSXNTcGFjZVJ1bigKKyAgICAgICAgICAgIGJDb250ZW50Tm9kZSA/IHBQYXJlbnRTdHlsZS5HZXQoKSA6IHBTdHlsZS5HZXQoKSk7CisgICAgICAgIFdpZGVTdHJpbmcgd3NUZXh0OworICAgICAgICBpZiAoYkNvbnRlbnROb2RlICYmIGlUYWJDb3VudCA9PSAwKSB7CisgICAgICAgICAgd3NUZXh0ID0gc3RhdGljX2Nhc3Q8Q0ZYX1hNTFRleHQqPihwWE1MTm9kZSktPkdldFRleHQoKTsKKyAgICAgICAgfSBlbHNlIGlmICh3c05hbWUgPT0gTCJiciIpIHsKKyAgICAgICAgICB3c1RleHQgPSBMJ1xuJzsKKyAgICAgICAgfSBlbHNlIGlmICh3c05hbWUgPT0gTCJsaSIpIHsKKyAgICAgICAgICBiQ3VyTGkgPSB0cnVlOworICAgICAgICAgIGlmIChiSXNPbCkKKyAgICAgICAgICAgIHdzVGV4dCA9IFdpZGVTdHJpbmc6OkZvcm1hdChMIiVkLiAgIiwgaUxpQ291bnQpOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHdzVGV4dCA9IDB4MDBCNyArIFdpZGVTdHJpbmdWaWV3KEwiICAiLCAxKTsKKyAgICAgICAgfSBlbHNlIGlmICghYkNvbnRlbnROb2RlKSB7CisgICAgICAgICAgaWYgKGlUYWJDb3VudCA+IDApIHsKKyAgICAgICAgICAgIHdoaWxlIChpVGFiQ291bnQtLSA+IDApCisgICAgICAgICAgICAgIHdzVGV4dCArPSBMJ1x0JzsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbV90ZXh0UGFyc2VyLkdldEVtYmJlZE9iaihtX3BUZXh0UHJvdmlkZXIsIHBYTUxOb2RlLCB3c1RleHQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsKKyAgICAgICAgaWYgKGlMZW5ndGggPiAwICYmIGJDb250ZW50Tm9kZSAmJiAhYlNwYWNlUnVuKQorICAgICAgICAgIFByb2Nlc3NUZXh0KHdzVGV4dCk7CisKKyAgICAgICAgaWYgKG1fcExvYWRlcikgeworICAgICAgICAgIGlmICh3c1RleHQuR2V0TGVuZ3RoKCkgPiAwICYmCisgICAgICAgICAgICAgIChtX3BMb2FkZXItPm1fZHdGbGFncyAmIFhGQV9MT0FERVJDTlRYVEZMR19GSUxURVJTUEFDRSkpIHsKKyAgICAgICAgICAgIHdzVGV4dC5UcmltTGVmdChMIiAiKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKENGWF9DU1NEaXNwbGF5OjpCbG9jayA9PSBlRGlzcGxheSkgeworICAgICAgICAgICAgbV9wTG9hZGVyLT5tX2R3RmxhZ3MgfD0gWEZBX0xPQURFUkNOVFhURkxHX0ZJTFRFUlNQQUNFOworICAgICAgICAgIH0gZWxzZSBpZiAoQ0ZYX0NTU0Rpc3BsYXk6OklubGluZSA9PSBlRGlzcGxheSAmJgorICAgICAgICAgICAgICAgICAgICAgKG1fcExvYWRlci0+bV9kd0ZsYWdzICYgWEZBX0xPQURFUkNOVFhURkxHX0ZJTFRFUlNQQUNFKSkgeworICAgICAgICAgICAgbV9wTG9hZGVyLT5tX2R3RmxhZ3MgJj0gflhGQV9MT0FERVJDTlRYVEZMR19GSUxURVJTUEFDRTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHdzVGV4dC5HZXRMZW5ndGgoKSA+IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICgweDIwID09IHdzVGV4dFt3c1RleHQuR2V0TGVuZ3RoKCkgLSAxXSkpIHsKKyAgICAgICAgICAgIG1fcExvYWRlci0+bV9kd0ZsYWdzIHw9IFhGQV9MT0FERVJDTlRYVEZMR19GSUxURVJTUEFDRTsKKyAgICAgICAgICB9IGVsc2UgaWYgKHdzVGV4dC5HZXRMZW5ndGgoKSAhPSAwKSB7CisgICAgICAgICAgICBtX3BMb2FkZXItPm1fZHdGbGFncyAmPSB+WEZBX0xPQURFUkNOVFhURkxHX0ZJTFRFUlNQQUNFOworICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh3c1RleHQuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgaWYgKCFtX3BMb2FkZXIgfHwgbV9wTG9hZGVyLT5tX2lDaGFyID09IDApIHsKKyAgICAgICAgICAgIGF1dG8gcFVzZXJEYXRhID0gcGRmaXVtOjpNYWtlUmV0YWluPENYRkFfVGV4dFVzZXJEYXRhPigKKyAgICAgICAgICAgICAgICBiQ29udGVudE5vZGUgPyBwUGFyZW50U3R5bGUgOiBwU3R5bGUsIHBMaW5rRGF0YSk7CisgICAgICAgICAgICBtX3BCcmVhay0+U2V0VXNlckRhdGEocFVzZXJEYXRhKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoQXBwZW5kQ2hhcih3c1RleHQsIGZMaW5lUG9zLCAwLCBiU2F2ZVBpZWNlcykpIHsKKyAgICAgICAgICAgIGlmIChtX3BMb2FkZXIpCisgICAgICAgICAgICAgIG1fcExvYWRlci0+bV9kd0ZsYWdzICY9IH5YRkFfTE9BREVSQ05UWFRGTEdfRklMVEVSU1BBQ0U7CisgICAgICAgICAgICBpZiAoSXNFbmQoYlNhdmVQaWVjZXMpKSB7CisgICAgICAgICAgICAgIGlmIChtX3BMb2FkZXIgJiYgbV9wTG9hZGVyLT5tX2lUb3RhbExpbmVzID4gLTEpIHsKKyAgICAgICAgICAgICAgICBtX3BMb2FkZXItPm1fcFhNTE5vZGUgPSBwWE1MTm9kZTsKKyAgICAgICAgICAgICAgICBtX3BMb2FkZXItPm1fcFBhcmVudFN0eWxlID0gcFBhcmVudFN0eWxlOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGZvciAoQ0ZYX1hNTE5vZGUqIHBDaGlsZE5vZGUgPQorICAgICAgICAgICAgIHBYTUxOb2RlLT5HZXROb2RlSXRlbShDRlhfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7CisgICAgICAgICBwQ2hpbGROb2RlOworICAgICAgICAgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpOZXh0U2libGluZykpIHsKKyAgICAgIGlmIChiQ3VyT2wpCisgICAgICAgIGlMaUNvdW50Kys7CisKKyAgICAgIGlmICghTG9hZFJpY2hUZXh0KHBDaGlsZE5vZGUsIHRleHRXaWR0aCwgZkxpbmVQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCA/IHBTdHlsZSA6IHBQYXJlbnRTdHlsZSwgYlNhdmVQaWVjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBwTGlua0RhdGEsIHRydWUsIGJJc09sLCBpTGlDb3VudCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobV9wTG9hZGVyKSB7CisgICAgICBpZiAoQ0ZYX0NTU0Rpc3BsYXk6OkJsb2NrID09IGVEaXNwbGF5KQorICAgICAgICBtX3BMb2FkZXItPm1fZHdGbGFncyB8PSBYRkFfTE9BREVSQ05UWFRGTEdfRklMVEVSU1BBQ0U7CisgICAgfQorICAgIGlmIChiQ3VyTGkpCisgICAgICBFbmRCcmVhayhDRlhfQnJlYWtUeXBlOjpMaW5lLCBmTGluZVBvcywgYlNhdmVQaWVjZXMpOworICB9IGVsc2UgeworICAgIGlmIChwQ29udGV4dCkKKyAgICAgIGVEaXNwbGF5ID0gcENvbnRleHQtPkdldERpc3BsYXkoKTsKKyAgfQorCisgIGlmIChtX2JCbG9ja0NvbnRpbnVlKSB7CisgICAgaWYgKHBDb250ZXh0ICYmICFiQ29udGVudE5vZGUpIHsKKyAgICAgIENGWF9CcmVha1R5cGUgZHdTdGF0dXMgPSAoZURpc3BsYXkgPT0gQ0ZYX0NTU0Rpc3BsYXk6OkJsb2NrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IENGWF9CcmVha1R5cGU6OlBhcmFncmFwaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENGWF9CcmVha1R5cGU6OlBpZWNlOworICAgICAgRW5kQnJlYWsoZHdTdGF0dXMsIGZMaW5lUG9zLCBiU2F2ZVBpZWNlcyk7CisgICAgICBpZiAoZURpc3BsYXkgPT0gQ0ZYX0NTU0Rpc3BsYXk6OkJsb2NrKSB7CisgICAgICAgIGZMaW5lUG9zICs9IGZTcGFjZUJlbG93OworICAgICAgICBpZiAobV9wVGFic3RvcENvbnRleHQpCisgICAgICAgICAgbV9wVGFic3RvcENvbnRleHQtPlJlbW92ZUFsbCgpOworICAgICAgfQorICAgICAgaWYgKElzRW5kKGJTYXZlUGllY2VzKSkgeworICAgICAgICBpZiAobV9wTG9hZGVyICYmIG1fcExvYWRlci0+bV9pVG90YWxMaW5lcyA+IC0xKSB7CisgICAgICAgICAgbV9wTG9hZGVyLT5tX3BYTUxOb2RlID0KKyAgICAgICAgICAgICAgcFhNTE5vZGUtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpOZXh0U2libGluZyk7CisgICAgICAgICAgbV9wTG9hZGVyLT5tX3BQYXJlbnRTdHlsZSA9IHBQYXJlbnRTdHlsZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIENYRkFfVGV4dExheW91dDo6QXBwZW5kQ2hhcihjb25zdCBXaWRlU3RyaW5nJiB3c1RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCYgZkxpbmVQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmU3BhY2VBYm92ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNhdmVQaWVjZXMpIHsKKyAgQ0ZYX0JyZWFrVHlwZSBkd1N0YXR1cyA9IENGWF9CcmVha1R5cGU6Ok5vbmU7CisgIGludDMyX3QgaUNoYXIgPSAwOworICBpZiAobV9wTG9hZGVyKQorICAgIGlDaGFyID0gbV9wTG9hZGVyLT5tX2lDaGFyOworCisgIGludDMyX3QgaUxlbmd0aCA9IHdzVGV4dC5HZXRMZW5ndGgoKTsKKyAgZm9yIChpbnQzMl90IGkgPSBpQ2hhcjsgaSA8IGlMZW5ndGg7IGkrKykgeworICAgIHdjaGFyX3Qgd2NoID0gd3NUZXh0W2ldOworICAgIGlmICh3Y2ggPT0gMHhBMCkKKyAgICAgIHdjaCA9IDB4MjA7CisKKyAgICBkd1N0YXR1cyA9IG1fcEJyZWFrLT5BcHBlbmRDaGFyKHdjaCk7CisgICAgaWYgKGR3U3RhdHVzICE9IENGWF9CcmVha1R5cGU6Ok5vbmUgJiYgZHdTdGF0dXMgIT0gQ0ZYX0JyZWFrVHlwZTo6UGllY2UpIHsKKyAgICAgIEFwcGVuZFRleHRMaW5lKGR3U3RhdHVzLCBmTGluZVBvcywgYlNhdmVQaWVjZXMpOworICAgICAgaWYgKElzRW5kKGJTYXZlUGllY2VzKSkgeworICAgICAgICBpZiAobV9wTG9hZGVyKQorICAgICAgICAgIG1fcExvYWRlci0+bV9pQ2hhciA9IGk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgaWYgKGR3U3RhdHVzID09IENGWF9CcmVha1R5cGU6OlBhcmFncmFwaCAmJiBtX2JSaWNoVGV4dCkKKyAgICAgICAgZkxpbmVQb3MgKz0gZlNwYWNlQWJvdmU7CisgICAgfQorICB9CisgIGlmIChtX3BMb2FkZXIpCisgICAgbV9wTG9hZGVyLT5tX2lDaGFyID0gMDsKKworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1hGQV9UZXh0TGF5b3V0OjpJc0VuZChib29sIGJTYXZlUGllY2VzKSB7CisgIGlmICghYlNhdmVQaWVjZXMpCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAobV9wTG9hZGVyICYmIG1fcExvYWRlci0+bV9pVG90YWxMaW5lcyA+IDApCisgICAgcmV0dXJuIG1faUxpbmVzID49IG1fcExvYWRlci0+bV9pVG90YWxMaW5lczsKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIENYRkFfVGV4dExheW91dDo6UHJvY2Vzc1RleHQoV2lkZVN0cmluZyYgd3NUZXh0KSB7CisgIGludDMyX3QgaUxlbiA9IHdzVGV4dC5HZXRMZW5ndGgoKTsKKyAgaWYgKGlMZW4gPT0gMCkKKyAgICByZXR1cm47CisKKyAgd2NoYXJfdCogcHN6ID0gd3NUZXh0LkdldEJ1ZmZlcihpTGVuKTsKKyAgaW50MzJfdCBpVHJpbUxlZnQgPSAwOworICB3Y2hhcl90IHdjaCA9IDAsIHdQcmV2ID0gMDsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxlbjsgaSsrKSB7CisgICAgd2NoID0gcHN6W2ldOworICAgIGlmICh3Y2ggPCAweDIwKQorICAgICAgd2NoID0gMHgyMDsKKyAgICBpZiAod2NoID09IDB4MjAgJiYgd1ByZXYgPT0gMHgyMCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgd1ByZXYgPSB3Y2g7CisgICAgcHN6W2lUcmltTGVmdCsrXSA9IHdjaDsKKyAgfQorICB3c1RleHQuUmVsZWFzZUJ1ZmZlcihpTGVuKTsKKyAgd3NUZXh0ID0gd3NUZXh0LkxlZnQoaVRyaW1MZWZ0KTsKK30KKwordm9pZCBDWEZBX1RleHRMYXlvdXQ6OkVuZEJyZWFrKENGWF9CcmVha1R5cGUgZHdTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQmIGZMaW5lUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNhdmVQaWVjZXMpIHsKKyAgZHdTdGF0dXMgPSBtX3BCcmVhay0+RW5kQnJlYWsoZHdTdGF0dXMpOworICBpZiAoZHdTdGF0dXMgIT0gQ0ZYX0JyZWFrVHlwZTo6Tm9uZSAmJiBkd1N0YXR1cyAhPSBDRlhfQnJlYWtUeXBlOjpQaWVjZSkKKyAgICBBcHBlbmRUZXh0TGluZShkd1N0YXR1cywgZkxpbmVQb3MsIGJTYXZlUGllY2VzLCB0cnVlKTsKK30KKwordm9pZCBDWEZBX1RleHRMYXlvdXQ6OkRvVGFic3RvcHMoQ0ZYX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfUGllY2VMaW5lKiBwUGllY2VMaW5lKSB7CisgIGlmICghcFN0eWxlIHx8ICFwUGllY2VMaW5lKQorICAgIHJldHVybjsKKworICBpZiAoIW1fcFRhYnN0b3BDb250ZXh0IHx8IG1fcFRhYnN0b3BDb250ZXh0LT5tX3RhYnN0b3BzLmVtcHR5KCkpCisgICAgcmV0dXJuOworCisgIGludDMyX3QgaVBpZWNlcyA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4ocFBpZWNlTGluZS0+bV90ZXh0UGllY2VzKTsKKyAgaWYgKGlQaWVjZXMgPT0gMCkKKyAgICByZXR1cm47CisKKyAgQ1hGQV9UZXh0UGllY2UqIHBQaWVjZSA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlc1tpUGllY2VzIC0gMV0uZ2V0KCk7CisgIGludDMyX3QmIGlUYWJzdG9wc0luZGV4ID0gbV9wVGFic3RvcENvbnRleHQtPm1faVRhYkluZGV4OworICBpbnQzMl90IGlDb3VudCA9IG1fdGV4dFBhcnNlci5Db3VudFRhYnMocFN0eWxlKTsKKyAgaWYgKCFwZGZpdW06OkluZGV4SW5Cb3VuZHMobV9wVGFic3RvcENvbnRleHQtPm1fdGFic3RvcHMsIGlUYWJzdG9wc0luZGV4KSkKKyAgICByZXR1cm47CisKKyAgaWYgKGlDb3VudCA+IDApIHsKKyAgICBpVGFic3RvcHNJbmRleCsrOworICAgIG1fcFRhYnN0b3BDb250ZXh0LT5tX2JUYWJzdG9wcyA9IHRydWU7CisgICAgZmxvYXQgZlJpZ2h0ID0gMDsKKyAgICBpZiAoaVBpZWNlcyA+IDEpIHsKKyAgICAgIENYRkFfVGV4dFBpZWNlKiBwID0gcFBpZWNlTGluZS0+bV90ZXh0UGllY2VzW2lQaWVjZXMgLSAyXS5nZXQoKTsKKyAgICAgIGZSaWdodCA9IHAtPnJ0UGllY2UucmlnaHQoKTsKKyAgICB9CisgICAgbV9wVGFic3RvcENvbnRleHQtPm1fZlRhYldpZHRoID0KKyAgICAgICAgcFBpZWNlLT5ydFBpZWNlLndpZHRoICsgcFBpZWNlLT5ydFBpZWNlLmxlZnQgLSBmUmlnaHQ7CisgIH0gZWxzZSBpZiAoaVRhYnN0b3BzSW5kZXggPiAtMSkgeworICAgIGZsb2F0IGZMZWZ0ID0gMDsKKyAgICBpZiAobV9wVGFic3RvcENvbnRleHQtPm1fYlRhYnN0b3BzKSB7CisgICAgICB1aW50MzJfdCBkd0FsaWduID0gbV9wVGFic3RvcENvbnRleHQtPm1fdGFic3RvcHNbaVRhYnN0b3BzSW5kZXhdLmR3QWxpZ247CisgICAgICBpZiAoZHdBbGlnbiA9PSBGWF9IYXNoQ29kZV9HZXRXKEwiY2VudGVyIiwgZmFsc2UpKSB7CisgICAgICAgIGZMZWZ0ID0gcFBpZWNlLT5ydFBpZWNlLndpZHRoIC8gMi4wZjsKKyAgICAgIH0gZWxzZSBpZiAoZHdBbGlnbiA9PSBGWF9IYXNoQ29kZV9HZXRXKEwicmlnaHQiLCBmYWxzZSkgfHwKKyAgICAgICAgICAgICAgICAgZHdBbGlnbiA9PSBGWF9IYXNoQ29kZV9HZXRXKEwiYmVmb3JlIiwgZmFsc2UpKSB7CisgICAgICAgIGZMZWZ0ID0gcFBpZWNlLT5ydFBpZWNlLndpZHRoOworICAgICAgfSBlbHNlIGlmIChkd0FsaWduID09IEZYX0hhc2hDb2RlX0dldFcoTCJkZWNpbWFsIiwgZmFsc2UpKSB7CisgICAgICAgIGludDMyX3QgaUNoYXJzID0gcFBpZWNlLT5pQ2hhcnM7CisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDaGFyczsgaSsrKSB7CisgICAgICAgICAgaWYgKHBQaWVjZS0+c3pUZXh0W2ldID09IEwnLicpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgIGZMZWZ0ICs9IHBQaWVjZS0+V2lkdGhzW2ldIC8gMjAwMDAuMGY7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG1fcFRhYnN0b3BDb250ZXh0LT5tX2ZMZWZ0ID0KKyAgICAgICAgICBzdGQ6Om1pbihmTGVmdCwgbV9wVGFic3RvcENvbnRleHQtPm1fZlRhYldpZHRoKTsKKyAgICAgIG1fcFRhYnN0b3BDb250ZXh0LT5tX2JUYWJzdG9wcyA9IGZhbHNlOworICAgICAgbV9wVGFic3RvcENvbnRleHQtPm1fZlRhYldpZHRoID0gMDsKKyAgICB9CisgICAgcFBpZWNlLT5ydFBpZWNlLmxlZnQgLT0gbV9wVGFic3RvcENvbnRleHQtPm1fZkxlZnQ7CisgIH0KK30KKwordm9pZCBDWEZBX1RleHRMYXlvdXQ6OkFwcGVuZFRleHRMaW5lKENGWF9CcmVha1R5cGUgZHdTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQmIGZMaW5lUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNhdmVQaWVjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRW5kQnJlYWspIHsKKyAgaW50MzJfdCBpUGllY2VzID0gbV9wQnJlYWstPkNvdW50QnJlYWtQaWVjZXMoKTsKKyAgaWYgKGlQaWVjZXMgPCAxKQorICAgIHJldHVybjsKKworICBSZXRhaW5QdHI8Q0ZYX0NTU0NvbXB1dGVkU3R5bGU+IHBTdHlsZTsKKyAgaWYgKGJTYXZlUGllY2VzKSB7CisgICAgYXV0byBwTmV3ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfUGllY2VMaW5lPigpOworICAgIENYRkFfUGllY2VMaW5lKiBwUGllY2VMaW5lID0gcE5ldy5nZXQoKTsKKyAgICBtX3BpZWNlTGluZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShwTmV3KSk7CisgICAgaWYgKG1fcFRhYnN0b3BDb250ZXh0KQorICAgICAgbV9wVGFic3RvcENvbnRleHQtPlJlc2V0KCk7CisKKyAgICBmbG9hdCBmTGluZVN0ZXAgPSAwLCBmQmFzZUxpbmUgPSAwOworICAgIGludDMyX3QgaSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGlQaWVjZXM7IGkrKykgeworICAgICAgY29uc3QgQ0ZYX0JyZWFrUGllY2UqIHBQaWVjZSA9IG1fcEJyZWFrLT5HZXRCcmVha1BpZWNlVW5zdGFibGUoaSk7CisgICAgICBDWEZBX1RleHRVc2VyRGF0YSogcFVzZXJEYXRhID0gcFBpZWNlLT5tX3BVc2VyRGF0YS5HZXQoKTsKKyAgICAgIGlmIChwVXNlckRhdGEpCisgICAgICAgIHBTdHlsZSA9IHBVc2VyRGF0YS0+bV9wU3R5bGU7CisgICAgICBmbG9hdCBmVmVyU2NhbGUgPSBwUGllY2UtPm1faVZlcnRpY2FsU2NhbGUgLyAxMDAuMGY7CisKKyAgICAgIGF1dG8gcFRQID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfVGV4dFBpZWNlPigpOworICAgICAgcFRQLT5pQ2hhcnMgPSBwUGllY2UtPm1faUNoYXJzOworICAgICAgcFRQLT5zelRleHQgPSBwUGllY2UtPkdldFN0cmluZygpOworICAgICAgcFRQLT5XaWR0aHMgPSBwUGllY2UtPkdldFdpZHRocygpOworICAgICAgcFRQLT5pQmlkaUxldmVsID0gcFBpZWNlLT5tX2lCaWRpTGV2ZWw7CisgICAgICBwVFAtPmlIb3JTY2FsZSA9IHBQaWVjZS0+bV9pSG9yaXpvbnRhbFNjYWxlOworICAgICAgcFRQLT5pVmVyU2NhbGUgPSBwUGllY2UtPm1faVZlcnRpY2FsU2NhbGU7CisgICAgICBtX3RleHRQYXJzZXIuR2V0VW5kZXJsaW5lKG1fcFRleHRQcm92aWRlciwgcFN0eWxlLkdldCgpLCBwVFAtPmlVbmRlcmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUUC0+aVBlcmlvZCk7CisgICAgICBtX3RleHRQYXJzZXIuR2V0TGluZXRocm91Z2gobV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUuR2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRQLT5pTGluZVRocm91Z2gpOworICAgICAgcFRQLT5kd0NvbG9yID0gbV90ZXh0UGFyc2VyLkdldENvbG9yKG1fcFRleHRQcm92aWRlciwgcFN0eWxlLkdldCgpKTsKKyAgICAgIHBUUC0+cEZvbnQgPSBtX3RleHRQYXJzZXIuR2V0Rm9udChtX3BEb2MsIG1fcFRleHRQcm92aWRlciwgcFN0eWxlLkdldCgpKTsKKyAgICAgIHBUUC0+ZkZvbnRTaXplID0gbV90ZXh0UGFyc2VyLkdldEZvbnRTaXplKG1fcFRleHRQcm92aWRlciwgcFN0eWxlLkdldCgpKTsKKyAgICAgIHBUUC0+cnRQaWVjZS5sZWZ0ID0gcFBpZWNlLT5tX2lTdGFydFBvcyAvIDIwMDAwLjBmOworICAgICAgcFRQLT5ydFBpZWNlLndpZHRoID0gcFBpZWNlLT5tX2lXaWR0aCAvIDIwMDAwLjBmOworICAgICAgcFRQLT5ydFBpZWNlLmhlaWdodCA9IChmbG9hdClwUGllY2UtPm1faUZvbnRTaXplICogZlZlclNjYWxlIC8gMjAuMGY7CisgICAgICBmbG9hdCBmQmFzZUxpbmVUZW1wID0KKyAgICAgICAgICBtX3RleHRQYXJzZXIuR2V0QmFzZWxpbmUobV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUuR2V0KCkpOworICAgICAgcFRQLT5ydFBpZWNlLnRvcCA9IGZCYXNlTGluZVRlbXA7CisKKyAgICAgIGZsb2F0IGZMaW5lSGVpZ2h0ID0gbV90ZXh0UGFyc2VyLkdldExpbmVIZWlnaHQoCisgICAgICAgICAgbV9wVGV4dFByb3ZpZGVyLCBwU3R5bGUuR2V0KCksIG1faUxpbmVzID09IDAsIGZWZXJTY2FsZSk7CisgICAgICBpZiAoZkJhc2VMaW5lVGVtcCA+IDApIHsKKyAgICAgICAgZmxvYXQgZkxpbmVIZWlnaHRUbXAgPSBmQmFzZUxpbmVUZW1wICsgcFRQLT5ydFBpZWNlLmhlaWdodDsKKyAgICAgICAgaWYgKGZMaW5lSGVpZ2h0IDwgZkxpbmVIZWlnaHRUbXApCisgICAgICAgICAgZkxpbmVIZWlnaHQgPSBmTGluZUhlaWdodFRtcDsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZCYXNlTGluZVRlbXAgPSAwOworICAgICAgfSBlbHNlIGlmIChmQmFzZUxpbmUgPCAtZkJhc2VMaW5lVGVtcCkgeworICAgICAgICBmQmFzZUxpbmUgPSAtZkJhc2VMaW5lVGVtcDsKKyAgICAgIH0KKyAgICAgIGZMaW5lU3RlcCA9IHN0ZDo6bWF4KGZMaW5lU3RlcCwgZkxpbmVIZWlnaHQpOworICAgICAgcFRQLT5wTGlua0RhdGEgPSBwVXNlckRhdGEgPyBwVXNlckRhdGEtPm1fcExpbmtEYXRhIDogbnVsbHB0cjsKKyAgICAgIHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcy5wdXNoX2JhY2soc3RkOjptb3ZlKHBUUCkpOworICAgICAgRG9UYWJzdG9wcyhwU3R5bGUuR2V0KCksIHBQaWVjZUxpbmUpOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIHBUUCA6IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcykgeworICAgICAgZmxvYXQmIGZUb3AgPSBwVFAtPnJ0UGllY2UudG9wOworICAgICAgZmxvYXQgZkJhc2VMaW5lVGVtcCA9IGZUb3A7CisgICAgICBmVG9wID0gZkxpbmVQb3MgKyBmTGluZVN0ZXAgLSBwVFAtPnJ0UGllY2UuaGVpZ2h0IC0gZkJhc2VMaW5lVGVtcDsKKyAgICAgIGZUb3AgPSBzdGQ6Om1heCgwLjBmLCBmVG9wKTsKKyAgICB9CisgICAgZkxpbmVQb3MgKz0gZkxpbmVTdGVwICsgZkJhc2VMaW5lOworICB9IGVsc2UgeworICAgIGZsb2F0IGZMaW5lU3RlcCA9IDA7CisgICAgZmxvYXQgZkxpbmVXaWR0aCA9IDA7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVBpZWNlczsgaSsrKSB7CisgICAgICBjb25zdCBDRlhfQnJlYWtQaWVjZSogcFBpZWNlID0gbV9wQnJlYWstPkdldEJyZWFrUGllY2VVbnN0YWJsZShpKTsKKyAgICAgIENYRkFfVGV4dFVzZXJEYXRhKiBwVXNlckRhdGEgPSBwUGllY2UtPm1fcFVzZXJEYXRhLkdldCgpOworICAgICAgaWYgKHBVc2VyRGF0YSkKKyAgICAgICAgcFN0eWxlID0gcFVzZXJEYXRhLT5tX3BTdHlsZTsKKyAgICAgIGZsb2F0IGZWZXJTY2FsZSA9IHBQaWVjZS0+bV9pVmVydGljYWxTY2FsZSAvIDEwMC4wZjsKKyAgICAgIGZsb2F0IGZCYXNlTGluZSA9IG1fdGV4dFBhcnNlci5HZXRCYXNlbGluZShtX3BUZXh0UHJvdmlkZXIsIHBTdHlsZS5HZXQoKSk7CisgICAgICBmbG9hdCBmTGluZUhlaWdodCA9IG1fdGV4dFBhcnNlci5HZXRMaW5lSGVpZ2h0KAorICAgICAgICAgIG1fcFRleHRQcm92aWRlciwgcFN0eWxlLkdldCgpLCBtX2lMaW5lcyA9PSAwLCBmVmVyU2NhbGUpOworICAgICAgaWYgKGZCYXNlTGluZSA+IDApIHsKKyAgICAgICAgZmxvYXQgZkxpbmVIZWlnaHRUbXAgPQorICAgICAgICAgICAgZkJhc2VMaW5lICsgKGZsb2F0KXBQaWVjZS0+bV9pRm9udFNpemUgKiBmVmVyU2NhbGUgLyAyMC4wZjsKKyAgICAgICAgaWYgKGZMaW5lSGVpZ2h0IDwgZkxpbmVIZWlnaHRUbXApIHsKKyAgICAgICAgICBmTGluZUhlaWdodCA9IGZMaW5lSGVpZ2h0VG1wOworICAgICAgICB9CisgICAgICB9CisgICAgICBmTGluZVN0ZXAgPSBzdGQ6Om1heChmTGluZVN0ZXAsIGZMaW5lSGVpZ2h0KTsKKyAgICAgIGZMaW5lV2lkdGggKz0gcFBpZWNlLT5tX2lXaWR0aCAvIDIwMDAwLjBmOworICAgIH0KKyAgICBmTGluZVBvcyArPSBmTGluZVN0ZXA7CisgICAgbV9mTWF4V2lkdGggPSBzdGQ6Om1heChtX2ZNYXhXaWR0aCwgZkxpbmVXaWR0aCk7CisgICAgaWYgKG1fcExvYWRlciAmJiBtX3BMb2FkZXItPm1fYlNhdmVMaW5lSGVpZ2h0KSB7CisgICAgICBmbG9hdCBmSGVpZ2h0ID0gZkxpbmVQb3MgLSBtX3BMb2FkZXItPm1fZkxhc3RQb3M7CisgICAgICBtX3BMb2FkZXItPm1fZkxhc3RQb3MgPSBmTGluZVBvczsKKyAgICAgIG1fcExvYWRlci0+bV9saW5lSGVpZ2h0cy5wdXNoX2JhY2soZkhlaWdodCk7CisgICAgfQorICB9CisKKyAgbV9wQnJlYWstPkNsZWFyQnJlYWtQaWVjZXMoKTsKKyAgaWYgKGR3U3RhdHVzID09IENGWF9CcmVha1R5cGU6OlBhcmFncmFwaCkgeworICAgIG1fcEJyZWFrLT5SZXNldCgpOworICAgIGlmICghcFN0eWxlICYmIGJFbmRCcmVhaykgeworICAgICAgQ1hGQV9QYXJhKiBwYXJhID0gbV9wVGV4dFByb3ZpZGVyLT5HZXRQYXJhSWZFeGlzdHMoKTsKKyAgICAgIGlmIChwYXJhKSB7CisgICAgICAgIGZsb2F0IGZTdGFydFBvcyA9IHBhcmEtPkdldE1hcmdpbkxlZnQoKTsKKyAgICAgICAgZmxvYXQgZkluZGVudCA9IHBhcmEtPkdldFRleHRJbmRlbnQoKTsKKyAgICAgICAgaWYgKGZJbmRlbnQgPiAwKQorICAgICAgICAgIGZTdGFydFBvcyArPSBmSW5kZW50OworCisgICAgICAgIGZsb2F0IGZTcGFjZUJlbG93ID0gcGFyYS0+R2V0U3BhY2VCZWxvdygpOworICAgICAgICBpZiAoZlNwYWNlQmVsb3cgPCAwLjFmKQorICAgICAgICAgIGZTcGFjZUJlbG93ID0gMDsKKworICAgICAgICBtX3BCcmVhay0+U2V0TGluZVN0YXJ0UG9zKGZTdGFydFBvcyk7CisgICAgICAgIGZMaW5lUG9zICs9IGZTcGFjZUJlbG93OworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChwU3R5bGUpIHsKKyAgICBmbG9hdCBmU3RhcnQgPSAwOworICAgIGNvbnN0IENGWF9DU1NSZWN0KiBwUmVjdCA9IHBTdHlsZS0+R2V0TWFyZ2luV2lkdGgoKTsKKyAgICBpZiAocFJlY3QpCisgICAgICBmU3RhcnQgPSBwUmVjdC0+bGVmdC5HZXRWYWx1ZSgpOworCisgICAgZmxvYXQgZlRleHRJbmRlbnQgPSBwU3R5bGUtPkdldFRleHRJbmRlbnQoKS5HZXRWYWx1ZSgpOworICAgIGlmIChmVGV4dEluZGVudCA8IDApCisgICAgICBmU3RhcnQgLT0gZlRleHRJbmRlbnQ7CisKKyAgICBtX3BCcmVhay0+U2V0TGluZVN0YXJ0UG9zKGZTdGFydCk7CisgIH0KKyAgbV9pTGluZXMrKzsKK30KKwordm9pZCBDWEZBX1RleHRMYXlvdXQ6OlJlbmRlclN0cmluZyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1BpZWNlTGluZSogcFBpZWNlTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUGllY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgdG1Eb2MyRGV2aWNlKSB7CisgIGNvbnN0IENYRkFfVGV4dFBpZWNlKiBwUGllY2UgPSBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXNbaVBpZWNlXS5nZXQoKTsKKyAgaW50MzJfdCBpQ291bnQgPSBHZXREaXNwbGF5UG9zKHBQaWVjZSwgcENoYXJQb3MpOworICBpZiAoaUNvdW50ID4gMCkgeworICAgIENGREVfVGV4dE91dDo6RHJhd1N0cmluZyhwRGV2aWNlLCBwUGllY2UtPmR3Q29sb3IsIHBQaWVjZS0+cEZvbnQsIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpQ291bnQsIHBQaWVjZS0+ZkZvbnRTaXplLCAmdG1Eb2MyRGV2aWNlKTsKKyAgfQorICBwUGllY2VMaW5lLT5tX2NoYXJDb3VudHMucHVzaF9iYWNrKGlDb3VudCk7Cit9CisKK3ZvaWQgQ1hGQV9UZXh0TGF5b3V0OjpSZW5kZXJQYXRoKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1BpZWNlTGluZSogcFBpZWNlTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBpZWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgdG1Eb2MyRGV2aWNlKSB7CisgIENYRkFfVGV4dFBpZWNlKiBwUGllY2UgPSBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXNbaVBpZWNlXS5nZXQoKTsKKyAgYm9vbCBiTm9VbmRlcmxpbmUgPSBwUGllY2UtPmlVbmRlcmxpbmUgPCAxIHx8IHBQaWVjZS0+aVVuZGVybGluZSA+IDI7CisgIGJvb2wgYk5vTGluZVRocm91Z2ggPSBwUGllY2UtPmlMaW5lVGhyb3VnaCA8IDEgfHwgcFBpZWNlLT5pTGluZVRocm91Z2ggPiAyOworICBpZiAoYk5vVW5kZXJsaW5lICYmIGJOb0xpbmVUaHJvdWdoKQorICAgIHJldHVybjsKKworICBDRlhfUGF0aERhdGEgcGF0aDsKKyAgaW50MzJfdCBpQ2hhcnMgPSBHZXREaXNwbGF5UG9zKHBQaWVjZSwgcENoYXJQb3MpOworICBpZiAoaUNoYXJzID4gMCkgeworICAgIENGWF9Qb2ludEYgcHQxLCBwdDI7CisgICAgZmxvYXQgZkVuZFkgPSBwQ2hhclBvc1swXS5tX09yaWdpbi55ICsgMS4wNWY7CisgICAgaWYgKHBQaWVjZS0+aVBlcmlvZCA9PSBYRkFfQXR0cmlidXRlRW51bTo6V29yZCkgeworICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcFBpZWNlLT5pVW5kZXJsaW5lOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaUNoYXJzOyBqKyspIHsKKyAgICAgICAgICBwdDEueCA9IHBDaGFyUG9zW2pdLm1fT3JpZ2luLng7CisgICAgICAgICAgcHQyLnggPQorICAgICAgICAgICAgICBwdDEueCArIHBDaGFyUG9zW2pdLm1fRm9udENoYXJXaWR0aCAqIHBQaWVjZS0+ZkZvbnRTaXplIC8gMTAwMC4wZjsKKyAgICAgICAgICBwdDEueSA9IHB0Mi55ID0gZkVuZFk7CisgICAgICAgICAgcGF0aC5BcHBlbmRMaW5lKHB0MSwgcHQyKTsKKyAgICAgICAgfQorICAgICAgICBmRW5kWSArPSAyLjBmOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBwdDEueCA9IHBDaGFyUG9zWzBdLm1fT3JpZ2luLng7CisgICAgICBwdDIueCA9CisgICAgICAgICAgcENoYXJQb3NbaUNoYXJzIC0gMV0ubV9PcmlnaW4ueCArCisgICAgICAgICAgcENoYXJQb3NbaUNoYXJzIC0gMV0ubV9Gb250Q2hhcldpZHRoICogcFBpZWNlLT5mRm9udFNpemUgLyAxMDAwLjBmOworICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcFBpZWNlLT5pVW5kZXJsaW5lOyBpKyspIHsKKyAgICAgICAgcHQxLnkgPSBwdDIueSA9IGZFbmRZOworICAgICAgICBwYXRoLkFwcGVuZExpbmUocHQxLCBwdDIpOworICAgICAgICBmRW5kWSArPSAyLjBmOworICAgICAgfQorICAgIH0KKyAgICBmRW5kWSA9IHBDaGFyUG9zWzBdLm1fT3JpZ2luLnkgLSBwUGllY2UtPnJ0UGllY2UuaGVpZ2h0ICogMC4yNWY7CisgICAgcHQxLnggPSBwQ2hhclBvc1swXS5tX09yaWdpbi54OworICAgIHB0Mi54ID0gcENoYXJQb3NbaUNoYXJzIC0gMV0ubV9PcmlnaW4ueCArCisgICAgICAgICAgICBwQ2hhclBvc1tpQ2hhcnMgLSAxXS5tX0ZvbnRDaGFyV2lkdGggKiBwUGllY2UtPmZGb250U2l6ZSAvIDEwMDAuMGY7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcFBpZWNlLT5pTGluZVRocm91Z2g7IGkrKykgeworICAgICAgcHQxLnkgPSBwdDIueSA9IGZFbmRZOworICAgICAgcGF0aC5BcHBlbmRMaW5lKHB0MSwgcHQyKTsKKyAgICAgIGZFbmRZICs9IDIuMGY7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChiTm9MaW5lVGhyb3VnaCAmJgorICAgICAgICAoYk5vVW5kZXJsaW5lIHx8IHBQaWVjZS0+aVBlcmlvZCAhPSBYRkFfQXR0cmlidXRlRW51bTo6QWxsKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQzMl90IGlDaGFyc1RtcCA9IDA7CisgICAgaW50MzJfdCBpUGllY2VQcmV2ID0gaVBpZWNlOworICAgIGludDMyX3QgaVBpZWNlTmV4dCA9IGlQaWVjZTsKKyAgICB3aGlsZSAoaVBpZWNlUHJldiA+IDApIHsKKyAgICAgIGlQaWVjZVByZXYtLTsKKyAgICAgIGlDaGFyc1RtcCA9IHBQaWVjZUxpbmUtPm1fY2hhckNvdW50c1tpUGllY2VQcmV2XTsKKyAgICAgIGlmIChpQ2hhcnNUbXAgPiAwKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKGlDaGFyc1RtcCA9PSAwKQorICAgICAgcmV0dXJuOworCisgICAgaUNoYXJzVG1wID0gMDsKKyAgICBpbnQzMl90IGlQaWVjZXMgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlcyk7CisgICAgd2hpbGUgKGlQaWVjZU5leHQgPCBpUGllY2VzIC0gMSkgeworICAgICAgaVBpZWNlTmV4dCsrOworICAgICAgaUNoYXJzVG1wID0gcFBpZWNlTGluZS0+bV9jaGFyQ291bnRzW2lQaWVjZU5leHRdOworICAgICAgaWYgKGlDaGFyc1RtcCA+IDApCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoaUNoYXJzVG1wID09IDApCisgICAgICByZXR1cm47CisKKyAgICBmbG9hdCBmT3JnWCA9IDAuMGY7CisgICAgZmxvYXQgZkVuZFggPSAwLjBmOworICAgIHBQaWVjZSA9IHBQaWVjZUxpbmUtPm1fdGV4dFBpZWNlc1tpUGllY2VQcmV2XS5nZXQoKTsKKyAgICBpQ2hhcnMgPSBHZXREaXNwbGF5UG9zKHBQaWVjZSwgcENoYXJQb3MpOworICAgIGlmIChpQ2hhcnMgPCAxKQorICAgICAgcmV0dXJuOworCisgICAgZk9yZ1ggPSBwQ2hhclBvc1tpQ2hhcnMgLSAxXS5tX09yaWdpbi54ICsKKyAgICAgICAgICAgIHBDaGFyUG9zW2lDaGFycyAtIDFdLm1fRm9udENoYXJXaWR0aCAqIHBQaWVjZS0+ZkZvbnRTaXplIC8gMTAwMC4wZjsKKyAgICBwUGllY2UgPSBwUGllY2VMaW5lLT5tX3RleHRQaWVjZXNbaVBpZWNlTmV4dF0uZ2V0KCk7CisgICAgaUNoYXJzID0gR2V0RGlzcGxheVBvcyhwUGllY2UsIHBDaGFyUG9zKTsKKyAgICBpZiAoaUNoYXJzIDwgMSkKKyAgICAgIHJldHVybjsKKworICAgIGZFbmRYID0gcENoYXJQb3NbMF0ubV9PcmlnaW4ueDsKKyAgICBDRlhfUG9pbnRGIHB0MTsKKyAgICBDRlhfUG9pbnRGIHB0MjsKKyAgICBwdDEueCA9IGZPcmdYOworICAgIHB0Mi54ID0gZkVuZFg7CisgICAgZmxvYXQgZkVuZFkgPSBwQ2hhclBvc1swXS5tX09yaWdpbi55ICsgMS4wNWY7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcFBpZWNlLT5pVW5kZXJsaW5lOyBpKyspIHsKKyAgICAgIHB0MS55ID0gZkVuZFk7CisgICAgICBwdDIueSA9IGZFbmRZOworICAgICAgcGF0aC5BcHBlbmRMaW5lKHB0MSwgcHQyKTsKKyAgICAgIGZFbmRZICs9IDIuMGY7CisgICAgfQorICAgIGZFbmRZID0gcENoYXJQb3NbMF0ubV9PcmlnaW4ueSAtIHBQaWVjZS0+cnRQaWVjZS5oZWlnaHQgKiAwLjI1ZjsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwUGllY2UtPmlMaW5lVGhyb3VnaDsgaSsrKSB7CisgICAgICBwdDEueSA9IGZFbmRZOworICAgICAgcHQyLnkgPSBmRW5kWTsKKyAgICAgIHBhdGguQXBwZW5kTGluZShwdDEsIHB0Mik7CisgICAgICBmRW5kWSArPSAyLjBmOworICAgIH0KKyAgfQorCisgIENGWF9HcmFwaFN0YXRlRGF0YSBncmFwaFN0YXRlOworICBncmFwaFN0YXRlLm1fTGluZUNhcCA9IENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcEJ1dHQ7CisgIGdyYXBoU3RhdGUubV9MaW5lSm9pbiA9IENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUpvaW5NaXRlcjsKKyAgZ3JhcGhTdGF0ZS5tX0xpbmVXaWR0aCA9IDE7CisgIGdyYXBoU3RhdGUubV9NaXRlckxpbWl0ID0gMTA7CisgIGdyYXBoU3RhdGUubV9EYXNoUGhhc2UgPSAwOworICBwRGV2aWNlLT5EcmF3UGF0aCgmcGF0aCwgJnRtRG9jMkRldmljZSwgJmdyYXBoU3RhdGUsIDAsIHBQaWVjZS0+ZHdDb2xvciwgMCk7Cit9CisKK2ludDMyX3QgQ1hGQV9UZXh0TGF5b3V0OjpHZXREaXNwbGF5UG9zKGNvbnN0IENYRkFfVGV4dFBpZWNlKiBwUGllY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJDaGFyQ29kZSkgeworICBpZiAoIXBQaWVjZSkKKyAgICByZXR1cm4gMDsKKworICBGWF9SVEZURVhUT0JKIHRyOworICBpZiAoIVRvUnVuKHBQaWVjZSwgJnRyKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIG1fcEJyZWFrLT5HZXREaXNwbGF5UG9zKCZ0ciwgcENoYXJQb3MsIGJDaGFyQ29kZSk7Cit9CisKK2Jvb2wgQ1hGQV9UZXh0TGF5b3V0OjpUb1J1bihjb25zdCBDWEZBX1RleHRQaWVjZSogcFBpZWNlLCBGWF9SVEZURVhUT0JKKiB0cikgeworICBpbnQzMl90IGlMZW5ndGggPSBwUGllY2UtPmlDaGFyczsKKyAgaWYgKGlMZW5ndGggPCAxKQorICAgIHJldHVybiBmYWxzZTsKKworICB0ci0+cFN0ciA9IHBQaWVjZS0+c3pUZXh0OworICB0ci0+cEZvbnQgPSBwUGllY2UtPnBGb250OworICB0ci0+cFJlY3QgPSAmcFBpZWNlLT5ydFBpZWNlOworICB0ci0+cFdpZHRocyA9IHBQaWVjZS0+V2lkdGhzOworICB0ci0+aUxlbmd0aCA9IGlMZW5ndGg7CisgIHRyLT5mRm9udFNpemUgPSBwUGllY2UtPmZGb250U2l6ZTsKKyAgdHItPmlCaWRpTGV2ZWwgPSBwUGllY2UtPmlCaWRpTGV2ZWw7CisgIHRyLT53TGluZUJyZWFrQ2hhciA9IEwnXG4nOworICB0ci0+aVZlcnRpY2FsU2NhbGUgPSBwUGllY2UtPmlWZXJTY2FsZTsKKyAgdHItPmlIb3Jpem9udGFsU2NhbGUgPSBwUGllY2UtPmlIb3JTY2FsZTsKKyAgcmV0dXJuIHRydWU7Cit9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX3RleHRsYXlvdXQuaCBiL3hmYS9meGZhL2N4ZmFfdGV4dGxheW91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYjY0YTcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX3RleHRsYXlvdXQuaApAQCAtMCwwICsxLDEyOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX0NYRkFfVEVYVExBWU9VVF9IXworI2RlZmluZSBYRkFfRlhGQV9DWEZBX1RFWFRMQVlPVVRfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAieGZhL2ZnYXMvbGF5b3V0L2NmeF9ydGZicmVhay5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfdGV4dHBhcnNlci5oIgorCitjbGFzcyBDRkRFX1JlbmRlckRldmljZTsKK2NsYXNzIENGWF9DU1NDb21wdXRlZFN0eWxlOworY2xhc3MgQ0ZYX1JlbmRlckRldmljZTsKK2NsYXNzIENGWF9SVEZCcmVhazsKK2NsYXNzIENGWF9YTUxOb2RlOworY2xhc3MgQ1hGQV9MaW5rVXNlckRhdGE7CitjbGFzcyBDWEZBX0xvYWRlckNvbnRleHQ7CitjbGFzcyBDWEZBX05vZGU7CitjbGFzcyBDWEZBX1BpZWNlTGluZTsKK2NsYXNzIENYRkFfVGV4dFBpZWNlOworY2xhc3MgQ1hGQV9UZXh0UHJvdmlkZXI7CitjbGFzcyBDWEZBX1RleHRUYWJzdG9wc0NvbnRleHQ7CisKK2NsYXNzIENYRkFfVGV4dExheW91dCB7CisgcHVibGljOgorICBleHBsaWNpdCBDWEZBX1RleHRMYXlvdXQoQ1hGQV9GRkRvYyogZG9jLCBDWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlcik7CisgIH5DWEZBX1RleHRMYXlvdXQoKTsKKworICBmbG9hdCBHZXRMYXlvdXRIZWlnaHQoKTsKKyAgZmxvYXQgU3RhcnRMYXlvdXQoZmxvYXQgZldpZHRoKTsKKyAgZmxvYXQgRG9MYXlvdXQoaW50MzJfdCBpQmxvY2tJbmRleCwKKyAgICAgICAgICAgICAgICAgZmxvYXQgZkNhbGNIZWlnaHQsCisgICAgICAgICAgICAgICAgIGZsb2F0IGZDb250ZW50QXJlYUhlaWdodCwKKyAgICAgICAgICAgICAgICAgZmxvYXQgZlRleHRIZWlnaHQpOworICBmbG9hdCBMYXlvdXQoY29uc3QgQ0ZYX1NpemVGJiBzaXplKTsKKworICBDRlhfU2l6ZUYgQ2FsY1NpemUoY29uc3QgQ0ZYX1NpemVGJiBtaW5TaXplLCBjb25zdCBDRlhfU2l6ZUYmIG1heFNpemUpOworICB2b2lkIEl0ZW1CbG9ja3MoY29uc3QgQ0ZYX1JlY3RGJiBydFRleHQsIGludDMyX3QgaUJsb2NrSW5kZXgpOworICBib29sIERyYXdTdHJpbmcoQ0ZYX1JlbmRlckRldmljZSogcEZ4RGV2aWNlLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgdG1Eb2MyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydENsaXAsCisgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCbG9jayk7CisgIGJvb2wgSXNMb2FkZWQoKSBjb25zdCB7IHJldHVybiAhbV9waWVjZUxpbmVzLmVtcHR5KCk7IH0KKyAgdm9pZCBVbmxvYWQoKTsKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfUGllY2VMaW5lPj4qIEdldFBpZWNlTGluZXMoKSBjb25zdCB7CisgICAgcmV0dXJuICZtX3BpZWNlTGluZXM7CisgIH0KKworICBib29sIG1fYkhhc0Jsb2NrOworICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBtX0Jsb2NrczsKKworIHByaXZhdGU6CisgIHZvaWQgR2V0VGV4dERhdGFOb2RlKCk7CisgIENGWF9YTUxOb2RlKiBHZXRYTUxDb250YWluZXJOb2RlKCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfUlRGQnJlYWs+IENyZWF0ZUJyZWFrKGJvb2wgYkRlZmF1bHQpOworICB2b2lkIEluaXRCcmVhayhmbG9hdCBmTGluZVdpZHRoKTsKKyAgdm9pZCBJbml0QnJlYWsoQ0ZYX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwKKyAgICAgICAgICAgICAgICAgQ0ZYX0NTU0Rpc3BsYXkgZURpc3BsYXksCisgICAgICAgICAgICAgICAgIGZsb2F0IGZMaW5lV2lkdGgsCisgICAgICAgICAgICAgICAgIENGWF9YTUxOb2RlKiBwWE1MTm9kZSwKKyAgICAgICAgICAgICAgICAgQ0ZYX0NTU0NvbXB1dGVkU3R5bGUqIHBQYXJlbnRTdHlsZSk7CisgIGJvb2wgTG9hZGVyKGZsb2F0IHRleHRXaWR0aCwgZmxvYXQmIGZMaW5lUG9zLCBib29sIGJTYXZlUGllY2VzKTsKKyAgdm9pZCBMb2FkVGV4dChDWEZBX05vZGUqIHBOb2RlLAorICAgICAgICAgICAgICAgIGZsb2F0IHRleHRXaWR0aCwKKyAgICAgICAgICAgICAgICBmbG9hdCYgZkxpbmVQb3MsCisgICAgICAgICAgICAgICAgYm9vbCBiU2F2ZVBpZWNlcyk7CisgIGJvb2wgTG9hZFJpY2hUZXh0KENGWF9YTUxOb2RlKiBwWE1MTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgdGV4dFdpZHRoLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCYgZkxpbmVQb3MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDRlhfQ1NTQ29tcHV0ZWRTdHlsZT4mIHBQYXJlbnRTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2F2ZVBpZWNlcywKKyAgICAgICAgICAgICAgICAgICAgUmV0YWluUHRyPENYRkFfTGlua1VzZXJEYXRhPiBwTGlua0RhdGEsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgYkVuZEJyZWFrID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXNPbCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMaUNvdW50ID0gMCk7CisgIGJvb2wgQXBwZW5kQ2hhcihjb25zdCBXaWRlU3RyaW5nJiB3c1RleHQsCisgICAgICAgICAgICAgICAgICBmbG9hdCYgZkxpbmVQb3MsCisgICAgICAgICAgICAgICAgICBmbG9hdCBmU3BhY2VBYm92ZSwKKyAgICAgICAgICAgICAgICAgIGJvb2wgYlNhdmVQaWVjZXMpOworICB2b2lkIEFwcGVuZFRleHRMaW5lKENGWF9CcmVha1R5cGUgZHdTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQmIGZMaW5lUG9zLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNhdmVQaWVjZXMsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRW5kQnJlYWsgPSBmYWxzZSk7CisgIHZvaWQgRW5kQnJlYWsoQ0ZYX0JyZWFrVHlwZSBkd1N0YXR1cywgZmxvYXQmIGZMaW5lUG9zLCBib29sIGJEZWZhdWx0KTsKKyAgYm9vbCBJc0VuZChib29sIGJTYXZlUGllY2VzKTsKKyAgdm9pZCBQcm9jZXNzVGV4dChXaWRlU3RyaW5nJiB3c1RleHQpOworICB2b2lkIFVwZGF0ZUFsaWduKGZsb2F0IGZIZWlnaHQsIGZsb2F0IGZCb3R0b20pOworICB2b2lkIFJlbmRlclN0cmluZyhDRlhfUmVuZGVyRGV2aWNlKiBwRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICBDWEZBX1BpZWNlTGluZSogcFBpZWNlTGluZSwKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUGllY2UsCisgICAgICAgICAgICAgICAgICAgIEZYVEVYVF9DSEFSUE9TKiBwQ2hhclBvcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgdG1Eb2MyRGV2aWNlKTsKKyAgdm9pZCBSZW5kZXJQYXRoKENGWF9SZW5kZXJEZXZpY2UqIHBEZXZpY2UsCisgICAgICAgICAgICAgICAgICBDWEZBX1BpZWNlTGluZSogcFBpZWNlTGluZSwKKyAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBpZWNlLAorICAgICAgICAgICAgICAgICAgRlhURVhUX0NIQVJQT1MqIHBDaGFyUG9zLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgdG1Eb2MyRGV2aWNlKTsKKyAgaW50MzJfdCBHZXREaXNwbGF5UG9zKGNvbnN0IENYRkFfVGV4dFBpZWNlKiBwUGllY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBGWFRFWFRfQ0hBUlBPUyogcENoYXJQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJDaGFyQ29kZSA9IGZhbHNlKTsKKyAgYm9vbCBUb1J1bihjb25zdCBDWEZBX1RleHRQaWVjZSogcFBpZWNlLCBGWF9SVEZURVhUT0JKKiB0cik7CisgIHZvaWQgRG9UYWJzdG9wcyhDRlhfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlLCBDWEZBX1BpZWNlTGluZSogcFBpZWNlTGluZSk7CisgIGJvb2wgTGF5b3V0KGludDMyX3QgaUJsb2NrKTsKKyAgaW50MzJfdCBDb3VudEJsb2NrcygpIGNvbnN0OworCisgIENYRkFfRkZEb2MqIG1fcERvYzsKKyAgQ1hGQV9UZXh0UHJvdmlkZXIqIG1fcFRleHRQcm92aWRlcjsKKyAgQ1hGQV9Ob2RlKiBtX3BUZXh0RGF0YU5vZGU7CisgIGJvb2wgbV9iUmljaFRleHQ7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfUlRGQnJlYWs+IG1fcEJyZWFrOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9Mb2FkZXJDb250ZXh0PiBtX3BMb2FkZXI7CisgIGludDMyX3QgbV9pTGluZXM7CisgIGZsb2F0IG1fZk1heFdpZHRoOworICBDWEZBX1RleHRQYXJzZXIgbV90ZXh0UGFyc2VyOworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9QaWVjZUxpbmU+PiBtX3BpZWNlTGluZXM7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX1RleHRUYWJzdG9wc0NvbnRleHQ+IG1fcFRhYnN0b3BDb250ZXh0OworICBib29sIG1fYkJsb2NrQ29udGludWU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX0NYRkFfVEVYVExBWU9VVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV90ZXh0cGFyc2Vjb250ZXh0LmNwcCBiL3hmYS9meGZhL2N4ZmFfdGV4dHBhcnNlY29udGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQyMWFmYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfdGV4dHBhcnNlY29udGV4dC5jcHAKQEAgLTAsMCArMSwxNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV90ZXh0cGFyc2Vjb250ZXh0LmgiCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzY29tcHV0ZWRzdHlsZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NkZWNsYXJhdGlvbi5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHlsZXNlbGVjdG9yLmgiCisKK0NYRkFfVGV4dFBhcnNlQ29udGV4dDo6Q1hGQV9UZXh0UGFyc2VDb250ZXh0KCkKKyAgICA6IG1fcFBhcmVudFN0eWxlKG51bGxwdHIpLCBtX2VEaXNwbGF5KENGWF9DU1NEaXNwbGF5OjpOb25lKSB7fQorCitDWEZBX1RleHRQYXJzZUNvbnRleHQ6On5DWEZBX1RleHRQYXJzZUNvbnRleHQoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV90ZXh0cGFyc2Vjb250ZXh0LmggYi94ZmEvZnhmYS9jeGZhX3RleHRwYXJzZWNvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGQ5MTRiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV90ZXh0cGFyc2Vjb250ZXh0LmgKQEAgLTAsMCArMSwzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX0NYRkFfVEVYVFBBUlNFQ09OVEVYVF9IXworI2RlZmluZSBYRkFfRlhGQV9DWEZBX1RFWFRQQVJTRUNPTlRFWFRfSF8KKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzcy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NkZWNsYXJhdGlvbi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKKworY2xhc3MgQ0ZYX0NTU0NvbXB1dGVkU3R5bGU7CisKK2NsYXNzIENYRkFfVGV4dFBhcnNlQ29udGV4dCB7CisgcHVibGljOgorICBDWEZBX1RleHRQYXJzZUNvbnRleHQoKTsKKyAgfkNYRkFfVGV4dFBhcnNlQ29udGV4dCgpOworCisgIHZvaWQgU2V0RGlzcGxheShDRlhfQ1NTRGlzcGxheSBlRGlzcGxheSkgeyBtX2VEaXNwbGF5ID0gZURpc3BsYXk7IH0KKyAgQ0ZYX0NTU0Rpc3BsYXkgR2V0RGlzcGxheSgpIGNvbnN0IHsgcmV0dXJuIG1fZURpc3BsYXk7IH0KKworICB2b2lkIFNldERlY2xzKHN0ZDo6dmVjdG9yPGNvbnN0IENGWF9DU1NEZWNsYXJhdGlvbio+JiYgZGVjbCkgeworICAgIGRlY2xzXyA9IHN0ZDo6bW92ZShkZWNsKTsKKyAgfQorICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBDRlhfQ1NTRGVjbGFyYXRpb24qPiYgR2V0RGVjbHMoKSB7IHJldHVybiBkZWNsc187IH0KKworICBSZXRhaW5QdHI8Q0ZYX0NTU0NvbXB1dGVkU3R5bGU+IG1fcFBhcmVudFN0eWxlOworCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgQ0ZYX0NTU0RlY2xhcmF0aW9uKj4gZGVjbHNfOworICBDRlhfQ1NTRGlzcGxheSBtX2VEaXNwbGF5OworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9DWEZBX1RFWFRQQVJTRUNPTlRFWFRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfdGV4dHBhcnNlci5jcHAgYi94ZmEvZnhmYS9jeGZhX3RleHRwYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YmE4OTYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX3RleHRwYXJzZXIuY3BwCkBAIC0wLDAgKzEsNjM2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX3RleHRwYXJzZXIuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3MuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzY29tcHV0ZWRzdHlsZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHlsZXNlbGVjdG9yLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jc3MvY2Z4X2Nzc3N0eWxlc2hlZXQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2NvZGVwYWdlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbGVsZW1lbnQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sbm9kZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ4ZmEvZmdhcy9mb250L2NmZ2FzX2ZvbnRtZ3IuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmYXBwLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRvYy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZm9udG1nci5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfdGV4dHBhcnNlY29udGV4dC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfdGV4dHByb3ZpZGVyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV90ZXh0dGFic3RvcHNjb250ZXh0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9udC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21lYXN1cmVtZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFyYS5oIgorCituYW1lc3BhY2UgeworCitlbnVtIGNsYXNzIFRhYlN0b3BTdGF0dXMgeworICBFcnJvciwKKyAgRU9TLAorICBOb25lLAorICBBbGlnbm1lbnQsCisgIFN0YXJ0TGVhZGVyLAorICBMZWFkZXIsCisgIExvY2F0aW9uLAorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfVGV4dFBhcnNlcjo6Q1hGQV9UZXh0UGFyc2VyKCkKKyAgICA6IG1fYlBhcnNlZChmYWxzZSksIG1fY3NzSW5pdGlhbGl6ZWQoZmFsc2UpIHt9CisKK0NYRkFfVGV4dFBhcnNlcjo6fkNYRkFfVGV4dFBhcnNlcigpIHt9CisKK3ZvaWQgQ1hGQV9UZXh0UGFyc2VyOjpSZXNldCgpIHsKKyAgbV9tYXBYTUxOb2RlVG9QYXJzZUNvbnRleHQuY2xlYXIoKTsKKyAgbV9iUGFyc2VkID0gZmFsc2U7Cit9CisKK3ZvaWQgQ1hGQV9UZXh0UGFyc2VyOjpJbml0Q1NTRGF0YShDWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlcikgeworICBpZiAoIXBUZXh0UHJvdmlkZXIpCisgICAgcmV0dXJuOworCisgIGlmICghbV9wU2VsZWN0b3IpIHsKKyAgICBtX3BTZWxlY3RvciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfQ1NTU3R5bGVTZWxlY3Rvcj4oKTsKKworICAgIENYRkFfRm9udCogZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnRJZkV4aXN0cygpOworICAgIG1fcFNlbGVjdG9yLT5TZXREZWZGb250U2l6ZShmb250ID8gZm9udC0+R2V0Rm9udFNpemUoKSA6IDEwLjBmKTsKKyAgfQorCisgIGlmIChtX2Nzc0luaXRpYWxpemVkKQorICAgIHJldHVybjsKKworICBtX2Nzc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgYXV0byB1YVNoZWV0ID0gTG9hZERlZmF1bHRTaGVldFN0eWxlKCk7CisgIG1fcFNlbGVjdG9yLT5TZXRVQVN0eWxlU2hlZXQoc3RkOjptb3ZlKHVhU2hlZXQpKTsKKyAgbV9wU2VsZWN0b3ItPlVwZGF0ZVN0eWxlSW5kZXgoKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPENGWF9DU1NTdHlsZVNoZWV0PiBDWEZBX1RleHRQYXJzZXI6OkxvYWREZWZhdWx0U2hlZXRTdHlsZSgpIHsKKyAgc3RhdGljIGNvbnN0IHdjaGFyX3Qgc19wU3R5bGVbXSA9CisgICAgICBMImh0bWwsYm9keSxvbCxwLHVse2Rpc3BsYXk6YmxvY2t9IgorICAgICAgTCJsaXtkaXNwbGF5Omxpc3QtaXRlbX0iCisgICAgICBMIm9sLHVse3BhZGRpbmctbGVmdDozM3B4O21hcmdpbjoxLjEyZW0gMH0iCisgICAgICBMIm9se2xpc3Qtc3R5bGUtdHlwZTpkZWNpbWFsfSIKKyAgICAgIEwiYXtjb2xvcjojMDAwMGZmO3RleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmV9IgorICAgICAgTCJie2ZvbnQtd2VpZ2h0OmJvbGRlcn0iCisgICAgICBMIml7Zm9udC1zdHlsZTppdGFsaWN9IgorICAgICAgTCJzdXB7dmVydGljYWwtYWxpZ246KzE1ZW07Zm9udC1zaXplOi42NmVtfSIKKyAgICAgIEwic3Vie3ZlcnRpY2FsLWFsaWduOi0xNWVtO2ZvbnQtc2l6ZTouNjZlbX0iOworCisgIGF1dG8gc2hlZXQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0NTU1N0eWxlU2hlZXQ+KCk7CisgIHJldHVybiBzaGVldC0+TG9hZEJ1ZmZlcihzX3BTdHlsZSwgd2NzbGVuKHNfcFN0eWxlKSkgPyBzdGQ6Om1vdmUoc2hlZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyOworfQorCitSZXRhaW5QdHI8Q0ZYX0NTU0NvbXB1dGVkU3R5bGU+IENYRkFfVGV4dFBhcnNlcjo6Q3JlYXRlUm9vdFN0eWxlKAorICAgIENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyKSB7CisgIENYRkFfUGFyYSogcGFyYSA9IHBUZXh0UHJvdmlkZXItPkdldFBhcmFJZkV4aXN0cygpOworICBhdXRvIHBTdHlsZSA9IG1fcFNlbGVjdG9yLT5DcmVhdGVDb21wdXRlZFN0eWxlKG51bGxwdHIpOworICBmbG9hdCBmTGluZUhlaWdodCA9IDA7CisgIGZsb2F0IGZGb250U2l6ZSA9IDEwOworCisgIGlmIChwYXJhKSB7CisgICAgZkxpbmVIZWlnaHQgPSBwYXJhLT5HZXRMaW5lSGVpZ2h0KCk7CisgICAgQ0ZYX0NTU0xlbmd0aCBpbmRlbnQ7CisgICAgaW5kZW50LlNldChDRlhfQ1NTTGVuZ3RoVW5pdDo6UG9pbnQsIHBhcmEtPkdldFRleHRJbmRlbnQoKSk7CisgICAgcFN0eWxlLT5TZXRUZXh0SW5kZW50KGluZGVudCk7CisgICAgQ0ZYX0NTU1RleHRBbGlnbiBoQWxpZ24gPSBDRlhfQ1NTVGV4dEFsaWduOjpMZWZ0OworICAgIHN3aXRjaCAocGFyYS0+R2V0SG9yaXpvbnRhbEFsaWduKCkpIHsKKyAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkNlbnRlcjoKKyAgICAgICAgaEFsaWduID0gQ0ZYX0NTU1RleHRBbGlnbjo6Q2VudGVyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OlJpZ2h0OgorICAgICAgICBoQWxpZ24gPSBDRlhfQ1NTVGV4dEFsaWduOjpSaWdodDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpKdXN0aWZ5OgorICAgICAgICBoQWxpZ24gPSBDRlhfQ1NTVGV4dEFsaWduOjpKdXN0aWZ5OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06Okp1c3RpZnlBbGw6CisgICAgICAgIGhBbGlnbiA9IENGWF9DU1NUZXh0QWxpZ246Okp1c3RpZnlBbGw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6TGVmdDoKKyAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OlJhZGl4OgorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHBTdHlsZS0+U2V0VGV4dEFsaWduKGhBbGlnbik7CisgICAgQ0ZYX0NTU1JlY3QgcnRNYXJnaW5XaWR0aDsKKyAgICBydE1hcmdpbldpZHRoLmxlZnQuU2V0KENGWF9DU1NMZW5ndGhVbml0OjpQb2ludCwgcGFyYS0+R2V0TWFyZ2luTGVmdCgpKTsKKyAgICBydE1hcmdpbldpZHRoLnRvcC5TZXQoQ0ZYX0NTU0xlbmd0aFVuaXQ6OlBvaW50LCBwYXJhLT5HZXRTcGFjZUFib3ZlKCkpOworICAgIHJ0TWFyZ2luV2lkdGgucmlnaHQuU2V0KENGWF9DU1NMZW5ndGhVbml0OjpQb2ludCwgcGFyYS0+R2V0TWFyZ2luUmlnaHQoKSk7CisgICAgcnRNYXJnaW5XaWR0aC5ib3R0b20uU2V0KENGWF9DU1NMZW5ndGhVbml0OjpQb2ludCwgcGFyYS0+R2V0U3BhY2VCZWxvdygpKTsKKyAgICBwU3R5bGUtPlNldE1hcmdpbldpZHRoKHJ0TWFyZ2luV2lkdGgpOworICB9CisKKyAgQ1hGQV9Gb250KiBmb250ID0gcFRleHRQcm92aWRlci0+R2V0Rm9udElmRXhpc3RzKCk7CisgIGlmIChmb250KSB7CisgICAgcFN0eWxlLT5TZXRDb2xvcihmb250LT5HZXRDb2xvcigpKTsKKyAgICBwU3R5bGUtPlNldEZvbnRTdHlsZShmb250LT5Jc0l0YWxpYygpID8gQ0ZYX0NTU0ZvbnRTdHlsZTo6SXRhbGljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENGWF9DU1NGb250U3R5bGU6Ok5vcm1hbCk7CisgICAgcFN0eWxlLT5TZXRGb250V2VpZ2h0KGZvbnQtPklzQm9sZCgpID8gRlhGT05UX0ZXX0JPTEQgOiBGWEZPTlRfRldfTk9STUFMKTsKKyAgICBwU3R5bGUtPlNldE51bWJlclZlcnRpY2FsQWxpZ24oLWZvbnQtPkdldEJhc2VsaW5lU2hpZnQoKSk7CisgICAgZkZvbnRTaXplID0gZm9udC0+R2V0Rm9udFNpemUoKTsKKyAgICBDRlhfQ1NTTGVuZ3RoIGxldHRlclNwYWNpbmc7CisgICAgbGV0dGVyU3BhY2luZy5TZXQoQ0ZYX0NTU0xlbmd0aFVuaXQ6OlBvaW50LCBmb250LT5HZXRMZXR0ZXJTcGFjaW5nKCkpOworICAgIHBTdHlsZS0+U2V0TGV0dGVyU3BhY2luZyhsZXR0ZXJTcGFjaW5nKTsKKyAgICB1aW50MzJfdCBkd0RlY29yYXRpb24gPSAwOworICAgIGlmIChmb250LT5HZXRMaW5lVGhyb3VnaCgpID4gMCkKKyAgICAgIGR3RGVjb3JhdGlvbiB8PSBDRlhfQ1NTVEVYVERFQ09SQVRJT05fTGluZVRocm91Z2g7CisgICAgaWYgKGZvbnQtPkdldFVuZGVybGluZSgpID4gMSkKKyAgICAgIGR3RGVjb3JhdGlvbiB8PSBDRlhfQ1NTVEVYVERFQ09SQVRJT05fRG91YmxlOworICAgIGVsc2UgaWYgKGZvbnQtPkdldFVuZGVybGluZSgpID4gMCkKKyAgICAgIGR3RGVjb3JhdGlvbiB8PSBDRlhfQ1NTVEVYVERFQ09SQVRJT05fVW5kZXJsaW5lOworCisgICAgcFN0eWxlLT5TZXRUZXh0RGVjb3JhdGlvbihkd0RlY29yYXRpb24pOworICB9CisgIHBTdHlsZS0+U2V0TGluZUhlaWdodChmTGluZUhlaWdodCk7CisgIHBTdHlsZS0+U2V0Rm9udFNpemUoZkZvbnRTaXplKTsKKyAgcmV0dXJuIHBTdHlsZTsKK30KKworUmV0YWluUHRyPENGWF9DU1NDb21wdXRlZFN0eWxlPiBDWEZBX1RleHRQYXJzZXI6OkNyZWF0ZVN0eWxlKAorICAgIENGWF9DU1NDb21wdXRlZFN0eWxlKiBwUGFyZW50U3R5bGUpIHsKKyAgYXV0byBwTmV3U3R5bGUgPSBtX3BTZWxlY3Rvci0+Q3JlYXRlQ29tcHV0ZWRTdHlsZShwUGFyZW50U3R5bGUpOworICBBU1NFUlQocE5ld1N0eWxlKTsKKyAgaWYgKCFwUGFyZW50U3R5bGUpCisgICAgcmV0dXJuIHBOZXdTdHlsZTsKKworICB1aW50MzJfdCBkd0RlY29yYXRpb24gPSBwUGFyZW50U3R5bGUtPkdldFRleHREZWNvcmF0aW9uKCk7CisgIGZsb2F0IGZCYXNlTGluZSA9IDA7CisgIGlmIChwUGFyZW50U3R5bGUtPkdldFZlcnRpY2FsQWxpZ24oKSA9PSBDRlhfQ1NTVmVydGljYWxBbGlnbjo6TnVtYmVyKQorICAgIGZCYXNlTGluZSA9IHBQYXJlbnRTdHlsZS0+R2V0TnVtYmVyVmVydGljYWxBbGlnbigpOworCisgIHBOZXdTdHlsZS0+U2V0VGV4dERlY29yYXRpb24oZHdEZWNvcmF0aW9uKTsKKyAgcE5ld1N0eWxlLT5TZXROdW1iZXJWZXJ0aWNhbEFsaWduKGZCYXNlTGluZSk7CisKKyAgY29uc3QgQ0ZYX0NTU1JlY3QqIHBSZWN0ID0gcFBhcmVudFN0eWxlLT5HZXRNYXJnaW5XaWR0aCgpOworICBpZiAocFJlY3QpCisgICAgcE5ld1N0eWxlLT5TZXRNYXJnaW5XaWR0aCgqcFJlY3QpOworICByZXR1cm4gcE5ld1N0eWxlOworfQorCitSZXRhaW5QdHI8Q0ZYX0NTU0NvbXB1dGVkU3R5bGU+IENYRkFfVGV4dFBhcnNlcjo6Q29tcHV0ZVN0eWxlKAorICAgIENGWF9YTUxOb2RlKiBwWE1MTm9kZSwKKyAgICBDRlhfQ1NTQ29tcHV0ZWRTdHlsZSogcFBhcmVudFN0eWxlKSB7CisgIGF1dG8gaXQgPSBtX21hcFhNTE5vZGVUb1BhcnNlQ29udGV4dC5maW5kKHBYTUxOb2RlKTsKKyAgaWYgKGl0ID09IG1fbWFwWE1MTm9kZVRvUGFyc2VDb250ZXh0LmVuZCgpKQorICAgIHJldHVybiBudWxscHRyOworCisgIENYRkFfVGV4dFBhcnNlQ29udGV4dCogcENvbnRleHQgPSBpdC0+c2Vjb25kLmdldCgpOworICBpZiAoIXBDb250ZXh0KQorICAgIHJldHVybiBudWxscHRyOworCisgIHBDb250ZXh0LT5tX3BQYXJlbnRTdHlsZS5SZXNldChwUGFyZW50U3R5bGUpOworCisgIGF1dG8gdGFnUHJvdmlkZXIgPSBQYXJzZVRhZ0luZm8ocFhNTE5vZGUpOworICBpZiAodGFnUHJvdmlkZXItPm1fYkNvbnRlbnQpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgYXV0byBwU3R5bGUgPSBDcmVhdGVTdHlsZShwUGFyZW50U3R5bGUpOworICBtX3BTZWxlY3Rvci0+Q29tcHV0ZVN0eWxlKHBDb250ZXh0LT5HZXREZWNscygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3ZpZGVyLT5HZXRBdHRyaWJ1dGUoTCJzdHlsZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3ZpZGVyLT5HZXRBdHRyaWJ1dGUoTCJhbGlnbiIpLCBwU3R5bGUuR2V0KCkpOworICByZXR1cm4gcFN0eWxlOworfQorCit2b2lkIENYRkFfVGV4dFBhcnNlcjo6RG9QYXJzZShDRlhfWE1MTm9kZSogcFhNTENvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyKSB7CisgIGlmICghcFhNTENvbnRhaW5lciB8fCAhcFRleHRQcm92aWRlciB8fCBtX2JQYXJzZWQpCisgICAgcmV0dXJuOworCisgIG1fYlBhcnNlZCA9IHRydWU7CisgIEluaXRDU1NEYXRhKHBUZXh0UHJvdmlkZXIpOworICBhdXRvIHBSb290U3R5bGUgPSBDcmVhdGVSb290U3R5bGUocFRleHRQcm92aWRlcik7CisgIFBhcnNlUmljaFRleHQocFhNTENvbnRhaW5lciwgcFJvb3RTdHlsZS5HZXQoKSk7Cit9CisKK3ZvaWQgQ1hGQV9UZXh0UGFyc2VyOjpQYXJzZVJpY2hUZXh0KENGWF9YTUxOb2RlKiBwWE1MTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DU1NDb21wdXRlZFN0eWxlKiBwUGFyZW50U3R5bGUpIHsKKyAgaWYgKCFwWE1MTm9kZSkKKyAgICByZXR1cm47CisKKyAgYXV0byB0YWdQcm92aWRlciA9IFBhcnNlVGFnSW5mbyhwWE1MTm9kZSk7CisgIGlmICghdGFnUHJvdmlkZXItPm1fYlRhZ0F2YWlsYWJsZSkKKyAgICByZXR1cm47CisKKyAgUmV0YWluUHRyPENGWF9DU1NDb21wdXRlZFN0eWxlPiBwTmV3U3R5bGU7CisgIGlmICgodGFnUHJvdmlkZXItPkdldFRhZ05hbWUoKSAhPSBMImJvZHkiKSB8fAorICAgICAgKHRhZ1Byb3ZpZGVyLT5HZXRUYWdOYW1lKCkgIT0gTCJodG1sIikpIHsKKyAgICBhdXRvIHBUZXh0Q29udGV4dCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1RleHRQYXJzZUNvbnRleHQ+KCk7CisgICAgQ0ZYX0NTU0Rpc3BsYXkgZURpc3BsYXkgPSBDRlhfQ1NTRGlzcGxheTo6SW5saW5lOworICAgIGlmICghdGFnUHJvdmlkZXItPm1fYkNvbnRlbnQpIHsKKyAgICAgIGF1dG8gZGVjbEFycmF5ID0KKyAgICAgICAgICBtX3BTZWxlY3Rvci0+TWF0Y2hEZWNsYXJhdGlvbnModGFnUHJvdmlkZXItPkdldFRhZ05hbWUoKSk7CisgICAgICBwTmV3U3R5bGUgPSBDcmVhdGVTdHlsZShwUGFyZW50U3R5bGUpOworICAgICAgbV9wU2VsZWN0b3ItPkNvbXB1dGVTdHlsZShkZWNsQXJyYXksIHRhZ1Byb3ZpZGVyLT5HZXRBdHRyaWJ1dGUoTCJzdHlsZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm92aWRlci0+R2V0QXR0cmlidXRlKEwiYWxpZ24iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5ld1N0eWxlLkdldCgpKTsKKworICAgICAgaWYgKCFkZWNsQXJyYXkuZW1wdHkoKSkKKyAgICAgICAgcFRleHRDb250ZXh0LT5TZXREZWNscyhzdGQ6Om1vdmUoZGVjbEFycmF5KSk7CisKKyAgICAgIGVEaXNwbGF5ID0gcE5ld1N0eWxlLT5HZXREaXNwbGF5KCk7CisgICAgfQorICAgIHBUZXh0Q29udGV4dC0+U2V0RGlzcGxheShlRGlzcGxheSk7CisgICAgbV9tYXBYTUxOb2RlVG9QYXJzZUNvbnRleHRbcFhNTE5vZGVdID0gc3RkOjptb3ZlKHBUZXh0Q29udGV4dCk7CisgIH0KKworICBmb3IgKENGWF9YTUxOb2RlKiBwWE1MQ2hpbGQgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZYX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOworICAgICAgIHBYTUxDaGlsZDsKKyAgICAgICBwWE1MQ2hpbGQgPSBwWE1MQ2hpbGQtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpOZXh0U2libGluZykpIHsKKyAgICBQYXJzZVJpY2hUZXh0KHBYTUxDaGlsZCwgcE5ld1N0eWxlLkdldCgpKTsKKyAgfQorfQorCitib29sIENYRkFfVGV4dFBhcnNlcjo6VGFnVmFsaWRhdGUoY29uc3QgV2lkZVN0cmluZyYgd3NOYW1lKSBjb25zdCB7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBzX1hGQVRhZ05hbWVbXSA9IHsKKyAgICAgIDB4NjEsICAgICAgICAvLyBhCisgICAgICAweDYyLCAgICAgICAgLy8gYgorICAgICAgMHg2OSwgICAgICAgIC8vIGkKKyAgICAgIDB4NzAsICAgICAgICAvLyBwCisgICAgICAweDAwMDFmNzE0LCAgLy8gYnIKKyAgICAgIDB4MDAwMjJhNTUsICAvLyBsaQorICAgICAgMHgwMDAyMzliYiwgIC8vIG9sCisgICAgICAweDAwMDI1ODgxLCAgLy8gdWwKKyAgICAgIDB4MGJkMzdmYWEsICAvLyBzdWIKKyAgICAgIDB4MGJkMzdmYjgsICAvLyBzdXAKKyAgICAgIDB4YTczZTNhZjIsICAvLyBzcGFuCisgICAgICAweGIxODJlYWFlLCAgLy8gYm9keQorICAgICAgMHhkYjhhYzQ1NSwgIC8vIGh0bWwKKyAgfTsKKyAgc3RhdGljIGNvbnN0IGludDMyX3Qgc19pQ291bnQgPSBGWF9BcnJheVNpemUoc19YRkFUYWdOYW1lKTsKKworICByZXR1cm4gc3RkOjpiaW5hcnlfc2VhcmNoKHNfWEZBVGFnTmFtZSwgc19YRkFUYWdOYW1lICsgc19pQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSGFzaENvZGVfR2V0Vyh3c05hbWUuQXNTdHJpbmdWaWV3KCksIHRydWUpKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPENYRkFfVGV4dFBhcnNlcjo6VGFnUHJvdmlkZXI+IENYRkFfVGV4dFBhcnNlcjo6UGFyc2VUYWdJbmZvKAorICAgIENGWF9YTUxOb2RlKiBwWE1MTm9kZSkgeworICBhdXRvIHRhZ1Byb3ZpZGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPFRhZ1Byb3ZpZGVyPigpOworCisgIFdpZGVTdHJpbmcgd3NOYW1lOworICBpZiAocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGWF9YTUxOT0RFX0VsZW1lbnQpIHsKKyAgICBDRlhfWE1MRWxlbWVudCogcFhNTEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxDRlhfWE1MRWxlbWVudCo+KHBYTUxOb2RlKTsKKyAgICB3c05hbWUgPSBwWE1MRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKCk7CisgICAgdGFnUHJvdmlkZXItPlNldFRhZ05hbWUod3NOYW1lKTsKKyAgICB0YWdQcm92aWRlci0+bV9iVGFnQXZhaWxhYmxlID0gVGFnVmFsaWRhdGUod3NOYW1lKTsKKworICAgIFdpZGVTdHJpbmcgd3NWYWx1ZSA9IHBYTUxFbGVtZW50LT5HZXRTdHJpbmcoTCJzdHlsZSIpOworICAgIGlmICghd3NWYWx1ZS5Jc0VtcHR5KCkpCisgICAgICB0YWdQcm92aWRlci0+U2V0QXR0cmlidXRlKEwic3R5bGUiLCB3c1ZhbHVlKTsKKyAgfSBlbHNlIGlmIChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZYX1hNTE5PREVfVGV4dCkgeworICAgIHRhZ1Byb3ZpZGVyLT5tX2JUYWdBdmFpbGFibGUgPSB0cnVlOworICAgIHRhZ1Byb3ZpZGVyLT5tX2JDb250ZW50ID0gdHJ1ZTsKKyAgfQorICByZXR1cm4gdGFnUHJvdmlkZXI7Cit9CisKK1hGQV9BdHRyaWJ1dGVFbnVtIENYRkFfVGV4dFBhcnNlcjo6R2V0VkFsaWduKAorICAgIENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyKSBjb25zdCB7CisgIENYRkFfUGFyYSogcGFyYSA9IHBUZXh0UHJvdmlkZXItPkdldFBhcmFJZkV4aXN0cygpOworICByZXR1cm4gcGFyYSA/IHBhcmEtPkdldFZlcnRpY2FsQWxpZ24oKSA6IFhGQV9BdHRyaWJ1dGVFbnVtOjpUb3A7Cit9CisKK2Zsb2F0IENYRkFfVGV4dFBhcnNlcjo6R2V0VGFiSW50ZXJ2YWwoQ0ZYX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3QgeworICBXaWRlU3RyaW5nIHdzVmFsdWU7CisgIGlmIChwU3R5bGUgJiYgcFN0eWxlLT5HZXRDdXN0b21TdHlsZShMInRhYi1pbnRlcnZhbCIsIHdzVmFsdWUpKQorICAgIHJldHVybiBDWEZBX01lYXN1cmVtZW50KHdzVmFsdWUuQXNTdHJpbmdWaWV3KCkpLlRvVW5pdChYRkFfVW5pdDo6UHQpOworICByZXR1cm4gMzY7Cit9CisKK2ludDMyX3QgQ1hGQV9UZXh0UGFyc2VyOjpDb3VudFRhYnMoQ0ZYX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3QgeworICBXaWRlU3RyaW5nIHdzVmFsdWU7CisgIGlmIChwU3R5bGUgJiYgcFN0eWxlLT5HZXRDdXN0b21TdHlsZShMInhmYS10YWItY291bnQiLCB3c1ZhbHVlKSkKKyAgICByZXR1cm4gd3NWYWx1ZS5HZXRJbnRlZ2VyKCk7CisgIHJldHVybiAwOworfQorCitib29sIENYRkFfVGV4dFBhcnNlcjo6SXNTcGFjZVJ1bihDRlhfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdCB7CisgIFdpZGVTdHJpbmcgd3NWYWx1ZTsKKyAgaWYgKHBTdHlsZSAmJiBwU3R5bGUtPkdldEN1c3RvbVN0eWxlKEwieGZhLXNwYWNlcnVuIiwgd3NWYWx1ZSkpIHsKKyAgICB3c1ZhbHVlLk1ha2VMb3dlcigpOworICAgIHJldHVybiB3c1ZhbHVlID09IEwieWVzIjsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IENYRkFfVGV4dFBhcnNlcjo6R2V0Rm9udCgKKyAgICBDWEZBX0ZGRG9jKiBkb2MsCisgICAgQ1hGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIsCisgICAgQ0ZYX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3QgeworICBXaWRlU3RyaW5nIHdzRmFtaWx5ID0gTCJDb3VyaWVyIjsKKyAgdWludDMyX3QgZHdTdHlsZSA9IDA7CisgIENYRkFfRm9udCogZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnRJZkV4aXN0cygpOworICBpZiAoZm9udCkgeworICAgIHdzRmFtaWx5ID0gZm9udC0+R2V0VHlwZWZhY2UoKTsKKyAgICBpZiAoZm9udC0+SXNCb2xkKCkpCisgICAgICBkd1N0eWxlIHw9IEZYRk9OVF9CT0xEOworICAgIGlmIChmb250LT5Jc0l0YWxpYygpKQorICAgICAgZHdTdHlsZSB8PSBGWEZPTlRfQk9MRDsKKyAgfQorCisgIGlmIChwU3R5bGUpIHsKKyAgICBpbnQzMl90IGlDb3VudCA9IHBTdHlsZS0+Q291bnRGb250RmFtaWxpZXMoKTsKKyAgICBpZiAoaUNvdW50ID4gMCkKKyAgICAgIHdzRmFtaWx5ID0gcFN0eWxlLT5HZXRGb250RmFtaWx5KGlDb3VudCAtIDEpLkFzU3RyaW5nVmlldygpOworCisgICAgZHdTdHlsZSA9IDA7CisgICAgaWYgKHBTdHlsZS0+R2V0Rm9udFdlaWdodCgpID4gRlhGT05UX0ZXX05PUk1BTCkKKyAgICAgIGR3U3R5bGUgfD0gRlhGT05UX0JPTEQ7CisgICAgaWYgKHBTdHlsZS0+R2V0Rm9udFN0eWxlKCkgPT0gQ0ZYX0NTU0ZvbnRTdHlsZTo6SXRhbGljKQorICAgICAgZHdTdHlsZSB8PSBGWEZPTlRfSVRBTElDOworICB9CisKKyAgQ1hGQV9Gb250TWdyKiBwRm9udE1nciA9IGRvYy0+R2V0QXBwKCktPkdldFhGQUZvbnRNZ3IoKTsKKyAgcmV0dXJuIHBGb250TWdyLT5HZXRGb250KGRvYywgd3NGYW1pbHkuQXNTdHJpbmdWaWV3KCksIGR3U3R5bGUpOworfQorCitmbG9hdCBDWEZBX1RleHRQYXJzZXI6OkdldEZvbnRTaXplKENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdCB7CisgIGlmIChwU3R5bGUpCisgICAgcmV0dXJuIHBTdHlsZS0+R2V0Rm9udFNpemUoKTsKKworICBDWEZBX0ZvbnQqIGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250SWZFeGlzdHMoKTsKKyAgcmV0dXJuIGZvbnQgPyBmb250LT5HZXRGb250U2l6ZSgpIDogMTA7Cit9CisKK2ludDMyX3QgQ1hGQV9UZXh0UGFyc2VyOjpHZXRIb3JTY2FsZShDWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9YTUxOb2RlKiBwWE1MTm9kZSkgY29uc3QgeworICBpZiAocFN0eWxlKSB7CisgICAgV2lkZVN0cmluZyB3c1ZhbHVlOworICAgIGlmIChwU3R5bGUtPkdldEN1c3RvbVN0eWxlKEwieGZhLWZvbnQtaG9yaXpvbnRhbC1zY2FsZSIsIHdzVmFsdWUpKQorICAgICAgcmV0dXJuIHdzVmFsdWUuR2V0SW50ZWdlcigpOworCisgICAgd2hpbGUgKHBYTUxOb2RlKSB7CisgICAgICBhdXRvIGl0ID0gbV9tYXBYTUxOb2RlVG9QYXJzZUNvbnRleHQuZmluZChwWE1MTm9kZSk7CisgICAgICBpZiAoaXQgIT0gbV9tYXBYTUxOb2RlVG9QYXJzZUNvbnRleHQuZW5kKCkpIHsKKyAgICAgICAgQ1hGQV9UZXh0UGFyc2VDb250ZXh0KiBwQ29udGV4dCA9IGl0LT5zZWNvbmQuZ2V0KCk7CisgICAgICAgIGlmIChwQ29udGV4dCAmJiBwQ29udGV4dC0+bV9wUGFyZW50U3R5bGUgJiYKKyAgICAgICAgICAgIHBDb250ZXh0LT5tX3BQYXJlbnRTdHlsZS0+R2V0Q3VzdG9tU3R5bGUoCisgICAgICAgICAgICAgICAgTCJ4ZmEtZm9udC1ob3Jpem9udGFsLXNjYWxlIiwgd3NWYWx1ZSkpIHsKKyAgICAgICAgICByZXR1cm4gd3NWYWx1ZS5HZXRJbnRlZ2VyKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHBYTUxOb2RlID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpQYXJlbnQpOworICAgIH0KKyAgfQorCisgIENYRkFfRm9udCogZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnRJZkV4aXN0cygpOworICByZXR1cm4gZm9udCA/IHN0YXRpY19jYXN0PGludDMyX3Q+KGZvbnQtPkdldEhvcml6b250YWxTY2FsZSgpKSA6IDEwMDsKK30KKworaW50MzJfdCBDWEZBX1RleHRQYXJzZXI6OkdldFZlclNjYWxlKENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUpIGNvbnN0IHsKKyAgaWYgKHBTdHlsZSkgeworICAgIFdpZGVTdHJpbmcgd3NWYWx1ZTsKKyAgICBpZiAocFN0eWxlLT5HZXRDdXN0b21TdHlsZShMInhmYS1mb250LXZlcnRpY2FsLXNjYWxlIiwgd3NWYWx1ZSkpCisgICAgICByZXR1cm4gd3NWYWx1ZS5HZXRJbnRlZ2VyKCk7CisgIH0KKworICBDWEZBX0ZvbnQqIGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250SWZFeGlzdHMoKTsKKyAgcmV0dXJuIGZvbnQgPyBzdGF0aWNfY2FzdDxpbnQzMl90Pihmb250LT5HZXRWZXJ0aWNhbFNjYWxlKCkpIDogMTAwOworfQorCit2b2lkIENYRkFfVGV4dFBhcnNlcjo6R2V0VW5kZXJsaW5lKENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpVW5kZXJsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlRW51bSYgaVBlcmlvZCkgY29uc3QgeworICBpVW5kZXJsaW5lID0gMDsKKyAgaVBlcmlvZCA9IFhGQV9BdHRyaWJ1dGVFbnVtOjpBbGw7CisgIENYRkFfRm9udCogZm9udCA9IHBUZXh0UHJvdmlkZXItPkdldEZvbnRJZkV4aXN0cygpOworICBpZiAoIXBTdHlsZSkgeworICAgIGlmIChmb250KSB7CisgICAgICBpVW5kZXJsaW5lID0gZm9udC0+R2V0VW5kZXJsaW5lKCk7CisgICAgICBpUGVyaW9kID0gZm9udC0+R2V0VW5kZXJsaW5lUGVyaW9kKCk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIHVpbnQzMl90IGR3RGVjb3JhdGlvbiA9IHBTdHlsZS0+R2V0VGV4dERlY29yYXRpb24oKTsKKyAgaWYgKGR3RGVjb3JhdGlvbiAmIENGWF9DU1NURVhUREVDT1JBVElPTl9Eb3VibGUpCisgICAgaVVuZGVybGluZSA9IDI7CisgIGVsc2UgaWYgKGR3RGVjb3JhdGlvbiAmIENGWF9DU1NURVhUREVDT1JBVElPTl9VbmRlcmxpbmUpCisgICAgaVVuZGVybGluZSA9IDE7CisKKyAgV2lkZVN0cmluZyB3c1ZhbHVlOworICBpZiAocFN0eWxlLT5HZXRDdXN0b21TdHlsZShMInVuZGVybGluZVBlcmlvZCIsIHdzVmFsdWUpKSB7CisgICAgaWYgKHdzVmFsdWUgPT0gTCJ3b3JkIikKKyAgICAgIGlQZXJpb2QgPSBYRkFfQXR0cmlidXRlRW51bTo6V29yZDsKKyAgfSBlbHNlIGlmIChmb250KSB7CisgICAgaVBlcmlvZCA9IGZvbnQtPkdldFVuZGVybGluZVBlcmlvZCgpOworICB9Cit9CisKK3ZvaWQgQ1hGQV9UZXh0UGFyc2VyOjpHZXRMaW5ldGhyb3VnaChDWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlMaW5ldGhyb3VnaCkgY29uc3QgeworICBpZiAocFN0eWxlKSB7CisgICAgdWludDMyX3QgZHdEZWNvcmF0aW9uID0gcFN0eWxlLT5HZXRUZXh0RGVjb3JhdGlvbigpOworICAgIGlMaW5ldGhyb3VnaCA9IChkd0RlY29yYXRpb24gJiBDRlhfQ1NTVEVYVERFQ09SQVRJT05fTGluZVRocm91Z2gpID8gMSA6IDA7CisgICAgcmV0dXJuOworICB9CisKKyAgQ1hGQV9Gb250KiBmb250ID0gcFRleHRQcm92aWRlci0+R2V0Rm9udElmRXhpc3RzKCk7CisgIGlmIChmb250KQorICAgIGlMaW5ldGhyb3VnaCA9IGZvbnQtPkdldExpbmVUaHJvdWdoKCk7Cit9CisKK0ZYX0FSR0IgQ1hGQV9UZXh0UGFyc2VyOjpHZXRDb2xvcihDWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdCB7CisgIGlmIChwU3R5bGUpCisgICAgcmV0dXJuIHBTdHlsZS0+R2V0Q29sb3IoKTsKKworICBDWEZBX0ZvbnQqIGZvbnQgPSBwVGV4dFByb3ZpZGVyLT5HZXRGb250SWZFeGlzdHMoKTsKKyAgcmV0dXJuIGZvbnQgPyBmb250LT5HZXRDb2xvcigpIDogMHhGRjAwMDAwMDsKK30KKworZmxvYXQgQ1hGQV9UZXh0UGFyc2VyOjpHZXRCYXNlbGluZShDWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3QgeworICBpZiAocFN0eWxlKSB7CisgICAgaWYgKHBTdHlsZS0+R2V0VmVydGljYWxBbGlnbigpID09IENGWF9DU1NWZXJ0aWNhbEFsaWduOjpOdW1iZXIpCisgICAgICByZXR1cm4gcFN0eWxlLT5HZXROdW1iZXJWZXJ0aWNhbEFsaWduKCk7CisgIH0gZWxzZSB7CisgICAgQ1hGQV9Gb250KiBmb250ID0gcFRleHRQcm92aWRlci0+R2V0Rm9udElmRXhpc3RzKCk7CisgICAgaWYgKGZvbnQpCisgICAgICByZXR1cm4gZm9udC0+R2V0QmFzZWxpbmVTaGlmdCgpOworICB9CisgIHJldHVybiAwOworfQorCitmbG9hdCBDWEZBX1RleHRQYXJzZXI6OkdldExpbmVIZWlnaHQoQ1hGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJGaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmVmVyU2NhbGUpIGNvbnN0IHsKKyAgZmxvYXQgZkxpbmVIZWlnaHQgPSAwOworICBpZiAocFN0eWxlKSB7CisgICAgZkxpbmVIZWlnaHQgPSBwU3R5bGUtPkdldExpbmVIZWlnaHQoKTsKKyAgfSBlbHNlIHsKKyAgICBDWEZBX1BhcmEqIHBhcmEgPSBwVGV4dFByb3ZpZGVyLT5HZXRQYXJhSWZFeGlzdHMoKTsKKyAgICBpZiAocGFyYSkKKyAgICAgIGZMaW5lSGVpZ2h0ID0gcGFyYS0+R2V0TGluZUhlaWdodCgpOworICB9CisKKyAgaWYgKGJGaXJzdCkgeworICAgIGZsb2F0IGZGb250U2l6ZSA9IEdldEZvbnRTaXplKHBUZXh0UHJvdmlkZXIsIHBTdHlsZSk7CisgICAgaWYgKGZMaW5lSGVpZ2h0IDwgMC4xZikKKyAgICAgIGZMaW5lSGVpZ2h0ID0gZkZvbnRTaXplOworICAgIGVsc2UKKyAgICAgIGZMaW5lSGVpZ2h0ID0gc3RkOjptaW4oZkxpbmVIZWlnaHQsIGZGb250U2l6ZSk7CisgIH0gZWxzZSBpZiAoZkxpbmVIZWlnaHQgPCAwLjFmKSB7CisgICAgZkxpbmVIZWlnaHQgPSBHZXRGb250U2l6ZShwVGV4dFByb3ZpZGVyLCBwU3R5bGUpICogMS4yZjsKKyAgfQorICBmTGluZUhlaWdodCAqPSBmVmVyU2NhbGU7CisgIHJldHVybiBmTGluZUhlaWdodDsKK30KKworYm9vbCBDWEZBX1RleHRQYXJzZXI6OkdldEVtYmJlZE9iaihDWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1hNTE5vZGUqIHBYTUxOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiB3c1ZhbHVlKSB7CisgIHdzVmFsdWUuY2xlYXIoKTsKKyAgaWYgKCFwWE1MTm9kZSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYm9vbCBiUmV0ID0gZmFsc2U7CisgIGlmIChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZYX1hNTE5PREVfRWxlbWVudCkgeworICAgIENGWF9YTUxFbGVtZW50KiBwRWxlbWVudCA9IHN0YXRpY19jYXN0PENGWF9YTUxFbGVtZW50Kj4ocFhNTE5vZGUpOworICAgIFdpZGVTdHJpbmcgd3NBdHRyID0gcEVsZW1lbnQtPkdldFN0cmluZyhMInhmYTplbWJlZCIpOworICAgIGlmICh3c0F0dHIuSXNFbXB0eSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICh3c0F0dHJbMF0gPT0gTCcjJykKKyAgICAgIHdzQXR0ci5EZWxldGUoMCk7CisKKyAgICBXaWRlU3RyaW5nIHdzID0gcEVsZW1lbnQtPkdldFN0cmluZyhMInhmYTplbWJlZFR5cGUiKTsKKyAgICBpZiAod3MuSXNFbXB0eSgpKQorICAgICAgd3MgPSBMInNvbSI7CisgICAgZWxzZQorICAgICAgd3MuTWFrZUxvd2VyKCk7CisKKyAgICBib29sIGJVUkkgPSAod3MgPT0gTCJ1cmkiKTsKKyAgICBpZiAoIWJVUkkgJiYgd3MgIT0gTCJzb20iKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgd3MgPSBwRWxlbWVudC0+R2V0U3RyaW5nKEwieGZhOmVtYmVkTW9kZSIpOworICAgIGlmICh3cy5Jc0VtcHR5KCkpCisgICAgICB3cyA9IEwiZm9ybWF0dGVkIjsKKyAgICBlbHNlCisgICAgICB3cy5NYWtlTG93ZXIoKTsKKworICAgIGJvb2wgYlJhdyA9ICh3cyA9PSBMInJhdyIpOworICAgIGlmICghYlJhdyAmJiB3cyAhPSBMImZvcm1hdHRlZCIpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBiUmV0ID0gcFRleHRQcm92aWRlci0+R2V0RW1iYmVkT2JqKGJVUkksIGJSYXcsIHdzQXR0ciwgd3NWYWx1ZSk7CisgIH0KKyAgcmV0dXJuIGJSZXQ7Cit9CisKK0NYRkFfVGV4dFBhcnNlQ29udGV4dCogQ1hGQV9UZXh0UGFyc2VyOjpHZXRQYXJzZUNvbnRleHRGcm9tTWFwKAorICAgIENGWF9YTUxOb2RlKiBwWE1MTm9kZSkgeworICBhdXRvIGl0ID0gbV9tYXBYTUxOb2RlVG9QYXJzZUNvbnRleHQuZmluZChwWE1MTm9kZSk7CisgIHJldHVybiBpdCAhPSBtX21hcFhNTE5vZGVUb1BhcnNlQ29udGV4dC5lbmQoKSA/IGl0LT5zZWNvbmQuZ2V0KCkgOiBudWxscHRyOworfQorCitib29sIENYRkFfVGV4dFBhcnNlcjo6R2V0VGFic3RvcHMoQ0ZYX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1RleHRUYWJzdG9wc0NvbnRleHQqIHBUYWJzdG9wQ29udGV4dCkgeworICBpZiAoIXBTdHlsZSB8fCAhcFRhYnN0b3BDb250ZXh0KQorICAgIHJldHVybiBmYWxzZTsKKworICBXaWRlU3RyaW5nIHdzVmFsdWU7CisgIGlmICghcFN0eWxlLT5HZXRDdXN0b21TdHlsZShMInhmYS10YWItc3RvcHMiLCB3c1ZhbHVlKSAmJgorICAgICAgIXBTdHlsZS0+R2V0Q3VzdG9tU3R5bGUoTCJ0YWItc3RvcHMiLCB3c1ZhbHVlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGludDMyX3QgaUxlbmd0aCA9IHdzVmFsdWUuR2V0TGVuZ3RoKCk7CisgIGNvbnN0IHdjaGFyX3QqIHBUYWJTdG9wcyA9IHdzVmFsdWUuY19zdHIoKTsKKyAgaW50MzJfdCBpQ3VyID0gMDsKKyAgaW50MzJfdCBpTGFzdCA9IDA7CisgIFdpZGVTdHJpbmcgd3NBbGlnbjsKKyAgVGFiU3RvcFN0YXR1cyBlU3RhdHVzID0gVGFiU3RvcFN0YXR1czo6Tm9uZTsKKyAgd2NoYXJfdCBjaDsKKyAgd2hpbGUgKGlDdXIgPCBpTGVuZ3RoKSB7CisgICAgY2ggPSBwVGFiU3RvcHNbaUN1cl07CisgICAgc3dpdGNoIChlU3RhdHVzKSB7CisgICAgICBjYXNlIFRhYlN0b3BTdGF0dXM6Ok5vbmU6CisgICAgICAgIGlmIChjaCA8PSAnICcpIHsKKyAgICAgICAgICBpQ3VyKys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZVN0YXR1cyA9IFRhYlN0b3BTdGF0dXM6OkFsaWdubWVudDsKKyAgICAgICAgICBpTGFzdCA9IGlDdXI7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRhYlN0b3BTdGF0dXM6OkFsaWdubWVudDoKKyAgICAgICAgaWYgKGNoID09ICcgJykgeworICAgICAgICAgIHdzQWxpZ24gPSBXaWRlU3RyaW5nVmlldyhwVGFiU3RvcHMgKyBpTGFzdCwgaUN1ciAtIGlMYXN0KTsKKyAgICAgICAgICBlU3RhdHVzID0gVGFiU3RvcFN0YXR1czo6U3RhcnRMZWFkZXI7CisgICAgICAgICAgaUN1cisrOworICAgICAgICAgIHdoaWxlIChpQ3VyIDwgaUxlbmd0aCAmJiBwVGFiU3RvcHNbaUN1cl0gPD0gJyAnKQorICAgICAgICAgICAgaUN1cisrOworICAgICAgICAgIGlMYXN0ID0gaUN1cjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpQ3VyKys7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRhYlN0b3BTdGF0dXM6OlN0YXJ0TGVhZGVyOgorICAgICAgICBpZiAoY2ggIT0gJ2wnKSB7CisgICAgICAgICAgZVN0YXR1cyA9IFRhYlN0b3BTdGF0dXM6OkxvY2F0aW9uOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGludDMyX3QgaUNvdW50ID0gMDsKKyAgICAgICAgICB3aGlsZSAoaUN1ciA8IGlMZW5ndGgpIHsKKyAgICAgICAgICAgIGNoID0gcFRhYlN0b3BzW2lDdXJdOworICAgICAgICAgICAgaUN1cisrOworICAgICAgICAgICAgaWYgKGNoID09ICcoJykgeworICAgICAgICAgICAgICBpQ291bnQrKzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyknKSB7CisgICAgICAgICAgICAgIGlDb3VudC0tOworICAgICAgICAgICAgICBpZiAoaUNvdW50ID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHdoaWxlIChpQ3VyIDwgaUxlbmd0aCAmJiBwVGFiU3RvcHNbaUN1cl0gPD0gJyAnKQorICAgICAgICAgICAgaUN1cisrOworCisgICAgICAgICAgaUxhc3QgPSBpQ3VyOworICAgICAgICAgIGVTdGF0dXMgPSBUYWJTdG9wU3RhdHVzOjpMb2NhdGlvbjsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVGFiU3RvcFN0YXR1czo6TG9jYXRpb246CisgICAgICAgIGlmIChjaCA9PSAnICcpIHsKKyAgICAgICAgICB1aW50MzJfdCBkd0hhc2hDb2RlID0gRlhfSGFzaENvZGVfR2V0Vyh3c0FsaWduLkFzU3RyaW5nVmlldygpLCB0cnVlKTsKKyAgICAgICAgICBDWEZBX01lYXN1cmVtZW50IG1zKFdpZGVTdHJpbmdWaWV3KHBUYWJTdG9wcyArIGlMYXN0LCBpQ3VyIC0gaUxhc3QpKTsKKyAgICAgICAgICBmbG9hdCBmUG9zID0gbXMuVG9Vbml0KFhGQV9Vbml0OjpQdCk7CisgICAgICAgICAgcFRhYnN0b3BDb250ZXh0LT5BcHBlbmQoZHdIYXNoQ29kZSwgZlBvcyk7CisgICAgICAgICAgd3NBbGlnbi5jbGVhcigpOworICAgICAgICAgIGVTdGF0dXMgPSBUYWJTdG9wU3RhdHVzOjpOb25lOworICAgICAgICB9CisgICAgICAgIGlDdXIrKzsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoIXdzQWxpZ24uSXNFbXB0eSgpKSB7CisgICAgdWludDMyX3QgZHdIYXNoQ29kZSA9IEZYX0hhc2hDb2RlX0dldFcod3NBbGlnbi5Bc1N0cmluZ1ZpZXcoKSwgdHJ1ZSk7CisgICAgQ1hGQV9NZWFzdXJlbWVudCBtcyhXaWRlU3RyaW5nVmlldyhwVGFiU3RvcHMgKyBpTGFzdCwgaUN1ciAtIGlMYXN0KSk7CisgICAgZmxvYXQgZlBvcyA9IG1zLlRvVW5pdChYRkFfVW5pdDo6UHQpOworICAgIHBUYWJzdG9wQ29udGV4dC0+QXBwZW5kKGR3SGFzaENvZGUsIGZQb3MpOworICB9CisgIHJldHVybiB0cnVlOworfQorCitDWEZBX1RleHRQYXJzZXI6OlRhZ1Byb3ZpZGVyOjpUYWdQcm92aWRlcigpCisgICAgOiBtX2JUYWdBdmFpbGFibGUoZmFsc2UpLCBtX2JDb250ZW50KGZhbHNlKSB7fQorCitDWEZBX1RleHRQYXJzZXI6OlRhZ1Byb3ZpZGVyOjp+VGFnUHJvdmlkZXIoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV90ZXh0cGFyc2VyLmggYi94ZmEvZnhmYS9jeGZhX3RleHRwYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDI4NTZlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV90ZXh0cGFyc2VyLmgKQEAgLTAsMCArMSwxMjkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9DWEZBX1RFWFRQQVJTRVJfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfQ1hGQV9URVhUUEFSU0VSX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9meF9kaWIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9meGZhX2Jhc2ljLmgiCisKK2NsYXNzIENGR0FTX0dFRm9udDsKK2NsYXNzIENGWF9DU1NDb21wdXRlZFN0eWxlOworY2xhc3MgQ0ZYX0NTU1N0eWxlU2VsZWN0b3I7CitjbGFzcyBDRlhfQ1NTU3R5bGVTaGVldDsKK2NsYXNzIENGWF9YTUxOb2RlOworY2xhc3MgQ1hGQV9GRkRvYzsKK2NsYXNzIENYRkFfVGV4dFBhcnNlQ29udGV4dDsKK2NsYXNzIENYRkFfVGV4dFByb3ZpZGVyOworY2xhc3MgQ1hGQV9UZXh0VGFic3RvcHNDb250ZXh0OworCitjbGFzcyBDWEZBX1RleHRQYXJzZXIgeworIHB1YmxpYzoKKyAgQ1hGQV9UZXh0UGFyc2VyKCk7CisgIHZpcnR1YWwgfkNYRkFfVGV4dFBhcnNlcigpOworCisgIHZvaWQgUmVzZXQoKTsKKyAgdm9pZCBEb1BhcnNlKENGWF9YTUxOb2RlKiBwWE1MQ29udGFpbmVyLCBDWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlcik7CisKKyAgUmV0YWluUHRyPENGWF9DU1NDb21wdXRlZFN0eWxlPiBDcmVhdGVSb290U3R5bGUoCisgICAgICBDWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlcik7CisgIFJldGFpblB0cjxDRlhfQ1NTQ29tcHV0ZWRTdHlsZT4gQ29tcHV0ZVN0eWxlKAorICAgICAgQ0ZYX1hNTE5vZGUqIHBYTUxOb2RlLAorICAgICAgQ0ZYX0NTU0NvbXB1dGVkU3R5bGUqIHBQYXJlbnRTdHlsZSk7CisKKyAgYm9vbCBJc1BhcnNlZCgpIGNvbnN0IHsgcmV0dXJuIG1fYlBhcnNlZDsgfQorCisgIFhGQV9BdHRyaWJ1dGVFbnVtIEdldFZBbGlnbihDWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlcikgY29uc3Q7CisKKyAgZmxvYXQgR2V0VGFiSW50ZXJ2YWwoQ0ZYX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3Q7CisgIGludDMyX3QgQ291bnRUYWJzKENGWF9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUpIGNvbnN0OworCisgIGJvb2wgSXNTcGFjZVJ1bihDRlhfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdDsKKyAgYm9vbCBHZXRUYWJzdG9wcyhDRlhfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlLAorICAgICAgICAgICAgICAgICAgIENYRkFfVGV4dFRhYnN0b3BzQ29udGV4dCogcFRhYnN0b3BDb250ZXh0KTsKKworICBSZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBHZXRGb250KENYRkFfRkZEb2MqIGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlKSBjb25zdDsKKyAgZmxvYXQgR2V0Rm9udFNpemUoQ1hGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgIENGWF9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUpIGNvbnN0OworCisgIGludDMyX3QgR2V0SG9yU2NhbGUoQ1hGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICBDRlhfWE1MTm9kZSogcFhNTE5vZGUpIGNvbnN0OworICBpbnQzMl90IEdldFZlclNjYWxlKENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUpIGNvbnN0OworCisgIHZvaWQgR2V0VW5kZXJsaW5lKENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICBDRlhfQ1NTQ29tcHV0ZWRTdHlsZSogcFN0eWxlLAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpVW5kZXJsaW5lLAorICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlRW51bSYgaVBlcmlvZCkgY29uc3Q7CisgIHZvaWQgR2V0TGluZXRocm91Z2goQ1hGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTGluZXRocm91Z2gpIGNvbnN0OworICBGWF9BUkdCIEdldENvbG9yKENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgIENGWF9DU1NDb21wdXRlZFN0eWxlKiBwU3R5bGUpIGNvbnN0OworICBmbG9hdCBHZXRCYXNlbGluZShDWEZBX1RleHRQcm92aWRlciogcFRleHRQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSkgY29uc3Q7CisgIGZsb2F0IEdldExpbmVIZWlnaHQoQ1hGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0NTU0NvbXB1dGVkU3R5bGUqIHBTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGJGaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmVmVyU2NhbGUpIGNvbnN0OworCisgIGJvb2wgR2V0RW1iYmVkT2JqKENYRkFfVGV4dFByb3ZpZGVyKiBwVGV4dFByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICBDRlhfWE1MTm9kZSogcFhNTE5vZGUsCisgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIHdzVmFsdWUpOworICBDWEZBX1RleHRQYXJzZUNvbnRleHQqIEdldFBhcnNlQ29udGV4dEZyb21NYXAoQ0ZYX1hNTE5vZGUqIHBYTUxOb2RlKTsKKworIHByb3RlY3RlZDoKKyAgYm9vbCBUYWdWYWxpZGF0ZShjb25zdCBXaWRlU3RyaW5nJiBzdHIpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgY2xhc3MgVGFnUHJvdmlkZXIgeworICAgcHVibGljOgorICAgIFRhZ1Byb3ZpZGVyKCk7CisgICAgflRhZ1Byb3ZpZGVyKCk7CisKKyAgICBXaWRlU3RyaW5nIEdldFRhZ05hbWUoKSB7IHJldHVybiBtX3dzVGFnTmFtZTsgfQorCisgICAgdm9pZCBTZXRUYWdOYW1lKGNvbnN0IFdpZGVTdHJpbmcmIHdzTmFtZSkgeyBtX3dzVGFnTmFtZSA9IHdzTmFtZTsgfQorICAgIHZvaWQgU2V0QXR0cmlidXRlKGNvbnN0IFdpZGVTdHJpbmcmIHdzQXR0ciwgY29uc3QgV2lkZVN0cmluZyYgd3NWYWx1ZSkgeworICAgICAgbV9BdHRyaWJ1dGVzLmluc2VydCh7d3NBdHRyLCB3c1ZhbHVlfSk7CisgICAgfQorCisgICAgV2lkZVN0cmluZyBHZXRBdHRyaWJ1dGUoY29uc3QgV2lkZVN0cmluZyYgd3NBdHRyKSB7CisgICAgICByZXR1cm4gbV9BdHRyaWJ1dGVzW3dzQXR0cl07CisgICAgfQorCisgICAgYm9vbCBtX2JUYWdBdmFpbGFibGU7CisgICAgYm9vbCBtX2JDb250ZW50OworCisgICBwcml2YXRlOgorICAgIFdpZGVTdHJpbmcgbV93c1RhZ05hbWU7CisgICAgc3RkOjptYXA8V2lkZVN0cmluZywgV2lkZVN0cmluZz4gbV9BdHRyaWJ1dGVzOworICB9OworCisgIHZvaWQgSW5pdENTU0RhdGEoQ1hGQV9UZXh0UHJvdmlkZXIqIHBUZXh0UHJvdmlkZXIpOworICB2b2lkIFBhcnNlUmljaFRleHQoQ0ZYX1hNTE5vZGUqIHBYTUxOb2RlLCBDRlhfQ1NTQ29tcHV0ZWRTdHlsZSogcFBhcmVudFN0eWxlKTsKKyAgc3RkOjp1bmlxdWVfcHRyPFRhZ1Byb3ZpZGVyPiBQYXJzZVRhZ0luZm8oQ0ZYX1hNTE5vZGUqIHBYTUxOb2RlKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENGWF9DU1NTdHlsZVNoZWV0PiBMb2FkRGVmYXVsdFNoZWV0U3R5bGUoKTsKKyAgUmV0YWluUHRyPENGWF9DU1NDb21wdXRlZFN0eWxlPiBDcmVhdGVTdHlsZSgKKyAgICAgIENGWF9DU1NDb21wdXRlZFN0eWxlKiBwUGFyZW50U3R5bGUpOworCisgIGJvb2wgbV9iUGFyc2VkOworICBib29sIG1fY3NzSW5pdGlhbGl6ZWQ7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfQ1NTU3R5bGVTZWxlY3Rvcj4gbV9wU2VsZWN0b3I7CisgIHN0ZDo6bWFwPENGWF9YTUxOb2RlKiwgc3RkOjp1bmlxdWVfcHRyPENYRkFfVGV4dFBhcnNlQ29udGV4dD4+CisgICAgICBtX21hcFhNTE5vZGVUb1BhcnNlQ29udGV4dDsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfQ1hGQV9URVhUUEFSU0VSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX3RleHRwYXJzZXJfdW5pdHRlc3QuY3BwIGIveGZhL2Z4ZmEvY3hmYV90ZXh0cGFyc2VyX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDc0OGNkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV90ZXh0cGFyc2VyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX3RleHRwYXJzZXIuaCIKKworI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCitjbGFzcyBDWEZBX1Rlc3RUZXh0UGFyc2VyIDogcHVibGljIENYRkFfVGV4dFBhcnNlciB7CisgcHVibGljOgorICBDWEZBX1Rlc3RUZXh0UGFyc2VyKCkgOiBDWEZBX1RleHRQYXJzZXIoKSB7fQorCisgcHJpdmF0ZToKKyAgLy8gQWRkIHRlc3QgY2FzZXMgYXMgZnJpZW5kcyB0byBhY2Nlc3MgcHJvdGVjdGVkIG1lbWJlciBmdW5jdGlvbnMuCisgIEZSSUVORF9URVNUKENYRkFfVGV4dFBhcnNlciwgVGFnVmFsaWRhdGUpOworfTsKKworVEVTVChDWEZBX1RleHRQYXJzZXIsIFRhZ1ZhbGlkYXRlKSB7CisgIENYRkFfVGVzdFRleHRQYXJzZXIgcGFyc2VyOworICBFWFBFQ1RfVFJVRShwYXJzZXIuVGFnVmFsaWRhdGUoTCJiciIpKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyLlRhZ1ZhbGlkYXRlKEwiQnIiKSk7CisgIEVYUEVDVF9UUlVFKHBhcnNlci5UYWdWYWxpZGF0ZShMIkJSIikpOworICBFWFBFQ1RfVFJVRShwYXJzZXIuVGFnVmFsaWRhdGUoTCJhIikpOworICBFWFBFQ1RfVFJVRShwYXJzZXIuVGFnVmFsaWRhdGUoTCJiIikpOworICBFWFBFQ1RfVFJVRShwYXJzZXIuVGFnVmFsaWRhdGUoTCJpIikpOworICBFWFBFQ1RfVFJVRShwYXJzZXIuVGFnVmFsaWRhdGUoTCJwIikpOworICBFWFBFQ1RfVFJVRShwYXJzZXIuVGFnVmFsaWRhdGUoTCJsaSIpKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyLlRhZ1ZhbGlkYXRlKEwib2wiKSk7CisgIEVYUEVDVF9UUlVFKHBhcnNlci5UYWdWYWxpZGF0ZShMInVsIikpOworICBFWFBFQ1RfVFJVRShwYXJzZXIuVGFnVmFsaWRhdGUoTCJzdWIiKSk7CisgIEVYUEVDVF9UUlVFKHBhcnNlci5UYWdWYWxpZGF0ZShMInN1cCIpKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyLlRhZ1ZhbGlkYXRlKEwic3BhbiIpKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyLlRhZ1ZhbGlkYXRlKEwiYm9keSIpKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyLlRhZ1ZhbGlkYXRlKEwiaHRtbCIpKTsKKworICBFWFBFQ1RfRkFMU0UocGFyc2VyLlRhZ1ZhbGlkYXRlKEwiIikpOworICBFWFBFQ1RfRkFMU0UocGFyc2VyLlRhZ1ZhbGlkYXRlKEwidG1sIikpOworICBFWFBFQ1RfRkFMU0UocGFyc2VyLlRhZ1ZhbGlkYXRlKEwieGh0bWwiKSk7CisgIEVYUEVDVF9GQUxTRShwYXJzZXIuVGFnVmFsaWRhdGUoTCJodG1seCIpKTsKK30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfdGV4dHBpZWNlLmNwcCBiL3hmYS9meGZhL2N4ZmFfdGV4dHBpZWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmE4ZDNhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV90ZXh0cGllY2UuY3BwCkBAIC0wLDAgKzEsMTQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfdGV4dHBpZWNlLmgiCisKKyNpbmNsdWRlICJ4ZmEvZmdhcy9mb250L2NmZ2FzX2dlZm9udC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfbGlua3VzZXJkYXRhLmgiCisKK0NYRkFfVGV4dFBpZWNlOjpDWEZBX1RleHRQaWVjZSgpIHt9CisKK0NYRkFfVGV4dFBpZWNlOjp+Q1hGQV9UZXh0UGllY2UoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV90ZXh0cGllY2UuaCBiL3hmYS9meGZhL2N4ZmFfdGV4dHBpZWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM4MTJmOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfdGV4dHBpZWNlLmgKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX0NYRkFfVEVYVFBJRUNFX0hfCisjZGVmaW5lIFhGQV9GWEZBX0NYRkFfVEVYVFBJRUNFX0hfCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvZnhmYV9iYXNpYy5oIgorCitjbGFzcyBDRkdBU19HRUZvbnQ7CitjbGFzcyBDWEZBX0xpbmtVc2VyRGF0YTsKKworY2xhc3MgQ1hGQV9UZXh0UGllY2UgeworIHB1YmxpYzoKKyAgQ1hGQV9UZXh0UGllY2UoKTsKKyAgfkNYRkFfVGV4dFBpZWNlKCk7CisKKyAgV2lkZVN0cmluZyBzelRleHQ7CisgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IFdpZHRoczsKKyAgaW50MzJfdCBpQ2hhcnM7CisgIGludDMyX3QgaUhvclNjYWxlOworICBpbnQzMl90IGlWZXJTY2FsZTsKKyAgaW50MzJfdCBpQmlkaUxldmVsOworICBpbnQzMl90IGlVbmRlcmxpbmU7CisgIFhGQV9BdHRyaWJ1dGVFbnVtIGlQZXJpb2Q7CisgIGludDMyX3QgaUxpbmVUaHJvdWdoOworICBGWF9BUkdCIGR3Q29sb3I7CisgIGZsb2F0IGZGb250U2l6ZTsKKyAgQ0ZYX1JlY3RGIHJ0UGllY2U7CisgIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+IHBGb250OworICBSZXRhaW5QdHI8Q1hGQV9MaW5rVXNlckRhdGE+IHBMaW5rRGF0YTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfQ1hGQV9URVhUUElFQ0VfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfdGV4dHByb3ZpZGVyLmNwcCBiL3hmYS9meGZhL2N4ZmFfdGV4dHByb3ZpZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWRhMjgxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV90ZXh0cHJvdmlkZXIuY3BwCkBAIC0wLDAgKzEsMTc2IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX3RleHRwcm92aWRlci5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sZWxlbWVudC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWxub2RlLmgiCisjaW5jbHVkZSAiZnhqcy9jZnhqc2VfZW5naW5lLmgiCisjaW5jbHVkZSAiZnhqcy9jZnhqc2VfdmFsdWUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfb2JqZWN0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKKyNpbmNsdWRlICJ4ZmEvZmRlL2NmZGVfdGV4dG91dC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZXZlbnRwYXJhbS5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZhcHAuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmY2hlY2tidXR0b24uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZG9jLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRvY3ZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZmllbGQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmcGFnZXZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mb250bWdyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9md2xhZGFwdGVyd2lkZ2V0bWdyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2FwdGlvbi5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2ZvbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pdGVtcy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dHByb2Nlc3Nvci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xvY2FsZXZhbHVlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhcmEuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWx1ZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfcmVzb2x2ZW5vZGVfcnMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX3V0aWxzLmgiCisKK0NYRkFfTm9kZSogQ1hGQV9UZXh0UHJvdmlkZXI6OkdldFRleHROb2RlKGJvb2wmIGJSaWNoVGV4dCkgeworICBiUmljaFRleHQgPSBmYWxzZTsKKworICBpZiAobV9lVHlwZSA9PSBYRkFfVEVYVFBST1ZJREVSVFlQRV9UZXh0KSB7CisgICAgQ1hGQV9Ob2RlKiBwRWxlbWVudE5vZGUgPSBtX3BXaWRnZXRBY2MtPkdldE5vZGUoKTsKKyAgICBDWEZBX1ZhbHVlKiBwVmFsdWVOb2RlID0KKyAgICAgICAgcEVsZW1lbnROb2RlLT5HZXRDaGlsZDxDWEZBX1ZhbHVlPigwLCBYRkFfRWxlbWVudDo6VmFsdWUsIGZhbHNlKTsKKyAgICBpZiAoIXBWYWx1ZU5vZGUpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIENYRkFfTm9kZSogcENoaWxkTm9kZSA9IHBWYWx1ZU5vZGUtPkdldEZpcnN0Q2hpbGQoKTsKKyAgICBpZiAocENoaWxkTm9kZSAmJiBwQ2hpbGROb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpFeERhdGEpIHsKKyAgICAgIE9wdGlvbmFsPFdpZGVTdHJpbmc+IGNvbnRlbnRUeXBlID0gcENoaWxkTm9kZS0+SlNPYmplY3QoKS0+VHJ5QXR0cmlidXRlKAorICAgICAgICAgIFhGQV9BdHRyaWJ1dGU6OkNvbnRlbnRUeXBlLCBmYWxzZSk7CisgICAgICBpZiAoY29udGVudFR5cGUgJiYgKmNvbnRlbnRUeXBlID09IEwidGV4dC9odG1sIikKKyAgICAgICAgYlJpY2hUZXh0ID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIHBDaGlsZE5vZGU7CisgIH0KKworICBpZiAobV9lVHlwZSA9PSBYRkFfVEVYVFBST1ZJREVSVFlQRV9EYXRhc2V0cykgeworICAgIENYRkFfTm9kZSogcEJpbmQgPSBtX3BXaWRnZXRBY2MtPkdldE5vZGUoKS0+R2V0QmluZERhdGEoKTsKKyAgICBDRlhfWE1MTm9kZSogcFhNTE5vZGUgPSBwQmluZC0+R2V0WE1MTWFwcGluZ05vZGUoKTsKKyAgICBBU1NFUlQocFhNTE5vZGUpOworICAgIGZvciAoQ0ZYX1hNTE5vZGUqIHBYTUxDaGlsZCA9CisgICAgICAgICAgICAgcFhNTE5vZGUtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpGaXJzdENoaWxkKTsKKyAgICAgICAgIHBYTUxDaGlsZDsKKyAgICAgICAgIHBYTUxDaGlsZCA9IHBYTUxDaGlsZC0+R2V0Tm9kZUl0ZW0oQ0ZYX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgeworICAgICAgaWYgKHBYTUxDaGlsZC0+R2V0VHlwZSgpID09IEZYX1hNTE5PREVfRWxlbWVudCkgeworICAgICAgICBDRlhfWE1MRWxlbWVudCogcEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxDRlhfWE1MRWxlbWVudCo+KHBYTUxDaGlsZCk7CisgICAgICAgIGlmIChYRkFfUmVjb2duaXplUmljaFRleHQocEVsZW1lbnQpKQorICAgICAgICAgIGJSaWNoVGV4dCA9IHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBwQmluZDsKKyAgfQorCisgIGlmIChtX2VUeXBlID09IFhGQV9URVhUUFJPVklERVJUWVBFX0NhcHRpb24pIHsKKyAgICBDWEZBX0NhcHRpb24qIHBDYXB0aW9uTm9kZSA9CisgICAgICAgIG1fcFdpZGdldEFjYy0+R2V0Tm9kZSgpLT5HZXRDaGlsZDxDWEZBX0NhcHRpb24+KDAsIFhGQV9FbGVtZW50OjpDYXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgaWYgKCFwQ2FwdGlvbk5vZGUpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIENYRkFfVmFsdWUqIHBWYWx1ZU5vZGUgPQorICAgICAgICBwQ2FwdGlvbk5vZGUtPkdldENoaWxkPENYRkFfVmFsdWU+KDAsIFhGQV9FbGVtZW50OjpWYWx1ZSwgZmFsc2UpOworICAgIGlmICghcFZhbHVlTm9kZSkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcFZhbHVlTm9kZS0+R2V0Rmlyc3RDaGlsZCgpOworICAgIGlmIChwQ2hpbGROb2RlICYmIHBDaGlsZE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkV4RGF0YSkgeworICAgICAgT3B0aW9uYWw8V2lkZVN0cmluZz4gY29udGVudFR5cGUgPSBwQ2hpbGROb2RlLT5KU09iamVjdCgpLT5UcnlBdHRyaWJ1dGUoCisgICAgICAgICAgWEZBX0F0dHJpYnV0ZTo6Q29udGVudFR5cGUsIGZhbHNlKTsKKyAgICAgIGlmIChjb250ZW50VHlwZSAmJiAqY29udGVudFR5cGUgPT0gTCJ0ZXh0L2h0bWwiKQorICAgICAgICBiUmljaFRleHQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gcENoaWxkTm9kZTsKKyAgfQorCisgIENYRkFfSXRlbXMqIHBJdGVtTm9kZSA9IG1fcFdpZGdldEFjYy0+R2V0Tm9kZSgpLT5HZXRDaGlsZDxDWEZBX0l0ZW1zPigKKyAgICAgIDAsIFhGQV9FbGVtZW50OjpJdGVtcywgZmFsc2UpOworICBpZiAoIXBJdGVtTm9kZSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBDWEZBX05vZGUqIHBOb2RlID0gcEl0ZW1Ob2RlLT5HZXRGaXJzdENoaWxkKCk7CisgIHdoaWxlIChwTm9kZSkgeworICAgIFdpZGVTdHJpbmcgd3NOYW1lID0gcE5vZGUtPkpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6Ok5hbWUpOworICAgIGlmIChtX2VUeXBlID09IFhGQV9URVhUUFJPVklERVJUWVBFX1JvbGxvdmVyICYmIHdzTmFtZSA9PSBMInJvbGxvdmVyIikKKyAgICAgIHJldHVybiBwTm9kZTsKKyAgICBpZiAobV9lVHlwZSA9PSBYRkFfVEVYVFBST1ZJREVSVFlQRV9Eb3duICYmIHdzTmFtZSA9PSBMImRvd24iKQorICAgICAgcmV0dXJuIHBOb2RlOworCisgICAgcE5vZGUgPSBwTm9kZS0+R2V0TmV4dFNpYmxpbmcoKTsKKyAgfQorICByZXR1cm4gbnVsbHB0cjsKK30KKworQ1hGQV9QYXJhKiBDWEZBX1RleHRQcm92aWRlcjo6R2V0UGFyYUlmRXhpc3RzKCkgeworICBpZiAobV9lVHlwZSA9PSBYRkFfVEVYVFBST1ZJREVSVFlQRV9UZXh0KQorICAgIHJldHVybiBtX3BXaWRnZXRBY2MtPkdldE5vZGUoKS0+R2V0UGFyYUlmRXhpc3RzKCk7CisKKyAgQ1hGQV9DYXB0aW9uKiBwTm9kZSA9IG1fcFdpZGdldEFjYy0+R2V0Tm9kZSgpLT5HZXRDaGlsZDxDWEZBX0NhcHRpb24+KAorICAgICAgMCwgWEZBX0VsZW1lbnQ6OkNhcHRpb24sIGZhbHNlKTsKKyAgcmV0dXJuIHBOb2RlLT5HZXRDaGlsZDxDWEZBX1BhcmE+KDAsIFhGQV9FbGVtZW50OjpQYXJhLCBmYWxzZSk7Cit9CisKK0NYRkFfRm9udCogQ1hGQV9UZXh0UHJvdmlkZXI6OkdldEZvbnRJZkV4aXN0cygpIHsKKyAgaWYgKG1fZVR5cGUgPT0gWEZBX1RFWFRQUk9WSURFUlRZUEVfVGV4dCkKKyAgICByZXR1cm4gbV9wV2lkZ2V0QWNjLT5HZXROb2RlKCktPkdldEZvbnRJZkV4aXN0cygpOworCisgIENYRkFfQ2FwdGlvbiogcE5vZGUgPSBtX3BXaWRnZXRBY2MtPkdldE5vZGUoKS0+R2V0Q2hpbGQ8Q1hGQV9DYXB0aW9uPigKKyAgICAgIDAsIFhGQV9FbGVtZW50OjpDYXB0aW9uLCBmYWxzZSk7CisgIENYRkFfRm9udCogZm9udCA9IHBOb2RlLT5HZXRDaGlsZDxDWEZBX0ZvbnQ+KDAsIFhGQV9FbGVtZW50OjpGb250LCBmYWxzZSk7CisgIHJldHVybiBmb250ID8gZm9udCA6IG1fcFdpZGdldEFjYy0+R2V0Tm9kZSgpLT5HZXRGb250SWZFeGlzdHMoKTsKK30KKworYm9vbCBDWEZBX1RleHRQcm92aWRlcjo6SXNDaGVja0J1dHRvbkFuZEF1dG9XaWR0aCgpIHsKKyAgWEZBX0VsZW1lbnQgZVR5cGUgPSBtX3BXaWRnZXRBY2MtPkdldFVJVHlwZSgpOworICBpZiAoZVR5cGUgIT0gWEZBX0VsZW1lbnQ6OkNoZWNrQnV0dG9uKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuICFtX3BXaWRnZXRBY2MtPkdldE5vZGUoKS0+VHJ5V2lkdGgoKTsKK30KKworYm9vbCBDWEZBX1RleHRQcm92aWRlcjo6R2V0RW1iYmVkT2JqKGJvb2wgYlVSSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIHdzVmFsdWUpIHsKKyAgaWYgKG1fZVR5cGUgIT0gWEZBX1RFWFRQUk9WSURFUlRZUEVfVGV4dCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFiVVJJKQorICAgIHJldHVybiBmYWxzZTsKKworICBDWEZBX05vZGUqIHBXaWRnZXROb2RlID0gbV9wV2lkZ2V0QWNjLT5HZXROb2RlKCk7CisgIENYRkFfTm9kZSogcFBhcmVudCA9IHBXaWRnZXROb2RlLT5HZXRQYXJlbnQoKTsKKyAgQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gcFdpZGdldE5vZGUtPkdldERvY3VtZW50KCk7CisgIENYRkFfTm9kZSogcElETm9kZSA9IG51bGxwdHI7CisgIENYRkFfV2lkZ2V0QWNjKiBwRW1iQWNjID0gbnVsbHB0cjsKKyAgaWYgKHBQYXJlbnQpCisgICAgcElETm9kZSA9IHBEb2N1bWVudC0+R2V0Tm9kZUJ5SUQocFBhcmVudCwgd3NBdHRyLkFzU3RyaW5nVmlldygpKTsKKworICBpZiAoIXBJRE5vZGUpIHsKKyAgICBwSUROb2RlID0gcERvY3VtZW50LT5HZXROb2RlQnlJRCgKKyAgICAgICAgVG9Ob2RlKHBEb2N1bWVudC0+R2V0WEZBT2JqZWN0KFhGQV9IQVNIQ09ERV9Gb3JtKSksCisgICAgICAgIHdzQXR0ci5Bc1N0cmluZ1ZpZXcoKSk7CisgIH0KKyAgaWYgKHBJRE5vZGUpCisgICAgcEVtYkFjYyA9IHBJRE5vZGUtPkdldFdpZGdldEFjYygpOworCisgIGlmICghcEVtYkFjYykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgd3NWYWx1ZSA9IHBFbWJBY2MtPkdldFZhbHVlKFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV90ZXh0cHJvdmlkZXIuaCBiL3hmYS9meGZhL2N4ZmFfdGV4dHByb3ZpZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQzMWM5YQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfdGV4dHByb3ZpZGVyLmgKQEAgLTAsMCArMSw0NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX0NYRkFfVEVYVFBST1ZJREVSX0hfCisjZGVmaW5lIFhGQV9GWEZBX0NYRkFfVEVYVFBST1ZJREVSX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfdGV4dGxheW91dC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfd2lkZ2V0YWNjLmgiCisKK2NsYXNzIENYRkFfRm9udDsKK2NsYXNzIENYRkFfTm9kZTsKKworZW51bSBYRkFfVEVYVFBST1ZJREVSVFlQRSB7CisgIFhGQV9URVhUUFJPVklERVJUWVBFX1RleHQsCisgIFhGQV9URVhUUFJPVklERVJUWVBFX0RhdGFzZXRzLAorICBYRkFfVEVYVFBST1ZJREVSVFlQRV9DYXB0aW9uLAorICBYRkFfVEVYVFBST1ZJREVSVFlQRV9Sb2xsb3ZlciwKKyAgWEZBX1RFWFRQUk9WSURFUlRZUEVfRG93biwKK307CisKK2NsYXNzIENYRkFfVGV4dFByb3ZpZGVyIHsKKyBwdWJsaWM6CisgIENYRkFfVGV4dFByb3ZpZGVyKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjLCBYRkFfVEVYVFBST1ZJREVSVFlQRSBlVHlwZSkKKyAgICAgIDogbV9wV2lkZ2V0QWNjKHBXaWRnZXRBY2MpLCBtX2VUeXBlKGVUeXBlKSB7CisgICAgQVNTRVJUKG1fcFdpZGdldEFjYyk7CisgIH0KKyAgfkNYRkFfVGV4dFByb3ZpZGVyKCkge30KKworICBDWEZBX05vZGUqIEdldFRleHROb2RlKGJvb2wmIGJSaWNoVGV4dCk7CisgIENYRkFfUGFyYSogR2V0UGFyYUlmRXhpc3RzKCk7CisgIENYRkFfRm9udCogR2V0Rm9udElmRXhpc3RzKCk7CisgIGJvb2wgSXNDaGVja0J1dHRvbkFuZEF1dG9XaWR0aCgpOworICBib29sIEdldEVtYmJlZE9iaihib29sIGJVUkksCisgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJhdywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NBdHRyLAorICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiB3c1ZhbHVlKTsKKworIHByaXZhdGU6CisgIENYRkFfV2lkZ2V0QWNjKiBtX3BXaWRnZXRBY2M7CisgIFhGQV9URVhUUFJPVklERVJUWVBFIG1fZVR5cGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX0NYRkFfVEVYVFBST1ZJREVSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX3RleHR0YWJzdG9wc2NvbnRleHQuY3BwIGIveGZhL2Z4ZmEvY3hmYV90ZXh0dGFic3RvcHNjb250ZXh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTk0ZjFjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV90ZXh0dGFic3RvcHNjb250ZXh0LmNwcApAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX3RleHR0YWJzdG9wc2NvbnRleHQuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworQ1hGQV9UZXh0VGFic3RvcHNDb250ZXh0OjpDWEZBX1RleHRUYWJzdG9wc0NvbnRleHQoKQorICAgIDogbV9pVGFiSW5kZXgoLTEpLCBtX2JUYWJzdG9wcyhmYWxzZSksIG1fZlRhYldpZHRoKDApLCBtX2ZMZWZ0KDApIHt9CisKK0NYRkFfVGV4dFRhYnN0b3BzQ29udGV4dDo6fkNYRkFfVGV4dFRhYnN0b3BzQ29udGV4dCgpIHt9CisKK3ZvaWQgQ1hGQV9UZXh0VGFic3RvcHNDb250ZXh0OjpBcHBlbmQodWludDMyX3QgZHdBbGlnbiwgZmxvYXQgZlRhYnN0b3BzKSB7CisgIFhGQV9UQUJTVE9QUyB0YWJzdG9wOworICB0YWJzdG9wLmR3QWxpZ24gPSBkd0FsaWduOworICB0YWJzdG9wLmZUYWJzdG9wcyA9IGZUYWJzdG9wczsKKworICBhdXRvIGl0ID0gc3RkOjpsb3dlcl9ib3VuZChtX3RhYnN0b3BzLmJlZ2luKCksIG1fdGFic3RvcHMuZW5kKCksIHRhYnN0b3ApOworICBtX3RhYnN0b3BzLmluc2VydChpdCwgdGFic3RvcCk7Cit9CisKK3ZvaWQgQ1hGQV9UZXh0VGFic3RvcHNDb250ZXh0OjpSZW1vdmVBbGwoKSB7CisgIG1fdGFic3RvcHMuY2xlYXIoKTsKK30KKwordm9pZCBDWEZBX1RleHRUYWJzdG9wc0NvbnRleHQ6OlJlc2V0KCkgeworICBtX2lUYWJJbmRleCA9IC0xOworICBtX2JUYWJzdG9wcyA9IGZhbHNlOworICBtX2ZUYWJXaWR0aCA9IDA7CisgIG1fZkxlZnQgPSAwOworfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV90ZXh0dGFic3RvcHNjb250ZXh0LmggYi94ZmEvZnhmYS9jeGZhX3RleHR0YWJzdG9wc2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODM3ZTM1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV90ZXh0dGFic3RvcHNjb250ZXh0LmgKQEAgLTAsMCArMSwzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX0NYRkFfVEVYVFRBQlNUT1BTQ09OVEVYVF9IXworI2RlZmluZSBYRkFfRlhGQV9DWEZBX1RFWFRUQUJTVE9QU0NPTlRFWFRfSF8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8dmVjdG9yPgorCitzdHJ1Y3QgWEZBX1RBQlNUT1BTIHsKKyAgdWludDMyX3QgZHdBbGlnbjsKKyAgZmxvYXQgZlRhYnN0b3BzOworCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFhGQV9UQUJTVE9QUyYgdGhhdCkgY29uc3QgeworICAgIHJldHVybiBmVGFic3RvcHMgPCB0aGF0LmZUYWJzdG9wczsKKyAgfQorfTsKKworY2xhc3MgQ1hGQV9UZXh0VGFic3RvcHNDb250ZXh0IHsKKyBwdWJsaWM6CisgIENYRkFfVGV4dFRhYnN0b3BzQ29udGV4dCgpOworICB+Q1hGQV9UZXh0VGFic3RvcHNDb250ZXh0KCk7CisKKyAgdm9pZCBBcHBlbmQodWludDMyX3QgZHdBbGlnbiwgZmxvYXQgZlRhYnN0b3BzKTsKKyAgdm9pZCBSZW1vdmVBbGwoKTsKKyAgdm9pZCBSZXNldCgpOworCisgIGludDMyX3QgbV9pVGFiSW5kZXg7CisgIGJvb2wgbV9iVGFic3RvcHM7CisgIGZsb2F0IG1fZlRhYldpZHRoOworICBmbG9hdCBtX2ZMZWZ0OworICBzdGQ6OnZlY3RvcjxYRkFfVEFCU1RPUFM+IG1fdGFic3RvcHM7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX0NYRkFfVEVYVFRBQlNUT1BTQ09OVEVYVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV90ZXh0dXNlcmRhdGEuY3BwIGIveGZhL2Z4ZmEvY3hmYV90ZXh0dXNlcmRhdGEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNDY5NzgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX3RleHR1c2VyZGF0YS5jcHAKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV90ZXh0dXNlcmRhdGEuaCIKKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3MuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Nzcy9jZnhfY3NzY29tcHV0ZWRzdHlsZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY3NzL2NmeF9jc3NzdHlsZXNlbGVjdG9yLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9saW5rdXNlcmRhdGEuaCIKKworQ1hGQV9UZXh0VXNlckRhdGE6OkNYRkFfVGV4dFVzZXJEYXRhKAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfQ1NTQ29tcHV0ZWRTdHlsZT4mIHBTdHlsZSkKKyAgICA6IG1fcFN0eWxlKHBTdHlsZSkge30KKworQ1hGQV9UZXh0VXNlckRhdGE6OkNYRkFfVGV4dFVzZXJEYXRhKAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfQ1NTQ29tcHV0ZWRTdHlsZT4mIHBTdHlsZSwKKyAgICBjb25zdCBSZXRhaW5QdHI8Q1hGQV9MaW5rVXNlckRhdGE+JiBwTGlua0RhdGEpCisgICAgOiBtX3BTdHlsZShwU3R5bGUpLCBtX3BMaW5rRGF0YShwTGlua0RhdGEpIHt9CisKK0NYRkFfVGV4dFVzZXJEYXRhOjp+Q1hGQV9UZXh0VXNlckRhdGEoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV90ZXh0dXNlcmRhdGEuaCBiL3hmYS9meGZhL2N4ZmFfdGV4dHVzZXJkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhZjIxNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfdGV4dHVzZXJkYXRhLmgKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX0NYRkFfVEVYVFVTRVJEQVRBX0hfCisjZGVmaW5lIFhGQV9GWEZBX0NYRkFfVEVYVFVTRVJEQVRBX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKworY2xhc3MgQ0ZYX0NTU0NvbXB1dGVkU3R5bGU7CitjbGFzcyBDWEZBX0xpbmtVc2VyRGF0YTsKKworY2xhc3MgQ1hGQV9UZXh0VXNlckRhdGEgOiBwdWJsaWMgUmV0YWluYWJsZSB7CisgcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KKyAgZnJpZW5kIFJldGFpblB0cjxUPiBwZGZpdW06Ok1ha2VSZXRhaW4oQXJncyYmLi4uIGFyZ3MpOworCisgIFJldGFpblB0cjxDRlhfQ1NTQ29tcHV0ZWRTdHlsZT4gbV9wU3R5bGU7CisgIFJldGFpblB0cjxDWEZBX0xpbmtVc2VyRGF0YT4gbV9wTGlua0RhdGE7CisKKyBwcml2YXRlOgorICBleHBsaWNpdCBDWEZBX1RleHRVc2VyRGF0YShjb25zdCBSZXRhaW5QdHI8Q0ZYX0NTU0NvbXB1dGVkU3R5bGU+JiBwU3R5bGUpOworICBDWEZBX1RleHRVc2VyRGF0YShjb25zdCBSZXRhaW5QdHI8Q0ZYX0NTU0NvbXB1dGVkU3R5bGU+JiBwU3R5bGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldGFpblB0cjxDWEZBX0xpbmtVc2VyRGF0YT4mIHBMaW5rRGF0YSk7CisgIH5DWEZBX1RleHRVc2VyRGF0YSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9DWEZBX1RFWFRVU0VSREFUQV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvY3hmYV93aWRnZXRhY2MuY3BwIGIveGZhL2Z4ZmEvY3hmYV93aWRnZXRhY2MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNGUwOGUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9jeGZhX3dpZGdldGFjYy5jcHAKQEAgLTAsMCArMSwyNzU3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX3dpZGdldGFjYy5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X2RlY2ltYWwuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9tZW1vcnlzdHJlYW0uaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWxlbGVtZW50LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbG5vZGUuaCIKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV9lbmdpbmUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfb2JqZWN0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorI2luY2x1ZGUgInhmYS9mZGUvY2ZkZV90ZXh0b3V0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmFwcC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZkb2MuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmZG9jdmlldy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZub3RpZnkuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmd2lkZ2V0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mb250bWdyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV90ZXh0bGF5b3V0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV90ZXh0cHJvdmlkZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9iaW5kLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYm9yZGVyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2FsY3VsYXRlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2FwdGlvbi5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbWIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWNpbWFsLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ldmVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2ZvbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9mb3JtYXQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbWFnZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2l0ZW1zLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0cHJvY2Vzc29yLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxldmFsdWUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tYXJnaW4uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWFzdXJlbWVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYXJhLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGljdHVyZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NjcmlwdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3N0cm9rZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3VpLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsaWRhdGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWx1ZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfdXRpbHMuaCIKKworY2xhc3MgQ1hGQV9XaWRnZXRMYXlvdXREYXRhIHsKKyBwdWJsaWM6CisgIENYRkFfV2lkZ2V0TGF5b3V0RGF0YSgpIDogbV9mV2lkZ2V0SGVpZ2h0KC0xKSB7fQorICB2aXJ0dWFsIH5DWEZBX1dpZGdldExheW91dERhdGEoKSB7fQorCisgIGZsb2F0IG1fZldpZGdldEhlaWdodDsKK307CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciB1aW50OF90IGdfaW52X2Jhc2U2NFsxMjhdID0geworICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDYyLCAgMjU1LAorICAgIDI1NSwgMjU1LCA2MywgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LCAgNTksICA2MCwgIDYxLCAgMjU1LCAyNTUsCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksCisgICAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE4LCAgMTksICAyMCwgIDIxLCAgMjIsICAyMywgIDI0LAorICAgIDI1LCAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLCAgMzIsICAzMywKKyAgICAzNCwgIDM1LCAgMzYsICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywgIDQ0LCAgNDUsICA0NiwgIDQ3LCAgNDgsCisgICAgNDksICA1MCwgIDUxLCAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCit9OworCit1aW50OF90KiBYRkFfUmVtb3ZlQmFzZTY0V2hpdGVzcGFjZShjb25zdCB1aW50OF90KiBwU3RyLCBpbnQzMl90IGlMZW4pIHsKKyAgdWludDhfdCogcENQOworICBpbnQzMl90IGkgPSAwLCBqID0gMDsKKyAgaWYgKGlMZW4gPT0gMCkgeworICAgIGlMZW4gPSBzdHJsZW4oKGNoYXIqKXBTdHIpOworICB9CisgIHBDUCA9IEZYX0FsbG9jKHVpbnQ4X3QsIGlMZW4gKyAxKTsKKyAgZm9yICg7IGkgPCBpTGVuOyBpKyspIHsKKyAgICBpZiAoKHBTdHJbaV0gJiAxMjgpID09IDApIHsKKyAgICAgIGlmIChnX2ludl9iYXNlNjRbcFN0cltpXV0gIT0gMHhGRiB8fCBwU3RyW2ldID09ICc9JykgeworICAgICAgICBwQ1BbaisrXSA9IHBTdHJbaV07CisgICAgICB9CisgICAgfQorICB9CisgIHBDUFtqXSA9ICdcMCc7CisgIHJldHVybiBwQ1A7Cit9CisKK2ludDMyX3QgWEZBX0Jhc2U2NERlY29kZShjb25zdCBjaGFyKiBwU3RyLCB1aW50OF90KiBwT3V0QnVmZmVyKSB7CisgIGlmICghcFN0cikgeworICAgIHJldHVybiAwOworICB9CisgIHVpbnQ4X3QqIHBCdWZmZXIgPQorICAgICAgWEZBX1JlbW92ZUJhc2U2NFdoaXRlc3BhY2UoKHVpbnQ4X3QqKXBTdHIsIHN0cmxlbigoY2hhciopcFN0cikpOworICBpZiAoIXBCdWZmZXIpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpbnQzMl90IGlMZW4gPSBzdHJsZW4oKGNoYXIqKXBCdWZmZXIpOworICBpbnQzMl90IGkgPSAwLCBqID0gMDsKKyAgdWludDMyX3QgZHdMaW1iID0gMDsKKyAgZm9yICg7IGkgKyAzIDwgaUxlbjsgaSArPSA0KSB7CisgICAgaWYgKHBCdWZmZXJbaV0gPT0gJz0nIHx8IHBCdWZmZXJbaSArIDFdID09ICc9JyB8fCBwQnVmZmVyW2kgKyAyXSA9PSAnPScgfHwKKyAgICAgICAgcEJ1ZmZlcltpICsgM10gPT0gJz0nKSB7CisgICAgICBpZiAocEJ1ZmZlcltpXSA9PSAnPScgfHwgcEJ1ZmZlcltpICsgMV0gPT0gJz0nKSB7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKHBCdWZmZXJbaSArIDJdID09ICc9JykgeworICAgICAgICBkd0xpbWIgPSAoKHVpbnQzMl90KWdfaW52X2Jhc2U2NFtwQnVmZmVyW2ldXSA8PCA2KSB8CisgICAgICAgICAgICAgICAgICgodWludDMyX3QpZ19pbnZfYmFzZTY0W3BCdWZmZXJbaSArIDFdXSk7CisgICAgICAgIHBPdXRCdWZmZXJbal0gPSAodWludDhfdCkoZHdMaW1iID4+IDQpICYgMHhGRjsKKyAgICAgICAgaisrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZHdMaW1iID0gKCh1aW50MzJfdClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpXV0gPDwgMTIpIHwKKyAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpICsgMV1dIDw8IDYpIHwKKyAgICAgICAgICAgICAgICAgKCh1aW50MzJfdClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpICsgMl1dKTsKKyAgICAgICAgcE91dEJ1ZmZlcltqXSA9ICh1aW50OF90KShkd0xpbWIgPj4gMTApICYgMHhGRjsKKyAgICAgICAgcE91dEJ1ZmZlcltqICsgMV0gPSAodWludDhfdCkoZHdMaW1iID4+IDIpICYgMHhGRjsKKyAgICAgICAgaiArPSAyOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBkd0xpbWIgPSAoKHVpbnQzMl90KWdfaW52X2Jhc2U2NFtwQnVmZmVyW2ldXSA8PCAxOCkgfAorICAgICAgICAgICAgICAgKCh1aW50MzJfdClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpICsgMV1dIDw8IDEyKSB8CisgICAgICAgICAgICAgICAoKHVpbnQzMl90KWdfaW52X2Jhc2U2NFtwQnVmZmVyW2kgKyAyXV0gPDwgNikgfAorICAgICAgICAgICAgICAgKCh1aW50MzJfdClnX2ludl9iYXNlNjRbcEJ1ZmZlcltpICsgM11dKTsKKyAgICAgIHBPdXRCdWZmZXJbal0gPSAodWludDhfdCkoZHdMaW1iID4+IDE2KSAmIDB4ZmY7CisgICAgICBwT3V0QnVmZmVyW2ogKyAxXSA9ICh1aW50OF90KShkd0xpbWIgPj4gOCkgJiAweGZmOworICAgICAgcE91dEJ1ZmZlcltqICsgMl0gPSAodWludDhfdCkoZHdMaW1iKSYweGZmOworICAgICAgaiArPSAzOworICAgIH0KKyAgfQorICBGWF9GcmVlKHBCdWZmZXIpOworICByZXR1cm4gajsKK30KKworRlhDT0RFQ19JTUFHRV9UWVBFIFhGQV9HZXRJbWFnZVR5cGUoY29uc3QgV2lkZVN0cmluZyYgd3NUeXBlKSB7CisgIFdpZGVTdHJpbmcgd3NDb250ZW50VHlwZSh3c1R5cGUpOworICB3c0NvbnRlbnRUeXBlLk1ha2VMb3dlcigpOworICBpZiAod3NDb250ZW50VHlwZSA9PSBMImltYWdlL2pwZyIpCisgICAgcmV0dXJuIEZYQ09ERUNfSU1BR0VfSlBHOworICBpZiAod3NDb250ZW50VHlwZSA9PSBMImltYWdlL3BuZyIpCisgICAgcmV0dXJuIEZYQ09ERUNfSU1BR0VfUE5HOworICBpZiAod3NDb250ZW50VHlwZSA9PSBMImltYWdlL2dpZiIpCisgICAgcmV0dXJuIEZYQ09ERUNfSU1BR0VfR0lGOworICBpZiAod3NDb250ZW50VHlwZSA9PSBMImltYWdlL2JtcCIpCisgICAgcmV0dXJuIEZYQ09ERUNfSU1BR0VfQk1QOworICBpZiAod3NDb250ZW50VHlwZSA9PSBMImltYWdlL3RpZiIpCisgICAgcmV0dXJuIEZYQ09ERUNfSU1BR0VfVElGOworICByZXR1cm4gRlhDT0RFQ19JTUFHRV9VTktOT1dOOworfQorCitSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBYRkFfTG9hZEltYWdlRGF0YShDWEZBX0ZGRG9jKiBwRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9JbWFnZSogcEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYk5hbWVJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlJbWFnZVhEcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSW1hZ2VZRHBpKSB7CisgIFdpZGVTdHJpbmcgd3NIcmVmID0gcEltYWdlLT5HZXRIcmVmKCk7CisgIFdpZGVTdHJpbmcgd3NJbWFnZSA9IHBJbWFnZS0+R2V0Q29udGVudCgpOworICBpZiAod3NIcmVmLklzRW1wdHkoKSAmJiB3c0ltYWdlLklzRW1wdHkoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBGWENPREVDX0lNQUdFX1RZUEUgdHlwZSA9IFhGQV9HZXRJbWFnZVR5cGUocEltYWdlLT5HZXRDb250ZW50VHlwZSgpKTsKKyAgQnl0ZVN0cmluZyBic0NvbnRlbnQ7CisgIHVpbnQ4X3QqIHBJbWFnZUJ1ZmZlciA9IG51bGxwdHI7CisgIFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBwSW1hZ2VGaWxlUmVhZDsKKyAgaWYgKHdzSW1hZ2UuR2V0TGVuZ3RoKCkgPiAwKSB7CisgICAgWEZBX0F0dHJpYnV0ZUVudW0gaUVuY29kaW5nID0gcEltYWdlLT5HZXRUcmFuc2ZlckVuY29kaW5nKCk7CisgICAgaWYgKGlFbmNvZGluZyA9PSBYRkFfQXR0cmlidXRlRW51bTo6QmFzZTY0KSB7CisgICAgICBCeXRlU3RyaW5nIGJzRGF0YSA9IHdzSW1hZ2UuVVRGOEVuY29kZSgpOworICAgICAgaW50MzJfdCBpTGVuZ3RoID0gYnNEYXRhLkdldExlbmd0aCgpOworICAgICAgcEltYWdlQnVmZmVyID0gRlhfQWxsb2ModWludDhfdCwgaUxlbmd0aCk7CisgICAgICBpbnQzMl90IGlSZWFkID0gWEZBX0Jhc2U2NERlY29kZShic0RhdGEuY19zdHIoKSwgcEltYWdlQnVmZmVyKTsKKyAgICAgIGlmIChpUmVhZCA+IDApIHsKKyAgICAgICAgcEltYWdlRmlsZVJlYWQgPQorICAgICAgICAgICAgcGRmaXVtOjpNYWtlUmV0YWluPENGWF9NZW1vcnlTdHJlYW0+KHBJbWFnZUJ1ZmZlciwgaVJlYWQsIGZhbHNlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgYnNDb250ZW50ID0gQnl0ZVN0cmluZzo6RnJvbVVuaWNvZGUod3NJbWFnZSk7CisgICAgICBwSW1hZ2VGaWxlUmVhZCA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfTWVtb3J5U3RyZWFtPigKKyAgICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QqPihic0NvbnRlbnQucmF3X3N0cigpKSwgYnNDb250ZW50LkdldExlbmd0aCgpLAorICAgICAgICAgIGZhbHNlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgV2lkZVN0cmluZyB3c1VSTCA9IHdzSHJlZjsKKyAgICBpZiAod3NVUkwuTGVmdCg3KSAhPSBMImh0dHA6Ly8iICYmIHdzVVJMLkxlZnQoNikgIT0gTCJmdHA6Ly8iKSB7CisgICAgICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBwQml0bWFwID0KKyAgICAgICAgICBwRG9jLT5HZXRQREZOYW1lZEltYWdlKHdzVVJMLkFzU3RyaW5nVmlldygpLCBpSW1hZ2VYRHBpLCBpSW1hZ2VZRHBpKTsKKyAgICAgIGlmIChwQml0bWFwKSB7CisgICAgICAgIGJOYW1lSW1hZ2UgPSB0cnVlOworICAgICAgICByZXR1cm4gcEJpdG1hcDsKKyAgICAgIH0KKyAgICB9CisgICAgcEltYWdlRmlsZVJlYWQgPSBwRG9jLT5HZXREb2NFbnZpcm9ubWVudCgpLT5PcGVuTGlua2VkRmlsZShwRG9jLCB3c1VSTCk7CisgIH0KKyAgaWYgKCFwSW1hZ2VGaWxlUmVhZCkgeworICAgIEZYX0ZyZWUocEltYWdlQnVmZmVyKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBiTmFtZUltYWdlID0gZmFsc2U7CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBCaXRtYXAgPQorICAgICAgWEZBX0xvYWRJbWFnZUZyb21CdWZmZXIocEltYWdlRmlsZVJlYWQsIHR5cGUsIGlJbWFnZVhEcGksIGlJbWFnZVlEcGkpOworICBGWF9GcmVlKHBJbWFnZUJ1ZmZlcik7CisgIHJldHVybiBwQml0bWFwOworfQorCitjbGFzcyBDWEZBX1RleHRMYXlvdXREYXRhIDogcHVibGljIENYRkFfV2lkZ2V0TGF5b3V0RGF0YSB7CisgcHVibGljOgorICBDWEZBX1RleHRMYXlvdXREYXRhKCkge30KKyAgfkNYRkFfVGV4dExheW91dERhdGEoKSBvdmVycmlkZSB7fQorCisgIENYRkFfVGV4dExheW91dCogR2V0VGV4dExheW91dCgpIGNvbnN0IHsgcmV0dXJuIG1fcFRleHRMYXlvdXQuZ2V0KCk7IH0KKyAgQ1hGQV9UZXh0UHJvdmlkZXIqIEdldFRleHRQcm92aWRlcigpIGNvbnN0IHsgcmV0dXJuIG1fcFRleHRQcm92aWRlci5nZXQoKTsgfQorCisgIHZvaWQgTG9hZFRleHQoQ1hGQV9GRkRvYyogZG9jLCBDWEZBX1dpZGdldEFjYyogcEFjYykgeworICAgIGlmIChtX3BUZXh0TGF5b3V0KQorICAgICAgcmV0dXJuOworCisgICAgbV9wVGV4dFByb3ZpZGVyID0KKyAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfVGV4dFByb3ZpZGVyPihwQWNjLCBYRkFfVEVYVFBST1ZJREVSVFlQRV9UZXh0KTsKKyAgICBtX3BUZXh0TGF5b3V0ID0KKyAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfVGV4dExheW91dD4oZG9jLCBtX3BUZXh0UHJvdmlkZXIuZ2V0KCkpOworICB9CisKKyBwcml2YXRlOgorICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9UZXh0TGF5b3V0PiBtX3BUZXh0TGF5b3V0OworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9UZXh0UHJvdmlkZXI+IG1fcFRleHRQcm92aWRlcjsKK307CisKK2NsYXNzIENYRkFfSW1hZ2VMYXlvdXREYXRhIDogcHVibGljIENYRkFfV2lkZ2V0TGF5b3V0RGF0YSB7CisgcHVibGljOgorICBDWEZBX0ltYWdlTGF5b3V0RGF0YSgpCisgICAgICA6IG1fYk5hbWVkSW1hZ2UoZmFsc2UpLCBtX2lJbWFnZVhEcGkoMCksIG1faUltYWdlWURwaSgwKSB7fQorCisgIH5DWEZBX0ltYWdlTGF5b3V0RGF0YSgpIG92ZXJyaWRlIHt9CisKKyAgYm9vbCBMb2FkSW1hZ2VEYXRhKENYRkFfRkZEb2MqIGRvYywgQ1hGQV9XaWRnZXRBY2MqIHBBY2MpIHsKKyAgICBpZiAobV9wRElCaXRtYXApCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIENYRkFfVmFsdWUqIHZhbHVlID0gcEFjYy0+R2V0Tm9kZSgpLT5HZXRGb3JtVmFsdWVJZkV4aXN0cygpOworICAgIGlmICghdmFsdWUpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBDWEZBX0ltYWdlKiBpbWFnZSA9IHZhbHVlLT5HZXRJbWFnZUlmRXhpc3RzKCk7CisgICAgaWYgKCFpbWFnZSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHBBY2MtPlNldEltYWdlSW1hZ2UoWEZBX0xvYWRJbWFnZURhdGEoZG9jLCBpbWFnZSwgbV9iTmFtZWRJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faUltYWdlWERwaSwgbV9pSW1hZ2VZRHBpKSk7CisgICAgcmV0dXJuICEhbV9wRElCaXRtYXA7CisgIH0KKworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBtX3BESUJpdG1hcDsKKyAgYm9vbCBtX2JOYW1lZEltYWdlOworICBpbnQzMl90IG1faUltYWdlWERwaTsKKyAgaW50MzJfdCBtX2lJbWFnZVlEcGk7Cit9OworCitjbGFzcyBDWEZBX0ZpZWxkTGF5b3V0RGF0YSA6IHB1YmxpYyBDWEZBX1dpZGdldExheW91dERhdGEgeworIHB1YmxpYzoKKyAgQ1hGQV9GaWVsZExheW91dERhdGEoKSB7fQorICB+Q1hGQV9GaWVsZExheW91dERhdGEoKSBvdmVycmlkZSB7fQorCisgIGJvb2wgTG9hZENhcHRpb24oQ1hGQV9GRkRvYyogZG9jLCBDWEZBX1dpZGdldEFjYyogcEFjYykgeworICAgIGlmIChtX3BDYXBUZXh0TGF5b3V0KQorICAgICAgcmV0dXJuIHRydWU7CisgICAgQ1hGQV9DYXB0aW9uKiBjYXB0aW9uID0gcEFjYy0+R2V0Tm9kZSgpLT5HZXRDYXB0aW9uSWZFeGlzdHMoKTsKKyAgICBpZiAoIWNhcHRpb24gfHwgY2FwdGlvbi0+SXNIaWRkZW4oKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIG1fcENhcFRleHRQcm92aWRlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1RleHRQcm92aWRlcj4oCisgICAgICAgIHBBY2MsIFhGQV9URVhUUFJPVklERVJUWVBFX0NhcHRpb24pOworICAgIG1fcENhcFRleHRMYXlvdXQgPQorICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9UZXh0TGF5b3V0Pihkb2MsIG1fcENhcFRleHRQcm92aWRlci5nZXQoKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9UZXh0TGF5b3V0PiBtX3BDYXBUZXh0TGF5b3V0OworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9UZXh0UHJvdmlkZXI+IG1fcENhcFRleHRQcm92aWRlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPENGREVfVGV4dE91dD4gbV9wVGV4dE91dDsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG1fRmllbGRTcGxpdEFycmF5OworfTsKKworY2xhc3MgQ1hGQV9UZXh0RWRpdERhdGEgOiBwdWJsaWMgQ1hGQV9GaWVsZExheW91dERhdGEge307CisKK2NsYXNzIENYRkFfSW1hZ2VFZGl0RGF0YSA6IHB1YmxpYyBDWEZBX0ZpZWxkTGF5b3V0RGF0YSB7CisgcHVibGljOgorICBDWEZBX0ltYWdlRWRpdERhdGEoKQorICAgICAgOiBtX2JOYW1lZEltYWdlKGZhbHNlKSwgbV9pSW1hZ2VYRHBpKDApLCBtX2lJbWFnZVlEcGkoMCkge30KKworICB+Q1hGQV9JbWFnZUVkaXREYXRhKCkgb3ZlcnJpZGUge30KKworICBib29sIExvYWRJbWFnZURhdGEoQ1hGQV9GRkRvYyogZG9jLCBDWEZBX1dpZGdldEFjYyogcEFjYykgeworICAgIGlmIChtX3BESUJpdG1hcCkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgQ1hGQV9WYWx1ZSogdmFsdWUgPSBwQWNjLT5HZXROb2RlKCktPkdldEZvcm1WYWx1ZUlmRXhpc3RzKCk7CisgICAgaWYgKCF2YWx1ZSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIENYRkFfSW1hZ2UqIGltYWdlID0gdmFsdWUtPkdldEltYWdlSWZFeGlzdHMoKTsKKyAgICBpZiAoIWltYWdlKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcEFjYy0+U2V0SW1hZ2VFZGl0SW1hZ2UoWEZBX0xvYWRJbWFnZURhdGEoZG9jLCBpbWFnZSwgbV9iTmFtZWRJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2lJbWFnZVhEcGksIG1faUltYWdlWURwaSkpOworICAgIHJldHVybiAhIW1fcERJQml0bWFwOworICB9CisKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gbV9wRElCaXRtYXA7CisgIGJvb2wgbV9iTmFtZWRJbWFnZTsKKyAgaW50MzJfdCBtX2lJbWFnZVhEcGk7CisgIGludDMyX3QgbV9pSW1hZ2VZRHBpOworfTsKKworZmxvYXQgR2V0RWRnZVRoaWNrbmVzcyhjb25zdCBzdGQ6OnZlY3RvcjxDWEZBX1N0cm9rZSo+JiBzdHJva2VzLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGIzRFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCkgeworICBmbG9hdCBmVGhpY2tuZXNzID0gMDsKKworICBDWEZBX1N0cm9rZSogc3Ryb2tlID0gc3Ryb2tlc1tuSW5kZXggKiAyICsgMV07CisgIGlmIChzdHJva2UtPklzVmlzaWJsZSgpKSB7CisgICAgaWYgKG5JbmRleCA9PSAwKQorICAgICAgZlRoaWNrbmVzcyArPSAyLjVmOworCisgICAgZlRoaWNrbmVzcyArPSBzdHJva2UtPkdldFRoaWNrbmVzcygpICogKGIzRFN0eWxlID8gNCA6IDIpOworICB9CisgIHJldHVybiBmVGhpY2tuZXNzOworfQorCitib29sIFNwbGl0RGF0ZVRpbWUoY29uc3QgV2lkZVN0cmluZyYgd3NEYXRlVGltZSwKKyAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiB3c0RhdGUsCisgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyYgd3NUaW1lKSB7CisgIHdzRGF0ZSA9IEwiIjsKKyAgd3NUaW1lID0gTCIiOworICBpZiAod3NEYXRlVGltZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGF1dG8gblNwbGl0SW5kZXggPSB3c0RhdGVUaW1lLkZpbmQoJ1QnKTsKKyAgaWYgKCFuU3BsaXRJbmRleC5oYXNfdmFsdWUoKSkKKyAgICBuU3BsaXRJbmRleCA9IHdzRGF0ZVRpbWUuRmluZCgnICcpOworICBpZiAoIW5TcGxpdEluZGV4Lmhhc192YWx1ZSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICB3c0RhdGUgPSB3c0RhdGVUaW1lLkxlZnQoblNwbGl0SW5kZXgudmFsdWUoKSk7CisgIGlmICghd3NEYXRlLklzRW1wdHkoKSkgeworICAgIGlmICghc3RkOjphbnlfb2Yod3NEYXRlLmJlZ2luKCksIHdzRGF0ZS5lbmQoKSwgc3RkOjppc3dkaWdpdCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgd3NUaW1lID0gd3NEYXRlVGltZS5SaWdodCh3c0RhdGVUaW1lLkdldExlbmd0aCgpIC0gblNwbGl0SW5kZXgudmFsdWUoKSAtIDEpOworICBpZiAoIXdzVGltZS5Jc0VtcHR5KCkpIHsKKyAgICBpZiAoIXN0ZDo6YW55X29mKHdzVGltZS5iZWdpbigpLCB3c1RpbWUuZW5kKCksIHN0ZDo6aXN3ZGlnaXQpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitzdGQ6OnBhaXI8WEZBX0VsZW1lbnQsIENYRkFfTm9kZSo+IENyZWF0ZVVJQ2hpbGQoQ1hGQV9Ob2RlKiBwTm9kZSkgeworICBYRkFfRWxlbWVudCBlVHlwZSA9IHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpOworICBYRkFfRWxlbWVudCBlV2lkZ2V0VHlwZSA9IGVUeXBlOworICBpZiAoZVR5cGUgIT0gWEZBX0VsZW1lbnQ6OkZpZWxkICYmIGVUeXBlICE9IFhGQV9FbGVtZW50OjpEcmF3KQorICAgIHJldHVybiB7ZVdpZGdldFR5cGUsIG51bGxwdHJ9OworCisgIGVXaWRnZXRUeXBlID0gWEZBX0VsZW1lbnQ6OlVua25vd247CisgIFhGQV9FbGVtZW50IGVVSVR5cGUgPSBYRkFfRWxlbWVudDo6VW5rbm93bjsKKyAgYXV0byogZGVmVmFsdWUgPQorICAgICAgcE5vZGUtPkpTT2JqZWN0KCktPkdldE9yQ3JlYXRlUHJvcGVydHk8Q1hGQV9WYWx1ZT4oMCwgWEZBX0VsZW1lbnQ6OlZhbHVlKTsKKyAgWEZBX0VsZW1lbnQgZVZhbHVlVHlwZSA9CisgICAgICBkZWZWYWx1ZSA/IGRlZlZhbHVlLT5HZXRDaGlsZFZhbHVlQ2xhc3NJRCgpIDogWEZBX0VsZW1lbnQ6OlVua25vd247CisgIHN3aXRjaCAoZVZhbHVlVHlwZSkgeworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJvb2xlYW46CisgICAgICBlVUlUeXBlID0gWEZBX0VsZW1lbnQ6OkNoZWNrQnV0dG9uOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6SW50ZWdlcjoKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpEZWNpbWFsOgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkZsb2F0OgorICAgICAgZVVJVHlwZSA9IFhGQV9FbGVtZW50OjpOdW1lcmljRWRpdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkV4RGF0YToKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpUZXh0OgorICAgICAgZVVJVHlwZSA9IFhGQV9FbGVtZW50OjpUZXh0RWRpdDsKKyAgICAgIGVXaWRnZXRUeXBlID0gWEZBX0VsZW1lbnQ6OlRleHQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpEYXRlOgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRpbWU6CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RGF0ZVRpbWU6CisgICAgICBlVUlUeXBlID0gWEZBX0VsZW1lbnQ6OkRhdGVUaW1lRWRpdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkltYWdlOgorICAgICAgZVVJVHlwZSA9IFhGQV9FbGVtZW50OjpJbWFnZUVkaXQ7CisgICAgICBlV2lkZ2V0VHlwZSA9IFhGQV9FbGVtZW50OjpJbWFnZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkFyYzoKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpMaW5lOgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlJlY3RhbmdsZToKKyAgICAgIGVVSVR5cGUgPSBYRkFfRWxlbWVudDo6RGVmYXVsdFVpOworICAgICAgZVdpZGdldFR5cGUgPSBlVmFsdWVUeXBlOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisKKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IG51bGxwdHI7CisgIENYRkFfVWkqIHBVSSA9CisgICAgICBwTm9kZS0+SlNPYmplY3QoKS0+R2V0T3JDcmVhdGVQcm9wZXJ0eTxDWEZBX1VpPigwLCBYRkFfRWxlbWVudDo6VWkpOworICBDWEZBX05vZGUqIHBDaGlsZCA9IHBVSSA/IHBVSS0+R2V0Rmlyc3RDaGlsZCgpIDogbnVsbHB0cjsKKyAgZm9yICg7IHBDaGlsZDsgcENoaWxkID0gcENoaWxkLT5HZXROZXh0U2libGluZygpKSB7CisgICAgWEZBX0VsZW1lbnQgZUNoaWxkVHlwZSA9IHBDaGlsZC0+R2V0RWxlbWVudFR5cGUoKTsKKyAgICBpZiAoZUNoaWxkVHlwZSA9PSBYRkFfRWxlbWVudDo6RXh0cmFzIHx8CisgICAgICAgIGVDaGlsZFR5cGUgPT0gWEZBX0VsZW1lbnQ6OlBpY3R1cmUpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGF1dG8gbm9kZSA9IENYRkFfTm9kZTo6Q3JlYXRlKHBDaGlsZC0+R2V0RG9jdW1lbnQoKSwgWEZBX0VsZW1lbnQ6OlVpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlOjpGb3JtKTsKKyAgICBpZiAobm9kZSAmJiBub2RlLT5IYXNQcm9wZXJ0eUZsYWdzKGVDaGlsZFR5cGUsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2YpKSB7CisgICAgICBwVUlDaGlsZCA9IHBDaGlsZDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChlVHlwZSA9PSBYRkFfRWxlbWVudDo6RHJhdykgeworICAgIFhGQV9FbGVtZW50IGVEcmF3ID0KKyAgICAgICAgcFVJQ2hpbGQgPyBwVUlDaGlsZC0+R2V0RWxlbWVudFR5cGUoKSA6IFhGQV9FbGVtZW50OjpVbmtub3duOworICAgIHN3aXRjaCAoZURyYXcpIHsKKyAgICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRleHRFZGl0OgorICAgICAgICBlV2lkZ2V0VHlwZSA9IFhGQV9FbGVtZW50OjpUZXh0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkltYWdlRWRpdDoKKyAgICAgICAgZVdpZGdldFR5cGUgPSBYRkFfRWxlbWVudDo6SW1hZ2U7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZVdpZGdldFR5cGUgPSBlV2lkZ2V0VHlwZSA9PSBYRkFfRWxlbWVudDo6VW5rbm93biA/IFhGQV9FbGVtZW50OjpUZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBlV2lkZ2V0VHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChwVUlDaGlsZCAmJiBwVUlDaGlsZC0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6RGVmYXVsdFVpKSB7CisgICAgICBlV2lkZ2V0VHlwZSA9IFhGQV9FbGVtZW50OjpUZXh0RWRpdDsKKyAgICB9IGVsc2UgeworICAgICAgZVdpZGdldFR5cGUgPQorICAgICAgICAgIHBVSUNoaWxkID8gcFVJQ2hpbGQtPkdldEVsZW1lbnRUeXBlKCkKKyAgICAgICAgICAgICAgICAgICA6IChlVUlUeXBlID09IFhGQV9FbGVtZW50OjpVbmtub3duID8gWEZBX0VsZW1lbnQ6OlRleHRFZGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGVVSVR5cGUpOworICAgIH0KKyAgfQorCisgIGlmICghcFVJQ2hpbGQpIHsKKyAgICBpZiAoZVVJVHlwZSA9PSBYRkFfRWxlbWVudDo6VW5rbm93bikgeworICAgICAgZVVJVHlwZSA9IFhGQV9FbGVtZW50OjpUZXh0RWRpdDsKKyAgICAgIGlmIChkZWZWYWx1ZSkgeworICAgICAgICBkZWZWYWx1ZS0+SlNPYmplY3QoKS0+R2V0T3JDcmVhdGVQcm9wZXJ0eTxDWEZBX1RleHQ+KDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlRleHQpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4ge2VXaWRnZXRUeXBlLAorICAgICAgICAgICAgcFVJID8gcFVJLT5KU09iamVjdCgpLT5HZXRPckNyZWF0ZVByb3BlcnR5PENYRkFfTm9kZT4oMCwgZVVJVHlwZSkKKyAgICAgICAgICAgICAgICA6IG51bGxwdHJ9OworICB9CisKKyAgaWYgKGVVSVR5cGUgIT0gWEZBX0VsZW1lbnQ6OlVua25vd24pCisgICAgcmV0dXJuIHtlV2lkZ2V0VHlwZSwgcFVJQ2hpbGR9OworCisgIHN3aXRjaCAocFVJQ2hpbGQtPkdldEVsZW1lbnRUeXBlKCkpIHsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDaGVja0J1dHRvbjogeworICAgICAgZVZhbHVlVHlwZSA9IFhGQV9FbGVtZW50OjpUZXh0OworICAgICAgaWYgKENYRkFfSXRlbXMqIHBJdGVtcyA9CisgICAgICAgICAgICAgIHBOb2RlLT5HZXRDaGlsZDxDWEZBX0l0ZW1zPigwLCBYRkFfRWxlbWVudDo6SXRlbXMsIGZhbHNlKSkgeworICAgICAgICBpZiAoQ1hGQV9Ob2RlKiBwSXRlbSA9CisgICAgICAgICAgICAgICAgcEl0ZW1zLT5HZXRDaGlsZDxDWEZBX05vZGU+KDAsIFhGQV9FbGVtZW50OjpVbmtub3duLCBmYWxzZSkpIHsKKyAgICAgICAgICBlVmFsdWVUeXBlID0gcEl0ZW0tPkdldEVsZW1lbnRUeXBlKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFhGQV9FbGVtZW50OjpEYXRlVGltZUVkaXQ6CisgICAgICBlVmFsdWVUeXBlID0gWEZBX0VsZW1lbnQ6OkRhdGVUaW1lOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6SW1hZ2VFZGl0OgorICAgICAgZVZhbHVlVHlwZSA9IFhGQV9FbGVtZW50OjpJbWFnZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok51bWVyaWNFZGl0OgorICAgICAgZVZhbHVlVHlwZSA9IFhGQV9FbGVtZW50OjpGbG9hdDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNob2ljZUxpc3Q6IHsKKyAgICAgIGVWYWx1ZVR5cGUgPSAocFVJQ2hpbGQtPkpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6T3BlbikgPT0KKyAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZUVudW06Ok11bHRpU2VsZWN0KQorICAgICAgICAgICAgICAgICAgICAgICA/IFhGQV9FbGVtZW50OjpFeERhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgOiBYRkFfRWxlbWVudDo6VGV4dDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFhGQV9FbGVtZW50OjpCYXJjb2RlOgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJ1dHRvbjoKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQYXNzd29yZEVkaXQ6CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U2lnbmF0dXJlOgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRleHRFZGl0OgorICAgIGRlZmF1bHQ6CisgICAgICBlVmFsdWVUeXBlID0gWEZBX0VsZW1lbnQ6OlRleHQ7CisgICAgICBicmVhazsKKyAgfQorICBpZiAoZGVmVmFsdWUpCisgICAgZGVmVmFsdWUtPkpTT2JqZWN0KCktPkdldE9yQ3JlYXRlUHJvcGVydHk8Q1hGQV9Ob2RlPigwLCBlVmFsdWVUeXBlKTsKKworICByZXR1cm4ge2VXaWRnZXRUeXBlLCBwVUlDaGlsZH07Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1dpZGdldEFjYzo6Q1hGQV9XaWRnZXRBY2MoQ1hGQV9Ob2RlKiBwTm9kZSkKKyAgICA6IG1fYklzTnVsbCh0cnVlKSwKKyAgICAgIG1fYlByZU51bGwodHJ1ZSksCisgICAgICBtX3BVaUNoaWxkTm9kZShudWxscHRyKSwKKyAgICAgIG1fZVVJVHlwZShYRkFfRWxlbWVudDo6VW5rbm93biksCisgICAgICBtX3BOb2RlKHBOb2RlKSB7fQorCitDWEZBX1dpZGdldEFjYzo6fkNYRkFfV2lkZ2V0QWNjKCkgPSBkZWZhdWx0OworCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpSZXNldERhdGEoKSB7CisgIFdpZGVTdHJpbmcgd3NWYWx1ZTsKKyAgWEZBX0VsZW1lbnQgZVVJVHlwZSA9IEdldFVJVHlwZSgpOworICBzd2l0Y2ggKGVVSVR5cGUpIHsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpJbWFnZUVkaXQ6IHsKKyAgICAgIENYRkFfVmFsdWUqIGltYWdlVmFsdWUgPSBtX3BOb2RlLT5HZXREZWZhdWx0VmFsdWVJZkV4aXN0cygpOworICAgICAgQ1hGQV9JbWFnZSogaW1hZ2UgPSBpbWFnZVZhbHVlID8gaW1hZ2VWYWx1ZS0+R2V0SW1hZ2VJZkV4aXN0cygpIDogbnVsbHB0cjsKKyAgICAgIFdpZGVTdHJpbmcgd3NDb250ZW50VHlwZSwgd3NIcmVmOworICAgICAgaWYgKGltYWdlKSB7CisgICAgICAgIHdzVmFsdWUgPSBpbWFnZS0+R2V0Q29udGVudCgpOworICAgICAgICB3c0NvbnRlbnRUeXBlID0gaW1hZ2UtPkdldENvbnRlbnRUeXBlKCk7CisgICAgICAgIHdzSHJlZiA9IGltYWdlLT5HZXRIcmVmKCk7CisgICAgICB9CisgICAgICBTZXRJbWFnZUVkaXQod3NDb250ZW50VHlwZSwgd3NIcmVmLCB3c1ZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFhGQV9FbGVtZW50OjpFeGNsR3JvdXA6IHsKKyAgICAgIENYRkFfTm9kZSogcE5leHRDaGlsZCA9IG1fcE5vZGUtPkdldEZpcnN0Q29udGFpbmVyQ2hpbGQoKTsKKyAgICAgIHdoaWxlIChwTmV4dENoaWxkKSB7CisgICAgICAgIENYRkFfTm9kZSogcENoaWxkID0gcE5leHRDaGlsZDsKKyAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBBY2MgPSBwQ2hpbGQtPkdldFdpZGdldEFjYygpOworICAgICAgICBpZiAoIXBBY2MpCisgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgYm9vbCBkb25lID0gZmFsc2U7CisgICAgICAgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkgeworICAgICAgICAgIENYRkFfVmFsdWUqIGRlZlZhbHVlID0gcEFjYy0+R2V0Tm9kZSgpLT5HZXREZWZhdWx0VmFsdWVJZkV4aXN0cygpOworICAgICAgICAgIGlmIChkZWZWYWx1ZSkgeworICAgICAgICAgICAgd3NWYWx1ZSA9IGRlZlZhbHVlLT5HZXRDaGlsZFZhbHVlQ29udGVudCgpOworICAgICAgICAgICAgU2V0VmFsdWUoWEZBX1ZBTFVFUElDVFVSRV9SYXcsIHdzVmFsdWUpOworICAgICAgICAgICAgcEFjYy0+U2V0VmFsdWUoWEZBX1ZBTFVFUElDVFVSRV9SYXcsIHdzVmFsdWUpOworICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZG9uZSkgeworICAgICAgICAgIENYRkFfSXRlbXMqIHBJdGVtcyA9CisgICAgICAgICAgICAgIHBDaGlsZC0+R2V0Q2hpbGQ8Q1hGQV9JdGVtcz4oMCwgWEZBX0VsZW1lbnQ6Okl0ZW1zLCBmYWxzZSk7CisgICAgICAgICAgaWYgKCFwSXRlbXMpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgIFdpZGVTdHJpbmcgaXRlbVRleHQ7CisgICAgICAgICAgaWYgKHBJdGVtcy0+Q291bnRDaGlsZHJlbihYRkFfRWxlbWVudDo6VW5rbm93biwgZmFsc2UpID4gMSkgeworICAgICAgICAgICAgaXRlbVRleHQgPQorICAgICAgICAgICAgICAgIHBJdGVtcy0+R2V0Q2hpbGQ8Q1hGQV9Ob2RlPigxLCBYRkFfRWxlbWVudDo6VW5rbm93biwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgIC0+SlNPYmplY3QoKQorICAgICAgICAgICAgICAgICAgICAtPkdldENvbnRlbnQoZmFsc2UpOworICAgICAgICAgIH0KKyAgICAgICAgICBwQWNjLT5TZXRWYWx1ZShYRkFfVkFMVUVQSUNUVVJFX1JhdywgaXRlbVRleHQpOworICAgICAgICB9CisgICAgICAgIHBOZXh0Q2hpbGQgPSBwQ2hpbGQtPkdldE5leHRDb250YWluZXJTaWJsaW5nKCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q2hvaWNlTGlzdDoKKyAgICAgIENsZWFyQWxsU2VsZWN0aW9ucygpOworICAgIGRlZmF1bHQ6IHsKKyAgICAgIENYRkFfVmFsdWUqIGRlZlZhbHVlID0gbV9wTm9kZS0+R2V0RGVmYXVsdFZhbHVlSWZFeGlzdHMoKTsKKyAgICAgIGlmIChkZWZWYWx1ZSkKKyAgICAgICAgd3NWYWx1ZSA9IGRlZlZhbHVlLT5HZXRDaGlsZFZhbHVlQ29udGVudCgpOworCisgICAgICBTZXRWYWx1ZShYRkFfVkFMVUVQSUNUVVJFX1Jhdywgd3NWYWx1ZSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKwordm9pZCBDWEZBX1dpZGdldEFjYzo6U2V0SW1hZ2VFZGl0KGNvbnN0IFdpZGVTdHJpbmcmIHdzQ29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NIcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzRGF0YSkgeworICBDWEZBX1ZhbHVlKiBmb3JtVmFsdWUgPSBtX3BOb2RlLT5HZXRGb3JtVmFsdWVJZkV4aXN0cygpOworICBDWEZBX0ltYWdlKiBpbWFnZSA9IGZvcm1WYWx1ZSA/IGZvcm1WYWx1ZS0+R2V0SW1hZ2VJZkV4aXN0cygpIDogbnVsbHB0cjsKKyAgaWYgKGltYWdlKSB7CisgICAgaW1hZ2UtPlNldENvbnRlbnRUeXBlKFdpZGVTdHJpbmcod3NDb250ZW50VHlwZSkpOworICAgIGltYWdlLT5TZXRIcmVmKHdzSHJlZik7CisgIH0KKworICBtX3BOb2RlLT5KU09iamVjdCgpLT5TZXRDb250ZW50KHdzRGF0YSwgR2V0Rm9ybWF0RGF0YVZhbHVlKHdzRGF0YSksIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHRydWUpOworCisgIENYRkFfTm9kZSogcEJpbmQgPSBtX3BOb2RlLT5HZXRCaW5kRGF0YSgpOworICBpZiAoIXBCaW5kKSB7CisgICAgaWYgKGltYWdlKQorICAgICAgaW1hZ2UtPlNldFRyYW5zZmVyRW5jb2RpbmcoWEZBX0F0dHJpYnV0ZUVudW06OkJhc2U2NCk7CisgICAgcmV0dXJuOworICB9CisgIHBCaW5kLT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpDb250ZW50VHlwZSwgd3NDb250ZW50VHlwZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIENYRkFfTm9kZSogcEhyZWZOb2RlID0gcEJpbmQtPkdldEZpcnN0Q2hpbGQoKTsKKyAgaWYgKHBIcmVmTm9kZSkgeworICAgIHBIcmVmTm9kZS0+SlNPYmplY3QoKS0+U2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6VmFsdWUsIHdzSHJlZiwgZmFsc2UsIGZhbHNlKTsKKyAgfSBlbHNlIHsKKyAgICBDRlhfWE1MTm9kZSogcFhNTE5vZGUgPSBwQmluZC0+R2V0WE1MTWFwcGluZ05vZGUoKTsKKyAgICBBU1NFUlQocFhNTE5vZGUgJiYgcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGWF9YTUxOT0RFX0VsZW1lbnQpOworICAgIHN0YXRpY19jYXN0PENGWF9YTUxFbGVtZW50Kj4ocFhNTE5vZGUpLT5TZXRTdHJpbmcoTCJocmVmIiwgd3NIcmVmKTsKKyAgfQorfQorCitDWEZBX0ZGV2lkZ2V0KiBDWEZBX1dpZGdldEFjYzo6R2V0TmV4dFdpZGdldChDWEZBX0ZGV2lkZ2V0KiBwV2lkZ2V0KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ZGV2lkZ2V0Kj4ocFdpZGdldC0+R2V0TmV4dCgpKTsKK30KKwordm9pZCBDWEZBX1dpZGdldEFjYzo6VXBkYXRlVUlEaXNwbGF5KENYRkFfRkZEb2NWaWV3KiBkb2NWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRkZXaWRnZXQqIHBFeGNlcHQpIHsKKyAgQ1hGQV9GRldpZGdldCogcFdpZGdldCA9IGRvY1ZpZXctPkdldFdpZGdldEZvck5vZGUobV9wTm9kZSk7CisgIGZvciAoOyBwV2lkZ2V0OyBwV2lkZ2V0ID0gR2V0TmV4dFdpZGdldChwV2lkZ2V0KSkgeworICAgIGlmIChwV2lkZ2V0ID09IHBFeGNlcHQgfHwgIXBXaWRnZXQtPklzTG9hZGVkKCkgfHwKKyAgICAgICAgKEdldFVJVHlwZSgpICE9IFhGQV9FbGVtZW50OjpDaGVja0J1dHRvbiAmJiBwV2lkZ2V0LT5Jc0ZvY3VzZWQoKSkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBwV2lkZ2V0LT5VcGRhdGVGV0xEYXRhKCk7CisgICAgcFdpZGdldC0+QWRkSW52YWxpZGF0ZVJlY3QoKTsKKyAgfQorfQorCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpDYWxjQ2FwdGlvblNpemUoQ1hGQV9GRkRvYyogZG9jLCBDRlhfU2l6ZUYmIHN6Q2FwKSB7CisgIENYRkFfQ2FwdGlvbiogY2FwdGlvbiA9IG1fcE5vZGUtPkdldENhcHRpb25JZkV4aXN0cygpOworICBpZiAoIWNhcHRpb24gfHwgIWNhcHRpb24tPklzVmlzaWJsZSgpKQorICAgIHJldHVybjsKKworICBMb2FkQ2FwdGlvbihkb2MpOworCisgIFhGQV9FbGVtZW50IGVVSVR5cGUgPSBHZXRVSVR5cGUoKTsKKyAgWEZBX0F0dHJpYnV0ZUVudW0gaUNhcFBsYWNlbWVudCA9IGNhcHRpb24tPkdldFBsYWNlbWVudFR5cGUoKTsKKyAgZmxvYXQgZkNhcFJlc2VydmUgPSBjYXB0aW9uLT5HZXRSZXNlcnZlKCk7CisgIGNvbnN0IGJvb2wgYlZlcnQgPSBpQ2FwUGxhY2VtZW50ID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpUb3AgfHwKKyAgICAgICAgICAgICAgICAgICAgIGlDYXBQbGFjZW1lbnQgPT0gWEZBX0F0dHJpYnV0ZUVudW06OkJvdHRvbTsKKyAgY29uc3QgYm9vbCBiUmVzZXJ2ZUV4aXQgPSBmQ2FwUmVzZXJ2ZSA+IDAuMDE7CisgIENYRkFfVGV4dExheW91dCogcENhcFRleHRMYXlvdXQgPQorICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9GaWVsZExheW91dERhdGEqPihtX3BMYXlvdXREYXRhLmdldCgpKQorICAgICAgICAgIC0+bV9wQ2FwVGV4dExheW91dC5nZXQoKTsKKyAgaWYgKHBDYXBUZXh0TGF5b3V0KSB7CisgICAgaWYgKCFiVmVydCAmJiBlVUlUeXBlICE9IFhGQV9FbGVtZW50OjpCdXR0b24pCisgICAgICBzekNhcC53aWR0aCA9IGZDYXBSZXNlcnZlOworCisgICAgQ0ZYX1NpemVGIG1pblNpemU7CisgICAgc3pDYXAgPSBwQ2FwVGV4dExheW91dC0+Q2FsY1NpemUobWluU2l6ZSwgc3pDYXApOworICAgIGlmIChiUmVzZXJ2ZUV4aXQpCisgICAgICBiVmVydCA/IHN6Q2FwLmhlaWdodCA9IGZDYXBSZXNlcnZlIDogc3pDYXAud2lkdGggPSBmQ2FwUmVzZXJ2ZTsKKyAgfSBlbHNlIHsKKyAgICBmbG9hdCBmRm9udFNpemUgPSAxMC4wZjsKKyAgICBDWEZBX0ZvbnQqIGZvbnQgPSBjYXB0aW9uLT5HZXRGb250SWZFeGlzdHMoKTsKKyAgICBpZiAoZm9udCkgeworICAgICAgZkZvbnRTaXplID0gZm9udC0+R2V0Rm9udFNpemUoKTsKKyAgICB9IGVsc2UgeworICAgICAgQ1hGQV9Gb250KiB3aWRnZXRmb250ID0gbV9wTm9kZS0+R2V0Rm9udElmRXhpc3RzKCk7CisgICAgICBpZiAod2lkZ2V0Zm9udCkKKyAgICAgICAgZkZvbnRTaXplID0gd2lkZ2V0Zm9udC0+R2V0Rm9udFNpemUoKTsKKyAgICB9CisKKyAgICBpZiAoYlZlcnQpIHsKKyAgICAgIHN6Q2FwLmhlaWdodCA9IGZDYXBSZXNlcnZlID4gMCA/IGZDYXBSZXNlcnZlIDogZkZvbnRTaXplOworICAgIH0gZWxzZSB7CisgICAgICBzekNhcC53aWR0aCA9IGZDYXBSZXNlcnZlID4gMCA/IGZDYXBSZXNlcnZlIDogMDsKKyAgICAgIHN6Q2FwLmhlaWdodCA9IGZGb250U2l6ZTsKKyAgICB9CisgIH0KKworICBDWEZBX01hcmdpbiogY2FwdGlvbk1hcmdpbiA9IGNhcHRpb24tPkdldE1hcmdpbklmRXhpc3RzKCk7CisgIGlmICghY2FwdGlvbk1hcmdpbikKKyAgICByZXR1cm47CisKKyAgZmxvYXQgZkxlZnRJbnNldCA9IGNhcHRpb25NYXJnaW4tPkdldExlZnRJbnNldCgpOworICBmbG9hdCBmVG9wSW5zZXQgPSBjYXB0aW9uTWFyZ2luLT5HZXRUb3BJbnNldCgpOworICBmbG9hdCBmUmlnaHRJbnNldCA9IGNhcHRpb25NYXJnaW4tPkdldFJpZ2h0SW5zZXQoKTsKKyAgZmxvYXQgZkJvdHRvbUluc2V0ID0gY2FwdGlvbk1hcmdpbi0+R2V0Qm90dG9tSW5zZXQoKTsKKyAgaWYgKGJSZXNlcnZlRXhpdCkgeworICAgIGJWZXJ0ID8gKHN6Q2FwLndpZHRoICs9IGZMZWZ0SW5zZXQgKyBmUmlnaHRJbnNldCkKKyAgICAgICAgICA6IChzekNhcC5oZWlnaHQgKz0gZlRvcEluc2V0ICsgZkJvdHRvbUluc2V0KTsKKyAgfSBlbHNlIHsKKyAgICBzekNhcC53aWR0aCArPSBmTGVmdEluc2V0ICsgZlJpZ2h0SW5zZXQ7CisgICAgc3pDYXAuaGVpZ2h0ICs9IGZUb3BJbnNldCArIGZCb3R0b21JbnNldDsKKyAgfQorfQorCitib29sIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVGaWVsZEF1dG9TaXplKENYRkFfRkZEb2MqIGRvYywgQ0ZYX1NpemVGJiBzaXplKSB7CisgIENGWF9TaXplRiBzekNhcDsKKyAgQ2FsY0NhcHRpb25TaXplKGRvYywgc3pDYXApOworCisgIENGWF9SZWN0RiBydFVJTWFyZ2luID0gR2V0VUlNYXJnaW4oKTsKKyAgc2l6ZS53aWR0aCArPSBydFVJTWFyZ2luLmxlZnQgKyBydFVJTWFyZ2luLndpZHRoOworICBzaXplLmhlaWdodCArPSBydFVJTWFyZ2luLnRvcCArIHJ0VUlNYXJnaW4uaGVpZ2h0OworICBpZiAoc3pDYXAud2lkdGggPiAwICYmIHN6Q2FwLmhlaWdodCA+IDApIHsKKyAgICBDWEZBX0NhcHRpb24qIGNhcHRpb24gPSBtX3BOb2RlLT5HZXRDYXB0aW9uSWZFeGlzdHMoKTsKKyAgICBYRkFfQXR0cmlidXRlRW51bSBwbGFjZW1lbnQgPSBjYXB0aW9uID8gY2FwdGlvbi0+R2V0UGxhY2VtZW50VHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IENYRkFfQ2FwdGlvbjo6a0RlZmF1bHRQbGFjZW1lbnRUeXBlOworICAgIHN3aXRjaCAocGxhY2VtZW50KSB7CisgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpMZWZ0OgorICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6UmlnaHQ6CisgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpJbmxpbmU6IHsKKyAgICAgICAgc2l6ZS53aWR0aCArPSBzekNhcC53aWR0aDsKKyAgICAgICAgc2l6ZS5oZWlnaHQgPSBzdGQ6Om1heChzaXplLmhlaWdodCwgc3pDYXAuaGVpZ2h0KTsKKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpUb3A6CisgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpCb3R0b206IHsKKyAgICAgICAgc2l6ZS5oZWlnaHQgKz0gc3pDYXAuaGVpZ2h0OworICAgICAgICBzaXplLndpZHRoID0gc3RkOjptYXgoc2l6ZS53aWR0aCwgc3pDYXAud2lkdGgpOworICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBDYWxjdWxhdGVXaWRnZXRBdXRvU2l6ZShzaXplKTsKK30KKworYm9vbCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlV2lkZ2V0QXV0b1NpemUoQ0ZYX1NpemVGJiBzaXplKSB7CisgIENYRkFfTWFyZ2luKiBtYXJnaW4gPSBtX3BOb2RlLT5HZXRNYXJnaW5JZkV4aXN0cygpOworICBpZiAobWFyZ2luKSB7CisgICAgc2l6ZS53aWR0aCArPSBtYXJnaW4tPkdldExlZnRJbnNldCgpICsgbWFyZ2luLT5HZXRSaWdodEluc2V0KCk7CisgICAgc2l6ZS5oZWlnaHQgKz0gbWFyZ2luLT5HZXRUb3BJbnNldCgpICsgbWFyZ2luLT5HZXRCb3R0b21JbnNldCgpOworICB9CisKKyAgQ1hGQV9QYXJhKiBwYXJhID0gbV9wTm9kZS0+R2V0UGFyYUlmRXhpc3RzKCk7CisgIGlmIChwYXJhKQorICAgIHNpemUud2lkdGggKz0gcGFyYS0+R2V0TWFyZ2luTGVmdCgpICsgcGFyYS0+R2V0VGV4dEluZGVudCgpOworCisgIE9wdGlvbmFsPGZsb2F0PiB3aWR0aCA9IG1fcE5vZGUtPlRyeVdpZHRoKCk7CisgIGlmICh3aWR0aCkgeworICAgIHNpemUud2lkdGggPSAqd2lkdGg7CisgIH0gZWxzZSB7CisgICAgT3B0aW9uYWw8ZmxvYXQ+IG1pbiA9IG1fcE5vZGUtPlRyeU1pbldpZHRoKCk7CisgICAgaWYgKG1pbikKKyAgICAgIHNpemUud2lkdGggPSBzdGQ6Om1heChzaXplLndpZHRoLCAqbWluKTsKKworICAgIE9wdGlvbmFsPGZsb2F0PiBtYXggPSBtX3BOb2RlLT5UcnlNYXhXaWR0aCgpOworICAgIGlmIChtYXggJiYgKm1heCA+IDApCisgICAgICBzaXplLndpZHRoID0gc3RkOjptaW4oc2l6ZS53aWR0aCwgKm1heCk7CisgIH0KKworICBPcHRpb25hbDxmbG9hdD4gaGVpZ2h0ID0gbV9wTm9kZS0+VHJ5SGVpZ2h0KCk7CisgIGlmIChoZWlnaHQpIHsKKyAgICBzaXplLmhlaWdodCA9ICpoZWlnaHQ7CisgIH0gZWxzZSB7CisgICAgT3B0aW9uYWw8ZmxvYXQ+IG1pbiA9IG1fcE5vZGUtPlRyeU1pbkhlaWdodCgpOworICAgIGlmIChtaW4pCisgICAgICBzaXplLmhlaWdodCA9IHN0ZDo6bWF4KHNpemUuaGVpZ2h0LCAqbWluKTsKKworICAgIE9wdGlvbmFsPGZsb2F0PiBtYXggPSBtX3BOb2RlLT5UcnlNYXhIZWlnaHQoKTsKKyAgICBpZiAobWF4ICYmICptYXggPiAwKQorICAgICAgc2l6ZS5oZWlnaHQgPSBzdGQ6Om1pbihzaXplLmhlaWdodCwgKm1heCk7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ1hGQV9XaWRnZXRBY2M6OkNhbGN1bGF0ZVRleHRDb250ZW50U2l6ZShDWEZBX0ZGRG9jKiBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1NpemVGJiBzaXplKSB7CisgIGZsb2F0IGZGb250U2l6ZSA9IG1fcE5vZGUtPkdldEZvbnRTaXplKCk7CisgIFdpZGVTdHJpbmcgd3NUZXh0ID0gR2V0VmFsdWUoWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsKKyAgaWYgKHdzVGV4dC5Jc0VtcHR5KCkpIHsKKyAgICBzaXplLmhlaWdodCArPSBmRm9udFNpemU7CisgICAgcmV0dXJuOworICB9CisKKyAgd2NoYXJfdCB3Y0VudGVyID0gJ1xuJzsKKyAgd2NoYXJfdCB3c0xhc3QgPSB3c1RleHRbd3NUZXh0LkdldExlbmd0aCgpIC0gMV07CisgIGlmICh3c0xhc3QgPT0gd2NFbnRlcikKKyAgICB3c1RleHQgPSB3c1RleHQgKyB3Y0VudGVyOworCisgIENYRkFfRmllbGRMYXlvdXREYXRhKiBsYXlvdXREYXRhID0KKyAgICAgIHN0YXRpY19jYXN0PENYRkFfRmllbGRMYXlvdXREYXRhKj4obV9wTGF5b3V0RGF0YS5nZXQoKSk7CisgIGlmICghbGF5b3V0RGF0YS0+bV9wVGV4dE91dCkgeworICAgIGxheW91dERhdGEtPm1fcFRleHRPdXQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZERV9UZXh0T3V0PigpOworICAgIENGREVfVGV4dE91dCogcFRleHRPdXQgPSBsYXlvdXREYXRhLT5tX3BUZXh0T3V0LmdldCgpOworICAgIHBUZXh0T3V0LT5TZXRGb250KEdldEZERUZvbnQoZG9jKSk7CisgICAgcFRleHRPdXQtPlNldEZvbnRTaXplKGZGb250U2l6ZSk7CisgICAgcFRleHRPdXQtPlNldExpbmVCcmVha1RvbGVyYW5jZShmRm9udFNpemUgKiAwLjJmKTsKKyAgICBwVGV4dE91dC0+U2V0TGluZVNwYWNlKG1fcE5vZGUtPkdldExpbmVIZWlnaHQoKSk7CisKKyAgICBGREVfVGV4dFN0eWxlIGR3U3R5bGVzOworICAgIGR3U3R5bGVzLmxhc3RfbGluZV9oZWlnaHRfID0gdHJ1ZTsKKyAgICBpZiAoR2V0VUlUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlRleHRFZGl0ICYmIElzTXVsdGlMaW5lKCkpCisgICAgICBkd1N0eWxlcy5saW5lX3dyYXBfID0gdHJ1ZTsKKworICAgIHBUZXh0T3V0LT5TZXRTdHlsZXMoZHdTdHlsZXMpOworICB9CisgIGxheW91dERhdGEtPm1fcFRleHRPdXQtPkNhbGNMb2dpY1NpemUod3NUZXh0LCBzaXplKTsKK30KKworYm9vbCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlVGV4dEVkaXRBdXRvU2l6ZShDWEZBX0ZGRG9jKiBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9TaXplRiYgc2l6ZSkgeworICBpZiAoc2l6ZS53aWR0aCA+IDApIHsKKyAgICBDRlhfU2l6ZUYgc3pPcnogPSBzaXplOworICAgIENGWF9TaXplRiBzekNhcDsKKyAgICBDYWxjQ2FwdGlvblNpemUoZG9jLCBzekNhcCk7CisgICAgYm9vbCBiQ2FwRXhpdCA9IHN6Q2FwLndpZHRoID4gMC4wMSAmJiBzekNhcC5oZWlnaHQgPiAwLjAxOworICAgIFhGQV9BdHRyaWJ1dGVFbnVtIGlDYXBQbGFjZW1lbnQgPSBYRkFfQXR0cmlidXRlRW51bTo6VW5rbm93bjsKKyAgICBpZiAoYkNhcEV4aXQpIHsKKyAgICAgIENYRkFfQ2FwdGlvbiogY2FwdGlvbiA9IG1fcE5vZGUtPkdldENhcHRpb25JZkV4aXN0cygpOworICAgICAgaUNhcFBsYWNlbWVudCA9IGNhcHRpb24gPyBjYXB0aW9uLT5HZXRQbGFjZW1lbnRUeXBlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ1hGQV9DYXB0aW9uOjprRGVmYXVsdFBsYWNlbWVudFR5cGU7CisgICAgICBzd2l0Y2ggKGlDYXBQbGFjZW1lbnQpIHsKKyAgICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6TGVmdDoKKyAgICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6UmlnaHQ6CisgICAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OklubGluZTogeworICAgICAgICAgIHNpemUud2lkdGggLT0gc3pDYXAud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgQ0ZYX1JlY3RGIHJ0VUlNYXJnaW4gPSBHZXRVSU1hcmdpbigpOworICAgIHNpemUud2lkdGggLT0gcnRVSU1hcmdpbi5sZWZ0ICsgcnRVSU1hcmdpbi53aWR0aDsKKyAgICBDWEZBX01hcmdpbiogbWFyZ2luID0gbV9wTm9kZS0+R2V0TWFyZ2luSWZFeGlzdHMoKTsKKyAgICBpZiAobWFyZ2luKQorICAgICAgc2l6ZS53aWR0aCAtPSBtYXJnaW4tPkdldExlZnRJbnNldCgpICsgbWFyZ2luLT5HZXRSaWdodEluc2V0KCk7CisKKyAgICBDYWxjdWxhdGVUZXh0Q29udGVudFNpemUoZG9jLCBzaXplKTsKKyAgICBzaXplLmhlaWdodCArPSBydFVJTWFyZ2luLnRvcCArIHJ0VUlNYXJnaW4uaGVpZ2h0OworICAgIGlmIChiQ2FwRXhpdCkgeworICAgICAgc3dpdGNoIChpQ2FwUGxhY2VtZW50KSB7CisgICAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkxlZnQ6CisgICAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OlJpZ2h0OgorICAgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpJbmxpbmU6IHsKKyAgICAgICAgICBzaXplLmhlaWdodCA9IHN0ZDo6bWF4KHNpemUuaGVpZ2h0LCBzekNhcC5oZWlnaHQpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpUb3A6CisgICAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkJvdHRvbTogeworICAgICAgICAgIHNpemUuaGVpZ2h0ICs9IHN6Q2FwLmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBzaXplLndpZHRoID0gc3pPcnoud2lkdGg7CisgICAgcmV0dXJuIENhbGN1bGF0ZVdpZGdldEF1dG9TaXplKHNpemUpOworICB9CisgIENhbGN1bGF0ZVRleHRDb250ZW50U2l6ZShkb2MsIHNpemUpOworICByZXR1cm4gQ2FsY3VsYXRlRmllbGRBdXRvU2l6ZShkb2MsIHNpemUpOworfQorCitib29sIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVDaGVja0J1dHRvbkF1dG9TaXplKENYRkFfRkZEb2MqIGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1NpemVGJiBzaXplKSB7CisgIGZsb2F0IGZDaGVja1NpemUgPSBHZXRDaGVja0J1dHRvblNpemUoKTsKKyAgc2l6ZSA9IENGWF9TaXplRihmQ2hlY2tTaXplLCBmQ2hlY2tTaXplKTsKKyAgcmV0dXJuIENhbGN1bGF0ZUZpZWxkQXV0b1NpemUoZG9jLCBzaXplKTsKK30KKworYm9vbCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlUHVzaEJ1dHRvbkF1dG9TaXplKENYRkFfRkZEb2MqIGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfU2l6ZUYmIHNpemUpIHsKKyAgQ2FsY0NhcHRpb25TaXplKGRvYywgc2l6ZSk7CisgIHJldHVybiBDYWxjdWxhdGVXaWRnZXRBdXRvU2l6ZShzaXplKTsKK30KKworQ0ZYX1NpemVGIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVJbWFnZVNpemUoZmxvYXQgaW1nX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaW1nX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGRwaV94LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZHBpX3kpIHsKKyAgQ0ZYX1JlY3RGIHJ0SW1hZ2UoMCwgMCwgWEZBX1VuaXRQeDJQdChpbWdfd2lkdGgsIGRwaV94KSwKKyAgICAgICAgICAgICAgICAgICAgWEZBX1VuaXRQeDJQdChpbWdfaGVpZ2h0LCBkcGlfeSkpOworCisgIENGWF9SZWN0RiBydEZpdDsKKyAgT3B0aW9uYWw8ZmxvYXQ+IHdpZHRoID0gbV9wTm9kZS0+VHJ5V2lkdGgoKTsKKyAgaWYgKHdpZHRoKSB7CisgICAgcnRGaXQud2lkdGggPSAqd2lkdGg7CisgICAgR2V0V2lkdGhXaXRob3V0TWFyZ2luKHJ0Rml0LndpZHRoKTsKKyAgfSBlbHNlIHsKKyAgICBydEZpdC53aWR0aCA9IHJ0SW1hZ2Uud2lkdGg7CisgIH0KKworICBPcHRpb25hbDxmbG9hdD4gaGVpZ2h0ID0gbV9wTm9kZS0+VHJ5SGVpZ2h0KCk7CisgIGlmIChoZWlnaHQpIHsKKyAgICBydEZpdC5oZWlnaHQgPSAqaGVpZ2h0OworICAgIEdldEhlaWdodFdpdGhvdXRNYXJnaW4ocnRGaXQuaGVpZ2h0KTsKKyAgfSBlbHNlIHsKKyAgICBydEZpdC5oZWlnaHQgPSBydEltYWdlLmhlaWdodDsKKyAgfQorCisgIHJldHVybiBydEZpdC5TaXplKCk7Cit9CisKK2Jvb2wgQ1hGQV9XaWRnZXRBY2M6OkNhbGN1bGF0ZUltYWdlQXV0b1NpemUoQ1hGQV9GRkRvYyogZG9jLCBDRlhfU2l6ZUYmIHNpemUpIHsKKyAgaWYgKCFHZXRJbWFnZUltYWdlKCkpCisgICAgTG9hZEltYWdlSW1hZ2UoZG9jKTsKKworICBzaXplLmNsZWFyKCk7CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IHBCaXRtYXAgPSBHZXRJbWFnZUltYWdlKCk7CisgIGlmICghcEJpdG1hcCkKKyAgICByZXR1cm4gQ2FsY3VsYXRlV2lkZ2V0QXV0b1NpemUoc2l6ZSk7CisKKyAgaW50MzJfdCBpSW1hZ2VYRHBpID0gMDsKKyAgaW50MzJfdCBpSW1hZ2VZRHBpID0gMDsKKyAgR2V0SW1hZ2VEcGkoaUltYWdlWERwaSwgaUltYWdlWURwaSk7CisKKyAgc2l6ZSA9IENhbGN1bGF0ZUltYWdlU2l6ZShwQml0bWFwLT5HZXRXaWR0aCgpLCBwQml0bWFwLT5HZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpSW1hZ2VYRHBpLCBpSW1hZ2VZRHBpKTsKKyAgcmV0dXJuIENhbGN1bGF0ZVdpZGdldEF1dG9TaXplKHNpemUpOworfQorCitib29sIENYRkFfV2lkZ2V0QWNjOjpDYWxjdWxhdGVJbWFnZUVkaXRBdXRvU2l6ZShDWEZBX0ZGRG9jKiBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfU2l6ZUYmIHNpemUpIHsKKyAgaWYgKCFHZXRJbWFnZUVkaXRJbWFnZSgpKQorICAgIExvYWRJbWFnZUVkaXRJbWFnZShkb2MpOworCisgIHNpemUuY2xlYXIoKTsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gcEJpdG1hcCA9IEdldEltYWdlRWRpdEltYWdlKCk7CisgIGlmICghcEJpdG1hcCkKKyAgICByZXR1cm4gQ2FsY3VsYXRlRmllbGRBdXRvU2l6ZShkb2MsIHNpemUpOworCisgIGludDMyX3QgaUltYWdlWERwaSA9IDA7CisgIGludDMyX3QgaUltYWdlWURwaSA9IDA7CisgIEdldEltYWdlRWRpdERwaShpSW1hZ2VYRHBpLCBpSW1hZ2VZRHBpKTsKKworICBzaXplID0gQ2FsY3VsYXRlSW1hZ2VTaXplKHBCaXRtYXAtPkdldFdpZHRoKCksIHBCaXRtYXAtPkdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlJbWFnZVhEcGksIGlJbWFnZVlEcGkpOworICByZXR1cm4gQ2FsY3VsYXRlRmllbGRBdXRvU2l6ZShkb2MsIHNpemUpOworfQorCitib29sIENYRkFfV2lkZ2V0QWNjOjpMb2FkSW1hZ2VJbWFnZShDWEZBX0ZGRG9jKiBkb2MpIHsKKyAgSW5pdExheW91dERhdGEoKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfSW1hZ2VMYXlvdXREYXRhKj4obV9wTGF5b3V0RGF0YS5nZXQoKSkKKyAgICAgIC0+TG9hZEltYWdlRGF0YShkb2MsIHRoaXMpOworfQorCitib29sIENYRkFfV2lkZ2V0QWNjOjpMb2FkSW1hZ2VFZGl0SW1hZ2UoQ1hGQV9GRkRvYyogZG9jKSB7CisgIEluaXRMYXlvdXREYXRhKCk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX0ltYWdlRWRpdERhdGEqPihtX3BMYXlvdXREYXRhLmdldCgpKQorICAgICAgLT5Mb2FkSW1hZ2VEYXRhKGRvYywgdGhpcyk7Cit9CisKK3ZvaWQgQ1hGQV9XaWRnZXRBY2M6OkdldEltYWdlRHBpKGludDMyX3QmIGlJbWFnZVhEcGksIGludDMyX3QmIGlJbWFnZVlEcGkpIHsKKyAgQ1hGQV9JbWFnZUxheW91dERhdGEqIHBEYXRhID0KKyAgICAgIHN0YXRpY19jYXN0PENYRkFfSW1hZ2VMYXlvdXREYXRhKj4obV9wTGF5b3V0RGF0YS5nZXQoKSk7CisgIGlJbWFnZVhEcGkgPSBwRGF0YS0+bV9pSW1hZ2VYRHBpOworICBpSW1hZ2VZRHBpID0gcERhdGEtPm1faUltYWdlWURwaTsKK30KKwordm9pZCBDWEZBX1dpZGdldEFjYzo6R2V0SW1hZ2VFZGl0RHBpKGludDMyX3QmIGlJbWFnZVhEcGksIGludDMyX3QmIGlJbWFnZVlEcGkpIHsKKyAgQ1hGQV9JbWFnZUVkaXREYXRhKiBwRGF0YSA9CisgICAgICBzdGF0aWNfY2FzdDxDWEZBX0ltYWdlRWRpdERhdGEqPihtX3BMYXlvdXREYXRhLmdldCgpKTsKKyAgaUltYWdlWERwaSA9IHBEYXRhLT5tX2lJbWFnZVhEcGk7CisgIGlJbWFnZVlEcGkgPSBwRGF0YS0+bV9pSW1hZ2VZRHBpOworfQorCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpMb2FkVGV4dChDWEZBX0ZGRG9jKiBkb2MpIHsKKyAgSW5pdExheW91dERhdGEoKTsKKyAgc3RhdGljX2Nhc3Q8Q1hGQV9UZXh0TGF5b3V0RGF0YSo+KG1fcExheW91dERhdGEuZ2V0KCkpLT5Mb2FkVGV4dChkb2MsIHRoaXMpOworfQorCitmbG9hdCBDWEZBX1dpZGdldEFjYzo6Q2FsY3VsYXRlV2lkZ2V0QXV0b1dpZHRoKGZsb2F0IGZXaWR0aENhbGMpIHsKKyAgQ1hGQV9NYXJnaW4qIG1hcmdpbiA9IG1fcE5vZGUtPkdldE1hcmdpbklmRXhpc3RzKCk7CisgIGlmIChtYXJnaW4pCisgICAgZldpZHRoQ2FsYyArPSBtYXJnaW4tPkdldExlZnRJbnNldCgpICsgbWFyZ2luLT5HZXRSaWdodEluc2V0KCk7CisKKyAgT3B0aW9uYWw8ZmxvYXQ+IG1pbiA9IG1fcE5vZGUtPlRyeU1pbldpZHRoKCk7CisgIGlmIChtaW4pCisgICAgZldpZHRoQ2FsYyA9IHN0ZDo6bWF4KGZXaWR0aENhbGMsICptaW4pOworCisgIE9wdGlvbmFsPGZsb2F0PiBtYXggPSBtX3BOb2RlLT5UcnlNYXhXaWR0aCgpOworICBpZiAobWF4ICYmICptYXggPiAwKQorICAgIGZXaWR0aENhbGMgPSBzdGQ6Om1pbihmV2lkdGhDYWxjLCAqbWF4KTsKKworICByZXR1cm4gZldpZHRoQ2FsYzsKK30KKworZmxvYXQgQ1hGQV9XaWRnZXRBY2M6OkdldFdpZHRoV2l0aG91dE1hcmdpbihmbG9hdCBmV2lkdGhDYWxjKSB7CisgIENYRkFfTWFyZ2luKiBtYXJnaW4gPSBtX3BOb2RlLT5HZXRNYXJnaW5JZkV4aXN0cygpOworICBpZiAobWFyZ2luKQorICAgIGZXaWR0aENhbGMgLT0gbWFyZ2luLT5HZXRMZWZ0SW5zZXQoKSArIG1hcmdpbi0+R2V0UmlnaHRJbnNldCgpOworICByZXR1cm4gZldpZHRoQ2FsYzsKK30KKworZmxvYXQgQ1hGQV9XaWRnZXRBY2M6OkNhbGN1bGF0ZVdpZGdldEF1dG9IZWlnaHQoZmxvYXQgZkhlaWdodENhbGMpIHsKKyAgQ1hGQV9NYXJnaW4qIG1hcmdpbiA9IG1fcE5vZGUtPkdldE1hcmdpbklmRXhpc3RzKCk7CisgIGlmIChtYXJnaW4pCisgICAgZkhlaWdodENhbGMgKz0gbWFyZ2luLT5HZXRUb3BJbnNldCgpICsgbWFyZ2luLT5HZXRCb3R0b21JbnNldCgpOworCisgIE9wdGlvbmFsPGZsb2F0PiBtaW4gPSBtX3BOb2RlLT5UcnlNaW5IZWlnaHQoKTsKKyAgaWYgKG1pbikKKyAgICBmSGVpZ2h0Q2FsYyA9IHN0ZDo6bWF4KGZIZWlnaHRDYWxjLCAqbWluKTsKKworICBPcHRpb25hbDxmbG9hdD4gbWF4ID0gbV9wTm9kZS0+VHJ5TWF4SGVpZ2h0KCk7CisgIGlmIChtYXggJiYgKm1heCA+IDApCisgICAgZkhlaWdodENhbGMgPSBzdGQ6Om1pbihmSGVpZ2h0Q2FsYywgKm1heCk7CisKKyAgcmV0dXJuIGZIZWlnaHRDYWxjOworfQorCitmbG9hdCBDWEZBX1dpZGdldEFjYzo6R2V0SGVpZ2h0V2l0aG91dE1hcmdpbihmbG9hdCBmSGVpZ2h0Q2FsYykgeworICBDWEZBX01hcmdpbiogbWFyZ2luID0gbV9wTm9kZS0+R2V0TWFyZ2luSWZFeGlzdHMoKTsKKyAgaWYgKG1hcmdpbikKKyAgICBmSGVpZ2h0Q2FsYyAtPSBtYXJnaW4tPkdldFRvcEluc2V0KCkgKyBtYXJnaW4tPkdldEJvdHRvbUluc2V0KCk7CisgIHJldHVybiBmSGVpZ2h0Q2FsYzsKK30KKwordm9pZCBDWEZBX1dpZGdldEFjYzo6U3RhcnRXaWRnZXRMYXlvdXQoQ1hGQV9GRkRvYyogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQmIGZDYWxjV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCYgZkNhbGNIZWlnaHQpIHsKKyAgSW5pdExheW91dERhdGEoKTsKKworICBYRkFfRWxlbWVudCBlVUlUeXBlID0gR2V0VUlUeXBlKCk7CisgIGlmIChlVUlUeXBlID09IFhGQV9FbGVtZW50OjpUZXh0KSB7CisgICAgbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0ID0gbV9wTm9kZS0+VHJ5SGVpZ2h0KCkudmFsdWVfb3IoLTEpOworICAgIFN0YXJ0VGV4dExheW91dChkb2MsIGZDYWxjV2lkdGgsIGZDYWxjSGVpZ2h0KTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGZDYWxjV2lkdGggPiAwICYmIGZDYWxjSGVpZ2h0ID4gMCkKKyAgICByZXR1cm47CisKKyAgbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0ID0gLTE7CisgIGZsb2F0IGZXaWR0aCA9IDA7CisgIGlmIChmQ2FsY1dpZHRoID4gMCAmJiBmQ2FsY0hlaWdodCA8IDApIHsKKyAgICBPcHRpb25hbDxmbG9hdD4gaGVpZ2h0ID0gbV9wTm9kZS0+VHJ5SGVpZ2h0KCk7CisgICAgaWYgKGhlaWdodCkKKyAgICAgIGZDYWxjSGVpZ2h0ID0gKmhlaWdodDsKKyAgICBlbHNlCisgICAgICBDYWxjdWxhdGVBY2NXaWR0aEFuZEhlaWdodChkb2MsIGVVSVR5cGUsIGZDYWxjV2lkdGgsIGZDYWxjSGVpZ2h0KTsKKworICAgIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCA9IGZDYWxjSGVpZ2h0OworICAgIHJldHVybjsKKyAgfQorICBpZiAoZkNhbGNXaWR0aCA8IDAgJiYgZkNhbGNIZWlnaHQgPCAwKSB7CisgICAgT3B0aW9uYWw8ZmxvYXQ+IGhlaWdodDsKKyAgICBPcHRpb25hbDxmbG9hdD4gd2lkdGggPSBtX3BOb2RlLT5UcnlXaWR0aCgpOworICAgIGlmICh3aWR0aCkgeworICAgICAgZldpZHRoID0gKndpZHRoOworCisgICAgICBoZWlnaHQgPSBtX3BOb2RlLT5UcnlIZWlnaHQoKTsKKyAgICAgIGlmIChoZWlnaHQpCisgICAgICAgIGZDYWxjSGVpZ2h0ID0gKmhlaWdodDsKKyAgICB9CisgICAgaWYgKCF3aWR0aCB8fCAhaGVpZ2h0KQorICAgICAgQ2FsY3VsYXRlQWNjV2lkdGhBbmRIZWlnaHQoZG9jLCBlVUlUeXBlLCBmV2lkdGgsIGZDYWxjSGVpZ2h0KTsKKworICAgIGZDYWxjV2lkdGggPSBmV2lkdGg7CisgIH0KKyAgbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0ID0gZkNhbGNIZWlnaHQ7Cit9CisKK3ZvaWQgQ1hGQV9XaWRnZXRBY2M6OkNhbGN1bGF0ZUFjY1dpZHRoQW5kSGVpZ2h0KENYRkFfRkZEb2MqIGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50IGVVSVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCYgZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQmIGZDYWxjSGVpZ2h0KSB7CisgIENGWF9TaXplRiBzeihmV2lkdGgsIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCk7CisgIHN3aXRjaCAoZVVJVHlwZSkgeworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJhcmNvZGU6CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q2hvaWNlTGlzdDoKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTaWduYXR1cmU6CisgICAgICBDYWxjdWxhdGVGaWVsZEF1dG9TaXplKGRvYywgc3opOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6SW1hZ2VFZGl0OgorICAgICAgQ2FsY3VsYXRlSW1hZ2VFZGl0QXV0b1NpemUoZG9jLCBzeik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpCdXR0b246CisgICAgICBDYWxjdWxhdGVQdXNoQnV0dG9uQXV0b1NpemUoZG9jLCBzeik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDaGVja0J1dHRvbjoKKyAgICAgIENhbGN1bGF0ZUNoZWNrQnV0dG9uQXV0b1NpemUoZG9jLCBzeik7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpEYXRlVGltZUVkaXQ6CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TnVtZXJpY0VkaXQ6CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UGFzc3dvcmRFZGl0OgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRleHRFZGl0OgorICAgICAgQ2FsY3VsYXRlVGV4dEVkaXRBdXRvU2l6ZShkb2MsIHN6KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkltYWdlOgorICAgICAgQ2FsY3VsYXRlSW1hZ2VBdXRvU2l6ZShkb2MsIHN6KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkFyYzoKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpMaW5lOgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlJlY3RhbmdsZToKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTdWJmb3JtOgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkV4Y2xHcm91cDoKKyAgICAgIENhbGN1bGF0ZVdpZGdldEF1dG9TaXplKHN6KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICBmV2lkdGggPSBzei53aWR0aDsKKyAgbV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0ID0gc3ouaGVpZ2h0OworICBmQ2FsY0hlaWdodCA9IHN6LmhlaWdodDsKK30KKworYm9vbCBDWEZBX1dpZGdldEFjYzo6RmluZFNwbGl0UG9zKENYRkFfRkZEb2NWaWV3KiBkb2NWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUJsb2NrSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQmIGZDYWxjSGVpZ2h0KSB7CisgIFhGQV9FbGVtZW50IGVVSVR5cGUgPSBHZXRVSVR5cGUoKTsKKyAgaWYgKGVVSVR5cGUgPT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm0pCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChlVUlUeXBlICE9IFhGQV9FbGVtZW50OjpUZXh0ICYmIGVVSVR5cGUgIT0gWEZBX0VsZW1lbnQ6OlRleHRFZGl0ICYmCisgICAgICBlVUlUeXBlICE9IFhGQV9FbGVtZW50OjpOdW1lcmljRWRpdCAmJgorICAgICAgZVVJVHlwZSAhPSBYRkFfRWxlbWVudDo6UGFzc3dvcmRFZGl0KSB7CisgICAgZkNhbGNIZWlnaHQgPSAwOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgZmxvYXQgZlRvcEluc2V0ID0gMDsKKyAgZmxvYXQgZkJvdHRvbUluc2V0ID0gMDsKKyAgaWYgKGlCbG9ja0luZGV4ID09IDApIHsKKyAgICBDWEZBX01hcmdpbiogbWFyZ2luID0gbV9wTm9kZS0+R2V0TWFyZ2luSWZFeGlzdHMoKTsKKyAgICBpZiAobWFyZ2luKSB7CisgICAgICBmVG9wSW5zZXQgPSBtYXJnaW4tPkdldFRvcEluc2V0KCk7CisgICAgICBmQm90dG9tSW5zZXQgPSBtYXJnaW4tPkdldEJvdHRvbUluc2V0KCk7CisgICAgfQorCisgICAgQ0ZYX1JlY3RGIHJ0VUlNYXJnaW4gPSBHZXRVSU1hcmdpbigpOworICAgIGZUb3BJbnNldCArPSBydFVJTWFyZ2luLnRvcDsKKyAgICBmQm90dG9tSW5zZXQgKz0gcnRVSU1hcmdpbi53aWR0aDsKKyAgfQorICBpZiAoZVVJVHlwZSA9PSBYRkFfRWxlbWVudDo6VGV4dCkgeworICAgIGZsb2F0IGZIZWlnaHQgPSBmQ2FsY0hlaWdodDsKKyAgICBpZiAoaUJsb2NrSW5kZXggPT0gMCkgeworICAgICAgZkNhbGNIZWlnaHQgPSBmQ2FsY0hlaWdodCAtIGZUb3BJbnNldDsKKyAgICAgIGlmIChmQ2FsY0hlaWdodCA8IDApCisgICAgICAgIGZDYWxjSGVpZ2h0ID0gMDsKKyAgICB9CisKKyAgICBDWEZBX1RleHRMYXlvdXQqIHBUZXh0TGF5b3V0ID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9UZXh0TGF5b3V0RGF0YSo+KG1fcExheW91dERhdGEuZ2V0KCkpLT5HZXRUZXh0TGF5b3V0KCk7CisgICAgZkNhbGNIZWlnaHQgPQorICAgICAgICBwVGV4dExheW91dC0+RG9MYXlvdXQoaUJsb2NrSW5kZXgsIGZDYWxjSGVpZ2h0LCBmQ2FsY0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCAtIGZUb3BJbnNldCk7CisgICAgaWYgKGZDYWxjSGVpZ2h0ICE9IDApIHsKKyAgICAgIGlmIChpQmxvY2tJbmRleCA9PSAwKQorICAgICAgICBmQ2FsY0hlaWdodCA9IGZDYWxjSGVpZ2h0ICsgZlRvcEluc2V0OworICAgICAgaWYgKGZhYnMoZkhlaWdodCAtIGZDYWxjSGVpZ2h0KSA8IFhGQV9GTE9BVF9QRVJDSVNJT04pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgWEZBX0F0dHJpYnV0ZUVudW0gaUNhcFBsYWNlbWVudCA9IFhGQV9BdHRyaWJ1dGVFbnVtOjpVbmtub3duOworICBmbG9hdCBmQ2FwUmVzZXJ2ZSA9IDA7CisgIGlmIChpQmxvY2tJbmRleCA9PSAwKSB7CisgICAgQ1hGQV9DYXB0aW9uKiBjYXB0aW9uID0gbV9wTm9kZS0+R2V0Q2FwdGlvbklmRXhpc3RzKCk7CisgICAgaWYgKGNhcHRpb24gJiYgIWNhcHRpb24tPklzSGlkZGVuKCkpIHsKKyAgICAgIGlDYXBQbGFjZW1lbnQgPSBjYXB0aW9uLT5HZXRQbGFjZW1lbnRUeXBlKCk7CisgICAgICBmQ2FwUmVzZXJ2ZSA9IGNhcHRpb24tPkdldFJlc2VydmUoKTsKKyAgICB9CisgICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0F0dHJpYnV0ZUVudW06OlRvcCAmJgorICAgICAgICBmQ2FsY0hlaWdodCA8IGZDYXBSZXNlcnZlICsgZlRvcEluc2V0KSB7CisgICAgICBmQ2FsY0hlaWdodCA9IDA7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGlDYXBQbGFjZW1lbnQgPT0gWEZBX0F0dHJpYnV0ZUVudW06OkJvdHRvbSAmJgorICAgICAgICBtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQgLSBmQ2FwUmVzZXJ2ZSAtIGZCb3R0b21JbnNldCkgeworICAgICAgZkNhbGNIZWlnaHQgPSAwOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChpQ2FwUGxhY2VtZW50ICE9IFhGQV9BdHRyaWJ1dGVFbnVtOjpUb3ApCisgICAgICBmQ2FwUmVzZXJ2ZSA9IDA7CisgIH0KKyAgQ1hGQV9GaWVsZExheW91dERhdGEqIHBGaWVsZERhdGEgPQorICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9GaWVsZExheW91dERhdGEqPihtX3BMYXlvdXREYXRhLmdldCgpKTsKKyAgaW50MzJfdCBpTGluZXNDb3VudCA9IDA7CisgIGZsb2F0IGZIZWlnaHQgPSBtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQ7CisgIGlmIChHZXRWYWx1ZShYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpLklzRW1wdHkoKSkgeworICAgIGlMaW5lc0NvdW50ID0gMTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIXBGaWVsZERhdGEtPm1fcFRleHRPdXQpIHsKKyAgICAgIC8vIFRPRE8oZHNpbmNsYWlyKTogSW5saW5lIGZXaWR0aCB3aGVuIHRoZSAybmQgcGFyYW0gb2YKKyAgICAgIC8vIENhbGN1bGF0ZUFjY1dpZHRoQW5kSGVpZ2h0IGlzbid0IGEgcmVmLXBhcmFtLgorICAgICAgZmxvYXQgZldpZHRoID0gbV9wTm9kZS0+VHJ5V2lkdGgoKS52YWx1ZV9vcigwKTsKKyAgICAgIENhbGN1bGF0ZUFjY1dpZHRoQW5kSGVpZ2h0KGRvY1ZpZXctPkdldERvYygpLCBlVUlUeXBlLCBmV2lkdGgsIGZIZWlnaHQpOworICAgIH0KKyAgICBpTGluZXNDb3VudCA9IHBGaWVsZERhdGEtPm1fcFRleHRPdXQtPkdldFRvdGFsTGluZXMoKTsKKyAgfQorICBzdGQ6OnZlY3RvcjxmbG9hdD4qIHBGaWVsZEFycmF5ID0gJnBGaWVsZERhdGEtPm1fRmllbGRTcGxpdEFycmF5OworICBpbnQzMl90IGlGaWVsZFNwbGl0Q291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KCpwRmllbGRBcnJheSk7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlCbG9ja0luZGV4ICogMzsgaSArPSAzKSB7CisgICAgaUxpbmVzQ291bnQgLT0gKGludDMyX3QpKCpwRmllbGRBcnJheSlbaSArIDFdOworICAgIGZIZWlnaHQgLT0gKCpwRmllbGRBcnJheSlbaSArIDJdOworICB9CisgIGlmIChpTGluZXNDb3VudCA9PSAwKQorICAgIHJldHVybiBmYWxzZTsKKworICBmbG9hdCBmTGluZUhlaWdodCA9IG1fcE5vZGUtPkdldExpbmVIZWlnaHQoKTsKKyAgZmxvYXQgZkZvbnRTaXplID0gbV9wTm9kZS0+R2V0Rm9udFNpemUoKTsKKyAgZmxvYXQgZlRleHRIZWlnaHQgPSBpTGluZXNDb3VudCAqIGZMaW5lSGVpZ2h0IC0gZkxpbmVIZWlnaHQgKyBmRm9udFNpemU7CisgIGZsb2F0IGZTcGFjZUFib3ZlID0gMDsKKyAgZmxvYXQgZlN0YXJ0T2Zmc2V0ID0gMDsKKyAgaWYgKGZIZWlnaHQgPiAwLjFmICYmIGlCbG9ja0luZGV4ID09IDApIHsKKyAgICBmU3RhcnRPZmZzZXQgPSBmVG9wSW5zZXQ7CisgICAgZkhlaWdodCAtPSAoZlRvcEluc2V0ICsgZkJvdHRvbUluc2V0KTsKKyAgICBDWEZBX1BhcmEqIHBhcmEgPSBtX3BOb2RlLT5HZXRQYXJhSWZFeGlzdHMoKTsKKyAgICBpZiAocGFyYSkgeworICAgICAgZlNwYWNlQWJvdmUgPSBwYXJhLT5HZXRTcGFjZUFib3ZlKCk7CisgICAgICBmbG9hdCBmU3BhY2VCZWxvdyA9IHBhcmEtPkdldFNwYWNlQmVsb3coKTsKKyAgICAgIGZIZWlnaHQgLT0gKGZTcGFjZUFib3ZlICsgZlNwYWNlQmVsb3cpOworICAgICAgc3dpdGNoIChwYXJhLT5HZXRWZXJ0aWNhbEFsaWduKCkpIHsKKyAgICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6VG9wOgorICAgICAgICAgIGZTdGFydE9mZnNldCArPSBmU3BhY2VBYm92ZTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6TWlkZGxlOgorICAgICAgICAgIGZTdGFydE9mZnNldCArPSAoKGZIZWlnaHQgLSBmVGV4dEhlaWdodCkgLyAyICsgZlNwYWNlQWJvdmUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpCb3R0b206CisgICAgICAgICAgZlN0YXJ0T2Zmc2V0ICs9IChmSGVpZ2h0IC0gZlRleHRIZWlnaHQgKyBmU3BhY2VBYm92ZSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBpZiAoZlN0YXJ0T2Zmc2V0IDwgMC4xZikKKyAgICAgIGZTdGFydE9mZnNldCA9IDA7CisgIH0KKyAgZm9yIChpbnQzMl90IGkgPSBpQmxvY2tJbmRleCAtIDE7IGlCbG9ja0luZGV4ID4gMCAmJiBpIDwgaUJsb2NrSW5kZXg7IGkrKykgeworICAgIGZTdGFydE9mZnNldCA9ICgqcEZpZWxkQXJyYXkpW2kgKiAzXSAtICgqcEZpZWxkQXJyYXkpW2kgKiAzICsgMl07CisgICAgaWYgKGZTdGFydE9mZnNldCA8IDAuMWYpCisgICAgICBmU3RhcnRPZmZzZXQgPSAwOworICB9CisgIGlmIChpRmllbGRTcGxpdENvdW50IC8gMyA9PSAoaUJsb2NrSW5kZXggKyAxKSkKKyAgICAoKnBGaWVsZEFycmF5KVswXSA9IGZTdGFydE9mZnNldDsKKyAgZWxzZQorICAgIHBGaWVsZEFycmF5LT5wdXNoX2JhY2soZlN0YXJ0T2Zmc2V0KTsKKworICBYRkFfVkVSU0lPTiB2ZXJzaW9uID0gZG9jVmlldy0+R2V0RG9jKCktPkdldFhGQURvYygpLT5HZXRDdXJWZXJzaW9uTW9kZSgpOworICBib29sIGJDYW5TcGxpdE5vQ29udGVudCA9IGZhbHNlOworICBYRkFfQXR0cmlidXRlRW51bSBlTGF5b3V0TW9kZSA9IEdldE5vZGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldFBhcmVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+SlNPYmplY3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlRyeUVudW0oWEZBX0F0dHJpYnV0ZTo6TGF5b3V0LCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfb3IoWEZBX0F0dHJpYnV0ZUVudW06OlBvc2l0aW9uKTsKKyAgaWYgKChlTGF5b3V0TW9kZSA9PSBYRkFfQXR0cmlidXRlRW51bTo6UG9zaXRpb24gfHwKKyAgICAgICBlTGF5b3V0TW9kZSA9PSBYRkFfQXR0cmlidXRlRW51bTo6VGIgfHwKKyAgICAgICBlTGF5b3V0TW9kZSA9PSBYRkFfQXR0cmlidXRlRW51bTo6Um93IHx8CisgICAgICAgZUxheW91dE1vZGUgPT0gWEZBX0F0dHJpYnV0ZUVudW06OlRhYmxlKSAmJgorICAgICAgdmVyc2lvbiA+IFhGQV9WRVJTSU9OXzIwOCkgeworICAgIGJDYW5TcGxpdE5vQ29udGVudCA9IHRydWU7CisgIH0KKyAgaWYgKChlTGF5b3V0TW9kZSA9PSBYRkFfQXR0cmlidXRlRW51bTo6VGIgfHwKKyAgICAgICBlTGF5b3V0TW9kZSA9PSBYRkFfQXR0cmlidXRlRW51bTo6Um93IHx8CisgICAgICAgZUxheW91dE1vZGUgPT0gWEZBX0F0dHJpYnV0ZUVudW06OlRhYmxlKSAmJgorICAgICAgdmVyc2lvbiA8PSBYRkFfVkVSU0lPTl8yMDgpIHsKKyAgICBpZiAoZlN0YXJ0T2Zmc2V0IDwgZkNhbGNIZWlnaHQpIHsKKyAgICAgIGJDYW5TcGxpdE5vQ29udGVudCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIGZDYWxjSGVpZ2h0ID0gMDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICBpZiAoYkNhblNwbGl0Tm9Db250ZW50KSB7CisgICAgaWYgKChmQ2FsY0hlaWdodCAtIGZUb3BJbnNldCAtIGZTcGFjZUFib3ZlIDwgZkxpbmVIZWlnaHQpKSB7CisgICAgICBmQ2FsY0hlaWdodCA9IDA7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGZTdGFydE9mZnNldCArIFhGQV9GTE9BVF9QRVJDSVNJT04gPj0gZkNhbGNIZWlnaHQpIHsKKyAgICAgIGlmIChpRmllbGRTcGxpdENvdW50IC8gMyA9PSAoaUJsb2NrSW5kZXggKyAxKSkgeworICAgICAgICAoKnBGaWVsZEFycmF5KVtpQmxvY2tJbmRleCAqIDMgKyAxXSA9IDA7CisgICAgICAgICgqcEZpZWxkQXJyYXkpW2lCbG9ja0luZGV4ICogMyArIDJdID0gZkNhbGNIZWlnaHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBwRmllbGRBcnJheS0+cHVzaF9iYWNrKDApOworICAgICAgICBwRmllbGRBcnJheS0+cHVzaF9iYWNrKGZDYWxjSGVpZ2h0KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGZDYWxjSGVpZ2h0IC0gZlN0YXJ0T2Zmc2V0IDwgZkxpbmVIZWlnaHQpIHsKKyAgICAgIGZDYWxjSGVpZ2h0ID0gZlN0YXJ0T2Zmc2V0OworICAgICAgaWYgKGlGaWVsZFNwbGl0Q291bnQgLyAzID09IChpQmxvY2tJbmRleCArIDEpKSB7CisgICAgICAgICgqcEZpZWxkQXJyYXkpW2lCbG9ja0luZGV4ICogMyArIDFdID0gMDsKKyAgICAgICAgKCpwRmllbGRBcnJheSlbaUJsb2NrSW5kZXggKiAzICsgMl0gPSBmQ2FsY0hlaWdodDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBGaWVsZEFycmF5LT5wdXNoX2JhY2soMCk7CisgICAgICAgIHBGaWVsZEFycmF5LT5wdXNoX2JhY2soZkNhbGNIZWlnaHQpOworICAgICAgfQorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGZsb2F0IGZUZXh0TnVtID0KKyAgICAgICAgZkNhbGNIZWlnaHQgKyBYRkFfRkxPQVRfUEVSQ0lTSU9OIC0gZkNhcFJlc2VydmUgLSBmU3RhcnRPZmZzZXQ7CisgICAgaW50MzJfdCBpTGluZU51bSA9CisgICAgICAgIChpbnQzMl90KSgoZlRleHROdW0gKyAoZkxpbmVIZWlnaHQgLSBmRm9udFNpemUpKSAvIGZMaW5lSGVpZ2h0KTsKKyAgICBpZiAoaUxpbmVOdW0gPj0gaUxpbmVzQ291bnQpIHsKKyAgICAgIGlmIChmQ2FsY0hlaWdodCAtIGZTdGFydE9mZnNldCAtIGZUZXh0SGVpZ2h0ID49IGZGb250U2l6ZSkgeworICAgICAgICBpZiAoaUZpZWxkU3BsaXRDb3VudCAvIDMgPT0gKGlCbG9ja0luZGV4ICsgMSkpIHsKKyAgICAgICAgICAoKnBGaWVsZEFycmF5KVtpQmxvY2tJbmRleCAqIDMgKyAxXSA9IChmbG9hdClpTGluZXNDb3VudDsKKyAgICAgICAgICAoKnBGaWVsZEFycmF5KVtpQmxvY2tJbmRleCAqIDMgKyAyXSA9IGZDYWxjSGVpZ2h0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHBGaWVsZEFycmF5LT5wdXNoX2JhY2soKGZsb2F0KWlMaW5lc0NvdW50KTsKKyAgICAgICAgICBwRmllbGRBcnJheS0+cHVzaF9iYWNrKGZDYWxjSGVpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoZkhlaWdodCAtIGZTdGFydE9mZnNldCAtIGZUZXh0SGVpZ2h0IDwgZkZvbnRTaXplKSB7CisgICAgICAgIGlMaW5lTnVtIC09IDE7CisgICAgICAgIGlmIChpTGluZU51bSA9PSAwKSB7CisgICAgICAgICAgZkNhbGNIZWlnaHQgPSAwOworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpTGluZU51bSA9IChpbnQzMl90KShmVGV4dE51bSAvIGZMaW5lSGVpZ2h0KTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGlMaW5lTnVtID4gMCkgeworICAgICAgZmxvYXQgZlNwbGl0SGVpZ2h0ID0gaUxpbmVOdW0gKiBmTGluZUhlaWdodCArIGZDYXBSZXNlcnZlICsgZlN0YXJ0T2Zmc2V0OworICAgICAgaWYgKGlGaWVsZFNwbGl0Q291bnQgLyAzID09IChpQmxvY2tJbmRleCArIDEpKSB7CisgICAgICAgICgqcEZpZWxkQXJyYXkpW2lCbG9ja0luZGV4ICogMyArIDFdID0gKGZsb2F0KWlMaW5lTnVtOworICAgICAgICAoKnBGaWVsZEFycmF5KVtpQmxvY2tJbmRleCAqIDMgKyAyXSA9IGZTcGxpdEhlaWdodDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBGaWVsZEFycmF5LT5wdXNoX2JhY2soKGZsb2F0KWlMaW5lTnVtKTsKKyAgICAgICAgcEZpZWxkQXJyYXktPnB1c2hfYmFjayhmU3BsaXRIZWlnaHQpOworICAgICAgfQorICAgICAgaWYgKGZhYnMoZlNwbGl0SGVpZ2h0IC0gZkNhbGNIZWlnaHQpIDwgWEZBX0ZMT0FUX1BFUkNJU0lPTikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBmQ2FsY0hlaWdodCA9IGZTcGxpdEhlaWdodDsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICBmQ2FsY0hlaWdodCA9IDA7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpJbml0TGF5b3V0RGF0YSgpIHsKKyAgaWYgKG1fcExheW91dERhdGEpCisgICAgcmV0dXJuOworCisgIHN3aXRjaCAoR2V0VUlUeXBlKCkpIHsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpUZXh0OgorICAgICAgbV9wTGF5b3V0RGF0YSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1RleHRMYXlvdXREYXRhPigpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRleHRFZGl0OgorICAgICAgbV9wTGF5b3V0RGF0YSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1RleHRFZGl0RGF0YT4oKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpJbWFnZToKKyAgICAgIG1fcExheW91dERhdGEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9JbWFnZUxheW91dERhdGE+KCk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBYRkFfRWxlbWVudDo6SW1hZ2VFZGl0OgorICAgICAgbV9wTGF5b3V0RGF0YSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ltYWdlRWRpdERhdGE+KCk7CisgICAgICByZXR1cm47CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIGlmIChtX3BOb2RlICYmIG1fcE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkZpZWxkKSB7CisgICAgbV9wTGF5b3V0RGF0YSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZpZWxkTGF5b3V0RGF0YT4oKTsKKyAgICByZXR1cm47CisgIH0KKyAgbV9wTGF5b3V0RGF0YSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1dpZGdldExheW91dERhdGE+KCk7Cit9CisKK3ZvaWQgQ1hGQV9XaWRnZXRBY2M6OlN0YXJ0VGV4dExheW91dChDWEZBX0ZGRG9jKiBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQmIGZDYWxjV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQmIGZDYWxjSGVpZ2h0KSB7CisgIExvYWRUZXh0KGRvYyk7CisKKyAgQ1hGQV9UZXh0TGF5b3V0KiBwVGV4dExheW91dCA9CisgICAgICBzdGF0aWNfY2FzdDxDWEZBX1RleHRMYXlvdXREYXRhKj4obV9wTGF5b3V0RGF0YS5nZXQoKSktPkdldFRleHRMYXlvdXQoKTsKKyAgZmxvYXQgZlRleHRIZWlnaHQgPSAwOworICBpZiAoZkNhbGNXaWR0aCA+IDAgJiYgZkNhbGNIZWlnaHQgPiAwKSB7CisgICAgZmxvYXQgZldpZHRoID0gR2V0V2lkdGhXaXRob3V0TWFyZ2luKGZDYWxjV2lkdGgpOworICAgIHBUZXh0TGF5b3V0LT5TdGFydExheW91dChmV2lkdGgpOworICAgIGZUZXh0SGVpZ2h0ID0gZkNhbGNIZWlnaHQ7CisgICAgZlRleHRIZWlnaHQgPSBHZXRIZWlnaHRXaXRob3V0TWFyZ2luKGZUZXh0SGVpZ2h0KTsKKyAgICBwVGV4dExheW91dC0+RG9MYXlvdXQoMCwgZlRleHRIZWlnaHQsIC0xLCBmVGV4dEhlaWdodCk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChmQ2FsY1dpZHRoID4gMCAmJiBmQ2FsY0hlaWdodCA8IDApIHsKKyAgICBmbG9hdCBmV2lkdGggPSBHZXRXaWR0aFdpdGhvdXRNYXJnaW4oZkNhbGNXaWR0aCk7CisgICAgcFRleHRMYXlvdXQtPlN0YXJ0TGF5b3V0KGZXaWR0aCk7CisgIH0KKworICBpZiAoZkNhbGNXaWR0aCA8IDAgJiYgZkNhbGNIZWlnaHQgPCAwKSB7CisgICAgT3B0aW9uYWw8ZmxvYXQ+IHdpZHRoID0gbV9wTm9kZS0+VHJ5V2lkdGgoKTsKKyAgICBpZiAod2lkdGgpIHsKKyAgICAgIHBUZXh0TGF5b3V0LT5TdGFydExheW91dChHZXRXaWR0aFdpdGhvdXRNYXJnaW4oKndpZHRoKSk7CisgICAgICBmQ2FsY1dpZHRoID0gKndpZHRoOworICAgIH0gZWxzZSB7CisgICAgICBmbG9hdCBmTWF4V2lkdGggPSBDYWxjdWxhdGVXaWRnZXRBdXRvV2lkdGgocFRleHRMYXlvdXQtPlN0YXJ0TGF5b3V0KC0xKSk7CisgICAgICBwVGV4dExheW91dC0+U3RhcnRMYXlvdXQoR2V0V2lkdGhXaXRob3V0TWFyZ2luKGZNYXhXaWR0aCkpOworICAgICAgZkNhbGNXaWR0aCA9IGZNYXhXaWR0aDsKKyAgICB9CisgIH0KKworICBpZiAobV9wTGF5b3V0RGF0YS0+bV9mV2lkZ2V0SGVpZ2h0IDwgMCkgeworICAgIG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCA9IHBUZXh0TGF5b3V0LT5HZXRMYXlvdXRIZWlnaHQoKTsKKyAgICBtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQgPQorICAgICAgICBDYWxjdWxhdGVXaWRnZXRBdXRvSGVpZ2h0KG1fcExheW91dERhdGEtPm1fZldpZGdldEhlaWdodCk7CisgIH0KKyAgZlRleHRIZWlnaHQgPSBtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQ7CisgIGZUZXh0SGVpZ2h0ID0gR2V0SGVpZ2h0V2l0aG91dE1hcmdpbihmVGV4dEhlaWdodCk7CisgIHBUZXh0TGF5b3V0LT5Eb0xheW91dCgwLCBmVGV4dEhlaWdodCwgLTEsIGZUZXh0SGVpZ2h0KTsKKyAgZkNhbGNIZWlnaHQgPSBtX3BMYXlvdXREYXRhLT5tX2ZXaWRnZXRIZWlnaHQ7Cit9CisKK2Jvb2wgQ1hGQV9XaWRnZXRBY2M6OkxvYWRDYXB0aW9uKENYRkFfRkZEb2MqIGRvYykgeworICBJbml0TGF5b3V0RGF0YSgpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9GaWVsZExheW91dERhdGEqPihtX3BMYXlvdXREYXRhLmdldCgpKQorICAgICAgLT5Mb2FkQ2FwdGlvbihkb2MsIHRoaXMpOworfQorCitDWEZBX1RleHRMYXlvdXQqIENYRkFfV2lkZ2V0QWNjOjpHZXRDYXB0aW9uVGV4dExheW91dCgpIHsKKyAgcmV0dXJuIG1fcExheW91dERhdGEKKyAgICAgICAgICAgICA/IHN0YXRpY19jYXN0PENYRkFfRmllbGRMYXlvdXREYXRhKj4obV9wTGF5b3V0RGF0YS5nZXQoKSkKKyAgICAgICAgICAgICAgICAgICAtPm1fcENhcFRleHRMYXlvdXQuZ2V0KCkKKyAgICAgICAgICAgICA6IG51bGxwdHI7Cit9CisKK0NYRkFfVGV4dExheW91dCogQ1hGQV9XaWRnZXRBY2M6OkdldFRleHRMYXlvdXQoKSB7CisgIHJldHVybiBtX3BMYXlvdXREYXRhCisgICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxDWEZBX1RleHRMYXlvdXREYXRhKj4obV9wTGF5b3V0RGF0YS5nZXQoKSkKKyAgICAgICAgICAgICAgICAgICAtPkdldFRleHRMYXlvdXQoKQorICAgICAgICAgICAgIDogbnVsbHB0cjsKK30KKworUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gQ1hGQV9XaWRnZXRBY2M6OkdldEltYWdlSW1hZ2UoKSB7CisgIHJldHVybiBtX3BMYXlvdXREYXRhCisgICAgICAgICAgICAgPyBzdGF0aWNfY2FzdDxDWEZBX0ltYWdlTGF5b3V0RGF0YSo+KG1fcExheW91dERhdGEuZ2V0KCkpCisgICAgICAgICAgICAgICAgICAgLT5tX3BESUJpdG1hcAorICAgICAgICAgICAgIDogbnVsbHB0cjsKK30KKworUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gQ1hGQV9XaWRnZXRBY2M6OkdldEltYWdlRWRpdEltYWdlKCkgeworICByZXR1cm4gbV9wTGF5b3V0RGF0YQorICAgICAgICAgICAgID8gc3RhdGljX2Nhc3Q8Q1hGQV9JbWFnZUVkaXREYXRhKj4obV9wTGF5b3V0RGF0YS5nZXQoKSkKKyAgICAgICAgICAgICAgICAgICAtPm1fcERJQml0bWFwCisgICAgICAgICAgICAgOiBudWxscHRyOworfQorCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpTZXRJbWFnZUltYWdlKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBuZXdJbWFnZSkgeworICBDWEZBX0ltYWdlTGF5b3V0RGF0YSogcERhdGEgPQorICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9JbWFnZUxheW91dERhdGEqPihtX3BMYXlvdXREYXRhLmdldCgpKTsKKyAgaWYgKHBEYXRhLT5tX3BESUJpdG1hcCAhPSBuZXdJbWFnZSkKKyAgICBwRGF0YS0+bV9wRElCaXRtYXAgPSBuZXdJbWFnZTsKK30KKwordm9pZCBDWEZBX1dpZGdldEFjYzo6U2V0SW1hZ2VFZGl0SW1hZ2UoCisgICAgY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIG5ld0ltYWdlKSB7CisgIENYRkFfSW1hZ2VFZGl0RGF0YSogcERhdGEgPQorICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9JbWFnZUVkaXREYXRhKj4obV9wTGF5b3V0RGF0YS5nZXQoKSk7CisgIGlmIChwRGF0YS0+bV9wRElCaXRtYXAgIT0gbmV3SW1hZ2UpCisgICAgcERhdGEtPm1fcERJQml0bWFwID0gbmV3SW1hZ2U7Cit9CisKK1JldGFpblB0cjxDRkdBU19HRUZvbnQ+IENYRkFfV2lkZ2V0QWNjOjpHZXRGREVGb250KENYRkFfRkZEb2MqIGRvYykgeworICBXaWRlU3RyaW5nIHdzRm9udE5hbWUgPSBMIkNvdXJpZXIiOworICB1aW50MzJfdCBkd0ZvbnRTdHlsZSA9IDA7CisgIENYRkFfRm9udCogZm9udCA9IG1fcE5vZGUtPkdldEZvbnRJZkV4aXN0cygpOworICBpZiAoZm9udCkgeworICAgIGlmIChmb250LT5Jc0JvbGQoKSkKKyAgICAgIGR3Rm9udFN0eWxlIHw9IEZYRk9OVF9CT0xEOworICAgIGlmIChmb250LT5Jc0l0YWxpYygpKQorICAgICAgZHdGb250U3R5bGUgfD0gRlhGT05UX0lUQUxJQzsKKworICAgIHdzRm9udE5hbWUgPSBmb250LT5HZXRUeXBlZmFjZSgpOworICB9CisgIHJldHVybiBkb2MtPkdldEFwcCgpLT5HZXRYRkFGb250TWdyKCktPkdldEZvbnQoZG9jLCB3c0ZvbnROYW1lLkFzU3RyaW5nVmlldygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3Rm9udFN0eWxlKTsKK30KKworQ1hGQV9Ob2RlKiBDWEZBX1dpZGdldEFjYzo6R2V0VUlDaGlsZCgpIHsKKyAgaWYgKG1fZVVJVHlwZSA9PSBYRkFfRWxlbWVudDo6VW5rbm93bikKKyAgICBzdGQ6OnRpZShtX2VVSVR5cGUsIG1fcFVpQ2hpbGROb2RlKSA9IENyZWF0ZVVJQ2hpbGQobV9wTm9kZSk7CisgIHJldHVybiBtX3BVaUNoaWxkTm9kZTsKK30KKworWEZBX0VsZW1lbnQgQ1hGQV9XaWRnZXRBY2M6OkdldFVJVHlwZSgpIHsKKyAgR2V0VUlDaGlsZCgpOworICByZXR1cm4gbV9lVUlUeXBlOworfQorCitib29sIENYRkFfV2lkZ2V0QWNjOjpJc09wZW5BY2Nlc3MoKSBjb25zdCB7CisgIHJldHVybiBtX3BOb2RlICYmIG1fcE5vZGUtPklzT3BlbkFjY2VzcygpOworfQorCitzdGQ6OnZlY3RvcjxDWEZBX0V2ZW50Kj4gQ1hGQV9XaWRnZXRBY2M6OkdldEV2ZW50QnlBY3Rpdml0eSgKKyAgICBYRkFfQXR0cmlidXRlRW51bSBpQWN0aXZpdHksCisgICAgYm9vbCBiSXNGb3JtUmVhZHkpIHsKKyAgc3RkOjp2ZWN0b3I8Q1hGQV9FdmVudCo+IGV2ZW50czsKKyAgZm9yIChDWEZBX05vZGUqIG5vZGUgOiBtX3BOb2RlLT5HZXROb2RlTGlzdCgwLCBYRkFfRWxlbWVudDo6RXZlbnQpKSB7CisgICAgYXV0byogZXZlbnQgPSBzdGF0aWNfY2FzdDxDWEZBX0V2ZW50Kj4obm9kZSk7CisgICAgaWYgKGV2ZW50LT5HZXRBY3Rpdml0eSgpID09IGlBY3Rpdml0eSkgeworICAgICAgaWYgKGlBY3Rpdml0eSA9PSBYRkFfQXR0cmlidXRlRW51bTo6UmVhZHkpIHsKKyAgICAgICAgV2lkZVN0cmluZyB3c1JlZiA9IGV2ZW50LT5HZXRSZWYoKTsKKyAgICAgICAgaWYgKGJJc0Zvcm1SZWFkeSkgeworICAgICAgICAgIGlmICh3c1JlZiA9PSBXaWRlU3RyaW5nVmlldyhMIiRmb3JtIikpCisgICAgICAgICAgICBldmVudHMucHVzaF9iYWNrKGV2ZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBpZiAod3NSZWYgPT0gV2lkZVN0cmluZ1ZpZXcoTCIkbGF5b3V0IikpCisgICAgICAgICAgICBldmVudHMucHVzaF9iYWNrKGV2ZW50KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgZXZlbnRzLnB1c2hfYmFjayhldmVudCk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBldmVudHM7Cit9CisKK0NYRkFfQm9yZGVyKiBDWEZBX1dpZGdldEFjYzo6R2V0VUlCb3JkZXIoKSB7CisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7CisgIHJldHVybiBwVUlDaGlsZCA/IHBVSUNoaWxkLT5KU09iamVjdCgpLT5HZXRQcm9wZXJ0eTxDWEZBX0JvcmRlcj4oCisgICAgICAgICAgICAgICAgICAgICAgICAwLCBYRkFfRWxlbWVudDo6Qm9yZGVyKQorICAgICAgICAgICAgICAgICAgOiBudWxscHRyOworfQorCitDRlhfUmVjdEYgQ1hGQV9XaWRnZXRBY2M6OkdldFVJTWFyZ2luKCkgeworICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOworICBDWEZBX01hcmdpbiogbWdVSSA9IG51bGxwdHI7CisgIGlmIChwVUlDaGlsZCkgeworICAgIG1nVUkgPQorICAgICAgICBwVUlDaGlsZC0+SlNPYmplY3QoKS0+R2V0UHJvcGVydHk8Q1hGQV9NYXJnaW4+KDAsIFhGQV9FbGVtZW50OjpNYXJnaW4pOworICB9CisKKyAgaWYgKCFtZ1VJKQorICAgIHJldHVybiBDRlhfUmVjdEYoKTsKKworICBDWEZBX0JvcmRlciogYm9yZGVyID0gR2V0VUlCb3JkZXIoKTsKKyAgaWYgKGJvcmRlciAmJiBib3JkZXItPkdldFByZXNlbmNlKCkgIT0gWEZBX0F0dHJpYnV0ZUVudW06OlZpc2libGUpCisgICAgcmV0dXJuIENGWF9SZWN0RigpOworCisgIE9wdGlvbmFsPGZsb2F0PiBsZWZ0ID0gbWdVSS0+VHJ5TGVmdEluc2V0KCk7CisgIE9wdGlvbmFsPGZsb2F0PiB0b3AgPSBtZ1VJLT5UcnlUb3BJbnNldCgpOworICBPcHRpb25hbDxmbG9hdD4gcmlnaHQgPSBtZ1VJLT5UcnlSaWdodEluc2V0KCk7CisgIE9wdGlvbmFsPGZsb2F0PiBib3R0b20gPSBtZ1VJLT5UcnlCb3R0b21JbnNldCgpOworICBpZiAoYm9yZGVyKSB7CisgICAgYm9vbCBiVmlzaWJsZSA9IGZhbHNlOworICAgIGZsb2F0IGZUaGlja25lc3MgPSAwOworICAgIFhGQV9BdHRyaWJ1dGVFbnVtIGlUeXBlID0gWEZBX0F0dHJpYnV0ZUVudW06OlVua25vd247CisgICAgc3RkOjp0aWUoaVR5cGUsIGJWaXNpYmxlLCBmVGhpY2tuZXNzKSA9IGJvcmRlci0+R2V0M0RTdHlsZSgpOworICAgIGlmICghbGVmdCB8fCAhdG9wIHx8ICFyaWdodCB8fCAhYm90dG9tKSB7CisgICAgICBzdGQ6OnZlY3RvcjxDWEZBX1N0cm9rZSo+IHN0cm9rZXMgPSBib3JkZXItPkdldFN0cm9rZXMoKTsKKyAgICAgIGlmICghdG9wKQorICAgICAgICB0b3AgPSBHZXRFZGdlVGhpY2tuZXNzKHN0cm9rZXMsIGJWaXNpYmxlLCAwKTsKKyAgICAgIGlmICghcmlnaHQpCisgICAgICAgIHJpZ2h0ID0gR2V0RWRnZVRoaWNrbmVzcyhzdHJva2VzLCBiVmlzaWJsZSwgMSk7CisgICAgICBpZiAoIWJvdHRvbSkKKyAgICAgICAgYm90dG9tID0gR2V0RWRnZVRoaWNrbmVzcyhzdHJva2VzLCBiVmlzaWJsZSwgMik7CisgICAgICBpZiAoIWxlZnQpCisgICAgICAgIGxlZnQgPSBHZXRFZGdlVGhpY2tuZXNzKHN0cm9rZXMsIGJWaXNpYmxlLCAzKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIENGWF9SZWN0RihsZWZ0LnZhbHVlX29yKDAuMCksIHRvcC52YWx1ZV9vcigwLjApLCByaWdodC52YWx1ZV9vcigwLjApLAorICAgICAgICAgICAgICAgICAgIGJvdHRvbS52YWx1ZV9vcigwLjApKTsKK30KKworWEZBX0F0dHJpYnV0ZUVudW0gQ1hGQV9XaWRnZXRBY2M6OkdldEJ1dHRvbkhpZ2hsaWdodCgpIHsKKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsKKyAgaWYgKHBVSUNoaWxkKQorICAgIHJldHVybiBwVUlDaGlsZC0+SlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpIaWdobGlnaHQpOworICByZXR1cm4gWEZBX0F0dHJpYnV0ZUVudW06OkludmVydGVkOworfQorCitib29sIENYRkFfV2lkZ2V0QWNjOjpIYXNCdXR0b25Sb2xsb3ZlcigpIGNvbnN0IHsKKyAgQ1hGQV9JdGVtcyogcEl0ZW1zID0KKyAgICAgIG1fcE5vZGUtPkdldENoaWxkPENYRkFfSXRlbXM+KDAsIFhGQV9FbGVtZW50OjpJdGVtcywgZmFsc2UpOworICBpZiAoIXBJdGVtcykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yIChDWEZBX05vZGUqIHBUZXh0ID0gcEl0ZW1zLT5HZXRGaXJzdENoaWxkKCk7IHBUZXh0OworICAgICAgIHBUZXh0ID0gcFRleHQtPkdldE5leHRTaWJsaW5nKCkpIHsKKyAgICBpZiAocFRleHQtPkpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6Ok5hbWUpID09IEwicm9sbG92ZXIiKQorICAgICAgcmV0dXJuICFwVGV4dC0+SlNPYmplY3QoKS0+R2V0Q29udGVudChmYWxzZSkuSXNFbXB0eSgpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBDWEZBX1dpZGdldEFjYzo6SGFzQnV0dG9uRG93bigpIGNvbnN0IHsKKyAgQ1hGQV9JdGVtcyogcEl0ZW1zID0KKyAgICAgIG1fcE5vZGUtPkdldENoaWxkPENYRkFfSXRlbXM+KDAsIFhGQV9FbGVtZW50OjpJdGVtcywgZmFsc2UpOworICBpZiAoIXBJdGVtcykKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZm9yIChDWEZBX05vZGUqIHBUZXh0ID0gcEl0ZW1zLT5HZXRGaXJzdENoaWxkKCk7IHBUZXh0OworICAgICAgIHBUZXh0ID0gcFRleHQtPkdldE5leHRTaWJsaW5nKCkpIHsKKyAgICBpZiAocFRleHQtPkpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6Ok5hbWUpID09IEwiZG93biIpCisgICAgICByZXR1cm4gIXBUZXh0LT5KU09iamVjdCgpLT5HZXRDb250ZW50KGZhbHNlKS5Jc0VtcHR5KCk7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENYRkFfV2lkZ2V0QWNjOjpJc0NoZWNrQnV0dG9uUm91bmQoKSB7CisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7CisgIGlmIChwVUlDaGlsZCkKKyAgICByZXR1cm4gcFVJQ2hpbGQtPkpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6U2hhcGUpID09CisgICAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpSb3VuZDsKKyAgcmV0dXJuIGZhbHNlOworfQorCitYRkFfQXR0cmlidXRlRW51bSBDWEZBX1dpZGdldEFjYzo6R2V0Q2hlY2tCdXR0b25NYXJrKCkgeworICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOworICBpZiAocFVJQ2hpbGQpCisgICAgcmV0dXJuIHBVSUNoaWxkLT5KU09iamVjdCgpLT5HZXRFbnVtKFhGQV9BdHRyaWJ1dGU6Ok1hcmspOworICByZXR1cm4gWEZBX0F0dHJpYnV0ZUVudW06OkRlZmF1bHQ7Cit9CisKK2Jvb2wgQ1hGQV9XaWRnZXRBY2M6OklzUmFkaW9CdXR0b24oKSB7CisgIENYRkFfTm9kZSogcFBhcmVudCA9IG1fcE5vZGUtPkdldFBhcmVudCgpOworICByZXR1cm4gcFBhcmVudCAmJiBwUGFyZW50LT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpFeGNsR3JvdXA7Cit9CisKK2Zsb2F0IENYRkFfV2lkZ2V0QWNjOjpHZXRDaGVja0J1dHRvblNpemUoKSB7CisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7CisgIGlmIChwVUlDaGlsZCkgeworICAgIHJldHVybiBwVUlDaGlsZC0+SlNPYmplY3QoKQorICAgICAgICAtPkdldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6U2l6ZSkKKyAgICAgICAgLlRvVW5pdChYRkFfVW5pdDo6UHQpOworICB9CisgIHJldHVybiBDWEZBX01lYXN1cmVtZW50KDEwLCBYRkFfVW5pdDo6UHQpLlRvVW5pdChYRkFfVW5pdDo6UHQpOworfQorCitib29sIENYRkFfV2lkZ2V0QWNjOjpJc0FsbG93TmV1dHJhbCgpIHsKKyAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsKKyAgcmV0dXJuIHBVSUNoaWxkICYmCisgICAgICAgICBwVUlDaGlsZC0+SlNPYmplY3QoKS0+R2V0Qm9vbGVhbihYRkFfQXR0cmlidXRlOjpBbGxvd05ldXRyYWwpOworfQorCitYRkFfQ0hFQ0tTVEFURSBDWEZBX1dpZGdldEFjYzo6R2V0Q2hlY2tTdGF0ZSgpIHsKKyAgV2lkZVN0cmluZyB3c1ZhbHVlID0gbV9wTm9kZS0+R2V0UmF3VmFsdWUoKTsKKyAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKQorICAgIHJldHVybiBYRkFfQ0hFQ0tTVEFURV9PZmY7CisKKyAgYXV0byogcEl0ZW1zID0gbV9wTm9kZS0+R2V0Q2hpbGQ8Q1hGQV9JdGVtcz4oMCwgWEZBX0VsZW1lbnQ6Okl0ZW1zLCBmYWxzZSk7CisgIGlmICghcEl0ZW1zKQorICAgIHJldHVybiBYRkFfQ0hFQ0tTVEFURV9PZmY7CisKKyAgQ1hGQV9Ob2RlKiBwVGV4dCA9IHBJdGVtcy0+R2V0Rmlyc3RDaGlsZCgpOworICBpbnQzMl90IGkgPSAwOworICB3aGlsZSAocFRleHQpIHsKKyAgICBPcHRpb25hbDxXaWRlU3RyaW5nPiB3c0NvbnRlbnQgPSBwVGV4dC0+SlNPYmplY3QoKS0+VHJ5Q29udGVudChmYWxzZSwgdHJ1ZSk7CisgICAgaWYgKHdzQ29udGVudCAmJiAqd3NDb250ZW50ID09IHdzVmFsdWUpCisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8WEZBX0NIRUNLU1RBVEU+KGkpOworCisgICAgaSsrOworICAgIHBUZXh0ID0gcFRleHQtPkdldE5leHRTaWJsaW5nKCk7CisgIH0KKyAgcmV0dXJuIFhGQV9DSEVDS1NUQVRFX09mZjsKK30KKwordm9pZCBDWEZBX1dpZGdldEFjYzo6U2V0Q2hlY2tTdGF0ZShYRkFfQ0hFQ0tTVEFURSBlQ2hlY2tTdGF0ZSwgYm9vbCBiTm90aWZ5KSB7CisgIENYRkFfTm9kZSogbm9kZSA9IG1fcE5vZGUtPkdldEV4Y2xHcm91cElmRXhpc3RzKCk7CisgIGlmICghbm9kZSkgeworICAgIENYRkFfSXRlbXMqIHBJdGVtcyA9CisgICAgICAgIG1fcE5vZGUtPkdldENoaWxkPENYRkFfSXRlbXM+KDAsIFhGQV9FbGVtZW50OjpJdGVtcywgZmFsc2UpOworICAgIGlmICghcEl0ZW1zKQorICAgICAgcmV0dXJuOworCisgICAgaW50MzJfdCBpID0gLTE7CisgICAgQ1hGQV9Ob2RlKiBwVGV4dCA9IHBJdGVtcy0+R2V0Rmlyc3RDaGlsZCgpOworICAgIFdpZGVTdHJpbmcgd3NDb250ZW50OworICAgIHdoaWxlIChwVGV4dCkgeworICAgICAgaSsrOworICAgICAgaWYgKGkgPT0gZUNoZWNrU3RhdGUpIHsKKyAgICAgICAgd3NDb250ZW50ID0gcFRleHQtPkpTT2JqZWN0KCktPkdldENvbnRlbnQoZmFsc2UpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHBUZXh0ID0gcFRleHQtPkdldE5leHRTaWJsaW5nKCk7CisgICAgfQorICAgIGlmIChtX3BOb2RlKQorICAgICAgbV9wTm9kZS0+U3luY1ZhbHVlKHdzQ29udGVudCwgYk5vdGlmeSk7CisKKyAgICByZXR1cm47CisgIH0KKworICBXaWRlU3RyaW5nIHdzVmFsdWU7CisgIGlmIChlQ2hlY2tTdGF0ZSAhPSBYRkFfQ0hFQ0tTVEFURV9PZmYpIHsKKyAgICBpZiAoQ1hGQV9JdGVtcyogcEl0ZW1zID0KKyAgICAgICAgICAgIG1fcE5vZGUtPkdldENoaWxkPENYRkFfSXRlbXM+KDAsIFhGQV9FbGVtZW50OjpJdGVtcywgZmFsc2UpKSB7CisgICAgICBDWEZBX05vZGUqIHBUZXh0ID0gcEl0ZW1zLT5HZXRGaXJzdENoaWxkKCk7CisgICAgICBpZiAocFRleHQpCisgICAgICAgIHdzVmFsdWUgPSBwVGV4dC0+SlNPYmplY3QoKS0+R2V0Q29udGVudChmYWxzZSk7CisgICAgfQorICB9CisgIENYRkFfTm9kZSogcENoaWxkID0gbm9kZS0+R2V0Rmlyc3RDaGlsZCgpOworICBmb3IgKDsgcENoaWxkOyBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5leHRTaWJsaW5nKCkpIHsKKyAgICBpZiAocENoaWxkLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpGaWVsZCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgQ1hGQV9JdGVtcyogcEl0ZW0gPQorICAgICAgICBwQ2hpbGQtPkdldENoaWxkPENYRkFfSXRlbXM+KDAsIFhGQV9FbGVtZW50OjpJdGVtcywgZmFsc2UpOworICAgIGlmICghcEl0ZW0pCisgICAgICBjb250aW51ZTsKKworICAgIENYRkFfTm9kZSogcEl0ZW1jaGlsZCA9IHBJdGVtLT5HZXRGaXJzdENoaWxkKCk7CisgICAgaWYgKCFwSXRlbWNoaWxkKQorICAgICAgY29udGludWU7CisKKyAgICBXaWRlU3RyaW5nIHRleHQgPSBwSXRlbWNoaWxkLT5KU09iamVjdCgpLT5HZXRDb250ZW50KGZhbHNlKTsKKyAgICBXaWRlU3RyaW5nIHdzQ2hpbGRWYWx1ZSA9IHRleHQ7CisgICAgaWYgKHdzVmFsdWUgIT0gdGV4dCkgeworICAgICAgcEl0ZW1jaGlsZCA9IHBJdGVtY2hpbGQtPkdldE5leHRTaWJsaW5nKCk7CisgICAgICBpZiAocEl0ZW1jaGlsZCkKKyAgICAgICAgd3NDaGlsZFZhbHVlID0gcEl0ZW1jaGlsZC0+SlNPYmplY3QoKS0+R2V0Q29udGVudChmYWxzZSk7CisgICAgICBlbHNlCisgICAgICAgIHdzQ2hpbGRWYWx1ZS5jbGVhcigpOworICAgIH0KKyAgICBwQ2hpbGQtPlN5bmNWYWx1ZSh3c0NoaWxkVmFsdWUsIGJOb3RpZnkpOworICB9CisgIG5vZGUtPlN5bmNWYWx1ZSh3c1ZhbHVlLCBiTm90aWZ5KTsKK30KKworQ1hGQV9Ob2RlKiBDWEZBX1dpZGdldEFjYzo6R2V0U2VsZWN0ZWRNZW1iZXIoKSB7CisgIENYRkFfTm9kZSogcFNlbGVjdGVkTWVtYmVyID0gbnVsbHB0cjsKKyAgV2lkZVN0cmluZyB3c1N0YXRlID0gbV9wTm9kZS0+R2V0UmF3VmFsdWUoKTsKKyAgaWYgKHdzU3RhdGUuSXNFbXB0eSgpKQorICAgIHJldHVybiBwU2VsZWN0ZWRNZW1iZXI7CisKKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gVG9Ob2RlKG1fcE5vZGUtPkdldEZpcnN0Q2hpbGQoKSk7IHBOb2RlOworICAgICAgIHBOb2RlID0gcE5vZGUtPkdldE5leHRTaWJsaW5nKCkpIHsKKyAgICBDWEZBX1dpZGdldEFjYyB3aWRnZXREYXRhKHBOb2RlKTsKKyAgICBpZiAod2lkZ2V0RGF0YS5HZXRDaGVja1N0YXRlKCkgPT0gWEZBX0NIRUNLU1RBVEVfT24pIHsKKyAgICAgIHBTZWxlY3RlZE1lbWJlciA9IHBOb2RlOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBwU2VsZWN0ZWRNZW1iZXI7Cit9CisKK0NYRkFfTm9kZSogQ1hGQV9XaWRnZXRBY2M6OlNldFNlbGVjdGVkTWVtYmVyKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJOb3RpZnkpIHsKKyAgdWludDMyX3QgbmFtZUhhc2ggPSBGWF9IYXNoQ29kZV9HZXRXKHdzTmFtZSwgZmFsc2UpOworICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBUb05vZGUobV9wTm9kZS0+R2V0Rmlyc3RDaGlsZCgpKTsgcE5vZGU7CisgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0TmV4dFNpYmxpbmcoKSkgeworICAgIGlmIChwTm9kZS0+R2V0TmFtZUhhc2goKSA9PSBuYW1lSGFzaCkgeworICAgICAgQ1hGQV9XaWRnZXRBY2Mgd2lkZ2V0RGF0YShwTm9kZSk7CisgICAgICB3aWRnZXREYXRhLlNldENoZWNrU3RhdGUoWEZBX0NIRUNLU1RBVEVfT24sIGJOb3RpZnkpOworICAgICAgcmV0dXJuIHBOb2RlOworICAgIH0KKyAgfQorICByZXR1cm4gbnVsbHB0cjsKK30KKwordm9pZCBDWEZBX1dpZGdldEFjYzo6U2V0U2VsZWN0ZWRNZW1iZXJCeVZhbHVlKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk5vdGlmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTY3JpcHRNb2RpZnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3luY0RhdGEpIHsKKyAgV2lkZVN0cmluZyB3c0V4Y2xHcm91cDsKKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Rmlyc3RDaGlsZCgpOyBwTm9kZTsKKyAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROZXh0U2libGluZygpKSB7CisgICAgaWYgKHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpGaWVsZCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgQ1hGQV9JdGVtcyogcEl0ZW0gPQorICAgICAgICBwTm9kZS0+R2V0Q2hpbGQ8Q1hGQV9JdGVtcz4oMCwgWEZBX0VsZW1lbnQ6Okl0ZW1zLCBmYWxzZSk7CisgICAgaWYgKCFwSXRlbSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgQ1hGQV9Ob2RlKiBwSXRlbWNoaWxkID0gcEl0ZW0tPkdldEZpcnN0Q2hpbGQoKTsKKyAgICBpZiAoIXBJdGVtY2hpbGQpCisgICAgICBjb250aW51ZTsKKworICAgIFdpZGVTdHJpbmcgd3NDaGlsZFZhbHVlID0gcEl0ZW1jaGlsZC0+SlNPYmplY3QoKS0+R2V0Q29udGVudChmYWxzZSk7CisgICAgaWYgKHdzVmFsdWUgIT0gd3NDaGlsZFZhbHVlKSB7CisgICAgICBwSXRlbWNoaWxkID0gcEl0ZW1jaGlsZC0+R2V0TmV4dFNpYmxpbmcoKTsKKyAgICAgIGlmIChwSXRlbWNoaWxkKQorICAgICAgICB3c0NoaWxkVmFsdWUgPSBwSXRlbWNoaWxkLT5KU09iamVjdCgpLT5HZXRDb250ZW50KGZhbHNlKTsKKyAgICAgIGVsc2UKKyAgICAgICAgd3NDaGlsZFZhbHVlLmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHdzRXhjbEdyb3VwID0gd3NWYWx1ZTsKKyAgICB9CisgICAgcE5vZGUtPkpTT2JqZWN0KCktPlNldENvbnRlbnQod3NDaGlsZFZhbHVlLCB3c0NoaWxkVmFsdWUsIGJOb3RpZnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNjcmlwdE1vZGlmeSwgZmFsc2UpOworICB9CisgIGlmIChtX3BOb2RlKSB7CisgICAgbV9wTm9kZS0+SlNPYmplY3QoKS0+U2V0Q29udGVudCh3c0V4Y2xHcm91cCwgd3NFeGNsR3JvdXAsIGJOb3RpZnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2NyaXB0TW9kaWZ5LCBiU3luY0RhdGEpOworICB9Cit9CisKK0NYRkFfTm9kZSogQ1hGQV9XaWRnZXRBY2M6OkdldEV4Y2xHcm91cEZpcnN0TWVtYmVyKCkgeworICBDWEZBX05vZGUqIHBFeGNsID0gR2V0Tm9kZSgpOworICBpZiAoIXBFeGNsKQorICAgIHJldHVybiBudWxscHRyOworCisgIENYRkFfTm9kZSogcE5vZGUgPSBwRXhjbC0+R2V0Rmlyc3RDaGlsZCgpOworICB3aGlsZSAocE5vZGUpIHsKKyAgICBpZiAocE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkZpZWxkKQorICAgICAgcmV0dXJuIHBOb2RlOworCisgICAgcE5vZGUgPSBwTm9kZS0+R2V0TmV4dFNpYmxpbmcoKTsKKyAgfQorICByZXR1cm4gbnVsbHB0cjsKK30KK0NYRkFfTm9kZSogQ1hGQV9XaWRnZXRBY2M6OkdldEV4Y2xHcm91cE5leHRNZW1iZXIoQ1hGQV9Ob2RlKiBwTm9kZSkgeworICBpZiAoIXBOb2RlKQorICAgIHJldHVybiBudWxscHRyOworCisgIENYRkFfTm9kZSogcE5vZGVGaWVsZCA9IHBOb2RlLT5HZXROZXh0U2libGluZygpOworICB3aGlsZSAocE5vZGVGaWVsZCkgeworICAgIGlmIChwTm9kZUZpZWxkLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpGaWVsZCkKKyAgICAgIHJldHVybiBwTm9kZUZpZWxkOworCisgICAgcE5vZGVGaWVsZCA9IHBOb2RlRmllbGQtPkdldE5leHRTaWJsaW5nKCk7CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2Jvb2wgQ1hGQV9XaWRnZXRBY2M6OklzQ2hvaWNlTGlzdENvbW1pdE9uU2VsZWN0KCkgeworICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOworICBpZiAocFVJQ2hpbGQpIHsKKyAgICByZXR1cm4gcFVJQ2hpbGQtPkpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6Q29tbWl0T24pID09CisgICAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpTZWxlY3Q7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1hGQV9XaWRnZXRBY2M6OklzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCkgeworICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOworICByZXR1cm4gcFVJQ2hpbGQgJiYgcFVJQ2hpbGQtPkpTT2JqZWN0KCktPkdldEJvb2xlYW4oWEZBX0F0dHJpYnV0ZTo6VGV4dEVudHJ5KTsKK30KKworYm9vbCBDWEZBX1dpZGdldEFjYzo6SXNDaG9pY2VMaXN0TXVsdGlTZWxlY3QoKSB7CisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7CisgIGlmIChwVUlDaGlsZCkgeworICAgIHJldHVybiBwVUlDaGlsZC0+SlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpPcGVuKSA9PQorICAgICAgICAgICBYRkFfQXR0cmlidXRlRW51bTo6TXVsdGlTZWxlY3Q7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENYRkFfV2lkZ2V0QWNjOjpJc0xpc3RCb3goKSB7CisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7CisgIGlmICghcFVJQ2hpbGQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIFhGQV9BdHRyaWJ1dGVFbnVtIGF0dHIgPSBwVUlDaGlsZC0+SlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpPcGVuKTsKKyAgcmV0dXJuIGF0dHIgPT0gWEZBX0F0dHJpYnV0ZUVudW06OkFsd2F5cyB8fAorICAgICAgICAgYXR0ciA9PSBYRkFfQXR0cmlidXRlRW51bTo6TXVsdGlTZWxlY3Q7Cit9CisKK2ludDMyX3QgQ1hGQV9XaWRnZXRBY2M6OkNvdW50Q2hvaWNlTGlzdEl0ZW1zKGJvb2wgYlNhdmVWYWx1ZSkgeworICBzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPiBwSXRlbXM7CisgIGludDMyX3QgaUNvdW50ID0gMDsKKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Rmlyc3RDaGlsZCgpOyBwTm9kZTsKKyAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROZXh0U2libGluZygpKSB7CisgICAgaWYgKHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpJdGVtcykKKyAgICAgIGNvbnRpbnVlOworICAgIGlDb3VudCsrOworICAgIHBJdGVtcy5wdXNoX2JhY2socE5vZGUpOworICAgIGlmIChpQ291bnQgPT0gMikKKyAgICAgIGJyZWFrOworICB9CisgIGlmIChpQ291bnQgPT0gMCkKKyAgICByZXR1cm4gMDsKKworICBDWEZBX05vZGUqIHBJdGVtID0gcEl0ZW1zWzBdOworICBpZiAoaUNvdW50ID4gMSkgeworICAgIGJvb2wgYkl0ZW1PbmVIYXNTYXZlID0KKyAgICAgICAgcEl0ZW1zWzBdLT5KU09iamVjdCgpLT5HZXRCb29sZWFuKFhGQV9BdHRyaWJ1dGU6OlNhdmUpOworICAgIGJvb2wgYkl0ZW1Ud29IYXNTYXZlID0KKyAgICAgICAgcEl0ZW1zWzFdLT5KU09iamVjdCgpLT5HZXRCb29sZWFuKFhGQV9BdHRyaWJ1dGU6OlNhdmUpOworICAgIGlmIChiSXRlbU9uZUhhc1NhdmUgIT0gYkl0ZW1Ud29IYXNTYXZlICYmIGJTYXZlVmFsdWUgPT0gYkl0ZW1Ud29IYXNTYXZlKQorICAgICAgcEl0ZW0gPSBwSXRlbXNbMV07CisgIH0KKyAgcmV0dXJuIHBJdGVtLT5Db3VudENoaWxkcmVuKFhGQV9FbGVtZW50OjpVbmtub3duLCBmYWxzZSk7Cit9CisKK09wdGlvbmFsPFdpZGVTdHJpbmc+IENYRkFfV2lkZ2V0QWNjOjpHZXRDaG9pY2VMaXN0SXRlbShpbnQzMl90IG5JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTYXZlVmFsdWUpIHsKKyAgc3RkOjp2ZWN0b3I8Q1hGQV9Ob2RlKj4gcEl0ZW1zQXJyYXk7CisgIGludDMyX3QgaUNvdW50ID0gMDsKKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Rmlyc3RDaGlsZCgpOyBwTm9kZTsKKyAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROZXh0U2libGluZygpKSB7CisgICAgaWYgKHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpJdGVtcykKKyAgICAgIGNvbnRpbnVlOworCisgICAgKytpQ291bnQ7CisgICAgcEl0ZW1zQXJyYXkucHVzaF9iYWNrKHBOb2RlKTsKKyAgICBpZiAoaUNvdW50ID09IDIpCisgICAgICBicmVhazsKKyAgfQorICBpZiAoaUNvdW50ID09IDApCisgICAgcmV0dXJuIHt9OworCisgIENYRkFfTm9kZSogcEl0ZW1zID0gcEl0ZW1zQXJyYXlbMF07CisgIGlmIChpQ291bnQgPiAxKSB7CisgICAgYm9vbCBiSXRlbU9uZUhhc1NhdmUgPQorICAgICAgICBwSXRlbXNBcnJheVswXS0+SlNPYmplY3QoKS0+R2V0Qm9vbGVhbihYRkFfQXR0cmlidXRlOjpTYXZlKTsKKyAgICBib29sIGJJdGVtVHdvSGFzU2F2ZSA9CisgICAgICAgIHBJdGVtc0FycmF5WzFdLT5KU09iamVjdCgpLT5HZXRCb29sZWFuKFhGQV9BdHRyaWJ1dGU6OlNhdmUpOworICAgIGlmIChiSXRlbU9uZUhhc1NhdmUgIT0gYkl0ZW1Ud29IYXNTYXZlICYmIGJTYXZlVmFsdWUgPT0gYkl0ZW1Ud29IYXNTYXZlKQorICAgICAgcEl0ZW1zID0gcEl0ZW1zQXJyYXlbMV07CisgIH0KKyAgaWYgKCFwSXRlbXMpCisgICAgcmV0dXJuIHt9OworCisgIENYRkFfTm9kZSogcEl0ZW0gPQorICAgICAgcEl0ZW1zLT5HZXRDaGlsZDxDWEZBX05vZGU+KG5JbmRleCwgWEZBX0VsZW1lbnQ6OlVua25vd24sIGZhbHNlKTsKKyAgaWYgKHBJdGVtKQorICAgIHJldHVybiB7cEl0ZW0tPkpTT2JqZWN0KCktPkdldENvbnRlbnQoZmFsc2UpfTsKKyAgcmV0dXJuIHt9OworfQorCitzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nPiBDWEZBX1dpZGdldEFjYzo6R2V0Q2hvaWNlTGlzdEl0ZW1zKGJvb2wgYlNhdmVWYWx1ZSkgeworICBzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPiBpdGVtczsKKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Rmlyc3RDaGlsZCgpOyBwTm9kZSAmJiBpdGVtcy5zaXplKCkgPCAyOworICAgICAgIHBOb2RlID0gcE5vZGUtPkdldE5leHRTaWJsaW5nKCkpIHsKKyAgICBpZiAocE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6Okl0ZW1zKQorICAgICAgaXRlbXMucHVzaF9iYWNrKHBOb2RlKTsKKyAgfQorICBpZiAoaXRlbXMuZW1wdHkoKSkKKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8V2lkZVN0cmluZz4oKTsKKworICBDWEZBX05vZGUqIHBJdGVtID0gaXRlbXMuZnJvbnQoKTsKKyAgaWYgKGl0ZW1zLnNpemUoKSA+IDEpIHsKKyAgICBib29sIGJJdGVtT25lSGFzU2F2ZSA9CisgICAgICAgIGl0ZW1zWzBdLT5KU09iamVjdCgpLT5HZXRCb29sZWFuKFhGQV9BdHRyaWJ1dGU6OlNhdmUpOworICAgIGJvb2wgYkl0ZW1Ud29IYXNTYXZlID0KKyAgICAgICAgaXRlbXNbMV0tPkpTT2JqZWN0KCktPkdldEJvb2xlYW4oWEZBX0F0dHJpYnV0ZTo6U2F2ZSk7CisgICAgaWYgKGJJdGVtT25lSGFzU2F2ZSAhPSBiSXRlbVR3b0hhc1NhdmUgJiYgYlNhdmVWYWx1ZSA9PSBiSXRlbVR3b0hhc1NhdmUpCisgICAgICBwSXRlbSA9IGl0ZW1zWzFdOworICB9CisKKyAgc3RkOjp2ZWN0b3I8V2lkZVN0cmluZz4gd3NUZXh0QXJyYXk7CisgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHBJdGVtLT5HZXRGaXJzdENoaWxkKCk7IHBOb2RlOworICAgICAgIHBOb2RlID0gcE5vZGUtPkdldE5leHRTaWJsaW5nKCkpIHsKKyAgICB3c1RleHRBcnJheS5lbXBsYWNlX2JhY2socE5vZGUtPkpTT2JqZWN0KCktPkdldENvbnRlbnQoZmFsc2UpKTsKKyAgfQorICByZXR1cm4gd3NUZXh0QXJyYXk7Cit9CisKK2ludDMyX3QgQ1hGQV9XaWRnZXRBY2M6OkNvdW50U2VsZWN0ZWRJdGVtcygpIHsKKyAgc3RkOjp2ZWN0b3I8V2lkZVN0cmluZz4gd3NWYWx1ZUFycmF5ID0gR2V0U2VsZWN0ZWRJdGVtc1ZhbHVlKCk7CisgIGlmIChJc0xpc3RCb3goKSB8fCAhSXNDaG9pY2VMaXN0QWxsb3dUZXh0RW50cnkoKSkKKyAgICByZXR1cm4gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90Pih3c1ZhbHVlQXJyYXkpOworCisgIGludDMyX3QgaVNlbGVjdGVkID0gMDsKKyAgc3RkOjp2ZWN0b3I8V2lkZVN0cmluZz4gd3NTYXZlVGV4dEFycmF5ID0gR2V0Q2hvaWNlTGlzdEl0ZW1zKHRydWUpOworICBmb3IgKGNvbnN0IGF1dG8mIHZhbHVlIDogd3NWYWx1ZUFycmF5KSB7CisgICAgaWYgKHBkZml1bTo6Q29udGFpbnNWYWx1ZSh3c1NhdmVUZXh0QXJyYXksIHZhbHVlKSkKKyAgICAgIGlTZWxlY3RlZCsrOworICB9CisgIHJldHVybiBpU2VsZWN0ZWQ7Cit9CisKK2ludDMyX3QgQ1hGQV9XaWRnZXRBY2M6OkdldFNlbGVjdGVkSXRlbShpbnQzMl90IG5JbmRleCkgeworICBzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nPiB3c1ZhbHVlQXJyYXkgPSBHZXRTZWxlY3RlZEl0ZW1zVmFsdWUoKTsKKyAgaWYgKCFwZGZpdW06OkluZGV4SW5Cb3VuZHMod3NWYWx1ZUFycmF5LCBuSW5kZXgpKQorICAgIHJldHVybiAtMTsKKworICBzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nPiB3c1NhdmVUZXh0QXJyYXkgPSBHZXRDaG9pY2VMaXN0SXRlbXModHJ1ZSk7CisgIGF1dG8gaXQgPSBzdGQ6OmZpbmQod3NTYXZlVGV4dEFycmF5LmJlZ2luKCksIHdzU2F2ZVRleHRBcnJheS5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlQXJyYXlbbkluZGV4XSk7CisgIHJldHVybiBpdCAhPSB3c1NhdmVUZXh0QXJyYXkuZW5kKCkgPyBpdCAtIHdzU2F2ZVRleHRBcnJheS5iZWdpbigpIDogLTE7Cit9CisKK3N0ZDo6dmVjdG9yPGludDMyX3Q+IENYRkFfV2lkZ2V0QWNjOjpHZXRTZWxlY3RlZEl0ZW1zKCkgeworICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBpU2VsQXJyYXk7CisgIHN0ZDo6dmVjdG9yPFdpZGVTdHJpbmc+IHdzVmFsdWVBcnJheSA9IEdldFNlbGVjdGVkSXRlbXNWYWx1ZSgpOworICBzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nPiB3c1NhdmVUZXh0QXJyYXkgPSBHZXRDaG9pY2VMaXN0SXRlbXModHJ1ZSk7CisgIGZvciAoY29uc3QgYXV0byYgdmFsdWUgOiB3c1ZhbHVlQXJyYXkpIHsKKyAgICBhdXRvIGl0ID0gc3RkOjpmaW5kKHdzU2F2ZVRleHRBcnJheS5iZWdpbigpLCB3c1NhdmVUZXh0QXJyYXkuZW5kKCksIHZhbHVlKTsKKyAgICBpZiAoaXQgIT0gd3NTYXZlVGV4dEFycmF5LmVuZCgpKQorICAgICAgaVNlbEFycmF5LnB1c2hfYmFjayhpdCAtIHdzU2F2ZVRleHRBcnJheS5iZWdpbigpKTsKKyAgfQorICByZXR1cm4gaVNlbEFycmF5OworfQorCitzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nPiBDWEZBX1dpZGdldEFjYzo6R2V0U2VsZWN0ZWRJdGVtc1ZhbHVlKCkgeworICBzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nPiB3c1NlbFRleHRBcnJheTsKKyAgV2lkZVN0cmluZyB3c1ZhbHVlID0gbV9wTm9kZS0+R2V0UmF3VmFsdWUoKTsKKyAgaWYgKElzQ2hvaWNlTGlzdE11bHRpU2VsZWN0KCkpIHsKKyAgICBpZiAoIXdzVmFsdWUuSXNFbXB0eSgpKSB7CisgICAgICBzaXplX3QgaVN0YXJ0ID0gMDsKKyAgICAgIHNpemVfdCBpTGVuZ3RoID0gd3NWYWx1ZS5HZXRMZW5ndGgoKTsKKyAgICAgIGF1dG8gaUVuZCA9IHdzVmFsdWUuRmluZChMJ1xuJywgaVN0YXJ0KTsKKyAgICAgIGlFbmQgPSAoIWlFbmQuaGFzX3ZhbHVlKCkpID8gaUxlbmd0aCA6IGlFbmQ7CisgICAgICB3aGlsZSAoaUVuZCA+PSBpU3RhcnQpIHsKKyAgICAgICAgd3NTZWxUZXh0QXJyYXkucHVzaF9iYWNrKHdzVmFsdWUuTWlkKGlTdGFydCwgaUVuZC52YWx1ZSgpIC0gaVN0YXJ0KSk7CisgICAgICAgIGlTdGFydCA9IGlFbmQudmFsdWUoKSArIDE7CisgICAgICAgIGlmIChpU3RhcnQgPj0gaUxlbmd0aCkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgaUVuZCA9IHdzVmFsdWUuRmluZChMJ1xuJywgaVN0YXJ0KTsKKyAgICAgICAgaWYgKCFpRW5kLmhhc192YWx1ZSgpKQorICAgICAgICAgIHdzU2VsVGV4dEFycmF5LnB1c2hfYmFjayh3c1ZhbHVlLk1pZChpU3RhcnQsIGlMZW5ndGggLSBpU3RhcnQpKTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgd3NTZWxUZXh0QXJyYXkucHVzaF9iYWNrKHdzVmFsdWUpOworICB9CisgIHJldHVybiB3c1NlbFRleHRBcnJheTsKK30KKworYm9vbCBDWEZBX1dpZGdldEFjYzo6R2V0SXRlbVN0YXRlKGludDMyX3QgbkluZGV4KSB7CisgIHN0ZDo6dmVjdG9yPFdpZGVTdHJpbmc+IHdzU2F2ZVRleHRBcnJheSA9IEdldENob2ljZUxpc3RJdGVtcyh0cnVlKTsKKyAgcmV0dXJuIHBkZml1bTo6SW5kZXhJbkJvdW5kcyh3c1NhdmVUZXh0QXJyYXksIG5JbmRleCkgJiYKKyAgICAgICAgIHBkZml1bTo6Q29udGFpbnNWYWx1ZShHZXRTZWxlY3RlZEl0ZW1zVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1NhdmVUZXh0QXJyYXlbbkluZGV4XSk7Cit9CisKK3ZvaWQgQ1hGQV9XaWRnZXRBY2M6OlNldEl0ZW1TdGF0ZShpbnQzMl90IG5JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZWxlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJOb3RpZnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2NyaXB0TW9kaWZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN5bmNEYXRhKSB7CisgIHN0ZDo6dmVjdG9yPFdpZGVTdHJpbmc+IHdzU2F2ZVRleHRBcnJheSA9IEdldENob2ljZUxpc3RJdGVtcyh0cnVlKTsKKyAgaWYgKCFwZGZpdW06OkluZGV4SW5Cb3VuZHMod3NTYXZlVGV4dEFycmF5LCBuSW5kZXgpKQorICAgIHJldHVybjsKKworICBpbnQzMl90IGlTZWwgPSAtMTsKKyAgc3RkOjp2ZWN0b3I8V2lkZVN0cmluZz4gd3NWYWx1ZUFycmF5ID0gR2V0U2VsZWN0ZWRJdGVtc1ZhbHVlKCk7CisgIGF1dG8gaXQgPSBzdGQ6OmZpbmQod3NWYWx1ZUFycmF5LmJlZ2luKCksIHdzVmFsdWVBcnJheS5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICB3c1NhdmVUZXh0QXJyYXlbbkluZGV4XSk7CisgIGlmIChpdCAhPSB3c1ZhbHVlQXJyYXkuZW5kKCkpCisgICAgaVNlbCA9IGl0IC0gd3NWYWx1ZUFycmF5LmJlZ2luKCk7CisKKyAgaWYgKElzQ2hvaWNlTGlzdE11bHRpU2VsZWN0KCkpIHsKKyAgICBpZiAoYlNlbGVjdGVkKSB7CisgICAgICBpZiAoaVNlbCA8IDApIHsKKyAgICAgICAgV2lkZVN0cmluZyB3c1ZhbHVlID0gbV9wTm9kZS0+R2V0UmF3VmFsdWUoKTsKKyAgICAgICAgaWYgKCF3c1ZhbHVlLklzRW1wdHkoKSkgeworICAgICAgICAgIHdzVmFsdWUgKz0gTCJcbiI7CisgICAgICAgIH0KKyAgICAgICAgd3NWYWx1ZSArPSB3c1NhdmVUZXh0QXJyYXlbbkluZGV4XTsKKyAgICAgICAgbV9wTm9kZS0+SlNPYmplY3QoKS0+U2V0Q29udGVudCh3c1ZhbHVlLCB3c1ZhbHVlLCBiTm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTY3JpcHRNb2RpZnksIGJTeW5jRGF0YSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChpU2VsID49IDApIHsKKyAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGlTZWxBcnJheSA9IEdldFNlbGVjdGVkSXRlbXMoKTsKKyAgICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmQoaVNlbEFycmF5LmJlZ2luKCksIGlTZWxBcnJheS5lbmQoKSwgbkluZGV4KTsKKyAgICAgIGlmIChpdCAhPSBpU2VsQXJyYXkuZW5kKCkpCisgICAgICAgIGlTZWxBcnJheS5lcmFzZShpdCk7CisgICAgICBTZXRTZWxlY3RlZEl0ZW1zKGlTZWxBcnJheSwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSwgYlN5bmNEYXRhKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGJTZWxlY3RlZCkgeworICAgICAgaWYgKGlTZWwgPCAwKSB7CisgICAgICAgIFdpZGVTdHJpbmcgd3NTYXZlVGV4dCA9IHdzU2F2ZVRleHRBcnJheVtuSW5kZXhdOworICAgICAgICBtX3BOb2RlLT5KU09iamVjdCgpLT5TZXRDb250ZW50KHdzU2F2ZVRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Rm9ybWF0RGF0YVZhbHVlKHdzU2F2ZVRleHQpLCBiTm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTY3JpcHRNb2RpZnksIGJTeW5jRGF0YSk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChpU2VsID49IDApIHsKKyAgICAgIG1fcE5vZGUtPkpTT2JqZWN0KCktPlNldENvbnRlbnQoV2lkZVN0cmluZygpLCBXaWRlU3RyaW5nKCksIGJOb3RpZnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTY3JpcHRNb2RpZnksIGJTeW5jRGF0YSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ1hGQV9XaWRnZXRBY2M6OlNldFNlbGVjdGVkSXRlbXMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGlTZWxBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTY3JpcHRNb2RpZnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN5bmNEYXRhKSB7CisgIFdpZGVTdHJpbmcgd3NWYWx1ZTsKKyAgaW50MzJfdCBpU2l6ZSA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4oaVNlbEFycmF5KTsKKyAgaWYgKGlTaXplID49IDEpIHsKKyAgICBzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nPiB3c1NhdmVUZXh0QXJyYXkgPSBHZXRDaG9pY2VMaXN0SXRlbXModHJ1ZSk7CisgICAgV2lkZVN0cmluZyB3c0l0ZW1WYWx1ZTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgaSsrKSB7CisgICAgICB3c0l0ZW1WYWx1ZSA9IChpU2l6ZSA9PSAxKSA/IHdzU2F2ZVRleHRBcnJheVtpU2VsQXJyYXlbaV1dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHdzU2F2ZVRleHRBcnJheVtpU2VsQXJyYXlbaV1dICsgTCJcbiI7CisgICAgICB3c1ZhbHVlICs9IHdzSXRlbVZhbHVlOworICAgIH0KKyAgfQorICBXaWRlU3RyaW5nIHdzRm9ybWF0KHdzVmFsdWUpOworICBpZiAoIUlzQ2hvaWNlTGlzdE11bHRpU2VsZWN0KCkpCisgICAgd3NGb3JtYXQgPSBHZXRGb3JtYXREYXRhVmFsdWUod3NWYWx1ZSk7CisKKyAgbV9wTm9kZS0+SlNPYmplY3QoKS0+U2V0Q29udGVudCh3c1ZhbHVlLCB3c0Zvcm1hdCwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3luY0RhdGEpOworfQorCit2b2lkIENYRkFfV2lkZ2V0QWNjOjpDbGVhckFsbFNlbGVjdGlvbnMoKSB7CisgIENYRkFfTm9kZSogcEJpbmQgPSBtX3BOb2RlLT5HZXRCaW5kRGF0YSgpOworICBpZiAoIXBCaW5kIHx8ICFJc0Nob2ljZUxpc3RNdWx0aVNlbGVjdCgpKSB7CisgICAgbV9wTm9kZS0+U3luY1ZhbHVlKFdpZGVTdHJpbmcoKSwgZmFsc2UpOworICAgIHJldHVybjsKKyAgfQorCisgIHdoaWxlIChDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwQmluZC0+R2V0Rmlyc3RDaGlsZCgpKQorICAgIHBCaW5kLT5SZW1vdmVDaGlsZChwQ2hpbGROb2RlLCB0cnVlKTsKK30KKwordm9pZCBDWEZBX1dpZGdldEFjYzo6SW5zZXJ0SXRlbShjb25zdCBXaWRlU3RyaW5nJiB3c0xhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJOb3RpZnkpIHsKKyAgaW50MzJfdCBuSW5kZXggPSAtMTsKKyAgV2lkZVN0cmluZyB3c05ld1ZhbHVlKHdzVmFsdWUpOworICBpZiAod3NOZXdWYWx1ZS5Jc0VtcHR5KCkpCisgICAgd3NOZXdWYWx1ZSA9IHdzTGFiZWw7CisKKyAgc3RkOjp2ZWN0b3I8Q1hGQV9Ob2RlKj4gbGlzdGl0ZW1zOworICBmb3IgKENYRkFfTm9kZSogcEl0ZW0gPSBtX3BOb2RlLT5HZXRGaXJzdENoaWxkKCk7IHBJdGVtOworICAgICAgIHBJdGVtID0gcEl0ZW0tPkdldE5leHRTaWJsaW5nKCkpIHsKKyAgICBpZiAocEl0ZW0tPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6Okl0ZW1zKQorICAgICAgbGlzdGl0ZW1zLnB1c2hfYmFjayhwSXRlbSk7CisgIH0KKyAgaWYgKGxpc3RpdGVtcy5lbXB0eSgpKSB7CisgICAgQ1hGQV9Ob2RlKiBwSXRlbXMgPSBtX3BOb2RlLT5DcmVhdGVTYW1lUGFja2V0Tm9kZShYRkFfRWxlbWVudDo6SXRlbXMpOworICAgIG1fcE5vZGUtPkluc2VydENoaWxkKC0xLCBwSXRlbXMpOworICAgIEluc2VydExpc3RUZXh0SXRlbShwSXRlbXMsIHdzTGFiZWwsIG5JbmRleCk7CisgICAgQ1hGQV9Ob2RlKiBwU2F2ZUl0ZW1zID0gbV9wTm9kZS0+Q3JlYXRlU2FtZVBhY2tldE5vZGUoWEZBX0VsZW1lbnQ6Okl0ZW1zKTsKKyAgICBtX3BOb2RlLT5JbnNlcnRDaGlsZCgtMSwgcFNhdmVJdGVtcyk7CisgICAgcFNhdmVJdGVtcy0+SlNPYmplY3QoKS0+U2V0Qm9vbGVhbihYRkFfQXR0cmlidXRlOjpTYXZlLCB0cnVlLCBmYWxzZSk7CisgICAgSW5zZXJ0TGlzdFRleHRJdGVtKHBTYXZlSXRlbXMsIHdzTmV3VmFsdWUsIG5JbmRleCk7CisgIH0gZWxzZSBpZiAobGlzdGl0ZW1zLnNpemUoKSA+IDEpIHsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBsaXN0aXRlbXNbaV07CisgICAgICBib29sIGJIYXNTYXZlID0gcE5vZGUtPkpTT2JqZWN0KCktPkdldEJvb2xlYW4oWEZBX0F0dHJpYnV0ZTo6U2F2ZSk7CisgICAgICBpZiAoYkhhc1NhdmUpCisgICAgICAgIEluc2VydExpc3RUZXh0SXRlbShwTm9kZSwgd3NOZXdWYWx1ZSwgbkluZGV4KTsKKyAgICAgIGVsc2UKKyAgICAgICAgSW5zZXJ0TGlzdFRleHRJdGVtKHBOb2RlLCB3c0xhYmVsLCBuSW5kZXgpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBDWEZBX05vZGUqIHBOb2RlID0gbGlzdGl0ZW1zWzBdOworICAgIHBOb2RlLT5KU09iamVjdCgpLT5TZXRCb29sZWFuKFhGQV9BdHRyaWJ1dGU6OlNhdmUsIGZhbHNlLCBmYWxzZSk7CisgICAgcE5vZGUtPkpTT2JqZWN0KCktPlNldEVudW0oWEZBX0F0dHJpYnV0ZTo6UHJlc2VuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZUVudW06OlZpc2libGUsIGZhbHNlKTsKKyAgICBDWEZBX05vZGUqIHBTYXZlSXRlbXMgPSBtX3BOb2RlLT5DcmVhdGVTYW1lUGFja2V0Tm9kZShYRkFfRWxlbWVudDo6SXRlbXMpOworICAgIG1fcE5vZGUtPkluc2VydENoaWxkKC0xLCBwU2F2ZUl0ZW1zKTsKKyAgICBwU2F2ZUl0ZW1zLT5KU09iamVjdCgpLT5TZXRCb29sZWFuKFhGQV9BdHRyaWJ1dGU6OlNhdmUsIHRydWUsIGZhbHNlKTsKKyAgICBwU2F2ZUl0ZW1zLT5KU09iamVjdCgpLT5TZXRFbnVtKFhGQV9BdHRyaWJ1dGU6OlByZXNlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZUVudW06OkhpZGRlbiwgZmFsc2UpOworICAgIENYRkFfTm9kZSogcExpc3ROb2RlID0gcE5vZGUtPkdldEZpcnN0Q2hpbGQoKTsKKyAgICBpbnQzMl90IGkgPSAwOworICAgIHdoaWxlIChwTGlzdE5vZGUpIHsKKyAgICAgIEluc2VydExpc3RUZXh0SXRlbShwU2F2ZUl0ZW1zLCBwTGlzdE5vZGUtPkpTT2JqZWN0KCktPkdldENvbnRlbnQoZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGkpOworICAgICAgKytpOworCisgICAgICBwTGlzdE5vZGUgPSBwTGlzdE5vZGUtPkdldE5leHRTaWJsaW5nKCk7CisgICAgfQorICAgIEluc2VydExpc3RUZXh0SXRlbShwTm9kZSwgd3NMYWJlbCwgbkluZGV4KTsKKyAgICBJbnNlcnRMaXN0VGV4dEl0ZW0ocFNhdmVJdGVtcywgd3NOZXdWYWx1ZSwgbkluZGV4KTsKKyAgfQorICBpZiAoIWJOb3RpZnkpCisgICAgcmV0dXJuOworCisgIG1fcE5vZGUtPkdldERvY3VtZW50KCktPkdldE5vdGlmeSgpLT5PbldpZGdldExpc3RJdGVtQWRkZWQoCisgICAgICB0aGlzLCB3c0xhYmVsLmNfc3RyKCksIHdzVmFsdWUuY19zdHIoKSwgbkluZGV4KTsKK30KKwordm9pZCBDWEZBX1dpZGdldEFjYzo6R2V0SXRlbUxhYmVsKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIHdzTGFiZWwpIHsKKyAgaW50MzJfdCBpQ291bnQgPSAwOworICBzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPiBsaXN0aXRlbXM7CisgIENYRkFfTm9kZSogcEl0ZW1zID0gbV9wTm9kZS0+R2V0Rmlyc3RDaGlsZCgpOworICBmb3IgKDsgcEl0ZW1zOyBwSXRlbXMgPSBwSXRlbXMtPkdldE5leHRTaWJsaW5nKCkpIHsKKyAgICBpZiAocEl0ZW1zLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpJdGVtcykKKyAgICAgIGNvbnRpbnVlOworICAgIGlDb3VudCsrOworICAgIGxpc3RpdGVtcy5wdXNoX2JhY2socEl0ZW1zKTsKKyAgfQorCisgIGlmIChpQ291bnQgPD0gMSkgeworICAgIHdzTGFiZWwgPSB3c1ZhbHVlOworICAgIHJldHVybjsKKyAgfQorCisgIENYRkFfTm9kZSogcExhYmVsSXRlbXMgPSBsaXN0aXRlbXNbMF07CisgIGJvb2wgYlNhdmUgPSBwTGFiZWxJdGVtcy0+SlNPYmplY3QoKS0+R2V0Qm9vbGVhbihYRkFfQXR0cmlidXRlOjpTYXZlKTsKKyAgQ1hGQV9Ob2RlKiBwU2F2ZUl0ZW1zID0gbnVsbHB0cjsKKyAgaWYgKGJTYXZlKSB7CisgICAgcFNhdmVJdGVtcyA9IHBMYWJlbEl0ZW1zOworICAgIHBMYWJlbEl0ZW1zID0gbGlzdGl0ZW1zWzFdOworICB9IGVsc2UgeworICAgIHBTYXZlSXRlbXMgPSBsaXN0aXRlbXNbMV07CisgIH0KKyAgaUNvdW50ID0gMDsKKworICBpbnQzMl90IGlTZWFyY2ggPSAtMTsKKyAgZm9yIChDWEZBX05vZGUqIHBDaGlsZEl0ZW0gPSBwU2F2ZUl0ZW1zLT5HZXRGaXJzdENoaWxkKCk7IHBDaGlsZEl0ZW07CisgICAgICAgcENoaWxkSXRlbSA9IHBDaGlsZEl0ZW0tPkdldE5leHRTaWJsaW5nKCkpIHsKKyAgICBpZiAocENoaWxkSXRlbS0+SlNPYmplY3QoKS0+R2V0Q29udGVudChmYWxzZSkgPT0gd3NWYWx1ZSkgeworICAgICAgaVNlYXJjaCA9IGlDb3VudDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpQ291bnQrKzsKKyAgfQorICBpZiAoaVNlYXJjaCA8IDApCisgICAgcmV0dXJuOworCisgIENYRkFfTm9kZSogcFRleHQgPQorICAgICAgcExhYmVsSXRlbXMtPkdldENoaWxkPENYRkFfTm9kZT4oaVNlYXJjaCwgWEZBX0VsZW1lbnQ6OlVua25vd24sIGZhbHNlKTsKKyAgaWYgKHBUZXh0KQorICAgIHdzTGFiZWwgPSBwVGV4dC0+SlNPYmplY3QoKS0+R2V0Q29udGVudChmYWxzZSk7Cit9CisKK1dpZGVTdHJpbmcgQ1hGQV9XaWRnZXRBY2M6OkdldEl0ZW1WYWx1ZShjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NMYWJlbCkgeworICBpbnQzMl90IGlDb3VudCA9IDA7CisgIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+IGxpc3RpdGVtczsKKyAgZm9yIChDWEZBX05vZGUqIHBJdGVtcyA9IG1fcE5vZGUtPkdldEZpcnN0Q2hpbGQoKTsgcEl0ZW1zOworICAgICAgIHBJdGVtcyA9IHBJdGVtcy0+R2V0TmV4dFNpYmxpbmcoKSkgeworICAgIGlmIChwSXRlbXMtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6Okl0ZW1zKQorICAgICAgY29udGludWU7CisgICAgaUNvdW50Kys7CisgICAgbGlzdGl0ZW1zLnB1c2hfYmFjayhwSXRlbXMpOworICB9CisgIGlmIChpQ291bnQgPD0gMSkKKyAgICByZXR1cm4gV2lkZVN0cmluZyh3c0xhYmVsKTsKKworICBDWEZBX05vZGUqIHBMYWJlbEl0ZW1zID0gbGlzdGl0ZW1zWzBdOworICBib29sIGJTYXZlID0gcExhYmVsSXRlbXMtPkpTT2JqZWN0KCktPkdldEJvb2xlYW4oWEZBX0F0dHJpYnV0ZTo6U2F2ZSk7CisgIENYRkFfTm9kZSogcFNhdmVJdGVtcyA9IG51bGxwdHI7CisgIGlmIChiU2F2ZSkgeworICAgIHBTYXZlSXRlbXMgPSBwTGFiZWxJdGVtczsKKyAgICBwTGFiZWxJdGVtcyA9IGxpc3RpdGVtc1sxXTsKKyAgfSBlbHNlIHsKKyAgICBwU2F2ZUl0ZW1zID0gbGlzdGl0ZW1zWzFdOworICB9CisgIGlDb3VudCA9IDA7CisKKyAgaW50MzJfdCBpU2VhcmNoID0gLTE7CisgIFdpZGVTdHJpbmcgd3NDb250ZW50OworICBDWEZBX05vZGUqIHBDaGlsZEl0ZW0gPSBwTGFiZWxJdGVtcy0+R2V0Rmlyc3RDaGlsZCgpOworICBmb3IgKDsgcENoaWxkSXRlbTsgcENoaWxkSXRlbSA9IHBDaGlsZEl0ZW0tPkdldE5leHRTaWJsaW5nKCkpIHsKKyAgICBpZiAocENoaWxkSXRlbS0+SlNPYmplY3QoKS0+R2V0Q29udGVudChmYWxzZSkgPT0gd3NMYWJlbCkgeworICAgICAgaVNlYXJjaCA9IGlDb3VudDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBpQ291bnQrKzsKKyAgfQorICBpZiAoaVNlYXJjaCA8IDApCisgICAgcmV0dXJuIEwiIjsKKworICBDWEZBX05vZGUqIHBUZXh0ID0KKyAgICAgIHBTYXZlSXRlbXMtPkdldENoaWxkPENYRkFfTm9kZT4oaVNlYXJjaCwgWEZBX0VsZW1lbnQ6OlVua25vd24sIGZhbHNlKTsKKyAgcmV0dXJuIHBUZXh0ID8gcFRleHQtPkpTT2JqZWN0KCktPkdldENvbnRlbnQoZmFsc2UpIDogTCIiOworfQorCitib29sIENYRkFfV2lkZ2V0QWNjOjpEZWxldGVJdGVtKGludDMyX3QgbkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJOb3RpZnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNjcmlwdE1vZGlmeSkgeworICBib29sIGJTZXRWYWx1ZSA9IGZhbHNlOworICBDWEZBX05vZGUqIHBJdGVtcyA9IG1fcE5vZGUtPkdldEZpcnN0Q2hpbGQoKTsKKyAgZm9yICg7IHBJdGVtczsgcEl0ZW1zID0gcEl0ZW1zLT5HZXROZXh0U2libGluZygpKSB7CisgICAgaWYgKHBJdGVtcy0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6SXRlbXMpCisgICAgICBjb250aW51ZTsKKworICAgIGlmIChuSW5kZXggPCAwKSB7CisgICAgICB3aGlsZSAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHBJdGVtcy0+R2V0Rmlyc3RDaGlsZCgpKSB7CisgICAgICAgIHBJdGVtcy0+UmVtb3ZlQ2hpbGQocE5vZGUsIHRydWUpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAoIWJTZXRWYWx1ZSAmJiBwSXRlbXMtPkpTT2JqZWN0KCktPkdldEJvb2xlYW4oWEZBX0F0dHJpYnV0ZTo6U2F2ZSkpIHsKKyAgICAgICAgU2V0SXRlbVN0YXRlKG5JbmRleCwgZmFsc2UsIHRydWUsIGJTY3JpcHRNb2RpZnksIHRydWUpOworICAgICAgICBiU2V0VmFsdWUgPSB0cnVlOworICAgICAgfQorICAgICAgaW50MzJfdCBpID0gMDsKKyAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBwSXRlbXMtPkdldEZpcnN0Q2hpbGQoKTsKKyAgICAgIHdoaWxlIChwTm9kZSkgeworICAgICAgICBpZiAoaSA9PSBuSW5kZXgpIHsKKyAgICAgICAgICBwSXRlbXMtPlJlbW92ZUNoaWxkKHBOb2RlLCB0cnVlKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpKys7CisgICAgICAgIHBOb2RlID0gcE5vZGUtPkdldE5leHRTaWJsaW5nKCk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmIChiTm90aWZ5KQorICAgIG1fcE5vZGUtPkdldERvY3VtZW50KCktPkdldE5vdGlmeSgpLT5PbldpZGdldExpc3RJdGVtUmVtb3ZlZCh0aGlzLCBuSW5kZXgpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDWEZBX1dpZGdldEFjYzo6SXNIb3Jpem9udGFsU2Nyb2xsUG9saWN5T2ZmKCkgeworICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOworICBpZiAocFVJQ2hpbGQpIHsKKyAgICByZXR1cm4gcFVJQ2hpbGQtPkpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6SFNjcm9sbFBvbGljeSkgPT0KKyAgICAgICAgICAgWEZBX0F0dHJpYnV0ZUVudW06Ok9mZjsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQ1hGQV9XaWRnZXRBY2M6OklzVmVydGljYWxTY3JvbGxQb2xpY3lPZmYoKSB7CisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7CisgIGlmIChwVUlDaGlsZCkgeworICAgIHJldHVybiBwVUlDaGlsZC0+SlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpWU2Nyb2xsUG9saWN5KSA9PQorICAgICAgICAgICBYRkFfQXR0cmlidXRlRW51bTo6T2ZmOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworT3B0aW9uYWw8aW50MzJfdD4gQ1hGQV9XaWRnZXRBY2M6OkdldE51bWJlck9mQ2VsbHMoKSB7CisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7CisgIGlmICghcFVJQ2hpbGQpCisgICAgcmV0dXJuIHt9OworICBpZiAoQ1hGQV9Db21iKiBwTm9kZSA9CisgICAgICAgICAgcFVJQ2hpbGQtPkdldENoaWxkPENYRkFfQ29tYj4oMCwgWEZBX0VsZW1lbnQ6OkNvbWIsIGZhbHNlKSkKKyAgICByZXR1cm4ge3BOb2RlLT5KU09iamVjdCgpLT5HZXRJbnRlZ2VyKFhGQV9BdHRyaWJ1dGU6Ok51bWJlck9mQ2VsbHMpfTsKKyAgcmV0dXJuIHt9OworfQorCitXaWRlU3RyaW5nIENYRkFfV2lkZ2V0QWNjOjpHZXRQYXNzd29yZENoYXIoKSB7CisgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7CisgIHJldHVybiBwVUlDaGlsZCA/IHBVSUNoaWxkLT5KU09iamVjdCgpLT5HZXRDRGF0YShYRkFfQXR0cmlidXRlOjpQYXNzd29yZENoYXIpCisgICAgICAgICAgICAgICAgICA6IEwiKiI7Cit9CisKK2Jvb2wgQ1hGQV9XaWRnZXRBY2M6OklzTXVsdGlMaW5lKCkgeworICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOworICByZXR1cm4gcFVJQ2hpbGQgJiYgcFVJQ2hpbGQtPkpTT2JqZWN0KCktPkdldEJvb2xlYW4oWEZBX0F0dHJpYnV0ZTo6TXVsdGlMaW5lKTsKK30KKworc3RkOjpwYWlyPFhGQV9FbGVtZW50LCBpbnQzMl90PiBDWEZBX1dpZGdldEFjYzo6R2V0TWF4Q2hhcnMoKSB7CisgIGlmIChDWEZBX1ZhbHVlKiBwTm9kZSA9CisgICAgICAgICAgbV9wTm9kZS0+R2V0Q2hpbGQ8Q1hGQV9WYWx1ZT4oMCwgWEZBX0VsZW1lbnQ6OlZhbHVlLCBmYWxzZSkpIHsKKyAgICBpZiAoQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBwTm9kZS0+R2V0Rmlyc3RDaGlsZCgpKSB7CisgICAgICBzd2l0Y2ggKHBDaGlsZC0+R2V0RWxlbWVudFR5cGUoKSkgeworICAgICAgICBjYXNlIFhGQV9FbGVtZW50OjpUZXh0OgorICAgICAgICAgIHJldHVybiB7WEZBX0VsZW1lbnQ6OlRleHQsCisgICAgICAgICAgICAgICAgICBwQ2hpbGQtPkpTT2JqZWN0KCktPkdldEludGVnZXIoWEZBX0F0dHJpYnV0ZTo6TWF4Q2hhcnMpfTsKKyAgICAgICAgY2FzZSBYRkFfRWxlbWVudDo6RXhEYXRhOiB7CisgICAgICAgICAgaW50MzJfdCBpTWF4ID0KKyAgICAgICAgICAgICAgcENoaWxkLT5KU09iamVjdCgpLT5HZXRJbnRlZ2VyKFhGQV9BdHRyaWJ1dGU6Ok1heExlbmd0aCk7CisgICAgICAgICAgcmV0dXJuIHtYRkFfRWxlbWVudDo6RXhEYXRhLCBpTWF4IDwgMCA/IDAgOiBpTWF4fTsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4ge1hGQV9FbGVtZW50OjpVbmtub3duLCAwfTsKK30KKworaW50MzJfdCBDWEZBX1dpZGdldEFjYzo6R2V0RnJhY0RpZ2l0cygpIHsKKyAgQ1hGQV9WYWx1ZSogcE5vZGUgPQorICAgICAgbV9wTm9kZS0+R2V0Q2hpbGQ8Q1hGQV9WYWx1ZT4oMCwgWEZBX0VsZW1lbnQ6OlZhbHVlLCBmYWxzZSk7CisgIGlmICghcE5vZGUpCisgICAgcmV0dXJuIC0xOworCisgIENYRkFfRGVjaW1hbCogcENoaWxkID0KKyAgICAgIHBOb2RlLT5HZXRDaGlsZDxDWEZBX0RlY2ltYWw+KDAsIFhGQV9FbGVtZW50OjpEZWNpbWFsLCBmYWxzZSk7CisgIGlmICghcENoaWxkKQorICAgIHJldHVybiAtMTsKKworICByZXR1cm4gcENoaWxkLT5KU09iamVjdCgpCisgICAgICAtPlRyeUludGVnZXIoWEZBX0F0dHJpYnV0ZTo6RnJhY0RpZ2l0cywgdHJ1ZSkKKyAgICAgIC52YWx1ZV9vcigtMSk7Cit9CisKK2ludDMyX3QgQ1hGQV9XaWRnZXRBY2M6OkdldExlYWREaWdpdHMoKSB7CisgIENYRkFfVmFsdWUqIHBOb2RlID0KKyAgICAgIG1fcE5vZGUtPkdldENoaWxkPENYRkFfVmFsdWU+KDAsIFhGQV9FbGVtZW50OjpWYWx1ZSwgZmFsc2UpOworICBpZiAoIXBOb2RlKQorICAgIHJldHVybiAtMTsKKworICBDWEZBX0RlY2ltYWwqIHBDaGlsZCA9CisgICAgICBwTm9kZS0+R2V0Q2hpbGQ8Q1hGQV9EZWNpbWFsPigwLCBYRkFfRWxlbWVudDo6RGVjaW1hbCwgZmFsc2UpOworICBpZiAoIXBDaGlsZCkKKyAgICByZXR1cm4gLTE7CisKKyAgcmV0dXJuIHBDaGlsZC0+SlNPYmplY3QoKQorICAgICAgLT5UcnlJbnRlZ2VyKFhGQV9BdHRyaWJ1dGU6OkxlYWREaWdpdHMsIHRydWUpCisgICAgICAudmFsdWVfb3IoLTEpOworfQorCitib29sIENYRkFfV2lkZ2V0QWNjOjpTZXRWYWx1ZShYRkFfVkFMVUVQSUNUVVJFIGVWYWx1ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c1ZhbHVlKSB7CisgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkgeworICAgIGlmIChtX3BOb2RlKQorICAgICAgbV9wTm9kZS0+U3luY1ZhbHVlKHdzVmFsdWUsIHRydWUpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgbV9iUHJlTnVsbCA9IG1fYklzTnVsbDsKKyAgbV9iSXNOdWxsID0gZmFsc2U7CisgIFdpZGVTdHJpbmcgd3NOZXdUZXh0KHdzVmFsdWUpOworICBXaWRlU3RyaW5nIHdzUGljdHVyZSA9IEdldFBpY3R1cmVDb250ZW50KGVWYWx1ZVR5cGUpOworICBib29sIGJWYWxpZGF0ZSA9IHRydWU7CisgIGJvb2wgYlN5bmNEYXRhID0gZmFsc2U7CisgIENYRkFfTm9kZSogcE5vZGUgPSBHZXRVSUNoaWxkKCk7CisgIGlmICghcE5vZGUpCisgICAgcmV0dXJuIHRydWU7CisKKyAgWEZBX0VsZW1lbnQgZVR5cGUgPSBwTm9kZS0+R2V0RWxlbWVudFR5cGUoKTsKKyAgaWYgKCF3c1BpY3R1cmUuSXNFbXB0eSgpKSB7CisgICAgQ1hGQV9Mb2NhbGVNZ3IqIHBMb2NhbE1nciA9IG1fcE5vZGUtPkdldERvY3VtZW50KCktPkdldExvY2FsTWdyKCk7CisgICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldExvY2FsZSgpOworICAgIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUgPSBYRkFfR2V0TG9jYWxlVmFsdWUoR2V0Tm9kZSgpKTsKKyAgICBiVmFsaWRhdGUgPQorICAgICAgICB3aWRnZXRWYWx1ZS5WYWxpZGF0ZVZhbHVlKHdzVmFsdWUsIHdzUGljdHVyZSwgcExvY2FsZSwgJndzUGljdHVyZSk7CisgICAgaWYgKGJWYWxpZGF0ZSkgeworICAgICAgd2lkZ2V0VmFsdWUgPSBDWEZBX0xvY2FsZVZhbHVlKHdpZGdldFZhbHVlLkdldFR5cGUoKSwgd3NOZXdUZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzUGljdHVyZSwgcExvY2FsZSwgcExvY2FsTWdyKTsKKyAgICAgIHdzTmV3VGV4dCA9IHdpZGdldFZhbHVlLkdldFZhbHVlKCk7CisgICAgICBpZiAoZVR5cGUgPT0gWEZBX0VsZW1lbnQ6Ok51bWVyaWNFZGl0KQorICAgICAgICB3c05ld1RleHQgPSBOdW1lcmljTGltaXQod3NOZXdUZXh0LCBHZXRMZWFkRGlnaXRzKCksIEdldEZyYWNEaWdpdHMoKSk7CisKKyAgICAgIGJTeW5jRGF0YSA9IHRydWU7CisgICAgfQorICB9IGVsc2UgeworICAgIGlmIChlVHlwZSA9PSBYRkFfRWxlbWVudDo6TnVtZXJpY0VkaXQpIHsKKyAgICAgIGlmICh3c05ld1RleHQgIT0gTCIwIikKKyAgICAgICAgd3NOZXdUZXh0ID0gTnVtZXJpY0xpbWl0KHdzTmV3VGV4dCwgR2V0TGVhZERpZ2l0cygpLCBHZXRGcmFjRGlnaXRzKCkpOworCisgICAgICBiU3luY0RhdGEgPSB0cnVlOworICAgIH0KKyAgfQorICBpZiAoZVR5cGUgIT0gWEZBX0VsZW1lbnQ6Ok51bWVyaWNFZGl0IHx8IGJTeW5jRGF0YSkgeworICAgIGlmIChtX3BOb2RlKQorICAgICAgbV9wTm9kZS0+U3luY1ZhbHVlKHdzTmV3VGV4dCwgdHJ1ZSk7CisgIH0KKworICByZXR1cm4gYlZhbGlkYXRlOworfQorCitXaWRlU3RyaW5nIENYRkFfV2lkZ2V0QWNjOjpHZXRQaWN0dXJlQ29udGVudChYRkFfVkFMVUVQSUNUVVJFIGVQaWN0dXJlKSB7CisgIGlmIChlUGljdHVyZSA9PSBYRkFfVkFMVUVQSUNUVVJFX1JhdykKKyAgICByZXR1cm4gTCIiOworCisgIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUgPSBYRkFfR2V0TG9jYWxlVmFsdWUoR2V0Tm9kZSgpKTsKKyAgc3dpdGNoIChlUGljdHVyZSkgeworICAgIGNhc2UgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5OiB7CisgICAgICBpZiAoQ1hGQV9Gb3JtYXQqIHBGb3JtYXQgPQorICAgICAgICAgICAgICBtX3BOb2RlLT5HZXRDaGlsZDxDWEZBX0Zvcm1hdD4oMCwgWEZBX0VsZW1lbnQ6OkZvcm1hdCwgZmFsc2UpKSB7CisgICAgICAgIGlmIChDWEZBX1BpY3R1cmUqIHBQaWN0dXJlID0gcEZvcm1hdC0+R2V0Q2hpbGQ8Q1hGQV9QaWN0dXJlPigKKyAgICAgICAgICAgICAgICAwLCBYRkFfRWxlbWVudDo6UGljdHVyZSwgZmFsc2UpKSB7CisgICAgICAgICAgT3B0aW9uYWw8V2lkZVN0cmluZz4gcGljdHVyZSA9CisgICAgICAgICAgICAgIHBQaWN0dXJlLT5KU09iamVjdCgpLT5UcnlDb250ZW50KGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICBpZiAocGljdHVyZSkKKyAgICAgICAgICAgIHJldHVybiAqcGljdHVyZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TG9jYWxlKCk7CisgICAgICBpZiAoIXBMb2NhbGUpCisgICAgICAgIHJldHVybiBMIiI7CisKKyAgICAgIHVpbnQzMl90IGR3VHlwZSA9IHdpZGdldFZhbHVlLkdldFR5cGUoKTsKKyAgICAgIHN3aXRjaCAoZHdUeXBlKSB7CisgICAgICAgIGNhc2UgWEZBX1ZUX0RBVEU6CisgICAgICAgICAgcmV0dXJuIHBMb2NhbGUtPkdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtKTsKKyAgICAgICAgY2FzZSBYRkFfVlRfVElNRToKKyAgICAgICAgICByZXR1cm4gcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW0pOworICAgICAgICBjYXNlIFhGQV9WVF9EQVRFVElNRToKKyAgICAgICAgICByZXR1cm4gcExvY2FsZS0+R2V0RGF0ZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW0pICsKKyAgICAgICAgICAgICAgICAgTCJUIiArCisgICAgICAgICAgICAgICAgIHBMb2NhbGUtPkdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtKTsKKyAgICAgICAgY2FzZSBYRkFfVlRfREVDSU1BTDoKKyAgICAgICAgY2FzZSBYRkFfVlRfRkxPQVQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIEwiIjsKKyAgICAgIH0KKyAgICB9CisgICAgY2FzZSBYRkFfVkFMVUVQSUNUVVJFX0VkaXQ6IHsKKyAgICAgIENYRkFfVWkqIHBVSSA9IG1fcE5vZGUtPkdldENoaWxkPENYRkFfVWk+KDAsIFhGQV9FbGVtZW50OjpVaSwgZmFsc2UpOworICAgICAgaWYgKHBVSSkgeworICAgICAgICBpZiAoQ1hGQV9QaWN0dXJlKiBwUGljdHVyZSA9CisgICAgICAgICAgICAgICAgcFVJLT5HZXRDaGlsZDxDWEZBX1BpY3R1cmU+KDAsIFhGQV9FbGVtZW50OjpQaWN0dXJlLCBmYWxzZSkpIHsKKyAgICAgICAgICBPcHRpb25hbDxXaWRlU3RyaW5nPiBwaWN0dXJlID0KKyAgICAgICAgICAgICAgcFBpY3R1cmUtPkpTT2JqZWN0KCktPlRyeUNvbnRlbnQoZmFsc2UsIHRydWUpOworICAgICAgICAgIGlmIChwaWN0dXJlKQorICAgICAgICAgICAgcmV0dXJuICpwaWN0dXJlOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXRMb2NhbGUoKTsKKyAgICAgIGlmICghcExvY2FsZSkKKyAgICAgICAgcmV0dXJuIEwiIjsKKworICAgICAgdWludDMyX3QgZHdUeXBlID0gd2lkZ2V0VmFsdWUuR2V0VHlwZSgpOworICAgICAgc3dpdGNoIChkd1R5cGUpIHsKKyAgICAgICAgY2FzZSBYRkFfVlRfREFURToKKyAgICAgICAgICByZXR1cm4gcExvY2FsZS0+R2V0RGF0ZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9TaG9ydCk7CisgICAgICAgIGNhc2UgWEZBX1ZUX1RJTUU6CisgICAgICAgICAgcmV0dXJuIHBMb2NhbGUtPkdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQpOworICAgICAgICBjYXNlIFhGQV9WVF9EQVRFVElNRToKKyAgICAgICAgICByZXR1cm4gcExvY2FsZS0+R2V0RGF0ZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9TaG9ydCkgKworICAgICAgICAgICAgICAgICBMIlQiICsKKyAgICAgICAgICAgICAgICAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9TaG9ydCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIEwiIjsKKyAgICAgIH0KKyAgICB9CisgICAgY2FzZSBYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kOiB7CisgICAgICBDWEZBX0JpbmQqIGJpbmQgPSBtX3BOb2RlLT5HZXRCaW5kSWZFeGlzdHMoKTsKKyAgICAgIGlmIChiaW5kKQorICAgICAgICByZXR1cm4gYmluZC0+R2V0UGljdHVyZSgpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gTCIiOworfQorCitJRlhfTG9jYWxlKiBDWEZBX1dpZGdldEFjYzo6R2V0TG9jYWxlKCkgeworICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkdldExvY2FsZSgpIDogbnVsbHB0cjsKK30KKworV2lkZVN0cmluZyBDWEZBX1dpZGdldEFjYzo6R2V0VmFsdWUoWEZBX1ZBTFVFUElDVFVSRSBlVmFsdWVUeXBlKSB7CisgIFdpZGVTdHJpbmcgd3NWYWx1ZSA9IG1fcE5vZGUtPkpTT2JqZWN0KCktPkdldENvbnRlbnQoZmFsc2UpOworCisgIGlmIChlVmFsdWVUeXBlID09IFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSkKKyAgICBHZXRJdGVtTGFiZWwod3NWYWx1ZS5Bc1N0cmluZ1ZpZXcoKSwgd3NWYWx1ZSk7CisKKyAgV2lkZVN0cmluZyB3c1BpY3R1cmUgPSBHZXRQaWN0dXJlQ29udGVudChlVmFsdWVUeXBlKTsKKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldFVJQ2hpbGQoKTsKKyAgaWYgKCFwTm9kZSkKKyAgICByZXR1cm4gd3NWYWx1ZTsKKworICBzd2l0Y2ggKEdldFVJQ2hpbGQoKS0+R2V0RWxlbWVudFR5cGUoKSkgeworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNob2ljZUxpc3Q6IHsKKyAgICAgIGlmIChlVmFsdWVUeXBlID09IFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSkgeworICAgICAgICBpbnQzMl90IGlTZWxJdGVtSW5kZXggPSBHZXRTZWxlY3RlZEl0ZW0oMCk7CisgICAgICAgIGlmIChpU2VsSXRlbUluZGV4ID49IDApIHsKKyAgICAgICAgICB3c1ZhbHVlID0gR2V0Q2hvaWNlTGlzdEl0ZW0oaVNlbEl0ZW1JbmRleCwgZmFsc2UpLnZhbHVlX29yKEwiIik7CisgICAgICAgICAgd3NQaWN0dXJlLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok51bWVyaWNFZGl0OgorICAgICAgaWYgKGVWYWx1ZVR5cGUgIT0gWEZBX1ZBTFVFUElDVFVSRV9SYXcgJiYgd3NQaWN0dXJlLklzRW1wdHkoKSkgeworICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TG9jYWxlKCk7CisgICAgICAgIGlmIChlVmFsdWVUeXBlID09IFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSAmJiBwTG9jYWxlKQorICAgICAgICAgIHdzVmFsdWUgPSBGb3JtYXROdW1TdHIoTm9ybWFsaXplTnVtU3RyKHdzVmFsdWUpLCBwTG9jYWxlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICBpZiAod3NQaWN0dXJlLklzRW1wdHkoKSkKKyAgICByZXR1cm4gd3NWYWx1ZTsKKworICBpZiAoSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldExvY2FsZSgpKSB7CisgICAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZSA9IFhGQV9HZXRMb2NhbGVWYWx1ZShHZXROb2RlKCkpOworICAgIENYRkFfTG9jYWxlTWdyKiBwTG9jYWxNZ3IgPSBtX3BOb2RlLT5HZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpOworICAgIHN3aXRjaCAod2lkZ2V0VmFsdWUuR2V0VHlwZSgpKSB7CisgICAgICBjYXNlIFhGQV9WVF9EQVRFOiB7CisgICAgICAgIFdpZGVTdHJpbmcgd3NEYXRlLCB3c1RpbWU7CisgICAgICAgIGlmIChTcGxpdERhdGVUaW1lKHdzVmFsdWUsIHdzRGF0ZSwgd3NUaW1lKSkgeworICAgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgZGF0ZShYRkFfVlRfREFURSwgd3NEYXRlLCBwTG9jYWxNZ3IpOworICAgICAgICAgIGlmIChkYXRlLkZvcm1hdFBhdHRlcm5zKHdzVmFsdWUsIHdzUGljdHVyZSwgcExvY2FsZSwgZVZhbHVlVHlwZSkpCisgICAgICAgICAgICByZXR1cm4gd3NWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgWEZBX1ZUX1RJTUU6IHsKKyAgICAgICAgV2lkZVN0cmluZyB3c0RhdGUsIHdzVGltZTsKKyAgICAgICAgaWYgKFNwbGl0RGF0ZVRpbWUod3NWYWx1ZSwgd3NEYXRlLCB3c1RpbWUpKSB7CisgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSB0aW1lKFhGQV9WVF9USU1FLCB3c1RpbWUsIHBMb2NhbE1ncik7CisgICAgICAgICAgaWYgKHRpbWUuRm9ybWF0UGF0dGVybnMod3NWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLCBlVmFsdWVUeXBlKSkKKyAgICAgICAgICAgIHJldHVybiB3c1ZhbHVlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHdpZGdldFZhbHVlLkZvcm1hdFBhdHRlcm5zKHdzVmFsdWUsIHdzUGljdHVyZSwgcExvY2FsZSwgZVZhbHVlVHlwZSk7CisgIH0KKyAgcmV0dXJuIHdzVmFsdWU7Cit9CisKK1dpZGVTdHJpbmcgQ1hGQV9XaWRnZXRBY2M6OkdldE5vcm1hbGl6ZURhdGFWYWx1ZShjb25zdCBXaWRlU3RyaW5nJiB3c1ZhbHVlKSB7CisgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkKKyAgICByZXR1cm4gTCIiOworCisgIFdpZGVTdHJpbmcgd3NQaWN0dXJlID0gR2V0UGljdHVyZUNvbnRlbnQoWEZBX1ZBTFVFUElDVFVSRV9EYXRhQmluZCk7CisgIGlmICh3c1BpY3R1cmUuSXNFbXB0eSgpKQorICAgIHJldHVybiB3c1ZhbHVlOworCisgIEFTU0VSVChHZXROb2RlKCkpOworICBDWEZBX0xvY2FsZU1nciogcExvY2FsTWdyID0gR2V0Tm9kZSgpLT5HZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpOworICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TG9jYWxlKCk7CisgIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUgPSBYRkFfR2V0TG9jYWxlVmFsdWUoR2V0Tm9kZSgpKTsKKyAgaWYgKHdpZGdldFZhbHVlLlZhbGlkYXRlVmFsdWUod3NWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLCAmd3NQaWN0dXJlKSkgeworICAgIHdpZGdldFZhbHVlID0gQ1hGQV9Mb2NhbGVWYWx1ZSh3aWRnZXRWYWx1ZS5HZXRUeXBlKCksIHdzVmFsdWUsIHdzUGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZSwgcExvY2FsTWdyKTsKKyAgICByZXR1cm4gd2lkZ2V0VmFsdWUuR2V0VmFsdWUoKTsKKyAgfQorICByZXR1cm4gd3NWYWx1ZTsKK30KKworV2lkZVN0cmluZyBDWEZBX1dpZGdldEFjYzo6R2V0Rm9ybWF0RGF0YVZhbHVlKGNvbnN0IFdpZGVTdHJpbmcmIHdzVmFsdWUpIHsKKyAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKQorICAgIHJldHVybiBMIiI7CisKKyAgV2lkZVN0cmluZyB3c1BpY3R1cmUgPSBHZXRQaWN0dXJlQ29udGVudChYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kKTsKKyAgaWYgKHdzUGljdHVyZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIHdzVmFsdWU7CisKKyAgV2lkZVN0cmluZyB3c0Zvcm1hdHRlZFZhbHVlID0gd3NWYWx1ZTsKKyAgaWYgKElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXRMb2NhbGUoKSkgeworICAgIEFTU0VSVChHZXROb2RlKCkpOworICAgIENYRkFfVmFsdWUqIHBOb2RlVmFsdWUgPQorICAgICAgICBHZXROb2RlKCktPkdldENoaWxkPENYRkFfVmFsdWU+KDAsIFhGQV9FbGVtZW50OjpWYWx1ZSwgZmFsc2UpOworICAgIGlmICghcE5vZGVWYWx1ZSkKKyAgICAgIHJldHVybiB3c1ZhbHVlOworCisgICAgQ1hGQV9Ob2RlKiBwVmFsdWVDaGlsZCA9IHBOb2RlVmFsdWUtPkdldEZpcnN0Q2hpbGQoKTsKKyAgICBpZiAoIXBWYWx1ZUNoaWxkKQorICAgICAgcmV0dXJuIHdzVmFsdWU7CisKKyAgICBpbnQzMl90IGlWVFR5cGUgPSBYRkFfVlRfTlVMTDsKKyAgICBzd2l0Y2ggKHBWYWx1ZUNoaWxkLT5HZXRFbGVtZW50VHlwZSgpKSB7CisgICAgICBjYXNlIFhGQV9FbGVtZW50OjpEZWNpbWFsOgorICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX0RFQ0lNQUw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBYRkFfRWxlbWVudDo6RmxvYXQ6CisgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfRkxPQVQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBYRkFfRWxlbWVudDo6RGF0ZToKKyAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9EQVRFOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRpbWU6CisgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfVElNRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFhGQV9FbGVtZW50OjpEYXRlVGltZToKKyAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9EQVRFVElNRTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFhGQV9FbGVtZW50OjpCb29sZWFuOgorICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX0JPT0xFQU47CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBYRkFfRWxlbWVudDo6SW50ZWdlcjoKKyAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9JTlRFR0VSOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRleHQ6CisgICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfVEVYVDsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX05VTEw7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBDWEZBX0xvY2FsZU1nciogcExvY2FsTWdyID0gR2V0Tm9kZSgpLT5HZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpOworICAgIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUoaVZUVHlwZSwgd3NWYWx1ZSwgcExvY2FsTWdyKTsKKyAgICBzd2l0Y2ggKHdpZGdldFZhbHVlLkdldFR5cGUoKSkgeworICAgICAgY2FzZSBYRkFfVlRfREFURTogeworICAgICAgICBXaWRlU3RyaW5nIHdzRGF0ZSwgd3NUaW1lOworICAgICAgICBpZiAoU3BsaXREYXRlVGltZSh3c1ZhbHVlLCB3c0RhdGUsIHdzVGltZSkpIHsKKyAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIGRhdGUoWEZBX1ZUX0RBVEUsIHdzRGF0ZSwgcExvY2FsTWdyKTsKKyAgICAgICAgICBpZiAoZGF0ZS5Gb3JtYXRQYXR0ZXJucyh3c0Zvcm1hdHRlZFZhbHVlLCB3c1BpY3R1cmUsIHBMb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRV9EYXRhQmluZCkpIHsKKyAgICAgICAgICAgIHJldHVybiB3c0Zvcm1hdHRlZFZhbHVlOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgWEZBX1ZUX1RJTUU6IHsKKyAgICAgICAgV2lkZVN0cmluZyB3c0RhdGUsIHdzVGltZTsKKyAgICAgICAgaWYgKFNwbGl0RGF0ZVRpbWUod3NWYWx1ZSwgd3NEYXRlLCB3c1RpbWUpKSB7CisgICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSB0aW1lKFhGQV9WVF9USU1FLCB3c1RpbWUsIHBMb2NhbE1ncik7CisgICAgICAgICAgaWYgKHRpbWUuRm9ybWF0UGF0dGVybnMod3NGb3JtYXR0ZWRWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQpKSB7CisgICAgICAgICAgICByZXR1cm4gd3NGb3JtYXR0ZWRWYWx1ZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgd2lkZ2V0VmFsdWUuRm9ybWF0UGF0dGVybnMod3NGb3JtYXR0ZWRWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQpOworICB9CisgIHJldHVybiB3c0Zvcm1hdHRlZFZhbHVlOworfQorCitXaWRlU3RyaW5nIENYRkFfV2lkZ2V0QWNjOjpOb3JtYWxpemVOdW1TdHIoY29uc3QgV2lkZVN0cmluZyYgd3NWYWx1ZSkgeworICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIEwiIjsKKworICBXaWRlU3RyaW5nIHdzT3V0cHV0ID0gd3NWYWx1ZTsKKyAgd3NPdXRwdXQuVHJpbUxlZnQoJzAnKTsKKworICBpZiAoIXdzT3V0cHV0LklzRW1wdHkoKSAmJiB3c091dHB1dC5Db250YWlucygnLicpICYmIEdldEZyYWNEaWdpdHMoKSAhPSAtMSkgeworICAgIHdzT3V0cHV0LlRyaW1SaWdodChMIjAiKTsKKyAgICB3c091dHB1dC5UcmltUmlnaHQoTCIuIik7CisgIH0KKyAgaWYgKHdzT3V0cHV0LklzRW1wdHkoKSB8fCB3c091dHB1dFswXSA9PSAnLicpCisgICAgd3NPdXRwdXQuSW5zZXJ0QXRGcm9udCgnMCcpOworCisgIHJldHVybiB3c091dHB1dDsKK30KKworV2lkZVN0cmluZyBDWEZBX1dpZGdldEFjYzo6Rm9ybWF0TnVtU3RyKGNvbnN0IFdpZGVTdHJpbmcmIHdzVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSkgeworICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIEwiIjsKKworICBXaWRlU3RyaW5nIHdzU3JjTnVtID0gd3NWYWx1ZTsKKyAgV2lkZVN0cmluZyB3c0dyb3VwU3ltYm9sID0KKyAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9Hcm91cGluZyk7CisgIGJvb2wgYk5lZyA9IGZhbHNlOworICBpZiAod3NTcmNOdW1bMF0gPT0gJy0nKSB7CisgICAgYk5lZyA9IHRydWU7CisgICAgd3NTcmNOdW0uRGVsZXRlKDAsIDEpOworICB9CisKKyAgYXV0byBkb3RfaW5kZXggPSB3c1NyY051bS5GaW5kKCcuJyk7CisgIGRvdF9pbmRleCA9ICFkb3RfaW5kZXguaGFzX3ZhbHVlKCkgPyB3c1NyY051bS5HZXRMZW5ndGgoKSA6IGRvdF9pbmRleDsKKworICBpZiAoZG90X2luZGV4LnZhbHVlKCkgPCAxKQorICAgIHJldHVybiBMIiI7CisKKyAgc2l6ZV90IG5Qb3MgPSBkb3RfaW5kZXgudmFsdWUoKSAlIDM7CisgIFdpZGVTdHJpbmcgd3NPdXRwdXQ7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZG90X2luZGV4LnZhbHVlKCk7IGkrKykgeworICAgIGlmIChpICUgMyA9PSBuUG9zICYmIGkgIT0gMCkKKyAgICAgIHdzT3V0cHV0ICs9IHdzR3JvdXBTeW1ib2w7CisKKyAgICB3c091dHB1dCArPSB3c1NyY051bVtpXTsKKyAgfQorICBpZiAoZG90X2luZGV4LnZhbHVlKCkgPCB3c1NyY051bS5HZXRMZW5ndGgoKSkgeworICAgIHdzT3V0cHV0ICs9IHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsKTsKKyAgICB3c091dHB1dCArPSB3c1NyY051bS5SaWdodCh3c1NyY051bS5HZXRMZW5ndGgoKSAtIGRvdF9pbmRleC52YWx1ZSgpIC0gMSk7CisgIH0KKyAgaWYgKGJOZWcpCisgICAgcmV0dXJuIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51cykgKyB3c091dHB1dDsKKworICByZXR1cm4gd3NPdXRwdXQ7Cit9CisKK3ZvaWQgQ1hGQV9XaWRnZXRBY2M6Okluc2VydExpc3RUZXh0SXRlbShDWEZBX05vZGUqIHBJdGVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c1RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgpIHsKKyAgQ1hGQV9Ob2RlKiBwVGV4dCA9IHBJdGVtcy0+Q3JlYXRlU2FtZVBhY2tldE5vZGUoWEZBX0VsZW1lbnQ6OlRleHQpOworICBwSXRlbXMtPkluc2VydENoaWxkKG5JbmRleCwgcFRleHQpOworICBwVGV4dC0+SlNPYmplY3QoKS0+U2V0Q29udGVudCh3c1RleHQsIHdzVGV4dCwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Cit9CisKK1dpZGVTdHJpbmcgQ1hGQV9XaWRnZXRBY2M6Ok51bWVyaWNMaW1pdChjb25zdCBXaWRlU3RyaW5nJiB3c1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVHJlYWQpIGNvbnN0IHsKKyAgaWYgKChpTGVhZCA9PSAtMSkgJiYgKGlUcmVhZCA9PSAtMSkpCisgICAgcmV0dXJuIHdzVmFsdWU7CisKKyAgV2lkZVN0cmluZyB3c1JldDsKKyAgaW50MzJfdCBpTGVhZF8gPSAwLCBpVHJlYWRfID0gLTE7CisgIGludDMyX3QgaUNvdW50ID0gd3NWYWx1ZS5HZXRMZW5ndGgoKTsKKyAgaWYgKGlDb3VudCA9PSAwKQorICAgIHJldHVybiB3c1ZhbHVlOworCisgIGludDMyX3QgaSA9IDA7CisgIGlmICh3c1ZhbHVlW2ldID09IEwnLScpIHsKKyAgICB3c1JldCArPSBMJy0nOworICAgIGkrKzsKKyAgfQorICBmb3IgKDsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgd2NoYXJfdCB3YyA9IHdzVmFsdWVbaV07CisgICAgaWYgKEZYU1lTX2lzRGVjaW1hbERpZ2l0KHdjKSkgeworICAgICAgaWYgKGlMZWFkID49IDApIHsKKyAgICAgICAgaUxlYWRfKys7CisgICAgICAgIGlmIChpTGVhZF8gPiBpTGVhZCkKKyAgICAgICAgICByZXR1cm4gTCIwIjsKKyAgICAgIH0gZWxzZSBpZiAoaVRyZWFkXyA+PSAwKSB7CisgICAgICAgIGlUcmVhZF8rKzsKKyAgICAgICAgaWYgKGlUcmVhZF8gPiBpVHJlYWQpIHsKKyAgICAgICAgICBpZiAoaVRyZWFkICE9IC0xKSB7CisgICAgICAgICAgICBDRlhfRGVjaW1hbCB3c0RlY2kgPSBDRlhfRGVjaW1hbCh3c1ZhbHVlLkFzU3RyaW5nVmlldygpKTsKKyAgICAgICAgICAgIHdzRGVjaS5TZXRTY2FsZShpVHJlYWQpOworICAgICAgICAgICAgd3NSZXQgPSB3c0RlY2k7CisgICAgICAgICAgfQorICAgICAgICAgIHJldHVybiB3c1JldDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAod2MgPT0gTCcuJykgeworICAgICAgaVRyZWFkXyA9IDA7CisgICAgICBpTGVhZCA9IC0xOworICAgIH0KKyAgICB3c1JldCArPSB3YzsKKyAgfQorICByZXR1cm4gd3NSZXQ7Cit9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX3dpZGdldGFjYy5oIGIveGZhL2Z4ZmEvY3hmYV93aWRnZXRhY2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjFhY2U5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvY3hmYV93aWRnZXRhY2MuaApAQCAtMCwwICsxLDIyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX0NYRkFfV0lER0VUQUNDX0hfCisjZGVmaW5lIFhGQV9GWEZBX0NYRkFfV0lER0VUQUNDX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvcmV0YWluX3B0ci5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9kaWIvY2Z4X2RpYml0bWFwLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmFfYmFzaWMuaCIKKworZW51bSBYRkFfQ0hFQ0tTVEFURSB7CisgIFhGQV9DSEVDS1NUQVRFX09uID0gMCwKKyAgWEZBX0NIRUNLU1RBVEVfT2ZmID0gMSwKKyAgWEZBX0NIRUNLU1RBVEVfTmV1dHJhbCA9IDIsCit9OworCitlbnVtIFhGQV9WQUxVRVBJQ1RVUkUgeworICBYRkFfVkFMVUVQSUNUVVJFX1JhdyA9IDAsCisgIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSwKKyAgWEZBX1ZBTFVFUElDVFVSRV9FZGl0LAorICBYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kLAorfTsKKworY2xhc3MgQ0ZHQVNfR0VGb250OworY2xhc3MgQ1hGQV9CaW5kOworY2xhc3MgQ1hGQV9Cb3JkZXI7CitjbGFzcyBDWEZBX0NhbGN1bGF0ZTsKK2NsYXNzIENYRkFfQ2FwdGlvbjsKK2NsYXNzIENYRkFfRXZlbnQ7CitjbGFzcyBDWEZBX0V2ZW50UGFyYW07CitjbGFzcyBDWEZBX0ZGQXBwOworY2xhc3MgQ1hGQV9GRkRvYzsKK2NsYXNzIENYRkFfRkZEb2NWaWV3OworY2xhc3MgQ1hGQV9GRldpZGdldDsKK2NsYXNzIENYRkFfRm9udDsKK2NsYXNzIENYRkFfTWFyZ2luOworY2xhc3MgQ1hGQV9Ob2RlOworY2xhc3MgQ1hGQV9TY3JpcHQ7CitjbGFzcyBDWEZBX1BhcmE7CitjbGFzcyBDWEZBX1RleHRMYXlvdXQ7CitjbGFzcyBDWEZBX1ZhbHVlOworY2xhc3MgQ1hGQV9WYWxpZGF0ZTsKK2NsYXNzIENYRkFfV2lkZ2V0TGF5b3V0RGF0YTsKK2NsYXNzIElGWF9Mb2NhbGU7CisKK2NsYXNzIENYRkFfV2lkZ2V0QWNjIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENYRkFfV2lkZ2V0QWNjKENYRkFfTm9kZSogcE5vZGUpOworICB+Q1hGQV9XaWRnZXRBY2MoKTsKKworICB2b2lkIFJlc2V0RGF0YSgpOworCisgIENYRkFfRkZXaWRnZXQqIEdldE5leHRXaWRnZXQoQ1hGQV9GRldpZGdldCogcFdpZGdldCk7CisgIHZvaWQgU3RhcnRXaWRnZXRMYXlvdXQoQ1hGQV9GRkRvYyogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0JiBmQ2FsY1dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0JiBmQ2FsY0hlaWdodCk7CisgIGJvb2wgRmluZFNwbGl0UG9zKENYRkFfRkZEb2NWaWV3KiBkb2NWaWV3LAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCbG9ja0luZGV4LAorICAgICAgICAgICAgICAgICAgICBmbG9hdCYgZkNhbGNIZWlnaHQpOworCisgIGJvb2wgTG9hZENhcHRpb24oQ1hGQV9GRkRvYyogZG9jKTsKKyAgQ1hGQV9UZXh0TGF5b3V0KiBHZXRDYXB0aW9uVGV4dExheW91dCgpOworCisgIHZvaWQgTG9hZFRleHQoQ1hGQV9GRkRvYyogZG9jKTsKKyAgQ1hGQV9UZXh0TGF5b3V0KiBHZXRUZXh0TGF5b3V0KCk7CisKKyAgYm9vbCBMb2FkSW1hZ2VJbWFnZShDWEZBX0ZGRG9jKiBkb2MpOworICBib29sIExvYWRJbWFnZUVkaXRJbWFnZShDWEZBX0ZGRG9jKiBkb2MpOworICB2b2lkIEdldEltYWdlRHBpKGludDMyX3QmIGlJbWFnZVhEcGksIGludDMyX3QmIGlJbWFnZVlEcGkpOworICB2b2lkIEdldEltYWdlRWRpdERwaShpbnQzMl90JiBpSW1hZ2VYRHBpLCBpbnQzMl90JiBpSW1hZ2VZRHBpKTsKKworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBHZXRJbWFnZUltYWdlKCk7CisgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IEdldEltYWdlRWRpdEltYWdlKCk7CisgIHZvaWQgU2V0SW1hZ2VFZGl0KGNvbnN0IFdpZGVTdHJpbmcmIHdzQ29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzSHJlZiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NEYXRhKTsKKyAgdm9pZCBTZXRJbWFnZUltYWdlKGNvbnN0IFJldGFpblB0cjxDRlhfRElCaXRtYXA+JiBuZXdJbWFnZSk7CisgIHZvaWQgU2V0SW1hZ2VFZGl0SW1hZ2UoY29uc3QgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4mIG5ld0ltYWdlKTsKKyAgdm9pZCBVcGRhdGVVSURpc3BsYXkoQ1hGQV9GRkRvY1ZpZXcqIGRvY1ZpZXcsIENYRkFfRkZXaWRnZXQqIHBFeGNlcHQpOworCisgIFJldGFpblB0cjxDRkdBU19HRUZvbnQ+IEdldEZERUZvbnQoQ1hGQV9GRkRvYyogZG9jKTsKKworICBDWEZBX05vZGUqIEdldE5vZGUoKSBjb25zdCB7IHJldHVybiBtX3BOb2RlOyB9CisKKyAgQ1hGQV9Ob2RlKiBHZXRVSUNoaWxkKCk7CisgIFhGQV9FbGVtZW50IEdldFVJVHlwZSgpOworICBDRlhfUmVjdEYgR2V0VUlNYXJnaW4oKTsKKworICBib29sIElzT3BlbkFjY2VzcygpIGNvbnN0OworICBib29sIElzTGlzdEJveCgpOworICBib29sIElzQWxsb3dOZXV0cmFsKCk7CisgIGJvb2wgSXNSYWRpb0J1dHRvbigpOworICBib29sIElzQ2hvaWNlTGlzdEFsbG93VGV4dEVudHJ5KCk7CisgIGJvb2wgSXNNdWx0aUxpbmUoKTsKKworICBDWEZBX0JvcmRlciogR2V0VUlCb3JkZXIoKTsKKworICBzdGQ6OnZlY3RvcjxDWEZBX0V2ZW50Kj4gR2V0RXZlbnRCeUFjdGl2aXR5KFhGQV9BdHRyaWJ1dGVFbnVtIGlBY3Rpdml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJc0Zvcm1SZWFkeSk7CisKKyAgWEZBX0F0dHJpYnV0ZUVudW0gR2V0QnV0dG9uSGlnaGxpZ2h0KCk7CisgIGJvb2wgSGFzQnV0dG9uUm9sbG92ZXIoKSBjb25zdDsKKyAgYm9vbCBIYXNCdXR0b25Eb3duKCkgY29uc3Q7CisKKyAgYm9vbCBJc0NoZWNrQnV0dG9uUm91bmQoKTsKKyAgWEZBX0F0dHJpYnV0ZUVudW0gR2V0Q2hlY2tCdXR0b25NYXJrKCk7CisgIGZsb2F0IEdldENoZWNrQnV0dG9uU2l6ZSgpOworCisgIFhGQV9DSEVDS1NUQVRFIEdldENoZWNrU3RhdGUoKTsKKyAgdm9pZCBTZXRDaGVja1N0YXRlKFhGQV9DSEVDS1NUQVRFIGVDaGVja1N0YXRlLCBib29sIGJOb3RpZnkpOworCisgIENYRkFfTm9kZSogR2V0U2VsZWN0ZWRNZW1iZXIoKTsKKyAgQ1hGQV9Ob2RlKiBTZXRTZWxlY3RlZE1lbWJlcihjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NOYW1lLCBib29sIGJOb3RpZnkpOworICB2b2lkIFNldFNlbGVjdGVkTWVtYmVyQnlWYWx1ZShjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTY3JpcHRNb2RpZnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN5bmNEYXRhKTsKKworICBDWEZBX05vZGUqIEdldEV4Y2xHcm91cEZpcnN0TWVtYmVyKCk7CisgIENYRkFfTm9kZSogR2V0RXhjbEdyb3VwTmV4dE1lbWJlcihDWEZBX05vZGUqIHBOb2RlKTsKKworICBpbnQzMl90IENvdW50Q2hvaWNlTGlzdEl0ZW1zKGJvb2wgYlNhdmVWYWx1ZSk7CisgIE9wdGlvbmFsPFdpZGVTdHJpbmc+IEdldENob2ljZUxpc3RJdGVtKGludDMyX3QgbkluZGV4LCBib29sIGJTYXZlVmFsdWUpOworICBib29sIElzQ2hvaWNlTGlzdE11bHRpU2VsZWN0KCk7CisgIGJvb2wgSXNDaG9pY2VMaXN0Q29tbWl0T25TZWxlY3QoKTsKKyAgc3RkOjp2ZWN0b3I8V2lkZVN0cmluZz4gR2V0Q2hvaWNlTGlzdEl0ZW1zKGJvb2wgYlNhdmVWYWx1ZSk7CisKKyAgaW50MzJfdCBDb3VudFNlbGVjdGVkSXRlbXMoKTsKKyAgaW50MzJfdCBHZXRTZWxlY3RlZEl0ZW0oaW50MzJfdCBuSW5kZXgpOworICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBHZXRTZWxlY3RlZEl0ZW1zKCk7CisgIHN0ZDo6dmVjdG9yPFdpZGVTdHJpbmc+IEdldFNlbGVjdGVkSXRlbXNWYWx1ZSgpOworICB2b2lkIFNldFNlbGVjdGVkSXRlbXMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGlTZWxBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk5vdGlmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNjcmlwdE1vZGlmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN5bmNEYXRhKTsKKyAgdm9pZCBJbnNlcnRJdGVtKGNvbnN0IFdpZGVTdHJpbmcmIHdzTGFiZWwsCisgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c1ZhbHVlLAorICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5KTsKKyAgYm9vbCBEZWxldGVJdGVtKGludDMyX3QgbkluZGV4LCBib29sIGJOb3RpZnksIGJvb2wgYlNjcmlwdE1vZGlmeSk7CisgIHZvaWQgQ2xlYXJBbGxTZWxlY3Rpb25zKCk7CisKKyAgYm9vbCBHZXRJdGVtU3RhdGUoaW50MzJfdCBuSW5kZXgpOworICB2b2lkIFNldEl0ZW1TdGF0ZShpbnQzMl90IG5JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2VsZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgYk5vdGlmeSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2NyaXB0TW9kaWZ5LAorICAgICAgICAgICAgICAgICAgICBib29sIGJTeW5jRGF0YSk7CisKKyAgV2lkZVN0cmluZyBHZXRJdGVtVmFsdWUoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzTGFiZWwpOworCisgIGJvb2wgSXNIb3Jpem9udGFsU2Nyb2xsUG9saWN5T2ZmKCk7CisgIGJvb2wgSXNWZXJ0aWNhbFNjcm9sbFBvbGljeU9mZigpOworICBPcHRpb25hbDxpbnQzMl90PiBHZXROdW1iZXJPZkNlbGxzKCk7CisKKyAgYm9vbCBTZXRWYWx1ZShYRkFfVkFMVUVQSUNUVVJFIGVWYWx1ZVR5cGUsIGNvbnN0IFdpZGVTdHJpbmcmIHdzVmFsdWUpOworICBXaWRlU3RyaW5nIEdldFZhbHVlKFhGQV9WQUxVRVBJQ1RVUkUgZVZhbHVlVHlwZSk7CisKKyAgV2lkZVN0cmluZyBHZXRQaWN0dXJlQ29udGVudChYRkFfVkFMVUVQSUNUVVJFIGVQaWN0dXJlKTsKKyAgSUZYX0xvY2FsZSogR2V0TG9jYWxlKCk7CisKKyAgV2lkZVN0cmluZyBHZXROb3JtYWxpemVEYXRhVmFsdWUoY29uc3QgV2lkZVN0cmluZyYgd3NWYWx1ZSk7CisgIFdpZGVTdHJpbmcgR2V0Rm9ybWF0RGF0YVZhbHVlKGNvbnN0IFdpZGVTdHJpbmcmIHdzVmFsdWUpOworICBXaWRlU3RyaW5nIE5vcm1hbGl6ZU51bVN0cihjb25zdCBXaWRlU3RyaW5nJiB3c1ZhbHVlKTsKKworICBXaWRlU3RyaW5nIEdldFBhc3N3b3JkQ2hhcigpOworICBzdGQ6OnBhaXI8WEZBX0VsZW1lbnQsIGludDMyX3Q+IEdldE1heENoYXJzKCk7CisgIGludDMyX3QgR2V0RnJhY0RpZ2l0cygpOworICBpbnQzMl90IEdldExlYWREaWdpdHMoKTsKKworICBXaWRlU3RyaW5nIE51bWVyaWNMaW1pdChjb25zdCBXaWRlU3RyaW5nJiB3c1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUcmVhZCkgY29uc3Q7CisKKyAgYm9vbCBJc1ByZU51bGwoKSBjb25zdCB7IHJldHVybiBtX2JQcmVOdWxsOyB9CisgIHZvaWQgU2V0UHJlTnVsbChib29sIHZhbCkgeyBtX2JQcmVOdWxsID0gdmFsOyB9CisgIGJvb2wgSXNOdWxsKCkgY29uc3QgeyByZXR1cm4gbV9iSXNOdWxsOyB9CisgIHZvaWQgU2V0SXNOdWxsKGJvb2wgdmFsKSB7IG1fYklzTnVsbCA9IHZhbDsgfQorCisgcHJpdmF0ZToKKyAgdm9pZCBDYWxjQ2FwdGlvblNpemUoQ1hGQV9GRkRvYyogZG9jLCBDRlhfU2l6ZUYmIHN6Q2FwKTsKKyAgYm9vbCBDYWxjdWxhdGVGaWVsZEF1dG9TaXplKENYRkFfRkZEb2MqIGRvYywgQ0ZYX1NpemVGJiBzaXplKTsKKyAgYm9vbCBDYWxjdWxhdGVXaWRnZXRBdXRvU2l6ZShDRlhfU2l6ZUYmIHNpemUpOworICBib29sIENhbGN1bGF0ZVRleHRFZGl0QXV0b1NpemUoQ1hGQV9GRkRvYyogZG9jLCBDRlhfU2l6ZUYmIHNpemUpOworICBib29sIENhbGN1bGF0ZUNoZWNrQnV0dG9uQXV0b1NpemUoQ1hGQV9GRkRvYyogZG9jLCBDRlhfU2l6ZUYmIHNpemUpOworICBib29sIENhbGN1bGF0ZVB1c2hCdXR0b25BdXRvU2l6ZShDWEZBX0ZGRG9jKiBkb2MsIENGWF9TaXplRiYgc2l6ZSk7CisgIENGWF9TaXplRiBDYWxjdWxhdGVJbWFnZVNpemUoZmxvYXQgaW1nX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGltZ19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZHBpX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZHBpX3kpOworICBib29sIENhbGN1bGF0ZUltYWdlRWRpdEF1dG9TaXplKENYRkFfRkZEb2MqIGRvYywgQ0ZYX1NpemVGJiBzaXplKTsKKyAgYm9vbCBDYWxjdWxhdGVJbWFnZUF1dG9TaXplKENYRkFfRkZEb2MqIGRvYywgQ0ZYX1NpemVGJiBzaXplKTsKKyAgZmxvYXQgQ2FsY3VsYXRlV2lkZ2V0QXV0b0hlaWdodChmbG9hdCBmSGVpZ2h0Q2FsYyk7CisgIGZsb2F0IENhbGN1bGF0ZVdpZGdldEF1dG9XaWR0aChmbG9hdCBmV2lkdGhDYWxjKTsKKyAgZmxvYXQgR2V0V2lkdGhXaXRob3V0TWFyZ2luKGZsb2F0IGZXaWR0aENhbGMpOworICBmbG9hdCBHZXRIZWlnaHRXaXRob3V0TWFyZ2luKGZsb2F0IGZIZWlnaHRDYWxjKTsKKyAgdm9pZCBDYWxjdWxhdGVUZXh0Q29udGVudFNpemUoQ1hGQV9GRkRvYyogZG9jLCBDRlhfU2l6ZUYmIHNpemUpOworICB2b2lkIENhbGN1bGF0ZUFjY1dpZHRoQW5kSGVpZ2h0KENYRkFfRkZEb2MqIGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudCBlVUlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0JiBmV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQmIGZDYWxjSGVpZ2h0KTsKKyAgdm9pZCBJbml0TGF5b3V0RGF0YSgpOworICB2b2lkIFN0YXJ0VGV4dExheW91dChDWEZBX0ZGRG9jKiBkb2MsIGZsb2F0JiBmQ2FsY1dpZHRoLCBmbG9hdCYgZkNhbGNIZWlnaHQpOworCisgIHZvaWQgSW5zZXJ0TGlzdFRleHRJdGVtKENYRkFfTm9kZSogcEl0ZW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c1RleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4KTsKKyAgV2lkZVN0cmluZyBGb3JtYXROdW1TdHIoY29uc3QgV2lkZVN0cmluZyYgd3NWYWx1ZSwgSUZYX0xvY2FsZSogcExvY2FsZSk7CisgIHZvaWQgR2V0SXRlbUxhYmVsKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c1ZhbHVlLCBXaWRlU3RyaW5nJiB3c0xhYmVsKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9XaWRnZXRMYXlvdXREYXRhPiBtX3BMYXlvdXREYXRhOworICBib29sIG1fYklzTnVsbDsKKyAgYm9vbCBtX2JQcmVOdWxsOworICBDWEZBX05vZGUqIG1fcFVpQ2hpbGROb2RlOworICBYRkFfRWxlbWVudCBtX2VVSVR5cGU7CisgIENYRkFfTm9kZSogbV9wTm9kZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfQ1hGQV9XSURHRVRBQ0NfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2N4ZmFfd2lkZ2V0YWNjaXRlcmF0b3IuY3BwIGIveGZhL2Z4ZmEvY3hmYV93aWRnZXRhY2NpdGVyYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlNTYwNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfd2lkZ2V0YWNjaXRlcmF0b3IuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfd2lkZ2V0YWNjaXRlcmF0b3IuaCIKKworI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfd2lkZ2V0YWNjLmgiCisKK0NYRkFfV2lkZ2V0QWNjSXRlcmF0b3I6OkNYRkFfV2lkZ2V0QWNjSXRlcmF0b3IoQ1hGQV9Ob2RlKiBwVHJhdmVsUm9vdCkKKyAgICA6IG1fQ29udGVudEl0ZXJhdG9yKHBUcmF2ZWxSb290KSwgbV9wQ3VyV2lkZ2V0QWNjKG51bGxwdHIpIHt9CisKK0NYRkFfV2lkZ2V0QWNjSXRlcmF0b3I6On5DWEZBX1dpZGdldEFjY0l0ZXJhdG9yKCkge30KKworQ1hGQV9XaWRnZXRBY2MqIENYRkFfV2lkZ2V0QWNjSXRlcmF0b3I6Ok1vdmVUb05leHQoKSB7CisgIENYRkFfTm9kZSogcEl0ZW0gPSBtX3BDdXJXaWRnZXRBY2MgPyBtX0NvbnRlbnRJdGVyYXRvci5Nb3ZlVG9OZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1fQ29udGVudEl0ZXJhdG9yLkdldEN1cnJlbnQoKTsKKyAgd2hpbGUgKHBJdGVtKSB7CisgICAgbV9wQ3VyV2lkZ2V0QWNjID0gcEl0ZW0tPkdldFdpZGdldEFjYygpOworICAgIGlmIChtX3BDdXJXaWRnZXRBY2MpCisgICAgICByZXR1cm4gbV9wQ3VyV2lkZ2V0QWNjLkdldCgpOworICAgIHBJdGVtID0gbV9Db250ZW50SXRlcmF0b3IuTW92ZVRvTmV4dCgpOworICB9CisgIHJldHVybiBudWxscHRyOworfQorCit2b2lkIENYRkFfV2lkZ2V0QWNjSXRlcmF0b3I6OlNraXBUcmVlKCkgeworICBtX0NvbnRlbnRJdGVyYXRvci5Ta2lwQ2hpbGRyZW5BbmRNb3ZlVG9OZXh0KCk7CisgIG1fcEN1cldpZGdldEFjYyA9IG51bGxwdHI7Cit9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9jeGZhX3dpZGdldGFjY2l0ZXJhdG9yLmggYi94ZmEvZnhmYS9jeGZhX3dpZGdldGFjY2l0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk4NjBhNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2N4ZmFfd2lkZ2V0YWNjaXRlcmF0b3IuaApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfQ1hGQV9XSURHRVRBQ0NJVEVSQVRPUl9IXworI2RlZmluZSBYRkFfRlhGQV9DWEZBX1dJREdFVEFDQ0lURVJBVE9SX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhdmVyc2VzdHJhdGVneV94ZmFjb250YWluZXJub2RlLmgiCisKK2NsYXNzIENYRkFfTm9kZTsKK2NsYXNzIENYRkFfV2lkZ2V0QWNjOworCitjbGFzcyBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENYRkFfV2lkZ2V0QWNjSXRlcmF0b3IoQ1hGQV9Ob2RlKiBwVHJhdmVsUm9vdCk7CisgIH5DWEZBX1dpZGdldEFjY0l0ZXJhdG9yKCk7CisKKyAgQ1hGQV9XaWRnZXRBY2MqIE1vdmVUb05leHQoKTsKKyAgdm9pZCBTa2lwVHJlZSgpOworCisgcHJpdmF0ZToKKyAgQ1hGQV9Db250YWluZXJJdGVyYXRvciBtX0NvbnRlbnRJdGVyYXRvcjsKKyAgVW5vd25lZFB0cjxDWEZBX1dpZGdldEFjYz4gbV9wQ3VyV2lkZ2V0QWNjOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9DWEZBX1dJREdFVEFDQ0lURVJBVE9SX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9mbTJqcy9ERVBTIGIveGZhL2Z4ZmEvZm0yanMvREVQUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmUwMzUyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvZm0yanMvREVQUwpAQCAtMCwwICsxLDMgQEAKK2luY2x1ZGVfcnVsZXMgPSBbCisgICcrdGhpcmRfcGFydHkvaWN1JywKK10KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2ZtMmpzL2N4ZmFfZm1leHByZXNzaW9uLmNwcCBiL3hmYS9meGZhL2ZtMmpzL2N4ZmFfZm1leHByZXNzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTlhODc1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvZm0yanMvY3hmYV9mbWV4cHJlc3Npb24uY3BwCkBAIC0wLDAgKzEsNzcxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9mbTJqcy9jeGZhX2ZtZXhwcmVzc2lvbi5oIgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3dpZGV0ZXh0YnVmLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvZm0yanMvY3hmYV9mbXNpbXBsZWV4cHJlc3Npb24uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9mbTJqcy9jeGZhX2ZtdG9qYXZhc2NyaXB0ZGVwdGguaCIKKworbmFtZXNwYWNlIHsKKworY29uc3Qgd2NoYXJfdCBSVU5USU1FQkxPQ0tURU1QQVJSQVlbXSA9IEwicGZtX2FyeSI7CisKK2NvbnN0IHdjaGFyX3QgUlVOVElNRUJMT0NLVEVNUEFSUkFZSU5ERVhbXSA9IEwicGZtX2FyeV9pZHgiOworCitjb25zdCB3Y2hhcl90IGtMZXNzRXF1YWxbXSA9IEwiIDw9ICI7Citjb25zdCB3Y2hhcl90IGtHcmVhdGVyRXF1YWxbXSA9IEwiID49ICI7Citjb25zdCB3Y2hhcl90IGtQbHVzRXF1YWxbXSA9IEwiICs9ICI7Citjb25zdCB3Y2hhcl90IGtNaW51c0VxdWFsW10gPSBMIiAtPSAiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9GTUV4cHJlc3Npb246OkNYRkFfRk1FeHByZXNzaW9uKHVpbnQzMl90IGxpbmUpCisgICAgOiBtX3R5cGUoWEZBX0ZNX0VYUFRZUEVfVU5LTk9XTiksIG1fbGluZShsaW5lKSB7fQorCitDWEZBX0ZNRXhwcmVzc2lvbjo6Q1hGQV9GTUV4cHJlc3Npb24odWludDMyX3QgbGluZSwgWEZBX0ZNX0VYUFRZUEUgdHlwZSkKKyAgICA6IG1fdHlwZSh0eXBlKSwgbV9saW5lKGxpbmUpIHt9CisKK2Jvb2wgQ1hGQV9GTUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgcmV0dXJuICFDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpICYmIGRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCk7Cit9CisKK2Jvb2wgQ1hGQV9GTUV4cHJlc3Npb246OlRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgeworICBDWEZBX0ZNVG9KYXZhU2NyaXB0RGVwdGggZGVwdGhNYW5hZ2VyOworICByZXR1cm4gIUNYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgJiYgZGVwdGhNYW5hZ2VyLklzV2l0aGluTWF4RGVwdGgoKTsKK30KKworQ1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbjo6Q1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbigKKyAgICB1aW50MzJfdCBsaW5lLAorICAgIGJvb2wgaXNHbG9iYWwsCisgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzTmFtZSwKKyAgICBzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nVmlldz4mJiBhcmd1bWVudHMsCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPj4mJiBleHByZXNzaW9ucykKKyAgICA6IENYRkFfRk1FeHByZXNzaW9uKGxpbmUsIFhGQV9GTV9FWFBUWVBFX0ZVTkMpLAorICAgICAgbV93c05hbWUod3NOYW1lKSwKKyAgICAgIG1fcEFyZ3VtZW50cyhzdGQ6Om1vdmUoYXJndW1lbnRzKSksCisgICAgICBtX3BFeHByZXNzaW9ucyhzdGQ6Om1vdmUoZXhwcmVzc2lvbnMpKSwKKyAgICAgIG1faXNHbG9iYWwoaXNHbG9iYWwpIHt9CisKK0NYRkFfRk1GdW5jdGlvbkRlZmluaXRpb246On5DWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uKCkge30KKworYm9vbCBDWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7CisgIENYRkFfRk1Ub0phdmFTY3JpcHREZXB0aCBkZXB0aE1hbmFnZXI7CisgIGlmIChDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpIHx8ICFkZXB0aE1hbmFnZXIuSXNXaXRoaW5NYXhEZXB0aCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAobV9pc0dsb2JhbCAmJiBtX3BFeHByZXNzaW9ucy5lbXB0eSgpKSB7CisgICAgamF2YXNjcmlwdCA8PCBMIi8vIGNvbW1lbnRzIG9ubHkiOworICAgIHJldHVybiAhQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KTsKKyAgfQorICBpZiAobV9pc0dsb2JhbCkgeworICAgIGphdmFzY3JpcHQgPDwgTCIoXG4iOworICB9CisgIGphdmFzY3JpcHQgPDwgTCJmdW5jdGlvbiAiOworICBpZiAoIW1fd3NOYW1lLklzRW1wdHkoKSAmJiBtX3dzTmFtZVswXSA9PSBMJyEnKSB7CisgICAgV2lkZVN0cmluZyB0ZW1wTmFtZSA9CisgICAgICAgIEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKyBtX3dzTmFtZS5SaWdodChtX3dzTmFtZS5HZXRMZW5ndGgoKSAtIDEpOworICAgIGphdmFzY3JpcHQgPDwgdGVtcE5hbWU7CisgIH0gZWxzZSB7CisgICAgamF2YXNjcmlwdCA8PCBtX3dzTmFtZTsKKyAgfQorICBqYXZhc2NyaXB0IDw8IEwiKCI7CisgIGJvb2wgYk5lZWRDb21tYSA9IGZhbHNlOworICBmb3IgKGNvbnN0IGF1dG8mIGlkZW50aWZpZXIgOiBtX3BBcmd1bWVudHMpIHsKKyAgICBpZiAoYk5lZWRDb21tYSkKKyAgICAgIGphdmFzY3JpcHQgPDwgTCIsICI7CisgICAgaWYgKGlkZW50aWZpZXJbMF0gPT0gTCchJykgeworICAgICAgV2lkZVN0cmluZyB0ZW1wSWRlbnRpZmllciA9IEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIuUmlnaHQoaWRlbnRpZmllci5HZXRMZW5ndGgoKSAtIDEpOworICAgICAgamF2YXNjcmlwdCA8PCB0ZW1wSWRlbnRpZmllcjsKKyAgICB9IGVsc2UgeworICAgICAgamF2YXNjcmlwdCA8PCBpZGVudGlmaWVyOworICAgIH0KKyAgICBiTmVlZENvbW1hID0gdHJ1ZTsKKyAgfQorICBqYXZhc2NyaXB0IDw8IEwiKVxue1xuIjsKKyAgamF2YXNjcmlwdCA8PCBMInZhciAiOworICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOworICBqYXZhc2NyaXB0IDw8IEwiID0gbnVsbDtcbiI7CisgIGZvciAoY29uc3QgYXV0byYgZXhwciA6IG1fcEV4cHJlc3Npb25zKSB7CisgICAgYm9vbCByZXQ7CisgICAgaWYgKGV4cHIgPT0gbV9wRXhwcmVzc2lvbnMuYmFjaygpKQorICAgICAgcmV0ID0gZXhwci0+VG9JbXBsaWVkUmV0dXJuSlMoamF2YXNjcmlwdCk7CisgICAgZWxzZQorICAgICAgcmV0ID0gZXhwci0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOworCisgICAgaWYgKCFyZXQpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgamF2YXNjcmlwdCA8PCBMInJldHVybiAiOworICBpZiAobV9pc0dsb2JhbCkgeworICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsKKyAgICBqYXZhc2NyaXB0IDw8IEwiKCI7CisgICAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsKKyAgICBqYXZhc2NyaXB0IDw8IEwiKSI7CisgIH0gZWxzZSB7CisgICAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsKKyAgfQorICBqYXZhc2NyaXB0IDw8IEwiO1xufVxuIjsKKyAgaWYgKG1faXNHbG9iYWwpIHsKKyAgICBqYXZhc2NyaXB0IDw8IEwiKS5jYWxsKHRoaXMpO1xuIjsKKyAgfQorICByZXR1cm4gIUNYRkFfSXNUb29CaWcoamF2YXNjcmlwdCk7Cit9CisKK2Jvb2wgQ1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7CisgIENYRkFfRk1Ub0phdmFTY3JpcHREZXB0aCBkZXB0aE1hbmFnZXI7CisgIHJldHVybiAhQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KSAmJiBkZXB0aE1hbmFnZXIuSXNXaXRoaW5NYXhEZXB0aCgpOworfQorCitDWEZBX0ZNVmFyRXhwcmVzc2lvbjo6Q1hGQV9GTVZhckV4cHJlc3Npb24oCisgICAgdWludDMyX3QgbGluZSwKKyAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NOYW1lLAorICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gcEluaXQpCisgICAgOiBDWEZBX0ZNRXhwcmVzc2lvbihsaW5lLCBYRkFfRk1fRVhQVFlQRV9WQVIpLAorICAgICAgbV93c05hbWUod3NOYW1lKSwKKyAgICAgIG1fcEluaXQoc3RkOjptb3ZlKHBJbml0KSkge30KKworQ1hGQV9GTVZhckV4cHJlc3Npb246On5DWEZBX0ZNVmFyRXhwcmVzc2lvbigpIHt9CisKK2Jvb2wgQ1hGQV9GTVZhckV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgfHwgIWRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGphdmFzY3JpcHQgPDwgTCJ2YXIgIjsKKyAgV2lkZVN0cmluZyB0ZW1wTmFtZShtX3dzTmFtZSk7CisgIGlmIChtX3dzTmFtZVswXSA9PSBMJyEnKSB7CisgICAgdGVtcE5hbWUgPQorICAgICAgICBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSICsgbV93c05hbWUuUmlnaHQobV93c05hbWUuR2V0TGVuZ3RoKCkgLSAxKTsKKyAgfQorICBqYXZhc2NyaXB0IDw8IHRlbXBOYW1lOworICBqYXZhc2NyaXB0IDw8IEwiID0gIjsKKyAgaWYgKG1fcEluaXQpIHsKKyAgICBpZiAoIW1fcEluaXQtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBOYW1lOworICAgIGphdmFzY3JpcHQgPDwgTCIgPSAiOworICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhWQVJGSUxURVIpOworICAgIGphdmFzY3JpcHQgPDwgTCIoIjsKKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBOYW1lOworICAgIGphdmFzY3JpcHQgPDwgTCIpO1xuIjsKKyAgfSBlbHNlIHsKKyAgICBqYXZhc2NyaXB0IDw8IEwiXCJcIjtcbiI7CisgIH0KKyAgcmV0dXJuICFDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpOworfQorCitib29sIENYRkFfRk1WYXJFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgfHwgIWRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGphdmFzY3JpcHQgPDwgTCJ2YXIgIjsKKyAgV2lkZVN0cmluZyB0ZW1wTmFtZShtX3dzTmFtZSk7CisgIGlmIChtX3dzTmFtZVswXSA9PSBMJyEnKSB7CisgICAgdGVtcE5hbWUgPQorICAgICAgICBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSICsgbV93c05hbWUuUmlnaHQobV93c05hbWUuR2V0TGVuZ3RoKCkgLSAxKTsKKyAgfQorICBqYXZhc2NyaXB0IDw8IHRlbXBOYW1lOworICBqYXZhc2NyaXB0IDw8IEwiID0gIjsKKyAgaWYgKG1fcEluaXQpIHsKKyAgICBpZiAoIW1fcEluaXQtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBOYW1lOworICAgIGphdmFzY3JpcHQgPDwgTCIgPSAiOworICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhWQVJGSUxURVIpOworICAgIGphdmFzY3JpcHQgPDwgTCIoIjsKKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBOYW1lOworICAgIGphdmFzY3JpcHQgPDwgTCIpO1xuIjsKKyAgfSBlbHNlIHsKKyAgICBqYXZhc2NyaXB0IDw8IEwiXCJcIjtcbiI7CisgIH0KKyAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsKKyAgamF2YXNjcmlwdCA8PCBMIiA9ICI7CisgIGphdmFzY3JpcHQgPDwgdGVtcE5hbWU7CisgIGphdmFzY3JpcHQgPDwgTCI7XG4iOworICByZXR1cm4gIUNYRkFfSXNUb29CaWcoamF2YXNjcmlwdCk7Cit9CisKK0NYRkFfRk1FeHBFeHByZXNzaW9uOjpDWEZBX0ZNRXhwRXhwcmVzc2lvbigKKyAgICB1aW50MzJfdCBsaW5lLAorICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cHJlc3Npb24pCisgICAgOiBDWEZBX0ZNRXhwcmVzc2lvbihsaW5lLCBYRkFfRk1fRVhQVFlQRV9FWFApLAorICAgICAgbV9wRXhwcmVzc2lvbihzdGQ6Om1vdmUocEV4cHJlc3Npb24pKSB7fQorCitDWEZBX0ZNRXhwRXhwcmVzc2lvbjo6fkNYRkFfRk1FeHBFeHByZXNzaW9uKCkge30KKworYm9vbCBDWEZBX0ZNRXhwRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgeworICBDWEZBX0ZNVG9KYXZhU2NyaXB0RGVwdGggZGVwdGhNYW5hZ2VyOworICBpZiAoQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KSB8fCAhZGVwdGhNYW5hZ2VyLklzV2l0aGluTWF4RGVwdGgoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgYm9vbCByZXQgPSBtX3BFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7CisgIGlmIChtX3BFeHByZXNzaW9uLT5HZXRPcGVyYXRvclRva2VuKCkgIT0gVE9LYXNzaWduKQorICAgIGphdmFzY3JpcHQgPDwgTCI7XG4iOworICByZXR1cm4gcmV0OworfQorCitib29sIENYRkFfRk1FeHBFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgfHwgIWRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGlmIChtX3BFeHByZXNzaW9uLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LYXNzaWduKQorICAgIHJldHVybiBtX3BFeHByZXNzaW9uLT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KTsKKworICBpZiAobV9wRXhwcmVzc2lvbi0+R2V0T3BlcmF0b3JUb2tlbigpID09IFRPS3N0YXIgfHwKKyAgICAgIG1fcEV4cHJlc3Npb24tPkdldE9wZXJhdG9yVG9rZW4oKSA9PSBUT0tkb3RzdGFyIHx8CisgICAgICBtX3BFeHByZXNzaW9uLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LZG90c2NyZWFtIHx8CisgICAgICBtX3BFeHByZXNzaW9uLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LZG90ZG90IHx8CisgICAgICBtX3BFeHByZXNzaW9uLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LZG90KSB7CisgICAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsKKyAgICBqYXZhc2NyaXB0IDw8IEwiID0gIjsKKyAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoR0VURk1WQUxVRSk7CisgICAgamF2YXNjcmlwdCA8PCBMIigiOworICAgIGlmICghbV9wRXhwcmVzc2lvbi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGphdmFzY3JpcHQgPDwgTCIpO1xuIjsKKyAgICByZXR1cm4gIUNYRkFfSXNUb29CaWcoamF2YXNjcmlwdCk7CisgIH0KKworICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOworICBqYXZhc2NyaXB0IDw8IEwiID0gIjsKKyAgaWYgKCFtX3BFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCkpCisgICAgcmV0dXJuIGZhbHNlOworICBqYXZhc2NyaXB0IDw8IEwiO1xuIjsKKyAgcmV0dXJuICFDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpOworfQorCitDWEZBX0ZNQmxvY2tFeHByZXNzaW9uOjpDWEZBX0ZNQmxvY2tFeHByZXNzaW9uKAorICAgIHVpbnQzMl90IGxpbmUsCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPj4mJiBwRXhwcmVzc2lvbkxpc3QpCisgICAgOiBDWEZBX0ZNRXhwcmVzc2lvbihsaW5lLCBYRkFfRk1fRVhQVFlQRV9CTE9DSyksCisgICAgICBtX0V4cHJlc3Npb25MaXN0KHN0ZDo6bW92ZShwRXhwcmVzc2lvbkxpc3QpKSB7fQorCitDWEZBX0ZNQmxvY2tFeHByZXNzaW9uOjp+Q1hGQV9GTUJsb2NrRXhwcmVzc2lvbigpIHt9CisKK2Jvb2wgQ1hGQV9GTUJsb2NrRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgeworICBDWEZBX0ZNVG9KYXZhU2NyaXB0RGVwdGggZGVwdGhNYW5hZ2VyOworICBpZiAoQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KSB8fCAhZGVwdGhNYW5hZ2VyLklzV2l0aGluTWF4RGVwdGgoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgamF2YXNjcmlwdCA8PCBMIntcbiI7CisgIGZvciAoY29uc3QgYXV0byYgZXhwciA6IG1fRXhwcmVzc2lvbkxpc3QpIHsKKyAgICBpZiAoIWV4cHItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBqYXZhc2NyaXB0IDw8IEwifVxuIjsKKyAgcmV0dXJuICFDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpOworfQorCitib29sIENYRkFfRk1CbG9ja0V4cHJlc3Npb246OlRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgeworICBDWEZBX0ZNVG9KYXZhU2NyaXB0RGVwdGggZGVwdGhNYW5hZ2VyOworICBpZiAoQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KSB8fCAhZGVwdGhNYW5hZ2VyLklzV2l0aGluTWF4RGVwdGgoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgamF2YXNjcmlwdCA8PCBMIntcbiI7CisgIGZvciAoY29uc3QgYXV0byYgZXhwciA6IG1fRXhwcmVzc2lvbkxpc3QpIHsKKyAgICBib29sIHJldDsKKyAgICBpZiAoZXhwciA9PSBtX0V4cHJlc3Npb25MaXN0LmJhY2soKSkKKyAgICAgIHJldCA9IGV4cHItPlRvSW1wbGllZFJldHVybkpTKGphdmFzY3JpcHQpOworICAgIGVsc2UKKyAgICAgIHJldCA9IGV4cHItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsKKworICAgIGlmICghcmV0KQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGphdmFzY3JpcHQgPDwgTCJ9XG4iOworICByZXR1cm4gIUNYRkFfSXNUb29CaWcoamF2YXNjcmlwdCk7Cit9CisKK0NYRkFfRk1Eb0V4cHJlc3Npb246OkNYRkFfRk1Eb0V4cHJlc3Npb24oCisgICAgdWludDMyX3QgbGluZSwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IHBMaXN0KQorICAgIDogQ1hGQV9GTUV4cHJlc3Npb24obGluZSksIG1fcExpc3Qoc3RkOjptb3ZlKHBMaXN0KSkge30KKworQ1hGQV9GTURvRXhwcmVzc2lvbjo6fkNYRkFfRk1Eb0V4cHJlc3Npb24oKSB7fQorCitib29sIENYRkFfRk1Eb0V4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgfHwgIWRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiBtX3BMaXN0LT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Cit9CisKK2Jvb2wgQ1hGQV9GTURvRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7CisgIENYRkFfRk1Ub0phdmFTY3JpcHREZXB0aCBkZXB0aE1hbmFnZXI7CisgIGlmIChDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpIHx8ICFkZXB0aE1hbmFnZXIuSXNXaXRoaW5NYXhEZXB0aCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gbV9wTGlzdC0+VG9JbXBsaWVkUmV0dXJuSlMoamF2YXNjcmlwdCk7Cit9CisKK0NYRkFfRk1JZkV4cHJlc3Npb246OkNYRkFfRk1JZkV4cHJlc3Npb24oCisgICAgdWludDMyX3QgbGluZSwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHByZXNzaW9uLAorICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gcElmRXhwcmVzc2lvbiwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IHBFbHNlRXhwcmVzc2lvbikKKyAgICA6IENYRkFfRk1FeHByZXNzaW9uKGxpbmUsIFhGQV9GTV9FWFBUWVBFX0lGKSwKKyAgICAgIG1fcEV4cHJlc3Npb24oc3RkOjptb3ZlKHBFeHByZXNzaW9uKSksCisgICAgICBtX3BJZkV4cHJlc3Npb24oc3RkOjptb3ZlKHBJZkV4cHJlc3Npb24pKSwKKyAgICAgIG1fcEVsc2VFeHByZXNzaW9uKHN0ZDo6bW92ZShwRWxzZUV4cHJlc3Npb24pKSB7fQorCitDWEZBX0ZNSWZFeHByZXNzaW9uOjp+Q1hGQV9GTUlmRXhwcmVzc2lvbigpIHt9CisKK2Jvb2wgQ1hGQV9GTUlmRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgeworICBDWEZBX0ZNVG9KYXZhU2NyaXB0RGVwdGggZGVwdGhNYW5hZ2VyOworICBpZiAoQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KSB8fCAhZGVwdGhNYW5hZ2VyLklzV2l0aGluTWF4RGVwdGgoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgamF2YXNjcmlwdCA8PCBMImlmICgiOworICBpZiAobV9wRXhwcmVzc2lvbikgeworICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsKKyAgICBqYXZhc2NyaXB0IDw8IEwiKCI7CisgICAgaWYgKCFtX3BFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgamF2YXNjcmlwdCA8PCBMIikiOworICB9CisgIGphdmFzY3JpcHQgPDwgTCIpXG4iOworICBpZiAoQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKG1fcElmRXhwcmVzc2lvbikgeworICAgIGlmICghbV9wSWZFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAobV9wRWxzZUV4cHJlc3Npb24pIHsKKyAgICBpZiAobV9wRWxzZUV4cHJlc3Npb24tPkdldEV4cFR5cGUoKSA9PSBYRkFfRk1fRVhQVFlQRV9JRikgeworICAgICAgamF2YXNjcmlwdCA8PCBMImVsc2VcbiI7CisgICAgICBqYXZhc2NyaXB0IDw8IEwie1xuIjsKKyAgICAgIGlmICghbV9wRWxzZUV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgamF2YXNjcmlwdCA8PCBMIn1cbiI7CisgICAgfSBlbHNlIHsKKyAgICAgIGphdmFzY3JpcHQgPDwgTCJlbHNlXG4iOworICAgICAgaWYgKCFtX3BFbHNlRXhwcmVzc2lvbi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiAhQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KTsKK30KKworYm9vbCBDWEZBX0ZNSWZFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgfHwgIWRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7CisgIGphdmFzY3JpcHQgPDwgTCIgPSAwO1xuIjsKKyAgamF2YXNjcmlwdCA8PCBMImlmICgiOworICBpZiAobV9wRXhwcmVzc2lvbikgeworICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsKKyAgICBqYXZhc2NyaXB0IDw8IEwiKCI7CisgICAgaWYgKCFtX3BFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgamF2YXNjcmlwdCA8PCBMIikiOworICB9CisgIGphdmFzY3JpcHQgPDwgTCIpXG4iOworICBpZiAoQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKG1fcElmRXhwcmVzc2lvbikgeworICAgIGlmICghbV9wSWZFeHByZXNzaW9uLT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAobV9wRWxzZUV4cHJlc3Npb24pIHsKKyAgICBpZiAobV9wRWxzZUV4cHJlc3Npb24tPkdldEV4cFR5cGUoKSA9PSBYRkFfRk1fRVhQVFlQRV9JRikgeworICAgICAgamF2YXNjcmlwdCA8PCBMImVsc2VcbiI7CisgICAgICBqYXZhc2NyaXB0IDw8IEwie1xuIjsKKyAgICAgIGlmICghbV9wRWxzZUV4cHJlc3Npb24tPlRvSW1wbGllZFJldHVybkpTKGphdmFzY3JpcHQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBqYXZhc2NyaXB0IDw8IEwifVxuIjsKKyAgICB9IGVsc2UgeworICAgICAgamF2YXNjcmlwdCA8PCBMImVsc2VcbiI7CisgICAgICBpZiAoIW1fcEVsc2VFeHByZXNzaW9uLT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gIUNYRkFfSXNUb29CaWcoamF2YXNjcmlwdCk7Cit9CisKK0NYRkFfRk1Mb29wRXhwcmVzc2lvbjo6fkNYRkFfRk1Mb29wRXhwcmVzc2lvbigpIHt9CisKK2Jvb2wgQ1hGQV9GTUxvb3BFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7CisgIENYRkFfRk1Ub0phdmFTY3JpcHREZXB0aCBkZXB0aE1hbmFnZXI7CisgIHJldHVybiAhQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KSAmJiBkZXB0aE1hbmFnZXIuSXNXaXRoaW5NYXhEZXB0aCgpOworfQorCitib29sIENYRkFfRk1Mb29wRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7CisgIENYRkFfRk1Ub0phdmFTY3JpcHREZXB0aCBkZXB0aE1hbmFnZXI7CisgIHJldHVybiAhQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KSAmJiBkZXB0aE1hbmFnZXIuSXNXaXRoaW5NYXhEZXB0aCgpOworfQorCitDWEZBX0ZNV2hpbGVFeHByZXNzaW9uOjpDWEZBX0ZNV2hpbGVFeHByZXNzaW9uKAorICAgIHVpbnQzMl90IGxpbmUsCisgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwQ29uZGl0aW9uLAorICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gcEV4cHJlc3Npb24pCisgICAgOiBDWEZBX0ZNTG9vcEV4cHJlc3Npb24obGluZSksCisgICAgICBtX3BDb25kaXRpb24oc3RkOjptb3ZlKHBDb25kaXRpb24pKSwKKyAgICAgIG1fcEV4cHJlc3Npb24oc3RkOjptb3ZlKHBFeHByZXNzaW9uKSkge30KKworQ1hGQV9GTVdoaWxlRXhwcmVzc2lvbjo6fkNYRkFfRk1XaGlsZUV4cHJlc3Npb24oKSB7fQorCitib29sIENYRkFfRk1XaGlsZUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgfHwgIWRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGphdmFzY3JpcHQgPDwgTCJ3aGlsZSAoIjsKKyAgaWYgKCFtX3BDb25kaXRpb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGphdmFzY3JpcHQgPDwgTCIpXG4iOworICBpZiAoQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFtX3BFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCkpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gIUNYRkFfSXNUb29CaWcoamF2YXNjcmlwdCk7Cit9CisKK2Jvb2wgQ1hGQV9GTVdoaWxlRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7CisgIENYRkFfRk1Ub0phdmFTY3JpcHREZXB0aCBkZXB0aE1hbmFnZXI7CisgIGlmIChDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpIHx8ICFkZXB0aE1hbmFnZXIuSXNXaXRoaW5NYXhEZXB0aCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOworICBqYXZhc2NyaXB0IDw8IEwiID0gMDtcbiI7CisgIGphdmFzY3JpcHQgPDwgTCJ3aGlsZSAoIjsKKyAgaWYgKCFtX3BDb25kaXRpb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGphdmFzY3JpcHQgPDwgTCIpXG4iOworICBpZiAoQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFtX3BFeHByZXNzaW9uLT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIHJldHVybiAhQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KTsKK30KKworQ1hGQV9GTUJyZWFrRXhwcmVzc2lvbjo6Q1hGQV9GTUJyZWFrRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lKQorICAgIDogQ1hGQV9GTUV4cHJlc3Npb24obGluZSwgWEZBX0ZNX0VYUFRZUEVfQlJFQUspIHt9CisKK0NYRkFfRk1CcmVha0V4cHJlc3Npb246On5DWEZBX0ZNQnJlYWtFeHByZXNzaW9uKCkge30KKworYm9vbCBDWEZBX0ZNQnJlYWtFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7CisgIENYRkFfRk1Ub0phdmFTY3JpcHREZXB0aCBkZXB0aE1hbmFnZXI7CisgIGlmIChDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpIHx8ICFkZXB0aE1hbmFnZXIuSXNXaXRoaW5NYXhEZXB0aCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOworICBqYXZhc2NyaXB0IDw8IEwiID0gMDtcbiI7CisgIGphdmFzY3JpcHQgPDwgTCJicmVhaztcbiI7CisgIHJldHVybiAhQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KTsKK30KKworYm9vbCBDWEZBX0ZNQnJlYWtFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgfHwgIWRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7CisgIGphdmFzY3JpcHQgPDwgTCIgPSAwO1xuIjsKKyAgamF2YXNjcmlwdCA8PCBMImJyZWFrO1xuIjsKKyAgcmV0dXJuICFDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpOworfQorCitDWEZBX0ZNQ29udGludWVFeHByZXNzaW9uOjpDWEZBX0ZNQ29udGludWVFeHByZXNzaW9uKHVpbnQzMl90IGxpbmUpCisgICAgOiBDWEZBX0ZNRXhwcmVzc2lvbihsaW5lLCBYRkFfRk1fRVhQVFlQRV9DT05USU5VRSkge30KKworQ1hGQV9GTUNvbnRpbnVlRXhwcmVzc2lvbjo6fkNYRkFfRk1Db250aW51ZUV4cHJlc3Npb24oKSB7fQorCitib29sIENYRkFfRk1Db250aW51ZUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgfHwgIWRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7CisgIGphdmFzY3JpcHQgPDwgTCIgPSAwO1xuIjsKKyAgamF2YXNjcmlwdCA8PCBMImNvbnRpbnVlO1xuIjsKKyAgcmV0dXJuICFDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpOworfQorCitib29sIENYRkFfRk1Db250aW51ZUV4cHJlc3Npb246OlRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgeworICBDWEZBX0ZNVG9KYXZhU2NyaXB0RGVwdGggZGVwdGhNYW5hZ2VyOworICBpZiAoQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KSB8fCAhZGVwdGhNYW5hZ2VyLklzV2l0aGluTWF4RGVwdGgoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsKKyAgamF2YXNjcmlwdCA8PCBMIiA9IDA7XG4iOworICBqYXZhc2NyaXB0IDw8IEwiY29udGludWU7XG4iOworICByZXR1cm4gIUNYRkFfSXNUb29CaWcoamF2YXNjcmlwdCk7Cit9CisKK0NYRkFfRk1Gb3JFeHByZXNzaW9uOjpDWEZBX0ZNRm9yRXhwcmVzc2lvbigKKyAgICB1aW50MzJfdCBsaW5lLAorICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c1ZhcmlhbnQsCisgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwQXNzaWdubWVudCwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBBY2Nlc3NvciwKKyAgICBpbnQzMl90IGlEaXJlY3Rpb24sCisgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwU3RlcCwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IHBMaXN0KQorICAgIDogQ1hGQV9GTUxvb3BFeHByZXNzaW9uKGxpbmUpLAorICAgICAgbV93c1ZhcmlhbnQod3NWYXJpYW50KSwKKyAgICAgIG1fcEFzc2lnbm1lbnQoc3RkOjptb3ZlKHBBc3NpZ25tZW50KSksCisgICAgICBtX3BBY2Nlc3NvcihzdGQ6Om1vdmUocEFjY2Vzc29yKSksCisgICAgICBtX2JEaXJlY3Rpb24oaURpcmVjdGlvbiA9PSAxKSwKKyAgICAgIG1fcFN0ZXAoc3RkOjptb3ZlKHBTdGVwKSksCisgICAgICBtX3BMaXN0KHN0ZDo6bW92ZShwTGlzdCkpIHt9CisKK0NYRkFfRk1Gb3JFeHByZXNzaW9uOjp+Q1hGQV9GTUZvckV4cHJlc3Npb24oKSB7fQorCitib29sIENYRkFfRk1Gb3JFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7CisgIENYRkFfRk1Ub0phdmFTY3JpcHREZXB0aCBkZXB0aE1hbmFnZXI7CisgIGlmIChDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpIHx8ICFkZXB0aE1hbmFnZXIuSXNXaXRoaW5NYXhEZXB0aCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBqYXZhc2NyaXB0IDw8IEwie1xudmFyICI7CisgIFdpZGVTdHJpbmcgdGVtcFZhcmlhbnQ7CisgIGlmIChtX3dzVmFyaWFudFswXSA9PSBMJyEnKSB7CisgICAgdGVtcFZhcmlhbnQgPSBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSICsKKyAgICAgICAgICAgICAgICAgIG1fd3NWYXJpYW50LlJpZ2h0KG1fd3NWYXJpYW50LkdldExlbmd0aCgpIC0gMSk7CisgICAgamF2YXNjcmlwdCA8PCB0ZW1wVmFyaWFudDsKKyAgfSBlbHNlIHsKKyAgICB0ZW1wVmFyaWFudCA9IG1fd3NWYXJpYW50OworICAgIGphdmFzY3JpcHQgPDwgbV93c1ZhcmlhbnQ7CisgIH0KKyAgamF2YXNjcmlwdCA8PCBMIiA9IG51bGw7XG4iOworICBqYXZhc2NyaXB0IDw8IEwiZm9yICgiOworICBqYXZhc2NyaXB0IDw8IHRlbXBWYXJpYW50OworICBqYXZhc2NyaXB0IDw8IEwiID0gIjsKKyAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKEdFVEZNVkFMVUUpOworICBqYXZhc2NyaXB0IDw8IEwiKCI7CisgIGlmICghbV9wQXNzaWdubWVudC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpKQorICAgIHJldHVybiBmYWxzZTsKKyAgamF2YXNjcmlwdCA8PCBMIik7ICI7CisgIGphdmFzY3JpcHQgPDwgdGVtcFZhcmlhbnQ7CisKKyAgamF2YXNjcmlwdCA8PCAobV9iRGlyZWN0aW9uID8ga0xlc3NFcXVhbCA6IGtHcmVhdGVyRXF1YWwpOworICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoR0VURk1WQUxVRSk7CisgIGphdmFzY3JpcHQgPDwgTCIoIjsKKyAgaWYgKCFtX3BBY2Nlc3Nvci0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpKQorICAgIHJldHVybiBmYWxzZTsKKyAgamF2YXNjcmlwdCA8PCBMIik7ICI7CisgIGphdmFzY3JpcHQgPDwgdGVtcFZhcmlhbnQ7CisgIGphdmFzY3JpcHQgPDwgKG1fYkRpcmVjdGlvbiA/IGtQbHVzRXF1YWwgOiBrTWludXNFcXVhbCk7CisgIGlmIChDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAobV9wU3RlcCkgeworICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsKKyAgICBqYXZhc2NyaXB0IDw8IEwiKCI7CisgICAgaWYgKCFtX3BTdGVwLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgamF2YXNjcmlwdCA8PCBMIikiOworICB9IGVsc2UgeworICAgIGphdmFzY3JpcHQgPDwgTCIxIjsKKyAgfQorICBqYXZhc2NyaXB0IDw8IEwiKVxuIjsKKyAgaWYgKCFtX3BMaXN0LT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCkpCisgICAgcmV0dXJuIGZhbHNlOworICBqYXZhc2NyaXB0IDw8IEwifVxuIjsKKyAgcmV0dXJuICFDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpOworfQorCitib29sIENYRkFfRk1Gb3JFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgfHwgIWRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7CisgIGphdmFzY3JpcHQgPDwgTCIgPSAwO1xuIjsKKyAgamF2YXNjcmlwdCA8PCBMIntcbnZhciAiOworICBXaWRlU3RyaW5nIHRlbXBWYXJpYW50OworICBpZiAobV93c1ZhcmlhbnRbMF0gPT0gTCchJykgeworICAgIHRlbXBWYXJpYW50ID0gRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiArCisgICAgICAgICAgICAgICAgICBtX3dzVmFyaWFudC5SaWdodChtX3dzVmFyaWFudC5HZXRMZW5ndGgoKSAtIDEpOworICAgIGphdmFzY3JpcHQgPDwgdGVtcFZhcmlhbnQ7CisgIH0gZWxzZSB7CisgICAgdGVtcFZhcmlhbnQgPSBtX3dzVmFyaWFudDsKKyAgICBqYXZhc2NyaXB0IDw8IG1fd3NWYXJpYW50OworICB9CisgIGphdmFzY3JpcHQgPDwgTCIgPSBudWxsO1xuIjsKKyAgamF2YXNjcmlwdCA8PCBMImZvciAoIjsKKyAgamF2YXNjcmlwdCA8PCB0ZW1wVmFyaWFudDsKKyAgamF2YXNjcmlwdCA8PCBMIiA9ICI7CisgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsKKyAgamF2YXNjcmlwdCA8PCBMIigiOworICBpZiAoIW1fcEFzc2lnbm1lbnQtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGphdmFzY3JpcHQgPDwgTCIpOyAiOworICBqYXZhc2NyaXB0IDw8IHRlbXBWYXJpYW50OworCisgIGphdmFzY3JpcHQgPDwgKG1fYkRpcmVjdGlvbiA/IGtMZXNzRXF1YWwgOiBrR3JlYXRlckVxdWFsKTsKKyAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKEdFVEZNVkFMVUUpOworICBqYXZhc2NyaXB0IDw8IEwiKCI7CisgIGlmICghbV9wQWNjZXNzb3ItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGphdmFzY3JpcHQgPDwgTCIpOyAiOworICBqYXZhc2NyaXB0IDw8IHRlbXBWYXJpYW50OworICBqYXZhc2NyaXB0IDw8IEwiICs9ICI7CisgIGphdmFzY3JpcHQgPDwgKG1fYkRpcmVjdGlvbiA/IGtQbHVzRXF1YWwgOiBrTWludXNFcXVhbCk7CisgIGlmIChDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAobV9wU3RlcCkgeworICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsKKyAgICBqYXZhc2NyaXB0IDw8IEwiKCI7CisgICAgaWYgKCFtX3BTdGVwLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgamF2YXNjcmlwdCA8PCBMIikiOworICAgIGlmIChDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9IGVsc2UgeworICAgIGphdmFzY3JpcHQgPDwgTCIxIjsKKyAgfQorICBqYXZhc2NyaXB0IDw8IEwiKVxuIjsKKyAgaWYgKCFtX3BMaXN0LT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGphdmFzY3JpcHQgPDwgTCJ9XG4iOworICByZXR1cm4gIUNYRkFfSXNUb29CaWcoamF2YXNjcmlwdCk7Cit9CisKK0NYRkFfRk1Gb3JlYWNoRXhwcmVzc2lvbjo6Q1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uKAorICAgIHVpbnQzMl90IGxpbmUsCisgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzSWRlbnRpZmllciwKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+PiYmIHBBY2Nlc3NvcnMsCisgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBwTGlzdCkKKyAgICA6IENYRkFfRk1Mb29wRXhwcmVzc2lvbihsaW5lKSwKKyAgICAgIG1fd3NJZGVudGlmaWVyKHdzSWRlbnRpZmllciksCisgICAgICBtX3BBY2Nlc3NvcnMoc3RkOjptb3ZlKHBBY2Nlc3NvcnMpKSwKKyAgICAgIG1fcExpc3Qoc3RkOjptb3ZlKHBMaXN0KSkge30KKworQ1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uOjp+Q1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uKCkge30KKworYm9vbCBDWEZBX0ZNRm9yZWFjaEV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgfHwgIWRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGphdmFzY3JpcHQgPDwgTCJ7XG4iOworICBqYXZhc2NyaXB0IDw8IEwidmFyICI7CisgIGlmIChtX3dzSWRlbnRpZmllclswXSA9PSBMJyEnKSB7CisgICAgV2lkZVN0cmluZyB0ZW1wSWRlbnRpZmllciA9CisgICAgICAgIEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKworICAgICAgICBtX3dzSWRlbnRpZmllci5SaWdodChtX3dzSWRlbnRpZmllci5HZXRMZW5ndGgoKSAtIDEpOworICAgIGphdmFzY3JpcHQgPDwgdGVtcElkZW50aWZpZXI7CisgIH0gZWxzZSB7CisgICAgamF2YXNjcmlwdCA8PCBtX3dzSWRlbnRpZmllcjsKKyAgfQorICBqYXZhc2NyaXB0IDw8IEwiID0gbnVsbDtcbiI7CisgIGphdmFzY3JpcHQgPDwgTCJ2YXIgIjsKKyAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVk7CisgIGphdmFzY3JpcHQgPDwgTCIgPSAiOworICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoQ09OQ0FURk1PQkpFQ1QpOworICBqYXZhc2NyaXB0IDw8IEwiKCI7CisKKyAgZm9yIChjb25zdCBhdXRvJiBleHByIDogbV9wQWNjZXNzb3JzKSB7CisgICAgaWYgKCFleHByLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGV4cHIgIT0gbV9wQWNjZXNzb3JzLmJhY2soKSkKKyAgICAgIGphdmFzY3JpcHQgPDwgTCIsICI7CisgIH0KKyAgamF2YXNjcmlwdCA8PCBMIik7XG4iOworICBqYXZhc2NyaXB0IDw8IEwidmFyICI7CisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZSU5ERVg7CisgIGphdmFzY3JpcHQgPDwgKEwiID0gMDtcbiIpOworICBqYXZhc2NyaXB0IDw8IEwid2hpbGUoIjsKKyAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVlJTkRFWDsKKyAgamF2YXNjcmlwdCA8PCBMIiA8ICI7CisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZOworICBqYXZhc2NyaXB0IDw8IEwiLmxlbmd0aClcbntcbiI7CisgIGlmIChtX3dzSWRlbnRpZmllclswXSA9PSBMJyEnKSB7CisgICAgV2lkZVN0cmluZyB0ZW1wSWRlbnRpZmllciA9CisgICAgICAgIEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKworICAgICAgICBtX3dzSWRlbnRpZmllci5SaWdodChtX3dzSWRlbnRpZmllci5HZXRMZW5ndGgoKSAtIDEpOworICAgIGphdmFzY3JpcHQgPDwgdGVtcElkZW50aWZpZXI7CisgIH0gZWxzZSB7CisgICAgamF2YXNjcmlwdCA8PCBtX3dzSWRlbnRpZmllcjsKKyAgfQorICBqYXZhc2NyaXB0IDw8IEwiID0gIjsKKyAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVk7CisgIGphdmFzY3JpcHQgPDwgTCJbIjsKKyAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVlJTkRFWDsKKyAgamF2YXNjcmlwdCA8PCBMIisrXTtcbiI7CisgIGlmICghbV9wTGlzdC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpKQorICAgIHJldHVybiBmYWxzZTsKKyAgamF2YXNjcmlwdCA8PCBMIn1cbiI7CisgIGphdmFzY3JpcHQgPDwgTCJ9XG4iOworICByZXR1cm4gIUNYRkFfSXNUb29CaWcoamF2YXNjcmlwdCk7Cit9CisKK2Jvb2wgQ1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgfHwgIWRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7CisgIGphdmFzY3JpcHQgPDwgTCIgPSAwO1xuIjsKKyAgamF2YXNjcmlwdCA8PCBMIntcbiI7CisgIGphdmFzY3JpcHQgPDwgTCJ2YXIgIjsKKyAgaWYgKG1fd3NJZGVudGlmaWVyWzBdID09IEwnIScpIHsKKyAgICBXaWRlU3RyaW5nIHRlbXBJZGVudGlmaWVyID0KKyAgICAgICAgRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiArCisgICAgICAgIG1fd3NJZGVudGlmaWVyLlJpZ2h0KG1fd3NJZGVudGlmaWVyLkdldExlbmd0aCgpIC0gMSk7CisgICAgamF2YXNjcmlwdCA8PCB0ZW1wSWRlbnRpZmllcjsKKyAgfSBlbHNlIHsKKyAgICBqYXZhc2NyaXB0IDw8IG1fd3NJZGVudGlmaWVyOworICB9CisgIGphdmFzY3JpcHQgPDwgTCIgPSBudWxsO1xuIjsKKyAgamF2YXNjcmlwdCA8PCBMInZhciAiOworICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVCTE9DS1RFTVBBUlJBWTsKKyAgamF2YXNjcmlwdCA8PCBMIiA9ICI7CisgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhDT05DQVRGTU9CSkVDVCk7CisgIGphdmFzY3JpcHQgPDwgTCIoIjsKKyAgZm9yIChjb25zdCBhdXRvJiBleHByIDogbV9wQWNjZXNzb3JzKSB7CisgICAgaWYgKCFleHByLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGV4cHIgIT0gbV9wQWNjZXNzb3JzLmJhY2soKSkKKyAgICAgIGphdmFzY3JpcHQgPDwgTCIsICI7CisgIH0KKyAgamF2YXNjcmlwdCA8PCBMIik7XG4iOworICBqYXZhc2NyaXB0IDw8IEwidmFyICI7CisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZSU5ERVg7CisgIGphdmFzY3JpcHQgPDwgTCIgPSAwO1xuIjsKKyAgamF2YXNjcmlwdCA8PCBMIndoaWxlKCI7CisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZSU5ERVg7CisgIGphdmFzY3JpcHQgPDwgTCIgPCAiOworICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVCTE9DS1RFTVBBUlJBWTsKKyAgamF2YXNjcmlwdCA8PCBMIi5sZW5ndGgpXG57XG4iOworICBpZiAobV93c0lkZW50aWZpZXJbMF0gPT0gTCchJykgeworICAgIFdpZGVTdHJpbmcgdGVtcElkZW50aWZpZXIgPQorICAgICAgICBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSICsKKyAgICAgICAgbV93c0lkZW50aWZpZXIuUmlnaHQobV93c0lkZW50aWZpZXIuR2V0TGVuZ3RoKCkgLSAxKTsKKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBJZGVudGlmaWVyOworICB9IGVsc2UgeworICAgIGphdmFzY3JpcHQgPDwgbV93c0lkZW50aWZpZXI7CisgIH0KKyAgamF2YXNjcmlwdCA8PCBMIiA9ICI7CisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZOworICBqYXZhc2NyaXB0IDw8IEwiWyI7CisgIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZSU5ERVg7CisgIGphdmFzY3JpcHQgPDwgTCIrK107XG4iOworICBpZiAoIW1fcExpc3QtPlRvSW1wbGllZFJldHVybkpTKGphdmFzY3JpcHQpKQorICAgIHJldHVybiBmYWxzZTsKKyAgamF2YXNjcmlwdCA8PCBMIn1cbiI7CisgIGphdmFzY3JpcHQgPDwgTCJ9XG4iOworICByZXR1cm4gIUNYRkFfSXNUb29CaWcoamF2YXNjcmlwdCk7Cit9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9mbTJqcy9jeGZhX2ZtZXhwcmVzc2lvbi5oIGIveGZhL2Z4ZmEvZm0yanMvY3hmYV9mbWV4cHJlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmJiYTNhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvZm0yanMvY3hmYV9mbWV4cHJlc3Npb24uaApAQCAtMCwwICsxLDIxNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX0ZNMkpTX0NYRkFfRk1FWFBSRVNTSU9OX0hfCisjZGVmaW5lIFhGQV9GWEZBX0ZNMkpTX0NYRkFfRk1FWFBSRVNTSU9OX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvZm0yanMvY3hmYV9mbXNpbXBsZWV4cHJlc3Npb24uaCIKKworZW51bSBYRkFfRk1fRVhQVFlQRSB7CisgIFhGQV9GTV9FWFBUWVBFX1VOS05PV04sCisgIFhGQV9GTV9FWFBUWVBFX0ZVTkMsCisgIFhGQV9GTV9FWFBUWVBFX1ZBUiwKKyAgWEZBX0ZNX0VYUFRZUEVfRVhQLAorICBYRkFfRk1fRVhQVFlQRV9CTE9DSywKKyAgWEZBX0ZNX0VYUFRZUEVfSUYsCisgIFhGQV9GTV9FWFBUWVBFX0JSRUFLLAorICBYRkFfRk1fRVhQVFlQRV9DT05USU5VRSwKK307CisKK2NsYXNzIENGWF9XaWRlVGV4dEJ1ZjsKKworY2xhc3MgQ1hGQV9GTUV4cHJlc3Npb24geworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1hGQV9GTUV4cHJlc3Npb24odWludDMyX3QgbGluZSk7CisgIENYRkFfRk1FeHByZXNzaW9uKHVpbnQzMl90IGxpbmUsIFhGQV9GTV9FWFBUWVBFIHR5cGUpOworICB2aXJ0dWFsIH5DWEZBX0ZNRXhwcmVzc2lvbigpIHt9CisKKyAgdmlydHVhbCBib29sIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOworICB2aXJ0dWFsIGJvb2wgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJik7CisgIHVpbnQzMl90IEdldExpbmUoKSB7IHJldHVybiBtX2xpbmU7IH0KKyAgWEZBX0ZNX0VYUFRZUEUgR2V0RXhwVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZTsgfQorCisgcHJpdmF0ZToKKyAgWEZBX0ZNX0VYUFRZUEUgbV90eXBlOworICB1aW50MzJfdCBtX2xpbmU7Cit9OworCitjbGFzcyBDWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uIDogcHVibGljIENYRkFfRk1FeHByZXNzaW9uIHsKKyBwdWJsaWM6CisgIC8vIFRha2VzIG93bmVyc2hpcCBvZiB8YXJndW1lbnRzfCBhbmQgfGV4cHJlc3Npb25zfC4KKyAgQ1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbigKKyAgICAgIHVpbnQzMl90IGxpbmUsCisgICAgICBib29sIGlzR2xvYmFsLAorICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzTmFtZSwKKyAgICAgIHN0ZDo6dmVjdG9yPFdpZGVTdHJpbmdWaWV3PiYmIGFyZ3VtZW50cywKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4+JiYgZXhwcmVzc2lvbnMpOworICB+Q1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbigpIG92ZXJyaWRlOworCisgIGJvb2wgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgb3ZlcnJpZGU7CisgIGJvb2wgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJikgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBXaWRlU3RyaW5nVmlldyBtX3dzTmFtZTsKKyAgc3RkOjp2ZWN0b3I8V2lkZVN0cmluZ1ZpZXc+IG1fcEFyZ3VtZW50czsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPj4gbV9wRXhwcmVzc2lvbnM7CisgIGJvb2wgbV9pc0dsb2JhbDsKK307CisKK2NsYXNzIENYRkFfRk1WYXJFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1FeHByZXNzaW9uIHsKKyBwdWJsaWM6CisgIENYRkFfRk1WYXJFeHByZXNzaW9uKHVpbnQzMl90IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gcEluaXQpOworICB+Q1hGQV9GTVZhckV4cHJlc3Npb24oKSBvdmVycmlkZTsKKworICBib29sIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOworICBib29sIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgV2lkZVN0cmluZ1ZpZXcgbV93c05hbWU7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gbV9wSW5pdDsKK307CisKK2NsYXNzIENYRkFfRk1FeHBFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1FeHByZXNzaW9uIHsKKyBwdWJsaWM6CisgIENYRkFfRk1FeHBFeHByZXNzaW9uKHVpbnQzMl90IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cHJlc3Npb24pOworICB+Q1hGQV9GTUV4cEV4cHJlc3Npb24oKSBvdmVycmlkZTsKKworICBib29sIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOworICBib29sIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBtX3BFeHByZXNzaW9uOworfTsKKworY2xhc3MgQ1hGQV9GTUJsb2NrRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNRXhwcmVzc2lvbiB7CisgcHVibGljOgorICBDWEZBX0ZNQmxvY2tFeHByZXNzaW9uKAorICAgICAgdWludDMyX3QgbGluZSwKKyAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4+JiYgcEV4cHJlc3Npb25MaXN0KTsKKyAgfkNYRkFfRk1CbG9ja0V4cHJlc3Npb24oKSBvdmVycmlkZTsKKworICBib29sIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOworICBib29sIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPj4gbV9FeHByZXNzaW9uTGlzdDsKK307CisKK2NsYXNzIENYRkFfRk1Eb0V4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUV4cHJlc3Npb24geworIHB1YmxpYzoKKyAgQ1hGQV9GTURvRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lLCBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IHBMaXN0KTsKKyAgfkNYRkFfRk1Eb0V4cHJlc3Npb24oKSBvdmVycmlkZTsKKworICBib29sIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOworICBib29sIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBtX3BMaXN0OworfTsKKworY2xhc3MgQ1hGQV9GTUlmRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNRXhwcmVzc2lvbiB7CisgcHVibGljOgorICBDWEZBX0ZNSWZFeHByZXNzaW9uKHVpbnQzMl90IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IHBJZkV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBwRWxzZUV4cHJlc3Npb24pOworICB+Q1hGQV9GTUlmRXhwcmVzc2lvbigpIG92ZXJyaWRlOworCisgIGJvb2wgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgb3ZlcnJpZGU7CisgIGJvb2wgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJikgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IG1fcEV4cHJlc3Npb247CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gbV9wSWZFeHByZXNzaW9uOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IG1fcEVsc2VFeHByZXNzaW9uOworfTsKKworY2xhc3MgQ1hGQV9GTUxvb3BFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1FeHByZXNzaW9uIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENYRkFfRk1Mb29wRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lKSA6IENYRkFfRk1FeHByZXNzaW9uKGxpbmUpIHt9CisgIH5DWEZBX0ZNTG9vcEV4cHJlc3Npb24oKSBvdmVycmlkZTsKKyAgYm9vbCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKKyAgYm9vbCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKSBvdmVycmlkZTsKK307CisKK2NsYXNzIENYRkFfRk1XaGlsZUV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUxvb3BFeHByZXNzaW9uIHsKKyBwdWJsaWM6CisgIENYRkFfRk1XaGlsZUV4cHJlc3Npb24odWludDMyX3QgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBDb2RpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IHBFeHByZXNzaW9uKTsKKyAgfkNYRkFfRk1XaGlsZUV4cHJlc3Npb24oKSBvdmVycmlkZTsKKworICBib29sIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOworICBib29sIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBtX3BDb25kaXRpb247CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gbV9wRXhwcmVzc2lvbjsKK307CisKK2NsYXNzIENYRkFfRk1CcmVha0V4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUV4cHJlc3Npb24geworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1hGQV9GTUJyZWFrRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lKTsKKyAgfkNYRkFfRk1CcmVha0V4cHJlc3Npb24oKSBvdmVycmlkZTsKKyAgYm9vbCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKKyAgYm9vbCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKSBvdmVycmlkZTsKK307CisKK2NsYXNzIENYRkFfRk1Db250aW51ZUV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUV4cHJlc3Npb24geworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1hGQV9GTUNvbnRpbnVlRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lKTsKKyAgfkNYRkFfRk1Db250aW51ZUV4cHJlc3Npb24oKSBvdmVycmlkZTsKKyAgYm9vbCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKKyAgYm9vbCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKSBvdmVycmlkZTsKK307CisKK2NsYXNzIENYRkFfRk1Gb3JFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1Mb29wRXhwcmVzc2lvbiB7CisgcHVibGljOgorICBDWEZBX0ZNRm9yRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NWYXJpYW50LAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBBc3NpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBBY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IHBMaXN0KTsKKyAgfkNYRkFfRk1Gb3JFeHByZXNzaW9uKCkgb3ZlcnJpZGU7CisKKyAgYm9vbCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKKyAgYm9vbCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIFdpZGVTdHJpbmdWaWV3IG1fd3NWYXJpYW50OworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IG1fcEFzc2lnbm1lbnQ7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gbV9wQWNjZXNzb3I7CisgIGNvbnN0IGJvb2wgbV9iRGlyZWN0aW9uOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IG1fcFN0ZXA7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gbV9wTGlzdDsKK307CisKK2NsYXNzIENYRkFfRk1Gb3JlYWNoRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNTG9vcEV4cHJlc3Npb24geworIHB1YmxpYzoKKyAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIHxwQWNjZXNzb3JzfC4KKyAgQ1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uKAorICAgICAgdWludDMyX3QgbGluZSwKKyAgICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c0lkZW50aWZpZXIsCisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+PiYmIHBBY2Nlc3NvcnMsCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IHBMaXN0KTsKKyAgfkNYRkFfRk1Gb3JlYWNoRXhwcmVzc2lvbigpIG92ZXJyaWRlOworCisgIGJvb2wgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgb3ZlcnJpZGU7CisgIGJvb2wgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJikgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBXaWRlU3RyaW5nVmlldyBtX3dzSWRlbnRpZmllcjsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPj4gbV9wQWNjZXNzb3JzOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IG1fcExpc3Q7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX0ZNMkpTX0NYRkFfRk1FWFBSRVNTSU9OX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9mbTJqcy9jeGZhX2ZtbGV4ZXIuY3BwIGIveGZhL2Z4ZmEvZm0yanMvY3hmYV9mbWxleGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzVhYmMzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvZm0yanMvY3hmYV9mbWxleGVyLmNwcApAQCAtMCwwICsxLDQ1NiBAQAorLy8gQ29wcmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9mbTJqcy9jeGZhX2ZtbGV4ZXIuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2ljdS9zb3VyY2UvY29tbW9uL3VuaWNvZGUvdWNoYXIuaCIKKworbmFtZXNwYWNlIHsKKworYm9vbCBJc0Zvcm1DYWxjQ2hhcmFjdGVyKHdjaGFyX3QgYykgeworICByZXR1cm4gKGMgPj0gMHgwOSAmJiBjIDw9IDB4MEQpIHx8IChjID49IDB4MjAgJiYgYyA8PSAweGQ3RkYpIHx8CisgICAgICAgICAoYyA+PSAweEUwMDAgJiYgYyA8PSAweEZGRkQpOworfQorCitib29sIElzSWRlbnRpZmllckNoYXJhY3Rlcih3Y2hhcl90IGMpIHsKKyAgcmV0dXJuIHVfaXNhbG51bShjKSB8fCBjID09IDB4MDA1RiB8fCAgLy8gJ18nCisgICAgICAgICBjID09IDB4MDAyNDsgICAgICAgICAgICAgICAgICAgIC8vICckJworfQorCitib29sIElzSW5pdGlhbElkZW50aWZpZXJDaGFyYWN0ZXIod2NoYXJfdCBjKSB7CisgIHJldHVybiB1X2lzYWxwaGEoYykgfHwgYyA9PSAweDAwNUYgfHwgIC8vICdfJworICAgICAgICAgYyA9PSAweDAwMjQgfHwgICAgICAgICAgICAgICAgICAvLyAnJCcKKyAgICAgICAgIGMgPT0gMHgwMDIxOyAgICAgICAgICAgICAgICAgICAgLy8gJyEnCit9CisKK2Jvb2wgSXNXaGl0ZXNwYWNlQ2hhcmFjdGVyKHdjaGFyX3QgYykgeworICByZXR1cm4gYyA9PSAweDAwMDkgfHwgIC8vIEhvcml6b250YWwgdGFiCisgICAgICAgICBjID09IDB4MDAwQiB8fCAgLy8gVmVydGljYWwgdGFiCisgICAgICAgICBjID09IDB4MDAwQyB8fCAgLy8gRm9ybSBmZWVkCisgICAgICAgICBjID09IDB4MDAyMDsgICAgLy8gU3BhY2UKK30KKworY29uc3QgWEZBX0ZNS2V5d29yZCBrZXlXb3Jkc1tdID0geworICAgIHtUT0thbmQsIDB4MDAwMDAwMjYsIEwiJiJ9LAorICAgIHtUT0tscGFyZW4sIDB4MDAwMDAwMjgsIEwiKCJ9LAorICAgIHtUT0tycGFyZW4sIDB4MDAwMDAwMjksIEwiKSJ9LAorICAgIHtUT0ttdWwsIDB4MDAwMDAwMmEsIEwiKiJ9LAorICAgIHtUT0twbHVzLCAweDAwMDAwMDJiLCBMIisifSwKKyAgICB7VE9LY29tbWEsIDB4MDAwMDAwMmMsIEwiLCJ9LAorICAgIHtUT0ttaW51cywgMHgwMDAwMDAyZCwgTCItIn0sCisgICAge1RPS2RvdCwgMHgwMDAwMDAyZSwgTCIuIn0sCisgICAge1RPS2RpdiwgMHgwMDAwMDAyZiwgTCIvIn0sCisgICAge1RPS2x0LCAweDAwMDAwMDNjLCBMIjwifSwKKyAgICB7VE9LYXNzaWduLCAweDAwMDAwMDNkLCBMIj0ifSwKKyAgICB7VE9LZ3QsIDB4MDAwMDAwM2UsIEwiPiJ9LAorICAgIHtUT0tsYnJhY2tldCwgMHgwMDAwMDA1YiwgTCJbIn0sCisgICAge1RPS3JicmFja2V0LCAweDAwMDAwMDVkLCBMIl0ifSwKKyAgICB7VE9Lb3IsIDB4MDAwMDAwN2MsIEwifCJ9LAorICAgIHtUT0tkb3RzY3JlYW0sIDB4MDAwMGVjMTEsIEwiLiMifSwKKyAgICB7VE9LZG90c3RhciwgMHgwMDAwZWMxOCwgTCIuKiJ9LAorICAgIHtUT0tkb3Rkb3QsIDB4MDAwMGVjMWMsIEwiLi4ifSwKKyAgICB7VE9LbGUsIDB4MDAwMTMzZjksIEwiPD0ifSwKKyAgICB7VE9LbmUsIDB4MDAwMTMzZmEsIEwiPD4ifSwKKyAgICB7VE9LZXEsIDB4MDAwMTM5MWEsIEwiPT0ifSwKKyAgICB7VE9LZ2UsIDB4MDAwMTNlM2IsIEwiPj0ifSwKKyAgICB7VE9LZG8sIDB4MDAwMjAxNTMsIEwiZG8ifSwKKyAgICB7VE9La3NlcSwgMHgwMDAyMDY3NiwgTCJlcSJ9LAorICAgIHtUT0trc2dlLCAweDAwMDIxMGFjLCBMImdlIn0sCisgICAge1RPS2tzZ3QsIDB4MDAwMjEwYmIsIEwiZ3QifSwKKyAgICB7VE9LaWYsIDB4MDAwMjFhZWYsIEwiaWYifSwKKyAgICB7VE9LaW4sIDB4MDAwMjFhZjcsIEwiaW4ifSwKKyAgICB7VE9La3NsZSwgMHgwMDAyMmE1MSwgTCJsZSJ9LAorICAgIHtUT0trc2x0LCAweDAwMDIyYTYwLCBMImx0In0sCisgICAge1RPS2tzbmUsIDB4MDAwMjM0OTMsIEwibmUifSwKKyAgICB7VE9La3NvciwgMHgwMDAyMzljMSwgTCJvciJ9LAorICAgIHtUT0tudWxsLCAweDA1MjkzMWJiLCBMIm51bGwifSwKKyAgICB7VE9LYnJlYWssIDB4MDU1MThjMjUsIEwiYnJlYWsifSwKKyAgICB7VE9La3NhbmQsIDB4MDlmOWRiMzMsIEwiYW5kIn0sCisgICAge1RPS2VuZCwgMHgwYTYzMTQzNywgTCJlbmQifSwKKyAgICB7VE9LZW9mLCAweDBhNjMxOTVhLCBMImVvZiJ9LAorICAgIHtUT0tmb3IsIDB4MGE3ZDY3YTcsIEwiZm9yIn0sCisgICAge1RPS25hbiwgMHgwYjRmOTFkZCwgTCJuYW4ifSwKKyAgICB7VE9La3Nub3QsIDB4MGI0ZmQ5YjEsIEwibm90In0sCisgICAge1RPS3ZhciwgMHgwYzIyMDNlOSwgTCJ2YXIifSwKKyAgICB7VE9LdGhlbiwgMHgyZDU3MzhjZiwgTCJ0aGVuIn0sCisgICAge1RPS2Vsc2UsIDB4NDVmNjVlZTksIEwiZWxzZSJ9LAorICAgIHtUT0tleGl0LCAweDQ3MzFkNmJhLCBMImV4aXQifSwKKyAgICB7VE9LZG93bnRvLCAweDRjYWFkYzNiLCBMImRvd250byJ9LAorICAgIHtUT0tyZXR1cm4sIDB4NGRiOGJkNjAsIEwicmV0dXJuIn0sCisgICAge1RPS2luZmluaXR5LCAweDVjMGEwMTBhLCBMImluZmluaXR5In0sCisgICAge1RPS2VuZHdoaWxlLCAweDVjNjRiZmYwLCBMImVuZHdoaWxlIn0sCisgICAge1RPS2ZvcmVhY2gsIDB4NjdlMzFmMzgsIEwiZm9yZWFjaCJ9LAorICAgIHtUT0tlbmRmdW5jLCAweDY4Zjk4NGEzLCBMImVuZGZ1bmMifSwKKyAgICB7VE9LZWxzZWlmLCAweDc4MjUzMjE4LCBMImVsc2VpZiJ9LAorICAgIHtUT0t3aGlsZSwgMHg4NDIyOTI1OSwgTCJ3aGlsZSJ9LAorICAgIHtUT0tlbmRmb3IsIDB4OGFiNDlkN2UsIEwiZW5kZm9yIn0sCisgICAge1RPS3Rocm93LCAweDhkYjA1Yzk0LCBMInRocm93In0sCisgICAge1RPS3N0ZXAsIDB4YTdhNzg4N2MsIEwic3RlcCJ9LAorICAgIHtUT0t1cHRvLCAweGI1MTU1MzI4LCBMInVwdG8ifSwKKyAgICB7VE9LY29udGludWUsIDB4YzAzNDA2ODUsIEwiY29udGludWUifSwKKyAgICB7VE9LZnVuYywgMHhjZGNlNjBlYywgTCJmdW5jIn0sCisgICAge1RPS2VuZGlmLCAweGUwZThmZWU2LCBMImVuZGlmIn0sCit9OworCitjb25zdCBYRkFfRk1fVE9LRU4gS0VZV09SRF9TVEFSVCA9IFRPS2RvOworY29uc3QgWEZBX0ZNX1RPS0VOIEtFWVdPUkRfRU5EID0gVE9LZW5kaWY7CisKK2NvbnN0IHdjaGFyX3QqIHRva2VuU3RyaW5nc1tdID0geworICAgIEwiVE9LYW5kIiwgICAgICAgIEwiVE9LbHBhcmVuIiwgICAgIEwiVE9LcnBhcmVuIiwgICBMIlRPS211bCIsCisgICAgTCJUT0twbHVzIiwgICAgICAgTCJUT0tjb21tYSIsICAgICAgTCJUT0ttaW51cyIsICAgIEwiVE9LZG90IiwKKyAgICBMIlRPS2RpdiIsICAgICAgICBMIlRPS2x0IiwgICAgICAgICBMIlRPS2Fzc2lnbiIsICAgTCJUT0tndCIsCisgICAgTCJUT0tsYnJhY2tldCIsICAgTCJUT0tyYnJhY2tldCIsICAgTCJUT0tvciIsICAgICAgIEwiVE9LZG90c2NyZWFtIiwKKyAgICBMIlRPS2RvdHN0YXIiLCAgICBMIlRPS2RvdGRvdCIsICAgICBMIlRPS2xlIiwgICAgICAgTCJUT0tuZSIsCisgICAgTCJUT0tlcSIsICAgICAgICAgTCJUT0tnZSIsICAgICAgICAgTCJUT0tkbyIsICAgICAgIEwiVE9La3NlcSIsCisgICAgTCJUT0trc2dlIiwgICAgICAgTCJUT0trc2d0IiwgICAgICAgTCJUT0tpZiIsICAgICAgIEwiVE9LaW4iLAorICAgIEwiVE9La3NsZSIsICAgICAgIEwiVE9La3NsdCIsICAgICAgIEwiVE9La3NuZSIsICAgICBMIlRPS2tzb3IiLAorICAgIEwiVE9LbnVsbCIsICAgICAgIEwiVE9LYnJlYWsiLCAgICAgIEwiVE9La3NhbmQiLCAgICBMIlRPS2VuZCIsCisgICAgTCJUT0tlb2YiLCAgICAgICAgTCJUT0tmb3IiLCAgICAgICAgTCJUT0tuYW4iLCAgICAgIEwiVE9La3Nub3QiLAorICAgIEwiVE9LdmFyIiwgICAgICAgIEwiVE9LdGhlbiIsICAgICAgIEwiVE9LZWxzZSIsICAgICBMIlRPS2V4aXQiLAorICAgIEwiVE9LZG93bnRvIiwgICAgIEwiVE9LcmV0dXJuIiwgICAgIEwiVE9LaW5maW5pdHkiLCBMIlRPS2VuZHdoaWxlIiwKKyAgICBMIlRPS2ZvcmVhY2giLCAgICBMIlRPS2VuZGZ1bmMiLCAgICBMIlRPS2Vsc2VpZiIsICAgTCJUT0t3aGlsZSIsCisgICAgTCJUT0tlbmRmb3IiLCAgICAgTCJUT0t0aHJvdyIsICAgICAgTCJUT0tzdGVwIiwgICAgIEwiVE9LdXB0byIsCisgICAgTCJUT0tjb250aW51ZSIsICAgTCJUT0tmdW5jIiwgICAgICAgTCJUT0tlbmRpZiIsICAgIEwiVE9Lc3RhciIsCisgICAgTCJUT0tpZGVudGlmaWVyIiwgTCJUT0t1bmRlcnNjb3JlIiwgTCJUT0tkb2xsYXIiLCAgIEwiVE9LZXhjbGFtYXRpb24iLAorICAgIEwiVE9LY2FsbCIsICAgICAgIEwiVE9Lc3RyaW5nIiwgICAgIEwiVE9LbnVtYmVyIiwgICBMIlRPS3Jlc2VydmVyIiwKK307CisKK1hGQV9GTV9UT0tFTiBUb2tlbml6ZUlkZW50aWZpZXIoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHN0cikgeworICB1aW50MzJfdCBrZXkgPSBGWF9IYXNoQ29kZV9HZXRXKHN0ciwgdHJ1ZSk7CisKKyAgY29uc3QgWEZBX0ZNS2V5d29yZCogZW5kID0gc3RkOjpiZWdpbihrZXlXb3JkcykgKyBLRVlXT1JEX0VORCArIDE7CisgIGNvbnN0IFhGQV9GTUtleXdvcmQqIHJlc3VsdCA9CisgICAgICBzdGQ6Omxvd2VyX2JvdW5kKHN0ZDo6YmVnaW4oa2V5V29yZHMpICsgS0VZV09SRF9TVEFSVCwgZW5kLCBrZXksCisgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IFhGQV9GTUtleXdvcmQmIGl0ZXIsIGNvbnN0IHVpbnQzMl90JiB2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlci5tX2hhc2ggPCB2YWw7CisgICAgICAgICAgICAgICAgICAgICAgIH0pOworICBpZiAocmVzdWx0ICE9IGVuZCAmJiByZXN1bHQtPm1faGFzaCA9PSBrZXkpCisgICAgcmV0dXJuIHJlc3VsdC0+bV90eXBlOworICByZXR1cm4gVE9LaWRlbnRpZmllcjsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRk1Ub2tlbjo6Q1hGQV9GTVRva2VuKCkgOiBtX3R5cGUoVE9LcmVzZXJ2ZXIpLCBtX2xpbmVfbnVtKDEpIHt9CisKK0NYRkFfRk1Ub2tlbjo6Q1hGQV9GTVRva2VuKHVpbnQzMl90IGxpbmVfbnVtKQorICAgIDogbV90eXBlKFRPS3Jlc2VydmVyKSwgbV9saW5lX251bShsaW5lX251bSkge30KKworQ1hGQV9GTVRva2VuOjp+Q1hGQV9GTVRva2VuKCkge30KKworV2lkZVN0cmluZyBDWEZBX0ZNVG9rZW46OlRvRGVidWdTdHJpbmcoKSBjb25zdCB7CisgIFdpZGVTdHJpbmcgc3RyKEwidHlwZSA9ICIpOworICBzdHIgKz0gdG9rZW5TdHJpbmdzW21fdHlwZV07CisgIHN0ciArPSBMIiwgc3RyaW5nID0gIjsKKyAgc3RyICs9IG1fc3RyaW5nOworICBzdHIgKz0gTCIsIGxpbmVfbnVtID0gIjsKKyAgc3RyICs9IHN0ZDo6dG9fd3N0cmluZyhtX2xpbmVfbnVtKS5jX3N0cigpOworICByZXR1cm4gc3RyOworfQorCitDWEZBX0ZNTGV4ZXI6OkNYRkFfRk1MZXhlcihjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NGb3JtQ2FsYykKKyAgICA6IG1fY3Vyc29yKHdzRm9ybUNhbGMudW50ZXJtaW5hdGVkX2Nfc3RyKCkpLAorICAgICAgbV9lbmQobV9jdXJzb3IgKyB3c0Zvcm1DYWxjLkdldExlbmd0aCgpIC0gMSksCisgICAgICBtX2N1cnJlbnRfbGluZSgxKSwKKyAgICAgIG1fbGV4ZXJfZXJyb3IoZmFsc2UpIHt9CisKK0NYRkFfRk1MZXhlcjo6fkNYRkFfRk1MZXhlcigpIHt9CisKK3N0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNVG9rZW4+IENYRkFfRk1MZXhlcjo6TmV4dFRva2VuKCkgeworICBpZiAobV9sZXhlcl9lcnJvcikKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBtX3Rva2VuID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1Ub2tlbj4obV9jdXJyZW50X2xpbmUpOworICB3aGlsZSAobV9jdXJzb3IgPD0gbV9lbmQgJiYgKm1fY3Vyc29yKSB7CisgICAgaWYgKCFJc0Zvcm1DYWxjQ2hhcmFjdGVyKCptX2N1cnNvcikpIHsKKyAgICAgIFJhaXNlRXJyb3IoKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHN3aXRjaCAoKm1fY3Vyc29yKSB7CisgICAgICBjYXNlICdcbic6CisgICAgICAgICsrbV9jdXJyZW50X2xpbmU7CisgICAgICAgIG1fdG9rZW4tPm1fbGluZV9udW0gPSBtX2N1cnJlbnRfbGluZTsKKyAgICAgICAgKyttX2N1cnNvcjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICdccic6CisgICAgICAgICsrbV9jdXJzb3I7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnOyc6CisgICAgICAgIEFkdmFuY2VGb3JDb21tZW50KCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnIic6CisgICAgICAgIG1fdG9rZW4tPm1fdHlwZSA9IFRPS3N0cmluZzsKKyAgICAgICAgQWR2YW5jZUZvclN0cmluZygpOworICAgICAgICByZXR1cm4gc3RkOjptb3ZlKG1fdG9rZW4pOworICAgICAgY2FzZSAnMCc6CisgICAgICBjYXNlICcxJzoKKyAgICAgIGNhc2UgJzInOgorICAgICAgY2FzZSAnMyc6CisgICAgICBjYXNlICc0JzoKKyAgICAgIGNhc2UgJzUnOgorICAgICAgY2FzZSAnNic6CisgICAgICBjYXNlICc3JzoKKyAgICAgIGNhc2UgJzgnOgorICAgICAgY2FzZSAnOSc6CisgICAgICAgIG1fdG9rZW4tPm1fdHlwZSA9IFRPS251bWJlcjsKKyAgICAgICAgQWR2YW5jZUZvck51bWJlcigpOworICAgICAgICByZXR1cm4gc3RkOjptb3ZlKG1fdG9rZW4pOworICAgICAgY2FzZSAnPSc6CisgICAgICAgICsrbV9jdXJzb3I7CisgICAgICAgIGlmIChtX2N1cnNvciA+IG1fZW5kKSB7CisgICAgICAgICAgbV90b2tlbi0+bV90eXBlID0gVE9LYXNzaWduOworICAgICAgICAgIHJldHVybiBzdGQ6Om1vdmUobV90b2tlbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIUlzRm9ybUNhbGNDaGFyYWN0ZXIoKm1fY3Vyc29yKSkgeworICAgICAgICAgIFJhaXNlRXJyb3IoKTsKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAoKm1fY3Vyc29yID09ICc9JykgeworICAgICAgICAgIG1fdG9rZW4tPm1fdHlwZSA9IFRPS2VxOworICAgICAgICAgICsrbV9jdXJzb3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbV90b2tlbi0+bV90eXBlID0gVE9LYXNzaWduOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUobV90b2tlbik7CisgICAgICBjYXNlICc8JzoKKyAgICAgICAgKyttX2N1cnNvcjsKKyAgICAgICAgaWYgKG1fY3Vyc29yID4gbV9lbmQpIHsKKyAgICAgICAgICBtX3Rva2VuLT5tX3R5cGUgPSBUT0tsdDsKKyAgICAgICAgICByZXR1cm4gc3RkOjptb3ZlKG1fdG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFJc0Zvcm1DYWxjQ2hhcmFjdGVyKCptX2N1cnNvcikpIHsKKyAgICAgICAgICBSYWlzZUVycm9yKCk7CisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCptX2N1cnNvciA9PSAnPScpIHsKKyAgICAgICAgICBtX3Rva2VuLT5tX3R5cGUgPSBUT0tsZTsKKyAgICAgICAgICArK21fY3Vyc29yOworICAgICAgICB9IGVsc2UgaWYgKCptX2N1cnNvciA9PSAnPicpIHsKKyAgICAgICAgICBtX3Rva2VuLT5tX3R5cGUgPSBUT0tuZTsKKyAgICAgICAgICArK21fY3Vyc29yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1fdG9rZW4tPm1fdHlwZSA9IFRPS2x0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUobV90b2tlbik7CisgICAgICBjYXNlICc+JzoKKyAgICAgICAgKyttX2N1cnNvcjsKKyAgICAgICAgaWYgKG1fY3Vyc29yID4gbV9lbmQpIHsKKyAgICAgICAgICBtX3Rva2VuLT5tX3R5cGUgPSBUT0tndDsKKyAgICAgICAgICByZXR1cm4gc3RkOjptb3ZlKG1fdG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFJc0Zvcm1DYWxjQ2hhcmFjdGVyKCptX2N1cnNvcikpIHsKKyAgICAgICAgICBSYWlzZUVycm9yKCk7CisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCptX2N1cnNvciA9PSAnPScpIHsKKyAgICAgICAgICBtX3Rva2VuLT5tX3R5cGUgPSBUT0tnZTsKKyAgICAgICAgICArK21fY3Vyc29yOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1fdG9rZW4tPm1fdHlwZSA9IFRPS2d0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUobV90b2tlbik7CisgICAgICBjYXNlICcsJzoKKyAgICAgICAgbV90b2tlbi0+bV90eXBlID0gVE9LY29tbWE7CisgICAgICAgICsrbV9jdXJzb3I7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUobV90b2tlbik7CisgICAgICBjYXNlICcoJzoKKyAgICAgICAgbV90b2tlbi0+bV90eXBlID0gVE9LbHBhcmVuOworICAgICAgICArK21fY3Vyc29yOworICAgICAgICByZXR1cm4gc3RkOjptb3ZlKG1fdG9rZW4pOworICAgICAgY2FzZSAnKSc6CisgICAgICAgIG1fdG9rZW4tPm1fdHlwZSA9IFRPS3JwYXJlbjsKKyAgICAgICAgKyttX2N1cnNvcjsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShtX3Rva2VuKTsKKyAgICAgIGNhc2UgJ1snOgorICAgICAgICBtX3Rva2VuLT5tX3R5cGUgPSBUT0tsYnJhY2tldDsKKyAgICAgICAgKyttX2N1cnNvcjsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShtX3Rva2VuKTsKKyAgICAgIGNhc2UgJ10nOgorICAgICAgICBtX3Rva2VuLT5tX3R5cGUgPSBUT0tyYnJhY2tldDsKKyAgICAgICAgKyttX2N1cnNvcjsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShtX3Rva2VuKTsKKyAgICAgIGNhc2UgJyYnOgorICAgICAgICArK21fY3Vyc29yOworICAgICAgICBtX3Rva2VuLT5tX3R5cGUgPSBUT0thbmQ7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUobV90b2tlbik7CisgICAgICBjYXNlICd8JzoKKyAgICAgICAgKyttX2N1cnNvcjsKKyAgICAgICAgbV90b2tlbi0+bV90eXBlID0gVE9Lb3I7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUobV90b2tlbik7CisgICAgICBjYXNlICcrJzoKKyAgICAgICAgKyttX2N1cnNvcjsKKyAgICAgICAgbV90b2tlbi0+bV90eXBlID0gVE9LcGx1czsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShtX3Rva2VuKTsKKyAgICAgIGNhc2UgJy0nOgorICAgICAgICArK21fY3Vyc29yOworICAgICAgICBtX3Rva2VuLT5tX3R5cGUgPSBUT0ttaW51czsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShtX3Rva2VuKTsKKyAgICAgIGNhc2UgJyonOgorICAgICAgICArK21fY3Vyc29yOworICAgICAgICBtX3Rva2VuLT5tX3R5cGUgPSBUT0ttdWw7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUobV90b2tlbik7CisgICAgICBjYXNlICcvJzogeworICAgICAgICArK21fY3Vyc29yOworICAgICAgICBpZiAobV9jdXJzb3IgPiBtX2VuZCkgeworICAgICAgICAgIG1fdG9rZW4tPm1fdHlwZSA9IFRPS2RpdjsKKyAgICAgICAgICByZXR1cm4gc3RkOjptb3ZlKG1fdG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFJc0Zvcm1DYWxjQ2hhcmFjdGVyKCptX2N1cnNvcikpIHsKKyAgICAgICAgICBSYWlzZUVycm9yKCk7CisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCptX2N1cnNvciAhPSAnLycpIHsKKyAgICAgICAgICBtX3Rva2VuLT5tX3R5cGUgPSBUT0tkaXY7CisgICAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShtX3Rva2VuKTsKKyAgICAgICAgfQorICAgICAgICBBZHZhbmNlRm9yQ29tbWVudCgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgJy4nOgorICAgICAgICArK21fY3Vyc29yOworICAgICAgICBpZiAobV9jdXJzb3IgPiBtX2VuZCkgeworICAgICAgICAgIG1fdG9rZW4tPm1fdHlwZSA9IFRPS2RvdDsKKyAgICAgICAgICByZXR1cm4gc3RkOjptb3ZlKG1fdG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFJc0Zvcm1DYWxjQ2hhcmFjdGVyKCptX2N1cnNvcikpIHsKKyAgICAgICAgICBSYWlzZUVycm9yKCk7CisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKm1fY3Vyc29yID09ICcuJykgeworICAgICAgICAgIG1fdG9rZW4tPm1fdHlwZSA9IFRPS2RvdGRvdDsKKyAgICAgICAgICArK21fY3Vyc29yOworICAgICAgICB9IGVsc2UgaWYgKCptX2N1cnNvciA9PSAnKicpIHsKKyAgICAgICAgICBtX3Rva2VuLT5tX3R5cGUgPSBUT0tkb3RzdGFyOworICAgICAgICAgICsrbV9jdXJzb3I7CisgICAgICAgIH0gZWxzZSBpZiAoKm1fY3Vyc29yID09ICcjJykgeworICAgICAgICAgIG1fdG9rZW4tPm1fdHlwZSA9IFRPS2RvdHNjcmVhbTsKKyAgICAgICAgICArK21fY3Vyc29yOworICAgICAgICB9IGVsc2UgaWYgKCptX2N1cnNvciA8PSAnOScgJiYgKm1fY3Vyc29yID49ICcwJykgeworICAgICAgICAgIG1fdG9rZW4tPm1fdHlwZSA9IFRPS251bWJlcjsKKyAgICAgICAgICAtLW1fY3Vyc29yOworICAgICAgICAgIEFkdmFuY2VGb3JOdW1iZXIoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBtX3Rva2VuLT5tX3R5cGUgPSBUT0tkb3Q7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShtX3Rva2VuKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChJc1doaXRlc3BhY2VDaGFyYWN0ZXIoKm1fY3Vyc29yKSkgeworICAgICAgICAgICsrbV9jdXJzb3I7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFJc0luaXRpYWxJZGVudGlmaWVyQ2hhcmFjdGVyKCptX2N1cnNvcikpIHsKKyAgICAgICAgICBSYWlzZUVycm9yKCk7CisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgQWR2YW5jZUZvcklkZW50aWZpZXIoKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShtX3Rva2VuKTsKKyAgICB9CisgIH0KKworICAvLyBJZiB0aGVyZSBpc24ndCBjdXJyZW50bHkgYSB0b2tlbiB0eXBlIHRoZW4gbWFyayBpdCBFT0YuCisgIGlmIChtX3Rva2VuLT5tX3R5cGUgPT0gVE9LcmVzZXJ2ZXIpCisgICAgbV90b2tlbi0+bV90eXBlID0gVE9LZW9mOworICByZXR1cm4gc3RkOjptb3ZlKG1fdG9rZW4pOworfQorCit2b2lkIENYRkFfRk1MZXhlcjo6QWR2YW5jZUZvck51bWJlcigpIHsKKyAgLy8gVGhpcyB3aWxsIHNldCBlbmQgdG8gdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgZW5kIG9mIHRoZSBudW1iZXIuCisgIHdjaGFyX3QqIGVuZCA9IG51bGxwdHI7CisgIGlmIChtX2N1cnNvcikKKyAgICB3Y3N0b2QoY29uc3RfY2FzdDx3Y2hhcl90Kj4obV9jdXJzb3IpLCAmZW5kKTsKKyAgaWYgKCFlbmQgfHwgRlhTWVNfaXN3YWxwaGEoKmVuZCkpIHsKKyAgICBSYWlzZUVycm9yKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgbV90b2tlbi0+bV9zdHJpbmcgPQorICAgICAgV2lkZVN0cmluZ1ZpZXcobV9jdXJzb3IsIHN0YXRpY19jYXN0PHNpemVfdD4oZW5kIC0gbV9jdXJzb3IpKTsKKyAgbV9jdXJzb3IgPSBlbmQ7Cit9CisKK3ZvaWQgQ1hGQV9GTUxleGVyOjpBZHZhbmNlRm9yU3RyaW5nKCkgeworICBjb25zdCB3Y2hhcl90KiBzdGFydCA9IG1fY3Vyc29yOworICArK21fY3Vyc29yOworICB3aGlsZSAobV9jdXJzb3IgPD0gbV9lbmQgJiYgKm1fY3Vyc29yKSB7CisgICAgaWYgKCFJc0Zvcm1DYWxjQ2hhcmFjdGVyKCptX2N1cnNvcikpCisgICAgICBicmVhazsKKworICAgIGlmICgqbV9jdXJzb3IgPT0gJyInKSB7CisgICAgICAvLyBDaGVjayBmb3IgZXNjYXBlZCAicywgaS5lLiAiIi4KKyAgICAgICsrbV9jdXJzb3I7CisgICAgICAvLyBJZiB0aGUgZW5kIG9mIHRoZSBpbnB1dCBoYXMgYmVlbiByZWFjaGVkIGl0IHdhcyBub3QgZXNjYXBlZC4KKyAgICAgIGlmIChtX2N1cnNvciA+IG1fZW5kKSB7CisgICAgICAgIG1fdG9rZW4tPm1fc3RyaW5nID0KKyAgICAgICAgICAgIFdpZGVTdHJpbmdWaWV3KHN0YXJ0LCBzdGF0aWNfY2FzdDxzaXplX3Q+KG1fY3Vyc29yIC0gc3RhcnQpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgLy8gSWYgdGhlIG5leHQgY2hhcmFjdGVyIGlzIG5vdCBhICIgdGhlbiB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgaGFzIGJlZW4KKyAgICAgIC8vIGZvdW5kLgorICAgICAgaWYgKCptX2N1cnNvciAhPSAnIicpIHsKKyAgICAgICAgaWYgKCFJc0Zvcm1DYWxjQ2hhcmFjdGVyKCptX2N1cnNvcikpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtX3Rva2VuLT5tX3N0cmluZyA9IFdpZGVTdHJpbmdWaWV3KHN0YXJ0LCAobV9jdXJzb3IgLSBzdGFydCkpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgfQorICAgICsrbV9jdXJzb3I7CisgIH0KKworICAvLyBEaWRuJ3QgZmluZCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCisgIFJhaXNlRXJyb3IoKTsKK30KKwordm9pZCBDWEZBX0ZNTGV4ZXI6OkFkdmFuY2VGb3JJZGVudGlmaWVyKCkgeworICBjb25zdCB3Y2hhcl90KiBzdGFydCA9IG1fY3Vyc29yOworICArK21fY3Vyc29yOworICB3aGlsZSAobV9jdXJzb3IgPD0gbV9lbmQgJiYgKm1fY3Vyc29yKSB7CisgICAgaWYgKCFJc0Zvcm1DYWxjQ2hhcmFjdGVyKCptX2N1cnNvcikpIHsKKyAgICAgIFJhaXNlRXJyb3IoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIUlzSWRlbnRpZmllckNoYXJhY3RlcigqbV9jdXJzb3IpKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgKyttX2N1cnNvcjsKKyAgfQorICBtX3Rva2VuLT5tX3N0cmluZyA9CisgICAgICBXaWRlU3RyaW5nVmlldyhzdGFydCwgc3RhdGljX2Nhc3Q8c2l6ZV90PihtX2N1cnNvciAtIHN0YXJ0KSk7CisgIG1fdG9rZW4tPm1fdHlwZSA9IFRva2VuaXplSWRlbnRpZmllcihtX3Rva2VuLT5tX3N0cmluZyk7Cit9CisKK3ZvaWQgQ1hGQV9GTUxleGVyOjpBZHZhbmNlRm9yQ29tbWVudCgpIHsKKyAgbV9jdXJzb3IrKzsKKyAgd2hpbGUgKG1fY3Vyc29yIDw9IG1fZW5kICYmICptX2N1cnNvcikgeworICAgIGlmICghSXNGb3JtQ2FsY0NoYXJhY3RlcigqbV9jdXJzb3IpKSB7CisgICAgICBSYWlzZUVycm9yKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCptX2N1cnNvciA9PSBMJ1xyJykgeworICAgICAgKyttX2N1cnNvcjsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCptX2N1cnNvciA9PSBMJ1xuJykgeworICAgICAgKyttX2N1cnJlbnRfbGluZTsKKyAgICAgICsrbV9jdXJzb3I7CisgICAgICByZXR1cm47CisgICAgfQorICAgICsrbV9jdXJzb3I7CisgIH0KK30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2ZtMmpzL2N4ZmFfZm1sZXhlci5oIGIveGZhL2Z4ZmEvZm0yanMvY3hmYV9mbWxleGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk3NjRjNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2ZtMmpzL2N4ZmFfZm1sZXhlci5oCkBAIC0wLDAgKzEsMTM0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfRk0ySlNfQ1hGQV9GTUxFWEVSX0hfCisjZGVmaW5lIFhGQV9GWEZBX0ZNMkpTX0NYRkFfRk1MRVhFUl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgorCitlbnVtIFhGQV9GTV9UT0tFTiB7CisgIFRPS2FuZCwKKyAgVE9LbHBhcmVuLAorICBUT0tycGFyZW4sCisgIFRPS211bCwKKyAgVE9LcGx1cywKKyAgVE9LY29tbWEsCisgIFRPS21pbnVzLAorICBUT0tkb3QsCisgIFRPS2RpdiwKKyAgVE9LbHQsCisgIFRPS2Fzc2lnbiwKKyAgVE9LZ3QsCisgIFRPS2xicmFja2V0LAorICBUT0tyYnJhY2tldCwKKyAgVE9Lb3IsCisgIFRPS2RvdHNjcmVhbSwKKyAgVE9LZG90c3RhciwKKyAgVE9LZG90ZG90LAorICBUT0tsZSwKKyAgVE9LbmUsCisgIFRPS2VxLAorICBUT0tnZSwKKyAgVE9LZG8sCisgIFRPS2tzZXEsCisgIFRPS2tzZ2UsCisgIFRPS2tzZ3QsCisgIFRPS2lmLAorICBUT0tpbiwKKyAgVE9La3NsZSwKKyAgVE9La3NsdCwKKyAgVE9La3NuZSwKKyAgVE9La3NvciwKKyAgVE9LbnVsbCwKKyAgVE9LYnJlYWssCisgIFRPS2tzYW5kLAorICBUT0tlbmQsCisgIFRPS2VvZiwKKyAgVE9LZm9yLAorICBUT0tuYW4sCisgIFRPS2tzbm90LAorICBUT0t2YXIsCisgIFRPS3RoZW4sCisgIFRPS2Vsc2UsCisgIFRPS2V4aXQsCisgIFRPS2Rvd250bywKKyAgVE9LcmV0dXJuLAorICBUT0tpbmZpbml0eSwKKyAgVE9LZW5kd2hpbGUsCisgIFRPS2ZvcmVhY2gsCisgIFRPS2VuZGZ1bmMsCisgIFRPS2Vsc2VpZiwKKyAgVE9Ld2hpbGUsCisgIFRPS2VuZGZvciwKKyAgVE9LdGhyb3csCisgIFRPS3N0ZXAsCisgIFRPS3VwdG8sCisgIFRPS2NvbnRpbnVlLAorICBUT0tmdW5jLAorICBUT0tlbmRpZiwKKyAgVE9Lc3RhciwKKyAgVE9LaWRlbnRpZmllciwKKyAgVE9LdW5kZXJzY29yZSwKKyAgVE9LZG9sbGFyLAorICBUT0tleGNsYW1hdGlvbiwKKyAgVE9LY2FsbCwKKyAgVE9Lc3RyaW5nLAorICBUT0tudW1iZXIsCisgIFRPS3Jlc2VydmVyCit9OworCitzdHJ1Y3QgWEZBX0ZNS2V5d29yZCB7CisgIFhGQV9GTV9UT0tFTiBtX3R5cGU7CisgIHVpbnQzMl90IG1faGFzaDsKKyAgY29uc3Qgd2NoYXJfdCogbV9rZXl3b3JkOworfTsKKworY2xhc3MgQ1hGQV9GTVRva2VuIHsKKyBwdWJsaWM6CisgIENYRkFfRk1Ub2tlbigpOworICBleHBsaWNpdCBDWEZBX0ZNVG9rZW4odWludDMyX3QgbGluZV9udW0pOworICB+Q1hGQV9GTVRva2VuKCk7CisKKyAgV2lkZVN0cmluZyBUb0RlYnVnU3RyaW5nKCkgY29uc3Q7CisKKyAgV2lkZVN0cmluZ1ZpZXcgbV9zdHJpbmc7CisgIFhGQV9GTV9UT0tFTiBtX3R5cGU7CisgIHVpbnQzMl90IG1fbGluZV9udW07Cit9OworCitjbGFzcyBDWEZBX0ZNTGV4ZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1hGQV9GTUxleGVyKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c0Zvcm1jYWxjKTsKKyAgfkNYRkFfRk1MZXhlcigpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNVG9rZW4+IE5leHRUb2tlbigpOworCisgIHZvaWQgU2V0Q3VycmVudExpbmUodWludDMyX3QgbGluZSkgeyBtX2N1cnJlbnRfbGluZSA9IGxpbmU7IH0KKyAgY29uc3Qgd2NoYXJfdCogR2V0UG9zKCkgeyByZXR1cm4gbV9jdXJzb3I7IH0KKyAgdm9pZCBTZXRQb3MoY29uc3Qgd2NoYXJfdCogcG9zKSB7IG1fY3Vyc29yID0gcG9zOyB9CisKKyBwcml2YXRlOgorICB2b2lkIEFkdmFuY2VGb3JOdW1iZXIoKTsKKyAgdm9pZCBBZHZhbmNlRm9yU3RyaW5nKCk7CisgIHZvaWQgQWR2YW5jZUZvcklkZW50aWZpZXIoKTsKKyAgdm9pZCBBZHZhbmNlRm9yQ29tbWVudCgpOworCisgIHZvaWQgUmFpc2VFcnJvcigpIHsKKyAgICBtX3Rva2VuLnJlc2V0KCk7CisgICAgbV9sZXhlcl9lcnJvciA9IHRydWU7CisgIH0KKworICBjb25zdCB3Y2hhcl90KiBtX2N1cnNvcjsKKyAgY29uc3Qgd2NoYXJfdCogY29uc3QgbV9lbmQ7CisgIHVpbnQzMl90IG1fY3VycmVudF9saW5lOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVRva2VuPiBtX3Rva2VuOworICBib29sIG1fbGV4ZXJfZXJyb3I7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX0ZNMkpTX0NYRkFfRk1MRVhFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvZm0yanMvY3hmYV9mbWxleGVyX3VuaXR0ZXN0LmNwcCBiL3hmYS9meGZhL2ZtMmpzL2N4ZmFfZm1sZXhlcl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZhYjg3MQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2ZtMmpzL2N4ZmFfZm1sZXhlcl91bml0dGVzdC5jcHAKQEAgLTAsMCArMSwyNTUgQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2luY2x1ZGUgInhmYS9meGZhL2ZtMmpzL2N4ZmFfZm1sZXhlci5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy90ZXN0X3N1cHBvcnQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK1RFU1QoQ1hGQV9GTUxleGVyVGVzdCwgRW1wdHlTdHJpbmcpIHsKKyAgQ1hGQV9GTUxleGVyIGxleGVyKEwiIik7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNVG9rZW4+IHRva2VuID0gbGV4ZXIuTmV4dFRva2VuKCk7CisgIEVYUEVDVF9FUShUT0tlb2YsIHRva2VuLT5tX3R5cGUpOworfQorCitURVNUKENYRkFfRk1MZXhlclRlc3QsIE51bWJlcnMpIHsKKyAgYXV0byBsZXhlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNTGV4ZXI+KEwiLTEyIik7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNVG9rZW4+IHRva2VuID0gbGV4ZXItPk5leHRUb2tlbigpOworICAvLyBUT0RPKGRzaW5jbGFpcik6IFNob3VsZCB0aGlzIHJldHVybiAtMTIgaW5zdGVhZCBvZiB0d28gdG9rZW5zPworICBFWFBFQ1RfRVEoVE9LbWludXMsIHRva2VuLT5tX3R5cGUpOworICB0b2tlbiA9IGxleGVyLT5OZXh0VG9rZW4oKTsKKyAgRVhQRUNUX0VRKEwiMTIiLCB0b2tlbi0+bV9zdHJpbmcpOworICB0b2tlbiA9IGxleGVyLT5OZXh0VG9rZW4oKTsKKyAgRVhQRUNUX0VRKFRPS2VvZiwgdG9rZW4tPm1fdHlwZSk7CisKKyAgbGV4ZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUxleGVyPihMIjEuNTM2MiIpOworICB0b2tlbiA9IGxleGVyLT5OZXh0VG9rZW4oKTsKKyAgRVhQRUNUX0VRKFRPS251bWJlciwgdG9rZW4tPm1fdHlwZSk7CisgIEVYUEVDVF9FUShMIjEuNTM2MiIsIHRva2VuLT5tX3N0cmluZyk7CisKKyAgbGV4ZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUxleGVyPihMIjAuODc1Iik7CisgIHRva2VuID0gbGV4ZXItPk5leHRUb2tlbigpOworICBFWFBFQ1RfRVEoVE9LbnVtYmVyLCB0b2tlbi0+bV90eXBlKTsKKyAgRVhQRUNUX0VRKEwiMC44NzUiLCB0b2tlbi0+bV9zdHJpbmcpOworCisgIGxleGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1MZXhlcj4oTCI1LjU2ZS0yIik7CisgIHRva2VuID0gbGV4ZXItPk5leHRUb2tlbigpOworICBFWFBFQ1RfRVEoVE9LbnVtYmVyLCB0b2tlbi0+bV90eXBlKTsKKyAgRVhQRUNUX0VRKEwiNS41NmUtMiIsIHRva2VuLT5tX3N0cmluZyk7CisKKyAgbGV4ZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUxleGVyPihMIjEuMjM0RTEwIik7CisgIHRva2VuID0gbGV4ZXItPk5leHRUb2tlbigpOworICBFWFBFQ1RfRVEoVE9LbnVtYmVyLCB0b2tlbi0+bV90eXBlKTsKKyAgRVhQRUNUX0VRKEwiMS4yMzRFMTAiLCB0b2tlbi0+bV9zdHJpbmcpOworCisgIGxleGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1MZXhlcj4oTCIxMjM0NTY3ODkuMDEyMzQ1Njc4Iik7CisgIHRva2VuID0gbGV4ZXItPk5leHRUb2tlbigpOworICBFWFBFQ1RfRVEoVE9LbnVtYmVyLCB0b2tlbi0+bV90eXBlKTsKKyAgLy8gVE9ETyhkc2luY2xhaXIpOiBUaGlzIHNob3VsZCByb3VuZCBhcyBwZXIgSUVFRSA2NC1iaXQgdmFsdWVzLgorICAvLyBFWFBFQ1RfRVEoTCIxMjM0NTY3ODkuMDEyMzQ1NjciLCB0b2tlbi0+bV9zdHJpbmcpOworICBFWFBFQ1RfRVEoTCIxMjM0NTY3ODkuMDEyMzQ1Njc4IiwgdG9rZW4tPm1fc3RyaW5nKTsKKworICBsZXhlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNTGV4ZXI+KEwiOTk5OTk5OTk5OTk5OTk5OTkiKTsKKyAgdG9rZW4gPSBsZXhlci0+TmV4dFRva2VuKCk7CisgIEVYUEVDVF9FUShUT0tudW1iZXIsIHRva2VuLT5tX3R5cGUpOworICAvLyBUT0RPKGRzaW5jbGFpcik6IFRoaXMgaXMgc3BlYydkIGFzIHJvdW5kaW5nIHdoZW4gPiAxNiBzaWduaWZpY2FudCBkaWdpdHMKKyAgLy8gcHJpb3IgdG8gdGhlIGV4cG9uZW50LgorICAvLyBFWFBFQ1RfRVEoTCIxMDAwMDAwMDAwMDAwMDAwMDAiLCB0b2tlbi0+bV9zdHJpbmcpOworICBFWFBFQ1RfRVEoTCI5OTk5OTk5OTk5OTk5OTk5OSIsIHRva2VuLT5tX3N0cmluZyk7Cit9CisKKy8vIFRoZSBxdW90ZXMgYXJlIHN0cmlwcGVkIGluIENYRkFfRk1TdHJpbmdFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQuCitURVNUKENYRkFfRk1MZXhlclRlc3QsIFN0cmluZ3MpIHsKKyAgYXV0byBsZXhlciA9CisgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUxleGVyPihMIlwiVGhlIGNhdCBqdW1wZWQgb3ZlciB0aGUgZmVuY2UuXCIiKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1Ub2tlbj4gdG9rZW4gPSBsZXhlci0+TmV4dFRva2VuKCk7CisgIEVYUEVDVF9FUShUT0tzdHJpbmcsIHRva2VuLT5tX3R5cGUpOworICBFWFBFQ1RfRVEoTCJcIlRoZSBjYXQganVtcGVkIG92ZXIgdGhlIGZlbmNlLlwiIiwgdG9rZW4tPm1fc3RyaW5nKTsKKworICB0b2tlbiA9IGxleGVyLT5OZXh0VG9rZW4oKTsKKyAgRVhQRUNUX0VRKFRPS2VvZiwgdG9rZW4tPm1fdHlwZSk7CisKKyAgbGV4ZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUxleGVyPihMIlwiXCIiKTsKKyAgdG9rZW4gPSBsZXhlci0+TmV4dFRva2VuKCk7CisgIEVYUEVDVF9FUShUT0tzdHJpbmcsIHRva2VuLT5tX3R5cGUpOworICBFWFBFQ1RfRVEoTCJcIlwiIiwgdG9rZW4tPm1fc3RyaW5nKTsKKworICBsZXhlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNTGV4ZXI+KAorICAgICAgTCJcIlRoZSBtZXNzYWdlIHJlYWRzOiBcIlwiV2FybmluZzogSW5zdWZmaWNpZW50IE1lbW9yeVwiXCJcIiIpOworICB0b2tlbiA9IGxleGVyLT5OZXh0VG9rZW4oKTsKKyAgRVhQRUNUX0VRKFRPS3N0cmluZywgdG9rZW4tPm1fdHlwZSk7CisgIEVYUEVDVF9FUShMIlwiVGhlIG1lc3NhZ2UgcmVhZHM6IFwiXCJXYXJuaW5nOiBJbnN1ZmZpY2llbnQgTWVtb3J5XCJcIlwiIiwKKyAgICAgICAgICAgIHRva2VuLT5tX3N0cmluZyk7CisKKyAgbGV4ZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUxleGVyPigKKyAgICAgIEwiXCJcXHUwMDQ3XFx1MDA2ZlxcdTAwNjZcXHUwMDY5XFx1MDA3M1xcdTAwNjhcXHUwMDIxXFx1MDAwZFxcdTAwMGFcIiIpOworICB0b2tlbiA9IGxleGVyLT5OZXh0VG9rZW4oKTsKKyAgRVhQRUNUX0VRKFRPS3N0cmluZywgdG9rZW4tPm1fdHlwZSk7CisgIEVYUEVDVF9FUSgKKyAgICAgIEwiXCJcXHUwMDQ3XFx1MDA2ZlxcdTAwNjZcXHUwMDY5XFx1MDA3M1xcdTAwNjhcXHUwMDIxXFx1MDAwZFxcdTAwMGFcIiIsCisgICAgICB0b2tlbi0+bV9zdHJpbmcpOworfQorCisvLyBOb3RlLCAndGhpcycgaXMgYSBrZXl3b3JkIGJ1dCBpcyBub3QgbWF0Y2hlZCBieSB0aGUgbGV4ZXIuCitURVNUKENYRkFfRk1MZXhlclRlc3QsIE9wZXJhdG9yc0FuZEtleXdvcmRzKSB7CisgIHN0cnVjdCB7CisgICAgY29uc3Qgd2NoYXJfdCogb3A7CisgICAgWEZBX0ZNX1RPS0VOIHRva2VuOworICB9IG9wW10gPSB7e0wiKyIsIFRPS3BsdXN9LAorICAgICAgICAgICAge0wiLyIsIFRPS2Rpdn0sCisgICAgICAgICAgICB7TCItIiwgVE9LbWludXN9LAorICAgICAgICAgICAge0wiJiIsIFRPS2FuZH0sCisgICAgICAgICAgICB7TCJ8IiwgVE9Lb3J9LAorICAgICAgICAgICAge0wiKiIsIFRPS211bH0sCisgICAgICAgICAgICB7TCI8IiwgVE9LbHR9LAorICAgICAgICAgICAge0wiPiIsIFRPS2d0fSwKKyAgICAgICAgICAgIHtMIj09IiwgVE9LZXF9LAorICAgICAgICAgICAge0wiPD4iLCBUT0tuZX0sCisgICAgICAgICAgICB7TCI8PSIsIFRPS2xlfSwKKyAgICAgICAgICAgIHtMIj49IiwgVE9LZ2V9LAorICAgICAgICAgICAge0wiYW5kIiwgVE9La3NhbmR9LAorICAgICAgICAgICAge0wiYnJlYWsiLCBUT0ticmVha30sCisgICAgICAgICAgICB7TCJjb250aW51ZSIsIFRPS2NvbnRpbnVlfSwKKyAgICAgICAgICAgIHtMImRvIiwgVE9LZG99LAorICAgICAgICAgICAge0wiZG93bnRvIiwgVE9LZG93bnRvfSwKKyAgICAgICAgICAgIHtMImVsc2UiLCBUT0tlbHNlfSwKKyAgICAgICAgICAgIHtMImVsc2VpZiIsIFRPS2Vsc2VpZn0sCisgICAgICAgICAgICB7TCJlbmQiLCBUT0tlbmR9LAorICAgICAgICAgICAge0wiZW5kZm9yIiwgVE9LZW5kZm9yfSwKKyAgICAgICAgICAgIHtMImVuZGZ1bmMiLCBUT0tlbmRmdW5jfSwKKyAgICAgICAgICAgIHtMImVuZGlmIiwgVE9LZW5kaWZ9LAorICAgICAgICAgICAge0wiZW5kd2hpbGUiLCBUT0tlbmR3aGlsZX0sCisgICAgICAgICAgICB7TCJlcSIsIFRPS2tzZXF9LAorICAgICAgICAgICAge0wiZXhpdCIsIFRPS2V4aXR9LAorICAgICAgICAgICAge0wiZm9yIiwgVE9LZm9yfSwKKyAgICAgICAgICAgIHtMImZvcmVhY2giLCBUT0tmb3JlYWNofSwKKyAgICAgICAgICAgIHtMImZ1bmMiLCBUT0tmdW5jfSwKKyAgICAgICAgICAgIHtMImdlIiwgVE9La3NnZX0sCisgICAgICAgICAgICB7TCJndCIsIFRPS2tzZ3R9LAorICAgICAgICAgICAge0wiaWYiLCBUT0tpZn0sCisgICAgICAgICAgICB7TCJpbiIsIFRPS2lufSwKKyAgICAgICAgICAgIHtMImluZmluaXR5IiwgVE9LaW5maW5pdHl9LAorICAgICAgICAgICAge0wibGUiLCBUT0trc2xlfSwKKyAgICAgICAgICAgIHtMImx0IiwgVE9La3NsdH0sCisgICAgICAgICAgICB7TCJuYW4iLCBUT0tuYW59LAorICAgICAgICAgICAge0wibmUiLCBUT0trc25lfSwKKyAgICAgICAgICAgIHtMIm5vdCIsIFRPS2tzbm90fSwKKyAgICAgICAgICAgIHtMIm51bGwiLCBUT0tudWxsfSwKKyAgICAgICAgICAgIHtMIm9yIiwgVE9La3Nvcn0sCisgICAgICAgICAgICB7TCJyZXR1cm4iLCBUT0tyZXR1cm59LAorICAgICAgICAgICAge0wic3RlcCIsIFRPS3N0ZXB9LAorICAgICAgICAgICAge0widGhlbiIsIFRPS3RoZW59LAorICAgICAgICAgICAge0widGhyb3ciLCBUT0t0aHJvd30sCisgICAgICAgICAgICB7TCJ1cHRvIiwgVE9LdXB0b30sCisgICAgICAgICAgICB7TCJ2YXIiLCBUT0t2YXJ9LAorICAgICAgICAgICAge0wid2hpbGUiLCBUT0t3aGlsZX0sCisKKyAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXJlIGRlZmluZWQgYnV0IGFyZW4ndCBpbiB0aGUgc3BlYy4KKyAgICAgICAgICAgIHtMIigiLCBUT0tscGFyZW59LAorICAgICAgICAgICAge0wiKSIsIFRPS3JwYXJlbn0sCisgICAgICAgICAgICB7TCIsIiwgVE9LY29tbWF9LAorICAgICAgICAgICAge0wiLiIsIFRPS2RvdH0sCisgICAgICAgICAgICB7TCJbIiwgVE9LbGJyYWNrZXR9LAorICAgICAgICAgICAge0wiXSIsIFRPS3JicmFja2V0fSwKKyAgICAgICAgICAgIHtMIi4uIiwgVE9LZG90ZG90fSwKKyAgICAgICAgICAgIHtMIi4jIiwgVE9LZG90c2NyZWFtfSwKKyAgICAgICAgICAgIHtMIi4qIiwgVE9LZG90c3Rhcn19OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgRlhfQXJyYXlTaXplKG9wKTsgKytpKSB7CisgICAgYXV0byBsZXhlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNTGV4ZXI+KG9wW2ldLm9wKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVRva2VuPiB0b2tlbiA9IGxleGVyLT5OZXh0VG9rZW4oKTsKKyAgICBFWFBFQ1RfRVEob3BbaV0udG9rZW4sIHRva2VuLT5tX3R5cGUpOworICB9Cit9CisKK1RFU1QoQ1hGQV9GTUxleGVyVGVzdCwgQ29tbWVudHMpIHsKKyAgYXV0byBsZXhlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNTGV4ZXI+KEwiLy8gRW1wdHkuIik7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNVG9rZW4+IHRva2VuID0gbGV4ZXItPk5leHRUb2tlbigpOworICBFWFBFQ1RfRVEoVE9LZW9mLCB0b2tlbi0+bV90eXBlKTsKKworICBsZXhlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNTGV4ZXI+KEwiLy8iKTsKKyAgdG9rZW4gPSBsZXhlci0+TmV4dFRva2VuKCk7CisgIEVYUEVDVF9FUShUT0tlb2YsIHRva2VuLT5tX3R5cGUpOworCisgIGxleGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1MZXhlcj4oTCIxMjMgLy8gRW1wdHkuXG5cInN0clwiIik7CisgIHRva2VuID0gbGV4ZXItPk5leHRUb2tlbigpOworICBFWFBFQ1RfRVEoVE9LbnVtYmVyLCB0b2tlbi0+bV90eXBlKTsKKyAgRVhQRUNUX0VRKEwiMTIzIiwgdG9rZW4tPm1fc3RyaW5nKTsKKworICB0b2tlbiA9IGxleGVyLT5OZXh0VG9rZW4oKTsKKyAgRVhQRUNUX0VRKFRPS3N0cmluZywgdG9rZW4tPm1fdHlwZSk7CisgIEVYUEVDVF9FUShMIlwic3RyXCIiLCB0b2tlbi0+bV9zdHJpbmcpOworCisgIHRva2VuID0gbGV4ZXItPk5leHRUb2tlbigpOworICBFWFBFQ1RfRVEoVE9LZW9mLCB0b2tlbi0+bV90eXBlKTsKKworICBsZXhlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNTGV4ZXI+KEwiOyIpOworICB0b2tlbiA9IGxleGVyLT5OZXh0VG9rZW4oKTsKKyAgRVhQRUNUX0VRKFRPS2VvZiwgdG9rZW4tPm1fdHlwZSk7CisKKyAgbGV4ZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUxleGVyPihMIjsgRW1wdHkuIik7CisgIHRva2VuID0gbGV4ZXItPk5leHRUb2tlbigpOworICBFWFBFQ1RfRVEoVE9LZW9mLCB0b2tlbi0+bV90eXBlKTsKKworICBsZXhlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNTGV4ZXI+KEwiMTIzIDtFbXB0eS5cblwic3RyXCIiKTsKKyAgdG9rZW4gPSBsZXhlci0+TmV4dFRva2VuKCk7CisgIEVYUEVDVF9FUShUT0tudW1iZXIsIHRva2VuLT5tX3R5cGUpOworICBFWFBFQ1RfRVEoTCIxMjMiLCB0b2tlbi0+bV9zdHJpbmcpOworCisgIHRva2VuID0gbGV4ZXItPk5leHRUb2tlbigpOworICBFWFBFQ1RfRVEoVE9Lc3RyaW5nLCB0b2tlbi0+bV90eXBlKTsKKyAgRVhQRUNUX0VRKEwiXCJzdHJcIiIsIHRva2VuLT5tX3N0cmluZyk7CisKKyAgdG9rZW4gPSBsZXhlci0+TmV4dFRva2VuKCk7CisgIEVYUEVDVF9FUShUT0tlb2YsIHRva2VuLT5tX3R5cGUpOworfQorCitURVNUKENYRkFfRk1MZXhlclRlc3QsIFZhbGlkSWRlbnRpZmllcnMpIHsKKyAgc3RkOjp2ZWN0b3I8Y29uc3Qgd2NoYXJfdCo+IGlkZW50aWZpZXJzID0geworICAgICAgTCJhIiwgTCJhbl9pZGVudGlmaWVyIiwgTCJfaWRlbnQiLCBMIiRpZGVudCIsIEwiIWlkZW50IiwgTCJHZXRBZGRyIn07CisgIGZvciAoY29uc3QgYXV0byogaWRlbnQgOiBpZGVudGlmaWVycykgeworICAgIGF1dG8gbGV4ZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUxleGVyPihpZGVudCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1Ub2tlbj4gdG9rZW4gPSBsZXhlci0+TmV4dFRva2VuKCk7CisgICAgRVhQRUNUX0VRKFRPS2lkZW50aWZpZXIsIHRva2VuLT5tX3R5cGUpOworICAgIEVYUEVDVF9FUShpZGVudCwgdG9rZW4tPm1fc3RyaW5nKTsKKyAgfQorfQorCitURVNUKENYRkFfRk1MZXhlclRlc3QsIEludmFsaWRJZGVudGlmaWVycykgeworICBhdXRvIGxleGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1MZXhlcj4oTCIjYSIpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgbGV4ZXItPk5leHRUb2tlbigpKTsKKworICBsZXhlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNTGV4ZXI+KEwiMWEiKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIGxleGVyLT5OZXh0VG9rZW4oKSk7CisKKyAgbGV4ZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUxleGVyPihMImFuQGlkZW50aWZpZXIiKTsKKyAgRVhQRUNUX05FKG51bGxwdHIsIGxleGVyLT5OZXh0VG9rZW4oKSk7CisgIEVYUEVDVF9FUShudWxscHRyLCBsZXhlci0+TmV4dFRva2VuKCkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgbGV4ZXItPk5leHRUb2tlbigpKTsKKworICBsZXhlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNTGV4ZXI+KEwiX2lkZW50QCIpOworICBFWFBFQ1RfTkUobnVsbHB0ciwgbGV4ZXItPk5leHRUb2tlbigpKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIGxleGVyLT5OZXh0VG9rZW4oKSk7Cit9CisKK1RFU1QoQ1hGQV9GTUxleGVyVGVzdCwgV2hpdGVzcGFjZSkgeworICBhdXRvIGxleGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1MZXhlcj4oTCIgXHRceGNceDlceGIiKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1Ub2tlbj4gdG9rZW4gPSBsZXhlci0+TmV4dFRva2VuKCk7CisgIEVYUEVDVF9FUShUT0tlb2YsIHRva2VuLT5tX3R5cGUpOworCisgIGxleGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1MZXhlcj4oTCIxMjMgXHRceGNceDlceGIgNDU2Iik7CisgIHRva2VuID0gbGV4ZXItPk5leHRUb2tlbigpOworICBFWFBFQ1RfRVEoVE9LbnVtYmVyLCB0b2tlbi0+bV90eXBlKTsKKyAgRVhQRUNUX0VRKEwiMTIzIiwgdG9rZW4tPm1fc3RyaW5nKTsKKworICB0b2tlbiA9IGxleGVyLT5OZXh0VG9rZW4oKTsKKyAgRVhQRUNUX0VRKFRPS251bWJlciwgdG9rZW4tPm1fdHlwZSk7CisgIEVYUEVDVF9FUShMIjQ1NiIsIHRva2VuLT5tX3N0cmluZyk7CisKKyAgdG9rZW4gPSBsZXhlci0+TmV4dFRva2VuKCk7CisgIEVYUEVDVF9FUShUT0tlb2YsIHRva2VuLT5tX3R5cGUpOworfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvZm0yanMvY3hmYV9mbXBhcnNlci5jcHAgYi94ZmEvZnhmYS9mbTJqcy9jeGZhX2ZtcGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDRmZGYyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvZm0yanMvY3hmYV9mbXBhcnNlci5jcHAKQEAgLTAsMCArMSwxMjMxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9mbTJqcy9jeGZhX2ZtcGFyc2VyLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2F1dG9yZXN0b3Jlci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgdW5zaWduZWQgaW50IGtNYXhBc3NpZ25tZW50Q2hhaW5MZW5ndGggPSAxMjsKK2NvbnN0IHVuc2lnbmVkIGludCBrTWF4UGFyc2VEZXB0aCA9IDEyNTA7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0ZNUGFyc2VyOjpDWEZBX0ZNUGFyc2VyKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c0Zvcm1jYWxjKQorICAgIDogbV9lcnJvcihmYWxzZSksIG1fcGFyc2VfZGVwdGgoMCksIG1fbWF4X3BhcnNlX2RlcHRoKGtNYXhQYXJzZURlcHRoKSB7CisgIG1fbGV4ZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUxleGVyPih3c0Zvcm1jYWxjKTsKKyAgbV90b2tlbiA9IG1fbGV4ZXItPk5leHRUb2tlbigpOworfQorCitDWEZBX0ZNUGFyc2VyOjp+Q1hGQV9GTVBhcnNlcigpIHt9CisKK3N0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uPiBDWEZBX0ZNUGFyc2VyOjpQYXJzZSgpIHsKKyAgYXV0byBleHByZXNzaW9ucyA9IFBhcnNlVG9wRXhwcmVzc2lvbigpOworICBpZiAoSGFzRXJyb3IoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nVmlldz4gYXJndW1lbnRzOworICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1GdW5jdGlvbkRlZmluaXRpb24+KAorICAgICAgMSwgdHJ1ZSwgTCIiLCBzdGQ6Om1vdmUoYXJndW1lbnRzKSwgc3RkOjptb3ZlKGV4cHJlc3Npb25zKSk7Cit9CisKK2Jvb2wgQ1hGQV9GTVBhcnNlcjo6TmV4dFRva2VuKCkgeworICBpZiAoSGFzRXJyb3IoKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIG1fdG9rZW4gPSBtX2xleGVyLT5OZXh0VG9rZW4oKTsKKyAgd2hpbGUgKCFIYXNFcnJvcigpICYmIG1fdG9rZW4tPm1fdHlwZSA9PSBUT0tyZXNlcnZlcikKKyAgICBtX3Rva2VuID0gbV9sZXhlci0+TmV4dFRva2VuKCk7CisgIHJldHVybiAhSGFzRXJyb3IoKTsKK30KKworYm9vbCBDWEZBX0ZNUGFyc2VyOjpDaGVja1RoZW5OZXh0KFhGQV9GTV9UT0tFTiBvcCkgeworICBpZiAoSGFzRXJyb3IoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKG1fdG9rZW4tPm1fdHlwZSAhPSBvcCkgeworICAgIG1fZXJyb3IgPSB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gTmV4dFRva2VuKCk7Cit9CisKK2Jvb2wgQ1hGQV9GTVBhcnNlcjo6SW5jcmVtZW50UGFyc2VEZXB0aEFuZENoZWNrKCkgeworICByZXR1cm4gKyttX3BhcnNlX2RlcHRoIDwgbV9tYXhfcGFyc2VfZGVwdGg7Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4+CitDWEZBX0ZNUGFyc2VyOjpQYXJzZVRvcEV4cHJlc3Npb24oKSB7CisgIEF1dG9SZXN0b3Jlcjx1bnNpZ25lZCBsb25nPiByZXN0b3JlcigmbV9wYXJzZV9kZXB0aCk7CisgIGlmIChIYXNFcnJvcigpIHx8ICFJbmNyZW1lbnRQYXJzZURlcHRoQW5kQ2hlY2soKSkKKyAgICByZXR1cm4gc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPj4oKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IGV4cHI7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4+IGV4cHJlc3Npb25zOworICB3aGlsZSAoIUhhc0Vycm9yKCkpIHsKKyAgICBpZiAobV90b2tlbi0+bV90eXBlID09IFRPS2VvZiB8fCBtX3Rva2VuLT5tX3R5cGUgPT0gVE9LZW5kZnVuYyB8fAorICAgICAgICBtX3Rva2VuLT5tX3R5cGUgPT0gVE9LZW5kaWYgfHwgbV90b2tlbi0+bV90eXBlID09IFRPS2Vsc2VpZiB8fAorICAgICAgICBtX3Rva2VuLT5tX3R5cGUgPT0gVE9LZWxzZSB8fCBtX3Rva2VuLT5tX3R5cGUgPT0gVE9LcmVzZXJ2ZXIpIHsKKyAgICAgIHJldHVybiBleHByZXNzaW9uczsKKyAgICB9CisKKyAgICBleHByID0gbV90b2tlbi0+bV90eXBlID09IFRPS2Z1bmMgPyBQYXJzZUZ1bmN0aW9uKCkgOiBQYXJzZUV4cHJlc3Npb24oKTsKKyAgICBpZiAoIWV4cHIpIHsKKyAgICAgIG1fZXJyb3IgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGV4cHJlc3Npb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoZXhwcikpOworICB9CisgIHJldHVybiBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+PigpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IENYRkFfRk1QYXJzZXI6OlBhcnNlRnVuY3Rpb24oKSB7CisgIEF1dG9SZXN0b3Jlcjx1bnNpZ25lZCBsb25nPiByZXN0b3JlcigmbV9wYXJzZV9kZXB0aCk7CisgIGlmIChIYXNFcnJvcigpIHx8ICFJbmNyZW1lbnRQYXJzZURlcHRoQW5kQ2hlY2soKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBXaWRlU3RyaW5nVmlldyBpZGVudDsKKyAgc3RkOjp2ZWN0b3I8V2lkZVN0cmluZ1ZpZXc+IGFyZ3VtZW50czsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPj4gZXhwcmVzc2lvbnM7CisgIHVpbnQzMl90IGxpbmUgPSBtX3Rva2VuLT5tX2xpbmVfbnVtOworICBpZiAoIU5leHRUb2tlbigpKQorICAgIHJldHVybiBudWxscHRyOworICBpZiAobV90b2tlbi0+bV90eXBlICE9IFRPS2lkZW50aWZpZXIpIHsKKyAgICBtX2Vycm9yID0gdHJ1ZTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfSBlbHNlIHsKKyAgICBpZGVudCA9IG1fdG9rZW4tPm1fc3RyaW5nOworICAgIGlmICghTmV4dFRva2VuKCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAoIUNoZWNrVGhlbk5leHQoVE9LbHBhcmVuKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgaWYgKG1fdG9rZW4tPm1fdHlwZSA9PSBUT0tycGFyZW4pIHsKKyAgICBpZiAoIU5leHRUb2tlbigpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0gZWxzZSB7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgIGlmIChtX3Rva2VuLT5tX3R5cGUgIT0gVE9LaWRlbnRpZmllcikgeworICAgICAgICBtX2Vycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICB9CisgICAgICBhcmd1bWVudHMucHVzaF9iYWNrKG1fdG9rZW4tPm1fc3RyaW5nKTsKKyAgICAgIGlmICghTmV4dFRva2VuKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgaWYgKG1fdG9rZW4tPm1fdHlwZSA9PSBUT0tjb21tYSkgeworICAgICAgICBpZiAoIU5leHRUb2tlbigpKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChtX3Rva2VuLT5tX3R5cGUgPT0gVE9LcnBhcmVuKSB7CisgICAgICAgIGlmICghTmV4dFRva2VuKCkpCisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIUNoZWNrVGhlbk5leHQoVE9LcnBhcmVuKSkKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoIUNoZWNrVGhlbk5leHQoVE9LZG8pKQorICAgIHJldHVybiBudWxscHRyOworICBpZiAobV90b2tlbi0+bV90eXBlID09IFRPS2VuZGZ1bmMpIHsKKyAgICBpZiAoIU5leHRUb2tlbigpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0gZWxzZSB7CisgICAgZXhwcmVzc2lvbnMgPSBQYXJzZVRvcEV4cHJlc3Npb24oKTsKKyAgICBpZiAoIWV4cHJlc3Npb25zLnNpemUoKSB8fCAhQ2hlY2tUaGVuTmV4dChUT0tlbmRmdW5jKSkKKyAgICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgcmV0dXJuIHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uPigKKyAgICAgIGxpbmUsIGZhbHNlLCBpZGVudCwgc3RkOjptb3ZlKGFyZ3VtZW50cyksIHN0ZDo6bW92ZShleHByZXNzaW9ucykpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IENYRkFfRk1QYXJzZXI6OlBhcnNlRXhwcmVzc2lvbigpIHsKKyAgQXV0b1Jlc3RvcmVyPHVuc2lnbmVkIGxvbmc+IHJlc3RvcmVyKCZtX3BhcnNlX2RlcHRoKTsKKyAgaWYgKEhhc0Vycm9yKCkgfHwgIUluY3JlbWVudFBhcnNlRGVwdGhBbmRDaGVjaygpKQorICAgIHJldHVybiBudWxscHRyOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gZXhwcjsKKyAgdWludDMyX3QgbGluZSA9IG1fdG9rZW4tPm1fbGluZV9udW07CisgIHN3aXRjaCAobV90b2tlbi0+bV90eXBlKSB7CisgICAgY2FzZSBUT0t2YXI6CisgICAgICBleHByID0gUGFyc2VWYXJFeHByZXNzaW9uKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRPS251bGw6CisgICAgY2FzZSBUT0tudW1iZXI6CisgICAgY2FzZSBUT0tzdHJpbmc6CisgICAgY2FzZSBUT0twbHVzOgorICAgIGNhc2UgVE9LbWludXM6CisgICAgY2FzZSBUT0trc25vdDoKKyAgICBjYXNlIFRPS2lkZW50aWZpZXI6CisgICAgY2FzZSBUT0tscGFyZW46CisgICAgICBleHByID0gUGFyc2VFeHBFeHByZXNzaW9uKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRPS2lmOgorICAgICAgZXhwciA9IFBhcnNlSWZFeHByZXNzaW9uKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRPS3doaWxlOgorICAgICAgZXhwciA9IFBhcnNlV2hpbGVFeHByZXNzaW9uKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRPS2ZvcjoKKyAgICAgIGV4cHIgPSBQYXJzZUZvckV4cHJlc3Npb24oKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVE9LZm9yZWFjaDoKKyAgICAgIGV4cHIgPSBQYXJzZUZvcmVhY2hFeHByZXNzaW9uKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRPS2RvOgorICAgICAgZXhwciA9IFBhcnNlRG9FeHByZXNzaW9uKCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRPS2JyZWFrOgorICAgICAgZXhwciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNQnJlYWtFeHByZXNzaW9uPihsaW5lKTsKKyAgICAgIGlmICghTmV4dFRva2VuKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUT0tjb250aW51ZToKKyAgICAgIGV4cHIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUNvbnRpbnVlRXhwcmVzc2lvbj4obGluZSk7CisgICAgICBpZiAoIU5leHRUb2tlbigpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBtX2Vycm9yID0gdHJ1ZTsKKyAgICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiBleHByOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IENYRkFfRk1QYXJzZXI6OlBhcnNlVmFyRXhwcmVzc2lvbigpIHsKKyAgQXV0b1Jlc3RvcmVyPHVuc2lnbmVkIGxvbmc+IHJlc3RvcmVyKCZtX3BhcnNlX2RlcHRoKTsKKyAgaWYgKEhhc0Vycm9yKCkgfHwgIUluY3JlbWVudFBhcnNlRGVwdGhBbmRDaGVjaygpKQorICAgIHJldHVybiBudWxscHRyOworCisgIFdpZGVTdHJpbmdWaWV3IGlkZW50OworICB1aW50MzJfdCBsaW5lID0gbV90b2tlbi0+bV9saW5lX251bTsKKyAgaWYgKCFOZXh0VG9rZW4oKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgaWYgKG1fdG9rZW4tPm1fdHlwZSAhPSBUT0tpZGVudGlmaWVyKSB7CisgICAgbV9lcnJvciA9IHRydWU7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBpZGVudCA9IG1fdG9rZW4tPm1fc3RyaW5nOworICBpZiAoIU5leHRUb2tlbigpKQorICAgIHJldHVybiBudWxscHRyOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gZXhwcjsKKyAgaWYgKG1fdG9rZW4tPm1fdHlwZSA9PSBUT0thc3NpZ24pIHsKKyAgICBpZiAoIU5leHRUb2tlbigpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBleHByID0gUGFyc2VFeHBFeHByZXNzaW9uKCk7CisgICAgaWYgKCFleHByKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1WYXJFeHByZXNzaW9uPihsaW5lLCBpZGVudCwgc3RkOjptb3ZlKGV4cHIpKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPgorQ1hGQV9GTVBhcnNlcjo6UGFyc2VTaW1wbGVFeHByZXNzaW9uKCkgeworICBpZiAoSGFzRXJyb3IoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICB1aW50MzJfdCBsaW5lID0gbV90b2tlbi0+bV9saW5lX251bTsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMSA9IFBhcnNlTG9naWNhbE9yRXhwcmVzc2lvbigpOworICBpZiAoIXBFeHAxKQorICAgIHJldHVybiBudWxscHRyOworICBpbnQgbGV2ZWwgPSAxOworICB3aGlsZSAobV90b2tlbi0+bV90eXBlID09IFRPS2Fzc2lnbikgeworICAgIGlmICghTmV4dFRva2VuKCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAyID0gUGFyc2VMb2dpY2FsT3JFeHByZXNzaW9uKCk7CisgICAgaWYgKCFwRXhwMikKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIGlmIChsZXZlbCsrID09IGtNYXhBc3NpZ25tZW50Q2hhaW5MZW5ndGgpIHsKKyAgICAgIG1fZXJyb3IgPSB0cnVlOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHBFeHAxID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1Bc3NpZ25FeHByZXNzaW9uPigKKyAgICAgICAgbGluZSwgVE9LYXNzaWduLCBzdGQ6Om1vdmUocEV4cDEpLCBzdGQ6Om1vdmUocEV4cDIpKTsKKyAgfQorICByZXR1cm4gcEV4cDE7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gQ1hGQV9GTVBhcnNlcjo6UGFyc2VFeHBFeHByZXNzaW9uKCkgeworICBBdXRvUmVzdG9yZXI8dW5zaWduZWQgbG9uZz4gcmVzdG9yZXIoJm1fcGFyc2VfZGVwdGgpOworICBpZiAoSGFzRXJyb3IoKSB8fCAhSW5jcmVtZW50UGFyc2VEZXB0aEFuZENoZWNrKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgdWludDMyX3QgbGluZSA9IG1fdG9rZW4tPm1fbGluZV9udW07CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cDEgPSBQYXJzZVNpbXBsZUV4cHJlc3Npb24oKTsKKyAgaWYgKCFwRXhwMSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNRXhwRXhwcmVzc2lvbj4obGluZSwgc3RkOjptb3ZlKHBFeHAxKSk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4KK0NYRkFfRk1QYXJzZXI6OlBhcnNlTG9naWNhbE9yRXhwcmVzc2lvbigpIHsKKyAgQXV0b1Jlc3RvcmVyPHVuc2lnbmVkIGxvbmc+IHJlc3RvcmVyKCZtX3BhcnNlX2RlcHRoKTsKKyAgaWYgKEhhc0Vycm9yKCkgfHwgIUluY3JlbWVudFBhcnNlRGVwdGhBbmRDaGVjaygpKQorICAgIHJldHVybiBudWxscHRyOworCisgIHVpbnQzMl90IGxpbmUgPSBtX3Rva2VuLT5tX2xpbmVfbnVtOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IGUxID0gUGFyc2VMb2dpY2FsQW5kRXhwcmVzc2lvbigpOworICBpZiAoIWUxKQorICAgIHJldHVybiBudWxscHRyOworCisgIGZvciAoOzspIHsKKyAgICBzd2l0Y2ggKG1fdG9rZW4tPm1fdHlwZSkgeworICAgICAgY2FzZSBUT0tvcjoKKyAgICAgIGNhc2UgVE9La3NvcjogeworICAgICAgICBpZiAoIU5leHRUb2tlbigpKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gZTIoCisgICAgICAgICAgICBQYXJzZUxvZ2ljYWxBbmRFeHByZXNzaW9uKCkpOworICAgICAgICBpZiAoIWUyKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICAgIGUxID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1Mb2dpY2FsT3JFeHByZXNzaW9uPigKKyAgICAgICAgICAgIGxpbmUsIFRPS29yLCBzdGQ6Om1vdmUoZTEpLCBzdGQ6Om1vdmUoZTIpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGUxOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+CitDWEZBX0ZNUGFyc2VyOjpQYXJzZUxvZ2ljYWxBbmRFeHByZXNzaW9uKCkgeworICBBdXRvUmVzdG9yZXI8dW5zaWduZWQgbG9uZz4gcmVzdG9yZXIoJm1fcGFyc2VfZGVwdGgpOworICBpZiAoSGFzRXJyb3IoKSB8fCAhSW5jcmVtZW50UGFyc2VEZXB0aEFuZENoZWNrKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgdWludDMyX3QgbGluZSA9IG1fdG9rZW4tPm1fbGluZV9udW07CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gZTEgPSBQYXJzZUVxdWFsaXR5RXhwcmVzc2lvbigpOworICBpZiAoIWUxKQorICAgIHJldHVybiBudWxscHRyOworCisgIGZvciAoOzspIHsKKyAgICBzd2l0Y2ggKG1fdG9rZW4tPm1fdHlwZSkgeworICAgICAgY2FzZSBUT0thbmQ6CisgICAgICBjYXNlIFRPS2tzYW5kOiB7CisgICAgICAgIGlmICghTmV4dFRva2VuKCkpCisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBlMiA9IFBhcnNlRXF1YWxpdHlFeHByZXNzaW9uKCk7CisgICAgICAgIGlmICghZTIpCisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgICAgZTEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUxvZ2ljYWxBbmRFeHByZXNzaW9uPigKKyAgICAgICAgICAgIGxpbmUsIFRPS2FuZCwgc3RkOjptb3ZlKGUxKSwgc3RkOjptb3ZlKGUyKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIHJldHVybiBlMTsKK30KKworc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPgorQ1hGQV9GTVBhcnNlcjo6UGFyc2VFcXVhbGl0eUV4cHJlc3Npb24oKSB7CisgIEF1dG9SZXN0b3Jlcjx1bnNpZ25lZCBsb25nPiByZXN0b3JlcigmbV9wYXJzZV9kZXB0aCk7CisgIGlmIChIYXNFcnJvcigpIHx8ICFJbmNyZW1lbnRQYXJzZURlcHRoQW5kQ2hlY2soKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICB1aW50MzJfdCBsaW5lID0gbV90b2tlbi0+bV9saW5lX251bTsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBlMSA9IFBhcnNlUmVsYXRpb25hbEV4cHJlc3Npb24oKTsKKyAgaWYgKCFlMSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgZm9yICg7OykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gZTI7CisgICAgc3dpdGNoIChtX3Rva2VuLT5tX3R5cGUpIHsKKyAgICAgIGNhc2UgVE9LZXE6CisgICAgICBjYXNlIFRPS2tzZXE6CisgICAgICAgIGlmICghTmV4dFRva2VuKCkpCisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgICAgZTIgPSBQYXJzZVJlbGF0aW9uYWxFeHByZXNzaW9uKCk7CisgICAgICAgIGlmICghZTIpCisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgICAgZTEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUVxdWFsaXR5RXhwcmVzc2lvbj4oCisgICAgICAgICAgICBsaW5lLCBUT0tlcSwgc3RkOjptb3ZlKGUxKSwgc3RkOjptb3ZlKGUyKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgY2FzZSBUT0tuZToKKyAgICAgIGNhc2UgVE9La3NuZToKKyAgICAgICAgaWYgKCFOZXh0VG9rZW4oKSkKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgICAgICBlMiA9IFBhcnNlUmVsYXRpb25hbEV4cHJlc3Npb24oKTsKKyAgICAgICAgaWYgKCFlMikKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgICAgICBlMSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNRXF1YWxpdHlFeHByZXNzaW9uPigKKyAgICAgICAgICAgIGxpbmUsIFRPS25lLCBzdGQ6Om1vdmUoZTEpLCBzdGQ6Om1vdmUoZTIpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGUxOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+CitDWEZBX0ZNUGFyc2VyOjpQYXJzZVJlbGF0aW9uYWxFeHByZXNzaW9uKCkgeworICBBdXRvUmVzdG9yZXI8dW5zaWduZWQgbG9uZz4gcmVzdG9yZXIoJm1fcGFyc2VfZGVwdGgpOworICBpZiAoSGFzRXJyb3IoKSB8fCAhSW5jcmVtZW50UGFyc2VEZXB0aEFuZENoZWNrKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgdWludDMyX3QgbGluZSA9IG1fdG9rZW4tPm1fbGluZV9udW07CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gZTEgPSBQYXJzZUFkZHRpdmVFeHByZXNzaW9uKCk7CisgIGlmICghZTEpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgZm9yICg7OykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gZTI7CisgICAgc3dpdGNoIChtX3Rva2VuLT5tX3R5cGUpIHsKKyAgICAgIGNhc2UgVE9LbHQ6CisgICAgICBjYXNlIFRPS2tzbHQ6CisgICAgICAgIGlmICghTmV4dFRva2VuKCkpCisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgICAgZTIgPSBQYXJzZUFkZHRpdmVFeHByZXNzaW9uKCk7CisgICAgICAgIGlmICghZTIpCisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgICAgZTEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uPigKKyAgICAgICAgICAgIGxpbmUsIFRPS2x0LCBzdGQ6Om1vdmUoZTEpLCBzdGQ6Om1vdmUoZTIpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICBjYXNlIFRPS2d0OgorICAgICAgY2FzZSBUT0trc2d0OgorICAgICAgICBpZiAoIU5leHRUb2tlbigpKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICAgIGUyID0gUGFyc2VBZGR0aXZlRXhwcmVzc2lvbigpOworICAgICAgICBpZiAoIWUyKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICAgIGUxID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1SZWxhdGlvbmFsRXhwcmVzc2lvbj4oCisgICAgICAgICAgICBsaW5lLCBUT0tndCwgc3RkOjptb3ZlKGUxKSwgc3RkOjptb3ZlKGUyKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgY2FzZSBUT0tsZToKKyAgICAgIGNhc2UgVE9La3NsZToKKyAgICAgICAgaWYgKCFOZXh0VG9rZW4oKSkKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgICAgICBlMiA9IFBhcnNlQWRkdGl2ZUV4cHJlc3Npb24oKTsKKyAgICAgICAgaWYgKCFlMikKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgICAgICBlMSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNUmVsYXRpb25hbEV4cHJlc3Npb24+KAorICAgICAgICAgICAgbGluZSwgVE9LbGUsIHN0ZDo6bW92ZShlMSksIHN0ZDo6bW92ZShlMikpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGNhc2UgVE9LZ2U6CisgICAgICBjYXNlIFRPS2tzZ2U6CisgICAgICAgIGlmICghTmV4dFRva2VuKCkpCisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgICAgZTIgPSBQYXJzZUFkZHRpdmVFeHByZXNzaW9uKCk7CisgICAgICAgIGlmICghZTIpCisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgICAgZTEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uPigKKyAgICAgICAgICAgIGxpbmUsIFRPS2dlLCBzdGQ6Om1vdmUoZTEpLCBzdGQ6Om1vdmUoZTIpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGUxOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+CitDWEZBX0ZNUGFyc2VyOjpQYXJzZUFkZHRpdmVFeHByZXNzaW9uKCkgeworICBBdXRvUmVzdG9yZXI8dW5zaWduZWQgbG9uZz4gcmVzdG9yZXIoJm1fcGFyc2VfZGVwdGgpOworICBpZiAoSGFzRXJyb3IoKSB8fCAhSW5jcmVtZW50UGFyc2VEZXB0aEFuZENoZWNrKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgdWludDMyX3QgbGluZSA9IG1fdG9rZW4tPm1fbGluZV9udW07CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gZTEgPSBQYXJzZU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOworICBpZiAoIWUxKQorICAgIHJldHVybiBudWxscHRyOworCisgIGZvciAoOzspIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IGUyOworICAgIHN3aXRjaCAobV90b2tlbi0+bV90eXBlKSB7CisgICAgICBjYXNlIFRPS3BsdXM6CisgICAgICAgIGlmICghTmV4dFRva2VuKCkpCisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgICAgZTIgPSBQYXJzZU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOworICAgICAgICBpZiAoIWUyKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICAgIGUxID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1BZGRpdGl2ZUV4cHJlc3Npb24+KAorICAgICAgICAgICAgbGluZSwgVE9LcGx1cywgc3RkOjptb3ZlKGUxKSwgc3RkOjptb3ZlKGUyKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgY2FzZSBUT0ttaW51czoKKyAgICAgICAgaWYgKCFOZXh0VG9rZW4oKSkKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgICAgICBlMiA9IFBhcnNlTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCk7CisgICAgICAgIGlmICghZTIpCisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgICAgZTEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUFkZGl0aXZlRXhwcmVzc2lvbj4oCisgICAgICAgICAgICBsaW5lLCBUT0ttaW51cywgc3RkOjptb3ZlKGUxKSwgc3RkOjptb3ZlKGUyKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGJyZWFrOworICB9CisgIHJldHVybiBlMTsKK30KKworc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPgorQ1hGQV9GTVBhcnNlcjo6UGFyc2VNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKSB7CisgIEF1dG9SZXN0b3Jlcjx1bnNpZ25lZCBsb25nPiByZXN0b3JlcigmbV9wYXJzZV9kZXB0aCk7CisgIGlmIChIYXNFcnJvcigpIHx8ICFJbmNyZW1lbnRQYXJzZURlcHRoQW5kQ2hlY2soKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICB1aW50MzJfdCBsaW5lID0gbV90b2tlbi0+bV9saW5lX251bTsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBlMSA9IFBhcnNlVW5hcnlFeHByZXNzaW9uKCk7CisgIGlmICghZTEpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgZm9yICg7OykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gZTI7CisgICAgc3dpdGNoIChtX3Rva2VuLT5tX3R5cGUpIHsKKyAgICAgIGNhc2UgVE9LbXVsOgorICAgICAgICBpZiAoIU5leHRUb2tlbigpKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICAgIGUyID0gUGFyc2VVbmFyeUV4cHJlc3Npb24oKTsKKyAgICAgICAgaWYgKCFlMikKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgICAgICBlMSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uPigKKyAgICAgICAgICAgIGxpbmUsIFRPS211bCwgc3RkOjptb3ZlKGUxKSwgc3RkOjptb3ZlKGUyKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgY2FzZSBUT0tkaXY6CisgICAgICAgIGlmICghTmV4dFRva2VuKCkpCisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgICAgZTIgPSBQYXJzZVVuYXJ5RXhwcmVzc2lvbigpOworICAgICAgICBpZiAoIWUyKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICAgIGUxID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24+KAorICAgICAgICAgICAgbGluZSwgVE9LZGl2LCBzdGQ6Om1vdmUoZTEpLCBzdGQ6Om1vdmUoZTIpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIGUxOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IENYRkFfRk1QYXJzZXI6OlBhcnNlVW5hcnlFeHByZXNzaW9uKCkgeworICBBdXRvUmVzdG9yZXI8dW5zaWduZWQgbG9uZz4gcmVzdG9yZXIoJm1fcGFyc2VfZGVwdGgpOworICBpZiAoSGFzRXJyb3IoKSB8fCAhSW5jcmVtZW50UGFyc2VEZXB0aEFuZENoZWNrKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBleHByOworICB1aW50MzJfdCBsaW5lID0gbV90b2tlbi0+bV9saW5lX251bTsKKyAgc3dpdGNoIChtX3Rva2VuLT5tX3R5cGUpIHsKKyAgICBjYXNlIFRPS3BsdXM6CisgICAgICBpZiAoIU5leHRUb2tlbigpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgICAgZXhwciA9IFBhcnNlVW5hcnlFeHByZXNzaW9uKCk7CisgICAgICBpZiAoIWV4cHIpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICBleHByID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1Qb3NFeHByZXNzaW9uPihsaW5lLCBzdGQ6Om1vdmUoZXhwcikpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUT0ttaW51czoKKyAgICAgIGlmICghTmV4dFRva2VuKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICBleHByID0gUGFyc2VVbmFyeUV4cHJlc3Npb24oKTsKKyAgICAgIGlmICghZXhwcikKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgIGV4cHIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTU5lZ0V4cHJlc3Npb24+KGxpbmUsIHN0ZDo6bW92ZShleHByKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRPS2tzbm90OgorICAgICAgaWYgKCFOZXh0VG9rZW4oKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgIGV4cHIgPSBQYXJzZVVuYXJ5RXhwcmVzc2lvbigpOworICAgICAgaWYgKCFleHByKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgICAgZXhwciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNTm90RXhwcmVzc2lvbj4obGluZSwgc3RkOjptb3ZlKGV4cHIpKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBleHByID0gUGFyc2VQcmltYXJ5RXhwcmVzc2lvbigpOworICAgICAgaWYgKCFleHByKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBleHByOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+CitDWEZBX0ZNUGFyc2VyOjpQYXJzZVByaW1hcnlFeHByZXNzaW9uKCkgeworICBBdXRvUmVzdG9yZXI8dW5zaWduZWQgbG9uZz4gcmVzdG9yZXIoJm1fcGFyc2VfZGVwdGgpOworICBpZiAoSGFzRXJyb3IoKSB8fCAhSW5jcmVtZW50UGFyc2VEZXB0aEFuZENoZWNrKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBleHByOworICB1aW50MzJfdCBsaW5lID0gbV90b2tlbi0+bV9saW5lX251bTsKKyAgc3dpdGNoIChtX3Rva2VuLT5tX3R5cGUpIHsKKyAgICBjYXNlIFRPS251bWJlcjoKKyAgICAgIGV4cHIgPQorICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNTnVtYmVyRXhwcmVzc2lvbj4obGluZSwgbV90b2tlbi0+bV9zdHJpbmcpOworICAgICAgaWYgKCFOZXh0VG9rZW4oKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRPS3N0cmluZzoKKyAgICAgIGV4cHIgPQorICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNU3RyaW5nRXhwcmVzc2lvbj4obGluZSwgbV90b2tlbi0+bV9zdHJpbmcpOworICAgICAgaWYgKCFOZXh0VG9rZW4oKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRPS2lkZW50aWZpZXI6IHsKKyAgICAgIFdpZGVTdHJpbmdWaWV3IHdzSWRlbnRpZmllcihtX3Rva2VuLT5tX3N0cmluZyk7CisgICAgICBpZiAoIU5leHRUb2tlbigpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIGlmIChtX3Rva2VuLT5tX3R5cGUgPT0gVE9LbGJyYWNrZXQpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBzID0gUGFyc2VJbmRleEV4cHJlc3Npb24oKTsKKyAgICAgICAgaWYgKCFzKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICAgIGV4cHIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbj4oCisgICAgICAgICAgICBsaW5lLCBudWxscHRyLCBUT0tkb3QsIHdzSWRlbnRpZmllciwgc3RkOjptb3ZlKHMpKTsKKyAgICAgICAgaWYgKCFleHByKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICBpZiAoIU5leHRUb2tlbigpKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZXhwciA9CisgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9uPihsaW5lLCB3c0lkZW50aWZpZXIpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgVE9LaWY6CisgICAgICBleHByID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1JZGVudGlmaWVyRXhwcmVzc2lvbj4obGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3Rva2VuLT5tX3N0cmluZyk7CisgICAgICBpZiAoIWV4cHIgfHwgIU5leHRUb2tlbigpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVE9LbnVsbDoKKyAgICAgIGV4cHIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTU51bGxFeHByZXNzaW9uPihsaW5lKTsKKyAgICAgIGlmICghZXhwciB8fCAhTmV4dFRva2VuKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUT0tscGFyZW46CisgICAgICBleHByID0gUGFyc2VQYXJlbkV4cHJlc3Npb24oKTsKKyAgICAgIGlmICghZXhwcikKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbV9lcnJvciA9IHRydWU7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBleHByID0gUGFyc2VQb3N0RXhwcmVzc2lvbihzdGQ6Om1vdmUoZXhwcikpOworICBpZiAoIWV4cHIpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBleHByOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IENYRkFfRk1QYXJzZXI6OlBhcnNlUG9zdEV4cHJlc3Npb24oCisgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBleHByKSB7CisgIEF1dG9SZXN0b3Jlcjx1bnNpZ25lZCBsb25nPiByZXN0b3JlcigmbV9wYXJzZV9kZXB0aCk7CisgIGlmIChIYXNFcnJvcigpIHx8ICFJbmNyZW1lbnRQYXJzZURlcHRoQW5kQ2hlY2soKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBpZiAoSGFzRXJyb3IoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICB1aW50MzJfdCBsaW5lID0gbV90b2tlbi0+bV9saW5lX251bTsKKyAgd2hpbGUgKDEpIHsKKyAgICBzd2l0Y2ggKG1fdG9rZW4tPm1fdHlwZSkgeworICAgICAgY2FzZSBUT0tscGFyZW46IHsKKyAgICAgICAgaWYgKCFOZXh0VG9rZW4oKSkKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPj4gZXhwcmVzc2lvbnM7CisgICAgICAgIGlmIChtX3Rva2VuLT5tX3R5cGUgIT0gVE9LcnBhcmVuKSB7CisgICAgICAgICAgd2hpbGUgKG1fdG9rZW4tPm1fdHlwZSAhPSBUT0tycGFyZW4pIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gc2ltcGxlX2V4cHIgPQorICAgICAgICAgICAgICAgIFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOworICAgICAgICAgICAgaWYgKCFzaW1wbGVfZXhwcikKKyAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgICAgICAgIGV4cHJlc3Npb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoc2ltcGxlX2V4cHIpKTsKKyAgICAgICAgICAgIGlmIChtX3Rva2VuLT5tX3R5cGUgPT0gVE9LY29tbWEpIHsKKyAgICAgICAgICAgICAgaWYgKCFOZXh0VG9rZW4oKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobV90b2tlbi0+bV90eXBlID09IFRPS2VvZiB8fAorICAgICAgICAgICAgICAgICAgICAgICBtX3Rva2VuLT5tX3R5cGUgPT0gVE9LcmVzZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChtX3Rva2VuLT5tX3R5cGUgIT0gVE9LcnBhcmVuKSB7CisgICAgICAgICAgICBtX2Vycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBleHByID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1DYWxsRXhwcmVzc2lvbj4oCisgICAgICAgICAgICBsaW5lLCBzdGQ6Om1vdmUoZXhwciksIHN0ZDo6bW92ZShleHByZXNzaW9ucyksIGZhbHNlKTsKKyAgICAgICAgaWYgKCFOZXh0VG9rZW4oKSkKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgaWYgKG1fdG9rZW4tPm1fdHlwZSAhPSBUT0tsYnJhY2tldCkKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHMgPSBQYXJzZUluZGV4RXhwcmVzc2lvbigpOworICAgICAgICBpZiAoIXMpCisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgICAgZXhwciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uPigKKyAgICAgICAgICAgIGxpbmUsIHN0ZDo6bW92ZShleHByKSwgVE9LY2FsbCwgTCIiLCBzdGQ6Om1vdmUocykpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgVE9LZG90OiB7CisgICAgICAgIGlmICghTmV4dFRva2VuKCkpCisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIGlmIChtX3Rva2VuLT5tX3R5cGUgIT0gVE9LaWRlbnRpZmllcikgeworICAgICAgICAgIG1fZXJyb3IgPSB0cnVlOworICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIFdpZGVTdHJpbmdWaWV3IHRlbXBTdHIgPSBtX3Rva2VuLT5tX3N0cmluZzsKKyAgICAgICAgdWludDMyX3QgdGVtcExpbmUgPSBtX3Rva2VuLT5tX2xpbmVfbnVtOworICAgICAgICBpZiAoIU5leHRUb2tlbigpKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICBpZiAobV90b2tlbi0+bV90eXBlID09IFRPS2xwYXJlbikgeworICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cENhbGw7CisgICAgICAgICAgaWYgKCFOZXh0VG9rZW4oKSkKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPj4gZXhwcmVzc2lvbnM7CisgICAgICAgICAgaWYgKG1fdG9rZW4tPm1fdHlwZSAhPSBUT0tycGFyZW4pIHsKKyAgICAgICAgICAgIHdoaWxlIChtX3Rva2VuLT5tX3R5cGUgIT0gVE9LcnBhcmVuKSB7CisgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gZXhwID0KKyAgICAgICAgICAgICAgICAgIFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICBpZiAoIWV4cCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgICAgICAgICAgICBleHByZXNzaW9ucy5wdXNoX2JhY2soc3RkOjptb3ZlKGV4cCkpOworICAgICAgICAgICAgICBpZiAobV90b2tlbi0+bV90eXBlID09IFRPS2NvbW1hKSB7CisgICAgICAgICAgICAgICAgaWYgKCFOZXh0VG9rZW4oKSkKKyAgICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1fdG9rZW4tPm1fdHlwZSA9PSBUT0tlb2YgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3Rva2VuLT5tX3R5cGUgPT0gVE9LcmVzZXJ2ZXIpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1fdG9rZW4tPm1fdHlwZSAhPSBUT0tycGFyZW4pIHsKKyAgICAgICAgICAgICAgbV9lcnJvciA9IHRydWU7CisgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBJZGVudGlmaWVyID0KKyAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1JZGVudGlmaWVyRXhwcmVzc2lvbj4odGVtcExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBTdHIpOworICAgICAgICAgIHBFeHBDYWxsID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1DYWxsRXhwcmVzc2lvbj4oCisgICAgICAgICAgICAgIGxpbmUsIHN0ZDo6bW92ZShwSWRlbnRpZmllciksIHN0ZDo6bW92ZShleHByZXNzaW9ucyksIHRydWUpOworICAgICAgICAgIGV4cHIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTU1ldGhvZENhbGxFeHByZXNzaW9uPigKKyAgICAgICAgICAgICAgbGluZSwgc3RkOjptb3ZlKGV4cHIpLCBzdGQ6Om1vdmUocEV4cENhbGwpKTsKKyAgICAgICAgICBpZiAoIU5leHRUb2tlbigpKQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgaWYgKG1fdG9rZW4tPm1fdHlwZSAhPSBUT0tsYnJhY2tldCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBzID0gUGFyc2VJbmRleEV4cHJlc3Npb24oKTsKKyAgICAgICAgICBpZiAoIXMpCisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgICAgICAgIGV4cHIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbj4oCisgICAgICAgICAgICAgIGxpbmUsIHN0ZDo6bW92ZShleHByKSwgVE9LY2FsbCwgTCIiLCBzdGQ6Om1vdmUocykpOworICAgICAgICB9IGVsc2UgaWYgKG1fdG9rZW4tPm1fdHlwZSA9PSBUT0tsYnJhY2tldCkgeworICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcyA9IFBhcnNlSW5kZXhFeHByZXNzaW9uKCk7CisgICAgICAgICAgaWYgKCFzKQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgICAgICBleHByID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24+KAorICAgICAgICAgICAgICB0ZW1wTGluZSwgc3RkOjptb3ZlKGV4cHIpLCBUT0tkb3QsIHRlbXBTdHIsIHN0ZDo6bW92ZShzKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBzID0KKyAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1JbmRleEV4cHJlc3Npb24+KAorICAgICAgICAgICAgICAgICAgdGVtcExpbmUsIEFDQ0VTU09SX05PX0lOREVYLCBudWxscHRyLCBmYWxzZSk7CisgICAgICAgICAgZXhwciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uPigKKyAgICAgICAgICAgICAgbGluZSwgc3RkOjptb3ZlKGV4cHIpLCBUT0tkb3QsIHRlbXBTdHIsIHN0ZDo6bW92ZShzKSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIFRPS2RvdGRvdDogeworICAgICAgICBpZiAoIU5leHRUb2tlbigpKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICBpZiAobV90b2tlbi0+bV90eXBlICE9IFRPS2lkZW50aWZpZXIpIHsKKyAgICAgICAgICBtX2Vycm9yID0gdHJ1ZTsKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBXaWRlU3RyaW5nVmlldyB0ZW1wU3RyID0gbV90b2tlbi0+bV9zdHJpbmc7CisgICAgICAgIHVpbnQzMl90IHRlbXBMaW5lID0gbV90b2tlbi0+bV9saW5lX251bTsKKyAgICAgICAgaWYgKCFOZXh0VG9rZW4oKSkKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgaWYgKG1fdG9rZW4tPm1fdHlwZSA9PSBUT0tsYnJhY2tldCkgeworICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcyA9IFBhcnNlSW5kZXhFeHByZXNzaW9uKCk7CisgICAgICAgICAgaWYgKCFzKQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgICAgICBleHByID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1Eb3REb3RBY2Nlc3NvckV4cHJlc3Npb24+KAorICAgICAgICAgICAgICB0ZW1wTGluZSwgc3RkOjptb3ZlKGV4cHIpLCBUT0tkb3Rkb3QsIHRlbXBTdHIsIHN0ZDo6bW92ZShzKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBzID0KKyAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1JbmRleEV4cHJlc3Npb24+KAorICAgICAgICAgICAgICAgICAgdGVtcExpbmUsIEFDQ0VTU09SX05PX0lOREVYLCBudWxscHRyLCBmYWxzZSk7CisgICAgICAgICAgZXhwciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNRG90RG90QWNjZXNzb3JFeHByZXNzaW9uPigKKyAgICAgICAgICAgICAgbGluZSwgc3RkOjptb3ZlKGV4cHIpLCBUT0tkb3Rkb3QsIHRlbXBTdHIsIHN0ZDo6bW92ZShzKSk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0gYnJlYWs7CisgICAgICBjYXNlIFRPS2RvdHNjcmVhbTogeworICAgICAgICBpZiAoIU5leHRUb2tlbigpKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICBpZiAobV90b2tlbi0+bV90eXBlICE9IFRPS2lkZW50aWZpZXIpIHsKKyAgICAgICAgICBtX2Vycm9yID0gdHJ1ZTsKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBXaWRlU3RyaW5nVmlldyB0ZW1wU3RyID0gbV90b2tlbi0+bV9zdHJpbmc7CisgICAgICAgIHVpbnQzMl90IHRlbXBMaW5lID0gbV90b2tlbi0+bV9saW5lX251bTsKKyAgICAgICAgaWYgKCFOZXh0VG9rZW4oKSkKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgaWYgKG1fdG9rZW4tPm1fdHlwZSAhPSBUT0tsYnJhY2tldCkgeworICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcyA9CisgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNSW5kZXhFeHByZXNzaW9uPigKKyAgICAgICAgICAgICAgICAgIHRlbXBMaW5lLCBBQ0NFU1NPUl9OT19JTkRFWCwgbnVsbHB0ciwgZmFsc2UpOworICAgICAgICAgIGV4cHIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbj4oCisgICAgICAgICAgICAgIGxpbmUsIHN0ZDo6bW92ZShleHByKSwgVE9LZG90c2NyZWFtLCB0ZW1wU3RyLCBzdGQ6Om1vdmUocykpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcyA9IFBhcnNlSW5kZXhFeHByZXNzaW9uKCk7CisgICAgICAgIGlmICghcykKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgICAgICBleHByID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24+KAorICAgICAgICAgICAgdGVtcExpbmUsIHN0ZDo6bW92ZShleHByKSwgVE9LZG90c2NyZWFtLCB0ZW1wU3RyLCBzdGQ6Om1vdmUocykpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgVE9LZG90c3RhcjogeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHMgPQorICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1JbmRleEV4cHJlc3Npb24+KGxpbmUsIEFDQ0VTU09SX05PX0lOREVYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIGZhbHNlKTsKKyAgICAgICAgZXhwciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uPigKKyAgICAgICAgICAgIGxpbmUsIHN0ZDo6bW92ZShleHByKSwgVE9LZG90c3RhciwgTCIqIiwgc3RkOjptb3ZlKHMpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZXhwcjsKKyAgICB9CisgICAgaWYgKCFOZXh0VG9rZW4oKSkKKyAgICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiBleHByOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IENYRkFfRk1QYXJzZXI6OlBhcnNlSW5kZXhFeHByZXNzaW9uKCkgeworICBBdXRvUmVzdG9yZXI8dW5zaWduZWQgbG9uZz4gcmVzdG9yZXIoJm1fcGFyc2VfZGVwdGgpOworICBpZiAoSGFzRXJyb3IoKSB8fCAhSW5jcmVtZW50UGFyc2VEZXB0aEFuZENoZWNrKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgdWludDMyX3QgbGluZSA9IG1fdG9rZW4tPm1fbGluZV9udW07CisgIGlmICghTmV4dFRva2VuKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBzOworICBYRkFfRk1fQWNjZXNzb3JJbmRleCBhY2Nlc3NvckluZGV4ID0gQUNDRVNTT1JfTk9fUkVMQVRJVkVJTkRFWDsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwOworICBpZiAobV90b2tlbi0+bV90eXBlID09IFRPS211bCkgeworICAgIHBFeHAgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUluZGV4RXhwcmVzc2lvbj4obGluZSwgYWNjZXNzb3JJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShzKSwgdHJ1ZSk7CisgICAgaWYgKCFwRXhwIHx8ICFOZXh0VG9rZW4oKSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIGlmIChtX3Rva2VuLT5tX3R5cGUgIT0gVE9LcmJyYWNrZXQpIHsKKyAgICAgIG1fZXJyb3IgPSB0cnVlOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBwRXhwOworICB9CisgIGlmIChtX3Rva2VuLT5tX3R5cGUgPT0gVE9LcGx1cykgeworICAgIGFjY2Vzc29ySW5kZXggPSBBQ0NFU1NPUl9QT1NJVElWRV9JTkRFWDsKKyAgICBpZiAoIU5leHRUb2tlbigpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0gZWxzZSBpZiAobV90b2tlbi0+bV90eXBlID09IFRPS21pbnVzKSB7CisgICAgYWNjZXNzb3JJbmRleCA9IEFDQ0VTU09SX05FR0FUSVZFX0lOREVYOworICAgIGlmICghTmV4dFRva2VuKCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBzID0gUGFyc2VTaW1wbGVFeHByZXNzaW9uKCk7CisgIGlmICghcykKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgaWYgKG1fdG9rZW4tPm1fdHlwZSAhPSBUT0tyYnJhY2tldCkgeworICAgIG1fZXJyb3IgPSB0cnVlOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUluZGV4RXhwcmVzc2lvbj4obGluZSwgYWNjZXNzb3JJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocyksIGZhbHNlKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBDWEZBX0ZNUGFyc2VyOjpQYXJzZVBhcmVuRXhwcmVzc2lvbigpIHsKKyAgQXV0b1Jlc3RvcmVyPHVuc2lnbmVkIGxvbmc+IHJlc3RvcmVyKCZtX3BhcnNlX2RlcHRoKTsKKyAgaWYgKEhhc0Vycm9yKCkgfHwgIUluY3JlbWVudFBhcnNlRGVwdGhBbmRDaGVjaygpKQorICAgIHJldHVybiBudWxscHRyOworCisgIGlmICghQ2hlY2tUaGVuTmV4dChUT0tscGFyZW4pKQorICAgIHJldHVybiBudWxscHRyOworCisgIGlmIChtX3Rva2VuLT5tX3R5cGUgPT0gVE9LcnBhcmVuKSB7CisgICAgbV9lcnJvciA9IHRydWU7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB1aW50MzJfdCBsaW5lID0gbV90b2tlbi0+bV9saW5lX251bTsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMSA9IFBhcnNlTG9naWNhbE9yRXhwcmVzc2lvbigpOworICBpZiAoIXBFeHAxKQorICAgIHJldHVybiBudWxscHRyOworCisgIGludCBsZXZlbCA9IDE7CisgIHdoaWxlIChtX3Rva2VuLT5tX3R5cGUgPT0gVE9LYXNzaWduKSB7CisgICAgaWYgKCFOZXh0VG9rZW4oKSkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMiA9IFBhcnNlTG9naWNhbE9yRXhwcmVzc2lvbigpOworICAgIGlmICghcEV4cDIpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBpZiAobGV2ZWwrKyA9PSBrTWF4QXNzaWdubWVudENoYWluTGVuZ3RoKSB7CisgICAgICBtX2Vycm9yID0gdHJ1ZTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHBFeHAxID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1Bc3NpZ25FeHByZXNzaW9uPigKKyAgICAgICAgbGluZSwgVE9LYXNzaWduLCBzdGQ6Om1vdmUocEV4cDEpLCBzdGQ6Om1vdmUocEV4cDIpKTsKKyAgfQorICBpZiAoIUNoZWNrVGhlbk5leHQoVE9LcnBhcmVuKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIHBFeHAxOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IENYRkFfRk1QYXJzZXI6OlBhcnNlQmxvY2tFeHByZXNzaW9uKCkgeworICBBdXRvUmVzdG9yZXI8dW5zaWduZWQgbG9uZz4gcmVzdG9yZXIoJm1fcGFyc2VfZGVwdGgpOworICBpZiAoSGFzRXJyb3IoKSB8fCAhSW5jcmVtZW50UGFyc2VEZXB0aEFuZENoZWNrKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgaWYgKEhhc0Vycm9yKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgdWludDMyX3QgbGluZSA9IG1fdG9rZW4tPm1fbGluZV9udW07CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4+IGV4cHJlc3Npb25zOworICB3aGlsZSAoMSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gZXhwcjsKKyAgICBzd2l0Y2ggKG1fdG9rZW4tPm1fdHlwZSkgeworICAgICAgY2FzZSBUT0tlb2Y6CisgICAgICBjYXNlIFRPS2VuZGlmOgorICAgICAgY2FzZSBUT0tlbHNlaWY6CisgICAgICBjYXNlIFRPS2Vsc2U6CisgICAgICBjYXNlIFRPS2VuZHdoaWxlOgorICAgICAgY2FzZSBUT0tlbmRmb3I6CisgICAgICBjYXNlIFRPS2VuZDoKKyAgICAgIGNhc2UgVE9LZW5kZnVuYzoKKyAgICAgIGNhc2UgVE9LcmVzZXJ2ZXI6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBUT0tmdW5jOgorICAgICAgICBleHByID0gUGFyc2VGdW5jdGlvbigpOworICAgICAgICBpZiAoIWV4cHIpCisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgICAgZXhwcmVzc2lvbnMucHVzaF9iYWNrKHN0ZDo6bW92ZShleHByKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZXhwciA9IFBhcnNlRXhwcmVzc2lvbigpOworICAgICAgICBpZiAoIWV4cHIpCisgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgICAgZXhwcmVzc2lvbnMucHVzaF9iYWNrKHN0ZDo6bW92ZShleHByKSk7CisgICAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1CbG9ja0V4cHJlc3Npb24+KGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGV4cHJlc3Npb25zKSk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gQ1hGQV9GTVBhcnNlcjo6UGFyc2VJZkV4cHJlc3Npb24oKSB7CisgIEF1dG9SZXN0b3Jlcjx1bnNpZ25lZCBsb25nPiByZXN0b3JlcigmbV9wYXJzZV9kZXB0aCk7CisgIGlmIChIYXNFcnJvcigpIHx8ICFJbmNyZW1lbnRQYXJzZURlcHRoQW5kQ2hlY2soKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICB1aW50MzJfdCBsaW5lID0gbV90b2tlbi0+bV9saW5lX251bTsKKyAgY29uc3Qgd2NoYXJfdCogcFN0YXJ0UG9zID0gbV9sZXhlci0+R2V0UG9zKCk7CisgIGlmICghTmV4dFRva2VuKCkgfHwgIUNoZWNrVGhlbk5leHQoVE9LbHBhcmVuKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHByZXNzaW9uOworICB3aGlsZSAobV90b2tlbi0+bV90eXBlICE9IFRPS3JwYXJlbikgeworICAgIHBFeHByZXNzaW9uID0gUGFyc2VTaW1wbGVFeHByZXNzaW9uKCk7CisgICAgaWYgKCFwRXhwcmVzc2lvbikKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIGlmIChtX3Rva2VuLT5tX3R5cGUgIT0gVE9LY29tbWEpCisgICAgICBicmVhazsKKyAgICBpZiAoIU5leHRUb2tlbigpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaWYgKCFDaGVja1RoZW5OZXh0KFRPS3JwYXJlbikpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIGlmIChtX3Rva2VuLT5tX3R5cGUgIT0gVE9LdGhlbikgeworICAgIG1fbGV4ZXItPlNldEN1cnJlbnRMaW5lKGxpbmUpOworICAgIGF1dG8gcE5ld1Rva2VuID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1Ub2tlbj4obGluZSk7CisgICAgbV90b2tlbiA9IHN0ZDo6bW92ZShwTmV3VG9rZW4pOworICAgIG1fdG9rZW4tPm1fdHlwZSA9IFRPS2lkZW50aWZpZXI7CisgICAgbV90b2tlbi0+bV9zdHJpbmcgPSBMImlmIjsKKyAgICBtX2xleGVyLT5TZXRQb3MocFN0YXJ0UG9zKTsKKyAgICByZXR1cm4gUGFyc2VFeHBFeHByZXNzaW9uKCk7CisgIH0KKyAgaWYgKCFDaGVja1RoZW5OZXh0KFRPS3RoZW4pKQorICAgIHJldHVybiBudWxscHRyOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gcElmRXhwcmVzc2lvbiA9IFBhcnNlQmxvY2tFeHByZXNzaW9uKCk7CisgIGlmICghcElmRXhwcmVzc2lvbikKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IHBFbHNlRXhwcmVzc2lvbjsKKyAgc3dpdGNoIChtX3Rva2VuLT5tX3R5cGUpIHsKKyAgICBjYXNlIFRPS2VvZjoKKyAgICBjYXNlIFRPS2VuZGlmOgorICAgICAgaWYgKCFDaGVja1RoZW5OZXh0KFRPS2VuZGlmKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRPS2lmOgorICAgICAgcEVsc2VFeHByZXNzaW9uID0gUGFyc2VJZkV4cHJlc3Npb24oKTsKKyAgICAgIGlmICghcEVsc2VFeHByZXNzaW9uIHx8ICFDaGVja1RoZW5OZXh0KFRPS2VuZGlmKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRPS2Vsc2VpZjoKKyAgICAgIHBFbHNlRXhwcmVzc2lvbiA9IFBhcnNlSWZFeHByZXNzaW9uKCk7CisgICAgICBpZiAoIXBFbHNlRXhwcmVzc2lvbikKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRPS2Vsc2U6CisgICAgICBpZiAoIU5leHRUb2tlbigpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIHBFbHNlRXhwcmVzc2lvbiA9IFBhcnNlQmxvY2tFeHByZXNzaW9uKCk7CisgICAgICBpZiAoIXBFbHNlRXhwcmVzc2lvbiB8fCAhQ2hlY2tUaGVuTmV4dChUT0tlbmRpZikpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIG1fZXJyb3IgPSB0cnVlOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuIHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNSWZFeHByZXNzaW9uPihsaW5lLCBzdGQ6Om1vdmUocEV4cHJlc3Npb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwSWZFeHByZXNzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocEVsc2VFeHByZXNzaW9uKSk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gQ1hGQV9GTVBhcnNlcjo6UGFyc2VXaGlsZUV4cHJlc3Npb24oKSB7CisgIEF1dG9SZXN0b3Jlcjx1bnNpZ25lZCBsb25nPiByZXN0b3JlcigmbV9wYXJzZV9kZXB0aCk7CisgIGlmIChIYXNFcnJvcigpIHx8ICFJbmNyZW1lbnRQYXJzZURlcHRoQW5kQ2hlY2soKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICB1aW50MzJfdCBsaW5lID0gbV90b2tlbi0+bV9saW5lX251bTsKKyAgaWYgKCFOZXh0VG9rZW4oKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBDb25kaXRpb24gPSBQYXJzZVBhcmVuRXhwcmVzc2lvbigpOworICBpZiAoIXBDb25kaXRpb24gfHwgIUNoZWNrVGhlbk5leHQoVE9LZG8pKQorICAgIHJldHVybiBudWxscHRyOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gcEV4cHJlc3Npb24gPSBQYXJzZUJsb2NrRXhwcmVzc2lvbigpOworICBpZiAoIXBFeHByZXNzaW9uIHx8ICFDaGVja1RoZW5OZXh0KFRPS2VuZHdoaWxlKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNV2hpbGVFeHByZXNzaW9uPihsaW5lLCBzdGQ6Om1vdmUocENvbmRpdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHBFeHByZXNzaW9uKSk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4KK0NYRkFfRk1QYXJzZXI6OlBhcnNlU3ViYXNzaWdubWVudEluRm9yRXhwcmVzc2lvbigpIHsKKyAgQXV0b1Jlc3RvcmVyPHVuc2lnbmVkIGxvbmc+IHJlc3RvcmVyKCZtX3BhcnNlX2RlcHRoKTsKKyAgaWYgKEhhc0Vycm9yKCkgfHwgIUluY3JlbWVudFBhcnNlRGVwdGhBbmRDaGVjaygpKQorICAgIHJldHVybiBudWxscHRyOworCisgIGlmIChIYXNFcnJvcigpKQorICAgIHJldHVybiBudWxscHRyOworCisgIGlmIChtX3Rva2VuLT5tX3R5cGUgIT0gVE9LaWRlbnRpZmllcikgeworICAgIG1fZXJyb3IgPSB0cnVlOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gZXhwciA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOworICBpZiAoIWV4cHIpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBleHByOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IENYRkFfRk1QYXJzZXI6OlBhcnNlRm9yRXhwcmVzc2lvbigpIHsKKyAgQXV0b1Jlc3RvcmVyPHVuc2lnbmVkIGxvbmc+IHJlc3RvcmVyKCZtX3BhcnNlX2RlcHRoKTsKKyAgaWYgKEhhc0Vycm9yKCkgfHwgIUluY3JlbWVudFBhcnNlRGVwdGhBbmRDaGVjaygpKQorICAgIHJldHVybiBudWxscHRyOworCisgIFdpZGVTdHJpbmdWaWV3IHdzVmFyaWFudDsKKyAgdWludDMyX3QgbGluZSA9IG1fdG9rZW4tPm1fbGluZV9udW07CisgIGlmICghTmV4dFRva2VuKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIGlmIChtX3Rva2VuLT5tX3R5cGUgIT0gVE9LaWRlbnRpZmllcikgeworICAgIG1fZXJyb3IgPSB0cnVlOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgd3NWYXJpYW50ID0gbV90b2tlbi0+bV9zdHJpbmc7CisgIGlmICghTmV4dFRva2VuKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIGlmIChtX3Rva2VuLT5tX3R5cGUgIT0gVE9LYXNzaWduKSB7CisgICAgbV9lcnJvciA9IHRydWU7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaWYgKCFOZXh0VG9rZW4oKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBBc3NpZ25tZW50ID0KKyAgICAgIFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOworICBpZiAoIXBBc3NpZ25tZW50KQorICAgIHJldHVybiBudWxscHRyOworCisgIGludDMyX3QgaURpcmVjdGlvbiA9IDA7CisgIGlmIChtX3Rva2VuLT5tX3R5cGUgPT0gVE9LdXB0bykgeworICAgIGlEaXJlY3Rpb24gPSAxOworICB9IGVsc2UgaWYgKG1fdG9rZW4tPm1fdHlwZSA9PSBUT0tkb3dudG8pIHsKKyAgICBpRGlyZWN0aW9uID0gLTE7CisgIH0gZWxzZSB7CisgICAgbV9lcnJvciA9IHRydWU7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBpZiAoIU5leHRUb2tlbigpKQorICAgIHJldHVybiBudWxscHRyOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEFjY2Vzc29yID0gUGFyc2VTaW1wbGVFeHByZXNzaW9uKCk7CisgIGlmICghcEFjY2Vzc29yKQorICAgIHJldHVybiBudWxscHRyOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcFN0ZXA7CisgIGlmIChtX3Rva2VuLT5tX3R5cGUgPT0gVE9Lc3RlcCkgeworICAgIGlmICghTmV4dFRva2VuKCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBwU3RlcCA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOworICAgIGlmICghcFN0ZXApCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAoIUNoZWNrVGhlbk5leHQoVE9LZG8pKQorICAgIHJldHVybiBudWxscHRyOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gcExpc3QgPSBQYXJzZUJsb2NrRXhwcmVzc2lvbigpOworICBpZiAoIXBMaXN0IHx8ICFDaGVja1RoZW5OZXh0KFRPS2VuZGZvcikpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBleHByOworICBpZiAoIWV4cHIpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUZvckV4cHJlc3Npb24+KAorICAgICAgbGluZSwgd3NWYXJpYW50LCBzdGQ6Om1vdmUocEFzc2lnbm1lbnQpLCBzdGQ6Om1vdmUocEFjY2Vzc29yKSwgaURpcmVjdGlvbiwKKyAgICAgIHN0ZDo6bW92ZShwU3RlcCksIHN0ZDo6bW92ZShwTGlzdCkpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IENYRkFfRk1QYXJzZXI6OlBhcnNlRm9yZWFjaEV4cHJlc3Npb24oKSB7CisgIEF1dG9SZXN0b3Jlcjx1bnNpZ25lZCBsb25nPiByZXN0b3JlcigmbV9wYXJzZV9kZXB0aCk7CisgIGlmIChIYXNFcnJvcigpIHx8ICFJbmNyZW1lbnRQYXJzZURlcHRoQW5kQ2hlY2soKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBpZiAoSGFzRXJyb3IoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IGV4cHI7CisgIFdpZGVTdHJpbmdWaWV3IHdzSWRlbnRpZmllcjsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPj4gcEFjY2Vzc29yczsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBwTGlzdDsKKyAgdWludDMyX3QgbGluZSA9IG1fdG9rZW4tPm1fbGluZV9udW07CisgIGlmICghTmV4dFRva2VuKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIGlmIChtX3Rva2VuLT5tX3R5cGUgIT0gVE9LaWRlbnRpZmllcikgeworICAgIG1fZXJyb3IgPSB0cnVlOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgd3NJZGVudGlmaWVyID0gbV90b2tlbi0+bV9zdHJpbmc7CisgIGlmICghTmV4dFRva2VuKCkgfHwgIUNoZWNrVGhlbk5leHQoVE9LaW4pIHx8ICFDaGVja1RoZW5OZXh0KFRPS2xwYXJlbikpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIGlmIChtX3Rva2VuLT5tX3R5cGUgPT0gVE9LcnBhcmVuKSB7CisgICAgbV9lcnJvciA9IHRydWU7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB3aGlsZSAobV90b2tlbi0+bV90eXBlICE9IFRPS3JwYXJlbikgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcyA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOworICAgIGlmICghcykKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgcEFjY2Vzc29ycy5wdXNoX2JhY2soc3RkOjptb3ZlKHMpKTsKKyAgICBpZiAobV90b2tlbi0+bV90eXBlICE9IFRPS2NvbW1hKQorICAgICAgYnJlYWs7CisgICAgaWYgKCFOZXh0VG9rZW4oKSkKKyAgICAgIHJldHVybiBudWxscHRyOworICB9CisgIGlmICghQ2hlY2tUaGVuTmV4dChUT0tycGFyZW4pIHx8ICFDaGVja1RoZW5OZXh0KFRPS2RvKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBwTGlzdCA9IFBhcnNlQmxvY2tFeHByZXNzaW9uKCk7CisgIGlmICghcExpc3QgfHwgIUNoZWNrVGhlbk5leHQoVE9LZW5kZm9yKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNRm9yZWFjaEV4cHJlc3Npb24+KAorICAgICAgbGluZSwgd3NJZGVudGlmaWVyLCBzdGQ6Om1vdmUocEFjY2Vzc29ycyksIHN0ZDo6bW92ZShwTGlzdCkpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IENYRkFfRk1QYXJzZXI6OlBhcnNlRG9FeHByZXNzaW9uKCkgeworICBBdXRvUmVzdG9yZXI8dW5zaWduZWQgbG9uZz4gcmVzdG9yZXIoJm1fcGFyc2VfZGVwdGgpOworICBpZiAoSGFzRXJyb3IoKSB8fCAhSW5jcmVtZW50UGFyc2VEZXB0aEFuZENoZWNrKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgaWYgKEhhc0Vycm9yKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgdWludDMyX3QgbGluZSA9IG1fdG9rZW4tPm1fbGluZV9udW07CisgIGlmICghTmV4dFRva2VuKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBleHByID0gUGFyc2VCbG9ja0V4cHJlc3Npb24oKTsKKyAgaWYgKCFleHByIHx8ICFDaGVja1RoZW5OZXh0KFRPS2VuZCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTURvRXhwcmVzc2lvbj4obGluZSwgc3RkOjptb3ZlKGV4cHIpKTsKK30KKworYm9vbCBDWEZBX0ZNUGFyc2VyOjpIYXNFcnJvcigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fZXJyb3IgfHwgbV90b2tlbiA9PSBudWxscHRyOworfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvZm0yanMvY3hmYV9mbXBhcnNlci5oIGIveGZhL2Z4ZmEvZm0yanMvY3hmYV9mbXBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MzY4MzgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9mbTJqcy9jeGZhX2ZtcGFyc2VyLmgKQEAgLTAsMCArMSw2NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX0ZNMkpTX0NYRkFfRk1QQVJTRVJfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfRk0ySlNfQ1hGQV9GTVBBUlNFUl9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgInhmYS9meGZhL2ZtMmpzL2N4ZmFfZm1leHByZXNzaW9uLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvZm0yanMvY3hmYV9mbWxleGVyLmgiCisKK2NsYXNzIENYRkFfRk1QYXJzZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1hGQV9GTVBhcnNlcihjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NGb3JtY2FsYyk7CisgIH5DWEZBX0ZNUGFyc2VyKCk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1GdW5jdGlvbkRlZmluaXRpb24+IFBhcnNlKCk7CisgIGJvb2wgSGFzRXJyb3IoKSBjb25zdDsKKworICB2b2lkIFNldE1heFBhcnNlRGVwdGhGb3JUZXN0KHVuc2lnbmVkIGxvbmcgbWF4X2RlcHRoKSB7CisgICAgbV9tYXhfcGFyc2VfZGVwdGggPSBtYXhfZGVwdGg7CisgIH0KKworIHByaXZhdGU6CisgIGJvb2wgTmV4dFRva2VuKCk7CisgIGJvb2wgQ2hlY2tUaGVuTmV4dChYRkFfRk1fVE9LRU4gb3ApOworICBib29sIEluY3JlbWVudFBhcnNlRGVwdGhBbmRDaGVjaygpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4+IFBhcnNlVG9wRXhwcmVzc2lvbigpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IFBhcnNlRnVuY3Rpb24oKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBQYXJzZUV4cHJlc3Npb24oKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBQYXJzZVZhckV4cHJlc3Npb24oKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBQYXJzZUV4cEV4cHJlc3Npb24oKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBQYXJzZUJsb2NrRXhwcmVzc2lvbigpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IFBhcnNlSWZFeHByZXNzaW9uKCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gUGFyc2VXaGlsZUV4cHJlc3Npb24oKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBQYXJzZUZvckV4cHJlc3Npb24oKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBQYXJzZUZvcmVhY2hFeHByZXNzaW9uKCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gUGFyc2VEb0V4cHJlc3Npb24oKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBQYXJzZVBhcmVuRXhwcmVzc2lvbigpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IFBhcnNlU3ViYXNzaWdubWVudEluRm9yRXhwcmVzc2lvbigpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IFBhcnNlTG9naWNhbE9yRXhwcmVzc2lvbigpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IFBhcnNlTG9naWNhbEFuZEV4cHJlc3Npb24oKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBQYXJzZUVxdWFsaXR5RXhwcmVzc2lvbigpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IFBhcnNlUmVsYXRpb25hbEV4cHJlc3Npb24oKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBQYXJzZUFkZHRpdmVFeHByZXNzaW9uKCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gUGFyc2VNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBQYXJzZVVuYXJ5RXhwcmVzc2lvbigpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IFBhcnNlUHJpbWFyeUV4cHJlc3Npb24oKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBQYXJzZVBvc3RFeHByZXNzaW9uKAorICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBlKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBQYXJzZUluZGV4RXhwcmVzc2lvbigpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNTGV4ZXI+IG1fbGV4ZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNVG9rZW4+IG1fdG9rZW47CisgIGJvb2wgbV9lcnJvcjsKKyAgdW5zaWduZWQgbG9uZyBtX3BhcnNlX2RlcHRoOworICB1bnNpZ25lZCBsb25nIG1fbWF4X3BhcnNlX2RlcHRoOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9GTTJKU19DWEZBX0ZNUEFSU0VSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9mbTJqcy9jeGZhX2ZtcGFyc2VyX3VuaXR0ZXN0LmNwcCBiL3hmYS9meGZhL2ZtMmpzL2N4ZmFfZm1wYXJzZXJfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ODI2NDkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9mbTJqcy9jeGZhX2ZtcGFyc2VyX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDEzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvZm0yanMvY3hmYV9mbXBhcnNlci5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfd2lkZXRleHRidWYuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9mbTJqcy9jeGZhX2ZtdG9qYXZhc2NyaXB0ZGVwdGguaCIKKworVEVTVChDWEZBX0ZNUGFyc2VyVGVzdCwgRW1wdHkpIHsKKyAgYXV0byBwYXJzZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTVBhcnNlcj4oTCIiKTsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1GdW5jdGlvbkRlZmluaXRpb24+IGFzdCA9IHBhcnNlci0+UGFyc2UoKTsKKyAgQVNTRVJUKGFzdCAhPSBudWxscHRyKTsKKyAgRVhQRUNUX0ZBTFNFKHBhcnNlci0+SGFzRXJyb3IoKSk7CisKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoOjpSZXNldCgpOworICBDRlhfV2lkZVRleHRCdWYgYnVmOworICBFWFBFQ1RfVFJVRShhc3QtPlRvSmF2YVNjcmlwdChidWYpKTsKKyAgLy8gVE9ETyhkc2luY2xhaXIpOiBUaGlzIGlzIGEgbGl0dGxlIHdlaXJkIC4uLi4uCisgIEVYUEVDVF9FUShMIi8vIGNvbW1lbnRzIG9ubHkiLCBidWYuQXNTdHJpbmdWaWV3KCkpOworfQorCitURVNUKENYRkFfRk1QYXJzZXJUZXN0LCBDb21tZW50T25seUlzRXJyb3IpIHsKKyAgYXV0byBwYXJzZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTVBhcnNlcj4oTCI7IEp1c3QgY29tbWVudCIpOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbj4gYXN0ID0gcGFyc2VyLT5QYXJzZSgpOworICBBU1NFUlQoYXN0ICE9IG51bGxwdHIpOworICAvLyBUT0RPKGRzaW5jbGFpcik6IFRoaXMgaXNuJ3QgYWxsb3dlZCBwZXIgdGhlIHNwZWMuCisgIEVYUEVDVF9GQUxTRShwYXJzZXItPkhhc0Vycm9yKCkpOworICAvLyBFWFBFQ1RfVFJVRShwYXJzZXItPkhhc0Vycm9yKCkpOworCisgIENYRkFfRk1Ub0phdmFTY3JpcHREZXB0aDo6UmVzZXQoKTsKKyAgQ0ZYX1dpZGVUZXh0QnVmIGJ1ZjsKKyAgRVhQRUNUX1RSVUUoYXN0LT5Ub0phdmFTY3JpcHQoYnVmKSk7CisgIEVYUEVDVF9FUShMIi8vIGNvbW1lbnRzIG9ubHkiLCBidWYuQXNTdHJpbmdWaWV3KCkpOworfQorCitURVNUKENYRkFfRk1QYXJzZXJUZXN0LCBDb21tZW50VGhlblZhbHVlKSB7CisgIGNvbnN0IHdjaGFyX3QgcmV0W10gPQorICAgICAgTCIoXG5mdW5jdGlvbiAoKVxue1xuIgorICAgICAgTCJ2YXIgcGZtX3JldCA9IG51bGw7XG4iCisgICAgICBMInBmbV9yZXQgPSAxMjtcbiIKKyAgICAgIEwicmV0dXJuIHBmbV9ydC5nZXRfdmFsKHBmbV9yZXQpO1xuIgorICAgICAgTCJ9XG4pLmNhbGwodGhpcyk7XG4iOworCisgIGF1dG8gcGFyc2VyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1QYXJzZXI+KEwiOyBKdXN0IGNvbW1lbnRcbjEyIik7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uPiBhc3QgPSBwYXJzZXItPlBhcnNlKCk7CisgIEFTU0VSVChhc3QgIT0gbnVsbHB0cik7CisgIEVYUEVDVF9GQUxTRShwYXJzZXItPkhhc0Vycm9yKCkpOworCisgIENYRkFfRk1Ub0phdmFTY3JpcHREZXB0aDo6UmVzZXQoKTsKKyAgQ0ZYX1dpZGVUZXh0QnVmIGJ1ZjsKKyAgRVhQRUNUX1RSVUUoYXN0LT5Ub0phdmFTY3JpcHQoYnVmKSk7CisgIEVYUEVDVF9FUShyZXQsIGJ1Zi5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKK1RFU1QoQ1hGQV9GTVBhcnNlclRlc3QsIFBhcnNlKSB7CisgIGNvbnN0IHdjaGFyX3QgaW5wdXRbXSA9CisgICAgICBMIiQgPSBBdmcgKC0zLCA1LCAtNiwgMTIsIC0xMyk7XG4iCisgICAgICBMIiQgPSBBdmcgKFRhYmxlMi4uUm93WypdLkNlbGwxKTtcbiIKKyAgICAgIEwiXG4iCisgICAgICBMImlmICgkIG5lIC0xKXRoZW5cbiIKKyAgICAgIEwiICBib3JkZXIuZmlsbC5jb2xvci52YWx1ZSA9IFwiMjU1LDY0LDY0XCI7XG4iCisgICAgICBMImVsc2VcbiIKKyAgICAgIEwiICBib3JkZXIuZmlsbC5jb2xvci52YWx1ZSA9IFwiMjAsMTcwLDEzXCI7XG4iCisgICAgICBMImVuZGlmXG4iCisgICAgICBMIlxuIgorICAgICAgTCIkIjsKKworICBjb25zdCB3Y2hhcl90IHJldFtdID0KKyAgICAgIEwiKFxuZnVuY3Rpb24gKClcbntcbiIKKyAgICAgIEwidmFyIHBmbV9yZXQgPSBudWxsO1xuIgorICAgICAgTCJpZiAocGZtX3J0LmlzX29iaih0aGlzKSlcbntcbiIKKyAgICAgIEwicGZtX3J0LmFzZ25fdmFsX29wKHRoaXMsIHBmbV9ydC5BdmcocGZtX3J0Lm5lZ19vcCgzKSwgNSwgIgorICAgICAgTCJwZm1fcnQubmVnX29wKDYpLCAxMiwgcGZtX3J0Lm5lZ19vcCgxMykpKTtcbiIKKyAgICAgIEwifVxuIgorICAgICAgTCJpZiAocGZtX3J0LmlzX29iaih0aGlzKSlcbntcbiIKKyAgICAgIEwicGZtX3J0LmFzZ25fdmFsX29wKHRoaXMsIHBmbV9ydC5BdmcocGZtX3J0LmRvdF9hY2MocGZtX3J0LmRvdGRvdF9hY2MoIgorICAgICAgTCJUYWJsZTIsIFwiVGFibGUyXCIsIFwiUm93XCIsIDEpLCBcIlwiLCBcIkNlbGwxXCIsIDAsIDApKSk7XG4iCisgICAgICBMIn1cbiIKKyAgICAgIEwiaWYgKHBmbV9ydC5nZXRfdmFsKHBmbV9ydC5uZXFfb3AodGhpcywgcGZtX3J0Lm5lZ19vcCgxKSkpKVxue1xuIgorICAgICAgTCJpZiAocGZtX3J0LmlzX29iaihwZm1fcnQuZG90X2FjYyhwZm1fcnQuZG90X2FjYyhwZm1fcnQuZG90X2FjYygiCisgICAgICBMImJvcmRlciwgXCJib3JkZXJcIiwgXCJmaWxsXCIsIDAsIDApLCBcIlwiLCBcImNvbG9yXCIsIDAsIDApLCBcIlwiLCAiCisgICAgICBMIlwidmFsdWVcIiwgMCwgMCkpKVxue1xuIgorICAgICAgTCJwZm1fcnQuYXNnbl92YWxfb3AocGZtX3J0LmRvdF9hY2MocGZtX3J0LmRvdF9hY2MoIgorICAgICAgTCJwZm1fcnQuZG90X2FjYyhib3JkZXIsIFwiYm9yZGVyXCIsIFwiZmlsbFwiLCAwLCAwKSwgXCJcIiwgIgorICAgICAgTCJcImNvbG9yXCIsIDAsIDApLCBcIlwiLCBcInZhbHVlXCIsIDAsIDApLCBcIjI1NSw2NCw2NFwiKTtcbiIKKyAgICAgIEwifVxuIgorICAgICAgTCJ9XG5lbHNlXG57XG4iCisgICAgICBMImlmIChwZm1fcnQuaXNfb2JqKHBmbV9ydC5kb3RfYWNjKHBmbV9ydC5kb3RfYWNjKHBmbV9ydC5kb3RfYWNjKCIKKyAgICAgIEwiYm9yZGVyLCBcImJvcmRlclwiLCBcImZpbGxcIiwgMCwgMCksIFwiXCIsIFwiY29sb3JcIiwgMCwgMCksIFwiXCIsICIKKyAgICAgIEwiXCJ2YWx1ZVwiLCAwLCAwKSkpXG57XG4iCisgICAgICBMInBmbV9ydC5hc2duX3ZhbF9vcChwZm1fcnQuZG90X2FjYyhwZm1fcnQuZG90X2FjYygiCisgICAgICBMInBmbV9ydC5kb3RfYWNjKGJvcmRlciwgXCJib3JkZXJcIiwgXCJmaWxsXCIsIDAsIDApLCBcIlwiLCAiCisgICAgICBMIlwiY29sb3JcIiwgMCwgMCksIFwiXCIsIFwidmFsdWVcIiwgMCwgMCksIFwiMjAsMTcwLDEzXCIpO1xuIgorICAgICAgTCJ9XG4iCisgICAgICBMIn1cbiIKKyAgICAgIEwicGZtX3JldCA9IHRoaXM7XG4iCisgICAgICBMInJldHVybiBwZm1fcnQuZ2V0X3ZhbChwZm1fcmV0KTtcbiIKKyAgICAgIEwifVxuKS5jYWxsKHRoaXMpO1xuIjsKKworICBhdXRvIHBhcnNlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNUGFyc2VyPihpbnB1dCk7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uPiBhc3QgPSBwYXJzZXItPlBhcnNlKCk7CisgIEFTU0VSVChhc3QgIT0gbnVsbHB0cik7CisgIEVYUEVDVF9GQUxTRShwYXJzZXItPkhhc0Vycm9yKCkpOworCisgIENYRkFfRk1Ub0phdmFTY3JpcHREZXB0aDo6UmVzZXQoKTsKKyAgQ0ZYX1dpZGVUZXh0QnVmIGJ1ZjsKKyAgRVhQRUNUX1RSVUUoYXN0LT5Ub0phdmFTY3JpcHQoYnVmKSk7CisgIEVYUEVDVF9FUShyZXQsIGJ1Zi5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKK1RFU1QoQ1hGQV9GTVBhcnNlclRlc3QsIE1heFBhcnNlRGVwdGgpIHsKKyAgYXV0byBwYXJzZXIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTVBhcnNlcj4oTCJmb28oYmFyW2JheihmaXp6WzBdKV0pIik7CisgIHBhcnNlci0+U2V0TWF4UGFyc2VEZXB0aEZvclRlc3QoNSk7CisgIEVYUEVDVF9FUShudWxscHRyLCBwYXJzZXItPlBhcnNlKCkpOworICBFWFBFQ1RfVFJVRShwYXJzZXItPkhhc0Vycm9yKCkpOworfQorCitURVNUKENGWEFfRk1QYXJzZXJUZXN0LCBjaHJvbWl1bTc1MjIwMSkgeworICBhdXRvIHBhcnNlciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNUGFyc2VyPigKKyAgICAgIEwiZlRlcCBhXG4iCisgICAgICBMIi4jXG4iCisgICAgICBMImZvQCA9Wz1sIik7CisgIEVYUEVDVF9FUShudWxscHRyLCBwYXJzZXItPlBhcnNlKCkpOworICBFWFBFQ1RfVFJVRShwYXJzZXItPkhhc0Vycm9yKCkpOworfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvZm0yanMvY3hmYV9mbXNpbXBsZWV4cHJlc3Npb24uY3BwIGIveGZhL2Z4ZmEvZm0yanMvY3hmYV9mbXNpbXBsZWV4cHJlc3Npb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3M2JhOTEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9mbTJqcy9jeGZhX2Ztc2ltcGxlZXhwcmVzc2lvbi5jcHAKQEAgLTAsMCArMSw4OTQgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL2ZtMmpzL2N4ZmFfZm1zaW1wbGVleHByZXNzaW9uLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvYXV0b3Jlc3RvcmVyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfd2lkZXRleHRidWYuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2ZtMmpzL2N4ZmFfZm10b2phdmFzY3JpcHRkZXB0aC5oIgorCituYW1lc3BhY2UgeworCisvLyBJbmRleGVkIGJ5IFhGQV9GTV9TaW1wbGVFeHByZXNzaW9uVHlwZQorY29uc3Qgd2NoYXJfdCogY29uc3QgZ3NfbHBTdHJFeHBGdW5jTmFtZVtdID0geworICAgIEwicGZtX3J0LmFzZ25fdmFsX29wIiwgTCJwZm1fcnQubG9nX29yX29wIiwgIEwicGZtX3J0LmxvZ19hbmRfb3AiLAorICAgIEwicGZtX3J0LmVxX29wIiwgICAgICAgTCJwZm1fcnQubmVxX29wIiwgICAgIEwicGZtX3J0Lmx0X29wIiwKKyAgICBMInBmbV9ydC5sZV9vcCIsICAgICAgIEwicGZtX3J0Lmd0X29wIiwgICAgICBMInBmbV9ydC5nZV9vcCIsCisgICAgTCJwZm1fcnQucGx1c19vcCIsICAgICBMInBmbV9ydC5taW51c19vcCIsICAgTCJwZm1fcnQubXVsX29wIiwKKyAgICBMInBmbV9ydC5kaXZfb3AiLCAgICAgIEwicGZtX3J0LnBvc19vcCIsICAgICBMInBmbV9ydC5uZWdfb3AiLAorICAgIEwicGZtX3J0LmxvZ19ub3Rfb3AiLCAgTCJwZm1fcnQuIiwgICAgICAgICAgIEwicGZtX3J0LmRvdF9hY2MiLAorICAgIEwicGZtX3J0LmRvdGRvdF9hY2MiLCAgTCJwZm1fcnQuY29uY2F0X29iaiIsIEwicGZtX3J0LmlzX29iaiIsCisgICAgTCJwZm1fcnQuaXNfYXJ5IiwgICAgICBMInBmbV9ydC5nZXRfdmFsIiwgICAgTCJwZm1fcnQuZ2V0X2pzb2JqIiwKKyAgICBMInBmbV9ydC52YXJfZmlsdGVyIiwKK307CisKK2NvbnN0IHdjaGFyX3QqIGNvbnN0IGdfQnVpbHRJbkZ1bmNzW10gPSB7CisgICAgTCJBYnMiLCAgICAgICAgICBMIkFwciIsICAgICAgIEwiQXQiLCAgICAgICBMIkF2ZyIsCisgICAgTCJDZWlsIiwgICAgICAgICBMIkNob29zZSIsICAgIEwiQ29uY2F0IiwgICBMIkNvdW50IiwKKyAgICBMIkN0ZXJtIiwgICAgICAgIEwiRGF0ZSIsICAgICAgTCJEYXRlMk51bSIsIEwiRGF0ZUZtdCIsCisgICAgTCJEZWNvZGUiLCAgICAgICBMIkVuY29kZSIsICAgIEwiRXZhbCIsICAgICBMIkV4aXN0cyIsCisgICAgTCJGbG9vciIsICAgICAgICBMIkZvcm1hdCIsICAgIEwiRlYiLCAgICAgICBMIkdldCIsCisgICAgTCJIYXNWYWx1ZSIsICAgICBMIklmIiwgICAgICAgIEwiSXBtdCIsICAgICBMIklzb0RhdGUyTnVtIiwKKyAgICBMIklzb1RpbWUyTnVtIiwgIEwiTGVmdCIsICAgICAgTCJMZW4iLCAgICAgIEwiTG9jYWxEYXRlRm10IiwKKyAgICBMIkxvY2FsVGltZUZtdCIsIEwiTG93ZXIiLCAgICAgTCJMdHJpbSIsICAgIEwiTWF4IiwKKyAgICBMIk1pbiIsICAgICAgICAgIEwiTW9kIiwgICAgICAgTCJOUFYiLCAgICAgIEwiTnVtMkRhdGUiLAorICAgIEwiTnVtMkdNVGltZSIsICAgTCJOdW0yVGltZSIsICBMIk9uZW9mIiwgICAgTCJQYXJzZSIsCisgICAgTCJQbXQiLCAgICAgICAgICBMIlBvc3QiLCAgICAgIEwiUFBtdCIsICAgICBMIlB1dCIsCisgICAgTCJQViIsICAgICAgICAgICBMIlJhdGUiLCAgICAgIEwiUmVmIiwgICAgICBMIlJlcGxhY2UiLAorICAgIEwiUmlnaHQiLCAgICAgICAgTCJSb3VuZCIsICAgICBMIlJ0cmltIiwgICAgTCJTcGFjZSIsCisgICAgTCJTdHIiLCAgICAgICAgICBMIlN0dWZmIiwgICAgIEwiU3Vic3RyIiwgICBMIlN1bSIsCisgICAgTCJUZXJtIiwgICAgICAgICBMIlRpbWUiLCAgICAgIEwiVGltZTJOdW0iLCBMIlRpbWVGbXQiLAorICAgIEwiVW5pdFR5cGUiLCAgICAgTCJVbml0VmFsdWUiLCBMIlVwcGVyIiwgICAgTCJVdWlkIiwKKyAgICBMIldpdGhpbiIsICAgICAgIEwiV29yZE51bSIsCit9OworCitjb25zdCBzaXplX3QgZ19CdWlsdEluRnVuY3NNYXhMZW4gPSAxMjsKKworc3RydWN0IFhGQV9GTVNPTU1ldGhvZCB7CisgIGNvbnN0IHdjaGFyX3QqIG1fd3NTb21NZXRob2ROYW1lOworICB1aW50MzJfdCBtX2RQYXJhbWV0ZXJzOworfTsKKworY29uc3QgWEZBX0ZNU09NTWV0aG9kIGdzX0ZNU29tTWV0aG9kc1tdID0geworICAgIHtMImFic1BhZ2UiLCAweDAxfSwKKyAgICB7TCJhYnNQYWdlSW5CYXRjaCIsIDB4MDF9LAorICAgIHtMImFic1BhZ2VTcGFuIiwgMHgwMX0sCisgICAge0wiYXBwZW5kIiwgMHgwMX0sCisgICAge0wiY2xlYXIiLCAweDAxfSwKKyAgICB7TCJmb3JtTm9kZXMiLCAweDAxfSwKKyAgICB7TCJoIiwgMHgwMX0sCisgICAge0wiaW5zZXJ0IiwgMHgwM30sCisgICAge0wiaXNSZWNvcmRHcm91cCIsIDB4MDF9LAorICAgIHtMInBhZ2UiLCAweDAxfSwKKyAgICB7TCJwYWdlU3BhbiIsIDB4MDF9LAorICAgIHtMInJlbW92ZSIsIDB4MDF9LAorICAgIHtMInNhdmVGaWx0ZXJlZFhNTCIsIDB4MDF9LAorICAgIHtMInNldEVsZW1lbnQiLCAweDAxfSwKKyAgICB7TCJzaGVldCIsIDB4MDF9LAorICAgIHtMInNoZWV0SW5CYXRjaCIsIDB4MDF9LAorICAgIHtMInNpZ24iLCAweDYxfSwKKyAgICB7TCJ2ZXJpZnkiLCAweDBkfSwKKyAgICB7TCJ3IiwgMHgwMX0sCisgICAge0wieCIsIDB4MDF9LAorICAgIHtMInkiLCAweDAxfSwKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitXaWRlU3RyaW5nVmlldyBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKAorICAgIFhGQV9GTV9TaW1wbGVFeHByZXNzaW9uVHlwZSBzaW1wbGVFeHBUeXBlKSB7CisgIHJldHVybiBnc19scFN0ckV4cEZ1bmNOYW1lW3NpbXBsZUV4cFR5cGVdOworfQorCitDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbjo6Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24odWludDMyX3QgbGluZSwgWEZBX0ZNX1RPS0VOIG9wKQorICAgIDogbV9saW5lKGxpbmUpLCBtX29wKG9wKSB7fQorCitib29sIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7CisgIENYRkFfRk1Ub0phdmFTY3JpcHREZXB0aCBkZXB0aE1hbmFnZXI7CisgIHJldHVybiAhQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KSAmJiBkZXB0aE1hbmFnZXIuSXNXaXRoaW5NYXhEZXB0aCgpOworfQorCitib29sIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgcmV0dXJuICFDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpICYmIGRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCk7Cit9CisKK1hGQV9GTV9UT0tFTiBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbjo6R2V0T3BlcmF0b3JUb2tlbigpIGNvbnN0IHsKKyAgcmV0dXJuIG1fb3A7Cit9CisKK0NYRkFfRk1OdWxsRXhwcmVzc2lvbjo6Q1hGQV9GTU51bGxFeHByZXNzaW9uKHVpbnQzMl90IGxpbmUpCisgICAgOiBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbihsaW5lLCBUT0tudWxsKSB7fQorCitib29sIENYRkFfRk1OdWxsRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgeworICBDWEZBX0ZNVG9KYXZhU2NyaXB0RGVwdGggZGVwdGhNYW5hZ2VyOworICBpZiAoQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KSB8fCAhZGVwdGhNYW5hZ2VyLklzV2l0aGluTWF4RGVwdGgoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgamF2YXNjcmlwdCA8PCBMIm51bGwiOworICByZXR1cm4gIUNYRkFfSXNUb29CaWcoamF2YXNjcmlwdCk7Cit9CisKK0NYRkFfRk1OdW1iZXJFeHByZXNzaW9uOjpDWEZBX0ZNTnVtYmVyRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmdWaWV3IHdzTnVtYmVyKQorICAgIDogQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24obGluZSwgVE9LbnVtYmVyKSwgbV93c051bWJlcih3c051bWJlcikge30KKworQ1hGQV9GTU51bWJlckV4cHJlc3Npb246On5DWEZBX0ZNTnVtYmVyRXhwcmVzc2lvbigpIHt9CisKK2Jvb2wgQ1hGQV9GTU51bWJlckV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgfHwgIWRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGphdmFzY3JpcHQgPDwgbV93c051bWJlcjsKKyAgcmV0dXJuICFDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpOworfQorCitDWEZBX0ZNU3RyaW5nRXhwcmVzc2lvbjo6Q1hGQV9GTVN0cmluZ0V4cHJlc3Npb24odWludDMyX3QgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nVmlldyB3c1N0cmluZykKKyAgICA6IENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKGxpbmUsIFRPS3N0cmluZyksIG1fd3NTdHJpbmcod3NTdHJpbmcpIHt9CisKK0NYRkFfRk1TdHJpbmdFeHByZXNzaW9uOjp+Q1hGQV9GTVN0cmluZ0V4cHJlc3Npb24oKSB7fQorCitib29sIENYRkFfRk1TdHJpbmdFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7CisgIENYRkFfRk1Ub0phdmFTY3JpcHREZXB0aCBkZXB0aE1hbmFnZXI7CisgIGlmIChDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpIHx8ICFkZXB0aE1hbmFnZXIuSXNXaXRoaW5NYXhEZXB0aCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBXaWRlU3RyaW5nIHRlbXBTdHIobV93c1N0cmluZyk7CisgIGlmICh0ZW1wU3RyLkdldExlbmd0aCgpIDw9IDIpIHsKKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBTdHI7CisgICAgcmV0dXJuICFDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpOworICB9CisgIGphdmFzY3JpcHQuQXBwZW5kQ2hhcihMJ1wiJyk7CisgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgdGVtcFN0ci5HZXRMZW5ndGgoKSAtIDE7IGkrKykgeworICAgIHdjaGFyX3Qgb25lQ2hhciA9IHRlbXBTdHJbaV07CisgICAgc3dpdGNoIChvbmVDaGFyKSB7CisgICAgICBjYXNlIEwnXCInOgorICAgICAgICBpKys7CisgICAgICAgIGphdmFzY3JpcHQgPDwgTCJcXFwiIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDB4MGQ6CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAweDBhOgorICAgICAgICBqYXZhc2NyaXB0IDw8IEwiXFxuIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBqYXZhc2NyaXB0LkFwcGVuZENoYXIob25lQ2hhcik7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBqYXZhc2NyaXB0LkFwcGVuZENoYXIoTCdcIicpOworICByZXR1cm4gIUNYRkFfSXNUb29CaWcoamF2YXNjcmlwdCk7Cit9CisKK0NYRkFfRk1JZGVudGlmaWVyRXhwcmVzc2lvbjo6Q1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9uKAorICAgIHVpbnQzMl90IGxpbmUsCisgICAgV2lkZVN0cmluZ1ZpZXcgd3NJZGVudGlmaWVyKQorICAgIDogQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24obGluZSwgVE9LaWRlbnRpZmllciksCisgICAgICBtX3dzSWRlbnRpZmllcih3c0lkZW50aWZpZXIpIHt9CisKK0NYRkFfRk1JZGVudGlmaWVyRXhwcmVzc2lvbjo6fkNYRkFfRk1JZGVudGlmaWVyRXhwcmVzc2lvbigpIHt9CisKK2Jvb2wgQ1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7CisgIENYRkFfRk1Ub0phdmFTY3JpcHREZXB0aCBkZXB0aE1hbmFnZXI7CisgIGlmIChDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpIHx8ICFkZXB0aE1hbmFnZXIuSXNXaXRoaW5NYXhEZXB0aCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBXaWRlU3RyaW5nIHRlbXBTdHIobV93c0lkZW50aWZpZXIpOworICBpZiAodGVtcFN0ciA9PSBMIiQiKSB7CisgICAgdGVtcFN0ciA9IEwidGhpcyI7CisgIH0gZWxzZSBpZiAodGVtcFN0ciA9PSBMIiEiKSB7CisgICAgdGVtcFN0ciA9IEwieGZhLmRhdGFzZXRzIjsKKyAgfSBlbHNlIGlmICh0ZW1wU3RyID09IEwiJGRhdGEiKSB7CisgICAgdGVtcFN0ciA9IEwieGZhLmRhdGFzZXRzLmRhdGEiOworICB9IGVsc2UgaWYgKHRlbXBTdHIgPT0gTCIkZXZlbnQiKSB7CisgICAgdGVtcFN0ciA9IEwieGZhLmV2ZW50IjsKKyAgfSBlbHNlIGlmICh0ZW1wU3RyID09IEwiJGZvcm0iKSB7CisgICAgdGVtcFN0ciA9IEwieGZhLmZvcm0iOworICB9IGVsc2UgaWYgKHRlbXBTdHIgPT0gTCIkaG9zdCIpIHsKKyAgICB0ZW1wU3RyID0gTCJ4ZmEuaG9zdCI7CisgIH0gZWxzZSBpZiAodGVtcFN0ciA9PSBMIiRsYXlvdXQiKSB7CisgICAgdGVtcFN0ciA9IEwieGZhLmxheW91dCI7CisgIH0gZWxzZSBpZiAodGVtcFN0ciA9PSBMIiR0ZW1wbGF0ZSIpIHsKKyAgICB0ZW1wU3RyID0gTCJ4ZmEudGVtcGxhdGUiOworICB9IGVsc2UgaWYgKHRlbXBTdHJbMF0gPT0gTCchJykgeworICAgIHRlbXBTdHIgPQorICAgICAgICBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSICsgdGVtcFN0ci5SaWdodCh0ZW1wU3RyLkdldExlbmd0aCgpIC0gMSk7CisgIH0KKyAgamF2YXNjcmlwdCA8PCB0ZW1wU3RyOworICByZXR1cm4gIUNYRkFfSXNUb29CaWcoamF2YXNjcmlwdCk7Cit9CisKK0NYRkFfRk1VbmFyeUV4cHJlc3Npb246OkNYRkFfRk1VbmFyeUV4cHJlc3Npb24oCisgICAgdWludDMyX3QgbGluZSwKKyAgICBYRkFfRk1fVE9LRU4gb3AsCisgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwKQorICAgIDogQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24obGluZSwgb3ApLCBtX3BFeHAoc3RkOjptb3ZlKHBFeHApKSB7fQorCitDWEZBX0ZNVW5hcnlFeHByZXNzaW9uOjp+Q1hGQV9GTVVuYXJ5RXhwcmVzc2lvbigpIHt9CisKK2Jvb2wgQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgeworICBDWEZBX0ZNVG9KYXZhU2NyaXB0RGVwdGggZGVwdGhNYW5hZ2VyOworICByZXR1cm4gIUNYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgJiYgZGVwdGhNYW5hZ2VyLklzV2l0aGluTWF4RGVwdGgoKTsKK30KKworQ1hGQV9GTUJpbkV4cHJlc3Npb246OkNYRkFfRk1CaW5FeHByZXNzaW9uKAorICAgIHVpbnQzMl90IGxpbmUsCisgICAgWEZBX0ZNX1RPS0VOIG9wLAorICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cDEsCisgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMikKKyAgICA6IENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKGxpbmUsIG9wKSwKKyAgICAgIG1fcEV4cDEoc3RkOjptb3ZlKHBFeHAxKSksCisgICAgICBtX3BFeHAyKHN0ZDo6bW92ZShwRXhwMikpIHt9CisKK0NYRkFfRk1CaW5FeHByZXNzaW9uOjp+Q1hGQV9GTUJpbkV4cHJlc3Npb24oKSB7fQorCitib29sIENYRkFfRk1CaW5FeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7CisgIENYRkFfRk1Ub0phdmFTY3JpcHREZXB0aCBkZXB0aE1hbmFnZXI7CisgIHJldHVybiAhQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KSAmJiBkZXB0aE1hbmFnZXIuSXNXaXRoaW5NYXhEZXB0aCgpOworfQorCitDWEZBX0ZNQXNzaWduRXhwcmVzc2lvbjo6Q1hGQV9GTUFzc2lnbkV4cHJlc3Npb24oCisgICAgdWludDMyX3QgbGluZSwKKyAgICBYRkFfRk1fVE9LRU4gb3AsCisgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMSwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAyKQorICAgIDogQ1hGQV9GTUJpbkV4cHJlc3Npb24obGluZSwgb3AsIHN0ZDo6bW92ZShwRXhwMSksIHN0ZDo6bW92ZShwRXhwMikpIHt9CisKK2Jvb2wgQ1hGQV9GTUFzc2lnbkV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgfHwgIWRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGphdmFzY3JpcHQgPDwgTCJpZiAoIjsKKyAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0lTRk1PQkpFQ1RdOworICBqYXZhc2NyaXB0IDw8IEwiKCI7CisgIENGWF9XaWRlVGV4dEJ1ZiB0ZW1wRXhwMTsKKyAgaWYgKCFtX3BFeHAxLT5Ub0phdmFTY3JpcHQodGVtcEV4cDEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgamF2YXNjcmlwdCA8PCB0ZW1wRXhwMTsKKyAgamF2YXNjcmlwdCA8PCBMIikpXG57XG4iOworICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbQVNTSUdOXTsKKyAgamF2YXNjcmlwdCA8PCBMIigiOworICBqYXZhc2NyaXB0IDw8IHRlbXBFeHAxOworICBqYXZhc2NyaXB0IDw8IEwiLCAiOworCisgIENGWF9XaWRlVGV4dEJ1ZiB0ZW1wRXhwMjsKKyAgaWYgKCFtX3BFeHAyLT5Ub0phdmFTY3JpcHQodGVtcEV4cDIpKQorICAgIHJldHVybiBmYWxzZTsKKyAgamF2YXNjcmlwdCA8PCB0ZW1wRXhwMjsKKyAgamF2YXNjcmlwdCA8PCBMIik7XG59XG4iOworICBpZiAobV9wRXhwMS0+R2V0T3BlcmF0b3JUb2tlbigpID09IFRPS2lkZW50aWZpZXIgJiYKKyAgICAgIHRlbXBFeHAxLkFzU3RyaW5nVmlldygpICE9IEwidGhpcyIpIHsKKyAgICBqYXZhc2NyaXB0IDw8IEwiZWxzZVxue1xuIjsKKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBFeHAxOworICAgIGphdmFzY3JpcHQgPDwgTCIgPSAiOworICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtBU1NJR05dOworICAgIGphdmFzY3JpcHQgPDwgTCIoIjsKKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBFeHAxOworICAgIGphdmFzY3JpcHQgPDwgTCIsICI7CisgICAgamF2YXNjcmlwdCA8PCB0ZW1wRXhwMjsKKyAgICBqYXZhc2NyaXB0IDw8IEwiKTtcbn1cbiI7CisgIH0KKyAgcmV0dXJuICFDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpOworfQorCitib29sIENYRkFfRk1Bc3NpZ25FeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgfHwgIWRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGphdmFzY3JpcHQgPDwgTCJpZiAoIjsKKyAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0lTRk1PQkpFQ1RdOworICBqYXZhc2NyaXB0IDw8IEwiKCI7CisgIENGWF9XaWRlVGV4dEJ1ZiB0ZW1wRXhwMTsKKyAgaWYgKCFtX3BFeHAxLT5Ub0phdmFTY3JpcHQodGVtcEV4cDEpKQorICAgIHJldHVybiBmYWxzZTsKKyAgamF2YXNjcmlwdCA8PCB0ZW1wRXhwMTsKKyAgamF2YXNjcmlwdCA8PCBMIikpXG57XG4iOworICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOworICBqYXZhc2NyaXB0IDw8IEwiID0gIjsKKyAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0FTU0lHTl07CisgIGphdmFzY3JpcHQgPDwgTCIoIjsKKyAgamF2YXNjcmlwdCA8PCB0ZW1wRXhwMTsKKyAgamF2YXNjcmlwdCA8PCBMIiwgIjsKKworICBDRlhfV2lkZVRleHRCdWYgdGVtcEV4cDI7CisgIGlmICghbV9wRXhwMi0+VG9KYXZhU2NyaXB0KHRlbXBFeHAyKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGphdmFzY3JpcHQgPDwgdGVtcEV4cDI7CisgIGphdmFzY3JpcHQgPDwgTCIpO1xufVxuIjsKKyAgaWYgKG1fcEV4cDEtPkdldE9wZXJhdG9yVG9rZW4oKSA9PSBUT0tpZGVudGlmaWVyICYmCisgICAgICB0ZW1wRXhwMS5Bc1N0cmluZ1ZpZXcoKSAhPSBMInRoaXMiKSB7CisgICAgamF2YXNjcmlwdCA8PCBMImVsc2VcbntcbiI7CisgICAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsKKyAgICBqYXZhc2NyaXB0IDw8IEwiID0gIjsKKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBFeHAxOworICAgIGphdmFzY3JpcHQgPDwgTCIgPSAiOworICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtBU1NJR05dOworICAgIGphdmFzY3JpcHQgPDwgTCIoIjsKKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBFeHAxOworICAgIGphdmFzY3JpcHQgPDwgTCIsICI7CisgICAgamF2YXNjcmlwdCA8PCB0ZW1wRXhwMjsKKyAgICBqYXZhc2NyaXB0IDw8IEwiKTtcbn1cbiI7CisgIH0KKyAgcmV0dXJuICFDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpOworfQorCitDWEZBX0ZNTG9naWNhbE9yRXhwcmVzc2lvbjo6Q1hGQV9GTUxvZ2ljYWxPckV4cHJlc3Npb24oCisgICAgdWludDMyX3QgbGluZSwKKyAgICBYRkFfRk1fVE9LRU4gb3AsCisgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMSwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAyKQorICAgIDogQ1hGQV9GTUJpbkV4cHJlc3Npb24obGluZSwgb3AsIHN0ZDo6bW92ZShwRXhwMSksIHN0ZDo6bW92ZShwRXhwMikpIHt9CisKK2Jvb2wgQ1hGQV9GTUxvZ2ljYWxPckV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgfHwgIWRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtMT0dJQ0FMT1JdOworICBqYXZhc2NyaXB0IDw8IEwiKCI7CisgIGlmICghbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpKQorICAgIHJldHVybiBmYWxzZTsKKyAgamF2YXNjcmlwdCA8PCBMIiwgIjsKKyAgaWYgKCFtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCkpCisgICAgcmV0dXJuIGZhbHNlOworICBqYXZhc2NyaXB0IDw8IEwiKSI7CisgIHJldHVybiAhQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KTsKK30KKworQ1hGQV9GTUxvZ2ljYWxBbmRFeHByZXNzaW9uOjpDWEZBX0ZNTG9naWNhbEFuZEV4cHJlc3Npb24oCisgICAgdWludDMyX3QgbGluZSwKKyAgICBYRkFfRk1fVE9LRU4gb3AsCisgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMSwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAyKQorICAgIDogQ1hGQV9GTUJpbkV4cHJlc3Npb24obGluZSwgb3AsIHN0ZDo6bW92ZShwRXhwMSksIHN0ZDo6bW92ZShwRXhwMikpIHt9CisKK2Jvb2wgQ1hGQV9GTUxvZ2ljYWxBbmRFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7CisgIENYRkFfRk1Ub0phdmFTY3JpcHREZXB0aCBkZXB0aE1hbmFnZXI7CisgIGlmIChDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpIHx8ICFkZXB0aE1hbmFnZXIuSXNXaXRoaW5NYXhEZXB0aCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbTE9HSUNBTEFORF07CisgIGphdmFzY3JpcHQgPDwgTCIoIjsKKyAgaWYgKCFtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCkpCisgICAgcmV0dXJuIGZhbHNlOworICBqYXZhc2NyaXB0IDw8IEwiLCAiOworICBpZiAoIW1fcEV4cDItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGphdmFzY3JpcHQgPDwgTCIpIjsKKyAgcmV0dXJuICFDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpOworfQorCitDWEZBX0ZNRXF1YWxpdHlFeHByZXNzaW9uOjpDWEZBX0ZNRXF1YWxpdHlFeHByZXNzaW9uKAorICAgIHVpbnQzMl90IGxpbmUsCisgICAgWEZBX0ZNX1RPS0VOIG9wLAorICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cDEsCisgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMikKKyAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsIG9wLCBzdGQ6Om1vdmUocEV4cDEpLCBzdGQ6Om1vdmUocEV4cDIpKSB7fQorCitib29sIENYRkFfRk1FcXVhbGl0eUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgfHwgIWRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHN3aXRjaCAobV9vcCkgeworICAgIGNhc2UgVE9LZXE6CisgICAgY2FzZSBUT0trc2VxOgorICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0VRVUFMSVRZXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVE9LbmU6CisgICAgY2FzZSBUT0trc25lOgorICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW05PVEVRVUFMSVRZXTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICBicmVhazsKKyAgfQorICBqYXZhc2NyaXB0IDw8IEwiKCI7CisgIGlmICghbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpKQorICAgIHJldHVybiBmYWxzZTsKKyAgamF2YXNjcmlwdCA8PCBMIiwgIjsKKyAgaWYgKCFtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCkpCisgICAgcmV0dXJuIGZhbHNlOworICBqYXZhc2NyaXB0IDw8IEwiKSI7CisgIHJldHVybiAhQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KTsKK30KKworQ1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uOjpDWEZBX0ZNUmVsYXRpb25hbEV4cHJlc3Npb24oCisgICAgdWludDMyX3QgbGluZSwKKyAgICBYRkFfRk1fVE9LRU4gb3AsCisgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMSwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAyKQorICAgIDogQ1hGQV9GTUJpbkV4cHJlc3Npb24obGluZSwgb3AsIHN0ZDo6bW92ZShwRXhwMSksIHN0ZDo6bW92ZShwRXhwMikpIHt9CisKK2Jvb2wgQ1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7CisgIENYRkFfRk1Ub0phdmFTY3JpcHREZXB0aCBkZXB0aE1hbmFnZXI7CisgIGlmIChDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpIHx8ICFkZXB0aE1hbmFnZXIuSXNXaXRoaW5NYXhEZXB0aCgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBzd2l0Y2ggKG1fb3ApIHsKKyAgICBjYXNlIFRPS2x0OgorICAgIGNhc2UgVE9La3NsdDoKKyAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtMRVNTXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVE9LZ3Q6CisgICAgY2FzZSBUT0trc2d0OgorICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0dSRUFURVJdOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUT0tsZToKKyAgICBjYXNlIFRPS2tzbGU6CisgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbTEVTU0VRVUFMXTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVE9LZ2U6CisgICAgY2FzZSBUT0trc2dlOgorICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0dSRUFURVJFUVVBTF07CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgYnJlYWs7CisgIH0KKyAgamF2YXNjcmlwdCA8PCBMIigiOworICBpZiAoIW1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGphdmFzY3JpcHQgPDwgTCIsICI7CisgIGlmICghbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpKQorICAgIHJldHVybiBmYWxzZTsKKyAgamF2YXNjcmlwdCA8PCBMIikiOworICByZXR1cm4gIUNYRkFfSXNUb29CaWcoamF2YXNjcmlwdCk7Cit9CisKK0NYRkFfRk1BZGRpdGl2ZUV4cHJlc3Npb246OkNYRkFfRk1BZGRpdGl2ZUV4cHJlc3Npb24oCisgICAgdWludDMyX3QgbGluZSwKKyAgICBYRkFfRk1fVE9LRU4gb3AsCisgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMSwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAyKQorICAgIDogQ1hGQV9GTUJpbkV4cHJlc3Npb24obGluZSwgb3AsIHN0ZDo6bW92ZShwRXhwMSksIHN0ZDo6bW92ZShwRXhwMikpIHt9CisKK2Jvb2wgQ1hGQV9GTUFkZGl0aXZlRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgeworICBDWEZBX0ZNVG9KYXZhU2NyaXB0RGVwdGggZGVwdGhNYW5hZ2VyOworICBpZiAoQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KSB8fCAhZGVwdGhNYW5hZ2VyLklzV2l0aGluTWF4RGVwdGgoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc3dpdGNoIChtX29wKSB7CisgICAgY2FzZSBUT0twbHVzOgorICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW1BMVVNdOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUT0ttaW51czoKKyAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtNSU5VU107CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgYnJlYWs7CisgIH0KKyAgamF2YXNjcmlwdCA8PCBMIigiOworICBpZiAoIW1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGphdmFzY3JpcHQgPDwgTCIsICI7CisgIGlmICghbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpKQorICAgIHJldHVybiBmYWxzZTsKKyAgamF2YXNjcmlwdCA8PCBMIikiOworICByZXR1cm4gIUNYRkFfSXNUb29CaWcoamF2YXNjcmlwdCk7Cit9CisKK0NYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb246OkNYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oCisgICAgdWludDMyX3QgbGluZSwKKyAgICBYRkFfRk1fVE9LRU4gb3AsCisgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMSwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAyKQorICAgIDogQ1hGQV9GTUJpbkV4cHJlc3Npb24obGluZSwgb3AsIHN0ZDo6bW92ZShwRXhwMSksIHN0ZDo6bW92ZShwRXhwMikpIHt9CisKK2Jvb2wgQ1hGQV9GTU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KAorICAgIENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgeworICBDWEZBX0ZNVG9KYXZhU2NyaXB0RGVwdGggZGVwdGhNYW5hZ2VyOworICBpZiAoQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KSB8fCAhZGVwdGhNYW5hZ2VyLklzV2l0aGluTWF4RGVwdGgoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgc3dpdGNoIChtX29wKSB7CisgICAgY2FzZSBUT0ttdWw6CisgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbTVVMVElQTEVdOworICAgICAgYnJlYWs7CisgICAgY2FzZSBUT0tkaXY6CisgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbRElWSURFXTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICBicmVhazsKKyAgfQorICBqYXZhc2NyaXB0IDw8IEwiKCI7CisgIGlmICghbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpKQorICAgIHJldHVybiBmYWxzZTsKKyAgamF2YXNjcmlwdCA8PCBMIiwgIjsKKyAgaWYgKCFtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCkpCisgICAgcmV0dXJuIGZhbHNlOworICBqYXZhc2NyaXB0IDw8IEwiKSI7CisgIHJldHVybiAhQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KTsKK30KKworQ1hGQV9GTVBvc0V4cHJlc3Npb246OkNYRkFfRk1Qb3NFeHByZXNzaW9uKAorICAgIHVpbnQzMl90IGxpbmUsCisgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwKQorICAgIDogQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbihsaW5lLCBUT0twbHVzLCBzdGQ6Om1vdmUocEV4cCkpIHt9CisKK2Jvb2wgQ1hGQV9GTVBvc0V4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgfHwgIWRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtQT1NJVElWRV07CisgIGphdmFzY3JpcHQgPDwgTCIoIjsKKyAgaWYgKCFtX3BFeHAtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGphdmFzY3JpcHQgPDwgTCIpIjsKKyAgcmV0dXJuICFDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpOworfQorCitDWEZBX0ZNTmVnRXhwcmVzc2lvbjo6Q1hGQV9GTU5lZ0V4cHJlc3Npb24oCisgICAgdWludDMyX3QgbGluZSwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHApCisgICAgOiBDWEZBX0ZNVW5hcnlFeHByZXNzaW9uKGxpbmUsIFRPS21pbnVzLCBzdGQ6Om1vdmUocEV4cCkpIHt9CisKK2Jvb2wgQ1hGQV9GTU5lZ0V4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgfHwgIWRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtORUdBVElWRV07CisgIGphdmFzY3JpcHQgPDwgTCIoIjsKKyAgaWYgKCFtX3BFeHAtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGphdmFzY3JpcHQgPDwgTCIpIjsKKyAgcmV0dXJuICFDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpOworfQorCitDWEZBX0ZNTm90RXhwcmVzc2lvbjo6Q1hGQV9GTU5vdEV4cHJlc3Npb24oCisgICAgdWludDMyX3QgbGluZSwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHApCisgICAgOiBDWEZBX0ZNVW5hcnlFeHByZXNzaW9uKGxpbmUsIFRPS2tzbm90LCBzdGQ6Om1vdmUocEV4cCkpIHt9CisKK2Jvb2wgQ1hGQV9GTU5vdEV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgfHwgIWRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtOT1RdOworICBqYXZhc2NyaXB0IDw8IEwiKCI7CisgIGlmICghbV9wRXhwLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCkpCisgICAgcmV0dXJuIGZhbHNlOworICBqYXZhc2NyaXB0IDw8IEwiKSI7CisgIHJldHVybiAhQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KTsKK30KKworQ1hGQV9GTUNhbGxFeHByZXNzaW9uOjpDWEZBX0ZNQ2FsbEV4cHJlc3Npb24oCisgICAgdWludDMyX3QgbGluZSwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAsCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPj4mJiBwQXJndW1lbnRzLAorICAgIGJvb2wgYklzU29tTWV0aG9kKQorICAgIDogQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbihsaW5lLCBUT0tjYWxsLCBzdGQ6Om1vdmUocEV4cCkpLAorICAgICAgbV9iSXNTb21NZXRob2QoYklzU29tTWV0aG9kKSwKKyAgICAgIG1fQXJndW1lbnRzKHN0ZDo6bW92ZShwQXJndW1lbnRzKSkge30KKworQ1hGQV9GTUNhbGxFeHByZXNzaW9uOjp+Q1hGQV9GTUNhbGxFeHByZXNzaW9uKCkge30KKworYm9vbCBDWEZBX0ZNQ2FsbEV4cHJlc3Npb246OklzQnVpbHRJbkZ1bmMoQ0ZYX1dpZGVUZXh0QnVmKiBmdW5jTmFtZSkgeworICBpZiAoZnVuY05hbWUtPkdldExlbmd0aCgpID4gZ19CdWlsdEluRnVuY3NNYXhMZW4pCisgICAgcmV0dXJuIGZhbHNlOworCisgIGF1dG8gY21wRnVuYyA9IFtdKGNvbnN0IHdjaGFyX3QqIGl0ZXIsIGNvbnN0IFdpZGVTdHJpbmcmIHZhbCkgLT4gYm9vbCB7CisgICAgcmV0dXJuIHZhbC5Db21wYXJlTm9DYXNlKGl0ZXIpID4gMDsKKyAgfTsKKyAgV2lkZVN0cmluZyBzdHIgPSBmdW5jTmFtZS0+TWFrZVN0cmluZygpOworICBjb25zdCB3Y2hhcl90KiBjb25zdCogcE1hdGNoUmVzdWx0ID0gc3RkOjpsb3dlcl9ib3VuZCgKKyAgICAgIHN0ZDo6YmVnaW4oZ19CdWlsdEluRnVuY3MpLCBzdGQ6OmVuZChnX0J1aWx0SW5GdW5jcyksIHN0ciwgY21wRnVuYyk7CisgIGlmIChwTWF0Y2hSZXN1bHQgIT0gc3RkOjplbmQoZ19CdWlsdEluRnVuY3MpICYmCisgICAgICAhc3RyLkNvbXBhcmVOb0Nhc2UoKnBNYXRjaFJlc3VsdCkpIHsKKyAgICBmdW5jTmFtZS0+Q2xlYXIoKTsKKyAgICAqZnVuY05hbWUgPDwgKnBNYXRjaFJlc3VsdDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3VpbnQzMl90IENYRkFfRk1DYWxsRXhwcmVzc2lvbjo6SXNNZXRob2RXaXRoT2JqUGFyYW0oCisgICAgY29uc3QgV2lkZVN0cmluZyYgbWV0aG9kTmFtZSkgeworICBhdXRvIGNtcEZ1bmMgPSBbXShjb25zdCBYRkFfRk1TT01NZXRob2QgaXRlciwgY29uc3QgV2lkZVN0cmluZyYgdmFsKSB7CisgICAgcmV0dXJuIHZhbC5Db21wYXJlKGl0ZXIubV93c1NvbU1ldGhvZE5hbWUpID4gMDsKKyAgfTsKKyAgY29uc3QgWEZBX0ZNU09NTWV0aG9kKiByZXN1bHQgPQorICAgICAgc3RkOjpsb3dlcl9ib3VuZChzdGQ6OmJlZ2luKGdzX0ZNU29tTWV0aG9kcyksIHN0ZDo6ZW5kKGdzX0ZNU29tTWV0aG9kcyksCisgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZE5hbWUsIGNtcEZ1bmMpOworICBpZiAocmVzdWx0ICE9IHN0ZDo6ZW5kKGdzX0ZNU29tTWV0aG9kcykgJiYKKyAgICAgICFtZXRob2ROYW1lLkNvbXBhcmUocmVzdWx0LT5tX3dzU29tTWV0aG9kTmFtZSkpIHsKKyAgICByZXR1cm4gcmVzdWx0LT5tX2RQYXJhbWV0ZXJzOworICB9CisgIHJldHVybiAwOworfQorCitib29sIENYRkFfRk1DYWxsRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgeworICBDWEZBX0ZNVG9KYXZhU2NyaXB0RGVwdGggZGVwdGhNYW5hZ2VyOworICBpZiAoQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KSB8fCAhZGVwdGhNYW5hZ2VyLklzV2l0aGluTWF4RGVwdGgoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQ0ZYX1dpZGVUZXh0QnVmIGZ1bmNOYW1lOworICBpZiAoIW1fcEV4cC0+VG9KYXZhU2NyaXB0KGZ1bmNOYW1lKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmIChtX2JJc1NvbU1ldGhvZCkgeworICAgIGphdmFzY3JpcHQgPDwgZnVuY05hbWU7CisgICAgamF2YXNjcmlwdCA8PCBMIigiOworICAgIHVpbnQzMl90IG1ldGhvZFBhcmEgPSBJc01ldGhvZFdpdGhPYmpQYXJhbShmdW5jTmFtZS5NYWtlU3RyaW5nKCkpOworICAgIGlmIChtZXRob2RQYXJhID4gMCkgeworICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX0FyZ3VtZW50cy5zaXplKCk7ICsraSkgeworICAgICAgICAvLyBDdXJyZW50bHkgbm9uZSBvZiBvdXIgZXhwcmVzc2lvbnMgdXNlIG9iamVjdHMgZm9yIGEgcGFyYW1ldGVyIG92ZXIKKyAgICAgICAgLy8gdGhlIDZ0aC4gTWFrZSBzdXJlIHdlIGRvbid0IG92ZXJmbG93IHRoZSBzaGlmdCB3aGVuIGRvaW5nIHRoaXMKKyAgICAgICAgLy8gY2hlY2suIElmIHdlIGV2ZXIgbmVlZCBtb3JlIHRoZSAzMiBvYmplY3QgcGFyYW1zIHdlIGNhbiByZXZpc2l0LgorICAgICAgICBpZiAoaSA8IDMyICYmIChtZXRob2RQYXJhICYgKDB4MDEgPDwgaSkpID4gMCkgeworICAgICAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtHRVRGTUpTT0JKXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbR0VURk1WQUxVRV07CisgICAgICAgIH0KKyAgICAgICAgamF2YXNjcmlwdCA8PCBMIigiOworICAgICAgICBjb25zdCBhdXRvJiBleHByID0gbV9Bcmd1bWVudHNbaV07CisgICAgICAgIGlmICghZXhwci0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgamF2YXNjcmlwdCA8PCBMIikiOworICAgICAgICBpZiAoaSArIDEgPCBtX0FyZ3VtZW50cy5zaXplKCkpIHsKKyAgICAgICAgICBqYXZhc2NyaXB0IDw8IEwiLCAiOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoY29uc3QgYXV0byYgZXhwciA6IG1fQXJndW1lbnRzKSB7CisgICAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtHRVRGTVZBTFVFXTsKKyAgICAgICAgamF2YXNjcmlwdCA8PCBMIigiOworICAgICAgICBpZiAoIWV4cHItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGphdmFzY3JpcHQgPDwgTCIpIjsKKyAgICAgICAgaWYgKGV4cHIgIT0gbV9Bcmd1bWVudHMuYmFjaygpKQorICAgICAgICAgIGphdmFzY3JpcHQgPDwgTCIsICI7CisgICAgICB9CisgICAgfQorICAgIGphdmFzY3JpcHQgPDwgTCIpIjsKKyAgfSBlbHNlIHsKKyAgICBib29sIGlzRXZhbEZ1bmMgPSBmYWxzZTsKKyAgICBib29sIGlzRXhpc3RzRnVuYyA9IGZhbHNlOworICAgIGlmIChJc0J1aWx0SW5GdW5jKCZmdW5jTmFtZSkpIHsKKyAgICAgIGlmIChmdW5jTmFtZS5Bc1N0cmluZ1ZpZXcoKSA9PSBMIkV2YWwiKSB7CisgICAgICAgIGlzRXZhbEZ1bmMgPSB0cnVlOworICAgICAgICBqYXZhc2NyaXB0IDw8IEwiZXZhbC5jYWxsKHRoaXMsICI7CisgICAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtDQUxMXTsKKyAgICAgICAgamF2YXNjcmlwdCA8PCBMIlRyYW5zbGF0ZSI7CisgICAgICB9IGVsc2UgaWYgKGZ1bmNOYW1lLkFzU3RyaW5nVmlldygpID09IEwiRXhpc3RzIikgeworICAgICAgICBpc0V4aXN0c0Z1bmMgPSB0cnVlOworICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbQ0FMTF07CisgICAgICAgIGphdmFzY3JpcHQgPDwgZnVuY05hbWU7CisgICAgICB9IGVsc2UgeworICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbQ0FMTF07CisgICAgICAgIGphdmFzY3JpcHQgPDwgZnVuY05hbWU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIElmIGEgZnVuY3Rpb24gaXMgbm90IGEgU29tTWV0aG9kIG9yIGEgYnVpbHQtaW4gdGhlbiB0aGUgaW5wdXQgd2FzCisgICAgICAvLyBpbnZhbGlkLCBzbyBmYWlsaW5nLiBUaGUgc2Nhbm5lci9sZXhlciBzaG91bGQgY2F0Y2ggdGhpcywgYnV0IGN1cnJlbnRseQorICAgICAgLy8gZG9lc24ndC4gVGhpcyBmYWlsdXJlIHdpbGwgYnViYmxlIHVwIHRvIHRoZSB0b3AtbGV2ZWwgYW5kIGNhdXNlIHRoZQorICAgICAgLy8gdHJhbnNwaWxlIHRvIGZhaWwuCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGphdmFzY3JpcHQgPDwgTCIoIjsKKyAgICBpZiAoaXNFeGlzdHNGdW5jKSB7CisgICAgICBqYXZhc2NyaXB0IDw8IEwiXG4oXG5mdW5jdGlvbiAoKVxue1xudHJ5XG57XG4iOworICAgICAgaWYgKCFtX0FyZ3VtZW50cy5lbXB0eSgpKSB7CisgICAgICAgIGNvbnN0IGF1dG8mIGV4cHIgPSBtX0FyZ3VtZW50c1swXTsKKyAgICAgICAgamF2YXNjcmlwdCA8PCBMInJldHVybiAiOworICAgICAgICBpZiAoIWV4cHItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGphdmFzY3JpcHQgPDwgTCI7XG59XG4iOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgamF2YXNjcmlwdCA8PCBMInJldHVybiAwO1xufVxuIjsKKyAgICAgIH0KKyAgICAgIGphdmFzY3JpcHQgPDwgTCJjYXRjaChhY2Nlc3NFeGNlcHRpb25zKVxuIjsKKyAgICAgIGphdmFzY3JpcHQgPDwgTCJ7XG5yZXR1cm4gMDtcbn1cbn1cbikuY2FsbCh0aGlzKVxuIjsKKyAgICB9IGVsc2UgeworICAgICAgZm9yIChjb25zdCBhdXRvJiBleHByIDogbV9Bcmd1bWVudHMpIHsKKyAgICAgICAgaWYgKCFleHByLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoZXhwciAhPSBtX0FyZ3VtZW50cy5iYWNrKCkpCisgICAgICAgICAgamF2YXNjcmlwdCA8PCBMIiwgIjsKKyAgICAgIH0KKyAgICB9CisgICAgamF2YXNjcmlwdCA8PCBMIikiOworICAgIGlmIChpc0V2YWxGdW5jKSB7CisgICAgICBqYXZhc2NyaXB0IDw8IEwiKSI7CisgICAgfQorICB9CisgIHJldHVybiAhQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KTsKK30KKworQ1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbjo6Q1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbigKKyAgICB1aW50MzJfdCBsaW5lLAorICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEFjY2Vzc29yLAorICAgIFhGQV9GTV9UT0tFTiBvcCwKKyAgICBXaWRlU3RyaW5nVmlldyB3c0lkZW50aWZpZXIsCisgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwSW5kZXhFeHApCisgICAgOiBDWEZBX0ZNQmluRXhwcmVzc2lvbihsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocEFjY2Vzc29yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwSW5kZXhFeHApKSwKKyAgICAgIG1fd3NJZGVudGlmaWVyKHdzSWRlbnRpZmllcikge30KKworQ1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbjo6fkNYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24oKSB7fQorCitib29sIENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgfHwgIWRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtET1RdOworICBqYXZhc2NyaXB0IDw8IEwiKCI7CisgIENGWF9XaWRlVGV4dEJ1ZiB0ZW1wRXhwMTsKKyAgaWYgKG1fcEV4cDEpIHsKKyAgICBpZiAoIW1fcEV4cDEtPlRvSmF2YVNjcmlwdCh0ZW1wRXhwMSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgamF2YXNjcmlwdCA8PCB0ZW1wRXhwMTsKKyAgfSBlbHNlIHsKKyAgICBqYXZhc2NyaXB0IDw8IEwibnVsbCI7CisgIH0KKyAgamF2YXNjcmlwdCA8PCBMIiwgIjsKKyAgamF2YXNjcmlwdCA8PCBMIlwiIjsKKworICBpZiAobV9wRXhwMSAmJiBtX3BFeHAxLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LaWRlbnRpZmllcikKKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBFeHAxOworICBqYXZhc2NyaXB0IDw8IEwiXCIsICI7CisgIGlmIChtX29wID09IFRPS2RvdHNjcmVhbSkgeworICAgIGphdmFzY3JpcHQgPDwgTCJcIiMiOworICAgIGphdmFzY3JpcHQgPDwgbV93c0lkZW50aWZpZXI7CisgICAgamF2YXNjcmlwdCA8PCBMIlwiLCAiOworICB9IGVsc2UgaWYgKG1fb3AgPT0gVE9LZG90c3RhcikgeworICAgIGphdmFzY3JpcHQgPDwgTCJcIipcIiwgIjsKKyAgfSBlbHNlIGlmIChtX29wID09IFRPS2NhbGwpIHsKKyAgICBqYXZhc2NyaXB0IDw8IEwiXCJcIiwgIjsKKyAgfSBlbHNlIHsKKyAgICBqYXZhc2NyaXB0IDw8IEwiXCIiOworICAgIGphdmFzY3JpcHQgPDwgbV93c0lkZW50aWZpZXI7CisgICAgamF2YXNjcmlwdCA8PCBMIlwiLCAiOworICB9CisgIGlmICghbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpKQorICAgIHJldHVybiBmYWxzZTsKKyAgamF2YXNjcmlwdCA8PCBMIikiOworICByZXR1cm4gIUNYRkFfSXNUb29CaWcoamF2YXNjcmlwdCk7Cit9CisKK0NYRkFfRk1JbmRleEV4cHJlc3Npb246OkNYRkFfRk1JbmRleEV4cHJlc3Npb24oCisgICAgdWludDMyX3QgbGluZSwKKyAgICBYRkFfRk1fQWNjZXNzb3JJbmRleCBhY2Nlc3NvckluZGV4LAorICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEluZGV4RXhwLAorICAgIGJvb2wgYklzU3RhckluZGV4KQorICAgIDogQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbihsaW5lLCBUT0tsYnJhY2tldCwgc3RkOjptb3ZlKHBJbmRleEV4cCkpLAorICAgICAgbV9hY2Nlc3NvckluZGV4KGFjY2Vzc29ySW5kZXgpLAorICAgICAgbV9iSXNTdGFySW5kZXgoYklzU3RhckluZGV4KSB7fQorCitib29sIENYRkFfRk1JbmRleEV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIGRlcHRoTWFuYWdlcjsKKyAgaWYgKENYRkFfSXNUb29CaWcoamF2YXNjcmlwdCkgfHwgIWRlcHRoTWFuYWdlci5Jc1dpdGhpbk1heERlcHRoKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIHN3aXRjaCAobV9hY2Nlc3NvckluZGV4KSB7CisgICAgY2FzZSBBQ0NFU1NPUl9OT19JTkRFWDoKKyAgICAgIGphdmFzY3JpcHQgPDwgTCIwIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUNDRVNTT1JfTk9fUkVMQVRJVkVJTkRFWDoKKyAgICAgIGphdmFzY3JpcHQgPDwgTCIxIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQUNDRVNTT1JfUE9TSVRJVkVfSU5ERVg6CisgICAgICBqYXZhc2NyaXB0IDw8IEwiMiI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFDQ0VTU09SX05FR0FUSVZFX0lOREVYOgorICAgICAgamF2YXNjcmlwdCA8PCBMIjMiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGphdmFzY3JpcHQgPDwgTCIwIjsKKyAgfQorICBpZiAoIW1fYklzU3RhckluZGV4KSB7CisgICAgamF2YXNjcmlwdCA8PCBMIiwgIjsKKyAgICBpZiAobV9wRXhwKSB7CisgICAgICBpZiAoIW1fcEV4cC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIGphdmFzY3JpcHQgPDwgTCIwIjsKKyAgICB9CisgIH0KKyAgcmV0dXJuICFDWEZBX0lzVG9vQmlnKGphdmFzY3JpcHQpOworfQorCitDWEZBX0ZNRG90RG90QWNjZXNzb3JFeHByZXNzaW9uOjpDWEZBX0ZNRG90RG90QWNjZXNzb3JFeHByZXNzaW9uKAorICAgIHVpbnQzMl90IGxpbmUsCisgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwQWNjZXNzb3IsCisgICAgWEZBX0ZNX1RPS0VOIG9wLAorICAgIFdpZGVTdHJpbmdWaWV3IHdzSWRlbnRpZmllciwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBJbmRleEV4cCkKKyAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwQWNjZXNzb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHBJbmRleEV4cCkpLAorICAgICAgbV93c0lkZW50aWZpZXIod3NJZGVudGlmaWVyKSB7fQorCitDWEZBX0ZNRG90RG90QWNjZXNzb3JFeHByZXNzaW9uOjp+Q1hGQV9GTURvdERvdEFjY2Vzc29yRXhwcmVzc2lvbigpIHt9CisKK2Jvb2wgQ1hGQV9GTURvdERvdEFjY2Vzc29yRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KAorICAgIENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgeworICBDWEZBX0ZNVG9KYXZhU2NyaXB0RGVwdGggZGVwdGhNYW5hZ2VyOworICBpZiAoQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KSB8fCAhZGVwdGhNYW5hZ2VyLklzV2l0aGluTWF4RGVwdGgoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0RPVERPVF07CisgIGphdmFzY3JpcHQgPDwgTCIoIjsKKyAgQ0ZYX1dpZGVUZXh0QnVmIHRlbXBFeHAxOworICBpZiAoIW1fcEV4cDEtPlRvSmF2YVNjcmlwdCh0ZW1wRXhwMSkpCisgICAgcmV0dXJuIGZhbHNlOworICBqYXZhc2NyaXB0IDw8IHRlbXBFeHAxOworICBqYXZhc2NyaXB0IDw8IEwiLCAiOworICBqYXZhc2NyaXB0IDw8IEwiXCIiOworCisgIGlmIChtX3BFeHAxLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LaWRlbnRpZmllcikKKyAgICBqYXZhc2NyaXB0IDw8IHRlbXBFeHAxOworICBqYXZhc2NyaXB0IDw8IEwiXCIsICI7CisgIGphdmFzY3JpcHQgPDwgTCJcIiI7CisgIGphdmFzY3JpcHQgPDwgbV93c0lkZW50aWZpZXI7CisgIGphdmFzY3JpcHQgPDwgTCJcIiwgIjsKKyAgaWYgKCFtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCkpCisgICAgcmV0dXJuIGZhbHNlOworICBqYXZhc2NyaXB0IDw8IEwiKSI7CisgIHJldHVybiAhQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KTsKK30KKworQ1hGQV9GTU1ldGhvZENhbGxFeHByZXNzaW9uOjpDWEZBX0ZNTWV0aG9kQ2FsbEV4cHJlc3Npb24oCisgICAgdWludDMyX3QgbGluZSwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBBY2Nlc3NvckV4cDEsCisgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwQ2FsbEV4cCkKKyAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUT0tkb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocEFjY2Vzc29yRXhwMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocENhbGxFeHApKSB7fQorCitib29sIENYRkFfRk1NZXRob2RDYWxsRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgeworICBDWEZBX0ZNVG9KYXZhU2NyaXB0RGVwdGggZGVwdGhNYW5hZ2VyOworICBpZiAoQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KSB8fCAhZGVwdGhNYW5hZ2VyLklzV2l0aGluTWF4RGVwdGgoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgamF2YXNjcmlwdCA8PCBMIihcbmZ1bmN0aW9uICgpXG57XG4iOworICBqYXZhc2NyaXB0IDw8IEwidmFyIG1ldGhvZF9yZXR1cm5fdmFsdWUgPSBudWxsO1xuIjsKKyAgamF2YXNjcmlwdCA8PCBMInZhciBhY2Nlc3Nvcl9vYmplY3QgPSAiOworICBpZiAoIW1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGphdmFzY3JpcHQgPDwgTCI7XG4iOworICBqYXZhc2NyaXB0IDw8IEwiaWYgKCI7CisgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtJU0ZNQVJSQVldOworICBqYXZhc2NyaXB0IDw8IEwiKGFjY2Vzc29yX29iamVjdCkpXG57XG4iOworICBqYXZhc2NyaXB0IDw8IEwiZm9yKHZhciBpbmRleCA9IGFjY2Vzc29yX29iamVjdC5sZW5ndGggLSAxOyBpbmRleCA+IDE7ICIKKyAgICAgICAgICAgICAgICBMImluZGV4LS0pXG57XG4iOworICBqYXZhc2NyaXB0IDw8IEwibWV0aG9kX3JldHVybl92YWx1ZSA9IGFjY2Vzc29yX29iamVjdFtpbmRleF0uIjsKKworICBDRlhfV2lkZVRleHRCdWYgdGVtcEV4cDI7CisgIGlmICghbV9wRXhwMi0+VG9KYXZhU2NyaXB0KHRlbXBFeHAyKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGphdmFzY3JpcHQgPDwgdGVtcEV4cDI7CisgIGphdmFzY3JpcHQgPDwgTCI7XG59XG59XG4iOworICBqYXZhc2NyaXB0IDw8IEwiZWxzZVxue1xubWV0aG9kX3JldHVybl92YWx1ZSA9IGFjY2Vzc29yX29iamVjdC4iOworICBqYXZhc2NyaXB0IDw8IHRlbXBFeHAyOworICBqYXZhc2NyaXB0IDw8IEwiO1xufVxuIjsKKyAgamF2YXNjcmlwdCA8PCBMInJldHVybiBtZXRob2RfcmV0dXJuX3ZhbHVlO1xuIjsKKyAgamF2YXNjcmlwdCA8PCBMIn1cbikuY2FsbCh0aGlzKSI7CisgIHJldHVybiAhQ1hGQV9Jc1Rvb0JpZyhqYXZhc2NyaXB0KTsKK30KKworYm9vbCBDWEZBX0lzVG9vQmlnKGNvbnN0IENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgeworICByZXR1cm4gamF2YXNjcmlwdC5HZXRTaXplKCkgPj0gMjU2ICogMTAyNCAqIDEwMjQ7Cit9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9mbTJqcy9jeGZhX2Ztc2ltcGxlZXhwcmVzc2lvbi5oIGIveGZhL2Z4ZmEvZm0yanMvY3hmYV9mbXNpbXBsZWV4cHJlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDBiMTU0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvZm0yanMvY3hmYV9mbXNpbXBsZWV4cHJlc3Npb24uaApAQCAtMCwwICsxLDMwOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX0ZNMkpTX0NYRkFfRk1TSU1QTEVFWFBSRVNTSU9OX0hfCisjZGVmaW5lIFhGQV9GWEZBX0ZNMkpTX0NYRkFfRk1TSU1QTEVFWFBSRVNTSU9OX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvZm0yanMvY3hmYV9mbWxleGVyLmgiCisKKyNkZWZpbmUgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUUgTCJwZm1fcmV0IgorI2RlZmluZSBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSIEwicGZtX19leGNsX18iCisKK2VudW0gWEZBX0ZNX1NpbXBsZUV4cHJlc3Npb25UeXBlIHsKKyAgQVNTSUdOLAorICBMT0dJQ0FMT1IsCisgIExPR0lDQUxBTkQsCisgIEVRVUFMSVRZLAorICBOT1RFUVVBTElUWSwKKyAgTEVTUywKKyAgTEVTU0VRVUFMLAorICBHUkVBVEVSLAorICBHUkVBVEVSRVFVQUwsCisgIFBMVVMsCisgIE1JTlVTLAorICBNVUxUSVBMRSwKKyAgRElWSURFLAorICBQT1NJVElWRSwKKyAgTkVHQVRJVkUsCisgIE5PVCwKKyAgQ0FMTCwKKyAgRE9ULAorICBET1RET1QsCisgIENPTkNBVEZNT0JKRUNULAorICBJU0ZNT0JKRUNULAorICBJU0ZNQVJSQVksCisgIEdFVEZNVkFMVUUsCisgIEdFVEZNSlNPQkosCisgIFZBUkZJTFRFUgorfTsKKworY2xhc3MgQ0ZYX1dpZGVUZXh0QnVmOworCitXaWRlU3RyaW5nVmlldyBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKAorICAgIFhGQV9GTV9TaW1wbGVFeHByZXNzaW9uVHlwZSBzaW1wbGVFeHBUeXBlKTsKKworZW51bSBYRkFfRk1fQWNjZXNzb3JJbmRleCB7CisgIEFDQ0VTU09SX05PX0lOREVYLAorICBBQ0NFU1NPUl9OT19SRUxBVElWRUlOREVYLAorICBBQ0NFU1NPUl9QT1NJVElWRV9JTkRFWCwKKyAgQUNDRVNTT1JfTkVHQVRJVkVfSU5ERVgKK307CisKK2NsYXNzIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uIHsKKyBwdWJsaWM6CisgIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKHVpbnQzMl90IGxpbmUsIFhGQV9GTV9UT0tFTiBvcCk7CisgIHZpcnR1YWwgfkNYRkFfRk1TaW1wbGVFeHByZXNzaW9uKCkge30KKyAgdmlydHVhbCBib29sIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOworICB2aXJ0dWFsIGJvb2wgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsKKworICBYRkFfRk1fVE9LRU4gR2V0T3BlcmF0b3JUb2tlbigpIGNvbnN0OworCisgcHJvdGVjdGVkOgorICB1aW50MzJfdCBtX2xpbmU7CisgIGNvbnN0IFhGQV9GTV9UT0tFTiBtX29wOworfTsKKworY2xhc3MgQ1hGQV9GTU51bGxFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENYRkFfRk1OdWxsRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lKTsKKyAgfkNYRkFfRk1OdWxsRXhwcmVzc2lvbigpIG92ZXJyaWRlIHt9CisgIGJvb2wgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBDWEZBX0ZNTnVtYmVyRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiB7CisgcHVibGljOgorICBDWEZBX0ZNTnVtYmVyRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lLCBXaWRlU3RyaW5nVmlldyB3c051bWJlcik7CisgIH5DWEZBX0ZNTnVtYmVyRXhwcmVzc2lvbigpIG92ZXJyaWRlOworICBib29sIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgV2lkZVN0cmluZ1ZpZXcgbV93c051bWJlcjsKK307CisKK2NsYXNzIENYRkFfRk1TdHJpbmdFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uIHsKKyBwdWJsaWM6CisgIENYRkFfRk1TdHJpbmdFeHByZXNzaW9uKHVpbnQzMl90IGxpbmUsIFdpZGVTdHJpbmdWaWV3IHdzU3RyaW5nKTsKKyAgfkNYRkFfRk1TdHJpbmdFeHByZXNzaW9uKCkgb3ZlcnJpZGU7CisgIGJvb2wgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBXaWRlU3RyaW5nVmlldyBtX3dzU3RyaW5nOworfTsKKworY2xhc3MgQ1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uIHsKKyBwdWJsaWM6CisgIENYRkFfRk1JZGVudGlmaWVyRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lLCBXaWRlU3RyaW5nVmlldyB3c0lkZW50aWZpZXIpOworICB+Q1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9uKCkgb3ZlcnJpZGU7CisgIGJvb2wgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBXaWRlU3RyaW5nVmlldyBtX3dzSWRlbnRpZmllcjsKK307CisKK2NsYXNzIENYRkFfRk1VbmFyeUV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24geworIHB1YmxpYzoKKyAgQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbih1aW50MzJfdCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GTV9UT0tFTiBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHApOworICB+Q1hGQV9GTVVuYXJ5RXhwcmVzc2lvbigpIG92ZXJyaWRlOworCisgIGJvb2wgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgb3ZlcnJpZGU7CisKKyBwcm90ZWN0ZWQ6CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gbV9wRXhwOworfTsKKworY2xhc3MgQ1hGQV9GTUJpbkV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24geworIHB1YmxpYzoKKyAgQ1hGQV9GTUJpbkV4cHJlc3Npb24odWludDMyX3QgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNX1RPS0VOIG9wLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAxLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAyKTsKKyAgfkNYRkFfRk1CaW5FeHByZXNzaW9uKCkgb3ZlcnJpZGU7CisKKyAgYm9vbCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKKworIHByb3RlY3RlZDoKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBtX3BFeHAxOworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IG1fcEV4cDI7Cit9OworCitjbGFzcyBDWEZBX0ZNQXNzaWduRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbiB7CisgcHVibGljOgorICBDWEZBX0ZNQXNzaWduRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1fVE9LRU4gb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cDIpOworICB+Q1hGQV9GTUFzc2lnbkV4cHJlc3Npb24oKSBvdmVycmlkZSB7fQorICBib29sIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOworICBib29sIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBDWEZBX0ZNTG9naWNhbE9yRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbiB7CisgcHVibGljOgorICBDWEZBX0ZNTG9naWNhbE9yRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1fVE9LRU4gb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cDIpOworICB+Q1hGQV9GTUxvZ2ljYWxPckV4cHJlc3Npb24oKSBvdmVycmlkZSB7fQorICBib29sIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOworfTsKKworY2xhc3MgQ1hGQV9GTUxvZ2ljYWxBbmRFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1CaW5FeHByZXNzaW9uIHsKKyBwdWJsaWM6CisgIENYRkFfRk1Mb2dpY2FsQW5kRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNX1RPS0VOIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cDIpOworICB+Q1hGQV9GTUxvZ2ljYWxBbmRFeHByZXNzaW9uKCkgb3ZlcnJpZGUge30KKyAgYm9vbCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKK307CisKK2NsYXNzIENYRkFfRk1FcXVhbGl0eUV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24geworIHB1YmxpYzoKKyAgQ1hGQV9GTUVxdWFsaXR5RXhwcmVzc2lvbih1aW50MzJfdCBsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GTV9UT0tFTiBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cDIpOworICB+Q1hGQV9GTUVxdWFsaXR5RXhwcmVzc2lvbigpIG92ZXJyaWRlIHt9CisgIGJvb2wgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBDWEZBX0ZNUmVsYXRpb25hbEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24geworIHB1YmxpYzoKKyAgQ1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uKHVpbnQzMl90IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1fVE9LRU4gb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMik7CisgIH5DWEZBX0ZNUmVsYXRpb25hbEV4cHJlc3Npb24oKSBvdmVycmlkZSB7fQorICBib29sIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOworfTsKKworY2xhc3MgQ1hGQV9GTUFkZGl0aXZlRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbiB7CisgcHVibGljOgorICBDWEZBX0ZNQWRkaXRpdmVFeHByZXNzaW9uKHVpbnQzMl90IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNX1RPS0VOIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMik7CisgIH5DWEZBX0ZNQWRkaXRpdmVFeHByZXNzaW9uKCkgb3ZlcnJpZGUge30KKyAgYm9vbCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKK307CisKK2NsYXNzIENYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24geworIHB1YmxpYzoKKyAgQ1hGQV9GTU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigKKyAgICAgIHVpbnQzMl90IGxpbmUsCisgICAgICBYRkFfRk1fVE9LRU4gb3AsCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAxLAorICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMik7CisgIH5DWEZBX0ZNTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkgb3ZlcnJpZGUge30KKyAgYm9vbCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKK307CisKK2NsYXNzIENYRkFfRk1Qb3NFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1VbmFyeUV4cHJlc3Npb24geworIHB1YmxpYzoKKyAgQ1hGQV9GTVBvc0V4cHJlc3Npb24odWludDMyX3QgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwKTsKKyAgfkNYRkFfRk1Qb3NFeHByZXNzaW9uKCkgb3ZlcnJpZGUge30KKyAgYm9vbCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKK307CisKK2NsYXNzIENYRkFfRk1OZWdFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1VbmFyeUV4cHJlc3Npb24geworIHB1YmxpYzoKKyAgQ1hGQV9GTU5lZ0V4cHJlc3Npb24odWludDMyX3QgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwKTsKKyAgfkNYRkFfRk1OZWdFeHByZXNzaW9uKCkgb3ZlcnJpZGUge30KKyAgYm9vbCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKK307CisKK2NsYXNzIENYRkFfRk1Ob3RFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1VbmFyeUV4cHJlc3Npb24geworIHB1YmxpYzoKKyAgQ1hGQV9GTU5vdEV4cHJlc3Npb24odWludDMyX3QgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwKTsKKyAgfkNYRkFfRk1Ob3RFeHByZXNzaW9uKCkgb3ZlcnJpZGUge30KKyAgYm9vbCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKK307CisKK2NsYXNzIENYRkFfRk1DYWxsRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNVW5hcnlFeHByZXNzaW9uIHsKKyBwdWJsaWM6CisgIENYRkFfRk1DYWxsRXhwcmVzc2lvbigKKyAgICAgIHVpbnQzMl90IGxpbmUsCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAsCisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+PiYmIHBBcmd1bWVudHMsCisgICAgICBib29sIGJJc1NvbU1ldGhvZCk7CisgIH5DWEZBX0ZNQ2FsbEV4cHJlc3Npb24oKSBvdmVycmlkZTsKKworICBib29sIElzQnVpbHRJbkZ1bmMoQ0ZYX1dpZGVUZXh0QnVmKiBmdW5jTmFtZSk7CisgIHVpbnQzMl90IElzTWV0aG9kV2l0aE9ialBhcmFtKGNvbnN0IFdpZGVTdHJpbmcmIG1ldGhvZE5hbWUpOworICBib29sIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgYm9vbCBtX2JJc1NvbU1ldGhvZDsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPj4gbV9Bcmd1bWVudHM7Cit9OworCitjbGFzcyBDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1CaW5FeHByZXNzaW9uIHsKKyBwdWJsaWM6CisgIENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24oCisgICAgICB1aW50MzJfdCBsaW5lLAorICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwQWNjZXNzb3IsCisgICAgICBYRkFfRk1fVE9LRU4gb3AsCisgICAgICBXaWRlU3RyaW5nVmlldyB3c0lkZW50aWZpZXIsCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBJbmRleEV4cCk7CisgIH5DWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uKCkgb3ZlcnJpZGU7CisgIGJvb2wgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBXaWRlU3RyaW5nVmlldyBtX3dzSWRlbnRpZmllcjsKK307CisKK2NsYXNzIENYRkFfRk1JbmRleEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbiB7CisgcHVibGljOgorICBDWEZBX0ZNSW5kZXhFeHByZXNzaW9uKHVpbnQzMl90IGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNX0FjY2Vzc29ySW5kZXggYWNjZXNzb3JJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBJbmRleEV4cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJc1N0YXJJbmRleCk7CisgIH5DWEZBX0ZNSW5kZXhFeHByZXNzaW9uKCkgb3ZlcnJpZGUge30KKyAgYm9vbCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIFhGQV9GTV9BY2Nlc3NvckluZGV4IG1fYWNjZXNzb3JJbmRleDsKKyAgYm9vbCBtX2JJc1N0YXJJbmRleDsKK307CisKK2NsYXNzIENYRkFfRk1Eb3REb3RBY2Nlc3NvckV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24geworIHB1YmxpYzoKKyAgQ1hGQV9GTURvdERvdEFjY2Vzc29yRXhwcmVzc2lvbigKKyAgICAgIHVpbnQzMl90IGxpbmUsCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBBY2Nlc3NvciwKKyAgICAgIFhGQV9GTV9UT0tFTiBvcCwKKyAgICAgIFdpZGVTdHJpbmdWaWV3IHdzSWRlbnRpZmllciwKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEluZGV4RXhwKTsKKyAgfkNYRkFfRk1Eb3REb3RBY2Nlc3NvckV4cHJlc3Npb24oKSBvdmVycmlkZTsKKworICBib29sIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgV2lkZVN0cmluZ1ZpZXcgbV93c0lkZW50aWZpZXI7Cit9OworCitjbGFzcyBDWEZBX0ZNTWV0aG9kQ2FsbEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24geworIHB1YmxpYzoKKyAgQ1hGQV9GTU1ldGhvZENhbGxFeHByZXNzaW9uKAorICAgICAgdWludDMyX3QgbGluZSwKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEFjY2Vzc29yRXhwMSwKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcENhbGxFeHApOworICB+Q1hGQV9GTU1ldGhvZENhbGxFeHByZXNzaW9uKCkgb3ZlcnJpZGUge30KKyAgYm9vbCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKK307CisKK2Jvb2wgQ1hGQV9Jc1Rvb0JpZyhjb25zdCBDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOworCisjZW5kaWYgIC8vIFhGQV9GWEZBX0ZNMkpTX0NYRkFfRk1TSU1QTEVFWFBSRVNTSU9OX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9mbTJqcy9jeGZhX2Ztc2ltcGxlZXhwcmVzc2lvbl91bml0dGVzdC5jcHAgYi94ZmEvZnhmYS9mbTJqcy9jeGZhX2Ztc2ltcGxlZXhwcmVzc2lvbl91bml0dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZjY2I3MQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL2ZtMmpzL2N4ZmFfZm1zaW1wbGVleHByZXNzaW9uX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDg0IEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9mbTJqcy9jeGZhX2Ztc2ltcGxlZXhwcmVzc2lvbi5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF93aWRldGV4dGJ1Zi5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy90ZXN0X3N1cHBvcnQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvZm0yanMvY3hmYV9mbWxleGVyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvZm0yanMvY3hmYV9mbXRvamF2YXNjcmlwdGRlcHRoLmgiCisKK1RFU1QoRk1DYWxsRXhwcmVzc2lvblRlc3QsIG1vcmVfdGhhbl8zMl9hcmd1bWVudHMpIHsKKyAgLy8gVXNlIHNpZ24gYXMgaXQgaGFzIDMgb2JqZWN0IHBhcmFtZXRlcnMgYXQgcG9zaXRpb25zIDAsIDUsIGFuZCA2LgorICBhdXRvIGV4cCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNSWRlbnRpZmllckV4cHJlc3Npb24+KDAsIEwic2lnbiIpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4+IGFyZ3M7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNTA7IGkrKykKKyAgICBhcmdzLnB1c2hfYmFjayhwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+KDAsIFRPS25hbikpOworCisgIENYRkFfRk1Ub0phdmFTY3JpcHREZXB0aDo6UmVzZXQoKTsKKyAgQ1hGQV9GTUNhbGxFeHByZXNzaW9uIGNhbGxFeHAoMCwgc3RkOjptb3ZlKGV4cCksIHN0ZDo6bW92ZShhcmdzKSwgdHJ1ZSk7CisgIENGWF9XaWRlVGV4dEJ1ZiBqczsKKyAgY2FsbEV4cC5Ub0phdmFTY3JpcHQoanMpOworCisgIC8vIEdlbmVyYXRlIHRoZSByZXN1bHQgamF2YXNjcmlwdCBzdHJpbmcuCisgIFdpZGVTdHJpbmcgcmVzdWx0ID0gTCJzaWduKCI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNTA7IGkrKykgeworICAgIGlmIChpID4gMCkKKyAgICAgIHJlc3VsdCArPSBMIiwgIjsKKworICAgIHJlc3VsdCArPSBMInBmbV9ydC5nZXRfIjsKKyAgICAvLyBPYmplY3QgcG9zaXRpb25zIGZvciBzaWduKCkgbWV0aG9kLgorICAgIGlmIChpID09IDAgfHwgaSA9PSA1IHx8IGkgPT0gNikKKyAgICAgIHJlc3VsdCArPSBMImpzb2JqKCkiOworICAgIGVsc2UKKyAgICAgIHJlc3VsdCArPSBMInZhbCgpIjsKKyAgfQorICByZXN1bHQgKz0gTCIpIjsKKworICBFWFBFQ1RfRVEocmVzdWx0LkFzU3RyaW5nVmlldygpLCBqcy5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKK1RFU1QoRk1TdHJpbmdFeHByZXNzaW9uVGVzdCwgRW1wdHkpIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoOjpSZXNldCgpOworICBDRlhfV2lkZVRleHRCdWYgYWNjdW11bGF0b3I7CisgIENYRkFfRk1TdHJpbmdFeHByZXNzaW9uKDEsIFdpZGVTdHJpbmdWaWV3KCkpLlRvSmF2YVNjcmlwdChhY2N1bXVsYXRvcik7CisgIEVYUEVDVF9FUShMIiIsIGFjY3VtdWxhdG9yLkFzU3RyaW5nVmlldygpKTsKK30KKworVEVTVChGTVN0cmluZ0V4cHJlc3Npb25UZXN0LCBTaG9ydCkgeworICBDWEZBX0ZNVG9KYXZhU2NyaXB0RGVwdGg6OlJlc2V0KCk7CisgIENGWF9XaWRlVGV4dEJ1ZiBhY2N1bXVsYXRvcjsKKyAgQ1hGQV9GTVN0cmluZ0V4cHJlc3Npb24oMSwgTCJhIikuVG9KYXZhU2NyaXB0KGFjY3VtdWxhdG9yKTsKKyAgRVhQRUNUX0VRKEwiYSIsIGFjY3VtdWxhdG9yLkFzU3RyaW5nVmlldygpKTsKK30KKworVEVTVChGTVN0cmluZ0V4cHJlc3Npb25UZXN0LCBNZWRpdW0pIHsKKyAgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoOjpSZXNldCgpOworICBDRlhfV2lkZVRleHRCdWYgYWNjdW11bGF0b3I7CisgIENYRkFfRk1TdHJpbmdFeHByZXNzaW9uKDEsIEwiLmFiY2QuIikuVG9KYXZhU2NyaXB0KGFjY3VtdWxhdG9yKTsKKyAgRVhQRUNUX0VRKEwiXCJhYmNkXCIiLCBhY2N1bXVsYXRvci5Bc1N0cmluZ1ZpZXcoKSk7Cit9CisKK1RFU1QoRk1TdHJpbmdFeHByZXNzaW9uVGVzdCwgTG9uZykgeworICBDWEZBX0ZNVG9KYXZhU2NyaXB0RGVwdGg6OlJlc2V0KCk7CisgIENGWF9XaWRlVGV4dEJ1ZiBhY2N1bXVsYXRvcjsKKyAgc3RkOjp2ZWN0b3I8V2lkZVN0cmluZ1ZpZXc6OlVuc2lnbmVkVHlwZT4gdmVjKDE0MDAwMCwgTCdBJyk7CisgIENYRkFfRk1TdHJpbmdFeHByZXNzaW9uKDEsIFdpZGVTdHJpbmdWaWV3KHZlYykpLlRvSmF2YVNjcmlwdChhY2N1bXVsYXRvcik7CisgIEVYUEVDVF9FUSgxNDAwMDB1LCBhY2N1bXVsYXRvci5HZXRMZW5ndGgoKSk7Cit9CisKK1RFU1QoRk1TdHJpbmdFeHByZXNzaW9uVGVzdCwgUXVvdGVkKSB7CisgIENYRkFfRk1Ub0phdmFTY3JpcHREZXB0aDo6UmVzZXQoKTsKKyAgQ0ZYX1dpZGVUZXh0QnVmIGFjY3VtdWxhdG9yOworICBDWEZBX0ZNU3RyaW5nRXhwcmVzc2lvbigxLCBMIi5TaW1vbiBzYXlzIFwiXCJydW5cIlwiLiIpCisgICAgICAuVG9KYXZhU2NyaXB0KGFjY3VtdWxhdG9yKTsKKyAgRVhQRUNUX0VRKEwiXCJTaW1vbiBzYXlzIFxcXCJydW5cXFwiXCIiLCBhY2N1bXVsYXRvci5Bc1N0cmluZ1ZpZXcoKSk7Cit9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9mbTJqcy9jeGZhX2ZtdG9qYXZhc2NyaXB0ZGVwdGguY3BwIGIveGZhL2Z4ZmEvZm0yanMvY3hmYV9mbXRvamF2YXNjcmlwdGRlcHRoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzEyYmE2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvZm0yanMvY3hmYV9mbXRvamF2YXNjcmlwdGRlcHRoLmNwcApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9mbTJqcy9jeGZhX2ZtdG9qYXZhc2NyaXB0ZGVwdGguaCIKKworbmFtZXNwYWNlIHsKKworLy8gQXJiaXRhcmlseSBwaWNrZWQgYnkgbG9va2luZyBhdCBob3cgZGVlcCBhIHRyYW5zbGF0aW9uIGdvdCBiZWZvcmUgaGl0dGluZworLy8gdGhlIGdldHRpbmcgZnV6emVyIG1lbW9yeSBsaW1pdHMuIFNob3VsZCBiZSBsYXJnZXIgdGhlbiB8a01heFBhcnNlRGVwdGh8IGluCisvLyBjeGZhX2ZtcGFyc2VyLmNwcC4KK2NvbnN0IHVuc2lnbmVkIGludCBrTWF4RGVwdGggPSA1MDAwOworCit9ICAvLyBuYW1lc3BhY2UKKwordW5zaWduZWQgbG9uZyBDWEZBX0ZNVG9KYXZhU2NyaXB0RGVwdGg6OmRlcHRoXyA9IDA7Cit1bnNpZ25lZCBsb25nIENYRkFfRk1Ub0phdmFTY3JpcHREZXB0aDo6bWF4X2RlcHRoXyA9IGtNYXhEZXB0aDsKKwordm9pZCBDWEZBX0ZNVG9KYXZhU2NyaXB0RGVwdGg6OlJlc2V0KCkgeworICBkZXB0aF8gPSAwOworfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvZm0yanMvY3hmYV9mbXRvamF2YXNjcmlwdGRlcHRoLmggYi94ZmEvZnhmYS9mbTJqcy9jeGZhX2ZtdG9qYXZhc2NyaXB0ZGVwdGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGY4N2E2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvZm0yanMvY3hmYV9mbXRvamF2YXNjcmlwdGRlcHRoLmgKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIFhGQV9GWEZBX0ZNMkpTX0NYRkFfRk1UT0pBVkFTQ1JJUFRERVBUSF9IXworI2RlZmluZSBYRkFfRlhGQV9GTTJKU19DWEZBX0ZNVE9KQVZBU0NSSVBUREVQVEhfSF8KKworY2xhc3MgQ1hGQV9GTVRvSmF2YVNjcmlwdERlcHRoIHsKKyBwdWJsaWM6CisgIENYRkFfRk1Ub0phdmFTY3JpcHREZXB0aCgpIHsgZGVwdGhfKys7IH0KKyAgfkNYRkFfRk1Ub0phdmFTY3JpcHREZXB0aCgpIHsgZGVwdGhfLS07IH0KKworICBib29sIElzV2l0aGluTWF4RGVwdGgoKSBjb25zdCB7IHJldHVybiBkZXB0aF8gPD0gbWF4X2RlcHRoXzsgfQorCisgIHN0YXRpYyB2b2lkIFJlc2V0KCk7CisKKyBwcml2YXRlOgorICBzdGF0aWMgdW5zaWduZWQgbG9uZyBkZXB0aF87CisgIHN0YXRpYyB1bnNpZ25lZCBsb25nIG1heF9kZXB0aF87Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX0ZNMkpTX0NYRkFfRk1UT0pBVkFTQ1JJUFRERVBUSF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvZm0yanMveGZhX2Vycm9yLmNwcCBiL3hmYS9meGZhL2ZtMmpzL3hmYV9lcnJvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMGQ5YmMuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvZm0yanMveGZhX2Vycm9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL2ZtMmpzL3hmYV9lcnJvci5oIgotCi1jb25zdCBGWF9XQ0hBUiBrRk1FcnJVbnN1cHBvcnRlZENoYXJbXSA9IEwidW5zdXBwb3J0ZWQgY2hhciAnJWMnIjsKLWNvbnN0IEZYX1dDSEFSIGtGTUVyckJhZFN1ZmZpeE51bWJlcltdID0gTCJiYWQgc3VmZml4IG9uIG51bWJlciI7Ci1jb25zdCBGWF9XQ0hBUiBrRk1FcnJFeHBlY3RlZElkZW50aWZpZXJbXSA9Ci0gICAgTCJleHBlY3RlZCBpZGVudGlmaWVyIGluc3RlYWQgb2YgJyVzJyI7Ci1jb25zdCBGWF9XQ0hBUiBrRk1FcnJFeHBlY3RlZFRva2VuW10gPSBMImV4cGVjdGVkICclcycgaW5zdGVhZCBvZiAnJXMnIjsKLWNvbnN0IEZYX1dDSEFSIGtGTUVyckV4cGVjdGVkRW5kSWZbXSA9IEwiZXhwZWN0ZWQgJ2VuZGlmJyBpbnN0ZWFkIG9mICclcyciOwotY29uc3QgRlhfV0NIQVIga0ZNRXJyVW5leHBlY3RlZEV4cHJlc3Npb25bXSA9IEwidW5leHBlY3RlZCBleHByZXNzaW9uICclcyciOwotY29uc3QgRlhfV0NIQVIga0ZNRXJyRXhwZWN0ZWROb25FbXB0eUV4cHJlc3Npb25bXSA9Ci0gICAgTCJleHBlY3RlZCBub24tZW1wdHkgZXhwcmVzc2lvbiI7CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9mbTJqcy94ZmFfZXJyb3IuaCBiL3hmYS9meGZhL2ZtMmpzL3hmYV9lcnJvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTNmYmJlLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2ZtMmpzL3hmYV9lcnJvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEZBX0ZNMkpTX1hGQV9FUlJPUl9IXwotI2RlZmluZSBYRkFfRlhGQV9GTTJKU19YRkFfRVJST1JfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLQotZXh0ZXJuIGNvbnN0IEZYX1dDSEFSIGtGTUVyclVuc3VwcG9ydGVkQ2hhcltdOwotZXh0ZXJuIGNvbnN0IEZYX1dDSEFSIGtGTUVyckJhZFN1ZmZpeE51bWJlcltdOwotZXh0ZXJuIGNvbnN0IEZYX1dDSEFSIGtGTUVyckV4cGVjdGVkSWRlbnRpZmllcltdOwotZXh0ZXJuIGNvbnN0IEZYX1dDSEFSIGtGTUVyckV4cGVjdGVkVG9rZW5bXTsKLWV4dGVybiBjb25zdCBGWF9XQ0hBUiBrRk1FcnJFeHBlY3RlZEVuZElmW107Ci1leHRlcm4gY29uc3QgRlhfV0NIQVIga0ZNRXJyVW5leHBlY3RlZEV4cHJlc3Npb25bXTsKLWV4dGVybiBjb25zdCBGWF9XQ0hBUiBrRk1FcnJFeHBlY3RlZE5vbkVtcHR5RXhwcmVzc2lvbltdOwotCi1jbGFzcyBDWEZBX0ZNRXJyb3JJbmZvIHsKLSBwdWJsaWM6Ci0gIENYRkFfRk1FcnJvckluZm8oKSA6IGxpbmVudW0oMCkge30KLSAgfkNYRkFfRk1FcnJvckluZm8oKSB7fQotICB1aW50MzJfdCBsaW5lbnVtOwotICBDRlhfV2lkZVN0cmluZyBtZXNzYWdlOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhGQV9GTTJKU19YRkFfRVJST1JfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2ZtMmpzL3hmYV9leHByZXNzaW9uLmNwcCBiL3hmYS9meGZhL2ZtMmpzL3hmYV9leHByZXNzaW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJkYjZkMi4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9mbTJqcy94ZmFfZXhwcmVzc2lvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OTYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvZm0yanMveGZhX2V4cHJlc3Npb24uaCIKLQotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Jhc2ljLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IEZYX1dDSEFSIFJVTlRJTUVCTE9DS1RFTVBBUlJBWVtdID0KLSAgICBMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lX2Jsb2NrX3RlbXBfYXJyYXkiOwotCi1jb25zdCBGWF9XQ0hBUiBSVU5USU1FQkxPQ0tURU1QQVJSQVlJTkRFWFtdID0KLSAgICBMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lX2Jsb2NrX3RlbXBfYXJyYXlfaW5kZXgiOwotCi19ICAvLyBuYW1lc3BhY2UKLQotQ1hGQV9GTUV4cHJlc3Npb246OkNYRkFfRk1FeHByZXNzaW9uKHVpbnQzMl90IGxpbmUpCi0gICAgOiBtX3R5cGUoWEZBX0ZNX0VYUFRZUEVfVU5LTk9XTiksIG1fbGluZShsaW5lKSB7fQotCi1DWEZBX0ZNRXhwcmVzc2lvbjo6Q1hGQV9GTUV4cHJlc3Npb24odWludDMyX3QgbGluZSwgWEZBX0ZNX0VYUFRZUEUgdHlwZSkKLSAgICA6IG1fdHlwZSh0eXBlKSwgbV9saW5lKGxpbmUpIHt9Ci0KLXZvaWQgQ1hGQV9GTUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHt9Ci0KLXZvaWQgQ1hGQV9GTUV4cHJlc3Npb246OlRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkge30KLQotQ1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbjo6Q1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbigKLSAgICB1aW50MzJfdCBsaW5lLAotICAgIGJvb2wgaXNHbG9iYWwsCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsCi0gICAgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmdDPiYmIGFyZ3VtZW50cywKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+PiYmIGV4cHJlc3Npb25zKQotICAgIDogQ1hGQV9GTUV4cHJlc3Npb24obGluZSwgWEZBX0ZNX0VYUFRZUEVfRlVOQyksCi0gICAgICBtX3dzTmFtZSh3c05hbWUpLAotICAgICAgbV9wQXJndW1lbnRzKHN0ZDo6bW92ZShhcmd1bWVudHMpKSwKLSAgICAgIG1fcEV4cHJlc3Npb25zKHN0ZDo6bW92ZShleHByZXNzaW9ucykpLAotICAgICAgbV9pc0dsb2JhbChpc0dsb2JhbCkge30KLQotQ1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbjo6fkNYRkFfRk1GdW5jdGlvbkRlZmluaXRpb24oKSB7fQotCi12b2lkIENYRkFfRk1GdW5jdGlvbkRlZmluaXRpb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKLSAgaWYgKG1faXNHbG9iYWwgJiYgbV9wRXhwcmVzc2lvbnMuZW1wdHkoKSkgewotICAgIGphdmFzY3JpcHQgPDwgTCIvLyBjb21tZW50cyBvbmx5IjsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKG1faXNHbG9iYWwpIHsKLSAgICBqYXZhc2NyaXB0IDw8IEwiKFxuIjsKLSAgfQotICBqYXZhc2NyaXB0IDw8IEwiZnVuY3Rpb24gIjsKLSAgaWYgKG1fd3NOYW1lLkdldEF0KDApID09IEwnIScpIHsKLSAgICBDRlhfV2lkZVN0cmluZyB0ZW1wTmFtZSA9IEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKyBtX3dzTmFtZS5NaWQoMSk7Ci0gICAgamF2YXNjcmlwdCA8PCB0ZW1wTmFtZTsKLSAgfSBlbHNlIHsKLSAgICBqYXZhc2NyaXB0IDw8IG1fd3NOYW1lOwotICB9Ci0gIGphdmFzY3JpcHQgPDwgTCIoIjsKLSAgYm9vbCBiTmVlZENvbW1hID0gZmFsc2U7Ci0gIGZvciAoY29uc3QgYXV0byYgaWRlbnRpZmllciA6IG1fcEFyZ3VtZW50cykgewotICAgIGlmIChiTmVlZENvbW1hKQotICAgICAgamF2YXNjcmlwdCA8PCBMIiwgIjsKLSAgICBpZiAoaWRlbnRpZmllci5HZXRBdCgwKSA9PSBMJyEnKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB0ZW1wSWRlbnRpZmllciA9Ci0gICAgICAgICAgRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiArIGlkZW50aWZpZXIuTWlkKDEpOwotICAgICAgamF2YXNjcmlwdCA8PCB0ZW1wSWRlbnRpZmllcjsKLSAgICB9IGVsc2UgewotICAgICAgamF2YXNjcmlwdCA8PCBpZGVudGlmaWVyOwotICAgIH0KLSAgICBiTmVlZENvbW1hID0gdHJ1ZTsKLSAgfQotICBqYXZhc2NyaXB0IDw8IEwiKVxue1xuIjsKLSAgamF2YXNjcmlwdCA8PCBMInZhciAiOwotICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOwotICBqYXZhc2NyaXB0IDw8IEwiID0gbnVsbDtcbiI7Ci0gIGZvciAoY29uc3QgYXV0byYgZXhwciA6IG1fcEV4cHJlc3Npb25zKSB7Ci0gICAgaWYgKGV4cHIgPT0gbV9wRXhwcmVzc2lvbnMuYmFjaygpKQotICAgICAgZXhwci0+VG9JbXBsaWVkUmV0dXJuSlMoamF2YXNjcmlwdCk7Ci0gICAgZWxzZQotICAgICAgZXhwci0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICB9Ci0gIGphdmFzY3JpcHQgPDwgTCJyZXR1cm4gIjsKLSAgaWYgKG1faXNHbG9iYWwpIHsKLSAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoR0VURk1WQUxVRSk7Ci0gICAgamF2YXNjcmlwdCA8PCBMIigiOwotICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7Ci0gICAgamF2YXNjcmlwdCA8PCBMIikiOwotICB9IGVsc2UgewotICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7Ci0gIH0KLSAgamF2YXNjcmlwdCA8PCBMIjtcbn1cbiI7Ci0gIGlmIChtX2lzR2xvYmFsKSB7Ci0gICAgamF2YXNjcmlwdCA8PCBMIikuY2FsbCh0aGlzKTtcbiI7Ci0gIH0KLX0KLQotdm9pZCBDWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKSB7fQotCi1DWEZBX0ZNVmFyRXhwcmVzc2lvbjo6Q1hGQV9GTVZhckV4cHJlc3Npb24oCi0gICAgdWludDMyX3QgbGluZSwKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IHBJbml0KQotICAgIDogQ1hGQV9GTUV4cHJlc3Npb24obGluZSwgWEZBX0ZNX0VYUFRZUEVfVkFSKSwKLSAgICAgIG1fd3NOYW1lKHdzTmFtZSksCi0gICAgICBtX3BJbml0KHN0ZDo6bW92ZShwSW5pdCkpIHt9Ci0KLUNYRkFfRk1WYXJFeHByZXNzaW9uOjp+Q1hGQV9GTVZhckV4cHJlc3Npb24oKSB7fQotCi12b2lkIENYRkFfRk1WYXJFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7Ci0gIGphdmFzY3JpcHQgPDwgTCJ2YXIgIjsKLSAgQ0ZYX1dpZGVTdHJpbmcgdGVtcE5hbWUobV93c05hbWUpOwotICBpZiAobV93c05hbWUuR2V0QXQoMCkgPT0gTCchJykgewotICAgIHRlbXBOYW1lID0gRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiArIG1fd3NOYW1lLk1pZCgxKTsKLSAgfQotICBqYXZhc2NyaXB0IDw8IHRlbXBOYW1lOwotICBqYXZhc2NyaXB0IDw8IEwiID0gIjsKLSAgaWYgKG1fcEluaXQpIHsKLSAgICBtX3BJbml0LT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gICAgamF2YXNjcmlwdCA8PCB0ZW1wTmFtZTsKLSAgICBqYXZhc2NyaXB0IDw8IEwiID0gIjsKLSAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoVkFSRklMVEVSKTsKLSAgICBqYXZhc2NyaXB0IDw8IEwiKCI7Ci0gICAgamF2YXNjcmlwdCA8PCB0ZW1wTmFtZTsKLSAgICBqYXZhc2NyaXB0IDw8IEwiKTtcbiI7Ci0gIH0gZWxzZSB7Ci0gICAgamF2YXNjcmlwdCA8PCBMIlwiXCI7XG4iOwotICB9Ci19Ci0KLXZvaWQgQ1hGQV9GTVZhckV4cHJlc3Npb246OlRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgewotICBqYXZhc2NyaXB0IDw8IEwidmFyICI7Ci0gIENGWF9XaWRlU3RyaW5nIHRlbXBOYW1lKG1fd3NOYW1lKTsKLSAgaWYgKG1fd3NOYW1lLkdldEF0KDApID09IEwnIScpIHsKLSAgICB0ZW1wTmFtZSA9IEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKyBtX3dzTmFtZS5NaWQoMSk7Ci0gIH0KLSAgamF2YXNjcmlwdCA8PCB0ZW1wTmFtZTsKLSAgamF2YXNjcmlwdCA8PCBMIiA9ICI7Ci0gIGlmIChtX3BJbml0KSB7Ci0gICAgbV9wSW5pdC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICAgIGphdmFzY3JpcHQgPDwgdGVtcE5hbWU7Ci0gICAgamF2YXNjcmlwdCA8PCBMIiA9ICI7Ci0gICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKFZBUkZJTFRFUik7Ci0gICAgamF2YXNjcmlwdCA8PCBMIigiOwotICAgIGphdmFzY3JpcHQgPDwgdGVtcE5hbWU7Ci0gICAgamF2YXNjcmlwdCA8PCBMIik7XG4iOwotICB9IGVsc2UgewotICAgIGphdmFzY3JpcHQgPDwgTCJcIlwiO1xuIjsKLSAgfQotICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOwotICBqYXZhc2NyaXB0IDw8IEwiID0gIjsKLSAgamF2YXNjcmlwdCA8PCB0ZW1wTmFtZTsKLSAgamF2YXNjcmlwdCA8PCBMIjtcbiI7Ci19Ci0KLUNYRkFfRk1FeHBFeHByZXNzaW9uOjpDWEZBX0ZNRXhwRXhwcmVzc2lvbigKLSAgICB1aW50MzJfdCBsaW5lLAotICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cHJlc3Npb24pCi0gICAgOiBDWEZBX0ZNRXhwcmVzc2lvbihsaW5lLCBYRkFfRk1fRVhQVFlQRV9FWFApLAotICAgICAgbV9wRXhwcmVzc2lvbihzdGQ6Om1vdmUocEV4cHJlc3Npb24pKSB7fQotCi1DWEZBX0ZNRXhwRXhwcmVzc2lvbjo6fkNYRkFfRk1FeHBFeHByZXNzaW9uKCkge30KLQotdm9pZCBDWEZBX0ZNRXhwRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgewotICBpZiAobV9wRXhwcmVzc2lvbi0+R2V0T3BlcmF0b3JUb2tlbigpID09IFRPS2Fzc2lnbikgewotICAgIG1fcEV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsKLSAgfSBlbHNlIHsKLSAgICBtX3BFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gICAgamF2YXNjcmlwdCA8PCBMIjtcbiI7Ci0gIH0KLX0KLQotdm9pZCBDWEZBX0ZNRXhwRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7Ci0gIGlmIChtX3BFeHByZXNzaW9uLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LYXNzaWduKSB7Ci0gICAgbV9wRXhwcmVzc2lvbi0+VG9JbXBsaWVkUmV0dXJuSlMoamF2YXNjcmlwdCk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKG1fcEV4cHJlc3Npb24tPkdldE9wZXJhdG9yVG9rZW4oKSA9PSBUT0tzdGFyIHx8Ci0gICAgICAgIG1fcEV4cHJlc3Npb24tPkdldE9wZXJhdG9yVG9rZW4oKSA9PSBUT0tkb3RzdGFyIHx8Ci0gICAgICAgIG1fcEV4cHJlc3Npb24tPkdldE9wZXJhdG9yVG9rZW4oKSA9PSBUT0tkb3RzY3JlYW0gfHwKLSAgICAgICAgbV9wRXhwcmVzc2lvbi0+R2V0T3BlcmF0b3JUb2tlbigpID09IFRPS2RvdGRvdCB8fAotICAgICAgICBtX3BFeHByZXNzaW9uLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LZG90KSB7Ci0gICAgICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOwotICAgICAgamF2YXNjcmlwdCA8PCBMIiA9ICI7Ci0gICAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoR0VURk1WQUxVRSk7Ci0gICAgICBqYXZhc2NyaXB0IDw8IEwiKCI7Ci0gICAgICBtX3BFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gICAgICBqYXZhc2NyaXB0IDw8IEwiKTtcbiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7Ci0gICAgICBqYXZhc2NyaXB0IDw8IEwiID0gIjsKLSAgICAgIG1fcEV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsKLSAgICAgIGphdmFzY3JpcHQgPDwgTCI7XG4iOwotICAgIH0KLSAgfQotfQotCi1DWEZBX0ZNQmxvY2tFeHByZXNzaW9uOjpDWEZBX0ZNQmxvY2tFeHByZXNzaW9uKAotICAgIHVpbnQzMl90IGxpbmUsCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPj4mJiBwRXhwcmVzc2lvbkxpc3QpCi0gICAgOiBDWEZBX0ZNRXhwcmVzc2lvbihsaW5lLCBYRkFfRk1fRVhQVFlQRV9CTE9DSyksCi0gICAgICBtX0V4cHJlc3Npb25MaXN0KHN0ZDo6bW92ZShwRXhwcmVzc2lvbkxpc3QpKSB7fQotCi1DWEZBX0ZNQmxvY2tFeHByZXNzaW9uOjp+Q1hGQV9GTUJsb2NrRXhwcmVzc2lvbigpIHt9Ci0KLXZvaWQgQ1hGQV9GTUJsb2NrRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgewotICBqYXZhc2NyaXB0IDw8IEwie1xuIjsKLSAgZm9yIChjb25zdCBhdXRvJiBleHByIDogbV9FeHByZXNzaW9uTGlzdCkKLSAgICBleHByLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gIGphdmFzY3JpcHQgPDwgTCJ9XG4iOwotfQotCi12b2lkIENYRkFfRk1CbG9ja0V4cHJlc3Npb246OlRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgewotICBqYXZhc2NyaXB0IDw8IEwie1xuIjsKLSAgZm9yIChjb25zdCBhdXRvJiBleHByIDogbV9FeHByZXNzaW9uTGlzdCkgewotICAgIGlmIChleHByID09IG1fRXhwcmVzc2lvbkxpc3QuYmFjaygpKQotICAgICAgZXhwci0+VG9JbXBsaWVkUmV0dXJuSlMoamF2YXNjcmlwdCk7Ci0gICAgZWxzZQotICAgICAgZXhwci0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICB9Ci0gIGphdmFzY3JpcHQgPDwgTCJ9XG4iOwotfQotCi1DWEZBX0ZNRG9FeHByZXNzaW9uOjpDWEZBX0ZNRG9FeHByZXNzaW9uKAotICAgIHVpbnQzMl90IGxpbmUsCi0gICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBwTGlzdCkKLSAgICA6IENYRkFfRk1FeHByZXNzaW9uKGxpbmUpLCBtX3BMaXN0KHN0ZDo6bW92ZShwTGlzdCkpIHt9Ci0KLUNYRkFfRk1Eb0V4cHJlc3Npb246On5DWEZBX0ZNRG9FeHByZXNzaW9uKCkge30KLQotdm9pZCBDWEZBX0ZNRG9FeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7Ci0gIG1fcExpc3QtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsKLX0KLQotdm9pZCBDWEZBX0ZNRG9FeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKLSAgbV9wTGlzdC0+VG9JbXBsaWVkUmV0dXJuSlMoamF2YXNjcmlwdCk7Ci19Ci0KLUNYRkFfRk1JZkV4cHJlc3Npb246OkNYRkFfRk1JZkV4cHJlc3Npb24oCi0gICAgdWludDMyX3QgbGluZSwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHByZXNzaW9uLAotICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gcElmRXhwcmVzc2lvbiwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IHBFbHNlRXhwcmVzc2lvbikKLSAgICA6IENYRkFfRk1FeHByZXNzaW9uKGxpbmUsIFhGQV9GTV9FWFBUWVBFX0lGKSwKLSAgICAgIG1fcEV4cHJlc3Npb24oc3RkOjptb3ZlKHBFeHByZXNzaW9uKSksCi0gICAgICBtX3BJZkV4cHJlc3Npb24oc3RkOjptb3ZlKHBJZkV4cHJlc3Npb24pKSwKLSAgICAgIG1fcEVsc2VFeHByZXNzaW9uKHN0ZDo6bW92ZShwRWxzZUV4cHJlc3Npb24pKSB7fQotCi1DWEZBX0ZNSWZFeHByZXNzaW9uOjp+Q1hGQV9GTUlmRXhwcmVzc2lvbigpIHt9Ci0KLXZvaWQgQ1hGQV9GTUlmRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgewotICBqYXZhc2NyaXB0IDw8IEwiaWYgKCI7Ci0gIGlmIChtX3BFeHByZXNzaW9uKSB7Ci0gICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKEdFVEZNVkFMVUUpOwotICAgIGphdmFzY3JpcHQgPDwgTCIoIjsKLSAgICBtX3BFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gICAgamF2YXNjcmlwdCA8PCBMIikiOwotICB9Ci0gIGphdmFzY3JpcHQgPDwgTCIpXG4iOwotICBpZiAobV9wSWZFeHByZXNzaW9uKSB7Ci0gICAgbV9wSWZFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gIH0KLSAgaWYgKG1fcEVsc2VFeHByZXNzaW9uKSB7Ci0gICAgaWYgKG1fcEVsc2VFeHByZXNzaW9uLT5HZXRFeHBUeXBlKCkgPT0gWEZBX0ZNX0VYUFRZUEVfSUYpIHsKLSAgICAgIGphdmFzY3JpcHQgPDwgTCJlbHNlXG4iOwotICAgICAgamF2YXNjcmlwdCA8PCBMIntcbiI7Ci0gICAgICBtX3BFbHNlRXhwcmVzc2lvbi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICAgICAgamF2YXNjcmlwdCA8PCBMIn1cbiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGphdmFzY3JpcHQgPDwgTCJlbHNlXG4iOwotICAgICAgbV9wRWxzZUV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDWEZBX0ZNSWZFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKLSAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsKLSAgamF2YXNjcmlwdCA8PCBMIiA9IDA7XG4iOwotICBqYXZhc2NyaXB0IDw8IEwiaWYgKCI7Ci0gIGlmIChtX3BFeHByZXNzaW9uKSB7Ci0gICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKEdFVEZNVkFMVUUpOwotICAgIGphdmFzY3JpcHQgPDwgTCIoIjsKLSAgICBtX3BFeHByZXNzaW9uLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gICAgamF2YXNjcmlwdCA8PCBMIikiOwotICB9Ci0gIGphdmFzY3JpcHQgPDwgTCIpXG4iOwotICBpZiAobV9wSWZFeHByZXNzaW9uKSB7Ci0gICAgbV9wSWZFeHByZXNzaW9uLT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KTsKLSAgfQotICBpZiAobV9wRWxzZUV4cHJlc3Npb24pIHsKLSAgICBpZiAobV9wRWxzZUV4cHJlc3Npb24tPkdldEV4cFR5cGUoKSA9PSBYRkFfRk1fRVhQVFlQRV9JRikgewotICAgICAgamF2YXNjcmlwdCA8PCBMImVsc2VcbiI7Ci0gICAgICBqYXZhc2NyaXB0IDw8IEwie1xuIjsKLSAgICAgIG1fcEVsc2VFeHByZXNzaW9uLT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KTsKLSAgICAgIGphdmFzY3JpcHQgPDwgTCJ9XG4iOwotICAgIH0gZWxzZSB7Ci0gICAgICBqYXZhc2NyaXB0IDw8IEwiZWxzZVxuIjsKLSAgICAgIG1fcEVsc2VFeHByZXNzaW9uLT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KTsKLSAgICB9Ci0gIH0KLX0KLQotQ1hGQV9GTUxvb3BFeHByZXNzaW9uOjp+Q1hGQV9GTUxvb3BFeHByZXNzaW9uKCkge30KLQotdm9pZCBDWEZBX0ZNTG9vcEV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHt9Ci0KLXZvaWQgQ1hGQV9GTUxvb3BFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKSB7fQotCi1DWEZBX0ZNV2hpbGVFeHByZXNzaW9uOjpDWEZBX0ZNV2hpbGVFeHByZXNzaW9uKAotICAgIHVpbnQzMl90IGxpbmUsCi0gICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwQ29uZGl0aW9uLAotICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gcEV4cHJlc3Npb24pCi0gICAgOiBDWEZBX0ZNTG9vcEV4cHJlc3Npb24obGluZSksCi0gICAgICBtX3BDb25kaXRpb24oc3RkOjptb3ZlKHBDb25kaXRpb24pKSwKLSAgICAgIG1fcEV4cHJlc3Npb24oc3RkOjptb3ZlKHBFeHByZXNzaW9uKSkge30KLQotQ1hGQV9GTVdoaWxlRXhwcmVzc2lvbjo6fkNYRkFfRk1XaGlsZUV4cHJlc3Npb24oKSB7fQotCi12b2lkIENYRkFfRk1XaGlsZUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKLSAgamF2YXNjcmlwdCA8PCBMIndoaWxlICgiOwotICBtX3BDb25kaXRpb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsKLSAgamF2YXNjcmlwdCA8PCBMIilcbiI7Ci0gIG1fcEV4cHJlc3Npb24tPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsKLX0KLQotdm9pZCBDWEZBX0ZNV2hpbGVFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKLSAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsKLSAgamF2YXNjcmlwdCA8PCBMIiA9IDA7XG4iOwotICBqYXZhc2NyaXB0IDw8IEwid2hpbGUgKCI7Ci0gIG1fcENvbmRpdGlvbi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICBqYXZhc2NyaXB0IDw8IEwiKVxuIjsKLSAgbV9wRXhwcmVzc2lvbi0+VG9JbXBsaWVkUmV0dXJuSlMoamF2YXNjcmlwdCk7Ci19Ci0KLUNYRkFfRk1CcmVha0V4cHJlc3Npb246OkNYRkFfRk1CcmVha0V4cHJlc3Npb24odWludDMyX3QgbGluZSkKLSAgICA6IENYRkFfRk1FeHByZXNzaW9uKGxpbmUsIFhGQV9GTV9FWFBUWVBFX0JSRUFLKSB7fQotCi1DWEZBX0ZNQnJlYWtFeHByZXNzaW9uOjp+Q1hGQV9GTUJyZWFrRXhwcmVzc2lvbigpIHt9Ci0KLXZvaWQgQ1hGQV9GTUJyZWFrRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgewotICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFOwotICBqYXZhc2NyaXB0IDw8IEwiID0gMDtcbiI7Ci0gIGphdmFzY3JpcHQgPDwgTCJicmVhaztcbiI7Ci19Ci0KLXZvaWQgQ1hGQV9GTUJyZWFrRXhwcmVzc2lvbjo6VG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7Ci0gIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7Ci0gIGphdmFzY3JpcHQgPDwgTCIgPSAwO1xuIjsKLSAgamF2YXNjcmlwdCA8PCBMImJyZWFrO1xuIjsKLX0KLQotQ1hGQV9GTUNvbnRpbnVlRXhwcmVzc2lvbjo6Q1hGQV9GTUNvbnRpbnVlRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lKQotICAgIDogQ1hGQV9GTUV4cHJlc3Npb24obGluZSwgWEZBX0ZNX0VYUFRZUEVfQ09OVElOVUUpIHt9Ci0KLUNYRkFfRk1Db250aW51ZUV4cHJlc3Npb246On5DWEZBX0ZNQ29udGludWVFeHByZXNzaW9uKCkge30KLQotdm9pZCBDWEZBX0ZNQ29udGludWVFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7Ci0gIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7Ci0gIGphdmFzY3JpcHQgPDwgTCIgPSAwO1xuIjsKLSAgamF2YXNjcmlwdCA8PCBMImNvbnRpbnVlO1xuIjsKLX0KLQotdm9pZCBDWEZBX0ZNQ29udGludWVFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKLSAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsKLSAgamF2YXNjcmlwdCA8PCBMIiA9IDA7XG4iOwotICBqYXZhc2NyaXB0IDw8IEwiY29udGludWU7XG4iOwotfQotCi1DWEZBX0ZNRm9yRXhwcmVzc2lvbjo6Q1hGQV9GTUZvckV4cHJlc3Npb24oCi0gICAgdWludDMyX3QgbGluZSwKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFyaWFudCwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBBc3NpZ25tZW50LAotICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEFjY2Vzc29yLAotICAgIGludDMyX3QgaURpcmVjdGlvbiwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBTdGVwLAotICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gcExpc3QpCi0gICAgOiBDWEZBX0ZNTG9vcEV4cHJlc3Npb24obGluZSksCi0gICAgICBtX3dzVmFyaWFudCh3c1ZhcmlhbnQpLAotICAgICAgbV9wQXNzaWdubWVudChzdGQ6Om1vdmUocEFzc2lnbm1lbnQpKSwKLSAgICAgIG1fcEFjY2Vzc29yKHN0ZDo6bW92ZShwQWNjZXNzb3IpKSwKLSAgICAgIG1faURpcmVjdGlvbihpRGlyZWN0aW9uKSwKLSAgICAgIG1fcFN0ZXAoc3RkOjptb3ZlKHBTdGVwKSksCi0gICAgICBtX3BMaXN0KHN0ZDo6bW92ZShwTGlzdCkpIHt9Ci0KLUNYRkFfRk1Gb3JFeHByZXNzaW9uOjp+Q1hGQV9GTUZvckV4cHJlc3Npb24oKSB7fQotCi12b2lkIENYRkFfRk1Gb3JFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7Ci0gIGphdmFzY3JpcHQgPDwgTCJ7XG52YXIgIjsKLSAgQ0ZYX1dpZGVTdHJpbmcgdGVtcFZhcmlhbnQ7Ci0gIGlmIChtX3dzVmFyaWFudC5HZXRBdCgwKSA9PSBMJyEnKSB7Ci0gICAgdGVtcFZhcmlhbnQgPSBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSICsgbV93c1ZhcmlhbnQuTWlkKDEpOwotICAgIGphdmFzY3JpcHQgPDwgdGVtcFZhcmlhbnQ7Ci0gIH0gZWxzZSB7Ci0gICAgdGVtcFZhcmlhbnQgPSBtX3dzVmFyaWFudDsKLSAgICBqYXZhc2NyaXB0IDw8IG1fd3NWYXJpYW50OwotICB9Ci0gIGphdmFzY3JpcHQgPDwgTCIgPSBudWxsO1xuIjsKLSAgamF2YXNjcmlwdCA8PCBMImZvciAoIjsKLSAgamF2YXNjcmlwdCA8PCB0ZW1wVmFyaWFudDsKLSAgamF2YXNjcmlwdCA8PCBMIiA9ICI7Ci0gIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsKLSAgamF2YXNjcmlwdCA8PCBMIigiOwotICBtX3BBc3NpZ25tZW50LT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gIGphdmFzY3JpcHQgPDwgTCIpOyAiOwotICBqYXZhc2NyaXB0IDw8IHRlbXBWYXJpYW50OwotICBpZiAobV9pRGlyZWN0aW9uID09IDEpIHsKLSAgICBqYXZhc2NyaXB0IDw8IEwiIDw9ICI7Ci0gICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKEdFVEZNVkFMVUUpOwotICAgIGphdmFzY3JpcHQgPDwgTCIoIjsKLSAgICBtX3BBY2Nlc3Nvci0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICAgIGphdmFzY3JpcHQgPDwgTCIpOyAiOwotICAgIGphdmFzY3JpcHQgPDwgdGVtcFZhcmlhbnQ7Ci0gICAgamF2YXNjcmlwdCA8PCBMIiArPSAiOwotICB9IGVsc2UgewotICAgIGphdmFzY3JpcHQgPDwgTCIgPj0gIjsKLSAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoR0VURk1WQUxVRSk7Ci0gICAgamF2YXNjcmlwdCA8PCBMIigiOwotICAgIG1fcEFjY2Vzc29yLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gICAgamF2YXNjcmlwdCA8PCBMIik7ICI7Ci0gICAgamF2YXNjcmlwdCA8PCB0ZW1wVmFyaWFudDsKLSAgICBqYXZhc2NyaXB0IDw8IEwiIC09ICI7Ci0gIH0KLSAgaWYgKG1fcFN0ZXApIHsKLSAgICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoR0VURk1WQUxVRSk7Ci0gICAgamF2YXNjcmlwdCA8PCBMIigiOwotICAgIG1fcFN0ZXAtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsKLSAgICBqYXZhc2NyaXB0IDw8IEwiKSI7Ci0gIH0gZWxzZSB7Ci0gICAgamF2YXNjcmlwdCA8PCBMIjEiOwotICB9Ci0gIGphdmFzY3JpcHQgPDwgTCIpXG4iOwotICBtX3BMaXN0LT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gIGphdmFzY3JpcHQgPDwgTCJ9XG4iOwotfQotCi12b2lkIENYRkFfRk1Gb3JFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKLSAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsKLSAgamF2YXNjcmlwdCA8PCBMIiA9IDA7XG4iOwotICBqYXZhc2NyaXB0IDw8IEwie1xudmFyICI7Ci0gIENGWF9XaWRlU3RyaW5nIHRlbXBWYXJpYW50OwotICBpZiAobV93c1ZhcmlhbnQuR2V0QXQoMCkgPT0gTCchJykgewotICAgIHRlbXBWYXJpYW50ID0gRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiArIG1fd3NWYXJpYW50Lk1pZCgxKTsKLSAgICBqYXZhc2NyaXB0IDw8IHRlbXBWYXJpYW50OwotICB9IGVsc2UgewotICAgIHRlbXBWYXJpYW50ID0gbV93c1ZhcmlhbnQ7Ci0gICAgamF2YXNjcmlwdCA8PCBtX3dzVmFyaWFudDsKLSAgfQotICBqYXZhc2NyaXB0IDw8IEwiID0gbnVsbDtcbiI7Ci0gIGphdmFzY3JpcHQgPDwgTCJmb3IgKCI7Ci0gIGphdmFzY3JpcHQgPDwgdGVtcFZhcmlhbnQ7Ci0gIGphdmFzY3JpcHQgPDwgTCIgPSAiOwotICBqYXZhc2NyaXB0IDw8IFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoR0VURk1WQUxVRSk7Ci0gIGphdmFzY3JpcHQgPDwgTCIoIjsKLSAgbV9wQXNzaWdubWVudC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICBqYXZhc2NyaXB0IDw8IEwiKTsgIjsKLSAgamF2YXNjcmlwdCA8PCB0ZW1wVmFyaWFudDsKLSAgaWYgKG1faURpcmVjdGlvbiA9PSAxKSB7Ci0gICAgamF2YXNjcmlwdCA8PCBMIiA8PSAiOwotICAgIGphdmFzY3JpcHQgPDwgWEZBX0ZNX0VYUFR5cGVUb1N0cmluZyhHRVRGTVZBTFVFKTsKLSAgICBqYXZhc2NyaXB0IDw8IEwiKCI7Ci0gICAgbV9wQWNjZXNzb3ItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsKLSAgICBqYXZhc2NyaXB0IDw8IEwiKTsgIjsKLSAgICBqYXZhc2NyaXB0IDw8IHRlbXBWYXJpYW50OwotICAgIGphdmFzY3JpcHQgPDwgTCIgKz0gIjsKLSAgfSBlbHNlIHsKLSAgICBqYXZhc2NyaXB0IDw8IEwiID49ICI7Ci0gICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKEdFVEZNVkFMVUUpOwotICAgIGphdmFzY3JpcHQgPDwgTCIoIjsKLSAgICBtX3BBY2Nlc3Nvci0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICAgIGphdmFzY3JpcHQgPDwgTCIpOyAiOwotICAgIGphdmFzY3JpcHQgPDwgdGVtcFZhcmlhbnQ7Ci0gICAgamF2YXNjcmlwdCA8PCBMIiAtPSAiOwotICB9Ci0gIGlmIChtX3BTdGVwKSB7Ci0gICAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKEdFVEZNVkFMVUUpOwotICAgIGphdmFzY3JpcHQgPDwgTCIoIjsKLSAgICBtX3BTdGVwLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gICAgamF2YXNjcmlwdCA8PCBMIikiOwotICB9IGVsc2UgewotICAgIGphdmFzY3JpcHQgPDwgTCIxIjsKLSAgfQotICBqYXZhc2NyaXB0IDw8IEwiKVxuIjsKLSAgbV9wTGlzdC0+VG9JbXBsaWVkUmV0dXJuSlMoamF2YXNjcmlwdCk7Ci0gIGphdmFzY3JpcHQgPDwgTCJ9XG4iOwotfQotCi1DWEZBX0ZNRm9yZWFjaEV4cHJlc3Npb246OkNYRkFfRk1Gb3JlYWNoRXhwcmVzc2lvbigKLSAgICB1aW50MzJfdCBsaW5lLAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NJZGVudGlmaWVyLAotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4+JiYgcEFjY2Vzc29ycywKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IHBMaXN0KQotICAgIDogQ1hGQV9GTUxvb3BFeHByZXNzaW9uKGxpbmUpLAotICAgICAgbV93c0lkZW50aWZpZXIod3NJZGVudGlmaWVyKSwKLSAgICAgIG1fcEFjY2Vzc29ycyhzdGQ6Om1vdmUocEFjY2Vzc29ycykpLAotICAgICAgbV9wTGlzdChzdGQ6Om1vdmUocExpc3QpKSB7fQotCi1DWEZBX0ZNRm9yZWFjaEV4cHJlc3Npb246On5DWEZBX0ZNRm9yZWFjaEV4cHJlc3Npb24oKSB7fQotCi12b2lkIENYRkFfRk1Gb3JlYWNoRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgewotICBqYXZhc2NyaXB0IDw8IEwie1xuIjsKLSAgamF2YXNjcmlwdCA8PCBMInZhciAiOwotICBpZiAobV93c0lkZW50aWZpZXIuR2V0QXQoMCkgPT0gTCchJykgewotICAgIENGWF9XaWRlU3RyaW5nIHRlbXBJZGVudGlmaWVyID0KLSAgICAgICAgRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiArIG1fd3NJZGVudGlmaWVyLk1pZCgxKTsKLSAgICBqYXZhc2NyaXB0IDw8IHRlbXBJZGVudGlmaWVyOwotICB9IGVsc2UgewotICAgIGphdmFzY3JpcHQgPDwgbV93c0lkZW50aWZpZXI7Ci0gIH0KLSAgamF2YXNjcmlwdCA8PCBMIiA9IG51bGw7XG4iOwotICBqYXZhc2NyaXB0IDw8IEwidmFyICI7Ci0gIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZOwotICBqYXZhc2NyaXB0IDw8IEwiID0gIjsKLSAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKENPTkNBVEZNT0JKRUNUKTsKLSAgamF2YXNjcmlwdCA8PCBMIigiOwotCi0gIGZvciAoY29uc3QgYXV0byYgZXhwciA6IG1fcEFjY2Vzc29ycykgewotICAgIGV4cHItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsKLSAgICBpZiAoZXhwciAhPSBtX3BBY2Nlc3NvcnMuYmFjaygpKQotICAgICAgamF2YXNjcmlwdCA8PCBMIiwgIjsKLSAgfQotICBqYXZhc2NyaXB0IDw8IEwiKTtcbiI7Ci0gIGphdmFzY3JpcHQgPDwgTCJ2YXIgIjsKLSAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVlJTkRFWDsKLSAgamF2YXNjcmlwdCA8PCAoTCIgPSAwO1xuIik7Ci0gIGphdmFzY3JpcHQgPDwgTCJ3aGlsZSgiOwotICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVCTE9DS1RFTVBBUlJBWUlOREVYOwotICBqYXZhc2NyaXB0IDw8IEwiIDwgIjsKLSAgamF2YXNjcmlwdCA8PCBSVU5USU1FQkxPQ0tURU1QQVJSQVk7Ci0gIGphdmFzY3JpcHQgPDwgTCIubGVuZ3RoKVxue1xuIjsKLSAgaWYgKG1fd3NJZGVudGlmaWVyLkdldEF0KDApID09IEwnIScpIHsKLSAgICBDRlhfV2lkZVN0cmluZyB0ZW1wSWRlbnRpZmllciA9Ci0gICAgICAgIEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKyBtX3dzSWRlbnRpZmllci5NaWQoMSk7Ci0gICAgamF2YXNjcmlwdCA8PCB0ZW1wSWRlbnRpZmllcjsKLSAgfSBlbHNlIHsKLSAgICBqYXZhc2NyaXB0IDw8IG1fd3NJZGVudGlmaWVyOwotICB9Ci0gIGphdmFzY3JpcHQgPDwgTCIgPSAiOwotICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVCTE9DS1RFTVBBUlJBWTsKLSAgamF2YXNjcmlwdCA8PCBMIlsiOwotICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVCTE9DS1RFTVBBUlJBWUlOREVYOwotICBqYXZhc2NyaXB0IDw8IEwiKytdO1xuIjsKLSAgbV9wTGlzdC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICBqYXZhc2NyaXB0IDw8IEwifVxuIjsKLSAgamF2YXNjcmlwdCA8PCBMIn1cbiI7Ci19Ci0KLXZvaWQgQ1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKLSAgamF2YXNjcmlwdCA8PCBSVU5USU1FRlVOQ1RJT05SRVRVUk5WQUxVRTsKLSAgamF2YXNjcmlwdCA8PCBMIiA9IDA7XG4iOwotICBqYXZhc2NyaXB0IDw8IEwie1xuIjsKLSAgamF2YXNjcmlwdCA8PCBMInZhciAiOwotICBpZiAobV93c0lkZW50aWZpZXIuR2V0QXQoMCkgPT0gTCchJykgewotICAgIENGWF9XaWRlU3RyaW5nIHRlbXBJZGVudGlmaWVyID0KLSAgICAgICAgRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiArIG1fd3NJZGVudGlmaWVyLk1pZCgxKTsKLSAgICBqYXZhc2NyaXB0IDw8IHRlbXBJZGVudGlmaWVyOwotICB9IGVsc2UgewotICAgIGphdmFzY3JpcHQgPDwgbV93c0lkZW50aWZpZXI7Ci0gIH0KLSAgamF2YXNjcmlwdCA8PCBMIiA9IG51bGw7XG4iOwotICBqYXZhc2NyaXB0IDw8IEwidmFyICI7Ci0gIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZOwotICBqYXZhc2NyaXB0IDw8IEwiID0gIjsKLSAgamF2YXNjcmlwdCA8PCBYRkFfRk1fRVhQVHlwZVRvU3RyaW5nKENPTkNBVEZNT0JKRUNUKTsKLSAgamF2YXNjcmlwdCA8PCBMIigiOwotICBmb3IgKGNvbnN0IGF1dG8mIGV4cHIgOiBtX3BBY2Nlc3NvcnMpIHsKLSAgICBleHByLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gICAgaWYgKGV4cHIgIT0gbV9wQWNjZXNzb3JzLmJhY2soKSkKLSAgICAgIGphdmFzY3JpcHQgPDwgTCIsICI7Ci0gIH0KLSAgamF2YXNjcmlwdCA8PCBMIik7XG4iOwotICBqYXZhc2NyaXB0IDw8IEwidmFyICI7Ci0gIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZSU5ERVg7Ci0gIGphdmFzY3JpcHQgPDwgTCIgPSAwO1xuIjsKLSAgamF2YXNjcmlwdCA8PCBMIndoaWxlKCI7Ci0gIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZSU5ERVg7Ci0gIGphdmFzY3JpcHQgPDwgTCIgPCAiOwotICBqYXZhc2NyaXB0IDw8IFJVTlRJTUVCTE9DS1RFTVBBUlJBWTsKLSAgamF2YXNjcmlwdCA8PCBMIi5sZW5ndGgpXG57XG4iOwotICBpZiAobV93c0lkZW50aWZpZXIuR2V0QXQoMCkgPT0gTCchJykgewotICAgIENGWF9XaWRlU3RyaW5nIHRlbXBJZGVudGlmaWVyID0KLSAgICAgICAgRVhDTEFNQVRJT05fSU5fSURFTlRJRklFUiArIG1fd3NJZGVudGlmaWVyLk1pZCgxKTsKLSAgICBqYXZhc2NyaXB0IDw8IHRlbXBJZGVudGlmaWVyOwotICB9IGVsc2UgewotICAgIGphdmFzY3JpcHQgPDwgbV93c0lkZW50aWZpZXI7Ci0gIH0KLSAgamF2YXNjcmlwdCA8PCBMIiA9ICI7Ci0gIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZOwotICBqYXZhc2NyaXB0IDw8IEwiWyI7Ci0gIGphdmFzY3JpcHQgPDwgUlVOVElNRUJMT0NLVEVNUEFSUkFZSU5ERVg7Ci0gIGphdmFzY3JpcHQgPDwgTCIrK107XG4iOwotICBtX3BMaXN0LT5Ub0ltcGxpZWRSZXR1cm5KUyhqYXZhc2NyaXB0KTsKLSAgamF2YXNjcmlwdCA8PCBMIn1cbiI7Ci0gIGphdmFzY3JpcHQgPDwgTCJ9XG4iOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvZm0yanMveGZhX2V4cHJlc3Npb24uaCBiL3hmYS9meGZhL2ZtMmpzL3hmYV9leHByZXNzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNTVlYTUuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvZm0yanMveGZhX2V4cHJlc3Npb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYRkFfRk0ySlNfWEZBX0VYUFJFU1NJT05fSF8KLSNkZWZpbmUgWEZBX0ZYRkFfRk0ySlNfWEZBX0VYUFJFU1NJT05fSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9mbTJqcy94ZmFfc2ltcGxlZXhwcmVzc2lvbi5oIgotCi1lbnVtIFhGQV9GTV9FWFBUWVBFIHsKLSAgWEZBX0ZNX0VYUFRZUEVfVU5LTk9XTiwKLSAgWEZBX0ZNX0VYUFRZUEVfRlVOQywKLSAgWEZBX0ZNX0VYUFRZUEVfVkFSLAotICBYRkFfRk1fRVhQVFlQRV9FWFAsCi0gIFhGQV9GTV9FWFBUWVBFX0JMT0NLLAotICBYRkFfRk1fRVhQVFlQRV9JRiwKLSAgWEZBX0ZNX0VYUFRZUEVfQlJFQUssCi0gIFhGQV9GTV9FWFBUWVBFX0NPTlRJTlVFLAotfTsKLQotY2xhc3MgQ1hGQV9GTUV4cHJlc3Npb24gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9GTUV4cHJlc3Npb24odWludDMyX3QgbGluZSk7Ci0gIENYRkFfRk1FeHByZXNzaW9uKHVpbnQzMl90IGxpbmUsIFhGQV9GTV9FWFBUWVBFIHR5cGUpOwotICB2aXJ0dWFsIH5DWEZBX0ZNRXhwcmVzc2lvbigpIHt9Ci0gIHZpcnR1YWwgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KTsKLSAgdmlydHVhbCB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpOwotICB1aW50MzJfdCBHZXRMaW5lKCkgeyByZXR1cm4gbV9saW5lOyB9Ci0gIFhGQV9GTV9FWFBUWVBFIEdldEV4cFR5cGUoKSBjb25zdCB7IHJldHVybiBtX3R5cGU7IH0KLQotIHByb3RlY3RlZDoKLSAgWEZBX0ZNX0VYUFRZUEUgbV90eXBlOwotICB1aW50MzJfdCBtX2xpbmU7Ci19OwotCi1jbGFzcyBDWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uIDogcHVibGljIENYRkFfRk1FeHByZXNzaW9uIHsKLSBwdWJsaWM6Ci0gIC8vIFRha2VzIG93bmVyc2hpcCBvZiB8YXJndW1lbnRzfCBhbmQgfGV4cHJlc3Npb25zfC4KLSAgQ1hGQV9GTUZ1bmN0aW9uRGVmaW5pdGlvbigKLSAgICAgIHVpbnQzMl90IGxpbmUsCi0gICAgICBib29sIGlzR2xvYmFsLAotICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsCi0gICAgICBzdGQ6OnZlY3RvcjxDRlhfV2lkZVN0cmluZ0M+JiYgYXJndW1lbnRzLAotICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPj4mJiBleHByZXNzaW9ucyk7Ci0gIH5DWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uKCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKLSAgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIENGWF9XaWRlU3RyaW5nQyBtX3dzTmFtZTsKLSAgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmdDPiBtX3BBcmd1bWVudHM7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4+IG1fcEV4cHJlc3Npb25zOwotICBib29sIG1faXNHbG9iYWw7Ci19OwotCi1jbGFzcyBDWEZBX0ZNVmFyRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNRXhwcmVzc2lvbiB7Ci0gcHVibGljOgotICBDWEZBX0ZNVmFyRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBwSW5pdCk7Ci0gIH5DWEZBX0ZNVmFyRXhwcmVzc2lvbigpIG92ZXJyaWRlOwotCi0gIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgb3ZlcnJpZGU7Ci0gIHZvaWQgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJikgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBDRlhfV2lkZVN0cmluZ0MgbV93c05hbWU7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gbV9wSW5pdDsKLX07Ci0KLWNsYXNzIENYRkFfRk1FeHBFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1FeHByZXNzaW9uIHsKLSBwdWJsaWM6Ci0gIENYRkFfRk1FeHBFeHByZXNzaW9uKHVpbnQzMl90IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cHJlc3Npb24pOwotICB+Q1hGQV9GTUV4cEV4cHJlc3Npb24oKSBvdmVycmlkZTsKLQotICB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOwotICB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBtX3BFeHByZXNzaW9uOwotfTsKLQotY2xhc3MgQ1hGQV9GTUJsb2NrRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNRXhwcmVzc2lvbiB7Ci0gcHVibGljOgotICBDWEZBX0ZNQmxvY2tFeHByZXNzaW9uKAotICAgICAgdWludDMyX3QgbGluZSwKLSAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4+JiYgcEV4cHJlc3Npb25MaXN0KTsKLSAgfkNYRkFfRk1CbG9ja0V4cHJlc3Npb24oKSBvdmVycmlkZTsKLQotICB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOwotICB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPj4gbV9FeHByZXNzaW9uTGlzdDsKLX07Ci0KLWNsYXNzIENYRkFfRk1Eb0V4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUV4cHJlc3Npb24gewotIHB1YmxpYzoKLSAgQ1hGQV9GTURvRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lLCBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IHBMaXN0KTsKLSAgfkNYRkFfRk1Eb0V4cHJlc3Npb24oKSBvdmVycmlkZTsKLQotICB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOwotICB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBtX3BMaXN0OwotfTsKLQotY2xhc3MgQ1hGQV9GTUlmRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNRXhwcmVzc2lvbiB7Ci0gcHVibGljOgotICBDWEZBX0ZNSWZFeHByZXNzaW9uKHVpbnQzMl90IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IHBJZkV4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBwRWxzZUV4cHJlc3Npb24pOwotICB+Q1hGQV9GTUlmRXhwcmVzc2lvbigpIG92ZXJyaWRlOwotCi0gIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgb3ZlcnJpZGU7Ci0gIHZvaWQgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJikgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IG1fcEV4cHJlc3Npb247Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gbV9wSWZFeHByZXNzaW9uOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IG1fcEVsc2VFeHByZXNzaW9uOwotfTsKLQotY2xhc3MgQ1hGQV9GTUxvb3BFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1FeHByZXNzaW9uIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfRk1Mb29wRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lKSA6IENYRkFfRk1FeHByZXNzaW9uKGxpbmUpIHt9Ci0gIH5DWEZBX0ZNTG9vcEV4cHJlc3Npb24oKSBvdmVycmlkZTsKLSAgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKLSAgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKSBvdmVycmlkZTsKLX07Ci0KLWNsYXNzIENYRkFfRk1XaGlsZUV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUxvb3BFeHByZXNzaW9uIHsKLSBwdWJsaWM6Ci0gIENYRkFfRk1XaGlsZUV4cHJlc3Npb24odWludDMyX3QgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBDb2RpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IHBFeHByZXNzaW9uKTsKLSAgfkNYRkFfRk1XaGlsZUV4cHJlc3Npb24oKSBvdmVycmlkZTsKLQotICB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOwotICB2b2lkIFRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBtX3BDb25kaXRpb247Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gbV9wRXhwcmVzc2lvbjsKLX07Ci0KLWNsYXNzIENYRkFfRk1CcmVha0V4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUV4cHJlc3Npb24gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9GTUJyZWFrRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lKTsKLSAgfkNYRkFfRk1CcmVha0V4cHJlc3Npb24oKSBvdmVycmlkZTsKLSAgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKLSAgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKSBvdmVycmlkZTsKLX07Ci0KLWNsYXNzIENYRkFfRk1Db250aW51ZUV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUV4cHJlc3Npb24gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9GTUNvbnRpbnVlRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lKTsKLSAgfkNYRkFfRk1Db250aW51ZUV4cHJlc3Npb24oKSBvdmVycmlkZTsKLSAgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKLSAgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmKSBvdmVycmlkZTsKLX07Ci0KLWNsYXNzIENYRkFfRk1Gb3JFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1Mb29wRXhwcmVzc2lvbiB7Ci0gcHVibGljOgotICBDWEZBX0ZNRm9yRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFyaWFudCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwQXNzaWdubWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwQWNjZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaURpcmVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwU3RlcCwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBwTGlzdCk7Ci0gIH5DWEZBX0ZNRm9yRXhwcmVzc2lvbigpIG92ZXJyaWRlOwotCi0gIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgb3ZlcnJpZGU7Ci0gIHZvaWQgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJikgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBDRlhfV2lkZVN0cmluZ0MgbV93c1ZhcmlhbnQ7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gbV9wQXNzaWdubWVudDsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBtX3BBY2Nlc3NvcjsKLSAgaW50MzJfdCBtX2lEaXJlY3Rpb247Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gbV9wU3RlcDsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBtX3BMaXN0OwotfTsKLQotY2xhc3MgQ1hGQV9GTUZvcmVhY2hFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1Mb29wRXhwcmVzc2lvbiB7Ci0gcHVibGljOgotICAvLyBUYWtlcyBvd25lcnNoaXAgb2YgfHBBY2Nlc3NvcnN8LgotICBDWEZBX0ZNRm9yZWFjaEV4cHJlc3Npb24oCi0gICAgICB1aW50MzJfdCBsaW5lLAotICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0lkZW50aWZpZXIsCi0gICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+PiYmIHBBY2Nlc3NvcnMsCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IHBMaXN0KTsKLSAgfkNYRkFfRk1Gb3JlYWNoRXhwcmVzc2lvbigpIG92ZXJyaWRlOwotCi0gIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgb3ZlcnJpZGU7Ci0gIHZvaWQgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJikgb3ZlcnJpZGU7Ci0KLSBwcml2YXRlOgotICBDRlhfV2lkZVN0cmluZ0MgbV93c0lkZW50aWZpZXI7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4+IG1fcEFjY2Vzc29yczsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBtX3BMaXN0OwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhGQV9GTTJKU19YRkFfRVhQUkVTU0lPTl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvZm0yanMveGZhX2ZtMmpzY29udGV4dC5jcHAgYi94ZmEvZnhmYS9mbTJqcy94ZmFfZm0yanNjb250ZXh0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThjYjJkMC4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9mbTJqcy94ZmFfZm0yanNjb250ZXh0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY0MjEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvZm0yanMveGZhX2ZtMmpzY29udGV4dC5oIgotCi0jaW5jbHVkZSA8dGltZS5oPgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9leHQuaCIKLSNpbmNsdWRlICJmeGpzL2NmeGpzZV9hcmd1bWVudHMuaCIKLSNpbmNsdWRlICJmeGpzL2NmeGpzZV9jbGFzcy5oIgotI2luY2x1ZGUgImZ4anMvY2Z4anNlX3ZhbHVlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2xvY2FsaXphdGlvbi9mZ2FzX2xvY2FsZS5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZub3RpZnkuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9mbTJqcy94ZmFfcHJvZ3JhbS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2NyaXB0Y29udGV4dC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxldmFsdWUuaCIKLQotbmFtZXNwYWNlIHsKLQotY29uc3QgZG91YmxlIGtGaW5hbmNpYWxQcmVjaXNpb24gPSAwLjAwMDAwMDAxOwotCi1zdHJ1Y3QgWEZBX0ZNSHRtbFJlc2VydmVDb2RlIHsKLSAgdWludDMyX3QgbV91Q29kZTsKLSAgY29uc3QgRlhfV0NIQVIqIG1faHRtbFJlc2VydmU7Ci19OwotCi1zdHJ1Y3QgWEZBX0ZNSHRtbEhhc2hlZFJlc2VydmVDb2RlIHsKLSAgdWludDMyX3QgbV91SGFzaDsKLSAgdWludDMyX3QgbV91Q29kZTsKLX07Ci0KLWNvbnN0IFhGQV9GTUh0bWxIYXNoZWRSZXNlcnZlQ29kZSByZXNlcnZlc0ZvckRlY29kZVtdID0gewotICAgIHsweDAwMDE4YjYyLCAvKkwiTXUiLCovIDkyNH0sICAgICAgIHsweDAwMDE5MDgzLCAvKkwiTnUiLCovIDkyNX0sCi0gICAgezB4MDAwMTlhYjksIC8qTCJQaSIsKi8gOTI4fSwgICAgICAgezB4MDAwMWMzYzEsIC8qTCJYaSIsKi8gOTI2fSwKLSAgICB7MHgwMDAyMTBhYywgLypMImdlIiwqLyA4ODA1fSwgICAgICB7MHgwMDAyMTBiYiwgLypMImd0IiwqLyA2Mn0sCi0gICAgezB4MDAwMjJhNTEsIC8qTCJsZSIsKi8gODgwNH0sICAgICAgezB4MDAwMjJhNjAsIC8qTCJsdCIsKi8gNjB9LAotICAgIHsweDAwMDIyZjgyLCAvKkwibXUiLCovIDk1Nn0sICAgICAgIHsweDAwMDIzNDkzLCAvKkwibmUiLCovIDg4MDB9LAotICAgIHsweDAwMDIzNDk3LCAvKkwibmkiLCovIDg3MTV9LCAgICAgIHsweDAwMDIzNGEzLCAvKkwibnUiLCovIDk1N30sCi0gICAgezB4MDAwMjM5YzEsIC8qTCJvciIsKi8gODc0NH0sICAgICAgezB4MDAwMjNlZDksIC8qTCJwaSIsKi8gOTYwfSwKLSAgICB7MHgwMDAyNjdlMSwgLypMInhpIiwqLyA5NTh9LCAgICAgICB7MHgwMGM0MTc4OSwgLypMImxjZWlsIiwqLyA4OTY4fSwKLSAgICB7MHgwMGVlZjM0ZiwgLypMInRoZXRhc3ltIiwqLyA5Nzd9LCB7MHgwMTJkN2VhZCwgLypMImxjaXJjIiwqLyAyMDZ9LAotICAgIHsweDAxNjM3YjU2LCAvKkwiYWdyYXZlIiwqLyAyMjR9LCAgIHsweDAyMDg1NmRhLCAvKkwiY3JhcnIiLCovIDg2Mjl9LAotICAgIHsweDAyMjE4OGMzLCAvKkwiZ2FtbWEiLCovIDk0N30sICAgIHsweDAzMzU4NmQzLCAvKkwibmJzcCIsKi8gMTYwfSwKLSAgICB7MHgwNGY0YzM1OCwgLypMIm5zdWIiLCovIDg4MzZ9LCAgICB7MHgwNTgxNDY2YSwgLypMImRhZ2dlciIsKi8gODIyNH0sCi0gICAgezB4MDZiMWY3OTAsIC8qTCJvZWxpZyIsKi8gMzM5fSwgICAgezB4MDZlNDkwZDQsIC8qTCJDaGkiLCovIDkzNX0sCi0gICAgezB4MDcxOGM2YTEsIC8qTCJFVEgiLCovIDIwOH0sICAgICAgezB4MDcxOTZhZGEsIC8qTCJFdGEiLCovIDkxOX0sCi0gICAgezB4MDdmNjY3Y2EsIC8qTCJVZ3JhdmUiLCovIDIxN30sICAgezB4MDgzYThhMjEsIC8qTCJQaGkiLCovIDkzNH0sCi0gICAgezB4MDgzYWMyOGMsIC8qTCJQc2kiLCovIDkzNn0sICAgICAgezB4MDg2ZjI2YTksIC8qTCJSaG8iLCovIDkyOX0sCi0gICAgezB4MDg5YjViNTEsIC8qTCJhcmluZyIsKi8gMjI5fSwgICAgezB4MDhhMzlmNGEsIC8qTCJUYXUiLCovIDkzMn0sCi0gICAgezB4MDhiNjE4OGIsIC8qTCJUSE9STiIsKi8gMjIyfSwgICAgezB4MDljZTc5MmEsIC8qTCJpY2lyYyIsKi8gMjM4fSwKLSAgICB7MHgwOWY5ZDYxZSwgLypMImFtcCIsKi8gMzh9LCAgICAgICB7MHgwOWY5ZGIzMywgLypMImFuZCIsKi8gODc0M30sCi0gICAgezB4MDlmOWRiMzYsIC8qTCJhbmciLCovIDg3MzZ9LCAgICAgezB4MGEyZTM1MTQsIC8qTCJjYXAiLCovIDg3NDV9LAotICAgIHsweDBhMmU1OGY0LCAvKkwiY2hpIiwqLyA5Njd9LCAgICAgIHsweDBhMmU5YmE4LCAvKkwiY3VwIiwqLyA4NzQ2fSwKLSAgICB7MHgwYTQ4OTdkMCwgLypMImRlZyIsKi8gMTc2fSwgICAgICB7MHgwYTYzMzJmYSwgLypMImV0YSIsKi8gOTUxfSwKLSAgICB7MHgwYTYzMzMwMSwgLypMImV0aCIsKi8gMjQwfSwgICAgICB7MHgwYWNjNGQ0YiwgLypMImludCIsKi8gODc0N30sCi0gICAgezB4MGIxYjNkMzUsIC8qTCJsb3oiLCovIDk2NzR9LCAgICAgezB4MGIxYjRjOGIsIC8qTCJscm0iLCovIDgyMDZ9LAotICAgIHsweDBiNGZkOWIxLCAvKkwibm90IiwqLyAxNzJ9LCAgICAgIHsweDBiODQ1MjQxLCAvKkwicGhpIiwqLyA5NjZ9LAotICAgIHsweDBiODQ1NzZmLCAvKkwicGl2IiwqLyA5ODJ9LCAgICAgIHsweDBiODQ4YWFjLCAvKkwicHNpIiwqLyA5Njh9LAotICAgIHsweDBiYjhkZjVlLCAvKkwicmVnIiwqLyAxNzR9LCAgICAgIHsweDBiYjhlZWM5LCAvKkwicmhvIiwqLyA5NjF9LAotICAgIHsweDBiYjkwMzRiLCAvKkwicmxtIiwqLyA4MjA3fSwgICAgIHsweDBiZDMzZDE0LCAvKkwic2h5IiwqLyAxNzN9LAotICAgIHsweDBiZDM0MjI5LCAvKkwic2ltIiwqLyA4NzY0fSwgICAgIHsweDBiZDM3ZmFhLCAvKkwic3ViIiwqLyA4ODM0fSwKLSAgICB7MHgwYmQzN2ZiNSwgLypMInN1bSIsKi8gODcyMX0sICAgICB7MHgwYmQzN2ZiOCwgLypMInN1cCIsKi8gODgzNX0sCi0gICAgezB4MGJlZDY3NmEsIC8qTCJ0YXUiLCovIDk2NH0sICAgICAgezB4MGMwN2YzMmUsIC8qTCJ1bWwiLCovIDE2OH0sCi0gICAgezB4MGM3MTAzMmMsIC8qTCJ5ZW4iLCovIDE2NX0sICAgICAgezB4MGM3ZjI4ODksIC8qTCJzemxpZyIsKi8gMjIzfSwKLSAgICB7MHgwYzhiYWRiYiwgLypMInp3aiIsKi8gODIwNX0sICAgICB7MHgxMGJhNGRiYSwgLypMIkVncmF2ZSIsKi8gMjAwfSwKLSAgICB7MHgxMGYxZWEyNCwgLypMInBhcmEiLCovIDE4Mn0sICAgICB7MHgxMGYxZWEzNywgLypMInBhcnQiLCovIDg3MDZ9LAotICAgIHsweDExNWIyMzM3LCAvKkwicGVycCIsKi8gODg2OX0sICAgIHsweDEyYjEwZDE1LCAvKkwicHJvZCIsKi8gODcxOX0sCi0gICAgezB4MTJiMTBkMjEsIC8qTCJwcm9wIiwqLyA4NzMzfSwgICAgezB4MTJkZmE5ZjQsIC8qTCJyZmxvb3IiLCovIDg5NzF9LAotICAgIHsweDEyZWI0NzM2LCAvKkwiQWdyYXZlIiwqLyAxOTJ9LCAgIHsweDEyZmZmMmI3LCAvKkwicHVuZCIsKi8gMTYzfSwKLSAgICB7MHgxM2ZkYTlmMiwgLypMInRpbGRlIiwqLyA3MzJ9LCAgICB7MHgxNDE3ZmQ2MiwgLypMInRpbWVzIiwqLyAyMTV9LAotICAgIHsweDE1NGZjNzI2LCAvKkwiZWNpcmMiLCovIDIzNH0sICAgIHsweDE2NWFhNDUxLCAvKkwic2lnbWEiLCovIDk2M30sCi0gICAgezB4MTcwOTEyNGEsIC8qTCJEYWdnZXIiLCovIDgyMjV9LCAgezB4MTkyZjc4ZDUsIC8qTCJpZXhjbCIsKi8gMTYxfSwKLSAgICB7MHgxYjdlZDhkNywgLypMInJBcnIiLCovIDg2NTh9LCAgICB7MHgxZWM4OGM2OCwgLypMInJhbmciLCovIDkwMDJ9LAotICAgIHsweDFlYzhhMGY3LCAvKkwicmFyciIsKi8gODU5NH0sICAgIHsweDFlZGEwN2YzLCAvKkwiYXRpbGRlIiwqLyAyMjd9LAotICAgIHsweDFmMzE4MmM0LCAvKkwicmVhbCIsKi8gODQ3Nn0sICAgIHsweDFmYzM0ZjhiLCAvKkwieWFjdXRlIiwqLyAyNTN9LAotICAgIHsweDIwZDExNTIyLCAvKkwiYWNpcmMiLCovIDIyNn0sICAgIHsweDIxOTMzYTliLCAvKkwicnNhcXVvIiwqLyA4MjUwfSwKLSAgICB7MHgyMWY0NDkwNywgLypMInVhY3V0ZSIsKi8gMjUwfSwgICB7MHgyMjBjY2E3MiwgLypMImFjdXRlIiwqLyAxODB9LAotICAgIHsweDI0MmNkZWQxLCAvKkwiYWxlZnN5bSIsKi8gODUwMX0sIHsweDI2NTVjNjZhLCAvKkwiZGVsdGEiLCovIDk0OH0sCi0gICAgezB4MjY5ZTRiNGQsIC8qTCJleGlzdCIsKi8gODcwN30sICAgezB4MjczMzc5ZmEsIC8qTCJtaWNybyIsKi8gMTgxfSwKLSAgICB7MHgyN2EzNzQ0MCwgLypMImZvcmFsbCIsKi8gODcwNH0sICB7MHgyODU0ZTYyYywgLypMIm1pbnVzIiwqLyA4NzIyfSwKLSAgICB7MHgyODYzNmY4MSwgLypMImNlZGlsIiwqLyAxODR9LCAgICB7MHgyODg3MzU3YiwgLypMImlhY3V0ZSIsKi8gMjM3fSwKLSAgICB7MHgyOTk0ZDVmZiwgLypMImZyYWMxMiIsKi8gMTg5fSwgICB7MHgyOTk0ZDYwMSwgLypMImZyYWMxNCIsKi8gMTg4fSwKLSAgICB7MHgyOTk0ZTA0MywgLypMImZyYWMzNCIsKi8gMTkwfSwgICB7MHgyYTFmZWI0MSwgLypMImxhbWJkYSIsKi8gOTU1fSwKLSAgICB7MHgyYWIyMTVmMywgLypMImFwb3MiLCovIDM5fSwgICAgICB7MHgyYWI4MmVmNywgLypMImVhY3V0ZSIsKi8gMjMzfSwKLSAgICB7MHgyYjM1OTJlZiwgLypMImF1bWwiLCovIDIyOH0sICAgICB7MHgyY2U5Mjg3MywgLypMImFhY3V0ZSIsKi8gMjI1fSwKLSAgICB7MHgyZGFmZjQ4YSwgLypMIm9zbGFzaCIsKi8gMjQ4fSwgICB7MHgyZWY2ODg4MiwgLypMImFlbGlnIiwqLyAyMzB9LAotICAgIHsweDMwNjFkM2QzLCAvKkwiQXRpbGRlIiwqLyAxOTV9LCAgIHsweDMxNGIxYjZiLCAvKkwiWWFjdXRlIiwqLyAyMjF9LAotICAgIHsweDMzN2MxNGU3LCAvKkwiVWFjdXRlIiwqLyAyMTh9LCAgIHsweDM3Njc2YWNhLCAvKkwiY2VudCIsKi8gMTYyfSwKLSAgICB7MHgzN2QwYjg0MSwgLypMImNpcmMiLCovIDcxMH0sICAgICB7MHgzODZlNzk0NywgLypMImNvbmciLCovIDg3NzN9LAotICAgIHsweDM4NmU4MzliLCAvKkwiY29weSIsKi8gMTY5fSwgICAgIHsweDNhMGUyMjVhLCAvKkwiRXBzaWxvbiIsKi8gOTE3fSwKLSAgICB7MHgzYmE3YjcyMSwgLypMIkxhbWJkYSIsKi8gOTIzfSwgICB7MHgzYmQ5YWJlNiwgLypMIkFscGhhIiwqLyA5MTN9LAotICAgIHsweDNjM2ZmYWQ3LCAvKkwiRWFjdXRlIiwqLyAyMDF9LCAgIHsweDNjZmFmNjlmLCAvKkwiYnJ2YmFyIiwqLyAxNjZ9LAotICAgIHsweDNkNTRhNDg5LCAvKkwib21lZ2EiLCovIDk2OX0sICAgIHsweDNlNzBmNDUzLCAvKkwiQWFjdXRlIiwqLyAxOTN9LAotICAgIHsweDNmMzdjMDZhLCAvKkwiT3NsYXNoIiwqLyAyMTZ9LCAgIHsweDQwZTFiMzRlLCAvKkwiZGlhbXMiLCovIDk4MzB9LAotICAgIHsweDQxNjU5NmRmLCAvKkwicGx1c21uIiwqLyAxNzd9LCAgIHsweDQzNTRmZjE2LCAvKkwiVWNpcmMiLCovIDIxOX0sCi0gICAgezB4NDU0ZmNlNmEsIC8qTCJVcHNpbG9uIiwqLyA5MzN9LCAgezB4NDYxMGFkMzUsIC8qTCJlbXNwIiwqLyA4MTk1fSwKLSAgICB7MHg0NjJhZmI3NiwgLypMImVuc3AiLCovIDgxOTR9LCAgICB7MHg0NmUzMDA3MywgLypMImV1bWwiLCovIDIzNX0sCi0gICAgezB4NDZlMzFhMWIsIC8qTCJldXJvIiwqLyA4MzY0fSwgICAgezB4NDZmMmVhZGEsIC8qTCJsb3dhc3QiLCovIDg3Mjd9LAotICAgIHsweDRkY2EyNmNmLCAvKkwiQXVtbCIsKi8gMTk2fSwgICAgIHsweDRlMmQ2MDgzLCAvKkwiaW1hZ2UiLCovIDg0NjV9LAotICAgIHsweDRmOTY0ZWU4LCAvKkwibm90aW4iLCovIDg3MTN9LCAgIHsweDUwOTE3YTdhLCAvKkwiZXBzaWxvbiIsKi8gOTQ5fSwKLSAgICB7MHg1MmY5YTRjZCwgLypMIkthcHBhIiwqLyA5MjJ9LCAgICB7MHg1NDk2ZjQxMCwgLypMIk9jaXJjIiwqLyAyMTJ9LAotICAgIHsweDU2OGNiZjM0LCAvKkwiemV0YSIsKi8gOTUwfSwgICAgIHsweDU3YmFkZDIwLCAvKkwibnRpbGRlIiwqLyAyNDF9LAotICAgIHsweDU4NjYyMTA5LCAvKkwienduaiIsKi8gODIwNH0sICAgIHsweDViMzk4NzBmLCAvKkwiZW1wdHkiLCovIDg3MDl9LAotICAgIHsweDViZDMyNjhhLCAvKkwidXBzaWxvbiIsKi8gOTY1fSwgIHsweDVlMmJmOGEzLCAvKkwiR2FtbWEiLCovIDkxNX0sCi0gICAgezB4NWY3M2MxM2EsIC8qTCJyc3F1byIsKi8gODIxN30sICAgezB4NjFmMmJjNGQsIC8qTCJpb3RhIiwqLyA5NTN9LAotICAgIHsweDYyNWJiY2YzLCAvKkwiaXNpbiIsKi8gODcxMn0sICAgIHsweDYyOTA2ZGY3LCAvKkwiaXVtbCIsKi8gMjM5fSwKLSAgICB7MHg2NGE1Y2IzMSwgLypMIkFyaW5nIiwqLyAxOTd9LCAgICB7MHg2NmYyNWM0YSwgLypMInNicXVvIiwqLyA4MjE4fSwKLSAgICB7MHg2ODUxYWI2MCwgLypMInNwYWRlcyIsKi8gOTgyNH0sICB7MHg2OTQyYTkwMCwgLypMIk50aWxkZSIsKi8gMjA5fSwKLSAgICB7MHg2OTc3OTQ1MywgLypMIkV1bWwiLCovIDIwM30sICAgICB7MHg2Y2RhNmUyMywgLypMImN1cnJlbnQiLCovIDE2NH0sCi0gICAgezB4NzBiNWI2MzQsIC8qTCJsc3F1byIsKi8gODIxNn0sICAgezB4NzE1YTM3MDYsIC8qTCJFY2lyYyIsKi8gMjAyfSwKLSAgICB7MHg3MWU4YmY4ZCwgLypMInRkcXVvIiwqLyA4MjIxfSwgICB7MHg3MjY1MTQzMSwgLypMIlNpZ21hIiwqLyA5MzF9LAotICAgIHsweDc1Njk4MTNiLCAvKkwiaXF1ZXN0IiwqLyAxOTF9LCAgIHsweDc3NmE0MzZhLCAvKkwiZXF1aXYiLCovIDg4MDF9LAotICAgIHsweDc5MjE1MzE0LCAvKkwiWmV0YSIsKi8gOTE4fSwgICAgIHsweDc5YjgxMjI0LCAvKkwib2dyYXZlIiwqLyAyNDJ9LAotICAgIHsweDdjMmY4YjIzLCAvKkwibWFjciIsKi8gMTc1fSwgICAgIHsweDdjZGI4NTAyLCAvKkwiQWNpcmMiLCovIDE5NH0sCi0gICAgezB4ODE4NWM2MmUsIC8qTCJuZGFzaCIsKi8gODIxMX0sICAgezB4ODI2MDM2NGEsIC8qTCJEZWx0YSIsKi8gOTE2fSwKLSAgICB7MHg4NDY2MTlhZCwgLypMIm1kYXNoIiwqLyA4MjEyfSwgICB7MHg4NTUwZmI1MCwgLypMIk9FbGlnIiwqLyAzMzh9LAotICAgIHsweDg4ZWI1Yjg1LCAvKkwibGRxdW8iLCovIDgyMjB9LCAgIHsweDhiM2ZkZTA0LCAvKkwiT2dyYXZlIiwqLyAyMTB9LAotICAgIHsweDhiYzU3OTRiLCAvKkwib3JkZiIsKi8gMTcwfSwgICAgIHsweDhiYzU3OTUyLCAvKkwib3JkbSIsKi8gMTg2fSwKLSAgICB7MHg4YzE0OTIzZCwgLypMIm91bWwiLCovIDI0Nn0sICAgICB7MHg4YzVhN2NkNiwgLypMInRoZXRhIiwqLyA5NTJ9LAotICAgIHsweDhkNjE4MTJiLCAvKkwidGhvcm4iLCovIDI1NH0sICAgIHsweDkxMmI5NWFhLCAvKkwiYXN5bXAiLCovIDg3NzZ9LAotICAgIHsweDk0N2ZhZjgxLCAvKkwibWlkZG90IiwqLyAxODN9LCAgIHsweDk2MjkyMDJlLCAvKkwibGZsb29yIiwqLyA4OTcwfSwKLSAgICB7MHg5NzJlOWVjMSwgLypMIm90aWxkZSIsKi8gMjQ1fSwgICB7MHg5NzQ4ZjIzMSwgLypMIm90aW1lcyIsKi8gODg1NX0sCi0gICAgezB4OTk1ZjE0NjksIC8qTCJPbWVnYSIsKi8gOTM3fSwgICAgezB4OTllYjUzNDksIC8qTCJxdW90IiwqLyAzNH0sCi0gICAgezB4OWFlYjYzOWUsIC8qTCJoZWxsaXAiLCovIDgyMzB9LCAgezB4YTBhZTJmODYsIC8qTCJTY2Fyb24iLCovIDM1Mn0sCi0gICAgezB4YTRkY2IwZDUsIC8qTCJsc2FxdW8iLCovIDgyNDl9LCAgezB4YTUzZGJmNDEsIC8qTCJvYWN1dGUiLCovIDI0M30sCi0gICAgezB4YTVhZTllN2IsIC8qTCJiZHF1byIsKi8gODIyMn0sICAgezB4YTYwMmQ3YmEsIC8qTCJzZG90IiwqLyA4OTAxfSwKLSAgICB7MHhhNjFjZTg2ZiwgLypMInNlY3QiLCovIDE2N30sICAgICB7MHhhNmU0YzNkNywgLypMInNpZ21hZiIsKi8gOTYyfSwKLSAgICB7MHhhN2MxYzc0ZiwgLypMInN1YmUiLCovIDg4Mzh9LCAgICB7MHhhN2MyMGVlOSwgLypMInN1cDEiLCovIDE4NX0sCi0gICAgezB4YTdjMjBlZWEsIC8qTCJzdXAyIiwqLyAxNzh9LCAgICAgezB4YTdjMjBlZWIsIC8qTCJzdXAzIiwqLyAxNzl9LAotICAgIHsweGE3YzIwZjFkLCAvKkwic3VwZSIsKi8gODgzOX0sICAgIHsweGE4YjY2YWExLCAvKkwiT3RpbGRlIiwqLyAyMTN9LAotICAgIHsweGFkOTU4YzQyLCAvKkwiQUVsaWciLCovIDE5OH0sICAgIHsweGFlYTkyNjFkLCAvKkwiT3VtbCIsKi8gMjE0fSwKLSAgICB7MHhiMDQwZWFmYSwgLypMInVBcnIiLCovIDg2NTd9LCAgICB7MHhiMDdjMmUxYywgLypMImJldGEiLCovIDk0Nn0sCi0gICAgezB4YjIyMGU5MmYsIC8qTCJidWxsIiwqLyA4MjI2fSwgICAgezB4YjIyNzUwYzQsIC8qTCJjY2VkaWwiLCovIDIzMX0sCi0gICAgezB4YjM4YWIzMWEsIC8qTCJ1YXJyIiwqLyA4NTkzfSwgICAgezB4YjU5OGI2ODMsIC8qTCJ1dW1sIiwqLyAyNTJ9LAotICAgIHsweGI2YzU4YjIxLCAvKkwiT2FjdXRlIiwqLyAyMTF9LCAgIHsweGI2ZDJhNjE3LCAvKkwib2xpbmUiLCovIDgyNTR9LAotICAgIHsweGJhOWZkOTg5LCAvKkwiZEFyciIsKi8gODY1OX0sICAgIHsweGJiNWNjZDQxLCAvKkwibGdyYXZlIiwqLyAyMDR9LAotICAgIHsweGJkMzliNDRjLCAvKkwid2VpZXJwIiwqLyA4NDcyfSwgIHsweGJkZTlhMWE5LCAvKkwiZGFyciIsKi8gODU5NX0sCi0gICAgezB4YzAyN2UzMjksIC8qTCJwZXJtaWwiLCovIDgyNDB9LCAgezB4YzI0NTEzODksIC8qTCJ1cHNpaCIsKi8gOTc4fSwKLSAgICB7MHhjM2FmMWNhNCwgLypMIkNjZWRpbCIsKi8gMTk5fSwgICB7MHhjZDE2NDI0OSwgLypMImZub2YiLCovIDQwMn0sCi0gICAgezB4Y2Y2Yzg0NjcsIC8qTCJoZWFydHMiLCovIDk4Mjl9LCAgezB4ZDEyMjgzOTAsIC8qTCJ0cmFkZSIsKi8gODQ4Mn0sCi0gICAgezB4ZDE0NjI0MDcsIC8qTCJ5dW1sIiwqLyAyNTV9LCAgICAgezB4ZDJjZjIyNTMsIC8qTCJvcGx1cyIsKi8gODg1M30sCi0gICAgezB4ZDMxMGMxZmMsIC8qTCJCZXRhIiwqLyA5MTR9LCAgICAgezB4ZDU5YzRkNzQsIC8qTCJpbmZpbiIsKi8gODczNH0sCi0gICAgezB4ZDY0ZDQ3MGQsIC8qTCJoQXJyIiwqLyA4NjYwfSwgICAgezB4ZDY3ZDljNzUsIC8qTCJkaXZpZGUiLCovIDI0N30sCi0gICAgezB4ZDY5OGRkMzcsIC8qTCJPbWljcm9uIiwqLyA5Mjd9LCAgezB4ZDgyZDRhNjMsIC8qTCJVdW1sIiwqLyAyMjB9LAotICAgIHsweGQ5OTcwZjJkLCAvKkwiaGFyciIsKi8gODU5Nn0sICAgIHsweGRhOTFmZDk5LCAvKkwiY2x1YnMiLCovIDk4Mjd9LAotICAgIHsweGRiZTViZGNjLCAvKkwidGhlcmU0IiwqLyA4NzU2fSwgIHsweGRkNzY3MWJkLCAvKkwicHJpbWUiLCovIDgyNDJ9LAotICAgIHsweGRmY2YzYzA2LCAvKkwiYWxwaGEiLCovIDk0NX0sICAgIHsweGUwMjEzMDYzLCAvKkwic2Fyb24iLCovIDM1M30sCi0gICAgezB4ZTE5MTFkODMsIC8qTCJyYWRpYyIsKi8gODczMH0sICAgezB4ZTJlNzU0NjgsIC8qTCJyYXF1byIsKi8gMTg3fSwKLSAgICB7MHhlNmUyN2E1ZSwgLypMImxhY3V0ZSIsKi8gMjA1fSwgICB7MHhlNzRhOGYzNiwgLypMInVjaXJjIiwqLyAyNTF9LAotICAgIHsweGU4NjRlY2I2LCAvKkwiVGhldGEiLCovIDkyMH0sICAgIHsweGVjZGRkZTVlLCAvKkwibmFibGEiLCovIDg3MTF9LAotICAgIHsweGVkMWMzNTU3LCAvKkwib21pY3JvbiIsKi8gOTU5fSwgIHsweGVmODIyMjhmLCAvKkwicmNlaWwiLCovIDg5Njl9LAotICAgIHsweGYxZmFiNDkxLCAvKkwibEFyciIsKi8gODY1Nn0sICAgIHsweGYzZGFiN2U3LCAvKkwiWXVtbCIsKi8gMzc2fSwKLSAgICB7MHhmNDI5NDk2MiwgLypMImxhcXVvIiwqLyAxNzF9LCAgICB7MHhmNTQ0NjgyMiwgLypMImxhbmciLCovIDkwMDF9LAotICAgIHsweGY1NDQ3Y2IxLCAvKkwibGFyciIsKi8gODU5Mn0sICAgIHsweGY2NmU5YmVhLCAvKkwidWdyYXZlIiwqLyAyNDl9LAotICAgIHsweGY2YjRjZTcwLCAvKkwibG90YSIsKi8gOTIxfSwgICAgIHsweGY2ZWYzNGVkLCAvKkwia2FwcGEiLCovIDk1NH0sCi0gICAgezB4ZjcyYTNhNTYsIC8qTCJ0aGluc3AiLCovIDgyMDF9LCAgezB4Zjc1MjgwMWEsIC8qTCJsdW1sIiwqLyAyMDd9LAotICAgIHsweGY4OGM4NDMwLCAvKkwib2NpcmMiLCovIDI0NH0sICAgIHsweGY5Njc2MTc4LCAvKkwiZnJhc2wiLCovIDgyNjB9LAotICAgIHsweGZkMDE4ODVlLCAvKkwiaWdyYXZlIiwqLyAyMzZ9LCAgIHsweGZmMzI4MWRhLCAvKkwiZWdyYXZlIiwqLyAyMzJ9LAotfTsKLQotY29uc3QgWEZBX0ZNSHRtbFJlc2VydmVDb2RlIHJlc2VydmVzRm9yRW5jb2RlW10gPSB7Ci0gICAgezM0LCBMInF1b3QifSwgICAgIHszOCwgTCJhbXAifSwgICAgICB7MzksIEwiYXBvcyJ9LAotICAgIHs2MCwgTCJsdCJ9LCAgICAgICB7NjIsIEwiZ3QifSwgICAgICAgezE2MCwgTCJuYnNwIn0sCi0gICAgezE2MSwgTCJpZXhjbCJ9LCAgIHsxNjIsIEwiY2VudCJ9LCAgICB7MTYzLCBMInB1bmQifSwKLSAgICB7MTY0LCBMImN1cnJlbnQifSwgezE2NSwgTCJ5ZW4ifSwgICAgIHsxNjYsIEwiYnJ2YmFyIn0sCi0gICAgezE2NywgTCJzZWN0In0sICAgIHsxNjgsIEwidW1sIn0sICAgICB7MTY5LCBMImNvcHkifSwKLSAgICB7MTcwLCBMIm9yZGYifSwgICAgezE3MSwgTCJsYXF1byJ9LCAgIHsxNzIsIEwibm90In0sCi0gICAgezE3MywgTCJzaHkifSwgICAgIHsxNzQsIEwicmVnIn0sICAgICB7MTc1LCBMIm1hY3IifSwKLSAgICB7MTc2LCBMImRlZyJ9LCAgICAgezE3NywgTCJwbHVzbW4ifSwgIHsxNzgsIEwic3VwMiJ9LAotICAgIHsxNzksIEwic3VwMyJ9LCAgICB7MTgwLCBMImFjdXRlIn0sICAgezE4MSwgTCJtaWNybyJ9LAotICAgIHsxODIsIEwicGFyYSJ9LCAgICB7MTgzLCBMIm1pZGRvdCJ9LCAgezE4NCwgTCJjZWRpbCJ9LAotICAgIHsxODUsIEwic3VwMSJ9LCAgICB7MTg2LCBMIm9yZG0ifSwgICAgezE4NywgTCJyYXF1byJ9LAotICAgIHsxODgsIEwiZnJhYzE0In0sICB7MTg5LCBMImZyYWMxMiJ9LCAgezE5MCwgTCJmcmFjMzQifSwKLSAgICB7MTkxLCBMImlxdWVzdCJ9LCAgezE5MiwgTCJBZ3JhdmUifSwgIHsxOTMsIEwiQWFjdXRlIn0sCi0gICAgezE5NCwgTCJBY2lyYyJ9LCAgIHsxOTUsIEwiQXRpbGRlIn0sICB7MTk2LCBMIkF1bWwifSwKLSAgICB7MTk3LCBMIkFyaW5nIn0sICAgezE5OCwgTCJBRWxpZyJ9LCAgIHsxOTksIEwiQ2NlZGlsIn0sCi0gICAgezIwMCwgTCJFZ3JhdmUifSwgIHsyMDEsIEwiRWFjdXRlIn0sICB7MjAyLCBMIkVjaXJjIn0sCi0gICAgezIwMywgTCJFdW1sIn0sICAgIHsyMDQsIEwibGdyYXZlIn0sICB7MjA1LCBMImxhY3V0ZSJ9LAotICAgIHsyMDYsIEwibGNpcmMifSwgICB7MjA3LCBMImx1bWwifSwgICAgezIwOCwgTCJFVEgifSwKLSAgICB7MjA5LCBMIk50aWxkZSJ9LCAgezIxMCwgTCJPZ3JhdmUifSwgIHsyMTEsIEwiT2FjdXRlIn0sCi0gICAgezIxMiwgTCJPY2lyYyJ9LCAgIHsyMTMsIEwiT3RpbGRlIn0sICB7MjE0LCBMIk91bWwifSwKLSAgICB7MjE1LCBMInRpbWVzIn0sICAgezIxNiwgTCJPc2xhc2gifSwgIHsyMTcsIEwiVWdyYXZlIn0sCi0gICAgezIxOCwgTCJVYWN1dGUifSwgIHsyMTksIEwiVWNpcmMifSwgICB7MjIwLCBMIlV1bWwifSwKLSAgICB7MjIxLCBMIllhY3V0ZSJ9LCAgezIyMiwgTCJUSE9STiJ9LCAgIHsyMjMsIEwic3psaWcifSwKLSAgICB7MjI0LCBMImFncmF2ZSJ9LCAgezIyNSwgTCJhYWN1dGUifSwgIHsyMjYsIEwiYWNpcmMifSwKLSAgICB7MjI3LCBMImF0aWxkZSJ9LCAgezIyOCwgTCJhdW1sIn0sICAgIHsyMjksIEwiYXJpbmcifSwKLSAgICB7MjMwLCBMImFlbGlnIn0sICAgezIzMSwgTCJjY2VkaWwifSwgIHsyMzIsIEwiZWdyYXZlIn0sCi0gICAgezIzMywgTCJlYWN1dGUifSwgIHsyMzQsIEwiZWNpcmMifSwgICB7MjM1LCBMImV1bWwifSwKLSAgICB7MjM2LCBMImlncmF2ZSJ9LCAgezIzNywgTCJpYWN1dGUifSwgIHsyMzgsIEwiaWNpcmMifSwKLSAgICB7MjM5LCBMIml1bWwifSwgICAgezI0MCwgTCJldGgifSwgICAgIHsyNDEsIEwibnRpbGRlIn0sCi0gICAgezI0MiwgTCJvZ3JhdmUifSwgIHsyNDMsIEwib2FjdXRlIn0sICB7MjQ0LCBMIm9jaXJjIn0sCi0gICAgezI0NSwgTCJvdGlsZGUifSwgIHsyNDYsIEwib3VtbCJ9LCAgICB7MjQ3LCBMImRpdmlkZSJ9LAotICAgIHsyNDgsIEwib3NsYXNoIn0sICB7MjQ5LCBMInVncmF2ZSJ9LCAgezI1MCwgTCJ1YWN1dGUifSwKLSAgICB7MjUxLCBMInVjaXJjIn0sICAgezI1MiwgTCJ1dW1sIn0sICAgIHsyNTMsIEwieWFjdXRlIn0sCi0gICAgezI1NCwgTCJ0aG9ybiJ9LCAgIHsyNTUsIEwieXVtbCJ9LCAgICB7MzM4LCBMIk9FbGlnIn0sCi0gICAgezMzOSwgTCJvZWxpZyJ9LCAgIHszNTIsIEwiU2Nhcm9uIn0sICB7MzUzLCBMInNhcm9uIn0sCi0gICAgezM3NiwgTCJZdW1sIn0sICAgIHs0MDIsIEwiZm5vZiJ9LCAgICB7NzEwLCBMImNpcmMifSwKLSAgICB7NzMyLCBMInRpbGRlIn0sICAgezkxMywgTCJBbHBoYSJ9LCAgIHs5MTQsIEwiQmV0YSJ9LAotICAgIHs5MTUsIEwiR2FtbWEifSwgICB7OTE2LCBMIkRlbHRhIn0sICAgezkxNywgTCJFcHNpbG9uIn0sCi0gICAgezkxOCwgTCJaZXRhIn0sICAgIHs5MTksIEwiRXRhIn0sICAgICB7OTIwLCBMIlRoZXRhIn0sCi0gICAgezkyMSwgTCJsb3RhIn0sICAgIHs5MjIsIEwiS2FwcGEifSwgICB7OTIzLCBMIkxhbWJkYSJ9LAotICAgIHs5MjQsIEwiTXUifSwgICAgICB7OTI1LCBMIk51In0sICAgICAgezkyNiwgTCJYaSJ9LAotICAgIHs5MjcsIEwiT21pY3JvbiJ9LCB7OTI4LCBMIlBpIn0sICAgICAgezkyOSwgTCJSaG8ifSwKLSAgICB7OTMxLCBMIlNpZ21hIn0sICAgezkzMiwgTCJUYXUifSwgICAgIHs5MzMsIEwiVXBzaWxvbiJ9LAotICAgIHs5MzQsIEwiUGhpIn0sICAgICB7OTM1LCBMIkNoaSJ9LCAgICAgezkzNiwgTCJQc2kifSwKLSAgICB7OTM3LCBMIk9tZWdhIn0sICAgezk0NSwgTCJhbHBoYSJ9LCAgIHs5NDYsIEwiYmV0YSJ9LAotICAgIHs5NDcsIEwiZ2FtbWEifSwgICB7OTQ4LCBMImRlbHRhIn0sICAgezk0OSwgTCJlcHNpbG9uIn0sCi0gICAgezk1MCwgTCJ6ZXRhIn0sICAgIHs5NTEsIEwiZXRhIn0sICAgICB7OTUyLCBMInRoZXRhIn0sCi0gICAgezk1MywgTCJpb3RhIn0sICAgIHs5NTQsIEwia2FwcGEifSwgICB7OTU1LCBMImxhbWJkYSJ9LAotICAgIHs5NTYsIEwibXUifSwgICAgICB7OTU3LCBMIm51In0sICAgICAgezk1OCwgTCJ4aSJ9LAotICAgIHs5NTksIEwib21pY3JvbiJ9LCB7OTYwLCBMInBpIn0sICAgICAgezk2MSwgTCJyaG8ifSwKLSAgICB7OTYyLCBMInNpZ21hZiJ9LCAgezk2MywgTCJzaWdtYSJ9LCAgIHs5NjQsIEwidGF1In0sCi0gICAgezk2NSwgTCJ1cHNpbG9uIn0sIHs5NjYsIEwicGhpIn0sICAgICB7OTY3LCBMImNoaSJ9LAotICAgIHs5NjgsIEwicHNpIn0sICAgICB7OTY5LCBMIm9tZWdhIn0sICAgezk3NywgTCJ0aGV0YXN5bSJ9LAotICAgIHs5NzgsIEwidXBzaWgifSwgICB7OTgyLCBMInBpdiJ9LCAgICAgezgxOTQsIEwiZW5zcCJ9LAotICAgIHs4MTk1LCBMImVtc3AifSwgICB7ODIwMSwgTCJ0aGluc3AifSwgezgyMDQsIEwienduaiJ9LAotICAgIHs4MjA1LCBMInp3aiJ9LCAgICB7ODIwNiwgTCJscm0ifSwgICAgezgyMDcsIEwicmxtIn0sCi0gICAgezgyMTEsIEwibmRhc2gifSwgIHs4MjEyLCBMIm1kYXNoIn0sICB7ODIxNiwgTCJsc3F1byJ9LAotICAgIHs4MjE3LCBMInJzcXVvIn0sICB7ODIxOCwgTCJzYnF1byJ9LCAgezgyMjAsIEwibGRxdW8ifSwKLSAgICB7ODIyMSwgTCJ0ZHF1byJ9LCAgezgyMjIsIEwiYmRxdW8ifSwgIHs4MjI0LCBMImRhZ2dlciJ9LAotICAgIHs4MjI1LCBMIkRhZ2dlciJ9LCB7ODIyNiwgTCJidWxsIn0sICAgezgyMzAsIEwiaGVsbGlwIn0sCi0gICAgezgyNDAsIEwicGVybWlsIn0sIHs4MjQyLCBMInByaW1lIn0sICB7ODI0OSwgTCJsc2FxdW8ifSwKLSAgICB7ODI1MCwgTCJyc2FxdW8ifSwgezgyNTQsIEwib2xpbmUifSwgIHs4MjYwLCBMImZyYXNsIn0sCi0gICAgezgzNjQsIEwiZXVybyJ9LCAgIHs4NDY1LCBMImltYWdlIn0sICB7ODQ3MiwgTCJ3ZWllcnAifSwKLSAgICB7ODQ3NiwgTCJyZWFsIn0sICAgezg0ODIsIEwidHJhZGUifSwgIHs4NTAxLCBMImFsZWZzeW0ifSwKLSAgICB7ODU5MiwgTCJsYXJyIn0sICAgezg1OTMsIEwidWFyciJ9LCAgIHs4NTk0LCBMInJhcnIifSwKLSAgICB7ODU5NSwgTCJkYXJyIn0sICAgezg1OTYsIEwiaGFyciJ9LCAgIHs4NjI5LCBMImNyYXJyIn0sCi0gICAgezg2NTYsIEwibEFyciJ9LCAgIHs4NjU3LCBMInVBcnIifSwgICB7ODY1OCwgTCJyQXJyIn0sCi0gICAgezg2NTksIEwiZEFyciJ9LCAgIHs4NjYwLCBMImhBcnIifSwgICB7ODcwNCwgTCJmb3JhbGwifSwKLSAgICB7ODcwNiwgTCJwYXJ0In0sICAgezg3MDcsIEwiZXhpc3QifSwgIHs4NzA5LCBMImVtcHR5In0sCi0gICAgezg3MTEsIEwibmFibGEifSwgIHs4NzEyLCBMImlzaW4ifSwgICB7ODcxMywgTCJub3RpbiJ9LAotICAgIHs4NzE1LCBMIm5pIn0sICAgICB7ODcxOSwgTCJwcm9kIn0sICAgezg3MjEsIEwic3VtIn0sCi0gICAgezg3MjIsIEwibWludXMifSwgIHs4NzI3LCBMImxvd2FzdCJ9LCB7ODczMCwgTCJyYWRpYyJ9LAotICAgIHs4NzMzLCBMInByb3AifSwgICB7ODczNCwgTCJpbmZpbiJ9LCAgezg3MzYsIEwiYW5nIn0sCi0gICAgezg3NDMsIEwiYW5kIn0sICAgIHs4NzQ0LCBMIm9yIn0sICAgICB7ODc0NSwgTCJjYXAifSwKLSAgICB7ODc0NiwgTCJjdXAifSwgICAgezg3NDcsIEwiaW50In0sICAgIHs4NzU2LCBMInRoZXJlNCJ9LAotICAgIHs4NzY0LCBMInNpbSJ9LCAgICB7ODc3MywgTCJjb25nIn0sICAgezg3NzYsIEwiYXN5bXAifSwKLSAgICB7ODgwMCwgTCJuZSJ9LCAgICAgezg4MDEsIEwiZXF1aXYifSwgIHs4ODA0LCBMImxlIn0sCi0gICAgezg4MDUsIEwiZ2UifSwgICAgIHs4ODM0LCBMInN1YiJ9LCAgICB7ODgzNSwgTCJzdXAifSwKLSAgICB7ODgzNiwgTCJuc3ViIn0sICAgezg4MzgsIEwic3ViZSJ9LCAgIHs4ODM5LCBMInN1cGUifSwKLSAgICB7ODg1MywgTCJvcGx1cyJ9LCAgezg4NTUsIEwib3RpbWVzIn0sIHs4ODY5LCBMInBlcnAifSwKLSAgICB7ODkwMSwgTCJzZG90In0sICAgezg5NjgsIEwibGNlaWwifSwgIHs4OTY5LCBMInJjZWlsIn0sCi0gICAgezg5NzAsIEwibGZsb29yIn0sIHs4OTcxLCBMInJmbG9vciJ9LCB7OTAwMSwgTCJsYW5nIn0sCi0gICAgezkwMDIsIEwicmFuZyJ9LCAgIHs5Njc0LCBMImxveiJ9LCAgICB7OTgyNCwgTCJzcGFkZXMifSwKLSAgICB7OTgyNywgTCJjbHVicyJ9LCAgezk4MjksIEwiaGVhcnRzIn0sIHs5ODMwLCBMImRpYW1zIn0sCi19OwotCi1jb25zdCBGWEpTRV9GVU5DVElPTl9ERVNDUklQVE9SIGZvcm1jYWxjX2ZtMmpzX2Z1bmN0aW9uc1tdID0gewotICAgIHsiQWJzIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OkFic30sCi0gICAgeyJBdmciLCBDWEZBX0ZNMkpTQ29udGV4dDo6QXZnfSwKLSAgICB7IkNlaWwiLCBDWEZBX0ZNMkpTQ29udGV4dDo6Q2VpbH0sCi0gICAgeyJDb3VudCIsIENYRkFfRk0ySlNDb250ZXh0OjpDb3VudH0sCi0gICAgeyJGbG9vciIsIENYRkFfRk0ySlNDb250ZXh0OjpGbG9vcn0sCi0gICAgeyJNYXgiLCBDWEZBX0ZNMkpTQ29udGV4dDo6TWF4fSwKLSAgICB7Ik1pbiIsIENYRkFfRk0ySlNDb250ZXh0OjpNaW59LAotICAgIHsiTW9kIiwgQ1hGQV9GTTJKU0NvbnRleHQ6Ok1vZH0sCi0gICAgeyJSb3VuZCIsIENYRkFfRk0ySlNDb250ZXh0OjpSb3VuZH0sCi0gICAgeyJTdW0iLCBDWEZBX0ZNMkpTQ29udGV4dDo6U3VtfSwKLSAgICB7IkRhdGUiLCBDWEZBX0ZNMkpTQ29udGV4dDo6RGF0ZX0sCi0gICAgeyJEYXRlMk51bSIsIENYRkFfRk0ySlNDb250ZXh0OjpEYXRlMk51bX0sCi0gICAgeyJEYXRlRm10IiwgQ1hGQV9GTTJKU0NvbnRleHQ6OkRhdGVGbXR9LAotICAgIHsiSXNvRGF0ZTJOdW0iLCBDWEZBX0ZNMkpTQ29udGV4dDo6SXNvRGF0ZTJOdW19LAotICAgIHsiSXNvVGltZTJOdW0iLCBDWEZBX0ZNMkpTQ29udGV4dDo6SXNvVGltZTJOdW19LAotICAgIHsiTG9jYWxEYXRlRm10IiwgQ1hGQV9GTTJKU0NvbnRleHQ6OkxvY2FsRGF0ZUZtdH0sCi0gICAgeyJMb2NhbFRpbWVGbXQiLCBDWEZBX0ZNMkpTQ29udGV4dDo6TG9jYWxUaW1lRm10fSwKLSAgICB7Ik51bTJEYXRlIiwgQ1hGQV9GTTJKU0NvbnRleHQ6Ok51bTJEYXRlfSwKLSAgICB7Ik51bTJHTVRpbWUiLCBDWEZBX0ZNMkpTQ29udGV4dDo6TnVtMkdNVGltZX0sCi0gICAgeyJOdW0yVGltZSIsIENYRkFfRk0ySlNDb250ZXh0OjpOdW0yVGltZX0sCi0gICAgeyJUaW1lIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlRpbWV9LAotICAgIHsiVGltZTJOdW0iLCBDWEZBX0ZNMkpTQ29udGV4dDo6VGltZTJOdW19LAotICAgIHsiVGltZUZtdCIsIENYRkFfRk0ySlNDb250ZXh0OjpUaW1lRm10fSwKLSAgICB7IkFwciIsIENYRkFfRk0ySlNDb250ZXh0OjpBcHJ9LAotICAgIHsiQ3Rlcm0iLCBDWEZBX0ZNMkpTQ29udGV4dDo6Q1Rlcm19LAotICAgIHsiRlYiLCBDWEZBX0ZNMkpTQ29udGV4dDo6RlZ9LAotICAgIHsiSXBtdCIsIENYRkFfRk0ySlNDb250ZXh0OjpJUG10fSwKLSAgICB7Ik5QViIsIENYRkFfRk0ySlNDb250ZXh0OjpOUFZ9LAotICAgIHsiUG10IiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlBtdH0sCi0gICAgeyJQUG10IiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlBQbXR9LAotICAgIHsiUFYiLCBDWEZBX0ZNMkpTQ29udGV4dDo6UFZ9LAotICAgIHsiUmF0ZSIsIENYRkFfRk0ySlNDb250ZXh0OjpSYXRlfSwKLSAgICB7IlRlcm0iLCBDWEZBX0ZNMkpTQ29udGV4dDo6VGVybX0sCi0gICAgeyJDaG9vc2UiLCBDWEZBX0ZNMkpTQ29udGV4dDo6Q2hvb3NlfSwKLSAgICB7IkV4aXN0cyIsIENYRkFfRk0ySlNDb250ZXh0OjpFeGlzdHN9LAotICAgIHsiSGFzVmFsdWUiLCBDWEZBX0ZNMkpTQ29udGV4dDo6SGFzVmFsdWV9LAotICAgIHsiT25lb2YiLCBDWEZBX0ZNMkpTQ29udGV4dDo6T25lb2Z9LAotICAgIHsiV2l0aGluIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OldpdGhpbn0sCi0gICAgeyJJZiIsIENYRkFfRk0ySlNDb250ZXh0OjpJZn0sCi0gICAgeyJFdmFsIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OkV2YWx9LAotICAgIHsiVHJhbnNsYXRlIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OmV2YWxfdHJhbnNsYXRpb259LAotICAgIHsiUmVmIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlJlZn0sCi0gICAgeyJVbml0VHlwZSIsIENYRkFfRk0ySlNDb250ZXh0OjpVbml0VHlwZX0sCi0gICAgeyJVbml0VmFsdWUiLCBDWEZBX0ZNMkpTQ29udGV4dDo6VW5pdFZhbHVlfSwKLSAgICB7IkF0IiwgQ1hGQV9GTTJKU0NvbnRleHQ6OkF0fSwKLSAgICB7IkNvbmNhdCIsIENYRkFfRk0ySlNDb250ZXh0OjpDb25jYXR9LAotICAgIHsiRGVjb2RlIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OkRlY29kZX0sCi0gICAgeyJFbmNvZGUiLCBDWEZBX0ZNMkpTQ29udGV4dDo6RW5jb2RlfSwKLSAgICB7IkZvcm1hdCIsIENYRkFfRk0ySlNDb250ZXh0OjpGb3JtYXR9LAotICAgIHsiTGVmdCIsIENYRkFfRk0ySlNDb250ZXh0OjpMZWZ0fSwKLSAgICB7IkxlbiIsIENYRkFfRk0ySlNDb250ZXh0OjpMZW59LAotICAgIHsiTG93ZXIiLCBDWEZBX0ZNMkpTQ29udGV4dDo6TG93ZXJ9LAotICAgIHsiTHRyaW0iLCBDWEZBX0ZNMkpTQ29udGV4dDo6THRyaW19LAotICAgIHsiUGFyc2UiLCBDWEZBX0ZNMkpTQ29udGV4dDo6UGFyc2V9LAotICAgIHsiUmVwbGFjZSIsIENYRkFfRk0ySlNDb250ZXh0OjpSZXBsYWNlfSwKLSAgICB7IlJpZ2h0IiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlJpZ2h0fSwKLSAgICB7IlJ0cmltIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlJ0cmltfSwKLSAgICB7IlNwYWNlIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlNwYWNlfSwKLSAgICB7IlN0ciIsIENYRkFfRk0ySlNDb250ZXh0OjpTdHJ9LAotICAgIHsiU3R1ZmYiLCBDWEZBX0ZNMkpTQ29udGV4dDo6U3R1ZmZ9LAotICAgIHsiU3Vic3RyIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlN1YnN0cn0sCi0gICAgeyJVdWlkIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OlV1aWR9LAotICAgIHsiVXBwZXIiLCBDWEZBX0ZNMkpTQ29udGV4dDo6VXBwZXJ9LAotICAgIHsiV29yZE51bSIsIENYRkFfRk0ySlNDb250ZXh0OjpXb3JkTnVtfSwKLSAgICB7IkdldCIsIENYRkFfRk0ySlNDb250ZXh0OjpHZXR9LAotICAgIHsiUG9zdCIsIENYRkFfRk0ySlNDb250ZXh0OjpQb3N0fSwKLSAgICB7IlB1dCIsIENYRkFfRk0ySlNDb250ZXh0OjpQdXR9LAotICAgIHsicG9zaXRpdmVfb3BlcmF0b3IiLCBDWEZBX0ZNMkpTQ29udGV4dDo6cG9zaXRpdmVfb3BlcmF0b3J9LAotICAgIHsibmVnYXRpdmVfb3BlcmF0b3IiLCBDWEZBX0ZNMkpTQ29udGV4dDo6bmVnYXRpdmVfb3BlcmF0b3J9LAotICAgIHsibG9naWNhbF9vcl9vcGVyYXRvciIsIENYRkFfRk0ySlNDb250ZXh0Ojpsb2dpY2FsX29yX29wZXJhdG9yfSwKLSAgICB7ImxvZ2ljYWxfYW5kX29wZXJhdG9yIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OmxvZ2ljYWxfYW5kX29wZXJhdG9yfSwKLSAgICB7ImxvZ2ljYWxfbm90X29wZXJhdG9yIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OmxvZ2ljYWxfbm90X29wZXJhdG9yfSwKLSAgICB7ImVxdWFsaXR5X29wZXJhdG9yIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OmVxdWFsaXR5X29wZXJhdG9yfSwKLSAgICB7Im5vdGVxdWFsaXR5X29wZXJhdG9yIiwgQ1hGQV9GTTJKU0NvbnRleHQ6Om5vdGVxdWFsaXR5X29wZXJhdG9yfSwKLSAgICB7Imxlc3Nfb3BlcmF0b3IiLCBDWEZBX0ZNMkpTQ29udGV4dDo6bGVzc19vcGVyYXRvcn0sCi0gICAgeyJsZXNzZXF1YWxfb3BlcmF0b3IiLCBDWEZBX0ZNMkpTQ29udGV4dDo6bGVzc2VxdWFsX29wZXJhdG9yfSwKLSAgICB7ImdyZWF0ZXJfb3BlcmF0b3IiLCBDWEZBX0ZNMkpTQ29udGV4dDo6Z3JlYXRlcl9vcGVyYXRvcn0sCi0gICAgeyJncmVhdGVyZXF1YWxfb3BlcmF0b3IiLCBDWEZBX0ZNMkpTQ29udGV4dDo6Z3JlYXRlcmVxdWFsX29wZXJhdG9yfSwKLSAgICB7InBsdXNfb3BlcmF0b3IiLCBDWEZBX0ZNMkpTQ29udGV4dDo6cGx1c19vcGVyYXRvcn0sCi0gICAgeyJtaW51c19vcGVyYXRvciIsIENYRkFfRk0ySlNDb250ZXh0OjptaW51c19vcGVyYXRvcn0sCi0gICAgeyJtdWx0aXBsZV9vcGVyYXRvciIsIENYRkFfRk0ySlNDb250ZXh0OjptdWx0aXBsZV9vcGVyYXRvcn0sCi0gICAgeyJkaXZpZGVfb3BlcmF0b3IiLCBDWEZBX0ZNMkpTQ29udGV4dDo6ZGl2aWRlX29wZXJhdG9yfSwKLSAgICB7ImFzc2lnbl92YWx1ZV9vcGVyYXRvciIsIENYRkFfRk0ySlNDb250ZXh0Ojphc3NpZ25fdmFsdWVfb3BlcmF0b3J9LAotICAgIHsiZG90X2FjY2Vzc29yIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OmRvdF9hY2Nlc3Nvcn0sCi0gICAgeyJkb3Rkb3RfYWNjZXNzb3IiLCBDWEZBX0ZNMkpTQ29udGV4dDo6ZG90ZG90X2FjY2Vzc29yfSwKLSAgICB7ImNvbmNhdF9mbV9vYmplY3QiLCBDWEZBX0ZNMkpTQ29udGV4dDo6Y29uY2F0X2ZtX29iamVjdH0sCi0gICAgeyJpc19mbV9vYmplY3QiLCBDWEZBX0ZNMkpTQ29udGV4dDo6aXNfZm1fb2JqZWN0fSwKLSAgICB7ImlzX2ZtX2FycmF5IiwgQ1hGQV9GTTJKU0NvbnRleHQ6OmlzX2ZtX2FycmF5fSwKLSAgICB7ImdldF9mbV92YWx1ZSIsIENYRkFfRk0ySlNDb250ZXh0OjpnZXRfZm1fdmFsdWV9LAotICAgIHsiZ2V0X2ZtX2pzb2JqIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OmdldF9mbV9qc29ian0sCi0gICAgeyJmbV92YXJfZmlsdGVyIiwgQ1hGQV9GTTJKU0NvbnRleHQ6OmZtX3Zhcl9maWx0ZXJ9LAotfTsKLQotY29uc3QgRlhKU0VfQ0xBU1NfREVTQ1JJUFRPUiBmb3JtY2FsY19mbTJqc19kZXNjcmlwdG9yID0gewotICAgICJYRkFfRk0ySlNfRm9ybUNhbGNDbGFzcyIsICAgICAgICAgICAgICAgLy8gbmFtZQotICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RydWN0b3IKLSAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb3BlcnRpZXMKLSAgICBmb3JtY2FsY19mbTJqc19mdW5jdGlvbnMsICAgICAgICAgICAgICAgIC8vIG1ldGhvZHMKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBwcm9wZXJ0aWVzCi0gICAgRlhfQXJyYXlTaXplKGZvcm1jYWxjX2ZtMmpzX2Z1bmN0aW9ucyksICAvLyBudW1iZXIgb2YgbWV0aG9kcwotICAgIG51bGxwdHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZHluYW1pYyBwcm9wIHR5cGUKLSAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR5bmFtaWMgcHJvcCBnZXR0ZXIKLSAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR5bmFtaWMgcHJvcCBzZXR0ZXIKLSAgICBudWxscHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR5bmFtaWMgcHJvcCBkZWxldGVyCi0gICAgbnVsbHB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkeW5hbWljIHByb3AgbWV0aG9kIGNhbGwKLX07Ci0KLWNvbnN0IHVpbnQ4X3QgZ19zQWx0VGFibGVfRGF0ZVtdID0gewotICAgIDI1NSwgMjU1LCAyNTUsIDMsICAgOSwgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAotICAgIDI1NSwgMiwgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAotICAgIDI1NSwgMjU1LCAxLCAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAotfTsKLXN0YXRpY19hc3NlcnQoRlhfQXJyYXlTaXplKGdfc0FsdFRhYmxlX0RhdGUpID09IEwnYScgLSBMJ0EnICsgMSwKLSAgICAgICAgICAgICAgIkludmFsaWQgZ19zQWx0VGFibGVfRGF0ZSBzaXplLiIpOwotCi1jb25zdCB1aW50OF90IGdfc0FsdFRhYmxlX1RpbWVbXSA9IHsKLSAgICAxNCwgIDI1NSwgMjU1LCAzLCAgIDksICAgMjU1LCAyNTUsIDE1LCAgMjU1LCAyNTUsIDI1NSwKLSAgICAyNTUsIDYsICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDcsICAgMjU1LCAyNTUsIDI1NSwKLSAgICAyNTUsIDI1NSwgMSwgICAxNywgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLX07Ci1zdGF0aWNfYXNzZXJ0KEZYX0FycmF5U2l6ZShnX3NBbHRUYWJsZV9UaW1lKSA9PSBMJ2EnIC0gTCdBJyArIDEsCi0gICAgICAgICAgICAgICJJbnZhbGlkIGdfc0FsdFRhYmxlX1RpbWUgc2l6ZS4iKTsKLQotdm9pZCBBbHRlcm5hdGVEYXRlVGltZVN5bWJvbHMoQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0FsdFN5bWJvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwQWx0VGFibGUpIHsKLSAgaW50MzJfdCBuTGVuZ3RoID0gd3NQYXR0ZXJuLkdldExlbmd0aCgpOwotICBib29sIGJJbkNvbnN0UmFuZ2UgPSBmYWxzZTsKLSAgYm9vbCBiRXNjYXBlID0gZmFsc2U7Ci0gIGludDMyX3QgaSA9IDA7Ci0gIHdoaWxlIChpIDwgbkxlbmd0aCkgewotICAgIEZYX1dDSEFSIHdjID0gd3NQYXR0ZXJuW2ldOwotICAgIGlmICh3YyA9PSBMJ1wnJykgewotICAgICAgYkluQ29uc3RSYW5nZSA9ICFiSW5Db25zdFJhbmdlOwotICAgICAgaWYgKGJFc2NhcGUpIHsKLSAgICAgICAgaSsrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgd3NQYXR0ZXJuLkRlbGV0ZShpKTsKLSAgICAgICAgbkxlbmd0aC0tOwotICAgICAgfQotICAgICAgYkVzY2FwZSA9ICFiRXNjYXBlOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmICghYkluQ29uc3RSYW5nZSAmJiB3YyA+PSBMJ0EnICYmIHdjIDw9IEwnYScpIHsKLSAgICAgIHVpbnQ4X3QgbkFsdCA9IHBBbHRUYWJsZVt3YyAtIEwnQSddOwotICAgICAgaWYgKG5BbHQgIT0gMjU1KQotICAgICAgICB3c1BhdHRlcm4uU2V0QXQoaSwgd3NBbHRTeW1ib2xzW25BbHRdKTsKLSAgICB9Ci0gICAgaSsrOwotICAgIGJFc2NhcGUgPSBmYWxzZTsKLSAgfQotfQotCi1ib29sIFBhdHRlcm5TdHJpbmdUeXBlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgcGF0dGVyblR5cGUpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NQYXR0ZXJuID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6UGF0dGVybik7Ci0gIGlmIChMImRhdGV0aW1lIiA9PSB3c1BhdHRlcm4uTGVmdCg4KSkgewotICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX0RBVEVUSU1FOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChMImRhdGUiID09IHdzUGF0dGVybi5MZWZ0KDQpKSB7Ci0gICAgcGF0dGVyblR5cGUgPSB3c1BhdHRlcm4uRmluZChMInRpbWUiKSA+IDAgPyBYRkFfVlRfREFURVRJTUUgOiBYRkFfVlRfREFURTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoTCJ0aW1lIiA9PSB3c1BhdHRlcm4uTGVmdCg0KSkgewotICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX1RJTUU7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKEwidGV4dCIgPT0gd3NQYXR0ZXJuLkxlZnQoNCkpIHsKLSAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9URVhUOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChMIm51bSIgPT0gd3NQYXR0ZXJuLkxlZnQoMykpIHsKLSAgICBpZiAoTCJpbnRlZ2VyIiA9PSB3c1BhdHRlcm4uTWlkKDQsIDcpKSB7Ci0gICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9JTlRFR0VSOwotICAgIH0gZWxzZSBpZiAoTCJkZWNpbWFsIiA9PSB3c1BhdHRlcm4uTWlkKDQsIDcpKSB7Ci0gICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9ERUNJTUFMOwotICAgIH0gZWxzZSBpZiAoTCJjdXJyZW5jeSIgPT0gd3NQYXR0ZXJuLk1pZCg0LCA4KSkgewotICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfRkxPQVQ7Ci0gICAgfSBlbHNlIGlmIChMInBlcmNlbnQiID09IHdzUGF0dGVybi5NaWQoNCwgNykpIHsKLSAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX0ZMT0FUOwotICAgIH0gZWxzZSB7Ci0gICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9GTE9BVDsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9OVUxMOwotICB3c1BhdHRlcm4uTWFrZUxvd2VyKCk7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwRGF0YSA9IHdzUGF0dGVybi5jX3N0cigpOwotICBpbnQzMl90IGlMZW5ndGggPSB3c1BhdHRlcm4uR2V0TGVuZ3RoKCk7Ci0gIGludDMyX3QgaUluZGV4ID0gMDsKLSAgYm9vbCBiU2luZ2xlUXVvdGF0aW9uID0gZmFsc2U7Ci0gIEZYX1dDSEFSIHBhdHRlcm5DaGFyOwotICB3aGlsZSAoaUluZGV4IDwgaUxlbmd0aCkgewotICAgIHBhdHRlcm5DaGFyID0gcERhdGFbaUluZGV4XTsKLSAgICBpZiAocGF0dGVybkNoYXIgPT0gMHgyNykgewotICAgICAgYlNpbmdsZVF1b3RhdGlvbiA9ICFiU2luZ2xlUXVvdGF0aW9uOwotICAgIH0gZWxzZSBpZiAoIWJTaW5nbGVRdW90YXRpb24gJiYKLSAgICAgICAgICAgICAgIChwYXR0ZXJuQ2hhciA9PSAneScgfHwgcGF0dGVybkNoYXIgPT0gJ2onKSkgewotICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfREFURTsKLSAgICAgIGlJbmRleCsrOwotICAgICAgRlhfV0NIQVIgdGltZVBhdHRlcm5DaGFyOwotICAgICAgd2hpbGUgKGlJbmRleCA8IGlMZW5ndGgpIHsKLSAgICAgICAgdGltZVBhdHRlcm5DaGFyID0gcERhdGFbaUluZGV4XTsKLSAgICAgICAgaWYgKHRpbWVQYXR0ZXJuQ2hhciA9PSAweDI3KSB7Ci0gICAgICAgICAgYlNpbmdsZVF1b3RhdGlvbiA9ICFiU2luZ2xlUXVvdGF0aW9uOwotICAgICAgICB9IGVsc2UgaWYgKCFiU2luZ2xlUXVvdGF0aW9uICYmIHRpbWVQYXR0ZXJuQ2hhciA9PSAndCcpIHsKLSAgICAgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9EQVRFVElNRTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpSW5kZXgrKzsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0gZWxzZSBpZiAoIWJTaW5nbGVRdW90YXRpb24gJiYKLSAgICAgICAgICAgICAgIChwYXR0ZXJuQ2hhciA9PSAnaCcgfHwgcGF0dGVybkNoYXIgPT0gJ2snKSkgewotICAgICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfVElNRTsKLSAgICAgIGJyZWFrOwotICAgIH0gZWxzZSBpZiAoIWJTaW5nbGVRdW90YXRpb24gJiYKLSAgICAgICAgICAgICAgIChwYXR0ZXJuQ2hhciA9PSAnYScgfHwgcGF0dGVybkNoYXIgPT0gJ3gnIHx8Ci0gICAgICAgICAgICAgICAgcGF0dGVybkNoYXIgPT0gJ28nIHx8IHBhdHRlcm5DaGFyID09ICcwJykpIHsKLSAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX1RFWFQ7Ci0gICAgICBpZiAocGF0dGVybkNoYXIgPT0gJ3gnIHx8IHBhdHRlcm5DaGFyID09ICdvJyB8fCBwYXR0ZXJuQ2hhciA9PSAnMCcpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICghYlNpbmdsZVF1b3RhdGlvbiAmJgotICAgICAgICAgICAgICAgKHBhdHRlcm5DaGFyID09ICd6JyB8fCBwYXR0ZXJuQ2hhciA9PSAncycgfHwKLSAgICAgICAgICAgICAgICBwYXR0ZXJuQ2hhciA9PSAnZScgfHwgcGF0dGVybkNoYXIgPT0gJ3YnIHx8Ci0gICAgICAgICAgICAgICAgcGF0dGVybkNoYXIgPT0gJzgnIHx8IHBhdHRlcm5DaGFyID09ICcsJyB8fAotICAgICAgICAgICAgICAgIHBhdHRlcm5DaGFyID09ICcuJyB8fCBwYXR0ZXJuQ2hhciA9PSAnJCcpKSB7Ci0gICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9GTE9BVDsKLSAgICAgIGlmIChwYXR0ZXJuQ2hhciA9PSAndicgfHwgcGF0dGVybkNoYXIgPT0gJzgnIHx8IHBhdHRlcm5DaGFyID09ICckJykgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgaUluZGV4Kys7Ci0gIH0KLSAgaWYgKHBhdHRlcm5UeXBlID09IFhGQV9WVF9OVUxMKSB7Ci0gICAgcGF0dGVyblR5cGUgPSBYRkFfVlRfVEVYVCB8IFhGQV9WVF9GTE9BVDsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLUNYRkFfRk0ySlNDb250ZXh0KiBUb0pTQ29udGV4dChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwgQ0ZYSlNFX0NsYXNzKiBwQ2xhc3MpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRk0ySlNDb250ZXh0Kj4ocFZhbHVlLT5Ub0hvc3RPYmplY3QocENsYXNzKSk7Ci19Ci0KLWJvb2wgSXNXaGl0ZXNwYWNlKGNoYXIgYykgewotICByZXR1cm4gYyA9PSAweDIwIHx8IGMgPT0gMHgwOSB8fCBjID09IDB4MEIgfHwgYyA9PSAweDBDIHx8IGMgPT0gMHgwQSB8fAotICAgICAgICAgYyA9PSAweDBEOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpBYnMoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAxKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIkFicyIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IGFyZ3MuR2V0VmFsdWUoMCk7Ci0gIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgYXJnT25lLmdldCgpKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEZYX0RPVUJMRSBkVmFsdWUgPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBhcmdPbmUuZ2V0KCkpOwotICBpZiAoZFZhbHVlIDwgMCkKLSAgICBkVmFsdWUgPSAtZFZhbHVlOwotCi0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0RG91YmxlKGRWYWx1ZSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6QXZnKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKLSAgaWYgKGFyZ2MgPCAxKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5HZXRTY3JpcHRSdW50aW1lKCk7Ci0gIHVpbnQzMl90IHVDb3VudCA9IDA7Ci0gIEZYX0RPVUJMRSBkU3VtID0gMC4wOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdWYWx1ZSA9IGFyZ3MuR2V0VmFsdWUoaSk7Ci0gICAgaWYgKGFyZ1ZhbHVlLT5Jc051bGwoKSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgaWYgKCFhcmdWYWx1ZS0+SXNBcnJheSgpKSB7Ci0gICAgICBkU3VtICs9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ1ZhbHVlLmdldCgpKTsKLSAgICAgIHVDb3VudCsrOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgYXV0byBsZW5ndGhWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKLSAgICBhcmdWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHkoImxlbmd0aCIsIGxlbmd0aFZhbHVlLmdldCgpKTsKLSAgICBpbnQzMl90IGlMZW5ndGggPSBsZW5ndGhWYWx1ZS0+VG9JbnRlZ2VyKCk7Ci0KLSAgICBpZiAoaUxlbmd0aCA+IDIpIHsKLSAgICAgIGF1dG8gcHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKLSAgICAgIGFyZ1ZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KDEsIHByb3BlcnR5VmFsdWUuZ2V0KCkpOwotCi0gICAgICBhdXRvIGpzT2JqZWN0VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgICBpZiAocHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkpIHsKLSAgICAgICAgZm9yIChpbnQzMl90IGogPSAyOyBqIDwgaUxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgYXJnVmFsdWUtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoaiwganNPYmplY3RWYWx1ZS5nZXQoKSk7Ci0gICAgICAgICAgYXV0byBkZWZhdWx0UHJvcFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc09iamVjdFZhbHVlLmdldCgpLCBkZWZhdWx0UHJvcFZhbHVlLmdldCgpKTsKLSAgICAgICAgICBpZiAoZGVmYXVsdFByb3BWYWx1ZS0+SXNOdWxsKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIGRTdW0gKz0gVmFsdWVUb0RvdWJsZShwVGhpcywgZGVmYXVsdFByb3BWYWx1ZS5nZXQoKSk7Ci0gICAgICAgICAgdUNvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50MzJfdCBqID0gMjsgaiA8IGlMZW5ndGg7IGorKykgewotICAgICAgICAgIGFyZ1ZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KGosIGpzT2JqZWN0VmFsdWUuZ2V0KCkpOwotICAgICAgICAgIGF1dG8gbmV3UHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKLSAgICAgICAgICBqc09iamVjdFZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eSgKLSAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZS0+VG9TdHJpbmcoKS5Bc1N0cmluZ0MoKSwgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7Ci0gICAgICAgICAgaWYgKG5ld1Byb3BlcnR5VmFsdWUtPklzTnVsbCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICBkU3VtICs9IFZhbHVlVG9Eb3VibGUocFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOwotICAgICAgICAgIHVDb3VudCsrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGlmICh1Q291bnQgPT0gMCkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0RG91YmxlKGRTdW0gLyB1Q291bnQpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkNlaWwoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDEpIHsKLSAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiQ2VpbCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1ZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBpZiAoVmFsdWVJc051bGwocFRoaXMsIGFyZ1ZhbHVlLmdldCgpKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0RmxvYXQoCi0gICAgICBGWFNZU19jZWlsKFZhbHVlVG9GbG9hdChwVGhpcywgYXJnVmFsdWUuZ2V0KCkpKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6Q291bnQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOwotICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOwotICBpbnQzMl90IGlDb3VudCA9IDA7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFyZ3MuR2V0TGVuZ3RoKCk7IGkrKykgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1ZhbHVlID0gYXJncy5HZXRWYWx1ZShpKTsKLSAgICBpZiAoYXJnVmFsdWUtPklzTnVsbCgpKQotICAgICAgY29udGludWU7Ci0KLSAgICBpZiAoYXJnVmFsdWUtPklzQXJyYXkoKSkgewotICAgICAgYXV0byBsZW5ndGhWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKLSAgICAgIGFyZ1ZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eSgibGVuZ3RoIiwgbGVuZ3RoVmFsdWUuZ2V0KCkpOwotCi0gICAgICBpbnQzMl90IGlMZW5ndGggPSBsZW5ndGhWYWx1ZS0+VG9JbnRlZ2VyKCk7Ci0gICAgICBpZiAoaUxlbmd0aCA8PSAyKSB7Ci0gICAgICAgIHBDb250ZXh0LT5UaHJvd0FyZ3VtZW50TWlzbWF0Y2hFeGNlcHRpb24oKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBhdXRvIHByb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgICBhdXRvIGpzT2JqZWN0VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgICBhdXRvIG5ld1Byb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgICBhcmdWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgxLCBwcm9wZXJ0eVZhbHVlLmdldCgpKTsKLSAgICAgIGFyZ1ZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KDIsIGpzT2JqZWN0VmFsdWUuZ2V0KCkpOwotICAgICAgaWYgKHByb3BlcnR5VmFsdWUtPklzTnVsbCgpKSB7Ci0gICAgICAgIGZvciAoaW50MzJfdCBqID0gMjsgaiA8IGlMZW5ndGg7IGorKykgewotICAgICAgICAgIGFyZ1ZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KGosIGpzT2JqZWN0VmFsdWUuZ2V0KCkpOwotICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc09iamVjdFZhbHVlLmdldCgpLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKLSAgICAgICAgICBpZiAoIW5ld1Byb3BlcnR5VmFsdWUtPklzTnVsbCgpKQotICAgICAgICAgICAgaUNvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50MzJfdCBqID0gMjsgaiA8IGlMZW5ndGg7IGorKykgewotICAgICAgICAgIGFyZ1ZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KGosIGpzT2JqZWN0VmFsdWUuZ2V0KCkpOwotICAgICAgICAgIGpzT2JqZWN0VmFsdWUtPkdldE9iamVjdFByb3BlcnR5KAotICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLT5Ub1N0cmluZygpLkFzU3RyaW5nQygpLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKLSAgICAgICAgICBpQ291bnQgKz0gbmV3UHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkgPyAwIDogMTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSBpZiAoYXJnVmFsdWUtPklzT2JqZWN0KCkpIHsKLSAgICAgIGF1dG8gbmV3UHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKLSAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShhcmdWYWx1ZS5nZXQoKSwgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7Ci0gICAgICBpZiAoIW5ld1Byb3BlcnR5VmFsdWUtPklzTnVsbCgpKQotICAgICAgICBpQ291bnQrKzsKLSAgICB9IGVsc2UgewotICAgICAgaUNvdW50Kys7Ci0gICAgfQotICB9Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcihpQ291bnQpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkZsb29yKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDEpIHsKLSAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiRmxvb3IiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdWYWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdWYWx1ZS5nZXQoKSkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEZsb2F0KAotICAgICAgRlhTWVNfZmxvb3IoVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdWYWx1ZS5nZXQoKSkpKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpNYXgoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cik7Ci0gIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7Ci0gIHVpbnQzMl90IHVDb3VudCA9IDA7Ci0gIEZYX0RPVUJMRSBkTWF4VmFsdWUgPSAwLjA7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFyZ3MuR2V0TGVuZ3RoKCk7IGkrKykgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1ZhbHVlID0gYXJncy5HZXRWYWx1ZShpKTsKLSAgICBpZiAoYXJnVmFsdWUtPklzTnVsbCgpKQotICAgICAgY29udGludWU7Ci0KLSAgICBpZiAoYXJnVmFsdWUtPklzQXJyYXkoKSkgewotICAgICAgYXV0byBsZW5ndGhWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKLSAgICAgIGFyZ1ZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eSgibGVuZ3RoIiwgbGVuZ3RoVmFsdWUuZ2V0KCkpOwotICAgICAgaW50MzJfdCBpTGVuZ3RoID0gbGVuZ3RoVmFsdWUtPlRvSW50ZWdlcigpOwotICAgICAgaWYgKGlMZW5ndGggPD0gMikgewotICAgICAgICBwQ29udGV4dC0+VGhyb3dBcmd1bWVudE1pc21hdGNoRXhjZXB0aW9uKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgYXV0byBwcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICAgICAgYXV0byBqc09iamVjdFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICAgICAgYXV0byBuZXdQcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICAgICAgYXJnVmFsdWUtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMSwgcHJvcGVydHlWYWx1ZS5nZXQoKSk7Ci0gICAgICBhcmdWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgyLCBqc09iamVjdFZhbHVlLmdldCgpKTsKLSAgICAgIGlmIChwcm9wZXJ0eVZhbHVlLT5Jc051bGwoKSkgewotICAgICAgICBmb3IgKGludDMyX3QgaiA9IDI7IGogPCBpTGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICBhcmdWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeChqLCBqc09iamVjdFZhbHVlLmdldCgpKTsKLSAgICAgICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNPYmplY3RWYWx1ZS5nZXQoKSwgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7Ci0gICAgICAgICAgaWYgKG5ld1Byb3BlcnR5VmFsdWUtPklzTnVsbCgpKQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICB1Q291bnQrKzsKLSAgICAgICAgICBGWF9ET1VCTEUgZFZhbHVlID0gVmFsdWVUb0RvdWJsZShwVGhpcywgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7Ci0gICAgICAgICAgZE1heFZhbHVlID0gKHVDb3VudCA9PSAxKSA/IGRWYWx1ZSA6IHN0ZDo6bWF4KGRNYXhWYWx1ZSwgZFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQzMl90IGogPSAyOyBqIDwgaUxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgYXJnVmFsdWUtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoaiwganNPYmplY3RWYWx1ZS5nZXQoKSk7Ci0gICAgICAgICAganNPYmplY3RWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHkoCi0gICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUtPlRvU3RyaW5nKCkuQXNTdHJpbmdDKCksIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOwotICAgICAgICAgIGlmIChuZXdQcm9wZXJ0eVZhbHVlLT5Jc051bGwoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgdUNvdW50Kys7Ci0gICAgICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOwotICAgICAgICAgIGRNYXhWYWx1ZSA9ICh1Q291bnQgPT0gMSkgPyBkVmFsdWUgOiBzdGQ6Om1heChkTWF4VmFsdWUsIGRWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGFyZ1ZhbHVlLT5Jc09iamVjdCgpKSB7Ci0gICAgICBhdXRvIG5ld1Byb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnVmFsdWUuZ2V0KCksIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOwotICAgICAgaWYgKG5ld1Byb3BlcnR5VmFsdWUtPklzTnVsbCgpKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgdUNvdW50Kys7Ci0gICAgICBGWF9ET1VCTEUgZFZhbHVlID0gVmFsdWVUb0RvdWJsZShwVGhpcywgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7Ci0gICAgICBkTWF4VmFsdWUgPSAodUNvdW50ID09IDEpID8gZFZhbHVlIDogc3RkOjptYXgoZE1heFZhbHVlLCBkVmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICB1Q291bnQrKzsKLSAgICAgIEZYX0RPVUJMRSBkVmFsdWUgPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBhcmdWYWx1ZS5nZXQoKSk7Ci0gICAgICBkTWF4VmFsdWUgPSAodUNvdW50ID09IDEpID8gZFZhbHVlIDogc3RkOjptYXgoZE1heFZhbHVlLCBkVmFsdWUpOwotICAgIH0KLSAgfQotICBpZiAodUNvdW50ID09IDApIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldERvdWJsZShkTWF4VmFsdWUpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Ok1pbihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKLSAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsKLSAgdWludDMyX3QgdUNvdW50ID0gMDsKLSAgRlhfRE9VQkxFIGRNaW5WYWx1ZSA9IDAuMDsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJncy5HZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVmFsdWUgPSBhcmdzLkdldFZhbHVlKGkpOwotICAgIGlmIChhcmdWYWx1ZS0+SXNOdWxsKCkpCi0gICAgICBjb250aW51ZTsKLQotICAgIGlmIChhcmdWYWx1ZS0+SXNBcnJheSgpKSB7Ci0gICAgICBhdXRvIGxlbmd0aFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICAgICAgYXJnVmFsdWUtPkdldE9iamVjdFByb3BlcnR5KCJsZW5ndGgiLCBsZW5ndGhWYWx1ZS5nZXQoKSk7Ci0gICAgICBpbnQzMl90IGlMZW5ndGggPSBsZW5ndGhWYWx1ZS0+VG9JbnRlZ2VyKCk7Ci0gICAgICBpZiAoaUxlbmd0aCA8PSAyKSB7Ci0gICAgICAgIHBDb250ZXh0LT5UaHJvd0FyZ3VtZW50TWlzbWF0Y2hFeGNlcHRpb24oKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICBhdXRvIHByb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgICBhdXRvIGpzT2JqZWN0VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgICBhdXRvIG5ld1Byb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgICBhcmdWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgxLCBwcm9wZXJ0eVZhbHVlLmdldCgpKTsKLSAgICAgIGFyZ1ZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KDIsIGpzT2JqZWN0VmFsdWUuZ2V0KCkpOwotICAgICAgaWYgKHByb3BlcnR5VmFsdWUtPklzTnVsbCgpKSB7Ci0gICAgICAgIGZvciAoaW50MzJfdCBqID0gMjsgaiA8IGlMZW5ndGg7IGorKykgewotICAgICAgICAgIGFyZ1ZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KGosIGpzT2JqZWN0VmFsdWUuZ2V0KCkpOwotICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc09iamVjdFZhbHVlLmdldCgpLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKLSAgICAgICAgICBpZiAobmV3UHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIHVDb3VudCsrOwotICAgICAgICAgIEZYX0RPVUJMRSBkVmFsdWUgPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKLSAgICAgICAgICBkTWluVmFsdWUgPSB1Q291bnQgPT0gMSA/IGRWYWx1ZSA6IHN0ZDo6bWluKGRNaW5WYWx1ZSwgZFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChpbnQzMl90IGogPSAyOyBqIDwgaUxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgYXJnVmFsdWUtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoaiwganNPYmplY3RWYWx1ZS5nZXQoKSk7Ci0gICAgICAgICAganNPYmplY3RWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHkoCi0gICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUtPlRvU3RyaW5nKCkuQXNTdHJpbmdDKCksIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOwotICAgICAgICAgIGlmIChuZXdQcm9wZXJ0eVZhbHVlLT5Jc051bGwoKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgdUNvdW50Kys7Ci0gICAgICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOwotICAgICAgICAgIGRNaW5WYWx1ZSA9IHVDb3VudCA9PSAxID8gZFZhbHVlIDogc3RkOjptaW4oZE1pblZhbHVlLCBkVmFsdWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChhcmdWYWx1ZS0+SXNPYmplY3QoKSkgewotICAgICAgYXV0byBuZXdQcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGFyZ1ZhbHVlLmdldCgpLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKLSAgICAgIGlmIChuZXdQcm9wZXJ0eVZhbHVlLT5Jc051bGwoKSkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIHVDb3VudCsrOwotICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOwotICAgICAgZE1pblZhbHVlID0gdUNvdW50ID09IDEgPyBkVmFsdWUgOiBzdGQ6Om1pbihkTWluVmFsdWUsIGRWYWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHVDb3VudCsrOwotICAgICAgRlhfRE9VQkxFIGRWYWx1ZSA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ1ZhbHVlLmdldCgpKTsKLSAgICAgIGRNaW5WYWx1ZSA9IHVDb3VudCA9PSAxID8gZFZhbHVlIDogc3RkOjptaW4oZE1pblZhbHVlLCBkVmFsdWUpOwotICAgIH0KLSAgfQotICBpZiAodUNvdW50ID09IDApIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldERvdWJsZShkTWluVmFsdWUpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Ok1vZChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKLSAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMikgewotICAgIHBDb250ZXh0LT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIk1vZCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IGFyZ3MuR2V0VmFsdWUoMCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1R3byA9IGFyZ3MuR2V0VmFsdWUoMSk7Ci0gIGlmIChhcmdPbmUtPklzTnVsbCgpIHx8IGFyZ1R3by0+SXNOdWxsKCkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBib29sIGFyZ09uZVJlc3VsdDsKLSAgRlhfRE9VQkxFIGREaXZpZGVuZCA9IEV4dHJhY3REb3VibGUocFRoaXMsIGFyZ09uZS5nZXQoKSwgJmFyZ09uZVJlc3VsdCk7Ci0gIGJvb2wgYXJnVHdvUmVzdWx0OwotICBGWF9ET1VCTEUgZERpdmlzb3IgPSBFeHRyYWN0RG91YmxlKHBUaGlzLCBhcmdUd28uZ2V0KCksICZhcmdUd29SZXN1bHQpOwotICBpZiAoIWFyZ09uZVJlc3VsdCB8fCAhYXJnVHdvUmVzdWx0KSB7Ci0gICAgcENvbnRleHQtPlRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChkRGl2aXNvciA9PSAwLjApIHsKLSAgICBwQ29udGV4dC0+VGhyb3dEaXZpZGVCeVplcm9FeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldERvdWJsZShkRGl2aWRlbmQgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkRGl2aXNvciAqIChpbnQzMl90KShkRGl2aWRlbmQgLyBkRGl2aXNvcikpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlJvdW5kKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKLSAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKLSAgaWYgKGFyZ2MgPCAxIHx8IGFyZ2MgPiAyKSB7Ci0gICAgcENvbnRleHQtPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiUm91bmQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOwotICBpZiAoYXJnT25lLT5Jc051bGwoKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJvb2wgZFZhbHVlUmV0OwotICBGWF9ET1VCTEUgZFZhbHVlID0gRXh0cmFjdERvdWJsZShwVGhpcywgYXJnT25lLmdldCgpLCAmZFZhbHVlUmV0KTsKLSAgaWYgKCFkVmFsdWVSZXQpIHsKLSAgICBwQ29udGV4dC0+VGhyb3dBcmd1bWVudE1pc21hdGNoRXhjZXB0aW9uKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdWludDhfdCB1UHJlY2lzaW9uID0gMDsKLSAgaWYgKGFyZ2MgPiAxKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVHdvID0gYXJncy5HZXRWYWx1ZSgxKTsKLSAgICBpZiAoYXJnVHdvLT5Jc051bGwoKSkgewotICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYm9vbCBkUHJlY2lzaW9uUmV0OwotICAgIEZYX0RPVUJMRSBkUHJlY2lzaW9uID0gRXh0cmFjdERvdWJsZShwVGhpcywgYXJnVHdvLmdldCgpLCAmZFByZWNpc2lvblJldCk7Ci0gICAgaWYgKCFkUHJlY2lzaW9uUmV0KSB7Ci0gICAgICBwQ29udGV4dC0+VGhyb3dBcmd1bWVudE1pc21hdGNoRXhjZXB0aW9uKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdVByZWNpc2lvbiA9Ci0gICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHN0ZDo6bWluKHN0ZDo6bWF4KGRQcmVjaXNpb24sIDAuMCksIDEyLjApKTsKLSAgfQotCi0gIENGWF9EZWNpbWFsIGRlY2ltYWxWYWx1ZSgoRlhfRkxPQVQpZFZhbHVlLCB1UHJlY2lzaW9uKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSA9IGRlY2ltYWxWYWx1ZTsKLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcod3NWYWx1ZS5VVEY4RW5jb2RlKCkuQXNTdHJpbmdDKCkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlN1bShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7Ci0gIGlmIChhcmdjID09IDApIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cik7Ci0gIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7Ci0gIHVpbnQzMl90IHVDb3VudCA9IDA7Ci0gIEZYX0RPVUJMRSBkU3VtID0gMC4wOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdWYWx1ZSA9IGFyZ3MuR2V0VmFsdWUoaSk7Ci0gICAgaWYgKGFyZ1ZhbHVlLT5Jc051bGwoKSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgaWYgKGFyZ1ZhbHVlLT5Jc0FycmF5KCkpIHsKLSAgICAgIGF1dG8gbGVuZ3RoVmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgICBhcmdWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHkoImxlbmd0aCIsIGxlbmd0aFZhbHVlLmdldCgpKTsKLSAgICAgIGludDMyX3QgaUxlbmd0aCA9IGxlbmd0aFZhbHVlLT5Ub0ludGVnZXIoKTsKLSAgICAgIGlmIChpTGVuZ3RoIDw9IDIpIHsKLSAgICAgICAgcENvbnRleHQtPlRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIGF1dG8gcHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKLSAgICAgIGFyZ1ZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KDEsIHByb3BlcnR5VmFsdWUuZ2V0KCkpOwotICAgICAgYXV0byBqc09iamVjdFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICAgICAgYXV0byBuZXdQcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICAgICAgaWYgKHByb3BlcnR5VmFsdWUtPklzTnVsbCgpKSB7Ci0gICAgICAgIGZvciAoaW50MzJfdCBqID0gMjsgaiA8IGlMZW5ndGg7IGorKykgewotICAgICAgICAgIGFyZ1ZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KGosIGpzT2JqZWN0VmFsdWUuZ2V0KCkpOwotICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc09iamVjdFZhbHVlLmdldCgpLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKLSAgICAgICAgICBpZiAobmV3UHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIGRTdW0gKz0gVmFsdWVUb0RvdWJsZShwVGhpcywganNPYmplY3RWYWx1ZS5nZXQoKSk7Ci0gICAgICAgICAgdUNvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50MzJfdCBqID0gMjsgaiA8IGlMZW5ndGg7IGorKykgewotICAgICAgICAgIGFyZ1ZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KGosIGpzT2JqZWN0VmFsdWUuZ2V0KCkpOwotICAgICAgICAgIGpzT2JqZWN0VmFsdWUtPkdldE9iamVjdFByb3BlcnR5KAotICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLT5Ub1N0cmluZygpLkFzU3RyaW5nQygpLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKLSAgICAgICAgICBpZiAobmV3UHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkpCi0gICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgIGRTdW0gKz0gVmFsdWVUb0RvdWJsZShwVGhpcywgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7Ci0gICAgICAgICAgdUNvdW50Kys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGFyZ1ZhbHVlLT5Jc09iamVjdCgpKSB7Ci0gICAgICBhdXRvIG5ld1Byb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnVmFsdWUuZ2V0KCksIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOwotICAgICAgaWYgKG5ld1Byb3BlcnR5VmFsdWUtPklzTnVsbCgpKQotICAgICAgICBjb250aW51ZTsKLQotICAgICAgZFN1bSArPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBhcmdWYWx1ZS5nZXQoKSk7Ci0gICAgICB1Q291bnQrKzsKLSAgICB9IGVsc2UgewotICAgICAgZFN1bSArPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBhcmdWYWx1ZS5nZXQoKSk7Ci0gICAgICB1Q291bnQrKzsKLSAgICB9Ci0gIH0KLSAgaWYgKHVDb3VudCA9PSAwKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXREb3VibGUoZFN1bSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RGF0ZShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMCkgewotICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJEYXRlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdGltZV90IGN1cnJlbnRUaW1lOwotICB0aW1lKCZjdXJyZW50VGltZSk7Ci0gIHN0cnVjdCB0bSogcFRtU3RydWN0ID0gZ210aW1lKCZjdXJyZW50VGltZSk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgYnVmZmVyWWVhcjsKLSAgQ0ZYX0J5dGVTdHJpbmcgYnVmZmVyTW9uOwotICBDRlhfQnl0ZVN0cmluZyBidWZmZXJEYXk7Ci0gIGJ1ZmZlclllYXIuRm9ybWF0KCIlZCIsIHBUbVN0cnVjdC0+dG1feWVhciArIDE5MDApOwotICBidWZmZXJNb24uRm9ybWF0KCIlMDJkIiwgcFRtU3RydWN0LT50bV9tb24gKyAxKTsKLSAgYnVmZmVyRGF5LkZvcm1hdCgiJTAyZCIsIHBUbVN0cnVjdC0+dG1fbWRheSk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgYnVmZmVyQ3VycmVudCA9IGJ1ZmZlclllYXIgKyBidWZmZXJNb24gKyBidWZmZXJEYXk7Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcihEYXRlU3RyaW5nMk51bShidWZmZXJDdXJyZW50LkFzU3RyaW5nQygpKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RGF0ZTJOdW0oQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKLSAgaWYgKGFyZ2MgPCAxIHx8IGFyZ2MgPiAzKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIkRhdGUyTnVtIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gZGF0ZVZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBpZiAoVmFsdWVJc051bGwocFRoaXMsIGRhdGVWYWx1ZS5nZXQoKSkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDRlhfQnl0ZVN0cmluZyBkYXRlU3RyaW5nOwotICBWYWx1ZVRvVVRGOFN0cmluZyhkYXRlVmFsdWUuZ2V0KCksIGRhdGVTdHJpbmcpOwotCi0gIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0cmluZzsKLSAgaWYgKGFyZ2MgPiAxKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gZm9ybWF0VmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7Ci0gICAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBmb3JtYXRWYWx1ZS5nZXQoKSkpIHsKLSAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBWYWx1ZVRvVVRGOFN0cmluZyhmb3JtYXRWYWx1ZS5nZXQoKSwgZm9ybWF0U3RyaW5nKTsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIGxvY2FsU3RyaW5nOwotICBpZiAoYXJnYyA+IDIpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBsb2NhbFZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDIpOwotICAgIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgbG9jYWxWYWx1ZS5nZXQoKSkpIHsKLSAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBWYWx1ZVRvVVRGOFN0cmluZyhsb2NhbFZhbHVlLmdldCgpLCBsb2NhbFN0cmluZyk7Ci0gIH0KLQotICBDRlhfQnl0ZVN0cmluZyBzeklzb0RhdGVTdHJpbmc7Ci0gIGlmICghTG9jYWwySXNvRGF0ZShwVGhpcywgZGF0ZVN0cmluZy5Bc1N0cmluZ0MoKSwgZm9ybWF0U3RyaW5nLkFzU3RyaW5nQygpLAotICAgICAgICAgICAgICAgICAgICAgbG9jYWxTdHJpbmcuQXNTdHJpbmdDKCksIHN6SXNvRGF0ZVN0cmluZykpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKAotICAgICAgRGF0ZVN0cmluZzJOdW0oc3pJc29EYXRlU3RyaW5nLkFzU3RyaW5nQygpKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RGF0ZUZtdChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKLSAgaWYgKGFyZ2MgPiAyKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIkRhdGUyTnVtIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW50MzJfdCBpU3R5bGUgPSAwOwotICBpZiAoYXJnYyA+IDApIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdTdHlsZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgICBpZiAoYXJnU3R5bGUtPklzTnVsbCgpKSB7Ci0gICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpU3R5bGUgPSAoaW50MzJfdClWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ1N0eWxlLmdldCgpKTsKLSAgICBpZiAoaVN0eWxlIDwgMCB8fCBpU3R5bGUgPiA0KQotICAgICAgaVN0eWxlID0gMDsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIHN6TG9jYWw7Ci0gIGlmIChhcmdjID4gMSkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ0xvY2FsID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOwotICAgIGlmIChhcmdMb2NhbC0+SXNOdWxsKCkpIHsKLSAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBWYWx1ZVRvVVRGOFN0cmluZyhhcmdMb2NhbC5nZXQoKSwgc3pMb2NhbCk7Ci0gIH0KLQotICBDRlhfQnl0ZVN0cmluZyBmb3JtYXRTdHI7Ci0gIEdldFN0YW5kYXJkRGF0ZUZvcm1hdChwVGhpcywgaVN0eWxlLCBzekxvY2FsLkFzU3RyaW5nQygpLCBmb3JtYXRTdHIpOwotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZyhmb3JtYXRTdHIuQXNTdHJpbmdDKCkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Oklzb0RhdGUyTnVtKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDEpIHsKLSAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cikKLSAgICAgICAgLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIklzb0RhdGUyTnVtIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBpZiAoYXJnT25lLT5Jc051bGwoKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIHN6QXJnU3RyaW5nOwotICBWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUuZ2V0KCksIHN6QXJnU3RyaW5nKTsKLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKERhdGVTdHJpbmcyTnVtKHN6QXJnU3RyaW5nLkFzU3RyaW5nQygpKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6SXNvVGltZTJOdW0oQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOwotICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAxKSB7Ci0gICAgcENvbnRleHQtPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiSXNvVGltZTJOdW0iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgYXJnT25lLmdldCgpKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsKLSAgQ1hGQV9Mb2NhbGVNZ3IqIHBNZ3IgPSBwRG9jLT5HZXRMb2NhbE1ncigpOwotCi0gIENGWF9CeXRlU3RyaW5nIHN6QXJnU3RyaW5nOwotICBWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUuZ2V0KCksIHN6QXJnU3RyaW5nKTsKLSAgc3pBcmdTdHJpbmcgPSBzekFyZ1N0cmluZy5NaWQoc3pBcmdTdHJpbmcuRmluZCgnVCcsIDApICsgMSk7Ci0gIGlmIChzekFyZ1N0cmluZy5Jc0VtcHR5KCkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ1hGQV9Mb2NhbGVWYWx1ZSB0aW1lVmFsdWUoCi0gICAgICBYRkFfVlRfVElNRSwgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6QXJnU3RyaW5nLkFzU3RyaW5nQygpKSwgcE1ncik7Ci0gIGlmICghdGltZVZhbHVlLklzVmFsaWQoKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcigwKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDRlhfVW5pdGltZSB1bmlUaW1lID0gdGltZVZhbHVlLkdldFRpbWUoKTsKLSAgaW50MzJfdCBob3VyID0gdW5pVGltZS5HZXRIb3VyKCk7Ci0gIGludDMyX3QgbWluID0gdW5pVGltZS5HZXRNaW51dGUoKTsKLSAgaW50MzJfdCBzZWNvbmQgPSB1bmlUaW1lLkdldFNlY29uZCgpOwotICBpbnQzMl90IG1pbFNlY29uZCA9IHVuaVRpbWUuR2V0TWlsbGlzZWNvbmQoKTsKLQotICBGWF9USU1FWk9ORSB0ekxvY2FsZTsKLSAgcE1nci0+R2V0RGVmTG9jYWxlKCktPkdldFRpbWVab25lKCZ0ekxvY2FsZSk7Ci0KLSAgLy8gVE9ETyhkc2luY2xhaXIpOiBTZWUgaWYgdGhlcmUgaXMgb3RoZXIgdGltZSBjb252ZXJzaW9uIGNvZGUgaW4gcGRmaXVtIGFuZAotICAvLyAgIGNvbnNvbGlkYXRlLgotICBpbnQzMl90IG1pbnMgPSBob3VyICogNjAgKyBtaW47Ci0gIG1pbnMgLT0gKHR6TG9jYWxlLnR6SG91ciAqIDYwKTsKLSAgd2hpbGUgKG1pbnMgPiAxNDQwKQotICAgIG1pbnMgLT0gMTQ0MDsKLSAgd2hpbGUgKG1pbnMgPCAwKQotICAgIG1pbnMgKz0gMTQ0MDsKLSAgaG91ciA9IG1pbnMgLyA2MDsKLSAgbWluID0gbWlucyAlIDYwOwotCi0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcihob3VyICogMzYwMDAwMCArIG1pbiAqIDYwMDAwICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCAqIDEwMDAgKyBtaWxTZWNvbmQgKyAxKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpMb2NhbERhdGVGbXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOwotICBpZiAoYXJnYyA+IDIpIHsKLSAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cikKLSAgICAgICAgLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIkxvY2FsRGF0ZUZtdCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGludDMyX3QgaVN0eWxlID0gMDsKLSAgaWYgKGFyZ2MgPiAwKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnU3R5bGUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gICAgaWYgKGFyZ1N0eWxlLT5Jc051bGwoKSkgewotICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlTdHlsZSA9IChpbnQzMl90KVZhbHVlVG9GbG9hdChwVGhpcywgYXJnU3R5bGUuZ2V0KCkpOwotICAgIGlmIChpU3R5bGUgPiA0IHx8IGlTdHlsZSA8IDApCi0gICAgICBpU3R5bGUgPSAwOwotICB9Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgc3pMb2NhbDsKLSAgaWYgKGFyZ2MgPiAxKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnTG9jYWwgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7Ci0gICAgaWYgKGFyZ0xvY2FsLT5Jc051bGwoKSkgewotICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIFZhbHVlVG9VVEY4U3RyaW5nKGFyZ0xvY2FsLmdldCgpLCBzekxvY2FsKTsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0cjsKLSAgR2V0TG9jYWxEYXRlRm9ybWF0KHBUaGlzLCBpU3R5bGUsIHN6TG9jYWwuQXNTdHJpbmdDKCksIGZvcm1hdFN0ciwgZmFsc2UpOwotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZyhmb3JtYXRTdHIuQXNTdHJpbmdDKCkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkxvY2FsVGltZUZtdChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7Ci0gIGlmIChhcmdjID4gMikgewotICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKQotICAgICAgICAtPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiTG9jYWxUaW1lRm10Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW50MzJfdCBpU3R5bGUgPSAwOwotICBpZiAoYXJnYyA+IDApIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdTdHlsZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgICBpZiAoYXJnU3R5bGUtPklzTnVsbCgpKSB7Ci0gICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaVN0eWxlID0gKGludDMyX3QpVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdTdHlsZS5nZXQoKSk7Ci0gICAgaWYgKGlTdHlsZSA+IDQgfHwgaVN0eWxlIDwgMCkKLSAgICAgIGlTdHlsZSA9IDA7Ci0gIH0KLQotICBDRlhfQnl0ZVN0cmluZyBzekxvY2FsOwotICBpZiAoYXJnYyA+IDEpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdMb2NhbCA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKLSAgICBpZiAoYXJnTG9jYWwtPklzTnVsbCgpKSB7Ci0gICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgVmFsdWVUb1VURjhTdHJpbmcoYXJnTG9jYWwuZ2V0KCksIHN6TG9jYWwpOwotICB9Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgZm9ybWF0U3RyOwotICBHZXRMb2NhbFRpbWVGb3JtYXQocFRoaXMsIGlTdHlsZSwgc3pMb2NhbC5Bc1N0cmluZ0MoKSwgZm9ybWF0U3RyLCBmYWxzZSk7Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKGZvcm1hdFN0ci5Bc1N0cmluZ0MoKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6TnVtMkRhdGUoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKLSAgaWYgKGFyZ2MgPCAxIHx8IGFyZ2MgPiAzKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIk51bTJEYXRlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gZGF0ZVZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBpZiAoVmFsdWVJc051bGwocFRoaXMsIGRhdGVWYWx1ZS5nZXQoKSkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50MzJfdCBkRGF0ZSA9IChpbnQzMl90KVZhbHVlVG9GbG9hdChwVGhpcywgZGF0ZVZhbHVlLmdldCgpKTsKLSAgaWYgKGREYXRlIDwgMSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0cmluZzsKLSAgaWYgKGFyZ2MgPiAxKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gZm9ybWF0VmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7Ci0gICAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBmb3JtYXRWYWx1ZS5nZXQoKSkpIHsKLSAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBWYWx1ZVRvVVRGOFN0cmluZyhmb3JtYXRWYWx1ZS5nZXQoKSwgZm9ybWF0U3RyaW5nKTsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIGxvY2FsU3RyaW5nOwotICBpZiAoYXJnYyA+IDIpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBsb2NhbFZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDIpOwotICAgIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgbG9jYWxWYWx1ZS5nZXQoKSkpIHsKLSAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBWYWx1ZVRvVVRGOFN0cmluZyhsb2NhbFZhbHVlLmdldCgpLCBsb2NhbFN0cmluZyk7Ci0gIH0KLQotICBpbnQzMl90IGlZZWFyID0gMTkwMDsKLSAgaW50MzJfdCBpTW9udGggPSAxOwotICBpbnQzMl90IGlEYXkgPSAxOwotICBpbnQzMl90IGkgPSAwOwotICB3aGlsZSAoZERhdGUgPiAwKSB7Ci0gICAgaWYgKGlNb250aCA9PSAyKSB7Ci0gICAgICBpZiAoKCEoKGlZZWFyICsgaSkgJSA0KSAmJiAoKGlZZWFyICsgaSkgJSAxMDApKSB8fCAhKChpWWVhciArIGkpICUgNDAwKSkgewotICAgICAgICBpZiAoZERhdGUgPiAyOSkgewotICAgICAgICAgICsraU1vbnRoOwotICAgICAgICAgIGlmIChpTW9udGggPiAxMikgewotICAgICAgICAgICAgaU1vbnRoID0gMTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaURheSA9IDE7Ci0gICAgICAgICAgZERhdGUgLT0gMjk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaURheSArPSBzdGF0aWNfY2FzdDxpbnQzMl90PihkRGF0ZSkgLSAxOwotICAgICAgICAgIGREYXRlID0gMDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGREYXRlID4gMjgpIHsKLSAgICAgICAgICArK2lNb250aDsKLSAgICAgICAgICBpZiAoaU1vbnRoID4gMTIpIHsKLSAgICAgICAgICAgIGlNb250aCA9IDE7Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlEYXkgPSAxOwotICAgICAgICAgIGREYXRlIC09IDI4OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlEYXkgKz0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZERhdGUpIC0gMTsKLSAgICAgICAgICBkRGF0ZSA9IDA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGlNb250aCA8IDgpIHsKLSAgICAgIGlmICgoaU1vbnRoICUgMiA9PSAwKSkgewotICAgICAgICBpZiAoZERhdGUgPiAzMCkgewotICAgICAgICAgICsraU1vbnRoOwotICAgICAgICAgIGlmIChpTW9udGggPiAxMikgewotICAgICAgICAgICAgaU1vbnRoID0gMTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaURheSA9IDE7Ci0gICAgICAgICAgZERhdGUgLT0gMzA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaURheSArPSBzdGF0aWNfY2FzdDxpbnQzMl90PihkRGF0ZSkgLSAxOwotICAgICAgICAgIGREYXRlID0gMDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGREYXRlID4gMzEpIHsKLSAgICAgICAgICArK2lNb250aDsKLSAgICAgICAgICBpZiAoaU1vbnRoID4gMTIpIHsKLSAgICAgICAgICAgIGlNb250aCA9IDE7Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlEYXkgPSAxOwotICAgICAgICAgIGREYXRlIC09IDMxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlEYXkgKz0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZERhdGUpIC0gMTsKLSAgICAgICAgICBkRGF0ZSA9IDA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKGlNb250aCAlIDIgIT0gMCkgewotICAgICAgICBpZiAoZERhdGUgPiAzMCkgewotICAgICAgICAgICsraU1vbnRoOwotICAgICAgICAgIGlmIChpTW9udGggPiAxMikgewotICAgICAgICAgICAgaU1vbnRoID0gMTsKLSAgICAgICAgICAgICsraTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaURheSA9IDE7Ci0gICAgICAgICAgZERhdGUgLT0gMzA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaURheSArPSBzdGF0aWNfY2FzdDxpbnQzMl90PihkRGF0ZSkgLSAxOwotICAgICAgICAgIGREYXRlID0gMDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGREYXRlID4gMzEpIHsKLSAgICAgICAgICArK2lNb250aDsKLSAgICAgICAgICBpZiAoaU1vbnRoID4gMTIpIHsKLSAgICAgICAgICAgIGlNb250aCA9IDE7Ci0gICAgICAgICAgICArK2k7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlEYXkgPSAxOwotICAgICAgICAgIGREYXRlIC09IDMxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlEYXkgKz0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oZERhdGUpIC0gMTsKLSAgICAgICAgICBkRGF0ZSA9IDA7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBDRlhfQnl0ZVN0cmluZyBzeklzb0RhdGVTdHJpbmc7Ci0gIHN6SXNvRGF0ZVN0cmluZy5Gb3JtYXQoIiVkJTAyZCUwMmQiLCBpWWVhciArIGksIGlNb250aCwgaURheSk7Ci0gIENGWF9CeXRlU3RyaW5nIHN6TG9jYWxEYXRlU3RyaW5nOwotICBJc29EYXRlMkxvY2FsKHBUaGlzLCBzeklzb0RhdGVTdHJpbmcuQXNTdHJpbmdDKCksIGZvcm1hdFN0cmluZy5Bc1N0cmluZ0MoKSwKLSAgICAgICAgICAgICAgICBsb2NhbFN0cmluZy5Bc1N0cmluZ0MoKSwgc3pMb2NhbERhdGVTdHJpbmcpOwotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZyhzekxvY2FsRGF0ZVN0cmluZy5Bc1N0cmluZ0MoKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6TnVtMkdNVGltZShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKLSAgaWYgKGFyZ2MgPCAxIHx8IGFyZ2MgPiAzKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpCi0gICAgICAgIC0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJOdW0yR01UaW1lIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gdGltZVZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBpZiAodGltZVZhbHVlLT5Jc051bGwoKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IGlUaW1lID0gKGludDMyX3QpVmFsdWVUb0Zsb2F0KHBUaGlzLCB0aW1lVmFsdWUuZ2V0KCkpOwotICBpZiAoRlhTWVNfYWJzKGlUaW1lKSA8IDEuMCkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0cmluZzsKLSAgaWYgKGFyZ2MgPiAxKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gZm9ybWF0VmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7Ci0gICAgaWYgKGZvcm1hdFZhbHVlLT5Jc051bGwoKSkgewotICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIFZhbHVlVG9VVEY4U3RyaW5nKGZvcm1hdFZhbHVlLmdldCgpLCBmb3JtYXRTdHJpbmcpOwotICB9Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgbG9jYWxTdHJpbmc7Ci0gIGlmIChhcmdjID4gMikgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGxvY2FsVmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMik7Ci0gICAgaWYgKGxvY2FsVmFsdWUtPklzTnVsbCgpKSB7Ci0gICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgVmFsdWVUb1VURjhTdHJpbmcobG9jYWxWYWx1ZS5nZXQoKSwgbG9jYWxTdHJpbmcpOwotICB9Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgc3pHTVRUaW1lU3RyaW5nOwotICBOdW0yQWxsVGltZShwVGhpcywgaVRpbWUsIGZvcm1hdFN0cmluZy5Bc1N0cmluZ0MoKSwgbG9jYWxTdHJpbmcuQXNTdHJpbmdDKCksCi0gICAgICAgICAgICAgIHRydWUsIHN6R01UVGltZVN0cmluZyk7Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKHN6R01UVGltZVN0cmluZy5Bc1N0cmluZ0MoKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6TnVtMlRpbWUoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKLSAgaWYgKGFyZ2MgPCAxIHx8IGFyZ2MgPiAzKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIk51bTJUaW1lIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gdGltZVZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBpZiAodGltZVZhbHVlLT5Jc051bGwoKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotICBGWF9GTE9BVCBmVGltZSA9IFZhbHVlVG9GbG9hdChwVGhpcywgdGltZVZhbHVlLmdldCgpKTsKLSAgaWYgKEZYU1lTX2ZhYnMoZlRpbWUpIDwgMS4wKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgZm9ybWF0U3RyaW5nOwotICBpZiAoYXJnYyA+IDEpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBmb3JtYXRWYWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKLSAgICBpZiAoZm9ybWF0VmFsdWUtPklzTnVsbCgpKSB7Ci0gICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgVmFsdWVUb1VURjhTdHJpbmcoZm9ybWF0VmFsdWUuZ2V0KCksIGZvcm1hdFN0cmluZyk7Ci0gIH0KLQotICBDRlhfQnl0ZVN0cmluZyBsb2NhbFN0cmluZzsKLSAgaWYgKGFyZ2MgPiAyKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gbG9jYWxWYWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAyKTsKLSAgICBpZiAobG9jYWxWYWx1ZS0+SXNOdWxsKCkpIHsKLSAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBWYWx1ZVRvVVRGOFN0cmluZyhsb2NhbFZhbHVlLmdldCgpLCBsb2NhbFN0cmluZyk7Ci0gIH0KLQotICBDRlhfQnl0ZVN0cmluZyBzekxvY2FsVGltZVN0cmluZzsKLSAgTnVtMkFsbFRpbWUocFRoaXMsIChpbnQzMl90KWZUaW1lLCBmb3JtYXRTdHJpbmcuQXNTdHJpbmdDKCksCi0gICAgICAgICAgICAgIGxvY2FsU3RyaW5nLkFzU3RyaW5nQygpLCBmYWxzZSwgc3pMb2NhbFRpbWVTdHJpbmcpOwotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZyhzekxvY2FsVGltZVN0cmluZy5Bc1N0cmluZ0MoKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6VGltZShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMCkgewotICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJUaW1lIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdGltZV90IG5vdzsKLSAgdGltZSgmbm93KTsKLQotICBzdHJ1Y3QgdG0qIHBHbXQgPSBnbXRpbWUoJm5vdyk7Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcigKLSAgICAgIChwR210LT50bV9ob3VyICogMzYwMCArIHBHbXQtPnRtX21pbiAqIDYwICsgcEdtdC0+dG1fc2VjKSAqIDEwMDApOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlRpbWUyTnVtKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7Ci0gIGlmIChhcmdjIDwgMSB8fCBhcmdjID4gMykgewotICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJUaW1lMk51bSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIHRpbWVTdHJpbmc7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IHRpbWVWYWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCB0aW1lVmFsdWUuZ2V0KCkpKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIFZhbHVlVG9VVEY4U3RyaW5nKHRpbWVWYWx1ZS5nZXQoKSwgdGltZVN0cmluZyk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgZm9ybWF0U3RyaW5nOwotICBpZiAoYXJnYyA+IDEpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBmb3JtYXRWYWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKLSAgICBpZiAoVmFsdWVJc051bGwocFRoaXMsIGZvcm1hdFZhbHVlLmdldCgpKSkgewotICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIFZhbHVlVG9VVEY4U3RyaW5nKGZvcm1hdFZhbHVlLmdldCgpLCBmb3JtYXRTdHJpbmcpOwotICB9Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgbG9jYWxTdHJpbmc7Ci0gIGlmIChhcmdjID4gMikgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGxvY2FsVmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMik7Ci0gICAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBsb2NhbFZhbHVlLmdldCgpKSkgewotICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIFZhbHVlVG9VVEY4U3RyaW5nKGxvY2FsVmFsdWUuZ2V0KCksIGxvY2FsU3RyaW5nKTsKLSAgfQotCi0gIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPkdldERvY3VtZW50KCk7Ci0gIENYRkFfTG9jYWxlTWdyKiBwTWdyID0gcERvYy0+R2V0TG9jYWxNZ3IoKTsKLSAgSUZYX0xvY2FsZSogcExvY2FsZSA9IG51bGxwdHI7Ci0gIGlmIChsb2NhbFN0cmluZy5Jc0VtcHR5KCkpIHsKLSAgICBDWEZBX05vZGUqIHBUaGlzTm9kZSA9IFRvTm9kZShwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKSk7Ci0gICAgQVNTRVJUKHBUaGlzTm9kZSk7Ci0KLSAgICBDWEZBX1dpZGdldERhdGEgd2lkZ2V0RGF0YShwVGhpc05vZGUpOwotICAgIHBMb2NhbGUgPSB3aWRnZXREYXRhLkdldExvY2FsKCk7Ci0gIH0gZWxzZSB7Ci0gICAgcExvY2FsZSA9IHBNZ3ItPkdldExvY2FsZUJ5TmFtZSgKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGxvY2FsU3RyaW5nLkFzU3RyaW5nQygpKSk7Ci0gIH0KLQotICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdDsKLSAgaWYgKGZvcm1hdFN0cmluZy5Jc0VtcHR5KCkpCi0gICAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0LCB3c0Zvcm1hdCk7Ci0gIGVsc2UKLSAgICB3c0Zvcm1hdCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChmb3JtYXRTdHJpbmcuQXNTdHJpbmdDKCkpOwotCi0gIHdzRm9ybWF0ID0gTCJ0aW1leyIgKyB3c0Zvcm1hdCArIEwifSI7Ci0gIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUoWEZBX1ZUX1RJTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHRpbWVTdHJpbmcuQXNTdHJpbmdDKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzRm9ybWF0LCBwTG9jYWxlLCBwTWdyKTsKLSAgaWYgKCFsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ0ZYX1VuaXRpbWUgdW5pVGltZSA9IGxvY2FsZVZhbHVlLkdldFRpbWUoKTsKLSAgaW50MzJfdCBob3VyID0gdW5pVGltZS5HZXRIb3VyKCk7Ci0gIGludDMyX3QgbWluID0gdW5pVGltZS5HZXRNaW51dGUoKTsKLSAgaW50MzJfdCBzZWNvbmQgPSB1bmlUaW1lLkdldFNlY29uZCgpOwotICBpbnQzMl90IG1pbFNlY29uZCA9IHVuaVRpbWUuR2V0TWlsbGlzZWNvbmQoKTsKLSAgaW50MzJfdCBtaW5zID0gaG91ciAqIDYwICsgbWluOwotCi0gIEZYX1RJTUVaT05FIHR6OwotICBDWEZBX1RpbWVab25lUHJvdmlkZXIgcHJvdmlkZXI7Ci0gIHByb3ZpZGVyLkdldFRpbWVab25lKCZ0eik7Ci0gIG1pbnMgLT0gKHR6LnR6SG91ciAqIDYwKTsKLSAgd2hpbGUgKG1pbnMgPiAxNDQwKQotICAgIG1pbnMgLT0gMTQ0MDsKLQotICB3aGlsZSAobWlucyA8IDApCi0gICAgbWlucyArPSAxNDQwOwotCi0gIGhvdXIgPSBtaW5zIC8gNjA7Ci0gIG1pbiA9IG1pbnMgJSA2MDsKLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKGhvdXIgKiAzNjAwMDAwICsgbWluICogNjAwMDAgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kICogMTAwMCArIG1pbFNlY29uZCArIDEpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlRpbWVGbXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7Ci0gIGlmIChhcmdjID4gMikgewotICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJUaW1lRm10Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW50MzJfdCBpU3R5bGUgPSAwOwotICBpZiAoYXJnYyA+IDApIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdTdHlsZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgICBpZiAoYXJnU3R5bGUtPklzTnVsbCgpKSB7Ci0gICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaVN0eWxlID0gKGludDMyX3QpVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdTdHlsZS5nZXQoKSk7Ci0gICAgaWYgKGlTdHlsZSA+IDQgfHwgaVN0eWxlIDwgMCkKLSAgICAgIGlTdHlsZSA9IDA7Ci0gIH0KLQotICBDRlhfQnl0ZVN0cmluZyBzekxvY2FsOwotICBpZiAoYXJnYyA+IDEpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdMb2NhbCA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKLSAgICBpZiAoYXJnTG9jYWwtPklzTnVsbCgpKSB7Ci0gICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgVmFsdWVUb1VURjhTdHJpbmcoYXJnTG9jYWwuZ2V0KCksIHN6TG9jYWwpOwotICB9Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgZm9ybWF0U3RyOwotICBHZXRTdGFuZGFyZFRpbWVGb3JtYXQocFRoaXMsIGlTdHlsZSwgc3pMb2NhbC5Bc1N0cmluZ0MoKSwgZm9ybWF0U3RyKTsKLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoZm9ybWF0U3RyLkFzU3RyaW5nQygpKTsKLX0KLQotLy8gc3RhdGljCi1ib29sIENYRkFfRk0ySlNDb250ZXh0OjpJc0lzb0RhdGVGb3JtYXQoY29uc3QgRlhfQ0hBUiogcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWWVhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTW9udGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaURheSkgewotICBpWWVhciA9IDA7Ci0gIGlNb250aCA9IDE7Ci0gIGlEYXkgPSAxOwotCi0gIGlmIChpTGVuZ3RoIDwgNCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgRlhfQ0hBUiBzdHJZZWFyWzVdOwotICBzdHJZZWFyWzRdID0gJ1wwJzsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7Ci0gICAgaWYgKHBEYXRhW2ldID4gJzknIHx8IHBEYXRhW2ldIDwgJzAnKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgc3RyWWVhcltpXSA9IHBEYXRhW2ldOwotICB9Ci0gIGlZZWFyID0gRlhTWVNfYXRvaShzdHJZZWFyKTsKLSAgaVN0eWxlID0gMDsKLSAgaWYgKGlMZW5ndGggPT0gNCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpU3R5bGUgPSBwRGF0YVs0XSA9PSAnLScgPyAxIDogMDsKLQotICBGWF9DSEFSIHN0clRlbXBbM107Ci0gIHN0clRlbXBbMl0gPSAnXDAnOwotICBpbnQzMl90IGlQb3NPZmYgPSBpU3R5bGUgPT0gMCA/IDQgOiA1OwotICBpZiAoKHBEYXRhW2lQb3NPZmZdID4gJzknIHx8IHBEYXRhW2lQb3NPZmZdIDwgJzAnKSB8fAotICAgICAgKHBEYXRhW2lQb3NPZmYgKyAxXSA+ICc5JyB8fCBwRGF0YVtpUG9zT2ZmICsgMV0gPCAnMCcpKQotICAgIHJldHVybiBmYWxzZTsKLQotICBzdHJUZW1wWzBdID0gcERhdGFbaVBvc09mZl07Ci0gIHN0clRlbXBbMV0gPSBwRGF0YVtpUG9zT2ZmICsgMV07Ci0gIGlNb250aCA9IEZYU1lTX2F0b2koc3RyVGVtcCk7Ci0gIGlmIChpTW9udGggPiAxMiB8fCBpTW9udGggPCAxKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoaVN0eWxlID09IDApIHsKLSAgICBpUG9zT2ZmICs9IDI7Ci0gICAgaWYgKGlMZW5ndGggPT0gNikKLSAgICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIGlQb3NPZmYgKz0gMzsKLSAgICBpZiAoaUxlbmd0aCA9PSA3KQotICAgICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKChwRGF0YVtpUG9zT2ZmXSA+ICc5JyB8fCBwRGF0YVtpUG9zT2ZmXSA8ICcwJykgfHwKLSAgICAgIChwRGF0YVtpUG9zT2ZmICsgMV0gPiAnOScgfHwgcERhdGFbaVBvc09mZiArIDFdIDwgJzAnKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3RyVGVtcFswXSA9IHBEYXRhW2lQb3NPZmZdOwotICBzdHJUZW1wWzFdID0gcERhdGFbaVBvc09mZiArIDFdOwotICBpRGF5ID0gRlhTWVNfYXRvaShzdHJUZW1wKTsKLSAgaWYgKGlQb3NPZmYgKyAyIDwgaUxlbmd0aCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCghKGlZZWFyICUgNCkgJiYgKGlZZWFyICUgMTAwKSkgfHwgIShpWWVhciAlIDQwMCkpIHsKLSAgICBpZiAoaU1vbnRoID09IDIgJiYgaURheSA+IDI5KQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIGlmIChpTW9udGggPT0gMiAmJiBpRGF5ID4gMjgpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKGlNb250aCAhPSAyKSB7Ci0gICAgaWYgKGlNb250aCA8IDgpIHsKLSAgICAgIGlmIChpRGF5ID4gKGlNb250aCAlIDIgPT0gMCA/IDMwIDogMzEpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIGlmIChpRGF5ID4gKGlNb250aCAlIDIgPT0gMCA/IDMxIDogMzApKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBzdGF0aWMKLWJvb2wgQ1hGQV9GTTJKU0NvbnRleHQ6OklzSXNvVGltZUZvcm1hdChjb25zdCBGWF9DSEFSKiBwRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUhvdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1pbnV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpU2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNaWxsaVNlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWm9uZUhvdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVpvbmVNaW51dGUpIHsKLSAgaUhvdXIgPSAwOwotICBpTWludXRlID0gMDsKLSAgaVNlY29uZCA9IDA7Ci0gIGlNaWxsaVNlY29uZCA9IDA7Ci0gIGlab25lSG91ciA9IDA7Ci0gIGlab25lTWludXRlID0gMDsKLSAgaWYgKCFwRGF0YSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgRlhfQ0hBUiBzdHJUZW1wWzNdOwotICBzdHJUZW1wWzJdID0gJ1wwJzsKLSAgaW50MzJfdCBpWm9uZSA9IDA7Ci0gIGludDMyX3QgaSA9IDA7Ci0gIHdoaWxlIChpIDwgaUxlbmd0aCkgewotICAgIGlmICgocERhdGFbaV0gPiAnOScgfHwgcERhdGFbaV0gPCAnMCcpICYmIHBEYXRhW2ldICE9ICc6JykgewotICAgICAgaVpvbmUgPSBpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgICsraTsKLSAgfQotICBpZiAoaSA9PSBpTGVuZ3RoKQotICAgIGlab25lID0gaUxlbmd0aDsKLQotICBpbnQzMl90IGlQb3MgPSAwOwotICBpbnQzMl90IGlJbmRleCA9IDA7Ci0gIHdoaWxlIChpSW5kZXggPCBpWm9uZSkgewotICAgIGlmIChpSW5kZXggPj0gaVpvbmUpCi0gICAgICBicmVhazsKLQotICAgIGlmIChwRGF0YVtpSW5kZXhdID4gJzknIHx8IHBEYXRhW2lJbmRleF0gPCAnMCcpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBzdHJUZW1wWzBdID0gcERhdGFbaUluZGV4XTsKLSAgICBpZiAocERhdGFbaUluZGV4ICsgMV0gPiAnOScgfHwgcERhdGFbaUluZGV4ICsgMV0gPCAnMCcpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBzdHJUZW1wWzFdID0gcERhdGFbaUluZGV4ICsgMV07Ci0gICAgaWYgKEZYU1lTX2F0b2koc3RyVGVtcCkgPiA2MCkKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGlmIChwRGF0YVsyXSA9PSAnOicpIHsKLSAgICAgIGlmIChpUG9zID09IDApIHsKLSAgICAgICAgaUhvdXIgPSBGWFNZU19hdG9pKHN0clRlbXApOwotICAgICAgICArK2lQb3M7Ci0gICAgICB9IGVsc2UgaWYgKGlQb3MgPT0gMSkgewotICAgICAgICBpTWludXRlID0gRlhTWVNfYXRvaShzdHJUZW1wKTsKLSAgICAgICAgKytpUG9zOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaVNlY29uZCA9IEZYU1lTX2F0b2koc3RyVGVtcCk7Ci0gICAgICB9Ci0gICAgICBpSW5kZXggKz0gMzsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKGlQb3MgPT0gMCkgewotICAgICAgICBpSG91ciA9IEZYU1lTX2F0b2koc3RyVGVtcCk7Ci0gICAgICAgICsraVBvczsKLSAgICAgIH0gZWxzZSBpZiAoaVBvcyA9PSAxKSB7Ci0gICAgICAgIGlNaW51dGUgPSBGWFNZU19hdG9pKHN0clRlbXApOwotICAgICAgICArK2lQb3M7Ci0gICAgICB9IGVsc2UgaWYgKGlQb3MgPT0gMikgewotICAgICAgICBpU2Vjb25kID0gRlhTWVNfYXRvaShzdHJUZW1wKTsKLSAgICAgICAgKytpUG9zOwotICAgICAgfQotICAgICAgaUluZGV4ICs9IDI7Ci0gICAgfQotICB9Ci0gIGlmIChwRGF0YVtpSW5kZXhdID09ICcuJykgewotICAgICsraUluZGV4OwotICAgIEZYX0NIQVIgc3RyU2VjWzRdOwotICAgIHN0clNlY1szXSA9ICdcMCc7Ci0gICAgaWYgKHBEYXRhW2lJbmRleF0gPiAnOScgfHwgcERhdGFbaUluZGV4XSA8ICcwJykKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHN0clNlY1swXSA9IHBEYXRhW2lJbmRleF07Ci0gICAgaWYgKHBEYXRhW2lJbmRleCArIDFdID4gJzknIHx8IHBEYXRhW2lJbmRleCArIDFdIDwgJzAnKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgc3RyU2VjWzFdID0gcERhdGFbaUluZGV4ICsgMV07Ci0gICAgaWYgKHBEYXRhW2lJbmRleCArIDJdID4gJzknIHx8IHBEYXRhW2lJbmRleCArIDJdIDwgJzAnKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgc3RyU2VjWzJdID0gcERhdGFbaUluZGV4ICsgMl07Ci0gICAgaU1pbGxpU2Vjb25kID0gRlhTWVNfYXRvaShzdHJTZWMpOwotICAgIGlmIChpTWlsbGlTZWNvbmQgPiAxMDApIHsKLSAgICAgIGlNaWxsaVNlY29uZCA9IDA7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlJbmRleCArPSAzOwotICB9Ci0gIGlmIChwRGF0YVtpSW5kZXhdID09ICd6JyB8fCBwRGF0YVtpSW5kZXhdID09ICdaJykKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpbnQzMl90IGlTaWduID0gMTsKLSAgaWYgKHBEYXRhW2lJbmRleF0gPT0gJysnKSB7Ci0gICAgKytpSW5kZXg7Ci0gIH0gZWxzZSBpZiAocERhdGFbaUluZGV4XSA9PSAnLScpIHsKLSAgICBpU2lnbiA9IC0xOwotICAgICsraUluZGV4OwotICB9Ci0gIGlQb3MgPSAwOwotICB3aGlsZSAoaUluZGV4IDwgaUxlbmd0aCkgewotICAgIGlmIChpSW5kZXggPj0gaUxlbmd0aCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBpZiAocERhdGFbaUluZGV4XSA+ICc5JyB8fCBwRGF0YVtpSW5kZXhdIDwgJzAnKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgc3RyVGVtcFswXSA9IHBEYXRhW2lJbmRleF07Ci0gICAgaWYgKHBEYXRhW2lJbmRleCArIDFdID4gJzknIHx8IHBEYXRhW2lJbmRleCArIDFdIDwgJzAnKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgc3RyVGVtcFsxXSA9IHBEYXRhW2lJbmRleCArIDFdOwotICAgIGlmIChGWFNZU19hdG9pKHN0clRlbXApID4gNjApCi0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBpZiAocERhdGFbMl0gPT0gJzonKSB7Ci0gICAgICBpZiAoaVBvcyA9PSAwKSB7Ci0gICAgICAgIGlab25lSG91ciA9IEZYU1lTX2F0b2koc3RyVGVtcCk7Ci0gICAgICB9IGVsc2UgaWYgKGlQb3MgPT0gMSkgewotICAgICAgICBpWm9uZU1pbnV0ZSA9IEZYU1lTX2F0b2koc3RyVGVtcCk7Ci0gICAgICB9Ci0gICAgICBpSW5kZXggKz0gMzsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKCFpUG9zKSB7Ci0gICAgICAgIGlab25lSG91ciA9IEZYU1lTX2F0b2koc3RyVGVtcCk7Ci0gICAgICAgICsraVBvczsKLSAgICAgIH0gZWxzZSBpZiAoaVBvcyA9PSAxKSB7Ci0gICAgICAgIGlab25lTWludXRlID0gRlhTWVNfYXRvaShzdHJUZW1wKTsKLSAgICAgICAgKytpUG9zOwotICAgICAgfQotICAgICAgaUluZGV4ICs9IDI7Ci0gICAgfQotICB9Ci0gIGlmIChpSW5kZXggPCBpTGVuZ3RoKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpWm9uZUhvdXIgKj0gaVNpZ247Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBzdGF0aWMKLWJvb2wgQ1hGQV9GTTJKU0NvbnRleHQ6OklzSXNvRGF0ZVRpbWVGb3JtYXQoY29uc3QgRlhfQ0hBUiogcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVllYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNb250aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaURheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUhvdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNaW51dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlTZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNaWxsaW9uU2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWm9uZUhvdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlab25lTWludXRlKSB7Ci0gIGlZZWFyID0gMDsKLSAgaU1vbnRoID0gMDsKLSAgaURheSA9IDA7Ci0gIGlIb3VyID0gMDsKLSAgaU1pbnV0ZSA9IDA7Ci0gIGlTZWNvbmQgPSAwOwotICBpZiAoIXBEYXRhKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbnQzMl90IGlJbmRleCA9IDA7Ci0gIHdoaWxlIChwRGF0YVtpSW5kZXhdICE9ICdUJyAmJiBwRGF0YVtpSW5kZXhdICE9ICd0JykgewotICAgIGlmIChpSW5kZXggPj0gaUxlbmd0aCkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICArK2lJbmRleDsKLSAgfQotICBpZiAoaUluZGV4ICE9IDggJiYgaUluZGV4ICE9IDEwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpbnQzMl90IGlTdHlsZSA9IC0xOwotICBpZiAoIUlzSXNvRGF0ZUZvcm1hdChwRGF0YSwgaUluZGV4LCBpU3R5bGUsIGlZZWFyLCBpTW9udGgsIGlEYXkpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHBEYXRhW2lJbmRleF0gIT0gJ1QnICYmIHBEYXRhW2lJbmRleF0gIT0gJ3QnKQotICAgIHJldHVybiB0cnVlOwotCi0gICsraUluZGV4OwotICBpZiAoKChpTGVuZ3RoIC0gaUluZGV4ID4gMTMpICYmIChpTGVuZ3RoIC0gaUluZGV4IDwgNikpICYmCi0gICAgICAoaUxlbmd0aCAtIGlJbmRleCAhPSAxNSkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAoIUlzSXNvVGltZUZvcm1hdChwRGF0YSArIGlJbmRleCwgaUxlbmd0aCAtIGlJbmRleCwgaUhvdXIsIGlNaW51dGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGlTZWNvbmQsIGlNaWxsaW9uU2Vjb25kLCBpWm9uZUhvdXIsIGlab25lTWludXRlKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vLyBzdGF0aWMKLWJvb2wgQ1hGQV9GTTJKU0NvbnRleHQ6OkxvY2FsMklzb0RhdGUoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekRhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHJJc29EYXRlKSB7Ci0gIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPkdldERvY3VtZW50KCk7Ci0gIGlmICghcERvYykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1hGQV9Mb2NhbGVNZ3IqIHBNZ3IgPSBwRG9jLT5HZXRMb2NhbE1ncigpOwotICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gbnVsbHB0cjsKLSAgaWYgKHN6TG9jYWxlLklzRW1wdHkoKSkgewotICAgIENYRkFfTm9kZSogcFRoaXNOb2RlID0gVG9Ob2RlKHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpKTsKLSAgICBBU1NFUlQocFRoaXNOb2RlKTsKLQotICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKHBUaGlzTm9kZSk7Ci0gICAgcExvY2FsZSA9IHdpZGdldERhdGEuR2V0TG9jYWwoKTsKLSAgfSBlbHNlIHsKLSAgICBwTG9jYWxlID0gcE1nci0+R2V0TG9jYWxlQnlOYW1lKENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekxvY2FsZSkpOwotICB9Ci0gIGlmICghcExvY2FsZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXQ7Ci0gIGlmIChzekZvcm1hdC5Jc0VtcHR5KCkpCi0gICAgcExvY2FsZS0+R2V0RGF0ZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0LCB3c0Zvcm1hdCk7Ci0gIGVsc2UKLSAgICB3c0Zvcm1hdCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzekZvcm1hdCk7Ci0KLSAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZShYRkFfVlRfREFURSwgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6RGF0ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NGb3JtYXQsIHBMb2NhbGUsIHBNZ3IpOwotICBDRlhfVW5pdGltZSBkdCA9IHdpZGdldFZhbHVlLkdldERhdGUoKTsKLSAgc3RySXNvRGF0ZS5Gb3JtYXQoIiU0ZC0lMDJkLSUwMmQiLCBkdC5HZXRZZWFyKCksIGR0LkdldE1vbnRoKCksIGR0LkdldERheSgpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBDWEZBX0ZNMkpTQ29udGV4dDo6TG9jYWwySXNvVGltZShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6VGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0cklzb1RpbWUpIHsKLSAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+R2V0RG9jdW1lbnQoKTsKLSAgaWYgKCFwRG9jKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDWEZBX0xvY2FsZU1nciogcE1nciA9IHBEb2MtPkdldExvY2FsTWdyKCk7Ci0gIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBudWxscHRyOwotICBpZiAoc3pMb2NhbGUuSXNFbXB0eSgpKSB7Ci0gICAgQ1hGQV9Ob2RlKiBwVGhpc05vZGUgPSBUb05vZGUocERvYy0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRUaGlzT2JqZWN0KCkpOwotICAgIEFTU0VSVChwVGhpc05vZGUpOwotCi0gICAgQ1hGQV9XaWRnZXREYXRhIHdpZGdldERhdGEocFRoaXNOb2RlKTsKLSAgICBwTG9jYWxlID0gd2lkZ2V0RGF0YS5HZXRMb2NhbCgpOwotICB9IGVsc2UgewotICAgIHBMb2NhbGUgPSBwTWdyLT5HZXRMb2NhbGVCeU5hbWUoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6TG9jYWxlKSk7Ci0gIH0KLSAgaWYgKCFwTG9jYWxlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdDsKLSAgaWYgKHN6Rm9ybWF0LklzRW1wdHkoKSkKLSAgICBwTG9jYWxlLT5HZXRUaW1lUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHQsIHdzRm9ybWF0KTsKLSAgZWxzZQotICAgIHdzRm9ybWF0ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6Rm9ybWF0KTsKLQotICB3c0Zvcm1hdCA9IEwidGltZXsiICsgd3NGb3JtYXQgKyBMIn0iOwotICBDWEZBX0xvY2FsZVZhbHVlIHdpZGdldFZhbHVlKFhGQV9WVF9USU1FLCBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pUaW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0Zvcm1hdCwgcExvY2FsZSwgcE1ncik7Ci0gIENGWF9Vbml0aW1lIHV0aW1lID0gd2lkZ2V0VmFsdWUuR2V0VGltZSgpOwotICBzdHJJc29UaW1lLkZvcm1hdCgiJTAyZDolMDJkOiUwMmQuJTAzZCIsIHV0aW1lLkdldEhvdXIoKSwgdXRpbWUuR2V0TWludXRlKCksCi0gICAgICAgICAgICAgICAgICAgIHV0aW1lLkdldFNlY29uZCgpLCB1dGltZS5HZXRNaWxsaXNlY29uZCgpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBDWEZBX0ZNMkpTQ29udGV4dDo6SXNvRGF0ZTJMb2NhbChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0ckxvY2FsRGF0ZSkgewotICBDWEZBX0RvY3VtZW50KiBwRG9jID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5HZXREb2N1bWVudCgpOwotICBpZiAoIXBEb2MpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENYRkFfTG9jYWxlTWdyKiBwTWdyID0gcERvYy0+R2V0TG9jYWxNZ3IoKTsKLSAgSUZYX0xvY2FsZSogcExvY2FsZSA9IG51bGxwdHI7Ci0gIGlmIChzekxvY2FsZS5Jc0VtcHR5KCkpIHsKLSAgICBDWEZBX05vZGUqIHBUaGlzTm9kZSA9IFRvTm9kZShwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKSk7Ci0gICAgQVNTRVJUKHBUaGlzTm9kZSk7Ci0gICAgQ1hGQV9XaWRnZXREYXRhIHdpZGdldERhdGEocFRoaXNOb2RlKTsKLSAgICBwTG9jYWxlID0gd2lkZ2V0RGF0YS5HZXRMb2NhbCgpOwotICB9IGVsc2UgewotICAgIHBMb2NhbGUgPSBwTWdyLT5HZXRMb2NhbGVCeU5hbWUoQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6TG9jYWxlKSk7Ci0gIH0KLSAgaWYgKCFwTG9jYWxlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdDsKLSAgaWYgKHN6Rm9ybWF0LklzRW1wdHkoKSkKLSAgICBwTG9jYWxlLT5HZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHQsIHdzRm9ybWF0KTsKLSAgZWxzZQotICAgIHdzRm9ybWF0ID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6Rm9ybWF0KTsKLQotICBDWEZBX0xvY2FsZVZhbHVlIHdpZGdldFZhbHVlKFhGQV9WVF9EQVRFLCBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pEYXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWdyKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NSZXQ7Ci0gIHdpZGdldFZhbHVlLkZvcm1hdFBhdHRlcm5zKHdzUmV0LCB3c0Zvcm1hdCwgcExvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsKLSAgc3RyTG9jYWxEYXRlID0gd3NSZXQuVVRGOEVuY29kZSgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gc3RhdGljCi1ib29sIENYRkFfRk0ySlNDb250ZXh0OjpJc29UaW1lMkxvY2FsKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyTG9jYWxUaW1lKSB7Ci0gIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPkdldERvY3VtZW50KCk7Ci0gIGlmICghcERvYykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1hGQV9Mb2NhbGVNZ3IqIHBNZ3IgPSBwRG9jLT5HZXRMb2NhbE1ncigpOwotICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gbnVsbHB0cjsKLSAgaWYgKHN6TG9jYWxlLklzRW1wdHkoKSkgewotICAgIENYRkFfTm9kZSogcFRoaXNOb2RlID0gVG9Ob2RlKHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpKTsKLSAgICBBU1NFUlQocFRoaXNOb2RlKTsKLSAgICBDWEZBX1dpZGdldERhdGEgd2lkZ2V0RGF0YShwVGhpc05vZGUpOwotICAgIHBMb2NhbGUgPSB3aWRnZXREYXRhLkdldExvY2FsKCk7Ci0gIH0gZWxzZSB7Ci0gICAgcExvY2FsZSA9IHBNZ3ItPkdldExvY2FsZUJ5TmFtZShDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pMb2NhbGUpKTsKLSAgfQotICBpZiAoIXBMb2NhbGUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0OwotICBpZiAoc3pGb3JtYXQuSXNFbXB0eSgpKQotICAgIHBMb2NhbGUtPkdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRGVmYXVsdCwgd3NGb3JtYXQpOwotICBlbHNlCi0gICAgd3NGb3JtYXQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pGb3JtYXQpOwotCi0gIHdzRm9ybWF0ID0gTCJ0aW1leyIgKyB3c0Zvcm1hdCArIEwifSI7Ci0gIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUoWEZBX1ZUX1RJTUUsIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelRpbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZ3IpOwotICBDRlhfV2lkZVN0cmluZyB3c1JldDsKLSAgd2lkZ2V0VmFsdWUuRm9ybWF0UGF0dGVybnMod3NSZXQsIHdzRm9ybWF0LCBwTG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOwotICBzdHJMb2NhbFRpbWUgPSB3c1JldC5VVEY4RW5jb2RlKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBzdGF0aWMKLWJvb2wgQ1hGQV9GTTJKU0NvbnRleHQ6OkdldEdNVFRpbWUoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHJHTVRUaW1lKSB7Ci0gIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPkdldERvY3VtZW50KCk7Ci0gIGlmICghcERvYykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1hGQV9Mb2NhbGVNZ3IqIHBNZ3IgPSBwRG9jLT5HZXRMb2NhbE1ncigpOwotICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gbnVsbHB0cjsKLSAgaWYgKHN6TG9jYWxlLklzRW1wdHkoKSkgewotICAgIENYRkFfTm9kZSogcFRoaXNOb2RlID0gVG9Ob2RlKHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpKTsKLSAgICBBU1NFUlQocFRoaXNOb2RlKTsKLSAgICBDWEZBX1dpZGdldERhdGEgd2lkZ2V0RGF0YShwVGhpc05vZGUpOwotICAgIHBMb2NhbGUgPSB3aWRnZXREYXRhLkdldExvY2FsKCk7Ci0gIH0gZWxzZSB7Ci0gICAgcExvY2FsZSA9IHBNZ3ItPkdldExvY2FsZUJ5TmFtZShDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pMb2NhbGUpKTsKLSAgfQotICBpZiAoIXBMb2NhbGUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0OwotICBpZiAoc3pGb3JtYXQuSXNFbXB0eSgpKQotICAgIHBMb2NhbGUtPkdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRGVmYXVsdCwgd3NGb3JtYXQpOwotICBlbHNlCi0gICAgd3NGb3JtYXQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pGb3JtYXQpOwotCi0gIHdzRm9ybWF0ID0gTCJ0aW1leyIgKyB3c0Zvcm1hdCArIEwifSI7Ci0gIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUoWEZBX1ZUX1RJTUUsIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelRpbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZ3IpOwotICBDRlhfV2lkZVN0cmluZyB3c1JldDsKLSAgd2lkZ2V0VmFsdWUuRm9ybWF0UGF0dGVybnMod3NSZXQsIHdzRm9ybWF0LCBwTG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfVkFMVUVQSUNUVVJFX0Rpc3BsYXkpOwotICBzdHJHTVRUaW1lID0gd3NSZXQuVVRGOEVuY29kZSgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gc3RhdGljCi1pbnQzMl90IENYRkFfRk0ySlNDb250ZXh0OjpEYXRlU3RyaW5nMk51bShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RGF0ZVN0cmluZykgewotICBpbnQzMl90IGlMZW5ndGggPSBzekRhdGVTdHJpbmcuR2V0TGVuZ3RoKCk7Ci0gIGludDMyX3QgaVllYXIgPSAwOwotICBpbnQzMl90IGlNb250aCA9IDA7Ci0gIGludDMyX3QgaURheSA9IDA7Ci0gIGlmIChpTGVuZ3RoIDw9IDEwKSB7Ci0gICAgaW50MzJfdCBpU3R5bGUgPSAtMTsKLSAgICBpZiAoIUlzSXNvRGF0ZUZvcm1hdChzekRhdGVTdHJpbmcuY19zdHIoKSwgaUxlbmd0aCwgaVN0eWxlLCBpWWVhciwgaU1vbnRoLAotICAgICAgICAgICAgICAgICAgICAgICAgIGlEYXkpKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaW50MzJfdCBpSG91ciA9IDA7Ci0gICAgaW50MzJfdCBpTWludXRlID0gMDsKLSAgICBpbnQzMl90IGlTZWNvbmQgPSAwOwotICAgIGludDMyX3QgaU1pbGxpU2Vjb25kID0gMDsKLSAgICBpbnQzMl90IGlab25lSG91ciA9IDA7Ci0gICAgaW50MzJfdCBpWm9uZU1pbnV0ZSA9IDA7Ci0gICAgaWYgKCFJc0lzb0RhdGVUaW1lRm9ybWF0KHN6RGF0ZVN0cmluZy5jX3N0cigpLCBpTGVuZ3RoLCBpWWVhciwgaU1vbnRoLCBpRGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpSG91ciwgaU1pbnV0ZSwgaVNlY29uZCwgaU1pbGxpU2Vjb25kLCBpWm9uZUhvdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlab25lTWludXRlKSkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0KLSAgRlhfRkxPQVQgZERheXMgPSAwOwotICBpbnQzMl90IGkgPSAxOwotICBpZiAoaVllYXIgPCAxOTAwKQotICAgIHJldHVybiAwOwotCi0gIHdoaWxlIChpWWVhciAtIGkgPj0gMTkwMCkgewotICAgIGREYXlzICs9Ci0gICAgICAgICgoISgoaVllYXIgLSBpKSAlIDQpICYmICgoaVllYXIgLSBpKSAlIDEwMCkpIHx8ICEoKGlZZWFyIC0gaSkgJSA0MDApKQotICAgICAgICAgICAgPyAzNjYKLSAgICAgICAgICAgIDogMzY1OwotICAgICsraTsKLSAgfQotICBpID0gMTsKLSAgd2hpbGUgKGkgPCBpTW9udGgpIHsKLSAgICBpZiAoaSA9PSAyKQotICAgICAgZERheXMgKz0gKCghKGlZZWFyICUgNCkgJiYgKGlZZWFyICUgMTAwKSkgfHwgIShpWWVhciAlIDQwMCkpID8gMjkgOiAyODsKLSAgICBlbHNlIGlmIChpIDw9IDcpCi0gICAgICBkRGF5cyArPSAoaSAlIDIgPT0gMCkgPyAzMCA6IDMxOwotICAgIGVsc2UKLSAgICAgIGREYXlzICs9IChpICUgMiA9PSAwKSA/IDMxIDogMzA7Ci0KLSAgICArK2k7Ci0gIH0KLSAgaSA9IDA7Ci0gIHdoaWxlIChpRGF5IC0gaSA+IDApIHsKLSAgICBkRGF5cyArPSAxOwotICAgICsraTsKLSAgfQotICByZXR1cm4gKGludDMyX3QpZERheXM7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6R2V0TG9jYWxEYXRlRm9ybWF0KENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHJGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3RhbmRhcmQpIHsKLSAgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBzdHJTdHlsZTsKLSAgc3dpdGNoIChpU3R5bGUpIHsKLSAgICBjYXNlIDE6Ci0gICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTG9uZzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgIHN0clN0eWxlID0gRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9GdWxsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAwOgotICAgIGNhc2UgMjoKLSAgICBkZWZhdWx0OgotICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPkdldERvY3VtZW50KCk7Ci0gIGlmICghcERvYykKLSAgICByZXR1cm47Ci0KLSAgSUZYX0xvY2FsZSogcExvY2FsZSA9IG51bGxwdHI7Ci0gIGlmIChzekxvY2FsU3RyLklzRW1wdHkoKSkgewotICAgIENYRkFfTm9kZSogcFRoaXNOb2RlID0gVG9Ob2RlKHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpKTsKLSAgICBBU1NFUlQocFRoaXNOb2RlKTsKLQotICAgIENYRkFfV2lkZ2V0RGF0YSB3aWRnZXREYXRhKHBUaGlzTm9kZSk7Ci0gICAgcExvY2FsZSA9IHdpZGdldERhdGEuR2V0TG9jYWwoKTsKLSAgfSBlbHNlIHsKLSAgICBwTG9jYWxlID0gcERvYy0+R2V0TG9jYWxNZ3IoKS0+R2V0TG9jYWxlQnlOYW1lKAotICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pMb2NhbFN0cikpOwotICB9Ci0gIGlmICghcExvY2FsZSkKLSAgICByZXR1cm47Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgc3RyUmV0OwotICBwTG9jYWxlLT5HZXREYXRlUGF0dGVybihzdHJTdHlsZSwgc3RyUmV0KTsKLSAgaWYgKCFiU3RhbmRhcmQpIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbHM7Ci0gICAgcExvY2FsZS0+R2V0RGF0ZVRpbWVTeW1ib2xzKHdzU3ltYm9scyk7Ci0gICAgQWx0ZXJuYXRlRGF0ZVRpbWVTeW1ib2xzKHN0clJldCwgd3NTeW1ib2xzLCBnX3NBbHRUYWJsZV9EYXRlKTsKLSAgfQotICBzdHJGb3JtYXQgPSBzdHJSZXQuVVRGOEVuY29kZSgpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkdldExvY2FsVGltZUZvcm1hdChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbFN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0YW5kYXJkKSB7Ci0gIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgc3RyU3R5bGU7Ci0gIHN3aXRjaCAoaVN0eWxlKSB7Ci0gICAgY2FzZSAxOgotICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAzOgotICAgICAgc3RyU3R5bGUgPSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0xvbmc7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDQ6Ci0gICAgICBzdHJTdHlsZSA9IEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMDoKLSAgICBjYXNlIDI6Ci0gICAgZGVmYXVsdDoKLSAgICAgIHN0clN0eWxlID0gRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW07Ci0gICAgICBicmVhazsKLSAgfQotICBDWEZBX0RvY3VtZW50KiBwRG9jID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5HZXREb2N1bWVudCgpOwotICBpZiAoIXBEb2MpCi0gICAgcmV0dXJuOwotCi0gIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBudWxscHRyOwotICBpZiAoc3pMb2NhbFN0ci5Jc0VtcHR5KCkpIHsKLSAgICBDWEZBX05vZGUqIHBUaGlzTm9kZSA9IFRvTm9kZShwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCktPkdldFRoaXNPYmplY3QoKSk7Ci0gICAgQVNTRVJUKHBUaGlzTm9kZSk7Ci0KLSAgICBDWEZBX1dpZGdldERhdGEgd2lkZ2V0RGF0YShwVGhpc05vZGUpOwotICAgIHBMb2NhbGUgPSB3aWRnZXREYXRhLkdldExvY2FsKCk7Ci0gIH0gZWxzZSB7Ci0gICAgcExvY2FsZSA9IHBEb2MtPkdldExvY2FsTWdyKCktPkdldExvY2FsZUJ5TmFtZSgKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6TG9jYWxTdHIpKTsKLSAgfQotICBpZiAoIXBMb2NhbGUpCi0gICAgcmV0dXJuOwotCi0gIENGWF9XaWRlU3RyaW5nIHN0clJldDsKLSAgcExvY2FsZS0+R2V0VGltZVBhdHRlcm4oc3RyU3R5bGUsIHN0clJldCk7Ci0gIGlmICghYlN0YW5kYXJkKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NTeW1ib2xzOwotICAgIHBMb2NhbGUtPkdldERhdGVUaW1lU3ltYm9scyh3c1N5bWJvbHMpOwotICAgIEFsdGVybmF0ZURhdGVUaW1lU3ltYm9scyhzdHJSZXQsIHdzU3ltYm9scywgZ19zQWx0VGFibGVfVGltZSk7Ci0gIH0KLSAgc3RyRm9ybWF0ID0gc3RyUmV0LlVURjhFbmNvZGUoKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpHZXRTdGFuZGFyZERhdGVGb3JtYXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0ckZvcm1hdCkgewotICBHZXRMb2NhbERhdGVGb3JtYXQocFRoaXMsIGlTdHlsZSwgc3pMb2NhbFN0ciwgc3RyRm9ybWF0LCB0cnVlKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpHZXRTdGFuZGFyZFRpbWVGb3JtYXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0ckZvcm1hdCkgewotICBHZXRMb2NhbFRpbWVGb3JtYXQocFRoaXMsIGlTdHlsZSwgc3pMb2NhbFN0ciwgc3RyRm9ybWF0LCB0cnVlKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpOdW0yQWxsVGltZShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiR00sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyVGltZSkgewotICBpbnQzMl90IGlIb3VyID0gMDsKLSAgaW50MzJfdCBpTWluID0gMDsKLSAgaW50MzJfdCBpU2VjID0gMDsKLSAgaUhvdXIgPSBzdGF0aWNfY2FzdDxpbnQ+KGlUaW1lKSAvIDM2MDAwMDA7Ci0gIGlNaW4gPSAoc3RhdGljX2Nhc3Q8aW50PihpVGltZSkgLSBpSG91ciAqIDM2MDAwMDApIC8gNjAwMDA7Ci0gIGlTZWMgPSAoc3RhdGljX2Nhc3Q8aW50PihpVGltZSkgLSBpSG91ciAqIDM2MDAwMDAgLSBpTWluICogNjAwMDApIC8gMTAwMDsKLQotICBpZiAoIWJHTSkgewotICAgIGludDMyX3QgaVpvbmVIb3VyID0gMDsKLSAgICBpbnQzMl90IGlab25lTWluID0gMDsKLSAgICBpbnQzMl90IGlab25lU2VjID0gMDsKLSAgICBHZXRMb2NhbFRpbWVab25lKGlab25lSG91ciwgaVpvbmVNaW4sIGlab25lU2VjKTsKLSAgICBpSG91ciArPSBpWm9uZUhvdXI7Ci0gICAgaU1pbiArPSBpWm9uZU1pbjsKLSAgICBpU2VjICs9IGlab25lU2VjOwotICB9Ci0KLSAgYm9vbCBpUmV0ID0gZmFsc2U7Ci0gIENGWF9CeXRlU3RyaW5nIHN0cklzb1RpbWU7Ci0gIHN0cklzb1RpbWUuRm9ybWF0KCIlMDJkOiUwMmQ6JTAyZCIsIGlIb3VyLCBpTWluLCBpU2VjKTsKLSAgaWYgKGJHTSkgewotICAgIGlSZXQgPQotICAgICAgICBHZXRHTVRUaW1lKHBUaGlzLCBzdHJJc29UaW1lLkFzU3RyaW5nQygpLCBzekZvcm1hdCwgc3pMb2NhbGUsIHN0clRpbWUpOwotICB9IGVsc2UgewotICAgIGlSZXQgPSBJc29UaW1lMkxvY2FsKHBUaGlzLCBzdHJJc29UaW1lLkFzU3RyaW5nQygpLCBzekZvcm1hdCwgc3pMb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RyVGltZSk7Ci0gIH0KLSAgaWYgKCFpUmV0KQotICAgIHN0clRpbWUgPSAiIjsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpHZXRMb2NhbFRpbWVab25lKGludDMyX3QmIGlIb3VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpU2VjKSB7Ci0gIHRpbWVfdCBub3c7Ci0gIHRpbWUoJm5vdyk7Ci0KLSAgc3RydWN0IHRtKiBwR210ID0gZ210aW1lKCZub3cpOwotICBzdHJ1Y3QgdG0qIHBMb2NhbCA9IGxvY2FsdGltZSgmbm93KTsKLSAgaUhvdXIgPSBwTG9jYWwtPnRtX2hvdXIgLSBwR210LT50bV9ob3VyOwotICBpTWluID0gcExvY2FsLT50bV9taW4gLSBwR210LT50bV9taW47Ci0gIGlTZWMgPSBwTG9jYWwtPnRtX3NlYyAtIHBHbXQtPnRtX3NlYzsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpBcHIoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cik7Ci0gIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDMpIHsKLSAgICBwQ29udGV4dC0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJBcHIiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1R3byA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVGhyZWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMik7Ci0gIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgYXJnT25lLmdldCgpKSB8fCBWYWx1ZUlzTnVsbChwVGhpcywgYXJnVHdvLmdldCgpKSB8fAotICAgICAgVmFsdWVJc051bGwocFRoaXMsIGFyZ1RocmVlLmdldCgpKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEZYX0RPVUJMRSBuUHJpbmNpcGFsID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnT25lLmdldCgpKTsKLSAgRlhfRE9VQkxFIG5QYXltZW50ID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnVHdvLmdldCgpKTsKLSAgRlhfRE9VQkxFIG5QZXJpb2RzID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnVGhyZWUuZ2V0KCkpOwotICBpZiAoblByaW5jaXBhbCA8PSAwIHx8IG5QYXltZW50IDw9IDAgfHwgblBlcmlvZHMgPD0gMCkgewotICAgIHBDb250ZXh0LT5UaHJvd0FyZ3VtZW50TWlzbWF0Y2hFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBGWF9ET1VCTEUgciA9Ci0gICAgICAyICogKG5QZXJpb2RzICogblBheW1lbnQgLSBuUHJpbmNpcGFsKSAvIChuUGVyaW9kcyAqIG5QcmluY2lwYWwpOwotICBGWF9ET1VCTEUgblRlbXAgPSAxOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuUGVyaW9kczsgKytpKQotICAgIG5UZW1wICo9ICgxICsgcik7Ci0KLSAgRlhfRE9VQkxFIG5SZXQgPSByICogblRlbXAgLyAoblRlbXAgLSAxKSAtIG5QYXltZW50IC8gblByaW5jaXBhbDsKLSAgd2hpbGUgKGZhYnMoblJldCkgPiBrRmluYW5jaWFsUHJlY2lzaW9uKSB7Ci0gICAgRlhfRE9VQkxFIG5EZXJpdmF0aXZlID0KLSAgICAgICAgKChuVGVtcCArIHIgKiBuUGVyaW9kcyAqIChuVGVtcCAvICgxICsgcikpKSAqIChuVGVtcCAtIDEpIC0KLSAgICAgICAgIChyICogblRlbXAgKiBuUGVyaW9kcyAqIChuVGVtcCAvICgxICsgcikpKSkgLwotICAgICAgICAoKG5UZW1wIC0gMSkgKiAoblRlbXAgLSAxKSk7Ci0gICAgaWYgKG5EZXJpdmF0aXZlID09IDApIHsKLSAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHIgPSByIC0gblJldCAvIG5EZXJpdmF0aXZlOwotICAgIG5UZW1wID0gMTsKLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBuUGVyaW9kczsgKytpKSB7Ci0gICAgICBuVGVtcCAqPSAoMSArIHIpOwotICAgIH0KLSAgICBuUmV0ID0gciAqIG5UZW1wIC8gKG5UZW1wIC0gMSkgLSBuUGF5bWVudCAvIG5QcmluY2lwYWw7Ci0gIH0KLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXREb3VibGUociAqIDEyKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpDVGVybShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cik7Ci0gIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDMpIHsKLSAgICBwQ29udGV4dC0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJDVGVybSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVHdvID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdUaHJlZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAyKTsKLSAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdPbmUuZ2V0KCkpIHx8IFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdUd28uZ2V0KCkpIHx8Ci0gICAgICBWYWx1ZUlzTnVsbChwVGhpcywgYXJnVGhyZWUuZ2V0KCkpKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRlhfRkxPQVQgblJhdGUgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ09uZS5nZXQoKSk7Ci0gIEZYX0ZMT0FUIG5GdXR1cmVWYWx1ZSA9IFZhbHVlVG9GbG9hdChwVGhpcywgYXJnVHdvLmdldCgpKTsKLSAgRlhfRkxPQVQgbkluaXRBbW91bnQgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ1RocmVlLmdldCgpKTsKLSAgaWYgKChuUmF0ZSA8PSAwKSB8fCAobkZ1dHVyZVZhbHVlIDw9IDApIHx8IChuSW5pdEFtb3VudCA8PSAwKSkgewotICAgIHBDb250ZXh0LT5UaHJvd0FyZ3VtZW50TWlzbWF0Y2hFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEZsb2F0KAotICAgICAgRlhTWVNfbG9nKChGWF9GTE9BVCkobkZ1dHVyZVZhbHVlIC8gbkluaXRBbW91bnQpKSAvCi0gICAgICBGWFNZU19sb2coKEZYX0ZMT0FUKSgxICsgblJhdGUpKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RlYoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOwotICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAzKSB7Ci0gICAgcENvbnRleHQtPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiRlYiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1R3byA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVGhyZWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMik7Ci0gIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgYXJnT25lLmdldCgpKSB8fCBWYWx1ZUlzTnVsbChwVGhpcywgYXJnVHdvLmdldCgpKSB8fAotICAgICAgVmFsdWVJc051bGwocFRoaXMsIGFyZ1RocmVlLmdldCgpKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEZYX0RPVUJMRSBuQW1vdW50ID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnT25lLmdldCgpKTsKLSAgRlhfRE9VQkxFIG5SYXRlID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnVHdvLmdldCgpKTsKLSAgRlhfRE9VQkxFIG5QZXJpb2QgPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBhcmdUaHJlZS5nZXQoKSk7Ci0gIGlmICgoblJhdGUgPCAwKSB8fCAoblBlcmlvZCA8PSAwKSB8fCAobkFtb3VudCA8PSAwKSkgewotICAgIHBDb250ZXh0LT5UaHJvd0FyZ3VtZW50TWlzbWF0Y2hFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBGWF9ET1VCTEUgZFJlc3VsdCA9IDA7Ci0gIGlmIChuUmF0ZSkgewotICAgIEZYX0RPVUJMRSBuVGVtcCA9IDE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuUGVyaW9kOyArK2kpIHsKLSAgICAgIG5UZW1wICo9IDEgKyBuUmF0ZTsKLSAgICB9Ci0gICAgZFJlc3VsdCA9IG5BbW91bnQgKiAoblRlbXAgLSAxKSAvIG5SYXRlOwotICB9IGVsc2UgewotICAgIGRSZXN1bHQgPSBuQW1vdW50ICogblBlcmlvZDsKLSAgfQotCi0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0RG91YmxlKGRSZXN1bHQpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OklQbXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKLSAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gNSkgewotICAgIHBDb250ZXh0LT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIklQbXQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1R3byA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVGhyZWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMik7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ0ZvdXIgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMyk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ0ZpdmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgNCk7Ci0gIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgYXJnT25lLmdldCgpKSB8fCBWYWx1ZUlzTnVsbChwVGhpcywgYXJnVHdvLmdldCgpKSB8fAotICAgICAgVmFsdWVJc051bGwocFRoaXMsIGFyZ1RocmVlLmdldCgpKSB8fCBWYWx1ZUlzTnVsbChwVGhpcywgYXJnRm91ci5nZXQoKSkgfHwKLSAgICAgIFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdGaXZlLmdldCgpKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEZYX0ZMT0FUIG5QcmluY2lwYWxBbW91bnQgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ09uZS5nZXQoKSk7Ci0gIEZYX0ZMT0FUIG5SYXRlID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdUd28uZ2V0KCkpOwotICBGWF9GTE9BVCBuUGF5bWVudCA9IFZhbHVlVG9GbG9hdChwVGhpcywgYXJnVGhyZWUuZ2V0KCkpOwotICBGWF9GTE9BVCBuRmlyc3RNb250aCA9IFZhbHVlVG9GbG9hdChwVGhpcywgYXJnRm91ci5nZXQoKSk7Ci0gIEZYX0ZMT0FUIG5OdW1iZXJPZk1vbnRocyA9IFZhbHVlVG9GbG9hdChwVGhpcywgYXJnRml2ZS5nZXQoKSk7Ci0gIGlmICgoblByaW5jaXBhbEFtb3VudCA8PSAwKSB8fCAoblJhdGUgPD0gMCkgfHwgKG5QYXltZW50IDw9IDApIHx8Ci0gICAgICAobkZpcnN0TW9udGggPCAwKSB8fCAobk51bWJlck9mTW9udGhzIDwgMCkpIHsKLSAgICBwQ29udGV4dC0+VGhyb3dBcmd1bWVudE1pc21hdGNoRXhjZXB0aW9uKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRlhfRkxPQVQgblJhdGVPZk1vbnRoID0gblJhdGUgLyAxMjsKLSAgaW50MzJfdCBpTnVtcyA9IChpbnQzMl90KSgKLSAgICAgIChGWFNZU19sb2cxMCgoRlhfRkxPQVQpKG5QYXltZW50IC8gblByaW5jaXBhbEFtb3VudCkpIC0KLSAgICAgICBGWFNZU19sb2cxMCgoRlhfRkxPQVQpKG5QYXltZW50IC8gblByaW5jaXBhbEFtb3VudCAtIG5SYXRlT2ZNb250aCkpKSAvCi0gICAgICBGWFNZU19sb2cxMCgoRlhfRkxPQVQpKDEgKyBuUmF0ZU9mTW9udGgpKSk7Ci0gIGludDMyX3QgaUVuZCA9IHN0ZDo6bWluKChpbnQzMl90KShuRmlyc3RNb250aCArIG5OdW1iZXJPZk1vbnRocyAtIDEpLCBpTnVtcyk7Ci0KLSAgaWYgKG5QYXltZW50IDwgblByaW5jaXBhbEFtb3VudCAqIG5SYXRlT2ZNb250aCkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0RmxvYXQoMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW50MzJfdCBpID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IG5GaXJzdE1vbnRoIC0gMTsgKytpKQotICAgIG5QcmluY2lwYWxBbW91bnQgLT0gblBheW1lbnQgLSBuUHJpbmNpcGFsQW1vdW50ICogblJhdGVPZk1vbnRoOwotCi0gIEZYX0ZMT0FUIG5TdW0gPSAwOwotICBmb3IgKDsgaSA8IGlFbmQ7ICsraSkgewotICAgIG5TdW0gKz0gblByaW5jaXBhbEFtb3VudCAqIG5SYXRlT2ZNb250aDsKLSAgICBuUHJpbmNpcGFsQW1vdW50IC09IG5QYXltZW50IC0gblByaW5jaXBhbEFtb3VudCAqIG5SYXRlT2ZNb250aDsKLSAgfQotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEZsb2F0KG5TdW0pOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Ok5QVihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKLSAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKLSAgaWYgKGFyZ2MgPCAzKSB7Ci0gICAgcENvbnRleHQtPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiTlBWIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4+IGFyZ1ZhbHVlczsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7Ci0gICAgYXJnVmFsdWVzLnB1c2hfYmFjayhHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgaSkpOwotICAgIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgYXJnVmFsdWVzW2ldLmdldCgpKSkgewotICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgRlhfRE9VQkxFIG5SYXRlID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnVmFsdWVzWzBdLmdldCgpKTsKLSAgaWYgKG5SYXRlIDw9IDApIHsKLSAgICBwQ29udGV4dC0+VGhyb3dBcmd1bWVudE1pc21hdGNoRXhjZXB0aW9uKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8RlhfRE9VQkxFPiBkYXRhKGFyZ2MgLSAxKTsKLSAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgYXJnYzsgaSsrKQotICAgIGRhdGEucHVzaF9iYWNrKFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ1ZhbHVlc1tpXS5nZXQoKSkpOwotCi0gIEZYX0RPVUJMRSBuU3VtID0gMDsKLSAgaW50MzJfdCBpSW5kZXggPSAwOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcmdjIC0gMTsgaSsrKSB7Ci0gICAgRlhfRE9VQkxFIG5UZW1wID0gMTsKLSAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPD0gaTsgaisrKQotICAgICAgblRlbXAgKj0gMSArIG5SYXRlOwotCi0gICAgRlhfRE9VQkxFIG5OdW0gPSBkYXRhW2lJbmRleCsrXTsKLSAgICBuU3VtICs9IG5OdW0gLyBuVGVtcDsKLSAgfQotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldERvdWJsZShuU3VtKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpQbXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cik7Ci0gIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDMpIHsKLSAgICBwQ29udGV4dC0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJQbXQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1R3byA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVGhyZWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMik7Ci0gIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgYXJnT25lLmdldCgpKSB8fCBWYWx1ZUlzTnVsbChwVGhpcywgYXJnVHdvLmdldCgpKSB8fAotICAgICAgVmFsdWVJc051bGwocFRoaXMsIGFyZ1RocmVlLmdldCgpKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEZYX0ZMT0FUIG5QcmluY2lwYWwgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ09uZS5nZXQoKSk7Ci0gIEZYX0ZMT0FUIG5SYXRlID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdUd28uZ2V0KCkpOwotICBGWF9GTE9BVCBuUGVyaW9kcyA9IFZhbHVlVG9GbG9hdChwVGhpcywgYXJnVGhyZWUuZ2V0KCkpOwotICBpZiAoKG5QcmluY2lwYWwgPD0gMCkgfHwgKG5SYXRlIDw9IDApIHx8IChuUGVyaW9kcyA8PSAwKSkgewotICAgIHBDb250ZXh0LT5UaHJvd0FyZ3VtZW50TWlzbWF0Y2hFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBGWF9GTE9BVCBuVG1wID0gMSArIG5SYXRlOwotICBGWF9GTE9BVCBuU3VtID0gblRtcDsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgblBlcmlvZHMgLSAxOyArK2kpCi0gICAgblN1bSAqPSBuVG1wOwotCi0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0RmxvYXQoKG5QcmluY2lwYWwgKiBuUmF0ZSAqIG5TdW0pIC8gKG5TdW0gLSAxKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UFBtdChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOwotICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSA1KSB7Ci0gICAgcENvbnRleHQtPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiUFBtdCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVHdvID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdUaHJlZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAyKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnRm91ciA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAzKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnRml2ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCA0KTsKLSAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdPbmUuZ2V0KCkpIHx8IFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdUd28uZ2V0KCkpIHx8Ci0gICAgICBWYWx1ZUlzTnVsbChwVGhpcywgYXJnVGhyZWUuZ2V0KCkpIHx8IFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdGb3VyLmdldCgpKSB8fAotICAgICAgVmFsdWVJc051bGwocFRoaXMsIGFyZ0ZpdmUuZ2V0KCkpKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRlhfRkxPQVQgblByaW5jaXBhbEFtb3VudCA9IFZhbHVlVG9GbG9hdChwVGhpcywgYXJnT25lLmdldCgpKTsKLSAgRlhfRkxPQVQgblJhdGUgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ1R3by5nZXQoKSk7Ci0gIEZYX0ZMT0FUIG5QYXltZW50ID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdUaHJlZS5nZXQoKSk7Ci0gIEZYX0ZMT0FUIG5GaXJzdE1vbnRoID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdGb3VyLmdldCgpKTsKLSAgRlhfRkxPQVQgbk51bWJlck9mTW9udGhzID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdGaXZlLmdldCgpKTsKLSAgaWYgKChuUHJpbmNpcGFsQW1vdW50IDw9IDApIHx8IChuUmF0ZSA8PSAwKSB8fCAoblBheW1lbnQgPD0gMCkgfHwKLSAgICAgIChuRmlyc3RNb250aCA8IDApIHx8IChuTnVtYmVyT2ZNb250aHMgPCAwKSkgewotICAgIHBDb250ZXh0LT5UaHJvd0FyZ3VtZW50TWlzbWF0Y2hFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBGWF9GTE9BVCBuUmF0ZU9mTW9udGggPSBuUmF0ZSAvIDEyOwotICBpbnQzMl90IGlOdW1zID0gKGludDMyX3QpKAotICAgICAgKEZYU1lTX2xvZzEwKChGWF9GTE9BVCkoblBheW1lbnQgLyBuUHJpbmNpcGFsQW1vdW50KSkgLQotICAgICAgIEZYU1lTX2xvZzEwKChGWF9GTE9BVCkoblBheW1lbnQgLyBuUHJpbmNpcGFsQW1vdW50IC0gblJhdGVPZk1vbnRoKSkpIC8KLSAgICAgIEZYU1lTX2xvZzEwKChGWF9GTE9BVCkoMSArIG5SYXRlT2ZNb250aCkpKTsKLSAgaW50MzJfdCBpRW5kID0gc3RkOjptaW4oKGludDMyX3QpKG5GaXJzdE1vbnRoICsgbk51bWJlck9mTW9udGhzIC0gMSksIGlOdW1zKTsKLSAgaWYgKG5QYXltZW50IDwgblByaW5jaXBhbEFtb3VudCAqIG5SYXRlT2ZNb250aCkgewotICAgIHBDb250ZXh0LT5UaHJvd0FyZ3VtZW50TWlzbWF0Y2hFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbnQzMl90IGkgPSAwOwotICBmb3IgKGkgPSAwOyBpIDwgbkZpcnN0TW9udGggLSAxOyArK2kpCi0gICAgblByaW5jaXBhbEFtb3VudCAtPSBuUGF5bWVudCAtIG5QcmluY2lwYWxBbW91bnQgKiBuUmF0ZU9mTW9udGg7Ci0KLSAgRlhfRkxPQVQgblRlbXAgPSAwOwotICBGWF9GTE9BVCBuU3VtID0gMDsKLSAgZm9yICg7IGkgPCBpRW5kOyArK2kpIHsKLSAgICBuVGVtcCA9IG5QYXltZW50IC0gblByaW5jaXBhbEFtb3VudCAqIG5SYXRlT2ZNb250aDsKLSAgICBuU3VtICs9IG5UZW1wOwotICAgIG5QcmluY2lwYWxBbW91bnQgLT0gblRlbXA7Ci0gIH0KLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRGbG9hdChuU3VtKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpQVihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cik7Ci0gIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDMpIHsKLSAgICBwQ29udGV4dC0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJQViIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVHdvID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdUaHJlZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAyKTsKLSAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdPbmUuZ2V0KCkpIHx8IFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdUd28uZ2V0KCkpIHx8Ci0gICAgICBWYWx1ZUlzTnVsbChwVGhpcywgYXJnVGhyZWUuZ2V0KCkpKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRlhfRE9VQkxFIG5BbW91bnQgPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBhcmdPbmUuZ2V0KCkpOwotICBGWF9ET1VCTEUgblJhdGUgPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBhcmdUd28uZ2V0KCkpOwotICBGWF9ET1VCTEUgblBlcmlvZCA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ1RocmVlLmdldCgpKTsKLSAgaWYgKChuQW1vdW50IDw9IDApIHx8IChuUmF0ZSA8IDApIHx8IChuUGVyaW9kIDw9IDApKSB7Ci0gICAgcENvbnRleHQtPlRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEZYX0RPVUJMRSBuVGVtcCA9IDE7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5QZXJpb2Q7ICsraSkKLSAgICBuVGVtcCAqPSAxICsgblJhdGU7Ci0KLSAgblRlbXAgPSAxIC8gblRlbXA7Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0RG91YmxlKG5BbW91bnQgKiAoKDEgLSBuVGVtcCkgLyBuUmF0ZSkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlJhdGUoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKLSAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMykgewotICAgIHBDb250ZXh0LT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIlJhdGUiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1R3byA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVGhyZWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMik7Ci0gIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgYXJnT25lLmdldCgpKSB8fCBWYWx1ZUlzTnVsbChwVGhpcywgYXJnVHdvLmdldCgpKSB8fAotICAgICAgVmFsdWVJc051bGwocFRoaXMsIGFyZ1RocmVlLmdldCgpKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEZYX0ZMT0FUIG5GdXR1cmUgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ09uZS5nZXQoKSk7Ci0gIEZYX0ZMT0FUIG5QcmVzZW50ID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdUd28uZ2V0KCkpOwotICBGWF9GTE9BVCBuVG90YWxOdW1iZXIgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ1RocmVlLmdldCgpKTsKLSAgaWYgKChuRnV0dXJlIDw9IDApIHx8IChuUHJlc2VudCA8IDApIHx8IChuVG90YWxOdW1iZXIgPD0gMCkpIHsKLSAgICBwQ29udGV4dC0+VGhyb3dBcmd1bWVudE1pc21hdGNoRXhjZXB0aW9uKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRGbG9hdCgKLSAgICAgIEZYU1lTX3BvdygoRlhfRkxPQVQpKG5GdXR1cmUgLyBuUHJlc2VudCksIChGWF9GTE9BVCkoMSAvIG5Ub3RhbE51bWJlcikpIC0KLSAgICAgIDEpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlRlcm0oQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKLSAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMykgewotICAgIHBDb250ZXh0LT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIlRlcm0iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1R3byA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVGhyZWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMik7Ci0gIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgYXJnT25lLmdldCgpKSB8fCBWYWx1ZUlzTnVsbChwVGhpcywgYXJnVHdvLmdldCgpKSB8fAotICAgICAgVmFsdWVJc051bGwocFRoaXMsIGFyZ1RocmVlLmdldCgpKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEZYX0ZMT0FUIG5Nb3VudCA9IFZhbHVlVG9GbG9hdChwVGhpcywgYXJnT25lLmdldCgpKTsKLSAgRlhfRkxPQVQgblJhdGUgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ1R3by5nZXQoKSk7Ci0gIEZYX0ZMT0FUIG5GdXR1cmUgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ1RocmVlLmdldCgpKTsKLSAgaWYgKChuTW91bnQgPD0gMCkgfHwgKG5SYXRlIDw9IDApIHx8IChuRnV0dXJlIDw9IDApKSB7Ci0gICAgcENvbnRleHQtPlRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0RmxvYXQoCi0gICAgICBGWFNZU19sb2coKEZYX0ZMT0FUKShuRnV0dXJlIC8gbk1vdW50ICogblJhdGUpICsgMSkgLwotICAgICAgRlhTWVNfbG9nKChGWF9GTE9BVCkoMSArIG5SYXRlKSkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkNob29zZShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKLSAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKLSAgaWYgKGFyZ2MgPCAyKSB7Ci0gICAgcENvbnRleHQtPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiQ2hvb3NlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gYXJncy5HZXRWYWx1ZSgwKTsKLSAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdPbmUuZ2V0KCkpKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW50MzJfdCBpSW5kZXggPSAoaW50MzJfdClWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ09uZS5nZXQoKSk7Ci0gIGlmIChpSW5kZXggPCAxKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoIiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJvb2wgYkZvdW5kID0gZmFsc2U7Ci0gIGJvb2wgYlN0b3BDb3VudGVyRmxhZ3MgPSBmYWxzZTsKLSAgaW50MzJfdCBpQXJnSW5kZXggPSAxOwotICBpbnQzMl90IGlWYWx1ZUluZGV4ID0gMDsKLSAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsKLSAgd2hpbGUgKCFiRm91bmQgJiYgIWJTdG9wQ291bnRlckZsYWdzICYmIChpQXJnSW5kZXggPCBhcmdjKSkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ0luZGV4VmFsdWUgPSBhcmdzLkdldFZhbHVlKGlBcmdJbmRleCk7Ci0gICAgaWYgKGFyZ0luZGV4VmFsdWUtPklzQXJyYXkoKSkgewotICAgICAgYXV0byBsZW5ndGhWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKLSAgICAgIGFyZ0luZGV4VmFsdWUtPkdldE9iamVjdFByb3BlcnR5KCJsZW5ndGgiLCBsZW5ndGhWYWx1ZS5nZXQoKSk7Ci0gICAgICBpbnQzMl90IGlMZW5ndGggPSBsZW5ndGhWYWx1ZS0+VG9JbnRlZ2VyKCk7Ci0gICAgICBpZiAoaUxlbmd0aCA+IDMpCi0gICAgICAgIGJTdG9wQ291bnRlckZsYWdzID0gdHJ1ZTsKLQotICAgICAgaVZhbHVlSW5kZXggKz0gKGlMZW5ndGggLSAyKTsKLSAgICAgIGlmIChpVmFsdWVJbmRleCA+PSBpSW5kZXgpIHsKLSAgICAgICAgYXV0byBwcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICAgICAgICBhdXRvIGpzT2JqZWN0VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgICAgIGF1dG8gbmV3UHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKLSAgICAgICAgYXJnSW5kZXhWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgxLCBwcm9wZXJ0eVZhbHVlLmdldCgpKTsKLSAgICAgICAgYXJnSW5kZXhWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgKLSAgICAgICAgICAgIChpTGVuZ3RoIC0gMSkgLSAoaVZhbHVlSW5kZXggLSBpSW5kZXgpLCBqc09iamVjdFZhbHVlLmdldCgpKTsKLSAgICAgICAgaWYgKHByb3BlcnR5VmFsdWUtPklzTnVsbCgpKSB7Ci0gICAgICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzT2JqZWN0VmFsdWUuZ2V0KCksIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGpzT2JqZWN0VmFsdWUtPkdldE9iamVjdFByb3BlcnR5KAotICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlLT5Ub1N0cmluZygpLkFzU3RyaW5nQygpLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKLSAgICAgICAgfQotICAgICAgICBDRlhfQnl0ZVN0cmluZyBic0Nob29zZWQ7Ci0gICAgICAgIFZhbHVlVG9VVEY4U3RyaW5nKG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCksIGJzQ2hvb3NlZCk7Ci0gICAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKGJzQ2hvb3NlZC5Bc1N0cmluZ0MoKSk7Ci0gICAgICAgIGJGb3VuZCA9IHRydWU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlWYWx1ZUluZGV4Kys7Ci0gICAgICBpZiAoaVZhbHVlSW5kZXggPT0gaUluZGV4KSB7Ci0gICAgICAgIENGWF9CeXRlU3RyaW5nIGJzQ2hvb3NlZDsKLSAgICAgICAgVmFsdWVUb1VURjhTdHJpbmcoYXJnSW5kZXhWYWx1ZS5nZXQoKSwgYnNDaG9vc2VkKTsKLSAgICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoYnNDaG9vc2VkLkFzU3RyaW5nQygpKTsKLSAgICAgICAgYkZvdW5kID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaUFyZ0luZGV4Kys7Ci0gIH0KLSAgaWYgKCFiRm91bmQpCi0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoIiIpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkV4aXN0cyhDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDEpIHsKLSAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiRXhpc3RzIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcihhcmdzLkdldFZhbHVlKDApLT5Jc09iamVjdCgpKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpIYXNWYWx1ZShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAxKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIkhhc1ZhbHVlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBpZiAoIWFyZ09uZS0+SXNTdHJpbmcoKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcihhcmdPbmUtPklzTnVtYmVyKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnT25lLT5Jc0Jvb2xlYW4oKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgdmFsdWVTdHIgPSBhcmdPbmUtPlRvU3RyaW5nKCk7Ci0gIHZhbHVlU3RyLlRyaW1MZWZ0KCk7Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcighdmFsdWVTdHIuSXNFbXB0eSgpKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpPbmVvZihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBpZiAoYXJncy5HZXRMZW5ndGgoKSA8IDIpIHsKLSAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiT25lb2YiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBib29sIGJGbGFncyA9IGZhbHNlOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+PiBwYXJhbWV0ZXJWYWx1ZXM7Ci0gIHVuZm9sZEFyZ3MocFRoaXMsIGFyZ3MsICZwYXJhbWV0ZXJWYWx1ZXMsIDEpOwotICBmb3IgKGNvbnN0IGF1dG8mIHZhbHVlIDogcGFyYW1ldGVyVmFsdWVzKSB7Ci0gICAgaWYgKHNpbXBsZVZhbHVlQ29tcGFyZShwVGhpcywgYXJnT25lLmdldCgpLCB2YWx1ZS5nZXQoKSkpIHsKLSAgICAgIGJGbGFncyA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoYkZsYWdzKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpXaXRoaW4oQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAzKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIldpdGhpbiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgaWYgKGFyZ09uZS0+SXNOdWxsKCkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFVuZGVmaW5lZCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ0xvdyA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnSGlnaCA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAyKTsKLSAgaWYgKGFyZ09uZS0+SXNOdW1iZXIoKSkgewotICAgIEZYX0ZMT0FUIG9uZU51bWJlciA9IFZhbHVlVG9GbG9hdChwVGhpcywgYXJnT25lLmdldCgpKTsKLSAgICBGWF9GTE9BVCBsb3dOdW1iZXIgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ0xvdy5nZXQoKSk7Ci0gICAgRlhfRkxPQVQgaGVpZ2h0TnVtYmVyID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdIaWdoLmdldCgpKTsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoKG9uZU51bWJlciA+PSBsb3dOdW1iZXIpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbmVOdW1iZXIgPD0gaGVpZ2h0TnVtYmVyKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgb25lU3RyaW5nOwotICBDRlhfQnl0ZVN0cmluZyBsb3dTdHJpbmc7Ci0gIENGWF9CeXRlU3RyaW5nIGhlaWdodFN0cmluZzsKLSAgVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLmdldCgpLCBvbmVTdHJpbmcpOwotICBWYWx1ZVRvVVRGOFN0cmluZyhhcmdMb3cuZ2V0KCksIGxvd1N0cmluZyk7Ci0gIFZhbHVlVG9VVEY4U3RyaW5nKGFyZ0hpZ2guZ2V0KCksIGhlaWdodFN0cmluZyk7Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcigKLSAgICAgIChvbmVTdHJpbmcuQ29tcGFyZShsb3dTdHJpbmcuQXNTdHJpbmdDKCkpID49IDApICYmCi0gICAgICAob25lU3RyaW5nLkNvbXBhcmUoaGVpZ2h0U3RyaW5nLkFzU3RyaW5nQygpKSA8PSAwKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6SWYoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMykgewotICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJJZiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+QXNzaWduKEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKS0+VG9Cb29sZWFuKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpLmdldCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAyKS5nZXQoKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RXZhbChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOwotICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAxKSB7Ci0gICAgcENvbnRleHQtPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiRXZhbCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IHNjcmlwdFZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBDRlhfQnl0ZVN0cmluZyB1dGY4U2NyaXB0U3RyaW5nOwotICBWYWx1ZVRvVVRGOFN0cmluZyhzY3JpcHRWYWx1ZS5nZXQoKSwgdXRmOFNjcmlwdFN0cmluZyk7Ci0gIGlmICh1dGY4U2NyaXB0U3RyaW5nLklzRW1wdHkoKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENGWF9XaWRlVGV4dEJ1ZiB3c0phdmFTY3JpcHRCdWY7Ci0gIENGWF9XaWRlU3RyaW5nIHdzRXJyb3I7Ci0gIENYRkFfRk0ySlNDb250ZXh0OjpUcmFuc2xhdGUoCi0gICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgodXRmOFNjcmlwdFN0cmluZy5Bc1N0cmluZ0MoKSkuQXNTdHJpbmdDKCksCi0gICAgICB3c0phdmFTY3JpcHRCdWYsIHdzRXJyb3IpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX0NvbnRleHQ+IHBOZXdDb250ZXh0KAotICAgICAgQ0ZYSlNFX0NvbnRleHQ6OkNyZWF0ZShwSXNvbGF0ZSwgbnVsbHB0ciwgbnVsbHB0cikpOwotCi0gIGF1dG8gcmV0dXJuVmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gIHBOZXdDb250ZXh0LT5FeGVjdXRlU2NyaXB0KEZYX1VURjhFbmNvZGUod3NKYXZhU2NyaXB0QnVmLkFzU3RyaW5nQygpKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZS5nZXQoKSk7Ci0KLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5Bc3NpZ24ocmV0dXJuVmFsdWUuZ2V0KCkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlJlZihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKLSAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsKLSAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMSkgewotICAgIHBDb250ZXh0LT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIlJlZiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IGFyZ3MuR2V0VmFsdWUoMCk7Ci0gIGlmICghYXJnT25lLT5Jc0FycmF5KCkgJiYgIWFyZ09uZS0+SXNPYmplY3QoKSAmJiAhYXJnT25lLT5Jc0Jvb2xlYW4oKSAmJgotICAgICAgIWFyZ09uZS0+SXNTdHJpbmcoKSAmJiAhYXJnT25lLT5Jc051bGwoKSAmJiAhYXJnT25lLT5Jc051bWJlcigpKSB7Ci0gICAgcENvbnRleHQtPlRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChhcmdPbmUtPklzQm9vbGVhbigpIHx8IGFyZ09uZS0+SXNTdHJpbmcoKSB8fCBhcmdPbmUtPklzTnVtYmVyKCkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPkFzc2lnbihhcmdPbmUuZ2V0KCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+PiB2YWx1ZXM7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDM7IGkrKykKLSAgICB2YWx1ZXMucHVzaF9iYWNrKHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKSk7Ci0KLSAgaW50IGludFZhbCA9IDM7Ci0gIGlmIChhcmdPbmUtPklzTnVsbCgpKSB7Ci0gICAgLy8gVE9ETyhkc2luY2xhaXIpOiBXaHkgaXMgdGhpcyA0IHdoZW4gdGhlIG90aGVycyBhcmUgYWxsIDM/Ci0gICAgaW50VmFsID0gNDsKLSAgICB2YWx1ZXNbMl0tPlNldE51bGwoKTsKLSAgfSBlbHNlIGlmIChhcmdPbmUtPklzQXJyYXkoKSkgewotI2lmbmRlZiBOREVCVUcKLSAgICBhdXRvIGxlbmd0aFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICAgIGFyZ09uZS0+R2V0T2JqZWN0UHJvcGVydHkoImxlbmd0aCIsIGxlbmd0aFZhbHVlLmdldCgpKTsKLSAgICBBU1NFUlQobGVuZ3RoVmFsdWUtPlRvSW50ZWdlcigpID49IDMpOwotI2VuZGlmCi0KLSAgICBhdXRvIHByb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgYXV0byBqc09iamVjdFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICAgIGFyZ09uZS0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgxLCBwcm9wZXJ0eVZhbHVlLmdldCgpKTsKLSAgICBhcmdPbmUtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMiwganNPYmplY3RWYWx1ZS5nZXQoKSk7Ci0gICAgaWYgKCFwcm9wZXJ0eVZhbHVlLT5Jc051bGwoKSB8fCBqc09iamVjdFZhbHVlLT5Jc051bGwoKSkgewotICAgICAgcENvbnRleHQtPlRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHZhbHVlc1syXS0+QXNzaWduKGpzT2JqZWN0VmFsdWUuZ2V0KCkpOwotICB9IGVsc2UgaWYgKGFyZ09uZS0+SXNPYmplY3QoKSkgewotICAgIHZhbHVlc1syXS0+QXNzaWduKGFyZ09uZS5nZXQoKSk7Ci0gIH0KLQotICB2YWx1ZXNbMF0tPlNldEludGVnZXIoaW50VmFsKTsKLSAgdmFsdWVzWzFdLT5TZXROdWxsKCk7Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0QXJyYXkodmFsdWVzKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpVbml0VHlwZShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAxKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIlVuaXRUeXBlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gdW5pdHNwYW5WYWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgaWYgKHVuaXRzcGFuVmFsdWUtPklzTnVsbCgpKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgdW5pdHNwYW5TdHJpbmc7Ci0gIFZhbHVlVG9VVEY4U3RyaW5nKHVuaXRzcGFuVmFsdWUuZ2V0KCksIHVuaXRzcGFuU3RyaW5nKTsKLSAgaWYgKHVuaXRzcGFuU3RyaW5nLklzRW1wdHkoKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKCJpbiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGVudW0gWEZBX0ZNMkpTX1ZBTFVFVFlQRV9QYXJzZXJTdGF0dXMgewotICAgIFZBTFVFVFlQRV9TVEFSVCwKLSAgICBWQUxVRVRZUEVfSEFWRUlOVkFMSURDSEFSLAotICAgIFZBTFVFVFlQRV9IQVZFRElHSVQsCi0gICAgVkFMVUVUWVBFX0hBVkVESUdJVFdISVRFLAotICAgIFZBTFVFVFlQRV9JU0NNLAotICAgIFZBTFVFVFlQRV9JU01NLAotICAgIFZBTFVFVFlQRV9JU1BULAotICAgIFZBTFVFVFlQRV9JU01QLAotICAgIFZBTFVFVFlQRV9JU0lOLAotICB9OwotICB1bml0c3BhblN0cmluZy5NYWtlTG93ZXIoKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NUeXBlU3RyaW5nID0KLSAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOCh1bml0c3BhblN0cmluZy5Bc1N0cmluZ0MoKSk7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwRGF0YSA9IHdzVHlwZVN0cmluZy5jX3N0cigpOwotICBpbnQzMl90IHUgPSAwOwotICBpbnQzMl90IHVMZW4gPSB3c1R5cGVTdHJpbmcuR2V0TGVuZ3RoKCk7Ci0gIHdoaWxlIChJc1doaXRlc3BhY2UocERhdGFbdV0pKQotICAgIHUrKzsKLQotICBYRkFfRk0ySlNfVkFMVUVUWVBFX1BhcnNlclN0YXR1cyBlUGFyc2VyU3RhdHVzID0gVkFMVUVUWVBFX1NUQVJUOwotICBGWF9XQ0hBUiB0eXBlQ2hhcjsKLSAgLy8gVE9ETyhkc2luY2xhaXIpOiBDbGVhbnVwIHRoaXMgcGFyc2VyLCBmaWd1cmUgb3V0IHdoYXQgdGhlIHZhcmlvdXMgY2hlY2tzCi0gIC8vICAgIGFyZSBmb3IuCi0gIHdoaWxlICh1IDwgdUxlbikgewotICAgIHR5cGVDaGFyID0gcERhdGFbdV07Ci0gICAgaWYgKElzV2hpdGVzcGFjZSh0eXBlQ2hhcikpIHsKLSAgICAgIGlmIChlUGFyc2VyU3RhdHVzICE9IFZBTFVFVFlQRV9IQVZFRElHSVQgJiYKLSAgICAgICAgICBlUGFyc2VyU3RhdHVzICE9IFZBTFVFVFlQRV9IQVZFRElHSVRXSElURSkgewotICAgICAgICBlUGFyc2VyU3RhdHVzID0gVkFMVUVUWVBFX0lTSU47Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZVBhcnNlclN0YXR1cyA9IFZBTFVFVFlQRV9IQVZFRElHSVRXSElURTsKLSAgICB9IGVsc2UgaWYgKCh0eXBlQ2hhciA+PSAnMCcgJiYgdHlwZUNoYXIgPD0gJzknKSB8fCB0eXBlQ2hhciA9PSAnLScgfHwKLSAgICAgICAgICAgICAgIHR5cGVDaGFyID09ICcuJykgewotICAgICAgaWYgKGVQYXJzZXJTdGF0dXMgPT0gVkFMVUVUWVBFX0hBVkVESUdJVFdISVRFKSB7Ci0gICAgICAgIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfSVNJTjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlUGFyc2VyU3RhdHVzID0gVkFMVUVUWVBFX0hBVkVESUdJVDsKLSAgICB9IGVsc2UgaWYgKCh0eXBlQ2hhciA9PSAnYycgfHwgdHlwZUNoYXIgPT0gJ3AnKSAmJiAodSArIDEgPCB1TGVuKSkgewotICAgICAgRlhfV0NIQVIgbmV4dENoYXIgPSBwRGF0YVt1ICsgMV07Ci0gICAgICBpZiAoKGVQYXJzZXJTdGF0dXMgPT0gVkFMVUVUWVBFX1NUQVJUIHx8Ci0gICAgICAgICAgIGVQYXJzZXJTdGF0dXMgPT0gVkFMVUVUWVBFX0hBVkVESUdJVCB8fAotICAgICAgICAgICBlUGFyc2VyU3RhdHVzID09IFZBTFVFVFlQRV9IQVZFRElHSVRXSElURSkgJiYKLSAgICAgICAgICAobmV4dENoYXIgPiAnOScgfHwgbmV4dENoYXIgPCAnMCcpICYmIG5leHRDaGFyICE9ICcuJyAmJgotICAgICAgICAgIG5leHRDaGFyICE9ICctJykgewotICAgICAgICBlUGFyc2VyU3RhdHVzID0gKHR5cGVDaGFyID09ICdjJykgPyBWQUxVRVRZUEVfSVNDTSA6IFZBTFVFVFlQRV9JU1BUOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfSEFWRUlOVkFMSURDSEFSOwotICAgIH0gZWxzZSBpZiAodHlwZUNoYXIgPT0gJ20nICYmICh1ICsgMSA8IHVMZW4pKSB7Ci0gICAgICBGWF9XQ0hBUiBuZXh0Q2hhciA9IHBEYXRhW3UgKyAxXTsKLSAgICAgIGlmICgoZVBhcnNlclN0YXR1cyA9PSBWQUxVRVRZUEVfU1RBUlQgfHwKLSAgICAgICAgICAgZVBhcnNlclN0YXR1cyA9PSBWQUxVRVRZUEVfSEFWRURJR0lUIHx8Ci0gICAgICAgICAgIGVQYXJzZXJTdGF0dXMgPT0gVkFMVUVUWVBFX0hBVkVESUdJVFdISVRFKSAmJgotICAgICAgICAgIChuZXh0Q2hhciA+ICc5JyB8fCBuZXh0Q2hhciA8ICcwJykgJiYgbmV4dENoYXIgIT0gJy4nICYmCi0gICAgICAgICAgbmV4dENoYXIgIT0gJy0nKSB7Ci0gICAgICAgIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfSVNNTTsKLSAgICAgICAgaWYgKG5leHRDaGFyID09ICdwJyB8fCAoKHUgKyA1IDwgdUxlbikgJiYgcERhdGFbdSArIDFdID09ICdpJyAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVt1ICsgMl0gPT0gJ2wnICYmIHBEYXRhW3UgKyAzXSA9PSAnbCcgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGFbdSArIDRdID09ICdpJyAmJiBwRGF0YVt1ICsgNV0gPT0gJ3AnKSkgewotICAgICAgICAgIGVQYXJzZXJTdGF0dXMgPSBWQUxVRVRZUEVfSVNNUDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZVBhcnNlclN0YXR1cyA9IFZBTFVFVFlQRV9IQVZFSU5WQUxJRENIQVI7Ci0gICAgfQotICAgIHUrKzsKLSAgfQotICBzd2l0Y2ggKGVQYXJzZXJTdGF0dXMpIHsKLSAgICBjYXNlIFZBTFVFVFlQRV9JU0NNOgotICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoImNtIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFZBTFVFVFlQRV9JU01NOgotICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoIm1tIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFZBTFVFVFlQRV9JU1BUOgotICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoInB0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFZBTFVFVFlQRV9JU01QOgotICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoIm1wIik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoImluIik7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlVuaXRWYWx1ZShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7Ci0gIGlmIChhcmdjIDwgMSB8fCBhcmdjID4gMikgewotICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJVbml0VmFsdWUiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiB1bml0c3BhblZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBpZiAodW5pdHNwYW5WYWx1ZS0+SXNOdWxsKCkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDRlhfQnl0ZVN0cmluZyB1bml0c3BhblN0cmluZzsKLSAgVmFsdWVUb1VURjhTdHJpbmcodW5pdHNwYW5WYWx1ZS5nZXQoKSwgdW5pdHNwYW5TdHJpbmcpOwotICBjb25zdCBGWF9DSEFSKiBwRGF0YSA9IHVuaXRzcGFuU3RyaW5nLmNfc3RyKCk7Ci0gIGlmICghcERhdGEpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW50MzJfdCB1ID0gMDsKLSAgd2hpbGUgKElzV2hpdGVzcGFjZShwRGF0YVt1XSkpCi0gICAgKyt1OwotCi0gIHdoaWxlICh1IDwgdW5pdHNwYW5TdHJpbmcuR2V0TGVuZ3RoKCkpIHsKLSAgICBpZiAoKHBEYXRhW3VdID4gJzknIHx8IHBEYXRhW3VdIDwgJzAnKSAmJiBwRGF0YVt1XSAhPSAnLicgJiYKLSAgICAgICAgcERhdGFbdV0gIT0gJy0nKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgKyt1OwotICB9Ci0KLSAgRlhfQ0hBUiogcFRlbXAgPSBudWxscHRyOwotICBGWF9ET1VCTEUgZEZpcnN0TnVtYmVyID0gc3RydG9kKHBEYXRhLCAmcFRlbXApOwotICB3aGlsZSAoSXNXaGl0ZXNwYWNlKHBEYXRhW3VdKSkKLSAgICArK3U7Ci0KLSAgaW50MzJfdCB1TGVuID0gdW5pdHNwYW5TdHJpbmcuR2V0TGVuZ3RoKCk7Ci0gIENGWF9CeXRlU3RyaW5nIHN0ckZpcnN0VW5pdDsKLSAgd2hpbGUgKHUgPCB1TGVuKSB7Ci0gICAgaWYgKHBEYXRhW3VdID09ICcgJykKLSAgICAgIGJyZWFrOwotCi0gICAgc3RyRmlyc3RVbml0ICs9IHBEYXRhW3VdOwotICAgICsrdTsKLSAgfQotICBzdHJGaXJzdFVuaXQuTWFrZUxvd2VyKCk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgc3RyVW5pdDsKLSAgaWYgKGFyZ2MgPiAxKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gdW5pdFZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOwotICAgIENGWF9CeXRlU3RyaW5nIHVuaXRUZW1wU3RyaW5nOwotICAgIFZhbHVlVG9VVEY4U3RyaW5nKHVuaXRWYWx1ZS5nZXQoKSwgdW5pdFRlbXBTdHJpbmcpOwotICAgIGNvbnN0IEZYX0NIQVIqIHBDaGFyID0gdW5pdFRlbXBTdHJpbmcuY19zdHIoKTsKLSAgICBpbnQzMl90IHVWYWwgPSAwOwotICAgIHdoaWxlIChJc1doaXRlc3BhY2UocENoYXJbdVZhbF0pKQotICAgICAgKyt1VmFsOwotCi0gICAgd2hpbGUgKHVWYWwgPCB1bml0VGVtcFN0cmluZy5HZXRMZW5ndGgoKSkgewotICAgICAgaWYgKChwQ2hhclt1VmFsXSA+ICc5JyB8fCBwQ2hhclt1VmFsXSA8ICcwJykgJiYgcENoYXJbdVZhbF0gIT0gJy4nKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgKyt1VmFsOwotICAgIH0KLSAgICB3aGlsZSAoSXNXaGl0ZXNwYWNlKHBDaGFyW3VWYWxdKSkKLSAgICAgICsrdVZhbDsKLQotICAgIGludDMyX3QgdVZhbExlbiA9IHVuaXRUZW1wU3RyaW5nLkdldExlbmd0aCgpOwotICAgIHdoaWxlICh1VmFsIDwgdVZhbExlbikgewotICAgICAgaWYgKHBDaGFyW3VWYWxdID09ICcgJykKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIHN0clVuaXQgKz0gcENoYXJbdVZhbF07Ci0gICAgICArK3VWYWw7Ci0gICAgfQotICAgIHN0clVuaXQuTWFrZUxvd2VyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyVW5pdCA9IHN0ckZpcnN0VW5pdDsKLSAgfQotCi0gIEZYX0RPVUJMRSBkUmVzdWx0ID0gMDsKLSAgaWYgKHN0ckZpcnN0VW5pdCA9PSAiaW4iIHx8IHN0ckZpcnN0VW5pdCA9PSAiaW5jaGVzIikgewotICAgIGlmIChzdHJVbml0ID09ICJtbSIgfHwgc3RyVW5pdCA9PSAibWlsbGltZXRlcnMiKQotICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAqIDI1LjQ7Ci0gICAgZWxzZSBpZiAoc3RyVW5pdCA9PSAiY20iIHx8IHN0clVuaXQgPT0gImNlbnRpbWV0ZXJzIikKLSAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgKiAyLjU0OwotICAgIGVsc2UgaWYgKHN0clVuaXQgPT0gInB0IiB8fCBzdHJVbml0ID09ICJwb2ludHMiKQotICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDcyOwotICAgIGVsc2UgaWYgKHN0clVuaXQgPT0gIm1wIiB8fCBzdHJVbml0ID09ICJtaWxsaXBvaW50cyIpCi0gICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gNzIwMDA7Ci0gICAgZWxzZQotICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlcjsKLSAgfSBlbHNlIGlmIChzdHJGaXJzdFVuaXQgPT0gIm1tIiB8fCBzdHJGaXJzdFVuaXQgPT0gIm1pbGxpbWV0ZXJzIikgewotICAgIGlmIChzdHJVbml0ID09ICJtbSIgfHwgc3RyVW5pdCA9PSAibWlsbGltZXRlcnMiKQotICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlcjsKLSAgICBlbHNlIGlmIChzdHJVbml0ID09ICJjbSIgfHwgc3RyVW5pdCA9PSAiY2VudGltZXRlcnMiKQotICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDEwOwotICAgIGVsc2UgaWYgKHN0clVuaXQgPT0gInB0IiB8fCBzdHJVbml0ID09ICJwb2ludHMiKQotICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDI1LjQgLyA3MjsKLSAgICBlbHNlIGlmIChzdHJVbml0ID09ICJtcCIgfHwgc3RyVW5pdCA9PSAibWlsbGlwb2ludHMiKQotICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDI1LjQgLyA3MjAwMDsKLSAgICBlbHNlCi0gICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gMjUuNDsKLSAgfSBlbHNlIGlmIChzdHJGaXJzdFVuaXQgPT0gImNtIiB8fCBzdHJGaXJzdFVuaXQgPT0gImNlbnRpbWV0ZXJzIikgewotICAgIGlmIChzdHJVbml0ID09ICJtbSIgfHwgc3RyVW5pdCA9PSAibWlsbGltZXRlcnMiKQotICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAqIDEwOwotICAgIGVsc2UgaWYgKHN0clVuaXQgPT0gImNtIiB8fCBzdHJVbml0ID09ICJjZW50aW1ldGVycyIpCi0gICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyOwotICAgIGVsc2UgaWYgKHN0clVuaXQgPT0gInB0IiB8fCBzdHJVbml0ID09ICJwb2ludHMiKQotICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDIuNTQgLyA3MjsKLSAgICBlbHNlIGlmIChzdHJVbml0ID09ICJtcCIgfHwgc3RyVW5pdCA9PSAibWlsbGlwb2ludHMiKQotICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlciAvIDIuNTQgLyA3MjAwMDsKLSAgICBlbHNlCi0gICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gMi41NDsKLSAgfSBlbHNlIGlmIChzdHJGaXJzdFVuaXQgPT0gInB0IiB8fCBzdHJGaXJzdFVuaXQgPT0gInBvaW50cyIpIHsKLSAgICBpZiAoc3RyVW5pdCA9PSAibW0iIHx8IHN0clVuaXQgPT0gIm1pbGxpbWV0ZXJzIikKLSAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyA3MiAqIDI1LjQ7Ci0gICAgZWxzZSBpZiAoc3RyVW5pdCA9PSAiY20iIHx8IHN0clVuaXQgPT0gImNlbnRpbWV0ZXJzIikKLSAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyA3MiAqIDIuNTQ7Ci0gICAgZWxzZSBpZiAoc3RyVW5pdCA9PSAicHQiIHx8IHN0clVuaXQgPT0gInBvaW50cyIpCi0gICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyOwotICAgIGVsc2UgaWYgKHN0clVuaXQgPT0gIm1wIiB8fCBzdHJVbml0ID09ICJtaWxsaXBvaW50cyIpCi0gICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyICogMTAwMDsKLSAgICBlbHNlCi0gICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gNzI7Ci0gIH0gZWxzZSBpZiAoc3RyRmlyc3RVbml0ID09ICJtcCIgfHwgc3RyRmlyc3RVbml0ID09ICJtaWxsaXBvaW50cyIpIHsKLSAgICBpZiAoc3RyVW5pdCA9PSAibW0iIHx8IHN0clVuaXQgPT0gIm1pbGxpbWV0ZXJzIikKLSAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyA3MjAwMCAqIDI1LjQ7Ci0gICAgZWxzZSBpZiAoc3RyVW5pdCA9PSAiY20iIHx8IHN0clVuaXQgPT0gImNlbnRpbWV0ZXJzIikKLSAgICAgIGRSZXN1bHQgPSBkRmlyc3ROdW1iZXIgLyA3MjAwMCAqIDIuNTQ7Ci0gICAgZWxzZSBpZiAoc3RyVW5pdCA9PSAicHQiIHx8IHN0clVuaXQgPT0gInBvaW50cyIpCi0gICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gMTAwMDsKLSAgICBlbHNlIGlmIChzdHJVbml0ID09ICJtcCIgfHwgc3RyVW5pdCA9PSAibWlsbGlwb2ludHMiKQotICAgICAgZFJlc3VsdCA9IGRGaXJzdE51bWJlcjsKLSAgICBlbHNlCi0gICAgICBkUmVzdWx0ID0gZEZpcnN0TnVtYmVyIC8gNzIwMDA7Ci0gIH0KLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXREb3VibGUoZFJlc3VsdCk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6QXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMikgewotICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJBdCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVHdvID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOwotICBpZiAoVmFsdWVJc051bGwocFRoaXMsIGFyZ09uZS5nZXQoKSkgfHwgVmFsdWVJc051bGwocFRoaXMsIGFyZ1R3by5nZXQoKSkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDRlhfQnl0ZVN0cmluZyBzdHJpbmdUd287Ci0gIFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1R3by5nZXQoKSwgc3RyaW5nVHdvKTsKLSAgaWYgKHN0cmluZ1R3by5Jc0VtcHR5KCkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoMSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgc3RyaW5nT25lOwotICBWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUuZ2V0KCksIHN0cmluZ09uZSk7Ci0gIEZYX1NUUlNJWkUgaVBvc2l0aW9uID0gc3RyaW5nT25lLkZpbmQoc3RyaW5nVHdvLkFzU3RyaW5nQygpKTsKLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKGlQb3NpdGlvbiArIDEpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkNvbmNhdChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7Ci0gIGlmIChhcmdjIDwgMSkgewotICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJDb25jYXQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDRlhfQnl0ZVN0cmluZyByZXN1bHRTdHJpbmc7Ci0gIGJvb2wgYkFsbE51bGwgPSB0cnVlOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiB2YWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCBpKTsKLSAgICBpZiAoVmFsdWVJc051bGwocFRoaXMsIHZhbHVlLmdldCgpKSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgYkFsbE51bGwgPSBmYWxzZTsKLQotICAgIENGWF9CeXRlU3RyaW5nIHZhbHVlU3RyOwotICAgIFZhbHVlVG9VVEY4U3RyaW5nKHZhbHVlLmdldCgpLCB2YWx1ZVN0cik7Ci0gICAgcmVzdWx0U3RyaW5nICs9IHZhbHVlU3RyOwotICB9Ci0KLSAgaWYgKGJBbGxOdWxsKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcocmVzdWx0U3RyaW5nLkFzU3RyaW5nQygpKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpEZWNvZGUoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOwotICBpZiAoYXJnYyA8IDEgfHwgYXJnYyA+IDIpIHsKLSAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiRGVjb2RlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGFyZ2MgPT0gMSkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgICBpZiAoVmFsdWVJc051bGwocFRoaXMsIGFyZ09uZS5nZXQoKSkpIHsKLSAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIENGWF9CeXRlU3RyaW5nIHRvRGVjb2RlU3RyaW5nOwotICAgIFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZS5nZXQoKSwgdG9EZWNvZGVTdHJpbmcpOwotICAgIENGWF9CeXRlVGV4dEJ1ZiByZXN1bHRCdWY7Ci0gICAgRGVjb2RlVVJMKHRvRGVjb2RlU3RyaW5nLkFzU3RyaW5nQygpLCByZXN1bHRCdWYpOwotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKHJlc3VsdEJ1Zi5Bc1N0cmluZ0MoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdUd28gPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7Ci0gIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgYXJnT25lLmdldCgpKSB8fCBWYWx1ZUlzTnVsbChwVGhpcywgYXJnVHdvLmdldCgpKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIHRvRGVjb2RlU3RyaW5nOwotICBWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUuZ2V0KCksIHRvRGVjb2RlU3RyaW5nKTsKLQotICBDRlhfQnl0ZVN0cmluZyBpZGVudGlmeVN0cmluZzsKLSAgVmFsdWVUb1VURjhTdHJpbmcoYXJnVHdvLmdldCgpLCBpZGVudGlmeVN0cmluZyk7Ci0KLSAgQ0ZYX0J5dGVUZXh0QnVmIHJlc3VsdEJ1ZjsKLSAgaWYgKGlkZW50aWZ5U3RyaW5nLkVxdWFsTm9DYXNlKCJodG1sIikpCi0gICAgRGVjb2RlSFRNTCh0b0RlY29kZVN0cmluZy5Bc1N0cmluZ0MoKSwgcmVzdWx0QnVmKTsKLSAgZWxzZSBpZiAoaWRlbnRpZnlTdHJpbmcuRXF1YWxOb0Nhc2UoInhtbCIpKQotICAgIERlY29kZVhNTCh0b0RlY29kZVN0cmluZy5Bc1N0cmluZ0MoKSwgcmVzdWx0QnVmKTsKLSAgZWxzZQotICAgIERlY29kZVVSTCh0b0RlY29kZVN0cmluZy5Bc1N0cmluZ0MoKSwgcmVzdWx0QnVmKTsKLQotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZyhyZXN1bHRCdWYuQXNTdHJpbmdDKCkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkRlY29kZVVSTChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6VVJMU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiYgc3pSZXN1bHRTdHJpbmcpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NVUkxTdHJpbmcgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pVUkxTdHJpbmcpOwotICBjb25zdCBGWF9XQ0hBUiogcERhdGEgPSB3c1VSTFN0cmluZy5jX3N0cigpOwotICBpbnQzMl90IGkgPSAwOwotICBDRlhfV2lkZVRleHRCdWYgd3NSZXN1bHRCdWY7Ci0gIHdoaWxlIChpIDwgd3NVUkxTdHJpbmcuR2V0TGVuZ3RoKCkpIHsKLSAgICBGWF9XQ0hBUiBjaCA9IHBEYXRhW2ldOwotICAgIGlmICgnJScgIT0gY2gpIHsKLSAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoY2gpOwotICAgICAgKytpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgRlhfV0NIQVIgY2hUZW1wID0gMDsKLSAgICBpbnQzMl90IGlDb3VudCA9IDA7Ci0gICAgd2hpbGUgKGlDb3VudCA8IDIpIHsKLSAgICAgICsraTsKLSAgICAgIGNoID0gcERhdGFbaV07Ci0gICAgICBpZiAoY2ggPD0gJzknICYmIGNoID49ICcwJykgewotICAgICAgICAvLyBUT0RPKGRzaW5jbGFpcik6IFByZW11bHRpcGx5IGFuZCBhZGQgcmF0aGVyIHRoZW4gc2NhbGUuCi0gICAgICAgIGNoVGVtcCArPSAoY2ggLSAnMCcpICogKCFpQ291bnQgPyAxNiA6IDEpOwotICAgICAgfSBlbHNlIGlmIChjaCA8PSAnRicgJiYgY2ggPj0gJ0EnKSB7Ci0gICAgICAgIGNoVGVtcCArPSAoY2ggLSAnQScgKyAxMCkgKiAoIWlDb3VudCA/IDE2IDogMSk7Ci0gICAgICB9IGVsc2UgaWYgKGNoIDw9ICdmJyAmJiBjaCA+PSAnYScpIHsKLSAgICAgICAgY2hUZW1wICs9IChjaCAtICdhJyArIDEwKSAqICghaUNvdW50ID8gMTYgOiAxKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHdzUmVzdWx0QnVmLkNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgICsraUNvdW50OwotICAgIH0KLSAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKGNoVGVtcCk7Ci0gICAgKytpOwotICB9Ci0gIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoMCk7Ci0gIHN6UmVzdWx0U3RyaW5nLkNsZWFyKCk7Ci0gIHN6UmVzdWx0U3RyaW5nIDw8IEZYX1VURjhFbmNvZGUod3NSZXN1bHRCdWYuQXNTdHJpbmdDKCkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkRlY29kZUhUTUwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekhUTUxTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiYgc3pSZXN1bHRTdHJpbmcpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NIVE1MU3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6SFRNTFN0cmluZyk7Ci0gIEZYX1dDSEFSIHN0clN0cmluZ1s5XTsKLSAgaW50MzJfdCBpU3RySW5kZXggPSAwOwotICBpbnQzMl90IGlMZW4gPSB3c0hUTUxTdHJpbmcuR2V0TGVuZ3RoKCk7Ci0gIGludDMyX3QgaSA9IDA7Ci0gIGludDMyX3QgaUNvZGUgPSAwOwotICBjb25zdCBGWF9XQ0hBUiogcERhdGEgPSB3c0hUTUxTdHJpbmcuY19zdHIoKTsKLSAgQ0ZYX1dpZGVUZXh0QnVmIHdzUmVzdWx0QnVmOwotICB3aGlsZSAoaSA8IGlMZW4pIHsKLSAgICBGWF9XQ0hBUiBjaCA9IHBEYXRhW2ldOwotICAgIGlmIChjaCAhPSAnJicpIHsKLSAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoY2gpOwotICAgICAgKytpOwotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgKytpOwotICAgIGNoID0gcERhdGFbaV07Ci0gICAgaWYgKGNoID09ICcjJykgewotICAgICAgKytpOwotICAgICAgY2ggPSBwRGF0YVtpXTsKLSAgICAgIGlmIChjaCAhPSAneCcgJiYgY2ggIT0gJ1gnKSB7Ci0gICAgICAgIHdzUmVzdWx0QnVmLkNsZWFyKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgKytpOwotICAgICAgY2ggPSBwRGF0YVtpXTsKLSAgICAgIGlmICgoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgfHwgKGNoIDw9ICdmJyAmJiBjaCA+PSAnYScpIHx8Ci0gICAgICAgICAgKGNoIDw9ICdGJyAmJiBjaCA+PSAnQScpKSB7Ci0gICAgICAgIHdoaWxlIChjaCAhPSAnOycgJiYgaSA8IGlMZW4pIHsKLSAgICAgICAgICBpZiAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgewotICAgICAgICAgICAgaUNvZGUgKz0gY2ggLSAnMCc7Ci0gICAgICAgICAgfSBlbHNlIGlmIChjaCA8PSAnZicgJiYgY2ggPj0gJ2EnKSB7Ci0gICAgICAgICAgICBpQ29kZSArPSBjaCAtICdhJyArIDEwOwotICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPD0gJ0YnICYmIGNoID49ICdBJykgewotICAgICAgICAgICAgaUNvZGUgKz0gY2ggLSAnQScgKyAxMDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3NSZXN1bHRCdWYuQ2xlYXIoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgKytpOwotICAgICAgICAgIC8vIFRPRE8oZHNpbmNsYWlyKTogUG9zdG11bHRpcGx5IHNlZW1zIHdyb25nLCBzdGFydCBhdCB6ZXJvCi0gICAgICAgICAgLy8gICBhbmQgcHJlLW11bHRpcGx5IHRoZW4gY2FuIHJlbW92ZSB0aGUgcG9zdCBkaXZpZGUuCi0gICAgICAgICAgaUNvZGUgKj0gMTY7Ci0gICAgICAgICAgY2ggPSBwRGF0YVtpXTsKLSAgICAgICAgfQotICAgICAgICBpQ29kZSAvPSAxNjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgd2hpbGUgKGNoICE9ICc7JyAmJiBpIDwgaUxlbikgewotICAgICAgICBzdHJTdHJpbmdbaVN0ckluZGV4KytdID0gY2g7Ci0gICAgICAgICsraTsKLSAgICAgICAgY2ggPSBwRGF0YVtpXTsKLSAgICAgIH0KLSAgICAgIHN0clN0cmluZ1tpU3RySW5kZXhdID0gMDsKLSAgICB9Ci0gICAgdWludDMyX3QgaURhdGEgPSAwOwotICAgIGlmIChIVE1MU1RSMkNvZGUoc3RyU3RyaW5nLCBpRGF0YSkpIHsKLSAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoKEZYX1dDSEFSKWlEYXRhKTsKLSAgICB9IGVsc2UgewotICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcihpQ29kZSk7Ci0gICAgfQotICAgIGlTdHJJbmRleCA9IDA7Ci0gICAgc3RyU3RyaW5nW2lTdHJJbmRleF0gPSAwOwotICAgICsraTsKLSAgfQotICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKDApOwotCi0gIHN6UmVzdWx0U3RyaW5nLkNsZWFyKCk7Ci0gIHN6UmVzdWx0U3RyaW5nIDw8IEZYX1VURjhFbmNvZGUod3NSZXN1bHRCdWYuQXNTdHJpbmdDKCkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkRlY29kZVhNTChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6WE1MU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiYgc3pSZXN1bHRTdHJpbmcpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NYTUxTdHJpbmcgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pYTUxTdHJpbmcpOwotICBGWF9XQ0hBUiBzdHJTdHJpbmdbOV07Ci0gIGludDMyX3QgaVN0ckluZGV4ID0gMDsKLSAgaW50MzJfdCBpTGVuID0gd3NYTUxTdHJpbmcuR2V0TGVuZ3RoKCk7Ci0gIGludDMyX3QgaSA9IDA7Ci0gIGludDMyX3QgaUNvZGUgPSAwOwotICBGWF9XQ0hBUiBjaCA9IDA7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwRGF0YSA9IHdzWE1MU3RyaW5nLmNfc3RyKCk7Ci0gIENGWF9XaWRlVGV4dEJ1ZiB3c1hNTEJ1ZjsKLSAgd2hpbGUgKGkgPCBpTGVuKSB7Ci0gICAgY2ggPSBwRGF0YVtpXTsKLSAgICBpZiAoY2ggIT0gJyYnKSB7Ci0gICAgICB3c1hNTEJ1Zi5BcHBlbmRDaGFyKGNoKTsKLSAgICAgICsraTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIC8vIFRPRE8oZHNpbmNsYWlyKTogVGhpcyBpcyB2ZXJ5IHNpbWlsYXIgdG8gRGVjb2RlSFRNTCwgY2FuIHRoZXkgYmUKLSAgICAvLyAgIGNvbWJpbmVkPwotICAgICsraTsKLSAgICBjaCA9IHBEYXRhW2ldOwotICAgIGlmIChjaCA9PSAnIycpIHsKLSAgICAgICsraTsKLSAgICAgIGNoID0gcERhdGFbaV07Ci0gICAgICBpZiAoY2ggIT0gJ3gnICYmIGNoICE9ICdYJykgewotICAgICAgICB3c1hNTEJ1Zi5DbGVhcigpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgICsraTsKLSAgICAgIGNoID0gcERhdGFbaV07Ci0gICAgICBpZiAoKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHx8IChjaCA8PSAnZicgJiYgY2ggPj0gJ2EnKSB8fAotICAgICAgICAgIChjaCA8PSAnRicgJiYgY2ggPj0gJ0EnKSkgewotICAgICAgICB3aGlsZSAoY2ggIT0gJzsnKSB7Ci0gICAgICAgICAgaWYgKGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKLSAgICAgICAgICAgIGlDb2RlICs9IGNoIC0gJzAnOwotICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPD0gJ2YnICYmIGNoID49ICdhJykgewotICAgICAgICAgICAgaUNvZGUgKz0gY2ggLSAnYScgKyAxMDsKLSAgICAgICAgICB9IGVsc2UgaWYgKGNoIDw9ICdGJyAmJiBjaCA+PSAnQScpIHsKLSAgICAgICAgICAgIGlDb2RlICs9IGNoIC0gJ0EnICsgMTA7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHdzWE1MQnVmLkNsZWFyKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgfQotICAgICAgICAgICsraTsKLSAgICAgICAgICBpQ29kZSAqPSAxNjsKLSAgICAgICAgICBjaCA9IHBEYXRhW2ldOwotICAgICAgICB9Ci0gICAgICAgIGlDb2RlIC89IDE2OwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB3aGlsZSAoY2ggIT0gJzsnICYmIGkgPCBpTGVuKSB7Ci0gICAgICAgIHN0clN0cmluZ1tpU3RySW5kZXgrK10gPSBjaDsKLSAgICAgICAgKytpOwotICAgICAgICBjaCA9IHBEYXRhW2ldOwotICAgICAgfQotICAgICAgc3RyU3RyaW5nW2lTdHJJbmRleF0gPSAwOwotICAgIH0KLQotICAgIGNvbnN0IEZYX1dDSEFSKiBjb25zdCBzdHJOYW1lW10gPSB7TCJxdW90IiwgTCJhbXAiLCBMImFwb3MiLCBMImx0IiwgTCJndCJ9OwotICAgIGludDMyX3QgaUluZGV4ID0gMDsKLSAgICB3aGlsZSAoaUluZGV4IDwgNSkgewotICAgICAgaWYgKEZYU1lTX21lbWNtcChzdHJTdHJpbmcsIHN0ck5hbWVbaUluZGV4XSwKLSAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfd2NzbGVuKHN0ck5hbWVbaUluZGV4XSkpID09IDApIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICArK2lJbmRleDsKLSAgICB9Ci0gICAgc3dpdGNoIChpSW5kZXgpIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgd3NYTUxCdWYuQXBwZW5kQ2hhcignIicpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgd3NYTUxCdWYuQXBwZW5kQ2hhcignJicpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgd3NYTUxCdWYuQXBwZW5kQ2hhcignXCcnKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDM6Ci0gICAgICAgIHdzWE1MQnVmLkFwcGVuZENoYXIoJzwnKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDQ6Ci0gICAgICAgIHdzWE1MQnVmLkFwcGVuZENoYXIoJz4nKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB3c1hNTEJ1Zi5BcHBlbmRDaGFyKGlDb2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlTdHJJbmRleCA9IDA7Ci0gICAgc3RyU3RyaW5nW2lTdHJJbmRleF0gPSAwOwotICAgICsraTsKLSAgICBpQ29kZSA9IDA7Ci0gIH0KLSAgd3NYTUxCdWYuQXBwZW5kQ2hhcigwKTsKLSAgc3pSZXN1bHRTdHJpbmcuQ2xlYXIoKTsKLSAgc3pSZXN1bHRTdHJpbmcgPDwgRlhfVVRGOEVuY29kZSh3c1hNTEJ1Zi5Bc1N0cmluZ0MoKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6RW5jb2RlKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKLSAgaWYgKGFyZ2MgPCAxIHx8IGFyZ2MgPiAyKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIkVuY29kZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChhcmdjID09IDEpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gICAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdPbmUuZ2V0KCkpKSB7Ci0gICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBDRlhfQnl0ZVN0cmluZyB0b0VuY29kZVN0cmluZzsKLSAgICBWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUuZ2V0KCksIHRvRW5jb2RlU3RyaW5nKTsKLSAgICBDRlhfQnl0ZVRleHRCdWYgcmVzdWx0QnVmOwotICAgIEVuY29kZVVSTCh0b0VuY29kZVN0cmluZy5Bc1N0cmluZ0MoKSwgcmVzdWx0QnVmKTsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZyhyZXN1bHRCdWYuQXNTdHJpbmdDKCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVHdvID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOwotICBpZiAoVmFsdWVJc051bGwocFRoaXMsIGFyZ09uZS5nZXQoKSkgfHwgVmFsdWVJc051bGwocFRoaXMsIGFyZ1R3by5nZXQoKSkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDRlhfQnl0ZVN0cmluZyB0b0VuY29kZVN0cmluZzsKLSAgVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLmdldCgpLCB0b0VuY29kZVN0cmluZyk7Ci0gIENGWF9CeXRlU3RyaW5nIGlkZW50aWZ5U3RyaW5nOwotICBWYWx1ZVRvVVRGOFN0cmluZyhhcmdUd28uZ2V0KCksIGlkZW50aWZ5U3RyaW5nKTsKLSAgQ0ZYX0J5dGVUZXh0QnVmIHJlc3VsdEJ1ZjsKLSAgaWYgKGlkZW50aWZ5U3RyaW5nLkVxdWFsTm9DYXNlKCJodG1sIikpCi0gICAgRW5jb2RlSFRNTCh0b0VuY29kZVN0cmluZy5Bc1N0cmluZ0MoKSwgcmVzdWx0QnVmKTsKLSAgZWxzZSBpZiAoaWRlbnRpZnlTdHJpbmcuRXF1YWxOb0Nhc2UoInhtbCIpKQotICAgIEVuY29kZVhNTCh0b0VuY29kZVN0cmluZy5Bc1N0cmluZ0MoKSwgcmVzdWx0QnVmKTsKLSAgZWxzZQotICAgIEVuY29kZVVSTCh0b0VuY29kZVN0cmluZy5Bc1N0cmluZ0MoKSwgcmVzdWx0QnVmKTsKLQotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZyhyZXN1bHRCdWYuQXNTdHJpbmdDKCkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkVuY29kZVVSTChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6VVJMU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiYgc3pSZXN1bHRCdWYpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NVUkxTdHJpbmcgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pVUkxTdHJpbmcpOwotICBDRlhfV2lkZVRleHRCdWYgd3NSZXN1bHRCdWY7Ci0gIEZYX1dDSEFSIHN0ckVuY29kZVs0XTsKLSAgc3RyRW5jb2RlWzBdID0gJyUnOwotICBzdHJFbmNvZGVbM10gPSAwOwotICBGWF9XQ0hBUiBzdHJVbnNhZmVbXSA9IHsnICcsICc8JywgICc+JywgJyInLCAnIycsICclJywgJ3snLCAnfScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICd8JywgJ1xcJywgJ14nLCAnficsICdbJywgJ10nLCAnYCd9OwotICBGWF9XQ0hBUiBzdHJSZXNlcnZlZFtdID0geyc7JywgJy8nLCAnPycsICc6JywgJ0AnLCAnPScsICcmJ307Ci0gIEZYX1dDSEFSIHN0clNwZWNpYWxbXSA9IHsnJCcsICctJywgJysnLCAnIScsICcqJywgJ1wnJywgJygnLCAnKScsICcsJ307Ci0gIGNvbnN0IEZYX1dDSEFSKiBzdHJDb2RlID0gTCIwMTIzNDU2Nzg5YWJjZGVmIjsKLSAgZm9yIChpbnQzMl90IHUgPSAwOyB1IDwgd3NVUkxTdHJpbmcuR2V0TGVuZ3RoKCk7ICsrdSkgewotICAgIEZYX1dDSEFSIGNoID0gd3NVUkxTdHJpbmcuR2V0QXQodSk7Ci0gICAgaW50MzJfdCBpID0gMDsKLSAgICBpbnQzMl90IGlDb3VudCA9IEZYX0FycmF5U2l6ZShzdHJVbnNhZmUpOwotICAgIHdoaWxlIChpIDwgaUNvdW50KSB7Ci0gICAgICBpZiAoY2ggPT0gc3RyVW5zYWZlW2ldKSB7Ci0gICAgICAgIGludDMyX3QgaUluZGV4ID0gY2ggLyAxNjsKLSAgICAgICAgc3RyRW5jb2RlWzFdID0gc3RyQ29kZVtpSW5kZXhdOwotICAgICAgICBzdHJFbmNvZGVbMl0gPSBzdHJDb2RlW2NoIC0gaUluZGV4ICogMTZdOwotICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBzdHJFbmNvZGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgKytpOwotICAgIH0KLSAgICBpZiAoaSA8IGlDb3VudCkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgaSA9IDA7Ci0gICAgaUNvdW50ID0gRlhfQXJyYXlTaXplKHN0clJlc2VydmVkKTsKLSAgICB3aGlsZSAoaSA8IGlDb3VudCkgewotICAgICAgaWYgKGNoID09IHN0clJlc2VydmVkW2ldKSB7Ci0gICAgICAgIGludDMyX3QgaUluZGV4ID0gY2ggLyAxNjsKLSAgICAgICAgc3RyRW5jb2RlWzFdID0gc3RyQ29kZVtpSW5kZXhdOwotICAgICAgICBzdHJFbmNvZGVbMl0gPSBzdHJDb2RlW2NoIC0gaUluZGV4ICogMTZdOwotICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBzdHJFbmNvZGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgKytpOwotICAgIH0KLSAgICBpZiAoaSA8IGlDb3VudCkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgaSA9IDA7Ci0gICAgaUNvdW50ID0gRlhfQXJyYXlTaXplKHN0clNwZWNpYWwpOwotICAgIHdoaWxlIChpIDwgaUNvdW50KSB7Ci0gICAgICBpZiAoY2ggPT0gc3RyU3BlY2lhbFtpXSkgewotICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKGNoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICArK2k7Ci0gICAgfQotICAgIGlmIChpIDwgaUNvdW50KQotICAgICAgY29udGludWU7Ci0KLSAgICBpZiAoKGNoID49IDB4ODAgJiYgY2ggPD0gMHhmZikgfHwgY2ggPD0gMHgxZiB8fCBjaCA9PSAweDdmKSB7Ci0gICAgICBpbnQzMl90IGlJbmRleCA9IGNoIC8gMTY7Ci0gICAgICBzdHJFbmNvZGVbMV0gPSBzdHJDb2RlW2lJbmRleF07Ci0gICAgICBzdHJFbmNvZGVbMl0gPSBzdHJDb2RlW2NoIC0gaUluZGV4ICogMTZdOwotICAgICAgd3NSZXN1bHRCdWYgPDwgc3RyRW5jb2RlOwotICAgIH0gZWxzZSBpZiAoY2ggPj0gMHgyMCAmJiBjaCA8PSAweDdlKSB7Ci0gICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKGNoKTsKLSAgICB9IGVsc2UgewotICAgICAgY29uc3QgRlhfV0NIQVIgaVJhZGl4ID0gMTY7Ci0gICAgICBDRlhfV2lkZVN0cmluZyBzdHJUbXA7Ci0gICAgICB3aGlsZSAoY2ggPj0gaVJhZGl4KSB7Ci0gICAgICAgIEZYX1dDSEFSIHRtcCA9IHN0ckNvZGVbY2ggJSBpUmFkaXhdOwotICAgICAgICBjaCAvPSBpUmFkaXg7Ci0gICAgICAgIHN0clRtcCArPSB0bXA7Ci0gICAgICB9Ci0gICAgICBzdHJUbXAgKz0gc3RyQ29kZVtjaF07Ci0gICAgICBpbnQzMl90IGlMZW4gPSBzdHJUbXAuR2V0TGVuZ3RoKCk7Ci0gICAgICBpZiAoaUxlbiA8IDIpCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBpbnQzMl90IGlJbmRleCA9IDA7Ci0gICAgICBpZiAoaUxlbiAlIDIgIT0gMCkgewotICAgICAgICBzdHJFbmNvZGVbMV0gPSAnMCc7Ci0gICAgICAgIHN0ckVuY29kZVsyXSA9IHN0clRtcC5HZXRBdChpTGVuIC0gMSk7Ci0gICAgICAgIGlJbmRleCA9IGlMZW4gLSAyOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RyRW5jb2RlWzFdID0gc3RyVG1wLkdldEF0KGlMZW4gLSAxKTsKLSAgICAgICAgc3RyRW5jb2RlWzJdID0gc3RyVG1wLkdldEF0KGlMZW4gLSAyKTsKLSAgICAgICAgaUluZGV4ID0gaUxlbiAtIDM7Ci0gICAgICB9Ci0gICAgICB3c1Jlc3VsdEJ1ZiA8PCBzdHJFbmNvZGU7Ci0gICAgICB3aGlsZSAoaUluZGV4ID4gMCkgewotICAgICAgICBzdHJFbmNvZGVbMV0gPSBzdHJUbXAuR2V0QXQoaUluZGV4KTsKLSAgICAgICAgc3RyRW5jb2RlWzJdID0gc3RyVG1wLkdldEF0KGlJbmRleCAtIDEpOwotICAgICAgICBpSW5kZXggLT0gMjsKLSAgICAgICAgd3NSZXN1bHRCdWYgPDwgc3RyRW5jb2RlOwotICAgICAgfQotICAgIH0KLSAgfQotICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKDApOwotICBzelJlc3VsdEJ1Zi5DbGVhcigpOwotICBzelJlc3VsdEJ1ZiA8PCBGWF9VVEY4RW5jb2RlKHdzUmVzdWx0QnVmLkFzU3RyaW5nQygpKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpFbmNvZGVIVE1MKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pIVE1MU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYmIHN6UmVzdWx0QnVmKSB7Ci0gIENGWF9CeXRlU3RyaW5nIHN0ciA9IHN6SFRNTFN0cmluZy5jX3N0cigpOwotICBDRlhfV2lkZVN0cmluZyB3c0hUTUxTdHJpbmcgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3RyLkFzU3RyaW5nQygpKTsKLSAgY29uc3QgRlhfV0NIQVIqIHN0ckNvZGUgPSBMIjAxMjM0NTY3ODlhYmNkZWYiOwotICBGWF9XQ0hBUiBzdHJFbmNvZGVbOV07Ci0gIHN0ckVuY29kZVswXSA9ICcmJzsKLSAgc3RyRW5jb2RlWzFdID0gJyMnOwotICBzdHJFbmNvZGVbMl0gPSAneCc7Ci0gIHN0ckVuY29kZVs1XSA9ICc7JzsKLSAgc3RyRW5jb2RlWzZdID0gMDsKLSAgc3RyRW5jb2RlWzddID0gJzsnOwotICBzdHJFbmNvZGVbOF0gPSAwOwotICBDRlhfV2lkZVRleHRCdWYgd3NSZXN1bHRCdWY7Ci0gIGludDMyX3QgaUxlbiA9IHdzSFRNTFN0cmluZy5HZXRMZW5ndGgoKTsKLSAgaW50MzJfdCBpID0gMDsKLSAgY29uc3QgRlhfV0NIQVIqIHBEYXRhID0gd3NIVE1MU3RyaW5nLmNfc3RyKCk7Ci0gIHdoaWxlIChpIDwgaUxlbikgewotICAgIHVpbnQzMl90IGNoID0gcERhdGFbaV07Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgaHRtbFJlc2VydmU7Ci0gICAgaWYgKEhUTUxDb2RlMlNUUihjaCwgaHRtbFJlc2VydmUpKSB7Ci0gICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKEwnJicpOwotICAgICAgd3NSZXN1bHRCdWYgPDwgaHRtbFJlc2VydmU7Ci0gICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKEwnOycpOwotICAgIH0gZWxzZSBpZiAoY2ggPj0gMzIgJiYgY2ggPD0gMTI2KSB7Ci0gICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKChGWF9XQ0hBUiljaCk7Ci0gICAgfSBlbHNlIGlmIChjaCA8IDI1NikgewotICAgICAgaW50MzJfdCBpSW5kZXggPSBjaCAvIDE2OwotICAgICAgc3RyRW5jb2RlWzNdID0gc3RyQ29kZVtpSW5kZXhdOwotICAgICAgc3RyRW5jb2RlWzRdID0gc3RyQ29kZVtjaCAtIGlJbmRleCAqIDE2XTsKLSAgICAgIHN0ckVuY29kZVs1XSA9ICc7JzsKLSAgICAgIHN0ckVuY29kZVs2XSA9IDA7Ci0gICAgICB3c1Jlc3VsdEJ1ZiA8PCBzdHJFbmNvZGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGludDMyX3QgaUJpZ0J5dGUgPSBjaCAvIDI1NjsKLSAgICAgIGludDMyX3QgaUxpdHRsZUJ5dGUgPSBjaCAlIDI1NjsKLSAgICAgIHN0ckVuY29kZVszXSA9IHN0ckNvZGVbaUJpZ0J5dGUgLyAxNl07Ci0gICAgICBzdHJFbmNvZGVbNF0gPSBzdHJDb2RlW2lCaWdCeXRlICUgMTZdOwotICAgICAgc3RyRW5jb2RlWzVdID0gc3RyQ29kZVtpTGl0dGxlQnl0ZSAvIDE2XTsKLSAgICAgIHN0ckVuY29kZVs2XSA9IHN0ckNvZGVbaUxpdHRsZUJ5dGUgJSAxNl07Ci0gICAgICB3c1Jlc3VsdEJ1ZiA8PCBzdHJFbmNvZGU7Ci0gICAgfQotICAgICsraTsKLSAgfQotICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKDApOwotICBzelJlc3VsdEJ1Zi5DbGVhcigpOwotICBzelJlc3VsdEJ1ZiA8PCBGWF9VVEY4RW5jb2RlKHdzUmVzdWx0QnVmLkFzU3RyaW5nQygpKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpFbmNvZGVYTUwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelhNTFN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYmIHN6UmVzdWx0QnVmKSB7Ci0gIENGWF9XaWRlU3RyaW5nIHdzWE1MU3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6WE1MU3RyaW5nKTsKLSAgQ0ZYX1dpZGVUZXh0QnVmIHdzUmVzdWx0QnVmOwotICBGWF9XQ0hBUiBzdHJFbmNvZGVbOV07Ci0gIHN0ckVuY29kZVswXSA9ICcmJzsKLSAgc3RyRW5jb2RlWzFdID0gJyMnOwotICBzdHJFbmNvZGVbMl0gPSAneCc7Ci0gIHN0ckVuY29kZVs1XSA9ICc7JzsKLSAgc3RyRW5jb2RlWzZdID0gMDsKLSAgc3RyRW5jb2RlWzddID0gJzsnOwotICBzdHJFbmNvZGVbOF0gPSAwOwotICBjb25zdCBGWF9XQ0hBUiogc3RyQ29kZSA9IEwiMDEyMzQ1Njc4OWFiY2RlZiI7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwRGF0YSA9IHdzWE1MU3RyaW5nLmNfc3RyKCk7Ci0gIGZvciAoaW50MzJfdCB1ID0gMDsgdSA8IHdzWE1MU3RyaW5nLkdldExlbmd0aCgpOyArK3UpIHsKLSAgICBGWF9XQ0hBUiBjaCA9IHBEYXRhW3VdOwotICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgIGNhc2UgJyInOgotICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCcmJyk7Ci0gICAgICAgIHdzUmVzdWx0QnVmIDw8IENGWF9XaWRlU3RyaW5nQyhMInF1b3QiKTsKLSAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcignOycpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJyYnOgotICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCcmJyk7Ci0gICAgICAgIHdzUmVzdWx0QnVmIDw8IENGWF9XaWRlU3RyaW5nQyhMImFtcCIpOwotICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCc7Jyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnXCcnOgotICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCcmJyk7Ci0gICAgICAgIHdzUmVzdWx0QnVmIDw8IENGWF9XaWRlU3RyaW5nQyhMImFwb3MiKTsKLSAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcignOycpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJzwnOgotICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCcmJyk7Ci0gICAgICAgIHdzUmVzdWx0QnVmIDw8IENGWF9XaWRlU3RyaW5nQyhMImx0Iik7Ci0gICAgICAgIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoJzsnKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICc+JzoKLSAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcignJicpOwotICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBDRlhfV2lkZVN0cmluZ0MoTCJndCIpOwotICAgICAgICB3c1Jlc3VsdEJ1Zi5BcHBlbmRDaGFyKCc7Jyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDogewotICAgICAgICBpZiAoY2ggPj0gMzIgJiYgY2ggPD0gMTI2KSB7Ci0gICAgICAgICAgd3NSZXN1bHRCdWYuQXBwZW5kQ2hhcihjaCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY2ggPCAyNTYpIHsKLSAgICAgICAgICBpbnQzMl90IGlJbmRleCA9IGNoIC8gMTY7Ci0gICAgICAgICAgc3RyRW5jb2RlWzNdID0gc3RyQ29kZVtpSW5kZXhdOwotICAgICAgICAgIHN0ckVuY29kZVs0XSA9IHN0ckNvZGVbY2ggLSBpSW5kZXggKiAxNl07Ci0gICAgICAgICAgc3RyRW5jb2RlWzVdID0gJzsnOwotICAgICAgICAgIHN0ckVuY29kZVs2XSA9IDA7Ci0gICAgICAgICAgd3NSZXN1bHRCdWYgPDwgc3RyRW5jb2RlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGludDMyX3QgaUJpZ0J5dGUgPSBjaCAvIDI1NjsKLSAgICAgICAgICBpbnQzMl90IGlMaXR0bGVCeXRlID0gY2ggJSAyNTY7Ci0gICAgICAgICAgc3RyRW5jb2RlWzNdID0gc3RyQ29kZVtpQmlnQnl0ZSAvIDE2XTsKLSAgICAgICAgICBzdHJFbmNvZGVbNF0gPSBzdHJDb2RlW2lCaWdCeXRlICUgMTZdOwotICAgICAgICAgIHN0ckVuY29kZVs1XSA9IHN0ckNvZGVbaUxpdHRsZUJ5dGUgLyAxNl07Ci0gICAgICAgICAgc3RyRW5jb2RlWzZdID0gc3RyQ29kZVtpTGl0dGxlQnl0ZSAlIDE2XTsKLSAgICAgICAgICB3c1Jlc3VsdEJ1ZiA8PCBzdHJFbmNvZGU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHdzUmVzdWx0QnVmLkFwcGVuZENoYXIoMCk7Ci0gIHN6UmVzdWx0QnVmLkNsZWFyKCk7Ci0gIHN6UmVzdWx0QnVmIDw8IEZYX1VURjhFbmNvZGUod3NSZXN1bHRCdWYuQXNTdHJpbmdDKCkpOwotfQotCi0vLyBzdGF0aWMKLWJvb2wgQ1hGQV9GTTJKU0NvbnRleHQ6OkhUTUxTVFIyQ29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBpQ29kZSkgewotICB1aW50MzJfdCB1SGFzaCA9IEZYX0hhc2hDb2RlX0dldFcocERhdGEsIGZhbHNlKTsKLSAgaW50MzJfdCBpU3RhcnQgPSAwOwotICBpbnQzMl90IGlFbmQgPSBGWF9BcnJheVNpemUocmVzZXJ2ZXNGb3JEZWNvZGUpIC0gMTsKLSAgZG8gewotICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7Ci0gICAgWEZBX0ZNSHRtbEhhc2hlZFJlc2VydmVDb2RlIGh0bWxoYXNoZWRyZXNlcnZlY29kZSA9IHJlc2VydmVzRm9yRGVjb2RlW2lNaWRdOwotICAgIGlmICh1SGFzaCA9PSBodG1saGFzaGVkcmVzZXJ2ZWNvZGUubV91SGFzaCkgewotICAgICAgaUNvZGUgPSBodG1saGFzaGVkcmVzZXJ2ZWNvZGUubV91Q29kZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmICh1SGFzaCA8IGh0bWxoYXNoZWRyZXNlcnZlY29kZS5tX3VIYXNoKQotICAgICAgaUVuZCA9IGlNaWQgLSAxOwotICAgIGVsc2UKLSAgICAgIGlTdGFydCA9IGlNaWQgKyAxOwotICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8gc3RhdGljCi1ib29sIENYRkFfRk0ySlNDb250ZXh0OjpIVE1MQ29kZTJTVFIodWludDMyX3QgaUNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzSFRNTFJlc2VydmUpIHsKLSAgaW50MzJfdCBpU3RhcnQgPSAwOwotICBpbnQzMl90IGlFbmQgPSBGWF9BcnJheVNpemUocmVzZXJ2ZXNGb3JFbmNvZGUpIC0gMTsKLSAgZG8gewotICAgIGludDMyX3QgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7Ci0gICAgWEZBX0ZNSHRtbFJlc2VydmVDb2RlIGh0bWxyZXNlcnZlY29kZSA9IHJlc2VydmVzRm9yRW5jb2RlW2lNaWRdOwotICAgIGlmIChpQ29kZSA9PSBodG1scmVzZXJ2ZWNvZGUubV91Q29kZSkgewotICAgICAgd3NIVE1MUmVzZXJ2ZSA9IGh0bWxyZXNlcnZlY29kZS5tX2h0bWxSZXNlcnZlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKGlDb2RlIDwgaHRtbHJlc2VydmVjb2RlLm1fdUNvZGUpCi0gICAgICBpRW5kID0gaU1pZCAtIDE7Ci0gICAgZWxzZQotICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7Ci0gIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OkZvcm1hdChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKLSAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgPCAyKSB7Ci0gICAgcENvbnRleHQtPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiRm9ybWF0Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBDRlhfQnl0ZVN0cmluZyBzelBhdHRlcm47Ci0gIFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZS5nZXQoKSwgc3pQYXR0ZXJuKTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdUd28gPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7Ci0gIENGWF9CeXRlU3RyaW5nIHN6VmFsdWU7Ci0gIFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1R3by5nZXQoKSwgc3pWYWx1ZSk7Ci0KLSAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOwotICBDWEZBX0xvY2FsZU1nciogcE1nciA9IHBEb2MtPkdldExvY2FsTWdyKCk7Ci0gIENYRkFfTm9kZSogcFRoaXNOb2RlID0gVG9Ob2RlKHBEb2MtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpKTsKLSAgQVNTRVJUKHBUaGlzTm9kZSk7Ci0KLSAgQ1hGQV9XaWRnZXREYXRhIHdpZGdldERhdGEocFRoaXNOb2RlKTsKLSAgSUZYX0xvY2FsZSogcExvY2FsZSA9IHdpZGdldERhdGEuR2V0TG9jYWwoKTsKLSAgdWludDMyX3QgcGF0dGVyblR5cGU7Ci0gIENGWF9XaWRlU3RyaW5nIHdzUGF0dGVybiA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelBhdHRlcm4uQXNTdHJpbmdDKCkpOwotICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6VmFsdWUuQXNTdHJpbmdDKCkpOwotICBpZiAoIVBhdHRlcm5TdHJpbmdUeXBlKHN6UGF0dGVybi5Bc1N0cmluZ0MoKSwgcGF0dGVyblR5cGUpKSB7Ci0gICAgc3dpdGNoIChwYXR0ZXJuVHlwZSkgewotICAgICAgY2FzZSBYRkFfVlRfREFURVRJTUU6IHsKLSAgICAgICAgRlhfU1RSU0laRSBpVENoYXIgPSB3c1BhdHRlcm4uRmluZChMJ1QnKTsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlUGF0dGVybihMImRhdGV7Iik7Ci0gICAgICAgIHdzRGF0ZVBhdHRlcm4gKz0gd3NQYXR0ZXJuLkxlZnQoaVRDaGFyKSArIEwifSAiOwotCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGltZVBhdHRlcm4oTCJ0aW1leyIpOwotICAgICAgICB3c1RpbWVQYXR0ZXJuICs9IHdzUGF0dGVybi5NaWQoaVRDaGFyICsgMSkgKyBMIn0iOwotICAgICAgICB3c1BhdHRlcm4gPSB3c0RhdGVQYXR0ZXJuICsgd3NUaW1lUGF0dGVybjsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9WVF9EQVRFOiB7Ci0gICAgICAgIHdzUGF0dGVybiA9IEwiZGF0ZXsiICsgd3NQYXR0ZXJuICsgTCJ9IjsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9WVF9USU1FOiB7Ci0gICAgICAgIHdzUGF0dGVybiA9IEwidGltZXsiICsgd3NQYXR0ZXJuICsgTCJ9IjsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9WVF9URVhUOiB7Ci0gICAgICAgIHdzUGF0dGVybiA9IEwidGV4dHsiICsgd3NQYXR0ZXJuICsgTCJ9IjsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9WVF9GTE9BVDogewotICAgICAgICB3c1BhdHRlcm4gPSBMIm51bXsiICsgd3NQYXR0ZXJuICsgTCJ9IjsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBkZWZhdWx0OiB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVzdFBhdHRlcm47Ci0gICAgICAgIHdzVGVzdFBhdHRlcm4gPSBMIm51bXsiICsgd3NQYXR0ZXJuICsgTCJ9IjsKLSAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSB0ZW1wTG9jYWxlVmFsdWUoWEZBX1ZUX0ZMT0FULCB3c1ZhbHVlLCB3c1Rlc3RQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLCBwTWdyKTsKLSAgICAgICAgaWYgKHRlbXBMb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgICB3c1BhdHRlcm4gPSB3c1Rlc3RQYXR0ZXJuOwotICAgICAgICAgIHBhdHRlcm5UeXBlID0gWEZBX1ZUX0ZMT0FUOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHdzVGVzdFBhdHRlcm4gPSBMInRleHR7IiArIHdzUGF0dGVybiArIEwifSI7Ci0gICAgICAgICAgd3NQYXR0ZXJuID0gd3NUZXN0UGF0dGVybjsKLSAgICAgICAgICBwYXR0ZXJuVHlwZSA9IFhGQV9WVF9URVhUOwotICAgICAgICB9Ci0gICAgICB9IGJyZWFrOwotICAgIH0KLSAgfQotICBDWEZBX0xvY2FsZVZhbHVlIGxvY2FsZVZhbHVlKHBhdHRlcm5UeXBlLCB3c1ZhbHVlLCB3c1BhdHRlcm4sIHBMb2NhbGUsIHBNZ3IpOwotICBDRlhfV2lkZVN0cmluZyB3c1JldDsKLSAgaWYgKCFsb2NhbGVWYWx1ZS5Gb3JtYXRQYXR0ZXJucyh3c1JldCwgd3NQYXR0ZXJuLCBwTG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygiIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcod3NSZXQuVVRGOEVuY29kZSgpLkFzU3RyaW5nQygpKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpMZWZ0KENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAyKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIkxlZnQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1R3byA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKLSAgaWYgKChWYWx1ZUlzTnVsbChwVGhpcywgYXJnT25lLmdldCgpKSkgfHwKLSAgICAgIChWYWx1ZUlzTnVsbChwVGhpcywgYXJnVHdvLmdldCgpKSkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDRlhfQnl0ZVN0cmluZyBzb3VyY2VTdHJpbmc7Ci0gIFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZS5nZXQoKSwgc291cmNlU3RyaW5nKTsKLSAgaW50MzJfdCBjb3VudCA9IHN0ZDo6bWF4KDAsIFZhbHVlVG9JbnRlZ2VyKHBUaGlzLCBhcmdUd28uZ2V0KCkpKTsKLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoc291cmNlU3RyaW5nLkxlZnQoY291bnQpLkFzU3RyaW5nQygpKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpMZW4oQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAxKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIkxlbiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgaWYgKFZhbHVlSXNOdWxsKHBUaGlzLCBhcmdPbmUuZ2V0KCkpKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgc291cmNlU3RyaW5nOwotICBWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUuZ2V0KCksIHNvdXJjZVN0cmluZyk7Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcihzb3VyY2VTdHJpbmcuR2V0TGVuZ3RoKCkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Okxvd2VyKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7Ci0gIGlmIChhcmdjIDwgMSB8fCBhcmdjID4gMikgewotICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJMb3dlciIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIGFyZ1N0cmluZzsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBpZiAoVmFsdWVJc051bGwocFRoaXMsIGFyZ09uZS5nZXQoKSkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUuZ2V0KCksIGFyZ1N0cmluZyk7Ci0gIENGWF9XaWRlVGV4dEJ1ZiBsb3dTdHJpbmdCdWY7Ci0gIENGWF9XaWRlU3RyaW5nIHdzQXJnU3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGFyZ1N0cmluZy5Bc1N0cmluZ0MoKSk7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwRGF0YSA9IHdzQXJnU3RyaW5nLmNfc3RyKCk7Ci0gIGludDMyX3QgaSA9IDA7Ci0gIHdoaWxlIChpIDwgYXJnU3RyaW5nLkdldExlbmd0aCgpKSB7Ci0gICAgaW50MzJfdCBjaCA9IHBEYXRhW2ldOwotICAgIGlmICgoY2ggPj0gMHg0MSAmJiBjaCA8PSAweDVBKSB8fCAoY2ggPj0gMHhDMCAmJiBjaCA8PSAweERFKSkKLSAgICAgIGNoICs9IDMyOwotICAgIGVsc2UgaWYgKGNoID09IDB4MTAwIHx8IGNoID09IDB4MTAyIHx8IGNoID09IDB4MTA0KQotICAgICAgY2ggKz0gMTsKLQotICAgIGxvd1N0cmluZ0J1Zi5BcHBlbmRDaGFyKGNoKTsKLSAgICArK2k7Ci0gIH0KLSAgbG93U3RyaW5nQnVmLkFwcGVuZENoYXIoMCk7Ci0KLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoCi0gICAgICBGWF9VVEY4RW5jb2RlKGxvd1N0cmluZ0J1Zi5Bc1N0cmluZ0MoKSkuQXNTdHJpbmdDKCkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Okx0cmltKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDEpIHsKLSAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiTHRyaW0iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgYXJnT25lLmdldCgpKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIHNvdXJjZVN0cmluZzsKLSAgVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLmdldCgpLCBzb3VyY2VTdHJpbmcpOwotICBzb3VyY2VTdHJpbmcuVHJpbUxlZnQoKTsKLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoc291cmNlU3RyaW5nLkFzU3RyaW5nQygpKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpQYXJzZShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cik7Ci0gIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDIpIHsKLSAgICBwQ29udGV4dC0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJQYXJzZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVHdvID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOwotICBpZiAoVmFsdWVJc051bGwocFRoaXMsIGFyZ1R3by5nZXQoKSkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDRlhfQnl0ZVN0cmluZyBzelBhdHRlcm47Ci0gIFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZS5nZXQoKSwgc3pQYXR0ZXJuKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgc3pWYWx1ZTsKLSAgVmFsdWVUb1VURjhTdHJpbmcoYXJnVHdvLmdldCgpLCBzelZhbHVlKTsKLQotICBDWEZBX0RvY3VtZW50KiBwRG9jID0gcENvbnRleHQtPkdldERvY3VtZW50KCk7Ci0gIENYRkFfTG9jYWxlTWdyKiBwTWdyID0gcERvYy0+R2V0TG9jYWxNZ3IoKTsKLSAgQ1hGQV9Ob2RlKiBwVGhpc05vZGUgPSBUb05vZGUocERvYy0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRUaGlzT2JqZWN0KCkpOwotICBBU1NFUlQocFRoaXNOb2RlKTsKLQotICBDWEZBX1dpZGdldERhdGEgd2lkZ2V0RGF0YShwVGhpc05vZGUpOwotICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gd2lkZ2V0RGF0YS5HZXRMb2NhbCgpOwotICBDRlhfV2lkZVN0cmluZyB3c1BhdHRlcm4gPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pQYXR0ZXJuLkFzU3RyaW5nQygpKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelZhbHVlLkFzU3RyaW5nQygpKTsKLSAgdWludDMyX3QgcGF0dGVyblR5cGU7Ci0gIGlmIChQYXR0ZXJuU3RyaW5nVHlwZShzelBhdHRlcm4uQXNTdHJpbmdDKCksIHBhdHRlcm5UeXBlKSkgewotICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUocGF0dGVyblR5cGUsIHdzVmFsdWUsIHdzUGF0dGVybiwgcExvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZ3IpOwotICAgIGlmICghbG9jYWxlVmFsdWUuSXNWYWxpZCgpKSB7Ci0gICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygiIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKAotICAgICAgICBsb2NhbGVWYWx1ZS5HZXRWYWx1ZSgpLlVURjhFbmNvZGUoKS5Bc1N0cmluZ0MoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3dpdGNoIChwYXR0ZXJuVHlwZSkgewotICAgIGNhc2UgWEZBX1ZUX0RBVEVUSU1FOiB7Ci0gICAgICBGWF9TVFJTSVpFIGlUQ2hhciA9IHdzUGF0dGVybi5GaW5kKEwnVCcpOwotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlUGF0dGVybihMImRhdGV7IiArIHdzUGF0dGVybi5MZWZ0KGlUQ2hhcikgKyBMIn0gIik7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c1RpbWVQYXR0ZXJuKEwidGltZXsiICsgd3NQYXR0ZXJuLk1pZChpVENoYXIgKyAxKSArIEwifSIpOwotICAgICAgd3NQYXR0ZXJuID0gd3NEYXRlUGF0dGVybiArIHdzVGltZVBhdHRlcm47Ci0gICAgICBDWEZBX0xvY2FsZVZhbHVlIGxvY2FsZVZhbHVlKHBhdHRlcm5UeXBlLCB3c1ZhbHVlLCB3c1BhdHRlcm4sIHBMb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZ3IpOwotICAgICAgaWYgKCFsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoIiIpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygKLSAgICAgICAgICBsb2NhbGVWYWx1ZS5HZXRWYWx1ZSgpLlVURjhFbmNvZGUoKS5Bc1N0cmluZ0MoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgWEZBX1ZUX0RBVEU6IHsKLSAgICAgIHdzUGF0dGVybiA9IEwiZGF0ZXsiICsgd3NQYXR0ZXJuICsgTCJ9IjsKLSAgICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUocGF0dGVyblR5cGUsIHdzVmFsdWUsIHdzUGF0dGVybiwgcExvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1ncik7Ci0gICAgICBpZiAoIWxvY2FsZVZhbHVlLklzVmFsaWQoKSkgewotICAgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygiIik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKAotICAgICAgICAgIGxvY2FsZVZhbHVlLkdldFZhbHVlKCkuVVRGOEVuY29kZSgpLkFzU3RyaW5nQygpKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBYRkFfVlRfVElNRTogewotICAgICAgd3NQYXR0ZXJuID0gTCJ0aW1leyIgKyB3c1BhdHRlcm4gKyBMIn0iOwotICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSBsb2NhbGVWYWx1ZShwYXR0ZXJuVHlwZSwgd3NWYWx1ZSwgd3NQYXR0ZXJuLCBwTG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTWdyKTsKLSAgICAgIGlmICghbG9jYWxlVmFsdWUuSXNWYWxpZCgpKSB7Ci0gICAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKCIiKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoCi0gICAgICAgICAgbG9jYWxlVmFsdWUuR2V0VmFsdWUoKS5VVEY4RW5jb2RlKCkuQXNTdHJpbmdDKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXNlIFhGQV9WVF9URVhUOiB7Ci0gICAgICB3c1BhdHRlcm4gPSBMInRleHR7IiArIHdzUGF0dGVybiArIEwifSI7Ci0gICAgICBDWEZBX0xvY2FsZVZhbHVlIGxvY2FsZVZhbHVlKFhGQV9WVF9URVhULCB3c1ZhbHVlLCB3c1BhdHRlcm4sIHBMb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZ3IpOwotICAgICAgaWYgKCFsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoIiIpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygKLSAgICAgICAgICBsb2NhbGVWYWx1ZS5HZXRWYWx1ZSgpLlVURjhFbmNvZGUoKS5Bc1N0cmluZ0MoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgWEZBX1ZUX0ZMT0FUOiB7Ci0gICAgICB3c1BhdHRlcm4gPSBMIm51bXsiICsgd3NQYXR0ZXJuICsgTCJ9IjsKLSAgICAgIENYRkFfTG9jYWxlVmFsdWUgbG9jYWxlVmFsdWUoWEZBX1ZUX0ZMT0FULCB3c1ZhbHVlLCB3c1BhdHRlcm4sIHBMb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNZ3IpOwotICAgICAgaWYgKCFsb2NhbGVWYWx1ZS5Jc1ZhbGlkKCkpIHsKLSAgICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoIiIpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldERvdWJsZShsb2NhbGVWYWx1ZS5HZXREb3VibGVOdW0oKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGRlZmF1bHQ6IHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGVzdFBhdHRlcm47Ci0gICAgICB3c1Rlc3RQYXR0ZXJuID0gTCJudW17IiArIHdzUGF0dGVybiArIEwifSI7Ci0gICAgICBDWEZBX0xvY2FsZVZhbHVlIGxvY2FsZVZhbHVlKFhGQV9WVF9GTE9BVCwgd3NWYWx1ZSwgd3NUZXN0UGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExvY2FsZSwgcE1ncik7Ci0gICAgICBpZiAobG9jYWxlVmFsdWUuSXNWYWxpZCgpKSB7Ci0gICAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0RG91YmxlKGxvY2FsZVZhbHVlLkdldERvdWJsZU51bSgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICB3c1Rlc3RQYXR0ZXJuID0gTCJ0ZXh0eyIgKyB3c1BhdHRlcm4gKyBMIn0iOwotICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSBsb2NhbGVWYWx1ZTIoWEZBX1ZUX1RFWFQsIHdzVmFsdWUsIHdzVGVzdFBhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTG9jYWxlLCBwTWdyKTsKLSAgICAgIGlmICghbG9jYWxlVmFsdWUyLklzVmFsaWQoKSkgewotICAgICAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygiIik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKAotICAgICAgICAgIGxvY2FsZVZhbHVlMi5HZXRWYWx1ZSgpLlVURjhFbmNvZGUoKS5Bc1N0cmluZ0MoKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6UmVwbGFjZShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKLSAgaWYgKGFyZ2MgPCAyIHx8IGFyZ2MgPiAzKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIlJlcGxhY2UiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1R3byA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgb25lU3RyaW5nOwotICBDRlhfQnl0ZVN0cmluZyB0d29TdHJpbmc7Ci0gIGlmICghVmFsdWVJc051bGwocFRoaXMsIGFyZ09uZS5nZXQoKSkgJiYgIVZhbHVlSXNOdWxsKHBUaGlzLCBhcmdUd28uZ2V0KCkpKSB7Ci0gICAgVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLmdldCgpLCBvbmVTdHJpbmcpOwotICAgIFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1R3by5nZXQoKSwgdHdvU3RyaW5nKTsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIHRocmVlU3RyaW5nOwotICBpZiAoYXJnYyA+IDIpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdUaHJlZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAyKTsKLSAgICBWYWx1ZVRvVVRGOFN0cmluZyhhcmdUaHJlZS5nZXQoKSwgdGhyZWVTdHJpbmcpOwotICB9Ci0KLSAgaW50MzJfdCBpRmluZExlbiA9IHR3b1N0cmluZy5HZXRMZW5ndGgoKTsKLSAgQ0ZYX0J5dGVUZXh0QnVmIHJlc3VsdFN0cmluZzsKLSAgaW50MzJfdCBpRmluZEluZGV4ID0gMDsKLSAgZm9yIChpbnQzMl90IHUgPSAwOyB1IDwgb25lU3RyaW5nLkdldExlbmd0aCgpOyArK3UpIHsKLSAgICB1aW50OF90IGNoID0gb25lU3RyaW5nLkdldEF0KHUpOwotICAgIGlmIChjaCAhPSB0d29TdHJpbmcuR2V0QXQoaUZpbmRJbmRleCkpIHsKLSAgICAgIHJlc3VsdFN0cmluZy5BcHBlbmRDaGFyKGNoKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGludDMyX3QgaVRlbXAgPSB1ICsgMTsKLSAgICArK2lGaW5kSW5kZXg7Ci0gICAgd2hpbGUgKGlGaW5kSW5kZXggPCBpRmluZExlbikgewotICAgICAgdWludDhfdCBjaFRlbXAgPSBvbmVTdHJpbmcuR2V0QXQoaVRlbXApOwotICAgICAgaWYgKGNoVGVtcCAhPSB0d29TdHJpbmcuR2V0QXQoaUZpbmRJbmRleCkpIHsKLSAgICAgICAgaUZpbmRJbmRleCA9IDA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICArK2lUZW1wOwotICAgICAgKytpRmluZEluZGV4OwotICAgIH0KLSAgICBpZiAoaUZpbmRJbmRleCA9PSBpRmluZExlbikgewotICAgICAgcmVzdWx0U3RyaW5nIDw8IHRocmVlU3RyaW5nLkFzU3RyaW5nQygpOwotICAgICAgdSArPSBpRmluZExlbiAtIDE7Ci0gICAgICBpRmluZEluZGV4ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0U3RyaW5nLkFwcGVuZENoYXIoY2gpOwotICAgIH0KLSAgfQotICByZXN1bHRTdHJpbmcuQXBwZW5kQ2hhcigwKTsKLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcocmVzdWx0U3RyaW5nLkFzU3RyaW5nQygpKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpSaWdodChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAyKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIlJpZ2h0Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdUd28gPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7Ci0gIGlmICgoVmFsdWVJc051bGwocFRoaXMsIGFyZ09uZS5nZXQoKSkpIHx8Ci0gICAgICAoVmFsdWVJc051bGwocFRoaXMsIGFyZ1R3by5nZXQoKSkpKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgc291cmNlU3RyaW5nOwotICBWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUuZ2V0KCksIHNvdXJjZVN0cmluZyk7Ci0gIGludDMyX3QgY291bnQgPSBzdGQ6Om1heCgwLCBWYWx1ZVRvSW50ZWdlcihwVGhpcywgYXJnVHdvLmdldCgpKSk7Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKHNvdXJjZVN0cmluZy5SaWdodChjb3VudCkuQXNTdHJpbmdDKCkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlJ0cmltKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDEpIHsKLSAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiUnRyaW0iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgYXJnT25lLmdldCgpKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIHNvdXJjZVN0cmluZzsKLSAgVmFsdWVUb1VURjhTdHJpbmcoYXJnT25lLmdldCgpLCBzb3VyY2VTdHJpbmcpOwotICBzb3VyY2VTdHJpbmcuVHJpbVJpZ2h0KCk7Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKHNvdXJjZVN0cmluZy5Bc1N0cmluZ0MoKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6U3BhY2UoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMSkgewotICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJTcGFjZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgaWYgKGFyZ09uZS0+SXNOdWxsKCkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbnQzMl90IGNvdW50ID0gc3RkOjptYXgoMCwgVmFsdWVUb0ludGVnZXIocFRoaXMsIGFyZ09uZS5nZXQoKSkpOwotICBDRlhfQnl0ZVRleHRCdWYgc3BhY2VTdHJpbmc7Ci0gIGludDMyX3QgaW5kZXggPSAwOwotICB3aGlsZSAoaW5kZXggPCBjb3VudCkgewotICAgIHNwYWNlU3RyaW5nLkFwcGVuZEJ5dGUoJyAnKTsKLSAgICBpbmRleCsrOwotICB9Ci0gIHNwYWNlU3RyaW5nLkFwcGVuZEJ5dGUoMCk7Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKHNwYWNlU3RyaW5nLkFzU3RyaW5nQygpKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpTdHIoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBpbnQzMl90IGFyZ2MgPSBhcmdzLkdldExlbmd0aCgpOwotICBpZiAoYXJnYyA8IDEgfHwgYXJnYyA+IDMpIHsKLSAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiU3RyIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gbnVtYmVyVmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gIGlmIChudW1iZXJWYWx1ZS0+SXNOdWxsKCkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgRlhfRkxPQVQgZk51bWJlciA9IFZhbHVlVG9GbG9hdChwVGhpcywgbnVtYmVyVmFsdWUuZ2V0KCkpOwotCi0gIGludDMyX3QgaVdpZHRoID0gMTA7Ci0gIGlmIChhcmdjID4gMSkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IHdpZHRoVmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7Ci0gICAgaVdpZHRoID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oVmFsdWVUb0Zsb2F0KHBUaGlzLCB3aWR0aFZhbHVlLmdldCgpKSk7Ci0gIH0KLQotICBpbnQzMl90IGlQcmVjaXNpb24gPSAwOwotICBpZiAoYXJnYyA+IDIpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBwcmVjaXNpb25WYWx1ZSA9Ci0gICAgICAgIEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAyKTsKLSAgICBpUHJlY2lzaW9uID0gc3RkOjptYXgoCi0gICAgICAgIDAsIHN0YXRpY19jYXN0PGludDMyX3Q+KFZhbHVlVG9GbG9hdChwVGhpcywgcHJlY2lzaW9uVmFsdWUuZ2V0KCkpKSk7Ci0gIH0KLQotICBDRlhfQnl0ZVN0cmluZyBudW1iZXJTdHJpbmc7Ci0gIENGWF9CeXRlU3RyaW5nIGZvcm1hdFN0ciA9ICIlIjsKLSAgaWYgKGlQcmVjaXNpb24pIHsKLSAgICBmb3JtYXRTdHIgKz0gIi4iOwotICAgIGZvcm1hdFN0ciArPSBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0SW50ZWdlcihpUHJlY2lzaW9uKTsKLSAgfQotICBmb3JtYXRTdHIgKz0gImYiOwotICBudW1iZXJTdHJpbmcuRm9ybWF0KGZvcm1hdFN0ci5jX3N0cigpLCBmTnVtYmVyKTsKLQotICBjb25zdCBGWF9DSEFSKiBwRGF0YSA9IG51bWJlclN0cmluZy5jX3N0cigpOwotICBpbnQzMl90IGlMZW5ndGggPSBudW1iZXJTdHJpbmcuR2V0TGVuZ3RoKCk7Ci0gIGludDMyX3QgdSA9IDA7Ci0gIHdoaWxlICh1IDwgaUxlbmd0aCkgewotICAgIGlmIChwRGF0YVt1XSA9PSAnLicpCi0gICAgICBicmVhazsKLQotICAgICsrdTsKLSAgfQotCi0gIENGWF9CeXRlVGV4dEJ1ZiByZXN1bHRCdWY7Ci0gIGlmICh1ID4gaVdpZHRoIHx8IChpUHJlY2lzaW9uICsgdSkgPj0gaVdpZHRoKSB7Ci0gICAgaW50MzJfdCBpID0gMDsKLSAgICB3aGlsZSAoaSA8IGlXaWR0aCkgewotICAgICAgcmVzdWx0QnVmLkFwcGVuZENoYXIoJyonKTsKLSAgICAgICsraTsKLSAgICB9Ci0gICAgcmVzdWx0QnVmLkFwcGVuZENoYXIoMCk7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcocmVzdWx0QnVmLkFzU3RyaW5nQygpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAodSA9PSBpTGVuZ3RoKSB7Ci0gICAgaWYgKGlMZW5ndGggPiBpV2lkdGgpIHsKLSAgICAgIGludDMyX3QgaSA9IDA7Ci0gICAgICB3aGlsZSAoaSA8IGlXaWR0aCkgewotICAgICAgICByZXN1bHRCdWYuQXBwZW5kQ2hhcignKicpOwotICAgICAgICArK2k7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGludDMyX3QgaSA9IDA7Ci0gICAgICB3aGlsZSAoaSA8IGlXaWR0aCAtIGlMZW5ndGgpIHsKLSAgICAgICAgcmVzdWx0QnVmLkFwcGVuZENoYXIoJyAnKTsKLSAgICAgICAgKytpOwotICAgICAgfQotICAgICAgcmVzdWx0QnVmIDw8IHBEYXRhOwotICAgIH0KLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZyhyZXN1bHRCdWYuQXNTdHJpbmdDKCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGludDMyX3QgaUxlYXZpbmdTcGFjZSA9IGlXaWR0aCAtIHUgLSBpUHJlY2lzaW9uOwotICBpZiAoaVByZWNpc2lvbiAhPSAwKQotICAgIGlMZWF2aW5nU3BhY2UtLTsKLQotICBpbnQzMl90IGkgPSAwOwotICB3aGlsZSAoaSA8IGlMZWF2aW5nU3BhY2UpIHsKLSAgICByZXN1bHRCdWYuQXBwZW5kQ2hhcignICcpOwotICAgICsraTsKLSAgfQotICBpID0gMDsKLSAgd2hpbGUgKGkgPCB1KSB7Ci0gICAgcmVzdWx0QnVmLkFwcGVuZENoYXIocERhdGFbaV0pOwotICAgICsraTsKLSAgfQotICBpZiAoaVByZWNpc2lvbiAhPSAwKQotICAgIHJlc3VsdEJ1Zi5BcHBlbmRDaGFyKCcuJyk7Ci0KLSAgdSsrOwotICBpID0gMDsKLSAgd2hpbGUgKHUgPCBpTGVuZ3RoKSB7Ci0gICAgaWYgKGkgPj0gaVByZWNpc2lvbikKLSAgICAgIGJyZWFrOwotCi0gICAgcmVzdWx0QnVmLkFwcGVuZENoYXIocERhdGFbdV0pOwotICAgICsraTsKLSAgICArK3U7Ci0gIH0KLSAgd2hpbGUgKGkgPCBpUHJlY2lzaW9uKSB7Ci0gICAgcmVzdWx0QnVmLkFwcGVuZENoYXIoJzAnKTsKLSAgICArK2k7Ci0gIH0KLSAgcmVzdWx0QnVmLkFwcGVuZENoYXIoMCk7Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKHJlc3VsdEJ1Zi5Bc1N0cmluZ0MoKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6U3R1ZmYoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKLSAgaWYgKGFyZ2MgPCAzIHx8IGFyZ2MgPiA0KSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIlN0dWZmIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgc291cmNlU3RyaW5nOwotICBDRlhfQnl0ZVN0cmluZyBpbnNlcnRTdHJpbmc7Ci0gIGludDMyX3QgaUxlbmd0aCA9IDA7Ci0gIGludDMyX3QgaVN0YXJ0ID0gMDsKLSAgaW50MzJfdCBpRGVsZXRlID0gMDsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gc291cmNlVmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IHN0YXJ0VmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGRlbGV0ZVZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDIpOwotICBpZiAoIXNvdXJjZVZhbHVlLT5Jc051bGwoKSAmJiAhc3RhcnRWYWx1ZS0+SXNOdWxsKCkgJiYKLSAgICAgICFkZWxldGVWYWx1ZS0+SXNOdWxsKCkpIHsKLSAgICBWYWx1ZVRvVVRGOFN0cmluZyhzb3VyY2VWYWx1ZS5nZXQoKSwgc291cmNlU3RyaW5nKTsKLSAgICBpTGVuZ3RoID0gc291cmNlU3RyaW5nLkdldExlbmd0aCgpOwotICAgIGlTdGFydCA9IHN0ZDo6bWluKGlMZW5ndGgsIHN0ZDo6bWF4KDEsIHN0YXRpY19jYXN0PGludDMyX3Q+KFZhbHVlVG9GbG9hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRoaXMsIHN0YXJ0VmFsdWUuZ2V0KCkpKSkpOwotICAgIGlEZWxldGUgPSBzdGQ6Om1heCgKLSAgICAgICAgMCwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oVmFsdWVUb0Zsb2F0KHBUaGlzLCBkZWxldGVWYWx1ZS5nZXQoKSkpKTsKLSAgfQotCi0gIGlmIChhcmdjID4gMykgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGluc2VydFZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDMpOwotICAgIFZhbHVlVG9VVEY4U3RyaW5nKGluc2VydFZhbHVlLmdldCgpLCBpbnNlcnRTdHJpbmcpOwotICB9Ci0KLSAgaVN0YXJ0IC09IDE7Ci0gIENGWF9CeXRlVGV4dEJ1ZiByZXN1bHRTdHJpbmc7Ci0gIGludDMyX3QgaSA9IDA7Ci0gIHdoaWxlIChpIDwgaVN0YXJ0KSB7Ci0gICAgcmVzdWx0U3RyaW5nLkFwcGVuZENoYXIoc291cmNlU3RyaW5nLkdldEF0KGkpKTsKLSAgICArK2k7Ci0gIH0KLSAgcmVzdWx0U3RyaW5nIDw8IGluc2VydFN0cmluZy5Bc1N0cmluZ0MoKTsKLSAgaSA9IGlTdGFydCArIGlEZWxldGU7Ci0gIHdoaWxlIChpIDwgaUxlbmd0aCkgewotICAgIHJlc3VsdFN0cmluZy5BcHBlbmRDaGFyKHNvdXJjZVN0cmluZy5HZXRBdChpKSk7Ci0gICAgKytpOwotICB9Ci0gIHJlc3VsdFN0cmluZy5BcHBlbmRDaGFyKDApOwotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZyhyZXN1bHRTdHJpbmcuQXNTdHJpbmdDKCkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlN1YnN0cihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDMpIHsKLSAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiU3Vic3RyIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gc3RyaW5nVmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IHN0YXJ0VmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGVuZFZhbHVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDIpOwotICBpZiAoVmFsdWVJc051bGwocFRoaXMsIHN0cmluZ1ZhbHVlLmdldCgpKSB8fAotICAgICAgKFZhbHVlSXNOdWxsKHBUaGlzLCBzdGFydFZhbHVlLmdldCgpKSkgfHwKLSAgICAgIChWYWx1ZUlzTnVsbChwVGhpcywgZW5kVmFsdWUuZ2V0KCkpKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIHN6U291cmNlU3RyOwotICBpbnQzMl90IGlTdGFydCA9IDA7Ci0gIGludDMyX3QgaUNvdW50ID0gMDsKLSAgVmFsdWVUb1VURjhTdHJpbmcoc3RyaW5nVmFsdWUuZ2V0KCksIHN6U291cmNlU3RyKTsKLSAgaW50MzJfdCBpTGVuZ3RoID0gc3pTb3VyY2VTdHIuR2V0TGVuZ3RoKCk7Ci0gIGlmIChpTGVuZ3RoID09IDApIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygiIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaVN0YXJ0ID0gc3RkOjptaW4oCi0gICAgICBpTGVuZ3RoLAotICAgICAgc3RkOjptYXgoMSwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oVmFsdWVUb0Zsb2F0KHBUaGlzLCBzdGFydFZhbHVlLmdldCgpKSkpKTsKLSAgaUNvdW50ID0KLSAgICAgIHN0ZDo6bWF4KDAsIHN0YXRpY19jYXN0PGludDMyX3Q+KFZhbHVlVG9GbG9hdChwVGhpcywgZW5kVmFsdWUuZ2V0KCkpKSk7Ci0KLSAgaVN0YXJ0IC09IDE7Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKHN6U291cmNlU3RyLk1pZChpU3RhcnQsIGlDb3VudCkuQXNTdHJpbmdDKCkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlV1aWQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7Ci0gIGlmIChhcmdjIDwgMCB8fCBhcmdjID4gMSkgewotICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJVdWlkIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW50MzJfdCBpTnVtID0gMDsKLSAgaWYgKGFyZ2MgPiAwKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICAgIGlOdW0gPSBzdGF0aWNfY2FzdDxpbnQzMl90PihWYWx1ZVRvRmxvYXQocFRoaXMsIGFyZ09uZS5nZXQoKSkpOwotICB9Ci0gIEZYX0dVSUQgZ3VpZDsKLSAgRlhfR1VJRF9DcmVhdGVWNCgmZ3VpZCk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgYnNVSWQ7Ci0gIEZYX0dVSURfVG9TdHJpbmcoJmd1aWQsIGJzVUlkLCAhIWlOdW0pOwotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZyhic1VJZC5Bc1N0cmluZ0MoKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6VXBwZXIoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKLSAgaWYgKGFyZ2MgPCAxIHx8IGFyZ2MgPiAyKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIlVwcGVyIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBpZiAoVmFsdWVJc051bGwocFRoaXMsIGFyZ09uZS5nZXQoKSkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDRlhfQnl0ZVN0cmluZyBhcmdTdHJpbmc7Ci0gIFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZS5nZXQoKSwgYXJnU3RyaW5nKTsKLQotICBDRlhfV2lkZVRleHRCdWYgdXBwZXJTdHJpbmdCdWY7Ci0gIENGWF9XaWRlU3RyaW5nIHdzQXJnU3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGFyZ1N0cmluZy5Bc1N0cmluZ0MoKSk7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwRGF0YSA9IHdzQXJnU3RyaW5nLmNfc3RyKCk7Ci0gIGludDMyX3QgaSA9IDA7Ci0gIHdoaWxlIChpIDwgd3NBcmdTdHJpbmcuR2V0TGVuZ3RoKCkpIHsKLSAgICBpbnQzMl90IGNoID0gcERhdGFbaV07Ci0gICAgaWYgKChjaCA+PSAweDYxICYmIGNoIDw9IDB4N0EpIHx8IChjaCA+PSAweEUwICYmIGNoIDw9IDB4RkUpKQotICAgICAgY2ggLT0gMzI7Ci0gICAgZWxzZSBpZiAoY2ggPT0gMHgxMDEgfHwgY2ggPT0gMHgxMDMgfHwgY2ggPT0gMHgxMDUpCi0gICAgICBjaCAtPSAxOwotCi0gICAgdXBwZXJTdHJpbmdCdWYuQXBwZW5kQ2hhcihjaCk7Ci0gICAgKytpOwotICB9Ci0gIHVwcGVyU3RyaW5nQnVmLkFwcGVuZENoYXIoMCk7Ci0KLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoCi0gICAgICBGWF9VVEY4RW5jb2RlKHVwcGVyU3RyaW5nQnVmLkFzU3RyaW5nQygpKS5Bc1N0cmluZ0MoKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6V29yZE51bShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKLSAgaWYgKGFyZ2MgPCAxIHx8IGFyZ2MgPiAzKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIldvcmROdW0iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBudW1iZXJWYWx1ZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgaWYgKG51bWJlclZhbHVlLT5Jc051bGwoKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotICBGWF9GTE9BVCBmTnVtYmVyID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBudW1iZXJWYWx1ZS5nZXQoKSk7Ci0KLSAgaW50MzJfdCBpSWRlbnRpZmllciA9IDA7Ci0gIGlmIChhcmdjID4gMSkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGlkZW50aWZpZXJWYWx1ZSA9Ci0gICAgICAgIEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKLSAgICBpZiAoaWRlbnRpZmllclZhbHVlLT5Jc051bGwoKSkgewotICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlJZGVudGlmaWVyID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oVmFsdWVUb0Zsb2F0KHBUaGlzLCBpZGVudGlmaWVyVmFsdWUuZ2V0KCkpKTsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIGxvY2FsZVN0cmluZzsKLSAgaWYgKGFyZ2MgPiAyKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gbG9jYWxlVmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMik7Ci0gICAgaWYgKGxvY2FsZVZhbHVlLT5Jc051bGwoKSkgewotICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIFZhbHVlVG9VVEY4U3RyaW5nKGxvY2FsZVZhbHVlLmdldCgpLCBsb2NhbGVTdHJpbmcpOwotICB9Ci0KLSAgaWYgKGZOdW1iZXIgPCAwLjBmIHx8IGZOdW1iZXIgPiA5MjIzMzcyMDM2ODU0Nzc1NTAuMGYpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygiKiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIG51bWJlclN0cmluZzsKLSAgbnVtYmVyU3RyaW5nLkZvcm1hdCgiJS4yZiIsIGZOdW1iZXIpOwotCi0gIENGWF9CeXRlVGV4dEJ1ZiByZXN1bHRCdWY7Ci0gIFdvcmRVUyhudW1iZXJTdHJpbmcuQXNTdHJpbmdDKCksIGlJZGVudGlmaWVyLCByZXN1bHRCdWYpOwotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZyhyZXN1bHRCdWYuQXNTdHJpbmdDKCkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlRyaWxsaW9uVVMoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlVGV4dEJ1ZiYgc3RyQnVmKSB7Ci0gIENGWF9CeXRlU3RyaW5nQyBwVW5pdHNbXSA9IHsiemVybyIsICJvbmUiLCAidHdvIiwgICAidGhyZWUiLCAiZm91ciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZml2ZSIsICJzaXgiLCAic2V2ZW4iLCAiZWlnaHQiLCAibmluZSJ9OwotICBDRlhfQnl0ZVN0cmluZ0MgcENhcFVuaXRzW10gPSB7Ilplcm8iLCAiT25lIiwgIlR3byIsICAgIlRocmVlIiwgIkZvdXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpdmUiLCAiU2l4IiwgIlNldmVuIiwgIkVpZ2h0IiwgIk5pbmUifTsKLSAgQ0ZYX0J5dGVTdHJpbmdDIHBUZW5zW10gPSB7IlRlbiIsICAgICAgIkVsZXZlbiIsICAiVHdlbHZlIiwgICJUaGlydGVlbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb3VydGVlbiIsICJGaWZ0ZWVuIiwgIlNpeHRlZW4iLCAiU2V2ZW50ZWVuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVpZ2h0ZWVuIiwgIk5pbmV0ZWVuIn07Ci0gIENGWF9CeXRlU3RyaW5nQyBwTGFzdFRlbnNbXSA9IHsiVHdlbnR5IiwgIlRoaXJ0eSIsICAiRm9ydHkiLCAgIkZpZnR5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTaXh0eSIsICAiU2V2ZW50eSIsICJFaWdodHkiLCAiTmluZXR5In07Ci0gIENGWF9CeXRlU3RyaW5nQyBwQ29tbVtdID0geyIgSHVuZHJlZCAiLCAiIFRob3VzYW5kICIsICIgTWlsbGlvbiAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIEJpbGxpb24gIiwgIlRyaWxsaW9uIn07Ci0gIGNvbnN0IEZYX0NIQVIqIHBEYXRhID0gc3pEYXRhLmNfc3RyKCk7Ci0gIGludDMyX3QgaUxlbmd0aCA9IHN6RGF0YS5HZXRMZW5ndGgoKTsKLSAgaW50MzJfdCBpQ29tbSA9IDA7Ci0gIGlmIChpTGVuZ3RoID4gMTIpCi0gICAgaUNvbW0gPSA0OwotICBlbHNlIGlmIChpTGVuZ3RoID4gOSkKLSAgICBpQ29tbSA9IDM7Ci0gIGVsc2UgaWYgKGlMZW5ndGggPiA2KQotICAgIGlDb21tID0gMjsKLSAgZWxzZSBpZiAoaUxlbmd0aCA+IDMpCi0gICAgaUNvbW0gPSAxOwotCi0gIGludDMyX3QgaUZpcnN0Q291bnQgPSBpTGVuZ3RoICUgMzsKLSAgaWYgKGlGaXJzdENvdW50ID09IDApCi0gICAgaUZpcnN0Q291bnQgPSAzOwotCi0gIGludDMyX3QgaUluZGV4ID0gMDsKLSAgaWYgKGlGaXJzdENvdW50ID09IDMpIHsKLSAgICBpZiAocERhdGFbaUluZGV4XSAhPSAnMCcpIHsKLSAgICAgIHN0ckJ1ZiA8PCBwQ2FwVW5pdHNbcERhdGFbaUluZGV4XSAtICcwJ107Ci0gICAgICBzdHJCdWYgPDwgcENvbW1bMF07Ci0gICAgfQotICAgIGlmIChwRGF0YVtpSW5kZXggKyAxXSA9PSAnMCcpIHsKLSAgICAgIHN0ckJ1ZiA8PCBwQ2FwVW5pdHNbcERhdGFbaUluZGV4ICsgMl0gLSAnMCddOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAocERhdGFbaUluZGV4ICsgMV0gPiAnMScpIHsKLSAgICAgICAgc3RyQnVmIDw8IHBMYXN0VGVuc1twRGF0YVtpSW5kZXggKyAxXSAtICcyJ107Ci0gICAgICAgIHN0ckJ1ZiA8PCAiLSI7Ci0gICAgICAgIHN0ckJ1ZiA8PCBwVW5pdHNbcERhdGFbaUluZGV4ICsgMl0gLSAnMCddOwotICAgICAgfSBlbHNlIGlmIChwRGF0YVtpSW5kZXggKyAxXSA9PSAnMScpIHsKLSAgICAgICAgc3RyQnVmIDw8IHBUZW5zW3BEYXRhW2lJbmRleCArIDJdIC0gJzAnXTsKLSAgICAgIH0gZWxzZSBpZiAocERhdGFbaUluZGV4ICsgMV0gPT0gJzAnKSB7Ci0gICAgICAgIHN0ckJ1ZiA8PCBwQ2FwVW5pdHNbcERhdGFbaUluZGV4ICsgMl0gLSAnMCddOwotICAgICAgfQotICAgIH0KLSAgICBpSW5kZXggKz0gMzsKLSAgfSBlbHNlIGlmIChpRmlyc3RDb3VudCA9PSAyKSB7Ci0gICAgaWYgKHBEYXRhW2lJbmRleF0gPT0gJzAnKSB7Ci0gICAgICBzdHJCdWYgPDwgcENhcFVuaXRzW3BEYXRhW2lJbmRleCArIDFdIC0gJzAnXTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKHBEYXRhW2lJbmRleF0gPiAnMScpIHsKLSAgICAgICAgc3RyQnVmIDw8IHBMYXN0VGVuc1twRGF0YVtpSW5kZXhdIC0gJzInXTsKLSAgICAgICAgc3RyQnVmIDw8ICItIjsKLSAgICAgICAgc3RyQnVmIDw8IHBVbml0c1twRGF0YVtpSW5kZXggKyAxXSAtICcwJ107Ci0gICAgICB9IGVsc2UgaWYgKHBEYXRhW2lJbmRleF0gPT0gJzEnKSB7Ci0gICAgICAgIHN0ckJ1ZiA8PCBwVGVuc1twRGF0YVtpSW5kZXggKyAxXSAtICcwJ107Ci0gICAgICB9IGVsc2UgaWYgKHBEYXRhW2lJbmRleF0gPT0gJzAnKSB7Ci0gICAgICAgIHN0ckJ1ZiA8PCBwQ2FwVW5pdHNbcERhdGFbaUluZGV4ICsgMV0gLSAnMCddOwotICAgICAgfQotICAgIH0KLSAgICBpSW5kZXggKz0gMjsKLSAgfSBlbHNlIGlmIChpRmlyc3RDb3VudCA9PSAxKSB7Ci0gICAgc3RyQnVmIDw8IHBDYXBVbml0c1twRGF0YVtpSW5kZXhdIC0gJzAnXTsKLSAgICBpSW5kZXggKz0gMTsKLSAgfQotICBpZiAoaUxlbmd0aCA+IDMgJiYgaUZpcnN0Q291bnQgPiAwKSB7Ci0gICAgc3RyQnVmIDw8IHBDb21tW2lDb21tXTsKLSAgICAtLWlDb21tOwotICB9Ci0gIHdoaWxlIChpSW5kZXggPCBpTGVuZ3RoKSB7Ci0gICAgaWYgKHBEYXRhW2lJbmRleF0gIT0gJzAnKSB7Ci0gICAgICBzdHJCdWYgPDwgcENhcFVuaXRzW3BEYXRhW2lJbmRleF0gLSAnMCddOwotICAgICAgc3RyQnVmIDw8IHBDb21tWzBdOwotICAgIH0KLSAgICBpZiAocERhdGFbaUluZGV4ICsgMV0gPT0gJzAnKSB7Ci0gICAgICBzdHJCdWYgPDwgcENhcFVuaXRzW3BEYXRhW2lJbmRleCArIDJdIC0gJzAnXTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKHBEYXRhW2lJbmRleCArIDFdID4gJzEnKSB7Ci0gICAgICAgIHN0ckJ1ZiA8PCBwTGFzdFRlbnNbcERhdGFbaUluZGV4ICsgMV0gLSAnMiddOwotICAgICAgICBzdHJCdWYgPDwgIi0iOwotICAgICAgICBzdHJCdWYgPDwgcFVuaXRzW3BEYXRhW2lJbmRleCArIDJdIC0gJzAnXTsKLSAgICAgIH0gZWxzZSBpZiAocERhdGFbaUluZGV4ICsgMV0gPT0gJzEnKSB7Ci0gICAgICAgIHN0ckJ1ZiA8PCBwVGVuc1twRGF0YVtpSW5kZXggKyAyXSAtICcwJ107Ci0gICAgICB9IGVsc2UgaWYgKHBEYXRhW2lJbmRleCArIDFdID09ICcwJykgewotICAgICAgICBzdHJCdWYgPDwgcENhcFVuaXRzW3BEYXRhW2lJbmRleCArIDJdIC0gJzAnXTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGlJbmRleCA8IGlMZW5ndGggLSAzKSB7Ci0gICAgICBzdHJCdWYgPDwgcENvbW1baUNvbW1dOwotICAgICAgLS1pQ29tbTsKLSAgICB9Ci0gICAgaUluZGV4ICs9IDM7Ci0gIH0KLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpXb3JkVVMoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmJiBzdHJCdWYpIHsKLSAgY29uc3QgRlhfQ0hBUiogcERhdGEgPSBzekRhdGEuY19zdHIoKTsKLSAgaW50MzJfdCBpTGVuZ3RoID0gc3pEYXRhLkdldExlbmd0aCgpOwotICBpZiAoaVN0eWxlIDwgMCB8fCBpU3R5bGUgPiAyKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW50MzJfdCBpSW5kZXggPSAwOwotICB3aGlsZSAoaUluZGV4IDwgaUxlbmd0aCkgewotICAgIGlmIChwRGF0YVtpSW5kZXhdID09ICcuJykKLSAgICAgIGJyZWFrOwotICAgICsraUluZGV4OwotICB9Ci0gIGludDMyX3QgaUludGVnZXIgPSBpSW5kZXg7Ci0gIGlJbmRleCA9IDA7Ci0gIHdoaWxlIChpSW5kZXggPCBpSW50ZWdlcikgewotICAgIGludDMyX3QgaUNvdW50ID0gKGlJbnRlZ2VyIC0gaUluZGV4KSAlIDEyOwotICAgIGlmICghaUNvdW50ICYmIGlJbnRlZ2VyIC0gaUluZGV4ID4gMCkKLSAgICAgIGlDb3VudCA9IDEyOwotCi0gICAgVHJpbGxpb25VUyhDRlhfQnl0ZVN0cmluZ0MocERhdGEgKyBpSW5kZXgsIGlDb3VudCksIHN0ckJ1Zik7Ci0gICAgaUluZGV4ICs9IGlDb3VudDsKLSAgICBpZiAoaUluZGV4IDwgaUludGVnZXIpCi0gICAgICBzdHJCdWYgPDwgIiBUcmlsbGlvbiAiOwotICB9Ci0KLSAgaWYgKGlTdHlsZSA+IDApCi0gICAgc3RyQnVmIDw8ICIgRG9sbGFycyI7Ci0KLSAgaWYgKGlTdHlsZSA+IDEgJiYgaUludGVnZXIgPCBpTGVuZ3RoKSB7Ci0gICAgc3RyQnVmIDw8ICIgQW5kICI7Ci0gICAgaUluZGV4ID0gaUludGVnZXIgKyAxOwotICAgIHdoaWxlIChpSW5kZXggPCBpTGVuZ3RoKSB7Ci0gICAgICBpbnQzMl90IGlDb3VudCA9IChpTGVuZ3RoIC0gaUluZGV4KSAlIDEyOwotICAgICAgaWYgKCFpQ291bnQgJiYgaUxlbmd0aCAtIGlJbmRleCA+IDApCi0gICAgICAgIGlDb3VudCA9IDEyOwotCi0gICAgICBUcmlsbGlvblVTKENGWF9CeXRlU3RyaW5nQyhwRGF0YSArIGlJbmRleCwgaUNvdW50KSwgc3RyQnVmKTsKLSAgICAgIGlJbmRleCArPSBpQ291bnQ7Ci0gICAgICBpZiAoaUluZGV4IDwgaUxlbmd0aCkKLSAgICAgICAgc3RyQnVmIDw8ICIgVHJpbGxpb24gIjsKLSAgICB9Ci0gICAgc3RyQnVmIDw8ICIgQ2VudHMiOwotICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6R2V0KENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOwotICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAxKSB7Ci0gICAgcENvbnRleHQtPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiR2V0Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IHBDb250ZXh0LT5HZXREb2N1bWVudCgpOwotICBpZiAoIXBEb2MpCi0gICAgcmV0dXJuOwotCi0gIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9IHBEb2MtPkdldE5vdGlmeSgpLT5HZXRBcHBQcm92aWRlcigpOwotICBpZiAoIXBBcHBQcm92aWRlcikKLSAgICByZXR1cm47Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBDRlhfQnl0ZVN0cmluZyB1cmxTdHJpbmc7Ci0gIFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZS5nZXQoKSwgdXJsU3RyaW5nKTsKLSAgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBwRmlsZSA9IHBBcHBQcm92aWRlci0+RG93bmxvYWRVUkwoCi0gICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgodXJsU3RyaW5nLkFzU3RyaW5nQygpKSk7Ci0gIGlmICghcEZpbGUpCi0gICAgcmV0dXJuOwotCi0gIGludDMyX3Qgc2l6ZSA9IHBGaWxlLT5HZXRTaXplKCk7Ci0gIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBEYXRhKHNpemUpOwotICBwRmlsZS0+UmVhZEJsb2NrKHBEYXRhLmRhdGEoKSwgc2l6ZSk7Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKENGWF9CeXRlU3RyaW5nQyhwRGF0YS5kYXRhKCksIHNpemUpKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpQb3N0KENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cik7Ci0gIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7Ci0gIGlmIChhcmdjIDwgMiB8fCBhcmdjID4gNSkgewotICAgIHBDb250ZXh0LT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIlBvc3QiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDWEZBX0RvY3VtZW50KiBwRG9jID0gcENvbnRleHQtPkdldERvY3VtZW50KCk7Ci0gIGlmICghcERvYykKLSAgICByZXR1cm47Ci0KLSAgSVhGQV9BcHBQcm92aWRlciogcEFwcFByb3ZpZGVyID0gcERvYy0+R2V0Tm90aWZ5KCktPkdldEFwcFByb3ZpZGVyKCk7Ci0gIGlmICghcEFwcFByb3ZpZGVyKQotICAgIHJldHVybjsKLQotICBDRlhfQnl0ZVN0cmluZyBic1VSTDsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUuZ2V0KCksIGJzVVJMKTsKLQotICBDRlhfQnl0ZVN0cmluZyBic0RhdGE7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1R3byA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKLSAgVmFsdWVUb1VURjhTdHJpbmcoYXJnVHdvLmdldCgpLCBic0RhdGEpOwotCi0gIENGWF9CeXRlU3RyaW5nIGJzQ29udGVudFR5cGU7Ci0gIGlmIChhcmdjID4gMikgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1RocmVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDIpOwotICAgIFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1RocmVlLmdldCgpLCBic0NvbnRlbnRUeXBlKTsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIGJzRW5jb2RlOwotICBpZiAoYXJnYyA+IDMpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdGb3VyID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDMpOwotICAgIFZhbHVlVG9VVEY4U3RyaW5nKGFyZ0ZvdXIuZ2V0KCksIGJzRW5jb2RlKTsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIGJzSGVhZGVyOwotICBpZiAoYXJnYyA+IDQpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdGaXZlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDQpOwotICAgIFZhbHVlVG9VVEY4U3RyaW5nKGFyZ0ZpdmUuZ2V0KCksIGJzSGVhZGVyKTsKLSAgfQotCi0gIENGWF9XaWRlU3RyaW5nIGRlY29kZWRSZXNwb25zZTsKLSAgaWYgKCFwQXBwUHJvdmlkZXItPlBvc3RSZXF1ZXN0VVJMKAotICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1VSTC5Bc1N0cmluZ0MoKSksCi0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRGF0YS5Bc1N0cmluZ0MoKSksCi0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzQ29udGVudFR5cGUuQXNTdHJpbmdDKCkpLAotICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0VuY29kZS5Bc1N0cmluZ0MoKSksCi0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzSGVhZGVyLkFzU3RyaW5nQygpKSwgZGVjb2RlZFJlc3BvbnNlKSkgewotICAgIHBDb250ZXh0LT5UaHJvd1NlcnZlckRlbmllZEV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZyhkZWNvZGVkUmVzcG9uc2UuVVRGOEVuY29kZSgpLkFzU3RyaW5nQygpKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpQdXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cik7Ci0gIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7Ci0gIGlmIChhcmdjIDwgMiB8fCBhcmdjID4gMykgewotICAgIHBDb250ZXh0LT5UaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIlB1dCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBwQ29udGV4dC0+R2V0RG9jdW1lbnQoKTsKLSAgaWYgKCFwRG9jKQotICAgIHJldHVybjsKLQotICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPSBwRG9jLT5HZXROb3RpZnkoKS0+R2V0QXBwUHJvdmlkZXIoKTsKLSAgaWYgKCFwQXBwUHJvdmlkZXIpCi0gICAgcmV0dXJuOwotCi0gIENGWF9CeXRlU3RyaW5nIGJzVVJMOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gIFZhbHVlVG9VVEY4U3RyaW5nKGFyZ09uZS5nZXQoKSwgYnNVUkwpOwotCi0gIENGWF9CeXRlU3RyaW5nIGJzRGF0YTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnVHdvID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOwotICBWYWx1ZVRvVVRGOFN0cmluZyhhcmdUd28uZ2V0KCksIGJzRGF0YSk7Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgYnNFbmNvZGU7Ci0gIGlmIChhcmdjID4gMikgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1RocmVlID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDIpOwotICAgIFZhbHVlVG9VVEY4U3RyaW5nKGFyZ1RocmVlLmdldCgpLCBic0VuY29kZSk7Ci0gIH0KLQotICBpZiAoIXBBcHBQcm92aWRlci0+UHV0UmVxdWVzdFVSTCgKLSAgICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNVUkwuQXNTdHJpbmdDKCkpLAotICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0RhdGEuQXNTdHJpbmdDKCkpLAotICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0VuY29kZS5Bc1N0cmluZ0MoKSkpKSB7Ci0gICAgcENvbnRleHQtPlRocm93U2VydmVyRGVuaWVkRXhjZXB0aW9uKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRTdHJpbmcoIiIpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmFzc2lnbl92YWx1ZV9vcGVyYXRvcihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKLSAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMikgewotICAgIHBDb250ZXh0LT5UaHJvd0NvbXBpbGVyRXJyb3JFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBsVmFsdWUgPSBhcmdzLkdldFZhbHVlKDApOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiByVmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7Ci0gIGlmIChsVmFsdWUtPklzQXJyYXkoKSkgewotICAgIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7Ci0gICAgYXV0byBsZWZ0TGVuZ3RoVmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgbFZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eSgibGVuZ3RoIiwgbGVmdExlbmd0aFZhbHVlLmdldCgpKTsKLSAgICBpbnQzMl90IGlMZWZ0TGVuZ3RoID0gbGVmdExlbmd0aFZhbHVlLT5Ub0ludGVnZXIoKTsKLSAgICBhdXRvIGpzT2JqZWN0VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgYXV0byBwcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICAgIGxWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgxLCBwcm9wZXJ0eVZhbHVlLmdldCgpKTsKLSAgICBpZiAocHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkpIHsKLSAgICAgIGZvciAoaW50MzJfdCBpID0gMjsgaSA8IGlMZWZ0TGVuZ3RoOyBpKyspIHsKLSAgICAgICAgbFZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KGksIGpzT2JqZWN0VmFsdWUuZ2V0KCkpOwotICAgICAgICBpZiAoIVNldE9iamVjdERlZmF1bHRWYWx1ZShqc09iamVjdFZhbHVlLmdldCgpLCByVmFsdWUuZ2V0KCkpKSB7Ci0gICAgICAgICAgcENvbnRleHQtPlRocm93Tm9EZWZhdWx0UHJvcGVydHlFeGNlcHRpb24oc3pGdW5jTmFtZSk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAoaW50MzJfdCBpID0gMjsgaSA8IGlMZWZ0TGVuZ3RoOyBpKyspIHsKLSAgICAgICAgbFZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KGksIGpzT2JqZWN0VmFsdWUuZ2V0KCkpOwotICAgICAgICBqc09iamVjdFZhbHVlLT5TZXRPYmplY3RQcm9wZXJ0eShwcm9wZXJ0eVZhbHVlLT5Ub1N0cmluZygpLkFzU3RyaW5nQygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByVmFsdWUuZ2V0KCkpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIGlmIChsVmFsdWUtPklzT2JqZWN0KCkpIHsKLSAgICBpZiAoIVNldE9iamVjdERlZmF1bHRWYWx1ZShsVmFsdWUuZ2V0KCksIHJWYWx1ZS5nZXQoKSkpIHsKLSAgICAgIHBDb250ZXh0LT5UaHJvd05vRGVmYXVsdFByb3BlcnR5RXhjZXB0aW9uKHN6RnVuY05hbWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICBhcmdzLkdldFJldHVyblZhbHVlKCktPkFzc2lnbihyVmFsdWUuZ2V0KCkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmxvZ2ljYWxfb3Jfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDIpIHsKLSAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93Q29tcGlsZXJFcnJvckV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ0ZpcnN0ID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdTZWNvbmQgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7Ci0gIGlmIChhcmdGaXJzdC0+SXNOdWxsKCkgJiYgYXJnU2Vjb25kLT5Jc051bGwoKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEZYX0ZMT0FUIGZpcnN0ID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdGaXJzdC5nZXQoKSk7Ci0gIEZYX0ZMT0FUIHNlY29uZCA9IFZhbHVlVG9GbG9hdChwVGhpcywgYXJnU2Vjb25kLmdldCgpKTsKLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKChmaXJzdCB8fCBzZWNvbmQpID8gMSA6IDApOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmxvZ2ljYWxfYW5kX29wZXJhdG9yKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDIpIHsKLSAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93Q29tcGlsZXJFcnJvckV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ0ZpcnN0ID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdTZWNvbmQgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7Ci0gIGlmIChhcmdGaXJzdC0+SXNOdWxsKCkgJiYgYXJnU2Vjb25kLT5Jc051bGwoKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEZYX0ZMT0FUIGZpcnN0ID0gVmFsdWVUb0Zsb2F0KHBUaGlzLCBhcmdGaXJzdC5nZXQoKSk7Ci0gIEZYX0ZMT0FUIHNlY29uZCA9IFZhbHVlVG9GbG9hdChwVGhpcywgYXJnU2Vjb25kLmdldCgpKTsKLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKChmaXJzdCAmJiBzZWNvbmQpID8gMSA6IDApOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmVxdWFsaXR5X29wZXJhdG9yKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDIpIHsKLSAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93Q29tcGlsZXJFcnJvckV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChmbV9yZWZfZXF1YWwocFRoaXMsIGFyZ3MpKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKDEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ0ZpcnN0ID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdTZWNvbmQgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7Ci0gIGlmIChhcmdGaXJzdC0+SXNOdWxsKCkgfHwgYXJnU2Vjb25kLT5Jc051bGwoKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcigKLSAgICAgICAgKGFyZ0ZpcnN0LT5Jc051bGwoKSAmJiBhcmdTZWNvbmQtPklzTnVsbCgpKSA/IDEgOiAwKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoYXJnRmlyc3QtPklzU3RyaW5nKCkgJiYgYXJnU2Vjb25kLT5Jc1N0cmluZygpKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKGFyZ0ZpcnN0LT5Ub1N0cmluZygpID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1NlY29uZC0+VG9TdHJpbmcoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRlhfRE9VQkxFIGZpcnN0ID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnRmlyc3QuZ2V0KCkpOwotICBGWF9ET1VCTEUgc2Vjb25kID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnU2Vjb25kLmdldCgpKTsKLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKChmaXJzdCA9PSBzZWNvbmQpID8gMSA6IDApOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Om5vdGVxdWFsaXR5X29wZXJhdG9yKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDIpIHsKLSAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93Q29tcGlsZXJFcnJvckV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChmbV9yZWZfZXF1YWwocFRoaXMsIGFyZ3MpKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKDApOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ0ZpcnN0ID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdTZWNvbmQgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7Ci0gIGlmIChhcmdGaXJzdC0+SXNOdWxsKCkgfHwgYXJnU2Vjb25kLT5Jc051bGwoKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcigKLSAgICAgICAgKGFyZ0ZpcnN0LT5Jc051bGwoKSAmJiBhcmdTZWNvbmQtPklzTnVsbCgpKSA/IDAgOiAxKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoYXJnRmlyc3QtPklzU3RyaW5nKCkgJiYgYXJnU2Vjb25kLT5Jc1N0cmluZygpKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKGFyZ0ZpcnN0LT5Ub1N0cmluZygpICE9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1NlY29uZC0+VG9TdHJpbmcoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRlhfRE9VQkxFIGZpcnN0ID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnRmlyc3QuZ2V0KCkpOwotICBGWF9ET1VCTEUgc2Vjb25kID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnU2Vjb25kLmdldCgpKTsKLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKGZpcnN0ICE9IHNlY29uZCk7Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBDWEZBX0ZNMkpTQ29udGV4dDo6Zm1fcmVmX2VxdWFsKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdGaXJzdCA9IGFyZ3MuR2V0VmFsdWUoMCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1NlY29uZCA9IGFyZ3MuR2V0VmFsdWUoMSk7Ci0gIGlmICghYXJnRmlyc3QtPklzQXJyYXkoKSB8fCAhYXJnU2Vjb25kLT5Jc0FycmF5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+R2V0U2NyaXB0UnVudGltZSgpOwotICBhdXRvIGZpcnN0RmxhZ1ZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICBhdXRvIHNlY29uZEZsYWdWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKLSAgYXJnRmlyc3QtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMCwgZmlyc3RGbGFnVmFsdWUuZ2V0KCkpOwotICBhcmdTZWNvbmQtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMCwgc2Vjb25kRmxhZ1ZhbHVlLmdldCgpKTsKLSAgaWYgKGZpcnN0RmxhZ1ZhbHVlLT5Ub0ludGVnZXIoKSAhPSAzIHx8IHNlY29uZEZsYWdWYWx1ZS0+VG9JbnRlZ2VyKCkgIT0gMykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYXV0byBmaXJzdEpTT2JqZWN0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICBhdXRvIHNlY29uZEpTT2JqZWN0ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICBhcmdGaXJzdC0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgyLCBmaXJzdEpTT2JqZWN0LmdldCgpKTsKLSAgYXJnU2Vjb25kLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KDIsIHNlY29uZEpTT2JqZWN0LmdldCgpKTsKLSAgaWYgKGZpcnN0SlNPYmplY3QtPklzTnVsbCgpIHx8IHNlY29uZEpTT2JqZWN0LT5Jc051bGwoKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIChmaXJzdEpTT2JqZWN0LT5Ub0hvc3RPYmplY3QobnVsbHB0cikgPT0KLSAgICAgICAgICBzZWNvbmRKU09iamVjdC0+VG9Ib3N0T2JqZWN0KG51bGxwdHIpKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpsZXNzX29wZXJhdG9yKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAyKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd0NvbXBpbGVyRXJyb3JFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdGaXJzdCA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnU2Vjb25kID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOwotICBpZiAoYXJnRmlyc3QtPklzTnVsbCgpIHx8IGFyZ1NlY29uZC0+SXNOdWxsKCkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGFyZ0ZpcnN0LT5Jc1N0cmluZygpICYmIGFyZ1NlY29uZC0+SXNTdHJpbmcoKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcigKLSAgICAgICAgYXJnRmlyc3QtPlRvU3RyaW5nKCkuQ29tcGFyZShhcmdTZWNvbmQtPlRvU3RyaW5nKCkuQXNTdHJpbmdDKCkpID09IC0xKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBGWF9ET1VCTEUgZmlyc3QgPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBhcmdGaXJzdC5nZXQoKSk7Ci0gIEZYX0RPVUJMRSBzZWNvbmQgPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBhcmdTZWNvbmQuZ2V0KCkpOwotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoKGZpcnN0IDwgc2Vjb25kKSA/IDEgOiAwKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpsZXNzZXF1YWxfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAyKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd0NvbXBpbGVyRXJyb3JFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdGaXJzdCA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnU2Vjb25kID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOwotICBpZiAoYXJnRmlyc3QtPklzTnVsbCgpIHx8IGFyZ1NlY29uZC0+SXNOdWxsKCkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoCi0gICAgICAgIChhcmdGaXJzdC0+SXNOdWxsKCkgJiYgYXJnU2Vjb25kLT5Jc051bGwoKSkgPyAxIDogMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGFyZ0ZpcnN0LT5Jc1N0cmluZygpICYmIGFyZ1NlY29uZC0+SXNTdHJpbmcoKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcigKLSAgICAgICAgYXJnRmlyc3QtPlRvU3RyaW5nKCkuQ29tcGFyZShhcmdTZWNvbmQtPlRvU3RyaW5nKCkuQXNTdHJpbmdDKCkpICE9IDEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEZYX0RPVUJMRSBmaXJzdCA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ0ZpcnN0LmdldCgpKTsKLSAgRlhfRE9VQkxFIHNlY29uZCA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ1NlY29uZC5nZXQoKSk7Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcigoZmlyc3QgPD0gc2Vjb25kKSA/IDEgOiAwKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpncmVhdGVyX29wZXJhdG9yKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAyKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd0NvbXBpbGVyRXJyb3JFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdGaXJzdCA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnU2Vjb25kID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOwotICBpZiAoYXJnRmlyc3QtPklzTnVsbCgpIHx8IGFyZ1NlY29uZC0+SXNOdWxsKCkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEludGVnZXIoMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGFyZ0ZpcnN0LT5Jc1N0cmluZygpICYmIGFyZ1NlY29uZC0+SXNTdHJpbmcoKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcigKLSAgICAgICAgYXJnRmlyc3QtPlRvU3RyaW5nKCkuQ29tcGFyZShhcmdTZWNvbmQtPlRvU3RyaW5nKCkuQXNTdHJpbmdDKCkpID09IDEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEZYX0RPVUJMRSBmaXJzdCA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ0ZpcnN0LmdldCgpKTsKLSAgRlhfRE9VQkxFIHNlY29uZCA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ1NlY29uZC5nZXQoKSk7Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcigoZmlyc3QgPiBzZWNvbmQpID8gMSA6IDApOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmdyZWF0ZXJlcXVhbF9vcGVyYXRvcihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDIpIHsKLSAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93Q29tcGlsZXJFcnJvckV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ0ZpcnN0ID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdTZWNvbmQgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMSk7Ci0gIGlmIChhcmdGaXJzdC0+SXNOdWxsKCkgfHwgYXJnU2Vjb25kLT5Jc051bGwoKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcigKLSAgICAgICAgKGFyZ0ZpcnN0LT5Jc051bGwoKSAmJiBhcmdTZWNvbmQtPklzTnVsbCgpKSA/IDEgOiAwKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoYXJnRmlyc3QtPklzU3RyaW5nKCkgJiYgYXJnU2Vjb25kLT5Jc1N0cmluZygpKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRJbnRlZ2VyKAotICAgICAgICBhcmdGaXJzdC0+VG9TdHJpbmcoKS5Db21wYXJlKGFyZ1NlY29uZC0+VG9TdHJpbmcoKS5Bc1N0cmluZ0MoKSkgIT0gLTEpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEZYX0RPVUJMRSBmaXJzdCA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ0ZpcnN0LmdldCgpKTsKLSAgRlhfRE9VQkxFIHNlY29uZCA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ1NlY29uZC5nZXQoKSk7Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcigoZmlyc3QgPj0gc2Vjb25kKSA/IDEgOiAwKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpwbHVzX29wZXJhdG9yKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAyKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd0NvbXBpbGVyRXJyb3JFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdGaXJzdCA9IGFyZ3MuR2V0VmFsdWUoMCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1NlY29uZCA9IGFyZ3MuR2V0VmFsdWUoMSk7Ci0gIGlmIChWYWx1ZUlzTnVsbChwVGhpcywgYXJnRmlyc3QuZ2V0KCkpICYmCi0gICAgICBWYWx1ZUlzTnVsbChwVGhpcywgYXJnU2Vjb25kLmdldCgpKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEZYX0RPVUJMRSBmaXJzdCA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ0ZpcnN0LmdldCgpKTsKLSAgRlhfRE9VQkxFIHNlY29uZCA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ1NlY29uZC5nZXQoKSk7Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0RG91YmxlKGZpcnN0ICsgc2Vjb25kKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjptaW51c19vcGVyYXRvcihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAyKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd0NvbXBpbGVyRXJyb3JFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdGaXJzdCA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnU2Vjb25kID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOwotICBpZiAoYXJnRmlyc3QtPklzTnVsbCgpICYmIGFyZ1NlY29uZC0+SXNOdWxsKCkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBGWF9ET1VCTEUgZmlyc3QgPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBhcmdGaXJzdC5nZXQoKSk7Ci0gIEZYX0RPVUJMRSBzZWNvbmQgPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBhcmdTZWNvbmQuZ2V0KCkpOwotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldERvdWJsZShmaXJzdCAtIHNlY29uZCk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6bXVsdGlwbGVfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMikgewotICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dDb21waWxlckVycm9yRXhjZXB0aW9uKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnRmlyc3QgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ1NlY29uZCA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAxKTsKLSAgaWYgKGFyZ0ZpcnN0LT5Jc051bGwoKSAmJiBhcmdTZWNvbmQtPklzTnVsbCgpKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRlhfRE9VQkxFIGZpcnN0ID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnRmlyc3QuZ2V0KCkpOwotICBGWF9ET1VCTEUgc2Vjb25kID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnU2Vjb25kLmdldCgpKTsKLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXREb3VibGUoZmlyc3QgKiBzZWNvbmQpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmRpdmlkZV9vcGVyYXRvcihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKLSAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMikgewotICAgIHBDb250ZXh0LT5UaHJvd0NvbXBpbGVyRXJyb3JFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdGaXJzdCA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnU2Vjb25kID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDEpOwotICBpZiAoYXJnRmlyc3QtPklzTnVsbCgpICYmIGFyZ1NlY29uZC0+SXNOdWxsKCkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBGWF9ET1VCTEUgc2Vjb25kID0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnU2Vjb25kLmdldCgpKTsKLSAgaWYgKHNlY29uZCA9PSAwLjApIHsKLSAgICBwQ29udGV4dC0+VGhyb3dEaXZpZGVCeVplcm9FeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBGWF9ET1VCTEUgZmlyc3QgPSBWYWx1ZVRvRG91YmxlKHBUaGlzLCBhcmdGaXJzdC5nZXQoKSk7Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0RG91YmxlKGZpcnN0IC8gc2Vjb25kKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0Ojpwb3NpdGl2ZV9vcGVyYXRvcihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAxKSB7Ci0gICAgVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5UaHJvd0NvbXBpbGVyRXJyb3JFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gIGlmIChhcmdPbmUtPklzTnVsbCgpKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0RG91YmxlKDAuMCArIFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ09uZS5nZXQoKSkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6Om5lZ2F0aXZlX29wZXJhdG9yKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDEpIHsKLSAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93Q29tcGlsZXJFcnJvckV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgaWYgKGFyZ09uZS0+SXNOdWxsKCkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXREb3VibGUoMC4wIC0gVmFsdWVUb0RvdWJsZShwVGhpcywgYXJnT25lLmdldCgpKSk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6bG9naWNhbF9ub3Rfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMSkgewotICAgIFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+VGhyb3dDb21waWxlckVycm9yRXhjZXB0aW9uKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnT25lID0gR2V0U2ltcGxlVmFsdWUocFRoaXMsIGFyZ3MsIDApOwotICBpZiAoYXJnT25lLT5Jc051bGwoKSkgewotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIEZYX0RPVUJMRSBmaXJzdCA9IFZhbHVlVG9Eb3VibGUocFRoaXMsIGFyZ09uZS5nZXQoKSk7Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0SW50ZWdlcigoZmlyc3QgPT0gMC4wKSA/IDEgOiAwKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0Ojpkb3RfYWNjZXNzb3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cik7Ci0gIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7Ci0gIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7Ci0gIGlmIChhcmdjIDwgNCB8fCBhcmdjID4gNSkgewotICAgIHBDb250ZXh0LT5UaHJvd0NvbXBpbGVyRXJyb3JFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBib29sIGJJc1N0YXIgPSB0cnVlOwotICBpbnQzMl90IGlJbmRleFZhbHVlID0gMDsKLSAgaWYgKGFyZ2MgPiA0KSB7Ci0gICAgYklzU3RhciA9IGZhbHNlOwotICAgIGlJbmRleFZhbHVlID0gVmFsdWVUb0ludGVnZXIocFRoaXMsIGFyZ3MuR2V0VmFsdWUoNCkuZ2V0KCkpOwotICB9Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgc3pOYW1lID0gYXJncy5HZXRVVEY4U3RyaW5nKDIpOwotICBDRlhfQnl0ZVN0cmluZyBzelNvbUV4cDsKLSAgR2VuZXJhdGVTb21FeHByZXNzaW9uKHN6TmFtZS5Bc1N0cmluZ0MoKSwgYXJncy5HZXRJbnQzMigzKSwgaUluZGV4VmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBiSXNTdGFyLCBzelNvbUV4cCk7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnQWNjZXNzb3IgPSBhcmdzLkdldFZhbHVlKDApOwotICBpZiAoYXJnQWNjZXNzb3ItPklzQXJyYXkoKSkgewotICAgIGF1dG8gcExlbmd0aFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICAgIGFyZ0FjY2Vzc29yLT5HZXRPYmplY3RQcm9wZXJ0eSgibGVuZ3RoIiwgcExlbmd0aFZhbHVlLmdldCgpKTsKLSAgICBpbnQzMl90IGlMZW5ndGggPSBwTGVuZ3RoVmFsdWUtPlRvSW50ZWdlcigpOwotICAgIGlmIChpTGVuZ3RoIDwgMykgewotICAgICAgcENvbnRleHQtPlRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGF1dG8gaEpTT2JqVmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4+PiByZXNvbHZlVmFsdWVzKAotICAgICAgICBpTGVuZ3RoIC0gMik7Ci0gICAgYm9vbCBiQXR0cmlidXRlID0gZmFsc2U7Ci0gICAgaW50MzJfdCBpQ291bnRlciA9IDA7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAyOyBpIDwgaUxlbmd0aDsgaSsrKSB7Ci0gICAgICBhcmdBY2Nlc3Nvci0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeChpLCBoSlNPYmpWYWx1ZS5nZXQoKSk7Ci0KLSAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7Ci0gICAgICBpZiAoUmVzb2x2ZU9iamVjdHMocFRoaXMsIGhKU09ialZhbHVlLmdldCgpLCBzelNvbUV4cC5Bc1N0cmluZ0MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdmVOb2RlUlMsIHRydWUsIHN6TmFtZS5Jc0VtcHR5KCkpID4gMCkgewotICAgICAgICBQYXJzZVJlc29sdmVSZXN1bHQocFRoaXMsIHJlc292ZU5vZGVSUywgaEpTT2JqVmFsdWUuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzb2x2ZVZhbHVlc1tpIC0gMl0sICZiQXR0cmlidXRlKTsKLSAgICAgICAgaUNvdW50ZXIgKz0gcmVzb2x2ZVZhbHVlc1tpIC0gMl0uc2l6ZSgpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoaUNvdW50ZXIgPCAxKSB7Ci0gICAgICBwQ29udGV4dC0+VGhyb3dQcm9wZXJ0eU5vdEluT2JqZWN0RXhjZXB0aW9uKAotICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzek5hbWUuQXNTdHJpbmdDKCkpLAotICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelNvbUV4cC5Bc1N0cmluZ0MoKSkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+PiB2YWx1ZXM7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50ZXIgKyAyOyBpKyspCi0gICAgICB2YWx1ZXMucHVzaF9iYWNrKHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKSk7Ci0KLSAgICB2YWx1ZXNbMF0tPlNldEludGVnZXIoMSk7Ci0gICAgaWYgKGJBdHRyaWJ1dGUpCi0gICAgICB2YWx1ZXNbMV0tPlNldFN0cmluZyhzek5hbWUuQXNTdHJpbmdDKCkpOwotICAgIGVsc2UKLSAgICAgIHZhbHVlc1sxXS0+U2V0TnVsbCgpOwotCi0gICAgaW50MzJfdCBpSW5kZXggPSAyOwotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGggLSAyOyBpKyspIHsKLSAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcmVzb2x2ZVZhbHVlc1tpXS5zaXplKCk7IGorKykgewotICAgICAgICB2YWx1ZXNbaUluZGV4XS0+QXNzaWduKHJlc29sdmVWYWx1ZXNbaV1bal0uZ2V0KCkpOwotICAgICAgICBpSW5kZXgrKzsKLSAgICAgIH0KLSAgICB9Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRBcnJheSh2YWx1ZXMpOwotICAgIHJldHVybjsKLSAgfQotCi0gIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7Ci0gIGludDMyX3QgaVJldCA9IDA7Ci0gIENGWF9CeXRlU3RyaW5nIGJzQWNjZXNzb3JOYW1lID0gYXJncy5HZXRVVEY4U3RyaW5nKDEpOwotICBpZiAoYXJnQWNjZXNzb3ItPklzT2JqZWN0KCkgfHwKLSAgICAgIChhcmdBY2Nlc3Nvci0+SXNOdWxsKCkgJiYgYnNBY2Nlc3Nvck5hbWUuSXNFbXB0eSgpKSkgewotICAgIGlSZXQgPSBSZXNvbHZlT2JqZWN0cyhwVGhpcywgYXJnQWNjZXNzb3IuZ2V0KCksIHN6U29tRXhwLkFzU3RyaW5nQygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdmVOb2RlUlMsIHRydWUsIHN6TmFtZS5Jc0VtcHR5KCkpOwotICB9IGVsc2UgaWYgKCFhcmdBY2Nlc3Nvci0+SXNPYmplY3QoKSAmJiAhYnNBY2Nlc3Nvck5hbWUuSXNFbXB0eSgpICYmCi0gICAgICAgICAgICAgR2V0T2JqZWN0Rm9yTmFtZShwVGhpcywgYXJnQWNjZXNzb3IuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBic0FjY2Vzc29yTmFtZS5Bc1N0cmluZ0MoKSkpIHsKLSAgICBpUmV0ID0gUmVzb2x2ZU9iamVjdHMocFRoaXMsIGFyZ0FjY2Vzc29yLmdldCgpLCBzelNvbUV4cC5Bc1N0cmluZ0MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3ZlTm9kZVJTLCB0cnVlLCBzek5hbWUuSXNFbXB0eSgpKTsKLSAgfQotICBpZiAoaVJldCA8IDEpIHsKLSAgICBwQ29udGV4dC0+VGhyb3dQcm9wZXJ0eU5vdEluT2JqZWN0RXhjZXB0aW9uKAotICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pOYW1lLkFzU3RyaW5nQygpKSwKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6U29tRXhwLkFzU3RyaW5nQygpKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4+IHJlc29sdmVWYWx1ZXM7Ci0gIGJvb2wgYkF0dHJpYnV0ZSA9IGZhbHNlOwotICBQYXJzZVJlc29sdmVSZXN1bHQocFRoaXMsIHJlc292ZU5vZGVSUywgYXJnQWNjZXNzb3IuZ2V0KCksICZyZXNvbHZlVmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgJmJBdHRyaWJ1dGUpOwotCi0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+PiB2YWx1ZXM7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzb2x2ZVZhbHVlcy5zaXplKCkgKyAyOyBpKyspCi0gICAgdmFsdWVzLnB1c2hfYmFjayhwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSkpOwotCi0gIHZhbHVlc1swXS0+U2V0SW50ZWdlcigxKTsKLSAgaWYgKGJBdHRyaWJ1dGUpCi0gICAgdmFsdWVzWzFdLT5TZXRTdHJpbmcoc3pOYW1lLkFzU3RyaW5nQygpKTsKLSAgZWxzZQotICAgIHZhbHVlc1sxXS0+U2V0TnVsbCgpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzb2x2ZVZhbHVlcy5zaXplKCk7IGkrKykKLSAgICB2YWx1ZXNbaSArIDJdLT5Bc3NpZ24ocmVzb2x2ZVZhbHVlc1tpXS5nZXQoKSk7Ci0KLSAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRBcnJheSh2YWx1ZXMpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmRvdGRvdF9hY2Nlc3NvcihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKLSAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gcENvbnRleHQtPkdldFNjcmlwdFJ1bnRpbWUoKTsKLSAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKLSAgaWYgKGFyZ2MgPCA0IHx8IGFyZ2MgPiA1KSB7Ci0gICAgcENvbnRleHQtPlRocm93Q29tcGlsZXJFcnJvckV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGJvb2wgYklzU3RhciA9IHRydWU7Ci0gIGludDMyX3QgaUluZGV4VmFsdWUgPSAwOwotICBpZiAoYXJnYyA+IDQpIHsKLSAgICBiSXNTdGFyID0gZmFsc2U7Ci0gICAgaUluZGV4VmFsdWUgPSBWYWx1ZVRvSW50ZWdlcihwVGhpcywgYXJncy5HZXRWYWx1ZSg0KS5nZXQoKSk7Ci0gIH0KLQotICBDRlhfQnl0ZVN0cmluZyBzelNvbUV4cDsKLSAgQ0ZYX0J5dGVTdHJpbmcgc3pOYW1lID0gYXJncy5HZXRVVEY4U3RyaW5nKDIpOwotICBHZW5lcmF0ZVNvbUV4cHJlc3Npb24oc3pOYW1lLkFzU3RyaW5nQygpLCBhcmdzLkdldEludDMyKDMpLCBpSW5kZXhWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJJc1N0YXIsIHN6U29tRXhwKTsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdBY2Nlc3NvciA9IGFyZ3MuR2V0VmFsdWUoMCk7Ci0gIGlmIChhcmdBY2Nlc3Nvci0+SXNBcnJheSgpKSB7Ci0gICAgYXV0byBwTGVuZ3RoVmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgYXJnQWNjZXNzb3ItPkdldE9iamVjdFByb3BlcnR5KCJsZW5ndGgiLCBwTGVuZ3RoVmFsdWUuZ2V0KCkpOwotICAgIGludDMyX3QgaUxlbmd0aCA9IHBMZW5ndGhWYWx1ZS0+VG9JbnRlZ2VyKCk7Ci0gICAgaWYgKGlMZW5ndGggPCAzKSB7Ci0gICAgICBwQ29udGV4dC0+VGhyb3dBcmd1bWVudE1pc21hdGNoRXhjZXB0aW9uKCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50MzJfdCBpQ291bnRlciA9IDA7Ci0KLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPj4+IHJlc29sdmVWYWx1ZXMoCi0gICAgICAgIGlMZW5ndGggLSAyKTsKLSAgICBhdXRvIGhKU09ialZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICAgIGJvb2wgYkF0dHJpYnV0ZSA9IGZhbHNlOwotICAgIGZvciAoaW50MzJfdCBpID0gMjsgaSA8IGlMZW5ndGg7IGkrKykgewotICAgICAgYXJnQWNjZXNzb3ItPkdldE9iamVjdFByb3BlcnR5QnlJZHgoaSwgaEpTT2JqVmFsdWUuZ2V0KCkpOwotICAgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc292ZU5vZGVSUzsKLSAgICAgIGlmIChSZXNvbHZlT2JqZWN0cyhwVGhpcywgaEpTT2JqVmFsdWUuZ2V0KCksIHN6U29tRXhwLkFzU3RyaW5nQygpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlc292ZU5vZGVSUywgZmFsc2UpID4gMCkgewotICAgICAgICBQYXJzZVJlc29sdmVSZXN1bHQocFRoaXMsIHJlc292ZU5vZGVSUywgaEpTT2JqVmFsdWUuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzb2x2ZVZhbHVlc1tpIC0gMl0sICZiQXR0cmlidXRlKTsKLSAgICAgICAgaUNvdW50ZXIgKz0gcmVzb2x2ZVZhbHVlc1tpIC0gMl0uc2l6ZSgpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoaUNvdW50ZXIgPCAxKSB7Ci0gICAgICBwQ29udGV4dC0+VGhyb3dQcm9wZXJ0eU5vdEluT2JqZWN0RXhjZXB0aW9uKAotICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzek5hbWUuQXNTdHJpbmdDKCkpLAotICAgICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelNvbUV4cC5Bc1N0cmluZ0MoKSkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+PiB2YWx1ZXM7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50ZXIgKyAyOyBpKyspCi0gICAgICB2YWx1ZXMucHVzaF9iYWNrKHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKSk7Ci0KLSAgICB2YWx1ZXNbMF0tPlNldEludGVnZXIoMSk7Ci0gICAgaWYgKGJBdHRyaWJ1dGUpCi0gICAgICB2YWx1ZXNbMV0tPlNldFN0cmluZyhzek5hbWUuQXNTdHJpbmdDKCkpOwotICAgIGVsc2UKLSAgICAgIHZhbHVlc1sxXS0+U2V0TnVsbCgpOwotCi0gICAgaW50MzJfdCBpSW5kZXggPSAyOwotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlMZW5ndGggLSAyOyBpKyspIHsKLSAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcmVzb2x2ZVZhbHVlc1tpXS5zaXplKCk7IGorKykgewotICAgICAgICB2YWx1ZXNbaUluZGV4XS0+QXNzaWduKHJlc29sdmVWYWx1ZXNbaV1bal0uZ2V0KCkpOwotICAgICAgICBpSW5kZXgrKzsKLSAgICAgIH0KLSAgICB9Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRBcnJheSh2YWx1ZXMpOwotICAgIHJldHVybjsKLSAgfQotCi0gIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7Ci0gIGludDMyX3QgaVJldCA9IDA7Ci0gIENGWF9CeXRlU3RyaW5nIGJzQWNjZXNzb3JOYW1lID0gYXJncy5HZXRVVEY4U3RyaW5nKDEpOwotICBpZiAoYXJnQWNjZXNzb3ItPklzT2JqZWN0KCkgfHwKLSAgICAgIChhcmdBY2Nlc3Nvci0+SXNOdWxsKCkgJiYgYnNBY2Nlc3Nvck5hbWUuSXNFbXB0eSgpKSkgewotICAgIGlSZXQgPSBSZXNvbHZlT2JqZWN0cyhwVGhpcywgYXJnQWNjZXNzb3IuZ2V0KCksIHN6U29tRXhwLkFzU3RyaW5nQygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdmVOb2RlUlMsIGZhbHNlKTsKLSAgfSBlbHNlIGlmICghYXJnQWNjZXNzb3ItPklzT2JqZWN0KCkgJiYgIWJzQWNjZXNzb3JOYW1lLklzRW1wdHkoKSAmJgotICAgICAgICAgICAgIEdldE9iamVjdEZvck5hbWUocFRoaXMsIGFyZ0FjY2Vzc29yLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnNBY2Nlc3Nvck5hbWUuQXNTdHJpbmdDKCkpKSB7Ci0gICAgaVJldCA9IFJlc29sdmVPYmplY3RzKHBUaGlzLCBhcmdBY2Nlc3Nvci5nZXQoKSwgc3pTb21FeHAuQXNTdHJpbmdDKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHJlc292ZU5vZGVSUywgZmFsc2UpOwotICB9Ci0gIGlmIChpUmV0IDwgMSkgewotICAgIHBDb250ZXh0LT5UaHJvd1Byb3BlcnR5Tm90SW5PYmplY3RFeGNlcHRpb24oCi0gICAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzek5hbWUuQXNTdHJpbmdDKCkpLAotICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pTb21FeHAuQXNTdHJpbmdDKCkpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPj4gcmVzb2x2ZVZhbHVlczsKLSAgYm9vbCBiQXR0cmlidXRlID0gZmFsc2U7Ci0gIFBhcnNlUmVzb2x2ZVJlc3VsdChwVGhpcywgcmVzb3ZlTm9kZVJTLCBhcmdBY2Nlc3Nvci5nZXQoKSwgJnJlc29sdmVWYWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAmYkF0dHJpYnV0ZSk7Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4+IHZhbHVlczsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNvbHZlVmFsdWVzLnNpemUoKSArIDI7IGkrKykKLSAgICB2YWx1ZXMucHVzaF9iYWNrKHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKSk7Ci0KLSAgdmFsdWVzWzBdLT5TZXRJbnRlZ2VyKDEpOwotICBpZiAoYkF0dHJpYnV0ZSkKLSAgICB2YWx1ZXNbMV0tPlNldFN0cmluZyhzek5hbWUuQXNTdHJpbmdDKCkpOwotICBlbHNlCi0gICAgdmFsdWVzWzFdLT5TZXROdWxsKCk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNvbHZlVmFsdWVzLnNpemUoKTsgaSsrKQotICAgIHZhbHVlc1tpICsgMl0tPkFzc2lnbihyZXNvbHZlVmFsdWVzW2ldLmdldCgpKTsKLQotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEFycmF5KHZhbHVlcyk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6ZXZhbF90cmFuc2xhdGlvbihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpIHsKLSAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOwotICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAxKSB7Ci0gICAgcENvbnRleHQtPlRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiRXZhbCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IEdldFNpbXBsZVZhbHVlKHBUaGlzLCBhcmdzLCAwKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgYXJnU3RyaW5nOwotICBWYWx1ZVRvVVRGOFN0cmluZyhhcmdPbmUuZ2V0KCksIGFyZ1N0cmluZyk7Ci0gIGlmIChhcmdTdHJpbmcuSXNFbXB0eSgpKSB7Ci0gICAgcENvbnRleHQtPlRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENGWF9XaWRlU3RyaW5nIHNjcmlwdFN0cmluZyA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChhcmdTdHJpbmcuQXNTdHJpbmdDKCkpOwotICBDRlhfV2lkZVRleHRCdWYgd3NKYXZhU2NyaXB0QnVmOwotICBDRlhfV2lkZVN0cmluZyB3c0Vycm9yOwotICBDWEZBX0ZNMkpTQ29udGV4dDo6VHJhbnNsYXRlKHNjcmlwdFN0cmluZy5Bc1N0cmluZ0MoKSwgd3NKYXZhU2NyaXB0QnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzRXJyb3IpOwotICBpZiAoIXdzRXJyb3IuSXNFbXB0eSgpKSB7Ci0gICAgcENvbnRleHQtPlRocm93Q29tcGlsZXJFcnJvckV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKAotICAgICAgRlhfVVRGOEVuY29kZSh3c0phdmFTY3JpcHRCdWYuQXNTdHJpbmdDKCkpLkFzU3RyaW5nQygpKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0Ojppc19mbV9vYmplY3QoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAxKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRCb29sZWFuKGZhbHNlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOwotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEJvb2xlYW4oYXJnT25lLT5Jc09iamVjdCgpKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0Ojppc19mbV9hcnJheShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncykgewotICBpZiAoYXJncy5HZXRMZW5ndGgoKSAhPSAxKSB7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRCb29sZWFuKGZhbHNlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOwotICBhcmdzLkdldFJldHVyblZhbHVlKCktPlNldEJvb2xlYW4oYXJnT25lLT5Jc0FycmF5KCkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmdldF9mbV92YWx1ZShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKLSAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMSkgewotICAgIHBDb250ZXh0LT5UaHJvd0NvbXBpbGVyRXJyb3JFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOwotICBpZiAoYXJnT25lLT5Jc0FycmF5KCkpIHsKLSAgICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOwotICAgIGF1dG8gcHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKLSAgICBhdXRvIGpzT2JqZWN0VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgYXJnT25lLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KDEsIHByb3BlcnR5VmFsdWUuZ2V0KCkpOwotICAgIGFyZ09uZS0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgyLCBqc09iamVjdFZhbHVlLmdldCgpKTsKLSAgICBpZiAocHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkpIHsKLSAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc09iamVjdFZhbHVlLmdldCgpLCBhcmdzLkdldFJldHVyblZhbHVlKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGpzT2JqZWN0VmFsdWUtPkdldE9iamVjdFByb3BlcnR5KHByb3BlcnR5VmFsdWUtPlRvU3RyaW5nKCkuQXNTdHJpbmdDKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoYXJnT25lLT5Jc09iamVjdCgpKSB7Ci0gICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGFyZ09uZS5nZXQoKSwgYXJncy5HZXRSZXR1cm5WYWx1ZSgpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBhcmdzLkdldFJldHVyblZhbHVlKCktPkFzc2lnbihhcmdPbmUuZ2V0KCkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmdldF9mbV9qc29iaihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIGlmIChhcmdzLkdldExlbmd0aCgpICE9IDEpIHsKLSAgICBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPlRocm93Q29tcGlsZXJFcnJvckV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGFyZ09uZSA9IGFyZ3MuR2V0VmFsdWUoMCk7Ci0gIGlmICghYXJnT25lLT5Jc0FycmF5KCkpIHsKLSAgICBhcmdzLkdldFJldHVyblZhbHVlKCktPkFzc2lnbihhcmdPbmUuZ2V0KCkpOwotICAgIHJldHVybjsKLSAgfQotCi0jaWZuZGVmIE5ERUJVRwotICBDWEZBX0ZNMkpTQ29udGV4dCogcENvbnRleHQgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0cik7Ci0gIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IHBDb250ZXh0LT5HZXRTY3JpcHRSdW50aW1lKCk7Ci0gIGF1dG8gbGVuZ3RoVmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gIGFyZ09uZS0+R2V0T2JqZWN0UHJvcGVydHkoImxlbmd0aCIsIGxlbmd0aFZhbHVlLmdldCgpKTsKLSAgQVNTRVJUKGxlbmd0aFZhbHVlLT5Ub0ludGVnZXIoKSA+PSAzKTsKLSNlbmRpZgotCi0gIGFyZ09uZS0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgyLCBhcmdzLkdldFJldHVyblZhbHVlKCkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmZtX3Zhcl9maWx0ZXIoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIENYRkFfRk0ySlNDb250ZXh0KiBwQ29udGV4dCA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKTsKLSAgaWYgKGFyZ3MuR2V0TGVuZ3RoKCkgIT0gMSkgewotICAgIHBDb250ZXh0LT5UaHJvd0NvbXBpbGVyRXJyb3JFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBhcmdPbmUgPSBhcmdzLkdldFZhbHVlKDApOwotICBpZiAoIWFyZ09uZS0+SXNBcnJheSgpKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gc2ltcGxlVmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5Bc3NpZ24oc2ltcGxlVmFsdWUuZ2V0KCkpOwotICAgIHJldHVybjsKLSAgfQotCi0jaWZuZGVmIE5ERUJVRwotICBhdXRvIGxlbmd0aFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICBhcmdPbmUtPkdldE9iamVjdFByb3BlcnR5KCJsZW5ndGgiLCBsZW5ndGhWYWx1ZS5nZXQoKSk7Ci0gIEFTU0VSVChsZW5ndGhWYWx1ZS0+VG9JbnRlZ2VyKCkgPj0gMyk7Ci0jZW5kaWYKLQotICBhdXRvIGZsYWdzVmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gIGFyZ09uZS0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgwLCBmbGFnc1ZhbHVlLmdldCgpKTsKLSAgaW50MzJfdCBpRmxhZ3MgPSBmbGFnc1ZhbHVlLT5Ub0ludGVnZXIoKTsKLSAgaWYgKGlGbGFncyAhPSAzICYmIGlGbGFncyAhPSA0KSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gc2ltcGxlVmFsdWUgPSBHZXRTaW1wbGVWYWx1ZShwVGhpcywgYXJncywgMCk7Ci0gICAgYXJncy5HZXRSZXR1cm5WYWx1ZSgpLT5Bc3NpZ24oc2ltcGxlVmFsdWUuZ2V0KCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChpRmxhZ3MgPT0gNCkgewotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+PiB2YWx1ZXM7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMzsgaSsrKQotICAgICAgdmFsdWVzLnB1c2hfYmFjayhwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSkpOwotCi0gICAgdmFsdWVzWzBdLT5TZXRJbnRlZ2VyKDMpOwotICAgIHZhbHVlc1sxXS0+U2V0TnVsbCgpOwotICAgIHZhbHVlc1syXS0+U2V0TnVsbCgpOwotICAgIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0QXJyYXkodmFsdWVzKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBhdXRvIG9iamVjdFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICBhcmdPbmUtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMiwgb2JqZWN0VmFsdWUuZ2V0KCkpOwotICBpZiAob2JqZWN0VmFsdWUtPklzTnVsbCgpKSB7Ci0gICAgcENvbnRleHQtPlRocm93Q29tcGlsZXJFcnJvckV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotICBhcmdzLkdldFJldHVyblZhbHVlKCktPkFzc2lnbihhcmdPbmUuZ2V0KCkpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OmNvbmNhdF9mbV9vYmplY3QoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+R2V0U2NyaXB0UnVudGltZSgpOwotICB1aW50MzJfdCBpTGVuZ3RoID0gMDsKLSAgaW50MzJfdCBhcmdjID0gYXJncy5HZXRMZW5ndGgoKTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4+IGFyZ1ZhbHVlczsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgYXJnYzsgaSsrKSB7Ci0gICAgYXJnVmFsdWVzLnB1c2hfYmFjayhhcmdzLkdldFZhbHVlKGkpKTsKLSAgICBpZiAoYXJnVmFsdWVzW2ldLT5Jc0FycmF5KCkpIHsKLSAgICAgIGF1dG8gbGVuZ3RoVmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgICBhcmdWYWx1ZXNbaV0tPkdldE9iamVjdFByb3BlcnR5KCJsZW5ndGgiLCBsZW5ndGhWYWx1ZS5nZXQoKSk7Ci0gICAgICBpbnQzMl90IGxlbmd0aCA9IGxlbmd0aFZhbHVlLT5Ub0ludGVnZXIoKTsKLSAgICAgIGlMZW5ndGggPSBpTGVuZ3RoICsgKChsZW5ndGggPiAyKSA/IChsZW5ndGggLSAyKSA6IDApOwotICAgIH0KLSAgICBpTGVuZ3RoICs9IDE7Ci0gIH0KLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPj4gcmV0dXJuVmFsdWVzOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAoaW50MzJfdClpTGVuZ3RoOyBpKyspCi0gICAgcmV0dXJuVmFsdWVzLnB1c2hfYmFjayhwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSkpOwotCi0gIGludDMyX3QgaW5kZXggPSAwOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKLSAgICBpZiAoYXJnVmFsdWVzW2ldLT5Jc0FycmF5KCkpIHsKLSAgICAgIGF1dG8gbGVuZ3RoVmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgICBhcmdWYWx1ZXNbaV0tPkdldE9iamVjdFByb3BlcnR5KCJsZW5ndGgiLCBsZW5ndGhWYWx1ZS5nZXQoKSk7Ci0KLSAgICAgIGludDMyX3QgbGVuZ3RoID0gbGVuZ3RoVmFsdWUtPlRvSW50ZWdlcigpOwotICAgICAgZm9yIChpbnQzMl90IGogPSAyOyBqIDwgbGVuZ3RoOyBqKyspIHsKLSAgICAgICAgYXJnVmFsdWVzW2ldLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KGosIHJldHVyblZhbHVlc1tpbmRleF0uZ2V0KCkpOwotICAgICAgICBpbmRleCsrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm5WYWx1ZXNbaW5kZXhdLT5Bc3NpZ24oYXJnVmFsdWVzW2ldLmdldCgpKTsKLSAgICBpbmRleCsrOwotICB9Ci0gIGFyZ3MuR2V0UmV0dXJuVmFsdWUoKS0+U2V0QXJyYXkocmV0dXJuVmFsdWVzKTsKLX0KLQotLy8gc3RhdGljCi1zdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBDWEZBX0ZNMkpTQ29udGV4dDo6R2V0U2ltcGxlVmFsdWUoCi0gICAgQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzLAotICAgIHVpbnQzMl90IGluZGV4KSB7Ci0gIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+R2V0U2NyaXB0UnVudGltZSgpOwotICBBU1NFUlQoaW5kZXggPCAodWludDMyX3QpYXJncy5HZXRMZW5ndGgoKSk7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gYXJnSW5kZXggPSBhcmdzLkdldFZhbHVlKGluZGV4KTsKLSAgaWYgKCFhcmdJbmRleC0+SXNBcnJheSgpICYmICFhcmdJbmRleC0+SXNPYmplY3QoKSkKLSAgICByZXR1cm4gYXJnSW5kZXg7Ci0KLSAgaWYgKGFyZ0luZGV4LT5Jc0FycmF5KCkpIHsKLSAgICBhdXRvIGxlbmd0aFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICAgIGFyZ0luZGV4LT5HZXRPYmplY3RQcm9wZXJ0eSgibGVuZ3RoIiwgbGVuZ3RoVmFsdWUuZ2V0KCkpOwotICAgIGludDMyX3QgaUxlbmd0aCA9IGxlbmd0aFZhbHVlLT5Ub0ludGVnZXIoKTsKLSAgICBhdXRvIHNpbXBsZVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICAgIGlmIChpTGVuZ3RoIDwgMykgewotICAgICAgc2ltcGxlVmFsdWUuZ2V0KCktPlNldFVuZGVmaW5lZCgpOwotICAgICAgcmV0dXJuIHNpbXBsZVZhbHVlOwotICAgIH0KLQotICAgIGF1dG8gcHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKLSAgICBhdXRvIGpzT2JqZWN0VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgYXJnSW5kZXgtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMSwgcHJvcGVydHlWYWx1ZS5nZXQoKSk7Ci0gICAgYXJnSW5kZXgtPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMiwganNPYmplY3RWYWx1ZS5nZXQoKSk7Ci0gICAgaWYgKHByb3BlcnR5VmFsdWUtPklzTnVsbCgpKSB7Ci0gICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNPYmplY3RWYWx1ZS5nZXQoKSwgc2ltcGxlVmFsdWUuZ2V0KCkpOwotICAgICAgcmV0dXJuIHNpbXBsZVZhbHVlOwotICAgIH0KLQotICAgIGpzT2JqZWN0VmFsdWUtPkdldE9iamVjdFByb3BlcnR5KHByb3BlcnR5VmFsdWUtPlRvU3RyaW5nKCkuQXNTdHJpbmdDKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlVmFsdWUuZ2V0KCkpOwotICAgIHJldHVybiBzaW1wbGVWYWx1ZTsKLSAgfQotCi0gIGF1dG8gZGVmYXVsdFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICBHZXRPYmplY3REZWZhdWx0VmFsdWUoYXJnSW5kZXguZ2V0KCksIGRlZmF1bHRWYWx1ZS5nZXQoKSk7Ci0gIHJldHVybiBkZWZhdWx0VmFsdWU7Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBDWEZBX0ZNMkpTQ29udGV4dDo6VmFsdWVJc051bGwoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywgQ0ZYSlNFX1ZhbHVlKiBhcmcpIHsKLSAgaWYgKCFhcmcgfHwgYXJnLT5Jc051bGwoKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoIWFyZy0+SXNBcnJheSgpICYmICFhcmctPklzT2JqZWN0KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+R2V0U2NyaXB0UnVudGltZSgpOwotICBpZiAoYXJnLT5Jc0FycmF5KCkpIHsKLSAgICBpbnQzMl90IGlMZW5ndGggPSBodmFsdWVfZ2V0X2FycmF5X2xlbmd0aChwVGhpcywgYXJnKTsKLSAgICBpZiAoaUxlbmd0aCA8IDMpCi0gICAgICByZXR1cm4gdHJ1ZTsKLQotICAgIGF1dG8gcHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKLSAgICBhdXRvIGpzT2JqZWN0VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgYXJnLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KDEsIHByb3BlcnR5VmFsdWUuZ2V0KCkpOwotICAgIGFyZy0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgyLCBqc09iamVjdFZhbHVlLmdldCgpKTsKLSAgICBpZiAocHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkpIHsKLSAgICAgIGF1dG8gZGVmYXVsdFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGpzT2JqZWN0VmFsdWUuZ2V0KCksIGRlZmF1bHRWYWx1ZS5nZXQoKSk7Ci0gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlLT5Jc051bGwoKTsKLSAgICB9Ci0KLSAgICBhdXRvIG5ld1Byb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAganNPYmplY3RWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHkocHJvcGVydHlWYWx1ZS0+VG9TdHJpbmcoKS5Bc1N0cmluZ0MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKLSAgICByZXR1cm4gbmV3UHJvcGVydHlWYWx1ZS0+SXNOdWxsKCk7Ci0gIH0KLQotICBhdXRvIGRlZmF1bHRWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKLSAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGFyZywgZGVmYXVsdFZhbHVlLmdldCgpKTsKLSAgcmV0dXJuIGRlZmF1bHRWYWx1ZS0+SXNOdWxsKCk7Ci19Ci0KLS8vIHN0YXRpYwotaW50MzJfdCBDWEZBX0ZNMkpTQ29udGV4dDo6aHZhbHVlX2dldF9hcnJheV9sZW5ndGgoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogYXJnKSB7Ci0gIGlmICghYXJnIHx8ICFhcmctPklzQXJyYXkoKSkKLSAgICByZXR1cm4gMDsKLQotICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPkdldFNjcmlwdFJ1bnRpbWUoKTsKLSAgYXV0byBsZW5ndGhWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKLSAgYXJnLT5HZXRPYmplY3RQcm9wZXJ0eSgibGVuZ3RoIiwgbGVuZ3RoVmFsdWUuZ2V0KCkpOwotICByZXR1cm4gbGVuZ3RoVmFsdWUtPlRvSW50ZWdlcigpOwotfQotCi0vLyBzdGF0aWMKLWJvb2wgQ1hGQV9GTTJKU0NvbnRleHQ6OnNpbXBsZVZhbHVlQ29tcGFyZShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogZmlyc3RWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHNlY29uZFZhbHVlKSB7Ci0gIGlmICghZmlyc3RWYWx1ZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKGZpcnN0VmFsdWUtPklzU3RyaW5nKCkpIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBmaXJzdFN0cmluZywgc2Vjb25kU3RyaW5nOwotICAgIFZhbHVlVG9VVEY4U3RyaW5nKGZpcnN0VmFsdWUsIGZpcnN0U3RyaW5nKTsKLSAgICBWYWx1ZVRvVVRGOFN0cmluZyhzZWNvbmRWYWx1ZSwgc2Vjb25kU3RyaW5nKTsKLSAgICByZXR1cm4gZmlyc3RTdHJpbmcgPT0gc2Vjb25kU3RyaW5nOwotICB9Ci0gIGlmIChmaXJzdFZhbHVlLT5Jc051bWJlcigpKSB7Ci0gICAgRlhfRkxPQVQgZmlyc3QgPSBWYWx1ZVRvRmxvYXQocFRoaXMsIGZpcnN0VmFsdWUpOwotICAgIEZYX0ZMT0FUIHNlY29uZCA9IFZhbHVlVG9GbG9hdChwVGhpcywgc2Vjb25kVmFsdWUpOwotICAgIHJldHVybiAoZmlyc3QgPT0gc2Vjb25kKTsKLSAgfQotICBpZiAoZmlyc3RWYWx1ZS0+SXNCb29sZWFuKCkpCi0gICAgcmV0dXJuIChmaXJzdFZhbHVlLT5Ub0Jvb2xlYW4oKSA9PSBzZWNvbmRWYWx1ZS0+VG9Cb29sZWFuKCkpOwotCi0gIHJldHVybiBmaXJzdFZhbHVlLT5Jc051bGwoKSAmJiBzZWNvbmRWYWx1ZSAmJiBzZWNvbmRWYWx1ZS0+SXNOdWxsKCk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6dW5mb2xkQXJncygKLSAgICBDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MsCi0gICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4+KiByZXN1bHRWYWx1ZXMsCi0gICAgaW50MzJfdCBpU3RhcnQpIHsKLSAgcmVzdWx0VmFsdWVzLT5jbGVhcigpOwotCi0gIGludDMyX3QgaUNvdW50ID0gMDsKLSAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5HZXRTY3JpcHRSdW50aW1lKCk7Ci0gIGludDMyX3QgYXJnYyA9IGFyZ3MuR2V0TGVuZ3RoKCk7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+PiBhcmdzVmFsdWU7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFyZ2MgLSBpU3RhcnQ7IGkrKykgewotICAgIGFyZ3NWYWx1ZS5wdXNoX2JhY2soYXJncy5HZXRWYWx1ZShpICsgaVN0YXJ0KSk7Ci0gICAgaWYgKGFyZ3NWYWx1ZVtpXS0+SXNBcnJheSgpKSB7Ci0gICAgICBhdXRvIGxlbmd0aFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICAgICAgYXJnc1ZhbHVlW2ldLT5HZXRPYmplY3RQcm9wZXJ0eSgibGVuZ3RoIiwgbGVuZ3RoVmFsdWUuZ2V0KCkpOwotICAgICAgaW50MzJfdCBpTGVuZ3RoID0gbGVuZ3RoVmFsdWUtPlRvSW50ZWdlcigpOwotICAgICAgaUNvdW50ICs9ICgoaUxlbmd0aCA+IDIpID8gKGlMZW5ndGggLSAyKSA6IDApOwotICAgIH0gZWxzZSB7Ci0gICAgICBpQ291bnQgKz0gMTsKLSAgICB9Ci0gIH0KLQotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykKLSAgICByZXN1bHRWYWx1ZXMtPnB1c2hfYmFjayhwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSkpOwotCi0gIGludDMyX3QgaW5kZXggPSAwOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcmdjIC0gaVN0YXJ0OyBpKyspIHsKLSAgICBpZiAoYXJnc1ZhbHVlW2ldLT5Jc0FycmF5KCkpIHsKLSAgICAgIGF1dG8gbGVuZ3RoVmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgICBhcmdzVmFsdWVbaV0tPkdldE9iamVjdFByb3BlcnR5KCJsZW5ndGgiLCBsZW5ndGhWYWx1ZS5nZXQoKSk7Ci0gICAgICBpbnQzMl90IGlMZW5ndGggPSBsZW5ndGhWYWx1ZS0+VG9JbnRlZ2VyKCk7Ci0gICAgICBpZiAoaUxlbmd0aCA8IDMpCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBhdXRvIHByb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgICBhdXRvIGpzT2JqZWN0VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgICBhcmdzVmFsdWVbaV0tPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMSwgcHJvcGVydHlWYWx1ZS5nZXQoKSk7Ci0gICAgICBpZiAocHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkpIHsKLSAgICAgICAgZm9yIChpbnQzMl90IGogPSAyOyBqIDwgaUxlbmd0aDsgaisrKSB7Ci0gICAgICAgICAgYXJnc1ZhbHVlW2ldLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KGosIGpzT2JqZWN0VmFsdWUuZ2V0KCkpOwotICAgICAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc09iamVjdFZhbHVlLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnJlc3VsdFZhbHVlcylbaW5kZXhdLmdldCgpKTsKLSAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludDMyX3QgaiA9IDI7IGogPCBpTGVuZ3RoOyBqKyspIHsKLSAgICAgICAgICBhcmdzVmFsdWVbaV0tPkdldE9iamVjdFByb3BlcnR5QnlJZHgoaiwganNPYmplY3RWYWx1ZS5nZXQoKSk7Ci0gICAgICAgICAganNPYmplY3RWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHkoCi0gICAgICAgICAgICAgIHByb3BlcnR5VmFsdWUtPlRvU3RyaW5nKCkuQXNTdHJpbmdDKCksCi0gICAgICAgICAgICAgICgqcmVzdWx0VmFsdWVzKVtpbmRleF0uZ2V0KCkpOwotICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGFyZ3NWYWx1ZVtpXS0+SXNPYmplY3QoKSkgewotICAgICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGFyZ3NWYWx1ZVtpXS5nZXQoKSwgKCpyZXN1bHRWYWx1ZXMpW2luZGV4XS5nZXQoKSk7Ci0gICAgICBpbmRleCsrOwotICAgIH0gZWxzZSB7Ci0gICAgICAoKnJlc3VsdFZhbHVlcylbaW5kZXhdLT5Bc3NpZ24oYXJnc1ZhbHVlW2ldLmdldCgpKTsKLSAgICAgIGluZGV4Kys7Ci0gICAgfQotICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6R2V0T2JqZWN0RGVmYXVsdFZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcERlZmF1bHRWYWx1ZSkgewotICBDWEZBX05vZGUqIHBOb2RlID0gVG9Ob2RlKENYRkFfU2NyaXB0Q29udGV4dDo6VG9PYmplY3QocFZhbHVlLCBudWxscHRyKSk7Ci0gIGlmICghcE5vZGUpIHsKLSAgICBwRGVmYXVsdFZhbHVlLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBOb2RlLT5TY3JpcHRfU29tX0RlZmF1bHRWYWx1ZShwRGVmYXVsdFZhbHVlLCBmYWxzZSwgKFhGQV9BVFRSSUJVVEUpLTEpOwotfQotCi0vLyBzdGF0aWMKLWJvb2wgQ1hGQV9GTTJKU0NvbnRleHQ6OlNldE9iamVjdERlZmF1bHRWYWx1ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGhOZXdWYWx1ZSkgewotICBDWEZBX05vZGUqIHBOb2RlID0gVG9Ob2RlKENYRkFfU2NyaXB0Q29udGV4dDo6VG9PYmplY3QocFZhbHVlLCBudWxscHRyKSk7Ci0gIGlmICghcE5vZGUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHBOb2RlLT5TY3JpcHRfU29tX0RlZmF1bHRWYWx1ZShoTmV3VmFsdWUsIHRydWUsIChYRkFfQVRUUklCVVRFKS0xKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6R2VuZXJhdGVTb21FeHByZXNzaW9uKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUluZGV4RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpSW5kZXhWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJc1N0YXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN6U29tRXhwKSB7Ci0gIGlmIChiSXNTdGFyKSB7Ci0gICAgc3pTb21FeHAgPSBzek5hbWUgKyAiWypdIjsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGlJbmRleEZsYWdzID09IDApIHsKLSAgICBzelNvbUV4cCA9IHN6TmFtZTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGlJbmRleEZsYWdzID09IDEgfHwgaUluZGV4VmFsdWUgPT0gMCkgewotICAgIHN6U29tRXhwID0gc3pOYW1lICsgIlsiICsKLSAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nOjpGb3JtYXRJbnRlZ2VyKGlJbmRleFZhbHVlLCBGWEZPUk1BVF9TSUdORUQpICsKLSAgICAgICAgICAgICAgICJdIjsKLSAgfSBlbHNlIGlmIChpSW5kZXhGbGFncyA9PSAyKSB7Ci0gICAgc3pTb21FeHAgPSAoaUluZGV4VmFsdWUgPCAwKSA/IChzek5hbWUgKyAiWy0iKSA6IChzek5hbWUgKyAiWysiKTsKLSAgICBpSW5kZXhWYWx1ZSA9IChpSW5kZXhWYWx1ZSA8IDApID8gKDAgLSBpSW5kZXhWYWx1ZSkgOiBpSW5kZXhWYWx1ZTsKLSAgICBzelNvbUV4cCArPSBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0SW50ZWdlcihpSW5kZXhWYWx1ZSk7Ci0gICAgc3pTb21FeHAgKz0gIl0iOwotICB9IGVsc2UgewotICAgIHN6U29tRXhwID0gKGlJbmRleFZhbHVlIDwgMCkgPyAoc3pOYW1lICsgIlsiKSA6IChzek5hbWUgKyAiWy0iKTsKLSAgICBpSW5kZXhWYWx1ZSA9IChpSW5kZXhWYWx1ZSA8IDApID8gKDAgLSBpSW5kZXhWYWx1ZSkgOiBpSW5kZXhWYWx1ZTsKLSAgICBzelNvbUV4cCArPSBDRlhfQnl0ZVN0cmluZzo6Rm9ybWF0SW50ZWdlcihpSW5kZXhWYWx1ZSk7Ci0gICAgc3pTb21FeHAgKz0gIl0iOwotICB9Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBDWEZBX0ZNMkpTQ29udGV4dDo6R2V0T2JqZWN0Rm9yTmFtZSgKLSAgICBDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgIENGWEpTRV9WYWx1ZSogYWNjZXNzb3JWYWx1ZSwKLSAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6QWNjZXNzb3JOYW1lKSB7Ci0gIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPkdldERvY3VtZW50KCk7Ci0gIGlmICghcERvYykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1hGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKTsKLSAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc292ZU5vZGVSUzsKLSAgdWludDMyX3QgZHdGbGFncyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzIHwKLSAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQ7Ci0gIGludDMyX3QgaVJldCA9IHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cygKLSAgICAgIHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCksCi0gICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pBY2Nlc3Nvck5hbWUpLkFzU3RyaW5nQygpLCByZXNvdmVOb2RlUlMsCi0gICAgICBkd0ZsYWdzKTsKLSAgaWYgKGlSZXQgPj0gMSAmJiByZXNvdmVOb2RlUlMuZHdGbGFncyA9PSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfTm9kZXMpIHsKLSAgICBhY2Nlc3NvclZhbHVlLT5Bc3NpZ24oCi0gICAgICAgIHBTY3JpcHRDb250ZXh0LT5HZXRKU1ZhbHVlRnJvbU1hcChyZXNvdmVOb2RlUlMubm9kZXMuR2V0QXQoMCkpKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIHN0YXRpYwotaW50MzJfdCBDWEZBX0ZNMkpTQ29udGV4dDo6UmVzb2x2ZU9iamVjdHMoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFJlZlZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1NvbUV4cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyYgcmVzb3ZlTm9kZVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiZG90QWNjZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJIYXNOb1Jlc29sdmVOYW1lKSB7Ci0gIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPkdldERvY3VtZW50KCk7Ci0gIGlmICghcERvYykKLSAgICByZXR1cm4gLTE7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NTb21FeHByZXNzaW9uID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzU29tRXhwKTsKLSAgQ1hGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKTsKLSAgQ1hGQV9PYmplY3QqIHBOb2RlID0gbnVsbHB0cjsKLSAgdWludDMyX3QgZEZsYWdzID0gMFVMOwotICBpZiAoYmRvdEFjY2Vzc29yKSB7Ci0gICAgaWYgKHBSZWZWYWx1ZSAmJiBwUmVmVmFsdWUtPklzTnVsbCgpKSB7Ci0gICAgICBwTm9kZSA9IHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCk7Ci0gICAgICBkRmxhZ3MgPSBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MgfCBYRkFfUkVTT0xWRU5PREVfUGFyZW50OwotICAgIH0gZWxzZSB7Ci0gICAgICBwTm9kZSA9IENYRkFfU2NyaXB0Q29udGV4dDo6VG9PYmplY3QocFJlZlZhbHVlLCBudWxscHRyKTsKLSAgICAgIEFTU0VSVChwTm9kZSk7Ci0gICAgICBpZiAoYkhhc05vUmVzb2x2ZU5hbWUpIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOwotICAgICAgICBpZiAoQ1hGQV9Ob2RlKiBwWEZBTm9kZSA9IHBOb2RlLT5Bc05vZGUoKSkKLSAgICAgICAgICBwWEZBTm9kZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lLCBmYWxzZSk7Ci0gICAgICAgIGlmICh3c05hbWUuSXNFbXB0eSgpKQotICAgICAgICAgIHdzTmFtZSA9IEwiIyIgKyBwTm9kZS0+R2V0Q2xhc3NOYW1lKCk7Ci0KLSAgICAgICAgd3NTb21FeHByZXNzaW9uID0gd3NOYW1lICsgd3NTb21FeHByZXNzaW9uOwotICAgICAgICBkRmxhZ3MgPSBYRkFfUkVTT0xWRU5PREVfU2libGluZ3M7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBkRmxhZ3MgPSAoYnNTb21FeHAgPT0gIioiKQotICAgICAgICAgICAgICAgICAgICAgPyAoWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuKQotICAgICAgICAgICAgICAgICAgICAgOiAoWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXMgfAotICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBwTm9kZSA9IENYRkFfU2NyaXB0Q29udGV4dDo6VG9PYmplY3QocFJlZlZhbHVlLCBudWxscHRyKTsKLSAgICBkRmxhZ3MgPSBYRkFfUkVTT0xWRU5PREVfQW55Q2hpbGQ7Ci0gIH0KLSAgcmV0dXJuIHBTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cyhwTm9kZSwgd3NTb21FeHByZXNzaW9uLkFzU3RyaW5nQygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc292ZU5vZGVSUywgZEZsYWdzKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpQYXJzZVJlc29sdmVSZXN1bHQoCi0gICAgQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICBjb25zdCBYRkFfUkVTT0xWRU5PREVfUlMmIHJlc292ZU5vZGVSUywKLSAgICBDRlhKU0VfVmFsdWUqIHBQYXJlbnRWYWx1ZSwKLSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPj4qIHJlc3VsdFZhbHVlcywKLSAgICBib29sKiBiQXR0cmlidXRlKSB7Ci0gIEFTU0VSVChiQXR0cmlidXRlKTsKLQotICByZXN1bHRWYWx1ZXMtPmNsZWFyKCk7Ci0KLSAgQ1hGQV9GTTJKU0NvbnRleHQqIHBDb250ZXh0ID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpOwotICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBwQ29udGV4dC0+R2V0U2NyaXB0UnVudGltZSgpOwotCi0gIGlmIChyZXNvdmVOb2RlUlMuZHdGbGFncyA9PSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfTm9kZXMpIHsKLSAgICAqYkF0dHJpYnV0ZSA9IGZhbHNlOwotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHJlc292ZU5vZGVSUy5ub2Rlcy5HZXRTaXplKCk7IGkrKykgewotICAgICAgcmVzdWx0VmFsdWVzLT5wdXNoX2JhY2socGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpKTsKLSAgICAgIHJlc3VsdFZhbHVlcy0+YmFjaygpLT5Bc3NpZ24oCi0gICAgICAgICAgcENvbnRleHQtPkdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAoCi0gICAgICAgICAgICAgIHJlc292ZU5vZGVSUy5ub2Rlcy5HZXRBdChpKSkpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICBDWEZBX1ZhbHVlQXJyYXkgb2JqZWN0UHJvcGVydGllcyhwSXNvbGF0ZSk7Ci0gIGludDMyX3QgaVJldCA9IHJlc292ZU5vZGVSUy5HZXRBdHRyaWJ1dGVSZXN1bHQob2JqZWN0UHJvcGVydGllcyk7Ci0gICpiQXR0cmlidXRlID0gdHJ1ZTsKLSAgaWYgKGlSZXQgIT0gMCkgewotICAgICpiQXR0cmlidXRlID0gZmFsc2U7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVJldDsgaSsrKSB7Ci0gICAgICByZXN1bHRWYWx1ZXMtPnB1c2hfYmFjayhwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSkpOwotICAgICAgcmVzdWx0VmFsdWVzLT5iYWNrKCktPkFzc2lnbihvYmplY3RQcm9wZXJ0aWVzW2ldKTsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKCFwUGFyZW50VmFsdWUgfHwgIXBQYXJlbnRWYWx1ZS0+SXNPYmplY3QoKSkKLSAgICByZXR1cm47Ci0KLSAgcmVzdWx0VmFsdWVzLT5wdXNoX2JhY2socGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpKTsKLSAgcmVzdWx0VmFsdWVzLT5iYWNrKCktPkFzc2lnbihwUGFyZW50VmFsdWUpOwotfQotCi0vLyBzdGF0aWMKLWludDMyX3QgQ1hGQV9GTTJKU0NvbnRleHQ6OlZhbHVlVG9JbnRlZ2VyKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHBWYWx1ZSkgewotICBpZiAoIXBWYWx1ZSkKLSAgICByZXR1cm4gMDsKLQotICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPkdldFNjcmlwdFJ1bnRpbWUoKTsKLSAgaWYgKHBWYWx1ZS0+SXNBcnJheSgpKSB7Ci0gICAgYXV0byBwcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICAgIGF1dG8ganNPYmplY3RWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKLSAgICBhdXRvIG5ld1Byb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgcFZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KDEsIHByb3BlcnR5VmFsdWUuZ2V0KCkpOwotICAgIHBWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgyLCBqc09iamVjdFZhbHVlLmdldCgpKTsKLSAgICBpZiAocHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkpIHsKLSAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc09iamVjdFZhbHVlLmdldCgpLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKLSAgICAgIHJldHVybiBWYWx1ZVRvSW50ZWdlcihwVGhpcywgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7Ci0gICAgfQotCi0gICAganNPYmplY3RWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHkocHJvcGVydHlWYWx1ZS0+VG9TdHJpbmcoKS5Bc1N0cmluZ0MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKLSAgICByZXR1cm4gVmFsdWVUb0ludGVnZXIocFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOwotICB9Ci0gIGlmIChwVmFsdWUtPklzT2JqZWN0KCkpIHsKLSAgICBhdXRvIG5ld1Byb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKHBWYWx1ZSwgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7Ci0gICAgcmV0dXJuIFZhbHVlVG9JbnRlZ2VyKHBUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKLSAgfQotICBpZiAocFZhbHVlLT5Jc1N0cmluZygpKQotICAgIHJldHVybiBGWFNZU19hdG9pKHBWYWx1ZS0+VG9TdHJpbmcoKS5jX3N0cigpKTsKLSAgcmV0dXJuIHBWYWx1ZS0+VG9JbnRlZ2VyKCk7Ci19Ci0KLS8vIHN0YXRpYwotRlhfRkxPQVQgQ1hGQV9GTTJKU0NvbnRleHQ6OlZhbHVlVG9GbG9hdChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGFyZykgewotICBpZiAoIWFyZykKLSAgICByZXR1cm4gMC4wZjsKLQotICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSBUb0pTQ29udGV4dChwVGhpcywgbnVsbHB0ciktPkdldFNjcmlwdFJ1bnRpbWUoKTsKLSAgaWYgKGFyZy0+SXNBcnJheSgpKSB7Ci0gICAgYXV0byBwcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICAgIGF1dG8ganNPYmplY3RWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKLSAgICBhdXRvIG5ld1Byb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgYXJnLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KDEsIHByb3BlcnR5VmFsdWUuZ2V0KCkpOwotICAgIGFyZy0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgyLCBqc09iamVjdFZhbHVlLmdldCgpKTsKLSAgICBpZiAocHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkpIHsKLSAgICAgIEdldE9iamVjdERlZmF1bHRWYWx1ZShqc09iamVjdFZhbHVlLmdldCgpLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKLSAgICAgIHJldHVybiBWYWx1ZVRvRmxvYXQocFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOwotICAgIH0KLSAgICBqc09iamVjdFZhbHVlLT5HZXRPYmplY3RQcm9wZXJ0eShwcm9wZXJ0eVZhbHVlLT5Ub1N0cmluZygpLkFzU3RyaW5nQygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOwotICAgIHJldHVybiBWYWx1ZVRvRmxvYXQocFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOwotICB9Ci0gIGlmIChhcmctPklzT2JqZWN0KCkpIHsKLSAgICBhdXRvIG5ld1Byb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGFyZywgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7Ci0gICAgcmV0dXJuIFZhbHVlVG9GbG9hdChwVGhpcywgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7Ci0gIH0KLSAgaWYgKGFyZy0+SXNTdHJpbmcoKSkKLSAgICByZXR1cm4gKEZYX0ZMT0FUKVhGQV9CeXRlU3RyaW5nVG9Eb3VibGUoYXJnLT5Ub1N0cmluZygpLkFzU3RyaW5nQygpKTsKLSAgaWYgKGFyZy0+SXNVbmRlZmluZWQoKSkKLSAgICByZXR1cm4gMDsKLQotICByZXR1cm4gYXJnLT5Ub0Zsb2F0KCk7Ci19Ci0KLS8vIHN0YXRpYwotRlhfRE9VQkxFIENYRkFfRk0ySlNDb250ZXh0OjpWYWx1ZVRvRG91YmxlKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBhcmcpIHsKLSAgaWYgKCFhcmcpCi0gICAgcmV0dXJuIDA7Ci0KLSAgdjg6Oklzb2xhdGUqIHBJc29sYXRlID0gVG9KU0NvbnRleHQocFRoaXMsIG51bGxwdHIpLT5HZXRTY3JpcHRSdW50aW1lKCk7Ci0gIGlmIChhcmctPklzQXJyYXkoKSkgewotICAgIGF1dG8gcHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKLSAgICBhdXRvIGpzT2JqZWN0VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgYXV0byBuZXdQcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICAgIGFyZy0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgxLCBwcm9wZXJ0eVZhbHVlLmdldCgpKTsKLSAgICBhcmctPkdldE9iamVjdFByb3BlcnR5QnlJZHgoMiwganNPYmplY3RWYWx1ZS5nZXQoKSk7Ci0gICAgaWYgKHByb3BlcnR5VmFsdWUtPklzTnVsbCgpKSB7Ci0gICAgICBHZXRPYmplY3REZWZhdWx0VmFsdWUoanNPYmplY3RWYWx1ZS5nZXQoKSwgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7Ci0gICAgICByZXR1cm4gVmFsdWVUb0RvdWJsZShwVGhpcywgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7Ci0gICAgfQotICAgIGpzT2JqZWN0VmFsdWUtPkdldE9iamVjdFByb3BlcnR5KHByb3BlcnR5VmFsdWUtPlRvU3RyaW5nKCkuQXNTdHJpbmdDKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7Ci0gICAgcmV0dXJuIFZhbHVlVG9Eb3VibGUocFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOwotICB9Ci0gIGlmIChhcmctPklzT2JqZWN0KCkpIHsKLSAgICBhdXRvIG5ld1Byb3BlcnR5VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gICAgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKGFyZywgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7Ci0gICAgcmV0dXJuIFZhbHVlVG9Eb3VibGUocFRoaXMsIG5ld1Byb3BlcnR5VmFsdWUuZ2V0KCkpOwotICB9Ci0gIGlmIChhcmctPklzU3RyaW5nKCkpCi0gICAgcmV0dXJuIFhGQV9CeXRlU3RyaW5nVG9Eb3VibGUoYXJnLT5Ub1N0cmluZygpLkFzU3RyaW5nQygpKTsKLSAgaWYgKGFyZy0+SXNVbmRlZmluZWQoKSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIGFyZy0+VG9Eb3VibGUoKTsKLX0KLQotLy8gc3RhdGljLgotZG91YmxlIENYRkFfRk0ySlNDb250ZXh0OjpFeHRyYWN0RG91YmxlKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcmV0KSB7Ci0gIEFTU0VSVChyZXQpOwotICAqcmV0ID0gdHJ1ZTsKLQotICBpZiAoIXNyYykKLSAgICByZXR1cm4gMDsKLQotICBpZiAoIXNyYy0+SXNBcnJheSgpKQotICAgIHJldHVybiBWYWx1ZVRvRG91YmxlKHBUaGlzLCBzcmMpOwotCi0gIHY4OjpJc29sYXRlKiBwSXNvbGF0ZSA9IFRvSlNDb250ZXh0KHBUaGlzLCBudWxscHRyKS0+R2V0U2NyaXB0UnVudGltZSgpOwotICBhdXRvIGxlbmd0aFZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICBzcmMtPkdldE9iamVjdFByb3BlcnR5KCJsZW5ndGgiLCBsZW5ndGhWYWx1ZS5nZXQoKSk7Ci0gIGludDMyX3QgaUxlbmd0aCA9IGxlbmd0aFZhbHVlLT5Ub0ludGVnZXIoKTsKLSAgaWYgKGlMZW5ndGggPD0gMikgewotICAgICpyZXQgPSBmYWxzZTsKLSAgICByZXR1cm4gMC4wOwotICB9Ci0KLSAgYXV0byBwcm9wZXJ0eVZhbHVlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWEpTRV9WYWx1ZT4ocElzb2xhdGUpOwotICBhdXRvIGpzT2JqZWN0VmFsdWUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX1ZhbHVlPihwSXNvbGF0ZSk7Ci0gIHNyYy0+R2V0T2JqZWN0UHJvcGVydHlCeUlkeCgxLCBwcm9wZXJ0eVZhbHVlLmdldCgpKTsKLSAgc3JjLT5HZXRPYmplY3RQcm9wZXJ0eUJ5SWR4KDIsIGpzT2JqZWN0VmFsdWUuZ2V0KCkpOwotICBpZiAocHJvcGVydHlWYWx1ZS0+SXNOdWxsKCkpCi0gICAgcmV0dXJuIFZhbHVlVG9Eb3VibGUocFRoaXMsIGpzT2JqZWN0VmFsdWUuZ2V0KCkpOwotCi0gIGF1dG8gbmV3UHJvcGVydHlWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBJc29sYXRlKTsKLSAganNPYmplY3RWYWx1ZS0+R2V0T2JqZWN0UHJvcGVydHkocHJvcGVydHlWYWx1ZS0+VG9TdHJpbmcoKS5Bc1N0cmluZ0MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UHJvcGVydHlWYWx1ZS5nZXQoKSk7Ci0gIHJldHVybiBWYWx1ZVRvRG91YmxlKHBUaGlzLCBuZXdQcm9wZXJ0eVZhbHVlLmdldCgpKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpWYWx1ZVRvVVRGOFN0cmluZyhDRlhKU0VfVmFsdWUqIGFyZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzek91dHB1dFN0cmluZykgewotICBpZiAoIWFyZykKLSAgICByZXR1cm47Ci0KLSAgaWYgKGFyZy0+SXNOdWxsKCkgfHwgYXJnLT5Jc1VuZGVmaW5lZCgpKQotICAgIHN6T3V0cHV0U3RyaW5nID0gIiI7Ci0gIGVsc2UgaWYgKGFyZy0+SXNCb29sZWFuKCkpCi0gICAgc3pPdXRwdXRTdHJpbmcgPSBhcmctPlRvQm9vbGVhbigpID8gIjEiIDogIjAiOwotICBlbHNlCi0gICAgc3pPdXRwdXRTdHJpbmcgPSBhcmctPlRvU3RyaW5nKCk7Ci19Ci0KLS8vIHN0YXRpYy4KLWludDMyX3QgQ1hGQV9GTTJKU0NvbnRleHQ6OlRyYW5zbGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9ybWNhbGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVUZXh0QnVmJiB3c0phdmFzY3JpcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRXJyb3IpIHsKLSAgaWYgKHdzRm9ybWNhbGMuSXNFbXB0eSgpKSB7Ci0gICAgd3NKYXZhc2NyaXB0LkNsZWFyKCk7Ci0gICAgd3NFcnJvci5jbGVhcigpOwotICAgIHJldHVybiAwOwotICB9Ci0gIENYRkFfRk1Qcm9ncmFtIHByb2dyYW0od3NGb3JtY2FsYyk7Ci0gIGludDMyX3Qgc3RhdHVzID0gcHJvZ3JhbS5QYXJzZVByb2dyYW0oKTsKLSAgaWYgKHN0YXR1cykgewotICAgIHdzRXJyb3IgPSBwcm9ncmFtLkdldEVycm9yKCkubWVzc2FnZTsKLSAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0gIHByb2dyYW0uVHJhbnNsYXRlUHJvZ3JhbSh3c0phdmFzY3JpcHQpOwotICByZXR1cm4gMDsKLX0KLQotQ1hGQV9GTTJKU0NvbnRleHQ6OkNYRkFfRk0ySlNDb250ZXh0KHY4OjpJc29sYXRlKiBwU2NyaXB0SXNvbGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQ29udGV4dCogcFNjcmlwdENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Eb2N1bWVudCogcERvYykKLSAgICA6IG1fcElzb2xhdGUocFNjcmlwdElzb2xhdGUpLAotICAgICAgbV9wRk1DbGFzcygKLSAgICAgICAgICBDRlhKU0VfQ2xhc3M6OkNyZWF0ZShwU2NyaXB0Q29udGV4dCwgJmZvcm1jYWxjX2ZtMmpzX2Rlc2NyaXB0b3IpKSwKLSAgICAgIG1fcFZhbHVlKHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBTY3JpcHRJc29sYXRlKSksCi0gICAgICBtX3BEb2N1bWVudChwRG9jKSB7Ci0gIG1fcFZhbHVlLmdldCgpLT5TZXROdWxsKCk7Ci0gIG1fcFZhbHVlLmdldCgpLT5TZXRPYmplY3QodGhpcywgbV9wRk1DbGFzcyk7Ci19Ci0KLUNYRkFfRk0ySlNDb250ZXh0Ojp+Q1hGQV9GTTJKU0NvbnRleHQoKSB7fQotCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpHbG9iYWxQcm9wZXJ0eUdldHRlcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSkgewotICBwVmFsdWUtPkFzc2lnbihtX3BWYWx1ZS5nZXQoKSk7Ci19Ci0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlRocm93Tm9EZWZhdWx0UHJvcGVydHlFeGNlcHRpb24oCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBuYW1lKSBjb25zdCB7Ci0gIFRocm93RXhjZXB0aW9uKEwiJXMgZG9lc24ndCBoYXZlIGEgZGVmYXVsdCBwcm9wZXJ0eS4iLCBuYW1lLmNfc3RyKCkpOwotfQotCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpUaHJvd0NvbXBpbGVyRXJyb3JFeGNlcHRpb24oKSBjb25zdCB7Ci0gIFRocm93RXhjZXB0aW9uKEwiQ29tcGlsZXIgZXJyb3IuIik7Ci19Ci0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlRocm93RGl2aWRlQnlaZXJvRXhjZXB0aW9uKCkgY29uc3QgewotICBUaHJvd0V4Y2VwdGlvbihMIkRpdmlkZSBieSB6ZXJvLiIpOwotfQotCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpUaHJvd1NlcnZlckRlbmllZEV4Y2VwdGlvbigpIGNvbnN0IHsKLSAgVGhyb3dFeGNlcHRpb24oTCJTZXJ2ZXIgZG9lcyBub3QgcGVybWl0IG9wZXJhdGlvbi4iKTsKLX0KLQotdm9pZCBDWEZBX0ZNMkpTQ29udGV4dDo6VGhyb3dQcm9wZXJ0eU5vdEluT2JqZWN0RXhjZXB0aW9uKAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBuYW1lLAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBleHApIGNvbnN0IHsKLSAgVGhyb3dFeGNlcHRpb24oCi0gICAgICBMIkFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gcmVmZXJlbmNlIHByb3BlcnR5ICclcycgb2YgYSBub24tb2JqZWN0ICIKLSAgICAgIEwiaW4gU09NIGV4cHJlc3Npb24gJXMuIiwKLSAgICAgIG5hbWUuY19zdHIoKSwgZXhwLmNfc3RyKCkpOwotfQotCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbigKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgbWV0aG9kKSBjb25zdCB7Ci0gIFRocm93RXhjZXB0aW9uKEwiSW5jb3JyZWN0IG51bWJlciBvZiBwYXJhbWV0ZXJzIGNhbGxpbmcgbWV0aG9kICclcycuIiwKLSAgICAgICAgICAgICAgICAgbWV0aG9kLmNfc3RyKCkpOwotfQotCi12b2lkIENYRkFfRk0ySlNDb250ZXh0OjpUaHJvd0FyZ3VtZW50TWlzbWF0Y2hFeGNlcHRpb24oKSBjb25zdCB7Ci0gIFRocm93RXhjZXB0aW9uKEwiQXJndW1lbnQgbWlzbWF0Y2ggaW4gcHJvcGVydHkgb3IgZnVuY3Rpb24gYXJndW1lbnQuIik7Ci19Ci0KLXZvaWQgQ1hGQV9GTTJKU0NvbnRleHQ6OlRocm93RXhjZXB0aW9uKGNvbnN0IEZYX1dDSEFSKiBzdHIsIC4uLikgY29uc3QgewotICBDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2U7Ci0gIHZhX2xpc3QgYXJnX3B0cjsKLSAgdmFfc3RhcnQoYXJnX3B0ciwgc3RyKTsKLSAgd3NNZXNzYWdlLkZvcm1hdFYoc3RyLCBhcmdfcHRyKTsKLSAgdmFfZW5kKGFyZ19wdHIpOwotICBGWEpTRV9UaHJvd01lc3NhZ2Uod3NNZXNzYWdlLlVURjhFbmNvZGUoKS5Bc1N0cmluZ0MoKSk7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9mbTJqcy94ZmFfZm0yanNjb250ZXh0LmggYi94ZmEvZnhmYS9mbTJqcy94ZmFfZm0yanNjb250ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmODAyZmUuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvZm0yanMveGZhX2ZtMmpzY29udGV4dC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDczICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhGQV9GTTJKU19YRkFfRk0ySlNDT05URVhUX0hfCi0jZGVmaW5lIFhGQV9GWEZBX0ZNMkpTX1hGQV9GTTJKU0NPTlRFWFRfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJmeGpzL2NmeGpzZV9hcmd1bWVudHMuaCIKLSNpbmNsdWRlICJmeGpzL2NmeGpzZV9jb250ZXh0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9yZXNvbHZlbm9kZV9ycy5oIgotCi1jbGFzcyBDWEZBX0ZNMkpTQ29udGV4dCA6IHB1YmxpYyBDRlhKU0VfSG9zdE9iamVjdCB7Ci0gcHVibGljOgotICBDWEZBX0ZNMkpTQ29udGV4dCh2ODo6SXNvbGF0ZSogcFNjcmlwdElzb2xhdGUsCi0gICAgICAgICAgICAgICAgICAgIENGWEpTRV9Db250ZXh0KiBwU2NyaXB0Q29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgQ1hGQV9Eb2N1bWVudCogcERvYyk7Ci0gIH5DWEZBX0ZNMkpTQ29udGV4dCgpIG92ZXJyaWRlOwotCi0gIHN0YXRpYyB2b2lkIEFicyhDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIEF2ZyhDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIENlaWwoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIENvdW50KENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIEZsb29yKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIE1heChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIE1pbihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIE1vZChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIFJvdW5kKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIFN1bShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIERhdGUoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIERhdGUyTnVtKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIERhdGVGbXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIElzb0RhdGUyTnVtKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIElzb1RpbWUyTnVtKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIExvY2FsRGF0ZUZtdChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIExvY2FsVGltZUZtdChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIE51bTJEYXRlKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIE51bTJHTVRpbWUoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIE51bTJUaW1lKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIFRpbWUoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIFRpbWUyTnVtKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIFRpbWVGbXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0KLSAgc3RhdGljIGJvb2wgSXNJc29EYXRlRm9ybWF0KGNvbnN0IEZYX0NIQVIqIHBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVllYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTW9udGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpRGF5KTsKLSAgc3RhdGljIGJvb2wgSXNJc29UaW1lRm9ybWF0KGNvbnN0IEZYX0NIQVIqIHBEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUhvdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTWludXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVNlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNaWxsaVNlY29uZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlab25lSG91ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlab25lTWludXRlKTsKLSAgc3RhdGljIGJvb2wgSXNJc29EYXRlVGltZUZvcm1hdChjb25zdCBGWF9DSEFSKiBwRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlMZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaVllYXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1vbnRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlEYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUhvdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaU1pbnV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpU2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNaWxsaW9uU2Vjb25kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlab25lSG91ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpWm9uZU1pbnV0ZSk7Ci0gIHN0YXRpYyBib29sIExvY2FsMklzb0RhdGUoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0cklzb0RhdGUpOwotICBzdGF0aWMgYm9vbCBMb2NhbDJJc29UaW1lKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHJJc29UaW1lKTsKLSAgc3RhdGljIGJvb2wgSXNvRGF0ZTJMb2NhbChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pEYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyTG9jYWxEYXRlKTsKLSAgc3RhdGljIGJvb2wgSXNvVGltZTJMb2NhbChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyTG9jYWxUaW1lKTsKLSAgc3RhdGljIGJvb2wgR2V0R01UVGltZShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyR01UVGltZSk7Ci0gIHN0YXRpYyBpbnQzMl90IERhdGVTdHJpbmcyTnVtKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pEYXRlU3RyaW5nKTsKLSAgc3RhdGljIHZvaWQgR2V0TG9jYWxEYXRlRm9ybWF0KENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlTdHlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pMb2NhbFN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzdHJGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTdGFuZGFyZCk7Ci0gIHN0YXRpYyB2b2lkIEdldExvY2FsVGltZUZvcm1hdChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3RhbmRhcmQpOwotICBzdGF0aWMgdm9pZCBHZXRTdGFuZGFyZERhdGVGb3JtYXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekxvY2FsU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0ckZvcm1hdCk7Ci0gIHN0YXRpYyB2b2lkIEdldFN0YW5kYXJkVGltZUZvcm1hdChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgc3RyRm9ybWF0KTsKLQotICBzdGF0aWMgdm9pZCBOdW0yQWxsVGltZShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6TG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJHTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVTdHJpbmcmIHN0clRpbWUpOwotICBzdGF0aWMgdm9pZCBHZXRMb2NhbFRpbWVab25lKGludDMyX3QmIGlIb3VyLCBpbnQzMl90JiBpTWluLCBpbnQzMl90JiBpU2VjKTsKLQotICBzdGF0aWMgdm9pZCBBcHIoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOwotICBzdGF0aWMgdm9pZCBDVGVybShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOwotICBzdGF0aWMgdm9pZCBGVihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOwotICBzdGF0aWMgdm9pZCBJUG10KENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOwotICBzdGF0aWMgdm9pZCBOUFYoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOwotICBzdGF0aWMgdm9pZCBQbXQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOwotICBzdGF0aWMgdm9pZCBQUG10KENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOwotICBzdGF0aWMgdm9pZCBQVihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOwotICBzdGF0aWMgdm9pZCBSYXRlKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOwotICBzdGF0aWMgdm9pZCBUZXJtKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOwotICBzdGF0aWMgdm9pZCBDaG9vc2UoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOwotICBzdGF0aWMgdm9pZCBFeGlzdHMoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOwotICBzdGF0aWMgdm9pZCBIYXNWYWx1ZShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOwotICBzdGF0aWMgdm9pZCBPbmVvZihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOwotICBzdGF0aWMgdm9pZCBXaXRoaW4oQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOwotICBzdGF0aWMgdm9pZCBJZihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOwotICBzdGF0aWMgdm9pZCBFdmFsKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOwotICBzdGF0aWMgdm9pZCBSZWYoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOwotICBzdGF0aWMgdm9pZCBVbml0VHlwZShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOwotICBzdGF0aWMgdm9pZCBVbml0VmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOwotCi0gIHN0YXRpYyB2b2lkIEF0KENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIENvbmNhdChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIERlY29kZShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIERlY29kZVVSTChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6VVJMU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmJiBzelJlc3VsdEJ1Zik7Ci0gIHN0YXRpYyB2b2lkIERlY29kZUhUTUwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekhUTUxTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmJiBzelJlc3VsdEJ1Zik7Ci0gIHN0YXRpYyB2b2lkIERlY29kZVhNTChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6WE1MU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmJiBzelJlc3VsdEJ1Zik7Ci0gIHN0YXRpYyB2b2lkIEVuY29kZShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIEVuY29kZVVSTChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6VVJMU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmJiBzelJlc3VsdEJ1Zik7Ci0gIHN0YXRpYyB2b2lkIEVuY29kZUhUTUwoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekhUTUxTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmJiBzelJlc3VsdEJ1Zik7Ci0gIHN0YXRpYyB2b2lkIEVuY29kZVhNTChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6WE1MU3RyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmJiBzelJlc3VsdEJ1Zik7Ci0gIHN0YXRpYyBib29sIEhUTUxTVFIyQ29kZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHBEYXRhLCB1aW50MzJfdCYgaUNvZGUpOwotICBzdGF0aWMgYm9vbCBIVE1MQ29kZTJTVFIodWludDMyX3QgaUNvZGUsIENGWF9XaWRlU3RyaW5nJiB3c0hUTUxSZXNlcnZlKTsKLSAgc3RhdGljIHZvaWQgRm9ybWF0KENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgTGVmdChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgTGVuKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgTG93ZXIoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgTHRyaW0oQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgUGFyc2UoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgUmVwbGFjZShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgUmlnaHQoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgUnRyaW0oQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgU3BhY2UoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgU3RyKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgU3R1ZmYoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgU3Vic3RyKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgVXVpZChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgVXBwZXIoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgV29yZE51bShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgVHJpbGxpb25VUyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVRleHRCdWYmIHN0ckJ1Zik7Ci0gIHN0YXRpYyB2b2lkIFdvcmRVUyhjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgQ0ZYX0J5dGVUZXh0QnVmJiBzdHJCdWYpOwotCi0gIHN0YXRpYyB2b2lkIEdldChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIFBvc3QoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIFB1dChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIGFzc2lnbl92YWx1ZV9vcGVyYXRvcihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIGxvZ2ljYWxfb3Jfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIGxvZ2ljYWxfYW5kX29wZXJhdG9yKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIGVxdWFsaXR5X29wZXJhdG9yKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyB2b2lkIG5vdGVxdWFsaXR5X29wZXJhdG9yKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncyk7Ci0gIHN0YXRpYyBib29sIGZtX3JlZl9lcXVhbChDRlhKU0VfVmFsdWUqIHBUaGlzLCBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgbGVzc19vcGVyYXRvcihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgbGVzc2VxdWFsX29wZXJhdG9yKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgZ3JlYXRlcl9vcGVyYXRvcihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgZ3JlYXRlcmVxdWFsX29wZXJhdG9yKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgcGx1c19vcGVyYXRvcihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgbWludXNfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgbXVsdGlwbGVfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgZGl2aWRlX29wZXJhdG9yKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgcG9zaXRpdmVfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgbmVnYXRpdmVfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgbG9naWNhbF9ub3Rfb3BlcmF0b3IoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgZG90X2FjY2Vzc29yKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgZG90ZG90X2FjY2Vzc29yKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgZXZhbF90cmFuc2xhdGlvbihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgaXNfZm1fb2JqZWN0KENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgaXNfZm1fYXJyYXkoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgZ2V0X2ZtX3ZhbHVlKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgZ2V0X2ZtX2pzb2JqKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgZm1fdmFyX2ZpbHRlcihDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLSAgc3RhdGljIHZvaWQgY29uY2F0X2ZtX29iamVjdChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pGdW5jTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKTsKLQotICBzdGF0aWMgaW50MzJfdCBodmFsdWVfZ2V0X2FycmF5X2xlbmd0aChDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGFyZyk7Ci0gIHN0YXRpYyBib29sIHNpbXBsZVZhbHVlQ29tcGFyZShDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBmaXJzdFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBzZWNvbmRWYWx1ZSk7Ci0gIHN0YXRpYyB2b2lkIHVuZm9sZEFyZ3MoCi0gICAgICBDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgQ0ZYSlNFX0FyZ3VtZW50cyYgYXJncywKLSAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+PiogcmVzdWx0VmFsdWVzLAotICAgICAgaW50MzJfdCBpU3RhcnQgPSAwKTsKLSAgc3RhdGljIHZvaWQgR2V0T2JqZWN0RGVmYXVsdFZhbHVlKENGWEpTRV9WYWx1ZSogcE9iamVjdFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwRGVmYXVsdFZhbHVlKTsKLSAgc3RhdGljIGJvb2wgU2V0T2JqZWN0RGVmYXVsdFZhbHVlKENGWEpTRV9WYWx1ZSogcE9iamVjdFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwTmV3VmFsdWUpOwotICBzdGF0aWMgdm9pZCBHZW5lcmF0ZVNvbUV4cHJlc3Npb24oY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzek5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlJbmRleEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpSW5kZXhWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYklzU3RhciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nJiBzelNvbUV4cCk7Ci0gIHN0YXRpYyBib29sIEdldE9iamVjdEZvck5hbWUoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGFjY2Vzc29yVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekFjY2Vzc29yTmFtZSk7Ci0gIHN0YXRpYyBpbnQzMl90IFJlc29sdmVPYmplY3RzKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFBhcmVudFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzU29tRXhwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMmIHJlc292ZU5vZGVSUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiZG90QWNjZXNzb3IgPSB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJIYXNOb1Jlc29sdmVOYW1lID0gZmFsc2UpOwotICBzdGF0aWMgdm9pZCBQYXJzZVJlc29sdmVSZXN1bHQoCi0gICAgICBDRlhKU0VfVmFsdWUqIHBUaGlzLAotICAgICAgY29uc3QgWEZBX1JFU09MVkVOT0RFX1JTJiByZXNvdmVOb2RlUlMsCi0gICAgICBDRlhKU0VfVmFsdWUqIHBQYXJlbnRWYWx1ZSwKLSAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+PiogcmVzdWx0VmFsdWVzLAotICAgICAgYm9vbCogYkF0dHJpYnV0ZSk7Ci0KLSAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IEdldFNpbXBsZVZhbHVlKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5kZXgpOwotICBzdGF0aWMgYm9vbCBWYWx1ZUlzTnVsbChDRlhKU0VfVmFsdWUqIHBUaGlzLCBDRlhKU0VfVmFsdWUqIHBWYWx1ZSk7Ci0gIHN0YXRpYyBpbnQzMl90IFZhbHVlVG9JbnRlZ2VyKENGWEpTRV9WYWx1ZSogcFRoaXMsIENGWEpTRV9WYWx1ZSogcFZhbHVlKTsKLSAgc3RhdGljIEZYX0ZMT0FUIFZhbHVlVG9GbG9hdChDRlhKU0VfVmFsdWUqIHBUaGlzLCBDRlhKU0VfVmFsdWUqIHBWYWx1ZSk7Ci0gIHN0YXRpYyBGWF9ET1VCTEUgVmFsdWVUb0RvdWJsZShDRlhKU0VfVmFsdWUqIHBUaGlzLCBDRlhKU0VfVmFsdWUqIHBWYWx1ZSk7Ci0gIHN0YXRpYyB2b2lkIFZhbHVlVG9VVEY4U3RyaW5nKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfQnl0ZVN0cmluZyYgb3V0cHV0VmFsdWUpOwotICBzdGF0aWMgZG91YmxlIEV4dHJhY3REb3VibGUoQ0ZYSlNFX1ZhbHVlKiBwVGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogcmV0KTsKLQotICBzdGF0aWMgaW50MzJfdCBUcmFuc2xhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0Zvcm1jYWxjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVUZXh0QnVmJiB3c0phdmFzY3JpcHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NFcnJvcik7Ci0KLSAgdm9pZCBHbG9iYWxQcm9wZXJ0eUdldHRlcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSk7Ci0KLSBwcml2YXRlOgotICB2ODo6SXNvbGF0ZSogR2V0U2NyaXB0UnVudGltZSgpIGNvbnN0IHsgcmV0dXJuIG1fcElzb2xhdGU7IH0KLSAgQ1hGQV9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BEb2N1bWVudDsgfQotCi0gIHZvaWQgVGhyb3dOb0RlZmF1bHRQcm9wZXJ0eUV4Y2VwdGlvbihjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIG5hbWUpIGNvbnN0OwotICB2b2lkIFRocm93Q29tcGlsZXJFcnJvckV4Y2VwdGlvbigpIGNvbnN0OwotICB2b2lkIFRocm93RGl2aWRlQnlaZXJvRXhjZXB0aW9uKCkgY29uc3Q7Ci0gIHZvaWQgVGhyb3dTZXJ2ZXJEZW5pZWRFeGNlcHRpb24oKSBjb25zdDsKLSAgdm9pZCBUaHJvd1Byb3BlcnR5Tm90SW5PYmplY3RFeGNlcHRpb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBleHApIGNvbnN0OwotICB2b2lkIFRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpIGNvbnN0OwotICB2b2lkIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBtZXRob2QpIGNvbnN0OwotICB2b2lkIFRocm93RXhjZXB0aW9uKGNvbnN0IEZYX1dDSEFSKiBzdHIsIC4uLikgY29uc3Q7Ci0KLSAgdjg6Oklzb2xhdGUqIG1fcElzb2xhdGU7Ci0gIENGWEpTRV9DbGFzcyogbV9wRk1DbGFzczsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gbV9wVmFsdWU7Ci0gIENYRkFfRG9jdW1lbnQqIGNvbnN0IG1fcERvY3VtZW50OwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhGQV9GTTJKU19YRkFfRk0ySlNDT05URVhUX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9mbTJqcy94ZmFfZm1wYXJzZS5jcHAgYi94ZmEvZnhmYS9mbTJqcy94ZmFfZm1wYXJzZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMTYxZThjLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2ZtMmpzL3hmYV9mbXBhcnNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMjIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvZm0yanMveGZhX2ZtcGFyc2UuaCIKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLQotQ1hGQV9GTVBhcnNlOjpDWEZBX0ZNUGFyc2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0Zvcm1jYWxjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9GTUVycm9ySW5mbyogcEVycm9ySW5mbykKLSAgICA6IG1fcFRva2VuKG51bGxwdHIpLCBtX3BFcnJvckluZm8ocEVycm9ySW5mbykgewotICBtX2xleGVyID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1MZXhlcj4od3NGb3JtY2FsYywgbV9wRXJyb3JJbmZvKTsKLX0KLQotQ1hGQV9GTVBhcnNlOjp+Q1hGQV9GTVBhcnNlKCkge30KLQotdm9pZCBDWEZBX0ZNUGFyc2U6Ok5leHRUb2tlbigpIHsKLSAgbV9wVG9rZW4gPSBtX2xleGVyLT5OZXh0VG9rZW4oKTsKLSAgd2hpbGUgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LcmVzZXJ2ZXIpIHsKLSAgICBpZiAobV9sZXhlci0+SGFzRXJyb3IoKSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIG1fcFRva2VuID0gbV9sZXhlci0+TmV4dFRva2VuKCk7Ci0gIH0KLX0KLQotdm9pZCBDWEZBX0ZNUGFyc2U6OkNoZWNrKFhGQV9GTV9UT0tFTiBvcCkgewotICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBvcCkgewotICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcobV9wVG9rZW4tPm1fd3N0cmluZyk7Ci0gICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIGtGTUVyckV4cGVjdGVkVG9rZW4sIFhGQV9GTV9LZXl3b3JkVG9TdHJpbmcob3ApLAotICAgICAgICAgIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7Ci0gIH0KLSAgTmV4dFRva2VuKCk7Ci19Ci0KLXZvaWQgQ1hGQV9GTVBhcnNlOjpFcnJvcih1aW50MzJfdCBsaW5lTnVtLCBjb25zdCBGWF9XQ0hBUiogbXNnLCAuLi4pIHsKLSAgbV9wRXJyb3JJbmZvLT5saW5lbnVtID0gbGluZU51bTsKLSAgdmFfbGlzdCBhcDsKLSAgdmFfc3RhcnQoYXAsIG1zZyk7Ci0gIG1fcEVycm9ySW5mby0+bWVzc2FnZS5Gb3JtYXRWKG1zZywgYXApOwotICB2YV9lbmQoYXApOwotfQotCi1zdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+PgotQ1hGQV9GTVBhcnNlOjpQYXJzZVRvcEV4cHJlc3Npb24oKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gZXhwcjsKLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPj4gZXhwcmVzc2lvbnM7Ci0gIHdoaWxlICgxKSB7Ci0gICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZW9mIHx8IG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZW5kZnVuYyB8fAotICAgICAgICBtX3BUb2tlbi0+bV90eXBlID09IFRPS2VuZGlmIHx8IG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZWxzZWlmIHx8Ci0gICAgICAgIG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZWxzZSB8fCBtX3BUb2tlbi0+bV90eXBlID09IFRPS3Jlc2VydmVyKSB7Ci0gICAgICByZXR1cm4gZXhwcmVzc2lvbnM7Ci0gICAgfQotCi0gICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZnVuYykgewotICAgICAgZXhwciA9IFBhcnNlRnVuY3Rpb24oKTsKLSAgICAgIGlmIChleHByKSB7Ci0gICAgICAgIGV4cHJlc3Npb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoZXhwcikpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGV4cHIgPSBQYXJzZUV4cHJlc3Npb24oKTsKLSAgICAgIGlmIChleHByKSB7Ci0gICAgICAgIGV4cHJlc3Npb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoZXhwcikpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBleHByZXNzaW9uczsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBDWEZBX0ZNUGFyc2U6OlBhcnNlRnVuY3Rpb24oKSB7Ci0gIENGWF9XaWRlU3RyaW5nQyBpZGVudDsKLSAgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmdDPiBhcmd1bWVudHM7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4+IGV4cHJlc3Npb25zOwotICB1aW50MzJfdCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07Ci0gIE5leHRUb2tlbigpOwotICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tpZGVudGlmaWVyKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyhtX3BUb2tlbi0+bV93c3RyaW5nKTsKLSAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwga0ZNRXJyRXhwZWN0ZWRJZGVudGlmaWVyLAotICAgICAgICAgIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgaWRlbnQgPSBtX3BUb2tlbi0+bV93c3RyaW5nOwotICAgIE5leHRUb2tlbigpOwotICB9Ci0gIENoZWNrKFRPS2xwYXJlbik7Ci0gIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS3JwYXJlbikgewotICAgIE5leHRUb2tlbigpOwotICB9IGVsc2UgewotICAgIHdoaWxlICgxKSB7Ci0gICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tpZGVudGlmaWVyKSB7Ci0gICAgICAgIGFyZ3VtZW50cy5wdXNoX2JhY2sobV9wVG9rZW4tPm1fd3N0cmluZyk7Ci0gICAgICAgIE5leHRUb2tlbigpOwotICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tjb21tYSkgewotICAgICAgICAgIE5leHRUb2tlbigpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LcnBhcmVuKSB7Ci0gICAgICAgICAgTmV4dFRva2VuKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgQ2hlY2soVE9LcnBhcmVuKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyhtX3BUb2tlbi0+bV93c3RyaW5nKTsKLSAgICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIGtGTUVyckV4cGVjdGVkSWRlbnRpZmllciwKLSAgICAgICAgICAgICAgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsKLSAgICAgICAgTmV4dFRva2VuKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICBDaGVjayhUT0tkbyk7Ci0gIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2VuZGZ1bmMpIHsKLSAgICBOZXh0VG9rZW4oKTsKLSAgfSBlbHNlIHsKLSAgICBleHByZXNzaW9ucyA9IFBhcnNlVG9wRXhwcmVzc2lvbigpOwotICAgIENoZWNrKFRPS2VuZGZ1bmMpOwotICB9Ci0gIGlmICghbV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1GdW5jdGlvbkRlZmluaXRpb24+KAotICAgICAgbGluZSwgZmFsc2UsIGlkZW50LCBzdGQ6Om1vdmUoYXJndW1lbnRzKSwgc3RkOjptb3ZlKGV4cHJlc3Npb25zKSk7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gQ1hGQV9GTVBhcnNlOjpQYXJzZUV4cHJlc3Npb24oKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gZXhwcjsKLSAgdWludDMyX3QgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOwotICBzd2l0Y2ggKG1fcFRva2VuLT5tX3R5cGUpIHsKLSAgICBjYXNlIFRPS3ZhcjoKLSAgICAgIGV4cHIgPSBQYXJzZVZhckV4cHJlc3Npb24oKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVE9LbnVsbDoKLSAgICBjYXNlIFRPS251bWJlcjoKLSAgICBjYXNlIFRPS3N0cmluZzoKLSAgICBjYXNlIFRPS3BsdXM6Ci0gICAgY2FzZSBUT0ttaW51czoKLSAgICBjYXNlIFRPS2tzbm90OgotICAgIGNhc2UgVE9LaWRlbnRpZmllcjoKLSAgICBjYXNlIFRPS2xwYXJlbjoKLSAgICAgIGV4cHIgPSBQYXJzZUV4cEV4cHJlc3Npb24oKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVE9LaWY6Ci0gICAgICBleHByID0gUGFyc2VJZkV4cHJlc3Npb24oKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVE9Ld2hpbGU6Ci0gICAgICBleHByID0gUGFyc2VXaGlsZUV4cHJlc3Npb24oKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVE9LZm9yOgotICAgICAgZXhwciA9IFBhcnNlRm9yRXhwcmVzc2lvbigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUT0tmb3JlYWNoOgotICAgICAgZXhwciA9IFBhcnNlRm9yZWFjaEV4cHJlc3Npb24oKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVE9LZG86Ci0gICAgICBleHByID0gUGFyc2VEb0V4cHJlc3Npb24oKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVE9LYnJlYWs6Ci0gICAgICBleHByID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1CcmVha0V4cHJlc3Npb24+KGxpbmUpOwotICAgICAgTmV4dFRva2VuKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRPS2NvbnRpbnVlOgotICAgICAgZXhwciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNQ29udGludWVFeHByZXNzaW9uPihsaW5lKTsKLSAgICAgIE5leHRUb2tlbigpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcobV9wVG9rZW4tPm1fd3N0cmluZyk7Ci0gICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwga0ZNRXJyVW5leHBlY3RlZEV4cHJlc3Npb24sCi0gICAgICAgICAgICB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOwotICAgICAgTmV4dFRva2VuKCk7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gZXhwcjsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBDWEZBX0ZNUGFyc2U6OlBhcnNlVmFyRXhwcmVzc2lvbigpIHsKLSAgQ0ZYX1dpZGVTdHJpbmdDIGlkZW50OwotICB1aW50MzJfdCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07Ci0gIE5leHRUb2tlbigpOwotICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tpZGVudGlmaWVyKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyhtX3BUb2tlbi0+bV93c3RyaW5nKTsKLSAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwga0ZNRXJyRXhwZWN0ZWRJZGVudGlmaWVyLAotICAgICAgICAgIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgaWRlbnQgPSBtX3BUb2tlbi0+bV93c3RyaW5nOwotICAgIE5leHRUb2tlbigpOwotICB9Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gZXhwcjsKLSAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LYXNzaWduKSB7Ci0gICAgTmV4dFRva2VuKCk7Ci0gICAgZXhwciA9IFBhcnNlRXhwRXhwcmVzc2lvbigpOwotICB9Ci0gIGlmICghbV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1WYXJFeHByZXNzaW9uPihsaW5lLCBpZGVudCwgc3RkOjptb3ZlKGV4cHIpKTsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBDWEZBX0ZNUGFyc2U6OlBhcnNlU2ltcGxlRXhwcmVzc2lvbigpIHsKLSAgdWludDMyX3QgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAxID0gUGFyc2VMb2dpY2FsT3JFeHByZXNzaW9uKCk7Ci0gIHdoaWxlIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2Fzc2lnbikgewotICAgIE5leHRUb2tlbigpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cDIgPSBQYXJzZUxvZ2ljYWxPckV4cHJlc3Npb24oKTsKLSAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgewotICAgICAgcEV4cDEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUFzc2lnbkV4cHJlc3Npb24+KAotICAgICAgICAgIGxpbmUsIFRPS2Fzc2lnbiwgc3RkOjptb3ZlKHBFeHAxKSwgc3RkOjptb3ZlKHBFeHAyKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBFeHAxLnJlc2V0KCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBwRXhwMTsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBDWEZBX0ZNUGFyc2U6OlBhcnNlRXhwRXhwcmVzc2lvbigpIHsKLSAgdWludDMyX3QgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAxID0gUGFyc2VTaW1wbGVFeHByZXNzaW9uKCk7Ci0gIGlmICghbV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICByZXR1cm4gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1FeHBFeHByZXNzaW9uPihsaW5lLCBzdGQ6Om1vdmUocEV4cDEpKTsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPgotQ1hGQV9GTVBhcnNlOjpQYXJzZUxvZ2ljYWxPckV4cHJlc3Npb24oKSB7Ci0gIHVpbnQzMl90IGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBlMSA9IFBhcnNlTG9naWNhbEFuZEV4cHJlc3Npb24oKTsKLSAgZm9yICg7OykgewotICAgIHN3aXRjaCAobV9wVG9rZW4tPm1fdHlwZSkgewotICAgICAgY2FzZSBUT0tvcjoKLSAgICAgIGNhc2UgVE9La3NvcjogewotICAgICAgICBOZXh0VG9rZW4oKTsKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBlMigKLSAgICAgICAgICAgIFBhcnNlTG9naWNhbEFuZEV4cHJlc3Npb24oKSk7Ci0gICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgZTEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUxvZ2ljYWxPckV4cHJlc3Npb24+KAotICAgICAgICAgICAgICBsaW5lLCBUT0tvciwgc3RkOjptb3ZlKGUxKSwgc3RkOjptb3ZlKGUyKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZTEucmVzZXQoKTsKLSAgICAgICAgfQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotICByZXR1cm4gZTE7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4KLUNYRkFfRk1QYXJzZTo6UGFyc2VMb2dpY2FsQW5kRXhwcmVzc2lvbigpIHsKLSAgdWludDMyX3QgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IGUxID0gUGFyc2VFcXVhbGl0eUV4cHJlc3Npb24oKTsKLSAgZm9yICg7OykgewotICAgIHN3aXRjaCAobV9wVG9rZW4tPm1fdHlwZSkgewotICAgICAgY2FzZSBUT0thbmQ6Ci0gICAgICBjYXNlIFRPS2tzYW5kOiB7Ci0gICAgICAgIE5leHRUb2tlbigpOwotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IGUyID0gUGFyc2VFcXVhbGl0eUV4cHJlc3Npb24oKTsKLSAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICBlMSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNTG9naWNhbEFuZEV4cHJlc3Npb24+KAotICAgICAgICAgICAgICBsaW5lLCBUT0thbmQsIHN0ZDo6bW92ZShlMSksIHN0ZDo6bW92ZShlMikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGUxLnJlc2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIGUxOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+Ci1DWEZBX0ZNUGFyc2U6OlBhcnNlRXF1YWxpdHlFeHByZXNzaW9uKCkgewotICB1aW50MzJfdCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gZTEgPSBQYXJzZVJlbGF0aW9uYWxFeHByZXNzaW9uKCk7Ci0gIGZvciAoOzspIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IGUyOwotICAgIHN3aXRjaCAobV9wVG9rZW4tPm1fdHlwZSkgewotICAgICAgY2FzZSBUT0tlcToKLSAgICAgIGNhc2UgVE9La3NlcToKLSAgICAgICAgTmV4dFRva2VuKCk7Ci0gICAgICAgIGUyID0gUGFyc2VSZWxhdGlvbmFsRXhwcmVzc2lvbigpOwotICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgewotICAgICAgICAgIGUxID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1FcXVhbGl0eUV4cHJlc3Npb24+KAotICAgICAgICAgICAgICBsaW5lLCBUT0tlcSwgc3RkOjptb3ZlKGUxKSwgc3RkOjptb3ZlKGUyKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZTEucmVzZXQoKTsKLSAgICAgICAgfQotICAgICAgICBjb250aW51ZTsKLSAgICAgIGNhc2UgVE9LbmU6Ci0gICAgICBjYXNlIFRPS2tzbmU6Ci0gICAgICAgIE5leHRUb2tlbigpOwotICAgICAgICBlMiA9IFBhcnNlUmVsYXRpb25hbEV4cHJlc3Npb24oKTsKLSAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICBlMSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNRXF1YWxpdHlFeHByZXNzaW9uPigKLSAgICAgICAgICAgICAgbGluZSwgVE9LbmUsIHN0ZDo6bW92ZShlMSksIHN0ZDo6bW92ZShlMikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGUxLnJlc2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIGUxOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+Ci1DWEZBX0ZNUGFyc2U6OlBhcnNlUmVsYXRpb25hbEV4cHJlc3Npb24oKSB7Ci0gIHVpbnQzMl90IGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBlMSA9IFBhcnNlQWRkdGl2ZUV4cHJlc3Npb24oKTsKLSAgZm9yICg7OykgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gZTI7Ci0gICAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7Ci0gICAgICBjYXNlIFRPS2x0OgotICAgICAgY2FzZSBUT0trc2x0OgotICAgICAgICBOZXh0VG9rZW4oKTsKLSAgICAgICAgZTIgPSBQYXJzZUFkZHRpdmVFeHByZXNzaW9uKCk7Ci0gICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgZTEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uPigKLSAgICAgICAgICAgICAgbGluZSwgVE9LbHQsIHN0ZDo6bW92ZShlMSksIHN0ZDo6bW92ZShlMikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGUxLnJlc2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7Ci0gICAgICBjYXNlIFRPS2d0OgotICAgICAgY2FzZSBUT0trc2d0OgotICAgICAgICBOZXh0VG9rZW4oKTsKLSAgICAgICAgZTIgPSBQYXJzZUFkZHRpdmVFeHByZXNzaW9uKCk7Ci0gICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgZTEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uPigKLSAgICAgICAgICAgICAgbGluZSwgVE9LZ3QsIHN0ZDo6bW92ZShlMSksIHN0ZDo6bW92ZShlMikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGUxLnJlc2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7Ci0gICAgICBjYXNlIFRPS2xlOgotICAgICAgY2FzZSBUT0trc2xlOgotICAgICAgICBOZXh0VG9rZW4oKTsKLSAgICAgICAgZTIgPSBQYXJzZUFkZHRpdmVFeHByZXNzaW9uKCk7Ci0gICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgZTEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uPigKLSAgICAgICAgICAgICAgbGluZSwgVE9LbGUsIHN0ZDo6bW92ZShlMSksIHN0ZDo6bW92ZShlMikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGUxLnJlc2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7Ci0gICAgICBjYXNlIFRPS2dlOgotICAgICAgY2FzZSBUT0trc2dlOgotICAgICAgICBOZXh0VG9rZW4oKTsKLSAgICAgICAgZTIgPSBQYXJzZUFkZHRpdmVFeHByZXNzaW9uKCk7Ci0gICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgZTEgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uPigKLSAgICAgICAgICAgICAgbGluZSwgVE9LZ2UsIHN0ZDo6bW92ZShlMSksIHN0ZDo6bW92ZShlMikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGUxLnJlc2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIGUxOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+Ci1DWEZBX0ZNUGFyc2U6OlBhcnNlQWRkdGl2ZUV4cHJlc3Npb24oKSB7Ci0gIHVpbnQzMl90IGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBlMSA9IFBhcnNlTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCk7Ci0gIGZvciAoOzspIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IGUyOwotICAgIHN3aXRjaCAobV9wVG9rZW4tPm1fdHlwZSkgewotICAgICAgY2FzZSBUT0twbHVzOgotICAgICAgICBOZXh0VG9rZW4oKTsKLSAgICAgICAgZTIgPSBQYXJzZU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOwotICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgewotICAgICAgICAgIGUxID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1BZGRpdGl2ZUV4cHJlc3Npb24+KAotICAgICAgICAgICAgICBsaW5lLCBUT0twbHVzLCBzdGQ6Om1vdmUoZTEpLCBzdGQ6Om1vdmUoZTIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBlMS5yZXNldCgpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgY2FzZSBUT0ttaW51czoKLSAgICAgICAgTmV4dFRva2VuKCk7Ci0gICAgICAgIGUyID0gUGFyc2VNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKTsKLSAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICBlMSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNQWRkaXRpdmVFeHByZXNzaW9uPigKLSAgICAgICAgICAgICAgbGluZSwgVE9LbWludXMsIHN0ZDo6bW92ZShlMSksIHN0ZDo6bW92ZShlMikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGUxLnJlc2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIGUxOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+Ci1DWEZBX0ZNUGFyc2U6OlBhcnNlTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkgewotICB1aW50MzJfdCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gZTEgPSBQYXJzZVVuYXJ5RXhwcmVzc2lvbigpOwotICBmb3IgKDs7KSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBlMjsKLSAgICBzd2l0Y2ggKG1fcFRva2VuLT5tX3R5cGUpIHsKLSAgICAgIGNhc2UgVE9LbXVsOgotICAgICAgICBOZXh0VG9rZW4oKTsKLSAgICAgICAgZTIgPSBQYXJzZVVuYXJ5RXhwcmVzc2lvbigpOwotICAgICAgICBpZiAobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkgewotICAgICAgICAgIGUxID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24+KAotICAgICAgICAgICAgICBsaW5lLCBUT0ttdWwsIHN0ZDo6bW92ZShlMSksIHN0ZDo6bW92ZShlMikpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGUxLnJlc2V0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7Ci0gICAgICBjYXNlIFRPS2RpdjoKLSAgICAgICAgTmV4dFRva2VuKCk7Ci0gICAgICAgIGUyID0gUGFyc2VVbmFyeUV4cHJlc3Npb24oKTsKLSAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICBlMSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uPigKLSAgICAgICAgICAgICAgbGluZSwgVE9LZGl2LCBzdGQ6Om1vdmUoZTEpLCBzdGQ6Om1vdmUoZTIpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBlMS5yZXNldCgpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBlMTsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBDWEZBX0ZNUGFyc2U6OlBhcnNlVW5hcnlFeHByZXNzaW9uKCkgewotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IGV4cHI7Ci0gIHVpbnQzMl90IGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsKLSAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7Ci0gICAgY2FzZSBUT0twbHVzOgotICAgICAgTmV4dFRva2VuKCk7Ci0gICAgICBleHByID0gUGFyc2VVbmFyeUV4cHJlc3Npb24oKTsKLSAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKQotICAgICAgICBleHByID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1Qb3NFeHByZXNzaW9uPihsaW5lLCBzdGQ6Om1vdmUoZXhwcikpOwotICAgICAgZWxzZQotICAgICAgICBleHByLnJlc2V0KCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRPS21pbnVzOgotICAgICAgTmV4dFRva2VuKCk7Ci0gICAgICBleHByID0gUGFyc2VVbmFyeUV4cHJlc3Npb24oKTsKLSAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKQotICAgICAgICBleHByID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1OZWdFeHByZXNzaW9uPihsaW5lLCBzdGQ6Om1vdmUoZXhwcikpOwotICAgICAgZWxzZQotICAgICAgICBleHByLnJlc2V0KCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRPS2tzbm90OgotICAgICAgTmV4dFRva2VuKCk7Ci0gICAgICBleHByID0gUGFyc2VVbmFyeUV4cHJlc3Npb24oKTsKLSAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKQotICAgICAgICBleHByID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1Ob3RFeHByZXNzaW9uPihsaW5lLCBzdGQ6Om1vdmUoZXhwcikpOwotICAgICAgZWxzZQotICAgICAgICBleHByLnJlc2V0KCk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgZXhwciA9IFBhcnNlUHJpbWFyeUV4cHJlc3Npb24oKTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBleHByOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+Ci1DWEZBX0ZNUGFyc2U6OlBhcnNlUHJpbWFyeUV4cHJlc3Npb24oKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gZXhwcjsKLSAgdWludDMyX3QgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOwotICBzd2l0Y2ggKG1fcFRva2VuLT5tX3R5cGUpIHsKLSAgICBjYXNlIFRPS251bWJlcjoKLSAgICAgIGV4cHIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTU51bWJlckV4cHJlc3Npb24+KGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BUb2tlbi0+bV93c3RyaW5nKTsKLSAgICAgIE5leHRUb2tlbigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUT0tzdHJpbmc6Ci0gICAgICBleHByID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1TdHJpbmdFeHByZXNzaW9uPihsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wVG9rZW4tPm1fd3N0cmluZyk7Ci0gICAgICBOZXh0VG9rZW4oKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVE9LaWRlbnRpZmllcjogewotICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSWRlbnRpZmllcihtX3BUb2tlbi0+bV93c3RyaW5nKTsKLSAgICAgIE5leHRUb2tlbigpOwotICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LbGJyYWNrZXQpIHsKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBzID0gUGFyc2VJbmRleEV4cHJlc3Npb24oKTsKLSAgICAgICAgaWYgKHMpIHsKLSAgICAgICAgICBleHByID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24+KAotICAgICAgICAgICAgICBsaW5lLCBudWxscHRyLCBUT0tkb3QsIHdzSWRlbnRpZmllciwgc3RkOjptb3ZlKHMpKTsKLSAgICAgICAgfQotICAgICAgICBOZXh0VG9rZW4oKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGV4cHIgPQotICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1JZGVudGlmaWVyRXhwcmVzc2lvbj4obGluZSwgd3NJZGVudGlmaWVyKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotICAgIGNhc2UgVE9LaWY6Ci0gICAgICBleHByID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1JZGVudGlmaWVyRXhwcmVzc2lvbj4oCi0gICAgICAgICAgbGluZSwgbV9wVG9rZW4tPm1fd3N0cmluZyk7Ci0gICAgICBOZXh0VG9rZW4oKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVE9LbnVsbDoKLSAgICAgIGV4cHIgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTU51bGxFeHByZXNzaW9uPihsaW5lKTsKLSAgICAgIE5leHRUb2tlbigpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUT0tscGFyZW46Ci0gICAgICBleHByID0gUGFyc2VQYXJlbkV4cHJlc3Npb24oKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nKG1fcFRva2VuLT5tX3dzdHJpbmcpOwotICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIGtGTUVyclVuZXhwZWN0ZWRFeHByZXNzaW9uLAotICAgICAgICAgICAgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsKLSAgICAgIE5leHRUb2tlbigpOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgZXhwciA9IFBhcnNlUG9zdEV4cHJlc3Npb24oc3RkOjptb3ZlKGV4cHIpKTsKLSAgaWYgKCFtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKQotICAgIGV4cHIucmVzZXQoKTsKLSAgcmV0dXJuIGV4cHI7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gQ1hGQV9GTVBhcnNlOjpQYXJzZVBvc3RFeHByZXNzaW9uKAotICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gZXhwcikgewotICB1aW50MzJfdCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07Ci0gIHdoaWxlICgxKSB7Ci0gICAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7Ci0gICAgICBjYXNlIFRPS2xwYXJlbjogewotICAgICAgICBOZXh0VG9rZW4oKTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPj4gZXhwcmVzc2lvbnM7Ci0gICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS3JwYXJlbikgewotICAgICAgICAgIHdoaWxlIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS3JwYXJlbikgewotICAgICAgICAgICAgaWYgKHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gZXhwciA9Ci0gICAgICAgICAgICAgICAgICAgIFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpKQotICAgICAgICAgICAgICBleHByZXNzaW9ucy5wdXNoX2JhY2soc3RkOjptb3ZlKGV4cHIpKTsKLSAgICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2NvbW1hKSB7Ci0gICAgICAgICAgICAgIE5leHRUb2tlbigpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2VvZiB8fAotICAgICAgICAgICAgICAgICAgICAgICBtX3BUb2tlbi0+bV90eXBlID09IFRPS3Jlc2VydmVyKSB7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tycGFyZW4pIHsKLSAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcobV9wVG9rZW4tPm1fd3N0cmluZyk7Ci0gICAgICAgICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwga0ZNRXJyRXhwZWN0ZWRUb2tlbiwKLSAgICAgICAgICAgICAgICAgIFhGQV9GTV9LZXl3b3JkVG9TdHJpbmcoVE9LcnBhcmVuKSwgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICBleHByID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1DYWxsRXhwcmVzc2lvbj4oCi0gICAgICAgICAgICAgIGxpbmUsIHN0ZDo6bW92ZShleHByKSwgc3RkOjptb3ZlKGV4cHJlc3Npb25zKSwgZmFsc2UpOwotICAgICAgICAgIE5leHRUb2tlbigpOwotICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS2xicmFja2V0KQotICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHMgPSBQYXJzZUluZGV4RXhwcmVzc2lvbigpOwotICAgICAgICAgIGlmIChzKSB7Ci0gICAgICAgICAgICBleHByID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24+KAotICAgICAgICAgICAgICAgIGxpbmUsIHN0ZDo6bW92ZShleHByKSwgVE9LY2FsbCwgTCIiLCBzdGQ6Om1vdmUocykpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBleHByLnJlc2V0KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGV4cHIucmVzZXQoKTsKLSAgICAgICAgfQotICAgICAgfSBicmVhazsKLSAgICAgIGNhc2UgVE9LZG90OgotICAgICAgICBOZXh0VG9rZW4oKTsKLSAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LaWRlbnRpZmllcikgewotICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB0ZW1wU3RyID0gbV9wVG9rZW4tPm1fd3N0cmluZzsKLSAgICAgICAgICB1aW50MzJfdCB0ZW1wTGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOwotICAgICAgICAgIE5leHRUb2tlbigpOwotICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2xwYXJlbikgewotICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwQ2FsbDsKLSAgICAgICAgICAgIE5leHRUb2tlbigpOwotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPj4gZXhwcmVzc2lvbnM7Ci0gICAgICAgICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tycGFyZW4pIHsKLSAgICAgICAgICAgICAgd2hpbGUgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LcnBhcmVuKSB7Ci0gICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBleHAgPQotICAgICAgICAgICAgICAgICAgICBQYXJzZVNpbXBsZUV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgICAgICBleHByZXNzaW9ucy5wdXNoX2JhY2soc3RkOjptb3ZlKGV4cCkpOwotICAgICAgICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2NvbW1hKSB7Ci0gICAgICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZW9mIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BUb2tlbi0+bV90eXBlID09IFRPS3Jlc2VydmVyKSB7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LcnBhcmVuKSB7Ci0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyhtX3BUb2tlbi0+bV93c3RyaW5nKTsKLSAgICAgICAgICAgICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwga0ZNRXJyRXhwZWN0ZWRUb2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1fS2V5d29yZFRvU3RyaW5nKFRPS3JwYXJlbiksIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcElkZW50aWZpZXIgPQotICAgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1JZGVudGlmaWVyRXhwcmVzc2lvbj4odGVtcExpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wU3RyKTsKLSAgICAgICAgICAgICAgcEV4cENhbGwgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUNhbGxFeHByZXNzaW9uPigKLSAgICAgICAgICAgICAgICAgIGxpbmUsIHN0ZDo6bW92ZShwSWRlbnRpZmllciksIHN0ZDo6bW92ZShleHByZXNzaW9ucyksIHRydWUpOwotICAgICAgICAgICAgICBleHByID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1NZXRob2RDYWxsRXhwcmVzc2lvbj4oCi0gICAgICAgICAgICAgICAgICBsaW5lLCBzdGQ6Om1vdmUoZXhwciksIHN0ZDo6bW92ZShwRXhwQ2FsbCkpOwotICAgICAgICAgICAgICBOZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LbGJyYWNrZXQpCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBzID0KLSAgICAgICAgICAgICAgICAgIFBhcnNlSW5kZXhFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgICAgIGlmIChzKSB7Ci0gICAgICAgICAgICAgICAgZXhwciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uPigKLSAgICAgICAgICAgICAgICAgICAgbGluZSwgc3RkOjptb3ZlKGV4cHIpLCBUT0tjYWxsLCBMIiIsIHN0ZDo6bW92ZShzKSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXhwci5yZXNldCgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBleHByLnJlc2V0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2xicmFja2V0KSB7Ci0gICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHMgPSBQYXJzZUluZGV4RXhwcmVzc2lvbigpOwotICAgICAgICAgICAgaWYgKCEobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkpCi0gICAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgICAgICAgICBleHByID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24+KAotICAgICAgICAgICAgICAgIHRlbXBMaW5lLCBzdGQ6Om1vdmUoZXhwciksIFRPS2RvdCwgdGVtcFN0ciwgc3RkOjptb3ZlKHMpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBzID0KLSAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUluZGV4RXhwcmVzc2lvbj4oCi0gICAgICAgICAgICAgICAgICAgIHRlbXBMaW5lLCBBQ0NFU1NPUl9OT19JTkRFWCwgbnVsbHB0ciwgZmFsc2UpOwotICAgICAgICAgICAgZXhwciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uPigKLSAgICAgICAgICAgICAgICBsaW5lLCBzdGQ6Om1vdmUoZXhwciksIFRPS2RvdCwgdGVtcFN0ciwgc3RkOjptb3ZlKHMpKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nKG1fcFRva2VuLT5tX3dzdHJpbmcpOwotICAgICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBrRk1FcnJFeHBlY3RlZElkZW50aWZpZXIsCi0gICAgICAgICAgICAgICAgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsKLSAgICAgICAgICByZXR1cm4gZXhwcjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVE9LZG90ZG90OgotICAgICAgICBOZXh0VG9rZW4oKTsKLSAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LaWRlbnRpZmllcikgewotICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB0ZW1wU3RyID0gbV9wVG9rZW4tPm1fd3N0cmluZzsKLSAgICAgICAgICB1aW50MzJfdCB0ZW1wTGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOwotICAgICAgICAgIE5leHRUb2tlbigpOwotICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2xicmFja2V0KSB7Ci0gICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHMgPSBQYXJzZUluZGV4RXhwcmVzc2lvbigpOwotICAgICAgICAgICAgaWYgKCEobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBleHByID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1Eb3REb3RBY2Nlc3NvckV4cHJlc3Npb24+KAotICAgICAgICAgICAgICAgIHRlbXBMaW5lLCBzdGQ6Om1vdmUoZXhwciksIFRPS2RvdGRvdCwgdGVtcFN0ciwgc3RkOjptb3ZlKHMpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBzID0KLSAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUluZGV4RXhwcmVzc2lvbj4oCi0gICAgICAgICAgICAgICAgICAgIHRlbXBMaW5lLCBBQ0NFU1NPUl9OT19JTkRFWCwgbnVsbHB0ciwgZmFsc2UpOwotICAgICAgICAgICAgZXhwciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNRG90RG90QWNjZXNzb3JFeHByZXNzaW9uPigKLSAgICAgICAgICAgICAgICBsaW5lLCBzdGQ6Om1vdmUoZXhwciksIFRPS2RvdGRvdCwgdGVtcFN0ciwgc3RkOjptb3ZlKHMpKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nKG1fcFRva2VuLT5tX3dzdHJpbmcpOwotICAgICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBrRk1FcnJFeHBlY3RlZElkZW50aWZpZXIsCi0gICAgICAgICAgICAgICAgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsKLSAgICAgICAgICByZXR1cm4gZXhwcjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVE9LZG90c2NyZWFtOgotICAgICAgICBOZXh0VG9rZW4oKTsKLSAgICAgICAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LaWRlbnRpZmllcikgewotICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB0ZW1wU3RyID0gbV9wVG9rZW4tPm1fd3N0cmluZzsKLSAgICAgICAgICB1aW50MzJfdCB0ZW1wTGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOwotICAgICAgICAgIE5leHRUb2tlbigpOwotICAgICAgICAgIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS2xicmFja2V0KSB7Ci0gICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHMgPSBQYXJzZUluZGV4RXhwcmVzc2lvbigpOwotICAgICAgICAgICAgaWYgKCEobV9wRXJyb3JJbmZvLT5tZXNzYWdlLklzRW1wdHkoKSkpCi0gICAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgICAgICAgICBleHByID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24+KAotICAgICAgICAgICAgICAgIHRlbXBMaW5lLCBzdGQ6Om1vdmUoZXhwciksIFRPS2RvdHNjcmVhbSwgdGVtcFN0ciwgc3RkOjptb3ZlKHMpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBzID0KLSAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUluZGV4RXhwcmVzc2lvbj4oCi0gICAgICAgICAgICAgICAgICAgIHRlbXBMaW5lLCBBQ0NFU1NPUl9OT19JTkRFWCwgbnVsbHB0ciwgZmFsc2UpOwotICAgICAgICAgICAgZXhwciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uPigKLSAgICAgICAgICAgICAgICBsaW5lLCBzdGQ6Om1vdmUoZXhwciksIFRPS2RvdHNjcmVhbSwgdGVtcFN0ciwgc3RkOjptb3ZlKHMpKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nKG1fcFRva2VuLT5tX3dzdHJpbmcpOwotICAgICAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBrRk1FcnJFeHBlY3RlZElkZW50aWZpZXIsCi0gICAgICAgICAgICAgICAgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsKLSAgICAgICAgICByZXR1cm4gZXhwcjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVE9LZG90c3RhcjogewotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHMgPQotICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1JbmRleEV4cHJlc3Npb24+KGxpbmUsIEFDQ0VTU09SX05PX0lOREVYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIGZhbHNlKTsKLSAgICAgICAgZXhwciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uPigKLSAgICAgICAgICAgIGxpbmUsIHN0ZDo6bW92ZShleHByKSwgVE9LZG90c3RhciwgTCIqIiwgc3RkOjptb3ZlKHMpKTsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gZXhwcjsKLSAgICB9Ci0gICAgTmV4dFRva2VuKCk7Ci0gIH0KLSAgcmV0dXJuIGV4cHI7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gQ1hGQV9GTVBhcnNlOjpQYXJzZUluZGV4RXhwcmVzc2lvbigpIHsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwOwotICB1aW50MzJfdCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07Ci0gIE5leHRUb2tlbigpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHM7Ci0gIFhGQV9GTV9BY2Nlc3NvckluZGV4IGFjY2Vzc29ySW5kZXggPSBBQ0NFU1NPUl9OT19SRUxBVElWRUlOREVYOwotICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0ttdWwpIHsKLSAgICBwRXhwID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1JbmRleEV4cHJlc3Npb24+KGxpbmUsIGFjY2Vzc29ySW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocyksIHRydWUpOwotICAgIE5leHRUb2tlbigpOwotICAgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS3JicmFja2V0KSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nKG1fcFRva2VuLT5tX3dzdHJpbmcpOwotICAgICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIGtGTUVyckV4cGVjdGVkVG9rZW4sCi0gICAgICAgICAgICBYRkFfRk1fS2V5d29yZFRvU3RyaW5nKFRPS3JwYXJlbiksIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7Ci0gICAgICBwRXhwLnJlc2V0KCk7Ci0gICAgfQotICAgIHJldHVybiBwRXhwOwotICB9Ci0gIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS3BsdXMpIHsKLSAgICBhY2Nlc3NvckluZGV4ID0gQUNDRVNTT1JfUE9TSVRJVkVfSU5ERVg7Ci0gICAgTmV4dFRva2VuKCk7Ci0gIH0gZWxzZSBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0ttaW51cykgewotICAgIGFjY2Vzc29ySW5kZXggPSBBQ0NFU1NPUl9ORUdBVElWRV9JTkRFWDsKLSAgICBOZXh0VG9rZW4oKTsKLSAgfQotICBzID0gUGFyc2VTaW1wbGVFeHByZXNzaW9uKCk7Ci0gIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS3JicmFja2V0KSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyhtX3BUb2tlbi0+bV93c3RyaW5nKTsKLSAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwga0ZNRXJyRXhwZWN0ZWRUb2tlbiwKLSAgICAgICAgICBYRkFfRk1fS2V5d29yZFRvU3RyaW5nKFRPS3JwYXJlbiksIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcEV4cCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNSW5kZXhFeHByZXNzaW9uPihsaW5lLCBhY2Nlc3NvckluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHMpLCBmYWxzZSk7Ci0gIH0KLSAgcmV0dXJuIHBFeHA7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gQ1hGQV9GTVBhcnNlOjpQYXJzZVBhcmVuRXhwcmVzc2lvbigpIHsKLSAgQ2hlY2soVE9LbHBhcmVuKTsKLQotICBpZiAobV9wVG9rZW4tPm1fdHlwZSA9PSBUT0tycGFyZW4pIHsKLSAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwga0ZNRXJyRXhwZWN0ZWROb25FbXB0eUV4cHJlc3Npb24pOwotICAgIE5leHRUb2tlbigpOwotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0KLSAgdWludDMyX3QgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAxID0gUGFyc2VMb2dpY2FsT3JFeHByZXNzaW9uKCk7Ci0KLSAgd2hpbGUgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LYXNzaWduKSB7Ci0gICAgTmV4dFRva2VuKCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMiA9IFBhcnNlTG9naWNhbE9yRXhwcmVzc2lvbigpOwotICAgIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7Ci0gICAgICBwRXhwMSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNQXNzaWduRXhwcmVzc2lvbj4oCi0gICAgICAgICAgbGluZSwgVE9LYXNzaWduLCBzdGQ6Om1vdmUocEV4cDEpLCBzdGQ6Om1vdmUocEV4cDIpKTsKLSAgICB9IGVsc2UgewotICAgICAgcEV4cDEucmVzZXQoKTsKLSAgICB9Ci0gIH0KLSAgQ2hlY2soVE9LcnBhcmVuKTsKLSAgcmV0dXJuIHBFeHAxOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IENYRkFfRk1QYXJzZTo6UGFyc2VCbG9ja0V4cHJlc3Npb24oKSB7Ci0gIHVpbnQzMl90IGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBleHByOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+PiBleHByZXNzaW9uczsKLQotICB3aGlsZSAoMSkgewotICAgIHN3aXRjaCAobV9wVG9rZW4tPm1fdHlwZSkgewotICAgICAgY2FzZSBUT0tlb2Y6Ci0gICAgICBjYXNlIFRPS2VuZGlmOgotICAgICAgY2FzZSBUT0tlbHNlaWY6Ci0gICAgICBjYXNlIFRPS2Vsc2U6Ci0gICAgICBjYXNlIFRPS2VuZHdoaWxlOgotICAgICAgY2FzZSBUT0tlbmRmb3I6Ci0gICAgICBjYXNlIFRPS2VuZDoKLSAgICAgIGNhc2UgVE9LZW5kZnVuYzoKLSAgICAgIGNhc2UgVE9LcmVzZXJ2ZXI6Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUT0tmdW5jOgotICAgICAgICBleHByID0gUGFyc2VGdW5jdGlvbigpOwotICAgICAgICBpZiAoZXhwcikgewotICAgICAgICAgIGV4cHJlc3Npb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoZXhwcikpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZXhwciA9IFBhcnNlRXhwcmVzc2lvbigpOwotICAgICAgICBpZiAoZXhwcikgewotICAgICAgICAgIGV4cHJlc3Npb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoZXhwcikpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBicmVhazsKLSAgfQotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUJsb2NrRXhwcmVzc2lvbj4gcEV4cDsKLSAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsKLSAgICBwRXhwID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1CbG9ja0V4cHJlc3Npb24+KGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoZXhwcmVzc2lvbnMpKTsKLSAgfQotICByZXR1cm4gcEV4cDsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBDWEZBX0ZNUGFyc2U6OlBhcnNlSWZFeHByZXNzaW9uKCkgewotICB1aW50MzJfdCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07Ci0gIGNvbnN0IEZYX1dDSEFSKiBwU3RhcnRQb3MgPSBtX2xleGVyLT5TYXZlUG9zKCk7Ci0gIE5leHRUb2tlbigpOwotICBDaGVjayhUT0tscGFyZW4pOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHByZXNzaW9uOwotICB3aGlsZSAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tycGFyZW4pIHsKLSAgICBwRXhwcmVzc2lvbiA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOwotICAgIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS2NvbW1hKQotICAgICAgYnJlYWs7Ci0gICAgTmV4dFRva2VuKCk7Ci0gIH0KLSAgQ2hlY2soVE9LcnBhcmVuKTsKLSAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LdGhlbikgewotICAgIG1fbGV4ZXItPlNldEN1cnJlbnRMaW5lKGxpbmUpOwotICAgIG1fcFRva2VuID0gbmV3IENYRkFfRk1Ub2tlbihsaW5lKTsKLSAgICBtX3BUb2tlbi0+bV90eXBlID0gVE9LaWRlbnRpZmllcjsKLSAgICBtX3BUb2tlbi0+bV93c3RyaW5nID0gTCJpZiI7Ci0gICAgbV9sZXhlci0+U2V0VG9rZW4obV9wVG9rZW4pOwotICAgIG1fbGV4ZXItPlJlc3RvcmVQb3MocFN0YXJ0UG9zKTsKLSAgICByZXR1cm4gUGFyc2VFeHBFeHByZXNzaW9uKCk7Ci0gIH0KLSAgQ2hlY2soVE9LdGhlbik7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gcElmRXhwcmVzc2lvbiA9IFBhcnNlQmxvY2tFeHByZXNzaW9uKCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gcEVsc2VFeHByZXNzaW9uOwotICBzd2l0Y2ggKG1fcFRva2VuLT5tX3R5cGUpIHsKLSAgICBjYXNlIFRPS2VvZjoKLSAgICBjYXNlIFRPS2VuZGlmOgotICAgICAgQ2hlY2soVE9LZW5kaWYpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUT0tpZjoKLSAgICAgIHBFbHNlRXhwcmVzc2lvbiA9IFBhcnNlSWZFeHByZXNzaW9uKCk7Ci0gICAgICBDaGVjayhUT0tlbmRpZik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRPS2Vsc2VpZjoKLSAgICAgIHBFbHNlRXhwcmVzc2lvbiA9IFBhcnNlSWZFeHByZXNzaW9uKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRPS2Vsc2U6Ci0gICAgICBOZXh0VG9rZW4oKTsKLSAgICAgIHBFbHNlRXhwcmVzc2lvbiA9IFBhcnNlQmxvY2tFeHByZXNzaW9uKCk7Ci0gICAgICBDaGVjayhUT0tlbmRpZik7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyhtX3BUb2tlbi0+bV93c3RyaW5nKTsKLSAgICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBrRk1FcnJFeHBlY3RlZEVuZElmLCB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOwotICAgICAgTmV4dFRva2VuKCk7Ci0gICAgICBicmVhazsKLSAgfQotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUlmRXhwcmVzc2lvbj4gcEV4cDsKLSAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsKLSAgICBwRXhwID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1JZkV4cHJlc3Npb24+KGxpbmUsIHN0ZDo6bW92ZShwRXhwcmVzc2lvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocElmRXhwcmVzc2lvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocEVsc2VFeHByZXNzaW9uKSk7Ci0gIH0KLSAgcmV0dXJuIHBFeHA7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gQ1hGQV9GTVBhcnNlOjpQYXJzZVdoaWxlRXhwcmVzc2lvbigpIHsKLSAgdWludDMyX3QgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOwotICBOZXh0VG9rZW4oKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwQ29uZGl0aW9uID0gUGFyc2VQYXJlbkV4cHJlc3Npb24oKTsKLSAgQ2hlY2soVE9LZG8pOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IHBFeHByZXNzaW9uID0gUGFyc2VCbG9ja0V4cHJlc3Npb24oKTsKLSAgQ2hlY2soVE9LZW5kd2hpbGUpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IGV4cHI7Ci0gIGlmIChtX3BFcnJvckluZm8tPm1lc3NhZ2UuSXNFbXB0eSgpKSB7Ci0gICAgZXhwciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNV2hpbGVFeHByZXNzaW9uPigKLSAgICAgICAgbGluZSwgc3RkOjptb3ZlKHBDb25kaXRpb24pLCBzdGQ6Om1vdmUocEV4cHJlc3Npb24pKTsKLSAgfQotICByZXR1cm4gZXhwcjsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPgotQ1hGQV9GTVBhcnNlOjpQYXJzZVN1YmFzc2lnbm1lbnRJbkZvckV4cHJlc3Npb24oKSB7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gZXhwcjsKLSAgc3dpdGNoIChtX3BUb2tlbi0+bV90eXBlKSB7Ci0gICAgY2FzZSBUT0tpZGVudGlmaWVyOgotICAgICAgZXhwciA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcobV9wVG9rZW4tPm1fd3N0cmluZyk7Ci0gICAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwga0ZNRXJyVW5leHBlY3RlZEV4cHJlc3Npb24sCi0gICAgICAgICAgICB3c19UZW1wU3RyaW5nLmNfc3RyKCkpOwotICAgICAgTmV4dFRva2VuKCk7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gZXhwcjsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBDWEZBX0ZNUGFyc2U6OlBhcnNlRm9yRXhwcmVzc2lvbigpIHsKLSAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFyaWFudDsKLSAgdWludDMyX3QgbGluZSA9IG1fcFRva2VuLT5tX3VMaW5lbnVtOwotICBOZXh0VG9rZW4oKTsKLSAgaWYgKG1fcFRva2VuLT5tX3R5cGUgIT0gVE9LaWRlbnRpZmllcikgewotICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcobV9wVG9rZW4tPm1fd3N0cmluZyk7Ci0gICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIGtGTUVyckV4cGVjdGVkVG9rZW4sCi0gICAgICAgICAgWEZBX0ZNX0tleXdvcmRUb1N0cmluZyhtX3BUb2tlbi0+bV90eXBlKSwgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsKLSAgfQotICB3c1ZhcmlhbnQgPSBtX3BUb2tlbi0+bV93c3RyaW5nOwotICBOZXh0VG9rZW4oKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwQXNzaWdubWVudDsKLSAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LYXNzaWduKSB7Ci0gICAgTmV4dFRva2VuKCk7Ci0gICAgcEFzc2lnbm1lbnQgPSBQYXJzZVNpbXBsZUV4cHJlc3Npb24oKTsKLSAgfSBlbHNlIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nKG1fcFRva2VuLT5tX3dzdHJpbmcpOwotICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBrRk1FcnJFeHBlY3RlZFRva2VuLAotICAgICAgICAgIFhGQV9GTV9LZXl3b3JkVG9TdHJpbmcobV9wVG9rZW4tPm1fdHlwZSksIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7Ci0gIH0KLSAgaW50MzJfdCBpRGlyZWN0aW9uID0gMDsKLSAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LdXB0bykgewotICAgIGlEaXJlY3Rpb24gPSAxOwotICB9IGVsc2UgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LZG93bnRvKSB7Ci0gICAgaURpcmVjdGlvbiA9IC0xOwotICB9IGVsc2UgewotICAgIENGWF9XaWRlU3RyaW5nIHdzX1RlbXBTdHJpbmcobV9wVG9rZW4tPm1fd3N0cmluZyk7Ci0gICAgRXJyb3IobV9wVG9rZW4tPm1fdUxpbmVudW0sIGtGTUVyckV4cGVjdGVkVG9rZW4sIEwidXB0byBvciBkb3dudG8iLAotICAgICAgICAgIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7Ci0gIH0KLSAgTmV4dFRva2VuKCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEFjY2Vzc29yID0gUGFyc2VTaW1wbGVFeHByZXNzaW9uKCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcFN0ZXA7Ci0gIGlmIChtX3BUb2tlbi0+bV90eXBlID09IFRPS3N0ZXApIHsKLSAgICBOZXh0VG9rZW4oKTsKLSAgICBwU3RlcCA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOwotICB9Ci0gIENoZWNrKFRPS2RvKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBwTGlzdCA9IFBhcnNlQmxvY2tFeHByZXNzaW9uKCk7Ci0gIENoZWNrKFRPS2VuZGZvcik7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gZXhwcjsKLSAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsKLSAgICBleHByID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1Gb3JFeHByZXNzaW9uPigKLSAgICAgICAgbGluZSwgd3NWYXJpYW50LCBzdGQ6Om1vdmUocEFzc2lnbm1lbnQpLCBzdGQ6Om1vdmUocEFjY2Vzc29yKSwKLSAgICAgICAgaURpcmVjdGlvbiwgc3RkOjptb3ZlKHBTdGVwKSwgc3RkOjptb3ZlKHBMaXN0KSk7Ci0gIH0KLSAgcmV0dXJuIGV4cHI7Ci19Ci0KLXN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gQ1hGQV9GTVBhcnNlOjpQYXJzZUZvcmVhY2hFeHByZXNzaW9uKCkgewotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IGV4cHI7Ci0gIENGWF9XaWRlU3RyaW5nQyB3c0lkZW50aWZpZXI7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4+IHBBY2Nlc3NvcnM7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gcExpc3Q7Ci0gIHVpbnQzMl90IGxpbmUgPSBtX3BUb2tlbi0+bV91TGluZW51bTsKLSAgTmV4dFRva2VuKCk7Ci0gIGlmIChtX3BUb2tlbi0+bV90eXBlICE9IFRPS2lkZW50aWZpZXIpIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c19UZW1wU3RyaW5nKG1fcFRva2VuLT5tX3dzdHJpbmcpOwotICAgIEVycm9yKG1fcFRva2VuLT5tX3VMaW5lbnVtLCBrRk1FcnJFeHBlY3RlZFRva2VuLAotICAgICAgICAgIFhGQV9GTV9LZXl3b3JkVG9TdHJpbmcobV9wVG9rZW4tPm1fdHlwZSksIHdzX1RlbXBTdHJpbmcuY19zdHIoKSk7Ci0gIH0KLSAgd3NJZGVudGlmaWVyID0gbV9wVG9rZW4tPm1fd3N0cmluZzsKLSAgTmV4dFRva2VuKCk7Ci0gIENoZWNrKFRPS2luKTsKLSAgQ2hlY2soVE9LbHBhcmVuKTsKLSAgaWYgKG1fcFRva2VuLT5tX3R5cGUgPT0gVE9LcnBhcmVuKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NfVGVtcFN0cmluZyhtX3BUb2tlbi0+bV93c3RyaW5nKTsKLSAgICBFcnJvcihtX3BUb2tlbi0+bV91TGluZW51bSwga0ZNRXJyVW5leHBlY3RlZEV4cHJlc3Npb24sCi0gICAgICAgICAgd3NfVGVtcFN0cmluZy5jX3N0cigpKTsKLSAgICBOZXh0VG9rZW4oKTsKLSAgfSBlbHNlIHsKLSAgICB3aGlsZSAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tycGFyZW4pIHsKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcyA9IFBhcnNlU2ltcGxlRXhwcmVzc2lvbigpOwotICAgICAgaWYgKHMpCi0gICAgICAgIHBBY2Nlc3NvcnMucHVzaF9iYWNrKHN0ZDo6bW92ZShzKSk7Ci0gICAgICBpZiAobV9wVG9rZW4tPm1fdHlwZSAhPSBUT0tjb21tYSkKLSAgICAgICAgYnJlYWs7Ci0gICAgICBOZXh0VG9rZW4oKTsKLSAgICB9Ci0gICAgQ2hlY2soVE9LcnBhcmVuKTsKLSAgfQotICBDaGVjayhUT0tkbyk7Ci0gIHBMaXN0ID0gUGFyc2VCbG9ja0V4cHJlc3Npb24oKTsKLSAgQ2hlY2soVE9LZW5kZm9yKTsKLSAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsKLSAgICBleHByID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1Gb3JlYWNoRXhwcmVzc2lvbj4oCi0gICAgICAgIGxpbmUsIHdzSWRlbnRpZmllciwgc3RkOjptb3ZlKHBBY2Nlc3NvcnMpLCBzdGQ6Om1vdmUocExpc3QpKTsKLSAgfQotICByZXR1cm4gZXhwcjsKLX0KLQotc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBDWEZBX0ZNUGFyc2U6OlBhcnNlRG9FeHByZXNzaW9uKCkgewotICB1aW50MzJfdCBsaW5lID0gbV9wVG9rZW4tPm1fdUxpbmVudW07Ci0gIE5leHRUb2tlbigpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IGV4cHIgPSBQYXJzZUJsb2NrRXhwcmVzc2lvbigpOwotICBDaGVjayhUT0tlbmQpOwotICBpZiAoIW1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgcmV0dXJuIHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ZNRG9FeHByZXNzaW9uPihsaW5lLCBzdGQ6Om1vdmUoZXhwcikpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvZm0yanMveGZhX2ZtcGFyc2UuaCBiL3hmYS9meGZhL2ZtMmpzL3hmYV9mbXBhcnNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMjY3MWQuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvZm0yanMveGZhX2ZtcGFyc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhGQV9GTTJKU19YRkFfRk1QQVJTRV9IXwotI2RlZmluZSBYRkFfRlhGQV9GTTJKU19YRkFfRk1QQVJTRV9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInhmYS9meGZhL2ZtMmpzL3hmYV9leHByZXNzaW9uLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvZm0yanMveGZhX2xleGVyLmgiCi0KLWNsYXNzIENYRkFfRk1QYXJzZSB7Ci0gcHVibGljOgotICBDWEZBX0ZNUGFyc2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0Zvcm1jYWxjLCBDWEZBX0ZNRXJyb3JJbmZvKiBwRXJyb3JJbmZvKTsKLSAgfkNYRkFfRk1QYXJzZSgpOwotCi0gIHZvaWQgTmV4dFRva2VuKCk7Ci0gIHZvaWQgQ2hlY2soWEZBX0ZNX1RPS0VOIG9wKTsKLSAgdm9pZCBFcnJvcih1aW50MzJfdCBsaW5lTnVtLCBjb25zdCBGWF9XQ0hBUiogbXNnLCAuLi4pOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+PiBQYXJzZVRvcEV4cHJlc3Npb24oKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBQYXJzZUZ1bmN0aW9uKCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gUGFyc2VFeHByZXNzaW9uKCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gUGFyc2VWYXJFeHByZXNzaW9uKCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gUGFyc2VFeHBFeHByZXNzaW9uKCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gUGFyc2VCbG9ja0V4cHJlc3Npb24oKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPiBQYXJzZUlmRXhwcmVzc2lvbigpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IFBhcnNlV2hpbGVFeHByZXNzaW9uKCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gUGFyc2VGb3JFeHByZXNzaW9uKCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRXhwcmVzc2lvbj4gUGFyc2VGb3JlYWNoRXhwcmVzc2lvbigpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTUV4cHJlc3Npb24+IFBhcnNlRG9FeHByZXNzaW9uKCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gUGFyc2VQYXJlbkV4cHJlc3Npb24oKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBQYXJzZVNpbXBsZUV4cHJlc3Npb24oKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBQYXJzZVN1YmFzc2lnbm1lbnRJbkZvckV4cHJlc3Npb24oKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBQYXJzZUxvZ2ljYWxPckV4cHJlc3Npb24oKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBQYXJzZUxvZ2ljYWxBbmRFeHByZXNzaW9uKCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gUGFyc2VFcXVhbGl0eUV4cHJlc3Npb24oKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBQYXJzZVJlbGF0aW9uYWxFeHByZXNzaW9uKCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gUGFyc2VBZGR0aXZlRXhwcmVzc2lvbigpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IFBhcnNlTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gUGFyc2VVbmFyeUV4cHJlc3Npb24oKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBQYXJzZVByaW1hcnlFeHByZXNzaW9uKCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gUGFyc2VQb3N0RXhwcmVzc2lvbigKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gZSk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gUGFyc2VJbmRleEV4cHJlc3Npb24oKTsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNTGV4ZXI+IG1fbGV4ZXI7Ci0gIENYRkFfRk1Ub2tlbiogbV9wVG9rZW47Ci0gIENYRkFfRk1FcnJvckluZm8qIGNvbnN0IG1fcEVycm9ySW5mbzsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYRkFfRk0ySlNfWEZBX0ZNUEFSU0VfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2ZtMmpzL3hmYV9sZXhlci5jcHAgYi94ZmEvZnhmYS9mbTJqcy94ZmFfbGV4ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTg0NGJjLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2ZtMmpzL3hmYV9sZXhlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NDYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvZm0yanMveGZhX2xleGVyLmgiCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dC5oIgotCi1uYW1lc3BhY2UgewotCi1zdHJ1Y3QgWEZBX0ZNRENoYXIgewotICBzdGF0aWMgY29uc3QgRlhfV0NIQVIqIGluYyhjb25zdCBGWF9XQ0hBUiomIHApIHsKLSAgICArK3A7Ci0gICAgcmV0dXJuIHA7Ci0gIH0KLSAgc3RhdGljIGNvbnN0IEZYX1dDSEFSKiBkZWMoY29uc3QgRlhfV0NIQVIqJiBwKSB7Ci0gICAgLS1wOwotICAgIHJldHVybiBwOwotICB9Ci0gIHN0YXRpYyB1aW50MTZfdCBnZXQoY29uc3QgRlhfV0NIQVIqIHApIHsgcmV0dXJuICpwOyB9Ci0gIHN0YXRpYyBib29sIGlzV2hpdGVTcGFjZShjb25zdCBGWF9XQ0hBUiogcCkgewotICAgIHJldHVybiAoKnApID09IDB4MDkgfHwgKCpwKSA9PSAweDBiIHx8ICgqcCkgPT0gMHgwYyB8fCAoKnApID09IDB4MjA7Ci0gIH0KLSAgc3RhdGljIGJvb2wgaXNMaW5lVGVybWluYXRvcihjb25zdCBGWF9XQ0hBUiogcCkgewotICAgIHJldHVybiAqcCA9PSAweDBBIHx8ICpwID09IDB4MEQ7Ci0gIH0KLSAgc3RhdGljIGJvb2wgaXNCaW5hcnkoY29uc3QgRlhfV0NIQVIqIHApIHsgcmV0dXJuICgqcCkgPj0gJzAnICYmICgqcCkgPD0gJzEnOyB9Ci0gIHN0YXRpYyBib29sIGlzT2N0YWwoY29uc3QgRlhfV0NIQVIqIHApIHsgcmV0dXJuICgqcCkgPj0gJzAnICYmICgqcCkgPD0gJzcnOyB9Ci0gIHN0YXRpYyBib29sIGlzRGlnaXRhbChjb25zdCBGWF9XQ0hBUiogcCkgewotICAgIHJldHVybiAoKnApID49ICcwJyAmJiAoKnApIDw9ICc5JzsKLSAgfQotICBzdGF0aWMgYm9vbCBpc0hleChjb25zdCBGWF9XQ0hBUiogcCkgewotICAgIHJldHVybiBpc0RpZ2l0YWwocCkgfHwgKCgqcCkgPj0gJ2EnICYmICgqcCkgPD0gJ2YnKSB8fAotICAgICAgICAgICAoKCpwKSA+PSAnQScgJiYgKCpwKSA8PSAnRicpOwotICB9Ci0gIHN0YXRpYyBib29sIGlzQWxwaGEoY29uc3QgRlhfV0NIQVIqIHApIHsKLSAgICByZXR1cm4gKCgqcCkgPD0gJ3onICYmICgqcCkgPj0gJ2EnKSB8fCAoKCpwKSA8PSAnWicgJiYgKCpwKSA+PSAnQScpOwotICB9Ci0gIHN0YXRpYyBib29sIGlzQXZhbGlkKGNvbnN0IEZYX1dDSEFSKiBwLCBib29sIGZsYWcgPSAwKTsKLSAgc3RhdGljIGJvb2wgc3RyaW5nMm51bWJlcihjb25zdCBGWF9XQ0hBUiogcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ET1VCTEUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiomIHBFbmQpOwotICBzdGF0aWMgYm9vbCBpc1VuaWNvZGVBbHBoYSh1aW50MTZfdCBjaCk7Ci19OwotCi1pbmxpbmUgYm9vbCBYRkFfRk1EQ2hhcjo6aXNBdmFsaWQoY29uc3QgRlhfV0NIQVIqIHAsIGJvb2wgZmxhZykgewotICBpZiAoKnAgPT0gMCkgewotICAgIHJldHVybiAxOwotICB9Ci0gIGlmICgoKnAgPD0gMHgwQSAmJiAqcCA+PSAweDA5KSB8fCAqcCA9PSAweDBEIHx8Ci0gICAgICAoKnAgPD0gMHhkN2ZmICYmICpwID49IDB4MjApIHx8ICgqcCA8PSAweGZmZmQgJiYgKnAgPj0gMHhlMDAwKSkgewotICAgIHJldHVybiAxOwotICB9Ci0gIGlmICghZmxhZykgewotICAgIGlmICgqcCA9PSAweDBCIHx8ICpwID09IDB4MEMpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotaW5saW5lIGJvb2wgWEZBX0ZNRENoYXI6OnN0cmluZzJudW1iZXIoY29uc3QgRlhfV0NIQVIqIHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9ET1VCTEUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiYgcEVuZCkgewotICBpZiAocykgewotICAgICpwVmFsdWUgPSB3Y3N0b2QoKHdjaGFyX3QqKXMsICh3Y2hhcl90KiopJnBFbmQpOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1pbmxpbmUgYm9vbCBYRkFfRk1EQ2hhcjo6aXNVbmljb2RlQWxwaGEodWludDE2X3QgY2gpIHsKLSAgaWYgKGNoID09IDAgfHwgY2ggPT0gMHgwQSB8fCBjaCA9PSAweDBEIHx8IGNoID09IDB4MDkgfHwgY2ggPT0gMHgwQiB8fAotICAgICAgY2ggPT0gMHgwQyB8fCBjaCA9PSAweDIwIHx8IGNoID09ICcuJyB8fCBjaCA9PSAnOycgfHwgY2ggPT0gJyInIHx8Ci0gICAgICBjaCA9PSAnPScgfHwgY2ggPT0gJzwnIHx8IGNoID09ICc+JyB8fCBjaCA9PSAnLCcgfHwgY2ggPT0gJygnIHx8Ci0gICAgICBjaCA9PSAnKScgfHwgY2ggPT0gJ10nIHx8IGNoID09ICdbJyB8fCBjaCA9PSAnJicgfHwgY2ggPT0gJ3wnIHx8Ci0gICAgICBjaCA9PSAnKycgfHwgY2ggPT0gJy0nIHx8IGNoID09ICcqJyB8fCBjaCA9PSAnLycpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IFhGQV9GTUtleXdvcmQga2V5V29yZHNbXSA9IHsKLSAgICB7VE9LYW5kLCAweDAwMDAwMDI2LCBMIiYifSwKLSAgICB7VE9LbHBhcmVuLCAweDAwMDAwMDI4LCBMIigifSwKLSAgICB7VE9LcnBhcmVuLCAweDAwMDAwMDI5LCBMIikifSwKLSAgICB7VE9LbXVsLCAweDAwMDAwMDJhLCBMIioifSwKLSAgICB7VE9LcGx1cywgMHgwMDAwMDAyYiwgTCIrIn0sCi0gICAge1RPS2NvbW1hLCAweDAwMDAwMDJjLCBMIiwifSwKLSAgICB7VE9LbWludXMsIDB4MDAwMDAwMmQsIEwiLSJ9LAotICAgIHtUT0tkb3QsIDB4MDAwMDAwMmUsIEwiLiJ9LAotICAgIHtUT0tkaXYsIDB4MDAwMDAwMmYsIEwiLyJ9LAotICAgIHtUT0tsdCwgMHgwMDAwMDAzYywgTCI8In0sCi0gICAge1RPS2Fzc2lnbiwgMHgwMDAwMDAzZCwgTCI9In0sCi0gICAge1RPS2d0LCAweDAwMDAwMDNlLCBMIj4ifSwKLSAgICB7VE9LbGJyYWNrZXQsIDB4MDAwMDAwNWIsIEwiWyJ9LAotICAgIHtUT0tyYnJhY2tldCwgMHgwMDAwMDA1ZCwgTCJdIn0sCi0gICAge1RPS29yLCAweDAwMDAwMDdjLCBMInwifSwKLSAgICB7VE9LZG90c2NyZWFtLCAweDAwMDBlYzExLCBMIi4jIn0sCi0gICAge1RPS2RvdHN0YXIsIDB4MDAwMGVjMTgsIEwiLioifSwKLSAgICB7VE9LZG90ZG90LCAweDAwMDBlYzFjLCBMIi4uIn0sCi0gICAge1RPS2xlLCAweDAwMDEzM2Y5LCBMIjw9In0sCi0gICAge1RPS25lLCAweDAwMDEzM2ZhLCBMIjw+In0sCi0gICAge1RPS2VxLCAweDAwMDEzOTFhLCBMIj09In0sCi0gICAge1RPS2dlLCAweDAwMDEzZTNiLCBMIj49In0sCi0gICAge1RPS2RvLCAweDAwMDIwMTUzLCBMImRvIn0sCi0gICAge1RPS2tzZXEsIDB4MDAwMjA2NzYsIEwiZXEifSwKLSAgICB7VE9La3NnZSwgMHgwMDAyMTBhYywgTCJnZSJ9LAotICAgIHtUT0trc2d0LCAweDAwMDIxMGJiLCBMImd0In0sCi0gICAge1RPS2lmLCAweDAwMDIxYWVmLCBMImlmIn0sCi0gICAge1RPS2luLCAweDAwMDIxYWY3LCBMImluIn0sCi0gICAge1RPS2tzbGUsIDB4MDAwMjJhNTEsIEwibGUifSwKLSAgICB7VE9La3NsdCwgMHgwMDAyMmE2MCwgTCJsdCJ9LAotICAgIHtUT0trc25lLCAweDAwMDIzNDkzLCBMIm5lIn0sCi0gICAge1RPS2tzb3IsIDB4MDAwMjM5YzEsIEwib3IifSwKLSAgICB7VE9LbnVsbCwgMHgwNTI5MzFiYiwgTCJudWxsIn0sCi0gICAge1RPS2JyZWFrLCAweDA1NTE4YzI1LCBMImJyZWFrIn0sCi0gICAge1RPS2tzYW5kLCAweDA5ZjlkYjMzLCBMImFuZCJ9LAotICAgIHtUT0tlbmQsIDB4MGE2MzE0MzcsIEwiZW5kIn0sCi0gICAge1RPS2VvZiwgMHgwYTYzMTk1YSwgTCJlb2YifSwKLSAgICB7VE9LZm9yLCAweDBhN2Q2N2E3LCBMImZvciJ9LAotICAgIHtUT0tuYW4sIDB4MGI0ZjkxZGQsIEwibmFuIn0sCi0gICAge1RPS2tzbm90LCAweDBiNGZkOWIxLCBMIm5vdCJ9LAotICAgIHtUT0t2YXIsIDB4MGMyMjAzZTksIEwidmFyIn0sCi0gICAge1RPS3RoZW4sIDB4MmQ1NzM4Y2YsIEwidGhlbiJ9LAotICAgIHtUT0tlbHNlLCAweDQ1ZjY1ZWU5LCBMImVsc2UifSwKLSAgICB7VE9LZXhpdCwgMHg0NzMxZDZiYSwgTCJleGl0In0sCi0gICAge1RPS2Rvd250bywgMHg0Y2FhZGMzYiwgTCJkb3dudG8ifSwKLSAgICB7VE9LcmV0dXJuLCAweDRkYjhiZDYwLCBMInJldHVybiJ9LAotICAgIHtUT0tpbmZpbml0eSwgMHg1YzBhMDEwYSwgTCJpbmZpbml0eSJ9LAotICAgIHtUT0tlbmR3aGlsZSwgMHg1YzY0YmZmMCwgTCJlbmR3aGlsZSJ9LAotICAgIHtUT0tmb3JlYWNoLCAweDY3ZTMxZjM4LCBMImZvcmVhY2gifSwKLSAgICB7VE9LZW5kZnVuYywgMHg2OGY5ODRhMywgTCJlbmRmdW5jIn0sCi0gICAge1RPS2Vsc2VpZiwgMHg3ODI1MzIxOCwgTCJlbHNlaWYifSwKLSAgICB7VE9Ld2hpbGUsIDB4ODQyMjkyNTksIEwid2hpbGUifSwKLSAgICB7VE9LZW5kZm9yLCAweDhhYjQ5ZDdlLCBMImVuZGZvciJ9LAotICAgIHtUT0t0aHJvdywgMHg4ZGIwNWM5NCwgTCJ0aHJvdyJ9LAotICAgIHtUT0tzdGVwLCAweGE3YTc4ODdjLCBMInN0ZXAifSwKLSAgICB7VE9LdXB0bywgMHhiNTE1NTMyOCwgTCJ1cHRvIn0sCi0gICAge1RPS2NvbnRpbnVlLCAweGMwMzQwNjg1LCBMImNvbnRpbnVlIn0sCi0gICAge1RPS2Z1bmMsIDB4Y2RjZTYwZWMsIEwiZnVuYyJ9LAotICAgIHtUT0tlbmRpZiwgMHhlMGU4ZmVlNiwgTCJlbmRpZiJ9LAotfTsKLQotY29uc3QgWEZBX0ZNX1RPS0VOIEtFWVdPUkRfU1RBUlQgPSBUT0tkbzsKLWNvbnN0IFhGQV9GTV9UT0tFTiBLRVlXT1JEX0VORCA9IFRPS2VuZGlmOwotCi19ICAvLyBuYW1lc3BhY2UKLQotY29uc3QgRlhfV0NIQVIqIFhGQV9GTV9LZXl3b3JkVG9TdHJpbmcoWEZBX0ZNX1RPS0VOIG9wKSB7Ci0gIGlmIChvcCA8IEtFWVdPUkRfU1RBUlQgfHwgb3AgPiBLRVlXT1JEX0VORCkKLSAgICByZXR1cm4gTCIiOwotICByZXR1cm4ga2V5V29yZHNbb3BdLm1fa2V5d29yZDsKLX0KLQotQ1hGQV9GTVRva2VuOjpDWEZBX0ZNVG9rZW4oKSA6IG1fdHlwZShUT0tyZXNlcnZlciksIG1fdUxpbmVudW0oMSkge30KLQotQ1hGQV9GTVRva2VuOjpDWEZBX0ZNVG9rZW4odWludDMyX3QgdUxpbmVOdW0pCi0gICAgOiBtX3R5cGUoVE9LcmVzZXJ2ZXIpLCBtX3VMaW5lbnVtKHVMaW5lTnVtKSB7fQotCi1DWEZBX0ZNTGV4ZXI6OkNYRkFfRk1MZXhlcihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9ybUNhbGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZNRXJyb3JJbmZvKiBwRXJyb3JJbmZvKQotICAgIDogbV9wdHIod3NGb3JtQ2FsYy5jX3N0cigpKSwgbV91Q3VycmVudExpbmUoMSksIG1fcEVycm9ySW5mbyhwRXJyb3JJbmZvKSB7fQotCi1DWEZBX0ZNTGV4ZXI6On5DWEZBX0ZNTGV4ZXIoKSB7fQotCi1DWEZBX0ZNVG9rZW4qIENYRkFfRk1MZXhlcjo6TmV4dFRva2VuKCkgewotICBtX3BUb2tlbi5yZXNldChTY2FuKCkpOwotICByZXR1cm4gbV9wVG9rZW4uZ2V0KCk7Ci19Ci0KLUNYRkFfRk1Ub2tlbiogQ1hGQV9GTUxleGVyOjpTY2FuKCkgewotICB1aW50MTZfdCBjaCA9IDA7Ci0gIENYRkFfRk1Ub2tlbiogcCA9IG5ldyBDWEZBX0ZNVG9rZW4obV91Q3VycmVudExpbmUpOwotICBpZiAoIVhGQV9GTURDaGFyOjppc0F2YWxpZChtX3B0cikpIHsKLSAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOwotICAgIEVycm9yKGtGTUVyclVuc3VwcG9ydGVkQ2hhciwgY2gpOwotICAgIHJldHVybiBwOwotICB9Ci0gIGludCBpUmV0ID0gMDsKLSAgd2hpbGUgKDEpIHsKLSAgICBpZiAoIVhGQV9GTURDaGFyOjppc0F2YWxpZChtX3B0cikpIHsKLSAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7Ci0gICAgICBFcnJvcihrRk1FcnJVbnN1cHBvcnRlZENoYXIsIGNoKTsKLSAgICAgIHJldHVybiBwOwotICAgIH0KLSAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOwotICAgIHN3aXRjaCAoY2gpIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgcC0+bV90eXBlID0gVE9LZW9mOwotICAgICAgICByZXR1cm4gcDsKLSAgICAgIGNhc2UgMHgwQToKLSAgICAgICAgKyttX3VDdXJyZW50TGluZTsKLSAgICAgICAgcC0+bV91TGluZW51bSA9IG1fdUN1cnJlbnRMaW5lOwotICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDB4MEQ6Ci0gICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJzsnOiB7Ci0gICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwVGVtcCA9IDA7Ci0gICAgICAgIENvbW1lbnQobV9wdHIsIHBUZW1wKTsKLSAgICAgICAgbV9wdHIgPSBwVGVtcDsKLSAgICAgIH0gYnJlYWs7Ci0gICAgICBjYXNlICciJzogewotICAgICAgICBjb25zdCBGWF9XQ0hBUiogcFRlbXAgPSAwOwotICAgICAgICBwLT5tX3R5cGUgPSBUT0tzdHJpbmc7Ci0gICAgICAgIGlSZXQgPSBTdHJpbmcocCwgbV9wdHIsIHBUZW1wKTsKLSAgICAgICAgbV9wdHIgPSBwVGVtcDsKLSAgICAgIH0KLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgICBjYXNlICcwJzoKLSAgICAgIGNhc2UgJzEnOgotICAgICAgY2FzZSAnMic6Ci0gICAgICBjYXNlICczJzoKLSAgICAgIGNhc2UgJzQnOgotICAgICAgY2FzZSAnNSc6Ci0gICAgICBjYXNlICc2JzoKLSAgICAgIGNhc2UgJzcnOgotICAgICAgY2FzZSAnOCc6Ci0gICAgICBjYXNlICc5JzogewotICAgICAgICBwLT5tX3R5cGUgPSBUT0tudW1iZXI7Ci0gICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwVGVtcCA9IDA7Ci0gICAgICAgIGlSZXQgPSBOdW1iZXIocCwgbV9wdHIsIHBUZW1wKTsKLSAgICAgICAgbV9wdHIgPSBwVGVtcDsKLSAgICAgICAgaWYgKGlSZXQpIHsKLSAgICAgICAgICBFcnJvcihrRk1FcnJCYWRTdWZmaXhOdW1iZXIpOwotICAgICAgICAgIHJldHVybiBwOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgIHJldHVybiBwOwotICAgICAgY2FzZSAnPSc6Ci0gICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOwotICAgICAgICBpZiAoWEZBX0ZNRENoYXI6OmlzQXZhbGlkKG1fcHRyKSkgewotICAgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7Ci0gICAgICAgICAgaWYgKGNoID09ICc9JykgewotICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LZXE7Ci0gICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsKLSAgICAgICAgICAgIHJldHVybiBwOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0thc3NpZ247Ci0gICAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KG1fcHRyKTsKLSAgICAgICAgICBFcnJvcihrRk1FcnJVbnN1cHBvcnRlZENoYXIsIGNoKTsKLSAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJzwnOgotICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsKLSAgICAgICAgaWYgKFhGQV9GTURDaGFyOjppc0F2YWxpZChtX3B0cikpIHsKLSAgICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOwotICAgICAgICAgIGlmIChjaCA9PSAnPScpIHsKLSAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS2xlOwotICAgICAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7Ci0gICAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICc+JykgewotICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LbmU7Ci0gICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsKLSAgICAgICAgICAgIHJldHVybiBwOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tsdDsKLSAgICAgICAgICAgIHJldHVybiBwOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOwotICAgICAgICAgIEVycm9yKGtGTUVyclVuc3VwcG9ydGVkQ2hhciwgY2gpOwotICAgICAgICAgIHJldHVybiBwOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnPic6Ci0gICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOwotICAgICAgICBpZiAoWEZBX0ZNRENoYXI6OmlzQXZhbGlkKG1fcHRyKSkgewotICAgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7Ci0gICAgICAgICAgaWYgKGNoID09ICc9JykgewotICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LZ2U7Ci0gICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsKLSAgICAgICAgICAgIHJldHVybiBwOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tndDsKLSAgICAgICAgICAgIHJldHVybiBwOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOwotICAgICAgICAgIEVycm9yKGtGTUVyclVuc3VwcG9ydGVkQ2hhciwgY2gpOwotICAgICAgICAgIHJldHVybiBwOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnLCc6Ci0gICAgICAgIHAtPm1fdHlwZSA9IFRPS2NvbW1hOwotICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgICBjYXNlICcoJzoKLSAgICAgICAgcC0+bV90eXBlID0gVE9LbHBhcmVuOwotICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgICBjYXNlICcpJzoKLSAgICAgICAgcC0+bV90eXBlID0gVE9LcnBhcmVuOwotICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgICBjYXNlICdbJzoKLSAgICAgICAgcC0+bV90eXBlID0gVE9LbGJyYWNrZXQ7Ci0gICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOwotICAgICAgICByZXR1cm4gcDsKLSAgICAgIGNhc2UgJ10nOgotICAgICAgICBwLT5tX3R5cGUgPSBUT0tyYnJhY2tldDsKLSAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7Ci0gICAgICAgIHJldHVybiBwOwotICAgICAgY2FzZSAnJic6Ci0gICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOwotICAgICAgICBwLT5tX3R5cGUgPSBUT0thbmQ7Ci0gICAgICAgIHJldHVybiBwOwotICAgICAgY2FzZSAnfCc6Ci0gICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOwotICAgICAgICBwLT5tX3R5cGUgPSBUT0tvcjsKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgICBjYXNlICcrJzoKLSAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7Ci0gICAgICAgIHAtPm1fdHlwZSA9IFRPS3BsdXM7Ci0gICAgICAgIHJldHVybiBwOwotICAgICAgY2FzZSAnLSc6Ci0gICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOwotICAgICAgICBwLT5tX3R5cGUgPSBUT0ttaW51czsKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgICBjYXNlICcqJzoKLSAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7Ci0gICAgICAgIHAtPm1fdHlwZSA9IFRPS211bDsKLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgICBjYXNlICcvJzoKLSAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7Ci0gICAgICAgIGlmIChYRkFfRk1EQ2hhcjo6aXNBdmFsaWQobV9wdHIpKSB7Ci0gICAgICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KG1fcHRyKTsKLSAgICAgICAgICBpZiAoY2ggPT0gJy8nKSB7Ci0gICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcFRlbXAgPSAwOwotICAgICAgICAgICAgQ29tbWVudChtX3B0ciwgcFRlbXApOwotICAgICAgICAgICAgbV9wdHIgPSBwVGVtcDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tkaXY7Ci0gICAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KG1fcHRyKTsKLSAgICAgICAgICBFcnJvcihrRk1FcnJVbnN1cHBvcnRlZENoYXIsIGNoKTsKLSAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJy4nOgotICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsKLSAgICAgICAgaWYgKFhGQV9GTURDaGFyOjppc0F2YWxpZChtX3B0cikpIHsKLSAgICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQobV9wdHIpOwotICAgICAgICAgIGlmIChjaCA9PSAnLicpIHsKLSAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS2RvdGRvdDsKLSAgICAgICAgICAgIFhGQV9GTURDaGFyOjppbmMobV9wdHIpOwotICAgICAgICAgICAgcmV0dXJuIHA7Ci0gICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnKicpIHsKLSAgICAgICAgICAgIHAtPm1fdHlwZSA9IFRPS2RvdHN0YXI7Ci0gICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsKLSAgICAgICAgICAgIHJldHVybiBwOwotICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyMnKSB7Ci0gICAgICAgICAgICBwLT5tX3R5cGUgPSBUT0tkb3RzY3JlYW07Ci0gICAgICAgICAgICBYRkFfRk1EQ2hhcjo6aW5jKG1fcHRyKTsKLSAgICAgICAgICAgIHJldHVybiBwOwotICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPD0gJzknICYmIGNoID49ICcwJykgewotICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LbnVtYmVyOwotICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqIHBUZW1wID0gMDsKLSAgICAgICAgICAgIFhGQV9GTURDaGFyOjpkZWMobV9wdHIpOwotICAgICAgICAgICAgaVJldCA9IE51bWJlcihwLCBtX3B0ciwgcFRlbXApOwotICAgICAgICAgICAgbV9wdHIgPSBwVGVtcDsKLSAgICAgICAgICAgIGlmIChpUmV0KSB7Ci0gICAgICAgICAgICAgIEVycm9yKGtGTUVyckJhZFN1ZmZpeE51bWJlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcC0+bV90eXBlID0gVE9LZG90OwotICAgICAgICAgICAgcmV0dXJuIHA7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChtX3B0cik7Ci0gICAgICAgICAgRXJyb3Ioa0ZNRXJyVW5zdXBwb3J0ZWRDaGFyLCBjaCk7Ci0gICAgICAgICAgcmV0dXJuIHA7Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgMHgwOToKLSAgICAgIGNhc2UgMHgwQjoKLSAgICAgIGNhc2UgMHgwQzoKLSAgICAgIGNhc2UgMHgyMDoKLSAgICAgICAgWEZBX0ZNRENoYXI6OmluYyhtX3B0cik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDogewotICAgICAgICBjb25zdCBGWF9XQ0hBUiogcFRlbXAgPSAwOwotICAgICAgICBpUmV0ID0gSWRlbnRpZmllcnMocCwgbV9wdHIsIHBUZW1wKTsKLSAgICAgICAgbV9wdHIgPSBwVGVtcDsKLSAgICAgICAgaWYgKGlSZXQpIHsKLSAgICAgICAgICByZXR1cm4gcDsKLSAgICAgICAgfQotICAgICAgICBwLT5tX3R5cGUgPSBJc0tleXdvcmQocC0+bV93c3RyaW5nKTsKLSAgICAgIH0KLSAgICAgICAgcmV0dXJuIHA7Ci0gICAgfQotICB9Ci19Ci0KLXVpbnQzMl90IENYRkFfRk1MZXhlcjo6TnVtYmVyKENYRkFfRk1Ub2tlbiogdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqJiBwRW5kKSB7Ci0gIEZYX0RPVUJMRSBudW1iZXIgPSAwOwotICBpZiAoWEZBX0ZNRENoYXI6OnN0cmluZzJudW1iZXIocCwgJm51bWJlciwgcEVuZCkpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotICBpZiAocEVuZCAmJiBYRkFfRk1EQ2hhcjo6aXNBbHBoYShwRW5kKSkgewotICAgIHJldHVybiAxOwotICB9Ci0gIHQtPm1fd3N0cmluZyA9IENGWF9XaWRlU3RyaW5nQyhwLCAocEVuZCAtIHApKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IENYRkFfRk1MZXhlcjo6U3RyaW5nKENYRkFfRk1Ub2tlbiogdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqJiBwRW5kKSB7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwU3RhcnQgPSBwOwotICB1aW50MTZfdCBjaCA9IDA7Ci0gIFhGQV9GTURDaGFyOjppbmMocCk7Ci0gIGNoID0gWEZBX0ZNRENoYXI6OmdldChwKTsKLSAgd2hpbGUgKGNoKSB7Ci0gICAgaWYgKCFYRkFfRk1EQ2hhcjo6aXNBdmFsaWQocCkpIHsKLSAgICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChwKTsKLSAgICAgIHBFbmQgPSBwOwotICAgICAgdC0+bV93c3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmdDKHBTdGFydCwgKHBFbmQgLSBwU3RhcnQpKTsKLSAgICAgIEVycm9yKGtGTUVyclVuc3VwcG9ydGVkQ2hhciwgY2gpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmIChjaCA9PSAnIicpIHsKLSAgICAgIFhGQV9GTURDaGFyOjppbmMocCk7Ci0gICAgICBpZiAoIVhGQV9GTURDaGFyOjppc0F2YWxpZChwKSkgewotICAgICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQocCk7Ci0gICAgICAgIHBFbmQgPSBwOwotICAgICAgICB0LT5tX3dzdHJpbmcgPSBDRlhfV2lkZVN0cmluZ0MocFN0YXJ0LCAocEVuZCAtIHBTdGFydCkpOwotICAgICAgICBFcnJvcihrRk1FcnJVbnN1cHBvcnRlZENoYXIsIGNoKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgICBjaCA9IFhGQV9GTURDaGFyOjpnZXQocCk7Ci0gICAgICBpZiAoY2ggPT0gJyInKSB7Ci0gICAgICAgIGdvdG8gTkVYVDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgTkVYVDoKLSAgICBYRkFfRk1EQ2hhcjo6aW5jKHApOwotICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChwKTsKLSAgfQotICBwRW5kID0gcDsKLSAgdC0+bV93c3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmdDKHBTdGFydCwgKHBFbmQgLSBwU3RhcnQpKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXVpbnQzMl90IENYRkFfRk1MZXhlcjo6SWRlbnRpZmllcnMoQ1hGQV9GTVRva2VuKiB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqJiBwRW5kKSB7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwU3RhcnQgPSBwOwotICB1aW50MTZfdCBjaCA9IDA7Ci0gIGNoID0gWEZBX0ZNRENoYXI6OmdldChwKTsKLSAgWEZBX0ZNRENoYXI6OmluYyhwKTsKLSAgaWYgKCFYRkFfRk1EQ2hhcjo6aXNBdmFsaWQocCkpIHsKLSAgICBwRW5kID0gcDsKLSAgICB0LT5tX3dzdHJpbmcgPSBDRlhfV2lkZVN0cmluZ0MocFN0YXJ0LCAocEVuZCAtIHBTdGFydCkpOwotICAgIEVycm9yKGtGTUVyclVuc3VwcG9ydGVkQ2hhciwgY2gpOwotICAgIHJldHVybiAxOwotICB9Ci0gIGNoID0gWEZBX0ZNRENoYXI6OmdldChwKTsKLSAgd2hpbGUgKGNoKSB7Ci0gICAgaWYgKCFYRkFfRk1EQ2hhcjo6aXNBdmFsaWQocCkpIHsKLSAgICAgIHBFbmQgPSBwOwotICAgICAgdC0+bV93c3RyaW5nID0gQ0ZYX1dpZGVTdHJpbmdDKHBTdGFydCwgKHBFbmQgLSBwU3RhcnQpKTsKLSAgICAgIEVycm9yKGtGTUVyclVuc3VwcG9ydGVkQ2hhciwgY2gpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGNoID0gWEZBX0ZNRENoYXI6OmdldChwKTsKLSAgICBpZiAoWEZBX0ZNRENoYXI6OmlzVW5pY29kZUFscGhhKGNoKSkgewotICAgICAgWEZBX0ZNRENoYXI6OmluYyhwKTsKLSAgICB9IGVsc2UgewotICAgICAgcEVuZCA9IHA7Ci0gICAgICB0LT5tX3dzdHJpbmcgPSBDRlhfV2lkZVN0cmluZ0MocFN0YXJ0LCAocEVuZCAtIHBTdGFydCkpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0gIHBFbmQgPSBwOwotICB0LT5tX3dzdHJpbmcgPSBDRlhfV2lkZVN0cmluZ0MocFN0YXJ0LCAocEVuZCAtIHBTdGFydCkpOwotICByZXR1cm4gMDsKLX0KLQotdm9pZCBDWEZBX0ZNTGV4ZXI6OkNvbW1lbnQoY29uc3QgRlhfV0NIQVIqIHAsIGNvbnN0IEZYX1dDSEFSKiYgcEVuZCkgewotICB1bnNpZ25lZCBjaCA9IDA7Ci0gIFhGQV9GTURDaGFyOjppbmMocCk7Ci0gIGNoID0gWEZBX0ZNRENoYXI6OmdldChwKTsKLSAgd2hpbGUgKGNoKSB7Ci0gICAgaWYgKGNoID09IDB4MEQpIHsKLSAgICAgIFhGQV9GTURDaGFyOjppbmMocCk7Ci0gICAgICBwRW5kID0gcDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKGNoID09IDB4MEEpIHsKLSAgICAgICsrbV91Q3VycmVudExpbmU7Ci0gICAgICBYRkFfRk1EQ2hhcjo6aW5jKHApOwotICAgICAgcEVuZCA9IHA7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIFhGQV9GTURDaGFyOjppbmMocCk7Ci0gICAgY2ggPSBYRkFfRk1EQ2hhcjo6Z2V0KHApOwotICB9Ci0gIHBFbmQgPSBwOwotfQotCi1YRkFfRk1fVE9LRU4gQ1hGQV9GTUxleGVyOjpJc0tleXdvcmQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBzdHIpIHsKLSAgdWludDMyX3QgdUhhc2ggPSBGWF9IYXNoQ29kZV9HZXRXKHN0ciwgdHJ1ZSk7Ci0gIGludDMyX3QgaVN0YXJ0ID0gS0VZV09SRF9TVEFSVDsKLSAgaW50MzJfdCBpRW5kID0gS0VZV09SRF9FTkQ7Ci0gIGRvIHsKLSAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOwotICAgIFhGQV9GTUtleXdvcmQga2V5d29yZCA9IGtleVdvcmRzW2lNaWRdOwotICAgIGlmICh1SGFzaCA9PSBrZXl3b3JkLm1fdUhhc2gpCi0gICAgICByZXR1cm4ga2V5d29yZC5tX3R5cGU7Ci0gICAgaWYgKHVIYXNoIDwga2V5d29yZC5tX3VIYXNoKQotICAgICAgaUVuZCA9IGlNaWQgLSAxOwotICAgIGVsc2UKLSAgICAgIGlTdGFydCA9IGlNaWQgKyAxOwotICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7Ci0gIHJldHVybiBUT0tpZGVudGlmaWVyOwotfQotCi12b2lkIENYRkFfRk1MZXhlcjo6RXJyb3IoY29uc3QgRlhfV0NIQVIqIG1zZywgLi4uKSB7Ci0gIG1fcEVycm9ySW5mby0+bGluZW51bSA9IG1fdUN1cnJlbnRMaW5lOwotICB2YV9saXN0IGFwOwotICB2YV9zdGFydChhcCwgbXNnKTsKLSAgbV9wRXJyb3JJbmZvLT5tZXNzYWdlLkZvcm1hdFYobXNnLCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci19Ci0KLWJvb2wgQ1hGQV9GTUxleGVyOjpIYXNFcnJvcigpIGNvbnN0IHsKLSAgaWYgKG1fcEVycm9ySW5mby0+bWVzc2FnZS5Jc0VtcHR5KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9mbTJqcy94ZmFfbGV4ZXIuaCBiL3hmYS9meGZhL2ZtMmpzL3hmYV9sZXhlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Mzk1YzA2Li4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2ZtMmpzL3hmYV9sZXhlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhGQV9GTTJKU19YRkFfTEVYRVJfSF8KLSNkZWZpbmUgWEZBX0ZYRkFfRk0ySlNfWEZBX0xFWEVSX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgInhmYS9meGZhL2ZtMmpzL3hmYV9lcnJvci5oIgotCi1lbnVtIFhGQV9GTV9UT0tFTiB7Ci0gIFRPS2FuZCwKLSAgVE9LbHBhcmVuLAotICBUT0tycGFyZW4sCi0gIFRPS211bCwKLSAgVE9LcGx1cywKLSAgVE9LY29tbWEsCi0gIFRPS21pbnVzLAotICBUT0tkb3QsCi0gIFRPS2RpdiwKLSAgVE9LbHQsCi0gIFRPS2Fzc2lnbiwKLSAgVE9LZ3QsCi0gIFRPS2xicmFja2V0LAotICBUT0tyYnJhY2tldCwKLSAgVE9Lb3IsCi0gIFRPS2RvdHNjcmVhbSwKLSAgVE9LZG90c3RhciwKLSAgVE9LZG90ZG90LAotICBUT0tsZSwKLSAgVE9LbmUsCi0gIFRPS2VxLAotICBUT0tnZSwKLSAgVE9LZG8sCi0gIFRPS2tzZXEsCi0gIFRPS2tzZ2UsCi0gIFRPS2tzZ3QsCi0gIFRPS2lmLAotICBUT0tpbiwKLSAgVE9La3NsZSwKLSAgVE9La3NsdCwKLSAgVE9La3NuZSwKLSAgVE9La3NvciwKLSAgVE9LbnVsbCwKLSAgVE9LYnJlYWssCi0gIFRPS2tzYW5kLAotICBUT0tlbmQsCi0gIFRPS2VvZiwKLSAgVE9LZm9yLAotICBUT0tuYW4sCi0gIFRPS2tzbm90LAotICBUT0t2YXIsCi0gIFRPS3RoZW4sCi0gIFRPS2Vsc2UsCi0gIFRPS2V4aXQsCi0gIFRPS2Rvd250bywKLSAgVE9LcmV0dXJuLAotICBUT0tpbmZpbml0eSwKLSAgVE9LZW5kd2hpbGUsCi0gIFRPS2ZvcmVhY2gsCi0gIFRPS2VuZGZ1bmMsCi0gIFRPS2Vsc2VpZiwKLSAgVE9Ld2hpbGUsCi0gIFRPS2VuZGZvciwKLSAgVE9LdGhyb3csCi0gIFRPS3N0ZXAsCi0gIFRPS3VwdG8sCi0gIFRPS2NvbnRpbnVlLAotICBUT0tmdW5jLAotICBUT0tlbmRpZiwKLSAgVE9Lc3RhciwKLSAgVE9LaWRlbnRpZmllciwKLSAgVE9LdW5kZXJzY29yZSwKLSAgVE9LZG9sbGFyLAotICBUT0tleGNsYW1hdGlvbiwKLSAgVE9LY2FsbCwKLSAgVE9Lc3RyaW5nLAotICBUT0tudW1iZXIsCi0gIFRPS3Jlc2VydmVyCi19OwotCi1zdHJ1Y3QgWEZBX0ZNS2V5d29yZCB7Ci0gIFhGQV9GTV9UT0tFTiBtX3R5cGU7Ci0gIHVpbnQzMl90IG1fdUhhc2g7Ci0gIGNvbnN0IEZYX1dDSEFSKiBtX2tleXdvcmQ7Ci19OwotCi1jb25zdCBGWF9XQ0hBUiogWEZBX0ZNX0tleXdvcmRUb1N0cmluZyhYRkFfRk1fVE9LRU4gb3ApOwotCi1jbGFzcyBDWEZBX0ZNVG9rZW4gewotIHB1YmxpYzoKLSAgQ1hGQV9GTVRva2VuKCk7Ci0gIGV4cGxpY2l0IENYRkFfRk1Ub2tlbih1aW50MzJfdCB1TGluZU51bSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmdDIG1fd3N0cmluZzsKLSAgWEZBX0ZNX1RPS0VOIG1fdHlwZTsKLSAgdWludDMyX3QgbV91TGluZW51bTsKLX07Ci0KLWNsYXNzIENYRkFfRk1MZXhlciB7Ci0gcHVibGljOgotICBDWEZBX0ZNTGV4ZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0Zvcm1jYWxjLCBDWEZBX0ZNRXJyb3JJbmZvKiBwRXJyb3JJbmZvKTsKLSAgfkNYRkFfRk1MZXhlcigpOwotCi0gIENYRkFfRk1Ub2tlbiogTmV4dFRva2VuKCk7Ci0gIHVpbnQzMl90IE51bWJlcihDWEZBX0ZNVG9rZW4qIHQsIGNvbnN0IEZYX1dDSEFSKiBwLCBjb25zdCBGWF9XQ0hBUiomIHBFbmQpOwotICB1aW50MzJfdCBTdHJpbmcoQ1hGQV9GTVRva2VuKiB0LCBjb25zdCBGWF9XQ0hBUiogcCwgY29uc3QgRlhfV0NIQVIqJiBwRW5kKTsKLSAgdWludDMyX3QgSWRlbnRpZmllcnMoQ1hGQV9GTVRva2VuKiB0LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfV0NIQVIqJiBwRW5kKTsKLSAgdm9pZCBDb21tZW50KGNvbnN0IEZYX1dDSEFSKiBwLCBjb25zdCBGWF9XQ0hBUiomIHBFbmQpOwotICBYRkFfRk1fVE9LRU4gSXNLZXl3b3JkKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgcCk7Ci0gIHZvaWQgU2V0Q3VycmVudExpbmUodWludDMyX3QgbGluZSkgeyBtX3VDdXJyZW50TGluZSA9IGxpbmU7IH0KLSAgdm9pZCBTZXRUb2tlbihDWEZBX0ZNVG9rZW4qIHBUb2tlbikgewotICAgIGlmIChtX3BUb2tlbi5nZXQoKSAhPSBwVG9rZW4pCi0gICAgICBtX3BUb2tlbi5yZXNldChwVG9rZW4pOwotICB9Ci0gIGNvbnN0IEZYX1dDSEFSKiBTYXZlUG9zKCkgeyByZXR1cm4gbV9wdHI7IH0KLSAgdm9pZCBSZXN0b3JlUG9zKGNvbnN0IEZYX1dDSEFSKiBwUG9zKSB7IG1fcHRyID0gcFBvczsgfQotICB2b2lkIEVycm9yKGNvbnN0IEZYX1dDSEFSKiBtc2csIC4uLik7Ci0gIGJvb2wgSGFzRXJyb3IoKSBjb25zdDsKLQotIHByb3RlY3RlZDoKLSAgQ1hGQV9GTVRva2VuKiBTY2FuKCk7Ci0KLSAgY29uc3QgRlhfV0NIQVIqIG1fcHRyOwotICB1aW50MzJfdCBtX3VDdXJyZW50TGluZTsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1Ub2tlbj4gbV9wVG9rZW47Ci0gIENYRkFfRk1FcnJvckluZm8qIG1fcEVycm9ySW5mbzsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYRkFfRk0ySlNfWEZBX0xFWEVSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9mbTJqcy94ZmFfcHJvZ3JhbS5jcHAgYi94ZmEvZnhmYS9mbTJqcy94ZmFfcHJvZ3JhbS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNGI3YTYuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvZm0yanMveGZhX3Byb2dyYW0uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvZm0yanMveGZhX3Byb2dyYW0uaCIKLQotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotCi1DWEZBX0ZNUHJvZ3JhbTo6Q1hGQV9GTVByb2dyYW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0Zvcm1jYWxjKQotICAgIDogbV9wYXJzZSh3c0Zvcm1jYWxjLCAmbV9wRXJyb3JJbmZvKSB7fQotCi1DWEZBX0ZNUHJvZ3JhbTo6fkNYRkFfRk1Qcm9ncmFtKCkge30KLQotaW50MzJfdCBDWEZBX0ZNUHJvZ3JhbTo6UGFyc2VQcm9ncmFtKCkgewotICBtX3BhcnNlLk5leHRUb2tlbigpOwotICBpZiAoIW1fcEVycm9ySW5mby5tZXNzYWdlLklzRW1wdHkoKSkKLSAgICByZXR1cm4gLTE7Ci0KLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfRk1FeHByZXNzaW9uPj4gZXhwcmVzc2lvbnMgPQotICAgICAgbV9wYXJzZS5QYXJzZVRvcEV4cHJlc3Npb24oKTsKLSAgaWYgKCFtX3BFcnJvckluZm8ubWVzc2FnZS5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIHN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nQz4gYXJndW1lbnRzOwotICBtX2dsb2JhbEZ1bmN0aW9uID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1GdW5jdGlvbkRlZmluaXRpb24+KAotICAgICAgMSwgdHJ1ZSwgTCIiLCBzdGQ6Om1vdmUoYXJndW1lbnRzKSwgc3RkOjptb3ZlKGV4cHJlc3Npb25zKSk7Ci0gIHJldHVybiAwOwotfQotCi1pbnQzMl90IENYRkFfRk1Qcm9ncmFtOjpUcmFuc2xhdGVQcm9ncmFtKENGWF9XaWRlVGV4dEJ1ZiYgd3NKYXZhU2NyaXB0KSB7Ci0gIG1fZ2xvYmFsRnVuY3Rpb24tPlRvSmF2YVNjcmlwdCh3c0phdmFTY3JpcHQpOwotICB3c0phdmFTY3JpcHQuQXBwZW5kQ2hhcigwKTsKLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9mbTJqcy94ZmFfcHJvZ3JhbS5oIGIveGZhL2Z4ZmEvZm0yanMveGZhX3Byb2dyYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2EyZGFkZS4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9mbTJqcy94ZmFfcHJvZ3JhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEZBX0ZNMkpTX1hGQV9QUk9HUkFNX0hfCi0jZGVmaW5lIFhGQV9GWEZBX0ZNMkpTX1hGQV9QUk9HUkFNX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9mbTJqcy94ZmFfZXJyb3IuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9mbTJqcy94ZmFfZm1wYXJzZS5oIgotCi1jbGFzcyBDWEZBX0ZNUHJvZ3JhbSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDWEZBX0ZNUHJvZ3JhbShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9ybWNhbGMpOwotICB+Q1hGQV9GTVByb2dyYW0oKTsKLQotICBpbnQzMl90IFBhcnNlUHJvZ3JhbSgpOwotICBpbnQzMl90IFRyYW5zbGF0ZVByb2dyYW0oQ0ZYX1dpZGVUZXh0QnVmJiB3c0phdmFTY3JpcHQpOwotCi0gIGNvbnN0IENYRkFfRk1FcnJvckluZm8mIEdldEVycm9yKCkgY29uc3QgeyByZXR1cm4gbV9wRXJyb3JJbmZvOyB9Ci0KLSBwcml2YXRlOgotICBDWEZBX0ZNRXJyb3JJbmZvIG1fcEVycm9ySW5mbzsKLSAgQ1hGQV9GTVBhcnNlIG1fcGFyc2U7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNRnVuY3Rpb25EZWZpbml0aW9uPiBtX2dsb2JhbEZ1bmN0aW9uOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhGQV9GTTJKU19YRkFfUFJPR1JBTV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvZm0yanMveGZhX3NpbXBsZWV4cHJlc3Npb24uY3BwIGIveGZhL2Z4ZmEvZm0yanMveGZhX3NpbXBsZWV4cHJlc3Npb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODZkZGFhLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2ZtMmpzL3hmYV9zaW1wbGVleHByZXNzaW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc2MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9mbTJqcy94ZmFfc2ltcGxlZXhwcmVzc2lvbi5oIgotCi0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCi0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IEZYX1dDSEFSKiBjb25zdCBnc19scFN0ckV4cEZ1bmNOYW1lW10gPSB7Ci0gICAgTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5hc3NpZ25fdmFsdWVfb3BlcmF0b3IiLAotICAgIEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUubG9naWNhbF9vcl9vcGVyYXRvciIsCi0gICAgTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5sb2dpY2FsX2FuZF9vcGVyYXRvciIsCi0gICAgTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5lcXVhbGl0eV9vcGVyYXRvciIsCi0gICAgTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5ub3RlcXVhbGl0eV9vcGVyYXRvciIsCi0gICAgTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5sZXNzX29wZXJhdG9yIiwKLSAgICBMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLmxlc3NlcXVhbF9vcGVyYXRvciIsCi0gICAgTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5ncmVhdGVyX29wZXJhdG9yIiwKLSAgICBMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLmdyZWF0ZXJlcXVhbF9vcGVyYXRvciIsCi0gICAgTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5wbHVzX29wZXJhdG9yIiwKLSAgICBMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLm1pbnVzX29wZXJhdG9yIiwKLSAgICBMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLm11bHRpcGxlX29wZXJhdG9yIiwKLSAgICBMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLmRpdmlkZV9vcGVyYXRvciIsCi0gICAgTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5wb3NpdGl2ZV9vcGVyYXRvciIsCi0gICAgTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5uZWdhdGl2ZV9vcGVyYXRvciIsCi0gICAgTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5sb2dpY2FsX25vdF9vcGVyYXRvciIsCi0gICAgTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS4iLAotICAgIEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUuZG90X2FjY2Vzc29yIiwKLSAgICBMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLmRvdGRvdF9hY2Nlc3NvciIsCi0gICAgTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5jb25jYXRfZm1fb2JqZWN0IiwKLSAgICBMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLmlzX2ZtX29iamVjdCIsCi0gICAgTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5pc19mbV9hcnJheSIsCi0gICAgTCJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZS5nZXRfZm1fdmFsdWUiLAotICAgIEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWUuZ2V0X2ZtX2pzb2JqIiwKLSAgICBMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLmZtX3Zhcl9maWx0ZXIiLAotfTsKLQotc3RydWN0IFhGQV9GTUJ1aWxkSW5GdW5jIHsKLSAgdWludDMyX3QgbV91SGFzaDsKLSAgY29uc3QgRlhfV0NIQVIqIG1fYnVpbGRpbmZ1bmM7Ci19OwotCi1jb25zdCBYRkFfRk1CdWlsZEluRnVuYyBnX0J1aWxkSW5GdW5jc1tdID0gewotICAgIHsweDAwMDFmMWY1LCBMIkF0In0sICAgICAgICAgICB7MHgwMDAyMGI5YywgTCJGViJ9LAotICAgIHsweDAwMDIxYWVmLCBMIklmIn0sICAgICAgICAgICB7MHgwMDAyM2VlNiwgTCJQViJ9LAotICAgIHsweDA0YjVjOWVlLCBMIkVuY29kZSJ9LCAgICAgICB7MHgwOGU5NjY4NSwgTCJEYXRlRm10In0sCi0gICAgezB4MDlmOTlkYjYsIEwiQWJzIn0sICAgICAgICAgIHsweDA5ZjllNTgzLCBMIkFwciJ9LAotICAgIHsweDA5ZmEwNDNlLCBMIkF2ZyJ9LCAgICAgICAgICB7MHgwYTk3ODJhMCwgTCJHZXQifSwKLSAgICB7MHgwYjFiMDlkZiwgTCJMZW4ifSwgICAgICAgICAgezB4MGIzNTQzYTYsIEwiTWF4In0sCi0gICAgezB4MGIzNTZjYTQsIEwiTWluIn0sICAgICAgICAgIHsweDBiMzU4YjYwLCBMIk1vZCJ9LAotICAgIHsweDBiNGZkZWQ0LCBMIk5QViJ9LCAgICAgICAgICB7MHgwYjg0NmJmMSwgTCJQbXQifSwKLSAgICB7MHgwYjg0OTRmOSwgTCJQdXQifSwgICAgICAgICAgezB4MGJiOGRmNWQsIEwiUmVmIn0sCi0gICAgezB4MGJkMzdhOTksIEwiU3RyIn0sICAgICAgICAgIHsweDBiZDM3ZmI1LCBMIlN1bSJ9LAotICAgIHsweDEwNDg0NjliLCBMIkN0ZXJtIn0sICAgICAgICB7MHgxMWUwMzY2MCwgTCJFeGlzdHMifSwKLSAgICB7MHgxMjYyMzZlNiwgTCJQb3N0In0sICAgICAgICAgezB4MTI3YzY2NjEsIEwiUFBtdCJ9LAotICAgIHsweDE5M2FkZTNlLCBMIlJpZ2h0In0sICAgICAgICB7MHgxZWM4YWIyYywgTCJSYXRlIn0sCi0gICAgezB4MjBlNDc2ZGMsIEwiSXNvVGltZTJOdW0ifSwgIHsweDIzZWI2ODE2LCBMIlRpbWVGbXQifSwKLSAgICB7MHgyNGZiMTdiMCwgTCJMb2NhbERhdGVGbXQifSwgezB4MjhkZWU2ZTksIEwiRm9ybWF0In0sCi0gICAgezB4MmQwODkwYjgsIEwiVGVybSJ9LCAgICAgICAgIHsweDJkNzFiMDBmLCBMIlRpbWUifSwKLSAgICB7MHgyZjg5MGZiMSwgTCJOdW0yVGltZSJ9LCAgICAgezB4Mzc2NzUxMWQsIEwiQ2VpbCJ9LAotICAgIHsweDNmZmQxOTQxLCBMIkxvY2FsVGltZUZtdCJ9LCB7MHg0NDJmNjhjOCwgTCJSb3VuZCJ9LAotICAgIHsweDQ2ZmQxMTI4LCBMIkV2YWwifSwgICAgICAgICB7MHg0ZDYyOTQ0MCwgTCJEYXRlMk51bSJ9LAotICAgIHsweDRkY2YyNWY4LCBMIkNvbmNhdCJ9LCAgICAgICB7MHg0ZTAwMjU1ZCwgTCJVbml0VmFsdWUifSwKLSAgICB7MHg1NWE1Y2MyOSwgTCJMb3dlciJ9LCAgICAgICAgezB4NWU0M2UwNGMsIEwiV29yZE51bSJ9LAotICAgIHsweDYyMGNlNmJhLCBMIklwbXQifSwgICAgICAgICB7MHg2ZjU0NGQ0OSwgTCJDb3VudCJ9LAotICAgIHsweDdlMjQxMDEzLCBMIldpdGhpbiJ9LCAgICAgICB7MHg5YjlhNmUyYiwgTCJJc29EYXRlMk51bSJ9LAotICAgIHsweGIyYzk0MWMyLCBMIlVuaXRUeXBlIn0sICAgICB7MHhiNTk4YTFmNywgTCJVdWlkIn0sCi0gICAgezB4YmRlOWFiZGUsIEwiRGF0ZSJ9LCAgICAgICAgIHsweGMwMDEwYjgwLCBMIk51bTJEYXRlIn0sCi0gICAgezB4YzFmNjE0NGMsIEwiVXBwZXIifSwgICAgICAgIHsweGM0NDAyOGY3LCBMIk9uZW9mIn0sCi0gICAgezB4YzYyYzFiMmMsIEwiU3BhY2UifSwgICAgICAgIHsweGQwZmY1MGY5LCBMIkhhc1ZhbHVlIn0sCi0gICAgezB4ZDE1MzcwNDIsIEwiRmxvb3IifSwgICAgICAgIHsweGQyYWM5Y2YxLCBMIlRpbWUyTnVtIn0sCi0gICAgezB4ZDkwN2FlZTUsIEwiTnVtMkdNVGltZSJ9LCAgIHsweGRmMjRmN2M0LCBMIkRlY29kZSJ9LAotICAgIHsweGUyNjY0ODAzLCBMIlN1YnN0ciJ9LCAgICAgICB7MHhlM2U3YjUyOCwgTCJTdHVmZiJ9LAotICAgIHsweGU2NzkyZDRlLCBMIlJ0cmltIn0sICAgICAgICB7MHhlOGMyM2Y1YiwgTCJQYXJzZSJ9LAotICAgIHsweGVhMThkMTIxLCBMIkNob29zZSJ9LCAgICAgICB7MHhlYmZlZjY5YywgTCJSZXBsYWNlIn0sCi0gICAgezB4ZjVhZDc4MmIsIEwiTGVmdCJ9LCAgICAgICAgIHsweGY3YmIyMjQ4LCBMIkx0cmltIn0sCi19OwotCi1zdHJ1Y3QgWEZBX0ZNU09NTWV0aG9kIHsKLSAgdWludDMyX3QgbV91SGFzaDsKLSAgY29uc3QgRlhfV0NIQVIqIG1fd3NTb21NZXRob2ROYW1lOwotICB1aW50MzJfdCBtX2RQYXJhbWV0ZXJzOwotfTsKLWNvbnN0IFhGQV9GTVNPTU1ldGhvZCBnc19GTVNvbU1ldGhvZHNbXSA9IHsKLSAgICB7MHgwMDAwMDA2OCwgTCJoIiwgMHgwMX0sCi0gICAgezB4MDAwMDAwNzcsIEwidyIsIDB4MDF9LAotICAgIHsweDAwMDAwMDc4LCBMIngiLCAweDAxfSwKLSAgICB7MHgwMDAwMDA3OSwgTCJ5IiwgMHgwMX0sCi0gICAgezB4MDVlYjViMGYsIEwicGFnZVNwYW4iLCAweDAxfSwKLSAgICB7MHgxMGYxYjFiZCwgTCJwYWdlIiwgMHgwMX0sCi0gICAgezB4M2JmMWMyYTUsIEwiYWJzUGFnZVNwYW4iLCAweDAxfSwKLSAgICB7MHgzYzc1MjQ5NSwgTCJ2ZXJpZnkiLCAweDBkfSwKLSAgICB7MHg0NGMzNTJhZCwgTCJmb3JtTm9kZXMiLCAweDAxfSwKLSAgICB7MHg1Nzc1YzJjYywgTCJhYnNQYWdlSW5CYXRjaCIsIDB4MDF9LAotICAgIHsweDVlZTAwOTk2LCBMInNldEVsZW1lbnQiLCAweDAxfSwKLSAgICB7MHg3MDMzYmZkNSwgTCJpbnNlcnQiLCAweDAzfSwKLSAgICB7MHg4YzVmZWIzMiwgTCJzaGVldEluQmF0Y2giLCAweDAxfSwKLSAgICB7MHg4ZjNhODM3OSwgTCJzaGVldCIsIDB4MDF9LAotICAgIHsweDkyZGFkYTRmLCBMInNhdmVGaWx0ZXJlZFhNTCIsIDB4MDF9LAotICAgIHsweDljYWI3Y2FlLCBMInJlbW92ZSIsIDB4MDF9LAotICAgIHsweGE2ODYzNWYxLCBMInNpZ24iLCAweDYxfSwKLSAgICB7MHhhYWMyNDFjOCwgTCJpc1JlY29yZEdyb3VwIiwgMHgwMX0sCi0gICAgezB4ZDhlZDE0NjcsIEwiY2xlYXIiLCAweDAxfSwKLSAgICB7MHhkYTEyZTUxOCwgTCJhcHBlbmQiLCAweDAxfSwKLSAgICB7MHhlNzRmMDY1MywgTCJhYnNQYWdlIiwgMHgwMX0sCi19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotQ0ZYX1dpZGVTdHJpbmdDIFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoCi0gICAgWEZBX0ZNX1NpbXBsZUV4cHJlc3Npb25UeXBlIHNpbXBsZUV4cFR5cGUpIHsKLSAgcmV0dXJuIGdzX2xwU3RyRXhwRnVuY05hbWVbc2ltcGxlRXhwVHlwZV07Ci19Ci0KLUNYRkFfRk1TaW1wbGVFeHByZXNzaW9uOjpDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lLCBYRkFfRk1fVE9LRU4gb3ApCi0gICAgOiBtX2xpbmUobGluZSksIG1fb3Aob3ApIHt9Ci0KLXZvaWQgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHt9Ci0KLXZvaWQgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb246OlRvSW1wbGllZFJldHVybkpTKENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkge30KLQotWEZBX0ZNX1RPS0VOIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uOjpHZXRPcGVyYXRvclRva2VuKCkgY29uc3QgewotICByZXR1cm4gbV9vcDsKLX0KLQotQ1hGQV9GTU51bGxFeHByZXNzaW9uOjpDWEZBX0ZNTnVsbEV4cHJlc3Npb24odWludDMyX3QgbGluZSkKLSAgICA6IENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKGxpbmUsIFRPS251bGwpIHt9Ci0KLXZvaWQgQ1hGQV9GTU51bGxFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7Ci0gIGphdmFzY3JpcHQgPDwgTCJudWxsIjsKLX0KLQotQ1hGQV9GTU51bWJlckV4cHJlc3Npb246OkNYRkFfRk1OdW1iZXJFeHByZXNzaW9uKHVpbnQzMl90IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTnVtYmVyKQotICAgIDogQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24obGluZSwgVE9LbnVtYmVyKSwgbV93c051bWJlcih3c051bWJlcikge30KLQotQ1hGQV9GTU51bWJlckV4cHJlc3Npb246On5DWEZBX0ZNTnVtYmVyRXhwcmVzc2lvbigpIHt9Ci0KLXZvaWQgQ1hGQV9GTU51bWJlckV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKLSAgamF2YXNjcmlwdCA8PCBtX3dzTnVtYmVyOwotfQotCi1DWEZBX0ZNU3RyaW5nRXhwcmVzc2lvbjo6Q1hGQV9GTVN0cmluZ0V4cHJlc3Npb24odWludDMyX3QgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NTdHJpbmcpCi0gICAgOiBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbihsaW5lLCBUT0tzdHJpbmcpLCBtX3dzU3RyaW5nKHdzU3RyaW5nKSB7fQotCi1DWEZBX0ZNU3RyaW5nRXhwcmVzc2lvbjo6fkNYRkFfRk1TdHJpbmdFeHByZXNzaW9uKCkge30KLQotdm9pZCBDWEZBX0ZNU3RyaW5nRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgewotICBDRlhfV2lkZVN0cmluZyB0ZW1wU3RyKG1fd3NTdHJpbmcpOwotICBpZiAodGVtcFN0ci5HZXRMZW5ndGgoKSA+IDIpIHsKLSAgICBqYXZhc2NyaXB0LkFwcGVuZENoYXIoTCdcIicpOwotICAgIEZYX1dDSEFSIG9uZUNoYXI7Ci0gICAgZm9yIChpbnQxNl90IGkgPSAxOyBpIDwgdGVtcFN0ci5HZXRMZW5ndGgoKSAtIDE7IGkrKykgewotICAgICAgb25lQ2hhciA9IHRlbXBTdHJbaV07Ci0gICAgICBzd2l0Y2ggKG9uZUNoYXIpIHsKLSAgICAgICAgY2FzZSBMJ1wiJzogewotICAgICAgICAgIGkrKzsKLSAgICAgICAgICBqYXZhc2NyaXB0IDw8IEwiXFxcIiI7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGNhc2UgMHgwZDoKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAweDBhOiB7Ci0gICAgICAgICAgamF2YXNjcmlwdCA8PCBMIlxcbiI7Ci0gICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IHsgamF2YXNjcmlwdC5BcHBlbmRDaGFyKG9uZUNoYXIpOyB9IGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBqYXZhc2NyaXB0LkFwcGVuZENoYXIoTCdcIicpOwotICB9IGVsc2UgewotICAgIGphdmFzY3JpcHQgPDwgdGVtcFN0cjsKLSAgfQotfQotCi1DWEZBX0ZNSWRlbnRpZmllckV4cHJlc3Npb246OkNYRkFfRk1JZGVudGlmaWVyRXhwcmVzc2lvbigKLSAgICB1aW50MzJfdCBsaW5lLAotICAgIENGWF9XaWRlU3RyaW5nQyB3c0lkZW50aWZpZXIpCi0gICAgOiBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbihsaW5lLCBUT0tpZGVudGlmaWVyKSwKLSAgICAgIG1fd3NJZGVudGlmaWVyKHdzSWRlbnRpZmllcikge30KLQotQ1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9uOjp+Q1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9uKCkge30KLQotdm9pZCBDWEZBX0ZNSWRlbnRpZmllckV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgdGVtcFN0cihtX3dzSWRlbnRpZmllcik7Ci0gIGlmICh0ZW1wU3RyID09IEwiJCIpIHsKLSAgICB0ZW1wU3RyID0gTCJ0aGlzIjsKLSAgfSBlbHNlIGlmICh0ZW1wU3RyID09IEwiISIpIHsKLSAgICB0ZW1wU3RyID0gTCJ4ZmEuZGF0YXNldHMiOwotICB9IGVsc2UgaWYgKHRlbXBTdHIgPT0gTCIkZGF0YSIpIHsKLSAgICB0ZW1wU3RyID0gTCJ4ZmEuZGF0YXNldHMuZGF0YSI7Ci0gIH0gZWxzZSBpZiAodGVtcFN0ciA9PSBMIiRldmVudCIpIHsKLSAgICB0ZW1wU3RyID0gTCJ4ZmEuZXZlbnQiOwotICB9IGVsc2UgaWYgKHRlbXBTdHIgPT0gTCIkZm9ybSIpIHsKLSAgICB0ZW1wU3RyID0gTCJ4ZmEuZm9ybSI7Ci0gIH0gZWxzZSBpZiAodGVtcFN0ciA9PSBMIiRob3N0IikgewotICAgIHRlbXBTdHIgPSBMInhmYS5ob3N0IjsKLSAgfSBlbHNlIGlmICh0ZW1wU3RyID09IEwiJGxheW91dCIpIHsKLSAgICB0ZW1wU3RyID0gTCJ4ZmEubGF5b3V0IjsKLSAgfSBlbHNlIGlmICh0ZW1wU3RyID09IEwiJHRlbXBsYXRlIikgewotICAgIHRlbXBTdHIgPSBMInhmYS50ZW1wbGF0ZSI7Ci0gIH0gZWxzZSBpZiAodGVtcFN0clswXSA9PSBMJyEnKSB7Ci0gICAgdGVtcFN0ciA9IEVYQ0xBTUFUSU9OX0lOX0lERU5USUZJRVIgKyB0ZW1wU3RyLk1pZCgxKTsKLSAgfQotICBqYXZhc2NyaXB0IDw8IHRlbXBTdHI7Ci19Ci0KLUNYRkFfRk1VbmFyeUV4cHJlc3Npb246OkNYRkFfRk1VbmFyeUV4cHJlc3Npb24oCi0gICAgdWludDMyX3QgbGluZSwKLSAgICBYRkFfRk1fVE9LRU4gb3AsCi0gICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwKQotICAgIDogQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24obGluZSwgb3ApLCBtX3BFeHAoc3RkOjptb3ZlKHBFeHApKSB7fQotCi1DWEZBX0ZNVW5hcnlFeHByZXNzaW9uOjp+Q1hGQV9GTVVuYXJ5RXhwcmVzc2lvbigpIHt9Ci0KLXZvaWQgQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkge30KLQotQ1hGQV9GTUJpbkV4cHJlc3Npb246OkNYRkFfRk1CaW5FeHByZXNzaW9uKAotICAgIHVpbnQzMl90IGxpbmUsCi0gICAgWEZBX0ZNX1RPS0VOIG9wLAotICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cDEsCi0gICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMikKLSAgICA6IENYRkFfRk1TaW1wbGVFeHByZXNzaW9uKGxpbmUsIG9wKSwKLSAgICAgIG1fcEV4cDEoc3RkOjptb3ZlKHBFeHAxKSksCi0gICAgICBtX3BFeHAyKHN0ZDo6bW92ZShwRXhwMikpIHt9Ci0KLUNYRkFfRk1CaW5FeHByZXNzaW9uOjp+Q1hGQV9GTUJpbkV4cHJlc3Npb24oKSB7fQotCi12b2lkIENYRkFfRk1CaW5FeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7fQotCi1DWEZBX0ZNQXNzaWduRXhwcmVzc2lvbjo6Q1hGQV9GTUFzc2lnbkV4cHJlc3Npb24oCi0gICAgdWludDMyX3QgbGluZSwKLSAgICBYRkFfRk1fVE9LRU4gb3AsCi0gICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMSwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAyKQotICAgIDogQ1hGQV9GTUJpbkV4cHJlc3Npb24obGluZSwgb3AsIHN0ZDo6bW92ZShwRXhwMSksIHN0ZDo6bW92ZShwRXhwMikpIHt9Ci0KLXZvaWQgQ1hGQV9GTUFzc2lnbkV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKLSAgamF2YXNjcmlwdCA8PCBMImlmICgiOwotICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbSVNGTU9CSkVDVF07Ci0gIGphdmFzY3JpcHQgPDwgTCIoIjsKLSAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICBqYXZhc2NyaXB0IDw8IEwiKSlcbntcbiI7Ci0gIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtBU1NJR05dOwotICBqYXZhc2NyaXB0IDw8IEwiKCI7Ci0gIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsKLSAgamF2YXNjcmlwdCA8PCBMIiwgIjsKLSAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICBqYXZhc2NyaXB0IDw8IEwiKTtcbn1cbiI7Ci0gIENGWF9XaWRlVGV4dEJ1ZiB0ZW1wRXhwMTsKLSAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KHRlbXBFeHAxKTsKLSAgaWYgKG1fcEV4cDEtPkdldE9wZXJhdG9yVG9rZW4oKSA9PSBUT0tpZGVudGlmaWVyICYmCi0gICAgICB0ZW1wRXhwMS5Bc1N0cmluZ0MoKSAhPSBMInRoaXMiKSB7Ci0gICAgamF2YXNjcmlwdCA8PCBMImVsc2VcbntcbiI7Ci0gICAgamF2YXNjcmlwdCA8PCB0ZW1wRXhwMTsKLSAgICBqYXZhc2NyaXB0IDw8IEwiID0gIjsKLSAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbQVNTSUdOXTsKLSAgICBqYXZhc2NyaXB0IDw8IEwiKCI7Ci0gICAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICAgIGphdmFzY3JpcHQgPDwgTCIsICI7Ci0gICAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICAgIGphdmFzY3JpcHQgPDwgTCIpO1xufVxuIjsKLSAgfQotfQotCi12b2lkIENYRkFfRk1Bc3NpZ25FeHByZXNzaW9uOjpUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKLSAgamF2YXNjcmlwdCA8PCBMImlmICgiOwotICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbSVNGTU9CSkVDVF07Ci0gIGphdmFzY3JpcHQgPDwgTCIoIjsKLSAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICBqYXZhc2NyaXB0IDw8IEwiKSlcbntcbiI7Ci0gIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7Ci0gIGphdmFzY3JpcHQgPDwgTCIgPSAiOwotICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbQVNTSUdOXTsKLSAgamF2YXNjcmlwdCA8PCBMIigiOwotICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gIGphdmFzY3JpcHQgPDwgTCIsICI7Ci0gIG1fcEV4cDItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsKLSAgamF2YXNjcmlwdCA8PCBMIik7XG59XG4iOwotICBDRlhfV2lkZVRleHRCdWYgdGVtcEV4cDE7Ci0gIG1fcEV4cDEtPlRvSmF2YVNjcmlwdCh0ZW1wRXhwMSk7Ci0gIGlmIChtX3BFeHAxLT5HZXRPcGVyYXRvclRva2VuKCkgPT0gVE9LaWRlbnRpZmllciAmJgotICAgICAgdGVtcEV4cDEuQXNTdHJpbmdDKCkgIT0gTCJ0aGlzIikgewotICAgIGphdmFzY3JpcHQgPDwgTCJlbHNlXG57XG4iOwotICAgIGphdmFzY3JpcHQgPDwgUlVOVElNRUZVTkNUSU9OUkVUVVJOVkFMVUU7Ci0gICAgamF2YXNjcmlwdCA8PCBMIiA9ICI7Ci0gICAgamF2YXNjcmlwdCA8PCB0ZW1wRXhwMTsKLSAgICBqYXZhc2NyaXB0IDw8IEwiID0gIjsKLSAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbQVNTSUdOXTsKLSAgICBqYXZhc2NyaXB0IDw8IEwiKCI7Ci0gICAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICAgIGphdmFzY3JpcHQgPDwgTCIsICI7Ci0gICAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICAgIGphdmFzY3JpcHQgPDwgTCIpO1xufVxuIjsKLSAgfQotfQotCi1DWEZBX0ZNTG9naWNhbE9yRXhwcmVzc2lvbjo6Q1hGQV9GTUxvZ2ljYWxPckV4cHJlc3Npb24oCi0gICAgdWludDMyX3QgbGluZSwKLSAgICBYRkFfRk1fVE9LRU4gb3AsCi0gICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMSwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAyKQotICAgIDogQ1hGQV9GTUJpbkV4cHJlc3Npb24obGluZSwgb3AsIHN0ZDo6bW92ZShwRXhwMSksIHN0ZDo6bW92ZShwRXhwMikpIHt9Ci0KLXZvaWQgQ1hGQV9GTUxvZ2ljYWxPckV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKLSAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0xPR0lDQUxPUl07Ci0gIGphdmFzY3JpcHQgPDwgTCIoIjsKLSAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICBqYXZhc2NyaXB0IDw8IEwiLCAiOwotICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gIGphdmFzY3JpcHQgPDwgTCIpIjsKLX0KLQotQ1hGQV9GTUxvZ2ljYWxBbmRFeHByZXNzaW9uOjpDWEZBX0ZNTG9naWNhbEFuZEV4cHJlc3Npb24oCi0gICAgdWludDMyX3QgbGluZSwKLSAgICBYRkFfRk1fVE9LRU4gb3AsCi0gICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMSwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAyKQotICAgIDogQ1hGQV9GTUJpbkV4cHJlc3Npb24obGluZSwgb3AsIHN0ZDo6bW92ZShwRXhwMSksIHN0ZDo6bW92ZShwRXhwMikpIHt9Ci0KLXZvaWQgQ1hGQV9GTUxvZ2ljYWxBbmRFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7Ci0gIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtMT0dJQ0FMQU5EXTsKLSAgamF2YXNjcmlwdCA8PCBMIigiOwotICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gIGphdmFzY3JpcHQgPDwgTCIsICI7Ci0gIG1fcEV4cDItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsKLSAgamF2YXNjcmlwdCA8PCBMIikiOwotfQotCi1DWEZBX0ZNRXF1YWxpdHlFeHByZXNzaW9uOjpDWEZBX0ZNRXF1YWxpdHlFeHByZXNzaW9uKAotICAgIHVpbnQzMl90IGxpbmUsCi0gICAgWEZBX0ZNX1RPS0VOIG9wLAotICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cDEsCi0gICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMikKLSAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsIG9wLCBzdGQ6Om1vdmUocEV4cDEpLCBzdGQ6Om1vdmUocEV4cDIpKSB7fQotCi12b2lkIENYRkFfRk1FcXVhbGl0eUV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKLSAgc3dpdGNoIChtX29wKSB7Ci0gICAgY2FzZSBUT0tlcToKLSAgICBjYXNlIFRPS2tzZXE6Ci0gICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbRVFVQUxJVFldOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUT0tuZToKLSAgICBjYXNlIFRPS2tzbmU6Ci0gICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbTk9URVFVQUxJVFldOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEFTU0VSVChmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgfQotICBqYXZhc2NyaXB0IDw8IEwiKCI7Ci0gIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsKLSAgamF2YXNjcmlwdCA8PCBMIiwgIjsKLSAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICBqYXZhc2NyaXB0IDw8IEwiKSI7Ci19Ci0KLUNYRkFfRk1SZWxhdGlvbmFsRXhwcmVzc2lvbjo6Q1hGQV9GTVJlbGF0aW9uYWxFeHByZXNzaW9uKAotICAgIHVpbnQzMl90IGxpbmUsCi0gICAgWEZBX0ZNX1RPS0VOIG9wLAotICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cDEsCi0gICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMikKLSAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsIG9wLCBzdGQ6Om1vdmUocEV4cDEpLCBzdGQ6Om1vdmUocEV4cDIpKSB7fQotCi12b2lkIENYRkFfRk1SZWxhdGlvbmFsRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgewotICBzd2l0Y2ggKG1fb3ApIHsKLSAgICBjYXNlIFRPS2x0OgotICAgIGNhc2UgVE9La3NsdDoKLSAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtMRVNTXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVE9LZ3Q6Ci0gICAgY2FzZSBUT0trc2d0OgotICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0dSRUFURVJdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBUT0tsZToKLSAgICBjYXNlIFRPS2tzbGU6Ci0gICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbTEVTU0VRVUFMXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVE9LZ2U6Ci0gICAgY2FzZSBUT0trc2dlOgotICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0dSRUFURVJFUVVBTF07Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgQVNTRVJUKGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIGphdmFzY3JpcHQgPDwgTCIoIjsKLSAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICBqYXZhc2NyaXB0IDw8IEwiLCAiOwotICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gIGphdmFzY3JpcHQgPDwgTCIpIjsKLX0KLQotQ1hGQV9GTUFkZGl0aXZlRXhwcmVzc2lvbjo6Q1hGQV9GTUFkZGl0aXZlRXhwcmVzc2lvbigKLSAgICB1aW50MzJfdCBsaW5lLAotICAgIFhGQV9GTV9UT0tFTiBvcCwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAxLAotICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cDIpCi0gICAgOiBDWEZBX0ZNQmluRXhwcmVzc2lvbihsaW5lLCBvcCwgc3RkOjptb3ZlKHBFeHAxKSwgc3RkOjptb3ZlKHBFeHAyKSkge30KLQotdm9pZCBDWEZBX0ZNQWRkaXRpdmVFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7Ci0gIHN3aXRjaCAobV9vcCkgewotICAgIGNhc2UgVE9LcGx1czoKLSAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtQTFVTXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVE9LbWludXM6Ci0gICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbTUlOVVNdOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEFTU0VSVChmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgfQotICBqYXZhc2NyaXB0IDw8IEwiKCI7Ci0gIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsKLSAgamF2YXNjcmlwdCA8PCBMIiwgIjsKLSAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICBqYXZhc2NyaXB0IDw8IEwiKSI7Ci19Ci0KLUNYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb246OkNYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oCi0gICAgdWludDMyX3QgbGluZSwKLSAgICBYRkFfRk1fVE9LRU4gb3AsCi0gICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMSwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAyKQotICAgIDogQ1hGQV9GTUJpbkV4cHJlc3Npb24obGluZSwgb3AsIHN0ZDo6bW92ZShwRXhwMSksIHN0ZDo6bW92ZShwRXhwMikpIHt9Ci0KLXZvaWQgQ1hGQV9GTU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KAotICAgIENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgewotICBzd2l0Y2ggKG1fb3ApIHsKLSAgICBjYXNlIFRPS211bDoKLSAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtNVUxUSVBMRV07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRPS2RpdjoKLSAgICAgIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtESVZJREVdOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIEFTU0VSVChmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgfQotICBqYXZhc2NyaXB0IDw8IEwiKCI7Ci0gIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsKLSAgamF2YXNjcmlwdCA8PCBMIiwgIjsKLSAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICBqYXZhc2NyaXB0IDw8IEwiKSI7Ci19Ci0KLUNYRkFfRk1Qb3NFeHByZXNzaW9uOjpDWEZBX0ZNUG9zRXhwcmVzc2lvbigKLSAgICB1aW50MzJfdCBsaW5lLAotICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cCkKLSAgICA6IENYRkFfRk1VbmFyeUV4cHJlc3Npb24obGluZSwgVE9LcGx1cywgc3RkOjptb3ZlKHBFeHApKSB7fQotCi12b2lkIENYRkFfRk1Qb3NFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7Ci0gIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtQT1NJVElWRV07Ci0gIGphdmFzY3JpcHQgPDwgTCIoIjsKLSAgbV9wRXhwLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gIGphdmFzY3JpcHQgPDwgTCIpIjsKLX0KLQotQ1hGQV9GTU5lZ0V4cHJlc3Npb246OkNYRkFfRk1OZWdFeHByZXNzaW9uKAotICAgIHVpbnQzMl90IGxpbmUsCi0gICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwKQotICAgIDogQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbihsaW5lLCBUT0ttaW51cywgc3RkOjptb3ZlKHBFeHApKSB7fQotCi12b2lkIENYRkFfRk1OZWdFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7Ci0gIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtORUdBVElWRV07Ci0gIGphdmFzY3JpcHQgPDwgTCIoIjsKLSAgbV9wRXhwLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gIGphdmFzY3JpcHQgPDwgTCIpIjsKLX0KLQotQ1hGQV9GTU5vdEV4cHJlc3Npb246OkNYRkFfRk1Ob3RFeHByZXNzaW9uKAotICAgIHVpbnQzMl90IGxpbmUsCi0gICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwKQotICAgIDogQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbihsaW5lLCBUT0trc25vdCwgc3RkOjptb3ZlKHBFeHApKSB7fQotCi12b2lkIENYRkFfRk1Ob3RFeHByZXNzaW9uOjpUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSB7Ci0gIGphdmFzY3JpcHQgPDwgZ3NfbHBTdHJFeHBGdW5jTmFtZVtOT1RdOwotICBqYXZhc2NyaXB0IDw8IEwiKCI7Ci0gIG1fcEV4cC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICBqYXZhc2NyaXB0IDw8IEwiKSI7Ci19Ci0KLUNYRkFfRk1DYWxsRXhwcmVzc2lvbjo6Q1hGQV9GTUNhbGxFeHByZXNzaW9uKAotICAgIHVpbnQzMl90IGxpbmUsCi0gICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwLAotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4+JiYgcEFyZ3VtZW50cywKLSAgICBib29sIGJJc1NvbU1ldGhvZCkKLSAgICA6IENYRkFfRk1VbmFyeUV4cHJlc3Npb24obGluZSwgVE9LY2FsbCwgc3RkOjptb3ZlKHBFeHApKSwKLSAgICAgIG1fYklzU29tTWV0aG9kKGJJc1NvbU1ldGhvZCksCi0gICAgICBtX0FyZ3VtZW50cyhzdGQ6Om1vdmUocEFyZ3VtZW50cykpIHt9Ci0KLUNYRkFfRk1DYWxsRXhwcmVzc2lvbjo6fkNYRkFfRk1DYWxsRXhwcmVzc2lvbigpIHt9Ci0KLWJvb2wgQ1hGQV9GTUNhbGxFeHByZXNzaW9uOjpJc0J1aWxkSW5GdW5jKENGWF9XaWRlVGV4dEJ1ZiogZnVuY05hbWUpIHsKLSAgdWludDMyX3QgdUhhc2ggPSBGWF9IYXNoQ29kZV9HZXRXKGZ1bmNOYW1lLT5Bc1N0cmluZ0MoKSwgdHJ1ZSk7Ci0gIGNvbnN0IFhGQV9GTUJ1aWxkSW5GdW5jKiBwRW5kID0gZ19CdWlsZEluRnVuY3MgKyBGWF9BcnJheVNpemUoZ19CdWlsZEluRnVuY3MpOwotICBjb25zdCBYRkFfRk1CdWlsZEluRnVuYyogcEZ1bmMgPQotICAgICAgc3RkOjpsb3dlcl9ib3VuZChnX0J1aWxkSW5GdW5jcywgcEVuZCwgdUhhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IFhGQV9GTUJ1aWxkSW5GdW5jJiBmdW5jLCB1aW50MzJfdCBoYXNoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMubV91SGFzaCA8IGhhc2g7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0pOwotICBpZiAocEZ1bmMgPCBwRW5kICYmIHVIYXNoID09IHBGdW5jLT5tX3VIYXNoKSB7Ci0gICAgZnVuY05hbWUtPkNsZWFyKCk7Ci0gICAgKmZ1bmNOYW1lIDw8IHBGdW5jLT5tX2J1aWxkaW5mdW5jOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdWludDMyX3QgQ1hGQV9GTUNhbGxFeHByZXNzaW9uOjpJc01ldGhvZFdpdGhPYmpQYXJhbSgKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIG1ldGhvZE5hbWUpIHsKLSAgdWludDMyX3QgdUhhc2ggPSBGWF9IYXNoQ29kZV9HZXRXKG1ldGhvZE5hbWUsIGZhbHNlKTsKLSAgWEZBX0ZNU09NTWV0aG9kIHNvbU1ldGhvZFdpdGhPYmpQYXJhOwotICB1aW50MzJfdCBwYXJhbWV0ZXJzID0gMHgwMDsKLSAgaW50MzJfdCBpU3RhcnQgPSAwLAotICAgICAgICAgIGlFbmQgPSAoc2l6ZW9mKGdzX0ZNU29tTWV0aG9kcykgLyBzaXplb2YoZ3NfRk1Tb21NZXRob2RzWzBdKSkgLSAxOwotICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOwotICBkbyB7Ci0gICAgaU1pZCA9IChpU3RhcnQgKyBpRW5kKSAvIDI7Ci0gICAgc29tTWV0aG9kV2l0aE9ialBhcmEgPSBnc19GTVNvbU1ldGhvZHNbaU1pZF07Ci0gICAgaWYgKHVIYXNoID09IHNvbU1ldGhvZFdpdGhPYmpQYXJhLm1fdUhhc2gpIHsKLSAgICAgIHBhcmFtZXRlcnMgPSBzb21NZXRob2RXaXRoT2JqUGFyYS5tX2RQYXJhbWV0ZXJzOwotICAgICAgYnJlYWs7Ci0gICAgfSBlbHNlIGlmICh1SGFzaCA8IHNvbU1ldGhvZFdpdGhPYmpQYXJhLm1fdUhhc2gpIHsKLSAgICAgIGlFbmQgPSBpTWlkIC0gMTsKLSAgICB9IGVsc2UgewotICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7Ci0gICAgfQotICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7Ci0gIHJldHVybiBwYXJhbWV0ZXJzOwotfQotCi12b2lkIENYRkFfRk1DYWxsRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgewotICBDRlhfV2lkZVRleHRCdWYgZnVuY05hbWU7Ci0gIG1fcEV4cC0+VG9KYXZhU2NyaXB0KGZ1bmNOYW1lKTsKLSAgaWYgKG1fYklzU29tTWV0aG9kKSB7Ci0gICAgamF2YXNjcmlwdCA8PCBmdW5jTmFtZTsKLSAgICBqYXZhc2NyaXB0IDw8IEwiKCI7Ci0gICAgdWludDMyX3QgbWV0aG9kUGFyYSA9IElzTWV0aG9kV2l0aE9ialBhcmFtKGZ1bmNOYW1lLkFzU3RyaW5nQygpKTsKLSAgICBpZiAobWV0aG9kUGFyYSA+IDApIHsKLSAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9Bcmd1bWVudHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgLy8gQ3VycmVudGx5IG5vbmUgb2Ygb3VyIGV4cHJlc3Npb25zIHVzZSBvYmplY3RzIGZvciBhIHBhcmFtZXRlciBvdmVyCi0gICAgICAgIC8vIHRoZSA2dGguIE1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVyZmxvdyB0aGUgc2hpZnQgd2hlbiBkb2luZyB0aGlzCi0gICAgICAgIC8vIGNoZWNrLiBJZiB3ZSBldmVyIG5lZWQgbW9yZSB0aGUgMzIgb2JqZWN0IHBhcmFtcyB3ZSBjYW4gcmV2aXNpdC4KLSAgICAgICAgaWYgKGkgPCAzMiAmJiAobWV0aG9kUGFyYSAmICgweDAxIDw8IGkpKSA+IDApIHsKLSAgICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbR0VURk1KU09CSl07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0dFVEZNVkFMVUVdOwotICAgICAgICB9Ci0gICAgICAgIGphdmFzY3JpcHQgPDwgTCIoIjsKLSAgICAgICAgY29uc3QgYXV0byYgZXhwciA9IG1fQXJndW1lbnRzW2ldOwotICAgICAgICBleHByLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gICAgICAgIGphdmFzY3JpcHQgPDwgTCIpIjsKLSAgICAgICAgaWYgKGkgKyAxIDwgbV9Bcmd1bWVudHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgamF2YXNjcmlwdCA8PCBMIiwgIjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKGNvbnN0IGF1dG8mIGV4cHIgOiBtX0FyZ3VtZW50cykgewotICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbR0VURk1WQUxVRV07Ci0gICAgICAgIGphdmFzY3JpcHQgPDwgTCIoIjsKLSAgICAgICAgZXhwci0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICAgICAgICBqYXZhc2NyaXB0IDw8IEwiKSI7Ci0gICAgICAgIGlmIChleHByICE9IG1fQXJndW1lbnRzLmJhY2soKSkKLSAgICAgICAgICBqYXZhc2NyaXB0IDw8IEwiLCAiOwotICAgICAgfQotICAgIH0KLSAgICBqYXZhc2NyaXB0IDw8IEwiKSI7Ci0gIH0gZWxzZSB7Ci0gICAgYm9vbCBpc0V2YWxGdW5jID0gZmFsc2U7Ci0gICAgYm9vbCBpc0V4aXN0c0Z1bmMgPSBmYWxzZTsKLSAgICBpZiAoSXNCdWlsZEluRnVuYygmZnVuY05hbWUpKSB7Ci0gICAgICBpZiAoZnVuY05hbWUuQXNTdHJpbmdDKCkgPT0gTCJFdmFsIikgewotICAgICAgICBpc0V2YWxGdW5jID0gdHJ1ZTsKLSAgICAgICAgamF2YXNjcmlwdCA8PCBMImV2YWwuY2FsbCh0aGlzLCAiOwotICAgICAgICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbQ0FMTF07Ci0gICAgICAgIGphdmFzY3JpcHQgPDwgTCJUcmFuc2xhdGUiOwotICAgICAgfSBlbHNlIGlmIChmdW5jTmFtZS5Bc1N0cmluZ0MoKSA9PSBMIkV4aXN0cyIpIHsKLSAgICAgICAgaXNFeGlzdHNGdW5jID0gdHJ1ZTsKLSAgICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0NBTExdOwotICAgICAgICBqYXZhc2NyaXB0IDw8IGZ1bmNOYW1lOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0NBTExdOwotICAgICAgICBqYXZhc2NyaXB0IDw8IGZ1bmNOYW1lOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBqYXZhc2NyaXB0IDw8IGZ1bmNOYW1lOwotICAgIH0KLSAgICBqYXZhc2NyaXB0IDw8IEwiKCI7Ci0gICAgaWYgKGlzRXhpc3RzRnVuYykgewotICAgICAgamF2YXNjcmlwdCA8PCBMIlxuKFxuZnVuY3Rpb24gKClcbntcbnRyeVxue1xuIjsKLSAgICAgIGlmICghbV9Bcmd1bWVudHMuZW1wdHkoKSkgewotICAgICAgICBjb25zdCBhdXRvJiBleHByID0gbV9Bcmd1bWVudHNbMF07Ci0gICAgICAgIGphdmFzY3JpcHQgPDwgTCJyZXR1cm4gIjsKLSAgICAgICAgZXhwci0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICAgICAgICBqYXZhc2NyaXB0IDw8IEwiO1xufVxuIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGphdmFzY3JpcHQgPDwgTCJyZXR1cm4gMDtcbn1cbiI7Ci0gICAgICB9Ci0gICAgICBqYXZhc2NyaXB0Ci0gICAgICAgICAgPDwgTCJjYXRjaChhY2Nlc3NFeGNlcHRpb25zKVxue1xucmV0dXJuIDA7XG59XG59XG4pLmNhbGwodGhpcylcbiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAoY29uc3QgYXV0byYgZXhwciA6IG1fQXJndW1lbnRzKSB7Ci0gICAgICAgIGV4cHItPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsKLSAgICAgICAgaWYgKGV4cHIgIT0gbV9Bcmd1bWVudHMuYmFjaygpKQotICAgICAgICAgIGphdmFzY3JpcHQgPDwgTCIsICI7Ci0gICAgICB9Ci0gICAgfQotICAgIGphdmFzY3JpcHQgPDwgTCIpIjsKLSAgICBpZiAoaXNFdmFsRnVuYykgewotICAgICAgamF2YXNjcmlwdCA8PCBMIikiOwotICAgIH0KLSAgfQotfQotCi1DWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uOjpDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uKAotICAgIHVpbnQzMl90IGxpbmUsCi0gICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwQWNjZXNzb3IsCi0gICAgWEZBX0ZNX1RPS0VOIG9wLAotICAgIENGWF9XaWRlU3RyaW5nQyB3c0lkZW50aWZpZXIsCi0gICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwSW5kZXhFeHApCi0gICAgOiBDWEZBX0ZNQmluRXhwcmVzc2lvbihsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocEFjY2Vzc29yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwSW5kZXhFeHApKSwKLSAgICAgIG1fd3NJZGVudGlmaWVyKHdzSWRlbnRpZmllcikge30KLQotQ1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbjo6fkNYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24oKSB7fQotCi12b2lkIENYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKLSAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0RPVF07Ci0gIGphdmFzY3JpcHQgPDwgTCIoIjsKLSAgaWYgKG1fcEV4cDEpIHsKLSAgICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gIH0gZWxzZSB7Ci0gICAgamF2YXNjcmlwdCA8PCBMIm51bGwiOwotICB9Ci0gIGphdmFzY3JpcHQgPDwgTCIsICI7Ci0gIGphdmFzY3JpcHQgPDwgTCJcIiI7Ci0gIGlmIChtX3BFeHAxICYmIG1fcEV4cDEtPkdldE9wZXJhdG9yVG9rZW4oKSA9PSBUT0tpZGVudGlmaWVyKSB7Ci0gICAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICB9Ci0gIGphdmFzY3JpcHQgPDwgTCJcIiwgIjsKLSAgaWYgKG1fb3AgPT0gVE9LZG90c2NyZWFtKSB7Ci0gICAgamF2YXNjcmlwdCA8PCBMIlwiIyI7Ci0gICAgamF2YXNjcmlwdCA8PCBtX3dzSWRlbnRpZmllcjsKLSAgICBqYXZhc2NyaXB0IDw8IEwiXCIsICI7Ci0gIH0gZWxzZSBpZiAobV9vcCA9PSBUT0tkb3RzdGFyKSB7Ci0gICAgamF2YXNjcmlwdCA8PCBMIlwiKlwiLCAiOwotICB9IGVsc2UgaWYgKG1fb3AgPT0gVE9LY2FsbCkgewotICAgIGphdmFzY3JpcHQgPDwgTCJcIlwiLCAiOwotICB9IGVsc2UgewotICAgIGphdmFzY3JpcHQgPDwgTCJcIiI7Ci0gICAgamF2YXNjcmlwdCA8PCBtX3dzSWRlbnRpZmllcjsKLSAgICBqYXZhc2NyaXB0IDw8IEwiXCIsICI7Ci0gIH0KLSAgbV9wRXhwMi0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICBqYXZhc2NyaXB0IDw8IEwiKSI7Ci19Ci0KLUNYRkFfRk1JbmRleEV4cHJlc3Npb246OkNYRkFfRk1JbmRleEV4cHJlc3Npb24oCi0gICAgdWludDMyX3QgbGluZSwKLSAgICBYRkFfRk1fQWNjZXNzb3JJbmRleCBhY2Nlc3NvckluZGV4LAotICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEluZGV4RXhwLAotICAgIGJvb2wgYklzU3RhckluZGV4KQotICAgIDogQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbihsaW5lLCBUT0tsYnJhY2tldCwgc3RkOjptb3ZlKHBJbmRleEV4cCkpLAotICAgICAgbV9hY2Nlc3NvckluZGV4KGFjY2Vzc29ySW5kZXgpLAotICAgICAgbV9iSXNTdGFySW5kZXgoYklzU3RhckluZGV4KSB7fQotCi12b2lkIENYRkFfRk1JbmRleEV4cHJlc3Npb246OlRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIHsKLSAgc3dpdGNoIChtX2FjY2Vzc29ySW5kZXgpIHsKLSAgICBjYXNlIEFDQ0VTU09SX05PX0lOREVYOgotICAgICAgamF2YXNjcmlwdCA8PCBMIjAiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQ0NFU1NPUl9OT19SRUxBVElWRUlOREVYOgotICAgICAgamF2YXNjcmlwdCA8PCBMIjEiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBQ0NFU1NPUl9QT1NJVElWRV9JTkRFWDoKLSAgICAgIGphdmFzY3JpcHQgPDwgTCIyIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQUNDRVNTT1JfTkVHQVRJVkVfSU5ERVg6Ci0gICAgICBqYXZhc2NyaXB0IDw8IEwiMyI7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgamF2YXNjcmlwdCA8PCBMIjAiOwotICB9Ci0gIGlmICghbV9iSXNTdGFySW5kZXgpIHsKLSAgICBqYXZhc2NyaXB0IDw8IEwiLCAiOwotICAgIGlmIChtX3BFeHApIHsKLSAgICAgIG1fcEV4cC0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBqYXZhc2NyaXB0IDw8IEwiMCI7Ci0gICAgfQotICB9Ci19Ci0KLUNYRkFfRk1Eb3REb3RBY2Nlc3NvckV4cHJlc3Npb246OkNYRkFfRk1Eb3REb3RBY2Nlc3NvckV4cHJlc3Npb24oCi0gICAgdWludDMyX3QgbGluZSwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBBY2Nlc3NvciwKLSAgICBYRkFfRk1fVE9LRU4gb3AsCi0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSWRlbnRpZmllciwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBJbmRleEV4cCkKLSAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwQWNjZXNzb3IpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHBJbmRleEV4cCkpLAotICAgICAgbV93c0lkZW50aWZpZXIod3NJZGVudGlmaWVyKSB7fQotCi1DWEZBX0ZNRG90RG90QWNjZXNzb3JFeHByZXNzaW9uOjp+Q1hGQV9GTURvdERvdEFjY2Vzc29yRXhwcmVzc2lvbigpIHt9Ci0KLXZvaWQgQ1hGQV9GTURvdERvdEFjY2Vzc29yRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KAotICAgIENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgewotICBqYXZhc2NyaXB0IDw8IGdzX2xwU3RyRXhwRnVuY05hbWVbRE9URE9UXTsKLSAgamF2YXNjcmlwdCA8PCBMIigiOwotICBtX3BFeHAxLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gIGphdmFzY3JpcHQgPDwgTCIsICI7Ci0gIGphdmFzY3JpcHQgPDwgTCJcIiI7Ci0gIGlmIChtX3BFeHAxICYmIG1fcEV4cDEtPkdldE9wZXJhdG9yVG9rZW4oKSA9PSBUT0tpZGVudGlmaWVyKSB7Ci0gICAgbV9wRXhwMS0+VG9KYXZhU2NyaXB0KGphdmFzY3JpcHQpOwotICB9Ci0gIGphdmFzY3JpcHQgPDwgTCJcIiwgIjsKLSAgamF2YXNjcmlwdCA8PCBMIlwiIjsKLSAgamF2YXNjcmlwdCA8PCBtX3dzSWRlbnRpZmllcjsKLSAgamF2YXNjcmlwdCA8PCBMIlwiLCAiOwotICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gIGphdmFzY3JpcHQgPDwgTCIpIjsKLX0KLQotQ1hGQV9GTU1ldGhvZENhbGxFeHByZXNzaW9uOjpDWEZBX0ZNTWV0aG9kQ2FsbEV4cHJlc3Npb24oCi0gICAgdWludDMyX3QgbGluZSwKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBBY2Nlc3NvckV4cDEsCi0gICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwQ2FsbEV4cCkKLSAgICA6IENYRkFfRk1CaW5FeHByZXNzaW9uKGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBUT0tkb3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocEFjY2Vzc29yRXhwMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUocENhbGxFeHApKSB7fQotCi12b2lkIENYRkFfRk1NZXRob2RDYWxsRXhwcmVzc2lvbjo6VG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgewotICBqYXZhc2NyaXB0IDw8IEwiKFxuZnVuY3Rpb24gKClcbntcbiI7Ci0gIGphdmFzY3JpcHQgPDwgTCJ2YXIgbWV0aG9kX3JldHVybl92YWx1ZSA9IG51bGw7XG4iOwotICBqYXZhc2NyaXB0IDw8IEwidmFyIGFjY2Vzc29yX29iamVjdCA9ICI7Ci0gIG1fcEV4cDEtPlRvSmF2YVNjcmlwdChqYXZhc2NyaXB0KTsKLSAgamF2YXNjcmlwdCA8PCBMIjtcbiI7Ci0gIGphdmFzY3JpcHQgPDwgTCJpZiAoIjsKLSAgamF2YXNjcmlwdCA8PCBnc19scFN0ckV4cEZ1bmNOYW1lW0lTRk1BUlJBWV07Ci0gIGphdmFzY3JpcHQgPDwgTCIoYWNjZXNzb3Jfb2JqZWN0KSlcbntcbiI7Ci0gIGphdmFzY3JpcHQgPDwgTCJmb3IodmFyIGluZGV4ID0gYWNjZXNzb3Jfb2JqZWN0Lmxlbmd0aCAtIDE7IGluZGV4ID4gMTsgIgotICAgICAgICAgICAgICAgIEwiaW5kZXgtLSlcbntcbiI7Ci0gIGphdmFzY3JpcHQgPDwgTCJtZXRob2RfcmV0dXJuX3ZhbHVlID0gYWNjZXNzb3Jfb2JqZWN0W2luZGV4XS4iOwotICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gIGphdmFzY3JpcHQgPDwgTCI7XG59XG59XG4iOwotICBqYXZhc2NyaXB0IDw8IEwiZWxzZVxue1xubWV0aG9kX3JldHVybl92YWx1ZSA9IGFjY2Vzc29yX29iamVjdC4iOwotICBtX3BFeHAyLT5Ub0phdmFTY3JpcHQoamF2YXNjcmlwdCk7Ci0gIGphdmFzY3JpcHQgPDwgTCI7XG59XG4iOwotICBqYXZhc2NyaXB0IDw8IEwicmV0dXJuIG1ldGhvZF9yZXR1cm5fdmFsdWU7XG4iOwotICBqYXZhc2NyaXB0IDw8IEwifVxuKS5jYWxsKHRoaXMpIjsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL2ZtMmpzL3hmYV9zaW1wbGVleHByZXNzaW9uLmggYi94ZmEvZnhmYS9mbTJqcy94ZmFfc2ltcGxlZXhwcmVzc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjFkMDJlLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2ZtMmpzL3hmYV9zaW1wbGVleHByZXNzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEZBX0ZNMkpTX1hGQV9TSU1QTEVFWFBSRVNTSU9OX0hfCi0jZGVmaW5lIFhGQV9GWEZBX0ZNMkpTX1hGQV9TSU1QTEVFWFBSRVNTSU9OX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgotI2luY2x1ZGUgInhmYS9meGZhL2ZtMmpzL3hmYV9sZXhlci5oIgotCi0jZGVmaW5lIFJVTlRJTUVGVU5DVElPTlJFVFVSTlZBTFVFIFwKLSAgKEwiZm94aXRfeGZhX2Zvcm1jYWxjX3J1bnRpbWVfZnVuY19yZXR1cm5fdmFsdWUiKQotI2RlZmluZSBFWENMQU1BVElPTl9JTl9JREVOVElGSUVSIChMImZveGl0X3hmYV9mb3JtY2FsY19fZXhjbGFtYXRpb25fXyIpCi0KLWVudW0gWEZBX0ZNX1NpbXBsZUV4cHJlc3Npb25UeXBlIHsKLSAgQVNTSUdOLAotICBMT0dJQ0FMT1IsCi0gIExPR0lDQUxBTkQsCi0gIEVRVUFMSVRZLAotICBOT1RFUVVBTElUWSwKLSAgTEVTUywKLSAgTEVTU0VRVUFMLAotICBHUkVBVEVSLAotICBHUkVBVEVSRVFVQUwsCi0gIFBMVVMsCi0gIE1JTlVTLAotICBNVUxUSVBMRSwKLSAgRElWSURFLAotICBQT1NJVElWRSwKLSAgTkVHQVRJVkUsCi0gIE5PVCwKLSAgQ0FMTCwKLSAgRE9ULAotICBET1RET1QsCi0gIENPTkNBVEZNT0JKRUNULAotICBJU0ZNT0JKRUNULAotICBJU0ZNQVJSQVksCi0gIEdFVEZNVkFMVUUsCi0gIEdFVEZNSlNPQkosCi0gIFZBUkZJTFRFUgotfTsKLQotQ0ZYX1dpZGVTdHJpbmdDIFhGQV9GTV9FWFBUeXBlVG9TdHJpbmcoCi0gICAgWEZBX0ZNX1NpbXBsZUV4cHJlc3Npb25UeXBlIHNpbXBsZUV4cFR5cGUpOwotCi1lbnVtIFhGQV9GTV9BY2Nlc3NvckluZGV4IHsKLSAgQUNDRVNTT1JfTk9fSU5ERVgsCi0gIEFDQ0VTU09SX05PX1JFTEFUSVZFSU5ERVgsCi0gIEFDQ0VTU09SX1BPU0lUSVZFX0lOREVYLAotICBBQ0NFU1NPUl9ORUdBVElWRV9JTkRFWAotfTsKLQotY2xhc3MgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gewotIHB1YmxpYzoKLSAgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24odWludDMyX3QgbGluZSwgWEZBX0ZNX1RPS0VOIG9wKTsKLSAgdmlydHVhbCB+Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24oKSB7fQotICB2aXJ0dWFsIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCk7Ci0gIHZpcnR1YWwgdm9pZCBUb0ltcGxpZWRSZXR1cm5KUyhDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpOwotCi0gIFhGQV9GTV9UT0tFTiBHZXRPcGVyYXRvclRva2VuKCkgY29uc3Q7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHVpbnQzMl90IG1fbGluZTsKLSAgWEZBX0ZNX1RPS0VOIG1fb3A7Ci19OwotCi1jbGFzcyBDWEZBX0ZNTnVsbEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVNpbXBsZUV4cHJlc3Npb24gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9GTU51bGxFeHByZXNzaW9uKHVpbnQzMl90IGxpbmUpOwotICB+Q1hGQV9GTU51bGxFeHByZXNzaW9uKCkgb3ZlcnJpZGUge30KLSAgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKLX07Ci0KLWNsYXNzIENYRkFfRk1OdW1iZXJFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uIHsKLSBwdWJsaWM6Ci0gIENYRkFfRk1OdW1iZXJFeHByZXNzaW9uKHVpbnQzMl90IGxpbmUsIENGWF9XaWRlU3RyaW5nQyB3c051bWJlcik7Ci0gIH5DWEZBX0ZNTnVtYmVyRXhwcmVzc2lvbigpIG92ZXJyaWRlOwotICB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgQ0ZYX1dpZGVTdHJpbmdDIG1fd3NOdW1iZXI7Ci19OwotCi1jbGFzcyBDWEZBX0ZNU3RyaW5nRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiB7Ci0gcHVibGljOgotICBDWEZBX0ZNU3RyaW5nRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lLCBDRlhfV2lkZVN0cmluZ0Mgd3NTdHJpbmcpOwotICB+Q1hGQV9GTVN0cmluZ0V4cHJlc3Npb24oKSBvdmVycmlkZTsKLSAgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIENGWF9XaWRlU3RyaW5nQyBtX3dzU3RyaW5nOwotfTsKLQotY2xhc3MgQ1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1TaW1wbGVFeHByZXNzaW9uIHsKLSBwdWJsaWM6Ci0gIENYRkFfRk1JZGVudGlmaWVyRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lLCBDRlhfV2lkZVN0cmluZ0Mgd3NJZGVudGlmaWVyKTsKLSAgfkNYRkFfRk1JZGVudGlmaWVyRXhwcmVzc2lvbigpIG92ZXJyaWRlOwotICB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOwotCi0gcHJpdmF0ZToKLSAgQ0ZYX1dpZGVTdHJpbmdDIG1fd3NJZGVudGlmaWVyOwotfTsKLQotY2xhc3MgQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiB7Ci0gcHVibGljOgotICBDWEZBX0ZNVW5hcnlFeHByZXNzaW9uKHVpbnQzMl90IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNX1RPS0VOIG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cCk7Ci0gIH5DWEZBX0ZNVW5hcnlFeHByZXNzaW9uKCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKLQotIHByb3RlY3RlZDoKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBtX3BFeHA7Ci19OwotCi1jbGFzcyBDWEZBX0ZNQmluRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbiB7Ci0gcHVibGljOgotICBDWEZBX0ZNQmluRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1fVE9LRU4gb3AsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cDEsCi0gICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cDIpOwotICB+Q1hGQV9GTUJpbkV4cHJlc3Npb24oKSBvdmVycmlkZTsKLQotICB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IG1fcEV4cDE7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gbV9wRXhwMjsKLX07Ci0KLWNsYXNzIENYRkFfRk1Bc3NpZ25FeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1CaW5FeHByZXNzaW9uIHsKLSBwdWJsaWM6Ci0gIENYRkFfRk1Bc3NpZ25FeHByZXNzaW9uKHVpbnQzMl90IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GTV9UT0tFTiBvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMik7Ci0gIH5DWEZBX0ZNQXNzaWduRXhwcmVzc2lvbigpIG92ZXJyaWRlIHt9Ci0gIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgb3ZlcnJpZGU7Ci0gIHZvaWQgVG9JbXBsaWVkUmV0dXJuSlMoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKLX07Ci0KLWNsYXNzIENYRkFfRk1Mb2dpY2FsT3JFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1CaW5FeHByZXNzaW9uIHsKLSBwdWJsaWM6Ci0gIENYRkFfRk1Mb2dpY2FsT3JFeHByZXNzaW9uKHVpbnQzMl90IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GTV9UT0tFTiBvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMik7Ci0gIH5DWEZBX0ZNTG9naWNhbE9yRXhwcmVzc2lvbigpIG92ZXJyaWRlIHt9Ci0gIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgb3ZlcnJpZGU7Ci19OwotCi1jbGFzcyBDWEZBX0ZNTG9naWNhbEFuZEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24gewotIHB1YmxpYzoKLSAgQ1hGQV9GTUxvZ2ljYWxBbmRFeHByZXNzaW9uKHVpbnQzMl90IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1fVE9LRU4gb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMik7Ci0gIH5DWEZBX0ZNTG9naWNhbEFuZEV4cHJlc3Npb24oKSBvdmVycmlkZSB7fQotICB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOwotfTsKLQotY2xhc3MgQ1hGQV9GTUVxdWFsaXR5RXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbiB7Ci0gcHVibGljOgotICBDWEZBX0ZNRXF1YWxpdHlFeHByZXNzaW9uKHVpbnQzMl90IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNX1RPS0VOIG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMik7Ci0gIH5DWEZBX0ZNRXF1YWxpdHlFeHByZXNzaW9uKCkgb3ZlcnJpZGUge30KLSAgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKLX07Ci0KLWNsYXNzIENYRkFfRk1SZWxhdGlvbmFsRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbiB7Ci0gcHVibGljOgotICBDWEZBX0ZNUmVsYXRpb25hbEV4cHJlc3Npb24odWludDMyX3QgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9GTV9UT0tFTiBvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAyKTsKLSAgfkNYRkFfRk1SZWxhdGlvbmFsRXhwcmVzc2lvbigpIG92ZXJyaWRlIHt9Ci0gIHZvaWQgVG9KYXZhU2NyaXB0KENGWF9XaWRlVGV4dEJ1ZiYgamF2YXNjcmlwdCkgb3ZlcnJpZGU7Ci19OwotCi1jbGFzcyBDWEZBX0ZNQWRkaXRpdmVFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1CaW5FeHByZXNzaW9uIHsKLSBwdWJsaWM6Ci0gIENYRkFfRk1BZGRpdGl2ZUV4cHJlc3Npb24odWludDMyX3QgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRk1fVE9LRU4gb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwRXhwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAyKTsKLSAgfkNYRkFfRk1BZGRpdGl2ZUV4cHJlc3Npb24oKSBvdmVycmlkZSB7fQotICB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOwotfTsKLQotY2xhc3MgQ1hGQV9GTU11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbiB7Ci0gcHVibGljOgotICBDWEZBX0ZNTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKAotICAgICAgdWludDMyX3QgbGluZSwKLSAgICAgIFhGQV9GTV9UT0tFTiBvcCwKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cDEsCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHAyKTsKLSAgfkNYRkFfRk1NdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKSBvdmVycmlkZSB7fQotICB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOwotfTsKLQotY2xhc3MgQ1hGQV9GTVBvc0V4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbiB7Ci0gcHVibGljOgotICBDWEZBX0ZNUG9zRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHApOwotICB+Q1hGQV9GTVBvc0V4cHJlc3Npb24oKSBvdmVycmlkZSB7fQotICB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOwotfTsKLQotY2xhc3MgQ1hGQV9GTU5lZ0V4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbiB7Ci0gcHVibGljOgotICBDWEZBX0ZNTmVnRXhwcmVzc2lvbih1aW50MzJfdCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHApOwotICB+Q1hGQV9GTU5lZ0V4cHJlc3Npb24oKSBvdmVycmlkZSB7fQotICB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOwotfTsKLQotY2xhc3MgQ1hGQV9GTU5vdEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbiB7Ci0gcHVibGljOgotICBDWEZBX0ZNTm90RXhwcmVzc2lvbih1aW50MzJfdCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBFeHApOwotICB+Q1hGQV9GTU5vdEV4cHJlc3Npb24oKSBvdmVycmlkZSB7fQotICB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOwotfTsKLQotY2xhc3MgQ1hGQV9GTUNhbGxFeHByZXNzaW9uIDogcHVibGljIENYRkFfRk1VbmFyeUV4cHJlc3Npb24gewotIHB1YmxpYzoKLSAgQ1hGQV9GTUNhbGxFeHByZXNzaW9uKAotICAgICAgdWludDMyX3QgbGluZSwKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEV4cCwKLSAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4+JiYgcEFyZ3VtZW50cywKLSAgICAgIGJvb2wgYklzU29tTWV0aG9kKTsKLSAgfkNYRkFfRk1DYWxsRXhwcmVzc2lvbigpIG92ZXJyaWRlOwotCi0gIGJvb2wgSXNCdWlsZEluRnVuYyhDRlhfV2lkZVRleHRCdWYqIGZ1bmNOYW1lKTsKLSAgdWludDMyX3QgSXNNZXRob2RXaXRoT2JqUGFyYW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBtZXRob2ROYW1lKTsKLSAgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIGJvb2wgbV9iSXNTb21NZXRob2Q7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4+IG1fQXJndW1lbnRzOwotfTsKLQotY2xhc3MgQ1hGQV9GTURvdEFjY2Vzc29yRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbiB7Ci0gcHVibGljOgotICBDWEZBX0ZNRG90QWNjZXNzb3JFeHByZXNzaW9uKAotICAgICAgdWludDMyX3QgbGluZSwKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEFjY2Vzc29yLAotICAgICAgWEZBX0ZNX1RPS0VOIG9wLAotICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSWRlbnRpZmllciwKLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZNU2ltcGxlRXhwcmVzc2lvbj4gcEluZGV4RXhwKTsKLSAgfkNYRkFfRk1Eb3RBY2Nlc3NvckV4cHJlc3Npb24oKSBvdmVycmlkZTsKLSAgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIENGWF9XaWRlU3RyaW5nQyBtX3dzSWRlbnRpZmllcjsKLX07Ci0KLWNsYXNzIENYRkFfRk1JbmRleEV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTVVuYXJ5RXhwcmVzc2lvbiB7Ci0gcHVibGljOgotICBDWEZBX0ZNSW5kZXhFeHByZXNzaW9uKHVpbnQzMl90IGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0ZNX0FjY2Vzc29ySW5kZXggYWNjZXNzb3JJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBJbmRleEV4cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJc1N0YXJJbmRleCk7Ci0gIH5DWEZBX0ZNSW5kZXhFeHByZXNzaW9uKCkgb3ZlcnJpZGUge30KLSAgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIFhGQV9GTV9BY2Nlc3NvckluZGV4IG1fYWNjZXNzb3JJbmRleDsKLSAgYm9vbCBtX2JJc1N0YXJJbmRleDsKLX07Ci0KLWNsYXNzIENYRkFfRk1Eb3REb3RBY2Nlc3NvckV4cHJlc3Npb24gOiBwdWJsaWMgQ1hGQV9GTUJpbkV4cHJlc3Npb24gewotIHB1YmxpYzoKLSAgQ1hGQV9GTURvdERvdEFjY2Vzc29yRXhwcmVzc2lvbigKLSAgICAgIHVpbnQzMl90IGxpbmUsCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBBY2Nlc3NvciwKLSAgICAgIFhGQV9GTV9UT0tFTiBvcCwKLSAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0lkZW50aWZpZXIsCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+IHBJbmRleEV4cCk7Ci0gIH5DWEZBX0ZNRG90RG90QWNjZXNzb3JFeHByZXNzaW9uKCkgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBUb0phdmFTY3JpcHQoQ0ZYX1dpZGVUZXh0QnVmJiBqYXZhc2NyaXB0KSBvdmVycmlkZTsKLQotIHByaXZhdGU6Ci0gIENGWF9XaWRlU3RyaW5nQyBtX3dzSWRlbnRpZmllcjsKLX07Ci0KLWNsYXNzIENYRkFfRk1NZXRob2RDYWxsRXhwcmVzc2lvbiA6IHB1YmxpYyBDWEZBX0ZNQmluRXhwcmVzc2lvbiB7Ci0gcHVibGljOgotICBDWEZBX0ZNTWV0aG9kQ2FsbEV4cHJlc3Npb24oCi0gICAgICB1aW50MzJfdCBsaW5lLAotICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwQWNjZXNzb3JFeHAxLAotICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPiBwQ2FsbEV4cCk7Ci0gIH5DWEZBX0ZNTWV0aG9kQ2FsbEV4cHJlc3Npb24oKSBvdmVycmlkZSB7fQotICB2b2lkIFRvSmF2YVNjcmlwdChDRlhfV2lkZVRleHRCdWYmIGphdmFzY3JpcHQpIG92ZXJyaWRlOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhGQV9GTTJKU19YRkFfU0lNUExFRVhQUkVTU0lPTl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvZm0yanMveGZhX3NpbXBsZWV4cHJlc3Npb25fdW5pdHRlc3QuY3BwIGIveGZhL2Z4ZmEvZm0yanMveGZhX3NpbXBsZWV4cHJlc3Npb25fdW5pdHRlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODI2ZDliLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL2ZtMmpzL3hmYV9zaW1wbGVleHByZXNzaW9uX3VuaXR0ZXN0LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgInhmYS9meGZhL2ZtMmpzL3hmYV9zaW1wbGVleHByZXNzaW9uLmgiCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9mbTJqcy94ZmFfbGV4ZXIuaCIKLQotVEVTVChGTUNhbGxFeHByZXNzaW9uLCBtb3JlX3RoYW5fMzJfYXJndW1lbnRzKSB7Ci0gIC8vIFVzZSBzaWduIGFzIGl0IGhhcyAzIG9iamVjdCBwYXJhbWV0ZXJzIGF0IHBvc2l0aW9ucyAwLCA1LCBhbmQgNi4KLSAgYXV0byBleHAgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GTUlkZW50aWZpZXJFeHByZXNzaW9uPigwLCBMInNpZ24iKTsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTVNpbXBsZUV4cHJlc3Npb24+PiBhcmdzOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDUwOyBpKyspCi0gICAgYXJncy5wdXNoX2JhY2socGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRk1TaW1wbGVFeHByZXNzaW9uPigwLCBUT0tuYW4pKTsKLQotICBDWEZBX0ZNQ2FsbEV4cHJlc3Npb24gY2FsbEV4cCgwLCBzdGQ6Om1vdmUoZXhwKSwgc3RkOjptb3ZlKGFyZ3MpLCB0cnVlKTsKLSAgQ0ZYX1dpZGVUZXh0QnVmIGpzOwotICBjYWxsRXhwLlRvSmF2YVNjcmlwdChqcyk7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHJlc3VsdCBqYXZhc2NyaXB0IHN0cmluZy4KLSAgQ0ZYX1dpZGVTdHJpbmcgcmVzdWx0ID0gTCJzaWduKCI7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgNTA7IGkrKykgewotICAgIGlmIChpID4gMCkKLSAgICAgIHJlc3VsdCArPSBMIiwgIjsKLQotICAgIHJlc3VsdCArPSBMImZveGl0X3hmYV9mb3JtY2FsY19ydW50aW1lLmdldF9mbV8iOwotICAgIC8vIE9iamVjdCBwb3NpdGlvbnMgZm9yIHNpZ24oKSBtZXRob2QuCi0gICAgaWYgKGkgPT0gMCB8fCBpID09IDUgfHwgaSA9PSA2KQotICAgICAgcmVzdWx0ICs9IEwianNvYmooKSI7Ci0gICAgZWxzZQotICAgICAgcmVzdWx0ICs9IEwidmFsdWUoKSI7Ci0gIH0KLSAgcmVzdWx0ICs9IEwiKSI7Ci0KLSAgRVhQRUNUX0VRKHJlc3VsdC5Bc1N0cmluZ0MoKSwganMuQXNTdHJpbmdDKCkpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvZnhmYS5oIGIveGZhL2Z4ZmEvZnhmYS5oCmluZGV4IGRkNWZjMGYuLmQ0MmNkMWIgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL2Z4ZmEuaAorKysgYi94ZmEvZnhmYS9meGZhLmgKQEAgLTksMjIgKzksMTUgQEAKIAogI2luY2x1ZGUgPHZlY3Rvcj4KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3JldGFpbl9wdHIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX3dpZGdldGFjYy5oIgogI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmFfYmFzaWMuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9meGZhX3dpZGdldC5oIgogCi1jbGFzcyBDRkdBU19HRUZvbnQ7Ci1jbGFzcyBDRlhfR3JhcGhpY3M7Ci1jbGFzcyBDUERGX0RvY3VtZW50OwogY2xhc3MgQ1hGQV9GRlBhZ2VWaWV3OwotY2xhc3MgQ1hGQV9Ob2RlOwotY2xhc3MgQ1hGQV9Ob2RlTGlzdDsKK2NsYXNzIENYRkFfU3VibWl0OwogY2xhc3MgQ1hGQV9XaWRnZXRBY2M7CiBjbGFzcyBJRldMX0FkYXB0ZXJUaW1lck1ncjsKLWNsYXNzIElYRkFfQXBwUHJvdmlkZXI7Ci1jbGFzcyBJWEZBX0RvY0Vudmlyb25tZW50OwotY2xhc3MgSVhGQV9XaWRnZXRBY2NJdGVyYXRvcjsKLWNsYXNzIElYRkFfV2lkZ2V0SXRlcmF0b3I7CitjbGFzcyBJRlhfU2Vla2FibGVSZWFkU3RyZWFtOwogCiAjZGVmaW5lIFhGQV9NQklDT05fRXJyb3IgMAogI2RlZmluZSBYRkFfTUJJQ09OX1dhcm5pbmcgMQpAQCAtMzksMjQgKzMyLDIwIEBACiAjZGVmaW5lIFhGQV9JRE5vIDMKICNkZWZpbmUgWEZBX0lEWWVzIDQKIAotI2RlZmluZSBYRkFfRE9DVklFV19WaWV3IDB4MDAwMDAwMDAKLSNkZWZpbmUgWEZBX0RPQ1ZJRVdfTWFzdGVyUGFnZSAweDAwMDAwMDAxCi0jZGVmaW5lIFhGQV9ET0NWSUVXX0Rlc2lnbiAweDAwMDAwMDAyCi0jZGVmaW5lIFhGQV9ET0NUWVBFX0R5bmFtaWMgMAotI2RlZmluZSBYRkFfRE9DVFlQRV9TdGF0aWMgMQotI2RlZmluZSBYRkFfRE9DVFlQRV9YRFAgMgorLy8gTm90ZSwgdmFsdWVzIG11c3QgbWF0Y2ggZnBkZl9mb3JtZmlsbC5oIEZPUk1UWVBFXyogZmxhZ3MuCitlbnVtIGNsYXNzIEZvcm1UeXBlIHsKKyAga05vbmUgPSAwLAorICBrQWNyb0Zvcm0gPSAxLAorICBrWEZBRnVsbCA9IDIsCisgIGtYRkFGb3JlZ3JvdW5kID0gMywKK307CisKICNkZWZpbmUgWEZBX1BBUlNFU1RBVFVTX1N0YXR1c0VyciAtMwogI2RlZmluZSBYRkFfUEFSU0VTVEFUVVNfU3RyZWFtRXJyIC0yCiAjZGVmaW5lIFhGQV9QQVJTRVNUQVRVU19TeW50YXhFcnIgLTEKICNkZWZpbmUgWEZBX1BBUlNFU1RBVFVTX1JlYWR5IDAKICNkZWZpbmUgWEZBX1BBUlNFU1RBVFVTX0RvbmUgMTAwCi0jZGVmaW5lIFhGQV9WQUxJREFURV9wcmVTdWJtaXQgMQotI2RlZmluZSBYRkFfVkFMSURBVEVfcHJlUHJpbnQgMgotI2RlZmluZSBYRkFfVkFMSURBVEVfcHJlRXhlY3V0ZSAzCi0jZGVmaW5lIFhGQV9WQUxJREFURV9wcmVTYXZlIDQKIAotI2RlZmluZSBYRkFfSU5WQUxJREFURV9BbGxQYWdlcyAweDAwMDAwMDAwCi0jZGVmaW5lIFhGQV9JTlZBTElEQVRFX0N1cnJlbnRQYWdlIDB4MDAwMDAwMDEKICNkZWZpbmUgWEZBX1BSSU5UT1BUX1Nob3dEaWFsb2cgMHgwMDAwMDAwMQogI2RlZmluZSBYRkFfUFJJTlRPUFRfQ2FuQ2FuY2VsIDB4MDAwMDAwMDIKICNkZWZpbmUgWEZBX1BSSU5UT1BUX1Nocmlua1BhZ2UgMHgwMDAwMDAwNApAQCAtNzIsMTEgKzYxLDYgQEAKICNkZWZpbmUgWEZBX0VWRU5URVJST1JfTm90RXhpc3QgMAogI2RlZmluZSBYRkFfRVZFTlRFUlJPUl9EaXNhYmxlZCAyCiAKLSNkZWZpbmUgWEZBX1JFTkRFUlNUQVRVU19SZWFkeSAxCi0jZGVmaW5lIFhGQV9SRU5ERVJTVEFUVVNfVG9CZUNvbnRpbnVlZCAyCi0jZGVmaW5lIFhGQV9SRU5ERVJTVEFUVVNfRG9uZSAzCi0jZGVmaW5lIFhGQV9SRU5ERVJTVEFUVVNfRmFpbGVkIC0xCi0KICNkZWZpbmUgWEZBX1RSQVZFUlNFV0FZX1RyYW52YWxzZSAweDAwMDEKICNkZWZpbmUgWEZBX1RSQVZFUlNFV0FZX0Zvcm0gMHgwMDAyCiAKQEAgLTk1LDEwICs3OSw2IEBACiAgIFhGQV9XaWRnZXRTdGF0dXNfVmlzaWJsZSA9IDEgPDwgOQogfTsKIAotZW51bSBYRkFfV0lER0VUT1JERVIgewotICBYRkFfV0lER0VUT1JERVJfUHJlT3JkZXIsCi19OwotCiBlbnVtIFhGQV9XSURHRVRUWVBFIHsKICAgWEZBX1dJREdFVFRZUEVfQmFyY29kZSwKICAgWEZBX1dJREdFVFRZUEVfUHVzaEJ1dHRvbiwKQEAgLTEzMSwyMiArMTExLDIyIEBACiAgIC8qKgogICAgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZSBvZiB0aGUgcnVubmluZyBob3N0IGFwcGxpY2F0aW9uLiBTdWNoIGFzIHpoX0NOCiAgICAqLwotICB2aXJ0dWFsIENGWF9XaWRlU3RyaW5nIEdldExhbmd1YWdlKCkgPSAwOworICB2aXJ0dWFsIFdpZGVTdHJpbmcgR2V0TGFuZ3VhZ2UoKSA9IDA7CiAKICAgLyoqCiAgICAqIFJldHVybnMgdGhlIHBsYXRmb3JtIG9mIHRoZSBtYWNoaW5lIHJ1bm5pbmcgdGhlIHNjcmlwdC4gU3VjaCBhcyBXSU4KICAgICovCi0gIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0UGxhdGZvcm0oKSA9IDA7CisgIHZpcnR1YWwgV2lkZVN0cmluZyBHZXRQbGF0Zm9ybSgpID0gMDsKIAogICAvKioKICAgICogR2V0IGFwcGxpY2F0aW9uIG5hbWUsIHN1Y2ggYXMgUGhhbnRvbS4KICAgICovCi0gIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0QXBwTmFtZSgpID0gMDsKKyAgdmlydHVhbCBXaWRlU3RyaW5nIEdldEFwcE5hbWUoKSA9IDA7CiAKICAgLyoqCiAgICAqIEdldCBhcHBsaWNhdGlvbiBtZXNzYWdlIGJveCB0aXRsZS4KICAgICovCi0gIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgR2V0QXBwVGl0bGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgV2lkZVN0cmluZyBHZXRBcHBUaXRsZSgpIGNvbnN0ID0gMDsKIAogICAvKioKICAgICogQ2F1c2VzIHRoZSBzeXN0ZW0gdG8gcGxheSBhIHNvdW5kLgpAQCAtMTY0LDggKzE0NCw4IEBACiAgICAqIEByZXR1cm4gQSB2YWxpZCBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgb2YgdGhlIGJ1dHRvbiBwcmVzc2VkIGJ5IHRoZQogICAgKiB1c2VyLCByZWZlciB0byBYRkFfSUQuCiAgICAqLwotICB2aXJ0dWFsIGludDMyX3QgTXNnQm94KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGl0bGUgPSBMIiIsCisgIHZpcnR1YWwgaW50MzJfdCBNc2dCb3goY29uc3QgV2lkZVN0cmluZyYgd3NNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzVGl0bGUgPSBMIiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdJY29uVHlwZSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdCdXR0b25UeXBlID0gMCkgPSAwOwogCkBAIC0xNzcsMTggKzE1NywxOCBAQAogICAgKiBAcGFyYW1baW5dIGJNYXNrICAgICAgICAgICAtIE1hc2sgdGhlIHVzZXIgaW5wdXQgd2l0aCBhc3Rlcmlza3Mgd2hlbiB0cnVlLAogICAgKiBAcmV0dXJuIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHVzZXIncyByZXNwb25zZS4KICAgICovCi0gIHZpcnR1YWwgQ0ZYX1dpZGVTdHJpbmcgUmVzcG9uc2UoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUXVlc3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGl0bGUgPSBMIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGVmYXVsdEFuc3dlciA9IEwiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJNYXNrID0gdHJ1ZSkgPSAwOworICB2aXJ0dWFsIFdpZGVTdHJpbmcgUmVzcG9uc2UoY29uc3QgV2lkZVN0cmluZyYgd3NRdWVzdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzVGl0bGUgPSBMIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c0RlZmF1bHRBbnN3ZXIgPSBMIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJNYXNrID0gdHJ1ZSkgPSAwOwogCiAgIC8qKgogICAgKiBEb3dubG9hZCBzb21ldGhpbmcgZnJvbSBzb21ld2hlcmUuCiAgICAqIEBwYXJhbVtpbl0gd3NVUkwgLSBodHRwLCBmdHAsIHN1Y2ggYXMKICAgICogImh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwtbmFtZXMvIi4KICAgICovCi0gIHZpcnR1YWwgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBEb3dubG9hZFVSTCgKLSAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1VSTCkgPSAwOworICB2aXJ0dWFsIFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBEb3dubG9hZFVSTCgKKyAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzVVJMKSA9IDA7CiAKICAgLyoqCiAgICAqIFBPU1QgZGF0YSB0byB0aGUgZ2l2ZW4gdXJsLgpAQCAtMjA1LDEyICsxODUsMTIgQEAKICAgICogQHBhcmFtW291dF0gd3NSZXNwb25zZSAgIGRlY29kZWQgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIuCiAgICAqIEByZXR1cm4gdHJ1ZSBTZXJ2ZXIgcGVybWl0dGVkIHRoZSBwb3N0IHJlcXVlc3QsIGZhbHNlIG90aGVyd2lzZS4KICAgICovCi0gIHZpcnR1YWwgYm9vbCBQb3N0UmVxdWVzdFVSTChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NVUkwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NFbmNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NIZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NSZXNwb25zZSkgPSAwOworICB2aXJ0dWFsIGJvb2wgUG9zdFJlcXVlc3RVUkwoY29uc3QgV2lkZVN0cmluZyYgd3NVUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c0NvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NFbmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c0hlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIHdzUmVzcG9uc2UpID0gMDsKIAogICAvKioKICAgICogUFVUIGRhdGEgdG8gdGhlIGdpdmVuIHVybC4KQEAgLTIyMCw5ICsyMDAsOSBAQAogICAgKiBJU084ODU5LTEsIGFueSByZWNvZ25pemVkIFtJQU5BXWNoYXJhY3RlciBlbmNvZGluZwogICAgKiBAcmV0dXJuIHRydWUgU2VydmVyIHBlcm1pdHRlZCB0aGUgcG9zdCByZXF1ZXN0LCBmYWxzZSBvdGhlcndpc2UuCiAgICAqLwotICB2aXJ0dWFsIGJvb2wgUHV0UmVxdWVzdFVSTChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NVUkwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0VuY29kZSkgPSAwOworICB2aXJ0dWFsIGJvb2wgUHV0UmVxdWVzdFVSTChjb25zdCBXaWRlU3RyaW5nJiB3c1VSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c0VuY29kZSkgPSAwOwogCiAgIHZpcnR1YWwgSUZXTF9BZGFwdGVyVGltZXJNZ3IqIEdldFRpbWVyTWdyKCkgPSAwOwogfTsKQEAgLTIzMywzNCArMjEzLDMzIEBACiAKICAgdmlydHVhbCB2b2lkIFNldENoYW5nZU1hcmsoQ1hGQV9GRkRvYyogaERvYykgPSAwOwogICB2aXJ0dWFsIHZvaWQgSW52YWxpZGF0ZVJlY3QoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFncykgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydCkgPSAwOwogICB2aXJ0dWFsIHZvaWQgRGlzcGxheUNhcmV0KENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVmlzaWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYqIHBSdEFuY2hvcikgPSAwOwogICB2aXJ0dWFsIGJvb2wgR2V0UG9wdXBQb3MoQ1hGQV9GRldpZGdldCogaFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNaW5Qb3B1cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZNYXhQb3B1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZNaW5Qb3B1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZNYXhQb3B1cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRBbmNob3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYmIHJ0UG9wdXApID0gMDsKICAgdmlydHVhbCBib29sIFBvcHVwTWVudShDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0LCBDRlhfUG9pbnRGIHB0UG9wdXApID0gMDsKICAgdmlydHVhbCB2b2lkIFBhZ2VWaWV3RXZlbnQoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsIHVpbnQzMl90IGR3RmxhZ3MpID0gMDsKICAgdmlydHVhbCB2b2lkIFdpZGdldFBvc3RBZGQoQ1hGQV9GRldpZGdldCogaFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXREYXRhKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCBXaWRnZXRQcmVSZW1vdmUoQ1hGQV9GRldpZGdldCogaFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcFdpZGdldERhdGEpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYykgPSAwOwogCiAgIHZpcnR1YWwgaW50MzJfdCBDb3VudFBhZ2VzKENYRkFfRkZEb2MqIGhEb2MpID0gMDsKICAgdmlydHVhbCBpbnQzMl90IEdldEN1cnJlbnRQYWdlKENYRkFfRkZEb2MqIGhEb2MpID0gMDsKICAgdmlydHVhbCB2b2lkIFNldEN1cnJlbnRQYWdlKENYRkFfRkZEb2MqIGhEb2MsIGludDMyX3QgaUN1clBhZ2UpID0gMDsKICAgdmlydHVhbCBib29sIElzQ2FsY3VsYXRpb25zRW5hYmxlZChDWEZBX0ZGRG9jKiBoRG9jKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCBTZXRDYWxjdWxhdGlvbnNFbmFibGVkKENYRkFfRkZEb2MqIGhEb2MsIGJvb2wgYkVuYWJsZWQpID0gMDsKLSAgdmlydHVhbCB2b2lkIEdldFRpdGxlKENYRkFfRkZEb2MqIGhEb2MsIENGWF9XaWRlU3RyaW5nJiB3c1RpdGxlKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTZXRUaXRsZShDWEZBX0ZGRG9jKiBoRG9jLCBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUaXRsZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgR2V0VGl0bGUoQ1hGQV9GRkRvYyogaERvYywgV2lkZVN0cmluZyYgd3NUaXRsZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0VGl0bGUoQ1hGQV9GRkRvYyogaERvYywgY29uc3QgV2lkZVN0cmluZyYgd3NUaXRsZSkgPSAwOwogICB2aXJ0dWFsIHZvaWQgRXhwb3J0RGF0YShDWEZBX0ZGRG9jKiBoRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGaWxlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NGaWxlUGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiWERQKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBHb3RvVVJMKENYRkFfRkZEb2MqIGhEb2MsIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBic1VSTCkgPSAwOworICB2aXJ0dWFsIHZvaWQgR290b1VSTChDWEZBX0ZGRG9jKiBoRG9jLCBjb25zdCBXaWRlU3RyaW5nJiBic1VSTCkgPSAwOwogICB2aXJ0dWFsIGJvb2wgSXNWYWxpZGF0aW9uc0VuYWJsZWQoQ1hGQV9GRkRvYyogaERvYykgPSAwOwogICB2aXJ0dWFsIHZvaWQgU2V0VmFsaWRhdGlvbnNFbmFibGVkKENYRkFfRkZEb2MqIGhEb2MsIGJvb2wgYkVuYWJsZWQpID0gMDsKICAgdmlydHVhbCB2b2lkIFNldEZvY3VzV2lkZ2V0KENYRkFfRkZEb2MqIGhEb2MsIENYRkFfRkZXaWRnZXQqIGhXaWRnZXQpID0gMDsKQEAgLTI3MCwxNiArMjQ5LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd09wdGlvbnMpID0gMDsKICAgdmlydHVhbCBGWF9BUkdCIEdldEhpZ2hsaWdodENvbG9yKENYRkFfRkZEb2MqIGhEb2MpID0gMDsKIAotICB2aXJ0dWFsIGJvb2wgU3VibWl0RGF0YShDWEZBX0ZGRG9jKiBoRG9jLCBDWEZBX1N1Ym1pdCBzdWJtaXQpID0gMDsKKyAgdmlydHVhbCBib29sIFN1Ym1pdChDWEZBX0ZGRG9jKiBoRG9jLCBDWEZBX1N1Ym1pdCogc3VibWl0KSA9IDA7CiAgIHZpcnR1YWwgYm9vbCBHZXRHbG9iYWxQcm9wZXJ0eShDWEZBX0ZGRG9jKiBoRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIHN6UHJvcE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHBWYWx1ZSkgPSAwOwogICB2aXJ0dWFsIGJvb2wgU2V0R2xvYmFsUHJvcGVydHkoQ1hGQV9GRkRvYyogaERvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzelByb3BOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpID0gMDsKLSAgdmlydHVhbCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IE9wZW5MaW5rZWRGaWxlKAorICB2aXJ0dWFsIFJldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBPcGVuTGlua2VkRmlsZSgKICAgICAgIENYRkFfRkZEb2MqIGhEb2MsCi0gICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NMaW5rKSA9IDA7CisgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c0xpbmspID0gMDsKIH07CiAKIGNsYXNzIElYRkFfV2lkZ2V0SXRlcmF0b3IgewpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvZnhmYV9iYXNpYy5oIGIveGZhL2Z4ZmEvZnhmYV9iYXNpYy5oCmluZGV4IGQxNmY1MGYuLjk2YjQ4M2QgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL2Z4ZmFfYmFzaWMuaAorKysgYi94ZmEvZnhmYS9meGZhX2Jhc2ljLmgKQEAgLTcsOSArNyw5IEBACiAjaWZuZGVmIFhGQV9GWEZBX0ZYRkFfQkFTSUNfSF8KICNkZWZpbmUgWEZBX0ZYRkFfRlhGQV9CQVNJQ19IXwogCi0jaW5jbHVkZSAiZnhqcy9jZnhqc2VfYXJndW1lbnRzLmgiCiAjaW5jbHVkZSAiZnhqcy9meGpzZS5oIgogCitjbGFzcyBDSlhfT2JqZWN0OwogY2xhc3MgQ1hGQV9NZWFzdXJlbWVudDsKIGVudW0gY2xhc3MgWEZBX09iamVjdFR5cGU7CiAKQEAgLTQ1LDQyICs0NSw0OCBAQAogICBYRkFfSEFTSENPREVfWG1wbWV0YSA9IDB4MTMyYThmYmMKIH07CiAKLWVudW0gWEZBX1BBQ0tFVCB7Ci0gIFhGQV9QQUNLRVRfVVNFUiwKLSAgWEZBX1BBQ0tFVF9Tb3VyY2VTZXQsCi0gIFhGQV9QQUNLRVRfUGRmLAotICBYRkFfUEFDS0VUX1hkYywKLSAgWEZBX1BBQ0tFVF9YRFAsCi0gIFhGQV9QQUNLRVRfWG1wbWV0YSwKLSAgWEZBX1BBQ0tFVF9YZmRmLAotICBYRkFfUEFDS0VUX0NvbmZpZywKLSAgWEZBX1BBQ0tFVF9Mb2NhbGVTZXQsCi0gIFhGQV9QQUNLRVRfU3R5bGVzaGVldCwKLSAgWEZBX1BBQ0tFVF9UZW1wbGF0ZSwKLSAgWEZBX1BBQ0tFVF9TaWduYXR1cmUsCi0gIFhGQV9QQUNLRVRfRGF0YXNldHMsCi0gIFhGQV9QQUNLRVRfRm9ybSwKLSAgWEZBX1BBQ0tFVF9Db25uZWN0aW9uU2V0LAorZW51bSBjbGFzcyBYRkFfUGFja2V0VHlwZSA6IHVpbnQ4X3QgeworICBVc2VyLAorICBTb3VyY2VTZXQsCisgIFBkZiwKKyAgWGRjLAorICBYZHAsCisgIFhtcG1ldGEsCisgIFhmZGYsCisgIENvbmZpZywKKyAgTG9jYWxlU2V0LAorICBTdHlsZXNoZWV0LAorICBUZW1wbGF0ZSwKKyAgU2lnbmF0dXJlLAorICBEYXRhc2V0cywKKyAgRm9ybSwKKyAgQ29ubmVjdGlvblNldCwKIH07CiAKIGVudW0gWEZBX1hEUFBBQ0tFVCB7CiAgIFhGQV9YRFBQQUNLRVRfVU5LTk9XTiA9IDAsCi0gIFhGQV9YRFBQQUNLRVRfQ29uZmlnID0gMSA8PCBYRkFfUEFDS0VUX0NvbmZpZywKLSAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSA9IDEgPDwgWEZBX1BBQ0tFVF9UZW1wbGF0ZSwKLSAgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cyA9IDEgPDwgWEZBX1BBQ0tFVF9EYXRhc2V0cywKLSAgWEZBX1hEUFBBQ0tFVF9Gb3JtID0gMSA8PCBYRkFfUEFDS0VUX0Zvcm0sCi0gIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0ID0gMSA8PCBYRkFfUEFDS0VUX0xvY2FsZVNldCwKLSAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0ID0gMSA8PCBYRkFfUEFDS0VUX0Nvbm5lY3Rpb25TZXQsCi0gIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0ID0gMSA8PCBYRkFfUEFDS0VUX1NvdXJjZVNldCwKLSAgWEZBX1hEUFBBQ0tFVF9YZGMgPSAxIDw8IFhGQV9QQUNLRVRfWGRjLAotICBYRkFfWERQUEFDS0VUX1BkZiA9IDEgPDwgWEZBX1BBQ0tFVF9QZGYsCi0gIFhGQV9YRFBQQUNLRVRfWGZkZiA9IDEgPDwgWEZBX1BBQ0tFVF9YZmRmLAotICBYRkFfWERQUEFDS0VUX1htcG1ldGEgPSAxIDw8IFhGQV9QQUNLRVRfWG1wbWV0YSwKLSAgWEZBX1hEUFBBQ0tFVF9TaWduYXR1cmUgPSAxIDw8IFhGQV9QQUNLRVRfU2lnbmF0dXJlLAotICBYRkFfWERQUEFDS0VUX1N0eWxlc2hlZXQgPSAxIDw8IFhGQV9QQUNLRVRfU3R5bGVzaGVldCwKLSAgWEZBX1hEUFBBQ0tFVF9VU0VSID0gMSA8PCBYRkFfUEFDS0VUX1VTRVIsCi0gIFhGQV9YRFBQQUNLRVRfWERQID0gMSA8PCBYRkFfUEFDS0VUX1hEUCwKKyAgWEZBX1hEUFBBQ0tFVF9Db25maWcgPSAxIDw8IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KFhGQV9QYWNrZXRUeXBlOjpDb25maWcpLAorICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlID0gMSA8PCBzdGF0aWNfY2FzdDx1aW50OF90PihYRkFfUGFja2V0VHlwZTo6VGVtcGxhdGUpLAorICBYRkFfWERQUEFDS0VUX0RhdGFzZXRzID0gMSA8PCBzdGF0aWNfY2FzdDx1aW50OF90PihYRkFfUGFja2V0VHlwZTo6RGF0YXNldHMpLAorICBYRkFfWERQUEFDS0VUX0Zvcm0gPSAxIDw8IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KFhGQV9QYWNrZXRUeXBlOjpGb3JtKSwKKyAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8dWludDhfdD4oWEZBX1BhY2tldFR5cGU6OkxvY2FsZVNldCksCisgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCA9CisgICAgICAxIDw8IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KFhGQV9QYWNrZXRUeXBlOjpDb25uZWN0aW9uU2V0KSwKKyAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8dWludDhfdD4oWEZBX1BhY2tldFR5cGU6OlNvdXJjZVNldCksCisgIFhGQV9YRFBQQUNLRVRfWGRjID0gMSA8PCBzdGF0aWNfY2FzdDx1aW50OF90PihYRkFfUGFja2V0VHlwZTo6WGRjKSwKKyAgWEZBX1hEUFBBQ0tFVF9QZGYgPSAxIDw8IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KFhGQV9QYWNrZXRUeXBlOjpQZGYpLAorICBYRkFfWERQUEFDS0VUX1hmZGYgPSAxIDw8IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KFhGQV9QYWNrZXRUeXBlOjpYZmRmKSwKKyAgWEZBX1hEUFBBQ0tFVF9YbXBtZXRhID0gMSA8PCBzdGF0aWNfY2FzdDx1aW50OF90PihYRkFfUGFja2V0VHlwZTo6WG1wbWV0YSksCisgIFhGQV9YRFBQQUNLRVRfU2lnbmF0dXJlID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KFhGQV9QYWNrZXRUeXBlOjpTaWduYXR1cmUpLAorICBYRkFfWERQUEFDS0VUX1N0eWxlc2hlZXQgPQorICAgICAgMSA8PCBzdGF0aWNfY2FzdDx1aW50OF90PihYRkFfUGFja2V0VHlwZTo6U3R5bGVzaGVldCksCisgIFhGQV9YRFBQQUNLRVRfVVNFUiA9IDEgPDwgc3RhdGljX2Nhc3Q8dWludDhfdD4oWEZBX1BhY2tldFR5cGU6OlVzZXIpLAorICBYRkFfWERQUEFDS0VUX1hEUCA9IDEgPDwgc3RhdGljX2Nhc3Q8dWludDhfdD4oWEZBX1BhY2tldFR5cGU6OlhkcCkKIH07CisKIGVudW0gWEZBX1hEUFBBQ0tFVF9GTEFHUyB7CiAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfQ09NUExFVEVNQVRDSCA9IDEsCiAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfUFJFRklYTUFUQ0ggPSAyLApAQCAtODgsNTI2ICs5NCw1MjEgQEAKICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FID0gOCwKICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUTUFOWSA9IDE2LAogfTsKLXN0cnVjdCBYRkFfUEFDS0VUSU5GTyB7Ci0gIHVpbnQzMl90IHVIYXNoOwotICBjb25zdCBGWF9XQ0hBUiogcE5hbWU7Ci0gIFhGQV9YRFBQQUNLRVQgZU5hbWU7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwVVJJOwotICB1aW50MzJfdCBlRmxhZ3M7CisKK2VudW0gY2xhc3MgWEZBX0F0dHJpYnV0ZUVudW0gOiB1aW50MzJfdCB7CisgIEFzdGVyaXNrLAorICBTbGFzaCwKKyAgQmFja3NsYXNoLAorICBPbiwKKyAgVGIsCisgIFVwLAorICBNZXRhRGF0YSwKKyAgRGVsZWdhdGUsCisgIFBvc3RTdWJtaXQsCisgIE5hbWUsCisgIENyb3NzLAorICBOZXh0LAorICBOb25lLAorICBTaG9ydEVkZ2UsCisgIENoZWNrc3VtXzFtb2QxMF8xbW9kMTEsCisgIEhlaWdodCwKKyAgQ3Jvc3NEaWFnb25hbCwKKyAgQWxsLAorICBBbnksCisgIFRvUmlnaHQsCisgIE1hdGNoVGVtcGxhdGUsCisgIERwbCwKKyAgSW52aXNpYmxlLAorICBGaXQsCisgIFdpZHRoLAorICBQcmVTdWJtaXQsCisgIElwbCwKKyAgRmxhdGVDb21wcmVzcywKKyAgTWVkLAorICBPZGQsCisgIE9mZiwKKyAgUGRmLAorICBSb3csCisgIFRvcCwKKyAgWGRwLAorICBYZmQsCisgIFhtbCwKKyAgWmlwLAorICBacGwsCisgIFZpc2libGUsCisgIEV4Y2x1ZGUsCisgIE1vdXNlRW50ZXIsCisgIFBhaXIsCisgIEZpbHRlciwKKyAgTW92ZUxhc3QsCisgIEV4cG9ydEFuZEltcG9ydCwKKyAgUHVzaCwKKyAgUG9ydHJhaXQsCisgIERlZmF1bHQsCisgIFN0b3JlZFByb2MsCisgIFN0YXlCT0YsCisgIFN0YXlFT0YsCisgIFBvc3RQcmludCwKKyAgVXNDYXJyaWVyLAorICBSaWdodCwKKyAgUHJlT3BlbiwKKyAgQWN0dWFsLAorICBSZXN0LAorICBUb3BDZW50ZXIsCisgIFN0YW5kYXJkU3ltYm9sLAorICBJbml0aWFsaXplLAorICBKdXN0aWZ5QWxsLAorICBOb3JtYWwsCisgIExhbmRzY2FwZSwKKyAgTm9uSW50ZXJhY3RpdmUsCisgIE1vdXNlRXhpdCwKKyAgTWludXMsCisgIERpYWdvbmFsTGVmdCwKKyAgU2ltcGxleFBhZ2luYXRlZCwKKyAgRG9jdW1lbnQsCisgIFdhcm5pbmcsCisgIEF1dG8sCisgIEJlbG93LAorICBCb3R0b21MZWZ0LAorICBCb3R0b21DZW50ZXIsCisgIFRjcGwsCisgIFRleHQsCisgIEdyb3VwaW5nLAorICBTZWN1cmVTeW1ib2wsCisgIFByZUV4ZWN1dGUsCisgIERvY0Nsb3NlLAorICBLZXlzZXQsCisgIFZlcnRpY2FsLAorICBQcmVTYXZlLAorICBQcmVTaWduLAorICBCb3R0b20sCisgIFRvVG9wLAorICBWZXJpZnksCisgIEZpcnN0LAorICBDb250ZW50QXJlYSwKKyAgU29saWQsCisgIFBlc3NpbWlzdGljLAorICBEdXBsZXhQYWdpbmF0ZWQsCisgIFJvdW5kLAorICBSZW1lcmdlLAorICBPcmRlcmVkLAorICBQZXJjZW50LAorICBFdmVuLAorICBFeGl0LAorICBUb29sVGlwLAorICBPcmRlcmVkT2NjdXJyZW5jZSwKKyAgUmVhZE9ubHksCisgIEN1cnJlbmN5LAorICBDb25jYXQsCisgIFRoYWksCisgIEVtYm9zc2VkLAorICBGb3JtZGF0YSwKKyAgR3JlZWssCisgIERlY2ltYWwsCisgIFNlbGVjdCwKKyAgTG9uZ0VkZ2UsCisgIFByb3RlY3RlZCwKKyAgQm90dG9tUmlnaHQsCisgIFplcm8sCisgIEZvcndhcmRPbmx5LAorICBEb2NSZWFkeSwKKyAgSGlkZGVuLAorICBJbmNsdWRlLAorICBEYXNoZWQsCisgIE11bHRpU2VsZWN0LAorICBJbmFjdGl2ZSwKKyAgRW1iZWQsCisgIFN0YXRpYywKKyAgT25FbnRyeSwKKyAgQ3lyaWxsaWMsCisgIE5vbkJsYW5rLAorICBUb3BSaWdodCwKKyAgSGVicmV3LAorICBUb3BMZWZ0LAorICBDZW50ZXIsCisgIE1vdmVGaXJzdCwKKyAgRGlhbW9uZCwKKyAgUGFnZU9kZCwKKyAgQ2hlY2tzdW1fMW1vZDEwLAorICBLb3JlYW4sCisgIEFib3ZlRW1iZWRkZWQsCisgIFppcENvbXByZXNzLAorICBOdW1lcmljLAorICBDaXJjbGUsCisgIFRvQm90dG9tLAorICBJbnZlcnRlZCwKKyAgVXBkYXRlLAorICBJc29uYW1lLAorICBTZXJ2ZXIsCisgIFBvc2l0aW9uLAorICBNaWRkbGVDZW50ZXIsCisgIE9wdGlvbmFsLAorICBVc2VQcmludGVyU2V0dGluZywKKyAgT3V0bGluZSwKKyAgSW5kZXhDaGFuZ2UsCisgIENoYW5nZSwKKyAgUGFnZUFyZWEsCisgIE9uY2UsCisgIE9ubHksCisgIE9wZW4sCisgIENhcHRpb24sCisgIFJhaXNlZCwKKyAgSnVzdGlmeSwKKyAgUmVmQW5kRGVzY2VuZGFudHMsCisgIFNob3J0LAorICBQYWdlRnJvbnQsCisgIE1vbm9zcGFjZSwKKyAgTWlkZGxlLAorICBQcmVQcmludCwKKyAgQWx3YXlzLAorICBVbmtub3duLAorICBUb0xlZnQsCisgIEFib3ZlLAorICBEYXNoRG90LAorICBHcmVnb3JpYW4sCisgIFJvbWFuLAorICBNb3VzZURvd24sCisgIFN5bWJvbCwKKyAgUGFnZUV2ZW4sCisgIFNpZ24sCisgIEFkZE5ldywKKyAgU3RhciwKKyAgT3B0aW1pc3RpYywKKyAgUmxfdGIsCisgIE1pZGRsZVJpZ2h0LAorICBNYWludGFpbiwKKyAgUGFja2FnZSwKKyAgU2ltcGxpZmllZENoaW5lc2UsCisgIFRvQ2VudGVyLAorICBCYWNrLAorICBVbnNwZWNpZmllZCwKKyAgQmF0Y2hPcHRpbWlzdGljLAorICBCb2xkLAorICBCb3RoLAorICBCdXR0LAorICBDbGllbnQsCisgIENoZWNrc3VtXzJtb2QxMCwKKyAgSW1hZ2VPbmx5LAorICBIb3Jpem9udGFsLAorICBEb3R0ZWQsCisgIFVzZXJDb250cm9sLAorICBEaWFnb25hbFJpZ2h0LAorICBDb25zdW1lRGF0YSwKKyAgQ2hlY2ssCisgIERhdGEsCisgIERvd24sCisgIFNhbnNTZXJpZiwKKyAgSW5saW5lLAorICBUcmFkaXRpb25hbENoaW5lc2UsCisgIFdhcm4sCisgIFJlZk9ubHksCisgIEludGVyYWN0aXZlRm9ybXMsCisgIFdvcmQsCisgIFVub3JkZXJlZCwKKyAgUmVxdWlyZWQsCisgIEltcG9ydE9ubHksCisgIEJlbG93RW1iZWRkZWQsCisgIEphcGFuZXNlLAorICBGdWxsLAorICBSbF9yb3csCisgIFZpZXRuYW1lc2UsCisgIEVhc3RFdXJvcGVhblJvbWFuLAorICBNb3VzZVVwLAorICBFeHBvcnRPbmx5LAorICBDbGVhciwKKyAgQ2xpY2ssCisgIEJhc2U2NCwKKyAgQ2xvc2UsCisgIEhvc3QsCisgIEdsb2JhbCwKKyAgQmxhbmssCisgIFRhYmxlLAorICBJbXBvcnQsCisgIEN1c3RvbSwKKyAgTWlkZGxlTGVmdCwKKyAgUG9zdEV4ZWN1dGUsCisgIFJhZGl4LAorICBQb3N0T3BlbiwKKyAgRW50ZXIsCisgIElnbm9yZSwKKyAgTHJfdGIsCisgIEZhbnRhc3ksCisgIEl0YWxpYywKKyAgQXV0aG9yLAorICBUb0VkZ2UsCisgIENob2ljZSwKKyAgRGlzYWJsZWQsCisgIENyb3NzSGF0Y2gsCisgIERhdGFSZWYsCisgIERhc2hEb3REb3QsCisgIFNxdWFyZSwKKyAgRHluYW1pYywKKyAgTWFudWFsLAorICBFdGNoZWQsCisgIFZhbGlkYXRpb25TdGF0ZSwKKyAgQ3Vyc2l2ZSwKKyAgTGFzdCwKKyAgTGVmdCwKKyAgTGluaywKKyAgTG9uZywKKyAgSW50ZXJuYXRpb25hbENhcnJpZXIsCisgIFBERjFfMywKKyAgUERGMV82LAorICBTZXJpZiwKKyAgUG9zdFNhdmUsCisgIFJlYWR5LAorICBQb3N0U2lnbiwKKyAgQXJhYmljLAorICBFcnJvciwKKyAgVXJsZW5jb2RlZCwKKyAgTG93ZXJlZAogfTsKIAotZW51bSBYRkFfQVRUUklCVVRFRU5VTSB7Ci0gIFhGQV9BVFRSSUJVVEVFTlVNX0FzdGVyaXNrLAotICBYRkFfQVRUUklCVVRFRU5VTV9TbGFzaCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fQmFja3NsYXNoLAotICBYRkFfQVRUUklCVVRFRU5VTV9PbiwKLSAgWEZBX0FUVFJJQlVURUVOVU1fVGIsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1VwLAotICBYRkFfQVRUUklCVVRFRU5VTV9NZXRhRGF0YSwKLSAgWEZBX0FUVFJJQlVURUVOVU1fRGVsZWdhdGUsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RTdWJtaXQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX05hbWUsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0Nyb3NzLAotICBYRkFfQVRUUklCVVRFRU5VTV9OZXh0LAotICBYRkFfQVRUUklCVVRFRU5VTV9Ob25lLAotICBYRkFfQVRUUklCVVRFRU5VTV9TaG9ydEVkZ2UsCi0gIFhGQV9BVFRSSUJVVEVFTlVNXzFtb2QxMF8xbW9kMTEsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0hlaWdodCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fQ3Jvc3NEaWFnb25hbCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fQWxsLAotICBYRkFfQVRUUklCVVRFRU5VTV9BbnksCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1RvUmlnaHQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX01hdGNoVGVtcGxhdGUsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0RwbCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fSW52aXNpYmxlLAotICBYRkFfQVRUUklCVVRFRU5VTV9GaXQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1dpZHRoLAotICBYRkFfQVRUUklCVVRFRU5VTV9QcmVTdWJtaXQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0lwbCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fRmxhdGVDb21wcmVzcywKLSAgWEZBX0FUVFJJQlVURUVOVU1fTWVkLAotICBYRkFfQVRUUklCVVRFRU5VTV9PZGQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX09mZiwKLSAgWEZBX0FUVFJJQlVURUVOVU1fUGRmLAotICBYRkFfQVRUUklCVVRFRU5VTV9Sb3csCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1RvcCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fWGRwLAotICBYRkFfQVRUUklCVVRFRU5VTV9YZmQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1htbCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fWmlwLAotICBYRkFfQVRUUklCVVRFRU5VTV9acGwsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0V4Y2x1ZGUsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlRW50ZXIsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1BhaXIsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0ZpbHRlciwKLSAgWEZBX0FUVFJJQlVURUVOVU1fTW92ZUxhc3QsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0V4cG9ydEFuZEltcG9ydCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fUHVzaCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fUG9ydHJhaXQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0RlZmF1bHQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1N0b3JlZFByb2MsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1N0YXlCT0YsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1N0YXlFT0YsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RQcmludCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fVXNDYXJyaWVyLAotICBYRkFfQVRUUklCVVRFRU5VTV9SaWdodCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fUHJlT3BlbiwKLSAgWEZBX0FUVFJJQlVURUVOVU1fQWN0dWFsLAotICBYRkFfQVRUUklCVVRFRU5VTV9SZXN0LAotICBYRkFfQVRUUklCVVRFRU5VTV9Ub3BDZW50ZXIsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1N0YW5kYXJkU3ltYm9sLAotICBYRkFfQVRUUklCVVRFRU5VTV9Jbml0aWFsaXplLAotICBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5QWxsLAotICBYRkFfQVRUUklCVVRFRU5VTV9Ob3JtYWwsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0xhbmRzY2FwZSwKLSAgWEZBX0FUVFJJQlVURUVOVU1fTm9uSW50ZXJhY3RpdmUsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlRXhpdCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fTWludXMsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0RpYWdvbmFsTGVmdCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fU2ltcGxleFBhZ2luYXRlZCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fRG9jdW1lbnQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1dhcm5pbmcsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0F1dG8sCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0JlbG93LAotICBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21MZWZ0LAotICBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21DZW50ZXIsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1RjcGwsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1RleHQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0dyb3VwaW5nLAotICBYRkFfQVRUUklCVVRFRU5VTV9TZWN1cmVTeW1ib2wsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1ByZUV4ZWN1dGUsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0RvY0Nsb3NlLAotICBYRkFfQVRUUklCVVRFRU5VTV9LZXlzZXQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1ZlcnRpY2FsLAotICBYRkFfQVRUUklCVVRFRU5VTV9QcmVTYXZlLAotICBYRkFfQVRUUklCVVRFRU5VTV9QcmVTaWduLAotICBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b20sCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1RvVG9wLAotICBYRkFfQVRUUklCVVRFRU5VTV9WZXJpZnksCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0ZpcnN0LAotICBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYSwKLSAgWEZBX0FUVFJJQlVURUVOVU1fU29saWQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1Blc3NpbWlzdGljLAotICBYRkFfQVRUUklCVVRFRU5VTV9EdXBsZXhQYWdpbmF0ZWQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1JvdW5kLAotICBYRkFfQVRUUklCVVRFRU5VTV9SZW1lcmdlLAotICBYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkLAotICBYRkFfQVRUUklCVVRFRU5VTV9QZXJjZW50LAotICBYRkFfQVRUUklCVVRFRU5VTV9FdmVuLAotICBYRkFfQVRUUklCVVRFRU5VTV9FeGl0LAotICBYRkFfQVRUUklCVVRFRU5VTV9Ub29sVGlwLAotICBYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkT2NjdXJyZW5jZSwKLSAgWEZBX0FUVFJJQlVURUVOVU1fUmVhZE9ubHksCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0N1cnJlbmN5LAotICBYRkFfQVRUUklCVVRFRU5VTV9Db25jYXQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1RoYWksCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0VtYm9zc2VkLAotICBYRkFfQVRUUklCVVRFRU5VTV9Gb3JtZGF0YSwKLSAgWEZBX0FUVFJJQlVURUVOVU1fR3JlZWssCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0RlY2ltYWwsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1NlbGVjdCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fTG9uZ0VkZ2UsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1Byb3RlY3RlZCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tUmlnaHQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1plcm8sCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0ZvcndhcmRPbmx5LAotICBYRkFfQVRUUklCVVRFRU5VTV9Eb2NSZWFkeSwKLSAgWEZBX0FUVFJJQlVURUVOVU1fSGlkZGVuLAotICBYRkFfQVRUUklCVVRFRU5VTV9JbmNsdWRlLAotICBYRkFfQVRUUklCVVRFRU5VTV9EYXNoZWQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0LAotICBYRkFfQVRUUklCVVRFRU5VTV9JbmFjdGl2ZSwKLSAgWEZBX0FUVFJJQlVURUVOVU1fRW1iZWQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1N0YXRpYywKLSAgWEZBX0FUVFJJQlVURUVOVU1fT25FbnRyeSwKLSAgWEZBX0FUVFJJQlVURUVOVU1fQ3lyaWxsaWMsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX05vbkJsYW5rLAotICBYRkFfQVRUUklCVVRFRU5VTV9Ub3BSaWdodCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fSGVicmV3LAotICBYRkFfQVRUUklCVVRFRU5VTV9Ub3BMZWZ0LAotICBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXIsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX01vdmVGaXJzdCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fRGlhbW9uZCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fUGFnZU9kZCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fMW1vZDEwLAotICBYRkFfQVRUUklCVVRFRU5VTV9Lb3JlYW4sCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0Fib3ZlRW1iZWRkZWQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1ppcENvbXByZXNzLAotICBYRkFfQVRUUklCVVRFRU5VTV9OdW1lcmljLAotICBYRkFfQVRUUklCVVRFRU5VTV9DaXJjbGUsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1RvQm90dG9tLAotICBYRkFfQVRUUklCVVRFRU5VTV9JbnZlcnRlZCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fVXBkYXRlLAotICBYRkFfQVRUUklCVVRFRU5VTV9Jc29uYW1lLAotICBYRkFfQVRUUklCVVRFRU5VTV9TZXJ2ZXIsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc2l0aW9uLAotICBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGVDZW50ZXIsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsLAotICBYRkFfQVRUUklCVVRFRU5VTV9Vc2VQcmludGVyU2V0dGluZywKLSAgWEZBX0FUVFJJQlVURUVOVU1fT3V0bGluZSwKLSAgWEZBX0FUVFJJQlVURUVOVU1fSW5kZXhDaGFuZ2UsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0NoYW5nZSwKLSAgWEZBX0FUVFJJQlVURUVOVU1fUGFnZUFyZWEsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX09uY2UsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX09ubHksCi0gIFhGQV9BVFRSSUJVVEVFTlVNX09wZW4sCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0NhcHRpb24sCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1JhaXNlZCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fSnVzdGlmeSwKLSAgWEZBX0FUVFJJQlVURUVOVU1fUmVmQW5kRGVzY2VuZGFudHMsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1Nob3J0LAotICBYRkFfQVRUUklCVVRFRU5VTV9QYWdlRnJvbnQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX01vbm9zcGFjZSwKLSAgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlLAotICBYRkFfQVRUUklCVVRFRU5VTV9QcmVQcmludCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fQWx3YXlzLAotICBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duLAotICBYRkFfQVRUUklCVVRFRU5VTV9Ub0xlZnQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0Fib3ZlLAotICBYRkFfQVRUUklCVVRFRU5VTV9EYXNoRG90LAotICBYRkFfQVRUUklCVVRFRU5VTV9HcmVnb3JpYW4sCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1JvbWFuLAotICBYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZURvd24sCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1N5bWJvbCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fUGFnZUV2ZW4sCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1NpZ24sCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0FkZE5ldywKLSAgWEZBX0FUVFJJQlVURUVOVU1fU3RhciwKLSAgWEZBX0FUVFJJQlVURUVOVU1fT3B0aW1pc3RpYywKLSAgWEZBX0FUVFJJQlVURUVOVU1fUmxfdGIsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZVJpZ2h0LAotICBYRkFfQVRUUklCVVRFRU5VTV9NYWludGFpbiwKLSAgWEZBX0FUVFJJQlVURUVOVU1fUGFja2FnZSwKLSAgWEZBX0FUVFJJQlVURUVOVU1fU2ltcGxpZmllZENoaW5lc2UsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1RvQ2VudGVyLAotICBYRkFfQVRUUklCVVRFRU5VTV9CYWNrLAotICBYRkFfQVRUUklCVVRFRU5VTV9VbnNwZWNpZmllZCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fQmF0Y2hPcHRpbWlzdGljLAotICBYRkFfQVRUUklCVVRFRU5VTV9Cb2xkLAotICBYRkFfQVRUUklCVVRFRU5VTV9Cb3RoLAotICBYRkFfQVRUUklCVVRFRU5VTV9CdXR0LAotICBYRkFfQVRUUklCVVRFRU5VTV9DbGllbnQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNXzJtb2QxMCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fSW1hZ2VPbmx5LAotICBYRkFfQVRUUklCVVRFRU5VTV9Ib3Jpem9udGFsLAotICBYRkFfQVRUUklCVVRFRU5VTV9Eb3R0ZWQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1VzZXJDb250cm9sLAotICBYRkFfQVRUUklCVVRFRU5VTV9EaWFnb25hbFJpZ2h0LAotICBYRkFfQVRUUklCVVRFRU5VTV9Db25zdW1lRGF0YSwKLSAgWEZBX0FUVFJJQlVURUVOVU1fQ2hlY2ssCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0RhdGEsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0Rvd24sCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1NhbnNTZXJpZiwKLSAgWEZBX0FUVFJJQlVURUVOVU1fSW5saW5lLAotICBYRkFfQVRUUklCVVRFRU5VTV9UcmFkaXRpb25hbENoaW5lc2UsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1dhcm4sCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1JlZk9ubHksCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0ludGVyYWN0aXZlRm9ybXMsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1dvcmQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1Vub3JkZXJlZCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fUmVxdWlyZWQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0ltcG9ydE9ubHksCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0JlbG93RW1iZWRkZWQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0phcGFuZXNlLAotICBYRkFfQVRUUklCVVRFRU5VTV9GdWxsLAotICBYRkFfQVRUUklCVVRFRU5VTV9SbF9yb3csCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1ZpZXRuYW1lc2UsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0Vhc3RFdXJvcGVhblJvbWFuLAotICBYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZVVwLAotICBYRkFfQVRUUklCVVRFRU5VTV9FeHBvcnRPbmx5LAotICBYRkFfQVRUUklCVVRFRU5VTV9DbGVhciwKLSAgWEZBX0FUVFJJQlVURUVOVU1fQ2xpY2ssCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0Jhc2U2NCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fQ2xvc2UsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0hvc3QsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0dsb2JhbCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fQmxhbmssCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1RhYmxlLAotICBYRkFfQVRUUklCVVRFRU5VTV9JbXBvcnQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0N1c3RvbSwKLSAgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlTGVmdCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fUG9zdEV4ZWN1dGUsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1JhZGl4LAotICBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0T3BlbiwKLSAgWEZBX0FUVFJJQlVURUVOVU1fRW50ZXIsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0lnbm9yZSwKLSAgWEZBX0FUVFJJQlVURUVOVU1fTHJfdGIsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0ZhbnRhc3ksCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0l0YWxpYywKLSAgWEZBX0FUVFJJQlVURUVOVU1fQXV0aG9yLAotICBYRkFfQVRUUklCVVRFRU5VTV9Ub0VkZ2UsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0Nob2ljZSwKLSAgWEZBX0FUVFJJQlVURUVOVU1fRGlzYWJsZWQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0Nyb3NzSGF0Y2gsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0RhdGFSZWYsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX0Rhc2hEb3REb3QsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1NxdWFyZSwKLSAgWEZBX0FUVFJJQlVURUVOVU1fRHluYW1pYywKLSAgWEZBX0FUVFJJQlVURUVOVU1fTWFudWFsLAotICBYRkFfQVRUUklCVVRFRU5VTV9FdGNoZWQsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1ZhbGlkYXRpb25TdGF0ZSwKLSAgWEZBX0FUVFJJQlVURUVOVU1fQ3Vyc2l2ZSwKLSAgWEZBX0FUVFJJQlVURUVOVU1fTGFzdCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fTGVmdCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fTGluaywKLSAgWEZBX0FUVFJJQlVURUVOVU1fTG9uZywKLSAgWEZBX0FUVFJJQlVURUVOVU1fSW50ZXJuYXRpb25hbENhcnJpZXIsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1BERjFfMywKLSAgWEZBX0FUVFJJQlVURUVOVU1fUERGMV82LAotICBYRkFfQVRUUklCVVRFRU5VTV9TZXJpZiwKLSAgWEZBX0FUVFJJQlVURUVOVU1fUG9zdFNhdmUsCi0gIFhGQV9BVFRSSUJVVEVFTlVNX1JlYWR5LAotICBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0U2lnbiwKLSAgWEZBX0FUVFJJQlVURUVOVU1fQXJhYmljLAotICBYRkFfQVRUUklCVVRFRU5VTV9FcnJvciwKLSAgWEZBX0FUVFJJQlVURUVOVU1fVXJsZW5jb2RlZCwKLSAgWEZBX0FUVFJJQlVURUVOVU1fTG93ZXJlZCwKLX07Ci1lbnVtIFhGQV9BVFRSSUJVVEUgewotICBYRkFfQVRUUklCVVRFX0gsCi0gIFhGQV9BVFRSSUJVVEVfVywKLSAgWEZBX0FUVFJJQlVURV9YLAotICBYRkFfQVRUUklCVVRFX1ksCi0gIFhGQV9BVFRSSUJVVEVfSWQsCi0gIFhGQV9BVFRSSUJVVEVfVG8sCi0gIFhGQV9BVFRSSUJVVEVfTGluZVRocm91Z2gsCi0gIFhGQV9BVFRSSUJVVEVfSEFsaWduLAotICBYRkFfQVRUUklCVVRFX1R5cGVmYWNlLAotICBYRkFfQVRUUklCVVRFX0JlZm9yZVRhcmdldCwKLSAgWEZBX0FUVFJJQlVURV9OYW1lLAotICBYRkFfQVRUUklCVVRFX05leHQsCi0gIFhGQV9BVFRSSUJVVEVfRGF0YVJvd0NvdW50LAotICBYRkFfQVRUUklCVVRFX0JyZWFrLAotICBYRkFfQVRUUklCVVRFX1ZTY3JvbGxQb2xpY3ksCi0gIFhGQV9BVFRSSUJVVEVfRm9udEhvcml6b250YWxTY2FsZSwKLSAgWEZBX0FUVFJJQlVURV9UZXh0SW5kZW50LAotICBYRkFfQVRUUklCVVRFX0NvbnRleHQsCi0gIFhGQV9BVFRSSUJVVEVfVHJheU91dCwKLSAgWEZBX0FUVFJJQlVURV9DYXAsCi0gIFhGQV9BVFRSSUJVVEVfTWF4LAotICBYRkFfQVRUUklCVVRFX01pbiwKLSAgWEZBX0FUVFJJQlVURV9SZWYsCi0gIFhGQV9BVFRSSUJVVEVfUmlkLAotICBYRkFfQVRUUklCVVRFX1VybCwKLSAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gIFhGQV9BVFRSSUJVVEVfTGVmdEluc2V0LAotICBYRkFfQVRUUklCVVRFX1dpZG93cywKLSAgWEZBX0FUVFJJQlVURV9MZXZlbCwKLSAgWEZBX0FUVFJJQlVURV9Cb3R0b21JbnNldCwKLSAgWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RhcmdldCwKLSAgWEZBX0FUVFJJQlVURV9BbGxvd01hY3JvLAotICBYRkFfQVRUUklCVVRFX1BhZ2VQb3NpdGlvbiwKLSAgWEZBX0FUVFJJQlVURV9Db2x1bW5XaWR0aHMsCi0gIFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dMZWFkZXIsCi0gIFhGQV9BVFRSSUJVVEVfQWN0aW9uLAotICBYRkFfQVRUUklCVVRFX05vblJlcHVkaWF0aW9uLAotICBYRkFfQVRUUklCVVRFX1JhdGUsCi0gIFhGQV9BVFRSSUJVVEVfQWxsb3dSaWNoVGV4dCwKLSAgWEZBX0FUVFJJQlVURV9Sb2xlLAotICBYRkFfQVRUUklCVVRFX092ZXJmbG93VHJhaWxlciwKLSAgWEZBX0FUVFJJQlVURV9PcGVyYXRpb24sCi0gIFhGQV9BVFRSSUJVVEVfVGltZW91dCwKLSAgWEZBX0FUVFJJQlVURV9Ub3BJbnNldCwKLSAgWEZBX0FUVFJJQlVURV9BY2Nlc3MsCi0gIFhGQV9BVFRSSUJVVEVfQ29tbWFuZFR5cGUsCi0gIFhGQV9BVFRSSUJVVEVfRm9ybWF0LAotICBYRkFfQVRUUklCVVRFX0RhdGFQcmVwLAotICBYRkFfQVRUUklCVVRFX1dpZGdldERhdGEsCi0gIFhGQV9BVFRSSUJVVEVfQWJiciwKLSAgWEZBX0FUVFJJQlVURV9NYXJnaW5SaWdodCwKLSAgWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sCi0gIFhGQV9BVFRSSUJVVEVfRW5jaXBoZXJPbmx5LAotICBYRkFfQVRUUklCVVRFX0tlcm5pbmdNb2RlLAotICBYRkFfQVRUUklCVVRFX1JvdGF0ZSwKLSAgWEZBX0FUVFJJQlVURV9Xb3JkQ2hhcmFjdGVyQ291bnQsCi0gIFhGQV9BVFRSSUJVVEVfVHlwZSwKLSAgWEZBX0FUVFJJQlVURV9SZXNlcnZlLAotICBYRkFfQVRUUklCVVRFX1RleHRMb2NhdGlvbiwKLSAgWEZBX0FUVFJJQlVURV9Qcmlvcml0eSwKLSAgWEZBX0FUVFJJQlVURV9VbmRlcmxpbmUsCi0gIFhGQV9BVFRSSUJVVEVfTW9kdWxlV2lkdGgsCi0gIFhGQV9BVFRSSUJVVEVfSHlwaGVuYXRlLAotICBYRkFfQVRUUklCVVRFX0xpc3RlbiwKLSAgWEZBX0FUVFJJQlVURV9EZWxpbWl0ZXIsCi0gIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsCi0gIFhGQV9BVFRSSUJVVEVfU3RhcnROZXcsCi0gIFhGQV9BVFRSSUJVVEVfRW9mQWN0aW9uLAotICBYRkFfQVRUUklCVVRFX0FsbG93TmV1dHJhbCwKLSAgWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLAotICBYRkFfQVRUUklCVVRFX0Jhc2VsaW5lU2hpZnQsCi0gIFhGQV9BVFRSSUJVVEVfT3ZlcmxpbmVQZXJpb2QsCi0gIFhGQV9BVFRSSUJVVEVfRnJhY0RpZ2l0cywKLSAgWEZBX0FUVFJJQlVURV9PcmllbnRhdGlvbiwKLSAgWEZBX0FUVFJJQlVURV9UaW1lU3RhbXAsCi0gIFhGQV9BVFRSSUJVVEVfUHJpbnRDaGVja0RpZ2l0LAotICBYRkFfQVRUUklCVVRFX01hcmdpbkxlZnQsCi0gIFhGQV9BVFRSSUJVVEVfU3Ryb2tlLAotICBYRkFfQVRUUklCVVRFX01vZHVsZUhlaWdodCwKLSAgWEZBX0FUVFJJQlVURV9UcmFuc2ZlckVuY29kaW5nLAotICBYRkFfQVRUUklCVVRFX1VzYWdlLAotICBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLAotICBYRkFfQVRUUklCVVRFX1JhZGl4T2Zmc2V0LAotICBYRkFfQVRUUklCVVRFX1ByZXNlcnZlLAotICBYRkFfQVRUUklCVVRFX0FsaWFzTm9kZSwKLSAgWEZBX0FUVFJJQlVURV9NdWx0aUxpbmUsCi0gIFhGQV9BVFRSSUJVVEVfVmVyc2lvbiwKLSAgWEZBX0FUVFJJQlVURV9TdGFydENoYXIsCi0gIFhGQV9BVFRSSUJVVEVfU2NyaXB0VGVzdCwKLSAgWEZBX0FUVFJJQlVURV9TdGFydEFuZ2xlLAotICBYRkFfQVRUUklCVVRFX0N1cnNvclR5cGUsCi0gIFhGQV9BVFRSSUJVVEVfRGlnaXRhbFNpZ25hdHVyZSwKLSAgWEZBX0FUVFJJQlVURV9Db2RlVHlwZSwKLSAgWEZBX0FUVFJJQlVURV9PdXRwdXQsCi0gIFhGQV9BVFRSSUJVVEVfQm9va2VuZFRyYWlsZXIsCi0gIFhGQV9BVFRSSUJVVEVfSW1hZ2luZ0JCb3gsCi0gIFhGQV9BVFRSSUJVVEVfRXhjbHVkZUluaXRpYWxDYXAsCi0gIFhGQV9BVFRSSUJVVEVfRm9yY2UsCi0gIFhGQV9BVFRSSUJVVEVfQ3JsU2lnbiwKLSAgWEZBX0FUVFJJQlVURV9QcmV2aW91cywKLSAgWEZBX0FUVFJJQlVURV9QdXNoQ2hhcmFjdGVyQ291bnQsCi0gIFhGQV9BVFRSSUJVVEVfTnVsbFRlc3QsCi0gIFhGQV9BVFRSSUJVVEVfUnVuQXQsCi0gIFhGQV9BVFRSSUJVVEVfU3BhY2VCZWxvdywKLSAgWEZBX0FUVFJJQlVURV9Td2VlcEFuZ2xlLAotICBYRkFfQVRUUklCVVRFX051bWJlck9mQ2VsbHMsCi0gIFhGQV9BVFRSSUJVVEVfTGV0dGVyU3BhY2luZywKLSAgWEZBX0FUVFJJQlVURV9Mb2NrVHlwZSwKLSAgWEZBX0FUVFJJQlVURV9QYXNzd29yZENoYXIsCi0gIFhGQV9BVFRSSUJVVEVfVkFsaWduLAotICBYRkFfQVRUUklCVVRFX1NvdXJjZUJlbG93LAotICBYRkFfQVRUUklCVVRFX0ludmVydGVkLAotICBYRkFfQVRUUklCVVRFX01hcmssCi0gIFhGQV9BVFRSSUJVVEVfTWF4SCwKLSAgWEZBX0FUVFJJQlVURV9NYXhXLAotICBYRkFfQVRUUklCVVRFX1RydW5jYXRlLAotICBYRkFfQVRUUklCVVRFX01pbkgsCi0gIFhGQV9BVFRSSUJVVEVfTWluVywKLSAgWEZBX0FUVFJJQlVURV9Jbml0aWFsLAotICBYRkFfQVRUUklCVVRFX01vZGUsCi0gIFhGQV9BVFRSSUJVVEVfTGF5b3V0LAotICBYRkFfQVRUUklCVVRFX1NlcnZlciwKLSAgWEZBX0FUVFJJQlVURV9FbWJlZFBERiwKLSAgWEZBX0FUVFJJQlVURV9PZGRPckV2ZW4sCi0gIFhGQV9BVFRSSUJVVEVfVGFiRGVmYXVsdCwKLSAgWEZBX0FUVFJJQlVURV9Db250YWlucywKLSAgWEZBX0FUVFJJQlVURV9SaWdodEluc2V0LAotICBYRkFfQVRUUklCVVRFX01heENoYXJzLAotICBYRkFfQVRUUklCVVRFX09wZW4sCi0gIFhGQV9BVFRSSUJVVEVfUmVsYXRpb24sCi0gIFhGQV9BVFRSSUJVVEVfV2lkZU5hcnJvd1JhdGlvLAotICBYRkFfQVRUUklCVVRFX1JlbGV2YW50LAotICBYRkFfQVRUUklCVVRFX1NpZ25hdHVyZVR5cGUsCi0gIFhGQV9BVFRSSUJVVEVfTGluZVRocm91Z2hQZXJpb2QsCi0gIFhGQV9BVFRSSUJVVEVfU2hhcGUsCi0gIFhGQV9BVFRSSUJVVEVfVGFiU3RvcHMsCi0gIFhGQV9BVFRSSUJVVEVfT3V0cHV0QmVsb3csCi0gIFhGQV9BVFRSSUJVVEVfU2hvcnQsCi0gIFhGQV9BVFRSSUJVVEVfRm9udFZlcnRpY2FsU2NhbGUsCi0gIFhGQV9BVFRSSUJVVEVfVGhpY2tuZXNzLAotICBYRkFfQVRUUklCVVRFX0NvbW1pdE9uLAotICBYRkFfQVRUUklCVVRFX1JlbWFpbkNoYXJhY3RlckNvdW50LAotICBYRkFfQVRUUklCVVRFX0tleUFncmVlbWVudCwKLSAgWEZBX0FUVFJJQlVURV9FcnJvckNvcnJlY3Rpb25MZXZlbCwKLSAgWEZBX0FUVFJJQlVURV9VcHNNb2RlLAotICBYRkFfQVRUUklCVVRFX01lcmdlTW9kZSwKLSAgWEZBX0FUVFJJQlVURV9DaXJjdWxhciwKLSAgWEZBX0FUVFJJQlVURV9Qc05hbWUsCi0gIFhGQV9BVFRSSUJVVEVfVHJhaWxlciwKLSAgWEZBX0FUVFJJQlVURV9Vbmljb2RlUmFuZ2UsCi0gIFhGQV9BVFRSSUJVVEVfRXhlY3V0ZVR5cGUsCi0gIFhGQV9BVFRSSUJVVEVfRHVwbGV4SW1wb3NpdGlvbiwKLSAgWEZBX0FUVFJJQlVURV9UcmF5SW4sCi0gIFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsCi0gIFhGQV9BVFRSSUJVVEVfQm9mQWN0aW9uLAotICBYRkFfQVRUUklCVVRFX1NhdmUsCi0gIFhGQV9BVFRSSUJVVEVfVGFyZ2V0VHlwZSwKLSAgWEZBX0FUVFJJQlVURV9LZXlFbmNpcGhlcm1lbnQsCi0gIFhGQV9BVFRSSUJVVEVfQ3JlZGVudGlhbFNlcnZlclBvbGljeSwKLSAgWEZBX0FUVFJJQlVURV9TaXplLAotICBYRkFfQVRUUklCVVRFX0luaXRpYWxOdW1iZXIsCi0gIFhGQV9BVFRSSUJVVEVfU2xvcGUsCi0gIFhGQV9BVFRSSUJVVEVfQ1NwYWNlLAotICBYRkFfQVRUUklCVVRFX0NvbFNwYW4sCi0gIFhGQV9BVFRSSUJVVEVfQmluZGluZywKLSAgWEZBX0FUVFJJQlVURV9DaGVja3N1bSwKLSAgWEZBX0FUVFJJQlVURV9DaGFyRW5jb2RpbmcsCi0gIFhGQV9BVFRSSUJVVEVfQmluZCwKLSAgWEZBX0FUVFJJQlVURV9UZXh0RW50cnksCi0gIFhGQV9BVFRSSUJVVEVfQXJjaGl2ZSwKLSAgWEZBX0FUVFJJQlVURV9VdWlkLAotICBYRkFfQVRUUklCVVRFX1Bvc3R1cmUsCi0gIFhGQV9BVFRSSUJVVEVfQWZ0ZXIsCi0gIFhGQV9BVFRSSUJVVEVfT3JwaGFucywKLSAgWEZBX0FUVFJJQlVURV9RdWFsaWZpZWROYW1lLAotICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gIFhGQV9BVFRSSUJVVEVfTG9jYWxlLAotICBYRkFfQVRUUklCVVRFX1dlaWdodCwKLSAgWEZBX0FUVFJJQlVURV9VbmRlcmxpbmVQZXJpb2QsCi0gIFhGQV9BVFRSSUJVVEVfRGF0YSwKLSAgWEZBX0FUVFJJQlVURV9EZXNjLAotICBYRkFfQVRUUklCVVRFX051bWJlcmVkLAotICBYRkFfQVRUUklCVVRFX0RhdGFDb2x1bW5Db3VudCwKLSAgWEZBX0FUVFJJQlVURV9PdmVybGluZSwKLSAgWEZBX0FUVFJJQlVURV9VcmxQb2xpY3ksCi0gIFhGQV9BVFRSSUJVVEVfQW5jaG9yVHlwZSwKLSAgWEZBX0FUVFJJQlVURV9MYWJlbFJlZiwKLSAgWEZBX0FUVFJJQlVURV9Cb29rZW5kTGVhZGVyLAotICBYRkFfQVRUUklCVVRFX01heExlbmd0aCwKLSAgWEZBX0FUVFJJQlVURV9BY2Nlc3NLZXksCi0gIFhGQV9BVFRSSUJVVEVfQ3Vyc29yTG9jYXRpb24sCi0gIFhGQV9BVFRSSUJVVEVfRGVsYXllZE9wZW4sCi0gIFhGQV9BVFRSSUJVVEVfVGFyZ2V0LAotICBYRkFfQVRUUklCVVRFX0RhdGFFbmNpcGhlcm1lbnQsCi0gIFhGQV9BVFRSSUJVVEVfQWZ0ZXJUYXJnZXQsCi0gIFhGQV9BVFRSSUJVVEVfTGVhZGVyLAotICBYRkFfQVRUUklCVVRFX1BpY2tlciwKLSAgWEZBX0FUVFJJQlVURV9Gcm9tLAotICBYRkFfQVRUUklCVVRFX0Jhc2VQcm9maWxlLAotICBYRkFfQVRUUklCVVRFX0FzcGVjdCwKLSAgWEZBX0FUVFJJQlVURV9Sb3dDb2x1bW5SYXRpbywKLSAgWEZBX0FUVFJJQlVURV9MaW5lSGVpZ2h0LAotICBYRkFfQVRUUklCVVRFX0hpZ2hsaWdodCwKLSAgWEZBX0FUVFJJQlVURV9WYWx1ZVJlZiwKLSAgWEZBX0FUVFJJQlVURV9NYXhFbnRyaWVzLAotICBYRkFfQVRUUklCVVRFX0RhdGFMZW5ndGgsCi0gIFhGQV9BVFRSSUJVVEVfQWN0aXZpdHksCi0gIFhGQV9BVFRSSUJVVEVfSW5wdXQsCi0gIFhGQV9BVFRSSUJVVEVfVmFsdWUsCi0gIFhGQV9BVFRSSUJVVEVfQmxhbmtPck5vdEJsYW5rLAotICBYRkFfQVRUUklCVVRFX0FkZFJldm9jYXRpb25JbmZvLAotICBYRkFfQVRUUklCVVRFX0dlbmVyaWNGYW1pbHksCi0gIFhGQV9BVFRSSUJVVEVfSGFuZCwKLSAgWEZBX0FUVFJJQlVURV9IcmVmLAotICBYRkFfQVRUUklCVVRFX1RleHRFbmNvZGluZywKLSAgWEZBX0FUVFJJQlVURV9MZWFkRGlnaXRzLAotICBYRkFfQVRUUklCVVRFX1Blcm1pc3Npb25zLAotICBYRkFfQVRUUklCVVRFX1NwYWNlQWJvdmUsCi0gIFhGQV9BVFRSSUJVVEVfQ29kZUJhc2UsCi0gIFhGQV9BVFRSSUJVVEVfU3RvY2ssCi0gIFhGQV9BVFRSSUJVVEVfSXNOdWxsLAotICBYRkFfQVRUUklCVVRFX1Jlc3RvcmVTdGF0ZSwKLSAgWEZBX0FUVFJJQlVURV9FeGNsdWRlQWxsQ2FwcywKLSAgWEZBX0FUVFJJQlVURV9Gb3JtYXRUZXN0LAotICBYRkFfQVRUUklCVVRFX0hTY3JvbGxQb2xpY3ksCi0gIFhGQV9BVFRSSUJVVEVfSm9pbiwKLSAgWEZBX0FUVFJJQlVURV9LZXlDZXJ0U2lnbiwKLSAgWEZBX0FUVFJJQlVURV9SYWRpdXMsCi0gIFhGQV9BVFRSSUJVVEVfU291cmNlQWJvdmUsCi0gIFhGQV9BVFRSSUJVVEVfT3ZlcnJpZGUsCi0gIFhGQV9BVFRSSUJVVEVfQ2xhc3NJZCwKLSAgWEZBX0FUVFJJQlVURV9EaXNhYmxlLAotICBYRkFfQVRUUklCVVRFX1Njb3BlLAotICBYRkFfQVRUUklCVVRFX01hdGNoLAotICBYRkFfQVRUUklCVVRFX1BsYWNlbWVudCwKLSAgWEZBX0FUVFJJQlVURV9CZWZvcmUsCi0gIFhGQV9BVFRSSUJVVEVfV3JpdGluZ1NjcmlwdCwKLSAgWEZBX0FUVFJJQlVURV9FbmRDaGFyLAotICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gIFhGQV9BVFRSSUJVVEVfTG9uZywKLSAgWEZBX0FUVFJJQlVURV9JbnRhY3QsCi0gIFhGQV9BVFRSSUJVVEVfWGRwQ29udGVudCwKLSAgWEZBX0FUVFJJQlVURV9EZWNpcGhlck9ubHksCitlbnVtIGNsYXNzIFhGQV9BdHRyaWJ1dGUgOiB1aW50OF90IHsKKyAgSCA9IDAsCisgIFcsCisgIFgsCisgIFksCisgIElkLAorICBUbywKKyAgTGluZVRocm91Z2gsCisgIEhBbGlnbiwKKyAgVHlwZWZhY2UsCisgIEJlZm9yZVRhcmdldCwKKyAgTmFtZSwKKyAgTmV4dCwKKyAgRGF0YVJvd0NvdW50LAorICBCcmVhaywKKyAgVlNjcm9sbFBvbGljeSwKKyAgRm9udEhvcml6b250YWxTY2FsZSwKKyAgVGV4dEluZGVudCwKKyAgQ29udGV4dCwKKyAgVHJheU91dCwKKyAgQ2FwLAorICBNYXgsCisgIE1pbiwKKyAgUmVmLAorICBSaWQsCisgIFVybCwKKyAgVXNlLAorICBMZWZ0SW5zZXQsCisgIFdpZG93cywKKyAgTGV2ZWwsCisgIEJvdHRvbUluc2V0LAorICBPdmVyZmxvd1RhcmdldCwKKyAgQWxsb3dNYWNybywKKyAgUGFnZVBvc2l0aW9uLAorICBDb2x1bW5XaWR0aHMsCisgIE92ZXJmbG93TGVhZGVyLAorICBBY3Rpb24sCisgIE5vblJlcHVkaWF0aW9uLAorICBSYXRlLAorICBBbGxvd1JpY2hUZXh0LAorICBSb2xlLAorICBPdmVyZmxvd1RyYWlsZXIsCisgIE9wZXJhdGlvbiwKKyAgVGltZW91dCwKKyAgVG9wSW5zZXQsCisgIEFjY2VzcywKKyAgQ29tbWFuZFR5cGUsCisgIEZvcm1hdCwKKyAgRGF0YVByZXAsCisgIFdpZGdldERhdGEsCisgIEFiYnIsCisgIE1hcmdpblJpZ2h0LAorICBEYXRhRGVzY3JpcHRpb24sCisgIEVuY2lwaGVyT25seSwKKyAgS2VybmluZ01vZGUsCisgIFJvdGF0ZSwKKyAgV29yZENoYXJhY3RlckNvdW50LAorICBUeXBlLAorICBSZXNlcnZlLAorICBUZXh0TG9jYXRpb24sCisgIFByaW9yaXR5LAorICBVbmRlcmxpbmUsCisgIE1vZHVsZVdpZHRoLAorICBIeXBoZW5hdGUsCisgIExpc3RlbiwKKyAgRGVsaW1pdGVyLAorICBDb250ZW50VHlwZSwKKyAgU3RhcnROZXcsCisgIEVvZkFjdGlvbiwKKyAgQWxsb3dOZXV0cmFsLAorICBDb25uZWN0aW9uLAorICBCYXNlbGluZVNoaWZ0LAorICBPdmVybGluZVBlcmlvZCwKKyAgRnJhY0RpZ2l0cywKKyAgT3JpZW50YXRpb24sCisgIFRpbWVTdGFtcCwKKyAgUHJpbnRDaGVja0RpZ2l0LAorICBNYXJnaW5MZWZ0LAorICBTdHJva2UsCisgIE1vZHVsZUhlaWdodCwKKyAgVHJhbnNmZXJFbmNvZGluZywKKyAgVXNhZ2UsCisgIFByZXNlbmNlLAorICBSYWRpeE9mZnNldCwKKyAgUHJlc2VydmUsCisgIEFsaWFzTm9kZSwKKyAgTXVsdGlMaW5lLAorICBWZXJzaW9uLAorICBTdGFydENoYXIsCisgIFNjcmlwdFRlc3QsCisgIFN0YXJ0QW5nbGUsCisgIEN1cnNvclR5cGUsCisgIERpZ2l0YWxTaWduYXR1cmUsCisgIENvZGVUeXBlLAorICBPdXRwdXQsCisgIEJvb2tlbmRUcmFpbGVyLAorICBJbWFnaW5nQkJveCwKKyAgRXhjbHVkZUluaXRpYWxDYXAsCisgIEZvcmNlLAorICBDcmxTaWduLAorICBQcmV2aW91cywKKyAgUHVzaENoYXJhY3RlckNvdW50LAorICBOdWxsVGVzdCwKKyAgUnVuQXQsCisgIFNwYWNlQmVsb3csCisgIFN3ZWVwQW5nbGUsCisgIE51bWJlck9mQ2VsbHMsCisgIExldHRlclNwYWNpbmcsCisgIExvY2tUeXBlLAorICBQYXNzd29yZENoYXIsCisgIFZBbGlnbiwKKyAgU291cmNlQmVsb3csCisgIEludmVydGVkLAorICBNYXJrLAorICBNYXhILAorICBNYXhXLAorICBUcnVuY2F0ZSwKKyAgTWluSCwKKyAgTWluVywKKyAgSW5pdGlhbCwKKyAgTW9kZSwKKyAgTGF5b3V0LAorICBTZXJ2ZXIsCisgIEVtYmVkUERGLAorICBPZGRPckV2ZW4sCisgIFRhYkRlZmF1bHQsCisgIENvbnRhaW5zLAorICBSaWdodEluc2V0LAorICBNYXhDaGFycywKKyAgT3BlbiwKKyAgUmVsYXRpb24sCisgIFdpZGVOYXJyb3dSYXRpbywKKyAgUmVsZXZhbnQsCisgIFNpZ25hdHVyZVR5cGUsCisgIExpbmVUaHJvdWdoUGVyaW9kLAorICBTaGFwZSwKKyAgVGFiU3RvcHMsCisgIE91dHB1dEJlbG93LAorICBTaG9ydCwKKyAgRm9udFZlcnRpY2FsU2NhbGUsCisgIFRoaWNrbmVzcywKKyAgQ29tbWl0T24sCisgIFJlbWFpbkNoYXJhY3RlckNvdW50LAorICBLZXlBZ3JlZW1lbnQsCisgIEVycm9yQ29ycmVjdGlvbkxldmVsLAorICBVcHNNb2RlLAorICBNZXJnZU1vZGUsCisgIENpcmN1bGFyLAorICBQc05hbWUsCisgIFRyYWlsZXIsCisgIFVuaWNvZGVSYW5nZSwKKyAgRXhlY3V0ZVR5cGUsCisgIER1cGxleEltcG9zaXRpb24sCisgIFRyYXlJbiwKKyAgQmluZGluZ05vZGUsCisgIEJvZkFjdGlvbiwKKyAgU2F2ZSwKKyAgVGFyZ2V0VHlwZSwKKyAgS2V5RW5jaXBoZXJtZW50LAorICBDcmVkZW50aWFsU2VydmVyUG9saWN5LAorICBTaXplLAorICBJbml0aWFsTnVtYmVyLAorICBTbG9wZSwKKyAgQ1NwYWNlLAorICBDb2xTcGFuLAorICBCaW5kaW5nLAorICBDaGVja3N1bSwKKyAgQ2hhckVuY29kaW5nLAorICBCaW5kLAorICBUZXh0RW50cnksCisgIEFyY2hpdmUsCisgIFV1aWQsCisgIFBvc3R1cmUsCisgIEFmdGVyLAorICBPcnBoYW5zLAorICBRdWFsaWZpZWROYW1lLAorICBVc2VocmVmLAorICBMb2NhbGUsCisgIFdlaWdodCwKKyAgVW5kZXJsaW5lUGVyaW9kLAorICBEYXRhLAorICBEZXNjLAorICBOdW1iZXJlZCwKKyAgRGF0YUNvbHVtbkNvdW50LAorICBPdmVybGluZSwKKyAgVXJsUG9saWN5LAorICBBbmNob3JUeXBlLAorICBMYWJlbFJlZiwKKyAgQm9va2VuZExlYWRlciwKKyAgTWF4TGVuZ3RoLAorICBBY2Nlc3NLZXksCisgIEN1cnNvckxvY2F0aW9uLAorICBEZWxheWVkT3BlbiwKKyAgVGFyZ2V0LAorICBEYXRhRW5jaXBoZXJtZW50LAorICBBZnRlclRhcmdldCwKKyAgTGVhZGVyLAorICBQaWNrZXIsCisgIEZyb20sCisgIEJhc2VQcm9maWxlLAorICBBc3BlY3QsCisgIFJvd0NvbHVtblJhdGlvLAorICBMaW5lSGVpZ2h0LAorICBIaWdobGlnaHQsCisgIFZhbHVlUmVmLAorICBNYXhFbnRyaWVzLAorICBEYXRhTGVuZ3RoLAorICBBY3Rpdml0eSwKKyAgSW5wdXQsCisgIFZhbHVlLAorICBCbGFua09yTm90QmxhbmssCisgIEFkZFJldm9jYXRpb25JbmZvLAorICBHZW5lcmljRmFtaWx5LAorICBIYW5kLAorICBIcmVmLAorICBUZXh0RW5jb2RpbmcsCisgIExlYWREaWdpdHMsCisgIFBlcm1pc3Npb25zLAorICBTcGFjZUFib3ZlLAorICBDb2RlQmFzZSwKKyAgU3RvY2ssCisgIElzTnVsbCwKKyAgUmVzdG9yZVN0YXRlLAorICBFeGNsdWRlQWxsQ2FwcywKKyAgRm9ybWF0VGVzdCwKKyAgSFNjcm9sbFBvbGljeSwKKyAgSm9pbiwKKyAgS2V5Q2VydFNpZ24sCisgIFJhZGl1cywKKyAgU291cmNlQWJvdmUsCisgIE92ZXJyaWRlLAorICBDbGFzc0lkLAorICBEaXNhYmxlLAorICBTY29wZSwKKyAgTWF0Y2gsCisgIFBsYWNlbWVudCwKKyAgQmVmb3JlLAorICBXcml0aW5nU2NyaXB0LAorICBFbmRDaGFyLAorICBMb2NrLAorICBMb25nLAorICBJbnRhY3QsCisgIFhkcENvbnRlbnQsCisgIERlY2lwaGVyT25seSwKKyAgVW5rbm93biA9IDI1NSwKIH07CiAKIGVudW0gY2xhc3MgWEZBX0VsZW1lbnQgOiBpbnQzMl90IHsKQEAgLTgyOCw3ICs4MjksNyBAQAogICBDb21wcmVzc09iamVjdFN0cmVhbSwKICAgRGF0YVZhbHVlLAogICBBY2Nlc3NpYmxlQ29udGVudCwKLSAgTm9kZUxpc3QsCisgIFRyZWVMaXN0LAogICBJbmNsdWRlWERQQ29udGVudCwKICAgWG1sQ29ubmVjdGlvbiwKICAgVmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMsCkBAIC05MjYsMzkgKzkyNywxNiBAQAogICBUYWdnZWQsCiAgIEl0ZW1zCiB9Owotc3RydWN0IFhGQV9FTEVNRU5USU5GTyB7Ci0gIHVpbnQzMl90IHVIYXNoOwotICBjb25zdCBGWF9XQ0hBUiogcE5hbWU7Ci0gIFhGQV9FbGVtZW50IGVOYW1lOwotICB1aW50MzJfdCBkd1BhY2tldHM7Ci0gIFhGQV9PYmplY3RUeXBlIGVPYmplY3RUeXBlOwotfTsKIAotZW51bSBYRkFfQVRUUklCVVRFVFlQRSB7Ci0gIFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUsCi0gIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLAotICBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLAotICBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLAotICBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLAotfTsKLXN0cnVjdCBYRkFfQVRUUklCVVRFSU5GTyB7Ci0gIHVpbnQzMl90IHVIYXNoOwotICBjb25zdCBGWF9XQ0hBUiogcE5hbWU7Ci0gIFhGQV9BVFRSSUJVVEUgZU5hbWU7Ci0gIFhGQV9BVFRSSUJVVEVUWVBFIGVUeXBlOwotICB1aW50MzJfdCBkd1BhY2tldHM7Ci0gIHZvaWQqIHBEZWZWYWx1ZTsKLX07Ci0KLXN0cnVjdCBYRkFfRUxFTUVOVEhJRVJBUkNIWSB7Ci0gIHVpbnQxNl90IHdTdGFydDsKLSAgdWludDE2X3Qgd0NvdW50OworZW51bSBjbGFzcyBYRkFfQXR0cmlidXRlVHlwZSA6IHVpbnQ4X3QgeworICBFbnVtLAorICBDRGF0YSwKKyAgQm9vbGVhbiwKKyAgSW50ZWdlciwKKyAgTWVhc3VyZSwKIH07CiAKIHN0cnVjdCBYRkFfU0NSSVBUSElFUkFSQ0hZIHsKLSAgdWludDE2X3Qgd01ldGhvZFN0YXJ0OwotICB1aW50MTZfdCB3TWV0aG9kQ291bnQ7CiAgIHVpbnQxNl90IHdBdHRyaWJ1dGVTdGFydDsKICAgdWludDE2X3Qgd0F0dHJpYnV0ZUNvdW50OwogICBpbnQxNl90IHdQYXJlbnRJbmRleDsKQEAgLTk2Niw2MSArOTQ0LDQwIEBACiAKICNkZWZpbmUgWEZBX1BST1BFUlRZRkxBR19PbmVPZiAweDAxCiAjZGVmaW5lIFhGQV9QUk9QRVJUWUZMQUdfRGVmYXVsdE9uZU9mIDB4MDIKLXN0cnVjdCBYRkFfUFJPUEVSVFkgewotICBYRkFfRWxlbWVudCBlTmFtZTsKLSAgdWludDhfdCB1T2NjdXI7Ci0gIHVpbnQ4X3QgdUZsYWdzOwotfTsKIAotc3RydWN0IFhGQV9BVFRSSUJVVEVFTlVNSU5GTyB7CitzdHJ1Y3QgWEZBX0F0dHJpYnV0ZUVudW1JbmZvIHsKICAgdWludDMyX3QgdUhhc2g7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwTmFtZTsKLSAgWEZBX0FUVFJJQlVURUVOVU0gZU5hbWU7CisgIGNvbnN0IHdjaGFyX3QqIHBOYW1lOworICBYRkFfQXR0cmlidXRlRW51bSBlTmFtZTsKIH07CiAKLWVudW0gWEZBX1VOSVQgewotICBYRkFfVU5JVF9Vbmtub3duLAotICBYRkFfVU5JVF9QZXJjZW50LAotICBYRkFfVU5JVF9BbmdsZSwKLSAgWEZBX1VOSVRfRW0sCi0gIFhGQV9VTklUX1B0LAotICBYRkFfVU5JVF9JbiwKLSAgWEZBX1VOSVRfUGMsCi0gIFhGQV9VTklUX0NtLAotICBYRkFfVU5JVF9NbSwKLSAgWEZBX1VOSVRfTXAsCitlbnVtIGNsYXNzIFhGQV9Vbml0IDogdWludDhfdCB7CisgIFBlcmNlbnQgPSAwLAorICBFbSwKKyAgUHQsCisgIEluLAorICBQYywKKyAgQ20sCisgIE1tLAorICBNcCwKKworICBVbmtub3duID0gMjU1LAogfTsKIAotc3RydWN0IFhGQV9OT1RTVVJFQVRUUklCVVRFIHsKLSAgWEZBX0VsZW1lbnQgZUVsZW1lbnQ7Ci0gIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZTsKLSAgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGU7Ci0gIHZvaWQqIHBWYWx1ZTsKK3R5cGVkZWYgdm9pZCAoQ0pYX09iamVjdDo6KlhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spKENGWEpTRV9WYWx1ZSogcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSk7CitlbnVtIGNsYXNzIFhGQV9TY3JpcHRUeXBlIDogdWludDhfdCB7CisgIEJhc2ljLAorICBPYmplY3QsCiB9OwogCi1jbGFzcyBDRlhKU0VfQXJndW1lbnRzOwotY2xhc3MgQ1hGQV9PYmplY3Q7Ci0KLXR5cGVkZWYgdm9pZCAoQ1hGQV9PYmplY3Q6OipYRkFfTUVUSE9EX0NBTExCQUNLKShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLXN0cnVjdCBYRkFfTUVUSE9ESU5GTyB7Ci0gIHVpbnQzMl90IHVIYXNoOwotICBjb25zdCBGWF9XQ0hBUiogcE5hbWU7Ci0gIFhGQV9NRVRIT0RfQ0FMTEJBQ0sgbHBmbkNhbGxiYWNrOwotfTsKLQotdHlwZWRlZiB2b2lkIChDWEZBX09iamVjdDo6KlhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLWVudW0gWEZBX1NDUklQVF9UWVBFIHsKLSAgWEZBX1NDUklQVF9CYXNpYywKLSAgWEZBX1NDUklQVF9PYmplY3QsCi19Owogc3RydWN0IFhGQV9TQ1JJUFRBVFRSSUJVVEVJTkZPIHsKICAgdWludDMyX3QgdUhhc2g7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwTmFtZTsKLSAgWEZBX0FUVFJJQlVURV9DQUxMQkFDSyBscGZuQ2FsbGJhY2s7Ci0gIGludDMyX3QgZUF0dHJpYnV0ZTsKLSAgdWludDE2X3QgZVZhbHVlVHlwZTsKKyAgY29uc3Qgd2NoYXJfdCogcE5hbWU7CisgIFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0sgY2FsbGJhY2s7CisgIFhGQV9BdHRyaWJ1dGUgYXR0cmlidXRlOworICBYRkFfU2NyaXB0VHlwZSBlVmFsdWVUeXBlOwogfTsKIAogI2VuZGlmICAvLyBYRkFfRlhGQV9GWEZBX0JBU0lDX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9meGZhX3dpZGdldC5oIGIveGZhL2Z4ZmEvZnhmYV93aWRnZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRjNjNjOS4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9meGZhX3dpZGdldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhGQV9GWEZBX1dJREdFVF9IXwotI2RlZmluZSBYRkFfRlhGQV9GWEZBX1dJREdFVF9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfcmV0YWluX3B0ci5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYm94LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXZlbnQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbWFnZS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21hcmdpbi5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NjcmlwdC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZhbHVlLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2lkZ2V0ZGF0YS5oIgotCi1jbGFzcyBDRkdBU19HRUZvbnQ7Ci1jbGFzcyBDWEZBX0V2ZW50UGFyYW07Ci1jbGFzcyBDWEZBX0ZGQXBwOwotY2xhc3MgQ1hGQV9GRkRvYzsKLWNsYXNzIENYRkFfRkZEb2NWaWV3OwotY2xhc3MgQ1hGQV9GRldpZGdldDsKLWNsYXNzIENYRkFfTm9kZTsKLWNsYXNzIENYRkFfVGV4dExheW91dDsKLWNsYXNzIENYRkFfV2lkZ2V0TGF5b3V0RGF0YTsKLWNsYXNzIElYRkFfQXBwUHJvdmlkZXI7Ci0KLWNsYXNzIENYRkFfV2lkZ2V0QWNjIDogcHVibGljIENYRkFfV2lkZ2V0RGF0YSB7Ci0gcHVibGljOgotICBDWEZBX1dpZGdldEFjYyhDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsIENYRkFfTm9kZSogcE5vZGUpOwotICB+Q1hGQV9XaWRnZXRBY2MoKTsKLQotICBib29sIEdldE5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSwgaW50MzJfdCBpTmFtZVR5cGUgPSAwKTsKLSAgYm9vbCBQcm9jZXNzVmFsdWVDaGFuZ2VkKCk7Ci0gIHZvaWQgUmVzZXREYXRhKCk7Ci0KLSAgdm9pZCBTZXRJbWFnZUVkaXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0hyZWYsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGEpOwotCi0gIENYRkFfV2lkZ2V0QWNjKiBHZXRFeGNsR3JvdXAoKTsKLSAgQ1hGQV9GRkRvY1ZpZXcqIEdldERvY1ZpZXcoKTsKLSAgQ1hGQV9GRkRvYyogR2V0RG9jKCk7Ci0gIENYRkFfRkZBcHAqIEdldEFwcCgpOwotICBJWEZBX0FwcFByb3ZpZGVyKiBHZXRBcHBQcm92aWRlcigpOwotCi0gIGludDMyX3QgUHJvY2Vzc0V2ZW50KGludDMyX3QgaUFjdGl2aXR5LCBDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtKTsKLSAgaW50MzJfdCBQcm9jZXNzRXZlbnQoQ1hGQV9FdmVudCYgZXZlbnQsIENYRkFfRXZlbnRQYXJhbSogcEV2ZW50UGFyYW0pOwotICBpbnQzMl90IFByb2Nlc3NDYWxjdWxhdGUoKTsKLSAgaW50MzJfdCBQcm9jZXNzVmFsaWRhdGUoaW50MzJfdCBpRmxhZ3MgPSAwKTsKLSAgaW50MzJfdCBFeGVjdXRlU2NyaXB0KENYRkFfU2NyaXB0IHNjcmlwdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRXZlbnRQYXJhbSogcEV2ZW50UGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqKiBwUmV0VmFsdWUgPSBudWxscHRyKTsKLQotICBDWEZBX0ZGV2lkZ2V0KiBHZXROZXh0V2lkZ2V0KENYRkFfRkZXaWRnZXQqIHBXaWRnZXQpOwotICB2b2lkIFN0YXJ0V2lkZ2V0TGF5b3V0KEZYX0ZMT0FUJiBmQ2FsY1dpZHRoLCBGWF9GTE9BVCYgZkNhbGNIZWlnaHQpOwotICBib29sIEZpbmRTcGxpdFBvcyhpbnQzMl90IGlCbG9ja0luZGV4LCBGWF9GTE9BVCYgZkNhbGNIZWlnaHQpOwotICBib29sIExvYWRDYXB0aW9uKCk7Ci0gIHZvaWQgTG9hZFRleHQoKTsKLSAgYm9vbCBMb2FkSW1hZ2VJbWFnZSgpOwotICBib29sIExvYWRJbWFnZUVkaXRJbWFnZSgpOwotICB2b2lkIEdldEltYWdlRHBpKGludDMyX3QmIGlJbWFnZVhEcGksIGludDMyX3QmIGlJbWFnZVlEcGkpOwotICB2b2lkIEdldEltYWdlRWRpdERwaShpbnQzMl90JiBpSW1hZ2VYRHBpLCBpbnQzMl90JiBpSW1hZ2VZRHBpKTsKLSAgQ1hGQV9UZXh0TGF5b3V0KiBHZXRDYXB0aW9uVGV4dExheW91dCgpOwotICBDWEZBX1RleHRMYXlvdXQqIEdldFRleHRMYXlvdXQoKTsKLSAgQ0ZYX0RJQml0bWFwKiBHZXRJbWFnZUltYWdlKCk7Ci0gIENGWF9ESUJpdG1hcCogR2V0SW1hZ2VFZGl0SW1hZ2UoKTsKLSAgdm9pZCBTZXRJbWFnZUltYWdlKENGWF9ESUJpdG1hcCogbmV3SW1hZ2UpOwotICB2b2lkIFNldEltYWdlRWRpdEltYWdlKENGWF9ESUJpdG1hcCogbmV3SW1hZ2UpOwotICB2b2lkIFVwZGF0ZVVJRGlzcGxheShDWEZBX0ZGV2lkZ2V0KiBwRXhjZXB0ID0gbnVsbHB0cik7Ci0KLSAgQ1hGQV9Ob2RlKiBHZXREYXRhc2V0cygpOwotICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gR2V0RkRFRm9udCgpOwotICBGWF9GTE9BVCBHZXRGb250U2l6ZSgpOwotICBGWF9BUkdCIEdldFRleHRDb2xvcigpOwotICBGWF9GTE9BVCBHZXRMaW5lSGVpZ2h0KCk7Ci0gIENYRkFfV2lkZ2V0TGF5b3V0RGF0YSogR2V0V2lkZ2V0TGF5b3V0RGF0YSgpOwotCi0gcHJvdGVjdGVkOgotICB2b2lkIFByb2Nlc3NTY3JpcHRUZXN0VmFsaWRhdGUoQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFJldFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVmVyc2lvbkZsYWcpOwotICBpbnQzMl90IFByb2Nlc3NGb3JtYXRUZXN0VmFsaWRhdGUoQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSwgYm9vbCBiVmVyc2lvbkZsYWcpOwotICBpbnQzMl90IFByb2Nlc3NOdWxsVGVzdFZhbGlkYXRlKENYRkFfVmFsaWRhdGUgdmFsaWRhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVmVyc2lvbkZsYWcpOwotICBDRlhfV2lkZVN0cmluZyBHZXRWYWxpZGF0ZUNhcHRpb25OYW1lKGJvb2wgYlZlcnNpb25GbGFnKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0VmFsaWRhdGVNZXNzYWdlKGJvb2wgYkVycm9yLCBib29sIGJWZXJzaW9uRmxhZyk7Ci0gIHZvaWQgQ2FsY0NhcHRpb25TaXplKENGWF9TaXplRiYgc3pDYXApOwotICBib29sIENhbGN1bGF0ZUZpZWxkQXV0b1NpemUoQ0ZYX1NpemVGJiBzaXplKTsKLSAgYm9vbCBDYWxjdWxhdGVXaWRnZXRBdXRvU2l6ZShDRlhfU2l6ZUYmIHNpemUpOwotICBib29sIENhbGN1bGF0ZVRleHRFZGl0QXV0b1NpemUoQ0ZYX1NpemVGJiBzaXplKTsKLSAgYm9vbCBDYWxjdWxhdGVDaGVja0J1dHRvbkF1dG9TaXplKENGWF9TaXplRiYgc2l6ZSk7Ci0gIGJvb2wgQ2FsY3VsYXRlUHVzaEJ1dHRvbkF1dG9TaXplKENGWF9TaXplRiYgc2l6ZSk7Ci0gIGJvb2wgQ2FsY3VsYXRlSW1hZ2VFZGl0QXV0b1NpemUoQ0ZYX1NpemVGJiBzaXplKTsKLSAgYm9vbCBDYWxjdWxhdGVJbWFnZUF1dG9TaXplKENGWF9TaXplRiYgc2l6ZSk7Ci0gIGJvb2wgQ2FsY3VsYXRlVGV4dEF1dG9TaXplKENGWF9TaXplRiYgc2l6ZSk7Ci0gIEZYX0ZMT0FUIENhbGN1bGF0ZVdpZGdldEF1dG9IZWlnaHQoRlhfRkxPQVQgZkhlaWdodENhbGMpOwotICBGWF9GTE9BVCBDYWxjdWxhdGVXaWRnZXRBdXRvV2lkdGgoRlhfRkxPQVQgZldpZHRoQ2FsYyk7Ci0gIEZYX0ZMT0FUIEdldFdpZHRoV2l0aG91dE1hcmdpbihGWF9GTE9BVCBmV2lkdGhDYWxjKTsKLSAgRlhfRkxPQVQgR2V0SGVpZ2h0V2l0aG91dE1hcmdpbihGWF9GTE9BVCBmSGVpZ2h0Q2FsYyk7Ci0gIHZvaWQgQ2FsY3VsYXRlVGV4dENvbnRlbnRTaXplKENGWF9TaXplRiYgc2l6ZSk7Ci0gIHZvaWQgQ2FsY3VsYXRlQWNjV2lkdGhBbmRIZWlnaHQoWEZBX0VsZW1lbnQgZVVJVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUJiBmQ2FsY0hlaWdodCk7Ci0gIHZvaWQgSW5pdExheW91dERhdGEoKTsKLSAgdm9pZCBTdGFydFRleHRMYXlvdXQoRlhfRkxPQVQmIGZDYWxjV2lkdGgsIEZYX0ZMT0FUJiBmQ2FsY0hlaWdodCk7Ci0KLSAgQ1hGQV9GRkRvY1ZpZXcqIG1fcERvY1ZpZXc7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX1dpZGdldExheW91dERhdGE+IG1fcExheW91dERhdGE7Ci0gIHVpbnQzMl90IG1fblJlY3Vyc2lvbkRlcHRoOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhGQV9GWEZBX1dJREdFVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfZGF0YXdpbmRvdy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9kYXRhd2luZG93LmNwcAppbmRleCBjMDM1NGExLi4wYmYxN2U1IDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9kYXRhd2luZG93LmNwcAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9kYXRhd2luZG93LmNwcApAQCAtNiw0MCArNiwxNyBAQAogCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfZGF0YXdpbmRvdy5oIgogCi0jaW5jbHVkZSAiZnhqcy9jZnhqc2VfYXJndW1lbnRzLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2RhdGF3aW5kb3cuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX2xvY2FsZW1nci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfb2JqZWN0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxlbWdyLmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV91dGlscy5oIgogCiBDU2NyaXB0X0RhdGFXaW5kb3c6OkNTY3JpcHRfRGF0YVdpbmRvdyhDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpCiAgICAgOiBDWEZBX09iamVjdChwRG9jdW1lbnQsCiAgICAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6T2JqZWN0LAogICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkRhdGFXaW5kb3csCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MoTCJkYXRhV2luZG93IikpIHt9CisgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nVmlldyhMImRhdGFXaW5kb3ciKSwKKyAgICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfRGF0YVdpbmRvdz4odGhpcykpIHt9CiAKIENTY3JpcHRfRGF0YVdpbmRvdzo6fkNTY3JpcHRfRGF0YVdpbmRvdygpIHt9Ci0KLXZvaWQgQ1NjcmlwdF9EYXRhV2luZG93OjpNb3ZlQ3VycmVudFJlY29yZChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7fQotCi12b2lkIENTY3JpcHRfRGF0YVdpbmRvdzo6UmVjb3JkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHt9Ci0KLXZvaWQgQ1NjcmlwdF9EYXRhV2luZG93OjpHb3RvUmVjb3JkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHt9Ci0KLXZvaWQgQ1NjcmlwdF9EYXRhV2luZG93OjpJc1JlY29yZEdyb3VwKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHt9Ci0KLXZvaWQgQ1NjcmlwdF9EYXRhV2luZG93OjpSZWNvcmRzQmVmb3JlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkge30KLQotdm9pZCBDU2NyaXB0X0RhdGFXaW5kb3c6OkN1cnJlbnRSZWNvcmROdW1iZXIoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7fQotCi12b2lkIENTY3JpcHRfRGF0YVdpbmRvdzo6UmVjb3Jkc0FmdGVyKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHt9Ci0KLXZvaWQgQ1NjcmlwdF9EYXRhV2luZG93OjpJc0RlZmluZWQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jc2NyaXB0X2RhdGF3aW5kb3cuaCBiL3hmYS9meGZhL3BhcnNlci9jc2NyaXB0X2RhdGF3aW5kb3cuaAppbmRleCBlNDFiN2ZlLi44MTllOGZlIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9kYXRhd2luZG93LmgKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfZGF0YXdpbmRvdy5oCkBAIC03LDI4ICs3LDE3IEBACiAjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DU0NSSVBUX0RBVEFXSU5ET1dfSF8KICNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NTQ1JJUFRfREFUQVdJTkRPV19IXwogCi0jaW5jbHVkZSAiZnhqcy9jZnhqc2VfYXJndW1lbnRzLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZGF0YXdpbmRvdy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX29iamVjdC5oIgogCiBjbGFzcyBDU2NyaXB0X0RhdGFXaW5kb3cgOiBwdWJsaWMgQ1hGQV9PYmplY3QgewogIHB1YmxpYzoKICAgZXhwbGljaXQgQ1NjcmlwdF9EYXRhV2luZG93KENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiAgIH5DU2NyaXB0X0RhdGFXaW5kb3coKSBvdmVycmlkZTsKIAotICB2b2lkIE1vdmVDdXJyZW50UmVjb3JkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFJlY29yZChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBHb3RvUmVjb3JkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIElzUmVjb3JkR3JvdXAoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgUmVjb3Jkc0JlZm9yZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIEN1cnJlbnRSZWNvcmROdW1iZXIoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBSZWNvcmRzQWZ0ZXIoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgSXNEZWZpbmVkKENGWEpTRV9WYWx1ZSogcFZhbHVlLCBib29sIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOworICBDSlhfRGF0YVdpbmRvdyogSlNEYXRhV2luZG93KCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDSlhfRGF0YVdpbmRvdyo+KEpTT2JqZWN0KCkpOworICB9CiB9OwogCiAjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DU0NSSVBUX0RBVEFXSU5ET1dfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jc2NyaXB0X2V2ZW50cHNldWRvbW9kZWwuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfZXZlbnRwc2V1ZG9tb2RlbC5jcHAKaW5kZXggOGNmZWRkMi4uZGE3ZmNiNCAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfZXZlbnRwc2V1ZG9tb2RlbC5jcHAKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfZXZlbnRwc2V1ZG9tb2RlbC5jcHAKQEAgLTYsMjI3ICs2LDE0IEBACiAKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmgiCiAKLSNpbmNsdWRlICJmeGpzL2NmeGpzZV9hcmd1bWVudHMuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2Zmbm90aWZ5LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9ldmVudHBhcmFtLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zY3JpcHRjb250ZXh0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9sb2NhbGVtZ3IuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfdXRpbHMuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZ3aWRnZXRoYW5kbGVyLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLXZvaWQgU3RyaW5nUHJvcGVydHkoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLAotICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nKSB7Ci0gIGlmIChiU2V0dGluZykgewotICAgIHdzVmFsdWUgPSBwVmFsdWUtPlRvV2lkZVN0cmluZygpOwotICAgIHJldHVybjsKLSAgfQotICBwVmFsdWUtPlNldFN0cmluZyh3c1ZhbHVlLlVURjhFbmNvZGUoKS5Bc1N0cmluZ0MoKSk7Ci19Ci0KLXZvaWQgSW50ZXJQcm9wZXJ0eShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwgaW50MzJfdCYgaVZhbHVlLCBib29sIGJTZXR0aW5nKSB7Ci0gIGlmIChiU2V0dGluZykgewotICAgIGlWYWx1ZSA9IHBWYWx1ZS0+VG9JbnRlZ2VyKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBWYWx1ZS0+U2V0SW50ZWdlcihpVmFsdWUpOwotfQotCi12b2lkIEJvb2xlYW5Qcm9wZXJ0eShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwgYm9vbCYgYlZhbHVlLCBib29sIGJTZXR0aW5nKSB7Ci0gIGlmIChiU2V0dGluZykgewotICAgIGJWYWx1ZSA9IHBWYWx1ZS0+VG9Cb29sZWFuKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBWYWx1ZS0+U2V0Qm9vbGVhbihiVmFsdWUpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfb2JqZWN0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogCiBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpCiAgICAgOiBDWEZBX09iamVjdChwRG9jdW1lbnQsCiAgICAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6T2JqZWN0LAogICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkV2ZW50UHNldWRvTW9kZWwsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MoTCJldmVudFBzZXVkb01vZGVsIikpIHt9CisgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nVmlldyhMImV2ZW50UHNldWRvTW9kZWwiKSwKKyAgICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfRXZlbnRQc2V1ZG9Nb2RlbD4odGhpcykpIHt9CiAKIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6fkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbCgpIHt9Ci0KLXZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpQcm9wZXJ0eShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRXZlbnQgZHdGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcpIHsKLSAgQ1hGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7Ci0gIGlmICghcFNjcmlwdENvbnRleHQpCi0gICAgcmV0dXJuOwotCi0gIENYRkFfRXZlbnRQYXJhbSogcEV2ZW50UGFyYW0gPSBwU2NyaXB0Q29udGV4dC0+R2V0RXZlbnRQYXJhbSgpOwotICBpZiAoIXBFdmVudFBhcmFtKQotICAgIHJldHVybjsKLQotICBzd2l0Y2ggKGR3RmxhZykgewotICAgIGNhc2UgWEZBX0V2ZW50OjpDYW5jZWxBY3Rpb246Ci0gICAgICBCb29sZWFuUHJvcGVydHkocFZhbHVlLCBwRXZlbnRQYXJhbS0+bV9iQ2FuY2VsQWN0aW9uLCBiU2V0dGluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9FdmVudDo6Q2hhbmdlOgotICAgICAgU3RyaW5nUHJvcGVydHkocFZhbHVlLCBwRXZlbnRQYXJhbS0+bV93c0NoYW5nZSwgYlNldHRpbmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfRXZlbnQ6OkNvbW1pdEtleToKLSAgICAgIEludGVyUHJvcGVydHkocFZhbHVlLCBwRXZlbnRQYXJhbS0+bV9pQ29tbWl0S2V5LCBiU2V0dGluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9FdmVudDo6RnVsbFRleHQ6Ci0gICAgICBTdHJpbmdQcm9wZXJ0eShwVmFsdWUsIHBFdmVudFBhcmFtLT5tX3dzRnVsbFRleHQsIGJTZXR0aW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0V2ZW50OjpLZXlkb3duOgotICAgICAgQm9vbGVhblByb3BlcnR5KHBWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fYktleURvd24sIGJTZXR0aW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0V2ZW50OjpNb2RpZmllcjoKLSAgICAgIEJvb2xlYW5Qcm9wZXJ0eShwVmFsdWUsIHBFdmVudFBhcmFtLT5tX2JNb2RpZmllciwgYlNldHRpbmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfRXZlbnQ6Ok5ld0NvbnRlbnRUeXBlOgotICAgICAgU3RyaW5nUHJvcGVydHkocFZhbHVlLCBwRXZlbnRQYXJhbS0+bV93c05ld0NvbnRlbnRUeXBlLCBiU2V0dGluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9FdmVudDo6TmV3VGV4dDoKLSAgICAgIFN0cmluZ1Byb3BlcnR5KHBWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fd3NOZXdUZXh0LCBiU2V0dGluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9FdmVudDo6UHJldmlvdXNDb250ZW50VHlwZToKLSAgICAgIFN0cmluZ1Byb3BlcnR5KHBWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fd3NQcmV2Q29udGVudFR5cGUsIGJTZXR0aW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0V2ZW50OjpQcmV2aW91c1RleHQ6Ci0gICAgICBTdHJpbmdQcm9wZXJ0eShwVmFsdWUsIHBFdmVudFBhcmFtLT5tX3dzUHJldlRleHQsIGJTZXR0aW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0V2ZW50OjpSZWVudGVyOgotICAgICAgQm9vbGVhblByb3BlcnR5KHBWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fYlJlZW50ZXIsIGJTZXR0aW5nKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0V2ZW50OjpTZWxlY3Rpb25FbmQ6Ci0gICAgICBJbnRlclByb3BlcnR5KHBWYWx1ZSwgcEV2ZW50UGFyYW0tPm1faVNlbEVuZCwgYlNldHRpbmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfRXZlbnQ6OlNlbGVjdGlvblN0YXJ0OgotICAgICAgSW50ZXJQcm9wZXJ0eShwVmFsdWUsIHBFdmVudFBhcmFtLT5tX2lTZWxTdGFydCwgYlNldHRpbmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfRXZlbnQ6OlNoaWZ0OgotICAgICAgQm9vbGVhblByb3BlcnR5KHBWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fYlNoaWZ0LCBiU2V0dGluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9FdmVudDo6U29hcEZhdWx0Q29kZToKLSAgICAgIFN0cmluZ1Byb3BlcnR5KHBWYWx1ZSwgcEV2ZW50UGFyYW0tPm1fd3NTb2FwRmF1bHRDb2RlLCBiU2V0dGluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9FdmVudDo6U29hcEZhdWx0U3RyaW5nOgotICAgICAgU3RyaW5nUHJvcGVydHkocFZhbHVlLCBwRXZlbnRQYXJhbS0+bV93c1NvYXBGYXVsdFN0cmluZywgYlNldHRpbmcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfRXZlbnQ6OlRhcmdldDoKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotfQotdm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OkNoYW5nZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIFByb3BlcnR5KHBWYWx1ZSwgWEZBX0V2ZW50OjpDaGFuZ2UsIGJTZXR0aW5nKTsKLX0KLXZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpDb21taXRLZXkoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBQcm9wZXJ0eShwVmFsdWUsIFhGQV9FdmVudDo6Q29tbWl0S2V5LCBiU2V0dGluZyk7Ci19Ci12b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6RnVsbFRleHQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgUHJvcGVydHkocFZhbHVlLCBYRkFfRXZlbnQ6OkZ1bGxUZXh0LCBiU2V0dGluZyk7Ci19Ci12b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6S2V5RG93bihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgUHJvcGVydHkocFZhbHVlLCBYRkFfRXZlbnQ6OktleWRvd24sIGJTZXR0aW5nKTsKLX0KLXZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpNb2RpZmllcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBQcm9wZXJ0eShwVmFsdWUsIFhGQV9FdmVudDo6TW9kaWZpZXIsIGJTZXR0aW5nKTsKLX0KLXZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpOZXdDb250ZW50VHlwZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBQcm9wZXJ0eShwVmFsdWUsIFhGQV9FdmVudDo6TmV3Q29udGVudFR5cGUsIGJTZXR0aW5nKTsKLX0KLXZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpOZXdUZXh0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBQcm9wZXJ0eShwVmFsdWUsIFhGQV9FdmVudDo6TmV3VGV4dCwgYlNldHRpbmcpOwotfQotdm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlByZXZDb250ZW50VHlwZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIFByb3BlcnR5KHBWYWx1ZSwgWEZBX0V2ZW50OjpQcmV2aW91c0NvbnRlbnRUeXBlLCBiU2V0dGluZyk7Ci19Ci12b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6UHJldlRleHQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgUHJvcGVydHkocFZhbHVlLCBYRkFfRXZlbnQ6OlByZXZpb3VzVGV4dCwgYlNldHRpbmcpOwotfQotdm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlJlZW50ZXIoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIFByb3BlcnR5KHBWYWx1ZSwgWEZBX0V2ZW50OjpSZWVudGVyLCBiU2V0dGluZyk7Ci19Ci12b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2VsRW5kKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgUHJvcGVydHkocFZhbHVlLCBYRkFfRXZlbnQ6OlNlbGVjdGlvbkVuZCwgYlNldHRpbmcpOwotfQotdm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNlbFN0YXJ0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIFByb3BlcnR5KHBWYWx1ZSwgWEZBX0V2ZW50OjpTZWxlY3Rpb25TdGFydCwgYlNldHRpbmcpOwotfQotdm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNoaWZ0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIFByb3BlcnR5KHBWYWx1ZSwgWEZBX0V2ZW50OjpTaGlmdCwgYlNldHRpbmcpOwotfQotdm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlNvYXBGYXVsdENvZGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIFByb3BlcnR5KHBWYWx1ZSwgWEZBX0V2ZW50OjpTb2FwRmF1bHRDb2RlLCBiU2V0dGluZyk7Ci19Ci12b2lkIENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U29hcEZhdWx0U3RyaW5nKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgUHJvcGVydHkocFZhbHVlLCBYRkFfRXZlbnQ6OlNvYXBGYXVsdFN0cmluZywgYlNldHRpbmcpOwotfQotdm9pZCBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlRhcmdldChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIFByb3BlcnR5KHBWYWx1ZSwgWEZBX0V2ZW50OjpUYXJnZXQsIGJTZXR0aW5nKTsKLX0KLXZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpFbWl0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgQ1hGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7Ci0gIGlmICghcFNjcmlwdENvbnRleHQpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSA9IHBTY3JpcHRDb250ZXh0LT5HZXRFdmVudFBhcmFtKCk7Ci0gIGlmICghcEV2ZW50UGFyYW0pIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXROb3RpZnkoKTsKLSAgaWYgKCFwTm90aWZ5KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfRkZXaWRnZXRIYW5kbGVyKiBwV2lkZ2V0SGFuZGxlciA9IHBOb3RpZnktPkdldFdpZGdldEhhbmRsZXIoKTsKLSAgaWYgKCFwV2lkZ2V0SGFuZGxlcikgewotICAgIHJldHVybjsKLSAgfQotICBwV2lkZ2V0SGFuZGxlci0+UHJvY2Vzc0V2ZW50KHBFdmVudFBhcmFtLT5tX3BUYXJnZXQsIHBFdmVudFBhcmFtKTsKLX0KLXZvaWQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpSZXNldChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIENYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpOwotICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfRXZlbnRQYXJhbSogcEV2ZW50UGFyYW0gPSBwU2NyaXB0Q29udGV4dC0+R2V0RXZlbnRQYXJhbSgpOwotICBpZiAoIXBFdmVudFBhcmFtKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBFdmVudFBhcmFtLT5SZXNldCgpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfZXZlbnRwc2V1ZG9tb2RlbC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfZXZlbnRwc2V1ZG9tb2RlbC5oCmluZGV4IDY0MTUyODcuLmVmYjRkZjAgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jc2NyaXB0X2V2ZW50cHNldWRvbW9kZWwuaAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9ldmVudHBzZXVkb21vZGVsLmgKQEAgLTcsNjQgKzcsMTcgQEAKICNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NTQ1JJUFRfRVZFTlRQU0VVRE9NT0RFTF9IXwogI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1NDUklQVF9FVkVOVFBTRVVET01PREVMX0hfCiAKLSNpbmNsdWRlICJmeGpzL2NmeGpzZV9hcmd1bWVudHMuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oIgotCi1lbnVtIGNsYXNzIFhGQV9FdmVudCB7Ci0gIENoYW5nZSA9IDAsCi0gIENvbW1pdEtleSwKLSAgRnVsbFRleHQsCi0gIEtleWRvd24sCi0gIE1vZGlmaWVyLAotICBOZXdDb250ZW50VHlwZSwKLSAgTmV3VGV4dCwKLSAgUHJldmlvdXNDb250ZW50VHlwZSwKLSAgUHJldmlvdXNUZXh0LAotICBSZWVudGVyLAotICBTZWxlY3Rpb25FbmQsCi0gIFNlbGVjdGlvblN0YXJ0LAotICBTaGlmdCwKLSAgU29hcEZhdWx0Q29kZSwKLSAgU29hcEZhdWx0U3RyaW5nLAotICBUYXJnZXQsCi0gIENhbmNlbEFjdGlvbgotfTsKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZXZlbnRwc2V1ZG9tb2RlbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX29iamVjdC5oIgogCiBjbGFzcyBDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWwgOiBwdWJsaWMgQ1hGQV9PYmplY3QgewogIHB1YmxpYzoKICAgZXhwbGljaXQgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCk7CiAgIH5DU2NyaXB0X0V2ZW50UHNldWRvTW9kZWwoKSBvdmVycmlkZTsKIAotICB2b2lkIENoYW5nZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwgYm9vbCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBDb21taXRLZXkoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsIGJvb2wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgRnVsbFRleHQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsIGJvb2wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgS2V5RG93bihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwgYm9vbCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBNb2RpZmllcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwgYm9vbCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBOZXdDb250ZW50VHlwZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgTmV3VGV4dChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwgYm9vbCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBQcmV2Q29udGVudFR5cGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgUHJldlRleHQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsIGJvb2wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgUmVlbnRlcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwgYm9vbCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTZWxFbmQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsIGJvb2wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2VsU3RhcnQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsIGJvb2wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2hpZnQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsIGJvb2wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU29hcEZhdWx0Q29kZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIFNvYXBGYXVsdFN0cmluZyhDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBUYXJnZXQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsIGJvb2wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0KLSAgdm9pZCBFbWl0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFJlc2V0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotCi0gcHJvdGVjdGVkOgotICB2b2lkIFByb3BlcnR5KENGWEpTRV9WYWx1ZSogcFZhbHVlLCBYRkFfRXZlbnQgZHdGbGFnLCBib29sIGJTZXR0aW5nKTsKKyAgQ0pYX0V2ZW50UHNldWRvTW9kZWwqIEpTRXZlbnRQc2V1ZG9Nb2RlbCgpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0pYX0V2ZW50UHNldWRvTW9kZWwqPihKU09iamVjdCgpKTsKKyAgfQogfTsKIAogI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1NDUklQVF9FVkVOVFBTRVVET01PREVMX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9ob3N0cHNldWRvbW9kZWwuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfaG9zdHBzZXVkb21vZGVsLmNwcAppbmRleCBhMDZlMDJmLi44MTIyYWEzIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9ob3N0cHNldWRvbW9kZWwuY3BwCisrKyBiL3hmYS9meGZhL3BhcnNlci9jc2NyaXB0X2hvc3Rwc2V1ZG9tb2RlbC5jcHAKQEAgLTYsNjk0ICs2LDEzIEBACiAKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9ob3N0cHNldWRvbW9kZWwuaCIKIAotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgImZ4anMvY2Z4anNlX2FyZ3VtZW50cy5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZub3RpZnkuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dHByb2Nlc3Nvci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NjcmlwdGNvbnRleHQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX2xvY2FsZW1nci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfb2JqZWN0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9yZXNvbHZlbm9kZV9ycy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfdXRpbHMuaCIKLQotbmFtZXNwYWNlIHsKLQotQ1hGQV9Ob2RlKiBUb05vZGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsIENGWEpTRV9DbGFzcyogcENsYXNzKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX05vZGUqPihwVmFsdWUtPlRvSG9zdE9iamVjdChwQ2xhc3MpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogCiBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6Q1NjcmlwdF9Ib3N0UHNldWRvTW9kZWwoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KQogICAgIDogQ1hGQV9PYmplY3QocERvY3VtZW50LAogICAgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok9iamVjdCwKICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpIb3N0UHNldWRvTW9kZWwsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MoTCJob3N0UHNldWRvTW9kZWwiKSkge30KKyAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmdWaWV3KEwiaG9zdFBzZXVkb01vZGVsIiksCisgICAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0hvc3RQc2V1ZG9Nb2RlbD4odGhpcykpIHt9CiAKIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjp+Q1NjcmlwdF9Ib3N0UHNldWRvTW9kZWwoKSB7fQotCi12b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpBcHBUeXBlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXROb3RpZnkoKTsKLSAgaWYgKCFwTm90aWZ5KQotICAgIHJldHVybjsKLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcFZhbHVlLT5TZXRTdHJpbmcoIkV4Y2hhbmdlIik7Ci19Ci0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OkNhbGN1bGF0aW9uc0VuYWJsZWQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldE5vdGlmeSgpOwotICBpZiAoIXBOb3RpZnkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ1hGQV9GRkRvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsKLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgcE5vdGlmeS0+R2V0RG9jRW52aXJvbm1lbnQoKS0+U2V0Q2FsY3VsYXRpb25zRW5hYmxlZChoRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFZhbHVlLT5Ub0Jvb2xlYW4oKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBWYWx1ZS0+U2V0Qm9vbGVhbihwTm90aWZ5LT5HZXREb2NFbnZpcm9ubWVudCgpLT5Jc0NhbGN1bGF0aW9uc0VuYWJsZWQoaERvYykpOwotfQotCi12b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpDdXJyZW50UGFnZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXROb3RpZnkoKTsKLSAgaWYgKCFwTm90aWZ5KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfRkZEb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7Ci0gIGlmIChiU2V0dGluZykgewotICAgIHBOb3RpZnktPkdldERvY0Vudmlyb25tZW50KCktPlNldEN1cnJlbnRQYWdlKGhEb2MsIHBWYWx1ZS0+VG9JbnRlZ2VyKCkpOwotICAgIHJldHVybjsKLSAgfQotICBwVmFsdWUtPlNldEludGVnZXIocE5vdGlmeS0+R2V0RG9jRW52aXJvbm1lbnQoKS0+R2V0Q3VycmVudFBhZ2UoaERvYykpOwotfQotCi12b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpMYW5ndWFnZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXROb3RpZnkoKTsKLSAgaWYgKCFwTm90aWZ5KQotICAgIHJldHVybjsKLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgVGhyb3dTZXRMYW5ndWFnZUV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotICBwVmFsdWUtPlNldFN0cmluZygKLSAgICAgIHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPkdldExhbmd1YWdlKCkuVVRGOEVuY29kZSgpLkFzU3RyaW5nQygpKTsKLX0KLQotdm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6TnVtUGFnZXMoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCk7Ci0gIGlmICghcE5vdGlmeSkgewotICAgIHJldHVybjsKLSAgfQotICBDWEZBX0ZGRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOwotICBpZiAoYlNldHRpbmcpIHsKLSAgICBUaHJvd1NldE51bVBhZ2VzRXhjZXB0aW9uKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBWYWx1ZS0+U2V0SW50ZWdlcihwTm90aWZ5LT5HZXREb2NFbnZpcm9ubWVudCgpLT5Db3VudFBhZ2VzKGhEb2MpKTsKLX0KLQotdm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6UGxhdGZvcm0oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCk7Ci0gIGlmICghcE5vdGlmeSkKLSAgICByZXR1cm47Ci0gIGlmIChiU2V0dGluZykgewotICAgIFRocm93U2V0UGxhdGZvcm1FeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcFZhbHVlLT5TZXRTdHJpbmcoCi0gICAgICBwTm90aWZ5LT5HZXRBcHBQcm92aWRlcigpLT5HZXRQbGF0Zm9ybSgpLlVURjhFbmNvZGUoKS5Bc1N0cmluZ0MoKSk7Ci19Ci0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlRpdGxlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBpZiAoIW1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPklzUnVuQXRDbGllbnQoKSkgewotICAgIHJldHVybjsKLSAgfQotICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldE5vdGlmeSgpOwotICBpZiAoIXBOb3RpZnkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ1hGQV9GRkRvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsKLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgcE5vdGlmeS0+R2V0RG9jRW52aXJvbm1lbnQoKS0+U2V0VGl0bGUoaERvYywgcFZhbHVlLT5Ub1dpZGVTdHJpbmcoKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENGWF9XaWRlU3RyaW5nIHdzVGl0bGU7Ci0gIHBOb3RpZnktPkdldERvY0Vudmlyb25tZW50KCktPkdldFRpdGxlKGhEb2MsIHdzVGl0bGUpOwotICBwVmFsdWUtPlNldFN0cmluZyh3c1RpdGxlLlVURjhFbmNvZGUoKS5Bc1N0cmluZ0MoKSk7Ci19Ci0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlZhbGlkYXRpb25zRW5hYmxlZChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldE5vdGlmeSgpOwotICBpZiAoIXBOb3RpZnkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ1hGQV9GRkRvYyogaERvYyA9IHBOb3RpZnktPkdldEhET0MoKTsKLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgcE5vdGlmeS0+R2V0RG9jRW52aXJvbm1lbnQoKS0+U2V0VmFsaWRhdGlvbnNFbmFibGVkKGhEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWYWx1ZS0+VG9Cb29sZWFuKCkpOwotICAgIHJldHVybjsKLSAgfQotICBib29sIGJFbmFibGVkID0gcE5vdGlmeS0+R2V0RG9jRW52aXJvbm1lbnQoKS0+SXNWYWxpZGF0aW9uc0VuYWJsZWQoaERvYyk7Ci0gIHBWYWx1ZS0+U2V0Qm9vbGVhbihiRW5hYmxlZCk7Ci19Ci0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlZhcmlhdGlvbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBpZiAoIW1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPklzUnVuQXRDbGllbnQoKSkKLSAgICByZXR1cm47Ci0KLSAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXROb3RpZnkoKTsKLSAgaWYgKCFwTm90aWZ5KQotICAgIHJldHVybjsKLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgVGhyb3dTZXRWYXJpYXRpb25FeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcFZhbHVlLT5TZXRTdHJpbmcoIkZ1bGwiKTsKLX0KLQotdm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6VmVyc2lvbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCk7Ci0gIGlmICghcE5vdGlmeSkgewotICAgIHJldHVybjsKLSAgfQotICBpZiAoYlNldHRpbmcpIHsKLSAgICBUaHJvd1NldFZlcnNpb25FeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcFZhbHVlLT5TZXRTdHJpbmcoIjExIik7Ci19Ci0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Ok5hbWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldE5vdGlmeSgpOwotICBpZiAoIXBOb3RpZnkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcFZhbHVlLT5TZXRTdHJpbmcoCi0gICAgICBwTm90aWZ5LT5HZXRBcHBQcm92aWRlcigpLT5HZXRBcHBOYW1lKCkuVVRGOEVuY29kZSgpLkFzU3RyaW5nQygpKTsKLX0KLQotdm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6R290b1VSTChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGlmICghbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+SXNSdW5BdENsaWVudCgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOwotICBpZiAoaUxlbmd0aCAhPSAxKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJnb3RvVVJMIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCk7Ci0gIGlmICghcE5vdGlmeSkgewotICAgIHJldHVybjsKLSAgfQotICBDWEZBX0ZGRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOwotICBDRlhfV2lkZVN0cmluZyB3c1VSTDsKLSAgaWYgKGlMZW5ndGggPj0gMSkgewotICAgIENGWF9CeXRlU3RyaW5nIGJzVVJMID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsKLSAgICB3c1VSTCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1VSTC5Bc1N0cmluZ0MoKSk7Ci0gIH0KLSAgcE5vdGlmeS0+R2V0RG9jRW52aXJvbm1lbnQoKS0+R290b1VSTChoRG9jLCB3c1VSTCk7Ci19Ci12b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpPcGVuTGlzdChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGlmICghbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+SXNSdW5BdENsaWVudCgpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOwotICBpZiAoaUxlbmd0aCAhPSAxKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJvcGVuTGlzdCIpOwotICAgIHJldHVybjsKLSAgfQotICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldE5vdGlmeSgpOwotICBpZiAoIXBOb3RpZnkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG51bGxwdHI7Ci0gIGlmIChpTGVuZ3RoID49IDEpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBwVmFsdWUocEFyZ3VtZW50cy0+R2V0VmFsdWUoMCkpOwotICAgIGlmIChwVmFsdWUtPklzT2JqZWN0KCkpIHsKLSAgICAgIHBOb2RlID0gVG9Ob2RlKHBWYWx1ZS5nZXQoKSwgbnVsbHB0cik7Ci0gICAgfSBlbHNlIGlmIChwVmFsdWUtPklzU3RyaW5nKCkpIHsKLSAgICAgIENYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpOwotICAgICAgaWYgKCFwU2NyaXB0Q29udGV4dCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBDWEZBX09iamVjdCogcE9iamVjdCA9IHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCk7Ci0gICAgICBpZiAoIXBPYmplY3QpCi0gICAgICAgIHJldHVybjsKLQotICAgICAgdWludDMyX3QgZHdGbGFnID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfU2libGluZ3M7Ci0gICAgICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb3ZlTm9kZVJTOwotICAgICAgaW50MzJfdCBpUmV0ID0gcFNjcmlwdENvbnRleHQtPlJlc29sdmVPYmplY3RzKAotICAgICAgICAgIHBPYmplY3QsIHBWYWx1ZS0+VG9XaWRlU3RyaW5nKCkuQXNTdHJpbmdDKCksIHJlc292ZU5vZGVSUywgZHdGbGFnKTsKLSAgICAgIGlmIChpUmV0IDwgMSB8fCAhcmVzb3ZlTm9kZVJTLm5vZGVzWzBdLT5Jc05vZGUoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICBwTm9kZSA9IHJlc292ZU5vZGVSUy5ub2Rlc1swXS0+QXNOb2RlKCk7Ci0gICAgfQotICB9Ci0gIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwRG9jTGF5b3V0ID0gbV9wRG9jdW1lbnQtPkdldERvY0xheW91dCgpOwotICBpZiAoIXBEb2NMYXlvdXQpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ1hGQV9GRldpZGdldCogaFdpZGdldCA9Ci0gICAgICBwTm90aWZ5LT5HZXRIV2lkZ2V0KHBEb2NMYXlvdXQtPkdldExheW91dEl0ZW0ocE5vZGUpKTsKLSAgaWYgKCFoV2lkZ2V0KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBOb3RpZnktPkdldERvY0Vudmlyb25tZW50KCktPlNldEZvY3VzV2lkZ2V0KHBOb3RpZnktPkdldEhET0MoKSwgaFdpZGdldCk7Ci0gIHBOb3RpZnktPk9wZW5Ecm9wRG93bkxpc3QoaFdpZGdldCk7Ci19Ci12b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpSZXNwb25zZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOwotICBpZiAoaUxlbmd0aCA8IDEgfHwgaUxlbmd0aCA+IDQpIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMInJlc3BvbnNlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCk7Ci0gIGlmICghcE5vdGlmeSkgewotICAgIHJldHVybjsKLSAgfQotICBDRlhfV2lkZVN0cmluZyB3c1F1ZXN0aW9uOwotICBDRlhfV2lkZVN0cmluZyB3c1RpdGxlOwotICBDRlhfV2lkZVN0cmluZyB3c0RlZmF1bHRBbnN3ZXI7Ci0gIGJvb2wgYk1hcmsgPSBmYWxzZTsKLSAgaWYgKGlMZW5ndGggPj0gMSkgewotICAgIENGWF9CeXRlU3RyaW5nIGJzUXVlc3Rpb24gPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOwotICAgIHdzUXVlc3Rpb24gPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNRdWVzdGlvbi5Bc1N0cmluZ0MoKSk7Ci0gIH0KLSAgaWYgKGlMZW5ndGggPj0gMikgewotICAgIENGWF9CeXRlU3RyaW5nIGJzVGl0bGUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDEpOwotICAgIHdzVGl0bGUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNUaXRsZS5Bc1N0cmluZ0MoKSk7Ci0gIH0KLSAgaWYgKGlMZW5ndGggPj0gMykgewotICAgIENGWF9CeXRlU3RyaW5nIGJzRGVmYXVsdEFuc3dlciA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMik7Ci0gICAgd3NEZWZhdWx0QW5zd2VyID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzRGVmYXVsdEFuc3dlci5Bc1N0cmluZ0MoKSk7Ci0gIH0KLSAgaWYgKGlMZW5ndGggPj0gNCkgewotICAgIGJNYXJrID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMykgPT0gMCA/IGZhbHNlIDogdHJ1ZTsKLSAgfQotICBDRlhfV2lkZVN0cmluZyB3c0Fuc3dlciA9IHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPlJlc3BvbnNlKAotICAgICAgd3NRdWVzdGlvbiwgd3NUaXRsZSwgd3NEZWZhdWx0QW5zd2VyLCBiTWFyayk7Ci0gIENGWEpTRV9WYWx1ZSogcFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsKLSAgaWYgKHBWYWx1ZSkKLSAgICBwVmFsdWUtPlNldFN0cmluZyh3c0Fuc3dlci5VVEY4RW5jb2RlKCkuQXNTdHJpbmdDKCkpOwotfQotCi12b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpEb2N1bWVudEluQmF0Y2goQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpKQotICAgIHBWYWx1ZS0+U2V0SW50ZWdlcigwKTsKLX0KLXN0YXRpYyBpbnQzMl90IFhGQV9GaWx0ZXJOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NFeHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NGaWx0ZXIpIHsKLSAgQVNTRVJUKG5TdGFydCA+IC0xKTsKLSAgaW50MzJfdCBpTGVuZ3RoID0gd3NFeHByZXNzaW9uLkdldExlbmd0aCgpOwotICBpZiAoblN0YXJ0ID49IGlMZW5ndGgpIHsKLSAgICByZXR1cm4gaUxlbmd0aDsKLSAgfQotICBGWF9XQ0hBUiogcEJ1ZiA9IHdzRmlsdGVyLkdldEJ1ZmZlcihpTGVuZ3RoIC0gblN0YXJ0KTsKLSAgaW50MzJfdCBuQ291bnQgPSAwOwotICBjb25zdCBGWF9XQ0hBUiogcFNyYyA9IHdzRXhwcmVzc2lvbi5jX3N0cigpOwotICBGWF9XQ0hBUiB3Q3VyOwotICB3aGlsZSAoblN0YXJ0IDwgaUxlbmd0aCkgewotICAgIHdDdXIgPSBwU3JjW25TdGFydCsrXTsKLSAgICBpZiAod0N1ciA9PSAnLCcpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBwQnVmW25Db3VudCsrXSA9IHdDdXI7Ci0gIH0KLSAgd3NGaWx0ZXIuUmVsZWFzZUJ1ZmZlcihuQ291bnQpOwotICB3c0ZpbHRlci5UcmltTGVmdCgpOwotICB3c0ZpbHRlci5UcmltUmlnaHQoKTsKLSAgcmV0dXJuIG5TdGFydDsKLX0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlJlc2V0RGF0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOwotICBpZiAoaUxlbmd0aCA8IDAgfHwgaUxlbmd0aCA+IDEpIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMInJlc2V0RGF0YSIpOwotICAgIHJldHVybjsKLSAgfQotICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldE5vdGlmeSgpOwotICBpZiAoIXBOb3RpZnkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOwotICBpZiAoaUxlbmd0aCA+PSAxKSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNFeHByZXNzaW9uID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsKLSAgICB3c0V4cHJlc3Npb24gPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNFeHByZXNzaW9uLkFzU3RyaW5nQygpKTsKLSAgfQotICBpZiAod3NFeHByZXNzaW9uLklzRW1wdHkoKSkgewotICAgIHBOb3RpZnktPlJlc2V0RGF0YSgpOwotICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IGlTdGFydCA9IDA7Ci0gIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsKLSAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG51bGxwdHI7Ci0gIGludDMyX3QgaUV4cExlbmd0aCA9IHdzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKTsKLSAgd2hpbGUgKGlTdGFydCA8IGlFeHBMZW5ndGgpIHsKLSAgICBpU3RhcnQgPSBYRkFfRmlsdGVyTmFtZSh3c0V4cHJlc3Npb24uQXNTdHJpbmdDKCksIGlTdGFydCwgd3NOYW1lKTsKLSAgICBDWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKTsKLSAgICBpZiAoIXBTY3JpcHRDb250ZXh0KSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gcFNjcmlwdENvbnRleHQtPkdldFRoaXNPYmplY3QoKTsKLSAgICBpZiAoIXBPYmplY3QpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdWludDMyX3QgZHdGbGFnID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8Ci0gICAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOwotICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7Ci0gICAgaW50MzJfdCBpUmV0ID0gcFNjcmlwdENvbnRleHQtPlJlc29sdmVPYmplY3RzKHBPYmplY3QsIHdzTmFtZS5Bc1N0cmluZ0MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3ZlTm9kZVJTLCBkd0ZsYWcpOwotICAgIGlmIChpUmV0IDwgMSB8fCAhcmVzb3ZlTm9kZVJTLm5vZGVzWzBdLT5Jc05vZGUoKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIHBOb2RlID0gcmVzb3ZlTm9kZVJTLm5vZGVzWzBdLT5Bc05vZGUoKTsKLSAgICBwTm90aWZ5LT5SZXNldERhdGEocE5vZGUtPkdldFdpZGdldERhdGEoKSk7Ci0gIH0KLSAgaWYgKCFwTm9kZSkgewotICAgIHBOb3RpZnktPlJlc2V0RGF0YSgpOwotICB9Ci19Ci12b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpCZWVwKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaWYgKCFtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5Jc1J1bkF0Q2xpZW50KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7Ci0gIGlmIChpTGVuZ3RoIDwgMCB8fCBpTGVuZ3RoID4gMSkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiYmVlcCIpOwotICAgIHJldHVybjsKLSAgfQotICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldE5vdGlmeSgpOwotICBpZiAoIXBOb3RpZnkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgdWludDMyX3QgZHdUeXBlID0gNDsKLSAgaWYgKGlMZW5ndGggPj0gMSkgewotICAgIGR3VHlwZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDApOwotICB9Ci0gIHBOb3RpZnktPkdldEFwcFByb3ZpZGVyKCktPkJlZXAoZHdUeXBlKTsKLX0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNldEZvY3VzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaWYgKCFtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5Jc1J1bkF0Q2xpZW50KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7Ci0gIGlmIChpTGVuZ3RoICE9IDEpIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMInNldEZvY3VzIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCk7Ci0gIGlmICghcE5vdGlmeSkgewotICAgIHJldHVybjsKLSAgfQotICBDWEZBX05vZGUqIHBOb2RlID0gbnVsbHB0cjsKLSAgaWYgKGlMZW5ndGggPj0gMSkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IHBWYWx1ZShwQXJndW1lbnRzLT5HZXRWYWx1ZSgwKSk7Ci0gICAgaWYgKHBWYWx1ZS0+SXNPYmplY3QoKSkgewotICAgICAgcE5vZGUgPSBUb05vZGUocFZhbHVlLmdldCgpLCBudWxscHRyKTsKLSAgICB9IGVsc2UgaWYgKHBWYWx1ZS0+SXNTdHJpbmcoKSkgewotICAgICAgQ1hGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7Ci0gICAgICBpZiAoIXBTY3JpcHRDb250ZXh0KQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gcFNjcmlwdENvbnRleHQtPkdldFRoaXNPYmplY3QoKTsKLSAgICAgIGlmICghcE9iamVjdCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgICB1aW50MzJfdCBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwKLSAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5nczsKLSAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7Ci0gICAgICBpbnQzMl90IGlSZXQgPSBwU2NyaXB0Q29udGV4dC0+UmVzb2x2ZU9iamVjdHMoCi0gICAgICAgICAgcE9iamVjdCwgcFZhbHVlLT5Ub1dpZGVTdHJpbmcoKS5Bc1N0cmluZ0MoKSwgcmVzb3ZlTm9kZVJTLCBkd0ZsYWcpOwotICAgICAgaWYgKGlSZXQgPCAxIHx8ICFyZXNvdmVOb2RlUlMubm9kZXNbMF0tPklzTm9kZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAgIHBOb2RlID0gcmVzb3ZlTm9kZVJTLm5vZGVzWzBdLT5Bc05vZGUoKTsKLSAgICB9Ci0gIH0KLSAgcE5vdGlmeS0+U2V0Rm9jdXNXaWRnZXROb2RlKHBOb2RlKTsKLX0KLQotdm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6R2V0Rm9jdXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldE5vdGlmeSgpOwotICBpZiAoIXBOb3RpZnkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBOb3RpZnktPkdldEZvY3VzV2lkZ2V0Tm9kZSgpOwotICBpZiAoIXBOb2RlKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCktPkFzc2lnbigKLSAgICAgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBOb2RlKSk7Ci19Ci12b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpNZXNzYWdlQm94KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaWYgKCFtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5Jc1J1bkF0Q2xpZW50KCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7Ci0gIGlmIChpTGVuZ3RoIDwgMSB8fCBpTGVuZ3RoID4gNCkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwibWVzc2FnZUJveCIpOwotICAgIHJldHVybjsKLSAgfQotICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldE5vdGlmeSgpOwotICBpZiAoIXBOb3RpZnkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NNZXNzYWdlOwotICBDRlhfV2lkZVN0cmluZyBic1RpdGxlOwotICB1aW50MzJfdCBkd01lc3NhZ2VUeXBlID0gWEZBX01CSUNPTl9FcnJvcjsKLSAgdWludDMyX3QgZHdCdXR0b25UeXBlID0gWEZBX01CX09LOwotICBpZiAoaUxlbmd0aCA+PSAxKSB7Ci0gICAgaWYgKCFWYWxpZGF0ZUFyZ3NGb3JNc2cocEFyZ3VtZW50cywgMCwgd3NNZXNzYWdlKSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICBpZiAoaUxlbmd0aCA+PSAyKSB7Ci0gICAgaWYgKCFWYWxpZGF0ZUFyZ3NGb3JNc2cocEFyZ3VtZW50cywgMSwgYnNUaXRsZSkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgaWYgKGlMZW5ndGggPj0gMykgewotICAgIGR3TWVzc2FnZVR5cGUgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigyKTsKLSAgICBpZiAoZHdNZXNzYWdlVHlwZSA+IFhGQV9NQklDT05fU3RhdHVzKSB7Ci0gICAgICBkd01lc3NhZ2VUeXBlID0gWEZBX01CSUNPTl9FcnJvcjsKLSAgICB9Ci0gIH0KLSAgaWYgKGlMZW5ndGggPj0gNCkgewotICAgIGR3QnV0dG9uVHlwZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDMpOwotICAgIGlmIChkd0J1dHRvblR5cGUgPiBYRkFfTUJfWWVzTm9DYW5jZWwpIHsKLSAgICAgIGR3QnV0dG9uVHlwZSA9IFhGQV9NQl9PSzsKLSAgICB9Ci0gIH0KLSAgaW50MzJfdCBpVmFsdWUgPSBwTm90aWZ5LT5HZXRBcHBQcm92aWRlcigpLT5Nc2dCb3goCi0gICAgICB3c01lc3NhZ2UsIGJzVGl0bGUsIGR3TWVzc2FnZVR5cGUsIGR3QnV0dG9uVHlwZSk7Ci0gIENGWEpTRV9WYWx1ZSogcFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsKLSAgaWYgKHBWYWx1ZSkKLSAgICBwVmFsdWUtPlNldEludGVnZXIoaVZhbHVlKTsKLX0KLWJvb2wgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlZhbGlkYXRlQXJnc0Zvck1zZyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUFyZ0luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlKSB7Ci0gIGlmICghcEFyZ3VtZW50cyB8fCBpQXJnSW5kZXggPCAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGJvb2wgYklzSnNUeXBlID0gZmFsc2U7Ci0gIGlmIChtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRUeXBlKCkgPT0KLSAgICAgIFhGQV9TQ1JJUFRMQU5HVFlQRV9KYXZhc2NyaXB0KSB7Ci0gICAgYklzSnNUeXBlID0gdHJ1ZTsKLSAgfQotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBwVmFsdWVBcmcocEFyZ3VtZW50cy0+R2V0VmFsdWUoaUFyZ0luZGV4KSk7Ci0gIGlmICghcFZhbHVlQXJnLT5Jc1N0cmluZygpICYmIGJJc0pzVHlwZSkgewotICAgIFRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAocFZhbHVlQXJnLT5Jc051bGwoKSkgewotICAgIHdzVmFsdWUgPSBMIiI7Ci0gIH0gZWxzZSB7Ci0gICAgd3NWYWx1ZSA9IHBWYWx1ZUFyZy0+VG9XaWRlU3RyaW5nKCk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci12b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpEb2N1bWVudENvdW50SW5CYXRjaCgKLSAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGlmIChDRlhKU0VfVmFsdWUqIHBWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCkpCi0gICAgcFZhbHVlLT5TZXRJbnRlZ2VyKDApOwotfQotdm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6UHJpbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAoIW1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPklzUnVuQXRDbGllbnQoKSkgewotICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsKLSAgaWYgKGlMZW5ndGggIT0gOCkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwicHJpbnQiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXROb3RpZnkoKTsKLSAgaWYgKCFwTm90aWZ5KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfRkZEb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7Ci0gIHVpbnQzMl90IGR3T3B0aW9ucyA9IDA7Ci0gIGJvb2wgYlNob3dEaWFsb2cgPSB0cnVlOwotICBpZiAoaUxlbmd0aCA+PSAxKSB7Ci0gICAgYlNob3dEaWFsb2cgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKSA9PSAwID8gZmFsc2UgOiB0cnVlOwotICB9Ci0gIGlmIChiU2hvd0RpYWxvZykgewotICAgIGR3T3B0aW9ucyB8PSBYRkFfUFJJTlRPUFRfU2hvd0RpYWxvZzsKLSAgfQotICBpbnQzMl90IG5TdGFydFBhZ2UgPSAwOwotICBpZiAoaUxlbmd0aCA+PSAyKSB7Ci0gICAgblN0YXJ0UGFnZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDEpOwotICB9Ci0gIGludDMyX3QgbkVuZFBhZ2UgPSAwOwotICBpZiAoaUxlbmd0aCA+PSAzKSB7Ci0gICAgbkVuZFBhZ2UgPSBwQXJndW1lbnRzLT5HZXRJbnQzMigyKTsKLSAgfQotICBib29sIGJDYW5DYW5jZWwgPSB0cnVlOwotICBpZiAoaUxlbmd0aCA+PSA0KSB7Ci0gICAgYkNhbkNhbmNlbCA9IHBBcmd1bWVudHMtPkdldEludDMyKDMpID09IDAgPyBmYWxzZSA6IHRydWU7Ci0gIH0KLSAgaWYgKGJDYW5DYW5jZWwpIHsKLSAgICBkd09wdGlvbnMgfD0gWEZBX1BSSU5UT1BUX0NhbkNhbmNlbDsKLSAgfQotICBib29sIGJTaHJpbmtQYWdlID0gdHJ1ZTsKLSAgaWYgKGlMZW5ndGggPj0gNSkgewotICAgIGJTaHJpbmtQYWdlID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoNCkgPT0gMCA/IGZhbHNlIDogdHJ1ZTsKLSAgfQotICBpZiAoYlNocmlua1BhZ2UpIHsKLSAgICBkd09wdGlvbnMgfD0gWEZBX1BSSU5UT1BUX1Nocmlua1BhZ2U7Ci0gIH0KLSAgYm9vbCBiQXNJbWFnZSA9IHRydWU7Ci0gIGlmIChpTGVuZ3RoID49IDYpIHsKLSAgICBiQXNJbWFnZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDUpID09IDAgPyBmYWxzZSA6IHRydWU7Ci0gIH0KLSAgaWYgKGJBc0ltYWdlKSB7Ci0gICAgZHdPcHRpb25zIHw9IFhGQV9QUklOVE9QVF9Bc0ltYWdlOwotICB9Ci0gIGJvb2wgYlJldmVyc2VPcmRlciA9IHRydWU7Ci0gIGlmIChpTGVuZ3RoID49IDcpIHsKLSAgICBiQXNJbWFnZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDUpID09IDAgPyBmYWxzZSA6IHRydWU7Ci0gIH0KLSAgYlJldmVyc2VPcmRlciA9IHBBcmd1bWVudHMtPkdldEludDMyKDYpID09IDAgPyBmYWxzZSA6IHRydWU7Ci0gIGlmIChiUmV2ZXJzZU9yZGVyKSB7Ci0gICAgZHdPcHRpb25zIHw9IFhGQV9QUklOVE9QVF9SZXZlcnNlT3JkZXI7Ci0gIH0KLSAgYm9vbCBiUHJpbnRBbm5vdCA9IHRydWU7Ci0gIGlmIChpTGVuZ3RoID49IDgpIHsKLSAgICBiUHJpbnRBbm5vdCA9IHBBcmd1bWVudHMtPkdldEludDMyKDcpID09IDAgPyBmYWxzZSA6IHRydWU7Ci0gIH0KLSAgaWYgKGJQcmludEFubm90KSB7Ci0gICAgZHdPcHRpb25zIHw9IFhGQV9QUklOVE9QVF9QcmludEFubm90OwotICB9Ci0gIHBOb3RpZnktPkdldERvY0Vudmlyb25tZW50KCktPlByaW50KGhEb2MsIG5TdGFydFBhZ2UsIG5FbmRQYWdlLCBkd09wdGlvbnMpOwotfQotCi12b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpJbXBvcnREYXRhKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7Ci0gIGlmIChpTGVuZ3RoIDwgMCB8fCBpTGVuZ3RoID4gMSkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiaW1wb3J0RGF0YSIpOwotICAgIHJldHVybjsKLSAgfQotICAvLyBOb3QgaW1wbGVtZW50ZWQuCi19Ci0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OkV4cG9ydERhdGEoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsKLSAgaWYgKGlMZW5ndGggPCAwIHx8IGlMZW5ndGggPiAyKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJleHBvcnREYXRhIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCk7Ci0gIGlmICghcE5vdGlmeSkgewotICAgIHJldHVybjsKLSAgfQotICBDWEZBX0ZGRG9jKiBoRG9jID0gcE5vdGlmeS0+R2V0SERPQygpOwotICBDRlhfV2lkZVN0cmluZyB3c0ZpbGVQYXRoOwotICBib29sIGJYRFAgPSB0cnVlOwotICBpZiAoaUxlbmd0aCA+PSAxKSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNGaWxlUGF0aCA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7Ci0gICAgd3NGaWxlUGF0aCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0ZpbGVQYXRoLkFzU3RyaW5nQygpKTsKLSAgfQotICBpZiAoaUxlbmd0aCA+PSAyKSB7Ci0gICAgYlhEUCA9IHBBcmd1bWVudHMtPkdldEludDMyKDEpID09IDAgPyBmYWxzZSA6IHRydWU7Ci0gIH0KLSAgcE5vdGlmeS0+R2V0RG9jRW52aXJvbm1lbnQoKS0+RXhwb3J0RGF0YShoRG9jLCB3c0ZpbGVQYXRoLCBiWERQKTsKLX0KLQotdm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6UGFnZVVwKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXROb3RpZnkoKTsKLSAgaWYgKCFwTm90aWZ5KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfRkZEb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7Ci0gIGludDMyX3QgbkN1clBhZ2UgPSBwTm90aWZ5LT5HZXREb2NFbnZpcm9ubWVudCgpLT5HZXRDdXJyZW50UGFnZShoRG9jKTsKLSAgaW50MzJfdCBuTmV3UGFnZSA9IDA7Ci0gIGlmIChuQ3VyUGFnZSA8PSAxKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIG5OZXdQYWdlID0gbkN1clBhZ2UgLSAxOwotICBwTm90aWZ5LT5HZXREb2NFbnZpcm9ubWVudCgpLT5TZXRDdXJyZW50UGFnZShoRG9jLCBuTmV3UGFnZSk7Ci19Ci0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlBhZ2VEb3duKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXROb3RpZnkoKTsKLSAgaWYgKCFwTm90aWZ5KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfRkZEb2MqIGhEb2MgPSBwTm90aWZ5LT5HZXRIRE9DKCk7Ci0gIGludDMyX3QgbkN1clBhZ2UgPSBwTm90aWZ5LT5HZXREb2NFbnZpcm9ubWVudCgpLT5HZXRDdXJyZW50UGFnZShoRG9jKTsKLSAgaW50MzJfdCBuUGFnZUNvdW50ID0gcE5vdGlmeS0+R2V0RG9jRW52aXJvbm1lbnQoKS0+Q291bnRQYWdlcyhoRG9jKTsKLSAgaWYgKCFuUGFnZUNvdW50IHx8IG5DdXJQYWdlID09IG5QYWdlQ291bnQpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50MzJfdCBuTmV3UGFnZSA9IDA7Ci0gIGlmIChuQ3VyUGFnZSA+PSBuUGFnZUNvdW50KSB7Ci0gICAgbk5ld1BhZ2UgPSBuUGFnZUNvdW50IC0gMTsKLSAgfSBlbHNlIHsKLSAgICBuTmV3UGFnZSA9IG5DdXJQYWdlICsgMTsKLSAgfQotICBwTm90aWZ5LT5HZXREb2NFbnZpcm9ubWVudCgpLT5TZXRDdXJyZW50UGFnZShoRG9jLCBuTmV3UGFnZSk7Ci19Ci0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OkN1cnJlbnREYXRlVGltZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCk7Ci0gIGlmICghcE5vdGlmeSkgewotICAgIHJldHVybjsKLSAgfQotICBDRlhfV2lkZVN0cmluZyB3c0RhdGFUaW1lID0gcE5vdGlmeS0+R2V0Q3VycmVudERhdGVUaW1lKCk7Ci0gIENGWEpTRV9WYWx1ZSogcFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsKLSAgaWYgKHBWYWx1ZSkKLSAgICBwVmFsdWUtPlNldFN0cmluZyh3c0RhdGFUaW1lLlVURjhFbmNvZGUoKS5Bc1N0cmluZ0MoKSk7Ci19Ci0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlRocm93U2V0TGFuZ3VhZ2VFeGNlcHRpb24oKSBjb25zdCB7Ci0gIFRocm93RXhjZXB0aW9uKEwiVW5hYmxlIHRvIHNldCBsYW5ndWFnZSB2YWx1ZS4iKTsKLX0KLQotdm9pZCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6VGhyb3dTZXROdW1QYWdlc0V4Y2VwdGlvbigpIGNvbnN0IHsKLSAgVGhyb3dFeGNlcHRpb24oTCJVbmFibGUgdG8gc2V0IG51bVBhZ2VzIHZhbHVlLiIpOwotfQotCi12b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpUaHJvd1NldFBsYXRmb3JtRXhjZXB0aW9uKCkgY29uc3QgewotICBUaHJvd0V4Y2VwdGlvbihMIlVuYWJsZSB0byBzZXQgcGxhdGZvcm0gdmFsdWUuIik7Ci19Ci0KLXZvaWQgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlRocm93U2V0VmFyaWF0aW9uRXhjZXB0aW9uKCkgY29uc3QgewotICBUaHJvd0V4Y2VwdGlvbihMIlVuYWJsZSB0byBzZXQgdmFyaWF0aW9uIHZhbHVlLiIpOwotfQotCi12b2lkIENTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpUaHJvd1NldFZlcnNpb25FeGNlcHRpb24oKSBjb25zdCB7Ci0gIFRocm93RXhjZXB0aW9uKEwiVW5hYmxlIHRvIHNldCB2ZXJzaW9uIHZhbHVlLiIpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfaG9zdHBzZXVkb21vZGVsLmggYi94ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9ob3N0cHNldWRvbW9kZWwuaAppbmRleCA3ZDI0YTFkLi43ZTRhMzdkIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9ob3N0cHNldWRvbW9kZWwuaAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9ob3N0cHNldWRvbW9kZWwuaApAQCAtNyw2MCArNywxOSBAQAogI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1NDUklQVF9IT1NUUFNFVURPTU9ERUxfSF8KICNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NTQ1JJUFRfSE9TVFBTRVVET01PREVMX0hfCiAKLSNpbmNsdWRlICJmeGpzL2NmeGpzZV9hcmd1bWVudHMuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfb2JqZWN0LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2hvc3Rwc2V1ZG9tb2RlbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX29iamVjdC5oIgorCitjbGFzcyBDWEZBX0RvY3VtZW50OwogCiBjbGFzcyBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbCA6IHB1YmxpYyBDWEZBX09iamVjdCB7CiAgcHVibGljOgogICBleHBsaWNpdCBDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpOwogICB+Q1NjcmlwdF9Ib3N0UHNldWRvTW9kZWwoKSBvdmVycmlkZTsKIAotICB2b2lkIEFwcFR5cGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsIGJvb2wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgQ2FsY3VsYXRpb25zRW5hYmxlZChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIEN1cnJlbnRQYWdlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBMYW5ndWFnZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwgYm9vbCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBOdW1QYWdlcyhDRlhKU0VfVmFsdWUqIHBWYWx1ZSwgYm9vbCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBQbGF0Zm9ybShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwgYm9vbCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBUaXRsZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwgYm9vbCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBWYWxpZGF0aW9uc0VuYWJsZWQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgVmFyaWF0aW9uKENGWEpTRV9WYWx1ZSogcFZhbHVlLCBib29sIGJTZXR0aW5nLCBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIFZlcnNpb24oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsIGJvb2wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgTmFtZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwgYm9vbCBiU2V0dGluZywgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBHb3RvVVJMKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIE9wZW5MaXN0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFJlc3BvbnNlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIERvY3VtZW50SW5CYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBSZXNldERhdGEoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgQmVlcChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTZXRGb2N1cyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBHZXRGb2N1cyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBNZXNzYWdlQm94KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIERvY3VtZW50Q291bnRJbkJhdGNoKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFByaW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIEltcG9ydERhdGEoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgRXhwb3J0RGF0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBQYWdlVXAoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgUGFnZURvd24oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgQ3VycmVudERhdGVUaW1lKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotCi0gcHJvdGVjdGVkOgotICBib29sIFZhbGlkYXRlQXJnc0Zvck1zZyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlBcmdJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBUaHJvd1NldExhbmd1YWdlRXhjZXB0aW9uKCkgY29uc3Q7Ci0gIHZvaWQgVGhyb3dTZXROdW1QYWdlc0V4Y2VwdGlvbigpIGNvbnN0OwotICB2b2lkIFRocm93U2V0UGxhdGZvcm1FeGNlcHRpb24oKSBjb25zdDsKLSAgdm9pZCBUaHJvd1NldFZhcmlhdGlvbkV4Y2VwdGlvbigpIGNvbnN0OwotICB2b2lkIFRocm93U2V0VmVyc2lvbkV4Y2VwdGlvbigpIGNvbnN0OworICBDSlhfSG9zdFBzZXVkb01vZGVsKiBKU0hvc3RQc2V1ZG9Nb2RlbCgpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0pYX0hvc3RQc2V1ZG9Nb2RlbCo+KEpTT2JqZWN0KCkpOworICB9CiB9OwogCiAjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DU0NSSVBUX0hPU1RQU0VVRE9NT0RFTF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfbGF5b3V0cHNldWRvbW9kZWwuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfbGF5b3V0cHNldWRvbW9kZWwuY3BwCmluZGV4IDE1MmI1NjguLjczMDMzZDUgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jc2NyaXB0X2xheW91dHBzZXVkb21vZGVsLmNwcAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9sYXlvdXRwc2V1ZG9tb2RlbC5jcHAKQEAgLTYsNDgzICs2LDEzIEBACiAKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9sYXlvdXRwc2V1ZG9tb2RlbC5oIgogCi0jaW5jbHVkZSA8c2V0PgotCi0jaW5jbHVkZSAiZnhqcy9jZnhqc2VfYXJndW1lbnRzLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZub3RpZnkuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb250YWluZXJsYXlvdXRpdGVtLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29udGVudGxheW91dGl0ZW0uaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dGl0ZW0uaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXRwcm9jZXNzb3IuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWFzdXJlbWVudC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NjcmlwdGNvbnRleHQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmF2ZXJzZXN0cmF0ZWd5X2NvbnRlbnRsYXlvdXRpdGVtLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9sb2NhbGVtZ3IuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfdXRpbHMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWwoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KQogICAgIDogQ1hGQV9PYmplY3QocERvY3VtZW50LAogICAgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok9iamVjdCwKICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpMYXlvdXRQc2V1ZG9Nb2RlbCwKLSAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyhMImxheW91dFBzZXVkb01vZGVsIikpIHt9CisgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nVmlldyhMImxheW91dFBzZXVkb01vZGVsIiksCisgICAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0xheW91dFBzZXVkb01vZGVsPih0aGlzKSkge30KIAogQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6fkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWwoKSB7fQotCi12b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlJlYWR5KENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXROb3RpZnkoKTsKLSAgaWYgKCFwTm90aWZ5KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChiU2V0dGluZykgewotICAgIFRocm93U2V0UmVhZHlFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50MzJfdCBpU3RhdHVzID0gcE5vdGlmeS0+R2V0TGF5b3V0U3RhdHVzKCk7Ci0gIHBWYWx1ZS0+U2V0Qm9vbGVhbihpU3RhdHVzID49IDIpOwotfQotCi12b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OkhXWFkoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTEFZT1VUTU9ERUxfSFdYWSBsYXlvdXRNb2RlbCkgewotICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsKLSAgaWYgKGlMZW5ndGggPCAxIHx8IGlMZW5ndGggPiAzKSB7Ci0gICAgY29uc3QgRlhfV0NIQVIqIG1ldGhvZE5hbWUgPSBudWxscHRyOwotICAgIHN3aXRjaCAobGF5b3V0TW9kZWwpIHsKLSAgICAgIGNhc2UgWEZBX0xBWU9VVE1PREVMX0g6Ci0gICAgICAgIG1ldGhvZE5hbWUgPSBMImgiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWEZBX0xBWU9VVE1PREVMX1c6Ci0gICAgICAgIG1ldGhvZE5hbWUgPSBMInciOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWEZBX0xBWU9VVE1PREVMX1g6Ci0gICAgICAgIG1ldGhvZE5hbWUgPSBMIngiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWEZBX0xBWU9VVE1PREVMX1k6Ci0gICAgICAgIG1ldGhvZE5hbWUgPSBMInkiOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24obWV0aG9kTmFtZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfTm9kZSogcE5vZGUgPSBudWxscHRyOwotICBDRlhfV2lkZVN0cmluZyB3c1VuaXQoTCJwdCIpOwotICBpbnQzMl90IGlJbmRleCA9IDA7Ci0gIGlmIChpTGVuZ3RoID49IDEpIHsKLSAgICBwTm9kZSA9IHN0YXRpY19jYXN0PENYRkFfTm9kZSo+KHBBcmd1bWVudHMtPkdldE9iamVjdCgwKSk7Ci0gIH0KLSAgaWYgKGlMZW5ndGggPj0gMikgewotICAgIENGWF9CeXRlU3RyaW5nIGJzVW5pdCA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMSk7Ci0gICAgaWYgKCFic1VuaXQuSXNFbXB0eSgpKSB7Ci0gICAgICB3c1VuaXQgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNVbml0LkFzU3RyaW5nQygpKTsKLSAgICB9Ci0gIH0KLSAgaWYgKGlMZW5ndGggPj0gMykgewotICAgIGlJbmRleCA9IHBBcmd1bWVudHMtPkdldEludDMyKDIpOwotICB9Ci0gIGlmICghcE5vZGUpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBEb2NMYXlvdXQgPSBtX3BEb2N1bWVudC0+R2V0RG9jTGF5b3V0KCk7Ci0gIGlmICghcERvY0xheW91dCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIENYRkFfTWVhc3VyZW1lbnQgbWVhc3VyZTsKLSAgQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSA9IHBEb2NMYXlvdXQtPkdldExheW91dEl0ZW0ocE5vZGUpOwotICBpZiAoIXBMYXlvdXRJdGVtKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHdoaWxlIChpSW5kZXggPiAwICYmIHBMYXlvdXRJdGVtKSB7Ci0gICAgcExheW91dEl0ZW0gPSBwTGF5b3V0SXRlbS0+R2V0TmV4dCgpOwotICAgIGlJbmRleC0tOwotICB9Ci0gIENGWEpTRV9WYWx1ZSogcFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsKLSAgaWYgKCFwTGF5b3V0SXRlbSkgewotICAgIHBWYWx1ZS0+U2V0RmxvYXQoMCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ0ZYX1JlY3RGIHJ0UmVjdCA9IHBMYXlvdXRJdGVtLT5HZXRSZWN0KHRydWUpOwotICBzd2l0Y2ggKGxheW91dE1vZGVsKSB7Ci0gICAgY2FzZSBYRkFfTEFZT1VUTU9ERUxfSDoKLSAgICAgIG1lYXN1cmUuU2V0KHJ0UmVjdC5oZWlnaHQsIFhGQV9VTklUX1B0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0xBWU9VVE1PREVMX1c6Ci0gICAgICBtZWFzdXJlLlNldChydFJlY3Qud2lkdGgsIFhGQV9VTklUX1B0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0xBWU9VVE1PREVMX1g6Ci0gICAgICBtZWFzdXJlLlNldChydFJlY3QubGVmdCwgWEZBX1VOSVRfUHQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfTEFZT1VUTU9ERUxfWToKLSAgICAgIG1lYXN1cmUuU2V0KHJ0UmVjdC50b3AsIFhGQV9VTklUX1B0KTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIFhGQV9VTklUIHVuaXQgPSBtZWFzdXJlLkdldFVuaXQod3NVbml0LkFzU3RyaW5nQygpKTsKLSAgRlhfRkxPQVQgZlZhbHVlID0gbWVhc3VyZS5Ub1VuaXQodW5pdCk7Ci0gIGZWYWx1ZSA9IEZYU1lTX3JvdW5kKGZWYWx1ZSAqIDEwMDApIC8gMTAwMC4wZjsKLSAgaWYgKHBWYWx1ZSkKLSAgICBwVmFsdWUtPlNldEZsb2F0KGZWYWx1ZSk7Ci19Ci0KLXZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6SChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIEhXWFkocEFyZ3VtZW50cywgWEZBX0xBWU9VVE1PREVMX0gpOwotfQotCi12b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlcoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBIV1hZKHBBcmd1bWVudHMsIFhGQV9MQVlPVVRNT0RFTF9XKTsKLX0KLQotdm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpYKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgSFdYWShwQXJndW1lbnRzLCBYRkFfTEFZT1VUTU9ERUxfWCk7Ci19Ci0KLXZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6WShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIEhXWFkocEFyZ3VtZW50cywgWEZBX0xBWU9VVE1PREVMX1kpOwotfQotCi12b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6Ok51bWJlcmVkUGFnZUNvdW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk51bWJlcmVkKSB7Ci0gIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwRG9jTGF5b3V0ID0gbV9wRG9jdW1lbnQtPkdldERvY0xheW91dCgpOwotICBpZiAoIXBEb2NMYXlvdXQpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50MzJfdCBpUGFnZUNvdW50ID0gMDsKLSAgaW50MzJfdCBpUGFnZU51bSA9IHBEb2NMYXlvdXQtPkNvdW50UGFnZXMoKTsKLSAgaWYgKGJOdW1iZXJlZCkgewotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlQYWdlTnVtOyBpKyspIHsKLSAgICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcExheW91dFBhZ2UgPSBwRG9jTGF5b3V0LT5HZXRQYWdlKGkpOwotICAgICAgaWYgKCFwTGF5b3V0UGFnZSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIENYRkFfTm9kZSogcE1hc3RlclBhZ2UgPSBwTGF5b3V0UGFnZS0+R2V0TWFzdGVyUGFnZSgpOwotICAgICAgaWYgKHBNYXN0ZXJQYWdlLT5HZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTnVtYmVyZWQpKSB7Ci0gICAgICAgIGlQYWdlQ291bnQrKzsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaVBhZ2VDb3VudCA9IGlQYWdlTnVtOwotICB9Ci0gIENGWEpTRV9WYWx1ZSogcFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsKLSAgaWYgKHBWYWx1ZSkKLSAgICBwVmFsdWUtPlNldEludGVnZXIoaVBhZ2VDb3VudCk7Ci19Ci0KLXZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6UGFnZUNvdW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgTnVtYmVyZWRQYWdlQ291bnQocEFyZ3VtZW50cywgdHJ1ZSk7Ci19Ci0KLXZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6UGFnZVNwYW4oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsKLSAgaWYgKGlMZW5ndGggIT0gMSkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwicGFnZVNwYW4iKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG51bGxwdHI7Ci0gIGlmIChpTGVuZ3RoID49IDEpIHsKLSAgICBwTm9kZSA9IHN0YXRpY19jYXN0PENYRkFfTm9kZSo+KHBBcmd1bWVudHMtPkdldE9iamVjdCgwKSk7Ci0gIH0KLSAgaWYgKCFwTm9kZSkgewotICAgIHJldHVybjsKLSAgfQotICBDWEZBX0xheW91dFByb2Nlc3NvciogcERvY0xheW91dCA9IG1fcERvY3VtZW50LT5HZXREb2NMYXlvdXQoKTsKLSAgaWYgKCFwRG9jTGF5b3V0KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENGWEpTRV9WYWx1ZSogcFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsKLSAgQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSA9IHBEb2NMYXlvdXQtPkdldExheW91dEl0ZW0ocE5vZGUpOwotICBpZiAoIXBMYXlvdXRJdGVtKSB7Ci0gICAgcFZhbHVlLT5TZXRJbnRlZ2VyKC0xKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50MzJfdCBpTGFzdCA9IHBMYXlvdXRJdGVtLT5HZXRMYXN0KCktPkdldFBhZ2UoKS0+R2V0UGFnZUluZGV4KCk7Ci0gIGludDMyX3QgaUZpcnN0ID0gcExheW91dEl0ZW0tPkdldEZpcnN0KCktPkdldFBhZ2UoKS0+R2V0UGFnZUluZGV4KCk7Ci0gIGludDMyX3QgaVBhZ2VTcGFuID0gaUxhc3QgLSBpRmlyc3QgKyAxOwotICBpZiAocFZhbHVlKQotICAgIHBWYWx1ZS0+U2V0SW50ZWdlcihpUGFnZVNwYW4pOwotfQotCi12b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlBhZ2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBQYWdlSW1wKHBBcmd1bWVudHMsIGZhbHNlKTsKLX0KLQotdm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpHZXRPYmpBcnJheShDWEZBX0xheW91dFByb2Nlc3NvciogcERvY0xheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUGFnZU5vLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJPblBhZ2VBcmVhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSYgcmV0QXJyYXkpIHsKLSAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwTGF5b3V0UGFnZSA9IHBEb2NMYXlvdXQtPkdldFBhZ2UoaVBhZ2VObyk7Ci0gIGlmICghcExheW91dFBhZ2UpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHdzVHlwZSA9PSBMInBhZ2VBcmVhIikgewotICAgIGlmIChDWEZBX05vZGUqIHBNYXN0ZXJQYWdlID0gcExheW91dFBhZ2UtPm1fcEZvcm1Ob2RlKSB7Ci0gICAgICByZXRBcnJheS5BZGQocE1hc3RlclBhZ2UpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHdzVHlwZSA9PSBMImNvbnRlbnRBcmVhIikgewotICAgIGZvciAoQ1hGQV9MYXlvdXRJdGVtKiBwSXRlbSA9IHBMYXlvdXRQYWdlLT5tX3BGaXJzdENoaWxkOyBwSXRlbTsKLSAgICAgICAgIHBJdGVtID0gcEl0ZW0tPm1fcE5leHRTaWJsaW5nKSB7Ci0gICAgICBpZiAocEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpDb250ZW50QXJlYSkgewotICAgICAgICByZXRBcnJheS5BZGQocEl0ZW0tPm1fcEZvcm1Ob2RlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0gIHN0ZDo6c2V0PENYRkFfTm9kZSo+IGZvcm1JdGVtczsKLSAgaWYgKHdzVHlwZS5Jc0VtcHR5KCkpIHsKLSAgICBpZiAoQ1hGQV9Ob2RlKiBwTWFzdGVyUGFnZSA9IHBMYXlvdXRQYWdlLT5tX3BGb3JtTm9kZSkgewotICAgICAgcmV0QXJyYXkuQWRkKHBNYXN0ZXJQYWdlKTsKLSAgICB9Ci0gICAgZm9yIChDWEZBX0xheW91dEl0ZW0qIHBJdGVtID0gcExheW91dFBhZ2UtPm1fcEZpcnN0Q2hpbGQ7IHBJdGVtOwotICAgICAgICAgcEl0ZW0gPSBwSXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsKLSAgICAgIGlmIChwSXRlbS0+bV9wRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkNvbnRlbnRBcmVhKSB7Ci0gICAgICAgIHJldEFycmF5LkFkZChwSXRlbS0+bV9wRm9ybU5vZGUpOwotICAgICAgICBpZiAoIWJPblBhZ2VBcmVhKSB7Ci0gICAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0NvbnRlbnRMYXlvdXRJdGVtPgotICAgICAgICAgIGl0ZXJhdG9yKHN0YXRpY19jYXN0PENYRkFfQ29udGVudExheW91dEl0ZW0qPihwSXRlbS0+bV9wRmlyc3RDaGlsZCkpOwotICAgICAgICAgIGZvciAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcEl0ZW1DaGlsZCA9IGl0ZXJhdG9yLkdldEN1cnJlbnQoKTsKLSAgICAgICAgICAgICAgIHBJdGVtQ2hpbGQ7IHBJdGVtQ2hpbGQgPSBpdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgIGlmICghcEl0ZW1DaGlsZC0+SXNDb250ZW50TGF5b3V0SXRlbSgpKSB7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgWEZBX0VsZW1lbnQgZVR5cGUgPSBwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZS0+R2V0RWxlbWVudFR5cGUoKTsKLSAgICAgICAgICAgIGlmIChlVHlwZSAhPSBYRkFfRWxlbWVudDo6RmllbGQgJiYgZVR5cGUgIT0gWEZBX0VsZW1lbnQ6OkRyYXcgJiYKLSAgICAgICAgICAgICAgICBlVHlwZSAhPSBYRkFfRWxlbWVudDo6U3ViZm9ybSAmJiBlVHlwZSAhPSBYRkFfRWxlbWVudDo6QXJlYSkgewotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwZGZpdW06OkNvbnRhaW5zVmFsdWUoZm9ybUl0ZW1zLCBwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSkpCi0gICAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgICAgICBmb3JtSXRlbXMuaW5zZXJ0KHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlKTsKLSAgICAgICAgICAgIHJldEFycmF5LkFkZChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoYk9uUGFnZUFyZWEpIHsKLSAgICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfQ29udGVudExheW91dEl0ZW0+Ci0gICAgICAgICAgaXRlcmF0b3Ioc3RhdGljX2Nhc3Q8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+KHBJdGVtKSk7Ci0gICAgICAgICAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwSXRlbUNoaWxkID0gaXRlcmF0b3IuR2V0Q3VycmVudCgpOwotICAgICAgICAgICAgICAgcEl0ZW1DaGlsZDsgcEl0ZW1DaGlsZCA9IGl0ZXJhdG9yLk1vdmVUb05leHQoKSkgewotICAgICAgICAgICAgaWYgKCFwSXRlbUNoaWxkLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkpIHsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBYRkFfRWxlbWVudCBlVHlwZSA9IHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRFbGVtZW50VHlwZSgpOwotICAgICAgICAgICAgaWYgKGVUeXBlICE9IFhGQV9FbGVtZW50OjpGaWVsZCAmJiBlVHlwZSAhPSBYRkFfRWxlbWVudDo6RHJhdyAmJgotICAgICAgICAgICAgICAgIGVUeXBlICE9IFhGQV9FbGVtZW50OjpTdWJmb3JtICYmIGVUeXBlICE9IFhGQV9FbGVtZW50OjpBcmVhKSB7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBkZml1bTo6Q29udGFpbnNWYWx1ZShmb3JtSXRlbXMsIHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlKSkKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBmb3JtSXRlbXMuaW5zZXJ0KHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlKTsKLSAgICAgICAgICAgIHJldEFycmF5LkFkZChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotICBYRkFfRWxlbWVudCBlVHlwZSA9IFhGQV9FbGVtZW50OjpVbmtub3duOwotICBpZiAod3NUeXBlID09IEwiZmllbGQiKSB7Ci0gICAgZVR5cGUgPSBYRkFfRWxlbWVudDo6RmllbGQ7Ci0gIH0gZWxzZSBpZiAod3NUeXBlID09IEwiZHJhdyIpIHsKLSAgICBlVHlwZSA9IFhGQV9FbGVtZW50OjpEcmF3OwotICB9IGVsc2UgaWYgKHdzVHlwZSA9PSBMInN1YmZvcm0iKSB7Ci0gICAgZVR5cGUgPSBYRkFfRWxlbWVudDo6U3ViZm9ybTsKLSAgfSBlbHNlIGlmICh3c1R5cGUgPT0gTCJhcmVhIikgewotICAgIGVUeXBlID0gWEZBX0VsZW1lbnQ6OkFyZWE7Ci0gIH0KLSAgaWYgKGVUeXBlICE9IFhGQV9FbGVtZW50OjpVbmtub3duKSB7Ci0gICAgZm9yIChDWEZBX0xheW91dEl0ZW0qIHBJdGVtID0gcExheW91dFBhZ2UtPm1fcEZpcnN0Q2hpbGQ7IHBJdGVtOwotICAgICAgICAgcEl0ZW0gPSBwSXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsKLSAgICAgIGlmIChwSXRlbS0+bV9wRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkNvbnRlbnRBcmVhKSB7Ci0gICAgICAgIGlmICghYk9uUGFnZUFyZWEpIHsKLSAgICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfQ29udGVudExheW91dEl0ZW0+Ci0gICAgICAgICAgaXRlcmF0b3Ioc3RhdGljX2Nhc3Q8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+KHBJdGVtLT5tX3BGaXJzdENoaWxkKSk7Ci0gICAgICAgICAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwSXRlbUNoaWxkID0gaXRlcmF0b3IuR2V0Q3VycmVudCgpOwotICAgICAgICAgICAgICAgcEl0ZW1DaGlsZDsgcEl0ZW1DaGlsZCA9IGl0ZXJhdG9yLk1vdmVUb05leHQoKSkgewotICAgICAgICAgICAgaWYgKCFwSXRlbUNoaWxkLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkpCi0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgaWYgKHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IGVUeXBlKQotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChwZGZpdW06OkNvbnRhaW5zVmFsdWUoZm9ybUl0ZW1zLCBwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSkpCi0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgZm9ybUl0ZW1zLmluc2VydChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZSk7Ci0gICAgICAgICAgICByZXRBcnJheS5BZGQocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGJPblBhZ2VBcmVhKSB7Ci0gICAgICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X0NvbnRlbnRMYXlvdXRJdGVtPgotICAgICAgICAgIGl0ZXJhdG9yKHN0YXRpY19jYXN0PENYRkFfQ29udGVudExheW91dEl0ZW0qPihwSXRlbSkpOwotICAgICAgICAgIGZvciAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcEl0ZW1DaGlsZCA9IGl0ZXJhdG9yLkdldEN1cnJlbnQoKTsKLSAgICAgICAgICAgICAgIHBJdGVtQ2hpbGQ7IHBJdGVtQ2hpbGQgPSBpdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgICAgIGlmICghcEl0ZW1DaGlsZC0+SXNDb250ZW50TGF5b3V0SXRlbSgpKQotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGlmIChwSXRlbUNoaWxkLT5tX3BGb3JtTm9kZS0+R2V0RWxlbWVudFR5cGUoKSAhPSBlVHlwZSkKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICBpZiAocGRmaXVtOjpDb250YWluc1ZhbHVlKGZvcm1JdGVtcywgcEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUpKQotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGZvcm1JdGVtcy5pbnNlcnQocEl0ZW1DaGlsZC0+bV9wRm9ybU5vZGUpOwotICAgICAgICAgICAgcmV0QXJyYXkuQWRkKHBJdGVtQ2hpbGQtPm1fcEZvcm1Ob2RlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci19Ci0KLXZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6UGFnZUNvbnRlbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsKLSAgaWYgKGlMZW5ndGggPCAxIHx8IGlMZW5ndGggPiAzKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJwYWdlQ29udGVudCIpOwotICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IGlJbmRleCA9IDA7Ci0gIENGWF9XaWRlU3RyaW5nIHdzVHlwZTsKLSAgYm9vbCBiT25QYWdlQXJlYSA9IGZhbHNlOwotICBpZiAoaUxlbmd0aCA+PSAxKSB7Ci0gICAgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7Ci0gIH0KLSAgaWYgKGlMZW5ndGggPj0gMikgewotICAgIENGWF9CeXRlU3RyaW5nIGJzVHlwZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMSk7Ci0gICAgd3NUeXBlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVHlwZS5Bc1N0cmluZ0MoKSk7Ci0gIH0KLSAgaWYgKGlMZW5ndGggPj0gMykgewotICAgIGJPblBhZ2VBcmVhID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMikgPT0gMCA/IGZhbHNlIDogdHJ1ZTsKLSAgfQotICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldE5vdGlmeSgpOwotICBpZiAoIXBOb3RpZnkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBEb2NMYXlvdXQgPSBtX3BEb2N1bWVudC0+R2V0RG9jTGF5b3V0KCk7Ci0gIGlmICghcERvY0xheW91dCkgewotICAgIHJldHVybjsKLSAgfQotICBDWEZBX05vZGVBcnJheSByZXRBcnJheTsKLSAgR2V0T2JqQXJyYXkocERvY0xheW91dCwgaUluZGV4LCB3c1R5cGUsIGJPblBhZ2VBcmVhLCByZXRBcnJheSk7Ci0gIENYRkFfQXJyYXlOb2RlTGlzdCogcEFycmF5Tm9kZUxpc3QgPSBuZXcgQ1hGQV9BcnJheU5vZGVMaXN0KG1fcERvY3VtZW50KTsKLSAgcEFycmF5Tm9kZUxpc3QtPlNldEFycmF5Tm9kZUxpc3QocmV0QXJyYXkpOwotICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRPYmplY3QoCi0gICAgICBwQXJyYXlOb2RlTGlzdCwgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SnNlTm9ybWFsQ2xhc3MoKSk7Ci19Ci0KLXZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6QWJzUGFnZUNvdW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgTnVtYmVyZWRQYWdlQ291bnQocEFyZ3VtZW50cywgZmFsc2UpOwotfQotCi12b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OkFic1BhZ2VDb3VudEluQmF0Y2goCi0gICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBDRlhKU0VfVmFsdWUqIHBWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7Ci0gIGlmIChwVmFsdWUpCi0gICAgcFZhbHVlLT5TZXRJbnRlZ2VyKDApOwotfQotCi12b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNoZWV0Q291bnRJbkJhdGNoKAotICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOwotICBpZiAocFZhbHVlKQotICAgIHBWYWx1ZS0+U2V0SW50ZWdlcigwKTsKLX0KLQotdm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpSZWxheW91dChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIENYRkFfTm9kZSogcFJvb3ROb2RlID0gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKLSAgQ1hGQV9Ob2RlKiBwRm9ybVJvb3QgPSBwUm9vdE5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpGb3JtKTsKLSAgQVNTRVJUKHBGb3JtUm9vdCk7Ci0gIENYRkFfTm9kZSogcENvbnRlbnRSb290Tm9kZSA9IHBGb3JtUm9vdC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICBDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dFByb2Nlc3NvciA9IG1fcERvY3VtZW50LT5HZXRMYXlvdXRQcm9jZXNzb3IoKTsKLSAgaWYgKHBDb250ZW50Um9vdE5vZGUpIHsKLSAgICBwTGF5b3V0UHJvY2Vzc29yLT5BZGRDaGFuZ2VkQ29udGFpbmVyKHBDb250ZW50Um9vdE5vZGUpOwotICB9Ci0gIHBMYXlvdXRQcm9jZXNzb3ItPlNldEZvcmNlUmVMYXlvdXQodHJ1ZSk7Ci19Ci0KLXZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6QWJzUGFnZVNwYW4oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBQYWdlU3BhbihwQXJndW1lbnRzKTsKLX0KLQotdm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpBYnNQYWdlSW5CYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGlmIChwQXJndW1lbnRzLT5HZXRMZW5ndGgoKSAhPSAxKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJhYnNQYWdlSW5CYXRjaCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENGWEpTRV9WYWx1ZSogcFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsKLSAgaWYgKHBWYWx1ZSkKLSAgICBwVmFsdWUtPlNldEludGVnZXIoMCk7Ci19Ci0KLXZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2hlZXRJbkJhdGNoKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaWYgKHBBcmd1bWVudHMtPkdldExlbmd0aCgpICE9IDEpIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMInNoZWV0SW5CYXRjaCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENGWEpTRV9WYWx1ZSogcFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsKLSAgaWYgKHBWYWx1ZSkKLSAgICBwVmFsdWUtPlNldEludGVnZXIoMCk7Ci19Ci0KLXZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2hlZXQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBQYWdlSW1wKHBBcmd1bWVudHMsIHRydWUpOwotfQotCi12b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlJlbGF5b3V0UGFnZUFyZWEoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotfQotCi12b2lkIENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNoZWV0Q291bnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBOdW1iZXJlZFBhZ2VDb3VudChwQXJndW1lbnRzLCBmYWxzZSk7Ci19Ci0KLXZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6QWJzUGFnZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIFBhZ2VJbXAocEFyZ3VtZW50cywgdHJ1ZSk7Ci19Ci0KLXZvaWQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6UGFnZUltcChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFic1BhZ2UpIHsKLSAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7Ci0gIGlmIChpTGVuZ3RoICE9IDEpIHsKLSAgICBjb25zdCBGWF9XQ0hBUiogbWV0aG9kTmFtZTsKLSAgICBpZiAoYkFic1BhZ2UpIHsKLSAgICAgIG1ldGhvZE5hbWUgPSBMImFic1BhZ2UiOwotICAgIH0gZWxzZSB7Ci0gICAgICBtZXRob2ROYW1lID0gTCJwYWdlIjsKLSAgICB9Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24obWV0aG9kTmFtZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfTm9kZSogcE5vZGUgPSBudWxscHRyOwotICBpZiAoaUxlbmd0aCA+PSAxKSB7Ci0gICAgcE5vZGUgPSBzdGF0aWNfY2FzdDxDWEZBX05vZGUqPihwQXJndW1lbnRzLT5HZXRPYmplY3QoMCkpOwotICB9Ci0gIGludDMyX3QgaVBhZ2UgPSAwOwotICBDRlhKU0VfVmFsdWUqIHBWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7Ci0gIGlmICghcE5vZGUgJiYgcFZhbHVlKQotICAgIHBWYWx1ZS0+U2V0SW50ZWdlcihpUGFnZSk7Ci0KLSAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBEb2NMYXlvdXQgPSBtX3BEb2N1bWVudC0+R2V0RG9jTGF5b3V0KCk7Ci0gIGlmICghcERvY0xheW91dCkgewotICAgIHJldHVybjsKLSAgfQotICBDWEZBX0xheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gcERvY0xheW91dC0+R2V0TGF5b3V0SXRlbShwTm9kZSk7Ci0gIGlmICghcExheW91dEl0ZW0pIHsKLSAgICBwVmFsdWUtPlNldEludGVnZXIoLTEpOwotICAgIHJldHVybjsKLSAgfQotICBpUGFnZSA9IHBMYXlvdXRJdGVtLT5HZXRGaXJzdCgpLT5HZXRQYWdlKCktPkdldFBhZ2VJbmRleCgpOwotICBpZiAocFZhbHVlKQotICAgIHBWYWx1ZS0+U2V0SW50ZWdlcihiQWJzUGFnZSA/IGlQYWdlIDogaVBhZ2UgKyAxKTsKLX0KLQotdm9pZCBDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpUaHJvd1NldFJlYWR5RXhjZXB0aW9uKCkgY29uc3QgewotICBUaHJvd0V4Y2VwdGlvbihMIlVuYWJsZSB0byBzZXQgcmVhZHkgdmFsdWUuIik7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9sYXlvdXRwc2V1ZG9tb2RlbC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfbGF5b3V0cHNldWRvbW9kZWwuaAppbmRleCA1NWEwMGRiLi5kNzYwMTNhIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9sYXlvdXRwc2V1ZG9tb2RlbC5oCisrKyBiL3hmYS9meGZhL3BhcnNlci9jc2NyaXB0X2xheW91dHBzZXVkb21vZGVsLmgKQEAgLTcsMTUgKzcsOCBAQAogI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1NDUklQVF9MQVlPVVRQU0VVRE9NT0RFTF9IXwogI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1NDUklQVF9MQVlPVVRQU0VVRE9NT0RFTF9IXwogCi0jaW5jbHVkZSAiZnhqcy9jZnhqc2VfYXJndW1lbnRzLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKLQotZW51bSBYRkFfTEFZT1VUTU9ERUxfSFdYWSB7Ci0gIFhGQV9MQVlPVVRNT0RFTF9ILAotICBYRkFfTEFZT1VUTU9ERUxfVywKLSAgWEZBX0xBWU9VVE1PREVMX1gsCi0gIFhGQV9MQVlPVVRNT0RFTF9ZCi19OworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9sYXlvdXRwc2V1ZG9tb2RlbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX29iamVjdC5oIgogCiBjbGFzcyBDWEZBX0xheW91dFByb2Nlc3NvcjsKIApAQCAtMjQsNDAgKzE3LDkgQEAKICAgZXhwbGljaXQgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpOwogICB+Q1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbCgpIG92ZXJyaWRlOwogCi0gIHZvaWQgUmVhZHkoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsIGJvb2wgYlNldHRpbmcsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0KLSAgdm9pZCBIV1hZKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMsIFhGQV9MQVlPVVRNT0RFTF9IV1hZIGxheW91dE1vZGVsKTsKLSAgdm9pZCBIKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFcoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgWChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBZKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIE51bWJlcmVkUGFnZUNvdW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMsIGJvb2wgYk51bWJlcmVkKTsKLSAgdm9pZCBQYWdlQ291bnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgUGFnZVNwYW4oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgUGFnZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBQYWdlQ29udGVudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBBYnNQYWdlQ291bnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgQWJzUGFnZUNvdW50SW5CYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTaGVldENvdW50SW5CYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBSZWxheW91dChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBBYnNQYWdlU3BhbihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBBYnNQYWdlSW5CYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTaGVldEluQmF0Y2goQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2hlZXQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgUmVsYXlvdXRQYWdlQXJlYShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTaGVldENvdW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIEFic1BhZ2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgR2V0T2JqQXJyYXkoQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBEb2NMYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUGFnZU5vLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1R5cGUsCi0gICAgICAgICAgICAgICAgICAgYm9vbCBiT25QYWdlQXJlYSwKLSAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSYgcmV0QXJyYXkpOwotICB2b2lkIFBhZ2VJbXAoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cywgYm9vbCBiQWJzUGFnZSk7Ci0KLSBwcml2YXRlOgotICB2b2lkIFRocm93U2V0UmVhZHlFeGNlcHRpb24oKSBjb25zdDsKKyAgQ0pYX0xheW91dFBzZXVkb01vZGVsKiBKU0xheW91dFBzZXVkb01vZGVsKCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDSlhfTGF5b3V0UHNldWRvTW9kZWwqPihKU09iamVjdCgpKTsKKyAgfQogfTsKIAogI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1NDUklQVF9MQVlPVVRQU0VVRE9NT0RFTF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfbG9ncHNldWRvbW9kZWwuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfbG9ncHNldWRvbW9kZWwuY3BwCmluZGV4IDQ4Y2NjZTAuLjFjMmQ4MDIgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jc2NyaXB0X2xvZ3BzZXVkb21vZGVsLmNwcAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9sb2dwc2V1ZG9tb2RlbC5jcHAKQEAgLTYsMjYgKzYsMTMgQEAKIAogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jc2NyaXB0X2xvZ3BzZXVkb21vZGVsLmgiCiAKLSNpbmNsdWRlICJmeGpzL2NmeGpzZV9hcmd1bWVudHMuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxlbWdyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX3V0aWxzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogCiBDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOjpDU2NyaXB0X0xvZ1BzZXVkb01vZGVsKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkKICAgICA6IENYRkFfT2JqZWN0KHBEb2N1bWVudCwKICAgICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpPYmplY3QsCiAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6TG9nUHNldWRvTW9kZWwsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MoTCJsb2dQc2V1ZG9Nb2RlbCIpKSB7fQorICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZ1ZpZXcoTCJsb2dQc2V1ZG9Nb2RlbCIpLAorICAgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9Mb2dQc2V1ZG9Nb2RlbD4odGhpcykpIHt9CiAKIENTY3JpcHRfTG9nUHNldWRvTW9kZWw6On5DU2NyaXB0X0xvZ1BzZXVkb01vZGVsKCkge30KLQotdm9pZCBDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOjpNZXNzYWdlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHt9Ci0KLXZvaWQgQ1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbDo6VHJhY2VFbmFibGVkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHt9Ci0KLXZvaWQgQ1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbDo6VHJhY2VBY3RpdmF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7fQotCi12b2lkIENTY3JpcHRfTG9nUHNldWRvTW9kZWw6OlRyYWNlRGVhY3RpdmF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7fQotCi12b2lkIENTY3JpcHRfTG9nUHNldWRvTW9kZWw6OlRyYWNlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9sb2dwc2V1ZG9tb2RlbC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfbG9ncHNldWRvbW9kZWwuaAppbmRleCAxOGY5ZjUxLi45MzQ0ZjIwIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9sb2dwc2V1ZG9tb2RlbC5oCisrKyBiL3hmYS9meGZhL3BhcnNlci9jc2NyaXB0X2xvZ3BzZXVkb21vZGVsLmgKQEAgLTcsMTkgKzcsMTcgQEAKICNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NTQ1JJUFRfTE9HUFNFVURPTU9ERUxfSF8KICNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NTQ1JJUFRfTE9HUFNFVURPTU9ERUxfSF8KIAotI2luY2x1ZGUgImZ4anMvY2Z4anNlX2FyZ3VtZW50cy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfb2JqZWN0LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2xvZ3BzZXVkb21vZGVsLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb2JqZWN0LmgiCiAKIGNsYXNzIENTY3JpcHRfTG9nUHNldWRvTW9kZWwgOiBwdWJsaWMgQ1hGQV9PYmplY3QgewogIHB1YmxpYzoKICAgZXhwbGljaXQgQ1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpOwogICB+Q1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbCgpIG92ZXJyaWRlOwogCi0gIHZvaWQgTWVzc2FnZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBUcmFjZUVuYWJsZWQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgVHJhY2VBY3RpdmF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBUcmFjZURlYWN0aXZhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgVHJhY2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7CisgIENKWF9Mb2dQc2V1ZG9Nb2RlbCogSlNMb2dQc2V1ZG9Nb2RlbCgpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q0pYX0xvZ1BzZXVkb01vZGVsKj4oSlNPYmplY3QoKSk7CisgIH0KIH07CiAKICNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NTQ1JJUFRfTE9HUFNFVURPTU9ERUxfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jc2NyaXB0X3NpZ25hdHVyZXBzZXVkb21vZGVsLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jc2NyaXB0X3NpZ25hdHVyZXBzZXVkb21vZGVsLmNwcAppbmRleCBlNTg3NGE2Li5jNWY0ZTY0IDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5jcHAKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfc2lnbmF0dXJlcHNldWRvbW9kZWwuY3BwCkBAIC02LDYzICs2LDE0IEBACiAKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5oIgogCi0jaW5jbHVkZSAiZnhqcy9jZnhqc2VfYXJndW1lbnRzLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvYXBwL3hmYV9mZm5vdGlmeS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2NyaXB0Y29udGV4dC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxlbWdyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX3V0aWxzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogCiBDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjpDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsKAogICAgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkKICAgICA6IENYRkFfT2JqZWN0KHBEb2N1bWVudCwKICAgICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpPYmplY3QsCiAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6U2lnbmF0dXJlUHNldWRvTW9kZWwsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZ0MoTCJzaWduYXR1cmVQc2V1ZG9Nb2RlbCIpKSB7fQorICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZ1ZpZXcoTCJzaWduYXR1cmVQc2V1ZG9Nb2RlbCIpLAorICAgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9TaWduYXR1cmVQc2V1ZG9Nb2RlbD4odGhpcykpIHt9CiAKIENTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWw6On5DU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsKCkge30KLQotdm9pZCBDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjpWZXJpZnkoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsKLSAgaWYgKGlMZW5ndGggPCAxIHx8IGlMZW5ndGggPiA0KSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJ2ZXJpZnkiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDRlhKU0VfVmFsdWUqIHBWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7Ci0gIGlmIChwVmFsdWUpCi0gICAgcFZhbHVlLT5TZXRJbnRlZ2VyKDApOwotfQotCi12b2lkIENTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWw6OlNpZ24oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsKLSAgaWYgKGlMZW5ndGggPCAzIHx8IGlMZW5ndGggPiA3KSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJzaWduIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOwotICBpZiAocFZhbHVlKQotICAgIHBWYWx1ZS0+U2V0Qm9vbGVhbihmYWxzZSk7Ci19Ci0KLXZvaWQgQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbDo6RW51bWVyYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaWYgKHBBcmd1bWVudHMtPkdldExlbmd0aCgpICE9IDApIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMImVudW1lcmF0ZSIpOwotICAgIHJldHVybjsKLSAgfQotICByZXR1cm47Ci19Ci0KLXZvaWQgQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbDo6Q2xlYXIoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsKLSAgaWYgKGlMZW5ndGggPCAxIHx8IGlMZW5ndGggPiAyKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJjbGVhciIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENGWEpTRV9WYWx1ZSogcFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsKLSAgaWYgKHBWYWx1ZSkKLSAgICBwVmFsdWUtPlNldEJvb2xlYW4oZmFsc2UpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfc2lnbmF0dXJlcHNldWRvbW9kZWwuaCBiL3hmYS9meGZhL3BhcnNlci9jc2NyaXB0X3NpZ25hdHVyZXBzZXVkb21vZGVsLmgKaW5kZXggNGY5ZGVkMC4uMjc2YzFkZiAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfc2lnbmF0dXJlcHNldWRvbW9kZWwuaAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5oCkBAIC03LDE4ICs3LDE3IEBACiAjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DU0NSSVBUX1NJR05BVFVSRVBTRVVET01PREVMX0hfCiAjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DU0NSSVBUX1NJR05BVFVSRVBTRVVET01PREVMX0hfCiAKLSNpbmNsdWRlICJmeGpzL2NmeGpzZV9hcmd1bWVudHMuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX29iamVjdC5oIgogCiBjbGFzcyBDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsIDogcHVibGljIENYRkFfT2JqZWN0IHsKICBwdWJsaWM6CiAgIGV4cGxpY2l0IENTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWwoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsKICAgfkNTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWwoKSBvdmVycmlkZTsKIAotICB2b2lkIFZlcmlmeShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTaWduKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIEVudW1lcmF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBDbGVhcihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKKyAgQ0pYX1NpZ25hdHVyZVBzZXVkb01vZGVsKiBKU1NpZ25hdHVyZVBzZXVkb01vZGVsKCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDSlhfU2lnbmF0dXJlUHNldWRvTW9kZWwqPihKU09iamVjdCgpKTsKKyAgfQogfTsKIAogI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1NDUklQVF9TSUdOQVRVUkVQU0VVRE9NT0RFTF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWNjZXNzaWJsZWNvbnRlbnQuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWNjZXNzaWJsZWNvbnRlbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMjQ2MTUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hY2Nlc3NpYmxlY29udGVudC5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWNjZXNzaWJsZWNvbnRlbnQuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImFjY2Vzc2libGVDb250ZW50IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfQWNjZXNzaWJsZUNvbnRlbnQ6OkNYRkFfQWNjZXNzaWJsZUNvbnRlbnQoQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkFjY2Vzc2libGVDb250ZW50LAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfQWNjZXNzaWJsZUNvbnRlbnQ6On5DWEZBX0FjY2Vzc2libGVDb250ZW50KCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2FjY2Vzc2libGVjb250ZW50LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hY2Nlc3NpYmxlY29udGVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YWQ4ZmMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hY2Nlc3NpYmxlY29udGVudC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9BQ0NFU1NJQkxFQ09OVEVOVF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9BQ0NFU1NJQkxFQ09OVEVOVF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0FjY2Vzc2libGVDb250ZW50IDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0FjY2Vzc2libGVDb250ZW50KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfQWNjZXNzaWJsZUNvbnRlbnQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQUNDRVNTSUJMRUNPTlRFTlRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2Fjcm9iYXQuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWNyb2JhdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMyN2MwOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Fjcm9iYXQuY3BwCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2Fjcm9iYXQuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0geworICAgIHtYRkFfRWxlbWVudDo6QXV0b1NhdmUsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6VmFsaWRhdGUsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6VmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6QWNyb2JhdDcsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6Q29tbW9uLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJhY3JvYmF0IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfQWNyb2JhdDo6Q1hGQV9BY3JvYmF0KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkFjcm9iYXQsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9BY3JvYmF0Ojp+Q1hGQV9BY3JvYmF0KCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2Fjcm9iYXQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Fjcm9iYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzAxZDU5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWNyb2JhdC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9BQ1JPQkFUX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0FDUk9CQVRfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9BY3JvYmF0IDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0Fjcm9iYXQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9BY3JvYmF0KCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0FDUk9CQVRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2Fjcm9iYXQ3LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Fjcm9iYXQ3LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODlhYjYwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWNyb2JhdDcuY3BwCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2Fjcm9iYXQ3LmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHsKKyAgICB7WEZBX0VsZW1lbnQ6OkR5bmFtaWNSZW5kZXIsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImFjcm9iYXQ3IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfQWNyb2JhdDc6OkNYRkFfQWNyb2JhdDcoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6QWNyb2JhdDcsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9BY3JvYmF0Nzo6fkNYRkFfQWNyb2JhdDcoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWNyb2JhdDcuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Fjcm9iYXQ3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc5ODY0YQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Fjcm9iYXQ3LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0FDUk9CQVQ3X0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0FDUk9CQVQ3X0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfQWNyb2JhdDcgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfQWNyb2JhdDcoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9BY3JvYmF0NygpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9BQ1JPQkFUN19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWRiZV9qc2NvbnNvbGUuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWRiZV9qc2NvbnNvbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMzM2MzYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZGJlX2pzY29uc29sZS5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWRiZV9qc2NvbnNvbGUuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMIkFEQkVfSlNDb25zb2xlIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfYURCRV9KU0NvbnNvbGU6OkNYRkFfYURCRV9KU0NvbnNvbGUoQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkFEQkVfSlNDb25zb2xlLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfYURCRV9KU0NvbnNvbGU6On5DWEZBX2FEQkVfSlNDb25zb2xlKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2FkYmVfanNjb25zb2xlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZGJlX2pzY29uc29sZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYWI2YTEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZGJlX2pzY29uc29sZS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9BREJFX0pTQ09OU09MRV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9BREJFX0pTQ09OU09MRV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX2FEQkVfSlNDb25zb2xlIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX2FEQkVfSlNDb25zb2xlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfYURCRV9KU0NvbnNvbGUoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQURCRV9KU0NPTlNPTEVfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2FkYmVfanNkZWJ1Z2dlci5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZGJlX2pzZGVidWdnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYjYyZWIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZGJlX2pzZGVidWdnZXIuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2FkYmVfanNkZWJ1Z2dlci5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiQURCRV9KU0RlYnVnZ2VyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfYURCRV9KU0RlYnVnZ2VyOjpDWEZBX2FEQkVfSlNEZWJ1Z2dlcihDWEZBX0RvY3VtZW50KiBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpBREJFX0pTRGVidWdnZXIsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9hREJFX0pTRGVidWdnZXI6On5DWEZBX2FEQkVfSlNEZWJ1Z2dlcigpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZGJlX2pzZGVidWdnZXIuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2FkYmVfanNkZWJ1Z2dlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkODIxZDQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZGJlX2pzZGVidWdnZXIuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQURCRV9KU0RFQlVHR0VSX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0FEQkVfSlNERUJVR0dFUl9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX2FEQkVfSlNEZWJ1Z2dlciA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9hREJFX0pTRGVidWdnZXIoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9hREJFX0pTRGVidWdnZXIoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQURCRV9KU0RFQlVHR0VSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZGRzaWxlbnRwcmludC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZGRzaWxlbnRwcmludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNmN2Y4MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2FkZHNpbGVudHByaW50LmNwcApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZGRzaWxlbnRwcmludC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiYWRkU2lsZW50UHJpbnQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9BZGRTaWxlbnRQcmludDo6Q1hGQV9BZGRTaWxlbnRQcmludChDWEZBX0RvY3VtZW50KiBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6QWRkU2lsZW50UHJpbnQsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9BZGRTaWxlbnRQcmludDo6fkNYRkFfQWRkU2lsZW50UHJpbnQoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWRkc2lsZW50cHJpbnQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2FkZHNpbGVudHByaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI1MTk2OQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2FkZHNpbGVudHByaW50LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0FERFNJTEVOVFBSSU5UX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0FERFNJTEVOVFBSSU5UX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfQWRkU2lsZW50UHJpbnQgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfQWRkU2lsZW50UHJpbnQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9BZGRTaWxlbnRQcmludCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9BRERTSUxFTlRQUklOVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWRkdmlld2VycHJlZmVyZW5jZXMuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWRkdmlld2VycHJlZmVyZW5jZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlM2QwNjAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZGR2aWV3ZXJwcmVmZXJlbmNlcy5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWRkdmlld2VycHJlZmVyZW5jZXMuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImFkZFZpZXdlclByZWZlcmVuY2VzIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfQWRkVmlld2VyUHJlZmVyZW5jZXM6OkNYRkFfQWRkVmlld2VyUHJlZmVyZW5jZXMoQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkFkZFZpZXdlclByZWZlcmVuY2VzLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfQWRkVmlld2VyUHJlZmVyZW5jZXM6On5DWEZBX0FkZFZpZXdlclByZWZlcmVuY2VzKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2FkZHZpZXdlcnByZWZlcmVuY2VzLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZGR2aWV3ZXJwcmVmZXJlbmNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMTA4NjgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZGR2aWV3ZXJwcmVmZXJlbmNlcy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9BRERWSUVXRVJQUkVGRVJFTkNFU19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9BRERWSUVXRVJQUkVGRVJFTkNFU19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0FkZFZpZXdlclByZWZlcmVuY2VzIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0FkZFZpZXdlclByZWZlcmVuY2VzKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfQWRkVmlld2VyUHJlZmVyZW5jZXMoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQUREVklFV0VSUFJFRkVSRU5DRVNfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2FkanVzdGRhdGEuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWRqdXN0ZGF0YS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBhNGYyYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2FkanVzdGRhdGEuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2FkanVzdGRhdGEuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImFkanVzdERhdGEiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9BZGp1c3REYXRhOjpDWEZBX0FkanVzdERhdGEoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVYsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkFkanVzdERhdGEsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9BZGp1c3REYXRhOjp+Q1hGQV9BZGp1c3REYXRhKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2FkanVzdGRhdGEuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2FkanVzdGRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzAwNGMyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWRqdXN0ZGF0YS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9BREpVU1REQVRBX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0FESlVTVERBVEFfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9BZGp1c3REYXRhIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0FkanVzdERhdGEoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9BZGp1c3REYXRhKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0FESlVTVERBVEFfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2Fkb2JlZXh0ZW5zaW9ubGV2ZWwuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWRvYmVleHRlbnNpb25sZXZlbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI1M2Y4YgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Fkb2JlZXh0ZW5zaW9ubGV2ZWwuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2Fkb2JlZXh0ZW5zaW9ubGV2ZWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImFkb2JlRXh0ZW5zaW9uTGV2ZWwiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9BZG9iZUV4dGVuc2lvbkxldmVsOjpDWEZBX0Fkb2JlRXh0ZW5zaW9uTGV2ZWwoQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpBZG9iZUV4dGVuc2lvbkxldmVsLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfQWRvYmVFeHRlbnNpb25MZXZlbDo6fkNYRkFfQWRvYmVFeHRlbnNpb25MZXZlbCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZG9iZWV4dGVuc2lvbmxldmVsLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZG9iZWV4dGVuc2lvbmxldmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFhODMwZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Fkb2JlZXh0ZW5zaW9ubGV2ZWwuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQURPQkVFWFRFTlNJT05MRVZFTF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9BRE9CRUVYVEVOU0lPTkxFVkVMX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfQWRvYmVFeHRlbnNpb25MZXZlbCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9BZG9iZUV4dGVuc2lvbkxldmVsKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfQWRvYmVFeHRlbnNpb25MZXZlbCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9BRE9CRUVYVEVOU0lPTkxFVkVMX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZ2VudC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZ2VudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY4YjkzOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2FnZW50LmNwcApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZ2VudC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiYWdlbnQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9BZ2VudDo6Q1hGQV9BZ2VudChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpBZ2VudCwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0FnZW50Ojp+Q1hGQV9BZ2VudCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZ2VudC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWdlbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWQ4MjZkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWdlbnQuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQUdFTlRfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQUdFTlRfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9BZ2VudCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9BZ2VudChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0FnZW50KCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0FHRU5UX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hbHdheXNlbWJlZC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hbHdheXNlbWJlZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNmOTcxNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Fsd2F5c2VtYmVkLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hbHdheXNlbWJlZC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiYWx3YXlzRW1iZWQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9BbHdheXNFbWJlZDo6Q1hGQV9BbHdheXNFbWJlZChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlViwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6QWx3YXlzRW1iZWQsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9BbHdheXNFbWJlZDo6fkNYRkFfQWx3YXlzRW1iZWQoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWx3YXlzZW1iZWQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Fsd2F5c2VtYmVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc4MDk3NgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Fsd2F5c2VtYmVkLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0FMV0FZU0VNQkVEX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0FMV0FZU0VNQkVEX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfQWx3YXlzRW1iZWQgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfQWx3YXlzRW1iZWQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9BbHdheXNFbWJlZCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9BTFdBWVNFTUJFRF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYW1kLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2FtZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4MDMwNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2FtZC5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYW1kLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJhbWQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9BbWQ6OkNYRkFfQW1kKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpBbWQsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9BbWQ6On5DWEZBX0FtZCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hbWQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2FtZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MWM2Y2EKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hbWQuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQU1EX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0FNRF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0FtZCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9BbWQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9BbWQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQU1EX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hcHBlYXJhbmNlZmlsdGVyLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2FwcGVhcmFuY2VmaWx0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliM2U5ZmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hcHBlYXJhbmNlZmlsdGVyLmNwcApAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hcHBlYXJhbmNlZmlsdGVyLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpUeXBlLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpPcHRpb25hbH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImFwcGVhcmFuY2VGaWx0ZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9BcHBlYXJhbmNlRmlsdGVyOjpDWEZBX0FwcGVhcmFuY2VGaWx0ZXIoQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlQywKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6QXBwZWFyYW5jZUZpbHRlciwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0FwcGVhcmFuY2VGaWx0ZXI6On5DWEZBX0FwcGVhcmFuY2VGaWx0ZXIoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXBwZWFyYW5jZWZpbHRlci5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXBwZWFyYW5jZWZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MTIzMmUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hcHBlYXJhbmNlZmlsdGVyLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0FQUEVBUkFOQ0VGSUxURVJfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQVBQRUFSQU5DRUZJTFRFUl9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0FwcGVhcmFuY2VGaWx0ZXIgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfQXBwZWFyYW5jZUZpbHRlcihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0FwcGVhcmFuY2VGaWx0ZXIoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQVBQRUFSQU5DRUZJTFRFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXJjLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2FyYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZiODlhNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2FyYy5jcHAKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXJjLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfYXJjLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpFZGdlLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OkZpbGwsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlN0YXJ0QW5nbGUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlN3ZWVwQW5nbGUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMzYwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6Q2lyY3VsYXIsIFhGQV9BdHRyaWJ1dGVUeXBlOjpCb29sZWFuLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkhhbmQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OkV2ZW59LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJhcmMiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9BcmM6OkNYRkFfQXJjKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Cb3goZG9jLAorICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6QXJjLAorICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0FyYz4odGhpcykpIHt9CisKK0NYRkFfQXJjOjp+Q1hGQV9BcmMoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXJjLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hcmMuaAppbmRleCBlNzEyZDgwLi5mZDkwM2FhIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hcmMuaAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hcmMuaApAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCkBAIC05LDExICs5LDEwIEBACiAKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib3guaCIKIAotY2xhc3MgQ1hGQV9Ob2RlOwotCiBjbGFzcyBDWEZBX0FyYyA6IHB1YmxpYyBDWEZBX0JveCB7CiAgcHVibGljOgotICBleHBsaWNpdCBDWEZBX0FyYyhDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfQm94KHBOb2RlKSB7fQorICBDWEZBX0FyYyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0FyYygpIG92ZXJyaWRlOwogfTsKIAogI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9BUkNfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2FyZWEuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXJlYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkOGFhNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2FyZWEuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2FyZWEuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9hcmVhLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpEZXNjLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6WCwgWEZBX0F0dHJpYnV0ZVR5cGU6Ok1lYXN1cmUsICh2b2lkKilMIjBpbiJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpZLCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxldmVsLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpSZWxldmFudCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6Q29sU3BhbiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikxfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiYXJlYSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0FyZWE6OkNYRkFfQXJlYShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZSgKKyAgICAgICAgICBkb2MsCisgICAgICAgICAgcGFja2V0LAorICAgICAgICAgIChYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250YWluZXJOb2RlLAorICAgICAgICAgIFhGQV9FbGVtZW50OjpBcmVhLAorICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAga05hbWUsCisgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9BcmVhPih0aGlzKSkge30KKworQ1hGQV9BcmVhOjp+Q1hGQV9BcmVhKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2FyZWEuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2FyZWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTY4ZTczCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXJlYS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9BUkVBX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0FSRUFfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9BcmVhIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0FyZWEoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9BcmVhKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0FSRUFfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2FycmF5bm9kZWxpc3QuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXJyYXlub2RlbGlzdC5jcHAKaW5kZXggOGM5MDQwYS4uOWVhZjlhNiAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXJyYXlub2RlbGlzdC5jcHAKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXJyYXlub2RlbGlzdC5jcHAKQEAgLTQsNTggKzQsNTAgQEAKIAogLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KIAotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfb2JqZWN0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXJyYXlub2RlbGlzdC5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgogCiBDWEZBX0FycmF5Tm9kZUxpc3Q6OkNYRkFfQXJyYXlOb2RlTGlzdChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpCi0gICAgOiBDWEZBX05vZGVMaXN0KHBEb2N1bWVudCkge30KKyAgICA6IENYRkFfVHJlZUxpc3QocERvY3VtZW50KSB7fQogCiBDWEZBX0FycmF5Tm9kZUxpc3Q6On5DWEZBX0FycmF5Tm9kZUxpc3QoKSB7fQogCi12b2lkIENYRkFfQXJyYXlOb2RlTGlzdDo6U2V0QXJyYXlOb2RlTGlzdChjb25zdCBDWEZBX05vZGVBcnJheSYgc3JjQXJyYXkpIHsKLSAgaWYgKHNyY0FycmF5LkdldFNpemUoKSA+IDApIHsKLSAgICBtX2FycmF5LkNvcHkoc3JjQXJyYXkpOwotICB9Cit2b2lkIENYRkFfQXJyYXlOb2RlTGlzdDo6U2V0QXJyYXlOb2RlTGlzdCgKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPiYgc3JjQXJyYXkpIHsKKyAgaWYgKCFzcmNBcnJheS5lbXB0eSgpKQorICAgIG1fYXJyYXkgPSBzcmNBcnJheTsKIH0KIAotaW50MzJfdCBDWEZBX0FycmF5Tm9kZUxpc3Q6OkdldExlbmd0aCgpIHsKLSAgcmV0dXJuIG1fYXJyYXkuR2V0U2l6ZSgpOworc2l6ZV90IENYRkFfQXJyYXlOb2RlTGlzdDo6R2V0TGVuZ3RoKCkgeworICByZXR1cm4gbV9hcnJheS5zaXplKCk7CiB9CiAKIGJvb2wgQ1hGQV9BcnJheU5vZGVMaXN0OjpBcHBlbmQoQ1hGQV9Ob2RlKiBwTm9kZSkgewotICBtX2FycmF5LkFkZChwTm9kZSk7CisgIG1fYXJyYXkucHVzaF9iYWNrKHBOb2RlKTsKICAgcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgQ1hGQV9BcnJheU5vZGVMaXN0OjpJbnNlcnQoQ1hGQV9Ob2RlKiBwTmV3Tm9kZSwgQ1hGQV9Ob2RlKiBwQmVmb3JlTm9kZSkgewogICBpZiAoIXBCZWZvcmVOb2RlKSB7Ci0gICAgbV9hcnJheS5BZGQocE5ld05vZGUpOworICAgIG1fYXJyYXkucHVzaF9iYWNrKHBOZXdOb2RlKTsKICAgfSBlbHNlIHsKLSAgICBpbnQzMl90IGlTaXplID0gbV9hcnJheS5HZXRTaXplKCk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7ICsraSkgewotICAgICAgaWYgKG1fYXJyYXlbaV0gPT0gcEJlZm9yZU5vZGUpIHsKLSAgICAgICAgbV9hcnJheS5JbnNlcnRBdChpLCBwTmV3Tm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KKyAgICBhdXRvIGl0ID0gc3RkOjpmaW5kKG1fYXJyYXkuYmVnaW4oKSwgbV9hcnJheS5lbmQoKSwgcEJlZm9yZU5vZGUpOworICAgIGlmIChpdCAhPSBtX2FycmF5LmVuZCgpKQorICAgICAgbV9hcnJheS5pbnNlcnQoaXQsIHBOZXdOb2RlKTsKICAgfQogICByZXR1cm4gdHJ1ZTsKIH0KIAogYm9vbCBDWEZBX0FycmF5Tm9kZUxpc3Q6OlJlbW92ZShDWEZBX05vZGUqIHBOb2RlKSB7Ci0gIGludDMyX3QgaVNpemUgPSBtX2FycmF5LkdldFNpemUoKTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7ICsraSkgewotICAgIGlmIChtX2FycmF5W2ldID09IHBOb2RlKSB7Ci0gICAgICBtX2FycmF5LlJlbW92ZUF0KGkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9CisgIGF1dG8gaXQgPSBzdGQ6OmZpbmQobV9hcnJheS5iZWdpbigpLCBtX2FycmF5LmVuZCgpLCBwTm9kZSk7CisgIGlmIChpdCAhPSBtX2FycmF5LmVuZCgpKQorICAgIG1fYXJyYXkuZXJhc2UoaXQpOwogICByZXR1cm4gdHJ1ZTsKIH0KIAotQ1hGQV9Ob2RlKiBDWEZBX0FycmF5Tm9kZUxpc3Q6Okl0ZW0oaW50MzJfdCBpSW5kZXgpIHsKLSAgaW50MzJfdCBpU2l6ZSA9IG1fYXJyYXkuR2V0U2l6ZSgpOwotICBpZiAoaUluZGV4ID49IDAgJiYgaUluZGV4IDwgaVNpemUpIHsKLSAgICByZXR1cm4gbV9hcnJheVtpSW5kZXhdOwotICB9Ci0gIHJldHVybiBudWxscHRyOworQ1hGQV9Ob2RlKiBDWEZBX0FycmF5Tm9kZUxpc3Q6Okl0ZW0oc2l6ZV90IGluZGV4KSB7CisgIHJldHVybiBpbmRleCA8IG1fYXJyYXkuc2l6ZSgpID8gbV9hcnJheVtpbmRleF0gOiBudWxscHRyOwogfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXJyYXlub2RlbGlzdC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXJyYXlub2RlbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NmIyMDYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hcnJheW5vZGVsaXN0LmgKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0FSUkFZTk9ERUxJU1RfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQVJSQVlOT0RFTElTVF9IXworCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJlZWxpc3QuaCIKKworY2xhc3MgQ1hGQV9Eb2N1bWVudDsKK2NsYXNzIENYRkFfTm9kZTsKKworY2xhc3MgQ1hGQV9BcnJheU5vZGVMaXN0IDogcHVibGljIENYRkFfVHJlZUxpc3QgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1hGQV9BcnJheU5vZGVMaXN0KENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisgIH5DWEZBX0FycmF5Tm9kZUxpc3QoKSBvdmVycmlkZTsKKworICAvLyBGcm9tIENYRkFfVHJlZUxpc3QuCisgIHNpemVfdCBHZXRMZW5ndGgoKSBvdmVycmlkZTsKKyAgYm9vbCBBcHBlbmQoQ1hGQV9Ob2RlKiBwTm9kZSkgb3ZlcnJpZGU7CisgIGJvb2wgSW5zZXJ0KENYRkFfTm9kZSogcE5ld05vZGUsIENYRkFfTm9kZSogcEJlZm9yZU5vZGUpIG92ZXJyaWRlOworICBib29sIFJlbW92ZShDWEZBX05vZGUqIHBOb2RlKSBvdmVycmlkZTsKKyAgQ1hGQV9Ob2RlKiBJdGVtKHNpemVfdCBpSW5kZXgpIG92ZXJyaWRlOworCisgIHZvaWQgU2V0QXJyYXlOb2RlTGlzdChjb25zdCBzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPiYgc3JjQXJyYXkpOworCisgcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8Q1hGQV9Ob2RlKj4gbV9hcnJheTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQVJSQVlOT0RFTElTVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXNzaXN0LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Fzc2lzdC5jcHAKaW5kZXggODk0ZTcyOS4uNDI4NjIxMSAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXNzaXN0LmNwcAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hc3Npc3QuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKQEAgLTYsMTAgKzYsMzQgQEAKIAogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2Fzc2lzdC5oIgogCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfYXNzaXN0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogCi1DWEZBX0Fzc2lzdDo6Q1hGQV9Bc3Npc3QoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9CituYW1lc3BhY2UgewogCi1DWEZBX1Rvb2xUaXAgQ1hGQV9Bc3Npc3Q6OkdldFRvb2xUaXAoKSB7Ci0gIHJldHVybiBDWEZBX1Rvb2xUaXAobV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VsZW1lbnQ6OlRvb2xUaXApKTsKLX0KK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6OlRvb2xUaXAsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6U3BlYWssIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlJvbGUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImFzc2lzdCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0Fzc2lzdDo6Q1hGQV9Bc3Npc3QoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkFzc2lzdCwKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfQXNzaXN0Pih0aGlzKSkge30KKworQ1hGQV9Bc3Npc3Q6On5DWEZBX0Fzc2lzdCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hc3Npc3QuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Fzc2lzdC5oCmluZGV4IGM1ODNmZjUuLmQwZTkwMjAgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2Fzc2lzdC5oCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Fzc2lzdC5oCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKQEAgLTcsMTYgKzcsMTIgQEAKICNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQVNTSVNUX0hfCiAjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0FTU0lTVF9IXwogCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3Rvb2x0aXAuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCiAKLWNsYXNzIENYRkFfTm9kZTsKLQotY2xhc3MgQ1hGQV9Bc3Npc3QgOiBwdWJsaWMgQ1hGQV9EYXRhIHsKK2NsYXNzIENYRkFfQXNzaXN0IDogcHVibGljIENYRkFfTm9kZSB7CiAgcHVibGljOgotICBleHBsaWNpdCBDWEZBX0Fzc2lzdChDWEZBX05vZGUqIHBOb2RlKTsKLQotICBDWEZBX1Rvb2xUaXAgR2V0VG9vbFRpcCgpOworICBDWEZBX0Fzc2lzdChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0Fzc2lzdCgpIG92ZXJyaWRlOwogfTsKIAogI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9BU1NJU1RfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2F0dGFjaG5vZGVsaXN0LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2F0dGFjaG5vZGVsaXN0LmNwcAppbmRleCBjMjNiOTAwLi5mMWZiZmE3IDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hdHRhY2hub2RlbGlzdC5jcHAKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXR0YWNobm9kZWxpc3QuY3BwCkBAIC00LDQyICs0LDQ1IEBACiAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2F0dGFjaG5vZGVsaXN0LmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL251bWVyaWNzL3NhZmVfY29udmVyc2lvbnMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCiAKIENYRkFfQXR0YWNoTm9kZUxpc3Q6OkNYRkFfQXR0YWNoTm9kZUxpc3QoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBBdHRhY2hOb2RlKQotICAgIDogQ1hGQV9Ob2RlTGlzdChwRG9jdW1lbnQpIHsKKyAgICA6IENYRkFfVHJlZUxpc3QocERvY3VtZW50KSB7CiAgIG1fcEF0dGFjaE5vZGUgPSBwQXR0YWNoTm9kZTsKIH0KIAotaW50MzJfdCBDWEZBX0F0dGFjaE5vZGVMaXN0OjpHZXRMZW5ndGgoKSB7CitzaXplX3QgQ1hGQV9BdHRhY2hOb2RlTGlzdDo6R2V0TGVuZ3RoKCkgewogICByZXR1cm4gbV9wQXR0YWNoTm9kZS0+Q291bnRDaGlsZHJlbigKICAgICAgIFhGQV9FbGVtZW50OjpVbmtub3duLAogICAgICAgbV9wQXR0YWNoTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6U3ViZm9ybSk7CiB9CiAKIGJvb2wgQ1hGQV9BdHRhY2hOb2RlTGlzdDo6QXBwZW5kKENYRkFfTm9kZSogcE5vZGUpIHsKLSAgQ1hGQV9Ob2RlKiBwUGFyZW50ID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOwotICBpZiAocFBhcmVudCkgewotICAgIHBQYXJlbnQtPlJlbW92ZUNoaWxkKHBOb2RlKTsKLSAgfQotICByZXR1cm4gbV9wQXR0YWNoTm9kZS0+SW5zZXJ0Q2hpbGQocE5vZGUpOworICBDWEZBX05vZGUqIHBQYXJlbnQgPSBwTm9kZS0+R2V0UGFyZW50KCk7CisgIGlmIChwUGFyZW50KQorICAgIHBQYXJlbnQtPlJlbW92ZUNoaWxkKHBOb2RlLCB0cnVlKTsKKworICByZXR1cm4gbV9wQXR0YWNoTm9kZS0+SW5zZXJ0Q2hpbGQocE5vZGUsIG51bGxwdHIpOwogfQogCiBib29sIENYRkFfQXR0YWNoTm9kZUxpc3Q6Okluc2VydChDWEZBX05vZGUqIHBOZXdOb2RlLCBDWEZBX05vZGUqIHBCZWZvcmVOb2RlKSB7Ci0gIENYRkFfTm9kZSogcFBhcmVudCA9IHBOZXdOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsKLSAgaWYgKHBQYXJlbnQpIHsKLSAgICBwUGFyZW50LT5SZW1vdmVDaGlsZChwTmV3Tm9kZSk7Ci0gIH0KKyAgQ1hGQV9Ob2RlKiBwUGFyZW50ID0gcE5ld05vZGUtPkdldFBhcmVudCgpOworICBpZiAocFBhcmVudCkKKyAgICBwUGFyZW50LT5SZW1vdmVDaGlsZChwTmV3Tm9kZSwgdHJ1ZSk7CisKICAgcmV0dXJuIG1fcEF0dGFjaE5vZGUtPkluc2VydENoaWxkKHBOZXdOb2RlLCBwQmVmb3JlTm9kZSk7CiB9CiAKIGJvb2wgQ1hGQV9BdHRhY2hOb2RlTGlzdDo6UmVtb3ZlKENYRkFfTm9kZSogcE5vZGUpIHsKLSAgcmV0dXJuIG1fcEF0dGFjaE5vZGUtPlJlbW92ZUNoaWxkKHBOb2RlKTsKKyAgcmV0dXJuIG1fcEF0dGFjaE5vZGUtPlJlbW92ZUNoaWxkKHBOb2RlLCB0cnVlKTsKIH0KIAotQ1hGQV9Ob2RlKiBDWEZBX0F0dGFjaE5vZGVMaXN0OjpJdGVtKGludDMyX3QgaUluZGV4KSB7Ci0gIHJldHVybiBtX3BBdHRhY2hOb2RlLT5HZXRDaGlsZCgKLSAgICAgIGlJbmRleCwgWEZBX0VsZW1lbnQ6OlVua25vd24sCitDWEZBX05vZGUqIENYRkFfQXR0YWNoTm9kZUxpc3Q6Okl0ZW0oc2l6ZV90IGluZGV4KSB7CisgIHJldHVybiBtX3BBdHRhY2hOb2RlLT5HZXRDaGlsZDxDWEZBX05vZGU+KAorICAgICAgaW5kZXgsIFhGQV9FbGVtZW50OjpVbmtub3duLAogICAgICAgbV9wQXR0YWNoTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6U3ViZm9ybSk7CiB9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hdHRhY2hub2RlbGlzdC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXR0YWNobm9kZWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGRmMmJiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXR0YWNobm9kZWxpc3QuaApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQVRUQUNITk9ERUxJU1RfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQVRUQUNITk9ERUxJU1RfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RyZWVsaXN0LmgiCisKK2NsYXNzIENYRkFfRG9jdW1lbnQ7CitjbGFzcyBDWEZBX05vZGU7CisKK2NsYXNzIENYRkFfQXR0YWNoTm9kZUxpc3QgOiBwdWJsaWMgQ1hGQV9UcmVlTGlzdCB7CisgcHVibGljOgorICBDWEZBX0F0dGFjaE5vZGVMaXN0KENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1hGQV9Ob2RlKiBwQXR0YWNoTm9kZSk7CisKKyAgLy8gRnJvbSBDWEZBX1RyZWVMaXN0LgorICBzaXplX3QgR2V0TGVuZ3RoKCkgb3ZlcnJpZGU7CisgIGJvb2wgQXBwZW5kKENYRkFfTm9kZSogcE5vZGUpIG92ZXJyaWRlOworICBib29sIEluc2VydChDWEZBX05vZGUqIHBOZXdOb2RlLCBDWEZBX05vZGUqIHBCZWZvcmVOb2RlKSBvdmVycmlkZTsKKyAgYm9vbCBSZW1vdmUoQ1hGQV9Ob2RlKiBwTm9kZSkgb3ZlcnJpZGU7CisgIENYRkFfTm9kZSogSXRlbShzaXplX3QgaUluZGV4KSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgIENYRkFfTm9kZSogbV9wQXR0YWNoTm9kZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQVRUQUNITk9ERUxJU1RfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2F0dHJpYnV0ZXMuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXR0cmlidXRlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlNThiZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2F0dHJpYnV0ZXMuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2F0dHJpYnV0ZXMuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImF0dHJpYnV0ZXMiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9BdHRyaWJ1dGVzOjpDWEZBX0F0dHJpYnV0ZXMoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVYsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9BdHRyaWJ1dGVzOjp+Q1hGQV9BdHRyaWJ1dGVzKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2F0dHJpYnV0ZXMuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2F0dHJpYnV0ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDczZGE4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXR0cmlidXRlcy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9BVFRSSUJVVEVTX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0FUVFJJQlVURVNfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9BdHRyaWJ1dGVzIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0F0dHJpYnV0ZXMoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9BdHRyaWJ1dGVzKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0FUVFJJQlVURVNfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2F1dG9zYXZlLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2F1dG9zYXZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzdjMjUyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXV0b3NhdmUuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2F1dG9zYXZlLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJhdXRvU2F2ZSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0F1dG9TYXZlOjpDWEZBX0F1dG9TYXZlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpBdXRvU2F2ZSwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0F1dG9TYXZlOjp+Q1hGQV9BdXRvU2F2ZSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9hdXRvc2F2ZS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXV0b3NhdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNThjY2YxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXV0b3NhdmUuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQVVUT1NBVkVfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQVVUT1NBVkVfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9BdXRvU2F2ZSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9BdXRvU2F2ZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0F1dG9TYXZlKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0FVVE9TQVZFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9iYXJjb2RlLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2JhcmNvZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OTIyOTEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9iYXJjb2RlLmNwcApAQCAtMCwwICsxLDU3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9iYXJjb2RlLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfYmFyY29kZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpEYXRhUm93Q291bnQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGF0YVByZXAsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06Ok5vbmV9LAorICAgIHtYRkFfQXR0cmlidXRlOjpUeXBlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsICh2b2lkKiludWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VGV4dExvY2F0aW9uLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpCZWxvd30sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok1vZHVsZVdpZHRoLCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMC4yNW1tIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlByaW50Q2hlY2tEaWdpdCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkJvb2xlYW4sICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TW9kdWxlSGVpZ2h0LCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiNW1tIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlN0YXJ0Q2hhciwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VHJ1bmNhdGUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpCb29sZWFuLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OldpZGVOYXJyb3dSYXRpbywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCAodm9pZCopTCIzOjEifSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RXJyb3JDb3JyZWN0aW9uTGV2ZWwsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVwc01vZGUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OlVzQ2Fycmllcn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkNoZWNrc3VtLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpOb25lfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6Q2hhckVuY29kaW5nLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsICh2b2lkKilMIlVURi04In0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkRhdGFDb2x1bW5Db3VudCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6Um93Q29sdW1uUmF0aW8sIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkRhdGFMZW5ndGgsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkVuZENoYXIsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImJhcmNvZGUiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9CYXJjb2RlOjpDWEZBX0JhcmNvZGUoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkJhcmNvZGUsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0JhcmNvZGU+KHRoaXMpKSB7fQorCitDWEZBX0JhcmNvZGU6On5DWEZBX0JhcmNvZGUoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmFyY29kZS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmFyY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OTg4OWIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9iYXJjb2RlLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0JBUkNPREVfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQkFSQ09ERV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0JhcmNvZGUgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfQmFyY29kZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0JhcmNvZGUoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQkFSQ09ERV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmFzZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9iYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODJhNzlhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmFzZS5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmFzZS5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiYmFzZSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0Jhc2U6OkNYRkFfQmFzZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6QmFzZSwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0Jhc2U6On5DWEZBX0Jhc2UoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmFzZS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NzQzNDMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9iYXNlLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0JBU0VfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQkFTRV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0Jhc2UgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfQmFzZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0Jhc2UoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQkFTRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmF0Y2hvdXRwdXQuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmF0Y2hvdXRwdXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NzhkNmEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9iYXRjaG91dHB1dC5jcHAKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmF0Y2hvdXRwdXQuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkZvcm1hdCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6Tm9uZX0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImJhdGNoT3V0cHV0IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfQmF0Y2hPdXRwdXQ6OkNYRkFfQmF0Y2hPdXRwdXQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6QmF0Y2hPdXRwdXQsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9CYXRjaE91dHB1dDo6fkNYRkFfQmF0Y2hPdXRwdXQoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmF0Y2hvdXRwdXQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2JhdGNob3V0cHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZhYTZjZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2JhdGNob3V0cHV0LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0JBVENIT1VUUFVUX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0JBVENIT1VUUFVUX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfQmF0Y2hPdXRwdXQgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfQmF0Y2hPdXRwdXQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9CYXRjaE91dHB1dCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9CQVRDSE9VVFBVVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmVoYXZpb3JvdmVycmlkZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9iZWhhdmlvcm92ZXJyaWRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGRmOGYxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmVoYXZpb3JvdmVycmlkZS5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmVoYXZpb3JvdmVycmlkZS5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiYmVoYXZpb3JPdmVycmlkZSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0JlaGF2aW9yT3ZlcnJpZGU6OkNYRkFfQmVoYXZpb3JPdmVycmlkZShDWEZBX0RvY3VtZW50KiBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkJlaGF2aW9yT3ZlcnJpZGUsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9CZWhhdmlvck92ZXJyaWRlOjp+Q1hGQV9CZWhhdmlvck92ZXJyaWRlKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2JlaGF2aW9yb3ZlcnJpZGUuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2JlaGF2aW9yb3ZlcnJpZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjA4MjExCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmVoYXZpb3JvdmVycmlkZS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9CRUhBVklPUk9WRVJSSURFX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0JFSEFWSU9ST1ZFUlJJREVfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9CZWhhdmlvck92ZXJyaWRlIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0JlaGF2aW9yT3ZlcnJpZGUoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9CZWhhdmlvck92ZXJyaWRlKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0JFSEFWSU9ST1ZFUlJJREVfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2JpbmQuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmluZC5jcHAKaW5kZXggMTZlZmQxZi4uZDM1YTJjZCAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmluZC5jcHAKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmluZC5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIApAQCAtNiwxMSArNiw0OCBAQAogCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmluZC5oIgogCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfYmluZC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9vYmplY3QuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGljdHVyZS5oIgogCi1DWEZBX0JpbmQ6OkNYRkFfQmluZChDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30KK25hbWVzcGFjZSB7CiAKLXZvaWQgQ1hGQV9CaW5kOjpHZXRQaWN0dXJlKENGWF9XaWRlU3RyaW5nJiB3c1BpY3R1cmUpIHsKLSAgaWYgKENYRkFfTm9kZSogcFBpY3R1cmUgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6UGljdHVyZSkpCi0gICAgcFBpY3R1cmUtPlRyeUNvbnRlbnQod3NQaWN0dXJlKTsKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6OlBpY3R1cmUsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpSZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6Q29udGVudFR5cGUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlRyYW5zZmVyRW5jb2RpbmcsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06Ok5vbmV9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpNYXRjaCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6T25jZX0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImJpbmQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9CaW5kOjpDWEZBX0JpbmQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwKKyAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6QmluZCwKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfQmluZD4odGhpcykpIHt9CisKK0NYRkFfQmluZDo6fkNYRkFfQmluZCgpIHt9CisKK1dpZGVTdHJpbmcgQ1hGQV9CaW5kOjpHZXRQaWN0dXJlKCkgeworICBDWEZBX1BpY3R1cmUqIHBQaWN0dXJlID0KKyAgICAgIEdldENoaWxkPENYRkFfUGljdHVyZT4oMCwgWEZBX0VsZW1lbnQ6OlBpY3R1cmUsIGZhbHNlKTsKKyAgcmV0dXJuIHBQaWN0dXJlID8gcFBpY3R1cmUtPkpTT2JqZWN0KCktPkdldENvbnRlbnQoZmFsc2UpIDogTCIiOwogfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmluZC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmluZC5oCmluZGV4IDQwYTJhMWEuLjE5MjRjYjYgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2JpbmQuaAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9iaW5kLmgKQEAgLTEsNCArMSw0IEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIApAQCAtNywxNiArNywxNCBAQAogI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9CSU5EX0hfCiAjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0JJTkRfSF8KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKIAotY2xhc3MgQ1hGQV9Ob2RlOwotCi1jbGFzcyBDWEZBX0JpbmQgOiBwdWJsaWMgQ1hGQV9EYXRhIHsKK2NsYXNzIENYRkFfQmluZCA6IHB1YmxpYyBDWEZBX05vZGUgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9CaW5kKENYRkFfTm9kZSogcE5vZGUpOworICBDWEZBX0JpbmQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9CaW5kKCkgb3ZlcnJpZGU7CiAKLSAgdm9pZCBHZXRQaWN0dXJlKENGWF9XaWRlU3RyaW5nJiB3c1BpY3R1cmUpOworICBXaWRlU3RyaW5nIEdldFBpY3R1cmUoKTsKIH07CiAKICNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQklORF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmluZGl0ZW1zLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2JpbmRpdGVtcy5jcHAKaW5kZXggZmRiNGYwYy4uZDdkNzJhNyAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmluZGl0ZW1zLmNwcAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9iaW5kaXRlbXMuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKQEAgLTYsMjIgKzYsNDMgQEAKIAogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2JpbmRpdGVtcy5oIgogCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfYmluZGl0ZW1zLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogCi1DWEZBX0JpbmRJdGVtczo6Q1hGQV9CaW5kSXRlbXMoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9CituYW1lc3BhY2UgewogCi12b2lkIENYRkFfQmluZEl0ZW1zOjpHZXRMYWJlbFJlZihDRlhfV2lkZVN0cmluZ0MmIHdzTGFiZWxSZWYpIHsKLSAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9MYWJlbFJlZiwgd3NMYWJlbFJlZik7Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6UmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpDb25uZWN0aW9uLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMYWJlbFJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VmFsdWVSZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImJpbmRJdGVtcyI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0JpbmRJdGVtczo6Q1hGQV9CaW5kSXRlbXMoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkJpbmRJdGVtcywKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfQmluZEl0ZW1zPih0aGlzKSkge30KKworQ1hGQV9CaW5kSXRlbXM6On5DWEZBX0JpbmRJdGVtcygpIHt9CisKK1dpZGVTdHJpbmcgQ1hGQV9CaW5kSXRlbXM6OkdldExhYmVsUmVmKCkgeworICByZXR1cm4gSlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6TGFiZWxSZWYpOwogfQogCi12b2lkIENYRkFfQmluZEl0ZW1zOjpHZXRWYWx1ZVJlZihDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWVSZWYpIHsKLSAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZVJlZiwgd3NWYWx1ZVJlZik7CitXaWRlU3RyaW5nIENYRkFfQmluZEl0ZW1zOjpHZXRWYWx1ZVJlZigpIHsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6OlZhbHVlUmVmKTsKIH0KIAotdm9pZCBDWEZBX0JpbmRJdGVtczo6R2V0UmVmKENGWF9XaWRlU3RyaW5nQyYgd3NSZWYpIHsKLSAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9SZWYsIHdzUmVmKTsKLX0KLQotYm9vbCBDWEZBX0JpbmRJdGVtczo6U2V0Q29ubmVjdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb25uZWN0aW9uKSB7Ci0gIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0Nvbm5lY3Rpb24sIHdzQ29ubmVjdGlvbik7CitXaWRlU3RyaW5nIENYRkFfQmluZEl0ZW1zOjpHZXRSZWYoKSB7CisgIHJldHVybiBKU09iamVjdCgpLT5HZXRDRGF0YShYRkFfQXR0cmlidXRlOjpSZWYpOwogfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmluZGl0ZW1zLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9iaW5kaXRlbXMuaAppbmRleCAxOTE5NDFhLi5mMWE0OTBkIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9iaW5kaXRlbXMuaAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9iaW5kaXRlbXMuaApAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCkBAIC03LDE5ICs3LDE2IEBACiAjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0JJTkRJVEVNU19IXwogI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9CSU5ESVRFTVNfSF8KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKIAotY2xhc3MgQ1hGQV9Ob2RlOwotCi1jbGFzcyBDWEZBX0JpbmRJdGVtcyA6IHB1YmxpYyBDWEZBX0RhdGEgeworY2xhc3MgQ1hGQV9CaW5kSXRlbXMgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfQmluZEl0ZW1zKENYRkFfTm9kZSogcE5vZGUpOworICBDWEZBX0JpbmRJdGVtcyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0JpbmRJdGVtcygpIG92ZXJyaWRlOwogCi0gIHZvaWQgR2V0TGFiZWxSZWYoQ0ZYX1dpZGVTdHJpbmdDJiB3c0xhYmVsUmVmKTsKLSAgdm9pZCBHZXRWYWx1ZVJlZihDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWVSZWYpOwotICB2b2lkIEdldFJlZihDRlhfV2lkZVN0cmluZ0MmIHdzUmVmKTsKLSAgYm9vbCBTZXRDb25uZWN0aW9uKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Nvbm5lY3Rpb24pOworICBXaWRlU3RyaW5nIEdldExhYmVsUmVmKCk7CisgIFdpZGVTdHJpbmcgR2V0VmFsdWVSZWYoKTsKKyAgV2lkZVN0cmluZyBHZXRSZWYoKTsKIH07CiAKICNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQklORElURU1TX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib29rZW5kLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Jvb2tlbmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMTcyYmUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib29rZW5kLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib29rZW5kLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfYm9va2VuZC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlRyYWlsZXIsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxlYWRlciwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiYm9va2VuZCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0Jvb2tlbmQ6OkNYRkFfQm9va2VuZChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6Qm9va2VuZCwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfQm9va2VuZD4odGhpcykpIHt9CisKK0NYRkFfQm9va2VuZDo6fkNYRkFfQm9va2VuZCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib29rZW5kLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib29rZW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJlYjEzYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Jvb2tlbmQuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQk9PS0VORF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9CT09LRU5EX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfQm9va2VuZCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9Cb29rZW5kKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfQm9va2VuZCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9CT09LRU5EX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib29sZWFuLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Jvb2xlYW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MDQ5MTkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib29sZWFuLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib29sZWFuLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfYm9vbGVhbi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImJvb2xlYW4iOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9Cb29sZWFuOjpDWEZBX0Jvb2xlYW4oQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwKKyAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkJvb2xlYW4sCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0Jvb2xlYW4+KHRoaXMpKSB7fQorCitDWEZBX0Jvb2xlYW46On5DWEZBX0Jvb2xlYW4oKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYm9vbGVhbi5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYm9vbGVhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMjFlMzYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib29sZWFuLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0JPT0xFQU5fSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQk9PTEVBTl9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0Jvb2xlYW4gOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfQm9vbGVhbihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0Jvb2xlYW4oKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQk9PTEVBTl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYm9yZGVyLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2JvcmRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI4NzU2MgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2JvcmRlci5jcHAKQEAgLTAsMCArMSw0NiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYm9yZGVyLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfYm9yZGVyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7CisgICAge1hGQV9FbGVtZW50OjpNYXJnaW4sIDEsIDB9LCB7WEZBX0VsZW1lbnQ6OkVkZ2UsIDQsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6Q29ybmVyLCA0LCAwfSwge1hGQV9FbGVtZW50OjpGaWxsLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpCcmVhaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6Q2xvc2V9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlByZXNlbmNlLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpWaXNpYmxlfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6UmVsZXZhbnQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkhhbmQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OkV2ZW59LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJib3JkZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9Cb3JkZXI6OkNYRkFfQm9yZGVyKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9SZWN0YW5nbGUoZG9jLAorICAgICAgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6Qm9yZGVyLAorICAgICAgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0JvcmRlcj4odGhpcykpIHt9CisKK0NYRkFfQm9yZGVyOjp+Q1hGQV9Cb3JkZXIoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYm9yZGVyLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib3JkZXIuaAppbmRleCAyN2I0NjljLi4yNGYzYmI5IDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib3JkZXIuaAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib3JkZXIuaApAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCkBAIC03LDEzICs3LDEyIEBACiAjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0JPUkRFUl9IXwogI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9CT1JERVJfSF8KIAotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2JveC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3JlY3RhbmdsZS5oIgogCi1jbGFzcyBDWEZBX05vZGU7Ci0KLWNsYXNzIENYRkFfQm9yZGVyIDogcHVibGljIENYRkFfQm94IHsKK2NsYXNzIENYRkFfQm9yZGVyIDogcHVibGljIENYRkFfUmVjdGFuZ2xlIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfQm9yZGVyKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9Cb3gocE5vZGUpIHt9CisgIENYRkFfQm9yZGVyKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfQm9yZGVyKCkgb3ZlcnJpZGU7CiB9OwogCiAjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0JPUkRFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYm94LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2JveC5jcHAKaW5kZXggNTUyYzk4MC4uYjgxNDYxMiAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYm94LmNwcAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib3guY3BwCkBAIC02LDE1OSArNiwzNTIgQEAKIAogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2JveC5oIgogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfb2JqZWN0LmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29ybmVyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZWRnZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2ZpbGwuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tYXJnaW4uaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWFzdXJlbWVudC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfb2JqZWN0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3JlY3RhbmdsZS5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2VwYXRoLmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXBhdHRlcm4uaCIKKyNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jeGZhX2dlc2hhZGluZy5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ3JhcGhpY3MuaCIKIAogbmFtZXNwYWNlIHsKIAotdm9pZCBHZXRTdHJva2VzSW50ZXJuYWwoQ1hGQV9Ob2RlKiBwTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENYRkFfU3Ryb2tlPiogc3Ryb2tlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk51bGwpIHsKLSAgc3Ryb2tlcy0+Y2xlYXIoKTsKLSAgaWYgKCFwTm9kZSkKLSAgICByZXR1cm47Ci0KLSAgc3Ryb2tlcy0+cmVzaXplKDgpOwotICBpbnQzMl90IGksIGo7Ci0gIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgQ1hGQV9Db3JuZXIgY29ybmVyID0KLSAgICAgICAgQ1hGQV9Db3JuZXIocE5vZGUtPkdldFByb3BlcnR5KGksIFhGQV9FbGVtZW50OjpDb3JuZXIsIGkgPT0gMCkpOwotICAgIGlmIChjb3JuZXIgfHwgaSA9PSAwKSB7Ci0gICAgICAoKnN0cm9rZXMpW2pdID0gY29ybmVyOwotICAgIH0gZWxzZSBpZiAoIWJOdWxsKSB7Ci0gICAgICBpZiAoaSA9PSAxIHx8IGkgPT0gMikKLSAgICAgICAgKCpzdHJva2VzKVtqXSA9ICgqc3Ryb2tlcylbMF07Ci0gICAgICBlbHNlCi0gICAgICAgICgqc3Ryb2tlcylbal0gPSAoKnN0cm9rZXMpWzJdOwotICAgIH0KLSAgICBqKys7Ci0gICAgQ1hGQV9FZGdlIGVkZ2UgPQotICAgICAgICBDWEZBX0VkZ2UocE5vZGUtPkdldFByb3BlcnR5KGksIFhGQV9FbGVtZW50OjpFZGdlLCBpID09IDApKTsKLSAgICBpZiAoZWRnZSB8fCBpID09IDApIHsKLSAgICAgICgqc3Ryb2tlcylbal0gPSBlZGdlOwotICAgIH0gZWxzZSBpZiAoIWJOdWxsKSB7Ci0gICAgICBpZiAoaSA9PSAxIHx8IGkgPT0gMikKLSAgICAgICAgKCpzdHJva2VzKVtqXSA9ICgqc3Ryb2tlcylbMV07Ci0gICAgICBlbHNlCi0gICAgICAgICgqc3Ryb2tlcylbal0gPSAoKnN0cm9rZXMpWzNdOwotICAgIH0KLSAgICBqKys7Ci0gIH0KLX0KLQotc3RhdGljIGludDMyX3QgU3R5bGUzRChjb25zdCBzdGQ6OnZlY3RvcjxDWEZBX1N0cm9rZT4mIHN0cm9rZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIENYRkFfU3Ryb2tlJiBzdHJva2UpIHsKK3N0ZDo6cGFpcjxYRkFfQXR0cmlidXRlRW51bSwgQ1hGQV9TdHJva2UqPiBTdHlsZTNEKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPENYRkFfU3Ryb2tlKj4mIHN0cm9rZXMpIHsKICAgaWYgKHN0cm9rZXMuZW1wdHkoKSkKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4ge1hGQV9BdHRyaWJ1dGVFbnVtOjpVbmtub3duLCBudWxscHRyfTsKIAotICBzdHJva2UgPSBzdHJva2VzWzBdOworICBDWEZBX1N0cm9rZSogc3Ryb2tlID0gc3Ryb2tlc1swXTsKICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBzdHJva2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgQ1hGQV9TdHJva2UgZmluZCA9IHN0cm9rZXNbaV07CisgICAgQ1hGQV9TdHJva2UqIGZpbmQgPSBzdHJva2VzW2ldOwogICAgIGlmICghZmluZCkKICAgICAgIGNvbnRpbnVlOwotCiAgICAgaWYgKCFzdHJva2UpCiAgICAgICBzdHJva2UgPSBmaW5kOwotICAgIGVsc2UgaWYgKHN0cm9rZS5HZXRTdHJva2VUeXBlKCkgIT0gZmluZC5HZXRTdHJva2VUeXBlKCkpCisgICAgZWxzZSBpZiAoc3Ryb2tlLT5HZXRTdHJva2VUeXBlKCkgIT0gZmluZC0+R2V0U3Ryb2tlVHlwZSgpKQogICAgICAgc3Ryb2tlID0gZmluZDsKICAgICBicmVhazsKICAgfQotICBpbnQzMl90IGlUeXBlID0gc3Ryb2tlLkdldFN0cm9rZVR5cGUoKTsKLSAgaWYgKGlUeXBlID09IFhGQV9BVFRSSUJVVEVFTlVNX0xvd2VyZWQgfHwgaVR5cGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmFpc2VkIHx8Ci0gICAgICBpVHlwZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9FdGNoZWQgfHwKLSAgICAgIGlUeXBlID09IFhGQV9BVFRSSUJVVEVFTlVNX0VtYm9zc2VkKSB7Ci0gICAgcmV0dXJuIGlUeXBlOworCisgIFhGQV9BdHRyaWJ1dGVFbnVtIGlUeXBlID0gc3Ryb2tlLT5HZXRTdHJva2VUeXBlKCk7CisgIGlmIChpVHlwZSA9PSBYRkFfQXR0cmlidXRlRW51bTo6TG93ZXJlZCB8fAorICAgICAgaVR5cGUgPT0gWEZBX0F0dHJpYnV0ZUVudW06OlJhaXNlZCB8fAorICAgICAgaVR5cGUgPT0gWEZBX0F0dHJpYnV0ZUVudW06OkV0Y2hlZCB8fAorICAgICAgaVR5cGUgPT0gWEZBX0F0dHJpYnV0ZUVudW06OkVtYm9zc2VkKSB7CisgICAgcmV0dXJuIHtpVHlwZSwgc3Ryb2tlfTsKICAgfQotICByZXR1cm4gMDsKKyAgcmV0dXJuIHtYRkFfQXR0cmlidXRlRW51bTo6VW5rbm93biwgc3Ryb2tlfTsKK30KKworQ1hGQV9SZWN0YW5nbGUqIFRvUmVjdGFuZ2xlKENYRkFfQm94KiBib3gpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfUmVjdGFuZ2xlKj4oYm94KTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCiAKLWludDMyX3QgQ1hGQV9Cb3g6OkdldEhhbmQoKSBjb25zdCB7Ci0gIGlmICghbV9wTm9kZSkKLSAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fRXZlbjsKLSAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9IYW5kKTsKK0NYRkFfQm94OjpDWEZBX0JveChDWEZBX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIGVQYWNrZXQsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsaWRQYWNrZXRzLAorICAgICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlIG9UeXBlLAorICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50IGVUeXBlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb3BlcnR5RGF0YSogcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVEYXRhKiBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBlbGVtZW50TmFtZSwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pYX09iamVjdD4ganNfbm9kZSkKKyAgICA6IENYRkFfTm9kZShwRG9jLAorICAgICAgICAgICAgICAgIGVQYWNrZXQsCisgICAgICAgICAgICAgICAgdmFsaWRQYWNrZXRzLAorICAgICAgICAgICAgICAgIG9UeXBlLAorICAgICAgICAgICAgICAgIGVUeXBlLAorICAgICAgICAgICAgICAgIHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoanNfbm9kZSkpIHt9CisKK0NYRkFfQm94Ojp+Q1hGQV9Cb3goKSA9IGRlZmF1bHQ7CisKK1hGQV9BdHRyaWJ1dGVFbnVtIENYRkFfQm94OjpHZXRIYW5kKCkgeworICByZXR1cm4gSlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpIYW5kKTsKIH0KIAotaW50MzJfdCBDWEZBX0JveDo6R2V0UHJlc2VuY2UoKSBjb25zdCB7Ci0gIGlmICghbV9wTm9kZSkKLSAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fSGlkZGVuOwotICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlKTsKK1hGQV9BdHRyaWJ1dGVFbnVtIENYRkFfQm94OjpHZXRQcmVzZW5jZSgpIHsKKyAgcmV0dXJuIEpTT2JqZWN0KCkKKyAgICAgIC0+VHJ5RW51bShYRkFfQXR0cmlidXRlOjpQcmVzZW5jZSwgdHJ1ZSkKKyAgICAgIC52YWx1ZV9vcihYRkFfQXR0cmlidXRlRW51bTo6VmlzaWJsZSk7CiB9CiAKLWludDMyX3QgQ1hGQV9Cb3g6OkNvdW50RWRnZXMoKSBjb25zdCB7Ci0gIGlmICghbV9wTm9kZSkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIG1fcE5vZGUtPkNvdW50Q2hpbGRyZW4oWEZBX0VsZW1lbnQ6OkVkZ2UpOworaW50MzJfdCBDWEZBX0JveDo6Q291bnRFZGdlcygpIHsKKyAgcmV0dXJuIENvdW50Q2hpbGRyZW4oWEZBX0VsZW1lbnQ6OkVkZ2UsIGZhbHNlKTsKIH0KIAotQ1hGQV9FZGdlIENYRkFfQm94OjpHZXRFZGdlKGludDMyX3QgbkluZGV4KSBjb25zdCB7Ci0gIHJldHVybiBDWEZBX0VkZ2UoCi0gICAgICBtX3BOb2RlID8gbV9wTm9kZS0+R2V0UHJvcGVydHkobkluZGV4LCBYRkFfRWxlbWVudDo6RWRnZSwgbkluZGV4ID09IDApCi0gICAgICAgICAgICAgIDogbnVsbHB0cik7CitDWEZBX0VkZ2UqIENYRkFfQm94OjpHZXRFZGdlSWZFeGlzdHMoaW50MzJfdCBuSW5kZXgpIHsKKyAgaWYgKG5JbmRleCA9PSAwKQorICAgIHJldHVybiBKU09iamVjdCgpLT5HZXRPckNyZWF0ZVByb3BlcnR5PENYRkFfRWRnZT4obkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkVkZ2UpOworICByZXR1cm4gSlNPYmplY3QoKS0+R2V0UHJvcGVydHk8Q1hGQV9FZGdlPihuSW5kZXgsIFhGQV9FbGVtZW50OjpFZGdlKTsKIH0KIAotdm9pZCBDWEZBX0JveDo6R2V0U3Ryb2tlcyhzdGQ6OnZlY3RvcjxDWEZBX1N0cm9rZT4qIHN0cm9rZXMpIGNvbnN0IHsKLSAgR2V0U3Ryb2tlc0ludGVybmFsKG1fcE5vZGUsIHN0cm9rZXMsIGZhbHNlKTsKK3N0ZDo6dmVjdG9yPENYRkFfU3Ryb2tlKj4gQ1hGQV9Cb3g6OkdldFN0cm9rZXMoKSB7CisgIHJldHVybiBHZXRTdHJva2VzSW50ZXJuYWwoZmFsc2UpOwogfQogCi1ib29sIENYRkFfQm94OjpJc0NpcmN1bGFyKCkgY29uc3QgewotICBpZiAoIW1fcE5vZGUpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gbV9wTm9kZS0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX0NpcmN1bGFyKTsKK2Jvb2wgQ1hGQV9Cb3g6OklzQ2lyY3VsYXIoKSB7CisgIHJldHVybiBKU09iamVjdCgpLT5HZXRCb29sZWFuKFhGQV9BdHRyaWJ1dGU6OkNpcmN1bGFyKTsKIH0KIAotYm9vbCBDWEZBX0JveDo6R2V0U3RhcnRBbmdsZShGWF9GTE9BVCYgZlN0YXJ0QW5nbGUpIGNvbnN0IHsKLSAgZlN0YXJ0QW5nbGUgPSAwOwotICBpZiAoIW1fcE5vZGUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENYRkFfTWVhc3VyZW1lbnQgbXM7Ci0gIGJvb2wgYlJldCA9IG1fcE5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9TdGFydEFuZ2xlLCBtcywgZmFsc2UpOwotICBpZiAoYlJldCkKLSAgICBmU3RhcnRBbmdsZSA9IG1zLkdldFZhbHVlKCk7Ci0KLSAgcmV0dXJuIGJSZXQ7CitPcHRpb25hbDxpbnQzMl90PiBDWEZBX0JveDo6R2V0U3RhcnRBbmdsZSgpIHsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPlRyeUludGVnZXIoWEZBX0F0dHJpYnV0ZTo6U3RhcnRBbmdsZSwgZmFsc2UpOwogfQogCi1ib29sIENYRkFfQm94OjpHZXRTd2VlcEFuZ2xlKEZYX0ZMT0FUJiBmU3dlZXBBbmdsZSkgY29uc3QgewotICBmU3dlZXBBbmdsZSA9IDM2MDsKLSAgaWYgKCFtX3BOb2RlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDWEZBX01lYXN1cmVtZW50IG1zOwotICBib29sIGJSZXQgPSBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU3dlZXBBbmdsZSwgbXMsIGZhbHNlKTsKLSAgaWYgKGJSZXQpCi0gICAgZlN3ZWVwQW5nbGUgPSBtcy5HZXRWYWx1ZSgpOwotCi0gIHJldHVybiBiUmV0OworT3B0aW9uYWw8aW50MzJfdD4gQ1hGQV9Cb3g6OkdldFN3ZWVwQW5nbGUoKSB7CisgIHJldHVybiBKU09iamVjdCgpLT5UcnlJbnRlZ2VyKFhGQV9BdHRyaWJ1dGU6OlN3ZWVwQW5nbGUsIGZhbHNlKTsKIH0KIAotQ1hGQV9GaWxsIENYRkFfQm94OjpHZXRGaWxsKGJvb2wgYk1vZGlmaWVkKSBjb25zdCB7Ci0gIGlmICghbV9wTm9kZSkKLSAgICByZXR1cm4gQ1hGQV9GaWxsKG51bGxwdHIpOwotCi0gIENYRkFfTm9kZSogcEZpbGxOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VsZW1lbnQ6OkZpbGwsIGJNb2RpZmllZCk7Ci0gIHJldHVybiBDWEZBX0ZpbGwocEZpbGxOb2RlKTsKK0NYRkFfRmlsbCogQ1hGQV9Cb3g6OkdldE9yQ3JlYXRlRmlsbElmUG9zc2libGUoKSB7CisgIHJldHVybiBKU09iamVjdCgpLT5HZXRPckNyZWF0ZVByb3BlcnR5PENYRkFfRmlsbD4oMCwgWEZBX0VsZW1lbnQ6OkZpbGwpOwogfQogCi1DWEZBX01hcmdpbiBDWEZBX0JveDo6R2V0TWFyZ2luKCkgY29uc3QgewotICByZXR1cm4gQ1hGQV9NYXJnaW4obV9wTm9kZSA/IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpNYXJnaW4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cik7CitzdGQ6OnR1cGxlPFhGQV9BdHRyaWJ1dGVFbnVtLCBib29sLCBmbG9hdD4gQ1hGQV9Cb3g6OkdldDNEU3R5bGUoKSB7CisgIGlmIChHZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpBcmMpCisgICAgcmV0dXJuIHtYRkFfQXR0cmlidXRlRW51bTo6VW5rbm93biwgZmFsc2UsIDAuMGZ9OworCisgIHN0ZDo6dmVjdG9yPENYRkFfU3Ryb2tlKj4gc3Ryb2tlcyA9IEdldFN0cm9rZXNJbnRlcm5hbCh0cnVlKTsKKyAgQ1hGQV9TdHJva2UqIHN0cm9rZTsKKyAgWEZBX0F0dHJpYnV0ZUVudW0gaVR5cGU7CisKKyAgc3RkOjp0aWUoaVR5cGUsIHN0cm9rZSkgPSBTdHlsZTNEKHN0cm9rZXMpOworICBpZiAoaVR5cGUgPT0gWEZBX0F0dHJpYnV0ZUVudW06OlVua25vd24pCisgICAgcmV0dXJuIHtYRkFfQXR0cmlidXRlRW51bTo6VW5rbm93biwgZmFsc2UsIDAuMGZ9OworCisgIHJldHVybiB7aVR5cGUsIHN0cm9rZS0+SXNWaXNpYmxlKCksIHN0cm9rZS0+R2V0VGhpY2tuZXNzKCl9OwogfQogCi1pbnQzMl90IENYRkFfQm94OjpHZXQzRFN0eWxlKGJvb2wmIGJWaXNpYmxlLCBGWF9GTE9BVCYgZlRoaWNrbmVzcykgY29uc3QgewotICBpZiAoSXNBcmMoKSkKLSAgICByZXR1cm4gMDsKK3N0ZDo6dmVjdG9yPENYRkFfU3Ryb2tlKj4gQ1hGQV9Cb3g6OkdldFN0cm9rZXNJbnRlcm5hbChib29sIGJOdWxsKSB7CisgIHN0ZDo6dmVjdG9yPENYRkFfU3Ryb2tlKj4gc3Ryb2tlczsKKyAgc3Ryb2tlcy5yZXNpemUoOCk7CiAKLSAgc3RkOjp2ZWN0b3I8Q1hGQV9TdHJva2U+IHN0cm9rZXM7Ci0gIEdldFN0cm9rZXNJbnRlcm5hbChtX3BOb2RlLCAmc3Ryb2tlcywgdHJ1ZSk7Ci0gIENYRkFfU3Ryb2tlIHN0cm9rZShudWxscHRyKTsKLSAgaW50MzJfdCBpVHlwZSA9IFN0eWxlM0Qoc3Ryb2tlcywgc3Ryb2tlKTsKLSAgaWYgKGlUeXBlKSB7Ci0gICAgYlZpc2libGUgPSBzdHJva2UuSXNWaXNpYmxlKCk7Ci0gICAgZlRoaWNrbmVzcyA9IHN0cm9rZS5HZXRUaGlja25lc3MoKTsKKyAgZm9yIChpbnQzMl90IGkgPSAwLCBqID0gMDsgaSA8IDQ7IGkrKykgeworICAgIENYRkFfQ29ybmVyKiBjb3JuZXI7CisgICAgaWYgKGkgPT0gMCkgeworICAgICAgY29ybmVyID0KKyAgICAgICAgICBKU09iamVjdCgpLT5HZXRPckNyZWF0ZVByb3BlcnR5PENYRkFfQ29ybmVyPihpLCBYRkFfRWxlbWVudDo6Q29ybmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgY29ybmVyID0gSlNPYmplY3QoKS0+R2V0UHJvcGVydHk8Q1hGQV9Db3JuZXI+KGksIFhGQV9FbGVtZW50OjpDb3JuZXIpOworICAgIH0KKworICAgIC8vIFRPRE8oZHNpbmNsYWlyKTogSWYgaSA9PSAwIGFuZCBHZXRPckNyZWF0ZVByb3BlcnR5IGZhaWxlZCwgd2UgY2FuIGVuZCB1cAorICAgIC8vIHdpdGggYSBudWxsIGNvcm5lciBpbiB0aGUgZmlyc3QgcG9zaXRpb24uCisgICAgaWYgKGNvcm5lciB8fCBpID09IDApIHsKKyAgICAgIHN0cm9rZXNbal0gPSBjb3JuZXI7CisgICAgfSBlbHNlIGlmICghYk51bGwpIHsKKyAgICAgIGlmIChpID09IDEgfHwgaSA9PSAyKQorICAgICAgICBzdHJva2VzW2pdID0gc3Ryb2tlc1swXTsKKyAgICAgIGVsc2UKKyAgICAgICAgc3Ryb2tlc1tqXSA9IHN0cm9rZXNbMl07CisgICAgfQorICAgIGorKzsKKworICAgIENYRkFfRWRnZSogZWRnZTsKKyAgICBpZiAoaSA9PSAwKQorICAgICAgZWRnZSA9IEpTT2JqZWN0KCktPkdldE9yQ3JlYXRlUHJvcGVydHk8Q1hGQV9FZGdlPihpLCBYRkFfRWxlbWVudDo6RWRnZSk7CisgICAgZWxzZQorICAgICAgZWRnZSA9IEpTT2JqZWN0KCktPkdldFByb3BlcnR5PENYRkFfRWRnZT4oaSwgWEZBX0VsZW1lbnQ6OkVkZ2UpOworCisgICAgLy8gVE9ETyhkc2luY2xhaXIpOiBJZiBpID09IDAgYW5kIEdldE9yQ3JlYXRlUHJvcGVydHkgZmFpbGVkLCB3ZSBjYW4gZW5kIHVwCisgICAgLy8gd2l0aCBhIG51bGwgZWRnZSBpbiB0aGUgZmlyc3QgcG9zaXRpb24uCisgICAgaWYgKGVkZ2UgfHwgaSA9PSAwKSB7CisgICAgICBzdHJva2VzW2pdID0gZWRnZTsKKyAgICB9IGVsc2UgaWYgKCFiTnVsbCkgeworICAgICAgaWYgKGkgPT0gMSB8fCBpID09IDIpCisgICAgICAgIHN0cm9rZXNbal0gPSBzdHJva2VzWzFdOworICAgICAgZWxzZQorICAgICAgICBzdHJva2VzW2pdID0gc3Ryb2tlc1szXTsKKyAgICB9CisgICAgaisrOwogICB9Ci0gIHJldHVybiBpVHlwZTsKKyAgcmV0dXJuIHN0cm9rZXM7Cit9CisKK3ZvaWQgQ1hGQV9Cb3g6OkRyYXcoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0V2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VSb3VuZCkgeworICBpZiAoR2V0UHJlc2VuY2UoKSAhPSBYRkFfQXR0cmlidXRlRW51bTo6VmlzaWJsZSkKKyAgICByZXR1cm47CisKKyAgWEZBX0VsZW1lbnQgZVR5cGUgPSBHZXRFbGVtZW50VHlwZSgpOworICBpZiAoZVR5cGUgIT0gWEZBX0VsZW1lbnQ6OkFyYyAmJiBlVHlwZSAhPSBYRkFfRWxlbWVudDo6Qm9yZGVyICYmCisgICAgICBlVHlwZSAhPSBYRkFfRWxlbWVudDo6UmVjdGFuZ2xlKSB7CisgICAgcmV0dXJuOworICB9CisgIHN0ZDo6dmVjdG9yPENYRkFfU3Ryb2tlKj4gc3Ryb2tlczsKKyAgaWYgKCFmb3JjZVJvdW5kICYmIGVUeXBlICE9IFhGQV9FbGVtZW50OjpBcmMpCisgICAgc3Ryb2tlcyA9IEdldFN0cm9rZXMoKTsKKworICBEcmF3RmlsbChzdHJva2VzLCBwR1MsIHJ0V2lkZ2V0LCBtYXRyaXgsIGZvcmNlUm91bmQpOworICBYRkFfRWxlbWVudCB0eXBlID0gR2V0RWxlbWVudFR5cGUoKTsKKyAgaWYgKHR5cGUgPT0gWEZBX0VsZW1lbnQ6OkFyYyB8fCBmb3JjZVJvdW5kKSB7CisgICAgU3Ryb2tlQXJjT3JSb3VuZGVkKHBHUywgcnRXaWRnZXQsIG1hdHJpeCwgZm9yY2VSb3VuZCk7CisgIH0gZWxzZSBpZiAodHlwZSA9PSBYRkFfRWxlbWVudDo6UmVjdGFuZ2xlIHx8IHR5cGUgPT0gWEZBX0VsZW1lbnQ6OkJvcmRlcikgeworICAgIFRvUmVjdGFuZ2xlKHRoaXMpLT5EcmF3KHN0cm9rZXMsIHBHUywgcnRXaWRnZXQsIG1hdHJpeCk7CisgIH0gZWxzZSB7CisgICAgTk9UUkVBQ0hFRCgpOworICB9Cit9CisKK3ZvaWQgQ1hGQV9Cb3g6OkRyYXdGaWxsKGNvbnN0IHN0ZDo6dmVjdG9yPENYRkFfU3Ryb2tlKj4mIHN0cm9rZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnRXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlUm91bmQpIHsKKyAgQ1hGQV9GaWxsKiBmaWxsID0gSlNPYmplY3QoKS0+R2V0UHJvcGVydHk8Q1hGQV9GaWxsPigwLCBYRkFfRWxlbWVudDo6RmlsbCk7CisgIGlmICghZmlsbCB8fCAhZmlsbC0+SXNWaXNpYmxlKCkpCisgICAgcmV0dXJuOworCisgIHBHUy0+U2F2ZUdyYXBoU3RhdGUoKTsKKworICBDWEZBX0dFUGF0aCBmaWxsUGF0aDsKKyAgWEZBX0VsZW1lbnQgdHlwZSA9IEdldEVsZW1lbnRUeXBlKCk7CisgIGlmICh0eXBlID09IFhGQV9FbGVtZW50OjpBcmMgfHwgZm9yY2VSb3VuZCkgeworICAgIENYRkFfRWRnZSogZWRnZSA9IEdldEVkZ2VJZkV4aXN0cygwKTsKKyAgICBmbG9hdCBmVGhpY2tuZXNzID0gc3RkOjpmbWF4KDAuMCwgZWRnZSA/IGVkZ2UtPkdldFRoaWNrbmVzcygpIDogMCk7CisgICAgZmxvYXQgZkhhbGYgPSBmVGhpY2tuZXNzIC8gMjsKKyAgICBYRkFfQXR0cmlidXRlRW51bSBpSGFuZCA9IEdldEhhbmQoKTsKKyAgICBpZiAoaUhhbmQgPT0gWEZBX0F0dHJpYnV0ZUVudW06OkxlZnQpCisgICAgICBydFdpZGdldC5JbmZsYXRlKGZIYWxmLCBmSGFsZik7CisgICAgZWxzZSBpZiAoaUhhbmQgPT0gWEZBX0F0dHJpYnV0ZUVudW06OlJpZ2h0KQorICAgICAgcnRXaWRnZXQuRGVmbGF0ZShmSGFsZiwgZkhhbGYpOworCisgICAgR2V0UGF0aEFyY09yUm91bmRlZChydFdpZGdldCwgZmlsbFBhdGgsIGZvcmNlUm91bmQpOworICB9IGVsc2UgaWYgKHR5cGUgPT0gWEZBX0VsZW1lbnQ6OlJlY3RhbmdsZSB8fCB0eXBlID09IFhGQV9FbGVtZW50OjpCb3JkZXIpIHsKKyAgICBUb1JlY3RhbmdsZSh0aGlzKS0+R2V0RmlsbFBhdGgoc3Ryb2tlcywgcnRXaWRnZXQsICZmaWxsUGF0aCk7CisgIH0gZWxzZSB7CisgICAgTk9UUkVBQ0hFRCgpOworICB9CisgIGZpbGxQYXRoLkNsb3NlKCk7CisKKyAgZmlsbC0+RHJhdyhwR1MsICZmaWxsUGF0aCwgcnRXaWRnZXQsIG1hdHJpeCk7CisgIHBHUy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsKK30KKwordm9pZCBDWEZBX0JveDo6R2V0UGF0aEFyY09yUm91bmRlZChDRlhfUmVjdEYgcnREcmF3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0dFUGF0aCYgZmlsbFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VSb3VuZCkgeworICBmbG9hdCBhLCBiOworICBhID0gcnREcmF3LndpZHRoIC8gMi4wZjsKKyAgYiA9IHJ0RHJhdy5oZWlnaHQgLyAyLjBmOworICBpZiAoSXNDaXJjdWxhcigpIHx8IGZvcmNlUm91bmQpCisgICAgYSA9IGIgPSBzdGQ6Om1pbihhLCBiKTsKKworICBDRlhfUG9pbnRGIGNlbnRlciA9IHJ0RHJhdy5DZW50ZXIoKTsKKyAgcnREcmF3LmxlZnQgPSBjZW50ZXIueCAtIGE7CisgIHJ0RHJhdy50b3AgPSBjZW50ZXIueSAtIGI7CisgIHJ0RHJhdy53aWR0aCA9IGEgKyBhOworICBydERyYXcuaGVpZ2h0ID0gYiArIGI7CisgIE9wdGlvbmFsPGludDMyX3Q+IHN0YXJ0QW5nbGUgPSBHZXRTdGFydEFuZ2xlKCk7CisgIE9wdGlvbmFsPGludDMyX3Q+IHN3ZWVwQW5nbGUgPSBHZXRTd2VlcEFuZ2xlKCk7CisgIGlmICghc3RhcnRBbmdsZSAmJiAhc3dlZXBBbmdsZSkgeworICAgIGZpbGxQYXRoLkFkZEVsbGlwc2UocnREcmF3KTsKKyAgICByZXR1cm47CisgIH0KKworICBmaWxsUGF0aC5BZGRBcmMocnREcmF3LlRvcExlZnQoKSwgcnREcmF3LlNpemUoKSwKKyAgICAgICAgICAgICAgICAgIC1zdGFydEFuZ2xlLnZhbHVlX29yKDApICogRlhfUEkgLyAxODAuMGYsCisgICAgICAgICAgICAgICAgICAtc3dlZXBBbmdsZS52YWx1ZV9vcigzNjApICogRlhfUEkgLyAxODAuMGYpOworfQorCit2b2lkIENYRkFfQm94OjpTdHJva2VBcmNPclJvdW5kZWQoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZVJvdW5kKSB7CisgIENYRkFfRWRnZSogZWRnZSA9IEdldEVkZ2VJZkV4aXN0cygwKTsKKyAgaWYgKCFlZGdlIHx8ICFlZGdlLT5Jc1Zpc2libGUoKSkKKyAgICByZXR1cm47CisKKyAgYm9vbCBiVmlzaWJsZTsKKyAgZmxvYXQgZlRoaWNrbmVzczsKKyAgWEZBX0F0dHJpYnV0ZUVudW0gaTNEVHlwZTsKKyAgc3RkOjp0aWUoaTNEVHlwZSwgYlZpc2libGUsIGZUaGlja25lc3MpID0gR2V0M0RTdHlsZSgpOworICBib29sIGxvd2VyZWQzZCA9IGZhbHNlOworICBpZiAoaTNEVHlwZSAhPSBYRkFfQXR0cmlidXRlRW51bTo6VW5rbm93bikgeworICAgIGlmIChiVmlzaWJsZSAmJiBmVGhpY2tuZXNzID49IDAuMDAxZikKKyAgICAgIGxvd2VyZWQzZCA9IHRydWU7CisgIH0KKworICBmbG9hdCBmSGFsZiA9IGVkZ2UtPkdldFRoaWNrbmVzcygpIC8gMjsKKyAgaWYgKGZIYWxmIDwgMCkgeworICAgIGZIYWxmID0gMDsKKyAgfQorCisgIFhGQV9BdHRyaWJ1dGVFbnVtIGlIYW5kID0gR2V0SGFuZCgpOworICBpZiAoaUhhbmQgPT0gWEZBX0F0dHJpYnV0ZUVudW06OkxlZnQpIHsKKyAgICBydFdpZGdldC5JbmZsYXRlKGZIYWxmLCBmSGFsZik7CisgIH0gZWxzZSBpZiAoaUhhbmQgPT0gWEZBX0F0dHJpYnV0ZUVudW06OlJpZ2h0KSB7CisgICAgcnRXaWRnZXQuRGVmbGF0ZShmSGFsZiwgZkhhbGYpOworICB9CisgIGlmICghZm9yY2VSb3VuZCB8fCAhbG93ZXJlZDNkKSB7CisgICAgaWYgKGZIYWxmIDwgMC4wMDFmKQorICAgICAgcmV0dXJuOworCisgICAgQ1hGQV9HRVBhdGggYXJjUGF0aDsKKyAgICBHZXRQYXRoQXJjT3JSb3VuZGVkKHJ0V2lkZ2V0LCBhcmNQYXRoLCBmb3JjZVJvdW5kKTsKKyAgICBpZiAoZWRnZSkKKyAgICAgIGVkZ2UtPlN0cm9rZSgmYXJjUGF0aCwgcEdTLCBtYXRyaXgpOworICAgIHJldHVybjsKKyAgfQorICBwR1MtPlNhdmVHcmFwaFN0YXRlKCk7CisgIHBHUy0+U2V0TGluZVdpZHRoKGZIYWxmKTsKKworICBmbG9hdCBhLCBiOworICBhID0gcnRXaWRnZXQud2lkdGggLyAyLjBmOworICBiID0gcnRXaWRnZXQuaGVpZ2h0IC8gMi4wZjsKKyAgaWYgKGZvcmNlUm91bmQpIHsKKyAgICBhID0gc3RkOjptaW4oYSwgYik7CisgICAgYiA9IGE7CisgIH0KKworICBDRlhfUG9pbnRGIGNlbnRlciA9IHJ0V2lkZ2V0LkNlbnRlcigpOworICBydFdpZGdldC5sZWZ0ID0gY2VudGVyLnggLSBhOworICBydFdpZGdldC50b3AgPSBjZW50ZXIueSAtIGI7CisgIHJ0V2lkZ2V0LndpZHRoID0gYSArIGE7CisgIHJ0V2lkZ2V0LmhlaWdodCA9IGIgKyBiOworCisgIGZsb2F0IHN0YXJ0QW5nbGUgPSAwLCBzd2VlcEFuZ2xlID0gMzYwOworICBzdGFydEFuZ2xlID0gc3RhcnRBbmdsZSAqIEZYX1BJIC8gMTgwLjBmOworICBzd2VlcEFuZ2xlID0gLXN3ZWVwQW5nbGUgKiBGWF9QSSAvIDE4MC4wZjsKKworICBDWEZBX0dFUGF0aCBhcmNQYXRoOworICBhcmNQYXRoLkFkZEFyYyhydFdpZGdldC5Ub3BMZWZ0KCksIHJ0V2lkZ2V0LlNpemUoKSwgMy4wZiAqIEZYX1BJIC8gNC4wZiwKKyAgICAgICAgICAgICAgICAgRlhfUEkpOworCisgIHBHUy0+U2V0U3Ryb2tlQ29sb3IoQ1hGQV9HRUNvbG9yKDB4RkY4MDgwODApKTsKKyAgcEdTLT5TdHJva2VQYXRoKCZhcmNQYXRoLCAmbWF0cml4KTsKKyAgYXJjUGF0aC5DbGVhcigpOworICBhcmNQYXRoLkFkZEFyYyhydFdpZGdldC5Ub3BMZWZ0KCksIHJ0V2lkZ2V0LlNpemUoKSwgLTEuMGYgKiBGWF9QSSAvIDQuMGYsCisgICAgICAgICAgICAgICAgIEZYX1BJKTsKKworICBwR1MtPlNldFN0cm9rZUNvbG9yKENYRkFfR0VDb2xvcigweEZGRkZGRkZGKSk7CisgIHBHUy0+U3Ryb2tlUGF0aCgmYXJjUGF0aCwgJm1hdHJpeCk7CisgIHJ0V2lkZ2V0LkRlZmxhdGUoZkhhbGYsIGZIYWxmKTsKKyAgYXJjUGF0aC5DbGVhcigpOworICBhcmNQYXRoLkFkZEFyYyhydFdpZGdldC5Ub3BMZWZ0KCksIHJ0V2lkZ2V0LlNpemUoKSwgMy4wZiAqIEZYX1BJIC8gNC4wZiwKKyAgICAgICAgICAgICAgICAgRlhfUEkpOworCisgIHBHUy0+U2V0U3Ryb2tlQ29sb3IoQ1hGQV9HRUNvbG9yKDB4RkY0MDQwNDApKTsKKyAgcEdTLT5TdHJva2VQYXRoKCZhcmNQYXRoLCAmbWF0cml4KTsKKyAgYXJjUGF0aC5DbGVhcigpOworICBhcmNQYXRoLkFkZEFyYyhydFdpZGdldC5Ub3BMZWZ0KCksIHJ0V2lkZ2V0LlNpemUoKSwgLTEuMGYgKiBGWF9QSSAvIDQuMGYsCisgICAgICAgICAgICAgICAgIEZYX1BJKTsKKworICBwR1MtPlNldFN0cm9rZUNvbG9yKENYRkFfR0VDb2xvcigweEZGQzBDMEMwKSk7CisgIHBHUy0+U3Ryb2tlUGF0aCgmYXJjUGF0aCwgJm1hdHJpeCk7CisgIHBHUy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsKIH0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2JveC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYm94LmgKaW5kZXggYTBhZjJmNC4uMDgzMWNkNiAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYm94LmgKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYm94LmgKQEAgLTcsNDggKzcsNjkgQEAKICNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQk9YX0hfCiAjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0JPWF9IXwogCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHR1cGxlPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2VkZ2UuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9maWxsLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWFyZ2luLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jeGZhX2dlcGF0aC5oIgogCi1jbGFzcyBDWEZBX05vZGU7CitjbGFzcyBDWEZBX0VkZ2U7CitjbGFzcyBDWEZBX0ZpbGw7CitjbGFzcyBDWEZBX0dyYXBoaWNzOworY2xhc3MgQ1hGQV9NYXJnaW47CitjbGFzcyBDWEZBX1N0cm9rZTsKIAotY2xhc3MgQ1hGQV9Cb3ggOiBwdWJsaWMgQ1hGQV9EYXRhIHsKK2NsYXNzIENYRkFfQm94IDogcHVibGljIENYRkFfTm9kZSB7CiAgcHVibGljOgotICBleHBsaWNpdCBDWEZBX0JveChDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30KKyAgfkNYRkFfQm94KCkgb3ZlcnJpZGU7CiAKLSAgYm9vbCBJc0FyYygpIGNvbnN0IHsgcmV0dXJuIEdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkFyYzsgfQotICBib29sIElzQm9yZGVyKCkgY29uc3QgeyByZXR1cm4gR2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6Qm9yZGVyOyB9Ci0gIGJvb2wgSXNSZWN0YW5nbGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlJlY3RhbmdsZTsKLSAgfQotICBpbnQzMl90IEdldEhhbmQoKSBjb25zdDsKLSAgaW50MzJfdCBHZXRQcmVzZW5jZSgpIGNvbnN0OwotICBpbnQzMl90IENvdW50RWRnZXMoKSBjb25zdDsKLSAgQ1hGQV9FZGdlIEdldEVkZ2UoaW50MzJfdCBuSW5kZXggPSAwKSBjb25zdDsKLSAgdm9pZCBHZXRTdHJva2VzKHN0ZDo6dmVjdG9yPENYRkFfU3Ryb2tlPiogc3Ryb2tlcykgY29uc3Q7Ci0gIGJvb2wgSXNDaXJjdWxhcigpIGNvbnN0OwotICBib29sIEdldFN0YXJ0QW5nbGUoRlhfRkxPQVQmIGZTdGFydEFuZ2xlKSBjb25zdDsKLSAgRlhfRkxPQVQgR2V0U3RhcnRBbmdsZSgpIGNvbnN0IHsKLSAgICBGWF9GTE9BVCBmU3RhcnRBbmdsZTsKLSAgICBHZXRTdGFydEFuZ2xlKGZTdGFydEFuZ2xlKTsKLSAgICByZXR1cm4gZlN0YXJ0QW5nbGU7Ci0gIH0KKyAgWEZBX0F0dHJpYnV0ZUVudW0gR2V0UHJlc2VuY2UoKTsKKyAgc3RkOjp0dXBsZTxYRkFfQXR0cmlidXRlRW51bSwgYm9vbCwgZmxvYXQ+IEdldDNEU3R5bGUoKTsKIAotICBib29sIEdldFN3ZWVwQW5nbGUoRlhfRkxPQVQmIGZTd2VlcEFuZ2xlKSBjb25zdDsKLSAgRlhfRkxPQVQgR2V0U3dlZXBBbmdsZSgpIGNvbnN0IHsKLSAgICBGWF9GTE9BVCBmU3dlZXBBbmdsZTsKLSAgICBHZXRTd2VlcEFuZ2xlKGZTd2VlcEFuZ2xlKTsKLSAgICByZXR1cm4gZlN3ZWVwQW5nbGU7Ci0gIH0KKyAgaW50MzJfdCBDb3VudEVkZ2VzKCk7CisgIENYRkFfRWRnZSogR2V0RWRnZUlmRXhpc3RzKGludDMyX3QgbkluZGV4KTsKKyAgQ1hGQV9GaWxsKiBHZXRPckNyZWF0ZUZpbGxJZlBvc3NpYmxlKCk7CiAKLSAgQ1hGQV9GaWxsIEdldEZpbGwoYm9vbCBiTW9kaWZpZWQgPSBmYWxzZSkgY29uc3Q7Ci0gIENYRkFfTWFyZ2luIEdldE1hcmdpbigpIGNvbnN0OwotICBpbnQzMl90IEdldDNEU3R5bGUoYm9vbCYgYlZpc2libGUsIEZYX0ZMT0FUJiBmVGhpY2tuZXNzKSBjb25zdDsKKyAgc3RkOjp2ZWN0b3I8Q1hGQV9TdHJva2UqPiBHZXRTdHJva2VzKCk7CisKKyAgdm9pZCBEcmF3KENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRXaWRnZXQsCisgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgsCisgICAgICAgICAgICBib29sIGZvcmNlUm91bmQpOworCisgcHJvdGVjdGVkOgorICBDWEZBX0JveChDWEZBX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBlUGFja2V0LAorICAgICAgICAgICB1aW50MzJfdCB2YWxpZFBhY2tldHMsCisgICAgICAgICAgIFhGQV9PYmplY3RUeXBlIG9UeXBlLAorICAgICAgICAgICBYRkFfRWxlbWVudCBlVHlwZSwKKyAgICAgICAgICAgY29uc3QgUHJvcGVydHlEYXRhKiBwcm9wZXJ0aWVzLAorICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVEYXRhKiBhdHRyaWJ1dGVzLAorICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgZWxlbWVudE5hbWUsCisgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSlhfT2JqZWN0PiBqc19ub2RlKTsKKworICBYRkFfQXR0cmlidXRlRW51bSBHZXRIYW5kKCk7CisKKyBwcml2YXRlOgorICBib29sIElzQ2lyY3VsYXIoKTsKKyAgT3B0aW9uYWw8aW50MzJfdD4gR2V0U3RhcnRBbmdsZSgpOworICBPcHRpb25hbDxpbnQzMl90PiBHZXRTd2VlcEFuZ2xlKCk7CisKKyAgc3RkOjp2ZWN0b3I8Q1hGQV9TdHJva2UqPiBHZXRTdHJva2VzSW50ZXJuYWwoYm9vbCBiTnVsbCk7CisgIHZvaWQgRHJhd0ZpbGwoY29uc3Qgc3RkOjp2ZWN0b3I8Q1hGQV9TdHJva2UqPiYgc3Ryb2tlcywKKyAgICAgICAgICAgICAgICBDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0LAorICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCwKKyAgICAgICAgICAgICAgICBib29sIGZvcmNlUm91bmQpOworICB2b2lkIFN0cm9rZUFyY09yUm91bmRlZChDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlUm91bmQpOworICB2b2lkIEdldFBhdGhBcmNPclJvdW5kZWQoQ0ZYX1JlY3RGIHJ0RHJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfR0VQYXRoJiBmaWxsUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VSb3VuZCk7CiB9OwogCiAjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0JPWF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYnJlYWsuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYnJlYWsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhODNiMWMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9icmVhay5jcHAKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYnJlYWsuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9icmVhay5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0ge3tYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6QmVmb3JlVGFyZ2V0LCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok92ZXJmbG93VGFyZ2V0LCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpPdmVyZmxvd0xlYWRlciwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6T3ZlcmZsb3dUcmFpbGVyLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpTdGFydE5ldywgWEZBX0F0dHJpYnV0ZVR5cGU6OkJvb2xlYW4sICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6Qm9va2VuZFRyYWlsZXIsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkFmdGVyLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpBdXRvfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6Qm9va2VuZExlYWRlciwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6QWZ0ZXJUYXJnZXQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkJlZm9yZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6QXV0b30sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImJyZWFrIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfQnJlYWs6OkNYRkFfQnJlYWsoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkJyZWFrLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9CcmVhaz4odGhpcykpIHt9CisKK0NYRkFfQnJlYWs6On5DWEZBX0JyZWFrKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2JyZWFrLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9icmVhay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZDkzN2MKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9icmVhay5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9CUkVBS19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9CUkVBS19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0JyZWFrIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0JyZWFrKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfQnJlYWsoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQlJFQUtfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2JyZWFrYWZ0ZXIuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYnJlYWthZnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1YjcyMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2JyZWFrYWZ0ZXIuY3BwCkBAIC0wLDAgKzEsNDMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2JyZWFrYWZ0ZXIuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9icmVha2FmdGVyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpTY3JpcHQsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlN0YXJ0TmV3LCBYRkFfQXR0cmlidXRlVHlwZTo6Qm9vbGVhbiwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpUcmFpbGVyLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpUYXJnZXRUeXBlLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpBdXRvfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VGFyZ2V0LCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMZWFkZXIsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImJyZWFrQWZ0ZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9CcmVha0FmdGVyOjpDWEZBX0JyZWFrQWZ0ZXIoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkJyZWFrQWZ0ZXIsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0JyZWFrQWZ0ZXI+KHRoaXMpKSB7fQorCitDWEZBX0JyZWFrQWZ0ZXI6On5DWEZBX0JyZWFrQWZ0ZXIoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYnJlYWthZnRlci5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYnJlYWthZnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MmIwYzkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9icmVha2FmdGVyLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0JSRUFLQUZURVJfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQlJFQUtBRlRFUl9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0JyZWFrQWZ0ZXIgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfQnJlYWtBZnRlcihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0JyZWFrQWZ0ZXIoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQlJFQUtBRlRFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYnJlYWtiZWZvcmUuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYnJlYWtiZWZvcmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZGNhZGUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9icmVha2JlZm9yZS5jcHAKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYnJlYWtiZWZvcmUuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9icmVha2JlZm9yZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0ge3tYRkFfRWxlbWVudDo6U2NyaXB0LCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpTdGFydE5ldywgWEZBX0F0dHJpYnV0ZVR5cGU6OkJvb2xlYW4sICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VHJhaWxlciwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VGFyZ2V0VHlwZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6QXV0b30sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlRhcmdldCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TGVhZGVyLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJicmVha0JlZm9yZSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0JyZWFrQmVmb3JlOjpDWEZBX0JyZWFrQmVmb3JlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpCcmVha0JlZm9yZSwKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfQnJlYWtCZWZvcmU+KHRoaXMpKSB7fQorCitDWEZBX0JyZWFrQmVmb3JlOjp+Q1hGQV9CcmVha0JlZm9yZSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9icmVha2JlZm9yZS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYnJlYWtiZWZvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNThlNDc3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYnJlYWtiZWZvcmUuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQlJFQUtCRUZPUkVfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQlJFQUtCRUZPUkVfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9CcmVha0JlZm9yZSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9CcmVha0JlZm9yZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0JyZWFrQmVmb3JlKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0JSRUFLQkVGT1JFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9idXR0b24uY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYnV0dG9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjYyZWZiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYnV0dG9uLmNwcApAQCAtMCwwICsxLDM5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9idXR0b24uaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9idXR0b24uaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SGlnaGxpZ2h0LCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpJbnZlcnRlZH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImJ1dHRvbiI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0J1dHRvbjo6Q1hGQV9CdXR0b24oQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkJ1dHRvbiwKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfQnV0dG9uPih0aGlzKSkge30KKworQ1hGQV9CdXR0b246On5DWEZBX0J1dHRvbigpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9idXR0b24uaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2J1dHRvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ZmZiNTIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9idXR0b24uaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQlVUVE9OX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0JVVFRPTl9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0J1dHRvbiA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9CdXR0b24oQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9CdXR0b24oKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQlVUVE9OX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYWNoZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYWNoZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQyMjdhMwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NhY2hlLmNwcApAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYWNoZS5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7CisgICAge1hGQV9FbGVtZW50OjpUZW1wbGF0ZUNhY2hlLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJjYWNoZSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0NhY2hlOjpDWEZBX0NhY2hlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkNhY2hlLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfQ2FjaGU6On5DWEZBX0NhY2hlKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2NhY2hlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOTA3YzYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYWNoZS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DQUNIRV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DQUNIRV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0NhY2hlIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0NhY2hlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfQ2FjaGUoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ0FDSEVfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2NhbGN1bGF0ZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYWxjdWxhdGUuY3BwCmluZGV4IGQ3YjFmNzEuLjMyODY3ODcgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2NhbGN1bGF0ZS5jcHAKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2FsY3VsYXRlLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCkBAIC02LDI3ICs2LDU4IEBACiAKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYWxjdWxhdGUuaCIKIAorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9jYWxjdWxhdGUuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVzc2FnZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NjcmlwdC5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RleHQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oIgogCi1DWEZBX0NhbGN1bGF0ZTo6Q1hGQV9DYWxjdWxhdGUoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9CituYW1lc3BhY2UgewogCi1pbnQzMl90IENYRkFfQ2FsY3VsYXRlOjpHZXRPdmVycmlkZSgpIHsKLSAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dCA9IFhGQV9BVFRSSUJVVEVFTlVNX0Vycm9yOwotICBtX3BOb2RlLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfT3ZlcnJpZGUsIGVBdHQsIGZhbHNlKTsKLSAgcmV0dXJuIGVBdHQ7Citjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpNZXNzYWdlLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlNjcmlwdCwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpFeHRyYXMsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok92ZXJyaWRlLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpFcnJvcn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImNhbGN1bGF0ZSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0NhbGN1bGF0ZTo6Q1hGQV9DYWxjdWxhdGUoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkNhbGN1bGF0ZSwKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfQ2FsY3VsYXRlPih0aGlzKSkge30KKworQ1hGQV9DYWxjdWxhdGU6On5DWEZBX0NhbGN1bGF0ZSgpIHt9CisKK1hGQV9BdHRyaWJ1dGVFbnVtIENYRkFfQ2FsY3VsYXRlOjpHZXRPdmVycmlkZSgpIHsKKyAgcmV0dXJuIEpTT2JqZWN0KCkKKyAgICAgIC0+VHJ5RW51bShYRkFfQXR0cmlidXRlOjpPdmVycmlkZSwgZmFsc2UpCisgICAgICAudmFsdWVfb3IoWEZBX0F0dHJpYnV0ZUVudW06OkVycm9yKTsKIH0KIAotQ1hGQV9TY3JpcHQgQ1hGQV9DYWxjdWxhdGU6OkdldFNjcmlwdCgpIHsKLSAgcmV0dXJuIENYRkFfU2NyaXB0KG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpTY3JpcHQpKTsKK0NYRkFfU2NyaXB0KiBDWEZBX0NhbGN1bGF0ZTo6R2V0U2NyaXB0SWZFeGlzdHMoKSB7CisgIHJldHVybiBHZXRDaGlsZDxDWEZBX1NjcmlwdD4oMCwgWEZBX0VsZW1lbnQ6OlNjcmlwdCwgZmFsc2UpOwogfQogCi12b2lkIENYRkFfQ2FsY3VsYXRlOjpHZXRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyYgd3NNZXNzYWdlKSB7Ci0gIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6TWVzc2FnZSk7CitXaWRlU3RyaW5nIENYRkFfQ2FsY3VsYXRlOjpHZXRNZXNzYWdlVGV4dCgpIHsKKyAgQ1hGQV9NZXNzYWdlKiBwTm9kZSA9IEdldENoaWxkPENYRkFfTWVzc2FnZT4oMCwgWEZBX0VsZW1lbnQ6Ok1lc3NhZ2UsIGZhbHNlKTsKICAgaWYgKCFwTm9kZSkKLSAgICByZXR1cm47CisgICAgcmV0dXJuIEwiIjsKIAotICBDWEZBX1RleHQgdGV4dChwTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VsZW1lbnQ6OlRleHQpKTsKLSAgaWYgKHRleHQpCi0gICAgdGV4dC5HZXRDb250ZW50KHdzTWVzc2FnZSk7CisgIENYRkFfVGV4dCogdGV4dCA9IHBOb2RlLT5HZXRDaGlsZDxDWEZBX1RleHQ+KDAsIFhGQV9FbGVtZW50OjpUZXh0LCBmYWxzZSk7CisgIHJldHVybiB0ZXh0ID8gdGV4dC0+R2V0Q29udGVudCgpIDogTCIiOwogfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2FsY3VsYXRlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYWxjdWxhdGUuaAppbmRleCAxMDEyMjI0Li5hNWJlOTA4IDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYWxjdWxhdGUuaAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYWxjdWxhdGUuaApAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCkBAIC03LDE5ICs3LDE4IEBACiAjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NBTENVTEFURV9IXwogI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DQUxDVUxBVEVfSF8KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NjcmlwdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKIAotY2xhc3MgQ1hGQV9Ob2RlOworY2xhc3MgQ1hGQV9TY3JpcHQ7CiAKLWNsYXNzIENYRkFfQ2FsY3VsYXRlIDogcHVibGljIENYRkFfRGF0YSB7CitjbGFzcyBDWEZBX0NhbGN1bGF0ZSA6IHB1YmxpYyBDWEZBX05vZGUgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9DYWxjdWxhdGUoQ1hGQV9Ob2RlKiBwTm9kZSk7CisgIENYRkFfQ2FsY3VsYXRlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfQ2FsY3VsYXRlKCkgb3ZlcnJpZGU7CiAKLSAgaW50MzJfdCBHZXRPdmVycmlkZSgpOwotICBDWEZBX1NjcmlwdCBHZXRTY3JpcHQoKTsKLSAgdm9pZCBHZXRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyYgd3NNZXNzYWdlKTsKKyAgWEZBX0F0dHJpYnV0ZUVudW0gR2V0T3ZlcnJpZGUoKTsKKyAgQ1hGQV9TY3JpcHQqIEdldFNjcmlwdElmRXhpc3RzKCk7CisgIFdpZGVTdHJpbmcgR2V0TWVzc2FnZVRleHQoKTsKIH07CiAKICNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ0FMQ1VMQVRFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYWxlbmRhcnN5bWJvbHMuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2FsZW5kYXJzeW1ib2xzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWFkM2I1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2FsZW5kYXJzeW1ib2xzLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYWxlbmRhcnN5bWJvbHMuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0geworICAgIHtYRkFfRWxlbWVudDo6RXJhTmFtZXMsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6RGF5TmFtZXMsIDIsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6TWVyaWRpZW1OYW1lcywgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpNb250aE5hbWVzLCAyLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpHcmVnb3JpYW59LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJjYWxlbmRhclN5bWJvbHMiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9DYWxlbmRhclN5bWJvbHM6OkNYRkFfQ2FsZW5kYXJTeW1ib2xzKENYRkFfRG9jdW1lbnQqIGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6Q2FsZW5kYXJTeW1ib2xzLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfQ2FsZW5kYXJTeW1ib2xzOjp+Q1hGQV9DYWxlbmRhclN5bWJvbHMoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2FsZW5kYXJzeW1ib2xzLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYWxlbmRhcnN5bWJvbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjFmMDA3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2FsZW5kYXJzeW1ib2xzLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NBTEVOREFSU1lNQk9MU19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DQUxFTkRBUlNZTUJPTFNfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9DYWxlbmRhclN5bWJvbHMgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfQ2FsZW5kYXJTeW1ib2xzKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfQ2FsZW5kYXJTeW1ib2xzKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NBTEVOREFSU1lNQk9MU19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2FwdGlvbi5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYXB0aW9uLmNwcAppbmRleCA3ZjllODhlLi5hNTQ2MDVhIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYXB0aW9uLmNwcAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYXB0aW9uLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCkBAIC02LDM5ICs2LDc4IEBACiAKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYXB0aW9uLmgiCiAKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfY2FwdGlvbi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9mb250LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWFyZ2luLmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVhc3VyZW1lbnQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZhbHVlLmgiCiAKLUNYRkFfQ2FwdGlvbjo6Q1hGQV9DYXB0aW9uKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQorbmFtZXNwYWNlIHsKIAotaW50MzJfdCBDWEZBX0NhcHRpb246OkdldFByZXNlbmNlKCkgewotICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGU7Ci0gIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgZUF0dHIpOwotICByZXR1cm4gZUF0dHI7Citjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7CisgICAge1hGQV9FbGVtZW50OjpNYXJnaW4sIDEsIDB9LCB7WEZBX0VsZW1lbnQ6OlBhcmEsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6Rm9udCwgMSwgMH0sICAge1hGQV9FbGVtZW50OjpWYWx1ZSwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpFeHRyYXMsIDEsIDB9LCB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpSZXNlcnZlLCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiLTF1biJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpQcmVzZW5jZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6VmlzaWJsZX0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlBsYWNlbWVudCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6TGVmdH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImNhcHRpb24iOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9DYXB0aW9uOjpDWEZBX0NhcHRpb24oQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkNhcHRpb24sCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0NhcHRpb24+KHRoaXMpKSB7fQorCitDWEZBX0NhcHRpb246On5DWEZBX0NhcHRpb24oKSB7fQorCitib29sIENYRkFfQ2FwdGlvbjo6SXNWaXNpYmxlKCkgeworICByZXR1cm4gSlNPYmplY3QoKQorICAgICAgICAgICAgIC0+VHJ5RW51bShYRkFfQXR0cmlidXRlOjpQcmVzZW5jZSwgdHJ1ZSkKKyAgICAgICAgICAgICAudmFsdWVfb3IoWEZBX0F0dHJpYnV0ZUVudW06OlZpc2libGUpID09CisgICAgICAgICBYRkFfQXR0cmlidXRlRW51bTo6VmlzaWJsZTsKIH0KIAotaW50MzJfdCBDWEZBX0NhcHRpb246OkdldFBsYWNlbWVudFR5cGUoKSB7Ci0gIFhGQV9BVFRSSUJVVEVFTlVNIGVBdHRyID0gWEZBX0FUVFJJQlVURUVOVU1fTGVmdDsKLSAgbV9wTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX1BsYWNlbWVudCwgZUF0dHIpOwotICByZXR1cm4gZUF0dHI7Citib29sIENYRkFfQ2FwdGlvbjo6SXNIaWRkZW4oKSB7CisgIHJldHVybiBKU09iamVjdCgpCisgICAgICAgICAgICAgLT5UcnlFbnVtKFhGQV9BdHRyaWJ1dGU6OlByZXNlbmNlLCB0cnVlKQorICAgICAgICAgICAgIC52YWx1ZV9vcihYRkFfQXR0cmlidXRlRW51bTo6VmlzaWJsZSkgPT0gWEZBX0F0dHJpYnV0ZUVudW06OkhpZGRlbjsKIH0KIAotRlhfRkxPQVQgQ1hGQV9DYXB0aW9uOjpHZXRSZXNlcnZlKCkgewotICBDWEZBX01lYXN1cmVtZW50IG1zOwotICBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmVzZXJ2ZSwgbXMpOwotICByZXR1cm4gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsKK1hGQV9BdHRyaWJ1dGVFbnVtIENYRkFfQ2FwdGlvbjo6R2V0UGxhY2VtZW50VHlwZSgpIHsKKyAgcmV0dXJuIEpTT2JqZWN0KCkKKyAgICAgIC0+VHJ5RW51bShYRkFfQXR0cmlidXRlOjpQbGFjZW1lbnQsIHRydWUpCisgICAgICAudmFsdWVfb3IoWEZBX0F0dHJpYnV0ZUVudW06OkxlZnQpOwogfQogCi1DWEZBX01hcmdpbiBDWEZBX0NhcHRpb246OkdldE1hcmdpbigpIHsKLSAgcmV0dXJuIENYRkFfTWFyZ2luKG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6TWFyZ2luKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHIpOworZmxvYXQgQ1hGQV9DYXB0aW9uOjpHZXRSZXNlcnZlKCkgY29uc3QgeworICByZXR1cm4gSlNPYmplY3QoKS0+R2V0TWVhc3VyZShYRkFfQXR0cmlidXRlOjpSZXNlcnZlKS5Ub1VuaXQoWEZBX1VuaXQ6OlB0KTsKIH0KIAotQ1hGQV9Gb250IENYRkFfQ2FwdGlvbjo6R2V0Rm9udCgpIHsKLSAgcmV0dXJuIENYRkFfRm9udChtX3BOb2RlID8gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VsZW1lbnQ6OkZvbnQpIDogbnVsbHB0cik7CitDWEZBX01hcmdpbiogQ1hGQV9DYXB0aW9uOjpHZXRNYXJnaW5JZkV4aXN0cygpIHsKKyAgcmV0dXJuIEdldENoaWxkPENYRkFfTWFyZ2luPigwLCBYRkFfRWxlbWVudDo6TWFyZ2luLCBmYWxzZSk7CiB9CiAKLUNYRkFfVmFsdWUgQ1hGQV9DYXB0aW9uOjpHZXRWYWx1ZSgpIHsKLSAgcmV0dXJuIENYRkFfVmFsdWUobV9wTm9kZSA/IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpWYWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHIpOworQ1hGQV9Gb250KiBDWEZBX0NhcHRpb246OkdldEZvbnRJZkV4aXN0cygpIHsKKyAgcmV0dXJuIEdldENoaWxkPENYRkFfRm9udD4oMCwgWEZBX0VsZW1lbnQ6OkZvbnQsIGZhbHNlKTsKK30KKworQ1hGQV9WYWx1ZSogQ1hGQV9DYXB0aW9uOjpHZXRWYWx1ZUlmRXhpc3RzKCkgeworICByZXR1cm4gR2V0Q2hpbGQ8Q1hGQV9WYWx1ZT4oMCwgWEZBX0VsZW1lbnQ6OlZhbHVlLCBmYWxzZSk7CiB9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYXB0aW9uLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYXB0aW9uLmgKaW5kZXggNzBkZDQzNS4uYzc5MDc4NyAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2FwdGlvbi5oCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NhcHRpb24uaApAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCkBAIC03LDIzICs3LDI3IEBACiAjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NBUFRJT05fSF8KICNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ0FQVElPTl9IXwogCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2ZvbnQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tYXJnaW4uaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWx1ZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKIAotY2xhc3MgQ1hGQV9Ob2RlOworY2xhc3MgQ1hGQV9Gb250OworY2xhc3MgQ1hGQV9NYXJnaW47CitjbGFzcyBDWEZBX1ZhbHVlOwogCi1jbGFzcyBDWEZBX0NhcHRpb24gOiBwdWJsaWMgQ1hGQV9EYXRhIHsKK2NsYXNzIENYRkFfQ2FwdGlvbiA6IHB1YmxpYyBDWEZBX05vZGUgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9DYXB0aW9uKENYRkFfTm9kZSogcE5vZGUpOworICBzdGF0aWMgY29uc3RleHByIFhGQV9BdHRyaWJ1dGVFbnVtIGtEZWZhdWx0UGxhY2VtZW50VHlwZSA9CisgICAgICBYRkFfQXR0cmlidXRlRW51bTo6TGVmdDsKIAotICBpbnQzMl90IEdldFByZXNlbmNlKCk7Ci0gIGludDMyX3QgR2V0UGxhY2VtZW50VHlwZSgpOwotICBGWF9GTE9BVCBHZXRSZXNlcnZlKCk7Ci0gIENYRkFfTWFyZ2luIEdldE1hcmdpbigpOwotICBDWEZBX0ZvbnQgR2V0Rm9udCgpOwotICBDWEZBX1ZhbHVlIEdldFZhbHVlKCk7CisgIENYRkFfQ2FwdGlvbihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0NhcHRpb24oKSBvdmVycmlkZTsKKworICBib29sIElzVmlzaWJsZSgpOworICBib29sIElzSGlkZGVuKCk7CisgIFhGQV9BdHRyaWJ1dGVFbnVtIEdldFBsYWNlbWVudFR5cGUoKTsKKyAgZmxvYXQgR2V0UmVzZXJ2ZSgpIGNvbnN0OworICBDWEZBX01hcmdpbiogR2V0TWFyZ2luSWZFeGlzdHMoKTsKKyAgQ1hGQV9Gb250KiBHZXRGb250SWZFeGlzdHMoKTsKKyAgQ1hGQV9WYWx1ZSogR2V0VmFsdWVJZkV4aXN0cygpOwogfTsKIAogI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DQVBUSU9OX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jZXJ0aWZpY2F0ZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jZXJ0aWZpY2F0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlOGVjMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NlcnRpZmljYXRlLmNwcApAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jZXJ0aWZpY2F0ZS5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2NlcnRpZmljYXRlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiY2VydGlmaWNhdGUiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9DZXJ0aWZpY2F0ZTo6Q1hGQV9DZXJ0aWZpY2F0ZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6VGV4dE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkNlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9DZXJ0aWZpY2F0ZT4odGhpcykpIHt9CisKK0NYRkFfQ2VydGlmaWNhdGU6On5DWEZBX0NlcnRpZmljYXRlKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2NlcnRpZmljYXRlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jZXJ0aWZpY2F0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MTA2ZGEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jZXJ0aWZpY2F0ZS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DRVJUSUZJQ0FURV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DRVJUSUZJQ0FURV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0NlcnRpZmljYXRlIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0NlcnRpZmljYXRlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfQ2VydGlmaWNhdGUoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ0VSVElGSUNBVEVfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2NlcnRpZmljYXRlcy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jZXJ0aWZpY2F0ZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZjhmMzAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jZXJ0aWZpY2F0ZXMuY3BwCkBAIC0wLDAgKzEsNDMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NlcnRpZmljYXRlcy5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2NlcnRpZmljYXRlcy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0geworICAgIHtYRkFfRWxlbWVudDo6S2V5VXNhZ2UsIDEsIDB9LCB7WEZBX0VsZW1lbnQ6OlN1YmplY3RETnMsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6SXNzdWVycywgMSwgMH0sICB7WEZBX0VsZW1lbnQ6OlNpZ25pbmcsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6T2lkcywgMSwgMH0sICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXJsLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkNyZWRlbnRpYWxTZXJ2ZXJQb2xpY3ksIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06Ok9wdGlvbmFsfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXJsUG9saWN5LCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJjZXJ0aWZpY2F0ZXMiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9DZXJ0aWZpY2F0ZXM6OkNYRkFfQ2VydGlmaWNhdGVzKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpDZXJ0aWZpY2F0ZXMsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0NlcnRpZmljYXRlcz4odGhpcykpIHt9CisKK0NYRkFfQ2VydGlmaWNhdGVzOjp+Q1hGQV9DZXJ0aWZpY2F0ZXMoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2VydGlmaWNhdGVzLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jZXJ0aWZpY2F0ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWJlZDczCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2VydGlmaWNhdGVzLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NFUlRJRklDQVRFU19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DRVJUSUZJQ0FURVNfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9DZXJ0aWZpY2F0ZXMgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfQ2VydGlmaWNhdGVzKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfQ2VydGlmaWNhdGVzKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NFUlRJRklDQVRFU19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2hhbmdlLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NoYW5nZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwYzU1NgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NoYW5nZS5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2hhbmdlLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJjaGFuZ2UiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9DaGFuZ2U6OkNYRkFfQ2hhbmdlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpDaGFuZ2UsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9DaGFuZ2U6On5DWEZBX0NoYW5nZSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jaGFuZ2UuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NoYW5nZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOWI5MmUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jaGFuZ2UuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ0hBTkdFX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NIQU5HRV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0NoYW5nZSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9DaGFuZ2UoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9DaGFuZ2UoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ0hBTkdFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jaGVja2J1dHRvbi5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jaGVja2J1dHRvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBmMzk5MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NoZWNrYnV0dG9uLmNwcApAQCAtMCwwICsxLDQ1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jaGVja2J1dHRvbi5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2NoZWNrYnV0dG9uLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpNYXJnaW4sIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6Qm9yZGVyLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6QWxsb3dOZXV0cmFsLCBYRkFfQXR0cmlidXRlVHlwZTo6Qm9vbGVhbiwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpNYXJrLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpEZWZhdWx0fSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6U2hhcGUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OlNxdWFyZX0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlNpemUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpNZWFzdXJlLCAodm9pZCopTCIxMHB0In0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImNoZWNrQnV0dG9uIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfQ2hlY2tCdXR0b246OkNYRkFfQ2hlY2tCdXR0b24oQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkNoZWNrQnV0dG9uLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9DaGVja0J1dHRvbj4odGhpcykpIHt9CisKK0NYRkFfQ2hlY2tCdXR0b246On5DWEZBX0NoZWNrQnV0dG9uKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2NoZWNrYnV0dG9uLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jaGVja2J1dHRvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZmI0YmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jaGVja2J1dHRvbi5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DSEVDS0JVVFRPTl9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DSEVDS0JVVFRPTl9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0NoZWNrQnV0dG9uIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0NoZWNrQnV0dG9uKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfQ2hlY2tCdXR0b24oKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ0hFQ0tCVVRUT05fSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2Nob2ljZWxpc3QuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2hvaWNlbGlzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmODY4MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Nob2ljZWxpc3QuY3BwCkBAIC0wLDAgKzEsNDQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2Nob2ljZWxpc3QuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9jaG9pY2VsaXN0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpNYXJnaW4sIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6Qm9yZGVyLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6T3BlbiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6VXNlckNvbnRyb2x9LAorICAgIHtYRkFfQXR0cmlidXRlOjpDb21taXRPbiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6U2VsZWN0fSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VGV4dEVudHJ5LCBYRkFfQXR0cmlidXRlVHlwZTo6Qm9vbGVhbiwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJjaG9pY2VMaXN0IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfQ2hvaWNlTGlzdDo6Q1hGQV9DaG9pY2VMaXN0KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpDaG9pY2VMaXN0LAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9DaG9pY2VMaXN0Pih0aGlzKSkge30KKworQ1hGQV9DaG9pY2VMaXN0Ojp+Q1hGQV9DaG9pY2VMaXN0KCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2Nob2ljZWxpc3QuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Nob2ljZWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTk0ODgwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2hvaWNlbGlzdC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DSE9JQ0VMSVNUX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NIT0lDRUxJU1RfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9DaG9pY2VMaXN0IDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0Nob2ljZUxpc3QoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9DaG9pY2VMaXN0KCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NIT0lDRUxJU1RfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbG9yLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWMwYWQzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29sb3IuY3BwCkBAIC0wLDAgKzEsNTkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbG9yLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfY29sb3IuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6Q1NwYWNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsICh2b2lkKilMIlNSR0IifSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VmFsdWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImNvbG9yIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfQ29sb3I6OkNYRkFfQ29sb3IoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkNvbG9yLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9Db2xvcj4odGhpcykpIHt9CisKK0NYRkFfQ29sb3I6On5DWEZBX0NvbG9yKCkge30KKworRlhfQVJHQiBDWEZBX0NvbG9yOjpHZXRWYWx1ZSgpIHsKKyAgT3B0aW9uYWw8V2lkZVN0cmluZz4gdmFsID0gSlNPYmplY3QoKS0+VHJ5Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6VmFsdWUsIGZhbHNlKTsKKyAgcmV0dXJuIHZhbCA/IFN0cmluZ1RvRlhBUkdCKHZhbC0+QXNTdHJpbmdWaWV3KCkpIDogMHhGRjAwMDAwMDsKK30KKworRlhfQVJHQiBDWEZBX0NvbG9yOjpHZXRWYWx1ZU9yRGVmYXVsdChGWF9BUkdCIGRlZmF1bHRWYWx1ZSkgeworICBPcHRpb25hbDxXaWRlU3RyaW5nPiB2YWwgPSBKU09iamVjdCgpLT5UcnlDRGF0YShYRkFfQXR0cmlidXRlOjpWYWx1ZSwgZmFsc2UpOworICByZXR1cm4gdmFsID8gU3RyaW5nVG9GWEFSR0IodmFsLT5Bc1N0cmluZ1ZpZXcoKSkgOiBkZWZhdWx0VmFsdWU7Cit9CisKK3ZvaWQgQ1hGQV9Db2xvcjo6U2V0VmFsdWUoRlhfQVJHQiBjb2xvcikgeworICBpbnQgYTsKKyAgaW50IHI7CisgIGludCBnOworICBpbnQgYjsKKyAgc3RkOjp0aWUoYSwgciwgZywgYikgPSBBcmdiRGVjb2RlKGNvbG9yKTsKKyAgSlNPYmplY3QoKS0+U2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmc6OkZvcm1hdChMIiVkLCVkLCVkIiwgciwgZywgYiksIGZhbHNlLCBmYWxzZSk7Cit9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb2xvci5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29sb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTVjOWQ4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29sb3IuaApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ09MT1JfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ09MT1JfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9Db2xvciA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgc3RhdGljIGNvbnN0ZXhwciBGWF9BUkdCIGtCbGFja0NvbG9yID0gMHhGRjAwMDAwMDsKKworICBDWEZBX0NvbG9yKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfQ29sb3IoKSBvdmVycmlkZTsKKworICBGWF9BUkdCIEdldFZhbHVlKCk7CisgIEZYX0FSR0IgR2V0VmFsdWVPckRlZmF1bHQoRlhfQVJHQiBkZWZhdWx0VmFsdWUpOworICB2b2lkIFNldFZhbHVlKEZYX0FSR0IgY29sb3IpOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DT0xPUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tYi5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21iLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDI3ZGRlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tYi5jcHAKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tYi5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2NvbWIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpOdW1iZXJPZkNlbGxzLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJjb21iIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfQ29tYjo6Q1hGQV9Db21iKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpDb21iLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9Db21iPih0aGlzKSkge30KKworQ1hGQV9Db21iOjp+Q1hGQV9Db21iKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbWIuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjJiNTM4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tYi5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DT01CX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NPTUJfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9Db21iIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0NvbWIoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9Db21iKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NPTUJfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbW1hbmQuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tbWFuZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UzODVlMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbW1hbmQuY3BwCkBAIC0wLDAgKzEsNDIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbW1hbmQuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9jb21tYW5kLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpRdWVyeSwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpJbnNlcnQsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6VXBkYXRlLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OkRlbGV0ZSwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VGltZW91dCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikzMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImNvbW1hbmQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9Db21tYW5kOjpDWEZBX0NvbW1hbmQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6Q29tbWFuZCwKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfQ29tbWFuZD4odGhpcykpIHt9CisKK0NYRkFfQ29tbWFuZDo6fkNYRkFfQ29tbWFuZCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21tYW5kLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21tYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiNzRmMwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbW1hbmQuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ09NTUFORF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DT01NQU5EX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfQ29tbWFuZCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9Db21tYW5kKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfQ29tbWFuZCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DT01NQU5EX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21tb24uY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tbW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTVmMDJmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tbW9uLmNwcApAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21tb24uaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0geworICAgIHtYRkFfRWxlbWVudDo6U3VwcHJlc3NCYW5uZXIsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6VmVyc2lvbkNvbnRyb2wsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6TG9jYWxlU2V0LCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlRlbXBsYXRlLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlZhbGlkYXRpb25NZXNzYWdpbmcsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6TG9jYWxlLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkRhdGEsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6TWVzc2FnaW5nLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJjb21tb24iOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9Db21tb246OkNYRkFfQ29tbW9uKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkNvbW1vbiwKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0NvbW1vbjo6fkNYRkFfQ29tbW9uKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbW1vbi5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBjZTBlYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbW1vbi5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DT01NT05fSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ09NTU9OX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfQ29tbW9uIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0NvbW1vbihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0NvbW1vbigpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DT01NT05fSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbXByZXNzLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbXByZXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmEzYjkyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tcHJlc3MuY3BwCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbXByZXNzLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpTY29wZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6SW1hZ2VPbmx5fSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiY29tcHJlc3MiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9Db21wcmVzczo6Q1hGQV9Db21wcmVzcyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpDb21wcmVzcywKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0NvbXByZXNzOjp+Q1hGQV9Db21wcmVzcygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21wcmVzcy5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tcHJlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWMxODgzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tcHJlc3MuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ09NUFJFU1NfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ09NUFJFU1NfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9Db21wcmVzcyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9Db21wcmVzcyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0NvbXByZXNzKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NPTVBSRVNTX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21wcmVzc2lvbi5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21wcmVzc2lvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QyYmZkZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbXByZXNzaW9uLmNwcApAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21wcmVzc2lvbi5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7CisgICAge1hGQV9FbGVtZW50OjpMZXZlbCwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpUeXBlLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkNvbXByZXNzT2JqZWN0U3RyZWFtLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkNvbXByZXNzTG9naWNhbFN0cnVjdHVyZSwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiY29tcHJlc3Npb24iOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9Db21wcmVzc2lvbjo6Q1hGQV9Db21wcmVzc2lvbihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpDb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0NvbXByZXNzaW9uOjp+Q1hGQV9Db21wcmVzc2lvbigpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21wcmVzc2lvbi5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tcHJlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGUyNmNiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tcHJlc3Npb24uaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ09NUFJFU1NJT05fSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ09NUFJFU1NJT05fSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9Db21wcmVzc2lvbiA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9Db21wcmVzc2lvbihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0NvbXByZXNzaW9uKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NPTVBSRVNTSU9OX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21wcmVzc2xvZ2ljYWxzdHJ1Y3R1cmUuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tcHJlc3Nsb2dpY2Fsc3RydWN0dXJlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWMyYmFmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tcHJlc3Nsb2dpY2Fsc3RydWN0dXJlLmNwcApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21wcmVzc2xvZ2ljYWxzdHJ1Y3R1cmUuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImNvbXByZXNzTG9naWNhbFN0cnVjdHVyZSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0NvbXByZXNzTG9naWNhbFN0cnVjdHVyZTo6Q1hGQV9Db21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUoCisgICAgQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6Q29tcHJlc3NMb2dpY2FsU3RydWN0dXJlLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfQ29tcHJlc3NMb2dpY2FsU3RydWN0dXJlOjp+Q1hGQV9Db21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tcHJlc3Nsb2dpY2Fsc3RydWN0dXJlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21wcmVzc2xvZ2ljYWxzdHJ1Y3R1cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGI1MDY4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tcHJlc3Nsb2dpY2Fsc3RydWN0dXJlLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NPTVBSRVNTTE9HSUNBTFNUUlVDVFVSRV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DT01QUkVTU0xPR0lDQUxTVFJVQ1RVUkVfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9Db21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfQ29tcHJlc3NMb2dpY2FsU3RydWN0dXJlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfQ29tcHJlc3NMb2dpY2FsU3RydWN0dXJlKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NPTVBSRVNTTE9HSUNBTFNUUlVDVFVSRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tcHJlc3NvYmplY3RzdHJlYW0uY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tcHJlc3NvYmplY3RzdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZWFlZDAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21wcmVzc29iamVjdHN0cmVhbS5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tcHJlc3NvYmplY3RzdHJlYW0uaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImNvbXByZXNzT2JqZWN0U3RyZWFtIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfQ29tcHJlc3NPYmplY3RTdHJlYW06OkNYRkFfQ29tcHJlc3NPYmplY3RTdHJlYW0oQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkNvbXByZXNzT2JqZWN0U3RyZWFtLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfQ29tcHJlc3NPYmplY3RTdHJlYW06On5DWEZBX0NvbXByZXNzT2JqZWN0U3RyZWFtKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbXByZXNzb2JqZWN0c3RyZWFtLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21wcmVzc29iamVjdHN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZTAyY2UKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21wcmVzc29iamVjdHN0cmVhbS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DT01QUkVTU09CSkVDVFNUUkVBTV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DT01QUkVTU09CSkVDVFNUUkVBTV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0NvbXByZXNzT2JqZWN0U3RyZWFtIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0NvbXByZXNzT2JqZWN0U3RyZWFtKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfQ29tcHJlc3NPYmplY3RTdHJlYW0oKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ09NUFJFU1NPQkpFQ1RTVFJFQU1fSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbmZpZy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25maWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MjMyYTIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25maWcuY3BwCkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbmZpZy5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpQcmVzZW50LCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OkFjcm9iYXQsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6VHJhY2UsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImNvbmZpZyI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0NvbmZpZzo6Q1hGQV9Db25maWcoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6TW9kZWxOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpDb25maWcsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9Db25maWc6On5DWEZBX0NvbmZpZygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25maWcuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZGI2OTIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25maWcuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ09ORklHX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NPTkZJR19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0NvbmZpZyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9Db25maWcoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9Db25maWcoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ09ORklHX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25mb3JtYW5jZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25mb3JtYW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgzYzhlYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbmZvcm1hbmNlLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25mb3JtYW5jZS5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiY29uZm9ybWFuY2UiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9Db25mb3JtYW5jZTo6Q1hGQV9Db25mb3JtYW5jZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6Q29uZm9ybWFuY2UsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9Db25mb3JtYW5jZTo6fkNYRkFfQ29uZm9ybWFuY2UoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29uZm9ybWFuY2UuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbmZvcm1hbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFhNzJlNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbmZvcm1hbmNlLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NPTkZPUk1BTkNFX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NPTkZPUk1BTkNFX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfQ29uZm9ybWFuY2UgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfQ29uZm9ybWFuY2UoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9Db25mb3JtYW5jZSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DT05GT1JNQU5DRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29ubmVjdC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25uZWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDY0OGY0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29ubmVjdC5jcHAKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29ubmVjdC5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2Nvbm5lY3QuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHsKKyAgICB7WEZBX0VsZW1lbnQ6OlBpY3R1cmUsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6Q29ubmVjdFN0cmluZywgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpVc2VyLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlBhc3N3b3JkLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6UmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlRpbWVvdXQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMTV9LAorICAgIHtYRkFfQXR0cmlidXRlOjpDb25uZWN0aW9uLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2FnZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6RXhwb3J0QW5kSW1wb3J0fSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVsYXllZE9wZW4sIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImNvbm5lY3QiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9Db25uZWN0OjpDWEZBX0Nvbm5lY3QoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwKKyAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6Q29ubmVjdCwKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfQ29ubmVjdD4odGhpcykpIHt9CisKK0NYRkFfQ29ubmVjdDo6fkNYRkFfQ29ubmVjdCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25uZWN0LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25uZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM5MTU3NwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Nvbm5lY3QuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ09OTkVDVF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DT05ORUNUX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfQ29ubmVjdCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9Db25uZWN0KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfQ29ubmVjdCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DT05ORUNUX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25uZWN0aW9uc2V0LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Nvbm5lY3Rpb25zZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZjAyZTAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25uZWN0aW9uc2V0LmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25uZWN0aW9uc2V0LmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbW9kZWwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImNvbm5lY3Rpb25TZXQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9Db25uZWN0aW9uU2V0OjpDWEZBX0Nvbm5lY3Rpb25TZXQoQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpNb2RlbE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkNvbm5lY3Rpb25TZXQsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfTW9kZWw+KHRoaXMpKSB7fQorCitDWEZBX0Nvbm5lY3Rpb25TZXQ6On5DWEZBX0Nvbm5lY3Rpb25TZXQoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29ubmVjdGlvbnNldC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29ubmVjdGlvbnNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MzE2ZjcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25uZWN0aW9uc2V0LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NPTk5FQ1RJT05TRVRfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ09OTkVDVElPTlNFVF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0Nvbm5lY3Rpb25TZXQgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfQ29ubmVjdGlvblNldChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0Nvbm5lY3Rpb25TZXQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ09OTkVDVElPTlNFVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29ubmVjdHN0cmluZy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25uZWN0c3RyaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2ViNzBkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29ubmVjdHN0cmluZy5jcHAKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29ubmVjdHN0cmluZy5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2Nvbm5lY3RzdHJpbmcuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJjb25uZWN0U3RyaW5nIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfQ29ubmVjdFN0cmluZzo6Q1hGQV9Db25uZWN0U3RyaW5nKENYRkFfRG9jdW1lbnQqIGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpUZXh0Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6Q29ubmVjdFN0cmluZywKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfQ29ubmVjdFN0cmluZz4odGhpcykpIHt9CisKK0NYRkFfQ29ubmVjdFN0cmluZzo6fkNYRkFfQ29ubmVjdFN0cmluZygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25uZWN0c3RyaW5nLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25uZWN0c3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzYTBiMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Nvbm5lY3RzdHJpbmcuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ09OTkVDVFNUUklOR19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DT05ORUNUU1RSSU5HX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfQ29ubmVjdFN0cmluZyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9Db25uZWN0U3RyaW5nKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfQ29ubmVjdFN0cmluZygpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DT05ORUNUU1RSSU5HX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb250YWluZXJsYXlvdXRpdGVtLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbnRhaW5lcmxheW91dGl0ZW0uY3BwCmluZGV4IDVlZjI5ZjEuLmVlMTIyYjYgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbnRhaW5lcmxheW91dGl0ZW0uY3BwCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbnRhaW5lcmxheW91dGl0ZW0uY3BwCkBAIC02LDkgKzYsMTIgQEAKIAogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbnRhaW5lcmxheW91dGl0ZW0uaCIKIAorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9vYmplY3QuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXRwYWdlbWdyLmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0cHJvY2Vzc29yLmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVhc3VyZW1lbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWRpdW0uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCiAKIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbTo6Q1hGQV9Db250YWluZXJMYXlvdXRJdGVtKENYRkFfTm9kZSogcE5vZGUpCiAgICAgOiBDWEZBX0xheW91dEl0ZW0ocE5vZGUsIGZhbHNlKSwgbV9wT2xkU3ViZm9ybShudWxscHRyKSB7fQpAQCAtMjYsMTQgKzI5LDE5IEBACiAKIENGWF9TaXplRiBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW06OkdldFBhZ2VTaXplKCkgY29uc3QgewogICBDRlhfU2l6ZUYgc2l6ZTsKLSAgQ1hGQV9Ob2RlKiBwTWVkaXVtID0gbV9wRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpNZWRpdW0pOworICBDWEZBX01lZGl1bSogcE1lZGl1bSA9CisgICAgICBtX3BGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9NZWRpdW0+KFhGQV9FbGVtZW50OjpNZWRpdW0pOwogICBpZiAoIXBNZWRpdW0pCiAgICAgcmV0dXJuIHNpemU7CiAKLSAgc2l6ZSA9IENGWF9TaXplRihwTWVkaXVtLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU2hvcnQpLlRvVW5pdChYRkFfVU5JVF9QdCksCi0gICAgICAgICAgICAgICAgICAgcE1lZGl1bS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0xvbmcpLlRvVW5pdChYRkFfVU5JVF9QdCkpOwotICBpZiAocE1lZGl1bS0+R2V0RW51bShYRkFfQVRUUklCVVRFX09yaWVudGF0aW9uKSA9PQotICAgICAgWEZBX0FUVFJJQlVURUVOVU1fTGFuZHNjYXBlKSB7CisgIHNpemUgPSBDRlhfU2l6ZUYocE1lZGl1bS0+SlNPYmplY3QoKQorICAgICAgICAgICAgICAgICAgICAgICAtPkdldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6U2hvcnQpCisgICAgICAgICAgICAgICAgICAgICAgIC5Ub1VuaXQoWEZBX1VuaXQ6OlB0KSwKKyAgICAgICAgICAgICAgICAgICBwTWVkaXVtLT5KU09iamVjdCgpCisgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0TWVhc3VyZShYRkFfQXR0cmlidXRlOjpMb25nKQorICAgICAgICAgICAgICAgICAgICAgICAuVG9Vbml0KFhGQV9Vbml0OjpQdCkpOworICBpZiAocE1lZGl1bS0+SlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpPcmllbnRhdGlvbikgPT0KKyAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpMYW5kc2NhcGUpIHsKICAgICBzaXplID0gQ0ZYX1NpemVGKHNpemUuaGVpZ2h0LCBzaXplLndpZHRoKTsKICAgfQogICByZXR1cm4gc2l6ZTsKZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbnRlbnRhcmVhLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbnRlbnRhcmVhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGY1MmY3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29udGVudGFyZWEuY3BwCkBAIC0wLDAgKzEsNDQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbnRlbnRhcmVhLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfY29udGVudGFyZWEuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6OkRlc2MsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpILCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlcsIFhGQV9BdHRyaWJ1dGVUeXBlOjpNZWFzdXJlLCAodm9pZCopTCIwaW4ifSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6WCwgWEZBX0F0dHJpYnV0ZVR5cGU6Ok1lYXN1cmUsICh2b2lkKilMIjBpbiJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpZLCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlJlbGV2YW50LCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJjb250ZW50QXJlYSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0NvbnRlbnRBcmVhOjpDWEZBX0NvbnRlbnRBcmVhKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250YWluZXJOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpDb250ZW50QXJlYSwKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfQ29udGVudEFyZWE+KHRoaXMpKSB7fQorCitDWEZBX0NvbnRlbnRBcmVhOjp+Q1hGQV9Db250ZW50QXJlYSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb250ZW50YXJlYS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29udGVudGFyZWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzVmZjYwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29udGVudGFyZWEuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ09OVEVOVEFSRUFfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ09OVEVOVEFSRUFfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9Db250ZW50QXJlYSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9Db250ZW50QXJlYShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0NvbnRlbnRBcmVhKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NPTlRFTlRBUkVBX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb250ZW50Y29weS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb250ZW50Y29weS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1ZDU3NgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbnRlbnRjb3B5LmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb250ZW50Y29weS5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiY29udGVudENvcHkiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9Db250ZW50Q29weTo6Q1hGQV9Db250ZW50Q29weShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6Q29udGVudENvcHksCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9Db250ZW50Q29weTo6fkNYRkFfQ29udGVudENvcHkoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29udGVudGNvcHkuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbnRlbnRjb3B5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5NGM3NAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbnRlbnRjb3B5LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NPTlRFTlRDT1BZX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NPTlRFTlRDT1BZX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfQ29udGVudENvcHkgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfQ29udGVudENvcHkoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9Db250ZW50Q29weSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DT05URU5UQ09QWV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29udGVudGxheW91dGl0ZW0uY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29udGVudGxheW91dGl0ZW0uY3BwCmluZGV4IGExMGE2NzguLjFlZTM2NGIgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbnRlbnRsYXlvdXRpdGVtLmNwcAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb250ZW50bGF5b3V0aXRlbS5jcHAKQEAgLTYsNiArNiw5IEBACiAKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb250ZW50bGF5b3V0aXRlbS5oIgogCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X29iamVjdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKwogQ1hGQV9Db250ZW50TGF5b3V0SXRlbTo6Q1hGQV9Db250ZW50TGF5b3V0SXRlbShDWEZBX05vZGUqIHBOb2RlKQogICAgIDogQ1hGQV9MYXlvdXRJdGVtKHBOb2RlLCB0cnVlKSwKICAgICAgIG1fcFByZXYobnVsbHB0ciksCkBAIC0xMyw2ICsxNiw2IEBACiAgICAgICBtX2R3U3RhdHVzKDApIHt9CiAKIENYRkFfQ29udGVudExheW91dEl0ZW06On5DWEZBX0NvbnRlbnRMYXlvdXRJdGVtKCkgewotICBpZiAobV9wRm9ybU5vZGUtPkdldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZKSA9PSB0aGlzKQotICAgIG1fcEZvcm1Ob2RlLT5TZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSwgbnVsbHB0cik7CisgIGlmIChtX3BGb3JtTm9kZS0+SlNPYmplY3QoKS0+R2V0TGF5b3V0SXRlbSgpID09IHRoaXMpCisgICAgbV9wRm9ybU5vZGUtPkpTT2JqZWN0KCktPlNldExheW91dEl0ZW0obnVsbHB0cik7CiB9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb250ZW50bGF5b3V0aXRlbS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29udGVudGxheW91dGl0ZW0uaAppbmRleCA5YWMxZGNlLi41MDBkM2U0IDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb250ZW50bGF5b3V0aXRlbS5oCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvbnRlbnRsYXlvdXRpdGVtLmgKQEAgLTE4LDcgKzE4LDcgQEAKICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogbV9wTmV4dDsKICAgQ0ZYX1BvaW50RiBtX3NQb3M7CiAgIENGWF9TaXplRiBtX3NTaXplOwotICB1aW50MzJfdCBtX2R3U3RhdHVzOworICBtdXRhYmxlIHVpbnQzMl90IG1fZHdTdGF0dXM7CiB9OwogCiBpbmxpbmUgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogVG9Db250ZW50TGF5b3V0SXRlbShDWEZBX0xheW91dEl0ZW0qIHBJdGVtKSB7CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb3BpZXMuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29waWVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGRmMDdmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29waWVzLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb3BpZXMuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImNvcGllcyI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0NvcGllczo6Q1hGQV9Db3BpZXMoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkNvcGllcywKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0NvcGllczo6fkNYRkFfQ29waWVzKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvcGllcy5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29waWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVjZDYxNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2NvcGllcy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DT1BJRVNfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ09QSUVTX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfQ29waWVzIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0NvcGllcyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0NvcGllcygpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DT1BJRVNfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2Nvcm5lci5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb3JuZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZDNlZjQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb3JuZXIuY3BwCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2Nvcm5lci5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2Nvcm5lci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0ge3tYRkFfRWxlbWVudDo6Q29sb3IsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpTdHJva2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OlNvbGlkfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6UHJlc2VuY2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OlZpc2libGV9LAorICAgIHtYRkFfQXR0cmlidXRlOjpJbnZlcnRlZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkJvb2xlYW4sICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VGhpY2tuZXNzLCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMC41cHQifSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6Sm9pbiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6U3F1YXJlfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6UmFkaXVzLCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImNvcm5lciI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0Nvcm5lcjo6Q1hGQV9Db3JuZXIoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX1N0cm9rZShkb2MsCisgICAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpDb3JuZXIsCisgICAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfQ29ybmVyPih0aGlzKSkge30KKworQ1hGQV9Db3JuZXI6On5DWEZBX0Nvcm5lcigpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb3JuZXIuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Nvcm5lci5oCmluZGV4IDc2NjVjNTMuLjEwNDI3MjkgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2Nvcm5lci5oCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Nvcm5lci5oCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKQEAgLTksMTEgKzksMTAgQEAKIAogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3N0cm9rZS5oIgogCi1jbGFzcyBDWEZBX05vZGU7Ci0KIGNsYXNzIENYRkFfQ29ybmVyIDogcHVibGljIENYRkFfU3Ryb2tlIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfQ29ybmVyKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9TdHJva2UocE5vZGUpIHt9CisgIENYRkFfQ29ybmVyKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfQ29ybmVyKCkgb3ZlcnJpZGU7CiB9OwogCiAjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NPUk5FUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY3JlYXRvci5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jcmVhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTY1MDY4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY3JlYXRvci5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY3JlYXRvci5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiY3JlYXRvciI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0NyZWF0b3I6OkNYRkFfQ3JlYXRvcihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6Q3JlYXRvciwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0NyZWF0b3I6On5DWEZBX0NyZWF0b3IoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY3JlYXRvci5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY3JlYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNDY4ODMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jcmVhdG9yLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NSRUFUT1JfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ1JFQVRPUl9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0NyZWF0b3IgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfQ3JlYXRvcihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0NyZWF0b3IoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ1JFQVRPUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY3VycmVuY3lzeW1ib2wuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY3VycmVuY3lzeW1ib2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMTFmMjcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jdXJyZW5jeXN5bWJvbC5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY3VycmVuY3lzeW1ib2wuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OlN5bWJvbH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImN1cnJlbmN5U3ltYm9sIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfQ3VycmVuY3lTeW1ib2w6OkNYRkFfQ3VycmVuY3lTeW1ib2woQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkN1cnJlbmN5U3ltYm9sLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfQ3VycmVuY3lTeW1ib2w6On5DWEZBX0N1cnJlbmN5U3ltYm9sKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2N1cnJlbmN5c3ltYm9sLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jdXJyZW5jeXN5bWJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MWY3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jdXJyZW5jeXN5bWJvbC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DVVJSRU5DWVNZTUJPTF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DVVJSRU5DWVNZTUJPTF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0N1cnJlbmN5U3ltYm9sIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0N1cnJlbmN5U3ltYm9sKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfQ3VycmVuY3lTeW1ib2woKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ1VSUkVOQ1lTWU1CT0xfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2N1cnJlbmN5c3ltYm9scy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jdXJyZW5jeXN5bWJvbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNjBiZTkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jdXJyZW5jeXN5bWJvbHMuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2N1cnJlbmN5c3ltYm9scy5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7CisgICAge1hGQV9FbGVtZW50OjpDdXJyZW5jeVN5bWJvbCwgMywgMH0sCisgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImN1cnJlbmN5U3ltYm9scyI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0N1cnJlbmN5U3ltYm9sczo6Q1hGQV9DdXJyZW5jeVN5bWJvbHMoQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpDdXJyZW5jeVN5bWJvbHMsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0N1cnJlbmN5U3ltYm9sczo6fkNYRkFfQ3VycmVuY3lTeW1ib2xzKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2N1cnJlbmN5c3ltYm9scy5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY3VycmVuY3lzeW1ib2xzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkM2YyYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2N1cnJlbmN5c3ltYm9scy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DVVJSRU5DWVNZTUJPTFNfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ1VSUkVOQ1lTWU1CT0xTX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfQ3VycmVuY3lTeW1ib2xzIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0N1cnJlbmN5U3ltYm9scyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0N1cnJlbmN5U3ltYm9scygpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9DVVJSRU5DWVNZTUJPTFNfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2N1cnJlbnRwYWdlLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2N1cnJlbnRwYWdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTIwMGU0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY3VycmVudHBhZ2UuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2N1cnJlbnRwYWdlLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJjdXJyZW50UGFnZSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0N1cnJlbnRQYWdlOjpDWEZBX0N1cnJlbnRQYWdlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpDdXJyZW50UGFnZSwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0N1cnJlbnRQYWdlOjp+Q1hGQV9DdXJyZW50UGFnZSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9jdXJyZW50cGFnZS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY3VycmVudHBhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTI2YjRhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY3VycmVudHBhZ2UuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ1VSUkVOVFBBR0VfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfQ1VSUkVOVFBBR0VfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9DdXJyZW50UGFnZSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9DdXJyZW50UGFnZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0N1cnJlbnRQYWdlKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0NVUlJFTlRQQUdFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGEuY3BwCmluZGV4IDE5Zjg1MDguLjZmZDY2YTkgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGEuY3BwCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGEuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKQEAgLTYsNzcgKzYsMzIgQEAKIAogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGEuaCIKIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVhc3VyZW1lbnQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oIgorbmFtZXNwYWNlIHsKIAotLy8gU3RhdGljLgotRlhfQVJHQiBDWEZBX0RhdGE6OlRvQ29sb3IoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlKSB7Ci0gIHVpbnQ4X3QgciA9IDAsIGcgPSAwLCBiID0gMDsKLSAgaWYgKHdzVmFsdWUuR2V0TGVuZ3RoKCkgPT0gMCkKLSAgICByZXR1cm4gMHhmZjAwMDAwMDsKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHsKKyAgICB7WEZBX0VsZW1lbnQ6OlVyaSwgMSwgMH0sICAgICAgICB7WEZBX0VsZW1lbnQ6OlhzbCwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpTdGFydE5vZGUsIDEsIDB9LCAge1hGQV9FbGVtZW50OjpPdXRwdXRYU0wsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6QWRqdXN0RGF0YSwgMSwgMH0sIHtYRkFfRWxlbWVudDo6QXR0cmlidXRlcywgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpXaW5kb3csIDEsIDB9LCAgICAge1hGQV9FbGVtZW50OjpSZWNvcmQsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6UmFuZ2UsIDEsIDB9LCAgICAgIHtYRkFfRWxlbWVudDo6SW5jcmVtZW50YWxMb2FkLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OwogCi0gIGludCBjYyA9IDA7Ci0gIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSB3c1ZhbHVlLmNfc3RyKCk7Ci0gIGludCBsZW4gPSB3c1ZhbHVlLkdldExlbmd0aCgpOwotICB3aGlsZSAoRlhTWVNfaXN3c3BhY2Uoc3RyW2NjXSkgJiYgY2MgPCBsZW4pCi0gICAgY2MrKzsKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImRhdGEiOwogCi0gIGlmIChjYyA+PSBsZW4pCi0gICAgcmV0dXJuIDB4ZmYwMDAwMDA7Cit9ICAvLyBuYW1lc3BhY2UKIAotICB3aGlsZSAoY2MgPCBsZW4pIHsKLSAgICBpZiAoc3RyW2NjXSA9PSAnLCcgfHwgIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKQotICAgICAgYnJlYWs7CitDWEZBX0RhdGE6OkNYRkFfRGF0YShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpEYXRhLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CiAKLSAgICByID0gciAqIDEwICsgc3RyW2NjXSAtICcwJzsKLSAgICBjYysrOwotICB9Ci0gIGlmIChjYyA8IGxlbiAmJiBzdHJbY2NdID09ICcsJykgewotICAgIGNjKys7Ci0gICAgd2hpbGUgKEZYU1lTX2lzd3NwYWNlKHN0cltjY10pICYmIGNjIDwgbGVuKQotICAgICAgY2MrKzsKLQotICAgIHdoaWxlIChjYyA8IGxlbikgewotICAgICAgaWYgKHN0cltjY10gPT0gJywnIHx8ICFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGcgPSBnICogMTAgKyBzdHJbY2NdIC0gJzAnOwotICAgICAgY2MrKzsKLSAgICB9Ci0gICAgaWYgKGNjIDwgbGVuICYmIHN0cltjY10gPT0gJywnKSB7Ci0gICAgICBjYysrOwotICAgICAgd2hpbGUgKEZYU1lTX2lzd3NwYWNlKHN0cltjY10pICYmIGNjIDwgbGVuKQotICAgICAgICBjYysrOwotCi0gICAgICB3aGlsZSAoY2MgPCBsZW4pIHsKLSAgICAgICAgaWYgKHN0cltjY10gPT0gJywnIHx8ICFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBiID0gYiAqIDEwICsgc3RyW2NjXSAtICcwJzsKLSAgICAgICAgY2MrKzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuICgweGZmIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYjsKLX0KLQotWEZBX0VsZW1lbnQgQ1hGQV9EYXRhOjpHZXRFbGVtZW50VHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRFbGVtZW50VHlwZSgpIDogWEZBX0VsZW1lbnQ6OlVua25vd247Ci19Ci0KLWJvb2wgQ1hGQV9EYXRhOjpUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEUgZUF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZlZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVXNlRGVmYXVsdCkgY29uc3QgewotICBDWEZBX01lYXN1cmVtZW50IG1zOwotICBpZiAobV9wTm9kZS0+VHJ5TWVhc3VyZShlQXR0ciwgbXMsIGJVc2VEZWZhdWx0KSkgewotICAgIGZWYWx1ZSA9IG1zLlRvVW5pdChYRkFfVU5JVF9QdCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfRGF0YTo6U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFIGVBdHRyLCBGWF9GTE9BVCBmVmFsdWUpIHsKLSAgQ1hGQV9NZWFzdXJlbWVudCBtcyhmVmFsdWUsIFhGQV9VTklUX1B0KTsKLSAgcmV0dXJuIG1fcE5vZGUtPlNldE1lYXN1cmUoZUF0dHIsIG1zKTsKLX0KK0NYRkFfRGF0YTo6fkNYRkFfRGF0YSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhLmgKaW5kZXggODkwNDg2ZC4uY2IzMGY2MSAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YS5oCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGEuaApAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCkBAIC03LDI5ICs3LDEyIEBACiAjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RBVEFfSF8KICNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREFUQV9IXwogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvZnhmYV9iYXNpYy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKIAotY2xhc3MgQ1hGQV9Ob2RlOwotCi1jbGFzcyBDWEZBX0RhdGEgeworY2xhc3MgQ1hGQV9EYXRhIDogcHVibGljIENYRkFfTm9kZSB7CiAgcHVibGljOgotICBzdGF0aWMgRlhfQVJHQiBUb0NvbG9yKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSk7Ci0KLSAgZXhwbGljaXQgQ1hGQV9EYXRhKENYRkFfTm9kZSogcE5vZGUpIDogbV9wTm9kZShwTm9kZSkge30KLQotICBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gISFtX3BOb2RlOyB9Ci0gIENYRkFfTm9kZSogR2V0Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fcE5vZGU7IH0KLSAgWEZBX0VsZW1lbnQgR2V0RWxlbWVudFR5cGUoKSBjb25zdDsKLQotIHByb3RlY3RlZDoKLSAgYm9vbCBUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEUgZUF0dHIsCi0gICAgICAgICAgICAgICAgICBGWF9GTE9BVCYgZlZhbHVlLAotICAgICAgICAgICAgICAgICAgYm9vbCBiVXNlRGVmYXVsdCA9IGZhbHNlKSBjb25zdDsKLSAgYm9vbCBTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEUgZUF0dHIsIEZYX0ZMT0FUIGZWYWx1ZSk7Ci0KLSAgQ1hGQV9Ob2RlKiBtX3BOb2RlOworICBDWEZBX0RhdGEoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9EYXRhKCkgb3ZlcnJpZGU7CiB9OwogCiAjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RBVEFfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGFleHBvcnRlci5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhZXhwb3J0ZXIuY3BwCmluZGV4IGZlOTk0NzUuLjIzZmMxNzggMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGFleHBvcnRlci5jcHAKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YWV4cG9ydGVyLmNwcApAQCAtNiw1MTUgKzYsNzggQEAKIAogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGFleHBvcnRlci5oIgogCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29kZXBhZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sZG9jLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbGVsZW1lbnQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sbm9kZS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL3htbC9mZGVfeG1sX2ltcC5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2NydC9mZ2FzX2NvZGVwYWdlLmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV93aWRnZXRkYXRhLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKLQotbmFtZXNwYWNlIHsKLQotQ0ZYX1dpZGVTdHJpbmcgRXhwb3J0RW5jb2RlQXR0cmlidXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHIpIHsKLSAgQ0ZYX1dpZGVUZXh0QnVmIHRleHRCdWY7Ci0gIGludDMyX3QgaUxlbiA9IHN0ci5HZXRMZW5ndGgoKTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxlbjsgaSsrKSB7Ci0gICAgc3dpdGNoIChzdHJbaV0pIHsKLSAgICAgIGNhc2UgJyYnOgotICAgICAgICB0ZXh0QnVmIDw8IEwiJmFtcDsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJzwnOgotICAgICAgICB0ZXh0QnVmIDw8IEwiJmx0OyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAnPic6Ci0gICAgICAgIHRleHRCdWYgPDwgTCImZ3Q7IjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlICdcJyc6Ci0gICAgICAgIHRleHRCdWYgPDwgTCImYXBvczsiOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgJ1wiJzoKLSAgICAgICAgdGV4dEJ1ZiA8PCBMIiZxdW90OyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGV4dEJ1Zi5BcHBlbmRDaGFyKHN0cltpXSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0ZXh0QnVmLk1ha2VTdHJpbmcoKTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgRXhwb3J0RW5jb2RlQ29udGVudChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0cikgewotICBDRlhfV2lkZVRleHRCdWYgdGV4dEJ1ZjsKLSAgaW50MzJfdCBpTGVuID0gc3RyLkdldExlbmd0aCgpOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGVuOyBpKyspIHsKLSAgICBGWF9XQ0hBUiBjaCA9IHN0ci5HZXRBdChpKTsKLSAgICBpZiAoIUZERV9Jc1hNTFZhbGlkQ2hhcihjaCkpCi0gICAgICBjb250aW51ZTsKLQotICAgIGlmIChjaCA9PSAnJicpIHsKLSAgICAgIHRleHRCdWYgPDwgTCImYW1wOyI7Ci0gICAgfSBlbHNlIGlmIChjaCA9PSAnPCcpIHsKLSAgICAgIHRleHRCdWYgPDwgTCImbHQ7IjsKLSAgICB9IGVsc2UgaWYgKGNoID09ICc+JykgewotICAgICAgdGV4dEJ1ZiA8PCBMIiZndDsiOwotICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1wnJykgewotICAgICAgdGV4dEJ1ZiA8PCBMIiZhcG9zOyI7Ci0gICAgfSBlbHNlIGlmIChjaCA9PSAnXCInKSB7Ci0gICAgICB0ZXh0QnVmIDw8IEwiJnF1b3Q7IjsKLSAgICB9IGVsc2UgaWYgKGNoID09ICcgJykgewotICAgICAgaWYgKGkgJiYgc3RyLkdldEF0KGkgLSAxKSAhPSAnICcpIHsKLSAgICAgICAgdGV4dEJ1Zi5BcHBlbmRDaGFyKCcgJyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0ZXh0QnVmIDw8IEwiJiN4MjA7IjsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgdGV4dEJ1Zi5BcHBlbmRDaGFyKHN0ci5HZXRBdChpKSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0ZXh0QnVmLk1ha2VTdHJpbmcoKTsKLX0KLQotdm9pZCBTYXZlQXR0cmlidXRlKENYRkFfTm9kZSogcE5vZGUsCi0gICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSwKLSAgICAgICAgICAgICAgICAgICBib29sIGJQcm90bywKLSAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsKLSAgaWYgKCghYlByb3RvICYmICFwTm9kZS0+SGFzQXR0cmlidXRlKChYRkFfQVRUUklCVVRFKWVOYW1lLCBiUHJvdG8pKSB8fAotICAgICAgIXBOb2RlLT5HZXRBdHRyaWJ1dGUoKFhGQV9BVFRSSUJVVEUpZU5hbWUsIHdzVmFsdWUsIGZhbHNlKSkgewotICAgIHJldHVybjsKLSAgfQotICB3c1ZhbHVlID0gRXhwb3J0RW5jb2RlQXR0cmlidXRlKHdzVmFsdWUpOwotICB3c091dHB1dCArPSBMIiAiOwotICB3c091dHB1dCArPSB3c05hbWU7Ci0gIHdzT3V0cHV0ICs9IEwiPVwiIjsKLSAgd3NPdXRwdXQgKz0gd3NWYWx1ZTsKLSAgd3NPdXRwdXQgKz0gTCJcIiI7Ci19Ci0KLWJvb2wgQXR0cmlidXRlU2F2ZUluRGF0YU1vZGVsKENYRkFfTm9kZSogcE5vZGUsIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBib29sIGJTYXZlSW5EYXRhTW9kZWwgPSBmYWxzZTsKLSAgaWYgKHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpJbWFnZSkKLSAgICByZXR1cm4gYlNhdmVJbkRhdGFNb2RlbDsKLQotICBDWEZBX05vZGUqIHBWYWx1ZU5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7Ci0gIGlmICghcFZhbHVlTm9kZSB8fCBwVmFsdWVOb2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpWYWx1ZSkKLSAgICByZXR1cm4gYlNhdmVJbkRhdGFNb2RlbDsKLQotICBDWEZBX05vZGUqIHBGaWVsZE5vZGUgPSBwVmFsdWVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsKLSAgaWYgKHBGaWVsZE5vZGUgJiYgcEZpZWxkTm9kZS0+R2V0QmluZERhdGEoKSAmJgotICAgICAgZUF0dHJpYnV0ZSA9PSBYRkFfQVRUUklCVVRFX0hyZWYpIHsKLSAgICBiU2F2ZUluRGF0YU1vZGVsID0gdHJ1ZTsKLSAgfQotICByZXR1cm4gYlNhdmVJbkRhdGFNb2RlbDsKLX0KLQotYm9vbCBDb250ZW50Tm9kZU5lZWR0b0V4cG9ydChDWEZBX05vZGUqIHBDb250ZW50Tm9kZSkgewotICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7Ci0gIGlmICghcENvbnRlbnROb2RlLT5UcnlDb250ZW50KHdzQ29udGVudCwgZmFsc2UsIGZhbHNlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQVNTRVJUKHBDb250ZW50Tm9kZS0+SXNDb250ZW50Tm9kZSgpKTsKLSAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHBDb250ZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7Ci0gIGlmICghcFBhcmVudE5vZGUgfHwgcFBhcmVudE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlZhbHVlKQotICAgIHJldHVybiB0cnVlOwotCi0gIENYRkFfTm9kZSogcEdyYW5kUGFyZW50Tm9kZSA9IHBQYXJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsKLSAgaWYgKCFwR3JhbmRQYXJlbnROb2RlIHx8ICFwR3JhbmRQYXJlbnROb2RlLT5Jc0NvbnRhaW5lck5vZGUoKSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgaWYgKHBHcmFuZFBhcmVudE5vZGUtPkdldEJpbmREYXRhKCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBwR3JhbmRQYXJlbnROb2RlLT5HZXRXaWRnZXREYXRhKCk7Ci0gIFhGQV9FbGVtZW50IGVVSVR5cGUgPSBwV2lkZ2V0RGF0YS0+R2V0VUlUeXBlKCk7Ci0gIGlmIChlVUlUeXBlID09IFhGQV9FbGVtZW50OjpQYXNzd29yZEVkaXQpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBSZWNvZ25pemVYRkFWZXJzaW9uTnVtYmVyKENYRkFfTm9kZSogcFRlbXBsYXRlUm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWZXJzaW9uTnVtYmVyKSB7Ci0gIHdzVmVyc2lvbk51bWJlci5jbGVhcigpOwotICBpZiAoIXBUZW1wbGF0ZVJvb3QpCi0gICAgcmV0dXJuOwotCi0gIENGWF9XaWRlU3RyaW5nIHdzVGVtcGxhdGVOUzsKLSAgaWYgKCFwVGVtcGxhdGVSb290LT5UcnlOYW1lc3BhY2Uod3NUZW1wbGF0ZU5TKSkKLSAgICByZXR1cm47Ci0KLSAgWEZBX1ZFUlNJT04gZVZlcnNpb24gPQotICAgICAgcFRlbXBsYXRlUm9vdC0+R2V0RG9jdW1lbnQoKS0+UmVjb2duaXplWEZBVmVyc2lvbk51bWJlcih3c1RlbXBsYXRlTlMpOwotICBpZiAoZVZlcnNpb24gPT0gWEZBX1ZFUlNJT05fVU5LTk9XTikKLSAgICBlVmVyc2lvbiA9IFhGQV9WRVJTSU9OX0RFRkFVTFQ7Ci0KLSAgd3NWZXJzaW9uTnVtYmVyLkZvcm1hdChMIiVpLiVpIiwgZVZlcnNpb24gLyAxMDAsIGVWZXJzaW9uICUgMTAwKTsKLX0KLQotdm9pZCBSZWdlbmVyYXRlRm9ybUZpbGVfQ2hhbmdlZChDWEZBX05vZGUqIHBOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVRleHRCdWYmIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2F2ZVhNTCkgewotICBDRlhfV2lkZVN0cmluZyB3c0F0dHJzOwotICBpbnQzMl90IGlBdHRycyA9IDA7Ci0gIGNvbnN0IHVpbnQ4X3QqIHBBdHRycyA9Ci0gICAgICBYRkFfR2V0RWxlbWVudEF0dHJpYnV0ZXMocE5vZGUtPkdldEVsZW1lbnRUeXBlKCksIGlBdHRycyk7Ci0gIHdoaWxlIChpQXR0cnMtLSkgewotICAgIGNvbnN0IFhGQV9BVFRSSUJVVEVJTkZPKiBwQXR0ciA9Ci0gICAgICAgIFhGQV9HZXRBdHRyaWJ1dGVCeUlEKChYRkFfQVRUUklCVVRFKXBBdHRyc1tpQXR0cnNdKTsKLSAgICBpZiAocEF0dHItPmVOYW1lID09IFhGQV9BVFRSSUJVVEVfTmFtZSB8fAotICAgICAgICAoQXR0cmlidXRlU2F2ZUluRGF0YU1vZGVsKHBOb2RlLCBwQXR0ci0+ZU5hbWUpICYmICFiU2F2ZVhNTCkpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHI7Ci0gICAgU2F2ZUF0dHJpYnV0ZShwTm9kZSwgcEF0dHItPmVOYW1lLCBwQXR0ci0+cE5hbWUsIGJTYXZlWE1MLCB3c0F0dHIpOwotICAgIHdzQXR0cnMgKz0gd3NBdHRyOwotICB9Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGlsZHJlbjsKLSAgc3dpdGNoIChwTm9kZS0+R2V0T2JqZWN0VHlwZSgpKSB7Ci0gICAgY2FzZSBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGU6IHsKLSAgICAgIGlmICghYlNhdmVYTUwgJiYgIUNvbnRlbnROb2RlTmVlZHRvRXhwb3J0KHBOb2RlKSkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIENYRkFfTm9kZSogcFJhd1ZhbHVlTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gICAgICB3aGlsZSAocFJhd1ZhbHVlTm9kZSAmJgotICAgICAgICAgICAgIHBSYXdWYWx1ZU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlNoYXJweEhUTUwgJiYKLSAgICAgICAgICAgICBwUmF3VmFsdWVOb2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpTaGFycHRleHQgJiYKLSAgICAgICAgICAgICBwUmF3VmFsdWVOb2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpTaGFycHhtbCkgewotICAgICAgICBwUmF3VmFsdWVOb2RlID0gcFJhd1ZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsKLSAgICAgIH0KLSAgICAgIGlmICghcFJhd1ZhbHVlTm9kZSkKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudFR5cGU7Ci0gICAgICBwTm9kZS0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUsIGZhbHNlKTsKLSAgICAgIGlmIChwUmF3VmFsdWVOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpTaGFycHhIVE1MICYmCi0gICAgICAgICAgd3NDb250ZW50VHlwZSA9PSBMInRleHQvaHRtbCIpIHsKLSAgICAgICAgQ0ZERV9YTUxOb2RlKiBwRXhEYXRhWE1MID0gcE5vZGUtPkdldFhNTE1hcHBpbmdOb2RlKCk7Ci0gICAgICAgIGlmICghcEV4RGF0YVhNTCkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBDRkRFX1hNTE5vZGUqIHBSaWNoVGV4dFhNTCA9Ci0gICAgICAgICAgICBwRXhEYXRhWE1MLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOwotICAgICAgICBpZiAoIXBSaWNoVGV4dFhNTCkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBDRlhfUmV0YWluUHRyPElGWF9NZW1vcnlTdHJlYW0+IHBNZW1TdHJlYW0gPQotICAgICAgICAgICAgSUZYX01lbW9yeVN0cmVhbTo6Q3JlYXRlKHRydWUpOwotCi0gICAgICAgIC8vIE5vdGU6IGFtYmlndW91cyB3aXRob3V0IGNhc3QgYmVsb3cuCi0gICAgICAgIENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiBwVGVtcFN0cmVhbSA9IElGR0FTX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKAotICAgICAgICAgICAgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVXcml0ZVN0cmVhbT4ocE1lbVN0cmVhbSksCi0gICAgICAgICAgICBGWF9TVFJFQU1BQ0NFU1NfVGV4dCB8IEZYX1NUUkVBTUFDQ0VTU19Xcml0ZSB8Ci0gICAgICAgICAgICAgICAgRlhfU1RSRUFNQUNDRVNTX0FwcGVuZCk7Ci0KLSAgICAgICAgcFRlbXBTdHJlYW0tPlNldENvZGVQYWdlKEZYX0NPREVQQUdFX1VURjgpOwotICAgICAgICBwUmljaFRleHRYTUwtPlNhdmVYTUxOb2RlKHBUZW1wU3RyZWFtKTsKLSAgICAgICAgd3NDaGlsZHJlbiArPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoCi0gICAgICAgICAgICBDRlhfQnl0ZVN0cmluZ0MocE1lbVN0cmVhbS0+R2V0QnVmZmVyKCksIHBNZW1TdHJlYW0tPkdldFNpemUoKSkpOwotICAgICAgfSBlbHNlIGlmIChwUmF3VmFsdWVOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpTaGFycHhtbCAmJgotICAgICAgICAgICAgICAgICB3c0NvbnRlbnRUeXBlID09IEwidGV4dC94bWwiKSB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzUmF3VmFsdWU7Ci0gICAgICAgIHBSYXdWYWx1ZU5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c1Jhd1ZhbHVlLCBmYWxzZSk7Ci0gICAgICAgIGlmICh3c1Jhd1ZhbHVlLklzRW1wdHkoKSkKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBzdGQ6OnZlY3RvcjxDRlhfV2lkZVN0cmluZz4gd3NTZWxUZXh0QXJyYXk7Ci0gICAgICAgIGludDMyX3QgaVN0YXJ0ID0gMDsKLSAgICAgICAgaW50MzJfdCBpRW5kID0gd3NSYXdWYWx1ZS5GaW5kKEwnXG4nLCBpU3RhcnQpOwotICAgICAgICBpRW5kID0gKGlFbmQgPT0gLTEpID8gd3NSYXdWYWx1ZS5HZXRMZW5ndGgoKSA6IGlFbmQ7Ci0gICAgICAgIHdoaWxlIChpRW5kID49IGlTdGFydCkgewotICAgICAgICAgIHdzU2VsVGV4dEFycmF5LnB1c2hfYmFjayh3c1Jhd1ZhbHVlLk1pZChpU3RhcnQsIGlFbmQgLSBpU3RhcnQpKTsKLSAgICAgICAgICBpU3RhcnQgPSBpRW5kICsgMTsKLSAgICAgICAgICBpZiAoaVN0YXJ0ID49IHdzUmF3VmFsdWUuR2V0TGVuZ3RoKCkpCi0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGlFbmQgPSB3c1Jhd1ZhbHVlLkZpbmQoTCdcbicsIGlTdGFydCk7Ci0gICAgICAgIH0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsKLSAgICAgICAgQVNTRVJUKHBQYXJlbnROb2RlKTsKLSAgICAgICAgQ1hGQV9Ob2RlKiBwR3JhbmRwYXJlbnROb2RlID0KLSAgICAgICAgICAgIHBQYXJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsKLSAgICAgICAgQVNTRVJUKHBHcmFuZHBhcmVudE5vZGUpOwotICAgICAgICBDRlhfV2lkZVN0cmluZyBib2R5VGFnTmFtZTsKLSAgICAgICAgYm9keVRhZ05hbWUgPSBwR3JhbmRwYXJlbnROb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOwotICAgICAgICBpZiAoYm9keVRhZ05hbWUuSXNFbXB0eSgpKQotICAgICAgICAgIGJvZHlUYWdOYW1lID0gTCJMaXN0Qm94MSI7Ci0KLSAgICAgICAgYnVmIDw8IEwiPCI7Ci0gICAgICAgIGJ1ZiA8PCBib2R5VGFnTmFtZTsKLSAgICAgICAgYnVmIDw8IEwiIHhtbG5zPVwiXCJcbj4iOwotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHdzU2VsVGV4dEFycmF5KTsKLSAgICAgICAgICAgICBpKyspIHsKLSAgICAgICAgICBidWYgPDwgTCI8dmFsdWVcbj4iOwotICAgICAgICAgIGJ1ZiA8PCBFeHBvcnRFbmNvZGVDb250ZW50KHdzU2VsVGV4dEFycmF5W2ldLkFzU3RyaW5nQygpKTsKLSAgICAgICAgICBidWYgPDwgTCI8L3ZhbHVlXG4+IjsKLSAgICAgICAgfQotICAgICAgICBidWYgPDwgTCI8LyI7Ci0gICAgICAgIGJ1ZiA8PCBib2R5VGFnTmFtZTsKLSAgICAgICAgYnVmIDw8IEwiXG4+IjsKLSAgICAgICAgd3NDaGlsZHJlbiArPSBidWYuQXNTdHJpbmdDKCk7Ci0gICAgICAgIGJ1Zi5DbGVhcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWUgPSBwUmF3VmFsdWVOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlKTsKLSAgICAgICAgd3NDaGlsZHJlbiArPSBFeHBvcnRFbmNvZGVDb250ZW50KHdzVmFsdWUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgWEZBX09iamVjdFR5cGU6OlRleHROb2RlOgotICAgIGNhc2UgWEZBX09iamVjdFR5cGU6Ok5vZGVDOgotICAgIGNhc2UgWEZBX09iamVjdFR5cGU6Ok5vZGVWOiB7Ci0gICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NWYWx1ZSA9IHBOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlKTsKLSAgICAgIHdzQ2hpbGRyZW4gKz0gRXhwb3J0RW5jb2RlQ29udGVudCh3c1ZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgaWYgKHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpJdGVtcykgewotICAgICAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUgPSBwTm9kZS0+R2V0VGVtcGxhdGVOb2RlKCk7Ci0gICAgICAgIGlmICghcFRlbXBsYXRlTm9kZSB8fAotICAgICAgICAgICAgcFRlbXBsYXRlTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRWxlbWVudDo6VW5rbm93bikgIT0KLSAgICAgICAgICAgICAgICBwTm9kZS0+Q291bnRDaGlsZHJlbihYRkFfRWxlbWVudDo6VW5rbm93bikpIHsKLSAgICAgICAgICBiU2F2ZVhNTCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIENGWF9XaWRlVGV4dEJ1ZiBuZXdCdWY7Ci0gICAgICBDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgd2hpbGUgKHBDaGlsZE5vZGUpIHsKLSAgICAgICAgUmVnZW5lcmF0ZUZvcm1GaWxlX0NoYW5nZWQocENoaWxkTm9kZSwgbmV3QnVmLCBiU2F2ZVhNTCk7Ci0gICAgICAgIHdzQ2hpbGRyZW4gKz0gbmV3QnVmLkFzU3RyaW5nQygpOwotICAgICAgICBuZXdCdWYuQ2xlYXIoKTsKLSAgICAgICAgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7Ci0gICAgICB9Ci0gICAgICBpZiAoIWJTYXZlWE1MICYmICF3c0NoaWxkcmVuLklzRW1wdHkoKSAmJgotICAgICAgICAgIHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpJdGVtcykgewotICAgICAgICB3c0NoaWxkcmVuLmNsZWFyKCk7Ci0gICAgICAgIGJTYXZlWE1MID0gdHJ1ZTsKLSAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgICB3aGlsZSAocENoaWxkKSB7Ci0gICAgICAgICAgUmVnZW5lcmF0ZUZvcm1GaWxlX0NoYW5nZWQocENoaWxkLCBuZXdCdWYsIGJTYXZlWE1MKTsKLSAgICAgICAgICB3c0NoaWxkcmVuICs9IG5ld0J1Zi5Bc1N0cmluZ0MoKTsKLSAgICAgICAgICBuZXdCdWYuQ2xlYXIoKTsKLSAgICAgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKCF3c0NoaWxkcmVuLklzRW1wdHkoKSB8fCAhd3NBdHRycy5Jc0VtcHR5KCkgfHwKLSAgICAgIHBOb2RlLT5IYXNBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9OYW1lKSkgewotICAgIENGWF9XaWRlU3RyaW5nQyB3c0VsZW1lbnQgPSBwTm9kZS0+R2V0Q2xhc3NOYW1lKCk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOwotICAgIFNhdmVBdHRyaWJ1dGUocE5vZGUsIFhGQV9BVFRSSUJVVEVfTmFtZSwgTCJuYW1lIiwgdHJ1ZSwgd3NOYW1lKTsKLSAgICBidWYgPDwgTCI8IjsKLSAgICBidWYgPDwgd3NFbGVtZW50OwotICAgIGJ1ZiA8PCB3c05hbWU7Ci0gICAgYnVmIDw8IHdzQXR0cnM7Ci0gICAgaWYgKHdzQ2hpbGRyZW4uSXNFbXB0eSgpKSB7Ci0gICAgICBidWYgPDwgTCJcbi8+IjsKLSAgICB9IGVsc2UgewotICAgICAgYnVmIDw8IEwiXG4+IjsKLSAgICAgIGJ1ZiA8PCB3c0NoaWxkcmVuOwotICAgICAgYnVmIDw8IEwiPC8iOwotICAgICAgYnVmIDw8IHdzRWxlbWVudDsKLSAgICAgIGJ1ZiA8PCBMIlxuPiI7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgUmVnZW5lcmF0ZUZvcm1GaWxlX0NvbnRhaW5lcihDWEZBX05vZGUqIHBOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiYgcFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTYXZlWE1MID0gZmFsc2UpIHsKLSAgWEZBX0VsZW1lbnQgZVR5cGUgPSBwTm9kZS0+R2V0RWxlbWVudFR5cGUoKTsKLSAgaWYgKGVUeXBlID09IFhGQV9FbGVtZW50OjpGaWVsZCB8fCBlVHlwZSA9PSBYRkFfRWxlbWVudDo6RHJhdyB8fAotICAgICAgIXBOb2RlLT5Jc0NvbnRhaW5lck5vZGUoKSkgewotICAgIENGWF9XaWRlVGV4dEJ1ZiBidWY7Ci0gICAgUmVnZW5lcmF0ZUZvcm1GaWxlX0NoYW5nZWQocE5vZGUsIGJ1ZiwgYlNhdmVYTUwpOwotICAgIEZYX1NUUlNJWkUgbkxlbiA9IGJ1Zi5HZXRMZW5ndGgoKTsKLSAgICBpZiAobkxlbiA+IDApCi0gICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZygoY29uc3QgRlhfV0NIQVIqKWJ1Zi5HZXRCdWZmZXIoKSwgbkxlbik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ0ZYX1dpZGVTdHJpbmdDIHdzRWxlbWVudCA9IHBOb2RlLT5HZXRDbGFzc05hbWUoKTsKLSAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoTCI8IiwgMSk7Ci0gIHBTdHJlYW0tPldyaXRlU3RyaW5nKHdzRWxlbWVudC5jX3N0cigpLCB3c0VsZW1lbnQuR2V0TGVuZ3RoKCkpOwotICBDRlhfV2lkZVN0cmluZyB3c091dHB1dDsKLSAgU2F2ZUF0dHJpYnV0ZShwTm9kZSwgWEZBX0FUVFJJQlVURV9OYW1lLCBMIm5hbWUiLCB0cnVlLCB3c091dHB1dCk7Ci0gIENGWF9XaWRlU3RyaW5nIHdzQXR0cnM7Ci0gIGludDMyX3QgaUF0dHJzID0gMDsKLSAgY29uc3QgdWludDhfdCogcEF0dHJzID0KLSAgICAgIFhGQV9HZXRFbGVtZW50QXR0cmlidXRlcyhwTm9kZS0+R2V0RWxlbWVudFR5cGUoKSwgaUF0dHJzKTsKLSAgd2hpbGUgKGlBdHRycy0tKSB7Ci0gICAgY29uc3QgWEZBX0FUVFJJQlVURUlORk8qIHBBdHRyID0KLSAgICAgICAgWEZBX0dldEF0dHJpYnV0ZUJ5SUQoKFhGQV9BVFRSSUJVVEUpcEF0dHJzW2lBdHRyc10pOwotICAgIGlmIChwQXR0ci0+ZU5hbWUgPT0gWEZBX0FUVFJJQlVURV9OYW1lKQotICAgICAgY29udGludWU7Ci0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHI7Ci0gICAgU2F2ZUF0dHJpYnV0ZShwTm9kZSwgcEF0dHItPmVOYW1lLCBwQXR0ci0+cE5hbWUsIGZhbHNlLCB3c0F0dHIpOwotICAgIHdzT3V0cHV0ICs9IHdzQXR0cjsKLSAgfQotCi0gIGlmICghd3NPdXRwdXQuSXNFbXB0eSgpKQotICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKHdzT3V0cHV0LmNfc3RyKCksIHdzT3V0cHV0LkdldExlbmd0aCgpKTsKLQotICBDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICBpZiAocENoaWxkTm9kZSkgewotICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKEwiXG4+IiwgMik7Ci0gICAgd2hpbGUgKHBDaGlsZE5vZGUpIHsKLSAgICAgIFJlZ2VuZXJhdGVGb3JtRmlsZV9Db250YWluZXIocENoaWxkTm9kZSwgcFN0cmVhbSwgYlNhdmVYTUwpOwotICAgICAgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7Ci0gICAgfQotICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKEwiPC8iLCAyKTsKLSAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyh3c0VsZW1lbnQuY19zdHIoKSwgd3NFbGVtZW50LkdldExlbmd0aCgpKTsKLSAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyhMIlxuPiIsIDIpOwotICB9IGVsc2UgewotICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKEwiXG4vPiIsIDMpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi12b2lkIFhGQV9EYXRhRXhwb3J0ZXJfUmVnZW5lcmF0ZUZvcm1GaWxlKAotICAgIENYRkFfTm9kZSogcE5vZGUsCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+JiBwU3RyZWFtLAotICAgIGNvbnN0IEZYX0NIQVIqIHBDaGVja3N1bSwKLSAgICBib29sIGJTYXZlWE1MKSB7Ci0gIGlmIChwTm9kZS0+SXNNb2RlbE5vZGUoKSkgewotICAgIHN0YXRpYyBjb25zdCBGWF9XQ0hBUiBzX3B3c1RhZ05hbWVbXSA9IEwiPGZvcm0iOwotICAgIHN0YXRpYyBjb25zdCBGWF9XQ0hBUiBzX3B3c0Nsb3NlW10gPSBMIjwvZm9ybVxuPiI7Ci0gICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoc19wd3NUYWdOYW1lLCBGWFNZU193Y3NsZW4oc19wd3NUYWdOYW1lKSk7Ci0gICAgaWYgKHBDaGVja3N1bSkgewotICAgICAgc3RhdGljIGNvbnN0IEZYX1dDSEFSIHNfcHdDaGVja3N1bVtdID0gTCIgY2hlY2tzdW09XCIiOwotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGVja3N1bSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChwQ2hlY2tzdW0pOwotICAgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoc19wd0NoZWNrc3VtLCBGWFNZU193Y3NsZW4oc19wd0NoZWNrc3VtKSk7Ci0gICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyh3c0NoZWNrc3VtLmNfc3RyKCksIHdzQ2hlY2tzdW0uR2V0TGVuZ3RoKCkpOwotICAgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoTCJcIiIsIDEpOwotICAgIH0KLSAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyhMIiB4bWxucz1cIiIsIEZYU1lTX3djc2xlbihMIiB4bWxucz1cIiIpKTsKLSAgICBjb25zdCBGWF9XQ0hBUiogcFVSSSA9IFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRm9ybSktPnBVUkk7Ci0gICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcocFVSSSwgRlhTWVNfd2NzbGVuKHBVUkkpKTsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZlcnNpb25OdW1iZXI7Ci0gICAgUmVjb2duaXplWEZBVmVyc2lvbk51bWJlcigKLSAgICAgICAgVG9Ob2RlKHBOb2RlLT5HZXREb2N1bWVudCgpLT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX1RlbXBsYXRlKSksCi0gICAgICAgIHdzVmVyc2lvbk51bWJlcik7Ci0gICAgaWYgKHdzVmVyc2lvbk51bWJlci5Jc0VtcHR5KCkpCi0gICAgICB3c1ZlcnNpb25OdW1iZXIgPSBMIjIuOCI7Ci0KLSAgICB3c1ZlcnNpb25OdW1iZXIgKz0gTCIvXCJcbj4iOwotICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKHdzVmVyc2lvbk51bWJlci5jX3N0cigpLCB3c1ZlcnNpb25OdW1iZXIuR2V0TGVuZ3RoKCkpOwotICAgIENYRkFfTm9kZSogcENoaWxkTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gICAgd2hpbGUgKHBDaGlsZE5vZGUpIHsKLSAgICAgIFJlZ2VuZXJhdGVGb3JtRmlsZV9Db250YWluZXIocENoaWxkTm9kZSwgcFN0cmVhbSk7Ci0gICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsKLSAgICB9Ci0gICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoc19wd3NDbG9zZSwgRlhTWVNfd2NzbGVuKHNfcHdzQ2xvc2UpKTsKLSAgfSBlbHNlIHsKLSAgICBSZWdlbmVyYXRlRm9ybUZpbGVfQ29udGFpbmVyKHBOb2RlLCBwU3RyZWFtLCBiU2F2ZVhNTCk7Ci0gIH0KLX0KLQotdm9pZCBYRkFfRGF0YUV4cG9ydGVyX0RlYWxXaXRoRGF0YUdyb3VwTm9kZShDWEZBX05vZGUqIHBEYXRhTm9kZSkgewotICBpZiAoIXBEYXRhTm9kZSB8fCBwRGF0YU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkRhdGFWYWx1ZSkKLSAgICByZXR1cm47Ci0KLSAgaW50MzJfdCBpQ2hpbGROdW0gPSAwOwotICBmb3IgKENYRkFfTm9kZSogcENoaWxkTm9kZSA9IHBEYXRhTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgIHBDaGlsZE5vZGU7Ci0gICAgICAgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsKLSAgICBpQ2hpbGROdW0rKzsKLSAgICBYRkFfRGF0YUV4cG9ydGVyX0RlYWxXaXRoRGF0YUdyb3VwTm9kZShwQ2hpbGROb2RlKTsKLSAgfQotCi0gIGlmIChwRGF0YU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OkRhdGFHcm91cCkKLSAgICByZXR1cm47Ci0KLSAgaWYgKGlDaGlsZE51bSA+IDApIHsKLSAgICBDRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0gcERhdGFOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpOwotICAgIEFTU0VSVChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpOwotICAgIENGREVfWE1MRWxlbWVudCogcFhNTEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwWE1MTm9kZSk7Ci0gICAgaWYgKHBYTUxFbGVtZW50LT5IYXNBdHRyaWJ1dGUoTCJ4ZmE6ZGF0YU5vZGUiKSkKLSAgICAgIHBYTUxFbGVtZW50LT5SZW1vdmVBdHRyaWJ1dGUoTCJ4ZmE6ZGF0YU5vZGUiKTsKLQotICAgIHJldHVybjsKLSAgfQotCi0gIENGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBwRGF0YU5vZGUtPkdldFhNTE1hcHBpbmdOb2RlKCk7Ci0gIEFTU0VSVChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpOwotICBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwWE1MTm9kZSktPlNldFN0cmluZyhMInhmYTpkYXRhTm9kZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZGF0YUdyb3VwIik7Ci19CisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfdXRpbHMuaCIKIAogQ1hGQV9EYXRhRXhwb3J0ZXI6OkNYRkFfRGF0YUV4cG9ydGVyKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkKICAgICA6IG1fcERvY3VtZW50KHBEb2N1bWVudCkgewogICBBU1NFUlQobV9wRG9jdW1lbnQpOwogfQogCi1ib29sIENYRkFfRGF0YUV4cG9ydGVyOjpFeHBvcnQoCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVXcml0ZVN0cmVhbT4mIHBXcml0ZSkgeworQ1hGQV9EYXRhRXhwb3J0ZXI6On5DWEZBX0RhdGFFeHBvcnRlcigpIHt9CisKK2Jvb2wgQ1hGQV9EYXRhRXhwb3J0ZXI6OkV4cG9ydChjb25zdCBSZXRhaW5QdHI8SUZYX1NlZWthYmxlU3RyZWFtPiYgcFdyaXRlKSB7CiAgIHJldHVybiBFeHBvcnQocFdyaXRlLCBtX3BEb2N1bWVudC0+R2V0Um9vdCgpLCAwLCBudWxscHRyKTsKIH0KIAotYm9vbCBDWEZBX0RhdGFFeHBvcnRlcjo6RXhwb3J0KAotICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlV3JpdGVTdHJlYW0+JiBwV3JpdGUsCi0gICAgQ1hGQV9Ob2RlKiBwTm9kZSwKLSAgICB1aW50MzJfdCBkd0ZsYWcsCi0gICAgY29uc3QgRlhfQ0hBUiogcENoZWNrc3VtKSB7Citib29sIENYRkFfRGF0YUV4cG9ydGVyOjpFeHBvcnQoY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVN0cmVhbT4mIHBXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwQ2hlY2tzdW0pIHsKICAgQVNTRVJUKHBXcml0ZSk7CiAgIGlmICghcFdyaXRlKQogICAgIHJldHVybiBmYWxzZTsKIAotICBDRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4gcFN0cmVhbSA9IElGR0FTX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKAotICAgICAgcFdyaXRlLAotICAgICAgRlhfU1RSRUFNQUNDRVNTX1RleHQgfCBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUgfCBGWF9TVFJFQU1BQ0NFU1NfQXBwZW5kKTsKLSAgaWYgKCFwU3RyZWFtKQotICAgIHJldHVybiBmYWxzZTsKLQorICBhdXRvIHBTdHJlYW0gPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX1NlZWthYmxlU3RyZWFtUHJveHk+KHBXcml0ZSwgdHJ1ZSk7CiAgIHBTdHJlYW0tPlNldENvZGVQYWdlKEZYX0NPREVQQUdFX1VURjgpOwogICByZXR1cm4gRXhwb3J0KHBTdHJlYW0sIHBOb2RlLCBkd0ZsYWcsIHBDaGVja3N1bSk7CiB9CiAKLWJvb2wgQ1hGQV9EYXRhRXhwb3J0ZXI6OkV4cG9ydChjb25zdCBDRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4mIHBTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogcENoZWNrc3VtKSB7Ci0gIENGREVfWE1MRG9jKiBwWE1MRG9jID0gbV9wRG9jdW1lbnQtPkdldFhNTERvYygpOworYm9vbCBDWEZBX0RhdGFFeHBvcnRlcjo6RXhwb3J0KAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfU2Vla2FibGVTdHJlYW1Qcm94eT4mIHBTdHJlYW0sCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSwKKyAgICB1aW50MzJfdCBkd0ZsYWcsCisgICAgY29uc3QgY2hhciogcENoZWNrc3VtKSB7CisgIENGWF9YTUxEb2MqIHBYTUxEb2MgPSBtX3BEb2N1bWVudC0+R2V0WE1MRG9jKCk7CiAgIGlmIChwTm9kZS0+SXNNb2RlbE5vZGUoKSkgewotICAgIHN3aXRjaCAocE5vZGUtPkdldFBhY2tldElEKCkpIHsKLSAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9YRFA6IHsKLSAgICAgICAgc3RhdGljIGNvbnN0IEZYX1dDSEFSIHNfcHdzUHJlYW1ibGVbXSA9Ci0gICAgICAgICAgICBMIjx4ZHA6eGRwIHhtbG5zOnhkcD1cImh0dHA6Ly9ucy5hZG9iZS5jb20veGRwL1wiPiI7Ci0gICAgICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKHNfcHdzUHJlYW1ibGUsIEZYU1lTX3djc2xlbihzX3B3c1ByZWFtYmxlKSk7Ci0gICAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgICAgICAgIHBDaGlsZDsgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7CisgICAgc3dpdGNoIChwTm9kZS0+R2V0UGFja2V0VHlwZSgpKSB7CisgICAgICBjYXNlIFhGQV9QYWNrZXRUeXBlOjpYZHA6IHsKKyAgICAgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoCisgICAgICAgICAgICBMIjx4ZHA6eGRwIHhtbG5zOnhkcD1cImh0dHA6Ly9ucy5hZG9iZS5jb20veGRwL1wiPiIpOworICAgICAgICBmb3IgKENYRkFfTm9kZSogcENoaWxkID0gcE5vZGUtPkdldEZpcnN0Q2hpbGQoKTsgcENoaWxkOworICAgICAgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+R2V0TmV4dFNpYmxpbmcoKSkgewogICAgICAgICAgIEV4cG9ydChwU3RyZWFtLCBwQ2hpbGQsIGR3RmxhZywgcENoZWNrc3VtKTsKICAgICAgICAgfQotICAgICAgICBzdGF0aWMgY29uc3QgRlhfV0NIQVIgc19wd3NQb3N0YW1ibGVbXSA9IEwiPC94ZHA6eGRwXG4+IjsKLSAgICAgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoc19wd3NQb3N0YW1ibGUsIEZYU1lTX3djc2xlbihzX3B3c1Bvc3RhbWJsZSkpOworICAgICAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyhMIjwveGRwOnhkcFxuPiIpOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0czogewotICAgICAgICBDRkRFX1hNTEVsZW1lbnQqIHBFbGVtZW50ID0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PENGREVfWE1MRWxlbWVudCo+KHBOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpKTsKLSAgICAgICAgaWYgKCFwRWxlbWVudCB8fCBwRWxlbWVudC0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpCisgICAgICBjYXNlIFhGQV9QYWNrZXRUeXBlOjpEYXRhc2V0czogeworICAgICAgICBDRlhfWE1MRWxlbWVudCogcEVsZW1lbnQgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZYX1hNTEVsZW1lbnQqPihwTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKSk7CisgICAgICAgIGlmICghcEVsZW1lbnQgfHwgcEVsZW1lbnQtPkdldFR5cGUoKSAhPSBGWF9YTUxOT0RFX0VsZW1lbnQpCiAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsKKyAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUgPSBwTm9kZS0+R2V0Rmlyc3RDaGlsZCgpOwogICAgICAgICBBU1NFUlQocERhdGFOb2RlKTsKICAgICAgICAgWEZBX0RhdGFFeHBvcnRlcl9EZWFsV2l0aERhdGFHcm91cE5vZGUocERhdGFOb2RlKTsKICAgICAgICAgcFhNTERvYy0+U2F2ZVhNTE5vZGUocFN0cmVhbSwgcEVsZW1lbnQpOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Gb3JtOiB7Ci0gICAgICAgIFhGQV9EYXRhRXhwb3J0ZXJfUmVnZW5lcmF0ZUZvcm1GaWxlKHBOb2RlLCBwU3RyZWFtLCBwQ2hlY2tzdW0pOworICAgICAgY2FzZSBYRkFfUGFja2V0VHlwZTo6Rm9ybTogeworICAgICAgICBYRkFfRGF0YUV4cG9ydGVyX1JlZ2VuZXJhdGVGb3JtRmlsZShwTm9kZSwgcFN0cmVhbSwgcENoZWNrc3VtLCBmYWxzZSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgY2FzZSBYRkFfWERQUEFDS0VUX1RlbXBsYXRlOgorICAgICAgY2FzZSBYRkFfUGFja2V0VHlwZTo6VGVtcGxhdGU6CiAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgIENGREVfWE1MRWxlbWVudCogcEVsZW1lbnQgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4ocE5vZGUtPkdldFhNTE1hcHBpbmdOb2RlKCkpOwotICAgICAgICBpZiAoIXBFbGVtZW50IHx8IHBFbGVtZW50LT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkKKyAgICAgICAgQ0ZYX1hNTEVsZW1lbnQqIHBFbGVtZW50ID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PENGWF9YTUxFbGVtZW50Kj4ocE5vZGUtPkdldFhNTE1hcHBpbmdOb2RlKCkpOworICAgICAgICBpZiAoIXBFbGVtZW50IHx8IHBFbGVtZW50LT5HZXRUeXBlKCkgIT0gRlhfWE1MTk9ERV9FbGVtZW50KQogICAgICAgICAgIHJldHVybiBmYWxzZTsKIAogICAgICAgICBwWE1MRG9jLT5TYXZlWE1MTm9kZShwU3RyZWFtLCBwRWxlbWVudCk7CkBAIC01MjQsMTkgKzg3LDE4IEBACiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAotICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsKKyAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUgPSBwTm9kZS0+R2V0UGFyZW50KCk7CiAgIENYRkFfTm9kZSogcEV4cG9ydE5vZGUgPSBwTm9kZTsKLSAgZm9yIChDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwRGF0YU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsKLSAgICAgICBwQ2hpbGROb2RlOwotICAgICAgIHBDaGlsZE5vZGUgPSBwQ2hpbGROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7CisgIGZvciAoQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcERhdGFOb2RlLT5HZXRGaXJzdENoaWxkKCk7IHBDaGlsZE5vZGU7CisgICAgICAgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5leHRTaWJsaW5nKCkpIHsKICAgICBpZiAocENoaWxkTm9kZSAhPSBwTm9kZSkgewogICAgICAgcEV4cG9ydE5vZGUgPSBwRGF0YU5vZGU7CiAgICAgICBicmVhazsKICAgICB9CiAgIH0KLSAgQ0ZERV9YTUxFbGVtZW50KiBwRWxlbWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwRXhwb3J0Tm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKSk7Ci0gIGlmICghcEVsZW1lbnQgfHwgcEVsZW1lbnQtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KQorICBDRlhfWE1MRWxlbWVudCogcEVsZW1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8Q0ZYX1hNTEVsZW1lbnQqPihwRXhwb3J0Tm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKSk7CisgIGlmICghcEVsZW1lbnQgfHwgcEVsZW1lbnQtPkdldFR5cGUoKSAhPSBGWF9YTUxOT0RFX0VsZW1lbnQpCiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIFhGQV9EYXRhRXhwb3J0ZXJfRGVhbFdpdGhEYXRhR3JvdXBOb2RlKHBFeHBvcnROb2RlKTsKZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGFleHBvcnRlci5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YWV4cG9ydGVyLmgKaW5kZXggMGU1ZGUwMC4uYTJhNTViMyAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YWV4cG9ydGVyLmgKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YWV4cG9ydGVyLmgKQEAgLTcsMzEgKzcsMzIgQEAKICNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREFUQUVYUE9SVEVSX0hfCiAjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RBVEFFWFBPUlRFUl9IXwogCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfcmV0YWluX3B0ci5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCiAKIGNsYXNzIENYRkFfRG9jdW1lbnQ7CiBjbGFzcyBDWEZBX05vZGU7Ci1jbGFzcyBJRlhfU2Vla2FibGVXcml0ZVN0cmVhbTsKLWNsYXNzIElGR0FTX1N0cmVhbTsKK2NsYXNzIElGWF9TZWVrYWJsZVN0cmVhbTsKK2NsYXNzIENGWF9TZWVrYWJsZVN0cmVhbVByb3h5OwogCiBjbGFzcyBDWEZBX0RhdGFFeHBvcnRlciB7CiAgcHVibGljOgogICBleHBsaWNpdCBDWEZBX0RhdGFFeHBvcnRlcihDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpOworICB+Q1hGQV9EYXRhRXhwb3J0ZXIoKTsKIAotICBib29sIEV4cG9ydChjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVdyaXRlU3RyZWFtPiYgcFdyaXRlKTsKLSAgYm9vbCBFeHBvcnQoY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVXcml0ZVN0cmVhbT4mIHBXcml0ZSwKKyAgYm9vbCBFeHBvcnQoY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVN0cmVhbT4mIHBXcml0ZSk7CisgIGJvb2wgRXhwb3J0KGNvbnN0IFJldGFpblB0cjxJRlhfU2Vla2FibGVTdHJlYW0+JiBwV3JpdGUsCiAgICAgICAgICAgICAgIENYRkFfTm9kZSogcE5vZGUsCiAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZywKLSAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogcENoZWNrc3VtKTsKKyAgICAgICAgICAgICAgY29uc3QgY2hhciogcENoZWNrc3VtKTsKIAotIHByb3RlY3RlZDoKLSAgYm9vbCBFeHBvcnQoY29uc3QgQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+JiBwU3RyZWFtLAorIHByaXZhdGU6CisgIGJvb2wgRXhwb3J0KGNvbnN0IFJldGFpblB0cjxDRlhfU2Vla2FibGVTdHJlYW1Qcm94eT4mIHBTdHJlYW0sCiAgICAgICAgICAgICAgIENYRkFfTm9kZSogcE5vZGUsCiAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZywKLSAgICAgICAgICAgICAgY29uc3QgRlhfQ0hBUiogcENoZWNrc3VtKTsKKyAgICAgICAgICAgICAgY29uc3QgY2hhciogcENoZWNrc3VtKTsKIAotICBDWEZBX0RvY3VtZW50KiBjb25zdCBtX3BEb2N1bWVudDsKKyAgVW5vd25lZFB0cjxDWEZBX0RvY3VtZW50PiBjb25zdCBtX3BEb2N1bWVudDsKIH07CiAKICNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREFUQUVYUE9SVEVSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhZ3JvdXAuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YWdyb3VwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjY1MTQ2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YWdyb3VwLmNwcApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhZ3JvdXAuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImRhdGFHcm91cCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0RhdGFHcm91cDo6Q1hGQV9EYXRhR3JvdXAoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0RhdGFzZXRzLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpEYXRhR3JvdXAsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9EYXRhR3JvdXA6On5DWEZBX0RhdGFHcm91cCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhZ3JvdXAuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGFncm91cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OWIwOTYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhZ3JvdXAuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREFUQUdST1VQX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RBVEFHUk9VUF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0RhdGFHcm91cCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9EYXRhR3JvdXAoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9EYXRhR3JvdXAoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREFUQUdST1VQX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhaW1wb3J0ZXIuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YWltcG9ydGVyLmNwcAppbmRleCAwMTk5MDI4Li45MTcxYjAwIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhaW1wb3J0ZXIuY3BwCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGFpbXBvcnRlci5jcHAKQEAgLTksMjggKzksMzAgQEAKICNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmVhbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWxub2RlLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotI2luY2x1ZGUgInhmYS9mZGUveG1sL2ZkZV94bWxfaW1wLmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvZnhmYS5oIgogI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmFfYmFzaWMuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaW1wbGVfcGFyc2VyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKIAogQ1hGQV9EYXRhSW1wb3J0ZXI6OkNYRkFfRGF0YUltcG9ydGVyKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkKICAgICA6IG1fcERvY3VtZW50KHBEb2N1bWVudCkgewogICBBU1NFUlQobV9wRG9jdW1lbnQpOwogfQogCitDWEZBX0RhdGFJbXBvcnRlcjo6fkNYRkFfRGF0YUltcG9ydGVyKCkge30KKwogYm9vbCBDWEZBX0RhdGFJbXBvcnRlcjo6SW1wb3J0RGF0YSgKLSAgICBjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwRGF0YURvY3VtZW50KSB7CisgICAgY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVN0cmVhbT4mIHBEYXRhRG9jdW1lbnQpIHsKICAgYXV0byBwRGF0YURvY3VtZW50UGFyc2VyID0KLSAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1NpbXBsZVBhcnNlcj4obV9wRG9jdW1lbnQsIGZhbHNlKTsKLSAgaWYgKHBEYXRhRG9jdW1lbnRQYXJzZXItPlN0YXJ0UGFyc2UocERhdGFEb2N1bWVudCwgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykgIT0KLSAgICAgIFhGQV9QQVJTRVNUQVRVU19SZWFkeSkgeworICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfU2ltcGxlUGFyc2VyPihtX3BEb2N1bWVudC5HZXQoKSk7CisgIGlmIChwRGF0YURvY3VtZW50UGFyc2VyLT5TdGFydFBhcnNlKAorICAgICAgICAgIHBEYXRhRG9jdW1lbnQsIFhGQV9QYWNrZXRUeXBlOjpEYXRhc2V0cykgIT0gWEZBX1BBUlNFU1RBVFVTX1JlYWR5KSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIGlmIChwRGF0YURvY3VtZW50UGFyc2VyLT5Eb1BhcnNlKG51bGxwdHIpIDwgWEZBX1BBUlNFU1RBVFVTX0RvbmUpCisgIGlmIChwRGF0YURvY3VtZW50UGFyc2VyLT5Eb1BhcnNlKCkgPCBYRkFfUEFSU0VTVEFUVVNfRG9uZSkKICAgICByZXR1cm4gZmFsc2U7CiAKICAgQ1hGQV9Ob2RlKiBwSW1wb3J0RGF0YVJvb3QgPSBwRGF0YURvY3VtZW50UGFyc2VyLT5HZXRSb290Tm9kZSgpOwpAQCAtNDQsMjAgKzQ2LDE5IEBACiAKICAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUgPSBUb05vZGUobV9wRG9jdW1lbnQtPkdldFhGQU9iamVjdChYRkFfSEFTSENPREVfRGF0YSkpOwogICBpZiAocERhdGFOb2RlKQotICAgIHBEYXRhTW9kZWwtPlJlbW92ZUNoaWxkKHBEYXRhTm9kZSk7CisgICAgcERhdGFNb2RlbC0+UmVtb3ZlQ2hpbGQocERhdGFOb2RlLCB0cnVlKTsKIAogICBpZiAocEltcG9ydERhdGFSb290LT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpEYXRhTW9kZWwpIHsKLSAgICB3aGlsZSAoQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0KLSAgICAgICAgICAgICAgIHBJbXBvcnREYXRhUm9vdC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpKSB7Ci0gICAgICBwSW1wb3J0RGF0YVJvb3QtPlJlbW92ZUNoaWxkKHBDaGlsZE5vZGUpOwotICAgICAgcERhdGFNb2RlbC0+SW5zZXJ0Q2hpbGQocENoaWxkTm9kZSk7CisgICAgd2hpbGUgKENYRkFfTm9kZSogcENoaWxkTm9kZSA9IHBJbXBvcnREYXRhUm9vdC0+R2V0Rmlyc3RDaGlsZCgpKSB7CisgICAgICBwSW1wb3J0RGF0YVJvb3QtPlJlbW92ZUNoaWxkKHBDaGlsZE5vZGUsIHRydWUpOworICAgICAgcERhdGFNb2RlbC0+SW5zZXJ0Q2hpbGQocENoaWxkTm9kZSwgbnVsbHB0cik7CiAgICAgfQogICB9IGVsc2UgewotICAgIENGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBwSW1wb3J0RGF0YVJvb3QtPkdldFhNTE1hcHBpbmdOb2RlKCk7Ci0gICAgQ0ZERV9YTUxOb2RlKiBwUGFyZW50WE1MTm9kZSA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6OlBhcmVudCk7CisgICAgQ0ZYX1hNTE5vZGUqIHBYTUxOb2RlID0gcEltcG9ydERhdGFSb290LT5HZXRYTUxNYXBwaW5nTm9kZSgpOworICAgIENGWF9YTUxOb2RlKiBwUGFyZW50WE1MTm9kZSA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShDRlhfWE1MTm9kZTo6UGFyZW50KTsKICAgICBpZiAocFBhcmVudFhNTE5vZGUpCiAgICAgICBwUGFyZW50WE1MTm9kZS0+UmVtb3ZlQ2hpbGROb2RlKHBYTUxOb2RlKTsKLSAgICBwRGF0YU1vZGVsLT5JbnNlcnRDaGlsZChwSW1wb3J0RGF0YVJvb3QpOworICAgIHBEYXRhTW9kZWwtPkluc2VydENoaWxkKHBJbXBvcnREYXRhUm9vdCwgbnVsbHB0cik7CiAgIH0KICAgbV9wRG9jdW1lbnQtPkRvRGF0YVJlbWVyZ2UoZmFsc2UpOwogICByZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGFpbXBvcnRlci5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YWltcG9ydGVyLmgKaW5kZXggYmYwNGIwNS4uY2E1ODk2ZSAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YWltcG9ydGVyLmgKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YWltcG9ydGVyLmgKQEAgLTcsMjAgKzcsMjIgQEAKICNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREFUQUlNUE9SVEVSX0hfCiAjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RBVEFJTVBPUlRFUl9IXwogCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfcmV0YWluX3B0ci5oIgogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9yZXRhaW5fcHRyLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC91bm93bmVkX3B0ci5oIgogCiBjbGFzcyBDWEZBX0RvY3VtZW50OwotY2xhc3MgSUZYX1NlZWthYmxlUmVhZFN0cmVhbTsKK2NsYXNzIElGWF9TZWVrYWJsZVN0cmVhbTsKIAogY2xhc3MgQ1hGQV9EYXRhSW1wb3J0ZXIgewogIHB1YmxpYzoKICAgZXhwbGljaXQgQ1hGQV9EYXRhSW1wb3J0ZXIoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsKKyAgfkNYRkFfRGF0YUltcG9ydGVyKCk7CiAKLSAgYm9vbCBJbXBvcnREYXRhKGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBEYXRhRG9jdW1lbnQpOworICBib29sIEltcG9ydERhdGEoY29uc3QgUmV0YWluUHRyPElGWF9TZWVrYWJsZVN0cmVhbT4mIHBEYXRhRG9jdW1lbnQpOwogCi0gcHJvdGVjdGVkOgotICBDWEZBX0RvY3VtZW50KiBjb25zdCBtX3BEb2N1bWVudDsKKyBwcml2YXRlOgorICBVbm93bmVkUHRyPENYRkFfRG9jdW1lbnQ+IGNvbnN0IG1fcERvY3VtZW50OwogfTsKIAogI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9EQVRBSU1QT1JURVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGFtb2RlbC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhbW9kZWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NmJhNGMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhbW9kZWwuY3BwCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGFtb2RlbC5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X21vZGVsLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJkYXRhTW9kZWwiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9EYXRhTW9kZWw6OkNYRkFfRGF0YU1vZGVsKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6TW9kZWxOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpEYXRhTW9kZWwsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfTW9kZWw+KHRoaXMpKSB7fQorCitDWEZBX0RhdGFNb2RlbDo6fkNYRkFfRGF0YU1vZGVsKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGFtb2RlbC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YW1vZGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQxNGVhMwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGFtb2RlbC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9EQVRBTU9ERUxfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREFUQU1PREVMX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfRGF0YU1vZGVsIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0RhdGFNb2RlbChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0RhdGFNb2RlbCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9EQVRBTU9ERUxfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGF2YWx1ZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhdmFsdWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZWJhZjAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhdmFsdWUuY3BwCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGF2YWx1ZS5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2RhdGF2YWx1ZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkNvbnRlbnRUeXBlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpDb250YWlucywgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6RGF0YX0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlZhbHVlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpJc051bGwsIFhGQV9BdHRyaWJ1dGVUeXBlOjpCb29sZWFuLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImRhdGFWYWx1ZSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0RhdGFWYWx1ZTo6Q1hGQV9EYXRhVmFsdWUoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0RhdGFzZXRzLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpEYXRhVmFsdWUsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0RhdGFWYWx1ZT4odGhpcykpIHt9CisKK0NYRkFfRGF0YVZhbHVlOjp+Q1hGQV9EYXRhVmFsdWUoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YXZhbHVlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhdmFsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTcwYWJhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YXZhbHVlLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RBVEFWQUxVRV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9EQVRBVkFMVUVfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9EYXRhVmFsdWUgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfRGF0YVZhbHVlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRGF0YVZhbHVlKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RBVEFWQUxVRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODRhYjMyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZS5jcHAKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZS5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2RhdGUuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJkYXRlIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRGF0ZTo6Q1hGQV9EYXRlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RGF0ZSwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfRGF0ZT4odGhpcykpIHt9CisKK0NYRkFfRGF0ZTo6fkNYRkFfRGF0ZSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVlYmIyNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGUuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREFURV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9EQVRFX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfRGF0ZSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9EYXRlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRGF0ZSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9EQVRFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRlcGF0dGVybi5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRlcGF0dGVybi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM3ODc0YgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGVwYXR0ZXJuLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRlcGF0dGVybi5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6TWVkfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiZGF0ZVBhdHRlcm4iOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9EYXRlUGF0dGVybjo6Q1hGQV9EYXRlUGF0dGVybihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RGF0ZVBhdHRlcm4sCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9EYXRlUGF0dGVybjo6fkNYRkFfRGF0ZVBhdHRlcm4oKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZXBhdHRlcm4uaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGVwYXR0ZXJuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY2MTQ3OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGVwYXR0ZXJuLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RBVEVQQVRURVJOX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RBVEVQQVRURVJOX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfRGF0ZVBhdHRlcm4gOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfRGF0ZVBhdHRlcm4oQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9EYXRlUGF0dGVybigpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9EQVRFUEFUVEVSTl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZXBhdHRlcm5zLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGVwYXR0ZXJucy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhMzgwZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGVwYXR0ZXJucy5jcHAKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZXBhdHRlcm5zLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHsKKyAgICB7WEZBX0VsZW1lbnQ6OkRhdGVQYXR0ZXJuLCA0LCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiZGF0ZVBhdHRlcm5zIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRGF0ZVBhdHRlcm5zOjpDWEZBX0RhdGVQYXR0ZXJucyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpEYXRlUGF0dGVybnMsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0RhdGVQYXR0ZXJuczo6fkNYRkFfRGF0ZVBhdHRlcm5zKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGVwYXR0ZXJucy5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZXBhdHRlcm5zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZjNTVkMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGVwYXR0ZXJucy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9EQVRFUEFUVEVSTlNfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREFURVBBVFRFUk5TX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfRGF0ZVBhdHRlcm5zIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0RhdGVQYXR0ZXJucyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0RhdGVQYXR0ZXJucygpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9EQVRFUEFUVEVSTlNfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGV0aW1lLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGV0aW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDllNDBjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZXRpbWUuY3BwCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGV0aW1lLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZGF0ZXRpbWUuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJkYXRlVGltZSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0RhdGVUaW1lOjpDWEZBX0RhdGVUaW1lKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RGF0ZVRpbWUsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0RhdGVUaW1lPih0aGlzKSkge30KKworQ1hGQV9EYXRlVGltZTo6fkNYRkFfRGF0ZVRpbWUoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZXRpbWUuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGV0aW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjZDZmNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGV0aW1lLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RBVEVUSU1FX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RBVEVUSU1FX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfRGF0ZVRpbWUgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfRGF0ZVRpbWUoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9EYXRlVGltZSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9EQVRFVElNRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZXRpbWVlZGl0LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGV0aW1lZWRpdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM5YTgwNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGV0aW1lZWRpdC5jcHAKQEAgLTAsMCArMSw0NCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZXRpbWVlZGl0LmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZGF0ZXRpbWVlZGl0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpNYXJnaW4sIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6Qm9yZGVyLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OkNvbWIsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpQaWNrZXIsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06Okhvc3R9LAorICAgIHtYRkFfQXR0cmlidXRlOjpIU2Nyb2xsUG9saWN5LCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpBdXRvfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiZGF0ZVRpbWVFZGl0IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRGF0ZVRpbWVFZGl0OjpDWEZBX0RhdGVUaW1lRWRpdChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RGF0ZVRpbWVFZGl0LAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9EYXRlVGltZUVkaXQ+KHRoaXMpKSB7fQorCitDWEZBX0RhdGVUaW1lRWRpdDo6fkNYRkFfRGF0ZVRpbWVFZGl0KCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGV0aW1lZWRpdC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZXRpbWVlZGl0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFjNzg3OQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGV0aW1lZWRpdC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9EQVRFVElNRUVESVRfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREFURVRJTUVFRElUX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfRGF0ZVRpbWVFZGl0IDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0RhdGVUaW1lRWRpdChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0RhdGVUaW1lRWRpdCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9EQVRFVElNRUVESVRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RhdGV0aW1lc3ltYm9scy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRldGltZXN5bWJvbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMjk2NjYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRldGltZXN5bWJvbHMuY3BwCkBAIC0wLDAgKzEsMjYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGV0aW1lc3ltYm9scy5oIgorCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJkYXRlVGltZVN5bWJvbHMiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9EYXRlVGltZVN5bWJvbHM6OkNYRkFfRGF0ZVRpbWVTeW1ib2xzKENYRkFfRG9jdW1lbnQqIGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkRhdGVUaW1lU3ltYm9scywKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfRGF0ZVRpbWVTeW1ib2xzOjp+Q1hGQV9EYXRlVGltZVN5bWJvbHMoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZXRpbWVzeW1ib2xzLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRldGltZXN5bWJvbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjI5NmQ2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZXRpbWVzeW1ib2xzLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RBVEVUSU1FU1lNQk9MU19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9EQVRFVElNRVNZTUJPTFNfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9EYXRlVGltZVN5bWJvbHMgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfRGF0ZVRpbWVTeW1ib2xzKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRGF0ZVRpbWVTeW1ib2xzKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RBVEVUSU1FU1lNQk9MU19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF5LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RheS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4YjgyMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RheS5jcHAKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF5LmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImRheSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0RheTo6Q1hGQV9EYXkoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkRheSwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfRGF5Ojp+Q1hGQV9EYXkoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF5LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDA0YmY0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF5LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RBWV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9EQVlfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9EYXkgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfRGF5KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRGF5KCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RBWV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF5bmFtZXMuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF5bmFtZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NDY4ZTkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXluYW1lcy5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF5bmFtZXMuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0ge3tYRkFfRWxlbWVudDo6RGF5LCA3LCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpBYmJyLCBYRkFfQXR0cmlidXRlVHlwZTo6Qm9vbGVhbiwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJkYXlOYW1lcyI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0RheU5hbWVzOjpDWEZBX0RheU5hbWVzKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkRheU5hbWVzLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfRGF5TmFtZXM6On5DWEZBX0RheU5hbWVzKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RheW5hbWVzLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXluYW1lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NjZlNTAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXluYW1lcy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9EQVlOQU1FU19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9EQVlOQU1FU19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0RheU5hbWVzIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0RheU5hbWVzKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRGF5TmFtZXMoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREFZTkFNRVNfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RlYnVnLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RlYnVnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWNmZDYzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVidWcuY3BwCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RlYnVnLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6OlVyaSwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiZGVidWciOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9EZWJ1Zzo6Q1hGQV9EZWJ1ZyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpEZWJ1ZywKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0RlYnVnOjp+Q1hGQV9EZWJ1ZygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWJ1Zy5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmU0ZWQxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVidWcuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREVCVUdfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREVCVUdfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9EZWJ1ZyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9EZWJ1ZyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0RlYnVnKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RFQlVHX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWNpbWFsLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RlY2ltYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ODdlOGQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWNpbWFsLmNwcApAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWNpbWFsLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZGVjaW1hbC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkZyYWNEaWdpdHMsIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxlYWREaWdpdHMsIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopLTF9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJkZWNpbWFsIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRGVjaW1hbDo6Q1hGQV9EZWNpbWFsKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RGVjaW1hbCwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfRGVjaW1hbD4odGhpcykpIHt9CisKK0NYRkFfRGVjaW1hbDo6fkNYRkFfRGVjaW1hbCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWNpbWFsLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWNpbWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE1ODg5NgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RlY2ltYWwuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREVDSU1BTF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9ERUNJTUFMX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfRGVjaW1hbCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9EZWNpbWFsKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRGVjaW1hbCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9ERUNJTUFMX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWZhdWx0dHlwZWZhY2UuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVmYXVsdHR5cGVmYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGRhNzg2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVmYXVsdHR5cGVmYWNlLmNwcApAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWZhdWx0dHlwZWZhY2UuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OldyaXRpbmdTY3JpcHQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OkFzdGVyaXNrfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiZGVmYXVsdFR5cGVmYWNlIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRGVmYXVsdFR5cGVmYWNlOjpDWEZBX0RlZmF1bHRUeXBlZmFjZShDWEZBX0RvY3VtZW50KiBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpEZWZhdWx0VHlwZWZhY2UsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9EZWZhdWx0VHlwZWZhY2U6On5DWEZBX0RlZmF1bHRUeXBlZmFjZSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWZhdWx0dHlwZWZhY2UuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RlZmF1bHR0eXBlZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMWVkOGYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWZhdWx0dHlwZWZhY2UuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREVGQVVMVFRZUEVGQUNFX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RFRkFVTFRUWVBFRkFDRV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0RlZmF1bHRUeXBlZmFjZSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9EZWZhdWx0VHlwZWZhY2UoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9EZWZhdWx0VHlwZWZhY2UoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREVGQVVMVFRZUEVGQUNFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWZhdWx0dWkuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVmYXVsdHVpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTQwMDg0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVmYXVsdHVpLmNwcApAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWZhdWx0dWkuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9kZWZhdWx0dWkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiZGVmYXVsdFVpIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRGVmYXVsdFVpOjpDWEZBX0RlZmF1bHRVaShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RGVmYXVsdFVpLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfRGVmYXVsdFVpOjp+Q1hGQV9EZWZhdWx0VWkoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVmYXVsdHVpLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWZhdWx0dWkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTE0OTQxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVmYXVsdHVpLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RFRkFVTFRVSV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9ERUZBVUxUVUlfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9EZWZhdWx0VWkgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfRGVmYXVsdFVpKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRGVmYXVsdFVpKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RFRkFVTFRVSV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVsZXRlLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RlbGV0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3N2ZhOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RlbGV0ZS5jcHAKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVsZXRlLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZGVsZXRlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiZGVsZXRlIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRGVsZXRlOjpDWEZBX0RlbGV0ZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpUZXh0Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RGVsZXRlLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9EZWxldGU+KHRoaXMpKSB7fQorCitDWEZBX0RlbGV0ZTo6fkNYRkFfRGVsZXRlKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RlbGV0ZS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVsZXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M2MDU4YQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RlbGV0ZS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9ERUxFVEVfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREVMRVRFX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfRGVsZXRlIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0RlbGV0ZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0RlbGV0ZSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9ERUxFVEVfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RlbHRhLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RlbHRhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjViZjc3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVsdGEuY3BwCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RlbHRhLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZGVsdGEuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImRlbHRhIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRGVsdGE6OkNYRkFfRGVsdGEoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0Zvcm0sCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok9iamVjdCwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RGVsdGEsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfRGVsdGE+KHRoaXMpKSB7fQorCitDWEZBX0RlbHRhOjp+Q1hGQV9EZWx0YSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWx0YS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVsdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTMyODdiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVsdGEuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREVMVEFfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREVMVEFfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9EZWx0YSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9EZWx0YShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0RlbHRhKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RFTFRBX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWx0YXMuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVsdGFzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGIwOTM2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVsdGFzLmNwcApAQCAtMCwwICsxLDE1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWx0YXMuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9kZWx0YXMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK0NYRkFfRGVsdGFzOjpDWEZBX0RlbHRhcyhDWEZBX0RvY3VtZW50KiBkb2MpCisgICAgOiBDWEZBX0xpc3QoZG9jLCBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0RlbHRhcz4odGhpcykpIHt9CisKK0NYRkFfRGVsdGFzOjp+Q1hGQV9EZWx0YXMoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVsdGFzLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWx0YXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzAwZTllCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVsdGFzLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RFTFRBU19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9ERUxUQVNfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xpc3QuaCIKKworY2xhc3MgQ1hGQV9EZWx0YXMgOiBwdWJsaWMgQ1hGQV9MaXN0IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IENYRkFfRGVsdGFzKENYRkFfRG9jdW1lbnQqIGRvYyk7CisgIH5DWEZBX0RlbHRhcygpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9ERUxUQVNfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2Rlc2MuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVzYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkYTA2ZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Rlc2MuY3BwCkBAIC0wLDAgKzEsNDIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2Rlc2MuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9kZXNjLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7CisgICAge1hGQV9FbGVtZW50OjpUZXh0LCAxLCAwfSwgICAgIHtYRkFfRWxlbWVudDo6VGltZSwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpEYXRlVGltZSwgMSwgMH0sIHtYRkFfRWxlbWVudDo6SW1hZ2UsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6RGVjaW1hbCwgMSwgMH0sICB7WEZBX0VsZW1lbnQ6OkJvb2xlYW4sIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6SW50ZWdlciwgMSwgMH0sICB7WEZBX0VsZW1lbnQ6OkV4RGF0YSwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpEYXRlLCAxLCAwfSwgICAgIHtYRkFfRWxlbWVudDo6RmxvYXQsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImRlc2MiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9EZXNjOjpDWEZBX0Rlc2MoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkRlc2MsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0Rlc2M+KHRoaXMpKSB7fQorCitDWEZBX0Rlc2M6On5DWEZBX0Rlc2MoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVzYy5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MTFjNjMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZXNjLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RFU0NfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREVTQ19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0Rlc2MgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfRGVzYyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0Rlc2MoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREVTQ19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVzdGluYXRpb24uY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVzdGluYXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNWQxMGIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZXN0aW5hdGlvbi5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGVzdGluYXRpb24uaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImRlc3RpbmF0aW9uIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRGVzdGluYXRpb246OkNYRkFfRGVzdGluYXRpb24oQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkRlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfRGVzdGluYXRpb246On5DWEZBX0Rlc3RpbmF0aW9uKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2Rlc3RpbmF0aW9uLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZXN0aW5hdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZmM1NTMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZXN0aW5hdGlvbi5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9ERVNUSU5BVElPTl9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9ERVNUSU5BVElPTl9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0Rlc3RpbmF0aW9uIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0Rlc3RpbmF0aW9uKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRGVzdGluYXRpb24oKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfREVTVElOQVRJT05fSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RpZ2VzdG1ldGhvZC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kaWdlc3RtZXRob2QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NDgzMmUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kaWdlc3RtZXRob2QuY3BwCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RpZ2VzdG1ldGhvZC5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2RpZ2VzdG1ldGhvZC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImRpZ2VzdE1ldGhvZCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0RpZ2VzdE1ldGhvZDo6Q1hGQV9EaWdlc3RNZXRob2QoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVDLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpEaWdlc3RNZXRob2QsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0RpZ2VzdE1ldGhvZD4odGhpcykpIHt9CisKK0NYRkFfRGlnZXN0TWV0aG9kOjp+Q1hGQV9EaWdlc3RNZXRob2QoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGlnZXN0bWV0aG9kLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kaWdlc3RtZXRob2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWMyMmJiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGlnZXN0bWV0aG9kLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RJR0VTVE1FVEhPRF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9ESUdFU1RNRVRIT0RfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9EaWdlc3RNZXRob2QgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfRGlnZXN0TWV0aG9kKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRGlnZXN0TWV0aG9kKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RJR0VTVE1FVEhPRF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGlnZXN0bWV0aG9kcy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kaWdlc3RtZXRob2RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTkzZmQwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGlnZXN0bWV0aG9kcy5jcHAKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGlnZXN0bWV0aG9kcy5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2RpZ2VzdG1ldGhvZHMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpUeXBlLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpPcHRpb25hbH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImRpZ2VzdE1ldGhvZHMiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9EaWdlc3RNZXRob2RzOjpDWEZBX0RpZ2VzdE1ldGhvZHMoQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpEaWdlc3RNZXRob2RzLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9EaWdlc3RNZXRob2RzPih0aGlzKSkge30KKworQ1hGQV9EaWdlc3RNZXRob2RzOjp+Q1hGQV9EaWdlc3RNZXRob2RzKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RpZ2VzdG1ldGhvZHMuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RpZ2VzdG1ldGhvZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWQ0MGZiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGlnZXN0bWV0aG9kcy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9ESUdFU1RNRVRIT0RTX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RJR0VTVE1FVEhPRFNfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9EaWdlc3RNZXRob2RzIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0RpZ2VzdE1ldGhvZHMoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9EaWdlc3RNZXRob2RzKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RJR0VTVE1FVEhPRFNfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmNwcAppbmRleCBhZGI4ZWIyLi4wNjc1ZTM1IDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5jcHAKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnQuY3BwCkBAIC00LDMzICs0LDQwIEBACiAKIC8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dC5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZub3RpZnkuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9leHRlbnNpb24uaCIKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV9lbmdpbmUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmbm90aWZ5LmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfZGF0YXdpbmRvdy5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jc2NyaXB0X2V2ZW50cHNldWRvbW9kZWwuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9ob3N0cHNldWRvbW9kZWwuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9sYXlvdXRwc2V1ZG9tb2RlbC5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jc2NyaXB0X2xvZ3BzZXVkb21vZGVsLmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfc2lnbmF0dXJlcHNldWRvbW9kZWwuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGFncm91cC5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50X3BhcnNlci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2ludGVyYWN0aXZlLmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0cHJvY2Vzc29yLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2NyaXB0Y29udGV4dC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxlbWdyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGVtZ3IuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGRmLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJlc2VudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RyYXZlcnNlc3RyYXRlZ3lfeGZhbm9kZS5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfcmVzb2x2ZW5vZGVfcnMuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX3V0aWxzLmgiCiAKIG5hbWVzcGFjZSB7CiAKK2NvbnN0ZXhwciBjb25zdCB3Y2hhcl90IGtUZW1wbGF0ZU5TW10gPQorICAgIEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtdGVtcGxhdGUvIjsKKwogdm9pZCBNZXJnZU5vZGVSZWN1cnNlKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwKICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEZXN0Tm9kZVBhcmVudCwKICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQcm90b05vZGUpIHsKICAgQ1hGQV9Ob2RlKiBwRXhpc3RpbmdOb2RlID0gbnVsbHB0cjsKLSAgZm9yIChDWEZBX05vZGUqIHBGb3JtQ2hpbGQgPQotICAgICAgICAgICBwRGVzdE5vZGVQYXJlbnQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsKLSAgICAgICBwRm9ybUNoaWxkOwotICAgICAgIHBGb3JtQ2hpbGQgPSBwRm9ybUNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7CisgIGZvciAoQ1hGQV9Ob2RlKiBwRm9ybUNoaWxkID0gcERlc3ROb2RlUGFyZW50LT5HZXRGaXJzdENoaWxkKCk7IHBGb3JtQ2hpbGQ7CisgICAgICAgcEZvcm1DaGlsZCA9IHBGb3JtQ2hpbGQtPkdldE5leHRTaWJsaW5nKCkpIHsKICAgICBpZiAocEZvcm1DaGlsZC0+R2V0RWxlbWVudFR5cGUoKSA9PSBwUHJvdG9Ob2RlLT5HZXRFbGVtZW50VHlwZSgpICYmCiAgICAgICAgIHBGb3JtQ2hpbGQtPkdldE5hbWVIYXNoKCkgPT0gcFByb3RvTm9kZS0+R2V0TmFtZUhhc2goKSAmJgogICAgICAgICBwRm9ybUNoaWxkLT5Jc1VudXNlZE5vZGUoKSkgewpAQCAtNDIsMTAgKzQ5LDggQEAKIAogICBpZiAocEV4aXN0aW5nTm9kZSkgewogICAgIHBFeGlzdGluZ05vZGUtPlNldFRlbXBsYXRlTm9kZShwUHJvdG9Ob2RlKTsKLSAgICBmb3IgKENYRkFfTm9kZSogcFRlbXBsYXRlQ2hpbGQgPQotICAgICAgICAgICAgIHBQcm90b05vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsKLSAgICAgICAgIHBUZW1wbGF0ZUNoaWxkOyBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROb2RlSXRlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgeworICAgIGZvciAoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVDaGlsZCA9IHBQcm90b05vZGUtPkdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgIHBUZW1wbGF0ZUNoaWxkOyBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROZXh0U2libGluZygpKSB7CiAgICAgICBNZXJnZU5vZGVSZWN1cnNlKHBEb2N1bWVudCwgcEV4aXN0aW5nTm9kZSwgcFRlbXBsYXRlQ2hpbGQpOwogICAgIH0KICAgICByZXR1cm47CkBAIC02NiwxMCArNzEsOCBAQAogICAgIH0KICAgfQogICBwRGVzdE5vZGUtPlNldFRlbXBsYXRlTm9kZShwUHJvdG9Ob2RlKTsKLSAgZm9yIChDWEZBX05vZGUqIHBUZW1wbGF0ZUNoaWxkID0KLSAgICAgICAgICAgcFByb3RvTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgIHBUZW1wbGF0ZUNoaWxkOwotICAgICAgIHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsKKyAgZm9yIChDWEZBX05vZGUqIHBUZW1wbGF0ZUNoaWxkID0gcFByb3RvTm9kZS0+R2V0Rmlyc3RDaGlsZCgpOyBwVGVtcGxhdGVDaGlsZDsKKyAgICAgICBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROZXh0U2libGluZygpKSB7CiAgICAgTWVyZ2VOb2RlUmVjdXJzZShwRG9jdW1lbnQsIHBEZXN0Tm9kZSwgcFRlbXBsYXRlQ2hpbGQpOwogICB9CiAgIHsKQEAgLTg1LDMwICs4OCwyOCBAQAogCiBDWEZBX0RvY3VtZW50OjpDWEZBX0RvY3VtZW50KENYRkFfRG9jdW1lbnRQYXJzZXIqIHBQYXJzZXIpCiAgICAgOiBtX3BQYXJzZXIocFBhcnNlciksCi0gICAgICBtX3BTY3JpcHRDb250ZXh0KG51bGxwdHIpLAotICAgICAgbV9wTGF5b3V0UHJvY2Vzc29yKG51bGxwdHIpLAogICAgICAgbV9wUm9vdE5vZGUobnVsbHB0ciksCi0gICAgICBtX3BMb2NhbE1ncihudWxscHRyKSwKLSAgICAgIG1fcFNjcmlwdERhdGFXaW5kb3cobnVsbHB0ciksCi0gICAgICBtX3BTY3JpcHRFdmVudChudWxscHRyKSwKLSAgICAgIG1fcFNjcmlwdEhvc3QobnVsbHB0ciksCi0gICAgICBtX3BTY3JpcHRMb2cobnVsbHB0ciksCi0gICAgICBtX3BTY3JpcHRMYXlvdXQobnVsbHB0ciksCi0gICAgICBtX3BTY3JpcHRTaWduYXR1cmUobnVsbHB0ciksCiAgICAgICBtX2VDdXJWZXJzaW9uTW9kZShYRkFfVkVSU0lPTl9ERUZBVUxUKSwKICAgICAgIG1fZHdEb2NGbGFncygwKSB7CiAgIEFTU0VSVChtX3BQYXJzZXIpOwogfQogCiBDWEZBX0RvY3VtZW50Ojp+Q1hGQV9Eb2N1bWVudCgpIHsKKyAgLy8gUmVtb3ZlIGFsbCB0aGUgYmluZGluZ3MgYmVmb3JlIGZyZWVpbmcgdGhlIG5vZGUgYXMgdGhlIG93bmVyc2hpcCBpcyB3b25reS4KKyAgaWYgKG1fcFJvb3ROb2RlKQorICAgIG1fcFJvb3ROb2RlLT5SZWxlYXNlQmluZGluZ05vZGVzKCk7CisKICAgZGVsZXRlIG1fcFJvb3ROb2RlOwotICBQdXJnZU5vZGVzKCk7CisKKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlIDogbV9QdXJnZU5vZGVzKQorICAgIGRlbGV0ZSBwTm9kZTsKKyAgbV9QdXJnZU5vZGVzLmNsZWFyKCk7CiB9CiAKIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBDWEZBX0RvY3VtZW50OjpHZXRMYXlvdXRQcm9jZXNzb3IoKSB7CiAgIGlmICghbV9wTGF5b3V0UHJvY2Vzc29yKQotICAgIG1fcExheW91dFByb2Nlc3NvciA9IG5ldyBDWEZBX0xheW91dFByb2Nlc3Nvcih0aGlzKTsKLSAgcmV0dXJuIG1fcExheW91dFByb2Nlc3NvcjsKKyAgICBtX3BMYXlvdXRQcm9jZXNzb3IgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9MYXlvdXRQcm9jZXNzb3I+KHRoaXMpOworICByZXR1cm4gbV9wTGF5b3V0UHJvY2Vzc29yLmdldCgpOwogfQogCiBDWEZBX0xheW91dFByb2Nlc3NvciogQ1hGQV9Eb2N1bWVudDo6R2V0RG9jTGF5b3V0KCkgewpAQCAtMTE2LDI0ICsxMTcsMTUgQEAKIH0KIAogdm9pZCBDWEZBX0RvY3VtZW50OjpDbGVhckxheW91dERhdGEoKSB7Ci0gIGRlbGV0ZSBtX3BMYXlvdXRQcm9jZXNzb3I7Ci0gIG1fcExheW91dFByb2Nlc3NvciA9IG51bGxwdHI7Ci0gIGRlbGV0ZSBtX3BTY3JpcHRDb250ZXh0OwotICBtX3BTY3JpcHRDb250ZXh0ID0gbnVsbHB0cjsKLSAgZGVsZXRlIG1fcExvY2FsTWdyOwotICBtX3BMb2NhbE1nciA9IG51bGxwdHI7Ci0gIGRlbGV0ZSBtX3BTY3JpcHREYXRhV2luZG93OwotICBtX3BTY3JpcHREYXRhV2luZG93ID0gbnVsbHB0cjsKLSAgZGVsZXRlIG1fcFNjcmlwdEV2ZW50OwotICBtX3BTY3JpcHRFdmVudCA9IG51bGxwdHI7Ci0gIGRlbGV0ZSBtX3BTY3JpcHRIb3N0OwotICBtX3BTY3JpcHRIb3N0ID0gbnVsbHB0cjsKLSAgZGVsZXRlIG1fcFNjcmlwdExvZzsKLSAgbV9wU2NyaXB0TG9nID0gbnVsbHB0cjsKLSAgZGVsZXRlIG1fcFNjcmlwdExheW91dDsKLSAgbV9wU2NyaXB0TGF5b3V0ID0gbnVsbHB0cjsKLSAgZGVsZXRlIG1fcFNjcmlwdFNpZ25hdHVyZTsKLSAgbV9wU2NyaXB0U2lnbmF0dXJlID0gbnVsbHB0cjsKKyAgbV9wTGF5b3V0UHJvY2Vzc29yLnJlc2V0KCk7CisgIG1fcFNjcmlwdENvbnRleHQucmVzZXQoKTsKKyAgbV9wTG9jYWxNZ3IucmVzZXQoKTsKKyAgbV9wU2NyaXB0RGF0YVdpbmRvdy5yZXNldCgpOworICBtX3BTY3JpcHRFdmVudC5yZXNldCgpOworICBtX3BTY3JpcHRIb3N0LnJlc2V0KCk7CisgIG1fcFNjcmlwdExvZy5yZXNldCgpOworICBtX3BTY3JpcHRMYXlvdXQucmVzZXQoKTsKKyAgbV9wU2NyaXB0U2lnbmF0dXJlLnJlc2V0KCk7CiB9CiAKIHZvaWQgQ1hGQV9Eb2N1bWVudDo6U2V0Um9vdChDWEZBX05vZGUqIHBOZXdSb290KSB7CkBAIC0xNDQsNyArMTM2LDcgQEAKICAgUmVtb3ZlUHVyZ2VOb2RlKHBOZXdSb290KTsKIH0KIAotQ0ZERV9YTUxEb2MqIENYRkFfRG9jdW1lbnQ6OkdldFhNTERvYygpIGNvbnN0IHsKK0NGWF9YTUxEb2MqIENYRkFfRG9jdW1lbnQ6OkdldFhNTERvYygpIGNvbnN0IHsKICAgcmV0dXJuIG1fcFBhcnNlci0+R2V0WE1MRG9jKCk7CiB9CiAKQEAgLTE1OSw4NSArMTUxLDg0IEBACiAgICAgICBpZiAoIXBEYXRhc2V0c05vZGUpCiAgICAgICAgIHJldHVybiBudWxscHRyOwogCi0gICAgICBmb3IgKENYRkFfTm9kZSogcERhdGFzZXRzQ2hpbGQgPQotICAgICAgICAgICAgICAgcERhdGFzZXRzTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VsZW1lbnQ6OkRhdGFHcm91cCk7CisgICAgICBmb3IgKENYRkFfRGF0YUdyb3VwKiBwRGF0YXNldHNDaGlsZCA9CisgICAgICAgICAgICAgICBwRGF0YXNldHNOb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX0RhdGFHcm91cD4oCisgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkRhdGFHcm91cCk7CiAgICAgICAgICAgIHBEYXRhc2V0c0NoaWxkOwotICAgICAgICAgICBwRGF0YXNldHNDaGlsZCA9IHBEYXRhc2V0c0NoaWxkLT5HZXROZXh0U2FtZUNsYXNzU2libGluZygKLSAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpEYXRhR3JvdXApKSB7CisgICAgICAgICAgIHBEYXRhc2V0c0NoaWxkID0KKyAgICAgICAgICAgICAgIHBEYXRhc2V0c0NoaWxkLT5HZXROZXh0U2FtZUNsYXNzU2libGluZzxDWEZBX0RhdGFHcm91cD4oCisgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkRhdGFHcm91cCkpIHsKICAgICAgICAgaWYgKHBEYXRhc2V0c0NoaWxkLT5HZXROYW1lSGFzaCgpICE9IFhGQV9IQVNIQ09ERV9EYXRhKQogICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZXNwYWNlVVJJOwotICAgICAgICBpZiAoIXBEYXRhc2V0c0NoaWxkLT5UcnlOYW1lc3BhY2Uod3NOYW1lc3BhY2VVUkkpKQorICAgICAgICBPcHRpb25hbDxXaWRlU3RyaW5nPiBuYW1lc3BhY2VVUkkgPQorICAgICAgICAgICAgcERhdGFzZXRzQ2hpbGQtPkpTT2JqZWN0KCktPlRyeU5hbWVzcGFjZSgpOworICAgICAgICBpZiAoIW5hbWVzcGFjZVVSSSkKICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGFzZXRzVVJJOwotICAgICAgICBpZiAoIXBEYXRhc2V0c05vZGUtPlRyeU5hbWVzcGFjZSh3c0RhdGFzZXRzVVJJKSkKKyAgICAgICAgT3B0aW9uYWw8V2lkZVN0cmluZz4gZGF0YXNldHNVUkkgPQorICAgICAgICAgICAgcERhdGFzZXRzTm9kZS0+SlNPYmplY3QoKS0+VHJ5TmFtZXNwYWNlKCk7CisgICAgICAgIGlmICghZGF0YXNldHNVUkkpCiAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmICh3c05hbWVzcGFjZVVSSSA9PSB3c0RhdGFzZXRzVVJJKQorICAgICAgICBpZiAoKm5hbWVzcGFjZVVSSSA9PSAqZGF0YXNldHNVUkkpCiAgICAgICAgICAgcmV0dXJuIHBEYXRhc2V0c0NoaWxkOwogICAgICAgfQogICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQogICAgIGNhc2UgWEZBX0hBU0hDT0RFX1JlY29yZDogewogICAgICAgQ1hGQV9Ob2RlKiBwRGF0YSA9IFRvTm9kZShHZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0RhdGEpKTsKLSAgICAgIHJldHVybiBwRGF0YSA/IHBEYXRhLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRWxlbWVudDo6RGF0YUdyb3VwKQorICAgICAgcmV0dXJuIHBEYXRhID8gcERhdGEtPkdldEZpcnN0Q2hpbGRCeUNsYXNzPENYRkFfRGF0YUdyb3VwPigKKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RGF0YUdyb3VwKQogICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cjsKICAgICB9CiAgICAgY2FzZSBYRkFfSEFTSENPREVfRGF0YVdpbmRvdzogewogICAgICAgaWYgKCFtX3BTY3JpcHREYXRhV2luZG93KQotICAgICAgICBtX3BTY3JpcHREYXRhV2luZG93ID0gbmV3IENTY3JpcHRfRGF0YVdpbmRvdyh0aGlzKTsKLSAgICAgIHJldHVybiBtX3BTY3JpcHREYXRhV2luZG93OworICAgICAgICBtX3BTY3JpcHREYXRhV2luZG93ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENTY3JpcHRfRGF0YVdpbmRvdz4odGhpcyk7CisgICAgICByZXR1cm4gbV9wU2NyaXB0RGF0YVdpbmRvdy5nZXQoKTsKICAgICB9CiAgICAgY2FzZSBYRkFfSEFTSENPREVfRXZlbnQ6IHsKICAgICAgIGlmICghbV9wU2NyaXB0RXZlbnQpCi0gICAgICAgIG1fcFNjcmlwdEV2ZW50ID0gbmV3IENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbCh0aGlzKTsKLSAgICAgIHJldHVybiBtX3BTY3JpcHRFdmVudDsKKyAgICAgICAgbV9wU2NyaXB0RXZlbnQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1NjcmlwdF9FdmVudFBzZXVkb01vZGVsPih0aGlzKTsKKyAgICAgIHJldHVybiBtX3BTY3JpcHRFdmVudC5nZXQoKTsKICAgICB9CiAgICAgY2FzZSBYRkFfSEFTSENPREVfSG9zdDogewogICAgICAgaWYgKCFtX3BTY3JpcHRIb3N0KQotICAgICAgICBtX3BTY3JpcHRIb3N0ID0gbmV3IENTY3JpcHRfSG9zdFBzZXVkb01vZGVsKHRoaXMpOwotICAgICAgcmV0dXJuIG1fcFNjcmlwdEhvc3Q7CisgICAgICAgIG1fcFNjcmlwdEhvc3QgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw+KHRoaXMpOworICAgICAgcmV0dXJuIG1fcFNjcmlwdEhvc3QuZ2V0KCk7CiAgICAgfQogICAgIGNhc2UgWEZBX0hBU0hDT0RFX0xvZzogewogICAgICAgaWYgKCFtX3BTY3JpcHRMb2cpCi0gICAgICAgIG1fcFNjcmlwdExvZyA9IG5ldyBDU2NyaXB0X0xvZ1BzZXVkb01vZGVsKHRoaXMpOwotICAgICAgcmV0dXJuIG1fcFNjcmlwdExvZzsKKyAgICAgICAgbV9wU2NyaXB0TG9nID0gcGRmaXVtOjpNYWtlVW5pcXVlPENTY3JpcHRfTG9nUHNldWRvTW9kZWw+KHRoaXMpOworICAgICAgcmV0dXJuIG1fcFNjcmlwdExvZy5nZXQoKTsKICAgICB9CiAgICAgY2FzZSBYRkFfSEFTSENPREVfU2lnbmF0dXJlOiB7CiAgICAgICBpZiAoIW1fcFNjcmlwdFNpZ25hdHVyZSkKLSAgICAgICAgbV9wU2NyaXB0U2lnbmF0dXJlID0gbmV3IENTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWwodGhpcyk7Ci0gICAgICByZXR1cm4gbV9wU2NyaXB0U2lnbmF0dXJlOworICAgICAgICBtX3BTY3JpcHRTaWduYXR1cmUgPQorICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWw+KHRoaXMpOworICAgICAgcmV0dXJuIG1fcFNjcmlwdFNpZ25hdHVyZS5nZXQoKTsKICAgICB9CiAgICAgY2FzZSBYRkFfSEFTSENPREVfTGF5b3V0OiB7CiAgICAgICBpZiAoIW1fcFNjcmlwdExheW91dCkKLSAgICAgICAgbV9wU2NyaXB0TGF5b3V0ID0gbmV3IENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWwodGhpcyk7Ci0gICAgICByZXR1cm4gbV9wU2NyaXB0TGF5b3V0OworICAgICAgICBtX3BTY3JpcHRMYXlvdXQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbD4odGhpcyk7CisgICAgICByZXR1cm4gbV9wU2NyaXB0TGF5b3V0LmdldCgpOwogICAgIH0KICAgICBkZWZhdWx0OgogICAgICAgcmV0dXJuIG1fcFJvb3ROb2RlLT5HZXRGaXJzdENoaWxkQnlOYW1lKGR3Tm9kZU5hbWVIYXNoKTsKICAgfQogfQogCi1DWEZBX05vZGUqIENYRkFfRG9jdW1lbnQ6OkNyZWF0ZU5vZGUodWludDMyX3QgZHdQYWNrZXQsIFhGQV9FbGVtZW50IGVFbGVtZW50KSB7Ci0gIHJldHVybiBDcmVhdGVOb2RlKFhGQV9HZXRQYWNrZXRCeUlEKGR3UGFja2V0KSwgZUVsZW1lbnQpOwotfQotCi1DWEZBX05vZGUqIENYRkFfRG9jdW1lbnQ6OkNyZWF0ZU5vZGUoY29uc3QgWEZBX1BBQ0tFVElORk8qIHBQYWNrZXQsCitDWEZBX05vZGUqIENYRkFfRG9jdW1lbnQ6OkNyZWF0ZU5vZGUoWEZBX1BhY2tldFR5cGUgcGFja2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50IGVFbGVtZW50KSB7Ci0gIGlmICghcFBhY2tldCkKKyAgaWYgKGVFbGVtZW50ID09IFhGQV9FbGVtZW50OjpVbmtub3duKQogICAgIHJldHVybiBudWxscHRyOwogCi0gIGNvbnN0IFhGQV9FTEVNRU5USU5GTyogcEVsZW1lbnQgPSBYRkFfR2V0RWxlbWVudEJ5SUQoZUVsZW1lbnQpOwotICBpZiAocEVsZW1lbnQgJiYgKHBFbGVtZW50LT5kd1BhY2tldHMgJiBwUGFja2V0LT5lTmFtZSkpIHsKLSAgICBDWEZBX05vZGUqIHBOb2RlID0KLSAgICAgICAgbmV3IENYRkFfTm9kZSh0aGlzLCBwUGFja2V0LT5lTmFtZSwgcEVsZW1lbnQtPmVPYmplY3RUeXBlLAotICAgICAgICAgICAgICAgICAgICAgIHBFbGVtZW50LT5lTmFtZSwgcEVsZW1lbnQtPnBOYW1lKTsKLSAgICBBZGRQdXJnZU5vZGUocE5vZGUpOwotICAgIHJldHVybiBwTm9kZTsKLSAgfQorICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9Ob2RlPiBwTm9kZSA9IENYRkFfTm9kZTo6Q3JlYXRlKHRoaXMsIGVFbGVtZW50LCBwYWNrZXQpOworICBpZiAoIXBOb2RlKQorICAgIHJldHVybiBudWxscHRyOwogCi0gIHJldHVybiBudWxscHRyOworICAvLyBUT0RPKGRzaW5jbGFpcik6IEFkZFBydWdlTm9kZSBzaG91bGQgdGFrZSBvd25lcnNoaXAgb2YgdGhlIHBvaW50ZXIuCisgIEFkZFB1cmdlTm9kZShwTm9kZS5nZXQoKSk7CisgIHJldHVybiBwTm9kZS5yZWxlYXNlKCk7CiB9CiAKIHZvaWQgQ1hGQV9Eb2N1bWVudDo6QWRkUHVyZ2VOb2RlKENYRkFfTm9kZSogcE5vZGUpIHsKQEAgLTI0OCwxMyArMjM5LDYgQEAKICAgcmV0dXJuICEhbV9QdXJnZU5vZGVzLmVyYXNlKHBOb2RlKTsKIH0KIAotdm9pZCBDWEZBX0RvY3VtZW50OjpQdXJnZU5vZGVzKCkgewotICBmb3IgKENYRkFfTm9kZSogcE5vZGUgOiBtX1B1cmdlTm9kZXMpCi0gICAgZGVsZXRlIHBOb2RlOwotCi0gIG1fUHVyZ2VOb2Rlcy5jbGVhcigpOwotfQotCiB2b2lkIENYRkFfRG9jdW1lbnQ6OlNldEZsYWcodWludDMyX3QgZHdGbGFnLCBib29sIGJPbikgewogICBpZiAoYk9uKQogICAgIG1fZHdEb2NGbGFncyB8PSBkd0ZsYWc7CkBAIC0yNzAsMTkgKzI1NCwyMiBAQAogICBpZiAoIXBDb25maWcpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIENGWF9XaWRlU3RyaW5nIHdzSW50ZXJhY3RpdmU7Ci0gIENYRkFfTm9kZSogcFByZXNlbnQgPSBwQ29uZmlnLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRWxlbWVudDo6UHJlc2VudCk7CisgIENYRkFfUHJlc2VudCogcFByZXNlbnQgPQorICAgICAgcENvbmZpZy0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9QcmVzZW50PihYRkFfRWxlbWVudDo6UHJlc2VudCk7CiAgIGlmICghcFByZXNlbnQpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIENYRkFfTm9kZSogcFBERiA9IHBQcmVzZW50LT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRWxlbWVudDo6UGRmKTsKKyAgQ1hGQV9QZGYqIHBQREYgPSBwUHJlc2VudC0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9QZGY+KFhGQV9FbGVtZW50OjpQZGYpOwogICBpZiAoIXBQREYpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIENYRkFfTm9kZSogcEZvcm1GaWxsZXIgPSBwUERGLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6SW50ZXJhY3RpdmUpOworICBDWEZBX0ludGVyYWN0aXZlKiBwRm9ybUZpbGxlciA9CisgICAgICBwUERGLT5HZXRDaGlsZDxDWEZBX0ludGVyYWN0aXZlPigwLCBYRkFfRWxlbWVudDo6SW50ZXJhY3RpdmUsIGZhbHNlKTsKICAgaWYgKHBGb3JtRmlsbGVyKSB7CiAgICAgbV9kd0RvY0ZsYWdzIHw9IFhGQV9ET0NGTEFHX0hhc0ludGVyYWN0aXZlOwotICAgIGlmIChwRm9ybUZpbGxlci0+VHJ5Q29udGVudCh3c0ludGVyYWN0aXZlKSAmJiB3c0ludGVyYWN0aXZlID09IEwiMSIpIHsKKworICAgIFdpZGVTdHJpbmcgd3NJbnRlcmFjdGl2ZSA9IHBGb3JtRmlsbGVyLT5KU09iamVjdCgpLT5HZXRDb250ZW50KGZhbHNlKTsKKyAgICBpZiAod3NJbnRlcmFjdGl2ZSA9PSBMIjEiKSB7CiAgICAgICBtX2R3RG9jRmxhZ3MgfD0gWEZBX0RPQ0ZMQUdfSW50ZXJhY3RpdmU7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0yOTIsNDQgKzI3OSw0NSBAQAogCiBDWEZBX0xvY2FsZU1nciogQ1hGQV9Eb2N1bWVudDo6R2V0TG9jYWxNZ3IoKSB7CiAgIGlmICghbV9wTG9jYWxNZ3IpIHsKLSAgICBtX3BMb2NhbE1nciA9Ci0gICAgICAgIG5ldyBDWEZBX0xvY2FsZU1ncihUb05vZGUoR2V0WEZBT2JqZWN0KFhGQV9IQVNIQ09ERV9Mb2NhbGVTZXQpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldE5vdGlmeSgpLT5HZXRBcHBQcm92aWRlcigpLT5HZXRMYW5ndWFnZSgpKTsKKyAgICBtX3BMb2NhbE1nciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0xvY2FsZU1ncj4oCisgICAgICAgIFRvTm9kZShHZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0xvY2FsZVNldCkpLAorICAgICAgICBHZXROb3RpZnkoKS0+R2V0QXBwUHJvdmlkZXIoKS0+R2V0TGFuZ3VhZ2UoKSk7CiAgIH0KLSAgcmV0dXJuIG1fcExvY2FsTWdyOworICByZXR1cm4gbV9wTG9jYWxNZ3IuZ2V0KCk7CiB9CiAKLUNYRkFfU2NyaXB0Q29udGV4dCogQ1hGQV9Eb2N1bWVudDo6SW5pdFNjcmlwdENvbnRleHQodjg6Oklzb2xhdGUqIHBJc29sYXRlKSB7Ci0gIGlmICghbV9wU2NyaXB0Q29udGV4dCkKLSAgICBtX3BTY3JpcHRDb250ZXh0ID0gbmV3IENYRkFfU2NyaXB0Q29udGV4dCh0aGlzKTsKLSAgbV9wU2NyaXB0Q29udGV4dC0+SW5pdGlhbGl6ZShwSXNvbGF0ZSk7Ci0gIHJldHVybiBtX3BTY3JpcHRDb250ZXh0OworQ0ZYSlNFX0VuZ2luZSogQ1hGQV9Eb2N1bWVudDo6SW5pdFNjcmlwdENvbnRleHQodjg6Oklzb2xhdGUqIHBJc29sYXRlKSB7CisgIEFTU0VSVCghbV9wU2NyaXB0Q29udGV4dCk7CisgIG1fcFNjcmlwdENvbnRleHQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYSlNFX0VuZ2luZT4odGhpcywgcElzb2xhdGUpOworICByZXR1cm4gbV9wU2NyaXB0Q29udGV4dC5nZXQoKTsKIH0KIAotQ1hGQV9TY3JpcHRDb250ZXh0KiBDWEZBX0RvY3VtZW50OjpHZXRTY3JpcHRDb250ZXh0KCkgewotICBpZiAoIW1fcFNjcmlwdENvbnRleHQpCi0gICAgbV9wU2NyaXB0Q29udGV4dCA9IG5ldyBDWEZBX1NjcmlwdENvbnRleHQodGhpcyk7Ci0gIHJldHVybiBtX3BTY3JpcHRDb250ZXh0OworLy8gV2UgaGF2ZSB0byBjYWxsIHxJbml0U2NyaXB0Q29udGV4dHwgYmVmb3JlIGFueSBjYWxscyB0byB8R2V0U2NyaXB0Q29udGV4dHwKKy8vIG9yIHRoZSBjb250ZXh0IHdvbid0IGhhdmUgYW4gaXNvbGF0ZSBzZXQgaW50byBpdC4KK0NGWEpTRV9FbmdpbmUqIENYRkFfRG9jdW1lbnQ6OkdldFNjcmlwdENvbnRleHQoKSB7CisgIEFTU0VSVChtX3BTY3JpcHRDb250ZXh0KTsKKyAgcmV0dXJuIG1fcFNjcmlwdENvbnRleHQuZ2V0KCk7CiB9CiAKIFhGQV9WRVJTSU9OIENYRkFfRG9jdW1lbnQ6OlJlY29nbml6ZVhGQVZlcnNpb25OdW1iZXIoCi0gICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVGVtcGxhdGVOUykgewotICBDRlhfV2lkZVN0cmluZ0Mgd3NUZW1wbGF0ZVVSSVByZWZpeCA9Ci0gICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1RlbXBsYXRlKS0+cFVSSTsKLSAgRlhfU1RSU0laRSBuUHJlZml4TGVuZ3RoID0gd3NUZW1wbGF0ZVVSSVByZWZpeC5HZXRMZW5ndGgoKTsKLSAgaWYgKENGWF9XaWRlU3RyaW5nQyh3c1RlbXBsYXRlTlMuY19zdHIoKSwgd3NUZW1wbGF0ZU5TLkdldExlbmd0aCgpKSAhPQorICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzVGVtcGxhdGVOUykgeworICBXaWRlU3RyaW5nVmlldyB3c1RlbXBsYXRlVVJJUHJlZml4KGtUZW1wbGF0ZU5TKTsKKyAgc2l6ZV90IG5QcmVmaXhMZW5ndGggPSB3c1RlbXBsYXRlVVJJUHJlZml4LkdldExlbmd0aCgpOworICBpZiAoV2lkZVN0cmluZ1ZpZXcod3NUZW1wbGF0ZU5TLmNfc3RyKCksIHdzVGVtcGxhdGVOUy5HZXRMZW5ndGgoKSkgIT0KICAgICAgIHdzVGVtcGxhdGVVUklQcmVmaXgpIHsKICAgICByZXR1cm4gWEZBX1ZFUlNJT05fVU5LTk9XTjsKICAgfQotICBGWF9TVFJTSVpFIG5Eb3RQb3MgPSB3c1RlbXBsYXRlTlMuRmluZCgnLicsIG5QcmVmaXhMZW5ndGgpOwotICBpZiAobkRvdFBvcyA9PSAoRlhfU1RSU0laRSktMSkKKyAgYXV0byBuRG90UG9zID0gd3NUZW1wbGF0ZU5TLkZpbmQoJy4nLCBuUHJlZml4TGVuZ3RoKTsKKyAgaWYgKCFuRG90UG9zLmhhc192YWx1ZSgpKQogICAgIHJldHVybiBYRkFfVkVSU0lPTl9VTktOT1dOOwogCiAgIGludDhfdCBpTWFqb3IgPSBGWFNZU193dG9pKAotICAgICAgd3NUZW1wbGF0ZU5TLk1pZChuUHJlZml4TGVuZ3RoLCBuRG90UG9zIC0gblByZWZpeExlbmd0aCkuY19zdHIoKSk7Ci0gIGludDhfdCBpTWlub3IgPSBGWFNZU193dG9pKAotICAgICAgd3NUZW1wbGF0ZU5TLk1pZChuRG90UG9zICsgMSwgd3NUZW1wbGF0ZU5TLkdldExlbmd0aCgpIC0gbkRvdFBvcyAtIDIpCi0gICAgICAgICAgLmNfc3RyKCkpOworICAgICAgd3NUZW1wbGF0ZU5TLk1pZChuUHJlZml4TGVuZ3RoLCBuRG90UG9zLnZhbHVlKCkgLSBuUHJlZml4TGVuZ3RoKS5jX3N0cigpKTsKKyAgaW50OF90IGlNaW5vciA9CisgICAgICBGWFNZU193dG9pKHdzVGVtcGxhdGVOUworICAgICAgICAgICAgICAgICAgICAgLk1pZChuRG90UG9zLnZhbHVlKCkgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3c1RlbXBsYXRlTlMuR2V0TGVuZ3RoKCkgLSBuRG90UG9zLnZhbHVlKCkgLSAyKQorICAgICAgICAgICAgICAgICAgICAgLmNfc3RyKCkpOwogICBYRkFfVkVSU0lPTiBlVmVyc2lvbiA9IChYRkFfVkVSU0lPTikoKGludDMyX3QpaU1ham9yICogMTAwICsgaU1pbm9yKTsKICAgaWYgKGVWZXJzaW9uIDwgWEZBX1ZFUlNJT05fTUlOIHx8IGVWZXJzaW9uID4gWEZBX1ZFUlNJT05fTUFYKQogICAgIHJldHVybiBYRkFfVkVSU0lPTl9VTktOT1dOOwpAQCAtMzM5LDE4ICszMjcsMTYgQEAKIH0KIAogQ1hGQV9Ob2RlKiBDWEZBX0RvY3VtZW50OjpHZXROb2RlQnlJRChDWEZBX05vZGUqIHBSb290LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzSUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzSUQpIHsKICAgaWYgKCFwUm9vdCB8fCB3c0lELklzRW1wdHkoKSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAogICBDWEZBX05vZGVJdGVyYXRvciBzSXRlcmF0b3IocFJvb3QpOwogICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwTm9kZTsKICAgICAgICBwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJRFZhbDsKLSAgICBpZiAocE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfSWQsIHdzSURWYWwpICYmICF3c0lEVmFsLklzRW1wdHkoKSkgewotICAgICAgaWYgKHdzSURWYWwgPT0gd3NJRCkKLSAgICAgICAgcmV0dXJuIHBOb2RlOwotICAgIH0KKyAgICBXaWRlU3RyaW5nIHdzSURWYWwgPSBwTm9kZS0+SlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6SWQpOworICAgIGlmICghd3NJRFZhbC5Jc0VtcHR5KCkgJiYgd3NJRFZhbCA9PSB3c0lEKQorICAgICAgcmV0dXJuIHBOb2RlOwogICB9CiAgIHJldHVybiBudWxscHRyOwogfQpAQCAtMzYxLDUwICszNDcsNTcgQEAKICAgICByZXR1cm47CiAKICAgc3RkOjptYXA8dWludDMyX3QsIENYRkFfTm9kZSo+IG1JRE1hcDsKLSAgQ1hGQV9Ob2RlU2V0IHNVc2VOb2RlczsKKyAgc3RkOjpzZXQ8Q1hGQV9Ob2RlKj4gc1VzZU5vZGVzOwogICBDWEZBX05vZGVJdGVyYXRvciBzSXRlcmF0b3IocFRlbXBsYXRlUm9vdCk7CiAgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHNJdGVyYXRvci5HZXRDdXJyZW50KCk7IHBOb2RlOwogICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgewotICAgIENGWF9XaWRlU3RyaW5nQyB3c0lEVmFsOwotICAgIGlmIChwTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9JZCwgd3NJRFZhbCkgJiYgIXdzSURWYWwuSXNFbXB0eSgpKSB7Ci0gICAgICBtSURNYXBbRlhfSGFzaENvZGVfR2V0Vyh3c0lEVmFsLCBmYWxzZSldID0gcE5vZGU7Ci0gICAgfQotICAgIENGWF9XaWRlU3RyaW5nQyB3c1VzZVZhbDsKLSAgICBpZiAocE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVXNlLCB3c1VzZVZhbCkgJiYgIXdzVXNlVmFsLklzRW1wdHkoKSkgeworICAgIFdpZGVTdHJpbmcgd3NJRFZhbCA9IHBOb2RlLT5KU09iamVjdCgpLT5HZXRDRGF0YShYRkFfQXR0cmlidXRlOjpJZCk7CisgICAgaWYgKCF3c0lEVmFsLklzRW1wdHkoKSkKKyAgICAgIG1JRE1hcFtGWF9IYXNoQ29kZV9HZXRXKHdzSURWYWwuQXNTdHJpbmdWaWV3KCksIGZhbHNlKV0gPSBwTm9kZTsKKworICAgIFdpZGVTdHJpbmcgd3NVc2VWYWwgPSBwTm9kZS0+SlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6VXNlKTsKKyAgICBpZiAoIXdzVXNlVmFsLklzRW1wdHkoKSkgewogICAgICAgc1VzZU5vZGVzLmluc2VydChwTm9kZSk7Ci0gICAgfSBlbHNlIGlmIChwTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Vc2VocmVmLCB3c1VzZVZhbCkgJiYKLSAgICAgICAgICAgICAgICF3c1VzZVZhbC5Jc0VtcHR5KCkpIHsKLSAgICAgIHNVc2VOb2Rlcy5pbnNlcnQocE5vZGUpOworICAgIH0gZWxzZSB7CisgICAgICB3c1VzZVZhbCA9IHBOb2RlLT5KU09iamVjdCgpLT5HZXRDRGF0YShYRkFfQXR0cmlidXRlOjpVc2VocmVmKTsKKyAgICAgIGlmICghd3NVc2VWYWwuSXNFbXB0eSgpKQorICAgICAgICBzVXNlTm9kZXMuaW5zZXJ0KHBOb2RlKTsKICAgICB9CiAgIH0KIAogICBmb3IgKENYRkFfTm9kZSogcFVzZUhyZWZOb2RlIDogc1VzZU5vZGVzKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NVc2VWYWw7Ci0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVVJJLCB3c0lELCB3c1NPTTsKLSAgICBpZiAocFVzZUhyZWZOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1VzZWhyZWYsIHdzVXNlVmFsKSAmJgotICAgICAgICAhd3NVc2VWYWwuSXNFbXB0eSgpKSB7Ci0gICAgICBGWF9TVFJTSVpFIHVTaGFycFBvcyA9IHdzVXNlVmFsLkZpbmQoJyMnKTsKLSAgICAgIGlmICh1U2hhcnBQb3MgPCAwKSB7Ci0gICAgICAgIHdzVVJJID0gd3NVc2VWYWwuQXNTdHJpbmdDKCk7CisgICAgV2lkZVN0cmluZ1ZpZXcgd3NVUkk7CisgICAgV2lkZVN0cmluZ1ZpZXcgd3NJRDsKKyAgICBXaWRlU3RyaW5nVmlldyB3c1NPTTsKKworICAgIFdpZGVTdHJpbmcgd3NVc2VWYWwgPQorICAgICAgICBwVXNlSHJlZk5vZGUtPkpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYpOworICAgIGlmICghd3NVc2VWYWwuSXNFbXB0eSgpKSB7CisgICAgICBhdXRvIHVTaGFycFBvcyA9IHdzVXNlVmFsLkZpbmQoJyMnKTsKKyAgICAgIGlmICghdVNoYXJwUG9zLmhhc192YWx1ZSgpKSB7CisgICAgICAgIHdzVVJJID0gd3NVc2VWYWwuQXNTdHJpbmdWaWV3KCk7CiAgICAgICB9IGVsc2UgewotICAgICAgICB3c1VSSSA9IENGWF9XaWRlU3RyaW5nQyh3c1VzZVZhbC5jX3N0cigpLCB1U2hhcnBQb3MpOwotICAgICAgICBGWF9TVFJTSVpFIHVMZW4gPSB3c1VzZVZhbC5HZXRMZW5ndGgoKTsKLSAgICAgICAgaWYgKHVMZW4gPj0gdVNoYXJwUG9zICsgNSAmJgotICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDKHdzVXNlVmFsLmNfc3RyKCkgKyB1U2hhcnBQb3MsIDUpID09IEwiI3NvbSgiICYmCisgICAgICAgIHdzVVJJID0gV2lkZVN0cmluZ1ZpZXcod3NVc2VWYWwuY19zdHIoKSwgdVNoYXJwUG9zLnZhbHVlKCkpOworICAgICAgICBzaXplX3QgdUxlbiA9IHdzVXNlVmFsLkdldExlbmd0aCgpOworICAgICAgICBpZiAodUxlbiA+PSB1U2hhcnBQb3MudmFsdWUoKSArIDUgJiYKKyAgICAgICAgICAgIFdpZGVTdHJpbmdWaWV3KHdzVXNlVmFsLmNfc3RyKCkgKyB1U2hhcnBQb3MudmFsdWUoKSwgNSkgPT0KKyAgICAgICAgICAgICAgICBMIiNzb20oIiAmJgogICAgICAgICAgICAgd3NVc2VWYWxbdUxlbiAtIDFdID09ICcpJykgewotICAgICAgICAgIHdzU09NID0gQ0ZYX1dpZGVTdHJpbmdDKHdzVXNlVmFsLmNfc3RyKCkgKyB1U2hhcnBQb3MgKyA1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMZW4gLSAxIC0gdVNoYXJwUG9zIC0gNSk7CisgICAgICAgICAgd3NTT00gPSBXaWRlU3RyaW5nVmlldyh3c1VzZVZhbC5jX3N0cigpICsgdVNoYXJwUG9zLnZhbHVlKCkgKyA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdUxlbiAtIDEgLSB1U2hhcnBQb3MudmFsdWUoKSAtIDUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHdzSUQgPSBDRlhfV2lkZVN0cmluZ0Mod3NVc2VWYWwuY19zdHIoKSArIHVTaGFycFBvcyArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1TGVuIC0gdVNoYXJwUG9zIC0gMSk7CisgICAgICAgICAgd3NJRCA9IFdpZGVTdHJpbmdWaWV3KHdzVXNlVmFsLmNfc3RyKCkgKyB1U2hhcnBQb3MudmFsdWUoKSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVMZW4gLSB1U2hhcnBQb3MudmFsdWUoKSAtIDEpOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChwVXNlSHJlZk5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVXNlLCB3c1VzZVZhbCkgJiYKLSAgICAgICAgICAgICAgICF3c1VzZVZhbC5Jc0VtcHR5KCkpIHsKLSAgICAgIGlmICh3c1VzZVZhbFswXSA9PSAnIycpCi0gICAgICAgIHdzSUQgPSBDRlhfV2lkZVN0cmluZ0Mod3NVc2VWYWwuY19zdHIoKSArIDEsIHdzVXNlVmFsLkdldExlbmd0aCgpIC0gMSk7Ci0gICAgICBlbHNlCi0gICAgICAgIHdzU09NID0gQ0ZYX1dpZGVTdHJpbmdDKHdzVXNlVmFsLmNfc3RyKCksIHdzVXNlVmFsLkdldExlbmd0aCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgd3NVc2VWYWwgPSBwVXNlSHJlZk5vZGUtPkpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6OlVzZSk7CisgICAgICBpZiAoIXdzVXNlVmFsLklzRW1wdHkoKSkgeworICAgICAgICBpZiAod3NVc2VWYWxbMF0gPT0gJyMnKQorICAgICAgICAgIHdzSUQgPSBXaWRlU3RyaW5nVmlldyh3c1VzZVZhbC5jX3N0cigpICsgMSwgd3NVc2VWYWwuR2V0TGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHdzU09NID0gV2lkZVN0cmluZ1ZpZXcod3NVc2VWYWwuY19zdHIoKSwgd3NVc2VWYWwuR2V0TGVuZ3RoKCkpOworICAgICAgfQogICAgIH0KIAogICAgIGlmICghd3NVUkkuSXNFbXB0eSgpICYmIHdzVVJJICE9IEwiLiIpCkBAIC00MTUsMTEgKzQwOCwxMSBAQAogICAgICAgdWludDMyX3QgZHdGbGFnID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXMgfAogICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfCBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwKICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5nczsKLSAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7Ci0gICAgICBpbnQzMl90IGlSZXQgPSBtX3BTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cyhwVXNlSHJlZk5vZGUsIHdzU09NLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3ZlTm9kZVJTLCBkd0ZsYWcpOwotICAgICAgaWYgKGlSZXQgPiAwICYmIHJlc292ZU5vZGVSUy5ub2Rlc1swXS0+SXNOb2RlKCkpCi0gICAgICAgIHBQcm90b05vZGUgPSByZXNvdmVOb2RlUlMubm9kZXNbMF0tPkFzTm9kZSgpOworICAgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc29sdmVOb2RlUlM7CisgICAgICBpbnQzMl90IGlSZXQgPSBtX3BTY3JpcHRDb250ZXh0LT5SZXNvbHZlT2JqZWN0cygKKyAgICAgICAgICBwVXNlSHJlZk5vZGUsIHdzU09NLCAmcmVzb2x2ZU5vZGVSUywgZHdGbGFnLCBudWxscHRyKTsKKyAgICAgIGlmIChpUmV0ID4gMCAmJiByZXNvbHZlTm9kZVJTLm9iamVjdHMuZnJvbnQoKS0+SXNOb2RlKCkpCisgICAgICAgIHBQcm90b05vZGUgPSByZXNvbHZlTm9kZVJTLm9iamVjdHMuZnJvbnQoKS0+QXNOb2RlKCk7CiAgICAgfSBlbHNlIGlmICghd3NJRC5Jc0VtcHR5KCkpIHsKICAgICAgIGF1dG8gaXQgPSBtSURNYXAuZmluZChGWF9IYXNoQ29kZV9HZXRXKHdzSUQsIGZhbHNlKSk7CiAgICAgICBpZiAoaXQgPT0gbUlETWFwLmVuZCgpKQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgKaW5kZXggZmRkMjMwZC4uYmQ1NzZlNiAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnQuaAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oCkBAIC04LDEwICs4LDEyIEBACiAjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RPQ1VNRU5UX0hfCiAKICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJ4ZmEvZnhmYS9meGZhLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9sb2NhbGVtZ3IuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xvY2FsZW1nci5oIgogCiBlbnVtIFhGQV9WRVJTSU9OIHsKICAgWEZBX1ZFUlNJT05fVU5LTk9XTiA9IDAsCkBAIC0zOCw1NyArNDAsNTQgQEAKICAgWEZBX0RPQ0ZMQUdfU2NyaXB0aW5nID0gMHgwMDA4CiB9OwogCi1jbGFzcyBDRkRFX1hNTERvYzsKK2NsYXNzIENGWF9YTUxEb2M7CitjbGFzcyBDRlhKU0VfRW5naW5lOwogY2xhc3MgQ1NjcmlwdF9EYXRhV2luZG93OwogY2xhc3MgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOwogY2xhc3MgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw7CiBjbGFzcyBDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOwogY2xhc3MgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDsKIGNsYXNzIENTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWw7Ci1jbGFzcyBDWEZBX0RvY3VtZW50OworY2xhc3MgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtOworY2xhc3MgQ1hGQV9Eb2N1bWVudFBhcnNlcjsKK2NsYXNzIENYRkFfRkZOb3RpZnk7CiBjbGFzcyBDWEZBX0xheW91dEl0ZW07CiBjbGFzcyBDWEZBX0xheW91dFByb2Nlc3NvcjsKIGNsYXNzIENYRkFfTm9kZTsKLWNsYXNzIENYRkFfTGF5b3V0UHJvY2Vzc29yOwotY2xhc3MgQ1hGQV9Eb2N1bWVudFBhcnNlcjsKLWNsYXNzIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbTsKLWNsYXNzIENYRkFfRkZOb3RpZnk7Ci1jbGFzcyBDWEZBX1NjcmlwdENvbnRleHQ7CitjbGFzcyBDWEZBX09iamVjdDsKIAogY2xhc3MgQ1hGQV9Eb2N1bWVudCB7CiAgcHVibGljOgogICBleHBsaWNpdCBDWEZBX0RvY3VtZW50KENYRkFfRG9jdW1lbnRQYXJzZXIqIHBQYXJzZXIpOwogICB+Q1hGQV9Eb2N1bWVudCgpOwogCi0gIENYRkFfU2NyaXB0Q29udGV4dCogSW5pdFNjcmlwdENvbnRleHQodjg6Oklzb2xhdGUqIHBJc29sYXRlKTsKKyAgQ0ZYSlNFX0VuZ2luZSogSW5pdFNjcmlwdENvbnRleHQodjg6Oklzb2xhdGUqIHBJc29sYXRlKTsKIAogICBDWEZBX05vZGUqIEdldFJvb3QoKSBjb25zdCB7IHJldHVybiBtX3BSb290Tm9kZTsgfQogCi0gIENGREVfWE1MRG9jKiBHZXRYTUxEb2MoKSBjb25zdDsKKyAgQ0ZYX1hNTERvYyogR2V0WE1MRG9jKCkgY29uc3Q7CiAgIENYRkFfRkZOb3RpZnkqIEdldE5vdGlmeSgpIGNvbnN0OwogICBDWEZBX0xvY2FsZU1nciogR2V0TG9jYWxNZ3IoKTsKICAgQ1hGQV9PYmplY3QqIEdldFhGQU9iamVjdChYRkFfSGFzaENvZGUgd3NOb2RlTmFtZUhhc2gpOwotICBDWEZBX05vZGUqIEdldE5vZGVCeUlEKENYRkFfTm9kZSogcFJvb3QsIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NJRCk7Ci0gIENYRkFfTm9kZSogR2V0Tm90QmluZE5vZGUoQ1hGQV9PYmpBcnJheSYgYXJyYXlOb2Rlcyk7CisgIENYRkFfTm9kZSogR2V0Tm9kZUJ5SUQoQ1hGQV9Ob2RlKiBwUm9vdCwgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzSUQpOworICBDWEZBX05vZGUqIEdldE5vdEJpbmROb2RlKGNvbnN0IHN0ZDo6dmVjdG9yPENYRkFfT2JqZWN0Kj4mIGFycmF5Tm9kZXMpOwogICBDWEZBX0xheW91dFByb2Nlc3NvciogR2V0TGF5b3V0UHJvY2Vzc29yKCk7CiAgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBHZXREb2NMYXlvdXQoKTsKLSAgQ1hGQV9TY3JpcHRDb250ZXh0KiBHZXRTY3JpcHRDb250ZXh0KCk7CisgIENGWEpTRV9FbmdpbmUqIEdldFNjcmlwdENvbnRleHQoKTsKIAogICB2b2lkIFNldFJvb3QoQ1hGQV9Ob2RlKiBwTmV3Um9vdCk7CiAKICAgdm9pZCBBZGRQdXJnZU5vZGUoQ1hGQV9Ob2RlKiBwTm9kZSk7CiAgIGJvb2wgUmVtb3ZlUHVyZ2VOb2RlKENYRkFfTm9kZSogcE5vZGUpOwotICB2b2lkIFB1cmdlTm9kZXMoKTsKIAogICBib29sIEhhc0ZsYWcodWludDMyX3QgZHdGbGFnKSB7IHJldHVybiAobV9kd0RvY0ZsYWdzICYgZHdGbGFnKSA9PSBkd0ZsYWc7IH0KICAgdm9pZCBTZXRGbGFnKHVpbnQzMl90IGR3RmxhZywgYm9vbCBiT24pOwogCiAgIGJvb2wgSXNJbnRlcmFjdGl2ZSgpOwogICBYRkFfVkVSU0lPTiBHZXRDdXJWZXJzaW9uTW9kZSgpIHsgcmV0dXJuIG1fZUN1clZlcnNpb25Nb2RlOyB9Ci0gIFhGQV9WRVJTSU9OIFJlY29nbml6ZVhGQVZlcnNpb25OdW1iZXIoQ0ZYX1dpZGVTdHJpbmcmIHdzVGVtcGxhdGVOUyk7CisgIFhGQV9WRVJTSU9OIFJlY29nbml6ZVhGQVZlcnNpb25OdW1iZXIoY29uc3QgV2lkZVN0cmluZyYgd3NUZW1wbGF0ZU5TKTsKIAotICBDWEZBX05vZGUqIENyZWF0ZU5vZGUodWludDMyX3QgZHdQYWNrZXQsIFhGQV9FbGVtZW50IGVFbGVtZW50KTsKLSAgQ1hGQV9Ob2RlKiBDcmVhdGVOb2RlKGNvbnN0IFhGQV9QQUNLRVRJTkZPKiBwUGFja2V0LCBYRkFfRWxlbWVudCBlRWxlbWVudCk7CisgIENYRkFfTm9kZSogQ3JlYXRlTm9kZShYRkFfUGFja2V0VHlwZSBwYWNrZXQsIFhGQV9FbGVtZW50IGVFbGVtZW50KTsKIAogICB2b2lkIERvUHJvdG9NZXJnZSgpOwogICB2b2lkIERvRGF0YU1lcmdlKCk7CkBAIC0xMDQsMjEgKzEwMywyMSBAQAogICB2b2lkIENsZWFyTGF5b3V0RGF0YSgpOwogCiAgIHN0ZDo6bWFwPHVpbnQzMl90LCBDWEZBX05vZGUqPiBtX3JnR2xvYmFsQmluZGluZzsKLSAgQ1hGQV9Ob2RlQXJyYXkgbV9wUGVuZGluZ1BhZ2VTZXQ7CisgIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+IG1fcFBlbmRpbmdQYWdlU2V0OwogCi0gcHJvdGVjdGVkOgorIHByaXZhdGU6CiAgIENYRkFfRG9jdW1lbnRQYXJzZXIqIG1fcFBhcnNlcjsKLSAgQ1hGQV9TY3JpcHRDb250ZXh0KiBtX3BTY3JpcHRDb250ZXh0OwotICBDWEZBX0xheW91dFByb2Nlc3NvciogbV9wTGF5b3V0UHJvY2Vzc29yOwogICBDWEZBX05vZGUqIG1fcFJvb3ROb2RlOwotICBDWEZBX0xvY2FsZU1nciogbV9wTG9jYWxNZ3I7Ci0gIENTY3JpcHRfRGF0YVdpbmRvdyogbV9wU2NyaXB0RGF0YVdpbmRvdzsKLSAgQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsKiBtX3BTY3JpcHRFdmVudDsKLSAgQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWwqIG1fcFNjcmlwdEhvc3Q7Ci0gIENTY3JpcHRfTG9nUHNldWRvTW9kZWwqIG1fcFNjcmlwdExvZzsKLSAgQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbCogbV9wU2NyaXB0TGF5b3V0OwotICBDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsKiBtX3BTY3JpcHRTaWduYXR1cmU7Ci0gIENYRkFfTm9kZVNldCBtX1B1cmdlTm9kZXM7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfRW5naW5lPiBtX3BTY3JpcHRDb250ZXh0OworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9MYXlvdXRQcm9jZXNzb3I+IG1fcExheW91dFByb2Nlc3NvcjsKKyAgc3RkOjp1bmlxdWVfcHRyPENYRkFfTG9jYWxlTWdyPiBtX3BMb2NhbE1ncjsKKyAgc3RkOjp1bmlxdWVfcHRyPENTY3JpcHRfRGF0YVdpbmRvdz4gbV9wU2NyaXB0RGF0YVdpbmRvdzsKKyAgc3RkOjp1bmlxdWVfcHRyPENTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbD4gbV9wU2NyaXB0RXZlbnQ7CisgIHN0ZDo6dW5pcXVlX3B0cjxDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbD4gbV9wU2NyaXB0SG9zdDsKKyAgc3RkOjp1bmlxdWVfcHRyPENTY3JpcHRfTG9nUHNldWRvTW9kZWw+IG1fcFNjcmlwdExvZzsKKyAgc3RkOjp1bmlxdWVfcHRyPENTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw+IG1fcFNjcmlwdExheW91dDsKKyAgc3RkOjp1bmlxdWVfcHRyPENTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWw+IG1fcFNjcmlwdFNpZ25hdHVyZTsKKyAgc3RkOjpzZXQ8Q1hGQV9Ob2RlKj4gbV9QdXJnZU5vZGVzOwogICBYRkFfVkVSU0lPTiBtX2VDdXJWZXJzaW9uTW9kZTsKICAgdWludDMyX3QgbV9kd0RvY0ZsYWdzOwogfTsKZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50X3BhcnNlci5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudF9wYXJzZXIuY3BwCmluZGV4IDkwYmU1NjguLjY0NDZlYTMgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50X3BhcnNlci5jcHAKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnRfcGFyc2VyLmNwcApAQCAtNiwxOSArNiwyMCBAQAogCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnRfcGFyc2VyLmgiCiAKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sZG9jLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmEuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgogCiBDWEZBX0RvY3VtZW50UGFyc2VyOjpDWEZBX0RvY3VtZW50UGFyc2VyKENYRkFfRkZOb3RpZnkqIHBOb3RpZnkpCi0gICAgOiBtX25vZGVQYXJzZXIobnVsbHB0ciwgdHJ1ZSksIG1fcE5vdGlmeShwTm90aWZ5KSB7fQorICAgIDogbV9wTm90aWZ5KHBOb3RpZnkpIHt9CiAKIENYRkFfRG9jdW1lbnRQYXJzZXI6On5DWEZBX0RvY3VtZW50UGFyc2VyKCkgewogfQogCiBpbnQzMl90IENYRkFfRG9jdW1lbnRQYXJzZXI6OlN0YXJ0UGFyc2UoCi0gICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcFN0cmVhbSwKLSAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkgeworICAgIGNvbnN0IFJldGFpblB0cjxJRlhfU2Vla2FibGVTdHJlYW0+JiBwU3RyZWFtLAorICAgIFhGQV9QYWNrZXRUeXBlIGVQYWNrZXRJRCkgewogICBtX3BEb2N1bWVudC5yZXNldCgpOwogICBtX25vZGVQYXJzZXIuQ2xvc2VQYXJzZXIoKTsKIApAQCAtMzAsOCArMzEsOCBAQAogICByZXR1cm4gblJldFN0YXR1czsKIH0KIAotaW50MzJfdCBDWEZBX0RvY3VtZW50UGFyc2VyOjpEb1BhcnNlKElGWF9QYXVzZSogcFBhdXNlKSB7Ci0gIGludDMyX3QgblJldFN0YXR1cyA9IG1fbm9kZVBhcnNlci5Eb1BhcnNlKHBQYXVzZSk7CitpbnQzMl90IENYRkFfRG9jdW1lbnRQYXJzZXI6OkRvUGFyc2UoKSB7CisgIGludDMyX3QgblJldFN0YXR1cyA9IG1fbm9kZVBhcnNlci5Eb1BhcnNlKCk7CiAgIGlmIChuUmV0U3RhdHVzID49IFhGQV9QQVJTRVNUQVRVU19Eb25lKSB7CiAgICAgQVNTRVJUKG1fcERvY3VtZW50KTsKICAgICBtX3BEb2N1bWVudC0+U2V0Um9vdChtX25vZGVQYXJzZXIuR2V0Um9vdE5vZGUoKSk7CkBAIC0zOSwxMiArNDAsMTIgQEAKICAgcmV0dXJuIG5SZXRTdGF0dXM7CiB9CiAKLUNGREVfWE1MRG9jKiBDWEZBX0RvY3VtZW50UGFyc2VyOjpHZXRYTUxEb2MoKSBjb25zdCB7CitDRlhfWE1MRG9jKiBDWEZBX0RvY3VtZW50UGFyc2VyOjpHZXRYTUxEb2MoKSBjb25zdCB7CiAgIHJldHVybiBtX25vZGVQYXJzZXIuR2V0WE1MRG9jKCk7CiB9CiAKIENYRkFfRkZOb3RpZnkqIENYRkFfRG9jdW1lbnRQYXJzZXI6OkdldE5vdGlmeSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcE5vdGlmeTsKKyAgcmV0dXJuIG1fcE5vdGlmeS5HZXQoKTsKIH0KIAogQ1hGQV9Eb2N1bWVudCogQ1hGQV9Eb2N1bWVudFBhcnNlcjo6R2V0RG9jdW1lbnQoKSBjb25zdCB7CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudF9wYXJzZXIuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50X3BhcnNlci5oCmluZGV4IDYxN2JkZGYuLjM1ZDcxNjAgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50X3BhcnNlci5oCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50X3BhcnNlci5oCkBAIC0xMSwzMCArMTEsMjkgQEAKIAogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NpbXBsZV9wYXJzZXIuaCIKIAotY2xhc3MgQ0ZERV9YTUxEb2M7CitjbGFzcyBDRlhfWE1MRG9jOwogY2xhc3MgQ1hGQV9Eb2N1bWVudDsKIGNsYXNzIENYRkFfRkZOb3RpZnk7CiBjbGFzcyBDWEZBX05vdGlmeTsKLWNsYXNzIElGWF9TZWVrYWJsZVJlYWRTdHJlYW07Ci1jbGFzcyBJRlhfUGF1c2U7CitjbGFzcyBJRlhfU2Vla2FibGVTdHJlYW07CiAKIGNsYXNzIENYRkFfRG9jdW1lbnRQYXJzZXIgewogIHB1YmxpYzoKICAgZXhwbGljaXQgQ1hGQV9Eb2N1bWVudFBhcnNlcihDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5KTsKICAgfkNYRkFfRG9jdW1lbnRQYXJzZXIoKTsKIAotICBpbnQzMl90IFN0YXJ0UGFyc2UoY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKTsKLSAgaW50MzJfdCBEb1BhcnNlKElGWF9QYXVzZSogcFBhdXNlKTsKKyAgaW50MzJfdCBTdGFydFBhcnNlKGNvbnN0IFJldGFpblB0cjxJRlhfU2Vla2FibGVTdHJlYW0+JiBwU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgZVBhY2tldElEKTsKKyAgaW50MzJfdCBEb1BhcnNlKCk7CiAKLSAgQ0ZERV9YTUxEb2MqIEdldFhNTERvYygpIGNvbnN0OworICBDRlhfWE1MRG9jKiBHZXRYTUxEb2MoKSBjb25zdDsKICAgQ1hGQV9GRk5vdGlmeSogR2V0Tm90aWZ5KCkgY29uc3Q7CiAgIENYRkFfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgY29uc3Q7CiAKLSBwcm90ZWN0ZWQ6Ci0gIENYRkFfU2ltcGxlUGFyc2VyIG1fbm9kZVBhcnNlcjsKLSAgQ1hGQV9GRk5vdGlmeSogbV9wTm90aWZ5OworIHByaXZhdGU6CisgIFVub3duZWRQdHI8Q1hGQV9GRk5vdGlmeT4gY29uc3QgbV9wTm90aWZ5OwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9Eb2N1bWVudD4gbV9wRG9jdW1lbnQ7CisgIENYRkFfU2ltcGxlUGFyc2VyIG1fbm9kZVBhcnNlcjsKIH07CiAKICNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRE9DVU1FTlRfUEFSU0VSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudGFzc2VtYmx5LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50YXNzZW1ibHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NjA3MWQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudGFzc2VtYmx5LmNwcApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudGFzc2VtYmx5LmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJkb2N1bWVudEFzc2VtYmx5IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRG9jdW1lbnRBc3NlbWJseTo6Q1hGQV9Eb2N1bWVudEFzc2VtYmx5KENYRkFfRG9jdW1lbnQqIGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RG9jdW1lbnRBc3NlbWJseSwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0RvY3VtZW50QXNzZW1ibHk6On5DWEZBX0RvY3VtZW50QXNzZW1ibHkoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnRhc3NlbWJseS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnRhc3NlbWJseS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMmQ0YTkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudGFzc2VtYmx5LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RPQ1VNRU5UQVNTRU1CTFlfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRE9DVU1FTlRBU1NFTUJMWV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0RvY3VtZW50QXNzZW1ibHkgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfRG9jdW1lbnRBc3NlbWJseShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0RvY3VtZW50QXNzZW1ibHkoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRE9DVU1FTlRBU1NFTUJMWV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZHJhdy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kcmF3LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDBkZDM3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZHJhdy5jcHAKQEAgLTAsMCArMSw2NCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZHJhdy5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2RyYXcuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHsKKyAgICB7WEZBX0VsZW1lbnQ6OlVpLCAxLCAwfSwgICAgIHtYRkFfRWxlbWVudDo6TWFyZ2luLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlBhcmEsIDEsIDB9LCAgIHtYRkFfRWxlbWVudDo6Qm9yZGVyLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkFzc2lzdCwgMSwgMH0sIHtYRkFfRWxlbWVudDo6VHJhdmVyc2FsLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OktlZXAsIDEsIDB9LCAgIHtYRkFfRWxlbWVudDo6Q2FwdGlvbiwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpEZXNjLCAxLCAwfSwgICB7WEZBX0VsZW1lbnQ6OkZvbnQsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6VmFsdWUsIDEsIDB9LCAge1hGQV9FbGVtZW50OjpFeHRyYXMsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkgsIFhGQV9BdHRyaWJ1dGVUeXBlOjpNZWFzdXJlLCAodm9pZCopTCIwaW4ifSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VywgWEZBX0F0dHJpYnV0ZVR5cGU6Ok1lYXN1cmUsICh2b2lkKilMIjBpbiJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpYLCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlksIFhGQV9BdHRyaWJ1dGVUeXBlOjpNZWFzdXJlLCAodm9pZCopTCIwaW4ifSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkhBbGlnbiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6TGVmdH0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6Um90YXRlLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpQcmVzZW5jZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6VmlzaWJsZX0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlZBbGlnbiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6VG9wfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TWF4SCwgWEZBX0F0dHJpYnV0ZVR5cGU6Ok1lYXN1cmUsICh2b2lkKilMIjBpbiJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpNYXhXLCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok1pbkgsIFhGQV9BdHRyaWJ1dGVUeXBlOjpNZWFzdXJlLCAodm9pZCopTCIwaW4ifSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TWluVywgWEZBX0F0dHJpYnV0ZVR5cGU6Ok1lYXN1cmUsICh2b2lkKilMIjBpbiJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpSZWxldmFudCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6Q29sU3BhbiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikxfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jYWxlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpBbmNob3JUeXBlLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpUb3BMZWZ0fSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiZHJhdyI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0RyYXc6OkNYRkFfRHJhdyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGFpbmVyTm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RHJhdywKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfRHJhdz4odGhpcykpIHt9CisKK0NYRkFfRHJhdzo6fkNYRkFfRHJhdygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kcmF3LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kcmF3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAzMTAzYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RyYXcuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRFJBV19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9EUkFXX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfRHJhdyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9EcmF3KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRHJhdygpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9EUkFXX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kcml2ZXIuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZHJpdmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODNjYmY2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZHJpdmVyLmNwcApAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kcml2ZXIuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0ge3tYRkFfRWxlbWVudDo6Rm9udEluZm8sIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6WGRjLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJkcml2ZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9Ecml2ZXI6OkNYRkFfRHJpdmVyKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkRyaXZlciwKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0RyaXZlcjo6fkNYRkFfRHJpdmVyKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RyaXZlci5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZHJpdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlNzMyZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RyaXZlci5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9EUklWRVJfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRFJJVkVSX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfRHJpdmVyIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0RyaXZlcihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0RyaXZlcigpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9EUklWRVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2RzaWdkYXRhLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RzaWdkYXRhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGQzZThlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZHNpZ2RhdGEuY3BwCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RzaWdkYXRhLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpWYWx1ZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiZFNpZ0RhdGEiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9EU2lnRGF0YTo6Q1hGQV9EU2lnRGF0YShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RFNpZ0RhdGEsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9EU2lnRGF0YTo6fkNYRkFfRFNpZ0RhdGEoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZHNpZ2RhdGEuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RzaWdkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNiYWViNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2RzaWdkYXRhLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RTSUdEQVRBX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RTSUdEQVRBX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfRFNpZ0RhdGEgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfRFNpZ0RhdGEoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9EU2lnRGF0YSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9EU0lHREFUQV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZHVwbGV4b3B0aW9uLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2R1cGxleG9wdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkNDE3MAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2R1cGxleG9wdGlvbi5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZHVwbGV4b3B0aW9uLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJkdXBsZXhPcHRpb24iOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9EdXBsZXhPcHRpb246OkNYRkFfRHVwbGV4T3B0aW9uKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpEdXBsZXhPcHRpb24sCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9EdXBsZXhPcHRpb246On5DWEZBX0R1cGxleE9wdGlvbigpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kdXBsZXhvcHRpb24uaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2R1cGxleG9wdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MDM0Y2UKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9kdXBsZXhvcHRpb24uaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRFVQTEVYT1BUSU9OX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RVUExFWE9QVElPTl9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0R1cGxleE9wdGlvbiA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9EdXBsZXhPcHRpb24oQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9EdXBsZXhPcHRpb24oKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRFVQTEVYT1BUSU9OX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9keW5hbWljcmVuZGVyLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2R5bmFtaWNyZW5kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MGUxOTIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9keW5hbWljcmVuZGVyLmNwcApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9keW5hbWljcmVuZGVyLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJkeW5hbWljUmVuZGVyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRHluYW1pY1JlbmRlcjo6Q1hGQV9EeW5hbWljUmVuZGVyKENYRkFfRG9jdW1lbnQqIGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RHluYW1pY1JlbmRlciwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0R5bmFtaWNSZW5kZXI6On5DWEZBX0R5bmFtaWNSZW5kZXIoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZHluYW1pY3JlbmRlci5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZHluYW1pY3JlbmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YzU0ZmEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9keW5hbWljcmVuZGVyLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0RZTkFNSUNSRU5ERVJfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRFlOQU1JQ1JFTkRFUl9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0R5bmFtaWNSZW5kZXIgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfRHluYW1pY1JlbmRlcihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0R5bmFtaWNSZW5kZXIoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRFlOQU1JQ1JFTkRFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZWRnZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lZGdlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWU1OTljCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZWRnZS5jcHAKQEAgLTAsMCArMSw0NSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZWRnZS5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2VkZ2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6OkNvbG9yLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkNhcCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6U3F1YXJlfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpTdHJva2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OlNvbGlkfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6UHJlc2VuY2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OlZpc2libGV9LAorICAgIHtYRkFfQXR0cmlidXRlOjpUaGlja25lc3MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpNZWFzdXJlLCAodm9pZCopTCIwLjVwdCJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJlZGdlIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRWRnZTo6Q1hGQV9FZGdlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9TdHJva2UoZG9jLAorICAgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RWRnZSwKKyAgICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9FZGdlPih0aGlzKSkge30KKworQ1hGQV9FZGdlOjp+Q1hGQV9FZGdlKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2VkZ2UuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2VkZ2UuaAppbmRleCA5NmU3MjVmLi4zNmZlZTU1IDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lZGdlLmgKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZWRnZS5oCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKQEAgLTksMTEgKzksMTIgQEAKIAogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3N0cm9rZS5oIgogCi1jbGFzcyBDWEZBX05vZGU7Ci0KIGNsYXNzIENYRkFfRWRnZSA6IHB1YmxpYyBDWEZBX1N0cm9rZSB7CiAgcHVibGljOgotICBleHBsaWNpdCBDWEZBX0VkZ2UoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX1N0cm9rZShwTm9kZSkge30KKyAgc3RhdGljIGNvbnN0ZXhwciBGWF9BUkdCIGtEZWZhdWx0Q29sb3IgPSAweEZGMDAwMDAwOworCisgIENYRkFfRWRnZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0VkZ2UoKSBvdmVycmlkZTsKIH07CiAKICNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRURHRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZWZmZWN0aXZlaW5wdXRwb2xpY3kuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZWZmZWN0aXZlaW5wdXRwb2xpY3kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYzVkMGYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lZmZlY3RpdmVpbnB1dHBvbGljeS5jcHAKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZWZmZWN0aXZlaW5wdXRwb2xpY3kuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImVmZmVjdGl2ZUlucHV0UG9saWN5IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRWZmZWN0aXZlSW5wdXRQb2xpY3k6OkNYRkFfRWZmZWN0aXZlSW5wdXRQb2xpY3koQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkVmZmVjdGl2ZUlucHV0UG9saWN5LAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfRWZmZWN0aXZlSW5wdXRQb2xpY3k6On5DWEZBX0VmZmVjdGl2ZUlucHV0UG9saWN5KCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2VmZmVjdGl2ZWlucHV0cG9saWN5LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lZmZlY3RpdmVpbnB1dHBvbGljeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYTYwYTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lZmZlY3RpdmVpbnB1dHBvbGljeS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9FRkZFQ1RJVkVJTlBVVFBPTElDWV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9FRkZFQ1RJVkVJTlBVVFBPTElDWV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0VmZmVjdGl2ZUlucHV0UG9saWN5IDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0VmZmVjdGl2ZUlucHV0UG9saWN5KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRWZmZWN0aXZlSW5wdXRQb2xpY3koKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRUZGRUNUSVZFSU5QVVRQT0xJQ1lfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2VmZmVjdGl2ZW91dHB1dHBvbGljeS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lZmZlY3RpdmVvdXRwdXRwb2xpY3kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYWIzNzAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lZmZlY3RpdmVvdXRwdXRwb2xpY3kuY3BwCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2VmZmVjdGl2ZW91dHB1dHBvbGljeS5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiZWZmZWN0aXZlT3V0cHV0UG9saWN5IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRWZmZWN0aXZlT3V0cHV0UG9saWN5OjpDWEZBX0VmZmVjdGl2ZU91dHB1dFBvbGljeShDWEZBX0RvY3VtZW50KiBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpFZmZlY3RpdmVPdXRwdXRQb2xpY3ksCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9FZmZlY3RpdmVPdXRwdXRQb2xpY3k6On5DWEZBX0VmZmVjdGl2ZU91dHB1dFBvbGljeSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lZmZlY3RpdmVvdXRwdXRwb2xpY3kuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2VmZmVjdGl2ZW91dHB1dHBvbGljeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMzE3ZDUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lZmZlY3RpdmVvdXRwdXRwb2xpY3kuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRUZGRUNUSVZFT1VUUFVUUE9MSUNZX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VGRkVDVElWRU9VVFBVVFBPTElDWV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0VmZmVjdGl2ZU91dHB1dFBvbGljeSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9FZmZlY3RpdmVPdXRwdXRQb2xpY3koQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9FZmZlY3RpdmVPdXRwdXRQb2xpY3koKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRUZGRUNUSVZFT1VUUFVUUE9MSUNZX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbWJlZC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbWJlZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZmVhNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2VtYmVkLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbWJlZC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiZW1iZWQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9FbWJlZDo6Q1hGQV9FbWJlZChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RW1iZWQsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9FbWJlZDo6fkNYRkFfRW1iZWQoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW1iZWQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2VtYmVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEzMDg0MAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2VtYmVkLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VNQkVEX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VNQkVEX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfRW1iZWQgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfRW1iZWQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9FbWJlZCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9FTUJFRF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jb2RpbmcuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jb2RpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMzIyMWEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNvZGluZy5jcHAKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jb2RpbmcuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9lbmNvZGluZy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImVuY29kaW5nIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRW5jb2Rpbmc6OkNYRkFfRW5jb2RpbmcoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVDLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpFbmNvZGluZywKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfRW5jb2Rpbmc+KHRoaXMpKSB7fQorCitDWEZBX0VuY29kaW5nOjp+Q1hGQV9FbmNvZGluZygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNvZGluZy5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jb2RpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDQxYjAxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jb2RpbmcuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRU5DT0RJTkdfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRU5DT0RJTkdfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9FbmNvZGluZyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9FbmNvZGluZyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0VuY29kaW5nKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VOQ09ESU5HX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNvZGluZ3MuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jb2RpbmdzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGRmMmQ2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jb2RpbmdzLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNvZGluZ3MuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9lbmNvZGluZ3MuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpUeXBlLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpPcHRpb25hbH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImVuY29kaW5ncyI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0VuY29kaW5nczo6Q1hGQV9FbmNvZGluZ3MoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkVuY29kaW5ncywKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfRW5jb2RpbmdzPih0aGlzKSkge30KKworQ1hGQV9FbmNvZGluZ3M6On5DWEZBX0VuY29kaW5ncygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNvZGluZ3MuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2VuY29kaW5ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODc2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNvZGluZ3MuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRU5DT0RJTkdTX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VOQ09ESU5HU19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0VuY29kaW5ncyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9FbmNvZGluZ3MoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9FbmNvZGluZ3MoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRU5DT0RJTkdTX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2VuY3J5cHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZGY5NDEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0LmNwcApAQCAtMCwwICsxLDQxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0LmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZW5jcnlwdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0geworICAgIHtYRkFfRWxlbWVudDo6Q2VydGlmaWNhdGUsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImVuY3J5cHQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9FbmNyeXB0OjpDWEZBX0VuY3J5cHQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoCisgICAgICAgICAgZG9jLAorICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgWEZBX0VsZW1lbnQ6OkVuY3J5cHQsCisgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0VuY3J5cHQ+KHRoaXMpKSB7fQorCitDWEZBX0VuY3J5cHQ6On5DWEZBX0VuY3J5cHQoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jcnlwdC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jcnlwdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NjhkYjYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VOQ1JZUFRfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRU5DUllQVF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0VuY3J5cHQgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfRW5jcnlwdChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0VuY3J5cHQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRU5DUllQVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jcnlwdGlvbi5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTg3NmZlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jcnlwdGlvbi5jcHAKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jcnlwdGlvbi5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7CisgICAge1hGQV9FbGVtZW50OjpFbmNyeXB0aW9uTGV2ZWwsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6RW5jcnlwdCwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpQZXJtaXNzaW9ucywgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiZW5jcnlwdGlvbiI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0VuY3J5cHRpb246OkNYRkFfRW5jcnlwdGlvbihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpFbmNyeXB0aW9uLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfRW5jcnlwdGlvbjo6fkNYRkFfRW5jcnlwdGlvbigpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0aW9uLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIwMjhlZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2VuY3J5cHRpb24uaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRU5DUllQVElPTl9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9FTkNSWVBUSU9OX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfRW5jcnlwdGlvbiA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9FbmNyeXB0aW9uKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRW5jcnlwdGlvbigpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9FTkNSWVBUSU9OX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0aW9ubGV2ZWwuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jcnlwdGlvbmxldmVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTliMDM1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jcnlwdGlvbmxldmVsLmNwcApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0aW9ubGV2ZWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImVuY3J5cHRpb25MZXZlbCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0VuY3J5cHRpb25MZXZlbDo6Q1hGQV9FbmNyeXB0aW9uTGV2ZWwoQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RW5jcnlwdGlvbkxldmVsLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfRW5jcnlwdGlvbkxldmVsOjp+Q1hGQV9FbmNyeXB0aW9uTGV2ZWwoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jcnlwdGlvbmxldmVsLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0aW9ubGV2ZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmI4MGNlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jcnlwdGlvbmxldmVsLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VOQ1JZUFRJT05MRVZFTF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9FTkNSWVBUSU9OTEVWRUxfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9FbmNyeXB0aW9uTGV2ZWwgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfRW5jcnlwdGlvbkxldmVsKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRW5jcnlwdGlvbkxldmVsKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VOQ1JZUFRJT05MRVZFTF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jcnlwdGlvbm1ldGhvZC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0aW9ubWV0aG9kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzQwMmUyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jcnlwdGlvbm1ldGhvZC5jcHAKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jcnlwdGlvbm1ldGhvZC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiZW5jcnlwdGlvbk1ldGhvZCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0VuY3J5cHRpb25NZXRob2Q6OkNYRkFfRW5jcnlwdGlvbk1ldGhvZChDWEZBX0RvY3VtZW50KiBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVDLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpFbmNyeXB0aW9uTWV0aG9kLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfRW5jcnlwdGlvbk1ldGhvZDo6fkNYRkFfRW5jcnlwdGlvbk1ldGhvZCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0aW9ubWV0aG9kLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0aW9ubWV0aG9kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM4NjAwMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2VuY3J5cHRpb25tZXRob2QuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRU5DUllQVElPTk1FVEhPRF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9FTkNSWVBUSU9OTUVUSE9EX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfRW5jcnlwdGlvbk1ldGhvZCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9FbmNyeXB0aW9uTWV0aG9kKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRW5jcnlwdGlvbk1ldGhvZCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9FTkNSWVBUSU9OTUVUSE9EX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0aW9ubWV0aG9kcy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0aW9ubWV0aG9kcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQxMjAzMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2VuY3J5cHRpb25tZXRob2RzLmNwcApAQCAtMCwwICsxLDM0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0aW9ubWV0aG9kcy5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VHlwZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6T3B0aW9uYWx9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJlbmNyeXB0aW9uTWV0aG9kcyI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0VuY3J5cHRpb25NZXRob2RzOjpDWEZBX0VuY3J5cHRpb25NZXRob2RzKENYRkFfRG9jdW1lbnQqIGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpFbmNyeXB0aW9uTWV0aG9kcywKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0VuY3J5cHRpb25NZXRob2RzOjp+Q1hGQV9FbmNyeXB0aW9uTWV0aG9kcygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0aW9ubWV0aG9kcy5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jcnlwdGlvbm1ldGhvZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmNjMGI1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jcnlwdGlvbm1ldGhvZHMuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRU5DUllQVElPTk1FVEhPRFNfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRU5DUllQVElPTk1FVEhPRFNfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9FbmNyeXB0aW9uTWV0aG9kcyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9FbmNyeXB0aW9uTWV0aG9kcyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0VuY3J5cHRpb25NZXRob2RzKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VOQ1JZUFRJT05NRVRIT0RTX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmZvcmNlLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2VuZm9yY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YjY0MjYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmZvcmNlLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmZvcmNlLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJlbmZvcmNlIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRW5mb3JjZTo6Q1hGQV9FbmZvcmNlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpFbmZvcmNlLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfRW5mb3JjZTo6fkNYRkFfRW5mb3JjZSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmZvcmNlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmZvcmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NjZDhiOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2VuZm9yY2UuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRU5GT1JDRV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9FTkZPUkNFX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfRW5mb3JjZSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9FbmZvcmNlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRW5mb3JjZSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9FTkZPUkNFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lcXVhdGUuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXF1YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTI3ZmJjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXF1YXRlLmNwcApAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lcXVhdGUuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OlRvLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpGb3JjZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkJvb2xlYW4sIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpGcm9tLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJlcXVhdGUiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9FcXVhdGU6OkNYRkFfRXF1YXRlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpFcXVhdGUsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9FcXVhdGU6On5DWEZBX0VxdWF0ZSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lcXVhdGUuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2VxdWF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMjgxODIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lcXVhdGUuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRVFVQVRFX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VRVUFURV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0VxdWF0ZSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9FcXVhdGUoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9FcXVhdGUoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRVFVQVRFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lcXVhdGVyYW5nZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lcXVhdGVyYW5nZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY0NmExZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2VxdWF0ZXJhbmdlLmNwcApAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lcXVhdGVyYW5nZS5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VG8sIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVuaWNvZGVSYW5nZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RnJvbSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiZXF1YXRlUmFuZ2UiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9FcXVhdGVSYW5nZTo6Q1hGQV9FcXVhdGVSYW5nZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlViwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RXF1YXRlUmFuZ2UsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9FcXVhdGVSYW5nZTo6fkNYRkFfRXF1YXRlUmFuZ2UoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXF1YXRlcmFuZ2UuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2VxdWF0ZXJhbmdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjODZiMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2VxdWF0ZXJhbmdlLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VRVUFURVJBTkdFX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VRVUFURVJBTkdFX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfRXF1YXRlUmFuZ2UgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfRXF1YXRlUmFuZ2UoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9FcXVhdGVSYW5nZSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9FUVVBVEVSQU5HRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXJhLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2VyYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA1MTY3NgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2VyYS5jcHAKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXJhLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImVyYSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0VyYTo6Q1hGQV9FcmEoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkVyYSwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfRXJhOjp+Q1hGQV9FcmEoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXJhLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lcmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDZhNTc0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXJhLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VSQV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9FUkFfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9FcmEgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfRXJhKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRXJhKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VSQV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXJhbmFtZXMuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXJhbmFtZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YmQyY2EKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lcmFuYW1lcy5jcHAKQEAgLTAsMCArMSwyOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXJhbmFtZXMuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0ge3tYRkFfRWxlbWVudDo6RXJhLCAyLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiZXJhTmFtZXMiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9FcmFOYW1lczo6Q1hGQV9FcmFOYW1lcyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpFcmFOYW1lcywKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfRXJhTmFtZXM6On5DWEZBX0VyYU5hbWVzKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2VyYW5hbWVzLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lcmFuYW1lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOGY3ODgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9lcmFuYW1lcy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9FUkFOQU1FU19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9FUkFOQU1FU19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0VyYU5hbWVzIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0VyYU5hbWVzKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRXJhTmFtZXMoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRVJBTkFNRVNfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2V2ZW50LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2V2ZW50LmNwcAppbmRleCAzZTU2Mzk2Li5kNGFmMmZmIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ldmVudC5jcHAKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXZlbnQuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKQEAgLTYsNDQgKzYsNzMgQEAKIAogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2V2ZW50LmgiCiAKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ldmVudC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zY3JpcHQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJtaXQuaCIKIAotQ1hGQV9FdmVudDo6Q1hGQV9FdmVudChDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30KK25hbWVzcGFjZSB7CiAKLWludDMyX3QgQ1hGQV9FdmVudDo6R2V0QWN0aXZpdHkoKSB7Ci0gIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfQWN0aXZpdHkpOworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0geworICAgIHtYRkFfRWxlbWVudDo6RXhlY3V0ZSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCisgICAge1hGQV9FbGVtZW50OjpTY3JpcHQsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAorICAgIHtYRkFfRWxlbWVudDo6U2lnbkRhdGEsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAorICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlN1Ym1pdCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCisgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMaXN0ZW4sIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OlJlZk9ubHl9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpBY3Rpdml0eSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6Q2xpY2t9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJldmVudCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0V2ZW50OjpDWEZBX0V2ZW50KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpFdmVudCwKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfRXZlbnQ+KHRoaXMpKSB7fQorCitDWEZBX0V2ZW50Ojp+Q1hGQV9FdmVudCgpIHt9CisKK1hGQV9BdHRyaWJ1dGVFbnVtIENYRkFfRXZlbnQ6OkdldEFjdGl2aXR5KCkgeworICByZXR1cm4gSlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpBY3Rpdml0eSk7CiB9CiAKLVhGQV9FbGVtZW50IENYRkFfRXZlbnQ6OkdldEV2ZW50VHlwZSgpIHsKLSAgQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7CitYRkFfRWxlbWVudCBDWEZBX0V2ZW50OjpHZXRFdmVudFR5cGUoKSBjb25zdCB7CisgIENYRkFfTm9kZSogcENoaWxkID0gR2V0Rmlyc3RDaGlsZCgpOwogICB3aGlsZSAocENoaWxkKSB7CiAgICAgWEZBX0VsZW1lbnQgZVR5cGUgPSBwQ2hpbGQtPkdldEVsZW1lbnRUeXBlKCk7CiAgICAgaWYgKGVUeXBlICE9IFhGQV9FbGVtZW50OjpFeHRyYXMpCiAgICAgICByZXR1cm4gZVR5cGU7CiAKLSAgICBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7CisgICAgcENoaWxkID0gcENoaWxkLT5HZXROZXh0U2libGluZygpOwogICB9CiAgIHJldHVybiBYRkFfRWxlbWVudDo6VW5rbm93bjsKIH0KIAotdm9pZCBDWEZBX0V2ZW50OjpHZXRSZWYoQ0ZYX1dpZGVTdHJpbmdDJiB3c1JlZikgewotICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1JlZiwgd3NSZWYpOworV2lkZVN0cmluZyBDWEZBX0V2ZW50OjpHZXRSZWYoKSB7CisgIHJldHVybiBKU09iamVjdCgpLT5HZXRDRGF0YShYRkFfQXR0cmlidXRlOjpSZWYpOwogfQogCi1DWEZBX1NjcmlwdCBDWEZBX0V2ZW50OjpHZXRTY3JpcHQoKSB7Ci0gIHJldHVybiBDWEZBX1NjcmlwdChtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6U2NyaXB0KSk7CitDWEZBX1NjcmlwdCogQ1hGQV9FdmVudDo6R2V0U2NyaXB0SWZFeGlzdHMoKSB7CisgIHJldHVybiBHZXRDaGlsZDxDWEZBX1NjcmlwdD4oMCwgWEZBX0VsZW1lbnQ6OlNjcmlwdCwgZmFsc2UpOwogfQogCi1DWEZBX1N1Ym1pdCBDWEZBX0V2ZW50OjpHZXRTdWJtaXQoKSB7Ci0gIHJldHVybiBDWEZBX1N1Ym1pdChtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6U3VibWl0KSk7Ci19Ci0KLXZvaWQgQ1hGQV9FdmVudDo6R2V0U2lnbkRhdGFUYXJnZXQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGFyZ2V0KSB7Ci0gIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRWxlbWVudDo6U2lnbkRhdGEpOwotICBpZiAoIXBOb2RlKQotICAgIHJldHVybjsKLQotICBDRlhfV2lkZVN0cmluZ0Mgd3NDRGF0YTsKLSAgcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVGFyZ2V0LCB3c0NEYXRhKTsKLSAgd3NUYXJnZXQgPSB3c0NEYXRhOworQ1hGQV9TdWJtaXQqIENYRkFfRXZlbnQ6OkdldFN1Ym1pdElmRXhpc3RzKCkgeworICByZXR1cm4gR2V0Q2hpbGQ8Q1hGQV9TdWJtaXQ+KDAsIFhGQV9FbGVtZW50OjpTdWJtaXQsIGZhbHNlKTsKIH0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2V2ZW50LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ldmVudC5oCmluZGV4IGIxNTFiMzkuLmE0MTA4MDUgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2V2ZW50LmgKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXZlbnQuaApAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCkBAIC03LDI3ICs3LDIxIEBACiAjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VWRU5UX0hfCiAjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VWRU5UX0hfCiAKLSNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGEuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zY3JpcHQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJtaXQuaCIKK2NsYXNzIENYRkFfU2NyaXB0OworY2xhc3MgQ1hGQV9TdWJtaXQ7CiAKLWNsYXNzIENYRkFfTm9kZTsKLQotY2xhc3MgQ1hGQV9FdmVudCA6IHB1YmxpYyBDWEZBX0RhdGEgeworY2xhc3MgQ1hGQV9FdmVudCA6IHB1YmxpYyBDWEZBX05vZGUgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9FdmVudChDWEZBX05vZGUqIHBOb2RlKTsKKyAgQ1hGQV9FdmVudChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0V2ZW50KCkgb3ZlcnJpZGU7CiAKLSAgaW50MzJfdCBHZXRBY3Rpdml0eSgpOwotICBYRkFfRWxlbWVudCBHZXRFdmVudFR5cGUoKTsKLSAgdm9pZCBHZXRSZWYoQ0ZYX1dpZGVTdHJpbmdDJiB3c1JlZik7Ci0KLSAgQ1hGQV9TY3JpcHQgR2V0U2NyaXB0KCk7Ci0gIENYRkFfU3VibWl0IEdldFN1Ym1pdCgpOwotCi0gIHZvaWQgR2V0U2lnbkRhdGFUYXJnZXQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGFyZ2V0KTsKKyAgWEZBX0F0dHJpYnV0ZUVudW0gR2V0QWN0aXZpdHkoKTsKKyAgWEZBX0VsZW1lbnQgR2V0RXZlbnRUeXBlKCkgY29uc3Q7CisgIENYRkFfU2NyaXB0KiBHZXRTY3JpcHRJZkV4aXN0cygpOworICBDWEZBX1N1Ym1pdCogR2V0U3VibWl0SWZFeGlzdHMoKTsKKyAgV2lkZVN0cmluZyBHZXRSZWYoKTsKIH07CiAKICNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRVZFTlRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2V4Y2xncm91cC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9leGNsZ3JvdXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNGRjMzYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9leGNsZ3JvdXAuY3BwCkBAIC0wLDAgKzEsNjYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2V4Y2xncm91cC5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2V4Y2xncm91cC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0geworICAgIHtYRkFfRWxlbWVudDo6TWFyZ2luLCAxLCAwfSwgICAge1hGQV9FbGVtZW50OjpQYXJhLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkJvcmRlciwgMSwgMH0sICAgIHtYRkFfRWxlbWVudDo6QXNzaXN0LCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlRyYXZlcnNhbCwgMSwgMH0sIHtYRkFfRWxlbWVudDo6VmFsaWRhdGUsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6Q2FwdGlvbiwgMSwgMH0sICAge1hGQV9FbGVtZW50OjpCaW5kLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkRlc2MsIDEsIDB9LCAgICAgIHtYRkFfRWxlbWVudDo6Q2FsY3VsYXRlLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkgsIFhGQV9BdHRyaWJ1dGVUeXBlOjpNZWFzdXJlLCAodm9pZCopTCIwaW4ifSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VywgWEZBX0F0dHJpYnV0ZVR5cGU6Ok1lYXN1cmUsICh2b2lkKilMIjBpbiJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpYLCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlksIFhGQV9BdHRyaWJ1dGVUeXBlOjpNZWFzdXJlLCAodm9pZCopTCIwaW4ifSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkhBbGlnbiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6TGVmdH0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6QWNjZXNzLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpPcGVufSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6UHJlc2VuY2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OlZpc2libGV9LAorICAgIHtYRkFfQXR0cmlidXRlOjpWQWxpZ24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OlRvcH0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok1heEgsIFhGQV9BdHRyaWJ1dGVUeXBlOjpNZWFzdXJlLCAodm9pZCopTCIwaW4ifSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TWF4VywgWEZBX0F0dHJpYnV0ZVR5cGU6Ok1lYXN1cmUsICh2b2lkKilMIjBpbiJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpNaW5ILCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok1pblcsIFhGQV9BdHRyaWJ1dGVUeXBlOjpNZWFzdXJlLCAodm9pZCopTCIwaW4ifSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TGF5b3V0LCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpQb3NpdGlvbn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlJlbGV2YW50LCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpDb2xTcGFuLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTF9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpBbmNob3JUeXBlLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpUb3BMZWZ0fSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6QWNjZXNzS2V5LCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJleGNsR3JvdXAiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9FeGNsR3JvdXA6OkNYRkFfRXhjbEdyb3VwKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250YWluZXJOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpFeGNsR3JvdXAsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0V4Y2xHcm91cD4odGhpcykpIHt9CisKK0NYRkFfRXhjbEdyb3VwOjp+Q1hGQV9FeGNsR3JvdXAoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhjbGdyb3VwLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9leGNsZ3JvdXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTNjOGEzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhjbGdyb3VwLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VYQ0xHUk9VUF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9FWENMR1JPVVBfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9FeGNsR3JvdXAgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfRXhjbEdyb3VwKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRXhjbEdyb3VwKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VYQ0xHUk9VUF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhjbHVkZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9leGNsdWRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDdkOTJhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhjbHVkZS5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhjbHVkZS5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiZXhjbHVkZSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0V4Y2x1ZGU6OkNYRkFfRXhjbHVkZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RXhjbHVkZSwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0V4Y2x1ZGU6On5DWEZBX0V4Y2x1ZGUoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhjbHVkZS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhjbHVkZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNzg3MDcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9leGNsdWRlLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VYQ0xVREVfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRVhDTFVERV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0V4Y2x1ZGUgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfRXhjbHVkZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0V4Y2x1ZGUoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRVhDTFVERV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhjbHVkZW5zLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2V4Y2x1ZGVucy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE0OWU4NgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2V4Y2x1ZGVucy5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhjbHVkZW5zLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJleGNsdWRlTlMiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9FeGNsdWRlTlM6OkNYRkFfRXhjbHVkZU5TKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpFeGNsdWRlTlMsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9FeGNsdWRlTlM6On5DWEZBX0V4Y2x1ZGVOUygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9leGNsdWRlbnMuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2V4Y2x1ZGVucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1Y2I1NDgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9leGNsdWRlbnMuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRVhDTFVERU5TX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VYQ0xVREVOU19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0V4Y2x1ZGVOUyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9FeGNsdWRlTlMoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9FeGNsdWRlTlMoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRVhDTFVERU5TX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9leGRhdGEuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhkYXRhLmNwcAppbmRleCBiZjFlOTMwLi5jZjU3Nzk2IDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9leGRhdGEuY3BwCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2V4ZGF0YS5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIApAQCAtNiwxMCArNiw0MSBAQAogCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhkYXRhLmgiCiAKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9leGRhdGEuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKLUNYRkFfRXhEYXRhOjpDWEZBX0V4RGF0YShDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30KK25hbWVzcGFjZSB7CiAKLWJvb2wgQ1hGQV9FeERhdGE6OlNldENvbnRlbnRUeXBlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnRUeXBlKSB7Ci0gIHJldHVybiBtX3BOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlKTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6UmlkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkNvbnRlbnRUeXBlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpUcmFuc2ZlckVuY29kaW5nLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpOb25lfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TWF4TGVuZ3RoLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKS0xfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiZXhEYXRhIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRXhEYXRhOjpDWEZBX0V4RGF0YShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkV4RGF0YSwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfRXhEYXRhPih0aGlzKSkge30KKworQ1hGQV9FeERhdGE6On5DWEZBX0V4RGF0YSgpIHt9CisKK3ZvaWQgQ1hGQV9FeERhdGE6OlNldENvbnRlbnRUeXBlKGNvbnN0IFdpZGVTdHJpbmcmIHdzQ29udGVudFR5cGUpIHsKKyAgSlNPYmplY3QoKS0+U2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6Q29udGVudFR5cGUsIHdzQ29udGVudFR5cGUsIGZhbHNlLCBmYWxzZSk7CiB9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9leGRhdGEuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2V4ZGF0YS5oCmluZGV4IGM5MmJhY2QuLjhlYjNjYWYgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2V4ZGF0YS5oCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2V4ZGF0YS5oCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKQEAgLTcsMTYgKzcsMTQgQEAKICNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRVhEQVRBX0hfCiAjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VYREFUQV9IXwogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgogCi1jbGFzcyBDWEZBX05vZGU7Ci0KLWNsYXNzIENYRkFfRXhEYXRhIDogcHVibGljIENYRkFfRGF0YSB7CitjbGFzcyBDWEZBX0V4RGF0YSA6IHB1YmxpYyBDWEZBX05vZGUgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9FeERhdGEoQ1hGQV9Ob2RlKiBwTm9kZSk7CisgIENYRkFfRXhEYXRhKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRXhEYXRhKCkgb3ZlcnJpZGU7CiAKLSAgYm9vbCBTZXRDb250ZW50VHlwZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50VHlwZSk7CisgIHZvaWQgU2V0Q29udGVudFR5cGUoY29uc3QgV2lkZVN0cmluZyYgd3NDb250ZW50VHlwZSk7CiB9OwogCiAjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VYREFUQV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhlY3V0ZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9leGVjdXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTk2ZThmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhlY3V0ZS5jcHAKQEAgLTAsMCArMSw0MCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhlY3V0ZS5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2V4ZWN1dGUuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpDb25uZWN0aW9uLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpSdW5BdCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6Q2xpZW50fSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RXhlY3V0ZVR5cGUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OkltcG9ydH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImV4ZWN1dGUiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9FeGVjdXRlOjpDWEZBX0V4ZWN1dGUoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkV4ZWN1dGUsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0V4ZWN1dGU+KHRoaXMpKSB7fQorCitDWEZBX0V4ZWN1dGU6On5DWEZBX0V4ZWN1dGUoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhlY3V0ZS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhlY3V0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkOWYxNTgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9leGVjdXRlLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0VYRUNVVEVfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRVhFQ1VURV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0V4ZWN1dGUgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfRXhlY3V0ZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0V4ZWN1dGUoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRVhFQ1VURV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhvYmplY3QuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhvYmplY3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZjFkMmUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9leG9iamVjdC5jcHAKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhvYmplY3QuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9leG9iamVjdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0ge3tYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpDb2RlVHlwZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6QXJjaGl2ZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6Q29kZUJhc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkNsYXNzSWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImV4T2JqZWN0IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRXhPYmplY3Q6OkNYRkFfRXhPYmplY3QoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkV4T2JqZWN0LAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9FeE9iamVjdD4odGhpcykpIHt9CisKK0NYRkFfRXhPYmplY3Q6On5DWEZBX0V4T2JqZWN0KCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2V4b2JqZWN0LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9leG9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZDdkZTkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9leG9iamVjdC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9FWE9CSkVDVF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9FWE9CSkVDVF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0V4T2JqZWN0IDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0V4T2JqZWN0KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRXhPYmplY3QoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRVhPQkpFQ1RfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2V4dHJhcy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9leHRyYXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDllNmYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9leHRyYXMuY3BwCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2V4dHJhcy5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2V4dHJhcy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImV4dHJhcyI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0V4dHJhczo6Q1hGQV9FeHRyYXMoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwKKyAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RXh0cmFzLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9FeHRyYXM+KHRoaXMpKSB7fQorCitDWEZBX0V4dHJhczo6fkNYRkFfRXh0cmFzKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2V4dHJhcy5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXh0cmFzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzYzZiNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2V4dHJhcy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9FWFRSQVNfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRVhUUkFTX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfRXh0cmFzIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0V4dHJhcyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0V4dHJhcygpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9FWFRSQVNfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2ZpZWxkLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2ZpZWxkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmI4ZDU5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmllbGQuY3BwCkBAIC0wLDAgKzEsNjkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2ZpZWxkLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZmllbGQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHsKKyAgICB7WEZBX0VsZW1lbnQ6OlVpLCAxLCAwfSwgICAgICAgIHtYRkFfRWxlbWVudDo6TWFyZ2luLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlBhcmEsIDEsIDB9LCAgICAgIHtYRkFfRWxlbWVudDo6Rm9ybWF0LCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkJvcmRlciwgMSwgMH0sICAgIHtYRkFfRWxlbWVudDo6QXNzaXN0LCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlRyYXZlcnNhbCwgMSwgMH0sIHtYRkFfRWxlbWVudDo6S2VlcCwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpWYWxpZGF0ZSwgMSwgMH0sICB7WEZBX0VsZW1lbnQ6OkNhcHRpb24sIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6QmluZCwgMSwgMH0sICAgICAge1hGQV9FbGVtZW50OjpEZXNjLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkZvbnQsIDEsIDB9LCAgICAgIHtYRkFfRWxlbWVudDo6VmFsdWUsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6Q2FsY3VsYXRlLCAxLCAwfSwge1hGQV9FbGVtZW50OjpFeHRyYXMsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6SXRlbXMsIDIsIDB9LCAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SCwgWEZBX0F0dHJpYnV0ZVR5cGU6Ok1lYXN1cmUsICh2b2lkKilMIjBpbiJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpXLCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlgsIFhGQV9BdHRyaWJ1dGVUeXBlOjpNZWFzdXJlLCAodm9pZCopTCIwaW4ifSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6WSwgWEZBX0F0dHJpYnV0ZVR5cGU6Ok1lYXN1cmUsICh2b2lkKilMIjBpbiJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SEFsaWduLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpMZWZ0fSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpBY2Nlc3MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06Ok9wZW59LAorICAgIHtYRkFfQXR0cmlidXRlOjpSb3RhdGUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlByZXNlbmNlLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpWaXNpYmxlfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VkFsaWduLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpUb3B9LAorICAgIHtYRkFfQXR0cmlidXRlOjpNYXhILCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok1heFcsIFhGQV9BdHRyaWJ1dGVUeXBlOjpNZWFzdXJlLCAodm9pZCopTCIwaW4ifSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TWluSCwgWEZBX0F0dHJpYnV0ZVR5cGU6Ok1lYXN1cmUsICh2b2lkKilMIjBpbiJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpNaW5XLCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlJlbGV2YW50LCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpDb2xTcGFuLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTF9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NhbGUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkFuY2hvclR5cGUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OlRvcExlZnR9LAorICAgIHtYRkFfQXR0cmlidXRlOjpBY2Nlc3NLZXksIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImZpZWxkIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRmllbGQ6OkNYRkFfRmllbGQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkZpZWxkLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9GaWVsZD4odGhpcykpIHt9CisKK0NYRkFfRmllbGQ6On5DWEZBX0ZpZWxkKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2ZpZWxkLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9maWVsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZjdhMDUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9maWVsZC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9GSUVMRF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9GSUVMRF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0ZpZWxkIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0ZpZWxkKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRmllbGQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRklFTERfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2ZpbGwuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmlsbC5jcHAKaW5kZXggNjM5NDljMS4uNGNiZDhmOCAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmlsbC5jcHAKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmlsbC5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIApAQCAtNiw5OCArNiwxNTEgQEAKIAogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2ZpbGwuaCIKIAotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfb2JqZWN0LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2ZpbGwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29sb3IuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9saW5lYXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGF0dGVybi5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3JhZGlhbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3N0aXBwbGUuaCIKIAotQ1hGQV9GaWxsOjpDWEZBX0ZpbGwoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9CituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7CisgICAge1hGQV9FbGVtZW50OjpQYXR0ZXJuLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlNvbGlkLCAxLAorICAgICBYRkFfUFJPUEVSVFlGTEFHX09uZU9mIHwgWEZBX1BST1BFUlRZRkxBR19EZWZhdWx0T25lT2Z9LAorICAgIHtYRkFfRWxlbWVudDo6U3RpcHBsZSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCisgICAge1hGQV9FbGVtZW50OjpDb2xvciwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpMaW5lYXIsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAorICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlJhZGlhbCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCisgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6UHJlc2VuY2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OlZpc2libGV9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJmaWxsIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRmlsbDo6Q1hGQV9GaWxsKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpGaWxsLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9GaWxsPih0aGlzKSkge30KIAogQ1hGQV9GaWxsOjp+Q1hGQV9GaWxsKCkge30KIAotaW50MzJfdCBDWEZBX0ZpbGw6OkdldFByZXNlbmNlKCkgewotICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlKTsKK2Jvb2wgQ1hGQV9GaWxsOjpJc1Zpc2libGUoKSB7CisgIHJldHVybiBKU09iamVjdCgpCisgICAgICAgICAgICAgLT5UcnlFbnVtKFhGQV9BdHRyaWJ1dGU6OlByZXNlbmNlLCB0cnVlKQorICAgICAgICAgICAgIC52YWx1ZV9vcihYRkFfQXR0cmlidXRlRW51bTo6VmlzaWJsZSkgPT0KKyAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpWaXNpYmxlOwogfQogCiB2b2lkIENYRkFfRmlsbDo6U2V0Q29sb3IoRlhfQVJHQiBjb2xvcikgewotICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VsZW1lbnQ6OkNvbG9yKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NDb2xvcjsKLSAgaW50IGEsIHIsIGcsIGI7Ci0gIEFyZ2JEZWNvZGUoY29sb3IsIGEsIHIsIGcsIGIpOwotICB3c0NvbG9yLkZvcm1hdChMIiVkLCVkLCVkIiwgciwgZywgYik7Ci0gIHBOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbG9yKTsKKyAgQ1hGQV9Db2xvciogcENvbG9yID0KKyAgICAgIEpTT2JqZWN0KCktPkdldE9yQ3JlYXRlUHJvcGVydHk8Q1hGQV9Db2xvcj4oMCwgWEZBX0VsZW1lbnQ6OkNvbG9yKTsKKyAgaWYgKCFwQ29sb3IpCisgICAgcmV0dXJuOworCisgIHBDb2xvci0+U2V0VmFsdWUoY29sb3IpOwogfQogCiBGWF9BUkdCIENYRkFfRmlsbDo6R2V0Q29sb3IoYm9vbCBiVGV4dCkgewotICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpDb2xvcikpIHsKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd3NDb2xvcjsKLSAgICBpZiAocE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IsIGZhbHNlKSkKLSAgICAgIHJldHVybiBDWEZBX0RhdGE6OlRvQ29sb3Iod3NDb2xvcik7Ci0gIH0KLSAgaWYgKGJUZXh0KQotICAgIHJldHVybiAweEZGMDAwMDAwOwotICByZXR1cm4gMHhGRkZGRkZGRjsKKyAgQ1hGQV9Db2xvciogcENvbG9yID0gR2V0Q2hpbGQ8Q1hGQV9Db2xvcj4oMCwgWEZBX0VsZW1lbnQ6OkNvbG9yLCBmYWxzZSk7CisgIGlmICghcENvbG9yKQorICAgIHJldHVybiBiVGV4dCA/IDB4RkYwMDAwMDAgOiAweEZGRkZGRkZGOworICByZXR1cm4gcENvbG9yLT5HZXRWYWx1ZU9yRGVmYXVsdChiVGV4dCA/IDB4RkYwMDAwMDAgOiAweEZGRkZGRkZGKTsKIH0KIAotWEZBX0VsZW1lbnQgQ1hGQV9GaWxsOjpHZXRGaWxsVHlwZSgpIHsKLSAgQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7CitYRkFfRWxlbWVudCBDWEZBX0ZpbGw6OkdldFR5cGUoKSBjb25zdCB7CisgIENYRkFfTm9kZSogcENoaWxkID0gR2V0Rmlyc3RDaGlsZCgpOwogICB3aGlsZSAocENoaWxkKSB7CiAgICAgWEZBX0VsZW1lbnQgZVR5cGUgPSBwQ2hpbGQtPkdldEVsZW1lbnRUeXBlKCk7CiAgICAgaWYgKGVUeXBlICE9IFhGQV9FbGVtZW50OjpDb2xvciAmJiBlVHlwZSAhPSBYRkFfRWxlbWVudDo6RXh0cmFzKQogICAgICAgcmV0dXJuIGVUeXBlOwogCi0gICAgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOworICAgIHBDaGlsZCA9IHBDaGlsZC0+R2V0TmV4dFNpYmxpbmcoKTsKICAgfQogICByZXR1cm4gWEZBX0VsZW1lbnQ6OlNvbGlkOwogfQogCi1pbnQzMl90IENYRkFfRmlsbDo6R2V0UGF0dGVybihGWF9BUkdCJiBmb3JlQ29sb3IpIHsKLSAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FbGVtZW50OjpQYXR0ZXJuKTsKLSAgaWYgKENYRkFfTm9kZSogcENvbG9yID0gcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpDb2xvcikpIHsKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd3NDb2xvcjsKLSAgICBwQ29sb3ItPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IsIGZhbHNlKTsKLSAgICBmb3JlQ29sb3IgPSBDWEZBX0RhdGE6OlRvQ29sb3Iod3NDb2xvcik7Ci0gIH0gZWxzZSB7Ci0gICAgZm9yZUNvbG9yID0gMHhGRjAwMDAwMDsKK3ZvaWQgQ1hGQV9GaWxsOjpEcmF3KENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICAgIENYRkFfR0VQYXRoKiBmaWxsUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKKyAgcEdTLT5TYXZlR3JhcGhTdGF0ZSgpOworCisgIHN3aXRjaCAoR2V0VHlwZSgpKSB7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UmFkaWFsOgorICAgICAgRHJhd1JhZGlhbChwR1MsIGZpbGxQYXRoLCBydFdpZGdldCwgbWF0cml4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBhdHRlcm46CisgICAgICBEcmF3UGF0dGVybihwR1MsIGZpbGxQYXRoLCBydFdpZGdldCwgbWF0cml4KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkxpbmVhcjoKKyAgICAgIERyYXdMaW5lYXIocEdTLCBmaWxsUGF0aCwgcnRXaWRnZXQsIG1hdHJpeCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTdGlwcGxlOgorICAgICAgRHJhd1N0aXBwbGUocEdTLCBmaWxsUGF0aCwgcnRXaWRnZXQsIG1hdHJpeCk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcEdTLT5TZXRGaWxsQ29sb3IoQ1hGQV9HRUNvbG9yKEdldENvbG9yKGZhbHNlKSkpOworICAgICAgcEdTLT5GaWxsUGF0aChmaWxsUGF0aCwgRlhGSUxMX1dJTkRJTkcsICZtYXRyaXgpOworICAgICAgYnJlYWs7CiAgIH0KLSAgcmV0dXJuIHBOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfVHlwZSk7CisKKyAgcEdTLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOwogfQogCi1pbnQzMl90IENYRkFfRmlsbDo6R2V0U3RpcHBsZShGWF9BUkdCJiBzdGlwcGxlQ29sb3IpIHsKLSAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FbGVtZW50OjpTdGlwcGxlKTsKLSAgaW50MzJfdCBlQXR0ciA9IDUwOwotICBwTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX1JhdGUsIGVBdHRyKTsKLSAgaWYgKENYRkFfTm9kZSogcENvbG9yID0gcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpDb2xvcikpIHsKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd3NDb2xvcjsKLSAgICBwQ29sb3ItPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IsIGZhbHNlKTsKLSAgICBzdGlwcGxlQ29sb3IgPSBDWEZBX0RhdGE6OlRvQ29sb3Iod3NDb2xvcik7Ci0gIH0gZWxzZSB7Ci0gICAgc3RpcHBsZUNvbG9yID0gMHhGRjAwMDAwMDsKLSAgfQotICByZXR1cm4gZUF0dHI7Cit2b2lkIENYRkFfRmlsbDo6RHJhd1N0aXBwbGUoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfR0VQYXRoKiBmaWxsUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0V2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBDWEZBX1N0aXBwbGUqIHN0aXBwbGUgPQorICAgICAgSlNPYmplY3QoKS0+R2V0T3JDcmVhdGVQcm9wZXJ0eTxDWEZBX1N0aXBwbGU+KDAsIFhGQV9FbGVtZW50OjpTdGlwcGxlKTsKKyAgaWYgKHN0aXBwbGUpCisgICAgc3RpcHBsZS0+RHJhdyhwR1MsIGZpbGxQYXRoLCBydFdpZGdldCwgbWF0cml4KTsKIH0KIAotaW50MzJfdCBDWEZBX0ZpbGw6OkdldExpbmVhcihGWF9BUkdCJiBlbmRDb2xvcikgewotICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VsZW1lbnQ6OkxpbmVhcik7Ci0gIFhGQV9BVFRSSUJVVEVFTlVNIGVBdHRyID0gWEZBX0FUVFJJQlVURUVOVU1fVG9SaWdodDsKLSAgcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9UeXBlLCBlQXR0cik7Ci0gIGlmIChDWEZBX05vZGUqIHBDb2xvciA9IHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6Q29sb3IpKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdzQ29sb3I7Ci0gICAgcENvbG9yLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbG9yLCBmYWxzZSk7Ci0gICAgZW5kQ29sb3IgPSBDWEZBX0RhdGE6OlRvQ29sb3Iod3NDb2xvcik7Ci0gIH0gZWxzZSB7Ci0gICAgZW5kQ29sb3IgPSAweEZGMDAwMDAwOwotICB9Ci0gIHJldHVybiBlQXR0cjsKK3ZvaWQgQ1hGQV9GaWxsOjpEcmF3UmFkaWFsKENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfR0VQYXRoKiBmaWxsUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKKyAgQ1hGQV9SYWRpYWwqIHJhZGlhbCA9CisgICAgICBKU09iamVjdCgpLT5HZXRPckNyZWF0ZVByb3BlcnR5PENYRkFfUmFkaWFsPigwLCBYRkFfRWxlbWVudDo6UmFkaWFsKTsKKyAgaWYgKHJhZGlhbCkKKyAgICByYWRpYWwtPkRyYXcocEdTLCBmaWxsUGF0aCwgR2V0Q29sb3IoZmFsc2UpLCBydFdpZGdldCwgbWF0cml4KTsKIH0KIAotaW50MzJfdCBDWEZBX0ZpbGw6OkdldFJhZGlhbChGWF9BUkdCJiBlbmRDb2xvcikgewotICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VsZW1lbnQ6OlJhZGlhbCk7Ci0gIFhGQV9BVFRSSUJVVEVFTlVNIGVBdHRyID0gWEZBX0FUVFJJQlVURUVOVU1fVG9FZGdlOwotICBwTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX1R5cGUsIGVBdHRyKTsKLSAgaWYgKENYRkFfTm9kZSogcENvbG9yID0gcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpDb2xvcikpIHsKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd3NDb2xvcjsKLSAgICBwQ29sb3ItPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IsIGZhbHNlKTsKLSAgICBlbmRDb2xvciA9IENYRkFfRGF0YTo6VG9Db2xvcih3c0NvbG9yKTsKLSAgfSBlbHNlIHsKLSAgICBlbmRDb2xvciA9IDB4RkYwMDAwMDA7Ci0gIH0KLSAgcmV0dXJuIGVBdHRyOwordm9pZCBDWEZBX0ZpbGw6OkRyYXdMaW5lYXIoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9HRVBhdGgqIGZpbGxQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBDWEZBX0xpbmVhciogbGluZWFyID0KKyAgICAgIEpTT2JqZWN0KCktPkdldE9yQ3JlYXRlUHJvcGVydHk8Q1hGQV9MaW5lYXI+KDAsIFhGQV9FbGVtZW50OjpMaW5lYXIpOworICBpZiAobGluZWFyKQorICAgIGxpbmVhci0+RHJhdyhwR1MsIGZpbGxQYXRoLCBHZXRDb2xvcihmYWxzZSksIHJ0V2lkZ2V0LCBtYXRyaXgpOworfQorCit2b2lkIENYRkFfRmlsbDo6RHJhd1BhdHRlcm4oQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfR0VQYXRoKiBmaWxsUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0V2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBDWEZBX1BhdHRlcm4qIHBhdHRlcm4gPQorICAgICAgSlNPYmplY3QoKS0+R2V0T3JDcmVhdGVQcm9wZXJ0eTxDWEZBX1BhdHRlcm4+KDAsIFhGQV9FbGVtZW50OjpQYXR0ZXJuKTsKKyAgaWYgKHBhdHRlcm4pCisgICAgcGF0dGVybi0+RHJhdyhwR1MsIGZpbGxQYXRoLCBHZXRDb2xvcihmYWxzZSksIHJ0V2lkZ2V0LCBtYXRyaXgpOwogfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmlsbC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmlsbC5oCmluZGV4IDRiMTM1NjUuLjFmZmRjZGYgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2ZpbGwuaAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9maWxsLmgKQEAgLTEsNCArMSw0IEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIApAQCAtNywyNSArNyw1MSBAQAogI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9GSUxMX0hfCiAjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0ZJTExfSF8KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgogI2luY2x1ZGUgImNvcmUvZnhnZS9meF9kaWIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2VwYXRoLmgiCiAKLWNsYXNzIENYRkFfTm9kZTsKK2NsYXNzIENYRkFfR3JhcGhpY3M7CitjbGFzcyBDWEZBX0xpbmVhcjsKK2NsYXNzIENYRkFfUGF0dGVybjsKK2NsYXNzIENYRkFfUmFkaWFsOworY2xhc3MgQ1hGQV9TdGlwcGxlOwogCi1jbGFzcyBDWEZBX0ZpbGwgOiBwdWJsaWMgQ1hGQV9EYXRhIHsKK2NsYXNzIENYRkFfRmlsbCA6IHB1YmxpYyBDWEZBX05vZGUgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9GaWxsKENYRkFfTm9kZSogcE5vZGUpOwotICB+Q1hGQV9GaWxsKCk7CisgIENYRkFfRmlsbChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0ZpbGwoKSBvdmVycmlkZTsKIAotICBpbnQzMl90IEdldFByZXNlbmNlKCk7Ci0gIEZYX0FSR0IgR2V0Q29sb3IoYm9vbCBiVGV4dCA9IGZhbHNlKTsKLSAgWEZBX0VsZW1lbnQgR2V0RmlsbFR5cGUoKTsKLSAgaW50MzJfdCBHZXRQYXR0ZXJuKEZYX0FSR0ImIGZvcmVDb2xvcik7Ci0gIGludDMyX3QgR2V0U3RpcHBsZShGWF9BUkdCJiBzdGlwcGxlQ29sb3IpOwotICBpbnQzMl90IEdldExpbmVhcihGWF9BUkdCJiBlbmRDb2xvcik7Ci0gIGludDMyX3QgR2V0UmFkaWFsKEZYX0FSR0ImIGVuZENvbG9yKTsKKyAgYm9vbCBJc1Zpc2libGUoKTsKKworICBGWF9BUkdCIEdldENvbG9yKGJvb2wgYlRleHQpOwogICB2b2lkIFNldENvbG9yKEZYX0FSR0IgY29sb3IpOworCisgIHZvaWQgRHJhdyhDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICBDWEZBX0dFUGF0aCogZmlsbFBhdGgsCisgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0V2lkZ2V0LAorICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KTsKKworIHByaXZhdGU6CisgIFhGQV9FbGVtZW50IEdldFR5cGUoKSBjb25zdDsKKworICB2b2lkIERyYXdTdGlwcGxlKENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICBDWEZBX0dFUGF0aCogZmlsbFBhdGgsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpOworICB2b2lkIERyYXdSYWRpYWwoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgQ1hGQV9HRVBhdGgqIGZpbGxQYXRoLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydFdpZGdldCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCk7CisgIHZvaWQgRHJhd0xpbmVhcihDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICAgICAgICBDWEZBX0dFUGF0aCogZmlsbFBhdGgsCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0V2lkZ2V0LAorICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KTsKKyAgdm9pZCBEcmF3UGF0dGVybihDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICAgICAgICAgQ1hGQV9HRVBhdGgqIGZpbGxQYXRoLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KTsKIH07CiAKICNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRklMTF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmlsdGVyLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2ZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM2NTIyZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2ZpbHRlci5jcHAKQEAgLTAsMCArMSw0NCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmlsdGVyLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZmlsdGVyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7CisgICAge1hGQV9FbGVtZW50OjpNZHAsIDEsIDB9LCAgICAgICAgICAge1hGQV9FbGVtZW50OjpDZXJ0aWZpY2F0ZXMsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6VGltZVN0YW1wLCAxLCAwfSwgICAgIHtYRkFfRWxlbWVudDo6SGFuZGxlciwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpEaWdlc3RNZXRob2RzLCAxLCAwfSwge1hGQV9FbGVtZW50OjpFbmNvZGluZ3MsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6UmVhc29ucywgMSwgMH0sICAgICAgIHtYRkFfRWxlbWVudDo6QXBwZWFyYW5jZUZpbHRlciwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpMb2NrRG9jdW1lbnQsIDEsIDB9LCAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VmVyc2lvbiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6QWRkUmV2b2NhdGlvbkluZm8sIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImZpbHRlciI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0ZpbHRlcjo6Q1hGQV9GaWx0ZXIoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkZpbHRlciwKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfRmlsdGVyPih0aGlzKSkge30KKworQ1hGQV9GaWx0ZXI6On5DWEZBX0ZpbHRlcigpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9maWx0ZXIuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2ZpbHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYzA2OWEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9maWx0ZXIuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRklMVEVSX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0ZJTFRFUl9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0ZpbHRlciA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9GaWx0ZXIoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9GaWx0ZXIoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRklMVEVSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9mbGlwbGFiZWwuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmxpcGxhYmVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjI3ZThiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmxpcGxhYmVsLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9mbGlwbGFiZWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImZsaXBMYWJlbCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0ZsaXBMYWJlbDo6Q1hGQV9GbGlwTGFiZWwoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVYsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkZsaXBMYWJlbCwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0ZsaXBMYWJlbDo6fkNYRkFfRmxpcExhYmVsKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2ZsaXBsYWJlbC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmxpcGxhYmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFjMDU2NAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2ZsaXBsYWJlbC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9GTElQTEFCRUxfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRkxJUExBQkVMX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfRmxpcExhYmVsIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0ZsaXBMYWJlbChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0ZsaXBMYWJlbCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9GTElQTEFCRUxfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2Zsb2F0LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Zsb2F0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2U1NzQ5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmxvYXQuY3BwCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2Zsb2F0LmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZmxvYXQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJmbG9hdCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0Zsb2F0OjpDWEZBX0Zsb2F0KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RmxvYXQsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0Zsb2F0Pih0aGlzKSkge30KKworQ1hGQV9GbG9hdDo6fkNYRkFfRmxvYXQoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmxvYXQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Zsb2F0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzYjNkZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Zsb2F0LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0ZMT0FUX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0ZMT0FUX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfRmxvYXQgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfRmxvYXQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9GbG9hdCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9GTE9BVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9udC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9mb250LmNwcAppbmRleCBjZWRmZGE2Li42OTRjYjI2IDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9mb250LmNwcAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9mb250LmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCkBAIC02LDg4ICs2LDEzMyBAQAogCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9udC5oIgogCi0jaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9mb250LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2ZpbGwuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWFzdXJlbWVudC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfb2JqZWN0LmgiCiAKLUNYRkFfRm9udDo6Q1hGQV9Gb250KENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQorbmFtZXNwYWNlIHsKIAotRlhfRkxPQVQgQ1hGQV9Gb250OjpHZXRCYXNlbGluZVNoaWZ0KCkgewotICByZXR1cm4gbV9wTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0Jhc2VsaW5lU2hpZnQpLlRvVW5pdChYRkFfVU5JVF9QdCk7Citjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpGaWxsLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxpbmVUaHJvdWdoLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpUeXBlZmFjZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCAodm9pZCopTCJDb3VyaWVyIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkZvbnRIb3Jpem9udGFsU2NhbGUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwKKyAgICAgKHZvaWQqKUwiMTAwJSJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Oktlcm5pbmdNb2RlLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpOb25lfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5kZXJsaW5lLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpCYXNlbGluZVNoaWZ0LCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok92ZXJsaW5lUGVyaW9kLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpBbGx9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMZXR0ZXJTcGFjaW5nLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMaW5lVGhyb3VnaFBlcmlvZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6QWxsfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6Rm9udFZlcnRpY2FsU2NhbGUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwKKyAgICAgKHZvaWQqKUwiMTAwJSJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpQc05hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlNpemUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpNZWFzdXJlLCAodm9pZCopTCIxMHB0In0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlBvc3R1cmUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06Ok5vcm1hbH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OldlaWdodCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6Tm9ybWFsfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5kZXJsaW5lUGVyaW9kLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpBbGx9LAorICAgIHtYRkFfQXR0cmlidXRlOjpPdmVybGluZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6R2VuZXJpY0ZhbWlseSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6U2VyaWZ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJmb250IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRm9udDo6Q1hGQV9Gb250KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKAorICAgICAgICAgIGRvYywKKyAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgWEZBX0VsZW1lbnQ6OkZvbnQsCisgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0ZvbnQ+KHRoaXMpKSB7fQorCitDWEZBX0ZvbnQ6On5DWEZBX0ZvbnQoKSB7fQorCitmbG9hdCBDWEZBX0ZvbnQ6OkdldEJhc2VsaW5lU2hpZnQoKSBjb25zdCB7CisgIHJldHVybiBKU09iamVjdCgpCisgICAgICAtPkdldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6QmFzZWxpbmVTaGlmdCkKKyAgICAgIC5Ub1VuaXQoWEZBX1VuaXQ6OlB0KTsKIH0KIAotRlhfRkxPQVQgQ1hGQV9Gb250OjpHZXRIb3Jpem9udGFsU2NhbGUoKSB7Ci0gIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7Ci0gIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfRm9udEhvcml6b250YWxTY2FsZSwgd3NWYWx1ZSk7CitmbG9hdCBDWEZBX0ZvbnQ6OkdldEhvcml6b250YWxTY2FsZSgpIHsKKyAgV2lkZVN0cmluZyB3c1ZhbHVlID0gSlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6Rm9udEhvcml6b250YWxTY2FsZSk7CiAgIGludDMyX3QgaVNjYWxlID0gRlhTWVNfd3RvaSh3c1ZhbHVlLmNfc3RyKCkpOwotICByZXR1cm4gaVNjYWxlID4gMCA/IChGWF9GTE9BVClpU2NhbGUgOiAxMDAuMGY7CisgIHJldHVybiBpU2NhbGUgPiAwID8gKGZsb2F0KWlTY2FsZSA6IDEwMC4wZjsKIH0KIAotRlhfRkxPQVQgQ1hGQV9Gb250OjpHZXRWZXJ0aWNhbFNjYWxlKCkgewotICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOwotICBtX3BOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0ZvbnRWZXJ0aWNhbFNjYWxlLCB3c1ZhbHVlKTsKK2Zsb2F0IENYRkFfRm9udDo6R2V0VmVydGljYWxTY2FsZSgpIHsKKyAgV2lkZVN0cmluZyB3c1ZhbHVlID0gSlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6Rm9udFZlcnRpY2FsU2NhbGUpOwogICBpbnQzMl90IGlTY2FsZSA9IEZYU1lTX3d0b2kod3NWYWx1ZS5jX3N0cigpKTsKLSAgcmV0dXJuIGlTY2FsZSA+IDAgPyAoRlhfRkxPQVQpaVNjYWxlIDogMTAwLjBmOworICByZXR1cm4gaVNjYWxlID4gMCA/IChmbG9hdClpU2NhbGUgOiAxMDAuMGY7CiB9CiAKLUZYX0ZMT0FUIENYRkFfRm9udDo6R2V0TGV0dGVyU3BhY2luZygpIHsKLSAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWU7Ci0gIGlmICghbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9MZXR0ZXJTcGFjaW5nLCB3c1ZhbHVlKSkKLSAgICByZXR1cm4gMDsKLQotICBDWEZBX01lYXN1cmVtZW50IG1zKHdzVmFsdWUpOwotICBpZiAobXMuR2V0VW5pdCgpID09IFhGQV9VTklUX0VtKQorZmxvYXQgQ1hGQV9Gb250OjpHZXRMZXR0ZXJTcGFjaW5nKCkgeworICBXaWRlU3RyaW5nIHdzVmFsdWUgPSBKU09iamVjdCgpLT5HZXRDRGF0YShYRkFfQXR0cmlidXRlOjpMZXR0ZXJTcGFjaW5nKTsKKyAgQ1hGQV9NZWFzdXJlbWVudCBtcyh3c1ZhbHVlLkFzU3RyaW5nVmlldygpKTsKKyAgaWYgKG1zLkdldFVuaXQoKSA9PSBYRkFfVW5pdDo6RW0pCiAgICAgcmV0dXJuIG1zLkdldFZhbHVlKCkgKiBHZXRGb250U2l6ZSgpOwotICByZXR1cm4gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsKKyAgcmV0dXJuIG1zLlRvVW5pdChYRkFfVW5pdDo6UHQpOwogfQogCiBpbnQzMl90IENYRkFfRm9udDo6R2V0TGluZVRocm91Z2goKSB7Ci0gIGludDMyX3QgaVZhbHVlID0gMDsKLSAgbV9wTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX0xpbmVUaHJvdWdoLCBpVmFsdWUpOwotICByZXR1cm4gaVZhbHVlOworICByZXR1cm4gSlNPYmplY3QoKS0+R2V0SW50ZWdlcihYRkFfQXR0cmlidXRlOjpMaW5lVGhyb3VnaCk7CiB9CiAKIGludDMyX3QgQ1hGQV9Gb250OjpHZXRVbmRlcmxpbmUoKSB7Ci0gIGludDMyX3QgaVZhbHVlID0gMDsKLSAgbV9wTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX1VuZGVybGluZSwgaVZhbHVlKTsKLSAgcmV0dXJuIGlWYWx1ZTsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPkdldEludGVnZXIoWEZBX0F0dHJpYnV0ZTo6VW5kZXJsaW5lKTsKIH0KIAotaW50MzJfdCBDWEZBX0ZvbnQ6OkdldFVuZGVybGluZVBlcmlvZCgpIHsKLSAgWEZBX0FUVFJJQlVURUVOVU0gZUF0dHIgPSBYRkFfQVRUUklCVVRFRU5VTV9BbGw7Ci0gIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9VbmRlcmxpbmVQZXJpb2QsIGVBdHRyKTsKLSAgcmV0dXJuIGVBdHRyOworWEZBX0F0dHJpYnV0ZUVudW0gQ1hGQV9Gb250OjpHZXRVbmRlcmxpbmVQZXJpb2QoKSB7CisgIHJldHVybiBKU09iamVjdCgpCisgICAgICAtPlRyeUVudW0oWEZBX0F0dHJpYnV0ZTo6VW5kZXJsaW5lUGVyaW9kLCB0cnVlKQorICAgICAgLnZhbHVlX29yKFhGQV9BdHRyaWJ1dGVFbnVtOjpBbGwpOwogfQogCi1GWF9GTE9BVCBDWEZBX0ZvbnQ6OkdldEZvbnRTaXplKCkgewotICBDWEZBX01lYXN1cmVtZW50IG1zOwotICBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU2l6ZSwgbXMpOwotICByZXR1cm4gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsKK2Zsb2F0IENYRkFfRm9udDo6R2V0Rm9udFNpemUoKSBjb25zdCB7CisgIHJldHVybiBKU09iamVjdCgpLT5HZXRNZWFzdXJlKFhGQV9BdHRyaWJ1dGU6OlNpemUpLlRvVW5pdChYRkFfVW5pdDo6UHQpOwogfQogCi12b2lkIENYRkFfRm9udDo6R2V0VHlwZWZhY2UoQ0ZYX1dpZGVTdHJpbmdDJiB3c1R5cGVGYWNlKSB7Ci0gIG1fcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVHlwZWZhY2UsIHdzVHlwZUZhY2UpOworV2lkZVN0cmluZyBDWEZBX0ZvbnQ6OkdldFR5cGVmYWNlKCkgeworICByZXR1cm4gSlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6VHlwZWZhY2UpOwogfQogCiBib29sIENYRkFfRm9udDo6SXNCb2xkKCkgewotICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX05vcm1hbDsKLSAgbV9wTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX1dlaWdodCwgZUF0dHIpOwotICByZXR1cm4gZUF0dHIgPT0gWEZBX0FUVFJJQlVURUVOVU1fQm9sZDsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6V2VpZ2h0KSA9PSBYRkFfQXR0cmlidXRlRW51bTo6Qm9sZDsKIH0KIAogYm9vbCBDWEZBX0ZvbnQ6OklzSXRhbGljKCkgewotICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX05vcm1hbDsKLSAgbV9wTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX1Bvc3R1cmUsIGVBdHRyKTsKLSAgcmV0dXJuIGVBdHRyID09IFhGQV9BVFRSSUJVVEVFTlVNX0l0YWxpYzsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6UG9zdHVyZSkgPT0KKyAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpJdGFsaWM7CiB9CiAKIHZvaWQgQ1hGQV9Gb250OjpTZXRDb2xvcihGWF9BUkdCIGNvbG9yKSB7Ci0gIENYRkFfRmlsbCBmaWxsKG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FbGVtZW50OjpGaWxsKSk7Ci0gIGZpbGwuU2V0Q29sb3IoY29sb3IpOworICBDWEZBX0ZpbGwqIG5vZGUgPQorICAgICAgSlNPYmplY3QoKS0+R2V0T3JDcmVhdGVQcm9wZXJ0eTxDWEZBX0ZpbGw+KDAsIFhGQV9FbGVtZW50OjpGaWxsKTsKKyAgaWYgKCFub2RlKQorICAgIHJldHVybjsKKworICBub2RlLT5TZXRDb2xvcihjb2xvcik7CiB9CiAKIEZYX0FSR0IgQ1hGQV9Gb250OjpHZXRDb2xvcigpIHsKLSAgQ1hGQV9GaWxsIGZpbGwobV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VsZW1lbnQ6OkZpbGwpKTsKLSAgcmV0dXJuIGZpbGwgPyBmaWxsLkdldENvbG9yKHRydWUpIDogMHhGRjAwMDAwMDsKKyAgQ1hGQV9GaWxsKiBmaWxsID0gR2V0Q2hpbGQ8Q1hGQV9GaWxsPigwLCBYRkFfRWxlbWVudDo6RmlsbCwgZmFsc2UpOworICByZXR1cm4gZmlsbCA/IGZpbGwtPkdldENvbG9yKHRydWUpIDogMHhGRjAwMDAwMDsKIH0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2ZvbnQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2ZvbnQuaAppbmRleCAwMzQyZjY4Li4zNDZiZTc2IDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9mb250LmgKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9udC5oCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKQEAgLTgsMjMgKzgsMjIgQEAKICNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRk9OVF9IXwogCiAjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGEuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCiAKLWNsYXNzIENYRkFfTm9kZTsKLQotY2xhc3MgQ1hGQV9Gb250IDogcHVibGljIENYRkFfRGF0YSB7CitjbGFzcyBDWEZBX0ZvbnQgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfRm9udChDWEZBX05vZGUqIHBOb2RlKTsKKyAgQ1hGQV9Gb250KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRm9udCgpIG92ZXJyaWRlOwogCi0gIEZYX0ZMT0FUIEdldEJhc2VsaW5lU2hpZnQoKTsKLSAgRlhfRkxPQVQgR2V0SG9yaXpvbnRhbFNjYWxlKCk7Ci0gIEZYX0ZMT0FUIEdldFZlcnRpY2FsU2NhbGUoKTsKLSAgRlhfRkxPQVQgR2V0TGV0dGVyU3BhY2luZygpOworICBmbG9hdCBHZXRCYXNlbGluZVNoaWZ0KCkgY29uc3Q7CisgIGZsb2F0IEdldEhvcml6b250YWxTY2FsZSgpOworICBmbG9hdCBHZXRWZXJ0aWNhbFNjYWxlKCk7CisgIGZsb2F0IEdldExldHRlclNwYWNpbmcoKTsKICAgaW50MzJfdCBHZXRMaW5lVGhyb3VnaCgpOwogICBpbnQzMl90IEdldFVuZGVybGluZSgpOwotICBpbnQzMl90IEdldFVuZGVybGluZVBlcmlvZCgpOwotICBGWF9GTE9BVCBHZXRGb250U2l6ZSgpOwotICB2b2lkIEdldFR5cGVmYWNlKENGWF9XaWRlU3RyaW5nQyYgd3NUeXBlRmFjZSk7CisgIFhGQV9BdHRyaWJ1dGVFbnVtIEdldFVuZGVybGluZVBlcmlvZCgpOworICBmbG9hdCBHZXRGb250U2l6ZSgpIGNvbnN0OworICBXaWRlU3RyaW5nIEdldFR5cGVmYWNlKCk7CiAKICAgYm9vbCBJc0JvbGQoKTsKICAgYm9vbCBJc0l0YWxpYygpOwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9udGluZm8uY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9udGluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMWRjNmUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9mb250aW5mby5jcHAKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9udGluZm8uaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0geworICAgIHtYRkFfRWxlbWVudDo6U3Vic2V0QmVsb3csIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6TWFwLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkVtYmVkLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJmb250SW5mbyI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0ZvbnRJbmZvOjpDWEZBX0ZvbnRJbmZvKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkZvbnRJbmZvLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfRm9udEluZm86On5DWEZBX0ZvbnRJbmZvKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2ZvbnRpbmZvLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9mb250aW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZmFjZDgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9mb250aW5mby5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9GT05USU5GT19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9GT05USU5GT19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0ZvbnRJbmZvIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0ZvbnRJbmZvKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRm9udEluZm8oKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRk9OVElORk9fSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2Zvcm0uY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9ybS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhjZTcyNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Zvcm0uY3BwCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2Zvcm0uaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9mb3JtLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6Q2hlY2tzdW0sIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgKHZvaWQqKW51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJmb3JtIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRm9ybTo6Q1hGQV9Gb3JtKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Gb3JtLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpNb2RlbE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkZvcm0sCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0Zvcm0+KHRoaXMpKSB7fQorCitDWEZBX0Zvcm06On5DWEZBX0Zvcm0oKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9ybS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZDFkOTAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9mb3JtLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0ZPUk1fSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRk9STV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0Zvcm0gOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfRm9ybShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0Zvcm0oKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRk9STV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9ybWF0LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Zvcm1hdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJhYWViMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Zvcm1hdC5jcHAKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9ybWF0LmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZm9ybWF0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpQaWN0dXJlLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiZm9ybWF0IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfRm9ybWF0OjpDWEZBX0Zvcm1hdChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6Rm9ybWF0LAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9Gb3JtYXQ+KHRoaXMpKSB7fQorCitDWEZBX0Zvcm1hdDo6fkNYRkFfRm9ybWF0KCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2Zvcm1hdC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9ybWF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzMTcxNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Zvcm1hdC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9GT1JNQVRfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRk9STUFUX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfRm9ybWF0IDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0Zvcm1hdChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0Zvcm1hdCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9GT1JNQVRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2Zvcm1maWVsZGZpbGxpbmcuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9ybWZpZWxkZmlsbGluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg3ZTVjYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Zvcm1maWVsZGZpbGxpbmcuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2Zvcm1maWVsZGZpbGxpbmcuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImZvcm1GaWVsZEZpbGxpbmciOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9Gb3JtRmllbGRGaWxsaW5nOjpDWEZBX0Zvcm1GaWVsZEZpbGxpbmcoQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpGb3JtRmllbGRGaWxsaW5nLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfRm9ybUZpZWxkRmlsbGluZzo6fkNYRkFfRm9ybUZpZWxkRmlsbGluZygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9mb3JtZmllbGRmaWxsaW5nLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9mb3JtZmllbGRmaWxsaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmMWI4ZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2Zvcm1maWVsZGZpbGxpbmcuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfRk9STUZJRUxERklMTElOR19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9GT1JNRklFTERGSUxMSU5HX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfRm9ybUZpZWxkRmlsbGluZyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9Gb3JtRmllbGRGaWxsaW5nKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfRm9ybUZpZWxkRmlsbGluZygpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9GT1JNRklFTERGSUxMSU5HX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ncm91cHBhcmVudC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ncm91cHBhcmVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E5MmQzZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2dyb3VwcGFyZW50LmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ncm91cHBhcmVudC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiZ3JvdXBQYXJlbnQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9Hcm91cFBhcmVudDo6Q1hGQV9Hcm91cFBhcmVudChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlViwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6R3JvdXBQYXJlbnQsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9Hcm91cFBhcmVudDo6fkNYRkFfR3JvdXBQYXJlbnQoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZ3JvdXBwYXJlbnQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2dyb3VwcGFyZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RlMjk2YwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2dyb3VwcGFyZW50LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0dST1VQUEFSRU5UX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0dST1VQUEFSRU5UX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfR3JvdXBQYXJlbnQgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfR3JvdXBQYXJlbnQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9Hcm91cFBhcmVudCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9HUk9VUFBBUkVOVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaGFuZGxlci5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9oYW5kbGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGYwZjgxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaGFuZGxlci5jcHAKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaGFuZGxlci5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpUeXBlLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpPcHRpb25hbH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImhhbmRsZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9IYW5kbGVyOjpDWEZBX0hhbmRsZXIoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OlRleHROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpIYW5kbGVyLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9IYW5kbGVyPih0aGlzKSkge30KKworQ1hGQV9IYW5kbGVyOjp+Q1hGQV9IYW5kbGVyKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2hhbmRsZXIuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2hhbmRsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTc1YzBiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaGFuZGxlci5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9IQU5ETEVSX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0hBTkRMRVJfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9IYW5kbGVyIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0hhbmRsZXIoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9IYW5kbGVyKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0hBTkRMRVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2h5cGhlbmF0aW9uLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2h5cGhlbmF0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTgzNWVkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaHlwaGVuYXRpb24uY3BwCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2h5cGhlbmF0aW9uLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpXb3JkQ2hhcmFjdGVyQ291bnQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopN30sCisgICAge1hGQV9BdHRyaWJ1dGU6Okh5cGhlbmF0ZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkJvb2xlYW4sICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RXhjbHVkZUluaXRpYWxDYXAsIFhGQV9BdHRyaWJ1dGVUeXBlOjpCb29sZWFuLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlB1c2hDaGFyYWN0ZXJDb3VudCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikzfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6UmVtYWluQ2hhcmFjdGVyQ291bnQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopM30sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkV4Y2x1ZGVBbGxDYXBzLCBYRkFfQXR0cmlidXRlVHlwZTo6Qm9vbGVhbiwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJoeXBoZW5hdGlvbiI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0h5cGhlbmF0aW9uOjpDWEZBX0h5cGhlbmF0aW9uKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpIeXBoZW5hdGlvbiwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0h5cGhlbmF0aW9uOjp+Q1hGQV9IeXBoZW5hdGlvbigpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9oeXBoZW5hdGlvbi5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaHlwaGVuYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjAxYzVmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaHlwaGVuYXRpb24uaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfSFlQSEVOQVRJT05fSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfSFlQSEVOQVRJT05fSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9IeXBoZW5hdGlvbiA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9IeXBoZW5hdGlvbihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0h5cGhlbmF0aW9uKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0hZUEhFTkFUSU9OX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pZmVtcHR5LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2lmZW1wdHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNjEyZWYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pZmVtcHR5LmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pZmVtcHR5LmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJpZkVtcHR5IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfSWZFbXB0eTo6Q1hGQV9JZkVtcHR5KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpJZkVtcHR5LAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfSWZFbXB0eTo6fkNYRkFfSWZFbXB0eSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pZmVtcHR5LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pZmVtcHR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzYzFiNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2lmZW1wdHkuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfSUZFTVBUWV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9JRkVNUFRZX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfSWZFbXB0eSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9JZkVtcHR5KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfSWZFbXB0eSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9JRkVNUFRZX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbWFnZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbWFnZS5jcHAKaW5kZXggOGNmN2ZjMS4uODhjYTk3NyAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW1hZ2UuY3BwCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2ltYWdlLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCkBAIC02LDQ5ICs2LDcwIEBACiAKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbWFnZS5oIgogCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfaW1hZ2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKLUNYRkFfSW1hZ2U6OkNYRkFfSW1hZ2UoQ1hGQV9Ob2RlKiBwTm9kZSwgYm9vbCBiRGVmVmFsdWUpCi0gICAgOiBDWEZBX0RhdGEocE5vZGUpLCBtX2JEZWZWYWx1ZShiRGVmVmFsdWUpIHt9CituYW1lc3BhY2UgewogCi1pbnQzMl90IENYRkFfSW1hZ2U6OkdldEFzcGVjdCgpIHsKLSAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9Bc3BlY3QpOworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkNvbnRlbnRUeXBlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpUcmFuc2ZlckVuY29kaW5nLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpCYXNlNjR9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpBc3BlY3QsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OkZpdH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImltYWdlIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfSW1hZ2U6OkNYRkFfSW1hZ2UoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpJbWFnZSwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0ltYWdlOjp+Q1hGQV9JbWFnZSgpIHt9CisKK1hGQV9BdHRyaWJ1dGVFbnVtIENYRkFfSW1hZ2U6OkdldEFzcGVjdCgpIHsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6QXNwZWN0KTsKIH0KIAotYm9vbCBDWEZBX0ltYWdlOjpHZXRDb250ZW50VHlwZShDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50VHlwZSkgewotICByZXR1cm4gbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSk7CitXaWRlU3RyaW5nIENYRkFfSW1hZ2U6OkdldENvbnRlbnRUeXBlKCkgeworICByZXR1cm4gSlNPYmplY3QoKS0+VHJ5Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6Q29udGVudFR5cGUsIHRydWUpLnZhbHVlX29yKEwiIik7CiB9CiAKLWJvb2wgQ1hGQV9JbWFnZTo6R2V0SHJlZihDRlhfV2lkZVN0cmluZyYgd3NIcmVmKSB7Ci0gIGlmIChtX2JEZWZWYWx1ZSkKLSAgICByZXR1cm4gbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9IcmVmLCB3c0hyZWYpOwotICByZXR1cm4gbV9wTm9kZS0+R2V0QXR0cmlidXRlKEwiaHJlZiIsIHdzSHJlZik7CitXaWRlU3RyaW5nIENYRkFfSW1hZ2U6OkdldEhyZWYoKSB7CisgIHJldHVybiBKU09iamVjdCgpLT5UcnlDRGF0YShYRkFfQXR0cmlidXRlOjpIcmVmLCB0cnVlKS52YWx1ZV9vcihMIiIpOwogfQogCi1pbnQzMl90IENYRkFfSW1hZ2U6OkdldFRyYW5zZmVyRW5jb2RpbmcoKSB7Ci0gIGlmIChtX2JEZWZWYWx1ZSkKLSAgICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcpOwotICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fQmFzZTY0OworWEZBX0F0dHJpYnV0ZUVudW0gQ1hGQV9JbWFnZTo6R2V0VHJhbnNmZXJFbmNvZGluZygpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFhGQV9BdHRyaWJ1dGVFbnVtPigKKyAgICAgIEpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6VHJhbnNmZXJFbmNvZGluZykpOwogfQogCi1ib29sIENYRkFfSW1hZ2U6OkdldENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgewotICByZXR1cm4gbV9wTm9kZS0+VHJ5Q29udGVudCh3c1RleHQpOworV2lkZVN0cmluZyBDWEZBX0ltYWdlOjpHZXRDb250ZW50KCkgeworICByZXR1cm4gSlNPYmplY3QoKS0+VHJ5Q29udGVudChmYWxzZSwgdHJ1ZSkudmFsdWVfb3IoTCIiKTsKIH0KIAotYm9vbCBDWEZBX0ltYWdlOjpTZXRDb250ZW50VHlwZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50VHlwZSkgewotICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSk7Cit2b2lkIENYRkFfSW1hZ2U6OlNldENvbnRlbnRUeXBlKGNvbnN0IFdpZGVTdHJpbmcmIHdzQ29udGVudFR5cGUpIHsKKyAgSlNPYmplY3QoKS0+U2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6Q29udGVudFR5cGUsIHdzQ29udGVudFR5cGUsIGZhbHNlLCBmYWxzZSk7CiB9CiAKLWJvb2wgQ1hGQV9JbWFnZTo6U2V0SHJlZihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NIcmVmKSB7Ci0gIGlmIChtX2JEZWZWYWx1ZSkKLSAgICByZXR1cm4gbV9wTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9IcmVmLCB3c0hyZWYpOwotICByZXR1cm4gbV9wTm9kZS0+U2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfSHJlZiwgd3NIcmVmLkFzU3RyaW5nQygpKTsKK3ZvaWQgQ1hGQV9JbWFnZTo6U2V0SHJlZihjb25zdCBXaWRlU3RyaW5nJiB3c0hyZWYpIHsKKyAgSlNPYmplY3QoKS0+U2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6SHJlZiwgd3NIcmVmLCBmYWxzZSwgZmFsc2UpOwogfQogCi1ib29sIENYRkFfSW1hZ2U6OlNldFRyYW5zZmVyRW5jb2RpbmcoaW50MzJfdCBpVHJhbnNmZXJFbmNvZGluZykgewotICBpZiAobV9iRGVmVmFsdWUpIHsKLSAgICByZXR1cm4gbV9wTm9kZS0+U2V0RW51bShYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFhGQV9BVFRSSUJVVEVFTlVNKWlUcmFuc2ZlckVuY29kaW5nKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKK3ZvaWQgQ1hGQV9JbWFnZTo6U2V0VHJhbnNmZXJFbmNvZGluZyhYRkFfQXR0cmlidXRlRW51bSBpVHJhbnNmZXJFbmNvZGluZykgeworICBKU09iamVjdCgpLT5TZXRFbnVtKFhGQV9BdHRyaWJ1dGU6OlRyYW5zZmVyRW5jb2RpbmcsIGlUcmFuc2ZlckVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKIH0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2ltYWdlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbWFnZS5oCmluZGV4IGJmNjk4OTcuLjM2NzA4NjMgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2ltYWdlLmgKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW1hZ2UuaApAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCkBAIC03LDI3ICs3LDI0IEBACiAjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0lNQUdFX0hfCiAjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0lNQUdFX0hfCiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKIAotY2xhc3MgQ1hGQV9Ob2RlOwotCi1jbGFzcyBDWEZBX0ltYWdlIDogcHVibGljIENYRkFfRGF0YSB7CitjbGFzcyBDWEZBX0ltYWdlIDogcHVibGljIENYRkFfTm9kZSB7CiAgcHVibGljOgotICBDWEZBX0ltYWdlKENYRkFfTm9kZSogcE5vZGUsIGJvb2wgYkRlZlZhbHVlKTsKKyAgQ1hGQV9JbWFnZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0ltYWdlKCkgb3ZlcnJpZGU7CiAKLSAgaW50MzJfdCBHZXRBc3BlY3QoKTsKLSAgYm9vbCBHZXRDb250ZW50VHlwZShDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50VHlwZSk7Ci0gIGJvb2wgR2V0SHJlZihDRlhfV2lkZVN0cmluZyYgd3NIcmVmKTsKLSAgaW50MzJfdCBHZXRUcmFuc2ZlckVuY29kaW5nKCk7Ci0gIGJvb2wgR2V0Q29udGVudChDRlhfV2lkZVN0cmluZyYgd3NUZXh0KTsKLSAgYm9vbCBTZXRDb250ZW50VHlwZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50VHlwZSk7Ci0gIGJvb2wgU2V0SHJlZihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NIcmVmKTsKLSAgYm9vbCBTZXRUcmFuc2ZlckVuY29kaW5nKGludDMyX3QgaVRyYW5zZmVyRW5jb2RpbmcpOworICBYRkFfQXR0cmlidXRlRW51bSBHZXRBc3BlY3QoKTsKKyAgV2lkZVN0cmluZyBHZXRDb250ZW50KCk7CiAKLSBwcm90ZWN0ZWQ6Ci0gIGJvb2wgbV9iRGVmVmFsdWU7CisgIFdpZGVTdHJpbmcgR2V0SHJlZigpOworICB2b2lkIFNldEhyZWYoY29uc3QgV2lkZVN0cmluZyYgd3NIcmVmKTsKKworICBYRkFfQXR0cmlidXRlRW51bSBHZXRUcmFuc2ZlckVuY29kaW5nKCk7CisgIHZvaWQgU2V0VHJhbnNmZXJFbmNvZGluZyhYRkFfQXR0cmlidXRlRW51bSBpVHJhbnNmZXJFbmNvZGluZyk7CisKKyAgV2lkZVN0cmluZyBHZXRDb250ZW50VHlwZSgpOworICB2b2lkIFNldENvbnRlbnRUeXBlKGNvbnN0IFdpZGVTdHJpbmcmIHdzQ29udGVudFR5cGUpOwogfTsKIAogI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9JTUFHRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW1hZ2VlZGl0LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2ltYWdlZWRpdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYyMTA4NQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2ltYWdlZWRpdC5jcHAKQEAgLTAsMCArMSw0MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW1hZ2VlZGl0LmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfaW1hZ2VlZGl0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpNYXJnaW4sIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6Qm9yZGVyLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGF0YSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6TGlua30sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImltYWdlRWRpdCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0ltYWdlRWRpdDo6Q1hGQV9JbWFnZUVkaXQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkltYWdlRWRpdCwKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfSW1hZ2VFZGl0Pih0aGlzKSkge30KKworQ1hGQV9JbWFnZUVkaXQ6On5DWEZBX0ltYWdlRWRpdCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbWFnZWVkaXQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2ltYWdlZWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OTc1MGMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbWFnZWVkaXQuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfSU1BR0VFRElUX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0lNQUdFRURJVF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0ltYWdlRWRpdCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9JbWFnZUVkaXQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9JbWFnZUVkaXQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfSU1BR0VFRElUX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbmNsdWRleGRwY29udGVudC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbmNsdWRleGRwY29udGVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM4ODdkMwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2luY2x1ZGV4ZHBjb250ZW50LmNwcApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbmNsdWRleGRwY29udGVudC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiaW5jbHVkZVhEUENvbnRlbnQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9JbmNsdWRlWERQQ29udGVudDo6Q1hGQV9JbmNsdWRlWERQQ29udGVudChDWEZBX0RvY3VtZW50KiBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6SW5jbHVkZVhEUENvbnRlbnQsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9JbmNsdWRlWERQQ29udGVudDo6fkNYRkFfSW5jbHVkZVhEUENvbnRlbnQoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW5jbHVkZXhkcGNvbnRlbnQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2luY2x1ZGV4ZHBjb250ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA5YTdjNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2luY2x1ZGV4ZHBjb250ZW50LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0lOQ0xVREVYRFBDT05URU5UX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0lOQ0xVREVYRFBDT05URU5UX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfSW5jbHVkZVhEUENvbnRlbnQgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfSW5jbHVkZVhEUENvbnRlbnQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9JbmNsdWRlWERQQ29udGVudCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9JTkNMVURFWERQQ09OVEVOVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW5jcmVtZW50YWxsb2FkLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2luY3JlbWVudGFsbG9hZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNiYTBjYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2luY3JlbWVudGFsbG9hZC5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW5jcmVtZW50YWxsb2FkLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJpbmNyZW1lbnRhbExvYWQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9JbmNyZW1lbnRhbExvYWQ6OkNYRkFfSW5jcmVtZW50YWxMb2FkKENYRkFfRG9jdW1lbnQqIGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVYsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkluY3JlbWVudGFsTG9hZCwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0luY3JlbWVudGFsTG9hZDo6fkNYRkFfSW5jcmVtZW50YWxMb2FkKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2luY3JlbWVudGFsbG9hZC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW5jcmVtZW50YWxsb2FkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVhOGYyOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2luY3JlbWVudGFsbG9hZC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9JTkNSRU1FTlRBTExPQURfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfSU5DUkVNRU5UQUxMT0FEX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfSW5jcmVtZW50YWxMb2FkIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0luY3JlbWVudGFsTG9hZChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0luY3JlbWVudGFsTG9hZCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9JTkNSRU1FTlRBTExPQURfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2luY3JlbWVudGFsbWVyZ2UuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW5jcmVtZW50YWxtZXJnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU5ZGQyMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2luY3JlbWVudGFsbWVyZ2UuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2luY3JlbWVudGFsbWVyZ2UuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImluY3JlbWVudGFsTWVyZ2UiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9JbmNyZW1lbnRhbE1lcmdlOjpDWEZBX0luY3JlbWVudGFsTWVyZ2UoQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpJbmNyZW1lbnRhbE1lcmdlLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfSW5jcmVtZW50YWxNZXJnZTo6fkNYRkFfSW5jcmVtZW50YWxNZXJnZSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbmNyZW1lbnRhbG1lcmdlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbmNyZW1lbnRhbG1lcmdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlNjU1NAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2luY3JlbWVudGFsbWVyZ2UuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfSU5DUkVNRU5UQUxNRVJHRV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9JTkNSRU1FTlRBTE1FUkdFX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfSW5jcmVtZW50YWxNZXJnZSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9JbmNyZW1lbnRhbE1lcmdlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfSW5jcmVtZW50YWxNZXJnZSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9JTkNSRU1FTlRBTE1FUkdFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbnNlcnQuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW5zZXJ0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OThhN2Y4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW5zZXJ0LmNwcApAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbnNlcnQuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9pbnNlcnQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJpbnNlcnQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9JbnNlcnQ6OkNYRkFfSW5zZXJ0KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OlRleHROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpJbnNlcnQsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0luc2VydD4odGhpcykpIHt9CisKK0NYRkFfSW5zZXJ0Ojp+Q1hGQV9JbnNlcnQoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW5zZXJ0LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbnNlcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjU3OWMzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW5zZXJ0LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0lOU0VSVF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9JTlNFUlRfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9JbnNlcnQgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfSW5zZXJ0KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfSW5zZXJ0KCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0lOU0VSVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW5zdGFuY2VtYW5hZ2VyLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2luc3RhbmNlbWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhNTQ5OQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2luc3RhbmNlbWFuYWdlci5jcHAKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW5zdGFuY2VtYW5hZ2VyLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfaW5zdGFuY2VtYW5hZ2VyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpPY2N1ciwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiaW5zdGFuY2VNYW5hZ2VyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfSW5zdGFuY2VNYW5hZ2VyOjpDWEZBX0luc3RhbmNlTWFuYWdlcihDWEZBX0RvY3VtZW50KiBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Gb3JtLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpJbnN0YW5jZU1hbmFnZXIsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0luc3RhbmNlTWFuYWdlcj4odGhpcykpIHt9CisKK0NYRkFfSW5zdGFuY2VNYW5hZ2VyOjp+Q1hGQV9JbnN0YW5jZU1hbmFnZXIoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW5zdGFuY2VtYW5hZ2VyLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbnN0YW5jZW1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTEwYjkyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW5zdGFuY2VtYW5hZ2VyLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0lOU1RBTkNFTUFOQUdFUl9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9JTlNUQU5DRU1BTkFHRVJfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9JbnN0YW5jZU1hbmFnZXIgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfSW5zdGFuY2VNYW5hZ2VyKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfSW5zdGFuY2VNYW5hZ2VyKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0lOU1RBTkNFTUFOQUdFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW50ZWdlci5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbnRlZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDI2M2FiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW50ZWdlci5jcHAKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW50ZWdlci5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2ludGVnZXIuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJpbnRlZ2VyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfSW50ZWdlcjo6Q1hGQV9JbnRlZ2VyKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8CisgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpJbnRlZ2VyLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9JbnRlZ2VyPih0aGlzKSkge30KKworQ1hGQV9JbnRlZ2VyOjp+Q1hGQV9JbnRlZ2VyKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2ludGVnZXIuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2ludGVnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTU2MzFkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW50ZWdlci5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9JTlRFR0VSX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0lOVEVHRVJfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9JbnRlZ2VyIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0ludGVnZXIoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9JbnRlZ2VyKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0lOVEVHRVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2ludGVyYWN0aXZlLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2ludGVyYWN0aXZlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjhkOTU3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW50ZXJhY3RpdmUuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2ludGVyYWN0aXZlLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJpbnRlcmFjdGl2ZSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0ludGVyYWN0aXZlOjpDWEZBX0ludGVyYWN0aXZlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpJbnRlcmFjdGl2ZSwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0ludGVyYWN0aXZlOjp+Q1hGQV9JbnRlcmFjdGl2ZSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbnRlcmFjdGl2ZS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW50ZXJhY3RpdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWYyOTE4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW50ZXJhY3RpdmUuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfSU5URVJBQ1RJVkVfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfSU5URVJBQ1RJVkVfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9JbnRlcmFjdGl2ZSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9JbnRlcmFjdGl2ZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0ludGVyYWN0aXZlKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0lOVEVSQUNUSVZFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pc3N1ZXJzLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2lzc3VlcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YzcwYmMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pc3N1ZXJzLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pc3N1ZXJzLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfaXNzdWVycy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlR5cGUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06Ok9wdGlvbmFsfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiaXNzdWVycyI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0lzc3VlcnM6OkNYRkFfSXNzdWVycyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6SXNzdWVycywKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfSXNzdWVycz4odGhpcykpIHt9CisKK0NYRkFfSXNzdWVyczo6fkNYRkFfSXNzdWVycygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pc3N1ZXJzLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pc3N1ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5NGYxNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2lzc3VlcnMuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfSVNTVUVSU19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9JU1NVRVJTX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfSXNzdWVycyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9Jc3N1ZXJzKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfSXNzdWVycygpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9JU1NVRVJTX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pdGVtbGF5b3V0cHJvY2Vzc29yLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2l0ZW1sYXlvdXRwcm9jZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNGQ3ZWQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pdGVtbGF5b3V0cHJvY2Vzc29yLmNwcApAQCAtMCwwICsxLDI4NDMgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2l0ZW1sYXlvdXRwcm9jZXNzb3IuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfb2JqZWN0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmbm90aWZ5LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29udGFpbmVybGF5b3V0aXRlbS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbnRlbnRsYXlvdXRpdGVtLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9rZWVwLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0Y29udGV4dC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dHBhZ2VtZ3IuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGVtZ3IuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tYXJnaW4uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWFzdXJlbWVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlaXRlcmF0b3J0ZW1wbGF0ZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX29jY3VyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFyYS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RyYXZlcnNlc3RyYXRlZ3lfeGZhbm9kZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfdXRpbHMuaCIKKworbmFtZXNwYWNlIHsKKworc3RkOjp2ZWN0b3I8V2lkZVN0cmluZz4gU2VwYXJhdGVTdHJpbmdXKGNvbnN0IHdjaGFyX3QqIHBTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3RyTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdjaGFyX3QgZGVsaW1pdGVyKSB7CisgIHN0ZDo6dmVjdG9yPFdpZGVTdHJpbmc+IHJldDsKKyAgaWYgKCFwU3RyKQorICAgIHJldHVybiByZXQ7CisgIGlmIChpU3RyTGVuIDwgMCkKKyAgICBpU3RyTGVuID0gd2NzbGVuKHBTdHIpOworCisgIGNvbnN0IHdjaGFyX3QqIHBUb2tlbiA9IHBTdHI7CisgIGNvbnN0IHdjaGFyX3QqIHBFbmQgPSBwU3RyICsgaVN0ckxlbjsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBpZiAocFN0ciA+PSBwRW5kIHx8IGRlbGltaXRlciA9PSAqcFN0cikgeworICAgICAgcmV0LnB1c2hfYmFjayhXaWRlU3RyaW5nKHBUb2tlbiwgcFN0ciAtIHBUb2tlbikpOworICAgICAgcFRva2VuID0gcFN0ciArIDE7CisgICAgICBpZiAocFN0ciA+PSBwRW5kKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcFN0cisrOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgVXBkYXRlV2lkZ2V0U2l6ZShDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZldpZHRoLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBmSGVpZ2h0KSB7CisgIENYRkFfTm9kZSogcE5vZGUgPSBwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGU7CisgIHN3aXRjaCAocE5vZGUtPkdldEVsZW1lbnRUeXBlKCkpIHsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTdWJmb3JtOgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkFyZWE6CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RXhjbEdyb3VwOgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlN1YmZvcm1TZXQ6IHsKKyAgICAgIGlmICgqZldpZHRoIDwgLVhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKQorICAgICAgICAqZldpZHRoID0gcExheW91dEl0ZW0tPm1fc1NpemUud2lkdGg7CisgICAgICBpZiAoKmZIZWlnaHQgPCAtWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pCisgICAgICAgICpmSGVpZ2h0ID0gcExheW91dEl0ZW0tPm1fc1NpemUuaGVpZ2h0OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRyYXc6CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RmllbGQ6IHsKKyAgICAgIHBOb2RlLT5HZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKS0+U3RhcnRGaWVsZERyYXdMYXlvdXQocE5vZGUsICpmV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmSGVpZ2h0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgTk9UUkVBQ0hFRCgpOworICB9Cit9CisKK0NGWF9TaXplRiBDYWxjdWxhdGVDb250YWluZXJTcGVjaWZpZWRTaXplKENYRkFfTm9kZSogcEZvcm1Ob2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpIHsKKyAgKmJDb250YWluZXJXaWR0aEF1dG9TaXplID0gdHJ1ZTsKKyAgKmJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSA9IHRydWU7CisKKyAgWEZBX0VsZW1lbnQgZVR5cGUgPSBwRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCk7CisKKyAgQ0ZYX1NpemVGIGNvbnRhaW5lclNpemU7CisgIGlmIChlVHlwZSA9PSBYRkFfRWxlbWVudDo6U3ViZm9ybSB8fCBlVHlwZSA9PSBYRkFfRWxlbWVudDo6RXhjbEdyb3VwKSB7CisgICAgT3B0aW9uYWw8Q1hGQV9NZWFzdXJlbWVudD4gd1ZhbHVlID0KKyAgICAgICAgcEZvcm1Ob2RlLT5KU09iamVjdCgpLT5UcnlNZWFzdXJlKFhGQV9BdHRyaWJ1dGU6OlcsIGZhbHNlKTsKKyAgICBpZiAod1ZhbHVlICYmIHdWYWx1ZS0+R2V0VmFsdWUoKSA+IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7CisgICAgICBjb250YWluZXJTaXplLndpZHRoID0gd1ZhbHVlLT5Ub1VuaXQoWEZBX1VuaXQ6OlB0KTsKKyAgICAgICpiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSA9IGZhbHNlOworICAgIH0KKworICAgIE9wdGlvbmFsPENYRkFfTWVhc3VyZW1lbnQ+IGhWYWx1ZSA9CisgICAgICAgIHBGb3JtTm9kZS0+SlNPYmplY3QoKS0+VHJ5TWVhc3VyZShYRkFfQXR0cmlidXRlOjpILCBmYWxzZSk7CisgICAgaWYgKGhWYWx1ZSAmJiBoVmFsdWUtPkdldFZhbHVlKCkgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgeworICAgICAgY29udGFpbmVyU2l6ZS5oZWlnaHQgPSBoVmFsdWUtPlRvVW5pdChYRkFfVW5pdDo6UHQpOworICAgICAgKmJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSA9IGZhbHNlOworICAgIH0KKyAgfQorCisgIGlmICgqYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgJiYgZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm0pIHsKKyAgICBPcHRpb25hbDxDWEZBX01lYXN1cmVtZW50PiBtYXhXID0KKyAgICAgICAgcEZvcm1Ob2RlLT5KU09iamVjdCgpLT5UcnlNZWFzdXJlKFhGQV9BdHRyaWJ1dGU6Ok1heFcsIGZhbHNlKTsKKyAgICBpZiAobWF4VyAmJiBtYXhXLT5HZXRWYWx1ZSgpID4gWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsKKyAgICAgIGNvbnRhaW5lclNpemUud2lkdGggPSBtYXhXLT5Ub1VuaXQoWEZBX1VuaXQ6OlB0KTsKKyAgICAgICpiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSA9IGZhbHNlOworICAgIH0KKworICAgIE9wdGlvbmFsPENYRkFfTWVhc3VyZW1lbnQ+IG1heEggPQorICAgICAgICBwRm9ybU5vZGUtPkpTT2JqZWN0KCktPlRyeU1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6TWF4SCwgZmFsc2UpOworICAgIGlmIChtYXhIICYmIG1heEgtPkdldFZhbHVlKCkgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgeworICAgICAgY29udGFpbmVyU2l6ZS5oZWlnaHQgPSBtYXhILT5Ub1VuaXQoWEZBX1VuaXQ6OlB0KTsKKyAgICAgICpiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgPSBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGNvbnRhaW5lclNpemU7Cit9CisKK0NGWF9TaXplRiBDYWxjdWxhdGVDb250YWluZXJDb21wb25lbnRTaXplRnJvbUNvbnRlbnRTaXplKAorICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlLAorICAgIGJvb2wgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsCisgICAgZmxvYXQgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsCisgICAgYm9vbCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsCisgICAgZmxvYXQgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0LAorICAgIGNvbnN0IENGWF9TaXplRiYgY3VycmVudENvbnRhaW5lclNpemUpIHsKKyAgQ0ZYX1NpemVGIGNvbXBvbmVudFNpemUgPSBjdXJyZW50Q29udGFpbmVyU2l6ZTsKKyAgQ1hGQV9NYXJnaW4qIHBNYXJnaW5Ob2RlID0KKyAgICAgIHBGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9NYXJnaW4+KFhGQV9FbGVtZW50OjpNYXJnaW4pOworICBpZiAoYkNvbnRhaW5lcldpZHRoQXV0b1NpemUpIHsKKyAgICBjb21wb25lbnRTaXplLndpZHRoID0gZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGg7CisgICAgaWYgKHBNYXJnaW5Ob2RlKSB7CisgICAgICBPcHRpb25hbDxDWEZBX01lYXN1cmVtZW50PiBsZWZ0SW5zZXQgPQorICAgICAgICAgIHBNYXJnaW5Ob2RlLT5KU09iamVjdCgpLT5UcnlNZWFzdXJlKFhGQV9BdHRyaWJ1dGU6OkxlZnRJbnNldCwgZmFsc2UpOworICAgICAgaWYgKGxlZnRJbnNldCkKKyAgICAgICAgY29tcG9uZW50U2l6ZS53aWR0aCArPSBsZWZ0SW5zZXQtPlRvVW5pdChYRkFfVW5pdDo6UHQpOworCisgICAgICBPcHRpb25hbDxDWEZBX01lYXN1cmVtZW50PiByaWdodEluc2V0ID0KKyAgICAgICAgICBwTWFyZ2luTm9kZS0+SlNPYmplY3QoKS0+VHJ5TWVhc3VyZShYRkFfQXR0cmlidXRlOjpSaWdodEluc2V0LCBmYWxzZSk7CisgICAgICBpZiAocmlnaHRJbnNldCkKKyAgICAgICAgY29tcG9uZW50U2l6ZS53aWR0aCArPSByaWdodEluc2V0LT5Ub1VuaXQoWEZBX1VuaXQ6OlB0KTsKKyAgICB9CisgIH0KKworICBpZiAoYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKSB7CisgICAgY29tcG9uZW50U2l6ZS5oZWlnaHQgPSBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQ7CisgICAgaWYgKHBNYXJnaW5Ob2RlKSB7CisgICAgICBPcHRpb25hbDxDWEZBX01lYXN1cmVtZW50PiB0b3BJbnNldCA9CisgICAgICAgICAgcE1hcmdpbk5vZGUtPkpTT2JqZWN0KCktPlRyeU1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6VG9wSW5zZXQsIGZhbHNlKTsKKyAgICAgIGlmICh0b3BJbnNldCkKKyAgICAgICAgY29tcG9uZW50U2l6ZS5oZWlnaHQgKz0gdG9wSW5zZXQtPlRvVW5pdChYRkFfVW5pdDo6UHQpOworCisgICAgICBPcHRpb25hbDxDWEZBX01lYXN1cmVtZW50PiBib3R0b21JbnNldCA9CisgICAgICAgICAgcE1hcmdpbk5vZGUtPkpTT2JqZWN0KCktPlRyeU1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6Qm90dG9tSW5zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgaWYgKGJvdHRvbUluc2V0KQorICAgICAgICBjb21wb25lbnRTaXplLmhlaWdodCArPSBib3R0b21JbnNldC0+VG9Vbml0KFhGQV9Vbml0OjpQdCk7CisgICAgfQorICB9CisgIHJldHVybiBjb21wb25lbnRTaXplOworfQorCit2b2lkIFJlbG9jYXRlVGFibGVSb3dDZWxscyhDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0Um93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiByZ1NwZWNpZmllZENvbHVtbldpZHRocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtIGVMYXlvdXQpIHsKKyAgYm9vbCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSA9IHRydWU7CisgIGJvb2wgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplID0gdHJ1ZTsKKyAgQ0ZYX1NpemVGIGNvbnRhaW5lclNpemUgPSBDYWxjdWxhdGVDb250YWluZXJTcGVjaWZpZWRTaXplKAorICAgICAgcExheW91dFJvdy0+bV9wRm9ybU5vZGUsICZiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwKKyAgICAgICZiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpOworICBDWEZBX01hcmdpbiogcE1hcmdpbk5vZGUgPQorICAgICAgcExheW91dFJvdy0+bV9wRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzPENYRkFfTWFyZ2luPigKKyAgICAgICAgICBYRkFfRWxlbWVudDo6TWFyZ2luKTsKKyAgZmxvYXQgZkxlZnRJbnNldCA9IDA7CisgIGZsb2F0IGZUb3BJbnNldCA9IDA7CisgIGZsb2F0IGZSaWdodEluc2V0ID0gMDsKKyAgZmxvYXQgZkJvdHRvbUluc2V0ID0gMDsKKyAgaWYgKHBNYXJnaW5Ob2RlKSB7CisgICAgZkxlZnRJbnNldCA9IHBNYXJnaW5Ob2RlLT5KU09iamVjdCgpCisgICAgICAgICAgICAgICAgICAgICAtPkdldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6TGVmdEluc2V0KQorICAgICAgICAgICAgICAgICAgICAgLlRvVW5pdChYRkFfVW5pdDo6UHQpOworICAgIGZUb3BJbnNldCA9IHBNYXJnaW5Ob2RlLT5KU09iamVjdCgpCisgICAgICAgICAgICAgICAgICAgIC0+R2V0TWVhc3VyZShYRkFfQXR0cmlidXRlOjpUb3BJbnNldCkKKyAgICAgICAgICAgICAgICAgICAgLlRvVW5pdChYRkFfVW5pdDo6UHQpOworICAgIGZSaWdodEluc2V0ID0gcE1hcmdpbk5vZGUtPkpTT2JqZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAtPkdldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6UmlnaHRJbnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAuVG9Vbml0KFhGQV9Vbml0OjpQdCk7CisgICAgZkJvdHRvbUluc2V0ID0gcE1hcmdpbk5vZGUtPkpTT2JqZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRNZWFzdXJlKFhGQV9BdHRyaWJ1dGU6OkJvdHRvbUluc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAuVG9Vbml0KFhGQV9Vbml0OjpQdCk7CisgIH0KKworICBmbG9hdCBmQ29udGVudFdpZHRoTGltaXQgPQorICAgICAgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPyBGTFRfTUFYCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbnRhaW5lclNpemUud2lkdGggLSBmTGVmdEluc2V0IC0gZlJpZ2h0SW5zZXQ7CisgIGZsb2F0IGZDb250ZW50Q3VycmVudEhlaWdodCA9CisgICAgICBwTGF5b3V0Um93LT5tX3NTaXplLmhlaWdodCAtIGZUb3BJbnNldCAtIGZCb3R0b21JbnNldDsKKyAgZmxvYXQgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSAwOworICBmbG9hdCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSAwOworICBmbG9hdCBmQ3VycmVudENvbFggPSAwOworICBpbnQzMl90IG5DdXJyZW50Q29sSWR4ID0gMDsKKyAgYm9vbCBiTWV0V2hvbGVSb3dDZWxsID0gZmFsc2U7CisKKyAgZm9yIChhdXRvKiBwTGF5b3V0Q2hpbGQgPQorICAgICAgICAgICBzdGF0aWNfY2FzdDxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4ocExheW91dFJvdy0+bV9wRmlyc3RDaGlsZCk7CisgICAgICAgcExheW91dENoaWxkOyBwTGF5b3V0Q2hpbGQgPSBzdGF0aWNfY2FzdDxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgcExheW91dENoaWxkLT5tX3BOZXh0U2libGluZykpIHsKKyAgICBpbnQzMl90IG5PcmlnaW5hbENvbFNwYW4gPQorICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlLT5KU09iamVjdCgpLT5HZXRJbnRlZ2VyKAorICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZTo6Q29sU3Bhbik7CisgICAgaW50MzJfdCBuQ29sU3BhbiA9IG5PcmlnaW5hbENvbFNwYW47CisgICAgZmxvYXQgZkNvbFNwYW5XaWR0aCA9IDA7CisgICAgaWYgKG5Db2xTcGFuID09IC0xIHx8CisgICAgICAgIG5DdXJyZW50Q29sSWR4ICsgbkNvbFNwYW4gPgorICAgICAgICAgICAgcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihyZ1NwZWNpZmllZENvbHVtbldpZHRocykpIHsKKyAgICAgIG5Db2xTcGFuID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihyZ1NwZWNpZmllZENvbHVtbldpZHRocykgLQorICAgICAgICAgICAgICAgICBuQ3VycmVudENvbElkeDsKKyAgICB9CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvbFNwYW47IGkrKykKKyAgICAgIGZDb2xTcGFuV2lkdGggKz0gcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHNbbkN1cnJlbnRDb2xJZHggKyBpXTsKKworICAgIGlmIChuQ29sU3BhbiAhPSBuT3JpZ2luYWxDb2xTcGFuKSB7CisgICAgICBmQ29sU3BhbldpZHRoID0KKyAgICAgICAgICBiTWV0V2hvbGVSb3dDZWxsID8gMCA6IHN0ZDo6bWF4KGZDb2xTcGFuV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fc1NpemUuaGVpZ2h0KTsKKyAgICB9CisgICAgaWYgKG5PcmlnaW5hbENvbFNwYW4gPT0gLTEpCisgICAgICBiTWV0V2hvbGVSb3dDZWxsID0gdHJ1ZTsKKworICAgIHBMYXlvdXRDaGlsZC0+bV9zUG9zID0gQ0ZYX1BvaW50RihmQ3VycmVudENvbFgsIDApOworICAgIHBMYXlvdXRDaGlsZC0+bV9zU2l6ZS53aWR0aCA9IGZDb2xTcGFuV2lkdGg7CisgICAgaWYgKCFYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUpKQorICAgICAgY29udGludWU7CisKKyAgICBmQ3VycmVudENvbFggKz0gZkNvbFNwYW5XaWR0aDsKKyAgICBuQ3VycmVudENvbElkeCArPSBuQ29sU3BhbjsKKyAgICBmbG9hdCBmTmV3SGVpZ2h0ID0gYkNvbnRhaW5lckhlaWdodEF1dG9TaXplID8gLTEgOiBmQ29udGVudEN1cnJlbnRIZWlnaHQ7CisgICAgVXBkYXRlV2lkZ2V0U2l6ZShwTGF5b3V0Q2hpbGQsICZmQ29sU3BhbldpZHRoLCAmZk5ld0hlaWdodCk7CisgICAgcExheW91dENoaWxkLT5tX3NTaXplLmhlaWdodCA9IGZOZXdIZWlnaHQ7CisgICAgaWYgKGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSkgeworICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0KKyAgICAgICAgICBzdGQ6Om1heChmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsIHBMYXlvdXRDaGlsZC0+bV9zU2l6ZS5oZWlnaHQpOworICAgIH0KKyAgfQorCisgIGlmIChiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpIHsKKyAgICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXRDaGlsZCA9CisgICAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXRSb3ctPm1fcEZpcnN0Q2hpbGQ7CisgICAgICAgICBwTGF5b3V0Q2hpbGQ7CisgICAgICAgICBwTGF5b3V0Q2hpbGQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcExheW91dENoaWxkLT5tX3BOZXh0U2libGluZykgeworICAgICAgVXBkYXRlV2lkZ2V0U2l6ZShwTGF5b3V0Q2hpbGQsICZwTGF5b3V0Q2hpbGQtPm1fc1NpemUud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICZmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQpOworICAgICAgZmxvYXQgZk9sZENoaWxkSGVpZ2h0ID0gcExheW91dENoaWxkLT5tX3NTaXplLmhlaWdodDsKKyAgICAgIHBMYXlvdXRDaGlsZC0+bV9zU2l6ZS5oZWlnaHQgPSBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQ7CisgICAgICBDWEZBX1BhcmEqIHBQYXJhTm9kZSA9CisgICAgICAgICAgcExheW91dENoaWxkLT5tX3BGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9QYXJhPigKKyAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlBhcmEpOworICAgICAgaWYgKHBQYXJhTm9kZSAmJiBwTGF5b3V0Q2hpbGQtPm1fcEZpcnN0Q2hpbGQpIHsKKyAgICAgICAgZmxvYXQgZk9mZkhlaWdodCA9IGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCAtIGZPbGRDaGlsZEhlaWdodDsKKyAgICAgICAgWEZBX0F0dHJpYnV0ZUVudW0gZVZUeXBlID0KKyAgICAgICAgICAgIHBQYXJhTm9kZS0+SlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpWQWxpZ24pOworICAgICAgICBzd2l0Y2ggKGVWVHlwZSkgeworICAgICAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06Ok1pZGRsZToKKyAgICAgICAgICAgIGZPZmZIZWlnaHQgPSBmT2ZmSGVpZ2h0IC8gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkJvdHRvbToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OlRvcDoKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZk9mZkhlaWdodCA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoZk9mZkhlaWdodCA+IDApIHsKKyAgICAgICAgICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBJbm5lckxheW91dENoaWxkID0KKyAgICAgICAgICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcExheW91dENoaWxkLT5tX3BGaXJzdENoaWxkOworICAgICAgICAgICAgICAgcElubmVyTGF5b3V0Q2hpbGQ7CisgICAgICAgICAgICAgICBwSW5uZXJMYXlvdXRDaGlsZCA9CisgICAgICAgICAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBJbm5lckxheW91dENoaWxkLT5tX3BOZXh0U2libGluZykgeworICAgICAgICAgICAgcElubmVyTGF5b3V0Q2hpbGQtPm1fc1Bvcy55ICs9IGZPZmZIZWlnaHQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGJDb250YWluZXJXaWR0aEF1dG9TaXplKSB7CisgICAgZmxvYXQgZkNoaWxkU3VwcGxpZWRXaWR0aCA9IGZDdXJyZW50Q29sWDsKKyAgICBpZiAoZkNvbnRlbnRXaWR0aExpbWl0IDwgRkxUX01BWCAmJgorICAgICAgICBmQ29udGVudFdpZHRoTGltaXQgPiBmQ2hpbGRTdXBwbGllZFdpZHRoKSB7CisgICAgICBmQ2hpbGRTdXBwbGllZFdpZHRoID0gZkNvbnRlbnRXaWR0aExpbWl0OworICAgIH0KKyAgICBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9CisgICAgICAgIHN0ZDo6bWF4KGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoLCBmQ2hpbGRTdXBwbGllZFdpZHRoKTsKKyAgfSBlbHNlIHsKKyAgICBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IGNvbnRhaW5lclNpemUud2lkdGggLSBmTGVmdEluc2V0IC0gZlJpZ2h0SW5zZXQ7CisgIH0KKworICBpZiAocExheW91dFJvdy0+bV9wRm9ybU5vZGUtPkpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6TGF5b3V0KSA9PQorICAgICAgWEZBX0F0dHJpYnV0ZUVudW06OlJsX3JvdykgeworICAgIGZvciAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcExheW91dENoaWxkID0KKyAgICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcExheW91dFJvdy0+bV9wRmlyc3RDaGlsZDsKKyAgICAgICAgIHBMYXlvdXRDaGlsZDsKKyAgICAgICAgIHBMYXlvdXRDaGlsZCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwTGF5b3V0Q2hpbGQtPm1fcE5leHRTaWJsaW5nKSB7CisgICAgICBwTGF5b3V0Q2hpbGQtPm1fc1Bvcy54ID0gZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXlvdXRDaGlsZC0+bV9zUG9zLnggLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXlvdXRDaGlsZC0+bV9zU2l6ZS53aWR0aDsKKyAgICB9CisgIH0KKyAgcExheW91dFJvdy0+bV9zU2l6ZSA9IENhbGN1bGF0ZUNvbnRhaW5lckNvbXBvbmVudFNpemVGcm9tQ29udGVudFNpemUoCisgICAgICBwTGF5b3V0Um93LT5tX3BGb3JtTm9kZSwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoLAorICAgICAgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsIGNvbnRhaW5lclNpemUpOworfQorCit2b2lkIFVwZGF0ZVBlbmRpbmdJdGVtTGF5b3V0KENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcExheW91dEl0ZW0pIHsKKyAgWEZBX0F0dHJpYnV0ZUVudW0gZUxheW91dCA9CisgICAgICBwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6TGF5b3V0KTsKKyAgc3dpdGNoIChlTGF5b3V0KSB7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6Um93OgorICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OlJsX3JvdzoKKyAgICAgIFJlbG9jYXRlVGFibGVSb3dDZWxscyhwTGF5b3V0SXRlbSwgcFByb2Nlc3Nvci0+bV9yZ1NwZWNpZmllZENvbHVtbldpZHRocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlTGF5b3V0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkIEFkZFRyYWlsZXJCZWZvcmVTcGxpdChDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQcm9jZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmU3BsaXRQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwVHJhaWxlckxheW91dEl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJVc2VJbmhlcml0ZWQpIHsKKyAgaWYgKCFwVHJhaWxlckxheW91dEl0ZW0pCisgICAgcmV0dXJuOworCisgIGZsb2F0IGZIZWlnaHQgPSBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1NpemUuaGVpZ2h0OworICBpZiAoYlVzZUluaGVyaXRlZCkgeworICAgIGZsb2F0IGZOZXdTcGxpdFBvcyA9IDA7CisgICAgaWYgKGZTcGxpdFBvcyAtIGZIZWlnaHQgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikKKyAgICAgIGZOZXdTcGxpdFBvcyA9IHBQcm9jZXNzb3ItPkZpbmRTcGxpdFBvcyhmU3BsaXRQb3MgLSBmSGVpZ2h0KTsKKyAgICBpZiAoZk5ld1NwbGl0UG9zID4gWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pCisgICAgICBwUHJvY2Vzc29yLT5TcGxpdExheW91dEl0ZW0oZk5ld1NwbGl0UG9zKTsKKyAgICByZXR1cm47CisgIH0KKworICBVcGRhdGVQZW5kaW5nSXRlbUxheW91dChwUHJvY2Vzc29yLCBwVHJhaWxlckxheW91dEl0ZW0pOworICBDWEZBX01hcmdpbiogcE1hcmdpbk5vZGUgPQorICAgICAgcFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzPENYRkFfTWFyZ2luPigKKyAgICAgICAgICBYRkFfRWxlbWVudDo6TWFyZ2luKTsKKyAgZmxvYXQgZkxlZnRJbnNldCA9IDA7CisgIGZsb2F0IGZUb3BJbnNldCA9IDA7CisgIGZsb2F0IGZSaWdodEluc2V0ID0gMDsKKyAgZmxvYXQgZkJvdHRvbUluc2V0ID0gMDsKKyAgaWYgKHBNYXJnaW5Ob2RlKSB7CisgICAgZkxlZnRJbnNldCA9IHBNYXJnaW5Ob2RlLT5KU09iamVjdCgpCisgICAgICAgICAgICAgICAgICAgICAtPkdldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6TGVmdEluc2V0KQorICAgICAgICAgICAgICAgICAgICAgLlRvVW5pdChYRkFfVW5pdDo6UHQpOworICAgIGZUb3BJbnNldCA9IHBNYXJnaW5Ob2RlLT5KU09iamVjdCgpCisgICAgICAgICAgICAgICAgICAgIC0+R2V0TWVhc3VyZShYRkFfQXR0cmlidXRlOjpUb3BJbnNldCkKKyAgICAgICAgICAgICAgICAgICAgLlRvVW5pdChYRkFfVW5pdDo6UHQpOworICAgIGZSaWdodEluc2V0ID0gcE1hcmdpbk5vZGUtPkpTT2JqZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAtPkdldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6UmlnaHRJbnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAuVG9Vbml0KFhGQV9Vbml0OjpQdCk7CisgICAgZkJvdHRvbUluc2V0ID0gcE1hcmdpbk5vZGUtPkpTT2JqZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRNZWFzdXJlKFhGQV9BdHRyaWJ1dGU6OkJvdHRvbUluc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAuVG9Vbml0KFhGQV9Vbml0OjpQdCk7CisgIH0KKworICBpZiAoIXBQcm9jZXNzb3ItPklzQWRkTmV3Um93Rm9yVHJhaWxlcihwVHJhaWxlckxheW91dEl0ZW0pKSB7CisgICAgcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NQb3MueSA9IHBQcm9jZXNzb3ItPm1fZkxhc3RSb3dZOworICAgIHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zUG9zLnggPSBwUHJvY2Vzc29yLT5tX2ZMYXN0Um93V2lkdGg7CisgICAgcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS53aWR0aCArPQorICAgICAgICBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1NpemUud2lkdGg7CisgICAgcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+QWRkQ2hpbGQocFRyYWlsZXJMYXlvdXRJdGVtKTsKKyAgICByZXR1cm47CisgIH0KKworICBmbG9hdCBmTmV3U3BsaXRQb3MgPSAwOworICBpZiAoZlNwbGl0UG9zIC0gZkhlaWdodCA+IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKQorICAgIGZOZXdTcGxpdFBvcyA9IHBQcm9jZXNzb3ItPkZpbmRTcGxpdFBvcyhmU3BsaXRQb3MgLSBmSGVpZ2h0KTsKKworICBpZiAoZk5ld1NwbGl0UG9zID4gWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsKKyAgICBwUHJvY2Vzc29yLT5TcGxpdExheW91dEl0ZW0oZk5ld1NwbGl0UG9zKTsKKyAgICBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1Bvcy55ID0gZk5ld1NwbGl0UG9zIC0gZlRvcEluc2V0IC0gZkJvdHRvbUluc2V0OworICB9IGVsc2UgeworICAgIHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zUG9zLnkgPSBmU3BsaXRQb3MgLSBmVG9wSW5zZXQgLSBmQm90dG9tSW5zZXQ7CisgIH0KKworICBzd2l0Y2ggKHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkpTT2JqZWN0KCktPkdldEVudW0oCisgICAgICBYRkFfQXR0cmlidXRlOjpIQWxpZ24pKSB7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6UmlnaHQ6CisgICAgICBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1Bvcy54ID0gcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS53aWR0aCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJpZ2h0SW5zZXQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS53aWR0aDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkNlbnRlcjoKKyAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zUG9zLnggPQorICAgICAgICAgIChwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3NTaXplLndpZHRoIC0gZkxlZnRJbnNldCAtIGZSaWdodEluc2V0IC0KKyAgICAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NTaXplLndpZHRoKSAvCisgICAgICAgICAgMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkxlZnQ6CisgICAgZGVmYXVsdDoKKyAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zUG9zLnggPSBmTGVmdEluc2V0OworICAgICAgYnJlYWs7CisgIH0KKyAgcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS5oZWlnaHQgKz0gZkhlaWdodDsKKyAgcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+QWRkQ2hpbGQocFRyYWlsZXJMYXlvdXRJdGVtKTsKK30KKwordm9pZCBBZGRMZWFkZXJBZnRlclNwbGl0KENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGVhZGVyTGF5b3V0SXRlbSkgeworICBVcGRhdGVQZW5kaW5nSXRlbUxheW91dChwUHJvY2Vzc29yLCBwTGVhZGVyTGF5b3V0SXRlbSk7CisKKyAgQ1hGQV9NYXJnaW4qIHBNYXJnaW5Ob2RlID0KKyAgICAgIHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX01hcmdpbj4oCisgICAgICAgICAgWEZBX0VsZW1lbnQ6Ok1hcmdpbik7CisgIGZsb2F0IGZMZWZ0SW5zZXQgPSAwOworICBmbG9hdCBmUmlnaHRJbnNldCA9IDA7CisgIGlmIChwTWFyZ2luTm9kZSkgeworICAgIGZMZWZ0SW5zZXQgPSBwTWFyZ2luTm9kZS0+SlNPYmplY3QoKQorICAgICAgICAgICAgICAgICAgICAgLT5HZXRNZWFzdXJlKFhGQV9BdHRyaWJ1dGU6OkxlZnRJbnNldCkKKyAgICAgICAgICAgICAgICAgICAgIC5Ub1VuaXQoWEZBX1VuaXQ6OlB0KTsKKyAgICBmUmlnaHRJbnNldCA9IHBNYXJnaW5Ob2RlLT5KU09iamVjdCgpCisgICAgICAgICAgICAgICAgICAgICAgLT5HZXRNZWFzdXJlKFhGQV9BdHRyaWJ1dGU6OlJpZ2h0SW5zZXQpCisgICAgICAgICAgICAgICAgICAgICAgLlRvVW5pdChYRkFfVW5pdDo6UHQpOworICB9CisKKyAgZmxvYXQgZkhlaWdodCA9IHBMZWFkZXJMYXlvdXRJdGVtLT5tX3NTaXplLmhlaWdodDsKKyAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwQ2hpbGRJdGVtID0KKyAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7CisgICAgICAgcENoaWxkSXRlbTsKKyAgICAgICBwQ2hpbGRJdGVtID0gKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nKSB7CisgICAgcENoaWxkSXRlbS0+bV9zUG9zLnkgKz0gZkhlaWdodDsKKyAgfQorICBwTGVhZGVyTGF5b3V0SXRlbS0+bV9zUG9zLnkgPSAwOworCisgIHN3aXRjaCAocExlYWRlckxheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5KU09iamVjdCgpLT5HZXRFbnVtKAorICAgICAgWEZBX0F0dHJpYnV0ZTo6SEFsaWduKSkgeworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OlJpZ2h0OgorICAgICAgcExlYWRlckxheW91dEl0ZW0tPm1fc1Bvcy54ID0gcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS53aWR0aCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUmlnaHRJbnNldCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVhZGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS53aWR0aDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkNlbnRlcjoKKyAgICAgIHBMZWFkZXJMYXlvdXRJdGVtLT5tX3NQb3MueCA9CisgICAgICAgICAgKHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fc1NpemUud2lkdGggLSBmTGVmdEluc2V0IC0gZlJpZ2h0SW5zZXQgLQorICAgICAgICAgICBwTGVhZGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS53aWR0aCkgLworICAgICAgICAgIDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpMZWZ0OgorICAgIGRlZmF1bHQ6CisgICAgICBwTGVhZGVyTGF5b3V0SXRlbS0+bV9zUG9zLnggPSBmTGVmdEluc2V0OworICAgICAgYnJlYWs7CisgIH0KKyAgcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS5oZWlnaHQgKz0gZkhlaWdodDsKKyAgcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+QWRkQ2hpbGQocExlYWRlckxheW91dEl0ZW0pOworfQorCit2b2lkIEFkZFBlbmRpbmdOb2RlKENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGVuZGluZ05vZGUsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgYkJyZWFrUGVuZGluZykgeworICBwUHJvY2Vzc29yLT5tX1BlbmRpbmdOb2Rlcy5wdXNoX2JhY2socFBlbmRpbmdOb2RlKTsKKyAgcFByb2Nlc3Nvci0+bV9iQnJlYWtQZW5kaW5nID0gYkJyZWFrUGVuZGluZzsKK30KKworZmxvYXQgSW5zZXJ0UGVuZGluZ0l0ZW1zKENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBDdXJDaGlsZE5vZGUpIHsKKyAgZmxvYXQgZlRvdGFsSGVpZ2h0ID0gMDsKKyAgaWYgKHBQcm9jZXNzb3ItPm1fUGVuZGluZ05vZGVzLmVtcHR5KCkpCisgICAgcmV0dXJuIGZUb3RhbEhlaWdodDsKKworICBpZiAoIXBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0pIHsKKyAgICBwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtID0KKyAgICAgICAgcFByb2Nlc3Nvci0+Q3JlYXRlQ29udGVudExheW91dEl0ZW0ocEN1ckNoaWxkTm9kZSk7CisgICAgcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS5jbGVhcigpOworICB9CisKKyAgd2hpbGUgKCFwUHJvY2Vzc29yLT5tX1BlbmRpbmdOb2Rlcy5lbXB0eSgpKSB7CisgICAgYXV0byBwUGVuZGluZ1Byb2Nlc3NvciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I+KAorICAgICAgICBwUHJvY2Vzc29yLT5tX1BlbmRpbmdOb2Rlcy5mcm9udCgpLCBudWxscHRyKTsKKyAgICBwUHJvY2Vzc29yLT5tX1BlbmRpbmdOb2Rlcy5wb3BfZnJvbnQoKTsKKyAgICBwUGVuZGluZ1Byb2Nlc3Nvci0+RG9MYXlvdXQoZmFsc2UsIEZMVF9NQVgsIEZMVF9NQVgsIG51bGxwdHIpOworICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBQZW5kaW5nTGF5b3V0SXRlbSA9CisgICAgICAgIHBQZW5kaW5nUHJvY2Vzc29yLT5IYXNMYXlvdXRJdGVtKCkKKyAgICAgICAgICAgID8gcFBlbmRpbmdQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCkKKyAgICAgICAgICAgIDogbnVsbHB0cjsKKyAgICBpZiAocFBlbmRpbmdMYXlvdXRJdGVtKSB7CisgICAgICBBZGRMZWFkZXJBZnRlclNwbGl0KHBQcm9jZXNzb3IsIHBQZW5kaW5nTGF5b3V0SXRlbSk7CisgICAgICBpZiAocFByb2Nlc3Nvci0+bV9iQnJlYWtQZW5kaW5nKQorICAgICAgICBmVG90YWxIZWlnaHQgKz0gcFBlbmRpbmdMYXlvdXRJdGVtLT5tX3NTaXplLmhlaWdodDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZUb3RhbEhlaWdodDsKK30KKworWEZBX0F0dHJpYnV0ZUVudW0gR2V0TGF5b3V0KENYRkFfTm9kZSogcEZvcm1Ob2RlLCBib29sKiBiUm9vdEZvcmNlVGIpIHsKKyAgKmJSb290Rm9yY2VUYiA9IGZhbHNlOworICBPcHRpb25hbDxYRkFfQXR0cmlidXRlRW51bT4gbGF5b3V0TW9kZSA9CisgICAgICBwRm9ybU5vZGUtPkpTT2JqZWN0KCktPlRyeUVudW0oWEZBX0F0dHJpYnV0ZTo6TGF5b3V0LCBmYWxzZSk7CisgIGlmIChsYXlvdXRNb2RlKQorICAgIHJldHVybiAqbGF5b3V0TW9kZTsKKworICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gcEZvcm1Ob2RlLT5HZXRQYXJlbnQoKTsKKyAgaWYgKHBQYXJlbnROb2RlICYmIHBQYXJlbnROb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpGb3JtKSB7CisgICAgKmJSb290Rm9yY2VUYiA9IHRydWU7CisgICAgcmV0dXJuIFhGQV9BdHRyaWJ1dGVFbnVtOjpUYjsKKyAgfQorICByZXR1cm4gWEZBX0F0dHJpYnV0ZUVudW06OlBvc2l0aW9uOworfQorCitib29sIEV4aXN0Q29udGFpbmVyS2VlcChDWEZBX05vZGUqIHBDdXJOb2RlLCBib29sIGJQcmVGaW5kKSB7CisgIGlmICghcEN1ck5vZGUgfHwgIVhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UocEN1ck5vZGUpKQorICAgIHJldHVybiBmYWxzZTsKKworICBDWEZBX05vZGUqIHBQcmVDb250YWluZXIgPSBiUHJlRmluZCA/IHBDdXJOb2RlLT5HZXRQcmV2Q29udGFpbmVyU2libGluZygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcEN1ck5vZGUtPkdldE5leHRDb250YWluZXJTaWJsaW5nKCk7CisgIGlmICghcFByZUNvbnRhaW5lcikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQ1hGQV9LZWVwKiBwS2VlcCA9CisgICAgICBwQ3VyTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9LZWVwPihYRkFfRWxlbWVudDo6S2VlcCk7CisgIGlmIChwS2VlcCkgeworICAgIFhGQV9BdHRyaWJ1dGUgZUtlZXBUeXBlID0gWEZBX0F0dHJpYnV0ZTo6UHJldmlvdXM7CisgICAgaWYgKCFiUHJlRmluZCkKKyAgICAgIGVLZWVwVHlwZSA9IFhGQV9BdHRyaWJ1dGU6Ok5leHQ7CisKKyAgICBPcHRpb25hbDxYRkFfQXR0cmlidXRlRW51bT4gcHJldmlvdXMgPQorICAgICAgICBwS2VlcC0+SlNPYmplY3QoKS0+VHJ5RW51bShlS2VlcFR5cGUsIGZhbHNlKTsKKyAgICBpZiAocHJldmlvdXMpIHsKKyAgICAgIGlmICgqcHJldmlvdXMgPT0gWEZBX0F0dHJpYnV0ZUVudW06OkNvbnRlbnRBcmVhIHx8CisgICAgICAgICAgKnByZXZpb3VzID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpQYWdlQXJlYSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBwS2VlcCA9IHBQcmVDb250YWluZXItPkdldEZpcnN0Q2hpbGRCeUNsYXNzPENYRkFfS2VlcD4oWEZBX0VsZW1lbnQ6OktlZXApOworICBpZiAoIXBLZWVwKQorICAgIHJldHVybiBmYWxzZTsKKworICBYRkFfQXR0cmlidXRlIGVLZWVwVHlwZSA9IFhGQV9BdHRyaWJ1dGU6Ok5leHQ7CisgIGlmICghYlByZUZpbmQpCisgICAgZUtlZXBUeXBlID0gWEZBX0F0dHJpYnV0ZTo6UHJldmlvdXM7CisKKyAgT3B0aW9uYWw8WEZBX0F0dHJpYnV0ZUVudW0+IG5leHQgPQorICAgICAgcEtlZXAtPkpTT2JqZWN0KCktPlRyeUVudW0oZUtlZXBUeXBlLCBmYWxzZSk7CisgIGlmICghbmV4dCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICgqbmV4dCA9PSBYRkFfQXR0cmlidXRlRW51bTo6Q29udGVudEFyZWEgfHwKKyAgICAgICpuZXh0ID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpQYWdlQXJlYSkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBGaW5kQnJlYWtOb2RlKENYRkFfTm9kZSogcENvbnRhaW5lck5vZGUsCisgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiYgcEN1ckFjdGlvbk5vZGUsCisgICAgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXMqIG5DdXJTdGFnZSwKKyAgICAgICAgICAgICAgICAgICBib29sIGJCcmVha0JlZm9yZSkgeworICBib29sIGJGaW5kUnMgPSBmYWxzZTsKKyAgZm9yIChDWEZBX05vZGUqIHBCcmVha05vZGUgPSBwQ29udGFpbmVyTm9kZTsgcEJyZWFrTm9kZTsKKyAgICAgICBwQnJlYWtOb2RlID0gcEJyZWFrTm9kZS0+R2V0TmV4dFNpYmxpbmcoKSkgeworICAgIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZVR5cGUgPSBYRkFfQXR0cmlidXRlOjpCZWZvcmU7CisgICAgaWYgKCFiQnJlYWtCZWZvcmUpCisgICAgICBlQXR0cmlidXRlVHlwZSA9IFhGQV9BdHRyaWJ1dGU6OkFmdGVyOworCisgICAgc3dpdGNoIChwQnJlYWtOb2RlLT5HZXRFbGVtZW50VHlwZSgpKSB7CisgICAgICBjYXNlIFhGQV9FbGVtZW50OjpCcmVha0JlZm9yZTogeworICAgICAgICBpZiAoYkJyZWFrQmVmb3JlKSB7CisgICAgICAgICAgcEN1ckFjdGlvbk5vZGUgPSBwQnJlYWtOb2RlOworICAgICAgICAgICpuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6QnJlYWtCZWZvcmU7CisgICAgICAgICAgYkZpbmRScyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIFhGQV9FbGVtZW50OjpCcmVha0FmdGVyOiB7CisgICAgICAgIGlmICghYkJyZWFrQmVmb3JlKSB7CisgICAgICAgICAgcEN1ckFjdGlvbk5vZGUgPSBwQnJlYWtOb2RlOworICAgICAgICAgICpuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6QnJlYWtBZnRlcjsKKyAgICAgICAgICBiRmluZFJzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJyZWFrOgorICAgICAgICBpZiAocEJyZWFrTm9kZS0+SlNPYmplY3QoKS0+R2V0RW51bShlQXR0cmlidXRlVHlwZSkgIT0KKyAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpBdXRvKSB7CisgICAgICAgICAgcEN1ckFjdGlvbk5vZGUgPSBwQnJlYWtOb2RlOworICAgICAgICAgICpuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6QnJlYWtCZWZvcmU7CisgICAgICAgICAgaWYgKCFiQnJlYWtCZWZvcmUpCisgICAgICAgICAgICAqbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkJyZWFrQWZ0ZXI7CisKKyAgICAgICAgICBiRmluZFJzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoYkZpbmRScykKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBiRmluZFJzOworfQorCit2b2lkIERlbGV0ZUxheW91dEdlbmVyYXRlZE5vZGUoQ1hGQV9Ob2RlKiBwR2VuZXJhdGVOb2RlKSB7CisgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBwR2VuZXJhdGVOb2RlLT5HZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKKyAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBEb2NMYXlvdXQgPQorICAgICAgcEdlbmVyYXRlTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0RG9jTGF5b3V0KCk7CisgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBTm9kZT4gc0l0ZXJhdG9yKAorICAgICAgcEdlbmVyYXRlTm9kZSk7CisgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHNJdGVyYXRvci5HZXRDdXJyZW50KCk7IHBOb2RlOworICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgeworICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBDdXJMYXlvdXRJdGVtID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+KAorICAgICAgICAgICAgcE5vZGUtPkpTT2JqZWN0KCktPkdldExheW91dEl0ZW0oKSk7CisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcE5leHRMYXlvdXRJdGVtID0gbnVsbHB0cjsKKyAgICB3aGlsZSAocEN1ckxheW91dEl0ZW0pIHsKKyAgICAgIHBOZXh0TGF5b3V0SXRlbSA9IHBDdXJMYXlvdXRJdGVtLT5tX3BOZXh0OworICAgICAgcE5vdGlmeS0+T25MYXlvdXRJdGVtUmVtb3ZpbmcocERvY0xheW91dCwgcEN1ckxheW91dEl0ZW0pOworICAgICAgZGVsZXRlIHBDdXJMYXlvdXRJdGVtOworICAgICAgcEN1ckxheW91dEl0ZW0gPSBwTmV4dExheW91dEl0ZW07CisgICAgfQorICB9CisgIHBHZW5lcmF0ZU5vZGUtPkdldFBhcmVudCgpLT5SZW1vdmVDaGlsZChwR2VuZXJhdGVOb2RlLCB0cnVlKTsKK30KKwordWludDhfdCBIQWxpZ25FbnVtVG9JbnQoWEZBX0F0dHJpYnV0ZUVudW0gZUhBbGlnbikgeworICBzd2l0Y2ggKGVIQWxpZ24pIHsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpDZW50ZXI6CisgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpSaWdodDoKKyAgICAgIHJldHVybiAyOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkxlZnQ6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAwOworICB9Cit9CisKK1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IEluc2VydEZsb3dlZEl0ZW0oCisgICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwVGhpcywKKyAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQcm9jZXNzb3IsCisgICAgYm9vbCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwKKyAgICBib29sIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwKKyAgICBmbG9hdCBmQ29udGFpbmVySGVpZ2h0LAorICAgIFhGQV9BdHRyaWJ1dGVFbnVtIGVGbG93U3RyYXRlZ3ksCisgICAgdWludDhfdCogdUN1ckhBbGlnblN0YXRlLAorICAgIHN0ZDo6dmVjdG9yPENYRkFfQ29udGVudExheW91dEl0ZW0qPiAoJnJnQ3VyTGluZUxheW91dEl0ZW1zKVszXSwKKyAgICBib29sIGJVc2VCcmVha0NvbnRyb2wsCisgICAgZmxvYXQgZkF2YWlsSGVpZ2h0LAorICAgIGZsb2F0IGZSZWFsSGVpZ2h0LAorICAgIGZsb2F0IGZDb250ZW50V2lkdGhMaW1pdCwKKyAgICBmbG9hdCogZkNvbnRlbnRDdXJSb3dZLAorICAgIGZsb2F0KiBmQ29udGVudEN1clJvd0F2YWlsV2lkdGgsCisgICAgZmxvYXQqIGZDb250ZW50Q3VyUm93SGVpZ2h0LAorICAgIGJvb2wqIGJBZGRlZEl0ZW1JblJvdywKKyAgICBib29sKiBiRm9yY2VFbmRQYWdlLAorICAgIENYRkFfTGF5b3V0Q29udGV4dCogcExheW91dENvbnRleHQsCisgICAgYm9vbCBiTmV3Um93KSB7CisgIGJvb2wgYlRha2VTcGFjZSA9CisgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlKTsKKyAgdWludDhfdCB1SEFsaWduID0gSEFsaWduRW51bVRvSW50KAorICAgICAgcFRoaXMtPm1fcEN1ckNoaWxkTm9kZS0+SlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpIQWxpZ24pKTsKKyAgaWYgKGJDb250YWluZXJXaWR0aEF1dG9TaXplKQorICAgIHVIQWxpZ24gPSAwOworCisgIGlmICgoZUZsb3dTdHJhdGVneSAhPSBYRkFfQXR0cmlidXRlRW51bTo6UmxfdGIgJiYKKyAgICAgICB1SEFsaWduIDwgKnVDdXJIQWxpZ25TdGF0ZSkgfHwKKyAgICAgIChlRmxvd1N0cmF0ZWd5ID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpSbF90YiAmJgorICAgICAgIHVIQWxpZ24gPiAqdUN1ckhBbGlnblN0YXRlKSkgeworICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6Um93RnVsbEJyZWFrOworICB9CisKKyAgKnVDdXJIQWxpZ25TdGF0ZSA9IHVIQWxpZ247CisgIGJvb2wgYklzT3duU3BsaXQgPQorICAgICAgcFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUtPkdldEludGFjdCgpID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpOb25lOworICBib29sIGJVc2VSZWFsSGVpZ2h0ID0gYlRha2VTcGFjZSAmJiBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgJiYgYklzT3duU3BsaXQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLT5HZXRQYXJlbnQoKS0+R2V0SW50YWN0KCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlRW51bTo6Tm9uZTsKKyAgYm9vbCBiSXNUcmFuc0hlaWdodCA9IGJUYWtlU3BhY2U7CisgIGlmIChiSXNUcmFuc0hlaWdodCAmJiAhYklzT3duU3BsaXQpIHsKKyAgICBib29sIGJSb290Rm9yY2VUYiA9IGZhbHNlOworICAgIFhGQV9BdHRyaWJ1dGVFbnVtIGVMYXlvdXRTdHJhdGVneSA9CisgICAgICAgIEdldExheW91dChwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZSwgJmJSb290Rm9yY2VUYik7CisgICAgaWYgKGVMYXlvdXRTdHJhdGVneSA9PSBYRkFfQXR0cmlidXRlRW51bTo6THJfdGIgfHwKKyAgICAgICAgZUxheW91dFN0cmF0ZWd5ID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpSbF90YikgeworICAgICAgYklzVHJhbnNIZWlnaHQgPSBmYWxzZTsKKyAgICB9CisgIH0KKworICBib29sIGJVc2VJbmhlcml0ZWQgPSBmYWxzZTsKKyAgQ1hGQV9MYXlvdXRDb250ZXh0IGxheW91dENvbnRleHQ7CisgIGlmIChwVGhpcy0+bV9wUGFnZU1ncikgeworICAgIENYRkFfTm9kZSogcE92ZXJmbG93Tm9kZSA9CisgICAgICAgIHBUaGlzLT5tX3BQYWdlTWdyLT5RdWVyeU92ZXJmbG93KHBUaGlzLT5tX3BGb3JtTm9kZSk7CisgICAgaWYgKHBPdmVyZmxvd05vZGUpIHsKKyAgICAgIGxheW91dENvbnRleHQubV9wT3ZlcmZsb3dOb2RlID0gcE92ZXJmbG93Tm9kZTsKKyAgICAgIGxheW91dENvbnRleHQubV9wT3ZlcmZsb3dQcm9jZXNzb3IgPSBwVGhpczsKKyAgICAgIHBMYXlvdXRDb250ZXh0ID0gJmxheW91dENvbnRleHQ7CisgICAgfQorICB9CisKKyAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQgZVJldFZhbHVlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OkRvbmU7CisgIGlmICghYk5ld1JvdyB8fAorICAgICAgcFByb2Nlc3Nvci0+bV9lUHJlUHJvY2Vzc1JzID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpEb25lKSB7CisgICAgZVJldFZhbHVlID0gcFByb2Nlc3Nvci0+RG9MYXlvdXQoCisgICAgICAgIGJUYWtlU3BhY2UgPyBiVXNlQnJlYWtDb250cm9sIDogZmFsc2UsCisgICAgICAgIGJVc2VSZWFsSGVpZ2h0ID8gZlJlYWxIZWlnaHQgLSAqZkNvbnRlbnRDdXJSb3dZIDogRkxUX01BWCwKKyAgICAgICAgYklzVHJhbnNIZWlnaHQgPyBmUmVhbEhlaWdodCAtICpmQ29udGVudEN1clJvd1kgOiBGTFRfTUFYLAorICAgICAgICBwTGF5b3V0Q29udGV4dCk7CisgICAgcFByb2Nlc3Nvci0+bV9lUHJlUHJvY2Vzc1JzID0gZVJldFZhbHVlOworICB9IGVsc2UgeworICAgIGVSZXRWYWx1ZSA9IHBQcm9jZXNzb3ItPm1fZVByZVByb2Nlc3NSczsKKyAgICBwUHJvY2Vzc29yLT5tX2VQcmVQcm9jZXNzUnMgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6RG9uZTsKKyAgfQorICBpZiAocFByb2Nlc3Nvci0+SGFzTGF5b3V0SXRlbSgpID09IGZhbHNlKQorICAgIHJldHVybiBlUmV0VmFsdWU7CisKKyAgQ0ZYX1NpemVGIGNoaWxkU2l6ZSA9IHBQcm9jZXNzb3ItPkdldEN1cnJlbnRDb21wb25lbnRTaXplKCk7CisgIGlmIChiVXNlUmVhbEhlaWdodCAmJiBmUmVhbEhlaWdodCA8IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7CisgICAgZlJlYWxIZWlnaHQgPSBGTFRfTUFYOworICAgIGZBdmFpbEhlaWdodCA9IEZMVF9NQVg7CisgIH0KKyAgaWYgKGJUYWtlU3BhY2UgJiYgKGNoaWxkU2l6ZS53aWR0aCA+CisgICAgICAgICAgICAgICAgICAgICAqZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pICYmCisgICAgICAoZkNvbnRlbnRXaWR0aExpbWl0IC0gKmZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCA+CisgICAgICAgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pKSB7CisgICAgcmV0dXJuIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpSb3dGdWxsQnJlYWs7CisgIH0KKworICBDWEZBX05vZGUqIHBPdmVyZmxvd0xlYWRlck5vZGUgPSBudWxscHRyOworICBDWEZBX05vZGUqIHBPdmVyZmxvd1RyYWlsZXJOb2RlID0gbnVsbHB0cjsKKyAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUgPSBudWxscHRyOworICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwVHJhaWxlckxheW91dEl0ZW0gPSBudWxscHRyOworICBib29sIGJJc0FkZFRyYWlsZXJIZWlnaHQgPSBmYWxzZTsKKyAgaWYgKHBUaGlzLT5tX3BQYWdlTWdyICYmCisgICAgICBwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZS0+R2V0SW50YWN0KCkgPT0gWEZBX0F0dHJpYnV0ZUVudW06Ok5vbmUpIHsKKyAgICBwRm9ybU5vZGUgPSBwVGhpcy0+bV9wUGFnZU1nci0+UXVlcnlPdmVyZmxvdyhwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZSk7CisgICAgaWYgKCFwRm9ybU5vZGUgJiYgcExheW91dENvbnRleHQgJiYgcExheW91dENvbnRleHQtPm1fcE92ZXJmbG93UHJvY2Vzc29yKSB7CisgICAgICBwRm9ybU5vZGUgPSBwTGF5b3V0Q29udGV4dC0+bV9wT3ZlcmZsb3dOb2RlOworICAgICAgYlVzZUluaGVyaXRlZCA9IHRydWU7CisgICAgfQorICAgIGlmIChwVGhpcy0+bV9wUGFnZU1nci0+UHJvY2Vzc092ZXJmbG93KHBGb3JtTm9kZSwgcE92ZXJmbG93TGVhZGVyTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3ZlcmZsb3dUcmFpbGVyTm9kZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7CisgICAgICBpZiAocFByb2Nlc3Nvci0+SnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwT3ZlcmZsb3dUcmFpbGVyTm9kZSkpIHsKKyAgICAgICAgaWYgKHBPdmVyZmxvd1RyYWlsZXJOb2RlKSB7CisgICAgICAgICAgYXV0byBwT3ZlcmZsb3dMZWFkZXJQcm9jZXNzb3IgPQorICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yPihwT3ZlcmZsb3dUcmFpbGVyTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgICAgICAgcE92ZXJmbG93TGVhZGVyUHJvY2Vzc29yLT5Eb0xheW91dChmYWxzZSwgRkxUX01BWCwgRkxUX01BWCwgbnVsbHB0cik7CisgICAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtID0KKyAgICAgICAgICAgICAgcE92ZXJmbG93TGVhZGVyUHJvY2Vzc29yLT5IYXNMYXlvdXRJdGVtKCkKKyAgICAgICAgICAgICAgICAgID8gcE92ZXJmbG93TGVhZGVyUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpCisgICAgICAgICAgICAgICAgICA6IG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICBiSXNBZGRUcmFpbGVySGVpZ2h0ID0KKyAgICAgICAgICAgIGJVc2VJbmhlcml0ZWQKKyAgICAgICAgICAgICAgICA/IHBUaGlzLT5Jc0FkZE5ld1Jvd0ZvclRyYWlsZXIocFRyYWlsZXJMYXlvdXRJdGVtKQorICAgICAgICAgICAgICAgIDogcFByb2Nlc3Nvci0+SXNBZGROZXdSb3dGb3JUcmFpbGVyKHBUcmFpbGVyTGF5b3V0SXRlbSk7CisgICAgICAgIGlmIChiSXNBZGRUcmFpbGVySGVpZ2h0KSB7CisgICAgICAgICAgY2hpbGRTaXplLmhlaWdodCArPSBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1NpemUuaGVpZ2h0OworICAgICAgICAgIGJJc0FkZFRyYWlsZXJIZWlnaHQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKCFiVGFrZVNwYWNlIHx8CisgICAgICAqZkNvbnRlbnRDdXJSb3dZICsgY2hpbGRTaXplLmhlaWdodCA8PQorICAgICAgICAgIGZBdmFpbEhlaWdodCArIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OIHx8CisgICAgICAoIWJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSAmJgorICAgICAgIHBUaGlzLT5tX2ZVc2VkU2l6ZSArIGZBdmFpbEhlaWdodCArIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OID49CisgICAgICAgICAgIGZDb250YWluZXJIZWlnaHQpKSB7CisgICAgaWYgKCFiVGFrZVNwYWNlIHx8IGVSZXRWYWx1ZSA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6RG9uZSkgeworICAgICAgaWYgKHBQcm9jZXNzb3ItPm1fYlVzZUluaGVyaWF0ZWQpIHsKKyAgICAgICAgaWYgKHBUcmFpbGVyTGF5b3V0SXRlbSkKKyAgICAgICAgICBBZGRUcmFpbGVyQmVmb3JlU3BsaXQocFByb2Nlc3NvciwgY2hpbGRTaXplLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLCBmYWxzZSk7CisgICAgICAgIGlmIChwUHJvY2Vzc29yLT5KdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKHBPdmVyZmxvd0xlYWRlck5vZGUpKQorICAgICAgICAgIEFkZFBlbmRpbmdOb2RlKHBQcm9jZXNzb3IsIHBPdmVyZmxvd0xlYWRlck5vZGUsIGZhbHNlKTsKKworICAgICAgICBwUHJvY2Vzc29yLT5tX2JVc2VJbmhlcmlhdGVkID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoYklzQWRkVHJhaWxlckhlaWdodCkKKyAgICAgICAgICBjaGlsZFNpemUuaGVpZ2h0IC09IHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS5oZWlnaHQ7CisKKyAgICAgICAgcFByb2Nlc3Nvci0+UHJvY2Vzc1VuVXNlT3ZlckZsb3cocE92ZXJmbG93TGVhZGVyTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93VHJhaWxlck5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbSwgcEZvcm1Ob2RlKTsKKyAgICAgIH0KKworICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcENoaWxkTGF5b3V0SXRlbSA9CisgICAgICAgICAgcFByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKTsKKyAgICAgIGlmIChFeGlzdENvbnRhaW5lcktlZXAocFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUsIGZhbHNlKSAmJgorICAgICAgICAgIHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLT5HZXRJbnRhY3QoKSA9PSBYRkFfQXR0cmlidXRlRW51bTo6Tm9uZSkgeworICAgICAgICBwVGhpcy0+bV9hcnJheUtlZXBJdGVtcy5wdXNoX2JhY2socENoaWxkTGF5b3V0SXRlbSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwVGhpcy0+bV9hcnJheUtlZXBJdGVtcy5jbGVhcigpOworICAgICAgfQorICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbdUhBbGlnbl0ucHVzaF9iYWNrKHBDaGlsZExheW91dEl0ZW0pOworICAgICAgKmJBZGRlZEl0ZW1JblJvdyA9IHRydWU7CisgICAgICBpZiAoYlRha2VTcGFjZSkgeworICAgICAgICAqZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoIC09IGNoaWxkU2l6ZS53aWR0aDsKKyAgICAgICAgKmZDb250ZW50Q3VyUm93SGVpZ2h0ID0KKyAgICAgICAgICAgIHN0ZDo6bWF4KCpmQ29udGVudEN1clJvd0hlaWdodCwgY2hpbGRTaXplLmhlaWdodCk7CisgICAgICB9CisgICAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OkRvbmU7CisgICAgfQorCisgICAgaWYgKGVSZXRWYWx1ZSA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6UGFnZUZ1bGxCcmVhaykgeworICAgICAgaWYgKHBQcm9jZXNzb3ItPm1fYlVzZUluaGVyaWF0ZWQpIHsKKyAgICAgICAgaWYgKHBUcmFpbGVyTGF5b3V0SXRlbSkgeworICAgICAgICAgIEFkZFRyYWlsZXJCZWZvcmVTcGxpdChwUHJvY2Vzc29yLCBjaGlsZFNpemUuaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhaWxlckxheW91dEl0ZW0sIGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocFByb2Nlc3Nvci0+SnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwT3ZlcmZsb3dMZWFkZXJOb2RlKSkKKyAgICAgICAgICBBZGRQZW5kaW5nTm9kZShwUHJvY2Vzc29yLCBwT3ZlcmZsb3dMZWFkZXJOb2RlLCBmYWxzZSk7CisKKyAgICAgICAgcFByb2Nlc3Nvci0+bV9iVXNlSW5oZXJpYXRlZCA9IGZhbHNlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGJJc0FkZFRyYWlsZXJIZWlnaHQpCisgICAgICAgICAgY2hpbGRTaXplLmhlaWdodCAtPSBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1NpemUuaGVpZ2h0OworCisgICAgICAgIHBQcm9jZXNzb3ItPlByb2Nlc3NVblVzZU92ZXJGbG93KHBPdmVyZmxvd0xlYWRlck5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdmVyZmxvd1RyYWlsZXJOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhaWxlckxheW91dEl0ZW0sIHBGb3JtTm9kZSk7CisgICAgICB9CisgICAgfQorICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zW3VIQWxpZ25dLnB1c2hfYmFjayhwUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpKTsKKyAgICAqYkFkZGVkSXRlbUluUm93ID0gdHJ1ZTsKKyAgICAqZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoIC09IGNoaWxkU2l6ZS53aWR0aDsKKyAgICAqZkNvbnRlbnRDdXJSb3dIZWlnaHQgPSBzdGQ6Om1heCgqZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGNoaWxkU2l6ZS5oZWlnaHQpOworICAgIHJldHVybiBlUmV0VmFsdWU7CisgIH0KKworICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBlUmVzdWx0OworICBpZiAocFRoaXMtPlByb2Nlc3NLZWVwRm9yU3BsaXQoCisgICAgICAgICAgcFRoaXMsIHBQcm9jZXNzb3IsIGVSZXRWYWx1ZSwgJnJnQ3VyTGluZUxheW91dEl0ZW1zW3VIQWxpZ25dLAorICAgICAgICAgIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCwgZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGZDb250ZW50Q3VyUm93WSwKKyAgICAgICAgICBiQWRkZWRJdGVtSW5Sb3csIGJGb3JjZUVuZFBhZ2UsICZlUmVzdWx0KSkgeworICAgIHJldHVybiBlUmVzdWx0OworICB9CisKKyAgKmJGb3JjZUVuZFBhZ2UgPSB0cnVlOworICBmbG9hdCBmU3BsaXRQb3MgPSBwUHJvY2Vzc29yLT5GaW5kU3BsaXRQb3MoZkF2YWlsSGVpZ2h0IC0gKmZDb250ZW50Q3VyUm93WSk7CisgIGlmIChmU3BsaXRQb3MgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgeworICAgIFhGQV9BdHRyaWJ1dGVFbnVtIGVMYXlvdXQgPQorICAgICAgICBwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZS0+SlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpMYXlvdXQpOworICAgIGlmIChlTGF5b3V0ID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpUYiAmJgorICAgICAgICBlUmV0VmFsdWUgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OkRvbmUpIHsKKyAgICAgIHBQcm9jZXNzb3ItPlByb2Nlc3NVblVzZU92ZXJGbG93KHBPdmVyZmxvd0xlYWRlck5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3ZlcmZsb3dUcmFpbGVyTm9kZSwgcFRyYWlsZXJMYXlvdXRJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1Ob2RlKTsKKyAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zW3VIQWxpZ25dLnB1c2hfYmFjayhwUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpKTsKKyAgICAgICpiQWRkZWRJdGVtSW5Sb3cgPSB0cnVlOworICAgICAgaWYgKGJUYWtlU3BhY2UpIHsKKyAgICAgICAgKmZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCAtPSBjaGlsZFNpemUud2lkdGg7CisgICAgICAgICpmQ29udGVudEN1clJvd0hlaWdodCA9CisgICAgICAgICAgICBzdGQ6Om1heCgqZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGNoaWxkU2l6ZS5oZWlnaHQpOworICAgICAgfQorICAgICAgcmV0dXJuIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpQYWdlRnVsbEJyZWFrOworICAgIH0KKworICAgIENYRkFfTm9kZSogcFRlbXBMZWFkZXJOb2RlID0gbnVsbHB0cjsKKyAgICBDWEZBX05vZGUqIHBUZW1wVHJhaWxlck5vZGUgPSBudWxscHRyOworICAgIGlmIChwVGhpcy0+bV9wUGFnZU1nciAmJiAhcFByb2Nlc3Nvci0+bV9iVXNlSW5oZXJpYXRlZCAmJgorICAgICAgICBlUmV0VmFsdWUgIT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OlBhZ2VGdWxsQnJlYWspIHsKKyAgICAgIHBUaGlzLT5tX3BQYWdlTWdyLT5Qcm9jZXNzT3ZlcmZsb3cocEZvcm1Ob2RlLCBwVGVtcExlYWRlck5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wVHJhaWxlck5vZGUsIGZhbHNlLCB0cnVlKTsKKyAgICB9CisgICAgaWYgKHBUcmFpbGVyTGF5b3V0SXRlbSAmJiBiSXNBZGRUcmFpbGVySGVpZ2h0KSB7CisgICAgICBBZGRUcmFpbGVyQmVmb3JlU3BsaXQocFByb2Nlc3NvciwgZlNwbGl0UG9zLCBwVHJhaWxlckxheW91dEl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlVzZUluaGVyaXRlZCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHBQcm9jZXNzb3ItPlNwbGl0TGF5b3V0SXRlbShmU3BsaXRQb3MpOworICAgIH0KKworICAgIGlmIChiVXNlSW5oZXJpdGVkKSB7CisgICAgICBwUHJvY2Vzc29yLT5Qcm9jZXNzVW5Vc2VPdmVyRmxvdyhwT3ZlcmZsb3dMZWFkZXJOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93VHJhaWxlck5vZGUsIHBUcmFpbGVyTGF5b3V0SXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtTm9kZSk7CisgICAgICBwVGhpcy0+bV9iVXNlSW5oZXJpYXRlZCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIENYRkFfTGF5b3V0SXRlbSogZmlyc3RDaGlsZCA9IHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7CisgICAgICBpZiAoZmlyc3RDaGlsZCAmJiAhZmlyc3RDaGlsZC0+bV9wTmV4dFNpYmxpbmcgJiYKKyAgICAgICAgICBmaXJzdENoaWxkLT5tX3BGb3JtTm9kZS0+SXNMYXlvdXRHZW5lcmF0ZWROb2RlKCkpIHsKKyAgICAgICAgcFByb2Nlc3Nvci0+UHJvY2Vzc1VuVXNlT3ZlckZsb3cocE92ZXJmbG93TGVhZGVyTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93VHJhaWxlck5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbSwgcEZvcm1Ob2RlKTsKKyAgICAgIH0gZWxzZSBpZiAocFByb2Nlc3Nvci0+SnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cigKKyAgICAgICAgICAgICAgICAgICAgIHBPdmVyZmxvd0xlYWRlck5vZGUpKSB7CisgICAgICAgIEFkZFBlbmRpbmdOb2RlKHBQcm9jZXNzb3IsIHBPdmVyZmxvd0xlYWRlck5vZGUsIGZhbHNlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsKKyAgICAgIGNoaWxkU2l6ZSA9IHBQcm9jZXNzb3ItPkdldEN1cnJlbnRDb21wb25lbnRTaXplKCk7CisgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1t1SEFsaWduXS5wdXNoX2JhY2socFByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKSk7CisgICAgICAqYkFkZGVkSXRlbUluUm93ID0gdHJ1ZTsKKyAgICAgIGlmIChiVGFrZVNwYWNlKSB7CisgICAgICAgICpmQ29udGVudEN1clJvd0F2YWlsV2lkdGggLT0gY2hpbGRTaXplLndpZHRoOworICAgICAgICAqZkNvbnRlbnRDdXJSb3dIZWlnaHQgPQorICAgICAgICAgICAgc3RkOjptYXgoKmZDb250ZW50Q3VyUm93SGVpZ2h0LCBjaGlsZFNpemUuaGVpZ2h0KTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpQYWdlRnVsbEJyZWFrOworICB9CisKKyAgaWYgKCpmQ29udGVudEN1clJvd1kgPD0gWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsKKyAgICBjaGlsZFNpemUgPSBwUHJvY2Vzc29yLT5HZXRDdXJyZW50Q29tcG9uZW50U2l6ZSgpOworICAgIGlmIChwUHJvY2Vzc29yLT5tX3BQYWdlTWdyLT5HZXROZXh0QXZhaWxDb250ZW50SGVpZ2h0KGNoaWxkU2l6ZS5oZWlnaHQpKSB7CisgICAgICBDWEZBX05vZGUqIHBUZW1wTGVhZGVyTm9kZSA9IG51bGxwdHI7CisgICAgICBDWEZBX05vZGUqIHBUZW1wVHJhaWxlck5vZGUgPSBudWxscHRyOworICAgICAgaWYgKHBUaGlzLT5tX3BQYWdlTWdyKSB7CisgICAgICAgIGlmICghcEZvcm1Ob2RlICYmIHBMYXlvdXRDb250ZXh0KQorICAgICAgICAgIHBGb3JtTm9kZSA9IHBMYXlvdXRDb250ZXh0LT5tX3BPdmVyZmxvd1Byb2Nlc3Nvci0+bV9wRm9ybU5vZGU7CisKKyAgICAgICAgcFRoaXMtPm1fcFBhZ2VNZ3ItPlByb2Nlc3NPdmVyZmxvdyhwRm9ybU5vZGUsIHBUZW1wTGVhZGVyTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFRyYWlsZXJOb2RlLCBmYWxzZSwgdHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoYlVzZUluaGVyaXRlZCkgeworICAgICAgICBwUHJvY2Vzc29yLT5Qcm9jZXNzVW5Vc2VPdmVyRmxvdyhwT3ZlcmZsb3dMZWFkZXJOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3ZlcmZsb3dUcmFpbGVyTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLCBwRm9ybU5vZGUpOworICAgICAgICBwVGhpcy0+bV9iVXNlSW5oZXJpYXRlZCA9IHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OlBhZ2VGdWxsQnJlYWs7CisgICAgfQorCisgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbdUhBbGlnbl0ucHVzaF9iYWNrKHBQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCkpOworICAgICpiQWRkZWRJdGVtSW5Sb3cgPSB0cnVlOworICAgIGlmIChiVGFrZVNwYWNlKSB7CisgICAgICAqZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoIC09IGNoaWxkU2l6ZS53aWR0aDsKKyAgICAgICpmQ29udGVudEN1clJvd0hlaWdodCA9IHN0ZDo6bWF4KCpmQ29udGVudEN1clJvd0hlaWdodCwgY2hpbGRTaXplLmhlaWdodCk7CisgICAgfQorICAgIGlmIChlUmV0VmFsdWUgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OkRvbmUpCisgICAgICAqYkZvcmNlRW5kUGFnZSA9IGZhbHNlOworCisgICAgcmV0dXJuIGVSZXRWYWx1ZTsKKyAgfQorCisgIFhGQV9BdHRyaWJ1dGVFbnVtIGVMYXlvdXQgPQorICAgICAgcFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUtPkpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6TGF5b3V0KTsKKyAgaWYgKHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLT5HZXRJbnRhY3QoKSA9PSBYRkFfQXR0cmlidXRlRW51bTo6Tm9uZSAmJgorICAgICAgZUxheW91dCA9PSBYRkFfQXR0cmlidXRlRW51bTo6VGIpIHsKKyAgICBpZiAocFRoaXMtPm1fcFBhZ2VNZ3IpIHsKKyAgICAgIHBUaGlzLT5tX3BQYWdlTWdyLT5Qcm9jZXNzT3ZlcmZsb3cocEZvcm1Ob2RlLCBwT3ZlcmZsb3dMZWFkZXJOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3ZlcmZsb3dUcmFpbGVyTm9kZSwgZmFsc2UsIHRydWUpOworICAgIH0KKyAgICBpZiAocFRyYWlsZXJMYXlvdXRJdGVtKQorICAgICAgQWRkVHJhaWxlckJlZm9yZVNwbGl0KHBQcm9jZXNzb3IsIGZTcGxpdFBvcywgcFRyYWlsZXJMYXlvdXRJdGVtLCBmYWxzZSk7CisgICAgaWYgKHBQcm9jZXNzb3ItPkp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIocE92ZXJmbG93TGVhZGVyTm9kZSkpCisgICAgICBBZGRQZW5kaW5nTm9kZShwUHJvY2Vzc29yLCBwT3ZlcmZsb3dMZWFkZXJOb2RlLCBmYWxzZSk7CisKKyAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OlBhZ2VGdWxsQnJlYWs7CisgIH0KKworICBpZiAoZVJldFZhbHVlICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpEb25lKQorICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6UGFnZUZ1bGxCcmVhazsKKworICBpZiAoIXBGb3JtTm9kZSAmJiBwTGF5b3V0Q29udGV4dCkKKyAgICBwRm9ybU5vZGUgPSBwTGF5b3V0Q29udGV4dC0+bV9wT3ZlcmZsb3dQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlOworICBpZiAocFRoaXMtPm1fcFBhZ2VNZ3IpIHsKKyAgICBwVGhpcy0+bV9wUGFnZU1nci0+UHJvY2Vzc092ZXJmbG93KHBGb3JtTm9kZSwgcE92ZXJmbG93TGVhZGVyTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdmVyZmxvd1RyYWlsZXJOb2RlLCBmYWxzZSwgdHJ1ZSk7CisgIH0KKyAgaWYgKGJVc2VJbmhlcml0ZWQpIHsKKyAgICBwUHJvY2Vzc29yLT5Qcm9jZXNzVW5Vc2VPdmVyRmxvdyhwT3ZlcmZsb3dMZWFkZXJOb2RlLCBwT3ZlcmZsb3dUcmFpbGVyTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhaWxlckxheW91dEl0ZW0sIHBGb3JtTm9kZSk7CisgICAgcFRoaXMtPm1fYlVzZUluaGVyaWF0ZWQgPSB0cnVlOworICB9CisgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6UGFnZUZ1bGxCcmVhazsKK30KKworYm9vbCBGaW5kTGF5b3V0SXRlbVNwbGl0UG9zKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXRJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZDdXJWZXJ0aWNhbE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZlByb3Bvc2VkU3BsaXRQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogYkFwcENoYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJDYWxjdWxhdGVNYXJnaW4pIHsKKyAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUgPSBwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGU7CisgIGlmICgqZlByb3Bvc2VkU3BsaXRQb3MgPD0gZkN1clZlcnRpY2FsT2Zmc2V0ICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04gfHwKKyAgICAgICpmUHJvcG9zZWRTcGxpdFBvcyA+IGZDdXJWZXJ0aWNhbE9mZnNldCArIHBMYXlvdXRJdGVtLT5tX3NTaXplLmhlaWdodCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzd2l0Y2ggKHBGb3JtTm9kZS0+R2V0SW50YWN0KCkpIHsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpOb25lOiB7CisgICAgICBib29sIGJBbnlDaGFuZ2VkID0gZmFsc2U7CisgICAgICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwRm9ybU5vZGUtPkdldERvY3VtZW50KCk7CisgICAgICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gcERvY3VtZW50LT5HZXROb3RpZnkoKTsKKyAgICAgIGZsb2F0IGZDdXJUb3BNYXJnaW4gPSAwLCBmQ3VyQm90dG9tTWFyZ2luID0gMDsKKyAgICAgIENYRkFfTWFyZ2luKiBwTWFyZ2luTm9kZSA9CisgICAgICAgICAgcEZvcm1Ob2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX01hcmdpbj4oWEZBX0VsZW1lbnQ6Ok1hcmdpbik7CisgICAgICBpZiAocE1hcmdpbk5vZGUgJiYgYkNhbGN1bGF0ZU1hcmdpbikgeworICAgICAgICBmQ3VyVG9wTWFyZ2luID0gcE1hcmdpbk5vZGUtPkpTT2JqZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6VG9wSW5zZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvVW5pdChYRkFfVW5pdDo6UHQpOworICAgICAgICBmQ3VyQm90dG9tTWFyZ2luID0gcE1hcmdpbk5vZGUtPkpTT2JqZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6Qm90dG9tSW5zZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvVW5pdChYRkFfVW5pdDo6UHQpOworICAgICAgfQorICAgICAgYm9vbCBiQ2hhbmdlZCA9IHRydWU7CisgICAgICB3aGlsZSAoYkNoYW5nZWQpIHsKKyAgICAgICAgYkNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgeworICAgICAgICAgIGZsb2F0IGZSZWxTcGxpdFBvcyA9ICpmUHJvcG9zZWRTcGxpdFBvcyAtIGZDdXJWZXJ0aWNhbE9mZnNldDsKKyAgICAgICAgICBpZiAocE5vdGlmeS0+RmluZFNwbGl0UG9zKHBGb3JtTm9kZSwgcExheW91dEl0ZW0tPkdldEluZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUmVsU3BsaXRQb3MpKSB7CisgICAgICAgICAgICBiQW55Q2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICBiQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAqZlByb3Bvc2VkU3BsaXRQb3MgPSBmQ3VyVmVydGljYWxPZmZzZXQgKyBmUmVsU3BsaXRQb3M7CisgICAgICAgICAgICAqYkFwcENoYW5nZSA9IHRydWU7CisgICAgICAgICAgICBpZiAoKmZQcm9wb3NlZFNwbGl0UG9zIDw9CisgICAgICAgICAgICAgICAgZkN1clZlcnRpY2FsT2Zmc2V0ICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsKKyAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZsb2F0IGZSZWxTcGxpdFBvcyA9ICpmUHJvcG9zZWRTcGxpdFBvcyAtIGZDdXJCb3R0b21NYXJnaW47CisgICAgICAgIGZvciAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcENoaWxkSXRlbSA9CisgICAgICAgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsKKyAgICAgICAgICAgICBwQ2hpbGRJdGVtOworICAgICAgICAgICAgIHBDaGlsZEl0ZW0gPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsKKyAgICAgICAgICBmbG9hdCBmQ2hpbGRPZmZzZXQgPQorICAgICAgICAgICAgICBmQ3VyVmVydGljYWxPZmZzZXQgKyBmQ3VyVG9wTWFyZ2luICsgcENoaWxkSXRlbS0+bV9zUG9zLnk7CisgICAgICAgICAgYm9vbCBiQ2hhbmdlID0gZmFsc2U7CisgICAgICAgICAgaWYgKEZpbmRMYXlvdXRJdGVtU3BsaXRQb3MocENoaWxkSXRlbSwgZkNoaWxkT2Zmc2V0LCAmZlJlbFNwbGl0UG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiQ2hhbmdlLCBiQ2FsY3VsYXRlTWFyZ2luKSkgeworICAgICAgICAgICAgaWYgKGZSZWxTcGxpdFBvcyAtIGZDaGlsZE9mZnNldCA8IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OICYmCisgICAgICAgICAgICAgICAgYkNoYW5nZSkgeworICAgICAgICAgICAgICAqZlByb3Bvc2VkU3BsaXRQb3MgPSBmUmVsU3BsaXRQb3MgLSBmQ3VyVG9wTWFyZ2luOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgKmZQcm9wb3NlZFNwbGl0UG9zID0gZlJlbFNwbGl0UG9zICsgZkN1ckJvdHRvbU1hcmdpbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJBbnlDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmICgqZlByb3Bvc2VkU3BsaXRQb3MgPD0KKyAgICAgICAgICAgICAgICBmQ3VyVmVydGljYWxPZmZzZXQgKyBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgeworICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChiQW55Q2hhbmdlZCkKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gYkFueUNoYW5nZWQ7CisgICAgfQorICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkNvbnRlbnRBcmVhOgorICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OlBhZ2VBcmVhOiB7CisgICAgICAqZlByb3Bvc2VkU3BsaXRQb3MgPSBmQ3VyVmVydGljYWxPZmZzZXQ7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitDRlhfUG9pbnRGIENhbGN1bGF0ZVBvc2l0aW9uZWRDb250YWluZXJQb3MoQ1hGQV9Ob2RlKiBwTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfU2l6ZUYmIHNpemUpIHsKKyAgWEZBX0F0dHJpYnV0ZUVudW0gZUFuY2hvclR5cGUgPQorICAgICAgcE5vZGUtPkpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6QW5jaG9yVHlwZSk7CisgIGludDMyX3QgbkFuY2hvclR5cGUgPSAwOworICBzd2l0Y2ggKGVBbmNob3JUeXBlKSB7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6VG9wTGVmdDoKKyAgICAgIG5BbmNob3JUeXBlID0gMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OlRvcENlbnRlcjoKKyAgICAgIG5BbmNob3JUeXBlID0gMTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OlRvcFJpZ2h0OgorICAgICAgbkFuY2hvclR5cGUgPSAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6TWlkZGxlTGVmdDoKKyAgICAgIG5BbmNob3JUeXBlID0gMzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06Ok1pZGRsZUNlbnRlcjoKKyAgICAgIG5BbmNob3JUeXBlID0gNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06Ok1pZGRsZVJpZ2h0OgorICAgICAgbkFuY2hvclR5cGUgPSA1OworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6Qm90dG9tTGVmdDoKKyAgICAgIG5BbmNob3JUeXBlID0gNjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkJvdHRvbUNlbnRlcjoKKyAgICAgIG5BbmNob3JUeXBlID0gNzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkJvdHRvbVJpZ2h0OgorICAgICAgbkFuY2hvclR5cGUgPSA4OworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHN0YXRpYyBjb25zdCB1aW50OF90IG5OZXh0UG9zWzRdWzldID0ge3swLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezYsIDMsIDAsIDcsIDQsIDEsIDgsIDUsIDJ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7OCwgNywgNiwgNSwgNCwgMywgMiwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyLCA1LCA4LCAxLCA0LCA3LCAwLCAzLCA2fX07CisKKyAgQ0ZYX1BvaW50RiBwb3MoCisgICAgICBwTm9kZS0+SlNPYmplY3QoKS0+R2V0TWVhc3VyZShYRkFfQXR0cmlidXRlOjpYKS5Ub1VuaXQoWEZBX1VuaXQ6OlB0KSwKKyAgICAgIHBOb2RlLT5KU09iamVjdCgpLT5HZXRNZWFzdXJlKFhGQV9BdHRyaWJ1dGU6OlkpLlRvVW5pdChYRkFfVW5pdDo6UHQpKTsKKyAgaW50MzJfdCBuUm90YXRlID0KKyAgICAgIFhGQV9NYXBSb3RhdGlvbihwTm9kZS0+SlNPYmplY3QoKS0+R2V0SW50ZWdlcihYRkFfQXR0cmlidXRlOjpSb3RhdGUpKSAvCisgICAgICA5MDsKKyAgaW50MzJfdCBuQWJzb2x1dGVBbmNob3JUeXBlID0gbk5leHRQb3NbblJvdGF0ZV1bbkFuY2hvclR5cGVdOworICBzd2l0Y2ggKG5BYnNvbHV0ZUFuY2hvclR5cGUgLyAzKSB7CisgICAgY2FzZSAxOgorICAgICAgcG9zLnkgLT0gc2l6ZS5oZWlnaHQgLyAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgcG9zLnkgLT0gc2l6ZS5oZWlnaHQ7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgc3dpdGNoIChuQWJzb2x1dGVBbmNob3JUeXBlICUgMykgeworICAgIGNhc2UgMToKKyAgICAgIHBvcy54IC09IHNpemUud2lkdGggLyAyOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgcG9zLnggLT0gc2l6ZS53aWR0aDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gcG9zOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IoQ1hGQV9Ob2RlKiBwTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTGF5b3V0UGFnZU1nciogcFBhZ2VNZ3IpCisgICAgOiBtX3BGb3JtTm9kZShwTm9kZSksCisgICAgICBtX3BMYXlvdXRJdGVtKG51bGxwdHIpLAorICAgICAgbV9wQ3VyQ2hpbGROb2RlKFhGQV9MQVlPVVRfSU5WQUxJRE5PREUpLAorICAgICAgbV9mVXNlZFNpemUoMCksCisgICAgICBtX3BQYWdlTWdyKHBQYWdlTWdyKSwKKyAgICAgIG1fYkJyZWFrUGVuZGluZyh0cnVlKSwKKyAgICAgIG1fZkxhc3RSb3dXaWR0aCgwKSwKKyAgICAgIG1fZkxhc3RSb3dZKDApLAorICAgICAgbV9iVXNlSW5oZXJpYXRlZChmYWxzZSksCisgICAgICBtX2VQcmVQcm9jZXNzUnMoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OkRvbmUpLAorICAgICAgbV9iS2VlcEJyZWFrRmluaXNoKGZhbHNlKSwKKyAgICAgIG1fYklzUHJvY2Vzc0tlZXAoZmFsc2UpLAorICAgICAgbV9wS2VlcEhlYWROb2RlKG51bGxwdHIpLAorICAgICAgbV9wS2VlcFRhaWxOb2RlKG51bGxwdHIpLAorICAgICAgbV9wT2xkTGF5b3V0SXRlbShudWxscHRyKSwKKyAgICAgIG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yKG51bGxwdHIpLAorICAgICAgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6Ok5vbmUpLAorICAgICAgbV9mV2lkdGhMaW1pdGUoMCksCisgICAgICBtX2JIYXNBdmFpbEhlaWdodCh0cnVlKSB7CisgIEFTU0VSVChtX3BGb3JtTm9kZSAmJiAobV9wRm9ybU5vZGUtPklzQ29udGFpbmVyTm9kZSgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkZvcm0pKTsKKyAgbV9wT2xkTGF5b3V0SXRlbSA9IHN0YXRpY19jYXN0PENYRkFfQ29udGVudExheW91dEl0ZW0qPigKKyAgICAgIG1fcEZvcm1Ob2RlLT5KU09iamVjdCgpLT5HZXRMYXlvdXRJdGVtKCkpOworfQorCitDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6On5DWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IoKSB7fQorCitDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkNyZWF0ZUNvbnRlbnRMYXlvdXRJdGVtKAorICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlKSB7CisgIGlmICghcEZvcm1Ob2RlKQorICAgIHJldHVybiBudWxscHRyOworCisgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gbnVsbHB0cjsKKyAgaWYgKG1fcE9sZExheW91dEl0ZW0pIHsKKyAgICBwTGF5b3V0SXRlbSA9IG1fcE9sZExheW91dEl0ZW07CisgICAgbV9wT2xkTGF5b3V0SXRlbSA9IG1fcE9sZExheW91dEl0ZW0tPm1fcE5leHQ7CisgICAgcmV0dXJuIHBMYXlvdXRJdGVtOworICB9CisgIHBMYXlvdXRJdGVtID0KKyAgICAgIHBGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCktPk9uQ3JlYXRlQ29udGVudExheW91dEl0ZW0oCisgICAgICAgICAgcEZvcm1Ob2RlKTsKKyAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFByZXZMYXlvdXRJdGVtID0KKyAgICAgIHN0YXRpY19jYXN0PENYRkFfQ29udGVudExheW91dEl0ZW0qPigKKyAgICAgICAgICBwRm9ybU5vZGUtPkpTT2JqZWN0KCktPkdldExheW91dEl0ZW0oKSk7CisgIGlmIChwUHJldkxheW91dEl0ZW0pIHsKKyAgICB3aGlsZSAocFByZXZMYXlvdXRJdGVtLT5tX3BOZXh0KQorICAgICAgcFByZXZMYXlvdXRJdGVtID0gcFByZXZMYXlvdXRJdGVtLT5tX3BOZXh0OworCisgICAgcFByZXZMYXlvdXRJdGVtLT5tX3BOZXh0ID0gcExheW91dEl0ZW07CisgICAgcExheW91dEl0ZW0tPm1fcFByZXYgPSBwUHJldkxheW91dEl0ZW07CisgIH0gZWxzZSB7CisgICAgcEZvcm1Ob2RlLT5KU09iamVjdCgpLT5TZXRMYXlvdXRJdGVtKHBMYXlvdXRJdGVtKTsKKyAgfQorICByZXR1cm4gcExheW91dEl0ZW07Cit9CisKK2Zsb2F0IENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6RmluZFNwbGl0UG9zKGZsb2F0IGZQcm9wb3NlZFNwbGl0UG9zKSB7CisgIEFTU0VSVChtX3BMYXlvdXRJdGVtKTsKKyAgWEZBX0F0dHJpYnV0ZUVudW0gZUxheW91dCA9IG1fcEZvcm1Ob2RlLT5KU09iamVjdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5UcnlFbnVtKFhGQV9BdHRyaWJ1dGU6OkxheW91dCwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfb3IoWEZBX0F0dHJpYnV0ZUVudW06OlBvc2l0aW9uKTsKKyAgYm9vbCBiQ2FsY3VsYXRlTWFyZ2luID0gZUxheW91dCAhPSBYRkFfQXR0cmlidXRlRW51bTo6UG9zaXRpb247CisgIHdoaWxlIChmUHJvcG9zZWRTcGxpdFBvcyA+IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7CisgICAgYm9vbCBiQXBwQ2hhbmdlID0gZmFsc2U7CisgICAgaWYgKCFGaW5kTGF5b3V0SXRlbVNwbGl0UG9zKG1fcExheW91dEl0ZW0sIDAsICZmUHJvcG9zZWRTcGxpdFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJBcHBDaGFuZ2UsIGJDYWxjdWxhdGVNYXJnaW4pKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZQcm9wb3NlZFNwbGl0UG9zOworfQorCit2b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6U3BsaXRMYXlvdXRJdGVtKAorICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXRJdGVtLAorICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBTZWNvbmRQYXJlbnQsCisgICAgZmxvYXQgZlNwbGl0UG9zKSB7CisgIGZsb2F0IGZDdXJUb3BNYXJnaW4gPSAwLCBmQ3VyQm90dG9tTWFyZ2luID0gMDsKKyAgWEZBX0F0dHJpYnV0ZUVudW0gZUxheW91dCA9IG1fcEZvcm1Ob2RlLT5KU09iamVjdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5UcnlFbnVtKFhGQV9BdHRyaWJ1dGU6OkxheW91dCwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfb3IoWEZBX0F0dHJpYnV0ZUVudW06OlBvc2l0aW9uKTsKKyAgYm9vbCBiQ2FsY3VsYXRlTWFyZ2luID0gdHJ1ZTsKKyAgaWYgKGVMYXlvdXQgPT0gWEZBX0F0dHJpYnV0ZUVudW06OlBvc2l0aW9uKQorICAgIGJDYWxjdWxhdGVNYXJnaW4gPSBmYWxzZTsKKworICBDWEZBX01hcmdpbiogcE1hcmdpbk5vZGUgPQorICAgICAgcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX01hcmdpbj4oCisgICAgICAgICAgWEZBX0VsZW1lbnQ6Ok1hcmdpbik7CisgIGlmIChwTWFyZ2luTm9kZSAmJiBiQ2FsY3VsYXRlTWFyZ2luKSB7CisgICAgZkN1clRvcE1hcmdpbiA9IHBNYXJnaW5Ob2RlLT5KU09iamVjdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAtPkdldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6VG9wSW5zZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAuVG9Vbml0KFhGQV9Vbml0OjpQdCk7CisgICAgZkN1ckJvdHRvbU1hcmdpbiA9IHBNYXJnaW5Ob2RlLT5KU09iamVjdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6Qm90dG9tSW5zZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9Vbml0KFhGQV9Vbml0OjpQdCk7CisgIH0KKworICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwU2Vjb25kTGF5b3V0SXRlbSA9IG51bGxwdHI7CisgIGlmIChtX3BDdXJDaGlsZFByZXByb2Nlc3NvciAmJgorICAgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3ItPm1fcEZvcm1Ob2RlID09IHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSkgeworICAgIHBTZWNvbmRMYXlvdXRJdGVtID0gbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3ItPkNyZWF0ZUNvbnRlbnRMYXlvdXRJdGVtKAorICAgICAgICBwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUpOworICB9IGVsc2UgeworICAgIHBTZWNvbmRMYXlvdXRJdGVtID0gQ3JlYXRlQ29udGVudExheW91dEl0ZW0ocExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlKTsKKyAgfQorICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zUG9zLnggPSBwTGF5b3V0SXRlbS0+bV9zUG9zLng7CisgIHBTZWNvbmRMYXlvdXRJdGVtLT5tX3NTaXplLndpZHRoID0gcExheW91dEl0ZW0tPm1fc1NpemUud2lkdGg7CisgIHBTZWNvbmRMYXlvdXRJdGVtLT5tX3NQb3MueSA9IDA7CisgIHBTZWNvbmRMYXlvdXRJdGVtLT5tX3NTaXplLmhlaWdodCA9IHBMYXlvdXRJdGVtLT5tX3NTaXplLmhlaWdodCAtIGZTcGxpdFBvczsKKyAgcExheW91dEl0ZW0tPm1fc1NpemUuaGVpZ2h0IC09IHBTZWNvbmRMYXlvdXRJdGVtLT5tX3NTaXplLmhlaWdodDsKKyAgaWYgKHBMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkKQorICAgIHBTZWNvbmRMYXlvdXRJdGVtLT5tX3NTaXplLmhlaWdodCArPSBmQ3VyVG9wTWFyZ2luOworCisgIGlmIChwU2Vjb25kUGFyZW50KSB7CisgICAgcFNlY29uZFBhcmVudC0+QWRkQ2hpbGQocFNlY29uZExheW91dEl0ZW0pOworICAgIGlmIChmQ3VyVG9wTWFyZ2luID4gMCAmJiBwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZCkgeworICAgICAgcFNlY29uZFBhcmVudC0+bV9zU2l6ZS5oZWlnaHQgKz0gZkN1clRvcE1hcmdpbjsKKyAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBQYXJlbnRJdGVtID0KKyAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcFNlY29uZFBhcmVudC0+bV9wUGFyZW50OworICAgICAgd2hpbGUgKHBQYXJlbnRJdGVtKSB7CisgICAgICAgIHBQYXJlbnRJdGVtLT5tX3NTaXplLmhlaWdodCArPSBmQ3VyVG9wTWFyZ2luOworICAgICAgICBwUGFyZW50SXRlbSA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwUGFyZW50SXRlbS0+bV9wUGFyZW50OworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9wUGFyZW50ID0gcExheW91dEl0ZW0tPm1fcFBhcmVudDsKKyAgICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcgPSBwTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmc7CisgICAgcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nID0gcFNlY29uZExheW91dEl0ZW07CisgIH0KKworICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwQ2hpbGRyZW4gPQorICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOworICBwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZCA9IG51bGxwdHI7CisKKyAgZmxvYXQgbEhlaWdodEZvcktlZXAgPSAwOworICBmbG9hdCBmQWRkTWFyZ2luSGVpZ2h0ID0gMDsKKyAgc3RkOjp2ZWN0b3I8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+IGtlZXBMYXlvdXRJdGVtczsKKyAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtICpwQ2hpbGRJdGVtID0gcENoaWxkcmVuLCAqcENoaWxkTmV4dCA9IG51bGxwdHI7CisgICAgICAgcENoaWxkSXRlbTsgcENoaWxkSXRlbSA9IHBDaGlsZE5leHQpIHsKKyAgICBwQ2hpbGROZXh0ID0gKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nOworICAgIHBDaGlsZEl0ZW0tPm1fcE5leHRTaWJsaW5nID0gbnVsbHB0cjsKKyAgICBpZiAoZlNwbGl0UG9zIDw9IGZDdXJUb3BNYXJnaW4gKyBwQ2hpbGRJdGVtLT5tX3NQb3MueSArIGZDdXJCb3R0b21NYXJnaW4gKworICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7CisgICAgICBpZiAoIUV4aXN0Q29udGFpbmVyS2VlcChwQ2hpbGRJdGVtLT5tX3BGb3JtTm9kZSwgdHJ1ZSkpIHsKKyAgICAgICAgcENoaWxkSXRlbS0+bV9zUG9zLnkgLT0gZlNwbGl0UG9zIC0gZkN1ckJvdHRvbU1hcmdpbjsKKyAgICAgICAgcENoaWxkSXRlbS0+bV9zUG9zLnkgKz0gbEhlaWdodEZvcktlZXA7CisgICAgICAgIHBDaGlsZEl0ZW0tPm1fc1Bvcy55ICs9IGZBZGRNYXJnaW5IZWlnaHQ7CisgICAgICAgIHBTZWNvbmRMYXlvdXRJdGVtLT5BZGRDaGlsZChwQ2hpbGRJdGVtKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAobEhlaWdodEZvcktlZXAgPCBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgeworICAgICAgICBmb3IgKGF1dG8qIHBQcmVJdGVtIDoga2VlcExheW91dEl0ZW1zKSB7CisgICAgICAgICAgcExheW91dEl0ZW0tPlJlbW92ZUNoaWxkKHBQcmVJdGVtKTsKKyAgICAgICAgICBwUHJlSXRlbS0+bV9zUG9zLnkgLT0gZlNwbGl0UG9zOworICAgICAgICAgIGlmIChwUHJlSXRlbS0+bV9zUG9zLnkgPCAwKQorICAgICAgICAgICAgcFByZUl0ZW0tPm1fc1Bvcy55ID0gMDsKKyAgICAgICAgICBpZiAocFByZUl0ZW0tPm1fc1Bvcy55ICsgcFByZUl0ZW0tPm1fc1NpemUuaGVpZ2h0ID4gbEhlaWdodEZvcktlZXApIHsKKyAgICAgICAgICAgIHBQcmVJdGVtLT5tX3NQb3MueSA9IGxIZWlnaHRGb3JLZWVwOworICAgICAgICAgICAgbEhlaWdodEZvcktlZXAgKz0gcFByZUl0ZW0tPm1fc1NpemUuaGVpZ2h0OworICAgICAgICAgICAgcFNlY29uZExheW91dEl0ZW0tPm1fc1NpemUuaGVpZ2h0ICs9IHBQcmVJdGVtLT5tX3NTaXplLmhlaWdodDsKKyAgICAgICAgICAgIGlmIChwU2Vjb25kUGFyZW50KQorICAgICAgICAgICAgICBwU2Vjb25kUGFyZW50LT5tX3NTaXplLmhlaWdodCArPSBwUHJlSXRlbS0+bV9zU2l6ZS5oZWlnaHQ7CisgICAgICAgICAgfQorICAgICAgICAgIHBTZWNvbmRMYXlvdXRJdGVtLT5BZGRDaGlsZChwUHJlSXRlbSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHBDaGlsZEl0ZW0tPm1fc1Bvcy55IC09IGZTcGxpdFBvczsKKyAgICAgIHBDaGlsZEl0ZW0tPm1fc1Bvcy55ICs9IGxIZWlnaHRGb3JLZWVwOworICAgICAgcENoaWxkSXRlbS0+bV9zUG9zLnkgKz0gZkFkZE1hcmdpbkhlaWdodDsKKyAgICAgIHBTZWNvbmRMYXlvdXRJdGVtLT5BZGRDaGlsZChwQ2hpbGRJdGVtKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoZlNwbGl0UG9zICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04gPj0KKyAgICAgICAgZkN1clRvcE1hcmdpbiArIGZDdXJCb3R0b21NYXJnaW4gKyBwQ2hpbGRJdGVtLT5tX3NQb3MueSArCisgICAgICAgICAgICBwQ2hpbGRJdGVtLT5tX3NTaXplLmhlaWdodCkgeworICAgICAgcExheW91dEl0ZW0tPkFkZENoaWxkKHBDaGlsZEl0ZW0pOworICAgICAgaWYgKEV4aXN0Q29udGFpbmVyS2VlcChwQ2hpbGRJdGVtLT5tX3BGb3JtTm9kZSwgZmFsc2UpKQorICAgICAgICBrZWVwTGF5b3V0SXRlbXMucHVzaF9iYWNrKHBDaGlsZEl0ZW0pOworICAgICAgZWxzZQorICAgICAgICBrZWVwTGF5b3V0SXRlbXMuY2xlYXIoKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGZsb2F0IGZPbGRIZWlnaHQgPSBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zU2l6ZS5oZWlnaHQ7CisgICAgU3BsaXRMYXlvdXRJdGVtKAorICAgICAgICBwQ2hpbGRJdGVtLCBwU2Vjb25kTGF5b3V0SXRlbSwKKyAgICAgICAgZlNwbGl0UG9zIC0gZkN1clRvcE1hcmdpbiAtIGZDdXJCb3R0b21NYXJnaW4gLSBwQ2hpbGRJdGVtLT5tX3NQb3MueSk7CisgICAgZkFkZE1hcmdpbkhlaWdodCA9IHBTZWNvbmRMYXlvdXRJdGVtLT5tX3NTaXplLmhlaWdodCAtIGZPbGRIZWlnaHQ7CisgICAgcExheW91dEl0ZW0tPkFkZENoaWxkKHBDaGlsZEl0ZW0pOworICB9Cit9CisKK3ZvaWQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpTcGxpdExheW91dEl0ZW0oZmxvYXQgZlNwbGl0UG9zKSB7CisgIEFTU0VSVChtX3BMYXlvdXRJdGVtKTsKKyAgU3BsaXRMYXlvdXRJdGVtKG1fcExheW91dEl0ZW0sIG51bGxwdHIsIGZTcGxpdFBvcyk7Cit9CisKK0NYRkFfQ29udGVudExheW91dEl0ZW0qIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6RXh0cmFjdExheW91dEl0ZW0oKSB7CisgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXRJdGVtID0gbV9wTGF5b3V0SXRlbTsKKyAgaWYgKHBMYXlvdXRJdGVtKSB7CisgICAgbV9wTGF5b3V0SXRlbSA9CisgICAgICAgIHN0YXRpY19jYXN0PENYRkFfQ29udGVudExheW91dEl0ZW0qPihwTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcpOworICAgIHBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZyA9IG51bGxwdHI7CisgIH0KKworICBpZiAobV9uQ3VyQ2hpbGROb2RlU3RhZ2UgIT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkRvbmUgfHwKKyAgICAgICFUb0NvbnRlbnRMYXlvdXRJdGVtKG1fcE9sZExheW91dEl0ZW0pKSB7CisgICAgcmV0dXJuIHBMYXlvdXRJdGVtOworICB9CisKKyAgaWYgKG1fcE9sZExheW91dEl0ZW0tPm1fcFByZXYpCisgICAgbV9wT2xkTGF5b3V0SXRlbS0+bV9wUHJldi0+bV9wTmV4dCA9IG51bGxwdHI7CisKKyAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9CisgICAgICBtX3BPbGRMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCk7CisgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwRG9jTGF5b3V0ID0KKyAgICAgIG1fcE9sZExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXREb2N1bWVudCgpLT5HZXREb2NMYXlvdXQoKTsKKyAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcE9sZExheW91dEl0ZW0gPSBtX3BPbGRMYXlvdXRJdGVtOworICB3aGlsZSAocE9sZExheW91dEl0ZW0pIHsKKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTmV4dE9sZExheW91dEl0ZW0gPSBwT2xkTGF5b3V0SXRlbS0+bV9wTmV4dDsKKyAgICBwTm90aWZ5LT5PbkxheW91dEl0ZW1SZW1vdmluZyhwRG9jTGF5b3V0LCBwT2xkTGF5b3V0SXRlbSk7CisgICAgaWYgKHBPbGRMYXlvdXRJdGVtLT5tX3BQYXJlbnQpCisgICAgICBwT2xkTGF5b3V0SXRlbS0+bV9wUGFyZW50LT5SZW1vdmVDaGlsZChwT2xkTGF5b3V0SXRlbSk7CisKKyAgICBkZWxldGUgcE9sZExheW91dEl0ZW07CisgICAgcE9sZExheW91dEl0ZW0gPSBwTmV4dE9sZExheW91dEl0ZW07CisgIH0KKyAgbV9wT2xkTGF5b3V0SXRlbSA9IG51bGxwdHI7CisgIHJldHVybiBwTGF5b3V0SXRlbTsKK30KKwordm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkdvdG9OZXh0Q29udGFpbmVyTm9kZSgKKyAgICBDWEZBX05vZGUqJiBwQ3VyQWN0aW9uTm9kZSwKKyAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlcyYgbkN1clN0YWdlLAorICAgIENYRkFfTm9kZSogcFBhcmVudENvbnRhaW5lciwKKyAgICBib29sIGJVc2VQYWdlQnJlYWspIHsKKyAgQ1hGQV9Ob2RlKiBwRW50aXJlQ29udGFpbmVyID0gcFBhcmVudENvbnRhaW5lcjsKKyAgQ1hGQV9Ob2RlKiBwQ2hpbGRDb250YWluZXIgPSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFOworICBzd2l0Y2ggKG5DdXJTdGFnZSkgeworICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkJyZWFrQmVmb3JlOgorICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkJyZWFrQWZ0ZXI6IHsKKyAgICAgIHBDaGlsZENvbnRhaW5lciA9IHBDdXJBY3Rpb25Ob2RlLT5HZXRQYXJlbnQoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzOjpLZWVwOgorICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkNvbnRhaW5lcjoKKyAgICAgIHBDaGlsZENvbnRhaW5lciA9IHBDdXJBY3Rpb25Ob2RlOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHBDaGlsZENvbnRhaW5lciA9IFhGQV9MQVlPVVRfSU5WQUxJRE5PREU7CisgICAgICBicmVhazsKKyAgfQorCisgIHN3aXRjaCAobkN1clN0YWdlKSB7CisgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6S2VlcDogeworICAgICAgQ1hGQV9Ob2RlKiBwQnJlYWtBZnRlck5vZGUgPSBwQ2hpbGRDb250YWluZXItPkdldEZpcnN0Q2hpbGQoKTsKKyAgICAgIGlmICghbV9iS2VlcEJyZWFrRmluaXNoICYmCisgICAgICAgICAgRmluZEJyZWFrTm9kZShwQnJlYWtBZnRlck5vZGUsIHBDdXJBY3Rpb25Ob2RlLCAmbkN1clN0YWdlLCBmYWxzZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgZ290byBDaGVja05leHRDaGlsZENvbnRhaW5lcjsKKyAgICB9CisgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6Tm9uZTogeworICAgICAgcEN1ckFjdGlvbk5vZGUgPSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFOworICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6Qm9va2VuZExlYWRlcjoKKyAgICAgICAgZm9yIChDWEZBX05vZGUqIHBCb29rZW5kTm9kZSA9IHBDdXJBY3Rpb25Ob2RlID09IFhGQV9MQVlPVVRfSU5WQUxJRE5PREUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHBFbnRpcmVDb250YWluZXItPkdldEZpcnN0Q2hpbGQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcEN1ckFjdGlvbk5vZGUtPkdldE5leHRTaWJsaW5nKCk7CisgICAgICAgICAgICAgcEJvb2tlbmROb2RlOyBwQm9va2VuZE5vZGUgPSBwQm9va2VuZE5vZGUtPkdldE5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgICBzd2l0Y2ggKHBCb29rZW5kTm9kZS0+R2V0RWxlbWVudFR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBYRkFfRWxlbWVudDo6Qm9va2VuZDoKKyAgICAgICAgICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJyZWFrOgorICAgICAgICAgICAgICBwQ3VyQWN0aW9uTm9kZSA9IHBCb29rZW5kTm9kZTsKKyAgICAgICAgICAgICAgbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkJvb2tlbmRMZWFkZXI7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAgIHsKKyAgICAgICAgcEN1ckFjdGlvbk5vZGUgPSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFOworICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzOjpCcmVha0JlZm9yZToKKyAgICAgICAgICBpZiAocEN1ckFjdGlvbk5vZGUgIT0gWEZBX0xBWU9VVF9JTlZBTElETk9ERSkgeworICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQnJlYWtCZWZvcmVOb2RlID0gcEN1ckFjdGlvbk5vZGUtPkdldE5leHRTaWJsaW5nKCk7CisgICAgICAgICAgICBpZiAoIW1fYktlZXBCcmVha0ZpbmlzaCAmJgorICAgICAgICAgICAgICAgIEZpbmRCcmVha05vZGUocEJyZWFrQmVmb3JlTm9kZSwgcEN1ckFjdGlvbk5vZGUsICZuQ3VyU3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSkgeworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobV9iSXNQcm9jZXNzS2VlcCkgeworICAgICAgICAgICAgICBpZiAoUHJvY2Vzc0tlZXBOb2Rlc0ZvckJyZWFrQmVmb3JlKHBDdXJBY3Rpb25Ob2RlLCBuQ3VyU3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENoaWxkQ29udGFpbmVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBnb3RvIENoZWNrTmV4dENoaWxkQ29udGFpbmVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcEN1ckFjdGlvbk5vZGUgPSBwQ2hpbGRDb250YWluZXI7CisgICAgICAgICAgICBuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6Q29udGFpbmVyOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgICBnb3RvIENoZWNrTmV4dENoaWxkQ29udGFpbmVyOworICAgICAgfQorICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkNvbnRhaW5lcjogeworICAgICAgcEN1ckFjdGlvbk5vZGUgPSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFOworICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6QnJlYWtBZnRlcjogeworICAgICAgICBpZiAocEN1ckFjdGlvbk5vZGUgPT0gWEZBX0xBWU9VVF9JTlZBTElETk9ERSkgeworICAgICAgICAgIENYRkFfTm9kZSogcEJyZWFrQWZ0ZXJOb2RlID0gcENoaWxkQ29udGFpbmVyLT5HZXRGaXJzdENoaWxkKCk7CisgICAgICAgICAgaWYgKCFtX2JLZWVwQnJlYWtGaW5pc2ggJiYKKyAgICAgICAgICAgICAgRmluZEJyZWFrTm9kZShwQnJlYWtBZnRlck5vZGUsIHBDdXJBY3Rpb25Ob2RlLCAmbkN1clN0YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBDWEZBX05vZGUqIHBCcmVha0FmdGVyTm9kZSA9IHBDdXJBY3Rpb25Ob2RlLT5HZXROZXh0U2libGluZygpOworICAgICAgICAgIGlmIChGaW5kQnJlYWtOb2RlKHBCcmVha0FmdGVyTm9kZSwgcEN1ckFjdGlvbk5vZGUsICZuQ3VyU3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGdvdG8gQ2hlY2tOZXh0Q2hpbGRDb250YWluZXI7CisgICAgICB9CisgICAgfQorCisgICAgQ2hlY2tOZXh0Q2hpbGRDb250YWluZXIgOiB7CisgICAgICBDWEZBX05vZGUqIHBOZXh0Q2hpbGRDb250YWluZXIgPQorICAgICAgICAgIHBDaGlsZENvbnRhaW5lciA9PSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFCisgICAgICAgICAgICAgID8gcEVudGlyZUNvbnRhaW5lci0+R2V0Rmlyc3RDb250YWluZXJDaGlsZCgpCisgICAgICAgICAgICAgIDogcENoaWxkQ29udGFpbmVyLT5HZXROZXh0Q29udGFpbmVyU2libGluZygpOworICAgICAgd2hpbGUgKHBOZXh0Q2hpbGRDb250YWluZXIgJiYKKyAgICAgICAgICAgICBwTmV4dENoaWxkQ29udGFpbmVyLT5Jc0xheW91dEdlbmVyYXRlZE5vZGUoKSkgeworICAgICAgICBDWEZBX05vZGUqIHBTYXZlTm9kZSA9IHBOZXh0Q2hpbGRDb250YWluZXI7CisgICAgICAgIHBOZXh0Q2hpbGRDb250YWluZXIgPSBwTmV4dENoaWxkQ29udGFpbmVyLT5HZXROZXh0Q29udGFpbmVyU2libGluZygpOworICAgICAgICBpZiAocFNhdmVOb2RlLT5Jc1VudXNlZE5vZGUoKSkKKyAgICAgICAgICBEZWxldGVMYXlvdXRHZW5lcmF0ZWROb2RlKHBTYXZlTm9kZSk7CisgICAgICB9CisgICAgICBpZiAoIXBOZXh0Q2hpbGRDb250YWluZXIpCisgICAgICAgIGdvdG8gTm9Nb3JlQ2hpbGRDb250YWluZXI7CisKKyAgICAgIGJvb2wgYkxhc3RLZWVwID0gZmFsc2U7CisgICAgICBpZiAoUHJvY2Vzc0tlZXBOb2Rlc0ZvckNoZWNrTmV4dChwQ3VyQWN0aW9uTm9kZSwgbkN1clN0YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHRDaGlsZENvbnRhaW5lciwgYkxhc3RLZWVwKSkgeworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBpZiAoIW1fYktlZXBCcmVha0ZpbmlzaCAmJiAhYkxhc3RLZWVwICYmCisgICAgICAgICAgRmluZEJyZWFrTm9kZShwTmV4dENoaWxkQ29udGFpbmVyLT5HZXRGaXJzdENoaWxkKCksIHBDdXJBY3Rpb25Ob2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgJm5DdXJTdGFnZSwgdHJ1ZSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgcEN1ckFjdGlvbk5vZGUgPSBwTmV4dENoaWxkQ29udGFpbmVyOworICAgICAgaWYgKG1fYklzUHJvY2Vzc0tlZXApCisgICAgICAgIG5DdXJTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzOjpLZWVwOworICAgICAgZWxzZQorICAgICAgICBuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6Q29udGFpbmVyOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE5vTW9yZUNoaWxkQ29udGFpbmVyIDogeworICAgICAgcEN1ckFjdGlvbk5vZGUgPSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFOworICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6Qm9va2VuZFRyYWlsZXI6CisgICAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwQm9va2VuZE5vZGUgPSBwQ3VyQWN0aW9uTm9kZSA9PSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwRW50aXJlQ29udGFpbmVyLT5HZXRGaXJzdENoaWxkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBDdXJBY3Rpb25Ob2RlLT5HZXROZXh0U2libGluZygpOworICAgICAgICAgICAgIHBCb29rZW5kTm9kZTsgcEJvb2tlbmROb2RlID0gcEJvb2tlbmROb2RlLT5HZXROZXh0U2libGluZygpKSB7CisgICAgICAgICAgc3dpdGNoIChwQm9va2VuZE5vZGUtPkdldEVsZW1lbnRUeXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJvb2tlbmQ6CisgICAgICAgICAgICBjYXNlIFhGQV9FbGVtZW50OjpCcmVhazoKKyAgICAgICAgICAgICAgcEN1ckFjdGlvbk5vZGUgPSBwQm9va2VuZE5vZGU7CisgICAgICAgICAgICAgIG5DdXJTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzOjpCb29rZW5kVHJhaWxlcjsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBwQ3VyQWN0aW9uTm9kZSA9IG51bGxwdHI7CisgICAgICBuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6RG9uZTsKKyAgfQorfQorCitib29sIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6UHJvY2Vzc0tlZXBOb2Rlc0ZvckNoZWNrTmV4dCgKKyAgICBDWEZBX05vZGUqJiBwQ3VyQWN0aW9uTm9kZSwKKyAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlcyYgbkN1clN0YWdlLAorICAgIENYRkFfTm9kZSomIHBOZXh0Q29udGFpbmVyLAorICAgIGJvb2wmIGJMYXN0S2VlcE5vZGUpIHsKKyAgY29uc3QgYm9vbCBiQ2FuU3BsaXQgPSBwTmV4dENvbnRhaW5lci0+R2V0SW50YWN0KCkgPT0gWEZBX0F0dHJpYnV0ZUVudW06Ok5vbmU7CisgIGJvb2wgYk5leHRLZWVwID0gZmFsc2U7CisgIGlmIChFeGlzdENvbnRhaW5lcktlZXAocE5leHRDb250YWluZXIsIGZhbHNlKSkKKyAgICBiTmV4dEtlZXAgPSB0cnVlOworCisgIGlmIChiTmV4dEtlZXAgJiYgIWJDYW5TcGxpdCkgeworICAgIGlmICghbV9iSXNQcm9jZXNzS2VlcCAmJiAhbV9iS2VlcEJyZWFrRmluaXNoKSB7CisgICAgICBtX3BLZWVwSGVhZE5vZGUgPSBwTmV4dENvbnRhaW5lcjsKKyAgICAgIG1fYklzUHJvY2Vzc0tlZXAgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAobV9iSXNQcm9jZXNzS2VlcCAmJiBtX3BLZWVwSGVhZE5vZGUpIHsKKyAgICBtX3BLZWVwVGFpbE5vZGUgPSBwTmV4dENvbnRhaW5lcjsKKyAgICBpZiAoIW1fYktlZXBCcmVha0ZpbmlzaCAmJgorICAgICAgICBGaW5kQnJlYWtOb2RlKHBOZXh0Q29udGFpbmVyLT5HZXRGaXJzdENoaWxkKCksIHBDdXJBY3Rpb25Ob2RlLAorICAgICAgICAgICAgICAgICAgICAgICZuQ3VyU3RhZ2UsIHRydWUpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwTmV4dENvbnRhaW5lciA9IG1fcEtlZXBIZWFkTm9kZTsKKyAgICBtX2JLZWVwQnJlYWtGaW5pc2ggPSB0cnVlOworICAgIG1fcEtlZXBIZWFkTm9kZSA9IG51bGxwdHI7CisgICAgbV9wS2VlcFRhaWxOb2RlID0gbnVsbHB0cjsKKyAgICBtX2JJc1Byb2Nlc3NLZWVwID0gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgaWYgKG1fYktlZXBCcmVha0ZpbmlzaCkKKyAgICAgIGJMYXN0S2VlcE5vZGUgPSB0cnVlOworICAgIG1fYktlZXBCcmVha0ZpbmlzaCA9IGZhbHNlOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6UHJvY2Vzc0tlZXBOb2Rlc0ZvckJyZWFrQmVmb3JlKAorICAgIENYRkFfTm9kZSomIHBDdXJBY3Rpb25Ob2RlLAorICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzJiBuQ3VyU3RhZ2UsCisgICAgQ1hGQV9Ob2RlKiBwQ29udGFpbmVyTm9kZSkgeworICBpZiAobV9wS2VlcFRhaWxOb2RlID09IHBDb250YWluZXJOb2RlKSB7CisgICAgcEN1ckFjdGlvbk5vZGUgPSBtX3BLZWVwSGVhZE5vZGU7CisgICAgbV9iS2VlcEJyZWFrRmluaXNoID0gdHJ1ZTsKKyAgICBtX3BLZWVwSGVhZE5vZGUgPSBudWxscHRyOworICAgIG1fcEtlZXBUYWlsTm9kZSA9IG51bGxwdHI7CisgICAgbV9iSXNQcm9jZXNzS2VlcCA9IGZhbHNlOworICAgIG5DdXJTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzOjpDb250YWluZXI7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBDWEZBX05vZGUqIHBCcmVha0FmdGVyTm9kZSA9IHBDb250YWluZXJOb2RlLT5HZXRGaXJzdENoaWxkKCk7CisgIHJldHVybiBGaW5kQnJlYWtOb2RlKHBCcmVha0FmdGVyTm9kZSwgcEN1ckFjdGlvbk5vZGUsICZuQ3VyU3RhZ2UsIGZhbHNlKTsKK30KKworYm9vbCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKENYRkFfTm9kZSogcE5vZGUpIHsKKyAgWEZBX0F0dHJpYnV0ZUVudW0gZVByZXNlbmNlID0gcE5vZGUtPkpTT2JqZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+VHJ5RW51bShYRkFfQXR0cmlidXRlOjpQcmVzZW5jZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9vcihYRkFfQXR0cmlidXRlRW51bTo6VmlzaWJsZSk7CisgIHJldHVybiBlUHJlc2VuY2UgPT0gWEZBX0F0dHJpYnV0ZUVudW06OlZpc2libGUgfHwKKyAgICAgICAgIGVQcmVzZW5jZSA9PSBYRkFfQXR0cmlidXRlRW51bTo6SW52aXNpYmxlOworfQorCitib29sIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6SW5jcmVtZW50UmVsYXlvdXROb2RlKAorICAgIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvY2Vzc29yLAorICAgIENYRkFfTm9kZSogcE5vZGUsCisgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpEb0xheW91dFBhZ2VBcmVhKAorICAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcFBhZ2VBcmVhTGF5b3V0SXRlbSkgeworICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IHBQYWdlQXJlYUxheW91dEl0ZW0tPm1fcEZvcm1Ob2RlOworICBDWEZBX05vZGUqIHBDdXJDaGlsZE5vZGUgPSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFOworICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlcyBuQ3VyQ2hpbGROb2RlU3RhZ2UgPQorICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6Ok5vbmU7CisgIENYRkFfTGF5b3V0SXRlbSogcEJlZm9yZUl0ZW0gPSBudWxscHRyOworICBmb3IgKEdvdG9OZXh0Q29udGFpbmVyTm9kZShwQ3VyQ2hpbGROb2RlLCBuQ3VyQ2hpbGROb2RlU3RhZ2UsIHBGb3JtTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgIHBDdXJDaGlsZE5vZGU7IEdvdG9OZXh0Q29udGFpbmVyTm9kZShwQ3VyQ2hpbGROb2RlLCBuQ3VyQ2hpbGROb2RlU3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtTm9kZSwgZmFsc2UpKSB7CisgICAgaWYgKG5DdXJDaGlsZE5vZGVTdGFnZSAhPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6Q29udGFpbmVyKQorICAgICAgY29udGludWU7CisgICAgaWYgKHBDdXJDaGlsZE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlZhcmlhYmxlcykKKyAgICAgIGNvbnRpbnVlOworCisgICAgYXV0byBwUHJvY2Vzc29yID0KKyAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcj4ocEN1ckNoaWxkTm9kZSwgbnVsbHB0cik7CisgICAgcFByb2Nlc3Nvci0+RG9MYXlvdXQoZmFsc2UsIEZMVF9NQVgsIEZMVF9NQVgsIG51bGxwdHIpOworICAgIGlmICghcFByb2Nlc3Nvci0+SGFzTGF5b3V0SXRlbSgpKQorICAgICAgY29udGludWU7CisKKyAgICBwUHJvY2Vzc29yLT5TZXRDdXJyZW50Q29tcG9uZW50UG9zKENhbGN1bGF0ZVBvc2l0aW9uZWRDb250YWluZXJQb3MoCisgICAgICAgIHBDdXJDaGlsZE5vZGUsIHBQcm9jZXNzb3ItPkdldEN1cnJlbnRDb21wb25lbnRTaXplKCkpKTsKKyAgICBDWEZBX0xheW91dEl0ZW0qIHBQcm9jZXNzSXRlbSA9IHBQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCk7CisgICAgaWYgKCFwQmVmb3JlSXRlbSkKKyAgICAgIHBQYWdlQXJlYUxheW91dEl0ZW0tPkFkZEhlYWRDaGlsZChwUHJvY2Vzc0l0ZW0pOworICAgIGVsc2UKKyAgICAgIHBQYWdlQXJlYUxheW91dEl0ZW0tPkluc2VydENoaWxkKHBCZWZvcmVJdGVtLCBwUHJvY2Vzc0l0ZW0pOworCisgICAgcEJlZm9yZUl0ZW0gPSBwUHJvY2Vzc0l0ZW07CisgIH0KKworICBwQmVmb3JlSXRlbSA9IG51bGxwdHI7CisgIENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0gPSBwUGFnZUFyZWFMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOworICB3aGlsZSAocExheW91dEl0ZW0pIHsKKyAgICBpZiAoIXBMYXlvdXRJdGVtLT5Jc0NvbnRlbnRMYXlvdXRJdGVtKCkgfHwKKyAgICAgICAgcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpEcmF3KSB7CisgICAgICBwTGF5b3V0SXRlbSA9IHBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAocExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpEcmF3KQorICAgICAgY29udGludWU7CisKKyAgICBDWEZBX0xheW91dEl0ZW0qIHBOZXh0TGF5b3V0SXRlbSA9IHBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZzsKKyAgICBwUGFnZUFyZWFMYXlvdXRJdGVtLT5SZW1vdmVDaGlsZChwTGF5b3V0SXRlbSk7CisgICAgaWYgKCFwQmVmb3JlSXRlbSkKKyAgICAgIHBQYWdlQXJlYUxheW91dEl0ZW0tPkFkZEhlYWRDaGlsZChwTGF5b3V0SXRlbSk7CisgICAgZWxzZQorICAgICAgcFBhZ2VBcmVhTGF5b3V0SXRlbS0+SW5zZXJ0Q2hpbGQocEJlZm9yZUl0ZW0sIHBMYXlvdXRJdGVtKTsKKworICAgIHBCZWZvcmVJdGVtID0gcExheW91dEl0ZW07CisgICAgcExheW91dEl0ZW0gPSBwTmV4dExheW91dEl0ZW07CisgIH0KK30KKwordm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkRvTGF5b3V0UG9zaXRpb25lZENvbnRhaW5lcigKKyAgICBDWEZBX0xheW91dENvbnRleHQqIHBDb250ZXh0KSB7CisgIGlmIChtX3BMYXlvdXRJdGVtKQorICAgIHJldHVybjsKKworICBtX3BMYXlvdXRJdGVtID0gQ3JlYXRlQ29udGVudExheW91dEl0ZW0obV9wRm9ybU5vZGUpOworICBib29sIGJJZ25vcmVYWSA9IChtX3BGb3JtTm9kZS0+SlNPYmplY3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgLT5UcnlFbnVtKFhGQV9BdHRyaWJ1dGU6OkxheW91dCwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9vcihYRkFfQXR0cmlidXRlRW51bTo6UG9zaXRpb24pICE9CisgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpQb3NpdGlvbik7CisgIGJvb2wgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSB0cnVlOworICBib29sIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSA9IHRydWU7CisgIENGWF9TaXplRiBjb250YWluZXJTaXplID0gQ2FsY3VsYXRlQ29udGFpbmVyU3BlY2lmaWVkU2l6ZSgKKyAgICAgIG1fcEZvcm1Ob2RlLCAmYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsICZiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpOworCisgIGZsb2F0IGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoID0gMDsKKyAgZmxvYXQgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gMDsKKyAgZmxvYXQgZkhpZGRlbkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSAwOworICBmbG9hdCBmSGlkZGVuQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSAwOworICBpZiAobV9wQ3VyQ2hpbGROb2RlID09IFhGQV9MQVlPVVRfSU5WQUxJRE5PREUpIHsKKyAgICBHb3RvTmV4dENvbnRhaW5lck5vZGUobV9wQ3VyQ2hpbGROb2RlLCBtX25DdXJDaGlsZE5vZGVTdGFnZSwgbV9wRm9ybU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgfQorCisgIGludDMyX3QgaUNvbEluZGV4ID0gMDsKKyAgZm9yICg7IG1fcEN1ckNoaWxkTm9kZTsgR290b05leHRDb250YWluZXJOb2RlKAorICAgICAgICAgICBtX3BDdXJDaGlsZE5vZGUsIG1fbkN1ckNoaWxkTm9kZVN0YWdlLCBtX3BGb3JtTm9kZSwgZmFsc2UpKSB7CisgICAgaWYgKG1fbkN1ckNoaWxkTm9kZVN0YWdlICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzOjpDb250YWluZXIpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAobV9wQ3VyQ2hpbGROb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpWYXJpYWJsZXMpCisgICAgICBjb250aW51ZTsKKworICAgIGF1dG8gcFByb2Nlc3NvciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I+KAorICAgICAgICBtX3BDdXJDaGlsZE5vZGUsIG1fcFBhZ2VNZ3IpOworICAgIGlmIChwQ29udGV4dCAmJiBwQ29udGV4dC0+bV9wcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMpIHsKKyAgICAgIGludDMyX3QgaUNvbFNwYW4gPQorICAgICAgICAgIG1fcEN1ckNoaWxkTm9kZS0+SlNPYmplY3QoKS0+R2V0SW50ZWdlcihYRkFfQXR0cmlidXRlOjpDb2xTcGFuKTsKKyAgICAgIGlmIChpQ29sU3BhbiA8PSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAqcENvbnRleHQtPm1fcHJnU3BlY2lmaWVkQ29sdW1uV2lkdGhzKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlDb2xJbmRleCkgeworICAgICAgICBwQ29udGV4dC0+bV9mQ3VyQ29sdW1uV2lkdGggPSAwOworICAgICAgICBwQ29udGV4dC0+bV9iQ3VyQ29sdW1uV2lkdGhBdmFpYWJsZSA9IHRydWU7CisgICAgICAgIGlmIChpQ29sU3BhbiA9PSAtMSkgeworICAgICAgICAgIGlDb2xTcGFuID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PigKKyAgICAgICAgICAgICAgKnBDb250ZXh0LT5tX3ByZ1NwZWNpZmllZENvbHVtbldpZHRocyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpQ29sSW5kZXggKyBpIDwgaUNvbFNwYW47ICsraSkgeworICAgICAgICAgIHBDb250ZXh0LT5tX2ZDdXJDb2x1bW5XaWR0aCArPQorICAgICAgICAgICAgICAoKnBDb250ZXh0LT5tX3ByZ1NwZWNpZmllZENvbHVtbldpZHRocylbaUNvbEluZGV4ICsgaV07CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBDb250ZXh0LT5tX2ZDdXJDb2x1bW5XaWR0aCA9PSAwKQorICAgICAgICAgIHBDb250ZXh0LT5tX2JDdXJDb2x1bW5XaWR0aEF2YWlhYmxlID0gZmFsc2U7CisKKyAgICAgICAgaUNvbEluZGV4ICs9IGlDb2xTcGFuID49IDAgPyBpQ29sU3BhbiA6IDA7CisgICAgICB9CisgICAgfQorCisgICAgcFByb2Nlc3Nvci0+RG9MYXlvdXQoZmFsc2UsIEZMVF9NQVgsIEZMVF9NQVgsIHBDb250ZXh0KTsKKyAgICBpZiAoIXBQcm9jZXNzb3ItPkhhc0xheW91dEl0ZW0oKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgQ0ZYX1NpemVGIHNpemUgPSBwUHJvY2Vzc29yLT5HZXRDdXJyZW50Q29tcG9uZW50U2l6ZSgpOworICAgIGJvb2wgYkNoYW5nZVBhcmVudFNpemUgPSBmYWxzZTsKKyAgICBpZiAoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShtX3BDdXJDaGlsZE5vZGUpKQorICAgICAgYkNoYW5nZVBhcmVudFNpemUgPSB0cnVlOworCisgICAgQ0ZYX1BvaW50RiBhYnNvbHV0ZVBvczsKKyAgICBpZiAoIWJJZ25vcmVYWSkKKyAgICAgIGFic29sdXRlUG9zID0gQ2FsY3VsYXRlUG9zaXRpb25lZENvbnRhaW5lclBvcyhtX3BDdXJDaGlsZE5vZGUsIHNpemUpOworCisgICAgcFByb2Nlc3Nvci0+U2V0Q3VycmVudENvbXBvbmVudFBvcyhhYnNvbHV0ZVBvcyk7CisgICAgaWYgKGJDb250YWluZXJXaWR0aEF1dG9TaXplKSB7CisgICAgICBmbG9hdCBmQ2hpbGRTdXBwbGllZFdpZHRoID0gYWJzb2x1dGVQb3MueCArIHNpemUud2lkdGg7CisgICAgICBpZiAoYkNoYW5nZVBhcmVudFNpemUpIHsKKyAgICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPQorICAgICAgICAgICAgc3RkOjptYXgoZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsIGZDaGlsZFN1cHBsaWVkV2lkdGgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGZIaWRkZW5Db250ZW50Q2FsY3VsYXRlZFdpZHRoIDwgZkNoaWxkU3VwcGxpZWRXaWR0aCAmJgorICAgICAgICAgICAgbV9wQ3VyQ2hpbGROb2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpTdWJmb3JtKSB7CisgICAgICAgICAgZkhpZGRlbkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSBmQ2hpbGRTdXBwbGllZFdpZHRoOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSkgeworICAgICAgZmxvYXQgZkNoaWxkU3VwcGxpZWRIZWlnaHQgPSBhYnNvbHV0ZVBvcy55ICsgc2l6ZS5oZWlnaHQ7CisgICAgICBpZiAoYkNoYW5nZVBhcmVudFNpemUpIHsKKyAgICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0KKyAgICAgICAgICAgIHN0ZDo6bWF4KGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwgZkNoaWxkU3VwcGxpZWRIZWlnaHQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGZIaWRkZW5Db250ZW50Q2FsY3VsYXRlZEhlaWdodCA8IGZDaGlsZFN1cHBsaWVkSGVpZ2h0ICYmCisgICAgICAgICAgICBtX3BDdXJDaGlsZE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm0pIHsKKyAgICAgICAgICBmSGlkZGVuQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSBmQ2hpbGRTdXBwbGllZEhlaWdodDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBtX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChwUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpKTsKKyAgfQorCisgIFhGQV9WRVJTSU9OIGVWZXJzaW9uID0gbV9wRm9ybU5vZGUtPkdldERvY3VtZW50KCktPkdldEN1clZlcnNpb25Nb2RlKCk7CisgIGlmIChmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9PSAwICYmIGVWZXJzaW9uIDwgWEZBX1ZFUlNJT05fMjA3KQorICAgIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoID0gZkhpZGRlbkNvbnRlbnRDYWxjdWxhdGVkV2lkdGg7CisgIGlmIChmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPT0gMCAmJiBlVmVyc2lvbiA8IFhGQV9WRVJTSU9OXzIwNykKKyAgICBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSBmSGlkZGVuQ29udGVudENhbGN1bGF0ZWRIZWlnaHQ7CisKKyAgY29udGFpbmVyU2l6ZSA9IENhbGN1bGF0ZUNvbnRhaW5lckNvbXBvbmVudFNpemVGcm9tQ29udGVudFNpemUoCisgICAgICBtX3BGb3JtTm9kZSwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoLAorICAgICAgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsIGNvbnRhaW5lclNpemUpOworICBTZXRDdXJyZW50Q29tcG9uZW50U2l6ZShjb250YWluZXJTaXplKTsKK30KKwordm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkRvTGF5b3V0VGFibGVDb250YWluZXIoQ1hGQV9Ob2RlKiBwTGF5b3V0Tm9kZSkgeworICBpZiAobV9wTGF5b3V0SXRlbSkKKyAgICByZXR1cm47CisgIGlmICghcExheW91dE5vZGUpCisgICAgcExheW91dE5vZGUgPSBtX3BGb3JtTm9kZTsKKworICBBU1NFUlQobV9wQ3VyQ2hpbGROb2RlID09IFhGQV9MQVlPVVRfSU5WQUxJRE5PREUpOworCisgIG1fcExheW91dEl0ZW0gPSBDcmVhdGVDb250ZW50TGF5b3V0SXRlbShtX3BGb3JtTm9kZSk7CisgIGJvb2wgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSB0cnVlOworICBib29sIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSA9IHRydWU7CisgIENGWF9TaXplRiBjb250YWluZXJTaXplID0gQ2FsY3VsYXRlQ29udGFpbmVyU3BlY2lmaWVkU2l6ZSgKKyAgICAgIG1fcEZvcm1Ob2RlLCAmYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsICZiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpOworICBmbG9hdCBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IDA7CisgIGZsb2F0IGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA9IDA7CisgIENYRkFfTWFyZ2luKiBwTWFyZ2luTm9kZSA9CisgICAgICBtX3BGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9NYXJnaW4+KFhGQV9FbGVtZW50OjpNYXJnaW4pOworICBmbG9hdCBmTGVmdEluc2V0ID0gMDsKKyAgZmxvYXQgZlJpZ2h0SW5zZXQgPSAwOworICBpZiAocE1hcmdpbk5vZGUpIHsKKyAgICBmTGVmdEluc2V0ID0gcE1hcmdpbk5vZGUtPkpTT2JqZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgIC0+R2V0TWVhc3VyZShYRkFfQXR0cmlidXRlOjpMZWZ0SW5zZXQpCisgICAgICAgICAgICAgICAgICAgICAuVG9Vbml0KFhGQV9Vbml0OjpQdCk7CisgICAgZlJpZ2h0SW5zZXQgPSBwTWFyZ2luTm9kZS0+SlNPYmplY3QoKQorICAgICAgICAgICAgICAgICAgICAgIC0+R2V0TWVhc3VyZShYRkFfQXR0cmlidXRlOjpSaWdodEluc2V0KQorICAgICAgICAgICAgICAgICAgICAgIC5Ub1VuaXQoWEZBX1VuaXQ6OlB0KTsKKyAgfQorCisgIGZsb2F0IGZDb250ZW50V2lkdGhMaW1pdCA9CisgICAgICBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSA/IEZMVF9NQVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29udGFpbmVyU2l6ZS53aWR0aCAtIGZMZWZ0SW5zZXQgLSBmUmlnaHRJbnNldDsKKyAgV2lkZVN0cmluZyB3c0NvbHVtbldpZHRocyA9CisgICAgICBwTGF5b3V0Tm9kZS0+SlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6Q29sdW1uV2lkdGhzKTsKKyAgaWYgKCF3c0NvbHVtbldpZHRocy5Jc0VtcHR5KCkpIHsKKyAgICBhdXRvIHdpZHRocyA9IFNlcGFyYXRlU3RyaW5nVyh3c0NvbHVtbldpZHRocy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzQ29sdW1uV2lkdGhzLkdldExlbmd0aCgpLCBMJyAnKTsKKyAgICBmb3IgKGF1dG8mIHdpZHRoIDogd2lkdGhzKSB7CisgICAgICB3aWR0aC5UcmltTGVmdChMJyAnKTsKKyAgICAgIGlmICh3aWR0aC5Jc0VtcHR5KCkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBtX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLnB1c2hfYmFjaygKKyAgICAgICAgICBDWEZBX01lYXN1cmVtZW50KHdpZHRoLkFzU3RyaW5nVmlldygpKS5Ub1VuaXQoWEZBX1VuaXQ6OlB0KSk7CisgICAgfQorICB9CisKKyAgaW50MzJfdCBpU3BlY2lmaWVkQ29sdW1uQ291bnQgPQorICAgICAgcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihtX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzKTsKKyAgQ1hGQV9MYXlvdXRDb250ZXh0IGxheW91dENvbnRleHQ7CisgIGxheW91dENvbnRleHQubV9wcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMgPSAmbV9yZ1NwZWNpZmllZENvbHVtbldpZHRoczsKKyAgQ1hGQV9MYXlvdXRDb250ZXh0KiBwTGF5b3V0Q29udGV4dCA9CisgICAgICBpU3BlY2lmaWVkQ29sdW1uQ291bnQgPiAwID8gJmxheW91dENvbnRleHQgOiBudWxscHRyOworICBpZiAobV9wQ3VyQ2hpbGROb2RlID09IFhGQV9MQVlPVVRfSU5WQUxJRE5PREUpIHsKKyAgICBHb3RvTmV4dENvbnRhaW5lck5vZGUobV9wQ3VyQ2hpbGROb2RlLCBtX25DdXJDaGlsZE5vZGVTdGFnZSwgbV9wRm9ybU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgfQorCisgIGZvciAoOyBtX3BDdXJDaGlsZE5vZGU7IEdvdG9OZXh0Q29udGFpbmVyTm9kZSgKKyAgICAgICAgICAgbV9wQ3VyQ2hpbGROb2RlLCBtX25DdXJDaGlsZE5vZGVTdGFnZSwgbV9wRm9ybU5vZGUsIGZhbHNlKSkgeworICAgIGxheW91dENvbnRleHQubV9iQ3VyQ29sdW1uV2lkdGhBdmFpYWJsZSA9IGZhbHNlOworICAgIGxheW91dENvbnRleHQubV9mQ3VyQ29sdW1uV2lkdGggPSAwOworICAgIGlmIChtX25DdXJDaGlsZE5vZGVTdGFnZSAhPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6Q29udGFpbmVyKQorICAgICAgY29udGludWU7CisKKyAgICBhdXRvIHBQcm9jZXNzb3IgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yPigKKyAgICAgICAgbV9wQ3VyQ2hpbGROb2RlLCBtX3BQYWdlTWdyKTsKKyAgICBwUHJvY2Vzc29yLT5Eb0xheW91dChmYWxzZSwgRkxUX01BWCwgRkxUX01BWCwgcExheW91dENvbnRleHQpOworICAgIGlmICghcFByb2Nlc3Nvci0+SGFzTGF5b3V0SXRlbSgpKQorICAgICAgY29udGludWU7CisKKyAgICBtX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChwUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpKTsKKyAgfQorCisgIGludDMyX3QgaVJvd0NvdW50ID0gMDsKKyAgaW50MzJfdCBpQ29sQ291bnQgPSAwOworICB7CisgICAgc3RkOjp2ZWN0b3I8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+IHJnUm93SXRlbXM7CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gcmdSb3dJdGVtc1NwYW47CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHJnUm93SXRlbXNXaWR0aDsKKyAgICBmb3IgKGF1dG8qIHBMYXlvdXRDaGlsZCA9CisgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+KG1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQpOworICAgICAgICAgcExheW91dENoaWxkOyBwTGF5b3V0Q2hpbGQgPSBzdGF0aWNfY2FzdDxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fcE5leHRTaWJsaW5nKSkgeworICAgICAgaWYgKHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm0pCisgICAgICAgIGNvbnRpbnVlOworICAgICAgaWYgKCFYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgWEZBX0F0dHJpYnV0ZUVudW0gZUxheW91dCA9CisgICAgICAgICAgcExheW91dENoaWxkLT5tX3BGb3JtTm9kZS0+SlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpMYXlvdXQpOworICAgICAgaWYgKGVMYXlvdXQgIT0gWEZBX0F0dHJpYnV0ZUVudW06OlJvdyAmJgorICAgICAgICAgIGVMYXlvdXQgIT0gWEZBX0F0dHJpYnV0ZUVudW06OlJsX3JvdykgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwUm93TGF5b3V0Q2VsbCA9CisgICAgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwTGF5b3V0Q2hpbGQtPm1fcEZpcnN0Q2hpbGQpIHsKKyAgICAgICAgcmdSb3dJdGVtcy5wdXNoX2JhY2socFJvd0xheW91dENlbGwpOworICAgICAgICBpbnQzMl90IGlDb2xTcGFuID0gcFJvd0xheW91dENlbGwtPm1fcEZvcm1Ob2RlLT5KU09iamVjdCgpLT5HZXRJbnRlZ2VyKAorICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZTo6Q29sU3Bhbik7CisgICAgICAgIHJnUm93SXRlbXNTcGFuLnB1c2hfYmFjayhpQ29sU3Bhbik7CisgICAgICAgIHJnUm93SXRlbXNXaWR0aC5wdXNoX2JhY2socFJvd0xheW91dENlbGwtPm1fc1NpemUud2lkdGgpOworICAgICAgfQorICAgIH0KKworICAgIGlSb3dDb3VudCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4ocmdSb3dJdGVtcyk7CisgICAgaUNvbENvdW50ID0gMDsKKyAgICBib29sIGJNb3JlQ29sdW1ucyA9IHRydWU7CisgICAgd2hpbGUgKGJNb3JlQ29sdW1ucykgeworICAgICAgYk1vcmVDb2x1bW5zID0gZmFsc2U7CisgICAgICBib29sIGJBdXRvQ29sID0gZmFsc2U7CisgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpUm93Q291bnQ7IGkrKykgeworICAgICAgICB3aGlsZSAocmdSb3dJdGVtc1tpXSAmJiAocmdSb3dJdGVtc1NwYW5baV0gPD0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIVhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdSb3dJdGVtc1tpXS0+bV9wRm9ybU5vZGUpKSkgeworICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBOZXdDZWxsID0KKyAgICAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXJnUm93SXRlbXNbaV0tPm1fcE5leHRTaWJsaW5nOworICAgICAgICAgIGlmIChyZ1Jvd0l0ZW1zU3BhbltpXSA8IDAgJiYgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ1Jvd0l0ZW1zW2ldLT5tX3BGb3JtTm9kZSkpIHsKKyAgICAgICAgICAgIHBOZXdDZWxsID0gbnVsbHB0cjsKKyAgICAgICAgICB9CisgICAgICAgICAgcmdSb3dJdGVtc1tpXSA9IHBOZXdDZWxsOworICAgICAgICAgIHJnUm93SXRlbXNTcGFuW2ldID0KKyAgICAgICAgICAgICAgcE5ld0NlbGwgPyBwTmV3Q2VsbC0+bV9wRm9ybU5vZGUtPkpTT2JqZWN0KCktPkdldEludGVnZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGU6OkNvbFNwYW4pCisgICAgICAgICAgICAgICAgICAgICAgIDogMDsKKyAgICAgICAgICByZ1Jvd0l0ZW1zV2lkdGhbaV0gPSBwTmV3Q2VsbCA/IHBOZXdDZWxsLT5tX3NTaXplLndpZHRoIDogMDsKKyAgICAgICAgfQorICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwQ2VsbCA9IHJnUm93SXRlbXNbaV07CisgICAgICAgIGlmICghcENlbGwpCisgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgYk1vcmVDb2x1bW5zID0gdHJ1ZTsKKyAgICAgICAgaWYgKHJnUm93SXRlbXNTcGFuW2ldICE9IDEpCisgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYgKGlDb2xDb3VudCA+PSBpU3BlY2lmaWVkQ29sdW1uQ291bnQpIHsKKyAgICAgICAgICBpbnQzMl90IGMgPSBpQ29sQ291bnQgKyAxIC0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMpOworICAgICAgICAgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGM7IGorKykKKyAgICAgICAgICAgIG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMucHVzaF9iYWNrKDApOworICAgICAgICB9CisgICAgICAgIGlmIChtX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzW2lDb2xDb3VudF0gPCBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikKKyAgICAgICAgICBiQXV0b0NvbCA9IHRydWU7CisgICAgICAgIGlmIChiQXV0b0NvbCAmJgorICAgICAgICAgICAgbV9yZ1NwZWNpZmllZENvbHVtbldpZHRoc1tpQ29sQ291bnRdIDwgcmdSb3dJdGVtc1dpZHRoW2ldKSB7CisgICAgICAgICAgbV9yZ1NwZWNpZmllZENvbHVtbldpZHRoc1tpQ29sQ291bnRdID0gcmdSb3dJdGVtc1dpZHRoW2ldOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghYk1vcmVDb2x1bW5zKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgZmxvYXQgZkZpbmFsQ29sdW1uV2lkdGggPSAwLjBmOworICAgICAgaWYgKHBkZml1bTo6SW5kZXhJbkJvdW5kcyhtX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLCBpQ29sQ291bnQpKQorICAgICAgICBmRmluYWxDb2x1bW5XaWR0aCA9IG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHNbaUNvbENvdW50XTsKKworICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVJvd0NvdW50OyArK2kpIHsKKyAgICAgICAgaWYgKCFyZ1Jvd0l0ZW1zW2ldKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAtLXJnUm93SXRlbXNTcGFuW2ldOworICAgICAgICByZ1Jvd0l0ZW1zV2lkdGhbaV0gLT0gZkZpbmFsQ29sdW1uV2lkdGg7CisgICAgICB9CisgICAgICArK2lDb2xDb3VudDsKKyAgICB9CisgIH0KKworICBmbG9hdCBmQ3VycmVudFJvd1kgPSAwOworICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXRDaGlsZCA9CisgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiltX3BMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOworICAgICAgIHBMYXlvdXRDaGlsZDsKKyAgICAgICBwTGF5b3V0Q2hpbGQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcExheW91dENoaWxkLT5tX3BOZXh0U2libGluZykgeworICAgIGlmICghWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgaWYgKHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm0pIHsKKyAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtIGVTdWJmb3JtTGF5b3V0ID0KKyAgICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlLT5KU09iamVjdCgpLT5HZXRFbnVtKFhGQV9BdHRyaWJ1dGU6OkxheW91dCk7CisgICAgICBpZiAoZVN1YmZvcm1MYXlvdXQgPT0gWEZBX0F0dHJpYnV0ZUVudW06OlJvdyB8fAorICAgICAgICAgIGVTdWJmb3JtTGF5b3V0ID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpSbF9yb3cpIHsKKyAgICAgICAgUmVsb2NhdGVUYWJsZVJvd0NlbGxzKHBMYXlvdXRDaGlsZCwgbV9yZ1NwZWNpZmllZENvbHVtbldpZHRocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTdWJmb3JtTGF5b3V0KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwTGF5b3V0Q2hpbGQtPm1fc1Bvcy55ID0gZkN1cnJlbnRSb3dZOworICAgIGlmIChiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSkgeworICAgICAgcExheW91dENoaWxkLT5tX3NQb3MueCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHN3aXRjaCAocExheW91dENoaWxkLT5tX3BGb3JtTm9kZS0+SlNPYmplY3QoKS0+R2V0RW51bSgKKyAgICAgICAgICBYRkFfQXR0cmlidXRlOjpIQWxpZ24pKSB7CisgICAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkNlbnRlcjoKKyAgICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fc1Bvcy54ID0KKyAgICAgICAgICAgICAgKGZDb250ZW50V2lkdGhMaW1pdCAtIHBMYXlvdXRDaGlsZC0+bV9zU2l6ZS53aWR0aCkgLyAyOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpSaWdodDoKKyAgICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fc1Bvcy54ID0KKyAgICAgICAgICAgICAgZkNvbnRlbnRXaWR0aExpbWl0IC0gcExheW91dENoaWxkLT5tX3NTaXplLndpZHRoOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpMZWZ0OgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHBMYXlvdXRDaGlsZC0+bV9zUG9zLnggPSAwOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIGlmIChiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSkgeworICAgICAgZmxvYXQgZkNoaWxkU3VwcGxpZWRXaWR0aCA9CisgICAgICAgICAgcExheW91dENoaWxkLT5tX3NQb3MueCArIHBMYXlvdXRDaGlsZC0+bV9zU2l6ZS53aWR0aDsKKyAgICAgIGlmIChmQ29udGVudFdpZHRoTGltaXQgPCBGTFRfTUFYICYmCisgICAgICAgICAgZkNvbnRlbnRXaWR0aExpbWl0ID4gZkNoaWxkU3VwcGxpZWRXaWR0aCkgeworICAgICAgICBmQ2hpbGRTdXBwbGllZFdpZHRoID0gZkNvbnRlbnRXaWR0aExpbWl0OworICAgICAgfQorICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPQorICAgICAgICAgIHN0ZDo6bWF4KGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoLCBmQ2hpbGRTdXBwbGllZFdpZHRoKTsKKyAgICB9CisgICAgZkN1cnJlbnRSb3dZICs9IHBMYXlvdXRDaGlsZC0+bV9zU2l6ZS5oZWlnaHQ7CisgIH0KKworICBpZiAoYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKQorICAgIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA9IHN0ZDo6bWF4KGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwgZkN1cnJlbnRSb3dZKTsKKworICBjb250YWluZXJTaXplID0gQ2FsY3VsYXRlQ29udGFpbmVyQ29tcG9uZW50U2l6ZUZyb21Db250ZW50U2l6ZSgKKyAgICAgIG1fcEZvcm1Ob2RlLCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsCisgICAgICBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwgY29udGFpbmVyU2l6ZSk7CisgIFNldEN1cnJlbnRDb21wb25lbnRTaXplKGNvbnRhaW5lclNpemUpOworfQorCitib29sIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6SXNBZGROZXdSb3dGb3JUcmFpbGVyKAorICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBUcmFpbGVySXRlbSkgeworICBpZiAoIXBUcmFpbGVySXRlbSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgZmxvYXQgZldpZHRoID0gcFRyYWlsZXJJdGVtLT5tX3NTaXplLndpZHRoOworICBYRkFfQXR0cmlidXRlRW51bSBlTGF5b3V0ID0KKyAgICAgIG1fcEZvcm1Ob2RlLT5KU09iamVjdCgpLT5HZXRFbnVtKFhGQV9BdHRyaWJ1dGU6OkxheW91dCk7CisgIHJldHVybiBlTGF5b3V0ID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpUYiB8fCBtX2ZXaWR0aExpbWl0ZSA8PSBmV2lkdGg7Cit9CisKK2Zsb2F0IENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6SW5zZXJ0S2VlcExheW91dEl0ZW1zKCkgeworICBpZiAobV9hcnJheUtlZXBJdGVtcy5lbXB0eSgpKQorICAgIHJldHVybiAwOworCisgIGlmICghbV9wTGF5b3V0SXRlbSkgeworICAgIG1fcExheW91dEl0ZW0gPSBDcmVhdGVDb250ZW50TGF5b3V0SXRlbShtX3BGb3JtTm9kZSk7CisgICAgbV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS5jbGVhcigpOworICB9CisKKyAgZmxvYXQgZlRvdGFsSGVpZ2h0ID0gMDsKKyAgZm9yIChhdXRvIGl0ZXIgPSBtX2FycmF5S2VlcEl0ZW1zLnJiZWdpbigpOyBpdGVyICE9IG1fYXJyYXlLZWVwSXRlbXMucmVuZCgpOworICAgICAgIGl0ZXIrKykgeworICAgIEFkZExlYWRlckFmdGVyU3BsaXQodGhpcywgKml0ZXIpOworICAgIGZUb3RhbEhlaWdodCArPSAoKml0ZXIpLT5tX3NTaXplLmhlaWdodDsKKyAgfQorICBtX2FycmF5S2VlcEl0ZW1zLmNsZWFyKCk7CisKKyAgcmV0dXJuIGZUb3RhbEhlaWdodDsKK30KKworYm9vbCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OlByb2Nlc3NLZWVwRm9yU3BsaXQoCisgICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwUGFyZW50UHJvY2Vzc29yLAorICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcENoaWxkUHJvY2Vzc29yLAorICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IGVSZXRWYWx1ZSwKKyAgICBzdGQ6OnZlY3RvcjxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4qIHJnQ3VyTGluZUxheW91dEl0ZW0sCisgICAgZmxvYXQqIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCwKKyAgICBmbG9hdCogZkNvbnRlbnRDdXJSb3dIZWlnaHQsCisgICAgZmxvYXQqIGZDb250ZW50Q3VyUm93WSwKKyAgICBib29sKiBiQWRkZWRJdGVtSW5Sb3csCisgICAgYm9vbCogYkZvcmNlRW5kUGFnZSwKKyAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCogcmVzdWx0KSB7CisgIGlmICghcFBhcmVudFByb2Nlc3NvciB8fCAhcENoaWxkUHJvY2Vzc29yKQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAocFBhcmVudFByb2Nlc3Nvci0+bV9wQ3VyQ2hpbGROb2RlLT5HZXRJbnRhY3QoKSA9PQorICAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpOb25lICYmCisgICAgICBwQ2hpbGRQcm9jZXNzb3ItPm1fYkhhc0F2YWlsSGVpZ2h0KQorICAgIHJldHVybiBmYWxzZTsKKworICBpZiAoIUV4aXN0Q29udGFpbmVyS2VlcChwUGFyZW50UHJvY2Vzc29yLT5tX3BDdXJDaGlsZE5vZGUsIHRydWUpKQorICAgIHJldHVybiBmYWxzZTsKKworICBDRlhfU2l6ZUYgY2hpbGRTaXplID0gcENoaWxkUHJvY2Vzc29yLT5HZXRDdXJyZW50Q29tcG9uZW50U2l6ZSgpOworICBzdGQ6OnZlY3RvcjxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4ga2VlcExheW91dEl0ZW1zOworICBpZiAocFBhcmVudFByb2Nlc3Nvci0+SnVkZ2VQdXROZXh0UGFnZShwUGFyZW50UHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZFNpemUuaGVpZ2h0LCAma2VlcExheW91dEl0ZW1zKSkgeworICAgIG1fYXJyYXlLZWVwSXRlbXMuY2xlYXIoKTsKKworICAgIGZvciAoYXV0byogaXRlbSA6IGtlZXBMYXlvdXRJdGVtcykgeworICAgICAgcFBhcmVudFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+UmVtb3ZlQ2hpbGQoaXRlbSk7CisgICAgICAqZkNvbnRlbnRDdXJSb3dZIC09IGl0ZW0tPm1fc1NpemUuaGVpZ2h0OworICAgICAgbV9hcnJheUtlZXBJdGVtcy5wdXNoX2JhY2soaXRlbSk7CisgICAgfQorICAgICpiQWRkZWRJdGVtSW5Sb3cgPSB0cnVlOworICAgICpiRm9yY2VFbmRQYWdlID0gdHJ1ZTsKKyAgICAqcmVzdWx0ID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OlBhZ2VGdWxsQnJlYWs7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZ0N1ckxpbmVMYXlvdXRJdGVtLT5wdXNoX2JhY2socENoaWxkUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpKTsKKyAgKmJBZGRlZEl0ZW1JblJvdyA9IHRydWU7CisgICpmQ29udGVudEN1clJvd0F2YWlsV2lkdGggLT0gY2hpbGRTaXplLndpZHRoOworICAqZkNvbnRlbnRDdXJSb3dIZWlnaHQgPSBzdGQ6Om1heCgqZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGNoaWxkU2l6ZS5oZWlnaHQpOworICAqcmVzdWx0ID0gZVJldFZhbHVlOworCisgIHJldHVybiB0cnVlOworfQorCitib29sIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6SnVkZ2VQdXROZXh0UGFnZSgKKyAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwUGFyZW50TGF5b3V0SXRlbSwKKyAgICBmbG9hdCBmQ2hpbGRIZWlnaHQsCisgICAgc3RkOjp2ZWN0b3I8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+KiBwS2VlcEl0ZW1zKSB7CisgIGlmICghcFBhcmVudExheW91dEl0ZW0pCisgICAgcmV0dXJuIGZhbHNlOworCisgIGZsb2F0IGZJdGVtc0hlaWdodCA9IDA7CisgIGZvciAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcENoaWxkTGF5b3V0SXRlbSA9CisgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwUGFyZW50TGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsKKyAgICAgICBwQ2hpbGRMYXlvdXRJdGVtOworICAgICAgIHBDaGlsZExheW91dEl0ZW0gPQorICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcENoaWxkTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsKKyAgICBpZiAoRXhpc3RDb250YWluZXJLZWVwKHBDaGlsZExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLCBmYWxzZSkpIHsKKyAgICAgIHBLZWVwSXRlbXMtPnB1c2hfYmFjayhwQ2hpbGRMYXlvdXRJdGVtKTsKKyAgICAgIGZJdGVtc0hlaWdodCArPSBwQ2hpbGRMYXlvdXRJdGVtLT5tX3NTaXplLmhlaWdodDsKKyAgICB9IGVsc2UgeworICAgICAgcEtlZXBJdGVtcy0+Y2xlYXIoKTsKKyAgICAgIGZJdGVtc0hlaWdodCA9IDA7CisgICAgfQorICB9CisgIGZJdGVtc0hlaWdodCArPSBmQ2hpbGRIZWlnaHQ7CisgIHJldHVybiBtX3BQYWdlTWdyLT5HZXROZXh0QXZhaWxDb250ZW50SGVpZ2h0KGZJdGVtc0hlaWdodCk7Cit9CisKK3ZvaWQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpQcm9jZXNzVW5Vc2VCaW5kcyhDWEZBX05vZGUqIHBGb3JtTm9kZSkgeworICBpZiAoIXBGb3JtTm9kZSkKKyAgICByZXR1cm47CisKKyAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFOb2RlPiBzSXRlcmF0b3IoCisgICAgICBwRm9ybU5vZGUpOworICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpOyBwTm9kZTsKKyAgICAgICBwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsKKyAgICBpZiAocE5vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB7CisgICAgICBDWEZBX05vZGUqIHBCaW5kTm9kZSA9IHBOb2RlLT5HZXRCaW5kRGF0YSgpOworICAgICAgaWYgKHBCaW5kTm9kZSkgeworICAgICAgICBwQmluZE5vZGUtPlJlbW92ZUJpbmRJdGVtKHBOb2RlKTsKKyAgICAgICAgcE5vZGUtPlNldEJpbmRpbmdOb2RlKG51bGxwdHIpOworICAgICAgfQorICAgIH0KKyAgICBwTm9kZS0+U2V0RmxhZyhYRkFfTm9kZUZsYWdfVW51c2VkTm9kZSwgdHJ1ZSk7CisgIH0KK30KKwordm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OlByb2Nlc3NVblVzZU92ZXJGbG93KAorICAgIENYRkFfTm9kZSogcExlYWRlck5vZGUsCisgICAgQ1hGQV9Ob2RlKiBwVHJhaWxlck5vZGUsCisgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFRyYWlsZXJJdGVtLAorICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlKSB7CisgIFByb2Nlc3NVblVzZUJpbmRzKHBMZWFkZXJOb2RlKTsKKyAgUHJvY2Vzc1VuVXNlQmluZHMocFRyYWlsZXJOb2RlKTsKKyAgaWYgKCFwRm9ybU5vZGUpCisgICAgcmV0dXJuOworCisgIGlmIChwRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6Ok92ZXJmbG93IHx8CisgICAgICBwRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkJyZWFrKSB7CisgICAgcEZvcm1Ob2RlID0gcEZvcm1Ob2RlLT5HZXRQYXJlbnQoKTsKKyAgfQorICBpZiAocExlYWRlck5vZGUgJiYgcEZvcm1Ob2RlKQorICAgIHBGb3JtTm9kZS0+UmVtb3ZlQ2hpbGQocExlYWRlck5vZGUsIHRydWUpOworICBpZiAocFRyYWlsZXJOb2RlICYmIHBGb3JtTm9kZSkKKyAgICBwRm9ybU5vZGUtPlJlbW92ZUNoaWxkKHBUcmFpbGVyTm9kZSwgdHJ1ZSk7CisgIGlmIChwVHJhaWxlckl0ZW0pCisgICAgWEZBX1JlbGVhc2VMYXlvdXRJdGVtKHBUcmFpbGVySXRlbSk7Cit9CisKK1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6RG9MYXlvdXRGbG93ZWRDb250YWluZXIoCisgICAgYm9vbCBiVXNlQnJlYWtDb250cm9sLAorICAgIFhGQV9BdHRyaWJ1dGVFbnVtIGVGbG93U3RyYXRlZ3ksCisgICAgZmxvYXQgZkhlaWdodExpbWl0LAorICAgIGZsb2F0IGZSZWFsSGVpZ2h0LAorICAgIENYRkFfTGF5b3V0Q29udGV4dCogcENvbnRleHQsCisgICAgYm9vbCBiUm9vdEZvcmNlVGIpIHsKKyAgbV9iSGFzQXZhaWxIZWlnaHQgPSB0cnVlOworICBib29sIGJCcmVha0RvbmUgPSBmYWxzZTsKKyAgYm9vbCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSA9IHRydWU7CisgIGJvb2wgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplID0gdHJ1ZTsKKyAgYm9vbCBiRm9yY2VFbmRQYWdlID0gZmFsc2U7CisgIGJvb2wgYklzTWFudWFsQnJlYWsgPSBmYWxzZTsKKyAgaWYgKG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yKSB7CisgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3ItPm1fZVByZVByb2Nlc3NScyA9CisgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpEb25lOworICB9CisKKyAgQ0ZYX1NpemVGIGNvbnRhaW5lclNpemUgPSBDYWxjdWxhdGVDb250YWluZXJTcGVjaWZpZWRTaXplKAorICAgICAgbV9wRm9ybU5vZGUsICZiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwgJmJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSk7CisgIGlmIChwQ29udGV4dCAmJiBwQ29udGV4dC0+bV9iQ3VyQ29sdW1uV2lkdGhBdmFpYWJsZSkgeworICAgIGJDb250YWluZXJXaWR0aEF1dG9TaXplID0gZmFsc2U7CisgICAgY29udGFpbmVyU2l6ZS53aWR0aCA9IHBDb250ZXh0LT5tX2ZDdXJDb2x1bW5XaWR0aDsKKyAgfQorICBpZiAoIWJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSkKKyAgICBjb250YWluZXJTaXplLmhlaWdodCAtPSBtX2ZVc2VkU2l6ZTsKKworICBpZiAoIWJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSkgeworICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBtX3BGb3JtTm9kZS0+R2V0UGFyZW50KCk7CisgICAgYm9vbCBiRm9jclRiID0gZmFsc2U7CisgICAgaWYgKHBQYXJlbnROb2RlICYmCisgICAgICAgIEdldExheW91dChwUGFyZW50Tm9kZSwgJmJGb2NyVGIpID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpSb3cpIHsKKyAgICAgIENYRkFfTm9kZSogcENoaWxkQ29udGFpbmVyID0gbV9wRm9ybU5vZGUtPkdldEZpcnN0Q29udGFpbmVyQ2hpbGQoKTsKKyAgICAgIGlmIChwQ2hpbGRDb250YWluZXIgJiYgcENoaWxkQ29udGFpbmVyLT5HZXROZXh0Q29udGFpbmVyU2libGluZygpKSB7CisgICAgICAgIGNvbnRhaW5lclNpemUuaGVpZ2h0ID0gMDsKKyAgICAgICAgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBDWEZBX01hcmdpbiogcE1hcmdpbk5vZGUgPQorICAgICAgbV9wRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzPENYRkFfTWFyZ2luPihYRkFfRWxlbWVudDo6TWFyZ2luKTsKKyAgZmxvYXQgZkxlZnRJbnNldCA9IDA7CisgIGZsb2F0IGZUb3BJbnNldCA9IDA7CisgIGZsb2F0IGZSaWdodEluc2V0ID0gMDsKKyAgZmxvYXQgZkJvdHRvbUluc2V0ID0gMDsKKyAgaWYgKHBNYXJnaW5Ob2RlKSB7CisgICAgZkxlZnRJbnNldCA9IHBNYXJnaW5Ob2RlLT5KU09iamVjdCgpCisgICAgICAgICAgICAgICAgICAgICAtPkdldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6TGVmdEluc2V0KQorICAgICAgICAgICAgICAgICAgICAgLlRvVW5pdChYRkFfVW5pdDo6UHQpOworICAgIGZUb3BJbnNldCA9IHBNYXJnaW5Ob2RlLT5KU09iamVjdCgpCisgICAgICAgICAgICAgICAgICAgIC0+R2V0TWVhc3VyZShYRkFfQXR0cmlidXRlOjpUb3BJbnNldCkKKyAgICAgICAgICAgICAgICAgICAgLlRvVW5pdChYRkFfVW5pdDo6UHQpOworICAgIGZSaWdodEluc2V0ID0gcE1hcmdpbk5vZGUtPkpTT2JqZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAtPkdldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6UmlnaHRJbnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAuVG9Vbml0KFhGQV9Vbml0OjpQdCk7CisgICAgZkJvdHRvbUluc2V0ID0gcE1hcmdpbk5vZGUtPkpTT2JqZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRNZWFzdXJlKFhGQV9BdHRyaWJ1dGU6OkJvdHRvbUluc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAuVG9Vbml0KFhGQV9Vbml0OjpQdCk7CisgIH0KKyAgZmxvYXQgZkNvbnRlbnRXaWR0aExpbWl0ID0KKyAgICAgIGJDb250YWluZXJXaWR0aEF1dG9TaXplID8gRkxUX01BWAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb250YWluZXJTaXplLndpZHRoIC0gZkxlZnRJbnNldCAtIGZSaWdodEluc2V0OworICBmbG9hdCBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IDA7CisgIGZsb2F0IGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA9IDA7CisgIGZsb2F0IGZBdmFpbEhlaWdodCA9IGZIZWlnaHRMaW1pdCAtIGZUb3BJbnNldCAtIGZCb3R0b21JbnNldDsKKyAgaWYgKGZBdmFpbEhlaWdodCA8IDApCisgICAgbV9iSGFzQXZhaWxIZWlnaHQgPSBmYWxzZTsKKworICBmUmVhbEhlaWdodCA9IGZSZWFsSGVpZ2h0IC0gZlRvcEluc2V0IC0gZkJvdHRvbUluc2V0OworICBmbG9hdCBmQ29udGVudEN1clJvd1kgPSAwOworICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0Q2hpbGQgPSBudWxscHRyOworICBpZiAobV9wTGF5b3V0SXRlbSkgeworICAgIGlmIChtX25DdXJDaGlsZE5vZGVTdGFnZSAhPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6RG9uZSAmJgorICAgICAgICBlRmxvd1N0cmF0ZWd5ICE9IFhGQV9BdHRyaWJ1dGVFbnVtOjpUYikgeworICAgICAgcExheW91dENoaWxkID0gKENYRkFfQ29udGVudExheW91dEl0ZW0qKW1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7CisgICAgICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXROZXh0ID0gcExheW91dENoaWxkOyBwTGF5b3V0TmV4dDsKKyAgICAgICAgICAgcExheW91dE5leHQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcExheW91dE5leHQtPm1fcE5leHRTaWJsaW5nKSB7CisgICAgICAgIGlmIChwTGF5b3V0TmV4dC0+bV9zUG9zLnkgIT0gcExheW91dENoaWxkLT5tX3NQb3MueSkKKyAgICAgICAgICBwTGF5b3V0Q2hpbGQgPSBwTGF5b3V0TmV4dDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXRUZW1wQ2hpbGQgPQorICAgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiltX3BMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOworICAgICAgICAgcExheW91dFRlbXBDaGlsZCAhPSBwTGF5b3V0Q2hpbGQ7CisgICAgICAgICBwTGF5b3V0VGVtcENoaWxkID0KKyAgICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcExheW91dFRlbXBDaGlsZC0+bV9wTmV4dFNpYmxpbmcpIHsKKyAgICAgIGlmICghWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShwTGF5b3V0VGVtcENoaWxkLT5tX3BGb3JtTm9kZSkpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IHN0ZDo6bWF4KAorICAgICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoLAorICAgICAgICAgIHBMYXlvdXRUZW1wQ2hpbGQtPm1fc1Bvcy54ICsgcExheW91dFRlbXBDaGlsZC0+bV9zU2l6ZS53aWR0aCk7CisgICAgICBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSBzdGQ6Om1heCgKKyAgICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsCisgICAgICAgICAgcExheW91dFRlbXBDaGlsZC0+bV9zUG9zLnkgKyBwTGF5b3V0VGVtcENoaWxkLT5tX3NTaXplLmhlaWdodCk7CisgICAgfQorCisgICAgaWYgKHBMYXlvdXRDaGlsZCkKKyAgICAgIGZDb250ZW50Q3VyUm93WSA9IHBMYXlvdXRDaGlsZC0+bV9zUG9zLnk7CisgICAgZWxzZQorICAgICAgZkNvbnRlbnRDdXJSb3dZID0gZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0OworICB9CisKKyAgZkNvbnRlbnRDdXJSb3dZICs9IEluc2VydEtlZXBMYXlvdXRJdGVtcygpOworICBpZiAobV9uQ3VyQ2hpbGROb2RlU3RhZ2UgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6Ok5vbmUpIHsKKyAgICBHb3RvTmV4dENvbnRhaW5lck5vZGUobV9wQ3VyQ2hpbGROb2RlLCBtX25DdXJDaGlsZE5vZGVTdGFnZSwgbV9wRm9ybU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICB9CisKKyAgZkNvbnRlbnRDdXJSb3dZICs9IEluc2VydFBlbmRpbmdJdGVtcyh0aGlzLCBtX3BGb3JtTm9kZSk7CisgIGlmIChtX3BDdXJDaGlsZFByZXByb2Nlc3NvciAmJgorICAgICAgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkNvbnRhaW5lcikgeworICAgIGlmIChFeGlzdENvbnRhaW5lcktlZXAobV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3ItPkdldEZvcm1Ob2RlKCksIGZhbHNlKSkgeworICAgICAgbV9wS2VlcEhlYWROb2RlID0gbV9wQ3VyQ2hpbGROb2RlOworICAgICAgbV9iSXNQcm9jZXNzS2VlcCA9IHRydWU7CisgICAgICBtX25DdXJDaGlsZE5vZGVTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzOjpLZWVwOworICAgIH0KKyAgfQorCisgIHdoaWxlIChtX25DdXJDaGlsZE5vZGVTdGFnZSAhPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6RG9uZSkgeworICAgIGZsb2F0IGZDb250ZW50Q3VyUm93SGVpZ2h0ID0gMDsKKyAgICBmbG9hdCBmQ29udGVudEN1clJvd0F2YWlsV2lkdGggPSBmQ29udGVudFdpZHRoTGltaXQ7CisgICAgbV9mV2lkdGhMaW1pdGUgPSBmQ29udGVudEN1clJvd0F2YWlsV2lkdGg7CisgICAgc3RkOjp2ZWN0b3I8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+IHJnQ3VyTGluZUxheW91dEl0ZW1zWzNdOworICAgIHVpbnQ4X3QgdUN1ckhBbGlnblN0YXRlID0KKyAgICAgICAgKGVGbG93U3RyYXRlZ3kgIT0gWEZBX0F0dHJpYnV0ZUVudW06OlJsX3RiID8gMCA6IDIpOworICAgIGlmIChwTGF5b3V0Q2hpbGQpIHsKKyAgICAgIGZvciAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcExheW91dE5leHQgPSBwTGF5b3V0Q2hpbGQ7IHBMYXlvdXROZXh0OworICAgICAgICAgICBwTGF5b3V0TmV4dCA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwTGF5b3V0TmV4dC0+bV9wTmV4dFNpYmxpbmcpIHsKKyAgICAgICAgaWYgKCFwTGF5b3V0TmV4dC0+bV9wTmV4dFNpYmxpbmcgJiYgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IgJiYKKyAgICAgICAgICAgIG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yLT5tX3BGb3JtTm9kZSA9PSBwTGF5b3V0TmV4dC0+bV9wRm9ybU5vZGUpIHsKKyAgICAgICAgICBwTGF5b3V0TmV4dC0+bV9wTmV4dCA9IG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtOworICAgICAgICAgIG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtID0gcExheW91dE5leHQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCB1SEFsaWduID0KKyAgICAgICAgICAgIEhBbGlnbkVudW1Ub0ludChwTGF5b3V0TmV4dC0+bV9wRm9ybU5vZGUtPkpTT2JqZWN0KCktPkdldEVudW0oCisgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZTo6SEFsaWduKSk7CisgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zW3VIQWxpZ25dLnB1c2hfYmFjayhwTGF5b3V0TmV4dCk7CisgICAgICAgIGlmIChlRmxvd1N0cmF0ZWd5ID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpMcl90YikgeworICAgICAgICAgIGlmICh1SEFsaWduID4gdUN1ckhBbGlnblN0YXRlKQorICAgICAgICAgICAgdUN1ckhBbGlnblN0YXRlID0gdUhBbGlnbjsKKyAgICAgICAgfSBlbHNlIGlmICh1SEFsaWduIDwgdUN1ckhBbGlnblN0YXRlKSB7CisgICAgICAgICAgdUN1ckhBbGlnblN0YXRlID0gdUhBbGlnbjsKKyAgICAgICAgfQorICAgICAgICBpZiAoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShwTGF5b3V0TmV4dC0+bV9wRm9ybU5vZGUpKSB7CisgICAgICAgICAgaWYgKHBMYXlvdXROZXh0LT5tX3NTaXplLmhlaWdodCA+IGZDb250ZW50Q3VyUm93SGVpZ2h0KQorICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dIZWlnaHQgPSBwTGF5b3V0TmV4dC0+bV9zU2l6ZS5oZWlnaHQ7CisgICAgICAgICAgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoIC09IHBMYXlvdXROZXh0LT5tX3NTaXplLndpZHRoOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICgoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopbV9wTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZCA9PQorICAgICAgICAgIHBMYXlvdXRDaGlsZCkgeworICAgICAgICBtX3BMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkID0gbnVsbHB0cjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXROZXh0ID0KKyAgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiltX3BMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOworICAgICAgICBmb3IgKDsgcExheW91dE5leHQ7CisgICAgICAgICAgICAgcExheW91dE5leHQgPQorICAgICAgICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcExheW91dE5leHQtPm1fcE5leHRTaWJsaW5nKSB7CisgICAgICAgICAgaWYgKChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwTGF5b3V0TmV4dC0+bV9wTmV4dFNpYmxpbmcgPT0KKyAgICAgICAgICAgICAgcExheW91dENoaWxkKSB7CisgICAgICAgICAgICBwTGF5b3V0TmV4dC0+bV9wTmV4dFNpYmxpbmcgPSBudWxscHRyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXROZXh0VGVtcCA9CisgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXRDaGlsZDsKKyAgICAgIHdoaWxlIChwTGF5b3V0TmV4dFRlbXApIHsKKyAgICAgICAgcExheW91dE5leHRUZW1wLT5tX3BQYXJlbnQgPSBudWxscHRyOworICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwU2F2ZUxheW91dE5leHQgPQorICAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXROZXh0VGVtcC0+bV9wTmV4dFNpYmxpbmc7CisgICAgICAgIHBMYXlvdXROZXh0VGVtcC0+bV9wTmV4dFNpYmxpbmcgPSBudWxscHRyOworICAgICAgICBwTGF5b3V0TmV4dFRlbXAgPSBwU2F2ZUxheW91dE5leHQ7CisgICAgICB9CisgICAgICBwTGF5b3V0Q2hpbGQgPSBudWxscHRyOworICAgIH0KKworICAgIHdoaWxlIChtX3BDdXJDaGlsZE5vZGUpIHsKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I+IHBQcm9jZXNzb3I7CisgICAgICBib29sIGJBZGRlZEl0ZW1JblJvdyA9IGZhbHNlOworICAgICAgZkNvbnRlbnRDdXJSb3dZICs9IEluc2VydFBlbmRpbmdJdGVtcyh0aGlzLCBtX3BGb3JtTm9kZSk7CisgICAgICBzd2l0Y2ggKG1fbkN1ckNoaWxkTm9kZVN0YWdlKSB7CisgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OktlZXA6CisgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6Ok5vbmU6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkJyZWFrQmVmb3JlOiB7CisgICAgICAgICAgZm9yIChhdXRvKiBpdGVtIDogbV9hcnJheUtlZXBJdGVtcykgeworICAgICAgICAgICAgbV9wTGF5b3V0SXRlbS0+UmVtb3ZlQ2hpbGQoaXRlbSk7CisgICAgICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgLT0gaXRlbS0+bV9zU2l6ZS5oZWlnaHQ7CisgICAgICAgICAgfQorCisgICAgICAgICAgQ1hGQV9Ob2RlKiBwTGVhZGVyTm9kZSA9IG51bGxwdHI7CisgICAgICAgICAgQ1hGQV9Ob2RlKiBwVHJhaWxlck5vZGUgPSBudWxscHRyOworICAgICAgICAgIGJvb2wgYkNyZWF0ZVBhZ2UgPSBmYWxzZTsKKyAgICAgICAgICBpZiAoIWJVc2VCcmVha0NvbnRyb2wgfHwgIW1fcFBhZ2VNZ3IgfHwKKyAgICAgICAgICAgICAgIW1fcFBhZ2VNZ3ItPlByb2Nlc3NCcmVha0JlZm9yZU9yQWZ0ZXIobV9wQ3VyQ2hpbGROb2RlLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVhZGVyTm9kZSwgcFRyYWlsZXJOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ3JlYXRlUGFnZSkgfHwKKyAgICAgICAgICAgICAgbV9wRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkZvcm0gfHwKKyAgICAgICAgICAgICAgIWJDcmVhdGVQYWdlKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoSnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwTGVhZGVyTm9kZSkpCisgICAgICAgICAgICBBZGRQZW5kaW5nTm9kZSh0aGlzLCBwTGVhZGVyTm9kZSwgdHJ1ZSk7CisKKyAgICAgICAgICBpZiAoSnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwVHJhaWxlck5vZGUpKSB7CisgICAgICAgICAgICBpZiAobV9wRm9ybU5vZGUtPkdldFBhcmVudCgpLT5HZXRFbGVtZW50VHlwZSgpID09CisgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpGb3JtICYmCisgICAgICAgICAgICAgICAgIW1fcExheW91dEl0ZW0pIHsKKyAgICAgICAgICAgICAgQWRkUGVuZGluZ05vZGUodGhpcywgcFRyYWlsZXJOb2RlLCB0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGF1dG8gcFRlbXBQcm9jZXNzb3IgPQorICAgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcj4ocFRyYWlsZXJOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgICAgICAgICAgIEluc2VydEZsb3dlZEl0ZW0oCisgICAgICAgICAgICAgICAgICB0aGlzLCBwVGVtcFByb2Nlc3Nvci5nZXQoKSwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsCisgICAgICAgICAgICAgICAgICBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGNvbnRhaW5lclNpemUuaGVpZ2h0LCBlRmxvd1N0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgJnVDdXJIQWxpZ25TdGF0ZSwgcmdDdXJMaW5lTGF5b3V0SXRlbXMsIGZhbHNlLCBGTFRfTUFYLAorICAgICAgICAgICAgICAgICAgRkxUX01BWCwgZkNvbnRlbnRXaWR0aExpbWl0LCAmZkNvbnRlbnRDdXJSb3dZLAorICAgICAgICAgICAgICAgICAgJmZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCwgJmZDb250ZW50Q3VyUm93SGVpZ2h0LAorICAgICAgICAgICAgICAgICAgJmJBZGRlZEl0ZW1JblJvdywgJmJGb3JjZUVuZFBhZ2UsIHBDb250ZXh0LCBmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIEdvdG9OZXh0Q29udGFpbmVyTm9kZShtX3BDdXJDaGlsZE5vZGUsIG1fbkN1ckNoaWxkTm9kZVN0YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BGb3JtTm9kZSwgdHJ1ZSk7CisgICAgICAgICAgYkZvcmNlRW5kUGFnZSA9IHRydWU7CisgICAgICAgICAgYklzTWFudWFsQnJlYWsgPSB0cnVlOworICAgICAgICAgIGdvdG8gU3VzcGVuZEFuZENyZWF0ZU5ld1JvdzsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzOjpCcmVha0FmdGVyOiB7CisgICAgICAgICAgQ1hGQV9Ob2RlKiBwTGVhZGVyTm9kZSA9IG51bGxwdHI7CisgICAgICAgICAgQ1hGQV9Ob2RlKiBwVHJhaWxlck5vZGUgPSBudWxscHRyOworICAgICAgICAgIGJvb2wgYkNyZWF0ZVBhZ2UgPSBmYWxzZTsKKyAgICAgICAgICBpZiAoIWJVc2VCcmVha0NvbnRyb2wgfHwgIW1fcFBhZ2VNZ3IgfHwKKyAgICAgICAgICAgICAgIW1fcFBhZ2VNZ3ItPlByb2Nlc3NCcmVha0JlZm9yZU9yQWZ0ZXIobV9wQ3VyQ2hpbGROb2RlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlYWRlck5vZGUsIHBUcmFpbGVyTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNyZWF0ZVBhZ2UpIHx8CisgICAgICAgICAgICAgIG1fcEZvcm1Ob2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpGb3JtKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAoSnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwVHJhaWxlck5vZGUpKSB7CisgICAgICAgICAgICBhdXRvIHBUZW1wUHJvY2Vzc29yID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcj4oCisgICAgICAgICAgICAgICAgcFRyYWlsZXJOb2RlLCBudWxscHRyKTsKKyAgICAgICAgICAgIEluc2VydEZsb3dlZEl0ZW0oCisgICAgICAgICAgICAgICAgdGhpcywgcFRlbXBQcm9jZXNzb3IuZ2V0KCksIGJDb250YWluZXJXaWR0aEF1dG9TaXplLAorICAgICAgICAgICAgICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgY29udGFpbmVyU2l6ZS5oZWlnaHQsIGVGbG93U3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgJnVDdXJIQWxpZ25TdGF0ZSwgcmdDdXJMaW5lTGF5b3V0SXRlbXMsIGZhbHNlLCBGTFRfTUFYLCBGTFRfTUFYLAorICAgICAgICAgICAgICAgIGZDb250ZW50V2lkdGhMaW1pdCwgJmZDb250ZW50Q3VyUm93WSwgJmZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCwKKyAgICAgICAgICAgICAgICAmZkNvbnRlbnRDdXJSb3dIZWlnaHQsICZiQWRkZWRJdGVtSW5Sb3csICZiRm9yY2VFbmRQYWdlLAorICAgICAgICAgICAgICAgIHBDb250ZXh0LCBmYWxzZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmICghYkNyZWF0ZVBhZ2UpIHsKKyAgICAgICAgICAgIGlmIChKdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKHBMZWFkZXJOb2RlKSkgeworICAgICAgICAgICAgICBDYWxjdWxhdGVSb3dDaGlsZFBvc2l0aW9uKAorICAgICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXMsIGVGbG93U3RyYXRlZ3ksIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwKKyAgICAgICAgICAgICAgICAgIGJDb250YWluZXJXaWR0aEF1dG9TaXplLCAmZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsCisgICAgICAgICAgICAgICAgICAmZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0LCAmZkNvbnRlbnRDdXJSb3dZLAorICAgICAgICAgICAgICAgICAgZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGZDb250ZW50V2lkdGhMaW1pdCwgZmFsc2UpOworICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtcy0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgYXV0byBwVGVtcFByb2Nlc3NvciA9CisgICAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yPihwTGVhZGVyTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgICAgICAgICAgICBJbnNlcnRGbG93ZWRJdGVtKAorICAgICAgICAgICAgICAgICAgdGhpcywgcFRlbXBQcm9jZXNzb3IuZ2V0KCksIGJDb250YWluZXJXaWR0aEF1dG9TaXplLAorICAgICAgICAgICAgICAgICAgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBjb250YWluZXJTaXplLmhlaWdodCwgZUZsb3dTdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICZ1Q3VySEFsaWduU3RhdGUsIHJnQ3VyTGluZUxheW91dEl0ZW1zLCBmYWxzZSwgRkxUX01BWCwKKyAgICAgICAgICAgICAgICAgIEZMVF9NQVgsIGZDb250ZW50V2lkdGhMaW1pdCwgJmZDb250ZW50Q3VyUm93WSwKKyAgICAgICAgICAgICAgICAgICZmQ29udGVudEN1clJvd0F2YWlsV2lkdGgsICZmQ29udGVudEN1clJvd0hlaWdodCwKKyAgICAgICAgICAgICAgICAgICZiQWRkZWRJdGVtSW5Sb3csICZiRm9yY2VFbmRQYWdlLCBwQ29udGV4dCwgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoSnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwTGVhZGVyTm9kZSkpCisgICAgICAgICAgICAgIEFkZFBlbmRpbmdOb2RlKHRoaXMsIHBMZWFkZXJOb2RlLCB0cnVlKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBHb3RvTmV4dENvbnRhaW5lck5vZGUobV9wQ3VyQ2hpbGROb2RlLCBtX25DdXJDaGlsZE5vZGVTdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRm9ybU5vZGUsIHRydWUpOworICAgICAgICAgIGlmIChiQ3JlYXRlUGFnZSkgeworICAgICAgICAgICAgYkZvcmNlRW5kUGFnZSA9IHRydWU7CisgICAgICAgICAgICBiSXNNYW51YWxCcmVhayA9IHRydWU7CisgICAgICAgICAgICBpZiAobV9uQ3VyQ2hpbGROb2RlU3RhZ2UgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkRvbmUpCisgICAgICAgICAgICAgIGJCcmVha0RvbmUgPSB0cnVlOworICAgICAgICAgIH0KKyAgICAgICAgICBnb3RvIFN1c3BlbmRBbmRDcmVhdGVOZXdSb3c7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6Qm9va2VuZExlYWRlcjogeworICAgICAgICAgIENYRkFfTm9kZSogcExlYWRlck5vZGUgPSBudWxscHRyOworICAgICAgICAgIGlmIChtX3BDdXJDaGlsZFByZXByb2Nlc3NvcikgeworICAgICAgICAgICAgcFByb2Nlc3Nvci5yZXNldChtX3BDdXJDaGlsZFByZXByb2Nlc3Nvcik7CisgICAgICAgICAgICBtX3BDdXJDaGlsZFByZXByb2Nlc3NvciA9IG51bGxwdHI7CisgICAgICAgICAgfSBlbHNlIGlmIChtX3BQYWdlTWdyICYmCisgICAgICAgICAgICAgICAgICAgICBtX3BQYWdlTWdyLT5Qcm9jZXNzQm9va2VuZExlYWRlck9yVHJhaWxlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJDaGlsZE5vZGUsIHRydWUsIHBMZWFkZXJOb2RlKSkgeworICAgICAgICAgICAgcFByb2Nlc3NvciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I+KAorICAgICAgICAgICAgICAgIHBMZWFkZXJOb2RlLCBtX3BQYWdlTWdyKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAocFByb2Nlc3NvcikgeworICAgICAgICAgICAgaWYgKEluc2VydEZsb3dlZEl0ZW0oCisgICAgICAgICAgICAgICAgICAgIHRoaXMsIHBQcm9jZXNzb3IuZ2V0KCksIGJDb250YWluZXJXaWR0aEF1dG9TaXplLAorICAgICAgICAgICAgICAgICAgICBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGNvbnRhaW5lclNpemUuaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBlRmxvd1N0cmF0ZWd5LCAmdUN1ckhBbGlnblN0YXRlLCByZ0N1ckxpbmVMYXlvdXRJdGVtcywKKyAgICAgICAgICAgICAgICAgICAgYlVzZUJyZWFrQ29udHJvbCwgZkF2YWlsSGVpZ2h0LCBmUmVhbEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRXaWR0aExpbWl0LCAmZkNvbnRlbnRDdXJSb3dZLAorICAgICAgICAgICAgICAgICAgICAmZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLCAmZkNvbnRlbnRDdXJSb3dIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICZiQWRkZWRJdGVtSW5Sb3csICZiRm9yY2VFbmRQYWdlLCBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpEb25lKSB7CisgICAgICAgICAgICAgIGdvdG8gU3VzcGVuZEFuZENyZWF0ZU5ld1JvdzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHBQcm9jZXNzb3IucmVzZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6Qm9va2VuZFRyYWlsZXI6IHsKKyAgICAgICAgICBDWEZBX05vZGUqIHBUcmFpbGVyTm9kZSA9IG51bGxwdHI7CisgICAgICAgICAgaWYgKG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yKSB7CisgICAgICAgICAgICBwUHJvY2Vzc29yLnJlc2V0KG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yKTsKKyAgICAgICAgICAgIG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yID0gbnVsbHB0cjsKKyAgICAgICAgICB9IGVsc2UgaWYgKG1fcFBhZ2VNZ3IgJiYKKyAgICAgICAgICAgICAgICAgICAgIG1fcFBhZ2VNZ3ItPlByb2Nlc3NCb29rZW5kTGVhZGVyT3JUcmFpbGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1ckNoaWxkTm9kZSwgZmFsc2UsIHBUcmFpbGVyTm9kZSkpIHsKKyAgICAgICAgICAgIHBQcm9jZXNzb3IgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yPigKKyAgICAgICAgICAgICAgICBwVHJhaWxlck5vZGUsIG1fcFBhZ2VNZ3IpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAocFByb2Nlc3NvcikgeworICAgICAgICAgICAgaWYgKEluc2VydEZsb3dlZEl0ZW0oCisgICAgICAgICAgICAgICAgICAgIHRoaXMsIHBQcm9jZXNzb3IuZ2V0KCksIGJDb250YWluZXJXaWR0aEF1dG9TaXplLAorICAgICAgICAgICAgICAgICAgICBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGNvbnRhaW5lclNpemUuaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBlRmxvd1N0cmF0ZWd5LCAmdUN1ckhBbGlnblN0YXRlLCByZ0N1ckxpbmVMYXlvdXRJdGVtcywKKyAgICAgICAgICAgICAgICAgICAgYlVzZUJyZWFrQ29udHJvbCwgZkF2YWlsSGVpZ2h0LCBmUmVhbEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRXaWR0aExpbWl0LCAmZkNvbnRlbnRDdXJSb3dZLAorICAgICAgICAgICAgICAgICAgICAmZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLCAmZkNvbnRlbnRDdXJSb3dIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICZiQWRkZWRJdGVtSW5Sb3csICZiRm9yY2VFbmRQYWdlLCBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpEb25lKSB7CisgICAgICAgICAgICAgIGdvdG8gU3VzcGVuZEFuZENyZWF0ZU5ld1JvdzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHBQcm9jZXNzb3IucmVzZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6Q29udGFpbmVyOiB7CisgICAgICAgICAgQVNTRVJUKG1fcEN1ckNoaWxkTm9kZS0+SXNDb250YWluZXJOb2RlKCkpOworICAgICAgICAgIGlmIChtX3BDdXJDaGlsZE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlZhcmlhYmxlcykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGlmIChmQ29udGVudEN1clJvd1kgPj0gZkhlaWdodExpbWl0ICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04gJiYKKyAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShtX3BDdXJDaGlsZE5vZGUpKSB7CisgICAgICAgICAgICBiRm9yY2VFbmRQYWdlID0gdHJ1ZTsKKyAgICAgICAgICAgIGdvdG8gU3VzcGVuZEFuZENyZWF0ZU5ld1JvdzsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCFtX3BDdXJDaGlsZE5vZGUtPklzQ29udGFpbmVyTm9kZSgpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICBib29sIGJOZXdSb3cgPSBmYWxzZTsKKyAgICAgICAgICBpZiAobV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IpIHsKKyAgICAgICAgICAgIHBQcm9jZXNzb3IucmVzZXQobV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IpOworICAgICAgICAgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IgPSBudWxscHRyOworICAgICAgICAgICAgYk5ld1JvdyA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBQcm9jZXNzb3IgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yPigKKyAgICAgICAgICAgICAgICBtX3BDdXJDaGlsZE5vZGUsIG1fcFBhZ2VNZ3IpOworICAgICAgICAgIH0KKworICAgICAgICAgIEluc2VydFBlbmRpbmdJdGVtcyhwUHJvY2Vzc29yLmdldCgpLCBtX3BDdXJDaGlsZE5vZGUpOworICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IHJzID0gSW5zZXJ0Rmxvd2VkSXRlbSgKKyAgICAgICAgICAgICAgdGhpcywgcFByb2Nlc3Nvci5nZXQoKSwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsCisgICAgICAgICAgICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgY29udGFpbmVyU2l6ZS5oZWlnaHQsIGVGbG93U3RyYXRlZ3ksCisgICAgICAgICAgICAgICZ1Q3VySEFsaWduU3RhdGUsIHJnQ3VyTGluZUxheW91dEl0ZW1zLCBiVXNlQnJlYWtDb250cm9sLAorICAgICAgICAgICAgICBmQXZhaWxIZWlnaHQsIGZSZWFsSGVpZ2h0LCBmQ29udGVudFdpZHRoTGltaXQsICZmQ29udGVudEN1clJvd1ksCisgICAgICAgICAgICAgICZmQ29udGVudEN1clJvd0F2YWlsV2lkdGgsICZmQ29udGVudEN1clJvd0hlaWdodCwKKyAgICAgICAgICAgICAgJmJBZGRlZEl0ZW1JblJvdywgJmJGb3JjZUVuZFBhZ2UsIHBDb250ZXh0LCBiTmV3Um93KTsKKyAgICAgICAgICBzd2l0Y2ggKHJzKSB7CisgICAgICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpNYW51YWxCcmVhazoKKyAgICAgICAgICAgICAgYklzTWFudWFsQnJlYWsgPSB0cnVlOworICAgICAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6UGFnZUZ1bGxCcmVhazoKKyAgICAgICAgICAgICAgYkZvcmNlRW5kUGFnZSA9IHRydWU7CisgICAgICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpSb3dGdWxsQnJlYWs6CisgICAgICAgICAgICAgIGdvdG8gU3VzcGVuZEFuZENyZWF0ZU5ld1JvdzsKKyAgICAgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OkRvbmU6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBmQ29udGVudEN1clJvd1kgKz0KKyAgICAgICAgICAgICAgICAgIEluc2VydFBlbmRpbmdJdGVtcyhwUHJvY2Vzc29yLmdldCgpLCBtX3BDdXJDaGlsZE5vZGUpOworICAgICAgICAgICAgICBwUHJvY2Vzc29yLnJlc2V0KCk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkRvbmU6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBHb3RvTmV4dENvbnRhaW5lck5vZGUobV9wQ3VyQ2hpbGROb2RlLCBtX25DdXJDaGlsZE5vZGVTdGFnZSwgbV9wRm9ybU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgICBpZiAoYkFkZGVkSXRlbUluUm93ICYmIGVGbG93U3RyYXRlZ3kgPT0gWEZBX0F0dHJpYnV0ZUVudW06OlRiKQorICAgICAgICBicmVhazsKKyAgICAgIGNvbnRpbnVlOworICAgIFN1c3BlbmRBbmRDcmVhdGVOZXdSb3c6CisgICAgICBpZiAocFByb2Nlc3NvcikKKyAgICAgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IgPSBwUHJvY2Vzc29yLnJlbGVhc2UoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIENhbGN1bGF0ZVJvd0NoaWxkUG9zaXRpb24oCisgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zLCBlRmxvd1N0cmF0ZWd5LCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsCisgICAgICAgIGJDb250YWluZXJXaWR0aEF1dG9TaXplLCAmZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsCisgICAgICAgICZmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsICZmQ29udGVudEN1clJvd1ksIGZDb250ZW50Q3VyUm93SGVpZ2h0LAorICAgICAgICBmQ29udGVudFdpZHRoTGltaXQsIGJSb290Rm9yY2VUYik7CisgICAgbV9mV2lkdGhMaW1pdGUgPSBmQ29udGVudEN1clJvd0F2YWlsV2lkdGg7CisgICAgaWYgKGJGb3JjZUVuZFBhZ2UpCisgICAgICBicmVhazsKKyAgfQorCisgIGJvb2wgYlJldFZhbHVlID0KKyAgICAgIG1fbkN1ckNoaWxkTm9kZVN0YWdlID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzOjpEb25lICYmCisgICAgICBtX1BlbmRpbmdOb2Rlcy5lbXB0eSgpOworICBpZiAoYkJyZWFrRG9uZSkKKyAgICBiUmV0VmFsdWUgPSBmYWxzZTsKKworICBjb250YWluZXJTaXplID0gQ2FsY3VsYXRlQ29udGFpbmVyQ29tcG9uZW50U2l6ZUZyb21Db250ZW50U2l6ZSgKKyAgICAgIG1fcEZvcm1Ob2RlLCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsCisgICAgICBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwgY29udGFpbmVyU2l6ZSk7CisKKyAgaWYgKGNvbnRhaW5lclNpemUuaGVpZ2h0ID49IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OIHx8IG1fcExheW91dEl0ZW0gfHwKKyAgICAgIGJSZXRWYWx1ZSkgeworICAgIGlmICghbV9wTGF5b3V0SXRlbSkKKyAgICAgIG1fcExheW91dEl0ZW0gPSBDcmVhdGVDb250ZW50TGF5b3V0SXRlbShtX3BGb3JtTm9kZSk7CisgICAgY29udGFpbmVyU2l6ZS5oZWlnaHQgPSBzdGQ6Om1heChjb250YWluZXJTaXplLmhlaWdodCwgMC5mKTsKKworICAgIFNldEN1cnJlbnRDb21wb25lbnRTaXplKGNvbnRhaW5lclNpemUpOworICAgIGlmIChiRm9yY2VFbmRQYWdlKQorICAgICAgbV9mVXNlZFNpemUgPSAwOworICAgIGVsc2UKKyAgICAgIG1fZlVzZWRTaXplICs9IG1fcExheW91dEl0ZW0tPm1fc1NpemUuaGVpZ2h0OworICB9CisKKyAgcmV0dXJuIGJSZXRWYWx1ZQorICAgICAgICAgICAgID8gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OkRvbmUKKyAgICAgICAgICAgICA6IChiSXNNYW51YWxCcmVhayA/IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpNYW51YWxCcmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OlBhZ2VGdWxsQnJlYWspOworfQorCitib29sIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6Q2FsY3VsYXRlUm93Q2hpbGRQb3NpdGlvbigKKyAgICBzdGQ6OnZlY3RvcjxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4gKCZyZ0N1ckxpbmVMYXlvdXRJdGVtcylbM10sCisgICAgWEZBX0F0dHJpYnV0ZUVudW0gZUZsb3dTdHJhdGVneSwKKyAgICBib29sIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwKKyAgICBib29sIGJDb250YWluZXJXaWR0aEF1dG9TaXplLAorICAgIGZsb2F0KiBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCwKKyAgICBmbG9hdCogZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0LAorICAgIGZsb2F0KiBmQ29udGVudEN1clJvd1ksCisgICAgZmxvYXQgZkNvbnRlbnRDdXJSb3dIZWlnaHQsCisgICAgZmxvYXQgZkNvbnRlbnRXaWR0aExpbWl0LAorICAgIGJvb2wgYlJvb3RGb3JjZVRiKSB7CisgIGludDMyX3Qgbkdyb3VwTGVuZ3Roc1szXSA9IHswLCAwLCAwfTsKKyAgZmxvYXQgZkdyb3VwV2lkdGhzWzNdID0gezAsIDAsIDB9OworICBpbnQzMl90IG5Ub3RhbExlbmd0aCA9IDA7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgIG5Hcm91cExlbmd0aHNbaV0gPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHJnQ3VyTGluZUxheW91dEl0ZW1zW2ldKTsKKyAgICBmb3IgKGludDMyX3QgYyA9IG5Hcm91cExlbmd0aHNbaV0sIGogPSAwOyBqIDwgYzsgaisrKSB7CisgICAgICBuVG90YWxMZW5ndGgrKzsKKyAgICAgIGlmIChYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKAorICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1tpXVtqXS0+bV9wRm9ybU5vZGUpKSB7CisgICAgICAgIGZHcm91cFdpZHRoc1tpXSArPSByZ0N1ckxpbmVMYXlvdXRJdGVtc1tpXVtqXS0+bV9zU2l6ZS53aWR0aDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKCFuVG90YWxMZW5ndGgpIHsKKyAgICBpZiAoYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKSB7CisgICAgICAqZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0KKyAgICAgICAgICBzdGQ6Om1pbigqZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0LCAqZkNvbnRlbnRDdXJSb3dZKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghbV9wTGF5b3V0SXRlbSkKKyAgICBtX3BMYXlvdXRJdGVtID0gQ3JlYXRlQ29udGVudExheW91dEl0ZW0obV9wRm9ybU5vZGUpOworCisgIGlmIChlRmxvd1N0cmF0ZWd5ICE9IFhGQV9BdHRyaWJ1dGVFbnVtOjpSbF90YikgeworICAgIGZsb2F0IGZDdXJQb3M7CisgICAgZkN1clBvcyA9IDA7CisgICAgZm9yIChpbnQzMl90IGMgPSBuR3JvdXBMZW5ndGhzWzBdLCBqID0gMDsgaiA8IGM7IGorKykgeworICAgICAgaWYgKGJSb290Rm9yY2VUYikgeworICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1swXVtqXS0+bV9zUG9zID0gQ2FsY3VsYXRlUG9zaXRpb25lZENvbnRhaW5lclBvcygKKyAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdLT5tX3BGb3JtTm9kZSwKKyAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdLT5tX3NTaXplKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdLT5tX3NQb3MgPQorICAgICAgICAgICAgQ0ZYX1BvaW50RihmQ3VyUG9zLCAqZkNvbnRlbnRDdXJSb3dZKTsKKyAgICAgICAgaWYgKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UoCisgICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0tPm1fcEZvcm1Ob2RlKSkgeworICAgICAgICAgIGZDdXJQb3MgKz0gcmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0tPm1fc1NpemUud2lkdGg7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG1fcExheW91dEl0ZW0tPkFkZENoaWxkKHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdKTsKKyAgICAgIG1fZkxhc3RSb3dXaWR0aCA9IGZDdXJQb3M7CisgICAgfQorICAgIGZDdXJQb3MgPSAoZkNvbnRlbnRXaWR0aExpbWl0ICsgZkdyb3VwV2lkdGhzWzBdIC0gZkdyb3VwV2lkdGhzWzFdIC0KKyAgICAgICAgICAgICAgIGZHcm91cFdpZHRoc1syXSkgLworICAgICAgICAgICAgICAyOworICAgIGZvciAoaW50MzJfdCBjID0gbkdyb3VwTGVuZ3Roc1sxXSwgaiA9IDA7IGogPCBjOyBqKyspIHsKKyAgICAgIGlmIChiUm9vdEZvcmNlVGIpIHsKKyAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fc1BvcyA9IENhbGN1bGF0ZVBvc2l0aW9uZWRDb250YWluZXJQb3MoCisgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXS0+bV9wRm9ybU5vZGUsCisgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXS0+bV9zU2l6ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXS0+bV9zUG9zID0KKyAgICAgICAgICAgIENGWF9Qb2ludEYoZkN1clBvcywgKmZDb250ZW50Q3VyUm93WSk7CisgICAgICAgIGlmIChYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKAorICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzFdW2pdLT5tX3BGb3JtTm9kZSkpIHsKKyAgICAgICAgICBmQ3VyUG9zICs9IHJnQ3VyTGluZUxheW91dEl0ZW1zWzFdW2pdLT5tX3NTaXplLndpZHRoOworICAgICAgICB9CisgICAgICB9CisgICAgICBtX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChyZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXSk7CisgICAgICBtX2ZMYXN0Um93V2lkdGggPSBmQ3VyUG9zOworICAgIH0KKyAgICBmQ3VyUG9zID0gZkNvbnRlbnRXaWR0aExpbWl0IC0gZkdyb3VwV2lkdGhzWzJdOworICAgIGZvciAoaW50MzJfdCBjID0gbkdyb3VwTGVuZ3Roc1syXSwgaiA9IDA7IGogPCBjOyBqKyspIHsKKyAgICAgIGlmIChiUm9vdEZvcmNlVGIpIHsKKyAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMl1bal0tPm1fc1BvcyA9IENhbGN1bGF0ZVBvc2l0aW9uZWRDb250YWluZXJQb3MoCisgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXS0+bV9wRm9ybU5vZGUsCisgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXS0+bV9zU2l6ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXS0+bV9zUG9zID0KKyAgICAgICAgICAgIENGWF9Qb2ludEYoZkN1clBvcywgKmZDb250ZW50Q3VyUm93WSk7CisgICAgICAgIGlmIChYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKAorICAgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3BGb3JtTm9kZSkpIHsKKyAgICAgICAgICBmQ3VyUG9zICs9IHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3NTaXplLndpZHRoOworICAgICAgICB9CisgICAgICB9CisgICAgICBtX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChyZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXSk7CisgICAgICBtX2ZMYXN0Um93V2lkdGggPSBmQ3VyUG9zOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmbG9hdCBmQ3VyUG9zOworICAgIGZDdXJQb3MgPSBmR3JvdXBXaWR0aHNbMF07CisgICAgZm9yIChpbnQzMl90IGMgPSBuR3JvdXBMZW5ndGhzWzBdLCBqID0gMDsgaiA8IGM7IGorKykgeworICAgICAgaWYgKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UoCisgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdLT5tX3BGb3JtTm9kZSkpIHsKKyAgICAgICAgZkN1clBvcyAtPSByZ0N1ckxpbmVMYXlvdXRJdGVtc1swXVtqXS0+bV9zU2l6ZS53aWR0aDsKKyAgICAgIH0KKyAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdLT5tX3NQb3MgPQorICAgICAgICAgIENGWF9Qb2ludEYoZkN1clBvcywgKmZDb250ZW50Q3VyUm93WSk7CisgICAgICBtX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChyZ0N1ckxpbmVMYXlvdXRJdGVtc1swXVtqXSk7CisgICAgICBtX2ZMYXN0Um93V2lkdGggPSBmQ3VyUG9zOworICAgIH0KKyAgICBmQ3VyUG9zID0gKGZDb250ZW50V2lkdGhMaW1pdCArIGZHcm91cFdpZHRoc1swXSArIGZHcm91cFdpZHRoc1sxXSAtCisgICAgICAgICAgICAgICBmR3JvdXBXaWR0aHNbMl0pIC8KKyAgICAgICAgICAgICAgMjsKKyAgICBmb3IgKGludDMyX3QgYyA9IG5Hcm91cExlbmd0aHNbMV0sIGogPSAwOyBqIDwgYzsgaisrKSB7CisgICAgICBpZiAoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZSgKKyAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fcEZvcm1Ob2RlKSkgeworICAgICAgICBmQ3VyUG9zIC09IHJnQ3VyTGluZUxheW91dEl0ZW1zWzFdW2pdLT5tX3NTaXplLndpZHRoOworICAgICAgfQorICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fc1BvcyA9CisgICAgICAgICAgQ0ZYX1BvaW50RihmQ3VyUG9zLCAqZkNvbnRlbnRDdXJSb3dZKTsKKyAgICAgIG1fcExheW91dEl0ZW0tPkFkZENoaWxkKHJnQ3VyTGluZUxheW91dEl0ZW1zWzFdW2pdKTsKKyAgICAgIG1fZkxhc3RSb3dXaWR0aCA9IGZDdXJQb3M7CisgICAgfQorICAgIGZDdXJQb3MgPSBmQ29udGVudFdpZHRoTGltaXQ7CisgICAgZm9yIChpbnQzMl90IGMgPSBuR3JvdXBMZW5ndGhzWzJdLCBqID0gMDsgaiA8IGM7IGorKykgeworICAgICAgaWYgKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UoCisgICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3BGb3JtTm9kZSkpIHsKKyAgICAgICAgZkN1clBvcyAtPSByZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXS0+bV9zU2l6ZS53aWR0aDsKKyAgICAgIH0KKyAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3NQb3MgPQorICAgICAgICAgIENGWF9Qb2ludEYoZkN1clBvcywgKmZDb250ZW50Q3VyUm93WSk7CisgICAgICBtX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChyZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXSk7CisgICAgICBtX2ZMYXN0Um93V2lkdGggPSBmQ3VyUG9zOworICAgIH0KKyAgfQorICBtX2ZMYXN0Um93WSA9ICpmQ29udGVudEN1clJvd1k7CisgICpmQ29udGVudEN1clJvd1kgKz0gZkNvbnRlbnRDdXJSb3dIZWlnaHQ7CisgIGlmIChiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSkgeworICAgIGZsb2F0IGZDaGlsZFN1cHBsaWVkV2lkdGggPSBmR3JvdXBXaWR0aHNbMF07CisgICAgaWYgKGZDb250ZW50V2lkdGhMaW1pdCA8IEZMVF9NQVggJiYKKyAgICAgICAgZkNvbnRlbnRXaWR0aExpbWl0ID4gZkNoaWxkU3VwcGxpZWRXaWR0aCkgeworICAgICAgZkNoaWxkU3VwcGxpZWRXaWR0aCA9IGZDb250ZW50V2lkdGhMaW1pdDsKKyAgICB9CisgICAgKmZDb250ZW50Q2FsY3VsYXRlZFdpZHRoID0KKyAgICAgICAgc3RkOjptYXgoKmZDb250ZW50Q2FsY3VsYXRlZFdpZHRoLCBmQ2hpbGRTdXBwbGllZFdpZHRoKTsKKyAgfQorICBpZiAoYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKSB7CisgICAgKmZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA9CisgICAgICAgIHN0ZDo6bWF4KCpmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsICpmQ29udGVudEN1clJvd1kpOworICB9CisgIHJldHVybiB0cnVlOworfQorCitDWEZBX05vZGUqIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6R2V0U3ViZm9ybVNldFBhcmVudCgKKyAgICBDWEZBX05vZGUqIHBTdWJmb3JtU2V0KSB7CisgIGlmIChwU3ViZm9ybVNldCAmJiBwU3ViZm9ybVNldC0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6U3ViZm9ybVNldCkgeworICAgIENYRkFfTm9kZSogcFBhcmVudCA9IHBTdWJmb3JtU2V0LT5HZXRQYXJlbnQoKTsKKyAgICB3aGlsZSAocFBhcmVudCkgeworICAgICAgaWYgKHBQYXJlbnQtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm1TZXQpCisgICAgICAgIHJldHVybiBwUGFyZW50OworICAgICAgcFBhcmVudCA9IHBQYXJlbnQtPkdldFBhcmVudCgpOworICAgIH0KKyAgfQorICByZXR1cm4gcFN1YmZvcm1TZXQ7Cit9CisKK3ZvaWQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpEb0xheW91dEZpZWxkKCkgeworICBpZiAobV9wTGF5b3V0SXRlbSkKKyAgICByZXR1cm47CisKKyAgQVNTRVJUKG1fcEN1ckNoaWxkTm9kZSA9PSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFKTsKKyAgbV9wTGF5b3V0SXRlbSA9IENyZWF0ZUNvbnRlbnRMYXlvdXRJdGVtKG1fcEZvcm1Ob2RlKTsKKyAgaWYgKCFtX3BMYXlvdXRJdGVtKQorICAgIHJldHVybjsKKworICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBtX3BGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKTsKKyAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IHBEb2N1bWVudC0+R2V0Tm90aWZ5KCk7CisgIENGWF9TaXplRiBzaXplKC0xLCAtMSk7CisgIHBOb3RpZnktPlN0YXJ0RmllbGREcmF3TGF5b3V0KG1fcEZvcm1Ob2RlLCBzaXplLndpZHRoLCBzaXplLmhlaWdodCk7CisKKyAgaW50MzJfdCBuUm90YXRlID0gWEZBX01hcFJvdGF0aW9uKAorICAgICAgbV9wRm9ybU5vZGUtPkpTT2JqZWN0KCktPkdldEludGVnZXIoWEZBX0F0dHJpYnV0ZTo6Um90YXRlKSk7CisgIGlmIChuUm90YXRlID09IDkwIHx8IG5Sb3RhdGUgPT0gMjcwKQorICAgIHN0ZDo6c3dhcChzaXplLndpZHRoLCBzaXplLmhlaWdodCk7CisKKyAgU2V0Q3VycmVudENvbXBvbmVudFNpemUoc2l6ZSk7Cit9CisKK1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6RG9MYXlvdXQoCisgICAgYm9vbCBiVXNlQnJlYWtDb250cm9sLAorICAgIGZsb2F0IGZIZWlnaHRMaW1pdCwKKyAgICBmbG9hdCBmUmVhbEhlaWdodCwKKyAgICBDWEZBX0xheW91dENvbnRleHQqIHBDb250ZXh0KSB7CisgIHN3aXRjaCAobV9wRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkpIHsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTdWJmb3JtOgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkFyZWE6CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RXhjbEdyb3VwOgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlN1YmZvcm1TZXQ6IHsKKyAgICAgIGJvb2wgYlJvb3RGb3JjZVRiID0gZmFsc2U7CisgICAgICBDWEZBX05vZGUqIHBMYXlvdXROb2RlID0gR2V0U3ViZm9ybVNldFBhcmVudChtX3BGb3JtTm9kZSk7CisgICAgICBYRkFfQXR0cmlidXRlRW51bSBlTGF5b3V0U3RyYXRlZ3kgPSBHZXRMYXlvdXQocExheW91dE5vZGUsICZiUm9vdEZvcmNlVGIpOworICAgICAgc3dpdGNoIChlTGF5b3V0U3RyYXRlZ3kpIHsKKyAgICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6VGI6CisgICAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkxyX3RiOgorICAgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpSbF90YjoKKyAgICAgICAgICByZXR1cm4gRG9MYXlvdXRGbG93ZWRDb250YWluZXIoYlVzZUJyZWFrQ29udHJvbCwgZUxheW91dFN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmSGVpZ2h0TGltaXQsIGZSZWFsSGVpZ2h0LCBwQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlJvb3RGb3JjZVRiKTsKKyAgICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6UG9zaXRpb246CisgICAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OlJvdzoKKyAgICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6Umxfcm93OgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIERvTGF5b3V0UG9zaXRpb25lZENvbnRhaW5lcihwQ29udGV4dCk7CisgICAgICAgICAgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6RG9uZTsKKyAgICAgICAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OkRvbmU7CisgICAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OlRhYmxlOgorICAgICAgICAgIERvTGF5b3V0VGFibGVDb250YWluZXIocExheW91dE5vZGUpOworICAgICAgICAgIG1fbkN1ckNoaWxkTm9kZVN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkRvbmU7CisgICAgICAgICAgcmV0dXJuIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpEb25lOworICAgICAgfQorICAgIH0KKyAgICBjYXNlIFhGQV9FbGVtZW50OjpEcmF3OgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkZpZWxkOgorICAgICAgRG9MYXlvdXRGaWVsZCgpOworICAgICAgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6RG9uZTsKKyAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6RG9uZTsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDb250ZW50QXJlYToKKyAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6RG9uZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpEb25lOworICB9Cit9CisKK0NGWF9TaXplRiBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkdldEN1cnJlbnRDb21wb25lbnRTaXplKCkgeworICByZXR1cm4gQ0ZYX1NpemVGKG1fcExheW91dEl0ZW0tPm1fc1NpemUud2lkdGgsIG1fcExheW91dEl0ZW0tPm1fc1NpemUuaGVpZ2h0KTsKK30KKwordm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OlNldEN1cnJlbnRDb21wb25lbnRQb3MoY29uc3QgQ0ZYX1BvaW50RiYgcG9zKSB7CisgIG1fcExheW91dEl0ZW0tPm1fc1BvcyA9IHBvczsKK30KKwordm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OlNldEN1cnJlbnRDb21wb25lbnRTaXplKGNvbnN0IENGWF9TaXplRiYgc2l6ZSkgeworICBtX3BMYXlvdXRJdGVtLT5tX3NTaXplID0gc2l6ZTsKK30KKworYm9vbCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6Okp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIoCisgICAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpIHsKKyAgaWYgKCFwRm9ybU5vZGUpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENYRkFfTm9kZSogcFRlbXBsYXRlID0gcEZvcm1Ob2RlLT5HZXRUZW1wbGF0ZU5vZGVJZkV4aXN0cygpOworICBpZiAoIXBUZW1wbGF0ZSkKKyAgICBwVGVtcGxhdGUgPSBwRm9ybU5vZGU7CisKKyAgaW50MzJfdCBpTWF4ID0KKyAgICAgIHBUZW1wbGF0ZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9PY2N1cj4oWEZBX0VsZW1lbnQ6Ok9jY3VyKS0+R2V0TWF4KCk7CisgIGlmIChpTWF4IDwgMCkKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpbnQzMl90IGlDb3VudCA9IG1fUGVuZGluZ05vZGVzQ291bnRbcFRlbXBsYXRlXTsKKyAgaWYgKGlDb3VudCA+PSBpTWF4KQorICAgIHJldHVybiBmYWxzZTsKKworICBtX1BlbmRpbmdOb2Rlc0NvdW50W3BUZW1wbGF0ZV0gPSBpQ291bnQgKyAxOworICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2l0ZW1sYXlvdXRwcm9jZXNzb3IuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2l0ZW1sYXlvdXRwcm9jZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTc4MDk1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaXRlbWxheW91dHByb2Nlc3Nvci5oCkBAIC0wLDAgKzEsMTcxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfSVRFTUxBWU9VVFBST0NFU1NPUl9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9JVEVNTEFZT1VUUFJPQ0VTU09SX0hfCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmFfYmFzaWMuaCIKKworI2RlZmluZSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFICgoQ1hGQV9Ob2RlKikoaW50cHRyX3QpLTEpCisjZGVmaW5lIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OICgwLjAwMDVmKQorCitjbGFzcyBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW07CitjbGFzcyBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtOworY2xhc3MgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOworY2xhc3MgQ1hGQV9MYXlvdXRDb250ZXh0OworY2xhc3MgQ1hGQV9MYXlvdXRQYWdlTWdyOworY2xhc3MgQ1hGQV9MYXlvdXRQcm9jZXNzb3I7CitjbGFzcyBDWEZBX05vZGU7CisKK2VudW0gY2xhc3MgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQgeworICBEb25lLAorICBQYWdlRnVsbEJyZWFrLAorICBSb3dGdWxsQnJlYWssCisgIE1hbnVhbEJyZWFrLAorfTsKKworZW51bSBjbGFzcyBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlcyB7CisgIE5vbmUsCisgIEJvb2tlbmRMZWFkZXIsCisgIEJyZWFrQmVmb3JlLAorICBLZWVwLAorICBDb250YWluZXIsCisgIEJyZWFrQWZ0ZXIsCisgIEJvb2tlbmRUcmFpbGVyLAorICBEb25lLAorfTsKKworYm9vbCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKENYRkFfTm9kZSogcE5vZGUpOworCitjbGFzcyBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IgeworIHB1YmxpYzoKKyAgc3RhdGljIGJvb2wgSW5jcmVtZW50UmVsYXlvdXROb2RlKENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUpOworCisgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvcihDWEZBX05vZGUqIHBOb2RlLCBDWEZBX0xheW91dFBhZ2VNZ3IqIHBQYWdlTWdyKTsKKyAgfkNYRkFfSXRlbUxheW91dFByb2Nlc3NvcigpOworCisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IERvTGF5b3V0KGJvb2wgYlVzZUJyZWFrQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZkhlaWdodExpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmUmVhbEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRDb250ZXh0KiBwQ29udGV4dCk7CisgIHZvaWQgRG9MYXlvdXRQYWdlQXJlYShDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBQYWdlQXJlYUxheW91dEl0ZW0pOworCisgIENGWF9TaXplRiBHZXRDdXJyZW50Q29tcG9uZW50U2l6ZSgpOworICBDWEZBX05vZGUqIEdldEZvcm1Ob2RlKCkgeyByZXR1cm4gbV9wRm9ybU5vZGU7IH0KKyAgYm9vbCBIYXNMYXlvdXRJdGVtKCkgY29uc3QgeyByZXR1cm4gISFtX3BMYXlvdXRJdGVtOyB9CisgIENYRkFfQ29udGVudExheW91dEl0ZW0qIEV4dHJhY3RMYXlvdXRJdGVtKCk7CisgIHZvaWQgU3BsaXRMYXlvdXRJdGVtKGZsb2F0IGZTcGxpdFBvcyk7CisKKyAgZmxvYXQgRmluZFNwbGl0UG9zKGZsb2F0IGZQcm9wb3NlZFNwbGl0UG9zKTsKKworICBib29sIFByb2Nlc3NLZWVwRm9yU3BsaXQoCisgICAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQYXJlbnRQcm9jZXNzb3IsCisgICAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBDaGlsZFByb2Nlc3NvciwKKyAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IGVSZXRWYWx1ZSwKKyAgICAgIHN0ZDo6dmVjdG9yPENYRkFfQ29udGVudExheW91dEl0ZW0qPiogcmdDdXJMaW5lTGF5b3V0SXRlbSwKKyAgICAgIGZsb2F0KiBmQ29udGVudEN1clJvd0F2YWlsV2lkdGgsCisgICAgICBmbG9hdCogZkNvbnRlbnRDdXJSb3dIZWlnaHQsCisgICAgICBmbG9hdCogZkNvbnRlbnRDdXJSb3dZLAorICAgICAgYm9vbCogYkFkZGVkSXRlbUluUm93LAorICAgICAgYm9vbCogYkZvcmNlRW5kUGFnZSwKKyAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0KiByZXN1bHQpOworICB2b2lkIFByb2Nlc3NVblVzZU92ZXJGbG93KENYRkFfTm9kZSogcExlYWRlck5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVHJhaWxlck5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFRyYWlsZXJJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlKTsKKyAgYm9vbCBJc0FkZE5ld1Jvd0ZvclRyYWlsZXIoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFRyYWlsZXJJdGVtKTsKKyAgYm9vbCBKdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKENYRkFfTm9kZSogcEZvcm1Ob2RlKTsKKworICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBDcmVhdGVDb250ZW50TGF5b3V0SXRlbShDWEZBX05vZGUqIHBGb3JtTm9kZSk7CisKKyAgQ1hGQV9Ob2RlKiBtX3BGb3JtTm9kZTsKKyAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogbV9wTGF5b3V0SXRlbTsKKyAgQ1hGQV9Ob2RlKiBtX3BDdXJDaGlsZE5vZGU7CisgIGZsb2F0IG1fZlVzZWRTaXplOworICBDWEZBX0xheW91dFBhZ2VNZ3IqIG1fcFBhZ2VNZ3I7CisgIHN0ZDo6bGlzdDxDWEZBX05vZGUqPiBtX1BlbmRpbmdOb2RlczsKKyAgYm9vbCBtX2JCcmVha1BlbmRpbmc7CisgIHN0ZDo6dmVjdG9yPGZsb2F0PiBtX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzOworICBzdGQ6OnZlY3RvcjxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4gbV9hcnJheUtlZXBJdGVtczsKKyAgZmxvYXQgbV9mTGFzdFJvd1dpZHRoOworICBmbG9hdCBtX2ZMYXN0Um93WTsKKyAgYm9vbCBtX2JVc2VJbmhlcmlhdGVkOworICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBtX2VQcmVQcm9jZXNzUnM7CisKKyBwcml2YXRlOgorICB2b2lkIFNldEN1cnJlbnRDb21wb25lbnRQb3MoY29uc3QgQ0ZYX1BvaW50RiYgcG9zKTsKKyAgdm9pZCBTZXRDdXJyZW50Q29tcG9uZW50U2l6ZShjb25zdCBDRlhfU2l6ZUYmIHNpemUpOworCisgIHZvaWQgU3BsaXRMYXlvdXRJdGVtKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXRJdGVtLAorICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwU2Vjb25kUGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmU3BsaXRQb3MpOworICBmbG9hdCBJbnNlcnRLZWVwTGF5b3V0SXRlbXMoKTsKKyAgYm9vbCBDYWxjdWxhdGVSb3dDaGlsZFBvc2l0aW9uKAorICAgICAgc3RkOjp2ZWN0b3I8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+ICgmcmdDdXJMaW5lTGF5b3V0SXRlbXMpWzNdLAorICAgICAgWEZBX0F0dHJpYnV0ZUVudW0gZUZsb3dTdHJhdGVneSwKKyAgICAgIGJvb2wgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLAorICAgICAgYm9vbCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwKKyAgICAgIGZsb2F0KiBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCwKKyAgICAgIGZsb2F0KiBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsCisgICAgICBmbG9hdCogZkNvbnRlbnRDdXJSb3dZLAorICAgICAgZmxvYXQgZkNvbnRlbnRDdXJSb3dIZWlnaHQsCisgICAgICBmbG9hdCBmQ29udGVudFdpZHRoTGltaXQsCisgICAgICBib29sIGJSb290Rm9yY2VUYik7CisgIHZvaWQgUHJvY2Vzc1VuVXNlQmluZHMoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpOworICBib29sIEp1ZGdlUHV0TmV4dFBhZ2UoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFBhcmVudExheW91dEl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmQ2hpbGRIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4qIHBLZWVwSXRlbXMpOworCisgIHZvaWQgRG9MYXlvdXRQb3NpdGlvbmVkQ29udGFpbmVyKENYRkFfTGF5b3V0Q29udGV4dCogcENvbnRleHQpOworICB2b2lkIERvTGF5b3V0VGFibGVDb250YWluZXIoQ1hGQV9Ob2RlKiBwTGF5b3V0Tm9kZSk7CisgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IERvTGF5b3V0Rmxvd2VkQ29udGFpbmVyKAorICAgICAgYm9vbCBiVXNlQnJlYWtDb250cm9sLAorICAgICAgWEZBX0F0dHJpYnV0ZUVudW0gZUZsb3dTdHJhdGVneSwKKyAgICAgIGZsb2F0IGZIZWlnaHRMaW1pdCwKKyAgICAgIGZsb2F0IGZSZWFsSGVpZ2h0LAorICAgICAgQ1hGQV9MYXlvdXRDb250ZXh0KiBwQ29udGV4dCwKKyAgICAgIGJvb2wgYlJvb3RGb3JjZVRiKTsKKyAgdm9pZCBEb0xheW91dEZpZWxkKCk7CisKKyAgdm9pZCBHb3RvTmV4dENvbnRhaW5lck5vZGUoQ1hGQV9Ob2RlKiYgcEN1ckFjdGlvbk5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzJiBuQ3VyU3RhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudENvbnRhaW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVXNlUGFnZUJyZWFrKTsKKworICBib29sIFByb2Nlc3NLZWVwTm9kZXNGb3JDaGVja05leHQoQ1hGQV9Ob2RlKiYgcEN1ckFjdGlvbk5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlcyYgbkN1clN0YWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiYgcE5leHRDb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiTGFzdEtlZXBOb2RlKTsKKworICBib29sIFByb2Nlc3NLZWVwTm9kZXNGb3JCcmVha0JlZm9yZShDWEZBX05vZGUqJiBwQ3VyQWN0aW9uTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXMmIG5DdXJTdGFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ29udGFpbmVyTm9kZSk7CisKKyAgQ1hGQV9Ob2RlKiBHZXRTdWJmb3JtU2V0UGFyZW50KENYRkFfTm9kZSogcFN1YmZvcm1TZXQpOworCisgIGJvb2wgbV9iS2VlcEJyZWFrRmluaXNoOworICBib29sIG1fYklzUHJvY2Vzc0tlZXA7CisgIENYRkFfTm9kZSogbV9wS2VlcEhlYWROb2RlOworICBDWEZBX05vZGUqIG1fcEtlZXBUYWlsTm9kZTsKKyAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogbV9wT2xkTGF5b3V0SXRlbTsKKyAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBtX3BDdXJDaGlsZFByZXByb2Nlc3NvcjsKKyAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXMgbV9uQ3VyQ2hpbGROb2RlU3RhZ2U7CisgIHN0ZDo6bWFwPENYRkFfTm9kZSosIGludDMyX3Q+IG1fUGVuZGluZ05vZGVzQ291bnQ7CisgIGZsb2F0IG1fZldpZHRoTGltaXRlOworICBib29sIG1fYkhhc0F2YWlsSGVpZ2h0OworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9JVEVNTEFZT1VUUFJPQ0VTU09SX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pdGVtcy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pdGVtcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZmZWRkYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2l0ZW1zLmNwcApAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pdGVtcy5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2l0ZW1zLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpQcmVzZW5jZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6VmlzaWJsZX0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlNhdmUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpCb29sZWFuLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMIml0ZW1zIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfSXRlbXM6OkNYRkFfSXRlbXMoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6Okl0ZW1zLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9JdGVtcz4odGhpcykpIHt9CisKK0NYRkFfSXRlbXM6On5DWEZBX0l0ZW1zKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2l0ZW1zLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pdGVtcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NmZhYmQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9pdGVtcy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9JVEVNU19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9JVEVNU19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0l0ZW1zIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0l0ZW1zKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfSXRlbXMoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfSVRFTVNfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2pvZy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9qb2cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MzVlMmYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9qb2cuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2pvZy5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwiam9nIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfSm9nOjpDWEZBX0pvZyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6Sm9nLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfSm9nOjp+Q1hGQV9Kb2coKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfam9nLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9qb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjZjY2QxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfam9nLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0pPR19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9KT0dfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9Kb2cgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfSm9nKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfSm9nKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0pPR19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfa2VlcC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9rZWVwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWIyMmZhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfa2VlcC5jcHAKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfa2VlcC5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2tlZXAuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5leHQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06Ok5vbmV9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlByZXZpb3VzLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpOb25lfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SW50YWN0LCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpOb25lfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwia2VlcCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0tlZXA6OkNYRkFfS2VlcChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6S2VlcCwKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfS2VlcD4odGhpcykpIHt9CisKK0NYRkFfS2VlcDo6fkNYRkFfS2VlcCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9rZWVwLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9rZWVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1M2Y5NgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2tlZXAuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfS0VFUF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9LRUVQX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfS2VlcCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9LZWVwKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfS2VlcCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9LRUVQX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9rZXl1c2FnZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9rZXl1c2FnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMwNTRiZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2tleXVzYWdlLmNwcApAQCAtMCwwICsxLDQ2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9rZXl1c2FnZS5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2tleXVzYWdlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6Tm9uUmVwdWRpYXRpb24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkVuY2lwaGVyT25seSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VHlwZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6T3B0aW9uYWx9LAorICAgIHtYRkFfQXR0cmlidXRlOjpEaWdpdGFsU2lnbmF0dXJlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpDcmxTaWduLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpLZXlBZ3JlZW1lbnQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OktleUVuY2lwaGVybWVudCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGF0YUVuY2lwaGVybWVudCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6S2V5Q2VydFNpZ24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkRlY2lwaGVyT25seSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwia2V5VXNhZ2UiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9LZXlVc2FnZTo6Q1hGQV9LZXlVc2FnZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6S2V5VXNhZ2UsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0tleVVzYWdlPih0aGlzKSkge30KKworQ1hGQV9LZXlVc2FnZTo6fkNYRkFfS2V5VXNhZ2UoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfa2V5dXNhZ2UuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2tleXVzYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1ODA3NAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2tleXVzYWdlLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0tFWVVTQUdFX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0tFWVVTQUdFX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfS2V5VXNhZ2UgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfS2V5VXNhZ2UoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9LZXlVc2FnZSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9LRVlVU0FHRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGFiZWxwcmludGVyLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xhYmVscHJpbnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTViMDRkYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xhYmVscHJpbnRlci5jcHAKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGFiZWxwcmludGVyLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHsKKyAgICB7WEZBX0VsZW1lbnQ6OkZvbnRJbmZvLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlhkYywgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpCYXRjaE91dHB1dCwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpGbGlwTGFiZWwsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OlpwbH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImxhYmVsUHJpbnRlciI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0xhYmVsUHJpbnRlcjo6Q1hGQV9MYWJlbFByaW50ZXIoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6TGFiZWxQcmludGVyLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfTGFiZWxQcmludGVyOjp+Q1hGQV9MYWJlbFByaW50ZXIoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGFiZWxwcmludGVyLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYWJlbHByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2Y1ZDNiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGFiZWxwcmludGVyLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0xBQkVMUFJJTlRFUl9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9MQUJFTFBSSU5URVJfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9MYWJlbFByaW50ZXIgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfTGFiZWxQcmludGVyKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfTGFiZWxQcmludGVyKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0xBQkVMUFJJTlRFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyOTMzZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dC5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0LmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJsYXlvdXQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9MYXlvdXQ6OkNYRkFfTGF5b3V0KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpMYXlvdXQsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9MYXlvdXQ6On5DWEZBX0xheW91dCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZTA2OWUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXQuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTEFZT1VUX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0xBWU9VVF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0xheW91dCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9MYXlvdXQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9MYXlvdXQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTEFZT1VUX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXRjb250ZXh0LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXRjb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzM2VlMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dGNvbnRleHQuaApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTEFZT1VUQ09OVEVYVF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9MQVlPVVRDT05URVhUX0hfCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK2NsYXNzIENYRkFfSXRlbUxheW91dFByb2Nlc3M7CitjbGFzcyBDWEZBX05vZGU7CisKK2NsYXNzIENYRkFfTGF5b3V0Q29udGV4dCB7CisgcHVibGljOgorICBDWEZBX0xheW91dENvbnRleHQoKQorICAgICAgOiBtX3ByZ1NwZWNpZmllZENvbHVtbldpZHRocyhudWxscHRyKSwKKyAgICAgICAgbV9mQ3VyQ29sdW1uV2lkdGgoMCksCisgICAgICAgIG1fYkN1ckNvbHVtbldpZHRoQXZhaWFibGUoZmFsc2UpLAorICAgICAgICBtX3BPdmVyZmxvd1Byb2Nlc3NvcihudWxscHRyKSwKKyAgICAgICAgbV9wT3ZlcmZsb3dOb2RlKG51bGxwdHIpIHt9CisgIH5DWEZBX0xheW91dENvbnRleHQoKSB7fQorCisgIHN0ZDo6dmVjdG9yPGZsb2F0PiogbV9wcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHM7CisgIGZsb2F0IG1fZkN1ckNvbHVtbldpZHRoOworICBib29sIG1fYkN1ckNvbHVtbldpZHRoQXZhaWFibGU7CisgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogbV9wT3ZlcmZsb3dQcm9jZXNzb3I7CisgIENYRkFfTm9kZSogbV9wT3ZlcmZsb3dOb2RlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9MQVlPVVRDT05URVhUX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXRpdGVtLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dGl0ZW0uY3BwCmluZGV4IDQ3NmQ2MTEuLjdmYjkyMWEgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dGl0ZW0uY3BwCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dGl0ZW0uY3BwCkBAIC02LDEwICs2LDEzIEBACiAKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXRpdGVtLmgiCiAKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2Zmbm90aWZ5LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X29iamVjdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZub3RpZnkuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb250YWluZXJsYXlvdXRpdGVtLmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29udGVudGxheW91dGl0ZW0uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tYXJnaW4uaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWFzdXJlbWVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKIAogdm9pZCBYRkFfUmVsZWFzZUxheW91dEl0ZW0oQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSkgewogICBDWEZBX0xheW91dEl0ZW0qIHBOb2RlID0gcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7CkBAIC0xOSwxMiArMjIsMTAgQEAKICAgd2hpbGUgKHBOb2RlKSB7CiAgICAgQ1hGQV9MYXlvdXRJdGVtKiBwTmV4dCA9IHBOb2RlLT5tX3BOZXh0U2libGluZzsKICAgICBwTm9kZS0+bV9wUGFyZW50ID0gbnVsbHB0cjsKLSAgICBwTm90aWZ5LT5PbkxheW91dEl0ZW1SZW1vdmluZyhwRG9jTGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENYRkFfTGF5b3V0SXRlbSo+KHBOb2RlKSk7CisgICAgcE5vdGlmeS0+T25MYXlvdXRJdGVtUmVtb3ZpbmcocERvY0xheW91dCwgcE5vZGUpOwogICAgIFhGQV9SZWxlYXNlTGF5b3V0SXRlbShwTm9kZSk7CiAgICAgcE5vZGUgPSBwTmV4dDsKICAgfQotCiAgIHBOb3RpZnktPk9uTGF5b3V0SXRlbVJlbW92aW5nKHBEb2NMYXlvdXQsIHBMYXlvdXRJdGVtKTsKICAgaWYgKHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6UGFnZUFyZWEpIHsKICAgICBwTm90aWZ5LT5PblBhZ2VFdmVudChzdGF0aWNfY2FzdDxDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qPihwTGF5b3V0SXRlbSksCkBAIC02NCw3ICs2NSw3IEBACiBDRlhfUmVjdEYgQ1hGQV9MYXlvdXRJdGVtOjpHZXRSZWN0KGJvb2wgYlJlbGF0aXZlKSBjb25zdCB7CiAgIEFTU0VSVChtX2JJc0NvbnRlbnRMYXlvdXRJdGVtKTsKIAotICBhdXRvIHBUaGlzID0gc3RhdGljX2Nhc3Q8Y29uc3QgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSo+KHRoaXMpOworICBhdXRvKiBwVGhpcyA9IHN0YXRpY19jYXN0PGNvbnN0IENYRkFfQ29udGVudExheW91dEl0ZW0qPih0aGlzKTsKICAgQ0ZYX1BvaW50RiBzUG9zID0gcFRoaXMtPm1fc1BvczsKICAgQ0ZYX1NpemVGIHNTaXplID0gcFRoaXMtPm1fc1NpemU7CiAgIGlmIChiUmVsYXRpdmUpCkBAIC03NCwyMyArNzUsMjggQEAKICAgICAgICBwTGF5b3V0SXRlbSA9IHBMYXlvdXRJdGVtLT5tX3BQYXJlbnQpIHsKICAgICBpZiAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcENvbnRlbnQgPSBwTGF5b3V0SXRlbS0+QXNDb250ZW50TGF5b3V0SXRlbSgpKSB7CiAgICAgICBzUG9zICs9IHBDb250ZW50LT5tX3NQb3M7Ci0gICAgICBDWEZBX05vZGUqIHBNYXJnaW5Ob2RlID0KLSAgICAgICAgICBwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpNYXJnaW4pOworICAgICAgQ1hGQV9NYXJnaW4qIHBNYXJnaW5Ob2RlID0KKyAgICAgICAgICBwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzPENYRkFfTWFyZ2luPigKKyAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6Ok1hcmdpbik7CiAgICAgICBpZiAocE1hcmdpbk5vZGUpIHsKLSAgICAgICAgc1BvcyArPSBDRlhfUG9pbnRGKHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTGVmdEluc2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub1VuaXQoWEZBX1VOSVRfUHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Ub3BJbnNldCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9Vbml0KFhGQV9VTklUX1B0KSk7CisgICAgICAgIHNQb3MgKz0gQ0ZYX1BvaW50RihwTWFyZ2luTm9kZS0+SlNPYmplY3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0TWVhc3VyZShYRkFfQXR0cmlidXRlOjpMZWZ0SW5zZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvVW5pdChYRkFfVW5pdDo6UHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1hcmdpbk5vZGUtPkpTT2JqZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6VG9wSW5zZXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvVW5pdChYRkFfVW5pdDo6UHQpKTsKICAgICAgIH0KICAgICAgIGNvbnRpbnVlOwogICAgIH0KIAogICAgIGlmIChwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0KICAgICAgICAgWEZBX0VsZW1lbnQ6OkNvbnRlbnRBcmVhKSB7Ci0gICAgICBzUG9zICs9IENGWF9Qb2ludEYocExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfWCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvVW5pdChYRkFfVU5JVF9QdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfWSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvVW5pdChYRkFfVU5JVF9QdCkpOworICAgICAgc1BvcyArPSBDRlhfUG9pbnRGKHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+SlNPYmplY3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6WCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvVW5pdChYRkFfVW5pdDo6UHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+SlNPYmplY3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6WSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvVW5pdChYRkFfVW5pdDo6UHQpKTsKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBpZiAocExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpQYWdlQXJlYSkKZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dHBhZ2VtZ3IuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0cGFnZW1nci5jcHAKaW5kZXggZjM4ZWYwZS4uMTIzY2FmYiAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0cGFnZW1nci5jcHAKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0cGFnZW1nci5jcHAKQEAgLTYsMjEgKzYsMzEgQEAKIAogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dHBhZ2VtZ3IuaCIKIAotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZub3RpZnkuaCIKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV9lbmdpbmUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfb2JqZWN0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZub3RpZnkuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb250YWluZXJsYXlvdXRpdGVtLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29udGVudGFyZWEuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb250ZW50bGF5b3V0aXRlbS5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaXRlbWxheW91dHByb2Nlc3Nvci5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dHByb2Nlc3Nvci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xvY2FsZW1nci5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21lYXN1cmVtZW50LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2NyaXB0Y29udGV4dC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21lZGl1bS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlaXRlcmF0b3J0ZW1wbGF0ZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX29iamVjdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX29jY3VyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFnZXNldC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3N1YmZvcm0uaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmF2ZXJzZXN0cmF0ZWd5X2NvbnRlbnRhcmVhY29udGFpbmVybGF5b3V0aXRlbS5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RyYXZlcnNlc3RyYXRlZ3lfbGF5b3V0aXRlbS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RyYXZlcnNlc3RyYXRlZ3lfeGZhY29udGFpbmVybm9kZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RyYXZlcnNlc3RyYXRlZ3lfeGZhbm9kZS5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YW1lcmdlcl9pbXAuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX2xheW91dF9pdGVtbGF5b3V0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9sb2NhbGVtZ3IuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfcmVzb2x2ZW5vZGVfcnMuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX3V0aWxzLmgiCiAKIG5hbWVzcGFjZSB7CiAKQEAgLTYxLDggKzcxLDkgQEAKIAogdWludDMyX3QgR2V0UmVsZXZhbnQoQ1hGQV9Ob2RlKiBwRm9ybUl0ZW0sIHVpbnQzMl90IGR3UGFyZW50UmVsdmFudCkgewogICB1aW50MzJfdCBkd1JlbGV2YW50ID0gWEZBX1dpZGdldFN0YXR1c19WaWV3YWJsZSB8IFhGQV9XaWRnZXRTdGF0dXNfUHJpbnRhYmxlOwotICBDRlhfV2lkZVN0cmluZ0Mgd3NSZWxldmFudDsKLSAgaWYgKHBGb3JtSXRlbS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9SZWxldmFudCwgd3NSZWxldmFudCkpIHsKKyAgV2lkZVN0cmluZyB3c1JlbGV2YW50ID0KKyAgICAgIHBGb3JtSXRlbS0+SlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6UmVsZXZhbnQpOworICBpZiAoIXdzUmVsZXZhbnQuSXNFbXB0eSgpKSB7CiAgICAgaWYgKHdzUmVsZXZhbnQgPT0gTCIrcHJpbnQiIHx8IHdzUmVsZXZhbnQgPT0gTCJwcmludCIpCiAgICAgICBkd1JlbGV2YW50ICY9IH5YRkFfV2lkZ2V0U3RhdHVzX1ZpZXdhYmxlOwogICAgIGVsc2UgaWYgKHdzUmVsZXZhbnQgPT0gTCItcHJpbnQiKQpAQCAtOTEsMTIgKzEwMiwxMyBAQAogICB1aW50MzJfdCBkd1N0YXR1cyA9IDA7CiAgIHVpbnQzMl90IGR3UmVsZXZhbnRDb250YWluZXIgPSAwOwogICBpZiAoYlZpc2libGUpIHsKLSAgICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0cmlidXRlVmFsdWUgPQotICAgICAgICBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QcmVzZW5jZSk7Ci0gICAgaWYgKGVBdHRyaWJ1dGVWYWx1ZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlIHx8Ci0gICAgICAgIGVBdHRyaWJ1dGVWYWx1ZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3duKSB7CisgICAgWEZBX0F0dHJpYnV0ZUVudW0gZUF0dHJpYnV0ZVZhbHVlID0KKyAgICAgICAgcENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlLT5KU09iamVjdCgpCisgICAgICAgICAgICAtPlRyeUVudW0oWEZBX0F0dHJpYnV0ZTo6UHJlc2VuY2UsIHRydWUpCisgICAgICAgICAgICAudmFsdWVfb3IoWEZBX0F0dHJpYnV0ZUVudW06OlZpc2libGUpOworICAgIGlmIChlQXR0cmlidXRlVmFsdWUgPT0gWEZBX0F0dHJpYnV0ZUVudW06OlZpc2libGUpCiAgICAgICBiVmlzaWJsZUl0ZW0gPSB0cnVlOwotICAgIH0KKwogICAgIGR3UmVsZXZhbnRDb250YWluZXIgPSBHZXRSZWxldmFudChwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUsIGR3UmVsZXZhbnQpOwogICAgIGR3U3RhdHVzID0KICAgICAgICAgKGJWaXNpYmxlSXRlbSA/IFhGQV9XaWRnZXRTdGF0dXNfVmlzaWJsZSA6IDApIHwgZHdSZWxldmFudENvbnRhaW5lcjsKQEAgLTEzMiwyMiArMTQ0LDI2IEBACiAKIENYRkFfTm9kZSogUmVzb2x2ZUJyZWFrVGFyZ2V0KENYRkFfTm9kZSogcFBhZ2VTZXRSb290LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTmV3RXhwclN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDJiB3c1RhcmdldEV4cHIpIHsKLSAgQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50ID0gcFBhZ2VTZXRSb290LT5HZXREb2N1bWVudCgpOwotICBpZiAod3NUYXJnZXRFeHByLklzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIHdzVGFyZ2V0QWxsKSB7CisgIGlmICghcFBhZ2VTZXRSb290KQogICAgIHJldHVybiBudWxscHRyOwogCi0gIENGWF9XaWRlU3RyaW5nIHdzVGFyZ2V0QWxsKHdzVGFyZ2V0RXhwcik7Ci0gIHdzVGFyZ2V0QWxsLlRyaW1MZWZ0KCk7Ci0gIHdzVGFyZ2V0QWxsLlRyaW1SaWdodCgpOworICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwUGFnZVNldFJvb3QtPkdldERvY3VtZW50KCk7CisgIGlmICh3c1RhcmdldEFsbC5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgd3NUYXJnZXRBbGwuVHJpbSgpOwogICBpbnQzMl90IGlTcGxpdEluZGV4ID0gMDsKICAgYm9vbCBiVGFyZ2V0QWxsRmluZCA9IHRydWU7CiAgIHdoaWxlIChpU3BsaXRJbmRleCAhPSAtMSkgewotICAgIENGWF9XaWRlU3RyaW5nIHdzRXhwcjsKLSAgICBpbnQzMl90IGlTcGxpdE5leHRJbmRleCA9IDA7CisgICAgV2lkZVN0cmluZyB3c0V4cHI7CisgICAgT3B0aW9uYWw8c2l6ZV90PiBpU3BsaXROZXh0SW5kZXggPSAwOwogICAgIGlmICghYlRhcmdldEFsbEZpbmQpIHsKICAgICAgIGlTcGxpdE5leHRJbmRleCA9IHdzVGFyZ2V0QWxsLkZpbmQoJyAnLCBpU3BsaXRJbmRleCk7Ci0gICAgICB3c0V4cHIgPSB3c1RhcmdldEFsbC5NaWQoaVNwbGl0SW5kZXgsIGlTcGxpdE5leHRJbmRleCAtIGlTcGxpdEluZGV4KTsKKyAgICAgIGlmICghaVNwbGl0TmV4dEluZGV4Lmhhc192YWx1ZSgpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIHdzRXhwciA9CisgICAgICAgICAgd3NUYXJnZXRBbGwuTWlkKGlTcGxpdEluZGV4LCBpU3BsaXROZXh0SW5kZXgudmFsdWUoKSAtIGlTcGxpdEluZGV4KTsKICAgICB9IGVsc2UgewogICAgICAgd3NFeHByID0gd3NUYXJnZXRBbGw7CiAgICAgfQpAQCAtMTU1LDI3ICsxNzEsMjggQEAKICAgICAgIHJldHVybiBudWxscHRyOwogCiAgICAgYlRhcmdldEFsbEZpbmQgPSBmYWxzZTsKLSAgICBpZiAod3NFeHByLkdldEF0KDApID09ICcjJykgeworICAgIGlmICh3c0V4cHJbMF0gPT0gJyMnKSB7CiAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gcERvY3VtZW50LT5HZXROb2RlQnlJRCgKICAgICAgICAgICBUb05vZGUocERvY3VtZW50LT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX1RlbXBsYXRlKSksCi0gICAgICAgICAgd3NFeHByLk1pZCgxKS5Bc1N0cmluZ0MoKSk7CisgICAgICAgICAgd3NFeHByLlJpZ2h0KHdzRXhwci5HZXRMZW5ndGgoKSAtIDEpLkFzU3RyaW5nVmlldygpKTsKICAgICAgIGlmIChwTm9kZSkKICAgICAgICAgcmV0dXJuIHBOb2RlOwogICAgIH0gZWxzZSBpZiAoYk5ld0V4cHJTdHlsZSkgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQcm9jZXNzZWRUYXJnZXQgPSB3c0V4cHI7Ci0gICAgICBpZiAod3NFeHByLkxlZnQoNCkgPT0gTCJzb20oIiAmJiB3c0V4cHIuUmlnaHQoMSkgPT0gTCIpIikgeworICAgICAgV2lkZVN0cmluZyB3c1Byb2Nlc3NlZFRhcmdldCA9IHdzRXhwcjsKKyAgICAgIGlmICh3c0V4cHIuTGVmdCg0KSA9PSBMInNvbSgiICYmIHdzRXhwci5MYXN0KCkgPT0gTCcpJykgewogICAgICAgICB3c1Byb2Nlc3NlZFRhcmdldCA9IHdzRXhwci5NaWQoNCwgd3NFeHByLkdldExlbmd0aCgpIC0gNSk7CiAgICAgICB9CiAgICAgICBYRkFfUkVTT0xWRU5PREVfUlMgcnM7Ci0gICAgICBpbnQzMl90IGlDb3VudCA9IHBEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5SZXNvbHZlT2JqZWN0cygKLSAgICAgICAgICBwUGFnZVNldFJvb3QsIHdzUHJvY2Vzc2VkVGFyZ2V0LkFzU3RyaW5nQygpLCBycywKKyAgICAgIGJvb2wgaVJldCA9IHBEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5SZXNvbHZlT2JqZWN0cygKKyAgICAgICAgICBwUGFnZVNldFJvb3QsIHdzUHJvY2Vzc2VkVGFyZ2V0LkFzU3RyaW5nVmlldygpLCAmcnMsCiAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfAogICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfQXR0cmlidXRlcyB8IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8Ci0gICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQpOwotICAgICAgaWYgKGlDb3VudCA+IDAgJiYgcnMubm9kZXNbMF0tPklzTm9kZSgpKQotICAgICAgICByZXR1cm4gcnMubm9kZXNbMF0tPkFzTm9kZSgpOworICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfUGFyZW50LAorICAgICAgICAgIG51bGxwdHIpOworICAgICAgaWYgKGlSZXQgJiYgcnMub2JqZWN0cy5mcm9udCgpLT5Jc05vZGUoKSkKKyAgICAgICAgcmV0dXJuIHJzLm9iamVjdHMuZnJvbnQoKS0+QXNOb2RlKCk7CiAgICAgfQotICAgIGlTcGxpdEluZGV4ID0gaVNwbGl0TmV4dEluZGV4OworICAgIGlTcGxpdEluZGV4ID0gaVNwbGl0TmV4dEluZGV4LnZhbHVlKCk7CiAgIH0KICAgcmV0dXJuIG51bGxwdHI7CiB9CkBAIC0yMjEsNiArMjM4LDE0IEBACiAgIH0KIH0KIAorYm9vbCBSdW5CcmVha1Rlc3RTY3JpcHQoQ1hGQV9TY3JpcHQqIHBUZXN0U2NyaXB0KSB7CisgIFdpZGVTdHJpbmcgd3NFeHByZXNzaW9uID0gcFRlc3RTY3JpcHQtPkpTT2JqZWN0KCktPkdldENvbnRlbnQoZmFsc2UpOworICBpZiAod3NFeHByZXNzaW9uLklzRW1wdHkoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIHBUZXN0U2NyaXB0LT5HZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKS0+UnVuU2NyaXB0KAorICAgICAgcFRlc3RTY3JpcHQsIHBUZXN0U2NyaXB0LT5HZXRDb250YWluZXJQYXJlbnQoKSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZQogCiBjbGFzcyBDWEZBX0NvbnRhaW5lclJlY29yZCB7CkBAIC0yNDYsNyArMjcxLDcgQEAKICAgICAgIG1fcEN1clBhZ2VBcmVhKG51bGxwdHIpLAogICAgICAgbV9uQXZhaWxQYWdlcygwKSwKICAgICAgIG1fbkN1clBhZ2VDb3VudCgwKSwKLSAgICAgIG1fZVBhZ2VTZXRNb2RlKFhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWRPY2N1cnJlbmNlKSwKKyAgICAgIG1fZVBhZ2VTZXRNb2RlKFhGQV9BdHRyaWJ1dGVFbnVtOjpPcmRlcmVkT2NjdXJyZW5jZSksCiAgICAgICBtX2JDcmVhdGVPdmVyRmxvd1BhZ2UoZmFsc2UpIHt9CiAKIENYRkFfTGF5b3V0UGFnZU1ncjo6fkNYRkFfTGF5b3V0UGFnZU1ncigpIHsKQEAgLTI2MSwxMiArMjg2LDE1IEBACiAKIGJvb2wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpJbml0TGF5b3V0UGFnZShDWEZBX05vZGUqIHBGb3JtTm9kZSkgewogICBQcmVwYXJlTGF5b3V0KCk7Ci0gIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSA9IHBGb3JtTm9kZS0+R2V0VGVtcGxhdGVOb2RlKCk7CisgIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSA9IHBGb3JtTm9kZS0+R2V0VGVtcGxhdGVOb2RlSWZFeGlzdHMoKTsKICAgaWYgKCFwVGVtcGxhdGVOb2RlKQogICAgIHJldHVybiBmYWxzZTsKIAotICBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290ID0gcFRlbXBsYXRlTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VsZW1lbnQ6OlBhZ2VTZXQpOworICBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290ID0KKyAgICAgIHBUZW1wbGF0ZU5vZGUtPkpTT2JqZWN0KCktPkdldE9yQ3JlYXRlUHJvcGVydHk8Q1hGQV9QYWdlU2V0PigKKyAgICAgICAgICAwLCBYRkFfRWxlbWVudDo6UGFnZVNldCk7CiAgIEFTU0VSVChtX3BUZW1wbGF0ZVBhZ2VTZXRSb290KTsKKwogICBpZiAobV9wUGFnZVNldExheW91dEl0ZW1Sb290KSB7CiAgICAgbV9wUGFnZVNldExheW91dEl0ZW1Sb290LT5tX3BQYXJlbnQgPSBudWxscHRyOwogICAgIG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdC0+bV9wRmlyc3RDaGlsZCA9IG51bGxwdHI7CkBAIC0yNzcsMjIgKzMwNSwyMiBAQAogICAgICAgICBuZXcgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKG1fcFRlbXBsYXRlUGFnZVNldFJvb3QpOwogICB9CiAgIG1fcFBhZ2VTZXRDdXJSb290ID0gbV9wUGFnZVNldExheW91dEl0ZW1Sb290OwotICBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290LT5TZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKW1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdCk7Ci0gIFhGQV9BVFRSSUJVVEVFTlVNIGVSZWxhdGlvbiA9Ci0gICAgICBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290LT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfUmVsYXRpb24pOwotICBpZiAoZVJlbGF0aW9uICE9IFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd24pCisgIG1fcFRlbXBsYXRlUGFnZVNldFJvb3QtPkpTT2JqZWN0KCktPlNldExheW91dEl0ZW0obV9wUGFnZVNldExheW91dEl0ZW1Sb290KTsKKworICBYRkFfQXR0cmlidXRlRW51bSBlUmVsYXRpb24gPQorICAgICAgbV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+SlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpSZWxhdGlvbik7CisgIGlmIChlUmVsYXRpb24gIT0gWEZBX0F0dHJpYnV0ZUVudW06OlVua25vd24pCiAgICAgbV9lUGFnZVNldE1vZGUgPSBlUmVsYXRpb247CiAKICAgSW5pdFBhZ2VTZXRNYXAoKTsKICAgQ1hGQV9Ob2RlKiBwUGFnZUFyZWEgPSBudWxscHRyOwogICBpbnQzMl90IGlDb3VudCA9IDA7Ci0gIGZvciAocFBhZ2VBcmVhID0gbV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgIHBQYWdlQXJlYTsKLSAgICAgICBwUGFnZUFyZWEgPSBwUGFnZUFyZWEtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsKKyAgZm9yIChwUGFnZUFyZWEgPSBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290LT5HZXRGaXJzdENoaWxkKCk7IHBQYWdlQXJlYTsKKyAgICAgICBwUGFnZUFyZWEgPSBwUGFnZUFyZWEtPkdldE5leHRTaWJsaW5nKCkpIHsKICAgICBpZiAocFBhZ2VBcmVhLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpQYWdlQXJlYSkgewogICAgICAgaUNvdW50Kys7Ci0gICAgICBpZiAocFBhZ2VBcmVhLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRWxlbWVudDo6Q29udGVudEFyZWEpKQorICAgICAgaWYgKHBQYWdlQXJlYS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9Db250ZW50QXJlYT4oCisgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpDb250ZW50QXJlYSkpCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgfQpAQCAtMzAwLDkgKzMyOCwxMCBAQAogICAgIHJldHVybiBmYWxzZTsKIAogICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwVGVtcGxhdGVOb2RlLT5HZXREb2N1bWVudCgpOwotICBwUGFnZUFyZWEgPSBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290LT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6UGFnZUFyZWEpOworICBwUGFnZUFyZWEgPSBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290LT5HZXRDaGlsZDxDWEZBX05vZGU+KAorICAgICAgMCwgWEZBX0VsZW1lbnQ6OlBhZ2VBcmVhLCBmYWxzZSk7CiAgIGlmICghcFBhZ2VBcmVhKSB7Ci0gICAgcFBhZ2VBcmVhID0gcERvY3VtZW50LT5DcmVhdGVOb2RlKG1fcFRlbXBsYXRlUGFnZVNldFJvb3QtPkdldFBhY2tldElEKCksCisgICAgcFBhZ2VBcmVhID0gcERvY3VtZW50LT5DcmVhdGVOb2RlKG1fcFRlbXBsYXRlUGFnZVNldFJvb3QtPkdldFBhY2tldFR5cGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlBhZ2VBcmVhKTsKICAgICBpZiAoIXBQYWdlQXJlYSkKICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTMxMCwzNyArMzM5LDM5IEBACiAgICAgbV9wVGVtcGxhdGVQYWdlU2V0Um9vdC0+SW5zZXJ0Q2hpbGQocFBhZ2VBcmVhLCBudWxscHRyKTsKICAgICBwUGFnZUFyZWEtPlNldEZsYWcoWEZBX05vZGVGbGFnX0luaXRpYWxpemVkLCB0cnVlKTsKICAgfQotICBDWEZBX05vZGUqIHBDb250ZW50QXJlYSA9IHBQYWdlQXJlYS0+R2V0Q2hpbGQoMCwgWEZBX0VsZW1lbnQ6OkNvbnRlbnRBcmVhKTsKKyAgQ1hGQV9Db250ZW50QXJlYSogcENvbnRlbnRBcmVhID0KKyAgICAgIHBQYWdlQXJlYS0+R2V0Q2hpbGQ8Q1hGQV9Db250ZW50QXJlYT4oMCwgWEZBX0VsZW1lbnQ6OkNvbnRlbnRBcmVhLCBmYWxzZSk7CiAgIGlmICghcENvbnRlbnRBcmVhKSB7Ci0gICAgcENvbnRlbnRBcmVhID0gcERvY3VtZW50LT5DcmVhdGVOb2RlKHBQYWdlQXJlYS0+R2V0UGFja2V0SUQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkNvbnRlbnRBcmVhKTsKKyAgICBwQ29udGVudEFyZWEgPSBzdGF0aWNfY2FzdDxDWEZBX0NvbnRlbnRBcmVhKj4ocERvY3VtZW50LT5DcmVhdGVOb2RlKAorICAgICAgICBwUGFnZUFyZWEtPkdldFBhY2tldFR5cGUoKSwgWEZBX0VsZW1lbnQ6OkNvbnRlbnRBcmVhKSk7CiAgICAgaWYgKCFwQ29udGVudEFyZWEpCiAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBwUGFnZUFyZWEtPkluc2VydENoaWxkKHBDb250ZW50QXJlYSwgbnVsbHB0cik7CiAgICAgcENvbnRlbnRBcmVhLT5TZXRGbGFnKFhGQV9Ob2RlRmxhZ19Jbml0aWFsaXplZCwgdHJ1ZSk7Ci0gICAgcENvbnRlbnRBcmVhLT5TZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9NZWFzdXJlbWVudCgwLjI1ZiwgWEZBX1VOSVRfSW4pKTsKLSAgICBwQ29udGVudEFyZWEtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9ZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50KDAuMjVmLCBYRkFfVU5JVF9JbikpOwotICAgIHBDb250ZW50QXJlYS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTWVhc3VyZW1lbnQoOC4wZiwgWEZBX1VOSVRfSW4pKTsKLSAgICBwQ29udGVudEFyZWEtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9ILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50KDEwLjVmLCBYRkFfVU5JVF9JbikpOworICAgIHBDb250ZW50QXJlYS0+SlNPYmplY3QoKS0+U2V0TWVhc3VyZSgKKyAgICAgICAgWEZBX0F0dHJpYnV0ZTo6WCwgQ1hGQV9NZWFzdXJlbWVudCgwLjI1ZiwgWEZBX1VuaXQ6OkluKSwgZmFsc2UpOworICAgIHBDb250ZW50QXJlYS0+SlNPYmplY3QoKS0+U2V0TWVhc3VyZSgKKyAgICAgICAgWEZBX0F0dHJpYnV0ZTo6WSwgQ1hGQV9NZWFzdXJlbWVudCgwLjI1ZiwgWEZBX1VuaXQ6OkluKSwgZmFsc2UpOworICAgIHBDb250ZW50QXJlYS0+SlNPYmplY3QoKS0+U2V0TWVhc3VyZSgKKyAgICAgICAgWEZBX0F0dHJpYnV0ZTo6VywgQ1hGQV9NZWFzdXJlbWVudCg4LjBmLCBYRkFfVW5pdDo6SW4pLCBmYWxzZSk7CisgICAgcENvbnRlbnRBcmVhLT5KU09iamVjdCgpLT5TZXRNZWFzdXJlKAorICAgICAgICBYRkFfQXR0cmlidXRlOjpILCBDWEZBX01lYXN1cmVtZW50KDEwLjVmLCBYRkFfVW5pdDo6SW4pLCBmYWxzZSk7CiAgIH0KLSAgQ1hGQV9Ob2RlKiBwTWVkaXVtID0gcFBhZ2VBcmVhLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6TWVkaXVtKTsKKyAgQ1hGQV9NZWRpdW0qIHBNZWRpdW0gPQorICAgICAgcFBhZ2VBcmVhLT5HZXRDaGlsZDxDWEZBX01lZGl1bT4oMCwgWEZBX0VsZW1lbnQ6Ok1lZGl1bSwgZmFsc2UpOwogICBpZiAoIXBNZWRpdW0pIHsKLSAgICBwTWVkaXVtID0KLSAgICAgICAgcERvY3VtZW50LT5DcmVhdGVOb2RlKHBQYWdlQXJlYS0+R2V0UGFja2V0SUQoKSwgWEZBX0VsZW1lbnQ6Ok1lZGl1bSk7CisgICAgcE1lZGl1bSA9IHN0YXRpY19jYXN0PENYRkFfTWVkaXVtKj4oCisgICAgICAgIHBEb2N1bWVudC0+Q3JlYXRlTm9kZShwUGFnZUFyZWEtPkdldFBhY2tldFR5cGUoKSwgWEZBX0VsZW1lbnQ6Ok1lZGl1bSkpOwogICAgIGlmICghcENvbnRlbnRBcmVhKQogICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgcFBhZ2VBcmVhLT5JbnNlcnRDaGlsZChwTWVkaXVtLCBudWxscHRyKTsKICAgICBwTWVkaXVtLT5TZXRGbGFnKFhGQV9Ob2RlRmxhZ19Jbml0aWFsaXplZCwgdHJ1ZSk7Ci0gICAgcE1lZGl1bS0+U2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1Nob3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9NZWFzdXJlbWVudCg4LjVmLCBYRkFfVU5JVF9JbikpOwotICAgIHBNZWRpdW0tPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Mb25nLAotICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9NZWFzdXJlbWVudCgxMS4wZiwgWEZBX1VOSVRfSW4pKTsKKyAgICBwTWVkaXVtLT5KU09iamVjdCgpLT5TZXRNZWFzdXJlKAorICAgICAgICBYRkFfQXR0cmlidXRlOjpTaG9ydCwgQ1hGQV9NZWFzdXJlbWVudCg4LjVmLCBYRkFfVW5pdDo6SW4pLCBmYWxzZSk7CisgICAgcE1lZGl1bS0+SlNPYmplY3QoKS0+U2V0TWVhc3VyZSgKKyAgICAgICAgWEZBX0F0dHJpYnV0ZTo6TG9uZywgQ1hGQV9NZWFzdXJlbWVudCgxMS4wZiwgWEZBX1VuaXQ6OkluKSwgZmFsc2UpOwogICB9CiAgIHJldHVybiB0cnVlOwogfQpAQCAtMzQ5LDE1ICszODAsMTMgQEAKICAgYm9vbCBiUHJvQnJlYWtCZWZvcmUgPSBmYWxzZTsKICAgQ1hGQV9Ob2RlKiBwQnJlYWtCZWZvcmVOb2RlID0gbnVsbHB0cjsKICAgd2hpbGUgKHBSb290U3ViZm9ybSkgewotICAgIGZvciAoQ1hGQV9Ob2RlKiBwQnJlYWtOb2RlID0KLSAgICAgICAgICAgICBwUm9vdFN1YmZvcm0tPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsKLSAgICAgICAgIHBCcmVha05vZGU7Ci0gICAgICAgICBwQnJlYWtOb2RlID0gcEJyZWFrTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgeworICAgIGZvciAoQ1hGQV9Ob2RlKiBwQnJlYWtOb2RlID0gcFJvb3RTdWJmb3JtLT5HZXRGaXJzdENoaWxkKCk7IHBCcmVha05vZGU7CisgICAgICAgICBwQnJlYWtOb2RlID0gcEJyZWFrTm9kZS0+R2V0TmV4dFNpYmxpbmcoKSkgewogICAgICAgWEZBX0VsZW1lbnQgZVR5cGUgPSBwQnJlYWtOb2RlLT5HZXRFbGVtZW50VHlwZSgpOwogICAgICAgaWYgKGVUeXBlID09IFhGQV9FbGVtZW50OjpCcmVha0JlZm9yZSB8fAogICAgICAgICAgIChlVHlwZSA9PSBYRkFfRWxlbWVudDo6QnJlYWsgJiYKLSAgICAgICAgICAgcEJyZWFrTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0JlZm9yZSkgIT0KLSAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX0F1dG8pKSB7CisgICAgICAgICAgIHBCcmVha05vZGUtPkpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6QmVmb3JlKSAhPQorICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZUVudW06OkF1dG8pKSB7CiAgICAgICAgIGJQcm9CcmVha0JlZm9yZSA9IHRydWU7CiAgICAgICAgIHBCcmVha0JlZm9yZU5vZGUgPSBwQnJlYWtOb2RlOwogICAgICAgICBicmVhazsKQEAgLTM2NywxNCArMzk2LDE2IEBACiAgICAgICBicmVhazsKIAogICAgIGJQcm9CcmVha0JlZm9yZSA9IHRydWU7Ci0gICAgcFJvb3RTdWJmb3JtID0gcFJvb3RTdWJmb3JtLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRWxlbWVudDo6U3ViZm9ybSk7CisgICAgcFJvb3RTdWJmb3JtID0KKyAgICAgICAgcFJvb3RTdWJmb3JtLT5HZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX1N1YmZvcm0+KFhGQV9FbGVtZW50OjpTdWJmb3JtKTsKICAgICB3aGlsZSAocFJvb3RTdWJmb3JtICYmCiAgICAgICAgICAgICFYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHBSb290U3ViZm9ybSkpIHsKLSAgICAgIHBSb290U3ViZm9ybSA9Ci0gICAgICAgICAgcFJvb3RTdWJmb3JtLT5HZXROZXh0U2FtZUNsYXNzU2libGluZyhYRkFfRWxlbWVudDo6U3ViZm9ybSk7CisgICAgICBwUm9vdFN1YmZvcm0gPSBwUm9vdFN1YmZvcm0tPkdldE5leHRTYW1lQ2xhc3NTaWJsaW5nPENYRkFfU3ViZm9ybT4oCisgICAgICAgICAgWEZBX0VsZW1lbnQ6OlN1YmZvcm0pOwogICAgIH0KICAgfQotICBDWEZBX05vZGUgKnBMZWFkZXIsICpwVHJhaWxlcjsKKyAgQ1hGQV9Ob2RlKiBwTGVhZGVyOworICBDWEZBX05vZGUqIHBUcmFpbGVyOwogICBpZiAocEJyZWFrQmVmb3JlTm9kZSAmJgogICAgICAgRXhlY3V0ZUJyZWFrQmVmb3JlT3JBZnRlcihwQnJlYWtCZWZvcmVOb2RlLCB0cnVlLCBwTGVhZGVyLCBwVHJhaWxlcikpIHsKICAgICBtX0N1cnJlbnRDb250YWluZXJSZWNvcmRJdGVyID0gbV9Qcm9wb3NlZENvbnRhaW5lclJlY29yZHMuYmVnaW4oKTsKQEAgLTQ1NCwxNCArNDg1LDE1IEBACiAgIH0KIH0KIAotRlhfRkxPQVQgQ1hGQV9MYXlvdXRQYWdlTWdyOjpHZXRBdmFpbEhlaWdodCgpIHsKK2Zsb2F0IENYRkFfTGF5b3V0UGFnZU1ncjo6R2V0QXZhaWxIZWlnaHQoKSB7CiAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcExheW91dEl0ZW0gPQogICAgICAgR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpLT5wQ3VyQ29udGVudEFyZWE7CiAgIGlmICghcExheW91dEl0ZW0gfHwgIXBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSkKICAgICByZXR1cm4gMC4wZjsKIAotICBGWF9GTE9BVCBmQXZhaWxIZWlnaHQgPQotICAgICAgcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfSCkuVG9Vbml0KFhGQV9VTklUX1B0KTsKKyAgZmxvYXQgZkF2YWlsSGVpZ2h0ID0gcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5KU09iamVjdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6SCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub1VuaXQoWEZBX1VuaXQ6OlB0KTsKICAgaWYgKGZBdmFpbEhlaWdodCA+PSBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikKICAgICByZXR1cm4gZkF2YWlsSGVpZ2h0OwogICBpZiAobV9DdXJyZW50Q29udGFpbmVyUmVjb3JkSXRlciA9PSBtX1Byb3Bvc2VkQ29udGFpbmVyUmVjb3Jkcy5iZWdpbigpKQpAQCAtNDY5LDE2ICs1MDEsNiBAQAogICByZXR1cm4gRkxUX01BWDsKIH0KIAotYm9vbCBYRkFfTGF5b3V0UGFnZU1ncl9SdW5CcmVha1Rlc3RTY3JpcHQoQ1hGQV9Ob2RlKiBwVGVzdFNjcmlwdCkgewotICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247Ci0gIHBUZXN0U2NyaXB0LT5UcnlDb250ZW50KHdzRXhwcmVzc2lvbik7Ci0gIGlmICh3c0V4cHJlc3Npb24uSXNFbXB0eSgpKQotICAgIHJldHVybiB0cnVlOwotICByZXR1cm4gcFRlc3RTY3JpcHQtPkdldERvY3VtZW50KCktPkdldE5vdGlmeSgpLT5SdW5TY3JpcHQoCi0gICAgICBwVGVzdFNjcmlwdCwgcFRlc3RTY3JpcHQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250YWluZXJOb2RlKSk7Ci19Ci0KIENYRkFfQ29udGFpbmVyUmVjb3JkKiBDWEZBX0xheW91dFBhZ2VNZ3I6OkNyZWF0ZUNvbnRhaW5lclJlY29yZCgKICAgICBDWEZBX05vZGUqIHBQYWdlTm9kZSwKICAgICBib29sIGJDcmVhdGVOZXcpIHsKQEAgLTQ4OSwxNCArNTExLDE0IEBACiAgICAgICBtX1Byb3Bvc2VkQ29udGFpbmVyUmVjb3Jkcy5wdXNoX2JhY2socE5ld1JlY29yZCk7CiAgICAgICByZXR1cm4gcE5ld1JlY29yZDsKICAgICB9Ci0gICAgQ1hGQV9Ob2RlKiBwUGFnZVNldCA9IHBQYWdlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7CisgICAgQ1hGQV9Ob2RlKiBwUGFnZVNldCA9IHBQYWdlTm9kZS0+R2V0UGFyZW50KCk7CiAgICAgaWYgKCFiQ3JlYXRlTmV3KSB7CiAgICAgICBpZiAocFBhZ2VTZXQgPT0gbV9wVGVtcGxhdGVQYWdlU2V0Um9vdCkgewogICAgICAgICBwTmV3UmVjb3JkLT5wQ3VyUGFnZVNldCA9IG1fcFBhZ2VTZXRDdXJSb290OwogICAgICAgfSBlbHNlIHsKICAgICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwUGFyZW50TGF5b3V0SXRlbSA9CiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qPigKLSAgICAgICAgICAgICAgICBwUGFnZVNldC0+R2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVkpKTsKKyAgICAgICAgICAgICAgICBwUGFnZVNldC0+SlNPYmplY3QoKS0+R2V0TGF5b3V0SXRlbSgpKTsKICAgICAgICAgaWYgKCFwUGFyZW50TGF5b3V0SXRlbSkKICAgICAgICAgICBwUGFyZW50TGF5b3V0SXRlbSA9IG1fcFBhZ2VTZXRDdXJSb290OwogCkBAIC01MDksMTIgKzUzMSwxMSBAQAogICAgICAgICAgICAgR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpLT5wQ3VyUGFnZVNldC0+bV9wUGFyZW50KTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHBQYXJlbnRQYWdlU2V0TGF5b3V0ID0gc3RhdGljX2Nhc3Q8Q1hGQV9Db250YWluZXJMYXlvdXRJdGVtKj4oCi0gICAgICAgICAgICBwUGFnZVNldC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkKLSAgICAgICAgICAgICAgICAtPkdldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZKSk7CisgICAgICAgICAgICBwUGFnZVNldC0+R2V0UGFyZW50KCktPkpTT2JqZWN0KCktPkdldExheW91dEl0ZW0oKSk7CiAgICAgICB9CiAgICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBQYWdlU2V0TGF5b3V0SXRlbSA9CiAgICAgICAgICAgbmV3IENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbShwUGFnZVNldCk7Ci0gICAgICBwUGFnZVNldC0+U2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVksICh2b2lkKilwUGFnZVNldExheW91dEl0ZW0pOworICAgICAgcFBhZ2VTZXQtPkpTT2JqZWN0KCktPlNldExheW91dEl0ZW0ocFBhZ2VTZXRMYXlvdXRJdGVtKTsKICAgICAgIGlmICghcFBhcmVudFBhZ2VTZXRMYXlvdXQpIHsKICAgICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwUHJlUGFnZVNldCA9IG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdDsKICAgICAgICAgd2hpbGUgKHBQcmVQYWdlU2V0LT5tX3BOZXh0U2libGluZykgewpAQCAtNTMxLDEzICs1NTIsMTMgQEAKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgaWYgKHBQYWdlTm9kZSkgewotICAgICAgQ1hGQV9Ob2RlKiBwUGFnZVNldCA9IHBQYWdlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7CisgICAgICBDWEZBX05vZGUqIHBQYWdlU2V0ID0gcFBhZ2VOb2RlLT5HZXRQYXJlbnQoKTsKICAgICAgIGlmIChwUGFnZVNldCA9PSBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290KSB7CiAgICAgICAgIHBOZXdSZWNvcmQtPnBDdXJQYWdlU2V0ID0gbV9wUGFnZVNldExheW91dEl0ZW1Sb290OwogICAgICAgfSBlbHNlIHsKICAgICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwUGFnZVNldExheW91dEl0ZW0gPQogICAgICAgICAgICAgbmV3IENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbShwUGFnZVNldCk7Ci0gICAgICAgIHBQYWdlU2V0LT5TZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSwgKHZvaWQqKXBQYWdlU2V0TGF5b3V0SXRlbSk7CisgICAgICAgIHBQYWdlU2V0LT5KU09iamVjdCgpLT5TZXRMYXlvdXRJdGVtKHBQYWdlU2V0TGF5b3V0SXRlbSk7CiAgICAgICAgIG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdC0+QWRkQ2hpbGQocFBhZ2VTZXRMYXlvdXRJdGVtKTsKICAgICAgICAgcE5ld1JlY29yZC0+cEN1clBhZ2VTZXQgPSBwUGFnZVNldExheW91dEl0ZW07CiAgICAgICB9CkBAIC01NTIsMTcgKzU3MywxNSBAQAogdm9pZCBDWEZBX0xheW91dFBhZ2VNZ3I6OkFkZFBhZ2VBcmVhTGF5b3V0SXRlbShDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTmV3UGFnZUFyZWEpIHsKICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwTmV3UGFnZUFyZWFMYXlvdXRJdGVtID0gbnVsbHB0cjsKLSAgaWYgKG1fUGFnZUFycmF5LkdldFNpemUoKSA+IG1fbkF2YWlsUGFnZXMpIHsKKyAgaWYgKHBkZml1bTo6SW5kZXhJbkJvdW5kcyhtX1BhZ2VBcnJheSwgbV9uQXZhaWxQYWdlcykpIHsKICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBDb250YWluZXJJdGVtID0gbV9QYWdlQXJyYXlbbV9uQXZhaWxQYWdlc107CiAgICAgcENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlID0gcE5ld1BhZ2VBcmVhOwogICAgIG1fbkF2YWlsUGFnZXMrKzsKICAgICBwTmV3UGFnZUFyZWFMYXlvdXRJdGVtID0gcENvbnRhaW5lckl0ZW07CiAgIH0gZWxzZSB7CiAgICAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IHBOZXdQYWdlQXJlYS0+R2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCk7Ci0gICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwQ29udGFpbmVySXRlbSA9Ci0gICAgICAgIHN0YXRpY19jYXN0PENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSo+KAotICAgICAgICAgICAgcE5vdGlmeS0+T25DcmVhdGVMYXlvdXRJdGVtKHBOZXdQYWdlQXJlYSkpOwotICAgIG1fUGFnZUFycmF5LkFkZChwQ29udGFpbmVySXRlbSk7CisgICAgYXV0byogcENvbnRhaW5lckl0ZW0gPSBwTm90aWZ5LT5PbkNyZWF0ZUNvbnRhaW5lckxheW91dEl0ZW0ocE5ld1BhZ2VBcmVhKTsKKyAgICBtX1BhZ2VBcnJheS5wdXNoX2JhY2socENvbnRhaW5lckl0ZW0pOwogICAgIG1fbkF2YWlsUGFnZXMrKzsKICAgICBwTm90aWZ5LT5PblBhZ2VFdmVudChwQ29udGFpbmVySXRlbSwgWEZBX1BBR0VWSUVXRVZFTlRfUG9zdFJlbW92ZWQpOwogICAgIHBOZXdQYWdlQXJlYUxheW91dEl0ZW0gPSBwQ29udGFpbmVySXRlbTsKQEAgLTU5NiwxMyArNjE1LDE0IEBACiAgICAgICAgIHNJdGVyYXRvcihwUm9vdFBhZ2VTZXRMYXlvdXRJdGVtKTsKICAgICBmb3IgKENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcFBhZ2VTZXRMYXlvdXRJdGVtID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsKICAgICAgICAgIHBQYWdlU2V0TGF5b3V0SXRlbTsgcFBhZ2VTZXRMYXlvdXRJdGVtID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgewotICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZVBhZ2VSZWxhdGlvbiA9Ci0gICAgICAgICAgcFBhZ2VTZXRMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1JlbGF0aW9uKTsKKyAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtIGVQYWdlUmVsYXRpb24gPQorICAgICAgICAgIHBQYWdlU2V0TGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkpTT2JqZWN0KCktPkdldEVudW0oCisgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGU6OlJlbGF0aW9uKTsKICAgICAgIHN3aXRjaCAoZVBhZ2VSZWxhdGlvbikgewotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWRPY2N1cnJlbmNlOgorICAgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpPcmRlcmVkT2NjdXJyZW5jZToKICAgICAgICAgZGVmYXVsdDogeyBQcm9jZXNzTGFzdFBhZ2VTZXQoKTsgfSBicmVhazsKLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9TaW1wbGV4UGFnaW5hdGVkOgotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0R1cGxleFBhZ2luYXRlZDogeworICAgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpTaW1wbGV4UGFnaW5hdGVkOgorICAgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpEdXBsZXhQYWdpbmF0ZWQ6IHsKICAgICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBMYXN0UGFnZUFyZWFMYXlvdXRJdGVtID0gbnVsbHB0cjsKICAgICAgICAgICBpbnQzMl90IG5QYWdlQXJlYUNvdW50ID0gMDsKICAgICAgICAgICBmb3IgKENYRkFfTGF5b3V0SXRlbSogcFBhZ2VBcmVhTGF5b3V0SXRlbSA9CkBAIC02MjEsMzMgKzY0MSwzNCBAQAogCiAgICAgICAgICAgaWYgKCFGaW5kUGFnZUFyZWFGcm9tUGFnZVNldF9TaW1wbGV4RHVwbGV4KAogICAgICAgICAgICAgICAgICAgcFBhZ2VTZXRMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgIHRydWUsIHRydWUsIG5QYWdlQXJlYUNvdW50ID09IDEgPyBYRkFfQVRUUklCVVRFRU5VTV9Pbmx5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogWEZBX0FUVFJJQlVURUVOVU1fTGFzdCkgJiYKKyAgICAgICAgICAgICAgICAgIHRydWUsIHRydWUsCisgICAgICAgICAgICAgICAgICBuUGFnZUFyZWFDb3VudCA9PSAxID8gWEZBX0F0dHJpYnV0ZUVudW06Ok9ubHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBYRkFfQXR0cmlidXRlRW51bTo6TGFzdCkgJiYKICAgICAgICAgICAgICAgKG5QYWdlQXJlYUNvdW50ID09IDEgJiYKICAgICAgICAgICAgICAgICFGaW5kUGFnZUFyZWFGcm9tUGFnZVNldF9TaW1wbGV4RHVwbGV4KAogICAgICAgICAgICAgICAgICAgIHBQYWdlU2V0TGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgdHJ1ZSwgdHJ1ZSwgWEZBX0FUVFJJQlVURUVOVU1fTGFzdCkpKSB7CisgICAgICAgICAgICAgICAgICAgdHJ1ZSwgdHJ1ZSwgWEZBX0F0dHJpYnV0ZUVudW06Okxhc3QpKSkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQogICAgICAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BDdXJQYWdlQXJlYTsKLSAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlQ3VyQ2hvaWNlID0KLSAgICAgICAgICAgICAgcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QYWdlUG9zaXRpb24pOwotICAgICAgICAgIGlmIChlQ3VyQ2hvaWNlID09IFhGQV9BVFRSSUJVVEVFTlVNX0xhc3QpIHsKLSAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVPZGRPckV2ZW4gPSBYRkFfQVRUUklCVVRFRU5VTV9Bbnk7Ci0gICAgICAgICAgICBwTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX09kZE9yRXZlbiwgZU9kZE9yRXZlbik7Ci0gICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlTGFzdENob2ljZSA9Ci0gICAgICAgICAgICAgICAgcExhc3RQYWdlQXJlYUxheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKAotICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFX1BhZ2VQb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAoZUxhc3RDaG9pY2UgPT0gWEZBX0FUVFJJQlVURUVOVU1fRmlyc3QgJiYKLSAgICAgICAgICAgICAgICAoZVBhZ2VSZWxhdGlvbiA9PSBYRkFfQVRUUklCVVRFRU5VTV9TaW1wbGV4UGFnaW5hdGVkIHx8Ci0gICAgICAgICAgICAgICAgIGVPZGRPckV2ZW4gIT0gWEZBX0FUVFJJQlVURUVOVU1fT2RkKSkgeworICAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtIGVDdXJDaG9pY2UgPQorICAgICAgICAgICAgICBwTm9kZS0+SlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpQYWdlUG9zaXRpb24pOworICAgICAgICAgIGlmIChlQ3VyQ2hvaWNlID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpMYXN0KSB7CisgICAgICAgICAgICBYRkFfQXR0cmlidXRlRW51bSBlT2RkT3JFdmVuID0KKyAgICAgICAgICAgICAgICBwTm9kZS0+SlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpPZGRPckV2ZW4pOworICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZUVudW0gZUxhc3RDaG9pY2UgPQorICAgICAgICAgICAgICAgIHBMYXN0UGFnZUFyZWFMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+SlNPYmplY3QoKS0+R2V0RW51bSgKKyAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZTo6UGFnZVBvc2l0aW9uKTsKKyAgICAgICAgICAgIGlmIChlTGFzdENob2ljZSA9PSBYRkFfQXR0cmlidXRlRW51bTo6Rmlyc3QgJiYKKyAgICAgICAgICAgICAgICAoZVBhZ2VSZWxhdGlvbiA9PSBYRkFfQXR0cmlidXRlRW51bTo6U2ltcGxleFBhZ2luYXRlZCB8fAorICAgICAgICAgICAgICAgICBlT2RkT3JFdmVuICE9IFhGQV9BdHRyaWJ1dGVFbnVtOjpPZGQpKSB7CiAgICAgICAgICAgICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwUmVjb3JkID0gQ3JlYXRlQ29udGFpbmVyUmVjb3JkKCk7CiAgICAgICAgICAgICAgIEFkZFBhZ2VBcmVhTGF5b3V0SXRlbShwUmVjb3JkLCBwTm9kZSk7CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgICBib29sIGJVc2FibGUgPSB0cnVlOwotICAgICAgICAgIENGWF9BcnJheVRlbXBsYXRlPEZYX0ZMT0FUPiByZ1VzZWRIZWlnaHRzOworICAgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiByZ1VzZWRIZWlnaHRzOwogICAgICAgICAgIGZvciAoQ1hGQV9MYXlvdXRJdGVtKiBwQ2hpbGRMYXlvdXRJdGVtID0KICAgICAgICAgICAgICAgICAgICBwTGFzdFBhZ2VBcmVhTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsKICAgICAgICAgICAgICAgIHBDaGlsZExheW91dEl0ZW07CkBAIC02NTYsNyArNjc3LDcgQEAKICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6Q29udGVudEFyZWEpIHsKICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBGWF9GTE9BVCBmVXNlZEhlaWdodCA9IDA7CisgICAgICAgICAgICBmbG9hdCBmVXNlZEhlaWdodCA9IDA7CiAgICAgICAgICAgICBmb3IgKENYRkFfTGF5b3V0SXRlbSogcENvbnRlbnRDaGlsZExheW91dEl0ZW0gPQogICAgICAgICAgICAgICAgICAgICAgcENoaWxkTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsKICAgICAgICAgICAgICAgICAgcENvbnRlbnRDaGlsZExheW91dEl0ZW07CkBAIC02NjcsMjIgKzY4OCwyMSBAQAogICAgICAgICAgICAgICAgIGZVc2VkSGVpZ2h0ICs9IHBDb250ZW50LT5tX3NTaXplLmhlaWdodDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmdVc2VkSGVpZ2h0cy5BZGQoZlVzZWRIZWlnaHQpOworICAgICAgICAgICAgcmdVc2VkSGVpZ2h0cy5wdXNoX2JhY2soZlVzZWRIZWlnaHQpOwogICAgICAgICAgIH0KICAgICAgICAgICBpbnQzMl90IGlDdXJDb250ZW50QXJlYUluZGV4ID0gLTE7Ci0gICAgICAgICAgZm9yIChDWEZBX05vZGUqIHBDb250ZW50QXJlYU5vZGUgPQotICAgICAgICAgICAgICAgICAgIHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7CisgICAgICAgICAgZm9yIChDWEZBX05vZGUqIHBDb250ZW50QXJlYU5vZGUgPSBwTm9kZS0+R2V0Rmlyc3RDaGlsZCgpOwogICAgICAgICAgICAgICAgcENvbnRlbnRBcmVhTm9kZTsKLSAgICAgICAgICAgICAgIHBDb250ZW50QXJlYU5vZGUgPQotICAgICAgICAgICAgICAgICAgIHBDb250ZW50QXJlYU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsKKyAgICAgICAgICAgICAgIHBDb250ZW50QXJlYU5vZGUgPSBwQ29udGVudEFyZWFOb2RlLT5HZXROZXh0U2libGluZygpKSB7CiAgICAgICAgICAgICBpZiAocENvbnRlbnRBcmVhTm9kZS0+R2V0RWxlbWVudFR5cGUoKSAhPQogICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpDb250ZW50QXJlYSkgewogICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlDdXJDb250ZW50QXJlYUluZGV4Kys7CiAgICAgICAgICAgICBpZiAocmdVc2VkSGVpZ2h0c1tpQ3VyQ29udGVudEFyZWFJbmRleF0gPgotICAgICAgICAgICAgICAgIHBDb250ZW50QXJlYU5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9IKQotICAgICAgICAgICAgICAgICAgICAgICAgLlRvVW5pdChYRkFfVU5JVF9QdCkgKworICAgICAgICAgICAgICAgIHBDb250ZW50QXJlYU5vZGUtPkpTT2JqZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0TWVhc3VyZShYRkFfQXR0cmlidXRlOjpIKQorICAgICAgICAgICAgICAgICAgICAgICAgLlRvVW5pdChYRkFfVW5pdDo6UHQpICsKICAgICAgICAgICAgICAgICAgICAgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsKICAgICAgICAgICAgICAgYlVzYWJsZSA9IGZhbHNlOwogICAgICAgICAgICAgICBicmVhazsKQEAgLTY5MSw4ICs3MTEsNyBAQAogICAgICAgICAgIGlmIChiVXNhYmxlKSB7CiAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBDaGlsZExheW91dEl0ZW0gPQogICAgICAgICAgICAgICAgIHBMYXN0UGFnZUFyZWFMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOwotICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ29udGVudEFyZWFOb2RlID0KLSAgICAgICAgICAgICAgICBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOworICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ29udGVudEFyZWFOb2RlID0gcE5vZGUtPkdldEZpcnN0Q2hpbGQoKTsKICAgICAgICAgICAgIHBMYXN0UGFnZUFyZWFMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSA9IHBOb2RlOwogICAgICAgICAgICAgd2hpbGUgKHBDaGlsZExheW91dEl0ZW0gJiYgcENvbnRlbnRBcmVhTm9kZSkgewogICAgICAgICAgICAgICBpZiAocENoaWxkTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0KQEAgLTcwMiwxNyArNzIxLDE1IEBACiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgaWYgKHBDb250ZW50QXJlYU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0KICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpDb250ZW50QXJlYSkgewotICAgICAgICAgICAgICAgIHBDb250ZW50QXJlYU5vZGUgPQotICAgICAgICAgICAgICAgICAgICBwQ29udGVudEFyZWFOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOworICAgICAgICAgICAgICAgIHBDb250ZW50QXJlYU5vZGUgPSBwQ29udGVudEFyZWFOb2RlLT5HZXROZXh0U2libGluZygpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIHBDaGlsZExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlID0gcENvbnRlbnRBcmVhTm9kZTsKICAgICAgICAgICAgICAgcENoaWxkTGF5b3V0SXRlbSA9IHBDaGlsZExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOwotICAgICAgICAgICAgICBwQ29udGVudEFyZWFOb2RlID0KLSAgICAgICAgICAgICAgICAgIHBDb250ZW50QXJlYU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7CisgICAgICAgICAgICAgIHBDb250ZW50QXJlYU5vZGUgPSBwQ29udGVudEFyZWFOb2RlLT5HZXROZXh0U2libGluZygpOwogICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSBpZiAocE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QYWdlUG9zaXRpb24pID09Ci0gICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTV9MYXN0KSB7CisgICAgICAgICAgfSBlbHNlIGlmIChwTm9kZS0+SlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpQYWdlUG9zaXRpb24pID09CisgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlRW51bTo6TGFzdCkgewogICAgICAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBSZWNvcmQgPSBDcmVhdGVDb250YWluZXJSZWNvcmQoKTsKICAgICAgICAgICAgIEFkZFBhZ2VBcmVhTGF5b3V0SXRlbShwUmVjb3JkLCBwTm9kZSk7CiAgICAgICAgICAgfQpAQCAtNzIzLDI4ICs3NDAsMjggQEAKIH0KIAogaW50MzJfdCBDWEZBX0xheW91dFBhZ2VNZ3I6OkdldFBhZ2VDb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fUGFnZUFycmF5LkdldFNpemUoKTsKKyAgcmV0dXJuIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4obV9QYWdlQXJyYXkpOwogfQogCiBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIENYRkFfTGF5b3V0UGFnZU1ncjo6R2V0UGFnZShpbnQzMl90IGluZGV4KSBjb25zdCB7Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbV9QYWdlQXJyYXkuR2V0U2l6ZSgpKQorICBpZiAoIXBkZml1bTo6SW5kZXhJbkJvdW5kcyhtX1BhZ2VBcnJheSwgaW5kZXgpKQogICAgIHJldHVybiBudWxscHRyOwogICByZXR1cm4gbV9QYWdlQXJyYXlbaW5kZXhdOwogfQogCiBpbnQzMl90IENYRkFfTGF5b3V0UGFnZU1ncjo6R2V0UGFnZUluZGV4KAogICAgIGNvbnN0IENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcFBhZ2UpIGNvbnN0IHsKLSAgLy8gRklYTUU6IEZpbmQoKSBtZXRob2Qgc2hvdWxkIHRha2UgY29uc3QuCi0gIHJldHVybiBtX1BhZ2VBcnJheS5GaW5kKGNvbnN0X2Nhc3Q8Q1hGQV9Db250YWluZXJMYXlvdXRJdGVtKj4ocFBhZ2UpKTsKKyAgYXV0byBpdCA9IHN0ZDo6ZmluZChtX1BhZ2VBcnJheS5iZWdpbigpLCBtX1BhZ2VBcnJheS5lbmQoKSwgcFBhZ2UpOworICByZXR1cm4gaXQgIT0gbV9QYWdlQXJyYXkuZW5kKCkgPyBpdCAtIG1fUGFnZUFycmF5LmJlZ2luKCkgOiAtMTsKIH0KIAogYm9vbCBDWEZBX0xheW91dFBhZ2VNZ3I6OlJ1bkJyZWFrKFhGQV9FbGVtZW50IGVCcmVha1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZVRhcmdldFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZUVudW0gZVRhcmdldFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGFyZ2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN0YXJ0TmV3KSB7CiAgIGJvb2wgYlJldCA9IGZhbHNlOwogICBzd2l0Y2ggKGVUYXJnZXRUeXBlKSB7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYToKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpDb250ZW50QXJlYToKICAgICAgIGlmIChwVGFyZ2V0ICYmIHBUYXJnZXQtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OkNvbnRlbnRBcmVhKQogICAgICAgICBwVGFyZ2V0ID0gbnVsbHB0cjsKICAgICAgIGlmICghcFRhcmdldCB8fApAQCAtNzU0LDEzICs3NzEsMTMgQEAKICAgICAgICAgICBiU3RhcnROZXcpIHsKICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFnZUFyZWEgPSBudWxscHRyOwogICAgICAgICBpZiAocFRhcmdldCkKLSAgICAgICAgICBwUGFnZUFyZWEgPSBwVGFyZ2V0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsKKyAgICAgICAgICBwUGFnZUFyZWEgPSBwVGFyZ2V0LT5HZXRQYXJlbnQoKTsKIAogICAgICAgICBwUGFnZUFyZWEgPSBHZXROZXh0QXZhaWxQYWdlQXJlYShwUGFnZUFyZWEsIHBUYXJnZXQpOwogICAgICAgICBiUmV0ID0gISFwUGFnZUFyZWE7CiAgICAgICB9CiAgICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VBcmVhOgorICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OlBhZ2VBcmVhOgogICAgICAgaWYgKHBUYXJnZXQgJiYgcFRhcmdldC0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6UGFnZUFyZWEpCiAgICAgICAgIHBUYXJnZXQgPSBudWxscHRyOwogICAgICAgaWYgKCFwVGFyZ2V0IHx8CkBAIC03NzEsMTUgKzc4OCwxNSBAQAogICAgICAgICBiUmV0ID0gISFwUGFnZUFyZWE7CiAgICAgICB9CiAgICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VPZGQ6CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6UGFnZU9kZDoKICAgICAgIGlmIChwVGFyZ2V0ICYmIHBUYXJnZXQtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlBhZ2VBcmVhKQogICAgICAgICBwVGFyZ2V0ID0gbnVsbHB0cjsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUGFnZUV2ZW46CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6UGFnZUV2ZW46CiAgICAgICBpZiAocFRhcmdldCAmJiBwVGFyZ2V0LT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpQYWdlQXJlYSkKICAgICAgICAgcFRhcmdldCA9IG51bGxwdHI7CiAgICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0F1dG86CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6QXV0bzoKICAgICBkZWZhdWx0OgogICAgICAgYnJlYWs7CiAgIH0KQEAgLTc5NSw0MCArODEyLDQxIEBACiAgIHN3aXRjaCAoZVR5cGUpIHsKICAgICBjYXNlIFhGQV9FbGVtZW50OjpCcmVha0JlZm9yZToKICAgICBjYXNlIFhGQV9FbGVtZW50OjpCcmVha0FmdGVyOiB7Ci0gICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NCcmVha0xlYWRlciwgd3NCcmVha1RyYWlsZXI7Ci0gICAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IHBDdXJOb2RlLT5HZXROb2RlSXRlbSgKLSAgICAgICAgICBYRkFfTk9ERUlURU1fUGFyZW50LCBYRkFfT2JqZWN0VHlwZTo6Q29udGFpbmVyTm9kZSk7Ci0gICAgICBDWEZBX05vZGUqIHBDb250YWluZXIgPSBwRm9ybU5vZGUtPkdldFRlbXBsYXRlTm9kZSgpOwotICAgICAgYm9vbCBiU3RhcnROZXcgPSBwQ3VyTm9kZS0+R2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX1N0YXJ0TmV3KSAhPSAwOwotICAgICAgQ1hGQV9Ob2RlKiBwU2NyaXB0ID0gcEN1ck5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpTY3JpcHQpOwotICAgICAgaWYgKHBTY3JpcHQgJiYgIVhGQV9MYXlvdXRQYWdlTWdyX1J1bkJyZWFrVGVzdFNjcmlwdChwU2NyaXB0KSkKKyAgICAgIFdpZGVTdHJpbmcgd3NCcmVha0xlYWRlcjsKKyAgICAgIFdpZGVTdHJpbmcgd3NCcmVha1RyYWlsZXI7CisgICAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IHBDdXJOb2RlLT5HZXRDb250YWluZXJQYXJlbnQoKTsKKyAgICAgIENYRkFfTm9kZSogcENvbnRhaW5lciA9IHBGb3JtTm9kZS0+R2V0VGVtcGxhdGVOb2RlSWZFeGlzdHMoKTsKKyAgICAgIGJvb2wgYlN0YXJ0TmV3ID0KKyAgICAgICAgICBwQ3VyTm9kZS0+SlNPYmplY3QoKS0+R2V0SW50ZWdlcihYRkFfQXR0cmlidXRlOjpTdGFydE5ldykgIT0gMDsKKyAgICAgIENYRkFfU2NyaXB0KiBwU2NyaXB0ID0KKyAgICAgICAgICBwQ3VyTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9TY3JpcHQ+KFhGQV9FbGVtZW50OjpTY3JpcHQpOworICAgICAgaWYgKHBTY3JpcHQgJiYgIVJ1bkJyZWFrVGVzdFNjcmlwdChwU2NyaXB0KSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NUYXJnZXQgPSBwQ3VyTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9UYXJnZXQpOworICAgICAgV2lkZVN0cmluZyB3c1RhcmdldCA9CisgICAgICAgICAgcEN1ck5vZGUtPkpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6OlRhcmdldCk7CiAgICAgICBDWEZBX05vZGUqIHBUYXJnZXQgPQogICAgICAgICAgIFJlc29sdmVCcmVha1RhcmdldChtX3BUZW1wbGF0ZVBhZ2VTZXRSb290LCB0cnVlLCB3c1RhcmdldCk7Ci0gICAgICB3c0JyZWFrVHJhaWxlciA9IHBDdXJOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1RyYWlsZXIpOwotICAgICAgd3NCcmVha0xlYWRlciA9IHBDdXJOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX0xlYWRlcik7CisgICAgICB3c0JyZWFrVHJhaWxlciA9IHBDdXJOb2RlLT5KU09iamVjdCgpLT5HZXRDRGF0YShYRkFfQXR0cmlidXRlOjpUcmFpbGVyKTsKKyAgICAgIHdzQnJlYWtMZWFkZXIgPSBwQ3VyTm9kZS0+SlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6TGVhZGVyKTsKICAgICAgIHBCcmVha0xlYWRlclRlbXBsYXRlID0KICAgICAgICAgICBSZXNvbHZlQnJlYWtUYXJnZXQocENvbnRhaW5lciwgdHJ1ZSwgd3NCcmVha0xlYWRlcik7CiAgICAgICBwQnJlYWtUcmFpbGVyVGVtcGxhdGUgPQogICAgICAgICAgIFJlc29sdmVCcmVha1RhcmdldChwQ29udGFpbmVyLCB0cnVlLCB3c0JyZWFrVHJhaWxlcik7Ci0gICAgICBpZiAoUnVuQnJlYWsoZVR5cGUsIHBDdXJOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfVGFyZ2V0VHlwZSksIHBUYXJnZXQsCi0gICAgICAgICAgICAgICAgICAgYlN0YXJ0TmV3KSkgeworICAgICAgaWYgKFJ1bkJyZWFrKGVUeXBlLAorICAgICAgICAgICAgICAgICAgIHBDdXJOb2RlLT5KU09iamVjdCgpLT5HZXRFbnVtKFhGQV9BdHRyaWJ1dGU6OlRhcmdldFR5cGUpLAorICAgICAgICAgICAgICAgICAgIHBUYXJnZXQsIGJTdGFydE5ldykpIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICB9CiAgICAgICBpZiAoIW1fUHJvcG9zZWRDb250YWluZXJSZWNvcmRzLmVtcHR5KCkgJiYKICAgICAgICAgICBtX0N1cnJlbnRDb250YWluZXJSZWNvcmRJdGVyID09IG1fUHJvcG9zZWRDb250YWluZXJSZWNvcmRzLmJlZ2luKCkgJiYKICAgICAgICAgICBlVHlwZSA9PSBYRkFfRWxlbWVudDo6QnJlYWtCZWZvcmUpIHsKLSAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oCi0gICAgICAgICAgICBYRkFfTk9ERUlURU1fUGFyZW50LCBYRkFfT2JqZWN0VHlwZTo6Q29udGFpbmVyTm9kZSk7CisgICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBwRm9ybU5vZGUtPkdldENvbnRhaW5lclBhcmVudCgpOwogICAgICAgICBpZiAoIXBQYXJlbnROb2RlIHx8Ci0gICAgICAgICAgICBwRm9ybU5vZGUgIT0KLSAgICAgICAgICAgICAgICBwUGFyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250YWluZXJOb2RlKSkgeworICAgICAgICAgICAgcEZvcm1Ob2RlICE9IHBQYXJlbnROb2RlLT5HZXRGaXJzdENvbnRhaW5lckNoaWxkKCkpIHsKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBwUGFyZW50Tm9kZSA9IHBQYXJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsKKyAgICAgICAgcFBhcmVudE5vZGUgPSBwUGFyZW50Tm9kZS0+R2V0UGFyZW50KCk7CiAgICAgICAgIGlmICghcFBhcmVudE5vZGUgfHwKICAgICAgICAgICAgIHBQYXJlbnROb2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpGb3JtKSB7CiAgICAgICAgICAgYnJlYWs7CkBAIC04MzgsMTQgKzg1NiwxNSBAQAogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJyZWFrOiB7Ci0gICAgICBib29sIGJTdGFydE5ldyA9IHBDdXJOb2RlLT5HZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfU3RhcnROZXcpICE9IDA7Ci0gICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NUYXJnZXQgPSBwQ3VyTm9kZS0+R2V0Q0RhdGEoCi0gICAgICAgICAgYkJlZm9yZSA/IFhGQV9BVFRSSUJVVEVfQmVmb3JlVGFyZ2V0IDogWEZBX0FUVFJJQlVURV9BZnRlclRhcmdldCk7CisgICAgICBib29sIGJTdGFydE5ldyA9CisgICAgICAgICAgcEN1ck5vZGUtPkpTT2JqZWN0KCktPkdldEludGVnZXIoWEZBX0F0dHJpYnV0ZTo6U3RhcnROZXcpICE9IDA7CisgICAgICBXaWRlU3RyaW5nIHdzVGFyZ2V0ID0gcEN1ck5vZGUtPkpTT2JqZWN0KCktPkdldENEYXRhKAorICAgICAgICAgIGJCZWZvcmUgPyBYRkFfQXR0cmlidXRlOjpCZWZvcmVUYXJnZXQgOiBYRkFfQXR0cmlidXRlOjpBZnRlclRhcmdldCk7CiAgICAgICBDWEZBX05vZGUqIHBUYXJnZXQgPQogICAgICAgICAgIFJlc29sdmVCcmVha1RhcmdldChtX3BUZW1wbGF0ZVBhZ2VTZXRSb290LCB0cnVlLCB3c1RhcmdldCk7CiAgICAgICBpZiAoUnVuQnJlYWsoYkJlZm9yZSA/IFhGQV9FbGVtZW50OjpCcmVha0JlZm9yZSA6IFhGQV9FbGVtZW50OjpCcmVha0FmdGVyLAotICAgICAgICAgICAgICAgICAgIHBDdXJOb2RlLT5HZXRFbnVtKGJCZWZvcmUgPyBYRkFfQVRUUklCVVRFX0JlZm9yZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBYRkFfQVRUUklCVVRFX0FmdGVyKSwKKyAgICAgICAgICAgICAgICAgICBwQ3VyTm9kZS0+SlNPYmplY3QoKS0+R2V0RW51bSgKKyAgICAgICAgICAgICAgICAgICAgICAgYkJlZm9yZSA/IFhGQV9BdHRyaWJ1dGU6OkJlZm9yZSA6IFhGQV9BdHRyaWJ1dGU6OkFmdGVyKSwKICAgICAgICAgICAgICAgICAgICBwVGFyZ2V0LCBiU3RhcnROZXcpKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgfQpAQCAtODY1LDE1ICs4ODQsMTMgQEAKICAgICBib29sJiBiQ3JlYXRlUGFnZSkgewogICBDWEZBX05vZGUqIHBMZWFkZXJUZW1wbGF0ZSA9IG51bGxwdHI7CiAgIENYRkFfTm9kZSogcFRyYWlsZXJUZW1wbGF0ZSA9IG51bGxwdHI7Ci0gIENYRkFfTm9kZSogcEZvcm1Ob2RlID0gcEJyZWFrTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGFpbmVyTm9kZSk7CisgIENYRkFfTm9kZSogcEZvcm1Ob2RlID0gcEJyZWFrTm9kZS0+R2V0Q29udGFpbmVyUGFyZW50KCk7CiAgIGlmIChYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHBGb3JtTm9kZSkpIHsKICAgICBiQ3JlYXRlUGFnZSA9IEV4ZWN1dGVCcmVha0JlZm9yZU9yQWZ0ZXIocEJyZWFrTm9kZSwgYkJlZm9yZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlYWRlclRlbXBsYXRlLCBwVHJhaWxlclRlbXBsYXRlKTsKICAgICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwQnJlYWtOb2RlLT5HZXREb2N1bWVudCgpOwogICAgIENYRkFfTm9kZSogcERhdGFTY29wZSA9IG51bGxwdHI7Ci0gICAgcEZvcm1Ob2RlID0gcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGUpOworICAgIHBGb3JtTm9kZSA9IHBGb3JtTm9kZS0+R2V0Q29udGFpbmVyUGFyZW50KCk7CiAgICAgaWYgKHBMZWFkZXJUZW1wbGF0ZSkgewogICAgICAgaWYgKCFwRGF0YVNjb3BlKQogICAgICAgICBwRGF0YVNjb3BlID0gWEZBX0RhdGFNZXJnZV9GaW5kRGF0YVNjb3BlKHBGb3JtTm9kZSk7CkBAIC05MDIsOCArOTE5LDcgQEAKICAgICBib29sIGJMZWFkZXIsCiAgICAgQ1hGQV9Ob2RlKiYgcEJvb2tlbmRBcHBlbmROb2RlKSB7CiAgIENYRkFfTm9kZSogcExlYWRlclRlbXBsYXRlID0gbnVsbHB0cjsKLSAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUgPSBwQm9va2VuZE5vZGUtPkdldE5vZGVJdGVtKAotICAgICAgWEZBX05PREVJVEVNX1BhcmVudCwgWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGUpOworICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IHBCb29rZW5kTm9kZS0+R2V0Q29udGFpbmVyUGFyZW50KCk7CiAgIGlmIChSZXNvbHZlQm9va2VuZExlYWRlck9yVHJhaWxlcihwQm9va2VuZE5vZGUsIGJMZWFkZXIsIHBMZWFkZXJUZW1wbGF0ZSkpIHsKICAgICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwQm9va2VuZE5vZGUtPkdldERvY3VtZW50KCk7CiAgICAgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlID0gbnVsbHB0cjsKQEAgLTkyNiw1OCArOTQyLDUxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqJiBwVHJhaWxlclRlbXBsYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ3JlYXRlUGFnZSkgewogICBDWEZBX05vZGUqIHBDb250YWluZXIgPQotICAgICAgcE92ZXJmbG93Tm9kZQotICAgICAgICAgIC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCwgWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGUpCi0gICAgICAgICAgLT5HZXRUZW1wbGF0ZU5vZGUoKTsKKyAgICAgIHBPdmVyZmxvd05vZGUtPkdldENvbnRhaW5lclBhcmVudCgpLT5HZXRUZW1wbGF0ZU5vZGVJZkV4aXN0cygpOwogICBpZiAocE92ZXJmbG93Tm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6QnJlYWspIHsKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd3NPdmVyZmxvd0xlYWRlcjsKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd3NPdmVyZmxvd1RhcmdldDsKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd3NPdmVyZmxvd1RyYWlsZXI7Ci0gICAgcE92ZXJmbG93Tm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9PdmVyZmxvd0xlYWRlciwgd3NPdmVyZmxvd0xlYWRlcik7Ci0gICAgcE92ZXJmbG93Tm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RyYWlsZXIsIHdzT3ZlcmZsb3dUcmFpbGVyKTsKLSAgICBwT3ZlcmZsb3dOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX092ZXJmbG93VGFyZ2V0LCB3c092ZXJmbG93VGFyZ2V0KTsKLSAgICBpZiAoIXdzT3ZlcmZsb3dMZWFkZXIuSXNFbXB0eSgpIHx8ICF3c092ZXJmbG93VHJhaWxlci5Jc0VtcHR5KCkgfHwKLSAgICAgICAgIXdzT3ZlcmZsb3dUYXJnZXQuSXNFbXB0eSgpKSB7Ci0gICAgICBpZiAoIXdzT3ZlcmZsb3dUYXJnZXQuSXNFbXB0eSgpICYmIGJDcmVhdGVQYWdlICYmCi0gICAgICAgICAgIW1fYkNyZWF0ZU92ZXJGbG93UGFnZSkgewotICAgICAgICBDWEZBX05vZGUqIHBUYXJnZXQgPQotICAgICAgICAgICAgUmVzb2x2ZUJyZWFrVGFyZ2V0KG1fcFRlbXBsYXRlUGFnZVNldFJvb3QsIHRydWUsIHdzT3ZlcmZsb3dUYXJnZXQpOwotICAgICAgICBpZiAocFRhcmdldCkgewotICAgICAgICAgIG1fYkNyZWF0ZU92ZXJGbG93UGFnZSA9IHRydWU7Ci0gICAgICAgICAgc3dpdGNoIChwVGFyZ2V0LT5HZXRFbGVtZW50VHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIFhGQV9FbGVtZW50OjpQYWdlQXJlYToKLSAgICAgICAgICAgICAgUnVuQnJlYWsoWEZBX0VsZW1lbnQ6Ok92ZXJmbG93LCBYRkFfQVRUUklCVVRFRU5VTV9QYWdlQXJlYSwKLSAgICAgICAgICAgICAgICAgICAgICAgcFRhcmdldCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBYRkFfRWxlbWVudDo6Q29udGVudEFyZWE6Ci0gICAgICAgICAgICAgIFJ1bkJyZWFrKFhGQV9FbGVtZW50OjpPdmVyZmxvdywgWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWEsCi0gICAgICAgICAgICAgICAgICAgICAgIHBUYXJnZXQsIHRydWUpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KKyAgICBXaWRlU3RyaW5nIHdzT3ZlcmZsb3dMZWFkZXIgPQorICAgICAgICBwT3ZlcmZsb3dOb2RlLT5KU09iamVjdCgpLT5HZXRDRGF0YShYRkFfQXR0cmlidXRlOjpPdmVyZmxvd0xlYWRlcik7CisgICAgV2lkZVN0cmluZyB3c092ZXJmbG93VGFyZ2V0ID0KKyAgICAgICAgcE92ZXJmbG93Tm9kZS0+SlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6T3ZlcmZsb3dUYXJnZXQpOworICAgIFdpZGVTdHJpbmcgd3NPdmVyZmxvd1RyYWlsZXIgPQorICAgICAgICBwT3ZlcmZsb3dOb2RlLT5KU09iamVjdCgpLT5HZXRDRGF0YShYRkFfQXR0cmlidXRlOjpPdmVyZmxvd1RyYWlsZXIpOworICAgIGlmICh3c092ZXJmbG93VGFyZ2V0LklzRW1wdHkoKSAmJiB3c092ZXJmbG93TGVhZGVyLklzRW1wdHkoKSAmJgorICAgICAgICB3c092ZXJmbG93VHJhaWxlci5Jc0VtcHR5KCkpIHsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGlmICghd3NPdmVyZmxvd1RhcmdldC5Jc0VtcHR5KCkgJiYgYkNyZWF0ZVBhZ2UgJiYgIW1fYkNyZWF0ZU92ZXJGbG93UGFnZSkgeworICAgICAgQ1hGQV9Ob2RlKiBwVGFyZ2V0ID0KKyAgICAgICAgICBSZXNvbHZlQnJlYWtUYXJnZXQobV9wVGVtcGxhdGVQYWdlU2V0Um9vdCwgdHJ1ZSwgd3NPdmVyZmxvd1RhcmdldCk7CisgICAgICBpZiAocFRhcmdldCkgeworICAgICAgICBtX2JDcmVhdGVPdmVyRmxvd1BhZ2UgPSB0cnVlOworICAgICAgICBzd2l0Y2ggKHBUYXJnZXQtPkdldEVsZW1lbnRUeXBlKCkpIHsKKyAgICAgICAgICBjYXNlIFhGQV9FbGVtZW50OjpQYWdlQXJlYToKKyAgICAgICAgICAgIFJ1bkJyZWFrKFhGQV9FbGVtZW50OjpPdmVyZmxvdywgWEZBX0F0dHJpYnV0ZUVudW06OlBhZ2VBcmVhLAorICAgICAgICAgICAgICAgICAgICAgcFRhcmdldCwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFhGQV9FbGVtZW50OjpDb250ZW50QXJlYToKKyAgICAgICAgICAgIFJ1bkJyZWFrKFhGQV9FbGVtZW50OjpPdmVyZmxvdywgWEZBX0F0dHJpYnV0ZUVudW06OkNvbnRlbnRBcmVhLAorICAgICAgICAgICAgICAgICAgICAgcFRhcmdldCwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIGlmICghYkNyZWF0ZVBhZ2UpIHsKLSAgICAgICAgcExlYWRlclRlbXBsYXRlID0KLSAgICAgICAgICAgIFJlc29sdmVCcmVha1RhcmdldChwQ29udGFpbmVyLCB0cnVlLCB3c092ZXJmbG93TGVhZGVyKTsKLSAgICAgICAgcFRyYWlsZXJUZW1wbGF0ZSA9Ci0gICAgICAgICAgICBSZXNvbHZlQnJlYWtUYXJnZXQocENvbnRhaW5lciwgdHJ1ZSwgd3NPdmVyZmxvd1RyYWlsZXIpOwotICAgICAgfQotICAgICAgcmV0dXJuIHBPdmVyZmxvd05vZGU7CiAgICAgfQotICAgIHJldHVybiBudWxscHRyOworICAgIGlmICghYkNyZWF0ZVBhZ2UpIHsKKyAgICAgIHBMZWFkZXJUZW1wbGF0ZSA9IFJlc29sdmVCcmVha1RhcmdldChwQ29udGFpbmVyLCB0cnVlLCB3c092ZXJmbG93TGVhZGVyKTsKKyAgICAgIHBUcmFpbGVyVGVtcGxhdGUgPQorICAgICAgICAgIFJlc29sdmVCcmVha1RhcmdldChwQ29udGFpbmVyLCB0cnVlLCB3c092ZXJmbG93VHJhaWxlcik7CisgICAgfQorICAgIHJldHVybiBwT3ZlcmZsb3dOb2RlOwogICB9CiAKICAgaWYgKHBPdmVyZmxvd05vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6Ok92ZXJmbG93KQogICAgIHJldHVybiBudWxscHRyOwogCi0gIENGWF9XaWRlU3RyaW5nQyB3c092ZXJmbG93TGVhZGVyOwotICBDRlhfV2lkZVN0cmluZ0Mgd3NPdmVyZmxvd1RyYWlsZXI7Ci0gIENGWF9XaWRlU3RyaW5nQyB3c092ZXJmbG93VGFyZ2V0OwotICBwT3ZlcmZsb3dOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0xlYWRlciwgd3NPdmVyZmxvd0xlYWRlcik7Ci0gIHBPdmVyZmxvd05vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVHJhaWxlciwgd3NPdmVyZmxvd1RyYWlsZXIpOwotICBwT3ZlcmZsb3dOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1RhcmdldCwgd3NPdmVyZmxvd1RhcmdldCk7CisgIFdpZGVTdHJpbmcgd3NPdmVyZmxvd1RhcmdldCA9CisgICAgICBwT3ZlcmZsb3dOb2RlLT5KU09iamVjdCgpLT5HZXRDRGF0YShYRkFfQXR0cmlidXRlOjpUYXJnZXQpOwogICBpZiAoIXdzT3ZlcmZsb3dUYXJnZXQuSXNFbXB0eSgpICYmIGJDcmVhdGVQYWdlICYmICFtX2JDcmVhdGVPdmVyRmxvd1BhZ2UpIHsKICAgICBDWEZBX05vZGUqIHBUYXJnZXQgPQogICAgICAgICBSZXNvbHZlQnJlYWtUYXJnZXQobV9wVGVtcGxhdGVQYWdlU2V0Um9vdCwgdHJ1ZSwgd3NPdmVyZmxvd1RhcmdldCk7CkBAIC05ODUsMTEgKzk5NCwxMSBAQAogICAgICAgbV9iQ3JlYXRlT3ZlckZsb3dQYWdlID0gdHJ1ZTsKICAgICAgIHN3aXRjaCAocFRhcmdldC0+R2V0RWxlbWVudFR5cGUoKSkgewogICAgICAgICBjYXNlIFhGQV9FbGVtZW50OjpQYWdlQXJlYToKLSAgICAgICAgICBSdW5CcmVhayhYRkFfRWxlbWVudDo6T3ZlcmZsb3csIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VBcmVhLCBwVGFyZ2V0LAorICAgICAgICAgIFJ1bkJyZWFrKFhGQV9FbGVtZW50OjpPdmVyZmxvdywgWEZBX0F0dHJpYnV0ZUVudW06OlBhZ2VBcmVhLCBwVGFyZ2V0LAogICAgICAgICAgICAgICAgICAgIHRydWUpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFhGQV9FbGVtZW50OjpDb250ZW50QXJlYToKLSAgICAgICAgICBSdW5CcmVhayhYRkFfRWxlbWVudDo6T3ZlcmZsb3csIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhLAorICAgICAgICAgIFJ1bkJyZWFrKFhGQV9FbGVtZW50OjpPdmVyZmxvdywgWEZBX0F0dHJpYnV0ZUVudW06OkNvbnRlbnRBcmVhLAogICAgICAgICAgICAgICAgICAgIHBUYXJnZXQsIHRydWUpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpAQCAtOTk4LDggKzEwMDcsMTIgQEAKICAgICB9CiAgIH0KICAgaWYgKCFiQ3JlYXRlUGFnZSkgewotICAgIHBMZWFkZXJUZW1wbGF0ZSA9IFJlc29sdmVCcmVha1RhcmdldChwQ29udGFpbmVyLCB0cnVlLCB3c092ZXJmbG93TGVhZGVyKTsKLSAgICBwVHJhaWxlclRlbXBsYXRlID0gUmVzb2x2ZUJyZWFrVGFyZ2V0KHBDb250YWluZXIsIHRydWUsIHdzT3ZlcmZsb3dUcmFpbGVyKTsKKyAgICBXaWRlU3RyaW5nIHdzTGVhZGVyID0KKyAgICAgICAgcE92ZXJmbG93Tm9kZS0+SlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6TGVhZGVyKTsKKyAgICBXaWRlU3RyaW5nIHdzVHJhaWxlciA9CisgICAgICAgIHBPdmVyZmxvd05vZGUtPkpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6OlRyYWlsZXIpOworICAgIHBMZWFkZXJUZW1wbGF0ZSA9IFJlc29sdmVCcmVha1RhcmdldChwQ29udGFpbmVyLCB0cnVlLCB3c0xlYWRlcik7CisgICAgcFRyYWlsZXJUZW1wbGF0ZSA9IFJlc29sdmVCcmVha1RhcmdldChwQ29udGFpbmVyLCB0cnVlLCB3c1RyYWlsZXIpOwogICB9CiAgIHJldHVybiBwT3ZlcmZsb3dOb2RlOwogfQpAQCAtMTAxOSwxNCArMTAzMiwxMyBAQAogICAgICAgcEZvcm1Ob2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpCcmVhaykgewogICAgIGJJc092ZXJmbG93Tm9kZSA9IHRydWU7CiAgIH0KLSAgZm9yIChDWEZBX05vZGUqIHBDdXJOb2RlID0KLSAgICAgICAgICAgYklzT3ZlcmZsb3dOb2RlID8gcEZvcm1Ob2RlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgIHBDdXJOb2RlOyBwQ3VyTm9kZSA9IHBDdXJOb2RlLT5HZXROb2RlSXRlbSgoWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkpIHsKKyAgZm9yIChDWEZBX05vZGUqIHBDdXJOb2RlID0gYklzT3ZlcmZsb3dOb2RlID8gcEZvcm1Ob2RlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZCgpOworICAgICAgIHBDdXJOb2RlOyBwQ3VyTm9kZSA9IHBDdXJOb2RlLT5HZXROZXh0U2libGluZygpKSB7CiAgICAgaWYgKEJyZWFrT3ZlcmZsb3cocEN1ck5vZGUsIHBMZWFkZXJUZW1wbGF0ZSwgcFRyYWlsZXJUZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICBiQ3JlYXRlUGFnZSkpIHsKICAgICAgIGlmIChiSXNPdmVyZmxvd05vZGUpCi0gICAgICAgIHBGb3JtTm9kZSA9IHBDdXJOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsKKyAgICAgICAgcEZvcm1Ob2RlID0gcEN1ck5vZGUtPkdldFBhcmVudCgpOwogCiAgICAgICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwQ3VyTm9kZS0+R2V0RG9jdW1lbnQoKTsKICAgICAgIENYRkFfTm9kZSogcERhdGFTY29wZSA9IG51bGxwdHI7CkBAIC0xMDYxLDI3ICsxMDczLDIyIEBACiAgICAgQ1hGQV9Ob2RlKiBwQm9va2VuZE5vZGUsCiAgICAgYm9vbCBiTGVhZGVyLAogICAgIENYRkFfTm9kZSomIHBCb29rZW5kQXBwZW5kVGVtcGxhdGUpIHsKLSAgQ0ZYX1dpZGVTdHJpbmdDIHdzQm9va2VuZExlYWRlcjsKICAgQ1hGQV9Ob2RlKiBwQ29udGFpbmVyID0KLSAgICAgIHBCb29rZW5kTm9kZQotICAgICAgICAgIC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCwgWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGUpCi0gICAgICAgICAgLT5HZXRUZW1wbGF0ZU5vZGUoKTsKKyAgICAgIHBCb29rZW5kTm9kZS0+R2V0Q29udGFpbmVyUGFyZW50KCktPkdldFRlbXBsYXRlTm9kZUlmRXhpc3RzKCk7CiAgIGlmIChwQm9va2VuZE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkJyZWFrKSB7Ci0gICAgcEJvb2tlbmROb2RlLT5UcnlDRGF0YSgKLSAgICAgICAgYkxlYWRlciA/IFhGQV9BVFRSSUJVVEVfQm9va2VuZExlYWRlciA6IFhGQV9BVFRSSUJVVEVfQm9va2VuZFRyYWlsZXIsCi0gICAgICAgIHdzQm9va2VuZExlYWRlcik7Ci0gICAgaWYgKCF3c0Jvb2tlbmRMZWFkZXIuSXNFbXB0eSgpKSB7Ci0gICAgICBwQm9va2VuZEFwcGVuZFRlbXBsYXRlID0KLSAgICAgICAgICBSZXNvbHZlQnJlYWtUYXJnZXQocENvbnRhaW5lciwgZmFsc2UsIHdzQm9va2VuZExlYWRlcik7CisgICAgV2lkZVN0cmluZyBsZWFkZXIgPSBwQm9va2VuZE5vZGUtPkpTT2JqZWN0KCktPkdldENEYXRhKAorICAgICAgICBiTGVhZGVyID8gWEZBX0F0dHJpYnV0ZTo6Qm9va2VuZExlYWRlciA6IFhGQV9BdHRyaWJ1dGU6OkJvb2tlbmRUcmFpbGVyKTsKKyAgICBpZiAoIWxlYWRlci5Jc0VtcHR5KCkpIHsKKyAgICAgIHBCb29rZW5kQXBwZW5kVGVtcGxhdGUgPSBSZXNvbHZlQnJlYWtUYXJnZXQocENvbnRhaW5lciwgZmFsc2UsIGxlYWRlcik7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgaWYgKHBCb29rZW5kTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6Qm9va2VuZCkgewotICAgIHBCb29rZW5kTm9kZS0+VHJ5Q0RhdGEoCi0gICAgICAgIGJMZWFkZXIgPyBYRkFfQVRUUklCVVRFX0xlYWRlciA6IFhGQV9BVFRSSUJVVEVfVHJhaWxlciwKLSAgICAgICAgd3NCb29rZW5kTGVhZGVyKTsKLSAgICBwQm9va2VuZEFwcGVuZFRlbXBsYXRlID0KLSAgICAgICAgUmVzb2x2ZUJyZWFrVGFyZ2V0KHBDb250YWluZXIsIHRydWUsIHdzQm9va2VuZExlYWRlcik7CisgIH0KKworICBpZiAocEJvb2tlbmROb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpCb29rZW5kKSB7CisgICAgV2lkZVN0cmluZyBsZWFkZXIgPSBwQm9va2VuZE5vZGUtPkpTT2JqZWN0KCktPkdldENEYXRhKAorICAgICAgICBiTGVhZGVyID8gWEZBX0F0dHJpYnV0ZTo6TGVhZGVyIDogWEZBX0F0dHJpYnV0ZTo6VHJhaWxlcik7CisgICAgcEJvb2tlbmRBcHBlbmRUZW1wbGF0ZSA9IFJlc29sdmVCcmVha1RhcmdldChwQ29udGFpbmVyLCB0cnVlLCBsZWFkZXIpOwogICAgIHJldHVybiB0cnVlOwogICB9CiAgIHJldHVybiBmYWxzZTsKQEAgLTExMDEsMTAgKzExMDgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGFyZ2V0UGFnZUFyZWEsIHBUYXJnZXRDb250ZW50QXJlYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiTmV3UGFnZSwgYlF1ZXJ5KTsKICAgfQotICBYRkFfQVRUUklCVVRFRU5VTSBlUHJlZmVycmVkUG9zaXRpb24gPQorICBYRkFfQXR0cmlidXRlRW51bSBlUHJlZmVycmVkUG9zaXRpb24gPQogICAgICAgbV9DdXJyZW50Q29udGFpbmVyUmVjb3JkSXRlciAhPSBtX1Byb3Bvc2VkQ29udGFpbmVyUmVjb3Jkcy5lbmQoKQotICAgICAgICAgID8gWEZBX0FUVFJJQlVURUVOVU1fUmVzdAotICAgICAgICAgIDogWEZBX0FUVFJJQlVURUVOVU1fRmlyc3Q7CisgICAgICAgICAgPyBYRkFfQXR0cmlidXRlRW51bTo6UmVzdAorICAgICAgICAgIDogWEZBX0F0dHJpYnV0ZUVudW06OkZpcnN0OwogICByZXR1cm4gRmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXRfU2ltcGxleER1cGxleCgKICAgICAgIHBQYWdlU2V0LCBwU3RhcnRDaGlsZCwgcFRhcmdldFBhZ2VBcmVhLCBwVGFyZ2V0Q29udGVudEFyZWEsIGJOZXdQYWdlLAogICAgICAgYlF1ZXJ5LCBlUHJlZmVycmVkUG9zaXRpb24pOwpAQCAtMTEyMywyMSArMTEzMCwyNiBAQAogICAgIGlmIChpdCAhPSBtX3BQYWdlU2V0TWFwLmVuZCgpKQogICAgICAgaVBhZ2VTZXRDb3VudCA9IGl0LT5zZWNvbmQ7CiAgICAgaW50MzJfdCBpTWF4ID0gLTE7Ci0gICAgQ1hGQV9Ob2RlKiBwT2NjdXJOb2RlID0gcFBhZ2VTZXQtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpPY2N1cik7Ci0gICAgaWYgKHBPY2N1ck5vZGUpCi0gICAgICBwT2NjdXJOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4LCBpTWF4LCBmYWxzZSk7CisgICAgQ1hGQV9Ob2RlKiBwT2NjdXJOb2RlID0KKyAgICAgICAgcFBhZ2VTZXQtPkdldEZpcnN0Q2hpbGRCeUNsYXNzPENYRkFfT2NjdXI+KFhGQV9FbGVtZW50OjpPY2N1cik7CisgICAgaWYgKHBPY2N1ck5vZGUpIHsKKyAgICAgIE9wdGlvbmFsPGludDMyX3Q+IHJldCA9CisgICAgICAgICAgcE9jY3VyTm9kZS0+SlNPYmplY3QoKS0+VHJ5SW50ZWdlcihYRkFfQXR0cmlidXRlOjpNYXgsIGZhbHNlKTsKKyAgICAgIGlmIChyZXQpCisgICAgICAgIGlNYXggPSAqcmV0OworICAgIH0KICAgICBpZiAoaU1heCA+PSAwICYmIGlNYXggPD0gaVBhZ2VTZXRDb3VudCkKICAgICAgIHJldHVybiBmYWxzZTsKICAgfQorCiAgIGJvb2wgYlJlcyA9IGZhbHNlOwogICBDWEZBX05vZGUqIHBDdXJyZW50Tm9kZSA9Ci0gICAgICBwU3RhcnRDaGlsZCA/IHBTdGFydENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpCi0gICAgICAgICAgICAgICAgICA6IHBQYWdlU2V0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gIGZvciAoOyBwQ3VycmVudE5vZGU7Ci0gICAgICAgcEN1cnJlbnROb2RlID0gcEN1cnJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7CisgICAgICBwU3RhcnRDaGlsZCA/IHBTdGFydENoaWxkLT5HZXROZXh0U2libGluZygpIDogcFBhZ2VTZXQtPkdldEZpcnN0Q2hpbGQoKTsKKyAgZm9yICg7IHBDdXJyZW50Tm9kZTsgcEN1cnJlbnROb2RlID0gcEN1cnJlbnROb2RlLT5HZXROZXh0U2libGluZygpKSB7CiAgICAgaWYgKHBDdXJyZW50Tm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6UGFnZUFyZWEpIHsKICAgICAgIGlmICgocFRhcmdldFBhZ2VBcmVhID09IHBDdXJyZW50Tm9kZSB8fCAhcFRhcmdldFBhZ2VBcmVhKSkgewotICAgICAgICBpZiAoIXBDdXJyZW50Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VsZW1lbnQ6OkNvbnRlbnRBcmVhKSkgeworICAgICAgICBpZiAoIXBDdXJyZW50Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9Db250ZW50QXJlYT4oCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkNvbnRlbnRBcmVhKSkgewogICAgICAgICAgIGlmIChwVGFyZ2V0UGFnZUFyZWEgPT0gcEN1cnJlbnROb2RlKSB7CiAgICAgICAgICAgICBDcmVhdGVNaW5QYWdlUmVjb3JkKHBDdXJyZW50Tm9kZSwgdHJ1ZSk7CiAgICAgICAgICAgICBwVGFyZ2V0UGFnZUFyZWEgPSBudWxscHRyOwpAQCAtMTE1MCw3ICsxMTYyLDggQEAKICAgICAgICAgICBBZGRQYWdlQXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcEN1cnJlbnROb2RlKTsKICAgICAgICAgICBpZiAoIXBUYXJnZXRDb250ZW50QXJlYSkgewogICAgICAgICAgICAgcFRhcmdldENvbnRlbnRBcmVhID0KLSAgICAgICAgICAgICAgICBwQ3VycmVudE5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpDb250ZW50QXJlYSk7CisgICAgICAgICAgICAgICAgcEN1cnJlbnROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX0NvbnRlbnRBcmVhPigKKyAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkNvbnRlbnRBcmVhKTsKICAgICAgICAgICB9CiAgICAgICAgICAgQWRkQ29udGVudEFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBUYXJnZXRDb250ZW50QXJlYSk7CiAgICAgICAgIH0KQEAgLTExODQsNTMgKzExOTcsNTQgQEAKICAgICBDWEZBX05vZGUqIHBUYXJnZXRDb250ZW50QXJlYSwKICAgICBib29sIGJOZXdQYWdlLAogICAgIGJvb2wgYlF1ZXJ5LAotICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVQcmVmZXJyZWRQb3NpdGlvbikgewotICBjb25zdCBYRkFfQVRUUklCVVRFRU5VTSBlRmFsbGJhY2tQb3NpdGlvbiA9IFhGQV9BVFRSSUJVVEVFTlVNX0FueTsKKyAgICBYRkFfQXR0cmlidXRlRW51bSBlUHJlZmVycmVkUG9zaXRpb24pIHsKKyAgY29uc3QgWEZBX0F0dHJpYnV0ZUVudW0gZUZhbGxiYWNrUG9zaXRpb24gPSBYRkFfQXR0cmlidXRlRW51bTo6QW55OwogICBDWEZBX05vZGUqIHBQcmVmZXJyZWRQYWdlQXJlYSA9IG51bGxwdHI7CiAgIENYRkFfTm9kZSogcEZhbGxiYWNrUGFnZUFyZWEgPSBudWxscHRyOwogICBDWEZBX05vZGUqIHBDdXJyZW50Tm9kZSA9IG51bGxwdHI7CiAgIGlmICghcFN0YXJ0Q2hpbGQgfHwgcFN0YXJ0Q2hpbGQtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlBhZ2VBcmVhKQotICAgIHBDdXJyZW50Tm9kZSA9IHBQYWdlU2V0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7CisgICAgcEN1cnJlbnROb2RlID0gcFBhZ2VTZXQtPkdldEZpcnN0Q2hpbGQoKTsKICAgZWxzZQotICAgIHBDdXJyZW50Tm9kZSA9IHBTdGFydENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOworICAgIHBDdXJyZW50Tm9kZSA9IHBTdGFydENoaWxkLT5HZXROZXh0U2libGluZygpOwogCi0gIGZvciAoOyBwQ3VycmVudE5vZGU7Ci0gICAgICAgcEN1cnJlbnROb2RlID0gcEN1cnJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7CisgIGZvciAoOyBwQ3VycmVudE5vZGU7IHBDdXJyZW50Tm9kZSA9IHBDdXJyZW50Tm9kZS0+R2V0TmV4dFNpYmxpbmcoKSkgewogICAgIGlmIChwQ3VycmVudE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlBhZ2VBcmVhKSB7Ci0gICAgICBpZiAoIU1hdGNoUGFnZUFyZWFPZGRPckV2ZW4ocEN1cnJlbnROb2RlLCBmYWxzZSkpCisgICAgICBpZiAoIU1hdGNoUGFnZUFyZWFPZGRPckV2ZW4ocEN1cnJlbnROb2RlKSkKICAgICAgICAgY29udGludWU7CiAKLSAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVDdXJQYWdlUG9zaXRpb24gPQotICAgICAgICAgIHBDdXJyZW50Tm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1BhZ2VQb3NpdGlvbik7Ci0gICAgICBpZiAoZVByZWZlcnJlZFBvc2l0aW9uID09IFhGQV9BVFRSSUJVVEVFTlVNX0xhc3QpIHsKKyAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtIGVDdXJQYWdlUG9zaXRpb24gPQorICAgICAgICAgIHBDdXJyZW50Tm9kZS0+SlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpQYWdlUG9zaXRpb24pOworICAgICAgaWYgKGVQcmVmZXJyZWRQb3NpdGlvbiA9PSBYRkFfQXR0cmlidXRlRW51bTo6TGFzdCkgewogICAgICAgICBpZiAoZUN1clBhZ2VQb3NpdGlvbiAhPSBlUHJlZmVycmVkUG9zaXRpb24pCiAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChtX2VQYWdlU2V0TW9kZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9TaW1wbGV4UGFnaW5hdGVkIHx8Ci0gICAgICAgICAgICBwQ3VycmVudE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9PZGRPckV2ZW4pID09Ci0gICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fQW55KSB7CisgICAgICAgIGlmIChtX2VQYWdlU2V0TW9kZSA9PSBYRkFfQXR0cmlidXRlRW51bTo6U2ltcGxleFBhZ2luYXRlZCB8fAorICAgICAgICAgICAgcEN1cnJlbnROb2RlLT5KU09iamVjdCgpLT5HZXRFbnVtKFhGQV9BdHRyaWJ1dGU6Ok9kZE9yRXZlbikgPT0KKyAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlRW51bTo6QW55KSB7CiAgICAgICAgICAgcFByZWZlcnJlZFBhZ2VBcmVhID0gcEN1cnJlbnROb2RlOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkID0gQ3JlYXRlQ29udGFpbmVyUmVjb3JkKCk7CiAgICAgICAgIEFkZFBhZ2VBcmVhTGF5b3V0SXRlbShwTmV3UmVjb3JkLCBwQ3VycmVudE5vZGUpOwotICAgICAgICBBZGRDb250ZW50QXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcEN1cnJlbnROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6Q29udGVudEFyZWEpKTsKKyAgICAgICAgQWRkQ29udGVudEFyZWFMYXlvdXRJdGVtKAorICAgICAgICAgICAgcE5ld1JlY29yZCwgcEN1cnJlbnROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX0NvbnRlbnRBcmVhPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6Q29udGVudEFyZWEpKTsKICAgICAgICAgcFByZWZlcnJlZFBhZ2VBcmVhID0gcEN1cnJlbnROb2RlOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICB9Ci0gICAgICBpZiAoZVByZWZlcnJlZFBvc2l0aW9uID09IFhGQV9BVFRSSUJVVEVFTlVNX09ubHkpIHsKKyAgICAgIGlmIChlUHJlZmVycmVkUG9zaXRpb24gPT0gWEZBX0F0dHJpYnV0ZUVudW06Ok9ubHkpIHsKICAgICAgICAgaWYgKGVDdXJQYWdlUG9zaXRpb24gIT0gZVByZWZlcnJlZFBvc2l0aW9uKQogICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICBpZiAobV9lUGFnZVNldE1vZGUgIT0gWEZBX0FUVFJJQlVURUVOVU1fRHVwbGV4UGFnaW5hdGVkIHx8Ci0gICAgICAgICAgICBwQ3VycmVudE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9PZGRPckV2ZW4pID09Ci0gICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fQW55KSB7CisgICAgICAgIGlmIChtX2VQYWdlU2V0TW9kZSAhPSBYRkFfQXR0cmlidXRlRW51bTo6RHVwbGV4UGFnaW5hdGVkIHx8CisgICAgICAgICAgICBwQ3VycmVudE5vZGUtPkpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6T2RkT3JFdmVuKSA9PQorICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpBbnkpIHsKICAgICAgICAgICBwUHJlZmVycmVkUGFnZUFyZWEgPSBwQ3VycmVudE5vZGU7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQogICAgICAgaWYgKChwVGFyZ2V0UGFnZUFyZWEgPT0gcEN1cnJlbnROb2RlIHx8ICFwVGFyZ2V0UGFnZUFyZWEpKSB7Ci0gICAgICAgIGlmICghcEN1cnJlbnROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRWxlbWVudDo6Q29udGVudEFyZWEpKSB7CisgICAgICAgIGlmICghcEN1cnJlbnROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX0NvbnRlbnRBcmVhPigKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6Q29udGVudEFyZWEpKSB7CiAgICAgICAgICAgaWYgKHBUYXJnZXRQYWdlQXJlYSA9PSBwQ3VycmVudE5vZGUpIHsKICAgICAgICAgICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkID0gQ3JlYXRlQ29udGFpbmVyUmVjb3JkKCk7CiAgICAgICAgICAgICBBZGRQYWdlQXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcEN1cnJlbnROb2RlKTsKQEAgLTEyMzgsMjEgKzEyNTIsMjEgQEAKICAgICAgICAgICB9CiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKChlUHJlZmVycmVkUG9zaXRpb24gPT0gWEZBX0FUVFJJQlVURUVOVU1fUmVzdCAmJgotICAgICAgICAgICAgIGVDdXJQYWdlUG9zaXRpb24gPT0gWEZBX0FUVFJJQlVURUVOVU1fQW55KSB8fAorICAgICAgICBpZiAoKGVQcmVmZXJyZWRQb3NpdGlvbiA9PSBYRkFfQXR0cmlidXRlRW51bTo6UmVzdCAmJgorICAgICAgICAgICAgIGVDdXJQYWdlUG9zaXRpb24gPT0gWEZBX0F0dHJpYnV0ZUVudW06OkFueSkgfHwKICAgICAgICAgICAgIGVDdXJQYWdlUG9zaXRpb24gPT0gZVByZWZlcnJlZFBvc2l0aW9uKSB7CiAgICAgICAgICAgcFByZWZlcnJlZFBhZ2VBcmVhID0gcEN1cnJlbnROb2RlOwogICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYgKGVDdXJQYWdlUG9zaXRpb24gPT0gZUZhbGxiYWNrUG9zaXRpb24gJiYKLSAgICAgICAgICAgICAgICAgICAhcEZhbGxiYWNrUGFnZUFyZWEpIHsKKyAgICAgICAgfQorICAgICAgICBpZiAoZUN1clBhZ2VQb3NpdGlvbiA9PSBlRmFsbGJhY2tQb3NpdGlvbiAmJiAhcEZhbGxiYWNrUGFnZUFyZWEpIHsKICAgICAgICAgICBwRmFsbGJhY2tQYWdlQXJlYSA9IHBDdXJyZW50Tm9kZTsKICAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChwVGFyZ2V0UGFnZUFyZWEgJiYKLSAgICAgICAgICAgICAgICAgIU1hdGNoUGFnZUFyZWFPZGRPckV2ZW4ocFRhcmdldFBhZ2VBcmVhLCBmYWxzZSkpIHsKKyAgICAgIH0gZWxzZSBpZiAocFRhcmdldFBhZ2VBcmVhICYmICFNYXRjaFBhZ2VBcmVhT2RkT3JFdmVuKHBUYXJnZXRQYWdlQXJlYSkpIHsKICAgICAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQgPSBDcmVhdGVDb250YWluZXJSZWNvcmQoKTsKICAgICAgICAgQWRkUGFnZUFyZWFMYXlvdXRJdGVtKHBOZXdSZWNvcmQsIHBDdXJyZW50Tm9kZSk7Ci0gICAgICAgIEFkZENvbnRlbnRBcmVhTGF5b3V0SXRlbShwTmV3UmVjb3JkLCBwQ3VycmVudE5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpDb250ZW50QXJlYSkpOworICAgICAgICBBZGRDb250ZW50QXJlYUxheW91dEl0ZW0oCisgICAgICAgICAgICBwTmV3UmVjb3JkLCBwQ3VycmVudE5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzPENYRkFfQ29udGVudEFyZWE+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpDb250ZW50QXJlYSkpOwogICAgICAgfQogICAgIH0gZWxzZSBpZiAocEN1cnJlbnROb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpQYWdlU2V0KSB7CiAgICAgICBpZiAoRmluZFBhZ2VBcmVhRnJvbVBhZ2VTZXRfU2ltcGxleER1cGxleCgKQEAgLTEyNzYsOCArMTI5MCw4IEBACiAgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQgPSBDcmVhdGVDb250YWluZXJSZWNvcmQoKTsKICAgICBBZGRQYWdlQXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcEN1clBhZ2VBcmVhKTsKICAgICBpZiAoIXBUYXJnZXRDb250ZW50QXJlYSkgewotICAgICAgcFRhcmdldENvbnRlbnRBcmVhID0KLSAgICAgICAgICBwQ3VyUGFnZUFyZWEtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpDb250ZW50QXJlYSk7CisgICAgICBwVGFyZ2V0Q29udGVudEFyZWEgPSBwQ3VyUGFnZUFyZWEtPkdldEZpcnN0Q2hpbGRCeUNsYXNzPENYRkFfQ29udGVudEFyZWE+KAorICAgICAgICAgIFhGQV9FbGVtZW50OjpDb250ZW50QXJlYSk7CiAgICAgfQogICAgIEFkZENvbnRlbnRBcmVhTGF5b3V0SXRlbShwTmV3UmVjb3JkLCBwVGFyZ2V0Q29udGVudEFyZWEpOwogICB9CkBAIC0xMjg1LDIzICsxMjk5LDE3IEBACiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENYRkFfTGF5b3V0UGFnZU1ncjo6TWF0Y2hQYWdlQXJlYU9kZE9yRXZlbihDWEZBX05vZGUqIHBQYWdlQXJlYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkxhc3RNYXRjaCkgewotICBpZiAobV9lUGFnZVNldE1vZGUgIT0gWEZBX0FUVFJJQlVURUVOVU1fRHVwbGV4UGFnaW5hdGVkKQorYm9vbCBDWEZBX0xheW91dFBhZ2VNZ3I6Ok1hdGNoUGFnZUFyZWFPZGRPckV2ZW4oQ1hGQV9Ob2RlKiBwUGFnZUFyZWEpIHsKKyAgaWYgKG1fZVBhZ2VTZXRNb2RlICE9IFhGQV9BdHRyaWJ1dGVFbnVtOjpEdXBsZXhQYWdpbmF0ZWQpCiAgICAgcmV0dXJuIHRydWU7CiAKLSAgWEZBX0FUVFJJQlVURUVOVU0gZU9kZE9yRXZlbiA9IFhGQV9BVFRSSUJVVEVFTlVNX0FueTsKLSAgcFBhZ2VBcmVhLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfT2RkT3JFdmVuLCBlT2RkT3JFdmVuKTsKLSAgaWYgKGVPZGRPckV2ZW4gIT0gWEZBX0FUVFJJQlVURUVOVU1fQW55KSB7Ci0gICAgaW50MzJfdCBpUGFnZUNvdW50ID0gR2V0UGFnZUNvdW50KCk7Ci0gICAgaWYgKGJMYXN0TWF0Y2gpIHsKLSAgICAgIHJldHVybiBlT2RkT3JFdmVuID09IFhGQV9BVFRSSUJVVEVFTlVNX09kZCA/IGlQYWdlQ291bnQgJSAyID09IDEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlQYWdlQ291bnQgJSAyID09IDA7Ci0gICAgfQotICAgIHJldHVybiBlT2RkT3JFdmVuID09IFhGQV9BVFRSSUJVVEVFTlVNX09kZCA/IGlQYWdlQ291bnQgJSAyID09IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpUGFnZUNvdW50ICUgMiA9PSAxOwotICB9Ci0gIHJldHVybiB0cnVlOworICBPcHRpb25hbDxYRkFfQXR0cmlidXRlRW51bT4gcmV0ID0KKyAgICAgIHBQYWdlQXJlYS0+SlNPYmplY3QoKS0+VHJ5RW51bShYRkFfQXR0cmlidXRlOjpPZGRPckV2ZW4sIHRydWUpOworICBpZiAoIXJldCB8fCAqcmV0ID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpBbnkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaW50MzJfdCBpUGFnZUxhc3QgPSBHZXRQYWdlQ291bnQoKSAlIDI7CisgIHJldHVybiAqcmV0ID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpPZGQgPyBpUGFnZUxhc3QgPT0gMCA6IGlQYWdlTGFzdCA9PSAxOwogfQogCiBDWEZBX05vZGUqIENYRkFfTGF5b3V0UGFnZU1ncjo6R2V0TmV4dEF2YWlsUGFnZUFyZWEoCkBAIC0xMzIzLDkgKzEzMzEsMTMgQEAKICAgICBpZiAoSXNQYWdlU2V0Um9vdE9yZGVyZWRPY2N1cnJlbmNlKCkpIHsKICAgICAgIGludDMyX3QgaU1heCA9IC0xOwogICAgICAgQ1hGQV9Ob2RlKiBwT2NjdXJOb2RlID0KLSAgICAgICAgICBtX3BDdXJQYWdlQXJlYS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VsZW1lbnQ6Ok9jY3VyKTsKLSAgICAgIGlmIChwT2NjdXJOb2RlKQotICAgICAgICBwT2NjdXJOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4LCBpTWF4LCBmYWxzZSk7CisgICAgICAgICAgbV9wQ3VyUGFnZUFyZWEtPkdldEZpcnN0Q2hpbGRCeUNsYXNzPENYRkFfT2NjdXI+KFhGQV9FbGVtZW50OjpPY2N1cik7CisgICAgICBpZiAocE9jY3VyTm9kZSkgeworICAgICAgICBPcHRpb25hbDxpbnQzMl90PiByZXQgPQorICAgICAgICAgICAgcE9jY3VyTm9kZS0+SlNPYmplY3QoKS0+VHJ5SW50ZWdlcihYRkFfQXR0cmlidXRlOjpNYXgsIGZhbHNlKTsKKyAgICAgICAgaWYgKHJldCkKKyAgICAgICAgICBpTWF4ID0gKnJldDsKKyAgICAgIH0KICAgICAgIGlmICgoaU1heCA8IDAgfHwgbV9uQ3VyUGFnZUNvdW50IDwgaU1heCkpIHsKICAgICAgICAgaWYgKCFiUXVlcnkpIHsKICAgICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCA9CkBAIC0xMzMzLDcgKzEzNDUsOCBAQAogICAgICAgICAgIEFkZFBhZ2VBcmVhTGF5b3V0SXRlbShwTmV3UmVjb3JkLCBtX3BDdXJQYWdlQXJlYSk7CiAgICAgICAgICAgaWYgKCFwVGFyZ2V0Q29udGVudEFyZWEpIHsKICAgICAgICAgICAgIHBUYXJnZXRDb250ZW50QXJlYSA9Ci0gICAgICAgICAgICAgICAgbV9wQ3VyUGFnZUFyZWEtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpDb250ZW50QXJlYSk7CisgICAgICAgICAgICAgICAgbV9wQ3VyUGFnZUFyZWEtPkdldEZpcnN0Q2hpbGRCeUNsYXNzPENYRkFfQ29udGVudEFyZWE+KAorICAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6Q29udGVudEFyZWEpOwogICAgICAgICAgIH0KICAgICAgICAgICBBZGRDb250ZW50QXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcFRhcmdldENvbnRlbnRBcmVhKTsKICAgICAgICAgfQpAQCAtMTM0NSwxMyArMTM1OCwxMyBAQAogCiAgIGlmICghYlF1ZXJ5ICYmIElzUGFnZVNldFJvb3RPcmRlcmVkT2NjdXJyZW5jZSgpKQogICAgIENyZWF0ZU1pblBhZ2VSZWNvcmQobV9wQ3VyUGFnZUFyZWEsIGZhbHNlLCB0cnVlKTsKLSAgaWYgKEZpbmRQYWdlQXJlYUZyb21QYWdlU2V0KG1fcEN1clBhZ2VBcmVhLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1clBhZ2VBcmVhLCBwVGFyZ2V0UGFnZUFyZWEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGFyZ2V0Q29udGVudEFyZWEsIGJOZXdQYWdlLCBiUXVlcnkpKSB7CisgIGlmIChGaW5kUGFnZUFyZWFGcm9tUGFnZVNldChtX3BDdXJQYWdlQXJlYS0+R2V0UGFyZW50KCksIG1fcEN1clBhZ2VBcmVhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRhcmdldFBhZ2VBcmVhLCBwVGFyZ2V0Q29udGVudEFyZWEsIGJOZXdQYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlF1ZXJ5KSkgewogICAgIHJldHVybiBtX3BDdXJQYWdlQXJlYTsKICAgfQogCi0gIENYRkFfTm9kZSogcFBhZ2VTZXQgPSBtX3BDdXJQYWdlQXJlYS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7CisgIENYRkFfTm9kZSogcFBhZ2VTZXQgPSBtX3BDdXJQYWdlQXJlYS0+R2V0UGFyZW50KCk7CiAgIHdoaWxlICh0cnVlKSB7CiAgICAgaWYgKEZpbmRQYWdlQXJlYUZyb21QYWdlU2V0KHBQYWdlU2V0LCBudWxscHRyLCBwVGFyZ2V0UGFnZUFyZWEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUYXJnZXRDb250ZW50QXJlYSwgYk5ld1BhZ2UsIGJRdWVyeSkpIHsKQEAgLTEzNjYsNyArMTM3OSw3IEBACiAgICAgaWYgKHBQYWdlU2V0ID09IG1fcFRlbXBsYXRlUGFnZVNldFJvb3QpCiAgICAgICBicmVhazsKIAotICAgIHBQYWdlU2V0ID0gcFBhZ2VTZXQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOworICAgIHBQYWdlU2V0ID0gcFBhZ2VTZXQtPkdldFBhcmVudCgpOwogICB9CiAgIHJldHVybiBudWxscHRyOwogfQpAQCAtMTM3NSwxMiArMTM4OCwxMiBAQAogICBDWEZBX05vZGUqIHBDdXJDb250ZW50Tm9kZSA9CiAgICAgICBHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCktPnBDdXJDb250ZW50QXJlYS0+bV9wRm9ybU5vZGU7CiAgIGlmICghcENvbnRlbnRBcmVhKSB7Ci0gICAgcENvbnRlbnRBcmVhID0KLSAgICAgICAgcEN1ckNvbnRlbnROb2RlLT5HZXROZXh0U2FtZUNsYXNzU2libGluZyhYRkFfRWxlbWVudDo6Q29udGVudEFyZWEpOworICAgIHBDb250ZW50QXJlYSA9IHBDdXJDb250ZW50Tm9kZS0+R2V0TmV4dFNhbWVDbGFzc1NpYmxpbmc8Q1hGQV9Db250ZW50QXJlYT4oCisgICAgICAgIFhGQV9FbGVtZW50OjpDb250ZW50QXJlYSk7CiAgICAgaWYgKCFwQ29udGVudEFyZWEpCiAgICAgICByZXR1cm4gZmFsc2U7CiAgIH0gZWxzZSB7Ci0gICAgaWYgKHBDb250ZW50QXJlYS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkgIT0gbV9wQ3VyUGFnZUFyZWEpCisgICAgaWYgKHBDb250ZW50QXJlYS0+R2V0UGFyZW50KCkgIT0gbV9wQ3VyUGFnZUFyZWEpCiAgICAgICByZXR1cm4gZmFsc2U7CiAKICAgICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBDb250ZW50QXJlYUxheW91dCA9IG51bGxwdHI7CkBAIC0xNDExLDkgKzE0MjQsOSBAQAogICBmb3IgKENYRkFfTm9kZSogcFBhZ2VTZXROb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcFBhZ2VTZXROb2RlOwogICAgICAgIHBQYWdlU2V0Tm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsKICAgICBpZiAocFBhZ2VTZXROb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpQYWdlU2V0KSB7Ci0gICAgICBYRkFfQVRUUklCVVRFRU5VTSBlUmVsYXRpb24gPQotICAgICAgICAgIHBQYWdlU2V0Tm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1JlbGF0aW9uKTsKLSAgICAgIGlmIChlUmVsYXRpb24gPT0gWEZBX0FUVFJJQlVURUVOVU1fT3JkZXJlZE9jY3VycmVuY2UpCisgICAgICBYRkFfQXR0cmlidXRlRW51bSBlUmVsYXRpb24gPQorICAgICAgICAgIHBQYWdlU2V0Tm9kZS0+SlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpSZWxhdGlvbik7CisgICAgICBpZiAoZVJlbGF0aW9uID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpPcmRlcmVkT2NjdXJyZW5jZSkKICAgICAgICAgbV9wUGFnZVNldE1hcFtwUGFnZVNldE5vZGVdID0gMDsKICAgICB9CiAgIH0KQEAgLTE0MjUsMjQgKzE0MzgsMzIgQEAKICAgaWYgKCFwUGFnZUFyZWEpCiAgICAgcmV0dXJuIDA7CiAKLSAgQ1hGQV9Ob2RlKiBwT2NjdXJOb2RlID0gcFBhZ2VBcmVhLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRWxlbWVudDo6T2NjdXIpOwogICBpbnQzMl90IGlNaW4gPSAwOwotICBpZiAoKHBPY2N1ck5vZGUgJiYgcE9jY3VyTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX01pbiwgaU1pbiwgZmFsc2UpKSB8fAotICAgICAgYlRhcmdldFBhZ2VBcmVhKSB7Ci0gICAgQ1hGQV9Ob2RlKiBwQ29udGVudEFyZWEgPQotICAgICAgICBwUGFnZUFyZWEtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpDb250ZW50QXJlYSk7Ci0gICAgaWYgKGlNaW4gPCAxICYmIGJUYXJnZXRQYWdlQXJlYSAmJiAhcENvbnRlbnRBcmVhKQotICAgICAgaU1pbiA9IDE7CisgIE9wdGlvbmFsPGludDMyX3Q+IHJldDsKKyAgQ1hGQV9Ob2RlKiBwT2NjdXJOb2RlID0KKyAgICAgIHBQYWdlQXJlYS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9PY2N1cj4oWEZBX0VsZW1lbnQ6Ok9jY3VyKTsKKyAgaWYgKHBPY2N1ck5vZGUpIHsKKyAgICByZXQgPSBwT2NjdXJOb2RlLT5KU09iamVjdCgpLT5UcnlJbnRlZ2VyKFhGQV9BdHRyaWJ1dGU6Ok1pbiwgZmFsc2UpOworICAgIGlmIChyZXQpCisgICAgICBpTWluID0gKnJldDsKKyAgfQogCi0gICAgaW50MzJfdCBpID0gMDsKLSAgICBpZiAoYkNyZWF0ZUxhc3QpCi0gICAgICBpID0gbV9uQ3VyUGFnZUNvdW50OworICBpZiAoIXJldCAmJiAhYlRhcmdldFBhZ2VBcmVhKQorICAgIHJldHVybiBpTWluOwogCi0gICAgZm9yICg7IGkgPCBpTWluOyBpKyspIHsKLSAgICAgIENYRkFfQ29udGFpbmVyUmVjb3JkKiBwTmV3UmVjb3JkID0gQ3JlYXRlQ29udGFpbmVyUmVjb3JkKCk7Ci0gICAgICBBZGRQYWdlQXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcFBhZ2VBcmVhKTsKLSAgICAgIEFkZENvbnRlbnRBcmVhTGF5b3V0SXRlbShwTmV3UmVjb3JkLCBwQ29udGVudEFyZWEpOwotICAgIH0KKyAgQ1hGQV9Ob2RlKiBwQ29udGVudEFyZWEgPSBwUGFnZUFyZWEtPkdldEZpcnN0Q2hpbGRCeUNsYXNzPENYRkFfQ29udGVudEFyZWE+KAorICAgICAgWEZBX0VsZW1lbnQ6OkNvbnRlbnRBcmVhKTsKKyAgaWYgKGlNaW4gPCAxICYmIGJUYXJnZXRQYWdlQXJlYSAmJiAhcENvbnRlbnRBcmVhKQorICAgIGlNaW4gPSAxOworCisgIGludDMyX3QgaSA9IDA7CisgIGlmIChiQ3JlYXRlTGFzdCkKKyAgICBpID0gbV9uQ3VyUGFnZUNvdW50OworCisgIGZvciAoOyBpIDwgaU1pbjsgaSsrKSB7CisgICAgQ1hGQV9Db250YWluZXJSZWNvcmQqIHBOZXdSZWNvcmQgPSBDcmVhdGVDb250YWluZXJSZWNvcmQoKTsKKyAgICBBZGRQYWdlQXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcFBhZ2VBcmVhKTsKKyAgICBBZGRDb250ZW50QXJlYUxheW91dEl0ZW0ocE5ld1JlY29yZCwgcENvbnRlbnRBcmVhKTsKICAgfQogICByZXR1cm4gaU1pbjsKIH0KQEAgLTE0NjAsMzYgKzE0ODEsMzQgQEAKICAgaWYgKGJDcmVhdGVBbGwpCiAgICAgaUN1clNldENvdW50ID0gMDsKIAotICBDWEZBX05vZGUqIHBPY2N1ck5vZGUgPSBwUGFnZVNldC0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VsZW1lbnQ6Ok9jY3VyKTsKLSAgaW50MzJfdCBpTWluID0gMDsKLSAgaWYgKHBPY2N1ck5vZGUgJiYgcE9jY3VyTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX01pbiwgaU1pbiwgZmFsc2UpKSB7Ci0gICAgaWYgKGlDdXJTZXRDb3VudCA8IGlNaW4pIHsKLSAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlNaW4gLSBpQ3VyU2V0Q291bnQ7IGkrKykgewotICAgICAgICBmb3IgKENYRkFfTm9kZSogcEN1cnJlbnRQYWdlTm9kZSA9Ci0gICAgICAgICAgICAgICAgIHBQYWdlU2V0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gICAgICAgICAgICAgcEN1cnJlbnRQYWdlTm9kZTsgcEN1cnJlbnRQYWdlTm9kZSA9IHBDdXJyZW50UGFnZU5vZGUtPkdldE5vZGVJdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7Ci0gICAgICAgICAgaWYgKHBDdXJyZW50UGFnZU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlBhZ2VBcmVhKSB7Ci0gICAgICAgICAgICBDcmVhdGVNaW5QYWdlUmVjb3JkKHBDdXJyZW50UGFnZU5vZGUsIGZhbHNlKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHBDdXJyZW50UGFnZU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0KLSAgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpQYWdlU2V0KSB7Ci0gICAgICAgICAgICBDcmVhdGVNaW5QYWdlU2V0UmVjb3JkKHBDdXJyZW50UGFnZU5vZGUsIHRydWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgbV9wUGFnZVNldE1hcFtwUGFnZVNldF0gPSBpTWluOworICBDWEZBX05vZGUqIHBPY2N1ck5vZGUgPQorICAgICAgcFBhZ2VTZXQtPkdldEZpcnN0Q2hpbGRCeUNsYXNzPENYRkFfT2NjdXI+KFhGQV9FbGVtZW50OjpPY2N1cik7CisgIGlmICghcE9jY3VyTm9kZSkKKyAgICByZXR1cm47CisKKyAgT3B0aW9uYWw8aW50MzJfdD4gaU1pbiA9CisgICAgICBwT2NjdXJOb2RlLT5KU09iamVjdCgpLT5UcnlJbnRlZ2VyKFhGQV9BdHRyaWJ1dGU6Ok1pbiwgZmFsc2UpOworICBpZiAoIWlNaW4gfHwgaUN1clNldENvdW50ID49ICppTWluKQorICAgIHJldHVybjsKKworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAqaU1pbiAtIGlDdXJTZXRDb3VudDsgaSsrKSB7CisgICAgZm9yIChDWEZBX05vZGUqIG5vZGUgPSBwUGFnZVNldC0+R2V0Rmlyc3RDaGlsZCgpOyBub2RlOworICAgICAgICAgbm9kZSA9IG5vZGUtPkdldE5leHRTaWJsaW5nKCkpIHsKKyAgICAgIGlmIChub2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpQYWdlQXJlYSkKKyAgICAgICAgQ3JlYXRlTWluUGFnZVJlY29yZChub2RlLCBmYWxzZSk7CisgICAgICBlbHNlIGlmIChub2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpQYWdlU2V0KQorICAgICAgICBDcmVhdGVNaW5QYWdlU2V0UmVjb3JkKG5vZGUsIHRydWUpOwogICAgIH0KICAgfQorICBtX3BQYWdlU2V0TWFwW3BQYWdlU2V0XSA9ICppTWluOwogfQogCiB2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6Q3JlYXRlTmV4dE1pblJlY29yZChDWEZBX05vZGUqIHBSZWNvcmROb2RlKSB7CiAgIGlmICghcFJlY29yZE5vZGUpCiAgICAgcmV0dXJuOwogCi0gIGZvciAoQ1hGQV9Ob2RlKiBwQ3VycmVudE5vZGUgPQotICAgICAgICAgICBwUmVjb3JkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsKLSAgICAgICBwQ3VycmVudE5vZGU7Ci0gICAgICAgcEN1cnJlbnROb2RlID0gcEN1cnJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7CisgIGZvciAoQ1hGQV9Ob2RlKiBwQ3VycmVudE5vZGUgPSBwUmVjb3JkTm9kZS0+R2V0TmV4dFNpYmxpbmcoKTsgcEN1cnJlbnROb2RlOworICAgICAgIHBDdXJyZW50Tm9kZSA9IHBDdXJyZW50Tm9kZS0+R2V0TmV4dFNpYmxpbmcoKSkgewogICAgIGlmIChwQ3VycmVudE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlBhZ2VBcmVhKQogICAgICAgQ3JlYXRlTWluUGFnZVJlY29yZChwQ3VycmVudE5vZGUsIGZhbHNlKTsKICAgICBlbHNlIGlmIChwQ3VycmVudE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlBhZ2VTZXQpCkBAIC0xNTAwLDM1ICsxNTE5LDQzIEBACiB2b2lkIENYRkFfTGF5b3V0UGFnZU1ncjo6UHJvY2Vzc0xhc3RQYWdlU2V0KCkgewogICBDcmVhdGVNaW5QYWdlUmVjb3JkKG1fcEN1clBhZ2VBcmVhLCBmYWxzZSwgdHJ1ZSk7CiAgIENyZWF0ZU5leHRNaW5SZWNvcmQobV9wQ3VyUGFnZUFyZWEpOwotICBDWEZBX05vZGUqIHBQYWdlU2V0ID0gbV9wQ3VyUGFnZUFyZWEtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOworICBDWEZBX05vZGUqIHBQYWdlU2V0ID0gbV9wQ3VyUGFnZUFyZWEtPkdldFBhcmVudCgpOwogICB3aGlsZSAodHJ1ZSkgewogICAgIENyZWF0ZU1pblBhZ2VTZXRSZWNvcmQocFBhZ2VTZXQpOwogICAgIGlmIChwUGFnZVNldCA9PSBtX3BUZW1wbGF0ZVBhZ2VTZXRSb290KQogICAgICAgYnJlYWs7CiAKICAgICBDcmVhdGVOZXh0TWluUmVjb3JkKHBQYWdlU2V0KTsKLSAgICBwUGFnZVNldCA9IHBQYWdlU2V0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsKKyAgICBwUGFnZVNldCA9IHBQYWdlU2V0LT5HZXRQYXJlbnQoKTsKICAgfQogfQogCi1ib29sIENYRkFfTGF5b3V0UGFnZU1ncjo6R2V0TmV4dEF2YWlsQ29udGVudEhlaWdodChGWF9GTE9BVCBmQ2hpbGRIZWlnaHQpIHsKK2Jvb2wgQ1hGQV9MYXlvdXRQYWdlTWdyOjpHZXROZXh0QXZhaWxDb250ZW50SGVpZ2h0KGZsb2F0IGZDaGlsZEhlaWdodCkgewogICBDWEZBX05vZGUqIHBDdXJDb250ZW50Tm9kZSA9CiAgICAgICBHZXRDdXJyZW50Q29udGFpbmVyUmVjb3JkKCktPnBDdXJDb250ZW50QXJlYS0+bV9wRm9ybU5vZGU7CiAgIGlmICghcEN1ckNvbnRlbnROb2RlKQogICAgIHJldHVybiBmYWxzZTsKIAotICBwQ3VyQ29udGVudE5vZGUgPQotICAgICAgcEN1ckNvbnRlbnROb2RlLT5HZXROZXh0U2FtZUNsYXNzU2libGluZyhYRkFfRWxlbWVudDo6Q29udGVudEFyZWEpOworICBwQ3VyQ29udGVudE5vZGUgPSBwQ3VyQ29udGVudE5vZGUtPkdldE5leHRTYW1lQ2xhc3NTaWJsaW5nPENYRkFfQ29udGVudEFyZWE+KAorICAgICAgWEZBX0VsZW1lbnQ6OkNvbnRlbnRBcmVhKTsKICAgaWYgKHBDdXJDb250ZW50Tm9kZSkgewotICAgIEZYX0ZMT0FUIGZOZXh0Q29udGVudEhlaWdodCA9Ci0gICAgICAgIHBDdXJDb250ZW50Tm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0gpLlRvVW5pdChYRkFfVU5JVF9QdCk7CisgICAgZmxvYXQgZk5leHRDb250ZW50SGVpZ2h0ID0gcEN1ckNvbnRlbnROb2RlLT5KU09iamVjdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+R2V0TWVhc3VyZShYRkFfQXR0cmlidXRlOjpIKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9Vbml0KFhGQV9Vbml0OjpQdCk7CiAgICAgcmV0dXJuIGZOZXh0Q29udGVudEhlaWdodCA+IGZDaGlsZEhlaWdodDsKICAgfQogCiAgIENYRkFfTm9kZSogcFBhZ2VOb2RlID0gR2V0Q3VycmVudENvbnRhaW5lclJlY29yZCgpLT5wQ3VyUGFnZUFyZWEtPm1fcEZvcm1Ob2RlOwotICBDWEZBX05vZGUqIHBPY2N1ck5vZGUgPSBwUGFnZU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpPY2N1cik7CisgIENYRkFfTm9kZSogcE9jY3VyTm9kZSA9CisgICAgICBwUGFnZU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzPENYRkFfT2NjdXI+KFhGQV9FbGVtZW50OjpPY2N1cik7CiAgIGludDMyX3QgaU1heCA9IDA7Ci0gIGlmIChwT2NjdXJOb2RlICYmIHBPY2N1ck5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9NYXgsIGlNYXgsIGZhbHNlKSkgeworICBPcHRpb25hbDxpbnQzMl90PiByZXQ7CisgIGlmIChwT2NjdXJOb2RlKSB7CisgICAgcmV0ID0gcE9jY3VyTm9kZS0+SlNPYmplY3QoKS0+VHJ5SW50ZWdlcihYRkFfQXR0cmlidXRlOjpNYXgsIGZhbHNlKTsKKyAgICBpZiAocmV0KQorICAgICAgaU1heCA9ICpyZXQ7CisgIH0KKyAgaWYgKHJldCkgewogICAgIGlmIChtX25DdXJQYWdlQ291bnQgPT0gaU1heCkgewogICAgICAgQ1hGQV9Ob2RlKiBwU3JjUGFnZSA9IG1fcEN1clBhZ2VBcmVhOwogICAgICAgaW50MzJfdCBuU3JjUGFnZUNvdW50ID0gbV9uQ3VyUGFnZUNvdW50OwpAQCAtMTU0NywxMCArMTU3NCwxMiBAQAogICAgICAgfQogICAgICAgaWYgKHBOZXh0UGFnZSkgewogICAgICAgICBDWEZBX05vZGUqIHBDb250ZW50QXJlYSA9Ci0gICAgICAgICAgICBwTmV4dFBhZ2UtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpDb250ZW50QXJlYSk7CisgICAgICAgICAgICBwTmV4dFBhZ2UtPkdldEZpcnN0Q2hpbGRCeUNsYXNzPENYRkFfQ29udGVudEFyZWE+KAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpDb250ZW50QXJlYSk7CiAgICAgICAgIGlmIChwQ29udGVudEFyZWEpIHsKLSAgICAgICAgICBGWF9GTE9BVCBmTmV4dENvbnRlbnRIZWlnaHQgPQotICAgICAgICAgICAgICBwQ29udGVudEFyZWEtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9IKS5Ub1VuaXQoWEZBX1VOSVRfUHQpOworICAgICAgICAgIGZsb2F0IGZOZXh0Q29udGVudEhlaWdodCA9IHBDb250ZW50QXJlYS0+SlNPYmplY3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6SCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlRvVW5pdChYRkFfVW5pdDo6UHQpOwogICAgICAgICAgIGlmIChmTmV4dENvbnRlbnRIZWlnaHQgPiBmQ2hpbGRIZWlnaHQpCiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQpAQCAtMTU1OSwxMCArMTU4OCwxMSBAQAogICAgIH0KICAgfQogCi0gIENYRkFfTm9kZSogcENvbnRlbnRBcmVhID0KLSAgICAgIHBQYWdlTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VsZW1lbnQ6OkNvbnRlbnRBcmVhKTsKLSAgRlhfRkxPQVQgZk5leHRDb250ZW50SGVpZ2h0ID0KLSAgICAgIHBDb250ZW50QXJlYS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0gpLlRvVW5pdChYRkFfVU5JVF9QdCk7CisgIENYRkFfTm9kZSogcENvbnRlbnRBcmVhID0gcFBhZ2VOb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX0NvbnRlbnRBcmVhPigKKyAgICAgIFhGQV9FbGVtZW50OjpDb250ZW50QXJlYSk7CisgIGZsb2F0IGZOZXh0Q29udGVudEhlaWdodCA9IHBDb250ZW50QXJlYS0+SlNPYmplY3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5HZXRNZWFzdXJlKFhGQV9BdHRyaWJ1dGU6OkgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuVG9Vbml0KFhGQV9Vbml0OjpQdCk7CiAgIGlmIChmTmV4dENvbnRlbnRIZWlnaHQgPCBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikKICAgICByZXR1cm4gdHJ1ZTsKICAgaWYgKGZOZXh0Q29udGVudEhlaWdodCA+IGZDaGlsZEhlaWdodCkKQEAgLTE2MzIsMTggKzE2NjIsMTcgQEAKICAgfQogfQogCi1DWEZBX05vZGUqIENYRkFfTGF5b3V0UGFnZU1ncjo6UXVlcnlPdmVyZmxvdygKLSAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSwKLSAgICBDWEZBX0xheW91dENvbnRleHQqIHBMYXlvdXRDb250ZXh0KSB7Ci0gIGZvciAoQ1hGQV9Ob2RlKiBwQ3VyTm9kZSA9IHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgIHBDdXJOb2RlOyBwQ3VyTm9kZSA9IHBDdXJOb2RlLT5HZXROb2RlSXRlbSgoWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkpIHsKK0NYRkFfTm9kZSogQ1hGQV9MYXlvdXRQYWdlTWdyOjpRdWVyeU92ZXJmbG93KENYRkFfTm9kZSogcEZvcm1Ob2RlKSB7CisgIGZvciAoQ1hGQV9Ob2RlKiBwQ3VyTm9kZSA9IHBGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZCgpOyBwQ3VyTm9kZTsKKyAgICAgICBwQ3VyTm9kZSA9IHBDdXJOb2RlLT5HZXROZXh0U2libGluZygpKSB7CiAgICAgaWYgKHBDdXJOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpCcmVhaykgewotICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzT3ZlcmZsb3dMZWFkZXI7Ci0gICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NPdmVyZmxvd1RhcmdldDsKLSAgICAgIENGWF9XaWRlU3RyaW5nQyB3c092ZXJmbG93VHJhaWxlcjsKLSAgICAgIHBDdXJOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX092ZXJmbG93TGVhZGVyLCB3c092ZXJmbG93TGVhZGVyKTsKLSAgICAgIHBDdXJOb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX092ZXJmbG93VHJhaWxlciwgd3NPdmVyZmxvd1RyYWlsZXIpOwotICAgICAgcEN1ck5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dUYXJnZXQsIHdzT3ZlcmZsb3dUYXJnZXQpOworICAgICAgV2lkZVN0cmluZyB3c092ZXJmbG93TGVhZGVyID0KKyAgICAgICAgICBwQ3VyTm9kZS0+SlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6T3ZlcmZsb3dMZWFkZXIpOworICAgICAgV2lkZVN0cmluZyB3c092ZXJmbG93VGFyZ2V0ID0KKyAgICAgICAgICBwQ3VyTm9kZS0+SlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6T3ZlcmZsb3dUYXJnZXQpOworICAgICAgV2lkZVN0cmluZyB3c092ZXJmbG93VHJhaWxlciA9CisgICAgICAgICAgcEN1ck5vZGUtPkpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6Ok92ZXJmbG93VHJhaWxlcik7CisKICAgICAgIGlmICghd3NPdmVyZmxvd0xlYWRlci5Jc0VtcHR5KCkgfHwgIXdzT3ZlcmZsb3dUcmFpbGVyLklzRW1wdHkoKSB8fAogICAgICAgICAgICF3c092ZXJmbG93VGFyZ2V0LklzRW1wdHkoKSkgewogICAgICAgICByZXR1cm4gcEN1ck5vZGU7CkBAIC0xNjYxLDIyICsxNjkwLDE5IEBACiAgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBwRG9jdW1lbnQtPkdldE5vdGlmeSgpOwogICBDWEZBX0xheW91dFByb2Nlc3NvciogcERvY0xheW91dCA9IHBEb2N1bWVudC0+R2V0RG9jTGF5b3V0KCk7CiAgIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogcFJvb3RMYXlvdXQgPSBHZXRSb290TGF5b3V0SXRlbSgpOwotICB7Ci0gICAgZm9yIChpbnQzMl90IGlJbmRleCA9IDA7IGlJbmRleCA8IHBEb2N1bWVudC0+bV9wUGVuZGluZ1BhZ2VTZXQuR2V0U2l6ZSgpOwotICAgICAgICAgaUluZGV4KyspIHsKLSAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBTm9kZT4KLSAgICAgICAgICBzSXRlcmF0b3IocERvY3VtZW50LT5tX3BQZW5kaW5nUGFnZVNldC5HZXRBdChpSW5kZXgpKTsKLSAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHNJdGVyYXRvci5HZXRDdXJyZW50KCk7IHBOb2RlOwotICAgICAgICAgICBwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgaWYgKHBOb2RlLT5Jc0NvbnRhaW5lck5vZGUoKSkgewotICAgICAgICAgIENYRkFfTm9kZSogcEJpbmROb2RlID0gcE5vZGUtPkdldEJpbmREYXRhKCk7Ci0gICAgICAgICAgaWYgKHBCaW5kTm9kZSkgewotICAgICAgICAgICAgcEJpbmROb2RlLT5SZW1vdmVCaW5kSXRlbShwTm9kZSk7Ci0gICAgICAgICAgICBwTm9kZS0+U2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsIG51bGxwdHIpOwotICAgICAgICAgIH0KKyAgZm9yIChDWEZBX05vZGUqIHBQYWdlTm9kZSA6IHBEb2N1bWVudC0+bV9wUGVuZGluZ1BhZ2VTZXQpIHsKKyAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQU5vZGU+CisgICAgICAgIHNJdGVyYXRvcihwUGFnZU5vZGUpOworICAgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHNJdGVyYXRvci5HZXRDdXJyZW50KCk7IHBOb2RlOworICAgICAgICAgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7CisgICAgICBpZiAocE5vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB7CisgICAgICAgIENYRkFfTm9kZSogcEJpbmROb2RlID0gcE5vZGUtPkdldEJpbmREYXRhKCk7CisgICAgICAgIGlmIChwQmluZE5vZGUpIHsKKyAgICAgICAgICBwQmluZE5vZGUtPlJlbW92ZUJpbmRJdGVtKHBOb2RlKTsKKyAgICAgICAgICBwTm9kZS0+U2V0QmluZGluZ05vZGUobnVsbHB0cik7CiAgICAgICAgIH0KLSAgICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05vZGVGbGFnX1VudXNlZE5vZGUsIHRydWUpOwogICAgICAgfQorICAgICAgcE5vZGUtPlNldEZsYWcoWEZBX05vZGVGbGFnX1VudXNlZE5vZGUsIHRydWUpOwogICAgIH0KICAgfQogCkBAIC0xNjkxLDMwICsxNzE3LDMxIEBACiAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwUm9vdFBhZ2VTZXRDb250YWluZXJJdGVtID0gaXRlcmF0b3IuR2V0Q3VycmVudCgpOwogICAgIEFTU0VSVChwUm9vdFBhZ2VTZXRDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PQogICAgICAgICAgICBYRkFfRWxlbWVudDo6UGFnZVNldCk7Ci0gICAgaWYgKGlJbmRleCA8IHBEb2N1bWVudC0+bV9wUGVuZGluZ1BhZ2VTZXQuR2V0U2l6ZSgpKSB7Ci0gICAgICBwUGVuZGluZ1BhZ2VTZXQgPSBwRG9jdW1lbnQtPm1fcFBlbmRpbmdQYWdlU2V0LkdldEF0KGlJbmRleCk7CisgICAgaWYgKGlJbmRleCA8CisgICAgICAgIHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4ocERvY3VtZW50LT5tX3BQZW5kaW5nUGFnZVNldCkpIHsKKyAgICAgIHBQZW5kaW5nUGFnZVNldCA9IHBEb2N1bWVudC0+bV9wUGVuZGluZ1BhZ2VTZXRbaUluZGV4XTsKICAgICAgIGlJbmRleCsrOwogICAgIH0KICAgICBpZiAoIXBQZW5kaW5nUGFnZVNldCkgewotICAgICAgaWYgKHBSb290UGFnZVNldENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRQYWNrZXRJRCgpID09Ci0gICAgICAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSkgeworICAgICAgaWYgKHBSb290UGFnZVNldENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRQYWNrZXRUeXBlKCkgPT0KKyAgICAgICAgICBYRkFfUGFja2V0VHlwZTo6VGVtcGxhdGUpIHsKICAgICAgICAgcFBlbmRpbmdQYWdlU2V0ID0KICAgICAgICAgICAgIHBSb290UGFnZVNldENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlLT5DbG9uZVRlbXBsYXRlVG9Gb3JtKGZhbHNlKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHBQZW5kaW5nUGFnZVNldCA9IHBSb290UGFnZVNldENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlOwogICAgICAgfQogICAgIH0KLSAgICBpZiAocFJvb3RQYWdlU2V0Q29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPkdldFVzZXJEYXRhKAotICAgICAgICAgICAgWEZBX0xBWU9VVElURU1LRVkpID09IHBSb290UGFnZVNldENvbnRhaW5lckl0ZW0pIHsKLSAgICAgIHBSb290UGFnZVNldENvbnRhaW5lckl0ZW0tPm1fcEZvcm1Ob2RlLT5TZXRVc2VyRGF0YShYRkFfTEFZT1VUSVRFTUtFWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICBpZiAocFJvb3RQYWdlU2V0Q29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUtPkpTT2JqZWN0KCktPkdldExheW91dEl0ZW0oKSA9PQorICAgICAgICBwUm9vdFBhZ2VTZXRDb250YWluZXJJdGVtKSB7CisgICAgICBwUm9vdFBhZ2VTZXRDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZS0+SlNPYmplY3QoKS0+U2V0TGF5b3V0SXRlbSgKKyAgICAgICAgICBudWxscHRyKTsKICAgICB9CiAgICAgcFJvb3RQYWdlU2V0Q29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUgPSBwUGVuZGluZ1BhZ2VTZXQ7CiAgICAgcFBlbmRpbmdQYWdlU2V0LT5DbGVhckZsYWcoWEZBX05vZGVGbGFnX1VudXNlZE5vZGUpOwogICAgIGZvciAoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwQ29udGFpbmVySXRlbSA9IGl0ZXJhdG9yLk1vdmVUb05leHQoKTsKICAgICAgICAgIHBDb250YWluZXJJdGVtOyBwQ29udGFpbmVySXRlbSA9IGl0ZXJhdG9yLk1vdmVUb05leHQoKSkgewogICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBDb250YWluZXJJdGVtLT5tX3BGb3JtTm9kZTsKLSAgICAgIGlmIChwTm9kZS0+R2V0UGFja2V0SUQoKSAhPSBYRkFfWERQUEFDS0VUX1RlbXBsYXRlKQorICAgICAgaWYgKHBOb2RlLT5HZXRQYWNrZXRUeXBlKCkgIT0gWEZBX1BhY2tldFR5cGU6OlRlbXBsYXRlKQogICAgICAgICBjb250aW51ZTsKIAogICAgICAgc3dpdGNoIChwTm9kZS0+R2V0RWxlbWVudFR5cGUoKSkgewpAQCAtMTcyNiwxOCArMTc1MywxNiBAQAogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBhZ2VBcmVhOiB7Ci0gICAgICAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwRm9ybUxheW91dCA9IHBDb250YWluZXJJdGVtOworICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcEZvcm1MYXlvdXQgPSBwQ29udGFpbmVySXRlbTsKICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gcENvbnRhaW5lckl0ZW0tPm1fcFBhcmVudC0+bV9wRm9ybU5vZGU7CiAgICAgICAgICAgYm9vbCBiSXNFeGlzdEZvcm0gPSB0cnVlOwogICAgICAgICAgIGZvciAoaW50MzJfdCBpTGV2ZWwgPSAwOyBpTGV2ZWwgPCAzOyBpTGV2ZWwrKykgewotICAgICAgICAgICAgcEZvcm1MYXlvdXQgPSBzdGF0aWNfY2FzdDxDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qPigKLSAgICAgICAgICAgICAgICBwRm9ybUxheW91dC0+bV9wRmlyc3RDaGlsZCk7CisgICAgICAgICAgICBwRm9ybUxheW91dCA9IHBGb3JtTGF5b3V0LT5tX3BGaXJzdENoaWxkOwogICAgICAgICAgICAgaWYgKGlMZXZlbCA9PSAyKSB7CiAgICAgICAgICAgICAgIHdoaWxlIChwRm9ybUxheW91dCAmJgogICAgICAgICAgICAgICAgICAgICAgIVhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1MYXlvdXQtPm1fcEZvcm1Ob2RlKSkgewotICAgICAgICAgICAgICAgIHBGb3JtTGF5b3V0ID0gc3RhdGljX2Nhc3Q8Q1hGQV9Db250YWluZXJMYXlvdXRJdGVtKj4oCi0gICAgICAgICAgICAgICAgICAgIHBGb3JtTGF5b3V0LT5tX3BOZXh0U2libGluZyk7CisgICAgICAgICAgICAgICAgcEZvcm1MYXlvdXQgPSBwRm9ybUxheW91dC0+bV9wTmV4dFNpYmxpbmc7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghcEZvcm1MYXlvdXQpIHsKQEAgLTE3NTYsOCArMTc4MSw4IEBACiAgICAgICAgICAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwSXRlciA9IHNJdGVyYXRvci5HZXRDdXJyZW50KCk7IHBJdGVyOwogICAgICAgICAgICAgICAgICAgIHBJdGVyID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgewogICAgICAgICAgICAgICAgIGlmIChwSXRlci0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6Q29udGVudEFyZWEpIHsKLSAgICAgICAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0gPSBzdGF0aWNfY2FzdDxDWEZBX0xheW91dEl0ZW0qPigKLSAgICAgICAgICAgICAgICAgICAgICBwSXRlci0+R2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVkpKTsKKyAgICAgICAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0gPQorICAgICAgICAgICAgICAgICAgICAgIHBJdGVyLT5KU09iamVjdCgpLT5HZXRMYXlvdXRJdGVtKCk7CiAgICAgICAgICAgICAgICAgICBpZiAocExheW91dEl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgcE5vdGlmeS0+T25MYXlvdXRJdGVtUmVtb3ZpbmcocERvY0xheW91dCwgcExheW91dEl0ZW0pOwogICAgICAgICAgICAgICAgICAgICBkZWxldGUgcExheW91dEl0ZW07CkBAIC0xNzY1LDcgKzE3OTAsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBpZiAocEV4aXN0aW5nTm9kZSkgewotICAgICAgICAgICAgICAgIHBQYXJlbnROb2RlLT5SZW1vdmVDaGlsZChwRXhpc3RpbmdOb2RlKTsKKyAgICAgICAgICAgICAgICBwUGFyZW50Tm9kZS0+UmVtb3ZlQ2hpbGQocEV4aXN0aW5nTm9kZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBDb250YWluZXJJdGVtLT5tX3BPbGRTdWJmb3JtID0gcE5ld1N1YmZvcm07CkBAIC0xNzc4LDExICsxODAzLDEwIEBACiAgICAgICAgIH0KICAgICAgICAgY2FzZSBYRkFfRWxlbWVudDo6Q29udGVudEFyZWE6IHsKICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gcENvbnRhaW5lckl0ZW0tPm1fcFBhcmVudC0+bV9wRm9ybU5vZGU7Ci0gICAgICAgICAgZm9yIChDWEZBX05vZGUqIHBDaGlsZE5vZGUgPQotICAgICAgICAgICAgICAgICAgIHBQYXJlbnROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gICAgICAgICAgICAgICBwQ2hpbGROb2RlOwotICAgICAgICAgICAgICAgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsKLSAgICAgICAgICAgIGlmIChwQ2hpbGROb2RlLT5HZXRUZW1wbGF0ZU5vZGUoKSAhPSBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUpIHsKKyAgICAgICAgICBmb3IgKENYRkFfTm9kZSogcENoaWxkTm9kZSA9IHBQYXJlbnROb2RlLT5HZXRGaXJzdENoaWxkKCk7IHBDaGlsZE5vZGU7CisgICAgICAgICAgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0TmV4dFNpYmxpbmcoKSkgeworICAgICAgICAgICAgaWYgKHBDaGlsZE5vZGUtPkdldFRlbXBsYXRlTm9kZUlmRXhpc3RzKCkgIT0KKyAgICAgICAgICAgICAgICBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUpIHsKICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwQ29udGFpbmVySXRlbS0+bV9wRm9ybU5vZGUgPSBwQ2hpbGROb2RlOwpAQCAtMTc5NCwxMiArMTgxOCwxMiBAQAogICAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KLSAgICBpZiAoIXBQZW5kaW5nUGFnZVNldC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpIHsKKyAgICBpZiAoIXBQZW5kaW5nUGFnZVNldC0+R2V0UGFyZW50KCkpIHsKICAgICAgIENYRkFfTm9kZSogcEZvcm1Ub3BsZXZlbFN1YmZvcm0gPQogICAgICAgICAgIHBEb2N1bWVudC0+R2V0WEZBT2JqZWN0KFhGQV9IQVNIQ09ERV9Gb3JtKQogICAgICAgICAgICAgICAtPkFzTm9kZSgpCi0gICAgICAgICAgICAgIC0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VsZW1lbnQ6OlN1YmZvcm0pOwotICAgICAgcEZvcm1Ub3BsZXZlbFN1YmZvcm0tPkluc2VydENoaWxkKHBQZW5kaW5nUGFnZVNldCk7CisgICAgICAgICAgICAgIC0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9TdWJmb3JtPihYRkFfRWxlbWVudDo6U3ViZm9ybSk7CisgICAgICBwRm9ybVRvcGxldmVsU3ViZm9ybS0+SW5zZXJ0Q2hpbGQocFBlbmRpbmdQYWdlU2V0LCBudWxscHRyKTsKICAgICB9CiAgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyhwUGVuZGluZ1BhZ2VTZXQpOwogICAgIHBQZW5kaW5nUGFnZVNldC0+U2V0RmxhZyhYRkFfTm9kZUZsYWdfSW5pdGlhbGl6ZWQsIHRydWUpOwpAQCAtMTgwOCw3ICsxODMyLDcgQEAKICAgQ1hGQV9Ob2RlKiBwUGFnZVNldCA9IEdldFJvb3RMYXlvdXRJdGVtKCktPm1fcEZvcm1Ob2RlOwogICB3aGlsZSAocFBhZ2VTZXQpIHsKICAgICBDWEZBX05vZGUqIHBOZXh0UGFnZVNldCA9Ci0gICAgICAgIHBQYWdlU2V0LT5HZXROZXh0U2FtZUNsYXNzU2libGluZyhYRkFfRWxlbWVudDo6UGFnZVNldCk7CisgICAgICAgIHBQYWdlU2V0LT5HZXROZXh0U2FtZUNsYXNzU2libGluZzxDWEZBX1BhZ2VTZXQ+KFhGQV9FbGVtZW50OjpQYWdlU2V0KTsKICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQU5vZGU+CiAgICAgICAgIHNJdGVyYXRvcihwUGFnZVNldCk7CiAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHNJdGVyYXRvci5HZXRDdXJyZW50KCk7CkBAIC0xODIwLDIzICsxODQ0LDIyIEBACiAgICAgICAgICAgICBDWEZBX0NvbnRhaW5lckl0ZXJhdG9yIGl0ZUNoaWxkKHBOb2RlKTsKICAgICAgICAgICAgIENYRkFfTm9kZSogcENoaWxkTm9kZSA9IGl0ZUNoaWxkLk1vdmVUb05leHQoKTsKICAgICAgICAgICAgIGZvciAoOyBwQ2hpbGROb2RlOyBwQ2hpbGROb2RlID0gaXRlQ2hpbGQuTW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0gPSBzdGF0aWNfY2FzdDxDWEZBX0xheW91dEl0ZW0qPigKLSAgICAgICAgICAgICAgICAgIHBDaGlsZE5vZGUtPkdldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZKSk7CisgICAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0gPQorICAgICAgICAgICAgICAgICAgcENoaWxkTm9kZS0+SlNPYmplY3QoKS0+R2V0TGF5b3V0SXRlbSgpOwogICAgICAgICAgICAgICBpZiAocExheW91dEl0ZW0pIHsKICAgICAgICAgICAgICAgICBwTm90aWZ5LT5PbkxheW91dEl0ZW1SZW1vdmluZyhwRG9jTGF5b3V0LCBwTGF5b3V0SXRlbSk7CiAgICAgICAgICAgICAgICAgZGVsZXRlIHBMYXlvdXRJdGVtOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfSBlbHNlIGlmIChlVHlwZSAhPSBYRkFfRWxlbWVudDo6Q29udGVudEFyZWEpIHsKLSAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0gPSBzdGF0aWNfY2FzdDxDWEZBX0xheW91dEl0ZW0qPigKLSAgICAgICAgICAgICAgICBwTm9kZS0+R2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVkpKTsKKyAgICAgICAgICAgIENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0gPSBwTm9kZS0+SlNPYmplY3QoKS0+R2V0TGF5b3V0SXRlbSgpOwogICAgICAgICAgICAgaWYgKHBMYXlvdXRJdGVtKSB7CiAgICAgICAgICAgICAgIHBOb3RpZnktPk9uTGF5b3V0SXRlbVJlbW92aW5nKHBEb2NMYXlvdXQsIHBMYXlvdXRJdGVtKTsKICAgICAgICAgICAgICAgZGVsZXRlIHBMYXlvdXRJdGVtOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgICBDWEZBX05vZGUqIHBOZXh0ID0gc0l0ZXJhdG9yLlNraXBDaGlsZHJlbkFuZE1vdmVUb05leHQoKTsKLSAgICAgICAgICBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCktPlJlbW92ZUNoaWxkKHBOb2RlKTsKKyAgICAgICAgICBwTm9kZS0+R2V0UGFyZW50KCktPlJlbW92ZUNoaWxkKHBOb2RlLCB0cnVlKTsKICAgICAgICAgICBwTm9kZSA9IHBOZXh0OwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHBOb2RlLT5DbGVhckZsYWcoWEZBX05vZGVGbGFnX1VudXNlZE5vZGUpOwpAQCAtMTkwNyw5ICsxOTMwLDEyIEBACiAgICAgICAgICAgICAgIHBDaGlsZExheW91dEl0ZW0gPSBpdGVyYXRvci5Nb3ZlVG9OZXh0KCk7CiAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYm9vbCBiVmlzaWJsZSA9Ci0gICAgICAgICAgICAgICAgKHBDb250ZW50SXRlbS0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9QcmVzZW5jZSkgPT0KLSAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZSk7CisKKyAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtIHByZXNlbmNlID0KKyAgICAgICAgICAgICAgICBwQ29udGVudEl0ZW0tPm1fcEZvcm1Ob2RlLT5KU09iamVjdCgpCisgICAgICAgICAgICAgICAgICAgIC0+VHJ5RW51bShYRkFfQXR0cmlidXRlOjpQcmVzZW5jZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgLnZhbHVlX29yKFhGQV9BdHRyaWJ1dGVFbnVtOjpWaXNpYmxlKTsKKyAgICAgICAgICAgIGJvb2wgYlZpc2libGUgPSBwcmVzZW5jZSA9PSBYRkFfQXR0cmlidXRlRW51bTo6VmlzaWJsZTsKICAgICAgICAgICAgIHVpbnQzMl90IGR3UmVsZXZhbnRDaGlsZCA9CiAgICAgICAgICAgICAgICAgR2V0UmVsZXZhbnQocENvbnRlbnRJdGVtLT5tX3BGb3JtTm9kZSwgZHdSZWxldmFudCk7CiAgICAgICAgICAgICBTeW5jQ29udGFpbmVyKHBOb3RpZnksIG1fcExheW91dFByb2Nlc3NvciwgcENvbnRlbnRJdGVtLApAQCAtMTkyNCwxMCArMTk1MCwxMCBAQAogICAgIH0KICAgfQogCi0gIGludDMyX3QgblBhZ2UgPSBtX1BhZ2VBcnJheS5HZXRTaXplKCk7CisgIGludDMyX3QgblBhZ2UgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KG1fUGFnZUFycmF5KTsKICAgZm9yIChpbnQzMl90IGkgPSBuUGFnZSAtIDE7IGkgPj0gbV9uQXZhaWxQYWdlczsgaS0tKSB7CiAgICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwUGFnZSA9IG1fUGFnZUFycmF5W2ldOwotICAgIG1fUGFnZUFycmF5LlJlbW92ZUF0KGkpOworICAgIG1fUGFnZUFycmF5LmVyYXNlKG1fUGFnZUFycmF5LmJlZ2luKCkgKyBpKTsKICAgICBwTm90aWZ5LT5PblBhZ2VFdmVudChwUGFnZSwgWEZBX1BBR0VWSUVXRVZFTlRfUG9zdFJlbW92ZWQpOwogICAgIGRlbGV0ZSBwUGFnZTsKICAgfQpAQCAtMTk0OCw3ICsxOTc0LDcgQEAKIAogdm9pZCBDWEZBX0xheW91dFBhZ2VNZ3I6OlByZXBhcmVMYXlvdXQoKSB7CiAgIG1fcFBhZ2VTZXRDdXJSb290ID0gbnVsbHB0cjsKLSAgbV9lUGFnZVNldE1vZGUgPSBYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkT2NjdXJyZW5jZTsKKyAgbV9lUGFnZVNldE1vZGUgPSBYRkFfQXR0cmlidXRlRW51bTo6T3JkZXJlZE9jY3VycmVuY2U7CiAgIG1fbkF2YWlsUGFnZXMgPSAwOwogICBDbGVhckRhdGEoKTsKICAgaWYgKCFtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3QpCkBAIC0xOTU2LDIyICsxOTgyLDIyIEBACiAKICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwUm9vdExheW91dEl0ZW0gPSBtX3BQYWdlU2V0TGF5b3V0SXRlbVJvb3Q7CiAgIGlmIChwUm9vdExheW91dEl0ZW0gJiYKLSAgICAgIHBSb290TGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9Gb3JtKSB7CisgICAgICBwUm9vdExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRQYWNrZXRUeXBlKCkgPT0gWEZBX1BhY2tldFR5cGU6OkZvcm0pIHsKICAgICBDWEZBX05vZGUqIHBQYWdlU2V0Rm9ybU5vZGUgPSBwUm9vdExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlOwotICAgIHBSb290TGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldERvY3VtZW50KCktPm1fcFBlbmRpbmdQYWdlU2V0LlJlbW92ZUFsbCgpOworICAgIHBSb290TGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldERvY3VtZW50KCktPm1fcFBlbmRpbmdQYWdlU2V0LmNsZWFyKCk7CiAgICAgaWYgKHBQYWdlU2V0Rm9ybU5vZGUtPkhhc1JlbW92ZWRDaGlsZHJlbigpKSB7CiAgICAgICBYRkFfUmVsZWFzZUxheW91dEl0ZW0ocFJvb3RMYXlvdXRJdGVtKTsKICAgICAgIG1fcFBhZ2VTZXRMYXlvdXRJdGVtUm9vdCA9IG51bGxwdHI7CiAgICAgICBwUm9vdExheW91dEl0ZW0gPSBudWxscHRyOwogICAgICAgcFBhZ2VTZXRGb3JtTm9kZSA9IG51bGxwdHI7Ci0gICAgICBtX1BhZ2VBcnJheS5SZW1vdmVBbGwoKTsKKyAgICAgIG1fUGFnZUFycmF5LmNsZWFyKCk7CiAgICAgfQogICAgIHdoaWxlIChwUGFnZVNldEZvcm1Ob2RlKSB7CiAgICAgICBDWEZBX05vZGUqIHBOZXh0UGFnZVNldCA9Ci0gICAgICAgICAgcFBhZ2VTZXRGb3JtTm9kZS0+R2V0TmV4dFNhbWVDbGFzc1NpYmxpbmcoWEZBX0VsZW1lbnQ6OlBhZ2VTZXQpOwotICAgICAgcFBhZ2VTZXRGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkKLSAgICAgICAgICAtPlJlbW92ZUNoaWxkKHBQYWdlU2V0Rm9ybU5vZGUsIGZhbHNlKTsKLSAgICAgIHBSb290TGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldERvY3VtZW50KCktPm1fcFBlbmRpbmdQYWdlU2V0LkFkZCgKKyAgICAgICAgICBwUGFnZVNldEZvcm1Ob2RlLT5HZXROZXh0U2FtZUNsYXNzU2libGluZzxDWEZBX1BhZ2VTZXQ+KAorICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6UGFnZVNldCk7CisgICAgICBwUGFnZVNldEZvcm1Ob2RlLT5HZXRQYXJlbnQoKS0+UmVtb3ZlQ2hpbGQocFBhZ2VTZXRGb3JtTm9kZSwgZmFsc2UpOworICAgICAgcFJvb3RMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RG9jdW1lbnQoKS0+bV9wUGVuZGluZ1BhZ2VTZXQucHVzaF9iYWNrKAogICAgICAgICAgIHBQYWdlU2V0Rm9ybU5vZGUpOwogICAgICAgcFBhZ2VTZXRGb3JtTm9kZSA9IHBOZXh0UGFnZVNldDsKICAgICB9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXRwYWdlbWdyLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXRwYWdlbWdyLmgKaW5kZXggM2M4ZTdmOS4uNDJmYTRlNiAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0cGFnZW1nci5oCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xheW91dHBhZ2VtZ3IuaApAQCAtMTAsMTEgKzEwLDEzIEBACiAjaW5jbHVkZSA8aXRlcmF0b3I+CiAjaW5jbHVkZSA8bGlzdD4KICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9sYXlvdXRfaXRlbWxheW91dC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2l0ZW1sYXlvdXRwcm9jZXNzb3IuaCIKIAogY2xhc3MgQ1hGQV9Db250YWluZXJSZWNvcmQ7CiBjbGFzcyBDWEZBX0xheW91dEl0ZW07CitjbGFzcyBDWEZBX05vZGU7CiAKIGNsYXNzIENYRkFfTGF5b3V0UGFnZU1nciB7CiAgcHVibGljOgpAQCAtMjMsOCArMjUsOCBAQAogCiAgIGJvb2wgSW5pdExheW91dFBhZ2UoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpOwogICBib29sIFByZXBhcmVGaXJzdFBhZ2UoQ1hGQV9Ob2RlKiBwUm9vdFN1YmZvcm0pOwotICBGWF9GTE9BVCBHZXRBdmFpbEhlaWdodCgpOwotICBib29sIEdldE5leHRBdmFpbENvbnRlbnRIZWlnaHQoRlhfRkxPQVQgZkNoaWxkSGVpZ2h0KTsKKyAgZmxvYXQgR2V0QXZhaWxIZWlnaHQoKTsKKyAgYm9vbCBHZXROZXh0QXZhaWxDb250ZW50SGVpZ2h0KGZsb2F0IGZDaGlsZEhlaWdodCk7CiAgIHZvaWQgU3VibWl0Q29udGVudEl0ZW0oQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcENvbnRlbnRMYXlvdXRJdGVtLAogICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IGVTdGF0dXMpOwogICB2b2lkIEZpbmlzaFBhZ2luYXRlZFBhZ2VTZXRzKCk7CkBAIC00NSwxMyArNDcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiYgcFRyYWlsZXJOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICBib29sIGJEYXRhTWVyZ2UgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ3JlYXRlUGFnZSA9IHRydWUpOwotICBDWEZBX05vZGUqIFF1ZXJ5T3ZlcmZsb3coQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dENvbnRleHQqIHBMYXlvdXRDb250ZXh0ID0gbnVsbHB0cik7CisgIENYRkFfTm9kZSogUXVlcnlPdmVyZmxvdyhDWEZBX05vZGUqIHBGb3JtTm9kZSk7CiAgIGJvb2wgUHJvY2Vzc0Jvb2tlbmRMZWFkZXJPclRyYWlsZXIoQ1hGQV9Ob2RlKiBwQm9va2VuZE5vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTGVhZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSomIHBCb29rZW5kQXBwZW5kTm9kZSk7CiAKLSBwcm90ZWN0ZWQ6CisgcHJpdmF0ZToKICAgYm9vbCBBcHBlbmROZXdQYWdlKGJvb2wgYkZpcnN0VGVtUGFnZSA9IGZhbHNlKTsKICAgdm9pZCBSZW9yZGVyUGVuZGluZ0xheW91dFJlY29yZFRvVGFpbChDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0NvbnRhaW5lclJlY29yZCogcFByZXZSZWNvcmQpOwpAQCAtNzEsNyArNzIsNyBAQAogICB2b2lkIEFkZENvbnRlbnRBcmVhTGF5b3V0SXRlbShDWEZBX0NvbnRhaW5lclJlY29yZCogcE5ld1JlY29yZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ29udGVudEFyZWEpOwogICBib29sIFJ1bkJyZWFrKFhGQV9FbGVtZW50IGVCcmVha1R5cGUsCi0gICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZVRhcmdldFR5cGUsCisgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZUVudW0gZVRhcmdldFR5cGUsCiAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGFyZ2V0LAogICAgICAgICAgICAgICAgIGJvb2wgYlN0YXJ0TmV3KTsKICAgQ1hGQV9Ob2RlKiBCcmVha092ZXJmbG93KENYRkFfTm9kZSogcE92ZXJmbG93Tm9kZSwKQEAgLTExMCw4ICsxMTEsOCBAQAogICAgICAgQ1hGQV9Ob2RlKiBwVGFyZ2V0Q29udGVudEFyZWEgPSBudWxscHRyLAogICAgICAgYm9vbCBiTmV3UGFnZSA9IGZhbHNlLAogICAgICAgYm9vbCBiUXVlcnkgPSBmYWxzZSwKLSAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVQcmVmZXJyZWRQb3NpdGlvbiA9IFhGQV9BVFRSSUJVVEVFTlVNX0ZpcnN0KTsKLSAgYm9vbCBNYXRjaFBhZ2VBcmVhT2RkT3JFdmVuKENYRkFfTm9kZSogcFBhZ2VBcmVhLCBib29sIGJMYXN0TWF0Y2gpOworICAgICAgWEZBX0F0dHJpYnV0ZUVudW0gZVByZWZlcnJlZFBvc2l0aW9uID0gWEZBX0F0dHJpYnV0ZUVudW06OkZpcnN0KTsKKyAgYm9vbCBNYXRjaFBhZ2VBcmVhT2RkT3JFdmVuKENYRkFfTm9kZSogcFBhZ2VBcmVhKTsKICAgQ1hGQV9Ob2RlKiBHZXROZXh0QXZhaWxQYWdlQXJlYShDWEZBX05vZGUqIHBUYXJnZXRQYWdlQXJlYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBUYXJnZXRDb250ZW50QXJlYSA9IG51bGxwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTmV3UGFnZSA9IGZhbHNlLApAQCAtMTIwLDcgKzEyMSw3IEBACiAgIHZvaWQgSW5pdFBhZ2VTZXRNYXAoKTsKICAgdm9pZCBQcm9jZXNzTGFzdFBhZ2VTZXQoKTsKICAgYm9vbCBJc1BhZ2VTZXRSb290T3JkZXJlZE9jY3VycmVuY2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1fZVBhZ2VTZXRNb2RlID09IFhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWRPY2N1cnJlbmNlOworICAgIHJldHVybiBtX2VQYWdlU2V0TW9kZSA9PSBYRkFfQXR0cmlidXRlRW51bTo6T3JkZXJlZE9jY3VycmVuY2U7CiAgIH0KICAgdm9pZCBDbGVhckRhdGEoKTsKICAgdm9pZCBNZXJnZVBhZ2VTZXRDb250ZW50cygpOwpAQCAtMTM3LDEwICsxMzgsMTAgQEAKICAgQ1hGQV9Ob2RlKiBtX3BDdXJQYWdlQXJlYTsKICAgaW50MzJfdCBtX25BdmFpbFBhZ2VzOwogICBpbnQzMl90IG1fbkN1clBhZ2VDb3VudDsKLSAgWEZBX0FUVFJJQlVURUVOVU0gbV9lUGFnZVNldE1vZGU7CisgIFhGQV9BdHRyaWJ1dGVFbnVtIG1fZVBhZ2VTZXRNb2RlOwogICBib29sIG1fYkNyZWF0ZU92ZXJGbG93UGFnZTsKICAgc3RkOjptYXA8Q1hGQV9Ob2RlKiwgaW50MzJfdD4gbV9wUGFnZVNldE1hcDsKLSAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250YWluZXJMYXlvdXRJdGVtKj4gbV9QYWdlQXJyYXk7CisgIHN0ZDo6dmVjdG9yPENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSo+IG1fUGFnZUFycmF5OwogfTsKIAogI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9MQVlPVVRQQUdFTUdSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXRwcm9jZXNzb3IuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0cHJvY2Vzc29yLmNwcAppbmRleCBlMTc5ZDM4Li41NDBlMWM5MSAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0cHJvY2Vzc29yLmNwcAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXRwcm9jZXNzb3IuY3BwCkBAIC02LDI2ICs2LDI3IEBACiAKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXRwcm9jZXNzb3IuaCIKIAorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9vYmplY3QuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbnRlbnRsYXlvdXRpdGVtLmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pdGVtbGF5b3V0cHJvY2Vzc29yLmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0cGFnZW1nci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xvY2FsZW1nci5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21lYXN1cmVtZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3N1YmZvcm0uaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFtZXJnZXJfaW1wLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9sYXlvdXRfaXRlbWxheW91dC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxlbWdyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX3V0aWxzLmgiCiAKIENYRkFfTGF5b3V0UHJvY2Vzc29yOjpDWEZBX0xheW91dFByb2Nlc3NvcihDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpCi0gICAgOiBtX3BEb2N1bWVudChwRG9jdW1lbnQpLAotICAgICAgbV9uUHJvZ3Jlc3NDb3VudGVyKDApLAotICAgICAgbV9iTmVlTGF5b3V0KHRydWUpIHt9CisgICAgOiBtX3BEb2N1bWVudChwRG9jdW1lbnQpLCBtX25Qcm9ncmVzc0NvdW50ZXIoMCksIG1fYk5lZWRMYXlvdXQodHJ1ZSkge30KIAogQ1hGQV9MYXlvdXRQcm9jZXNzb3I6On5DWEZBX0xheW91dFByb2Nlc3NvcigpIHt9CiAKIENYRkFfRG9jdW1lbnQqIENYRkFfTGF5b3V0UHJvY2Vzc29yOjpHZXREb2N1bWVudCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcERvY3VtZW50OworICByZXR1cm4gbV9wRG9jdW1lbnQuR2V0KCk7CiB9CiAKIGludDMyX3QgQ1hGQV9MYXlvdXRQcm9jZXNzb3I6OlN0YXJ0TGF5b3V0KGJvb2wgYkZvcmNlUmVzdGFydCkgewpAQCAtMzksOCArNDAsOCBAQAogICBpZiAoIXBGb3JtUGFja2V0Tm9kZSkKICAgICByZXR1cm4gLTE7CiAKLSAgQ1hGQV9Ob2RlKiBwRm9ybVJvb3QgPQotICAgICAgcEZvcm1QYWNrZXROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRWxlbWVudDo6U3ViZm9ybSk7CisgIENYRkFfU3ViZm9ybSogcEZvcm1Sb290ID0KKyAgICAgIHBGb3JtUGFja2V0Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9TdWJmb3JtPihYRkFfRWxlbWVudDo6U3ViZm9ybSk7CiAgIGlmICghcEZvcm1Sb290KQogICAgIHJldHVybiAtMTsKIApAQCAtNTgsMTYgKzU5LDE4IEBACiAgIHJldHVybiAwOwogfQogCi1pbnQzMl90IENYRkFfTGF5b3V0UHJvY2Vzc29yOjpEb0xheW91dChJRlhfUGF1c2UqIHBQYXVzZSkgeworaW50MzJfdCBDWEZBX0xheW91dFByb2Nlc3Nvcjo6RG9MYXlvdXQoKSB7CiAgIGlmIChtX25Qcm9ncmVzc0NvdW50ZXIgPCAxKQogICAgIHJldHVybiAtMTsKIAogICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBlU3RhdHVzOwogICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yLT5HZXRGb3JtTm9kZSgpOwotICBGWF9GTE9BVCBmUG9zWCA9IHBGb3JtTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1gpLlRvVW5pdChYRkFfVU5JVF9QdCk7Ci0gIEZYX0ZMT0FUIGZQb3NZID0gcEZvcm1Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfWSkuVG9Vbml0KFhGQV9VTklUX1B0KTsKKyAgZmxvYXQgZlBvc1ggPQorICAgICAgcEZvcm1Ob2RlLT5KU09iamVjdCgpLT5HZXRNZWFzdXJlKFhGQV9BdHRyaWJ1dGU6OlgpLlRvVW5pdChYRkFfVW5pdDo6UHQpOworICBmbG9hdCBmUG9zWSA9CisgICAgICBwRm9ybU5vZGUtPkpTT2JqZWN0KCktPkdldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6WSkuVG9Vbml0KFhGQV9Vbml0OjpQdCk7CiAgIGRvIHsKLSAgICBGWF9GTE9BVCBmQXZhaWxIZWlnaHQgPSBtX3BMYXlvdXRQYWdlTWdyLT5HZXRBdmFpbEhlaWdodCgpOworICAgIGZsb2F0IGZBdmFpbEhlaWdodCA9IG1fcExheW91dFBhZ2VNZ3ItPkdldEF2YWlsSGVpZ2h0KCk7CiAgICAgZVN0YXR1cyA9IG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yLT5Eb0xheW91dCh0cnVlLCBmQXZhaWxIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmQXZhaWxIZWlnaHQsIG51bGxwdHIpOwogICAgIGlmIChlU3RhdHVzICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpEb25lKQpAQCAtNzksMTQgKzgyLDEzIEBACiAgICAgICBwTGF5b3V0SXRlbS0+bV9zUG9zID0gQ0ZYX1BvaW50RihmUG9zWCwgZlBvc1kpOwogCiAgICAgbV9wTGF5b3V0UGFnZU1nci0+U3VibWl0Q29udGVudEl0ZW0ocExheW91dEl0ZW0sIGVTdGF0dXMpOwotICB9IHdoaWxlIChlU3RhdHVzICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpEb25lICYmCi0gICAgICAgICAgICghcFBhdXNlIHx8ICFwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpKTsKKyAgfSB3aGlsZSAoZVN0YXR1cyAhPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6RG9uZSk7CiAKICAgaWYgKGVTdGF0dXMgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OkRvbmUpIHsKICAgICBtX3BMYXlvdXRQYWdlTWdyLT5GaW5pc2hQYWdpbmF0ZWRQYWdlU2V0cygpOwogICAgIG1fcExheW91dFBhZ2VNZ3ItPlN5bmNMYXlvdXREYXRhKCk7Ci0gICAgbV9iTmVlTGF5b3V0ID0gZmFsc2U7Ci0gICAgbV9yZ0NoYW5nZWRDb250YWluZXJzLlJlbW92ZUFsbCgpOworICAgIG1fYk5lZWRMYXlvdXQgPSBmYWxzZTsKKyAgICBtX3JnQ2hhbmdlZENvbnRhaW5lcnMuY2xlYXIoKTsKICAgfQogICByZXR1cm4gMTAwICogKGVTdGF0dXMgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OkRvbmUKICAgICAgICAgICAgICAgICAgICAgPyBtX25Qcm9ncmVzc0NvdW50ZXIKQEAgLTk1LDE1ICs5NywxMiBAQAogfQogCiBib29sIENYRkFfTGF5b3V0UHJvY2Vzc29yOjpJbmNyZW1lbnRMYXlvdXQoKSB7Ci0gIGlmIChtX2JOZWVMYXlvdXQpIHsKKyAgaWYgKG1fYk5lZWRMYXlvdXQpIHsKICAgICBTdGFydExheW91dCh0cnVlKTsKLSAgICByZXR1cm4gRG9MYXlvdXQobnVsbHB0cikgPT0gMTAwOworICAgIHJldHVybiBEb0xheW91dCgpID09IDEwMDsKICAgfQotCi0gIGZvciAoaW50MzJfdCBpID0gMCwgYyA9IG1fcmdDaGFuZ2VkQ29udGFpbmVycy5HZXRTaXplKCk7IGkgPCBjOyBpKyspIHsKLSAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9yZ0NoYW5nZWRDb250YWluZXJzW2ldOwotICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPQotICAgICAgICBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCwgWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGUpOworICBmb3IgKENYRkFfTm9kZSogcE5vZGUgOiBtX3JnQ2hhbmdlZENvbnRhaW5lcnMpIHsKKyAgICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gcE5vZGUtPkdldENvbnRhaW5lclBhcmVudCgpOwogICAgIGlmICghcFBhcmVudE5vZGUpCiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgaWYgKCFDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkluY3JlbWVudFJlbGF5b3V0Tm9kZSh0aGlzLCBwTm9kZSwKQEAgLTExMSw3ICsxMTAsNyBAQAogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgfQotICBtX3JnQ2hhbmdlZENvbnRhaW5lcnMuUmVtb3ZlQWxsKCk7CisgIG1fcmdDaGFuZ2VkQ29udGFpbmVycy5jbGVhcigpOwogICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMTI0LDEzICsxMjMsMTIgQEAKIH0KIAogQ1hGQV9MYXlvdXRJdGVtKiBDWEZBX0xheW91dFByb2Nlc3Nvcjo6R2V0TGF5b3V0SXRlbShDWEZBX05vZGUqIHBGb3JtSXRlbSkgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9MYXlvdXRJdGVtKj4oCi0gICAgICBwRm9ybUl0ZW0tPkdldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZKSk7CisgIHJldHVybiBwRm9ybUl0ZW0tPkpTT2JqZWN0KCktPkdldExheW91dEl0ZW0oKTsKIH0KIAogdm9pZCBDWEZBX0xheW91dFByb2Nlc3Nvcjo6QWRkQ2hhbmdlZENvbnRhaW5lcihDWEZBX05vZGUqIHBDb250YWluZXIpIHsKLSAgaWYgKG1fcmdDaGFuZ2VkQ29udGFpbmVycy5GaW5kKHBDb250YWluZXIpIDwgMCkKLSAgICBtX3JnQ2hhbmdlZENvbnRhaW5lcnMuQWRkKHBDb250YWluZXIpOworICBpZiAoIXBkZml1bTo6Q29udGFpbnNWYWx1ZShtX3JnQ2hhbmdlZENvbnRhaW5lcnMsIHBDb250YWluZXIpKQorICAgIG1fcmdDaGFuZ2VkQ29udGFpbmVycy5wdXNoX2JhY2socENvbnRhaW5lcik7CiB9CiAKIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbSogQ1hGQV9MYXlvdXRQcm9jZXNzb3I6OkdldFJvb3RMYXlvdXRJdGVtKCkgY29uc3QgewpAQCAtMTM4LDUgKzEzNiw1IEBACiB9CiAKIGJvb2wgQ1hGQV9MYXlvdXRQcm9jZXNzb3I6OklzTmVlZExheW91dCgpIHsKLSAgcmV0dXJuIG1fYk5lZUxheW91dCB8fCBtX3JnQ2hhbmdlZENvbnRhaW5lcnMuR2V0U2l6ZSgpID4gMDsKKyAgcmV0dXJuIG1fYk5lZWRMYXlvdXQgfHwgIW1fcmdDaGFuZ2VkQ29udGFpbmVycy5lbXB0eSgpOwogfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0cHJvY2Vzc29yLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXRwcm9jZXNzb3IuaAppbmRleCA1ODYxYmY3Li5lODM5MWJlIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXRwcm9jZXNzb3IuaAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXRwcm9jZXNzb3IuaApAQCAtOCw5ICs4LDEwIEBACiAjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0xBWU9VVFBST0NFU1NPUl9IXwogCiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3Vub3duZWRfcHRyLmgiCiAKIGNsYXNzIENYRkFfQ29udGFpbmVyTGF5b3V0SXRlbTsKIGNsYXNzIENYRkFfRG9jdW1lbnQ7CkBAIC0xOCw3ICsxOSw2IEBACiBjbGFzcyBDWEZBX0xheW91dEl0ZW07CiBjbGFzcyBDWEZBX0xheW91dFBhZ2VNZ3I7CiBjbGFzcyBDWEZBX05vZGU7Ci1jbGFzcyBJRlhfUGF1c2U7CiAKIGNsYXNzIENYRkFfTGF5b3V0UHJvY2Vzc29yIHsKICBwdWJsaWM6CkBAIC0yNywxMyArMjcsMTMgQEAKIAogICBDWEZBX0RvY3VtZW50KiBHZXREb2N1bWVudCgpIGNvbnN0OwogICBpbnQzMl90IFN0YXJ0TGF5b3V0KGJvb2wgYkZvcmNlUmVzdGFydCA9IGZhbHNlKTsKLSAgaW50MzJfdCBEb0xheW91dChJRlhfUGF1c2UqIHBQYXVzZSA9IG51bGxwdHIpOworICBpbnQzMl90IERvTGF5b3V0KCk7CiAgIGJvb2wgSW5jcmVtZW50TGF5b3V0KCk7CiAgIGludDMyX3QgQ291bnRQYWdlcygpIGNvbnN0OwogICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIEdldFBhZ2UoaW50MzJfdCBpbmRleCkgY29uc3Q7CiAgIENYRkFfTGF5b3V0SXRlbSogR2V0TGF5b3V0SXRlbShDWEZBX05vZGUqIHBGb3JtSXRlbSk7CiAgIHZvaWQgQWRkQ2hhbmdlZENvbnRhaW5lcihDWEZBX05vZGUqIHBDb250YWluZXIpOwotICB2b2lkIFNldEZvcmNlUmVMYXlvdXQoYm9vbCBiRm9yY2VSZXN0YXJ0KSB7IG1fYk5lZUxheW91dCA9IGJGb3JjZVJlc3RhcnQ7IH0KKyAgdm9pZCBTZXRGb3JjZVJlTGF5b3V0KGJvb2wgYkZvcmNlUmVzdGFydCkgeyBtX2JOZWVkTGF5b3V0ID0gYkZvcmNlUmVzdGFydDsgfQogICBDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIEdldFJvb3RMYXlvdXRJdGVtKCkgY29uc3Q7CiAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogR2V0Um9vdFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yKCkgY29uc3QgewogICAgIHJldHVybiBtX3BSb290SXRlbUxheW91dFByb2Nlc3Nvci5nZXQoKTsKQEAgLTQ1LDEyICs0NSwxMiBAQAogIHByaXZhdGU6CiAgIGJvb2wgSXNOZWVkTGF5b3V0KCk7CiAKLSAgQ1hGQV9Eb2N1bWVudCogY29uc3QgbV9wRG9jdW1lbnQ7CisgIFVub3duZWRQdHI8Q1hGQV9Eb2N1bWVudD4gY29uc3QgbV9wRG9jdW1lbnQ7CiAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I+IG1fcFJvb3RJdGVtTGF5b3V0UHJvY2Vzc29yOwogICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9MYXlvdXRQYWdlTWdyPiBtX3BMYXlvdXRQYWdlTWdyOwotICBDWEZBX05vZGVBcnJheSBtX3JnQ2hhbmdlZENvbnRhaW5lcnM7CisgIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+IG1fcmdDaGFuZ2VkQ29udGFpbmVyczsKICAgdWludDMyX3QgbV9uUHJvZ3Jlc3NDb3VudGVyOwotICBib29sIG1fYk5lZUxheW91dDsKKyAgYm9vbCBtX2JOZWVkTGF5b3V0OwogfTsKIAogI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9MQVlPVVRQUk9DRVNTT1JfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2xldmVsLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xldmVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzQzODA1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGV2ZWwuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xldmVsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJsZXZlbCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0xldmVsOjpDWEZBX0xldmVsKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpMZXZlbCwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0xldmVsOjp+Q1hGQV9MZXZlbCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sZXZlbC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGV2ZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmRkMDQ4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGV2ZWwuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTEVWRUxfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTEVWRUxfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9MZXZlbCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9MZXZlbChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0xldmVsKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0xFVkVMX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9saW5lLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xpbmUuY3BwCmluZGV4IDM4ZGUwZDguLjRlNjU2YzIgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2xpbmUuY3BwCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xpbmUuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKQEAgLTYsMTYgKzYsNTAgQEAKIAogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xpbmUuaCIKIAotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfb2JqZWN0LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2xpbmUuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZWRnZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKIAotaW50MzJfdCBDWEZBX0xpbmU6OkdldEhhbmQoKSB7Ci0gIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfSGFuZCk7CituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpFZGdlLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpTbG9wZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6QmFja3NsYXNofSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SGFuZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6RXZlbn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImxpbmUiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9MaW5lOjpDWEZBX0xpbmUoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkxpbmUsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX0xpbmU+KHRoaXMpKSB7fQorCitDWEZBX0xpbmU6On5DWEZBX0xpbmUoKSB7fQorCitYRkFfQXR0cmlidXRlRW51bSBDWEZBX0xpbmU6OkdldEhhbmQoKSB7CisgIHJldHVybiBKU09iamVjdCgpLT5HZXRFbnVtKFhGQV9BdHRyaWJ1dGU6OkhhbmQpOwogfQogCiBib29sIENYRkFfTGluZTo6R2V0U2xvcGUoKSB7Ci0gIHJldHVybiBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfU2xvcGUpID09IFhGQV9BVFRSSUJVVEVFTlVNX1NsYXNoOworICByZXR1cm4gSlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpTbG9wZSkgPT0gWEZBX0F0dHJpYnV0ZUVudW06OlNsYXNoOwogfQogCi1DWEZBX0VkZ2UgQ1hGQV9MaW5lOjpHZXRFZGdlKCkgewotICByZXR1cm4gQ1hGQV9FZGdlKG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpFZGdlKSk7CitDWEZBX0VkZ2UqIENYRkFfTGluZTo6R2V0RWRnZUlmRXhpc3RzKCkgeworICByZXR1cm4gR2V0Q2hpbGQ8Q1hGQV9FZGdlPigwLCBYRkFfRWxlbWVudDo6RWRnZSwgZmFsc2UpOwogfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGluZS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGluZS5oCmluZGV4IGYwMTRjYzAuLjE4ZmFhY2QgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2xpbmUuaAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9saW5lLmgKQEAgLTEsNCArMSw0IEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIApAQCAtNywxOSArNywxOCBAQAogI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9MSU5FX0hfCiAjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0xJTkVfSF8KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2VkZ2UuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCiAKLWNsYXNzIENYRkFfTm9kZTsKK2NsYXNzIENYRkFfRWRnZTsKIAotY2xhc3MgQ1hGQV9MaW5lIDogcHVibGljIENYRkFfRGF0YSB7CitjbGFzcyBDWEZBX0xpbmUgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfTGluZShDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30KKyAgQ1hGQV9MaW5lKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfTGluZSgpIG92ZXJyaWRlOwogCi0gIGludDMyX3QgR2V0SGFuZCgpOworICBYRkFfQXR0cmlidXRlRW51bSBHZXRIYW5kKCk7CiAgIGJvb2wgR2V0U2xvcGUoKTsKLSAgQ1hGQV9FZGdlIEdldEVkZ2UoKTsKKyAgQ1hGQV9FZGdlKiBHZXRFZGdlSWZFeGlzdHMoKTsKIH07CiAKICNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTElORV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGluZWFyLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xpbmVhci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUwNmQyNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xpbmVhci5jcHAKQEAgLTAsMCArMSw5MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGluZWFyLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbGluZWFyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbG9yLmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXNoYWRpbmcuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0ge3tYRkFfRWxlbWVudDo6Q29sb3IsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpUeXBlLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpUb1JpZ2h0fSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwibGluZWFyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfTGluZWFyOjpDWEZBX0xpbmVhcihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6TGluZWFyLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9MaW5lYXI+KHRoaXMpKSB7fQorCitDWEZBX0xpbmVhcjo6fkNYRkFfTGluZWFyKCkge30KKworWEZBX0F0dHJpYnV0ZUVudW0gQ1hGQV9MaW5lYXI6OkdldFR5cGUoKSB7CisgIHJldHVybiBKU09iamVjdCgpCisgICAgICAtPlRyeUVudW0oWEZBX0F0dHJpYnV0ZTo6VHlwZSwgdHJ1ZSkKKyAgICAgIC52YWx1ZV9vcihYRkFfQXR0cmlidXRlRW51bTo6VG9SaWdodCk7Cit9CisKK0NYRkFfQ29sb3IqIENYRkFfTGluZWFyOjpHZXRDb2xvcklmRXhpc3RzKCkgeworICByZXR1cm4gR2V0Q2hpbGQ8Q1hGQV9Db2xvcj4oMCwgWEZBX0VsZW1lbnQ6OkNvbG9yLCBmYWxzZSk7Cit9CisKK3ZvaWQgQ1hGQV9MaW5lYXI6OkRyYXcoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0dFUGF0aCogZmlsbFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgY3JTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEZpbGwsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBDWEZBX0NvbG9yKiBwQ29sb3IgPSBHZXRDb2xvcklmRXhpc3RzKCk7CisgIEZYX0FSR0IgY3JFbmQgPSBwQ29sb3IgPyBwQ29sb3ItPkdldFZhbHVlKCkgOiBDWEZBX0NvbG9yOjprQmxhY2tDb2xvcjsKKworICBDRlhfUG9pbnRGIHB0U3RhcnQ7CisgIENGWF9Qb2ludEYgcHRFbmQ7CisgIHN3aXRjaCAoR2V0VHlwZSgpKSB7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6VG9SaWdodDoKKyAgICAgIHB0U3RhcnQgPSBDRlhfUG9pbnRGKHJ0RmlsbC5sZWZ0LCBydEZpbGwudG9wKTsKKyAgICAgIHB0RW5kID0gQ0ZYX1BvaW50RihydEZpbGwucmlnaHQoKSwgcnRGaWxsLnRvcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpUb0JvdHRvbToKKyAgICAgIHB0U3RhcnQgPSBDRlhfUG9pbnRGKHJ0RmlsbC5sZWZ0LCBydEZpbGwudG9wKTsKKyAgICAgIHB0RW5kID0gQ0ZYX1BvaW50RihydEZpbGwubGVmdCwgcnRGaWxsLmJvdHRvbSgpKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OlRvTGVmdDoKKyAgICAgIHB0U3RhcnQgPSBDRlhfUG9pbnRGKHJ0RmlsbC5yaWdodCgpLCBydEZpbGwudG9wKTsKKyAgICAgIHB0RW5kID0gQ0ZYX1BvaW50RihydEZpbGwubGVmdCwgcnRGaWxsLnRvcCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpUb1RvcDoKKyAgICAgIHB0U3RhcnQgPSBDRlhfUG9pbnRGKHJ0RmlsbC5sZWZ0LCBydEZpbGwuYm90dG9tKCkpOworICAgICAgcHRFbmQgPSBDRlhfUG9pbnRGKHJ0RmlsbC5sZWZ0LCBydEZpbGwudG9wKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIENYRkFfR0VTaGFkaW5nIHNoYWRpbmcocHRTdGFydCwgcHRFbmQsIGZhbHNlLCBmYWxzZSwgY3JTdGFydCwgY3JFbmQpOworCisgIHBHUy0+U2F2ZUdyYXBoU3RhdGUoKTsKKyAgcEdTLT5TZXRGaWxsQ29sb3IoQ1hGQV9HRUNvbG9yKCZzaGFkaW5nKSk7CisgIHBHUy0+RmlsbFBhdGgoZmlsbFBhdGgsIEZYRklMTF9XSU5ESU5HLCAmbWF0cml4KTsKKyAgcEdTLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOworfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGluZWFyLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9saW5lYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjU1ZjgwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGluZWFyLmgKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0xJTkVBUl9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9MSU5FQVJfSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXBhdGguaCIKKworY2xhc3MgQ1hGQV9Db2xvcjsKK2NsYXNzIENYRkFfR3JhcGhpY3M7CisKK2NsYXNzIENYRkFfTGluZWFyIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBzdGF0aWMgY29uc3RleHByIFhGQV9BdHRyaWJ1dGVFbnVtIGtEZWZhdWx0VHlwZSA9IFhGQV9BdHRyaWJ1dGVFbnVtOjpUb1JpZ2h0OworCisgIENYRkFfTGluZWFyKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfTGluZWFyKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBEcmF3KENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgIENYRkFfR0VQYXRoKiBmaWxsUGF0aCwKKyAgICAgICAgICAgIEZYX0FSR0IgY3JTdGFydCwKKyAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRGaWxsLAorICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KTsKKworIHByaXZhdGU6CisgIFhGQV9BdHRyaWJ1dGVFbnVtIEdldFR5cGUoKTsKKyAgQ1hGQV9Db2xvciogR2V0Q29sb3JJZkV4aXN0cygpOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9MSU5FQVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2xpbmVhcml6ZWQuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGluZWFyaXplZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlNmI4ZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xpbmVhcml6ZWQuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xpbmVhcml6ZWQuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImxpbmVhcml6ZWQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9MaW5lYXJpemVkOjpDWEZBX0xpbmVhcml6ZWQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkxpbmVhcml6ZWQsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9MaW5lYXJpemVkOjp+Q1hGQV9MaW5lYXJpemVkKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2xpbmVhcml6ZWQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xpbmVhcml6ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjc4NDZlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGluZWFyaXplZC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9MSU5FQVJJWkVEX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0xJTkVBUklaRURfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9MaW5lYXJpemVkIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0xpbmVhcml6ZWQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9MaW5lYXJpemVkKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0xJTkVBUklaRURfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2xpc3QuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGlzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY1ZmMyOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xpc3QuY3BwCkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xpc3QuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgImZ4anMvY2Z4anNlX2VuZ2luZS5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF90cmVlbGlzdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitDWEZBX0xpc3Q6OkNYRkFfTGlzdChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsIHN0ZDo6dW5pcXVlX3B0cjxDSlhfT2JqZWN0PiBvYmopCisgICAgOiBDWEZBX0xpc3QocERvY3VtZW50LAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpMaXN0LAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpMaXN0LAorICAgICAgICAgICAgICAgIFdpZGVTdHJpbmdWaWV3KEwibGlzdCIpLAorICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShvYmopKSB7fQorCitDWEZBX0xpc3Q6OkNYRkFfTGlzdChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZSBvYmplY3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQgZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgZWxlbWVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pYX09iamVjdD4gb2JqKQorICAgIDogQ1hGQV9PYmplY3QocERvY3VtZW50LCBvYmplY3RUeXBlLCBlVHlwZSwgZWxlbWVudE5hbWUsIHN0ZDo6bW92ZShvYmopKSB7CisgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkFkZFRvQ2FjaGVMaXN0KAorICAgICAgc3RkOjp1bmlxdWVfcHRyPENYRkFfTGlzdD4odGhpcykpOworfQorCitDWEZBX0xpc3Q6On5DWEZBX0xpc3QoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGlzdC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOTQwNmQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9saXN0LmgKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0xJU1RfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTElTVF9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb2JqZWN0LmgiCisKK2NsYXNzIENYRkFfRG9jdW1lbnQ7CisKK2NsYXNzIENYRkFfTGlzdCA6IHB1YmxpYyBDWEZBX09iamVjdCB7CisgcHVibGljOgorICB+Q1hGQV9MaXN0KCkgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCBzaXplX3QgR2V0TGVuZ3RoKCkgPSAwOworICB2aXJ0dWFsIGJvb2wgQXBwZW5kKENYRkFfTm9kZSogcE5vZGUpID0gMDsKKyAgdmlydHVhbCBib29sIEluc2VydChDWEZBX05vZGUqIHBOZXdOb2RlLCBDWEZBX05vZGUqIHBCZWZvcmVOb2RlKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBSZW1vdmUoQ1hGQV9Ob2RlKiBwTm9kZSkgPSAwOworICB2aXJ0dWFsIENYRkFfTm9kZSogSXRlbShzaXplX3QgaUluZGV4KSA9IDA7CisKKyBwcm90ZWN0ZWQ6CisgIENYRkFfTGlzdChDWEZBX0RvY3VtZW50KiBkb2MsIHN0ZDo6dW5pcXVlX3B0cjxDSlhfT2JqZWN0PiBqc19vYmopOworICBDWEZBX0xpc3QoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgWEZBX09iamVjdFR5cGUgb2JqZWN0VHlwZSwKKyAgICAgICAgICAgIFhGQV9FbGVtZW50IGVUeXBlLAorICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGVsZW1lbnROYW1lLAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKWF9PYmplY3Q+IG9iaik7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0xJU1RfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2xvY2FsZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MDExMzkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGUuY3BwCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xvY2FsZS5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7CisgICAge1hGQV9FbGVtZW50OjpEYXRlUGF0dGVybnMsIDEsIDB9LCAgICB7WEZBX0VsZW1lbnQ6OkNhbGVuZGFyU3ltYm9scywgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpDdXJyZW5jeVN5bWJvbHMsIDEsIDB9LCB7WEZBX0VsZW1lbnQ6OlR5cGVmYWNlcywgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpEYXRlVGltZVN5bWJvbHMsIDEsIDB9LCB7WEZBX0VsZW1lbnQ6Ok51bWJlclBhdHRlcm5zLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6Ok51bWJlclN5bWJvbHMsIDEsIDB9LCAgIHtYRkFfRWxlbWVudDo6VGltZVBhdHRlcm5zLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJsb2NhbGUiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9Mb2NhbGU6OkNYRkFfTG9jYWxlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQpLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpMb2NhbGUsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9Mb2NhbGU6On5DWEZBX0xvY2FsZSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGUuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xvY2FsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhN2U4M2QKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGUuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTE9DQUxFX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0xPQ0FMRV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0xvY2FsZSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9Mb2NhbGUoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9Mb2NhbGUoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTE9DQUxFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGVtZ3IuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxlbWdyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjc2OWI2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxlbWdyLmNwcApAQCAtMCwwICsxLDEyNTUgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xvY2FsZW1nci5oIgorCisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvY3BkZl9tb2R1bGVtZ3IuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y29kZWMvY29kZWMvY2NvZGVjX2ZsYXRlbW9kdWxlLmgiCisjaW5jbHVkZSAiY29yZS9meGNvZGVjL2Z4X2NvZGVjLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY3htbF9lbGVtZW50LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X29iamVjdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hY3JvYmF0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tbW9uLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGVsb2NhbGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmVzZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeG1sbG9jYWxlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV91dGlscy5oIgorCisjZGVmaW5lIEZYX0xBTkdfemhfSEsgMHgwYzA0CisjZGVmaW5lIEZYX0xBTkdfemhfQ04gMHgwODA0CisjZGVmaW5lIEZYX0xBTkdfemhfVFcgMHgwNDA0CisjZGVmaW5lIEZYX0xBTkdfbmxfTkwgMHgwNDEzCisjZGVmaW5lIEZYX0xBTkdfZW5fR0IgMHgwODA5CisjZGVmaW5lIEZYX0xBTkdfZW5fVVMgMHgwNDA5CisjZGVmaW5lIEZYX0xBTkdfZnJfRlIgMHgwNDBjCisjZGVmaW5lIEZYX0xBTkdfZGVfREUgMHgwNDA3CisjZGVmaW5lIEZYX0xBTkdfaXRfSVQgMHgwNDEwCisjZGVmaW5lIEZYX0xBTkdfamFfSlAgMHgwNDExCisjZGVmaW5lIEZYX0xBTkdfa29fS1IgMHgwNDEyCisjZGVmaW5lIEZYX0xBTkdfcHRfQlIgMHgwNDE2CisjZGVmaW5lIEZYX0xBTkdfcnVfUlUgMHgwNDE5CisjZGVmaW5lIEZYX0xBTkdfZXNfTEEgMHgwODBhCisjZGVmaW5lIEZYX0xBTkdfZXNfRVMgMHgwYzBhCisKKy8vIFRoZXNlIGFycmF5cyBhcmUgdGhlIGhleCBlbmNvZGVkIFhNTCBzdHJpbmdzIHdoaWNoIGRlZmluZSB0aGUgbG9jYWxlLgorLy8gPGxvY2FsZSBuYW1lPSJlbl9VUyIgZGVzYz0iRW5nbGlzaChBbWVyaWNhKSI+CisvLyAgIDxjYWxlbmRhclN5bWJvbHMgbmFtZT0iZ3JlZ29yaWFuIj4KKy8vICAgICA8bW9udGhOYW1lcz4KKy8vICAgICAgIDxtb250aD5KYW51YXJ5PC9tb250aD4KKy8vICAgICAgIDxtb250aD5GZWJydWFyeTwvbW9udGg+CisvLyAgIC4uLgorY29uc3QgdWludDhfdCBnX2VuVVNfTG9jYWxlW10gPSB7CisgICAgMHg3OCwgMHg5QywgMHg5NSwgMHg1NiwgMHhEMSwgMHg2RSwgMHg5QiwgMHgzMCwgMHgxNCwgMHg3RCwgMHg5RiwgMHhCNCwKKyAgICAweDdGLCAweDQwLCAweEQ2LCAweDJBLCAweEI1LCAweDUyLCAweDU2LCAweDZGLCAweDhGLCAweEE5LCAweDg4LCAweEE1LAorICAgIDB4NkMsIDB4MjQsIDB4OUIsIDB4M0EsIDB4RDEsIDB4NTUsIDB4MjIsIDB4NTUsIDB4QjUsIDB4QkUsIDB4NEMsIDB4MEUsCisgICAgMHhEQywgMHgwNSwgMHgzNCwgMHhCMCwgMHgyMywgMHg4MywgMHgzNywgMHgwNSwgMHhFRCwgMHhFMywgMHg2NywgMHgwNywKKyAgICAweEMzLCAweEMwLCAweEY2LCAweDI0LCAweEMyLCAweDRCLCAweDdDLCAweENGLCAweDNELCAweEU3LCAweEU2LCAweERFLAorICAgIDB4NjMsIDB4MzAsIDB4ODQsIDB4MjUsIDB4NEYsIDB4NjksIDB4MDksIDB4MDEsIDB4QTMsIDB4MTUsIDB4QUMsIDB4MTAsCisgICAgMHhCMCwgMHhFRiwgMHg0RiwgMHgwOSwgMHgwQSwgMHgzMiwgMHhBOCwgMHhEMywgMHgxNSwgMHhEQSwgMHhCMCwgMHg0MywKKyAgICAweDU5LCAweEQ0LCAweEY5LCAweEY1LCAweEJBLCAweDAyLCAweDUxLCAweEE0LCAweEY0LCAweDA2LCAweDkxLCAweDUwLAorICAgIDB4NTMsIDB4NTksIDB4NDYsIDB4NDUsIDB4NzIsIDB4QUEsIDB4RjYsIDB4QkMsIDB4QUMsIDB4OEQsIDB4RUEsIDB4MjAsCisgICAgMHhFMCwgMHhDMCwgMHg0NSwgMHg0MSwgMHg5OSwgMHg2MiwgMHg1NCwgMHg5QywgMHgzNSwgMHhGOSwgMHg4MywgMHg4MiwKKyAgICAweDZCLCAweEIzLCAweDI2LCAweEY3LCAweDk0LCAweDQ5LCAweDJBLCAweDRFLCAweDIxLCAweEVFLCAweEMyLCAweEQ3LAorICAgIDB4QUYsIDB4MEMsIDB4QkUsIDB4ODUsIDB4QkQsIDB4RjAsIDB4MjYsIDB4NjIsIDB4MkEsIDB4RDIsIDB4REMsIDB4NDEsCisgICAgMHhENywgMHg0NywgMHg1MSwgMHg5NCwgMHgxRSwgMHhBRSwgMHhBQiwgMHhCRiwgMHg5NywgMHgwQywgMHgzQywgMHg2MCwKKyAgICAweEU5LCAweDMyLCAweEQ3LCAweEYyLCAweDIwLCAweEVCLCAweEM2LCAweDgxLCAweDEzLCAweDM4LCAweDM2LCAweDUwLAorICAgIDB4RUQsIDB4NDEsIDB4MzgsIDB4OTksIDB4QUYsIDB4NjksIDB4QzMsIDB4N0QsIDB4RjgsIDB4MDMsIDB4RkYsIDB4RTUsCisgICAgMHgxNywgMHg0NCwgMHg5MCwgMHhEQSwgMHgwOSwgMHgzQywgMHhCMiwgMHhBOCwgMHhFNywgMHg5RCwgMHhBMywgMHg4MCwKKyAgICAweEVFLCAweEY3LCAweDYyLCAweDg1LCAweERFLCAweEEzLCAweDkxLCAweDczLCAweDNFLCAweEQ3LCAweDdDLCAweDg2LAorICAgIDB4RjksIDB4RUMsIDB4OUEsIDB4NkIsIDB4OTYsIDB4Q0YsIDB4MkIsIDB4OUYsIDB4NTUsIDB4M0UsIDB4OUYsIDB4N0MsCisgICAgMHgwRSwgMHhGOSwgMHhEQywgMHhGMSwgMHgxOSwgMHhGMywgMHg3RiwgMHg0RiwgMHgzMiwgMHg3QSwgMHgzMiwgMHhCNywKKyAgICAweDkwLCAweDVBLCAweDkxLCAweDQ0LCAweEFBLCAweDVCLCAweDRFLCAweDc1LCAweEFFLCAweEQ3LCAweDVELCAweDkyLAorICAgIDB4QzQsIDB4REMsIDB4ODEsIDB4NzYsIDB4MTIsIDB4NkEsIDB4MUIsIDB4N0IsIDB4ODYsIDB4OEMsIDB4QjksIDB4RTgsCisgICAgMHgyRSwgMHg5NywgMHhDMiwgMHgwMSwgMHhCNywgMHhBMiwgMHhCMCwgMHhBMSwgMHg4NCwgMHgzNiwgMHg1MiwgMHg4QywKKyAgICAweDQxLCAweDNDLCAweEY0LCAweDM1LCAweEVBLCAweDcxLCAweEI0LCAweDZCLCAweEE2LCAweDU5LCAweEJCLCAweDUzLAorICAgIDB4QkIsIDB4NEQsIDB4QkIsIDB4NDUsIDB4QkIsIDB4MzksIDB4QkIsIDB4MkYsIDB4QkIsIDB4MjksIDB4N0YsIDB4M0YsCisgICAgMHhGQSwgMHgyMSwgMHhDRCwgMHgwQSwgMHhBOCwgMHhGQSwgMHg2NywgMHhDRiwgMHg4NCwgMHg2NCwgMHgxRCwgMHgyQiwKKyAgICAweDc3LCAweEZCLCAweDYwLCAweEM0LCAweDIzLCAweDhGLCAweDU2LCAweDAyLCAweDRGLCAweDJCLCAweDI4LCAweDA0LAorICAgIDB4MDQsIDB4MzUsIDB4RDUsIDB4RDQsIDB4OEEsIDB4N0MsIDB4RjgsIDB4MTgsIDB4NjIsIDB4RkQsIDB4REIsIDB4MjUsCisgICAgMHhDOCwgMHgzQSwgMHgxQSwgMHg0MiwgMHgzQywgMHgxMCwgMHg3NSwgMHg2MCwgMHg5RCwgMHgxMSwgMHg1RCwgMHhFMywKKyAgICAweDBELCAweDNDLCAweEQyLCAweEE2LCAweDAxLCAweEMxLCAweENFLCAweDdCLCAweDNBLCAweDQ0LCAweEU2LCAweDAwLAorICAgIDB4RjksIDB4MjEsIDB4Q0IsIDB4MTIsIDB4OTEsIDB4OEQsIDB4QkEsIDB4MTYsIDB4NDEsIDB4QUMsIDB4QUUsIDB4MjAsCisgICAgMHg1QSwgMHgwNCwgMHhERiwgMHhENCwgMHhBNSwgMHgyNywgMHgxQywgMHhCOCwgMHg1NiwgMHgyMSwgMHgyMywgMHgyRCwKKyAgICAweDM5LCAweDNCLCAweDIwLCAweDcyLCAweEExLCAweEE4LCAweDgyLCAweEVDLCAweEFDLCAweEI5LCAweDQwLCAweDUyLAorICAgIDB4RTcsIDB4NUMsIDB4MzQsIDB4NEEsIDB4ODQsIDB4MjMsIDB4RUMsIDB4RTEsIDB4RTMsIDB4QzksIDB4ODQsIDB4MEEsCisgICAgMHg2OCwgMHg4QSwgMHg2QSwgMHgzNCwgMHhGMSwgMHgyOCwgMHg5QSwgMHg0QywgMHg5QywgMHhERiwgMHhDNSwgMHhGMSwKKyAgICAweDVELCAweDkyLCAweDA0LCAweEVCLCAweEUwLCAweDI1LCAweEM0LCAweDIzLCAweDkyLCAweDU1LCAweDYxLCAweDMyLAorICAgIDB4RUEsIDB4NjUsIDB4OUEsIDB4RjMsIDB4QTQsIDB4ODMsIDB4NjQsIDB4ODYsIDB4QzAsIDB4Q0MsIDB4QTksIDB4MjUsCisgICAgMHgxRSwgMHgzRSwgMHg5RSwgMHhDQywgMHg2NSwgMHg4QywgMHhEQSwgMHgyOSwgMHhBQywgMHhERiwgMHhFQywgMHg0RiwKKyAgICAweEE3LCAweDM4LCAweEZCLCAweEY5LCAweEI5LCAweEFBLCAweDkzLCAweDRELCAweEI0LCAweEZELCAweEZELCAweDRDLAorICAgIDB4RjMsIDB4MkYsIDB4RUQsIDB4NEIsIDB4NjcsIDB4Q0UsIDB4OTgsIDB4QTQsIDB4NzQsIDB4NEMsIDB4RUEsIDB4NTMsCisgICAgMHhGMSwgMHg5RiwgMHg0MywgMHg5MywgMHhEOCwgMHhCNCwgMHhBMiwgMHgzMCwgMHhGRCwgMHhFMiwgMHg0MSwgMHhBNCwKKyAgICAweDVELCAweEI0LCAweEVELCAweEYyLCAweEI2LCAweDZELCAweERCLCAweDEwLCAweDRGLCAweDc4LCAweDRFLCAweDIxLAorICAgIDB4MjMsIDB4NEMsIDB4QTUsIDB4MTAsIDB4QzAsIDB4RDIsIDB4MTMsIDB4MjIsIDB4NkYsIDB4M0EsIDB4RTksIDB4NzIsCisgICAgMHhGOSwgMHhFNywgMHg3QSwgMHg1OCwgMHhERSwgMHhDQywgMHhBQywgMHg3MiwgMHgwNCwgMHg5MSwgMHgwMiwgMHg2QiwKKyAgICAweENDLCAweERGLCAweDVGLCAweDc5LCAweDU0LCAweEQ4LCAweDlBLCAweDYyLCAweDI4LCAweEQ0LCAweDBGLCAweDNBLAorICAgIDB4MDksIDB4NEQsIDB4RDksIDB4MEMsIDB4RDIsIDB4QTIsIDB4QTIsIDB4NkEsIDB4RjMsIDB4NkYsIDB4N0IsIDB4N0QsCisgICAgMHg5NywgMHhCNiwgMHhENSwgMHhDMywgMHhCQiwgMHg5NSwgMHhDQiwgMHg2MywgMHhBMSwgMHgzNywgMHg3RSwgMHgzMSwKKyAgICAweDhCLCAweDNGLCAweDc0LCAweDdELCAweDM1LCAweDhCLCAweDVFLCAweDE1LCAweDRDLCAweEQ2LCAweDg4LCAweEJDLAorICAgIDB4OUQsIDB4NDUsIDB4NkUsIDB4NDEsIDB4NzAsIDB4NDQsIDB4REUsIDB4QjksIDB4NUMsIDB4M0MsIDB4MUQsIDB4NUIsCisgICAgMHgyMSwgMHhGRCwgMHgxNiwgMHgwQywgMHg0RSwgMHg0QywgMHg4MSwgMHhGRSwgMHg2NiwgMHgzQiwgMHgwNywgMHg2QSwKKyAgICAweDlCLCAweEQ0LCAweEE5LCAweDMxLCAweEM5LCAweEJCLCAweDI1LCAweDhDLCAweEEyLCAweEE4LCAweEI5LCAweDVFLAorICAgIDB4MjAsIDB4RjIsIDB4OTQsIDB4NDQsIDB4QjMsIDB4NDUsIDB4NjMsIDB4Q0IsIDB4NUQsIDB4MDksIDB4QjYsIDB4N0IsCisgICAgMHhENSwgMHg1OCwgMHhGNywgMHg1NSwgMHhBNCwgMHg5NiwgMHg3RiwgMHgwMSwgMHg3NSwgMHgzNywgMHgxQiwgMHg4QiwKK307Citjb25zdCB1aW50OF90IGdfZW5HQl9Mb2NhbGVbXSA9IHsKKyAgICAweDc4LCAweDlDLCAweDk1LCAweDU2LCAweEQxLCAweDZFLCAweEQzLCAweDMwLCAweDE0LCAweDdELCAweDQ3LCAweEUyLAorICAgIDB4MUYsIDB4QTIsIDB4ODgsIDB4NDksIDB4MjAsIDB4NkQsIDB4MzMsIDB4M0MsIDB4NkUsIDB4RUEsIDB4MkMsIDB4NzUsCisgICAgMHhFQiwgMHhENiwgMHgzMiwgMHhDOCwgMHhBOCwgMHg0OCwgMHhDNSwgMHhDNCwgMHg1RSwgMHg5MCwgMHg5QiwgMHg3OCwKKyAgICAweDhELCAweDU5LCAweDYyLCAweDU3LCAweDRFLCAweENDLCAweDk0LCAweEZDLCAweDAyLCAweDlGLCAweEMwLCAweDIzLAorICAgIDB4Q0YsIDB4MDgsIDB4RjEsIDB4MDEsIDB4QkMsIDB4RjAsIDB4MkYsIDB4NDgsIDB4RkIsIDB4MEMsIDB4NkUsIDB4MUEsCisgICAgMHgyNywgMHg0QiwgMHgxQywgMHhBRiwgMHg2NCwgMHg3OSwgMHg4OSwgMHhFRiwgMHhCOSwgMHhFNywgMHhEQywgMHhERSwKKyAgICAweDdCLCAweDlDLCAweEI4LCAweDE5LCAweEM1LCAweDIyLCAweDIwLCAweDMxLCAweDc1LCAweDM4LCAweDQ5LCAweEU4LAorICAgIDB4OTEsIDB4NEIsIDB4RjksIDB4QTcsIDB4RTksIDB4QjEsIDB4RUIsIDB4ODQsIDB4MzQsIDB4MEQsIDB4OEUsIDB4REMsCisgICAgMHhCQiwgMHhBRiwgMHhCRiwgMHhFRSwgMHg3RSwgMHhGRSwgMHg3OCwgMHgwRSwgMHhCNywgMHhCRiwgMHhERiwgMHg3RSwKKyAgICAweEJGLCAweDcwLCAweEYxLCAweEE4LCAweDI0LCAweEYyLCAweDkwLCAweDQ4LCAweDNGLCAweDRGLCAweDk2LCAweDIyLAorICAgIDB4NEUsIDB4QjUsIDB4NjYsIDB4MjUsIDB4RTksIDB4NEEsIDB4NDgsIDB4NDYsIDB4MzgsIDB4MzAsIDB4MTIsIDB4QzEsCisgICAgMHhCMywgMHhFOCwgMHgwMiwgMHhFMCwgMHg1NCwgMHhBRiwgMHhGMSwgMHgzOSwgMHhFMSwgMHg4QSwgMHhDOCwgMHg3QywKKyAgICAweDg0LCAweEFBLCAweEYwLCAweEU5LCAweDEzLCAweDhELCAweDlGLCAweEQxLCAweEE1LCAweEI0LCAweDI2LCAweDNDLAorICAgIDB4MjIsIDB4ODMsIDB4QTgsIDB4ODcsIDB4OEUsIDB4RDcsIDB4OTIsIDB4QzUsIDB4MTYsIDB4NkUsIDB4NUYsIDB4N0YsCisgICAgMHhBRSwgMHgzOCwgMHhCNSwgMHg4MCwgMHg3MSwgMHg5RiwgMHgzOSwgMHg1NiwgMHgyQiwgMHg5NSwgMHg2NiwgMHgzRCwKKyAgICAweEQ4LCAweEE3LCAweEVCLCAweDhDLCAweDI2LCAweDRCLCAweDJBLCAweDdCLCAweDk5LCAweDc3LCAweDQxLCAweDI2LAorICAgIDB4NkMsIDB4RjgsIDB4ODUsIDB4RjgsIDB4NjIsIDB4MTcsIDB4NEMsIDB4NjgsIDB4NjAsIDB4MjYsIDB4NTAsIDB4Q0IsCisgICAgMHhBMiwgMHg5QSwgMHhCNywgMHg4OSwgMHgxQywgMHhCMiwgMHg1QywgMHhDQSwgMHgyMywgMHhGNywgMHg5NSwgMHhEQiwKKyAgICAweDcyLCAweENFLCAweEU2LCAweDlBLCAweENELCAweDMwLCAweDlCLCAweDVELCAweDQzLCAweENELCAweEIyLCAweDc5LAorICAgIDB4NjUsIDB4QjMsIDB4Q0EsIDB4RTYsIDB4OTMsIDB4Q0QsIDB4MjEsIDB4OUIsIDB4M0IsIDB4MzYsIDB4NjMsIDB4MUUsCisgICAgMHhGNiwgMHgyNCwgMHgyNCwgMHhCOSwgMHg3RSwgMHg4NCwgMHg2MCwgMHg4NSwgMHg3RCwgMHgwNSwgMHg4RiwgMHgxQywKKyAgICAweDc0LCAweDVFLCAweEFFLCAweEFCLCAweDI0LCAweEY2LCAweDQ0LCAweDBGLCAweDVBLCAweDI4LCAweDlBLCAweDlBLAorICAgIDB4RDgsIDB4MjUsIDB4MEQsIDB4NzksIDB4MUYsIDB4NUQsIDB4NDQsIDB4NEEsIDB4RjYsIDB4QzAsIDB4MzMsIDB4QzksCisgICAgMHg0QywgMHhDOCwgMHgyNywgMHg5OSwgMHg5MiwgMHg2RCwgMHgxMCwgMHgzNSwgMHg3RCwgMHhCNSwgMHg3QSwgMHg2QywKKyAgICAweEVELCAweDlBLCAweDZFLCAweEQ2LCAweEVDLCAweEQ0LCAweDZDLCAweEQzLCAweDZDLCAweEQxLCAweDZDLCAweENFLAorICAgIDB4RUMsIDB4Q0IsIDB4NkMsIDB4Q0EsIDB4REUsIDB4NEYsIDB4NDIsIDB4NjEsIDB4MDIsIDB4NDYsIDB4OTMsIDB4RkEsCisgICAgMHhERCwgMHhEMywgMHgyMSwgMHgxRSwgMHg3QiwgMHhFMCwgMHg2RSwgMHgxRCwgMHhCNCwgMHg3OCwgMHg3OCwgMHg2RSwKKyAgICAweDI0LCAweDUwLCAweEI3LCAweDAyLCAweDIwLCAweDU0LCAweDEyLCAweDVELCAweDBELCAweDU2LCAweEY4LCAweEY4LAorICAgIDB4NjQsIDB4ODQsIDB4Q0EsIDB4N0IsIDB4OTUsIDB4QzAsIDB4RTMsIDB4NDksIDB4MTMsIDB4QTIsIDB4ODYsIDB4NTgsCisgICAgMHgwNiwgMHhDNiwgMHgxOSwgMHg1MSwgMHgzNSwgMHg5RSwgMHhEMSwgMHgzOSwgMHhDOSwgMHgzMiwgMHgyQSwgMHhGOSwKKyAgICAweDY2LCAweDRGLCAweDlCLCAweDQ4LCAweDFGLCAweDIwLCAweEQ3LCAweDJBLCAweDhFLCAweDVELCAweDdDLCAweDBBLAorICAgIDB4RDcsIDB4QUUsIDB4MzMsIDB4NzEsIDB4M0MsIDB4QjgsIDB4OUMsIDB4OEYsIDB4NzAsIDB4OTUsIDB4MDMsIDB4MzYsCisgICAgMHg1NCwgMHhBMywgMHg4RSwgMHg1NiwgMHhDNiwgMHg4MiwgMHhBRiwgMHg1QywgMHhGQywgMHgzOCwgMHg0RCwgMHg0MiwKKyAgICAweDQzLCAweDJELCAweDE5LCAweEFBLCAweDQ4LCAweDIzLCAweDIxLCAweDMzLCAweEQwLCAweDRDLCAweDkwLCAweEU3LAorICAgIDB4MjEsIDB4QUIsIDB4MDYsIDB4NzUsIDB4NDYsIDB4MDQsIDB4MjAsIDB4NjMsIDB4NDksIDB4NkIsIDB4RTQsIDB4NTYsCisgICAgMHhENCwgMHgxOSwgMHg3OSwgMHgzNiwgMHgzQiwgMHhGNCwgMHhCQywgMHg0MywgMHhERiwgMHg3NywgMHhBRSwgMHg0NiwKKyAgICAweEE4LCAweEM1LCAweDMxLCAweDBBLCAweDc0LCAweDY2LCAweDdELCAweDk0LCAweDY0LCAweDMzLCAweDZBLCAweEFELAorICAgIDB4MTgsIDB4QzAsIDB4RDcsIDB4ODMsIDB4NkUsIDB4MTQsIDB4M0QsIDB4M0EsIDB4RUEsIDB4Q0MsIDB4QTQsIDB4OEQsCisgICAgMHg1QSwgMHgwMCwgMHg1NiwgMHhFRiwgMHhGNCwgMHgzNCwgMHhGNywgMHhDMiwgMHg5QiwgMHg1OSwgMHg5MiwgMHhGQSwKKyAgICAweEE3LCAweDkzLCAweEIzLCAweERCLCAweDRCLCAweDEyLCAweEJELCAweDI5LCAweEFFLCAweDJBLCAweDYzLCAweERBLAorICAgIDB4MjQsIDB4RDAsIDB4NzEsIDB4NTUsIDB4MUUsIDB4ODksIDB4RjcsIDB4RUUsIDB4NzQsIDB4NjIsIDB4REQsIDB4MDksCisgICAgMHg2MCwgMHhGMCwgMHgzOCwgMHgwNiwgMHgyRSwgMHgyRSwgMHg3NiwgMHg4QiwgMHhFMiwgMHg2MCwgMHhCRiwgMHgyOCwKKyAgICAweDhBLCAweDExLCAweEVBLCAweEYwLCAweDdBLCAweDg1LCAweEI0LCAweDMwLCAweDUwLCAweDUyLCAweDUyLCAweDFFLAorICAgIDB4RTQsIDB4MkUsIDB4N0UsIDB4NTYsIDB4NDksIDB4MEYsIDB4MEUsIDB4MDYsIDB4MkEsIDB4RDcsIDB4NTQsIDB4MDYsCisgICAgMHg5NCwgMHg2NywgMHhGQSwgMHgyNywgMHg3NywgMHgyQywgMHgyQSwgMHg2NCwgMHg3NCwgMHhERSwgMHgxNCwgMHhBQSwKKyAgICAweDg3LCAweEVCLCAweDg0LCAweEJBLCAweDZDLCAweDQ4LCAweDAzLCAweDk2LCAweDEwLCAweEQ4LCAweEVDLCAweEZELAorICAgIDB4NUEsIDB4NUYsIDB4QTUsIDB4NEQsIDB4NzUsIDB4RjMsIDB4NjcsIDB4MkEsIDB4RDQsIDB4OUEsIDB4OTUsIDB4M0IsCisgICAgMHhCRCwgMHgzQiwgMHg4OCwgMHhERiwgMHg3NCwgMHhCRCwgMHgzMywgMHg4OCwgMHg5RSwgMHgzMCwgMHhBRSwgMHg1MiwKKyAgICAweDE3LCAweEVGLCAweDBELCAweDIyLCAweDE3LCAweDU0LCAweDBBLCAweDE3LCAweEJGLCAweEVDLCAweDczLCAweDUxLAorICAgIDB4NzcsIDB4NkMsIDB4NDAsIDB4NkEsIDB4REIsIDB4MUIsIDB4MjcsIDB4QkEsIDB4NDAsIDB4RkQsIDB4N0MsIDB4NkQsCisgICAgMHgwMiwgMHgxNywgMHhGRiwgMHhGOSwgMHgwRSwgMHhFNywgMHg0NCwgMHg4NywgMHhEMCwgMHhBRiwgMHhBMSwgMHgyNSwKKyAgICAweDJDLCAweDE1LCAweEU1LCAweEMyLCAweEM1LCAweEQzLCAweEUzLCAweEY5LCAweDYwLCAweDUxLCAweERCLCAweEYzLAorICAgIDB4QkUsIDB4MDQsIDB4OTksIDB4Q0QsIDB4OTYsIDB4RUYsIDB4NDIsIDB4QkUsIDB4QTYsIDB4RDcsIDB4MjQsIDB4MjgsCisgICAgMHgwRiwgMHhCQiwgMHg3QSwgMHhBOSwgMHg2QiwgMHg3OSwgMHgzOSwgMHg3QywgMHhEQSwgMHg4NCwgMHhDRSwgMHgxQywKKyAgICAweEFDLCAweDQwLCAweDZELCAweDY2LCAweDlELCAweDY2LCAweDlDLCAweDA5LCAweEZFLCAweDYwLCAweEZBLCAweDQ0LAorICAgIDB4MjgsIDB4QzksIDB4QTgsIDB4NzQsIDB4RkMsIDB4MkMsIDB4QjQsIDB4RTYsIDB4QzcsIDB4MjEsIDB4N0MsIDB4NTAsCisgICAgMHgzOCwgMHg3MywgMHhGNiwgMHgxRiwgMHhDMiwgMHgwQywgMHgzRSwgMHg5NiwgMHhFOCwgMHhFRCwgMHgxNiwgMHhDMiwKKyAgICAweDU4LCAweDkyLCAweDI1LCAweEJDLCAweDJFLCAweDBGLCAweDEzLCAweDE2LCAweDExLCAweDYxLCAweEQ2LCAweEY0LAorICAgIDB4MUIsIDB4NTEsIDB4QTgsIDB4MUIsIDB4RTIsIDB4NEMsIDB4NDUsIDB4MTYsIDB4QjEsIDB4QTAsIDB4OUMsIDB4NjMsCisgICAgMHhFRiwgMHhDMywgMHg2QiwgMHhDNywgMHhEQiwgMHg0NiwgMHg4NSwgMHg5MSwgMHg4MywgMHg0OCwgMHhENCwgMHhENCwKKyAgICAweEY3LCAweDVCLCAweDdFLCAweDE0LCAweDk4LCAweEFCLCAweDcyLCAweDMyLCAweEU3LCAweEVELCAweDE2LCAweDkyLAorICAgIDB4MkYsIDB4MDYsIDB4OTAsIDB4QkMsIDB4NUMsIDB4RjEsIDB4RDUsIDB4NjcsIDB4QjEsIDB4RTEsIDB4RTksIDB4RTYsCisgICAgMHhEMCwgMHhGRCwgMHg5RSwgMHg5NSwgMHg1MSwgMHhGNSwgMHgxOSwgMHgwQiwgMHhDQiwgMHg3RiwgMHg4RSwgMHg2OSwKKyAgICAweEFDLCAweEQwfTsKK2NvbnN0IHVpbnQ4X3QgZ196aENOX0xvY2FsZVtdID0geworICAgIDB4NzgsIDB4OUMsIDB4RUQsIDB4NTYsIDB4NDEsIDB4NEYsIDB4RDQsIDB4NDAsIDB4MTQsIDB4QkUsIDB4OUIsIDB4RjgsCisgICAgMHgxRiwgMHg5QSwgMHg0NiwgMHg1MiwgMHg0RCwgMHg1OCwgMHg0NiwgMHg4RiwgMHg5MCwgMHhEMiwgMHg2NCwgMHgwMywKKyAgICAweDA4LCAweDA2LCAweEJCLCAweDIxLCAweDk2LCAweDY4LCAweEUwLCAweDYyLCAweEJBLCAweEVELCAweEIwLCAweDJELAorICAgIDB4NkMsIDB4M0IsIDB4NjQsIDB4QjYsIDB4MEQsIDB4NkUsIDB4NEYsIDB4MTgsIDB4ODIsIDB4ODIsIDB4QzIsIDB4NDUsCisgICAgMHg4OSwgMHg5QSwgMHg4MCwgMHhFMSwgMHg2NCwgMHgzQywgMHgyOCwgMHg5RSwgMHg4QywgMHgwMSwgMHgyMiwgMHhGMSwKKyAgICAweENGLCAweEIwLCAweENCLCAweDkxLCAweEJGLCAweEUwLCAweDlCLCAweEVELCAweEI0LCAweEI0LCAweERELCAweEQ5LAorICAgIDB4QjUsIDB4M0YsIDB4QzAsIDB4M0QsIDB4Q0QsIDB4RkIsIDB4REUsIDB4RjcsIDB4N0QsIDB4RjMsIDB4REUsIDB4RUIsCisgICAgMHg3NCwgMHhCNiwgMHg2QSwgMHg5MywgMHg1OCwgMHg2NiwgMHgxMywgMHg0QiwgMHhCRSwgMHhFOSwgMHhFMSwgMHg0OSwKKyAgICAweDM5LCAweDcyLCAweDlFLCAweDRGLCAweEQ1LCAweDY0LCAweEM5LCAweEM2LCAweDJELCAweDZCLCAweDUyLCAweEJFLAorICAgIDB4M0MsIDB4M0QsIDB4RTksIDB4N0UsIDB4NzgsIDB4N0QsIDB4RjcsIDB4RUEsIDB4QzcsIDB4RTYsIDB4RTUsIDB4QzUsCisgICAgMHhGQiwgMHhFQiwgMHhERiwgMHg3QiwgMHgxMCwgMHg3NywgMHgwRSwgMHgyRiwgMHhFRSwgMHhDOSwgMHg5QSwgMHhDQSwKKyAgICAweDE0LCAweEJFLCAweDZELCAweDUyLCAweEEzLCAweEVELCAweEQ1LCAweDQ5LCAweEIzLCAweEM1LCAweEM1LCAweDBELAorICAgIDB4OEEsIDB4MUIsIDB4ODQsIDB4QkEsIDB4QTYsIDB4MEYsIDB4MEMsIDB4OEYsIDB4RjgsIDB4ODEsIDB4NTMsIDB4MDMsCisgICAgMHhCOCwgMHhDNSwgMHhENywgMHhEQSwgMHhFNSwgMHhFOSwgMHg2NiwgMHhGNywgMHg2OCwgMHg0NywgMHg0NSwgMHg3MSwKKyAgICAweDc0LCAweEZCLCAweDU2LCAweDAyLCAweDlGLCAweEVGLCAweDA5LCAweEUxLCAweEQzLCAweDVELCAweDExLCAweERDLAorICAgIDB4MzksIDB4M0MsIDB4MTQsIDB4OUIsIDB4MUMsIDB4MDgsIDB4RDksIDB4REIsIDB4MjcsIDB4NjIsIDB4RUYsIDB4MkQsCisgICAgMHgzMSwgMHhGQiwgMHg5QiwgMHg5MCwgMHg3RCwgMHhGNiwgMHg1OSwgMHhDOCwgMHhERSwgMHg3RiwgMHgzOSwgMHgwMCwKKyAgICAweDFFLCAweEQwLCAweDI4LCAweENCLCAweDE0LCAweDdCLCAweDQ1LCAweDk5LCAweDMxLCAweDI1LCAweEM0LCAweDVFLAorICAgIDB4MjQsIDB4OTksIDB4RjUsIDB4M0EsIDB4OUQsIDB4OTQsIDB4MUYsIDB4QzgsIDB4RkYsIDB4QTcsIDB4NTcsIDB4N0EsCisgICAgMHg3QSwgMHhCNiwgMHhEOSwgMHhFNiwgMHgwNywgMHgwRSwgMHg1NiwgMHg1QSwgMHhGNywgMHhEMywgMHg3MSwgMHhGNywKKyAgICAweEU4LCAweEI4LCAweEZCLCAweEYxLCAweDhCLCAweDhBLCAweDU4LCAweDE4LCAweEU3LCAweDM5LCAweDBBLCAweDdCLAorICAgIDB4ODgsIDB4RDAsIDB4RjMsIDB4M0QsIDB4MjEsIDB4NzcsIDB4NTcsIDB4ODAsIDB4QzIsIDB4MjQsIDB4ODUsIDB4MEUsCisgICAgMHgwNywgMHgyMiwgMHhFRSwgMHhGNiwgMHg0OSwgMHg4QSwgMHhBMiwgMHhCNCwgMHhDOCwgMHg0QywgMHhDMSwgMHg5OSwKKyAgICAweDg3LCAweERELCAweDUzLCAweDE1LCAweDZBLCAweDJFLCAweDU2LCAweDVCLCAweEFDLCAweEIzLCAweDU4LCAweDYxLAorICAgIDB4QjEsIDB4QjYsIDB4NjIsIDB4NTUsIDB4MDMsIDB4RUIsIDB4RjEsIDB4MzAsIDB4NzUsIDB4NkQsIDB4MTcsIDB4N0IsCisgICAgMHhDOSwgMHg2QiwgMHhDQiwgMHg0MywgMHhEOCwgMHhFMCwgMHg0RCwgMHg2NywgMHg5RiwgMHgwRCwgMHgzRSwgMHgwMSwKKyAgICAweDMyLCAweDVDLCAweDQ4LCAweEJFLCAweEVELCAweDRCLCAweEEyLCAweEJDLCAweDEzLCAweDIwLCAweDk4LCAweDlBLAorICAgIDB4REMsIDB4MTUsIDB4NTYsIDB4NTAsIDB4QzEsIDB4RjcsIDB4Q0UsIDB4RjYsIDB4NTYsIDB4NjcsIDB4NzcsIDB4NUYsCisgICAgMHg0NSwgMHgyQywgMHg4QywgMHhGMywgMHgxQywgMHg0RCwgMHgyMSwgMHg5NCwgMHg2QSwgMHg1OCwgMHg1MCwgMHhCOCwKKyAgICAweDcxLCAweEUyLCAweDVFLCAweDAyLCAweEJDLCAweDYwLCAweDA2LCAweDAxLCAweEE2LCAweDdFLCAweEVGLCAweDk5LAorICAgIDB4QTcsIDB4MTEsIDB4QkYsIDB4OEUsIDB4NTYsIDB4QzIsIDB4NjYsIDB4NTMsIDB4RDYsIDB4OTYsIDB4RTAsIDB4QTcsCisgICAgMHg3NCwgMHhDRSwgMHg3RSwgMHgyQSwgMHhCQSwgMHgwMiwgMHhBNywgMHg0NywgMHg5OSwgMHg1NiwgMHg2MCwgMHhCQywKKyAgICAweENBLCAweDBDLCAweEZDLCAweDU4LCAweEVGLCAweEE5LCAweEE0LCAweEUwLCAweEM3LCAweDFELCAweDlBLCAweEM0LAorICAgIDB4NkYsIDB4MEMsIDB4NzAsIDB4MjgsIDB4QTEsIDB4RjYsIDB4QjAsIDB4MUQsIDB4OEIsIDB4MkIsIDB4N0EsIDB4NjUsCisgICAgMHhCQSwgMHgwNCwgMHhCRiwgMHhFNSwgMHgxMCwgMHgxQSwgMHgzMCwgMHg4NSwgMHg5MCwgMHg4RiwgMHg3MiwgMHhFRCwKKyAgICAweDAyLCAweDEwLCAweEI4LCAweDVFLCAweEE2LCAweEZELCAweDRDLCAweDk0LCAweDZCLCAweEJGLCAweEVBLCAweDM4LAorICAgIDB4NTAsIDB4RUYsIDB4MkYsIDB4NDUsIDB4RDcsIDB4OTUsIDB4Q0UsIDB4Q0UsIDB4MkIsIDB4QzUsIDB4MzAsIDB4OTQsCisgICAgMHhBQiwgMHhBRiwgMHhFRiwgMHgxNCwgMHg2OSwgMHg1OSwgMHg0NSwgMHgxOSwgMHg0NSwgMHhDMSwgMHgyRSwgMHhENywKKyAgICAweEJELCAweEQ4LCAweEEwLCAweDg0LCAweEJDLCAweEQ3LCAweDNFLCAweEE4LCAweDI3LCAweDc0LCAweDdELCAweEMyLAorICAgIDB4MzAsIDB4NEEsIDB4MDgsIDB4NzgsIDB4RkYsIDB4NTUsIDB4QTYsIDB4RTgsIDB4QTMsIDB4QTMsIDB4NUMsIDB4QkIsCisgICAgMHg3QywgMHg3RSwgMHg4QiwgMHg4MCwgMHgyNSwgMHgwNywgMHg2MiwgMHhENiwgMHhGNCwgMHg1NywgMHhENywgMHhFNiwKKyAgICAweEJDLCAweDk2LCAweDMxLCAweDMzLCAweEZELCAweDcwLCAweEUzLCAweEQ5LCAweDBCLCAweDY3LCAweDNFLCAweDVBLAorICAgIDB4OEUsIDB4NjcsIDB4OTYsIDB4MjUsIDB4ODEsIDB4Q0UsIDB4MEYsIDB4QkQsIDB4M0EsIDB4QTYsIDB4MzcsIDB4ODMsCisgICAgMHhDQiwgMHhDNSwgMHhCQywgMHgxMiwgMHhDMCwgMHhFMCwgMHgwMCwgMHg1QiwgMHhCMiwgMHgxNiwgMHg4RCwgMHg0NiwKKyAgICAweEQxLCAweEY4LCAweDU4LCAweDE0LCAweDQ1LCAweDJBLCAweENBLCAweEYxLCAweEZBLCAweDhDLCAweEI4LCAweEQwLAorICAgIDB4MEEsIDB4MjksIDB4QzUsIDB4QkUsIDB4RDUsIDB4OTYsIDB4QjUsIDB4M0IsIDB4QjEsIDB4NzQsIDB4N0MsIDB4QkMsCisgICAgMHhBNCwgMHg3MiwgMHgxRCwgMHg1MywgMHgwQiwgMHhGQiwgMHgwMSwgMHhERiwgMHg3MiwgMHg0NCwgMHhBMCwgMHg0MiwKKyAgICAweDg1LCAweENBLCAweDUzLCAweEEzLCAweEE0LCAweEI5LCAweDVDLCAweEM4LCAweDZELCAweDZELCAweDZDLCAweEI5LAorICAgIDB4OUUsIDB4MDksIDB4RTcsIDB4NjAsIDB4MkMsIDB4RDEsIDB4QzcsIDB4RTksIDB4QTIsIDB4M0EsIDB4RkQsIDB4MDcsCisgICAgMHgyNywgMHhFMSwgMHhCQSwgMHhDQiwgMHgxRSwgMHhGQiwgMHg2OCwgMHgyOSwgMHg3RSwgMHg1QSwgMHhGNSwgMHg0OCwKKyAgICAweDI5LCAweEJBLCAweEU3LCAweEZBLCAweDYxLCAweDRCLCAweEQ2LCAweDJBLCAweEE1LCAweEM4LCAweDExLCAweEE2LAorICAgIDB4NDQsIDB4RDYsIDB4RUUsIDB4RjcsIDB4NzMsIDB4NTEsIDB4QkUsIDB4NkQsIDB4NDAsIDB4OTIsIDB4QjEsIDB4QTcsCisgICAgMHg5MywgMHhDOCwgMHgwMywgMHhDOSwgMHhGOSwgMHhFQSwgMHgwNSwgMHhCMiwgMHg3NiwgMHhGRCwgMHgwNywgMHhFRSwKKyAgICAweEQ3LCAweDNDLCAweEEzLCAweERGLCAweDg0LCAweDZCLCAweERDLCAweDE2LCAweDYxLCAweDBCLCAweDU5LCAweDlCLAorICAgIDB4QUEsIDB4MkQsIDB4OTUsIDB4MTYsIDB4NjUsIDB4ODcsIDB4REUsIDB4MkYsIDB4NDEsIDB4QzUsIDB4NkEsIDB4RDksCisgICAgMHhDQiwgMHhEMCwgMHg1RSwgMHhDNywgMHgyQiwgMHhBNiwgMHhDNSwgMHhFRSwgMHhDNywgMHg2NCwgMHhDOSwgMHhCRCwKKyAgICAweEFBLCAweDM2LCAweEE5LCAweDYzLCAweEM5LCAweDgwLCAweDU3LCAweDUxLCAweDMyLCAweDAyLCAweDVCLCAweDdBLAorICAgIDB4MkMsIDB4QTMsIDB4MkMsIDB4OUYsIDB4OTMsIDB4RjQsIDB4MzYsIDB4N0MsIDB4NzUsIDB4RDksIDB4RDIsIDB4MDIsCisgICAgMHgwQywgMHg0QywgMHg5OCwgMHg3NiwgMHg3RCwgMHg5NywgMHhGOCwgMHgwMywgMHhEMywgMHg1MywgMHgyNCwgMHhBNCwKKyAgICAweDJFLCAweEE2LCAweENDLCAweDVGLCAweDk4LCAweDhGLCAweDRCLCAweDU4LCAweDcwLCAweEZGLCAweDQxLCAweDk4LAorICAgIDB4QzMsIDB4NzUsIDB4OEEsIDB4MzcsIDB4ODYsIDB4MTAsIDB4QUEsIDB4RDQsIDB4QUMsIDB4QzMsIDB4NEIsIDB4MzUsCisgICAgMHg5OCwgMHhCMCwgMHhFOCwgMHg5OCwgMHhBRSwgMHgzMCwgMHgzRCwgMHg0RiwgMHhBMiwgMHg3MCwgMHhDRCwgMHg5NCwKKyAgICAweDY2LCAweDQ5LCAweEUwLCAweEI4LCAweDE2LCAweEVCLCAweEEzLCAweEYyLCAweEY0LCAweDkxLCAweEE0LCAweDBGLAorICAgIDB4QTMsIDB4NDIsIDB4Q0IsIDB4OTYsIDB4NDMsIDB4MTIsIDB4RUEsIDB4OTMsIDB4MjEsIDB4OUIsIDB4MDIsIDB4NzMsCisgICAgMHhEOCwgMHg2OCwgMHgzOSwgMHhBOSwgMHgxRCwgMHhGQSwgMHg4RCwgMHg1NSwgMHhEMiwgMHhFMywgMHhGMSwgMHg3RCwKKyAgICAweEQxLCAweENELCAweDMzLCAweDYzLCAweDUxLCAweEZDLCAweDE1LCAweDBELCAweENCLCAweEJGLCAweEMwLCAweEU0LAorICAgIDB4M0QsIDB4NDB9OworY29uc3QgdWludDhfdCBnX3poVFdfTG9jYWxlW10gPSB7CisgICAgMHg3OCwgMHg5QywgMHhFRCwgMHg1NywgMHhDRCwgMHg0RiwgMHhENCwgMHg0MCwgMHgxNCwgMHgzRiwgMHg2MywgMHhFMiwKKyAgICAweEZGLCAweDMwLCAweDY5LCAweDIwLCAweEQ1LCAweDA0LCAweEE4LCAweDFFLCAweDIxLCAweEE1LCAweEM5LCAweEM2LAorICAgIDB4NDUsIDB4MzAsIDB4NTgsIDB4NDIsIDB4RUMsIDB4NDYsIDB4MjIsIDB4MTcsIDB4MzMsIDB4REIsIDB4MEUsIDB4REIsCisgICAgMHhDMiwgMHhCNiwgMHg0MywgMHg2NiwgMHhEQiwgMHhDMCwgMHhGNiwgMHgyNCwgMHgxMiwgMHgxNCwgMHgxNCwgMHg2MiwKKyAgICAweEEyLCAweEM0LCAweDhGLCAweDgwLCAweEUxLCAweDY0LCAweDNDLCAweDI4LCAweDg5LCAweDA3LCAweDBGLCAweDJDLAorICAgIDB4NTEsIDB4RkYsIDB4MUEsIDB4NzYsIDB4MzksIDB4RkEsIDB4MkYsIDB4MzgsIDB4RDMsIDB4MkYsIDB4RkEsIDB4QjEsCisgICAgMHhCMywgMHhENCwgMHhDNCwgMHhBMywgMHg3QiwgMHg5QSwgMHhGNywgMHhERSwgMHhFRiwgMHhGNywgMHhFNiwgMHhCRCwKKyAgICAweERGLCAweEJDLCAweDdELCAweEQ5LCAweDk1LCAweDlCLCAweDU4LCAweDg3LCAweDRELCAweDA0LCAweDFDLCAweDY4LAorICAgIDB4QTMsIDB4MjksIDB4QzEsIDB4MzcsIDB4MUYsIDB4RDcsIDB4MTYsIDB4MDUsIDB4NjAsIDB4QTAsIDB4OTYsIDB4M0UsCisgICAgMHgyNSwgMHg5QywgMHg5RiwgMHg5RSwgMHhGNCwgMHhERSwgMHgzRSwgMHhCRiwgMHg3MSwgMHhEMSwgMHhEOSwgMHgzQywKKyAgICAweEZGLCAweEY5LCAweEU2LCAweEY3LCAweDhGLCAweEJELCAweEVFLCAweEFCLCAweDZGLCAweEJELCAweENFLCAweEFGLAorICAgIDB4OUIsIDB4ODIsIDB4NzIsIDB4RkQsIDB4MUEsIDB4MDAsIDB4MzIsIDB4NjMsIDB4MzksIDB4MDYsIDB4MjQsIDB4NUEsCisgICAgMHhEQiwgMHhBRSwgMHhFMywgMHg2NiwgMHgyQiwgMHg0QSwgMHhEMCwgMHgyMCwgMHhBOCwgMHg4MSwgMHg4OSwgMHgwNSwKKyAgICAweDFELCAweDg2LCAweDFBLCAweDAyLCAweEIyLCAweDhELCAweDFELCAweEQ3LCAweDlDLCAweEE3LCAweEExLCAweDE2LAorICAgIDB4QjMsIDB4ODcsIDB4NDIsIDB4NUIsIDB4MzksIDB4M0YsIDB4N0QsIDB4RDIsIDB4M0IsIDB4REEsIDB4OTEsIDB4QTUsCisgICAgMHhEMCwgMHg0QSwgMHgwNywgMHhDRSwgMHhGNiwgMHgzOCwgMHg4MSwgMHhEMywgMHhERCwgMHhGRSwgMHg4MSwgMHhFRSwKKyAgICAweEUxLCAweDIxLCAweDJGLCAweEQ1LCAweDAxLCAweDg3LCAweEIxLCAweDdELCAweEMyLCAweEJCLCAweDYzLCAweDhCLAorICAgIDB4QzcsIDB4RjgsIDB4QzIsIDB4NjEsIDB4NzQsIDB4M0UsIDB4NzIsIDB4MTgsIDB4RkIsIDB4OUIsIDB4REMsIDB4MDAsCisgICAgMHhCNywgMHg3OSwgMHgxNiwgMHhDQiwgMHhGNywgMHgwRiwgMHhBMiwgMHg3MywgMHgyMiwgMHg2MSwgMHg1QSwgMHg1MiwKKyAgICAweDAwLCAweEVCLCAweDc1LCAweDMyLCAweDI1LCAweERDLCAweDE2LCAweEZFLCAweDZCLCAweEZCLCAweDhGLCAweEI0LAorICAgIDB4MzUsIDB4NjAsIDB4M0IsIDB4MzUsIDB4QUMsIDB4RDQsIDB4NTIsIDB4N0EsIDB4RUYsIDB4OEYsIDB4N0IsIDB4NDcsCisgICAgMHhDNywgMHhCRCwgMHg3NywgMHg5RiwgMHg2NCwgMHg4OSwgMHg5OSwgMHgzOSwgMHgzRiwgMHhCRCwgMHhBRiwgMHhCRiwKKyAgICAweEZGLCAweDZDLCAweDhGLCAweDgzLCAweERGLCAweEVELCAweEVCLCAweEE3LCAweDRBLCAweDczLCAweEYyLCAweDFDLAorICAgIDB4RjQsIDB4QzcsIDB4NkYsIDB4OUYsIDB4MjQsIDB4N0UsIDB4MTAsIDB4OUMsIDB4RkEsIDB4MzQsIDB4OTEsIDB4MUIsCisgICAgMHg4RiwgMHg4MCwgMHg1RCwgMHhFOCwgMHhBMywgMHhEOCwgMHg0MSwgMHhCMSwgMHhGNiwgMHg2MiwgMHhENSwgMHhDNSwKKyAgICAweDdBLCAweDhCLCAweDk1LCAweDBFLCAweEFDLCAweEQxLCAweDQ2LCAweEM0LCAweDMyLCAweDJDLCAweDY0LCAweEE3LAorICAgIDB4NTcsIDB4NDMsIDB4RTQsIDB4QTIsIDB4RDcsIDB4QkQsIDB4RTgsIDB4RUUsIDB4QjMsIDB4ODcsIDB4OEEsIDB4MUQsCisgICAgMHhGOSwgMHhGMCwgMHhDQiwgMHg0MiwgMHgxOCwgMHg1QywgMHg5QSwgMHhBOSwgMHg0QiwgMHgxMCwgMHg4MSwgMHhBOSwKKyAgICAweEZDLCAweEQ0LCAweEEyLCAweDM1LCAweDdELCAweEVELCAweDZFLCAweDZGLCAweDc1LCAweDc3LCAweEY3LCAweDY1LAorICAgIDB4ODksIDB4OTksIDB4MzksIDB4N0YsIDB4RTIsIDB4MDQsIDB4QzEsIDB4MjksIDB4RTYsIDB4RDIsIDB4NjUsIDB4MjcsCisgICAgMHhFNSwgMHhCNiwgMHg1RCwgMHhFOCwgMHgzNSwgMHhBMCwgMHg4QiwgMHgxNiwgMHhBMCwgMHhFQiwgMHgyMiwgMHhFMiwKKyAgICAweDI0LCAweEQyLCAweDI3LCAweDlFLCAweDY4LCAweDIxLCAweDJFLCAweDdCLCAweENELCAweEE2LCAweEEwLCAweDNDLAorICAgIDB4QTIsIDB4MUYsIDB4QjEsIDB4REIsIDB4RjksIDB4MkUsIDB4QUEsIDB4MjIsIDB4OUQsIDB4NDEsIDB4QjEsIDB4MkEsCisgICAgMHhEMiwgMHg4NywgMHgxMCwgMHhBNywgMHhFOSwgMHg4NywgMHhFOSwgMHg5MiwgMHg1MCwgMHg3OCwgMHgzOSwgMHg5QSwKKyAgICAweEQ4LCAweDY5LCAweDcwLCAweDcyLCAweDk0LCAweEUyLCAweERCLCAweEM4LCAweDA4LCAweEU5LCAweDkyLCAweDJBLAorICAgIDB4NTUsIDB4NEIsIDB4MzEsIDB4NUEsIDB4MjYsIDB4MjYsIDB4MkUsIDB4OUYsIDB4MDMsIDB4NDAsIDB4QzYsIDB4MTMsCisgICAgMHhDOSwgMHhFMSwgMHg1QSwgMHg3NiwgMHg0RSwgMHg4RSwgMHg5NCwgMHgyNywgMHgyMywgMHg0NywgMHhDNSwgMHgzNCwKKyAgICAweEM1LCAweERFLCAweDg3LCAweEE3LCAweEEyLCAweEFBLCAweDhBLCAweERELCAweDlELCAweDY3LCAweEEyLCAweEE2LAorICAgIDB4ODksIDB4MTcsIDB4OUYsIDB4NUYsIDB4OEIsIDB4NjAsIDB4NDksIDB4OTYsIDB4NTIsIDB4MEMsIDB4NUUsIDB4OEEsCisgICAgMHg1MCwgMHg4RCwgMHhGRSwgMHgyOSwgMHg0QSwgMHgyNSwgMHgwOCwgMHhFNCwgMHhBOCwgMHgwMCwgMHg3MywgMHg1MiwKKyAgICAweDU1LCAweDI3LCAweDM1LCAweEFELCAweDE0LCAweDI1LCAweEQyLCAweDIzLCAweDI0LCAweEU1LCAweDE5LCAweDRDLAorICAgIDB4OEQsIDB4NUMsIDB4RUYsIDB4RDEsIDB4NzAsIDB4RDQsIDB4QTgsIDB4MzcsIDB4OUUsIDB4OTgsIDB4MTksIDB4RTgsCisgICAgMHhBQywgMHhBQywgMHhDRSwgMHhEQSwgMHgyRCwgMHg2RCwgMHhCQSwgMHg3QSwgMHg3NywgMHg3RCwgMHg3MSwgMHhDMywKKyAgICAweDlDLCAweEYzLCAweDk3LCAweDQyLCAweDExLCAweEQzLCAweEEwLCAweDgwLCAweEU5LCAweDc4LCAweDc2LCAweDFELAorICAgIDB4OTEsIDB4QUMsIDB4OTIsIDB4MTksIDB4NUYsIDB4NTQsIDB4MTQsIDB4RjUsIDB4RDEsIDB4OTksIDB4RDcsIDB4MDUsCisgICAgMHhDNSwgMHgxRiwgMHhGNSwgMHhGRCwgMHg4OSwgMHg3MSwgMHhERiwgMHhGNywgMHg2NSwgMHgyOSwgMHg4MywgMHhFMywKKyAgICAweDUzLCAweDc1LCAweDhGLCAweDEwLCAweEU0LCAweEU4LCAweDZELCAweDQxLCAweDE5LCAweDBFLCAweEM5LCAweDEzLAorICAgIDB4MTMsIDB4QTUsIDB4QjksIDB4NkIsIDB4ODgsIDB4RTgsIDB4QzgsIDB4NzEsIDB4QTMsIDB4NkIsIDB4NDcsIDB4OEEsCisgICAgMHgzQywgMHhBNiwgMHg0NywgMHhBMSwgMHg4NywgMHhBNCwgMHhBRiwgMHhDQiwgMHg1NiwgMHg4NywgMHhCMiwgMHhBRSwKKyAgICAweDI4LCAweEJELCAweDgxLCAweDc0LCAweENCLCAweDg2LCAweDc0LCAweDQ4LCAweEM2LCAweEUzLCAweDJDLCAweDYxLAorICAgIDB4OTgsIDB4NEIsIDB4NjgsIDB4MTAsIDB4RUMsIDB4QUQsIDB4NTksIDB4NkMsIDB4MjYsIDB4NDYsIDB4NEIsIDB4MzIsCisgICAgMHg5MiwgMHgwRSwgMHg0NiwgMHg0QSwgMHgxMiwgMHg2QywgMHhDQiwgMHhGMSwgMHg1QSwgMHg4MiwgMHgzMiwgMHg1NiwKKyAgICAweDEyLCAweEVFLCAweDIzLCAweDgyLCAweDA1LCAweEU1LCAweDU2LCAweDAxLCAweDdELCAweDI5LCAweDRDLCAweEU2LAorICAgIDB4QkQsIDB4RTMsIDB4QzcsIDB4QzgsIDB4MjgsIDB4OTMsIDB4NzUsIDB4QzYsIDB4NjMsIDB4MTgsIDB4MTgsIDB4ODIsCisgICAgMHgzMiwgMHg1RiwgMHgxQiwgMHhBNiwgMHgyQiwgMHgyOSwgMHg4MywgMHgxOCwgMHhDMCwgMHhCMiwgMHg1QSwgMHg5OCwKKyAgICAweDFELCAweDA0LCAweEE1LCAweEI2LCAweDU4LCAweEZELCAweDBCLCAweDVBLCAweEZBLCAweDIxLCAweDBBLCAweEE0LAorICAgIDB4NjAsIDB4MjcsIDB4MTYsIDB4RUEsIDB4NjYsIDB4NEIsIDB4QTAsIDB4QkQsIDB4ODYsIDB4OTYsIDB4QTEsIDB4MUUsCisgICAgMHhBRiwgMHhFMCwgMHhEOCwgMHg4QywgMHg3MiwgMHg1NiwgMHgwQywgMHg1QywgMHg0NywgMHg0MCwgMHhBNSwgMHhBRiwKKyAgICAweDA1LCAweDM0LCAweEQ3LCAweDAwLCAweEY3LCAweDA1LCAweEE5LCAweDJGLCAweDRDLCAweDZELCAweEQzLCAweDlGLAorICAgIDB4OTAsIDB4MDYsIDB4NTgsIDB4QTAsIDB4MzIsIDB4NzIsIDB4MDAsIDB4OTYsIDB4NjMsIDB4NjEsIDB4NjcsIDB4MDAsCisgICAgMHhFMCwgMHgwRSwgMHhGNiwgMHg4OCwgMHg4NSwgMHgwOCwgMHhCQiwgMHg4NSwgMHg4MywgMHgwOCwgMHg0QiwgMHg1OSwKKyAgICAweEIwLCAweEFFLCAweDg0LCAweENDLCAweEEyLCAweDNBLCAweDQxLCAweEVCLCAweDAzLCAweDIxLCAweDE1LCAweDAyLAorICAgIDB4RUIsIDB4RjQsIDB4OEIsIDB4MzgsIDB4MDgsIDB4NTIsIDB4MzMsIDB4QTEsIDB4QzUsIDB4MDEsIDB4Q0MsIDB4NjEsCisgICAgMHhERiwgMHg1QiwgMHg4NSwgMHg2MCwgMHgwNiwgMHhCQiwgMHhBNiwgMHhBNSwgMHhCMywgMHg5RSwgMHhDNiwgMHgxRSwKKyAgICAweERFLCAweDAzLCAweEVBLCAweDYwLCAweDMwLCAweDE1LCAweDQwLCAweDM3LCAweDcxLCAweDBDLCAweDdFLCAweDMwLAorICAgIDB4RjAsIDB4NkEsIDB4MEQsIDB4NUYsIDB4MjEsIDB4NzcsIDB4RjQsIDB4MkEsIDB4NkQsIDB4Q0YsIDB4NjksIDB4QUMsCisgICAgMHhFMCwgMHgwMCwgMHgxOSwgMHhERSwgMHgxRSwgMHgyQywgMHhCNiwgMHhENCwgMHg3QiwgMHhDQSwgMHg1MiwgMHhGOCwKKyAgICAweDY3LCAweDQxLCAweEY5LCAweDAzLCAweDExLCAweEMyLCAweDRBLCAweEM5fTsKK2NvbnN0IHVpbnQ4X3QgZ196aEhLX0xvY2FsZVtdID0geworICAgIDB4NzgsIDB4OUMsIDB4QTUsIDB4NTcsIDB4NEQsIDB4NEYsIDB4MTMsIDB4NDEsIDB4MTgsIDB4M0UsIDB4NjMsIDB4RTIsCisgICAgMHg3RiwgMHg5OCwgMHg2QywgMHgyMCwgMHgwQiwgMHgwOSwgMHg1MCwgMHg4QSwgMHg5RiwgMHgyNSwgMHhDQiwgMHgyNiwKKyAgICAweDQ0LCAweDkwLCAweDlBLCAweDVBLCAweDQzLCAweDJDLCAweEQxLCAweEM4LCAweEM1LCAweDZDLCAweDc3LCAweDg3LAorICAgIDB4RUUsIDB4NDIsIDB4NzcsIDB4ODcsIDB4NEMsIDB4QjcsIDB4QzEsIDB4NkUsIDB4M0MsIDB4ODgsIDB4MDQsIDB4QTUsCisgICAgMHg1QSwgMHgyRSwgMHg0QSwgMHg1NCwgMHgwMiwgMHg4NiwgMHg3OCwgMHg1MCwgMHgwRiwgMHg0OCwgMHhCQywgMHg3OCwKKyAgICAweDY4LCAweDg5LCAweEM2LCAweDNGLCAweDQzLCAweDhCLCAweDlFLCAweEZDLCAweDBCLCAweENFLCAweEVDLCAweDE3LAorICAgIDB4RkIsIDB4MzUsIDB4NkQsIDB4OEQsIDB4M0QsIDB4Q0QsIDB4RkIsIDB4QkMsIDB4Q0YsIDB4RjMsIDB4Q0UsIDB4RkIsCisgICAgMHgzRSwgMHgzMywgMHgzQiwgMHgwMSwgMHhBMSwgMHg4QywgMHg2NCwgMHhBOSwgMHgwQywgMHg4MSwgMHgyMSwgMHhFOSwKKyAgICAweDcwLCAweDlBLCAweEIzLCAweEQ0LCAweDg3LCAweEQ5LCAweDFDLCAweDA3LCAweDE0LCAweDU4LCAweDkxLCAweEE3LAorICAgIDB4QjksIDB4RDMsIDB4RTYsIDB4NzEsIDB4RTcsIDB4Q0QsIDB4RjMsIDB4RTEsIDB4QjMsIDB4RDYsIDB4QzYsIDB4RTksCisgICAgMHg4RiwgMHhENywgMHg3RiwgMHhCRSwgMHgzNywgMHg3RSwgMHg3RiwgMHhEQSwgMHhFQiwgMHgzNCwgMHhCRiwgMHg5RSwKKyAgICAweEQ1LCAweDVCLCAweEVELCAweEVELCAweEEzLCAweDVGLCAweDFGLCAweDFBLCAweDlELCAweERELCAweDlGLCAweEVELAorICAgIDB4QzYsIDB4QzksIDB4MDgsIDB4MjcsIDB4NUUsIDB4QkMsIDB4MDAsIDB4ODAsIDB4NDAsIDB4OEIsIDB4MTgsIDB4OEEsCisgICAgMHg4NCwgMHgwQiwgMHgzNSwgMHhCRCwgMHg4OCwgMHhDQSwgMHgxNSwgMHhCNywgMHg1RSwgMHgwOSwgMHhDMywgMHgxMiwKKyAgICAweEMyLCAweDlBLCAweDY0LCAweDUwLCAweEQ2LCAweDAwLCAweDEwLCAweDc0LCAweDY0LCAweDk4LCAweEVBLCAweDFELAorICAgIDB4OTIsIDB4QUEsIDB4RDAsIDB4NzgsIDB4QzAsIDB4ODksIDB4QzUsIDB4RDMsIDB4RTYsIDB4OTMsIDB4Q0UsIDB4QzEsCisgICAgMHhCNiwgMHg5MCwgMHg3MiwgMHhBMiwgMHg2MCwgMHhFMiwgMHhBNCwgMHhDMSwgMHg0OCwgMHgzNCwgMHhFQiwgMHhDOSwKKyAgICAweDg5LCAweEY2LCAweEZFLCAweDNFLCAweEFCLCAweEQ0LCAweDJFLCAweDQzLCAweEIxLCAweDc1LCAweENDLCAweERBLAorICAgIDB4NjMsIDB4OTMsIDB4QTUsIDB4MzgsIDB4NjIsIDB4MjgsIDB4NUEsIDB4RUYsIDB4MTksIDB4OEEsIDB4OUQsIDB4MEQsCisgICAgMHg2NiwgMHg4MiwgMHgzOSwgMHgzQywgMHhDRCwgMHg0NSwgMHhFNywgMHgwNywgMHhFRSwgMHhEQSwgMHhCNywgMHgzMCwKKyAgICAweDY4LCAweDI5LCAweDkwLCAweDhBLCAweDQ1LCAweDNDLCAweENELCAweEE1LCAweEI5LCAweDYwLCAweDk1LCAweDc0LAorICAgIDB4NzIsIDB4RjEsIDB4QzksIDB4NjQsIDB4RjgsIDB4NTIsIDB4MzIsIDB4N0MsIDB4MzksIDB4MTksIDB4QkUsIDB4OTIsCisgICAgMHgwQywgMHg1RiwgMHg0RCwgMHg4NiwgMHhBRiwgMHgyNSwgMHhDMywgMHhENywgMHg5MywgMHhFMSwgMHg0QywgMHgzMiwKKyAgICAweDlDLCAweDlFLCAweDYwLCAweEUwLCAweDhDLCAweDM5LCAweEQzLCAweDkzLCAweDNELCAweDBELCAweDU0LCAweEE0LAorICAgIDB4NUEsIDB4RTAsIDB4NDYsIDB4OTIsIDB4NDgsIDB4RUMsIDB4QkMsIDB4M0IsIDB4RUMsIDB4MUMsIDB4MUMsIDB4NzYsCisgICAgMHhERSwgMHg3RSwgMHgxNCwgMHg1MiwgMHgzNCwgMHg4QywgMHhFMCwgMHhFNCwgMHhDMCwgMHg5MiwgMHhGMSwgMHg5MywKKyAgICAweDA2LCAweDgzLCAweDVGLCAweDRGLCAweEM0LCAweEM5LCAweDU1LCAweDY1LCAweEQ0LCAweEQ5LCAweDRELCAweEU2LAorICAgIDB4NkYsIDB4MUQsIDB4RkIsIDB4MzgsIDB4QjAsIDB4NTcsIDB4MDksIDB4NDMsIDB4NDQsIDB4RUUsIDB4ODAsIDB4QUQsCisgICAgMHg4RSwgMHhDRCwgMHgxMSwgMHg5RiwgMHgyMCwgMHhERSwgMHg3QiwgMHhCQywgMHhFQiwgMHg3OCwgMHhCRiwgMHhGMSwKKyAgICAweDRFLCAweEJCLCAweEY2LCAweEE4LCAweDQzLCAweEFDLCAweDI5LCAweDFBLCAweEQ0LCAweDgzLCAweERGLCAweEJGLAorICAgIDB4MEIsIDB4OTEsIDB4RUQsIDB4NUUsIDB4QjQsIDB4NzcsIDB4RTgsIDB4NDEsIDB4NzksIDB4NDAsIDB4MzQsIDB4RkQsCisgICAgMHgzMiwgMHg5NiwgMHgwNiwgMHhFNywgMHg2MSwgMHg2MCwgMHgxMywgMHg4OCwgMHhBNSwgMHg0MCwgMHg3RCwgMHgxMiwKKyAgICAweDkxLCAweDlFLCAweEJFLCAweEI0LCAweEI3LCAweDM2LCAweERCLCAweEY1LCAweDFELCAweDIxLCAweDQ1LCAweEMzLAorICAgIDB4MDgsIDB4RUUsIDB4ODMsIDB4QzAsIDB4NUUsIDB4NzksIDB4NUEsIDB4RjIsIDB4QTIsIDB4QTUsIDB4MjIsIDB4NEYsCisgICAgMHg5QSwgMHg4MywgMHgyQSwgMHg5MiwgMHgwOSwgMHgxNywgMHgyNCwgMHhEMywgMHg4NCwgMHhEOCwgMHhGMCwgMHhBRCwKKyAgICAweEY3LCAweDExLCAweEY3LCAweEQ1LCAweDVCLCAweEFFLCAweDk2LCAweENCLCAweDlDLCAweEY4LCAweDgwLCAweEZDLAorICAgIDB4RjgsIDB4NzYsIDB4RUIsIDB4MUIsIDB4OUYsIDB4RTcsIDB4QzksIDB4MUQsIDB4RTQsIDB4NjcsIDB4NzksIDB4NzIsCisgICAgMHgxMCwgMHgzQywgMHg5OCwgMHgyMywgMHgzRiwgMHg2QSwgMHg4QywgMHhBRiwgMHg2MSwgMHgxNSwgMHgyOSwgMHgyMywKKyAgICAweEEzLCAweEM0LCAweDI4LCAweEQyLCAweDk3LCAweDVFLCAweDg3LCAweENBLCAweEZGLCAweEM4LCAweDJCLCAweDJBLAorICAgIDB4QzIsIDB4MjYsIDB4MkQsIDB4RDAsIDB4NTMsIDB4MEUsIDB4NDAsIDB4MDgsIDB4NzEsIDB4N0QsIDB4MzIsIDB4MzUsCisgICAgMHgzRCwgMHhFMiwgMHg1MywgMHgwMCwgMHgwOSwgMHhGOSwgMHgzNCwgMHhBMywgMHhBQSwgMHg3QywgMHg2NywgMHhFRiwKKyAgICAweDI5LCAweDlGLCAweENGLCAweEYzLCAweEVELCAweEVELCAweDY3LCAweDdDLCAweEExLCAweEMwLCAweDlGLCAweDdELAorICAgIDB4N0UsIDB4QzUsIDB4ODMsIDB4MjUsIDB4MjEsIDB4MTUsIDB4NTAsIDB4QjAsIDB4NEEsIDB4MzgsIDB4MkUsIDB4MjUsCisgICAgMHg5NywgMHhFOCwgMHhBQiwgMHg4MCwgMHg2RCwgMHgxMywgMHhEMSwgMHg0RiwgMHhFNSwgMHhGMywgMHg1MywgMHg4NSwKKyAgICAweDQyLCAweDVGLCAweDEyLCAweEQ3LCAweDlBLCAweDE5LCAweEFBLCAweDg5LCAweDBBLCAweEE4LCAweDE5LCAweDkxLAorICAgIDB4RDEsIDB4REQsIDB4NEIsIDB4QjMsIDB4NDgsIDB4NTAsIDB4RUYsIDB4MjYsIDB4Q0QsIDB4NEIsIDB4QzYsIDB4Q0EsCisgICAgMHg2QSwgMHg1NiwgMHhBRiwgMHgxNCwgMHhFNiwgMHg2NiwgMHg2RiwgMHhBRSwgMHhERiwgMHg3RiwgMHhBNCwgMHhFNiwKKyAgICAweEFDLCAweDI1LCAweEM3LCAweEMzLCAweDIwLCAweEM5LCAweDU2LCAweDFBLCAweDU1LCAweEJELCAweDA4LCAweDcxLAorICAgIDB4RDgsIDB4QzgsIDB4MTAsIDB4RTYsIDB4RjYsIDB4NDQsIDB4MzAsIDB4RjIsIDB4MkQsIDB4QzgsIDB4OUMsIDB4NjgsCisgICAgMHg4RCwgMHg1QSwgMHg1NiwgMHg2NiwgMHhEQywgMHhCMiwgMHgyQywgMHgyMSwgMHgxNSwgMHhFMiwgMHhCMSwgMHhBNSwKKyAgICAweDcyLCAweDE1LCAweDYzLCAweDY4LCAweEM4LCAweDM1LCAweDRFLCAweDFDLCAweDc0LCAweEM0LCAweDk5LCAweENDLAorICAgIDB4RTMsIDB4NjEsIDB4N0YsIDB4MzksIDB4RDIsIDB4NzcsIDB4OUQsIDB4MzUsIDB4ODgsIDB4NjUsIDB4NjgsIDB4OTgsCisgICAgMHg2RSwgMHgwQiwgMHg0MywgMHg3MSwgMHgxRCwgMHhGNSwgMHgyNiwgMHgzNiwgMHg4RiwgMHgzRiwgMHhFMywgMHhGOSwKKyAgICAweEQ4LCAweDAzLCAweDYxLCAweEM4LCAweDJELCAweEFGLCAweDQwLCAweDU5LCAweEQzLCAweDI1LCAweDcyLCAweDVGLAorICAgIDB4QzYsIDB4QkQsIDB4MkEsIDB4NEUsIDB4OUEsIDB4MjksIDB4MjgsIDB4NjEsIDB4NTQsIDB4NUQsIDB4RDMsIDB4RTgsCisgICAgMHhGNSwgMHgxOCwgMHhFRCwgMHg1MywgMHhFMSwgMHg0RiwgMHgzMCwgMHhENCwgMHhBNywgMHg0MCwgMHhENywgMHg4QywKKyAgICAweDZBLCAweDg1LCAweDEzLCAweEM3LCAweEZBLCAweEE0LCAweDVCLCAweDEwLCAweDIzLCAweDRFLCAweDlDLCAweDg4LAorICAgIDB4QjEsIDB4Q0YsIDB4OEQsIDB4MDksIDB4OUQsIDB4QkQsIDB4NzcsIDB4MzAsIDB4MjEsIDB4NjcsIDB4QzIsIDB4QTAsCisgICAgMHg3NywgMHgyMywgMHhFRCwgMHg4MCwgMHgxMywgMHhCMywgMHhCOSwgMHg0MSwgMHhGMiwgMHg2QywgMHg4NSwgMHgxOCwKKyAgICAweDVELCAweDU0LCAweDVBLCAweDA1LCAweEQxLCAweDA1LCAweDk1LCAweENELCAweEZFLCAweDgzLCAweDJDLCAweDc4LAorICAgIDB4MTAsIDB4MzEsIDB4OTEsIDB4RkQsIDB4NkUsIDB4QzYsIDB4RkEsIDB4QTYsIDB4RUYsIDB4NDEsIDB4NkQsIDB4MEQsCisgICAgMHgyRSwgMHg0QiwgMHhCMiwgMHhGNywgMHg0QywgMHg3QiwgMHhBMSwgMHg1QiwgMHg3MywgMHg0NiwgMHg0MSwgMHg0NSwKKyAgICAweDA4LCAweEYyLCAweEU0LCAweEI0LCAweDQwLCAweEMxLCAweDU0LCAweEMwLCAweDZELCAweDJFLCAweDk1LCAweDQ4LAorICAgIDB4Q0IsIDB4RDcsIDB4QzgsIDB4REYsIDB4OTIsIDB4MEEsIDB4NTgsIDB4MjAsIDB4MzYsIDB4MzIsIDB4MDgsIDB4OUEsCisgICAgMHhBMSwgMHgyMSwgMHhBMywgMHgwQiwgMHhFMSwgMHgwNiwgMHhBQSwgMHg2MiwgMHgwRCwgMHg2MiwgMHhCQSwgMHgwQiwKKyAgICAweDgzLCAweEUxLCAweEI0LCAweEIyLCAweEEwLCAweEY1LCAweEE0LCAweDY0LCAweDYxLCAweDExLCAweEMzLCAweEY1LAorICAgIDB4QUUsIDB4OTQsIDB4MTksIDB4MkMsIDB4MTUsIDB4QzksIDB4NDcsIDB4RDksIDB4OEQsIDB4QjIsIDB4QTgsIDB4NEEsCisgICAgMHgxQSwgMHg4MywgMHg5MCwgMHg0MywgMHg1NiwgMHg3NSwgMHg1NSwgMHgwMiwgMHhGMywgMHhDOCwgMHg1NCwgMHgzNSwKKyAgICAweDk5LCAweENFLCAweDM0LCAweDc2LCAweEVGLCAweDE2LCAweEM4LCAweDc3LCAweDI3LCAweDEzLCAweDAzLCAweDY0LAorICAgIDB4MTUsIDB4NzksIDB4RTQsIDB4QkIsIDB4NUQsIDB4QjcsIDB4MkUsIDB4QTAsIDB4MUUsIDB4NzYsIDB4QkIsIDB4QTcsCisgICAgMHg1MiwgMHhBQiwgMHgxQSwgMHhBNSwgMHgxNSwgMHg2NCwgMHgzMywgMHg5RCwgMHhERCwgMHhFRCwgMHg0NywgMHgyRSwKKyAgICAweDcwLCAweDlFLCAweDQyLCAweENBLCAweEY5LCAweDI3LCAweDQyLCAweEZDLCAweDBCLCAweEQ5LCAweDBFLCAweDRCLAorICAgIDB4RUR9OworY29uc3QgdWludDhfdCBnX2phSlBfTG9jYWxlW10gPSB7CisgICAgMHg3OCwgMHg5QywgMHhFRCwgMHg1NiwgMHhDQiwgMHg2RSwgMHhEMywgMHg0MCwgMHgxNCwgMHg1RCwgMHgxNywgMHg4OSwKKyAgICAweDdGLCAweDE4LCAweDU5LCAweDIwLCAweDgzLCAweEQ0LCAweEQ2LCAweDBELCAweEVGLCAweDU2LCAweEFFLCAweEE1LAorICAgIDB4OEEsIDB4OTYsIDB4ODYsIDB4MTYsIDB4QTMsIDB4MDgsIDB4NTcsIDB4QTAsIDB4NzYsIDB4ODMsIDB4MjYsIDB4RjYsCisgICAgMHgzNCwgMHg5OSwgMHgzNiwgMHg5RSwgMHhBOSwgMHgyNiwgMHhCNiwgMHg0QSwgMHhCQywgMHhFMiwgMHgyMSwgMHgyMCwKKyAgICAweDQ4LCAweDc0LCAweDAxLCAweDFCLCAweDA0LCAweDQ0LCAweDYyLCAweDU1LCAweDQwLCAweDAyLCAweDA0LCAweDhCLAorICAgIDB4NkUsIDB4RDgsIDB4RDAsIDB4QUYsIDB4NDksIDB4NUEsIDB4NTYsIDB4RkMsIDB4MDIsIDB4MzMsIDB4N0UsIDB4QzUsCisgICAgMHg4RSwgMHhFRCwgMHhFMCwgMHhFRSwgMHhGMSwgMHgyMiwgMHg5OSwgMHg3QiwgMHg3QywgMHhDRSwgMHhGNSwgMHhCRCwKKyAgICAweEU3LCAweDhFLCAweDQ3LCAweDU2LCAweDVCLCAweEQ0LCAweDg0LCAweDJELCAweDA0LCAweDA4LCAweEI0LCAweEQxLAorICAgIDB4QkMsIDB4QjQsIDB4MDUsIDB4RUYsIDB4QUYsIDB4RDQsIDB4MjQsIDB4NjAsIDB4QTEsIDB4QjYsIDB4MzksIDB4MkYsCisgICAgMHgwRCwgMHhERSwgMHhFQywgMHgxRiwgMHg3RiwgMHhGRiwgMHg3NiwgMHg4RSwgMHhGRiwgMHgwRCwgMHg3QSwgMHg1RiwKKyAgICAweENGLCAweDRCLCAweERBLCAweEU5LCAweDUzLCAweDAwLCAweEE4LCAweDgyLCAweDRDLCAweDJDLCAweEM4LCAweDhDLAorICAgIDB4OEUsIDB4NUQsIDB4QTcsIDB4QUQsIDB4NzYsIDB4QTgsIDB4NkIsIDB4MzAsIDB4RDQsIDB4QTAsIDB4MEMsIDB4NDMsCisgICAgMHgyMiwgMHg1OCwgMHgxMywgMHg0MCwgMHhCNSwgMHgyOSwgMHg3MSwgMHg5QSwgMHhCNywgMHhGOSwgMHhBRCwgMHhCNiwKKyAgICAweDg4LCAweDI3LCAweDgyLCAweDU4LCAweEFCLCAweDBDLCAweDdBLCAweDVELCAweDU1LCAweDA5LCAweEQ2LCAweDA5LAorICAgIDB4RjgsIDB4NDIsIDB4M0UsIDB4N0MsIDB4MzEsIDB4MUYsIDB4QkUsIDB4OTQsIDB4MEYsIDB4NUYsIDB4Q0UsIDB4ODcsCisgICAgMHhBRiwgMHhFNCwgMHhDMywgMHg1NywgMHhGMywgMHhFMSwgMHg2QiwgMHhGOSwgMHhGMCwgMHg2QywgMHgzRSwgMHg1QywKKyAgICAweDk5LCAweDI5LCAweEMwLCAweDBCLCAweEZBLCAweEFDLCAweDhDLCAweDM0LCAweDBBLCAweEMyLCAweDc1LCAweEVDLAorICAgIDB4NTMsIDB4RDIsIDB4MzcsIDB4MDAsIDB4RUIsIDB4NzUsIDB4MzYsIDB4MkYsIDB4NTUsIDB4QTQsIDB4RkYsIDB4MDYsCisgICAgMHg5RSwgMHhDNCwgMHg0MCwgMHgwQiwgMHg3NiwgMHgxMiwgMHhEQiwgMHg4RSwgMHg0NywgMHg5QSwgMHhEOCwgMHhCRSwKKyAgICAweEVGLCAweDdCLCAweEZDLCAweDU3LCAweDU1LCAweDQ0LCAweDM4LCAweEM0LCAweDdCLCAweERELCAweDVDLCAweEZDLAorICAgIDB4RTgsIDB4RDEsIDB4OTcsIDB4N0MsIDB4RkUsIDB4OEYsIDB4ODMsIDB4ODIsIDB4M0MsIDB4OUYsIDB4NzMsIDB4RjEsCisgICAgMHhERiwgMHhDRiwgMHg1RiwgMHhFNSwgMHhFMiwgMHhGRCwgMHhERSwgMHg4NywgMHgxMSwgMHgxQywgMHhGOCwgMHhBQiwKKyAgICAweDlDLCAweDI2LCAweDQ2LCAweEY2LCAweDQwLCAweEQ4LCAweDRELCAweEI2LCAweDhGLCAweDZDLCAweDA3LCAweEQ5LAorICAgIDB4REEsIDB4QjMsIDB4NTUsIDB4NjcsIDB4RUIsIDB4Q0QsIDB4NTYsIDB4NUEsIDB4NUMsIDB4QTMsIDB4OEQsIDB4MTgsCisgICAgMHhCNiwgMHgzMCwgMHhCMiwgMHg5MywgMHgyRiwgMHg3OSwgMHgwOCwgMHg2OSwgMHhGRCwgMHhCRCwgMHg2RSwgMHhGRiwKKyAgICAweEM1LCAweDFFLCAweDFGLCAweDRFLCAweDA0LCAweDY0LCAweDZGLCAweEZGLCAweDdBLCAweDk5LCAweEJFLCAweDBELAorICAgIDB4ODYsIDB4NjEsIDB4RTIsIDB4MjEsIDB4ODgsIDB4QzEsIDB4NDQsIDB4N0UsIDB4MUUsIDB4NjksIDB4NDcsIDB4MDcsCisgICAgMHgwRiwgMHhGQiwgMHg0RiwgMHg5RiwgMHhGOCwgMHhEOSwgMHg0NSwgMHgxOCwgMHhFMywgMHhDNywgMHhGQiwgMHg4NywKKyAgICAweDgzLCAweDc3LCAweDFGLCAweDYzLCAweDEwLCAweEY4LCAweEFCLCAweDQ4LCAweENCLCAweDhGLCAweDJELCAweDY1LAorICAgIDB4RTQsIDB4REMsIDB4MEEsIDB4NTAsIDB4MEIsIDB4M0EsIDB4QTgsIDB4MDYsIDB4MUQsIDB4MDcsIDB4MzEsIDB4MTIsCisgICAgMHg1QiwgMHgxRiwgMHgyMywgMHhFMSwgMHhEMSwgMHhCNiwgMHhFOSwgMHhCNiwgMHg1QSwgMHg5MiwgMHhCNiwgMHhDRSwKKyAgICAweDJGLCAweEI5LCAweEZGLCAweEYzLCAweDQwLCAweEQ2LCAweDY1LCAweDZFLCAweEI4LCAweEJDLCAweDI4LCAweEYzLAorICAgIDB4NDEsIDB4QzgsIDB4NEIsIDB4RkMsIDB4MTIsIDB4QkUsIDB4QzQsIDB4OTIsIDB4QTIsIDB4MUMsIDB4MkQsIDB4NEEsCisgICAgMHgxQSwgMHgwNSwgMHgzOSwgMHg0QSwgMHhFOSwgMHg2RCwgMHg2NCwgMHgwNSwgMHg3MiwgMHg0NSwgMHhENywgMHg5NSwKKyAgICAweEM1LCAweEM1LCAweDUyLCAweDlBLCAweDc2LCAweDkzLCAweDMyLCAweDQ3LCAweEE4LCAweEYyLCAweDM1LCAweDAwLAorICAgIDB4QTQsIDB4OTAsIDB4RDAsIDB4MTAsIDB4MDcsIDB4REIsIDB4MjMsIDB4ODYsIDB4MjQsIDB4OTAsIDB4OTQsIDB4MjEsCisgICAgMHg1NSwgMHg3OSwgMHhGMCwgMHhGNiwgMHhCMSwgMHhBQywgMHhFQiwgMHg3MiwgMHhCRiwgMHhGQiwgMHg0QywgMHgzNiwKKyAgICAweDBDLCAweEY5LCAweEU4LCAweEQzLCAweDZCLCAweDc5LCAweDQzLCAweDU1LCAweDEyLCAweEY0LCAweDIyLCAweDdELAorICAgIDB4NjAsIDB4NDYsIDB4NzUsIDB4NEUsIDB4RDcsIDB4RTcsIDB4MEMsIDB4NjMsIDB4QUUsIDB4OUMsIDB4QzYsIDB4MzcsCisgICAgMHgyMCwgMHg5NCwgMHg5NCwgMHgxMiwgMHg4NCwgMHhERCwgMHgwQiwgMHhDOSwgMHgyOCwgMHg1RiwgMHg3NCwgMHgzRSwKKyAgICAweEQyLCAweDY3LCAweEI4LCAweDE1LCAweEQ2LCAweDM4LCAweDFBLCAweEVELCAweDhGLCAweDY1LCAweDQ4LCAweEI2LAorICAgIDB4QjYsIDB4QUIsIDB4NzYsIDB4REIsIDB4NTgsIDB4NUEsIDB4QkMsIDB4QjEsIDB4N0IsIDB4RUYsIDB4NDEsIDB4NzMsCisgICAgMHhENSwgMHhEQiwgMHgwOCwgMHgwQywgMHg0QiwgMHg5MiwgMHg3QywgMHgyNSwgMHg3MSwgMHhFRCwgMHgzQSwgMHg2MiwKKyAgICAweDY5LCAweEQ3LCAweDUyLCAweDU4LCAweDU4LCAweDEyLCAweEM3LCAweEY4LCAweDBFLCAweDM3LCAweDI1LCAweENELAorICAgIDB4OUIsIDB4RjQsIDB4QkMsIDB4RDksIDB4NjksIDB4Q0YsIDB4RjMsIDB4NTQsIDB4MjUsIDB4QzUsIDB4MkIsIDB4OTYsCisgICAgMHg5QSwgMHgyRSwgMHg2MywgMHg4OCwgMHg5OCwgMHgxRCwgMHg0OSwgMHgzQiwgMHhFMywgMHg4QiwgMHg0QiwgMHgwQiwKKyAgICAweDc3LCAweDEwLCAweDMzLCAweDExLCAweDcxLCAweEMyLCAweDY3LCAweDlFLCAweENELCAweEVBLCAweDg0LCAweDE5LAorICAgIDB4OTksIDB4MDYsIDB4RTIsIDB4QTYsIDB4ODYsIDB4N0QsIDB4NEUsIDB4QTQsIDB4QTEsIDB4MzAsIDB4QkQsIDB4ODUsCisgICAgMHg0QywgMHg2QywgMHg0MywgMHhCRSwgMHgxQiwgMHhBNiwgMHhBMywgMHgyQywgMHhDMSwgMHhFRCwgMHg0MiwgMHg0MSwKKyAgICAweDgzLCAweDUxLCAweDc3LCAweDA3LCAweDhCLCAweEY5LCAweDRGLCAweDk2LCAweDU0LCAweEM0LCAweDFELCAweDlDLAorICAgIDB4MkQsIDB4MjksIDB4QjAsIDB4MzEsIDB4NzEsIDB4REIsIDB4OTIsIDB4MzYsIDB4NTUsIDB4OTIsIDB4RUUsIDB4MjEsCisgICAgMHg0NiwgMHgyNSwgMHg2RCwgMHgyNiwgMHhDMywgMHgxRSwgMHgxQSwgMHg5MywgMHgxQSwgMHg3NiwgMHgzNCwgMHg4OSwKKyAgICAweDk0LCAweDMzLCAweDY5LCAweDMwLCAweERBLCAweDgxLCAweDdFLCAweDIwLCAweDY5LCAweDdGLCAweDBFLCAweEY5LAorICAgIDB4ODksIDB4OUQsIDB4NjYsIDB4OEMsIDB4NTEsIDB4RTEsIDB4MzYsIDB4MTUsIDB4MEIsIDB4NDksIDB4NUIsIDB4QTksCisgICAgMHhBRCwgMHg5RiwgMHg0MCwgMHg5NiwgMHgxQywgMHg0NCwgMHg0NiwgMHhFNCwgMHgxRiwgMHg3RiwgMHg5OSwgMHhCQSwKKyAgICAweEM1LCAweERCLCAweERFLCAweEQ5LCAweDQxLCAweDlCLCAweEQwLCAweDhDLCAweDRFLCAweERCLCAweDI4LCAweDBDLAorICAgIDB4NzMsIDB4QUUsIDB4NTIsIDB4Q0YsIDB4REQsIDB4ODYsIDB4NjAsIDB4OTksIDB4M0EsIDB4NEQsIDB4NkMsIDB4ODIsCisgICAgMHgxQSwgMHhBMywgMHg1MywgMHg3NywgMHg2RiwgMHgwMiwgMHg1RCwgMHg1MiwgMHhDNiwgMHg5MSwgMHg3NSwgMHg0QywKKyAgICAweENDLCAweDI2LCAweDhELCAweEM4LCAweDc3LCAweDBBLCAweEM4LCAweDdBLCAweDg3LCAweDdGLCAweDJBLCAweDVBLAorICAgIDB4ODIsIDB4NTUsIDB4NDQsIDB4QzAsIDB4MDQsIDB4NTMsIDB4MzIsIDB4ODYsIDB4NzAsIDB4OUQsIDB4QkEsIDB4MEMsCisgICAgMHgyMywgMHgwNiwgMHgwQywgMHhDNywgMHgyQSwgMHg2MCwgMHgyQywgMHg1OCwgMHhCNCwgMHg4RSwgMHg0MCwgMHgwRCwKKyAgICAweEZGLCAweDkzLCAweDUyLCAweDQ1LCAweDc1LCAweDg2LCAweDc2LCAweEM3LCAweDUyLCAweDE2LCAweDE4LCAweEFDLAorICAgIDB4RjMsIDB4MTcsIDB4NzcsIDB4MUMsIDB4NjUsIDB4QUQsIDB4MDksIDB4RjEsIDB4NTgsIDB4MDIsIDB4NkYsIDB4QTksCisgICAgMHgyMSwgMHg2QSwgMHgwMSwgMHhCNywgMHhDNiwgMHhEMiwgMHgwQywgMHg1QSwgMHg4QSwgMHhBNiwgMHg3NywgMHg1QywKKyAgICAweEQyLCAweEQ4LCAweEEyLCAweDNFLCAweDMzLCAweDE4LCAweDg5LCAweDdGLCAweEFBLCAweDI1LCAweEU2LCAweEE5LAorICAgIDB4MkEsIDB4QzEsIDB4ODcsIDB4QkQsIDB4RjYsIDB4MTcsIDB4NkMsIDB4NDIsIDB4MDgsIDB4MjF9OworY29uc3QgdWludDhfdCBnX2tvS1JfTG9jYWxlW10gPSB7CisgICAgMHg3OCwgMHg5QywgMHhFRCwgMHg1NiwgMHg0RCwgMHg2QiwgMHhENCwgMHg0MCwgMHgxOCwgMHgzRSwgMHg1NywgMHhGMCwKKyAgICAweDNGLCAweDBDLCAweEMxLCAweDEyLCAweDg1LCAweDc2LCAweEI3LCAweEVCLCAweDc3LCAweDRCLCAweDFBLCAweDI4LAorICAgIDB4NkUsIDB4NkQsIDB4NjUsIDB4OEQsIDB4OTQsIDB4QTYsIDB4NTgsIDB4RUMsIDB4NDUsIDB4NjYsIDB4OTMsIDB4RTksCisgICAgMHgyNiwgMHhFRCwgMHgyNiwgMHg1MywgMHgyNiwgMHgwOSwgMHg3NSwgMHg3MywgMHhBRSwgMHg1MiwgMHhGMCwgMHhFMiwKKyAgICAweEExLCAweDg3LCAweEVBLCAweDZFLCAweEIxLCAweDA3LCAweDExLCAweDJBLCAweDg4LCAweDIyLCAweDIyLCAweDFFLAorICAgIDB4MTQsIDB4N0YsIDB4OEQsIDB4NjIsIDB4NkQsIDB4OEEsIDB4N0YsIDB4QzEsIDB4QzksIDB4RTcsIDB4RTYsIDB4NjMsCisgICAgMHhCMiwgMHg0RCwgMHhFRiwgMHhFRSwgMHg2MSwgMHg5OSwgMHhGNywgMHg5OSwgMHhFNywgMHg3OSwgMHhGMywgMHhCRSwKKyAgICAweENGLCAweDRDLCAweDVFLCAweDIyLCAweDc0LCAweEIxLCAweDAyLCAweEJCLCAweDA4LCAweDk4LCAweEQwLCAweDQwLAorICAgIDB4QjMsIDB4REMsIDB4MjYsIDB4N0UsIDB4REMsIDB4NUEsIDB4RTYsIDB4ODAsIDB4OEEsIDB4MkMsIDB4NjUsIDB4OTYsCisgICAgMHhGQiwgMHgzNSwgMHgzOCwgMHgzOCwgMHhGRSwgMHgzNCwgMHhGOCwgMHhGRCwgMHhFMSwgMHhGRCwgMHhFNSwgMHhFMywKKyAgICAweEQ3LCAweDQ3LCAweDNGLCAweEZCLCAweERGLCAweEFGLCAweDcwLCAweEUyLCAweEM1LCAweDBCLCAweDAwLCAweDA4LAorICAgIDB4M0UsIDB4REYsIDB4NTQsIDB4MjEsIDB4OTEsIDB4N0IsIDB4NDYsIDB4MUIsIDB4NzcsIDB4QUQsIDB4NDgsIDB4REEsCisgICAgMHgyMSwgMHhBOCwgMHg4MywgMHg4OSwgMHgwRSwgMHg0RCwgMHg5RiwgMHgzNSwgMHgwNiwgMHgwNCwgMHgwMywgMHg5QiwKKyAgICAweEI2LCAweEY2LCAweDgwLCAweDZFLCAweDU5LCAweDdFLCAweDNDLCAweDE2LCAweEM2LCAweDYyLCAweEMzLCAweEVCLAorICAgIDB4RUYsIDB4MDksIDB4RjUsIDB4NzAsIDB4OUQsIDB4ODIsIDB4QUYsIDB4QjIsIDB4RTEsIDB4NkIsIDB4NkMsIDB4RjgsCisgICAgMHgzQSwgMHgxQiwgMHhCRSwgMHhDMSwgMHg4NiwgMHg2RiwgMHhCMiwgMHhFMSwgMHg1QiwgMHg2QywgMHhGOCwgMHgzNiwKKyAgICAweDFCLCAweDlFLCAweDY2LCAweEMzLCAweDhELCAweEE5LCAweDEyLCAweEJDLCAweEE0LCAweENGLCAweDQ2LCAweEFFLAorICAgIDB4NTEsIDB4MTAsIDB4QUQsIDB4MTMsIDB4OUYsIDB4RDIsIDB4QkUsIDB4MDEsIDB4RDgsIDB4NkUsIDB4OTMsIDB4NTksCisgICAgMHhBRSwgMHhDMSwgMHhGRCwgMHgzNywgMHhGMCwgMHgzQywgMHgwNiwgMHhBQSwgMHhCMCwgMHg5NywgMHhCQSwgMHg3NiwKKyAgICAweDM0LCAweDEyLCAweEJELCAweDgzLCAweDZGLCAweERFLCAweEFCLCAweDNELCAweEZBLCAweDJGLCAweEQ0LCAweEZELAorICAgIDB4NzAsIDB4ODgsIDB4RjcsIDB4RjcsIDB4OTgsIDB4RjgsIDB4RTksIDB4NEIsIDB4MzYsIDB4RUUsIDB4RUQsIDB4RUUsCisgICAgMHgzMywgMHhGMSwgMHg5MywgMHg3NywgMHg0NywgMHg0QywgMHhGQywgMHhDRiwgMHhENywgMHg1RCwgMHg3NiwgMHhGRSwKKyAgICAweDY3LCAweDg3LCAweDM5LCAweDFDLCAweDA0LCAweDJCLCAweDQ2LCAweDEzLCAweEI5LCAweDNCLCAweDEwLCAweDc1LAorICAgIDB4NTMsIDB4RUMsIDB4QTMsIDB4RDgsIDB4NDEsIDB4QjEsIDB4RjYsIDB4NjIsIDB4RDUsIDB4QzUsIDB4N0EsIDB4OEIsCisgICAgMHg5NSwgMHg5NiwgMHhENywgMHg2OCwgMHgyMCwgMHhBMiwgMHhBQiwgMHgzQSwgMHgzMiwgMHhEMiwgMHgyRiwgMHg3OSwKKyAgICAweDA0LCAweDg5LCAweERFLCAweEZFLCAweDFCLCAweEVGLCAweDcwLCAweDg3LCAweDFFLCAweDRFLCAweDBDLCAweDE0LAorICAgIDB4QjYsIDB4NEYsIDB4RkIsIDB4QjksIDB4NkQsIDB4MzAsIDB4MEMsIDB4NTMsIDB4MEYsIDB4NDEsIDB4MDQsIDB4QTYsCisgICAgMHhGMiwgMHhEMywgMHg4OCwgMHg1NiwgMHhGOSwgMHhEMSwgMHhFQiwgMHhCRiwgMHgwOCwgMHhCMiwgMHhGQiwgMHg2MSwKKyAgICAweDgyLCAweDdCLCAweDNCLCAweDAzLCAweEJBLCAweDk1LCAweDgwLCAweDIwLCAweDU4LCAweEM1LCAweDVBLCAweDNBLAorICAgIDB4QjYsIDB4RUEsIDB4QjksIDB4QjksIDB4MTUsIDB4QTIsIDB4MkEsIDB4QjQsIDB4RDEsIDB4MTIsIDB4QjQsIDB4NkQsCisgICAgMHg0NCwgMHhDQywgMHhDNCwgMHhGQSwgMHgwNCwgMHg4OSwgMHg0NiwgMHhEQiwgMHhCQSwgMHhEMywgMHhFRCwgMHg3MiwKKyAgICAweEUyLCAweDIzLCAweEZBLCAweEUzLCAweDRGLCAweDlFLCAweEVFLCAweEYwLCAweDQwLCAweEUyLCAweEE5LCAweEUzLAorICAgIDB4M0MsIDB4NjgsIDB4RjIsIDB4RjQsIDB4MjgsIDB4NzgsIDB4MzAsIDB4NEYsIDB4N0YsIDB4QkUsIDB4MzUsIDB4ODksCisgICAgMHhBQSwgMHgyQywgMHg0RCwgMHgxNywgMHg5QiwgMHg5RCwgMHhEMiwgMHgzNCwgMHg5NSwgMHgzMiwgMHgxOCwgMHg0OCwKKyAgICAweDBELCAweDEzLCAweEQ0LCAweDgwLCAweDI0LCAweEQ1LCAweDQwLCAweEIzLCAweDU5LCAweDQ5LCAweDY1LCAweDY5LAorICAgIDB4OTgsIDB4RDgsIDB4QkUsIDB4QUUsIDB4NEMsIDB4MDUsIDB4NDAsIDB4MDYsIDB4ODksIDB4OUMsIDB4QjEsIDB4NzUsCisgICAgMHgyMywgMHhFNywgMHg0QywgMHgwQSwgMHhDOSwgMHgzOCwgMHgzMywgMHgwNywgMHgzNCwgMHg4RCwgMHhGNywgMHg5RSwKKyAgICAweDBGLCAweDY4LCAweDRCLCAweDEyLCAweDdGLCAweEYyLCAweDg1LCAweEI2LCAweDI2LCAweENCLCAweEJDLCAweEY3LAorICAgIDB4NzksIDB4OTcsIDB4MDcsIDB4NkIsIDB4NDIsIDB4M0QsIDB4MjUsIDB4MkEsIDB4Q0IsIDB4MTIsIDB4MUEsIDB4NTMsCisgICAgMHg5QSwgMHhBNSwgMHg1MiwgMHg4RSwgMHhDMCwgMHgxQSwgMHg5QSwgMHg2MiwgMHg0NiwgMHg5MiwgMHg2NiwgMHg2NCwKKyAgICAweEI5LCAweDkyLCAweDI0LCAweEYyLCAweDI1LCAweDE0LCAweEU1LCAweDE1LCAweEJFLCAweDI3LCAweDM5LCAweDA3LAorICAgIDB4QTIsIDB4REIsIDB4QjIsIDB4NDIsIDB4RDEsIDB4RjgsIDB4MEEsIDB4MkQsIDB4NDAsIDB4NzMsIDB4NjMsIDB4NzMsCisgICAgMHhEMSwgMHhCMCwgMHhFNCwgMHhGOSwgMHhFNiwgMHhERCwgMHhFRCwgMHhENSwgMHgyNywgMHg1QSwgMHhDQiwgMHg1RCwKKyAgICAweDBCLCAweEFELCAweDRDLCAweDkzLCAweDAyLCAweEE1LCAweEU5LCAweDE4LCAweDZELCAweDQ0LCAweEIyLCAweDdFLAorICAgIDB4NjYsIDB4QjAsIDB4QTgsIDB4MjgsIDB4OEEsIDB4RDEsIDB4OTcsIDB4NDAsIDB4RTEsIDB4NDQsIDB4NzcsIDB4QzIsCisgICAgMHg3NSwgMHhBNywgMHg2QiwgMHhBRSwgMHhFQiwgMHgwQSwgMHhGNSwgMHgwQywgMHhBRiwgMHg1QywgMHhBQSwgMHgzOCwKKyAgICAweDg0LCAweDIwLCAweDUzLCAweEU5LCAweDcxLCAweEUyLCAweEE1LCAweDQwLCAweDVDLCAweDU5LCAweEI4LCAweDg1LAorICAgIDB4ODgsIDB4ODIsIDB4NEMsIDB4M0IsIDB4N0EsIDB4RTYsIDB4NzgsIDB4NTEsIDB4RTcsIDB4OUIsIDB4NTEsIDB4NjgsCisgICAgMHgyMCwgMHg2OSwgMHg2QSwgMHhEOCwgMHhFNywgMHg1OCwgMHgxNiwgMHg4QSwgMHhEMiwgMHhBQiwgMHg0OCwgMHhEMSwKKyAgICAweDBELCAweDQ4LCAweEVGLCAweDQ5LCAweDJELCAweENFLCAweDEyLCAweDZFLCAweDk3LCAweDBBLCAweDNBLCAweDA0LAorICAgIDB4M0IsIDB4NUIsIDB4QkEsIDB4N0YsIDB4MjcsIDB4MjYsIDB4MkEsIDB4MkEsIDB4OTIsIDB4MEUsIDB4QzYsIDB4MkIsCisgICAgMHgwQSwgMHgwQywgMHhERCwgMHg3NCwgMHgyQywgMHg0RSwgMHg5QywgMHhBQywgMHg0OCwgMHg3NywgMHgxMSwgMHhDMSwKKyAgICAweDlDLCAweDM4LCAweDU1LCAweDYwLCAweDBGLCAweDhELCAweEM5LCAweDFDLCAweDc2LCAweDdDLCAweDEyLCAweDE5LAorICAgIDB4NjcsIDB4QjIsIDB4NjAsIDB4N0MsIDB4MDcsIDB4ODMsIDB4ODAsIDB4MTMsIDB4RkYsIDB4RkUsIDB4NzgsIDB4NEIsCisgICAgMHgwNywgMHg1NCwgMHg4NiwgMHgzMSwgMHg0MiwgMHhBNSwgMHg1QiwgMHhEOCwgMHg1RiwgMHg3MCwgMHg2MiwgMHg2QiwKKyAgICAweDc5LCAweEY1LCAweDFDLCAweEIyLCAweEY0LCAweDQxLCAweDE0LCAweDQ0LCAweEMxLCAweDg0LCAweDJDLCAweEQ0LAorICAgIDB4RUQsIDB4Q0YsIDB4ODEsIDB4REUsIDB4MTYsIDB4NUEsIDB4ODcsIDB4NEEsIDB4M0MsIDB4OTAsIDB4RTMsIDB4MzAsCisgICAgMHhDQSwgMHgzOSwgMHhBNywgMHhFMiwgMHgzNiwgMHgwMiwgMHg1MiwgMHhDRiwgMHgzMSwgMHgzQiwgMHgxQiwgMHgxOCwKKyAgICAweEM4LCAweEI2LCAweDBBLCAweDI0LCAweEFFLCAweENFLCAweDY0LCAweDRBLCAweDNELCAweEZBLCAweDc1LCAweEE4LAorICAgIDB4ODIsIDB4MjUsIDB4RUEsIDB4NjQsIDB4MDksIDB4NDEsIDB4MzcsIDB4NzUsIDB4NkMsIDB4OEUsIDB4MjAsIDB4REMsCisgICAgMHhDMSwgMHgwRSwgMHhEMSwgMHgxMSwgMHhGMSwgMHg5RiwgMHg1MiwgMHhDMiwgMHgwOCwgMHhBQiwgMHg1OSwgMHhEMiwKKyAgICAweENGLCAweEE0LCAweDJDLCAweEEyLCAweDM2LCAweDQxLCAweERCLCAweDIzLCAweDI5LCAweDczLCAweDA0LCAweEI2LAorICAgIDB4RTksIDB4OEIsIDB4MzgsIDB4OEEsIDB4QjIsIDB4QTIsIDB4NDEsIDB4QkQsIDB4ODQsIDB4RDAsIDB4QzIsIDB4QUUsCisgICAgMHhCMywgMHgwOSwgMHhDMSwgMHgwMiwgMHhCNiwgMHgzNSwgMHg1RCwgMHhGMSwgMHg3QiwgMHg5QSwgMHg3QywgMHg3OCwKKyAgICAweEFGLCAweEQ0LCAweDlBLCAweDg4LCAweDRDLCAweDBELCAweDUwLCAweDM0LCAweDFDLCAweDkzLCAweDk3LCAweDQ3LAorICAgIDB4M0UsIDB4OUEsIDB4NzIsIDB4M0IsIDB4ODEsIDB4REQsIDB4RjcsIDB4NDcsIDB4RDIsIDB4NjQsIDB4OUMsIDB4QTEsCisgICAgMHgwNSwgMHg1MywgMHgyRCwgMHg3NSwgMHg5RSwgMHg0MiwgMHgzRCwgMHhGQywgMHhGQywgMHgxNywgMHhGRiwgMHgwMSwKKyAgICAweERDLCAweEYxLCAweDE4LCAweEQzfTsKK2NvbnN0IHVpbnQ4X3QgZ19lc0VTX0xvY2FsZVtdID0geworICAgIDB4NzgsIDB4OUMsIDB4OUQsIDB4NTYsIDB4Q0YsIDB4NkIsIDB4RDQsIDB4NDAsIDB4MTQsIDB4QkUsIDB4MEIsIDB4RkUsCisgICAgMHgwRiwgMHgyMSwgMHg1OCwgMHg1NiwgMHhBMSwgMHhERCwgMHhEMSwgMHg2MywgMHhDQiwgMHgzNiwgMHg1MCwgMHhEQSwKKyAgICAweERBLCAweDk1LCAweDFBLCAweDU5LCAweDlBLCAweEFBLCAweEQ4LCAweDhCLCAweDRDLCAweDkyLCAweEU5LCAweEVFLAorICAgIDB4QjQsIDB4QzksIDB4Q0MsIDB4MzIsIDB4NDksIDB4MkMsIDB4OUIsIDB4QTMsIDB4RTAsIDB4NDEsIDB4MTAsIDB4MEIsCisgICAgMHhERSwgMHg4QSwgMHgyNywgMHgwRiwgMHgxRSwgMHgwNCwgMHg4QiwgMHg3NywgMHg1MSwgMHgzQywgMHhGNCwgMHgzRiwKKyAgICAweDExLCAweDZBLCAweEVCLCAweEM5LCAweDdGLCAweEMxLCAweDM3LCAweDlCLCAweDQ5LCAweDM2LCAweDNGLCAweDY2LAorICAgIDB4RDcsIDB4NjAsIDB4NEUsIDB4RjMsIDB4QkUsIDB4RjcsIDB4N0QsIDB4MkYsIDB4RUYsIDB4N0QsIDB4OTMsIDB4NEMsCisgICAgMHhEMiwgMHgwQiwgMHhCOCwgMHg4NywgMHgwMywgMHg2MiwgMHgzMCwgMHgxQywgMHg5MiwgMHg3NSwgMHg5MywgMHg0NCwKKyAgICAweENGLCAweEI3LCAweDFELCAweEQzLCAweEYwLCAweDQ5LCAweEU0LCAweEFELCAweDlCLCAweEQ3LCAweDFGLCAweDdGLAorICAgIDB4NUMsIDB4OUQsIDB4OUUsIDB4NUYsIDB4QkQsIDB4M0UsIDB4QkIsIDB4RkUsIDB4NzIsIDB4N0UsIDB4QkIsIDB4MDgsCisgICAgMHhGRSwgMHg3QywgMHg3QiwgMHg3MywgMHhGOSwgMHhGRSwgMHhGQiwgMHhFRiwgMHhCMywgMHg1NywgMHhCRiwgMHhERSwKKyAgICAweEJFLCAweEJCLCAweEZDLCAweDdBLCAweDdBLCAweEM3LCAweEI0LCAweDdBLCAweEIyLCAweDAwLCAweEYzLCAweEIxLAorICAgIDB4NzAsIDB4MjYsIDB4QTEsIDB4Q0IsIDB4ODMsIDB4NDgsIDB4RDUsIDB4MUEsIDB4MEEsIDB4MzIsIDB4RTQsIDB4ODIsCisgICAgMHg2MiwgMHgwNiwgMHg4QywgMHg5MCwgMHhCMywgMHg3OCwgMHhGNCwgMHgwOCwgMHhFMCwgMHg0OCwgMHhBRCwgMHgyRCwKKyAgICAweEMyLCAweDg4LCAweEUwLCAweDNELCAweDk0LCAweDA1LCAweDM3LCAweDZGLCAweDI4LCAweEY0LCAweDkwLCAweEI4LAorICAgIDB4NDIsIDB4ODcsIDB4ODcsIDB4NTgsIDB4QTQsIDB4NEQsIDB4MTQsIDB4QkIsIDB4ODIsIDB4MDYsIDB4MUEsIDB4RUUsCisgICAgMHhBNCwgMHg0OSwgMHgzRCwgMHg0QSwgMHgxOCwgMHhENSwgMHhBMSwgMHg4MSwgMHgwNiwgMHhDNSwgMHg0MywgMHgxRSwKKyAgICAweEM1LCAweDRELCAweDM4LCAweDIyLCAweEUzLCAweDk4LCAweDkyLCAweDEwLCAweDFBLCAweDZDLCAweEE0LCAweEI4LAorICAgIDB4MTcsIDB4MjcsIDB4M0EsIDB4OUMsIDB4RjEsIDB4MTcsIDB4NzMsIDB4MTQsIDB4M0UsIDB4RjUsIDB4MUEsIDB4MTksCisgICAgMHg1NCwgMHg3MiwgMHgyOSwgMHgyNywgMHg0RSwgMHgyMywgMHgwMywgMHhCQiwgMHhBRSwgMHg1OCwgMHgzNywgMHhFRiwKKyAgICAweDk5LCAweDI1LCAweEYzLCAweDc0LCAweEQ2LCAweEU5LCAweDZDLCAweEQzLCAweDk5LCAweEE2LCAweEIzLCAweDRDLAorICAgIDB4RTcsIDB4OTgsIDB4Q0UsIDB4MkYsIDB4OUQsIDB4NUIsIDB4M0EsIDB4QUIsIDB4NzQsIDB4MUUsIDB4RTksIDB4RkMsCisgICAgMHhEMSwgMHgzOSwgMHgzMywgMHhERiwgMHgxMywgMHgxRiwgMHg0RiwgMHhENCwgMHg1MywgMHgwNCwgMHgyQiwgMHhDQiwKKyAgICAweEU3LCAweDIxLCAweDY1LCAweEYyLCAweEY2LCAweDMyLCAweEM4LCAweEIyLCAweDU2LCAweDkwLCAweDMwLCAweDEyLAorICAgIDB4NTUsIDB4MTAsIDB4MzAsIDB4MjEsIDB4QUUsIDB4NDMsIDB4RjQsIDB4RTIsIDB4OTMsIDB4RjAsIDB4NzgsIDB4NTAsCisgICAgMHg4MywgMHg4RiwgMHgxMiwgMHhGMiwgMHhBMiwgMHgwNiwgMHhDMSwgMHhGRSwgMHg4OSwgMHg3QSwgMHhDMSwgMHhFOCwKKyAgICAweEUyLCAweDgzLCAweDhCLCAweEZELCAweEQ5LCAweDZELCAweDUxLCAweEQxLCAweDU1LCAweEE5LCAweEMzLCAweEQyLAorICAgIDB4OUUsIDB4QTksIDB4NTYsIDB4RUIsIDB4NkQsIDB4RDYsIDB4OUIsIDB4NkMsIDB4NzQsIDB4NTgsIDB4RUYsIDB4QUQsCisgICAgMHhERSwgMHg1OCwgMHhBMywgMHgyOSwgMHg3RCwgMHg0NywgMHgyMSwgMHgxMSwgMHhENCwgMHg4NywgMHg4NywgMHgyRCwKKyAgICAweDdGLCAweEZELCAweDU0LCAweDY4LCAweDZELCAweEQ4LCAweEUwLCAweDZFLCAweDFFLCAweDk0LCAweDc4LCAweEQ2LAorICAgIDB4QTAsIDB4OTYsIDB4NDAsIDB4RDUsIDB4MEEsIDB4ODAsIDB4MTAsIDB4ODEsIDB4NTUsIDB4MzUsIDB4NTgsIDB4NTksCisgICAgMHhCOCwgMHhCQiwgMHhEOSwgMHhFRCwgMHgyMSwgMHhCOSwgMHhDQSwgMHg1MiwgMHg5NiwgMHg1RiwgMHgwNiwgMHg1MCwKKyAgICAweDQxLCAweDk2LCAweDQxLCAweEVELCAweEE4LCAweEM4LCAweEJBLCAweDhGLCAweEM5LCAweDAwLCAweEM3LCAweDMxLAorICAgIDB4MTgsIDB4M0QsIDB4REQsIDB4RDcsIDB4MjIsIDB4NTIsIDB4RTcsIDB4QzgsIDB4NjEsIDB4MTIsIDB4MDQsIDB4QTYsCisgICAgMHhCNSwgMHgwRCwgMHg5NywgMHhCMSwgMHhENSwgMHg4MSwgMHhBMywgMHhDOSwgMHhFOCwgMHhEOCwgMHg3MCwgMHg2NSwKKyAgICAweEFCLCAweDY3LCAweDcwLCAweEM5LCAweDY5LCAweDBCLCAweDRELCAweEFELCAweEEwLCAweDJBLCAweDExLCAweDcwLAorICAgIDB4MzYsIDB4MzQsIDB4QUQsIDB4RkYsIDB4NTUsIDB4ODcsIDB4QzQsIDB4MDcsIDB4RjEsIDB4MTYsIDB4QjIsIDB4NkQsCisgICAgMHhENCwgMHg1MiwgMHgxMSwgMHg4RCwgMHhCOCwgMHg4OCwgMHg2NywgMHg5QSwgMHg4NiwgMHgwMiwgMHg1NSwgMHg2NiwKKyAgICAweDA2LCAweDIwLCAweEE2LCAweDYxLCAweEM5LCAweDgzLCAweDUyLCAweDU0LCAweEYxLCAweEEwLCAweERGLCAweEVGLAorICAgIDB4RjQsIDB4QTEsIDB4RkQsIDB4MEUsIDB4NUMsIDB4MEUsIDB4OUMsIDB4RDIsIDB4MDcsIDB4M0QsIDB4NTQsIDB4NjIsCisgICAgMHhENiwgMHhDQSwgMHg1NCwgMHgyNiwgMHhFRiwgMHhGNywgMHhENywgMHg2QywgMHg3QiwgMHhDRCwgMHg3MSwgMHg1QSwKKyAgICAweDQ5LCAweEE2LCAweEUzLCAweDJBLCAweDQxLCAweDBCLCAweEJBLCAweDlBLCAweDU1LCAweDBBLCAweDFBLCAweDZDLAorICAgIDB4NTQsIDB4OTksIDB4NEIsIDB4NTksIDB4QjUsIDB4MEYsIDB4NTgsIDB4QkUsIDB4RkQsIDB4M0IsIDB4ODksIDB4MUQsCisgICAgMHgxRiwgMHg4RiwgMHhDMiwgMHhDOCwgMHhEOSwgMHhERSwgMHhCQSwgMHg3RiwgMHhGMiwgMHgxNCwgMHg4RiwgMHg3NiwKKyAgICAweEQzLCAweDgzLCAweENDLCAweDlDLCAweDMyLCAweDA5LCAweDc0LCAweDJDLCAweDA5LCAweDVELCAweDIyLCAweDY2LAorICAgIDB4MEUsIDB4NTUsIDB4NjIsIDB4RDUsIDB4MDgsIDB4NjAsIDB4RjAsIDB4OUMsIDB4N0EsIDB4QTYsIDB4OTUsIDB4MkUsCisgICAgMHhBNywgMHhFOSwgMHg2QSwgMHgzNywgMHg0RCwgMHhEMywgMHgxRSwgMHhBQSwgMHhGMCwgMHgxQSwgMHg4NSwgMHg5NCwKKyAgICAweEQwLCAweDRCLCAweDg0LCAweDIwLCAweENDLCAweDlCLCAweEU0LCAweENBLCAweEQ1LCAweDU1LCAweEUzLCAweDU2LAorICAgIDB4NEIsIDB4RTksIDB4OTgsIDB4MDgsIDB4OEYsIDB4QjAsIDB4NTgsIDB4MjksIDB4OTcsIDB4MzQsIDB4MkEsIDB4NTQsCisgICAgMHg2QiwgMHhCRCwgMHgyOCwgMHg5NCwgMHg0RiwgMHg1NywgMHgwOSwgMHg1NSwgMHg1OSwgMHg5RiwgMHg3OCwgMHgzNCwKKyAgICAweEM0LCAweEIwLCAweEUzLCAweENCLCAweEI5LCAweDNFLCAweDRCLCAweEQ3LCAweEQ1LCAweEM1LCAweDk3LCAweDk2LAorICAgIDB4MjcsIDB4NjMsIDB4MkEsIDB4MzcsIDB4QkEsIDB4REIsIDB4OEEsIDB4NUYsIDB4NzQsIDB4QkQsIDB4RDQsIDB4OEEsCisgICAgMHgwRSwgMHg4NywgMHg2QywgMHgxMiwgMHg5OSwgMHhENiwgMHg0QSwgMHgyQiwgMHg3MiwgMHgwQSwgMHg5RiwgMHg2RiwKKyAgICAweEQzLCAweEJBLCAweERCLCAweEU0LCAweEEyLCAweEVBLCAweEQ4LCAweDgwLCAweEU0LCAweEJFLCAweDE3LCAweDRFLAorICAgIDB4NTQsIDB4ODEsIDB4RkMsIDB4RjksIDB4OUEsIDB4MDYsIDB4QTYsIDB4RjUsIDB4RjMsIDB4RTUsIDB4NjcsIDB4MzgsCisgICAgMHgzRSwgMHgyQSwgMHg4QywgMHg2NiwgMHgxMSwgMHhBNSwgMHhBMSwgMHgxMSwgMHg5NywgMHgwQiwgMHgzOCwgMHgzNSwKKyAgICAweDFFLCAweEVGLCAweEI1LCAweDE2LCAweDk1LCAweDRELCAweDZGLCAweDRBLCAweDUwLCAweEJELCAweDVCLCAweEY5LAorICAgIDB4MzIsIDB4NEMsIDB4QzYsIDB4RTQsIDB4MTAsIDB4N0IsIDB4RjIsIDB4MUMsIDB4Q0MsIDB4OTcsIDB4QUEsIDB4OTYsCisgICAgMHgzRCwgMHg4MSwgMHgxRiwgMHgxRiwgMHhERiwgMHgxOCwgMHg4MCwgMHgxNywgMHhBOCwgMHhDQywgMHhDQywgMHhEMywKKyAgICAweDE0LCAweEZFLCAweDQ2LCAweEQ4LCAweERDLCAweEY0LCAweDI2LCAweDRGLCAweDA0LCAweDdDLCAweDc3LCAweDBDLAorICAgIDB4MjcsIDB4RjYsIDB4QjUsIDB4RjksIDB4MEQsIDB4OUYsIDB4QkIsIDB4QzQsIDB4MTgsIDB4RDAsIDB4N0YsIDB4MTAsCisgICAgMHhGQSwgMHhGMiwgMHg2NywgMHhFQSwgMHg2NCwgMHgwMSwgMHg2MSwgMHg0MywgMHg2MCwgMHgxNywgMHg1RSwgMHg5OCwKKyAgICAweEY5LCAweDg0LCAweEZELCAweDExLCAweEE2LCAweERBLCAweEY0LCAweDJFLCAweDRGLCAweDkzLCAweDYzLCAweDZDLAorICAgIDB4RUMsIDB4RjAsIDB4NzgsIDB4NDQsIDB4M0QsIDB4MzksIDB4QzcsIDB4Q0EsIDB4OTMsIDB4MDcsIDB4ODYsIDB4QkQsCisgICAgMHg4OCwgMHgwQSwgMHgyMywgMHg3QiwgMHgyMywgMHg5RSwgMHg1MywgMHhGNywgMHgxNiwgMHhEQywgMHgxNCwgMHg5OCwKKyAgICAweDQzLCAweDM5LCAweDk5LCAweEYxLCAweDcwLCAweDAxLCAweEM5LCAweEUxLCAweDJELCAweDQ4LCAweEY2LCAweDI0LAorICAgIDB4NjEsIDB4QzMsIDB4MjMsIDB4M0UsIDB4RTUsIDB4QTksIDB4RTYsIDB4RDAsIDB4NkMsIDB4Q0YsIDB4NjQsIDB4OTQsCisgICAgMHhGRCwgMHhGQywgMHhDMiwgMHhGMiwgMHgyRiwgMHg3QywgMHhEQywgMHhDQywgMHgyRiwKK307Citjb25zdCB1aW50OF90IGdfZXNMQV9Mb2NhbGVbXSA9IHsKKyAgICAweDc4LCAweDlDLCAweDlELCAweDU2LCAweENELCAweDRFLCAweERDLCAweDMwLCAweDEwLCAweDNFLCAweDUzLCAweEE5LAorICAgIDB4RUYsIDB4NjAsIDB4NDUsIDB4NDUsIDB4ODAsIDB4MDQsIDB4OUIsIDB4RjYsIDB4QjgsIDB4MjgsIDB4NDQsIDB4NUEsCisgICAgMHgwMSwgMHhBNSwgMHgxNSwgMHgwRCwgMHg1QSwgMHg3NSwgMHg1MSwgMHg0QiwgMHhCOSwgMHg1NCwgMHg0RSwgMHg2MiwKKyAgICAweDM2LCAweDg2LCAweEM0LCAweDVFLCAweDM5LCAweDA5LCAweDY4LCAweEEzLCAweEJFLCAweDQwLCAweDRGLCAweDNELAorICAgIDB4RjQsIDB4RDQsIDB4NjMsIDB4MkIsIDB4MjEsIDB4QjUsIDB4MDcsIDB4RDQsIDB4NDcsIDB4RTgsIDB4ODEsIDB4NjcsCisgICAgMHg0MSwgMHhGMCwgMHgxOCwgMHg5RCwgMHhGQywgMHg2RSwgMHgxMiwgMHgzQiwgMHhFOSwgMHhEMiwgMHg5QywgMHgzQywKKyAgICAweERGLCAweDdDLCAweDlGLCAweDc3LCAweEU2LCAweEIzLCAweDMzLCAweDFCLCAweEMzLCAweEU3LCAweDBFLCAweEY2LAorICAgIDB4MDksIDB4NjIsIDB4MzgsIDB4MjAsIDB4M0IsIDB4MUEsIDB4MDksIDB4M0YsIDB4NUEsIDB4MjcsIDB4MUEsIDB4NzIsCisgICAgMHg0OSwgMHhFOCwgMHhFQywgMHg2OCwgMHgwRiwgMHhENywgMHg3RiwgMHhFRSwgMHhCRiwgMHhEQywgMHhEQywgMHg3RiwKKyAgICAweEZFLCAweEY2LCAweEYwLCAweEZCLCAweDY2LCAweEZELCAweEVFLCAweEM3LCAweDRGLCAweDg4LCAweEVGLCAweEJFLAorICAgIDB4NUUsIDB4NkYsIDB4NjgsIDB4RTYsIDB4RDMsIDB4MjcsIDB4MDgsIDB4MTksIDB4QTksIDB4OEEsIDB4QjksIDB4NTgsCisgICAgMHg0QywgMHhFNiwgMHg4MSwgMHhDRCwgMHhGRCwgMHhCMCwgMHhEOCwgMHg2MCwgMHgyQSwgMHhDOCwgMHg5NCwgMHgwQiwKKyAgICAweDhBLCAweDU5LCAweENBLCAweDVBLCAweDQxLCAweDQ2LCAweEMwLCAweDU5LCAweEU0LCAweDFELCAweDQxLCAweDJBLAorICAgIDB4NEMsIDB4RTMsIDB4OTUsIDB4M0MsIDB4MzYsIDB4MDksIDB4MjMsIDB4ODIsIDB4MUIsIDB4N0EsIDB4MUUsIDB4RDQsCisgICAgMHhGMCwgMHgzMywgMHg2MiwgMHgwQiwgMHg3NSwgMHgyNiwgMHhDMCwgMHgyMiwgMHg1MSwgMHhFMSwgMHhEOCwgMHgxNiwKKyAgICAweEQ0LCAweDU3LCAweEYyLCAweEU3LCAweDJBLCAweEZBLCAweDc5LCAweENDLCAweEE4LCAweDFBLCAweEY3LCAweDk1LAorICAgIDB4MzgsIDB4OUUsIDB4RjIsIDB4MzAsIDB4NTIsIDB4MjUsIDB4NDIsIDB4MzIsIDB4OEIsIDB4MjgsIDB4MDksIDB4QTAsCisgICAgMHg1QywgMHg0NSwgMHg5MiwgMHgzQiwgMHg1MSwgMHhBQywgMHhDRSwgMHgzMCwgMHg3RSwgMHhEOSwgMHhBOSwgMHg3MiwKKyAgICAweEE5LCAweDIzLCAweEU1LCAweDUwLCAweEIxLCAweEFFLCAweDFDLCAweEFDLCAweDNCLCAweDhBLCAweEIwLCAweDZELAorICAgIDB4OEIsIDB4MUQsIDB4RUQsIDB4ODUsIDB4RDYsIDB4QjIsIDB4NTYsIDB4NkQsIDB4QUMsIDB4REEsIDB4NTQsIDB4QjUsCisgICAgMHhBNSwgMHg2QSwgMHg0MywgMHhENSwgMHg3RSwgMHhBQSwgMHhERCwgMHg1NCwgMHg3QiwgMHhBOSwgMHgzNiwgMHg1MiwKKyAgICAweEVELCAweEEwLCAweERBLCAweDNELCAweEI1LCAweDZGLCAweEZELCAweDhFLCAweEI5LCAweDc4LCAweDVFLCAweEJCLAorICAgIDB4ODEsIDB4MTAsIDB4OTksIDB4MkUsIDB4MEYsIDB4MjgsIDB4NEIsIDB4Q0IsIDB4NDksIDB4ODMsIDB4MEEsIDB4RjUsCisgICAgMHg2MywgMHg0NiwgMHhDMiwgMHgxNiwgMHgwNiwgMHgxNiwgMHg0NSwgMHgzMiwgMHg0OCwgMHg2RiwgMHg3RiwgMHgwOSwKKyAgICAweDg3LCAweEZCLCAweDUyLCAweEUyLCAweDNDLCAweDI2LCAweDk3LCAweDEyLCAweDA4LCAweDI3LCAweDJFLCAweEU0LAorICAgIDB4OEQsIDB4QzMsIDB4REIsIDB4RUYsIDB4MzYsIDB4NzYsIDB4MTcsIDB4MjUsIDB4QTAsIDB4NkMsIDB4QTUsIDB4QTgsCisgICAgMHhCQSwgMHg3NSwgMHhDQSwgMHg0NSwgMHhGOSwgMHg3MiwgMHhFOSwgMHg3MiwgMHhFMSwgMHg4QSwgMHhBQSwgMHhFNSwKKyAgICAweDdBLCAweEU1LCAweDYyLCAweDE1LCAweDg1LCAweDc2LCAweDU3LCAweDE5LCAweDEwLCAweDQxLCAweDVELCAweEI4LAorICAgIDB4QjYsIDB4RjUsIDB4NTcsIDB4QkMsIDB4ODAsIDB4Q0MsIDB4OTEsIDB4MDUsIDB4NjcsIDB4NTEsIDB4MDYsIDB4Q0QsCisgICAgMHhENCwgMHhCOCwgMHg5NSwgMHg0MiwgMHg4QiwgMHhCMCwgMHhCNiwgMHgzOSwgMHgxMSwgMHhCOCwgMHhCNiwgMHgyRiwKKyAgICAweDQ0LCAweDI2LCAweDFFLCAweEVDLCAweDBFLCAweDBDLCAweDNELCAweDVELCAweDU1LCAweDkwLCAweDVCLCAweDg3LAorICAgIDB4NTAsIDB4QjYsIDB4MkEsIDB4NDUsIDB4MzAsIDB4QTUsIDB4RjQsIDB4RDYsIDB4OTgsIDB4Q0EsIDB4NTEsIDB4MTcsCisgICAgMHg0NywgMHg2NCwgMHg4QywgMHhBMywgMHgwOCwgMHgwRSwgMHhBNiwgMHg3MiwgMHhCQiwgMHg0MiwgMHg4QSwgMHg0OSwKKyAgICAweDc2LCAweDE2LCAweEZCLCAweEJFLCAweDY2LCAweEVFLCAweEMzLCAweDgzLCAweEY2LCAweEQ2LCAweDYwLCAweDIyLAorICAgIDB4QTIsIDB4MzUsIDB4MEIsIDB4OUUsIDB4N0MsIDB4RjUsIDB4MDEsIDB4OUUsIDB4RDQsIDB4ODksIDB4NEEsIDB4RDMsCisgICAgMHhCNSwgMHg4OSwgMHhDRiwgMHhEOSwgMHg1NCwgMHgzMywgMHhGRiwgMHg1RiwgMHgxRiwgMHgxMCwgMHgxNywgMHhFNCwKKyAgICAweDdCLCAweEJBLCAweDY1LCAweEU5LCAweDRCLCAweDZCLCAweDQyLCAweDhGLCAweDhCLCAweDY4LCAweEExLCAweDZBLAorICAgIDB4NkIsIDB4MTAsIDB4NkEsIDB4MjAsIDB4ODUsIDB4MjMsIDB4MTEsIDB4MEQsIDB4NUEsIDB4OEUsIDB4RDQsIDB4OTAsCisgICAgMHg4NiwgMHgyMywgMHg5RSwgMHhCNywgMHg2RCwgMHg1OSwgMHhEQiwgMHg5MywgMHgwOSwgMHgxQSwgMHhBMSwgMHg1MywKKyAgICAweDQzLCAweEFGLCAweEIxLCAweEJBLCAweDY0LCAweEI5LCAweDA3LCAweDhGLCAweDk2LCAweDY1LCAweEFELCAweDJGLAorICAgIDB4NTQsIDB4NEIsIDB4NjksIDB4OEEsIDB4RDYsIDB4MzMsIDB4OTUsIDB4MkMsIDB4NDksIDB4M0IsIDB4NkYsIDB4RjUsCisgICAgMHg1OSwgMHhEQywgMHg4NSwgMHg2MywgMHg0MCwgMHhDQiwgMHgwQiwgMHg3MiwgMHgxMCwgMHg1QiwgMHhEMSwgMHg4NSwKKyAgICAweDE3LCAweDg0LCAweDkzLCAweEZELCAweEJELCAweDk3LCAweDU3LCAweEVGLCAweEIxLCAweDc3LCAweDk4LCAweDlDLAorICAgIDB4RTYsIDB4ODYsIDB4RDUsIDB4NDksIDB4OTksIDB4OTIsIDB4QzUsIDB4ODEsIDB4NEQsIDB4NDQsIDB4RDMsIDB4QjUsCisgICAgMHgwNiwgMHg1NiwgMHg1NCwgMHgwNSwgMHgxOCwgMHhEQywgMHg2RCwgMHg0NywgMHgzMywgMHg5MywgMHhDRCwgMHgyNCwKKyAgICAweDE5LCAweDBFLCAweDkyLCAweDI0LCAweDMxLCAweEY0LCAweDA2LCAweEFGLCAweDVCLCAweEVBLCAweEM0LCAweDQyLAorICAgIDB4MTAsIDB4RTYsIDB4Q0MsIDB4MzUsIDB4RjMsIDB4NTksIDB4MkUsIDB4MUUsIDB4MEUsIDB4M0YsIDB4QUQsIDB4NTcsCisgICAgMHhDQiwgMHg4RCwgMHhBNSwgMHhGNywgMHg5OSwgMHgxMSwgMHhFMSwgMHgxMCwgMHgxNiwgMHgxNSwgMHgyNSwgMHhBQywKKyAgICAweENBLCAweEJBLCAweEQ0LCAweDFCLCAweEE5LCAweDlGLCAweEFBLCAweEM3LCAweDQ1LCAweERCLCAweDJCLCAweDRELAorICAgIDB4QTgsIDB4RDgsIDB4REUsIDB4MjUsIDB4MEUsIDB4MEQsIDB4MzAsIDB4NUMsIDB4OEUsIDB4NDEsIDB4QjksIDB4NEIsCisgICAgMHg5RSwgMHhFRSwgMHgxNCwgMHg0QywgMHgwNSwgMHg4RiwgMHg2NywgMHgzNCwgMHhCRCwgMHgxNywgMHg5QiwgMHg0QiwKKyAgICAweDJBLCAweEFBLCAweDBFLCAweDU2LCAweDk3LCAweDE0LCAweEMwLCAweDg0LCAweDhGLCAweDQzLCAweENELCAweERDLAorICAgIDB4NUEsIDB4OTIsIDB4OUUsIDB4QzAsIDB4NzcsIDB4ODcsIDB4NjYsIDB4M0UsIDB4OTcsIDB4RDgsIDB4MEIsIDB4NjMsCisgICAgMHgxQSwgMHg2NywgMHg1RiwgMHgxRSwgMHg0QywgMHhDMywgMHg5OSwgMHgyNiwgMHg1OCwgMHhERSwgMHhDOSwgMHgyQywKKyAgICAweDgwLCAweDAzLCAweDg0LCAweDU5LCAweEQ0LCAweEM4LCAweEY3LCAweDY4LCAweDY4LCAweEM4LCAweEQzLCAweDg1LAorICAgIDB4NjYsIDB4NUEsIDB4MjcsIDB4NDcsIDB4OEYsIDB4OTAsIDB4RDUsIDB4OEYsIDB4NDEsIDB4MTIsIDB4NjUsIDB4QzMsCisgICAgMHg1MCwgMHhBQSwgMHgzQSwgMHg3RCwgMHhGNSwgMHhFNywgMHgzMywgMHg3MiwgMHg4NiwgMHg5RCwgMHg3MiwgMHhFOCwKKyAgICAweDk2LCAweDYxLCAweEIxLCAweEE3LCAweDM1LCAweDg3LCAweEFGLCAweDM5LCAweDE3LCAweDhELCAweEMxLCAweDFELAorICAgIDB4NUQsIDB4NEQsIDB4QTAsIDB4RjAsIDB4NDksIDB4QzUsIDB4N0EsIDB4MDgsIDB4QkIsIDB4M0MsIDB4MTYsIDB4RjAsCisgICAgMHgxNywgMHg4OCwgMHgyNiwgMHg5MSwgMHhEQiwgMHhDMSwgMHgxOCwgMHhCOSwgMHhEQywgMHgyNiwgMHg2OCwgMHg0QywKKyAgICAweEZGLCAweDQ5LCAweDc5LCAweDk1LCAweDdFLCAweDFGLCAweDVFLCAweEY1LCAweDUyLCAweDQ2LCAweDAyLCAweERCLAorICAgIDB4RjAsIDB4QUUsIDB4RjUsIDB4NTEsIDB4OEUsIDB4M0QsIDB4NEMsIDB4M0IsIDB4MDgsIDB4ODcsIDB4M0MsIDB4ODksCisgICAgMHgyRiwgMHgzMCwgMHgzQSwgMHhFMCwgMHg5MSwgMHg0NywgMHg5RCwgMHhCNCwgMHhBNywgMHhBRCwgMHg3NywgMHhBRiwKKyAgICAweDkxLCAweEQ1LCAweDRGLCAweDA2LCAweDAzLCAweDFDLCAweDhGLCAweDk3LCAweEU0LCAweEI3LCAweEJELCAweDNGLAorICAgIDB4MEQsIDB4REMsIDB4NjksIDB4REEsIDB4MjUsIDB4N0EsIDB4RDMsIDB4NEIsIDB4OUIsIDB4RjAsIDB4QTUsIDB4NjgsCisgICAgMHhENiwgMHgzQywgMHg2NiwgMHhEMywgMHg3MywgMHg5RSwgMHgzMSwgMHhGMywgMHgyMiwgMHhCMywgMHgxMSwgMHg1NywKKyAgICAweDNCLCAweDRGLCAweDQzLCAweENGLCAweDNGLCAweEVGLCAweENELCAweEJGLCAweEM0LCAweEI1LCAweEQ0LCAweDA0fTsKK2NvbnN0IHVpbnQ4X3QgZ19kZURFX0xvYWNhbGVbXSA9IHsKKyAgICAweDc4LCAweDlDLCAweDk1LCAweDU2LCAweDRELCAweDZGLCAweEQ0LCAweDMwLCAweDEwLCAweEJELCAweDIzLCAweEYxLAorICAgIDB4MUYsIDB4QUMsIDB4ODgsIDB4QUEsIDB4MjAsIDB4QjUsIDB4MUIsIDB4MzgsIDB4QjYsIDB4REEsIDB4NDYsIDB4NUEsCisgICAgMHg3NSwgMHhGQiwgMHg0MSwgMHg0QiwgMHhDQSwgMHhBQSwgMHg2OSwgMHg0MSwgMHhGNCwgMHg4MiwgMHhCQywgMHg4OSwKKyAgICAweEJCLCAweDcxLCAweDlCLCAweEQ4LCAweDJCLCAweEM3LCAweDY5LCAweEI1LCAweDM5LCAweEYyLCAweDM3LCAweEI4LAorICAgIDB4NzIsIDB4MDQsIDB4NzEsIDB4RTQsIDB4MDQsIDB4MTcsIDB4RkUsIDB4MDksIDB4NTIsIDB4MjUsIDB4N0UsIDB4MDYsCisgICAgMHg5MywgMHg4RCwgMHg5MywgMHgyNiwgMHhCNiwgMHhCQiwgMHgwRCwgMHhCOSwgMHhBQywgMHhFNywgMHhDRCwgMHg3QiwKKyAgICAweEIzLCAweDMzLCAweENGLCAweDg5LCAweDkzLCAweDYxLCAweEMyLCAweDQzLCAweDlDLCAweDEwLCAweEM0LCAweDcwLAorICAgIDB4NEEsIDB4NzYsIDB4OUMsIDB4ODgsIDB4N0MsIDB4MUMsIDB4RUYsIDB4MzksIDB4MjgsIDB4MjIsIDB4NTksIDB4QjgsCisgICAgMHhFMywgMHhEQywgMHhGRCwgMHhGQSwgMHhGMSwgMHhGNywgMHhGQiwgMHhCNywgMHhFNywgMHhGMCwgMHg3MywgMHhGNywKKyAgICAweEY5LCAweEU3LCAweDBCLCAweEM3LCAweDFCLCAweDk2LCAweDQ0LCAweDE2LCAweDYxLCAweDExLCAweDJDLCAweEQyLAorICAgIDB4MjksIDB4NEYsIDB4MzIsIDB4QTUsIDB4OTksIDB4MDksIDB4MzIsIDB4RTMsIDB4ODIsIDB4NjIsIDB4MDYsIDB4OEMsCisgICAgMHg5NCwgMHgzMywgMHgxOSwgMHg5RiwgMHgwMCwgMHg5QywgMHhBOSwgMHhCNSwgMHg3NywgMHg4NCwgMHg1OSwgMHg4RSwKKyAgICAweEM1LCAweEQwLCAweEFELCAweEEyLCAweEE3LCAweDRGLCAweDE0LCAweEJDLCAweDRGLCAweEE2LCAweEMyLCAweDg2LAorICAgIDB4RkIsIDB4QkYsIDB4QkYsIDB4ODgsIDB4QzIsIDB4NDAsIDB4NDcsIDB4NzMsIDB4NDEsIDB4MTMsIDB4OTMsIDB4OEIsCisgICAgMHhBOSwgMHg4MSwgMHgxRCwgMHhFNSwgMHhDQywgMHgwNiwgMHgyNiwgMHgyNiwgMHgzOCwgMHhDQSwgMHg2NywgMHg3OSwKKyAgICAweDI2LCAweDBELCAweDM4LCAweDIwLCAweDczLCAweDQ5LCAweEQyLCAweDI5LCAweDMxLCAweDVCLCAweDdCLCAweDdCLAorICAgIDB4MkQsIDB4QjksIDB4MEQsIDB4M0YsIDB4RTEsIDB4MzcsIDB4NzYsIDB4QzEsIDB4OTgsIDB4MTQsIDB4N0EsIDB4QzIsCisgICAgMHg2RCwgMHgxOSwgMHg1NCwgMHhGMywgMHg5NiwgMHgxMSwgMHhDMiwgMHhEMywgMHhBOSwgMHhEOCwgMHg3MSwgMHg1RSwKKyAgICAweDM5LCAweDJELCAweERGLCAweDZDLCAweEE2LCAweDk5LCAweDI2LCAweEQ4LCAweEVELCAweEVBLCAweDZCLCAweDk2LAorICAgIDB4Q0QsIDB4MkIsIDB4OUIsIDB4NTUsIDB4MzYsIDB4OUYsIDB4NkMsIDB4MEUsIDB4RDksIDB4REMsIDB4QjEsIDB4MTksCisgICAgMHhGMywgMHhCMCwgMHgyNywgMHgxMSwgMHg1RSwgMHhBOCwgMHgxQiwgMHgwOCwgMHg1NiwgMHg1RSwgMHhDMCwgMHgxOSwKKyAgICAweDkzLCAweDE4LCAweEZFLCAweEJFLCAweDBDLCAweEFBLCAweEFDLCAweEU3LCAweDczLCAweDAzLCAweDFBLCAweDUzLAorICAgIDB4QzIsIDB4MzIsIDB4ODMsIDB4NDcsIDB4QTUsIDB4QkMsIDB4RTUsIDB4NjEsIDB4REMsIDB4NjUsIDB4NDIsIDB4NDEsCisgICAgMHgyMiwgMHgwQywgMHhFRSwgMHhCRSwgMHgyMCwgMHg1NCwgMHhDNywgMHgwMiwgMHg5QywgMHg3NiwgMHg3OCwgMHg2RSwKKyAgICAweEQzLCAweDVBLCAweEFCLCAweENELCAweEQ2LCAweEM2LCAweDU1LCAweEZELCAweDZBLCAweEFELCAweDZBLCAweDZELAorICAgIDB4NkEsIDB4MEQsIDB4NkEsIDB4QUQsIDB4NjksIDB4MkQsIDB4NjksIDB4REQsIDB4RDgsIDB4MUIsIDB4NDksIDB4ODksCisgICAgMHhBMCwgMHgxMSwgMHgyNSwgMHg2OSwgMHhGRCwgMHhENCwgMHhBOSwgMHhEMCwgMHgxQiwgMHhGOSwgMHhFMCwgMHg2QywKKyAgICAweDFELCAweEI0LCAweDc4LCAweERFLCAweDQ0LCAweDRCLCAweEI4LCAweERELCAweDBBLCAweDgwLCAweDEwLCAweDgxLAorICAgIDB4NTUsIDB4MzUsIDB4NTgsIDB4NzksIDB4MzcsIDB4MDMsIDB4QjQsIDB4MUIsIDB4OEIsIDB4QzEsIDB4RDAsIDB4MkQsCisgICAgMHg4MywgMHgyQSwgMHhFQiwgMHgzMSwgMHgwRCwgMHg3MywgMHgxQiwgMHg0OSwgMHgxOSwgMHg2OCwgMHhFNywgMHg0NCwKKyAgICAweDM1LCAweDgxLCAweDI0LCAweDEzLCAweDJDLCAweDI1LCAweDExLCAweDZDLCAweEI5LCAweEIzLCAweDRELCAweEE0LAorICAgIDB4MEUsIDB4OTEsIDB4Q0IsIDB4M0MsIDB4NDksIDB4MUMsIDB4NkYsIDB4MEYsIDB4QUUsIDB4MEQsIDB4MzQsIDB4MUUsCisgICAgMHgyMCwgMHgxRiwgMHgyRSwgMHhGNCwgMHgwMSwgMHhBRSwgMHg3MiwgMHhENiwgMHg4NiwgMHhBQiwgMHgxNSwgMHg1MiwKKyAgICAweEQyLCAweDg0LCAweEIzLCAweDk5LCAweEUzLCAweEZELCAweEE3LCAweDI4LCAweDI1LCAweDExLCAweDY4LCAweEM2LAorICAgIDB4MDMsIDB4REYsIDB4MUYsIDB4RjQsIDB4NTQsIDB4NjQsIDB4MzEsIDB4MTcsIDB4RjIsIDB4NUUsIDB4NjMsIDB4MjgsCisgICAgMHhEQywgMHhDRSwgMHg4OCwgMHgwMCwgMHg0OCwgMHg5QSwgMHhCNiwgMHg0NiwgMHg2RSwgMHg0NSwgMHg5RCwgMHg5MSwKKyAgICAweDBGLCAweEI3LCAweDdELCAweDdGLCAweDFELCAweDlELCAweEM3LCAweDAyLCAweEFELCAweDVGLCAweDBDLCAweERELAorICAgIDB4MTYsIDB4NEIsIDB4MkIsIDB4RDEsIDB4MTksIDB4RjYsIDB4QjAsIDB4NTQsIDB4NkQsIDB4MDcsIDB4MDEsIDB4RUEsCisgICAgMHgyMywgMHg1OSwgMHg4RSwgMHg1QSwgMHgyQiwgMHg3QSwgMHhGMCwgMHhENSwgMHhBMCwgMHg0QiwgMHg4NSwgMHg0MSwKKyAgICAweDc3LCAweDNCLCAweDUzLCAweDI5LCAweEEzLCAweENFLCAweDAwLCAweEFCLCAweEY3LCAweEZBLCAweEUwLCAweENBLAorICAgIDB4OTcsIDB4RDcsIDB4ODcsIDB4NjksIDB4MTYsIDB4RUMsIDB4OEQsIDB4RjcsIDB4NkYsIDB4REYsIDB4RTMsIDB4RjgsCisgICAgMHhCOCwgMHhCOCwgMHhBOCwgMHhBQywgMHg2OSwgMHg5MywgMHg0MCwgMHhDNywgMHhGMiwgMHhGMiwgMHg2OCwgMHhCQywKKyAgICAweEY3LCAweEE3LCAweDEzLCAweEFCLCAweDRFLCAweDAwLCAweDgzLCAweDVCLCAweDMzLCAweDc0LCAweEJDLCAweDYyLAorICAgIDB4QTMsIDB4MjgsIDB4QjYsIDB4MDYsIDB4NDUsIDB4MDEsIDB4QzcsIDB4NDYsIDB4ODcsIDB4NjcsIDB4MTQsIDB4NTIsCisgICAgMHhDMiwgMHgzMCwgMHgxNywgMHg4MiwgMHhCMCwgMHg3MCwgMHg1MSwgMHgyQiwgMHhCNywgMHhCNiwgMHhEMCwgMHhCMywKKyAgICAweDlFLCAweEQyLCAweDM5LCAweDExLCAweDIxLCAweDYxLCAweDUyLCAweDI5LCAweEQ3LCAweDJDLCAweDJBLCAweDU3LAorICAgIDB4NkIsIDB4QkQsIDB4MjksIDB4NTQsIDB4NEYsIDB4RDcsIDB4MDksIDB4OUIsIDB4MTcsIDB4NkIsIDB4NDgsIDB4NTMsCisgICAgMHgwQywgMHhGQiwgMHhCRCwgMHg1MSwgMHhFQiwgMHhBQiwgMHhCNCwgMHhBRSwgMHg2RSwgMHhERSwgMHhBOSwgMHgzQywKKyAgICAweDlGLCAweEQzLCAweDcyLCAweEFCLCAweDA3LCAweEJELCAweEY4LCAweDRELCAweEQ3LCAweDZCLCAweEJELCAweEU4LAorICAgIDB4MjksIDB4NjUsIDB4NzksIDB4RTYsIDB4NzgsIDB4OUIsIDB4QkQsIDB4QzgsIDB4MDUsIDB4MTEsIDB4REMsIDB4RjEsCisgICAgMHg1RSwgMHg5QSwgMHg1QywgMHhCNywgMHgzQiwgMHgzNiwgMHgyMCwgMHhCNSwgMHhFRiwgMHg4RCwgMHgxMywgMHg1RCwKKyAgICAweEEwLCAweEJFLCAweEMxLCAweDk2LCAweDgxLCAweEUzLCAweEZELCAweEY5LCAweEY0LCAweDE1LCAweENFLCAweDhBLAorICAgIDB4MEUsIDB4QzMsIDB4MkMsIDB4QTIsIDB4MzQsIDB4MzQsIDB4RTMsIDB4RTUsIDB4MDIsIDB4OEUsIDB4ODgsIDB4RjMsCisgICAgMHhEMywgMHhERSwgMHhBMiwgMHhCNiwgMHhFOSwgMHhBNiwgMHhDNCwgMHhENSwgMHhCQiwgMHgyRCwgMHg5RiwgMHg4NiwKKyAgICAweEM1LCAweDlDLCAweDVDLCAweEUyLCAweEIwLCAweDNDLCAweEZBLCAweEVBLCAweEE1LCAweEFBLCAweEU1LCAweDJGLAorICAgIDB4RTAsIDB4MTMsIDB4MjcsIDB4NDIsIDB4MTMsIDB4RjAsIDB4QzIsIDB4NkQsIDB4MzMsIDB4RUIsIDB4MzQsIDB4NjUsCisgICAgMHg5NCwgMHhCMywgMHgwNywgMHhEMywgMHhCQiwgMHgzQywgMHgxNywgMHg5NCwgMHgwOCwgMHgxNCwgMHhDOCwgMHhDOCwKKyAgICAweDlBLCAweDFGLCAweDQ1LCAweEYwLCAweDY5LCAweDgxLCAweDI2LCAweEY0LCAweDExLCAweEMyLCAweDIxLCAweDdDLAorICAgIDB4MzUsIDB4OTEsIDB4REIsIDB4MTUsIDB4ODQsIDB4OTEsIDB4QzAsIDB4NTMsIDB4NzgsIDB4NjAsIDB4MUUsIDB4MjYsCisgICAgMHg5QywgMHhDNSwgMHg5OCwgMHg1QSwgMHhEMywgMHhDNywgMHhCQywgMHhDOCwgMHhBRiwgMHgzMSwgMHgzQSwgMHhFMCwKKyAgICAweDMyLCAweEE2LCAweDYxLCAweDM5LCAweEM3LCAweEU2LCAweEJCLCAweEQ3LCAweEM4LCAweDVGLCAweDQ1LCAweDg1LAorICAgIDB4OTEsIDB4QzMsIDB4OTgsIDB4RDcsIDB4RDQsIDB4RDMsIDB4MTUsIDB4N0YsIDB4MEEsIDB4Q0MsIDB4NTksIDB4MzksCisgICAgMHgxOSwgMHg3QSwgMHhCMywgMHg4MiwgMHgwNCwgMHg2RiwgMHhGQSwgMHhDNywgMHg0OSwgMHhGRSwgMHgyMiwgMHg2NywKKyAgICAweEIzLCAweDJCLCAweEJFLCAweEU0LCAweEE5LCAweEU2LCAweERDLCAweEZCLCAweDNELCAweDJCLCAweEEzLCAweEVBLAorICAgIDB4NzMsIDB4MTYsIDB4OTYsIDB4RkYsIDB4MDAsIDB4MjksIDB4MjcsIDB4QUYsIDB4MTcsCit9OworY29uc3QgdWludDhfdCBnX2ZyRlJfTG9jYWxlW10gPSB7CisgICAgMHg3OCwgMHg5QywgMHg5NSwgMHg1NiwgMHg0RCwgMHg2RiwgMHhEMywgMHg0MCwgMHgxMCwgMHhCRCwgMHgyMywgMHhGMSwKKyAgICAweDFGLCAweDU2LCAweDE2LCAweDU1LCAweDQxLCAweDZBLCAweEJELCAweDcwLCAweDRDLCAweDk1LCAweDVBLCAweEFBLAorICAgIDB4RkEsIDB4MTUsIDB4MjgsIDB4NDYsIDB4NTEsIDB4NTMsIDB4NDAsIDB4RjQsIDB4ODIsIDB4MzYsIDB4RjYsIDB4MzYsCisgICAgMHhERSwgMHhENCwgMHhERSwgMHg4RCwgMHhENiwgMHg3NiwgMHg0QSwgMHg3QywgMHhFNCwgMHgzRiwgMHg3MCwgMHhFMiwKKyAgICAweEMyLCAweEI1LCAweDEyLCAweDg4LCAweDAzLCAweDQ3LCAweEM0LCAweDg1LCAweEZFLCAweDEzLCAweDI0LCAweDEwLAorICAgIDB4M0YsIDB4ODMsIDB4NzEsIDB4QkMsIDB4NzYsIDB4RUQsIDB4NUQsIDB4MjcsIDB4QjgsIDB4QkUsIDB4NjQsIDB4RTcsCisgICAgMHhDRCwgMHg3QiwgMHhFMywgMHg5OSwgMHhCNywgMHhGNiwgMHhDNiwgMHhGRCwgMHg1MCwgMHg3OCwgMHgyNCwgMHhBNCwKKyAgICAweDg4LCAweDkzLCAweDg4LCAweEVFLCAweDVBLCAweDE3LCAweEYyLCAweEVELCAweEQxLCAweEE5LCAweDg1LCAweDdDLAorICAgIDB4MUEsIDB4N0IsIDB4QkIsIDB4RDYsIDB4OUYsIDB4NkYsIDB4MUYsIDB4RkUsIDB4N0UsIDB4RkQsIDB4RjIsIDB4MTAsCisgICAgMHg3RSwgMHg3RSwgMHg3RiwgMHhGQywgMHhGMSwgMHhDOCwgMHg3MiwgMHhGQSwgMHgzOSwgMHg5MSwgMHhGQiwgMHg0NCwKKyAgICAweDhFLCAweDE2LCAweEQxLCAweDU4LCAweDg0LCAweEIxLCAweEQyLCAweDRDLCAweDI0LCAweDlELCAweDA4LCAweEM5LAorICAgIDB4MDgsIDB4MDcsIDB4NDYsIDB4MjQsIDB4NzgsIDB4MTIsIDB4QkMsIDB4MDAsIDB4MzgsIDB4NTYsIDB4NkIsIDB4NjcsCisgICAgMHg0QSwgMHhGOCwgMHg5QywgMHg1MSwgMHhEOSwgMHhDNywgMHg0NSwgMHg3OCwgMHhGRiwgMHg5RSwgMHhDMiwgMHgyRiwKKyAgICAweDZFLCAweEFFLCAweEU3LCAweEIyLCAweDJELCAweDExLCAweDExLCAweDE5LCAweDFCLCAweDIwLCAweDAxLCAweDZFLAorICAgIDB4RDgsIDB4NDIsIDB4NjUsIDB4MDYsIDB4MzYsIDB4NEQsIDB4MTksIDB4NkYsIDB4MDMsIDB4QzMsIDB4OTAsIDB4MjYsCisgICAgMHg2NiwgMHg1OSwgMHg3MSwgMHhGMywgMHhERCwgMHg0NCwgMHg2MywgMHgzQSwgMHg0QiwgMHg2OCwgMHgzNCwgMHg5NiwKKyAgICAweEQ0LCAweEM4LCAweDA4LCAweDJGLCAweDExLCAweDZELCAweDM4LCAweDE3LCAweEYzLCAweDc2LCAweDgxLCAweDdGLAorICAgIDB4NzMsIDB4RUQsIDB4RTksIDB4MTksIDB4NUMsIDB4MzMsIDB4QTksIDB4MjQsIDB4MkUsIDB4MjMsIDB4NDQsIDB4QzYsCisgICAgMHg2MywgMHhCOSwgMHg2QiwgMHgzRCwgMHhCMSwgMHhFQSwgMHhERSwgMHhEOSwgMHhFRCwgMHhDRSwgMHg5OSwgMHhGMCwKKyAgICAweDJBLCAweERGLCAweERBLCAweDk4LCAweDc3LCAweEIwLCAweENELCAweDk0LCAweEFGLCAweDM2LCAweENELCAweEU0LAorICAgIDB4ODIsIDB4NjEsIDB4MjYsIDB4MDgsIDB4NkUsIDB4OTksIDB4NjAsIDB4RUUsIDB4OTQsIDB4QkQsIDB4REEsIDB4MjUsCisgICAgMHg5RiwgMHgyQywgMHhENCwgMHg2MywgMHgwNSwgMHgyQiwgMHhDNywgMHg2NywgMHgxMSwgMHhFMSwgMHg1RSwgMHgwMCwKKyAgICAweEFFLCAweEU2LCAweDUxLCAweDkxLCAweDc2LCAweEMyLCAweDk0LCAweEZCLCAweEFDLCAweDgxLCAweDgwLCAweDI1LAorICAgIDB4M0EsIDB4NDIsIDB4QTUsIDB4MjcsIDB4QTksIDB4MDYsIDB4NEUsIDB4NjksIDB4QUEsIDB4MjEsIDB4NzMsIDB4NzgsCisgICAgMHhDQywgMHgwRCwgMHg1QSwgMHgwQywgMHhGNywgMHhBRiwgMHg0MSwgMHhCOCwgMHg2QSwgMHhBOSwgMHhENiwgMHg1RSwKKyAgICAweDZELCAweDBCLCAweDU1LCAweDlGLCAweEI2LCAweERFLCAweEEzLCAweEFELCAweEI3LCAweDY4LCAweEVCLCAweDFELAorICAgIDB4REEsIDB4N0EsIDB4NzcsIDB4QjYsIDB4REUsIDB4OUMsIDB4QUQsIDB4MzcsIDB4NjYsIDB4QjcsIDB4QjcsIDB4MDUsCisgICAgMHhDNSwgMHg5OCwgMHhDRiwgMHg2OCwgMHg1NCwgMHhCRSwgMHg5MSwgMHgyQSwgMHg3NCwgMHhGNiwgMHg1QywgMHhGMCwKKyAgICAweEI3LCAweDBDLCAweDZBLCAweDNDLCAweDY3LCAweEE4LCAweDI1LCAweDcwLCAweEIzLCAweDAyLCAweDIwLCAweDU0LAorICAgIDB4MTIsIDB4NTUsIDB4MEQsIDB4NTYsIDB4RjAsIDB4N0MsIDB4RDksIDB4RTgsIDB4OTksIDB4QkQsIDB4QkQsIDB4MEYsCisgICAgMHhGNywgMHhDRiwgMHhDMywgMHgyMiwgMHhFRiwgMHg5MCwgMHg5OSwgMHg4RSwgMHhFMiwgMHg0QSwgMHg5NiwgMHgwNywKKyAgICAweERBLCAweDM5LCAweDUyLCAweENDLCAweDkxLCAweEQwLCAweDIxLCAweDQ5LCAweDEyLCAweDJBLCAweEY5LCAweDcyLAorICAgIDB4OEYsIDB4QUIsIDB4QTgsIDB4M0MsIDB4OTgsIDB4RDIsIDB4MzAsIDB4QjQsIDB4OUMsIDB4NDMsIDB4QjgsIDB4RDAsCisgICAgMHgwMSwgMHg3MiwgMHhFMSwgMHg0MiwgMHg2RiwgMHhFMCwgMHhDQSwgMHhBNywgMHhBRCwgMHg5OCwgMHg1QSwgMHgxOSwKKyAgICAweDI1LCAweDBDLCAweDA1LCAweDlGLCAweDU4LCAweENFLCAweERELCAweDM0LCAweEIwLCAweENGLCAweDRBLCAweDgyLAorICAgIDB4M0EsIDB4RjEsIDB4RTMsIDB4NDAsIDB4QzgsIDB4MDQsIDB4MTQsIDB4MDcsIDB4RDgsIDB4NzUsIDB4NzEsIDB4OEIsCisgICAgMHgwMiwgMHgzNywgMHhBNiwgMHgwMywgMHgyMCwgMHg2MSwgMHg1MSwgMHg2RCwgMHhEQSwgMHg1QSwgMHhENCwgMHg5OCwKKyAgICAweDc2LCAweDMwLCAweEQ4LCAweDQ0LCAweDAxLCAweERBLCAweDg0LCAweDJFLCAweENFLCAweEZCLCAweEI4LCAweDQ2LAorICAgIDB4RDIsIDB4MkEsIDB4MzQsIDB4MDYsIDB4MUQsIDB4MEMsIDB4NzYsIDB4NUMsIDB4NzcsIDB4NjcsIDB4MzQsIDB4RUEsCisgICAgMHgyNCwgMHg1OSwgMHhDRSwgMHg1OSwgMHgyQSwgMHgzQSwgMHhGMCwgMHhENSwgMHg5QywgMHg0QiwgMHg4NSwgMHg0MSwKKyAgICAweEM3LCAweDhELCAweEExLCAweDk0LCAweDRGLCAweDY3LCAweDgwLCAweDk1LCAweEJCLCAweDdDLCAweDRDLCAweERDLAorICAgIDB4RTksIDB4RTUsIDB4MjAsIDB4OEEsIDB4NDcsIDB4ODcsIDB4MDcsIDB4NDcsIDB4NTcsIDB4QUYsIDB4REYsIDB4MDUsCisgICAgMHgyNywgMHhEOSwgMHg3OSwgMHhFMSwgMHg0QywgMHg5RCwgMHgwNCwgMHgzQSwgMHg5RSwgMHg0NiwgMHg2MywgMHgyQSwKKyAgICAweDZGLCAweEVELCAweDY5LCAweEM0LCAweEFBLCAweDEzLCAweEMwLCAweEUwLCAweEMxLCAweEY0LCAweDJDLCAweDI3LAorICAgIDB4REIsIDB4Q0EsIDB4QjIsIDB4OUUsIDB4OUQsIDB4NjUsIDB4NTksIDB4MUYsIDB4MzcsIDB4NzgsIDB4NDYsIDB4MjEsCisgICAgMHgyNSwgMHhGNCwgMHg1MiwgMHgyOSwgMHgyOSwgMHhGNywgMHgxNiwgMHhBNSwgMHhCMiwgMHhENywgMHg0MywgMHgwRiwKKyAgICAweDNBLCAweDRBLCAweDY3LCAweDcwLCAweDc2LCAweDUwLCAweDlFLCAweDI4LCAweEU1LCAweDQ2LCAweDhCLCAweDBBLAorICAgIDB4NkIsIDB4QUQsIDB4NTcsIDB4ODUsIDB4Q0EsIDB4RTksIDB4MUEsIDB4QTEsIDB4MkEsIDB4RUIsIDB4NTMsIDB4MEYsCisgICAgMHg0RSwgMHgzMywgMHhEOCwgMHhFRSwgMHhBRCwgMHg1MiwgMHg1RiwgMHhBNCwgMHg3NSwgMHg3NSwgMHhGNSwgMHg2RiwKKyAgICAweDJCLCAweEQyLCAweDE5LCAweENCLCAweEI3LCAweEZBLCAweEU3LCAweEE3LCAweDRFLCAweDgyLCAweEFBLCAweEVELAorICAgIDB4OEQsIDB4NEUsIDB4RjQsIDB4ODgsIDB4RjEsIDB4MzQsIDB4QjYsIDB4OUMsIDB4RUQsIDB4NEUsIDB4RTQsIDB4OEMsCisgICAgMHg0QSwgMHg2MSwgMHgzOSwgMHg4RiwgMHg0RCwgMHgyRSwgMHg2RSwgMHhDRSwgMHgwRCwgMHg0OCwgMHg2OSwgMHg3QywKKyAgICAweDY1LCAweDQ1LCAweDEzLCAweDI4LCAweDlGLCAweEIwLCAweDY1LCAweDYwLCAweDM5LCAweEJGLCAweERFLCAweDdGLAorICAgIDB4ODYsIDB4NjMsIDB4QTIsIDB4QzEsIDB4MzAsIDB4OEIsIDB4MjgsIDB4MEQsIDB4OEIsIDB4NDUsIDB4QkUsIDB4ODAsCisgICAgMHhEMywgMHhFMSwgMHhFNSwgMHg2OSwgMHg2NywgMHg1MSwgMHhERCwgMHg3NSwgMHg1MywgMHg4MiwgMHhGNSwgMHg2RSwKKyAgICAweEYzLCAweEQ3LCAweDYxLCAweDMxLCAweEEzLCAweDE3LCAweEM0LCAweENCLCAweDRGLCAweEJFLCAweDcyLCAweEE5LAorICAgIDB4NkEsIDB4QjksIDB4MEIsIDB4RjgsIDB4RkEsIDB4RjEsIDB4RDEsIDB4MTAsIDB4QkMsIDB4QzAsIDB4NzUsIDB4NjYsCisgICAgMHg5OSwgMHg2NiwgMHg5QywgMHgwOSwgMHhCRSwgMHgzMiwgMHhCRCwgMHgyRiwgMHhEMiwgMHhGQywgMHgzQiwgMHgwOCwKKyAgICAweDhELCAweDEyLCAweEJGLCAweDM1LCAweEJGLCAweEU3LCAweDhCLCAweDMxLCAweDQ1LCAweDQzLCAweEY2LCAweDFGLAorICAgIDB4QzIsIDB4ODAsIDB4QzIsIDB4NTcsIDB4QzYsIDB4RDUsIDB4MUEsIDB4QzIsIDB4OUUsIDB4MjQsIDB4NjMsIDB4NzgsCisgICAgMHg2MywgMHg1NiwgMHgxMywgMHhDRSwgMHgwMiwgMHhDMiwgMHg1QSwgMHhEMywgMHgyNywgMHgyMiwgMHg0QiwgMHgyRiwKKyAgICAweDA5LCAweDNBLCAweDE2LCAweDQ5LCAweEMwLCAweEJDLCAweDdDLCAweDhFLCAweEVELCAweDU3LCAweDRGLCAweDkxLAorICAgIDB4QkIsIDB4OEUsIDB4MEEsIDB4MjMsIDB4N0IsIDB4ODEsIDB4MjgsIDB4QTksIDB4QTcsIDB4NkIsIDB4NkUsIDB4MEEsCisgICAgMHhDQywgMHg0OSwgMHgzRSwgMHgxOSwgMHg3QSwgMHhCRSwgMHg4NiwgMHgzNCwgMHgxMiwgMHgxRCwgMHg0OCwgMHhFRSwKKyAgICAweDIyLCAweEU1LCAweDkzLCAweEE5LCAweDU4LCAweEYyLCAweDU0LCAweDczLCAweEY4LCAweDc2LCAweENGLCAweEYyLAorICAgIDB4QTgsIDB4RjgsIDB4RDIsIDB4ODUsIDB4RTUsIDB4M0YsIDB4NUQsIDB4NDksIDB4QkUsIDB4MUJ9OworY29uc3QgdWludDhfdCBnX2l0SVRfTG9jYWxlW10gPSB7CisgICAgMHg3OCwgMHg5QywgMHg5NSwgMHg1NiwgMHhEMSwgMHg2QSwgMHhENCwgMHg0MCwgMHgxNCwgMHg3RCwgMHgxNywgMHhGQywKKyAgICAweDg3LCAweDIxLCAweDU4LCAweDUwLCAweDY4LCAweDNCLCAweEZBLCAweEQ4LCAweDkyLCAweDA2LCAweDRBLCAweDVCLAorICAgIDB4QkIsIDB4QTUsIDB4NDYsIDB4OTYsIDB4RUUsIDB4QUEsIDB4RDgsIDB4MTcsIDB4OTksIDB4NjQsIDB4QTYsIDB4RDksCisgICAgMHhCMSwgMHhDOSwgMHhDQywgMHgzMiwgMHg0OSwgMHg1QSwgMHg5MiwgMHg0NywgMHhGMSwgMHhDMSwgMHgzNywgMHg3RiwKKyAgICAweDQyLCAweDEwLCAweDQxLCAweEYxLCAweDIzLCAweEZDLCAweDEzLCAweEExLCAweEUyLCAweDY3LCAweDc4LCAweEIzLAorICAgIDB4OTksIDB4QTQsIDB4QzksIDB4NjQsIDB4QkEsIDB4QTYsIDB4NzksIDB4RDksIDB4QjksIDB4RTcsIDB4OUUsIDB4NzMsCisgICAgMHg3MywgMHhFRiwgMHg5OSwgMHg2NCwgMHgzNiwgMHg2RSwgMHgyQywgMHg0MywgMHgxMiwgMHgzMywgMHgyNCwgMHg0OCwKKyAgICAweEMyLCAweEY2LCAweDFDLCAweDlFLCAweEJELCAweDNCLCAweDk5LCAweDNCLCAweDg4LCAweEIyLCAweDM0LCAweERDLAorICAgIDB4NzMsIDB4RkUsIDB4N0MsIDB4RkMsIDB4N0MsIDB4RjMsIDB4RTUsIDB4RUIsIDB4Q0QsIDB4QTcsIDB4NkYsIDB4N0YsCisgICAgMHg3RiwgMHhGRSwgMHg3OCwgMHhEQywgMHgwNiwgMHg0RiwgMHgxQywgMHhDRiwgMHhBRCwgMHgxNCwgMHg4MiwgMHgxMiwKKyAgICAweDM1LCAweDJCLCAweDkyLCAweDQwLCAweEM2LCAweEE5LCAweDE2LCAweDQ3LCAweDhBLCAweDQ1LCAweDUyLCAweDcxLAorICAgIDB4MjIsIDB4ODAsIDB4OTEsIDB4NDgsIDB4OTEsIDB4MkQsIDB4NUUsIDB4MDIsIDB4OUMsIDB4RUEsIDB4QjUsIDB4MTcsCisgICAgMHgzMSwgMHgyMSwgMHgwOCwgMHg5NywgMHgyRSwgMHhBRSwgMHhDMywgMHg4NywgMHgwRiwgMHgzNCwgMHg3RSwgMHhDMSwKKyAgICAweDgyLCAweDQwLCAweEQ5LCAweDEyLCAweDA5LCAweDUxLCAweEU1LCAweDEwLCAweDI1LCAweDRCLCAweEM1LCAweDYzLAorICAgIDB4NjYsIDB4MjEsIDB4NDcsIDB4OTEsIDB4QTUsIDB4NDYsIDB4QzQsIDB4RjMsIDB4NDgsIDB4MEMsIDB4RTEsIDB4MzgsCisgICAgMHg4RiwgMHg2MiwgMHgwQiwgMHg5QiwgMHg0NCwgMHgzMiwgMHhDRCwgMHg4NiwgMHg3MCwgMHhDQSwgMHhCMiwgMHg4QywKKyAgICAweDI1LCAweDgxLCAweDFBLCAweERFLCAweDU1LCAweDY2LCAweDk5LCAweEI0LCAweEUxLCAweDQyLCAweDVFLCAweEQ5LAorICAgIDB4MDUsIDB4OTQsIDB4ODcsIDB4NjYsIDB4MDIsIDB4NzcsIDB4QUMsIDB4NkEsIDB4NzgsIDB4QUIsIDB4MDgsIDB4MTEsCisgICAgMHgzMCwgMHg2NiwgMHhDRiwgMHg3OSwgMHhFNiwgMHg3NCwgMHgxQywgMHhCNCwgMHhCOSwgMHg2NywgMHgzMywgMHhDRSwKKyAgICAweDY2LCAweDlCLCAweENELCAweDMzLCAweDlCLCAweDYxLCAweDM2LCAweEI3LCAweDZDLCAweDU2LCAweEQ5LCAweDdDLAorICAgIDB4QjIsIDB4MzksIDB4NjQsIDB4NzMsIDB4QzcsIDB4NjYsIDB4Q0MsIDB4REQsIDB4OUUsIDB4NTAsIDB4NTIsIDB4RTgsCisgICAgMHg0NywgMHgwOSwgMHg1NiwgMHgxRSwgMHg5NSwgMHgwOSwgMHgxMywgMHgzQywgMHgyNCwgMHgyRSwgMHhBRSwgMHhBMiwKKyAgICAweDNBLCAweDBELCAweDNELCAweDBBLCAweDQ2LCAweDdGLCAweDdELCAweEVGLCAweDYxLCAweEUwLCAweDQzLCAweDM2LAorICAgIDB4MDQsIDB4OTksIDB4MEEsIDB4NjUsIDB4M0MsIDB4ODAsIDB4RTEsIDB4RTEsIDB4QjksIDB4MUEsIDB4ODAsIDB4NTcsCisgICAgMHg0QywgMHgzMCwgMHg2NSwgMHg4MiwgMHgyOSwgMHgwOSwgMHg0OCwgMHhGNSwgMHg5MCwgMHg2OCwgMHgwOCwgMHhCNywKKyAgICAweENELCAweDc1LCAweDFBLCAweEVELCAweDZDLCAweDlELCAweEVFLCAweEQ4LCAweDZDLCAweEQ2LCAweDZDLCAweEQ0LAorICAgIDB4RUMsIDB4RDEsIDB4NkMsIDB4Q0UsIDB4RUMsIDB4Q0IsIDB4NkMsIDB4QzksIDB4REUsIDB4MEYsIDB4MTQsIDB4RTIsCisgICAgMHg5NCwgMHhCMywgMHhBNCwgMHg3OSwgMHgxMSwgMHg3NSwgMHhFOCwgMHhFRCwgMHhGQiwgMHg2MCwgMHg3MSwgMHgxMywKKyAgICAweDc0LCAweDc4LCAweERFLCAweEQ0LCAweDQ4LCAweEUwLCAweDdFLCAweDA1LCAweDQwLCAweDk4LCAweDIyLCAweEJBLAorICAgIDB4MUEsIDB4QUMsIDB4M0MsIDB4NzIsIDB4RTAsIDB4RTIsIDB4RUEsIDB4QjcsIDB4NEUsIDB4NzgsIDB4RjQsIDB4MzYsCisgICAgMHhDNCwgMHgyRCwgMHhCMSwgMHgwQSwgMHg4QywgMHgwMywgMHhBMywgMHg2RSwgMHgzQywgMHg2MywgMHg1MywgMHgwMiwKKyAgICAweDZGLCAweDk2LCAweDEyLCAweEFCLCAweDhELCAweDZELCAweDIzLCAweDdELCAweDlBLCAweDVDLCAweEU0LCAweDcxLAorICAgIDB4RUMsIDB4NzgsIDB4NDcsIDB4NzAsIDB4QTEsIDB4NDMsIDB4RTQsIDB4QzMsIDB4ODUsIDB4REUsIDB4QzIsIDB4NTUsCisgICAgMHhDRCwgMHhENywgMHgzMiwgMHg4RCwgMHgzMiwgMHg1QSwgMHgxOCwgMHg0QiwgMHgxMSwgMHgzOSwgMHhERSwgMHhFMSwKKyAgICAweEZELCAweDQ0LCAweDA5LCAweEEzLCAweDk1LCAweDA2LCAweDgzLCAweDA0LCAweDhGLCAweDEyLCAweEE0LCAweDBCLAorICAgIDB4QTksIDB4MzIsIDB4MkQsIDB4QjEsIDB4MjksIDB4NzAsIDB4NkYsIDB4M0UsIDB4MDAsIDB4MzIsIDB4OUUsIDB4NzQsCisgICAgMHhFNiwgMHhFRCwgMHg0NCwgMHhCRCwgMHg3OSwgMHgyNywgMHg5MywgMHg1RCwgMHhERiwgMHhERiwgMHg5RCwgMHhDRCwKKyAgICAweEQwLCAweEI5LCAweDhCLCAweDNCLCAweDFDLCAweEEzLCAweDQwLCAweDZGLCAweEQyLCAweEZCLCAweDI4LCAweDU2LAorICAgIDB4NjMsIDB4MzYsIDB4RjcsIDB4MTgsIDB4QzEsIDB4RDcsIDB4NTMsIDB4QUUsIDB4MTQsIDB4MDMsIDB4M0EsIDB4RUUsCisgICAgMHg4RCwgMHhBNCwgMHg1RCwgMHg5QSwgMHgwMywgMHhENiwgMHhFQywgMHhGMiwgMHg3MSwgMHhFMSwgMHhEMywgMHhDQiwKKyAgICAweDQ5LCAweDkyLCAweENFLCAweDhFLCAweDBFLCAweDlGLCAweDVGLCAweEJGLCAweDIxLCAweDhCLCAweEQzLCAweEYyLAorICAgIDB4QkMsIDB4RjYsIDB4QTUsIDB4NEIsIDB4MDIsIDB4OUQsIDB4QzgsIDB4OTMsIDB4ODAsIDB4QTksIDB4NUIsIDB4NzMsCisgICAgMHg3QSwgMHhCMSwgMHhFRSwgMHgwNCwgMHgzMCwgMHg3OCwgMHgxNCwgMHg0MywgMHhDNywgMHgyQiwgMHgzNywgMHhDQiwKKyAgICAweDcyLCAweDY3LCAweEJCLCAweDJDLCAweDRCLCAweDE3LCAweEY3LCAweDc4LCAweDgzLCAweDQyLCAweDVBLCAweDE4LAorICAgIDB4RTYsIDB4NEEsIDB4MzEsIDB4MTEsIDB4MTYsIDB4OEUsIDB4RjcsIDB4MDgsIDB4RDUsIDB4REEsIDB4OUQsIDB4OUQsCisgICAgMHg5MSwgMHhEMiwgMHgyNSwgMHg5QywgMHgxNSwgMHg0QywgMHg2NCwgMHhGQSwgMHg5RSwgMHgxQiwgMHgxNiwgMHgxNSwKKyAgICAweDM2LCAweDVBLCAweDZGLCAweDBCLCAweDM1LCAweEQzLCAweEY1LCAweDQyLCAweDVELCAweDk2LCAweEIyLCAweDkwLAorICAgIDB4MjcsIDB4MDQsIDB4MzYsIDB4N0IsIDB4QjMsIDB4RDEsIDB4RDcsIDB4NjksIDB4NTMsIDB4REQsIDB4RkUsIDB4QUQsCisgICAgMHhDQSwgMHg3QywgMHhDOSwgMHhBQiwgMHg5RCwgMHhERSwgMHgxRSwgMHhDNSwgMHg2RiwgMHhCQiwgMHhERSwgMHgxOCwKKyAgICAweDQ1LCAweDRGLCAweEI4LCAweEM4LCAweDUzLCAweEM3LCAweERCLCAweDFBLCAweDQ1LCAweDJFLCAweDk5LCAweDkyLAorICAgIDB4OEUsIDB4RjcsIDB4NzQsIDB4QzgsIDB4QzUsIDB4RkQsIDB4QjEsIDB4MDEsIDB4NjksIDB4N0MsIDB4NkYsIDB4OUQsCisgICAgMHhFOCwgMHgwMywgMHhDRCwgMHgwMywgMHhCNiwgMHgwQSwgMHgxQywgMHhFRiwgMHhGNywgMHgwNywgMHgzOCwgMHg2NSwKKyAgICAweEZCLCAweDhDLCAweDYxLCAweDkxLCAweEU2LCAweDIzLCAweDI1LCAweDk1LCAweEQ1LCAweDAyLCAweDBFLCAweDg3LAorICAgIDB4NTcsIDB4NjcsIDB4QTMsIDB4NDUsIDB4NUQsIDB4RDMsIDB4ODcsIDB4MTIsIDB4NkMsIDB4NzYsIDB4NUIsIDB4QkQsCisgICAgMHgwRCwgMHhDNSwgMHg5MiwgMHg1RCwgMHg5MCwgMHhCMCwgMHgzQSwgMHhFQSwgMHg5QSwgMHhBNSwgMHhBRSwgMHhFNSwKKyAgICAweDE3LCAweEYwLCAweDk1LCAweDQzLCAweEQxLCAweDE0LCAweEJDLCAweEMwLCAweDVELCAweDY2LCAweDkzLCAweEU2LAorICAgIDB4ODIsIDB4NEIsIDB4NzEsIDB4NjcsIDB4RkEsIDB4NDAsIDB4RTYsIDB4OEEsIDB4MzMsIDB4ODUsIDB4NjYsIDB4MTksCisgICAgMHhCNSwgMHhFNiwgMHhGNywgMHhBOSwgMHgwQywgMHgxOCwgMHg5QSwgMHhGMiwgMHhGRiwgMHgxMCwgMHgyNiwgMHgwQywKKyAgICAweEJFLCAweDIzLCAweEFFLCAweEQ3LCAweDEwLCAweEY2LCAweDE1LCAweDA5LCAweEUwLCAweDg1LCAweEI5LCAweDlCLAorICAgIDB4MzAsIDB4NUYsIDB4MTAsIDB4NkUsIDB4NEQsIDB4OUYsIDB4Q0EsIDB4MzIsIDB4QkYsIDB4MjQsIDB4RTgsIDB4NTgsCisgICAgMHg2NiwgMHgwQiwgMHgxRSwgMHg1NiwgMHg3MywgMHg2QywgMHhCRCwgMHgzRSwgMHg0MSwgMHhGRSwgMHgzQSwgMHgyQSwKKyAgICAweDhDLCAweDFDLCAweDJFLCAweDY0LCAweDQzLCAweDNELCAweDVCLCAweDczLCAweDUzLCAweDYwLCAweDQ2LCAweEQ1LAorICAgIDB4NjQsIDB4RTgsIDB4QzUsIDB4MUEsIDB4RDIsIDB4NEMsIDB4OEUsIDB4MjAsIDB4RjksIDB4NDUsIDB4MkUsIDB4QTIsCisgICAgMHhGNywgMHg3MiwgMHhDNSwgMHhEMywgMHhDRCwgMHhFMSwgMHhEQiwgMHgzRCwgMHhBQiwgMHhBMiwgMHhGQSwgMHhEMywKKyAgICAweDE2LCAweDk2LCAweEZGLCAweDAwLCAweDIwLCAweDhCLCAweEJFLCAweEY3fTsKK2NvbnN0IHVpbnQ4X3QgZ19wdEJSX0xvY2FsZVtdID0geworICAgIDB4NzgsIDB4OUMsIDB4OUQsIDB4NTYsIDB4M0QsIDB4NkYsIDB4RDQsIDB4NDAsIDB4MTAsIDB4QUQsIDB4ODMsIDB4QzQsCisgICAgMHg3RiwgMHg1OCwgMHg1OSwgMHg4OSwgMHgwRSwgMHhBNCwgMHgyNCwgMHg4NiwgMHg5MiwgMHhDOCwgMHg2NywgMHhFOSwKKyAgICAweDkyLCAweDBCLCAweDM5LCAweDk0LCAweDE4LCAweDlELCAweENFLCAweDExLCAweDg4LCAweDM0LCAweDY4LCAweDZELAorICAgIDB4RUYsIDB4RDksIDB4OUIsIDB4RDgsIDB4QkIsIDB4QzcsIDB4REEsIDB4NEUsIDB4QjAsIDB4NkIsIDB4MUEsIDB4M0EsCisgICAgMHgyOCwgMHgyOSwgMHg1MywgMHgyMCwgMHgyQSwgMHg0NCwgMHg4MywgMHg0NCwgMHg0OSwgMHg5MSwgMHhERiwgMHg4MiwKKyAgICAweEI4LCAweDlGLCAweEMxLCAweEZBLCAweEYzLCAweEZDLCAweEIxLCAweDM2LCAweDA2LCAweDM3LCAweERFLCAweDk5LAorICAgIDB4NzksIDB4NkYsIDB4M0QsIDB4RjMsIDB4NzYsIDB4NzYsIDB4NjQsIDB4QzUsIDB4QTUsIDB4MjYsIDB4NzQsIDB4MTEsCisgICAgMHgyMCwgMHhEMCwgMHg0MywgMHg2MywgMHg2OSwgMHgxNSwgMHhCQywgMHgzRSwgMHg1QywgMHg0OCwgMHhDMCwgMHg0MiwKKyAgICAweEJFLCAweDM5LCAweDk2LCAweEQ2LCAweDFGLCAweDZGLCAweEQ3LCAweDFGLCAweERFLCAweEZELCAweDdFLCAweEZGLAorICAgIDB4NjksIDB4RkQsIDB4RUQsIDB4RUIsIDB4ODMsIDB4NUYsIDB4M0YsIDB4QkUsIDB4QUYsIDB4M0YsIDB4RkYsIDB4N0MsCisgICAgMHgyOCwgMHhBOSwgMHhGNywgMHhFRiwgMHgwMSwgMHhBMCwgMHgyNCwgMHgxNCwgMHg2MiwgMHg0MSwgMHhBNiwgMHg0NywKKyAgICAweDlFLCAweDQxLCAweDVELCAweDNGLCAweDY3LCAweERCLCAweDBDLCAweEQ5LCAweDk0LCAweDYxLCAweDQ4LCAweDEyLAorICAgIDB4RDQsIDB4MTYsIDB4NTAsIDB4M0MsIDB4NEEsIDB4MDIsIDB4RTcsIDB4MzksIDB4MEYsIDB4RjksIDB4ODksIDB4QkQsCisgICAgMHg5NSwgMHhEOSwgMHhFQSwgMHgyNSwgMHgyNCwgMHgwOCwgMHgzMywgMHhBQSwgMHhDOCwgMHg5OSwgMHg1OSwgMHg4OSwKKyAgICAweDJDLCAweEQxLCAweDM1LCAweDYyLCAweDFELCAweDMxLCAweDBGLCAweEIyLCAweEJCLCAweDJGLCAweEEyLCAweDAwLAorICAgIDB4MzQsIDB4MTgsIDB4NzYsIDB4ODUsIDB4MDQsIDB4MkMsIDB4ODIsIDB4NUYsIDB4ODYsIDB4QzQsIDB4MTEsIDB4RkIsCisgICAgMHg1RCwgMHhBMSwgMHgxRiwgMHhEQSwgMHhENCwgMHgwRiwgMHg0NCwgMHgwMSwgMHgxRiwgMHgwNSwgMHhDOCwgMHgzMywKKyAgICAweDg0LCAweEI5LCAweEQyLCAweDMwLCAweDA4LCAweEM1LCAweDExLCAweDQyLCAweEFGLCAweEJCLCAweDQ4LCAweDE2LAorICAgIDB4OEEsIDB4OUIsIDB4MjEsIDB4OTAsIDB4QUYsIDB4NEIsIDB4MDksIDB4QUIsIDB4OTIsIDB4MDIsIDB4NjgsIDB4MTgsCisgICAgMHg2QywgMHgyQywgMHgzRCwgMHg5NiwgMHgxQSwgMHhEQSwgMHg4QSwgMHg3NSwgMHgxNSwgMHgyQiwgMHgyQSwgMHg5NiwKKyAgICAweDUzLCAweDJDLCAweEE2LCAweDU4LCAweDRCLCAweEIxLCAweDkyLCAweDYyLCAweDFELCAweEM1LCAweDIyLCAweDhBLAorICAgIDB4RjUsIDB4MTMsIDB4NkIsIDB4MjcsIDB4OTYsIDB4QUQsIDB4NUYsIDB4MzEsIDB4MEIsIDB4NDYsIDB4OTUsIDB4MTYsCisgICAgMHhFNCwgMHg5NiwgMHg2QSwgMHg1MSwgMHgwRiwgMHg5MywgMHgyNCwgMHg5RCwgMHhDNCwgMHgyOCwgMHhCRCwgMHgzRSwKKyAgICAweEIyLCAweDQzLCAweERFLCAweEQyLCAweDdCLCAweDRCLCAweERFLCAweDgwLCAweEIwLCAweDExLCAweDBCLCAweDEwLAorICAgIDB4NkYsIDB4M0UsIDB4NzEsIDB4RTgsIDB4NEQsIDB4MDgsIDB4NTksIDB4RDAsIDB4MTUsIDB4QzIsIDB4QTQsIDB4MjMsCisgICAgMHhFNCwgMHhBMywgMHhCNywgMHg1RCwgMHg5MSwgMHhCQiwgMHg1QiwgMHgwMywgMHg1QSwgMHg5QiwgMHhFNCwgMHg0MCwKKyAgICAweEJBLCAweDEyLCAweEQ0LCAweEQzLCAweDM4LCAweEZGLCAweEJDLCAweEIwLCAweDc2LCAweDUxLCAweEVELCAweDUyLAorICAgIDB4REEsIDB4MTUsIDB4QjQsIDB4MTMsIDB4NkYsIDB4RTcsIDB4MkIsIDB4QzgsIDB4QjMsIDB4M0IsIDB4NDksIDB4MEYsCisgICAgMHgzMSwgMHg2QywgMHg2MSwgMHhFNCwgMHg1NSwgMHgyRiwgMHg3RiwgMHhFRSwgMHg1MiwgMHgyNywgMHgxQSwgMHgzRiwKKyAgICAweEE0LCAweEMyLCAweEE4LCAweDg3LCAweEU2LCAweDhELCAweDEwLCAweEQ4LCAweDk4LCAweDk1LCAweENELCAweDExLAorICAgIDB4ODMsIDB4OTUsIDB4N0QsIDB4QjksIDB4QTUsIDB4MUUsIDB4MUUsIDB4MjksIDB4NzIsIDB4RjIsIDB4MkUsIDB4MUQsCisgICAgMHg5MywgMHg2OSwgMHhFOSwgMHgwMCwgMHhFOSwgMHhBQSwgMHgyMCwgMHhGMCwgMHhEOSwgMHgyNSwgMHgzNywgMHg4NiwKKyAgICAweDU3LCAweEU2LCAweEI1LCAweDYwLCAweDgwLCAweEU2LCAweDMwLCAweEUwLCAweEYyLCAweDkwLCAweDUyLCAweEU4LAorICAgIDB4RDIsIDB4OTMsIDB4Q0YsIDB4QjcsIDB4NjUsIDB4RTgsIDB4QkEsIDB4OTIsIDB4N0EsIDB4Q0MsIDB4OUYsIDB4NUQsCisgICAgMHgzMCwgMHgxRCwgMHhGMSwgMHgyOSwgMHgwOSwgMHg0NiwgMHgxQSwgMHg3RiwgMHhCMiwgMHhENSwgMHgyQiwgMHhGRSwKKyAgICAweDI0LCAweDMyLCAweDk0LCAweEE0LCAweEFFLCAweDVELCAweDVDLCAweDRBLCAweDZDLCAweDQ5LCAweEZELCAweDdGLAorICAgIDB4QkUsIDB4ODcsIDB4MkMsIDB4NEUsIDB4OUYsIDB4Q0EsIDB4OUEsIDB4MjYsIDB4MEYsIDB4RTYsIDB4RjgsIDB4MEUsCisgICAgMHg2NSwgMHhDMSwgMHg4NiwgMHhENSwgMHhFNCwgMHgwMCwgMHg1MCwgMHhGMywgMHhFNCwgMHg5MiwgMHgwNCwgMHhEOCwKKyAgICAweDZCLCAweDQ4LCAweDUyLCAweEYxLCAweEQ0LCAweDI0LCAweDk5LCAweENELCAweDQ2LCAweDBFLCAweDJGLCAweDY1LAorICAgIDB4QzQsIDB4RUYsIDB4RDUsIDB4NDgsIDB4RDcsIDB4NDcsIDB4RkUsIDB4MDgsIDB4NUMsIDB4MjgsIDB4NzIsIDB4MDUsCisgICAgMHhEQywgMHhDNSwgMHhDRSwgMHhBNCwgMHg0OCwgMHhDOSwgMHgxOSwgMHg3NywgMHgzOCwgMHgzNSwgMHg1NSwgMHg2MSwKKyAgICAweDM2LCAweDNCLCAweEQwLCAweEI0LCAweDAzLCAweDVELCAweDFGLCAweEM0LCAweEM4LCAweDM1LCAweDQ4LCAweDM5LAorICAgIDB4NEQsIDB4NDIsIDB4MjIsIDB4NDAsIDB4QTMsIDB4REMsIDB4QkMsIDB4MjcsIDB4Q0UsIDB4QjksIDB4QjcsIDB4NjgsCisgICAgMHg5NCwgMHg5MywgMHg0OCwgMHhCMywgMHhBRSwgMHg2NiwgMHg5RSwgMHhBRiwgMHgxRiwgMHg0RiwgMHg5RiwgMHhERSwKKyAgICAweEJDLCAweDg0LCAweENFLCAweDY5LCAweDdDLCAweDkxLCAweEU5LCAweDU2LCAweDA1LCAweEE1LCAweDRDLCAweDEyLAorICAgIDB4N0EsIDB4MDYsIDB4NjIsIDB4NzUsIDB4RjEsIDB4NkEsIDB4QkUsIDB4M0MsIDB4MjcsIDB4RUUsIDB4RTMsIDB4RkQsCisgICAgMHg2RCwgMHg0QSwgMHg2QSwgMHhCQywgMHgxQiwgMHhDNywgMHg0RiwgMHhGNiwgMHhFMywgMHg5OCwgMHgwRiwgMHhCMywKKyAgICAweDFBLCAweEFFLCAweDlCLCAweDZBLCAweDg2LCAweDhDLCAweDIxLCAweDYyLCAweDQ2LCAweDkyLCAweEJBLCAweDBELAorICAgIDB4MEEsIDB4RjYsIDB4NjAsIDB4RjIsIDB4MEEsIDB4MzEsIDB4MTMsIDB4OTEsIDB4MjAsIDB4RkYsIDB4RUUsIDB4NEUsCisgICAgMHg5QiwgMHg5NywgMHgwOCwgMHhEMiwgMHgyQSwgMHhBMiwgMHgyQywgMHg2QywgMHg1MywgMHhFQiwgMHg1NiwgMHhERCwKKyAgICAweDk1LCAweDZGLCAweDZGLCAweDIxLCAweDEzLCAweDdCLCAweDkwLCAweDM3LCAweEM2LCAweDZFLCAweEIxLCAweDRCLAorICAgIDB4MTYsIDB4RUUsIDB4MjQsIDB4RDgsIDB4OEMsIDB4ODYsIDB4MkIsIDB4OUMsIDB4MzQsIDB4QzMsIDB4RkUsIDB4NDAsCisgICAgMHg0NiwgMHg1OSwgMHhDMSwgMHhDRSwgMHg0MCwgMHgwMiwgMHhFRiwgMHhBRiwgMHhEMCwgMHg5NywgMHhENCwgMHhCRCwKKyAgICAweDgxLCAweEYwLCAweDE4LCAweDMxLCAweDJBLCAweEE5LCAweDhGLCAweDVBLCAweEU4LCAweDhELCAweDMwLCAweEI1LAorICAgIDB4MDMsIDB4MkYsIDB4NEUsIDB4QTMsIDB4QTYsIDB4NEMsIDB4REQsIDB4NTksIDB4QjQsIDB4NjEsIDB4NkEsIDB4NDgsCisgICAgMHhFQSwgMHg2MiwgMHg5QiwgMHg0RiwgMHhBMiwgMHgxQSwgMHhBMCwgMHg4NywgMHg4NCwgMHg3RCwgMHg5QSwgMHgyQywKKyAgICAweDI0LCAweEY1LCAweDcwLCAweDcxLCAweEY2LCAweDBGLCAweEI0LCAweEVBLCAweDM5LCAweEI0LCAweDQ4LCAweEU5LAorICAgIDB4MjgsIDB4NkMsIDB4QTUsIDB4OUQsIDB4REMsIDB4RkIsIDB4NjgsIDB4ODUsIDB4OTYsIDB4RDAsIDB4MkMsIDB4QzYsCisgICAgMHg2RCwgMHg2MSwgMHhFNiwgMHg3QiwgMHg2QSwgMHgxMSwgMHhGRiwgMHhDMywgMHhCMywgMHhDMCwgMHg5QywgMHhDQiwKKyAgICAweDIzLCAweDhCLCAweDAxLCAweDk4LCAweDYwLCAweDRBLCAweDdBLCAweDAwLCAweDQ3LCAweDM0LCAweDY0LCAweDE4LAorICAgIDB4MzEsIDB4QTAsIDB4MDcsIDB4NTYsIDB4MDcsIDB4NjIsIDB4NjIsIDB4NTEsIDB4MDMsIDB4ODEsIDB4MzksIDB4RkUsCisgICAgMHgyQiwgMHg2NCwgMHg4NiwgMHgwQywgMHg4NiwgMHg2RSwgMHg3QSwgMHgyMSwgMHgxMywgMHgwNiwgMHgwRCwgMHg3RSwKKyAgICAweEMzLCAweEZBLCAweDIwLCAweEU3LCAweDBFLCAweEM0LCAweDFELCAweDgwLCAweDUzLCAweDFBLCAweDg3LCAweDU3LAorICAgIDB4MTAsIDB4OUMsIDB4RDAsIDB4QzAsIDB4QzEsIDB4NjYsIDB4NTIsIDB4RDMsIDB4REUsIDB4OEIsIDB4NjcsIDB4NDAsCisgICAgMHhFQiwgMHgwNywgMHg3MywgMHgwMSwgMHg0QywgMHg4NywgMHgxNiwgMHhFMCwgMHg0NSwgMHhFRiwgMHhBNywgMHgzOSwKKyAgICAweEQ2LCAweDRFLCAweEFBLCAweDA0LCAweDY3LCAweEJELCAweDMwLCAweDlELCAweDBFLCAweDgyLCAweDY5LCAweDUxLAorICAgIDB4NDgsIDB4RUMsIDB4NEIsIDB4OUEsIDB4MjIsIDB4QjMsIDB4MjQsIDB4RDMsIDB4QzEsIDB4NTYsIDB4MzksIDB4NEYsCisgICAgMHg0NSwgMHhDRSwgMHhGRSwgMHhGNywgMHhENSwgMHgzRiwgMHgzMCwgMHhCQiwgMHhEOSwgMHg5Qn07Citjb25zdCB1aW50OF90IGdfbmxOTF9Mb2NhbGVbXSA9IHsKKyAgICAweDc4LCAweDlDLCAweDk1LCAweDU2LCAweDRELCAweDRGLCAweERDLCAweDMwLCAweDEwLCAweDNELCAweDUzLCAweEE5LAorICAgIDB4RkYsIDB4QzEsIDB4OEEsIDB4OEEsIDB4NjgsIDB4MjUsIDB4OTYsIDB4MkQsIDB4NDcsIDB4NTAsIDB4ODgsIDB4QjQsCisgICAgMHgwNSwgMHgwQSwgMHgxNSwgMHgwNCwgMHhBRCwgMHg1OCwgMHhEQSwgMHhBQSwgMHg1QywgMHgyQSwgMHg2RiwgMHg2MiwKKyAgICAweDc2LCAweEJELCAweDI0LCAweEY2LCAweENBLCAweDg5LCAweDQxLCAweEM5LCAweEIxLCAweDUyLCAweDhGLCAweEZELAorICAgIDB4MjcsIDB4QUQsIDB4REEsIDB4NUIsIDB4RkYsIDB4NEYsIDB4QTUsIDB4NEEsIDB4RkMsIDB4OEMsIDB4OEUsIDB4RjMsCisgICAgMHg0NSwgMHgxMiwgMHgzQiwgMHg2OSwgMHhDOCwgMHgwNSwgMHhDRiwgMHg5QiwgMHhGNywgMHhCQywgMHgzMywgMHhDRiwKKyAgICAweENFLCAweDEwLCAweDNCLCAweEUwLCAweDFFLCAweDBFLCAweDA4LCAweDYyLCAweDM4LCAweDI0LCAweDA3LCAweDE2LAorICAgIDB4MEIsIDB4M0UsIDB4NUYsIDB4OUMsIDB4NUIsIDB4QzgsIDB4MjcsIDB4OTEsIDB4NzcsIDB4NjAsIDB4M0QsIDB4N0MsCisgICAgMHhGQiwgMHhGRCwgMHhGNywgMHhFQiwgMHhBRiwgMHg4NywgMHg5RiwgMHgzRiwgMHg1RSwgMHhFNiwgMHhBQiwgMHg1NywKKyAgICAweDk2LCAweEYzLCAweEZDLCAweDE5LCAweDQyLCAweEI2LCAweEUyLCAweDMzLCAweDFGLCAweDhCLCAweDU5LCAweDEyLAorICAgIDB4Q0UsIDB4NzksIDB4MTAsIDB4MTUsIDB4RDIsIDB4ODUsIDB4MjAsIDB4MEIsIDB4MkUsIDB4MjgsIDB4NjYsIDB4OEEsCisgICAgMHhCNSwgMHg4MSwgMHhFQywgMHg5MCwgMHhCMywgMHg3OCwgMHg3OSwgMHgwMSwgMHhBOSwgMHg0OCwgMHhDNSwgMHgxQiwKKyAgICAweDc5LCAweEVDLCAweEFDLCAweDMwLCAweDkzLCAweDU4LCAweDUwLCAweDdCLCAweDlDLCAweDg3LCAweEI1LCAweENDLAorICAgIDB4MEQsIDB4OTksIDB4OEIsIDB4OEUsIDB4NTQsIDB4ODgsIDB4QjEsIDB4ODgsIDB4MEQsIDB4MzgsIDB4NUUsIDB4MEIsCisgICAgMHgxQSwgMHg5OCwgMHhGOCwgMHhDNCwgMHhCNCwgMHhDQiwgMHg0QSwgMHgzMiwgMHgzMywgMHgxQywgMHg5OCwgMHg2MCwKKyAgICAweDJDLCAweDE3LCAweDMyLCAweDhBLCAweDY1LCAweDY0LCAweDQ4LCAweDQ1LCAweDY0LCAweDFELCAweDkzLCAweDcwLAorICAgIDB4NEUsIDB4ODQsIDB4MjEsIDB4QzcsIDB4NkYsIDB4NjMsIDB4NkUsIDB4Q0UsIDB4MzAsIDB4N0UsIDB4RDcsIDB4MjUsCisgICAgMHhGMiwgMHg4OSwgMHhENywgMHg0RSwgMHhBMSwgMHg2MiwgMHg1RCwgMHgxOSwgMHg1OCwgMHgzNywgMHgxNCwgMHhFMSwKKyAgICAweEY5LCAweDVDLCAweDFDLCAweDU4LCAweEJCLCAweDU2LCAweENCLCAweDU5LCAweEIzLCAweEFCLCAweDI2LCAweDgzLAorICAgIDB4QkEsIDB4RUMsIDB4N0MsIDB4OEEsIDB4OTksIDB4NjYsIDB4MkYsIDB4Q0QsIDB4NTYsIDB4OUEsIDB4NUQsIDB4MzQsCisgICAgMHhGQiwgMHg2NywgMHhGNiwgMHhDRSwgMHg2QywgMHg1QiwgMHhCRiwgMHg2MywgMHgzRSwgMHg0RSwgMHg2QSwgMHgxNywKKyAgICAweDEwLCAweDIyLCAweDI3LCAweEU1LCAweDcwLCAweDcxLCAweEExLCAweDFBLCAweEI1LCAweEFFLCAweDQwLCAweEI4LAorICAgIDB4NUUsIDB4MDYsIDB4RDQsIDB4QTcsIDB4MkMsIDB4RDIsIDB4RDEsIDB4N0IsIDB4NEUsIDB4NEMsIDB4QjAsIDB4MEYsCisgICAgMHhGQiwgMHgxMiwgMHhBMSwgMHhFMywgMHg3NywgMHg4MiwgMHhBRSwgMHg3NCwgMHgzNCwgMHhDNSwgMHg3MSwgMHg5MywKKyAgICAweDhDLCAweEIyLCAweDk1LCAweEExLCAweEYyLCAweEQ2LCAweDQ5LCAweEU3LCAweDJELCAweDY4LCAweEU1LCAweDZCLAorICAgIDB4OTUsIDB4NkIsIDB4NDUsIDB4NkIsIDB4RTUsIDB4NkEsIDB4NzUsIDB4NkEsIDB4MjUsIDB4NzYsIDB4MTcsIDB4MTcsCisgICAgMHgxMiwgMHg0MSwgMHg3RCwgMHg0QSwgMHhDMiwgMHhGQSwgMHhDQiwgMHg1RCwgMHg0MCwgMHhDRSwgMHhDNCwgMHg4NSwKKyAgICAweDYzLCAweDI4LCAweDgzLCAweDY2LCAweDZBLCAweERBLCAweDRBLCAweEExLCAweEM3LCAweEIwLCAweEI2LCAweDM5LAorICAgIDB4MTEsIDB4QjgsIDB4QjYsIDB4MkYsIDB4NDQsIDB4Q0UsIDB4OUIsIDB4NDMsIDB4N0IsIDB4QUMsIDB4RkUsIDB4NTYsCisgICAgMHhDMCwgMHhFNCwgMHhBOCwgMHgwMiwgMHg1MCwgMHhCNiwgMHgyQSwgMHgwNSwgMHgzMCwgMHg5QiwgMHhDNiwgMHhBRCwKKyAgICAweEUxLCAweDk0LCAweEEzLCAweDNFLCAweDE4LCAweDNFLCAweEM1LCAweDMxLCAweEI4LCAweENFLCAweDJBLCAweDgzLAorICAgIDB4MkIsIDB4QTQsIDB4OTgsIDB4NUYsIDB4MzcsIDB4MzIsIDB4MDgsIDB4MkMsIDB4RTcsIDB4MTgsIDB4MUUsIDB4NzQsCisgICAgMHg4NCwgMHg1QywgMHg3OCwgMHhEMCwgMHgyNywgMHg3OCwgMHg1NCwgMHhFRiwgMHgxNSwgMHhCMywgMHg0QiwgMHgxQSwKKyAgICAweDcwLCAweEI2LCAweEIwLCAweDlDLCAweEE3LCAweEFBLCAweDQyLCAweEUyLCAweDgzLCAweDY4LCAweDA0LCAweDlBLAorICAgIDB4RDEsIDB4NjAsIDB4NEQsIDB4QjQsIDB4RTQsIDB4MjIsIDB4Q0UsIDB4NTQsIDB4MjMsIDB4NUQsIDB4ODEsIDB4NTAsCisgICAgMHgwMywgMHgyOSwgMHg3QSwgMHg4RiwgMHg2OSwgMHhEOCwgMHhFQSwgMHhCRCwgMHg4NiwgMHgzNCwgMHg3QSwgMHgzRiwKKyAgICAweERELCAweDc3LCAweERELCAweEZELCAweEQ5LCAweDZDLCAweDBCLCAweDQ5LCAweDI5LCAweEI2LCAweEQwLCAweEI1LAorICAgIDB4M0QsIDB4QUUsIDB4MTEsIDB4QkIsIDB4OTQsIDB4NzksIDB4RUIsIDB4ODUsIDB4NzIsIDB4QTAsIDB4MjYsIDB4NkIsCisgICAgMHhCQywgMHg5MCwgMHgwQywgMHgxMiwgMHgxNCwgMHg1RCwgMHgyQiwgMHg0OSwgMHg5QiwgMHhBRiwgMHg3QSwgMHg2RSwKKyAgICAweDc1LCAweDU4LCAweDlDLCAweEY3LCAweDE1LCAweEEwLCAweEU1LCAweDI1LCAweDM4LCAweDQ5LCAweDVDLCAweEZGLAorICAgIDB4RjYsIDB4MzQsIDB4OEMsIDB4NjYsIDB4QzcsIDB4NDcsIDB4NkYsIDB4RUYsIDB4M0YsIDB4RTIsIDB4RTUsIDB4NTksCisgICAgMHg3QSwgMHg5RCwgMHg1QiwgMHg1NSwgMHgyNywgMHg2NSwgMHg0QSwgMHgyNiwgMHhENSwgMHgyMCwgMHg2RSwgMHhGQSwKKyAgICAweEQ1LCAweEMwLCAweENBLCAweDdGLCAweDk0LCAweDUyLCAweERELCAweDVELCAweENGLCAweDcyLCAweEQyLCAweEVELAorICAgIDB4MzQsIDB4REQsIDB4REIsIDB4NDksIDB4RDMsIDB4RDQsIDB4MUUsIDB4MzcsIDB4NzgsIDB4REQsIDB4NTIsIDB4NEYsCisgICAgMHgwQSwgMHg0MSwgMHg5OCwgMHg5NywgMHg1OCwgMHhDRSwgMHgwQiwgMHg5NCwgMHhBQiwgMHhGNywgMHhGNiwgMHhBMiwKKyAgICAweEMxLCAweEVBLCAweDM1LCAweDExLCAweDFFLCAweDYxLCAweDcxLCAweEYxLCAweEMzLCAweDlCLCAweEJBLCAweDRFLAorICAgIDB4MzksIDB4QTIsIDB4NzUsIDB4NTEsIDB4NzUsIDB4RjYsIDB4RDgsIDB4RUMsIDB4NDYsIDB4MTMsIDB4MkEsIDB4QjYsCisgICAgMHg4NywgMHg5OSwgMHg0QSwgMHg0MywgMHgwQywgMHg5NywgMHg2MSwgMHhCQiwgMHhEQywgMHgyNSwgMHg0RiwgMHg3NywKKyAgICAweDBBLCAweDE2LCAweDgyLCAweENCLCAweDM1LCAweDU1LCAweDk3LCAweDYwLCAweDY3LCAweEEwLCAweEEyLCAweEVBLAorICAgIDB4NjAsIDB4NzMsIDB4QTAsIDB4MjAsIDB4QTQsIDB4NEMsIDB4NDYsIDB4OTYsIDB4MzMsIDB4MUEsIDB4NDgsIDB4NEYsCisgICAgMHg4OSwgMHhFMCwgMHg5NiwgMHhGMywgMHg1QSwgMHg2MywgMHgzRiwgMHgxQSwgMHhEMywgMHgzOCwgMHhGMSwgMHhGMiwKKyAgICAweDM4LCAweDFBLCAweENFLCAweDM0LCAweEMxLCAweEYyLCAweDFBLCAweDY2LCAweDgxLCAweEU1LCAweEZDLCAweEY5LAorICAgIDB4RjIsIDB4MUQsIDB4RTYsIDB4NEMsIDB4ODMsIDB4RDEsIDB4QTMsIDB4QTIsIDB4MTEsIDB4NTcsIDB4MEIsIDB4MTgsCisgICAgMHgyRCwgMHhFRiwgMHgyRiwgMHg5RiwgMHgyMCwgMHhBQiwgMHgxRiwgMHg4NCwgMHgyNiwgMHhDQSwgMHgwNiwgMHg5RCwKKyAgICAweDU2LCAweEI3LCAweDdBLCAweEQ5LCAweDkzLCAweDM1LCAweEI5LCAweEMxLCAweDVFLCAweDM5LCAweDRDLCAweENCLAorICAgIDB4QjAsIDB4RDgsIDB4RDMsIDB4NEQsIDB4RTAsIDB4RkIsIDB4Q0MsIDB4NDcsIDB4NTMsIDB4RjAsIDB4NjcsIDB4NkMsCisgICAgMHgyNiwgMHg1MCwgMHg0NiwgMHgzOSwgMHhFQiwgMHgyMSwgMHgxQywgMHg3MiwgMHgyOSwgMHgyOCwgMHgxMSwgMHg2OCwKKyAgICAweDE2LCAweEZCLCAweDFELCAweDhDLCAweDg5LCAweDBGLCAweERGLCAweDNGLCAweDY4LCAweDRBLCAweEZGLCAweDRCLAorICAgIDB4MzksIDB4ODUsIDB4RUYsIDB4M0QsIDB4NzIsIDB4REYsIDB4NEIsIDB4OTksIDB4MDgsIDB4M0MsIDB4ODcsIDB4NzcsCisgICAgMHhBQywgMHg4RiwgMHg3MiwgMHhCNSwgMHhDNCwgMHhCNCwgMHg4MywgMHg3MCwgMHhDNiwgMHg1MywgMHg3OSwgMHg4QiwKKyAgICAweEQxLCAweDA5LCAweDhGLCAweDk3LCAweEQ0LCAweDUzLCAweDNELCAweDhELCAweDNFLCAweEJDLCAweDQzLCAweDZFLAorICAgIDB4M0YsIDB4MTksIDB4MEMsIDB4RjAsIDB4OTYsIDB4QkMsIDB4MjQsIDB4NUYsIDB4RjYsIDB4RkUsIDB4MzQsIDB4NzAsCisgICAgMHgxNywgMHhBQSwgMHg0QiwgMHg3NCwgMHhERSwgMHg0QiwgMHg5QiwgMHhGMSwgMHg0MSwgMHgzNCwgMHgzNywgMHg5MSwKKyAgICAweDZDLCAweEIxLCAweEUyLCAweDE5LCAweDMzLCAweDJGLCAweDMyLCAweDFCLCAweDZELCAweEI1LCAweEYzLCAweEI0LAorICAgIDB4QzcsIDB4RjksIDB4QTcsIDB4QkEsIDB4RjMsIDB4MEYsIDB4RDUsIDB4RkEsIDB4QzAsIDB4RkF9OworY29uc3QgdWludDhfdCBnX3J1UlVfTG9jYWxlW10gPSB7CisgICAgMHg3OCwgMHg5QywgMHhBRCwgMHg1NywgMHg0RCwgMHg0RiwgMHgxMywgMHg0MSwgMHgxOCwgMHgzRSwgMHg2MywgMHhFMiwKKyAgICAweDdGLCAweDk4LCAweDZDLCAweDI0LCAweDY4LCAweDAyLCAweEFELCAweDFFLCAweDI1LCAweDY1LCAweDEzLCAweDIyLAorICAgIDB4MEEsIDB4MDYsIDB4RDcsIDB4OTAsIDB4MTYsIDB4MzQsIDB4NzIsIDB4MzEsIDB4REIsIDB4REQsIDB4QTEsIDB4NUQsCisgICAgMHhFOCwgMHhFRSwgMHg5MCwgMHhFOSwgMHg2RSwgMHhCMCwgMHg3QiwgMHgyQSwgMHg4NSwgMHhFOCwgMHgwNSwgMHgyNSwKKyAgICAweEUxLCAweEEwLCAweDQ3LCAweEY0LCAweEU0LCAweEM5LCAweDUwLCAweEJFLCAweDEyLCAweDgyLCAweEI2LCAweDI0LAorICAgIDB4RkUsIDB4ODIsIDB4RDksIDB4RkYsIDB4NjAsIDB4RDQsIDB4OUYsIDB4RTEsIDB4M0IsIDB4RkIsIDB4RDEsIDB4RUUsCisgICAgMHhCNywgMHhDNSwgMHhEOCwgMHgxRSwgMHgzQSwgMHhGMywgMHgzRSwgMHhDRiwgMHhGMywgMHhDRSwgMHhGQiwgMHhCNSwKKyAgICAweEQzLCAweEI2LCAweEQ0LCAweDIwLCAweDhBLCAweERDLCAweEMwLCAweEM4LCAweDkwLCAweDc1LCAweDNDLCAweDIzLAorICAgIDB4NTAsIDB4RUIsIDB4NjUsIDB4NzksIDB4NDUsIDB4NDAsIDB4MkEsIDB4NkUsIDB4MkEsIDB4MzMsIDB4QzIsIDB4OEYsCisgICAgMHhBQiwgMHhERCwgMHhERiwgMHg0NywgMHg1RiwgMHg2RSwgMHhDMywgMHhDNywgMHhBRiwgMHhERSwgMHg4NywgMHg5RiwKKyAgICAweEVGLCAweDhGLCAweEVFLCAweDA4LCAweEUyLCAweENELCAweDFCLCAweDA4LCAweDk1LCAweDM4LCAweERGLCAweDUwLAorICAgIDB4NjUsIDB4NUEsIDB4NjksIDB4RTksIDB4NTUsIDB4RDIsIDB4NjgsIDB4RkEsIDB4RDIsIDB4MUEsIDB4QzUsIDB4MzUsCisgICAgMHg0MiwgMHgzNSwgMHhEOSwgMHhFMCwgMHhBQywgMHgzMSwgMHg1NCwgMHhEMiwgMHg4OSwgMHg2MSwgMHhENiwgMHg5RiwKKyAgICAweDAyLCAweEQ0LCAweEU0LCAweEZCLCAweDMxLCAweDZGLCAweDJGLCAweDNBLCAweEZCLCAweEFDLCAweEM3LCAweDRFLAorICAgIDB4NTgsIDB4RDcsIDB4NjksIDB4M0IsIDB4RkIsIDB4QTUsIDB4QTIsIDB4NjcsIDB4MEIsIDB4QzMsIDB4QkIsIDB4RUMsCisgICAgMHg5QywgMHg5RCwgMHgzOCwgMHg2RCwgMHhENiwgMHg2NSwgMHg1RiwgMHg1MywgMHgwOSwgMHhFQywgMHg5QiwgMHhBQiwKKyAgICAweEVELCAweEIwLCAweDZFLCAweDFBLCAweEQ4LCAweDY1LCAweDU3LCAweEEwLCAweDNELCAweENGLCAweEQzLCAweEE2LAorICAgIDB4MDIsIDB4MTcsIDB4Q0UsIDB4M0IsIDB4RDYsIDB4Q0IsIDB4ODYsIDB4MzIsIDB4REMsIDB4NzUsIDB4MjEsIDB4OTEsCisgICAgMHg1MywgMHg2NywgMHhDNywgMHhEOSwgMHhDRSwgMHgwOCwgMHhDNywgMHhEOSwgMHg4NiwgMHg1MCwgMHg3QSwgMHg0RSwKKyAgICAweDA3LCAweDcyLCAweDNFLCAweENFLCAweEM4LCAweDk3LCAweEY1LCAweEQ5LCAweDY1LCAweDNFLCAweEExLCAweEM3LAorICAgIDB4RkEsIDB4NzksIDB4RjAsIDB4MTksIDB4MUMsIDB4NzEsIDB4MDksIDB4OTEsIDB4QzQsIDB4MDksIDB4QzgsIDB4NUYsCisgICAgMHgwRiwgMHgxQSwgMHgxMCwgMHg2RSwgMHgwOCwgMHg5MiwgMHhBQiwgMHg1NSwgMHgzQSwgMHgyMywgMHhEQywgMHgxMywKKyAgICAweDkyLCAweDlELCAweDI5LCAweEU0LCAweDM0LCAweDI1LCAweDBELCAweDFCLCAweEExLCAweDFGLCAweDk5LCAweEIyLAorICAgIDB4RkYsIDB4REQsIDB4OEEsIDB4RDQsIDB4RDgsIDB4RkQsIDB4MUUsIDB4QTQsIDB4MDYsIDB4RTEsIDB4MTYsIDB4M0YsCisgICAgMHgxNSwgMHhGMSwgMHhBQiwgMHg5RSwgMHg4QSwgMHhCOSwgMHgyNSwgMHgyRiwgMHhFNCwgMHhENywgMHg1QSwgMHg5NSwKKyAgICAweDVCLCAweEExLCAweEQxLCAweDg3LCAweDlELCAweDA4LCAweDAxLCAweEY2LCAweDIxLCAweDk4LCAweDRCLCAweDNFLAorICAgIDB4OUYsIDB4N0UsIDB4NTAsIDB4N0IsIDB4RUMsIDB4QkMsIDB4NTQsIDB4RTQsIDB4RDgsIDB4OTAsIDB4NzQsIDB4MDUsCisgICAgMHgzMSwgMHhGNSwgMHgwMCwgMHgzQywgMHg3MywgMHg4NywgMHg3OCwgMHgwRiwgMHhENiwgMHgxNywgMHhFQywgMHgzMiwKKyAgICAweDRFLCAweDNBLCAweDgxLCAweDcyLCAweEY3LCAweEMxLCAweDRGLCAweDFBLCAweDA4LCAweEMzLCAweEQ4LCAweDc2LAorICAgIDB4RjUsIDB4REQsIDB4MzgsIDB4RjAsIDB4MDYsIDB4Q0UsIDB4RUQsIDB4NDAsIDB4MTQsIDB4RTcsIDB4NDAsIDB4MzgsCisgICAgMHg0RCwgMHg5QywgMHhFQiwgMHhFQywgMHgwMywgMHgwOCwgMHgwRSwgMHg5RCwgMHhENywgMHg0OSwgMHhFNSwgMHhCNiwKKyAgICAweEIzLCAweEMzLCAweDhFLCAweEUxLCAweERELCAweEY3LCAweERBLCAweEVDLCAweDgzLCAweEM4LCAweDVELCAweEE1LAorICAgIDB4RTQsIDB4MUMsIDB4OUIsIDB4MkUsIDB4RDcsIDB4RkYsIDB4ODEsIDB4QjMsIDB4MUQsIDB4M0YsIDB4RjIsIDB4OTAsCisgICAgMHhGNSwgMHhFMiwgMHhBNiwgMHgwMywgMHhBNywgMHgxMywgMHgzNywgMHg3RCwgMHg3MiwgMHhEQSwgMHg3MSwgMHhEMywKKyAgICAweEU3LCAweDI0LCAweEVCLCAweDMwLCAweDQ1LCAweEM4LCAweDhFLCAweEIzLCAweDQzLCAweEQ1LCAweDMxLCAweEQ1LAorICAgIDB4NTQsIDB4MEQsIDB4RUIsIDB4RTEsIDB4RUIsIDB4QzksIDB4MzcsIDB4ODksIDB4QjMsIDB4MTIsIDB4QjQsIDB4MzMsCisgICAgMHhEOCwgMHg0NCwgMHhBMSwgMHhBNSwgMHgxOCwgMHg4NCwgMHg4NiwgMHhEQiwgMHg5MCwgMHg3MywgMHg0QywgMHhFNSwKKyAgICAweDkwLCAweDVGLCAweEQ4LCAweEYxLCAweDkxLCAweEU5LCAweDIzLCAweEQ2LCAweDJCLCAweDM4LCAweDZGLCAweDYxLAorICAgIDB4NkMsIDB4QjgsIDB4NjEsIDB4ODgsIDB4NDQsIDB4OEQsIDB4QzgsIDB4NUQsIDB4MDUsIDB4NkEsIDB4QjgsIDB4NkEsCisgICAgMHg4QiwgMHhCMSwgMHhCQiwgMHhENiwgMHhCMywgMHhBQSwgMHhCMiwgMHg4OSwgMHg5NywgMHg2NCwgMHhEMywgMHhDNCwKKyAgICAweEQ0LCAweDE4LCAweEQ0LCAweDdFLCAweDYwLCAweEYxLCAweEFGLCAweEUzLCAweDM1LCAweEFCLCAweEQxLCAweDEwLAorICAgIDB4QzQsIDB4MzksIDB4MjQsIDB4QzEsIDB4MEIsIDB4QkQsIDB4ODAsIDB4MTcsIDB4OUEsIDB4ODAsIDB4MjcsIDB4NjQsCisgICAgMHg4MiwgMHg1NywgMHg2MiwgMHg0MCwgMHhDRCwgMHhEMiwgMHgzNiwgMHg4OCwgMHg1MSwgMHhGQiwgMHg1NywgMHhBRCwKKyAgICAweDhFLCAweDU1LCAweDkwLCAweENFLCAweDE1LCAweDI0LCAweEE5LCAweEMwLCAweDk1LCAweDIzLCAweDY5LCAweDlBLAorICAgIDB4NzUsIDB4NDIsIDB4Q0QsIDB4QTEsIDB4MkEsIDB4QUUsIDB4NDEsIDB4MjgsIDB4NjIsIDB4RjEsIDB4OEIsIDB4NjAsCisgICAgMHg2QSwgMHg3QSwgMHhBQywgMHgwOCwgMHgyMSwgMHg0QiwgMHhBNCwgMHgwOCwgMHgwQiwgMHhEMywgMHg5MiwgMHgzNCwKKyAgICAweDVELCAweEE5LCAweEEwLCAweEQ1LCAweDUyLCAweDMxLCAweDQ0LCAweEM5LCAweEQyLCAweDc4LCAweEM5LCAweDVGLAorICAgIDB4NEYsIDB4RTMsIDB4MjYsIDB4RUQsIDB4NEIsIDB4NDYsIDB4MTIsIDB4RjgsIDB4MTksIDB4NzMsIDB4NDksIDB4OUMsCisgICAgMHhDRiwgMHhCMywgMHg4RCwgMHhFNSwgMHhFNiwgMHhCNywgMHg3QywgMHgxOSwgMHhBQywgMHhDMSwgMHgxQywgMHhDQywKKyAgICAweENCLCAweEM2LCAweEZBLCAweEM2LCAweDgyLCAweERFLCAweEFDLCAweDNDLCAweDlDLCAweDdCLCAweEI0LCAweEY1LAorICAgIDB4RkMsIDB4NTUsIDB4N0QsIDB4RDEsIDB4NUUsIDB4RjUsIDB4OEEsIDB4MTQsIDB4MjYsIDB4QjksIDB4NEEsIDB4QzMsCisgICAgMHhEMiwgMHhBQiwgMHg5OCwgMHg0NiwgMHgyQiwgMHgxNSwgMHhCMSwgMHhGOSwgMHgyMSwgMHg4MSwgMHgwRCwgMHg2NiwKKyAgICAweDU5LCAweDExLCAweDQ0LCAweDdCLCAweEQyLCAweEI2LCAweEVGLCAweDE3LCAweDZDLCAweERCLCAweDJFLCAweDE1LAorICAgIDB4MjMsIDB4QkMsIDB4NkMsIDB4QTksIDB4NjIsIDB4NTEsIDB4OEEsIDB4MEQsIDB4QTUsIDB4MzUsIDB4RDQsIDB4REUsCisgICAgMHgxQSwgMHg1OSwgMHhCQiwgMHg4OSwgMHhBOSwgMHg4MiwgMHgwRCwgMHhEMywgMHg5NywgMHg4RSwgMHgyNywgMHg3NSwKKyAgICAweEJDLCAweDFFLCAweDg5LCAweDFDLCAweDA2LCAweDc5LCAweDBELCAweDUzLCAweDFELCAweDhCLCAweDlBLCAweDdDLAorICAgIDB4RjcsIDB4MkEsIDB4NTYsIDB4MzQsIDB4NUQsIDB4ODYsIDB4MjEsIDB4OTgsIDB4MEMsIDB4QkMsIDB4NzgsIDB4NzAsCisgICAgMHhBNiwgMHhBMCwgMHg0NiwgMHg4OSwgMHhCNSwgMHhBOSwgMHhGMSwgMHgxMSwgMHhGOCwgMHhGRSwgMHg3MSwgMHg0NCwKKyAgICAweEM5LCAweDIwLCAweDg1LCAweEYxLCAweDExLCAweDA1LCAweEJBLCAweDY2LCAweDU4LCAweDRELCAweDQxLCAweDlDLAorICAgIDB4MUEsIDB4OTEsIDB4NkUsIDB4NjMsIDB4NEEsIDB4MDQsIDB4RjEsIDB4NkUsIDB4ODIsIDB4M0QsIDB4QUMsIDB4NEMsCisgICAgMHhBNCwgMHhFMSwgMHg0MSwgMHgzNywgMHgyMiwgMHhBNSwgMHg4OSwgMHgxQSwgMHg4MywgMHgyOSwgMHg3NCwgMHgzNywKKyAgICAweDgyLCAweEU4LCAweDdFLCAweDQ3LCAweDQ3LCAweDE5LCAweDM5LCAweDJBLCAweEFELCAweDQ5LCAweEY4LCAweDQyLAorICAgIDB4MTAsIDB4Q0IsIDB4MkIsIDB4RTUsIDB4NkIsIDB4QzgsIDB4QzIsIDB4OUQsIDB4NDgsIDB4ODgsIDB4REMsIDB4QUIsCisgICAgMHgyRSwgMHgxMSwgMHgzNywgMHg3RiwgMHhDQSwgMHg1QiwgMHg5QiwgMHg3OCwgMHg0RCwgMHg1NiwgMHg4MiwgMHhCQiwKKyAgICAweDM1LCAweEQ4LCAweEZBLCAweDNFLCAweEE1LCAweDE2LCAweEZDLCAweEUwLCAweDU0LCAweEQxLCAweDEyLCAweEQ0LAorICAgIDB4QTcsIDB4OTgsIDB4NEUsIDB4RDAsIDB4MEMsIDB4OEQsIDB4MTgsIDB4MzksIDB4ODQsIDB4MDcsIDB4QzQsIDB4QTIsCisgICAgMHgxQSwgMHhBNiwgMHhBOCwgMHg2MiwgMHhBQSwgMHgxOSwgMHg4QywgMHg1OSwgMHg5NSwgMHg1NCwgMHgzMSwgMHg1QSwKKyAgICAweEQyLCAweEZFLCAweDRBLCAweDU5LCAweEMwLCAweDU1LCAweDhBLCAweEI3LCAweDcyLCAweDI5LCAweEIzLCAweDU0LAorICAgIDB4QUUsIDB4QzIsIDB4MjMsIDB4OTYsIDB4NDcsIDB4NTksIDB4QUUsIDB4Q0IsIDB4NUEsIDB4MDYsIDB4NjEsIDB4OTEsCisgICAgMHhEOCwgMHhENiwgMHg4NiwgMHg4QywgMHhFNiwgMHg4OSwgMHg1OSwgMHhENywgMHgxNCwgMHg5RSwgMHhEMywgMHhENCwKKyAgICAweEIzLCAweEM3LCAweDQ4LCAweENBLCAweDI3LCAweDQzLCAweDAxLCAweDk0LCAweDNBLCAweDA5LCAweEM4LCAweEU1LAorICAgIDB4REMsIDB4QTMsIDB4ODEsIDB4NUIsIDB4RTMsIDB4NTksIDB4QTIsIDB4MjcsIDB4QjksIDB4QjQsIDB4MEEsIDB4MTksCisgICAgMHg4OSwgMHgyNiwgMHhCNSwgMHgyQywgMHhBMywgMHhCNiwgMHg0RSwgMHg1QywgMHhBNiwgMHgxNywgMHhBNCwgMHg3QiwKKyAgICAweEIzLCAweDg1LCAweEZBLCAweDU5LCAweDJBLCAweDdBLCAweEZGLCAweDNELCAweEM0LCAweDNGLCAweERFLCAweENCLAorICAgIDB4OEIsIDB4QzR9OworCitzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPElGWF9Mb2NhbGU+IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGNvbnN0IHVpbnQ4X3QqIHBCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQnVmTGVuKSB7CisgIGlmICghcEJ1ZiB8fCBuQnVmTGVuIDw9IDApCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgdWludDhfdCogcE91dCA9IG51bGxwdHI7CisgIHVpbnQzMl90IGR3U2l6ZTsKKyAgQ0NvZGVjX01vZHVsZU1nciogcENvZGVjTWdyID0gQ1BERl9Nb2R1bGVNZ3I6OkdldCgpLT5HZXRDb2RlY01vZHVsZSgpOworICBwQ29kZWNNZ3ItPkdldEZsYXRlTW9kdWxlKCktPkZsYXRlT3JMWldEZWNvZGUoZmFsc2UsIHBCdWYsIG5CdWZMZW4sIHRydWUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAmcE91dCwgJmR3U2l6ZSk7CisgIGlmICghcE91dCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hNTF9FbGVtZW50PiBwTG9jYWxlID0gQ1hNTF9FbGVtZW50OjpQYXJzZShwT3V0LCBkd1NpemUpOworICBGWF9GcmVlKHBPdXQpOworICByZXR1cm4gcExvY2FsZSA/IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1hNTExvY2FsZT4oc3RkOjptb3ZlKHBMb2NhbGUpKQorICAgICAgICAgICAgICAgICA6IG51bGxwdHI7Cit9CisKK3N0YXRpYyB1aW50MTZfdCBYRkFfR2V0TGFuZ3VhZ2UoV2lkZVN0cmluZyB3c0xhbmd1YWdlKSB7CisgIGlmICh3c0xhbmd1YWdlLkdldExlbmd0aCgpIDwgMikKKyAgICByZXR1cm4gRlhfTEFOR19lbl9VUzsKKworICB3c0xhbmd1YWdlLk1ha2VMb3dlcigpOworICB1aW50MzJfdCBkd0lERmlyc3QgPSB3c0xhbmd1YWdlWzBdIDw8IDggfCB3c0xhbmd1YWdlWzFdOworICB1aW50MzJfdCBkd0lEU2Vjb25kID0KKyAgICAgIHdzTGFuZ3VhZ2UuR2V0TGVuZ3RoKCkgPj0gNSA/IHdzTGFuZ3VhZ2VbM10gPDwgOCB8IHdzTGFuZ3VhZ2VbNF0gOiAwOworICBzd2l0Y2ggKGR3SURGaXJzdCkgeworICAgIGNhc2UgRlhCU1RSX0lEKDAsIDAsICd6JywgJ2gnKToKKyAgICAgIGlmIChkd0lEU2Vjb25kID09IEZYQlNUUl9JRCgwLCAwLCAnYycsICduJykpCisgICAgICAgIHJldHVybiBGWF9MQU5HX3poX0NOOworICAgICAgaWYgKGR3SURTZWNvbmQgPT0gRlhCU1RSX0lEKDAsIDAsICd0JywgJ3cnKSkKKyAgICAgICAgcmV0dXJuIEZYX0xBTkdfemhfVFc7CisgICAgICBpZiAoZHdJRFNlY29uZCA9PSBGWEJTVFJfSUQoMCwgMCwgJ2gnLCAnaycpKQorICAgICAgICByZXR1cm4gRlhfTEFOR196aF9ISzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhCU1RSX0lEKDAsIDAsICdqJywgJ2EnKToKKyAgICAgIHJldHVybiBGWF9MQU5HX2phX0pQOworICAgIGNhc2UgRlhCU1RSX0lEKDAsIDAsICdrJywgJ28nKToKKyAgICAgIHJldHVybiBGWF9MQU5HX2tvX0tSOworICAgIGNhc2UgRlhCU1RSX0lEKDAsIDAsICdlJywgJ24nKToKKyAgICAgIHJldHVybiBkd0lEU2Vjb25kID09IEZYQlNUUl9JRCgwLCAwLCAnZycsICdiJykgPyBGWF9MQU5HX2VuX0dCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRlhfTEFOR19lbl9VUzsKKyAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAnZCcsICdlJyk6CisgICAgICByZXR1cm4gRlhfTEFOR19kZV9ERTsKKyAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAnZicsICdyJyk6CisgICAgICByZXR1cm4gRlhfTEFOR19mcl9GUjsKKyAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAnZScsICdzJyk6CisgICAgICByZXR1cm4gZHdJRFNlY29uZCA9PSBGWEJTVFJfSUQoMCwgMCwgJ2UnLCAncycpID8gRlhfTEFOR19lc19FUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZYX0xBTkdfZXNfTEE7CisgICAgY2FzZSBGWEJTVFJfSUQoMCwgMCwgJ2knLCAndCcpOgorICAgICAgcmV0dXJuIEZYX0xBTkdfaXRfSVQ7CisgICAgY2FzZSBGWEJTVFJfSUQoMCwgMCwgJ3AnLCAndCcpOgorICAgICAgcmV0dXJuIEZYX0xBTkdfcHRfQlI7CisgICAgY2FzZSBGWEJTVFJfSUQoMCwgMCwgJ24nLCAnbCcpOgorICAgICAgcmV0dXJuIEZYX0xBTkdfbmxfTkw7CisgICAgY2FzZSBGWEJTVFJfSUQoMCwgMCwgJ3InLCAndScpOgorICAgICAgcmV0dXJuIEZYX0xBTkdfcnVfUlU7CisgIH0KKyAgcmV0dXJuIEZYX0xBTkdfZW5fVVM7Cit9CisKK0NYRkFfTG9jYWxlTWdyOjpDWEZBX0xvY2FsZU1ncihDWEZBX05vZGUqIHBMb2NhbGVTZXQsIFdpZGVTdHJpbmcgd3NEZWZsY2lkKQorICAgIDogbV9kd0xvY2FsZUZsYWdzKDB4MDApIHsKKyAgbV9kd0RlZmxjaWQgPSBYRkFfR2V0TGFuZ3VhZ2Uod3NEZWZsY2lkKTsKKyAgaWYgKHBMb2NhbGVTZXQpIHsKKyAgICBDWEZBX05vZGUqIHBOb2RlTG9jYWxlID0gcExvY2FsZVNldC0+R2V0Rmlyc3RDaGlsZCgpOworICAgIHdoaWxlIChwTm9kZUxvY2FsZSkgeworICAgICAgbV9Mb2NhbGVBcnJheS5wdXNoX2JhY2socGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfTm9kZUxvY2FsZT4ocE5vZGVMb2NhbGUpKTsKKyAgICAgIHBOb2RlTG9jYWxlID0gcE5vZGVMb2NhbGUtPkdldE5leHRTaWJsaW5nKCk7CisgICAgfQorICB9CisgIG1fcERlZkxvY2FsZSA9IEdldExvY2FsZUJ5TmFtZSh3c0RlZmxjaWQpOworfQorCitDWEZBX0xvY2FsZU1ncjo6fkNYRkFfTG9jYWxlTWdyKCkge30KKwordWludDE2X3QgQ1hGQV9Mb2NhbGVNZ3I6OkdldERlZkxvY2FsZUlEKCkgY29uc3QgeworICByZXR1cm4gbV9kd0RlZmxjaWQ7Cit9CisKK0lGWF9Mb2NhbGUqIENYRkFfTG9jYWxlTWdyOjpHZXREZWZMb2NhbGUoKSB7CisgIGlmIChtX3BEZWZMb2NhbGUpCisgICAgcmV0dXJuIG1fcERlZkxvY2FsZTsKKworICBpZiAoIW1fTG9jYWxlQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gbV9Mb2NhbGVBcnJheVswXS5nZXQoKTsKKworICBpZiAoIW1fWE1MTG9jYWxlQXJyYXkuZW1wdHkoKSkKKyAgICByZXR1cm4gbV9YTUxMb2NhbGVBcnJheVswXS5nZXQoKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8SUZYX0xvY2FsZT4gbG9jYWxlKEdldExvY2FsZShtX2R3RGVmbGNpZCkpOworICBtX3BEZWZMb2NhbGUgPSBsb2NhbGUuZ2V0KCk7CisgIGlmIChsb2NhbGUpCisgICAgbV9YTUxMb2NhbGVBcnJheS5wdXNoX2JhY2soc3RkOjptb3ZlKGxvY2FsZSkpOworCisgIHJldHVybiBtX3BEZWZMb2NhbGU7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxJRlhfTG9jYWxlPiBDWEZBX0xvY2FsZU1ncjo6R2V0TG9jYWxlKHVpbnQxNl90IGxjaWQpIHsKKyAgc3dpdGNoIChsY2lkKSB7CisgICAgY2FzZSBGWF9MQU5HX3poX0NOOgorICAgICAgcmV0dXJuIFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfemhDTl9Mb2NhbGUsIHNpemVvZihnX3poQ05fTG9jYWxlKSk7CisgICAgY2FzZSBGWF9MQU5HX3poX1RXOgorICAgICAgcmV0dXJuIFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfemhUV19Mb2NhbGUsIHNpemVvZihnX3poVFdfTG9jYWxlKSk7CisgICAgY2FzZSBGWF9MQU5HX3poX0hLOgorICAgICAgcmV0dXJuIFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfemhIS19Mb2NhbGUsIHNpemVvZihnX3poSEtfTG9jYWxlKSk7CisgICAgY2FzZSBGWF9MQU5HX2phX0pQOgorICAgICAgcmV0dXJuIFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfamFKUF9Mb2NhbGUsIHNpemVvZihnX2phSlBfTG9jYWxlKSk7CisgICAgY2FzZSBGWF9MQU5HX2tvX0tSOgorICAgICAgcmV0dXJuIFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfa29LUl9Mb2NhbGUsIHNpemVvZihnX2tvS1JfTG9jYWxlKSk7CisgICAgY2FzZSBGWF9MQU5HX2VuX0dCOgorICAgICAgcmV0dXJuIFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfZW5HQl9Mb2NhbGUsIHNpemVvZihnX2VuR0JfTG9jYWxlKSk7CisgICAgY2FzZSBGWF9MQU5HX2VzX0xBOgorICAgICAgcmV0dXJuIFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfZXNMQV9Mb2NhbGUsIHNpemVvZihnX2VzTEFfTG9jYWxlKSk7CisgICAgY2FzZSBGWF9MQU5HX2VzX0VTOgorICAgICAgcmV0dXJuIFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfZXNFU19Mb2NhbGUsIHNpemVvZihnX2VzRVNfTG9jYWxlKSk7CisgICAgY2FzZSBGWF9MQU5HX2RlX0RFOgorICAgICAgcmV0dXJuIFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfZGVERV9Mb2FjYWxlLCBzaXplb2YoZ19kZURFX0xvYWNhbGUpKTsKKyAgICBjYXNlIEZYX0xBTkdfZnJfRlI6CisgICAgICByZXR1cm4gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ19mckZSX0xvY2FsZSwgc2l6ZW9mKGdfZnJGUl9Mb2NhbGUpKTsKKyAgICBjYXNlIEZYX0xBTkdfaXRfSVQ6CisgICAgICByZXR1cm4gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ19pdElUX0xvY2FsZSwgc2l6ZW9mKGdfaXRJVF9Mb2NhbGUpKTsKKyAgICBjYXNlIEZYX0xBTkdfcHRfQlI6CisgICAgICByZXR1cm4gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ19wdEJSX0xvY2FsZSwgc2l6ZW9mKGdfcHRCUl9Mb2NhbGUpKTsKKyAgICBjYXNlIEZYX0xBTkdfbmxfTkw6CisgICAgICByZXR1cm4gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ19ubE5MX0xvY2FsZSwgc2l6ZW9mKGdfbmxOTF9Mb2NhbGUpKTsKKyAgICBjYXNlIEZYX0xBTkdfcnVfUlU6CisgICAgICByZXR1cm4gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ19ydVJVX0xvY2FsZSwgc2l6ZW9mKGdfcnVSVV9Mb2NhbGUpKTsKKyAgICBjYXNlIEZYX0xBTkdfZW5fVVM6CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX2VuVVNfTG9jYWxlLCBzaXplb2YoZ19lblVTX0xvY2FsZSkpOworICB9Cit9CisKK0lGWF9Mb2NhbGUqIENYRkFfTG9jYWxlTWdyOjpHZXRMb2NhbGVCeU5hbWUoY29uc3QgV2lkZVN0cmluZyYgd3NMb2NhbGVOYW1lKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9Mb2NhbGVBcnJheS5zaXplKCk7IGkrKykgeworICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBtX0xvY2FsZUFycmF5W2ldLmdldCgpOworICAgIGlmIChwTG9jYWxlLT5HZXROYW1lKCkgPT0gd3NMb2NhbGVOYW1lKQorICAgICAgcmV0dXJuIHBMb2NhbGU7CisgIH0KKyAgaWYgKHdzTG9jYWxlTmFtZS5HZXRMZW5ndGgoKSA8IDIpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9YTUxMb2NhbGVBcnJheS5zaXplKCk7IGkrKykgeworICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBtX1hNTExvY2FsZUFycmF5W2ldLmdldCgpOworICAgIGlmIChwTG9jYWxlLT5HZXROYW1lKCkgPT0gd3NMb2NhbGVOYW1lKQorICAgICAgcmV0dXJuIHBMb2NhbGU7CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8SUZYX0xvY2FsZT4gcExvY2FsZShHZXRMb2NhbGUoWEZBX0dldExhbmd1YWdlKHdzTG9jYWxlTmFtZSkpKTsKKyAgSUZYX0xvY2FsZSogcFJldExvY2FsZSA9IHBMb2NhbGUuZ2V0KCk7CisgIGlmIChwTG9jYWxlKQorICAgIG1fWE1MTG9jYWxlQXJyYXkucHVzaF9iYWNrKHN0ZDo6bW92ZShwTG9jYWxlKSk7CisgIHJldHVybiBwUmV0TG9jYWxlOworfQorCit2b2lkIENYRkFfTG9jYWxlTWdyOjpTZXREZWZMb2NhbGUoSUZYX0xvY2FsZSogcExvY2FsZSkgeworICBtX3BEZWZMb2NhbGUgPSBwTG9jYWxlOworfQorCitXaWRlU3RyaW5nVmlldyBDWEZBX0xvY2FsZU1ncjo6R2V0Q29uZmlnTG9jYWxlTmFtZShDWEZBX05vZGUqIHBDb25maWcpIHsKKyAgaWYgKCEobV9kd0xvY2FsZUZsYWdzICYgMHgwMSkpIHsKKyAgICBtX3dzQ29uZmlnTG9jYWxlLmNsZWFyKCk7CisgICAgaWYgKHBDb25maWcpIHsKKyAgICAgIENYRkFfTm9kZSogcENoaWxkZkNvbmZpZyA9CisgICAgICAgICAgcENvbmZpZy0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9BY3JvYmF0PihYRkFfRWxlbWVudDo6QWNyb2JhdCk7CisgICAgICBpZiAoIXBDaGlsZGZDb25maWcpIHsKKyAgICAgICAgcENoaWxkZkNvbmZpZyA9CisgICAgICAgICAgICBwQ29uZmlnLT5HZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX1ByZXNlbnQ+KFhGQV9FbGVtZW50OjpQcmVzZW50KTsKKyAgICAgIH0KKyAgICAgIENYRkFfQ29tbW9uKiBwQ29tbW9uID0KKyAgICAgICAgICBwQ2hpbGRmQ29uZmlnID8gcENoaWxkZkNvbmZpZy0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9Db21tb24+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkNvbW1vbikKKyAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cjsKKyAgICAgIENYRkFfTG9jYWxlKiBwTG9jYWxlID0KKyAgICAgICAgICBwQ29tbW9uCisgICAgICAgICAgICAgID8gcENvbW1vbi0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9Mb2NhbGU+KFhGQV9FbGVtZW50OjpMb2NhbGUpCisgICAgICAgICAgICAgIDogbnVsbHB0cjsKKyAgICAgIGlmIChwTG9jYWxlKSB7CisgICAgICAgIG1fd3NDb25maWdMb2NhbGUgPSBwTG9jYWxlLT5KU09iamVjdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5UcnlDRGF0YShYRkFfQXR0cmlidXRlOjpWYWx1ZSwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlX29yKFdpZGVTdHJpbmcoKSk7CisgICAgICB9CisgICAgfQorICAgIG1fZHdMb2NhbGVGbGFncyB8PSAweDAxOworICB9CisgIHJldHVybiBtX3dzQ29uZmlnTG9jYWxlLkFzU3RyaW5nVmlldygpOworfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxlbWdyLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGVtZ3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzdhOTRhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxlbWdyLmgKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0xPQ0FMRU1HUl9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9MT0NBTEVNR1JfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9kYXRldGltZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvaWZ4X2xvY2FsZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xvY2FsZW1nci5oIgorCitjbGFzcyBDWEZBX05vZGU7CitjbGFzcyBJRlhfTG9jYWxlOworCitjbGFzcyBDWEZBX0xvY2FsZU1nciB7CisgcHVibGljOgorICBDWEZBX0xvY2FsZU1ncihDWEZBX05vZGUqIHBMb2NhbGVTZXQsIFdpZGVTdHJpbmcgd3NEZWZsY2lkKTsKKyAgfkNYRkFfTG9jYWxlTWdyKCk7CisKKyAgdWludDE2X3QgR2V0RGVmTG9jYWxlSUQoKSBjb25zdDsKKyAgSUZYX0xvY2FsZSogR2V0RGVmTG9jYWxlKCk7CisgIElGWF9Mb2NhbGUqIEdldExvY2FsZUJ5TmFtZShjb25zdCBXaWRlU3RyaW5nJiB3c0xvY2FsZU5hbWUpOworCisgIHZvaWQgU2V0RGVmTG9jYWxlKElGWF9Mb2NhbGUqIHBMb2NhbGUpOworICBXaWRlU3RyaW5nVmlldyBHZXRDb25maWdMb2NhbGVOYW1lKENYRkFfTm9kZSogcENvbmZpZyk7CisKKyBwcml2YXRlOgorICBzdGQ6OnVuaXF1ZV9wdHI8SUZYX0xvY2FsZT4gR2V0TG9jYWxlKHVpbnQxNl90IGxjaWQpOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxJRlhfTG9jYWxlPj4gbV9Mb2NhbGVBcnJheTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPElGWF9Mb2NhbGU+PiBtX1hNTExvY2FsZUFycmF5OworICBJRlhfTG9jYWxlKiBtX3BEZWZMb2NhbGU7ICAvLyBvd25lZCBieSBtX0xvY2FsZUFycmF5IG9yIG1fWE1MTG9jYWxlQXJyYXkuCisgIFdpZGVTdHJpbmcgbV93c0NvbmZpZ0xvY2FsZTsKKyAgdWludDE2X3QgbV9kd0RlZmxjaWQ7CisgIHVpbnQxNl90IG1fZHdMb2NhbGVGbGFnczsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTE9DQUxFTUdSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGVzZXQuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxlc2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjY5ZTNiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxlc2V0LmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGVzZXQuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImxvY2FsZVNldCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0xvY2FsZVNldDo6Q1hGQV9Mb2NhbGVTZXQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok1vZGVsTm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6TG9jYWxlU2V0LAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfTG9jYWxlU2V0Ojp+Q1hGQV9Mb2NhbGVTZXQoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxlc2V0LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGVzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDY1YWQxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxlc2V0LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0xPQ0FMRVNFVF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9MT0NBTEVTRVRfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9Mb2NhbGVTZXQgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfTG9jYWxlU2V0KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfTG9jYWxlU2V0KCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0xPQ0FMRVNFVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxldmFsdWUuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxldmFsdWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZTM1NzcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGV2YWx1ZS5jcHAKQEAgLTAsMCArMSw3ODYgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xvY2FsZXZhbHVlLmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCisjaW5jbHVkZSAieGZhL2ZnYXMvY3J0L2NmZ2FzX2Zvcm1hdHN0cmluZy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxlbWdyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV91dGlscy5oIgorCituYW1lc3BhY2UgeworCitGWF9MT0NBTEVDQVRFR09SWSBWYWx1ZUNhdGVnb3J5KEZYX0xPQ0FMRUNBVEVHT1JZIGVDYXRlZ29yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdWYWx1ZVR5cGUpIHsKKyAgaWYgKGVDYXRlZ29yeSAhPSBGWF9MT0NBTEVDQVRFR09SWV9Vbmtub3duKQorICAgIHJldHVybiBlQ2F0ZWdvcnk7CisKKyAgc3dpdGNoIChkd1ZhbHVlVHlwZSkgeworICAgIGNhc2UgWEZBX1ZUX0JPT0xFQU46CisgICAgY2FzZSBYRkFfVlRfSU5URUdFUjoKKyAgICBjYXNlIFhGQV9WVF9ERUNJTUFMOgorICAgIGNhc2UgWEZBX1ZUX0ZMT0FUOgorICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX051bTsKKyAgICBjYXNlIFhGQV9WVF9URVhUOgorICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX1RleHQ7CisgICAgY2FzZSBYRkFfVlRfREFURToKKyAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9EYXRlOworICAgIGNhc2UgWEZBX1ZUX1RJTUU6CisgICAgICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfVGltZTsKKyAgICBjYXNlIFhGQV9WVF9EQVRFVElNRToKKyAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZTsKKyAgfQorICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfVW5rbm93bjsKK30KKworYm9vbCBWYWx1ZVNwbGl0RGF0ZVRpbWUoY29uc3QgV2lkZVN0cmluZyYgd3NEYXRlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIHdzRGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIHdzVGltZSkgeworICB3c0RhdGUgPSBMIiI7CisgIHdzVGltZSA9IEwiIjsKKyAgaWYgKHdzRGF0ZVRpbWUuSXNFbXB0eSgpKQorICAgIHJldHVybiBmYWxzZTsKKworICBhdXRvIG5TcGxpdEluZGV4ID0gd3NEYXRlVGltZS5GaW5kKCdUJyk7CisgIGlmICghblNwbGl0SW5kZXguaGFzX3ZhbHVlKCkpCisgICAgblNwbGl0SW5kZXggPSB3c0RhdGVUaW1lLkZpbmQoJyAnKTsKKyAgaWYgKCFuU3BsaXRJbmRleC5oYXNfdmFsdWUoKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgd3NEYXRlID0gd3NEYXRlVGltZS5MZWZ0KG5TcGxpdEluZGV4LnZhbHVlKCkpOworICB3c1RpbWUgPSB3c0RhdGVUaW1lLlJpZ2h0KHdzRGF0ZVRpbWUuR2V0TGVuZ3RoKCkgLSBuU3BsaXRJbmRleC52YWx1ZSgpIC0gMSk7CisgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9Mb2NhbGVWYWx1ZTo6Q1hGQV9Mb2NhbGVWYWx1ZSgpCisgICAgOiBtX3BMb2NhbGVNZ3IobnVsbHB0ciksIG1fZHdUeXBlKFhGQV9WVF9OVUxMKSwgbV9iVmFsaWQodHJ1ZSkge30KKworQ1hGQV9Mb2NhbGVWYWx1ZTo6Q1hGQV9Mb2NhbGVWYWx1ZShjb25zdCBDWEZBX0xvY2FsZVZhbHVlJiB2YWx1ZSkKKyAgICA6IG1fcExvY2FsZU1ncih2YWx1ZS5tX3BMb2NhbGVNZ3IpLAorICAgICAgbV93c1ZhbHVlKHZhbHVlLm1fd3NWYWx1ZSksCisgICAgICBtX2R3VHlwZSh2YWx1ZS5tX2R3VHlwZSksCisgICAgICBtX2JWYWxpZCh2YWx1ZS5tX2JWYWxpZCkge30KKworQ1hGQV9Mb2NhbGVWYWx1ZTo6Q1hGQV9Mb2NhbGVWYWx1ZSh1aW50MzJfdCBkd1R5cGUsIENYRkFfTG9jYWxlTWdyKiBwTG9jYWxlTWdyKQorICAgIDogbV9wTG9jYWxlTWdyKHBMb2NhbGVNZ3IpLAorICAgICAgbV9kd1R5cGUoZHdUeXBlKSwKKyAgICAgIG1fYlZhbGlkKG1fZHdUeXBlICE9IFhGQV9WVF9OVUxMKSB7fQorCitDWEZBX0xvY2FsZVZhbHVlOjpDWEZBX0xvY2FsZVZhbHVlKHVpbnQzMl90IGR3VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Mb2NhbGVNZ3IqIHBMb2NhbGVNZ3IpCisgICAgOiBtX3BMb2NhbGVNZ3IocExvY2FsZU1nciksCisgICAgICBtX3dzVmFsdWUod3NWYWx1ZSksCisgICAgICBtX2R3VHlwZShkd1R5cGUpLAorICAgICAgbV9iVmFsaWQoVmFsaWRhdGVDYW5vbmljYWxWYWx1ZSh3c1ZhbHVlLCBkd1R5cGUpKSB7fQorCitDWEZBX0xvY2FsZVZhbHVlOjpDWEZBX0xvY2FsZVZhbHVlKHVpbnQzMl90IGR3VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTG9jYWxlTWdyKiBwTG9jYWxlTWdyKQorICAgIDogbV9wTG9jYWxlTWdyKHBMb2NhbGVNZ3IpLAorICAgICAgbV9kd1R5cGUoZHdUeXBlKSwKKyAgICAgIG1fYlZhbGlkKFBhcnNlUGF0dGVyblZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0LCBwTG9jYWxlKSkge30KKworQ1hGQV9Mb2NhbGVWYWx1ZSYgQ1hGQV9Mb2NhbGVWYWx1ZTo6b3BlcmF0b3I9KGNvbnN0IENYRkFfTG9jYWxlVmFsdWUmIHZhbHVlKSB7CisgIG1fd3NWYWx1ZSA9IHZhbHVlLm1fd3NWYWx1ZTsKKyAgbV9kd1R5cGUgPSB2YWx1ZS5tX2R3VHlwZTsKKyAgbV9iVmFsaWQgPSB2YWx1ZS5tX2JWYWxpZDsKKyAgbV9wTG9jYWxlTWdyID0gdmFsdWUubV9wTG9jYWxlTWdyOworICByZXR1cm4gKnRoaXM7Cit9CisKK0NYRkFfTG9jYWxlVmFsdWU6On5DWEZBX0xvY2FsZVZhbHVlKCkge30KKworYm9vbCBDWEZBX0xvY2FsZVZhbHVlOjpWYWxpZGF0ZVZhbHVlKGNvbnN0IFdpZGVTdHJpbmcmIHdzVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyogcE1hdGNoRm9ybWF0KSB7CisgIFdpZGVTdHJpbmcgd3NPdXRwdXQ7CisgIElGWF9Mb2NhbGUqIGxvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7CisgIGlmIChwTG9jYWxlKQorICAgIG1fcExvY2FsZU1nci0+U2V0RGVmTG9jYWxlKHBMb2NhbGUpOworCisgIGF1dG8gcEZvcm1hdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRkdBU19Gb3JtYXRTdHJpbmc+KG1fcExvY2FsZU1ncik7CisgIHN0ZDo6dmVjdG9yPFdpZGVTdHJpbmc+IHdzUGF0dGVybnM7CisgIHBGb3JtYXQtPlNwbGl0Rm9ybWF0U3RyaW5nKHdzUGF0dGVybiwgJndzUGF0dGVybnMpOworCisgIGJvb2wgYlJldCA9IGZhbHNlOworICBpbnQzMl90IGlDb3VudCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4od3NQYXR0ZXJucyk7CisgIGludDMyX3QgaSA9IDA7CisgIGZvciAoOyBpIDwgaUNvdW50ICYmICFiUmV0OyBpKyspIHsKKyAgICBXaWRlU3RyaW5nIHdzRm9ybWF0ID0gd3NQYXR0ZXJuc1tpXTsKKyAgICBzd2l0Y2ggKFZhbHVlQ2F0ZWdvcnkocEZvcm1hdC0+R2V0Q2F0ZWdvcnkod3NGb3JtYXQpLCBtX2R3VHlwZSkpIHsKKyAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfTnVsbDoKKyAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlTnVsbCh3c1ZhbHVlLCB3c0Zvcm1hdCk7CisgICAgICAgIGlmICghYlJldCkKKyAgICAgICAgICBiUmV0ID0gd3NWYWx1ZS5Jc0VtcHR5KCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9aZXJvOgorICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VaZXJvKHdzVmFsdWUsIHdzRm9ybWF0KTsKKyAgICAgICAgaWYgKCFiUmV0KQorICAgICAgICAgIGJSZXQgPSB3c1ZhbHVlID09IEwiMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9OdW06IHsKKyAgICAgICAgV2lkZVN0cmluZyBmTnVtOworICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VOdW0od3NWYWx1ZSwgd3NGb3JtYXQsICZmTnVtKTsKKyAgICAgICAgaWYgKCFiUmV0KQorICAgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5Gb3JtYXROdW0od3NWYWx1ZSwgd3NGb3JtYXQsICZ3c091dHB1dCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9UZXh0OgorICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VUZXh0KHdzVmFsdWUsIHdzRm9ybWF0LCAmd3NPdXRwdXQpOworICAgICAgICB3c091dHB1dC5jbGVhcigpOworICAgICAgICBpZiAoIWJSZXQpCisgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdFRleHQod3NWYWx1ZSwgd3NGb3JtYXQsICZ3c091dHB1dCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlOiB7CisgICAgICAgIENGWF9EYXRlVGltZSBkdDsKKyAgICAgICAgYlJldCA9IFZhbGlkYXRlQ2Fub25pY2FsRGF0ZSh3c1ZhbHVlLCAmZHQpOworICAgICAgICBpZiAoIWJSZXQpIHsKKyAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VEYXRlVGltZSh3c1ZhbHVlLCB3c0Zvcm1hdCwgRlhfREFURVRJTUVUWVBFX0RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR0KTsKKyAgICAgICAgICBpZiAoIWJSZXQpIHsKKyAgICAgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5Gb3JtYXREYXRlVGltZSh3c1ZhbHVlLCB3c0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EQVRFVElNRVRZUEVfRGF0ZSwgJndzT3V0cHV0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWU6IHsKKyAgICAgICAgQ0ZYX0RhdGVUaW1lIGR0OworICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VEYXRlVGltZSh3c1ZhbHVlLCB3c0Zvcm1hdCwgRlhfREFURVRJTUVUWVBFX1RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdCk7CisgICAgICAgIGlmICghYlJldCkgeworICAgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5Gb3JtYXREYXRlVGltZSh3c1ZhbHVlLCB3c0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfREFURVRJTUVUWVBFX1RpbWUsICZ3c091dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lOiB7CisgICAgICAgIENGWF9EYXRlVGltZSBkdDsKKyAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlRGF0ZVRpbWUod3NWYWx1ZSwgd3NGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRV9EYXRlVGltZSwgJmR0KTsKKyAgICAgICAgaWYgKCFiUmV0KSB7CisgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdERhdGVUaW1lKHdzVmFsdWUsIHdzRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EQVRFVElNRVRZUEVfRGF0ZVRpbWUsICZ3c091dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBiUmV0ID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoYlJldCAmJiBwTWF0Y2hGb3JtYXQpCisgICAgKnBNYXRjaEZvcm1hdCA9IHdzUGF0dGVybnNbaSAtIDFdOworICBpZiAocExvY2FsZSkKKyAgICBtX3BMb2NhbGVNZ3ItPlNldERlZkxvY2FsZShsb2NhbGUpOworCisgIHJldHVybiBiUmV0OworfQorCitkb3VibGUgQ1hGQV9Mb2NhbGVWYWx1ZTo6R2V0RG91YmxlTnVtKCkgY29uc3QgeworICBpZiAobV9iVmFsaWQgJiYgKG1fZHdUeXBlID09IFhGQV9WVF9CT09MRUFOIHx8IG1fZHdUeXBlID09IFhGQV9WVF9JTlRFR0VSIHx8CisgICAgICAgICAgICAgICAgICAgbV9kd1R5cGUgPT0gWEZBX1ZUX0RFQ0lNQUwgfHwgbV9kd1R5cGUgPT0gWEZBX1ZUX0ZMT0FUKSkgeworICAgIGludDY0X3QgbkludGVncmFsID0gMDsKKyAgICB1aW50MzJfdCBkd0ZyYWN0aW9uYWwgPSAwOworICAgIGludDMyX3QgbkV4cG9uZW50ID0gMDsKKyAgICBpbnQzMl90IGNjID0gMDsKKyAgICBib29sIGJOZWdhdGl2ZSA9IGZhbHNlOworICAgIGJvb2wgYkV4cFNpZ24gPSBmYWxzZTsKKyAgICBjb25zdCB3Y2hhcl90KiBzdHIgPSBtX3dzVmFsdWUuY19zdHIoKTsKKyAgICBpbnQgbGVuID0gbV93c1ZhbHVlLkdldExlbmd0aCgpOworICAgIHdoaWxlIChGWFNZU19pc3dzcGFjZShzdHJbY2NdKSAmJiBjYyA8IGxlbikKKyAgICAgIGNjKys7CisKKyAgICBpZiAoY2MgPj0gbGVuKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYgKHN0clswXSA9PSAnKycpIHsKKyAgICAgIGNjKys7CisgICAgfSBlbHNlIGlmIChzdHJbMF0gPT0gJy0nKSB7CisgICAgICBiTmVnYXRpdmUgPSB0cnVlOworICAgICAgY2MrKzsKKyAgICB9CisKKyAgICBpbnQzMl90IG5JbnRlZ3JhbExlbiA9IDA7CisgICAgd2hpbGUgKGNjIDwgbGVuKSB7CisgICAgICBpZiAoc3RyW2NjXSA9PSAnLicgfHwgIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pIHx8CisgICAgICAgICAgbkludGVncmFsTGVuID4gMTcpIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBuSW50ZWdyYWwgPSBuSW50ZWdyYWwgKiAxMCArIHN0cltjY10gLSAnMCc7CisgICAgICBjYysrOworICAgICAgbkludGVncmFsTGVuKys7CisgICAgfQorCisgICAgbkludGVncmFsID0gYk5lZ2F0aXZlID8gLW5JbnRlZ3JhbCA6IG5JbnRlZ3JhbDsKKyAgICBpbnQzMl90IHNjYWxlID0gMDsKKyAgICBkb3VibGUgZnJhY3Rpb24gPSAwLjA7CisgICAgaWYgKGNjIDwgbGVuICYmIHN0cltjY10gPT0gJy4nKSB7CisgICAgICBjYysrOworICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7CisgICAgICAgIGZyYWN0aW9uICs9IFhGQV9HZXRGcmFjdGlvbmFsU2NhbGUoc2NhbGUpICogKHN0cltjY10gLSAnMCcpOworICAgICAgICBzY2FsZSsrOworICAgICAgICBjYysrOworICAgICAgICBpZiAoc2NhbGUgPT0gWEZBX0dldE1heEZyYWN0aW9uYWxTY2FsZSgpIHx8CisgICAgICAgICAgICAhRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZHdGcmFjdGlvbmFsID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGZyYWN0aW9uICogNDI5NDk2NzI5Ni4wKTsKKyAgICB9CisgICAgaWYgKGNjIDwgbGVuICYmIChzdHJbY2NdID09ICdFJyB8fCBzdHJbY2NdID09ICdlJykpIHsKKyAgICAgIGNjKys7CisgICAgICBpZiAoY2MgPCBsZW4pIHsKKyAgICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7CisgICAgICAgICAgY2MrKzsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICctJykgeworICAgICAgICAgIGJFeHBTaWduID0gdHJ1ZTsKKyAgICAgICAgICBjYysrOworICAgICAgICB9CisgICAgICB9CisgICAgICB3aGlsZSAoY2MgPCBsZW4pIHsKKyAgICAgICAgaWYgKHN0cltjY10gPT0gJy4nIHx8ICFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBuRXhwb25lbnQgPSBuRXhwb25lbnQgKiAxMCArIHN0cltjY10gLSAnMCc7CisgICAgICAgIGNjKys7CisgICAgICB9CisgICAgICBuRXhwb25lbnQgPSBiRXhwU2lnbiA/IC1uRXhwb25lbnQgOiBuRXhwb25lbnQ7CisgICAgfQorCisgICAgZG91YmxlIGRWYWx1ZSA9IGR3RnJhY3Rpb25hbCAvIDQyOTQ5NjcyOTYuMDsKKyAgICBkVmFsdWUgPSBuSW50ZWdyYWwgKyAobkludGVncmFsID49IDAgPyBkVmFsdWUgOiAtZFZhbHVlKTsKKyAgICBpZiAobkV4cG9uZW50ICE9IDApCisgICAgICBkVmFsdWUgKj0gRlhTWVNfcG93KDEwLCBzdGF0aWNfY2FzdDxmbG9hdD4obkV4cG9uZW50KSk7CisKKyAgICByZXR1cm4gZFZhbHVlOworICB9CisgIHJldHVybiAwOworfQorCitDRlhfRGF0ZVRpbWUgQ1hGQV9Mb2NhbGVWYWx1ZTo6R2V0RGF0ZSgpIGNvbnN0IHsKKyAgaWYgKCFtX2JWYWxpZCB8fCBtX2R3VHlwZSAhPSBYRkFfVlRfREFURSkKKyAgICByZXR1cm4gQ0ZYX0RhdGVUaW1lKCk7CisKKyAgQ0ZYX0RhdGVUaW1lIGR0OworICBGWF9EYXRlRnJvbUNhbm9uaWNhbChtX3dzVmFsdWUsICZkdCk7CisgIHJldHVybiBkdDsKK30KKworQ0ZYX0RhdGVUaW1lIENYRkFfTG9jYWxlVmFsdWU6OkdldFRpbWUoKSBjb25zdCB7CisgIGlmICghbV9iVmFsaWQgfHwgbV9kd1R5cGUgIT0gWEZBX1ZUX1RJTUUpCisgICAgcmV0dXJuIENGWF9EYXRlVGltZSgpOworCisgIENGWF9EYXRlVGltZSBkdDsKKyAgRlhfVGltZUZyb21DYW5vbmljYWwobV93c1ZhbHVlLkFzU3RyaW5nVmlldygpLCAmZHQsCisgICAgICAgICAgICAgICAgICAgICAgIG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCkpOworICByZXR1cm4gZHQ7Cit9CisKK2Jvb2wgQ1hGQV9Mb2NhbGVWYWx1ZTo6U2V0RGF0ZShjb25zdCBDRlhfRGF0ZVRpbWUmIGQpIHsKKyAgbV9kd1R5cGUgPSBYRkFfVlRfREFURTsKKyAgbV93c1ZhbHVlID0gV2lkZVN0cmluZzo6Rm9ybWF0KEwiJTA0ZC0lMDJkLSUwMmQiLCBkLkdldFllYXIoKSwgZC5HZXRNb250aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5HZXREYXkoKSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENYRkFfTG9jYWxlVmFsdWU6OlNldFRpbWUoY29uc3QgQ0ZYX0RhdGVUaW1lJiB0KSB7CisgIG1fZHdUeXBlID0gWEZBX1ZUX1RJTUU7CisgIG1fd3NWYWx1ZSA9IFdpZGVTdHJpbmc6OkZvcm1hdChMIiUwMmQ6JTAyZDolMDJkIiwgdC5HZXRIb3VyKCksIHQuR2V0TWludXRlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LkdldFNlY29uZCgpKTsKKyAgaWYgKHQuR2V0TWlsbGlzZWNvbmQoKSA+IDApCisgICAgbV93c1ZhbHVlICs9IFdpZGVTdHJpbmc6OkZvcm1hdChMIiU6MDNkIiwgdC5HZXRNaWxsaXNlY29uZCgpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ1hGQV9Mb2NhbGVWYWx1ZTo6U2V0RGF0ZVRpbWUoY29uc3QgQ0ZYX0RhdGVUaW1lJiBkdCkgeworICBtX2R3VHlwZSA9IFhGQV9WVF9EQVRFVElNRTsKKyAgbV93c1ZhbHVlID0gV2lkZVN0cmluZzo6Rm9ybWF0KEwiJTA0ZC0lMDJkLSUwMmRUJTAyZDolMDJkOiUwMmQiLCBkdC5HZXRZZWFyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdC5HZXRNb250aCgpLCBkdC5HZXREYXkoKSwgZHQuR2V0SG91cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHQuR2V0TWludXRlKCksIGR0LkdldFNlY29uZCgpKTsKKyAgaWYgKGR0LkdldE1pbGxpc2Vjb25kKCkgPiAwKQorICAgIG1fd3NWYWx1ZSArPSBXaWRlU3RyaW5nOjpGb3JtYXQoTCIlOjAzZCIsIGR0LkdldE1pbGxpc2Vjb25kKCkpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDWEZBX0xvY2FsZVZhbHVlOjpGb3JtYXRQYXR0ZXJucyhXaWRlU3RyaW5nJiB3c1Jlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkUgZVZhbHVlVHlwZSkgY29uc3QgeworICBhdXRvIHBGb3JtYXQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZHQVNfRm9ybWF0U3RyaW5nPihtX3BMb2NhbGVNZ3IpOworICBzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nPiB3c1BhdHRlcm5zOworICBwRm9ybWF0LT5TcGxpdEZvcm1hdFN0cmluZyh3c0Zvcm1hdCwgJndzUGF0dGVybnMpOworICB3c1Jlc3VsdC5jbGVhcigpOworICBpbnQzMl90IGlDb3VudCA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4od3NQYXR0ZXJucyk7CisgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgaWYgKEZvcm1hdFNpbmdsZVBhdHRlcm4od3NSZXN1bHQsIHdzUGF0dGVybnNbaV0sIHBMb2NhbGUsIGVWYWx1ZVR5cGUpKQorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENYRkFfTG9jYWxlVmFsdWU6OkZvcm1hdFNpbmdsZVBhdHRlcm4oV2lkZVN0cmluZyYgd3NSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfVkFMVUVQSUNUVVJFIGVWYWx1ZVR5cGUpIGNvbnN0IHsKKyAgSUZYX0xvY2FsZSogbG9jYWxlID0gbV9wTG9jYWxlTWdyLT5HZXREZWZMb2NhbGUoKTsKKyAgaWYgKHBMb2NhbGUpCisgICAgbV9wTG9jYWxlTWdyLT5TZXREZWZMb2NhbGUocExvY2FsZSk7CisKKyAgd3NSZXN1bHQuY2xlYXIoKTsKKyAgYm9vbCBiUmV0ID0gZmFsc2U7CisgIGF1dG8gcEZvcm1hdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRkdBU19Gb3JtYXRTdHJpbmc+KG1fcExvY2FsZU1ncik7CisgIEZYX0xPQ0FMRUNBVEVHT1JZIGVDYXRlZ29yeSA9CisgICAgICBWYWx1ZUNhdGVnb3J5KHBGb3JtYXQtPkdldENhdGVnb3J5KHdzRm9ybWF0KSwgbV9kd1R5cGUpOworICBzd2l0Y2ggKGVDYXRlZ29yeSkgeworICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfTnVsbDoKKyAgICAgIGlmIChtX3dzVmFsdWUuSXNFbXB0eSgpKQorICAgICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0TnVsbCh3c0Zvcm1hdCwgJndzUmVzdWx0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfWmVybzoKKyAgICAgIGlmIChtX3dzVmFsdWUgPT0gTCIwIikKKyAgICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdFplcm8od3NGb3JtYXQsICZ3c1Jlc3VsdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX051bToKKyAgICAgIGJSZXQgPSBwRm9ybWF0LT5Gb3JtYXROdW0obV93c1ZhbHVlLCB3c0Zvcm1hdCwgJndzUmVzdWx0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfVGV4dDoKKyAgICAgIGJSZXQgPSBwRm9ybWF0LT5Gb3JtYXRUZXh0KG1fd3NWYWx1ZSwgd3NGb3JtYXQsICZ3c1Jlc3VsdCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGU6CisgICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0RGF0ZVRpbWUobV93c1ZhbHVlLCB3c0Zvcm1hdCwgRlhfREFURVRJTUVUWVBFX0RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndzUmVzdWx0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfVGltZToKKyAgICAgIGJSZXQgPSBwRm9ybWF0LT5Gb3JtYXREYXRlVGltZShtX3dzVmFsdWUsIHdzRm9ybWF0LCBGWF9EQVRFVElNRVRZUEVfVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd3NSZXN1bHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlVGltZToKKyAgICAgIGJSZXQgPSBwRm9ybWF0LT5Gb3JtYXREYXRlVGltZShtX3dzVmFsdWUsIHdzRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRV9EYXRlVGltZSwgJndzUmVzdWx0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICB3c1Jlc3VsdCA9IG1fd3NWYWx1ZTsKKyAgICAgIGJSZXQgPSB0cnVlOworICB9CisgIGlmICghYlJldCAmJiAoZUNhdGVnb3J5ICE9IEZYX0xPQ0FMRUNBVEVHT1JZX051bSB8fAorICAgICAgICAgICAgICAgIGVWYWx1ZVR5cGUgIT0gWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KSkgeworICAgIHdzUmVzdWx0ID0gbV93c1ZhbHVlOworICB9CisgIGlmIChwTG9jYWxlKQorICAgIG1fcExvY2FsZU1nci0+U2V0RGVmTG9jYWxlKGxvY2FsZSk7CisKKyAgcmV0dXJuIGJSZXQ7Cit9CisKK2Jvb2wgQ1hGQV9Mb2NhbGVWYWx1ZTo6VmFsaWRhdGVDYW5vbmljYWxWYWx1ZShjb25zdCBXaWRlU3RyaW5nJiB3c1ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3VlR5cGUpIHsKKyAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKQorICAgIHJldHVybiB0cnVlOworCisgIENGWF9EYXRlVGltZSBkdDsKKyAgc3dpdGNoIChkd1ZUeXBlKSB7CisgICAgY2FzZSBYRkFfVlRfREFURTogeworICAgICAgaWYgKFZhbGlkYXRlQ2Fub25pY2FsRGF0ZSh3c1ZhbHVlLCAmZHQpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgV2lkZVN0cmluZyB3c0RhdGU7CisgICAgICBXaWRlU3RyaW5nIHdzVGltZTsKKyAgICAgIGlmIChWYWx1ZVNwbGl0RGF0ZVRpbWUod3NWYWx1ZSwgd3NEYXRlLCB3c1RpbWUpICYmCisgICAgICAgICAgVmFsaWRhdGVDYW5vbmljYWxEYXRlKHdzRGF0ZSwgJmR0KSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY2FzZSBYRkFfVlRfVElNRTogeworICAgICAgaWYgKFZhbGlkYXRlQ2Fub25pY2FsVGltZSh3c1ZhbHVlKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIFdpZGVTdHJpbmcgd3NEYXRlOworICAgICAgV2lkZVN0cmluZyB3c1RpbWU7CisgICAgICBpZiAoVmFsdWVTcGxpdERhdGVUaW1lKHdzVmFsdWUsIHdzRGF0ZSwgd3NUaW1lKSAmJgorICAgICAgICAgIFZhbGlkYXRlQ2Fub25pY2FsVGltZSh3c1RpbWUpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjYXNlIFhGQV9WVF9EQVRFVElNRTogeworICAgICAgV2lkZVN0cmluZyB3c0RhdGUsIHdzVGltZTsKKyAgICAgIGlmIChWYWx1ZVNwbGl0RGF0ZVRpbWUod3NWYWx1ZSwgd3NEYXRlLCB3c1RpbWUpICYmCisgICAgICAgICAgVmFsaWRhdGVDYW5vbmljYWxEYXRlKHdzRGF0ZSwgJmR0KSAmJiBWYWxpZGF0ZUNhbm9uaWNhbFRpbWUod3NUaW1lKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9IGJyZWFrOworICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIENYRkFfTG9jYWxlVmFsdWU6OlZhbGlkYXRlQ2Fub25pY2FsRGF0ZShjb25zdCBXaWRlU3RyaW5nJiB3c0RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfRGF0ZVRpbWUqIHVuRGF0ZSkgeworICBzdGF0aWMgY29uc3QgdWludDE2X3QgTGFzdERheVsxMl0gPSB7MzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzF9OworICBzdGF0aWMgY29uc3QgdWludDE2X3Qgd0NvdW50WSA9IDQ7CisgIHN0YXRpYyBjb25zdCB1aW50MTZfdCB3Q291bnRNID0gMjsKKyAgc3RhdGljIGNvbnN0IHVpbnQxNl90IHdDb3VudEQgPSAyOworICBpbnQgbkxlbiA9IHdzRGF0ZS5HZXRMZW5ndGgoKTsKKyAgaWYgKG5MZW4gPCB3Q291bnRZIHx8IG5MZW4gPiB3Q291bnRZICsgd0NvdW50TSArIHdDb3VudEQgKyAyKQorICAgIHJldHVybiBmYWxzZTsKKworICBjb25zdCBib29sIGJTeW1ib2wgPSB3c0RhdGUuQ29udGFpbnMoMHgyRCk7CisgIHVpbnQxNl90IHdZZWFyID0gMDsKKyAgdWludDE2X3Qgd01vbnRoID0gMDsKKyAgdWludDE2X3Qgd0RheSA9IDA7CisgIGNvbnN0IHdjaGFyX3QqIHBEYXRlID0gd3NEYXRlLmNfc3RyKCk7CisgIGludCBuSW5kZXggPSAwOworICBpbnQgblN0YXJ0ID0gMDsKKyAgd2hpbGUgKHBEYXRlW25JbmRleF0gIT0gJ1wwJyAmJiBuSW5kZXggPCB3Q291bnRZKSB7CisgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChwRGF0ZVtuSW5kZXhdKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHdZZWFyID0gKHBEYXRlW25JbmRleF0gLSAnMCcpICsgd1llYXIgKiAxMDsKKyAgICBuSW5kZXgrKzsKKyAgfQorICBpZiAoYlN5bWJvbCkgeworICAgIGlmIChwRGF0ZVtuSW5kZXhdICE9IDB4MkQpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgbkluZGV4Kys7CisgIH0KKworICBuU3RhcnQgPSBuSW5kZXg7CisgIHdoaWxlIChwRGF0ZVtuSW5kZXhdICE9ICdcMCcgJiYgbkluZGV4IC0gblN0YXJ0IDwgd0NvdW50TSAmJiBuSW5kZXggPCBuTGVuKSB7CisgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChwRGF0ZVtuSW5kZXhdKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHdNb250aCA9IChwRGF0ZVtuSW5kZXhdIC0gJzAnKSArIHdNb250aCAqIDEwOworICAgIG5JbmRleCsrOworICB9CisgIGlmIChiU3ltYm9sKSB7CisgICAgaWYgKHBEYXRlW25JbmRleF0gIT0gMHgyRCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBuSW5kZXgrKzsKKyAgfQorCisgIG5TdGFydCA9IG5JbmRleDsKKyAgd2hpbGUgKHBEYXRlW25JbmRleF0gIT0gJ1wwJyAmJiBuSW5kZXggLSBuU3RhcnQgPCB3Q291bnREICYmIG5JbmRleCA8IG5MZW4pIHsKKyAgICBpZiAoIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHBEYXRlW25JbmRleF0pKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgd0RheSA9IChwRGF0ZVtuSW5kZXhdIC0gJzAnKSArIHdEYXkgKiAxMDsKKyAgICBuSW5kZXgrKzsKKyAgfQorICBpZiAobkluZGV4ICE9IG5MZW4pCisgICAgcmV0dXJuIGZhbHNlOworICBpZiAod1llYXIgPCAxOTAwIHx8IHdZZWFyID4gMjAyOSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICh3TW9udGggPCAxIHx8IHdNb250aCA+IDEyKQorICAgIHJldHVybiB3TW9udGggPT0gMCAmJiBuTGVuID09IHdDb3VudFk7CisgIGlmICh3RGF5IDwgMSkKKyAgICByZXR1cm4gd0RheSA9PSAwICYmIChuTGVuID09IHdDb3VudFkgKyB3Q291bnRNKTsKKyAgaWYgKHdNb250aCA9PSAyKSB7CisgICAgaWYgKHdZZWFyICUgNDAwID09IDAgfHwgKHdZZWFyICUgMTAwICE9IDAgJiYgd1llYXIgJSA0ID09IDApKSB7CisgICAgICBpZiAod0RheSA+IDI5KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmICh3RGF5ID4gMjgpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0gZWxzZSBpZiAod0RheSA+IExhc3REYXlbd01vbnRoIC0gMV0pIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB1bkRhdGUtPlNldERhdGUod1llYXIsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHdNb250aCksCisgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OF90Pih3RGF5KSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENYRkFfTG9jYWxlVmFsdWU6OlZhbGlkYXRlQ2Fub25pY2FsVGltZShjb25zdCBXaWRlU3RyaW5nJiB3c1RpbWUpIHsKKyAgaW50IG5MZW4gPSB3c1RpbWUuR2V0TGVuZ3RoKCk7CisgIGlmIChuTGVuIDwgMikKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgY29uc3QgdWludDE2X3Qgd0NvdW50SCA9IDI7CisgIGNvbnN0IHVpbnQxNl90IHdDb3VudE0gPSAyOworICBjb25zdCB1aW50MTZfdCB3Q291bnRTID0gMjsKKyAgY29uc3QgdWludDE2X3Qgd0NvdW50RiA9IDM7CisgIGNvbnN0IGJvb2wgYlN5bWJvbCA9IHdzVGltZS5Db250YWlucygnOicpOworICB1aW50MTZfdCB3SG91ciA9IDA7CisgIHVpbnQxNl90IHdNaW51dGUgPSAwOworICB1aW50MTZfdCB3U2Vjb25kID0gMDsKKyAgdWludDE2X3Qgd0ZyYWN0aW9uID0gMDsKKyAgY29uc3Qgd2NoYXJfdCogcFRpbWUgPSB3c1RpbWUuY19zdHIoKTsKKyAgaW50IG5JbmRleCA9IDA7CisgIGludCBuU3RhcnQgPSAwOworICB3aGlsZSAobkluZGV4IC0gblN0YXJ0IDwgd0NvdW50SCAmJiBwVGltZVtuSW5kZXhdKSB7CisgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChwVGltZVtuSW5kZXhdKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB3SG91ciA9IHBUaW1lW25JbmRleF0gLSAnMCcgKyB3SG91ciAqIDEwOworICAgIG5JbmRleCsrOworICB9CisgIGlmIChiU3ltYm9sKSB7CisgICAgaWYgKG5JbmRleCA8IG5MZW4gJiYgcFRpbWVbbkluZGV4XSAhPSAnOicpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgbkluZGV4Kys7CisgIH0KKworICBuU3RhcnQgPSBuSW5kZXg7CisgIHdoaWxlIChuSW5kZXggLSBuU3RhcnQgPCB3Q291bnRNICYmIG5JbmRleCA8IG5MZW4gJiYgcFRpbWVbbkluZGV4XSkgeworICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQocFRpbWVbbkluZGV4XSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgd01pbnV0ZSA9IHBUaW1lW25JbmRleF0gLSAnMCcgKyB3TWludXRlICogMTA7CisgICAgbkluZGV4Kys7CisgIH0KKyAgaWYgKGJTeW1ib2wpIHsKKyAgICBpZiAobkluZGV4IDwgbkxlbiAmJiBwVGltZVtuSW5kZXhdICE9ICc6JykKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBuSW5kZXgrKzsKKyAgfQorICBuU3RhcnQgPSBuSW5kZXg7CisgIHdoaWxlIChuSW5kZXggLSBuU3RhcnQgPCB3Q291bnRTICYmIG5JbmRleCA8IG5MZW4gJiYgcFRpbWVbbkluZGV4XSkgeworICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQocFRpbWVbbkluZGV4XSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgd1NlY29uZCA9IHBUaW1lW25JbmRleF0gLSAnMCcgKyB3U2Vjb25kICogMTA7CisgICAgbkluZGV4Kys7CisgIH0KKyAgYXV0byBwb3MgPSB3c1RpbWUuRmluZCgnLicpOworICBpZiAocG9zLmhhc192YWx1ZSgpICYmIHBvcy52YWx1ZSgpICE9IDApIHsKKyAgICBpZiAocFRpbWVbbkluZGV4XSAhPSAnLicpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgbkluZGV4Kys7CisgICAgblN0YXJ0ID0gbkluZGV4OworICAgIHdoaWxlIChuSW5kZXggLSBuU3RhcnQgPCB3Q291bnRGICYmIG5JbmRleCA8IG5MZW4gJiYgcFRpbWVbbkluZGV4XSkgeworICAgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChwVGltZVtuSW5kZXhdKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgd0ZyYWN0aW9uID0gcFRpbWVbbkluZGV4XSAtICcwJyArIHdGcmFjdGlvbiAqIDEwOworICAgICAgbkluZGV4Kys7CisgICAgfQorICB9CisgIGlmIChuSW5kZXggPCBuTGVuKSB7CisgICAgaWYgKHBUaW1lW25JbmRleF0gPT0gJ1onKSB7CisgICAgICBuSW5kZXgrKzsKKyAgICB9IGVsc2UgaWYgKHBUaW1lW25JbmRleF0gPT0gJy0nIHx8IHBUaW1lW25JbmRleF0gPT0gJysnKSB7CisgICAgICBpbnQxNl90IG5PZmZzZXRIID0gMDsKKyAgICAgIGludDE2X3Qgbk9mZnNldE0gPSAwOworICAgICAgbkluZGV4Kys7CisgICAgICBuU3RhcnQgPSBuSW5kZXg7CisgICAgICB3aGlsZSAobkluZGV4IC0gblN0YXJ0IDwgd0NvdW50SCAmJiBuSW5kZXggPCBuTGVuICYmIHBUaW1lW25JbmRleF0pIHsKKyAgICAgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChwVGltZVtuSW5kZXhdKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIG5PZmZzZXRIID0gcFRpbWVbbkluZGV4XSAtICcwJyArIG5PZmZzZXRIICogMTA7CisgICAgICAgIG5JbmRleCsrOworICAgICAgfQorICAgICAgaWYgKGJTeW1ib2wpIHsKKyAgICAgICAgaWYgKG5JbmRleCA8IG5MZW4gJiYgcFRpbWVbbkluZGV4XSAhPSAnOicpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBuSW5kZXgrKzsKKyAgICAgIH0KKyAgICAgIG5TdGFydCA9IG5JbmRleDsKKyAgICAgIHdoaWxlIChuSW5kZXggLSBuU3RhcnQgPCB3Q291bnRNICYmIG5JbmRleCA8IG5MZW4gJiYgcFRpbWVbbkluZGV4XSkgeworICAgICAgICBpZiAoIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHBUaW1lW25JbmRleF0pKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgbk9mZnNldE0gPSBwVGltZVtuSW5kZXhdIC0gJzAnICsgbk9mZnNldE0gKiAxMDsKKyAgICAgICAgbkluZGV4Kys7CisgICAgICB9CisgICAgICBpZiAobk9mZnNldEggPiAxMiB8fCBuT2Zmc2V0TSA+PSA2MCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gbkluZGV4ID09IG5MZW4gJiYgd0hvdXIgPCAyNCAmJiB3TWludXRlIDwgNjAgJiYgd1NlY29uZCA8IDYwICYmCisgICAgICAgICB3RnJhY3Rpb24gPD0gOTk5OworfQorCitib29sIENYRkFfTG9jYWxlVmFsdWU6OlBhcnNlUGF0dGVyblZhbHVlKGNvbnN0IFdpZGVTdHJpbmcmIHdzVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSkgeworICBJRlhfTG9jYWxlKiBsb2NhbGUgPSBtX3BMb2NhbGVNZ3ItPkdldERlZkxvY2FsZSgpOworICBpZiAocExvY2FsZSkKKyAgICBtX3BMb2NhbGVNZ3ItPlNldERlZkxvY2FsZShwTG9jYWxlKTsKKworICBhdXRvIHBGb3JtYXQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZHQVNfRm9ybWF0U3RyaW5nPihtX3BMb2NhbGVNZ3IpOworICBzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nPiB3c1BhdHRlcm5zOworICBwRm9ybWF0LT5TcGxpdEZvcm1hdFN0cmluZyh3c1BhdHRlcm4sICZ3c1BhdHRlcm5zKTsKKyAgYm9vbCBiUmV0ID0gZmFsc2U7CisgIGludDMyX3QgaUNvdW50ID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90Pih3c1BhdHRlcm5zKTsKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50ICYmICFiUmV0OyBpKyspIHsKKyAgICBXaWRlU3RyaW5nIHdzRm9ybWF0ID0gd3NQYXR0ZXJuc1tpXTsKKyAgICBzd2l0Y2ggKFZhbHVlQ2F0ZWdvcnkocEZvcm1hdC0+R2V0Q2F0ZWdvcnkod3NGb3JtYXQpLCBtX2R3VHlwZSkpIHsKKyAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfTnVsbDoKKyAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlTnVsbCh3c1ZhbHVlLCB3c0Zvcm1hdCk7CisgICAgICAgIGlmIChiUmV0KQorICAgICAgICAgIG1fd3NWYWx1ZS5jbGVhcigpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfWmVybzoKKyAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlWmVybyh3c1ZhbHVlLCB3c0Zvcm1hdCk7CisgICAgICAgIGlmIChiUmV0KQorICAgICAgICAgIG1fd3NWYWx1ZSA9IEwiMCI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9OdW06IHsKKyAgICAgICAgV2lkZVN0cmluZyBmTnVtOworICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VOdW0od3NWYWx1ZSwgd3NGb3JtYXQsICZmTnVtKTsKKyAgICAgICAgaWYgKGJSZXQpCisgICAgICAgICAgbV93c1ZhbHVlID0gZk51bTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX1RleHQ6CisgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5QYXJzZVRleHQod3NWYWx1ZSwgd3NGb3JtYXQsICZtX3dzVmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZTogeworICAgICAgICBDRlhfRGF0ZVRpbWUgZHQ7CisgICAgICAgIGJSZXQgPSBWYWxpZGF0ZUNhbm9uaWNhbERhdGUod3NWYWx1ZSwgJmR0KTsKKyAgICAgICAgaWYgKCFiUmV0KSB7CisgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlRGF0ZVRpbWUod3NWYWx1ZSwgd3NGb3JtYXQsIEZYX0RBVEVUSU1FVFlQRV9EYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJSZXQpCisgICAgICAgICAgU2V0RGF0ZShkdCk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9UaW1lOiB7CisgICAgICAgIENGWF9EYXRlVGltZSBkdDsKKyAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlRGF0ZVRpbWUod3NWYWx1ZSwgd3NGb3JtYXQsIEZYX0RBVEVUSU1FVFlQRV9UaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHQpOworICAgICAgICBpZiAoYlJldCkKKyAgICAgICAgICBTZXRUaW1lKGR0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lOiB7CisgICAgICAgIENGWF9EYXRlVGltZSBkdDsKKyAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlRGF0ZVRpbWUod3NWYWx1ZSwgd3NGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRV9EYXRlVGltZSwgJmR0KTsKKyAgICAgICAgaWYgKGJSZXQpCisgICAgICAgICAgU2V0RGF0ZVRpbWUoZHQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIG1fd3NWYWx1ZSA9IHdzVmFsdWU7CisgICAgICAgIGJSZXQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKCFiUmV0KQorICAgIG1fd3NWYWx1ZSA9IHdzVmFsdWU7CisKKyAgaWYgKHBMb2NhbGUpCisgICAgbV9wTG9jYWxlTWdyLT5TZXREZWZMb2NhbGUobG9jYWxlKTsKKworICByZXR1cm4gYlJldDsKK30KKwordm9pZCBDWEZBX0xvY2FsZVZhbHVlOjpHZXROdW1lcmljRm9ybWF0KFdpZGVTdHJpbmcmIHdzRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkludExlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5EZWNMZW4pIHsKKyAgQVNTRVJUKHdzRm9ybWF0LklzRW1wdHkoKSk7CisgIEFTU0VSVChuSW50TGVuID49IC0xICYmIG5EZWNMZW4gPj0gLTEpOworCisgIGludDMyX3QgblRvdGFsTGVuID0gKG5JbnRMZW4gPj0gMCA/IG5JbnRMZW4gOiAyKSArIDEgKworICAgICAgICAgICAgICAgICAgICAgIChuRGVjTGVuID49IDAgPyBuRGVjTGVuIDogMikgKyAobkRlY0xlbiA9PSAwID8gMCA6IDEpOworICB3Y2hhcl90KiBscEJ1ZiA9IHdzRm9ybWF0LkdldEJ1ZmZlcihuVG90YWxMZW4pOworICBpbnQzMl90IG5Qb3MgPSAwOworICBscEJ1ZltuUG9zKytdID0gTCdzJzsKKworICBpZiAobkludExlbiA9PSAtMSkgeworICAgIGxwQnVmW25Qb3MrK10gPSBMJ3onOworICAgIGxwQnVmW25Qb3MrK10gPSBMJyonOworICB9IGVsc2UgeworICAgIHdoaWxlIChuSW50TGVuKSB7CisgICAgICBscEJ1ZltuUG9zKytdID0gTCd6JzsKKyAgICAgIG5JbnRMZW4tLTsKKyAgICB9CisgIH0KKyAgaWYgKG5EZWNMZW4gIT0gMCkgeworICAgIGxwQnVmW25Qb3MrK10gPSBMJy4nOworICB9CisgIGlmIChuRGVjTGVuID09IC0xKSB7CisgICAgbHBCdWZbblBvcysrXSA9IEwneic7CisgICAgbHBCdWZbblBvcysrXSA9IEwnKic7CisgIH0gZWxzZSB7CisgICAgd2hpbGUgKG5EZWNMZW4pIHsKKyAgICAgIGxwQnVmW25Qb3MrK10gPSBMJ3onOworICAgICAgbkRlY0xlbi0tOworICAgIH0KKyAgfQorICB3c0Zvcm1hdC5SZWxlYXNlQnVmZmVyKG5Ub3RhbExlbik7Cit9CisKK2Jvb2wgQ1hGQV9Mb2NhbGVWYWx1ZTo6VmFsaWRhdGVOdW1lcmljVGVtcChjb25zdCBXaWRlU3RyaW5nJiB3c051bWVyaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSkgeworICBpZiAod3NGb3JtYXQuSXNFbXB0eSgpIHx8IHdzTnVtZXJpYy5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgY29uc3Qgd2NoYXJfdCogcE51bSA9IHdzTnVtZXJpYy5jX3N0cigpOworICBjb25zdCB3Y2hhcl90KiBwRm10ID0gd3NGb3JtYXQuY19zdHIoKTsKKyAgaW50MzJfdCBuID0gMDsKKyAgaW50MzJfdCBuZiA9IDA7CisgIHdjaGFyX3QgYyA9IHBOdW1bbl07CisgIHdjaGFyX3QgY2YgPSBwRm10W25mXTsKKyAgaWYgKGNmID09IEwncycpIHsKKyAgICBpZiAoYyA9PSBMJy0nIHx8IGMgPT0gTCcrJykKKyAgICAgICsrbjsKKyAgICArK25mOworICB9CisKKyAgYm9vbCBiTGltaXQgPSB0cnVlOworICBpbnQzMl90IG5Db3VudCA9IHdzTnVtZXJpYy5HZXRMZW5ndGgoKTsKKyAgaW50MzJfdCBuQ291bnRGbXQgPSB3c0Zvcm1hdC5HZXRMZW5ndGgoKTsKKyAgd2hpbGUgKG4gPCBuQ291bnQgJiYgKGJMaW1pdCA/IG5mIDwgbkNvdW50Rm10IDogdHJ1ZSkgJiYKKyAgICAgICAgIEZYU1lTX2lzRGVjaW1hbERpZ2l0KGMgPSBwTnVtW25dKSkgeworICAgIGlmIChiTGltaXQgPT0gdHJ1ZSkgeworICAgICAgaWYgKChjZiA9IHBGbXRbbmZdKSA9PSBMJyonKQorICAgICAgICBiTGltaXQgPSBmYWxzZTsKKyAgICAgIGVsc2UgaWYgKGNmID09IEwneicpCisgICAgICAgIG5mKys7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbisrOworICB9CisgIGlmIChuID09IG5Db3VudCkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKG5mID09IG5Db3VudEZtdCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgd2hpbGUgKG5mIDwgbkNvdW50Rm10ICYmIChjZiA9IHBGbXRbbmZdKSAhPSBMJy4nKSB7CisgICAgQVNTRVJUKGNmID09IEwneicgfHwgY2YgPT0gTCcqJyk7CisgICAgKytuZjsKKyAgfQorCisgIFdpZGVTdHJpbmcgd3NEZWNpbWFsU3ltYm9sOworICBpZiAocExvY2FsZSkKKyAgICB3c0RlY2ltYWxTeW1ib2wgPSBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbCk7CisgIGVsc2UKKyAgICB3c0RlY2ltYWxTeW1ib2wgPSBXaWRlU3RyaW5nKEwnLicpOworCisgIGlmIChwRm10W25mXSAhPSBMJy4nKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKHdzRGVjaW1hbFN5bWJvbCAhPSBXaWRlU3RyaW5nVmlldyhjKSAmJiBjICE9IEwnLicpCisgICAgcmV0dXJuIGZhbHNlOworCisgICsrbmY7CisgICsrbjsKKyAgYkxpbWl0ID0gdHJ1ZTsKKyAgd2hpbGUgKG4gPCBuQ291bnQgJiYgKGJMaW1pdCA/IG5mIDwgbkNvdW50Rm10IDogdHJ1ZSkgJiYKKyAgICAgICAgIEZYU1lTX2lzRGVjaW1hbERpZ2l0KGMgPSBwTnVtW25dKSkgeworICAgIGlmIChiTGltaXQgPT0gdHJ1ZSkgeworICAgICAgaWYgKChjZiA9IHBGbXRbbmZdKSA9PSBMJyonKQorICAgICAgICBiTGltaXQgPSBmYWxzZTsKKyAgICAgIGVsc2UgaWYgKGNmID09IEwneicpCisgICAgICAgIG5mKys7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbisrOworICB9CisgIHJldHVybiBuID09IG5Db3VudDsKK30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2xvY2FsZXZhbHVlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGV2YWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZGU2MDEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGV2YWx1ZS5oCkBAIC0wLDAgKzEsOTAgQEAKKy8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9MT0NBTEVWQUxVRV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9MT0NBTEVWQUxVRV9IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfd2lkZ2V0YWNjLmgiCisKK2NsYXNzIElGWF9Mb2NhbGU7CitjbGFzcyBDRlhfRGF0ZVRpbWU7CitjbGFzcyBDWEZBX0xvY2FsZU1ncjsKKworI2RlZmluZSBYRkFfVlRfTlVMTCAwCisjZGVmaW5lIFhGQV9WVF9CT09MRUFOIDEKKyNkZWZpbmUgWEZBX1ZUX0lOVEVHRVIgMgorI2RlZmluZSBYRkFfVlRfREVDSU1BTCA0CisjZGVmaW5lIFhGQV9WVF9GTE9BVCA4CisjZGVmaW5lIFhGQV9WVF9URVhUIDE2CisjZGVmaW5lIFhGQV9WVF9EQVRFIDMyCisjZGVmaW5lIFhGQV9WVF9USU1FIDY0CisjZGVmaW5lIFhGQV9WVF9EQVRFVElNRSAxMjgKKworY2xhc3MgQ1hGQV9Mb2NhbGVWYWx1ZSB7CisgcHVibGljOgorICBDWEZBX0xvY2FsZVZhbHVlKCk7CisgIENYRkFfTG9jYWxlVmFsdWUoY29uc3QgQ1hGQV9Mb2NhbGVWYWx1ZSYgdmFsdWUpOworICBDWEZBX0xvY2FsZVZhbHVlKHVpbnQzMl90IGR3VHlwZSwgQ1hGQV9Mb2NhbGVNZ3IqIHBMb2NhbGVNZ3IpOworICBDWEZBX0xvY2FsZVZhbHVlKHVpbnQzMl90IGR3VHlwZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c1ZhbHVlLAorICAgICAgICAgICAgICAgICAgIENYRkFfTG9jYWxlTWdyKiBwTG9jYWxlTWdyKTsKKyAgQ1hGQV9Mb2NhbGVWYWx1ZSh1aW50MzJfdCBkd1R5cGUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlLAorICAgICAgICAgICAgICAgICAgIENYRkFfTG9jYWxlTWdyKiBwTG9jYWxlTWdyKTsKKyAgfkNYRkFfTG9jYWxlVmFsdWUoKTsKKyAgQ1hGQV9Mb2NhbGVWYWx1ZSYgb3BlcmF0b3I9KGNvbnN0IENYRkFfTG9jYWxlVmFsdWUmIHZhbHVlKTsKKworICBib29sIFZhbGlkYXRlVmFsdWUoY29uc3QgV2lkZVN0cmluZyYgd3NWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nKiBwTWF0Y2hGb3JtYXQpOworCisgIGJvb2wgRm9ybWF0UGF0dGVybnMoV2lkZVN0cmluZyYgd3NSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICBYRkFfVkFMVUVQSUNUVVJFIGVWYWx1ZVR5cGUpIGNvbnN0OworCisgIHZvaWQgR2V0TnVtZXJpY0Zvcm1hdChXaWRlU3RyaW5nJiB3c0Zvcm1hdCwgaW50MzJfdCBuSW50TGVuLCBpbnQzMl90IG5EZWNMZW4pOworICBib29sIFZhbGlkYXRlTnVtZXJpY1RlbXAoY29uc3QgV2lkZVN0cmluZyYgd3NOdW1lcmljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlKTsKKworICBXaWRlU3RyaW5nIEdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gbV93c1ZhbHVlOyB9CisgIHVpbnQzMl90IEdldFR5cGUoKSBjb25zdCB7IHJldHVybiBtX2R3VHlwZTsgfQorICBkb3VibGUgR2V0RG91YmxlTnVtKCkgY29uc3Q7CisgIGJvb2wgU2V0RGF0ZShjb25zdCBDRlhfRGF0ZVRpbWUmIGQpOworICBDRlhfRGF0ZVRpbWUgR2V0RGF0ZSgpIGNvbnN0OworICBDRlhfRGF0ZVRpbWUgR2V0VGltZSgpIGNvbnN0OworCisgIGJvb2wgSXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1fYlZhbGlkOyB9CisKKyBwcml2YXRlOgorICBib29sIEZvcm1hdFNpbmdsZVBhdHRlcm4oV2lkZVN0cmluZyYgd3NSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfVkFMVUVQSUNUVVJFIGVWYWx1ZVR5cGUpIGNvbnN0OworICBib29sIFZhbGlkYXRlQ2Fub25pY2FsVmFsdWUoY29uc3QgV2lkZVN0cmluZyYgd3NWYWx1ZSwgdWludDMyX3QgZHdWVHlwZSk7CisgIGJvb2wgVmFsaWRhdGVDYW5vbmljYWxEYXRlKGNvbnN0IFdpZGVTdHJpbmcmIHdzRGF0ZSwgQ0ZYX0RhdGVUaW1lKiB1bkRhdGUpOworICBib29sIFZhbGlkYXRlQ2Fub25pY2FsVGltZShjb25zdCBXaWRlU3RyaW5nJiB3c1RpbWUpOworCisgIGJvb2wgU2V0VGltZShjb25zdCBDRlhfRGF0ZVRpbWUmIHQpOworICBib29sIFNldERhdGVUaW1lKGNvbnN0IENGWF9EYXRlVGltZSYgZHQpOworCisgIGJvb2wgUGFyc2VQYXR0ZXJuVmFsdWUoY29uc3QgV2lkZVN0cmluZyYgd3NWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c1BhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSk7CisKKyAgQ1hGQV9Mb2NhbGVNZ3IqIG1fcExvY2FsZU1ncjsKKyAgV2lkZVN0cmluZyBtX3dzVmFsdWU7CisgIHVpbnQzMl90IG1fZHdUeXBlOworICBib29sIG1fYlZhbGlkOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9MT0NBTEVWQUxVRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9ja2RvY3VtZW50LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xvY2tkb2N1bWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U2NTMzNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xvY2tkb2N1bWVudC5jcHAKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9ja2RvY3VtZW50LmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpUeXBlLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpPcHRpb25hbH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMImxvY2tEb2N1bWVudCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX0xvY2tEb2N1bWVudDo6Q1hGQV9Mb2NrRG9jdW1lbnQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpMb2NrRG9jdW1lbnQsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9Mb2NrRG9jdW1lbnQ6On5DWEZBX0xvY2tEb2N1bWVudCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NrZG9jdW1lbnQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xvY2tkb2N1bWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNTAzMWEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NrZG9jdW1lbnQuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTE9DS0RPQ1VNRU5UX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX0xPQ0tET0NVTUVOVF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX0xvY2tEb2N1bWVudCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9Mb2NrRG9jdW1lbnQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9Mb2NrRG9jdW1lbnQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTE9DS0RPQ1VNRU5UX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2cuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODY1MWNiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9nLmNwcApAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2cuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0ge3tYRkFfRWxlbWVudDo6VG8sIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6VXJpLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6Ok1vZGUsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6VGhyZXNob2xkLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJsb2ciOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9Mb2c6OkNYRkFfTG9nKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkxvZywKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX0xvZzo6fkNYRkFfTG9nKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX2xvZy5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmZDI5MAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX2xvZy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9MT0dfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTE9HX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfTG9nIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX0xvZyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX0xvZygpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9MT0dfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX21hbmlmZXN0LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX21hbmlmZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmVjNzk1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWFuaWZlc3QuY3BwCkBAIC0wLDAgKzEsNDAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21hbmlmZXN0LmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbWFuaWZlc3QuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6QWN0aW9uLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpJbmNsdWRlfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwibWFuaWZlc3QiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9NYW5pZmVzdDo6Q1hGQV9NYW5pZmVzdChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6TWFuaWZlc3QsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX01hbmlmZXN0Pih0aGlzKSkge30KKworQ1hGQV9NYW5pZmVzdDo6fkNYRkFfTWFuaWZlc3QoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWFuaWZlc3QuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX21hbmlmZXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEzY2RhYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX21hbmlmZXN0LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX01BTklGRVNUX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX01BTklGRVNUX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfTWFuaWZlc3QgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfTWFuaWZlc3QoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9NYW5pZmVzdCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9NQU5JRkVTVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWFwLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX21hcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UwYzA0MQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX21hcC5jcHAKQEAgLTAsMCArMSw0MCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWFwLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbWFwLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6QmluZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RnJvbSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwibWFwIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfTWFwOjpDWEZBX01hcChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfU291cmNlU2V0KSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6TWFwLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9NYXA+KHRoaXMpKSB7fQorCitDWEZBX01hcDo6fkNYRkFfTWFwKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX21hcC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5NTY4ZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX21hcC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9NQVBfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTUFQX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfTWFwIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX01hcChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX01hcCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9NQVBfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX21hcmdpbi5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tYXJnaW4uY3BwCmluZGV4IDM4Zjk2MjYuLjI2NWQ3ZTkgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX21hcmdpbi5jcHAKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWFyZ2luLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCkBAIC02LDI2ICs2LDY4IEBACiAKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tYXJnaW4uaCIKIAotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfb2JqZWN0LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X21hcmdpbi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAotQ1hGQV9NYXJnaW46OkNYRkFfTWFyZ2luKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQorbmFtZXNwYWNlIHsKIAotYm9vbCBDWEZBX01hcmdpbjo6R2V0TGVmdEluc2V0KEZYX0ZMT0FUJiBmSW5zZXQsIEZYX0ZMT0FUIGZEZWZJbnNldCkgY29uc3QgewotICBmSW5zZXQgPSBmRGVmSW5zZXQ7Ci0gIHJldHVybiBUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTGVmdEluc2V0LCBmSW5zZXQpOworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0ge3tYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMZWZ0SW5zZXQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpNZWFzdXJlLCAodm9pZCopTCIwaW4ifSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6Qm90dG9tSW5zZXQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpNZWFzdXJlLCAodm9pZCopTCIwaW4ifSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VG9wSW5zZXQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpNZWFzdXJlLCAodm9pZCopTCIwaW4ifSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6UmlnaHRJbnNldCwgWEZBX0F0dHJpYnV0ZVR5cGU6Ok1lYXN1cmUsICh2b2lkKilMIjBpbiJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJtYXJnaW4iOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9NYXJnaW46OkNYRkFfTWFyZ2luKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpNYXJnaW4sCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX01hcmdpbj4odGhpcykpIHt9CisKK0NYRkFfTWFyZ2luOjp+Q1hGQV9NYXJnaW4oKSB7fQorCitmbG9hdCBDWEZBX01hcmdpbjo6R2V0TGVmdEluc2V0KCkgY29uc3QgeworICByZXR1cm4gVHJ5TGVmdEluc2V0KCkudmFsdWVfb3IoMCk7CiB9CiAKLWJvb2wgQ1hGQV9NYXJnaW46OkdldFRvcEluc2V0KEZYX0ZMT0FUJiBmSW5zZXQsIEZYX0ZMT0FUIGZEZWZJbnNldCkgY29uc3QgewotICBmSW5zZXQgPSBmRGVmSW5zZXQ7Ci0gIHJldHVybiBUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQsIGZJbnNldCk7CitmbG9hdCBDWEZBX01hcmdpbjo6R2V0VG9wSW5zZXQoKSBjb25zdCB7CisgIHJldHVybiBUcnlUb3BJbnNldCgpLnZhbHVlX29yKDApOwogfQogCi1ib29sIENYRkFfTWFyZ2luOjpHZXRSaWdodEluc2V0KEZYX0ZMT0FUJiBmSW5zZXQsIEZYX0ZMT0FUIGZEZWZJbnNldCkgY29uc3QgewotICBmSW5zZXQgPSBmRGVmSW5zZXQ7Ci0gIHJldHVybiBUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmlnaHRJbnNldCwgZkluc2V0KTsKK2Zsb2F0IENYRkFfTWFyZ2luOjpHZXRSaWdodEluc2V0KCkgY29uc3QgeworICByZXR1cm4gVHJ5UmlnaHRJbnNldCgpLnZhbHVlX29yKDApOwogfQogCi1ib29sIENYRkFfTWFyZ2luOjpHZXRCb3R0b21JbnNldChGWF9GTE9BVCYgZkluc2V0LCBGWF9GTE9BVCBmRGVmSW5zZXQpIGNvbnN0IHsKLSAgZkluc2V0ID0gZkRlZkluc2V0OwotICByZXR1cm4gVHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0LCBmSW5zZXQpOworZmxvYXQgQ1hGQV9NYXJnaW46OkdldEJvdHRvbUluc2V0KCkgY29uc3QgeworICByZXR1cm4gVHJ5Qm90dG9tSW5zZXQoKS52YWx1ZV9vcigwKTsKK30KKworT3B0aW9uYWw8ZmxvYXQ+IENYRkFfTWFyZ2luOjpUcnlMZWZ0SW5zZXQoKSBjb25zdCB7CisgIHJldHVybiBKU09iamVjdCgpLT5UcnlNZWFzdXJlQXNGbG9hdChYRkFfQXR0cmlidXRlOjpMZWZ0SW5zZXQpOworfQorCitPcHRpb25hbDxmbG9hdD4gQ1hGQV9NYXJnaW46OlRyeVRvcEluc2V0KCkgY29uc3QgeworICByZXR1cm4gSlNPYmplY3QoKS0+VHJ5TWVhc3VyZUFzRmxvYXQoWEZBX0F0dHJpYnV0ZTo6VG9wSW5zZXQpOworfQorCitPcHRpb25hbDxmbG9hdD4gQ1hGQV9NYXJnaW46OlRyeVJpZ2h0SW5zZXQoKSBjb25zdCB7CisgIHJldHVybiBKU09iamVjdCgpLT5UcnlNZWFzdXJlQXNGbG9hdChYRkFfQXR0cmlidXRlOjpSaWdodEluc2V0KTsKK30KKworT3B0aW9uYWw8ZmxvYXQ+IENYRkFfTWFyZ2luOjpUcnlCb3R0b21JbnNldCgpIGNvbnN0IHsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPlRyeU1lYXN1cmVBc0Zsb2F0KFhGQV9BdHRyaWJ1dGU6OkJvdHRvbUluc2V0KTsKIH0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX21hcmdpbi5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWFyZ2luLmgKaW5kZXggZDFjMTk1NS4uZTdmOTViNiAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWFyZ2luLmgKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWFyZ2luLmgKQEAgLTEsNCArMSw0IEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIApAQCAtNywxOSArNywyMiBAQAogI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9NQVJHSU5fSF8KICNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTUFSR0lOX0hfCiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGEuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCiAKLWNsYXNzIENYRkFfTm9kZTsKLQotY2xhc3MgQ1hGQV9NYXJnaW4gOiBwdWJsaWMgQ1hGQV9EYXRhIHsKK2NsYXNzIENYRkFfTWFyZ2luIDogcHVibGljIENYRkFfTm9kZSB7CiAgcHVibGljOgotICBleHBsaWNpdCBDWEZBX01hcmdpbihDWEZBX05vZGUqIHBOb2RlKTsKKyAgQ1hGQV9NYXJnaW4oQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9NYXJnaW4oKSBvdmVycmlkZTsKIAotICBib29sIEdldExlZnRJbnNldChGWF9GTE9BVCYgZkluc2V0LCBGWF9GTE9BVCBmRGVmSW5zZXQgPSAwKSBjb25zdDsKLSAgYm9vbCBHZXRUb3BJbnNldChGWF9GTE9BVCYgZkluc2V0LCBGWF9GTE9BVCBmRGVmSW5zZXQgPSAwKSBjb25zdDsKLSAgYm9vbCBHZXRSaWdodEluc2V0KEZYX0ZMT0FUJiBmSW5zZXQsIEZYX0ZMT0FUIGZEZWZJbnNldCA9IDApIGNvbnN0OwotICBib29sIEdldEJvdHRvbUluc2V0KEZYX0ZMT0FUJiBmSW5zZXQsIEZYX0ZMT0FUIGZEZWZJbnNldCA9IDApIGNvbnN0OworICBmbG9hdCBHZXRMZWZ0SW5zZXQoKSBjb25zdDsKKyAgZmxvYXQgR2V0VG9wSW5zZXQoKSBjb25zdDsKKyAgZmxvYXQgR2V0UmlnaHRJbnNldCgpIGNvbnN0OworICBmbG9hdCBHZXRCb3R0b21JbnNldCgpIGNvbnN0OworCisgIE9wdGlvbmFsPGZsb2F0PiBUcnlMZWZ0SW5zZXQoKSBjb25zdDsKKyAgT3B0aW9uYWw8ZmxvYXQ+IFRyeVRvcEluc2V0KCkgY29uc3Q7CisgIE9wdGlvbmFsPGZsb2F0PiBUcnlSaWdodEluc2V0KCkgY29uc3Q7CisgIE9wdGlvbmFsPGZsb2F0PiBUcnlCb3R0b21JbnNldCgpIGNvbnN0OwogfTsKIAogI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9NQVJHSU5fSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX21kcC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZHAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZmExY2QKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZHAuY3BwCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21kcC5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X21kcC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlNpZ25hdHVyZVR5cGUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OkZpbHRlcn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlBlcm1pc3Npb25zLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJtZHAiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9NZHA6OkNYRkFfTWRwKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpNZHAsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX01kcD4odGhpcykpIHt9CisKK0NYRkFfTWRwOjp+Q1hGQV9NZHAoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWRwLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWU2MjZkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWRwLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX01EUF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9NRFBfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9NZHAgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfTWRwKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfTWRwKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX01EUF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVhc3VyZW1lbnQuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVhc3VyZW1lbnQuY3BwCmluZGV4IGViZjdiN2IuLmQwNTM0YzkgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX21lYXN1cmVtZW50LmNwcAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWFzdXJlbWVudC5jcHAKQEAgLTYsMTM0ICs2LDE0NCBAQAogCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVhc3VyZW1lbnQuaCIKIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9leHRlbnNpb24uaCIKIAotQ1hGQV9NZWFzdXJlbWVudDo6Q1hGQV9NZWFzdXJlbWVudChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTWVhc3VyZSkgewotICBTZXQod3NNZWFzdXJlKTsKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBmbG9hdCBrUHRUb0luY2ggPSA3MjsKK2NvbnN0ZXhwciBmbG9hdCBrUHRUb0NtID0ga1B0VG9JbmNoIC8gMi41NGY7Citjb25zdGV4cHIgZmxvYXQga1B0VG9NbSA9IGtQdFRvQ20gLyAxMDsKK2NvbnN0ZXhwciBmbG9hdCBrUHRUb01wID0gMC4wMDFmOworY29uc3RleHByIGZsb2F0IGtQdFRvUGMgPSAxMjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfTWVhc3VyZW1lbnQ6OkNYRkFfTWVhc3VyZW1lbnQoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzTWVhc3VyZSkgeworICBTZXRTdHJpbmcod3NNZWFzdXJlKTsKIH0KIAogQ1hGQV9NZWFzdXJlbWVudDo6Q1hGQV9NZWFzdXJlbWVudCgpIHsKLSAgU2V0KC0xLCBYRkFfVU5JVF9Vbmtub3duKTsKKyAgU2V0KC0xLCBYRkFfVW5pdDo6VW5rbm93bik7CiB9CiAKLUNYRkFfTWVhc3VyZW1lbnQ6OkNYRkFfTWVhc3VyZW1lbnQoRlhfRkxPQVQgZlZhbHVlLCBYRkFfVU5JVCBlVW5pdCkgeworQ1hGQV9NZWFzdXJlbWVudDo6Q1hGQV9NZWFzdXJlbWVudChmbG9hdCBmVmFsdWUsIFhGQV9Vbml0IGVVbml0KSB7CiAgIFNldChmVmFsdWUsIGVVbml0KTsKIH0KIAotdm9pZCBDWEZBX01lYXN1cmVtZW50OjpTZXQoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c01lYXN1cmUpIHsKK3ZvaWQgQ1hGQV9NZWFzdXJlbWVudDo6U2V0U3RyaW5nKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c01lYXN1cmUpIHsKICAgaWYgKHdzTWVhc3VyZS5Jc0VtcHR5KCkpIHsKICAgICBtX2ZWYWx1ZSA9IDA7Ci0gICAgbV9lVW5pdCA9IFhGQV9VTklUX1Vua25vd247CisgICAgbV9lVW5pdCA9IFhGQV9Vbml0OjpVbmtub3duOwogICAgIHJldHVybjsKICAgfQorCiAgIGludDMyX3QgaVVzZWRMZW4gPSAwOwotICBpbnQzMl90IGlPZmZzZXQgPSAod3NNZWFzdXJlLkdldEF0KDApID09IEwnPScpID8gMSA6IDA7Ci0gIEZYX0ZMT0FUIGZWYWx1ZSA9IEZYU1lTX3djc3RvZih3c01lYXN1cmUuY19zdHIoKSArIGlPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c01lYXN1cmUuR2V0TGVuZ3RoKCkgLSBpT2Zmc2V0LCAmaVVzZWRMZW4pOwotICBYRkFfVU5JVCBlVW5pdCA9IEdldFVuaXQod3NNZWFzdXJlLk1pZChpT2Zmc2V0ICsgaVVzZWRMZW4pKTsKKyAgaW50MzJfdCBpT2Zmc2V0ID0gKHdzTWVhc3VyZVswXSA9PSBMJz0nKSA/IDEgOiAwOworICBmbG9hdCBmVmFsdWUgPSBGWFNZU193Y3N0b2Yod3NNZWFzdXJlLnVudGVybWluYXRlZF9jX3N0cigpICsgaU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzTWVhc3VyZS5HZXRMZW5ndGgoKSAtIGlPZmZzZXQsICZpVXNlZExlbik7CisgIFhGQV9Vbml0IGVVbml0ID0gR2V0VW5pdEZyb21TdHJpbmcoCisgICAgICB3c01lYXN1cmUuUmlnaHQod3NNZWFzdXJlLkdldExlbmd0aCgpIC0gKGlPZmZzZXQgKyBpVXNlZExlbikpKTsKICAgU2V0KGZWYWx1ZSwgZVVuaXQpOwogfQogCi1ib29sIENYRkFfTWVhc3VyZW1lbnQ6OlRvU3RyaW5nKENGWF9XaWRlU3RyaW5nJiB3c01lYXN1cmUpIGNvbnN0IHsKK1dpZGVTdHJpbmcgQ1hGQV9NZWFzdXJlbWVudDo6VG9TdHJpbmcoKSBjb25zdCB7CiAgIHN3aXRjaCAoR2V0VW5pdCgpKSB7Ci0gICAgY2FzZSBYRkFfVU5JVF9NbToKLSAgICAgIHdzTWVhc3VyZS5Gb3JtYXQoTCIlLjhnbW0iLCBHZXRWYWx1ZSgpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgWEZBX1VOSVRfUHQ6Ci0gICAgICB3c01lYXN1cmUuRm9ybWF0KEwiJS44Z3B0IiwgR2V0VmFsdWUoKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIFhGQV9VTklUX0luOgotICAgICAgd3NNZWFzdXJlLkZvcm1hdChMIiUuOGdpbiIsIEdldFZhbHVlKCkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBYRkFfVU5JVF9DbToKLSAgICAgIHdzTWVhc3VyZS5Gb3JtYXQoTCIlLjhnY20iLCBHZXRWYWx1ZSgpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgWEZBX1VOSVRfTXA6Ci0gICAgICB3c01lYXN1cmUuRm9ybWF0KEwiJS44Z21wIiwgR2V0VmFsdWUoKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIFhGQV9VTklUX1BjOgotICAgICAgd3NNZWFzdXJlLkZvcm1hdChMIiUuOGdwYyIsIEdldFZhbHVlKCkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBYRkFfVU5JVF9FbToKLSAgICAgIHdzTWVhc3VyZS5Gb3JtYXQoTCIlLjhnZW0iLCBHZXRWYWx1ZSgpKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgWEZBX1VOSVRfUGVyY2VudDoKLSAgICAgIHdzTWVhc3VyZS5Gb3JtYXQoTCIlLjhnJSUiLCBHZXRWYWx1ZSgpKTsKLSAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgWEZBX1VuaXQ6Ok1tOgorICAgICAgcmV0dXJuIFdpZGVTdHJpbmc6OkZvcm1hdChMIiUuOGdtbSIsIEdldFZhbHVlKCkpOworICAgIGNhc2UgWEZBX1VuaXQ6OlB0OgorICAgICAgcmV0dXJuIFdpZGVTdHJpbmc6OkZvcm1hdChMIiUuOGdwdCIsIEdldFZhbHVlKCkpOworICAgIGNhc2UgWEZBX1VuaXQ6OkluOgorICAgICAgcmV0dXJuIFdpZGVTdHJpbmc6OkZvcm1hdChMIiUuOGdpbiIsIEdldFZhbHVlKCkpOworICAgIGNhc2UgWEZBX1VuaXQ6OkNtOgorICAgICAgcmV0dXJuIFdpZGVTdHJpbmc6OkZvcm1hdChMIiUuOGdjbSIsIEdldFZhbHVlKCkpOworICAgIGNhc2UgWEZBX1VuaXQ6Ok1wOgorICAgICAgcmV0dXJuIFdpZGVTdHJpbmc6OkZvcm1hdChMIiUuOGdtcCIsIEdldFZhbHVlKCkpOworICAgIGNhc2UgWEZBX1VuaXQ6OlBjOgorICAgICAgcmV0dXJuIFdpZGVTdHJpbmc6OkZvcm1hdChMIiUuOGdwYyIsIEdldFZhbHVlKCkpOworICAgIGNhc2UgWEZBX1VuaXQ6OkVtOgorICAgICAgcmV0dXJuIFdpZGVTdHJpbmc6OkZvcm1hdChMIiUuOGdlbSIsIEdldFZhbHVlKCkpOworICAgIGNhc2UgWEZBX1VuaXQ6OlBlcmNlbnQ6CisgICAgICByZXR1cm4gV2lkZVN0cmluZzo6Rm9ybWF0KEwiJS44ZyUlIiwgR2V0VmFsdWUoKSk7CiAgICAgZGVmYXVsdDoKLSAgICAgIHdzTWVhc3VyZS5Gb3JtYXQoTCIlLjhnIiwgR2V0VmFsdWUoKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKICAgfQorICByZXR1cm4gV2lkZVN0cmluZzo6Rm9ybWF0KEwiJS44ZyIsIEdldFZhbHVlKCkpOwogfQogCi1ib29sIENYRkFfTWVhc3VyZW1lbnQ6OlRvVW5pdChYRkFfVU5JVCBlVW5pdCwgRlhfRkxPQVQmIGZWYWx1ZSkgY29uc3QgewotICBmVmFsdWUgPSBHZXRWYWx1ZSgpOwotICBYRkFfVU5JVCBlRnJvbSA9IEdldFVuaXQoKTsKK2Zsb2F0IENYRkFfTWVhc3VyZW1lbnQ6OlRvVW5pdChYRkFfVW5pdCBlVW5pdCkgY29uc3QgeworICBmbG9hdCBmOworICByZXR1cm4gVG9Vbml0SW50ZXJuYWwoZVVuaXQsICZmKSA/IGYgOiAwOworfQorCitib29sIENYRkFfTWVhc3VyZW1lbnQ6OlRvVW5pdEludGVybmFsKFhGQV9Vbml0IGVVbml0LCBmbG9hdCogZlZhbHVlKSBjb25zdCB7CisgICpmVmFsdWUgPSBHZXRWYWx1ZSgpOworICBYRkFfVW5pdCBlRnJvbSA9IEdldFVuaXQoKTsKICAgaWYgKGVGcm9tID09IGVVbml0KQogICAgIHJldHVybiB0cnVlOwogCiAgIHN3aXRjaCAoZUZyb20pIHsKLSAgICBjYXNlIFhGQV9VTklUX1B0OgorICAgIGNhc2UgWEZBX1VuaXQ6OlB0OgogICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfVU5JVF9NbToKLSAgICAgIGZWYWx1ZSAqPSA3MiAvIDIuNTRmIC8gMTA7CisgICAgY2FzZSBYRkFfVW5pdDo6TW06CisgICAgICAqZlZhbHVlICo9IGtQdFRvTW07CiAgICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9VTklUX0luOgotICAgICAgZlZhbHVlICo9IDcyOworICAgIGNhc2UgWEZBX1VuaXQ6OkluOgorICAgICAgKmZWYWx1ZSAqPSBrUHRUb0luY2g7CiAgICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9VTklUX0NtOgotICAgICAgZlZhbHVlICo9IDcyIC8gMi41NGY7CisgICAgY2FzZSBYRkFfVW5pdDo6Q206CisgICAgICAqZlZhbHVlICo9IGtQdFRvQ207CiAgICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9VTklUX01wOgotICAgICAgZlZhbHVlICo9IDAuMDAxZjsKKyAgICBjYXNlIFhGQV9Vbml0OjpNcDoKKyAgICAgICpmVmFsdWUgKj0ga1B0VG9NcDsKICAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX1VOSVRfUGM6Ci0gICAgICBmVmFsdWUgKj0gMTIuMGY7CisgICAgY2FzZSBYRkFfVW5pdDo6UGM6CisgICAgICAqZlZhbHVlICo9IGtQdFRvUGM7CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgZlZhbHVlID0gMDsKKyAgICAgICpmVmFsdWUgPSAwOwogICAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIHN3aXRjaCAoZVVuaXQpIHsKLSAgICBjYXNlIFhGQV9VTklUX1B0OgorICAgIGNhc2UgWEZBX1VuaXQ6OlB0OgogICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBYRkFfVU5JVF9NbToKLSAgICAgIGZWYWx1ZSAvPSA3MiAvIDIuNTRmIC8gMTA7CisgICAgY2FzZSBYRkFfVW5pdDo6TW06CisgICAgICAqZlZhbHVlIC89IGtQdFRvTW07CiAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIFhGQV9VTklUX0luOgotICAgICAgZlZhbHVlIC89IDcyOworICAgIGNhc2UgWEZBX1VuaXQ6OkluOgorICAgICAgKmZWYWx1ZSAvPSBrUHRUb0luY2g7CiAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIFhGQV9VTklUX0NtOgotICAgICAgZlZhbHVlIC89IDcyIC8gMi41NGY7CisgICAgY2FzZSBYRkFfVW5pdDo6Q206CisgICAgICAqZlZhbHVlIC89IGtQdFRvQ207CiAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIFhGQV9VTklUX01wOgotICAgICAgZlZhbHVlIC89IDAuMDAxZjsKKyAgICBjYXNlIFhGQV9Vbml0OjpNcDoKKyAgICAgICpmVmFsdWUgLz0ga1B0VG9NcDsKICAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgWEZBX1VOSVRfUGM6Ci0gICAgICBmVmFsdWUgLz0gMTIuMGY7CisgICAgY2FzZSBYRkFfVW5pdDo6UGM6CisgICAgICAqZlZhbHVlIC89IGtQdFRvUGM7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICBkZWZhdWx0OgotICAgICAgZlZhbHVlID0gMDsKKyAgICAgIE5PVFJFQUNIRUQoKTsKICAgICAgIHJldHVybiBmYWxzZTsKICAgfQogfQogCi1YRkFfVU5JVCBDWEZBX01lYXN1cmVtZW50OjpHZXRVbml0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NVbml0KSB7CisvLyBzdGF0aWMKK1hGQV9Vbml0IENYRkFfTWVhc3VyZW1lbnQ6OkdldFVuaXRGcm9tU3RyaW5nKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c1VuaXQpIHsKICAgaWYgKHdzVW5pdCA9PSBMIm1tIikKLSAgICByZXR1cm4gWEZBX1VOSVRfTW07CisgICAgcmV0dXJuIFhGQV9Vbml0OjpNbTsKICAgaWYgKHdzVW5pdCA9PSBMInB0IikKLSAgICByZXR1cm4gWEZBX1VOSVRfUHQ7CisgICAgcmV0dXJuIFhGQV9Vbml0OjpQdDsKICAgaWYgKHdzVW5pdCA9PSBMImluIikKLSAgICByZXR1cm4gWEZBX1VOSVRfSW47CisgICAgcmV0dXJuIFhGQV9Vbml0OjpJbjsKICAgaWYgKHdzVW5pdCA9PSBMImNtIikKLSAgICByZXR1cm4gWEZBX1VOSVRfQ207CisgICAgcmV0dXJuIFhGQV9Vbml0OjpDbTsKICAgaWYgKHdzVW5pdCA9PSBMInBjIikKLSAgICByZXR1cm4gWEZBX1VOSVRfUGM7CisgICAgcmV0dXJuIFhGQV9Vbml0OjpQYzsKICAgaWYgKHdzVW5pdCA9PSBMIm1wIikKLSAgICByZXR1cm4gWEZBX1VOSVRfTXA7CisgICAgcmV0dXJuIFhGQV9Vbml0OjpNcDsKICAgaWYgKHdzVW5pdCA9PSBMImVtIikKLSAgICByZXR1cm4gWEZBX1VOSVRfRW07CisgICAgcmV0dXJuIFhGQV9Vbml0OjpFbTsKICAgaWYgKHdzVW5pdCA9PSBMIiUiKQotICAgIHJldHVybiBYRkFfVU5JVF9QZXJjZW50OwotICByZXR1cm4gWEZBX1VOSVRfVW5rbm93bjsKKyAgICByZXR1cm4gWEZBX1VuaXQ6OlBlcmNlbnQ7CisgIHJldHVybiBYRkFfVW5pdDo6VW5rbm93bjsKIH0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX21lYXN1cmVtZW50LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWFzdXJlbWVudC5oCmluZGV4IDQwZjcxYTcuLmQ4M2FmMjQgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX21lYXN1cmVtZW50LmgKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVhc3VyZW1lbnQuaApAQCAtMTMsMzAgKzEzLDI5IEBACiAKIGNsYXNzIENYRkFfTWVhc3VyZW1lbnQgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9NZWFzdXJlbWVudChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTWVhc3VyZSk7CisgIGV4cGxpY2l0IENYRkFfTWVhc3VyZW1lbnQoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzTWVhc3VyZSk7CiAgIENYRkFfTWVhc3VyZW1lbnQoKTsKLSAgQ1hGQV9NZWFzdXJlbWVudChGWF9GTE9BVCBmVmFsdWUsIFhGQV9VTklUIGVVbml0KTsKKyAgQ1hGQV9NZWFzdXJlbWVudChmbG9hdCBmVmFsdWUsIFhGQV9Vbml0IGVVbml0KTsKIAotICB2b2lkIFNldChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTWVhc3VyZSk7Ci0gIHZvaWQgU2V0KEZYX0ZMT0FUIGZWYWx1ZSwgWEZBX1VOSVQgZVVuaXQpIHsKKyAgc3RhdGljIFhGQV9Vbml0IEdldFVuaXRGcm9tU3RyaW5nKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c1VuaXQpOworCisgIHZvaWQgU2V0KGZsb2F0IGZWYWx1ZSwgWEZBX1VuaXQgZVVuaXQpIHsKICAgICBtX2ZWYWx1ZSA9IGZWYWx1ZTsKICAgICBtX2VVbml0ID0gZVVuaXQ7CiAgIH0KIAotICBYRkFfVU5JVCBHZXRVbml0KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NVbml0KTsKLSAgWEZBX1VOSVQgR2V0VW5pdCgpIGNvbnN0IHsgcmV0dXJuIG1fZVVuaXQ7IH0KLSAgRlhfRkxPQVQgR2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBtX2ZWYWx1ZTsgfQorICBYRkFfVW5pdCBHZXRVbml0KCkgY29uc3QgeyByZXR1cm4gbV9lVW5pdDsgfQorICBmbG9hdCBHZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZlZhbHVlOyB9CiAKLSAgYm9vbCBUb1N0cmluZyhDRlhfV2lkZVN0cmluZyYgd3NNZWFzdXJlKSBjb25zdDsKLSAgYm9vbCBUb1VuaXQoWEZBX1VOSVQgZVVuaXQsIEZYX0ZMT0FUJiBmVmFsdWUpIGNvbnN0OwotICBGWF9GTE9BVCBUb1VuaXQoWEZBX1VOSVQgZVVuaXQpIGNvbnN0IHsKLSAgICBGWF9GTE9BVCBmOwotICAgIHJldHVybiBUb1VuaXQoZVVuaXQsIGYpID8gZiA6IDA7Ci0gIH0KKyAgV2lkZVN0cmluZyBUb1N0cmluZygpIGNvbnN0OworICBmbG9hdCBUb1VuaXQoWEZBX1VuaXQgZVVuaXQpIGNvbnN0OwogCiAgcHJpdmF0ZToKLSAgRlhfRkxPQVQgbV9mVmFsdWU7Ci0gIFhGQV9VTklUIG1fZVVuaXQ7CisgIHZvaWQgU2V0U3RyaW5nKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c01lYXN1cmUpOworICBib29sIFRvVW5pdEludGVybmFsKFhGQV9Vbml0IGVVbml0LCBmbG9hdCogZlZhbHVlKSBjb25zdDsKKworICBmbG9hdCBtX2ZWYWx1ZTsKKyAgWEZBX1VuaXQgbV9lVW5pdDsKIH07CiAKICNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTUVBU1VSRU1FTlRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX21lZGl1bS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWRpdW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYTQ5NGEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWRpdW0uY3BwCkBAIC0wLDAgKzEsNDUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21lZGl1bS5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X21lZGl1bS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpUcmF5T3V0LCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpBdXRvfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpPcmllbnRhdGlvbiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6UG9ydHJhaXR9LAorICAgIHtYRkFfQXR0cmlidXRlOjpJbWFnaW5nQkJveCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCAodm9pZCopTCJub25lIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlNob3J0LCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlRyYXlJbiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6QXV0b30sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlN0b2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb25nLCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMIm1lZGl1bSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX01lZGl1bTo6Q1hGQV9NZWRpdW0oQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6Ok1lZGl1bSwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfTWVkaXVtPih0aGlzKSkge30KKworQ1hGQV9NZWRpdW06On5DWEZBX01lZGl1bSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWRpdW0uaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX21lZGl1bS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YjljNWQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWRpdW0uaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTUVESVVNX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX01FRElVTV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX01lZGl1bSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9NZWRpdW0oQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9NZWRpdW0oKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTUVESVVNX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWRpdW1pbmZvLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX21lZGl1bWluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNDFmMWQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWRpdW1pbmZvLmNwcApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWRpdW1pbmZvLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6Ok1hcCwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwibWVkaXVtSW5mbyI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX01lZGl1bUluZm86OkNYRkFfTWVkaXVtSW5mbyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpNZWRpdW1JbmZvLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfTWVkaXVtSW5mbzo6fkNYRkFfTWVkaXVtSW5mbygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWRpdW1pbmZvLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWRpdW1pbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExMDBlYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX21lZGl1bWluZm8uaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTUVESVVNSU5GT19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9NRURJVU1JTkZPX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfTWVkaXVtSW5mbyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9NZWRpdW1JbmZvKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfTWVkaXVtSW5mbygpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9NRURJVU1JTkZPX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZXJpZGllbS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZXJpZGllbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU3Y2UyYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX21lcmlkaWVtLmNwcApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZXJpZGllbS5oIgorCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJtZXJpZGllbSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX01lcmlkaWVtOjpDWEZBX01lcmlkaWVtKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpNZXJpZGllbSwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfTWVyaWRpZW06On5DWEZBX01lcmlkaWVtKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX21lcmlkaWVtLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZXJpZGllbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYmQ0YjAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZXJpZGllbS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9NRVJJRElFTV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9NRVJJRElFTV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX01lcmlkaWVtIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX01lcmlkaWVtKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfTWVyaWRpZW0oKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTUVSSURJRU1fSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX21lcmlkaWVtbmFtZXMuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVyaWRpZW1uYW1lcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZiNjAzZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX21lcmlkaWVtbmFtZXMuY3BwCkBAIC0wLDAgKzEsMjkgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21lcmlkaWVtbmFtZXMuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0ge3tYRkFfRWxlbWVudDo6TWVyaWRpZW0sIDIsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJtZXJpZGllbU5hbWVzIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfTWVyaWRpZW1OYW1lczo6Q1hGQV9NZXJpZGllbU5hbWVzKENYRkFfRG9jdW1lbnQqIGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpNZXJpZGllbU5hbWVzLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9NZXJpZGllbU5hbWVzOjp+Q1hGQV9NZXJpZGllbU5hbWVzKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX21lcmlkaWVtbmFtZXMuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX21lcmlkaWVtbmFtZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2FkZTIxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVyaWRpZW1uYW1lcy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9NRVJJRElFTU5BTUVTX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX01FUklESUVNTkFNRVNfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9NZXJpZGllbU5hbWVzIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX01lcmlkaWVtTmFtZXMoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9NZXJpZGllbU5hbWVzKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX01FUklESUVNTkFNRVNfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX21lc3NhZ2UuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVzc2FnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmExNmVmZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX21lc3NhZ2UuY3BwCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21lc3NhZ2UuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9tZXNzYWdlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpNc2dJZCwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpTZXZlcml0eSwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwibWVzc2FnZSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX01lc3NhZ2U6OkNYRkFfTWVzc2FnZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZSgKKyAgICAgICAgICBkb2MsCisgICAgICAgICAgcGFja2V0LAorICAgICAgICAgIChYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgIFhGQV9FbGVtZW50OjpNZXNzYWdlLAorICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAga05hbWUsCisgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9NZXNzYWdlPih0aGlzKSkge30KKworQ1hGQV9NZXNzYWdlOjp+Q1hGQV9NZXNzYWdlKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX21lc3NhZ2UuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX21lc3NhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTcyZTA2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVzc2FnZS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9NRVNTQUdFX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX01FU1NBR0VfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9NZXNzYWdlIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX01lc3NhZ2UoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9NZXNzYWdlKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX01FU1NBR0VfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX21lc3NhZ2luZy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZXNzYWdpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZDc3YTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZXNzYWdpbmcuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21lc3NhZ2luZy5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwibWVzc2FnaW5nIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfTWVzc2FnaW5nOjpDWEZBX01lc3NhZ2luZyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpNZXNzYWdpbmcsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9NZXNzYWdpbmc6On5DWEZBX01lc3NhZ2luZygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZXNzYWdpbmcuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX21lc3NhZ2luZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZDE2YjMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZXNzYWdpbmcuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTUVTU0FHSU5HX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX01FU1NBR0lOR19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX01lc3NhZ2luZyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9NZXNzYWdpbmcoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9NZXNzYWdpbmcoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTUVTU0FHSU5HX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tb2RlLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX21vZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOTVmMDgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tb2RlLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tb2RlLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJtb2RlIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfTW9kZTo6Q1hGQV9Nb2RlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpNb2RlLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfTW9kZTo6fkNYRkFfTW9kZSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tb2RlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRmZDQyNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX21vZGUuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTU9ERV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9NT0RFX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfTW9kZSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9Nb2RlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfTW9kZSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9NT0RFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tb2RpZnlhbm5vdHMuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbW9kaWZ5YW5ub3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzQ5ZGJmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbW9kaWZ5YW5ub3RzLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tb2RpZnlhbm5vdHMuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMIm1vZGlmeUFubm90cyI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX01vZGlmeUFubm90czo6Q1hGQV9Nb2RpZnlBbm5vdHMoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6Ok1vZGlmeUFubm90cywKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX01vZGlmeUFubm90czo6fkNYRkFfTW9kaWZ5QW5ub3RzKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX21vZGlmeWFubm90cy5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbW9kaWZ5YW5ub3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxMDkyMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX21vZGlmeWFubm90cy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9NT0RJRllBTk5PVFNfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTU9ESUZZQU5OT1RTX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfTW9kaWZ5QW5ub3RzIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX01vZGlmeUFubm90cyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX01vZGlmeUFubm90cygpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9NT0RJRllBTk5PVFNfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX21vbnRoLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX21vbnRoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODdlZjRhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbW9udGguY3BwCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21vbnRoLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMIm1vbnRoIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfTW9udGg6OkNYRkFfTW9udGgoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6Ok1vbnRoLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9Nb250aDo6fkNYRkFfTW9udGgoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbW9udGguaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX21vbnRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkzNjFmNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX21vbnRoLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX01PTlRIX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX01PTlRIX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfTW9udGggOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfTW9udGgoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9Nb250aCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9NT05USF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbW9udGhuYW1lcy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tb250aG5hbWVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjA1YjBkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbW9udGhuYW1lcy5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbW9udGhuYW1lcy5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpNb250aCwgMTIsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkFiYnIsIFhGQV9BdHRyaWJ1dGVUeXBlOjpCb29sZWFuLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMIm1vbnRoTmFtZXMiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9Nb250aE5hbWVzOjpDWEZBX01vbnRoTmFtZXMoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6TW9udGhOYW1lcywKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX01vbnRoTmFtZXM6On5DWEZBX01vbnRoTmFtZXMoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbW9udGhuYW1lcy5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbW9udGhuYW1lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NTUxMmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tb250aG5hbWVzLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX01PTlRITkFNRVNfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTU9OVEhOQU1FU19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX01vbnRoTmFtZXMgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfTW9udGhOYW1lcyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX01vbnRoTmFtZXMoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTU9OVEhOQU1FU19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbXNnaWQuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbXNnaWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNjgzM2IKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tc2dpZC5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbXNnaWQuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMIm1zZ0lkIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfTXNnSWQ6OkNYRkFfTXNnSWQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVYsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6Ok1zZ0lkLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfTXNnSWQ6On5DWEZBX01zZ0lkKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX21zZ2lkLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tc2dpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMzA4NWEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9tc2dpZC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9NU0dJRF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9NU0dJRF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX01zZ0lkIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX01zZ0lkKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfTXNnSWQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTVNHSURfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX25hbWVhdHRyLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX25hbWVhdHRyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDQyNjk0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbmFtZWF0dHIuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25hbWVhdHRyLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJuYW1lQXR0ciI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX05hbWVBdHRyOjpDWEZBX05hbWVBdHRyKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpOYW1lQXR0ciwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX05hbWVBdHRyOjp+Q1hGQV9OYW1lQXR0cigpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9uYW1lYXR0ci5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbmFtZWF0dHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTUxNGMwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbmFtZWF0dHIuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTkFNRUFUVFJfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTkFNRUFUVFJfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9OYW1lQXR0ciA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9OYW1lQXR0cihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX05hbWVBdHRyKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX05BTUVBVFRSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9uZXZlcmVtYmVkLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX25ldmVyZW1iZWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYTY0YTcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9uZXZlcmVtYmVkLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9uZXZlcmVtYmVkLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJuZXZlckVtYmVkIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfTmV2ZXJFbWJlZDo6Q1hGQV9OZXZlckVtYmVkKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpOZXZlckVtYmVkLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfTmV2ZXJFbWJlZDo6fkNYRkFfTmV2ZXJFbWJlZCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9uZXZlcmVtYmVkLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9uZXZlcmVtYmVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlYzkyOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX25ldmVyZW1iZWQuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTkVWRVJFTUJFRF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9ORVZFUkVNQkVEX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfTmV2ZXJFbWJlZCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9OZXZlckVtYmVkKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfTmV2ZXJFbWJlZCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9ORVZFUkVNQkVEX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuY3BwCmluZGV4IDFlNTA4OTYuLmVjNzAyNzEgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuY3BwCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuY3BwCkBAIC00LDEwOCArNCw3OCBAQAogCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCiAKICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9hdXRvcmVzdG9yZXIuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9kZWNpbWFsLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9jZnhfbWVtb3J5c3RyZWFtLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb2RlcGFnZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbGVsZW1lbnQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sbm9kZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWx0ZXh0LmgiCisjaW5jbHVkZSAiZnhqcy9jZnhqc2VfZW5naW5lLmgiCiAjaW5jbHVkZSAiZnhqcy9jZnhqc2VfdmFsdWUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbm9kZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3N0bF91dGlsLmgiCi0jaW5jbHVkZSAieGZhL2ZkZS94bWwvZmRlX3htbF9pbXAuaCIKLSNpbmNsdWRlICJ4ZmEvZmdhcy9jcnQvZmdhc19jb2RlcGFnZS5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZub3RpZnkuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2ZmYXBwLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZmRvY3ZpZXcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2Zmbm90aWZ5LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9mZndpZGdldC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2FycmF5bm9kZWxpc3QuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hdHRhY2hub2RlbGlzdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2JpbmQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib3JkZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYWxjdWxhdGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYXB0aW9uLmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ldmVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2ZvbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9rZWVwLmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0cHJvY2Vzc29yLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxldmFsdWUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tYXJnaW4uaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWFzdXJlbWVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGVpdGVyYXRvcnRlbXBsYXRlLmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb2NjdXIuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zY3JpcHRjb250ZXh0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFyYS5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NpbXBsZV9wYXJzZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJmb3JtLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhdmVyc2VzdHJhdGVneV94ZmFjb250YWluZXJub2RlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsaWRhdGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWx1ZS5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfYmFzaWNfZGF0YS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfdXRpbHMuaCIKIAogbmFtZXNwYWNlIHsKIAotdm9pZCBYRkFfRGVsZXRlV2lkZVN0cmluZyh2b2lkKiBwRGF0YSkgewotICBkZWxldGUgc3RhdGljX2Nhc3Q8Q0ZYX1dpZGVTdHJpbmcqPihwRGF0YSk7Ci19Citjb25zdGV4cHIgdWludDhfdCBrTWF4RXhlY3V0ZVJlY3Vyc2lvbiA9IDI7CiAKLXZvaWQgWEZBX0NvcHlXaWRlU3RyaW5nKHZvaWQqJiBwRGF0YSkgewotICBpZiAocERhdGEpIHsKLSAgICBDRlhfV2lkZVN0cmluZyogcE5ld0RhdGEgPSBuZXcgQ0ZYX1dpZGVTdHJpbmcoKihDRlhfV2lkZVN0cmluZyopcERhdGEpOwotICAgIHBEYXRhID0gcE5ld0RhdGE7CitzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPiBOb2Rlc1NvcnRlZEJ5RG9jdW1lbnRJZHgoCisgICAgY29uc3Qgc3RkOjpzZXQ8Q1hGQV9Ob2RlKj4mIHJnTm9kZVNldCkgeworICBpZiAocmdOb2RlU2V0LmVtcHR5KCkpCisgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+KCk7CisKKyAgc3RkOjp2ZWN0b3I8Q1hGQV9Ob2RlKj4gcmdOb2RlQXJyYXk7CisgIENYRkFfTm9kZSogcENvbW1vblBhcmVudCA9ICgqcmdOb2RlU2V0LmJlZ2luKCkpLT5HZXRQYXJlbnQoKTsKKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gcENvbW1vblBhcmVudC0+R2V0Rmlyc3RDaGlsZCgpOyBwTm9kZTsKKyAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROZXh0U2libGluZygpKSB7CisgICAgaWYgKHBkZml1bTo6Q29udGFpbnNWYWx1ZShyZ05vZGVTZXQsIHBOb2RlKSkKKyAgICAgIHJnTm9kZUFycmF5LnB1c2hfYmFjayhwTm9kZSk7CiAgIH0KKyAgcmV0dXJuIHJnTm9kZUFycmF5OwogfQogCi1YRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPIGRlbGV0ZVdpZGVTdHJpbmdDYWxsQmFjayA9IHtYRkFfRGVsZXRlV2lkZVN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9Db3B5V2lkZVN0cmluZ307Ci0KLXZvaWQgWEZBX0RhdGFOb2RlRGVsZXRlQmluZEl0ZW0odm9pZCogcERhdGEpIHsKLSAgZGVsZXRlIHN0YXRpY19jYXN0PENYRkFfTm9kZUFycmF5Kj4ocERhdGEpOwotfQotCi1YRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPIGRlbGV0ZUJpbmRJdGVtQ2FsbEJhY2sgPSB7Ci0gICAgWEZBX0RhdGFOb2RlRGVsZXRlQmluZEl0ZW0sIG51bGxwdHJ9OwotCi1pbnQzMl90IEdldENvdW50KENYRkFfTm9kZSogcEluc3RNZ3JOb2RlKSB7Ci0gIEFTU0VSVChwSW5zdE1nck5vZGUpOwotICBpbnQzMl90IGlDb3VudCA9IDA7Ci0gIHVpbnQzMl90IGR3TmFtZUhhc2ggPSAwOwotICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBwSW5zdE1nck5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7Ci0gICAgICAgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsKLSAgICBYRkFfRWxlbWVudCBlQ3VyVHlwZSA9IHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpOwotICAgIGlmIChlQ3VyVHlwZSA9PSBYRkFfRWxlbWVudDo6SW5zdGFuY2VNYW5hZ2VyKQotICAgICAgYnJlYWs7Ci0gICAgaWYgKChlQ3VyVHlwZSAhPSBYRkFfRWxlbWVudDo6U3ViZm9ybSkgJiYKLSAgICAgICAgKGVDdXJUeXBlICE9IFhGQV9FbGVtZW50OjpTdWJmb3JtU2V0KSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChpQ291bnQgPT0gMCkgewotICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZSA9IHBOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOwotICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSW5zdE5hbWUgPSBwSW5zdE1nck5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7Ci0gICAgICBpZiAod3NJbnN0TmFtZS5HZXRMZW5ndGgoKSA8IDEgfHwgd3NJbnN0TmFtZS5HZXRBdCgwKSAhPSAnXycgfHwKLSAgICAgICAgICB3c0luc3ROYW1lLk1pZCgxKSAhPSB3c05hbWUpIHsKLSAgICAgICAgcmV0dXJuIGlDb3VudDsKLSAgICAgIH0KLSAgICAgIGR3TmFtZUhhc2ggPSBwTm9kZS0+R2V0TmFtZUhhc2goKTsKLSAgICB9Ci0gICAgaWYgKGR3TmFtZUhhc2ggIT0gcE5vZGUtPkdldE5hbWVIYXNoKCkpCi0gICAgICBicmVhazsKLQotICAgIGlDb3VudCsrOwotICB9Ci0gIHJldHVybiBpQ291bnQ7Ci19Ci0KLXZvaWQgU29ydE5vZGVBcnJheUJ5RG9jdW1lbnRJZHgoY29uc3QgQ1hGQV9Ob2RlU2V0JiByZ05vZGVTZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZUFycmF5JiByZ05vZGVBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4mIHJnSWR4QXJyYXkpIHsKLSAgaW50MzJfdCBpQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHJnTm9kZVNldCk7Ci0gIHJnTm9kZUFycmF5LlNldFNpemUoaUNvdW50KTsKLSAgcmdJZHhBcnJheS5TZXRTaXplKGlDb3VudCk7Ci0gIGlmIChpQ291bnQgPT0gMCkKLSAgICByZXR1cm47Ci0KLSAgaW50MzJfdCBpSW5kZXggPSAtMTsKLSAgaW50MzJfdCBpVG90YWxJbmRleCA9IC0xOwotICBDWEZBX05vZGUqIHBDb21tb25QYXJlbnQgPQotICAgICAgKCpyZ05vZGVTZXQuYmVnaW4oKSktPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOwotICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBwQ29tbW9uUGFyZW50LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gICAgICAgcE5vZGUgJiYgaUluZGV4IDwgaUNvdW50OwotICAgICAgIHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsKLSAgICBpVG90YWxJbmRleCsrOwotICAgIGlmIChwZGZpdW06OkNvbnRhaW5zVmFsdWUocmdOb2RlU2V0LCBwTm9kZSkpIHsKLSAgICAgIGlJbmRleCsrOwotICAgICAgcmdOb2RlQXJyYXlbaUluZGV4XSA9IHBOb2RlOwotICAgICAgcmdJZHhBcnJheVtpSW5kZXhdID0gaVRvdGFsSW5kZXg7Ci0gICAgfQotICB9Ci19Ci0KLXVzaW5nIENYRkFfTm9kZVNldFBhaXIgPSBzdGQ6OnBhaXI8Q1hGQV9Ob2RlU2V0LCBDWEZBX05vZGVTZXQ+OwordXNpbmcgQ1hGQV9Ob2RlU2V0UGFpciA9IHN0ZDo6cGFpcjxzdGQ6OnNldDxDWEZBX05vZGUqPiwgc3RkOjpzZXQ8Q1hGQV9Ob2RlKj4+OwogdXNpbmcgQ1hGQV9Ob2RlU2V0UGFpck1hcCA9CiAgICAgc3RkOjptYXA8dWludDMyX3QsIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX05vZGVTZXRQYWlyPj47CiB1c2luZyBDWEZBX05vZGVTZXRQYWlyTWFwTWFwID0KQEAgLTExMyw3ICs4Myw3IEBACiAKIENYRkFfTm9kZVNldFBhaXIqIE5vZGVTZXRQYWlyRm9yTm9kZShDWEZBX05vZGUqIHBOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZVNldFBhaXJNYXBNYXAqIHBNYXApIHsKLSAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsKKyAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHBOb2RlLT5HZXRQYXJlbnQoKTsKICAgdWludDMyX3QgZHdOYW1lSGFzaCA9IHBOb2RlLT5HZXROYW1lSGFzaCgpOwogICBpZiAoIXBQYXJlbnROb2RlIHx8ICFkd05hbWVIYXNoKQogICAgIHJldHVybiBudWxscHRyOwpAQCAtMTI4LDggKzk4LDggQEAKICAgcmV0dXJuICgqcE5vZGVTZXRQYWlyTWFwKVtkd05hbWVIYXNoXS5nZXQoKTsKIH0KIAotdm9pZCBSZW9yZGVyRGF0YU5vZGVzKGNvbnN0IENYRkFfTm9kZVNldCYgc1NldDEsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hGQV9Ob2RlU2V0JiBzU2V0MiwKK3ZvaWQgUmVvcmRlckRhdGFOb2Rlcyhjb25zdCBzdGQ6OnNldDxDWEZBX05vZGUqPiYgc1NldDEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8Q1hGQV9Ob2RlKj4mIHNTZXQyLAogICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkluc2VydEJlZm9yZSkgewogICBDWEZBX05vZGVTZXRQYWlyTWFwTWFwIHJnTWFwOwogICBmb3IgKENYRkFfTm9kZSogcE5vZGUgOiBzU2V0MSkgewpAQCAtMTU2LDI3ICsxMjYsMjIgQEAKICAgICAgIGlmICghcE5vZGVTZXRQYWlyKQogICAgICAgICBjb250aW51ZTsKICAgICAgIGlmICghcE5vZGVTZXRQYWlyLT5maXJzdC5lbXB0eSgpICYmICFwTm9kZVNldFBhaXItPnNlY29uZC5lbXB0eSgpKSB7Ci0gICAgICAgIENYRkFfTm9kZUFycmF5IHJnTm9kZUFycmF5MTsKLSAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgcmdOb2RlQXJyYXkyOwotICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiByZ0lkeEFycmF5MTsKLSAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4gcmdJZHhBcnJheTI7Ci0gICAgICAgIFNvcnROb2RlQXJyYXlCeURvY3VtZW50SWR4KHBOb2RlU2V0UGFpci0+Zmlyc3QsIHJnTm9kZUFycmF5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdJZHhBcnJheTEpOwotICAgICAgICBTb3J0Tm9kZUFycmF5QnlEb2N1bWVudElkeChwTm9kZVNldFBhaXItPnNlY29uZCwgcmdOb2RlQXJyYXkyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ0lkeEFycmF5Mik7CisgICAgICAgIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+IHJnTm9kZUFycmF5MSA9CisgICAgICAgICAgICBOb2Rlc1NvcnRlZEJ5RG9jdW1lbnRJZHgocE5vZGVTZXRQYWlyLT5maXJzdCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+IHJnTm9kZUFycmF5MiA9CisgICAgICAgICAgICBOb2Rlc1NvcnRlZEJ5RG9jdW1lbnRJZHgocE5vZGVTZXRQYWlyLT5zZWNvbmQpOwogICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gbnVsbHB0cjsKICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlTm9kZSA9IG51bGxwdHI7CiAgICAgICAgIGlmIChiSW5zZXJ0QmVmb3JlKSB7Ci0gICAgICAgICAgcEJlZm9yZU5vZGUgPSByZ05vZGVBcnJheTJbMF07Ci0gICAgICAgICAgcFBhcmVudE5vZGUgPSBwQmVmb3JlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7CisgICAgICAgICAgcEJlZm9yZU5vZGUgPSByZ05vZGVBcnJheTIuZnJvbnQoKTsKKyAgICAgICAgICBwUGFyZW50Tm9kZSA9IHBCZWZvcmVOb2RlLT5HZXRQYXJlbnQoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBDWEZBX05vZGUqIHBMYXN0Tm9kZSA9IHJnTm9kZUFycmF5MltyZ0lkeEFycmF5Mi5HZXRTaXplKCkgLSAxXTsKLSAgICAgICAgICBwUGFyZW50Tm9kZSA9IHBMYXN0Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7Ci0gICAgICAgICAgcEJlZm9yZU5vZGUgPSBwTGFzdE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7CisgICAgICAgICAgQ1hGQV9Ob2RlKiBwTGFzdE5vZGUgPSByZ05vZGVBcnJheTIuYmFjaygpOworICAgICAgICAgIHBQYXJlbnROb2RlID0gcExhc3ROb2RlLT5HZXRQYXJlbnQoKTsKKyAgICAgICAgICBwQmVmb3JlTm9kZSA9IHBMYXN0Tm9kZS0+R2V0TmV4dFNpYmxpbmcoKTsKICAgICAgICAgfQotICAgICAgICBmb3IgKGludDMyX3QgaUlkeCA9IDA7IGlJZHggPCByZ0lkeEFycmF5MS5HZXRTaXplKCk7IGlJZHgrKykgewotICAgICAgICAgIENYRkFfTm9kZSogcEN1ck5vZGUgPSByZ05vZGVBcnJheTFbaUlkeF07Ci0gICAgICAgICAgcFBhcmVudE5vZGUtPlJlbW92ZUNoaWxkKHBDdXJOb2RlKTsKKyAgICAgICAgZm9yIChhdXRvKiBwQ3VyTm9kZSA6IHJnTm9kZUFycmF5MSkgeworICAgICAgICAgIHBQYXJlbnROb2RlLT5SZW1vdmVDaGlsZChwQ3VyTm9kZSwgdHJ1ZSk7CiAgICAgICAgICAgcFBhcmVudE5vZGUtPkluc2VydENoaWxkKHBDdXJOb2RlLCBwQmVmb3JlTm9kZSk7CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTE4NSwzMDggKzE1MCw0MSBAQAogICB9CiB9CiAKLUNYRkFfTm9kZSogR2V0SXRlbShDWEZBX05vZGUqIHBJbnN0TWdyTm9kZSwgaW50MzJfdCBpSW5kZXgpIHsKLSAgQVNTRVJUKHBJbnN0TWdyTm9kZSk7Ci0gIGludDMyX3QgaUNvdW50ID0gMDsKLSAgdWludDMyX3QgZHdOYW1lSGFzaCA9IDA7Ci0gIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHBJbnN0TWdyTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsKLSAgICAgICBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgewotICAgIFhGQV9FbGVtZW50IGVDdXJUeXBlID0gcE5vZGUtPkdldEVsZW1lbnRUeXBlKCk7Ci0gICAgaWYgKGVDdXJUeXBlID09IFhGQV9FbGVtZW50OjpJbnN0YW5jZU1hbmFnZXIpCi0gICAgICBicmVhazsKLSAgICBpZiAoKGVDdXJUeXBlICE9IFhGQV9FbGVtZW50OjpTdWJmb3JtKSAmJgotICAgICAgICAoZUN1clR5cGUgIT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm1TZXQpKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKGlDb3VudCA9PSAwKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NOYW1lID0gcE5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7Ci0gICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJbnN0TmFtZSA9IHBJbnN0TWdyTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsKLSAgICAgIGlmICh3c0luc3ROYW1lLkdldExlbmd0aCgpIDwgMSB8fCB3c0luc3ROYW1lLkdldEF0KDApICE9ICdfJyB8fAotICAgICAgICAgIHdzSW5zdE5hbWUuTWlkKDEpICE9IHdzTmFtZSkgewotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgIH0KLSAgICAgIGR3TmFtZUhhc2ggPSBwTm9kZS0+R2V0TmFtZUhhc2goKTsKLSAgICB9Ci0gICAgaWYgKGR3TmFtZUhhc2ggIT0gcE5vZGUtPkdldE5hbWVIYXNoKCkpCi0gICAgICBicmVhazsKLQotICAgIGlDb3VudCsrOwotICAgIGlmIChpQ291bnQgPiBpSW5kZXgpCi0gICAgICByZXR1cm4gcE5vZGU7Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLXZvaWQgSW5zZXJ0SXRlbShDWEZBX05vZGUqIHBJbnN0TWdyTm9kZSwKLSAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBOZXdJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICBpbnQzMl90IGlQb3MsCi0gICAgICAgICAgICAgICAgaW50MzJfdCBpQ291bnQgPSAtMSwKLSAgICAgICAgICAgICAgICBib29sIGJNb3ZlRGF0YUJpbmRpbmdOb2RlcyA9IHRydWUpIHsKLSAgaWYgKGlDb3VudCA8IDApCi0gICAgaUNvdW50ID0gR2V0Q291bnQocEluc3RNZ3JOb2RlKTsKLSAgaWYgKGlQb3MgPCAwKQotICAgIGlQb3MgPSBpQ291bnQ7Ci0gIGlmIChpUG9zID09IGlDb3VudCkgewotICAgIENYRkFfTm9kZSogcE5leHRTaWJsaW5nID0KLSAgICAgICAgaUNvdW50ID4gMAotICAgICAgICAgICAgPyBHZXRJdGVtKHBJbnN0TWdyTm9kZSwgaUNvdW50IC0gMSkKLSAgICAgICAgICAgICAgICAgIC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKQotICAgICAgICAgICAgOiBwSW5zdE1nck5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7Ci0gICAgcEluc3RNZ3JOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KQotICAgICAgICAtPkluc2VydENoaWxkKHBOZXdJbnN0YW5jZSwgcE5leHRTaWJsaW5nKTsKLSAgICBpZiAoYk1vdmVEYXRhQmluZGluZ05vZGVzKSB7Ci0gICAgICBDWEZBX05vZGVTZXQgc05ldzsKLSAgICAgIENYRkFfTm9kZVNldCBzQWZ0ZXI7Ci0gICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQUNvbnRhaW5lck5vZGU+Ci0gICAgICAgICAgc0l0ZXJhdG9yTmV3KHBOZXdJbnN0YW5jZSk7Ci0gICAgICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBzSXRlcmF0b3JOZXcuR2V0Q3VycmVudCgpOyBwTm9kZTsKLSAgICAgICAgICAgcE5vZGUgPSBzSXRlcmF0b3JOZXcuTW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gcE5vZGUtPkdldEJpbmREYXRhKCk7Ci0gICAgICAgIGlmICghcERhdGFOb2RlKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIHNOZXcuaW5zZXJ0KHBEYXRhTm9kZSk7Ci0gICAgICB9Ci0gICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQUNvbnRhaW5lck5vZGU+Ci0gICAgICAgICAgc0l0ZXJhdG9yQWZ0ZXIocE5leHRTaWJsaW5nKTsKLSAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHNJdGVyYXRvckFmdGVyLkdldEN1cnJlbnQoKTsgcE5vZGU7Ci0gICAgICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yQWZ0ZXIuTW92ZVRvTmV4dCgpKSB7Ci0gICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gcE5vZGUtPkdldEJpbmREYXRhKCk7Ci0gICAgICAgIGlmICghcERhdGFOb2RlKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIHNBZnRlci5pbnNlcnQocERhdGFOb2RlKTsKLSAgICAgIH0KLSAgICAgIFJlb3JkZXJEYXRhTm9kZXMoc05ldywgc0FmdGVyLCBmYWxzZSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIENYRkFfTm9kZSogcEJlZm9yZUluc3RhbmNlID0gR2V0SXRlbShwSW5zdE1nck5vZGUsIGlQb3MpOwotICAgIHBJbnN0TWdyTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkKLSAgICAgICAgLT5JbnNlcnRDaGlsZChwTmV3SW5zdGFuY2UsIHBCZWZvcmVJbnN0YW5jZSk7Ci0gICAgaWYgKGJNb3ZlRGF0YUJpbmRpbmdOb2RlcykgewotICAgICAgQ1hGQV9Ob2RlU2V0IHNOZXc7Ci0gICAgICBDWEZBX05vZGVTZXQgc0JlZm9yZTsKLSAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZT4KLSAgICAgICAgICBzSXRlcmF0b3JOZXcocE5ld0luc3RhbmNlKTsKLSAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHNJdGVyYXRvck5ldy5HZXRDdXJyZW50KCk7IHBOb2RlOwotICAgICAgICAgICBwTm9kZSA9IHNJdGVyYXRvck5ldy5Nb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUgPSBwTm9kZS0+R2V0QmluZERhdGEoKTsKLSAgICAgICAgaWYgKCFwRGF0YU5vZGUpCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgc05ldy5pbnNlcnQocERhdGFOb2RlKTsKLSAgICAgIH0KLSAgICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZT4KLSAgICAgICAgICBzSXRlcmF0b3JCZWZvcmUocEJlZm9yZUluc3RhbmNlKTsKLSAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHNJdGVyYXRvckJlZm9yZS5HZXRDdXJyZW50KCk7IHBOb2RlOwotICAgICAgICAgICBwTm9kZSA9IHNJdGVyYXRvckJlZm9yZS5Nb3ZlVG9OZXh0KCkpIHsKLSAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUgPSBwTm9kZS0+R2V0QmluZERhdGEoKTsKLSAgICAgICAgaWYgKCFwRGF0YU5vZGUpCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgc0JlZm9yZS5pbnNlcnQocERhdGFOb2RlKTsKLSAgICAgIH0KLSAgICAgIFJlb3JkZXJEYXRhTm9kZXMoc05ldywgc0JlZm9yZSwgdHJ1ZSk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgUmVtb3ZlSXRlbShDWEZBX05vZGUqIHBJbnN0TWdyTm9kZSwKLSAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBSZW1vdmVJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICBib29sIGJSZW1vdmVEYXRhQmluZGluZyA9IHRydWUpIHsKLSAgcEluc3RNZ3JOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KS0+UmVtb3ZlQ2hpbGQocFJlbW92ZUluc3RhbmNlKTsKLSAgaWYgKCFiUmVtb3ZlRGF0YUJpbmRpbmcpCi0gICAgcmV0dXJuOwotCi0gIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZT4KLSAgICAgIHNJdGVyYXRvcihwUmVtb3ZlSW5zdGFuY2UpOwotICBmb3IgKENYRkFfTm9kZSogcEZvcm1Ob2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcEZvcm1Ob2RlOwotICAgICAgIHBGb3JtTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsKLSAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IHBGb3JtTm9kZS0+R2V0QmluZERhdGEoKTsKLSAgICBpZiAoIXBEYXRhTm9kZSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgaWYgKHBEYXRhTm9kZS0+UmVtb3ZlQmluZEl0ZW0ocEZvcm1Ob2RlKSA9PSAwKSB7Ci0gICAgICBpZiAoQ1hGQV9Ob2RlKiBwRGF0YVBhcmVudCA9Ci0gICAgICAgICAgICAgIHBEYXRhTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpIHsKLSAgICAgICAgcERhdGFQYXJlbnQtPlJlbW92ZUNoaWxkKHBEYXRhTm9kZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHBGb3JtTm9kZS0+U2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUsIG51bGxwdHIpOwotICB9Ci19Ci0KLUNYRkFfTm9kZSogQ3JlYXRlSW5zdGFuY2UoQ1hGQV9Ob2RlKiBwSW5zdE1nck5vZGUsIGJvb2wgYkRhdGFNZXJnZSkgewotICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwSW5zdE1nck5vZGUtPkdldERvY3VtZW50KCk7Ci0gIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSA9IHBJbnN0TWdyTm9kZS0+R2V0VGVtcGxhdGVOb2RlKCk7Ci0gIENYRkFfTm9kZSogcEZvcm1QYXJlbnQgPSBwSW5zdE1nck5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOwotICBDWEZBX05vZGUqIHBEYXRhU2NvcGUgPSBudWxscHRyOwotICBmb3IgKENYRkFfTm9kZSogcFJvb3RCb3VuZE5vZGUgPSBwRm9ybVBhcmVudDsKLSAgICAgICBwUm9vdEJvdW5kTm9kZSAmJiBwUm9vdEJvdW5kTm9kZS0+SXNDb250YWluZXJOb2RlKCk7Ci0gICAgICAgcFJvb3RCb3VuZE5vZGUgPSBwUm9vdEJvdW5kTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpIHsKLSAgICBwRGF0YVNjb3BlID0gcFJvb3RCb3VuZE5vZGUtPkdldEJpbmREYXRhKCk7Ci0gICAgaWYgKHBEYXRhU2NvcGUpCi0gICAgICBicmVhazsKLSAgfQotICBpZiAoIXBEYXRhU2NvcGUpIHsKLSAgICBwRGF0YVNjb3BlID0gVG9Ob2RlKHBEb2N1bWVudC0+R2V0WEZBT2JqZWN0KFhGQV9IQVNIQ09ERV9SZWNvcmQpKTsKLSAgICBBU1NFUlQocERhdGFTY29wZSk7Ci0gIH0KLSAgQ1hGQV9Ob2RlKiBwSW5zdGFuY2UgPSBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKAotICAgICAgcFRlbXBsYXRlTm9kZSwgcEZvcm1QYXJlbnQsIHBEYXRhU2NvcGUsIHRydWUsIGJEYXRhTWVyZ2UsIHRydWUpOwotICBpZiAocEluc3RhbmNlKSB7Ci0gICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucyhwSW5zdGFuY2UpOwotICAgIHBGb3JtUGFyZW50LT5SZW1vdmVDaGlsZChwSW5zdGFuY2UpOwotICB9Ci0gIHJldHVybiBwSW5zdGFuY2U7Ci19Ci0KLXN0cnVjdCBYRkFfRXhlY0V2ZW50UGFyYUluZm8gewotIHB1YmxpYzoKLSAgdWludDMyX3QgbV91SGFzaDsKLSAgY29uc3QgRlhfV0NIQVIqIG1fbHBjRXZlbnROYW1lOwotICBYRkFfRVZFTlRUWVBFIG1fZXZlbnRUeXBlOwotICB1aW50MzJfdCBtX3ZhbGlkRmxhZ3M7Ci19Owotc3RhdGljIGNvbnN0IFhGQV9FeGVjRXZlbnRQYXJhSW5mbyBnc19ldmVudFBhcmFJbmZvc1tdID0gewotICAgIHsweDAyYTZjNTVhLCBMInBvc3RTdWJtaXQiLCBYRkFfRVZFTlRfUG9zdFN1Ym1pdCwgMH0sCi0gICAgezB4MGFiNDY2YmIsIEwicHJlU3VibWl0IiwgWEZBX0VWRU5UX1ByZVN1Ym1pdCwgMH0sCi0gICAgezB4MTA5ZDdjZTcsIEwibW91c2VFbnRlciIsIFhGQV9FVkVOVF9Nb3VzZUVudGVyLCA1fSwKLSAgICB7MHgxN2ZhZDM3MywgTCJwb3N0UHJpbnQiLCBYRkFfRVZFTlRfUG9zdFByaW50LCAwfSwKLSAgICB7MHgxYmZjNzJkOSwgTCJwcmVPcGVuIiwgWEZBX0VWRU5UX1ByZU9wZW4sIDd9LAotICAgIHsweDIxOTZhNDUyLCBMImluaXRpYWxpemUiLCBYRkFfRVZFTlRfSW5pdGlhbGl6ZSwgMX0sCi0gICAgezB4Mjc0MTBmMDMsIEwibW91c2VFeGl0IiwgWEZBX0VWRU5UX01vdXNlRXhpdCwgNX0sCi0gICAgezB4MzNjNDNkZWMsIEwiZG9jQ2xvc2UiLCBYRkFfRVZFTlRfRG9jQ2xvc2UsIDB9LAotICAgIHsweDM2MWZhMWI2LCBMInByZVNhdmUiLCBYRkFfRVZFTlRfUHJlU2F2ZSwgMH0sCi0gICAgezB4MzZmMWM2ZDgsIEwicHJlU2lnbiIsIFhGQV9FVkVOVF9QcmVTaWduLCA2fSwKLSAgICB7MHg0NzMxZDZiYSwgTCJleGl0IiwgWEZBX0VWRU5UX0V4aXQsIDJ9LAotICAgIHsweDU2YmY0NTZiLCBMImRvY1JlYWR5IiwgWEZBX0VWRU5UX0RvY1JlYWR5LCAwfSwKLSAgICB7MHg3MjMzMDE4YSwgTCJ2YWxpZGF0ZSIsIFhGQV9FVkVOVF9WYWxpZGF0ZSwgMX0sCi0gICAgezB4ODgwODM4NWUsIEwiaW5kZXhDaGFuZ2UiLCBYRkFfRVZFTlRfSW5kZXhDaGFuZ2UsIDN9LAotICAgIHsweDg5MWY0NjA2LCBMImNoYW5nZSIsIFhGQV9FVkVOVF9DaGFuZ2UsIDR9LAotICAgIHsweDk1MjhhN2I0LCBMInByZVByaW50IiwgWEZBX0VWRU5UX1ByZVByaW50LCAwfSwKLSAgICB7MHg5ZjY5M2IyMSwgTCJtb3VzZURvd24iLCBYRkFfRVZFTlRfTW91c2VEb3duLCA1fSwKLSAgICB7MHhjZGNlNTZiMywgTCJmdWxsIiwgWEZBX0VWRU5UX0Z1bGwsIDR9LAotICAgIHsweGQ1NzZkMDhlLCBMIm1vdXNlVXAiLCBYRkFfRVZFTlRfTW91c2VVcCwgNX0sCi0gICAgezB4ZDk1NjU3YTYsIEwiY2xpY2siLCBYRkFfRVZFTlRfQ2xpY2ssIDR9LAotICAgIHsweGRiZmJlMDJlLCBMImNhbGN1bGF0ZSIsIFhGQV9FVkVOVF9DYWxjdWxhdGUsIDF9LAotICAgIHsweGUyNWZhN2I4LCBMInBvc3RPcGVuIiwgWEZBX0VWRU5UX1Bvc3RPcGVuLCA3fSwKLSAgICB7MHhlMjhkY2U3ZSwgTCJlbnRlciIsIFhGQV9FVkVOVF9FbnRlciwgMn0sCi0gICAgezB4ZmM4MmQ2OTUsIEwicG9zdFNhdmUiLCBYRkFfRVZFTlRfUG9zdFNhdmUsIDB9LAotICAgIHsweGZkNTRmYmI3LCBMInBvc3RTaWduIiwgWEZBX0VWRU5UX1Bvc3RTaWduLCA2fSwKLX07Ci0KLWNvbnN0IFhGQV9FeGVjRXZlbnRQYXJhSW5mbyogR2V0RXZlbnRQYXJhSW5mb0J5TmFtZSgKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRXZlbnROYW1lKSB7Ci0gIHVpbnQzMl90IHVIYXNoID0gRlhfSGFzaENvZGVfR2V0Vyh3c0V2ZW50TmFtZSwgZmFsc2UpOwotICBpbnQzMl90IGlTdGFydCA9IDA7Ci0gIGludDMyX3QgaUVuZCA9IChzaXplb2YoZ3NfZXZlbnRQYXJhSW5mb3MpIC8gc2l6ZW9mKGdzX2V2ZW50UGFyYUluZm9zWzBdKSkgLSAxOwotICBkbyB7Ci0gICAgaW50MzJfdCBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsKLSAgICBjb25zdCBYRkFfRXhlY0V2ZW50UGFyYUluZm8qIGV2ZW50UGFyYUluZm8gPSAmZ3NfZXZlbnRQYXJhSW5mb3NbaU1pZF07Ci0gICAgaWYgKHVIYXNoID09IGV2ZW50UGFyYUluZm8tPm1fdUhhc2gpCi0gICAgICByZXR1cm4gZXZlbnRQYXJhSW5mbzsKLSAgICBpZiAodUhhc2ggPCBldmVudFBhcmFJbmZvLT5tX3VIYXNoKQotICAgICAgaUVuZCA9IGlNaWQgLSAxOwotICAgIGVsc2UKLSAgICAgIGlTdGFydCA9IGlNaWQgKyAxOwotICB9IHdoaWxlIChpU3RhcnQgPD0gaUVuZCk7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi12b2lkIFN0clRvUkdCKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBzdHJSR0IsCi0gICAgICAgICAgICAgIGludDMyX3QmIHIsCi0gICAgICAgICAgICAgIGludDMyX3QmIGcsCi0gICAgICAgICAgICAgIGludDMyX3QmIGIpIHsKLSAgciA9IDA7Ci0gIGcgPSAwOwotICBiID0gMDsKLQotICBGWF9XQ0hBUiB6ZXJvID0gJzAnOwotICBpbnQzMl90IGlJbmRleCA9IDA7Ci0gIGludDMyX3QgaUxlbiA9IHN0clJHQi5HZXRMZW5ndGgoKTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUxlbjsgKytpKSB7Ci0gICAgRlhfV0NIQVIgY2ggPSBzdHJSR0IuR2V0QXQoaSk7Ci0gICAgaWYgKGNoID09IEwnLCcpCi0gICAgICArK2lJbmRleDsKLSAgICBpZiAoaUluZGV4ID4gMikKLSAgICAgIGJyZWFrOwotCi0gICAgaW50MzJfdCBpVmFsdWUgPSBjaCAtIHplcm87Ci0gICAgaWYgKGlWYWx1ZSA+PSAwICYmIGlWYWx1ZSA8PSA5KSB7Ci0gICAgICBzd2l0Y2ggKGlJbmRleCkgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgciA9IHIgKiAxMCArIGlWYWx1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAxOgotICAgICAgICAgIGcgPSBnICogMTAgKyBpVmFsdWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYiA9IGIgKiAxMCArIGlWYWx1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotZW51bSBYRkFfS0VZVFlQRSB7Ci0gIFhGQV9LRVlUWVBFX0N1c3RvbSwKLSAgWEZBX0tFWVRZUEVfRWxlbWVudCwKLX07Ci0KLXZvaWQqIEdldE1hcEtleV9DdXN0b20oY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0tleSkgewotICB1aW50MzJfdCBkd0tleSA9IEZYX0hhc2hDb2RlX0dldFcod3NLZXksIGZhbHNlKTsKLSAgcmV0dXJuICh2b2lkKikodWludHB0cl90KSgoZHdLZXkgPDwgMSkgfCBYRkFfS0VZVFlQRV9DdXN0b20pOwotfQotCi12b2lkKiBHZXRNYXBLZXlfRWxlbWVudChYRkFfRWxlbWVudCBlVHlwZSwgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIHJldHVybiAodm9pZCopKHVpbnRwdHJfdCkoKHN0YXRpY19jYXN0PGludDMyX3Q+KGVUeXBlKSA8PCAxNikgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlQXR0cmlidXRlIDw8IDgpIHwgWEZBX0tFWVRZUEVfRWxlbWVudCk7Ci19Ci0KLWNvbnN0IFhGQV9BVFRSSUJVVEVJTkZPKiBHZXRBdHRyaWJ1dGVPZkVsZW1lbnQoWEZBX0VsZW1lbnQgZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdQYWNrZXQpIHsKLSAgaW50MzJfdCBpQ291bnQgPSAwOwotICBjb25zdCB1aW50OF90KiBwQXR0ciA9IFhGQV9HZXRFbGVtZW50QXR0cmlidXRlcyhlRWxlbWVudCwgaUNvdW50KTsKLSAgaWYgKCFwQXR0ciB8fCBpQ291bnQgPCAxKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIGlmICghc3RkOjpiaW5hcnlfc2VhcmNoKHBBdHRyLCBwQXR0ciArIGlDb3VudCwgZUF0dHJpYnV0ZSkpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgY29uc3QgWEZBX0FUVFJJQlVURUlORk8qIHBJbmZvID0gWEZBX0dldEF0dHJpYnV0ZUJ5SUQoZUF0dHJpYnV0ZSk7Ci0gIEFTU0VSVChwSW5mbyk7Ci0gIGlmIChkd1BhY2tldCA9PSBYRkFfWERQUEFDS0VUX1VOS05PV04pCi0gICAgcmV0dXJuIHBJbmZvOwotICByZXR1cm4gKGR3UGFja2V0ICYgcEluZm8tPmR3UGFja2V0cykgPyBwSW5mbyA6IG51bGxwdHI7Ci19Ci0KLWNvbnN0IFhGQV9BVFRSSUJVVEVFTlVNSU5GTyogR2V0QXR0cmlidXRlRW51bUJ5SUQoWEZBX0FUVFJJQlVURUVOVU0gZU5hbWUpIHsKLSAgcmV0dXJuIGdfWEZBRW51bURhdGEgKyBlTmFtZTsKLX0KLQogfSAgLy8gbmFtZXNwYWNlCiAKLXN0YXRpYyB2b2lkIFhGQV9EZWZhdWx0RnJlZURhdGEodm9pZCogcERhdGEpIHt9CisvLyBzdGF0aWMKK1dpZGVTdHJpbmcgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVFbnVtVG9OYW1lKFhGQV9BdHRyaWJ1dGVFbnVtIGl0ZW0pIHsKKyAgcmV0dXJuIGdfWEZBRW51bURhdGFbc3RhdGljX2Nhc3Q8aW50MzJfdD4oaXRlbSldLnBOYW1lOworfQogCi1zdGF0aWMgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyBnc19YRkFEZWZhdWx0RnJlZURhdGEgPSB7Ci0gICAgWEZBX0RlZmF1bHRGcmVlRGF0YSwgbnVsbHB0cn07CisvLyBzdGF0aWMKK09wdGlvbmFsPFhGQV9BdHRyaWJ1dGVFbnVtPiBDWEZBX05vZGU6Ok5hbWVUb0F0dHJpYnV0ZUVudW0oCisgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIG5hbWUpIHsKKyAgaWYgKG5hbWUuSXNFbXB0eSgpKQorICAgIHJldHVybiB7fTsKIAotWEZBX01BUE1PRFVMRURBVEE6OlhGQV9NQVBNT0RVTEVEQVRBKCkge30KLQotWEZBX01BUE1PRFVMRURBVEE6On5YRkFfTUFQTU9EVUxFREFUQSgpIHt9CisgIGF1dG8qIGl0ID0gc3RkOjpsb3dlcl9ib3VuZChnX1hGQUVudW1EYXRhLCBnX1hGQUVudW1EYXRhICsgZ19pWEZBRW51bUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfSGFzaENvZGVfR2V0VyhuYW1lLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBYRkFfQXR0cmlidXRlRW51bUluZm8mIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGhhc2gpIHsgcmV0dXJuIGFyZy51SGFzaCA8IGhhc2g7IH0pOworICBpZiAoaXQgIT0gZ19YRkFFbnVtRGF0YSArIGdfaVhGQUVudW1Db3VudCAmJiBuYW1lID09IGl0LT5wTmFtZSkKKyAgICByZXR1cm4ge2l0LT5lTmFtZX07CisgIHJldHVybiB7fTsKK30KIAogQ1hGQV9Ob2RlOjpDWEZBX05vZGUoQ1hGQV9Eb2N1bWVudCogcERvYywKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IGVQYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBlUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsaWRQYWNrZXRzLAogICAgICAgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGUgb1R5cGUsCiAgICAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudCBlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZWxlbWVudE5hbWUpCi0gICAgOiBDWEZBX09iamVjdChwRG9jLCBvVHlwZSwgZVR5cGUsIGVsZW1lbnROYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFByb3BlcnR5RGF0YSogcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZURhdGEqIGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgZWxlbWVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pYX09iamVjdD4ganNfbm9kZSkKKyAgICA6IENYRkFfT2JqZWN0KHBEb2MsIG9UeXBlLCBlVHlwZSwgZWxlbWVudE5hbWUsIHN0ZDo6bW92ZShqc19ub2RlKSksCisgICAgICBtX1Byb3BlcnRpZXMocHJvcGVydGllcyksCisgICAgICBtX0F0dHJpYnV0ZXMoYXR0cmlidXRlcyksCisgICAgICBtX1ZhbGlkUGFja2V0cyh2YWxpZFBhY2tldHMpLAogICAgICAgbV9wTmV4dChudWxscHRyKSwKICAgICAgIG1fcENoaWxkKG51bGxwdHIpLAogICAgICAgbV9wTGFzdENoaWxkKG51bGxwdHIpLApAQCAtNDk1LDE0ICsxOTMsMzEgQEAKICAgICAgIG1fZVBhY2tldChlUGFja2V0KSwKICAgICAgIG1fdU5vZGVGbGFncyhYRkFfTm9kZUZsYWdfTm9uZSksCiAgICAgICBtX2R3TmFtZUhhc2goMCksCi0gICAgICBtX3BBdXhOb2RlKG51bGxwdHIpLAotICAgICAgbV9wTWFwTW9kdWxlRGF0YShudWxscHRyKSB7CisgICAgICBtX3BBdXhOb2RlKG51bGxwdHIpIHsKICAgQVNTRVJUKG1fcERvY3VtZW50KTsKIH0KIAorQ1hGQV9Ob2RlOjpDWEZBX05vZGUoQ1hGQV9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIGVQYWNrZXQsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWxpZFBhY2tldHMsCisgICAgICAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZSBvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50IGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJvcGVydHlEYXRhKiBwcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlRGF0YSogYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBlbGVtZW50TmFtZSkKKyAgICA6IENYRkFfTm9kZShwRG9jLAorICAgICAgICAgICAgICAgIGVQYWNrZXQsCisgICAgICAgICAgICAgICAgdmFsaWRQYWNrZXRzLAorICAgICAgICAgICAgICAgIG9UeXBlLAorICAgICAgICAgICAgICAgIGVUeXBlLAorICAgICAgICAgICAgICAgIHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICBlbGVtZW50TmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX05vZGU+KHRoaXMpKSB7fQorCiBDWEZBX05vZGU6On5DWEZBX05vZGUoKSB7CiAgIEFTU0VSVCghbV9wUGFyZW50KTsKLSAgUmVtb3ZlTWFwTW9kdWxlS2V5KCk7CisKICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcENoaWxkOwogICB3aGlsZSAocE5vZGUpIHsKICAgICBDWEZBX05vZGUqIHBOZXh0ID0gcE5vZGUtPm1fcE5leHQ7CkBAIC01MTksMTg3ICsyMzQsMjM1IEBACiAgIGlmICghcENsb25lKQogICAgIHJldHVybiBudWxscHRyOwogCi0gIE1lcmdlQWxsRGF0YShwQ2xvbmUpOworICBKU09iamVjdCgpLT5NZXJnZUFsbERhdGEocENsb25lKTsKICAgcENsb25lLT5VcGRhdGVOYW1lSGFzaCgpOwogICBpZiAoSXNOZWVkU2F2aW5nWE1MTm9kZSgpKSB7Ci0gICAgQ0ZERV9YTUxOb2RlKiBwQ2xvbmVYTUwgPSBudWxscHRyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhfWE1MTm9kZT4gcENsb25lWE1MOwogICAgIGlmIChJc0F0dHJpYnV0ZUluWE1MKCkpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZTsKLSAgICAgIEdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSwgZmFsc2UpOwotICAgICAgQ0ZERV9YTUxFbGVtZW50KiBwQ2xvbmVYTUxFbGVtZW50ID0gbmV3IENGREVfWE1MRWxlbWVudCh3c05hbWUpOwotICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWUgPSBHZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlKTsKLSAgICAgIGlmICghd3NWYWx1ZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgcENsb25lWE1MRWxlbWVudC0+U2V0VGV4dERhdGEoQ0ZYX1dpZGVTdHJpbmcod3NWYWx1ZSkpOwotICAgICAgfQotICAgICAgcENsb25lWE1MID0gcENsb25lWE1MRWxlbWVudDsKLSAgICAgIHBDbG9uZVhNTEVsZW1lbnQgPSBudWxscHRyOwotICAgICAgcENsb25lLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfQ29udGFpbnMsIFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd24pOworICAgICAgV2lkZVN0cmluZyB3c05hbWUgPSBKU09iamVjdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlRyeUF0dHJpYnV0ZShYRkFfQXR0cmlidXRlOjpOYW1lLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9vcihXaWRlU3RyaW5nKCkpOworICAgICAgYXV0byBwQ2xvbmVYTUxFbGVtZW50ID0gcGRmaXVtOjpNYWtlVW5pcXVlPENGWF9YTUxFbGVtZW50Pih3c05hbWUpOworICAgICAgV2lkZVN0cmluZyB3c1ZhbHVlID0gSlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6VmFsdWUpOworICAgICAgaWYgKCF3c1ZhbHVlLklzRW1wdHkoKSkKKyAgICAgICAgcENsb25lWE1MRWxlbWVudC0+U2V0VGV4dERhdGEoV2lkZVN0cmluZyh3c1ZhbHVlKSk7CisKKyAgICAgIHBDbG9uZVhNTC5yZXNldChwQ2xvbmVYTUxFbGVtZW50LnJlbGVhc2UoKSk7CisgICAgICBwQ2xvbmUtPkpTT2JqZWN0KCktPlNldEVudW0oWEZBX0F0dHJpYnV0ZTo6Q29udGFpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZUVudW06OlVua25vd24sIGZhbHNlKTsKICAgICB9IGVsc2UgewotICAgICAgcENsb25lWE1MID0gbV9wWE1MTm9kZS0+Q2xvbmUoZmFsc2UpOworICAgICAgcENsb25lWE1MID0gbV9wWE1MTm9kZS0+Q2xvbmUoKTsKICAgICB9Ci0gICAgcENsb25lLT5TZXRYTUxNYXBwaW5nTm9kZShwQ2xvbmVYTUwpOworICAgIHBDbG9uZS0+U2V0WE1MTWFwcGluZ05vZGUocENsb25lWE1MLnJlbGVhc2UoKSk7CiAgICAgcENsb25lLT5TZXRGbGFnKFhGQV9Ob2RlRmxhZ19Pd25YTUxOb2RlLCBmYWxzZSk7CiAgIH0KICAgaWYgKGJSZWN1cnNpdmUpIHsKLSAgICBmb3IgKENYRkFfTm9kZSogcENoaWxkID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwQ2hpbGQ7Ci0gICAgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsKLSAgICAgIHBDbG9uZS0+SW5zZXJ0Q2hpbGQocENoaWxkLT5DbG9uZShiUmVjdXJzaXZlKSk7CisgICAgZm9yIChDWEZBX05vZGUqIHBDaGlsZCA9IEdldEZpcnN0Q2hpbGQoKTsgcENoaWxkOworICAgICAgICAgcENoaWxkID0gcENoaWxkLT5HZXROZXh0U2libGluZygpKSB7CisgICAgICBwQ2xvbmUtPkluc2VydENoaWxkKHBDaGlsZC0+Q2xvbmUoYlJlY3Vyc2l2ZSksIG51bGxwdHIpOwogICAgIH0KICAgfQogICBwQ2xvbmUtPlNldEZsYWcoWEZBX05vZGVGbGFnX0luaXRpYWxpemVkLCB0cnVlKTsKLSAgcENsb25lLT5TZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwgbnVsbHB0cik7CisgIHBDbG9uZS0+U2V0QmluZGluZ05vZGUobnVsbHB0cik7CiAgIHJldHVybiBwQ2xvbmU7CiB9CiAKLUNYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXROb2RlSXRlbShYRkFfTk9ERUlURU0gZUl0ZW0pIGNvbnN0IHsKLSAgc3dpdGNoIChlSXRlbSkgewotICAgIGNhc2UgWEZBX05PREVJVEVNX05leHRTaWJsaW5nOgotICAgICAgcmV0dXJuIG1fcE5leHQ7Ci0gICAgY2FzZSBYRkFfTk9ERUlURU1fRmlyc3RDaGlsZDoKLSAgICAgIHJldHVybiBtX3BDaGlsZDsKLSAgICBjYXNlIFhGQV9OT0RFSVRFTV9QYXJlbnQ6Ci0gICAgICByZXR1cm4gbV9wUGFyZW50OwotICAgIGNhc2UgWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nOgotICAgICAgaWYgKG1fcFBhcmVudCkgewotICAgICAgICBDWEZBX05vZGUqIHBTaWJsaW5nID0gbV9wUGFyZW50LT5tX3BDaGlsZDsKLSAgICAgICAgQ1hGQV9Ob2RlKiBwUHJldiA9IG51bGxwdHI7Ci0gICAgICAgIHdoaWxlIChwU2libGluZyAmJiBwU2libGluZyAhPSB0aGlzKSB7Ci0gICAgICAgICAgcFByZXYgPSBwU2libGluZzsKLSAgICAgICAgICBwU2libGluZyA9IHBTaWJsaW5nLT5tX3BOZXh0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwUHJldjsKLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXRQcmV2U2libGluZygpIGNvbnN0IHsKKyAgaWYgKCFtX3BQYXJlbnQgfHwgbV9wUGFyZW50LT5tX3BDaGlsZCA9PSB0aGlzKQorICAgIHJldHVybiBudWxscHRyOworCisgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcFBhcmVudC0+bV9wQ2hpbGQ7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5tX3BOZXh0KSB7CisgICAgaWYgKHBOb2RlLT5tX3BOZXh0ID09IHRoaXMpCisgICAgICByZXR1cm4gcE5vZGU7CiAgIH0KICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLUNYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXROb2RlSXRlbShYRkFfTk9ERUlURU0gZUl0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGUgZVR5cGUpIGNvbnN0IHsKLSAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG51bGxwdHI7Ci0gIHN3aXRjaCAoZUl0ZW0pIHsKLSAgICBjYXNlIFhGQV9OT0RFSVRFTV9OZXh0U2libGluZzoKLSAgICAgIHBOb2RlID0gbV9wTmV4dDsKLSAgICAgIHdoaWxlIChwTm9kZSAmJiBwTm9kZS0+R2V0T2JqZWN0VHlwZSgpICE9IGVUeXBlKQotICAgICAgICBwTm9kZSA9IHBOb2RlLT5tX3BOZXh0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfTk9ERUlURU1fRmlyc3RDaGlsZDoKLSAgICAgIHBOb2RlID0gbV9wQ2hpbGQ7Ci0gICAgICB3aGlsZSAocE5vZGUgJiYgcE5vZGUtPkdldE9iamVjdFR5cGUoKSAhPSBlVHlwZSkKLSAgICAgICAgcE5vZGUgPSBwTm9kZS0+bV9wTmV4dDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX05PREVJVEVNX1BhcmVudDoKLSAgICAgIHBOb2RlID0gbV9wUGFyZW50OwotICAgICAgd2hpbGUgKHBOb2RlICYmIHBOb2RlLT5HZXRPYmplY3RUeXBlKCkgIT0gZVR5cGUpCi0gICAgICAgIHBOb2RlID0gcE5vZGUtPm1fcFBhcmVudDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nOgotICAgICAgaWYgKG1fcFBhcmVudCkgewotICAgICAgICBDWEZBX05vZGUqIHBTaWJsaW5nID0gbV9wUGFyZW50LT5tX3BDaGlsZDsKLSAgICAgICAgd2hpbGUgKHBTaWJsaW5nICYmIHBTaWJsaW5nICE9IHRoaXMpIHsKLSAgICAgICAgICBpZiAoZVR5cGUgPT0gcFNpYmxpbmctPkdldE9iamVjdFR5cGUoKSkKLSAgICAgICAgICAgIHBOb2RlID0gcFNpYmxpbmc7Ci0KLSAgICAgICAgICBwU2libGluZyA9IHBTaWJsaW5nLT5tX3BOZXh0OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXROZXh0Q29udGFpbmVyU2libGluZygpIGNvbnN0IHsKKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5leHQ7CisgIHdoaWxlIChwTm9kZSAmJiBwTm9kZS0+R2V0T2JqZWN0VHlwZSgpICE9IFhGQV9PYmplY3RUeXBlOjpDb250YWluZXJOb2RlKQorICAgIHBOb2RlID0gcE5vZGUtPm1fcE5leHQ7CiAgIHJldHVybiBwTm9kZTsKIH0KIAotaW50MzJfdCBDWEZBX05vZGU6OkdldE5vZGVMaXN0KENYRkFfTm9kZUFycmF5JiBub2RlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1R5cGVGaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQgZVR5cGVGaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGV2ZWwpIHsKLSAgaWYgKC0taUxldmVsIDwgMCkgewotICAgIHJldHVybiBub2Rlcy5HZXRTaXplKCk7CitDWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0UHJldkNvbnRhaW5lclNpYmxpbmcoKSBjb25zdCB7CisgIGlmICghbV9wUGFyZW50IHx8IG1fcFBhcmVudC0+bV9wQ2hpbGQgPT0gdGhpcykKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBDWEZBX05vZGUqIGNvbnRhaW5lciA9IG51bGxwdHI7CisgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcFBhcmVudC0+bV9wQ2hpbGQ7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5tX3BOZXh0KSB7CisgICAgaWYgKHBOb2RlLT5HZXRPYmplY3RUeXBlKCkgPT0gWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGUpCisgICAgICBjb250YWluZXIgPSBwTm9kZTsKKyAgICBpZiAocE5vZGUtPm1fcE5leHQgPT0gdGhpcykKKyAgICAgIHJldHVybiBjb250YWluZXI7CiAgIH0KLSAgaWYgKGVUeXBlRmlsdGVyICE9IFhGQV9FbGVtZW50OjpVbmtub3duKSB7Ci0gICAgQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBtX3BDaGlsZDsKLSAgICB3aGlsZSAocENoaWxkKSB7Ci0gICAgICBpZiAocENoaWxkLT5HZXRFbGVtZW50VHlwZSgpID09IGVUeXBlRmlsdGVyKSB7Ci0gICAgICAgIG5vZGVzLkFkZChwQ2hpbGQpOwotICAgICAgICBpZiAoaUxldmVsID4gMCkgewotICAgICAgICAgIEdldE5vZGVMaXN0KG5vZGVzLCBkd1R5cGVGaWx0ZXIsIGVUeXBlRmlsdGVyLCBpTGV2ZWwpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwQ2hpbGQgPSBwQ2hpbGQtPm1fcE5leHQ7Ci0gICAgfQotICB9IGVsc2UgaWYgKGR3VHlwZUZpbHRlciA9PQotICAgICAgICAgICAgIChYRkFfTk9ERUZJTFRFUl9DaGlsZHJlbiB8IFhGQV9OT0RFRklMVEVSX1Byb3BlcnRpZXMpKSB7Ci0gICAgQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBtX3BDaGlsZDsKLSAgICB3aGlsZSAocENoaWxkKSB7Ci0gICAgICBub2Rlcy5BZGQocENoaWxkKTsKLSAgICAgIGlmIChpTGV2ZWwgPiAwKSB7Ci0gICAgICAgIEdldE5vZGVMaXN0KG5vZGVzLCBkd1R5cGVGaWx0ZXIsIGVUeXBlRmlsdGVyLCBpTGV2ZWwpOwotICAgICAgfQotICAgICAgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0OwotICAgIH0KLSAgfSBlbHNlIGlmIChkd1R5cGVGaWx0ZXIgIT0gMCkgewotICAgIGJvb2wgYkZpbHRlckNoaWxkcmVuID0gISEoZHdUeXBlRmlsdGVyICYgWEZBX05PREVGSUxURVJfQ2hpbGRyZW4pOwotICAgIGJvb2wgYkZpbHRlclByb3BlcnRpZXMgPSAhIShkd1R5cGVGaWx0ZXIgJiBYRkFfTk9ERUZJTFRFUl9Qcm9wZXJ0aWVzKTsKLSAgICBib29sIGJGaWx0ZXJPbmVPZlByb3BlcnRpZXMgPQotICAgICAgICAhIShkd1R5cGVGaWx0ZXIgJiBYRkFfTk9ERUZJTFRFUl9PbmVPZlByb3BlcnR5KTsKLSAgICBDWEZBX05vZGUqIHBDaGlsZCA9IG1fcENoaWxkOwotICAgIHdoaWxlIChwQ2hpbGQpIHsKLSAgICAgIGNvbnN0IFhGQV9QUk9QRVJUWSogcFByb3BlcnR5ID0gWEZBX0dldFByb3BlcnR5T2ZFbGVtZW50KAotICAgICAgICAgIEdldEVsZW1lbnRUeXBlKCksIHBDaGlsZC0+R2V0RWxlbWVudFR5cGUoKSwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOKTsKLSAgICAgIGlmIChwUHJvcGVydHkpIHsKLSAgICAgICAgaWYgKGJGaWx0ZXJQcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgbm9kZXMuQWRkKHBDaGlsZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYkZpbHRlck9uZU9mUHJvcGVydGllcyAmJgotICAgICAgICAgICAgICAgICAgIChwUHJvcGVydHktPnVGbGFncyAmIFhGQV9QUk9QRVJUWUZMQUdfT25lT2YpKSB7Ci0gICAgICAgICAgbm9kZXMuQWRkKHBDaGlsZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYkZpbHRlckNoaWxkcmVuICYmCi0gICAgICAgICAgICAgICAgICAgKHBDaGlsZC0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6VmFyaWFibGVzIHx8Ci0gICAgICAgICAgICAgICAgICAgIHBDaGlsZC0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6UGFnZVNldCkpIHsKLSAgICAgICAgICBub2Rlcy5BZGQocENoaWxkKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChiRmlsdGVyQ2hpbGRyZW4pIHsKLSAgICAgICAgbm9kZXMuQWRkKHBDaGlsZCk7Ci0gICAgICB9Ci0gICAgICBwQ2hpbGQgPSBwQ2hpbGQtPm1fcE5leHQ7Ci0gICAgfQotICAgIGlmIChiRmlsdGVyT25lT2ZQcm9wZXJ0aWVzICYmIG5vZGVzLkdldFNpemUoKSA8IDEpIHsKLSAgICAgIGludDMyX3QgaVByb3BlcnRpZXMgPSAwOwotICAgICAgY29uc3QgWEZBX1BST1BFUlRZKiBwUHJvcGVydHkgPQotICAgICAgICAgIFhGQV9HZXRFbGVtZW50UHJvcGVydGllcyhHZXRFbGVtZW50VHlwZSgpLCBpUHJvcGVydGllcyk7Ci0gICAgICBpZiAoIXBQcm9wZXJ0eSB8fCBpUHJvcGVydGllcyA8IDEpCi0gICAgICAgIHJldHVybiAwOwotICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVByb3BlcnRpZXM7IGkrKykgewotICAgICAgICBpZiAocFByb3BlcnR5W2ldLnVGbGFncyAmIFhGQV9QUk9QRVJUWUZMQUdfRGVmYXVsdE9uZU9mKSB7Ci0gICAgICAgICAgY29uc3QgWEZBX1BBQ0tFVElORk8qIHBQYWNrZXQgPSBYRkFfR2V0UGFja2V0QnlJRChHZXRQYWNrZXRJRCgpKTsKLSAgICAgICAgICBDWEZBX05vZGUqIHBOZXdOb2RlID0KLSAgICAgICAgICAgICAgbV9wRG9jdW1lbnQtPkNyZWF0ZU5vZGUocFBhY2tldCwgcFByb3BlcnR5W2ldLmVOYW1lKTsKLSAgICAgICAgICBpZiAoIXBOZXdOb2RlKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgSW5zZXJ0Q2hpbGQocE5ld05vZGUsIG51bGxwdHIpOwotICAgICAgICAgIHBOZXdOb2RlLT5TZXRGbGFnKFhGQV9Ob2RlRmxhZ19Jbml0aWFsaXplZCwgdHJ1ZSk7Ci0gICAgICAgICAgbm9kZXMuQWRkKHBOZXdOb2RlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gbm9kZXMuR2V0U2l6ZSgpOworICByZXR1cm4gbnVsbHB0cjsKIH0KIAotQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FbGVtZW50IGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZ3MpIHsKK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXRGaXJzdENvbnRhaW5lckNoaWxkKCkgY29uc3QgeworICBDWEZBX05vZGUqIHBOb2RlID0gbV9wQ2hpbGQ7CisgIHdoaWxlIChwTm9kZSAmJiBwTm9kZS0+R2V0T2JqZWN0VHlwZSgpICE9IFhGQV9PYmplY3RUeXBlOjpDb250YWluZXJOb2RlKQorICAgIHBOb2RlID0gcE5vZGUtPm1fcE5leHQ7CisgIHJldHVybiBwTm9kZTsKK30KKworQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldENvbnRhaW5lclBhcmVudCgpIGNvbnN0IHsKKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcFBhcmVudDsKKyAgd2hpbGUgKHBOb2RlICYmIHBOb2RlLT5HZXRPYmplY3RUeXBlKCkgIT0gWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGUpCisgICAgcE5vZGUgPSBwTm9kZS0+bV9wUGFyZW50OworICByZXR1cm4gcE5vZGU7Cit9CisKK2Jvb2wgQ1hGQV9Ob2RlOjpJc1ZhbGlkSW5QYWNrZXQoWEZBX1BhY2tldFR5cGUgcGFja2V0KSBjb25zdCB7CisgIHJldHVybiAhIShtX1ZhbGlkUGFja2V0cyAmICgxIDw8IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHBhY2tldCkpKTsKK30KKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEqIENYRkFfTm9kZTo6R2V0UHJvcGVydHlEYXRhKAorICAgIFhGQV9FbGVtZW50IHByb3BlcnR5KSBjb25zdCB7CisgIGlmIChtX1Byb3BlcnRpZXMgPT0gbnVsbHB0cikKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBmb3IgKHNpemVfdCBpID0gMDs7ICsraSkgeworICAgIGNvbnN0IFByb3BlcnR5RGF0YSogZGF0YSA9IG1fUHJvcGVydGllcyArIGk7CisgICAgaWYgKGRhdGEtPnByb3BlcnR5ID09IFhGQV9FbGVtZW50OjpVbmtub3duKQorICAgICAgYnJlYWs7CisgICAgaWYgKGRhdGEtPnByb3BlcnR5ID09IHByb3BlcnR5KQorICAgICAgcmV0dXJuIGRhdGE7CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2Jvb2wgQ1hGQV9Ob2RlOjpIYXNQcm9wZXJ0eShYRkFfRWxlbWVudCBwcm9wZXJ0eSkgY29uc3QgeworICByZXR1cm4gISFHZXRQcm9wZXJ0eURhdGEocHJvcGVydHkpOworfQorCitib29sIENYRkFfTm9kZTo6SGFzUHJvcGVydHlGbGFncyhYRkFfRWxlbWVudCBwcm9wZXJ0eSwgdWludDhfdCBmbGFncykgY29uc3QgeworICBjb25zdCBQcm9wZXJ0eURhdGEqIGRhdGEgPSBHZXRQcm9wZXJ0eURhdGEocHJvcGVydHkpOworICByZXR1cm4gZGF0YSAmJiAhIShkYXRhLT5mbGFncyAmIGZsYWdzKTsKK30KKwordWludDhfdCBDWEZBX05vZGU6OlByb3BlcnR5T2NjdXJhbmNlQ291bnQoWEZBX0VsZW1lbnQgcHJvcGVydHkpIGNvbnN0IHsKKyAgY29uc3QgUHJvcGVydHlEYXRhKiBkYXRhID0gR2V0UHJvcGVydHlEYXRhKHByb3BlcnR5KTsKKyAgcmV0dXJuIGRhdGEgPyBkYXRhLT5vY2N1cmFuY2VfY291bnQgOiAwOworfQorCitPcHRpb25hbDxYRkFfRWxlbWVudD4gQ1hGQV9Ob2RlOjpHZXRGaXJzdFByb3BlcnR5V2l0aEZsYWcodWludDhfdCBmbGFnKSB7CisgIGlmIChtX1Byb3BlcnRpZXMgPT0gbnVsbHB0cikKKyAgICByZXR1cm4ge307CisKKyAgZm9yIChzaXplX3QgaSA9IDA7OyArK2kpIHsKKyAgICBjb25zdCBQcm9wZXJ0eURhdGEqIGRhdGEgPSBtX1Byb3BlcnRpZXMgKyBpOworICAgIGlmIChkYXRhLT5wcm9wZXJ0eSA9PSBYRkFfRWxlbWVudDo6VW5rbm93bikKKyAgICAgIGJyZWFrOworICAgIGlmIChkYXRhLT5mbGFncyAmIGZsYWcpCisgICAgICByZXR1cm4ge2RhdGEtPnByb3BlcnR5fTsKKyAgfQorICByZXR1cm4ge307Cit9CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSogQ1hGQV9Ob2RlOjpHZXRBdHRyaWJ1dGVEYXRhKAorICAgIFhGQV9BdHRyaWJ1dGUgYXR0cikgY29uc3QgeworICBpZiAobV9BdHRyaWJ1dGVzID09IG51bGxwdHIpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgZm9yIChzaXplX3QgaSA9IDA7OyArK2kpIHsKKyAgICBjb25zdCBBdHRyaWJ1dGVEYXRhKiBjdXJfYXR0ciA9ICZtX0F0dHJpYnV0ZXNbaV07CisgICAgaWYgKGN1cl9hdHRyLT5hdHRyaWJ1dGUgPT0gWEZBX0F0dHJpYnV0ZTo6VW5rbm93bikKKyAgICAgIGJyZWFrOworICAgIGlmIChjdXJfYXR0ci0+YXR0cmlidXRlID09IGF0dHIpCisgICAgICByZXR1cm4gY3VyX2F0dHI7CisgIH0KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2Jvb2wgQ1hGQV9Ob2RlOjpIYXNBdHRyaWJ1dGUoWEZBX0F0dHJpYnV0ZSBhdHRyKSBjb25zdCB7CisgIHJldHVybiAhIUdldEF0dHJpYnV0ZURhdGEoYXR0cik7Cit9CisKKy8vIE5vdGU6IFRoaXMgTWV0aG9kIGFzc3VtZXMgdGhhdCBpIGlzIGEgdmFsaWQgaW5kZXggLi4uLgorWEZBX0F0dHJpYnV0ZSBDWEZBX05vZGU6OkdldEF0dHJpYnV0ZShzaXplX3QgaSkgY29uc3QgeworICBpZiAobV9BdHRyaWJ1dGVzID09IG51bGxwdHIpCisgICAgcmV0dXJuIFhGQV9BdHRyaWJ1dGU6OlVua25vd247CisgIHJldHVybiBtX0F0dHJpYnV0ZXNbaV0uYXR0cmlidXRlOworfQorCitYRkFfQXR0cmlidXRlVHlwZSBDWEZBX05vZGU6OkdldEF0dHJpYnV0ZVR5cGUoWEZBX0F0dHJpYnV0ZSB0eXBlKSBjb25zdCB7CisgIGNvbnN0IEF0dHJpYnV0ZURhdGEqIGRhdGEgPSBHZXRBdHRyaWJ1dGVEYXRhKHR5cGUpOworICByZXR1cm4gZGF0YSA/IGRhdGEtPnR5cGUgOiBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGE7Cit9CisKK3N0ZDo6dmVjdG9yPENYRkFfTm9kZSo+IENYRkFfTm9kZTo6R2V0Tm9kZUxpc3QodWludDMyX3QgZHdUeXBlRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudCBlVHlwZUZpbHRlcikgeworICBpZiAoZVR5cGVGaWx0ZXIgIT0gWEZBX0VsZW1lbnQ6OlVua25vd24pIHsKKyAgICBzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPiBub2RlczsKKyAgICBmb3IgKENYRkFfTm9kZSogcENoaWxkID0gbV9wQ2hpbGQ7IHBDaGlsZDsgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0KSB7CisgICAgICBpZiAocENoaWxkLT5HZXRFbGVtZW50VHlwZSgpID09IGVUeXBlRmlsdGVyKQorICAgICAgICBub2Rlcy5wdXNoX2JhY2socENoaWxkKTsKKyAgICB9CisgICAgcmV0dXJuIG5vZGVzOworICB9CisKKyAgaWYgKGR3VHlwZUZpbHRlciA9PSAoWEZBX05PREVGSUxURVJfQ2hpbGRyZW4gfCBYRkFfTk9ERUZJTFRFUl9Qcm9wZXJ0aWVzKSkgeworICAgIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+IG5vZGVzOworICAgIGZvciAoQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBtX3BDaGlsZDsgcENoaWxkOyBwQ2hpbGQgPSBwQ2hpbGQtPm1fcE5leHQpCisgICAgICBub2Rlcy5wdXNoX2JhY2socENoaWxkKTsKKyAgICByZXR1cm4gbm9kZXM7CisgIH0KKworICBpZiAoZHdUeXBlRmlsdGVyID09IDApCisgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+KCk7CisKKyAgYm9vbCBiRmlsdGVyQ2hpbGRyZW4gPSAhIShkd1R5cGVGaWx0ZXIgJiBYRkFfTk9ERUZJTFRFUl9DaGlsZHJlbik7CisgIGJvb2wgYkZpbHRlclByb3BlcnRpZXMgPSAhIShkd1R5cGVGaWx0ZXIgJiBYRkFfTk9ERUZJTFRFUl9Qcm9wZXJ0aWVzKTsKKyAgYm9vbCBiRmlsdGVyT25lT2ZQcm9wZXJ0aWVzID0gISEoZHdUeXBlRmlsdGVyICYgWEZBX05PREVGSUxURVJfT25lT2ZQcm9wZXJ0eSk7CisgIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+IG5vZGVzOworICBmb3IgKENYRkFfTm9kZSogcENoaWxkID0gbV9wQ2hpbGQ7IHBDaGlsZDsgcENoaWxkID0gcENoaWxkLT5tX3BOZXh0KSB7CisgICAgaWYgKCFIYXNQcm9wZXJ0eShwQ2hpbGQtPkdldEVsZW1lbnRUeXBlKCkpKSB7CisgICAgICBpZiAoYkZpbHRlclByb3BlcnRpZXMpIHsKKyAgICAgICAgbm9kZXMucHVzaF9iYWNrKHBDaGlsZCk7CisgICAgICB9IGVsc2UgaWYgKGJGaWx0ZXJPbmVPZlByb3BlcnRpZXMgJiYKKyAgICAgICAgICAgICAgICAgSGFzUHJvcGVydHlGbGFncyhwQ2hpbGQtPkdldEVsZW1lbnRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BST1BFUlRZRkxBR19PbmVPZikpIHsKKyAgICAgICAgbm9kZXMucHVzaF9iYWNrKHBDaGlsZCk7CisgICAgICB9IGVsc2UgaWYgKGJGaWx0ZXJDaGlsZHJlbiAmJgorICAgICAgICAgICAgICAgICAocENoaWxkLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpWYXJpYWJsZXMgfHwKKyAgICAgICAgICAgICAgICAgIHBDaGlsZC0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6UGFnZVNldCkpIHsKKyAgICAgICAgbm9kZXMucHVzaF9iYWNrKHBDaGlsZCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChiRmlsdGVyQ2hpbGRyZW4pIHsKKyAgICAgIG5vZGVzLnB1c2hfYmFjayhwQ2hpbGQpOworICAgIH0KKyAgfQorCisgIGlmICghYkZpbHRlck9uZU9mUHJvcGVydGllcyB8fCAhbm9kZXMuZW1wdHkoKSkKKyAgICByZXR1cm4gbm9kZXM7CisgIGlmIChtX1Byb3BlcnRpZXMgPT0gbnVsbHB0cikKKyAgICByZXR1cm4gbm9kZXM7CisKKyAgT3B0aW9uYWw8WEZBX0VsZW1lbnQ+IHByb3BlcnR5ID0KKyAgICAgIEdldEZpcnN0UHJvcGVydHlXaXRoRmxhZyhYRkFfUFJPUEVSVFlGTEFHX0RlZmF1bHRPbmVPZik7CisgIGlmICghcHJvcGVydHkpCisgICAgcmV0dXJuIG5vZGVzOworCisgIENYRkFfTm9kZSogcE5ld05vZGUgPSBtX3BEb2N1bWVudC0+Q3JlYXRlTm9kZShHZXRQYWNrZXRUeXBlKCksICpwcm9wZXJ0eSk7CisgIGlmIChwTmV3Tm9kZSkgeworICAgIEluc2VydENoaWxkKHBOZXdOb2RlLCBudWxscHRyKTsKKyAgICBwTmV3Tm9kZS0+U2V0RmxhZyhYRkFfTm9kZUZsYWdfSW5pdGlhbGl6ZWQsIHRydWUpOworICAgIG5vZGVzLnB1c2hfYmFjayhwTmV3Tm9kZSk7CisgIH0KKyAgcmV0dXJuIG5vZGVzOworfQorCitDWEZBX05vZGUqIENYRkFfTm9kZTo6Q3JlYXRlU2FtZVBhY2tldE5vZGUoWEZBX0VsZW1lbnQgZVR5cGUpIHsKICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcERvY3VtZW50LT5DcmVhdGVOb2RlKG1fZVBhY2tldCwgZVR5cGUpOwotICBwTm9kZS0+U2V0RmxhZyhkd0ZsYWdzLCB0cnVlKTsKKyAgcE5vZGUtPlNldEZsYWcoWEZBX05vZGVGbGFnX0luaXRpYWxpemVkLCB0cnVlKTsKICAgcmV0dXJuIHBOb2RlOwogfQogCiBDWEZBX05vZGUqIENYRkFfTm9kZTo6Q2xvbmVUZW1wbGF0ZVRvRm9ybShib29sIGJSZWN1cnNpdmUpIHsKLSAgQVNTRVJUKG1fZVBhY2tldCA9PSBYRkFfWERQUEFDS0VUX1RlbXBsYXRlKTsKKyAgQVNTRVJUKG1fZVBhY2tldCA9PSBYRkFfUGFja2V0VHlwZTo6VGVtcGxhdGUpOwogICBDWEZBX05vZGUqIHBDbG9uZSA9Ci0gICAgICBtX3BEb2N1bWVudC0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0Zvcm0sIG1fZWxlbWVudFR5cGUpOworICAgICAgbV9wRG9jdW1lbnQtPkNyZWF0ZU5vZGUoWEZBX1BhY2tldFR5cGU6OkZvcm0sIG1fZWxlbWVudFR5cGUpOwogICBpZiAoIXBDbG9uZSkKICAgICByZXR1cm4gbnVsbHB0cjsKIApAQCAtNzA3LDE2ICs0NzAsMTYgQEAKICAgcENsb25lLT5VcGRhdGVOYW1lSGFzaCgpOwogICBwQ2xvbmUtPlNldFhNTE1hcHBpbmdOb2RlKEdldFhNTE1hcHBpbmdOb2RlKCkpOwogICBpZiAoYlJlY3Vyc2l2ZSkgewotICAgIGZvciAoQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7IHBDaGlsZDsKLSAgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgewotICAgICAgcENsb25lLT5JbnNlcnRDaGlsZChwQ2hpbGQtPkNsb25lVGVtcGxhdGVUb0Zvcm0oYlJlY3Vyc2l2ZSkpOworICAgIGZvciAoQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBHZXRGaXJzdENoaWxkKCk7IHBDaGlsZDsKKyAgICAgICAgIHBDaGlsZCA9IHBDaGlsZC0+R2V0TmV4dFNpYmxpbmcoKSkgeworICAgICAgcENsb25lLT5JbnNlcnRDaGlsZChwQ2hpbGQtPkNsb25lVGVtcGxhdGVUb0Zvcm0oYlJlY3Vyc2l2ZSksIG51bGxwdHIpOwogICAgIH0KICAgfQogICBwQ2xvbmUtPlNldEZsYWcoWEZBX05vZGVGbGFnX0luaXRpYWxpemVkLCB0cnVlKTsKICAgcmV0dXJuIHBDbG9uZTsKIH0KIAotQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldFRlbXBsYXRlTm9kZSgpIGNvbnN0IHsKK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXRUZW1wbGF0ZU5vZGVJZkV4aXN0cygpIGNvbnN0IHsKICAgcmV0dXJuIG1fcEF1eE5vZGU7CiB9CiAKQEAgLTcyNSwxMzcgKzQ4OCwxMTcgQEAKIH0KIAogQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldEJpbmREYXRhKCkgewotICBBU1NFUlQoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0Zvcm0pOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9Ob2RlKj4oR2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUpKTsKKyAgQVNTRVJUKEdldFBhY2tldFR5cGUoKSA9PSBYRkFfUGFja2V0VHlwZTo6Rm9ybSk7CisgIHJldHVybiBHZXRCaW5kaW5nTm9kZSgpOwogfQogCi1pbnQzMl90IENYRkFfTm9kZTo6R2V0QmluZEl0ZW1zKENYRkFfTm9kZUFycmF5JiBmb3JtSXRlbXMpIHsKLSAgaWYgKEJpbmRzRm9ybUl0ZW1zKCkpIHsKLSAgICBDWEZBX05vZGVBcnJheSogcEl0ZW1zID0gbnVsbHB0cjsKLSAgICBUcnlPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwgKHZvaWQqJilwSXRlbXMpOwotICAgIGZvcm1JdGVtcy5Db3B5KCpwSXRlbXMpOwotICAgIHJldHVybiBmb3JtSXRlbXMuR2V0U2l6ZSgpOwotICB9Ci0gIENYRkFfTm9kZSogcEZvcm1Ob2RlID0KLSAgICAgIHN0YXRpY19jYXN0PENYRkFfTm9kZSo+KEdldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlKSk7Ci0gIGlmIChwRm9ybU5vZGUpCi0gICAgZm9ybUl0ZW1zLkFkZChwRm9ybU5vZGUpOwotICByZXR1cm4gZm9ybUl0ZW1zLkdldFNpemUoKTsKK3N0ZDo6dmVjdG9yPFVub3duZWRQdHI8Q1hGQV9Ob2RlPj4qIENYRkFfTm9kZTo6R2V0QmluZEl0ZW1zKCkgeworICByZXR1cm4gR2V0QmluZGluZ05vZGVzKCk7CiB9CiAKIGludDMyX3QgQ1hGQV9Ob2RlOjpBZGRCaW5kSXRlbShDWEZBX05vZGUqIHBGb3JtTm9kZSkgewogICBBU1NFUlQocEZvcm1Ob2RlKTsKKwogICBpZiAoQmluZHNGb3JtSXRlbXMoKSkgewotICAgIENYRkFfTm9kZUFycmF5KiBwSXRlbXMgPSBudWxscHRyOwotICAgIFRyeU9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCAodm9pZComKXBJdGVtcyk7Ci0gICAgQVNTRVJUKHBJdGVtcyk7Ci0gICAgaWYgKHBJdGVtcy0+RmluZChwRm9ybU5vZGUpIDwgMCkgewotICAgICAgcEl0ZW1zLT5BZGQocEZvcm1Ob2RlKTsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgZm9yIChhdXRvJiB2IDogYmluZGluZ19ub2Rlc18pIHsKKyAgICAgIGlmICh2LkdldCgpID09IHBGb3JtTm9kZSkgeworICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gcEl0ZW1zLT5HZXRTaXplKCk7CisgICAgaWYgKCFmb3VuZCkKKyAgICAgIGJpbmRpbmdfbm9kZXNfLmVtcGxhY2VfYmFjayhwRm9ybU5vZGUpOworICAgIHJldHVybiBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KGJpbmRpbmdfbm9kZXNfKTsKICAgfQotICBDWEZBX05vZGUqIHBPbGRGb3JtSXRlbSA9Ci0gICAgICBzdGF0aWNfY2FzdDxDWEZBX05vZGUqPihHZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSkpOworCisgIENYRkFfTm9kZSogcE9sZEZvcm1JdGVtID0gR2V0QmluZGluZ05vZGUoKTsKICAgaWYgKCFwT2xkRm9ybUl0ZW0pIHsKLSAgICBTZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwgcEZvcm1Ob2RlKTsKLSAgICByZXR1cm4gMTsKLSAgfSBlbHNlIGlmIChwT2xkRm9ybUl0ZW0gPT0gcEZvcm1Ob2RlKSB7CisgICAgU2V0QmluZGluZ05vZGUocEZvcm1Ob2RlKTsKICAgICByZXR1cm4gMTsKICAgfQotICBDWEZBX05vZGVBcnJheSogcEl0ZW1zID0gbmV3IENYRkFfTm9kZUFycmF5OwotICBTZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwgcEl0ZW1zLCAmZGVsZXRlQmluZEl0ZW1DYWxsQmFjayk7Ci0gIHBJdGVtcy0+QWRkKHBPbGRGb3JtSXRlbSk7Ci0gIHBJdGVtcy0+QWRkKHBGb3JtTm9kZSk7CisgIGlmIChwT2xkRm9ybUl0ZW0gPT0gcEZvcm1Ob2RlKQorICAgIHJldHVybiAxOworCisgIHN0ZDo6dmVjdG9yPFVub3duZWRQdHI8Q1hGQV9Ob2RlPj4gaXRlbXM7CisgIGl0ZW1zLmVtcGxhY2VfYmFjayhwT2xkRm9ybUl0ZW0pOworICBpdGVtcy5lbXBsYWNlX2JhY2socEZvcm1Ob2RlKTsKKyAgU2V0QmluZGluZ05vZGVzKHN0ZDo6bW92ZShpdGVtcykpOworCiAgIG1fdU5vZGVGbGFncyB8PSBYRkFfTm9kZUZsYWdfQmluZEZvcm1JdGVtczsKICAgcmV0dXJuIDI7CiB9CiAKIGludDMyX3QgQ1hGQV9Ob2RlOjpSZW1vdmVCaW5kSXRlbShDWEZBX05vZGUqIHBGb3JtTm9kZSkgewogICBpZiAoQmluZHNGb3JtSXRlbXMoKSkgewotICAgIENYRkFfTm9kZUFycmF5KiBwSXRlbXMgPSBudWxscHRyOwotICAgIFRyeU9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCAodm9pZComKXBJdGVtcyk7Ci0gICAgQVNTRVJUKHBJdGVtcyk7Ci0gICAgaW50MzJfdCBpSW5kZXggPSBwSXRlbXMtPkZpbmQocEZvcm1Ob2RlKTsKLSAgICBpbnQzMl90IGlDb3VudCA9IHBJdGVtcy0+R2V0U2l6ZSgpOwotICAgIGlmIChpSW5kZXggPj0gMCkgewotICAgICAgaWYgKGlJbmRleCAhPSBpQ291bnQgLSAxKQotICAgICAgICBwSXRlbXMtPlNldEF0KGlJbmRleCwgcEl0ZW1zLT5HZXRBdChpQ291bnQgLSAxKSk7Ci0gICAgICBwSXRlbXMtPlJlbW92ZUF0KGlDb3VudCAtIDEpOwotICAgICAgaWYgKGlDb3VudCA9PSAyKSB7Ci0gICAgICAgIENYRkFfTm9kZSogcExhc3RGb3JtTm9kZSA9IHBJdGVtcy0+R2V0QXQoMCk7Ci0gICAgICAgIFNldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCBwTGFzdEZvcm1Ob2RlKTsKLSAgICAgICAgbV91Tm9kZUZsYWdzICY9IH5YRkFfTm9kZUZsYWdfQmluZEZvcm1JdGVtczsKLSAgICAgIH0KLSAgICAgIGlDb3VudC0tOworICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYoYmluZGluZ19ub2Rlc18uYmVnaW4oKSwgYmluZGluZ19ub2Rlc18uZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnBGb3JtTm9kZV0oY29uc3QgVW5vd25lZFB0cjxDWEZBX05vZGU+JiBub2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLkdldCgpID09IHBGb3JtTm9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIGlmIChpdCAhPSBiaW5kaW5nX25vZGVzXy5lbmQoKSkKKyAgICAgIGJpbmRpbmdfbm9kZXNfLmVyYXNlKGl0KTsKKworICAgIGlmIChiaW5kaW5nX25vZGVzXy5zaXplKCkgPT0gMSkgeworICAgICAgbV91Tm9kZUZsYWdzICY9IH5YRkFfTm9kZUZsYWdfQmluZEZvcm1JdGVtczsKKyAgICAgIHJldHVybiAxOwogICAgIH0KLSAgICByZXR1cm4gaUNvdW50OworICAgIHJldHVybiBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KGJpbmRpbmdfbm9kZXNfKTsKICAgfQotICBDWEZBX05vZGUqIHBPbGRGb3JtSXRlbSA9Ci0gICAgICBzdGF0aWNfY2FzdDxDWEZBX05vZGUqPihHZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSkpOwotICBpZiAocE9sZEZvcm1JdGVtID09IHBGb3JtTm9kZSkgewotICAgIFNldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCBudWxscHRyKTsKLSAgICBwT2xkRm9ybUl0ZW0gPSBudWxscHRyOwotICB9Ci0gIHJldHVybiBwT2xkRm9ybUl0ZW0gPyAxIDogMDsKKworICBDWEZBX05vZGUqIHBPbGRGb3JtSXRlbSA9IEdldEJpbmRpbmdOb2RlKCk7CisgIGlmIChwT2xkRm9ybUl0ZW0gIT0gcEZvcm1Ob2RlKQorICAgIHJldHVybiBwT2xkRm9ybUl0ZW0gPyAxIDogMDsKKworICBTZXRCaW5kaW5nTm9kZShudWxscHRyKTsKKyAgcmV0dXJuIDA7CiB9CiAKIGJvb2wgQ1hGQV9Ob2RlOjpIYXNCaW5kSXRlbSgpIHsKLSAgcmV0dXJuIEdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cyAmJgotICAgICAgICAgR2V0T2JqZWN0KFhGQV9BVFRSSUJVVEVfQmluZGluZ05vZGUpOworICByZXR1cm4gR2V0UGFja2V0VHlwZSgpID09IFhGQV9QYWNrZXRUeXBlOjpEYXRhc2V0cyAmJiBHZXRCaW5kaW5nTm9kZSgpOwogfQogCi1DWEZBX1dpZGdldERhdGEqIENYRkFfTm9kZTo6R2V0V2lkZ2V0RGF0YSgpIHsKLSAgcmV0dXJuIChDWEZBX1dpZGdldERhdGEqKUdldE9iamVjdChYRkFfQVRUUklCVVRFX1dpZGdldERhdGEpOwotfQotCi1DWEZBX1dpZGdldERhdGEqIENYRkFfTm9kZTo6R2V0Q29udGFpbmVyV2lkZ2V0RGF0YSgpIHsKLSAgaWYgKEdldFBhY2tldElEKCkgIT0gWEZBX1hEUFBBQ0tFVF9Gb3JtKQorQ1hGQV9XaWRnZXRBY2MqIENYRkFfTm9kZTo6R2V0Q29udGFpbmVyV2lkZ2V0QWNjKCkgeworICBpZiAoR2V0UGFja2V0VHlwZSgpICE9IFhGQV9QYWNrZXRUeXBlOjpGb3JtKQogICAgIHJldHVybiBudWxscHRyOwogICBYRkFfRWxlbWVudCBlVHlwZSA9IEdldEVsZW1lbnRUeXBlKCk7CiAgIGlmIChlVHlwZSA9PSBYRkFfRWxlbWVudDo6RXhjbEdyb3VwKQogICAgIHJldHVybiBudWxscHRyOwotICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7CisgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBHZXRQYXJlbnQoKTsKICAgaWYgKHBQYXJlbnROb2RlICYmIHBQYXJlbnROb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpFeGNsR3JvdXApCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKICAgaWYgKGVUeXBlID09IFhGQV9FbGVtZW50OjpGaWVsZCkgewotICAgIENYRkFfV2lkZ2V0RGF0YSogcEZpZWxkV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsKLSAgICBpZiAocEZpZWxkV2lkZ2V0RGF0YSAmJgotICAgICAgICBwRmllbGRXaWRnZXREYXRhLT5HZXRDaG9pY2VMaXN0T3BlbigpID09Ci0gICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTV9NdWx0aVNlbGVjdCkgeworICAgIENYRkFfV2lkZ2V0QWNjKiBwRmllbGRXaWRnZXRBY2MgPSBHZXRXaWRnZXRBY2MoKTsKKyAgICBpZiAocEZpZWxkV2lkZ2V0QWNjICYmIHBGaWVsZFdpZGdldEFjYy0+SXNDaG9pY2VMaXN0TXVsdGlTZWxlY3QoKSkKICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0gZWxzZSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c1BpY3R1cmU7Ci0gICAgICBpZiAocEZpZWxkV2lkZ2V0RGF0YSkgewotICAgICAgICBwRmllbGRXaWRnZXREYXRhLT5HZXRQaWN0dXJlQ29udGVudCh3c1BpY3R1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQpOworCisgICAgV2lkZVN0cmluZyB3c1BpY3R1cmU7CisgICAgaWYgKHBGaWVsZFdpZGdldEFjYykgeworICAgICAgd3NQaWN0dXJlID0gcEZpZWxkV2lkZ2V0QWNjLT5HZXRQaWN0dXJlQ29udGVudChYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kKTsKKyAgICB9CisgICAgaWYgKCF3c1BpY3R1cmUuSXNFbXB0eSgpKQorICAgICAgcmV0dXJuIHBGaWVsZFdpZGdldEFjYzsKKworICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gR2V0QmluZERhdGEoKTsKKyAgICBpZiAoIXBEYXRhTm9kZSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHBGaWVsZFdpZGdldEFjYyA9IG51bGxwdHI7CisgICAgZm9yIChjb25zdCBhdXRvJiBwRm9ybU5vZGUgOiAqKHBEYXRhTm9kZS0+R2V0QmluZEl0ZW1zKCkpKSB7CisgICAgICBpZiAoIXBGb3JtTm9kZSB8fCBwRm9ybU5vZGUtPkhhc1JlbW92ZWRDaGlsZHJlbigpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIHBGaWVsZFdpZGdldEFjYyA9IHBGb3JtTm9kZS0+R2V0V2lkZ2V0QWNjKCk7CisgICAgICBpZiAocEZpZWxkV2lkZ2V0QWNjKSB7CisgICAgICAgIHdzUGljdHVyZSA9CisgICAgICAgICAgICBwRmllbGRXaWRnZXRBY2MtPkdldFBpY3R1cmVDb250ZW50KFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQpOwogICAgICAgfQogICAgICAgaWYgKCF3c1BpY3R1cmUuSXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gcEZpZWxkV2lkZ2V0RGF0YTsKLSAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gR2V0QmluZERhdGEoKTsKLSAgICAgIGlmICghcERhdGFOb2RlKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgIHBGaWVsZFdpZGdldERhdGEgPSBudWxscHRyOwotICAgICAgQ1hGQV9Ob2RlQXJyYXkgZm9ybU5vZGVzOwotICAgICAgcERhdGFOb2RlLT5HZXRCaW5kSXRlbXMoZm9ybU5vZGVzKTsKLSAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGZvcm1Ob2Rlcy5HZXRTaXplKCk7IGkrKykgewotICAgICAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSA9IGZvcm1Ob2Rlcy5HZXRBdChpKTsKLSAgICAgICAgaWYgKCFwRm9ybU5vZGUgfHwgcEZvcm1Ob2RlLT5IYXNSZW1vdmVkQ2hpbGRyZW4oKSkKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgcEZpZWxkV2lkZ2V0RGF0YSA9IHBGb3JtTm9kZS0+R2V0V2lkZ2V0RGF0YSgpOwotICAgICAgICBpZiAocEZpZWxkV2lkZ2V0RGF0YSkgewotICAgICAgICAgIHBGaWVsZFdpZGdldERhdGEtPkdldFBpY3R1cmVDb250ZW50KHdzUGljdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXdzUGljdHVyZS5Jc0VtcHR5KCkpCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIHBGaWVsZFdpZGdldERhdGEgPSBudWxscHRyOwotICAgICAgfQotICAgICAgcmV0dXJuIHBGaWVsZFdpZGdldERhdGE7CisgICAgICAgIGJyZWFrOworICAgICAgcEZpZWxkV2lkZ2V0QWNjID0gbnVsbHB0cjsKICAgICB9CisgICAgcmV0dXJuIHBGaWVsZFdpZGdldEFjYzsKICAgfQotICBDWEZBX05vZGUqIHBHcmFuZE5vZGUgPQotICAgICAgcFBhcmVudE5vZGUgPyBwUGFyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkgOiBudWxscHRyOworCisgIENYRkFfTm9kZSogcEdyYW5kTm9kZSA9IHBQYXJlbnROb2RlID8gcFBhcmVudE5vZGUtPkdldFBhcmVudCgpIDogbnVsbHB0cjsKICAgQ1hGQV9Ob2RlKiBwVmFsdWVOb2RlID0KICAgICAgIChwUGFyZW50Tm9kZSAmJiBwUGFyZW50Tm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6VmFsdWUpCiAgICAgICAgICAgPyBwUGFyZW50Tm9kZQpAQCAtODY3LDM1OTMgKzYxMCwxOTYgQEAKICAgICAgICAgICAgIDogbnVsbHB0cjsKICAgfQogICBDWEZBX05vZGUqIHBQYXJlbnRPZlZhbHVlTm9kZSA9Ci0gICAgICBwVmFsdWVOb2RlID8gcFZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkgOiBudWxscHRyOwotICByZXR1cm4gcFBhcmVudE9mVmFsdWVOb2RlID8gcFBhcmVudE9mVmFsdWVOb2RlLT5HZXRDb250YWluZXJXaWRnZXREYXRhKCkKKyAgICAgIHBWYWx1ZU5vZGUgPyBwVmFsdWVOb2RlLT5HZXRQYXJlbnQoKSA6IG51bGxwdHI7CisgIHJldHVybiBwUGFyZW50T2ZWYWx1ZU5vZGUgPyBwUGFyZW50T2ZWYWx1ZU5vZGUtPkdldENvbnRhaW5lcldpZGdldEFjYygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyOwogfQogCi1ib29sIENYRkFfTm9kZTo6R2V0TG9jYWxlTmFtZShDRlhfV2lkZVN0cmluZyYgd3NMb2NhbGVOYW1lKSB7Ci0gIENYRkFfTm9kZSogcEZvcm0gPSBHZXREb2N1bWVudCgpLT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0Zvcm0pLT5Bc05vZGUoKTsKLSAgQ1hGQV9Ob2RlKiBwVG9wU3ViZm9ybSA9IHBGb3JtLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRWxlbWVudDo6U3ViZm9ybSk7Ci0gIEFTU0VSVChwVG9wU3ViZm9ybSk7Ci0gIENYRkFfTm9kZSogcExvY2FsZU5vZGUgPSB0aGlzOwotICBib29sIGJMb2NhbGUgPSBmYWxzZTsKLSAgZG8gewotICAgIGJMb2NhbGUgPSBwTG9jYWxlTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Mb2NhbGUsIHdzTG9jYWxlTmFtZSwgZmFsc2UpOwotICAgIGlmICghYkxvY2FsZSkgewotICAgICAgcExvY2FsZU5vZGUgPSBwTG9jYWxlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7Ci0gICAgfQotICB9IHdoaWxlIChwTG9jYWxlTm9kZSAmJiBwTG9jYWxlTm9kZSAhPSBwVG9wU3ViZm9ybSAmJiAhYkxvY2FsZSk7Ci0gIGlmIChiTG9jYWxlKQotICAgIHJldHVybiB0cnVlOwotICBDWEZBX05vZGUqIHBDb25maWcgPSBUb05vZGUoR2V0RG9jdW1lbnQoKS0+R2V0WEZBT2JqZWN0KFhGQV9IQVNIQ09ERV9Db25maWcpKTsKLSAgd3NMb2NhbGVOYW1lID0gR2V0RG9jdW1lbnQoKS0+R2V0TG9jYWxNZ3IoKS0+R2V0Q29uZmlnTG9jYWxlTmFtZShwQ29uZmlnKTsKLSAgaWYgKCF3c0xvY2FsZU5hbWUuSXNFbXB0eSgpKQotICAgIHJldHVybiB0cnVlOwotICBpZiAocFRvcFN1YmZvcm0gJiYKLSAgICAgIHBUb3BTdWJmb3JtLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0xvY2FsZSwgd3NMb2NhbGVOYW1lLCBmYWxzZSkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0RG9jdW1lbnQoKS0+R2V0TG9jYWxNZ3IoKS0+R2V0RGVmTG9jYWxlKCk7Ci0gIGlmIChwTG9jYWxlKSB7Ci0gICAgd3NMb2NhbGVOYW1lID0gcExvY2FsZS0+R2V0TmFtZSgpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKK0lGWF9Mb2NhbGUqIENYRkFfTm9kZTo6R2V0TG9jYWxlKCkgeworICBPcHRpb25hbDxXaWRlU3RyaW5nPiBsb2NhbGVOYW1lID0gR2V0TG9jYWxlTmFtZSgpOworICBpZiAoIWxvY2FsZU5hbWUpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIGlmIChsb2NhbGVOYW1lLnZhbHVlKCkgPT0gTCJhbWJpZW50IikKKyAgICByZXR1cm4gR2V0RG9jdW1lbnQoKS0+R2V0TG9jYWxNZ3IoKS0+R2V0RGVmTG9jYWxlKCk7CisgIHJldHVybiBHZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpLT5HZXRMb2NhbGVCeU5hbWUobG9jYWxlTmFtZS52YWx1ZSgpKTsKIH0KIAotWEZBX0FUVFJJQlVURUVOVU0gQ1hGQV9Ob2RlOjpHZXRJbnRhY3QoKSB7Ci0gIENYRkFfTm9kZSogcEtlZXAgPSBHZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRWxlbWVudDo6S2VlcCk7Ci0gIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXRUeXBlID0gR2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCk7CitPcHRpb25hbDxXaWRlU3RyaW5nPiBDWEZBX05vZGU6OkdldExvY2FsZU5hbWUoKSB7CisgIENYRkFfTm9kZSogcEZvcm0gPSBHZXREb2N1bWVudCgpLT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0Zvcm0pLT5Bc05vZGUoKTsKKyAgQ1hGQV9TdWJmb3JtKiBwVG9wU3ViZm9ybSA9CisgICAgICBwRm9ybS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9TdWJmb3JtPihYRkFfRWxlbWVudDo6U3ViZm9ybSk7CisgIEFTU0VSVChwVG9wU3ViZm9ybSk7CisKKyAgQ1hGQV9Ob2RlKiBwTG9jYWxlTm9kZSA9IHRoaXM7CisgIGRvIHsKKyAgICBPcHRpb25hbDxXaWRlU3RyaW5nPiBsb2NhbGVOYW1lID0KKyAgICAgICAgcExvY2FsZU5vZGUtPkpTT2JqZWN0KCktPlRyeUNEYXRhKFhGQV9BdHRyaWJ1dGU6OkxvY2FsZSwgZmFsc2UpOworICAgIGlmIChsb2NhbGVOYW1lKQorICAgICAgcmV0dXJuIGxvY2FsZU5hbWU7CisKKyAgICBwTG9jYWxlTm9kZSA9IHBMb2NhbGVOb2RlLT5HZXRQYXJlbnQoKTsKKyAgfSB3aGlsZSAocExvY2FsZU5vZGUgJiYgcExvY2FsZU5vZGUgIT0gcFRvcFN1YmZvcm0pOworCisgIENYRkFfTm9kZSogcENvbmZpZyA9IFRvTm9kZShHZXREb2N1bWVudCgpLT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0NvbmZpZykpOworICBPcHRpb25hbDxXaWRlU3RyaW5nPiBsb2NhbGVOYW1lID0geworICAgICAgV2lkZVN0cmluZyhHZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpLT5HZXRDb25maWdMb2NhbGVOYW1lKHBDb25maWcpKX07CisgIGlmIChsb2NhbGVOYW1lICYmICFsb2NhbGVOYW1lLT5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIGxvY2FsZU5hbWU7CisKKyAgaWYgKHBUb3BTdWJmb3JtKSB7CisgICAgbG9jYWxlTmFtZSA9CisgICAgICAgIHBUb3BTdWJmb3JtLT5KU09iamVjdCgpLT5UcnlDRGF0YShYRkFfQXR0cmlidXRlOjpMb2NhbGUsIGZhbHNlKTsKKyAgICBpZiAobG9jYWxlTmFtZSkKKyAgICAgIHJldHVybiBsb2NhbGVOYW1lOworICB9CisKKyAgSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldERvY3VtZW50KCktPkdldExvY2FsTWdyKCktPkdldERlZkxvY2FsZSgpOworICBpZiAoIXBMb2NhbGUpCisgICAgcmV0dXJuIHt9OworCisgIHJldHVybiB7cExvY2FsZS0+R2V0TmFtZSgpfTsKK30KKworWEZBX0F0dHJpYnV0ZUVudW0gQ1hGQV9Ob2RlOjpHZXRJbnRhY3QoKSB7CisgIENYRkFfS2VlcCogcEtlZXAgPSBHZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX0tlZXA+KFhGQV9FbGVtZW50OjpLZWVwKTsKKyAgWEZBX0F0dHJpYnV0ZUVudW0gZUxheW91dFR5cGUgPSBKU09iamVjdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+VHJ5RW51bShYRkFfQXR0cmlidXRlOjpMYXlvdXQsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9vcihYRkFfQXR0cmlidXRlRW51bTo6UG9zaXRpb24pOwogICBpZiAocEtlZXApIHsKLSAgICBYRkFfQVRUUklCVVRFRU5VTSBlSW50YWN0OwotICAgIGlmIChwS2VlcC0+VHJ5RW51bShYRkFfQVRUUklCVVRFX0ludGFjdCwgZUludGFjdCwgZmFsc2UpKSB7Ci0gICAgICBpZiAoZUludGFjdCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lICYmCi0gICAgICAgICAgZUxheW91dFR5cGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fUm93ICYmCisgICAgT3B0aW9uYWw8WEZBX0F0dHJpYnV0ZUVudW0+IGludGFjdCA9CisgICAgICAgIHBLZWVwLT5KU09iamVjdCgpLT5UcnlFbnVtKFhGQV9BdHRyaWJ1dGU6OkludGFjdCwgZmFsc2UpOworICAgIGlmIChpbnRhY3QpIHsKKyAgICAgIGlmICgqaW50YWN0ID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpOb25lICYmCisgICAgICAgICAgZUxheW91dFR5cGUgPT0gWEZBX0F0dHJpYnV0ZUVudW06OlJvdyAmJgogICAgICAgICAgIG1fcERvY3VtZW50LT5HZXRDdXJWZXJzaW9uTW9kZSgpIDwgWEZBX1ZFUlNJT05fMjA4KSB7Ci0gICAgICAgIENYRkFfTm9kZSogcFByZXZpZXdSb3cgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUHJldlNpYmxpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGFpbmVyTm9kZSk7CisgICAgICAgIENYRkFfTm9kZSogcFByZXZpZXdSb3cgPSBHZXRQcmV2Q29udGFpbmVyU2libGluZygpOwogICAgICAgICBpZiAocFByZXZpZXdSb3cgJiYKLSAgICAgICAgICAgIHBQcmV2aWV3Um93LT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0KSA9PQotICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX1JvdykgewotICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVWYWx1ZTsKLSAgICAgICAgICBpZiAocEtlZXAtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9QcmV2aW91cywgZVZhbHVlLCBmYWxzZSkgJiYKLSAgICAgICAgICAgICAgKGVWYWx1ZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYSB8fAotICAgICAgICAgICAgICAgZVZhbHVlID09IFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VBcmVhKSkgewotICAgICAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhOworICAgICAgICAgICAgcFByZXZpZXdSb3ctPkpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6TGF5b3V0KSA9PQorICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpSb3cpIHsKKyAgICAgICAgICBPcHRpb25hbDxYRkFfQXR0cmlidXRlRW51bT4gdmFsdWUgPQorICAgICAgICAgICAgICBwS2VlcC0+SlNPYmplY3QoKS0+VHJ5RW51bShYRkFfQXR0cmlidXRlOjpQcmV2aW91cywgZmFsc2UpOworICAgICAgICAgIGlmICh2YWx1ZSAmJiAoKnZhbHVlID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpDb250ZW50QXJlYSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKnZhbHVlID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpQYWdlQXJlYSkpIHsKKyAgICAgICAgICAgIHJldHVybiBYRkFfQXR0cmlidXRlRW51bTo6Q29udGVudEFyZWE7CiAgICAgICAgICAgfQotICAgICAgICAgIENYRkFfTm9kZSogcE5vZGUgPQotICAgICAgICAgICAgICBwUHJldmlld1Jvdy0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VsZW1lbnQ6OktlZXApOwotICAgICAgICAgIGlmIChwTm9kZSAmJiBwTm9kZS0+VHJ5RW51bShYRkFfQVRUUklCVVRFX05leHQsIGVWYWx1ZSwgZmFsc2UpICYmCi0gICAgICAgICAgICAgIChlVmFsdWUgPT0gWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWEgfHwKLSAgICAgICAgICAgICAgIGVWYWx1ZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9QYWdlQXJlYSkpIHsKLSAgICAgICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYTsKKworICAgICAgICAgIENYRkFfS2VlcCogcE5vZGUgPQorICAgICAgICAgICAgICBwUHJldmlld1Jvdy0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9LZWVwPihYRkFfRWxlbWVudDo6S2VlcCk7CisgICAgICAgICAgT3B0aW9uYWw8WEZBX0F0dHJpYnV0ZUVudW0+IHJldDsKKyAgICAgICAgICBpZiAocE5vZGUpCisgICAgICAgICAgICByZXQgPSBwTm9kZS0+SlNPYmplY3QoKS0+VHJ5RW51bShYRkFfQXR0cmlidXRlOjpOZXh0LCBmYWxzZSk7CisgICAgICAgICAgaWYgKHJldCAmJiAoKnJldCA9PSBYRkFfQXR0cmlidXRlRW51bTo6Q29udGVudEFyZWEgfHwKKyAgICAgICAgICAgICAgICAgICAgICAqcmV0ID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpQYWdlQXJlYSkpIHsKKyAgICAgICAgICAgIHJldHVybiBYRkFfQXR0cmlidXRlRW51bTo6Q29udGVudEFyZWE7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9Ci0gICAgICByZXR1cm4gZUludGFjdDsKKyAgICAgIHJldHVybiAqaW50YWN0OwogICAgIH0KICAgfQorCiAgIHN3aXRjaCAoR2V0RWxlbWVudFR5cGUoKSkgewogICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlN1YmZvcm06CiAgICAgICBzd2l0Y2ggKGVMYXlvdXRUeXBlKSB7Ci0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUG9zaXRpb246Ci0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUm93OgotICAgICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYTsKLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9UYjoKLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9UYWJsZToKLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Mcl90YjoKLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SbF90YjoKLSAgICAgICAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsKKyAgICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6UG9zaXRpb246CisgICAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OlJvdzoKKyAgICAgICAgICByZXR1cm4gWEZBX0F0dHJpYnV0ZUVudW06OkNvbnRlbnRBcmVhOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGJyZWFrOworICAgICAgICAgIHJldHVybiBYRkFfQXR0cmlidXRlRW51bTo6Tm9uZTsKICAgICAgIH0KLSAgICAgIGJyZWFrOwogICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkZpZWxkOiB7Ci0gICAgICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7Ci0gICAgICBpZiAoIXBQYXJlbnROb2RlIHx8Ci0gICAgICAgICAgcFBhcmVudE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlBhZ2VBcmVhKQotICAgICAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWE7Ci0gICAgICBpZiAocFBhcmVudE5vZGUtPkdldEludGFjdCgpID09IFhGQV9BVFRSSUJVVEVFTlVNX05vbmUpIHsKLSAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZVBhckxheW91dCA9Ci0gICAgICAgICAgICBwUGFyZW50Tm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCk7Ci0gICAgICAgIGlmIChlUGFyTGF5b3V0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1Bvc2l0aW9uIHx8Ci0gICAgICAgICAgICBlUGFyTGF5b3V0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1JvdyB8fAotICAgICAgICAgICAgZVBhckxheW91dCA9PSBYRkFfQVRUUklCVVRFRU5VTV9UYWJsZSkgewotICAgICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOwotICAgICAgICB9Ci0gICAgICAgIFhGQV9WRVJTSU9OIHZlcnNpb24gPSBtX3BEb2N1bWVudC0+R2V0Q3VyVmVyc2lvbk1vZGUoKTsKLSAgICAgICAgaWYgKGVQYXJMYXlvdXQgPT0gWEZBX0FUVFJJQlVURUVOVU1fVGIgJiYgdmVyc2lvbiA8IFhGQV9WRVJTSU9OXzIwOCkgewotICAgICAgICAgIENYRkFfTWVhc3VyZW1lbnQgbWVhc3VyZUg7Ci0gICAgICAgICAgaWYgKFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9ILCBtZWFzdXJlSCwgZmFsc2UpKQotICAgICAgICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOworICAgICAgQ1hGQV9Ob2RlKiBwYXJlbnQgPSBHZXRQYXJlbnQoKTsKKyAgICAgIGlmICghcGFyZW50IHx8IHBhcmVudC0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6UGFnZUFyZWEpCisgICAgICAgIHJldHVybiBYRkFfQXR0cmlidXRlRW51bTo6Q29udGVudEFyZWE7CisgICAgICBpZiAocGFyZW50LT5HZXRJbnRhY3QoKSAhPSBYRkFfQXR0cmlidXRlRW51bTo6Tm9uZSkKKyAgICAgICAgcmV0dXJuIFhGQV9BdHRyaWJ1dGVFbnVtOjpDb250ZW50QXJlYTsKKworICAgICAgWEZBX0F0dHJpYnV0ZUVudW0gZVBhckxheW91dCA9IHBhcmVudC0+SlNPYmplY3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlRyeUVudW0oWEZBX0F0dHJpYnV0ZTo6TGF5b3V0LCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfb3IoWEZBX0F0dHJpYnV0ZUVudW06OlBvc2l0aW9uKTsKKyAgICAgIGlmIChlUGFyTGF5b3V0ID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpQb3NpdGlvbiB8fAorICAgICAgICAgIGVQYXJMYXlvdXQgPT0gWEZBX0F0dHJpYnV0ZUVudW06OlJvdyB8fAorICAgICAgICAgIGVQYXJMYXlvdXQgPT0gWEZBX0F0dHJpYnV0ZUVudW06OlRhYmxlKSB7CisgICAgICAgIHJldHVybiBYRkFfQXR0cmlidXRlRW51bTo6Tm9uZTsKICAgICAgIH0KLSAgICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Db250ZW50QXJlYTsKKworICAgICAgWEZBX1ZFUlNJT04gdmVyc2lvbiA9IG1fcERvY3VtZW50LT5HZXRDdXJWZXJzaW9uTW9kZSgpOworICAgICAgaWYgKGVQYXJMYXlvdXQgPT0gWEZBX0F0dHJpYnV0ZUVudW06OlRiICYmIHZlcnNpb24gPCBYRkFfVkVSU0lPTl8yMDgpIHsKKyAgICAgICAgT3B0aW9uYWw8Q1hGQV9NZWFzdXJlbWVudD4gbWVhc3VyZUggPQorICAgICAgICAgICAgSlNPYmplY3QoKS0+VHJ5TWVhc3VyZShYRkFfQXR0cmlidXRlOjpILCBmYWxzZSk7CisgICAgICAgIGlmIChtZWFzdXJlSCkKKyAgICAgICAgICByZXR1cm4gWEZBX0F0dHJpYnV0ZUVudW06OkNvbnRlbnRBcmVhOworICAgICAgfQorICAgICAgcmV0dXJuIFhGQV9BdHRyaWJ1dGVFbnVtOjpOb25lOwogICAgIH0KICAgICBjYXNlIFhGQV9FbGVtZW50OjpEcmF3OgotICAgICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhOworICAgICAgcmV0dXJuIFhGQV9BdHRyaWJ1dGVFbnVtOjpDb250ZW50QXJlYTsKICAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7CisgICAgICByZXR1cm4gWEZBX0F0dHJpYnV0ZUVudW06Ok5vbmU7CiAgIH0KLSAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX05vbmU7CiB9CiAKIENYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXREYXRhRGVzY3JpcHRpb25Ob2RlKCkgewotICBpZiAobV9lUGFja2V0ID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpCisgIGlmIChtX2VQYWNrZXQgPT0gWEZBX1BhY2tldFR5cGU6OkRhdGFzZXRzKQogICAgIHJldHVybiBtX3BBdXhOb2RlOwogICByZXR1cm4gbnVsbHB0cjsKIH0KIAogdm9pZCBDWEZBX05vZGU6OlNldERhdGFEZXNjcmlwdGlvbk5vZGUoQ1hGQV9Ob2RlKiBwRGF0YURlc2NyaXB0aW9uTm9kZSkgewotICBBU1NFUlQobV9lUGFja2V0ID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpOworICBBU1NFUlQobV9lUGFja2V0ID09IFhGQV9QYWNrZXRUeXBlOjpEYXRhc2V0cyk7CiAgIG1fcEF1eE5vZGUgPSBwRGF0YURlc2NyaXB0aW9uTm9kZTsKIH0KIAotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfUmVzb2x2ZU5vZGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsKLSAgaWYgKGlMZW5ndGggIT0gMSkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwicmVzb2x2ZU5vZGUiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uID0KLSAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApLkFzU3RyaW5nQygpKTsKLSAgQ1hGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7Ci0gIGlmICghcFNjcmlwdENvbnRleHQpCi0gICAgcmV0dXJuOwotICBDWEZBX05vZGUqIHJlZk5vZGUgPSB0aGlzOwotICBpZiAocmVmTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6WGZhKQotICAgIHJlZk5vZGUgPSBUb05vZGUocFNjcmlwdENvbnRleHQtPkdldFRoaXNPYmplY3QoKSk7Ci0gIHVpbnQzMl90IGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzIHwKLSAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfCBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwKLSAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOwotICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb3ZlTm9kZVJTOwotICBpbnQzMl90IGlSZXQgPSBwU2NyaXB0Q29udGV4dC0+UmVzb2x2ZU9iamVjdHMoCi0gICAgICByZWZOb2RlLCB3c0V4cHJlc3Npb24uQXNTdHJpbmdDKCksIHJlc292ZU5vZGVSUywgZHdGbGFnKTsKLSAgaWYgKGlSZXQgPCAxKSB7Ci0gICAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAocmVzb3ZlTm9kZVJTLmR3RmxhZ3MgPT0gWEZBX1JFU09WRU5PREVfUlNUWVBFX05vZGVzKSB7Ci0gICAgQ1hGQV9PYmplY3QqIHBOb2RlID0gcmVzb3ZlTm9kZVJTLm5vZGVzWzBdOwotICAgIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCktPkFzc2lnbigKLSAgICAgICAgcFNjcmlwdENvbnRleHQtPkdldEpTVmFsdWVGcm9tTWFwKHBOb2RlKSk7Ci0gIH0gZWxzZSB7Ci0gICAgY29uc3QgWEZBX1NDUklQVEFUVFJJQlVURUlORk8qIGxwQXR0cmlidXRlSW5mbyA9Ci0gICAgICAgIHJlc292ZU5vZGVSUy5wU2NyaXB0QXR0cmlidXRlOwotICAgIGlmIChscEF0dHJpYnV0ZUluZm8gJiYgbHBBdHRyaWJ1dGVJbmZvLT5lVmFsdWVUeXBlID09IFhGQV9TQ1JJUFRfT2JqZWN0KSB7Ci0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBwVmFsdWUoCi0gICAgICAgICAgbmV3IENGWEpTRV9WYWx1ZShwU2NyaXB0Q29udGV4dC0+R2V0UnVudGltZSgpKSk7Ci0gICAgICAocmVzb3ZlTm9kZVJTLm5vZGVzWzBdLT4qKGxwQXR0cmlidXRlSW5mby0+bHBmbkNhbGxiYWNrKSkoCi0gICAgICAgICAgcFZhbHVlLmdldCgpLCBmYWxzZSwgKFhGQV9BVFRSSUJVVEUpbHBBdHRyaWJ1dGVJbmZvLT5lQXR0cmlidXRlKTsKLSAgICAgIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCktPkFzc2lnbihwVmFsdWUuZ2V0KCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX1Jlc29sdmVOb2RlcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOwotICBpZiAoaUxlbmd0aCAhPSAxKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJyZXNvbHZlTm9kZXMiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uID0KLSAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApLkFzU3RyaW5nQygpKTsKLSAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOwotICBpZiAoIXBWYWx1ZSkKLSAgICByZXR1cm47Ci0gIHVpbnQzMl90IGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzIHwKLSAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXMgfCBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwKLSAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOwotICBDWEZBX05vZGUqIHJlZk5vZGUgPSB0aGlzOwotICBpZiAocmVmTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6WGZhKQotICAgIHJlZk5vZGUgPSBUb05vZGUobV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpKTsKLSAgU2NyaXB0X1NvbV9SZXNvbHZlTm9kZUxpc3QocFZhbHVlLCB3c0V4cHJlc3Npb24sIGR3RmxhZywgcmVmTm9kZSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX1Jlc29sdmVOb2RlTGlzdChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcmVmTm9kZSkgewotICBDWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKTsKLSAgaWYgKCFwU2NyaXB0Q29udGV4dCkKLSAgICByZXR1cm47Ci0gIFhGQV9SRVNPTFZFTk9ERV9SUyByZXNvdmVOb2RlUlM7Ci0gIGlmICghcmVmTm9kZSkKLSAgICByZWZOb2RlID0gdGhpczsKLSAgcFNjcmlwdENvbnRleHQtPlJlc29sdmVPYmplY3RzKHJlZk5vZGUsIHdzRXhwcmVzc2lvbi5Bc1N0cmluZ0MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc292ZU5vZGVSUywgZHdGbGFnKTsKLSAgQ1hGQV9BcnJheU5vZGVMaXN0KiBwTm9kZUxpc3QgPSBuZXcgQ1hGQV9BcnJheU5vZGVMaXN0KG1fcERvY3VtZW50KTsKLSAgaWYgKHJlc292ZU5vZGVSUy5kd0ZsYWdzID09IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9Ob2RlcykgewotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHJlc292ZU5vZGVSUy5ub2Rlcy5HZXRTaXplKCk7IGkrKykgewotICAgICAgaWYgKHJlc292ZU5vZGVSUy5ub2Rlc1tpXS0+SXNOb2RlKCkpCi0gICAgICAgIHBOb2RlTGlzdC0+QXBwZW5kKHJlc292ZU5vZGVSUy5ub2Rlc1tpXS0+QXNOb2RlKCkpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBDWEZBX1ZhbHVlQXJyYXkgdmFsdWVBcnJheShwU2NyaXB0Q29udGV4dC0+R2V0UnVudGltZSgpKTsKLSAgICBpZiAocmVzb3ZlTm9kZVJTLkdldEF0dHJpYnV0ZVJlc3VsdCh2YWx1ZUFycmF5KSA+IDApIHsKLSAgICAgIENYRkFfT2JqQXJyYXkgb2JqZWN0QXJyYXk7Ci0gICAgICB2YWx1ZUFycmF5LkdldEF0dHJpYnV0ZU9iamVjdChvYmplY3RBcnJheSk7Ci0gICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBvYmplY3RBcnJheS5HZXRTaXplKCk7IGkrKykgewotICAgICAgICBpZiAob2JqZWN0QXJyYXlbaV0tPklzTm9kZSgpKQotICAgICAgICAgIHBOb2RlTGlzdC0+QXBwZW5kKG9iamVjdEFycmF5W2ldLT5Bc05vZGUoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHBWYWx1ZS0+U2V0T2JqZWN0KHBOb2RlTGlzdCwgcFNjcmlwdENvbnRleHQtPkdldEpzZU5vcm1hbENsYXNzKCkpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19BbGwoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB1aW50MzJfdCBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MgfCBYRkFfUkVTT0xWRU5PREVfQUxMOwotICBDRlhfV2lkZVN0cmluZyB3c05hbWU7Ci0gIEdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7Ci0gIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbiA9IHdzTmFtZSArIEwiWypdIjsKLSAgU2NyaXB0X1NvbV9SZXNvbHZlTm9kZUxpc3QocFZhbHVlLCB3c0V4cHJlc3Npb24sIGR3RmxhZyk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX05vZGVzKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBDWEZBX1NjcmlwdENvbnRleHQqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKTsKLSAgaWYgKCFwU2NyaXB0Q29udGV4dCkKLSAgICByZXR1cm47Ci0gIGlmIChiU2V0dGluZykgewotICAgIENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZSA9IEwiVW5hYmxlIHRvIHNldCAiOwotICAgIEZYSlNFX1Rocm93TWVzc2FnZSh3c01lc3NhZ2UuVVRGOEVuY29kZSgpLkFzU3RyaW5nQygpKTsKLSAgfSBlbHNlIHsKLSAgICBDWEZBX0F0dGFjaE5vZGVMaXN0KiBwTm9kZUxpc3QgPSBuZXcgQ1hGQV9BdHRhY2hOb2RlTGlzdChtX3BEb2N1bWVudCwgdGhpcyk7Ci0gICAgcFZhbHVlLT5TZXRPYmplY3QocE5vZGVMaXN0LCBwU2NyaXB0Q29udGV4dC0+R2V0SnNlTm9ybWFsQ2xhc3MoKSk7Ci0gIH0KLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfQ2xhc3NBbGwoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIGlmIChiU2V0dGluZykgewotICAgIFRocm93SW52YWxpZFByb3BlcnR5RXhjZXB0aW9uKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHVpbnQzMl90IGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9BTEw7Ci0gIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbiA9IEwiIyIgKyBHZXRDbGFzc05hbWUoKSArIEwiWypdIjsKLSAgU2NyaXB0X1NvbV9SZXNvbHZlTm9kZUxpc3QocFZhbHVlLCB3c0V4cHJlc3Npb24sIGR3RmxhZyk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX1BhcmVudChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBpZiAoYlNldHRpbmcpIHsKLSAgICBUaHJvd0ludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotICBDWEZBX05vZGUqIHBQYXJlbnQgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsKLSAgaWYgKHBQYXJlbnQpIHsKLSAgICBwVmFsdWUtPkFzc2lnbihtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwUGFyZW50KSk7Ci0gIH0gZWxzZSB7Ci0gICAgcFZhbHVlLT5TZXROdWxsKCk7Ci0gIH0KLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfSW5kZXgoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIGlmIChiU2V0dGluZykgewotICAgIFRocm93SW52YWxpZFByb3BlcnR5RXhjZXB0aW9uKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBWYWx1ZS0+U2V0SW50ZWdlcihHZXROb2RlU2FtZU5hbWVJbmRleCgpKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfQ2xhc3NJbmRleChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIGlmIChiU2V0dGluZykgewotICAgIFRocm93SW52YWxpZFByb3BlcnR5RXhjZXB0aW9uKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBWYWx1ZS0+U2V0SW50ZWdlcihHZXROb2RlU2FtZUNsYXNzSW5kZXgoKSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX1NvbUV4cHJlc3Npb24oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBpZiAoYlNldHRpbmcpIHsKLSAgICBUaHJvd0ludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotICBDRlhfV2lkZVN0cmluZyB3c1NPTUV4cHJlc3Npb247Ci0gIEdldFNPTUV4cHJlc3Npb24od3NTT01FeHByZXNzaW9uKTsKLSAgcFZhbHVlLT5TZXRTdHJpbmcod3NTT01FeHByZXNzaW9uLlVURjhFbmNvZGUoKS5Bc1N0cmluZ0MoKSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0FwcGx5WFNMKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7Ci0gIGlmIChpTGVuZ3RoICE9IDEpIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMImFwcGx5WFNMIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbiA9Ci0gICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgocEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKS5Bc1N0cmluZ0MoKSk7Ci0gIC8vIFRPRE8od2VpbGkpOiBjaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMsIHBkZml1bTo1MDEuCi0gIC8vIEZvciBub3csIGp1c3QgcHV0IHRoZSB2YXJpYWJsZXMgaGVyZSB0byBhdm9pZCB1bnVzZWQgdmFyaWFibGUgd2FybmluZy4KLSAgKHZvaWQpd3NFeHByZXNzaW9uOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19Bc3NpZ25Ob2RlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7Ci0gIGlmIChpTGVuZ3RoIDwgMSB8fCBpTGVuZ3RoID4gMykgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiYXNzaWduTm9kZSIpOwotICAgIHJldHVybjsKLSAgfQotICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247Ci0gIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7Ci0gIGludDMyX3QgaUFjdGlvbiA9IDA7Ci0gIHdzRXhwcmVzc2lvbiA9Ci0gICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgocEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKS5Bc1N0cmluZ0MoKSk7Ci0gIGlmIChpTGVuZ3RoID49IDIpIHsKLSAgICB3c1ZhbHVlID0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMSkuQXNTdHJpbmdDKCkpOwotICB9Ci0gIGlmIChpTGVuZ3RoID49IDMpCi0gICAgaUFjdGlvbiA9IHBBcmd1bWVudHMtPkdldEludDMyKDIpOwotICAvLyBUT0RPKHdlaWxpKTogY2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGltcGxlbWVudCB0aGlzLCBwZGZpdW06NTAxLgotICAvLyBGb3Igbm93LCBqdXN0IHB1dCB0aGUgdmFyaWFibGVzIGhlcmUgdG8gYXZvaWQgdW51c2VkIHZhcmlhYmxlIHdhcm5pbmcuCi0gICh2b2lkKXdzRXhwcmVzc2lvbjsKLSAgKHZvaWQpd3NWYWx1ZTsKLSAgKHZvaWQpaUFjdGlvbjsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfQ2xvbmUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsKLSAgaWYgKGlMZW5ndGggIT0gMSkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiY2xvbmUiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgYm9vbCBiQ2xvbmUgPSAhIXBBcmd1bWVudHMtPkdldEludDMyKDApOwotICBDWEZBX05vZGUqIHBDbG9uZU5vZGUgPSBDbG9uZShiQ2xvbmUpOwotICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLT5Bc3NpZ24oCi0gICAgICBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwQ2xvbmVOb2RlKSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0dldEF0dHJpYnV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOwotICBpZiAoaUxlbmd0aCAhPSAxKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJnZXRBdHRyaWJ1dGUiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uID0KLSAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApLkFzU3RyaW5nQygpKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsKLSAgR2V0QXR0cmlidXRlKHdzRXhwcmVzc2lvbi5Bc1N0cmluZ0MoKSwgd3NWYWx1ZSk7Ci0gIENGWEpTRV9WYWx1ZSogcFZhbHVlID0gcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKTsKLSAgaWYgKHBWYWx1ZSkKLSAgICBwVmFsdWUtPlNldFN0cmluZyh3c1ZhbHVlLlVURjhFbmNvZGUoKS5Bc1N0cmluZ0MoKSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0dldEVsZW1lbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsKLSAgaWYgKGlMZW5ndGggPCAxIHx8IGlMZW5ndGggPiAyKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJnZXRFbGVtZW50Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENGWF9XaWRlU3RyaW5nIHdzRXhwcmVzc2lvbjsKLSAgaW50MzJfdCBpVmFsdWUgPSAwOwotICB3c0V4cHJlc3Npb24gPQotICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCkuQXNTdHJpbmdDKCkpOwotICBpZiAoaUxlbmd0aCA+PSAyKQotICAgIGlWYWx1ZSA9IHBBcmd1bWVudHMtPkdldEludDMyKDEpOwotICBDWEZBX05vZGUqIHBOb2RlID0KLSAgICAgIEdldFByb3BlcnR5KGlWYWx1ZSwgWEZBX0dldEVsZW1lbnRUeXBlRm9yTmFtZSh3c0V4cHJlc3Npb24uQXNTdHJpbmdDKCkpKTsKLSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+QXNzaWduKAotICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocE5vZGUpKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfSXNQcm9wZXJ0eVNwZWNpZmllZCgKLSAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOwotICBpZiAoaUxlbmd0aCA8IDEgfHwgaUxlbmd0aCA+IDMpIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMImlzUHJvcGVydHlTcGVjaWZpZWQiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOwotICBib29sIGJQYXJlbnQgPSB0cnVlOwotICBpbnQzMl90IGlJbmRleCA9IDA7Ci0gIHdzRXhwcmVzc2lvbiA9Ci0gICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgocEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKS5Bc1N0cmluZ0MoKSk7Ci0gIGlmIChpTGVuZ3RoID49IDIpCi0gICAgYlBhcmVudCA9ICEhcEFyZ3VtZW50cy0+R2V0SW50MzIoMSk7Ci0gIGlmIChpTGVuZ3RoID49IDMpCi0gICAgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMik7Ci0gIGJvb2wgYkhhcyA9IGZhbHNlOwotICBjb25zdCBYRkFfQVRUUklCVVRFSU5GTyogcEF0dHJpYnV0ZUluZm8gPQotICAgICAgWEZBX0dldEF0dHJpYnV0ZUJ5TmFtZSh3c0V4cHJlc3Npb24uQXNTdHJpbmdDKCkpOwotICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOwotICBpZiAocEF0dHJpYnV0ZUluZm8pCi0gICAgYkhhcyA9IEhhc0F0dHJpYnV0ZShwQXR0cmlidXRlSW5mby0+ZU5hbWUpOwotICBpZiAoIWJIYXMpIHsKLSAgICBYRkFfRWxlbWVudCBlVHlwZSA9IFhGQV9HZXRFbGVtZW50VHlwZUZvck5hbWUod3NFeHByZXNzaW9uLkFzU3RyaW5nQygpKTsKLSAgICBiSGFzID0gISFHZXRQcm9wZXJ0eShpSW5kZXgsIGVUeXBlKTsKLSAgICBpZiAoIWJIYXMgJiYgYlBhcmVudCAmJiBtX3BQYXJlbnQpIHsKLSAgICAgIC8vIEFsc28gY2hlY2sgb24gdGhlIHBhcmVudC4KLSAgICAgIGJIYXMgPSBtX3BQYXJlbnQtPkhhc0F0dHJpYnV0ZShwQXR0cmlidXRlSW5mby0+ZU5hbWUpOwotICAgICAgaWYgKCFiSGFzKQotICAgICAgICBiSGFzID0gISFtX3BQYXJlbnQtPkdldFByb3BlcnR5KGlJbmRleCwgZVR5cGUpOwotICAgIH0KLSAgfQotICBDRlhKU0VfVmFsdWUqIHBWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7Ci0gIGlmIChwVmFsdWUpCi0gICAgcFZhbHVlLT5TZXRCb29sZWFuKGJIYXMpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19Mb2FkWE1MKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7Ci0gIGlmIChpTGVuZ3RoIDwgMSB8fCBpTGVuZ3RoID4gMykgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwibG9hZFhNTCIpOwotICAgIHJldHVybjsKLSAgfQotICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb247Ci0gIGJvb2wgYklnbm9yZVJvb3QgPSB0cnVlOwotICBib29sIGJPdmVyd3JpdGUgPSAwOwotICB3c0V4cHJlc3Npb24gPQotICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCkuQXNTdHJpbmdDKCkpOwotICBpZiAod3NFeHByZXNzaW9uLklzRW1wdHkoKSkKLSAgICByZXR1cm47Ci0gIGlmIChpTGVuZ3RoID49IDIpCi0gICAgYklnbm9yZVJvb3QgPSAhIXBBcmd1bWVudHMtPkdldEludDMyKDEpOwotICBpZiAoaUxlbmd0aCA+PSAzKQotICAgIGJPdmVyd3JpdGUgPSAhIXBBcmd1bWVudHMtPkdldEludDMyKDIpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9TaW1wbGVQYXJzZXI+IHBQYXJzZXIoCi0gICAgICBuZXcgQ1hGQV9TaW1wbGVQYXJzZXIobV9wRG9jdW1lbnQsIGZhbHNlKSk7Ci0gIGlmICghcFBhcnNlcikKLSAgICByZXR1cm47Ci0gIENGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBudWxscHRyOwotICBpbnQzMl90IGlQYXJzZXJTdGF0dXMgPQotICAgICAgcFBhcnNlci0+UGFyc2VYTUxEYXRhKHdzRXhwcmVzc2lvbiwgcFhNTE5vZGUsIG51bGxwdHIpOwotICBpZiAoaVBhcnNlclN0YXR1cyAhPSBYRkFfUEFSU0VTVEFUVVNfRG9uZSB8fCAhcFhNTE5vZGUpCi0gICAgcmV0dXJuOwotICBpZiAoYklnbm9yZVJvb3QgJiYKLSAgICAgIChwWE1MTm9kZS0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQgfHwKLSAgICAgICBYRkFfUmVjb2duaXplUmljaFRleHQoc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4ocFhNTE5vZGUpKSkpIHsKLSAgICBiSWdub3JlUm9vdCA9IGZhbHNlOwotICB9Ci0gIENYRkFfTm9kZSogcEZha2VSb290ID0gQ2xvbmUoZmFsc2UpOwotICBDRlhfV2lkZVN0cmluZ0Mgd3NDb250ZW50VHlwZSA9IEdldENEYXRhKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUpOwotICBpZiAoIXdzQ29udGVudFR5cGUuSXNFbXB0eSgpKSB7Ci0gICAgcEZha2VSb290LT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcod3NDb250ZW50VHlwZSkpOwotICB9Ci0gIENGREVfWE1MTm9kZSogcEZha2VYTUxSb290ID0gcEZha2VSb290LT5HZXRYTUxNYXBwaW5nTm9kZSgpOwotICBpZiAoIXBGYWtlWE1MUm9vdCkgewotICAgIENGREVfWE1MTm9kZSogcFRoaXNYTUxSb290ID0gR2V0WE1MTWFwcGluZ05vZGUoKTsKLSAgICBwRmFrZVhNTFJvb3QgPSBwVGhpc1hNTFJvb3QgPyBwVGhpc1hNTFJvb3QtPkNsb25lKGZhbHNlKSA6IG51bGxwdHI7Ci0gIH0KLSAgaWYgKCFwRmFrZVhNTFJvb3QpCi0gICAgcEZha2VYTUxSb290ID0gbmV3IENGREVfWE1MRWxlbWVudChDRlhfV2lkZVN0cmluZyhHZXRDbGFzc05hbWUoKSkpOwotCi0gIGlmIChiSWdub3JlUm9vdCkgewotICAgIENGREVfWE1MTm9kZSogcFhNTENoaWxkID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKENGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7Ci0gICAgd2hpbGUgKHBYTUxDaGlsZCkgewotICAgICAgQ0ZERV9YTUxOb2RlKiBwWE1MU2libGluZyA9Ci0gICAgICAgICAgcFhNTENoaWxkLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKTsKLSAgICAgIHBYTUxOb2RlLT5SZW1vdmVDaGlsZE5vZGUocFhNTENoaWxkKTsKLSAgICAgIHBGYWtlWE1MUm9vdC0+SW5zZXJ0Q2hpbGROb2RlKHBYTUxDaGlsZCk7Ci0gICAgICBwWE1MQ2hpbGQgPSBwWE1MU2libGluZzsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgQ0ZERV9YTUxOb2RlKiBwWE1MUGFyZW50ID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKENGREVfWE1MTm9kZTo6UGFyZW50KTsKLSAgICBpZiAocFhNTFBhcmVudCkgewotICAgICAgcFhNTFBhcmVudC0+UmVtb3ZlQ2hpbGROb2RlKHBYTUxOb2RlKTsKLSAgICB9Ci0gICAgcEZha2VYTUxSb290LT5JbnNlcnRDaGlsZE5vZGUocFhNTE5vZGUpOwotICB9Ci0gIHBQYXJzZXItPkNvbnN0cnVjdFhGQU5vZGUocEZha2VSb290LCBwRmFrZVhNTFJvb3QpOwotICBwRmFrZVJvb3QgPSBwUGFyc2VyLT5HZXRSb290Tm9kZSgpOwotICBpZiAocEZha2VSb290KSB7Ci0gICAgaWYgKGJPdmVyd3JpdGUpIHsKLSAgICAgIENYRkFfTm9kZSogcENoaWxkID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgQ1hGQV9Ob2RlKiBwTmV3Q2hpbGQgPSBwRmFrZVJvb3QtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsKLSAgICAgIGludDMyX3QgaW5kZXggPSAwOwotICAgICAgd2hpbGUgKHBOZXdDaGlsZCkgewotICAgICAgICBDWEZBX05vZGUqIHBJdGVtID0gcE5ld0NoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOwotICAgICAgICBwRmFrZVJvb3QtPlJlbW92ZUNoaWxkKHBOZXdDaGlsZCk7Ci0gICAgICAgIEluc2VydENoaWxkKGluZGV4KyssIHBOZXdDaGlsZCk7Ci0gICAgICAgIHBOZXdDaGlsZC0+U2V0RmxhZyhYRkFfTm9kZUZsYWdfSW5pdGlhbGl6ZWQsIHRydWUpOwotICAgICAgICBwTmV3Q2hpbGQgPSBwSXRlbTsKLSAgICAgIH0KLSAgICAgIHdoaWxlIChwQ2hpbGQpIHsKLSAgICAgICAgQ1hGQV9Ob2RlKiBwSXRlbSA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsKLSAgICAgICAgUmVtb3ZlQ2hpbGQocENoaWxkKTsKLSAgICAgICAgcEZha2VSb290LT5JbnNlcnRDaGlsZChwQ2hpbGQpOwotICAgICAgICBwQ2hpbGQgPSBwSXRlbTsKLSAgICAgIH0KLSAgICAgIGlmIChHZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRm9ybSAmJgotICAgICAgICAgIEdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkV4RGF0YSkgewotICAgICAgICBDRkRFX1hNTE5vZGUqIHBUZW1wWE1MTm9kZSA9IEdldFhNTE1hcHBpbmdOb2RlKCk7Ci0gICAgICAgIFNldFhNTE1hcHBpbmdOb2RlKHBGYWtlWE1MUm9vdCk7Ci0gICAgICAgIFNldEZsYWcoWEZBX05vZGVGbGFnX093blhNTE5vZGUsIGZhbHNlKTsKLSAgICAgICAgaWYgKHBUZW1wWE1MTm9kZSAmJiAhcFRlbXBYTUxOb2RlLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6OlBhcmVudCkpIHsKLSAgICAgICAgICBwRmFrZVhNTFJvb3QgPSBwVGVtcFhNTE5vZGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcEZha2VYTUxSb290ID0gbnVsbHB0cjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgTW92ZUJ1ZmZlck1hcERhdGEocEZha2VSb290LCB0aGlzLCBYRkFfQ2FsY0RhdGEsIHRydWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBDWEZBX05vZGUqIHBDaGlsZCA9IHBGYWtlUm9vdC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgd2hpbGUgKHBDaGlsZCkgewotICAgICAgICBDWEZBX05vZGUqIHBJdGVtID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOwotICAgICAgICBwRmFrZVJvb3QtPlJlbW92ZUNoaWxkKHBDaGlsZCk7Ci0gICAgICAgIEluc2VydENoaWxkKHBDaGlsZCk7Ci0gICAgICAgIHBDaGlsZC0+U2V0RmxhZyhYRkFfTm9kZUZsYWdfSW5pdGlhbGl6ZWQsIHRydWUpOwotICAgICAgICBwQ2hpbGQgPSBwSXRlbTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBGYWtlWE1MUm9vdCkgewotICAgICAgcEZha2VSb290LT5TZXRYTUxNYXBwaW5nTm9kZShwRmFrZVhNTFJvb3QpOwotICAgICAgcEZha2VSb290LT5TZXRGbGFnKFhGQV9Ob2RlRmxhZ19Pd25YTUxOb2RlLCBmYWxzZSk7Ci0gICAgfQotICAgIHBGYWtlUm9vdC0+U2V0RmxhZyhYRkFfTm9kZUZsYWdfSGFzUmVtb3ZlZENoaWxkcmVuLCBmYWxzZSk7Ci0gIH0gZWxzZSB7Ci0gICAgZGVsZXRlIHBGYWtlWE1MUm9vdDsKLSAgICBwRmFrZVhNTFJvb3QgPSBudWxscHRyOwotICB9Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX1NhdmVGaWx0ZXJlZFhNTChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIC8vIFRPRE8od2VpbGkpOiBDaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMsIHBkZml1bTo1MDEuCi19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX1NhdmVYTUwoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsKLSAgaWYgKGlMZW5ndGggPCAwIHx8IGlMZW5ndGggPiAxKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJzYXZlWE1MIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGJvb2wgYlByZXR0eU1vZGUgPSBmYWxzZTsKLSAgaWYgKGlMZW5ndGggPT0gMSkgewotICAgIGlmIChwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApICE9ICJwcmV0dHkiKSB7Ci0gICAgICBUaHJvd0FyZ3VtZW50TWlzbWF0Y2hFeGNlcHRpb24oKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYlByZXR0eU1vZGUgPSB0cnVlOwotICB9Ci0gIENGWF9CeXRlU3RyaW5nQyBic1hNTEhlYWRlciA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiI7Ci0gIGlmIChHZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRm9ybSB8fAotICAgICAgR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSB7Ci0gICAgQ0ZERV9YTUxOb2RlKiBwRWxlbWVudCA9IG51bGxwdHI7Ci0gICAgaWYgKEdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykgewotICAgICAgcEVsZW1lbnQgPSBHZXRYTUxNYXBwaW5nTm9kZSgpOwotICAgICAgaWYgKCFwRWxlbWVudCB8fCBwRWxlbWVudC0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsKLSAgICAgICAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKGJzWE1MSGVhZGVyKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgWEZBX0RhdGFFeHBvcnRlcl9EZWFsV2l0aERhdGFHcm91cE5vZGUodGhpcyk7Ci0gICAgfQotICAgIENGWF9SZXRhaW5QdHI8SUZYX01lbW9yeVN0cmVhbT4gcE1lbW9yeVN0cmVhbSA9Ci0gICAgICAgIElGWF9NZW1vcnlTdHJlYW06OkNyZWF0ZSh0cnVlKTsKLQotICAgIC8vIE5vdGU6IGFtYmlndWlvdXMgYmVsb3cgd2l0aG91dCBzdGF0aWNfY2FzdC4KLSAgICBDRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4gcFN0cmVhbSA9IElGR0FTX1N0cmVhbTo6Q3JlYXRlU3RyZWFtKAotICAgICAgICBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVdyaXRlU3RyZWFtPihwTWVtb3J5U3RyZWFtKSwKLSAgICAgICAgRlhfU1RSRUFNQUNDRVNTX1RleHQgfCBGWF9TVFJFQU1BQ0NFU1NfV3JpdGUgfCBGWF9TVFJFQU1BQ0NFU1NfQXBwZW5kKTsKLQotICAgIGlmICghcFN0cmVhbSkgewotICAgICAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKGJzWE1MSGVhZGVyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcFN0cmVhbS0+U2V0Q29kZVBhZ2UoRlhfQ09ERVBBR0VfVVRGOCk7Ci0gICAgcFN0cmVhbS0+V3JpdGVEYXRhKGJzWE1MSGVhZGVyLnJhd19zdHIoKSwgYnNYTUxIZWFkZXIuR2V0TGVuZ3RoKCkpOwotICAgIGlmIChHZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRm9ybSkKLSAgICAgIFhGQV9EYXRhRXhwb3J0ZXJfUmVnZW5lcmF0ZUZvcm1GaWxlKHRoaXMsIHBTdHJlYW0sIG51bGxwdHIsIHRydWUpOwotICAgIGVsc2UKLSAgICAgIHBFbGVtZW50LT5TYXZlWE1MTm9kZShwU3RyZWFtKTsKLSAgICAvLyBUT0RPKHdlaWxpKTogQ2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIHNhdmUgcHJldHR5IHByaW50IFhNTCwgcGRmaXVtOjUwMS4KLSAgICAvLyBGb3Igbm93LCBqdXN0IHB1dCBpdCBoZXJlIHRvIGF2b2lkIHVudXNlZCB2YXJpYWJsZSB3YXJuaW5nLgotICAgICh2b2lkKWJQcmV0dHlNb2RlOwotICAgIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZygKLSAgICAgICAgQ0ZYX0J5dGVTdHJpbmdDKHBNZW1vcnlTdHJlYW0tPkdldEJ1ZmZlcigpLCBwTWVtb3J5U3RyZWFtLT5HZXRTaXplKCkpKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKCIiKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfU2V0QXR0cmlidXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7Ci0gIGlmIChpTGVuZ3RoICE9IDIpIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMInNldEF0dHJpYnV0ZSIpOwotICAgIHJldHVybjsKLSAgfQotICBDRlhfV2lkZVN0cmluZyB3c0F0dHJpYnV0ZVZhbHVlID0KLSAgICAgIENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApLkFzU3RyaW5nQygpKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyaWJ1dGUgPQotICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMSkuQXNTdHJpbmdDKCkpOwotICBTZXRBdHRyaWJ1dGUod3NBdHRyaWJ1dGUuQXNTdHJpbmdDKCksIHdzQXR0cmlidXRlVmFsdWUuQXNTdHJpbmdDKCksIHRydWUpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19TZXRFbGVtZW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7Ci0gIGlmIChpTGVuZ3RoICE9IDEgJiYgaUxlbmd0aCAhPSAyKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJzZXRFbGVtZW50Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfTm9kZSogcE5vZGUgPSBudWxscHRyOwotICBDRlhfV2lkZVN0cmluZyB3c05hbWU7Ci0gIHBOb2RlID0gc3RhdGljX2Nhc3Q8Q1hGQV9Ob2RlKj4ocEFyZ3VtZW50cy0+R2V0T2JqZWN0KDApKTsKLSAgaWYgKGlMZW5ndGggPT0gMikKLSAgICB3c05hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgocEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygxKS5Bc1N0cmluZ0MoKSk7Ci0gIC8vIFRPRE8od2VpbGkpOiBjaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMsIHBkZml1bTo1MDEuCi0gIC8vIEZvciBub3csIGp1c3QgcHV0IHRoZSB2YXJpYWJsZXMgaGVyZSB0byBhdm9pZCB1bnVzZWQgdmFyaWFibGUgd2FybmluZy4KLSAgKHZvaWQpcE5vZGU7Ci0gICh2b2lkKXdzTmFtZTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfTnMoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIGlmIChiU2V0dGluZykgewotICAgIFRocm93SW52YWxpZFByb3BlcnR5RXhjZXB0aW9uKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lU3BhY2U7Ci0gIFRyeU5hbWVzcGFjZSh3c05hbWVTcGFjZSk7Ci0gIHBWYWx1ZS0+U2V0U3RyaW5nKHdzTmFtZVNwYWNlLlVURjhFbmNvZGUoKS5Bc1N0cmluZ0MoKSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX01vZGVsKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBpZiAoYlNldHRpbmcpIHsKLSAgICBUaHJvd0ludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotICBwVmFsdWUtPkFzc2lnbigKLSAgICAgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKEdldE1vZGVsTm9kZSgpKSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0lzQ29udGFpbmVyKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBpZiAoYlNldHRpbmcpIHsKLSAgICBUaHJvd0ludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotICBwVmFsdWUtPlNldEJvb2xlYW4oSXNDb250YWluZXJOb2RlKCkpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19Jc051bGwoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKEdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm0pIHsKLSAgICBwVmFsdWUtPlNldEJvb2xlYW4oZmFsc2UpOwotICAgIHJldHVybjsKLSAgfQotICBDRlhfV2lkZVN0cmluZyBzdHJWYWx1ZTsKLSAgcFZhbHVlLT5TZXRCb29sZWFuKCFUcnlDb250ZW50KHN0clZhbHVlKSB8fCBzdHJWYWx1ZS5Jc0VtcHR5KCkpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19PbmVPZkNoaWxkKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDWEZBX05vZGVBcnJheSBwcm9wZXJ0czsKLSAgaW50MzJfdCBpU2l6ZSA9IEdldE5vZGVMaXN0KHByb3BlcnRzLCBYRkFfTk9ERUZJTFRFUl9PbmVPZlByb3BlcnR5KTsKLSAgaWYgKGlTaXplID4gMCkgewotICAgIHBWYWx1ZS0+QXNzaWduKAotICAgICAgICBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwcm9wZXJ0c1swXSkpOwotICB9Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfQ29udGFpbmVyQ2xhc3NfR2V0RGVsdGEoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykge30KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Db250YWluZXJDbGFzc19HZXREZWx0YXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBDWEZBX0FycmF5Tm9kZUxpc3QqIHBGb3JtTm9kZXMgPSBuZXcgQ1hGQV9BcnJheU5vZGVMaXN0KG1fcERvY3VtZW50KTsKLSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+U2V0T2JqZWN0KAotICAgICAgcEZvcm1Ob2RlcywgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SnNlTm9ybWFsQ2xhc3MoKSk7Ci19Ci12b2lkIENYRkFfTm9kZTo6U2NyaXB0X01vZGVsQ2xhc3NfQ2xlYXJFcnJvckxpc3QoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X01vZGVsQ2xhc3NfQ3JlYXRlTm9kZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIFNjcmlwdF9UZW1wbGF0ZV9DcmVhdGVOb2RlKHBBcmd1bWVudHMpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X01vZGVsQ2xhc3NfSXNDb21wYXRpYmxlTlMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsKLSAgaWYgKGlMZW5ndGggPCAxKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJpc0NvbXBhdGlibGVOUyIpOwotICAgIHJldHVybjsKLSAgfQotICBDRlhfV2lkZVN0cmluZyB3c05hbWVTcGFjZTsKLSAgaWYgKGlMZW5ndGggPj0gMSkgewotICAgIENGWF9CeXRlU3RyaW5nIGJzTmFtZVNwYWNlID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsKLSAgICB3c05hbWVTcGFjZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic05hbWVTcGFjZS5Bc1N0cmluZ0MoKSk7Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NOb2RlTmFtZVNwYWNlOwotICBUcnlOYW1lc3BhY2Uod3NOb2RlTmFtZVNwYWNlKTsKLSAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOwotICBpZiAocFZhbHVlKQotICAgIHBWYWx1ZS0+U2V0Qm9vbGVhbih3c05vZGVOYW1lU3BhY2UgPT0gd3NOYW1lU3BhY2UpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X01vZGVsQ2xhc3NfQ29udGV4dChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHt9Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfTW9kZWxDbGFzc19BbGlhc05vZGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkge30KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfSW50ZWdlcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIGlmIChiU2V0dGluZykgewotICAgIFNldEludGVnZXIoZUF0dHJpYnV0ZSwgcFZhbHVlLT5Ub0ludGVnZXIoKSwgdHJ1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgcFZhbHVlLT5TZXRJbnRlZ2VyKEdldEludGVnZXIoZUF0dHJpYnV0ZSkpOwotICB9Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0ludGVnZXJSZWFkKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBpZiAoYlNldHRpbmcpIHsKLSAgICBUaHJvd0ludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotICBwVmFsdWUtPlNldEludGVnZXIoR2V0SW50ZWdlcihlQXR0cmlidXRlKSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0woQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBpZiAoYlNldHRpbmcpIHsKLSAgICBTZXRCb29sZWFuKGVBdHRyaWJ1dGUsIHBWYWx1ZS0+VG9Cb29sZWFuKCksIHRydWUpOwotICB9IGVsc2UgewotICAgIHBWYWx1ZS0+U2V0U3RyaW5nKEdldEJvb2xlYW4oZUF0dHJpYnV0ZSkgPyAiMSIgOiAiMCIpOwotICB9Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0xSZWFkKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBpZiAoYlNldHRpbmcpIHsKLSAgICBUaHJvd0ludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotICBwVmFsdWUtPlNldFN0cmluZyhHZXRCb29sZWFuKGVBdHRyaWJ1dGUpID8gIjEiIDogIjAiKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU2VuZEF0dHJpYnV0ZUNoYW5nZU1lc3NhZ2UoCi0gICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlLAotICAgIGJvb2wgYlNjcmlwdE1vZGlmeSkgewotICBDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dFBybyA9IG1fcERvY3VtZW50LT5HZXRMYXlvdXRQcm9jZXNzb3IoKTsKLSAgaWYgKCFwTGF5b3V0UHJvKQotICAgIHJldHVybjsKLQotICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldE5vdGlmeSgpOwotICBpZiAoIXBOb3RpZnkpCi0gICAgcmV0dXJuOwotCi0gIHVpbnQzMl90IGR3UGFja2V0ID0gR2V0UGFja2V0SUQoKTsKLSAgaWYgKCEoZHdQYWNrZXQgJiBYRkFfWERQUEFDS0VUX0Zvcm0pKSB7Ci0gICAgcE5vdGlmeS0+T25WYWx1ZUNoYW5nZWQodGhpcywgZUF0dHJpYnV0ZSwgdGhpcywgdGhpcyk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgYm9vbCBiTmVlZEZpbmRDb250YWluZXIgPSBmYWxzZTsKLSAgc3dpdGNoIChHZXRFbGVtZW50VHlwZSgpKSB7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6Q2FwdGlvbjoKLSAgICAgIGJOZWVkRmluZENvbnRhaW5lciA9IHRydWU7Ci0gICAgICBwTm90aWZ5LT5PblZhbHVlQ2hhbmdlZCh0aGlzLCBlQXR0cmlidXRlLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6Rm9udDoKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpQYXJhOiB7Ci0gICAgICBiTmVlZEZpbmRDb250YWluZXIgPSB0cnVlOwotICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOwotICAgICAgaWYgKHBQYXJlbnROb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpDYXB0aW9uKSB7Ci0gICAgICAgIHBOb3RpZnktPk9uVmFsdWVDaGFuZ2VkKHRoaXMsIGVBdHRyaWJ1dGUsIHBQYXJlbnROb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcE5vdGlmeS0+T25WYWx1ZUNoYW5nZWQodGhpcywgZUF0dHJpYnV0ZSwgdGhpcywgcFBhcmVudE5vZGUpOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6TWFyZ2luOiB7Ci0gICAgICBiTmVlZEZpbmRDb250YWluZXIgPSB0cnVlOwotICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOwotICAgICAgWEZBX0VsZW1lbnQgZVBhcmVudFR5cGUgPSBwUGFyZW50Tm9kZS0+R2V0RWxlbWVudFR5cGUoKTsKLSAgICAgIGlmIChwUGFyZW50Tm9kZS0+SXNDb250YWluZXJOb2RlKCkpIHsKLSAgICAgICAgcE5vdGlmeS0+T25WYWx1ZUNoYW5nZWQodGhpcywgZUF0dHJpYnV0ZSwgdGhpcywgcFBhcmVudE5vZGUpOwotICAgICAgfSBlbHNlIGlmIChlUGFyZW50VHlwZSA9PSBYRkFfRWxlbWVudDo6Q2FwdGlvbikgewotICAgICAgICBwTm90aWZ5LT5PblZhbHVlQ2hhbmdlZCh0aGlzLCBlQXR0cmlidXRlLCBwUGFyZW50Tm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmVudE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIENYRkFfTm9kZSogcE5vZGUgPSBwUGFyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7Ci0gICAgICAgIGlmIChwTm9kZSAmJiBwTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6VWkpIHsKLSAgICAgICAgICBwTm90aWZ5LT5PblZhbHVlQ2hhbmdlZCh0aGlzLCBlQXR0cmlidXRlLCBwTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpDb21iOiB7Ci0gICAgICBDWEZBX05vZGUqIHBFZGl0Tm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOwotICAgICAgWEZBX0VsZW1lbnQgZVVJVHlwZSA9IHBFZGl0Tm9kZS0+R2V0RWxlbWVudFR5cGUoKTsKLSAgICAgIGlmIChwRWRpdE5vZGUgJiYgKGVVSVR5cGUgPT0gWEZBX0VsZW1lbnQ6OkRhdGVUaW1lRWRpdCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZVVJVHlwZSA9PSBYRkFfRWxlbWVudDo6TnVtZXJpY0VkaXQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVVSVR5cGUgPT0gWEZBX0VsZW1lbnQ6OlRleHRFZGl0KSkgewotICAgICAgICBDWEZBX05vZGUqIHBVSU5vZGUgPSBwRWRpdE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOwotICAgICAgICBpZiAocFVJTm9kZSkgewotICAgICAgICAgIHBOb3RpZnktPk9uVmFsdWVDaGFuZ2VkKHRoaXMsIGVBdHRyaWJ1dGUsIHBVSU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVJTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpCdXR0b246Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6QmFyY29kZToKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpDaG9pY2VMaXN0OgotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRhdGVUaW1lRWRpdDoKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpOdW1lcmljRWRpdDoKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpQYXNzd29yZEVkaXQ6Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6VGV4dEVkaXQ6IHsKLSAgICAgIENYRkFfTm9kZSogcFVJTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOwotICAgICAgaWYgKHBVSU5vZGUpIHsKLSAgICAgICAgcE5vdGlmeS0+T25WYWx1ZUNoYW5nZWQodGhpcywgZUF0dHJpYnV0ZSwgcFVJTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVJTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6Q2hlY2tCdXR0b246IHsKLSAgICAgIGJOZWVkRmluZENvbnRhaW5lciA9IHRydWU7Ci0gICAgICBDWEZBX05vZGUqIHBVSU5vZGUgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsKLSAgICAgIGlmIChwVUlOb2RlKSB7Ci0gICAgICAgIHBOb3RpZnktPk9uVmFsdWVDaGFuZ2VkKHRoaXMsIGVBdHRyaWJ1dGUsIHBVSU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVSU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKTsKLSAgICAgIH0KLSAgICB9IGJyZWFrOwotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OktlZXA6Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6Qm9va2VuZDoKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpCcmVhazoKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpCcmVha0FmdGVyOgotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJyZWFrQmVmb3JlOgotICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok92ZXJmbG93OgotICAgICAgYk5lZWRGaW5kQ29udGFpbmVyID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkFyZWE6Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6RHJhdzoKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpFeGNsR3JvdXA6Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6RmllbGQ6Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6U3ViZm9ybToKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpTdWJmb3JtU2V0OgotICAgICAgcExheW91dFByby0+QWRkQ2hhbmdlZENvbnRhaW5lcih0aGlzKTsKLSAgICAgIHBOb3RpZnktPk9uVmFsdWVDaGFuZ2VkKHRoaXMsIGVBdHRyaWJ1dGUsIHRoaXMsIHRoaXMpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6U2hhcnB0ZXh0OgotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlNoYXJweG1sOgotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlNoYXJweEhUTUw6IHsKLSAgICAgIENYRkFfTm9kZSogcFRleHROb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7Ci0gICAgICBpZiAoIXBUZXh0Tm9kZSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBDWEZBX05vZGUqIHBWYWx1ZU5vZGUgPSBwVGV4dE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOwotICAgICAgaWYgKCFwVmFsdWVOb2RlKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIFhGQV9FbGVtZW50IGVUeXBlID0gcFZhbHVlTm9kZS0+R2V0RWxlbWVudFR5cGUoKTsKLSAgICAgIGlmIChlVHlwZSA9PSBYRkFfRWxlbWVudDo6VmFsdWUpIHsKLSAgICAgICAgYk5lZWRGaW5kQ29udGFpbmVyID0gdHJ1ZTsKLSAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBWYWx1ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOwotICAgICAgICBpZiAocE5vZGUgJiYgcE5vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB7Ci0gICAgICAgICAgaWYgKGJTY3JpcHRNb2RpZnkpIHsKLSAgICAgICAgICAgIHBWYWx1ZU5vZGUgPSBwTm9kZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcE5vdGlmeS0+T25WYWx1ZUNoYW5nZWQodGhpcywgZUF0dHJpYnV0ZSwgcFZhbHVlTm9kZSwgcE5vZGUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBOb3RpZnktPk9uVmFsdWVDaGFuZ2VkKHRoaXMsIGVBdHRyaWJ1dGUsIHBOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChlVHlwZSA9PSBYRkFfRWxlbWVudDo6SXRlbXMpIHsKLSAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gcFZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7Ci0gICAgICAgICAgaWYgKHBOb2RlICYmIHBOb2RlLT5Jc0NvbnRhaW5lck5vZGUoKSkgewotICAgICAgICAgICAgcE5vdGlmeS0+T25WYWx1ZUNoYW5nZWQodGhpcywgZUF0dHJpYnV0ZSwgcFZhbHVlTm9kZSwgcE5vZGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0gIGlmIChiTmVlZEZpbmRDb250YWluZXIpIHsKLSAgICBDWEZBX05vZGUqIHBQYXJlbnQgPSB0aGlzOwotICAgIHdoaWxlIChwUGFyZW50KSB7Ci0gICAgICBpZiAocFBhcmVudC0+SXNDb250YWluZXJOb2RlKCkpCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBwUGFyZW50ID0gcFBhcmVudC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7Ci0gICAgfQotICAgIGlmIChwUGFyZW50KSB7Ci0gICAgICBwTGF5b3V0UHJvLT5BZGRDaGFuZ2VkQ29udGFpbmVyKHBQYXJlbnQpOwotICAgIH0KLSAgfQotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSA9IHBWYWx1ZS0+VG9XaWRlU3RyaW5nKCk7Ci0gICAgU2V0QXR0cmlidXRlKGVBdHRyaWJ1dGUsIHdzVmFsdWUuQXNTdHJpbmdDKCksIHRydWUpOwotICAgIGlmIChlQXR0cmlidXRlID09IFhGQV9BVFRSSUJVVEVfVXNlICYmCi0gICAgICAgIEdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkRlc2MpIHsKLSAgICAgIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSA9Ci0gICAgICAgICAgVG9Ob2RlKG1fcERvY3VtZW50LT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX1RlbXBsYXRlKSk7Ci0gICAgICBDWEZBX05vZGUqIHBQcm90b1Jvb3QgPQotICAgICAgICAgIHBUZW1wbGF0ZU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpTdWJmb3JtKQotICAgICAgICAgICAgICAtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpQcm90byk7Ci0KLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzSUQ7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c1NPTTsKLSAgICAgIGlmICghd3NWYWx1ZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgaWYgKHdzVmFsdWVbMF0gPT0gJyMnKSB7Ci0gICAgICAgICAgd3NJRCA9IENGWF9XaWRlU3RyaW5nKHdzVmFsdWUuY19zdHIoKSArIDEsIHdzVmFsdWUuR2V0TGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB3c1NPTSA9IHdzVmFsdWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIENYRkFfTm9kZSogcFByb3RvTm9kZSA9IG51bGxwdHI7Ci0gICAgICBpZiAoIXdzU09NLklzRW1wdHkoKSkgewotICAgICAgICB1aW50MzJfdCBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfAotICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfQXR0cmlidXRlcyB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzIHwgWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5nczsKLSAgICAgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJlc292ZU5vZGVSUzsKLSAgICAgICAgaW50MzJfdCBpUmV0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+UmVzb2x2ZU9iamVjdHMoCi0gICAgICAgICAgICBwUHJvdG9Sb290LCB3c1NPTS5Bc1N0cmluZ0MoKSwgcmVzb3ZlTm9kZVJTLCBkd0ZsYWcpOwotICAgICAgICBpZiAoaVJldCA+IDAgJiYgcmVzb3ZlTm9kZVJTLm5vZGVzWzBdLT5Jc05vZGUoKSkgewotICAgICAgICAgIHBQcm90b05vZGUgPSByZXNvdmVOb2RlUlMubm9kZXNbMF0tPkFzTm9kZSgpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKCF3c0lELklzRW1wdHkoKSkgewotICAgICAgICBwUHJvdG9Ob2RlID0gbV9wRG9jdW1lbnQtPkdldE5vZGVCeUlEKHBQcm90b1Jvb3QsIHdzSUQuQXNTdHJpbmdDKCkpOwotICAgICAgfQotICAgICAgaWYgKHBQcm90b05vZGUpIHsKLSAgICAgICAgQ1hGQV9Ob2RlKiBwSGVhZENoaWxkID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgICB3aGlsZSAocEhlYWRDaGlsZCkgewotICAgICAgICAgIENYRkFfTm9kZSogcFNpYmxpbmcgPQotICAgICAgICAgICAgICBwSGVhZENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOwotICAgICAgICAgIFJlbW92ZUNoaWxkKHBIZWFkQ2hpbGQpOwotICAgICAgICAgIHBIZWFkQ2hpbGQgPSBwU2libGluZzsKLSAgICAgICAgfQotICAgICAgICBDWEZBX05vZGUqIHBQcm90b0Zvcm0gPSBwUHJvdG9Ob2RlLT5DbG9uZVRlbXBsYXRlVG9Gb3JtKHRydWUpOwotICAgICAgICBwSGVhZENoaWxkID0gcFByb3RvRm9ybS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgICB3aGlsZSAocEhlYWRDaGlsZCkgewotICAgICAgICAgIENYRkFfTm9kZSogcFNpYmxpbmcgPQotICAgICAgICAgICAgICBwSGVhZENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOwotICAgICAgICAgIHBQcm90b0Zvcm0tPlJlbW92ZUNoaWxkKHBIZWFkQ2hpbGQpOwotICAgICAgICAgIEluc2VydENoaWxkKHBIZWFkQ2hpbGQpOwotICAgICAgICAgIHBIZWFkQ2hpbGQgPSBwU2libGluZzsKLSAgICAgICAgfQotICAgICAgICBtX3BEb2N1bWVudC0+UmVtb3ZlUHVyZ2VOb2RlKHBQcm90b0Zvcm0pOwotICAgICAgICBkZWxldGUgcFByb3RvRm9ybTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsKLSAgICBHZXRBdHRyaWJ1dGUoZUF0dHJpYnV0ZSwgd3NWYWx1ZSk7Ci0gICAgcFZhbHVlLT5TZXRTdHJpbmcod3NWYWx1ZS5VVEY4RW5jb2RlKCkuQXNTdHJpbmdDKCkpOwotICB9Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZ1JlYWQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBpZiAoYlNldHRpbmcpIHsKLSAgICBUaHJvd0ludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7Ci0gIEdldEF0dHJpYnV0ZShlQXR0cmlidXRlLCB3c1ZhbHVlKTsKLSAgcFZhbHVlLT5TZXRTdHJpbmcod3NWYWx1ZS5VVEY4RW5jb2RlKCkuQXNTdHJpbmdDKCkpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1dzZGxDb25uZWN0aW9uX0V4ZWN1dGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsKLSAgaWYgKGFyZ2MgIT0gMCAmJiBhcmdjICE9IDEpIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMImV4ZWN1dGUiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+U2V0Qm9vbGVhbihmYWxzZSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRGVsdGFfUmVzdG9yZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGlmIChwQXJndW1lbnRzLT5HZXRMZW5ndGgoKSAhPSAwKQotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwicmVzdG9yZSIpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0RlbHRhX0N1cnJlbnRWYWx1ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHt9Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRGVsdGFfU2F2ZWRWYWx1ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkge30KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9EZWx0YV9UYXJnZXQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7fQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvbV9NZXNzYWdlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfU09NX01FU1NBR0VUWVBFIGlNZXNzYWdlVHlwZSkgewotICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOwotICBpZiAoIXBXaWRnZXREYXRhKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGJvb2wgYk5ldyA9IGZhbHNlOwotICBDWEZBX1ZhbGlkYXRlIHZhbGlkYXRlID0gcFdpZGdldERhdGEtPkdldFZhbGlkYXRlKCk7Ci0gIGlmICghdmFsaWRhdGUpIHsKLSAgICB2YWxpZGF0ZSA9IHBXaWRnZXREYXRhLT5HZXRWYWxpZGF0ZSh0cnVlKTsKLSAgICBiTmV3ID0gdHJ1ZTsKLSAgfQotICBpZiAoYlNldHRpbmcpIHsKLSAgICBzd2l0Y2ggKGlNZXNzYWdlVHlwZSkgewotICAgICAgY2FzZSBYRkFfU09NX1ZhbGlkYXRpb25NZXNzYWdlOgotICAgICAgICB2YWxpZGF0ZS5TZXRTY3JpcHRNZXNzYWdlVGV4dChwVmFsdWUtPlRvV2lkZVN0cmluZygpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9TT01fRm9ybWF0TWVzc2FnZToKLSAgICAgICAgdmFsaWRhdGUuU2V0Rm9ybWF0TWVzc2FnZVRleHQocFZhbHVlLT5Ub1dpZGVTdHJpbmcoKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBYRkFfU09NX01hbmRhdG9yeU1lc3NhZ2U6Ci0gICAgICAgIHZhbGlkYXRlLlNldE51bGxNZXNzYWdlVGV4dChwVmFsdWUtPlRvV2lkZVN0cmluZygpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKCFiTmV3KSB7Ci0gICAgICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldE5vdGlmeSgpOwotICAgICAgaWYgKCFwTm90aWZ5KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHBOb3RpZnktPkFkZENhbGNWYWxpZGF0ZSh0aGlzKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NNZXNzYWdlOwotICAgIHN3aXRjaCAoaU1lc3NhZ2VUeXBlKSB7Ci0gICAgICBjYXNlIFhGQV9TT01fVmFsaWRhdGlvbk1lc3NhZ2U6Ci0gICAgICAgIHZhbGlkYXRlLkdldFNjcmlwdE1lc3NhZ2VUZXh0KHdzTWVzc2FnZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBYRkFfU09NX0Zvcm1hdE1lc3NhZ2U6Ci0gICAgICAgIHZhbGlkYXRlLkdldEZvcm1hdE1lc3NhZ2VUZXh0KHdzTWVzc2FnZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBYRkFfU09NX01hbmRhdG9yeU1lc3NhZ2U6Ci0gICAgICAgIHZhbGlkYXRlLkdldE51bGxNZXNzYWdlVGV4dCh3c01lc3NhZ2UpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBwVmFsdWUtPlNldFN0cmluZyh3c01lc3NhZ2UuVVRGOEVuY29kZSgpLkFzU3RyaW5nQygpKTsKLSAgfQotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvbV9WYWxpZGF0aW9uTWVzc2FnZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgU2NyaXB0X1NvbV9NZXNzYWdlKHBWYWx1ZSwgYlNldHRpbmcsIFhGQV9TT01fVmFsaWRhdGlvbk1lc3NhZ2UpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0xlbmd0aChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOwotICBpZiAoIXBXaWRnZXREYXRhKSB7Ci0gICAgcFZhbHVlLT5TZXRJbnRlZ2VyKDApOwotICAgIHJldHVybjsKLSAgfQotICBwVmFsdWUtPlNldEludGVnZXIocFdpZGdldERhdGEtPkNvdW50Q2hvaWNlTGlzdEl0ZW1zKHRydWUpKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIFhGQV9FbGVtZW50IGVUeXBlID0gR2V0RWxlbWVudFR5cGUoKTsKLSAgaWYgKGVUeXBlID09IFhGQV9FbGVtZW50OjpGaWVsZCkgewotICAgIFNjcmlwdF9GaWVsZF9EZWZhdWx0VmFsdWUocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChlVHlwZSA9PSBYRkFfRWxlbWVudDo6RHJhdykgewotICAgIFNjcmlwdF9EcmF3X0RlZmF1bHRWYWx1ZShwVmFsdWUsIGJTZXR0aW5nLCBlQXR0cmlidXRlKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGVUeXBlID09IFhGQV9FbGVtZW50OjpCb29sZWFuKSB7Ci0gICAgU2NyaXB0X0Jvb2xlYW5fVmFsdWUocFZhbHVlLCBiU2V0dGluZywgZUF0dHJpYnV0ZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChiU2V0dGluZykgewotICAgIENGWF9XaWRlU3RyaW5nIHdzTmV3VmFsdWU7Ci0gICAgaWYgKCEocFZhbHVlICYmIChwVmFsdWUtPklzTnVsbCgpIHx8IHBWYWx1ZS0+SXNVbmRlZmluZWQoKSkpKQotICAgICAgd3NOZXdWYWx1ZSA9IHBWYWx1ZS0+VG9XaWRlU3RyaW5nKCk7Ci0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdFZhbHVlKHdzTmV3VmFsdWUpOwotICAgIENYRkFfV2lkZ2V0RGF0YSogcENvbnRhaW5lcldpZGdldERhdGEgPSBudWxscHRyOwotICAgIGlmIChHZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpIHsKLSAgICAgIENYRkFfTm9kZUFycmF5IGZvcm1Ob2RlczsKLSAgICAgIEdldEJpbmRJdGVtcyhmb3JtTm9kZXMpOwotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQaWN0dXJlOwotICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZm9ybU5vZGVzLkdldFNpemUoKTsgaSsrKSB7Ci0gICAgICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlID0gZm9ybU5vZGVzLkdldEF0KGkpOwotICAgICAgICBpZiAoIXBGb3JtTm9kZSB8fCBwRm9ybU5vZGUtPkhhc1JlbW92ZWRDaGlsZHJlbigpKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgcENvbnRhaW5lcldpZGdldERhdGEgPSBwRm9ybU5vZGUtPkdldENvbnRhaW5lcldpZGdldERhdGEoKTsKLSAgICAgICAgaWYgKHBDb250YWluZXJXaWRnZXREYXRhKSB7Ci0gICAgICAgICAgcENvbnRhaW5lcldpZGdldERhdGEtPkdldFBpY3R1cmVDb250ZW50KHdzUGljdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRV9EYXRhQmluZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCF3c1BpY3R1cmUuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcENvbnRhaW5lcldpZGdldERhdGEgPSBudWxscHRyOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0Zvcm0pIHsKLSAgICAgIHBDb250YWluZXJXaWRnZXREYXRhID0gR2V0Q29udGFpbmVyV2lkZ2V0RGF0YSgpOwotICAgIH0KLSAgICBpZiAocENvbnRhaW5lcldpZGdldERhdGEpIHsKLSAgICAgIHBDb250YWluZXJXaWRnZXREYXRhLT5HZXRGb3JtYXREYXRhVmFsdWUod3NOZXdWYWx1ZSwgd3NGb3JtYXRWYWx1ZSk7Ci0gICAgfQotICAgIFNldFNjcmlwdENvbnRlbnQod3NOZXdWYWx1ZSwgd3NGb3JtYXRWYWx1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgY29udGVudCA9IEdldFNjcmlwdENvbnRlbnQodHJ1ZSk7Ci0gICAgaWYgKGNvbnRlbnQuSXNFbXB0eSgpICYmIGVUeXBlICE9IFhGQV9FbGVtZW50OjpUZXh0ICYmCi0gICAgICAgIGVUeXBlICE9IFhGQV9FbGVtZW50OjpTdWJtaXRVcmwpIHsKLSAgICAgIHBWYWx1ZS0+U2V0TnVsbCgpOwotICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OkludGVnZXIpIHsKLSAgICAgIHBWYWx1ZS0+U2V0SW50ZWdlcihGWFNZU193dG9pKGNvbnRlbnQuY19zdHIoKSkpOwotICAgIH0gZWxzZSBpZiAoZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OkZsb2F0IHx8IGVUeXBlID09IFhGQV9FbGVtZW50OjpEZWNpbWFsKSB7Ci0gICAgICBDRlhfRGVjaW1hbCBkZWNpbWFsKGNvbnRlbnQuQXNTdHJpbmdDKCkpOwotICAgICAgcFZhbHVlLT5TZXRGbG9hdCgoRlhfRkxPQVQpKGRvdWJsZSlkZWNpbWFsKTsKLSAgICB9IGVsc2UgewotICAgICAgcFZhbHVlLT5TZXRTdHJpbmcoY29udGVudC5VVEY4RW5jb2RlKCkuQXNTdHJpbmdDKCkpOwotICAgIH0KLSAgfQotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWVfUmVhZChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDRlhfV2lkZVN0cmluZyBjb250ZW50ID0gR2V0U2NyaXB0Q29udGVudCh0cnVlKTsKLSAgaWYgKGNvbnRlbnQuSXNFbXB0eSgpKSB7Ci0gICAgcFZhbHVlLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBWYWx1ZS0+U2V0U3RyaW5nKGNvbnRlbnQuVVRGOEVuY29kZSgpLkFzU3RyaW5nQygpKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Cb29sZWFuX1ZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIGlmIChiU2V0dGluZykgewotICAgIENGWF9CeXRlU3RyaW5nIG5ld1ZhbHVlOwotICAgIGlmICghKHBWYWx1ZSAmJiAocFZhbHVlLT5Jc051bGwoKSB8fCBwVmFsdWUtPklzVW5kZWZpbmVkKCkpKSkKLSAgICAgIG5ld1ZhbHVlID0gcFZhbHVlLT5Ub1N0cmluZygpOwotCi0gICAgaW50MzJfdCBpVmFsdWUgPSBGWFNZU19hdG9pKG5ld1ZhbHVlLmNfc3RyKCkpOwotICAgIENGWF9XaWRlU3RyaW5nIHdzTmV3VmFsdWUoaVZhbHVlID09IDAgPyBMIjAiIDogTCIxIik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXRWYWx1ZSh3c05ld1ZhbHVlKTsKLSAgICBDWEZBX1dpZGdldERhdGEqIHBDb250YWluZXJXaWRnZXREYXRhID0gR2V0Q29udGFpbmVyV2lkZ2V0RGF0YSgpOwotICAgIGlmIChwQ29udGFpbmVyV2lkZ2V0RGF0YSkgewotICAgICAgcENvbnRhaW5lcldpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c05ld1ZhbHVlLCB3c0Zvcm1hdFZhbHVlKTsKLSAgICB9Ci0gICAgU2V0U2NyaXB0Q29udGVudCh3c05ld1ZhbHVlLCB3c0Zvcm1hdFZhbHVlLCB0cnVlLCB0cnVlKTsKLSAgfSBlbHNlIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0gR2V0U2NyaXB0Q29udGVudCh0cnVlKTsKLSAgICBwVmFsdWUtPlNldEJvb2xlYW4od3NWYWx1ZSA9PSBMIjEiKTsKLSAgfQotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvbV9Cb3JkZXJDb2xvcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsKLSAgaWYgKCFwV2lkZ2V0RGF0YSkgewotICAgIHJldHVybjsKLSAgfQotICBDWEZBX0JvcmRlciBib3JkZXIgPSBwV2lkZ2V0RGF0YS0+R2V0Qm9yZGVyKHRydWUpOwotICBpbnQzMl90IGlTaXplID0gYm9yZGVyLkNvdW50RWRnZXMoKTsKLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgaW50MzJfdCByID0gMDsKLSAgICBpbnQzMl90IGcgPSAwOwotICAgIGludDMyX3QgYiA9IDA7Ci0gICAgU3RyVG9SR0IocFZhbHVlLT5Ub1dpZGVTdHJpbmcoKSwgciwgZywgYik7Ci0gICAgRlhfQVJHQiByZ2IgPSBBcmdiRW5jb2RlKDEwMCwgciwgZywgYik7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7ICsraSkgewotICAgICAgQ1hGQV9FZGdlIGVkZ2UgPSBib3JkZXIuR2V0RWRnZShpKTsKLSAgICAgIGVkZ2UuU2V0Q29sb3IocmdiKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgQ1hGQV9FZGdlIGVkZ2UgPSBib3JkZXIuR2V0RWRnZSgwKTsKLSAgICBGWF9BUkdCIGNvbG9yID0gZWRnZS5HZXRDb2xvcigpOwotICAgIGludDMyX3QgYSwgciwgZywgYjsKLSAgICBBcmdiRGVjb2RlKGNvbG9yLCBhLCByLCBnLCBiKTsKLSAgICBDRlhfV2lkZVN0cmluZyBzdHJDb2xvcjsKLSAgICBzdHJDb2xvci5Gb3JtYXQoTCIlZCwlZCwlZCIsIHIsIGcsIGIpOwotICAgIHBWYWx1ZS0+U2V0U3RyaW5nKHN0ckNvbG9yLlVURjhFbmNvZGUoKS5Bc1N0cmluZ0MoKSk7Ci0gIH0KLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fQm9yZGVyV2lkdGgoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7Ci0gIGlmICghcFdpZGdldERhdGEpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ1hGQV9Cb3JkZXIgYm9yZGVyID0gcFdpZGdldERhdGEtPkdldEJvcmRlcih0cnVlKTsKLSAgaW50MzJfdCBpU2l6ZSA9IGJvcmRlci5Db3VudEVkZ2VzKCk7Ci0gIENGWF9XaWRlU3RyaW5nIHdzVGhpY2tuZXNzOwotICBpZiAoYlNldHRpbmcpIHsKLSAgICB3c1RoaWNrbmVzcyA9IHBWYWx1ZS0+VG9XaWRlU3RyaW5nKCk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7ICsraSkgewotICAgICAgQ1hGQV9FZGdlIGVkZ2UgPSBib3JkZXIuR2V0RWRnZShpKTsKLSAgICAgIENYRkFfTWVhc3VyZW1lbnQgdGhpY2tuZXNzKHdzVGhpY2tuZXNzLkFzU3RyaW5nQygpKTsKLSAgICAgIGVkZ2UuU2V0TVNUaGlja25lc3ModGhpY2tuZXNzKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgQ1hGQV9FZGdlIGVkZ2UgPSBib3JkZXIuR2V0RWRnZSgwKTsKLSAgICBDWEZBX01lYXN1cmVtZW50IHRoaWNrbmVzcyA9IGVkZ2UuR2V0TVNUaGlja25lc3MoKTsKLSAgICB0aGlja25lc3MuVG9TdHJpbmcod3NUaGlja25lc3MpOwotICAgIHBWYWx1ZS0+U2V0U3RyaW5nKHdzVGhpY2tuZXNzLlVURjhFbmNvZGUoKS5Bc1N0cmluZ0MoKSk7Ci0gIH0KLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fRmlsbENvbG9yKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7Ci0gIGlmICghcFdpZGdldERhdGEpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ1hGQV9Cb3JkZXIgYm9yZGVyID0gcFdpZGdldERhdGEtPkdldEJvcmRlcih0cnVlKTsKLSAgQ1hGQV9GaWxsIGJvcmRlcmZpbGwgPSBib3JkZXIuR2V0RmlsbCh0cnVlKTsKLSAgQ1hGQV9Ob2RlKiBwTm9kZSA9IGJvcmRlcmZpbGwuR2V0Tm9kZSgpOwotICBpZiAoIXBOb2RlKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChiU2V0dGluZykgewotICAgIGludDMyX3QgcjsKLSAgICBpbnQzMl90IGc7Ci0gICAgaW50MzJfdCBiOwotICAgIFN0clRvUkdCKHBWYWx1ZS0+VG9XaWRlU3RyaW5nKCksIHIsIGcsIGIpOwotICAgIEZYX0FSR0IgY29sb3IgPSBBcmdiRW5jb2RlKDB4ZmYsIHIsIGcsIGIpOwotICAgIGJvcmRlcmZpbGwuU2V0Q29sb3IoY29sb3IpOwotICB9IGVsc2UgewotICAgIEZYX0FSR0IgY29sb3IgPSBib3JkZXJmaWxsLkdldENvbG9yKCk7Ci0gICAgaW50MzJfdCBhOwotICAgIGludDMyX3QgcjsKLSAgICBpbnQzMl90IGc7Ci0gICAgaW50MzJfdCBiOwotICAgIEFyZ2JEZWNvZGUoY29sb3IsIGEsIHIsIGcsIGIpOwotICAgIENGWF9XaWRlU3RyaW5nIHdzQ29sb3I7Ci0gICAgd3NDb2xvci5Gb3JtYXQoTCIlZCwlZCwlZCIsIHIsIGcsIGIpOwotICAgIHBWYWx1ZS0+U2V0U3RyaW5nKHdzQ29sb3IuVVRGOEVuY29kZSgpLkFzU3RyaW5nQygpKTsKLSAgfQotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvbV9EYXRhTm9kZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IEdldEJpbmREYXRhKCk7Ci0gIGlmICghcERhdGFOb2RlKSB7Ci0gICAgcFZhbHVlLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcFZhbHVlLT5Bc3NpZ24obV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocERhdGFOb2RlKSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRHJhd19EZWZhdWx0VmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBpZiAoYlNldHRpbmcpIHsKLSAgICBpZiAocFZhbHVlICYmIHBWYWx1ZS0+SXNTdHJpbmcoKSkgewotICAgICAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsKLSAgICAgIEFTU0VSVChwV2lkZ2V0RGF0YSk7Ci0gICAgICBYRkFfRWxlbWVudCB1aVR5cGUgPSBwV2lkZ2V0RGF0YS0+R2V0VUlUeXBlKCk7Ci0gICAgICBpZiAodWlUeXBlID09IFhGQV9FbGVtZW50OjpUZXh0KSB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmV3VmFsdWUgPSBwVmFsdWUtPlRvV2lkZVN0cmluZygpOwotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdFZhbHVlKHdzTmV3VmFsdWUpOwotICAgICAgICBTZXRTY3JpcHRDb250ZW50KHdzTmV3VmFsdWUsIHdzRm9ybWF0VmFsdWUsIHRydWUsIHRydWUpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBDRlhfV2lkZVN0cmluZyBjb250ZW50ID0gR2V0U2NyaXB0Q29udGVudCh0cnVlKTsKLSAgICBpZiAoY29udGVudC5Jc0VtcHR5KCkpCi0gICAgICBwVmFsdWUtPlNldE51bGwoKTsKLSAgICBlbHNlCi0gICAgICBwVmFsdWUtPlNldFN0cmluZyhjb250ZW50LlVURjhFbmNvZGUoKS5Bc1N0cmluZ0MoKSk7Ci0gIH0KLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9EZWZhdWx0VmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7Ci0gIGlmICghcFdpZGdldERhdGEpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgaWYgKHBWYWx1ZSAmJiBwVmFsdWUtPklzTnVsbCgpKSB7Ci0gICAgICBwV2lkZ2V0RGF0YS0+bV9iUHJlTnVsbCA9IHBXaWRnZXREYXRhLT5tX2JJc051bGw7Ci0gICAgICBwV2lkZ2V0RGF0YS0+bV9iSXNOdWxsID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgcFdpZGdldERhdGEtPm1fYlByZU51bGwgPSBwV2lkZ2V0RGF0YS0+bV9iSXNOdWxsOwotICAgICAgcFdpZGdldERhdGEtPm1fYklzTnVsbCA9IGZhbHNlOwotICAgIH0KLSAgICBDRlhfV2lkZVN0cmluZyB3c05ld1RleHQ7Ci0gICAgaWYgKCEocFZhbHVlICYmIChwVmFsdWUtPklzTnVsbCgpIHx8IHBWYWx1ZS0+SXNVbmRlZmluZWQoKSkpKQotICAgICAgd3NOZXdUZXh0ID0gcFZhbHVlLT5Ub1dpZGVTdHJpbmcoKTsKLQotICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBwV2lkZ2V0RGF0YS0+R2V0VUlDaGlsZCgpOwotICAgIGlmIChwVUlDaGlsZC0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6TnVtZXJpY0VkaXQpIHsKLSAgICAgIGludDMyX3QgaUxlYWREaWdpdHMgPSAwOwotICAgICAgaW50MzJfdCBpRnJhY0RpZ2l0cyA9IDA7Ci0gICAgICBwV2lkZ2V0RGF0YS0+R2V0TGVhZERpZ2l0cyhpTGVhZERpZ2l0cyk7Ci0gICAgICBwV2lkZ2V0RGF0YS0+R2V0RnJhY0RpZ2l0cyhpRnJhY0RpZ2l0cyk7Ci0gICAgICB3c05ld1RleHQgPQotICAgICAgICAgIHBXaWRnZXREYXRhLT5OdW1lcmljTGltaXQod3NOZXdUZXh0LCBpTGVhZERpZ2l0cywgaUZyYWNEaWdpdHMpOwotICAgIH0KLSAgICBDWEZBX1dpZGdldERhdGEqIHBDb250YWluZXJXaWRnZXREYXRhID0gR2V0Q29udGFpbmVyV2lkZ2V0RGF0YSgpOwotICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0VGV4dCh3c05ld1RleHQpOwotICAgIGlmIChwQ29udGFpbmVyV2lkZ2V0RGF0YSkgewotICAgICAgcENvbnRhaW5lcldpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c05ld1RleHQsIHdzRm9ybWF0VGV4dCk7Ci0gICAgfQotICAgIFNldFNjcmlwdENvbnRlbnQod3NOZXdUZXh0LCB3c0Zvcm1hdFRleHQsIHRydWUsIHRydWUpOwotICB9IGVsc2UgewotICAgIENGWF9XaWRlU3RyaW5nIGNvbnRlbnQgPSBHZXRTY3JpcHRDb250ZW50KHRydWUpOwotICAgIGlmIChjb250ZW50LklzRW1wdHkoKSkgewotICAgICAgcFZhbHVlLT5TZXROdWxsKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBwV2lkZ2V0RGF0YS0+R2V0VUlDaGlsZCgpOwotICAgICAgQ1hGQV9WYWx1ZSBkZWZWYWwgPSBwV2lkZ2V0RGF0YS0+R2V0Rm9ybVZhbHVlKCk7Ci0gICAgICBDWEZBX05vZGUqIHBOb2RlID0gZGVmVmFsLkdldE5vZGUoKS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgaWYgKHBOb2RlICYmIHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpEZWNpbWFsKSB7Ci0gICAgICAgIGlmIChwVUlDaGlsZC0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6TnVtZXJpY0VkaXQgJiYKLSAgICAgICAgICAgIChwTm9kZS0+R2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX0ZyYWNEaWdpdHMpID09IC0xKSkgewotICAgICAgICAgIHBWYWx1ZS0+U2V0U3RyaW5nKGNvbnRlbnQuVVRGOEVuY29kZSgpLkFzU3RyaW5nQygpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBDRlhfRGVjaW1hbCBkZWNpbWFsKGNvbnRlbnQuQXNTdHJpbmdDKCkpOwotICAgICAgICAgIHBWYWx1ZS0+U2V0RmxvYXQoKEZYX0ZMT0FUKShkb3VibGUpZGVjaW1hbCk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAocE5vZGUgJiYgcE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkludGVnZXIpIHsKLSAgICAgICAgcFZhbHVlLT5TZXRJbnRlZ2VyKEZYU1lTX3d0b2koY29udGVudC5jX3N0cigpKSk7Ci0gICAgICB9IGVsc2UgaWYgKHBOb2RlICYmIHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpCb29sZWFuKSB7Ci0gICAgICAgIHBWYWx1ZS0+U2V0Qm9vbGVhbihGWFNZU193dG9pKGNvbnRlbnQuY19zdHIoKSkgPT0gMCA/IGZhbHNlIDogdHJ1ZSk7Ci0gICAgICB9IGVsc2UgaWYgKHBOb2RlICYmIHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpGbG9hdCkgewotICAgICAgICBDRlhfRGVjaW1hbCBkZWNpbWFsKGNvbnRlbnQuQXNTdHJpbmdDKCkpOwotICAgICAgICBwVmFsdWUtPlNldEZsb2F0KChGWF9GTE9BVCkoZG91YmxlKWRlY2ltYWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcFZhbHVlLT5TZXRTdHJpbmcoY29udGVudC5VVEY4RW5jb2RlKCkuQXNTdHJpbmdDKCkpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0VkaXRWYWx1ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsKLSAgaWYgKCFwV2lkZ2V0RGF0YSkgewotICAgIHJldHVybjsKLSAgfQotICBpZiAoYlNldHRpbmcpIHsKLSAgICBwV2lkZ2V0RGF0YS0+U2V0VmFsdWUocFZhbHVlLT5Ub1dpZGVTdHJpbmcoKSwgWEZBX1ZBTFVFUElDVFVSRV9FZGl0KTsKLSAgfSBlbHNlIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOwotICAgIHBXaWRnZXREYXRhLT5HZXRWYWx1ZSh3c1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFX0VkaXQpOwotICAgIHBWYWx1ZS0+U2V0U3RyaW5nKHdzVmFsdWUuVVRGOEVuY29kZSgpLkFzU3RyaW5nQygpKTsKLSAgfQotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvbV9Gb250Q29sb3IoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsKLSAgaWYgKCFwV2lkZ2V0RGF0YSkgewotICAgIHJldHVybjsKLSAgfQotICBDWEZBX0ZvbnQgZm9udCA9IHBXaWRnZXREYXRhLT5HZXRGb250KHRydWUpOwotICBDWEZBX05vZGUqIHBOb2RlID0gZm9udC5HZXROb2RlKCk7Ci0gIGlmICghcE5vZGUpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgaW50MzJfdCByOwotICAgIGludDMyX3QgZzsKLSAgICBpbnQzMl90IGI7Ci0gICAgU3RyVG9SR0IocFZhbHVlLT5Ub1dpZGVTdHJpbmcoKSwgciwgZywgYik7Ci0gICAgRlhfQVJHQiBjb2xvciA9IEFyZ2JFbmNvZGUoMHhmZiwgciwgZywgYik7Ci0gICAgZm9udC5TZXRDb2xvcihjb2xvcik7Ci0gIH0gZWxzZSB7Ci0gICAgRlhfQVJHQiBjb2xvciA9IGZvbnQuR2V0Q29sb3IoKTsKLSAgICBpbnQzMl90IGE7Ci0gICAgaW50MzJfdCByOwotICAgIGludDMyX3QgZzsKLSAgICBpbnQzMl90IGI7Ci0gICAgQXJnYkRlY29kZShjb2xvciwgYSwgciwgZywgYik7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb2xvcjsKLSAgICB3c0NvbG9yLkZvcm1hdChMIiVkLCVkLCVkIiwgciwgZywgYik7Ci0gICAgcFZhbHVlLT5TZXRTdHJpbmcod3NDb2xvci5VVEY4RW5jb2RlKCkuQXNTdHJpbmdDKCkpOwotICB9Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRm9ybWF0TWVzc2FnZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBTY3JpcHRfU29tX01lc3NhZ2UocFZhbHVlLCBiU2V0dGluZywgWEZBX1NPTV9Gb3JtYXRNZXNzYWdlKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9Gb3JtYXR0ZWRWYWx1ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7Ci0gIGlmICghcFdpZGdldERhdGEpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgcFdpZGdldERhdGEtPlNldFZhbHVlKHBWYWx1ZS0+VG9XaWRlU3RyaW5nKCksIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSk7Ci0gIH0gZWxzZSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsKLSAgICBwV2lkZ2V0RGF0YS0+R2V0VmFsdWUod3NWYWx1ZSwgWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KTsKLSAgICBwVmFsdWUtPlNldFN0cmluZyh3c1ZhbHVlLlVURjhFbmNvZGUoKS5Bc1N0cmluZ0MoKSk7Ci0gIH0KLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fTWFuZGF0b3J5KENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7Ci0gIGlmICghcFdpZGdldERhdGEpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ1hGQV9WYWxpZGF0ZSB2YWxpZGF0ZSA9IHBXaWRnZXREYXRhLT5HZXRWYWxpZGF0ZSh0cnVlKTsKLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgdmFsaWRhdGUuU2V0TnVsbFRlc3QocFZhbHVlLT5Ub1dpZGVTdHJpbmcoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgaW50MzJfdCBpVmFsdWUgPSB2YWxpZGF0ZS5HZXROdWxsVGVzdCgpOwotICAgIGNvbnN0IFhGQV9BVFRSSUJVVEVFTlVNSU5GTyogcEluZm8gPQotICAgICAgICBHZXRBdHRyaWJ1dGVFbnVtQnlJRCgoWEZBX0FUVFJJQlVURUVOVU0paVZhbHVlKTsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOwotICAgIGlmIChwSW5mbykKLSAgICAgIHdzVmFsdWUgPSBwSW5mby0+cE5hbWU7Ci0gICAgcFZhbHVlLT5TZXRTdHJpbmcod3NWYWx1ZS5VVEY4RW5jb2RlKCkuQXNTdHJpbmdDKCkpOwotICB9Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX01hbmRhdG9yeU1lc3NhZ2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBTY3JpcHRfU29tX01lc3NhZ2UocFZhbHVlLCBiU2V0dGluZywgWEZBX1NPTV9NYW5kYXRvcnlNZXNzYWdlKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9QYXJlbnRTdWJmb3JtKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIGlmIChiU2V0dGluZykgewotICAgIFRocm93SW52YWxpZFByb3BlcnR5RXhjZXB0aW9uKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBWYWx1ZS0+U2V0TnVsbCgpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX1NlbGVjdGVkSW5kZXgoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsKLSAgaWYgKCFwV2lkZ2V0RGF0YSkgewotICAgIHJldHVybjsKLSAgfQotICBpZiAoYlNldHRpbmcpIHsKLSAgICBpbnQzMl90IGlJbmRleCA9IHBWYWx1ZS0+VG9JbnRlZ2VyKCk7Ci0gICAgaWYgKGlJbmRleCA9PSAtMSkgewotICAgICAgcFdpZGdldERhdGEtPkNsZWFyQWxsU2VsZWN0aW9ucygpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBwV2lkZ2V0RGF0YS0+U2V0SXRlbVN0YXRlKGlJbmRleCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgcFZhbHVlLT5TZXRJbnRlZ2VyKHBXaWRnZXREYXRhLT5HZXRTZWxlY3RlZEl0ZW0oKSk7Ci0gIH0KLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9DbGVhckl0ZW1zKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsKLSAgaWYgKCFwV2lkZ2V0RGF0YSkgewotICAgIHJldHVybjsKLSAgfQotICBwV2lkZ2V0RGF0YS0+RGVsZXRlSXRlbSgtMSwgdHJ1ZSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRXhlY0V2ZW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaWYgKHBBcmd1bWVudHMtPkdldExlbmd0aCgpICE9IDEpIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMImV4ZWNFdmVudCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIGV2ZW50U3RyaW5nID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsKLSAgaW50MzJfdCBpUmV0ID0gZXhlY1NpbmdsZUV2ZW50QnlOYW1lKAotICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGV2ZW50U3RyaW5nLkFzU3RyaW5nQygpKS5Bc1N0cmluZ0MoKSwKLSAgICAgIFhGQV9FbGVtZW50OjpGaWVsZCk7Ci0gIGlmIChldmVudFN0cmluZyAhPSAidmFsaWRhdGUiKQotICAgIHJldHVybjsKLQotICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRCb29sZWFuKAotICAgICAgKGlSZXQgPT0gWEZBX0VWRU5URVJST1JfRXJyb3IpID8gZmFsc2UgOiB0cnVlKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9FeGVjSW5pdGlhbGl6ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGlmIChwQXJndW1lbnRzLT5HZXRMZW5ndGgoKSAhPSAwKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJleGVjSW5pdGlhbGl6ZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCk7Ci0gIGlmICghcE5vdGlmeSkKLSAgICByZXR1cm47Ci0KLSAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX0luaXRpYWxpemUsIGZhbHNlLCBmYWxzZSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRGVsZXRlSXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOwotICBpZiAoaUxlbmd0aCAhPSAxKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJkZWxldGVJdGVtIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7Ci0gIGlmICghcFdpZGdldERhdGEpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50MzJfdCBpSW5kZXggPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKTsKLSAgYm9vbCBiVmFsdWUgPSBwV2lkZ2V0RGF0YS0+RGVsZXRlSXRlbShpSW5kZXgsIHRydWUsIHRydWUpOwotICBDRlhKU0VfVmFsdWUqIHBWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCk7Ci0gIGlmIChwVmFsdWUpCi0gICAgcFZhbHVlLT5TZXRCb29sZWFuKGJWYWx1ZSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfR2V0U2F2ZUl0ZW0oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsKLSAgaWYgKGlMZW5ndGggIT0gMSkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiZ2V0U2F2ZUl0ZW0iKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaW50MzJfdCBpSW5kZXggPSBwQXJndW1lbnRzLT5HZXRJbnQzMigwKTsKLSAgaWYgKGlJbmRleCA8IDApIHsKLSAgICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7Ci0gIGlmICghcFdpZGdldERhdGEpIHsKLSAgICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENGWF9XaWRlU3RyaW5nIHdzVmFsdWU7Ci0gIGlmICghcFdpZGdldERhdGEtPkdldENob2ljZUxpc3RJdGVtKHdzVmFsdWUsIGlJbmRleCwgdHJ1ZSkpIHsKLSAgICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCktPlNldFN0cmluZyh3c1ZhbHVlLlVURjhFbmNvZGUoKS5Bc1N0cmluZ0MoKSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfQm91bmRJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7Ci0gIGlmIChpTGVuZ3RoICE9IDEpIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMImJvdW5kSXRlbSIpOwotICAgIHJldHVybjsKLSAgfQotICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOwotICBpZiAoIXBXaWRnZXREYXRhKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENGWF9CeXRlU3RyaW5nIGJzVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOwotICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUuQXNTdHJpbmdDKCkpOwotICBDRlhfV2lkZVN0cmluZyB3c0JvdW5kVmFsdWU7Ci0gIHBXaWRnZXREYXRhLT5HZXRJdGVtVmFsdWUod3NWYWx1ZS5Bc1N0cmluZ0MoKSwgd3NCb3VuZFZhbHVlKTsKLSAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOwotICBpZiAocFZhbHVlKQotICAgIHBWYWx1ZS0+U2V0U3RyaW5nKHdzQm91bmRWYWx1ZS5VVEY4RW5jb2RlKCkuQXNTdHJpbmdDKCkpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0dldEl0ZW1TdGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOwotICBpZiAoaUxlbmd0aCAhPSAxKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJnZXRJdGVtU3RhdGUiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsKLSAgaWYgKCFwV2lkZ2V0RGF0YSkgewotICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IGlJbmRleCA9IHBBcmd1bWVudHMtPkdldEludDMyKDApOwotICBib29sIGJWYWx1ZSA9IHBXaWRnZXREYXRhLT5HZXRJdGVtU3RhdGUoaUluZGV4KTsKLSAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpOwotICBpZiAocFZhbHVlKQotICAgIHBWYWx1ZS0+U2V0Qm9vbGVhbihiVmFsdWUpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0V4ZWNDYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAocEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCkgIT0gMCkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiZXhlY0NhbGN1bGF0ZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCk7Ci0gIGlmICghcE5vdGlmeSkKLSAgICByZXR1cm47Ci0KLSAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX0NhbGN1bGF0ZSwgZmFsc2UsIGZhbHNlKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9TZXRJdGVtcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7fQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0dldERpc3BsYXlJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaW50MzJfdCBpTGVuZ3RoID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7Ci0gIGlmIChpTGVuZ3RoICE9IDEpIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMImdldERpc3BsYXlJdGVtIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGludDMyX3QgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7Ci0gIGlmIChpSW5kZXggPCAwKSB7Ci0gICAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOwotICBpZiAoIXBXaWRnZXREYXRhKSB7Ci0gICAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOwotICBpZiAoIXBXaWRnZXREYXRhLT5HZXRDaG9pY2VMaXN0SXRlbSh3c1ZhbHVlLCBpSW5kZXgsIGZhbHNlKSkgewotICAgIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKHdzVmFsdWUuVVRGOEVuY29kZSgpLkFzU3RyaW5nQygpKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9TZXRJdGVtU3RhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpbnQzMl90IGlMZW5ndGggPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsKLSAgaWYgKGlMZW5ndGggIT0gMikgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwic2V0SXRlbVN0YXRlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7Ci0gIGlmICghcFdpZGdldERhdGEpCi0gICAgcmV0dXJuOwotCi0gIGludDMyX3QgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7Ci0gIGlmIChwQXJndW1lbnRzLT5HZXRJbnQzMigxKSAhPSAwKSB7Ci0gICAgcFdpZGdldERhdGEtPlNldEl0ZW1TdGF0ZShpSW5kZXgsIHRydWUsIHRydWUsIHRydWUsIHRydWUpOwotICB9IGVsc2UgewotICAgIGlmIChwV2lkZ2V0RGF0YS0+R2V0SXRlbVN0YXRlKGlJbmRleCkpCi0gICAgICBwV2lkZ2V0RGF0YS0+U2V0SXRlbVN0YXRlKGlJbmRleCwgZmFsc2UsIHRydWUsIHRydWUsIHRydWUpOwotICB9Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfQWRkSXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGludDMyX3QgaUxlbmd0aCA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOwotICBpZiAoaUxlbmd0aCA8IDEgfHwgaUxlbmd0aCA+IDIpIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMImFkZEl0ZW0iKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ1hGQV9XaWRnZXREYXRhKiBwV2lkZ2V0RGF0YSA9IEdldFdpZGdldERhdGEoKTsKLSAgaWYgKCFwV2lkZ2V0RGF0YSkgewotICAgIHJldHVybjsKLSAgfQotICBDRlhfV2lkZVN0cmluZyB3c0xhYmVsOwotICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOwotICBpZiAoaUxlbmd0aCA+PSAxKSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNMYWJlbCA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7Ci0gICAgd3NMYWJlbCA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic0xhYmVsLkFzU3RyaW5nQygpKTsKLSAgfQotICBpZiAoaUxlbmd0aCA+PSAyKSB7Ci0gICAgQ0ZYX0J5dGVTdHJpbmcgYnNWYWx1ZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMSk7Ci0gICAgd3NWYWx1ZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1ZhbHVlLkFzU3RyaW5nQygpKTsKLSAgfQotICBwV2lkZ2V0RGF0YS0+SW5zZXJ0SXRlbSh3c0xhYmVsLCB3c1ZhbHVlLCAtMSwgdHJ1ZSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRXhlY1ZhbGlkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaWYgKHBBcmd1bWVudHMtPkdldExlbmd0aCgpICE9IDApIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMImV4ZWNWYWxpZGF0ZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCk7Ci0gIGlmICghcE5vdGlmeSkgewotICAgIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCktPlNldEJvb2xlYW4oZmFsc2UpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGludDMyX3QgaVJldCA9Ci0gICAgICBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBYRkFfRVZFTlRfVmFsaWRhdGUsIGZhbHNlLCBmYWxzZSk7Ci0gIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCktPlNldEJvb2xlYW4oCi0gICAgICAoaVJldCA9PSBYRkFfRVZFTlRFUlJPUl9FcnJvcikgPyBmYWxzZSA6IHRydWUpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9FcnJvclRleHQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgaWYgKGJTZXR0aW5nKQotICAgIFRocm93SW52YWxpZFByb3BlcnR5RXhjZXB0aW9uKCk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0RlZmF1bHRBbmRSYXdWYWx1ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOwotICBpZiAoIXBXaWRnZXREYXRhKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChiU2V0dGluZykgewotICAgIHBXaWRnZXREYXRhLT5TZXRTZWxlY3RlZE1lbWJlckJ5VmFsdWUocFZhbHVlLT5Ub1dpZGVTdHJpbmcoKS5Bc1N0cmluZ0MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIHRydWUsIHRydWUpOwotICB9IGVsc2UgewotICAgIENGWF9XaWRlU3RyaW5nIHdzVmFsdWUgPSBHZXRTY3JpcHRDb250ZW50KHRydWUpOwotICAgIFhGQV9WRVJTSU9OIGN1clZlcnNpb24gPSBHZXREb2N1bWVudCgpLT5HZXRDdXJWZXJzaW9uTW9kZSgpOwotICAgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSAmJiBjdXJWZXJzaW9uID49IFhGQV9WRVJTSU9OXzMwMCkgewotICAgICAgcFZhbHVlLT5TZXROdWxsKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBWYWx1ZS0+U2V0U3RyaW5nKHdzVmFsdWUuVVRGOEVuY29kZSgpLkFzU3RyaW5nQygpKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfVHJhbnNpZW50KENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7fQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9FeGVjRXZlbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAocEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCkgIT0gMSkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiZXhlY0V2ZW50Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgZXZlbnRTdHJpbmcgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOwotICBleGVjU2luZ2xlRXZlbnRCeU5hbWUoCi0gICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoZXZlbnRTdHJpbmcuQXNTdHJpbmdDKCkpLkFzU3RyaW5nQygpLAotICAgICAgWEZBX0VsZW1lbnQ6OkV4Y2xHcm91cCk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX1NlbGVjdGVkTWVtYmVyKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7Ci0gIGlmIChhcmdjIDwgMCB8fCBhcmdjID4gMSkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwic2VsZWN0ZWRNZW1iZXIiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOwotICBpZiAoIXBXaWRnZXREYXRhKSB7Ci0gICAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+U2V0TnVsbCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENYRkFfTm9kZSogcFJldHVybk5vZGUgPSBudWxscHRyOwotICBpZiAoYXJnYyA9PSAwKSB7Ci0gICAgcFJldHVybk5vZGUgPSBwV2lkZ2V0RGF0YS0+R2V0U2VsZWN0ZWRNZW1iZXIoKTsKLSAgfSBlbHNlIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBzek5hbWU7Ci0gICAgc3pOYW1lID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsKLSAgICBwUmV0dXJuTm9kZSA9IHBXaWRnZXREYXRhLT5TZXRTZWxlY3RlZE1lbWJlcigKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6TmFtZS5Bc1N0cmluZ0MoKSkuQXNTdHJpbmdDKCksIHRydWUpOwotICB9Ci0gIGlmICghcFJldHVybk5vZGUpIHsKLSAgICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCktPkFzc2lnbigKLSAgICAgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBSZXR1cm5Ob2RlKSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0V4ZWNJbml0aWFsaXplKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaWYgKHBBcmd1bWVudHMtPkdldExlbmd0aCgpICE9IDApIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMImV4ZWNJbml0aWFsaXplIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXROb3RpZnkoKTsKLSAgaWYgKCFwTm90aWZ5KQotICAgIHJldHVybjsKLQotICBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBYRkFfRVZFTlRfSW5pdGlhbGl6ZSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0V4ZWNDYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAocEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCkgIT0gMCkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiZXhlY0NhbGN1bGF0ZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCk7Ci0gIGlmICghcE5vdGlmeSkKLSAgICByZXR1cm47Ci0KLSAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX0NhbGN1bGF0ZSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0V4ZWNWYWxpZGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGlmIChwQXJndW1lbnRzLT5HZXRMZW5ndGgoKSAhPSAwKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJleGVjVmFsaWRhdGUiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldE5vdGlmeSgpOwotICBpZiAoIXBOb3RpZnkpIHsKLSAgICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRCb29sZWFuKGZhbHNlKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbnQzMl90IGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBYRkFfRVZFTlRfVmFsaWRhdGUpOwotICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRCb29sZWFuKAotICAgICAgKGlSZXQgPT0gWEZBX0VWRU5URVJST1JfRXJyb3IpID8gZmFsc2UgOiB0cnVlKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb21fSW5zdGFuY2VJbmRleChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIGlmIChiU2V0dGluZykgewotICAgIGludDMyX3QgaVRvID0gcFZhbHVlLT5Ub0ludGVnZXIoKTsKLSAgICBpbnQzMl90IGlGcm9tID0gU3ViZm9ybV9hbmRfU3ViZm9ybVNldF9JbnN0YW5jZUluZGV4KCk7Ci0gICAgQ1hGQV9Ob2RlKiBwTWFuYWdlck5vZGUgPSBudWxscHRyOwotICAgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QcmV2U2libGluZyk7IHBOb2RlOwotICAgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nKSkgewotICAgICAgaWYgKHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpJbnN0YW5jZU1hbmFnZXIpIHsKLSAgICAgICAgcE1hbmFnZXJOb2RlID0gcE5vZGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBpZiAocE1hbmFnZXJOb2RlKSB7Ci0gICAgICBwTWFuYWdlck5vZGUtPkluc3RhbmNlTWFuYWdlcl9Nb3ZlSW5zdGFuY2UoaVRvLCBpRnJvbSk7Ci0gICAgICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldE5vdGlmeSgpOwotICAgICAgaWYgKCFwTm90aWZ5KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIENYRkFfTm9kZSogcFRvSW5zdGFuY2UgPSBHZXRJdGVtKHBNYW5hZ2VyTm9kZSwgaVRvKTsKLSAgICAgIGlmIChwVG9JbnN0YW5jZSAmJgotICAgICAgICAgIHBUb0luc3RhbmNlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpTdWJmb3JtKSB7Ci0gICAgICAgIHBOb3RpZnktPlJ1blN1YmZvcm1JbmRleENoYW5nZShwVG9JbnN0YW5jZSk7Ci0gICAgICB9Ci0gICAgICBDWEZBX05vZGUqIHBGcm9tSW5zdGFuY2UgPSBHZXRJdGVtKHBNYW5hZ2VyTm9kZSwgaUZyb20pOwotICAgICAgaWYgKHBGcm9tSW5zdGFuY2UgJiYKLSAgICAgICAgICBwRnJvbUluc3RhbmNlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpTdWJmb3JtKSB7Ci0gICAgICAgIHBOb3RpZnktPlJ1blN1YmZvcm1JbmRleENoYW5nZShwRnJvbUluc3RhbmNlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcFZhbHVlLT5TZXRJbnRlZ2VyKFN1YmZvcm1fYW5kX1N1YmZvcm1TZXRfSW5zdGFuY2VJbmRleCgpKTsKLSAgfQotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fSW5zdGFuY2VNYW5hZ2VyKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDRlhfV2lkZVN0cmluZ0Mgd3NOYW1lID0gR2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsKLSAgQ1hGQV9Ob2RlKiBwSW5zdGFuY2VNZ3IgPSBudWxscHRyOwotICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBHZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUHJldlNpYmxpbmcpOyBwTm9kZTsKLSAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUHJldlNpYmxpbmcpKSB7Ci0gICAgaWYgKHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpJbnN0YW5jZU1hbmFnZXIpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0luc3RNZ3JOYW1lID0gcE5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSk7Ci0gICAgICBpZiAod3NJbnN0TWdyTmFtZS5HZXRMZW5ndGgoKSA+PSAxICYmIHdzSW5zdE1nck5hbWUuR2V0QXQoMCkgPT0gJ18nICYmCi0gICAgICAgICAgd3NJbnN0TWdyTmFtZS5NaWQoMSkgPT0gd3NOYW1lKSB7Ci0gICAgICAgIHBJbnN0YW5jZU1nciA9IHBOb2RlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmICghcEluc3RhbmNlTWdyKSB7Ci0gICAgcFZhbHVlLT5TZXROdWxsKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcFZhbHVlLT5Bc3NpZ24oCi0gICAgICBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwSW5zdGFuY2VNZ3IpKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0xvY2FsZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIGlmIChiU2V0dGluZykgewotICAgIFNldENEYXRhKFhGQV9BVFRSSUJVVEVfTG9jYWxlLCBwVmFsdWUtPlRvV2lkZVN0cmluZygpLCB0cnVlLCB0cnVlKTsKLSAgfSBlbHNlIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c0xvY2FsZU5hbWU7Ci0gICAgR2V0TG9jYWxlTmFtZSh3c0xvY2FsZU5hbWUpOwotICAgIHBWYWx1ZS0+U2V0U3RyaW5nKHdzTG9jYWxlTmFtZS5VVEY4RW5jb2RlKCkuQXNTdHJpbmdDKCkpOwotICB9Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9FeGVjRXZlbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAocEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCkgIT0gMSkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiZXhlY0V2ZW50Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ0ZYX0J5dGVTdHJpbmcgZXZlbnRTdHJpbmcgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOwotICBleGVjU2luZ2xlRXZlbnRCeU5hbWUoCi0gICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoZXZlbnRTdHJpbmcuQXNTdHJpbmdDKCkpLkFzU3RyaW5nQygpLAotICAgICAgWEZBX0VsZW1lbnQ6OlN1YmZvcm0pOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fRXhlY0luaXRpYWxpemUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAocEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCkgIT0gMCkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiZXhlY0luaXRpYWxpemUiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldE5vdGlmeSgpOwotICBpZiAoIXBOb3RpZnkpCi0gICAgcmV0dXJuOwotCi0gIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9Jbml0aWFsaXplKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0V4ZWNDYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAocEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCkgIT0gMCkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiZXhlY0NhbGN1bGF0ZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCk7Ci0gIGlmICghcE5vdGlmeSkKLSAgICByZXR1cm47Ci0KLSAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX0NhbGN1bGF0ZSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9FeGVjVmFsaWRhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAocEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCkgIT0gMCkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiZXhlY1ZhbGlkYXRlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXROb3RpZnkoKTsKLSAgaWYgKCFwTm90aWZ5KSB7Ci0gICAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+U2V0Qm9vbGVhbihmYWxzZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW50MzJfdCBpUmV0ID0gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX1ZhbGlkYXRlKTsKLSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+U2V0Qm9vbGVhbigKLSAgICAgIChpUmV0ID09IFhGQV9FVkVOVEVSUk9SX0Vycm9yKSA/IGZhbHNlIDogdHJ1ZSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9HZXRJbnZhbGlkT2JqZWN0cyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGlmIChwQXJndW1lbnRzLT5HZXRMZW5ndGgoKSAhPSAwKQotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiZ2V0SW52YWxpZE9iamVjdHMiKTsKLX0KLQotaW50MzJfdCBDWEZBX05vZGU6OlN1YmZvcm1fYW5kX1N1YmZvcm1TZXRfSW5zdGFuY2VJbmRleCgpIHsKLSAgaW50MzJfdCBpbmRleCA9IDA7Ci0gIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QcmV2U2libGluZyk7IHBOb2RlOwotICAgICAgIHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QcmV2U2libGluZykpIHsKLSAgICBpZiAoKHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpTdWJmb3JtKSB8fAotICAgICAgICAocE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm1TZXQpKSB7Ci0gICAgICBpbmRleCsrOwotICAgIH0gZWxzZSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGluZGV4OwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0Zvcm1Ob2RlcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGlmIChwQXJndW1lbnRzLT5HZXRMZW5ndGgoKSAhPSAxKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJmb3JtTm9kZXMiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+U2V0Qm9vbGVhbih0cnVlKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9SZW1lcmdlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaWYgKHBBcmd1bWVudHMtPkdldExlbmd0aCgpICE9IDApIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMInJlbWVyZ2UiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgbV9wRG9jdW1lbnQtPkRvRGF0YVJlbWVyZ2UodHJ1ZSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVGVtcGxhdGVfRXhlY0luaXRpYWxpemUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAocEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCkgIT0gMCkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiZXhlY0luaXRpYWxpemUiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOwotICBpZiAoIXBXaWRnZXREYXRhKSB7Ci0gICAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+U2V0Qm9vbGVhbihmYWxzZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCktPlNldEJvb2xlYW4odHJ1ZSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfVGVtcGxhdGVfQ3JlYXRlTm9kZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOwotICBpZiAoYXJnYyA8PSAwIHx8IGFyZ2MgPj0gNCkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiY3JlYXRlTm9kZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENGWF9XaWRlU3RyaW5nIHN0ck5hbWU7Ci0gIENGWF9XaWRlU3RyaW5nIHN0ck5hbWVTcGFjZTsKLSAgQ0ZYX0J5dGVTdHJpbmcgYnNUYWdOYW1lID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgc3RyVGFnTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChic1RhZ05hbWUuQXNTdHJpbmdDKCkpOwotICBpZiAoYXJnYyA+IDEpIHsKLSAgICBDRlhfQnl0ZVN0cmluZyBic05hbWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDEpOwotICAgIHN0ck5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNOYW1lLkFzU3RyaW5nQygpKTsKLSAgICBpZiAoYXJnYyA9PSAzKSB7Ci0gICAgICBDRlhfQnl0ZVN0cmluZyBic05hbWVTcGFjZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMik7Ci0gICAgICBzdHJOYW1lU3BhY2UgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNOYW1lU3BhY2UuQXNTdHJpbmdDKCkpOwotICAgIH0KLSAgfQotCi0gIFhGQV9FbGVtZW50IGVUeXBlID0gWEZBX0dldEVsZW1lbnRUeXBlRm9yTmFtZShzdHJUYWdOYW1lLkFzU3RyaW5nQygpKTsKLSAgQ1hGQV9Ob2RlKiBwTmV3Tm9kZSA9IENyZWF0ZVNhbWVQYWNrZXROb2RlKGVUeXBlKTsKLSAgaWYgKCFwTmV3Tm9kZSkgewotICAgIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoc3RyTmFtZS5Jc0VtcHR5KCkpIHsKLSAgICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLT5Bc3NpZ24oCi0gICAgICAgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkdldEpTVmFsdWVGcm9tTWFwKHBOZXdOb2RlKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKCFHZXRBdHRyaWJ1dGVPZkVsZW1lbnQoZVR5cGUsIFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9VTktOT1dOKSkgewotICAgIFRocm93TWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uKHN0clRhZ05hbWUsIEwibmFtZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHBOZXdOb2RlLT5TZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9OYW1lLCBzdHJOYW1lLkFzU3RyaW5nQygpLCB0cnVlKTsKLSAgaWYgKHBOZXdOb2RlLT5HZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpCi0gICAgcE5ld05vZGUtPkNyZWF0ZVhNTE1hcHBpbmdOb2RlKCk7Ci0KLSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+QXNzaWduKAotICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocE5ld05vZGUpKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9SZWNhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGlmIChwQXJndW1lbnRzLT5HZXRMZW5ndGgoKSAhPSAxKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJyZWNhbGN1bGF0ZSIpOwotICAgIHJldHVybjsKLSAgfQotICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRCb29sZWFuKHRydWUpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0V4ZWNDYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAocEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCkgIT0gMCkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiZXhlY0NhbGN1bGF0ZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7Ci0gIGlmICghcFdpZGdldERhdGEpIHsKLSAgICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRCb29sZWFuKGZhbHNlKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+U2V0Qm9vbGVhbih0cnVlKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9FeGVjVmFsaWRhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAocEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCkgIT0gMCkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiZXhlY1ZhbGlkYXRlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7Ci0gIGlmICghcFdpZGdldERhdGEpIHsKLSAgICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRCb29sZWFuKGZhbHNlKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+U2V0Qm9vbGVhbih0cnVlKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9NYW5pZmVzdF9FdmFsdWF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGlmIChwQXJndW1lbnRzLT5HZXRMZW5ndGgoKSAhPSAwKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJldmFsdWF0ZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7Ci0gIGlmICghcFdpZGdldERhdGEpIHsKLSAgICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRCb29sZWFuKGZhbHNlKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+U2V0Qm9vbGVhbih0cnVlKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfTWF4KENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIGlmIChiU2V0dGluZykgewotICAgIFRocm93SW52YWxpZFByb3BlcnR5RXhjZXB0aW9uKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfT2NjdXIgbm9kZU9jY3VyKEdldE9jY3VyTm9kZSgpKTsKLSAgcFZhbHVlLT5TZXRJbnRlZ2VyKG5vZGVPY2N1ci5HZXRNYXgoKSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX01pbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBpZiAoYlNldHRpbmcpIHsKLSAgICBUaHJvd0ludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotICBDWEZBX09jY3VyIG5vZGVPY2N1cihHZXRPY2N1ck5vZGUoKSk7Ci0gIHBWYWx1ZS0+U2V0SW50ZWdlcihub2RlT2NjdXIuR2V0TWluKCkpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9Db3VudChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgaW50MzJfdCBpRGVzaXJlZCA9IHBWYWx1ZS0+VG9JbnRlZ2VyKCk7Ci0gICAgSW5zdGFuY2VNYW5hZ2VyX1NldEluc3RhbmNlcyhpRGVzaXJlZCk7Ci0gIH0gZWxzZSB7Ci0gICAgcFZhbHVlLT5TZXRJbnRlZ2VyKEdldENvdW50KHRoaXMpKTsKLSAgfQotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9Nb3ZlSW5zdGFuY2UoCi0gICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAocEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCkgIT0gMikgewotICAgIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCktPlNldFVuZGVmaW5lZCgpOwotICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IGlGcm9tID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7Ci0gIGludDMyX3QgaVRvID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMSk7Ci0gIEluc3RhbmNlTWFuYWdlcl9Nb3ZlSW5zdGFuY2UoaVRvLCBpRnJvbSk7Ci0gIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCk7Ci0gIGlmICghcE5vdGlmeSkgewotICAgIHJldHVybjsKLSAgfQotICBDWEZBX05vZGUqIHBUb0luc3RhbmNlID0gR2V0SXRlbSh0aGlzLCBpVG8pOwotICBpZiAocFRvSW5zdGFuY2UgJiYgcFRvSW5zdGFuY2UtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm0pIHsKLSAgICBwTm90aWZ5LT5SdW5TdWJmb3JtSW5kZXhDaGFuZ2UocFRvSW5zdGFuY2UpOwotICB9Ci0gIENYRkFfTm9kZSogcEZyb21JbnN0YW5jZSA9IEdldEl0ZW0odGhpcywgaUZyb20pOwotICBpZiAocEZyb21JbnN0YW5jZSAmJgotICAgICAgcEZyb21JbnN0YW5jZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6U3ViZm9ybSkgewotICAgIHBOb3RpZnktPlJ1blN1YmZvcm1JbmRleENoYW5nZShwRnJvbUluc3RhbmNlKTsKLSAgfQotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9SZW1vdmVJbnN0YW5jZSgKLSAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGlmIChwQXJndW1lbnRzLT5HZXRMZW5ndGgoKSAhPSAxKSB7Ci0gICAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+U2V0VW5kZWZpbmVkKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGludDMyX3QgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7Ci0gIGludDMyX3QgaUNvdW50ID0gR2V0Q291bnQodGhpcyk7Ci0gIGlmIChpSW5kZXggPCAwIHx8IGlJbmRleCA+PSBpQ291bnQpIHsKLSAgICBUaHJvd0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ1hGQV9PY2N1ciBub2RlT2NjdXIoR2V0T2NjdXJOb2RlKCkpOwotICBpbnQzMl90IGlNaW4gPSBub2RlT2NjdXIuR2V0TWluKCk7Ci0gIGlmIChpQ291bnQgLSAxIDwgaU1pbikgewotICAgIFRocm93VG9vTWFueU9jY3VyYW5jZXNFeGNlcHRpb24oTCJtaW4iKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ1hGQV9Ob2RlKiBwUmVtb3ZlSW5zdGFuY2UgPSBHZXRJdGVtKHRoaXMsIGlJbmRleCk7Ci0gIFJlbW92ZUl0ZW0odGhpcywgcFJlbW92ZUluc3RhbmNlKTsKLSAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXROb3RpZnkoKTsKLSAgaWYgKHBOb3RpZnkpIHsKLSAgICBmb3IgKGludDMyX3QgaSA9IGlJbmRleDsgaSA8IGlDb3VudCAtIDE7IGkrKykgewotICAgICAgQ1hGQV9Ob2RlKiBwU3ViZm9ybUluc3RhbmNlID0gR2V0SXRlbSh0aGlzLCBpKTsKLSAgICAgIGlmIChwU3ViZm9ybUluc3RhbmNlICYmCi0gICAgICAgICAgcFN1YmZvcm1JbnN0YW5jZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6U3ViZm9ybSkgewotICAgICAgICBwTm90aWZ5LT5SdW5TdWJmb3JtSW5kZXhDaGFuZ2UocFN1YmZvcm1JbnN0YW5jZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvID0gbV9wRG9jdW1lbnQtPkdldExheW91dFByb2Nlc3NvcigpOwotICBpZiAoIXBMYXlvdXRQcm8pIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgcExheW91dFByby0+QWRkQ2hhbmdlZENvbnRhaW5lcigKLSAgICAgIFRvTm9kZShtX3BEb2N1bWVudC0+R2V0WEZBT2JqZWN0KFhGQV9IQVNIQ09ERV9Gb3JtKSkpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9TZXRJbnN0YW5jZXMoCi0gICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAocEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCkgIT0gMSkgewotICAgIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCktPlNldFVuZGVmaW5lZCgpOwotICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IGlEZXNpcmVkID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7Ci0gIEluc3RhbmNlTWFuYWdlcl9TZXRJbnN0YW5jZXMoaURlc2lyZWQpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9BZGRJbnN0YW5jZSgKLSAgICBDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOwotICBpZiAoYXJnYyAhPSAwICYmIGFyZ2MgIT0gMSkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiYWRkSW5zdGFuY2UiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgYm9vbCBmRmxhZ3MgPSB0cnVlOwotICBpZiAoYXJnYyA9PSAxKSB7Ci0gICAgZkZsYWdzID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCkgPT0gMCA/IGZhbHNlIDogdHJ1ZTsKLSAgfQotICBpbnQzMl90IGlDb3VudCA9IEdldENvdW50KHRoaXMpOwotICBDWEZBX09jY3VyIG5vZGVPY2N1cihHZXRPY2N1ck5vZGUoKSk7Ci0gIGludDMyX3QgaU1heCA9IG5vZGVPY2N1ci5HZXRNYXgoKTsKLSAgaWYgKGlNYXggPj0gMCAmJiBpQ291bnQgPj0gaU1heCkgewotICAgIFRocm93VG9vTWFueU9jY3VyYW5jZXNFeGNlcHRpb24oTCJtYXgiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ1hGQV9Ob2RlKiBwTmV3SW5zdGFuY2UgPSBDcmVhdGVJbnN0YW5jZSh0aGlzLCBmRmxhZ3MpOwotICBJbnNlcnRJdGVtKHRoaXMsIHBOZXdJbnN0YW5jZSwgaUNvdW50LCBpQ291bnQsIGZhbHNlKTsKLSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+QXNzaWduKAotICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocE5ld0luc3RhbmNlKSk7Ci0gIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCk7Ci0gIGlmICghcE5vdGlmeSkgewotICAgIHJldHVybjsKLSAgfQotICBwTm90aWZ5LT5SdW5Ob2RlSW5pdGlhbGl6ZShwTmV3SW5zdGFuY2UpOwotICBDWEZBX0xheW91dFByb2Nlc3NvciogcExheW91dFBybyA9IG1fcERvY3VtZW50LT5HZXRMYXlvdXRQcm9jZXNzb3IoKTsKLSAgaWYgKCFwTGF5b3V0UHJvKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBMYXlvdXRQcm8tPkFkZENoYW5nZWRDb250YWluZXIoCi0gICAgICBUb05vZGUobV9wRG9jdW1lbnQtPkdldFhGQU9iamVjdChYRkFfSEFTSENPREVfRm9ybSkpKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfSW5zZXJ0SW5zdGFuY2UoCi0gICAgQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsKLSAgaWYgKGFyZ2MgIT0gMSAmJiBhcmdjICE9IDIpIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMImluc2VydEluc3RhbmNlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGludDMyX3QgaUluZGV4ID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMCk7Ci0gIGJvb2wgYkJpbmQgPSBmYWxzZTsKLSAgaWYgKGFyZ2MgPT0gMikgewotICAgIGJCaW5kID0gcEFyZ3VtZW50cy0+R2V0SW50MzIoMSkgPT0gMCA/IGZhbHNlIDogdHJ1ZTsKLSAgfQotICBDWEZBX09jY3VyIG5vZGVPY2N1cihHZXRPY2N1ck5vZGUoKSk7Ci0gIGludDMyX3QgaUNvdW50ID0gR2V0Q291bnQodGhpcyk7Ci0gIGlmIChpSW5kZXggPCAwIHx8IGlJbmRleCA+IGlDb3VudCkgewotICAgIFRocm93SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotICAgIHJldHVybjsKLSAgfQotICBpbnQzMl90IGlNYXggPSBub2RlT2NjdXIuR2V0TWF4KCk7Ci0gIGlmIChpTWF4ID49IDAgJiYgaUNvdW50ID49IGlNYXgpIHsKLSAgICBUaHJvd1Rvb01hbnlPY2N1cmFuY2VzRXhjZXB0aW9uKEwibWF4Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfTm9kZSogcE5ld0luc3RhbmNlID0gQ3JlYXRlSW5zdGFuY2UodGhpcywgYkJpbmQpOwotICBJbnNlcnRJdGVtKHRoaXMsIHBOZXdJbnN0YW5jZSwgaUluZGV4LCBpQ291bnQsIHRydWUpOwotICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLT5Bc3NpZ24oCi0gICAgICBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKU1ZhbHVlRnJvbU1hcChwTmV3SW5zdGFuY2UpKTsKLSAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXROb3RpZnkoKTsKLSAgaWYgKCFwTm90aWZ5KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBOb3RpZnktPlJ1bk5vZGVJbml0aWFsaXplKHBOZXdJbnN0YW5jZSk7Ci0gIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvID0gbV9wRG9jdW1lbnQtPkdldExheW91dFByb2Nlc3NvcigpOwotICBpZiAoIXBMYXlvdXRQcm8pIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgcExheW91dFByby0+QWRkQ2hhbmdlZENvbnRhaW5lcigKLSAgICAgIFRvTm9kZShtX3BEb2N1bWVudC0+R2V0WEZBT2JqZWN0KFhGQV9IQVNIQ09ERV9Gb3JtKSkpOwotfQotCi1pbnQzMl90IENYRkFfTm9kZTo6SW5zdGFuY2VNYW5hZ2VyX1NldEluc3RhbmNlcyhpbnQzMl90IGlEZXNpcmVkKSB7Ci0gIENYRkFfT2NjdXIgbm9kZU9jY3VyKEdldE9jY3VyTm9kZSgpKTsKLSAgaW50MzJfdCBpTWF4ID0gbm9kZU9jY3VyLkdldE1heCgpOwotICBpbnQzMl90IGlNaW4gPSBub2RlT2NjdXIuR2V0TWluKCk7Ci0gIGlmIChpRGVzaXJlZCA8IGlNaW4pIHsKLSAgICBUaHJvd1Rvb01hbnlPY2N1cmFuY2VzRXhjZXB0aW9uKEwibWluIik7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgaWYgKChpTWF4ID49IDApICYmIChpRGVzaXJlZCA+IGlNYXgpKSB7Ci0gICAgVGhyb3dUb29NYW55T2NjdXJhbmNlc0V4Y2VwdGlvbihMIm1heCIpOwotICAgIHJldHVybiAyOwotICB9Ci0gIGludDMyX3QgaUNvdW50ID0gR2V0Q291bnQodGhpcyk7Ci0gIGlmIChpRGVzaXJlZCA9PSBpQ291bnQpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAoaURlc2lyZWQgPCBpQ291bnQpIHsKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd3NJbnN0TWFuYWdlck5hbWUgPSBHZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOwotICAgIENGWF9XaWRlU3RyaW5nIHdzSW5zdGFuY2VOYW1lID0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcod3NJbnN0TWFuYWdlck5hbWUuSXNFbXB0eSgpID8gd3NJbnN0TWFuYWdlck5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogd3NJbnN0TWFuYWdlck5hbWUuTWlkKDEpKTsKLSAgICB1aW50MzJfdCBkSW5zdGFuY2VOYW1lSGFzaCA9Ci0gICAgICAgIEZYX0hhc2hDb2RlX0dldFcod3NJbnN0YW5jZU5hbWUuQXNTdHJpbmdDKCksIGZhbHNlKTsKLSAgICBDWEZBX05vZGUqIHBQcmV2U2libGluZyA9Ci0gICAgICAgIChpRGVzaXJlZCA9PSAwKSA/IHRoaXMgOiBHZXRJdGVtKHRoaXMsIGlEZXNpcmVkIC0gMSk7Ci0gICAgd2hpbGUgKGlDb3VudCA+IGlEZXNpcmVkKSB7Ci0gICAgICBDWEZBX05vZGUqIHBSZW1vdmVJbnN0YW5jZSA9Ci0gICAgICAgICAgcFByZXZTaWJsaW5nLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOwotICAgICAgaWYgKHBSZW1vdmVJbnN0YW5jZS0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6U3ViZm9ybSAmJgotICAgICAgICAgIHBSZW1vdmVJbnN0YW5jZS0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6U3ViZm9ybVNldCkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmIChwUmVtb3ZlSW5zdGFuY2UtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6Okluc3RhbmNlTWFuYWdlcikgewotICAgICAgICBBU1NFUlQoZmFsc2UpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChwUmVtb3ZlSW5zdGFuY2UtPkdldE5hbWVIYXNoKCkgPT0gZEluc3RhbmNlTmFtZUhhc2gpIHsKLSAgICAgICAgUmVtb3ZlSXRlbSh0aGlzLCBwUmVtb3ZlSW5zdGFuY2UpOwotICAgICAgICBpQ291bnQtLTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZiAoaURlc2lyZWQgPiBpQ291bnQpIHsKLSAgICB3aGlsZSAoaUNvdW50IDwgaURlc2lyZWQpIHsKLSAgICAgIENYRkFfTm9kZSogcE5ld0luc3RhbmNlID0gQ3JlYXRlSW5zdGFuY2UodGhpcywgdHJ1ZSk7Ci0gICAgICBJbnNlcnRJdGVtKHRoaXMsIHBOZXdJbnN0YW5jZSwgaUNvdW50LCBpQ291bnQsIGZhbHNlKTsKLSAgICAgIGlDb3VudCsrOwotICAgICAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXROb3RpZnkoKTsKLSAgICAgIGlmICghcE5vdGlmeSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIHBOb3RpZnktPlJ1bk5vZGVJbml0aWFsaXplKHBOZXdJbnN0YW5jZSk7Ci0gICAgfQotICB9Ci0gIENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvID0gbV9wRG9jdW1lbnQtPkdldExheW91dFByb2Nlc3NvcigpOwotICBpZiAocExheW91dFBybykgewotICAgIHBMYXlvdXRQcm8tPkFkZENoYW5nZWRDb250YWluZXIoCi0gICAgICAgIFRvTm9kZShtX3BEb2N1bWVudC0+R2V0WEZBT2JqZWN0KFhGQV9IQVNIQ09ERV9Gb3JtKSkpOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1pbnQzMl90IENYRkFfTm9kZTo6SW5zdGFuY2VNYW5hZ2VyX01vdmVJbnN0YW5jZShpbnQzMl90IGlUbywgaW50MzJfdCBpRnJvbSkgewotICBpbnQzMl90IGlDb3VudCA9IEdldENvdW50KHRoaXMpOwotICBpZiAoaUZyb20gPiBpQ291bnQgfHwgaVRvID4gaUNvdW50IC0gMSkgewotICAgIFRocm93SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotICAgIHJldHVybiAxOwotICB9Ci0gIGlmIChpRnJvbSA8IDAgfHwgaVRvIDwgMCB8fCBpRnJvbSA9PSBpVG8pIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBDWEZBX05vZGUqIHBNb3ZlSW5zdGFuY2UgPSBHZXRJdGVtKHRoaXMsIGlGcm9tKTsKLSAgUmVtb3ZlSXRlbSh0aGlzLCBwTW92ZUluc3RhbmNlLCBmYWxzZSk7Ci0gIEluc2VydEl0ZW0odGhpcywgcE1vdmVJbnN0YW5jZSwgaVRvLCBpQ291bnQgLSAxLCB0cnVlKTsKLSAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXRQcm8gPSBtX3BEb2N1bWVudC0+R2V0TGF5b3V0UHJvY2Vzc29yKCk7Ci0gIGlmIChwTGF5b3V0UHJvKSB7Ci0gICAgcExheW91dFByby0+QWRkQ2hhbmdlZENvbnRhaW5lcigKLSAgICAgICAgVG9Ob2RlKG1fcERvY3VtZW50LT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0Zvcm0pKSk7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfT2NjdXJfTWF4KENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBDWEZBX09jY3VyIG9jY3VyKHRoaXMpOwotICBpZiAoYlNldHRpbmcpIHsKLSAgICBpbnQzMl90IGlNYXggPSBwVmFsdWUtPlRvSW50ZWdlcigpOwotICAgIG9jY3VyLlNldE1heChpTWF4KTsKLSAgfSBlbHNlIHsKLSAgICBwVmFsdWUtPlNldEludGVnZXIob2NjdXIuR2V0TWF4KCkpOwotICB9Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfT2NjdXJfTWluKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBDWEZBX09jY3VyIG9jY3VyKHRoaXMpOwotICBpZiAoYlNldHRpbmcpIHsKLSAgICBpbnQzMl90IGlNaW4gPSBwVmFsdWUtPlRvSW50ZWdlcigpOwotICAgIG9jY3VyLlNldE1pbihpTWluKTsKLSAgfSBlbHNlIHsKLSAgICBwVmFsdWUtPlNldEludGVnZXIob2NjdXIuR2V0TWluKCkpOwotICB9Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRGVzY19NZXRhZGF0YShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGludDMyX3QgYXJnYyA9IHBBcmd1bWVudHMtPkdldExlbmd0aCgpOwotICBpZiAoYXJnYyAhPSAwICYmIGFyZ2MgIT0gMSkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwibWV0YWRhdGEiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKCIiKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Gb3JtX0Zvcm1Ob2RlcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGlmIChwQXJndW1lbnRzLT5HZXRMZW5ndGgoKSAhPSAxKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJmb3JtTm9kZXMiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IHN0YXRpY19jYXN0PENYRkFfTm9kZSo+KHBBcmd1bWVudHMtPkdldE9iamVjdCgwKSk7Ci0gIGlmICghcERhdGFOb2RlKSB7Ci0gICAgVGhyb3dBcmd1bWVudE1pc21hdGNoRXhjZXB0aW9uKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ1hGQV9Ob2RlQXJyYXkgZm9ybUl0ZW1zOwotICBDWEZBX0FycmF5Tm9kZUxpc3QqIHBGb3JtTm9kZXMgPSBuZXcgQ1hGQV9BcnJheU5vZGVMaXN0KG1fcERvY3VtZW50KTsKLSAgcEZvcm1Ob2Rlcy0+U2V0QXJyYXlOb2RlTGlzdChmb3JtSXRlbXMpOwotICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLT5TZXRPYmplY3QoCi0gICAgICBwRm9ybU5vZGVzLCBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRKc2VOb3JtYWxDbGFzcygpKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Gb3JtX1JlbWVyZ2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAocEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCkgIT0gMCkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwicmVtZXJnZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIG1fcERvY3VtZW50LT5Eb0RhdGFSZW1lcmdlKHRydWUpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fRXhlY0luaXRpYWxpemUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAocEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCkgIT0gMCkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiZXhlY0luaXRpYWxpemUiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldE5vdGlmeSgpOwotICBpZiAoIXBOb3RpZnkpCi0gICAgcmV0dXJuOwotCi0gIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9Jbml0aWFsaXplKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Gb3JtX1JlY2FsY3VsYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSA9Ci0gICAgICBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5HZXRFdmVudFBhcmFtKCk7Ci0gIGlmIChwRXZlbnRQYXJhbS0+bV9lVHlwZSA9PSBYRkFfRVZFTlRfQ2FsY3VsYXRlIHx8Ci0gICAgICBwRXZlbnRQYXJhbS0+bV9lVHlwZSA9PSBYRkFfRVZFTlRfSW5pdENhbGN1bGF0ZSkgewotICAgIHJldHVybjsKLSAgfQotICBpZiAocEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCkgIT0gMSkgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwicmVjYWxjdWxhdGUiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldE5vdGlmeSgpOwotICBpZiAoIXBOb3RpZnkpCi0gICAgcmV0dXJuOwotICBpZiAocEFyZ3VtZW50cy0+R2V0SW50MzIoMCkgIT0gMCkKLSAgICByZXR1cm47Ci0KLSAgcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgWEZBX0VWRU5UX0NhbGN1bGF0ZSk7Ci0gIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9WYWxpZGF0ZSk7Ci0gIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9SZWFkeSwgdHJ1ZSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9FeGVjQ2FsY3VsYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaWYgKHBBcmd1bWVudHMtPkdldExlbmd0aCgpICE9IDApIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMImV4ZWNDYWxjdWxhdGUiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gbV9wRG9jdW1lbnQtPkdldE5vdGlmeSgpOwotICBpZiAoIXBOb3RpZnkpCi0gICAgcmV0dXJuOwotCi0gIHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9DYWxjdWxhdGUpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fRXhlY1ZhbGlkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaWYgKHBBcmd1bWVudHMtPkdldExlbmd0aCgpICE9IDApIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMImV4ZWNWYWxpZGF0ZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCk7Ci0gIGlmICghcE5vdGlmeSkgewotICAgIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCktPlNldEJvb2xlYW4oZmFsc2UpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGludDMyX3QgaVJldCA9IHBOb3RpZnktPkV4ZWNFdmVudEJ5RGVlcEZpcnN0KHRoaXMsIFhGQV9FVkVOVF9WYWxpZGF0ZSk7Ci0gIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCktPlNldEJvb2xlYW4oCi0gICAgICAoaVJldCA9PSBYRkFfRVZFTlRFUlJPUl9FcnJvcikgPyBmYWxzZSA6IHRydWUpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fQ2hlY2tzdW0oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgU2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfQ2hlY2tzdW0sIHBWYWx1ZS0+VG9XaWRlU3RyaW5nKCkuQXNTdHJpbmdDKCkpOwotICAgIHJldHVybjsKLSAgfQotICBDRlhfV2lkZVN0cmluZyB3c0NoZWNrc3VtOwotICBHZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9DaGVja3N1bSwgd3NDaGVja3N1bSwgZmFsc2UpOwotICBwVmFsdWUtPlNldFN0cmluZyh3c0NoZWNrc3VtLlVURjhFbmNvZGUoKS5Bc1N0cmluZ0MoKSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfUGFja2V0X0dldEF0dHJpYnV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGlmIChwQXJndW1lbnRzLT5HZXRMZW5ndGgoKSAhPSAxKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJnZXRBdHRyaWJ1dGUiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ0ZYX0J5dGVTdHJpbmcgYnNBdHRyaWJ1dGVOYW1lID0gcEFyZ3VtZW50cy0+R2V0VVRGOFN0cmluZygwKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyaWJ1dGVWYWx1ZTsKLSAgQ0ZERV9YTUxOb2RlKiBwWE1MTm9kZSA9IEdldFhNTE1hcHBpbmdOb2RlKCk7Ci0gIGlmIChwWE1MTm9kZSAmJiBwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsKLSAgICBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwWE1MTm9kZSktPkdldFN0cmluZygKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzQXR0cmlidXRlTmFtZS5Bc1N0cmluZ0MoKSkuY19zdHIoKSwKLSAgICAgICAgd3NBdHRyaWJ1dGVWYWx1ZSk7Ci0gIH0KLSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+U2V0U3RyaW5nKAotICAgICAgd3NBdHRyaWJ1dGVWYWx1ZS5VVEY4RW5jb2RlKCkuQXNTdHJpbmdDKCkpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1BhY2tldF9TZXRBdHRyaWJ1dGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAocEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCkgIT0gMikgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwic2V0QXR0cmlidXRlIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENGWF9CeXRlU3RyaW5nIGJzVmFsdWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOwotICBDRlhfQnl0ZVN0cmluZyBic05hbWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDEpOwotICBDRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0gR2V0WE1MTWFwcGluZ05vZGUoKTsKLSAgaWYgKHBYTUxOb2RlICYmIHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgewotICAgIHN0YXRpY19jYXN0PENGREVfWE1MRWxlbWVudCo+KHBYTUxOb2RlKS0+U2V0U3RyaW5nKAotICAgICAgICBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNOYW1lLkFzU3RyaW5nQygpKSwKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KGJzVmFsdWUuQXNTdHJpbmdDKCkpKTsKLSAgfQotICBwQXJndW1lbnRzLT5HZXRSZXR1cm5WYWx1ZSgpLT5TZXROdWxsKCk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfUGFja2V0X1JlbW92ZUF0dHJpYnV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGlmIChwQXJndW1lbnRzLT5HZXRMZW5ndGgoKSAhPSAxKSB7Ci0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJyZW1vdmVBdHRyaWJ1dGUiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDRlhfQnl0ZVN0cmluZyBic05hbWUgPSBwQXJndW1lbnRzLT5HZXRVVEY4U3RyaW5nKDApOwotICBDRlhfV2lkZVN0cmluZyB3c05hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoYnNOYW1lLkFzU3RyaW5nQygpKTsKLSAgQ0ZERV9YTUxOb2RlKiBwWE1MTm9kZSA9IEdldFhNTE1hcHBpbmdOb2RlKCk7Ci0gIGlmIChwWE1MTm9kZSAmJiBwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsKLSAgICBDRkRFX1hNTEVsZW1lbnQqIHBYTUxFbGVtZW50ID0gc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4ocFhNTE5vZGUpOwotICAgIGlmIChwWE1MRWxlbWVudC0+SGFzQXR0cmlidXRlKHdzTmFtZS5jX3N0cigpKSkgewotICAgICAgcFhNTEVsZW1lbnQtPlJlbW92ZUF0dHJpYnV0ZSh3c05hbWUuY19zdHIoKSk7Ci0gICAgfQotICB9Ci0gIHBBcmd1bWVudHMtPkdldFJldHVyblZhbHVlKCktPlNldE51bGwoKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9QYWNrZXRfQ29udGVudChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIGlmIChiU2V0dGluZykgewotICAgIENGREVfWE1MTm9kZSogcFhNTE5vZGUgPSBHZXRYTUxNYXBwaW5nTm9kZSgpOwotICAgIGlmIChwWE1MTm9kZSAmJiBwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsKLSAgICAgIENGREVfWE1MRWxlbWVudCogcFhNTEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwWE1MTm9kZSk7Ci0gICAgICBwWE1MRWxlbWVudC0+U2V0VGV4dERhdGEocFZhbHVlLT5Ub1dpZGVTdHJpbmcoKSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dERhdGE7Ci0gICAgQ0ZERV9YTUxOb2RlKiBwWE1MTm9kZSA9IEdldFhNTE1hcHBpbmdOb2RlKCk7Ci0gICAgaWYgKHBYTUxOb2RlICYmIHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgewotICAgICAgQ0ZERV9YTUxFbGVtZW50KiBwWE1MRWxlbWVudCA9IHN0YXRpY19jYXN0PENGREVfWE1MRWxlbWVudCo+KHBYTUxOb2RlKTsKLSAgICAgIHBYTUxFbGVtZW50LT5HZXRUZXh0RGF0YSh3c1RleHREYXRhKTsKLSAgICB9Ci0gICAgcFZhbHVlLT5TZXRTdHJpbmcod3NUZXh0RGF0YS5VVEY4RW5jb2RlKCkuQXNTdHJpbmdDKCkpOwotICB9Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX05leHQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAocEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCkgIT0gMCkKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIm5leHQiKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfQ2FuY2VsQmF0Y2goQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAocEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCkgIT0gMCkKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMImNhbmNlbEJhdGNoIik7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0ZpcnN0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaWYgKHBBcmd1bWVudHMtPkdldExlbmd0aCgpICE9IDApCi0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJmaXJzdCIpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9VcGRhdGVCYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGlmIChwQXJndW1lbnRzLT5HZXRMZW5ndGgoKSAhPSAwKQotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwidXBkYXRlQmF0Y2giKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfUHJldmlvdXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAocEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCkgIT0gMCkKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMInByZXZpb3VzIik7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0lzQk9GKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaWYgKHBBcmd1bWVudHMtPkdldExlbmd0aCgpICE9IDApCi0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJpc0JPRiIpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9Jc0VPRihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGlmIChwQXJndW1lbnRzLT5HZXRMZW5ndGgoKSAhPSAwKQotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiaXNFT0YiKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfQ2FuY2VsKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaWYgKHBBcmd1bWVudHMtPkdldExlbmd0aCgpICE9IDApCi0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJjYW5jZWwiKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfVXBkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaWYgKHBBcmd1bWVudHMtPkdldExlbmd0aCgpICE9IDApCi0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJ1cGRhdGUiKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfT3BlbihDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGlmIChwQXJndW1lbnRzLT5HZXRMZW5ndGgoKSAhPSAwKQotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwib3BlbiIpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9EZWxldGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAocEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCkgIT0gMCkKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMImRlbGV0ZSIpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9BZGROZXcoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpZiAocEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCkgIT0gMCkKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMImFkZE5ldyIpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9SZXF1ZXJ5KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaWYgKHBBcmd1bWVudHMtPkdldExlbmd0aCgpICE9IDApCi0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJyZXF1ZXJ5Iik7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX1Jlc3luYyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKSB7Ci0gIGlmIChwQXJndW1lbnRzLT5HZXRMZW5ndGgoKSAhPSAwKQotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwicmVzeW5jIik7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0Nsb3NlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaWYgKHBBcmd1bWVudHMtPkdldExlbmd0aCgpICE9IDApCi0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJjbG9zZSIpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9MYXN0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaWYgKHBBcmd1bWVudHMtPkdldExlbmd0aCgpICE9IDApCi0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJsYXN0Iik7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0hhc0RhdGFDaGFuZ2VkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaWYgKHBBcmd1bWVudHMtPkdldExlbmd0aCgpICE9IDApCi0gICAgVGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oTCJoYXNEYXRhQ2hhbmdlZCIpOwotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9EYihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHt9Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfWGZhX1RoaXMoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkgewotICBpZiAoIWJTZXR0aW5nKSB7Ci0gICAgQ1hGQV9PYmplY3QqIHBUaGlzID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0VGhpc09iamVjdCgpOwotICAgIEFTU0VSVChwVGhpcyk7Ci0gICAgcFZhbHVlLT5Bc3NpZ24obV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocFRoaXMpKTsKLSAgfQotfQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X0hhbmRsZXJfVmVyc2lvbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHt9Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTY3JpcHRfU3VibWl0Rm9ybWF0X01vZGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSkge30KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9FeHRyYXNfVHlwZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7fQotCi12b2lkIENYRkFfTm9kZTo6U2NyaXB0X1NjcmlwdF9TdGF0ZWxlc3MoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcFZhbHVlLT5TZXRTdHJpbmcoRlhfVVRGOEVuY29kZShDRlhfV2lkZVN0cmluZ0MoTCIwIiwgMSkpLkFzU3RyaW5nQygpKTsKLX0KLQotdm9pZCBDWEZBX05vZGU6OlNjcmlwdF9FbmNyeXB0X0Zvcm1hdChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7fQotCi1ib29sIENYRkFfTm9kZTo6SGFzQXR0cmlidXRlKFhGQV9BVFRSSUJVVEUgZUF0dHIsIGJvb2wgYkNhbkluaGVyaXQpIHsKLSAgdm9pZCogcEtleSA9IEdldE1hcEtleV9FbGVtZW50KEdldEVsZW1lbnRUeXBlKCksIGVBdHRyKTsKLSAgcmV0dXJuIEhhc01hcE1vZHVsZUtleShwS2V5LCBiQ2FuSW5oZXJpdCk7Ci19Ci0KLWJvb2wgQ1hGQV9Ob2RlOjpTZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURSBlQXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJOb3RpZnkpIHsKLSAgY29uc3QgWEZBX0FUVFJJQlVURUlORk8qIHBBdHRyID0gWEZBX0dldEF0dHJpYnV0ZUJ5SUQoZUF0dHIpOwotICBpZiAoIXBBdHRyKQotICAgIHJldHVybiBmYWxzZTsKLQotICBYRkFfQVRUUklCVVRFVFlQRSBlVHlwZSA9IHBBdHRyLT5lVHlwZTsKLSAgaWYgKGVUeXBlID09IFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUpIHsKLSAgICBjb25zdCBYRkFfTk9UU1VSRUFUVFJJQlVURSogcE5vdHN1cmUgPQotICAgICAgICBYRkFfR2V0Tm90c3VyZUF0dHJpYnV0ZShHZXRFbGVtZW50VHlwZSgpLCBwQXR0ci0+ZU5hbWUpOwotICAgIGVUeXBlID0gcE5vdHN1cmUgPyBwTm90c3VyZS0+ZVR5cGUgOiBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YTsKLSAgfQotICBzd2l0Y2ggKGVUeXBlKSB7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9FbnVtOiB7Ci0gICAgICBjb25zdCBYRkFfQVRUUklCVVRFRU5VTUlORk8qIHBFbnVtID0gWEZBX0dldEF0dHJpYnV0ZUVudW1CeU5hbWUod3NWYWx1ZSk7Ci0gICAgICByZXR1cm4gU2V0RW51bShwQXR0ci0+ZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBwRW51bSA/IHBFbnVtLT5lTmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoWEZBX0FUVFJJQlVURUVOVU0pKGludHB0cl90KShwQXR0ci0+cERlZlZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgIGJOb3RpZnkpOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YToKLSAgICAgIHJldHVybiBTZXRDRGF0YShwQXR0ci0+ZU5hbWUsIENGWF9XaWRlU3RyaW5nKHdzVmFsdWUpLCBiTm90aWZ5KTsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW46Ci0gICAgICByZXR1cm4gU2V0Qm9vbGVhbihwQXR0ci0+ZU5hbWUsIHdzVmFsdWUgIT0gTCIwIiwgYk5vdGlmeSk7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyOgotICAgICAgcmV0dXJuIFNldEludGVnZXIocEF0dHItPmVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgRlhTWVNfcm91bmQoRlhTWVNfd2NzdG9mKHdzVmFsdWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlLkdldExlbmd0aCgpLCBudWxscHRyKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBiTm90aWZ5KTsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmU6Ci0gICAgICByZXR1cm4gU2V0TWVhc3VyZShwQXR0ci0+ZU5hbWUsIENYRkFfTWVhc3VyZW1lbnQod3NWYWx1ZSksIGJOb3RpZnkpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1hGQV9Ob2RlOjpHZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURSBlQXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlVzZURlZmF1bHQpIHsKLSAgY29uc3QgWEZBX0FUVFJJQlVURUlORk8qIHBBdHRyID0gWEZBX0dldEF0dHJpYnV0ZUJ5SUQoZUF0dHIpOwotICBpZiAoIXBBdHRyKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIFhGQV9BVFRSSUJVVEVUWVBFIGVUeXBlID0gcEF0dHItPmVUeXBlOwotICBpZiAoZVR5cGUgPT0gWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSkgewotICAgIGNvbnN0IFhGQV9OT1RTVVJFQVRUUklCVVRFKiBwTm90c3VyZSA9Ci0gICAgICAgIFhGQV9HZXROb3RzdXJlQXR0cmlidXRlKEdldEVsZW1lbnRUeXBlKCksIHBBdHRyLT5lTmFtZSk7Ci0gICAgZVR5cGUgPSBwTm90c3VyZSA/IHBOb3RzdXJlLT5lVHlwZSA6IFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhOwotICB9Ci0gIHN3aXRjaCAoZVR5cGUpIHsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX0VudW06IHsKLSAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVWYWx1ZTsKLSAgICAgIGlmICghVHJ5RW51bShwQXR0ci0+ZU5hbWUsIGVWYWx1ZSwgYlVzZURlZmF1bHQpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHdzVmFsdWUgPSBHZXRBdHRyaWJ1dGVFbnVtQnlJRChlVmFsdWUpLT5wTmFtZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YTogewotICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWVDOwotICAgICAgaWYgKCFUcnlDRGF0YShwQXR0ci0+ZU5hbWUsIHdzVmFsdWVDLCBiVXNlRGVmYXVsdCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgd3NWYWx1ZSA9IHdzVmFsdWVDOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW46IHsKLSAgICAgIGJvb2wgYlZhbHVlOwotICAgICAgaWYgKCFUcnlCb29sZWFuKHBBdHRyLT5lTmFtZSwgYlZhbHVlLCBiVXNlRGVmYXVsdCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgd3NWYWx1ZSA9IGJWYWx1ZSA/IEwiMSIgOiBMIjAiOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXI6IHsKLSAgICAgIGludDMyX3QgaVZhbHVlOwotICAgICAgaWYgKCFUcnlJbnRlZ2VyKHBBdHRyLT5lTmFtZSwgaVZhbHVlLCBiVXNlRGVmYXVsdCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgd3NWYWx1ZS5Gb3JtYXQoTCIlZCIsIGlWYWx1ZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZTogewotICAgICAgQ1hGQV9NZWFzdXJlbWVudCBtVmFsdWU7Ci0gICAgICBpZiAoIVRyeU1lYXN1cmUocEF0dHItPmVOYW1lLCBtVmFsdWUsIGJVc2VEZWZhdWx0KSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBtVmFsdWUuVG9TdHJpbmcod3NWYWx1ZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1hGQV9Ob2RlOjpTZXRBdHRyaWJ1dGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0F0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5KSB7Ci0gIGNvbnN0IFhGQV9BVFRSSUJVVEVJTkZPKiBwQXR0cmlidXRlSW5mbyA9IFhGQV9HZXRBdHRyaWJ1dGVCeU5hbWUod3NWYWx1ZSk7Ci0gIGlmIChwQXR0cmlidXRlSW5mbykgewotICAgIHJldHVybiBTZXRBdHRyaWJ1dGUocEF0dHJpYnV0ZUluZm8tPmVOYW1lLCB3c1ZhbHVlLCBiTm90aWZ5KTsKLSAgfQotICB2b2lkKiBwS2V5ID0gR2V0TWFwS2V5X0N1c3RvbSh3c0F0dHIpOwotICBTZXRNYXBNb2R1bGVTdHJpbmcocEtleSwgd3NWYWx1ZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENYRkFfTm9kZTo6R2V0QXR0cmlidXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NBdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVXNlRGVmYXVsdCkgewotICBjb25zdCBYRkFfQVRUUklCVVRFSU5GTyogcEF0dHJpYnV0ZUluZm8gPSBYRkFfR2V0QXR0cmlidXRlQnlOYW1lKHdzQXR0cik7Ci0gIGlmIChwQXR0cmlidXRlSW5mbykgewotICAgIHJldHVybiBHZXRBdHRyaWJ1dGUocEF0dHJpYnV0ZUluZm8tPmVOYW1lLCB3c1ZhbHVlLCBiVXNlRGVmYXVsdCk7Ci0gIH0KLSAgdm9pZCogcEtleSA9IEdldE1hcEtleV9DdXN0b20od3NBdHRyKTsKLSAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWVDOwotICBpZiAoR2V0TWFwTW9kdWxlU3RyaW5nKHBLZXksIHdzVmFsdWVDKSkgewotICAgIHdzVmFsdWUgPSB3c1ZhbHVlQzsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDWEZBX05vZGU6OlJlbW92ZUF0dHJpYnV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQXR0cikgewotICB2b2lkKiBwS2V5ID0gR2V0TWFwS2V5X0N1c3RvbSh3c0F0dHIpOwotICBSZW1vdmVNYXBNb2R1bGVLZXkocEtleSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENYRkFfTm9kZTo6VHJ5Qm9vbGVhbihYRkFfQVRUUklCVVRFIGVBdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYlZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVXNlRGVmYXVsdCkgewotICB2b2lkKiBwVmFsdWUgPSBudWxscHRyOwotICBpZiAoIUdldFZhbHVlKGVBdHRyLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBiVXNlRGVmYXVsdCwgcFZhbHVlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGJWYWx1ZSA9ICEhcFZhbHVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDWEZBX05vZGU6OlRyeUludGVnZXIoWEZBX0FUVFJJQlVURSBlQXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlVzZURlZmF1bHQpIHsKLSAgdm9pZCogcFZhbHVlID0gbnVsbHB0cjsKLSAgaWYgKCFHZXRWYWx1ZShlQXR0ciwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgYlVzZURlZmF1bHQsIHBWYWx1ZSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpVmFsdWUgPSAoaW50MzJfdCkodWludHB0cl90KXBWYWx1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1hGQV9Ob2RlOjpUcnlFbnVtKFhGQV9BVFRSSUJVVEUgZUF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSYgZVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVXNlRGVmYXVsdCkgewotICB2b2lkKiBwVmFsdWUgPSBudWxscHRyOwotICBpZiAoIUdldFZhbHVlKGVBdHRyLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBiVXNlRGVmYXVsdCwgcFZhbHVlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGVWYWx1ZSA9IChYRkFfQVRUUklCVVRFRU5VTSkodWludHB0cl90KXBWYWx1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1hGQV9Ob2RlOjpTZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEUgZUF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX01lYXN1cmVtZW50IG1WYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk5vdGlmeSkgewotICB2b2lkKiBwS2V5ID0gR2V0TWFwS2V5X0VsZW1lbnQoR2V0RWxlbWVudFR5cGUoKSwgZUF0dHIpOwotICBPbkNoYW5naW5nKGVBdHRyLCBiTm90aWZ5KTsKLSAgU2V0TWFwTW9kdWxlQnVmZmVyKHBLZXksICZtVmFsdWUsIHNpemVvZihDWEZBX01lYXN1cmVtZW50KSk7Ci0gIE9uQ2hhbmdlZChlQXR0ciwgYk5vdGlmeSwgZmFsc2UpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDWEZBX05vZGU6OlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURSBlQXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTWVhc3VyZW1lbnQmIG1WYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlVzZURlZmF1bHQpIGNvbnN0IHsKLSAgdm9pZCogcEtleSA9IEdldE1hcEtleV9FbGVtZW50KEdldEVsZW1lbnRUeXBlKCksIGVBdHRyKTsKLSAgdm9pZCogcFZhbHVlOwotICBpbnQzMl90IGlCeXRlczsKLSAgaWYgKEdldE1hcE1vZHVsZUJ1ZmZlcihwS2V5LCBwVmFsdWUsIGlCeXRlcykgJiYgaUJ5dGVzID09IHNpemVvZihtVmFsdWUpKSB7Ci0gICAgRlhTWVNfbWVtY3B5KCZtVmFsdWUsIHBWYWx1ZSwgc2l6ZW9mKG1WYWx1ZSkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChiVXNlRGVmYXVsdCAmJgotICAgICAgWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZShwVmFsdWUsIEdldEVsZW1lbnRUeXBlKCksIGVBdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBtX2VQYWNrZXQpKSB7Ci0gICAgRlhTWVNfbWVtY3B5KCZtVmFsdWUsIHBWYWx1ZSwgc2l6ZW9mKG1WYWx1ZSkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotQ1hGQV9NZWFzdXJlbWVudCBDWEZBX05vZGU6OkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURSBlQXR0cikgY29uc3QgewotICBDWEZBX01lYXN1cmVtZW50IG1WYWx1ZTsKLSAgcmV0dXJuIFRyeU1lYXN1cmUoZUF0dHIsIG1WYWx1ZSwgdHJ1ZSkgPyBtVmFsdWUgOiBDWEZBX01lYXN1cmVtZW50KCk7Ci19Ci0KLWJvb2wgQ1hGQV9Ob2RlOjpTZXRDRGF0YShYRkFfQVRUUklCVVRFIGVBdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk5vdGlmeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTY3JpcHRNb2RpZnkpIHsKLSAgdm9pZCogcEtleSA9IEdldE1hcEtleV9FbGVtZW50KEdldEVsZW1lbnRUeXBlKCksIGVBdHRyKTsKLSAgT25DaGFuZ2luZyhlQXR0ciwgYk5vdGlmeSk7Ci0gIGlmIChlQXR0ciA9PSBYRkFfQVRUUklCVVRFX1ZhbHVlKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcqIHBDbG9uZSA9IG5ldyBDRlhfV2lkZVN0cmluZyh3c1ZhbHVlKTsKLSAgICBTZXRVc2VyRGF0YShwS2V5LCBwQ2xvbmUsICZkZWxldGVXaWRlU3RyaW5nQ2FsbEJhY2spOwotICB9IGVsc2UgewotICAgIFNldE1hcE1vZHVsZVN0cmluZyhwS2V5LCB3c1ZhbHVlLkFzU3RyaW5nQygpKTsKLSAgICBpZiAoZUF0dHIgPT0gWEZBX0FUVFJJQlVURV9OYW1lKQotICAgICAgVXBkYXRlTmFtZUhhc2goKTsKLSAgfQotICBPbkNoYW5nZWQoZUF0dHIsIGJOb3RpZnksIGJTY3JpcHRNb2RpZnkpOwotCi0gIGlmICghSXNOZWVkU2F2aW5nWE1MTm9kZSgpIHx8IGVBdHRyID09IFhGQV9BVFRSSUJVVEVfUXVhbGlmaWVkTmFtZSB8fAotICAgICAgZUF0dHIgPT0gWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgaWYgKGVBdHRyID09IFhGQV9BVFRSSUJVVEVfTmFtZSAmJgotICAgICAgKG1fZWxlbWVudFR5cGUgPT0gWEZBX0VsZW1lbnQ6OkRhdGFWYWx1ZSB8fAotICAgICAgIG1fZWxlbWVudFR5cGUgPT0gWEZBX0VsZW1lbnQ6OkRhdGFHcm91cCkpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGlmIChlQXR0ciA9PSBYRkFfQVRUUklCVVRFX1ZhbHVlKSB7Ci0gICAgRkRFX1hNTE5PREVUWVBFIGVYTUxUeXBlID0gbV9wWE1MTm9kZS0+R2V0VHlwZSgpOwotICAgIHN3aXRjaCAoZVhNTFR5cGUpIHsKLSAgICAgIGNhc2UgRkRFX1hNTE5PREVfRWxlbWVudDoKLSAgICAgICAgaWYgKElzQXR0cmlidXRlSW5YTUwoKSkgewotICAgICAgICAgIHN0YXRpY19jYXN0PENGREVfWE1MRWxlbWVudCo+KG1fcFhNTE5vZGUpCi0gICAgICAgICAgICAgIC0+U2V0U3RyaW5nKENGWF9XaWRlU3RyaW5nKEdldENEYXRhKFhGQV9BVFRSSUJVVEVfUXVhbGlmaWVkTmFtZSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICB3c1ZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBib29sIGJEZWxldGVDaGlsZHJlbiA9IHRydWU7Ci0gICAgICAgICAgaWYgKEdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykgewotICAgICAgICAgICAgZm9yIChDWEZBX05vZGUqIHBDaGlsZERhdGFOb2RlID0KLSAgICAgICAgICAgICAgICAgICAgIEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsKLSAgICAgICAgICAgICAgICAgcENoaWxkRGF0YU5vZGU7IHBDaGlsZERhdGFOb2RlID0gcENoaWxkRGF0YU5vZGUtPkdldE5vZGVJdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsKLSAgICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgZm9ybU5vZGVzOwotICAgICAgICAgICAgICBpZiAocENoaWxkRGF0YU5vZGUtPkdldEJpbmRJdGVtcyhmb3JtTm9kZXMpID4gMCkgewotICAgICAgICAgICAgICAgIGJEZWxldGVDaGlsZHJlbiA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChiRGVsZXRlQ2hpbGRyZW4pIHsKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PENGREVfWE1MRWxlbWVudCo+KG1fcFhNTE5vZGUpLT5EZWxldGVDaGlsZHJlbigpOwotICAgICAgICAgIH0KLSAgICAgICAgICBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihtX3BYTUxOb2RlKS0+U2V0VGV4dERhdGEod3NWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZERV9YTUxOT0RFX1RleHQ6Ci0gICAgICAgIHN0YXRpY19jYXN0PENGREVfWE1MVGV4dCo+KG1fcFhNTE5vZGUpLT5TZXRUZXh0KHdzVmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFTU0VSVCgwKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBjb25zdCBYRkFfQVRUUklCVVRFSU5GTyogcEluZm8gPSBYRkFfR2V0QXR0cmlidXRlQnlJRChlQXR0cik7Ci0gIGlmIChwSW5mbykgewotICAgIEFTU0VSVChtX3BYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyTmFtZSA9IHBJbmZvLT5wTmFtZTsKLSAgICBpZiAocEluZm8tPmVOYW1lID09IFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUpIHsKLSAgICAgIHdzQXR0ck5hbWUgPSBMInhmYToiICsgd3NBdHRyTmFtZTsKLSAgICB9Ci0gICAgc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4obV9wWE1MTm9kZSktPlNldFN0cmluZyh3c0F0dHJOYW1lLCB3c1ZhbHVlKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDWEZBX05vZGU6OlNldEF0dHJpYnV0ZVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1hNTFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk5vdGlmeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTY3JpcHRNb2RpZnkpIHsKLSAgdm9pZCogcEtleSA9IEdldE1hcEtleV9FbGVtZW50KEdldEVsZW1lbnRUeXBlKCksIFhGQV9BVFRSSUJVVEVfVmFsdWUpOwotICBPbkNoYW5naW5nKFhGQV9BVFRSSUJVVEVfVmFsdWUsIGJOb3RpZnkpOwotICBDRlhfV2lkZVN0cmluZyogcENsb25lID0gbmV3IENGWF9XaWRlU3RyaW5nKHdzVmFsdWUpOwotICBTZXRVc2VyRGF0YShwS2V5LCBwQ2xvbmUsICZkZWxldGVXaWRlU3RyaW5nQ2FsbEJhY2spOwotICBPbkNoYW5nZWQoWEZBX0FUVFJJQlVURV9WYWx1ZSwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSk7Ci0gIGlmIChJc05lZWRTYXZpbmdYTUxOb2RlKCkpIHsKLSAgICBGREVfWE1MTk9ERVRZUEUgZVhNTFR5cGUgPSBtX3BYTUxOb2RlLT5HZXRUeXBlKCk7Ci0gICAgc3dpdGNoIChlWE1MVHlwZSkgewotICAgICAgY2FzZSBGREVfWE1MTk9ERV9FbGVtZW50OgotICAgICAgICBpZiAoSXNBdHRyaWJ1dGVJblhNTCgpKSB7Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4obV9wWE1MTm9kZSkKLSAgICAgICAgICAgICAgLT5TZXRTdHJpbmcoQ0ZYX1dpZGVTdHJpbmcoR2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9RdWFsaWZpZWROYW1lKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHdzWE1MVmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGJvb2wgYkRlbGV0ZUNoaWxkcmVuID0gdHJ1ZTsKLSAgICAgICAgICBpZiAoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSB7Ci0gICAgICAgICAgICBmb3IgKENYRkFfTm9kZSogcENoaWxkRGF0YU5vZGUgPQotICAgICAgICAgICAgICAgICAgICAgR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgICAgICAgICAgICBwQ2hpbGREYXRhTm9kZTsgcENoaWxkRGF0YU5vZGUgPSBwQ2hpbGREYXRhTm9kZS0+R2V0Tm9kZUl0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgewotICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSBmb3JtTm9kZXM7Ci0gICAgICAgICAgICAgIGlmIChwQ2hpbGREYXRhTm9kZS0+R2V0QmluZEl0ZW1zKGZvcm1Ob2RlcykgPiAwKSB7Ci0gICAgICAgICAgICAgICAgYkRlbGV0ZUNoaWxkcmVuID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGJEZWxldGVDaGlsZHJlbikgewotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4obV9wWE1MTm9kZSktPkRlbGV0ZUNoaWxkcmVuKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHN0YXRpY19jYXN0PENGREVfWE1MRWxlbWVudCo+KG1fcFhNTE5vZGUpLT5TZXRUZXh0RGF0YSh3c1hNTFZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX1hNTE5PREVfVGV4dDoKLSAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZERV9YTUxUZXh0Kj4obV9wWE1MTm9kZSktPlNldFRleHQod3NYTUxWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgQVNTRVJUKDApOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDWEZBX05vZGU6OlRyeUNEYXRhKFhGQV9BVFRSSUJVVEUgZUF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVXNlRGVmYXVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJQcm90bykgewotICB2b2lkKiBwS2V5ID0gR2V0TWFwS2V5X0VsZW1lbnQoR2V0RWxlbWVudFR5cGUoKSwgZUF0dHIpOwotICBpZiAoZUF0dHIgPT0gWEZBX0FUVFJJQlVURV9WYWx1ZSkgewotICAgIENGWF9XaWRlU3RyaW5nKiBwU3RyID0gKENGWF9XaWRlU3RyaW5nKilHZXRVc2VyRGF0YShwS2V5LCBiUHJvdG8pOwotICAgIGlmIChwU3RyKSB7Ci0gICAgICB3c1ZhbHVlID0gKnBTdHI7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWVDOwotICAgIGlmIChHZXRNYXBNb2R1bGVTdHJpbmcocEtleSwgd3NWYWx1ZUMpKSB7Ci0gICAgICB3c1ZhbHVlID0gd3NWYWx1ZUM7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgaWYgKCFiVXNlRGVmYXVsdCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB2b2lkKiBwVmFsdWUgPSBudWxscHRyOwotICBpZiAoWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZShwVmFsdWUsIEdldEVsZW1lbnRUeXBlKCksIGVBdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgbV9lUGFja2V0KSkgewotICAgIHdzVmFsdWUgPSAoY29uc3QgRlhfV0NIQVIqKXBWYWx1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1hGQV9Ob2RlOjpUcnlDRGF0YShYRkFfQVRUUklCVVRFIGVBdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJVc2VEZWZhdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlByb3RvKSB7Ci0gIHZvaWQqIHBLZXkgPSBHZXRNYXBLZXlfRWxlbWVudChHZXRFbGVtZW50VHlwZSgpLCBlQXR0cik7Ci0gIGlmIChlQXR0ciA9PSBYRkFfQVRUUklCVVRFX1ZhbHVlKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcqIHBTdHIgPSAoQ0ZYX1dpZGVTdHJpbmcqKUdldFVzZXJEYXRhKHBLZXksIGJQcm90byk7Ci0gICAgaWYgKHBTdHIpIHsKLSAgICAgIHdzVmFsdWUgPSBwU3RyLT5Bc1N0cmluZ0MoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoR2V0TWFwTW9kdWxlU3RyaW5nKHBLZXksIHdzVmFsdWUpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgaWYgKCFiVXNlRGVmYXVsdCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB2b2lkKiBwVmFsdWUgPSBudWxscHRyOwotICBpZiAoWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZShwVmFsdWUsIEdldEVsZW1lbnRUeXBlKCksIGVBdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgbV9lUGFja2V0KSkgewotICAgIHdzVmFsdWUgPSAoQ0ZYX1dpZGVTdHJpbmdDKShjb25zdCBGWF9XQ0hBUiopcFZhbHVlOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX05vZGU6OlNldE9iamVjdChYRkFfQVRUUklCVVRFIGVBdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyogcENhbGxiYWNrSW5mbykgewotICB2b2lkKiBwS2V5ID0gR2V0TWFwS2V5X0VsZW1lbnQoR2V0RWxlbWVudFR5cGUoKSwgZUF0dHIpOwotICByZXR1cm4gU2V0VXNlckRhdGEocEtleSwgcERhdGEsIHBDYWxsYmFja0luZm8pOwotfQotCi1ib29sIENYRkFfTm9kZTo6VHJ5T2JqZWN0KFhGQV9BVFRSSUJVVEUgZUF0dHIsIHZvaWQqJiBwRGF0YSkgewotICB2b2lkKiBwS2V5ID0gR2V0TWFwS2V5X0VsZW1lbnQoR2V0RWxlbWVudFR5cGUoKSwgZUF0dHIpOwotICBwRGF0YSA9IEdldFVzZXJEYXRhKHBLZXkpOwotICByZXR1cm4gISFwRGF0YTsKLX0KLQotYm9vbCBDWEZBX05vZGU6OlNldFZhbHVlKFhGQV9BVFRSSUJVVEUgZUF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk5vdGlmeSkgewotICB2b2lkKiBwS2V5ID0gR2V0TWFwS2V5X0VsZW1lbnQoR2V0RWxlbWVudFR5cGUoKSwgZUF0dHIpOwotICBPbkNoYW5naW5nKGVBdHRyLCBiTm90aWZ5KTsKLSAgU2V0TWFwTW9kdWxlVmFsdWUocEtleSwgcFZhbHVlKTsKLSAgT25DaGFuZ2VkKGVBdHRyLCBiTm90aWZ5LCBmYWxzZSk7Ci0gIGlmIChJc05lZWRTYXZpbmdYTUxOb2RlKCkpIHsKLSAgICBBU1NFUlQobV9wWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpOwotICAgIGNvbnN0IFhGQV9BVFRSSUJVVEVJTkZPKiBwSW5mbyA9IFhGQV9HZXRBdHRyaWJ1dGVCeUlEKGVBdHRyKTsKLSAgICBpZiAocEluZm8pIHsKLSAgICAgIHN3aXRjaCAoZVR5cGUpIHsKLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFVFlQRV9FbnVtOgotICAgICAgICAgIHN0YXRpY19jYXN0PENGREVfWE1MRWxlbWVudCo+KG1fcFhNTE5vZGUpCi0gICAgICAgICAgICAgIC0+U2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgcEluZm8tPnBOYW1lLAotICAgICAgICAgICAgICAgICAgR2V0QXR0cmlidXRlRW51bUJ5SUQoKFhGQV9BVFRSSUJVVEVFTlVNKSh1aW50cHRyX3QpcFZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgIC0+cE5hbWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW46Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4obV9wWE1MTm9kZSkKLSAgICAgICAgICAgICAgLT5TZXRTdHJpbmcocEluZm8tPnBOYW1lLCBwVmFsdWUgPyBMIjEiIDogTCIwIik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlcjoKLSAgICAgICAgICBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihtX3BYTUxOb2RlKQotICAgICAgICAgICAgICAtPlNldEludGVnZXIocEluZm8tPnBOYW1lLCAoaW50MzJfdCkodWludHB0cl90KXBWYWx1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgQVNTRVJUKDApOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDWEZBX05vZGU6OkdldFZhbHVlKFhGQV9BVFRSSUJVVEUgZUF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVXNlRGVmYXVsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgcFZhbHVlKSB7Ci0gIHZvaWQqIHBLZXkgPSBHZXRNYXBLZXlfRWxlbWVudChHZXRFbGVtZW50VHlwZSgpLCBlQXR0cik7Ci0gIGlmIChHZXRNYXBNb2R1bGVWYWx1ZShwS2V5LCBwVmFsdWUpKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKCFiVXNlRGVmYXVsdCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZShwVmFsdWUsIEdldEVsZW1lbnRUeXBlKCksIGVBdHRyLCBlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9lUGFja2V0KTsKLX0KLQotYm9vbCBDWEZBX05vZGU6OlNldFVzZXJEYXRhKHZvaWQqIHBLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyogcENhbGxiYWNrSW5mbykgewotICBTZXRNYXBNb2R1bGVCdWZmZXIocEtleSwgJnBEYXRhLCBzaXplb2Yodm9pZCopLAotICAgICAgICAgICAgICAgICAgICAgcENhbGxiYWNrSW5mbyA/IHBDYWxsYmFja0luZm8gOiAmZ3NfWEZBRGVmYXVsdEZyZWVEYXRhKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ1hGQV9Ob2RlOjpUcnlVc2VyRGF0YSh2b2lkKiBwS2V5LCB2b2lkKiYgcERhdGEsIGJvb2wgYlByb3RvQWxzbykgewotICBpbnQzMl90IGlCeXRlcyA9IDA7Ci0gIGlmICghR2V0TWFwTW9kdWxlQnVmZmVyKHBLZXksIHBEYXRhLCBpQnl0ZXMsIGJQcm90b0Fsc28pKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBpQnl0ZXMgPT0gc2l6ZW9mKHZvaWQqKSAmJiBGWFNZU19tZW1jcHkoJnBEYXRhLCBwRGF0YSwgaUJ5dGVzKTsKLX0KLQotYm9vbCBDWEZBX05vZGU6OlNldFNjcmlwdENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1hNTFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2NyaXB0TW9kaWZ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3luY0RhdGEpIHsKLSAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG51bGxwdHI7Ci0gIENYRkFfTm9kZSogcEJpbmROb2RlID0gbnVsbHB0cjsKLSAgc3dpdGNoIChHZXRPYmplY3RUeXBlKCkpIHsKLSAgICBjYXNlIFhGQV9PYmplY3RUeXBlOjpDb250YWluZXJOb2RlOiB7Ci0gICAgICBpZiAoWEZBX0ZpZWxkSXNNdWx0aUxpc3RCb3godGhpcykpIHsKLSAgICAgICAgQ1hGQV9Ob2RlKiBwVmFsdWUgPSBHZXRQcm9wZXJ0eSgwLCBYRkFfRWxlbWVudDo6VmFsdWUpOwotICAgICAgICBDWEZBX05vZGUqIHBDaGlsZFZhbHVlID0gcFZhbHVlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gICAgICAgIEFTU0VSVChwQ2hpbGRWYWx1ZSk7Ci0gICAgICAgIHBDaGlsZFZhbHVlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCBMInRleHQveG1sIik7Ci0gICAgICAgIHBDaGlsZFZhbHVlLT5TZXRTY3JpcHRDb250ZW50KHdzQ29udGVudCwgd3NDb250ZW50LCBiTm90aWZ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2NyaXB0TW9kaWZ5LCBmYWxzZSk7Ci0gICAgICAgIENYRkFfTm9kZSogcEJpbmQgPSBHZXRCaW5kRGF0YSgpOwotICAgICAgICBpZiAoYlN5bmNEYXRhICYmIHBCaW5kKSB7Ci0gICAgICAgICAgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+IHdzU2F2ZVRleHRBcnJheTsKLSAgICAgICAgICBpbnQzMl90IGlTaXplID0gMDsKLSAgICAgICAgICBpZiAoIXdzQ29udGVudC5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGludDMyX3QgaVN0YXJ0ID0gMDsKLSAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCA9IHdzQ29udGVudC5HZXRMZW5ndGgoKTsKLSAgICAgICAgICAgIGludDMyX3QgaUVuZCA9IHdzQ29udGVudC5GaW5kKEwnXG4nLCBpU3RhcnQpOwotICAgICAgICAgICAgaUVuZCA9IChpRW5kID09IC0xKSA/IGlMZW5ndGggOiBpRW5kOwotICAgICAgICAgICAgd2hpbGUgKGlFbmQgPj0gaVN0YXJ0KSB7Ci0gICAgICAgICAgICAgIHdzU2F2ZVRleHRBcnJheS5wdXNoX2JhY2sod3NDb250ZW50Lk1pZChpU3RhcnQsIGlFbmQgLSBpU3RhcnQpKTsKLSAgICAgICAgICAgICAgaVN0YXJ0ID0gaUVuZCArIDE7Ci0gICAgICAgICAgICAgIGlmIChpU3RhcnQgPj0gaUxlbmd0aCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlFbmQgPSB3c0NvbnRlbnQuRmluZChMJ1xuJywgaVN0YXJ0KTsKLSAgICAgICAgICAgICAgaWYgKGlFbmQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgd3NTYXZlVGV4dEFycmF5LnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICAgICAgd3NDb250ZW50Lk1pZChpU3RhcnQsIGlMZW5ndGggLSBpU3RhcnQpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaVNpemUgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHdzU2F2ZVRleHRBcnJheSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChpU2l6ZSA9PSAwKSB7Ci0gICAgICAgICAgICB3aGlsZSAoQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0KLSAgICAgICAgICAgICAgICAgICAgICAgcEJpbmQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkgewotICAgICAgICAgICAgICBwQmluZC0+UmVtb3ZlQ2hpbGQocENoaWxkTm9kZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENYRkFfTm9kZUFycmF5IHZhbHVlTm9kZXM7Ci0gICAgICAgICAgICBpbnQzMl90IGlEYXRhcyA9IHBCaW5kLT5HZXROb2RlTGlzdCgKLSAgICAgICAgICAgICAgICB2YWx1ZU5vZGVzLCBYRkFfTk9ERUZJTFRFUl9DaGlsZHJlbiwgWEZBX0VsZW1lbnQ6OkRhdGFWYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoaURhdGFzIDwgaVNpemUpIHsKLSAgICAgICAgICAgICAgaW50MzJfdCBpQWRkTm9kZXMgPSBpU2l6ZSAtIGlEYXRhczsKLSAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVmFsdWVOb2RlcyA9IG51bGxwdHI7Ci0gICAgICAgICAgICAgIHdoaWxlIChpQWRkTm9kZXMtLSA+IDApIHsKLSAgICAgICAgICAgICAgICBwVmFsdWVOb2RlcyA9Ci0gICAgICAgICAgICAgICAgICAgIHBCaW5kLT5DcmVhdGVTYW1lUGFja2V0Tm9kZShYRkFfRWxlbWVudDo6RGF0YVZhbHVlKTsKLSAgICAgICAgICAgICAgICBwVmFsdWVOb2Rlcy0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCBMInZhbHVlIik7Ci0gICAgICAgICAgICAgICAgcFZhbHVlTm9kZXMtPkNyZWF0ZVhNTE1hcHBpbmdOb2RlKCk7Ci0gICAgICAgICAgICAgICAgcEJpbmQtPkluc2VydENoaWxkKHBWYWx1ZU5vZGVzKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBwVmFsdWVOb2RlcyA9IG51bGxwdHI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlEYXRhcyA+IGlTaXplKSB7Ci0gICAgICAgICAgICAgIGludDMyX3QgaURlbE5vZGVzID0gaURhdGFzIC0gaVNpemU7Ci0gICAgICAgICAgICAgIHdoaWxlIChpRGVsTm9kZXMtLSA+IDApIHsKLSAgICAgICAgICAgICAgICBwQmluZC0+UmVtb3ZlQ2hpbGQocEJpbmQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludDMyX3QgaSA9IDA7Ci0gICAgICAgICAgICBmb3IgKENYRkFfTm9kZSogcFZhbHVlTm9kZSA9Ci0gICAgICAgICAgICAgICAgICAgICBwQmluZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgICAgICAgICAgICBwVmFsdWVOb2RlOyBwVmFsdWVOb2RlID0gcFZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7Ci0gICAgICAgICAgICAgIHBWYWx1ZU5vZGUtPlNldEF0dHJpYnV0ZVZhbHVlKHdzU2F2ZVRleHRBcnJheVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NTYXZlVGV4dEFycmF5W2ldLCBmYWxzZSk7Ci0gICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgbm9kZUFycmF5OwotICAgICAgICAgIHBCaW5kLT5HZXRCaW5kSXRlbXMobm9kZUFycmF5KTsKLSAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBub2RlQXJyYXkuR2V0U2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChub2RlQXJyYXlbaV0gIT0gdGhpcykgewotICAgICAgICAgICAgICBub2RlQXJyYXlbaV0tPlNldFNjcmlwdENvbnRlbnQod3NDb250ZW50LCB3c0NvbnRlbnQsIGJOb3RpZnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2NyaXB0TW9kaWZ5LCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSBlbHNlIGlmIChHZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpFeGNsR3JvdXApIHsKLSAgICAgICAgcE5vZGUgPSB0aGlzOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQ1hGQV9Ob2RlKiBwVmFsdWUgPSBHZXRQcm9wZXJ0eSgwLCBYRkFfRWxlbWVudDo6VmFsdWUpOwotICAgICAgICBDWEZBX05vZGUqIHBDaGlsZFZhbHVlID0gcFZhbHVlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gICAgICAgIEFTU0VSVChwQ2hpbGRWYWx1ZSk7Ci0gICAgICAgIHBDaGlsZFZhbHVlLT5TZXRTY3JpcHRDb250ZW50KHdzQ29udGVudCwgd3NDb250ZW50LCBiTm90aWZ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2NyaXB0TW9kaWZ5LCBmYWxzZSk7Ci0gICAgICB9Ci0gICAgICBwQmluZE5vZGUgPSBHZXRCaW5kRGF0YSgpOwotICAgICAgaWYgKHBCaW5kTm9kZSAmJiBiU3luY0RhdGEpIHsKLSAgICAgICAgcEJpbmROb2RlLT5TZXRTY3JpcHRDb250ZW50KHdzQ29udGVudCwgd3NYTUxWYWx1ZSwgYk5vdGlmeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTY3JpcHRNb2RpZnksIGZhbHNlKTsKLSAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgbm9kZUFycmF5OwotICAgICAgICBwQmluZE5vZGUtPkdldEJpbmRJdGVtcyhub2RlQXJyYXkpOwotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBub2RlQXJyYXkuR2V0U2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICBpZiAobm9kZUFycmF5W2ldICE9IHRoaXMpIHsKLSAgICAgICAgICAgIG5vZGVBcnJheVtpXS0+U2V0U2NyaXB0Q29udGVudCh3c0NvbnRlbnQsIHdzQ29udGVudCwgYk5vdGlmeSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwQmluZE5vZGUgPSBudWxscHRyOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlOiB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOwotICAgICAgaWYgKEdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkV4RGF0YSkgewotICAgICAgICBHZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSwgZmFsc2UpOwotICAgICAgICBpZiAod3NDb250ZW50VHlwZSA9PSBMInRleHQvaHRtbCIpIHsKLSAgICAgICAgICB3c0NvbnRlbnRUeXBlID0gTCIiOwotICAgICAgICAgIFNldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlLkFzU3RyaW5nQygpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgQ1hGQV9Ob2RlKiBwQ29udGVudFJhd0RhdGFOb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgaWYgKCFwQ29udGVudFJhd0RhdGFOb2RlKSB7Ci0gICAgICAgIHBDb250ZW50UmF3RGF0YU5vZGUgPSBDcmVhdGVTYW1lUGFja2V0Tm9kZSgKLSAgICAgICAgICAgICh3c0NvbnRlbnRUeXBlID09IEwidGV4dC94bWwiKSA/IFhGQV9FbGVtZW50OjpTaGFycHhtbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogWEZBX0VsZW1lbnQ6OlNoYXJwdGV4dCk7Ci0gICAgICAgIEluc2VydENoaWxkKHBDb250ZW50UmF3RGF0YU5vZGUpOwotICAgICAgfQotICAgICAgcmV0dXJuIHBDb250ZW50UmF3RGF0YU5vZGUtPlNldFNjcmlwdENvbnRlbnQoCi0gICAgICAgICAgd3NDb250ZW50LCB3c1hNTFZhbHVlLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LCBiU3luY0RhdGEpOwotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBYRkFfT2JqZWN0VHlwZTo6Tm9kZUM6Ci0gICAgY2FzZSBYRkFfT2JqZWN0VHlwZTo6VGV4dE5vZGU6Ci0gICAgICBwTm9kZSA9IHRoaXM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9PYmplY3RUeXBlOjpOb2RlVjoKLSAgICAgIHBOb2RlID0gdGhpczsKLSAgICAgIGlmIChiU3luY0RhdGEgJiYgR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0Zvcm0pIHsKLSAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50ID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7Ci0gICAgICAgIGlmIChwUGFyZW50KSB7Ci0gICAgICAgICAgcFBhcmVudCA9IHBQYXJlbnQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwUGFyZW50ICYmIHBQYXJlbnQtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlZhbHVlKSB7Ci0gICAgICAgICAgcFBhcmVudCA9IHBQYXJlbnQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOwotICAgICAgICAgIGlmIChwUGFyZW50ICYmIHBQYXJlbnQtPklzQ29udGFpbmVyTm9kZSgpKSB7Ci0gICAgICAgICAgICBwQmluZE5vZGUgPSBwUGFyZW50LT5HZXRCaW5kRGF0YSgpOwotICAgICAgICAgICAgaWYgKHBCaW5kTm9kZSkgewotICAgICAgICAgICAgICBwQmluZE5vZGUtPlNldFNjcmlwdENvbnRlbnQod3NDb250ZW50LCB3c1hNTFZhbHVlLCBiTm90aWZ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNjcmlwdE1vZGlmeSwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChHZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpEYXRhVmFsdWUpIHsKLSAgICAgICAgcE5vZGUgPSB0aGlzOwotICAgICAgICBwQmluZE5vZGUgPSB0aGlzOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gIH0KLSAgaWYgKHBOb2RlKSB7Ci0gICAgU2V0QXR0cmlidXRlVmFsdWUod3NDb250ZW50LCB3c1hNTFZhbHVlLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5KTsKLSAgICBpZiAocEJpbmROb2RlICYmIGJTeW5jRGF0YSkgewotICAgICAgQ1hGQV9Ob2RlQXJyYXkgbm9kZUFycmF5OwotICAgICAgcEJpbmROb2RlLT5HZXRCaW5kSXRlbXMobm9kZUFycmF5KTsKLSAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG5vZGVBcnJheS5HZXRTaXplKCk7IGkrKykgewotICAgICAgICBub2RlQXJyYXlbaV0tPlNldFNjcmlwdENvbnRlbnQod3NDb250ZW50LCB3c0NvbnRlbnQsIGJOb3RpZnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU2NyaXB0TW9kaWZ5LCBmYWxzZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX05vZGU6OlNldENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1hNTFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2NyaXB0TW9kaWZ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3luY0RhdGEpIHsKLSAgcmV0dXJuIFNldFNjcmlwdENvbnRlbnQod3NDb250ZW50LCB3c1hNTFZhbHVlLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBiU3luY0RhdGEpOwotfQotCi1DRlhfV2lkZVN0cmluZyBDWEZBX05vZGU6OkdldFNjcmlwdENvbnRlbnQoYm9vbCBiU2NyaXB0TW9kaWZ5KSB7Ci0gIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsKLSAgcmV0dXJuIFRyeUNvbnRlbnQod3NDb250ZW50LCBiU2NyaXB0TW9kaWZ5KSA/IHdzQ29udGVudCA6IENGWF9XaWRlU3RyaW5nKCk7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENYRkFfTm9kZTo6R2V0Q29udGVudCgpIHsKLSAgcmV0dXJuIEdldFNjcmlwdENvbnRlbnQoKTsKLX0KLQotYm9vbCBDWEZBX05vZGU6OlRyeUNvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNjcmlwdE1vZGlmeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlByb3RvKSB7Ci0gIENYRkFfTm9kZSogcE5vZGUgPSBudWxscHRyOwotICBzd2l0Y2ggKEdldE9iamVjdFR5cGUoKSkgewotICAgIGNhc2UgWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGU6Ci0gICAgICBpZiAoR2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6RXhjbEdyb3VwKSB7Ci0gICAgICAgIHBOb2RlID0gdGhpczsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIENYRkFfTm9kZSogcFZhbHVlID0gR2V0Q2hpbGQoMCwgWEZBX0VsZW1lbnQ6OlZhbHVlKTsKLSAgICAgICAgaWYgKCFwVmFsdWUpIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGRWYWx1ZSA9IHBWYWx1ZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgICBpZiAocENoaWxkVmFsdWUgJiYgWEZBX0ZpZWxkSXNNdWx0aUxpc3RCb3godGhpcykpIHsKLSAgICAgICAgICBwQ2hpbGRWYWx1ZS0+U2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIEwidGV4dC94bWwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcENoaWxkVmFsdWUKLSAgICAgICAgICAgICAgICAgICA/IHBDaGlsZFZhbHVlLT5UcnlDb250ZW50KHdzQ29udGVudCwgYlNjcmlwdE1vZGlmeSwgYlByb3RvKQotICAgICAgICAgICAgICAgICAgIDogZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZTogewotICAgICAgQ1hGQV9Ob2RlKiBwQ29udGVudFJhd0RhdGFOb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgaWYgKCFwQ29udGVudFJhd0RhdGFOb2RlKSB7Ci0gICAgICAgIFhGQV9FbGVtZW50IGVsZW1lbnQgPSBYRkFfRWxlbWVudDo6U2hhcnB0ZXh0OwotICAgICAgICBpZiAoR2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6RXhEYXRhKSB7Ci0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZTsKLSAgICAgICAgICBHZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgd3NDb250ZW50VHlwZSwgZmFsc2UpOwotICAgICAgICAgIGlmICh3c0NvbnRlbnRUeXBlID09IEwidGV4dC9odG1sIikgewotICAgICAgICAgICAgZWxlbWVudCA9IFhGQV9FbGVtZW50OjpTaGFycHhIVE1MOwotICAgICAgICAgIH0gZWxzZSBpZiAod3NDb250ZW50VHlwZSA9PSBMInRleHQveG1sIikgewotICAgICAgICAgICAgZWxlbWVudCA9IFhGQV9FbGVtZW50OjpTaGFycHhtbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcENvbnRlbnRSYXdEYXRhTm9kZSA9IENyZWF0ZVNhbWVQYWNrZXROb2RlKGVsZW1lbnQpOwotICAgICAgICBJbnNlcnRDaGlsZChwQ29udGVudFJhd0RhdGFOb2RlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBwQ29udGVudFJhd0RhdGFOb2RlLT5UcnlDb250ZW50KHdzQ29udGVudCwgYlNjcmlwdE1vZGlmeSwgYlByb3RvKTsKLSAgICB9Ci0gICAgY2FzZSBYRkFfT2JqZWN0VHlwZTo6Tm9kZUM6Ci0gICAgY2FzZSBYRkFfT2JqZWN0VHlwZTo6Tm9kZVY6Ci0gICAgY2FzZSBYRkFfT2JqZWN0VHlwZTo6VGV4dE5vZGU6Ci0gICAgICBwTm9kZSA9IHRoaXM7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGlmIChHZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpEYXRhVmFsdWUpIHsKLSAgICAgICAgcE5vZGUgPSB0aGlzOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gIH0KLSAgaWYgKHBOb2RlKSB7Ci0gICAgaWYgKGJTY3JpcHRNb2RpZnkpIHsKLSAgICAgIENYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpOwotICAgICAgaWYgKHBTY3JpcHRDb250ZXh0KSB7Ci0gICAgICAgIG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPkFkZE5vZGVzT2ZSdW5TY3JpcHQodGhpcyk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUcnlDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbnRlbnQsIGZhbHNlLCBiUHJvdG8pOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQogQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldE1vZGVsTm9kZSgpIHsKLSAgc3dpdGNoIChHZXRQYWNrZXRJRCgpKSB7Ci0gICAgY2FzZSBYRkFfWERQUEFDS0VUX1hEUDoKKyAgc3dpdGNoIChHZXRQYWNrZXRUeXBlKCkpIHsKKyAgICBjYXNlIFhGQV9QYWNrZXRUeXBlOjpYZHA6CiAgICAgICByZXR1cm4gbV9wRG9jdW1lbnQtPkdldFJvb3QoKTsKLSAgICBjYXNlIFhGQV9YRFBQQUNLRVRfQ29uZmlnOgorICAgIGNhc2UgWEZBX1BhY2tldFR5cGU6OkNvbmZpZzoKICAgICAgIHJldHVybiBUb05vZGUobV9wRG9jdW1lbnQtPkdldFhGQU9iamVjdChYRkFfSEFTSENPREVfQ29uZmlnKSk7Ci0gICAgY2FzZSBYRkFfWERQUEFDS0VUX1RlbXBsYXRlOgorICAgIGNhc2UgWEZBX1BhY2tldFR5cGU6OlRlbXBsYXRlOgogICAgICAgcmV0dXJuIFRvTm9kZShtX3BEb2N1bWVudC0+R2V0WEZBT2JqZWN0KFhGQV9IQVNIQ09ERV9UZW1wbGF0ZSkpOwotICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Gb3JtOgorICAgIGNhc2UgWEZBX1BhY2tldFR5cGU6OkZvcm06CiAgICAgICByZXR1cm4gVG9Ob2RlKG1fcERvY3VtZW50LT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0Zvcm0pKTsKLSAgICBjYXNlIFhGQV9YRFBQQUNLRVRfRGF0YXNldHM6CisgICAgY2FzZSBYRkFfUGFja2V0VHlwZTo6RGF0YXNldHM6CiAgICAgICByZXR1cm4gVG9Ob2RlKG1fcERvY3VtZW50LT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0RhdGFzZXRzKSk7Ci0gICAgY2FzZSBYRkFfWERQUEFDS0VUX0xvY2FsZVNldDoKKyAgICBjYXNlIFhGQV9QYWNrZXRUeXBlOjpMb2NhbGVTZXQ6CiAgICAgICByZXR1cm4gVG9Ob2RlKG1fcERvY3VtZW50LT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0xvY2FsZVNldCkpOwotICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0OgorICAgIGNhc2UgWEZBX1BhY2tldFR5cGU6OkNvbm5lY3Rpb25TZXQ6CiAgICAgICByZXR1cm4gVG9Ob2RlKG1fcERvY3VtZW50LT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0Nvbm5lY3Rpb25TZXQpKTsKLSAgICBjYXNlIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0OgorICAgIGNhc2UgWEZBX1BhY2tldFR5cGU6OlNvdXJjZVNldDoKICAgICAgIHJldHVybiBUb05vZGUobV9wRG9jdW1lbnQtPkdldFhGQU9iamVjdChYRkFfSEFTSENPREVfU291cmNlU2V0KSk7Ci0gICAgY2FzZSBYRkFfWERQUEFDS0VUX1hkYzoKKyAgICBjYXNlIFhGQV9QYWNrZXRUeXBlOjpYZGM6CiAgICAgICByZXR1cm4gVG9Ob2RlKG1fcERvY3VtZW50LT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX1hkYykpOwogICAgIGRlZmF1bHQ6CiAgICAgICByZXR1cm4gdGhpczsKICAgfQogfQogCi1ib29sIENYRkFfTm9kZTo6VHJ5TmFtZXNwYWNlKENGWF9XaWRlU3RyaW5nJiB3c05hbWVzcGFjZSkgewotICB3c05hbWVzcGFjZS5jbGVhcigpOwotICBpZiAoSXNNb2RlbE5vZGUoKSB8fCBHZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpQYWNrZXQpIHsKLSAgICBDRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0gR2V0WE1MTWFwcGluZ05vZGUoKTsKLSAgICBpZiAoIXBYTUxOb2RlIHx8IHBYTUxOb2RlLT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwWE1MTm9kZSktPkdldE5hbWVzcGFjZVVSSSh3c05hbWVzcGFjZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAoR2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKSB7Ci0gICAgQ0ZERV9YTUxOb2RlKiBwWE1MTm9kZSA9IEdldFhNTE1hcHBpbmdOb2RlKCk7Ci0gICAgaWYgKCFwWE1MTm9kZSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAocFhNTE5vZGUtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKEdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkRhdGFWYWx1ZSAmJgotICAgICAgICBHZXRFbnVtKFhGQV9BVFRSSUJVVEVfQ29udGFpbnMpID09IFhGQV9BVFRSSUJVVEVFTlVNX01ldGFEYXRhKSB7Ci0gICAgICByZXR1cm4gWEZBX0ZERUV4dGVuc2lvbl9SZXNvbHZlTmFtZXNwYWNlUXVhbGlmaWVyKAotICAgICAgICAgIHN0YXRpY19jYXN0PENGREVfWE1MRWxlbWVudCo+KHBYTUxOb2RlKSwKLSAgICAgICAgICBHZXRDRGF0YShYRkFfQVRUUklCVVRFX1F1YWxpZmllZE5hbWUpLCB3c05hbWVzcGFjZSk7Ci0gICAgfQotICAgIHN0YXRpY19jYXN0PENGREVfWE1MRWxlbWVudCo+KHBYTUxOb2RlKS0+R2V0TmFtZXNwYWNlVVJJKHdzTmFtZXNwYWNlKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBDWEZBX05vZGUqIHBNb2RlbE5vZGUgPSBHZXRNb2RlbE5vZGUoKTsKLSAgICByZXR1cm4gcE1vZGVsTm9kZS0+VHJ5TmFtZXNwYWNlKHdzTmFtZXNwYWNlKTsKK3NpemVfdCBDWEZBX05vZGU6OkNvdW50Q2hpbGRyZW4oWEZBX0VsZW1lbnQgZVR5cGUsIGJvb2wgYk9ubHlDaGlsZCkgeworICBzaXplX3QgY291bnQgPSAwOworICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBtX3BDaGlsZDsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5leHRTaWJsaW5nKCkpIHsKKyAgICBpZiAocE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gZVR5cGUgJiYgZVR5cGUgIT0gWEZBX0VsZW1lbnQ6OlVua25vd24pCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoYk9ubHlDaGlsZCAmJiBIYXNQcm9wZXJ0eShwTm9kZS0+R2V0RWxlbWVudFR5cGUoKSkpCisgICAgICBjb250aW51ZTsKKyAgICArK2NvdW50OwogICB9CisgIHJldHVybiBjb3VudDsKIH0KIAotQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldFByb3BlcnR5KGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQgZVByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNyZWF0ZVByb3BlcnR5KSB7Ci0gIFhGQV9FbGVtZW50IGVUeXBlID0gR2V0RWxlbWVudFR5cGUoKTsKLSAgdWludDMyX3QgZHdQYWNrZXQgPSBHZXRQYWNrZXRJRCgpOwotICBjb25zdCBYRkFfUFJPUEVSVFkqIHBQcm9wZXJ0eSA9Ci0gICAgICBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoZVR5cGUsIGVQcm9wZXJ0eSwgZHdQYWNrZXQpOwotICBpZiAoIXBQcm9wZXJ0eSB8fCBpbmRleCA+PSBwUHJvcGVydHktPnVPY2N1cikKLSAgICByZXR1cm4gbnVsbHB0cjsKK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXRDaGlsZEludGVybmFsKHNpemVfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50IGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiT25seUNoaWxkKSB7CisgIHNpemVfdCBjb3VudCA9IDA7CisgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcENoaWxkOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0TmV4dFNpYmxpbmcoKSkgeworICAgIGlmIChwTm9kZS0+R2V0RWxlbWVudFR5cGUoKSAhPSBlVHlwZSAmJiBlVHlwZSAhPSBYRkFfRWxlbWVudDo6VW5rbm93bikKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChiT25seUNoaWxkICYmIEhhc1Byb3BlcnR5KHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmIChjb3VudCA9PSBpbmRleCkKKyAgICAgIHJldHVybiBwTm9kZTsKIAotICBDWEZBX05vZGUqIHBOb2RlID0gbV9wQ2hpbGQ7Ci0gIGludDMyX3QgaUNvdW50ID0gMDsKLSAgZm9yICg7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7Ci0gICAgaWYgKHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IGVQcm9wZXJ0eSkgewotICAgICAgaUNvdW50Kys7Ci0gICAgICBpZiAoaUNvdW50ID4gaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIHBOb2RlOwotICAgICAgfQotICAgIH0KLSAgfQotICBpZiAoIWJDcmVhdGVQcm9wZXJ0eSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBpZiAocFByb3BlcnR5LT51RmxhZ3MgJiBYRkFfUFJPUEVSVFlGTEFHX09uZU9mKSB7Ci0gICAgcE5vZGUgPSBtX3BDaGlsZDsKLSAgICBmb3IgKDsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsKLSAgICAgIGNvbnN0IFhGQV9QUk9QRVJUWSogcEV4aXN0UHJvcGVydHkgPQotICAgICAgICAgIFhGQV9HZXRQcm9wZXJ0eU9mRWxlbWVudChlVHlwZSwgcE5vZGUtPkdldEVsZW1lbnRUeXBlKCksIGR3UGFja2V0KTsKLSAgICAgIGlmIChwRXhpc3RQcm9wZXJ0eSAmJiAocEV4aXN0UHJvcGVydHktPnVGbGFncyAmIFhGQV9QUk9QRVJUWUZMQUdfT25lT2YpKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0gIH0KLQotICBjb25zdCBYRkFfUEFDS0VUSU5GTyogcFBhY2tldCA9IFhGQV9HZXRQYWNrZXRCeUlEKGR3UGFja2V0KTsKLSAgQ1hGQV9Ob2RlKiBwTmV3Tm9kZSA9IG51bGxwdHI7Ci0gIGZvciAoOyBpQ291bnQgPD0gaW5kZXg7IGlDb3VudCsrKSB7Ci0gICAgcE5ld05vZGUgPSBtX3BEb2N1bWVudC0+Q3JlYXRlTm9kZShwUGFja2V0LCBlUHJvcGVydHkpOwotICAgIGlmICghcE5ld05vZGUpCi0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICBJbnNlcnRDaGlsZChwTmV3Tm9kZSwgbnVsbHB0cik7Ci0gICAgcE5ld05vZGUtPlNldEZsYWcoWEZBX05vZGVGbGFnX0luaXRpYWxpemVkLCB0cnVlKTsKLSAgfQotICByZXR1cm4gcE5ld05vZGU7Ci19Ci0KLWludDMyX3QgQ1hGQV9Ob2RlOjpDb3VudENoaWxkcmVuKFhGQV9FbGVtZW50IGVUeXBlLCBib29sIGJPbmx5Q2hpbGQpIHsKLSAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcENoaWxkOwotICBpbnQzMl90IGlDb3VudCA9IDA7Ci0gIGZvciAoOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgewotICAgIGlmIChwTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBlVHlwZSB8fCBlVHlwZSA9PSBYRkFfRWxlbWVudDo6VW5rbm93bikgewotICAgICAgaWYgKGJPbmx5Q2hpbGQpIHsKLSAgICAgICAgY29uc3QgWEZBX1BST1BFUlRZKiBwUHJvcGVydHkgPSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoCi0gICAgICAgICAgICBHZXRFbGVtZW50VHlwZSgpLCBwTm9kZS0+R2V0RWxlbWVudFR5cGUoKSwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOKTsKLSAgICAgICAgaWYgKHBQcm9wZXJ0eSkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpQ291bnQrKzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGlDb3VudDsKLX0KLQotQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldENoaWxkKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQgZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiT25seUNoaWxkKSB7Ci0gIEFTU0VSVChpbmRleCA+IC0xKTsKLSAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcENoaWxkOwotICBpbnQzMl90IGlDb3VudCA9IDA7Ci0gIGZvciAoOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgewotICAgIGlmIChwTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBlVHlwZSB8fCBlVHlwZSA9PSBYRkFfRWxlbWVudDo6VW5rbm93bikgewotICAgICAgaWYgKGJPbmx5Q2hpbGQpIHsKLSAgICAgICAgY29uc3QgWEZBX1BST1BFUlRZKiBwUHJvcGVydHkgPSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoCi0gICAgICAgICAgICBHZXRFbGVtZW50VHlwZSgpLCBwTm9kZS0+R2V0RWxlbWVudFR5cGUoKSwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOKTsKLSAgICAgICAgaWYgKHBQcm9wZXJ0eSkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpQ291bnQrKzsKLSAgICAgIGlmIChpQ291bnQgPiBpbmRleCkgewotICAgICAgICByZXR1cm4gcE5vZGU7Ci0gICAgICB9Ci0gICAgfQorICAgICsrY291bnQ7CiAgIH0KICAgcmV0dXJuIG51bGxwdHI7CiB9CkBAIC00NDk4LDcgKzg0NCw3IEBACiAgICAgcE5vdGlmeS0+T25DaGlsZEFkZGVkKHRoaXMpOwogCiAgIGlmIChJc05lZWRTYXZpbmdYTUxOb2RlKCkgJiYgcE5vZGUtPm1fcFhNTE5vZGUpIHsKLSAgICBBU1NFUlQoIXBOb2RlLT5tX3BYTUxOb2RlLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6OlBhcmVudCkpOworICAgIEFTU0VSVCghcE5vZGUtPm1fcFhNTE5vZGUtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpQYXJlbnQpKTsKICAgICBtX3BYTUxOb2RlLT5JbnNlcnRDaGlsZE5vZGUocE5vZGUtPm1fcFhNTE5vZGUsIGluZGV4KTsKICAgICBwTm9kZS0+Q2xlYXJGbGFnKFhGQV9Ob2RlRmxhZ19Pd25YTUxOb2RlKTsKICAgfQpAQCAtNDUwOCw3ICs4NTQsNyBAQAogYm9vbCBDWEZBX05vZGU6Okluc2VydENoaWxkKENYRkFfTm9kZSogcE5vZGUsIENYRkFfTm9kZSogcEJlZm9yZU5vZGUpIHsKICAgaWYgKCFwTm9kZSB8fCBwTm9kZS0+bV9wUGFyZW50IHx8CiAgICAgICAocEJlZm9yZU5vZGUgJiYgcEJlZm9yZU5vZGUtPm1fcFBhcmVudCAhPSB0aGlzKSkgewotICAgIEFTU0VSVChmYWxzZSk7CisgICAgTk9UUkVBQ0hFRCgpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogICBib29sIHJldCA9IG1fcERvY3VtZW50LT5SZW1vdmVQdXJnZU5vZGUocE5vZGUpOwpAQCAtNDU0NSw3ICs4OTEsNyBAQAogICAgIHBOb3RpZnktPk9uQ2hpbGRBZGRlZCh0aGlzKTsKIAogICBpZiAoSXNOZWVkU2F2aW5nWE1MTm9kZSgpICYmIHBOb2RlLT5tX3BYTUxOb2RlKSB7Ci0gICAgQVNTRVJUKCFwTm9kZS0+bV9wWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZERV9YTUxOb2RlOjpQYXJlbnQpKTsKKyAgICBBU1NFUlQoIXBOb2RlLT5tX3BYTUxOb2RlLT5HZXROb2RlSXRlbShDRlhfWE1MTm9kZTo6UGFyZW50KSk7CiAgICAgbV9wWE1MTm9kZS0+SW5zZXJ0Q2hpbGROb2RlKHBOb2RlLT5tX3BYTUxOb2RlLCBuSW5kZXgpOwogICAgIHBOb2RlLT5DbGVhckZsYWcoWEZBX05vZGVGbGFnX093blhNTE5vZGUpOwogICB9CkBAIC00NTY3LDcgKzkxMyw3IEBACiAKIGJvb2wgQ1hGQV9Ob2RlOjpSZW1vdmVDaGlsZChDWEZBX05vZGUqIHBOb2RlLCBib29sIGJOb3RpZnkpIHsKICAgaWYgKCFwTm9kZSB8fCBwTm9kZS0+bV9wUGFyZW50ICE9IHRoaXMpIHsKLSAgICBBU1NFUlQoZmFsc2UpOworICAgIE5PVFJFQUNIRUQoKTsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KICAgaWYgKG1fcENoaWxkID09IHBOb2RlKSB7CkBAIC00NTkzLDIzICs5MzksMjYgQEAKICAgaWYgKElzTmVlZFNhdmluZ1hNTE5vZGUoKSAmJiBwTm9kZS0+bV9wWE1MTm9kZSkgewogICAgIGlmIChwTm9kZS0+SXNBdHRyaWJ1dGVJblhNTCgpKSB7CiAgICAgICBBU1NFUlQocE5vZGUtPm1fcFhNTE5vZGUgPT0gbV9wWE1MTm9kZSAmJgotICAgICAgICAgICAgIG1fcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KTsKLSAgICAgIGlmIChwTm9kZS0+bV9wWE1MTm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsKLSAgICAgICAgQ0ZERV9YTUxFbGVtZW50KiBwWE1MRWxlbWVudCA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwTm9kZS0+bV9wWE1MTm9kZSk7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c0F0dHJpYnV0ZU5hbWUgPQotICAgICAgICAgICAgcE5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfUXVhbGlmaWVkTmFtZSk7CisgICAgICAgICAgICAgbV9wWE1MTm9kZS0+R2V0VHlwZSgpID09IEZYX1hNTE5PREVfRWxlbWVudCk7CisgICAgICBpZiAocE5vZGUtPm1fcFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGWF9YTUxOT0RFX0VsZW1lbnQpIHsKKyAgICAgICAgQ0ZYX1hNTEVsZW1lbnQqIHBYTUxFbGVtZW50ID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PENGWF9YTUxFbGVtZW50Kj4ocE5vZGUtPm1fcFhNTE5vZGUpOworICAgICAgICBXaWRlU3RyaW5nIHdzQXR0cmlidXRlTmFtZSA9CisgICAgICAgICAgICBwTm9kZS0+SlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6UXVhbGlmaWVkTmFtZSk7CiAgICAgICAgIHBYTUxFbGVtZW50LT5SZW1vdmVBdHRyaWJ1dGUod3NBdHRyaWJ1dGVOYW1lLmNfc3RyKCkpOwogICAgICAgfQotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOwotICAgICAgcE5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSwgZmFsc2UpOwotICAgICAgQ0ZERV9YTUxFbGVtZW50KiBwTmV3WE1MRWxlbWVudCA9IG5ldyBDRkRFX1hNTEVsZW1lbnQod3NOYW1lKTsKLSAgICAgIENGWF9XaWRlU3RyaW5nQyB3c1ZhbHVlID0gR2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSk7Ci0gICAgICBpZiAoIXdzVmFsdWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgIHBOZXdYTUxFbGVtZW50LT5TZXRUZXh0RGF0YShDRlhfV2lkZVN0cmluZyh3c1ZhbHVlKSk7Ci0gICAgICB9CisKKyAgICAgIFdpZGVTdHJpbmcgd3NOYW1lID0gcE5vZGUtPkpTT2JqZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+VHJ5QXR0cmlidXRlKFhGQV9BdHRyaWJ1dGU6Ok5hbWUsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlX29yKFdpZGVTdHJpbmcoKSk7CisgICAgICBDRlhfWE1MRWxlbWVudCogcE5ld1hNTEVsZW1lbnQgPSBuZXcgQ0ZYX1hNTEVsZW1lbnQod3NOYW1lKTsKKyAgICAgIFdpZGVTdHJpbmcgd3NWYWx1ZSA9IEpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6OlZhbHVlKTsKKyAgICAgIGlmICghd3NWYWx1ZS5Jc0VtcHR5KCkpCisgICAgICAgIHBOZXdYTUxFbGVtZW50LT5TZXRUZXh0RGF0YShXaWRlU3RyaW5nKHdzVmFsdWUpKTsKKwogICAgICAgcE5vZGUtPm1fcFhNTE5vZGUgPSBwTmV3WE1MRWxlbWVudDsKLSAgICAgIHBOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfQ29udGFpbnMsIFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd24pOworICAgICAgcE5vZGUtPkpTT2JqZWN0KCktPlNldEVudW0oWEZBX0F0dHJpYnV0ZTo6Q29udGFpbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlRW51bTo6VW5rbm93biwgZmFsc2UpOwogICAgIH0gZWxzZSB7CiAgICAgICBtX3BYTUxOb2RlLT5SZW1vdmVDaGlsZE5vZGUocE5vZGUtPm1fcFhNTE5vZGUpOwogICAgIH0KQEAgLTQ2MTgsMTMgKzk2NywxMyBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldEZpcnN0Q2hpbGRCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIGNvbnN0IHsKK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXRGaXJzdENoaWxkQnlOYW1lKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c05hbWUpIGNvbnN0IHsKICAgcmV0dXJuIEdldEZpcnN0Q2hpbGRCeU5hbWUoRlhfSGFzaENvZGVfR2V0Vyh3c05hbWUsIGZhbHNlKSk7CiB9CiAKIENYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXRGaXJzdENoaWxkQnlOYW1lKHVpbnQzMl90IGR3TmFtZUhhc2gpIGNvbnN0IHsKLSAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwTm9kZTsKLSAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7CisgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldEZpcnN0Q2hpbGQoKTsgcE5vZGU7CisgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0TmV4dFNpYmxpbmcoKSkgewogICAgIGlmIChwTm9kZS0+R2V0TmFtZUhhc2goKSA9PSBkd05hbWVIYXNoKSB7CiAgICAgICByZXR1cm4gcE5vZGU7CiAgICAgfQpAQCAtNDYzMiw5ICs5ODEsOSBAQAogICByZXR1cm4gbnVsbHB0cjsKIH0KIAotQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50IGVUeXBlKSBjb25zdCB7Ci0gIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsgcE5vZGU7Ci0gICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgeworQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldEZpcnN0Q2hpbGRCeUNsYXNzSW50ZXJuYWwoWEZBX0VsZW1lbnQgZVR5cGUpIGNvbnN0IHsKKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gR2V0Rmlyc3RDaGlsZCgpOyBwTm9kZTsKKyAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROZXh0U2libGluZygpKSB7CiAgICAgaWYgKHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IGVUeXBlKSB7CiAgICAgICByZXR1cm4gcE5vZGU7CiAgICAgfQpAQCAtNDY0Myw4ICs5OTIsOCBAQAogfQogCiBDWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0TmV4dFNhbWVOYW1lU2libGluZyh1aW50MzJfdCBkd05hbWVIYXNoKSBjb25zdCB7Ci0gIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7IHBOb2RlOwotICAgICAgIHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsKKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gR2V0TmV4dFNpYmxpbmcoKTsgcE5vZGU7CisgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0TmV4dFNpYmxpbmcoKSkgewogICAgIGlmIChwTm9kZS0+R2V0TmFtZUhhc2goKSA9PSBkd05hbWVIYXNoKSB7CiAgICAgICByZXR1cm4gcE5vZGU7CiAgICAgfQpAQCAtNDY1MiwxNCArMTAwMSwxNCBAQAogICByZXR1cm4gbnVsbHB0cjsKIH0KIAotQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldE5leHRTYW1lTmFtZVNpYmxpbmcoCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05vZGVOYW1lKSBjb25zdCB7CitDWEZBX05vZGUqIENYRkFfTm9kZTo6R2V0TmV4dFNhbWVOYW1lU2libGluZ0ludGVybmFsKAorICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c05vZGVOYW1lKSBjb25zdCB7CiAgIHJldHVybiBHZXROZXh0U2FtZU5hbWVTaWJsaW5nKEZYX0hhc2hDb2RlX0dldFcod3NOb2RlTmFtZSwgZmFsc2UpKTsKIH0KIAotQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldE5leHRTYW1lQ2xhc3NTaWJsaW5nKFhGQV9FbGVtZW50IGVUeXBlKSBjb25zdCB7Ci0gIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7IHBOb2RlOwotICAgICAgIHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsKK0NYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXROZXh0U2FtZUNsYXNzU2libGluZ0ludGVybmFsKFhGQV9FbGVtZW50IGVUeXBlKSBjb25zdCB7CisgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldE5leHRTaWJsaW5nKCk7IHBOb2RlOworICAgICAgIHBOb2RlID0gcE5vZGUtPkdldE5leHRTaWJsaW5nKCkpIHsKICAgICBpZiAocE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gZVR5cGUpIHsKICAgICAgIHJldHVybiBwTm9kZTsKICAgICB9CkBAIC00NjY4LDcgKzEwMTcsNyBAQAogfQogCiBpbnQzMl90IENYRkFfTm9kZTo6R2V0Tm9kZVNhbWVOYW1lSW5kZXgoKSBjb25zdCB7Ci0gIENYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQgPSBtX3BEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpOworICBDRlhKU0VfRW5naW5lKiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7CiAgIGlmICghcFNjcmlwdENvbnRleHQpIHsKICAgICByZXR1cm4gLTE7CiAgIH0KQEAgLTQ2NzYsNDAgKzEwMjUsMzMgQEAKIH0KIAogaW50MzJfdCBDWEZBX05vZGU6OkdldE5vZGVTYW1lQ2xhc3NJbmRleCgpIGNvbnN0IHsKLSAgQ1hGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7CisgIENGWEpTRV9FbmdpbmUqIHBTY3JpcHRDb250ZXh0ID0gbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKTsKICAgaWYgKCFwU2NyaXB0Q29udGV4dCkgewogICAgIHJldHVybiAtMTsKICAgfQogICByZXR1cm4gcFNjcmlwdENvbnRleHQtPkdldEluZGV4QnlDbGFzc05hbWUoY29uc3RfY2FzdDxDWEZBX05vZGUqPih0aGlzKSk7CiB9CiAKLXZvaWQgQ1hGQV9Ob2RlOjpHZXRTT01FeHByZXNzaW9uKENGWF9XaWRlU3RyaW5nJiB3c1NPTUV4cHJlc3Npb24pIHsKLSAgQ1hGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7Ci0gIGlmICghcFNjcmlwdENvbnRleHQpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgcFNjcmlwdENvbnRleHQtPkdldFNvbUV4cHJlc3Npb24odGhpcywgd3NTT01FeHByZXNzaW9uKTsKLX0KLQogQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldEluc3RhbmNlTWdyT2ZTdWJmb3JtKCkgewogICBDWEZBX05vZGUqIHBJbnN0YW5jZU1nciA9IG51bGxwdHI7Ci0gIGlmIChtX2VQYWNrZXQgPT0gWEZBX1hEUFBBQ0tFVF9Gb3JtKSB7Ci0gICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOworICBpZiAobV9lUGFja2V0ID09IFhGQV9QYWNrZXRUeXBlOjpGb3JtKSB7CisgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IEdldFBhcmVudCgpOwogICAgIGlmICghcFBhcmVudE5vZGUgfHwgcFBhcmVudE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkFyZWEpIHsKICAgICAgIHJldHVybiBwSW5zdGFuY2VNZ3I7CiAgICAgfQotICAgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QcmV2U2libGluZyk7IHBOb2RlOwotICAgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1ByZXZTaWJsaW5nKSkgeworICAgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldFByZXZTaWJsaW5nKCk7IHBOb2RlOworICAgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0UHJldlNpYmxpbmcoKSkgewogICAgICAgWEZBX0VsZW1lbnQgZVR5cGUgPSBwTm9kZS0+R2V0RWxlbWVudFR5cGUoKTsKICAgICAgIGlmICgoZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm0gfHwgZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm1TZXQpICYmCiAgICAgICAgICAgcE5vZGUtPm1fZHdOYW1lSGFzaCAhPSBtX2R3TmFtZUhhc2gpIHsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBpZiAoZVR5cGUgPT0gWEZBX0VsZW1lbnQ6Okluc3RhbmNlTWFuYWdlcikgewotICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NOYW1lID0gR2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzSW5zdE5hbWUgPSBwTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsKLSAgICAgICAgaWYgKHdzSW5zdE5hbWUuR2V0TGVuZ3RoKCkgPiAwICYmIHdzSW5zdE5hbWUuR2V0QXQoMCkgPT0gJ18nICYmCi0gICAgICAgICAgICB3c0luc3ROYW1lLk1pZCgxKSA9PSB3c05hbWUpIHsKKyAgICAgICAgV2lkZVN0cmluZyB3c05hbWUgPSBKU09iamVjdCgpLT5HZXRDRGF0YShYRkFfQXR0cmlidXRlOjpOYW1lKTsKKyAgICAgICAgV2lkZVN0cmluZyB3c0luc3ROYW1lID0KKyAgICAgICAgICAgIHBOb2RlLT5KU09iamVjdCgpLT5HZXRDRGF0YShYRkFfQXR0cmlidXRlOjpOYW1lKTsKKyAgICAgICAgaWYgKHdzSW5zdE5hbWUuR2V0TGVuZ3RoKCkgPiAwICYmIHdzSW5zdE5hbWVbMF0gPT0gJ18nICYmCisgICAgICAgICAgICB3c0luc3ROYW1lLlJpZ2h0KHdzSW5zdE5hbWUuR2V0TGVuZ3RoKCkgLSAxKSA9PSB3c05hbWUpIHsKICAgICAgICAgICBwSW5zdGFuY2VNZ3IgPSBwTm9kZTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKQEAgLTQ3MTksOCArMTA2MSw4IEBACiAgIHJldHVybiBwSW5zdGFuY2VNZ3I7CiB9CiAKLUNYRkFfTm9kZSogQ1hGQV9Ob2RlOjpHZXRPY2N1ck5vZGUoKSB7Ci0gIHJldHVybiBHZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRWxlbWVudDo6T2NjdXIpOworQ1hGQV9PY2N1ciogQ1hGQV9Ob2RlOjpHZXRPY2N1cklmRXhpc3RzKCkgeworICByZXR1cm4gR2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9PY2N1cj4oWEZBX0VsZW1lbnQ6Ok9jY3VyKTsKIH0KIAogYm9vbCBDWEZBX05vZGU6Okhhc0ZsYWcoWEZBX05vZGVGbGFnIGR3RmxhZykgY29uc3QgewpAQCAtNDc0NSw4ICsxMDg3LDE5IEBACiAgIG1fdU5vZGVGbGFncyAmPSB+ZHdGbGFnOwogfQogCit2b2lkIENYRkFfTm9kZTo6UmVsZWFzZUJpbmRpbmdOb2RlcygpIHsKKyAgLy8gQ2xlYXIgYW55IGJpbmRpbmcgbm9kZXMgYXMgd2UgZG9uJ3QgbmVjZXNzYXJpbHkgZGVzdHJ1Y3QgaW4gYW4gb3JkZXIgdGhhdAorICAvLyBtYWtlcyBzZW5zZS4KKyAgZm9yIChhdXRvJiBub2RlIDogYmluZGluZ19ub2Rlc18pCisgICAgbm9kZS5SZWxlYXNlKCk7CisKKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gbV9wQ2hpbGQ7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5tX3BOZXh0KQorICAgIHBOb2RlLT5SZWxlYXNlQmluZGluZ05vZGVzKCk7Cit9CisKIGJvb2wgQ1hGQV9Ob2RlOjpJc0F0dHJpYnV0ZUluWE1MKCkgewotICByZXR1cm4gR2V0RW51bShYRkFfQVRUUklCVVRFX0NvbnRhaW5zKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9NZXRhRGF0YTsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6Q29udGFpbnMpID09CisgICAgICAgICBYRkFfQXR0cmlidXRlRW51bTo6TWV0YURhdGE7CiB9CiAKIHZvaWQgQ1hGQV9Ob2RlOjpPblJlbW92ZWQoYm9vbCBiTm90aWZ5KSB7CkBAIC00NzU4LDM3NiArMTExMSwxMTA0IEBACiAgICAgcE5vdGlmeS0+T25DaGlsZFJlbW92ZWQoKTsKIH0KIAotdm9pZCBDWEZBX05vZGU6Ok9uQ2hhbmdpbmcoWEZBX0FUVFJJQlVURSBlQXR0ciwgYm9vbCBiTm90aWZ5KSB7Ci0gIGlmIChiTm90aWZ5ICYmIElzSW5pdGlhbGl6ZWQoKSkgewotICAgIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBtX3BEb2N1bWVudC0+R2V0Tm90aWZ5KCk7Ci0gICAgaWYgKHBOb3RpZnkpIHsKLSAgICAgIHBOb3RpZnktPk9uVmFsdWVDaGFuZ2luZyh0aGlzLCBlQXR0cik7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpPbkNoYW5nZWQoWEZBX0FUVFJJQlVURSBlQXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTY3JpcHRNb2RpZnkpIHsKLSAgaWYgKGJOb3RpZnkgJiYgSXNJbml0aWFsaXplZCgpKSB7Ci0gICAgU2NyaXB0X0F0dHJpYnV0ZV9TZW5kQXR0cmlidXRlQ2hhbmdlTWVzc2FnZShlQXR0ciwgYlNjcmlwdE1vZGlmeSk7Ci0gIH0KLX0KLQotaW50MzJfdCBDWEZBX05vZGU6OmV4ZWNTaW5nbGVFdmVudEJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRXZlbnROYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudCBlVHlwZSkgewotICBpbnQzMl90IGlSZXQgPSBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKLSAgY29uc3QgWEZBX0V4ZWNFdmVudFBhcmFJbmZvKiBldmVudFBhcmFJbmZvID0KLSAgICAgIEdldEV2ZW50UGFyYUluZm9CeU5hbWUod3NFdmVudE5hbWUpOwotICBpZiAoZXZlbnRQYXJhSW5mbykgewotICAgIHVpbnQzMl90IHZhbGlkRmxhZ3MgPSBldmVudFBhcmFJbmZvLT5tX3ZhbGlkRmxhZ3M7Ci0gICAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IG1fcERvY3VtZW50LT5HZXROb3RpZnkoKTsKLSAgICBpZiAoIXBOb3RpZnkpIHsKLSAgICAgIHJldHVybiBpUmV0OwotICAgIH0KLSAgICBpZiAodmFsaWRGbGFncyA9PSAxKSB7Ci0gICAgICBpUmV0ID0gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgZXZlbnRQYXJhSW5mby0+bV9ldmVudFR5cGUpOwotICAgIH0gZWxzZSBpZiAodmFsaWRGbGFncyA9PSAyKSB7Ci0gICAgICBpUmV0ID0gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgZXZlbnRQYXJhSW5mby0+bV9ldmVudFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKLSAgICB9IGVsc2UgaWYgKHZhbGlkRmxhZ3MgPT0gMykgewotICAgICAgaWYgKGVUeXBlID09IFhGQV9FbGVtZW50OjpTdWJmb3JtKSB7Ci0gICAgICAgIGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBldmVudFBhcmFJbmZvLT5tX2V2ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh2YWxpZEZsYWdzID09IDQpIHsKLSAgICAgIGlmIChlVHlwZSA9PSBYRkFfRWxlbWVudDo6RXhjbEdyb3VwIHx8IGVUeXBlID09IFhGQV9FbGVtZW50OjpGaWVsZCkgewotICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7Ci0gICAgICAgIGlmIChwUGFyZW50Tm9kZSAmJgotICAgICAgICAgICAgcFBhcmVudE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkV4Y2xHcm91cCkgewotICAgICAgICAgIGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBldmVudFBhcmFJbmZvLT5tX2V2ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBpUmV0ID0gcE5vdGlmeS0+RXhlY0V2ZW50QnlEZWVwRmlyc3QodGhpcywgZXZlbnRQYXJhSW5mby0+bV9ldmVudFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodmFsaWRGbGFncyA9PSA1KSB7Ci0gICAgICBpZiAoZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OkZpZWxkKSB7Ci0gICAgICAgIGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBldmVudFBhcmFJbmZvLT5tX2V2ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmICh2YWxpZEZsYWdzID09IDYpIHsKLSAgICAgIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBHZXRXaWRnZXREYXRhKCk7Ci0gICAgICBpZiAocFdpZGdldERhdGEpIHsKLSAgICAgICAgQ1hGQV9Ob2RlKiBwVUlOb2RlID0gcFdpZGdldERhdGEtPkdldFVJQ2hpbGQoKTsKLSAgICAgICAgaWYgKHBVSU5vZGUtPm1fZWxlbWVudFR5cGUgPT0gWEZBX0VsZW1lbnQ6OlNpZ25hdHVyZSkgewotICAgICAgICAgIGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBldmVudFBhcmFJbmZvLT5tX2V2ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSBpZiAodmFsaWRGbGFncyA9PSA3KSB7Ci0gICAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gR2V0V2lkZ2V0RGF0YSgpOwotICAgICAgaWYgKHBXaWRnZXREYXRhKSB7Ci0gICAgICAgIENYRkFfTm9kZSogcFVJTm9kZSA9IHBXaWRnZXREYXRhLT5HZXRVSUNoaWxkKCk7Ci0gICAgICAgIGlmICgocFVJTm9kZS0+bV9lbGVtZW50VHlwZSA9PSBYRkFfRWxlbWVudDo6Q2hvaWNlTGlzdCkgJiYKLSAgICAgICAgICAgICghcFdpZGdldERhdGEtPklzTGlzdEJveCgpKSkgewotICAgICAgICAgIGlSZXQgPSBwTm90aWZ5LT5FeGVjRXZlbnRCeURlZXBGaXJzdCh0aGlzLCBldmVudFBhcmFJbmZvLT5tX2V2ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gaVJldDsKLX0KLQogdm9pZCBDWEZBX05vZGU6OlVwZGF0ZU5hbWVIYXNoKCkgewotICBjb25zdCBYRkFfTk9UU1VSRUFUVFJJQlVURSogcE5vdHN1cmUgPQotICAgICAgWEZBX0dldE5vdHN1cmVBdHRyaWJ1dGUoR2V0RWxlbWVudFR5cGUoKSwgWEZBX0FUVFJJQlVURV9OYW1lKTsKLSAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZTsKLSAgaWYgKCFwTm90c3VyZSB8fCBwTm90c3VyZS0+ZVR5cGUgPT0gWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEpIHsKLSAgICB3c05hbWUgPSBHZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOwotICAgIG1fZHdOYW1lSGFzaCA9IEZYX0hhc2hDb2RlX0dldFcod3NOYW1lLCBmYWxzZSk7Ci0gIH0gZWxzZSBpZiAocE5vdHN1cmUtPmVUeXBlID09IFhGQV9BVFRSSUJVVEVUWVBFX0VudW0pIHsKLSAgICB3c05hbWUgPSBHZXRBdHRyaWJ1dGVFbnVtQnlJRChHZXRFbnVtKFhGQV9BVFRSSUJVVEVfTmFtZSkpLT5wTmFtZTsKLSAgICBtX2R3TmFtZUhhc2ggPSBGWF9IYXNoQ29kZV9HZXRXKHdzTmFtZSwgZmFsc2UpOwotICB9CisgIFdpZGVTdHJpbmcgd3NOYW1lID0gSlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6TmFtZSk7CisgIG1fZHdOYW1lSGFzaCA9IEZYX0hhc2hDb2RlX0dldFcod3NOYW1lLkFzU3RyaW5nVmlldygpLCBmYWxzZSk7CiB9CiAKLUNGREVfWE1MTm9kZSogQ1hGQV9Ob2RlOjpDcmVhdGVYTUxNYXBwaW5nTm9kZSgpIHsKK0NGWF9YTUxOb2RlKiBDWEZBX05vZGU6OkNyZWF0ZVhNTE1hcHBpbmdOb2RlKCkgewogICBpZiAoIW1fcFhNTE5vZGUpIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1RhZyhHZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpKTsKLSAgICBtX3BYTUxOb2RlID0gbmV3IENGREVfWE1MRWxlbWVudCh3c1RhZyk7CisgICAgV2lkZVN0cmluZyB3c1RhZyhKU09iamVjdCgpLT5HZXRDRGF0YShYRkFfQXR0cmlidXRlOjpOYW1lKSk7CisgICAgbV9wWE1MTm9kZSA9IG5ldyBDRlhfWE1MRWxlbWVudCh3c1RhZyk7CiAgICAgU2V0RmxhZyhYRkFfTm9kZUZsYWdfT3duWE1MTm9kZSwgZmFsc2UpOwogICB9CiAgIHJldHVybiBtX3BYTUxOb2RlOwogfQogCiBib29sIENYRkFfTm9kZTo6SXNOZWVkU2F2aW5nWE1MTm9kZSgpIHsKLSAgcmV0dXJuIG1fcFhNTE5vZGUgJiYgKEdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cyB8fAorICByZXR1cm4gbV9wWE1MTm9kZSAmJiAoR2V0UGFja2V0VHlwZSgpID09IFhGQV9QYWNrZXRUeXBlOjpEYXRhc2V0cyB8fAogICAgICAgICAgICAgICAgICAgICAgICAgR2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6WGZhKTsKIH0KIAotWEZBX01BUE1PRFVMRURBVEEqIENYRkFfTm9kZTo6Q3JlYXRlTWFwTW9kdWxlRGF0YSgpIHsKLSAgaWYgKCFtX3BNYXBNb2R1bGVEYXRhKQotICAgIG1fcE1hcE1vZHVsZURhdGEgPSBuZXcgWEZBX01BUE1PRFVMRURBVEE7Ci0gIHJldHVybiBtX3BNYXBNb2R1bGVEYXRhOworQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldEl0ZW1JZkV4aXN0cyhpbnQzMl90IGlJbmRleCkgeworICBpbnQzMl90IGlDb3VudCA9IDA7CisgIHVpbnQzMl90IGR3TmFtZUhhc2ggPSAwOworICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBHZXROZXh0U2libGluZygpOyBwTm9kZTsKKyAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROZXh0U2libGluZygpKSB7CisgICAgWEZBX0VsZW1lbnQgZUN1clR5cGUgPSBwTm9kZS0+R2V0RWxlbWVudFR5cGUoKTsKKyAgICBpZiAoZUN1clR5cGUgPT0gWEZBX0VsZW1lbnQ6Okluc3RhbmNlTWFuYWdlcikKKyAgICAgIGJyZWFrOworICAgIGlmICgoZUN1clR5cGUgIT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm0pICYmCisgICAgICAgIChlQ3VyVHlwZSAhPSBYRkFfRWxlbWVudDo6U3ViZm9ybVNldCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoaUNvdW50ID09IDApIHsKKyAgICAgIFdpZGVTdHJpbmcgd3NOYW1lID0gcE5vZGUtPkpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6Ok5hbWUpOworICAgICAgV2lkZVN0cmluZyB3c0luc3ROYW1lID0gSlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6TmFtZSk7CisgICAgICBpZiAod3NJbnN0TmFtZS5HZXRMZW5ndGgoKSA8IDEgfHwgd3NJbnN0TmFtZVswXSAhPSAnXycgfHwKKyAgICAgICAgICB3c0luc3ROYW1lLlJpZ2h0KHdzSW5zdE5hbWUuR2V0TGVuZ3RoKCkgLSAxKSAhPSB3c05hbWUpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICB9CisgICAgICBkd05hbWVIYXNoID0gcE5vZGUtPkdldE5hbWVIYXNoKCk7CisgICAgfQorICAgIGlmIChkd05hbWVIYXNoICE9IHBOb2RlLT5HZXROYW1lSGFzaCgpKQorICAgICAgYnJlYWs7CisKKyAgICBpQ291bnQrKzsKKyAgICBpZiAoaUNvdW50ID4gaUluZGV4KQorICAgICAgcmV0dXJuIHBOb2RlOworICB9CisgIHJldHVybiBudWxscHRyOwogfQogCi1YRkFfTUFQTU9EVUxFREFUQSogQ1hGQV9Ob2RlOjpHZXRNYXBNb2R1bGVEYXRhKCkgY29uc3QgewotICByZXR1cm4gbV9wTWFwTW9kdWxlRGF0YTsKK2ludDMyX3QgQ1hGQV9Ob2RlOjpHZXRDb3VudCgpIHsKKyAgaW50MzJfdCBpQ291bnQgPSAwOworICB1aW50MzJfdCBkd05hbWVIYXNoID0gMDsKKyAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gR2V0TmV4dFNpYmxpbmcoKTsgcE5vZGU7CisgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0TmV4dFNpYmxpbmcoKSkgeworICAgIFhGQV9FbGVtZW50IGVDdXJUeXBlID0gcE5vZGUtPkdldEVsZW1lbnRUeXBlKCk7CisgICAgaWYgKGVDdXJUeXBlID09IFhGQV9FbGVtZW50OjpJbnN0YW5jZU1hbmFnZXIpCisgICAgICBicmVhazsKKyAgICBpZiAoKGVDdXJUeXBlICE9IFhGQV9FbGVtZW50OjpTdWJmb3JtKSAmJgorICAgICAgICAoZUN1clR5cGUgIT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm1TZXQpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKGlDb3VudCA9PSAwKSB7CisgICAgICBXaWRlU3RyaW5nIHdzTmFtZSA9IHBOb2RlLT5KU09iamVjdCgpLT5HZXRDRGF0YShYRkFfQXR0cmlidXRlOjpOYW1lKTsKKyAgICAgIFdpZGVTdHJpbmcgd3NJbnN0TmFtZSA9IEpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6Ok5hbWUpOworICAgICAgaWYgKHdzSW5zdE5hbWUuR2V0TGVuZ3RoKCkgPCAxIHx8IHdzSW5zdE5hbWVbMF0gIT0gJ18nIHx8CisgICAgICAgICAgd3NJbnN0TmFtZS5SaWdodCh3c0luc3ROYW1lLkdldExlbmd0aCgpIC0gMSkgIT0gd3NOYW1lKSB7CisgICAgICAgIHJldHVybiBpQ291bnQ7CisgICAgICB9CisgICAgICBkd05hbWVIYXNoID0gcE5vZGUtPkdldE5hbWVIYXNoKCk7CisgICAgfQorICAgIGlmIChkd05hbWVIYXNoICE9IHBOb2RlLT5HZXROYW1lSGFzaCgpKQorICAgICAgYnJlYWs7CisKKyAgICBpQ291bnQrKzsKKyAgfQorICByZXR1cm4gaUNvdW50OwogfQogCi12b2lkIENYRkFfTm9kZTo6U2V0TWFwTW9kdWxlVmFsdWUodm9pZCogcEtleSwgdm9pZCogcFZhbHVlKSB7Ci0gIFhGQV9NQVBNT0RVTEVEQVRBKiBwTW9kdWxlID0gQ3JlYXRlTWFwTW9kdWxlRGF0YSgpOwotICBwTW9kdWxlLT5tX1ZhbHVlTWFwW3BLZXldID0gcFZhbHVlOwordm9pZCBDWEZBX05vZGU6Okluc2VydEl0ZW0oQ1hGQV9Ob2RlKiBwTmV3SW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlQb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk1vdmVEYXRhQmluZGluZ05vZGVzKSB7CisgIGlmIChpQ291bnQgPCAwKQorICAgIGlDb3VudCA9IEdldENvdW50KCk7CisgIGlmIChpUG9zIDwgMCkKKyAgICBpUG9zID0gaUNvdW50OworICBpZiAoaVBvcyA9PSBpQ291bnQpIHsKKyAgICBDWEZBX05vZGUqIGl0ZW0gPSBHZXRJdGVtSWZFeGlzdHMoaUNvdW50IC0gMSk7CisgICAgaWYgKCFpdGVtKQorICAgICAgcmV0dXJuOworCisgICAgQ1hGQV9Ob2RlKiBwTmV4dFNpYmxpbmcgPQorICAgICAgICBpQ291bnQgPiAwID8gaXRlbS0+R2V0TmV4dFNpYmxpbmcoKSA6IEdldE5leHRTaWJsaW5nKCk7CisgICAgR2V0UGFyZW50KCktPkluc2VydENoaWxkKHBOZXdJbnN0YW5jZSwgcE5leHRTaWJsaW5nKTsKKyAgICBpZiAoYk1vdmVEYXRhQmluZGluZ05vZGVzKSB7CisgICAgICBzdGQ6OnNldDxDWEZBX05vZGUqPiBzTmV3OworICAgICAgc3RkOjpzZXQ8Q1hGQV9Ob2RlKj4gc0FmdGVyOworICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlPgorICAgICAgICAgIHNJdGVyYXRvck5ldyhwTmV3SW5zdGFuY2UpOworICAgICAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yTmV3LkdldEN1cnJlbnQoKTsgcE5vZGU7CisgICAgICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yTmV3Lk1vdmVUb05leHQoKSkgeworICAgICAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IHBOb2RlLT5HZXRCaW5kRGF0YSgpOworICAgICAgICBpZiAoIXBEYXRhTm9kZSkKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBzTmV3Lmluc2VydChwRGF0YU5vZGUpOworICAgICAgfQorICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlPgorICAgICAgICAgIHNJdGVyYXRvckFmdGVyKHBOZXh0U2libGluZyk7CisgICAgICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBzSXRlcmF0b3JBZnRlci5HZXRDdXJyZW50KCk7IHBOb2RlOworICAgICAgICAgICBwTm9kZSA9IHNJdGVyYXRvckFmdGVyLk1vdmVUb05leHQoKSkgeworICAgICAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IHBOb2RlLT5HZXRCaW5kRGF0YSgpOworICAgICAgICBpZiAoIXBEYXRhTm9kZSkKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBzQWZ0ZXIuaW5zZXJ0KHBEYXRhTm9kZSk7CisgICAgICB9CisgICAgICBSZW9yZGVyRGF0YU5vZGVzKHNOZXcsIHNBZnRlciwgZmFsc2UpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBDWEZBX05vZGUqIHBCZWZvcmVJbnN0YW5jZSA9IEdldEl0ZW1JZkV4aXN0cyhpUG9zKTsKKyAgICBpZiAoIXBCZWZvcmVJbnN0YW5jZSkgeworICAgICAgLy8gVE9ETyhkc2luY2xhaXIpOiBXaGF0IHNob3VsZCBoYXBwZW4gaGVyZT8KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBHZXRQYXJlbnQoKS0+SW5zZXJ0Q2hpbGQocE5ld0luc3RhbmNlLCBwQmVmb3JlSW5zdGFuY2UpOworICAgIGlmIChiTW92ZURhdGFCaW5kaW5nTm9kZXMpIHsKKyAgICAgIHN0ZDo6c2V0PENYRkFfTm9kZSo+IHNOZXc7CisgICAgICBzdGQ6OnNldDxDWEZBX05vZGUqPiBzQmVmb3JlOworICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlPgorICAgICAgICAgIHNJdGVyYXRvck5ldyhwTmV3SW5zdGFuY2UpOworICAgICAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yTmV3LkdldEN1cnJlbnQoKTsgcE5vZGU7CisgICAgICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yTmV3Lk1vdmVUb05leHQoKSkgeworICAgICAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IHBOb2RlLT5HZXRCaW5kRGF0YSgpOworICAgICAgICBpZiAoIXBEYXRhTm9kZSkKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBzTmV3Lmluc2VydChwRGF0YU5vZGUpOworICAgICAgfQorICAgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlPgorICAgICAgICAgIHNJdGVyYXRvckJlZm9yZShwQmVmb3JlSW5zdGFuY2UpOworICAgICAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yQmVmb3JlLkdldEN1cnJlbnQoKTsgcE5vZGU7CisgICAgICAgICAgIHBOb2RlID0gc0l0ZXJhdG9yQmVmb3JlLk1vdmVUb05leHQoKSkgeworICAgICAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IHBOb2RlLT5HZXRCaW5kRGF0YSgpOworICAgICAgICBpZiAoIXBEYXRhTm9kZSkKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBzQmVmb3JlLmluc2VydChwRGF0YU5vZGUpOworICAgICAgfQorICAgICAgUmVvcmRlckRhdGFOb2RlcyhzTmV3LCBzQmVmb3JlLCB0cnVlKTsKKyAgICB9CisgIH0KIH0KIAotYm9vbCBDWEZBX05vZGU6OkdldE1hcE1vZHVsZVZhbHVlKHZvaWQqIHBLZXksIHZvaWQqJiBwVmFsdWUpIHsKLSAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gdGhpczsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldFRlbXBsYXRlTm9kZSgpKSB7Ci0gICAgWEZBX01BUE1PRFVMRURBVEEqIHBNb2R1bGUgPSBwTm9kZS0+R2V0TWFwTW9kdWxlRGF0YSgpOwotICAgIGlmIChwTW9kdWxlKSB7Ci0gICAgICBhdXRvIGl0ID0gcE1vZHVsZS0+bV9WYWx1ZU1hcC5maW5kKHBLZXkpOwotICAgICAgaWYgKGl0ICE9IHBNb2R1bGUtPm1fVmFsdWVNYXAuZW5kKCkpIHsKLSAgICAgICAgcFZhbHVlID0gaXQtPnNlY29uZDsKLSAgICAgICAgcmV0dXJuIHRydWU7Cit2b2lkIENYRkFfTm9kZTo6UmVtb3ZlSXRlbShDWEZBX05vZGUqIHBSZW1vdmVJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJlbW92ZURhdGFCaW5kaW5nKSB7CisgIEdldFBhcmVudCgpLT5SZW1vdmVDaGlsZChwUmVtb3ZlSW5zdGFuY2UsIHRydWUpOworICBpZiAoIWJSZW1vdmVEYXRhQmluZGluZykKKyAgICByZXR1cm47CisKKyAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlPgorICAgICAgc0l0ZXJhdG9yKHBSZW1vdmVJbnN0YW5jZSk7CisgIGZvciAoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUgPSBzSXRlcmF0b3IuR2V0Q3VycmVudCgpOyBwRm9ybU5vZGU7CisgICAgICAgcEZvcm1Ob2RlID0gc0l0ZXJhdG9yLk1vdmVUb05leHQoKSkgeworICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gcEZvcm1Ob2RlLT5HZXRCaW5kRGF0YSgpOworICAgIGlmICghcERhdGFOb2RlKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAocERhdGFOb2RlLT5SZW1vdmVCaW5kSXRlbShwRm9ybU5vZGUpID09IDApIHsKKyAgICAgIGlmIChDWEZBX05vZGUqIHBEYXRhUGFyZW50ID0gcERhdGFOb2RlLT5HZXRQYXJlbnQoKSkgeworICAgICAgICBwRGF0YVBhcmVudC0+UmVtb3ZlQ2hpbGQocERhdGFOb2RlLCB0cnVlKTsKICAgICAgIH0KICAgICB9Ci0gICAgaWYgKHBOb2RlLT5HZXRQYWNrZXRJRCgpID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpCisgICAgcEZvcm1Ob2RlLT5TZXRCaW5kaW5nTm9kZShudWxscHRyKTsKKyAgfQorfQorCitDWEZBX05vZGUqIENYRkFfTm9kZTo6Q3JlYXRlSW5zdGFuY2VJZlBvc3NpYmxlKGJvb2wgYkRhdGFNZXJnZSkgeworICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBHZXREb2N1bWVudCgpOworICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUgPSBHZXRUZW1wbGF0ZU5vZGVJZkV4aXN0cygpOworICBpZiAoIXBUZW1wbGF0ZU5vZGUpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgQ1hGQV9Ob2RlKiBwRm9ybVBhcmVudCA9IEdldFBhcmVudCgpOworICBDWEZBX05vZGUqIHBEYXRhU2NvcGUgPSBudWxscHRyOworICBmb3IgKENYRkFfTm9kZSogcFJvb3RCb3VuZE5vZGUgPSBwRm9ybVBhcmVudDsKKyAgICAgICBwUm9vdEJvdW5kTm9kZSAmJiBwUm9vdEJvdW5kTm9kZS0+SXNDb250YWluZXJOb2RlKCk7CisgICAgICAgcFJvb3RCb3VuZE5vZGUgPSBwUm9vdEJvdW5kTm9kZS0+R2V0UGFyZW50KCkpIHsKKyAgICBwRGF0YVNjb3BlID0gcFJvb3RCb3VuZE5vZGUtPkdldEJpbmREYXRhKCk7CisgICAgaWYgKHBEYXRhU2NvcGUpCiAgICAgICBicmVhazsKICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlOjpTZXRNYXBNb2R1bGVTdHJpbmcodm9pZCogcEtleSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlKSB7Ci0gIFNldE1hcE1vZHVsZUJ1ZmZlcihwS2V5LCAodm9pZCopd3NWYWx1ZS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgd3NWYWx1ZS5HZXRMZW5ndGgoKSAqIHNpemVvZihGWF9XQ0hBUikpOwotfQotCi1ib29sIENYRkFfTm9kZTo6R2V0TWFwTW9kdWxlU3RyaW5nKHZvaWQqIHBLZXksIENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSkgewotICB2b2lkKiBwVmFsdWU7Ci0gIGludDMyX3QgaUJ5dGVzOwotICBpZiAoIUdldE1hcE1vZHVsZUJ1ZmZlcihwS2V5LCBwVmFsdWUsIGlCeXRlcykpIHsKLSAgICByZXR1cm4gZmFsc2U7CisgIGlmICghcERhdGFTY29wZSkgeworICAgIHBEYXRhU2NvcGUgPSBUb05vZGUocERvY3VtZW50LT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX1JlY29yZCkpOworICAgIEFTU0VSVChwRGF0YVNjb3BlKTsKICAgfQotICB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmdDKChjb25zdCBGWF9XQ0hBUiopcFZhbHVlLCBpQnl0ZXMgLyBzaXplb2YoRlhfV0NIQVIpKTsKKworICBDWEZBX05vZGUqIHBJbnN0YW5jZSA9IHBEb2N1bWVudC0+RGF0YU1lcmdlX0NvcHlDb250YWluZXIoCisgICAgICBwVGVtcGxhdGVOb2RlLCBwRm9ybVBhcmVudCwgcERhdGFTY29wZSwgdHJ1ZSwgYkRhdGFNZXJnZSwgdHJ1ZSk7CisgIGlmIChwSW5zdGFuY2UpIHsKKyAgICBwRG9jdW1lbnQtPkRhdGFNZXJnZV9VcGRhdGVCaW5kaW5nUmVsYXRpb25zKHBJbnN0YW5jZSk7CisgICAgcEZvcm1QYXJlbnQtPlJlbW92ZUNoaWxkKHBJbnN0YW5jZSwgdHJ1ZSk7CisgIH0KKyAgcmV0dXJuIHBJbnN0YW5jZTsKK30KKworT3B0aW9uYWw8Ym9vbD4gQ1hGQV9Ob2RlOjpHZXREZWZhdWx0Qm9vbGVhbihYRkFfQXR0cmlidXRlIGF0dHIpIGNvbnN0IHsKKyAgT3B0aW9uYWw8dm9pZCo+IHZhbHVlID0gR2V0RGVmYXVsdFZhbHVlKGF0dHIsIFhGQV9BdHRyaWJ1dGVUeXBlOjpCb29sZWFuKTsKKyAgaWYgKCF2YWx1ZSkKKyAgICByZXR1cm4ge307CisgIHJldHVybiB7ISEqdmFsdWV9OworfQorCitPcHRpb25hbDxpbnQzMl90PiBDWEZBX05vZGU6OkdldERlZmF1bHRJbnRlZ2VyKFhGQV9BdHRyaWJ1dGUgYXR0cikgY29uc3QgeworICBPcHRpb25hbDx2b2lkKj4gdmFsdWUgPSBHZXREZWZhdWx0VmFsdWUoYXR0ciwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIpOworICBpZiAoIXZhbHVlKQorICAgIHJldHVybiB7fTsKKyAgcmV0dXJuIHtzdGF0aWNfY2FzdDxpbnQzMl90PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oKnZhbHVlKSl9OworfQorCitPcHRpb25hbDxDWEZBX01lYXN1cmVtZW50PiBDWEZBX05vZGU6OkdldERlZmF1bHRNZWFzdXJlbWVudCgKKyAgICBYRkFfQXR0cmlidXRlIGF0dHIpIGNvbnN0IHsKKyAgT3B0aW9uYWw8dm9pZCo+IHZhbHVlID0gR2V0RGVmYXVsdFZhbHVlKGF0dHIsIFhGQV9BdHRyaWJ1dGVUeXBlOjpNZWFzdXJlKTsKKyAgaWYgKCF2YWx1ZSkKKyAgICByZXR1cm4ge307CisKKyAgV2lkZVN0cmluZyBzdHIgPSBXaWRlU3RyaW5nKHN0YXRpY19jYXN0PGNvbnN0IHdjaGFyX3QqPigqdmFsdWUpKTsKKyAgcmV0dXJuIHtDWEZBX01lYXN1cmVtZW50KHN0ci5Bc1N0cmluZ1ZpZXcoKSl9OworfQorCitPcHRpb25hbDxXaWRlU3RyaW5nPiBDWEZBX05vZGU6OkdldERlZmF1bHRDRGF0YShYRkFfQXR0cmlidXRlIGF0dHIpIGNvbnN0IHsKKyAgT3B0aW9uYWw8dm9pZCo+IHZhbHVlID0gR2V0RGVmYXVsdFZhbHVlKGF0dHIsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSk7CisgIGlmICghdmFsdWUpCisgICAgcmV0dXJuIHt9OworCisgIHJldHVybiB7V2lkZVN0cmluZyhzdGF0aWNfY2FzdDxjb25zdCB3Y2hhcl90Kj4oKnZhbHVlKSl9OworfQorCitPcHRpb25hbDxYRkFfQXR0cmlidXRlRW51bT4gQ1hGQV9Ob2RlOjpHZXREZWZhdWx0RW51bSgKKyAgICBYRkFfQXR0cmlidXRlIGF0dHIpIGNvbnN0IHsKKyAgT3B0aW9uYWw8dm9pZCo+IHZhbHVlID0gR2V0RGVmYXVsdFZhbHVlKGF0dHIsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtKTsKKyAgaWYgKCF2YWx1ZSkKKyAgICByZXR1cm4ge307CisgIHJldHVybiB7c3RhdGljX2Nhc3Q8WEZBX0F0dHJpYnV0ZUVudW0+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PigqdmFsdWUpKX07Cit9CisKK09wdGlvbmFsPHZvaWQqPiBDWEZBX05vZGU6OkdldERlZmF1bHRWYWx1ZShYRkFfQXR0cmlidXRlIGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZVR5cGUgZVR5cGUpIGNvbnN0IHsKKyAgY29uc3QgQXR0cmlidXRlRGF0YSogZGF0YSA9IEdldEF0dHJpYnV0ZURhdGEoYXR0cik7CisgIGlmICghZGF0YSkKKyAgICByZXR1cm4ge307CisgIGlmIChkYXRhLT50eXBlID09IGVUeXBlKQorICAgIHJldHVybiB7ZGF0YS0+ZGVmYXVsdF92YWx1ZX07CisgIHJldHVybiB7fTsKK30KKwordm9pZCBDWEZBX05vZGU6OlNlbmRBdHRyaWJ1dGVDaGFuZ2VNZXNzYWdlKFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTY3JpcHRNb2RpZnkpIHsKKyAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXRQcm8gPSBHZXREb2N1bWVudCgpLT5HZXRMYXlvdXRQcm9jZXNzb3IoKTsKKyAgaWYgKCFwTGF5b3V0UHJvKQorICAgIHJldHVybjsKKworICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gR2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCk7CisgIGlmICghcE5vdGlmeSkKKyAgICByZXR1cm47CisKKyAgaWYgKEdldFBhY2tldFR5cGUoKSAhPSBYRkFfUGFja2V0VHlwZTo6Rm9ybSkgeworICAgIHBOb3RpZnktPk9uVmFsdWVDaGFuZ2VkKHRoaXMsIGVBdHRyaWJ1dGUsIHRoaXMsIHRoaXMpOworICAgIHJldHVybjsKKyAgfQorCisgIGJvb2wgYk5lZWRGaW5kQ29udGFpbmVyID0gZmFsc2U7CisgIHN3aXRjaCAoR2V0RWxlbWVudFR5cGUoKSkgeworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNhcHRpb246CisgICAgICBiTmVlZEZpbmRDb250YWluZXIgPSB0cnVlOworICAgICAgcE5vdGlmeS0+T25WYWx1ZUNoYW5nZWQodGhpcywgZUF0dHJpYnV0ZSwgdGhpcywgR2V0UGFyZW50KCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Rm9udDoKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQYXJhOiB7CisgICAgICBiTmVlZEZpbmRDb250YWluZXIgPSB0cnVlOworICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IEdldFBhcmVudCgpOworICAgICAgaWYgKHBQYXJlbnROb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpDYXB0aW9uKSB7CisgICAgICAgIHBOb3RpZnktPk9uVmFsdWVDaGFuZ2VkKHRoaXMsIGVBdHRyaWJ1dGUsIHBQYXJlbnROb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyZW50Tm9kZS0+R2V0UGFyZW50KCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcE5vdGlmeS0+T25WYWx1ZUNoYW5nZWQodGhpcywgZUF0dHJpYnV0ZSwgdGhpcywgcFBhcmVudE5vZGUpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok1hcmdpbjogeworICAgICAgYk5lZWRGaW5kQ29udGFpbmVyID0gdHJ1ZTsKKyAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUgPSBHZXRQYXJlbnQoKTsKKyAgICAgIFhGQV9FbGVtZW50IGVQYXJlbnRUeXBlID0gcFBhcmVudE5vZGUtPkdldEVsZW1lbnRUeXBlKCk7CisgICAgICBpZiAocFBhcmVudE5vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB7CisgICAgICAgIHBOb3RpZnktPk9uVmFsdWVDaGFuZ2VkKHRoaXMsIGVBdHRyaWJ1dGUsIHRoaXMsIHBQYXJlbnROb2RlKTsKKyAgICAgIH0gZWxzZSBpZiAoZVBhcmVudFR5cGUgPT0gWEZBX0VsZW1lbnQ6OkNhcHRpb24pIHsKKyAgICAgICAgcE5vdGlmeS0+T25WYWx1ZUNoYW5nZWQodGhpcywgZUF0dHJpYnV0ZSwgcFBhcmVudE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJlbnROb2RlLT5HZXRQYXJlbnQoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gcFBhcmVudE5vZGUtPkdldFBhcmVudCgpOworICAgICAgICBpZiAocE5vZGUgJiYgcE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlVpKSB7CisgICAgICAgICAgcE5vdGlmeS0+T25WYWx1ZUNoYW5nZWQodGhpcywgZUF0dHJpYnV0ZSwgcE5vZGUsIHBOb2RlLT5HZXRQYXJlbnQoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDb21iOiB7CisgICAgICBDWEZBX05vZGUqIHBFZGl0Tm9kZSA9IEdldFBhcmVudCgpOworICAgICAgWEZBX0VsZW1lbnQgZVVJVHlwZSA9IHBFZGl0Tm9kZS0+R2V0RWxlbWVudFR5cGUoKTsKKyAgICAgIGlmIChwRWRpdE5vZGUgJiYgKGVVSVR5cGUgPT0gWEZBX0VsZW1lbnQ6OkRhdGVUaW1lRWRpdCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZVVJVHlwZSA9PSBYRkFfRWxlbWVudDo6TnVtZXJpY0VkaXQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVVSVR5cGUgPT0gWEZBX0VsZW1lbnQ6OlRleHRFZGl0KSkgeworICAgICAgICBDWEZBX05vZGUqIHBVSU5vZGUgPSBwRWRpdE5vZGUtPkdldFBhcmVudCgpOworICAgICAgICBpZiAocFVJTm9kZSkgeworICAgICAgICAgIHBOb3RpZnktPk9uVmFsdWVDaGFuZ2VkKHRoaXMsIGVBdHRyaWJ1dGUsIHBVSU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVJTm9kZS0+R2V0UGFyZW50KCkpOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QnV0dG9uOgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJhcmNvZGU6CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q2hvaWNlTGlzdDoKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpEYXRlVGltZUVkaXQ6CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TnVtZXJpY0VkaXQ6CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UGFzc3dvcmRFZGl0OgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRleHRFZGl0OiB7CisgICAgICBDWEZBX05vZGUqIHBVSU5vZGUgPSBHZXRQYXJlbnQoKTsKKyAgICAgIGlmIChwVUlOb2RlKSB7CisgICAgICAgIHBOb3RpZnktPk9uVmFsdWVDaGFuZ2VkKHRoaXMsIGVBdHRyaWJ1dGUsIHBVSU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVSU5vZGUtPkdldFBhcmVudCgpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDaGVja0J1dHRvbjogeworICAgICAgYk5lZWRGaW5kQ29udGFpbmVyID0gdHJ1ZTsKKyAgICAgIENYRkFfTm9kZSogcFVJTm9kZSA9IEdldFBhcmVudCgpOworICAgICAgaWYgKHBVSU5vZGUpIHsKKyAgICAgICAgcE5vdGlmeS0+T25WYWx1ZUNoYW5nZWQodGhpcywgZUF0dHJpYnV0ZSwgcFVJTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFVJTm9kZS0+R2V0UGFyZW50KCkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OktlZXA6CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Qm9va2VuZDoKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpCcmVhazoKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpCcmVha0FmdGVyOgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJyZWFrQmVmb3JlOgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok92ZXJmbG93OgorICAgICAgYk5lZWRGaW5kQ29udGFpbmVyID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkFyZWE6CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RHJhdzoKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpFeGNsR3JvdXA6CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RmllbGQ6CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U3ViZm9ybToKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTdWJmb3JtU2V0OgorICAgICAgcExheW91dFByby0+QWRkQ2hhbmdlZENvbnRhaW5lcih0aGlzKTsKKyAgICAgIHBOb3RpZnktPk9uVmFsdWVDaGFuZ2VkKHRoaXMsIGVBdHRyaWJ1dGUsIHRoaXMsIHRoaXMpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U2hhcnB0ZXh0OgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlNoYXJweG1sOgorICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlNoYXJweEhUTUw6IHsKKyAgICAgIENYRkFfTm9kZSogcFRleHROb2RlID0gR2V0UGFyZW50KCk7CisgICAgICBpZiAoIXBUZXh0Tm9kZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgICBDWEZBX05vZGUqIHBWYWx1ZU5vZGUgPSBwVGV4dE5vZGUtPkdldFBhcmVudCgpOworICAgICAgaWYgKCFwVmFsdWVOb2RlKQorICAgICAgICByZXR1cm47CisKKyAgICAgIFhGQV9FbGVtZW50IGVUeXBlID0gcFZhbHVlTm9kZS0+R2V0RWxlbWVudFR5cGUoKTsKKyAgICAgIGlmIChlVHlwZSA9PSBYRkFfRWxlbWVudDo6VmFsdWUpIHsKKyAgICAgICAgYk5lZWRGaW5kQ29udGFpbmVyID0gdHJ1ZTsKKyAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBWYWx1ZU5vZGUtPkdldFBhcmVudCgpOworICAgICAgICBpZiAocE5vZGUgJiYgcE5vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB7CisgICAgICAgICAgaWYgKGJTY3JpcHRNb2RpZnkpCisgICAgICAgICAgICBwVmFsdWVOb2RlID0gcE5vZGU7CisKKyAgICAgICAgICBwTm90aWZ5LT5PblZhbHVlQ2hhbmdlZCh0aGlzLCBlQXR0cmlidXRlLCBwVmFsdWVOb2RlLCBwTm9kZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcE5vdGlmeS0+T25WYWx1ZUNoYW5nZWQodGhpcywgZUF0dHJpYnV0ZSwgcE5vZGUsIHBOb2RlLT5HZXRQYXJlbnQoKSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChlVHlwZSA9PSBYRkFfRWxlbWVudDo6SXRlbXMpIHsKKyAgICAgICAgICBDWEZBX05vZGUqIHBOb2RlID0gcFZhbHVlTm9kZS0+R2V0UGFyZW50KCk7CisgICAgICAgICAgaWYgKHBOb2RlICYmIHBOb2RlLT5Jc0NvbnRhaW5lck5vZGUoKSkgeworICAgICAgICAgICAgcE5vdGlmeS0+T25WYWx1ZUNoYW5nZWQodGhpcywgZUF0dHJpYnV0ZSwgcFZhbHVlTm9kZSwgcE5vZGUpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIGlmICghYk5lZWRGaW5kQ29udGFpbmVyKQorICAgIHJldHVybjsKKworICBDWEZBX05vZGUqIHBQYXJlbnQgPSB0aGlzOworICB3aGlsZSAocFBhcmVudCAmJiAhcFBhcmVudC0+SXNDb250YWluZXJOb2RlKCkpCisgICAgcFBhcmVudCA9IHBQYXJlbnQtPkdldFBhcmVudCgpOworCisgIGlmIChwUGFyZW50KQorICAgIHBMYXlvdXRQcm8tPkFkZENoYW5nZWRDb250YWluZXIocFBhcmVudCk7Cit9CisKK3ZvaWQgQ1hGQV9Ob2RlOjpTeW5jVmFsdWUoY29uc3QgV2lkZVN0cmluZyYgd3NWYWx1ZSwgYm9vbCBiTm90aWZ5KSB7CisgIFdpZGVTdHJpbmcgd3NGb3JtYXRWYWx1ZSA9IHdzVmFsdWU7CisgIENYRkFfV2lkZ2V0QWNjKiBwQ29udGFpbmVyV2lkZ2V0QWNjID0gR2V0Q29udGFpbmVyV2lkZ2V0QWNjKCk7CisgIGlmIChwQ29udGFpbmVyV2lkZ2V0QWNjKQorICAgIHdzRm9ybWF0VmFsdWUgPSBwQ29udGFpbmVyV2lkZ2V0QWNjLT5HZXRGb3JtYXREYXRhVmFsdWUod3NWYWx1ZSk7CisKKyAgSlNPYmplY3QoKS0+U2V0Q29udGVudCh3c1ZhbHVlLCB3c0Zvcm1hdFZhbHVlLCBiTm90aWZ5LCBmYWxzZSwgdHJ1ZSk7Cit9CisKK1dpZGVTdHJpbmcgQ1hGQV9Ob2RlOjpHZXRSYXdWYWx1ZSgpIHsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPkdldENvbnRlbnQoZmFsc2UpOworfQorCitpbnQzMl90IENYRkFfTm9kZTo6R2V0Um90YXRlKCkgeworICBPcHRpb25hbDxpbnQzMl90PiBkZWdyZWVzID0KKyAgICAgIEpTT2JqZWN0KCktPlRyeUludGVnZXIoWEZBX0F0dHJpYnV0ZTo6Um90YXRlLCBmYWxzZSk7CisgIHJldHVybiBkZWdyZWVzID8gWEZBX01hcFJvdGF0aW9uKCpkZWdyZWVzKSAvIDkwICogOTAgOiAwOworfQorCitDWEZBX0JvcmRlciogQ1hGQV9Ob2RlOjpHZXRCb3JkZXJJZkV4aXN0cygpIGNvbnN0IHsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPkdldFByb3BlcnR5PENYRkFfQm9yZGVyPigwLCBYRkFfRWxlbWVudDo6Qm9yZGVyKTsKK30KKworQ1hGQV9Cb3JkZXIqIENYRkFfTm9kZTo6R2V0T3JDcmVhdGVCb3JkZXJJZlBvc3NpYmxlKCkgeworICByZXR1cm4gSlNPYmplY3QoKS0+R2V0T3JDcmVhdGVQcm9wZXJ0eTxDWEZBX0JvcmRlcj4oMCwgWEZBX0VsZW1lbnQ6OkJvcmRlcik7Cit9CisKK0NYRkFfQ2FwdGlvbiogQ1hGQV9Ob2RlOjpHZXRDYXB0aW9uSWZFeGlzdHMoKSBjb25zdCB7CisgIHJldHVybiBKU09iamVjdCgpLT5HZXRQcm9wZXJ0eTxDWEZBX0NhcHRpb24+KDAsIFhGQV9FbGVtZW50OjpDYXB0aW9uKTsKK30KKworQ1hGQV9Gb250KiBDWEZBX05vZGU6OkdldE9yQ3JlYXRlRm9udElmUG9zc2libGUoKSB7CisgIHJldHVybiBKU09iamVjdCgpLT5HZXRPckNyZWF0ZVByb3BlcnR5PENYRkFfRm9udD4oMCwgWEZBX0VsZW1lbnQ6OkZvbnQpOworfQorCitDWEZBX0ZvbnQqIENYRkFfTm9kZTo6R2V0Rm9udElmRXhpc3RzKCkgY29uc3QgeworICByZXR1cm4gSlNPYmplY3QoKS0+R2V0UHJvcGVydHk8Q1hGQV9Gb250PigwLCBYRkFfRWxlbWVudDo6Rm9udCk7Cit9CisKK2Zsb2F0IENYRkFfTm9kZTo6R2V0Rm9udFNpemUoKSBjb25zdCB7CisgIENYRkFfRm9udCogZm9udCA9IEdldEZvbnRJZkV4aXN0cygpOworICBmbG9hdCBmRm9udFNpemUgPSBmb250ID8gZm9udC0+R2V0Rm9udFNpemUoKSA6IDEwLjBmOworICByZXR1cm4gZkZvbnRTaXplIDwgMC4xZiA/IDEwLjBmIDogZkZvbnRTaXplOworfQorCitmbG9hdCBDWEZBX05vZGU6OkdldExpbmVIZWlnaHQoKSBjb25zdCB7CisgIGZsb2F0IGZMaW5lSGVpZ2h0ID0gMDsKKyAgQ1hGQV9QYXJhKiBwYXJhID0gR2V0UGFyYUlmRXhpc3RzKCk7CisgIGlmIChwYXJhKQorICAgIGZMaW5lSGVpZ2h0ID0gcGFyYS0+R2V0TGluZUhlaWdodCgpOworCisgIGlmIChmTGluZUhlaWdodCA8IDEpCisgICAgZkxpbmVIZWlnaHQgPSBHZXRGb250U2l6ZSgpICogMS4yZjsKKyAgcmV0dXJuIGZMaW5lSGVpZ2h0OworfQorCitGWF9BUkdCIENYRkFfTm9kZTo6R2V0VGV4dENvbG9yKCkgY29uc3QgeworICBDWEZBX0ZvbnQqIGZvbnQgPSBHZXRGb250SWZFeGlzdHMoKTsKKyAgcmV0dXJuIGZvbnQgPyBmb250LT5HZXRDb2xvcigpIDogMHhGRjAwMDAwMDsKK30KKworQ1hGQV9NYXJnaW4qIENYRkFfTm9kZTo6R2V0TWFyZ2luSWZFeGlzdHMoKSBjb25zdCB7CisgIHJldHVybiBKU09iamVjdCgpLT5HZXRQcm9wZXJ0eTxDWEZBX01hcmdpbj4oMCwgWEZBX0VsZW1lbnQ6Ok1hcmdpbik7Cit9CisKK0NYRkFfUGFyYSogQ1hGQV9Ob2RlOjpHZXRQYXJhSWZFeGlzdHMoKSBjb25zdCB7CisgIHJldHVybiBKU09iamVjdCgpLT5HZXRQcm9wZXJ0eTxDWEZBX1BhcmE+KDAsIFhGQV9FbGVtZW50OjpQYXJhKTsKK30KKworYm9vbCBDWEZBX05vZGU6OklzT3BlbkFjY2VzcygpIHsKKyAgZm9yIChhdXRvKiBwTm9kZSA9IHRoaXM7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXRDb250YWluZXJQYXJlbnQoKSkgeworICAgIFhGQV9BdHRyaWJ1dGVFbnVtIGlBY2MgPSBwTm9kZS0+SlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpBY2Nlc3MpOworICAgIGlmIChpQWNjICE9IFhGQV9BdHRyaWJ1dGVFbnVtOjpPcGVuKQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CiAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIENYRkFfTm9kZTo6U2V0TWFwTW9kdWxlQnVmZmVyKAotICAgIHZvaWQqIHBLZXksCi0gICAgdm9pZCogcFZhbHVlLAotICAgIGludDMyX3QgaUJ5dGVzLAotICAgIFhGQV9NQVBEQVRBQkxPQ0tDQUxMQkFDS0lORk8qIHBDYWxsYmFja0luZm8pIHsKLSAgWEZBX01BUE1PRFVMRURBVEEqIHBNb2R1bGUgPSBDcmVhdGVNYXBNb2R1bGVEYXRhKCk7Ci0gIFhGQV9NQVBEQVRBQkxPQ0sqJiBwQnVmZmVyID0gcE1vZHVsZS0+bV9CdWZmZXJNYXBbcEtleV07Ci0gIGlmICghcEJ1ZmZlcikgewotICAgIHBCdWZmZXIgPQotICAgICAgICAoWEZBX01BUERBVEFCTE9DSyopRlhfQWxsb2ModWludDhfdCwgc2l6ZW9mKFhGQV9NQVBEQVRBQkxPQ0spICsgaUJ5dGVzKTsKLSAgfSBlbHNlIGlmIChwQnVmZmVyLT5pQnl0ZXMgIT0gaUJ5dGVzKSB7Ci0gICAgaWYgKHBCdWZmZXItPnBDYWxsYmFja0luZm8gJiYgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUpIHsKLSAgICAgIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKCoodm9pZCoqKXBCdWZmZXItPkdldERhdGEoKSk7Ci0gICAgfQotICAgIHBCdWZmZXIgPSAoWEZBX01BUERBVEFCTE9DSyopRlhfUmVhbGxvYyh1aW50OF90LCBwQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoWEZBX01BUERBVEFCTE9DSykgKyBpQnl0ZXMpOwotICB9IGVsc2UgaWYgKHBCdWZmZXItPnBDYWxsYmFja0luZm8gJiYgcEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUpIHsKLSAgICBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSgqKHZvaWQqKilwQnVmZmVyLT5HZXREYXRhKCkpOwotICB9Ci0gIGlmICghcEJ1ZmZlcikKLSAgICByZXR1cm47Ci0KLSAgcEJ1ZmZlci0+cENhbGxiYWNrSW5mbyA9IHBDYWxsYmFja0luZm87Ci0gIHBCdWZmZXItPmlCeXRlcyA9IGlCeXRlczsKLSAgRlhTWVNfbWVtY3B5KHBCdWZmZXItPkdldERhdGEoKSwgcFZhbHVlLCBpQnl0ZXMpOworQ1hGQV9WYWx1ZSogQ1hGQV9Ob2RlOjpHZXREZWZhdWx0VmFsdWVJZkV4aXN0cygpIHsKKyAgQ1hGQV9Ob2RlKiBwVGVtTm9kZSA9IEdldFRlbXBsYXRlTm9kZUlmRXhpc3RzKCk7CisgIHJldHVybiBwVGVtTm9kZSA/IHBUZW1Ob2RlLT5KU09iamVjdCgpLT5HZXRQcm9wZXJ0eTxDWEZBX1ZhbHVlPigKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIFhGQV9FbGVtZW50OjpWYWx1ZSkKKyAgICAgICAgICAgICAgICAgIDogbnVsbHB0cjsKIH0KIAotYm9vbCBDWEZBX05vZGU6OkdldE1hcE1vZHVsZUJ1ZmZlcih2b2lkKiBwS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpQnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlByb3RvQWxzbykgY29uc3QgewotICBYRkFfTUFQREFUQUJMT0NLKiBwQnVmZmVyID0gbnVsbHB0cjsKLSAgZm9yIChjb25zdCBDWEZBX05vZGUqIHBOb2RlID0gdGhpczsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldFRlbXBsYXRlTm9kZSgpKSB7Ci0gICAgWEZBX01BUE1PRFVMRURBVEEqIHBNb2R1bGUgPSBwTm9kZS0+R2V0TWFwTW9kdWxlRGF0YSgpOwotICAgIGlmIChwTW9kdWxlKSB7Ci0gICAgICBhdXRvIGl0ID0gcE1vZHVsZS0+bV9CdWZmZXJNYXAuZmluZChwS2V5KTsKLSAgICAgIGlmIChpdCAhPSBwTW9kdWxlLT5tX0J1ZmZlck1hcC5lbmQoKSkgewotICAgICAgICBwQnVmZmVyID0gaXQtPnNlY29uZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9CitDWEZBX1ZhbHVlKiBDWEZBX05vZGU6OkdldEZvcm1WYWx1ZUlmRXhpc3RzKCkgY29uc3QgeworICByZXR1cm4gSlNPYmplY3QoKS0+R2V0UHJvcGVydHk8Q1hGQV9WYWx1ZT4oMCwgWEZBX0VsZW1lbnQ6OlZhbHVlKTsKK30KKworQ1hGQV9DYWxjdWxhdGUqIENYRkFfTm9kZTo6R2V0Q2FsY3VsYXRlSWZFeGlzdHMoKSBjb25zdCB7CisgIHJldHVybiBKU09iamVjdCgpLT5HZXRQcm9wZXJ0eTxDWEZBX0NhbGN1bGF0ZT4oMCwgWEZBX0VsZW1lbnQ6OkNhbGN1bGF0ZSk7Cit9CisKK0NYRkFfVmFsaWRhdGUqIENYRkFfTm9kZTo6R2V0VmFsaWRhdGVJZkV4aXN0cygpIGNvbnN0IHsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPkdldFByb3BlcnR5PENYRkFfVmFsaWRhdGU+KDAsIFhGQV9FbGVtZW50OjpWYWxpZGF0ZSk7Cit9CisKK0NYRkFfVmFsaWRhdGUqIENYRkFfTm9kZTo6R2V0T3JDcmVhdGVWYWxpZGF0ZUlmUG9zc2libGUoKSB7CisgIHJldHVybiBKU09iamVjdCgpLT5HZXRPckNyZWF0ZVByb3BlcnR5PENYRkFfVmFsaWRhdGU+KDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpWYWxpZGF0ZSk7Cit9CisKK0NYRkFfQmluZCogQ1hGQV9Ob2RlOjpHZXRCaW5kSWZFeGlzdHMoKSBjb25zdCB7CisgIHJldHVybiBKU09iamVjdCgpLT5HZXRQcm9wZXJ0eTxDWEZBX0JpbmQ+KDAsIFhGQV9FbGVtZW50OjpCaW5kKTsKK30KKworT3B0aW9uYWw8ZmxvYXQ+IENYRkFfTm9kZTo6VHJ5V2lkdGgoKSB7CisgIHJldHVybiBKU09iamVjdCgpLT5UcnlNZWFzdXJlQXNGbG9hdChYRkFfQXR0cmlidXRlOjpXKTsKK30KKworT3B0aW9uYWw8ZmxvYXQ+IENYRkFfTm9kZTo6VHJ5SGVpZ2h0KCkgeworICByZXR1cm4gSlNPYmplY3QoKS0+VHJ5TWVhc3VyZUFzRmxvYXQoWEZBX0F0dHJpYnV0ZTo6SCk7Cit9CisKK09wdGlvbmFsPGZsb2F0PiBDWEZBX05vZGU6OlRyeU1pbldpZHRoKCkgeworICByZXR1cm4gSlNPYmplY3QoKS0+VHJ5TWVhc3VyZUFzRmxvYXQoWEZBX0F0dHJpYnV0ZTo6TWluVyk7Cit9CisKK09wdGlvbmFsPGZsb2F0PiBDWEZBX05vZGU6OlRyeU1pbkhlaWdodCgpIHsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPlRyeU1lYXN1cmVBc0Zsb2F0KFhGQV9BdHRyaWJ1dGU6Ok1pbkgpOworfQorCitPcHRpb25hbDxmbG9hdD4gQ1hGQV9Ob2RlOjpUcnlNYXhXaWR0aCgpIHsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPlRyeU1lYXN1cmVBc0Zsb2F0KFhGQV9BdHRyaWJ1dGU6Ok1heFcpOworfQorCitPcHRpb25hbDxmbG9hdD4gQ1hGQV9Ob2RlOjpUcnlNYXhIZWlnaHQoKSB7CisgIHJldHVybiBKU09iamVjdCgpLT5UcnlNZWFzdXJlQXNGbG9hdChYRkFfQXR0cmlidXRlOjpNYXhIKTsKK30KKworQ1hGQV9Ob2RlKiBDWEZBX05vZGU6OkdldEV4Y2xHcm91cElmRXhpc3RzKCkgeworICBDWEZBX05vZGUqIHBFeGNsID0gR2V0UGFyZW50KCk7CisgIGlmICghcEV4Y2wgfHwgcEV4Y2wtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OkV4Y2xHcm91cCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIHBFeGNsOworfQorCitpbnQzMl90IENYRkFfTm9kZTo6UHJvY2Vzc0V2ZW50KENYRkFfRkZEb2NWaWV3KiBkb2NWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlRW51bSBpQWN0aXZpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRXZlbnRQYXJhbSogcEV2ZW50UGFyYW0pIHsKKyAgaWYgKEdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkRyYXcpCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0OworCisgIHN0ZDo6dmVjdG9yPENYRkFfRXZlbnQqPiBldmVudEFycmF5ID0gR2V0V2lkZ2V0QWNjKCktPkdldEV2ZW50QnlBY3Rpdml0eSgKKyAgICAgIGlBY3Rpdml0eSwgcEV2ZW50UGFyYW0tPm1fYklzRm9ybVJlYWR5KTsKKyAgYm9vbCBmaXJzdCA9IHRydWU7CisgIGludDMyX3QgaVJldCA9IFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0OworICBmb3IgKENYRkFfRXZlbnQqIGV2ZW50IDogZXZlbnRBcnJheSkgeworICAgIGludDMyX3QgcmVzdWx0ID0gUHJvY2Vzc0V2ZW50KGRvY1ZpZXcsIGV2ZW50LCBwRXZlbnRQYXJhbSk7CisgICAgaWYgKGZpcnN0IHx8IHJlc3VsdCA9PSBYRkFfRVZFTlRFUlJPUl9TdWNjZXNzKQorICAgICAgaVJldCA9IHJlc3VsdDsKKyAgICBmaXJzdCA9IGZhbHNlOworICB9CisgIHJldHVybiBpUmV0OworfQorCitpbnQzMl90IENYRkFfTm9kZTo6UHJvY2Vzc0V2ZW50KENYRkFfRkZEb2NWaWV3KiBkb2NWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0V2ZW50KiBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9FdmVudFBhcmFtKiBwRXZlbnRQYXJhbSkgeworICBpZiAoIWV2ZW50KQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKKworICBzd2l0Y2ggKGV2ZW50LT5HZXRFdmVudFR5cGUoKSkgeworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkV4ZWN1dGU6CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTY3JpcHQ6CisgICAgICByZXR1cm4gRXhlY3V0ZVNjcmlwdChkb2NWaWV3LCBldmVudC0+R2V0U2NyaXB0SWZFeGlzdHMoKSwgcEV2ZW50UGFyYW0pOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlNpZ25EYXRhOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U3VibWl0OiB7CisgICAgICBDWEZBX1N1Ym1pdCogc3VibWl0ID0gZXZlbnQtPkdldFN1Ym1pdElmRXhpc3RzKCk7CisgICAgICBpZiAoIXN1Ym1pdCkKKyAgICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0OworICAgICAgcmV0dXJuIGRvY1ZpZXctPkdldERvYygpLT5HZXREb2NFbnZpcm9ubWVudCgpLT5TdWJtaXQoZG9jVmlldy0+R2V0RG9jKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXQpOwogICAgIH0KLSAgICBpZiAoIWJQcm90b0Fsc28gfHwgcE5vZGUtPkdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykKKyAgICBkZWZhdWx0OgogICAgICAgYnJlYWs7CiAgIH0KLSAgaWYgKCFwQnVmZmVyKQotICAgIHJldHVybiBmYWxzZTsKLQotICBwVmFsdWUgPSBwQnVmZmVyLT5HZXREYXRhKCk7Ci0gIGlCeXRlcyA9IHBCdWZmZXItPmlCeXRlczsKLSAgcmV0dXJuIHRydWU7CisgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKIH0KIAotYm9vbCBDWEZBX05vZGU6Okhhc01hcE1vZHVsZUtleSh2b2lkKiBwS2V5LCBib29sIGJQcm90b0Fsc28pIHsKLSAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gdGhpczsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldFRlbXBsYXRlTm9kZSgpKSB7Ci0gICAgWEZBX01BUE1PRFVMRURBVEEqIHBNb2R1bGUgPSBwTm9kZS0+R2V0TWFwTW9kdWxlRGF0YSgpOwotICAgIGlmIChwTW9kdWxlKSB7Ci0gICAgICBhdXRvIGl0MSA9IHBNb2R1bGUtPm1fVmFsdWVNYXAuZmluZChwS2V5KTsKLSAgICAgIGlmIChpdDEgIT0gcE1vZHVsZS0+bV9WYWx1ZU1hcC5lbmQoKSkKK2ludDMyX3QgQ1hGQV9Ob2RlOjpQcm9jZXNzQ2FsY3VsYXRlKENYRkFfRkZEb2NWaWV3KiBkb2NWaWV3KSB7CisgIGlmIChHZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpEcmF3KQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKKworICBDWEZBX0NhbGN1bGF0ZSogY2FsYyA9IEdldENhbGN1bGF0ZUlmRXhpc3RzKCk7CisgIGlmICghY2FsYykKKyAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7CisgIGlmIChJc1VzZXJJbnRlcmFjdGl2ZSgpKQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9EaXNhYmxlZDsKKworICBDWEZBX0V2ZW50UGFyYW0gRXZlbnRQYXJhbTsKKyAgRXZlbnRQYXJhbS5tX2VUeXBlID0gWEZBX0VWRU5UX0NhbGN1bGF0ZTsKKyAgaW50MzJfdCBpUmV0ID0gRXhlY3V0ZVNjcmlwdChkb2NWaWV3LCBjYWxjLT5HZXRTY3JpcHRJZkV4aXN0cygpLCAmRXZlbnRQYXJhbSk7CisgIGlmIChpUmV0ICE9IFhGQV9FVkVOVEVSUk9SX1N1Y2Nlc3MpCisgICAgcmV0dXJuIGlSZXQ7CisKKyAgaWYgKEdldFJhd1ZhbHVlKCkgIT0gRXZlbnRQYXJhbS5tX3dzUmVzdWx0KSB7CisgICAgR2V0V2lkZ2V0QWNjKCktPlNldFZhbHVlKFhGQV9WQUxVRVBJQ1RVUkVfUmF3LCBFdmVudFBhcmFtLm1fd3NSZXN1bHQpOworICAgIEdldFdpZGdldEFjYygpLT5VcGRhdGVVSURpc3BsYXkoZG9jVmlldywgbnVsbHB0cik7CisgIH0KKyAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2Nlc3M7Cit9CisKK3ZvaWQgQ1hGQV9Ob2RlOjpQcm9jZXNzU2NyaXB0VGVzdFZhbGlkYXRlKENYRkFfRkZEb2NWaWV3KiBkb2NWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9WYWxpZGF0ZSogdmFsaWRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZXRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlZlcnNpb25GbGFnKSB7CisgIGlmIChpUmV0ICE9IFhGQV9FVkVOVEVSUk9SX1N1Y2Nlc3MpCisgICAgcmV0dXJuOworICBpZiAoYlJldFZhbHVlKQorICAgIHJldHVybjsKKworICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPQorICAgICAgZG9jVmlldy0+R2V0RG9jKCktPkdldEFwcCgpLT5HZXRBcHBQcm92aWRlcigpOworICBpZiAoIXBBcHBQcm92aWRlcikKKyAgICByZXR1cm47CisKKyAgV2lkZVN0cmluZyB3c1RpdGxlID0gcEFwcFByb3ZpZGVyLT5HZXRBcHBUaXRsZSgpOworICBXaWRlU3RyaW5nIHdzU2NyaXB0TXNnID0gdmFsaWRhdGUtPkdldFNjcmlwdE1lc3NhZ2VUZXh0KCk7CisgIGlmICh2YWxpZGF0ZS0+R2V0U2NyaXB0VGVzdCgpID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpXYXJuaW5nKSB7CisgICAgaWYgKElzVXNlckludGVyYWN0aXZlKCkpCisgICAgICByZXR1cm47CisgICAgaWYgKHdzU2NyaXB0TXNnLklzRW1wdHkoKSkKKyAgICAgIHdzU2NyaXB0TXNnID0gR2V0VmFsaWRhdGVNZXNzYWdlKGZhbHNlLCBiVmVyc2lvbkZsYWcpOworCisgICAgaWYgKGJWZXJzaW9uRmxhZykgeworICAgICAgcEFwcFByb3ZpZGVyLT5Nc2dCb3god3NTY3JpcHRNc2csIHdzVGl0bGUsIFhGQV9NQklDT05fV2FybmluZywgWEZBX01CX09LKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBBcHBQcm92aWRlci0+TXNnQm94KHdzU2NyaXB0TXNnLCB3c1RpdGxlLCBYRkFfTUJJQ09OX1dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9NQl9ZZXNObykgPT0gWEZBX0lEWWVzKSB7CisgICAgICBTZXRGbGFnKFhGQV9Ob2RlRmxhZ19Vc2VySW50ZXJhY3RpdmUsIGZhbHNlKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHdzU2NyaXB0TXNnLklzRW1wdHkoKSkKKyAgICB3c1NjcmlwdE1zZyA9IEdldFZhbGlkYXRlTWVzc2FnZSh0cnVlLCBiVmVyc2lvbkZsYWcpOworICBwQXBwUHJvdmlkZXItPk1zZ0JveCh3c1NjcmlwdE1zZywgd3NUaXRsZSwgWEZBX01CSUNPTl9FcnJvciwgWEZBX01CX09LKTsKK30KKworaW50MzJfdCBDWEZBX05vZGU6OlByb2Nlc3NGb3JtYXRUZXN0VmFsaWRhdGUoQ1hGQV9GRkRvY1ZpZXcqIGRvY1ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1ZhbGlkYXRlKiB2YWxpZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlZlcnNpb25GbGFnKSB7CisgIFdpZGVTdHJpbmcgd3NSYXdWYWx1ZSA9IEdldFJhd1ZhbHVlKCk7CisgIGlmICghd3NSYXdWYWx1ZS5Jc0VtcHR5KCkpIHsKKyAgICBXaWRlU3RyaW5nIHdzUGljdHVyZSA9IHZhbGlkYXRlLT5HZXRQaWN0dXJlKCk7CisgICAgaWYgKHdzUGljdHVyZS5Jc0VtcHR5KCkpCisgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7CisKKyAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TG9jYWxlKCk7CisgICAgaWYgKCFwTG9jYWxlKQorICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0OworCisgICAgQ1hGQV9Mb2NhbGVWYWx1ZSBsY1ZhbHVlID0gWEZBX0dldExvY2FsZVZhbHVlKHRoaXMpOworICAgIGlmICghbGNWYWx1ZS5WYWxpZGF0ZVZhbHVlKGxjVmFsdWUuR2V0VmFsdWUoKSwgd3NQaWN0dXJlLCBwTG9jYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKSB7CisgICAgICBJWEZBX0FwcFByb3ZpZGVyKiBwQXBwUHJvdmlkZXIgPQorICAgICAgICAgIGRvY1ZpZXctPkdldERvYygpLT5HZXRBcHAoKS0+R2V0QXBwUHJvdmlkZXIoKTsKKyAgICAgIGlmICghcEFwcFByb3ZpZGVyKQorICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7CisKKyAgICAgIFdpZGVTdHJpbmcgd3NGb3JtYXRNc2cgPSB2YWxpZGF0ZS0+R2V0Rm9ybWF0TWVzc2FnZVRleHQoKTsKKyAgICAgIFdpZGVTdHJpbmcgd3NUaXRsZSA9IHBBcHBQcm92aWRlci0+R2V0QXBwVGl0bGUoKTsKKyAgICAgIGlmICh2YWxpZGF0ZS0+R2V0Rm9ybWF0VGVzdCgpID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpFcnJvcikgeworICAgICAgICBpZiAod3NGb3JtYXRNc2cuSXNFbXB0eSgpKQorICAgICAgICAgIHdzRm9ybWF0TXNnID0gR2V0VmFsaWRhdGVNZXNzYWdlKHRydWUsIGJWZXJzaW9uRmxhZyk7CisgICAgICAgIHBBcHBQcm92aWRlci0+TXNnQm94KHdzRm9ybWF0TXNnLCB3c1RpdGxlLCBYRkFfTUJJQ09OX0Vycm9yLCBYRkFfTUJfT0spOworICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfU3VjY2VzczsKKyAgICAgIH0KKyAgICAgIGlmIChJc1VzZXJJbnRlcmFjdGl2ZSgpKQorICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7CisgICAgICBpZiAod3NGb3JtYXRNc2cuSXNFbXB0eSgpKQorICAgICAgICB3c0Zvcm1hdE1zZyA9IEdldFZhbGlkYXRlTWVzc2FnZShmYWxzZSwgYlZlcnNpb25GbGFnKTsKKworICAgICAgaWYgKGJWZXJzaW9uRmxhZykgeworICAgICAgICBwQXBwUHJvdmlkZXItPk1zZ0JveCh3c0Zvcm1hdE1zZywgd3NUaXRsZSwgWEZBX01CSUNPTl9XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTUJfT0spOworICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfU3VjY2VzczsKKyAgICAgIH0KKyAgICAgIGlmIChwQXBwUHJvdmlkZXItPk1zZ0JveCh3c0Zvcm1hdE1zZywgd3NUaXRsZSwgWEZBX01CSUNPTl9XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9NQl9ZZXNObykgPT0gWEZBX0lEWWVzKSB7CisgICAgICAgIFNldEZsYWcoWEZBX05vZGVGbGFnX1VzZXJJbnRlcmFjdGl2ZSwgZmFsc2UpOworICAgICAgfQorICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2Nlc3M7CisgICAgfQorICB9CisgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKK30KKworaW50MzJfdCBDWEZBX05vZGU6OlByb2Nlc3NOdWxsVGVzdFZhbGlkYXRlKENYRkFfRkZEb2NWaWV3KiBkb2NWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVmFsaWRhdGUqIHZhbGlkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlZlcnNpb25GbGFnKSB7CisgIGlmICghR2V0V2lkZ2V0QWNjKCktPkdldFZhbHVlKFhGQV9WQUxVRVBJQ1RVUkVfUmF3KS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX1N1Y2Nlc3M7CisgIGlmIChHZXRXaWRnZXRBY2MoKS0+SXNOdWxsKCkgJiYgR2V0V2lkZ2V0QWNjKCktPklzUHJlTnVsbCgpKQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9TdWNjZXNzOworCisgIFhGQV9BdHRyaWJ1dGVFbnVtIGVOdWxsVGVzdCA9IHZhbGlkYXRlLT5HZXROdWxsVGVzdCgpOworICBXaWRlU3RyaW5nIHdzTnVsbE1zZyA9IHZhbGlkYXRlLT5HZXROdWxsTWVzc2FnZVRleHQoKTsKKyAgaWYgKGlGbGFncyAmIDB4MDEpIHsKKyAgICBpbnQzMl90IGlSZXQgPSBYRkFfRVZFTlRFUlJPUl9TdWNjZXNzOworICAgIGlmIChlTnVsbFRlc3QgIT0gWEZBX0F0dHJpYnV0ZUVudW06OkRpc2FibGVkKQorICAgICAgaVJldCA9IFhGQV9FVkVOVEVSUk9SX0Vycm9yOworCisgICAgaWYgKCF3c051bGxNc2cuSXNFbXB0eSgpKSB7CisgICAgICBpZiAoZU51bGxUZXN0ICE9IFhGQV9BdHRyaWJ1dGVFbnVtOjpEaXNhYmxlZCkgeworICAgICAgICBkb2NWaWV3LT5tX2Fyck51bGxUZXN0TXNnLnB1c2hfYmFjayh3c051bGxNc2cpOworICAgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRXJyb3I7CisgICAgICB9CisgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfU3VjY2VzczsKKyAgICB9CisgICAgcmV0dXJuIGlSZXQ7CisgIH0KKyAgaWYgKHdzTnVsbE1zZy5Jc0VtcHR5KCkgJiYgYlZlcnNpb25GbGFnICYmCisgICAgICBlTnVsbFRlc3QgIT0gWEZBX0F0dHJpYnV0ZUVudW06OkRpc2FibGVkKSB7CisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Vycm9yOworICB9CisgIElYRkFfQXBwUHJvdmlkZXIqIHBBcHBQcm92aWRlciA9CisgICAgICBkb2NWaWV3LT5HZXREb2MoKS0+R2V0QXBwKCktPkdldEFwcFByb3ZpZGVyKCk7CisgIGlmICghcEFwcFByb3ZpZGVyKQorICAgIHJldHVybiBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKKworICBXaWRlU3RyaW5nIHdzQ2FwdGlvbk5hbWU7CisgIFdpZGVTdHJpbmcgd3NUaXRsZSA9IHBBcHBQcm92aWRlci0+R2V0QXBwVGl0bGUoKTsKKyAgc3dpdGNoIChlTnVsbFRlc3QpIHsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpFcnJvcjogeworICAgICAgaWYgKHdzTnVsbE1zZy5Jc0VtcHR5KCkpIHsKKyAgICAgICAgd3NDYXB0aW9uTmFtZSA9IEdldFZhbGlkYXRlQ2FwdGlvbk5hbWUoYlZlcnNpb25GbGFnKTsKKyAgICAgICAgd3NOdWxsTXNnID0KKyAgICAgICAgICAgIFdpZGVTdHJpbmc6OkZvcm1hdChMIiVscyBjYW5ub3QgYmUgYmxhbmsuIiwgd3NDYXB0aW9uTmFtZS5jX3N0cigpKTsKKyAgICAgIH0KKyAgICAgIHBBcHBQcm92aWRlci0+TXNnQm94KHdzTnVsbE1zZywgd3NUaXRsZSwgWEZBX01CSUNPTl9TdGF0dXMsIFhGQV9NQl9PSyk7CisgICAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfRXJyb3I7CisgICAgfQorICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06Oldhcm5pbmc6IHsKKyAgICAgIGlmIChJc1VzZXJJbnRlcmFjdGl2ZSgpKQogICAgICAgICByZXR1cm4gdHJ1ZTsKIAotICAgICAgYXV0byBpdDIgPSBwTW9kdWxlLT5tX0J1ZmZlck1hcC5maW5kKHBLZXkpOwotICAgICAgaWYgKGl0MiAhPSBwTW9kdWxlLT5tX0J1ZmZlck1hcC5lbmQoKSkKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBpZiAod3NOdWxsTXNnLklzRW1wdHkoKSkgeworICAgICAgICB3c0NhcHRpb25OYW1lID0gR2V0VmFsaWRhdGVDYXB0aW9uTmFtZShiVmVyc2lvbkZsYWcpOworICAgICAgICB3c051bGxNc2cgPSBXaWRlU3RyaW5nOjpGb3JtYXQoCisgICAgICAgICAgICBMIiVscyBjYW5ub3QgYmUgYmxhbmsuIFRvIGlnbm9yZSB2YWxpZGF0aW9ucyBmb3IgJWxzLCBjbGljayAiCisgICAgICAgICAgICBMIklnbm9yZS4iLAorICAgICAgICAgICAgd3NDYXB0aW9uTmFtZS5jX3N0cigpLCB3c0NhcHRpb25OYW1lLmNfc3RyKCkpOworICAgICAgfQorICAgICAgaWYgKHBBcHBQcm92aWRlci0+TXNnQm94KHdzTnVsbE1zZywgd3NUaXRsZSwgWEZBX01CSUNPTl9XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9NQl9ZZXNObykgPT0gWEZBX0lEWWVzKSB7CisgICAgICAgIFNldEZsYWcoWEZBX05vZGVGbGFnX1VzZXJJbnRlcmFjdGl2ZSwgZmFsc2UpOworICAgICAgfQorICAgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX0Vycm9yOwogICAgIH0KLSAgICBpZiAoIWJQcm90b0Fsc28gfHwgcE5vZGUtPkdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpEaXNhYmxlZDoKKyAgICBkZWZhdWx0OgogICAgICAgYnJlYWs7CiAgIH0KLSAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gWEZBX0VWRU5URVJST1JfU3VjY2VzczsKIH0KIAotdm9pZCBDWEZBX05vZGU6OlJlbW92ZU1hcE1vZHVsZUtleSh2b2lkKiBwS2V5KSB7Ci0gIFhGQV9NQVBNT0RVTEVEQVRBKiBwTW9kdWxlID0gR2V0TWFwTW9kdWxlRGF0YSgpOwotICBpZiAoIXBNb2R1bGUpCi0gICAgcmV0dXJuOworaW50MzJfdCBDWEZBX05vZGU6OlByb2Nlc3NWYWxpZGF0ZShDWEZBX0ZGRG9jVmlldyogZG9jVmlldywgaW50MzJfdCBpRmxhZ3MpIHsKKyAgaWYgKEdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkRyYXcpCisgICAgcmV0dXJuIFhGQV9FVkVOVEVSUk9SX05vdEV4aXN0OwogCi0gIGlmIChwS2V5KSB7Ci0gICAgYXV0byBpdCA9IHBNb2R1bGUtPm1fQnVmZmVyTWFwLmZpbmQocEtleSk7Ci0gICAgaWYgKGl0ICE9IHBNb2R1bGUtPm1fQnVmZmVyTWFwLmVuZCgpKSB7Ci0gICAgICBYRkFfTUFQREFUQUJMT0NLKiBwQnVmZmVyID0gaXQtPnNlY29uZDsKLSAgICAgIGlmIChwQnVmZmVyKSB7Ci0gICAgICAgIGlmIChwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvICYmIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKQotICAgICAgICAgIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKCoodm9pZCoqKXBCdWZmZXItPkdldERhdGEoKSk7Ci0gICAgICAgIEZYX0ZyZWUocEJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgICBwTW9kdWxlLT5tX0J1ZmZlck1hcC5lcmFzZShpdCk7Ci0gICAgfQotICAgIHBNb2R1bGUtPm1fVmFsdWVNYXAuZXJhc2UocEtleSk7Ci0gICAgcmV0dXJuOworICBDWEZBX1ZhbGlkYXRlKiB2YWxpZGF0ZSA9IEdldFZhbGlkYXRlSWZFeGlzdHMoKTsKKyAgaWYgKCF2YWxpZGF0ZSkKKyAgICByZXR1cm4gWEZBX0VWRU5URVJST1JfTm90RXhpc3Q7CisKKyAgYm9vbCBiSW5pdERvYyA9IHZhbGlkYXRlLT5OZWVkc0luaXRBcHAoKTsKKyAgYm9vbCBiU3RhdHVzID0gZG9jVmlldy0+R2V0TGF5b3V0U3RhdHVzKCkgPCBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRW5kOworICBpbnQzMl90IGlGb3JtYXQgPSAwOworICBpbnQzMl90IGlSZXQgPSBYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdDsKKyAgQ1hGQV9TY3JpcHQqIHNjcmlwdCA9IHZhbGlkYXRlLT5HZXRTY3JpcHRJZkV4aXN0cygpOworICBib29sIGJSZXQgPSBmYWxzZTsKKyAgYm9vbCBoYXNCb29sUmVzdWx0ID0gKGJJbml0RG9jIHx8IGJTdGF0dXMpICYmIEdldFJhd1ZhbHVlKCkuSXNFbXB0eSgpOworICBpZiAoc2NyaXB0KSB7CisgICAgQ1hGQV9FdmVudFBhcmFtIGVQYXJhbTsKKyAgICBlUGFyYW0ubV9lVHlwZSA9IFhGQV9FVkVOVF9WYWxpZGF0ZTsKKyAgICBlUGFyYW0ubV9wVGFyZ2V0ID0gR2V0V2lkZ2V0QWNjKCk7CisgICAgc3RkOjp0aWUoaVJldCwgYlJldCkgPSBFeGVjdXRlQm9vbFNjcmlwdChkb2NWaWV3LCBzY3JpcHQsICZlUGFyYW0pOwogICB9CiAKLSAgZm9yIChhdXRvJiBwYWlyIDogcE1vZHVsZS0+bV9CdWZmZXJNYXApIHsKLSAgICBYRkFfTUFQREFUQUJMT0NLKiBwQnVmZmVyID0gcGFpci5zZWNvbmQ7Ci0gICAgaWYgKHBCdWZmZXIpIHsKLSAgICAgIGlmIChwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvICYmIHBCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlKQotICAgICAgICBwQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSgqKHZvaWQqKilwQnVmZmVyLT5HZXREYXRhKCkpOwotICAgICAgRlhfRnJlZShwQnVmZmVyKTsKKyAgWEZBX1ZFUlNJT04gdmVyc2lvbiA9IGRvY1ZpZXctPkdldERvYygpLT5HZXRYRkFEb2MoKS0+R2V0Q3VyVmVyc2lvbk1vZGUoKTsKKyAgYm9vbCBiVmVyc2lvbkZsYWcgPSBmYWxzZTsKKyAgaWYgKHZlcnNpb24gPCBYRkFfVkVSU0lPTl8yMDgpCisgICAgYlZlcnNpb25GbGFnID0gdHJ1ZTsKKworICBpZiAoYkluaXREb2MpIHsKKyAgICB2YWxpZGF0ZS0+Q2xlYXJGbGFnKFhGQV9Ob2RlRmxhZ19OZWVkc0luaXRBcHApOworICB9IGVsc2UgeworICAgIGlGb3JtYXQgPSBQcm9jZXNzRm9ybWF0VGVzdFZhbGlkYXRlKGRvY1ZpZXcsIHZhbGlkYXRlLCBiVmVyc2lvbkZsYWcpOworICAgIGlmICghYlZlcnNpb25GbGFnKSB7CisgICAgICBiVmVyc2lvbkZsYWcgPQorICAgICAgICAgIGRvY1ZpZXctPkdldERvYygpLT5HZXRYRkFEb2MoKS0+SGFzRmxhZyhYRkFfRE9DRkxBR19TY3JpcHRpbmcpOwogICAgIH0KKworICAgIGlSZXQgfD0gUHJvY2Vzc051bGxUZXN0VmFsaWRhdGUoZG9jVmlldywgdmFsaWRhdGUsIGlGbGFncywgYlZlcnNpb25GbGFnKTsKICAgfQotICBwTW9kdWxlLT5tX0J1ZmZlck1hcC5jbGVhcigpOwotICBwTW9kdWxlLT5tX1ZhbHVlTWFwLmNsZWFyKCk7Ci0gIGRlbGV0ZSBwTW9kdWxlOworCisgIGlmIChpRm9ybWF0ICE9IFhGQV9FVkVOVEVSUk9SX1N1Y2Nlc3MgJiYgaGFzQm9vbFJlc3VsdCkKKyAgICBQcm9jZXNzU2NyaXB0VGVzdFZhbGlkYXRlKGRvY1ZpZXcsIHZhbGlkYXRlLCBpUmV0LCBiUmV0LCBiVmVyc2lvbkZsYWcpOworCisgIHJldHVybiBpUmV0IHwgaUZvcm1hdDsKIH0KIAotdm9pZCBDWEZBX05vZGU6Ok1lcmdlQWxsRGF0YSh2b2lkKiBwRHN0TW9kdWxlKSB7Ci0gIFhGQV9NQVBNT0RVTEVEQVRBKiBwRHN0TW9kdWxlRGF0YSA9Ci0gICAgICBzdGF0aWNfY2FzdDxDWEZBX05vZGUqPihwRHN0TW9kdWxlKS0+Q3JlYXRlTWFwTW9kdWxlRGF0YSgpOwotICBYRkFfTUFQTU9EVUxFREFUQSogcFNyY01vZHVsZURhdGEgPSBHZXRNYXBNb2R1bGVEYXRhKCk7Ci0gIGlmICghcFNyY01vZHVsZURhdGEpCi0gICAgcmV0dXJuOworV2lkZVN0cmluZyBDWEZBX05vZGU6OkdldFZhbGlkYXRlQ2FwdGlvbk5hbWUoYm9vbCBiVmVyc2lvbkZsYWcpIHsKKyAgV2lkZVN0cmluZyB3c0NhcHRpb25OYW1lOwogCi0gIGZvciAoY29uc3QgYXV0byYgcGFpciA6IHBTcmNNb2R1bGVEYXRhLT5tX1ZhbHVlTWFwKQotICAgIHBEc3RNb2R1bGVEYXRhLT5tX1ZhbHVlTWFwW3BhaXIuZmlyc3RdID0gcGFpci5zZWNvbmQ7Ci0KLSAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogcFNyY01vZHVsZURhdGEtPm1fQnVmZmVyTWFwKSB7Ci0gICAgWEZBX01BUERBVEFCTE9DSyogcFNyY0J1ZmZlciA9IHBhaXIuc2Vjb25kOwotICAgIFhGQV9NQVBEQVRBQkxPQ0sqJiBwRHN0QnVmZmVyID0gcERzdE1vZHVsZURhdGEtPm1fQnVmZmVyTWFwW3BhaXIuZmlyc3RdOwotICAgIGlmIChwU3JjQnVmZmVyLT5wQ2FsbGJhY2tJbmZvICYmIHBTcmNCdWZmZXItPnBDYWxsYmFja0luZm8tPnBGcmVlICYmCi0gICAgICAgICFwU3JjQnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wQ29weSkgewotICAgICAgaWYgKHBEc3RCdWZmZXIpIHsKLSAgICAgICAgcERzdEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUoKih2b2lkKiopcERzdEJ1ZmZlci0+R2V0RGF0YSgpKTsKLSAgICAgICAgcERzdE1vZHVsZURhdGEtPm1fQnVmZmVyTWFwLmVyYXNlKHBhaXIuZmlyc3QpOwotICAgICAgfQotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmICghcERzdEJ1ZmZlcikgewotICAgICAgcERzdEJ1ZmZlciA9IChYRkFfTUFQREFUQUJMT0NLKilGWF9BbGxvYygKLSAgICAgICAgICB1aW50OF90LCBzaXplb2YoWEZBX01BUERBVEFCTE9DSykgKyBwU3JjQnVmZmVyLT5pQnl0ZXMpOwotICAgIH0gZWxzZSBpZiAocERzdEJ1ZmZlci0+aUJ5dGVzICE9IHBTcmNCdWZmZXItPmlCeXRlcykgewotICAgICAgaWYgKHBEc3RCdWZmZXItPnBDYWxsYmFja0luZm8gJiYgcERzdEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUpIHsKLSAgICAgICAgcERzdEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUoKih2b2lkKiopcERzdEJ1ZmZlci0+R2V0RGF0YSgpKTsKLSAgICAgIH0KLSAgICAgIHBEc3RCdWZmZXIgPSAoWEZBX01BUERBVEFCTE9DSyopRlhfUmVhbGxvYygKLSAgICAgICAgICB1aW50OF90LCBwRHN0QnVmZmVyLCBzaXplb2YoWEZBX01BUERBVEFCTE9DSykgKyBwU3JjQnVmZmVyLT5pQnl0ZXMpOwotICAgIH0gZWxzZSBpZiAocERzdEJ1ZmZlci0+cENhbGxiYWNrSW5mbyAmJiBwRHN0QnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wRnJlZSkgewotICAgICAgcERzdEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cEZyZWUoKih2b2lkKiopcERzdEJ1ZmZlci0+R2V0RGF0YSgpKTsKLSAgICB9Ci0gICAgaWYgKCFwRHN0QnVmZmVyKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgcERzdEJ1ZmZlci0+cENhbGxiYWNrSW5mbyA9IHBTcmNCdWZmZXItPnBDYWxsYmFja0luZm87Ci0gICAgcERzdEJ1ZmZlci0+aUJ5dGVzID0gcFNyY0J1ZmZlci0+aUJ5dGVzOwotICAgIEZYU1lTX21lbWNweShwRHN0QnVmZmVyLT5HZXREYXRhKCksIHBTcmNCdWZmZXItPkdldERhdGEoKSwKLSAgICAgICAgICAgICAgICAgcFNyY0J1ZmZlci0+aUJ5dGVzKTsKLSAgICBpZiAocERzdEJ1ZmZlci0+cENhbGxiYWNrSW5mbyAmJiBwRHN0QnVmZmVyLT5wQ2FsbGJhY2tJbmZvLT5wQ29weSkgewotICAgICAgcERzdEJ1ZmZlci0+cENhbGxiYWNrSW5mby0+cENvcHkoKih2b2lkKiopcERzdEJ1ZmZlci0+R2V0RGF0YSgpKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDWEZBX05vZGU6Ok1vdmVCdWZmZXJNYXBEYXRhKENYRkFfTm9kZSogcERzdE1vZHVsZSwgdm9pZCogcEtleSkgewotICBpZiAoIXBEc3RNb2R1bGUpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgYm9vbCBiTmVlZE1vdmUgPSB0cnVlOwotICBpZiAoIXBLZXkpIHsKLSAgICBiTmVlZE1vdmUgPSBmYWxzZTsKLSAgfQotICBpZiAocERzdE1vZHVsZS0+R2V0RWxlbWVudFR5cGUoKSAhPSBHZXRFbGVtZW50VHlwZSgpKSB7Ci0gICAgYk5lZWRNb3ZlID0gZmFsc2U7Ci0gIH0KLSAgWEZBX01BUE1PRFVMRURBVEEqIHBTcmNNb2R1bGVEYXRhID0gbnVsbHB0cjsKLSAgWEZBX01BUE1PRFVMRURBVEEqIHBEc3RNb2R1bGVEYXRhID0gbnVsbHB0cjsKLSAgaWYgKGJOZWVkTW92ZSkgewotICAgIHBTcmNNb2R1bGVEYXRhID0gR2V0TWFwTW9kdWxlRGF0YSgpOwotICAgIGlmICghcFNyY01vZHVsZURhdGEpIHsKLSAgICAgIGJOZWVkTW92ZSA9IGZhbHNlOwotICAgIH0KLSAgICBwRHN0TW9kdWxlRGF0YSA9IHBEc3RNb2R1bGUtPkNyZWF0ZU1hcE1vZHVsZURhdGEoKTsKLSAgfQotICBpZiAoYk5lZWRNb3ZlKSB7Ci0gICAgYXV0byBpdCA9IHBTcmNNb2R1bGVEYXRhLT5tX0J1ZmZlck1hcC5maW5kKHBLZXkpOwotICAgIGlmIChpdCAhPSBwU3JjTW9kdWxlRGF0YS0+bV9CdWZmZXJNYXAuZW5kKCkpIHsKLSAgICAgIFhGQV9NQVBEQVRBQkxPQ0sqIHBCdWZmZXJCbG9ja0RhdGEgPSBpdC0+c2Vjb25kOwotICAgICAgaWYgKHBCdWZmZXJCbG9ja0RhdGEpIHsKLSAgICAgICAgcFNyY01vZHVsZURhdGEtPm1fQnVmZmVyTWFwLmVyYXNlKHBLZXkpOwotICAgICAgICBwRHN0TW9kdWxlRGF0YS0+bV9CdWZmZXJNYXBbcEtleV0gPSBwQnVmZmVyQmxvY2tEYXRhOworICBpZiAoIWJWZXJzaW9uRmxhZykgeworICAgIENYRkFfQ2FwdGlvbiogY2FwdGlvbiA9IEdldENhcHRpb25JZkV4aXN0cygpOworICAgIGlmIChjYXB0aW9uKSB7CisgICAgICBDWEZBX1ZhbHVlKiBjYXBWYWx1ZSA9IGNhcHRpb24tPkdldFZhbHVlSWZFeGlzdHMoKTsKKyAgICAgIGlmIChjYXBWYWx1ZSkgeworICAgICAgICBDWEZBX1RleHQqIGNhcHRpb25UZXh0ID0gY2FwVmFsdWUtPkdldFRleHRJZkV4aXN0cygpOworICAgICAgICBpZiAoY2FwdGlvblRleHQpCisgICAgICAgICAgd3NDYXB0aW9uTmFtZSA9IGNhcHRpb25UZXh0LT5HZXRDb250ZW50KCk7CiAgICAgICB9CiAgICAgfQogICB9Ci0gIGlmIChwRHN0TW9kdWxlLT5Jc05vZGVWKCkpIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0gcERzdE1vZHVsZS0+R2V0U2NyaXB0Q29udGVudChmYWxzZSk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXRWYWx1ZSh3c1ZhbHVlKTsKLSAgICBDWEZBX1dpZGdldERhdGEqIHBXaWRnZXREYXRhID0gcERzdE1vZHVsZS0+R2V0Q29udGFpbmVyV2lkZ2V0RGF0YSgpOwotICAgIGlmIChwV2lkZ2V0RGF0YSkgewotICAgICAgcFdpZGdldERhdGEtPkdldEZvcm1hdERhdGFWYWx1ZSh3c1ZhbHVlLCB3c0Zvcm1hdFZhbHVlKTsKLSAgICB9Ci0gICAgcERzdE1vZHVsZS0+U2V0U2NyaXB0Q29udGVudCh3c1ZhbHVlLCB3c0Zvcm1hdFZhbHVlLCB0cnVlLCB0cnVlKTsKLSAgfQorICBpZiAoIXdzQ2FwdGlvbk5hbWUuSXNFbXB0eSgpKQorICAgIHJldHVybiB3c0NhcHRpb25OYW1lOworICByZXR1cm4gSlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6TmFtZSk7CiB9CiAKLXZvaWQgQ1hGQV9Ob2RlOjpNb3ZlQnVmZmVyTWFwRGF0YShDWEZBX05vZGUqIHBTcmNNb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRHN0TW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmVjdXJzaXZlKSB7Ci0gIGlmICghcFNyY01vZHVsZSB8fCAhcERzdE1vZHVsZSB8fCAhcEtleSkgewotICAgIHJldHVybjsKK1dpZGVTdHJpbmcgQ1hGQV9Ob2RlOjpHZXRWYWxpZGF0ZU1lc3NhZ2UoYm9vbCBiRXJyb3IsIGJvb2wgYlZlcnNpb25GbGFnKSB7CisgIFdpZGVTdHJpbmcgd3NDYXB0aW9uTmFtZSA9IEdldFZhbGlkYXRlQ2FwdGlvbk5hbWUoYlZlcnNpb25GbGFnKTsKKyAgaWYgKGJWZXJzaW9uRmxhZykKKyAgICByZXR1cm4gV2lkZVN0cmluZzo6Rm9ybWF0KEwiJWxzIHZhbGlkYXRpb24gZmFpbGVkIiwgd3NDYXB0aW9uTmFtZS5jX3N0cigpKTsKKyAgaWYgKGJFcnJvcikgeworICAgIHJldHVybiBXaWRlU3RyaW5nOjpGb3JtYXQoTCJUaGUgdmFsdWUgeW91IGVudGVyZWQgZm9yICVscyBpcyBpbnZhbGlkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0NhcHRpb25OYW1lLmNfc3RyKCkpOwogICB9Ci0gIGlmIChiUmVjdXJzaXZlKSB7Ci0gICAgQ1hGQV9Ob2RlKiBwU3JjQ2hpbGQgPSBwU3JjTW9kdWxlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gICAgQ1hGQV9Ob2RlKiBwRHN0Q2hpbGQgPSBwRHN0TW9kdWxlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gICAgZm9yICg7IHBTcmNDaGlsZCAmJiBwRHN0Q2hpbGQ7Ci0gICAgICAgICBwU3JjQ2hpbGQgPSBwU3JjQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyksCi0gICAgICAgICBwRHN0Q2hpbGQgPSBwRHN0Q2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsKLSAgICAgIE1vdmVCdWZmZXJNYXBEYXRhKHBTcmNDaGlsZCwgcERzdENoaWxkLCBwS2V5LCB0cnVlKTsKKyAgcmV0dXJuIFdpZGVTdHJpbmc6OkZvcm1hdCgKKyAgICAgIEwiVGhlIHZhbHVlIHlvdSBlbnRlcmVkIGZvciAlbHMgaXMgaW52YWxpZC4gVG8gaWdub3JlICIKKyAgICAgIEwidmFsaWRhdGlvbnMgZm9yICVscywgY2xpY2sgSWdub3JlLiIsCisgICAgICB3c0NhcHRpb25OYW1lLmNfc3RyKCksIHdzQ2FwdGlvbk5hbWUuY19zdHIoKSk7Cit9CisKK2ludDMyX3QgQ1hGQV9Ob2RlOjpFeGVjdXRlU2NyaXB0KENYRkFfRkZEb2NWaWV3KiBkb2NWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9TY3JpcHQqIHNjcmlwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRXZlbnRQYXJhbSogcEV2ZW50UGFyYW0pIHsKKyAgYm9vbCBiUmV0OworICBpbnQzMl90IGlSZXQ7CisgIHN0ZDo6dGllKGlSZXQsIGJSZXQpID0gRXhlY3V0ZUJvb2xTY3JpcHQoZG9jVmlldywgc2NyaXB0LCBwRXZlbnRQYXJhbSk7CisgIHJldHVybiBpUmV0OworfQorCitzdGQ6OnBhaXI8aW50MzJfdCwgYm9vbD4gQ1hGQV9Ob2RlOjpFeGVjdXRlQm9vbFNjcmlwdCgKKyAgICBDWEZBX0ZGRG9jVmlldyogZG9jVmlldywKKyAgICBDWEZBX1NjcmlwdCogc2NyaXB0LAorICAgIENYRkFfRXZlbnRQYXJhbSogcEV2ZW50UGFyYW0pIHsKKyAgaWYgKG1fRXhlY3V0ZVJlY3Vyc2lvbkRlcHRoID4ga01heEV4ZWN1dGVSZWN1cnNpb24pCisgICAgcmV0dXJuIHtYRkFfRVZFTlRFUlJPUl9TdWNjZXNzLCBmYWxzZX07CisKKyAgQVNTRVJUKHBFdmVudFBhcmFtKTsKKyAgaWYgKCFzY3JpcHQpCisgICAgcmV0dXJuIHtYRkFfRVZFTlRFUlJPUl9Ob3RFeGlzdCwgZmFsc2V9OworICBpZiAoc2NyaXB0LT5HZXRSdW5BdCgpID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpTZXJ2ZXIpCisgICAgcmV0dXJuIHtYRkFfRVZFTlRFUlJPUl9EaXNhYmxlZCwgZmFsc2V9OworCisgIFdpZGVTdHJpbmcgd3NFeHByZXNzaW9uID0gc2NyaXB0LT5HZXRFeHByZXNzaW9uKCk7CisgIGlmICh3c0V4cHJlc3Npb24uSXNFbXB0eSgpKQorICAgIHJldHVybiB7WEZBX0VWRU5URVJST1JfTm90RXhpc3QsIGZhbHNlfTsKKworICBDWEZBX1NjcmlwdDo6VHlwZSBlU2NyaXB0VHlwZSA9IHNjcmlwdC0+R2V0Q29udGVudFR5cGUoKTsKKyAgaWYgKGVTY3JpcHRUeXBlID09IENYRkFfU2NyaXB0OjpUeXBlOjpVbmtub3duKQorICAgIHJldHVybiB7WEZBX0VWRU5URVJST1JfU3VjY2VzcywgZmFsc2V9OworCisgIENYRkFfRkZEb2MqIHBEb2MgPSBkb2NWaWV3LT5HZXREb2MoKTsKKyAgQ0ZYSlNFX0VuZ2luZSogcENvbnRleHQgPSBwRG9jLT5HZXRYRkFEb2MoKS0+R2V0U2NyaXB0Q29udGV4dCgpOworICBwQ29udGV4dC0+U2V0RXZlbnRQYXJhbSgqcEV2ZW50UGFyYW0pOworICBwQ29udGV4dC0+U2V0UnVuQXRUeXBlKHNjcmlwdC0+R2V0UnVuQXQoKSk7CisKKyAgc3RkOjp2ZWN0b3I8Q1hGQV9Ob2RlKj4gcmVmTm9kZXM7CisgIGlmIChwRXZlbnRQYXJhbS0+bV9lVHlwZSA9PSBYRkFfRVZFTlRfSW5pdENhbGN1bGF0ZSB8fAorICAgICAgcEV2ZW50UGFyYW0tPm1fZVR5cGUgPT0gWEZBX0VWRU5UX0NhbGN1bGF0ZSkgeworICAgIHBDb250ZXh0LT5TZXROb2Rlc09mUnVuU2NyaXB0KCZyZWZOb2Rlcyk7CisgIH0KKworICBhdXRvIHBUbXBSZXRWYWx1ZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhKU0VfVmFsdWU+KHBDb250ZXh0LT5HZXRJc29sYXRlKCkpOworICBib29sIGJSZXQgPSBmYWxzZTsKKyAgeworICAgIEF1dG9SZXN0b3Jlcjx1aW50OF90PiByZXN0b3JlcigmbV9FeGVjdXRlUmVjdXJzaW9uRGVwdGgpOworICAgICsrbV9FeGVjdXRlUmVjdXJzaW9uRGVwdGg7CisgICAgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoZVNjcmlwdFR5cGUsIHdzRXhwcmVzc2lvbi5Bc1N0cmluZ1ZpZXcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG1wUmV0VmFsdWUuZ2V0KCksIHRoaXMpOworICB9CisKKyAgaW50MzJfdCBpUmV0ID0gWEZBX0VWRU5URVJST1JfRXJyb3I7CisgIGlmIChiUmV0KSB7CisgICAgaVJldCA9IFhGQV9FVkVOVEVSUk9SX1N1Y2Nlc3M7CisgICAgaWYgKHBFdmVudFBhcmFtLT5tX2VUeXBlID09IFhGQV9FVkVOVF9DYWxjdWxhdGUgfHwKKyAgICAgICAgcEV2ZW50UGFyYW0tPm1fZVR5cGUgPT0gWEZBX0VWRU5UX0luaXRDYWxjdWxhdGUpIHsKKyAgICAgIGlmICghcFRtcFJldFZhbHVlLT5Jc1VuZGVmaW5lZCgpKSB7CisgICAgICAgIGlmICghcFRtcFJldFZhbHVlLT5Jc051bGwoKSkKKyAgICAgICAgICBwRXZlbnRQYXJhbS0+bV93c1Jlc3VsdCA9IHBUbXBSZXRWYWx1ZS0+VG9XaWRlU3RyaW5nKCk7CisKKyAgICAgICAgaVJldCA9IFhGQV9FVkVOVEVSUk9SX1N1Y2Nlc3M7CisgICAgICB9IGVsc2UgeworICAgICAgICBpUmV0ID0gWEZBX0VWRU5URVJST1JfRXJyb3I7CisgICAgICB9CisgICAgICBpZiAocEV2ZW50UGFyYW0tPm1fZVR5cGUgPT0gWEZBX0VWRU5UX0luaXRDYWxjdWxhdGUpIHsKKyAgICAgICAgaWYgKChpUmV0ID09IFhGQV9FVkVOVEVSUk9SX1N1Y2Nlc3MpICYmCisgICAgICAgICAgICAoR2V0UmF3VmFsdWUoKSAhPSBwRXZlbnRQYXJhbS0+bV93c1Jlc3VsdCkpIHsKKyAgICAgICAgICBHZXRXaWRnZXRBY2MoKS0+U2V0VmFsdWUoWEZBX1ZBTFVFUElDVFVSRV9SYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBFdmVudFBhcmFtLT5tX3dzUmVzdWx0KTsKKyAgICAgICAgICBkb2NWaWV3LT5BZGRWYWxpZGF0ZVdpZGdldChHZXRXaWRnZXRBY2MoKSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwUmVmTm9kZSA6IHJlZk5vZGVzKSB7CisgICAgICAgIGlmIChwUmVmTm9kZSA9PSB0aGlzKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIENYRkFfQ2FsY0RhdGEqIHBHbG9iYWxEYXRhID0gcFJlZk5vZGUtPkpTT2JqZWN0KCktPkdldENhbGNEYXRhKCk7CisgICAgICAgIGlmICghcEdsb2JhbERhdGEpIHsKKyAgICAgICAgICBwUmVmTm9kZS0+SlNPYmplY3QoKS0+U2V0Q2FsY0RhdGEoCisgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0NhbGNEYXRhPigpKTsKKyAgICAgICAgICBwR2xvYmFsRGF0YSA9IHBSZWZOb2RlLT5KU09iamVjdCgpLT5HZXRDYWxjRGF0YSgpOworICAgICAgICB9CisgICAgICAgIGlmICghcGRmaXVtOjpDb250YWluc1ZhbHVlKHBHbG9iYWxEYXRhLT5tX0dsb2JhbHMsIHRoaXMpKQorICAgICAgICAgIHBHbG9iYWxEYXRhLT5tX0dsb2JhbHMucHVzaF9iYWNrKHRoaXMpOworICAgICAgfQogICAgIH0KICAgfQotICBwU3JjTW9kdWxlLT5Nb3ZlQnVmZmVyTWFwRGF0YShwRHN0TW9kdWxlLCBwS2V5KTsKKyAgcENvbnRleHQtPlNldE5vZGVzT2ZSdW5TY3JpcHQobnVsbHB0cik7CisKKyAgcmV0dXJuIHtpUmV0LCBwVG1wUmV0VmFsdWUtPklzQm9vbGVhbigpID8gcFRtcFJldFZhbHVlLT5Ub0Jvb2xlYW4oKSA6IGZhbHNlfTsKIH0KIAotdm9pZCBDWEZBX05vZGU6OlRocm93TWlzc2luZ1Byb3BlcnR5RXhjZXB0aW9uKAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiBvYmosCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHByb3ApIGNvbnN0IHsKLSAgVGhyb3dFeGNlcHRpb24oTCInJXMnIGRvZXNuJ3QgaGF2ZSBwcm9wZXJ0eSAnJXMnLiIsIG9iai5jX3N0cigpLAotICAgICAgICAgICAgICAgICBwcm9wLmNfc3RyKCkpOworV2lkZVN0cmluZyBDWEZBX05vZGU6OkdldEJhcmNvZGVUeXBlKCkgeworICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0V2lkZ2V0QWNjKCktPkdldFVJQ2hpbGQoKTsKKyAgcmV0dXJuIHBVSUNoaWxkCisgICAgICAgICAgICAgPyBXaWRlU3RyaW5nKHBVSUNoaWxkLT5KU09iamVjdCgpLT5HZXRDRGF0YShYRkFfQXR0cmlidXRlOjpUeXBlKSkKKyAgICAgICAgICAgICA6IFdpZGVTdHJpbmcoKTsKIH0KIAotdm9pZCBDWEZBX05vZGU6OlRocm93VG9vTWFueU9jY3VyYW5jZXNFeGNlcHRpb24oCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG9iaikgY29uc3QgewotICBUaHJvd0V4Y2VwdGlvbigKLSAgICAgIEwiVGhlIGVsZW1lbnQgWyVzXSBoYXMgdmlvbGF0ZWQgaXRzIGFsbG93YWJsZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMuIiwKLSAgICAgIG9iai5jX3N0cigpKTsKK09wdGlvbmFsPEJDX0NIQVJfRU5DT0RJTkc+IENYRkFfTm9kZTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9DaGFyRW5jb2RpbmcoKSB7CisgIE9wdGlvbmFsPFdpZGVTdHJpbmc+IHdzQ2hhckVuY29kaW5nID0KKyAgICAgIEdldFdpZGdldEFjYygpLT5HZXRVSUNoaWxkKCktPkpTT2JqZWN0KCktPlRyeUNEYXRhKAorICAgICAgICAgIFhGQV9BdHRyaWJ1dGU6OkNoYXJFbmNvZGluZywgdHJ1ZSk7CisgIGlmICghd3NDaGFyRW5jb2RpbmcpCisgICAgcmV0dXJuIHt9OworICBpZiAod3NDaGFyRW5jb2RpbmctPkNvbXBhcmVOb0Nhc2UoTCJVVEYtMTYiKSkKKyAgICByZXR1cm4ge0NIQVJfRU5DT0RJTkdfVU5JQ09ERX07CisgIGlmICh3c0NoYXJFbmNvZGluZy0+Q29tcGFyZU5vQ2FzZShMIlVURi04IikpCisgICAgcmV0dXJuIHtDSEFSX0VOQ09ESU5HX1VURjh9OworICByZXR1cm4ge307Cit9CisKK09wdGlvbmFsPGJvb2w+IENYRkFfTm9kZTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9DaGVja3N1bSgpIHsKKyAgT3B0aW9uYWw8WEZBX0F0dHJpYnV0ZUVudW0+IGNoZWNrc3VtID0KKyAgICAgIEdldFdpZGdldEFjYygpLT5HZXRVSUNoaWxkKCktPkpTT2JqZWN0KCktPlRyeUVudW0oWEZBX0F0dHJpYnV0ZTo6Q2hlY2tzdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICBpZiAoIWNoZWNrc3VtKQorICAgIHJldHVybiB7fTsKKworICBzd2l0Y2ggKCpjaGVja3N1bSkgeworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06Ok5vbmU6CisgICAgICByZXR1cm4ge2ZhbHNlfTsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpBdXRvOgorICAgICAgcmV0dXJuIHt0cnVlfTsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpDaGVja3N1bV8xbW9kMTA6CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6Q2hlY2tzdW1fMW1vZDEwXzFtb2QxMToKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpDaGVja3N1bV8ybW9kMTA6CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiB7fTsKK30KKworT3B0aW9uYWw8aW50MzJfdD4gQ1hGQV9Ob2RlOjpHZXRCYXJjb2RlQXR0cmlidXRlX0RhdGFMZW5ndGgoKSB7CisgIE9wdGlvbmFsPFdpZGVTdHJpbmc+IHdzRGF0YUxlbmd0aCA9CisgICAgICBHZXRXaWRnZXRBY2MoKS0+R2V0VUlDaGlsZCgpLT5KU09iamVjdCgpLT5UcnlDRGF0YSgKKyAgICAgICAgICBYRkFfQXR0cmlidXRlOjpEYXRhTGVuZ3RoLCB0cnVlKTsKKyAgaWYgKCF3c0RhdGFMZW5ndGgpCisgICAgcmV0dXJuIHt9OworCisgIHJldHVybiB7RlhTWVNfd3RvaSh3c0RhdGFMZW5ndGgtPmNfc3RyKCkpfTsKK30KKworT3B0aW9uYWw8Y2hhcj4gQ1hGQV9Ob2RlOjpHZXRCYXJjb2RlQXR0cmlidXRlX1N0YXJ0Q2hhcigpIHsKKyAgT3B0aW9uYWw8V2lkZVN0cmluZz4gd3NTdGFydEVuZENoYXIgPQorICAgICAgR2V0V2lkZ2V0QWNjKCktPkdldFVJQ2hpbGQoKS0+SlNPYmplY3QoKS0+VHJ5Q0RhdGEoCisgICAgICAgICAgWEZBX0F0dHJpYnV0ZTo6U3RhcnRDaGFyLCB0cnVlKTsKKyAgaWYgKCF3c1N0YXJ0RW5kQ2hhciB8fCB3c1N0YXJ0RW5kQ2hhci0+SXNFbXB0eSgpKQorICAgIHJldHVybiB7fTsKKworICByZXR1cm4ge3N0YXRpY19jYXN0PGNoYXI+KCgqd3NTdGFydEVuZENoYXIpWzBdKX07Cit9CisKK09wdGlvbmFsPGNoYXI+IENYRkFfTm9kZTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9FbmRDaGFyKCkgeworICBPcHRpb25hbDxXaWRlU3RyaW5nPiB3c1N0YXJ0RW5kQ2hhciA9CisgICAgICBHZXRXaWRnZXRBY2MoKS0+R2V0VUlDaGlsZCgpLT5KU09iamVjdCgpLT5UcnlDRGF0YShYRkFfQXR0cmlidXRlOjpFbmRDaGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgIGlmICghd3NTdGFydEVuZENoYXIgfHwgd3NTdGFydEVuZENoYXItPklzRW1wdHkoKSkKKyAgICByZXR1cm4ge307CisKKyAgcmV0dXJuIHtzdGF0aWNfY2FzdDxjaGFyPigoKndzU3RhcnRFbmRDaGFyKVswXSl9OworfQorCitPcHRpb25hbDxpbnQzMl90PiBDWEZBX05vZGU6OkdldEJhcmNvZGVBdHRyaWJ1dGVfRUNMZXZlbCgpIHsKKyAgT3B0aW9uYWw8V2lkZVN0cmluZz4gd3NFQ0xldmVsID0KKyAgICAgIEdldFdpZGdldEFjYygpLT5HZXRVSUNoaWxkKCktPkpTT2JqZWN0KCktPlRyeUNEYXRhKAorICAgICAgICAgIFhGQV9BdHRyaWJ1dGU6OkVycm9yQ29ycmVjdGlvbkxldmVsLCB0cnVlKTsKKyAgaWYgKCF3c0VDTGV2ZWwpCisgICAgcmV0dXJuIHt9OworICByZXR1cm4ge0ZYU1lTX3d0b2kod3NFQ0xldmVsLT5jX3N0cigpKX07Cit9CisKK09wdGlvbmFsPGludDMyX3Q+IENYRkFfTm9kZTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9Nb2R1bGVXaWR0aCgpIHsKKyAgT3B0aW9uYWw8Q1hGQV9NZWFzdXJlbWVudD4gbW9kdWxlV2lkdGhIZWlnaHQgPQorICAgICAgR2V0V2lkZ2V0QWNjKCktPkdldFVJQ2hpbGQoKS0+SlNPYmplY3QoKS0+VHJ5TWVhc3VyZSgKKyAgICAgICAgICBYRkFfQXR0cmlidXRlOjpNb2R1bGVXaWR0aCwgdHJ1ZSk7CisgIGlmICghbW9kdWxlV2lkdGhIZWlnaHQpCisgICAgcmV0dXJuIHt9OworCisgIHJldHVybiB7c3RhdGljX2Nhc3Q8aW50MzJfdD4obW9kdWxlV2lkdGhIZWlnaHQtPlRvVW5pdChYRkFfVW5pdDo6UHQpKX07Cit9CisKK09wdGlvbmFsPGludDMyX3Q+IENYRkFfTm9kZTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9Nb2R1bGVIZWlnaHQoKSB7CisgIE9wdGlvbmFsPENYRkFfTWVhc3VyZW1lbnQ+IG1vZHVsZVdpZHRoSGVpZ2h0ID0KKyAgICAgIEdldFdpZGdldEFjYygpLT5HZXRVSUNoaWxkKCktPkpTT2JqZWN0KCktPlRyeU1lYXN1cmUoCisgICAgICAgICAgWEZBX0F0dHJpYnV0ZTo6TW9kdWxlSGVpZ2h0LCB0cnVlKTsKKyAgaWYgKCFtb2R1bGVXaWR0aEhlaWdodCkKKyAgICByZXR1cm4ge307CisKKyAgcmV0dXJuIHtzdGF0aWNfY2FzdDxpbnQzMl90Pihtb2R1bGVXaWR0aEhlaWdodC0+VG9Vbml0KFhGQV9Vbml0OjpQdCkpfTsKK30KKworT3B0aW9uYWw8Ym9vbD4gQ1hGQV9Ob2RlOjpHZXRCYXJjb2RlQXR0cmlidXRlX1ByaW50Q2hlY2tzdW0oKSB7CisgIHJldHVybiBHZXRXaWRnZXRBY2MoKS0+R2V0VUlDaGlsZCgpLT5KU09iamVjdCgpLT5UcnlCb29sZWFuKAorICAgICAgWEZBX0F0dHJpYnV0ZTo6UHJpbnRDaGVja0RpZ2l0LCB0cnVlKTsKK30KKworT3B0aW9uYWw8QkNfVEVYVF9MT0M+IENYRkFfTm9kZTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9UZXh0TG9jYXRpb24oKSB7CisgIE9wdGlvbmFsPFhGQV9BdHRyaWJ1dGVFbnVtPiB0ZXh0TG9jYXRpb24gPQorICAgICAgR2V0V2lkZ2V0QWNjKCktPkdldFVJQ2hpbGQoKS0+SlNPYmplY3QoKS0+VHJ5RW51bSgKKyAgICAgICAgICBYRkFfQXR0cmlidXRlOjpUZXh0TG9jYXRpb24sIHRydWUpOworICBpZiAoIXRleHRMb2NhdGlvbikKKyAgICByZXR1cm4ge307CisKKyAgc3dpdGNoICgqdGV4dExvY2F0aW9uKSB7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6Tm9uZToKKyAgICAgIHJldHVybiB7QkNfVEVYVF9MT0NfTk9ORX07CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6QWJvdmU6CisgICAgICByZXR1cm4ge0JDX1RFWFRfTE9DX0FCT1ZFfTsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpCZWxvdzoKKyAgICAgIHJldHVybiB7QkNfVEVYVF9MT0NfQkVMT1d9OworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkFib3ZlRW1iZWRkZWQ6CisgICAgICByZXR1cm4ge0JDX1RFWFRfTE9DX0FCT1ZFRU1CRUR9OworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkJlbG93RW1iZWRkZWQ6CisgICAgICByZXR1cm4ge0JDX1RFWFRfTE9DX0JFTE9XRU1CRUR9OworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4ge307Cit9CisKK09wdGlvbmFsPGJvb2w+IENYRkFfTm9kZTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9UcnVuY2F0ZSgpIHsKKyAgcmV0dXJuIEdldFdpZGdldEFjYygpLT5HZXRVSUNoaWxkKCktPkpTT2JqZWN0KCktPlRyeUJvb2xlYW4oCisgICAgICBYRkFfQXR0cmlidXRlOjpUcnVuY2F0ZSwgdHJ1ZSk7Cit9CisKK09wdGlvbmFsPGludDhfdD4gQ1hGQV9Ob2RlOjpHZXRCYXJjb2RlQXR0cmlidXRlX1dpZGVOYXJyb3dSYXRpbygpIHsKKyAgT3B0aW9uYWw8V2lkZVN0cmluZz4gd3NXaWRlTmFycm93UmF0aW8gPQorICAgICAgR2V0V2lkZ2V0QWNjKCktPkdldFVJQ2hpbGQoKS0+SlNPYmplY3QoKS0+VHJ5Q0RhdGEoCisgICAgICAgICAgWEZBX0F0dHJpYnV0ZTo6V2lkZU5hcnJvd1JhdGlvLCB0cnVlKTsKKyAgaWYgKCF3c1dpZGVOYXJyb3dSYXRpbykKKyAgICByZXR1cm4ge307CisKKyAgT3B0aW9uYWw8c2l6ZV90PiBwdFBvcyA9IHdzV2lkZU5hcnJvd1JhdGlvLT5GaW5kKCc6Jyk7CisgIGlmICghcHRQb3MpCisgICAgcmV0dXJuIHtzdGF0aWNfY2FzdDxpbnQ4X3Q+KEZYU1lTX3d0b2kod3NXaWRlTmFycm93UmF0aW8tPmNfc3RyKCkpKX07CisKKyAgaW50MzJfdCBmQiA9IEZYU1lTX3d0b2koCisgICAgICB3c1dpZGVOYXJyb3dSYXRpby0+UmlnaHQod3NXaWRlTmFycm93UmF0aW8tPkdldExlbmd0aCgpIC0gKCpwdFBvcyArIDEpKQorICAgICAgICAgIC5jX3N0cigpKTsKKyAgaWYgKCFmQikKKyAgICByZXR1cm4gezB9OworCisgIGludDMyX3QgZkEgPSBGWFNZU193dG9pKHdzV2lkZU5hcnJvd1JhdGlvLT5MZWZ0KCpwdFBvcykuY19zdHIoKSk7CisgIGZsb2F0IHJlc3VsdCA9IHN0YXRpY19jYXN0PGZsb2F0PihmQSkgLyBzdGF0aWNfY2FzdDxmbG9hdD4oZkIpOworICByZXR1cm4ge3N0YXRpY19jYXN0PGludDhfdD4ocmVzdWx0KX07CiB9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4YTlhZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaApAQCAtMCwwICsxLDM2MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX05PREVfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTk9ERV9IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorI2luY2x1ZGUgImZ4YmFyY29kZS9CQ19MaWJyYXJ5LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9vcHRpb25hbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX29iamVjdC5oIgorCitjbGFzcyBDRlhfWE1MTm9kZTsKK2NsYXNzIENYRkFfQmluZDsKK2NsYXNzIENYRkFfQm9yZGVyOworY2xhc3MgQ1hGQV9DYWxjdWxhdGU7CitjbGFzcyBDWEZBX0NhcHRpb247CitjbGFzcyBDWEZBX0V2ZW50OworY2xhc3MgQ1hGQV9FdmVudFBhcmFtOworY2xhc3MgQ1hGQV9GRkRvY1ZpZXc7CitjbGFzcyBDWEZBX0ZvbnQ7CitjbGFzcyBDWEZBX01hcmdpbjsKK2NsYXNzIENYRkFfT2NjdXI7CitjbGFzcyBDWEZBX1BhcmE7CitjbGFzcyBDWEZBX1NjcmlwdDsKK2NsYXNzIENYRkFfVmFsaWRhdGU7CitjbGFzcyBDWEZBX1ZhbHVlOworY2xhc3MgQ1hGQV9XaWRnZXRBY2M7CitjbGFzcyBJRlhfTG9jYWxlOworCisjZGVmaW5lIFhGQV9OT0RFRklMVEVSX0NoaWxkcmVuIDB4MDEKKyNkZWZpbmUgWEZBX05PREVGSUxURVJfUHJvcGVydGllcyAweDAyCisjZGVmaW5lIFhGQV9OT0RFRklMVEVSX09uZU9mUHJvcGVydHkgMHgwNAorCitlbnVtIFhGQV9Ob2RlRmxhZyB7CisgIFhGQV9Ob2RlRmxhZ19Ob25lID0gMCwKKyAgWEZBX05vZGVGbGFnX0luaXRpYWxpemVkID0gMSA8PCAwLAorICBYRkFfTm9kZUZsYWdfSGFzUmVtb3ZlZENoaWxkcmVuID0gMSA8PCAxLAorICBYRkFfTm9kZUZsYWdfTmVlZHNJbml0QXBwID0gMSA8PCAyLAorICBYRkFfTm9kZUZsYWdfQmluZEZvcm1JdGVtcyA9IDEgPDwgMywKKyAgWEZBX05vZGVGbGFnX1VzZXJJbnRlcmFjdGl2ZSA9IDEgPDwgNCwKKyAgWEZBX05vZGVGbGFnX1NraXBEYXRhQmluZGluZyA9IDEgPDwgNSwKKyAgWEZBX05vZGVGbGFnX093blhNTE5vZGUgPSAxIDw8IDYsCisgIFhGQV9Ob2RlRmxhZ19VbnVzZWROb2RlID0gMSA8PCA3LAorICBYRkFfTm9kZUZsYWdfTGF5b3V0R2VuZXJhdGVkTm9kZSA9IDEgPDwgOAorfTsKKworY2xhc3MgQ1hGQV9Ob2RlIDogcHVibGljIENYRkFfT2JqZWN0IHsKKyBwdWJsaWM6CisgIHN0cnVjdCBQcm9wZXJ0eURhdGEgeworICAgIFhGQV9FbGVtZW50IHByb3BlcnR5OworICAgIHVpbnQ4X3Qgb2NjdXJhbmNlX2NvdW50OworICAgIHVpbnQ4X3QgZmxhZ3M7CisgIH07CisKKyAgc3RydWN0IEF0dHJpYnV0ZURhdGEgeworICAgIFhGQV9BdHRyaWJ1dGUgYXR0cmlidXRlOworICAgIFhGQV9BdHRyaWJ1dGVUeXBlIHR5cGU7CisgICAgdm9pZCogZGVmYXVsdF92YWx1ZTsKKyAgfTsKKworI2lmbmRlZiBOREVCVUcKKyAgc3RhdGljIFdpZGVTdHJpbmcgRWxlbWVudFRvTmFtZShYRkFfRWxlbWVudCBlbGVtKTsKKyNlbmRpZiAgLy8gTkRFQlVHCisKKyAgc3RhdGljIFdpZGVTdHJpbmcgQXR0cmlidXRlRW51bVRvTmFtZShYRkFfQXR0cmlidXRlRW51bSBpdGVtKTsKKyAgc3RhdGljIE9wdGlvbmFsPFhGQV9BdHRyaWJ1dGVFbnVtPiBOYW1lVG9BdHRyaWJ1dGVFbnVtKAorICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIG5hbWUpOworICBzdGF0aWMgWEZBX0F0dHJpYnV0ZSBOYW1lVG9BdHRyaWJ1dGUoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIG5hbWUpOworICBzdGF0aWMgV2lkZVN0cmluZyBBdHRyaWJ1dGVUb05hbWUoWEZBX0F0dHJpYnV0ZSBhdHRyKTsKKyAgc3RhdGljIFhGQV9FbGVtZW50IE5hbWVUb0VsZW1lbnQoY29uc3QgV2lkZVN0cmluZyYgbmFtZSk7CisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9Ob2RlPiBDcmVhdGUoQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50IGVsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKworICB+Q1hGQV9Ob2RlKCkgb3ZlcnJpZGU7CisKKyAgYm9vbCBJc1ZhbGlkSW5QYWNrZXQoWEZBX1BhY2tldFR5cGUgcGFja2V0KSBjb25zdDsKKworICBib29sIEhhc1Byb3BlcnR5KFhGQV9FbGVtZW50IHByb3BlcnR5KSBjb25zdDsKKyAgYm9vbCBIYXNQcm9wZXJ0eUZsYWdzKFhGQV9FbGVtZW50IHByb3BlcnR5LCB1aW50OF90IGZsYWdzKSBjb25zdDsKKyAgdWludDhfdCBQcm9wZXJ0eU9jY3VyYW5jZUNvdW50KFhGQV9FbGVtZW50IHByb3BlcnR5KSBjb25zdDsKKworICB2b2lkIFNlbmRBdHRyaWJ1dGVDaGFuZ2VNZXNzYWdlKFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSwgYm9vbCBiU2NyaXB0TW9kaWZ5KTsKKworICBib29sIEhhc0F0dHJpYnV0ZShYRkFfQXR0cmlidXRlIGF0dHIpIGNvbnN0OworICBYRkFfQXR0cmlidXRlIEdldEF0dHJpYnV0ZShzaXplX3QgaSkgY29uc3Q7CisgIFhGQV9BdHRyaWJ1dGVUeXBlIEdldEF0dHJpYnV0ZVR5cGUoWEZBX0F0dHJpYnV0ZSB0eXBlKSBjb25zdDsKKworICBYRkFfUGFja2V0VHlwZSBHZXRQYWNrZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9lUGFja2V0OyB9CisKKyAgdm9pZCBTZXRGbGFnKHVpbnQzMl90IGR3RmxhZywgYm9vbCBiTm90aWZ5KTsKKyAgdm9pZCBDbGVhckZsYWcodWludDMyX3QgZHdGbGFnKTsKKworICBDWEZBX05vZGUqIENyZWF0ZUluc3RhbmNlSWZQb3NzaWJsZShib29sIGJEYXRhTWVyZ2UpOworICBpbnQzMl90IEdldENvdW50KCk7CisgIENYRkFfTm9kZSogR2V0SXRlbUlmRXhpc3RzKGludDMyX3QgaUluZGV4KTsKKyAgdm9pZCBSZW1vdmVJdGVtKENYRkFfTm9kZSogcFJlbW92ZUluc3RhbmNlLCBib29sIGJSZW1vdmVEYXRhQmluZGluZyk7CisgIHZvaWQgSW5zZXJ0SXRlbShDWEZBX05vZGUqIHBOZXdJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgIGludDMyX3QgaVBvcywKKyAgICAgICAgICAgICAgICAgIGludDMyX3QgaUNvdW50LAorICAgICAgICAgICAgICAgICAgYm9vbCBiTW92ZURhdGFCaW5kaW5nTm9kZXMpOworCisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0IHsgcmV0dXJuIEhhc0ZsYWcoWEZBX05vZGVGbGFnX0luaXRpYWxpemVkKTsgfQorICBib29sIElzT3duWE1MTm9kZSgpIGNvbnN0IHsgcmV0dXJuIEhhc0ZsYWcoWEZBX05vZGVGbGFnX093blhNTE5vZGUpOyB9CisgIGJvb2wgSXNVc2VySW50ZXJhY3RpdmUoKSBjb25zdCB7CisgICAgcmV0dXJuIEhhc0ZsYWcoWEZBX05vZGVGbGFnX1VzZXJJbnRlcmFjdGl2ZSk7CisgIH0KKyAgYm9vbCBJc1VudXNlZE5vZGUoKSBjb25zdCB7IHJldHVybiBIYXNGbGFnKFhGQV9Ob2RlRmxhZ19VbnVzZWROb2RlKTsgfQorICBib29sIElzTGF5b3V0R2VuZXJhdGVkTm9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gSGFzRmxhZyhYRkFfTm9kZUZsYWdfTGF5b3V0R2VuZXJhdGVkTm9kZSk7CisgIH0KKworICB2b2lkIFNldEJpbmRpbmdOb2RlcyhzdGQ6OnZlY3RvcjxVbm93bmVkUHRyPENYRkFfTm9kZT4+IG5vZGVzKSB7CisgICAgYmluZGluZ19ub2Rlc18gPSBzdGQ6Om1vdmUobm9kZXMpOworICB9CisgIHN0ZDo6dmVjdG9yPFVub3duZWRQdHI8Q1hGQV9Ob2RlPj4qIEdldEJpbmRpbmdOb2RlcygpIHsKKyAgICByZXR1cm4gJmJpbmRpbmdfbm9kZXNfOworICB9CisgIHZvaWQgU2V0QmluZGluZ05vZGUoQ1hGQV9Ob2RlKiBub2RlKSB7CisgICAgYmluZGluZ19ub2Rlc18uY2xlYXIoKTsKKyAgICBpZiAobm9kZSkKKyAgICAgIGJpbmRpbmdfbm9kZXNfLmVtcGxhY2VfYmFjayhub2RlKTsKKyAgfQorICBDWEZBX05vZGUqIEdldEJpbmRpbmdOb2RlKCkgY29uc3QgeworICAgIGlmIChiaW5kaW5nX25vZGVzXy5lbXB0eSgpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIGJpbmRpbmdfbm9kZXNfWzBdLkdldCgpOworICB9CisgIC8vIFRPRE8oZHNpbmNsYWlyKTogVGhpcyBzaG91bGQgbm90IGJlIG5lZWRlZC4gTm9kZXMgc2hvdWxkIGdldCB1bi1ib3VuZCB3aGVuCisgIC8vIHRoZXkncmUgZGVsZXRlZCBpbnN0ZWFkIG9mIHVzIHBvaW50aW5nIHRvIGJhZCBvYmplY3RzLgorICB2b2lkIFJlbGVhc2VCaW5kaW5nTm9kZXMoKTsKKworICBib29sIEJpbmRzRm9ybUl0ZW1zKCkgY29uc3QgeyByZXR1cm4gSGFzRmxhZyhYRkFfTm9kZUZsYWdfQmluZEZvcm1JdGVtcyk7IH0KKyAgYm9vbCBIYXNSZW1vdmVkQ2hpbGRyZW4oKSBjb25zdCB7CisgICAgcmV0dXJuIEhhc0ZsYWcoWEZBX05vZGVGbGFnX0hhc1JlbW92ZWRDaGlsZHJlbik7CisgIH0KKyAgYm9vbCBOZWVkc0luaXRBcHAoKSBjb25zdCB7IHJldHVybiBIYXNGbGFnKFhGQV9Ob2RlRmxhZ19OZWVkc0luaXRBcHApOyB9CisKKyAgYm9vbCBJc0F0dHJpYnV0ZUluWE1MKCk7CisgIGJvb2wgSXNGb3JtQ29udGFpbmVyKCkgY29uc3QgeworICAgIHJldHVybiBtX2VQYWNrZXQgPT0gWEZBX1BhY2tldFR5cGU6OkZvcm0gJiYgSXNDb250YWluZXJOb2RlKCk7CisgIH0KKyAgdm9pZCBTZXRYTUxNYXBwaW5nTm9kZShDRlhfWE1MTm9kZSogcFhNTE5vZGUpIHsgbV9wWE1MTm9kZSA9IHBYTUxOb2RlOyB9CisgIENGWF9YTUxOb2RlKiBHZXRYTUxNYXBwaW5nTm9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fcFhNTE5vZGU7IH0KKyAgQ0ZYX1hNTE5vZGUqIENyZWF0ZVhNTE1hcHBpbmdOb2RlKCk7CisgIGJvb2wgSXNOZWVkU2F2aW5nWE1MTm9kZSgpOworICB1aW50MzJfdCBHZXROYW1lSGFzaCgpIGNvbnN0IHsgcmV0dXJuIG1fZHdOYW1lSGFzaDsgfQorICBib29sIElzVW5uYW1lZCgpIGNvbnN0IHsgcmV0dXJuIG1fZHdOYW1lSGFzaCA9PSAwOyB9CisgIENYRkFfTm9kZSogR2V0TW9kZWxOb2RlKCk7CisgIHZvaWQgVXBkYXRlTmFtZUhhc2goKTsKKworICBzaXplX3QgQ291bnRDaGlsZHJlbihYRkFfRWxlbWVudCBlVHlwZSwgYm9vbCBiT25seUNoaWxkKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgVCogR2V0Q2hpbGQoc2l6ZV90IGluZGV4LCBYRkFfRWxlbWVudCBlVHlwZSwgYm9vbCBiT25seUNoaWxkKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPihHZXRDaGlsZEludGVybmFsKGluZGV4LCBlVHlwZSwgYk9ubHlDaGlsZCkpOworICB9CisKKyAgaW50MzJfdCBJbnNlcnRDaGlsZChpbnQzMl90IGluZGV4LCBDWEZBX05vZGUqIHBOb2RlKTsKKyAgYm9vbCBJbnNlcnRDaGlsZChDWEZBX05vZGUqIHBOb2RlLCBDWEZBX05vZGUqIHBCZWZvcmVOb2RlKTsKKyAgYm9vbCBSZW1vdmVDaGlsZChDWEZBX05vZGUqIHBOb2RlLCBib29sIGJOb3RpZnkpOworCisgIENYRkFfTm9kZSogQ2xvbmUoYm9vbCBiUmVjdXJzaXZlKTsKKworICBDWEZBX05vZGUqIEdldE5leHRTaWJsaW5nKCkgY29uc3QgeyByZXR1cm4gbV9wTmV4dDsgfQorICBDWEZBX05vZGUqIEdldFByZXZTaWJsaW5nKCkgY29uc3Q7CisgIENYRkFfTm9kZSogR2V0Rmlyc3RDaGlsZCgpIGNvbnN0IHsgcmV0dXJuIG1fcENoaWxkOyB9CisgIENYRkFfTm9kZSogR2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4gbV9wUGFyZW50OyB9CisKKyAgQ1hGQV9Ob2RlKiBHZXROZXh0Q29udGFpbmVyU2libGluZygpIGNvbnN0OworICBDWEZBX05vZGUqIEdldFByZXZDb250YWluZXJTaWJsaW5nKCkgY29uc3Q7CisgIENYRkFfTm9kZSogR2V0Rmlyc3RDb250YWluZXJDaGlsZCgpIGNvbnN0OworICBDWEZBX05vZGUqIEdldENvbnRhaW5lclBhcmVudCgpIGNvbnN0OworCisgIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+IEdldE5vZGVMaXN0KHVpbnQzMl90IGR3VHlwZUZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQgZVR5cGVGaWx0ZXIpOworICBDWEZBX05vZGUqIENyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FbGVtZW50IGVUeXBlKTsKKyAgQ1hGQV9Ob2RlKiBDbG9uZVRlbXBsYXRlVG9Gb3JtKGJvb2wgYlJlY3Vyc2l2ZSk7CisgIENYRkFfTm9kZSogR2V0VGVtcGxhdGVOb2RlSWZFeGlzdHMoKSBjb25zdDsKKyAgdm9pZCBTZXRUZW1wbGF0ZU5vZGUoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlKTsKKyAgQ1hGQV9Ob2RlKiBHZXREYXRhRGVzY3JpcHRpb25Ob2RlKCk7CisgIHZvaWQgU2V0RGF0YURlc2NyaXB0aW9uTm9kZShDWEZBX05vZGUqIHBEYXRhRGVzY3JpcHRpb25Ob2RlKTsKKyAgQ1hGQV9Ob2RlKiBHZXRCaW5kRGF0YSgpOworICBzdGQ6OnZlY3RvcjxVbm93bmVkUHRyPENYRkFfTm9kZT4+KiBHZXRCaW5kSXRlbXMoKTsKKyAgaW50MzJfdCBBZGRCaW5kSXRlbShDWEZBX05vZGUqIHBGb3JtTm9kZSk7CisgIGludDMyX3QgUmVtb3ZlQmluZEl0ZW0oQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpOworICBib29sIEhhc0JpbmRJdGVtKCk7CisgIENYRkFfV2lkZ2V0QWNjKiBHZXRDb250YWluZXJXaWRnZXRBY2MoKTsKKyAgSUZYX0xvY2FsZSogR2V0TG9jYWxlKCk7CisgIE9wdGlvbmFsPFdpZGVTdHJpbmc+IEdldExvY2FsZU5hbWUoKTsKKyAgWEZBX0F0dHJpYnV0ZUVudW0gR2V0SW50YWN0KCk7CisKKyAgQ1hGQV9Ob2RlKiBHZXRGaXJzdENoaWxkQnlOYW1lKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c05vZGVOYW1lKSBjb25zdDsKKyAgQ1hGQV9Ob2RlKiBHZXRGaXJzdENoaWxkQnlOYW1lKHVpbnQzMl90IGR3Tm9kZU5hbWVIYXNoKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFQqIEdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50IGVUeXBlKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPihHZXRGaXJzdENoaWxkQnlDbGFzc0ludGVybmFsKGVUeXBlKSk7CisgIH0KKyAgQ1hGQV9Ob2RlKiBHZXROZXh0U2FtZU5hbWVTaWJsaW5nKHVpbnQzMl90IGR3Tm9kZU5hbWVIYXNoKSBjb25zdDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFQqIEdldE5leHRTYW1lTmFtZVNpYmxpbmcoY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzTm9kZU5hbWUpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KEdldE5leHRTYW1lTmFtZVNpYmxpbmdJbnRlcm5hbCh3c05vZGVOYW1lKSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIFQqIEdldE5leHRTYW1lQ2xhc3NTaWJsaW5nKFhGQV9FbGVtZW50IGVUeXBlKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPihHZXROZXh0U2FtZUNsYXNzU2libGluZ0ludGVybmFsKGVUeXBlKSk7CisgIH0KKworICBpbnQzMl90IEdldE5vZGVTYW1lTmFtZUluZGV4KCkgY29uc3Q7CisgIGludDMyX3QgR2V0Tm9kZVNhbWVDbGFzc0luZGV4KCkgY29uc3Q7CisgIENYRkFfTm9kZSogR2V0SW5zdGFuY2VNZ3JPZlN1YmZvcm0oKTsKKworICBDWEZBX09jY3VyKiBHZXRPY2N1cklmRXhpc3RzKCk7CisKKyAgT3B0aW9uYWw8Ym9vbD4gR2V0RGVmYXVsdEJvb2xlYW4oWEZBX0F0dHJpYnV0ZSBhdHRyKSBjb25zdDsKKyAgT3B0aW9uYWw8aW50MzJfdD4gR2V0RGVmYXVsdEludGVnZXIoWEZBX0F0dHJpYnV0ZSBhdHRyKSBjb25zdDsKKyAgT3B0aW9uYWw8Q1hGQV9NZWFzdXJlbWVudD4gR2V0RGVmYXVsdE1lYXN1cmVtZW50KFhGQV9BdHRyaWJ1dGUgYXR0cikgY29uc3Q7CisgIE9wdGlvbmFsPFdpZGVTdHJpbmc+IEdldERlZmF1bHRDRGF0YShYRkFfQXR0cmlidXRlIGF0dHIpIGNvbnN0OworICBPcHRpb25hbDxYRkFfQXR0cmlidXRlRW51bT4gR2V0RGVmYXVsdEVudW0oWEZBX0F0dHJpYnV0ZSBhdHRyKSBjb25zdDsKKworICB2b2lkIFN5bmNWYWx1ZShjb25zdCBXaWRlU3RyaW5nJiB3c1ZhbHVlLCBib29sIGJOb3RpZnkpOworCisgIGJvb2wgSXNPcGVuQWNjZXNzKCk7CisKKyAgQ1hGQV9Cb3JkZXIqIEdldEJvcmRlcklmRXhpc3RzKCkgY29uc3Q7CisgIENYRkFfQm9yZGVyKiBHZXRPckNyZWF0ZUJvcmRlcklmUG9zc2libGUoKTsKKyAgQ1hGQV9DYXB0aW9uKiBHZXRDYXB0aW9uSWZFeGlzdHMoKSBjb25zdDsKKworICBDWEZBX0ZvbnQqIEdldEZvbnRJZkV4aXN0cygpIGNvbnN0OworICBDWEZBX0ZvbnQqIEdldE9yQ3JlYXRlRm9udElmUG9zc2libGUoKTsKKyAgZmxvYXQgR2V0Rm9udFNpemUoKSBjb25zdDsKKyAgRlhfQVJHQiBHZXRUZXh0Q29sb3IoKSBjb25zdDsKKyAgZmxvYXQgR2V0TGluZUhlaWdodCgpIGNvbnN0OworCisgIENYRkFfTWFyZ2luKiBHZXRNYXJnaW5JZkV4aXN0cygpIGNvbnN0OworICBDWEZBX1BhcmEqIEdldFBhcmFJZkV4aXN0cygpIGNvbnN0OworICBDWEZBX0NhbGN1bGF0ZSogR2V0Q2FsY3VsYXRlSWZFeGlzdHMoKSBjb25zdDsKKyAgQ1hGQV9WYWxpZGF0ZSogR2V0VmFsaWRhdGVJZkV4aXN0cygpIGNvbnN0OworICBDWEZBX1ZhbGlkYXRlKiBHZXRPckNyZWF0ZVZhbGlkYXRlSWZQb3NzaWJsZSgpOworCisgIENYRkFfVmFsdWUqIEdldERlZmF1bHRWYWx1ZUlmRXhpc3RzKCk7CisgIENYRkFfVmFsdWUqIEdldEZvcm1WYWx1ZUlmRXhpc3RzKCkgY29uc3Q7CisgIFdpZGVTdHJpbmcgR2V0UmF3VmFsdWUoKTsKKyAgaW50MzJfdCBHZXRSb3RhdGUoKTsKKworICBDWEZBX0JpbmQqIEdldEJpbmRJZkV4aXN0cygpIGNvbnN0OworCisgIE9wdGlvbmFsPGZsb2F0PiBUcnlXaWR0aCgpOworICBPcHRpb25hbDxmbG9hdD4gVHJ5SGVpZ2h0KCk7CisgIE9wdGlvbmFsPGZsb2F0PiBUcnlNaW5XaWR0aCgpOworICBPcHRpb25hbDxmbG9hdD4gVHJ5TWluSGVpZ2h0KCk7CisgIE9wdGlvbmFsPGZsb2F0PiBUcnlNYXhXaWR0aCgpOworICBPcHRpb25hbDxmbG9hdD4gVHJ5TWF4SGVpZ2h0KCk7CisKKyAgQ1hGQV9Ob2RlKiBHZXRFeGNsR3JvdXBJZkV4aXN0cygpOworCisgIGludDMyX3QgUHJvY2Vzc0V2ZW50KENYRkFfRkZEb2NWaWV3KiBkb2NWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlRW51bSBpQWN0aXZpdHksCisgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRXZlbnRQYXJhbSogcEV2ZW50UGFyYW0pOworICBpbnQzMl90IFByb2Nlc3NFdmVudChDWEZBX0ZGRG9jVmlldyogZG9jVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9FdmVudCogZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRXZlbnRQYXJhbSogcEV2ZW50UGFyYW0pOworICBpbnQzMl90IFByb2Nlc3NDYWxjdWxhdGUoQ1hGQV9GRkRvY1ZpZXcqIGRvY1ZpZXcpOworICBpbnQzMl90IFByb2Nlc3NWYWxpZGF0ZShDWEZBX0ZGRG9jVmlldyogZG9jVmlldywgaW50MzJfdCBpRmxhZ3MpOworCisgIGludDMyX3QgRXhlY3V0ZVNjcmlwdChDWEZBX0ZGRG9jVmlldyogZG9jVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfU2NyaXB0KiBzY3JpcHQsCisgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0V2ZW50UGFyYW0qIHBFdmVudFBhcmFtKTsKKyAgc3RkOjpwYWlyPGludDMyX3QsIGJvb2w+IEV4ZWN1dGVCb29sU2NyaXB0KENYRkFfRkZEb2NWaWV3KiBkb2NWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9TY3JpcHQqIHNjcmlwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRXZlbnRQYXJhbSogcEV2ZW50UGFyYW0pOworCisgIC8vIFRPRE8oZHNpbmNsYWlyKTogRmlndXJlIG91dCBob3cgdG8gbW92ZSB0aGlzIHRvIGN4ZmFfYmFyY29kZS4KKyAgV2lkZVN0cmluZyBHZXRCYXJjb2RlVHlwZSgpOworICBPcHRpb25hbDxCQ19DSEFSX0VOQ09ESU5HPiBHZXRCYXJjb2RlQXR0cmlidXRlX0NoYXJFbmNvZGluZygpOworICBPcHRpb25hbDxib29sPiBHZXRCYXJjb2RlQXR0cmlidXRlX0NoZWNrc3VtKCk7CisgIE9wdGlvbmFsPGludDMyX3Q+IEdldEJhcmNvZGVBdHRyaWJ1dGVfRGF0YUxlbmd0aCgpOworICBPcHRpb25hbDxjaGFyPiBHZXRCYXJjb2RlQXR0cmlidXRlX1N0YXJ0Q2hhcigpOworICBPcHRpb25hbDxjaGFyPiBHZXRCYXJjb2RlQXR0cmlidXRlX0VuZENoYXIoKTsKKyAgT3B0aW9uYWw8aW50MzJfdD4gR2V0QmFyY29kZUF0dHJpYnV0ZV9FQ0xldmVsKCk7CisgIE9wdGlvbmFsPGludDMyX3Q+IEdldEJhcmNvZGVBdHRyaWJ1dGVfTW9kdWxlV2lkdGgoKTsKKyAgT3B0aW9uYWw8aW50MzJfdD4gR2V0QmFyY29kZUF0dHJpYnV0ZV9Nb2R1bGVIZWlnaHQoKTsKKyAgT3B0aW9uYWw8Ym9vbD4gR2V0QmFyY29kZUF0dHJpYnV0ZV9QcmludENoZWNrc3VtKCk7CisgIE9wdGlvbmFsPEJDX1RFWFRfTE9DPiBHZXRCYXJjb2RlQXR0cmlidXRlX1RleHRMb2NhdGlvbigpOworICBPcHRpb25hbDxib29sPiBHZXRCYXJjb2RlQXR0cmlidXRlX1RydW5jYXRlKCk7CisgIE9wdGlvbmFsPGludDhfdD4gR2V0QmFyY29kZUF0dHJpYnV0ZV9XaWRlTmFycm93UmF0aW8oKTsKKworIHByb3RlY3RlZDoKKyAgQ1hGQV9Ob2RlKENYRkFfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBlUGFja2V0LAorICAgICAgICAgICAgdWludDMyX3QgdmFsaWRQYWNrZXRzLAorICAgICAgICAgICAgWEZBX09iamVjdFR5cGUgb1R5cGUsCisgICAgICAgICAgICBYRkFfRWxlbWVudCBlVHlwZSwKKyAgICAgICAgICAgIGNvbnN0IFByb3BlcnR5RGF0YSogcHJvcGVydGllcywKKyAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZURhdGEqIGF0dHJpYnV0ZXMsCisgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgZWxlbWVudE5hbWUsCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pYX09iamVjdD4ganNfbm9kZSk7CisgIENYRkFfTm9kZShDWEZBX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgZVBhY2tldCwKKyAgICAgICAgICAgIHVpbnQzMl90IHZhbGlkUGFja2V0cywKKyAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlIG9UeXBlLAorICAgICAgICAgICAgWEZBX0VsZW1lbnQgZVR5cGUsCisgICAgICAgICAgICBjb25zdCBQcm9wZXJ0eURhdGEqIHByb3BlcnRpZXMsCisgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVEYXRhKiBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGVsZW1lbnROYW1lKTsKKworIHByaXZhdGU6CisgIHZvaWQgUHJvY2Vzc1NjcmlwdFRlc3RWYWxpZGF0ZShDWEZBX0ZGRG9jVmlldyogZG9jVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVmFsaWRhdGUqIHZhbGlkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpUmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwUmV0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJWZXJzaW9uRmxhZyk7CisgIGludDMyX3QgUHJvY2Vzc0Zvcm1hdFRlc3RWYWxpZGF0ZShDWEZBX0ZGRG9jVmlldyogZG9jVmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVmFsaWRhdGUqIHZhbGlkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVmVyc2lvbkZsYWcpOworICBpbnQzMl90IFByb2Nlc3NOdWxsVGVzdFZhbGlkYXRlKENYRkFfRkZEb2NWaWV3KiBkb2NWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVmFsaWRhdGUqIHZhbGlkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlZlcnNpb25GbGFnKTsKKyAgV2lkZVN0cmluZyBHZXRWYWxpZGF0ZUNhcHRpb25OYW1lKGJvb2wgYlZlcnNpb25GbGFnKTsKKyAgV2lkZVN0cmluZyBHZXRWYWxpZGF0ZU1lc3NhZ2UoYm9vbCBiRXJyb3IsIGJvb2wgYlZlcnNpb25GbGFnKTsKKworICBib29sIEhhc0ZsYWcoWEZBX05vZGVGbGFnIGR3RmxhZykgY29uc3Q7CisgIENYRkFfTm9kZSogRGVwcmVjYXRlZF9HZXRQcmV2U2libGluZygpOworICBjb25zdCBQcm9wZXJ0eURhdGEqIEdldFByb3BlcnR5RGF0YShYRkFfRWxlbWVudCBwcm9wZXJ0eSkgY29uc3Q7CisgIGNvbnN0IEF0dHJpYnV0ZURhdGEqIEdldEF0dHJpYnV0ZURhdGEoWEZBX0F0dHJpYnV0ZSBhdHRyKSBjb25zdDsKKyAgT3B0aW9uYWw8WEZBX0VsZW1lbnQ+IEdldEZpcnN0UHJvcGVydHlXaXRoRmxhZyh1aW50OF90IGZsYWcpOworICB2b2lkIE9uUmVtb3ZlZChib29sIGJOb3RpZnkpOworICBPcHRpb25hbDx2b2lkKj4gR2V0RGVmYXVsdFZhbHVlKFhGQV9BdHRyaWJ1dGUgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQXR0cmlidXRlVHlwZSBlVHlwZSkgY29uc3Q7CisgIENYRkFfTm9kZSogR2V0Q2hpbGRJbnRlcm5hbChzaXplX3QgaW5kZXgsIFhGQV9FbGVtZW50IGVUeXBlLCBib29sIGJPbmx5Q2hpbGQpOworICBDWEZBX05vZGUqIEdldEZpcnN0Q2hpbGRCeUNsYXNzSW50ZXJuYWwoWEZBX0VsZW1lbnQgZVR5cGUpIGNvbnN0OworICBDWEZBX05vZGUqIEdldE5leHRTYW1lTmFtZVNpYmxpbmdJbnRlcm5hbCgKKyAgICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c05vZGVOYW1lKSBjb25zdDsKKyAgQ1hGQV9Ob2RlKiBHZXROZXh0U2FtZUNsYXNzU2libGluZ0ludGVybmFsKFhGQV9FbGVtZW50IGVUeXBlKSBjb25zdDsKKworICBjb25zdCBQcm9wZXJ0eURhdGEqIGNvbnN0IG1fUHJvcGVydGllczsKKyAgY29uc3QgQXR0cmlidXRlRGF0YSogY29uc3QgbV9BdHRyaWJ1dGVzOworICBjb25zdCB1aW50MzJfdCBtX1ZhbGlkUGFja2V0czsKKyAgQ1hGQV9Ob2RlKiBtX3BOZXh0OworICBDWEZBX05vZGUqIG1fcENoaWxkOworICBDWEZBX05vZGUqIG1fcExhc3RDaGlsZDsKKyAgQ1hGQV9Ob2RlKiBtX3BQYXJlbnQ7CisgIENGWF9YTUxOb2RlKiBtX3BYTUxOb2RlOworICBjb25zdCBYRkFfUGFja2V0VHlwZSBtX2VQYWNrZXQ7CisgIHVpbnQ4X3QgbV9FeGVjdXRlUmVjdXJzaW9uRGVwdGggPSAwOworICB1aW50MTZfdCBtX3VOb2RlRmxhZ3M7CisgIHVpbnQzMl90IG1fZHdOYW1lSGFzaDsKKyAgQ1hGQV9Ob2RlKiBtX3BBdXhOb2RlOworICBzdGQ6OnZlY3RvcjxVbm93bmVkUHRyPENYRkFfTm9kZT4+IGJpbmRpbmdfbm9kZXNfOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9OT0RFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlX3N0YXRpY3MuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZV9zdGF0aWNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Mzg2MGM2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZV9zdGF0aWNzLmNwcApAQCAtMCwwICsxLDI5NDggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hY2Nlc3NpYmxlY29udGVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2Fjcm9iYXQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hY3JvYmF0Ny5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2FkYmVfanNjb25zb2xlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWRiZV9qc2RlYnVnZ2VyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWRkc2lsZW50cHJpbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZGR2aWV3ZXJwcmVmZXJlbmNlcy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2FkanVzdGRhdGEuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hZG9iZWV4dGVuc2lvbmxldmVsLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYWdlbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hbHdheXNlbWJlZC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2FtZC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2FwcGVhcmFuY2VmaWx0ZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hcmMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hcmVhLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXNzaXN0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXR0cmlidXRlcy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2F1dG9zYXZlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmFyY29kZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2Jhc2UuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9iYXRjaG91dHB1dC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2JlaGF2aW9yb3ZlcnJpZGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9iaW5kLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmluZGl0ZW1zLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYm9va2VuZC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2Jvb2xlYW4uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib3JkZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9icmVhay5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2JyZWFrYWZ0ZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9icmVha2JlZm9yZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2J1dHRvbi5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NhY2hlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2FsY3VsYXRlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2FsZW5kYXJzeW1ib2xzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2FwdGlvbi5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NlcnRpZmljYXRlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2VydGlmaWNhdGVzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2hhbmdlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2hlY2tidXR0b24uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jaG9pY2VsaXN0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29sb3IuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21iLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tbWFuZC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbW1vbi5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbXByZXNzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29tcHJlc3Npb24uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21wcmVzc2xvZ2ljYWxzdHJ1Y3R1cmUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb21wcmVzc29iamVjdHN0cmVhbS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbmZpZy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbmZvcm1hbmNlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29ubmVjdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2Nvbm5lY3Rpb25zZXQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb25uZWN0c3RyaW5nLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29udGVudGFyZWEuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb250ZW50Y29weS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvcGllcy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2Nvcm5lci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NyZWF0b3IuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jdXJyZW5jeXN5bWJvbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2N1cnJlbmN5c3ltYm9scy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2N1cnJlbnRwYWdlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGFncm91cC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGFtb2RlbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGF2YWx1ZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRlcGF0dGVybi5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGVwYXR0ZXJucy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGV0aW1lLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZXRpbWVlZGl0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0ZXRpbWVzeW1ib2xzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF5LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF5bmFtZXMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWJ1Zy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RlY2ltYWwuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWZhdWx0dHlwZWZhY2UuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWZhdWx0dWkuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWxldGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZWx0YS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RlbHRhcy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2Rlc2MuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kZXN0aW5hdGlvbi5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RpZ2VzdG1ldGhvZC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RpZ2VzdG1ldGhvZHMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudGFzc2VtYmx5LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZHJhdy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RyaXZlci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RzaWdkYXRhLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZHVwbGV4b3B0aW9uLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZHluYW1pY3JlbmRlci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2VkZ2UuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lZmZlY3RpdmVpbnB1dHBvbGljeS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2VmZmVjdGl2ZW91dHB1dHBvbGljeS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2VtYmVkLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jb2RpbmcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNvZGluZ3MuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZW5jcnlwdGlvbi5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2VuY3J5cHRpb25sZXZlbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2VuY3J5cHRpb25tZXRob2QuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lbmNyeXB0aW9ubWV0aG9kcy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2VuZm9yY2UuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lcXVhdGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9lcXVhdGVyYW5nZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2VyYS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2VyYW5hbWVzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXZlbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9leGNsZ3JvdXAuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9leGNsdWRlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhjbHVkZW5zLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhkYXRhLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhlY3V0ZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2V4b2JqZWN0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXh0cmFzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmllbGQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9maWxsLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmlsdGVyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmxpcGxhYmVsLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZmxvYXQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9mb250LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9udGluZm8uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9mb3JtLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9ybWF0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9ybWZpZWxkZmlsbGluZy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2dyb3VwcGFyZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaGFuZGxlci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2h5cGhlbmF0aW9uLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaWZlbXB0eS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2ltYWdlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW1hZ2VlZGl0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW5jbHVkZXhkcGNvbnRlbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbmNyZW1lbnRhbGxvYWQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9pbmNyZW1lbnRhbG1lcmdlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW5zZXJ0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW5zdGFuY2VtYW5hZ2VyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW50ZWdlci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2ludGVyYWN0aXZlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaXNzdWVycy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2l0ZW1zLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfam9nLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfa2VlcC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2tleXVzYWdlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGFiZWxwcmludGVyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGF5b3V0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGV2ZWwuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9saW5lLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGluZWFyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGluZWFyaXplZC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xvY2FsZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xvY2FsZXNldC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xvY2tkb2N1bWVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xvZy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21hbmlmZXN0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWFwLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWFyZ2luLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWRwLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVkaXVtLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVkaXVtaW5mby5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21lcmlkaWVtLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVyaWRpZW1uYW1lcy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21lc3NhZ2UuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZXNzYWdpbmcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tb2RlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbW9kaWZ5YW5ub3RzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbW9udGguaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tb250aG5hbWVzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbXNnaWQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9uYW1lYXR0ci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25ldmVyZW1iZWQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtYmVyb2Zjb3BpZXMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1iZXJwYXR0ZXJuLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtYmVycGF0dGVybnMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1iZXJzeW1ib2wuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1iZXJzeW1ib2xzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtZXJpY2VkaXQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vY2N1ci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX29pZC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX29pZHMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vcGVuYWN0aW9uLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3BlcmF0aW9uLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3V0cHV0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3V0cHV0YmluLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3V0cHV0eHNsLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3ZlcmZsb3cuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vdmVycHJpbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWNrZXQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWNrZXRzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFnZWFyZWEuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWdlb2Zmc2V0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFnZXJhbmdlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFnZXNldC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2luYXRpb24uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWdpbmF0aW9ub3ZlcnJpZGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYXJhLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFydC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3Bhc3N3b3JkLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFzc3dvcmRlZGl0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGF0dGVybi5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BjbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BkZi5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BkZmEuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wZXJtaXNzaW9ucy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BpY2t0cmF5YnlwZGZzaXplLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGljdHVyZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BsYWludGV4dG1ldGFkYXRhLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJlc2VuY2UuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmVzZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJpbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmludGVybmFtZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3ByaW50aGlnaHF1YWxpdHkuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmludHNjYWxpbmcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcm9kdWNlci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3Byb3RvLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wc21hcC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3F1ZXJ5LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmFkaWFsLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmFuZ2UuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWFzb24uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWFzb25zLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVjb3JkLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVjb3Jkc2V0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVjdGFuZ2xlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVmLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVsZXZhbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZW5hbWUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZW5kZXJwb2xpY3kuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9yb290ZWxlbWVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3J1bnNjcmlwdHMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zY3JpcHQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zY3JpcHRtb2RlbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NlbGVjdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NldHByb3BlcnR5LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2V2ZXJpdHkuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaGFycHRleHQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaGFycHhodG1sLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2hhcnB4bWwuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaWduYXR1cmUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaWduYXR1cmVwcm9wZXJ0aWVzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2lnbmRhdGEuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaWduaW5nLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2lsZW50cHJpbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zb2FwYWN0aW9uLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc29hcGFkZHJlc3MuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zb2xpZC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NvdXJjZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NvdXJjZXNldC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NwZWFrLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3RhcGxlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3RhcnRub2RlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3RhcnRwYWdlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3RpcHBsZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3N1YmZvcm0uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJmb3Jtc2V0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3ViamVjdGRuLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3ViamVjdGRucy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3N1Ym1pdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3N1Ym1pdGZvcm1hdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3N1Ym1pdHVybC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3N1YnNldGJlbG93LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3VwcHJlc3NiYW5uZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90YWdnZWQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZW1wbGF0ZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RlbXBsYXRlY2FjaGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZXh0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGV4dGVkaXQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90aHJlc2hvbGQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90aW1lLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGltZXBhdHRlcm4uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90aW1lcGF0dGVybnMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90aW1lc3RhbXAuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90by5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3Rvb2x0aXAuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmFjZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RyYW5zZm9ybS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RyYXZlcnNhbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RyYXZlcnNlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHlwZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3R5cGVmYWNlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHlwZWZhY2VzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdWkuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV91cGRhdGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV91cmkuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV91c2VyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsaWRhdGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWxpZGF0ZWFwcHJvdmFsc2lnbmF0dXJlcy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZhbGlkYXRpb25tZXNzYWdpbmcuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWx1ZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZhcmlhYmxlcy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV92ZXJzaW9uY29udHJvbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZpZXdlcnByZWZlcmVuY2VzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2ViY2xpZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2hpdGVzcGFjZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3dpbmRvdy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3dzZGxhZGRyZXNzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd3NkbGNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV94ZGMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV94ZHAuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV94ZmEuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV94bWxjb25uZWN0aW9uLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeHNkY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3hzbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3pwbC5oIgorCituYW1lc3BhY2UgeworCitzdHJ1Y3QgRWxlbWVudE5hbWVJbmZvIHsKKyAgdWludDMyX3QgaGFzaDsKKyAgWEZBX0VsZW1lbnQgZWxlbWVudDsKK30gRWxlbWVudE5hbWVUb0VudW1bXSA9IHsKKyAgICB7MHgyM2VlMyAvKiBwcyAqLywgWEZBX0VsZW1lbnQ6OlBzfSwKKyAgICB7MHgyNTM2MyAvKiB0byAqLywgWEZBX0VsZW1lbnQ6OlRvfSwKKyAgICB7MHgyNTg3ZSAvKiB1aSAqLywgWEZBX0VsZW1lbnQ6OlVpfSwKKyAgICB7MHgxYzY0OGIgLyogcmVjb3JkU2V0ICovLCBYRkFfRWxlbWVudDo6UmVjb3JkU2V0fSwKKyAgICB7MHgxNzE0MjhmIC8qIHN1YnNldEJlbG93ICovLCBYRkFfRWxlbWVudDo6U3Vic2V0QmVsb3d9LAorICAgIHsweDFhMDc3NmEgLyogc3ViZm9ybVNldCAqLywgWEZBX0VsZW1lbnQ6OlN1YmZvcm1TZXR9LAorICAgIHsweDIzNDBkNzAgLyogYWRvYmVFeHRlbnNpb25MZXZlbCAqLywgWEZBX0VsZW1lbnQ6OkFkb2JlRXh0ZW5zaW9uTGV2ZWx9LAorICAgIHsweDJjMWM3ZjEgLyogdHlwZWZhY2UgKi8sIFhGQV9FbGVtZW50OjpUeXBlZmFjZX0sCisgICAgezB4NTUxOGMyNSAvKiBicmVhayAqLywgWEZBX0VsZW1lbnQ6OkJyZWFrfSwKKyAgICB7MHg1ZmZmNTIzIC8qIGZvbnRJbmZvICovLCBYRkFfRWxlbWVudDo6Rm9udEluZm99LAorICAgIHsweDY1M2EyMjcgLyogbnVtYmVyUGF0dGVybiAqLywgWEZBX0VsZW1lbnQ6Ok51bWJlclBhdHRlcm59LAorICAgIHsweDY1YjRhMDUgLyogZHluYW1pY1JlbmRlciAqLywgWEZBX0VsZW1lbnQ6OkR5bmFtaWNSZW5kZXJ9LAorICAgIHsweDdlNDM2MmUgLyogcHJpbnRTY2FsaW5nICovLCBYRkFfRWxlbWVudDo6UHJpbnRTY2FsaW5nfSwKKyAgICB7MHg3ZmU2ZDNhIC8qIGNoZWNrQnV0dG9uICovLCBYRkFfRWxlbWVudDo6Q2hlY2tCdXR0b259LAorICAgIHsweDgwY2Y1OGYgLyogZGF0ZVBhdHRlcm5zICovLCBYRkFfRWxlbWVudDo6RGF0ZVBhdHRlcm5zfSwKKyAgICB7MHg4MTE5MjlkIC8qIHNvdXJjZVNldCAqLywgWEZBX0VsZW1lbnQ6OlNvdXJjZVNldH0sCisgICAgezB4OWY5ZDYxMiAvKiBhbWQgKi8sIFhGQV9FbGVtZW50OjpBbWR9LAorICAgIHsweDlmOWVmYjYgLyogYXJjICovLCBYRkFfRWxlbWVudDo6QXJjfSwKKyAgICB7MHhhNDg4MzVlIC8qIGRheSAqLywgWEZBX0VsZW1lbnQ6OkRheX0sCisgICAgezB4YTYzMjhiOCAvKiBlcmEgKi8sIFhGQV9FbGVtZW50OjpFcmF9LAorICAgIHsweGFlNmEwYTAgLyogam9nICovLCBYRkFfRWxlbWVudDo6Sm9nfSwKKyAgICB7MHhiMWIzZDIyIC8qIGxvZyAqLywgWEZBX0VsZW1lbnQ6OkxvZ30sCisgICAgezB4YjM1NDM5ZSAvKiBtYXAgKi8sIFhGQV9FbGVtZW50OjpNYXB9LAorICAgIHsweGIzNTUzMDEgLyogbWRwICovLCBYRkFfRWxlbWVudDo6TWRwfSwKKyAgICB7MHhiNDIwNDM4IC8qIGJyZWFrQmVmb3JlICovLCBYRkFfRWxlbWVudDo6QnJlYWtCZWZvcmV9LAorICAgIHsweGI2YTA5MWMgLyogb2lkICovLCBYRkFfRWxlbWVudDo6T2lkfSwKKyAgICB7MHhiODQzODlmIC8qIHBjbCAqLywgWEZBX0VsZW1lbnQ6OlBjbH0sCisgICAgezB4Yjg0M2RiYSAvKiBwZGYgKi8sIFhGQV9FbGVtZW50OjpQZGZ9LAorICAgIHsweGJiOGRmNWQgLyogcmVmICovLCBYRkFfRWxlbWVudDo6UmVmfSwKKyAgICB7MHhjMDgwY2QwIC8qIHVyaSAqLywgWEZBX0VsZW1lbnQ6OlVyaX0sCisgICAgezB4YzU2YWZiZiAvKiB4ZGMgKi8sIFhGQV9FbGVtZW50OjpYZGN9LAorICAgIHsweGM1NmFmY2MgLyogeGRwICovLCBYRkFfRWxlbWVudDo6WGRwfSwKKyAgICB7MHhjNTZiOWZmIC8qIHhmYSAqLywgWEZBX0VsZW1lbnQ6OlhmYX0sCisgICAgezB4YzU2ZmNiNyAvKiB4c2wgKi8sIFhGQV9FbGVtZW50OjpYc2x9LAorICAgIHsweGM4Yjg5ZDYgLyogenBsICovLCBYRkFfRWxlbWVudDo6WnBsfSwKKyAgICB7MHhjOWJhZTk0IC8qIGNhY2hlICovLCBYRkFfRWxlbWVudDo6Q2FjaGV9LAorICAgIHsweGNiMDE2YmUgLyogbWFyZ2luICovLCBYRkFfRWxlbWVudDo6TWFyZ2lufSwKKyAgICB7MHhlMTM3OGZlIC8qIGtleVVzYWdlICovLCBYRkFfRWxlbWVudDo6S2V5VXNhZ2V9LAorICAgIHsweGZlMzU5NmEgLyogZXhjbHVkZSAqLywgWEZBX0VsZW1lbnQ6OkV4Y2x1ZGV9LAorICAgIHsweDEwMzk1YWM3IC8qIGNob2ljZUxpc3QgKi8sIFhGQV9FbGVtZW50OjpDaG9pY2VMaXN0fSwKKyAgICB7MHgxMDU5ZWMxOCAvKiBsZXZlbCAqLywgWEZBX0VsZW1lbnQ6OkxldmVsfSwKKyAgICB7MHgxMDg3NDgwNCAvKiBsYWJlbFByaW50ZXIgKi8sIFhGQV9FbGVtZW50OjpMYWJlbFByaW50ZXJ9LAorICAgIHsweDEwYzQwZTAzIC8qIGNhbGVuZGFyU3ltYm9scyAqLywgWEZBX0VsZW1lbnQ6OkNhbGVuZGFyU3ltYm9sc30sCisgICAgezB4MTBmMWVhMjQgLyogcGFyYSAqLywgWEZBX0VsZW1lbnQ6OlBhcmF9LAorICAgIHsweDEwZjFlYTM3IC8qIHBhcnQgKi8sIFhGQV9FbGVtZW50OjpQYXJ0fSwKKyAgICB7MHgxMTQwOTc1YiAvKiBwZGZhICovLCBYRkFfRWxlbWVudDo6UGRmYX0sCisgICAgezB4MTE1NGVmZTYgLyogZmlsdGVyICovLCBYRkFfRWxlbWVudDo6RmlsdGVyfSwKKyAgICB7MHgxM2Y0MWRlMSAvKiBwcmVzZW50ICovLCBYRkFfRWxlbWVudDo6UHJlc2VudH0sCisgICAgezB4MTgyN2U2ZWEgLyogcGFnaW5hdGlvbiAqLywgWEZBX0VsZW1lbnQ6OlBhZ2luYXRpb259LAorICAgIHsweDE4NDYzNzA3IC8qIGVuY29kaW5nICovLCBYRkFfRWxlbWVudDo6RW5jb2Rpbmd9LAorICAgIHsweDE4NWU0MWUyIC8qIGV2ZW50ICovLCBYRkFfRWxlbWVudDo6RXZlbnR9LAorICAgIHsweDFhZGIxNDJkIC8qIHdoaXRlc3BhY2UgKi8sIFhGQV9FbGVtZW50OjpXaGl0ZXNwYWNlfSwKKyAgICB7MHgxZjNmNjRjMyAvKiBkZWZhdWx0VWkgKi8sIFhGQV9FbGVtZW50OjpEZWZhdWx0VWl9LAorICAgIHsweDIwNGU4N2NiIC8qIGRhdGFNb2RlbCAqLywgWEZBX0VsZW1lbnQ6OkRhdGFNb2RlbH0sCisgICAgezB4MjA1N2IzNTAgLyogYmFyY29kZSAqLywgWEZBX0VsZW1lbnQ6OkJhcmNvZGV9LAorICAgIHsweDIwNTk2YmFkIC8qIHRpbWVQYXR0ZXJuICovLCBYRkFfRWxlbWVudDo6VGltZVBhdHRlcm59LAorICAgIHsweDIxMGI3NGQzIC8qIGJhdGNoT3V0cHV0ICovLCBYRkFfRWxlbWVudDo6QmF0Y2hPdXRwdXR9LAorICAgIHsweDIxMmZmMGUyIC8qIGVuZm9yY2UgKi8sIFhGQV9FbGVtZW50OjpFbmZvcmNlfSwKKyAgICB7MHgyMWQzNTFiNCAvKiBjdXJyZW5jeVN5bWJvbHMgKi8sIFhGQV9FbGVtZW50OjpDdXJyZW5jeVN5bWJvbHN9LAorICAgIHsweDIxZGI4M2M1IC8qIGFkZFNpbGVudFByaW50ICovLCBYRkFfRWxlbWVudDo6QWRkU2lsZW50UHJpbnR9LAorICAgIHsweDIyMjY2MjU4IC8qIHJlbmFtZSAqLywgWEZBX0VsZW1lbnQ6OlJlbmFtZX0sCisgICAgezB4MjI2Y2E4ZjEgLyogb3BlcmF0aW9uICovLCBYRkFfRWxlbWVudDo6T3BlcmF0aW9ufSwKKyAgICB7MHgyM2UyN2I4NCAvKiB0eXBlZmFjZXMgKi8sIFhGQV9FbGVtZW50OjpUeXBlZmFjZXN9LAorICAgIHsweDIzZjRhYTc1IC8qIHN1YmplY3RETnMgKi8sIFhGQV9FbGVtZW50OjpTdWJqZWN0RE5zfSwKKyAgICB7MHgyNDBkNWU4ZSAvKiBpc3N1ZXJzICovLCBYRkFfRWxlbWVudDo6SXNzdWVyc30sCisgICAgezB4MjRhNTJmOGEgLyogd3NkbENvbm5lY3Rpb24gKi8sIFhGQV9FbGVtZW50OjpXc2RsQ29ubmVjdGlvbn0sCisgICAgezB4MjU0ZWJkMDcgLyogZGVidWcgKi8sIFhGQV9FbGVtZW50OjpEZWJ1Z30sCisgICAgezB4MjY1NWM2NmEgLyogZGVsdGEgKi8sIFhGQV9FbGVtZW50OjpEZWx0YX0sCisgICAgezB4MjZjMGRhZWMgLyogZXJhTmFtZXMgKi8sIFhGQV9FbGVtZW50OjpFcmFOYW1lc30sCisgICAgezB4MjczYWIwM2IgLyogbW9kaWZ5QW5ub3RzICovLCBYRkFfRWxlbWVudDo6TW9kaWZ5QW5ub3RzfSwKKyAgICB7MHgyNzg3NWJiNCAvKiBzdGFydE5vZGUgKi8sIFhGQV9FbGVtZW50OjpTdGFydE5vZGV9LAorICAgIHsweDI4NWQwZGJjIC8qIGJ1dHRvbiAqLywgWEZBX0VsZW1lbnQ6OkJ1dHRvbn0sCisgICAgezB4MjhkZWU2ZTkgLyogZm9ybWF0ICovLCBYRkFfRWxlbWVudDo6Rm9ybWF0fSwKKyAgICB7MHgyYTIzMzQ5ZSAvKiBib3JkZXIgKi8sIFhGQV9FbGVtZW50OjpCb3JkZXJ9LAorICAgIHsweDJhZTY3ZjE5IC8qIGFyZWEgKi8sIFhGQV9FbGVtZW50OjpBcmVhfSwKKyAgICB7MHgyYzNjNGM2NyAvKiBoeXBoZW5hdGlvbiAqLywgWEZBX0VsZW1lbnQ6Okh5cGhlbmF0aW9ufSwKKyAgICB7MHgyZDA4YWY4NSAvKiB0ZXh0ICovLCBYRkFfRWxlbWVudDo6VGV4dH0sCisgICAgezB4MmQ3MWIwMGYgLyogdGltZSAqLywgWEZBX0VsZW1lbnQ6OlRpbWV9LAorICAgIHsweDJmMTZhMzgyIC8qIHR5cGUgKi8sIFhGQV9FbGVtZW50OjpUeXBlfSwKKyAgICB7MHgyZmUwNTdlOSAvKiBvdmVycHJpbnQgKi8sIFhGQV9FbGVtZW50OjpPdmVycHJpbnR9LAorICAgIHsweDMwMmFlZTE2IC8qIGNlcnRpZmljYXRlcyAqLywgWEZBX0VsZW1lbnQ6OkNlcnRpZmljYXRlc30sCisgICAgezB4MzBiMjI3ZGYgLyogZW5jcnlwdGlvbk1ldGhvZHMgKi8sIFhGQV9FbGVtZW50OjpFbmNyeXB0aW9uTWV0aG9kc30sCisgICAgezB4MzJiOTAwZDEgLyogc2V0UHJvcGVydHkgKi8sIFhGQV9FbGVtZW50OjpTZXRQcm9wZXJ0eX0sCisgICAgezB4MzM3ZDllNDUgLyogcHJpbnRlck5hbWUgKi8sIFhGQV9FbGVtZW50OjpQcmludGVyTmFtZX0sCisgICAgezB4MzNlZGRhNGIgLyogc3RhcnRQYWdlICovLCBYRkFfRWxlbWVudDo6U3RhcnRQYWdlfSwKKyAgICB7MHgzODE5NDNlNCAvKiBwYWdlT2Zmc2V0ICovLCBYRkFfRWxlbWVudDo6UGFnZU9mZnNldH0sCisgICAgezB4MzgyMTA2Y2QgLyogZGF0ZVRpbWUgKi8sIFhGQV9FbGVtZW50OjpEYXRlVGltZX0sCisgICAgezB4Mzg2ZTc0MjEgLyogY29tYiAqLywgWEZBX0VsZW1lbnQ6OkNvbWJ9LAorICAgIHsweDM5MGFjZDllIC8qIHBhdHRlcm4gKi8sIFhGQV9FbGVtZW50OjpQYXR0ZXJufSwKKyAgICB7MHgzOTQyMTYzZSAvKiBpZkVtcHR5ICovLCBYRkFfRWxlbWVudDo6SWZFbXB0eX0sCisgICAgezB4Mzk5NDRhN2IgLyogc3VwcHJlc3NCYW5uZXIgKi8sIFhGQV9FbGVtZW50OjpTdXBwcmVzc0Jhbm5lcn0sCisgICAgezB4M2IzYzNkY2EgLyogb3V0cHV0QmluICovLCBYRkFfRWxlbWVudDo6T3V0cHV0QmlufSwKKyAgICB7MHgzYjhhNDAyNCAvKiBmaWVsZCAqLywgWEZBX0VsZW1lbnQ6OkZpZWxkfSwKKyAgICB7MHgzYzE1MzUyZiAvKiBhZ2VudCAqLywgWEZBX0VsZW1lbnQ6OkFnZW50fSwKKyAgICB7MHgzZDdlODY2OCAvKiBvdXRwdXRYU0wgKi8sIFhGQV9FbGVtZW50OjpPdXRwdXRYU0x9LAorICAgIHsweDNlMWM5MWM1IC8qIGFkanVzdERhdGEgKi8sIFhGQV9FbGVtZW50OjpBZGp1c3REYXRhfSwKKyAgICB7MHgzZTdhOTQwOCAvKiBhdXRvU2F2ZSAqLywgWEZBX0VsZW1lbnQ6OkF1dG9TYXZlfSwKKyAgICB7MHgzZWNlYWQ5NCAvKiBjb250ZW50QXJlYSAqLywgWEZBX0VsZW1lbnQ6OkNvbnRlbnRBcmVhfSwKKyAgICB7MHgzZmFkYWVjMCAvKiB3c2RsQWRkcmVzcyAqLywgWEZBX0VsZW1lbnQ6OldzZGxBZGRyZXNzfSwKKyAgICB7MHg0MDYyM2I1YiAvKiBzb2xpZCAqLywgWEZBX0VsZW1lbnQ6OlNvbGlkfSwKKyAgICB7MHg0MWYwYmQ3NiAvKiBkYXRlVGltZVN5bWJvbHMgKi8sIFhGQV9FbGVtZW50OjpEYXRlVGltZVN5bWJvbHN9LAorICAgIHsweDQ0NGU3NTIzIC8qIGVuY3J5cHRpb25MZXZlbCAqLywgWEZBX0VsZW1lbnQ6OkVuY3J5cHRpb25MZXZlbH0sCisgICAgezB4NDUyM2FmNTUgLyogZWRnZSAqLywgWEZBX0VsZW1lbnQ6OkVkZ2V9LAorICAgIHsweDQ1ZDVlM2MxIC8qIHN0aXBwbGUgKi8sIFhGQV9FbGVtZW50OjpTdGlwcGxlfSwKKyAgICB7MHg0NzVlNGU4NyAvKiBhdHRyaWJ1dGVzICovLCBYRkFfRWxlbWVudDo6QXR0cmlidXRlc30sCisgICAgezB4NDg3YThjODcgLyogdmVyc2lvbkNvbnRyb2wgKi8sIFhGQV9FbGVtZW50OjpWZXJzaW9uQ29udHJvbH0sCisgICAgezB4NDhlNTI0OGMgLyogbWVyaWRpZW0gKi8sIFhGQV9FbGVtZW50OjpNZXJpZGllbX0sCisgICAgezB4NDhmMzY3MTkgLyogZXhjbEdyb3VwICovLCBYRkFfRWxlbWVudDo6RXhjbEdyb3VwfSwKKyAgICB7MHg0OTc3MzU2YiAvKiB0b29sVGlwICovLCBYRkFfRWxlbWVudDo6VG9vbFRpcH0sCisgICAgezB4NDk5YWZlY2MgLyogY29tcHJlc3MgKi8sIFhGQV9FbGVtZW50OjpDb21wcmVzc30sCisgICAgezB4NGEwYzQ5NDggLyogcmVhc29uICovLCBYRkFfRWxlbWVudDo6UmVhc29ufSwKKyAgICB7MHg0YmRjY2UxMyAvKiBleGVjdXRlICovLCBYRkFfRWxlbWVudDo6RXhlY3V0ZX0sCisgICAgezB4NGM1NmIyMTYgLyogY29udGVudENvcHkgKi8sIFhGQV9FbGVtZW50OjpDb250ZW50Q29weX0sCisgICAgezB4NGNjMTc2ZDMgLyogZGF0ZVRpbWVFZGl0ICovLCBYRkFfRWxlbWVudDo6RGF0ZVRpbWVFZGl0fSwKKyAgICB7MHg0ZTFlMzliNiAvKiBjb25maWcgKi8sIFhGQV9FbGVtZW50OjpDb25maWd9LAorICAgIHsweDRlMmQ2MDgzIC8qIGltYWdlICovLCBYRkFfRWxlbWVudDo6SW1hZ2V9LAorICAgIHsweDRlODE0MTUwIC8qICN4SFRNTCAqLywgWEZBX0VsZW1lbnQ6OlNoYXJweEhUTUx9LAorICAgIHsweDRmMjM4OGMxIC8qIG51bWJlck9mQ29waWVzICovLCBYRkFfRWxlbWVudDo6TnVtYmVyT2ZDb3BpZXN9LAorICAgIHsweDRmNTEyZTMwIC8qIGJlaGF2aW9yT3ZlcnJpZGUgKi8sIFhGQV9FbGVtZW50OjpCZWhhdmlvck92ZXJyaWRlfSwKKyAgICB7MHg0ZmRjMzQ1NCAvKiB0aW1lU3RhbXAgKi8sIFhGQV9FbGVtZW50OjpUaW1lU3RhbXB9LAorICAgIHsweDUxZDkwNTQ2IC8qIG1vbnRoICovLCBYRkFfRWxlbWVudDo6TW9udGh9LAorICAgIHsweDUyMzQzN2U0IC8qIHZpZXdlclByZWZlcmVuY2VzICovLCBYRkFfRWxlbWVudDo6Vmlld2VyUHJlZmVyZW5jZXN9LAorICAgIHsweDUzYWJjMWM2IC8qIHNjcmlwdE1vZGVsICovLCBYRkFfRWxlbWVudDo6U2NyaXB0TW9kZWx9LAorICAgIHsweDU0MDM0YzJmIC8qIGRlY2ltYWwgKi8sIFhGQV9FbGVtZW50OjpEZWNpbWFsfSwKKyAgICB7MHg1NDIwMmM5ZSAvKiBzdWJmb3JtICovLCBYRkFfRWxlbWVudDo6U3ViZm9ybX0sCisgICAgezB4NTQyYzczMDAgLyogc2VsZWN0ICovLCBYRkFfRWxlbWVudDo6U2VsZWN0fSwKKyAgICB7MHg1NDM2ZDE5OCAvKiB3aW5kb3cgKi8sIFhGQV9FbGVtZW50OjpXaW5kb3d9LAorICAgIHsweDU0NzNiNmRjIC8qIGxvY2FsZVNldCAqLywgWEZBX0VsZW1lbnQ6OkxvY2FsZVNldH0sCisgICAgezB4NTZhZTE3OWUgLyogaGFuZGxlciAqLywgWEZBX0VsZW1lbnQ6OkhhbmRsZXJ9LAorICAgIHsweDU3MGNlODM1IC8qIHByZXNlbmNlICovLCBYRkFfRWxlbWVudDo6UHJlc2VuY2V9LAorICAgIHsweDU3NzlkNjVmIC8qIHJlY29yZCAqLywgWEZBX0VsZW1lbnQ6OlJlY29yZH0sCisgICAgezB4NTljOGYyN2QgLyogZW1iZWQgKi8sIFhGQV9FbGVtZW50OjpFbWJlZH0sCisgICAgezB4NWE1MGU5ZTYgLyogdmVyc2lvbiAqLywgWEZBX0VsZW1lbnQ6OlZlcnNpb259LAorICAgIHsweDViODM4M2RmIC8qIGNvbW1hbmQgKi8sIFhGQV9FbGVtZW50OjpDb21tYW5kfSwKKyAgICB7MHg1YzQzYzZjMyAvKiBjb3BpZXMgKi8sIFhGQV9FbGVtZW50OjpDb3BpZXN9LAorICAgIHsweDVlMGMyYzQ5IC8qIHN0YXBsZSAqLywgWEZBX0VsZW1lbnQ6OlN0YXBsZX0sCisgICAgezB4NWU1MDgzZGQgLyogc3VibWl0Rm9ybWF0ICovLCBYRkFfRWxlbWVudDo6U3VibWl0Rm9ybWF0fSwKKyAgICB7MHg1ZThjNWQyMCAvKiBib29sZWFuICovLCBYRkFfRWxlbWVudDo6Qm9vbGVhbn0sCisgICAgezB4NjA0OTBhODUgLyogbWVzc2FnZSAqLywgWEZBX0VsZW1lbnQ6Ok1lc3NhZ2V9LAorICAgIHsweDYwZDRjOGIxIC8qIG91dHB1dCAqLywgWEZBX0VsZW1lbnQ6Ok91dHB1dH0sCisgICAgezB4NjE4MTAwODEgLyogcHNNYXAgKi8sIFhGQV9FbGVtZW50OjpQc01hcH0sCisgICAgezB4NjJiZDkwNGIgLyogZXhjbHVkZU5TICovLCBYRkFfRWxlbWVudDo6RXhjbHVkZU5TfSwKKyAgICB7MHg2NjlkNGY3NyAvKiBhc3Npc3QgKi8sIFhGQV9FbGVtZW50OjpBc3Npc3R9LAorICAgIHsweDY3MzM0YTFjIC8qIHBpY3R1cmUgKi8sIFhGQV9FbGVtZW50OjpQaWN0dXJlfSwKKyAgICB7MHg2N2ZlNzMzNCAvKiB0cmF2ZXJzYWwgKi8sIFhGQV9FbGVtZW50OjpUcmF2ZXJzYWx9LAorICAgIHsweDY4OTQ1ODljIC8qIHNpbGVudFByaW50ICovLCBYRkFfRWxlbWVudDo6U2lsZW50UHJpbnR9LAorICAgIHsweDY4YTE2YmJkIC8qIHdlYkNsaWVudCAqLywgWEZBX0VsZW1lbnQ6OldlYkNsaWVudH0sCisgICAgezB4NmE0YmMwODQgLyogcHJvZHVjZXIgKi8sIFhGQV9FbGVtZW50OjpQcm9kdWNlcn0sCisgICAgezB4NmE5ZTA0YzkgLyogY29ybmVyICovLCBYRkFfRWxlbWVudDo6Q29ybmVyfSwKKyAgICB7MHg2Y2NkNzI3NCAvKiBtc2dJZCAqLywgWEZBX0VsZW1lbnQ6Ok1zZ0lkfSwKKyAgICB7MHg2ZTY3OTIxZiAvKiBjb2xvciAqLywgWEZBX0VsZW1lbnQ6OkNvbG9yfSwKKyAgICB7MHg2ZWMyMTdhNSAvKiBrZWVwICovLCBYRkFfRWxlbWVudDo6S2VlcH0sCisgICAgezB4NmVlZjExMTYgLyogcXVlcnkgKi8sIFhGQV9FbGVtZW50OjpRdWVyeX0sCisgICAgezB4NzAzM2JmZDUgLyogaW5zZXJ0ICovLCBYRkFfRWxlbWVudDo6SW5zZXJ0fSwKKyAgICB7MHg3MDRhZjM4OSAvKiBpbWFnZUVkaXQgKi8sIFhGQV9FbGVtZW50OjpJbWFnZUVkaXR9LAorICAgIHsweDcyMzMwMThhIC8qIHZhbGlkYXRlICovLCBYRkFfRWxlbWVudDo6VmFsaWRhdGV9LAorICAgIHsweDcyYmE0N2I0IC8qIGRpZ2VzdE1ldGhvZHMgKi8sIFhGQV9FbGVtZW50OjpEaWdlc3RNZXRob2RzfSwKKyAgICB7MHg3MmYyYWE3YSAvKiBudW1iZXJQYXR0ZXJucyAqLywgWEZBX0VsZW1lbnQ6Ok51bWJlclBhdHRlcm5zfSwKKyAgICB7MHg3NGNhZWQyOSAvKiBwYWdlU2V0ICovLCBYRkFfRWxlbWVudDo6UGFnZVNldH0sCisgICAgezB4NzU2OGU2YWUgLyogaW50ZWdlciAqLywgWEZBX0VsZW1lbnQ6OkludGVnZXJ9LAorICAgIHsweDc2MTgyZGI5IC8qIHNvYXBBZGRyZXNzICovLCBYRkFfRWxlbWVudDo6U29hcEFkZHJlc3N9LAorICAgIHsweDc3MzE0NmM1IC8qIGVxdWF0ZSAqLywgWEZBX0VsZW1lbnQ6OkVxdWF0ZX0sCisgICAgezB4NzdkNDQ5ZGQgLyogZm9ybUZpZWxkRmlsbGluZyAqLywgWEZBX0VsZW1lbnQ6OkZvcm1GaWVsZEZpbGxpbmd9LAorICAgIHsweDc4ODlkNjhhIC8qIHBhZ2VSYW5nZSAqLywgWEZBX0VsZW1lbnQ6OlBhZ2VSYW5nZX0sCisgICAgezB4N2JhY2EyZTMgLyogdXBkYXRlICovLCBYRkFfRWxlbWVudDo6VXBkYXRlfSwKKyAgICB7MHg3Y2U4OTAwMSAvKiBjb25uZWN0U3RyaW5nICovLCBYRkFfRWxlbWVudDo6Q29ubmVjdFN0cmluZ30sCisgICAgezB4N2Q5ZmQ3YzUgLyogbW9kZSAqLywgWEZBX0VsZW1lbnQ6Ok1vZGV9LAorICAgIHsweDdlN2U4NDVlIC8qIGxheW91dCAqLywgWEZBX0VsZW1lbnQ6OkxheW91dH0sCisgICAgezB4N2U4NDVjMzQgLyogI3htbCAqLywgWEZBX0VsZW1lbnQ6OlNoYXJweG1sfSwKKyAgICB7MHg3ZmIzNDFkZiAvKiB4c2RDb25uZWN0aW9uICovLCBYRkFfRWxlbWVudDo6WHNkQ29ubmVjdGlvbn0sCisgICAgezB4N2ZmYjUxY2MgLyogdHJhdmVyc2UgKi8sIFhGQV9FbGVtZW50OjpUcmF2ZXJzZX0sCisgICAgezB4ODAyMDNiNWEgLyogZW5jb2RpbmdzICovLCBYRkFfRWxlbWVudDo6RW5jb2RpbmdzfSwKKyAgICB7MHg4MDM1NTBmYyAvKiB0ZW1wbGF0ZSAqLywgWEZBX0VsZW1lbnQ6OlRlbXBsYXRlfSwKKyAgICB7MHg4MDNkNWJiYyAvKiBhY3JvYmF0ICovLCBYRkFfRWxlbWVudDo6QWNyb2JhdH0sCisgICAgezB4ODIxZDY1NjkgLyogdmFsaWRhdGlvbk1lc3NhZ2luZyAqLywgWEZBX0VsZW1lbnQ6OlZhbGlkYXRpb25NZXNzYWdpbmd9LAorICAgIHsweDgzMGU2ODhmIC8qIHNpZ25pbmcgKi8sIFhGQV9FbGVtZW50OjpTaWduaW5nfSwKKyAgICB7MHg4M2RhYjlmNSAvKiBzY3JpcHQgKi8sIFhGQV9FbGVtZW50OjpTY3JpcHR9LAorICAgIHsweDg0MTFlYmNkIC8qIGFkZFZpZXdlclByZWZlcmVuY2VzICovLCBYRkFfRWxlbWVudDo6QWRkVmlld2VyUHJlZmVyZW5jZXN9LAorICAgIHsweDg3Nzc2NDJlIC8qIGFsd2F5c0VtYmVkICovLCBYRkFfRWxlbWVudDo6QWx3YXlzRW1iZWR9LAorICAgIHsweDg3N2E2YjM5IC8qIHBhc3N3b3JkRWRpdCAqLywgWEZBX0VsZW1lbnQ6OlBhc3N3b3JkRWRpdH0sCisgICAgezB4ODdlODRjOTkgLyogbnVtZXJpY0VkaXQgKi8sIFhGQV9FbGVtZW50OjpOdW1lcmljRWRpdH0sCisgICAgezB4ODg1MmNkZWMgLyogZW5jcnlwdGlvbk1ldGhvZCAqLywgWEZBX0VsZW1lbnQ6OkVuY3J5cHRpb25NZXRob2R9LAorICAgIHsweDg5MWY0NjA2IC8qIGNoYW5nZSAqLywgWEZBX0VsZW1lbnQ6OkNoYW5nZX0sCisgICAgezB4ODk5MzlmMzYgLyogcGFnZUFyZWEgKi8sIFhGQV9FbGVtZW50OjpQYWdlQXJlYX0sCisgICAgezB4OGE5ZDYyNDcgLyogc3VibWl0VXJsICovLCBYRkFfRWxlbWVudDo6U3VibWl0VXJsfSwKKyAgICB7MHg4YWQ4YjkwZiAvKiBvaWRzICovLCBYRkFfRWxlbWVudDo6T2lkc30sCisgICAgezB4OGIwMzZmMzIgLyogc2lnbmF0dXJlICovLCBYRkFfRWxlbWVudDo6U2lnbmF0dXJlfSwKKyAgICB7MHg4YjEyOGVmYiAvKiBBREJFX0pTQ29uc29sZSAqLywgWEZBX0VsZW1lbnQ6OkFEQkVfSlNDb25zb2xlfSwKKyAgICB7MHg4YmNmZTk2ZSAvKiBjYXB0aW9uICovLCBYRkFfRWxlbWVudDo6Q2FwdGlvbn0sCisgICAgezB4OGUxYzI5MjEgLyogcmVsZXZhbnQgKi8sIFhGQV9FbGVtZW50OjpSZWxldmFudH0sCisgICAgezB4OGUzZjBhNGIgLyogZmxpcExhYmVsICovLCBYRkFfRWxlbWVudDo6RmxpcExhYmVsfSwKKyAgICB7MHg5MDAyODBiNyAvKiBleERhdGEgKi8sIFhGQV9FbGVtZW50OjpFeERhdGF9LAorICAgIHsweDkxZTgwMzUyIC8qIGRheU5hbWVzICovLCBYRkFfRWxlbWVudDo6RGF5TmFtZXN9LAorICAgIHsweDkzMTEzYjExIC8qIHNvYXBBY3Rpb24gKi8sIFhGQV9FbGVtZW50OjpTb2FwQWN0aW9ufSwKKyAgICB7MHg5MzhiMDlmNiAvKiBkZWZhdWx0VHlwZWZhY2UgKi8sIFhGQV9FbGVtZW50OjpEZWZhdWx0VHlwZWZhY2V9LAorICAgIHsweDk1YjM3ODk3IC8qIG1hbmlmZXN0ICovLCBYRkFfRWxlbWVudDo6TWFuaWZlc3R9LAorICAgIHsweDk3Yjc2YjU0IC8qIG92ZXJmbG93ICovLCBYRkFfRWxlbWVudDo6T3ZlcmZsb3d9LAorICAgIHsweDlhNTc4NjFiIC8qIGxpbmVhciAqLywgWEZBX0VsZW1lbnQ6OkxpbmVhcn0sCisgICAgezB4OWFkNWE4MjEgLyogY3VycmVuY3lTeW1ib2wgKi8sIFhGQV9FbGVtZW50OjpDdXJyZW5jeVN5bWJvbH0sCisgICAgezB4OWM2NDcxYjMgLyogZGVsZXRlICovLCBYRkFfRWxlbWVudDo6RGVsZXRlfSwKKyAgICB7MHg5ZGVlYTYxZCAvKiBkZWx0YXMgKi8sIFhGQV9FbGVtZW50OjpEZWx0YXN9LAorICAgIHsweDllNjdkZTIxIC8qIGRpZ2VzdE1ldGhvZCAqLywgWEZBX0VsZW1lbnQ6OkRpZ2VzdE1ldGhvZH0sCisgICAgezB4OWYzZTk1MTAgLyogaW5zdGFuY2VNYW5hZ2VyICovLCBYRkFfRWxlbWVudDo6SW5zdGFuY2VNYW5hZ2VyfSwKKyAgICB7MHhhMDc5OTg5MiAvKiBlcXVhdGVSYW5nZSAqLywgWEZBX0VsZW1lbnQ6OkVxdWF0ZVJhbmdlfSwKKyAgICB7MHhhMDg0YTM4MSAvKiBtZWRpdW0gKi8sIFhGQV9FbGVtZW50OjpNZWRpdW19LAorICAgIHsweGExMjExYjhiIC8qIHRleHRFZGl0ICovLCBYRkFfRWxlbWVudDo6VGV4dEVkaXR9LAorICAgIHsweGExNzAwOGYwIC8qIHRlbXBsYXRlQ2FjaGUgKi8sIFhGQV9FbGVtZW50OjpUZW1wbGF0ZUNhY2hlfSwKKyAgICB7MHhhNGY3Yjg4ZiAvKiBjb21wcmVzc09iamVjdFN0cmVhbSAqLywgWEZBX0VsZW1lbnQ6OkNvbXByZXNzT2JqZWN0U3RyZWFtfSwKKyAgICB7MHhhNjVmNWQxNyAvKiBkYXRhVmFsdWUgKi8sIFhGQV9FbGVtZW50OjpEYXRhVmFsdWV9LAorICAgIHsweGE2Y2FhYTg5IC8qIGFjY2Vzc2libGVDb250ZW50ICovLCBYRkFfRWxlbWVudDo6QWNjZXNzaWJsZUNvbnRlbnR9LAorICAgIHsweGE5NGNjMDBiIC8qIGluY2x1ZGVYRFBDb250ZW50ICovLCBYRkFfRWxlbWVudDo6SW5jbHVkZVhEUENvbnRlbnR9LAorICAgIHsweGE5YjA4MWExIC8qIHhtbENvbm5lY3Rpb24gKi8sIFhGQV9FbGVtZW50OjpYbWxDb25uZWN0aW9ufSwKKyAgICB7MHhhYjJhM2I3NCAvKiB2YWxpZGF0ZUFwcHJvdmFsU2lnbmF0dXJlcyAqLywKKyAgICAgWEZBX0VsZW1lbnQ6OlZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzfSwKKyAgICB7MHhhYjhjNWEyYiAvKiBzaWduRGF0YSAqLywgWEZBX0VsZW1lbnQ6OlNpZ25EYXRhfSwKKyAgICB7MHhhYmFhMmNlYiAvKiBwYWNrZXRzICovLCBYRkFfRWxlbWVudDo6UGFja2V0c30sCisgICAgezB4YWRiYTM1OWMgLyogZGF0ZVBhdHRlcm4gKi8sIFhGQV9FbGVtZW50OjpEYXRlUGF0dGVybn0sCisgICAgezB4YWUyMjJiMmIgLyogZHVwbGV4T3B0aW9uICovLCBYRkFfRWxlbWVudDo6RHVwbGV4T3B0aW9ufSwKKyAgICB7MHhiMDEyZWZmYiAvKiBiYXNlICovLCBYRkFfRWxlbWVudDo6QmFzZX0sCisgICAgezB4YjBlNTQ4NWQgLyogYmluZCAqLywgWEZBX0VsZW1lbnQ6OkJpbmR9LAorICAgIHsweGI0NWQ2MWIyIC8qIGNvbXByZXNzaW9uICovLCBYRkFfRWxlbWVudDo6Q29tcHJlc3Npb259LAorICAgIHsweGI1NjNmMGZmIC8qIHVzZXIgKi8sIFhGQV9FbGVtZW50OjpVc2VyfSwKKyAgICB7MHhiNTg0OGFkNSAvKiByZWN0YW5nbGUgKi8sIFhGQV9FbGVtZW50OjpSZWN0YW5nbGV9LAorICAgIHsweGI2ZGFjYjcyIC8qIGVmZmVjdGl2ZU91dHB1dFBvbGljeSAqLywKKyAgICAgWEZBX0VsZW1lbnQ6OkVmZmVjdGl2ZU91dHB1dFBvbGljeX0sCisgICAgezB4YjdkNzY1NGQgLyogQURCRV9KU0RlYnVnZ2VyICovLCBYRkFfRWxlbWVudDo6QURCRV9KU0RlYnVnZ2VyfSwKKyAgICB7MHhiYWIzN2Y3MyAvKiBhY3JvYmF0NyAqLywgWEZBX0VsZW1lbnQ6OkFjcm9iYXQ3fSwKKyAgICB7MHhiYzcwMDgxZSAvKiBpbnRlcmFjdGl2ZSAqLywgWEZBX0VsZW1lbnQ6OkludGVyYWN0aXZlfSwKKyAgICB7MHhiYzhmYTM1MCAvKiBsb2NhbGUgKi8sIFhGQV9FbGVtZW50OjpMb2NhbGV9LAorICAgIHsweGJjZDQ0OTQwIC8qIGN1cnJlbnRQYWdlICovLCBYRkFfRWxlbWVudDo6Q3VycmVudFBhZ2V9LAorICAgIHsweGJkZTlhYmRhIC8qIGRhdGEgKi8sIFhGQV9FbGVtZW50OjpEYXRhfSwKKyAgICB7MHhiZGU5YWJkZSAvKiBkYXRlICovLCBYRkFfRWxlbWVudDo6RGF0ZX0sCisgICAgezB4YmU1MmRmYmYgLyogZGVzYyAqLywgWEZBX0VsZW1lbnQ6OkRlc2N9LAorICAgIHsweGJmNGI2NDA1IC8qIGVuY3J5cHQgKi8sIFhGQV9FbGVtZW50OjpFbmNyeXB0fSwKKyAgICB7MHhiZmE4N2NjZSAvKiBkcmF3ICovLCBYRkFfRWxlbWVudDo6RHJhd30sCisgICAgezB4YzE4MWZmNGIgLyogZW5jcnlwdGlvbiAqLywgWEZBX0VsZW1lbnQ6OkVuY3J5cHRpb259LAorICAgIHsweGMxOTcwZjQwIC8qIG1lcmlkaWVtTmFtZXMgKi8sIFhGQV9FbGVtZW50OjpNZXJpZGllbU5hbWVzfSwKKyAgICB7MHhjNWFkOWY1ZSAvKiBtZXNzYWdpbmcgKi8sIFhGQV9FbGVtZW50OjpNZXNzYWdpbmd9LAorICAgIHsweGM2OTU0OWY0IC8qIHNwZWFrICovLCBYRkFfRWxlbWVudDo6U3BlYWt9LAorICAgIHsweGM3NzQzZGM3IC8qIGRhdGFHcm91cCAqLywgWEZBX0VsZW1lbnQ6OkRhdGFHcm91cH0sCisgICAgezB4YzdlYjIwZTkgLyogY29tbW9uICovLCBYRkFfRWxlbWVudDo6Q29tbW9ufSwKKyAgICB7MHhjODVkNDUyOCAvKiAjdGV4dCAqLywgWEZBX0VsZW1lbnQ6OlNoYXJwdGV4dH0sCisgICAgezB4Yzg2MTU1NmEgLyogcGFnaW5hdGlvbk92ZXJyaWRlICovLCBYRkFfRWxlbWVudDo6UGFnaW5hdGlvbk92ZXJyaWRlfSwKKyAgICB7MHhjOTAzZGFiYiAvKiByZWFzb25zICovLCBYRkFfRWxlbWVudDo6UmVhc29uc30sCisgICAgezB4YzlhODEyN2YgLyogc2lnbmF0dXJlUHJvcGVydGllcyAqLywgWEZBX0VsZW1lbnQ6OlNpZ25hdHVyZVByb3BlcnRpZXN9LAorICAgIHsweGNhMDEwYzJkIC8qIHRocmVzaG9sZCAqLywgWEZBX0VsZW1lbnQ6OlRocmVzaG9sZH0sCisgICAgezB4Y2I0YzVlOTYgLyogYXBwZWFyYW5jZUZpbHRlciAqLywgWEZBX0VsZW1lbnQ6OkFwcGVhcmFuY2VGaWx0ZXJ9LAorICAgIHsweGNjOTJhYmE3IC8qIGZpbGwgKi8sIFhGQV9FbGVtZW50OjpGaWxsfSwKKyAgICB7MHhjZDMwOGI3NyAvKiBmb250ICovLCBYRkFfRWxlbWVudDo6Rm9udH0sCisgICAgezB4Y2QzMDlmZjQgLyogZm9ybSAqLywgWEZBX0VsZW1lbnQ6OkZvcm19LAorICAgIHsweGNlYmNjYTJkIC8qIG1lZGl1bUluZm8gKi8sIFhGQV9FbGVtZW50OjpNZWRpdW1JbmZvfSwKKyAgICB7MHhjZmUwZDY0MyAvKiBjZXJ0aWZpY2F0ZSAqLywgWEZBX0VsZW1lbnQ6OkNlcnRpZmljYXRlfSwKKyAgICB7MHhkMDEyYzAzMyAvKiBwYXNzd29yZCAqLywgWEZBX0VsZW1lbnQ6OlBhc3N3b3JkfSwKKyAgICB7MHhkMDE2MDRiZCAvKiBydW5TY3JpcHRzICovLCBYRkFfRWxlbWVudDo6UnVuU2NyaXB0c30sCisgICAgezB4ZDEyMjdlNmYgLyogdHJhY2UgKi8sIFhGQV9FbGVtZW50OjpUcmFjZX0sCisgICAgezB4ZDE1MzI4NzYgLyogZmxvYXQgKi8sIFhGQV9FbGVtZW50OjpGbG9hdH0sCisgICAgezB4ZDE3YTZjMzAgLyogcmVuZGVyUG9saWN5ICovLCBYRkFfRWxlbWVudDo6UmVuZGVyUG9saWN5fSwKKyAgICB7MHhkNThhYTk2MiAvKiBkZXN0aW5hdGlvbiAqLywgWEZBX0VsZW1lbnQ6OkRlc3RpbmF0aW9ufSwKKyAgICB7MHhkNmUyN2YxZCAvKiB2YWx1ZSAqLywgWEZBX0VsZW1lbnQ6OlZhbHVlfSwKKyAgICB7MHhkN2ExNDQ2MiAvKiBib29rZW5kICovLCBYRkFfRWxlbWVudDo6Qm9va2VuZH0sCisgICAgezB4ZDhjMzEyNTQgLyogZXhPYmplY3QgKi8sIFhGQV9FbGVtZW50OjpFeE9iamVjdH0sCisgICAgezB4ZGE2YTg1OTAgLyogb3BlbkFjdGlvbiAqLywgWEZBX0VsZW1lbnQ6Ok9wZW5BY3Rpb259LAorICAgIHsweGRhYjRmYjdkIC8qIG5ldmVyRW1iZWQgKi8sIFhGQV9FbGVtZW50OjpOZXZlckVtYmVkfSwKKyAgICB7MHhkYjk4NDc1ZiAvKiBiaW5kSXRlbXMgKi8sIFhGQV9FbGVtZW50OjpCaW5kSXRlbXN9LAorICAgIHsweGRiZmJlMDJlIC8qIGNhbGN1bGF0ZSAqLywgWEZBX0VsZW1lbnQ6OkNhbGN1bGF0ZX0sCisgICAgezB4ZGQ3Njc2ZWQgLyogcHJpbnQgKi8sIFhGQV9FbGVtZW50OjpQcmludH0sCisgICAgezB4ZGRlMjczZDcgLyogZXh0cmFzICovLCBYRkFfRWxlbWVudDo6RXh0cmFzfSwKKyAgICB7MHhkZTE0NmIzNCAvKiBwcm90byAqLywgWEZBX0VsZW1lbnQ6OlByb3RvfSwKKyAgICB7MHhkZjA1OTMyMSAvKiBkU2lnRGF0YSAqLywgWEZBX0VsZW1lbnQ6OkRTaWdEYXRhfSwKKyAgICB7MHhkZmNjZjAzMCAvKiBjcmVhdG9yICovLCBYRkFfRWxlbWVudDo6Q3JlYXRvcn0sCisgICAgezB4ZGZmNzhjNmEgLyogY29ubmVjdCAqLywgWEZBX0VsZW1lbnQ6OkNvbm5lY3R9LAorICAgIHsweGUxMWEyY2JjIC8qIHBlcm1pc3Npb25zICovLCBYRkFfRWxlbWVudDo6UGVybWlzc2lvbnN9LAorICAgIHsweGUxNGM4MDFjIC8qIGNvbm5lY3Rpb25TZXQgKi8sIFhGQV9FbGVtZW50OjpDb25uZWN0aW9uU2V0fSwKKyAgICB7MHhlMWM4M2ExNCAvKiBzdWJtaXQgKi8sIFhGQV9FbGVtZW50OjpTdWJtaXR9LAorICAgIHsweGUyOTgyMWNkIC8qIHJhbmdlICovLCBYRkFfRWxlbWVudDo6UmFuZ2V9LAorICAgIHsweGUzOGQ4M2M3IC8qIGxpbmVhcml6ZWQgKi8sIFhGQV9FbGVtZW50OjpMaW5lYXJpemVkfSwKKyAgICB7MHhlM2FhMjU3OCAvKiBwYWNrZXQgKi8sIFhGQV9FbGVtZW50OjpQYWNrZXR9LAorICAgIHsweGUzYWE4NjBlIC8qIHJvb3RFbGVtZW50ICovLCBYRkFfRWxlbWVudDo6Um9vdEVsZW1lbnR9LAorICAgIHsweGUzZTU1M2ZhIC8qIHBsYWludGV4dE1ldGFkYXRhICovLCBYRkFfRWxlbWVudDo6UGxhaW50ZXh0TWV0YWRhdGF9LAorICAgIHsweGUzZTZlNGYyIC8qIG51bWJlclN5bWJvbHMgKi8sIFhGQV9FbGVtZW50OjpOdW1iZXJTeW1ib2xzfSwKKyAgICB7MHhlM2YwNjdmNiAvKiBwcmludEhpZ2hRdWFsaXR5ICovLCBYRkFfRWxlbWVudDo6UHJpbnRIaWdoUXVhbGl0eX0sCisgICAgezB4ZTNmZDA3OGMgLyogZHJpdmVyICovLCBYRkFfRWxlbWVudDo6RHJpdmVyfSwKKyAgICB7MHhlNDhiMzRmMiAvKiBpbmNyZW1lbnRhbExvYWQgKi8sIFhGQV9FbGVtZW50OjpJbmNyZW1lbnRhbExvYWR9LAorICAgIHsweGU1NTBlN2MyIC8qIHN1YmplY3RETiAqLywgWEZBX0VsZW1lbnQ6OlN1YmplY3RETn0sCisgICAgezB4ZTY2NjlhNzggLyogY29tcHJlc3NMb2dpY2FsU3RydWN0dXJlICovLAorICAgICBYRkFfRWxlbWVudDo6Q29tcHJlc3NMb2dpY2FsU3RydWN0dXJlfSwKKyAgICB7MHhlN2E3ZWEwMiAvKiBpbmNyZW1lbnRhbE1lcmdlICovLCBYRkFfRWxlbWVudDo6SW5jcmVtZW50YWxNZXJnZX0sCisgICAgezB4ZTk0ODUzMGQgLyogcmFkaWFsICovLCBYRkFfRWxlbWVudDo6UmFkaWFsfSwKKyAgICB7MHhlYThkNjk5OSAvKiB2YXJpYWJsZXMgKi8sIFhGQV9FbGVtZW50OjpWYXJpYWJsZXN9LAorICAgIHsweGVhYTE0MmMwIC8qIHRpbWVQYXR0ZXJucyAqLywgWEZBX0VsZW1lbnQ6OlRpbWVQYXR0ZXJuc30sCisgICAgezB4ZWI5NDNhNzEgLyogZWZmZWN0aXZlSW5wdXRQb2xpY3kgKi8sIFhGQV9FbGVtZW50OjpFZmZlY3RpdmVJbnB1dFBvbGljeX0sCisgICAgezB4ZWYwNGEyYmMgLyogbmFtZUF0dHIgKi8sIFhGQV9FbGVtZW50OjpOYW1lQXR0cn0sCisgICAgezB4ZjA3MjIyYWIgLyogY29uZm9ybWFuY2UgKi8sIFhGQV9FbGVtZW50OjpDb25mb3JtYW5jZX0sCisgICAgezB4ZjBhYWFhZGMgLyogdHJhbnNmb3JtICovLCBYRkFfRWxlbWVudDo6VHJhbnNmb3JtfSwKKyAgICB7MHhmMTQzM2U4OCAvKiBsb2NrRG9jdW1lbnQgKi8sIFhGQV9FbGVtZW50OjpMb2NrRG9jdW1lbnR9LAorICAgIHsweGY1NGViOTk3IC8qIGJyZWFrQWZ0ZXIgKi8sIFhGQV9FbGVtZW50OjpCcmVha0FmdGVyfSwKKyAgICB7MHhmNjE2ZGEyOCAvKiBsaW5lICovLCBYRkFfRWxlbWVudDo6TGluZX0sCisgICAgezB4ZjcwNTVmYjEgLyogc291cmNlICovLCBYRkFfRWxlbWVudDo6U291cmNlfSwKKyAgICB7MHhmN2VlYmUxYyAvKiBvY2N1ciAqLywgWEZBX0VsZW1lbnQ6Ok9jY3VyfSwKKyAgICB7MHhmOGQxMGQ5NyAvKiBwaWNrVHJheUJ5UERGU2l6ZSAqLywgWEZBX0VsZW1lbnQ6OlBpY2tUcmF5QnlQREZTaXplfSwKKyAgICB7MHhmOGYxOWUzYSAvKiBtb250aE5hbWVzICovLCBYRkFfRWxlbWVudDo6TW9udGhOYW1lc30sCisgICAgezB4Zjk4NDE0OWIgLyogc2V2ZXJpdHkgKi8sIFhGQV9FbGVtZW50OjpTZXZlcml0eX0sCisgICAgezB4ZjliY2IwMzcgLyogZ3JvdXBQYXJlbnQgKi8sIFhGQV9FbGVtZW50OjpHcm91cFBhcmVudH0sCisgICAgezB4ZmJjNDJmZmYgLyogZG9jdW1lbnRBc3NlbWJseSAqLywgWEZBX0VsZW1lbnQ6OkRvY3VtZW50QXNzZW1ibHl9LAorICAgIHsweGZjNzgxNTlmIC8qIG51bWJlclN5bWJvbCAqLywgWEZBX0VsZW1lbnQ6Ok51bWJlclN5bWJvbH0sCisgICAgezB4ZmNiZDYwNmMgLyogdGFnZ2VkICovLCBYRkFfRWxlbWVudDo6VGFnZ2VkfSwKKyAgICB7MHhmZjA2MzgwMiAvKiBpdGVtcyAqLywgWEZBX0VsZW1lbnQ6Okl0ZW1zfSwKK307CisKK3N0cnVjdCBBdHRyaWJ1dGVOYW1lSW5mbyB7CisgIHVpbnQzMl90IGhhc2g7CisgIFhGQV9BdHRyaWJ1dGUgYXR0cmlidXRlOworfSBBdHRyaWJ1dGVOYW1lSW5mb1RvRW51bVtdID0geworICAgIHsweDY4IC8qIGggKi8sIFhGQV9BdHRyaWJ1dGU6Okh9LAorICAgIHsweDc3IC8qIHcgKi8sIFhGQV9BdHRyaWJ1dGU6Old9LAorICAgIHsweDc4IC8qIHggKi8sIFhGQV9BdHRyaWJ1dGU6Olh9LAorICAgIHsweDc5IC8qIHkgKi8sIFhGQV9BdHRyaWJ1dGU6Oll9LAorICAgIHsweDIxYWVkIC8qIGlkICovLCBYRkFfQXR0cmlidXRlOjpJZH0sCisgICAgezB4MjUzNjMgLyogdG8gKi8sIFhGQV9BdHRyaWJ1dGU6OlRvfSwKKyAgICB7MHhjYjBhYzkgLyogbGluZVRocm91Z2ggKi8sIFhGQV9BdHRyaWJ1dGU6OkxpbmVUaHJvdWdofSwKKyAgICB7MHgyMjgyYzczIC8qIGhBbGlnbiAqLywgWEZBX0F0dHJpYnV0ZTo6SEFsaWdufSwKKyAgICB7MHgyYzFjN2YxIC8qIHR5cGVmYWNlICovLCBYRkFfQXR0cmlidXRlOjpUeXBlZmFjZX0sCisgICAgezB4MzEwNmMzYSAvKiBiZWZvcmVUYXJnZXQgKi8sIFhGQV9BdHRyaWJ1dGU6OkJlZm9yZVRhcmdldH0sCisgICAgezB4MzFiMTljMSAvKiBuYW1lICovLCBYRkFfQXR0cmlidXRlOjpOYW1lfSwKKyAgICB7MHgzODQ4YjNmIC8qIG5leHQgKi8sIFhGQV9BdHRyaWJ1dGU6Ok5leHR9LAorICAgIHsweDQzZTM0OWIgLyogZGF0YVJvd0NvdW50ICovLCBYRkFfQXR0cmlidXRlOjpEYXRhUm93Q291bnR9LAorICAgIHsweDU1MThjMjUgLyogYnJlYWsgKi8sIFhGQV9BdHRyaWJ1dGU6OkJyZWFrfSwKKyAgICB7MHg1Y2U2MTk1IC8qIHZTY3JvbGxQb2xpY3kgKi8sIFhGQV9BdHRyaWJ1dGU6OlZTY3JvbGxQb2xpY3l9LAorICAgIHsweDhjNzRhZTkgLyogZm9udEhvcml6b250YWxTY2FsZSAqLywgWEZBX0F0dHJpYnV0ZTo6Rm9udEhvcml6b250YWxTY2FsZX0sCisgICAgezB4OGQ0ZjFjNyAvKiB0ZXh0SW5kZW50ICovLCBYRkFfQXR0cmlidXRlOjpUZXh0SW5kZW50fSwKKyAgICB7MHg5N2MxYzY1IC8qIGNvbnRleHQgKi8sIFhGQV9BdHRyaWJ1dGU6OkNvbnRleHR9LAorICAgIHsweDk4NzY1NzggLyogdHJheU91dCAqLywgWEZBX0F0dHJpYnV0ZTo6VHJheU91dH0sCisgICAgezB4YTJlMzUxNCAvKiBjYXAgKi8sIFhGQV9BdHRyaWJ1dGU6OkNhcH0sCisgICAgezB4YjM1NDNhNiAvKiBtYXggKi8sIFhGQV9BdHRyaWJ1dGU6Ok1heH0sCisgICAgezB4YjM1NmNhNCAvKiBtaW4gKi8sIFhGQV9BdHRyaWJ1dGU6Ok1pbn0sCisgICAgezB4YmI4ZGY1ZCAvKiByZWYgKi8sIFhGQV9BdHRyaWJ1dGU6OlJlZn0sCisgICAgezB4YmI4ZjNkZiAvKiByaWQgKi8sIFhGQV9BdHRyaWJ1dGU6OlJpZH0sCisgICAgezB4YzA4MGNkMyAvKiB1cmwgKi8sIFhGQV9BdHRyaWJ1dGU6OlVybH0sCisgICAgezB4YzA4MTFlZCAvKiB1c2UgKi8sIFhGQV9BdHRyaWJ1dGU6OlVzZX0sCisgICAgezB4Y2ZlYTAyZSAvKiBsZWZ0SW5zZXQgKi8sIFhGQV9BdHRyaWJ1dGU6OkxlZnRJbnNldH0sCisgICAgezB4MTAyNmM1OWQgLyogd2lkb3dzICovLCBYRkFfQXR0cmlidXRlOjpXaWRvd3N9LAorICAgIHsweDEwNTllYzE4IC8qIGxldmVsICovLCBYRkFfQXR0cmlidXRlOjpMZXZlbH0sCisgICAgezB4MTM1NmNhZjggLyogYm90dG9tSW5zZXQgKi8sIFhGQV9BdHRyaWJ1dGU6OkJvdHRvbUluc2V0fSwKKyAgICB7MHgxM2EwOGJkYiAvKiBvdmVyZmxvd1RhcmdldCAqLywgWEZBX0F0dHJpYnV0ZTo6T3ZlcmZsb3dUYXJnZXR9LAorICAgIHsweDE0MTRkNDMxIC8qIGFsbG93TWFjcm8gKi8sIFhGQV9BdHRyaWJ1dGU6OkFsbG93TWFjcm99LAorICAgIHsweDE0YTMyZDUyIC8qIHBhZ2VQb3NpdGlvbiAqLywgWEZBX0F0dHJpYnV0ZTo6UGFnZVBvc2l0aW9ufSwKKyAgICB7MHgxNTE3ZGZhMSAvKiBjb2x1bW5XaWR0aHMgKi8sIFhGQV9BdHRyaWJ1dGU6OkNvbHVtbldpZHRoc30sCisgICAgezB4MTY5MTM0YTEgLyogb3ZlcmZsb3dMZWFkZXIgKi8sIFhGQV9BdHRyaWJ1dGU6Ok92ZXJmbG93TGVhZGVyfSwKKyAgICB7MHgxYjhkY2UzZSAvKiBhY3Rpb24gKi8sIFhGQV9BdHRyaWJ1dGU6OkFjdGlvbn0sCisgICAgezB4MWU0NTliOGYgLyogbm9uUmVwdWRpYXRpb24gKi8sIFhGQV9BdHRyaWJ1dGU6Ok5vblJlcHVkaWF0aW9ufSwKKyAgICB7MHgxZWM4YWIyYyAvKiByYXRlICovLCBYRkFfQXR0cmlidXRlOjpSYXRlfSwKKyAgICB7MHgxZWYzYTY0YSAvKiBhbGxvd1JpY2hUZXh0ICovLCBYRkFfQXR0cmlidXRlOjpBbGxvd1JpY2hUZXh0fSwKKyAgICB7MHgyMDM4YzliMiAvKiByb2xlICovLCBYRkFfQXR0cmlidXRlOjpSb2xlfSwKKyAgICB7MHgyMDkxNDM2NyAvKiBvdmVyZmxvd1RyYWlsZXIgKi8sIFhGQV9BdHRyaWJ1dGU6Ok92ZXJmbG93VHJhaWxlcn0sCisgICAgezB4MjI2Y2E4ZjEgLyogb3BlcmF0aW9uICovLCBYRkFfQXR0cmlidXRlOjpPcGVyYXRpb259LAorICAgIHsweDI0ZDg1MTY3IC8qIHRpbWVvdXQgKi8sIFhGQV9BdHRyaWJ1dGU6OlRpbWVvdXR9LAorICAgIHsweDI1NzY0NDM2IC8qIHRvcEluc2V0ICovLCBYRkFfQXR0cmlidXRlOjpUb3BJbnNldH0sCisgICAgezB4MjU4Mzk4NTIgLyogYWNjZXNzICovLCBYRkFfQXR0cmlidXRlOjpBY2Nlc3N9LAorICAgIHsweDI2OGI3ZWMxIC8qIGNvbW1hbmRUeXBlICovLCBYRkFfQXR0cmlidXRlOjpDb21tYW5kVHlwZX0sCisgICAgezB4MjhkZWU2ZTkgLyogZm9ybWF0ICovLCBYRkFfQXR0cmlidXRlOjpGb3JtYXR9LAorICAgIHsweDI4ZTE3ZTkxIC8qIGRhdGFQcmVwICovLCBYRkFfQXR0cmlidXRlOjpEYXRhUHJlcH0sCisgICAgezB4MjkyYjg4ZmUgLyogd2lkZ2V0RGF0YSAqLywgWEZBX0F0dHJpYnV0ZTo6V2lkZ2V0RGF0YX0sCisgICAgezB4Mjk0MThiYjcgLyogYWJiciAqLywgWEZBX0F0dHJpYnV0ZTo6QWJicn0sCisgICAgezB4MmE4MmQ5OWMgLyogbWFyZ2luUmlnaHQgKi8sIFhGQV9BdHRyaWJ1dGU6Ok1hcmdpblJpZ2h0fSwKKyAgICB7MHgyYjVkZjUxZSAvKiBkYXRhRGVzY3JpcHRpb24gKi8sIFhGQV9BdHRyaWJ1dGU6OkRhdGFEZXNjcmlwdGlvbn0sCisgICAgezB4MmJiM2Y0NzAgLyogZW5jaXBoZXJPbmx5ICovLCBYRkFfQXR0cmlidXRlOjpFbmNpcGhlck9ubHl9LAorICAgIHsweDJjZDc5MDMzIC8qIGtlcm5pbmdNb2RlICovLCBYRkFfQXR0cmlidXRlOjpLZXJuaW5nTW9kZX0sCisgICAgezB4MmVlNzY3OGYgLyogcm90YXRlICovLCBYRkFfQXR0cmlidXRlOjpSb3RhdGV9LAorICAgIHsweDJmMTA1ZjcyIC8qIHdvcmRDaGFyYWN0ZXJDb3VudCAqLywgWEZBX0F0dHJpYnV0ZTo6V29yZENoYXJhY3RlckNvdW50fSwKKyAgICB7MHgyZjE2YTM4MiAvKiB0eXBlICovLCBYRkFfQXR0cmlidXRlOjpUeXBlfSwKKyAgICB7MHgzNGFlMTAzYyAvKiByZXNlcnZlICovLCBYRkFfQXR0cmlidXRlOjpSZXNlcnZlfSwKKyAgICB7MHgzNjUwNTU3ZSAvKiB0ZXh0TG9jYXRpb24gKi8sIFhGQV9BdHRyaWJ1dGU6OlRleHRMb2NhdGlvbn0sCisgICAgezB4MzljZGIwYTIgLyogcHJpb3JpdHkgKi8sIFhGQV9BdHRyaWJ1dGU6OlByaW9yaXR5fSwKKyAgICB7MHgzYTAyNzNhNiAvKiB1bmRlcmxpbmUgKi8sIFhGQV9BdHRyaWJ1dGU6OlVuZGVybGluZX0sCisgICAgezB4M2I1ODIyODYgLyogbW9kdWxlV2lkdGggKi8sIFhGQV9BdHRyaWJ1dGU6Ok1vZHVsZVdpZHRofSwKKyAgICB7MHgzZDEyM2MyNiAvKiBoeXBoZW5hdGUgKi8sIFhGQV9BdHRyaWJ1dGU6Okh5cGhlbmF0ZX0sCisgICAgezB4M2U3YWY5NGYgLyogbGlzdGVuICovLCBYRkFfQXR0cmlidXRlOjpMaXN0ZW59LAorICAgIHsweDQxNTZlZTNmIC8qIGRlbGltaXRlciAqLywgWEZBX0F0dHJpYnV0ZTo6RGVsaW1pdGVyfSwKKyAgICB7MHg0MmZlZDFmZCAvKiBjb250ZW50VHlwZSAqLywgWEZBX0F0dHJpYnV0ZTo6Q29udGVudFR5cGV9LAorICAgIHsweDQ1M2VhZjM4IC8qIHN0YXJ0TmV3ICovLCBYRkFfQXR0cmlidXRlOjpTdGFydE5ld30sCisgICAgezB4NDVhNmRhZjggLyogZW9mQWN0aW9uICovLCBYRkFfQXR0cmlidXRlOjpFb2ZBY3Rpb259LAorICAgIHsweDQ3Y2ZhNDNhIC8qIGFsbG93TmV1dHJhbCAqLywgWEZBX0F0dHJpYnV0ZTo6QWxsb3dOZXV0cmFsfSwKKyAgICB7MHg0N2QwMzQ5MCAvKiBjb25uZWN0aW9uICovLCBYRkFfQXR0cmlidXRlOjpDb25uZWN0aW9ufSwKKyAgICB7MHg0ODczYzYwMSAvKiBiYXNlbGluZVNoaWZ0ICovLCBYRkFfQXR0cmlidXRlOjpCYXNlbGluZVNoaWZ0fSwKKyAgICB7MHg0YjMxOTc2NyAvKiBvdmVybGluZVBlcmlvZCAqLywgWEZBX0F0dHJpYnV0ZTo6T3ZlcmxpbmVQZXJpb2R9LAorICAgIHsweDRiOGJjODQwIC8qIGZyYWNEaWdpdHMgKi8sIFhGQV9BdHRyaWJ1dGU6OkZyYWNEaWdpdHN9LAorICAgIHsweDRlZjNkMDJjIC8qIG9yaWVudGF0aW9uICovLCBYRkFfQXR0cmlidXRlOjpPcmllbnRhdGlvbn0sCisgICAgezB4NGZkYzM0NTQgLyogdGltZVN0YW1wICovLCBYRkFfQXR0cmlidXRlOjpUaW1lU3RhbXB9LAorICAgIHsweDUyNjY2ZjFjIC8qIHByaW50Q2hlY2tEaWdpdCAqLywgWEZBX0F0dHJpYnV0ZTo6UHJpbnRDaGVja0RpZ2l0fSwKKyAgICB7MHg1MzQ3MjljOSAvKiBtYXJnaW5MZWZ0ICovLCBYRkFfQXR0cmlidXRlOjpNYXJnaW5MZWZ0fSwKKyAgICB7MHg1MzkyZWE1OCAvKiBzdHJva2UgKi8sIFhGQV9BdHRyaWJ1dGU6OlN0cm9rZX0sCisgICAgezB4NTQwNGQ2ZGYgLyogbW9kdWxlSGVpZ2h0ICovLCBYRkFfQXR0cmlidXRlOjpNb2R1bGVIZWlnaHR9LAorICAgIHsweDU0ZmE3MjJjIC8qIHRyYW5zZmVyRW5jb2RpbmcgKi8sIFhGQV9BdHRyaWJ1dGU6OlRyYW5zZmVyRW5jb2Rpbmd9LAorICAgIHsweDU1MmQ5YWQ1IC8qIHVzYWdlICovLCBYRkFfQXR0cmlidXRlOjpVc2FnZX0sCisgICAgezB4NTcwY2U4MzUgLyogcHJlc2VuY2UgKi8sIFhGQV9BdHRyaWJ1dGU6OlByZXNlbmNlfSwKKyAgICB7MHg1NzM5ZDFmZiAvKiByYWRpeE9mZnNldCAqLywgWEZBX0F0dHJpYnV0ZTo6UmFkaXhPZmZzZXR9LAorICAgIHsweDU3NzY4MmFjIC8qIHByZXNlcnZlICovLCBYRkFfQXR0cmlidXRlOjpQcmVzZXJ2ZX0sCisgICAgezB4NThiZTI4NzAgLyogYWxpYXNOb2RlICovLCBYRkFfQXR0cmlidXRlOjpBbGlhc05vZGV9LAorICAgIHsweDVhMzJlNDkzIC8qIG11bHRpTGluZSAqLywgWEZBX0F0dHJpYnV0ZTo6TXVsdGlMaW5lfSwKKyAgICB7MHg1YTUwZTllNiAvKiB2ZXJzaW9uICovLCBYRkFfQXR0cmlidXRlOjpWZXJzaW9ufSwKKyAgICB7MHg1YWIyM2I2YyAvKiBzdGFydENoYXIgKi8sIFhGQV9BdHRyaWJ1dGU6OlN0YXJ0Q2hhcn0sCisgICAgezB4NWI3MDdhMzUgLyogc2NyaXB0VGVzdCAqLywgWEZBX0F0dHJpYnV0ZTo6U2NyaXB0VGVzdH0sCisgICAgezB4NWMwNTQ3NTUgLyogc3RhcnRBbmdsZSAqLywgWEZBX0F0dHJpYnV0ZTo6U3RhcnRBbmdsZX0sCisgICAgezB4NWVjOTU4YzAgLyogY3Vyc29yVHlwZSAqLywgWEZBX0F0dHJpYnV0ZTo6Q3Vyc29yVHlwZX0sCisgICAgezB4NWY3NjBiNTAgLyogZGlnaXRhbFNpZ25hdHVyZSAqLywgWEZBX0F0dHJpYnV0ZTo6RGlnaXRhbFNpZ25hdHVyZX0sCisgICAgezB4NjBhNjFlZGQgLyogY29kZVR5cGUgKi8sIFhGQV9BdHRyaWJ1dGU6OkNvZGVUeXBlfSwKKyAgICB7MHg2MGQ0YzhiMSAvKiBvdXRwdXQgKi8sIFhGQV9BdHRyaWJ1dGU6Ok91dHB1dH0sCisgICAgezB4NjQxMTBhYjUgLyogYm9va2VuZFRyYWlsZXIgKi8sIFhGQV9BdHRyaWJ1dGU6OkJvb2tlbmRUcmFpbGVyfSwKKyAgICB7MHg2NWUzMGM2NyAvKiBpbWFnaW5nQkJveCAqLywgWEZBX0F0dHJpYnV0ZTo6SW1hZ2luZ0JCb3h9LAorICAgIHsweDY2NTM5YzQ4IC8qIGV4Y2x1ZGVJbml0aWFsQ2FwICovLCBYRkFfQXR0cmlidXRlOjpFeGNsdWRlSW5pdGlhbENhcH0sCisgICAgezB4NjY2NDJmOGYgLyogZm9yY2UgKi8sIFhGQV9BdHRyaWJ1dGU6OkZvcmNlfSwKKyAgICB7MHg2OWFhMjI5MiAvKiBjcmxTaWduICovLCBYRkFfQXR0cmlidXRlOjpDcmxTaWdufSwKKyAgICB7MHg2YTM0MDVkZCAvKiBwcmV2aW91cyAqLywgWEZBX0F0dHJpYnV0ZTo6UHJldmlvdXN9LAorICAgIHsweDZhOTVjOTc2IC8qIHB1c2hDaGFyYWN0ZXJDb3VudCAqLywgWEZBX0F0dHJpYnV0ZTo6UHVzaENoYXJhY3RlckNvdW50fSwKKyAgICB7MHg2YjZkZGNmYiAvKiBudWxsVGVzdCAqLywgWEZBX0F0dHJpYnV0ZTo6TnVsbFRlc3R9LAorICAgIHsweDZjZmE4MjhhIC8qIHJ1bkF0ICovLCBYRkFfQXR0cmlidXRlOjpSdW5BdH0sCisgICAgezB4NzMxZTA2NjUgLyogc3BhY2VCZWxvdyAqLywgWEZBX0F0dHJpYnV0ZTo6U3BhY2VCZWxvd30sCisgICAgezB4NzQ3ODhmOGIgLyogc3dlZXBBbmdsZSAqLywgWEZBX0F0dHJpYnV0ZTo6U3dlZXBBbmdsZX0sCisgICAgezB4NzhiZmY1MzEgLyogbnVtYmVyT2ZDZWxscyAqLywgWEZBX0F0dHJpYnV0ZTo6TnVtYmVyT2ZDZWxsc30sCisgICAgezB4Nzk1NDMwNTUgLyogbGV0dGVyU3BhY2luZyAqLywgWEZBX0F0dHJpYnV0ZTo6TGV0dGVyU3BhY2luZ30sCisgICAgezB4Nzk5NzVmMmIgLyogbG9ja1R5cGUgKi8sIFhGQV9BdHRyaWJ1dGU6OkxvY2tUeXBlfSwKKyAgICB7MHg3YTBjYzQ3MSAvKiBwYXNzd29yZENoYXIgKi8sIFhGQV9BdHRyaWJ1dGU6OlBhc3N3b3JkQ2hhcn0sCisgICAgezB4N2E3Y2MzNDEgLyogdkFsaWduICovLCBYRkFfQXR0cmlidXRlOjpWQWxpZ259LAorICAgIHsweDdiMjk2MzBhIC8qIHNvdXJjZUJlbG93ICovLCBYRkFfQXR0cmlidXRlOjpTb3VyY2VCZWxvd30sCisgICAgezB4N2I5NWU2NjEgLyogaW52ZXJ0ZWQgKi8sIFhGQV9BdHRyaWJ1dGU6OkludmVydGVkfSwKKyAgICB7MHg3YzJmZDgwYiAvKiBtYXJrICovLCBYRkFfQXR0cmlidXRlOjpNYXJrfSwKKyAgICB7MHg3YzJmZjZhZSAvKiBtYXhIICovLCBYRkFfQXR0cmlidXRlOjpNYXhIfSwKKyAgICB7MHg3YzJmZjZiZCAvKiBtYXhXICovLCBYRkFfQXR0cmlidXRlOjpNYXhXfSwKKyAgICB7MHg3YzczMmE2NiAvKiB0cnVuY2F0ZSAqLywgWEZBX0F0dHJpYnV0ZTo6VHJ1bmNhdGV9LAorICAgIHsweDdkMDIzNTZjIC8qIG1pbkggKi8sIFhGQV9BdHRyaWJ1dGU6Ok1pbkh9LAorICAgIHsweDdkMDIzNTdiIC8qIG1pblcgKi8sIFhGQV9BdHRyaWJ1dGU6Ok1pbld9LAorICAgIHsweDdkMGI1ZmNhIC8qIGluaXRpYWwgKi8sIFhGQV9BdHRyaWJ1dGU6OkluaXRpYWx9LAorICAgIHsweDdkOWZkN2M1IC8qIG1vZGUgKi8sIFhGQV9BdHRyaWJ1dGU6Ok1vZGV9LAorICAgIHsweDdlN2U4NDVlIC8qIGxheW91dCAqLywgWEZBX0F0dHJpYnV0ZTo6TGF5b3V0fSwKKyAgICB7MHg3ZjZmZDNkNyAvKiBzZXJ2ZXIgKi8sIFhGQV9BdHRyaWJ1dGU6OlNlcnZlcn0sCisgICAgezB4ODI0ZjIxYjcgLyogZW1iZWRQREYgKi8sIFhGQV9BdHRyaWJ1dGU6OkVtYmVkUERGfSwKKyAgICB7MHg4MzQwZWE2NiAvKiBvZGRPckV2ZW4gKi8sIFhGQV9BdHRyaWJ1dGU6Ok9kZE9yRXZlbn0sCisgICAgezB4ODM2ZDRkN2MgLyogdGFiRGVmYXVsdCAqLywgWEZBX0F0dHJpYnV0ZTo6VGFiRGVmYXVsdH0sCisgICAgezB4ODg1NTgwNWYgLyogY29udGFpbnMgKi8sIFhGQV9BdHRyaWJ1dGU6OkNvbnRhaW5zfSwKKyAgICB7MHg4YTY5MjUyMSAvKiByaWdodEluc2V0ICovLCBYRkFfQXR0cmlidXRlOjpSaWdodEluc2V0fSwKKyAgICB7MHg4YWYyZTY1NyAvKiBtYXhDaGFycyAqLywgWEZBX0F0dHJpYnV0ZTo6TWF4Q2hhcnN9LAorICAgIHsweDhiOTBlMWYyIC8qIG9wZW4gKi8sIFhGQV9BdHRyaWJ1dGU6Ok9wZW59LAorICAgIHsweDhjOTkzNzdlIC8qIHJlbGF0aW9uICovLCBYRkFfQXR0cmlidXRlOjpSZWxhdGlvbn0sCisgICAgezB4OGQxODFkNjEgLyogd2lkZU5hcnJvd1JhdGlvICovLCBYRkFfQXR0cmlidXRlOjpXaWRlTmFycm93UmF0aW99LAorICAgIHsweDhlMWMyOTIxIC8qIHJlbGV2YW50ICovLCBYRkFfQXR0cmlidXRlOjpSZWxldmFudH0sCisgICAgezB4OGUyOWQ3OTQgLyogc2lnbmF0dXJlVHlwZSAqLywgWEZBX0F0dHJpYnV0ZTo6U2lnbmF0dXJlVHlwZX0sCisgICAgezB4OGVjNjIwNGMgLyogbGluZVRocm91Z2hQZXJpb2QgKi8sIFhGQV9BdHRyaWJ1dGU6OkxpbmVUaHJvdWdoUGVyaW9kfSwKKyAgICB7MHg4ZWQxODJkMSAvKiBzaGFwZSAqLywgWEZBX0F0dHJpYnV0ZTo6U2hhcGV9LAorICAgIHsweDhmYTAxNzkwIC8qIHRhYlN0b3BzICovLCBYRkFfQXR0cmlidXRlOjpUYWJTdG9wc30sCisgICAgezB4OGZjMzZjMGEgLyogb3V0cHV0QmVsb3cgKi8sIFhGQV9BdHRyaWJ1dGU6Ok91dHB1dEJlbG93fSwKKyAgICB7MHg5MDQxZDRiMCAvKiBzaG9ydCAqLywgWEZBX0F0dHJpYnV0ZTo6U2hvcnR9LAorICAgIHsweDkwN2M3NzE5IC8qIGZvbnRWZXJ0aWNhbFNjYWxlICovLCBYRkFfQXR0cmlidXRlOjpGb250VmVydGljYWxTY2FsZX0sCisgICAgezB4OTQ0NDZkY2MgLyogdGhpY2tuZXNzICovLCBYRkFfQXR0cmlidXRlOjpUaGlja25lc3N9LAorICAgIHsweDk1N2ZhMDA2IC8qIGNvbW1pdE9uICovLCBYRkFfQXR0cmlidXRlOjpDb21taXRPbn0sCisgICAgezB4OTgyYmQ4OTIgLyogcmVtYWluQ2hhcmFjdGVyQ291bnQgKi8sCisgICAgIFhGQV9BdHRyaWJ1dGU6OlJlbWFpbkNoYXJhY3RlckNvdW50fSwKKyAgICB7MHg5OGZkNGQ4MSAvKiBrZXlBZ3JlZW1lbnQgKi8sIFhGQV9BdHRyaWJ1dGU6OktleUFncmVlbWVudH0sCisgICAgezB4OTk4MDBkN2EgLyogZXJyb3JDb3JyZWN0aW9uTGV2ZWwgKi8sCisgICAgIFhGQV9BdHRyaWJ1dGU6OkVycm9yQ29ycmVjdGlvbkxldmVsfSwKKyAgICB7MHg5YTYzZGEzZCAvKiB1cHNNb2RlICovLCBYRkFfQXR0cmlidXRlOjpVcHNNb2RlfSwKKyAgICB7MHg5Y2MxN2Q3NSAvKiBtZXJnZU1vZGUgKi8sIFhGQV9BdHRyaWJ1dGU6Ok1lcmdlTW9kZX0sCisgICAgezB4OWQ4MzNkNzUgLyogY2lyY3VsYXIgKi8sIFhGQV9BdHRyaWJ1dGU6OkNpcmN1bGFyfSwKKyAgICB7MHg5ZDhlZTIwNCAvKiBwc05hbWUgKi8sIFhGQV9BdHRyaWJ1dGU6OlBzTmFtZX0sCisgICAgezB4OWRjYzNhYjMgLyogdHJhaWxlciAqLywgWEZBX0F0dHJpYnV0ZTo6VHJhaWxlcn0sCisgICAgezB4YTA5MzM5NTQgLyogdW5pY29kZVJhbmdlICovLCBYRkFfQXR0cmlidXRlOjpVbmljb2RlUmFuZ2V9LAorICAgIHsweGExYjBkMmY1IC8qIGV4ZWN1dGVUeXBlICovLCBYRkFfQXR0cmlidXRlOjpFeGVjdXRlVHlwZX0sCisgICAgezB4YTI1YTg4M2QgLyogZHVwbGV4SW1wb3NpdGlvbiAqLywgWEZBX0F0dHJpYnV0ZTo6RHVwbGV4SW1wb3NpdGlvbn0sCisgICAgezB4YTQyY2ExYjcgLyogdHJheUluICovLCBYRkFfQXR0cmlidXRlOjpUcmF5SW59LAorICAgIHsweGE0MzNmMDAxIC8qIGJpbmRpbmdOb2RlICovLCBYRkFfQXR0cmlidXRlOjpCaW5kaW5nTm9kZX0sCisgICAgezB4YTUzNDBmZjUgLyogYm9mQWN0aW9uICovLCBYRkFfQXR0cmlidXRlOjpCb2ZBY3Rpb259LAorICAgIHsweGE1YjQxMGNmIC8qIHNhdmUgKi8sIFhGQV9BdHRyaWJ1dGU6OlNhdmV9LAorICAgIHsweGE2MTE4Yzg5IC8qIHRhcmdldFR5cGUgKi8sIFhGQV9BdHRyaWJ1dGU6OlRhcmdldFR5cGV9LAorICAgIHsweGE2NjQwNGNiIC8qIGtleUVuY2lwaGVybWVudCAqLywgWEZBX0F0dHJpYnV0ZTo6S2V5RW5jaXBoZXJtZW50fSwKKyAgICB7MHhhNjcxMDI2MiAvKiBjcmVkZW50aWFsU2VydmVyUG9saWN5ICovLAorICAgICBYRkFfQXR0cmlidXRlOjpDcmVkZW50aWFsU2VydmVyUG9saWN5fSwKKyAgICB7MHhhNjg2OTc1YiAvKiBzaXplICovLCBYRkFfQXR0cmlidXRlOjpTaXplfSwKKyAgICB7MHhhODVlNzRmMyAvKiBpbml0aWFsTnVtYmVyICovLCBYRkFfQXR0cmlidXRlOjpJbml0aWFsTnVtYmVyfSwKKyAgICB7MHhhYmVmMzdlMyAvKiBzbG9wZSAqLywgWEZBX0F0dHJpYnV0ZTo6U2xvcGV9LAorICAgIHsweGFiZmE2YzRmIC8qIGNTcGFjZSAqLywgWEZBX0F0dHJpYnV0ZTo6Q1NwYWNlfSwKKyAgICB7MHhhYzA2ZTJiMCAvKiBjb2xTcGFuICovLCBYRkFfQXR0cmlidXRlOjpDb2xTcGFufSwKKyAgICB7MHhhZGM0Yzc3YiAvKiBiaW5kaW5nICovLCBYRkFfQXR0cmlidXRlOjpCaW5kaW5nfSwKKyAgICB7MHhhZjc1NDYxMyAvKiBjaGVja3N1bSAqLywgWEZBX0F0dHJpYnV0ZTo6Q2hlY2tzdW19LAorICAgIHsweGIwNDVmYmM1IC8qIGNoYXJFbmNvZGluZyAqLywgWEZBX0F0dHJpYnV0ZTo6Q2hhckVuY29kaW5nfSwKKyAgICB7MHhiMGU1NDg1ZCAvKiBiaW5kICovLCBYRkFfQXR0cmlidXRlOjpCaW5kfSwKKyAgICB7MHhiMTIxMjhiNyAvKiB0ZXh0RW50cnkgKi8sIFhGQV9BdHRyaWJ1dGU6OlRleHRFbnRyeX0sCisgICAgezB4YjM3M2E4NjIgLyogYXJjaGl2ZSAqLywgWEZBX0F0dHJpYnV0ZTo6QXJjaGl2ZX0sCisgICAgezB4YjU5OGExZjcgLyogdXVpZCAqLywgWEZBX0F0dHJpYnV0ZTo6VXVpZH0sCisgICAgezB4YjVlNDliZjIgLyogcG9zdHVyZSAqLywgWEZBX0F0dHJpYnV0ZTo6UG9zdHVyZX0sCisgICAgezB4YjZiNDQxNzIgLyogYWZ0ZXIgKi8sIFhGQV9BdHRyaWJ1dGU6OkFmdGVyfSwKKyAgICB7MHhiNzE2NDY3YiAvKiBvcnBoYW5zICovLCBYRkFfQXR0cmlidXRlOjpPcnBoYW5zfSwKKyAgICB7MHhiYzBjNDY5NSAvKiBxdWFsaWZpZWROYW1lICovLCBYRkFfQXR0cmlidXRlOjpRdWFsaWZpZWROYW1lfSwKKyAgICB7MHhiYzI1NDMzMiAvKiB1c2VocmVmICovLCBYRkFfQXR0cmlidXRlOjpVc2VocmVmfSwKKyAgICB7MHhiYzhmYTM1MCAvKiBsb2NhbGUgKi8sIFhGQV9BdHRyaWJ1dGU6OkxvY2FsZX0sCisgICAgezB4YmQ2ZTFkODggLyogd2VpZ2h0ICovLCBYRkFfQXR0cmlidXRlOjpXZWlnaHR9LAorICAgIHsweGJkOTZhMGU5IC8qIHVuZGVybGluZVBlcmlvZCAqLywgWEZBX0F0dHJpYnV0ZTo6VW5kZXJsaW5lUGVyaW9kfSwKKyAgICB7MHhiZGU5YWJkYSAvKiBkYXRhICovLCBYRkFfQXR0cmlidXRlOjpEYXRhfSwKKyAgICB7MHhiZTUyZGZiZiAvKiBkZXNjICovLCBYRkFfQXR0cmlidXRlOjpEZXNjfSwKKyAgICB7MHhiZTliYTQ3MiAvKiBudW1iZXJlZCAqLywgWEZBX0F0dHJpYnV0ZTo6TnVtYmVyZWR9LAorICAgIHsweGMwMzVjNmIxIC8qIGRhdGFDb2x1bW5Db3VudCAqLywgWEZBX0F0dHJpYnV0ZTo6RGF0YUNvbHVtbkNvdW50fSwKKyAgICB7MHhjMGVjOWZhNCAvKiBvdmVybGluZSAqLywgWEZBX0F0dHJpYnV0ZTo6T3ZlcmxpbmV9LAorICAgIHsweGMyYmEwOTIzIC8qIHVybFBvbGljeSAqLywgWEZBX0F0dHJpYnV0ZTo6VXJsUG9saWN5fSwKKyAgICB7MHhjMmJkNDBmZCAvKiBhbmNob3JUeXBlICovLCBYRkFfQXR0cmlidXRlOjpBbmNob3JUeXBlfSwKKyAgICB7MHhjMzlhODhiZCAvKiBsYWJlbFJlZiAqLywgWEZBX0F0dHJpYnV0ZTo6TGFiZWxSZWZ9LAorICAgIHsweGMzYzE0NDJmIC8qIGJvb2tlbmRMZWFkZXIgKi8sIFhGQV9BdHRyaWJ1dGU6OkJvb2tlbmRMZWFkZXJ9LAorICAgIHsweGM0NTQ3YTA4IC8qIG1heExlbmd0aCAqLywgWEZBX0F0dHJpYnV0ZTo6TWF4TGVuZ3RofSwKKyAgICB7MHhjNGZlZDA5YiAvKiBhY2Nlc3NLZXkgKi8sIFhGQV9BdHRyaWJ1dGU6OkFjY2Vzc0tleX0sCisgICAgezB4YzU3NjIxNTcgLyogY3Vyc29yTG9jYXRpb24gKi8sIFhGQV9BdHRyaWJ1dGU6OkN1cnNvckxvY2F0aW9ufSwKKyAgICB7MHhjODYwZjMwYSAvKiBkZWxheWVkT3BlbiAqLywgWEZBX0F0dHJpYnV0ZTo6RGVsYXllZE9wZW59LAorICAgIHsweGM4ZGE0ZGE3IC8qIHRhcmdldCAqLywgWEZBX0F0dHJpYnV0ZTo6VGFyZ2V0fSwKKyAgICB7MHhjYTVkYzI3YyAvKiBkYXRhRW5jaXBoZXJtZW50ICovLCBYRkFfQXR0cmlidXRlOjpEYXRhRW5jaXBoZXJtZW50fSwKKyAgICB7MHhjYjE1MDQ3OSAvKiBhZnRlclRhcmdldCAqLywgWEZBX0F0dHJpYnV0ZTo6QWZ0ZXJUYXJnZXR9LAorICAgIHsweGNiY2FmNjZkIC8qIGxlYWRlciAqLywgWEZBX0F0dHJpYnV0ZTo6TGVhZGVyfSwKKyAgICB7MHhjY2E3ODk3ZSAvKiBwaWNrZXIgKi8sIFhGQV9BdHRyaWJ1dGU6OlBpY2tlcn0sCisgICAgezB4Y2Q3ZjdiNTQgLyogZnJvbSAqLywgWEZBX0F0dHJpYnV0ZTo6RnJvbX0sCisgICAgezB4Y2VhNWU2MmMgLyogYmFzZVByb2ZpbGUgKi8sIFhGQV9BdHRyaWJ1dGU6OkJhc2VQcm9maWxlfSwKKyAgICB7MHhkMTcxYjI0MCAvKiBhc3BlY3QgKi8sIFhGQV9BdHRyaWJ1dGU6OkFzcGVjdH0sCisgICAgezB4ZDNjODRkMjUgLyogcm93Q29sdW1uUmF0aW8gKi8sIFhGQV9BdHRyaWJ1dGU6OlJvd0NvbHVtblJhdGlvfSwKKyAgICB7MHhkNGIwMTkyMSAvKiBsaW5lSGVpZ2h0ICovLCBYRkFfQXR0cmlidXRlOjpMaW5lSGVpZ2h0fSwKKyAgICB7MHhkNGNjNTNmOCAvKiBoaWdobGlnaHQgKi8sIFhGQV9BdHRyaWJ1dGU6OkhpZ2hsaWdodH0sCisgICAgezB4ZDUwZjkwM2EgLyogdmFsdWVSZWYgKi8sIFhGQV9BdHRyaWJ1dGU6OlZhbHVlUmVmfSwKKyAgICB7MHhkNTI0ODJlMCAvKiBtYXhFbnRyaWVzICovLCBYRkFfQXR0cmlidXRlOjpNYXhFbnRyaWVzfSwKKyAgICB7MHhkNTdjNTEzYyAvKiBkYXRhTGVuZ3RoICovLCBYRkFfQXR0cmlidXRlOjpEYXRhTGVuZ3RofSwKKyAgICB7MHhkNjEyOGQ4ZCAvKiBhY3Rpdml0eSAqLywgWEZBX0F0dHJpYnV0ZTo6QWN0aXZpdHl9LAorICAgIHsweGQ2YTM5OTkwIC8qIGlucHV0ICovLCBYRkFfQXR0cmlidXRlOjpJbnB1dH0sCisgICAgezB4ZDZlMjdmMWQgLyogdmFsdWUgKi8sIFhGQV9BdHRyaWJ1dGU6OlZhbHVlfSwKKyAgICB7MHhkNzA3OThjMiAvKiBibGFua09yTm90QmxhbmsgKi8sIFhGQV9BdHRyaWJ1dGU6OkJsYW5rT3JOb3RCbGFua30sCisgICAgezB4ZDg2MWY4YWYgLyogYWRkUmV2b2NhdGlvbkluZm8gKi8sIFhGQV9BdHRyaWJ1dGU6OkFkZFJldm9jYXRpb25JbmZvfSwKKyAgICB7MHhkOGY5ODJiZiAvKiBnZW5lcmljRmFtaWx5ICovLCBYRkFfQXR0cmlidXRlOjpHZW5lcmljRmFtaWx5fSwKKyAgICB7MHhkOTk2ZmE5YiAvKiBoYW5kICovLCBYRkFfQXR0cmlidXRlOjpIYW5kfSwKKyAgICB7MHhkYjU1ZmVjNSAvKiBocmVmICovLCBYRkFfQXR0cmlidXRlOjpIcmVmfSwKKyAgICB7MHhkYzc1Njc2YyAvKiB0ZXh0RW5jb2RpbmcgKi8sIFhGQV9BdHRyaWJ1dGU6OlRleHRFbmNvZGluZ30sCisgICAgezB4ZGU3ZjkyYmEgLyogbGVhZERpZ2l0cyAqLywgWEZBX0F0dHJpYnV0ZTo6TGVhZERpZ2l0c30sCisgICAgezB4ZTExYTJjYmMgLyogcGVybWlzc2lvbnMgKi8sIFhGQV9BdHRyaWJ1dGU6OlBlcm1pc3Npb25zfSwKKyAgICB7MHhlMThiNTY1OSAvKiBzcGFjZUFib3ZlICovLCBYRkFfQXR0cmlidXRlOjpTcGFjZUFib3ZlfSwKKyAgICB7MHhlMWEyNmI1NiAvKiBjb2RlQmFzZSAqLywgWEZBX0F0dHJpYnV0ZTo6Q29kZUJhc2V9LAorICAgIHsweGUzNDlkMDQ0IC8qIHN0b2NrICovLCBYRkFfQXR0cmlidXRlOjpTdG9ja30sCisgICAgezB4ZTM3MmFlOTcgLyogaXNOdWxsICovLCBYRkFfQXR0cmlidXRlOjpJc051bGx9LAorICAgIHsweGU0YzNhNWU1IC8qIHJlc3RvcmVTdGF0ZSAqLywgWEZBX0F0dHJpYnV0ZTo6UmVzdG9yZVN0YXRlfSwKKyAgICB7MHhlNWM5NmQ2YSAvKiBleGNsdWRlQWxsQ2FwcyAqLywgWEZBX0F0dHJpYnV0ZTo6RXhjbHVkZUFsbENhcHN9LAorICAgIHsweGU2NGIxMTI5IC8qIGZvcm1hdFRlc3QgKi8sIFhGQV9BdHRyaWJ1dGU6OkZvcm1hdFRlc3R9LAorICAgIHsweGU2Zjk5NDg3IC8qIGhTY3JvbGxQb2xpY3kgKi8sIFhGQV9BdHRyaWJ1dGU6OkhTY3JvbGxQb2xpY3l9LAorICAgIHsweGU4ZGRkZjUwIC8qIGpvaW4gKi8sIFhGQV9BdHRyaWJ1dGU6OkpvaW59LAorICAgIHsweGU4ZjExOGE4IC8qIGtleUNlcnRTaWduICovLCBYRkFfQXR0cmlidXRlOjpLZXlDZXJ0U2lnbn0sCisgICAgezB4ZTk0OGI5YTggLyogcmFkaXVzICovLCBYRkFfQXR0cmlidXRlOjpSYWRpdXN9LAorICAgIHsweGU5OTZiMmZlIC8qIHNvdXJjZUFib3ZlICovLCBYRkFfQXR0cmlidXRlOjpTb3VyY2VBYm92ZX0sCisgICAgezB4ZWE3MDkwYTAgLyogb3ZlcnJpZGUgKi8sIFhGQV9BdHRyaWJ1dGU6Ok92ZXJyaWRlfSwKKyAgICB7MHhlYjA5MTAwMyAvKiBjbGFzc0lkICovLCBYRkFfQXR0cmlidXRlOjpDbGFzc0lkfSwKKyAgICB7MHhlYjUxMWI1NCAvKiBkaXNhYmxlICovLCBYRkFfQXR0cmlidXRlOjpEaXNhYmxlfSwKKyAgICB7MHhlZGE5MDE3YSAvKiBzY29wZSAqLywgWEZBX0F0dHJpYnV0ZTo6U2NvcGV9LAorICAgIHsweGYxOTc4NDRkIC8qIG1hdGNoICovLCBYRkFfQXR0cmlidXRlOjpNYXRjaH0sCisgICAgezB4ZjIwMDkzMzkgLyogcGxhY2VtZW50ICovLCBYRkFfQXR0cmlidXRlOjpQbGFjZW1lbnR9LAorICAgIHsweGY0ZmZjZTczIC8qIGJlZm9yZSAqLywgWEZBX0F0dHJpYnV0ZTo6QmVmb3JlfSwKKyAgICB7MHhmNTMxYjA1OSAvKiB3cml0aW5nU2NyaXB0ICovLCBYRkFfQXR0cmlidXRlOjpXcml0aW5nU2NyaXB0fSwKKyAgICB7MHhmNTc1Y2E3NSAvKiBlbmRDaGFyICovLCBYRkFfQXR0cmlidXRlOjpFbmRDaGFyfSwKKyAgICB7MHhmNmI0Nzc0OSAvKiBsb2NrICovLCBYRkFfQXR0cmlidXRlOjpMb2NrfSwKKyAgICB7MHhmNmI0YWZiMCAvKiBsb25nICovLCBYRkFfQXR0cmlidXRlOjpMb25nfSwKKyAgICB7MHhmNmI1OTU0MyAvKiBpbnRhY3QgKi8sIFhGQV9BdHRyaWJ1dGU6OkludGFjdH0sCisgICAgezB4Zjg4OWU3NDcgLyogeGRwQ29udGVudCAqLywgWEZBX0F0dHJpYnV0ZTo6WGRwQ29udGVudH0sCisgICAgezB4ZmVhNTNlYzYgLyogZGVjaXBoZXJPbmx5ICovLCBYRkFfQXR0cmlidXRlOjpEZWNpcGhlck9ubHl9LAorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworWEZBX0VsZW1lbnQgQ1hGQV9Ob2RlOjpOYW1lVG9FbGVtZW50KGNvbnN0IFdpZGVTdHJpbmcmIG5hbWUpIHsKKyAgdWludDMyX3QgaGFzaCA9IEZYX0hhc2hDb2RlX0dldFcobmFtZS5Bc1N0cmluZ1ZpZXcoKSwgZmFsc2UpOworICBhdXRvKiBlbGVtID0gc3RkOjpsb3dlcl9ib3VuZCgKKyAgICAgIHN0ZDo6YmVnaW4oRWxlbWVudE5hbWVUb0VudW0pLCBzdGQ6OmVuZChFbGVtZW50TmFtZVRvRW51bSksIGhhc2gsCisgICAgICBbXShjb25zdCBFbGVtZW50TmFtZUluZm8mIGEsIHVpbnQzMl90IGhhc2gpIHsgcmV0dXJuIGEuaGFzaCA8IGhhc2g7IH0pOworICBpZiAoZWxlbSAhPSBzdGQ6OmVuZChFbGVtZW50TmFtZVRvRW51bSkgJiYgZWxlbS0+aGFzaCA9PSBoYXNoKQorICAgIHJldHVybiBlbGVtLT5lbGVtZW50OworICByZXR1cm4gWEZBX0VsZW1lbnQ6OlVua25vd247Cit9CisKKy8vIHN0YXRpYworWEZBX0F0dHJpYnV0ZSBDWEZBX05vZGU6Ok5hbWVUb0F0dHJpYnV0ZShjb25zdCBXaWRlU3RyaW5nVmlldyYgbmFtZSkgeworICB1aW50MzJfdCBoYXNoID0gRlhfSGFzaENvZGVfR2V0VyhuYW1lLCBmYWxzZSk7CisgIGF1dG8qIGVsZW0gPSBzdGQ6Omxvd2VyX2JvdW5kKAorICAgICAgc3RkOjpiZWdpbihBdHRyaWJ1dGVOYW1lSW5mb1RvRW51bSksIHN0ZDo6ZW5kKEF0dHJpYnV0ZU5hbWVJbmZvVG9FbnVtKSwKKyAgICAgIGhhc2gsCisgICAgICBbXShjb25zdCBBdHRyaWJ1dGVOYW1lSW5mbyYgYSwgdWludDMyX3QgaGFzaCkgeyByZXR1cm4gYS5oYXNoIDwgaGFzaDsgfSk7CisgIGlmIChlbGVtICE9IHN0ZDo6ZW5kKEF0dHJpYnV0ZU5hbWVJbmZvVG9FbnVtKSAmJiBlbGVtLT5oYXNoID09IGhhc2gpCisgICAgcmV0dXJuIGVsZW0tPmF0dHJpYnV0ZTsKKyAgcmV0dXJuIFhGQV9BdHRyaWJ1dGU6OlVua25vd247Cit9CisKKy8vIHN0YXRpYworc3RkOjp1bmlxdWVfcHRyPENYRkFfTm9kZT4gQ1hGQV9Ob2RlOjpDcmVhdGUoQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQgZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkgeworICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9Ob2RlPiBub2RlOworICBzd2l0Y2ggKGVsZW1lbnQpIHsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQczoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Qcz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VG86CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfVG8+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlVpOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1VpPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpSZWNvcmRTZXQ6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfUmVjb3JkU2V0Pihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTdWJzZXRCZWxvdzoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9TdWJzZXRCZWxvdz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U3ViZm9ybVNldDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9TdWJmb3JtU2V0Pihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpBZG9iZUV4dGVuc2lvbkxldmVsOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0Fkb2JlRXh0ZW5zaW9uTGV2ZWw+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlR5cGVmYWNlOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1R5cGVmYWNlPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpCcmVhazoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9CcmVhaz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Rm9udEluZm86CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRm9udEluZm8+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok51bWJlclBhdHRlcm46CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfTnVtYmVyUGF0dGVybj4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RHluYW1pY1JlbmRlcjoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9EeW5hbWljUmVuZGVyPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQcmludFNjYWxpbmc6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfUHJpbnRTY2FsaW5nPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDaGVja0J1dHRvbjoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9DaGVja0J1dHRvbj4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RGF0ZVBhdHRlcm5zOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0RhdGVQYXR0ZXJucz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U291cmNlU2V0OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1NvdXJjZVNldD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QW1kOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0FtZD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QXJjOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0FyYz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RGF5OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0RheT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RXJhOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0VyYT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Sm9nOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0pvZz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TG9nOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0xvZz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TWFwOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX01hcD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TWRwOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX01kcD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QnJlYWtCZWZvcmU6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfQnJlYWtCZWZvcmU+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok9pZDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9PaWQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBjbDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9QY2w+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBkZjoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9QZGY+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlJlZjoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9SZWY+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlVyaToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Vcmk+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlhkYzoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9YZGM+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlhkcDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9YZHA+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlhmYToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9YZmE+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlhzbDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Yc2w+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlpwbDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9acGw+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNhY2hlOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0NhY2hlPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpNYXJnaW46CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfTWFyZ2luPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpLZXlVc2FnZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9LZXlVc2FnZT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RXhjbHVkZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9FeGNsdWRlPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDaG9pY2VMaXN0OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0Nob2ljZUxpc3Q+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkxldmVsOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0xldmVsPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpMYWJlbFByaW50ZXI6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfTGFiZWxQcmludGVyPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDYWxlbmRhclN5bWJvbHM6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfQ2FsZW5kYXJTeW1ib2xzPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQYXJhOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1BhcmE+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBhcnQ6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfUGFydD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UGRmYToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9QZGZhPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpGaWx0ZXI6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRmlsdGVyPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQcmVzZW50OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1ByZXNlbnQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBhZ2luYXRpb246CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfUGFnaW5hdGlvbj4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RW5jb2Rpbmc6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRW5jb2Rpbmc+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkV2ZW50OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0V2ZW50Pihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpXaGl0ZXNwYWNlOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1doaXRlc3BhY2U+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRlZmF1bHRVaToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9EZWZhdWx0VWk+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRhdGFNb2RlbDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9EYXRhTW9kZWw+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJhcmNvZGU6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfQmFyY29kZT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VGltZVBhdHRlcm46CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfVGltZVBhdHRlcm4+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJhdGNoT3V0cHV0OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0JhdGNoT3V0cHV0Pihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpFbmZvcmNlOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0VuZm9yY2U+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkN1cnJlbmN5U3ltYm9sczoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9DdXJyZW5jeVN5bWJvbHM+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkFkZFNpbGVudFByaW50OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0FkZFNpbGVudFByaW50Pihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpSZW5hbWU6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfUmVuYW1lPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpPcGVyYXRpb246CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfT3BlcmF0aW9uPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpUeXBlZmFjZXM6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfVHlwZWZhY2VzPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTdWJqZWN0RE5zOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1N1YmplY3RETnM+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Oklzc3VlcnM6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfSXNzdWVycz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6V3NkbENvbm5lY3Rpb246CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfV3NkbENvbm5lY3Rpb24+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRlYnVnOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0RlYnVnPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpEZWx0YToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9EZWx0YT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RXJhTmFtZXM6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRXJhTmFtZXM+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok1vZGlmeUFubm90czoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Nb2RpZnlBbm5vdHM+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlN0YXJ0Tm9kZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9TdGFydE5vZGU+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJ1dHRvbjoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9CdXR0b24+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkZvcm1hdDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Gb3JtYXQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJvcmRlcjoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Cb3JkZXI+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkFyZWE6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfQXJlYT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6SHlwaGVuYXRpb246CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfSHlwaGVuYXRpb24+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRleHQ6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfVGV4dD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VGltZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9UaW1lPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpUeXBlOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1R5cGU+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok92ZXJwcmludDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9PdmVycHJpbnQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNlcnRpZmljYXRlczoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9DZXJ0aWZpY2F0ZXM+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkVuY3J5cHRpb25NZXRob2RzOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0VuY3J5cHRpb25NZXRob2RzPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTZXRQcm9wZXJ0eToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9TZXRQcm9wZXJ0eT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UHJpbnRlck5hbWU6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfUHJpbnRlck5hbWU+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlN0YXJ0UGFnZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9TdGFydFBhZ2U+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBhZ2VPZmZzZXQ6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfUGFnZU9mZnNldD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RGF0ZVRpbWU6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRGF0ZVRpbWU+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNvbWI6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfQ29tYj4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UGF0dGVybjoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9QYXR0ZXJuPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpJZkVtcHR5OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0lmRW1wdHk+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlN1cHByZXNzQmFubmVyOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1N1cHByZXNzQmFubmVyPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpPdXRwdXRCaW46CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfT3V0cHV0QmluPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpGaWVsZDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GaWVsZD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QWdlbnQ6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfQWdlbnQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok91dHB1dFhTTDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9PdXRwdXRYU0w+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkFkanVzdERhdGE6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfQWRqdXN0RGF0YT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QXV0b1NhdmU6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfQXV0b1NhdmU+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNvbnRlbnRBcmVhOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0NvbnRlbnRBcmVhPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpXc2RsQWRkcmVzczoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Xc2RsQWRkcmVzcz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U29saWQ6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfU29saWQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRhdGVUaW1lU3ltYm9sczoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9EYXRlVGltZVN5bWJvbHM+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkVuY3J5cHRpb25MZXZlbDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9FbmNyeXB0aW9uTGV2ZWw+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkVkZ2U6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRWRnZT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U3RpcHBsZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9TdGlwcGxlPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpBdHRyaWJ1dGVzOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0F0dHJpYnV0ZXM+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlZlcnNpb25Db250cm9sOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1ZlcnNpb25Db250cm9sPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpNZXJpZGllbToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9NZXJpZGllbT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RXhjbEdyb3VwOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0V4Y2xHcm91cD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VG9vbFRpcDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Ub29sVGlwPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDb21wcmVzczoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Db21wcmVzcz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UmVhc29uOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1JlYXNvbj4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RXhlY3V0ZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9FeGVjdXRlPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDb250ZW50Q29weToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Db250ZW50Q29weT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RGF0ZVRpbWVFZGl0OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0RhdGVUaW1lRWRpdD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q29uZmlnOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0NvbmZpZz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6SW1hZ2U6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfSW1hZ2U+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlNoYXJweEhUTUw6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfU2hhcnB4SFRNTD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TnVtYmVyT2ZDb3BpZXM6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfTnVtYmVyT2ZDb3BpZXM+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJlaGF2aW9yT3ZlcnJpZGU6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfQmVoYXZpb3JPdmVycmlkZT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VGltZVN0YW1wOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1RpbWVTdGFtcD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TW9udGg6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfTW9udGg+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlZpZXdlclByZWZlcmVuY2VzOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1ZpZXdlclByZWZlcmVuY2VzPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTY3JpcHRNb2RlbDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9TY3JpcHRNb2RlbD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RGVjaW1hbDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9EZWNpbWFsPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTdWJmb3JtOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1N1YmZvcm0+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlNlbGVjdDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9TZWxlY3Q+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OldpbmRvdzoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9XaW5kb3c+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkxvY2FsZVNldDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Mb2NhbGVTZXQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkhhbmRsZXI6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfSGFuZGxlcj4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UHJlc2VuY2U6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfUHJlc2VuY2U+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlJlY29yZDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9SZWNvcmQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkVtYmVkOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0VtYmVkPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpWZXJzaW9uOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1ZlcnNpb24+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNvbW1hbmQ6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfQ29tbWFuZD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q29waWVzOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0NvcGllcz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U3RhcGxlOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1N0YXBsZT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U3VibWl0Rm9ybWF0OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1N1Ym1pdEZvcm1hdD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Qm9vbGVhbjoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Cb29sZWFuPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpNZXNzYWdlOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX01lc3NhZ2U+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok91dHB1dDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9PdXRwdXQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBzTWFwOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1BzTWFwPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpFeGNsdWRlTlM6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRXhjbHVkZU5TPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpBc3Npc3Q6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfQXNzaXN0Pihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQaWN0dXJlOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1BpY3R1cmU+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRyYXZlcnNhbDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9UcmF2ZXJzYWw+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlNpbGVudFByaW50OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1NpbGVudFByaW50Pihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpXZWJDbGllbnQ6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfV2ViQ2xpZW50Pihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQcm9kdWNlcjoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Qcm9kdWNlcj4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q29ybmVyOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0Nvcm5lcj4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TXNnSWQ6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfTXNnSWQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNvbG9yOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0NvbG9yPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpLZWVwOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0tlZXA+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlF1ZXJ5OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1F1ZXJ5Pihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpJbnNlcnQ6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfSW5zZXJ0Pihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpJbWFnZUVkaXQ6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfSW1hZ2VFZGl0Pihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpWYWxpZGF0ZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9WYWxpZGF0ZT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RGlnZXN0TWV0aG9kczoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9EaWdlc3RNZXRob2RzPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpOdW1iZXJQYXR0ZXJuczoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9OdW1iZXJQYXR0ZXJucz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UGFnZVNldDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9QYWdlU2V0Pihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpJbnRlZ2VyOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0ludGVnZXI+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlNvYXBBZGRyZXNzOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1NvYXBBZGRyZXNzPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpFcXVhdGU6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRXF1YXRlPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpGb3JtRmllbGRGaWxsaW5nOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0Zvcm1GaWVsZEZpbGxpbmc+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBhZ2VSYW5nZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9QYWdlUmFuZ2U+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlVwZGF0ZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9VcGRhdGU+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNvbm5lY3RTdHJpbmc6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfQ29ubmVjdFN0cmluZz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TW9kZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Nb2RlPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpMYXlvdXQ6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfTGF5b3V0Pihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTaGFycHhtbDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9TaGFycHhtbD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6WHNkQ29ubmVjdGlvbjoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Yc2RDb25uZWN0aW9uPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpUcmF2ZXJzZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9UcmF2ZXJzZT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RW5jb2RpbmdzOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0VuY29kaW5ncz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VGVtcGxhdGU6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfVGVtcGxhdGU+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkFjcm9iYXQ6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfQWNyb2JhdD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VmFsaWRhdGlvbk1lc3NhZ2luZzoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9WYWxpZGF0aW9uTWVzc2FnaW5nPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTaWduaW5nOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1NpZ25pbmc+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlNjcmlwdDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9TY3JpcHQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkFkZFZpZXdlclByZWZlcmVuY2VzOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0FkZFZpZXdlclByZWZlcmVuY2VzPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpBbHdheXNFbWJlZDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9BbHdheXNFbWJlZD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UGFzc3dvcmRFZGl0OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1Bhc3N3b3JkRWRpdD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TnVtZXJpY0VkaXQ6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfTnVtZXJpY0VkaXQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkVuY3J5cHRpb25NZXRob2Q6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRW5jcnlwdGlvbk1ldGhvZD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q2hhbmdlOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0NoYW5nZT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UGFnZUFyZWE6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfUGFnZUFyZWE+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlN1Ym1pdFVybDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9TdWJtaXRVcmw+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok9pZHM6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfT2lkcz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U2lnbmF0dXJlOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1NpZ25hdHVyZT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QURCRV9KU0NvbnNvbGU6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfYURCRV9KU0NvbnNvbGU+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNhcHRpb246CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfQ2FwdGlvbj4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UmVsZXZhbnQ6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfUmVsZXZhbnQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkZsaXBMYWJlbDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GbGlwTGFiZWw+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkV4RGF0YToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9FeERhdGE+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRheU5hbWVzOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0RheU5hbWVzPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTb2FwQWN0aW9uOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1NvYXBBY3Rpb24+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRlZmF1bHRUeXBlZmFjZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9EZWZhdWx0VHlwZWZhY2U+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok1hbmlmZXN0OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX01hbmlmZXN0Pihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpPdmVyZmxvdzoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9PdmVyZmxvdz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TGluZWFyOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0xpbmVhcj4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q3VycmVuY3lTeW1ib2w6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfQ3VycmVuY3lTeW1ib2w+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRlbGV0ZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9EZWxldGU+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRpZ2VzdE1ldGhvZDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9EaWdlc3RNZXRob2Q+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Okluc3RhbmNlTWFuYWdlcjoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9JbnN0YW5jZU1hbmFnZXI+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkVxdWF0ZVJhbmdlOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0VxdWF0ZVJhbmdlPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpNZWRpdW06CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfTWVkaXVtPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpUZXh0RWRpdDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9UZXh0RWRpdD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VGVtcGxhdGVDYWNoZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9UZW1wbGF0ZUNhY2hlPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDb21wcmVzc09iamVjdFN0cmVhbToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Db21wcmVzc09iamVjdFN0cmVhbT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RGF0YVZhbHVlOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0RhdGFWYWx1ZT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QWNjZXNzaWJsZUNvbnRlbnQ6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfQWNjZXNzaWJsZUNvbnRlbnQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkluY2x1ZGVYRFBDb250ZW50OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0luY2x1ZGVYRFBDb250ZW50Pihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpYbWxDb25uZWN0aW9uOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1htbENvbm5lY3Rpb24+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1ZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTaWduRGF0YToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9TaWduRGF0YT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UGFja2V0czoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9QYWNrZXRzPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpEYXRlUGF0dGVybjoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9EYXRlUGF0dGVybj4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RHVwbGV4T3B0aW9uOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0R1cGxleE9wdGlvbj4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QmFzZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9CYXNlPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpCaW5kOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0JpbmQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNvbXByZXNzaW9uOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0NvbXByZXNzaW9uPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpVc2VyOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1VzZXI+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlJlY3RhbmdsZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9SZWN0YW5nbGU+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkVmZmVjdGl2ZU91dHB1dFBvbGljeToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9FZmZlY3RpdmVPdXRwdXRQb2xpY3k+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkFEQkVfSlNEZWJ1Z2dlcjoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9hREJFX0pTRGVidWdnZXI+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkFjcm9iYXQ3OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0Fjcm9iYXQ3Pihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpJbnRlcmFjdGl2ZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9JbnRlcmFjdGl2ZT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TG9jYWxlOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0xvY2FsZT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q3VycmVudFBhZ2U6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfQ3VycmVudFBhZ2U+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRhdGE6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRGF0YT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RGF0ZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9EYXRlPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpEZXNjOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0Rlc2M+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkVuY3J5cHQ6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRW5jcnlwdD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RHJhdzoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9EcmF3Pihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpFbmNyeXB0aW9uOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0VuY3J5cHRpb24+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok1lcmlkaWVtTmFtZXM6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfTWVyaWRpZW1OYW1lcz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TWVzc2FnaW5nOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX01lc3NhZ2luZz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U3BlYWs6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfU3BlYWs+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRhdGFHcm91cDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9EYXRhR3JvdXA+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNvbW1vbjoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Db21tb24+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlNoYXJwdGV4dDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9TaGFycHRleHQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBhZ2luYXRpb25PdmVycmlkZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9QYWdpbmF0aW9uT3ZlcnJpZGU+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlJlYXNvbnM6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfUmVhc29ucz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U2lnbmF0dXJlUHJvcGVydGllczoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9TaWduYXR1cmVQcm9wZXJ0aWVzPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpUaHJlc2hvbGQ6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfVGhyZXNob2xkPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpBcHBlYXJhbmNlRmlsdGVyOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0FwcGVhcmFuY2VGaWx0ZXI+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkZpbGw6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRmlsbD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Rm9udDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Gb250Pihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpGb3JtOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0Zvcm0+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok1lZGl1bUluZm86CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfTWVkaXVtSW5mbz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q2VydGlmaWNhdGU6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfQ2VydGlmaWNhdGU+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBhc3N3b3JkOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1Bhc3N3b3JkPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpSdW5TY3JpcHRzOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1J1blNjcmlwdHM+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRyYWNlOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1RyYWNlPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpGbG9hdDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9GbG9hdD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UmVuZGVyUG9saWN5OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1JlbmRlclBvbGljeT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RGVzdGluYXRpb246CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRGVzdGluYXRpb24+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlZhbHVlOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1ZhbHVlPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpCb29rZW5kOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0Jvb2tlbmQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkV4T2JqZWN0OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0V4T2JqZWN0Pihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpPcGVuQWN0aW9uOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX09wZW5BY3Rpb24+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok5ldmVyRW1iZWQ6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfTmV2ZXJFbWJlZD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QmluZEl0ZW1zOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0JpbmRJdGVtcz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q2FsY3VsYXRlOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0NhbGN1bGF0ZT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UHJpbnQ6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfUHJpbnQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkV4dHJhczoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9FeHRyYXM+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlByb3RvOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1Byb3RvPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpEU2lnRGF0YToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9EU2lnRGF0YT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q3JlYXRvcjoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9DcmVhdG9yPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDb25uZWN0OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0Nvbm5lY3Q+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBlcm1pc3Npb25zOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1Blcm1pc3Npb25zPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDb25uZWN0aW9uU2V0OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0Nvbm5lY3Rpb25TZXQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlN1Ym1pdDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9TdWJtaXQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlJhbmdlOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1JhbmdlPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpMaW5lYXJpemVkOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0xpbmVhcml6ZWQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBhY2tldDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9QYWNrZXQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlJvb3RFbGVtZW50OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1Jvb3RFbGVtZW50Pihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQbGFpbnRleHRNZXRhZGF0YToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9QbGFpbnRleHRNZXRhZGF0YT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TnVtYmVyU3ltYm9sczoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9OdW1iZXJTeW1ib2xzPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQcmludEhpZ2hRdWFsaXR5OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1ByaW50SGlnaFF1YWxpdHk+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRyaXZlcjoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Ecml2ZXI+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkluY3JlbWVudGFsTG9hZDoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9JbmNyZW1lbnRhbExvYWQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlN1YmplY3RETjoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9TdWJqZWN0RE4+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNvbXByZXNzTG9naWNhbFN0cnVjdHVyZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Db21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmU+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkluY3JlbWVudGFsTWVyZ2U6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfSW5jcmVtZW50YWxNZXJnZT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UmFkaWFsOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1JhZGlhbD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VmFyaWFibGVzOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1ZhcmlhYmxlcz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VGltZVBhdHRlcm5zOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1RpbWVQYXR0ZXJucz4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RWZmZWN0aXZlSW5wdXRQb2xpY3k6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRWZmZWN0aXZlSW5wdXRQb2xpY3k+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok5hbWVBdHRyOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX05hbWVBdHRyPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDb25mb3JtYW5jZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Db25mb3JtYW5jZT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VHJhbnNmb3JtOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1RyYW5zZm9ybT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TG9ja0RvY3VtZW50OgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0xvY2tEb2N1bWVudD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QnJlYWtBZnRlcjoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9CcmVha0FmdGVyPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpMaW5lOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0xpbmU+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlNvdXJjZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Tb3VyY2U+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok9jY3VyOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX09jY3VyPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQaWNrVHJheUJ5UERGU2l6ZToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9QaWNrVHJheUJ5UERGU2l6ZT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TW9udGhOYW1lczoKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9Nb250aE5hbWVzPihkb2MsIHBhY2tldCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTZXZlcml0eToKKyAgICAgIG5vZGUgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9TZXZlcml0eT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6R3JvdXBQYXJlbnQ6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfR3JvdXBQYXJlbnQ+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRvY3VtZW50QXNzZW1ibHk6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfRG9jdW1lbnRBc3NlbWJseT4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TnVtYmVyU3ltYm9sOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX051bWJlclN5bWJvbD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VGFnZ2VkOgorICAgICAgbm9kZSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1RhZ2dlZD4oZG9jLCBwYWNrZXQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6SXRlbXM6CisgICAgICBub2RlID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfSXRlbXM+KGRvYywgcGFja2V0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAoIW5vZGUgfHwgIW5vZGUtPklzVmFsaWRJblBhY2tldChwYWNrZXQpKQorICAgIHJldHVybiBudWxscHRyOworICByZXR1cm4gbm9kZTsKK30KKworLy8gc3RhdGljCitXaWRlU3RyaW5nIENYRkFfTm9kZTo6QXR0cmlidXRlVG9OYW1lKFhGQV9BdHRyaWJ1dGUgYXR0cikgeworICBzd2l0Y2ggKGF0dHIpIHsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6Okg6CisgICAgICByZXR1cm4gTCJoIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6Olc6CisgICAgICByZXR1cm4gTCJ3IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6Olg6CisgICAgICByZXR1cm4gTCJ4IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6Olk6CisgICAgICByZXR1cm4gTCJ5IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OklkOgorICAgICAgcmV0dXJuIEwiaWQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6VG86CisgICAgICByZXR1cm4gTCJ0byI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpMaW5lVGhyb3VnaDoKKyAgICAgIHJldHVybiBMImxpbmVUaHJvdWdoIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkhBbGlnbjoKKyAgICAgIHJldHVybiBMImhBbGlnbiI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpUeXBlZmFjZToKKyAgICAgIHJldHVybiBMInR5cGVmYWNlIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkJlZm9yZVRhcmdldDoKKyAgICAgIHJldHVybiBMImJlZm9yZVRhcmdldCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpOYW1lOgorICAgICAgcmV0dXJuIEwibmFtZSI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpOZXh0OgorICAgICAgcmV0dXJuIEwibmV4dCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpEYXRhUm93Q291bnQ6CisgICAgICByZXR1cm4gTCJkYXRhUm93Q291bnQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6QnJlYWs6CisgICAgICByZXR1cm4gTCJicmVhayI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpWU2Nyb2xsUG9saWN5OgorICAgICAgcmV0dXJuIEwidlNjcm9sbFBvbGljeSI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpGb250SG9yaXpvbnRhbFNjYWxlOgorICAgICAgcmV0dXJuIEwiZm9udEhvcml6b250YWxTY2FsZSI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpUZXh0SW5kZW50OgorICAgICAgcmV0dXJuIEwidGV4dEluZGVudCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpDb250ZXh0OgorICAgICAgcmV0dXJuIEwiY29udGV4dCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpUcmF5T3V0OgorICAgICAgcmV0dXJuIEwidHJheU91dCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpDYXA6CisgICAgICByZXR1cm4gTCJjYXAiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6TWF4OgorICAgICAgcmV0dXJuIEwibWF4IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6Ok1pbjoKKyAgICAgIHJldHVybiBMIm1pbiI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpSZWY6CisgICAgICByZXR1cm4gTCJyZWYiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6UmlkOgorICAgICAgcmV0dXJuIEwicmlkIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlVybDoKKyAgICAgIHJldHVybiBMInVybCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpVc2U6CisgICAgICByZXR1cm4gTCJ1c2UiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6TGVmdEluc2V0OgorICAgICAgcmV0dXJuIEwibGVmdEluc2V0IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OldpZG93czoKKyAgICAgIHJldHVybiBMIndpZG93cyI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpMZXZlbDoKKyAgICAgIHJldHVybiBMImxldmVsIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkJvdHRvbUluc2V0OgorICAgICAgcmV0dXJuIEwiYm90dG9tSW5zZXQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6T3ZlcmZsb3dUYXJnZXQ6CisgICAgICByZXR1cm4gTCJvdmVyZmxvd1RhcmdldCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpBbGxvd01hY3JvOgorICAgICAgcmV0dXJuIEwiYWxsb3dNYWNybyI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpQYWdlUG9zaXRpb246CisgICAgICByZXR1cm4gTCJwYWdlUG9zaXRpb24iOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6Q29sdW1uV2lkdGhzOgorICAgICAgcmV0dXJuIEwiY29sdW1uV2lkdGhzIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6Ok92ZXJmbG93TGVhZGVyOgorICAgICAgcmV0dXJuIEwib3ZlcmZsb3dMZWFkZXIiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6QWN0aW9uOgorICAgICAgcmV0dXJuIEwiYWN0aW9uIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6Ok5vblJlcHVkaWF0aW9uOgorICAgICAgcmV0dXJuIEwibm9uUmVwdWRpYXRpb24iOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6UmF0ZToKKyAgICAgIHJldHVybiBMInJhdGUiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6QWxsb3dSaWNoVGV4dDoKKyAgICAgIHJldHVybiBMImFsbG93UmljaFRleHQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6Um9sZToKKyAgICAgIHJldHVybiBMInJvbGUiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6T3ZlcmZsb3dUcmFpbGVyOgorICAgICAgcmV0dXJuIEwib3ZlcmZsb3dUcmFpbGVyIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6Ok9wZXJhdGlvbjoKKyAgICAgIHJldHVybiBMIm9wZXJhdGlvbiI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpUaW1lb3V0OgorICAgICAgcmV0dXJuIEwidGltZW91dCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpUb3BJbnNldDoKKyAgICAgIHJldHVybiBMInRvcEluc2V0IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkFjY2VzczoKKyAgICAgIHJldHVybiBMImFjY2VzcyI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpDb21tYW5kVHlwZToKKyAgICAgIHJldHVybiBMImNvbW1hbmRUeXBlIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkZvcm1hdDoKKyAgICAgIHJldHVybiBMImZvcm1hdCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpEYXRhUHJlcDoKKyAgICAgIHJldHVybiBMImRhdGFQcmVwIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OldpZGdldERhdGE6CisgICAgICByZXR1cm4gTCJ3aWRnZXREYXRhIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkFiYnI6CisgICAgICByZXR1cm4gTCJhYmJyIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6Ok1hcmdpblJpZ2h0OgorICAgICAgcmV0dXJuIEwibWFyZ2luUmlnaHQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6RGF0YURlc2NyaXB0aW9uOgorICAgICAgcmV0dXJuIEwiZGF0YURlc2NyaXB0aW9uIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkVuY2lwaGVyT25seToKKyAgICAgIHJldHVybiBMImVuY2lwaGVyT25seSI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpLZXJuaW5nTW9kZToKKyAgICAgIHJldHVybiBMImtlcm5pbmdNb2RlIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlJvdGF0ZToKKyAgICAgIHJldHVybiBMInJvdGF0ZSI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpXb3JkQ2hhcmFjdGVyQ291bnQ6CisgICAgICByZXR1cm4gTCJ3b3JkQ2hhcmFjdGVyQ291bnQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6VHlwZToKKyAgICAgIHJldHVybiBMInR5cGUiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6UmVzZXJ2ZToKKyAgICAgIHJldHVybiBMInJlc2VydmUiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6VGV4dExvY2F0aW9uOgorICAgICAgcmV0dXJuIEwidGV4dExvY2F0aW9uIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlByaW9yaXR5OgorICAgICAgcmV0dXJuIEwicHJpb3JpdHkiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6VW5kZXJsaW5lOgorICAgICAgcmV0dXJuIEwidW5kZXJsaW5lIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6Ok1vZHVsZVdpZHRoOgorICAgICAgcmV0dXJuIEwibW9kdWxlV2lkdGgiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6SHlwaGVuYXRlOgorICAgICAgcmV0dXJuIEwiaHlwaGVuYXRlIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6Okxpc3RlbjoKKyAgICAgIHJldHVybiBMImxpc3RlbiI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpEZWxpbWl0ZXI6CisgICAgICByZXR1cm4gTCJkZWxpbWl0ZXIiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6Q29udGVudFR5cGU6CisgICAgICByZXR1cm4gTCJjb250ZW50VHlwZSI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpTdGFydE5ldzoKKyAgICAgIHJldHVybiBMInN0YXJ0TmV3IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkVvZkFjdGlvbjoKKyAgICAgIHJldHVybiBMImVvZkFjdGlvbiI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpBbGxvd05ldXRyYWw6CisgICAgICByZXR1cm4gTCJhbGxvd05ldXRyYWwiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6Q29ubmVjdGlvbjoKKyAgICAgIHJldHVybiBMImNvbm5lY3Rpb24iOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6QmFzZWxpbmVTaGlmdDoKKyAgICAgIHJldHVybiBMImJhc2VsaW5lU2hpZnQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6T3ZlcmxpbmVQZXJpb2Q6CisgICAgICByZXR1cm4gTCJvdmVybGluZVBlcmlvZCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpGcmFjRGlnaXRzOgorICAgICAgcmV0dXJuIEwiZnJhY0RpZ2l0cyI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpPcmllbnRhdGlvbjoKKyAgICAgIHJldHVybiBMIm9yaWVudGF0aW9uIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlRpbWVTdGFtcDoKKyAgICAgIHJldHVybiBMInRpbWVTdGFtcCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpQcmludENoZWNrRGlnaXQ6CisgICAgICByZXR1cm4gTCJwcmludENoZWNrRGlnaXQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6TWFyZ2luTGVmdDoKKyAgICAgIHJldHVybiBMIm1hcmdpbkxlZnQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6U3Ryb2tlOgorICAgICAgcmV0dXJuIEwic3Ryb2tlIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6Ok1vZHVsZUhlaWdodDoKKyAgICAgIHJldHVybiBMIm1vZHVsZUhlaWdodCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpUcmFuc2ZlckVuY29kaW5nOgorICAgICAgcmV0dXJuIEwidHJhbnNmZXJFbmNvZGluZyI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpVc2FnZToKKyAgICAgIHJldHVybiBMInVzYWdlIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlByZXNlbmNlOgorICAgICAgcmV0dXJuIEwicHJlc2VuY2UiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6UmFkaXhPZmZzZXQ6CisgICAgICByZXR1cm4gTCJyYWRpeE9mZnNldCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpQcmVzZXJ2ZToKKyAgICAgIHJldHVybiBMInByZXNlcnZlIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkFsaWFzTm9kZToKKyAgICAgIHJldHVybiBMImFsaWFzTm9kZSI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpNdWx0aUxpbmU6CisgICAgICByZXR1cm4gTCJtdWx0aUxpbmUiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6VmVyc2lvbjoKKyAgICAgIHJldHVybiBMInZlcnNpb24iOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6U3RhcnRDaGFyOgorICAgICAgcmV0dXJuIEwic3RhcnRDaGFyIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlNjcmlwdFRlc3Q6CisgICAgICByZXR1cm4gTCJzY3JpcHRUZXN0IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlN0YXJ0QW5nbGU6CisgICAgICByZXR1cm4gTCJzdGFydEFuZ2xlIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkN1cnNvclR5cGU6CisgICAgICByZXR1cm4gTCJjdXJzb3JUeXBlIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkRpZ2l0YWxTaWduYXR1cmU6CisgICAgICByZXR1cm4gTCJkaWdpdGFsU2lnbmF0dXJlIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkNvZGVUeXBlOgorICAgICAgcmV0dXJuIEwiY29kZVR5cGUiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6T3V0cHV0OgorICAgICAgcmV0dXJuIEwib3V0cHV0IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkJvb2tlbmRUcmFpbGVyOgorICAgICAgcmV0dXJuIEwiYm9va2VuZFRyYWlsZXIiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6SW1hZ2luZ0JCb3g6CisgICAgICByZXR1cm4gTCJpbWFnaW5nQkJveCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpFeGNsdWRlSW5pdGlhbENhcDoKKyAgICAgIHJldHVybiBMImV4Y2x1ZGVJbml0aWFsQ2FwIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkZvcmNlOgorICAgICAgcmV0dXJuIEwiZm9yY2UiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6Q3JsU2lnbjoKKyAgICAgIHJldHVybiBMImNybFNpZ24iOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6UHJldmlvdXM6CisgICAgICByZXR1cm4gTCJwcmV2aW91cyI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpQdXNoQ2hhcmFjdGVyQ291bnQ6CisgICAgICByZXR1cm4gTCJwdXNoQ2hhcmFjdGVyQ291bnQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6TnVsbFRlc3Q6CisgICAgICByZXR1cm4gTCJudWxsVGVzdCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpSdW5BdDoKKyAgICAgIHJldHVybiBMInJ1bkF0IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlNwYWNlQmVsb3c6CisgICAgICByZXR1cm4gTCJzcGFjZUJlbG93IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlN3ZWVwQW5nbGU6CisgICAgICByZXR1cm4gTCJzd2VlcEFuZ2xlIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6Ok51bWJlck9mQ2VsbHM6CisgICAgICByZXR1cm4gTCJudW1iZXJPZkNlbGxzIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkxldHRlclNwYWNpbmc6CisgICAgICByZXR1cm4gTCJsZXR0ZXJTcGFjaW5nIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkxvY2tUeXBlOgorICAgICAgcmV0dXJuIEwibG9ja1R5cGUiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6UGFzc3dvcmRDaGFyOgorICAgICAgcmV0dXJuIEwicGFzc3dvcmRDaGFyIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlZBbGlnbjoKKyAgICAgIHJldHVybiBMInZBbGlnbiI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpTb3VyY2VCZWxvdzoKKyAgICAgIHJldHVybiBMInNvdXJjZUJlbG93IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkludmVydGVkOgorICAgICAgcmV0dXJuIEwiaW52ZXJ0ZWQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6TWFyazoKKyAgICAgIHJldHVybiBMIm1hcmsiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6TWF4SDoKKyAgICAgIHJldHVybiBMIm1heEgiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6TWF4VzoKKyAgICAgIHJldHVybiBMIm1heFciOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6VHJ1bmNhdGU6CisgICAgICByZXR1cm4gTCJ0cnVuY2F0ZSI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpNaW5IOgorICAgICAgcmV0dXJuIEwibWluSCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpNaW5XOgorICAgICAgcmV0dXJuIEwibWluVyI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpJbml0aWFsOgorICAgICAgcmV0dXJuIEwiaW5pdGlhbCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpNb2RlOgorICAgICAgcmV0dXJuIEwibW9kZSI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpMYXlvdXQ6CisgICAgICByZXR1cm4gTCJsYXlvdXQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6U2VydmVyOgorICAgICAgcmV0dXJuIEwic2VydmVyIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkVtYmVkUERGOgorICAgICAgcmV0dXJuIEwiZW1iZWRQREYiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6T2RkT3JFdmVuOgorICAgICAgcmV0dXJuIEwib2RkT3JFdmVuIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlRhYkRlZmF1bHQ6CisgICAgICByZXR1cm4gTCJ0YWJEZWZhdWx0IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkNvbnRhaW5zOgorICAgICAgcmV0dXJuIEwiY29udGFpbnMiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6UmlnaHRJbnNldDoKKyAgICAgIHJldHVybiBMInJpZ2h0SW5zZXQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6TWF4Q2hhcnM6CisgICAgICByZXR1cm4gTCJtYXhDaGFycyI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpPcGVuOgorICAgICAgcmV0dXJuIEwib3BlbiI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpSZWxhdGlvbjoKKyAgICAgIHJldHVybiBMInJlbGF0aW9uIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OldpZGVOYXJyb3dSYXRpbzoKKyAgICAgIHJldHVybiBMIndpZGVOYXJyb3dSYXRpbyI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpSZWxldmFudDoKKyAgICAgIHJldHVybiBMInJlbGV2YW50IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlNpZ25hdHVyZVR5cGU6CisgICAgICByZXR1cm4gTCJzaWduYXR1cmVUeXBlIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkxpbmVUaHJvdWdoUGVyaW9kOgorICAgICAgcmV0dXJuIEwibGluZVRocm91Z2hQZXJpb2QiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6U2hhcGU6CisgICAgICByZXR1cm4gTCJzaGFwZSI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpUYWJTdG9wczoKKyAgICAgIHJldHVybiBMInRhYlN0b3BzIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6Ok91dHB1dEJlbG93OgorICAgICAgcmV0dXJuIEwib3V0cHV0QmVsb3ciOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6U2hvcnQ6CisgICAgICByZXR1cm4gTCJzaG9ydCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpGb250VmVydGljYWxTY2FsZToKKyAgICAgIHJldHVybiBMImZvbnRWZXJ0aWNhbFNjYWxlIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlRoaWNrbmVzczoKKyAgICAgIHJldHVybiBMInRoaWNrbmVzcyI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpDb21taXRPbjoKKyAgICAgIHJldHVybiBMImNvbW1pdE9uIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlJlbWFpbkNoYXJhY3RlckNvdW50OgorICAgICAgcmV0dXJuIEwicmVtYWluQ2hhcmFjdGVyQ291bnQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6S2V5QWdyZWVtZW50OgorICAgICAgcmV0dXJuIEwia2V5QWdyZWVtZW50IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkVycm9yQ29ycmVjdGlvbkxldmVsOgorICAgICAgcmV0dXJuIEwiZXJyb3JDb3JyZWN0aW9uTGV2ZWwiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6VXBzTW9kZToKKyAgICAgIHJldHVybiBMInVwc01vZGUiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6TWVyZ2VNb2RlOgorICAgICAgcmV0dXJuIEwibWVyZ2VNb2RlIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkNpcmN1bGFyOgorICAgICAgcmV0dXJuIEwiY2lyY3VsYXIiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6UHNOYW1lOgorICAgICAgcmV0dXJuIEwicHNOYW1lIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlRyYWlsZXI6CisgICAgICByZXR1cm4gTCJ0cmFpbGVyIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlVuaWNvZGVSYW5nZToKKyAgICAgIHJldHVybiBMInVuaWNvZGVSYW5nZSI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpFeGVjdXRlVHlwZToKKyAgICAgIHJldHVybiBMImV4ZWN1dGVUeXBlIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkR1cGxleEltcG9zaXRpb246CisgICAgICByZXR1cm4gTCJkdXBsZXhJbXBvc2l0aW9uIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlRyYXlJbjoKKyAgICAgIHJldHVybiBMInRyYXlJbiI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpCaW5kaW5nTm9kZToKKyAgICAgIHJldHVybiBMImJpbmRpbmdOb2RlIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkJvZkFjdGlvbjoKKyAgICAgIHJldHVybiBMImJvZkFjdGlvbiI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpTYXZlOgorICAgICAgcmV0dXJuIEwic2F2ZSI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpUYXJnZXRUeXBlOgorICAgICAgcmV0dXJuIEwidGFyZ2V0VHlwZSI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpLZXlFbmNpcGhlcm1lbnQ6CisgICAgICByZXR1cm4gTCJrZXlFbmNpcGhlcm1lbnQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6Q3JlZGVudGlhbFNlcnZlclBvbGljeToKKyAgICAgIHJldHVybiBMImNyZWRlbnRpYWxTZXJ2ZXJQb2xpY3kiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6U2l6ZToKKyAgICAgIHJldHVybiBMInNpemUiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6SW5pdGlhbE51bWJlcjoKKyAgICAgIHJldHVybiBMImluaXRpYWxOdW1iZXIiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6U2xvcGU6CisgICAgICByZXR1cm4gTCJzbG9wZSI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpDU3BhY2U6CisgICAgICByZXR1cm4gTCJjU3BhY2UiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6Q29sU3BhbjoKKyAgICAgIHJldHVybiBMImNvbFNwYW4iOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6QmluZGluZzoKKyAgICAgIHJldHVybiBMImJpbmRpbmciOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6Q2hlY2tzdW06CisgICAgICByZXR1cm4gTCJjaGVja3N1bSI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpDaGFyRW5jb2Rpbmc6CisgICAgICByZXR1cm4gTCJjaGFyRW5jb2RpbmciOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6QmluZDoKKyAgICAgIHJldHVybiBMImJpbmQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6VGV4dEVudHJ5OgorICAgICAgcmV0dXJuIEwidGV4dEVudHJ5IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkFyY2hpdmU6CisgICAgICByZXR1cm4gTCJhcmNoaXZlIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlV1aWQ6CisgICAgICByZXR1cm4gTCJ1dWlkIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlBvc3R1cmU6CisgICAgICByZXR1cm4gTCJwb3N0dXJlIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkFmdGVyOgorICAgICAgcmV0dXJuIEwiYWZ0ZXIiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6T3JwaGFuczoKKyAgICAgIHJldHVybiBMIm9ycGhhbnMiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6UXVhbGlmaWVkTmFtZToKKyAgICAgIHJldHVybiBMInF1YWxpZmllZE5hbWUiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZjoKKyAgICAgIHJldHVybiBMInVzZWhyZWYiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6TG9jYWxlOgorICAgICAgcmV0dXJuIEwibG9jYWxlIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OldlaWdodDoKKyAgICAgIHJldHVybiBMIndlaWdodCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpVbmRlcmxpbmVQZXJpb2Q6CisgICAgICByZXR1cm4gTCJ1bmRlcmxpbmVQZXJpb2QiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6RGF0YToKKyAgICAgIHJldHVybiBMImRhdGEiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6RGVzYzoKKyAgICAgIHJldHVybiBMImRlc2MiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6TnVtYmVyZWQ6CisgICAgICByZXR1cm4gTCJudW1iZXJlZCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpEYXRhQ29sdW1uQ291bnQ6CisgICAgICByZXR1cm4gTCJkYXRhQ29sdW1uQ291bnQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6T3ZlcmxpbmU6CisgICAgICByZXR1cm4gTCJvdmVybGluZSI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpVcmxQb2xpY3k6CisgICAgICByZXR1cm4gTCJ1cmxQb2xpY3kiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6QW5jaG9yVHlwZToKKyAgICAgIHJldHVybiBMImFuY2hvclR5cGUiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6TGFiZWxSZWY6CisgICAgICByZXR1cm4gTCJsYWJlbFJlZiI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpCb29rZW5kTGVhZGVyOgorICAgICAgcmV0dXJuIEwiYm9va2VuZExlYWRlciI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpNYXhMZW5ndGg6CisgICAgICByZXR1cm4gTCJtYXhMZW5ndGgiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6QWNjZXNzS2V5OgorICAgICAgcmV0dXJuIEwiYWNjZXNzS2V5IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkN1cnNvckxvY2F0aW9uOgorICAgICAgcmV0dXJuIEwiY3Vyc29yTG9jYXRpb24iOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6RGVsYXllZE9wZW46CisgICAgICByZXR1cm4gTCJkZWxheWVkT3BlbiI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpUYXJnZXQ6CisgICAgICByZXR1cm4gTCJ0YXJnZXQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6RGF0YUVuY2lwaGVybWVudDoKKyAgICAgIHJldHVybiBMImRhdGFFbmNpcGhlcm1lbnQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6QWZ0ZXJUYXJnZXQ6CisgICAgICByZXR1cm4gTCJhZnRlclRhcmdldCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpMZWFkZXI6CisgICAgICByZXR1cm4gTCJsZWFkZXIiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6UGlja2VyOgorICAgICAgcmV0dXJuIEwicGlja2VyIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkZyb206CisgICAgICByZXR1cm4gTCJmcm9tIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkJhc2VQcm9maWxlOgorICAgICAgcmV0dXJuIEwiYmFzZVByb2ZpbGUiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6QXNwZWN0OgorICAgICAgcmV0dXJuIEwiYXNwZWN0IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlJvd0NvbHVtblJhdGlvOgorICAgICAgcmV0dXJuIEwicm93Q29sdW1uUmF0aW8iOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6TGluZUhlaWdodDoKKyAgICAgIHJldHVybiBMImxpbmVIZWlnaHQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6SGlnaGxpZ2h0OgorICAgICAgcmV0dXJuIEwiaGlnaGxpZ2h0IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlZhbHVlUmVmOgorICAgICAgcmV0dXJuIEwidmFsdWVSZWYiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6TWF4RW50cmllczoKKyAgICAgIHJldHVybiBMIm1heEVudHJpZXMiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6RGF0YUxlbmd0aDoKKyAgICAgIHJldHVybiBMImRhdGFMZW5ndGgiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6QWN0aXZpdHk6CisgICAgICByZXR1cm4gTCJhY3Rpdml0eSI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpJbnB1dDoKKyAgICAgIHJldHVybiBMImlucHV0IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlZhbHVlOgorICAgICAgcmV0dXJuIEwidmFsdWUiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6QmxhbmtPck5vdEJsYW5rOgorICAgICAgcmV0dXJuIEwiYmxhbmtPck5vdEJsYW5rIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkFkZFJldm9jYXRpb25JbmZvOgorICAgICAgcmV0dXJuIEwiYWRkUmV2b2NhdGlvbkluZm8iOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6R2VuZXJpY0ZhbWlseToKKyAgICAgIHJldHVybiBMImdlbmVyaWNGYW1pbHkiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6SGFuZDoKKyAgICAgIHJldHVybiBMImhhbmQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6SHJlZjoKKyAgICAgIHJldHVybiBMImhyZWYiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6VGV4dEVuY29kaW5nOgorICAgICAgcmV0dXJuIEwidGV4dEVuY29kaW5nIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkxlYWREaWdpdHM6CisgICAgICByZXR1cm4gTCJsZWFkRGlnaXRzIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlBlcm1pc3Npb25zOgorICAgICAgcmV0dXJuIEwicGVybWlzc2lvbnMiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6U3BhY2VBYm92ZToKKyAgICAgIHJldHVybiBMInNwYWNlQWJvdmUiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6Q29kZUJhc2U6CisgICAgICByZXR1cm4gTCJjb2RlQmFzZSI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpTdG9jazoKKyAgICAgIHJldHVybiBMInN0b2NrIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OklzTnVsbDoKKyAgICAgIHJldHVybiBMImlzTnVsbCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpSZXN0b3JlU3RhdGU6CisgICAgICByZXR1cm4gTCJyZXN0b3JlU3RhdGUiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6RXhjbHVkZUFsbENhcHM6CisgICAgICByZXR1cm4gTCJleGNsdWRlQWxsQ2FwcyI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpGb3JtYXRUZXN0OgorICAgICAgcmV0dXJuIEwiZm9ybWF0VGVzdCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpIU2Nyb2xsUG9saWN5OgorICAgICAgcmV0dXJuIEwiaFNjcm9sbFBvbGljeSI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpKb2luOgorICAgICAgcmV0dXJuIEwiam9pbiI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpLZXlDZXJ0U2lnbjoKKyAgICAgIHJldHVybiBMImtleUNlcnRTaWduIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlJhZGl1czoKKyAgICAgIHJldHVybiBMInJhZGl1cyI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpTb3VyY2VBYm92ZToKKyAgICAgIHJldHVybiBMInNvdXJjZUFib3ZlIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6Ok92ZXJyaWRlOgorICAgICAgcmV0dXJuIEwib3ZlcnJpZGUiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6Q2xhc3NJZDoKKyAgICAgIHJldHVybiBMImNsYXNzSWQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6RGlzYWJsZToKKyAgICAgIHJldHVybiBMImRpc2FibGUiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6U2NvcGU6CisgICAgICByZXR1cm4gTCJzY29wZSI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpNYXRjaDoKKyAgICAgIHJldHVybiBMIm1hdGNoIjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlBsYWNlbWVudDoKKyAgICAgIHJldHVybiBMInBsYWNlbWVudCI7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlOjpCZWZvcmU6CisgICAgICByZXR1cm4gTCJiZWZvcmUiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6V3JpdGluZ1NjcmlwdDoKKyAgICAgIHJldHVybiBMIndyaXRpbmdTY3JpcHQiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6RW5kQ2hhcjoKKyAgICAgIHJldHVybiBMImVuZENoYXIiOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6TG9jazoKKyAgICAgIHJldHVybiBMImxvY2siOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6TG9uZzoKKyAgICAgIHJldHVybiBMImxvbmciOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZTo6SW50YWN0OgorICAgICAgcmV0dXJuIEwiaW50YWN0IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OlhkcENvbnRlbnQ6CisgICAgICByZXR1cm4gTCJ4ZHBDb250ZW50IjsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGU6OkRlY2lwaGVyT25seToKKyAgICAgIHJldHVybiBMImRlY2lwaGVyT25seSI7CisKKyAgICBkZWZhdWx0OgorICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIEwiIjsKK30KKworI2lmbmRlZiBOREVCVUcKKy8vIHN0YXRpYworV2lkZVN0cmluZyBDWEZBX05vZGU6OkVsZW1lbnRUb05hbWUoWEZBX0VsZW1lbnQgYXR0cikgeworICBzd2l0Y2ggKGF0dHIpIHsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQczoKKyAgICAgIHJldHVybiBMInBzIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpUbzoKKyAgICAgIHJldHVybiBMInRvIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpVaToKKyAgICAgIHJldHVybiBMInVpIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpSZWNvcmRTZXQ6CisgICAgICByZXR1cm4gTCJyZWNvcmRTZXQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlN1YnNldEJlbG93OgorICAgICAgcmV0dXJuIEwic3Vic2V0QmVsb3ciOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlN1YmZvcm1TZXQ6CisgICAgICByZXR1cm4gTCJzdWJmb3JtU2V0IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpBZG9iZUV4dGVuc2lvbkxldmVsOgorICAgICAgcmV0dXJuIEwiYWRvYmVFeHRlbnNpb25MZXZlbCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VHlwZWZhY2U6CisgICAgICByZXR1cm4gTCJ0eXBlZmFjZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QnJlYWs6CisgICAgICByZXR1cm4gTCJicmVhayI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Rm9udEluZm86CisgICAgICByZXR1cm4gTCJmb250SW5mbyI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TnVtYmVyUGF0dGVybjoKKyAgICAgIHJldHVybiBMIm51bWJlclBhdHRlcm4iOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkR5bmFtaWNSZW5kZXI6CisgICAgICByZXR1cm4gTCJkeW5hbWljUmVuZGVyIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQcmludFNjYWxpbmc6CisgICAgICByZXR1cm4gTCJwcmludFNjYWxpbmciOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNoZWNrQnV0dG9uOgorICAgICAgcmV0dXJuIEwiY2hlY2tCdXR0b24iOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRhdGVQYXR0ZXJuczoKKyAgICAgIHJldHVybiBMImRhdGVQYXR0ZXJucyI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U291cmNlU2V0OgorICAgICAgcmV0dXJuIEwic291cmNlU2V0IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpBbWQ6CisgICAgICByZXR1cm4gTCJhbWQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkFyYzoKKyAgICAgIHJldHVybiBMImFyYyI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RGF5OgorICAgICAgcmV0dXJuIEwiZGF5IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpFcmE6CisgICAgICByZXR1cm4gTCJlcmEiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkpvZzoKKyAgICAgIHJldHVybiBMImpvZyI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TG9nOgorICAgICAgcmV0dXJuIEwibG9nIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpNYXA6CisgICAgICByZXR1cm4gTCJtYXAiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok1kcDoKKyAgICAgIHJldHVybiBMIm1kcCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QnJlYWtCZWZvcmU6CisgICAgICByZXR1cm4gTCJicmVha0JlZm9yZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6T2lkOgorICAgICAgcmV0dXJuIEwib2lkIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQY2w6CisgICAgICByZXR1cm4gTCJwY2wiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBkZjoKKyAgICAgIHJldHVybiBMInBkZiI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UmVmOgorICAgICAgcmV0dXJuIEwicmVmIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpVcmk6CisgICAgICByZXR1cm4gTCJ1cmkiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlhkYzoKKyAgICAgIHJldHVybiBMInhkYyI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6WGRwOgorICAgICAgcmV0dXJuIEwieGRwIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpYZmE6CisgICAgICByZXR1cm4gTCJ4ZmEiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlhzbDoKKyAgICAgIHJldHVybiBMInhzbCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6WnBsOgorICAgICAgcmV0dXJuIEwienBsIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDYWNoZToKKyAgICAgIHJldHVybiBMImNhY2hlIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpNYXJnaW46CisgICAgICByZXR1cm4gTCJtYXJnaW4iOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OktleVVzYWdlOgorICAgICAgcmV0dXJuIEwia2V5VXNhZ2UiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkV4Y2x1ZGU6CisgICAgICByZXR1cm4gTCJleGNsdWRlIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDaG9pY2VMaXN0OgorICAgICAgcmV0dXJuIEwiY2hvaWNlTGlzdCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TGV2ZWw6CisgICAgICByZXR1cm4gTCJsZXZlbCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TGFiZWxQcmludGVyOgorICAgICAgcmV0dXJuIEwibGFiZWxQcmludGVyIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDYWxlbmRhclN5bWJvbHM6CisgICAgICByZXR1cm4gTCJjYWxlbmRhclN5bWJvbHMiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBhcmE6CisgICAgICByZXR1cm4gTCJwYXJhIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQYXJ0OgorICAgICAgcmV0dXJuIEwicGFydCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UGRmYToKKyAgICAgIHJldHVybiBMInBkZmEiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkZpbHRlcjoKKyAgICAgIHJldHVybiBMImZpbHRlciI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UHJlc2VudDoKKyAgICAgIHJldHVybiBMInByZXNlbnQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBhZ2luYXRpb246CisgICAgICByZXR1cm4gTCJwYWdpbmF0aW9uIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpFbmNvZGluZzoKKyAgICAgIHJldHVybiBMImVuY29kaW5nIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpFdmVudDoKKyAgICAgIHJldHVybiBMImV2ZW50IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpXaGl0ZXNwYWNlOgorICAgICAgcmV0dXJuIEwid2hpdGVzcGFjZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RGVmYXVsdFVpOgorICAgICAgcmV0dXJuIEwiZGVmYXVsdFVpIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpEYXRhTW9kZWw6CisgICAgICByZXR1cm4gTCJkYXRhTW9kZWwiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJhcmNvZGU6CisgICAgICByZXR1cm4gTCJiYXJjb2RlIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpUaW1lUGF0dGVybjoKKyAgICAgIHJldHVybiBMInRpbWVQYXR0ZXJuIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpCYXRjaE91dHB1dDoKKyAgICAgIHJldHVybiBMImJhdGNoT3V0cHV0IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpFbmZvcmNlOgorICAgICAgcmV0dXJuIEwiZW5mb3JjZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q3VycmVuY3lTeW1ib2xzOgorICAgICAgcmV0dXJuIEwiY3VycmVuY3lTeW1ib2xzIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpBZGRTaWxlbnRQcmludDoKKyAgICAgIHJldHVybiBMImFkZFNpbGVudFByaW50IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpSZW5hbWU6CisgICAgICByZXR1cm4gTCJyZW5hbWUiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok9wZXJhdGlvbjoKKyAgICAgIHJldHVybiBMIm9wZXJhdGlvbiI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VHlwZWZhY2VzOgorICAgICAgcmV0dXJuIEwidHlwZWZhY2VzIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTdWJqZWN0RE5zOgorICAgICAgcmV0dXJuIEwic3ViamVjdEROcyI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6SXNzdWVyczoKKyAgICAgIHJldHVybiBMImlzc3VlcnMiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OldzZGxDb25uZWN0aW9uOgorICAgICAgcmV0dXJuIEwid3NkbENvbm5lY3Rpb24iOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRlYnVnOgorICAgICAgcmV0dXJuIEwiZGVidWciOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRlbHRhOgorICAgICAgcmV0dXJuIEwiZGVsdGEiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkVyYU5hbWVzOgorICAgICAgcmV0dXJuIEwiZXJhTmFtZXMiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok1vZGlmeUFubm90czoKKyAgICAgIHJldHVybiBMIm1vZGlmeUFubm90cyI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U3RhcnROb2RlOgorICAgICAgcmV0dXJuIEwic3RhcnROb2RlIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpCdXR0b246CisgICAgICByZXR1cm4gTCJidXR0b24iOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkZvcm1hdDoKKyAgICAgIHJldHVybiBMImZvcm1hdCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Qm9yZGVyOgorICAgICAgcmV0dXJuIEwiYm9yZGVyIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpBcmVhOgorICAgICAgcmV0dXJuIEwiYXJlYSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6SHlwaGVuYXRpb246CisgICAgICByZXR1cm4gTCJoeXBoZW5hdGlvbiI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VGV4dDoKKyAgICAgIHJldHVybiBMInRleHQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRpbWU6CisgICAgICByZXR1cm4gTCJ0aW1lIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpUeXBlOgorICAgICAgcmV0dXJuIEwidHlwZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6T3ZlcnByaW50OgorICAgICAgcmV0dXJuIEwib3ZlcnByaW50IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDZXJ0aWZpY2F0ZXM6CisgICAgICByZXR1cm4gTCJjZXJ0aWZpY2F0ZXMiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkVuY3J5cHRpb25NZXRob2RzOgorICAgICAgcmV0dXJuIEwiZW5jcnlwdGlvbk1ldGhvZHMiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlNldFByb3BlcnR5OgorICAgICAgcmV0dXJuIEwic2V0UHJvcGVydHkiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlByaW50ZXJOYW1lOgorICAgICAgcmV0dXJuIEwicHJpbnRlck5hbWUiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlN0YXJ0UGFnZToKKyAgICAgIHJldHVybiBMInN0YXJ0UGFnZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UGFnZU9mZnNldDoKKyAgICAgIHJldHVybiBMInBhZ2VPZmZzZXQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRhdGVUaW1lOgorICAgICAgcmV0dXJuIEwiZGF0ZVRpbWUiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNvbWI6CisgICAgICByZXR1cm4gTCJjb21iIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQYXR0ZXJuOgorICAgICAgcmV0dXJuIEwicGF0dGVybiI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6SWZFbXB0eToKKyAgICAgIHJldHVybiBMImlmRW1wdHkiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlN1cHByZXNzQmFubmVyOgorICAgICAgcmV0dXJuIEwic3VwcHJlc3NCYW5uZXIiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok91dHB1dEJpbjoKKyAgICAgIHJldHVybiBMIm91dHB1dEJpbiI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RmllbGQ6CisgICAgICByZXR1cm4gTCJmaWVsZCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QWdlbnQ6CisgICAgICByZXR1cm4gTCJhZ2VudCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6T3V0cHV0WFNMOgorICAgICAgcmV0dXJuIEwib3V0cHV0WFNMIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpBZGp1c3REYXRhOgorICAgICAgcmV0dXJuIEwiYWRqdXN0RGF0YSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QXV0b1NhdmU6CisgICAgICByZXR1cm4gTCJhdXRvU2F2ZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q29udGVudEFyZWE6CisgICAgICByZXR1cm4gTCJjb250ZW50QXJlYSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6V3NkbEFkZHJlc3M6CisgICAgICByZXR1cm4gTCJ3c2RsQWRkcmVzcyI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U29saWQ6CisgICAgICByZXR1cm4gTCJzb2xpZCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RGF0ZVRpbWVTeW1ib2xzOgorICAgICAgcmV0dXJuIEwiZGF0ZVRpbWVTeW1ib2xzIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpFbmNyeXB0aW9uTGV2ZWw6CisgICAgICByZXR1cm4gTCJlbmNyeXB0aW9uTGV2ZWwiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkVkZ2U6CisgICAgICByZXR1cm4gTCJlZGdlIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTdGlwcGxlOgorICAgICAgcmV0dXJuIEwic3RpcHBsZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QXR0cmlidXRlczoKKyAgICAgIHJldHVybiBMImF0dHJpYnV0ZXMiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlZlcnNpb25Db250cm9sOgorICAgICAgcmV0dXJuIEwidmVyc2lvbkNvbnRyb2wiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok1lcmlkaWVtOgorICAgICAgcmV0dXJuIEwibWVyaWRpZW0iOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkV4Y2xHcm91cDoKKyAgICAgIHJldHVybiBMImV4Y2xHcm91cCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VG9vbFRpcDoKKyAgICAgIHJldHVybiBMInRvb2xUaXAiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNvbXByZXNzOgorICAgICAgcmV0dXJuIEwiY29tcHJlc3MiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlJlYXNvbjoKKyAgICAgIHJldHVybiBMInJlYXNvbiI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RXhlY3V0ZToKKyAgICAgIHJldHVybiBMImV4ZWN1dGUiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNvbnRlbnRDb3B5OgorICAgICAgcmV0dXJuIEwiY29udGVudENvcHkiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRhdGVUaW1lRWRpdDoKKyAgICAgIHJldHVybiBMImRhdGVUaW1lRWRpdCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q29uZmlnOgorICAgICAgcmV0dXJuIEwiY29uZmlnIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpJbWFnZToKKyAgICAgIHJldHVybiBMImltYWdlIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTaGFycHhIVE1MOgorICAgICAgcmV0dXJuIEwiI3hIVE1MIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpOdW1iZXJPZkNvcGllczoKKyAgICAgIHJldHVybiBMIm51bWJlck9mQ29waWVzIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpCZWhhdmlvck92ZXJyaWRlOgorICAgICAgcmV0dXJuIEwiYmVoYXZpb3JPdmVycmlkZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VGltZVN0YW1wOgorICAgICAgcmV0dXJuIEwidGltZVN0YW1wIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpNb250aDoKKyAgICAgIHJldHVybiBMIm1vbnRoIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpWaWV3ZXJQcmVmZXJlbmNlczoKKyAgICAgIHJldHVybiBMInZpZXdlclByZWZlcmVuY2VzIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTY3JpcHRNb2RlbDoKKyAgICAgIHJldHVybiBMInNjcmlwdE1vZGVsIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpEZWNpbWFsOgorICAgICAgcmV0dXJuIEwiZGVjaW1hbCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U3ViZm9ybToKKyAgICAgIHJldHVybiBMInN1YmZvcm0iOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlNlbGVjdDoKKyAgICAgIHJldHVybiBMInNlbGVjdCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6V2luZG93OgorICAgICAgcmV0dXJuIEwid2luZG93IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpMb2NhbGVTZXQ6CisgICAgICByZXR1cm4gTCJsb2NhbGVTZXQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkhhbmRsZXI6CisgICAgICByZXR1cm4gTCJoYW5kbGVyIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQcmVzZW5jZToKKyAgICAgIHJldHVybiBMInByZXNlbmNlIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpSZWNvcmQ6CisgICAgICByZXR1cm4gTCJyZWNvcmQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkVtYmVkOgorICAgICAgcmV0dXJuIEwiZW1iZWQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlZlcnNpb246CisgICAgICByZXR1cm4gTCJ2ZXJzaW9uIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDb21tYW5kOgorICAgICAgcmV0dXJuIEwiY29tbWFuZCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q29waWVzOgorICAgICAgcmV0dXJuIEwiY29waWVzIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTdGFwbGU6CisgICAgICByZXR1cm4gTCJzdGFwbGUiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlN1Ym1pdEZvcm1hdDoKKyAgICAgIHJldHVybiBMInN1Ym1pdEZvcm1hdCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Qm9vbGVhbjoKKyAgICAgIHJldHVybiBMImJvb2xlYW4iOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok1lc3NhZ2U6CisgICAgICByZXR1cm4gTCJtZXNzYWdlIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpPdXRwdXQ6CisgICAgICByZXR1cm4gTCJvdXRwdXQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBzTWFwOgorICAgICAgcmV0dXJuIEwicHNNYXAiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkV4Y2x1ZGVOUzoKKyAgICAgIHJldHVybiBMImV4Y2x1ZGVOUyI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QXNzaXN0OgorICAgICAgcmV0dXJuIEwiYXNzaXN0IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQaWN0dXJlOgorICAgICAgcmV0dXJuIEwicGljdHVyZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VHJhdmVyc2FsOgorICAgICAgcmV0dXJuIEwidHJhdmVyc2FsIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTaWxlbnRQcmludDoKKyAgICAgIHJldHVybiBMInNpbGVudFByaW50IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpXZWJDbGllbnQ6CisgICAgICByZXR1cm4gTCJ3ZWJDbGllbnQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlByb2R1Y2VyOgorICAgICAgcmV0dXJuIEwicHJvZHVjZXIiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNvcm5lcjoKKyAgICAgIHJldHVybiBMImNvcm5lciI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TXNnSWQ6CisgICAgICByZXR1cm4gTCJtc2dJZCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q29sb3I6CisgICAgICByZXR1cm4gTCJjb2xvciI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6S2VlcDoKKyAgICAgIHJldHVybiBMImtlZXAiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlF1ZXJ5OgorICAgICAgcmV0dXJuIEwicXVlcnkiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Okluc2VydDoKKyAgICAgIHJldHVybiBMImluc2VydCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6SW1hZ2VFZGl0OgorICAgICAgcmV0dXJuIEwiaW1hZ2VFZGl0IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpWYWxpZGF0ZToKKyAgICAgIHJldHVybiBMInZhbGlkYXRlIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpEaWdlc3RNZXRob2RzOgorICAgICAgcmV0dXJuIEwiZGlnZXN0TWV0aG9kcyI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TnVtYmVyUGF0dGVybnM6CisgICAgICByZXR1cm4gTCJudW1iZXJQYXR0ZXJucyI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UGFnZVNldDoKKyAgICAgIHJldHVybiBMInBhZ2VTZXQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkludGVnZXI6CisgICAgICByZXR1cm4gTCJpbnRlZ2VyIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTb2FwQWRkcmVzczoKKyAgICAgIHJldHVybiBMInNvYXBBZGRyZXNzIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpFcXVhdGU6CisgICAgICByZXR1cm4gTCJlcXVhdGUiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkZvcm1GaWVsZEZpbGxpbmc6CisgICAgICByZXR1cm4gTCJmb3JtRmllbGRGaWxsaW5nIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQYWdlUmFuZ2U6CisgICAgICByZXR1cm4gTCJwYWdlUmFuZ2UiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlVwZGF0ZToKKyAgICAgIHJldHVybiBMInVwZGF0ZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q29ubmVjdFN0cmluZzoKKyAgICAgIHJldHVybiBMImNvbm5lY3RTdHJpbmciOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok1vZGU6CisgICAgICByZXR1cm4gTCJtb2RlIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpMYXlvdXQ6CisgICAgICByZXR1cm4gTCJsYXlvdXQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlNoYXJweG1sOgorICAgICAgcmV0dXJuIEwiI3htbCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6WHNkQ29ubmVjdGlvbjoKKyAgICAgIHJldHVybiBMInhzZENvbm5lY3Rpb24iOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRyYXZlcnNlOgorICAgICAgcmV0dXJuIEwidHJhdmVyc2UiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkVuY29kaW5nczoKKyAgICAgIHJldHVybiBMImVuY29kaW5ncyI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VGVtcGxhdGU6CisgICAgICByZXR1cm4gTCJ0ZW1wbGF0ZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QWNyb2JhdDoKKyAgICAgIHJldHVybiBMImFjcm9iYXQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlZhbGlkYXRpb25NZXNzYWdpbmc6CisgICAgICByZXR1cm4gTCJ2YWxpZGF0aW9uTWVzc2FnaW5nIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTaWduaW5nOgorICAgICAgcmV0dXJuIEwic2lnbmluZyI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U2NyaXB0OgorICAgICAgcmV0dXJuIEwic2NyaXB0IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpBZGRWaWV3ZXJQcmVmZXJlbmNlczoKKyAgICAgIHJldHVybiBMImFkZFZpZXdlclByZWZlcmVuY2VzIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpBbHdheXNFbWJlZDoKKyAgICAgIHJldHVybiBMImFsd2F5c0VtYmVkIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQYXNzd29yZEVkaXQ6CisgICAgICByZXR1cm4gTCJwYXNzd29yZEVkaXQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok51bWVyaWNFZGl0OgorICAgICAgcmV0dXJuIEwibnVtZXJpY0VkaXQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkVuY3J5cHRpb25NZXRob2Q6CisgICAgICByZXR1cm4gTCJlbmNyeXB0aW9uTWV0aG9kIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDaGFuZ2U6CisgICAgICByZXR1cm4gTCJjaGFuZ2UiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBhZ2VBcmVhOgorICAgICAgcmV0dXJuIEwicGFnZUFyZWEiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlN1Ym1pdFVybDoKKyAgICAgIHJldHVybiBMInN1Ym1pdFVybCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6T2lkczoKKyAgICAgIHJldHVybiBMIm9pZHMiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlNpZ25hdHVyZToKKyAgICAgIHJldHVybiBMInNpZ25hdHVyZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QURCRV9KU0NvbnNvbGU6CisgICAgICByZXR1cm4gTCJBREJFX0pTQ29uc29sZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q2FwdGlvbjoKKyAgICAgIHJldHVybiBMImNhcHRpb24iOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlJlbGV2YW50OgorICAgICAgcmV0dXJuIEwicmVsZXZhbnQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkZsaXBMYWJlbDoKKyAgICAgIHJldHVybiBMImZsaXBMYWJlbCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RXhEYXRhOgorICAgICAgcmV0dXJuIEwiZXhEYXRhIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpEYXlOYW1lczoKKyAgICAgIHJldHVybiBMImRheU5hbWVzIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTb2FwQWN0aW9uOgorICAgICAgcmV0dXJuIEwic29hcEFjdGlvbiI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RGVmYXVsdFR5cGVmYWNlOgorICAgICAgcmV0dXJuIEwiZGVmYXVsdFR5cGVmYWNlIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpNYW5pZmVzdDoKKyAgICAgIHJldHVybiBMIm1hbmlmZXN0IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpPdmVyZmxvdzoKKyAgICAgIHJldHVybiBMIm92ZXJmbG93IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpMaW5lYXI6CisgICAgICByZXR1cm4gTCJsaW5lYXIiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkN1cnJlbmN5U3ltYm9sOgorICAgICAgcmV0dXJuIEwiY3VycmVuY3lTeW1ib2wiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRlbGV0ZToKKyAgICAgIHJldHVybiBMImRlbGV0ZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RGVsdGFzOgorICAgICAgcmV0dXJuIEwiZGVsdGFzIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpEaWdlc3RNZXRob2Q6CisgICAgICByZXR1cm4gTCJkaWdlc3RNZXRob2QiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Okluc3RhbmNlTWFuYWdlcjoKKyAgICAgIHJldHVybiBMImluc3RhbmNlTWFuYWdlciI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RXF1YXRlUmFuZ2U6CisgICAgICByZXR1cm4gTCJlcXVhdGVSYW5nZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TWVkaXVtOgorICAgICAgcmV0dXJuIEwibWVkaXVtIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpUZXh0RWRpdDoKKyAgICAgIHJldHVybiBMInRleHRFZGl0IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpUZW1wbGF0ZUNhY2hlOgorICAgICAgcmV0dXJuIEwidGVtcGxhdGVDYWNoZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q29tcHJlc3NPYmplY3RTdHJlYW06CisgICAgICByZXR1cm4gTCJjb21wcmVzc09iamVjdFN0cmVhbSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RGF0YVZhbHVlOgorICAgICAgcmV0dXJuIEwiZGF0YVZhbHVlIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpBY2Nlc3NpYmxlQ29udGVudDoKKyAgICAgIHJldHVybiBMImFjY2Vzc2libGVDb250ZW50IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpJbmNsdWRlWERQQ29udGVudDoKKyAgICAgIHJldHVybiBMImluY2x1ZGVYRFBDb250ZW50IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpYbWxDb25uZWN0aW9uOgorICAgICAgcmV0dXJuIEwieG1sQ29ubmVjdGlvbiI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXM6CisgICAgICByZXR1cm4gTCJ2YWxpZGF0ZUFwcHJvdmFsU2lnbmF0dXJlcyI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U2lnbkRhdGE6CisgICAgICByZXR1cm4gTCJzaWduRGF0YSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UGFja2V0czoKKyAgICAgIHJldHVybiBMInBhY2tldHMiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRhdGVQYXR0ZXJuOgorICAgICAgcmV0dXJuIEwiZGF0ZVBhdHRlcm4iOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkR1cGxleE9wdGlvbjoKKyAgICAgIHJldHVybiBMImR1cGxleE9wdGlvbiI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QmFzZToKKyAgICAgIHJldHVybiBMImJhc2UiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJpbmQ6CisgICAgICByZXR1cm4gTCJiaW5kIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDb21wcmVzc2lvbjoKKyAgICAgIHJldHVybiBMImNvbXByZXNzaW9uIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpVc2VyOgorICAgICAgcmV0dXJuIEwidXNlciI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UmVjdGFuZ2xlOgorICAgICAgcmV0dXJuIEwicmVjdGFuZ2xlIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpFZmZlY3RpdmVPdXRwdXRQb2xpY3k6CisgICAgICByZXR1cm4gTCJlZmZlY3RpdmVPdXRwdXRQb2xpY3kiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkFEQkVfSlNEZWJ1Z2dlcjoKKyAgICAgIHJldHVybiBMIkFEQkVfSlNEZWJ1Z2dlciI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QWNyb2JhdDc6CisgICAgICByZXR1cm4gTCJhY3JvYmF0NyI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6SW50ZXJhY3RpdmU6CisgICAgICByZXR1cm4gTCJpbnRlcmFjdGl2ZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TG9jYWxlOgorICAgICAgcmV0dXJuIEwibG9jYWxlIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDdXJyZW50UGFnZToKKyAgICAgIHJldHVybiBMImN1cnJlbnRQYWdlIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpEYXRhOgorICAgICAgcmV0dXJuIEwiZGF0YSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RGF0ZToKKyAgICAgIHJldHVybiBMImRhdGUiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRlc2M6CisgICAgICByZXR1cm4gTCJkZXNjIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpFbmNyeXB0OgorICAgICAgcmV0dXJuIEwiZW5jcnlwdCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RHJhdzoKKyAgICAgIHJldHVybiBMImRyYXciOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkVuY3J5cHRpb246CisgICAgICByZXR1cm4gTCJlbmNyeXB0aW9uIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpNZXJpZGllbU5hbWVzOgorICAgICAgcmV0dXJuIEwibWVyaWRpZW1OYW1lcyI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TWVzc2FnaW5nOgorICAgICAgcmV0dXJuIEwibWVzc2FnaW5nIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTcGVhazoKKyAgICAgIHJldHVybiBMInNwZWFrIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpEYXRhR3JvdXA6CisgICAgICByZXR1cm4gTCJkYXRhR3JvdXAiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNvbW1vbjoKKyAgICAgIHJldHVybiBMImNvbW1vbiI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U2hhcnB0ZXh0OgorICAgICAgcmV0dXJuIEwiI3RleHQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlBhZ2luYXRpb25PdmVycmlkZToKKyAgICAgIHJldHVybiBMInBhZ2luYXRpb25PdmVycmlkZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UmVhc29uczoKKyAgICAgIHJldHVybiBMInJlYXNvbnMiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlNpZ25hdHVyZVByb3BlcnRpZXM6CisgICAgICByZXR1cm4gTCJzaWduYXR1cmVQcm9wZXJ0aWVzIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpUaHJlc2hvbGQ6CisgICAgICByZXR1cm4gTCJ0aHJlc2hvbGQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkFwcGVhcmFuY2VGaWx0ZXI6CisgICAgICByZXR1cm4gTCJhcHBlYXJhbmNlRmlsdGVyIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpGaWxsOgorICAgICAgcmV0dXJuIEwiZmlsbCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Rm9udDoKKyAgICAgIHJldHVybiBMImZvbnQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkZvcm06CisgICAgICByZXR1cm4gTCJmb3JtIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpNZWRpdW1JbmZvOgorICAgICAgcmV0dXJuIEwibWVkaXVtSW5mbyI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q2VydGlmaWNhdGU6CisgICAgICByZXR1cm4gTCJjZXJ0aWZpY2F0ZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UGFzc3dvcmQ6CisgICAgICByZXR1cm4gTCJwYXNzd29yZCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UnVuU2NyaXB0czoKKyAgICAgIHJldHVybiBMInJ1blNjcmlwdHMiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRyYWNlOgorICAgICAgcmV0dXJuIEwidHJhY2UiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkZsb2F0OgorICAgICAgcmV0dXJuIEwiZmxvYXQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlJlbmRlclBvbGljeToKKyAgICAgIHJldHVybiBMInJlbmRlclBvbGljeSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RGVzdGluYXRpb246CisgICAgICByZXR1cm4gTCJkZXN0aW5hdGlvbiI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VmFsdWU6CisgICAgICByZXR1cm4gTCJ2YWx1ZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Qm9va2VuZDoKKyAgICAgIHJldHVybiBMImJvb2tlbmQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkV4T2JqZWN0OgorICAgICAgcmV0dXJuIEwiZXhPYmplY3QiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok9wZW5BY3Rpb246CisgICAgICByZXR1cm4gTCJvcGVuQWN0aW9uIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpOZXZlckVtYmVkOgorICAgICAgcmV0dXJuIEwibmV2ZXJFbWJlZCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6QmluZEl0ZW1zOgorICAgICAgcmV0dXJuIEwiYmluZEl0ZW1zIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDYWxjdWxhdGU6CisgICAgICByZXR1cm4gTCJjYWxjdWxhdGUiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlByaW50OgorICAgICAgcmV0dXJuIEwicHJpbnQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkV4dHJhczoKKyAgICAgIHJldHVybiBMImV4dHJhcyI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UHJvdG86CisgICAgICByZXR1cm4gTCJwcm90byI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6RFNpZ0RhdGE6CisgICAgICByZXR1cm4gTCJkU2lnRGF0YSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6Q3JlYXRvcjoKKyAgICAgIHJldHVybiBMImNyZWF0b3IiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNvbm5lY3Q6CisgICAgICByZXR1cm4gTCJjb25uZWN0IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQZXJtaXNzaW9uczoKKyAgICAgIHJldHVybiBMInBlcm1pc3Npb25zIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpDb25uZWN0aW9uU2V0OgorICAgICAgcmV0dXJuIEwiY29ubmVjdGlvblNldCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6U3VibWl0OgorICAgICAgcmV0dXJuIEwic3VibWl0IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpSYW5nZToKKyAgICAgIHJldHVybiBMInJhbmdlIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpMaW5lYXJpemVkOgorICAgICAgcmV0dXJuIEwibGluZWFyaXplZCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UGFja2V0OgorICAgICAgcmV0dXJuIEwicGFja2V0IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpSb290RWxlbWVudDoKKyAgICAgIHJldHVybiBMInJvb3RFbGVtZW50IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpQbGFpbnRleHRNZXRhZGF0YToKKyAgICAgIHJldHVybiBMInBsYWludGV4dE1ldGFkYXRhIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpOdW1iZXJTeW1ib2xzOgorICAgICAgcmV0dXJuIEwibnVtYmVyU3ltYm9scyI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UHJpbnRIaWdoUXVhbGl0eToKKyAgICAgIHJldHVybiBMInByaW50SGlnaFF1YWxpdHkiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRyaXZlcjoKKyAgICAgIHJldHVybiBMImRyaXZlciI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6SW5jcmVtZW50YWxMb2FkOgorICAgICAgcmV0dXJuIEwiaW5jcmVtZW50YWxMb2FkIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpTdWJqZWN0RE46CisgICAgICByZXR1cm4gTCJzdWJqZWN0RE4iOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNvbXByZXNzTG9naWNhbFN0cnVjdHVyZToKKyAgICAgIHJldHVybiBMImNvbXByZXNzTG9naWNhbFN0cnVjdHVyZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6SW5jcmVtZW50YWxNZXJnZToKKyAgICAgIHJldHVybiBMImluY3JlbWVudGFsTWVyZ2UiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlJhZGlhbDoKKyAgICAgIHJldHVybiBMInJhZGlhbCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6VmFyaWFibGVzOgorICAgICAgcmV0dXJuIEwidmFyaWFibGVzIjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpUaW1lUGF0dGVybnM6CisgICAgICByZXR1cm4gTCJ0aW1lUGF0dGVybnMiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkVmZmVjdGl2ZUlucHV0UG9saWN5OgorICAgICAgcmV0dXJuIEwiZWZmZWN0aXZlSW5wdXRQb2xpY3kiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Ok5hbWVBdHRyOgorICAgICAgcmV0dXJuIEwibmFtZUF0dHIiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkNvbmZvcm1hbmNlOgorICAgICAgcmV0dXJuIEwiY29uZm9ybWFuY2UiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRyYW5zZm9ybToKKyAgICAgIHJldHVybiBMInRyYW5zZm9ybSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TG9ja0RvY3VtZW50OgorICAgICAgcmV0dXJuIEwibG9ja0RvY3VtZW50IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpCcmVha0FmdGVyOgorICAgICAgcmV0dXJuIEwiYnJlYWtBZnRlciI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TGluZToKKyAgICAgIHJldHVybiBMImxpbmUiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlNvdXJjZToKKyAgICAgIHJldHVybiBMInNvdXJjZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6T2NjdXI6CisgICAgICByZXR1cm4gTCJvY2N1ciI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6UGlja1RyYXlCeVBERlNpemU6CisgICAgICByZXR1cm4gTCJwaWNrVHJheUJ5UERGU2l6ZSI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6TW9udGhOYW1lczoKKyAgICAgIHJldHVybiBMIm1vbnRoTmFtZXMiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlNldmVyaXR5OgorICAgICAgcmV0dXJuIEwic2V2ZXJpdHkiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6Okdyb3VwUGFyZW50OgorICAgICAgcmV0dXJuIEwiZ3JvdXBQYXJlbnQiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRvY3VtZW50QXNzZW1ibHk6CisgICAgICByZXR1cm4gTCJkb2N1bWVudEFzc2VtYmx5IjsKKyAgICBjYXNlIFhGQV9FbGVtZW50OjpOdW1iZXJTeW1ib2w6CisgICAgICByZXR1cm4gTCJudW1iZXJTeW1ib2wiOworICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRhZ2dlZDoKKyAgICAgIHJldHVybiBMInRhZ2dlZCI7CisgICAgY2FzZSBYRkFfRWxlbWVudDo6SXRlbXM6CisgICAgICByZXR1cm4gTCJpdGVtcyI7CisKKyAgICBkZWZhdWx0OgorICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIEwiIjsKK30KKyNlbmRpZiAgLy8gTkRFQlVHCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlX3VuaXR0ZXN0LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX25vZGVfdW5pdHRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZGVmNWQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlX3VuaXR0ZXN0LmNwcApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5oIgorCitURVNUKENYRkFfTm9kZVRlc3QsIE5hbWVUb0F0dHJpYnV0ZSkgeworICBFWFBFQ1RfRVEoWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgQ1hGQV9Ob2RlOjpOYW1lVG9BdHRyaWJ1dGUoTCIiKSk7CisgIEVYUEVDVF9FUShYRkFfQXR0cmlidXRlOjpVbmtub3duLCBDWEZBX05vZGU6Ok5hbWVUb0F0dHJpYnV0ZShMIm5vbmVzdWNoIikpOworICBFWFBFQ1RfRVEoWEZBX0F0dHJpYnV0ZTo6SCwgQ1hGQV9Ob2RlOjpOYW1lVG9BdHRyaWJ1dGUoTCJoIikpOworICBFWFBFQ1RfRVEoWEZBX0F0dHJpYnV0ZTo6U2hvcnQsIENYRkFfTm9kZTo6TmFtZVRvQXR0cmlidXRlKEwic2hvcnQiKSk7CisgIEVYUEVDVF9FUShYRkFfQXR0cmlidXRlOjpEZWNpcGhlck9ubHksCisgICAgICAgICAgICBDWEZBX05vZGU6Ok5hbWVUb0F0dHJpYnV0ZShMImRlY2lwaGVyT25seSIpKTsKK30KKworVEVTVChDWEZBX05vZGVUZXN0LCBHZXRBdHRyaWJ1dGVFbnVtQnlOYW1lKSB7CisgIEVYUEVDVF9GQUxTRSghIUNYRkFfTm9kZTo6TmFtZVRvQXR0cmlidXRlRW51bShMIiIpKTsKKyAgRVhQRUNUX0ZBTFNFKCEhQ1hGQV9Ob2RlOjpOYW1lVG9BdHRyaWJ1dGVFbnVtKEwibm9uZXN1Y2giKSk7CisgIEVYUEVDVF9FUShYRkFfQXR0cmlidXRlRW51bTo6QXN0ZXJpc2ssICpDWEZBX05vZGU6Ok5hbWVUb0F0dHJpYnV0ZUVudW0oTCIqIikpOworICBFWFBFQ1RfRVEoWEZBX0F0dHJpYnV0ZUVudW06OlZpc2libGUsCisgICAgICAgICAgICAqQ1hGQV9Ob2RlOjpOYW1lVG9BdHRyaWJ1dGVFbnVtKEwidmlzaWJsZSIpKTsKKyAgRVhQRUNUX0VRKFhGQV9BdHRyaWJ1dGVFbnVtOjpMb3dlcmVkLAorICAgICAgICAgICAgKkNYRkFfTm9kZTo6TmFtZVRvQXR0cmlidXRlRW51bShMImxvd2VyZWQiKSk7Cit9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlaGVscGVyLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX25vZGVoZWxwZXIuY3BwCmluZGV4IDIyOTA4OTIuLmVlYTA1NGEgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX25vZGVoZWxwZXIuY3BwCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX25vZGVoZWxwZXIuY3BwCkBAIC02LDExICs2LDEyIEBACiAKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlaGVscGVyLmgiCiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAiZnhqcy9jZnhqc2VfZW5naW5lLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X29iamVjdC5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2NyaXB0Y29udGV4dC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxlbWdyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGVtZ3IuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9yZXNvbHZlbm9kZV9ycy5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfdXRpbHMuaCIKIApAQCAtMTgsMTMzICsxOSwxMTQgQEAKICAgICA6IG1fZUxhc3RDcmVhdGVUeXBlKFhGQV9FbGVtZW50OjpEYXRhVmFsdWUpLAogICAgICAgbV9wQ3JlYXRlUGFyZW50KG51bGxwdHIpLAogICAgICAgbV9pQ3JlYXRlQ291bnQoMCksCi0gICAgICBtX2lDcmVhdGVGbGFnKFhGQV9SRVNPTFZFTk9ERV9SU1RZUEVfQ3JlYXRlTm9kZU9uZSksCisgICAgICBtX2lDcmVhdGVGbGFnKFhGQV9SZXNvbHZlTm9kZV9SU1R5cGVfQ3JlYXRlTm9kZU9uZSksCiAgICAgICBtX2lDdXJBbGxTdGFydCgtMSksCiAgICAgICBtX3BBbGxTdGFydFBhcmVudChudWxscHRyKSB7fQogCiBDWEZBX05vZGVIZWxwZXI6On5DWEZBX05vZGVIZWxwZXIoKSB7fQogCiBDWEZBX05vZGUqIENYRkFfTm9kZUhlbHBlcjo6UmVzb2x2ZU5vZGVzX0dldE9uZUNoaWxkKENYRkFfTm9kZSogcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9XQ0hBUiogcHdzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCogcHdzTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXNDbGFzc05hbWUpIHsKLSAgaWYgKCFwYXJlbnQpIHsKKyAgaWYgKCFwYXJlbnQpCiAgICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgQ1hGQV9Ob2RlQXJyYXkgc2libGluZ3M7Ci0gIHVpbnQzMl90IHVOYW1lSGFzaCA9IEZYX0hhc2hDb2RlX0dldFcoQ0ZYX1dpZGVTdHJpbmdDKHB3c05hbWUpLCBmYWxzZSk7CisKKyAgc3RkOjp2ZWN0b3I8Q1hGQV9Ob2RlKj4gc2libGluZ3M7CisgIHVpbnQzMl90IHVOYW1lSGFzaCA9IEZYX0hhc2hDb2RlX0dldFcoV2lkZVN0cmluZ1ZpZXcocHdzTmFtZSksIGZhbHNlKTsKICAgTm9kZUFjY19UcmF2ZXJzZUFueVNpYmxpbmdzKHBhcmVudCwgdU5hbWVIYXNoLCAmc2libGluZ3MsIGJJc0NsYXNzTmFtZSk7Ci0gIGlmIChzaWJsaW5ncy5HZXRTaXplKCkgPT0gMCkgewotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIHJldHVybiBzaWJsaW5nc1swXTsKKyAgcmV0dXJuICFzaWJsaW5ncy5lbXB0eSgpID8gc2libGluZ3NbMF0gOiBudWxscHRyOwogfQogCiBpbnQzMl90IENYRkFfTm9kZUhlbHBlcjo6Q291bnRTaWJsaW5ncyhDWEZBX05vZGUqIHBOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0xPR0lDX1RZUEUgZUxvZ2ljVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZUFycmF5KiBwU2libGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPiogcFNpYmxpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXNDbGFzc05hbWUpIHsKICAgaWYgKCFwTm9kZSkKICAgICByZXR1cm4gMDsKICAgQ1hGQV9Ob2RlKiBwYXJlbnQgPSBSZXNvbHZlTm9kZXNfR2V0UGFyZW50KHBOb2RlLCBYRkFfTE9HSUNfTm9UcmFuc3BhcmVudCk7CiAgIGlmICghcGFyZW50KQogICAgIHJldHVybiAwOwotICBjb25zdCBYRkFfUFJPUEVSVFkqIHBQcm9wZXJ0eSA9IFhGQV9HZXRQcm9wZXJ0eU9mRWxlbWVudCgKLSAgICAgIHBhcmVudC0+R2V0RWxlbWVudFR5cGUoKSwgcE5vZGUtPkdldEVsZW1lbnRUeXBlKCksIFhGQV9YRFBQQUNLRVRfVU5LTk9XTik7Ci0gIGlmICghcFByb3BlcnR5ICYmIGVMb2dpY1R5cGUgPT0gWEZBX0xPR0lDX1RyYW5zcGFyZW50KSB7CisgIGlmICghcGFyZW50LT5IYXNQcm9wZXJ0eShwTm9kZS0+R2V0RWxlbWVudFR5cGUoKSkgJiYKKyAgICAgIGVMb2dpY1R5cGUgPT0gWEZBX0xPR0lDX1RyYW5zcGFyZW50KSB7CiAgICAgcGFyZW50ID0gUmVzb2x2ZU5vZGVzX0dldFBhcmVudChwTm9kZSwgWEZBX0xPR0lDX1RyYW5zcGFyZW50KTsKLSAgICBpZiAoIXBhcmVudCkgeworICAgIGlmICghcGFyZW50KQogICAgICAgcmV0dXJuIDA7Ci0gICAgfQogICB9CiAgIGlmIChiSXNDbGFzc05hbWUpIHsKICAgICByZXR1cm4gTm9kZUFjY19UcmF2ZXJzZVNpYmxpbmdzKHBhcmVudCwgcE5vZGUtPkdldENsYXNzSGFzaENvZGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTaWJsaW5ncywgZUxvZ2ljVHlwZSwgYklzQ2xhc3NOYW1lKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gTm9kZUFjY19UcmF2ZXJzZVNpYmxpbmdzKHBhcmVudCwgcE5vZGUtPkdldE5hbWVIYXNoKCksIHBTaWJsaW5ncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVMb2dpY1R5cGUsIGJJc0NsYXNzTmFtZSk7CiAgIH0KKyAgcmV0dXJuIE5vZGVBY2NfVHJhdmVyc2VTaWJsaW5ncyhwYXJlbnQsIHBOb2RlLT5HZXROYW1lSGFzaCgpLCBwU2libGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUxvZ2ljVHlwZSwgYklzQ2xhc3NOYW1lKTsKIH0KIAotaW50MzJfdCBDWEZBX05vZGVIZWxwZXI6Ok5vZGVBY2NfVHJhdmVyc2VBbnlTaWJsaW5ncyhDWEZBX05vZGUqIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZE5hbWVIYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSogcFNpYmxpbmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJc0NsYXNzTmFtZSkgewotICBpZiAoIXBhcmVudCB8fCAhcFNpYmxpbmdzKSB7CitpbnQzMl90IENYRkFfTm9kZUhlbHBlcjo6Tm9kZUFjY19UcmF2ZXJzZUFueVNpYmxpbmdzKAorICAgIENYRkFfTm9kZSogcGFyZW50LAorICAgIHVpbnQzMl90IGROYW1lSGFzaCwKKyAgICBzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPiogcFNpYmxpbmdzLAorICAgIGJvb2wgYklzQ2xhc3NOYW1lKSB7CisgIGlmICghcGFyZW50IHx8ICFwU2libGluZ3MpCiAgICAgcmV0dXJuIDA7Ci0gIH0KKwogICBpbnQzMl90IG5Db3VudCA9IDA7Ci0gIGludDMyX3QgaSA9IDA7Ci0gIENYRkFfTm9kZUFycmF5IHByb3BlcnRpZXM7Ci0gIHBhcmVudC0+R2V0Tm9kZUxpc3QocHJvcGVydGllcywgWEZBX05PREVGSUxURVJfUHJvcGVydGllcyk7Ci0gIGludDMyX3QgblByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLkdldFNpemUoKTsKLSAgZm9yIChpID0gMDsgaSA8IG5Qcm9wZXJ0aWVzOyArK2kpIHsKLSAgICBDWEZBX05vZGUqIGNoaWxkID0gcHJvcGVydGllc1tpXTsKKyAgZm9yIChDWEZBX05vZGUqIGNoaWxkIDoKKyAgICAgICBwYXJlbnQtPkdldE5vZGVMaXN0KFhGQV9OT0RFRklMVEVSX1Byb3BlcnRpZXMsIFhGQV9FbGVtZW50OjpVbmtub3duKSkgewogICAgIGlmIChiSXNDbGFzc05hbWUpIHsKICAgICAgIGlmIChjaGlsZC0+R2V0Q2xhc3NIYXNoQ29kZSgpID09IGROYW1lSGFzaCkgewotICAgICAgICBwU2libGluZ3MtPkFkZChjaGlsZCk7CisgICAgICAgIHBTaWJsaW5ncy0+cHVzaF9iYWNrKGNoaWxkKTsKICAgICAgICAgbkNvdW50Kys7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIGlmIChjaGlsZC0+R2V0TmFtZUhhc2goKSA9PSBkTmFtZUhhc2gpIHsKLSAgICAgICAgcFNpYmxpbmdzLT5BZGQoY2hpbGQpOworICAgICAgICBwU2libGluZ3MtPnB1c2hfYmFjayhjaGlsZCk7CiAgICAgICAgIG5Db3VudCsrOwogICAgICAgfQogICAgIH0KLSAgICBpZiAobkNvdW50ID4gMCkgeworICAgIGlmIChuQ291bnQgPiAwKQogICAgICAgcmV0dXJuIG5Db3VudDsKLSAgICB9CisKICAgICBuQ291bnQgKz0KICAgICAgICAgTm9kZUFjY19UcmF2ZXJzZUFueVNpYmxpbmdzKGNoaWxkLCBkTmFtZUhhc2gsIHBTaWJsaW5ncywgYklzQ2xhc3NOYW1lKTsKICAgfQotICBDWEZBX05vZGVBcnJheSBjaGlsZHJlbjsKLSAgcGFyZW50LT5HZXROb2RlTGlzdChjaGlsZHJlbiwgWEZBX05PREVGSUxURVJfQ2hpbGRyZW4pOwotICBpbnQzMl90IG5DaGlsZHJlbiA9IGNoaWxkcmVuLkdldFNpemUoKTsKLSAgZm9yIChpID0gMDsgaSA8IG5DaGlsZHJlbjsgaSsrKSB7Ci0gICAgQ1hGQV9Ob2RlKiBjaGlsZCA9IGNoaWxkcmVuW2ldOworICBmb3IgKENYRkFfTm9kZSogY2hpbGQgOgorICAgICAgIHBhcmVudC0+R2V0Tm9kZUxpc3QoWEZBX05PREVGSUxURVJfQ2hpbGRyZW4sIFhGQV9FbGVtZW50OjpVbmtub3duKSkgewogICAgIGlmIChiSXNDbGFzc05hbWUpIHsKICAgICAgIGlmIChjaGlsZC0+R2V0Q2xhc3NIYXNoQ29kZSgpID09IGROYW1lSGFzaCkgewotICAgICAgICBpZiAocFNpYmxpbmdzKSB7Ci0gICAgICAgICAgcFNpYmxpbmdzLT5BZGQoY2hpbGQpOwotICAgICAgICB9CisgICAgICAgIHBTaWJsaW5ncy0+cHVzaF9iYWNrKGNoaWxkKTsKICAgICAgICAgbkNvdW50Kys7CiAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIGlmIChjaGlsZC0+R2V0TmFtZUhhc2goKSA9PSBkTmFtZUhhc2gpIHsKLSAgICAgICAgaWYgKHBTaWJsaW5ncykgewotICAgICAgICAgIHBTaWJsaW5ncy0+QWRkKGNoaWxkKTsKLSAgICAgICAgfQorICAgICAgICBwU2libGluZ3MtPnB1c2hfYmFjayhjaGlsZCk7CiAgICAgICAgIG5Db3VudCsrOwogICAgICAgfQogICAgIH0KLSAgICBpZiAobkNvdW50ID4gMCkgeworICAgIGlmIChuQ291bnQgPiAwKQogICAgICAgcmV0dXJuIG5Db3VudDsKLSAgICB9CisKICAgICBuQ291bnQgKz0KICAgICAgICAgTm9kZUFjY19UcmF2ZXJzZUFueVNpYmxpbmdzKGNoaWxkLCBkTmFtZUhhc2gsIHBTaWJsaW5ncywgYklzQ2xhc3NOYW1lKTsKICAgfQogICByZXR1cm4gbkNvdW50OwogfQogCi1pbnQzMl90IENYRkFfTm9kZUhlbHBlcjo6Tm9kZUFjY19UcmF2ZXJzZVNpYmxpbmdzKENYRkFfTm9kZSogcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkTmFtZUhhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZUFycmF5KiBwU2libGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MT0dJQ19UWVBFIGVMb2dpY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYklzQ2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJc0ZpbmRQcm9wZXJ0eSkgewotICBpZiAoIXBhcmVudCB8fCAhcFNpYmxpbmdzKSB7CitpbnQzMl90IENYRkFfTm9kZUhlbHBlcjo6Tm9kZUFjY19UcmF2ZXJzZVNpYmxpbmdzKAorICAgIENYRkFfTm9kZSogcGFyZW50LAorICAgIHVpbnQzMl90IGROYW1lSGFzaCwKKyAgICBzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPiogcFNpYmxpbmdzLAorICAgIFhGQV9MT0dJQ19UWVBFIGVMb2dpY1R5cGUsCisgICAgYm9vbCBiSXNDbGFzc05hbWUsCisgICAgYm9vbCBiSXNGaW5kUHJvcGVydHkpIHsKKyAgaWYgKCFwYXJlbnQgfHwgIXBTaWJsaW5ncykKICAgICByZXR1cm4gMDsKLSAgfQorCiAgIGludDMyX3QgbkNvdW50ID0gMDsKLSAgaW50MzJfdCBpID0gMDsKICAgaWYgKGJJc0ZpbmRQcm9wZXJ0eSkgewotICAgIENYRkFfTm9kZUFycmF5IHByb3BlcnRpZXM7Ci0gICAgcGFyZW50LT5HZXROb2RlTGlzdChwcm9wZXJ0aWVzLCBYRkFfTk9ERUZJTFRFUl9Qcm9wZXJ0aWVzKTsKLSAgICBpbnQzMl90IG5Qcm9wZXJ0aWVzID0gcHJvcGVydGllcy5HZXRTaXplKCk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG5Qcm9wZXJ0aWVzOyArK2kpIHsKLSAgICAgIENYRkFfTm9kZSogY2hpbGQgPSBwcm9wZXJ0aWVzW2ldOworICAgIGZvciAoQ1hGQV9Ob2RlKiBjaGlsZCA6CisgICAgICAgICBwYXJlbnQtPkdldE5vZGVMaXN0KFhGQV9OT0RFRklMVEVSX1Byb3BlcnRpZXMsIFhGQV9FbGVtZW50OjpVbmtub3duKSkgewogICAgICAgaWYgKGJJc0NsYXNzTmFtZSkgewogICAgICAgICBpZiAoY2hpbGQtPkdldENsYXNzSGFzaENvZGUoKSA9PSBkTmFtZUhhc2gpIHsKLSAgICAgICAgICBwU2libGluZ3MtPkFkZChjaGlsZCk7CisgICAgICAgICAgcFNpYmxpbmdzLT5wdXNoX2JhY2soY2hpbGQpOwogICAgICAgICAgIG5Db3VudCsrOwogICAgICAgICB9CiAgICAgICB9IGVsc2UgewpAQCAtMTUyLDcgKzEzNCw3IEBACiAgICAgICAgICAgaWYgKGNoaWxkLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpQYWdlU2V0ICYmCiAgICAgICAgICAgICAgIGNoaWxkLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpFeHRyYXMgJiYKICAgICAgICAgICAgICAgY2hpbGQtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6Okl0ZW1zKSB7Ci0gICAgICAgICAgICBwU2libGluZ3MtPkFkZChjaGlsZCk7CisgICAgICAgICAgICBwU2libGluZ3MtPnB1c2hfYmFjayhjaGlsZCk7CiAgICAgICAgICAgICBuQ291bnQrKzsKICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE2MywzNiArMTQ1LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZUxvZ2ljVHlwZSwgYklzQ2xhc3NOYW1lLCBmYWxzZSk7CiAgICAgICB9CiAgICAgfQotICAgIGlmIChuQ291bnQgPiAwKSB7CisgICAgaWYgKG5Db3VudCA+IDApCiAgICAgICByZXR1cm4gbkNvdW50OwotICAgIH0KICAgfQotICBDWEZBX05vZGVBcnJheSBjaGlsZHJlbjsKLSAgcGFyZW50LT5HZXROb2RlTGlzdChjaGlsZHJlbiwgWEZBX05PREVGSUxURVJfQ2hpbGRyZW4pOwotICBpbnQzMl90IG5DaGlsZHJlbiA9IGNoaWxkcmVuLkdldFNpemUoKTsKLSAgZm9yIChpID0gMDsgaSA8IG5DaGlsZHJlbjsgaSsrKSB7Ci0gICAgQ1hGQV9Ob2RlKiBjaGlsZCA9IGNoaWxkcmVuW2ldOwotICAgIGlmIChjaGlsZC0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6VmFyaWFibGVzKSB7CisgIGZvciAoQ1hGQV9Ob2RlKiBjaGlsZCA6CisgICAgICAgcGFyZW50LT5HZXROb2RlTGlzdChYRkFfTk9ERUZJTFRFUl9DaGlsZHJlbiwgWEZBX0VsZW1lbnQ6OlVua25vd24pKSB7CisgICAgaWYgKGNoaWxkLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpWYXJpYWJsZXMpCiAgICAgICBjb250aW51ZTsKLSAgICB9CisKICAgICBpZiAoYklzQ2xhc3NOYW1lKSB7CiAgICAgICBpZiAoY2hpbGQtPkdldENsYXNzSGFzaENvZGUoKSA9PSBkTmFtZUhhc2gpIHsKLSAgICAgICAgaWYgKHBTaWJsaW5ncykgewotICAgICAgICAgIHBTaWJsaW5ncy0+QWRkKGNoaWxkKTsKLSAgICAgICAgfQorICAgICAgICBwU2libGluZ3MtPnB1c2hfYmFjayhjaGlsZCk7CiAgICAgICAgIG5Db3VudCsrOwogICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICBpZiAoY2hpbGQtPkdldE5hbWVIYXNoKCkgPT0gZE5hbWVIYXNoKSB7Ci0gICAgICAgIGlmIChwU2libGluZ3MpIHsKLSAgICAgICAgICBwU2libGluZ3MtPkFkZChjaGlsZCk7Ci0gICAgICAgIH0KKyAgICAgICAgcFNpYmxpbmdzLT5wdXNoX2JhY2soY2hpbGQpOwogICAgICAgICBuQ291bnQrKzsKICAgICAgIH0KICAgICB9Ci0gICAgaWYgKGVMb2dpY1R5cGUgPT0gWEZBX0xPR0lDX05vVHJhbnNwYXJlbnQpIHsKKyAgICBpZiAoZUxvZ2ljVHlwZSA9PSBYRkFfTE9HSUNfTm9UcmFuc3BhcmVudCkKICAgICAgIGNvbnRpbnVlOwotICAgIH0KKwogICAgIGlmIChOb2RlSXNUcmFuc3BhcmVudChjaGlsZCkgJiYKICAgICAgICAgY2hpbGQtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlBhZ2VTZXQpIHsKICAgICAgIG5Db3VudCArPSBOb2RlQWNjX1RyYXZlcnNlU2libGluZ3MoY2hpbGQsIGROYW1lSGFzaCwgcFNpYmxpbmdzLApAQCAtMjA4LDcgKzE4Miw3IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiAgIH0KICAgaWYgKGVMb2dpY1R5cGUgPT0gWEZBX0xPR0lDX05vVHJhbnNwYXJlbnQpIHsKLSAgICByZXR1cm4gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOworICAgIHJldHVybiBwTm9kZS0+R2V0UGFyZW50KCk7CiAgIH0KICAgQ1hGQV9Ob2RlKiBwYXJlbnQ7CiAgIENYRkFfTm9kZSogbm9kZSA9IHBOb2RlOwpAQCAtMjQ1LDcgKzIxOSw3IEBACiAgIGlmIChiSXNDbGFzc0luZGV4KSB7CiAgICAgZHdIYXNoTmFtZSA9IHBOb2RlLT5HZXRDbGFzc0hhc2hDb2RlKCk7CiAgIH0KLSAgQ1hGQV9Ob2RlQXJyYXkgc2libGluZ3M7CisgIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+IHNpYmxpbmdzOwogICBpbnQzMl90IGlTaXplID0gTm9kZUFjY19UcmF2ZXJzZVNpYmxpbmdzKHBhcmVudCwgZHdIYXNoTmFtZSwgJnNpYmxpbmdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVMb2dpY1R5cGUsIGJJc0NsYXNzSW5kZXgpOwogICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2l6ZTsgKytpKSB7CkBAIC0yNTcsMTA4ICsyMzEsOTcgQEAKICAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgQ1hGQV9Ob2RlSGVscGVyOjpHZXROYW1lRXhwcmVzc2lvbihDWEZBX05vZGUqIHJlZk5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJc0FsbFBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0xPR0lDX1RZUEUgZUxvZ2ljVHlwZSkgewotICB3c05hbWUuY2xlYXIoKTsKK1dpZGVTdHJpbmcgQ1hGQV9Ob2RlSGVscGVyOjpHZXROYW1lRXhwcmVzc2lvbihDWEZBX05vZGUqIHJlZk5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXNBbGxQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MT0dJQ19UWVBFIGVMb2dpY1R5cGUpIHsKKyAgV2lkZVN0cmluZyB3c05hbWU7CiAgIGlmIChiSXNBbGxQYXRoKSB7Ci0gICAgR2V0TmFtZUV4cHJlc3Npb24ocmVmTm9kZSwgd3NOYW1lLCBmYWxzZSwgZUxvZ2ljVHlwZSk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NQYXJlbnQ7CisgICAgd3NOYW1lID0gR2V0TmFtZUV4cHJlc3Npb24ocmVmTm9kZSwgZmFsc2UsIGVMb2dpY1R5cGUpOworICAgIFdpZGVTdHJpbmcgd3NQYXJlbnQ7CiAgICAgQ1hGQV9Ob2RlKiBwYXJlbnQgPQogICAgICAgICBSZXNvbHZlTm9kZXNfR2V0UGFyZW50KHJlZk5vZGUsIFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50KTsKICAgICB3aGlsZSAocGFyZW50KSB7Ci0gICAgICBHZXROYW1lRXhwcmVzc2lvbihwYXJlbnQsIHdzUGFyZW50LCBmYWxzZSwgZUxvZ2ljVHlwZSk7CisgICAgICB3c1BhcmVudCA9IEdldE5hbWVFeHByZXNzaW9uKHBhcmVudCwgZmFsc2UsIGVMb2dpY1R5cGUpOwogICAgICAgd3NQYXJlbnQgKz0gTCIuIjsKICAgICAgIHdzUGFyZW50ICs9IHdzTmFtZTsKICAgICAgIHdzTmFtZSA9IHdzUGFyZW50OwogICAgICAgcGFyZW50ID0gUmVzb2x2ZU5vZGVzX0dldFBhcmVudChwYXJlbnQsIFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50KTsKICAgICB9Ci0gICAgcmV0dXJuOworICAgIHJldHVybiB3c05hbWU7CiAgIH0KIAotICBDRlhfV2lkZVN0cmluZyB3czsKKyAgV2lkZVN0cmluZyB3czsKICAgYm9vbCBiSXNQcm9wZXJ0eSA9IE5vZGVJc1Byb3BlcnR5KHJlZk5vZGUpOwogICBpZiAocmVmTm9kZS0+SXNVbm5hbWVkKCkgfHwKICAgICAgIChiSXNQcm9wZXJ0eSAmJiByZWZOb2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpQYWdlU2V0KSkgewogICAgIHdzID0gcmVmTm9kZS0+R2V0Q2xhc3NOYW1lKCk7Ci0gICAgd3NOYW1lLkZvcm1hdChMIiMlc1slZF0iLCB3cy5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgR2V0SW5kZXgocmVmTm9kZSwgZUxvZ2ljVHlwZSwgYklzUHJvcGVydHksIHRydWUpKTsKLSAgICByZXR1cm47CisgICAgcmV0dXJuIFdpZGVTdHJpbmc6OkZvcm1hdChMIiMlbHNbJWRdIiwgd3MuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEluZGV4KHJlZk5vZGUsIGVMb2dpY1R5cGUsIGJJc1Byb3BlcnR5LCB0cnVlKSk7CiAgIH0KLSAgd3MgPSByZWZOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUpOworICB3cyA9IHJlZk5vZGUtPkpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6Ok5hbWUpOwogICB3cy5SZXBsYWNlKEwiLiIsIEwiXFwuIik7Ci0gIHdzTmFtZS5Gb3JtYXQoTCIlc1slZF0iLCB3cy5jX3N0cigpLAotICAgICAgICAgICAgICAgIEdldEluZGV4KHJlZk5vZGUsIGVMb2dpY1R5cGUsIGJJc1Byb3BlcnR5LCBmYWxzZSkpOworICByZXR1cm4gV2lkZVN0cmluZzo6Rm9ybWF0KEwiJWxzWyVkXSIsIHdzLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0SW5kZXgocmVmTm9kZSwgZUxvZ2ljVHlwZSwgYklzUHJvcGVydHksIGZhbHNlKSk7CiB9CiAKIGJvb2wgQ1hGQV9Ob2RlSGVscGVyOjpOb2RlSXNUcmFuc3BhcmVudChDWEZBX05vZGUqIHJlZk5vZGUpIHsKLSAgaWYgKCFyZWZOb2RlKSB7CisgIGlmICghcmVmTm9kZSkKICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KKwogICBYRkFfRWxlbWVudCByZWZOb2RlVHlwZSA9IHJlZk5vZGUtPkdldEVsZW1lbnRUeXBlKCk7Ci0gIGlmICgocmVmTm9kZS0+SXNVbm5hbWVkKCkgJiYgcmVmTm9kZS0+SXNDb250YWluZXJOb2RlKCkpIHx8Ci0gICAgICByZWZOb2RlVHlwZSA9PSBYRkFfRWxlbWVudDo6U3ViZm9ybVNldCB8fAotICAgICAgcmVmTm9kZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OkFyZWEgfHwgcmVmTm9kZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OlByb3RvKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gKHJlZk5vZGUtPklzVW5uYW1lZCgpICYmIHJlZk5vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB8fAorICAgICAgICAgcmVmTm9kZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm1TZXQgfHwKKyAgICAgICAgIHJlZk5vZGVUeXBlID09IFhGQV9FbGVtZW50OjpBcmVhIHx8IHJlZk5vZGVUeXBlID09IFhGQV9FbGVtZW50OjpQcm90bzsKIH0KIAotYm9vbCBDWEZBX05vZGVIZWxwZXI6OkNyZWF0ZU5vZGVfRm9yQ29uZGl0aW9uKENGWF9XaWRlU3RyaW5nJiB3c0NvbmRpdGlvbikgeworYm9vbCBDWEZBX05vZGVIZWxwZXI6OkNyZWF0ZU5vZGVfRm9yQ29uZGl0aW9uKFdpZGVTdHJpbmcmIHdzQ29uZGl0aW9uKSB7CiAgIGludDMyX3QgaUxlbiA9IHdzQ29uZGl0aW9uLkdldExlbmd0aCgpOwotICBDRlhfV2lkZVN0cmluZyB3c0luZGV4KEwiMCIpOworICBXaWRlU3RyaW5nIHdzSW5kZXgoTCIwIik7CiAgIGJvb2wgYkFsbCA9IGZhbHNlOwogICBpZiAoaUxlbiA9PSAwKSB7Ci0gICAgbV9pQ3JlYXRlRmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9SU1RZUEVfQ3JlYXRlTm9kZU9uZTsKKyAgICBtX2lDcmVhdGVGbGFnID0gWEZBX1Jlc29sdmVOb2RlX1JTVHlwZV9DcmVhdGVOb2RlT25lOwogICAgIHJldHVybiBmYWxzZTsKICAgfQotICBpZiAod3NDb25kaXRpb24uR2V0QXQoMCkgPT0gJ1snKSB7Ci0gICAgaW50MzJfdCBpID0gMTsKLSAgICBmb3IgKDsgaSA8IGlMZW47ICsraSkgewotICAgICAgRlhfV0NIQVIgY2ggPSB3c0NvbmRpdGlvbltpXTsKLSAgICAgIGlmIChjaCA9PSAnICcpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoY2ggPT0gJysnIHx8IGNoID09ICctJykgewotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyonKSB7Ci0gICAgICAgIGJBbGwgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoYkFsbCkgewotICAgICAgd3NJbmRleCA9IEwiMSI7Ci0gICAgICBtX2lDcmVhdGVGbGFnID0gWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlQWxsOwotICAgIH0gZWxzZSB7Ci0gICAgICBtX2lDcmVhdGVGbGFnID0gWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlT25lOwotICAgICAgd3NJbmRleCA9IHdzQ29uZGl0aW9uLk1pZChpLCBpTGVuIC0gMSAtIGkpOwotICAgIH0KLSAgICBpbnQzMl90IGlJbmRleCA9IHdzSW5kZXguR2V0SW50ZWdlcigpOwotICAgIG1faUNyZWF0ZUNvdW50ID0gaUluZGV4OwotICAgIHJldHVybiB0cnVlOworICBpZiAod3NDb25kaXRpb25bMF0gIT0gJ1snKQorICAgIHJldHVybiBmYWxzZTsKKworICBpbnQzMl90IGkgPSAxOworICBmb3IgKDsgaSA8IGlMZW47ICsraSkgeworICAgIHdjaGFyX3QgY2ggPSB3c0NvbmRpdGlvbltpXTsKKyAgICBpZiAoY2ggPT0gJyAnKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoY2ggPT0gJyonKQorICAgICAgYkFsbCA9IHRydWU7CisgICAgYnJlYWs7CiAgIH0KLSAgcmV0dXJuIGZhbHNlOworICBpZiAoYkFsbCkgeworICAgIHdzSW5kZXggPSBMIjEiOworICAgIG1faUNyZWF0ZUZsYWcgPSBYRkFfUmVzb2x2ZU5vZGVfUlNUeXBlX0NyZWF0ZU5vZGVBbGw7CisgIH0gZWxzZSB7CisgICAgbV9pQ3JlYXRlRmxhZyA9IFhGQV9SZXNvbHZlTm9kZV9SU1R5cGVfQ3JlYXRlTm9kZU9uZTsKKyAgICB3c0luZGV4ID0gd3NDb25kaXRpb24uTWlkKGksIGlMZW4gLSAxIC0gaSk7CisgIH0KKyAgaW50MzJfdCBpSW5kZXggPSB3c0luZGV4LkdldEludGVnZXIoKTsKKyAgbV9pQ3JlYXRlQ291bnQgPSBpSW5kZXg7CisgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENYRkFfTm9kZUhlbHBlcjo6UmVzb2x2ZU5vZGVzX0NyZWF0ZU5vZGUoCi0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lLAotICAgIENGWF9XaWRlU3RyaW5nIHdzQ29uZGl0aW9uLAotICAgIGJvb2wgYkxhc3ROb2RlLAotICAgIENYRkFfU2NyaXB0Q29udGV4dCogcFNjcmlwdENvbnRleHQpIHsKK2Jvb2wgQ1hGQV9Ob2RlSGVscGVyOjpSZXNvbHZlTm9kZXNfQ3JlYXRlTm9kZShXaWRlU3RyaW5nIHdzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nIHdzQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkxhc3ROb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9FbmdpbmUqIHBTY3JpcHRDb250ZXh0KSB7CiAgIGlmICghbV9wQ3JlYXRlUGFyZW50KSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIGJvb2wgYklzQ2xhc3NOYW1lID0gZmFsc2U7CiAgIGJvb2wgYlJlc3VsdCA9IGZhbHNlOwotICBpZiAod3NOYW1lLkdldEF0KDApID09ICchJykgeworICBpZiAod3NOYW1lWzBdID09ICchJykgewogICAgIHdzTmFtZSA9IHdzTmFtZS5SaWdodCh3c05hbWUuR2V0TGVuZ3RoKCkgLSAxKTsKICAgICBtX3BDcmVhdGVQYXJlbnQgPSBUb05vZGUoCiAgICAgICAgIHBTY3JpcHRDb250ZXh0LT5HZXREb2N1bWVudCgpLT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0RhdGFzZXRzKSk7CiAgIH0KLSAgaWYgKHdzTmFtZS5HZXRBdCgwKSA9PSAnIycpIHsKKyAgaWYgKHdzTmFtZVswXSA9PSAnIycpIHsKICAgICBiSXNDbGFzc05hbWUgPSB0cnVlOwogICAgIHdzTmFtZSA9IHdzTmFtZS5SaWdodCh3c05hbWUuR2V0TGVuZ3RoKCkgLSAxKTsKICAgfQpAQCAtMzY2LDE0ICszMjksMTQgQEAKICAgICBDcmVhdGVOb2RlX0ZvckNvbmRpdGlvbih3c0NvbmRpdGlvbik7CiAgIH0KICAgaWYgKGJJc0NsYXNzTmFtZSkgewotICAgIFhGQV9FbGVtZW50IGVUeXBlID0gWEZBX0dldEVsZW1lbnRUeXBlRm9yTmFtZSh3c05hbWUuQXNTdHJpbmdDKCkpOworICAgIFhGQV9FbGVtZW50IGVUeXBlID0gQ1hGQV9Ob2RlOjpOYW1lVG9FbGVtZW50KHdzTmFtZSk7CiAgICAgaWYgKGVUeXBlID09IFhGQV9FbGVtZW50OjpVbmtub3duKQogICAgICAgcmV0dXJuIGZhbHNlOwogCiAgICAgZm9yIChpbnQzMl90IGlJbmRleCA9IDA7IGlJbmRleCA8IG1faUNyZWF0ZUNvdW50OyBpSW5kZXgrKykgewogICAgICAgQ1hGQV9Ob2RlKiBwTmV3Tm9kZSA9IG1fcENyZWF0ZVBhcmVudC0+Q3JlYXRlU2FtZVBhY2tldE5vZGUoZVR5cGUpOwogICAgICAgaWYgKHBOZXdOb2RlKSB7Ci0gICAgICAgIG1fcENyZWF0ZVBhcmVudC0+SW5zZXJ0Q2hpbGQocE5ld05vZGUpOworICAgICAgICBtX3BDcmVhdGVQYXJlbnQtPkluc2VydENoaWxkKHBOZXdOb2RlLCBudWxscHRyKTsKICAgICAgICAgaWYgKGlJbmRleCA9PSBtX2lDcmVhdGVDb3VudCAtIDEpIHsKICAgICAgICAgICBtX3BDcmVhdGVQYXJlbnQgPSBwTmV3Tm9kZTsKICAgICAgICAgfQpAQCAtMzg4LDkgKzM1MSwxMCBAQAogICAgIGZvciAoaW50MzJfdCBpSW5kZXggPSAwOyBpSW5kZXggPCBtX2lDcmVhdGVDb3VudDsgaUluZGV4KyspIHsKICAgICAgIENYRkFfTm9kZSogcE5ld05vZGUgPSBtX3BDcmVhdGVQYXJlbnQtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKGVDbGFzc1R5cGUpOwogICAgICAgaWYgKHBOZXdOb2RlKSB7Ci0gICAgICAgIHBOZXdOb2RlLT5TZXRBdHRyaWJ1dGUoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05hbWUuQXNTdHJpbmdDKCkpOworICAgICAgICBwTmV3Tm9kZS0+SlNPYmplY3QoKS0+U2V0QXR0cmlidXRlKFhGQV9BdHRyaWJ1dGU6Ok5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NOYW1lLkFzU3RyaW5nVmlldygpLCBmYWxzZSk7CiAgICAgICAgIHBOZXdOb2RlLT5DcmVhdGVYTUxNYXBwaW5nTm9kZSgpOwotICAgICAgICBtX3BDcmVhdGVQYXJlbnQtPkluc2VydENoaWxkKHBOZXdOb2RlKTsKKyAgICAgICAgbV9wQ3JlYXRlUGFyZW50LT5JbnNlcnRDaGlsZChwTmV3Tm9kZSwgbnVsbHB0cik7CiAgICAgICAgIGlmIChpSW5kZXggPT0gbV9pQ3JlYXRlQ291bnQgLSAxKSB7CiAgICAgICAgICAgbV9wQ3JlYXRlUGFyZW50ID0gcE5ld05vZGU7CiAgICAgICAgIH0KQEAgLTQwNSw5ICszNjksOSBAQAogfQogCiB2b2lkIENYRkFfTm9kZUhlbHBlcjo6U2V0Q3JlYXRlTm9kZVR5cGUoQ1hGQV9Ob2RlKiByZWZOb2RlKSB7Ci0gIGlmICghcmVmTm9kZSkgeworICBpZiAoIXJlZk5vZGUpCiAgICAgcmV0dXJuOwotICB9CisKICAgaWYgKHJlZk5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm0pIHsKICAgICBtX2VMYXN0Q3JlYXRlVHlwZSA9IFhGQV9FbGVtZW50OjpEYXRhR3JvdXA7CiAgIH0gZWxzZSBpZiAocmVmTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6RmllbGQpIHsKQEAgLTQyMSw4ICszODUsNSBAQAogCiBib29sIENYRkFfTm9kZUhlbHBlcjo6Tm9kZUlzUHJvcGVydHkoQ1hGQV9Ob2RlKiByZWZOb2RlKSB7CiAgIENYRkFfTm9kZSogcGFyZW50ID0gUmVzb2x2ZU5vZGVzX0dldFBhcmVudChyZWZOb2RlLCBYRkFfTE9HSUNfTm9UcmFuc3BhcmVudCk7Ci0gIHJldHVybiBwYXJlbnQgJiYgcmVmTm9kZSAmJgotICAgICAgICAgWEZBX0dldFByb3BlcnR5T2ZFbGVtZW50KHBhcmVudC0+R2V0RWxlbWVudFR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZOb2RlLT5HZXRFbGVtZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfVU5LTk9XTik7CisgIHJldHVybiBwYXJlbnQgJiYgcmVmTm9kZSAmJiBwYXJlbnQtPkhhc1Byb3BlcnR5KHJlZk5vZGUtPkdldEVsZW1lbnRUeXBlKCkpOwogfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZWhlbHBlci5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZWhlbHBlci5oCmluZGV4IDUwOTdmZWEuLmUxMzM4N2UgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX25vZGVoZWxwZXIuaAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlaGVscGVyLmgKQEAgLTcsMTAgKzcsMTEgQEAKICNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTk9ERUhFTFBFUl9IXwogI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9OT0RFSEVMUEVSX0hfCiAKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKwogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfcmVzb2x2ZW5vZGVfcnMuaCIKIAotY2xhc3MgQ1hGQV9TY3JpcHRDb250ZXh0OworY2xhc3MgQ0ZYSlNFX0VuZ2luZTsKIAogZW51bSBYRkFfTE9HSUNfVFlQRSB7CiAgIFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50LApAQCAtMjMsNyArMjQsNyBAQAogICB+Q1hGQV9Ob2RlSGVscGVyKCk7CiAKICAgQ1hGQV9Ob2RlKiBSZXNvbHZlTm9kZXNfR2V0T25lQ2hpbGQoQ1hGQV9Ob2RlKiBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX1dDSEFSKiBwd3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3Y2hhcl90KiBwd3NOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJc0NsYXNzTmFtZSA9IGZhbHNlKTsKICAgQ1hGQV9Ob2RlKiBSZXNvbHZlTm9kZXNfR2V0UGFyZW50KAogICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSwKQEAgLTMxLDQwICszMiwzOSBAQAogCiAgIGludDMyX3QgTm9kZUFjY19UcmF2ZXJzZVNpYmxpbmdzKENYRkFfTm9kZSogcGFyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkTmFtZUhhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZUFycmF5KiBwU2libGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+KiBwU2libGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MT0dJQ19UWVBFIGVMb2dpY1R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYklzQ2xhc3NOYW1lID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYklzRmluZFByb3BlcnR5ID0gdHJ1ZSk7CiAgIGludDMyX3QgTm9kZUFjY19UcmF2ZXJzZUFueVNpYmxpbmdzKENYRkFfTm9kZSogcGFyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkTmFtZUhhc2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZUFycmF5KiBwU2libGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+KiBwU2libGluZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYklzQ2xhc3NOYW1lID0gZmFsc2UpOwogICBpbnQzMl90IENvdW50U2libGluZ3MoQ1hGQV9Ob2RlKiBwTm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MT0dJQ19UWVBFIGVMb2dpY1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSogcFNpYmxpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q1hGQV9Ob2RlKj4qIHBTaWJsaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYklzQ2xhc3NOYW1lID0gZmFsc2UpOwogICBpbnQzMl90IEdldEluZGV4KENYRkFfTm9kZSogcE5vZGUsCiAgICAgICAgICAgICAgICAgICAgWEZBX0xPR0lDX1RZUEUgZUxvZ2ljVHlwZSA9IFhGQV9MT0dJQ19Ob1RyYW5zcGFyZW50LAogICAgICAgICAgICAgICAgICAgIGJvb2wgYklzUHJvcGVydHkgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBib29sIGJJc0NsYXNzSW5kZXggPSBmYWxzZSk7Ci0gIHZvaWQgR2V0TmFtZUV4cHJlc3Npb24oQ1hGQV9Ob2RlKiByZWZOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXNBbGxQYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MT0dJQ19UWVBFIGVMb2dpY1R5cGUgPSBYRkFfTE9HSUNfTm9UcmFuc3BhcmVudCk7CisgIFdpZGVTdHJpbmcgR2V0TmFtZUV4cHJlc3Npb24oCisgICAgICBDWEZBX05vZGUqIHJlZk5vZGUsCisgICAgICBib29sIGJJc0FsbFBhdGgsCisgICAgICBYRkFfTE9HSUNfVFlQRSBlTG9naWNUeXBlID0gWEZBX0xPR0lDX05vVHJhbnNwYXJlbnQpOwogICBib29sIE5vZGVJc1RyYW5zcGFyZW50KENYRkFfTm9kZSogcmVmTm9kZSk7Ci0gIGJvb2wgUmVzb2x2ZU5vZGVzX0NyZWF0ZU5vZGUoQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29uZGl0aW9uLAorICBib29sIFJlc29sdmVOb2Rlc19DcmVhdGVOb2RlKFdpZGVTdHJpbmcgd3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcgd3NDb25kaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTGFzdE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9TY3JpcHRDb250ZXh0KiBwU2NyaXB0Q29udGV4dCk7Ci0gIGJvb2wgQ3JlYXRlTm9kZV9Gb3JDb25kaXRpb24oQ0ZYX1dpZGVTdHJpbmcmIHdzQ29uZGl0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfRW5naW5lKiBwU2NyaXB0Q29udGV4dCk7CisgIGJvb2wgQ3JlYXRlTm9kZV9Gb3JDb25kaXRpb24oV2lkZVN0cmluZyYgd3NDb25kaXRpb24pOwogICB2b2lkIFNldENyZWF0ZU5vZGVUeXBlKENYRkFfTm9kZSogcmVmTm9kZSk7CiAgIGJvb2wgTm9kZUlzUHJvcGVydHkoQ1hGQV9Ob2RlKiByZWZOb2RlKTsKIAotIHB1YmxpYzoKICAgWEZBX0VsZW1lbnQgbV9lTGFzdENyZWF0ZVR5cGU7CiAgIENYRkFfTm9kZSogbV9wQ3JlYXRlUGFyZW50OwogICBpbnQzMl90IG1faUNyZWF0ZUNvdW50OwotICBYRkFfUkVTT1ZFTk9ERV9SU1RZUEUgbV9pQ3JlYXRlRmxhZzsKKyAgWEZBX1Jlc29sdmVOb2RlX1JTVHlwZSBtX2lDcmVhdGVGbGFnOwogICBpbnQzMl90IG1faUN1ckFsbFN0YXJ0OwogICBDWEZBX05vZGUqIG1fcEFsbFN0YXJ0UGFyZW50OwogfTsKZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX25vZGVpdGVyYXRvcnRlbXBsYXRlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlaXRlcmF0b3J0ZW1wbGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNGYzOGUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlaXRlcmF0b3J0ZW1wbGF0ZS5oCkBAIC0wLDAgKzEsMTI5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTk9ERUlURVJBVE9SVEVNUExBVEVfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTk9ERUlURVJBVE9SVEVNUExBVEVfSF8KKwordGVtcGxhdGUgPGNsYXNzIE5vZGVUeXBlLCBjbGFzcyBUcmF2ZXJzZVN0cmF0ZWd5PgorY2xhc3MgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlKE5vZGVUeXBlKiBwUm9vdCkKKyAgICAgIDogbV9wUm9vdChwUm9vdCksIG1fcEN1cnJlbnQocFJvb3QpIHt9CisKKyAgTm9kZVR5cGUqIEdldFJvb3QoKSBjb25zdCB7IHJldHVybiBtX3BSb290OyB9CisgIE5vZGVUeXBlKiBHZXRDdXJyZW50KCkgY29uc3QgeyByZXR1cm4gbV9wQ3VycmVudDsgfQorCisgIHZvaWQgUmVzZXQoKSB7IG1fcEN1cnJlbnQgPSBtX3BSb290OyB9CisgIGJvb2wgU2V0Q3VycmVudChOb2RlVHlwZSogcE5vZGUpIHsKKyAgICBpZiAoIVJvb3RSZWFjaGFibGVGcm9tTm9kZShwTm9kZSkpIHsKKyAgICAgIG1fcEN1cnJlbnQgPSBudWxscHRyOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtX3BDdXJyZW50ID0gcE5vZGU7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBOb2RlVHlwZSogTW92ZVRvUHJldigpIHsKKyAgICBpZiAoIW1fcFJvb3QpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBpZiAoIW1fcEN1cnJlbnQpIHsKKyAgICAgIG1fcEN1cnJlbnQgPSBMYXN0RGVzY2VuZGFudChtX3BSb290KTsKKyAgICAgIHJldHVybiBtX3BDdXJyZW50OworICAgIH0KKyAgICBOb2RlVHlwZSogcFNpYmxpbmcgPSBQcmV2aW91c1NpYmxpbmdXaXRoaW5TdWJ0cmVlKG1fcEN1cnJlbnQpOworICAgIGlmIChwU2libGluZykgeworICAgICAgbV9wQ3VycmVudCA9IExhc3REZXNjZW5kYW50KHBTaWJsaW5nKTsKKyAgICAgIHJldHVybiBtX3BDdXJyZW50OworICAgIH0KKyAgICBOb2RlVHlwZSogcFBhcmVudCA9IFBhcmVudFdpdGhpblN1YnRyZWUobV9wQ3VycmVudCk7CisgICAgaWYgKHBQYXJlbnQpIHsKKyAgICAgIG1fcEN1cnJlbnQgPSBwUGFyZW50OworICAgICAgcmV0dXJuIG1fcEN1cnJlbnQ7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgTm9kZVR5cGUqIE1vdmVUb05leHQoKSB7CisgICAgaWYgKCFtX3BSb290IHx8ICFtX3BDdXJyZW50KQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgTm9kZVR5cGUqIHBDaGlsZCA9IFRyYXZlcnNlU3RyYXRlZ3k6OkdldEZpcnN0Q2hpbGQobV9wQ3VycmVudCk7CisgICAgaWYgKHBDaGlsZCkgeworICAgICAgbV9wQ3VycmVudCA9IHBDaGlsZDsKKyAgICAgIHJldHVybiBtX3BDdXJyZW50OworICAgIH0KKyAgICByZXR1cm4gU2tpcENoaWxkcmVuQW5kTW92ZVRvTmV4dCgpOworICB9CisKKyAgTm9kZVR5cGUqIFNraXBDaGlsZHJlbkFuZE1vdmVUb05leHQoKSB7CisgICAgaWYgKCFtX3BSb290KQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgTm9kZVR5cGUqIHBOb2RlID0gbV9wQ3VycmVudDsKKyAgICB3aGlsZSAocE5vZGUpIHsKKyAgICAgIE5vZGVUeXBlKiBwU2libGluZyA9IE5leHRTaWJsaW5nV2l0aGluU3VidHJlZShwTm9kZSk7CisgICAgICBpZiAocFNpYmxpbmcpIHsKKyAgICAgICAgbV9wQ3VycmVudCA9IHBTaWJsaW5nOworICAgICAgICByZXR1cm4gbV9wQ3VycmVudDsKKyAgICAgIH0KKyAgICAgIHBOb2RlID0gUGFyZW50V2l0aGluU3VidHJlZShwTm9kZSk7CisgICAgfQorICAgIG1fcEN1cnJlbnQgPSBudWxscHRyOworICAgIHJldHVybiBtX3BDdXJyZW50OworICB9CisKKyBwcml2YXRlOgorICBib29sIFJvb3RSZWFjaGFibGVGcm9tTm9kZShOb2RlVHlwZSogcE5vZGUpIHsKKyAgICBpZiAoIXBOb2RlKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChwTm9kZSA9PSBtX3BSb290KQorICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIFJvb3RSZWFjaGFibGVGcm9tTm9kZShUcmF2ZXJzZVN0cmF0ZWd5OjpHZXRQYXJlbnQocE5vZGUpKTsKKyAgfQorCisgIE5vZGVUeXBlKiBQYXJlbnRXaXRoaW5TdWJ0cmVlKE5vZGVUeXBlKiBwTm9kZSkgeworICAgIGlmICghcE5vZGUgfHwgcE5vZGUgPT0gbV9wUm9vdCkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBUcmF2ZXJzZVN0cmF0ZWd5OjpHZXRQYXJlbnQocE5vZGUpOworICB9CisKKyAgTm9kZVR5cGUqIE5leHRTaWJsaW5nV2l0aGluU3VidHJlZShOb2RlVHlwZSogcE5vZGUpIHsKKyAgICBpZiAocE5vZGUgPT0gbV9wUm9vdCkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBUcmF2ZXJzZVN0cmF0ZWd5OjpHZXROZXh0U2libGluZyhwTm9kZSk7CisgIH0KKworICBOb2RlVHlwZSogUHJldmlvdXNTaWJsaW5nV2l0aGluU3VidHJlZShOb2RlVHlwZSogcE5vZGUpIHsKKyAgICBOb2RlVHlwZSogcFBhcmVudCA9IFBhcmVudFdpdGhpblN1YnRyZWUocE5vZGUpOworICAgIGlmICghcFBhcmVudCkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIE5vZGVUeXBlKiBwQ3VycmVudCA9IFRyYXZlcnNlU3RyYXRlZ3k6OkdldEZpcnN0Q2hpbGQocFBhcmVudCk7CisgICAgTm9kZVR5cGUqIHBQcmV2aW91cyA9IG51bGxwdHI7CisgICAgd2hpbGUgKHBDdXJyZW50ICE9IHBOb2RlKSB7CisgICAgICBwUHJldmlvdXMgPSBwQ3VycmVudDsKKyAgICAgIHBDdXJyZW50ID0gVHJhdmVyc2VTdHJhdGVneTo6R2V0TmV4dFNpYmxpbmcocEN1cnJlbnQpOworICAgIH0KKyAgICByZXR1cm4gcFByZXZpb3VzOworICB9CisKKyAgTm9kZVR5cGUqIExhc3RDaGlsZChOb2RlVHlwZSogcE5vZGUpIHsKKyAgICBOb2RlVHlwZSogcFByZXZpb3VzID0gbnVsbHB0cjsKKyAgICBOb2RlVHlwZSogcENoaWxkID0gVHJhdmVyc2VTdHJhdGVneTo6R2V0Rmlyc3RDaGlsZChwTm9kZSk7CisgICAgd2hpbGUgKHBDaGlsZCkgeworICAgICAgcFByZXZpb3VzID0gcENoaWxkOworICAgICAgcENoaWxkID0gTmV4dFNpYmxpbmdXaXRoaW5TdWJ0cmVlKHBDaGlsZCk7CisgICAgfQorICAgIHJldHVybiBwUHJldmlvdXM7CisgIH0KKworICBOb2RlVHlwZSogTGFzdERlc2NlbmRhbnQoTm9kZVR5cGUqIHBOb2RlKSB7CisgICAgTm9kZVR5cGUqIHBDaGlsZCA9IExhc3RDaGlsZChwTm9kZSk7CisgICAgcmV0dXJuIHBDaGlsZCA/IExhc3REZXNjZW5kYW50KHBDaGlsZCkgOiBwTm9kZTsKKyAgfQorCisgIE5vZGVUeXBlKiBtX3BSb290OworICBOb2RlVHlwZSogbV9wQ3VycmVudDsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTk9ERUlURVJBVE9SVEVNUExBVEVfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX25vZGVpdGVyYXRvcnRlbXBsYXRlX3VuaXR0ZXN0LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX25vZGVpdGVyYXRvcnRlbXBsYXRlX3VuaXR0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTRiZWQwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZWl0ZXJhdG9ydGVtcGxhdGVfdW5pdHRlc3QuY3BwCkBAIC0wLDAgKzEsMjU3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlaXRlcmF0b3J0ZW1wbGF0ZS5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorI2luY2x1ZGUgInRlc3RpbmcvdGVzdF9zdXBwb3J0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCitjbGFzcyBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIGNsYXNzIE5vZGUgeworICAgcHVibGljOgorICAgIGNsYXNzIFN0cmF0ZWd5IHsKKyAgICAgcHVibGljOgorICAgICAgc3RhdGljIE5vZGUqIEdldEZpcnN0Q2hpbGQoTm9kZSogcE5vZGUpIHsKKyAgICAgICAgcmV0dXJuIHBOb2RlICYmICFwTm9kZS0+Y2hpbGRyZW5fLmVtcHR5KCkgPyBwTm9kZS0+Y2hpbGRyZW5fLmZyb250KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyOworICAgICAgfQorICAgICAgc3RhdGljIE5vZGUqIEdldE5leHRTaWJsaW5nKE5vZGUqIHBOb2RlKSB7CisgICAgICAgIHJldHVybiBwTm9kZSA/IHBOb2RlLT5uZXh0X3NpYmxpbmdfIDogbnVsbHB0cjsKKyAgICAgIH0KKyAgICAgIHN0YXRpYyBOb2RlKiBHZXRQYXJlbnQoTm9kZSogcE5vZGUpIHsKKyAgICAgICAgcmV0dXJuIHBOb2RlID8gcE5vZGUtPnBhcmVudF8gOiBudWxscHRyOworICAgICAgfQorICAgIH07CisKKyAgICBleHBsaWNpdCBOb2RlKE5vZGUqIHBhcmVudCkgOiBwYXJlbnRfKHBhcmVudCksIG5leHRfc2libGluZ18obnVsbHB0cikgeworICAgICAgaWYgKHBhcmVudCkgeworICAgICAgICBpZiAoIXBhcmVudC0+Y2hpbGRyZW5fLmVtcHR5KCkpCisgICAgICAgICAgcGFyZW50LT5jaGlsZHJlbl8uYmFjaygpLT5uZXh0X3NpYmxpbmdfID0gdGhpczsKKyAgICAgICAgcGFyZW50LT5jaGlsZHJlbl8ucHVzaF9iYWNrKHRoaXMpOworICAgICAgfQorICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBOb2RlKiBwYXJlbnRfOworICAgIE5vZGUqIG5leHRfc2libGluZ187CisgICAgc3RkOjp2ZWN0b3I8Tm9kZSo+IGNoaWxkcmVuXzsKKyAgfTsKKworICB1c2luZyBJdGVyYXRvciA9IENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Tm9kZSwgTm9kZTo6U3RyYXRlZ3k+OworCisgIC8vIEJ1aWxkcyBhIHRyZWUgYWxvbmcgdGhlIGxpbmVzIG9mOgorICAvLworICAvLyAgIHJvb3QKKyAgLy8gICB8CisgIC8vICAgY2hpbGQxLS1jaGlsZDIKKyAgLy8gICAgICAgICAgICB8CisgIC8vICAgICAgICAgICAgY2hpbGQzLS0tLS0tLS0tLS0tY2hpbGQ3LS1jaGlsZDkKKyAgLy8gICAgICAgICAgICB8ICAgICAgICAgICAgICAgICB8CisgIC8vICAgICAgICAgICAgY2hpbGQ0LS1jaGlsZDYgICAgY2hpbGQ4CisgIC8vICAgICAgICAgICAgfAorICAvLyAgICAgICAgICAgIGNoaWxkNQorICAvLworICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIHJvb3RfID0gcGRmaXVtOjpNYWtlVW5pcXVlPE5vZGU+KG51bGxwdHIpOworICAgIGNoaWxkMV8gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Tm9kZT4ocm9vdF8uZ2V0KCkpOworICAgIGNoaWxkMl8gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Tm9kZT4ocm9vdF8uZ2V0KCkpOworICAgIGNoaWxkM18gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Tm9kZT4oY2hpbGQyXy5nZXQoKSk7CisgICAgY2hpbGQ0XyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxOb2RlPihjaGlsZDNfLmdldCgpKTsKKyAgICBjaGlsZDVfID0gcGRmaXVtOjpNYWtlVW5pcXVlPE5vZGU+KGNoaWxkNF8uZ2V0KCkpOworICAgIGNoaWxkNl8gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Tm9kZT4oY2hpbGQzXy5nZXQoKSk7CisgICAgY2hpbGQ3XyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxOb2RlPihjaGlsZDJfLmdldCgpKTsKKyAgICBjaGlsZDhfID0gcGRmaXVtOjpNYWtlVW5pcXVlPE5vZGU+KGNoaWxkN18uZ2V0KCkpOworICAgIGNoaWxkOV8gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Tm9kZT4oY2hpbGQyXy5nZXQoKSk7CisgIH0KKworICBOb2RlKiByb290KCkgY29uc3QgeyByZXR1cm4gcm9vdF8uZ2V0KCk7IH0KKyAgTm9kZSogY2hpbGQxKCkgY29uc3QgeyByZXR1cm4gY2hpbGQxXy5nZXQoKTsgfQorICBOb2RlKiBjaGlsZDIoKSBjb25zdCB7IHJldHVybiBjaGlsZDJfLmdldCgpOyB9CisgIE5vZGUqIGNoaWxkMygpIGNvbnN0IHsgcmV0dXJuIGNoaWxkM18uZ2V0KCk7IH0KKyAgTm9kZSogY2hpbGQ0KCkgY29uc3QgeyByZXR1cm4gY2hpbGQ0Xy5nZXQoKTsgfQorICBOb2RlKiBjaGlsZDUoKSBjb25zdCB7IHJldHVybiBjaGlsZDVfLmdldCgpOyB9CisgIE5vZGUqIGNoaWxkNigpIGNvbnN0IHsgcmV0dXJuIGNoaWxkNl8uZ2V0KCk7IH0KKyAgTm9kZSogY2hpbGQ3KCkgY29uc3QgeyByZXR1cm4gY2hpbGQ3Xy5nZXQoKTsgfQorICBOb2RlKiBjaGlsZDgoKSBjb25zdCB7IHJldHVybiBjaGlsZDhfLmdldCgpOyB9CisgIE5vZGUqIGNoaWxkOSgpIGNvbnN0IHsgcmV0dXJuIGNoaWxkOV8uZ2V0KCk7IH0KKworIHByb3RlY3RlZDoKKyAgc3RkOjp1bmlxdWVfcHRyPE5vZGU+IHJvb3RfOworICBzdGQ6OnVuaXF1ZV9wdHI8Tm9kZT4gY2hpbGQxXzsKKyAgc3RkOjp1bmlxdWVfcHRyPE5vZGU+IGNoaWxkMl87CisgIHN0ZDo6dW5pcXVlX3B0cjxOb2RlPiBjaGlsZDNfOworICBzdGQ6OnVuaXF1ZV9wdHI8Tm9kZT4gY2hpbGQ0XzsKKyAgc3RkOjp1bmlxdWVfcHRyPE5vZGU+IGNoaWxkNV87CisgIHN0ZDo6dW5pcXVlX3B0cjxOb2RlPiBjaGlsZDZfOworICBzdGQ6OnVuaXF1ZV9wdHI8Tm9kZT4gY2hpbGQ3XzsKKyAgc3RkOjp1bmlxdWVfcHRyPE5vZGU+IGNoaWxkOF87CisgIHN0ZDo6dW5pcXVlX3B0cjxOb2RlPiBjaGlsZDlfOworfTsKKworVEVTVF9GKENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGVUZXN0LCBFbXB0eSkgeworICBJdGVyYXRvciBpdGVyKG51bGxwdHIpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgaXRlci5HZXRSb290KCkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgaXRlci5HZXRDdXJyZW50KCkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgaXRlci5Nb3ZlVG9OZXh0KCkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgaXRlci5Nb3ZlVG9QcmV2KCkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgaXRlci5Ta2lwQ2hpbGRyZW5BbmRNb3ZlVG9OZXh0KCkpOworfQorCitURVNUX0YoQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZVRlc3QsIFJvb3QpIHsKKyAgSXRlcmF0b3IgaXRlcihyb290KCkpOworICBFWFBFQ1RfRVEocm9vdCgpLCBpdGVyLkdldFJvb3QoKSk7CisgIEVYUEVDVF9FUShyb290KCksIGl0ZXIuR2V0Q3VycmVudCgpKTsKK30KKworVEVTVF9GKENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGVUZXN0LCBDdXJyZW50KSB7CisgIEl0ZXJhdG9yIGl0ZXIocm9vdCgpKTsKKyAgaXRlci5TZXRDdXJyZW50KGNoaWxkMSgpKTsKKyAgRVhQRUNUX0VRKHJvb3QoKSwgaXRlci5HZXRSb290KCkpOworICBFWFBFQ1RfRVEoY2hpbGQxKCksIGl0ZXIuR2V0Q3VycmVudCgpKTsKK30KKworVEVTVF9GKENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGVUZXN0LCBDdXJyZW50T3V0c2lkZVJvb3REaXNhbGxvd2VkKSB7CisgIEl0ZXJhdG9yIGl0ZXIoY2hpbGQxKCkpOworICBpdGVyLlNldEN1cnJlbnQocm9vdCgpKTsKKyAgRVhQRUNUX0VRKGNoaWxkMSgpLCBpdGVyLkdldFJvb3QoKSk7CisgIEVYUEVDVF9FUShudWxscHRyLCBpdGVyLkdldEN1cnJlbnQoKSk7Cit9CisKK1RFU1RfRihDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlVGVzdCwgQ3VycmVudE51bGwpIHsKKyAgSXRlcmF0b3IgaXRlcihyb290KCkpOworICBFWFBFQ1RfRVEoY2hpbGQxKCksIGl0ZXIuTW92ZVRvTmV4dCgpKTsKKworICBpdGVyLlNldEN1cnJlbnQobnVsbHB0cik7CisgIEVYUEVDVF9FUShudWxscHRyLCBpdGVyLkdldEN1cnJlbnQoKSk7CisKKyAgRVhQRUNUX0VRKG51bGxwdHIsIGl0ZXIuTW92ZVRvTmV4dCgpKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIGl0ZXIuR2V0Q3VycmVudCgpKTsKK30KKworVEVTVF9GKENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGVUZXN0LCBNb3ZlVG9QcmV2KSB7CisgIEl0ZXJhdG9yIGl0ZXIocm9vdCgpKTsKKyAgaXRlci5TZXRDdXJyZW50KGNoaWxkOSgpKTsKKworICBFWFBFQ1RfRVEoY2hpbGQ4KCksIGl0ZXIuTW92ZVRvUHJldigpKTsKKyAgRVhQRUNUX0VRKGNoaWxkOCgpLCBpdGVyLkdldEN1cnJlbnQoKSk7CisKKyAgRVhQRUNUX0VRKGNoaWxkNygpLCBpdGVyLk1vdmVUb1ByZXYoKSk7CisgIEVYUEVDVF9FUShjaGlsZDcoKSwgaXRlci5HZXRDdXJyZW50KCkpOworCisgIEVYUEVDVF9FUShjaGlsZDYoKSwgaXRlci5Nb3ZlVG9QcmV2KCkpOworICBFWFBFQ1RfRVEoY2hpbGQ2KCksIGl0ZXIuR2V0Q3VycmVudCgpKTsKKworICBFWFBFQ1RfRVEoY2hpbGQ1KCksIGl0ZXIuTW92ZVRvUHJldigpKTsKKyAgRVhQRUNUX0VRKGNoaWxkNSgpLCBpdGVyLkdldEN1cnJlbnQoKSk7CisKKyAgRVhQRUNUX0VRKGNoaWxkNCgpLCBpdGVyLk1vdmVUb1ByZXYoKSk7CisgIEVYUEVDVF9FUShjaGlsZDQoKSwgaXRlci5HZXRDdXJyZW50KCkpOworCisgIEVYUEVDVF9FUShjaGlsZDMoKSwgaXRlci5Nb3ZlVG9QcmV2KCkpOworICBFWFBFQ1RfRVEoY2hpbGQzKCksIGl0ZXIuR2V0Q3VycmVudCgpKTsKKworICBFWFBFQ1RfRVEoY2hpbGQyKCksIGl0ZXIuTW92ZVRvUHJldigpKTsKKyAgRVhQRUNUX0VRKGNoaWxkMigpLCBpdGVyLkdldEN1cnJlbnQoKSk7CisKKyAgRVhQRUNUX0VRKGNoaWxkMSgpLCBpdGVyLk1vdmVUb1ByZXYoKSk7CisgIEVYUEVDVF9FUShjaGlsZDEoKSwgaXRlci5HZXRDdXJyZW50KCkpOworCisgIEVYUEVDVF9FUShyb290KCksIGl0ZXIuTW92ZVRvUHJldigpKTsKKyAgRVhQRUNUX0VRKHJvb3QoKSwgaXRlci5HZXRDdXJyZW50KCkpOworCisgIEVYUEVDVF9FUShudWxscHRyLCBpdGVyLk1vdmVUb1ByZXYoKSk7CisgIEVYUEVDVF9FUShyb290KCksIGl0ZXIuR2V0Q3VycmVudCgpKTsKKworICBFWFBFQ1RfRVEobnVsbHB0ciwgaXRlci5Nb3ZlVG9QcmV2KCkpOworICBFWFBFQ1RfRVEocm9vdCgpLCBpdGVyLkdldEN1cnJlbnQoKSk7Cit9CisKK1RFU1RfRihDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlVGVzdCwgTW92ZVRvTmV4dCkgeworICBJdGVyYXRvciBpdGVyKHJvb3QoKSk7CisgIGl0ZXIuU2V0Q3VycmVudChjaGlsZDIoKSk7CisKKyAgRVhQRUNUX0VRKGNoaWxkMygpLCBpdGVyLk1vdmVUb05leHQoKSk7CisgIEVYUEVDVF9FUShjaGlsZDMoKSwgaXRlci5HZXRDdXJyZW50KCkpOworCisgIEVYUEVDVF9FUShjaGlsZDQoKSwgaXRlci5Nb3ZlVG9OZXh0KCkpOworICBFWFBFQ1RfRVEoY2hpbGQ0KCksIGl0ZXIuR2V0Q3VycmVudCgpKTsKKworICBFWFBFQ1RfRVEoY2hpbGQ1KCksIGl0ZXIuTW92ZVRvTmV4dCgpKTsKKyAgRVhQRUNUX0VRKGNoaWxkNSgpLCBpdGVyLkdldEN1cnJlbnQoKSk7CisKKyAgRVhQRUNUX0VRKGNoaWxkNigpLCBpdGVyLk1vdmVUb05leHQoKSk7CisgIEVYUEVDVF9FUShjaGlsZDYoKSwgaXRlci5HZXRDdXJyZW50KCkpOworCisgIEVYUEVDVF9FUShjaGlsZDcoKSwgaXRlci5Nb3ZlVG9OZXh0KCkpOworICBFWFBFQ1RfRVEoY2hpbGQ3KCksIGl0ZXIuR2V0Q3VycmVudCgpKTsKKworICBFWFBFQ1RfRVEoY2hpbGQ4KCksIGl0ZXIuTW92ZVRvTmV4dCgpKTsKKyAgRVhQRUNUX0VRKGNoaWxkOCgpLCBpdGVyLkdldEN1cnJlbnQoKSk7CisKKyAgRVhQRUNUX0VRKGNoaWxkOSgpLCBpdGVyLk1vdmVUb05leHQoKSk7CisgIEVYUEVDVF9FUShjaGlsZDkoKSwgaXRlci5HZXRDdXJyZW50KCkpOworCisgIEVYUEVDVF9FUShudWxscHRyLCBpdGVyLk1vdmVUb05leHQoKSk7CisgIEVYUEVDVF9FUShudWxscHRyLCBpdGVyLkdldEN1cnJlbnQoKSk7CisKKyAgRVhQRUNUX0VRKG51bGxwdHIsIGl0ZXIuTW92ZVRvTmV4dCgpKTsKKyAgRVhQRUNUX0VRKG51bGxwdHIsIGl0ZXIuR2V0Q3VycmVudCgpKTsKK30KKworVEVTVF9GKENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGVUZXN0LCBTa2lwQ2hpbGRyZW5BbmRNb3ZlVG9OZXh0KSB7CisgIEl0ZXJhdG9yIGl0ZXIocm9vdCgpKTsKKyAgaXRlci5TZXRDdXJyZW50KGNoaWxkMygpKTsKKyAgRVhQRUNUX0VRKGNoaWxkNygpLCBpdGVyLlNraXBDaGlsZHJlbkFuZE1vdmVUb05leHQoKSk7CisgIEVYUEVDVF9FUShjaGlsZDkoKSwgaXRlci5Ta2lwQ2hpbGRyZW5BbmRNb3ZlVG9OZXh0KCkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgaXRlci5Ta2lwQ2hpbGRyZW5BbmRNb3ZlVG9OZXh0KCkpOworfQorCitURVNUX0YoQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZVRlc3QsIEJhY2tBbmRGb3J0aCkgeworICBJdGVyYXRvciBpdGVyKHJvb3QoKSk7CisgIEVYUEVDVF9FUShjaGlsZDEoKSwgaXRlci5Nb3ZlVG9OZXh0KCkpOworICBFWFBFQ1RfRVEoY2hpbGQyKCksIGl0ZXIuTW92ZVRvTmV4dCgpKTsKKyAgRVhQRUNUX0VRKGNoaWxkMygpLCBpdGVyLk1vdmVUb05leHQoKSk7CisgIEVYUEVDVF9FUShjaGlsZDQoKSwgaXRlci5Nb3ZlVG9OZXh0KCkpOworICBFWFBFQ1RfRVEoY2hpbGQ1KCksIGl0ZXIuTW92ZVRvTmV4dCgpKTsKKyAgRVhQRUNUX0VRKGNoaWxkNCgpLCBpdGVyLk1vdmVUb1ByZXYoKSk7CisgIEVYUEVDVF9FUShjaGlsZDMoKSwgaXRlci5Nb3ZlVG9QcmV2KCkpOworICBFWFBFQ1RfRVEoY2hpbGQyKCksIGl0ZXIuTW92ZVRvUHJldigpKTsKKyAgRVhQRUNUX0VRKGNoaWxkMSgpLCBpdGVyLk1vdmVUb1ByZXYoKSk7Cit9CisKK1RFU1RfRihDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlVGVzdCwgTmV4dEZyb21CZWZvcmVUaGVCZWdpbm5pbmcpIHsKKyAgSXRlcmF0b3IgaXRlcihyb290KCkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgaXRlci5Nb3ZlVG9QcmV2KCkpOworICBFWFBFQ1RfRVEocm9vdCgpLCBpdGVyLkdldEN1cnJlbnQoKSk7CisgIEVYUEVDVF9FUShjaGlsZDEoKSwgaXRlci5Nb3ZlVG9OZXh0KCkpOworfQorCitURVNUX0YoQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZVRlc3QsIFByZXZGcm9tQWZ0ZXJUaGVFbmQpIHsKKyAgSXRlcmF0b3IgaXRlcihyb290KCkpOworICBpdGVyLlNldEN1cnJlbnQoY2hpbGQ5KCkpOworICBFWFBFQ1RfRVEobnVsbHB0ciwgaXRlci5Nb3ZlVG9OZXh0KCkpOworICBFWFBFQ1RfRVEoY2hpbGQ5KCksIGl0ZXIuTW92ZVRvUHJldigpKTsKK30KKworVEVTVF9GKENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGVUZXN0LCBDaGlsZEFzUm9vdFByZXYpIHsKKyAgSXRlcmF0b3IgaXRlcihjaGlsZDMoKSk7CisgIEVYUEVDVF9FUShudWxscHRyLCBpdGVyLk1vdmVUb1ByZXYoKSk7CisKKyAgaXRlci5TZXRDdXJyZW50KGNoaWxkNCgpKTsKKyAgRVhQRUNUX0VRKGNoaWxkMygpLCBpdGVyLk1vdmVUb1ByZXYoKSk7CisgIEVYUEVDVF9FUShudWxscHRyLCBpdGVyLk1vdmVUb1ByZXYoKSk7Cit9CisKK1RFU1RfRihDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlVGVzdCwgQ2hpbGRBc1Jvb3ROZXh0KSB7CisgIEl0ZXJhdG9yIGl0ZXIoY2hpbGQzKCkpOworICBpdGVyLlNldEN1cnJlbnQoY2hpbGQ0KCkpOworICBFWFBFQ1RfRVEoY2hpbGQ1KCksIGl0ZXIuTW92ZVRvTmV4dCgpKTsKKyAgRVhQRUNUX0VRKGNoaWxkNigpLCBpdGVyLk1vdmVUb05leHQoKSk7CisgIEVYUEVDVF9FUShudWxscHRyLCBpdGVyLk1vdmVUb05leHQoKSk7Cit9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlbGlzdC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlbGlzdC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3YzUzMWYuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZWxpc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfb2JqZWN0LmgiCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2NyaXB0Y29udGV4dC5oIgotCi1DWEZBX05vZGVMaXN0OjpDWEZBX05vZGVMaXN0KENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCkKLSAgICA6IENYRkFfT2JqZWN0KHBEb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlTGlzdCwKLSAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpOb2RlTGlzdCwKLSAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyhMIm5vZGVMaXN0IikpIHsKLSAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+QWRkVG9DYWNoZUxpc3QoCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9Ob2RlTGlzdD4odGhpcykpOwotfQotCi1DWEZBX05vZGVMaXN0Ojp+Q1hGQV9Ob2RlTGlzdCgpIHt9Ci0KLUNYRkFfTm9kZSogQ1hGQV9Ob2RlTGlzdDo6TmFtZWRJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKSB7Ci0gIHVpbnQzMl90IGR3SGFzaENvZGUgPSBGWF9IYXNoQ29kZV9HZXRXKHdzTmFtZSwgZmFsc2UpOwotICBpbnQzMl90IGlDb3VudCA9IEdldExlbmd0aCgpOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgewotICAgIENYRkFfTm9kZSogcmV0ID0gSXRlbShpKTsKLSAgICBpZiAoZHdIYXNoQ29kZSA9PSByZXQtPkdldE5hbWVIYXNoKCkpCi0gICAgICByZXR1cm4gcmV0OwotICB9Ci0gIHJldHVybiBudWxscHRyOwotfQotCi12b2lkIENYRkFfTm9kZUxpc3Q6OlNjcmlwdF9MaXN0Q2xhc3NfQXBwZW5kKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7Ci0gIGlmIChhcmdjICE9IDEpIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMImFwcGVuZCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENYRkFfTm9kZSogcE5vZGUgPSBzdGF0aWNfY2FzdDxDWEZBX05vZGUqPihwQXJndW1lbnRzLT5HZXRPYmplY3QoMCkpOwotICBpZiAoIXBOb2RlKSB7Ci0gICAgVGhyb3dBcmd1bWVudE1pc21hdGNoRXhjZXB0aW9uKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIEFwcGVuZChwTm9kZSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19JbnNlcnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cykgewotICBpbnQzMl90IGFyZ2MgPSBwQXJndW1lbnRzLT5HZXRMZW5ndGgoKTsKLSAgaWYgKGFyZ2MgIT0gMikgewotICAgIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKEwiaW5zZXJ0Iik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ1hGQV9Ob2RlKiBwTmV3Tm9kZSA9IHN0YXRpY19jYXN0PENYRkFfTm9kZSo+KHBBcmd1bWVudHMtPkdldE9iamVjdCgwKSk7Ci0gIENYRkFfTm9kZSogcEJlZm9yZU5vZGUgPSBzdGF0aWNfY2FzdDxDWEZBX05vZGUqPihwQXJndW1lbnRzLT5HZXRPYmplY3QoMSkpOwotICBpZiAoIXBOZXdOb2RlKSB7Ci0gICAgVGhyb3dBcmd1bWVudE1pc21hdGNoRXhjZXB0aW9uKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIEluc2VydChwTmV3Tm9kZSwgcEJlZm9yZU5vZGUpOwotfQotCi12b2lkIENYRkFfTm9kZUxpc3Q6OlNjcmlwdF9MaXN0Q2xhc3NfUmVtb3ZlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7Ci0gIGlmIChhcmdjICE9IDEpIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMInJlbW92ZSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENYRkFfTm9kZSogcE5vZGUgPSBzdGF0aWNfY2FzdDxDWEZBX05vZGUqPihwQXJndW1lbnRzLT5HZXRPYmplY3QoMCkpOwotICBpZiAoIXBOb2RlKSB7Ci0gICAgVGhyb3dBcmd1bWVudE1pc21hdGNoRXhjZXB0aW9uKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIFJlbW92ZShwTm9kZSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19JdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7Ci0gIGlmIChhcmdjICE9IDEpIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIml0ZW0iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbnQzMl90IGlJbmRleCA9IHBBcmd1bWVudHMtPkdldEludDMyKDApOwotICBpZiAoaUluZGV4IDwgMCB8fCBpSW5kZXggPj0gR2V0TGVuZ3RoKCkpIHsKLSAgICBUaHJvd0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+QXNzaWduKAotICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAoSXRlbShpSW5kZXgpKSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X1RyZWVsaXN0Q2xhc3NfTmFtZWRJdGVtKAotICAgIENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpIHsKLSAgaW50MzJfdCBhcmdjID0gcEFyZ3VtZW50cy0+R2V0TGVuZ3RoKCk7Ci0gIGlmIChhcmdjICE9IDEpIHsKLSAgICBUaHJvd1BhcmFtQ291bnRNaXNtYXRjaEV4Y2VwdGlvbihMIm5hbWVkSXRlbSIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIENGWF9CeXRlU3RyaW5nIHN6TmFtZSA9IHBBcmd1bWVudHMtPkdldFVURjhTdHJpbmcoMCk7Ci0gIENYRkFfTm9kZSogcE5vZGUgPQotICAgICAgTmFtZWRJdGVtKENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzek5hbWUuQXNTdHJpbmdDKCkpLkFzU3RyaW5nQygpKTsKLSAgaWYgKCFwTm9kZSkKLSAgICByZXR1cm47Ci0KLSAgcEFyZ3VtZW50cy0+R2V0UmV0dXJuVmFsdWUoKS0+QXNzaWduKAotICAgICAgbV9wRG9jdW1lbnQtPkdldFNjcmlwdENvbnRleHQoKS0+R2V0SlNWYWx1ZUZyb21NYXAocE5vZGUpKTsKLX0KLQotdm9pZCBDWEZBX05vZGVMaXN0OjpTY3JpcHRfTGlzdENsYXNzX0xlbmd0aChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKSB7Ci0gIGlmIChiU2V0dGluZykgewotICAgIFRocm93SW52YWxpZFByb3BlcnR5RXhjZXB0aW9uKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBWYWx1ZS0+U2V0SW50ZWdlcihHZXRMZW5ndGgoKSk7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlbG9jYWxlLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX25vZGVsb2NhbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MzQ1MmMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlbG9jYWxlLmNwcApAQCAtMCwwICsxLDE3NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZWxvY2FsZS5oIgorCisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2N4bWxfZWxlbWVudC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9vYmplY3QuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jYWxlbmRhcnN5bWJvbHMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRldGltZXN5bWJvbHMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xvY2FsZW1nci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90aW1lem9uZXByb3ZpZGVyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV91dGlscy5oIgorCituYW1lc3BhY2UgeworCitjb25zdCB3Y2hhcl90IGdfRlhfUGVyY2VudFtdID0gTCJ6LHp6eix6enosenp6LHp6eix6enolIjsKK2NvbnN0IHdjaGFyX3QgZ19GWF9DdXJyZW5jeVtdID0gTCIkeix6enosenp6LHp6eix6enoseno5Ljk5IjsKK2NvbnN0IHdjaGFyX3QgZ19GWF9EZWNpbWFsW10gPSBMInosenp6LHp6eix6enosenp6LHp6OS56enoiOworY29uc3Qgd2NoYXJfdCBnX0ZYX0ludGVnZXJbXSA9IEwieix6enosenp6LHp6eix6enosenp6IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK1dpZGVTdHJpbmcgWEZBX1BhdHRlcm5Ub1N0cmluZyhGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSBjYXRlZ29yeSkgeworICBzd2l0Y2ggKGNhdGVnb3J5KSB7CisgICAgY2FzZSBGWF9MT0NBTEVOVU1QQVRURVJOX1BlcmNlbnQ6CisgICAgICByZXR1cm4gZ19GWF9QZXJjZW50OworICAgIGNhc2UgRlhfTE9DQUxFTlVNUEFUVEVSTl9DdXJyZW5jeToKKyAgICAgIHJldHVybiBnX0ZYX0N1cnJlbmN5OworICAgIGNhc2UgRlhfTE9DQUxFTlVNUEFUVEVSTl9EZWNpbWFsOgorICAgICAgcmV0dXJuIGdfRlhfRGVjaW1hbDsKKyAgICBjYXNlIEZYX0xPQ0FMRU5VTVBBVFRFUk5fSW50ZWdlcjoKKyAgICAgIHJldHVybiBnX0ZYX0ludGVnZXI7CisgIH0KKyAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKK30KKworQ1hGQV9Ob2RlTG9jYWxlOjpDWEZBX05vZGVMb2NhbGUoQ1hGQV9Ob2RlKiBwTG9jYWxlKSA6IG1fcExvY2FsZShwTG9jYWxlKSB7fQorCitDWEZBX05vZGVMb2NhbGU6On5DWEZBX05vZGVMb2NhbGUoKSB7fQorCitXaWRlU3RyaW5nIENYRkFfTm9kZUxvY2FsZTo6R2V0TmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIFdpZGVTdHJpbmcobV9wTG9jYWxlCisgICAgICAgICAgICAgICAgICAgICAgICA/IG1fcExvY2FsZS0+SlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6TmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cik7Cit9CisKK1dpZGVTdHJpbmcgQ1hGQV9Ob2RlTG9jYWxlOjpHZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0wgZVR5cGUpIGNvbnN0IHsKKyAgc3dpdGNoIChlVHlwZSkgeworICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX0RlY2ltYWw6CisgICAgICByZXR1cm4gR2V0U3ltYm9sKFhGQV9FbGVtZW50OjpOdW1iZXJTeW1ib2xzLCBMImRlY2ltYWwiKTsKKyAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9Hcm91cGluZzoKKyAgICAgIHJldHVybiBHZXRTeW1ib2woWEZBX0VsZW1lbnQ6Ok51bWJlclN5bWJvbHMsIEwiZ3JvdXBpbmciKTsKKyAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9QZXJjZW50OgorICAgICAgcmV0dXJuIEdldFN5bWJvbChYRkFfRWxlbWVudDo6TnVtYmVyU3ltYm9scywgTCJwZXJjZW50Iik7CisgICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfTWludXM6CisgICAgICByZXR1cm4gR2V0U3ltYm9sKFhGQV9FbGVtZW50OjpOdW1iZXJTeW1ib2xzLCBMIm1pbnVzIik7CisgICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfWmVybzoKKyAgICAgIHJldHVybiBHZXRTeW1ib2woWEZBX0VsZW1lbnQ6Ok51bWJlclN5bWJvbHMsIEwiemVybyIpOworICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5U3ltYm9sOgorICAgICAgcmV0dXJuIEdldFN5bWJvbChYRkFfRWxlbWVudDo6Q3VycmVuY3lTeW1ib2xzLCBMInN5bWJvbCIpOworICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX0N1cnJlbmN5TmFtZToKKyAgICAgIHJldHVybiBHZXRTeW1ib2woWEZBX0VsZW1lbnQ6OkN1cnJlbmN5U3ltYm9scywgTCJpc29uYW1lIik7CisgIH0KKyAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKK30KKworV2lkZVN0cmluZyBDWEZBX05vZGVMb2NhbGU6OkdldERhdGVUaW1lU3ltYm9scygpIGNvbnN0IHsKKyAgQ1hGQV9EYXRlVGltZVN5bWJvbHMqIHBTeW1ib2xzID0KKyAgICAgIG1fcExvY2FsZSA/IG1fcExvY2FsZS0+R2V0Q2hpbGQ8Q1hGQV9EYXRlVGltZVN5bWJvbHM+KAorICAgICAgICAgICAgICAgICAgICAgIDAsIFhGQV9FbGVtZW50OjpEYXRlVGltZVN5bWJvbHMsIGZhbHNlKQorICAgICAgICAgICAgICAgIDogbnVsbHB0cjsKKyAgcmV0dXJuIHBTeW1ib2xzID8gcFN5bWJvbHMtPkpTT2JqZWN0KCktPkdldENvbnRlbnQoZmFsc2UpIDogV2lkZVN0cmluZygpOworfQorCitXaWRlU3RyaW5nIENYRkFfTm9kZUxvY2FsZTo6R2V0TW9udGhOYW1lKGludDMyX3Qgbk1vbnRoLCBib29sIGJBYmJyKSBjb25zdCB7CisgIHJldHVybiBHZXRDYWxlbmRhclN5bWJvbChYRkFfRWxlbWVudDo6TW9udGhOYW1lcywgbk1vbnRoLCBiQWJicik7Cit9CisKK1dpZGVTdHJpbmcgQ1hGQV9Ob2RlTG9jYWxlOjpHZXREYXlOYW1lKGludDMyX3QgbldlZWssIGJvb2wgYkFiYnIpIGNvbnN0IHsKKyAgcmV0dXJuIEdldENhbGVuZGFyU3ltYm9sKFhGQV9FbGVtZW50OjpEYXlOYW1lcywgbldlZWssIGJBYmJyKTsKK30KKworV2lkZVN0cmluZyBDWEZBX05vZGVMb2NhbGU6OkdldE1lcmlkaWVtTmFtZShib29sIGJBTSkgY29uc3QgeworICByZXR1cm4gR2V0Q2FsZW5kYXJTeW1ib2woWEZBX0VsZW1lbnQ6Ok1lcmlkaWVtTmFtZXMsIGJBTSA/IDAgOiAxLCBmYWxzZSk7Cit9CisKK0ZYX1RJTUVaT05FIENYRkFfTm9kZUxvY2FsZTo6R2V0VGltZVpvbmUoKSBjb25zdCB7CisgIHJldHVybiBDWEZBX1RpbWVab25lUHJvdmlkZXIoKS5HZXRUaW1lWm9uZSgpOworfQorCitXaWRlU3RyaW5nIENYRkFfTm9kZUxvY2FsZTo6R2V0RXJhTmFtZShib29sIGJBRCkgY29uc3QgeworICByZXR1cm4gR2V0Q2FsZW5kYXJTeW1ib2woWEZBX0VsZW1lbnQ6OkVyYU5hbWVzLCBiQUQgPyAxIDogMCwgZmFsc2UpOworfQorCitXaWRlU3RyaW5nIENYRkFfTm9kZUxvY2FsZTo6R2V0RGF0ZVBhdHRlcm4oCisgICAgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSkgY29uc3QgeworICBzd2l0Y2ggKGVUeXBlKSB7CisgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0OgorICAgICAgcmV0dXJuIEdldFN5bWJvbChYRkFfRWxlbWVudDo6RGF0ZVBhdHRlcm5zLCBMInNob3J0Iik7CisgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bToKKyAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRGVmYXVsdDoKKyAgICAgIHJldHVybiBHZXRTeW1ib2woWEZBX0VsZW1lbnQ6OkRhdGVQYXR0ZXJucywgTCJtZWQiKTsKKyAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbDoKKyAgICAgIHJldHVybiBHZXRTeW1ib2woWEZBX0VsZW1lbnQ6OkRhdGVQYXR0ZXJucywgTCJmdWxsIik7CisgICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0xvbmc6CisgICAgICByZXR1cm4gR2V0U3ltYm9sKFhGQV9FbGVtZW50OjpEYXRlUGF0dGVybnMsIEwibG9uZyIpOworICB9CisgIHJldHVybiBXaWRlU3RyaW5nKCk7Cit9CisKK1dpZGVTdHJpbmcgQ1hGQV9Ob2RlTG9jYWxlOjpHZXRUaW1lUGF0dGVybigKKyAgICBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVUeXBlKSBjb25zdCB7CisgIHN3aXRjaCAoZVR5cGUpIHsKKyAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQ6CisgICAgICByZXR1cm4gR2V0U3ltYm9sKFhGQV9FbGVtZW50OjpUaW1lUGF0dGVybnMsIEwic2hvcnQiKTsKKyAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtOgorICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0OgorICAgICAgcmV0dXJuIEdldFN5bWJvbChYRkFfRWxlbWVudDo6VGltZVBhdHRlcm5zLCBMIm1lZCIpOworICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9GdWxsOgorICAgICAgcmV0dXJuIEdldFN5bWJvbChYRkFfRWxlbWVudDo6VGltZVBhdHRlcm5zLCBMImZ1bGwiKTsKKyAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTG9uZzoKKyAgICAgIHJldHVybiBHZXRTeW1ib2woWEZBX0VsZW1lbnQ6OlRpbWVQYXR0ZXJucywgTCJsb25nIik7CisgIH0KKyAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKK30KKworV2lkZVN0cmluZyBDWEZBX05vZGVMb2NhbGU6OkdldE51bVBhdHRlcm4oRlhfTE9DQUxFTlVNU1VCQ0FURUdPUlkgZVR5cGUpIGNvbnN0IHsKKyAgcmV0dXJuIFhGQV9QYXR0ZXJuVG9TdHJpbmcoZVR5cGUpOworfQorCitDWEZBX05vZGUqIENYRkFfTm9kZUxvY2FsZTo6R2V0Tm9kZUJ5TmFtZShDWEZBX05vZGUqIHBQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NOYW1lKSBjb25zdCB7CisgIENYRkFfTm9kZSogcENoaWxkID0gcFBhcmVudCA/IHBQYXJlbnQtPkdldEZpcnN0Q2hpbGQoKSA6IG51bGxwdHI7CisgIHdoaWxlIChwQ2hpbGQpIHsKKyAgICBpZiAocENoaWxkLT5KU09iamVjdCgpLT5HZXRBdHRyaWJ1dGUoWEZBX0F0dHJpYnV0ZTo6TmFtZSkgPT0gd3NOYW1lKQorICAgICAgcmV0dXJuIHBDaGlsZDsKKworICAgIHBDaGlsZCA9IHBDaGlsZC0+R2V0TmV4dFNpYmxpbmcoKTsKKyAgfQorICByZXR1cm4gbnVsbHB0cjsKK30KKworV2lkZVN0cmluZyBDWEZBX05vZGVMb2NhbGU6OkdldFN5bWJvbChYRkFfRWxlbWVudCBlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHN5bWJvbF90eXBlKSBjb25zdCB7CisgIENYRkFfTm9kZSogcFN5bWJvbHMgPQorICAgICAgbV9wTG9jYWxlID8gbV9wTG9jYWxlLT5HZXRDaGlsZDxDWEZBX05vZGU+KDAsIGVFbGVtZW50LCBmYWxzZSkgOiBudWxscHRyOworICBDWEZBX05vZGUqIHBTeW1ib2wgPSBHZXROb2RlQnlOYW1lKHBTeW1ib2xzLCBzeW1ib2xfdHlwZSk7CisgIHJldHVybiBwU3ltYm9sID8gcFN5bWJvbC0+SlNPYmplY3QoKS0+R2V0Q29udGVudChmYWxzZSkgOiBXaWRlU3RyaW5nKCk7Cit9CisKK1dpZGVTdHJpbmcgQ1hGQV9Ob2RlTG9jYWxlOjpHZXRDYWxlbmRhclN5bWJvbChYRkFfRWxlbWVudCBlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWJicikgY29uc3QgeworICBDWEZBX0NhbGVuZGFyU3ltYm9scyogcENhbGVuZGFyID0KKyAgICAgIG1fcExvY2FsZSA/IG1fcExvY2FsZS0+R2V0Q2hpbGQ8Q1hGQV9DYWxlbmRhclN5bWJvbHM+KAorICAgICAgICAgICAgICAgICAgICAgIDAsIFhGQV9FbGVtZW50OjpDYWxlbmRhclN5bWJvbHMsIGZhbHNlKQorICAgICAgICAgICAgICAgIDogbnVsbHB0cjsKKyAgaWYgKCFwQ2FsZW5kYXIpCisgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKKworICBDWEZBX05vZGUqIHBOb2RlID0gcENhbGVuZGFyLT5HZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX05vZGU+KGVFbGVtZW50KTsKKyAgZm9yICg7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROZXh0U2FtZUNsYXNzU2libGluZzxDWEZBX05vZGU+KGVFbGVtZW50KSkgeworICAgIGlmIChwTm9kZS0+SlNPYmplY3QoKS0+R2V0Qm9vbGVhbihYRkFfQXR0cmlidXRlOjpBYmJyKSA9PSBiQWJicikgeworICAgICAgQ1hGQV9Ob2RlKiBwU3ltYm9sID0KKyAgICAgICAgICBwTm9kZS0+R2V0Q2hpbGQ8Q1hGQV9Ob2RlPihpbmRleCwgWEZBX0VsZW1lbnQ6OlVua25vd24sIGZhbHNlKTsKKyAgICAgIHJldHVybiBwU3ltYm9sID8gcFN5bWJvbC0+SlNPYmplY3QoKS0+R2V0Q29udGVudChmYWxzZSkgOiBXaWRlU3RyaW5nKCk7CisgICAgfQorICB9CisgIHJldHVybiBXaWRlU3RyaW5nKCk7Cit9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlbG9jYWxlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlbG9jYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY3OWU0YQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX25vZGVsb2NhbGUuaApAQCAtMCwwICsxLDUxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTk9ERUxPQ0FMRV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9OT0RFTE9DQUxFX0hfCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2lmeF9sb2NhbGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9meGZhX2Jhc2ljLmgiCisKK2NsYXNzIENYRkFfTm9kZTsKKworV2lkZVN0cmluZyBYRkFfUGF0dGVyblRvU3RyaW5nKEZYX0xPQ0FMRU5VTVNVQkNBVEVHT1JZIGNhdGVnb3J5KTsKKworY2xhc3MgQ1hGQV9Ob2RlTG9jYWxlIDogcHVibGljIElGWF9Mb2NhbGUgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgQ1hGQV9Ob2RlTG9jYWxlKENYRkFfTm9kZSogcExvY2FsZSk7CisgIH5DWEZBX05vZGVMb2NhbGUoKSBvdmVycmlkZTsKKworICAvLyBJRlhfTG9jYWxlCisgIFdpZGVTdHJpbmcgR2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICBXaWRlU3RyaW5nIEdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTCBlVHlwZSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgV2lkZVN0cmluZyBHZXREYXRlVGltZVN5bWJvbHMoKSBjb25zdCBvdmVycmlkZTsKKyAgV2lkZVN0cmluZyBHZXRNb250aE5hbWUoaW50MzJfdCBuTW9udGgsIGJvb2wgYkFiYnIpIGNvbnN0IG92ZXJyaWRlOworICBXaWRlU3RyaW5nIEdldERheU5hbWUoaW50MzJfdCBuV2VlaywgYm9vbCBiQWJicikgY29uc3Qgb3ZlcnJpZGU7CisgIFdpZGVTdHJpbmcgR2V0TWVyaWRpZW1OYW1lKGJvb2wgYkFNKSBjb25zdCBvdmVycmlkZTsKKyAgRlhfVElNRVpPTkUgR2V0VGltZVpvbmUoKSBjb25zdCBvdmVycmlkZTsKKyAgV2lkZVN0cmluZyBHZXRFcmFOYW1lKGJvb2wgYkFEKSBjb25zdCBvdmVycmlkZTsKKworICBXaWRlU3RyaW5nIEdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUpIGNvbnN0IG92ZXJyaWRlOworICBXaWRlU3RyaW5nIEdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUpIGNvbnN0IG92ZXJyaWRlOworICBXaWRlU3RyaW5nIEdldE51bVBhdHRlcm4oRlhfTE9DQUxFTlVNU1VCQ0FURUdPUlkgZVR5cGUpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgQ1hGQV9Ob2RlKiBHZXROb2RlQnlOYW1lKENYRkFfTm9kZSogcFBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c05hbWUpIGNvbnN0OworICBXaWRlU3RyaW5nIEdldFN5bWJvbChYRkFfRWxlbWVudCBlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHN5bWJvbF90eXBlKSBjb25zdDsKKyAgV2lkZVN0cmluZyBHZXRDYWxlbmRhclN5bWJvbChYRkFfRWxlbWVudCBlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWJicikgY29uc3Q7CisKKyAgVW5vd25lZFB0cjxDWEZBX05vZGU+IGNvbnN0IG1fcExvY2FsZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTk9ERUxPQ0FMRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtYmVyb2Zjb3BpZXMuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtYmVyb2Zjb3BpZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5Nzg4NTkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1iZXJvZmNvcGllcy5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtYmVyb2Zjb3BpZXMuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMIm51bWJlck9mQ29waWVzIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfTnVtYmVyT2ZDb3BpZXM6OkNYRkFfTnVtYmVyT2ZDb3BpZXMoQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6Ok51bWJlck9mQ29waWVzLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfTnVtYmVyT2ZDb3BpZXM6On5DWEZBX051bWJlck9mQ29waWVzKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX251bWJlcm9mY29waWVzLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1iZXJvZmNvcGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YmI1OTkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1iZXJvZmNvcGllcy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9OVU1CRVJPRkNPUElFU19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9OVU1CRVJPRkNPUElFU19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX051bWJlck9mQ29waWVzIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX051bWJlck9mQ29waWVzKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfTnVtYmVyT2ZDb3BpZXMoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTlVNQkVST0ZDT1BJRVNfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX251bWJlcnBhdHRlcm4uY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtYmVycGF0dGVybi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVlMjY5OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX251bWJlcnBhdHRlcm4uY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX251bWJlcnBhdHRlcm4uaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06Ok51bWVyaWN9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJudW1iZXJQYXR0ZXJuIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfTnVtYmVyUGF0dGVybjo6Q1hGQV9OdW1iZXJQYXR0ZXJuKENYRkFfRG9jdW1lbnQqIGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6TnVtYmVyUGF0dGVybiwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX051bWJlclBhdHRlcm46On5DWEZBX051bWJlclBhdHRlcm4oKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtYmVycGF0dGVybi5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtYmVycGF0dGVybi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNGZhYmQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1iZXJwYXR0ZXJuLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX05VTUJFUlBBVFRFUk5fSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTlVNQkVSUEFUVEVSTl9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX051bWJlclBhdHRlcm4gOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfTnVtYmVyUGF0dGVybihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX051bWJlclBhdHRlcm4oKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTlVNQkVSUEFUVEVSTl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtYmVycGF0dGVybnMuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtYmVycGF0dGVybnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZjgzNzMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1iZXJwYXR0ZXJucy5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtYmVycGF0dGVybnMuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0geworICAgIHtYRkFfRWxlbWVudDo6TnVtYmVyUGF0dGVybiwgNCwgMH0sCisgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMIm51bWJlclBhdHRlcm5zIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfTnVtYmVyUGF0dGVybnM6OkNYRkFfTnVtYmVyUGF0dGVybnMoQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6TnVtYmVyUGF0dGVybnMsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX051bWJlclBhdHRlcm5zOjp+Q1hGQV9OdW1iZXJQYXR0ZXJucygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1iZXJwYXR0ZXJucy5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtYmVycGF0dGVybnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjRmODg5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtYmVycGF0dGVybnMuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTlVNQkVSUEFUVEVSTlNfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTlVNQkVSUEFUVEVSTlNfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9OdW1iZXJQYXR0ZXJucyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9OdW1iZXJQYXR0ZXJucyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX051bWJlclBhdHRlcm5zKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX05VTUJFUlBBVFRFUk5TX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1iZXJzeW1ib2wuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtYmVyc3ltYm9sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGZkYzFiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtYmVyc3ltYm9sLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1iZXJzeW1ib2wuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OkRlY2ltYWx9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJudW1iZXJTeW1ib2wiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9OdW1iZXJTeW1ib2w6OkNYRkFfTnVtYmVyU3ltYm9sKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpOdW1iZXJTeW1ib2wsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9OdW1iZXJTeW1ib2w6On5DWEZBX051bWJlclN5bWJvbCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1iZXJzeW1ib2wuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX251bWJlcnN5bWJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNjRiMDMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1iZXJzeW1ib2wuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTlVNQkVSU1lNQk9MX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX05VTUJFUlNZTUJPTF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX051bWJlclN5bWJvbCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9OdW1iZXJTeW1ib2woQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9OdW1iZXJTeW1ib2woKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTlVNQkVSU1lNQk9MX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1iZXJzeW1ib2xzLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX251bWJlcnN5bWJvbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMjdmNjkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1iZXJzeW1ib2xzLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1iZXJzeW1ib2xzLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHsKKyAgICB7WEZBX0VsZW1lbnQ6Ok51bWJlclN5bWJvbCwgNSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMIm51bWJlclN5bWJvbHMiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9OdW1iZXJTeW1ib2xzOjpDWEZBX051bWJlclN5bWJvbHMoQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6Ok51bWJlclN5bWJvbHMsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX051bWJlclN5bWJvbHM6On5DWEZBX051bWJlclN5bWJvbHMoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtYmVyc3ltYm9scy5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtYmVyc3ltYm9scy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MmRmOWYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1iZXJzeW1ib2xzLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX05VTUJFUlNZTUJPTFNfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTlVNQkVSU1lNQk9MU19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX051bWJlclN5bWJvbHMgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfTnVtYmVyU3ltYm9scyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX051bWJlclN5bWJvbHMoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTlVNQkVSU1lNQk9MU19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtZXJpY2VkaXQuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtZXJpY2VkaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNjVjNzYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1lcmljZWRpdC5jcHAKQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbnVtZXJpY2VkaXQuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9udW1lcmljZWRpdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0ge3tYRkFfRWxlbWVudDo6TWFyZ2luLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OkJvcmRlciwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpDb21iLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SFNjcm9sbFBvbGljeSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6QXV0b30sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMIm51bWVyaWNFZGl0IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfTnVtZXJpY0VkaXQ6OkNYRkFfTnVtZXJpY0VkaXQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6Ok51bWVyaWNFZGl0LAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9OdW1lcmljRWRpdD4odGhpcykpIHt9CisKK0NYRkFfTnVtZXJpY0VkaXQ6On5DWEZBX051bWVyaWNFZGl0KCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX251bWVyaWNlZGl0LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1lcmljZWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5Y2ZkN2UKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9udW1lcmljZWRpdC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9OVU1FUklDRURJVF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9OVU1FUklDRURJVF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX051bWVyaWNFZGl0IDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX051bWVyaWNFZGl0KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfTnVtZXJpY0VkaXQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfTlVNRVJJQ0VESVRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX29iamVjdC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vYmplY3QuY3BwCmluZGV4IGM4Y2QzNTQuLjdjNzNkYjAgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX29iamVjdC5jcHAKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb2JqZWN0LmNwcApAQCAtNCw3MCArNCw2NiBAQAogCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vYmplY3QuaCIKIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAiZnhqcy9jZnhqc2VfZW5naW5lLmgiCiAjaW5jbHVkZSAiZnhqcy9jZnhqc2VfdmFsdWUuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2Zmbm90aWZ5LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZub3RpZnkuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmVlbGlzdC5oIgogCiBDWEZBX09iamVjdDo6Q1hGQV9PYmplY3QoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlIG9iamVjdFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQgZWxlbWVudFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBlbGVtZW50TmFtZSkKLSAgICA6IG1fcERvY3VtZW50KHBEb2N1bWVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGVsZW1lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSlhfT2JqZWN0PiBqc09iamVjdCkKKyAgICA6IENGWEpTRV9Ib3N0T2JqZWN0KGtYRkEpLAorICAgICAgbV9wRG9jdW1lbnQocERvY3VtZW50KSwKICAgICAgIG1fb2JqZWN0VHlwZShvYmplY3RUeXBlKSwKICAgICAgIG1fZWxlbWVudFR5cGUoZWxlbWVudFR5cGUpLAogICAgICAgbV9lbGVtZW50TmFtZUhhc2goRlhfSGFzaENvZGVfR2V0VyhlbGVtZW50TmFtZSwgZmFsc2UpKSwKLSAgICAgIG1fZWxlbWVudE5hbWUoZWxlbWVudE5hbWUpIHt9CisgICAgICBtX2VsZW1lbnROYW1lKGVsZW1lbnROYW1lKSwKKyAgICAgIG1fcEpTT2JqZWN0KHN0ZDo6bW92ZShqc09iamVjdCkpIHt9CiAKIENYRkFfT2JqZWN0Ojp+Q1hGQV9PYmplY3QoKSB7fQogCi1DRlhfV2lkZVN0cmluZ0MgQ1hGQV9PYmplY3Q6OkdldENsYXNzTmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fZWxlbWVudE5hbWU7CitXaWRlU3RyaW5nIENYRkFfT2JqZWN0OjpHZXRTT01FeHByZXNzaW9uKCkgeworICBDRlhKU0VfRW5naW5lKiBwU2NyaXB0Q29udGV4dCA9IG1fcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCk7CisgIGlmICghcFNjcmlwdENvbnRleHQpCisgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKKworICByZXR1cm4gcFNjcmlwdENvbnRleHQtPkdldFNvbUV4cHJlc3Npb24oVG9Ob2RlKHRoaXMpKTsKIH0KIAotdWludDMyX3QgQ1hGQV9PYmplY3Q6OkdldENsYXNzSGFzaENvZGUoKSBjb25zdCB7Ci0gIHJldHVybiBtX2VsZW1lbnROYW1lSGFzaDsKK0NYRkFfTm9kZSogQ1hGQV9PYmplY3Q6OkFzTm9kZSgpIHsKKyAgcmV0dXJuIElzTm9kZSgpID8gc3RhdGljX2Nhc3Q8Q1hGQV9Ob2RlKj4odGhpcykgOiBudWxscHRyOwogfQogCi1YRkFfRWxlbWVudCBDWEZBX09iamVjdDo6R2V0RWxlbWVudFR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBtX2VsZW1lbnRUeXBlOworQ1hGQV9UcmVlTGlzdCogQ1hGQV9PYmplY3Q6OkFzVHJlZUxpc3QoKSB7CisgIHJldHVybiBJc1RyZWVMaXN0KCkgPyBzdGF0aWNfY2FzdDxDWEZBX1RyZWVMaXN0Kj4odGhpcykgOiBudWxscHRyOwogfQogCi12b2lkIENYRkFfT2JqZWN0OjpTY3JpcHRfT2JqZWN0Q2xhc3NfQ2xhc3NOYW1lKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpIHsKLSAgaWYgKGJTZXR0aW5nKSB7Ci0gICAgVGhyb3dJbnZhbGlkUHJvcGVydHlFeGNlcHRpb24oKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgcFZhbHVlLT5TZXRTdHJpbmcoRlhfVVRGOEVuY29kZShHZXRDbGFzc05hbWUoKSkuQXNTdHJpbmdDKCkpOworY29uc3QgQ1hGQV9Ob2RlKiBDWEZBX09iamVjdDo6QXNOb2RlKCkgY29uc3QgeworICByZXR1cm4gSXNOb2RlKCkgPyBzdGF0aWNfY2FzdDxjb25zdCBDWEZBX05vZGUqPih0aGlzKSA6IG51bGxwdHI7CiB9CiAKLXZvaWQgQ1hGQV9PYmplY3Q6OlRocm93SW52YWxpZFByb3BlcnR5RXhjZXB0aW9uKCkgY29uc3QgewotICBUaHJvd0V4Y2VwdGlvbihMIkludmFsaWQgcHJvcGVydHkgc2V0IG9wZXJhdGlvbi4iKTsKK2NvbnN0IENYRkFfVHJlZUxpc3QqIENYRkFfT2JqZWN0OjpBc1RyZWVMaXN0KCkgY29uc3QgeworICByZXR1cm4gSXNUcmVlTGlzdCgpID8gc3RhdGljX2Nhc3Q8Y29uc3QgQ1hGQV9UcmVlTGlzdCo+KHRoaXMpIDogbnVsbHB0cjsKIH0KIAotdm9pZCBDWEZBX09iamVjdDo6VGhyb3dJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCkgY29uc3QgewotICBUaHJvd0V4Y2VwdGlvbihMIkluZGV4IHZhbHVlIGlzIG91dCBvZiBib3VuZHMuIik7Cit2b2lkIENYRkFfT2JqZWN0OjpDcmVhdGVXaWRnZXRBY2MoKSB7CisgIGFjY18gPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9XaWRnZXRBY2M+KEFzTm9kZSgpKTsKIH0KIAotdm9pZCBDWEZBX09iamVjdDo6VGhyb3dQYXJhbUNvdW50TWlzbWF0Y2hFeGNlcHRpb24oCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG1ldGhvZCkgY29uc3QgewotICBUaHJvd0V4Y2VwdGlvbihMIkluY29ycmVjdCBudW1iZXIgb2YgcGFyYW1ldGVycyBjYWxsaW5nIG1ldGhvZCAnJXMnLiIsCi0gICAgICAgICAgICAgICAgIG1ldGhvZC5jX3N0cigpKTsKK0NYRkFfTm9kZSogVG9Ob2RlKENYRkFfT2JqZWN0KiBwT2JqKSB7CisgIHJldHVybiBwT2JqID8gcE9iai0+QXNOb2RlKCkgOiBudWxscHRyOwogfQogCi12b2lkIENYRkFfT2JqZWN0OjpUaHJvd0FyZ3VtZW50TWlzbWF0Y2hFeGNlcHRpb24oKSBjb25zdCB7Ci0gIFRocm93RXhjZXB0aW9uKEwiQXJndW1lbnQgbWlzbWF0Y2ggaW4gcHJvcGVydHkgb3IgZnVuY3Rpb24gYXJndW1lbnQuIik7Ci19Ci0KLXZvaWQgQ1hGQV9PYmplY3Q6OlRocm93RXhjZXB0aW9uKGNvbnN0IEZYX1dDSEFSKiBzdHIsIC4uLikgY29uc3QgewotICBDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2U7Ci0gIHZhX2xpc3QgYXJnX3B0cjsKLSAgdmFfc3RhcnQoYXJnX3B0ciwgc3RyKTsKLSAgd3NNZXNzYWdlLkZvcm1hdFYoc3RyLCBhcmdfcHRyKTsKLSAgdmFfZW5kKGFyZ19wdHIpOwotICBGWEpTRV9UaHJvd01lc3NhZ2Uod3NNZXNzYWdlLlVURjhFbmNvZGUoKS5Bc1N0cmluZ0MoKSk7Citjb25zdCBDWEZBX05vZGUqIFRvTm9kZShjb25zdCBDWEZBX09iamVjdCogcE9iaikgeworICByZXR1cm4gcE9iaiA/IHBPYmotPkFzTm9kZSgpIDogbnVsbHB0cjsKIH0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX29iamVjdC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1ZjMxYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX29iamVjdC5oCkBAIC0wLDAgKzEsMTExIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfT0JKRUNUX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX09CSkVDVF9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKKyNpbmNsdWRlICJmeGpzL2Z4anNlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvZnhmYV9iYXNpYy5oIgorCitlbnVtIGNsYXNzIFhGQV9PYmplY3RUeXBlIHsKKyAgT2JqZWN0LAorICBMaXN0LAorICBOb2RlLAorICBOb2RlQywKKyAgTm9kZVYsCisgIE1vZGVsTm9kZSwKKyAgVGV4dE5vZGUsCisgIFRyZWVMaXN0LAorICBDb250YWluZXJOb2RlLAorICBDb250ZW50Tm9kZSwKKyAgVmFyaWFibGVzVGhpcworfTsKKworY2xhc3MgQ0pYX09iamVjdDsKK2NsYXNzIENYRkFfRG9jdW1lbnQ7CitjbGFzcyBDWEZBX05vZGU7CitjbGFzcyBDWEZBX1RyZWVMaXN0OworY2xhc3MgQ1hGQV9XaWRnZXRBY2M7CisKK2NsYXNzIENYRkFfT2JqZWN0IDogcHVibGljIENGWEpTRV9Ib3N0T2JqZWN0IHsKKyBwdWJsaWM6CisgIH5DWEZBX09iamVjdCgpIG92ZXJyaWRlOworCisgIENYRkFfRG9jdW1lbnQqIEdldERvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gbV9wRG9jdW1lbnQuR2V0KCk7IH0KKyAgWEZBX09iamVjdFR5cGUgR2V0T2JqZWN0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fb2JqZWN0VHlwZTsgfQorCisgIGJvb2wgSXNOb2RlKCkgY29uc3QgeworICAgIHJldHVybiBtX29iamVjdFR5cGUgPT0gWEZBX09iamVjdFR5cGU6Ok5vZGUgfHwKKyAgICAgICAgICAgbV9vYmplY3RUeXBlID09IFhGQV9PYmplY3RUeXBlOjpOb2RlQyB8fAorICAgICAgICAgICBtX29iamVjdFR5cGUgPT0gWEZBX09iamVjdFR5cGU6Ok5vZGVWIHx8CisgICAgICAgICAgIG1fb2JqZWN0VHlwZSA9PSBYRkFfT2JqZWN0VHlwZTo6TW9kZWxOb2RlIHx8CisgICAgICAgICAgIG1fb2JqZWN0VHlwZSA9PSBYRkFfT2JqZWN0VHlwZTo6VGV4dE5vZGUgfHwKKyAgICAgICAgICAgbV9vYmplY3RUeXBlID09IFhGQV9PYmplY3RUeXBlOjpDb250YWluZXJOb2RlIHx8CisgICAgICAgICAgIG1fb2JqZWN0VHlwZSA9PSBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUgfHwKKyAgICAgICAgICAgbV9vYmplY3RUeXBlID09IFhGQV9PYmplY3RUeXBlOjpWYXJpYWJsZXNUaGlzOworICB9CisgIGJvb2wgSXNUcmVlTGlzdCgpIGNvbnN0IHsgcmV0dXJuIG1fb2JqZWN0VHlwZSA9PSBYRkFfT2JqZWN0VHlwZTo6VHJlZUxpc3Q7IH0KKyAgYm9vbCBJc0NvbnRlbnROb2RlKCkgY29uc3QgeworICAgIHJldHVybiBtX29iamVjdFR5cGUgPT0gWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlOworICB9CisgIGJvb2wgSXNDb250YWluZXJOb2RlKCkgY29uc3QgeworICAgIHJldHVybiBtX29iamVjdFR5cGUgPT0gWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGU7CisgIH0KKyAgYm9vbCBJc01vZGVsTm9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fb2JqZWN0VHlwZSA9PSBYRkFfT2JqZWN0VHlwZTo6TW9kZWxOb2RlOyB9CisgIGJvb2wgSXNOb2RlVigpIGNvbnN0IHsgcmV0dXJuIG1fb2JqZWN0VHlwZSA9PSBYRkFfT2JqZWN0VHlwZTo6Tm9kZVY7IH0KKyAgYm9vbCBJc1ZhcmlhYmxlc1RoaXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fb2JqZWN0VHlwZSA9PSBYRkFfT2JqZWN0VHlwZTo6VmFyaWFibGVzVGhpczsKKyAgfQorCisgIENYRkFfTm9kZSogQXNOb2RlKCk7CisgIENYRkFfVHJlZUxpc3QqIEFzVHJlZUxpc3QoKTsKKworICBjb25zdCBDWEZBX05vZGUqIEFzTm9kZSgpIGNvbnN0OworICBjb25zdCBDWEZBX1RyZWVMaXN0KiBBc1RyZWVMaXN0KCkgY29uc3Q7CisKKyAgQ0pYX09iamVjdCogSlNPYmplY3QoKSB7IHJldHVybiBtX3BKU09iamVjdC5nZXQoKTsgfQorICBjb25zdCBDSlhfT2JqZWN0KiBKU09iamVjdCgpIGNvbnN0IHsgcmV0dXJuIG1fcEpTT2JqZWN0LmdldCgpOyB9CisKKyAgYm9vbCBIYXNDcmVhdGVkVUlXaWRnZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1fZWxlbWVudFR5cGUgPT0gWEZBX0VsZW1lbnQ6OkZpZWxkIHx8CisgICAgICAgICAgIG1fZWxlbWVudFR5cGUgPT0gWEZBX0VsZW1lbnQ6OkRyYXcgfHwKKyAgICAgICAgICAgbV9lbGVtZW50VHlwZSA9PSBYRkFfRWxlbWVudDo6U3ViZm9ybSB8fAorICAgICAgICAgICBtX2VsZW1lbnRUeXBlID09IFhGQV9FbGVtZW50OjpFeGNsR3JvdXA7CisgIH0KKyAgdm9pZCBDcmVhdGVXaWRnZXRBY2MoKTsKKyAgQ1hGQV9XaWRnZXRBY2MqIEdldFdpZGdldEFjYygpIHsgcmV0dXJuIGFjY18uZ2V0KCk7IH0KKworICBYRkFfRWxlbWVudCBHZXRFbGVtZW50VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudFR5cGU7IH0KKyAgV2lkZVN0cmluZ1ZpZXcgR2V0Q2xhc3NOYW1lKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50TmFtZTsgfQorICB1aW50MzJfdCBHZXRDbGFzc0hhc2hDb2RlKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50TmFtZUhhc2g7IH0KKworICBXaWRlU3RyaW5nIEdldFNPTUV4cHJlc3Npb24oKTsKKworIHByb3RlY3RlZDoKKyAgQ1hGQV9PYmplY3QoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LAorICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZSBvYmplY3RUeXBlLAorICAgICAgICAgICAgICBYRkFfRWxlbWVudCBlVHlwZSwKKyAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIGVsZW1lbnROYW1lLAorICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0pYX09iamVjdD4ganNPYmplY3QpOworCisgIFVub3duZWRQdHI8Q1hGQV9Eb2N1bWVudD4gY29uc3QgbV9wRG9jdW1lbnQ7CisgIGNvbnN0IFhGQV9PYmplY3RUeXBlIG1fb2JqZWN0VHlwZTsKKyAgY29uc3QgWEZBX0VsZW1lbnQgbV9lbGVtZW50VHlwZTsKKworICBjb25zdCB1aW50MzJfdCBtX2VsZW1lbnROYW1lSGFzaDsKKyAgY29uc3QgV2lkZVN0cmluZ1ZpZXcgbV9lbGVtZW50TmFtZTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Q0pYX09iamVjdD4gbV9wSlNPYmplY3Q7CisgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX1dpZGdldEFjYz4gYWNjXzsKK307CisKK0NYRkFfTm9kZSogVG9Ob2RlKENYRkFfT2JqZWN0KiBwT2JqKTsKK2NvbnN0IENYRkFfTm9kZSogVG9Ob2RlKGNvbnN0IENYRkFfT2JqZWN0KiBwT2JqKTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9PQkpFQ1RfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX29jY3VyLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX29jY3VyLmNwcAppbmRleCBhODk5NDIyLi43YmUzZjcwIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vY2N1ci5jcHAKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb2NjdXIuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKQEAgLTYsNjIgKzYsNzYgQEAKIAogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX29jY3VyLmgiCiAKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9vY2N1ci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAotQ1hGQV9PY2N1cjo6Q1hGQV9PY2N1cihDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30KK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok1heCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikxfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TWluLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTF9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkluaXRpYWwsIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMX0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMIm9jY3VyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfT2NjdXI6OkNYRkFfT2NjdXIoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6Ok9jY3VyLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9PY2N1cj4odGhpcykpIHt9CisKK0NYRkFfT2NjdXI6On5DWEZBX09jY3VyKCkge30KIAogaW50MzJfdCBDWEZBX09jY3VyOjpHZXRNYXgoKSB7Ci0gIGludDMyX3QgaU1heCA9IDE7Ci0gIGlmIChtX3BOb2RlKSB7Ci0gICAgaWYgKCFtX3BOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4LCBpTWF4LCB0cnVlKSkKLSAgICAgIGlNYXggPSBHZXRNaW4oKTsKLSAgfQotICByZXR1cm4gaU1heDsKKyAgT3B0aW9uYWw8aW50MzJfdD4gbWF4ID0gSlNPYmplY3QoKS0+VHJ5SW50ZWdlcihYRkFfQXR0cmlidXRlOjpNYXgsIHRydWUpOworICByZXR1cm4gbWF4ID8gKm1heCA6IEdldE1pbigpOwogfQogCiBpbnQzMl90IENYRkFfT2NjdXI6OkdldE1pbigpIHsKLSAgaW50MzJfdCBpTWluID0gMTsKLSAgaWYgKG1fcE5vZGUpIHsKLSAgICBpZiAoIW1fcE5vZGUtPlRyeUludGVnZXIoWEZBX0FUVFJJQlVURV9NaW4sIGlNaW4sIHRydWUpIHx8IGlNaW4gPCAwKQotICAgICAgaU1pbiA9IDE7Ci0gIH0KLSAgcmV0dXJuIGlNaW47CisgIE9wdGlvbmFsPGludDMyX3Q+IG1pbiA9IEpTT2JqZWN0KCktPlRyeUludGVnZXIoWEZBX0F0dHJpYnV0ZTo6TWluLCB0cnVlKTsKKyAgcmV0dXJuIG1pbiAmJiAqbWluID49IDAgPyAqbWluIDogMTsKIH0KIAotYm9vbCBDWEZBX09jY3VyOjpHZXRPY2N1ckluZm8oaW50MzJfdCYgaU1pbiwgaW50MzJfdCYgaU1heCwgaW50MzJfdCYgaUluaXQpIHsKLSAgaWYgKCFtX3BOb2RlKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCFtX3BOb2RlLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWluLCBpTWluLCBmYWxzZSkgfHwgaU1pbiA8IDApCi0gICAgaU1pbiA9IDE7Ci0gIGlmICghbV9wTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX01heCwgaU1heCwgZmFsc2UpKSB7Ci0gICAgaWYgKGlNaW4gPT0gMCkKLSAgICAgIGlNYXggPSAxOwotICAgIGVsc2UKLSAgICAgIGlNYXggPSBpTWluOwotICB9Ci0gIGlmICghbV9wTm9kZS0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX0luaXRpYWwsIGlJbml0LCBmYWxzZSkgfHwKLSAgICAgIGlJbml0IDwgaU1pbikgewotICAgIGlJbml0ID0gaU1pbjsKLSAgfQotICByZXR1cm4gdHJ1ZTsKK3N0ZDo6dHVwbGU8aW50MzJfdCwgaW50MzJfdCwgaW50MzJfdD4gQ1hGQV9PY2N1cjo6R2V0T2NjdXJJbmZvKCkgeworICBpbnQzMl90IGlNaW4gPSBHZXRNaW4oKTsKKyAgaW50MzJfdCBpTWF4ID0gR2V0TWF4KCk7CisKKyAgT3B0aW9uYWw8aW50MzJfdD4gaW5pdCA9CisgICAgICBKU09iamVjdCgpLT5UcnlJbnRlZ2VyKFhGQV9BdHRyaWJ1dGU6OkluaXRpYWwsIGZhbHNlKTsKKyAgcmV0dXJuIHtpTWluLCBpTWF4LCBpbml0ICYmICppbml0ID49IGlNaW4gPyAqaW5pdCA6IGlNaW59OwogfQogCiB2b2lkIENYRkFfT2NjdXI6OlNldE1heChpbnQzMl90IGlNYXgpIHsKICAgaU1heCA9IChpTWF4ICE9IC0xICYmIGlNYXggPCAxKSA/IDEgOiBpTWF4OwotICBtX3BOb2RlLT5TZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTWF4LCBpTWF4LCBmYWxzZSk7CisgIEpTT2JqZWN0KCktPlNldEludGVnZXIoWEZBX0F0dHJpYnV0ZTo6TWF4LCBpTWF4LCBmYWxzZSk7CisKICAgaW50MzJfdCBpTWluID0gR2V0TWluKCk7CiAgIGlmIChpTWF4ICE9IC0xICYmIGlNYXggPCBpTWluKSB7CiAgICAgaU1pbiA9IGlNYXg7Ci0gICAgbV9wTm9kZS0+U2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX01pbiwgaU1pbiwgZmFsc2UpOworICAgIEpTT2JqZWN0KCktPlNldEludGVnZXIoWEZBX0F0dHJpYnV0ZTo6TWluLCBpTWluLCBmYWxzZSk7CiAgIH0KIH0KIAogdm9pZCBDWEZBX09jY3VyOjpTZXRNaW4oaW50MzJfdCBpTWluKSB7CiAgIGlNaW4gPSAoaU1pbiA8IDApID8gMSA6IGlNaW47Ci0gIG1fcE5vZGUtPlNldEludGVnZXIoWEZBX0FUVFJJQlVURV9NaW4sIGlNaW4sIGZhbHNlKTsKKyAgSlNPYmplY3QoKS0+U2V0SW50ZWdlcihYRkFfQXR0cmlidXRlOjpNaW4sIGlNaW4sIGZhbHNlKTsKKwogICBpbnQzMl90IGlNYXggPSBHZXRNYXgoKTsKICAgaWYgKGlNYXggPiAwICYmIGlNYXggPCBpTWluKSB7CiAgICAgaU1heCA9IGlNaW47Ci0gICAgbV9wTm9kZS0+U2V0SW50ZWdlcihYRkFfQVRUUklCVVRFX01heCwgaU1heCwgZmFsc2UpOworICAgIEpTT2JqZWN0KCktPlNldEludGVnZXIoWEZBX0F0dHJpYnV0ZTo6TWF4LCBpTWF4LCBmYWxzZSk7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX29jY3VyLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vY2N1ci5oCmluZGV4IDY5ZGIwNzEuLjA3MGMxNWMgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX29jY3VyLmgKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb2NjdXIuaApAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCkBAIC03LDIwICs3LDI1IEBACiAjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX09DQ1VSX0hfCiAjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX09DQ1VSX0hfCiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGEuaCIKKyNpbmNsdWRlIDx0dXBsZT4KIAotY2xhc3MgQ1hGQV9Ob2RlOworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKIAotY2xhc3MgQ1hGQV9PY2N1ciA6IHB1YmxpYyBDWEZBX0RhdGEgeworY2xhc3MgQ1hGQV9PY2N1ciA6IHB1YmxpYyBDWEZBX05vZGUgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9PY2N1cihDWEZBX05vZGUqIHBOb2RlKTsKKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0TWF4ID0gMTsKKyAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0TWluID0gMTsKKworICBDWEZBX09jY3VyKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfT2NjdXIoKSBvdmVycmlkZTsKIAogICBpbnQzMl90IEdldE1heCgpOwotICBpbnQzMl90IEdldE1pbigpOwotICBib29sIEdldE9jY3VySW5mbyhpbnQzMl90JiBpTWluLCBpbnQzMl90JiBpTWF4LCBpbnQzMl90JiBpSW5pdCk7CiAgIHZvaWQgU2V0TWF4KGludDMyX3QgaU1heCk7CisKKyAgaW50MzJfdCBHZXRNaW4oKTsKICAgdm9pZCBTZXRNaW4oaW50MzJfdCBpTWluKTsKKworICBzdGQ6OnR1cGxlPGludDMyX3QsIGludDMyX3QsIGludDMyX3Q+IEdldE9jY3VySW5mbygpOwogfTsKIAogI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9PQ0NVUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb2lkLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX29pZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIwMmU0MAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX29pZC5jcHAKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb2lkLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfb2lkLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwib2lkIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfT2lkOjpDWEZBX09pZChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6VGV4dE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6Ok9pZCwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfT2lkPih0aGlzKSkge30KKworQ1hGQV9PaWQ6On5DWEZBX09pZCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vaWQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX29pZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YWJmOGIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vaWQuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfT0lEX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX09JRF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX09pZCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9PaWQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9PaWQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfT0lEX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vaWRzLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX29pZHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZDJhNmQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vaWRzLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vaWRzLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfb2lkcy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlR5cGUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06Ok9wdGlvbmFsfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwib2lkcyI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX09pZHM6OkNYRkFfT2lkcyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6T2lkcywKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfT2lkcz4odGhpcykpIHt9CisKK0NYRkFfT2lkczo6fkNYRkFfT2lkcygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vaWRzLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vaWRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M4Y2Q5YwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX29pZHMuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfT0lEU19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9PSURTX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfT2lkcyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9PaWRzKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfT2lkcygpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9PSURTX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vcGVuYWN0aW9uLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX29wZW5hY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MGY0MzMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vcGVuYWN0aW9uLmNwcApAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vcGVuYWN0aW9uLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHsKKyAgICB7WEZBX0VsZW1lbnQ6OkRlc3RpbmF0aW9uLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJvcGVuQWN0aW9uIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfT3BlbkFjdGlvbjo6Q1hGQV9PcGVuQWN0aW9uKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6Ok9wZW5BY3Rpb24sCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9PcGVuQWN0aW9uOjp+Q1hGQV9PcGVuQWN0aW9uKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX29wZW5hY3Rpb24uaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX29wZW5hY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODRlYjI5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3BlbmFjdGlvbi5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9PUEVOQUNUSU9OX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX09QRU5BQ1RJT05fSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9PcGVuQWN0aW9uIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX09wZW5BY3Rpb24oQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9PcGVuQWN0aW9uKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX09QRU5BQ1RJT05fSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX29wZXJhdGlvbi5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vcGVyYXRpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOTJkOGMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vcGVyYXRpb24uY3BwCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX29wZXJhdGlvbi5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X29wZXJhdGlvbi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok91dHB1dCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SW5wdXQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMIm9wZXJhdGlvbiI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX09wZXJhdGlvbjo6Q1hGQV9PcGVyYXRpb24oQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OlRleHROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX09wZXJhdGlvbj4odGhpcykpIHt9CisKK0NYRkFfT3BlcmF0aW9uOjp+Q1hGQV9PcGVyYXRpb24oKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3BlcmF0aW9uLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vcGVyYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTRhMzU0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3BlcmF0aW9uLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX09QRVJBVElPTl9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9PUEVSQVRJT05fSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9PcGVyYXRpb24gOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfT3BlcmF0aW9uKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfT3BlcmF0aW9uKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX09QRVJBVElPTl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3V0cHV0LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX291dHB1dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI0ZDdlNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX291dHB1dC5jcHAKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3V0cHV0LmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6OlRvLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVyaSwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpUeXBlLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJvdXRwdXQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9PdXRwdXQ6OkNYRkFfT3V0cHV0KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6Ok91dHB1dCwKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX091dHB1dDo6fkNYRkFfT3V0cHV0KCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX291dHB1dC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3V0cHV0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmViMTM5MQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX291dHB1dC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9PVVRQVVRfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfT1VUUFVUX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfT3V0cHV0IDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX091dHB1dChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX091dHB1dCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9PVVRQVVRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX291dHB1dGJpbi5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vdXRwdXRiaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMGVmMmUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vdXRwdXRiaW4uY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX291dHB1dGJpbi5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwib3V0cHV0QmluIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfT3V0cHV0QmluOjpDWEZBX091dHB1dEJpbihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6T3V0cHV0QmluLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfT3V0cHV0QmluOjp+Q1hGQV9PdXRwdXRCaW4oKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3V0cHV0YmluLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vdXRwdXRiaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWExYWUwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3V0cHV0YmluLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX09VVFBVVEJJTl9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9PVVRQVVRCSU5fSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9PdXRwdXRCaW4gOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfT3V0cHV0QmluKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfT3V0cHV0QmluKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX09VVFBVVEJJTl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3V0cHV0eHNsLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX291dHB1dHhzbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU2Y2MxNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX291dHB1dHhzbC5jcHAKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3V0cHV0eHNsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6OlVyaSwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwib3V0cHV0WFNMIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfT3V0cHV0WFNMOjpDWEZBX091dHB1dFhTTChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpPdXRwdXRYU0wsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9PdXRwdXRYU0w6On5DWEZBX091dHB1dFhTTCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vdXRwdXR4c2wuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX291dHB1dHhzbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MzU1MjMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vdXRwdXR4c2wuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfT1VUUFVUWFNMX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX09VVFBVVFhTTF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX091dHB1dFhTTCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9PdXRwdXRYU0woQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9PdXRwdXRYU0woKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfT1VUUFVUWFNMX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vdmVyZmxvdy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vdmVyZmxvdy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4OTcxNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX292ZXJmbG93LmNwcApAQCAtMCwwICsxLDM4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vdmVyZmxvdy5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X292ZXJmbG93LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VHJhaWxlciwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VGFyZ2V0LCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMZWFkZXIsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMIm92ZXJmbG93IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfT3ZlcmZsb3c6OkNYRkFfT3ZlcmZsb3coQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6Ok92ZXJmbG93LAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9PdmVyZmxvdz4odGhpcykpIHt9CisKK0NYRkFfT3ZlcmZsb3c6On5DWEZBX092ZXJmbG93KCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX292ZXJmbG93LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vdmVyZmxvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NjI3YmEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vdmVyZmxvdy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9PVkVSRkxPV19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9PVkVSRkxPV19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX092ZXJmbG93IDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX092ZXJmbG93KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfT3ZlcmZsb3coKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfT1ZFUkZMT1dfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX292ZXJwcmludC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vdmVycHJpbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNWVlNGIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vdmVycHJpbnQuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX292ZXJwcmludC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwib3ZlcnByaW50IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfT3ZlcnByaW50OjpDWEZBX092ZXJwcmludChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6T3ZlcnByaW50LAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfT3ZlcnByaW50Ojp+Q1hGQV9PdmVycHJpbnQoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3ZlcnByaW50LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9vdmVycHJpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWVjMjQxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb3ZlcnByaW50LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX09WRVJQUklOVF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9PVkVSUFJJTlRfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9PdmVycHJpbnQgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfT3ZlcnByaW50KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfT3ZlcnByaW50KCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX09WRVJQUklOVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFja2V0LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhY2tldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjExMjI3MQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhY2tldC5jcHAKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFja2V0LmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfcGFja2V0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJwYWNrZXQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9QYWNrZXQ6OkNYRkFfUGFja2V0KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9YRFAsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVDLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpQYWNrZXQsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfUGFja2V0Pih0aGlzKSkge30KKworQ1hGQV9QYWNrZXQ6On5DWEZBX1BhY2tldCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWNrZXQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhY2tldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZGE2MWQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWNrZXQuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUEFDS0VUX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BBQ0tFVF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1BhY2tldCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9QYWNrZXQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9QYWNrZXQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUEFDS0VUX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWNrZXRzLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhY2tldHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYjhiMTkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWNrZXRzLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWNrZXRzLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJwYWNrZXRzIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfUGFja2V0czo6Q1hGQV9QYWNrZXRzKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpQYWNrZXRzLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfUGFja2V0czo6fkNYRkFfUGFja2V0cygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWNrZXRzLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWNrZXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJmMjliNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhY2tldHMuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUEFDS0VUU19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QQUNLRVRTX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfUGFja2V0cyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9QYWNrZXRzKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfUGFja2V0cygpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QQUNLRVRTX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWdlYXJlYS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWdlYXJlYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyYjM0NAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2VhcmVhLmNwcApAQCAtMCwwICsxLDUwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWdlYXJlYS5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3BhZ2VhcmVhLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpNZWRpdW0sIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6RGVzYywgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpFeHRyYXMsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6T2NjdXIsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlBhZ2VQb3NpdGlvbiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6QW55fSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6T2RkT3JFdmVuLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpBbnl9LAorICAgIHtYRkFfQXR0cmlidXRlOjpSZWxldmFudCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SW5pdGlhbE51bWJlciwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikxfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TnVtYmVyZWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMX0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkJsYW5rT3JOb3RCbGFuaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6QW55fSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwicGFnZUFyZWEiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9QYWdlQXJlYTo6Q1hGQV9QYWdlQXJlYShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGFpbmVyTm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6UGFnZUFyZWEsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX1BhZ2VBcmVhPih0aGlzKSkge30KKworQ1hGQV9QYWdlQXJlYTo6fkNYRkFfUGFnZUFyZWEoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFnZWFyZWEuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2VhcmVhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNjYWIxZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2VhcmVhLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BBR0VBUkVBX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BBR0VBUkVBX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfUGFnZUFyZWEgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfUGFnZUFyZWEoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9QYWdlQXJlYSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QQUdFQVJFQV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFnZW9mZnNldC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWdlb2Zmc2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjcxMDE5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFnZW9mZnNldC5jcHAKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFnZW9mZnNldC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6WCwgWEZBX0F0dHJpYnV0ZVR5cGU6Ok1lYXN1cmUsICh2b2lkKilMIjBpbiJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpZLCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInBhZ2VPZmZzZXQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9QYWdlT2Zmc2V0OjpDWEZBX1BhZ2VPZmZzZXQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6UGFnZU9mZnNldCwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX1BhZ2VPZmZzZXQ6On5DWEZBX1BhZ2VPZmZzZXQoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFnZW9mZnNldC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFnZW9mZnNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOTZjNTcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWdlb2Zmc2V0LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BBR0VPRkZTRVRfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUEFHRU9GRlNFVF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1BhZ2VPZmZzZXQgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfUGFnZU9mZnNldChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1BhZ2VPZmZzZXQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUEFHRU9GRlNFVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFnZXJhbmdlLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2VyYW5nZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRlN2Y1ZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2VyYW5nZS5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFnZXJhbmdlLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJwYWdlUmFuZ2UiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9QYWdlUmFuZ2U6OkNYRkFfUGFnZVJhbmdlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpQYWdlUmFuZ2UsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9QYWdlUmFuZ2U6On5DWEZBX1BhZ2VSYW5nZSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWdlcmFuZ2UuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2VyYW5nZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OTI3NmEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWdlcmFuZ2UuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUEFHRVJBTkdFX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BBR0VSQU5HRV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1BhZ2VSYW5nZSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9QYWdlUmFuZ2UoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9QYWdlUmFuZ2UoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUEFHRVJBTkdFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWdlc2V0LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2VzZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZWE2MTgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWdlc2V0LmNwcApAQCAtMCwwICsxLDQ0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWdlc2V0LmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfcGFnZXNldC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0ge3tYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6Ok9jY3VyLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpSZWxhdGlvbiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6T3JkZXJlZE9jY3VycmVuY2V9LAorICAgIHtYRkFfQXR0cmlidXRlOjpSZWxldmFudCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RHVwbGV4SW1wb3NpdGlvbiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6TG9uZ0VkZ2V9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJwYWdlU2V0IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfUGFnZVNldDo6Q1hGQV9QYWdlU2V0KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250YWluZXJOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpQYWdlU2V0LAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9QYWdlU2V0Pih0aGlzKSkge30KKworQ1hGQV9QYWdlU2V0Ojp+Q1hGQV9QYWdlU2V0KCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2VzZXQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2VzZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Y2MzYjE3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFnZXNldC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QQUdFU0VUX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BBR0VTRVRfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9QYWdlU2V0IDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1BhZ2VTZXQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9QYWdlU2V0KCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BBR0VTRVRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2luYXRpb24uY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFnaW5hdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk2MDBlYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2luYXRpb24uY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2luYXRpb24uaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInBhZ2luYXRpb24iOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9QYWdpbmF0aW9uOjpDWEZBX1BhZ2luYXRpb24oQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlBhZ2luYXRpb24sCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9QYWdpbmF0aW9uOjp+Q1hGQV9QYWdpbmF0aW9uKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2luYXRpb24uaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2luYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDU1ZWNiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFnaW5hdGlvbi5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QQUdJTkFUSU9OX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BBR0lOQVRJT05fSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9QYWdpbmF0aW9uIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1BhZ2luYXRpb24oQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9QYWdpbmF0aW9uKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BBR0lOQVRJT05fSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2luYXRpb25vdmVycmlkZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWdpbmF0aW9ub3ZlcnJpZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOGI2YzYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWdpbmF0aW9ub3ZlcnJpZGUuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2luYXRpb25vdmVycmlkZS5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwicGFnaW5hdGlvbk92ZXJyaWRlIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfUGFnaW5hdGlvbk92ZXJyaWRlOjpDWEZBX1BhZ2luYXRpb25PdmVycmlkZShDWEZBX0RvY3VtZW50KiBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpQYWdpbmF0aW9uT3ZlcnJpZGUsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9QYWdpbmF0aW9uT3ZlcnJpZGU6On5DWEZBX1BhZ2luYXRpb25PdmVycmlkZSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWdpbmF0aW9ub3ZlcnJpZGUuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhZ2luYXRpb25vdmVycmlkZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYzk1MjgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYWdpbmF0aW9ub3ZlcnJpZGUuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUEFHSU5BVElPTk9WRVJSSURFX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BBR0lOQVRJT05PVkVSUklERV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1BhZ2luYXRpb25PdmVycmlkZSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9QYWdpbmF0aW9uT3ZlcnJpZGUoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9QYWdpbmF0aW9uT3ZlcnJpZGUoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUEFHSU5BVElPTk9WRVJSSURFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYXJhLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhcmEuY3BwCmluZGV4IGJkM2ExYmIuLmFkNzE5MGQgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhcmEuY3BwCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhcmEuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKQEAgLTYsNTUgKzYsODggQEAKIAogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhcmEuaCIKIAorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9wYXJhLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21lYXN1cmVtZW50LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKIAotQ1hGQV9QYXJhOjpDWEZBX1BhcmEoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9CituYW1lc3BhY2UgewogCi1pbnQzMl90IENYRkFfUGFyYTo6R2V0SG9yaXpvbnRhbEFsaWduKCkgewotICBYRkFfQVRUUklCVVRFRU5VTSBlQXR0ciA9IFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ7Ci0gIG1fcE5vZGUtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9IQWxpZ24sIGVBdHRyKTsKLSAgcmV0dXJuIGVBdHRyOworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0geworICAgIHtYRkFfRWxlbWVudDo6SHlwaGVuYXRpb24sIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpIQWxpZ24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OkxlZnR9LAorICAgIHtYRkFfQXR0cmlidXRlOjpUZXh0SW5kZW50LCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6V2lkb3dzLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpNYXJnaW5SaWdodCwgWEZBX0F0dHJpYnV0ZVR5cGU6Ok1lYXN1cmUsICh2b2lkKilMIjBpbiJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpNYXJnaW5MZWZ0LCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlJhZGl4T2Zmc2V0LCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlByZXNlcnZlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpTcGFjZUJlbG93LCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlZBbGlnbiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6VG9wfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VGFiRGVmYXVsdCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VGFiU3RvcHMsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok9ycGhhbnMsIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxpbmVIZWlnaHQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpNZWFzdXJlLCAodm9pZCopTCIwcHQifSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6U3BhY2VBYm92ZSwgWEZBX0F0dHJpYnV0ZVR5cGU6Ok1lYXN1cmUsICh2b2lkKilMIjBpbiJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJwYXJhIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfUGFyYTo6Q1hGQV9QYXJhKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpQYXJhLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9QYXJhPih0aGlzKSkge30KKworQ1hGQV9QYXJhOjp+Q1hGQV9QYXJhKCkge30KKworWEZBX0F0dHJpYnV0ZUVudW0gQ1hGQV9QYXJhOjpHZXRIb3Jpem9udGFsQWxpZ24oKSB7CisgIHJldHVybiBKU09iamVjdCgpCisgICAgICAtPlRyeUVudW0oWEZBX0F0dHJpYnV0ZTo6SEFsaWduLCB0cnVlKQorICAgICAgLnZhbHVlX29yKFhGQV9BdHRyaWJ1dGVFbnVtOjpMZWZ0KTsKIH0KIAotaW50MzJfdCBDWEZBX1BhcmE6OkdldFZlcnRpY2FsQWxpZ24oKSB7Ci0gIFhGQV9BVFRSSUJVVEVFTlVNIGVBdHRyID0gWEZBX0FUVFJJQlVURUVOVU1fVG9wOwotICBtX3BOb2RlLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfVkFsaWduLCBlQXR0cik7Ci0gIHJldHVybiBlQXR0cjsKK1hGQV9BdHRyaWJ1dGVFbnVtIENYRkFfUGFyYTo6R2V0VmVydGljYWxBbGlnbigpIHsKKyAgcmV0dXJuIEpTT2JqZWN0KCkKKyAgICAgIC0+VHJ5RW51bShYRkFfQXR0cmlidXRlOjpWQWxpZ24sIHRydWUpCisgICAgICAudmFsdWVfb3IoWEZBX0F0dHJpYnV0ZUVudW06OlRvcCk7CiB9CiAKLUZYX0ZMT0FUIENYRkFfUGFyYTo6R2V0TGluZUhlaWdodCgpIHsKLSAgQ1hGQV9NZWFzdXJlbWVudCBtczsKLSAgbV9wTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX0xpbmVIZWlnaHQsIG1zKTsKLSAgcmV0dXJuIG1zLlRvVW5pdChYRkFfVU5JVF9QdCk7CitmbG9hdCBDWEZBX1BhcmE6OkdldExpbmVIZWlnaHQoKSB7CisgIHJldHVybiBKU09iamVjdCgpLT5HZXRNZWFzdXJlKFhGQV9BdHRyaWJ1dGU6OkxpbmVIZWlnaHQpLlRvVW5pdChYRkFfVW5pdDo6UHQpOwogfQogCi1GWF9GTE9BVCBDWEZBX1BhcmE6OkdldE1hcmdpbkxlZnQoKSB7Ci0gIENYRkFfTWVhc3VyZW1lbnQgbXM7Ci0gIG1fcE5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9NYXJnaW5MZWZ0LCBtcyk7Ci0gIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOworZmxvYXQgQ1hGQV9QYXJhOjpHZXRNYXJnaW5MZWZ0KCkgeworICByZXR1cm4gSlNPYmplY3QoKS0+R2V0TWVhc3VyZShYRkFfQXR0cmlidXRlOjpNYXJnaW5MZWZ0KS5Ub1VuaXQoWEZBX1VuaXQ6OlB0KTsKIH0KIAotRlhfRkxPQVQgQ1hGQV9QYXJhOjpHZXRNYXJnaW5SaWdodCgpIHsKLSAgQ1hGQV9NZWFzdXJlbWVudCBtczsKLSAgbV9wTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX01hcmdpblJpZ2h0LCBtcyk7Ci0gIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOworZmxvYXQgQ1hGQV9QYXJhOjpHZXRNYXJnaW5SaWdodCgpIHsKKyAgcmV0dXJuIEpTT2JqZWN0KCkKKyAgICAgIC0+R2V0TWVhc3VyZShYRkFfQXR0cmlidXRlOjpNYXJnaW5SaWdodCkKKyAgICAgIC5Ub1VuaXQoWEZBX1VuaXQ6OlB0KTsKIH0KIAotRlhfRkxPQVQgQ1hGQV9QYXJhOjpHZXRTcGFjZUFib3ZlKCkgewotICBDWEZBX01lYXN1cmVtZW50IG1zOwotICBtX3BOb2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU3BhY2VBYm92ZSwgbXMpOwotICByZXR1cm4gbXMuVG9Vbml0KFhGQV9VTklUX1B0KTsKK2Zsb2F0IENYRkFfUGFyYTo6R2V0U3BhY2VBYm92ZSgpIHsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPkdldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6U3BhY2VBYm92ZSkuVG9Vbml0KFhGQV9Vbml0OjpQdCk7CiB9CiAKLUZYX0ZMT0FUIENYRkFfUGFyYTo6R2V0U3BhY2VCZWxvdygpIHsKLSAgQ1hGQV9NZWFzdXJlbWVudCBtczsKLSAgbV9wTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1NwYWNlQmVsb3csIG1zKTsKLSAgcmV0dXJuIG1zLlRvVW5pdChYRkFfVU5JVF9QdCk7CitmbG9hdCBDWEZBX1BhcmE6OkdldFNwYWNlQmVsb3coKSB7CisgIHJldHVybiBKU09iamVjdCgpLT5HZXRNZWFzdXJlKFhGQV9BdHRyaWJ1dGU6OlNwYWNlQmVsb3cpLlRvVW5pdChYRkFfVW5pdDo6UHQpOwogfQogCi1GWF9GTE9BVCBDWEZBX1BhcmE6OkdldFRleHRJbmRlbnQoKSB7Ci0gIENYRkFfTWVhc3VyZW1lbnQgbXM7Ci0gIG1fcE5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9UZXh0SW5kZW50LCBtcyk7Ci0gIHJldHVybiBtcy5Ub1VuaXQoWEZBX1VOSVRfUHQpOworZmxvYXQgQ1hGQV9QYXJhOjpHZXRUZXh0SW5kZW50KCkgeworICByZXR1cm4gSlNPYmplY3QoKS0+R2V0TWVhc3VyZShYRkFfQXR0cmlidXRlOjpUZXh0SW5kZW50KS5Ub1VuaXQoWEZBX1VuaXQ6OlB0KTsKIH0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhcmEuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhcmEuaAppbmRleCBlMTJkNDhmLi5hZmI0OGNlIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYXJhLmgKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFyYS5oCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKQEAgLTcsMjMgKzcsMjEgQEAKICNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUEFSQV9IXwogI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QQVJBX0hfCiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGEuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCiAKLWNsYXNzIENYRkFfTm9kZTsKLQotY2xhc3MgQ1hGQV9QYXJhIDogcHVibGljIENYRkFfRGF0YSB7CitjbGFzcyBDWEZBX1BhcmEgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfUGFyYShDWEZBX05vZGUqIHBOb2RlKTsKKyAgQ1hGQV9QYXJhKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfUGFyYSgpIG92ZXJyaWRlOwogCi0gIGludDMyX3QgR2V0SG9yaXpvbnRhbEFsaWduKCk7Ci0gIGludDMyX3QgR2V0VmVydGljYWxBbGlnbigpOwotICBGWF9GTE9BVCBHZXRMaW5lSGVpZ2h0KCk7Ci0gIEZYX0ZMT0FUIEdldE1hcmdpbkxlZnQoKTsKLSAgRlhfRkxPQVQgR2V0TWFyZ2luUmlnaHQoKTsKLSAgRlhfRkxPQVQgR2V0U3BhY2VBYm92ZSgpOwotICBGWF9GTE9BVCBHZXRTcGFjZUJlbG93KCk7Ci0gIEZYX0ZMT0FUIEdldFRleHRJbmRlbnQoKTsKKyAgWEZBX0F0dHJpYnV0ZUVudW0gR2V0SG9yaXpvbnRhbEFsaWduKCk7CisgIFhGQV9BdHRyaWJ1dGVFbnVtIEdldFZlcnRpY2FsQWxpZ24oKTsKKyAgZmxvYXQgR2V0TGluZUhlaWdodCgpOworICBmbG9hdCBHZXRNYXJnaW5MZWZ0KCk7CisgIGZsb2F0IEdldE1hcmdpblJpZ2h0KCk7CisgIGZsb2F0IEdldFNwYWNlQWJvdmUoKTsKKyAgZmxvYXQgR2V0U3BhY2VCZWxvdygpOworICBmbG9hdCBHZXRUZXh0SW5kZW50KCk7CiB9OwogCiAjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BBUkFfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhcnQuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0NTU3MQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhcnQuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BhcnQuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInBhcnQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9QYXJ0OjpDWEZBX1BhcnQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlBhcnQsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9QYXJ0Ojp+Q1hGQV9QYXJ0KCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhcnQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGI3NjM5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFydC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QQVJUX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BBUlRfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9QYXJ0IDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1BhcnQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9QYXJ0KCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BBUlRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3Bhc3N3b3JkLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3Bhc3N3b3JkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjNmNzE5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFzc3dvcmQuY3BwCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3Bhc3N3b3JkLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfcGFzc3dvcmQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJwYXNzd29yZCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1Bhc3N3b3JkOjpDWEZBX1Bhc3N3b3JkKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OlRleHROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpQYXNzd29yZCwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfUGFzc3dvcmQ+KHRoaXMpKSB7fQorCitDWEZBX1Bhc3N3b3JkOjp+Q1hGQV9QYXNzd29yZCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYXNzd29yZC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFzc3dvcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDRmOTFmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFzc3dvcmQuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUEFTU1dPUkRfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUEFTU1dPUkRfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9QYXNzd29yZCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9QYXNzd29yZChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1Bhc3N3b3JkKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BBU1NXT1JEX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYXNzd29yZGVkaXQuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFzc3dvcmRlZGl0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODZjZDEzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFzc3dvcmRlZGl0LmNwcApAQCAtMCwwICsxLDQxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYXNzd29yZGVkaXQuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9wYXNzd29yZGVkaXQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6Ok1hcmdpbiwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpCb3JkZXIsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpQYXNzd29yZENoYXIsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgKHZvaWQqKUwiKiJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpIU2Nyb2xsUG9saWN5LCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpBdXRvfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwicGFzc3dvcmRFZGl0IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfUGFzc3dvcmRFZGl0OjpDWEZBX1Bhc3N3b3JkRWRpdChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6UGFzc3dvcmRFZGl0LAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfUGFzc3dvcmRFZGl0Ojp+Q1hGQV9QYXNzd29yZEVkaXQoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFzc3dvcmRlZGl0LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYXNzd29yZGVkaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGIwNWJhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFzc3dvcmRlZGl0LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BBU1NXT1JERURJVF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QQVNTV09SREVESVRfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9QYXNzd29yZEVkaXQgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfUGFzc3dvcmRFZGl0KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfUGFzc3dvcmRFZGl0KCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BBU1NXT1JERURJVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGF0dGVybi5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wYXR0ZXJuLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2QzMmNjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGF0dGVybi5jcHAKQEAgLTAsMCArMSw4NyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGF0dGVybi5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3BhdHRlcm4uaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29sb3IuaCIKKyNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jeGZhX2dlcGF0dGVybi5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpDb2xvciwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpFeHRyYXMsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlR5cGUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OkNyb3NzSGF0Y2h9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJwYXR0ZXJuIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfUGF0dGVybjo6Q1hGQV9QYXR0ZXJuKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpQYXR0ZXJuLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9QYXR0ZXJuPih0aGlzKSkge30KKworQ1hGQV9QYXR0ZXJuOjp+Q1hGQV9QYXR0ZXJuKCkge30KKworQ1hGQV9Db2xvciogQ1hGQV9QYXR0ZXJuOjpHZXRDb2xvcklmRXhpc3RzKCkgeworICByZXR1cm4gR2V0Q2hpbGQ8Q1hGQV9Db2xvcj4oMCwgWEZBX0VsZW1lbnQ6OkNvbG9yLCBmYWxzZSk7Cit9CisKK1hGQV9BdHRyaWJ1dGVFbnVtIENYRkFfUGF0dGVybjo6R2V0VHlwZSgpIHsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6VHlwZSk7Cit9CisKK3ZvaWQgQ1hGQV9QYXR0ZXJuOjpEcmF3KENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfR0VQYXRoKiBmaWxsUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgY3JTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRGaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7CisgIENYRkFfQ29sb3IqIHBDb2xvciA9IEdldENvbG9ySWZFeGlzdHMoKTsKKyAgRlhfQVJHQiBjckVuZCA9IHBDb2xvciA/IHBDb2xvci0+R2V0VmFsdWUoKSA6IENYRkFfQ29sb3I6OmtCbGFja0NvbG9yOworCisgIEZYX0hhdGNoU3R5bGUgaUhhdGNoID0gRlhfSGF0Y2hTdHlsZTo6Q3Jvc3M7CisgIHN3aXRjaCAoR2V0VHlwZSgpKSB7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6Q3Jvc3NEaWFnb25hbDoKKyAgICAgIGlIYXRjaCA9IEZYX0hhdGNoU3R5bGU6OkRpYWdvbmFsQ3Jvc3M7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpEaWFnb25hbExlZnQ6CisgICAgICBpSGF0Y2ggPSBGWF9IYXRjaFN0eWxlOjpGb3J3YXJkRGlhZ29uYWw7CisgICAgICBicmVhazsKKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpEaWFnb25hbFJpZ2h0OgorICAgICAgaUhhdGNoID0gRlhfSGF0Y2hTdHlsZTo6QmFja3dhcmREaWFnb25hbDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06Okhvcml6b250YWw6CisgICAgICBpSGF0Y2ggPSBGWF9IYXRjaFN0eWxlOjpIb3Jpem9udGFsOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6VmVydGljYWw6CisgICAgICBpSGF0Y2ggPSBGWF9IYXRjaFN0eWxlOjpWZXJ0aWNhbDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorCisgIENYRkFfR0VQYXR0ZXJuIHBhdHRlcm4oaUhhdGNoLCBjckVuZCwgY3JTdGFydCk7CisKKyAgcEdTLT5TYXZlR3JhcGhTdGF0ZSgpOworICBwR1MtPlNldEZpbGxDb2xvcihDWEZBX0dFQ29sb3IoJnBhdHRlcm4sIDB4MCkpOworICBwR1MtPkZpbGxQYXRoKGZpbGxQYXRoLCBGWEZJTExfV0lORElORywgJm1hdHJpeCk7CisgIHBHUy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsKK30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhdHRlcm4uaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BhdHRlcm4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTMzYWM5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGF0dGVybi5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QQVRURVJOX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BBVFRFUk5fSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXBhdGguaCIKKworY2xhc3MgQ1hGQV9Db2xvcjsKK2NsYXNzIENYRkFfR3JhcGhpY3M7CisKK2NsYXNzIENYRkFfUGF0dGVybiA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgc3RhdGljIGNvbnN0ZXhwciBYRkFfQXR0cmlidXRlRW51bSBrRGVmYXVsdFR5cGUgPSBYRkFfQXR0cmlidXRlRW51bTo6VW5rbm93bjsKKworICBDWEZBX1BhdHRlcm4oQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9QYXR0ZXJuKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBEcmF3KENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgIENYRkFfR0VQYXRoKiBmaWxsUGF0aCwKKyAgICAgICAgICAgIEZYX0FSR0IgY3JTdGFydCwKKyAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRGaWxsLAorICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KTsKKworIHByaXZhdGU6CisgIFhGQV9BdHRyaWJ1dGVFbnVtIEdldFR5cGUoKTsKKyAgQ1hGQV9Db2xvciogR2V0Q29sb3JJZkV4aXN0cygpOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QQVRURVJOX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wY2wuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGNsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjVlMzQ4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGNsLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wY2wuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0geworICAgIHtYRkFfRWxlbWVudDo6Rm9udEluZm8sIDEsIDB9LCAgIHtYRkFfRWxlbWVudDo6Sm9nLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlhkYywgMSwgMH0sICAgICAgICB7WEZBX0VsZW1lbnQ6OkJhdGNoT3V0cHV0LCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlBhZ2VPZmZzZXQsIDEsIDB9LCB7WEZBX0VsZW1lbnQ6Ok91dHB1dEJpbiwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpTdGFwbGUsIDEsIDB9LCAgICAge1hGQV9FbGVtZW50OjpNZWRpdW1JbmZvLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJwY2wiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9QY2w6OkNYRkFfUGNsKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlBjbCwKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX1BjbDo6fkNYRkFfUGNsKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3BjbC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3ODI2NQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BjbC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QQ0xfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUENMX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfUGNsIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1BjbChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1BjbCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QQ0xfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3BkZi5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wZGYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMGQzOTMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wZGYuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BkZi5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7CisgICAge1hGQV9FbGVtZW50OjpBZG9iZUV4dGVuc2lvbkxldmVsLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkZvbnRJbmZvLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlhkYywgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpQZGZhLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkJhdGNoT3V0cHV0LCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlZpZXdlclByZWZlcmVuY2VzLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlNjcmlwdE1vZGVsLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlZlcnNpb24sIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6U3VibWl0Rm9ybWF0LCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlNpbGVudFByaW50LCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlByb2R1Y2VyLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkNvbXByZXNzaW9uLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkludGVyYWN0aXZlLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkVuY3J5cHRpb24sIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6UmVuZGVyUG9saWN5LCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6Ok9wZW5BY3Rpb24sIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6Q3JlYXRvciwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpMaW5lYXJpemVkLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlRhZ2dlZCwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwicGRmIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfUGRmOjpDWEZBX1BkZihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpQZGYsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9QZGY6On5DWEZBX1BkZigpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wZGYuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BkZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOTI1YzgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wZGYuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUERGX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BERl9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1BkZiA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9QZGYoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9QZGYoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUERGX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wZGZhLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BkZmEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MWViOTMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wZGZhLmNwcApAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wZGZhLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHsKKyAgICB7WEZBX0VsZW1lbnQ6OkFtZCwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpQYXJ0LCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkluY2x1ZGVYRFBDb250ZW50LCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkNvbmZvcm1hbmNlLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJwZGZhIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfUGRmYTo6Q1hGQV9QZGZhKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlBkZmEsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9QZGZhOjp+Q1hGQV9QZGZhKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3BkZmEuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BkZmEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDgxNmEyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGRmYS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QREZBX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BERkFfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9QZGZhIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1BkZmEoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9QZGZhKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BERkFfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3Blcm1pc3Npb25zLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3Blcm1pc3Npb25zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTZhYzMyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGVybWlzc2lvbnMuY3BwCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3Blcm1pc3Npb25zLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHsKKyAgICB7WEZBX0VsZW1lbnQ6Ok1vZGlmeUFubm90cywgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpDb250ZW50Q29weSwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpGb3JtRmllbGRGaWxsaW5nLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkNoYW5nZSwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpBY2Nlc3NpYmxlQ29udGVudCwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpQcmludCwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpQbGFpbnRleHRNZXRhZGF0YSwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpQcmludEhpZ2hRdWFsaXR5LCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkRvY3VtZW50QXNzZW1ibHksIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInBlcm1pc3Npb25zIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfUGVybWlzc2lvbnM6OkNYRkFfUGVybWlzc2lvbnMoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6UGVybWlzc2lvbnMsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9QZXJtaXNzaW9uczo6fkNYRkFfUGVybWlzc2lvbnMoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGVybWlzc2lvbnMuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3Blcm1pc3Npb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhOTAxOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3Blcm1pc3Npb25zLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BFUk1JU1NJT05TX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BFUk1JU1NJT05TX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfUGVybWlzc2lvbnMgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfUGVybWlzc2lvbnMoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9QZXJtaXNzaW9ucygpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QRVJNSVNTSU9OU19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGlja3RyYXlieXBkZnNpemUuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGlja3RyYXlieXBkZnNpemUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZTVlYzIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9waWNrdHJheWJ5cGRmc2l6ZS5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGlja3RyYXlieXBkZnNpemUuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInBpY2tUcmF5QnlQREZTaXplIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfUGlja1RyYXlCeVBERlNpemU6OkNYRkFfUGlja1RyYXlCeVBERlNpemUoQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlBpY2tUcmF5QnlQREZTaXplLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfUGlja1RyYXlCeVBERlNpemU6On5DWEZBX1BpY2tUcmF5QnlQREZTaXplKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3BpY2t0cmF5YnlwZGZzaXplLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9waWNrdHJheWJ5cGRmc2l6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNzVlNWMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9waWNrdHJheWJ5cGRmc2l6ZS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QSUNLVFJBWUJZUERGU0laRV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QSUNLVFJBWUJZUERGU0laRV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1BpY2tUcmF5QnlQREZTaXplIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1BpY2tUcmF5QnlQREZTaXplKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfUGlja1RyYXlCeVBERlNpemUoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUElDS1RSQVlCWVBERlNJWkVfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3BpY3R1cmUuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGljdHVyZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg2M2E3NwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BpY3R1cmUuY3BwCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BpY3R1cmUuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9waWN0dXJlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwicGljdHVyZSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1BpY3R1cmU6OkNYRkFfUGljdHVyZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZSgKKyAgICAgICAgICBkb2MsCisgICAgICAgICAgcGFja2V0LAorICAgICAgICAgIChYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICBYRkFfRWxlbWVudDo6UGljdHVyZSwKKyAgICAgICAgICBudWxscHRyLAorICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgIGtOYW1lLAorICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfUGljdHVyZT4odGhpcykpIHt9CisKK0NYRkFfUGljdHVyZTo6fkNYRkFfUGljdHVyZSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9waWN0dXJlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9waWN0dXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZkMmM1NQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BpY3R1cmUuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUElDVFVSRV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QSUNUVVJFX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfUGljdHVyZSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9QaWN0dXJlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfUGljdHVyZSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QSUNUVVJFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wbGFpbnRleHRtZXRhZGF0YS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wbGFpbnRleHRtZXRhZGF0YS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVjNTFkZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BsYWludGV4dG1ldGFkYXRhLmNwcApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wbGFpbnRleHRtZXRhZGF0YS5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwicGxhaW50ZXh0TWV0YWRhdGEiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9QbGFpbnRleHRNZXRhZGF0YTo6Q1hGQV9QbGFpbnRleHRNZXRhZGF0YShDWEZBX0RvY3VtZW50KiBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6UGxhaW50ZXh0TWV0YWRhdGEsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9QbGFpbnRleHRNZXRhZGF0YTo6fkNYRkFfUGxhaW50ZXh0TWV0YWRhdGEoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGxhaW50ZXh0bWV0YWRhdGEuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BsYWludGV4dG1ldGFkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNkY2U2NQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BsYWludGV4dG1ldGFkYXRhLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BMQUlOVEVYVE1FVEFEQVRBX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BMQUlOVEVYVE1FVEFEQVRBX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfUGxhaW50ZXh0TWV0YWRhdGEgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfUGxhaW50ZXh0TWV0YWRhdGEoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9QbGFpbnRleHRNZXRhZGF0YSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QTEFJTlRFWFRNRVRBREFUQV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJlc2VuY2UuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJlc2VuY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMzg5ZDkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmVzZW5jZS5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJlc2VuY2UuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInByZXNlbmNlIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfUHJlc2VuY2U6OkNYRkFfUHJlc2VuY2UoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVYsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlByZXNlbmNlLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfUHJlc2VuY2U6On5DWEZBX1ByZXNlbmNlKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3ByZXNlbmNlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmVzZW5jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5Yjc3NjYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmVzZW5jZS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QUkVTRU5DRV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QUkVTRU5DRV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1ByZXNlbmNlIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1ByZXNlbmNlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfUHJlc2VuY2UoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUFJFU0VOQ0VfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3ByZXNlbnQuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJlc2VudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1MmE3OQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3ByZXNlbnQuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3ByZXNlbnQuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0geworICAgIHtYRkFfRWxlbWVudDo6WGRwLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkNhY2hlLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlBhZ2luYXRpb24sIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6T3ZlcnByaW50LCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkJlaGF2aW9yT3ZlcnJpZGUsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6Q29waWVzLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6Ok91dHB1dCwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpWYWxpZGF0ZSwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpMYXlvdXQsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6U2NyaXB0LCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkNvbW1vbiwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpQYWdpbmF0aW9uT3ZlcnJpZGUsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6RGVzdGluYXRpb24sIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6SW5jcmVtZW50YWxNZXJnZSwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwicHJlc2VudCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1ByZXNlbnQ6OkNYRkFfUHJlc2VudChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpQcmVzZW50LAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfUHJlc2VudDo6fkNYRkFfUHJlc2VudCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmVzZW50LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmVzZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNiM2M2MQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3ByZXNlbnQuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUFJFU0VOVF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QUkVTRU5UX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfUHJlc2VudCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9QcmVzZW50KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfUHJlc2VudCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QUkVTRU5UX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmludC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmludC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkwMTg2ZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3ByaW50LmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmludC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwicHJpbnQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9QcmludDo6Q1hGQV9QcmludChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6UHJpbnQsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9QcmludDo6fkNYRkFfUHJpbnQoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJpbnQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3ByaW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYyNTEzZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3ByaW50LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BSSU5UX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BSSU5UX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfUHJpbnQgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfUHJpbnQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9QcmludCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QUklOVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJpbnRlcm5hbWUuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJpbnRlcm5hbWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZTYxOTcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmludGVybmFtZS5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJpbnRlcm5hbWUuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInByaW50ZXJOYW1lIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfUHJpbnRlck5hbWU6OkNYRkFfUHJpbnRlck5hbWUoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlByaW50ZXJOYW1lLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfUHJpbnRlck5hbWU6On5DWEZBX1ByaW50ZXJOYW1lKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3ByaW50ZXJuYW1lLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmludGVybmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMDc4ODUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmludGVybmFtZS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QUklOVEVSTkFNRV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QUklOVEVSTkFNRV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1ByaW50ZXJOYW1lIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1ByaW50ZXJOYW1lKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfUHJpbnRlck5hbWUoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUFJJTlRFUk5BTUVfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3ByaW50aGlnaHF1YWxpdHkuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJpbnRoaWdocXVhbGl0eS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIxMTg0ZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3ByaW50aGlnaHF1YWxpdHkuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3ByaW50aGlnaHF1YWxpdHkuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInByaW50SGlnaFF1YWxpdHkiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9QcmludEhpZ2hRdWFsaXR5OjpDWEZBX1ByaW50SGlnaFF1YWxpdHkoQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpQcmludEhpZ2hRdWFsaXR5LAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfUHJpbnRIaWdoUXVhbGl0eTo6fkNYRkFfUHJpbnRIaWdoUXVhbGl0eSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmludGhpZ2hxdWFsaXR5LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmludGhpZ2hxdWFsaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkNjExMjUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmludGhpZ2hxdWFsaXR5LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BSSU5USElHSFFVQUxJVFlfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUFJJTlRISUdIUVVBTElUWV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1ByaW50SGlnaFF1YWxpdHkgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfUHJpbnRIaWdoUXVhbGl0eShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1ByaW50SGlnaFF1YWxpdHkoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUFJJTlRISUdIUVVBTElUWV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJpbnRzY2FsaW5nLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3ByaW50c2NhbGluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ2OGY2OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3ByaW50c2NhbGluZy5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJpbnRzY2FsaW5nLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJwcmludFNjYWxpbmciOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9QcmludFNjYWxpbmc6OkNYRkFfUHJpbnRTY2FsaW5nKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpQcmludFNjYWxpbmcsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9QcmludFNjYWxpbmc6On5DWEZBX1ByaW50U2NhbGluZygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmludHNjYWxpbmcuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3ByaW50c2NhbGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMWQ0MjcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcmludHNjYWxpbmcuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUFJJTlRTQ0FMSU5HX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BSSU5UU0NBTElOR19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1ByaW50U2NhbGluZyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9QcmludFNjYWxpbmcoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9QcmludFNjYWxpbmcoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUFJJTlRTQ0FMSU5HX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcm9kdWNlci5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcm9kdWNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUyNTNjNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3Byb2R1Y2VyLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcm9kdWNlci5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwicHJvZHVjZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9Qcm9kdWNlcjo6Q1hGQV9Qcm9kdWNlcihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6UHJvZHVjZXIsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9Qcm9kdWNlcjo6fkNYRkFfUHJvZHVjZXIoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJvZHVjZXIuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3Byb2R1Y2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg0ODI2ZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3Byb2R1Y2VyLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BST0RVQ0VSX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BST0RVQ0VSX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfUHJvZHVjZXIgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfUHJvZHVjZXIoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9Qcm9kdWNlcigpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QUk9EVUNFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJvdG8uY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJvdG8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMTAzZTcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcm90by5jcHAKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJvdG8uaCIKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwicHJvdG8iOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9Qcm90bzo6Q1hGQV9Qcm90byhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6UHJvdG8sCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX1Byb3RvOjp+Q1hGQV9Qcm90bygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcm90by5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJvdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTFkODRhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHJvdG8uaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUFJPVE9fSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUFJPVE9fSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9Qcm90byA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9Qcm90byhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1Byb3RvKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BST1RPX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIyZjUzMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BzLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcy5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7CisgICAge1hGQV9FbGVtZW50OjpGb250SW5mbywgMSwgMH0sICB7WEZBX0VsZW1lbnQ6OkpvZywgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpYZGMsIDEsIDB9LCAgICAgICB7WEZBX0VsZW1lbnQ6OkJhdGNoT3V0cHV0LCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6Ok91dHB1dEJpbiwgMSwgMH0sIHtYRkFfRWxlbWVudDo6Q29tcHJlc3MsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6U3RhcGxlLCAxLCAwfSwgICAge1hGQV9FbGVtZW50OjpNZWRpdW1JbmZvLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJwcyI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1BzOjpDWEZBX1BzKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlBzLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfUHM6On5DWEZBX1BzKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3BzLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZjdlODIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wcy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QU19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9QU19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1BzIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1BzKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfUHMoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUFNfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3BzbWFwLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3BzbWFwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzBiMTIyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHNtYXAuY3BwCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BzbWFwLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInBzTWFwIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfUHNNYXA6OkNYRkFfUHNNYXAoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6UHNNYXAsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX1BzTWFwOjp+Q1hGQV9Qc01hcCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9wc21hcC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHNtYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjk3YWFhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcHNtYXAuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUFNNQVBfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUFNNQVBfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9Qc01hcCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9Qc01hcChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1BzTWFwKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1BTTUFQX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9xdWVyeS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9xdWVyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUxODU2NQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3F1ZXJ5LmNwcApAQCAtMCwwICsxLDQxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9xdWVyeS5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3F1ZXJ5LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpSZWNvcmRTZXQsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6U2VsZWN0LCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpDb21tYW5kVHlwZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6VW5rbm93bn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInF1ZXJ5IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfUXVlcnk6OkNYRkFfUXVlcnkoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6UXVlcnksCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX1F1ZXJ5Pih0aGlzKSkge30KKworQ1hGQV9RdWVyeTo6fkNYRkFfUXVlcnkoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcXVlcnkuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3F1ZXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4ZTdmYwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3F1ZXJ5LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1FVRVJZX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1FVRVJZX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfUXVlcnkgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfUXVlcnkoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9RdWVyeSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9RVUVSWV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmFkaWFsLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3JhZGlhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QwMjRlNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3JhZGlhbC5jcHAKQEAgLTAsMCArMSw3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmFkaWFsLmgiCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3JhZGlhbC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb2xvci5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2VzaGFkaW5nLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6OkNvbG9yLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VHlwZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6VG9FZGdlfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwicmFkaWFsIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfUmFkaWFsOjpDWEZBX1JhZGlhbChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6UmFkaWFsLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9SYWRpYWw+KHRoaXMpKSB7fQorCitDWEZBX1JhZGlhbDo6fkNYRkFfUmFkaWFsKCkge30KKworYm9vbCBDWEZBX1JhZGlhbDo6SXNUb0VkZ2UoKSB7CisgIHJldHVybiBKU09iamVjdCgpCisgICAgICAgICAgICAgLT5UcnlFbnVtKFhGQV9BdHRyaWJ1dGU6OlR5cGUsIHRydWUpCisgICAgICAgICAgICAgLnZhbHVlX29yKFhGQV9BdHRyaWJ1dGVFbnVtOjpUb0VkZ2UpID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpUb0VkZ2U7Cit9CisKK0NYRkFfQ29sb3IqIENYRkFfUmFkaWFsOjpHZXRDb2xvcklmRXhpc3RzKCkgeworICByZXR1cm4gR2V0Q2hpbGQ8Q1hGQV9Db2xvcj4oMCwgWEZBX0VsZW1lbnQ6OkNvbG9yLCBmYWxzZSk7Cit9CisKK3ZvaWQgQ1hGQV9SYWRpYWw6OkRyYXcoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0dFUGF0aCogZmlsbFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgIEZYX0FSR0IgY3JTdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEZpbGwsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBDWEZBX0NvbG9yKiBwQ29sb3IgPSBHZXRDb2xvcklmRXhpc3RzKCk7CisgIEZYX0FSR0IgY3JFbmQgPSBwQ29sb3IgPyBwQ29sb3ItPkdldFZhbHVlKCkgOiBDWEZBX0NvbG9yOjprQmxhY2tDb2xvcjsKKyAgaWYgKCFJc1RvRWRnZSgpKQorICAgIHN0ZDo6c3dhcChjclN0YXJ0LCBjckVuZCk7CisKKyAgZmxvYXQgZW5kUmFkaXVzID0gc3FydChydEZpbGwuV2lkdGgoKSAqIHJ0RmlsbC5XaWR0aCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBydEZpbGwuSGVpZ2h0KCkgKiBydEZpbGwuSGVpZ2h0KCkpIC8KKyAgICAgICAgICAgICAgICAgICAgMjsKKyAgQ1hGQV9HRVNoYWRpbmcgc2hhZGluZyhydEZpbGwuQ2VudGVyKCksIHJ0RmlsbC5DZW50ZXIoKSwgMCwgZW5kUmFkaXVzLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsIGNyU3RhcnQsIGNyRW5kKTsKKworICBwR1MtPlNhdmVHcmFwaFN0YXRlKCk7CisgIHBHUy0+U2V0RmlsbENvbG9yKENYRkFfR0VDb2xvcigmc2hhZGluZykpOworICBwR1MtPkZpbGxQYXRoKGZpbGxQYXRoLCBGWEZJTExfV0lORElORywgJm1hdHJpeCk7CisgIHBHUy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsKK30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3JhZGlhbC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmFkaWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdjZTk1YwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3JhZGlhbC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9SQURJQUxfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUkFESUFMX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2VwYXRoLmgiCisKK2NsYXNzIENYRkFfQ29sb3I7CitjbGFzcyBDWEZBX0dyYXBoaWNzOworCitjbGFzcyBDWEZBX1JhZGlhbCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9SYWRpYWwoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9SYWRpYWwoKSBvdmVycmlkZTsKKworICB2b2lkIERyYXcoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgQ1hGQV9HRVBhdGgqIGZpbGxQYXRoLAorICAgICAgICAgICAgRlhfQVJHQiBjclN0YXJ0LAorICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEZpbGwsCisgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpOworCisgcHJpdmF0ZToKKyAgYm9vbCBJc1RvRWRnZSgpOworICBDWEZBX0NvbG9yKiBHZXRDb2xvcklmRXhpc3RzKCk7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1JBRElBTF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmFuZ2UuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmFuZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNWY4NzAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yYW5nZS5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmFuZ2UuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInJhbmdlIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfUmFuZ2U6OkNYRkFfUmFuZ2UoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVYsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlJhbmdlLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfUmFuZ2U6On5DWEZBX1JhbmdlKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3JhbmdlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yYW5nZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYzhkMWYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yYW5nZS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9SQU5HRV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9SQU5HRV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1JhbmdlIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1JhbmdlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfUmFuZ2UoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUkFOR0VfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3JlYXNvbi5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWFzb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNWVkZTkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWFzb24uY3BwCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3JlYXNvbi5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3JlYXNvbi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInJlYXNvbiI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1JlYXNvbjo6Q1hGQV9SZWFzb24oQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OlRleHROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpSZWFzb24sCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX1JlYXNvbj4odGhpcykpIHt9CisKK0NYRkFfUmVhc29uOjp+Q1hGQV9SZWFzb24oKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVhc29uLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWFzb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTFmZDgyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVhc29uLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1JFQVNPTl9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9SRUFTT05fSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9SZWFzb24gOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfUmVhc29uKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfUmVhc29uKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1JFQVNPTl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVhc29ucy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWFzb25zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDNkNzYxCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVhc29ucy5jcHAKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVhc29ucy5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3JlYXNvbnMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpUeXBlLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpPcHRpb25hbH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInJlYXNvbnMiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9SZWFzb25zOjpDWEZBX1JlYXNvbnMoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlJlYXNvbnMsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX1JlYXNvbnM+KHRoaXMpKSB7fQorCitDWEZBX1JlYXNvbnM6On5DWEZBX1JlYXNvbnMoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVhc29ucy5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVhc29ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZTllMDkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWFzb25zLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1JFQVNPTlNfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUkVBU09OU19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1JlYXNvbnMgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfUmVhc29ucyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1JlYXNvbnMoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUkVBU09OU19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVjb3JkLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3JlY29yZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM1ZGVkMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3JlY29yZC5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVjb3JkLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJyZWNvcmQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9SZWNvcmQ6OkNYRkFfUmVjb3JkKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpSZWNvcmQsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9SZWNvcmQ6On5DWEZBX1JlY29yZCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWNvcmQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3JlY29yZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMjYyMmQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWNvcmQuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUkVDT1JEX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1JFQ09SRF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1JlY29yZCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9SZWNvcmQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9SZWNvcmQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUkVDT1JEX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWNvcmRzZXQuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVjb3Jkc2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTBjNTg5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVjb3Jkc2V0LmNwcApAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWNvcmRzZXQuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9yZWNvcmRzZXQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TWF4LCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkVvZkFjdGlvbiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6TW92ZUxhc3R9LAorICAgIHtYRkFfQXR0cmlidXRlOjpDdXJzb3JUeXBlLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpGb3J3YXJkT25seX0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2tUeXBlLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpSZWFkT25seX0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkJvZkFjdGlvbiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6TW92ZUZpcnN0fSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6Q3Vyc29yTG9jYXRpb24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OkNsaWVudH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInJlY29yZFNldCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1JlY29yZFNldDo6Q1hGQV9SZWNvcmRTZXQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6UmVjb3JkU2V0LAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9SZWNvcmRTZXQ+KHRoaXMpKSB7fQorCitDWEZBX1JlY29yZFNldDo6fkNYRkFfUmVjb3JkU2V0KCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3JlY29yZHNldC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVjb3Jkc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYyMzUxNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3JlY29yZHNldC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9SRUNPUkRTRVRfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUkVDT1JEU0VUX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfUmVjb3JkU2V0IDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1JlY29yZFNldChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1JlY29yZFNldCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9SRUNPUkRTRVRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3JlY3RhbmdsZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWN0YW5nbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOThkZjAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWN0YW5nbGUuY3BwCkBAIC0wLDAgKzEsNjEwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWN0YW5nbGUuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfcmVjdGFuZ2xlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2Nvcm5lci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3N0cm9rZS5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpFZGdlLCA0LCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OkNvcm5lciwgNCwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpGaWxsLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpIYW5kLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpFdmVufSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwicmVjdGFuZ2xlIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfUmVjdGFuZ2xlOjpDWEZBX1JlY3RhbmdsZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfQm94KGRvYywKKyAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlJlY3RhbmdsZSwKKyAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9SZWN0YW5nbGU+KHRoaXMpKSB7fQorCitDWEZBX1JlY3RhbmdsZTo6Q1hGQV9SZWN0YW5nbGUoQ1hGQV9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBlUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbGlkUGFja2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZSBvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudCBlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9wZXJ0eURhdGEqIHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlRGF0YSogYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgZWxlbWVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKWF9PYmplY3Q+IGpzX25vZGUpCisgICAgOiBDWEZBX0JveChwRG9jLAorICAgICAgICAgICAgICAgZVBhY2tldCwKKyAgICAgICAgICAgICAgIHZhbGlkUGFja2V0cywKKyAgICAgICAgICAgICAgIG9UeXBlLAorICAgICAgICAgICAgICAgZVR5cGUsCisgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgIGVsZW1lbnROYW1lLAorICAgICAgICAgICAgICAgc3RkOjptb3ZlKGpzX25vZGUpKSB7fQorCitDWEZBX1JlY3RhbmdsZTo6fkNYRkFfUmVjdGFuZ2xlKCkge30KKwordm9pZCBDWEZBX1JlY3RhbmdsZTo6R2V0RmlsbFBhdGgoY29uc3Qgc3RkOjp2ZWN0b3I8Q1hGQV9TdHJva2UqPiYgc3Ryb2tlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0dFUGF0aCogZmlsbFBhdGgpIHsKKyAgYm9vbCBiU2FtZVN0eWxlcyA9IHRydWU7CisgIENYRkFfU3Ryb2tlKiBzdHJva2UxID0gc3Ryb2tlc1swXTsKKyAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgODsgaSsrKSB7CisgICAgQ1hGQV9TdHJva2UqIHN0cm9rZTIgPSBzdHJva2VzW2ldOworICAgIGlmICghc3Ryb2tlMS0+U2FtZVN0eWxlcyhzdHJva2UyLCAwKSkgeworICAgICAgYlNhbWVTdHlsZXMgPSBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBzdHJva2UxID0gc3Ryb2tlMjsKKyAgfQorCisgIGlmIChiU2FtZVN0eWxlcykgeworICAgIHN0cm9rZTEgPSBzdHJva2VzWzBdOworICAgIGZvciAoaW50MzJfdCBpID0gMjsgaSA8IDg7IGkgKz0gMikgeworICAgICAgQ1hGQV9TdHJva2UqIHN0cm9rZTIgPSBzdHJva2VzW2ldOworICAgICAgaWYgKCFzdHJva2UxLT5TYW1lU3R5bGVzKHN0cm9rZTIsIFhGQV9TVFJPS0VfU0FNRVNUWUxFX05vUHJlc2VuY2UgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfU1RST0tFX1NBTUVTVFlMRV9Db3JuZXIpKSB7CisgICAgICAgIGJTYW1lU3R5bGVzID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgc3Ryb2tlMSA9IHN0cm9rZTI7CisgICAgfQorICAgIGlmIChiU2FtZVN0eWxlcykgeworICAgICAgc3Ryb2tlMSA9IHN0cm9rZXNbMF07CisgICAgICBpZiAoc3Ryb2tlMS0+SXNJbnZlcnRlZCgpKQorICAgICAgICBiU2FtZVN0eWxlcyA9IGZhbHNlOworICAgICAgaWYgKHN0cm9rZTEtPkdldEpvaW5UeXBlKCkgIT0gWEZBX0F0dHJpYnV0ZUVudW06OlNxdWFyZSkKKyAgICAgICAgYlNhbWVTdHlsZXMgPSBmYWxzZTsKKyAgICB9CisgIH0KKyAgaWYgKGJTYW1lU3R5bGVzKSB7CisgICAgZmlsbFBhdGgtPkFkZFJlY3RhbmdsZShydFdpZGdldC5sZWZ0LCBydFdpZGdldC50b3AsIHJ0V2lkZ2V0LndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRXaWRnZXQuaGVpZ2h0KTsKKyAgICByZXR1cm47CisgIH0KKworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA4OyBpICs9IDIpIHsKKyAgICBmbG9hdCBzeCA9IDAuMGY7CisgICAgZmxvYXQgc3kgPSAwLjBmOworICAgIGZsb2F0IHZ4ID0gMS4wZjsKKyAgICBmbG9hdCB2eSA9IDEuMGY7CisgICAgZmxvYXQgbnggPSAxLjBmOworICAgIGZsb2F0IG55ID0gMS4wZjsKKyAgICBDRlhfUG9pbnRGIGNwMSwgY3AyOworICAgIGF1dG8qIGNvcm5lcjEgPSBzdGF0aWNfY2FzdDxDWEZBX0Nvcm5lcio+KHN0cm9rZXNbaV0pOworICAgIGF1dG8qIGNvcm5lcjIgPSBzdGF0aWNfY2FzdDxDWEZBX0Nvcm5lcio+KHN0cm9rZXNbKGkgKyAyKSAlIDhdKTsKKyAgICBmbG9hdCBmUmFkaXVzMSA9IGNvcm5lcjEtPkdldFJhZGl1cygpOworICAgIGZsb2F0IGZSYWRpdXMyID0gY29ybmVyMi0+R2V0UmFkaXVzKCk7CisgICAgYm9vbCBiSW52ZXJ0ZWQgPSBjb3JuZXIxLT5Jc0ludmVydGVkKCk7CisgICAgYm9vbCBiUm91bmQgPSBjb3JuZXIxLT5HZXRKb2luVHlwZSgpID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpSb3VuZDsKKyAgICBpZiAoYlJvdW5kKSB7CisgICAgICBzeSA9IEZYX1BJIC8gMjsKKyAgICB9CisgICAgc3dpdGNoIChpKSB7CisgICAgICBjYXNlIDA6CisgICAgICAgIGNwMSA9IHJ0V2lkZ2V0LlRvcExlZnQoKTsKKyAgICAgICAgY3AyID0gcnRXaWRnZXQuVG9wUmlnaHQoKTsKKyAgICAgICAgdnggPSAxLCB2eSA9IDE7CisgICAgICAgIG54ID0gLTEsIG55ID0gMDsKKyAgICAgICAgaWYgKGJSb3VuZCkgeworICAgICAgICAgIHN4ID0gYkludmVydGVkID8gRlhfUEkgLyAyIDogRlhfUEk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3ggPSAxLCBzeSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICAgIGNwMSA9IHJ0V2lkZ2V0LlRvcFJpZ2h0KCk7CisgICAgICAgIGNwMiA9IHJ0V2lkZ2V0LkJvdHRvbVJpZ2h0KCk7CisgICAgICAgIHZ4ID0gLTEsIHZ5ID0gMTsKKyAgICAgICAgbnggPSAwLCBueSA9IC0xOworICAgICAgICBpZiAoYlJvdW5kKSB7CisgICAgICAgICAgc3ggPSBiSW52ZXJ0ZWQgPyBGWF9QSSA6IEZYX1BJICogMyAvIDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3ggPSAwLCBzeSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ6CisgICAgICAgIGNwMSA9IHJ0V2lkZ2V0LkJvdHRvbVJpZ2h0KCk7CisgICAgICAgIGNwMiA9IHJ0V2lkZ2V0LkJvdHRvbUxlZnQoKTsKKyAgICAgICAgdnggPSAtMSwgdnkgPSAtMTsKKyAgICAgICAgbnggPSAxLCBueSA9IDA7CisgICAgICAgIGlmIChiUm91bmQpIHsKKyAgICAgICAgICBzeCA9IGJJbnZlcnRlZCA/IEZYX1BJICogMyAvIDIgOiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHN4ID0gLTEsIHN5ID0gMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgNjoKKyAgICAgICAgY3AxID0gcnRXaWRnZXQuQm90dG9tTGVmdCgpOworICAgICAgICBjcDIgPSBydFdpZGdldC5Ub3BMZWZ0KCk7CisgICAgICAgIHZ4ID0gMSwgdnkgPSAtMTsKKyAgICAgICAgbnggPSAwLCBueSA9IDE7CisgICAgICAgIGlmIChiUm91bmQpIHsKKyAgICAgICAgICBzeCA9IGJJbnZlcnRlZCA/IDAgOiBGWF9QSSAvIDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc3ggPSAwOworICAgICAgICAgIHN5ID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmIChpID09IDApCisgICAgICBmaWxsUGF0aC0+TW92ZVRvKENGWF9Qb2ludEYoY3AxLngsIGNwMS55ICsgZlJhZGl1czEpKTsKKworICAgIGlmIChiUm91bmQpIHsKKyAgICAgIGlmIChmUmFkaXVzMSA8IDApCisgICAgICAgIHN4IC09IEZYX1BJOworICAgICAgaWYgKGJJbnZlcnRlZCkKKyAgICAgICAgc3kgKj0gLTE7CisKKyAgICAgIENGWF9SZWN0RiBydFJhZGl1cyhjcDEueCwgY3AxLnksIGZSYWRpdXMxICogMiAqIHZ4LCBmUmFkaXVzMSAqIDIgKiB2eSk7CisgICAgICBydFJhZGl1cy5Ob3JtYWxpemUoKTsKKyAgICAgIGlmIChiSW52ZXJ0ZWQpCisgICAgICAgIHJ0UmFkaXVzLk9mZnNldCgtZlJhZGl1czEgKiB2eCwgLWZSYWRpdXMxICogdnkpOworCisgICAgICBmaWxsUGF0aC0+QXJjVG8ocnRSYWRpdXMuVG9wTGVmdCgpLCBydFJhZGl1cy5TaXplKCksIHN4LCBzeSk7CisgICAgfSBlbHNlIHsKKyAgICAgIENGWF9Qb2ludEYgY3A7CisgICAgICBpZiAoYkludmVydGVkKSB7CisgICAgICAgIGNwLnggPSBjcDEueCArIGZSYWRpdXMxICogdng7CisgICAgICAgIGNwLnkgPSBjcDEueSArIGZSYWRpdXMxICogdnk7CisgICAgICB9IGVsc2UgeworICAgICAgICBjcCA9IGNwMTsKKyAgICAgIH0KKyAgICAgIGZpbGxQYXRoLT5MaW5lVG8oY3ApOworICAgICAgZmlsbFBhdGgtPkxpbmVUbygKKyAgICAgICAgICBDRlhfUG9pbnRGKGNwMS54ICsgZlJhZGl1czEgKiBzeCwgY3AxLnkgKyBmUmFkaXVzMSAqIHN5KSk7CisgICAgfQorICAgIGZpbGxQYXRoLT5MaW5lVG8oQ0ZYX1BvaW50RihjcDIueCArIGZSYWRpdXMyICogbngsIGNwMi55ICsgZlJhZGl1czIgKiBueSkpOworICB9Cit9CisKK3ZvaWQgQ1hGQV9SZWN0YW5nbGU6OkRyYXcoY29uc3Qgc3RkOjp2ZWN0b3I8Q1hGQV9TdHJva2UqPiYgc3Ryb2tlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnRXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBib29sIGJWaXNpYmxlID0gZmFsc2U7CisgIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IDQ7IGorKykgeworICAgIGlmIChzdHJva2VzW2ogKiAyICsgMV0tPklzVmlzaWJsZSgpKSB7CisgICAgICBiVmlzaWJsZSA9IHRydWU7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKCFiVmlzaWJsZSkKKyAgICByZXR1cm47CisKKyAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgODsgaSArPSAyKSB7CisgICAgZmxvYXQgZlRoaWNrbmVzcyA9IHN0ZDo6Zm1heCgwLjAsIHN0cm9rZXNbaV0tPkdldFRoaWNrbmVzcygpKTsKKyAgICBmbG9hdCBmSGFsZiA9IGZUaGlja25lc3MgLyAyOworICAgIFhGQV9BdHRyaWJ1dGVFbnVtIGlIYW5kID0gR2V0SGFuZCgpOworICAgIHN3aXRjaCAoaSkgeworICAgICAgY2FzZSAxOgorICAgICAgICBpZiAoaUhhbmQgPT0gWEZBX0F0dHJpYnV0ZUVudW06OkxlZnQpIHsKKyAgICAgICAgICBydFdpZGdldC50b3AgLT0gZkhhbGY7CisgICAgICAgICAgcnRXaWRnZXQuaGVpZ2h0ICs9IGZIYWxmOworICAgICAgICB9IGVsc2UgaWYgKGlIYW5kID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpSaWdodCkgeworICAgICAgICAgIHJ0V2lkZ2V0LnRvcCArPSBmSGFsZjsKKyAgICAgICAgICBydFdpZGdldC5oZWlnaHQgLT0gZkhhbGY7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDM6CisgICAgICAgIGlmIChpSGFuZCA9PSBYRkFfQXR0cmlidXRlRW51bTo6TGVmdCkgeworICAgICAgICAgIHJ0V2lkZ2V0LndpZHRoICs9IGZIYWxmOworICAgICAgICB9IGVsc2UgaWYgKGlIYW5kID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpSaWdodCkgeworICAgICAgICAgIHJ0V2lkZ2V0LndpZHRoIC09IGZIYWxmOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA1OgorICAgICAgICBpZiAoaUhhbmQgPT0gWEZBX0F0dHJpYnV0ZUVudW06OkxlZnQpIHsKKyAgICAgICAgICBydFdpZGdldC5oZWlnaHQgKz0gZkhhbGY7CisgICAgICAgIH0gZWxzZSBpZiAoaUhhbmQgPT0gWEZBX0F0dHJpYnV0ZUVudW06OlJpZ2h0KSB7CisgICAgICAgICAgcnRXaWRnZXQuaGVpZ2h0IC09IGZIYWxmOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA3OgorICAgICAgICBpZiAoaUhhbmQgPT0gWEZBX0F0dHJpYnV0ZUVudW06OkxlZnQpIHsKKyAgICAgICAgICBydFdpZGdldC5sZWZ0IC09IGZIYWxmOworICAgICAgICAgIHJ0V2lkZ2V0LndpZHRoICs9IGZIYWxmOworICAgICAgICB9IGVsc2UgaWYgKGlIYW5kID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpSaWdodCkgeworICAgICAgICAgIHJ0V2lkZ2V0LmxlZnQgKz0gZkhhbGY7CisgICAgICAgICAgcnRXaWRnZXQud2lkdGggLT0gZkhhbGY7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIFN0cm9rZShzdHJva2VzLCBwR1MsIHJ0V2lkZ2V0LCBtYXRyaXgpOworfQorCit2b2lkIENYRkFfUmVjdGFuZ2xlOjpTdHJva2UoY29uc3Qgc3RkOjp2ZWN0b3I8Q1hGQV9TdHJva2UqPiYgc3Ryb2tlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBib29sIGJWaXNpYmxlOworICBmbG9hdCBmVGhpY2tuZXNzOworICBYRkFfQXR0cmlidXRlRW51bSBpM0RUeXBlOworICBzdGQ6OnRpZShpM0RUeXBlLCBiVmlzaWJsZSwgZlRoaWNrbmVzcykgPSBHZXQzRFN0eWxlKCk7CisgIGlmIChpM0RUeXBlICE9IFhGQV9BdHRyaWJ1dGVFbnVtOjpVbmtub3duKSB7CisgICAgaWYgKCFiVmlzaWJsZSB8fCBmVGhpY2tuZXNzIDwgMC4wMDFmKQorICAgICAgcmV0dXJuOworCisgICAgc3dpdGNoIChpM0RUeXBlKSB7CisgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpMb3dlcmVkOgorICAgICAgICBTdHJva2VMb3dlcmVkKHBHUywgcnRXaWRnZXQsIGZUaGlja25lc3MsIG1hdHJpeCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6UmFpc2VkOgorICAgICAgICBTdHJva2VSYWlzZWQocEdTLCBydFdpZGdldCwgZlRoaWNrbmVzcywgbWF0cml4KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpFdGNoZWQ6CisgICAgICAgIFN0cm9rZUV0Y2hlZChwR1MsIHJ0V2lkZ2V0LCBmVGhpY2tuZXNzLCBtYXRyaXgpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkVtYm9zc2VkOgorICAgICAgICBTdHJva2VFbWJvc3NlZChwR1MsIHJ0V2lkZ2V0LCBmVGhpY2tuZXNzLCBtYXRyaXgpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIGJvb2wgYkNsb3NlID0gZmFsc2U7CisgIGJvb2wgYlNhbWVTdHlsZXMgPSB0cnVlOworICBDWEZBX1N0cm9rZSogc3Ryb2tlMSA9IHN0cm9rZXNbMF07CisgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IDg7IGkrKykgeworICAgIENYRkFfU3Ryb2tlKiBzdHJva2UyID0gc3Ryb2tlc1tpXTsKKyAgICBpZiAoIXN0cm9rZTEtPlNhbWVTdHlsZXMoc3Ryb2tlMiwgMCkpIHsKKyAgICAgIGJTYW1lU3R5bGVzID0gZmFsc2U7CisgICAgICBicmVhazsKKyAgICB9CisgICAgc3Ryb2tlMSA9IHN0cm9rZTI7CisgIH0KKyAgaWYgKGJTYW1lU3R5bGVzKSB7CisgICAgc3Ryb2tlMSA9IHN0cm9rZXNbMF07CisgICAgYkNsb3NlID0gdHJ1ZTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDI7IGkgPCA4OyBpICs9IDIpIHsKKyAgICAgIENYRkFfU3Ryb2tlKiBzdHJva2UyID0gc3Ryb2tlc1tpXTsKKyAgICAgIGlmICghc3Ryb2tlMS0+U2FtZVN0eWxlcyhzdHJva2UyLCBYRkFfU1RST0tFX1NBTUVTVFlMRV9Ob1ByZXNlbmNlIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1NUUk9LRV9TQU1FU1RZTEVfQ29ybmVyKSkgeworICAgICAgICBiU2FtZVN0eWxlcyA9IGZhbHNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHN0cm9rZTEgPSBzdHJva2UyOworICAgIH0KKyAgICBpZiAoYlNhbWVTdHlsZXMpIHsKKyAgICAgIHN0cm9rZTEgPSBzdHJva2VzWzBdOworICAgICAgaWYgKHN0cm9rZTEtPklzSW52ZXJ0ZWQoKSkKKyAgICAgICAgYlNhbWVTdHlsZXMgPSBmYWxzZTsKKyAgICAgIGlmIChzdHJva2UxLT5HZXRKb2luVHlwZSgpICE9IFhGQV9BdHRyaWJ1dGVFbnVtOjpTcXVhcmUpCisgICAgICAgIGJTYW1lU3R5bGVzID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgYm9vbCBiU3RhcnQgPSB0cnVlOworICBDWEZBX0dFUGF0aCBwYXRoOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICBDWEZBX1N0cm9rZSogc3Ryb2tlID0gc3Ryb2tlc1tpXTsKKyAgICBpZiAoKGkgJSAxKSA9PSAwICYmIHN0cm9rZS0+R2V0UmFkaXVzKCkgPCAwKSB7CisgICAgICBib29sIGJFbXB0eSA9IHBhdGguSXNFbXB0eSgpOworICAgICAgaWYgKCFiRW1wdHkpIHsKKyAgICAgICAgaWYgKHN0cm9rZSkKKyAgICAgICAgICBzdHJva2UtPlN0cm9rZSgmcGF0aCwgcEdTLCBtYXRyaXgpOworICAgICAgICBwYXRoLkNsZWFyKCk7CisgICAgICB9CisgICAgICBiU3RhcnQgPSB0cnVlOworICAgICAgY29udGludWU7CisgICAgfQorICAgIEdldFBhdGgoc3Ryb2tlcywgcnRXaWRnZXQsIHBhdGgsIGksIGJTdGFydCwgIWJTYW1lU3R5bGVzKTsKKworICAgIGJTdGFydCA9ICFzdHJva2UtPlNhbWVTdHlsZXMoc3Ryb2tlc1soaSArIDEpICUgOF0sIDApOworICAgIGlmIChiU3RhcnQpIHsKKyAgICAgIGlmIChzdHJva2UpCisgICAgICAgIHN0cm9rZS0+U3Ryb2tlKCZwYXRoLCBwR1MsIG1hdHJpeCk7CisgICAgICBwYXRoLkNsZWFyKCk7CisgICAgfQorICB9CisgIGJvb2wgYkVtcHR5ID0gcGF0aC5Jc0VtcHR5KCk7CisgIGlmICghYkVtcHR5KSB7CisgICAgaWYgKGJDbG9zZSkgeworICAgICAgcGF0aC5DbG9zZSgpOworICAgIH0KKyAgICBpZiAoc3Ryb2tlc1s3XSkKKyAgICAgIHN0cm9rZXNbN10tPlN0cm9rZSgmcGF0aCwgcEdTLCBtYXRyaXgpOworICB9Cit9CisKK3ZvaWQgQ1hGQV9SZWN0YW5nbGU6OlN0cm9rZVJlY3QoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZMaW5lV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiVG9wTGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfQVJHQiBhcmdiQm90dG9tUmlnaHQpIHsKKyAgZmxvYXQgZkJvdHRvbSA9IHJ0LmJvdHRvbSgpOworICBmbG9hdCBmUmlnaHQgPSBydC5yaWdodCgpOworICBDWEZBX0dFUGF0aCBwYXRoTFQ7CisgIHBhdGhMVC5Nb3ZlVG8oQ0ZYX1BvaW50RihydC5sZWZ0LCBmQm90dG9tKSk7CisgIHBhdGhMVC5MaW5lVG8oQ0ZYX1BvaW50RihydC5sZWZ0LCBydC50b3ApKTsKKyAgcGF0aExULkxpbmVUbyhDRlhfUG9pbnRGKGZSaWdodCwgcnQudG9wKSk7CisgIHBhdGhMVC5MaW5lVG8oQ0ZYX1BvaW50RihmUmlnaHQgLSBmTGluZVdpZHRoLCBydC50b3AgKyBmTGluZVdpZHRoKSk7CisgIHBhdGhMVC5MaW5lVG8oQ0ZYX1BvaW50RihydC5sZWZ0ICsgZkxpbmVXaWR0aCwgcnQudG9wICsgZkxpbmVXaWR0aCkpOworICBwYXRoTFQuTGluZVRvKENGWF9Qb2ludEYocnQubGVmdCArIGZMaW5lV2lkdGgsIGZCb3R0b20gLSBmTGluZVdpZHRoKSk7CisgIHBhdGhMVC5MaW5lVG8oQ0ZYX1BvaW50RihydC5sZWZ0LCBmQm90dG9tKSk7CisgIHBHcmFwaGljLT5TZXRGaWxsQ29sb3IoQ1hGQV9HRUNvbG9yKGFyZ2JUb3BMZWZ0KSk7CisgIHBHcmFwaGljLT5GaWxsUGF0aCgmcGF0aExULCBGWEZJTExfV0lORElORywgJm1hdHJpeCk7CisKKyAgQ1hGQV9HRVBhdGggcGF0aFJCOworICBwYXRoUkIuTW92ZVRvKENGWF9Qb2ludEYoZlJpZ2h0LCBydC50b3ApKTsKKyAgcGF0aFJCLkxpbmVUbyhDRlhfUG9pbnRGKGZSaWdodCwgZkJvdHRvbSkpOworICBwYXRoUkIuTGluZVRvKENGWF9Qb2ludEYocnQubGVmdCwgZkJvdHRvbSkpOworICBwYXRoUkIuTGluZVRvKENGWF9Qb2ludEYocnQubGVmdCArIGZMaW5lV2lkdGgsIGZCb3R0b20gLSBmTGluZVdpZHRoKSk7CisgIHBhdGhSQi5MaW5lVG8oQ0ZYX1BvaW50RihmUmlnaHQgLSBmTGluZVdpZHRoLCBmQm90dG9tIC0gZkxpbmVXaWR0aCkpOworICBwYXRoUkIuTGluZVRvKENGWF9Qb2ludEYoZlJpZ2h0IC0gZkxpbmVXaWR0aCwgcnQudG9wICsgZkxpbmVXaWR0aCkpOworICBwYXRoUkIuTGluZVRvKENGWF9Qb2ludEYoZlJpZ2h0LCBydC50b3ApKTsKKyAgcEdyYXBoaWMtPlNldEZpbGxDb2xvcihDWEZBX0dFQ29sb3IoYXJnYkJvdHRvbVJpZ2h0KSk7CisgIHBHcmFwaGljLT5GaWxsUGF0aCgmcGF0aFJCLCBGWEZJTExfV0lORElORywgJm1hdHJpeCk7Cit9CisKK3ZvaWQgQ1hGQV9SZWN0YW5nbGU6OlN0cm9rZUxvd2VyZWQoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZUaGlja25lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBmbG9hdCBmSGFsZldpZHRoID0gZlRoaWNrbmVzcyAvIDIuMGY7CisgIENGWF9SZWN0RiBydElubmVyKHJ0KTsKKyAgcnRJbm5lci5EZWZsYXRlKGZIYWxmV2lkdGgsIGZIYWxmV2lkdGgpOworCisgIENYRkFfR0VQYXRoIHBhdGg7CisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0LmxlZnQsIHJ0LnRvcCwgcnQud2lkdGgsIHJ0LmhlaWdodCk7CisgIHBhdGguQWRkUmVjdGFuZ2xlKHJ0SW5uZXIubGVmdCwgcnRJbm5lci50b3AsIHJ0SW5uZXIud2lkdGgsIHJ0SW5uZXIuaGVpZ2h0KTsKKyAgcEdTLT5TZXRGaWxsQ29sb3IoQ1hGQV9HRUNvbG9yKDB4RkYwMDAwMDApKTsKKyAgcEdTLT5GaWxsUGF0aCgmcGF0aCwgRlhGSUxMX0FMVEVSTkFURSwgJm1hdHJpeCk7CisKKyAgU3Ryb2tlUmVjdChwR1MsIHJ0SW5uZXIsIGZIYWxmV2lkdGgsIG1hdHJpeCwgMHhGRjgwODA4MCwgMHhGRkMwQzBDMCk7Cit9CisKK3ZvaWQgQ1hGQV9SZWN0YW5nbGU6OlN0cm9rZVJhaXNlZChDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZUaGlja25lc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7CisgIGZsb2F0IGZIYWxmV2lkdGggPSBmVGhpY2tuZXNzIC8gMi4wZjsKKyAgQ0ZYX1JlY3RGIHJ0SW5uZXIocnQpOworICBydElubmVyLkRlZmxhdGUoZkhhbGZXaWR0aCwgZkhhbGZXaWR0aCk7CisKKyAgQ1hGQV9HRVBhdGggcGF0aDsKKyAgcGF0aC5BZGRSZWN0YW5nbGUocnQubGVmdCwgcnQudG9wLCBydC53aWR0aCwgcnQuaGVpZ2h0KTsKKyAgcGF0aC5BZGRSZWN0YW5nbGUocnRJbm5lci5sZWZ0LCBydElubmVyLnRvcCwgcnRJbm5lci53aWR0aCwgcnRJbm5lci5oZWlnaHQpOworICBwR1MtPlNldEZpbGxDb2xvcihDWEZBX0dFQ29sb3IoMHhGRjAwMDAwMCkpOworICBwR1MtPkZpbGxQYXRoKCZwYXRoLCBGWEZJTExfQUxURVJOQVRFLCAmbWF0cml4KTsKKworICBTdHJva2VSZWN0KHBHUywgcnRJbm5lciwgZkhhbGZXaWR0aCwgbWF0cml4LCAweEZGRkZGRkZGLCAweEZGODA4MDgwKTsKK30KKwordm9pZCBDWEZBX1JlY3RhbmdsZTo6U3Ryb2tlRXRjaGVkKENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZlRoaWNrbmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKKyAgZmxvYXQgZkhhbGZXaWR0aCA9IGZUaGlja25lc3MgLyAyLjBmOworICBTdHJva2VSZWN0KHBHUywgcnQsIGZUaGlja25lc3MsIG1hdHJpeCwgMHhGRjgwODA4MCwgMHhGRkZGRkZGRik7CisKKyAgQ0ZYX1JlY3RGIHJ0SW5uZXIocnQpOworICBydElubmVyLkRlZmxhdGUoZkhhbGZXaWR0aCwgZkhhbGZXaWR0aCk7CisgIFN0cm9rZVJlY3QocEdTLCBydElubmVyLCBmSGFsZldpZHRoLCBtYXRyaXgsIDB4RkZGRkZGRkYsIDB4RkY4MDgwODApOworfQorCit2b2lkIENYRkFfUmVjdGFuZ2xlOjpTdHJva2VFbWJvc3NlZChDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmVGhpY2tuZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7CisgIGZsb2F0IGZIYWxmV2lkdGggPSBmVGhpY2tuZXNzIC8gMi4wZjsKKyAgU3Ryb2tlUmVjdChwR1MsIHJ0LCBmVGhpY2tuZXNzLCBtYXRyaXgsIDB4RkY4MDgwODAsIDB4RkYwMDAwMDApOworCisgIENGWF9SZWN0RiBydElubmVyKHJ0KTsKKyAgcnRJbm5lci5EZWZsYXRlKGZIYWxmV2lkdGgsIGZIYWxmV2lkdGgpOworICBTdHJva2VSZWN0KHBHUywgcnRJbm5lciwgZkhhbGZXaWR0aCwgbWF0cml4LCAweEZGMDAwMDAwLCAweEZGODA4MDgwKTsKK30KKwordm9pZCBDWEZBX1JlY3RhbmdsZTo6R2V0UGF0aChjb25zdCBzdGQ6OnZlY3RvcjxDWEZBX1N0cm9rZSo+JiBzdHJva2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnRXaWRnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfR0VQYXRoJiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNvcm5lcikgeworICBBU1NFUlQobkluZGV4ID49IDAgJiYgbkluZGV4IDwgOCk7CisKKyAgaW50MzJfdCBuID0gKG5JbmRleCAmIDEpID8gbkluZGV4IC0gMSA6IG5JbmRleDsKKyAgYXV0byogY29ybmVyMSA9IHN0YXRpY19jYXN0PENYRkFfQ29ybmVyKj4oc3Ryb2tlc1tuXSk7CisgIGF1dG8qIGNvcm5lcjIgPSBzdGF0aWNfY2FzdDxDWEZBX0Nvcm5lcio+KHN0cm9rZXNbKG4gKyAyKSAlIDhdKTsKKyAgZmxvYXQgZlJhZGl1czEgPSBiQ29ybmVyID8gY29ybmVyMS0+R2V0UmFkaXVzKCkgOiAwLjBmOworICBmbG9hdCBmUmFkaXVzMiA9IGJDb3JuZXIgPyBjb3JuZXIyLT5HZXRSYWRpdXMoKSA6IDAuMGY7CisgIGJvb2wgYkludmVydGVkID0gY29ybmVyMS0+SXNJbnZlcnRlZCgpOworICBmbG9hdCBvZmZzZXRZID0gMC4wZjsKKyAgZmxvYXQgb2Zmc2V0WCA9IDAuMGY7CisgIGJvb2wgYlJvdW5kID0gY29ybmVyMS0+R2V0Sm9pblR5cGUoKSA9PSBYRkFfQXR0cmlidXRlRW51bTo6Um91bmQ7CisgIGZsb2F0IGhhbGZBZnRlciA9IDAuMGY7CisgIGZsb2F0IGhhbGZCZWZvcmUgPSAwLjBmOworCisgIENYRkFfU3Ryb2tlKiBzdHJva2UgPSBzdHJva2VzW25JbmRleF07CisgIGlmIChzdHJva2UtPklzQ29ybmVyKCkpIHsKKyAgICBDWEZBX1N0cm9rZSogc3Ryb2tlQmVmb3JlID0gc3Ryb2tlc1sobkluZGV4ICsgMSAqIDggLSAxKSAlIDhdOworICAgIENYRkFfU3Ryb2tlKiBzdHJva2VBZnRlciA9IHN0cm9rZXNbbkluZGV4ICsgMV07CisgICAgaWYgKHN0cm9rZS0+SXNJbnZlcnRlZCgpKSB7CisgICAgICBpZiAoIXN0cm9rZS0+U2FtZVN0eWxlcyhzdHJva2VCZWZvcmUsIDApKQorICAgICAgICBoYWxmQmVmb3JlID0gc3Ryb2tlQmVmb3JlLT5HZXRUaGlja25lc3MoKSAvIDI7CisgICAgICBpZiAoIXN0cm9rZS0+U2FtZVN0eWxlcyhzdHJva2VBZnRlciwgMCkpCisgICAgICAgIGhhbGZBZnRlciA9IHN0cm9rZUFmdGVyLT5HZXRUaGlja25lc3MoKSAvIDI7CisgICAgfQorICB9IGVsc2UgeworICAgIENYRkFfU3Ryb2tlKiBzdHJva2VCZWZvcmUgPSBzdHJva2VzWyhuSW5kZXggKyA4IC0gMikgJSA4XTsKKyAgICBDWEZBX1N0cm9rZSogc3Ryb2tlQWZ0ZXIgPSBzdHJva2VzWyhuSW5kZXggKyAyKSAlIDhdOworICAgIGlmICghYlJvdW5kICYmICFiSW52ZXJ0ZWQpIHsKKyAgICAgIGhhbGZCZWZvcmUgPSBzdHJva2VCZWZvcmUtPkdldFRoaWNrbmVzcygpIC8gMjsKKyAgICAgIGhhbGZBZnRlciA9IHN0cm9rZUFmdGVyLT5HZXRUaGlja25lc3MoKSAvIDI7CisgICAgfQorICB9CisKKyAgZmxvYXQgb2Zmc2V0RVggPSAwLjBmOworICBmbG9hdCBvZmZzZXRFWSA9IDAuMGY7CisgIGZsb2F0IHN4ID0gMC4wZjsKKyAgZmxvYXQgc3kgPSAwLjBmOworICBmbG9hdCB2eCA9IDEuMGY7CisgIGZsb2F0IHZ5ID0gMS4wZjsKKyAgZmxvYXQgbnggPSAxLjBmOworICBmbG9hdCBueSA9IDEuMGY7CisgIENGWF9Qb2ludEYgY3BTdGFydDsKKyAgQ0ZYX1BvaW50RiBjcDE7CisgIENGWF9Qb2ludEYgY3AyOworICBpZiAoYlJvdW5kKQorICAgIHN5ID0gRlhfUEkgLyAyOworCisgIHN3aXRjaCAobkluZGV4KSB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKyAgICAgIGNwMSA9IHJ0V2lkZ2V0LlRvcExlZnQoKTsKKyAgICAgIGNwMiA9IHJ0V2lkZ2V0LlRvcFJpZ2h0KCk7CisgICAgICBpZiAobkluZGV4ID09IDApIHsKKyAgICAgICAgY3BTdGFydC54ID0gY3AxLnggLSBoYWxmQmVmb3JlOworICAgICAgICBjcFN0YXJ0LnkgPSBjcDEueSArIGZSYWRpdXMxLCBvZmZzZXRZID0gLWhhbGZBZnRlcjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNwU3RhcnQueCA9IGNwMS54ICsgZlJhZGl1czEgLSBoYWxmQmVmb3JlLCBjcFN0YXJ0LnkgPSBjcDEueSwKKyAgICAgICAgb2Zmc2V0RVggPSBoYWxmQWZ0ZXI7CisgICAgICB9CisgICAgICB2eCA9IDEsIHZ5ID0gMTsKKyAgICAgIG54ID0gLTEsIG55ID0gMDsKKyAgICAgIGlmIChiUm91bmQpIHsKKyAgICAgICAgc3ggPSBiSW52ZXJ0ZWQgPyBGWF9QSSAvIDIgOiBGWF9QSTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN4ID0gMSwgc3kgPSAwOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgIGNhc2UgMzoKKyAgICAgIGNwMSA9IHJ0V2lkZ2V0LlRvcFJpZ2h0KCk7CisgICAgICBjcDIgPSBydFdpZGdldC5Cb3R0b21SaWdodCgpOworICAgICAgaWYgKG5JbmRleCA9PSAyKSB7CisgICAgICAgIGNwU3RhcnQueCA9IGNwMS54IC0gZlJhZGl1czEsIGNwU3RhcnQueSA9IGNwMS55IC0gaGFsZkJlZm9yZSwKKyAgICAgICAgb2Zmc2V0WCA9IGhhbGZBZnRlcjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNwU3RhcnQueCA9IGNwMS54LCBjcFN0YXJ0LnkgPSBjcDEueSArIGZSYWRpdXMxIC0gaGFsZkJlZm9yZSwKKyAgICAgICAgb2Zmc2V0RVkgPSBoYWxmQWZ0ZXI7CisgICAgICB9CisgICAgICB2eCA9IC0xLCB2eSA9IDE7CisgICAgICBueCA9IDAsIG55ID0gLTE7CisgICAgICBpZiAoYlJvdW5kKSB7CisgICAgICAgIHN4ID0gYkludmVydGVkID8gRlhfUEkgOiBGWF9QSSAqIDMgLyAyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3ggPSAwLCBzeSA9IDE7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgY2FzZSA1OgorICAgICAgY3AxID0gcnRXaWRnZXQuQm90dG9tUmlnaHQoKTsKKyAgICAgIGNwMiA9IHJ0V2lkZ2V0LkJvdHRvbUxlZnQoKTsKKyAgICAgIGlmIChuSW5kZXggPT0gNCkgeworICAgICAgICBjcFN0YXJ0LnggPSBjcDEueCArIGhhbGZCZWZvcmUsIGNwU3RhcnQueSA9IGNwMS55IC0gZlJhZGl1czEsCisgICAgICAgIG9mZnNldFkgPSBoYWxmQWZ0ZXI7CisgICAgICB9IGVsc2UgeworICAgICAgICBjcFN0YXJ0LnggPSBjcDEueCAtIGZSYWRpdXMxICsgaGFsZkJlZm9yZSwgY3BTdGFydC55ID0gY3AxLnksCisgICAgICAgIG9mZnNldEVYID0gLWhhbGZBZnRlcjsKKyAgICAgIH0KKyAgICAgIHZ4ID0gLTEsIHZ5ID0gLTE7CisgICAgICBueCA9IDEsIG55ID0gMDsKKyAgICAgIGlmIChiUm91bmQpIHsKKyAgICAgICAgc3ggPSBiSW52ZXJ0ZWQgPyBGWF9QSSAqIDMgLyAyIDogMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN4ID0gLTEsIHN5ID0gMDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICBjYXNlIDc6CisgICAgICBjcDEgPSBydFdpZGdldC5Cb3R0b21MZWZ0KCk7CisgICAgICBjcDIgPSBydFdpZGdldC5Ub3BMZWZ0KCk7CisgICAgICBpZiAobkluZGV4ID09IDYpIHsKKyAgICAgICAgY3BTdGFydC54ID0gY3AxLnggKyBmUmFkaXVzMSwgY3BTdGFydC55ID0gY3AxLnkgKyBoYWxmQmVmb3JlLAorICAgICAgICBvZmZzZXRYID0gLWhhbGZBZnRlcjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNwU3RhcnQueCA9IGNwMS54LCBjcFN0YXJ0LnkgPSBjcDEueSAtIGZSYWRpdXMxICsgaGFsZkJlZm9yZSwKKyAgICAgICAgb2Zmc2V0RVkgPSAtaGFsZkFmdGVyOworICAgICAgfQorICAgICAgdnggPSAxOworICAgICAgdnkgPSAtMTsKKyAgICAgIG54ID0gMDsKKyAgICAgIG55ID0gMTsKKyAgICAgIGlmIChiUm91bmQpIHsKKyAgICAgICAgc3ggPSBiSW52ZXJ0ZWQgPyAwIDogRlhfUEkgLyAyOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3ggPSAwOworICAgICAgICBzeSA9IC0xOworICAgICAgfQorICAgICAgYnJlYWs7CisgIH0KKyAgaWYgKGJTdGFydCkgeworICAgIHBhdGguTW92ZVRvKGNwU3RhcnQpOworICB9CisgIGlmIChuSW5kZXggJiAxKSB7CisgICAgcGF0aC5MaW5lVG8oQ0ZYX1BvaW50RihjcDIueCArIGZSYWRpdXMyICogbnggKyBvZmZzZXRFWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwMi55ICsgZlJhZGl1czIgKiBueSArIG9mZnNldEVZKSk7CisgICAgcmV0dXJuOworICB9CisgIGlmIChiUm91bmQpIHsKKyAgICBpZiAoZlJhZGl1czEgPCAwKQorICAgICAgc3ggLT0gRlhfUEk7CisgICAgaWYgKGJJbnZlcnRlZCkKKyAgICAgIHN5ICo9IC0xOworCisgICAgQ0ZYX1JlY3RGIHJ0UmFkaXVzKGNwMS54ICsgb2Zmc2V0WCAqIDIsIGNwMS55ICsgb2Zmc2V0WSAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgIGZSYWRpdXMxICogMiAqIHZ4IC0gb2Zmc2V0WCAqIDIsCisgICAgICAgICAgICAgICAgICAgICAgIGZSYWRpdXMxICogMiAqIHZ5IC0gb2Zmc2V0WSAqIDIpOworICAgIHJ0UmFkaXVzLk5vcm1hbGl6ZSgpOworICAgIGlmIChiSW52ZXJ0ZWQpCisgICAgICBydFJhZGl1cy5PZmZzZXQoLWZSYWRpdXMxICogdngsIC1mUmFkaXVzMSAqIHZ5KTsKKworICAgIHBhdGguQXJjVG8ocnRSYWRpdXMuVG9wTGVmdCgpLCBydFJhZGl1cy5TaXplKCksIHN4LCBzeSk7CisgIH0gZWxzZSB7CisgICAgQ0ZYX1BvaW50RiBjcDsKKyAgICBpZiAoYkludmVydGVkKSB7CisgICAgICBjcC54ID0gY3AxLnggKyBmUmFkaXVzMSAqIHZ4OworICAgICAgY3AueSA9IGNwMS55ICsgZlJhZGl1czEgKiB2eTsKKyAgICB9IGVsc2UgeworICAgICAgY3AgPSBjcDE7CisgICAgfQorICAgIHBhdGguTGluZVRvKGNwKTsKKyAgICBwYXRoLkxpbmVUbyhDRlhfUG9pbnRGKGNwMS54ICsgZlJhZGl1czEgKiBzeCArIG9mZnNldFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjcDEueSArIGZSYWRpdXMxICogc3kgKyBvZmZzZXRZKSk7CisgIH0KK30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3JlY3RhbmdsZS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVjdGFuZ2xlLmgKaW5kZXggOGQxOGFjZS4uYjExN2U2NiAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVjdGFuZ2xlLmgKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVjdGFuZ2xlLmgKQEAgLTEsNCArMSw0IEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIApAQCAtNywxMyArNyw2OSBAQAogI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9SRUNUQU5HTEVfSF8KICNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUkVDVEFOR0xFX0hfCiAKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ib3guaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgogCi1jbGFzcyBDWEZBX05vZGU7CisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYm94LmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXBhdGguaCIKIAogY2xhc3MgQ1hGQV9SZWN0YW5nbGUgOiBwdWJsaWMgQ1hGQV9Cb3ggewogIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9SZWN0YW5nbGUoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0JveChwTm9kZSkge30KKyAgQ1hGQV9SZWN0YW5nbGUoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9SZWN0YW5nbGUoKSBvdmVycmlkZTsKKworICB2b2lkIEdldEZpbGxQYXRoKGNvbnN0IHN0ZDo6dmVjdG9yPENYRkFfU3Ryb2tlKj4mIHN0cm9rZXMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydFdpZGdldCwKKyAgICAgICAgICAgICAgICAgICBDWEZBX0dFUGF0aCogZmlsbFBhdGgpOworICB2b2lkIERyYXcoY29uc3Qgc3RkOjp2ZWN0b3I8Q1hGQV9TdHJva2UqPiYgc3Ryb2tlcywKKyAgICAgICAgICAgIENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgIENGWF9SZWN0RiBydFdpZGdldCwKKyAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCk7CisKKyBwcm90ZWN0ZWQ6CisgIENYRkFfUmVjdGFuZ2xlKENYRkFfRG9jdW1lbnQqIHBEb2MsCisgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIGVQYWNrZXQsCisgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbGlkUGFja2V0cywKKyAgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGUgb1R5cGUsCisgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50IGVUeXBlLAorICAgICAgICAgICAgICAgICBjb25zdCBQcm9wZXJ0eURhdGEqIHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZURhdGEqIGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiBlbGVtZW50TmFtZSwKKyAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKWF9PYmplY3Q+IGpzX25vZGUpOworCisgcHJpdmF0ZToKKyAgdm9pZCBTdHJva2UoY29uc3Qgc3RkOjp2ZWN0b3I8Q1hGQV9TdHJva2UqPiYgc3Ryb2tlcywKKyAgICAgICAgICAgICAgQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICBDRlhfUmVjdEYgcnRXaWRnZXQsCisgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCk7CisgIHZvaWQgU3Ryb2tlRW1ib3NzZWQoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICAgIENGWF9SZWN0RiBydCwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmVGhpY2tuZXNzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCk7CisgIHZvaWQgU3Ryb2tlTG93ZXJlZChDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnQsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmVGhpY2tuZXNzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KTsKKyAgdm9pZCBTdHJva2VSYWlzZWQoQ1hGQV9HcmFwaGljcyogcEdTLAorICAgICAgICAgICAgICAgICAgICBDRlhfUmVjdEYgcnQsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZUaGlja25lc3MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCk7CisgIHZvaWQgU3Ryb2tlRXRjaGVkKENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0LAorICAgICAgICAgICAgICAgICAgICBmbG9hdCBmVGhpY2tuZXNzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpOworICB2b2lkIFN0cm9rZVJlY3QoQ1hGQV9HcmFwaGljcyogcEdyYXBoaWMsCisgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0LAorICAgICAgICAgICAgICAgICAgZmxvYXQgZkxpbmVXaWR0aCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgIEZYX0FSR0IgYXJnYlRvcExlZnQsCisgICAgICAgICAgICAgICAgICBGWF9BUkdCIGFyZ2JCb3R0b21SaWdodCk7CisgIHZvaWQgR2V0UGF0aChjb25zdCBzdGQ6OnZlY3RvcjxDWEZBX1N0cm9rZSo+JiBzdHJva2VzLAorICAgICAgICAgICAgICAgQ0ZYX1JlY3RGIHJ0V2lkZ2V0LAorICAgICAgICAgICAgICAgQ1hGQV9HRVBhdGgmIHBhdGgsCisgICAgICAgICAgICAgICBpbnQzMl90IG5JbmRleCwKKyAgICAgICAgICAgICAgIGJvb2wgYlN0YXJ0LAorICAgICAgICAgICAgICAgYm9vbCBiQ29ybmVyKTsKIH07CiAKICNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUkVDVEFOR0xFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWYuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDdkZjQ0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVmLmNwcApAQCAtMCwwICsxLDM1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWYuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9yZWYuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJyZWYiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9SZWY6OkNYRkFfUmVmKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpUZXh0Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6UmVmLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9SZWY+KHRoaXMpKSB7fQorCitDWEZBX1JlZjo6fkNYRkFfUmVmKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3JlZi5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMwNTEwZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3JlZi5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9SRUZfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUkVGX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfUmVmIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1JlZihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1JlZigpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9SRUZfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3JlbGV2YW50LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3JlbGV2YW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjdmZjFlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVsZXZhbnQuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3JlbGV2YW50LmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJyZWxldmFudCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1JlbGV2YW50OjpDWEZBX1JlbGV2YW50KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpSZWxldmFudCwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX1JlbGV2YW50Ojp+Q1hGQV9SZWxldmFudCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZWxldmFudC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVsZXZhbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDE4Yzk1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVsZXZhbnQuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUkVMRVZBTlRfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUkVMRVZBTlRfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9SZWxldmFudCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9SZWxldmFudChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1JlbGV2YW50KCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1JFTEVWQU5UX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZW5hbWUuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVuYW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGFkYmQ3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVuYW1lLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZW5hbWUuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInJlbmFtZSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1JlbmFtZTo6Q1hGQV9SZW5hbWUoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVYsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlJlbmFtZSwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX1JlbmFtZTo6fkNYRkFfUmVuYW1lKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3JlbmFtZS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVuYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1Yzg1MgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3JlbmFtZS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9SRU5BTUVfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUkVOQU1FX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfUmVuYW1lIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1JlbmFtZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1JlbmFtZSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9SRU5BTUVfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3JlbmRlcnBvbGljeS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZW5kZXJwb2xpY3kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YWJkYjMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZW5kZXJwb2xpY3kuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3JlbmRlcnBvbGljeS5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwicmVuZGVyUG9saWN5IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfUmVuZGVyUG9saWN5OjpDWEZBX1JlbmRlclBvbGljeShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6UmVuZGVyUG9saWN5LAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfUmVuZGVyUG9saWN5Ojp+Q1hGQV9SZW5kZXJQb2xpY3koKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVuZGVycG9saWN5LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZW5kZXJwb2xpY3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGRkZjQ2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVuZGVycG9saWN5LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1JFTkRFUlBPTElDWV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9SRU5ERVJQT0xJQ1lfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9SZW5kZXJQb2xpY3kgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfUmVuZGVyUG9saWN5KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfUmVuZGVyUG9saWN5KCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1JFTkRFUlBPTElDWV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVzb2x2ZXByb2Nlc3Nvci5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZXNvbHZlcHJvY2Vzc29yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VmNGU5Ny4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZXNvbHZlcHJvY2Vzc29yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgyMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9yZXNvbHZlcHJvY2Vzc29yLmgiCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZWhlbHBlci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NjcmlwdGNvbnRleHQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX2xvY2FsZW1nci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfb2JqZWN0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9yZXNvbHZlbm9kZV9ycy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfdXRpbHMuaCIKLQotQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpDWEZBX1Jlc29sdmVQcm9jZXNzb3IoKQotICAgIDogbV9pQ3VyU3RhcnQoMCksIG1fcE5vZGVIZWxwZXIobmV3IENYRkFfTm9kZUhlbHBlcikge30KLQotQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjp+Q1hGQV9SZXNvbHZlUHJvY2Vzc29yKCkge30KLQotaW50MzJfdCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlJlc29sdmUoQ1hGQV9SZXNvbHZlTm9kZXNEYXRhJiBybmQpIHsKLSAgaWYgKCFybmQubV9DdXJOb2RlKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmICghcm5kLm1fQ3VyTm9kZS0+SXNOb2RlKCkpIHsKLSAgICBpZiAocm5kLm1fZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQXR0cmlidXRlcykgewotICAgICAgcmV0dXJuIFJlc29sdmVGb3JBdHRyaWJ1dGVScyhybmQubV9DdXJOb2RlLCBybmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZC5tX3dzTmFtZS5Bc1N0cmluZ0MoKSk7Ci0gICAgfQotICAgIHJldHVybiAwOwotICB9Ci0gIGlmIChybmQubV9kd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9BbnlDaGlsZCkgewotICAgIHJldHVybiBSZXNvbHZlQW55Q2hpbGQocm5kKTsKLSAgfQotICBGWF9XQ0hBUiB3Y2ggPSBybmQubV93c05hbWUuR2V0QXQoMCk7Ci0gIHN3aXRjaCAod2NoKSB7Ci0gICAgY2FzZSAnJCc6Ci0gICAgICByZXR1cm4gUmVzb2x2ZURvbGxhcihybmQpOwotICAgIGNhc2UgJyEnOgotICAgICAgcmV0dXJuIFJlc29sdmVFeGNhbG1hdG9yeShybmQpOwotICAgIGNhc2UgJyMnOgotICAgICAgcmV0dXJuIFJlc29sdmVOdW1iZXJTaWduKHJuZCk7Ci0gICAgY2FzZSAnKic6Ci0gICAgICByZXR1cm4gUmVzb2x2ZUFzdGVyaXNrKHJuZCk7Ci0gICAgLy8gVE9ETyhkc2luY2xhaXIpOiBXZSBjb3VsZCBwcm9iYWJseSByZW1vdmUgdGhpcy4KLSAgICBjYXNlICcuJzoKLSAgICAgIHJldHVybiBSZXNvbHZlQW55Q2hpbGQocm5kKTsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLSAgaWYgKHJuZC5tX3VIYXNoTmFtZSA9PSBYRkFfSEFTSENPREVfVGhpcyAmJiBybmQubV9uTGV2ZWwgPT0gMCkgewotICAgIHJuZC5tX05vZGVzLkFkZChybmQubV9wU0MtPkdldFRoaXNPYmplY3QoKSk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0gZWxzZSBpZiAocm5kLm1fQ3VyTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6WGZhKSB7Ci0gICAgQ1hGQV9PYmplY3QqIHBPYmpOb2RlID0KLSAgICAgICAgcm5kLm1fcFNDLT5HZXREb2N1bWVudCgpLT5HZXRYRkFPYmplY3Qocm5kLm1fdUhhc2hOYW1lKTsKLSAgICBpZiAocE9iak5vZGUpIHsKLSAgICAgIHJuZC5tX05vZGVzLkFkZChwT2JqTm9kZSk7Ci0gICAgfSBlbHNlIGlmIChybmQubV91SGFzaE5hbWUgPT0gWEZBX0hBU0hDT0RFX1hmYSkgewotICAgICAgcm5kLm1fTm9kZXMuQWRkKHJuZC5tX0N1ck5vZGUpOwotICAgIH0gZWxzZSBpZiAoKHJuZC5tX2R3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXMpICYmCi0gICAgICAgICAgICAgICBSZXNvbHZlRm9yQXR0cmlidXRlUnMocm5kLm1fQ3VyTm9kZSwgcm5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJuZC5tX3dzTmFtZS5Bc1N0cmluZ0MoKSkpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICBpZiAocm5kLm1fTm9kZXMuR2V0U2l6ZSgpID4gMCkgewotICAgICAgRmlsdGVyQ29uZGl0aW9uKHJuZCwgcm5kLm1fd3NDb25kaXRpb24pOwotICAgIH0KLSAgICByZXR1cm4gcm5kLm1fTm9kZXMuR2V0U2l6ZSgpOwotICB9Ci0gIGludDMyX3QgblJldCA9IFJlc29sdmVOb3JtYWwocm5kKTsKLSAgaWYgKG5SZXQgPCAxICYmIHJuZC5tX3VIYXNoTmFtZSA9PSBYRkFfSEFTSENPREVfWGZhKSB7Ci0gICAgcm5kLm1fTm9kZXMuQWRkKHJuZC5tX3BTQy0+R2V0RG9jdW1lbnQoKS0+R2V0Um9vdCgpKTsKLSAgfQotICByZXR1cm4gcm5kLm1fTm9kZXMuR2V0U2l6ZSgpOwotfQotaW50MzJfdCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlJlc29sdmVBbnlDaGlsZChDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCkgewotICBDRlhfV2lkZVN0cmluZyB3c05hbWUgPSBybmQubV93c05hbWU7Ci0gIENGWF9XaWRlU3RyaW5nIHdzQ29uZGl0aW9uID0gcm5kLm1fd3NDb25kaXRpb247Ci0gIENYRkFfTm9kZSogZmluZE5vZGUgPSBudWxscHRyOwotICBDWEZBX05vZGVBcnJheSBzaWJsaW5nczsKLSAgYm9vbCBiQ2xhc3NOYW1lID0gZmFsc2U7Ci0gIGlmICh3c05hbWUuR2V0QXQoMCkgPT0gJyMnKSB7Ci0gICAgYkNsYXNzTmFtZSA9IHRydWU7Ci0gICAgd3NOYW1lID0gd3NOYW1lLlJpZ2h0KHdzTmFtZS5HZXRMZW5ndGgoKSAtIDEpOwotICB9Ci0gIGZpbmROb2RlID0gbV9wTm9kZUhlbHBlci0+UmVzb2x2ZU5vZGVzX0dldE9uZUNoaWxkKAotICAgICAgVG9Ob2RlKHJuZC5tX0N1ck5vZGUpLCB3c05hbWUuY19zdHIoKSwgYkNsYXNzTmFtZSk7Ci0gIGlmICghZmluZE5vZGUpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAod3NDb25kaXRpb24uSXNFbXB0eSgpKSB7Ci0gICAgcm5kLm1fTm9kZXMuQWRkKGZpbmROb2RlKTsKLSAgICByZXR1cm4gcm5kLm1fTm9kZXMuR2V0U2l6ZSgpOwotICB9Ci0gIG1fcE5vZGVIZWxwZXItPkNvdW50U2libGluZ3MoZmluZE5vZGUsIFhGQV9MT0dJQ19UcmFuc3BhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ1hGQV9Ob2RlQXJyYXkqKSZybmQubV9Ob2RlcywgYkNsYXNzTmFtZSk7Ci0gIEZpbHRlckNvbmRpdGlvbihybmQsIHdzQ29uZGl0aW9uKTsKLSAgcmV0dXJuIHJuZC5tX05vZGVzLkdldFNpemUoKTsKLX0KLWludDMyX3QgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpSZXNvbHZlRG9sbGFyKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKSB7Ci0gIENYRkFfT2JqQXJyYXkmIG5vZGVzID0gcm5kLm1fTm9kZXM7Ci0gIENGWF9XaWRlU3RyaW5nIHdzTmFtZSA9IHJuZC5tX3dzTmFtZTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24gPSBybmQubV93c0NvbmRpdGlvbjsKLSAgaW50MzJfdCBpTmFtZUxlbiA9IHdzTmFtZS5HZXRMZW5ndGgoKTsKLSAgaWYgKGlOYW1lTGVuID09IDEpIHsKLSAgICBub2Rlcy5BZGQocm5kLm1fQ3VyTm9kZSk7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLSAgaWYgKHJuZC5tX25MZXZlbCA+IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgWEZBX0hhc2hDb2RlIGR3TmFtZUhhc2ggPSBzdGF0aWNfY2FzdDxYRkFfSGFzaENvZGU+KEZYX0hhc2hDb2RlX0dldFcoCi0gICAgICBDRlhfV2lkZVN0cmluZ0Mod3NOYW1lLmNfc3RyKCkgKyAxLCBpTmFtZUxlbiAtIDEpLCBmYWxzZSkpOwotICBpZiAoZHdOYW1lSGFzaCA9PSBYRkFfSEFTSENPREVfWGZhKSB7Ci0gICAgbm9kZXMuQWRkKHJuZC5tX3BTQy0+R2V0RG9jdW1lbnQoKS0+R2V0Um9vdCgpKTsKLSAgfSBlbHNlIHsKLSAgICBDWEZBX09iamVjdCogcE9iak5vZGUgPSBybmQubV9wU0MtPkdldERvY3VtZW50KCktPkdldFhGQU9iamVjdChkd05hbWVIYXNoKTsKLSAgICBpZiAocE9iak5vZGUpIHsKLSAgICAgIHJuZC5tX05vZGVzLkFkZChwT2JqTm9kZSk7Ci0gICAgfQotICB9Ci0gIGlmIChybmQubV9Ob2Rlcy5HZXRTaXplKCkgPiAwKSB7Ci0gICAgRmlsdGVyQ29uZGl0aW9uKHJuZCwgd3NDb25kaXRpb24pOwotICB9Ci0gIHJldHVybiBybmQubV9Ob2Rlcy5HZXRTaXplKCk7Ci19Ci1pbnQzMl90IENYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6UmVzb2x2ZUV4Y2FsbWF0b3J5KENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKSB7Ci0gIGlmIChybmQubV9uTGV2ZWwgPiAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgQ1hGQV9Ob2RlKiBkYXRhc2V0cyA9Ci0gICAgICBUb05vZGUocm5kLm1fcFNDLT5HZXREb2N1bWVudCgpLT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX0RhdGFzZXRzKSk7Ci0gIGlmICghZGF0YXNldHMpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgcm5kRmluZDsKLSAgcm5kRmluZC5tX3BTQyA9IHJuZC5tX3BTQzsKLSAgcm5kRmluZC5tX0N1ck5vZGUgPSBkYXRhc2V0czsKLSAgcm5kRmluZC5tX3dzTmFtZSA9IHJuZC5tX3dzTmFtZS5SaWdodChybmQubV93c05hbWUuR2V0TGVuZ3RoKCkgLSAxKTsKLSAgcm5kRmluZC5tX3VIYXNoTmFtZSA9IHN0YXRpY19jYXN0PFhGQV9IYXNoQ29kZT4oCi0gICAgICBGWF9IYXNoQ29kZV9HZXRXKHJuZEZpbmQubV93c05hbWUuQXNTdHJpbmdDKCksIGZhbHNlKSk7Ci0gIHJuZEZpbmQubV9uTGV2ZWwgPSBybmQubV9uTGV2ZWwgKyAxOwotICBybmRGaW5kLm1fZHdTdHlsZXMgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW47Ci0gIHJuZEZpbmQubV93c0NvbmRpdGlvbiA9IHJuZC5tX3dzQ29uZGl0aW9uOwotICBSZXNvbHZlKHJuZEZpbmQpOwotICBpZiAocm5kRmluZC5tX05vZGVzLkdldFNpemUoKSA+IDApIHsKLSAgICBybmQubV9Ob2Rlcy5BcHBlbmQocm5kRmluZC5tX05vZGVzKTsKLSAgICBybmRGaW5kLm1fTm9kZXMuUmVtb3ZlQWxsKCk7Ci0gIH0KLSAgcmV0dXJuIHJuZC5tX05vZGVzLkdldFNpemUoKTsKLX0KLWludDMyX3QgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpSZXNvbHZlTnVtYmVyU2lnbihDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCkgewotICBDRlhfV2lkZVN0cmluZyB3c05hbWUgPSBybmQubV93c05hbWUuUmlnaHQocm5kLm1fd3NOYW1lLkdldExlbmd0aCgpIC0gMSk7Ci0gIENGWF9XaWRlU3RyaW5nIHdzQ29uZGl0aW9uID0gcm5kLm1fd3NDb25kaXRpb247Ci0gIENYRkFfTm9kZSogY3VyTm9kZSA9IFRvTm9kZShybmQubV9DdXJOb2RlKTsKLSAgaWYgKFJlc29sdmVGb3JBdHRyaWJ1dGVScyhjdXJOb2RlLCBybmQsIHdzTmFtZS5Bc1N0cmluZ0MoKSkpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEgcm5kRmluZDsKLSAgcm5kRmluZC5tX3BTQyA9IHJuZC5tX3BTQzsKLSAgcm5kRmluZC5tX25MZXZlbCA9IHJuZC5tX25MZXZlbCArIDE7Ci0gIHJuZEZpbmQubV9kd1N0eWxlcyA9IHJuZC5tX2R3U3R5bGVzOwotICBybmRGaW5kLm1fZHdTdHlsZXMgfD0gWEZBX1JFU09MVkVOT0RFX1RhZ05hbWU7Ci0gIHJuZEZpbmQubV9kd1N0eWxlcyAmPSB+WEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXM7Ci0gIHJuZEZpbmQubV93c05hbWUgPSB3c05hbWU7Ci0gIHJuZEZpbmQubV91SGFzaE5hbWUgPSBzdGF0aWNfY2FzdDxYRkFfSGFzaENvZGU+KAotICAgICAgRlhfSGFzaENvZGVfR2V0VyhybmRGaW5kLm1fd3NOYW1lLkFzU3RyaW5nQygpLCBmYWxzZSkpOwotICBybmRGaW5kLm1fd3NDb25kaXRpb24gPSB3c0NvbmRpdGlvbjsKLSAgcm5kRmluZC5tX0N1ck5vZGUgPSBjdXJOb2RlOwotICBSZXNvbHZlTm9ybWFsKHJuZEZpbmQpOwotICBpZiAocm5kRmluZC5tX05vZGVzLkdldFNpemUoKSA+IDApIHsKLSAgICBpZiAod3NDb25kaXRpb24uR2V0TGVuZ3RoKCkgPT0gMCAmJiBybmRGaW5kLm1fTm9kZXMuRmluZChjdXJOb2RlKSA+PSAwKSB7Ci0gICAgICBybmQubV9Ob2Rlcy5BZGQoY3VyTm9kZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJuZC5tX05vZGVzLkFwcGVuZChybmRGaW5kLm1fTm9kZXMpOwotICAgICAgcm5kRmluZC5tX05vZGVzLlJlbW92ZUFsbCgpOwotICAgIH0KLSAgfQotICByZXR1cm4gcm5kLm1fTm9kZXMuR2V0U2l6ZSgpOwotfQotaW50MzJfdCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlJlc29sdmVGb3JBdHRyaWJ1dGVScygKLSAgICBDWEZBX09iamVjdCogY3VyTm9kZSwKLSAgICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCwKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0ckF0dHIpIHsKLSAgY29uc3QgWEZBX1NDUklQVEFUVFJJQlVURUlORk8qIGxwU2NyaXB0QXR0cmlidXRlID0KLSAgICAgIFhGQV9HZXRTY3JpcHRBdHRyaWJ1dGVCeU5hbWUoY3VyTm9kZS0+R2V0RWxlbWVudFR5cGUoKSwgc3RyQXR0cik7Ci0gIGlmIChscFNjcmlwdEF0dHJpYnV0ZSkgewotICAgIHJuZC5tX3BTY3JpcHRBdHRyaWJ1dGUgPSBscFNjcmlwdEF0dHJpYnV0ZTsKLSAgICBybmQubV9Ob2Rlcy5BZGQoY3VyTm9kZSk7Ci0gICAgcm5kLm1fZHdGbGFnID0gWEZBX1JFU09WRU5PREVfUlNUWVBFX0F0dHJpYnV0ZTsKLSAgICByZXR1cm4gMTsKLSAgfQotICByZXR1cm4gMDsKLX0KLWludDMyX3QgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpSZXNvbHZlTm9ybWFsKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKSB7Ci0gIGlmIChybmQubV9uTGV2ZWwgPiAzMikgewotICAgIHJldHVybiAwOwotICB9Ci0gIGlmICghcm5kLm1fQ3VyTm9kZS0+SXNOb2RlKCkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBDWEZBX05vZGUqIGN1ck5vZGUgPSBUb05vZGUocm5kLm1fQ3VyTm9kZSk7Ci0gIENYRkFfT2JqQXJyYXkmIG5vZGVzID0gcm5kLm1fTm9kZXM7Ci0gIGludDMyX3Qgbk51bSA9IG5vZGVzLkdldFNpemUoKTsKLSAgdWludDMyX3QgZHdTdHlsZXMgPSBybmQubV9kd1N0eWxlczsKLSAgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSA9IHJuZC5tX3dzTmFtZTsKLSAgWEZBX0hhc2hDb2RlIHVOYW1lSGFzaCA9IHJuZC5tX3VIYXNoTmFtZTsKLSAgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29uZGl0aW9uID0gcm5kLm1fd3NDb25kaXRpb247Ci0gIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSBybmRGaW5kOwotICBybmRGaW5kLm1fd3NOYW1lID0gcm5kLm1fd3NOYW1lOwotICBybmRGaW5kLm1fd3NDb25kaXRpb24gPSBybmQubV93c0NvbmRpdGlvbjsKLSAgcm5kRmluZC5tX3BTQyA9IHJuZC5tX3BTQzsKLSAgcm5kRmluZC5tX25MZXZlbCA9IHJuZC5tX25MZXZlbCArIDE7Ci0gIHJuZEZpbmQubV91SGFzaE5hbWUgPSB1TmFtZUhhc2g7Ci0gIENYRkFfTm9kZUFycmF5IGNoaWxkcmVuOwotICBDWEZBX05vZGVBcnJheSBwcm9wZXJ0aWVzOwotICBDWEZBX05vZGUqIHBWYXJpYWJsZXNOb2RlID0gbnVsbHB0cjsKLSAgQ1hGQV9Ob2RlKiBwUGFnZVNldE5vZGUgPSBudWxscHRyOwotICBDWEZBX05vZGUqIHBDaGlsZCA9IGN1ck5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsKLSAgd2hpbGUgKHBDaGlsZCkgewotICAgIGlmIChwQ2hpbGQtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlZhcmlhYmxlcykgewotICAgICAgcFZhcmlhYmxlc05vZGUgPSBwQ2hpbGQ7Ci0gICAgICBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7Ci0gICAgICBjb250aW51ZTsKLSAgICB9IGVsc2UgaWYgKHBDaGlsZC0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6UGFnZVNldCkgewotICAgICAgcFBhZ2VTZXROb2RlID0gcENoaWxkOwotICAgICAgcENoaWxkID0gcENoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOwotICAgICAgY29udGludWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvbnN0IFhGQV9QUk9QRVJUWSogcFByb3BlcnQgPSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoCi0gICAgICAgICAgY3VyTm9kZS0+R2V0RWxlbWVudFR5cGUoKSwgcENoaWxkLT5HZXRFbGVtZW50VHlwZSgpLAotICAgICAgICAgIFhGQV9YRFBQQUNLRVRfVU5LTk9XTik7Ci0gICAgICBpZiAocFByb3BlcnQpIHsKLSAgICAgICAgcHJvcGVydGllcy5BZGQocENoaWxkKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNoaWxkcmVuLkFkZChwQ2hpbGQpOwotICAgICAgfQotICAgIH0KLSAgICBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7Ci0gIH0KLSAgaWYgKChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzKSAmJiBwVmFyaWFibGVzTm9kZSkgewotICAgIHVpbnQzMl90IHVQcm9wSGFzaCA9IHBWYXJpYWJsZXNOb2RlLT5HZXRDbGFzc0hhc2hDb2RlKCk7Ci0gICAgaWYgKHVQcm9wSGFzaCA9PSB1TmFtZUhhc2gpIHsKLSAgICAgIG5vZGVzLkFkZChwVmFyaWFibGVzTm9kZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJuZEZpbmQubV9DdXJOb2RlID0gcFZhcmlhYmxlc05vZGU7Ci0gICAgICBTZXRTdHlsZXNGb3JDaGlsZChkd1N0eWxlcywgcm5kRmluZCk7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c1NhdmVDb25kaXRpb24gPSBybmRGaW5kLm1fd3NDb25kaXRpb247Ci0gICAgICBybmRGaW5kLm1fd3NDb25kaXRpb24uY2xlYXIoKTsKLSAgICAgIFJlc29sdmVOb3JtYWwocm5kRmluZCk7Ci0gICAgICBybmRGaW5kLm1fd3NDb25kaXRpb24gPSB3c1NhdmVDb25kaXRpb247Ci0gICAgICBpZiAocm5kRmluZC5tX05vZGVzLkdldFNpemUoKSA+IDApIHsKLSAgICAgICAgbm9kZXMuQXBwZW5kKHJuZEZpbmQubV9Ob2Rlcyk7Ci0gICAgICAgIHJuZEZpbmQubV9Ob2Rlcy5SZW1vdmVBbGwoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG5vZGVzLkdldFNpemUoKSA+IG5OdW0pIHsKLSAgICAgIEZpbHRlckNvbmRpdGlvbihybmQsIHdzQ29uZGl0aW9uKTsKLSAgICAgIGlmIChub2Rlcy5HZXRTaXplKCkgPiAwKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgICAgfQotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0gIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbikgewotICAgIGJvb2wgYlNldEZsYWcgPSBmYWxzZTsKLSAgICBpZiAocFBhZ2VTZXROb2RlICYmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzKSkgewotICAgICAgY2hpbGRyZW4uQWRkKHBQYWdlU2V0Tm9kZSk7Ci0gICAgfQotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNoaWxkcmVuLkdldFNpemUoKTsgaSsrKSB7Ci0gICAgICBDWEZBX05vZGUqIGNoaWxkID0gY2hpbGRyZW5baV07Ci0gICAgICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZSkgewotICAgICAgICBpZiAoY2hpbGQtPkdldENsYXNzSGFzaENvZGUoKSA9PSB1TmFtZUhhc2gpIHsKLSAgICAgICAgICBub2Rlcy5BZGQoY2hpbGQpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGNoaWxkLT5HZXROYW1lSGFzaCgpID09IHVOYW1lSGFzaCkgewotICAgICAgICBub2Rlcy5BZGQoY2hpbGQpOwotICAgICAgfQotICAgICAgaWYgKG1fcE5vZGVIZWxwZXItPk5vZGVJc1RyYW5zcGFyZW50KGNoaWxkKSAmJgotICAgICAgICAgIGNoaWxkLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpQYWdlU2V0KSB7Ci0gICAgICAgIGlmICghYlNldEZsYWcpIHsKLSAgICAgICAgICBTZXRTdHlsZXNGb3JDaGlsZChkd1N0eWxlcywgcm5kRmluZCk7Ci0gICAgICAgICAgYlNldEZsYWcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJuZEZpbmQubV9DdXJOb2RlID0gY2hpbGQ7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzU2F2ZUNvbmRpdGlvbiA9IHJuZEZpbmQubV93c0NvbmRpdGlvbjsKLSAgICAgICAgcm5kRmluZC5tX3dzQ29uZGl0aW9uLmNsZWFyKCk7Ci0gICAgICAgIFJlc29sdmVOb3JtYWwocm5kRmluZCk7Ci0gICAgICAgIHJuZEZpbmQubV93c0NvbmRpdGlvbiA9IHdzU2F2ZUNvbmRpdGlvbjsKLSAgICAgICAgaWYgKHJuZEZpbmQubV9Ob2Rlcy5HZXRTaXplKCkgPiAwKSB7Ci0gICAgICAgICAgbm9kZXMuQXBwZW5kKHJuZEZpbmQubV9Ob2Rlcyk7Ci0gICAgICAgICAgcm5kRmluZC5tX05vZGVzLlJlbW92ZUFsbCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChub2Rlcy5HZXRTaXplKCkgPiBuTnVtKSB7Ci0gICAgICBpZiAoIShkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9BTEwpKSB7Ci0gICAgICAgIENYRkFfTm9kZUFycmF5IHVwQXJyYXlOb2RlczsKLSAgICAgICAgaWYgKG1fcE5vZGVIZWxwZXItPk5vZGVJc1RyYW5zcGFyZW50KFRvTm9kZShjdXJOb2RlKSkpIHsKLSAgICAgICAgICBtX3BOb2RlSGVscGVyLT5Db3VudFNpYmxpbmdzKFRvTm9kZShub2Rlc1swXSksIFhGQV9MT0dJQ19UcmFuc3BhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1cEFycmF5Tm9kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIShkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVwQXJyYXlOb2Rlcy5HZXRTaXplKCkgPiBub2Rlcy5HZXRTaXplKCkpIHsKLSAgICAgICAgICB1cEFycmF5Tm9kZXNbMF0gPSBUb05vZGUobm9kZXNbMF0pOwotICAgICAgICAgIG5vZGVzLlJlbW92ZUFsbCgpOwotICAgICAgICAgIG5vZGVzLkFwcGVuZCgoQ1hGQV9PYmpBcnJheSYpdXBBcnJheU5vZGVzKTsKLSAgICAgICAgICB1cEFycmF5Tm9kZXMuUmVtb3ZlQWxsKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIEZpbHRlckNvbmRpdGlvbihybmQsIHdzQ29uZGl0aW9uKTsKLSAgICAgIGlmIChub2Rlcy5HZXRTaXplKCkgPiAwKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgICAgfQotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0gIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzKSB7Ci0gICAgaWYgKFJlc29sdmVGb3JBdHRyaWJ1dGVScyhjdXJOb2RlLCBybmQsIHdzTmFtZS5Bc1N0cmluZ0MoKSkpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcykgewotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHByb3BlcnRpZXMuR2V0U2l6ZSgpOyBpKyspIHsKLSAgICAgIENYRkFfTm9kZSogY2hpbGRQcm9wZXJ0eSA9IHByb3BlcnRpZXNbaV07Ci0gICAgICBpZiAoY2hpbGRQcm9wZXJ0eS0+SXNVbm5hbWVkKCkpIHsKLSAgICAgICAgdWludDMyX3QgdVByb3BIYXNoID0gY2hpbGRQcm9wZXJ0eS0+R2V0Q2xhc3NIYXNoQ29kZSgpOwotICAgICAgICBpZiAodVByb3BIYXNoID09IHVOYW1lSGFzaCkgewotICAgICAgICAgIG5vZGVzLkFkZChjaGlsZFByb3BlcnR5KTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChjaGlsZFByb3BlcnR5LT5HZXROYW1lSGFzaCgpID09IHVOYW1lSGFzaCAmJgotICAgICAgICAgICAgICAgICBjaGlsZFByb3BlcnR5LT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpFeHRyYXMgJiYKLSAgICAgICAgICAgICAgICAgY2hpbGRQcm9wZXJ0eS0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6SXRlbXMpIHsKLSAgICAgICAgbm9kZXMuQWRkKGNoaWxkUHJvcGVydHkpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAobm9kZXMuR2V0U2l6ZSgpID4gbk51bSkgewotICAgICAgRmlsdGVyQ29uZGl0aW9uKHJuZCwgd3NDb25kaXRpb24pOwotICAgICAgaWYgKG5vZGVzLkdldFNpemUoKSA+IDApIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgQ1hGQV9Ob2RlKiBwUHJvcCA9IG51bGxwdHI7Ci0gICAgaWYgKFhGQV9FbGVtZW50OjpTdWJmb3JtID09IGN1ck5vZGUtPkdldEVsZW1lbnRUeXBlKCkgJiYKLSAgICAgICAgWEZBX0hBU0hDT0RFX09jY3VyID09IHVOYW1lSGFzaCkgewotICAgICAgQ1hGQV9Ob2RlKiBwSW5zdGFuY2VNYW5hZ2VyID0KLSAgICAgICAgICBjdXJOb2RlLT5Bc05vZGUoKS0+R2V0SW5zdGFuY2VNZ3JPZlN1YmZvcm0oKTsKLSAgICAgIGlmIChwSW5zdGFuY2VNYW5hZ2VyKSB7Ci0gICAgICAgIHBQcm9wID0gcEluc3RhbmNlTWFuYWdlci0+R2V0UHJvcGVydHkoMCwgWEZBX0VsZW1lbnQ6Ok9jY3VyLCB0cnVlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgWEZBX0VsZW1lbnQgZVR5cGUgPSBYRkFfR2V0RWxlbWVudFR5cGVGb3JOYW1lKHdzTmFtZS5Bc1N0cmluZ0MoKSk7Ci0gICAgICBpZiAoZVR5cGUgIT0gWEZBX0VsZW1lbnQ6OlVua25vd24pIHsKLSAgICAgICAgcFByb3AgPSBjdXJOb2RlLT5Bc05vZGUoKS0+R2V0UHJvcGVydHkoMCwgZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVUeXBlICE9IFhGQV9FbGVtZW50OjpQYWdlU2V0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHBQcm9wKSB7Ci0gICAgICBub2Rlcy5BZGQocFByb3ApOwotICAgICAgcmV0dXJuIG5vZGVzLkdldFNpemUoKTsKLSAgICB9Ci0gIH0KLSAgQ1hGQV9Ob2RlKiBwYXJlbnROb2RlID0gbV9wTm9kZUhlbHBlci0+UmVzb2x2ZU5vZGVzX0dldFBhcmVudCgKLSAgICAgIGN1ck5vZGUtPkFzTm9kZSgpLCBYRkFfTE9HSUNfTm9UcmFuc3BhcmVudCk7Ci0gIHVpbnQzMl90IHVDdXJDbGFzc0hhc2ggPSBjdXJOb2RlLT5HZXRDbGFzc0hhc2hDb2RlKCk7Ci0gIGlmICghcGFyZW50Tm9kZSkgewotICAgIGlmICh1Q3VyQ2xhc3NIYXNoID09IHVOYW1lSGFzaCkgewotICAgICAgbm9kZXMuQWRkKGN1ck5vZGUtPkFzTm9kZSgpKTsKLSAgICAgIEZpbHRlckNvbmRpdGlvbihybmQsIHdzQ29uZGl0aW9uKTsKLSAgICAgIGlmIChub2Rlcy5HZXRTaXplKCkgPiAwKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MpIHsKLSAgICBDWEZBX05vZGUqIGNoaWxkID0gcGFyZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgIHVpbnQzMl90IGR3U3ViU3R5bGVzID0KLSAgICAgICAgWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXM7Ci0gICAgaWYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1RhZ05hbWUpIHsKLSAgICAgIGR3U3ViU3R5bGVzIHw9IFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lOwotICAgIH0KLSAgICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQUxMKSB7Ci0gICAgICBkd1N1YlN0eWxlcyB8PSBYRkFfUkVTT0xWRU5PREVfQUxMOwotICAgIH0KLSAgICBybmRGaW5kLm1fZHdTdHlsZXMgPSBkd1N1YlN0eWxlczsKLSAgICB3aGlsZSAoY2hpbGQpIHsKLSAgICAgIGlmIChjaGlsZCA9PSBjdXJOb2RlKSB7Ci0gICAgICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lKSB7Ci0gICAgICAgICAgaWYgKHVDdXJDbGFzc0hhc2ggPT0gdU5hbWVIYXNoKSB7Ci0gICAgICAgICAgICBub2Rlcy5BZGQoY3VyTm9kZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChjaGlsZC0+R2V0TmFtZUhhc2goKSA9PSB1TmFtZUhhc2gpIHsKLSAgICAgICAgICAgIG5vZGVzLkFkZChjdXJOb2RlKTsKLSAgICAgICAgICAgIGlmIChybmQubV9uTGV2ZWwgPT0gMCAmJiB3c0NvbmRpdGlvbi5HZXRMZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgIG5vZGVzLlJlbW92ZUFsbCgpOwotICAgICAgICAgICAgICBub2Rlcy5BZGQoY3VyTm9kZSk7Ci0gICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjaGlsZCA9IGNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lKSB7Ci0gICAgICAgIGlmIChjaGlsZC0+R2V0Q2xhc3NIYXNoQ29kZSgpID09IHVOYW1lSGFzaCkgewotICAgICAgICAgIG5vZGVzLkFkZChjaGlsZCk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoY2hpbGQtPkdldE5hbWVIYXNoKCkgPT0gdU5hbWVIYXNoKSB7Ci0gICAgICAgIG5vZGVzLkFkZChjaGlsZCk7Ci0gICAgICB9Ci0gICAgICBjb25zdCBYRkFfUFJPUEVSVFkqIHBQcm9wZXJ0ID0gWEZBX0dldFByb3BlcnR5T2ZFbGVtZW50KAotICAgICAgICAgIHBhcmVudE5vZGUtPkdldEVsZW1lbnRUeXBlKCksIGNoaWxkLT5HZXRFbGVtZW50VHlwZSgpLAotICAgICAgICAgIFhGQV9YRFBQQUNLRVRfVU5LTk9XTik7Ci0gICAgICBib29sIGJJbm5lclNlYXJjaCA9IGZhbHNlOwotICAgICAgaWYgKHBQcm9wZXJ0KSB7Ci0gICAgICAgIGlmICgoY2hpbGQtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlZhcmlhYmxlcyB8fAotICAgICAgICAgICAgIGNoaWxkLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpQYWdlU2V0KSkgewotICAgICAgICAgIGJJbm5lclNlYXJjaCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtX3BOb2RlSGVscGVyLT5Ob2RlSXNUcmFuc3BhcmVudChjaGlsZCkpIHsKLSAgICAgICAgICBiSW5uZXJTZWFyY2ggPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoYklubmVyU2VhcmNoKSB7Ci0gICAgICAgIHJuZEZpbmQubV9DdXJOb2RlID0gY2hpbGQ7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzT3JpZ2luQ29uZGl0aW9uID0gcm5kRmluZC5tX3dzQ29uZGl0aW9uOwotICAgICAgICBybmRGaW5kLm1fd3NDb25kaXRpb24uY2xlYXIoKTsKLSAgICAgICAgdWludDMyX3QgZHdPcmlnaW5TdHlsZSA9IHJuZEZpbmQubV9kd1N0eWxlczsKLSAgICAgICAgcm5kRmluZC5tX2R3U3R5bGVzID0gZHdPcmlnaW5TdHlsZSB8IFhGQV9SRVNPTFZFTk9ERV9BTEw7Ci0gICAgICAgIFJlc29sdmVOb3JtYWwocm5kRmluZCk7Ci0gICAgICAgIHJuZEZpbmQubV9kd1N0eWxlcyA9IGR3T3JpZ2luU3R5bGU7Ci0gICAgICAgIHJuZEZpbmQubV93c0NvbmRpdGlvbiA9IHdzT3JpZ2luQ29uZGl0aW9uOwotICAgICAgICBpZiAocm5kRmluZC5tX05vZGVzLkdldFNpemUoKSA+IDApIHsKLSAgICAgICAgICBub2Rlcy5BcHBlbmQocm5kRmluZC5tX05vZGVzKTsKLSAgICAgICAgICBybmRGaW5kLm1fTm9kZXMuUmVtb3ZlQWxsKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNoaWxkID0gY2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7Ci0gICAgfQotICAgIGlmIChub2Rlcy5HZXRTaXplKCkgPiBuTnVtKSB7Ci0gICAgICBpZiAobV9wTm9kZUhlbHBlci0+Tm9kZUlzVHJhbnNwYXJlbnQocGFyZW50Tm9kZSkpIHsKLSAgICAgICAgQ1hGQV9Ob2RlQXJyYXkgdXBBcnJheU5vZGVzOwotICAgICAgICBtX3BOb2RlSGVscGVyLT5Db3VudFNpYmxpbmdzKFRvTm9kZShub2Rlc1swXSksIFhGQV9MT0dJQ19UcmFuc3BhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXBBcnJheU5vZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEhKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1RhZ05hbWUpKTsKLSAgICAgICAgaWYgKHVwQXJyYXlOb2Rlcy5HZXRTaXplKCkgPiBub2Rlcy5HZXRTaXplKCkpIHsKLSAgICAgICAgICB1cEFycmF5Tm9kZXNbMF0gPSBUb05vZGUobm9kZXNbMF0pOwotICAgICAgICAgIG5vZGVzLlJlbW92ZUFsbCgpOwotICAgICAgICAgIG5vZGVzLkFwcGVuZCgoQ1hGQV9PYmpBcnJheSYpdXBBcnJheU5vZGVzKTsKLSAgICAgICAgICB1cEFycmF5Tm9kZXMuUmVtb3ZlQWxsKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIEZpbHRlckNvbmRpdGlvbihybmQsIHdzQ29uZGl0aW9uKTsKLSAgICAgIGlmIChub2Rlcy5HZXRTaXplKCkgPiAwKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgICAgfQotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0gIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQpIHsKLSAgICB1aW50MzJfdCBkd1N1YlN0eWxlcyA9IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8IFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXM7Ci0gICAgaWYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX1RhZ05hbWUpIHsKLSAgICAgIGR3U3ViU3R5bGVzIHw9IFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lOwotICAgIH0KLSAgICBpZiAoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQUxMKSB7Ci0gICAgICBkd1N1YlN0eWxlcyB8PSBYRkFfUkVTT0xWRU5PREVfQUxMOwotICAgIH0KLSAgICBybmRGaW5kLm1fZHdTdHlsZXMgPSBkd1N1YlN0eWxlczsKLSAgICBybmRGaW5kLm1fQ3VyTm9kZSA9IHBhcmVudE5vZGU7Ci0gICAgQ1hGQV9Ob2RlQXJyYXkmIGFycmF5ID0gcm5kLm1fcFNDLT5HZXRVcE9iamVjdEFycmF5KCk7Ci0gICAgYXJyYXkuQWRkKHBhcmVudE5vZGUpOwotICAgIFJlc29sdmVOb3JtYWwocm5kRmluZCk7Ci0gICAgaWYgKHJuZEZpbmQubV9Ob2Rlcy5HZXRTaXplKCkgPiAwKSB7Ci0gICAgICBub2Rlcy5BcHBlbmQocm5kRmluZC5tX05vZGVzKTsKLSAgICAgIHJuZEZpbmQubV9Ob2Rlcy5SZW1vdmVBbGwoKTsKLSAgICB9Ci0gICAgaWYgKG5vZGVzLkdldFNpemUoKSA+IG5OdW0pIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLWludDMyX3QgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpSZXNvbHZlQXN0ZXJpc2soQ1hGQV9SZXNvbHZlTm9kZXNEYXRhJiBybmQpIHsKLSAgQ1hGQV9Ob2RlKiBjdXJOb2RlID0gVG9Ob2RlKHJuZC5tX0N1ck5vZGUpOwotICBDWEZBX09iakFycmF5JiBub2RlcyA9IHJuZC5tX05vZGVzOwotICBDWEZBX05vZGVBcnJheSBhcnJheTsKLSAgY3VyTm9kZS0+R2V0Tm9kZUxpc3QoYXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgIFhGQV9OT0RFRklMVEVSX0NoaWxkcmVuIHwgWEZBX05PREVGSUxURVJfUHJvcGVydGllcyk7Ci0gIG5vZGVzLkFwcGVuZCgoQ1hGQV9PYmpBcnJheSYpYXJyYXkpOwotICByZXR1cm4gbm9kZXMuR2V0U2l6ZSgpOwotfQotaW50MzJfdCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlJlc29sdmVQb3BTdGFjaygKLSAgICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiYgc3RhY2spIHsKLSAgaW50MzJfdCBuVHlwZSA9IC0xOwotICBpbnQzMl90IGlTaXplID0gc3RhY2suR2V0U2l6ZSgpIC0gMTsKLSAgaWYgKGlTaXplID4gLTEpIHsKLSAgICBuVHlwZSA9IHN0YWNrW2lTaXplXTsKLSAgICBzdGFjay5SZW1vdmVBdChpU2l6ZSwgMSk7Ci0gIH0KLSAgcmV0dXJuIG5UeXBlOwotfQotaW50MzJfdCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OkdldEZpbHRlcihjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRXhwcmVzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuU3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKSB7Ci0gIEFTU0VSVChuU3RhcnQgPiAtMSk7Ci0gIGludDMyX3QgaUxlbmd0aCA9IHdzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKTsKLSAgaWYgKG5TdGFydCA+PSBpTGVuZ3RoKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSA9IHJuZC5tX3dzTmFtZTsKLSAgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29uZGl0aW9uID0gcm5kLm1fd3NDb25kaXRpb247Ci0gIEZYX1dDSEFSKiBwTmFtZUJ1ZiA9IHdzTmFtZS5HZXRCdWZmZXIoaUxlbmd0aCAtIG5TdGFydCk7Ci0gIEZYX1dDSEFSKiBwQ29uZGl0aW9uQnVmID0gd3NDb25kaXRpb24uR2V0QnVmZmVyKGlMZW5ndGggLSBuU3RhcnQpOwotICBpbnQzMl90IG5OYW1lQ291bnQgPSAwOwotICBpbnQzMl90IG5Db25kaXRpb25Db3VudCA9IDA7Ci0gIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+IHN0YWNrOwotICBpbnQzMl90IG5UeXBlID0gLTE7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwU3JjID0gd3NFeHByZXNzaW9uLmNfc3RyKCk7Ci0gIEZYX1dDSEFSIHdQcmV2ID0gMCwgd0N1cjsKLSAgYm9vbCBiSXNDb25kaXRpb24gPSBmYWxzZTsKLSAgd2hpbGUgKG5TdGFydCA8IGlMZW5ndGgpIHsKLSAgICB3Q3VyID0gcFNyY1tuU3RhcnQrK107Ci0gICAgaWYgKHdDdXIgPT0gJy4nKSB7Ci0gICAgICBpZiAod1ByZXYgPT0gJ1xcJykgewotICAgICAgICBwTmFtZUJ1ZltuTmFtZUNvdW50IC0gMV0gPSB3UHJldiA9ICcuJzsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAobk5hbWVDb3VudCA9PSAwKSB7Ci0gICAgICAgIHJuZC5tX2R3U3R5bGVzIHw9IFhGQV9SRVNPTFZFTk9ERV9BbnlDaGlsZDsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBGWF9XQ0hBUiB3TG9va2FoZWFkID0gblN0YXJ0IDwgaUxlbmd0aCA/IHBTcmNbblN0YXJ0XSA6IDA7Ci0gICAgICBpZiAod0xvb2thaGVhZCAhPSAnWycgJiYgd0xvb2thaGVhZCAhPSAnKCcpIHsKLSAgICAgICAgaWYgKG5UeXBlIDwgMCkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICh3Q3VyID09ICdbJyB8fCB3Q3VyID09ICcoJykgewotICAgICAgYklzQ29uZGl0aW9uID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKHdDdXIgPT0gJy4nICYmIG5TdGFydCA8IGlMZW5ndGggJiYKLSAgICAgICAgICAgICAgIChwU3JjW25TdGFydF0gPT0gJ1snIHx8IHBTcmNbblN0YXJ0XSA9PSAnKCcpKSB7Ci0gICAgICBiSXNDb25kaXRpb24gPSB0cnVlOwotICAgIH0KLSAgICBpZiAoYklzQ29uZGl0aW9uKSB7Ci0gICAgICBwQ29uZGl0aW9uQnVmW25Db25kaXRpb25Db3VudCsrXSA9IHdDdXI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBOYW1lQnVmW25OYW1lQ291bnQrK10gPSB3Q3VyOwotICAgIH0KLSAgICBib29sIGJSZWN1cnNpdmUgPSB0cnVlOwotICAgIHN3aXRjaCAoblR5cGUpIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgaWYgKHdDdXIgPT0gJ10nKSB7Ci0gICAgICAgICAgblR5cGUgPSBSZXNvbHZlUG9wU3RhY2soc3RhY2spOwotICAgICAgICAgIGJSZWN1cnNpdmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgaWYgKHdDdXIgPT0gJyknKSB7Ci0gICAgICAgICAgblR5cGUgPSBSZXNvbHZlUG9wU3RhY2soc3RhY2spOwotICAgICAgICAgIGJSZWN1cnNpdmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgaWYgKHdDdXIgPT0gJyInKSB7Ci0gICAgICAgICAgblR5cGUgPSBSZXNvbHZlUG9wU3RhY2soc3RhY2spOwotICAgICAgICAgIGJSZWN1cnNpdmUgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGJSZWN1cnNpdmUpIHsKLSAgICAgIHN3aXRjaCAod0N1cikgewotICAgICAgICBjYXNlICdbJzoKLSAgICAgICAgICBzdGFjay5BZGQoblR5cGUpOwotICAgICAgICAgIG5UeXBlID0gMDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnKCc6Ci0gICAgICAgICAgc3RhY2suQWRkKG5UeXBlKTsKLSAgICAgICAgICBuVHlwZSA9IDE7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJyInOgotICAgICAgICAgIHN0YWNrLkFkZChuVHlwZSk7Ci0gICAgICAgICAgblR5cGUgPSAyOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICB3UHJldiA9IHdDdXI7Ci0gIH0KLSAgaWYgKHN0YWNrLkdldFNpemUoKSA+IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgd3NOYW1lLlJlbGVhc2VCdWZmZXIobk5hbWVDb3VudCk7Ci0gIHdzTmFtZS5UcmltTGVmdCgpOwotICB3c05hbWUuVHJpbVJpZ2h0KCk7Ci0gIHdzQ29uZGl0aW9uLlJlbGVhc2VCdWZmZXIobkNvbmRpdGlvbkNvdW50KTsKLSAgd3NDb25kaXRpb24uVHJpbUxlZnQoKTsKLSAgd3NDb25kaXRpb24uVHJpbVJpZ2h0KCk7Ci0gIHJuZC5tX3VIYXNoTmFtZSA9Ci0gICAgICBzdGF0aWNfY2FzdDxYRkFfSGFzaENvZGU+KEZYX0hhc2hDb2RlX0dldFcod3NOYW1lLkFzU3RyaW5nQygpLCBmYWxzZSkpOwotICByZXR1cm4gblN0YXJ0OwotfQotdm9pZCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OkNvbmRpdGlvbkFycmF5KGludDMyX3QgaUN1ckluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29uZGl0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZvdW5kQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhJiBybmQpIHsKLSAgQ1hGQV9Ob2RlQXJyYXkmIGZpbmROb2RlcyA9IChDWEZBX05vZGVBcnJheSYpcm5kLm1fTm9kZXM7Ci0gIGludDMyX3QgaUxlbiA9IHdzQ29uZGl0aW9uLkdldExlbmd0aCgpOwotICBib29sIGJSZWxhdGl2ZSA9IGZhbHNlOwotICBib29sIGJBbGwgPSBmYWxzZTsKLSAgaW50MzJfdCBpID0gMTsKLSAgZm9yICg7IGkgPCBpTGVuOyArK2kpIHsKLSAgICBGWF9XQ0hBUiBjaCA9IHdzQ29uZGl0aW9uW2ldOwotICAgIGlmIChjaCA9PSAnICcpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAoY2ggPT0gJysnIHx8IGNoID09ICctJykgewotICAgICAgYlJlbGF0aXZlID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0gZWxzZSBpZiAoY2ggPT0gJyonKSB7Ci0gICAgICBiQWxsID0gdHJ1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0gZWxzZSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgaWYgKGJBbGwpIHsKLSAgICBpZiAocm5kLm1fZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZSkgewotICAgICAgaWYgKHJuZC5tX2R3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0JpbmQpIHsKLSAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9wQ3JlYXRlUGFyZW50ID0gVG9Ob2RlKHJuZC5tX0N1ck5vZGUpOwotICAgICAgICBtX3BOb2RlSGVscGVyLT5tX2lDcmVhdGVDb3VudCA9IDE7Ci0gICAgICAgIGZpbmROb2Rlcy5SZW1vdmVBbGwoKTsKLSAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9pQ3VyQWxsU3RhcnQgPSAtMTsKLSAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9wQWxsU3RhcnRQYXJlbnQgPSBudWxscHRyOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1fcE5vZGVIZWxwZXItPm1faUN1ckFsbFN0YXJ0ID09IC0xKSB7Ci0gICAgICAgICAgbV9wTm9kZUhlbHBlci0+bV9pQ3VyQWxsU3RhcnQgPSBtX2lDdXJTdGFydDsKLSAgICAgICAgICBtX3BOb2RlSGVscGVyLT5tX3BBbGxTdGFydFBhcmVudCA9IFRvTm9kZShybmQubV9DdXJOb2RlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSBpZiAocm5kLm1fZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQmluZE5ldykgewotICAgICAgaWYgKG1fcE5vZGVIZWxwZXItPm1faUN1ckFsbFN0YXJ0ID09IC0xKSB7Ci0gICAgICAgIG1fcE5vZGVIZWxwZXItPm1faUN1ckFsbFN0YXJ0ID0gbV9pQ3VyU3RhcnQ7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotICBpZiAoaUZvdW5kQ291bnQgPT0gMSAmJiAhaUxlbikgewotICAgIHJldHVybjsKLSAgfQotICBDRlhfV2lkZVN0cmluZyB3c0luZGV4OwotICB3c0luZGV4ID0gd3NDb25kaXRpb24uTWlkKGksIGlMZW4gLSAxIC0gaSk7Ci0gIGludDMyX3QgaUluZGV4ID0gd3NJbmRleC5HZXRJbnRlZ2VyKCk7Ci0gIGlmIChiUmVsYXRpdmUpIHsKLSAgICBpSW5kZXggKz0gaUN1ckluZGV4OwotICB9Ci0gIGlmIChpRm91bmRDb3VudCA8PSBpSW5kZXggfHwgaUluZGV4IDwgMCkgewotICAgIGlmIChybmQubV9kd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9DcmVhdGVOb2RlKSB7Ci0gICAgICBtX3BOb2RlSGVscGVyLT5tX3BDcmVhdGVQYXJlbnQgPSBUb05vZGUocm5kLm1fQ3VyTm9kZSk7Ci0gICAgICBtX3BOb2RlSGVscGVyLT5tX2lDcmVhdGVDb3VudCA9IGlJbmRleCAtIGlGb3VuZENvdW50ICsgMTsKLSAgICB9Ci0gICAgZmluZE5vZGVzLlJlbW92ZUFsbCgpOwotICB9IGVsc2UgewotICAgIENYRkFfTm9kZSogcmV0ID0gZmluZE5vZGVzW2lJbmRleF07Ci0gICAgZmluZE5vZGVzLlJlbW92ZUFsbCgpOwotICAgIGZpbmROb2Rlcy5BZGQocmV0KTsKLSAgfQotfQotdm9pZCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OkRvUHJlZGljYXRlRmlsdGVyKGludDMyX3QgaUN1ckluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29uZGl0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUZvdW5kQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhJiBybmQpIHsKLSAgQ1hGQV9Ob2RlQXJyYXkmIGZpbmROb2RlcyA9IChDWEZBX05vZGVBcnJheSYpcm5kLm1fTm9kZXM7Ci0gIEFTU0VSVChpRm91bmRDb3VudCA9PSBmaW5kTm9kZXMuR2V0U2l6ZSgpKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NFeHByZXNzaW9uOwotICBYRkFfU0NSSVBUTEFOR1RZUEUgZUxhbmdUeXBlID0gWEZBX1NDUklQVExBTkdUWVBFX1Vua293bjsKLSAgaWYgKHdzQ29uZGl0aW9uLkxlZnQoMikgPT0gTCIuWyIgJiYgd3NDb25kaXRpb24uUmlnaHQoMSkgPT0gTCJdIikgewotICAgIGVMYW5nVHlwZSA9IFhGQV9TQ1JJUFRMQU5HVFlQRV9Gb3JtY2FsYzsKLSAgfSBlbHNlIGlmICh3c0NvbmRpdGlvbi5MZWZ0KDIpID09IEwiLigiICYmIHdzQ29uZGl0aW9uLlJpZ2h0KDEpID09IEwiKSIpIHsKLSAgICBlTGFuZ1R5cGUgPSBYRkFfU0NSSVBUTEFOR1RZUEVfSmF2YXNjcmlwdDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBDWEZBX1NjcmlwdENvbnRleHQqIHBDb250ZXh0ID0gcm5kLm1fcFNDOwotICB3c0V4cHJlc3Npb24gPSB3c0NvbmRpdGlvbi5NaWQoMiwgd3NDb25kaXRpb24uR2V0TGVuZ3RoKCkgLSAzKTsKLSAgZm9yIChpbnQzMl90IGkgPSBpRm91bmRDb3VudCAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgQ1hGQV9PYmplY3QqIG5vZGUgPSBmaW5kTm9kZXNbaV07Ci0gICAgYm9vbCBiUmV0ID0gZmFsc2U7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gcFJldFZhbHVlKAotICAgICAgICBuZXcgQ0ZYSlNFX1ZhbHVlKHJuZC5tX3BTQy0+R2V0UnVudGltZSgpKSk7Ci0gICAgYlJldCA9IHBDb250ZXh0LT5SdW5TY3JpcHQoZUxhbmdUeXBlLCB3c0V4cHJlc3Npb24uQXNTdHJpbmdDKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFJldFZhbHVlLmdldCgpLCBub2RlKTsKLSAgICBpZiAoIWJSZXQgfHwgIXBSZXRWYWx1ZS0+VG9Cb29sZWFuKCkpCi0gICAgICBmaW5kTm9kZXMuUmVtb3ZlQXQoaSk7Ci0gIH0KLX0KLQotdm9pZCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OkZpbHRlckNvbmRpdGlvbihDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24pIHsKLSAgQ1hGQV9Ob2RlQXJyYXkmIGZpbmROb2RlcyA9IChDWEZBX05vZGVBcnJheSYpcm5kLm1fTm9kZXM7Ci0gIGludDMyX3QgaUN1cnJJbmRleCA9IDA7Ci0gIGNvbnN0IENYRkFfTm9kZUFycmF5JiBhcnJheSA9IHJuZC5tX3BTQy0+R2V0VXBPYmplY3RBcnJheSgpOwotICBpbnQzMl90IGlTaXplID0gYXJyYXkuR2V0U2l6ZSgpOwotICBpZiAoaVNpemUpIHsKLSAgICBDWEZBX05vZGUqIGN1ck5vZGUgPSBhcnJheVtpU2l6ZSAtIDFdOwotICAgIGJvb2wgYklzUHJvcGVydHkgPSBtX3BOb2RlSGVscGVyLT5Ob2RlSXNQcm9wZXJ0eShjdXJOb2RlKTsKLSAgICBpZiAoY3VyTm9kZS0+SXNVbm5hbWVkKCkgfHwKLSAgICAgICAgKGJJc1Byb3BlcnR5ICYmIGN1ck5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlBhZ2VTZXQpKSB7Ci0gICAgICBpQ3VyckluZGV4ID0gbV9wTm9kZUhlbHBlci0+R2V0SW5kZXgoY3VyTm9kZSwgWEZBX0xPR0lDX1RyYW5zcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJJc1Byb3BlcnR5LCB0cnVlKTsKLSAgICB9IGVsc2UgewotICAgICAgaUN1cnJJbmRleCA9IG1fcE5vZGVIZWxwZXItPkdldEluZGV4KGN1ck5vZGUsIFhGQV9MT0dJQ19UcmFuc3BhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiSXNQcm9wZXJ0eSwgZmFsc2UpOwotICAgIH0KLSAgfQotICBpbnQzMl90IGlGb3VuZENvdW50ID0gZmluZE5vZGVzLkdldFNpemUoKTsKLSAgd3NDb25kaXRpb24uVHJpbUxlZnQoKTsKLSAgd3NDb25kaXRpb24uVHJpbVJpZ2h0KCk7Ci0gIGludDMyX3QgaUxlbiA9IHdzQ29uZGl0aW9uLkdldExlbmd0aCgpOwotICBpZiAoIWlMZW4pIHsKLSAgICBpZiAocm5kLm1fZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQUxMKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChpRm91bmRDb3VudCA9PSAxKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChpRm91bmRDb3VudCA8PSBpQ3VyckluZGV4KSB7Ci0gICAgICBpZiAocm5kLm1fZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZSkgewotICAgICAgICBtX3BOb2RlSGVscGVyLT5tX3BDcmVhdGVQYXJlbnQgPSBUb05vZGUocm5kLm1fQ3VyTm9kZSk7Ci0gICAgICAgIG1fcE5vZGVIZWxwZXItPm1faUNyZWF0ZUNvdW50ID0gaUN1cnJJbmRleCAtIGlGb3VuZENvdW50ICsgMTsKLSAgICAgIH0KLSAgICAgIGZpbmROb2Rlcy5SZW1vdmVBbGwoKTsKLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgewotICAgICAgQ1hGQV9Ob2RlKiByZXQgPSBmaW5kTm9kZXNbaUN1cnJJbmRleF07Ci0gICAgICBmaW5kTm9kZXMuUmVtb3ZlQWxsKCk7Ci0gICAgICBmaW5kTm9kZXMuQWRkKHJldCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIEZYX1dDSEFSIHdUeXBlQ2hhciA9IHdzQ29uZGl0aW9uWzBdOwotICBzd2l0Y2ggKHdUeXBlQ2hhcikgewotICAgIGNhc2UgJ1snOgotICAgICAgQ29uZGl0aW9uQXJyYXkoaUN1cnJJbmRleCwgd3NDb25kaXRpb24sIGlGb3VuZENvdW50LCBybmQpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgJygnOgotICAgICAgcmV0dXJuOwotICAgIGNhc2UgJyInOgotICAgICAgcmV0dXJuOwotICAgIGNhc2UgJy4nOgotICAgICAgaWYgKGlMZW4gPiAxICYmICh3c0NvbmRpdGlvblsxXSA9PSAnWycgfHwgd3NDb25kaXRpb25bMV0gPT0gJygnKSkgewotICAgICAgICBEb1ByZWRpY2F0ZUZpbHRlcihpQ3VyckluZGV4LCB3c0NvbmRpdGlvbiwgaUZvdW5kQ291bnQsIHJuZCk7Ci0gICAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybjsKLSAgfQotfQotdm9pZCBDWEZBX1Jlc29sdmVQcm9jZXNzb3I6OlNldFN0eWxlc0ZvckNoaWxkKHVpbnQzMl90IGR3UGFyZW50U3R5bGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKSB7Ci0gIHVpbnQzMl90IGR3U3ViU3R5bGVzID0gWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuOwotICBpZiAoZHdQYXJlbnRTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfVGFnTmFtZSkgewotICAgIGR3U3ViU3R5bGVzIHw9IFhGQV9SRVNPTFZFTk9ERV9UYWdOYW1lOwotICB9Ci0gIGR3U3ViU3R5bGVzICY9IH5YRkFfUkVTT0xWRU5PREVfUGFyZW50OwotICBkd1N1YlN0eWxlcyAmPSB+WEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOwotICBkd1N1YlN0eWxlcyAmPSB+WEZBX1JFU09MVkVOT0RFX1Byb3BlcnRpZXM7Ci0gIGR3U3ViU3R5bGVzIHw9IFhGQV9SRVNPTFZFTk9ERV9BTEw7Ci0gIHJuZC5tX2R3U3R5bGVzID0gZHdTdWJTdHlsZXM7Ci19Ci1pbnQzMl90IENYRkFfUmVzb2x2ZVByb2Nlc3Nvcjo6U2V0UmVzdWx0Q3JlYXRlTm9kZSgKLSAgICBYRkFfUkVTT0xWRU5PREVfUlMmIHJlc29sdmVOb2RlUlMsCi0gICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTGFzdENvbmRpdGlvbikgewotICBpZiAobV9wTm9kZUhlbHBlci0+bV9wQ3JlYXRlUGFyZW50KSB7Ci0gICAgcmVzb2x2ZU5vZGVSUy5ub2Rlcy5BZGQobV9wTm9kZUhlbHBlci0+bV9wQ3JlYXRlUGFyZW50KTsKLSAgfSBlbHNlIHsKLSAgICBtX3BOb2RlSGVscGVyLT5DcmVhdGVOb2RlX0ZvckNvbmRpdGlvbih3c0xhc3RDb25kaXRpb24pOwotICB9Ci0gIHJlc29sdmVOb2RlUlMuZHdGbGFncyA9IG1fcE5vZGVIZWxwZXItPm1faUNyZWF0ZUZsYWc7Ci0gIGlmIChyZXNvbHZlTm9kZVJTLmR3RmxhZ3MgPT0gWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlT25lKSB7Ci0gICAgaWYgKG1fcE5vZGVIZWxwZXItPm1faUN1ckFsbFN0YXJ0ICE9IC0xKSB7Ci0gICAgICByZXNvbHZlTm9kZVJTLmR3RmxhZ3MgPSBYRkFfUkVTT0xWRU5PREVfUlNUWVBFX0NyZWF0ZU5vZGVNaWRBbGw7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXNvbHZlTm9kZVJTLm5vZGVzLkdldFNpemUoKTsKLX0KLXZvaWQgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yOjpTZXRJbmRleERhdGFCaW5kKENGWF9XaWRlU3RyaW5nJiB3c05leHRDb25kaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCkgewotICBpZiAobV9wTm9kZUhlbHBlci0+Q3JlYXRlTm9kZV9Gb3JDb25kaXRpb24od3NOZXh0Q29uZGl0aW9uKSkgewotICAgIGlmIChtX3BOb2RlSGVscGVyLT5tX2VMYXN0Q3JlYXRlVHlwZSA9PSBYRkFfRWxlbWVudDo6RGF0YUdyb3VwKSB7Ci0gICAgICBpSW5kZXggPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICBpSW5kZXggPSBpQ291bnQgLSAxOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpSW5kZXggPSBpQ291bnQgLSAxOwotICB9Ci19Ci0KLUNYRkFfUmVzb2x2ZU5vZGVzRGF0YTo6Q1hGQV9SZXNvbHZlTm9kZXNEYXRhKENYRkFfU2NyaXB0Q29udGV4dCogcFNDKQotICAgIDogbV9wU0MocFNDKSwKLSAgICAgIG1fQ3VyTm9kZShudWxscHRyKSwKLSAgICAgIG1fd3NOYW1lKCksCi0gICAgICBtX3VIYXNoTmFtZShYRkFfSEFTSENPREVfTm9uZSksCi0gICAgICBtX3dzQ29uZGl0aW9uKCksCi0gICAgICBtX25MZXZlbCgwKSwKLSAgICAgIG1fTm9kZXMoKSwKLSAgICAgIG1fZHdTdHlsZXMoWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuKSwKLSAgICAgIG1fcFNjcmlwdEF0dHJpYnV0ZShudWxscHRyKSwKLSAgICAgIG1fZHdGbGFnKFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9Ob2Rlcykge30KLQotQ1hGQV9SZXNvbHZlTm9kZXNEYXRhOjp+Q1hGQV9SZXNvbHZlTm9kZXNEYXRhKCkgewotICBtX05vZGVzLlJlbW92ZUFsbCgpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVzb2x2ZXByb2Nlc3Nvci5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVzb2x2ZXByb2Nlc3Nvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODA2ZDU3Li4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3Jlc29sdmVwcm9jZXNzb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9SRVNPTFZFUFJPQ0VTU09SX0hfCi0jZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1JFU09MVkVQUk9DRVNTT1JfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfb2JqZWN0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9yZXNvbHZlbm9kZV9ycy5oIgotCi1jbGFzcyBDWEZBX05vZGVIZWxwZXI7Ci1jbGFzcyBDWEZBX1NjcmlwdENvbnRleHQ7Ci0KLWNsYXNzIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEoQ1hGQV9TY3JpcHRDb250ZXh0KiBwU0MgPSBudWxscHRyKTsKLSAgfkNYRkFfUmVzb2x2ZU5vZGVzRGF0YSgpOwotCi0gIENYRkFfU2NyaXB0Q29udGV4dCogbV9wU0M7Ci0gIENYRkFfT2JqZWN0KiBtX0N1ck5vZGU7Ci0gIENGWF9XaWRlU3RyaW5nIG1fd3NOYW1lOwotICBYRkFfSGFzaENvZGUgbV91SGFzaE5hbWU7Ci0gIENGWF9XaWRlU3RyaW5nIG1fd3NDb25kaXRpb247Ci0gIGludDMyX3QgbV9uTGV2ZWw7Ci0gIENYRkFfT2JqQXJyYXkgbV9Ob2RlczsKLSAgdWludDMyX3QgbV9kd1N0eWxlczsKLSAgY29uc3QgWEZBX1NDUklQVEFUVFJJQlVURUlORk8qIG1fcFNjcmlwdEF0dHJpYnV0ZTsKLSAgWEZBX1JFU09WRU5PREVfUlNUWVBFIG1fZHdGbGFnOwotfTsKLQotY2xhc3MgQ1hGQV9SZXNvbHZlUHJvY2Vzc29yIHsKLSBwdWJsaWM6Ci0gIENYRkFfUmVzb2x2ZVByb2Nlc3NvcigpOwotICB+Q1hGQV9SZXNvbHZlUHJvY2Vzc29yKCk7Ci0KLSAgaW50MzJfdCBSZXNvbHZlKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKTsKLSAgaW50MzJfdCBHZXRGaWx0ZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgblN0YXJ0LAotICAgICAgICAgICAgICAgICAgICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCk7Ci0gIGludDMyX3QgU2V0UmVzdWx0Q3JlYXRlTm9kZShYRkFfUkVTT0xWRU5PREVfUlMmIHJlc29sdmVOb2RlUlMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NMYXN0Q29uZGl0aW9uKTsKLSAgdm9pZCBTZXRJbmRleERhdGFCaW5kKENGWF9XaWRlU3RyaW5nJiB3c05leHRDb25kaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDb3VudCk7Ci0gIHZvaWQgU2V0Q3VyU3RhcnQoaW50MzJfdCBzdGFydCkgeyBtX2lDdXJTdGFydCA9IHN0YXJ0OyB9Ci0KLSAgQ1hGQV9Ob2RlSGVscGVyKiBHZXROb2RlSGVscGVyKCkgY29uc3QgeyByZXR1cm4gbV9wTm9kZUhlbHBlci5nZXQoKTsgfQotCi0gcHJpdmF0ZToKLSAgaW50MzJfdCBSZXNvbHZlRm9yQXR0cmlidXRlUnMoQ1hGQV9PYmplY3QqIGN1ck5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHN0ckF0dHIpOwotICBpbnQzMl90IFJlc29sdmVBbnlDaGlsZChDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCk7Ci0gIGludDMyX3QgUmVzb2x2ZURvbGxhcihDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCk7Ci0gIGludDMyX3QgUmVzb2x2ZUV4Y2FsbWF0b3J5KENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKTsKLSAgaW50MzJfdCBSZXNvbHZlTnVtYmVyU2lnbihDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCk7Ci0gIGludDMyX3QgUmVzb2x2ZUFzdGVyaXNrKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKTsKLSAgaW50MzJfdCBSZXNvbHZlTm9ybWFsKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kKTsKLSAgaW50MzJfdCBSZXNvbHZlUG9wU3RhY2soQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4mIHN0YWNrKTsKLSAgdm9pZCBTZXRTdHlsZXNGb3JDaGlsZCh1aW50MzJfdCBkd1BhcmVudFN0eWxlcywgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhJiBybmQpOwotCi0gIHZvaWQgQ29uZGl0aW9uQXJyYXkoaW50MzJfdCBpQ3VySW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRm91bmRDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCk7Ci0gIHZvaWQgRG9QcmVkaWNhdGVGaWx0ZXIoaW50MzJfdCBpQ3VySW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb25kaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpRm91bmRDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1Jlc29sdmVOb2Rlc0RhdGEmIHJuZCk7Ci0gIHZvaWQgRmlsdGVyQ29uZGl0aW9uKENYRkFfUmVzb2x2ZU5vZGVzRGF0YSYgcm5kLCBDRlhfV2lkZVN0cmluZyB3c0NvbmRpdGlvbik7Ci0KLSAgaW50MzJfdCBtX2lDdXJTdGFydDsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfTm9kZUhlbHBlcj4gbV9wTm9kZUhlbHBlcjsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUkVTT0xWRVBST0NFU1NPUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcm9vdGVsZW1lbnQuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcm9vdGVsZW1lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5Yjg2MzEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yb290ZWxlbWVudC5jcHAKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcm9vdGVsZW1lbnQuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9yb290ZWxlbWVudC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInJvb3RFbGVtZW50IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfUm9vdEVsZW1lbnQ6OkNYRkFfUm9vdEVsZW1lbnQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OlRleHROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpSb290RWxlbWVudCwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfUm9vdEVsZW1lbnQ+KHRoaXMpKSB7fQorCitDWEZBX1Jvb3RFbGVtZW50Ojp+Q1hGQV9Sb290RWxlbWVudCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9yb290ZWxlbWVudC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcm9vdGVsZW1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTk1ZThjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcm9vdGVsZW1lbnQuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUk9PVEVMRU1FTlRfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUk9PVEVMRU1FTlRfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9Sb290RWxlbWVudCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9Sb290RWxlbWVudChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1Jvb3RFbGVtZW50KCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1JPT1RFTEVNRU5UX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ydW5zY3JpcHRzLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3J1bnNjcmlwdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YzBkNTIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ydW5zY3JpcHRzLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ydW5zY3JpcHRzLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJydW5TY3JpcHRzIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfUnVuU2NyaXB0czo6Q1hGQV9SdW5TY3JpcHRzKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpSdW5TY3JpcHRzLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfUnVuU2NyaXB0czo6fkNYRkFfUnVuU2NyaXB0cygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ydW5zY3JpcHRzLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9ydW5zY3JpcHRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlY2FhMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3J1bnNjcmlwdHMuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfUlVOU0NSSVBUU19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9SVU5TQ1JJUFRTX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfUnVuU2NyaXB0cyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9SdW5TY3JpcHRzKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfUnVuU2NyaXB0cygpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9SVU5TQ1JJUFRTX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zY3JpcHQuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2NyaXB0LmNwcAppbmRleCAxNmY2NWY5Li4xZTRlYjdlIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zY3JpcHQuY3BwCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NjcmlwdC5jcHAKQEAgLTEsNCArMSw0IEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIApAQCAtNiwyNiArNiw2MSBAQAogCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2NyaXB0LmgiCiAKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zY3JpcHQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKLUNYRkFfU2NyaXB0OjpDWEZBX1NjcmlwdChDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30KK25hbWVzcGFjZSB7CiAKLVhGQV9TQ1JJUFRUWVBFIENYRkFfU2NyaXB0OjpHZXRDb250ZW50VHlwZSgpIHsKLSAgQ0ZYX1dpZGVTdHJpbmdDIGNEYXRhOwotICBpZiAobV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgY0RhdGEsIGZhbHNlKSkgewotICAgIGlmIChjRGF0YSA9PSBMImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpCi0gICAgICByZXR1cm4gWEZBX1NDUklQVFRZUEVfSmF2YXNjcmlwdDsKLSAgICBpZiAoY0RhdGEgPT0gTCJhcHBsaWNhdGlvbi94LWZvcm1jYWxjIikKLSAgICAgIHJldHVybiBYRkFfU0NSSVBUVFlQRV9Gb3JtY2FsYzsKLSAgICByZXR1cm4gWEZBX1NDUklQVFRZUEVfVW5rb3duOwotICB9Ci0gIHJldHVybiBYRkFfU0NSSVBUVFlQRV9Gb3JtY2FsYzsKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHsKKyAgICB7WEZBX0VsZW1lbnQ6OkV4Y2x1ZGUsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6Q3VycmVudFBhZ2UsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6UnVuU2NyaXB0cywgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6Q29udGVudFR5cGUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlJ1bkF0LCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpDbGllbnR9LAorICAgIHtYRkFfQXR0cmlidXRlOjpCaW5kaW5nLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJzY3JpcHQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9TY3JpcHQ6OkNYRkFfU2NyaXB0KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKAorICAgICAgICAgIGRvYywKKyAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgIFhGQV9FbGVtZW50OjpTY3JpcHQsCisgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX1NjcmlwdD4odGhpcykpIHt9CisKK0NYRkFfU2NyaXB0Ojp+Q1hGQV9TY3JpcHQoKSB7fQorCitDWEZBX1NjcmlwdDo6VHlwZSBDWEZBX1NjcmlwdDo6R2V0Q29udGVudFR5cGUoKSB7CisgIE9wdGlvbmFsPFdpZGVTdHJpbmc+IGNEYXRhID0KKyAgICAgIEpTT2JqZWN0KCktPlRyeUNEYXRhKFhGQV9BdHRyaWJ1dGU6OkNvbnRlbnRUeXBlLCBmYWxzZSk7CisgIGlmICghY0RhdGEgfHwgKmNEYXRhID09IEwiYXBwbGljYXRpb24veC1mb3JtY2FsYyIpCisgICAgcmV0dXJuIFR5cGU6OkZvcm1jYWxjOworICBpZiAoKmNEYXRhID09IEwiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IikKKyAgICByZXR1cm4gVHlwZTo6SmF2YXNjcmlwdDsKKyAgcmV0dXJuIFR5cGU6OlVua25vd247CiB9CiAKLWludDMyX3QgQ1hGQV9TY3JpcHQ6OkdldFJ1bkF0KCkgewotICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1J1bkF0KTsKK1hGQV9BdHRyaWJ1dGVFbnVtIENYRkFfU2NyaXB0OjpHZXRSdW5BdCgpIHsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6UnVuQXQpOwogfQogCi12b2lkIENYRkFfU2NyaXB0OjpHZXRFeHByZXNzaW9uKENGWF9XaWRlU3RyaW5nJiB3c0V4cHJlc3Npb24pIHsKLSAgbV9wTm9kZS0+VHJ5Q29udGVudCh3c0V4cHJlc3Npb24pOworV2lkZVN0cmluZyBDWEZBX1NjcmlwdDo6R2V0RXhwcmVzc2lvbigpIHsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPkdldENvbnRlbnQoZmFsc2UpOwogfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2NyaXB0LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zY3JpcHQuaAppbmRleCBkODkwNjI0Li44ZWE3YWFjIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zY3JpcHQuaAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zY3JpcHQuaApAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCkBAIC03LDI2ICs3LDIzIEBACiAjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NDUklQVF9IXwogI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TQ1JJUFRfSF8KIAotI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImNvcmUvZnhjcnQvd2lkZXN0cmluZy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YS5oIgotCi1lbnVtIFhGQV9TQ1JJUFRUWVBFIHsKLSAgWEZBX1NDUklQVFRZUEVfRm9ybWNhbGMgPSAwLAotICBYRkFfU0NSSVBUVFlQRV9KYXZhc2NyaXB0LAotICBYRkFfU0NSSVBUVFlQRV9Vbmtvd24sCi19OwotCi1jbGFzcyBDWEZBX05vZGU7Ci0KLWNsYXNzIENYRkFfU2NyaXB0IDogcHVibGljIENYRkFfRGF0YSB7CitjbGFzcyBDWEZBX1NjcmlwdCA6IHB1YmxpYyBDWEZBX05vZGUgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9TY3JpcHQoQ1hGQV9Ob2RlKiBwTm9kZSk7CisgIGVudW0gY2xhc3MgVHlwZSB7CisgICAgRm9ybWNhbGMgPSAwLAorICAgIEphdmFzY3JpcHQsCisgICAgVW5rbm93biwKKyAgfTsKIAotICBYRkFfU0NSSVBUVFlQRSBHZXRDb250ZW50VHlwZSgpOwotICBpbnQzMl90IEdldFJ1bkF0KCk7Ci0gIHZvaWQgR2V0RXhwcmVzc2lvbihDRlhfV2lkZVN0cmluZyYgd3NFeHByZXNzaW9uKTsKKyAgQ1hGQV9TY3JpcHQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9TY3JpcHQoKSBvdmVycmlkZTsKKworICBUeXBlIEdldENvbnRlbnRUeXBlKCk7CisgIFhGQV9BdHRyaWJ1dGVFbnVtIEdldFJ1bkF0KCk7CisgIFdpZGVTdHJpbmcgR2V0RXhwcmVzc2lvbigpOwogfTsKIAogI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TQ1JJUFRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NjcmlwdGNvbnRleHQuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2NyaXB0Y29udGV4dC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NGNkNzYuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2NyaXB0Y29udGV4dC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NjkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2NyaXB0Y29udGV4dC5oIgotCi0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCi0jaW5jbHVkZSAiZnhqcy9jZnhqc2VfYXJndW1lbnRzLmgiCi0jaW5jbHVkZSAiZnhqcy9jZnhqc2VfY2xhc3MuaCIKLSNpbmNsdWRlICJmeGpzL2NmeGpzZV92YWx1ZS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2Zmbm90aWZ5LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvY3hmYV9ldmVudHBhcmFtLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlaGVscGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVzb2x2ZXByb2Nlc3Nvci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfYmFzaWNfZGF0YS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxlbWdyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX3Jlc29sdmVub2RlX3JzLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV91dGlscy5oIgotCi1uYW1lc3BhY2UgewotCi1jb25zdCBGWEpTRV9DTEFTU19ERVNDUklQVE9SIEdsb2JhbENsYXNzRGVzY3JpcHRvciA9IHsKLSAgICAiUm9vdCIsICAgLy8gbmFtZQotICAgIG51bGxwdHIsICAvLyBjb25zdHJ1Y3RvcgotICAgIG51bGxwdHIsICAvLyBwcm9wZXJ0aWVzCi0gICAgbnVsbHB0ciwgIC8vIG1ldGhvZHMKLSAgICAwLCAgICAgICAgLy8gcHJvcGVydHkgY291bnQKLSAgICAwLCAgICAgICAgLy8gbWV0aG9kIGNvdW50Ci0gICAgQ1hGQV9TY3JpcHRDb250ZXh0OjpHbG9iYWxQcm9wVHlwZUdldHRlciwKLSAgICBDWEZBX1NjcmlwdENvbnRleHQ6Okdsb2JhbFByb3BlcnR5R2V0dGVyLAotICAgIENYRkFfU2NyaXB0Q29udGV4dDo6R2xvYmFsUHJvcGVydHlTZXR0ZXIsCi0gICAgbnVsbHB0ciwgIC8vIHByb3BlcnR5IGRlbGV0ZXIKLSAgICBDWEZBX1NjcmlwdENvbnRleHQ6Ok5vcm1hbE1ldGhvZENhbGwsCi19OwotCi1jb25zdCBGWEpTRV9DTEFTU19ERVNDUklQVE9SIE5vcm1hbENsYXNzRGVzY3JpcHRvciA9IHsKLSAgICAiWEZBT2JqZWN0IiwgIC8vIG5hbWUKLSAgICBudWxscHRyLCAgICAgIC8vIGNvbnN0cnVjdG9yCi0gICAgbnVsbHB0ciwgICAgICAvLyBwcm9wZXJ0aWVzCi0gICAgbnVsbHB0ciwgICAgICAvLyBtZXRob2RzCi0gICAgMCwgICAgICAgICAgICAvLyBwcm9wZXJ0eSBjb3VudAotICAgIDAsICAgICAgICAgICAgLy8gbWV0aG9kIGNvdW50Ci0gICAgQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxQcm9wVHlwZUdldHRlciwKLSAgICBDWEZBX1NjcmlwdENvbnRleHQ6Ok5vcm1hbFByb3BlcnR5R2V0dGVyLAotICAgIENYRkFfU2NyaXB0Q29udGV4dDo6Tm9ybWFsUHJvcGVydHlTZXR0ZXIsCi0gICAgbnVsbHB0ciwgIC8vIHByb3BlcnR5IGRlbGV0ZXIKLSAgICBDWEZBX1NjcmlwdENvbnRleHQ6Ok5vcm1hbE1ldGhvZENhbGwsCi19OwotCi1jb25zdCBGWEpTRV9DTEFTU19ERVNDUklQVE9SIFZhcmlhYmxlc0NsYXNzRGVzY3JpcHRvciA9IHsKLSAgICAiWEZBU2NyaXB0T2JqZWN0IiwgIC8vIG5hbWUKLSAgICBudWxscHRyLCAgICAgICAgICAgIC8vIGNvbnN0cnVjdG9yCi0gICAgbnVsbHB0ciwgICAgICAgICAgICAvLyBwcm9wZXJ0aWVzCi0gICAgbnVsbHB0ciwgICAgICAgICAgICAvLyBtZXRob2RzCi0gICAgMCwgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0eSBjb3VudAotICAgIDAsICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGNvdW50Ci0gICAgQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxQcm9wVHlwZUdldHRlciwKLSAgICBDWEZBX1NjcmlwdENvbnRleHQ6Okdsb2JhbFByb3BlcnR5R2V0dGVyLAotICAgIENYRkFfU2NyaXB0Q29udGV4dDo6R2xvYmFsUHJvcGVydHlTZXR0ZXIsCi0gICAgbnVsbHB0ciwgIC8vIHByb3BlcnR5IGRlbGV0ZXIKLSAgICBDWEZBX1NjcmlwdENvbnRleHQ6Ok5vcm1hbE1ldGhvZENhbGwsCi19OwotCi1jb25zdCBjaGFyIGtGb3JtQ2FsY1J1bnRpbWVbXSA9ICJmb3hpdF94ZmFfZm9ybWNhbGNfcnVudGltZSI7Ci0KLUNYRkFfVGhpc1Byb3h5KiBUb1RoaXNQcm94eShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwgQ0ZYSlNFX0NsYXNzKiBwQ2xhc3MpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfVGhpc1Byb3h5Kj4ocFZhbHVlLT5Ub0hvc3RPYmplY3QocENsYXNzKSk7Ci19Ci0KLWNvbnN0IFhGQV9NRVRIT0RJTkZPKiBHZXRNZXRob2RCeU5hbWUoWEZBX0VsZW1lbnQgZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NNZXRob2ROYW1lKSB7Ci0gIGlmICh3c01ldGhvZE5hbWUuSXNFbXB0eSgpKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIGludDMyX3QgaUVsZW1lbnRJbmRleCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGVFbGVtZW50KTsKLSAgd2hpbGUgKGlFbGVtZW50SW5kZXggPj0gMCAmJiBpRWxlbWVudEluZGV4IDwgZ19pU2NyaXB0SW5kZXhDb3VudCkgewotICAgIGNvbnN0IFhGQV9TQ1JJUFRISUVSQVJDSFkqIHNjcmlwdEluZGV4ID0gZ19YRkFTY3JpcHRJbmRleCArIGlFbGVtZW50SW5kZXg7Ci0gICAgaW50MzJfdCBpY291bnQgPSBzY3JpcHRJbmRleC0+d01ldGhvZENvdW50OwotICAgIGlmIChpY291bnQgPT0gMCkgewotICAgICAgaUVsZW1lbnRJbmRleCA9IHNjcmlwdEluZGV4LT53UGFyZW50SW5kZXg7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgdWludDMyX3QgdUhhc2ggPSBGWF9IYXNoQ29kZV9HZXRXKHdzTWV0aG9kTmFtZSwgZmFsc2UpOwotICAgIGludDMyX3QgaVN0YXJ0ID0gc2NyaXB0SW5kZXgtPndNZXRob2RTdGFydDsKLSAgICAvLyBUT0RPKGRzaW5jbGFpcik6IFN3aXRjaCB0byBzdGQ6Omxvd2VyX2JvdW5kLgotICAgIGludDMyX3QgaUVuZCA9IGlTdGFydCArIGljb3VudCAtIDE7Ci0gICAgZG8gewotICAgICAgaW50MzJfdCBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsKLSAgICAgIGNvbnN0IFhGQV9NRVRIT0RJTkZPKiBwSW5mbyA9IGdfU29tTWV0aG9kRGF0YSArIGlNaWQ7Ci0gICAgICBpZiAodUhhc2ggPT0gcEluZm8tPnVIYXNoKQotICAgICAgICByZXR1cm4gcEluZm87Ci0gICAgICBpZiAodUhhc2ggPCBwSW5mby0+dUhhc2gpCi0gICAgICAgIGlFbmQgPSBpTWlkIC0gMTsKLSAgICAgIGVsc2UKLSAgICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7Ci0gICAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOwotICAgIGlFbGVtZW50SW5kZXggPSBzY3JpcHRJbmRleC0+d1BhcmVudEluZGV4OwotICB9Ci0gIHJldHVybiBudWxscHRyOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljLgotQ1hGQV9PYmplY3QqIENYRkFfU2NyaXB0Q29udGV4dDo6VG9PYmplY3QoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQ2xhc3MqIHBDbGFzcykgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9PYmplY3QqPihwVmFsdWUtPlRvSG9zdE9iamVjdChwQ2xhc3MpKTsKLX0KLQotQ1hGQV9TY3JpcHRDb250ZXh0OjpDWEZBX1NjcmlwdENvbnRleHQoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KQotICAgIDogbV9wRG9jdW1lbnQocERvY3VtZW50KSwKLSAgICAgIG1fcElzb2xhdGUobnVsbHB0ciksCi0gICAgICBtX3BKc0NsYXNzKG51bGxwdHIpLAotICAgICAgbV9lU2NyaXB0VHlwZShYRkFfU0NSSVBUTEFOR1RZUEVfVW5rb3duKSwKLSAgICAgIG1fcFNjcmlwdE5vZGVBcnJheShudWxscHRyKSwKLSAgICAgIG1fcFRoaXNPYmplY3QobnVsbHB0ciksCi0gICAgICBtX2R3QnVpbHRJbkluRmxhZ3MoMCksCi0gICAgICBtX2VSdW5BdFR5cGUoWEZBX0FUVFJJQlVURUVOVU1fQ2xpZW50KSB7fQotCi1DWEZBX1NjcmlwdENvbnRleHQ6On5DWEZBX1NjcmlwdENvbnRleHQoKSB7Ci0gIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1fbWFwVmFyaWFibGVUb0NvbnRleHQpIHsKLSAgICBDRlhKU0VfQ29udGV4dCogcFZhcmlhYmxlQ29udGV4dCA9IHBhaXIuc2Vjb25kOwotICAgIGRlbGV0ZSBUb1RoaXNQcm94eShwVmFyaWFibGVDb250ZXh0LT5HZXRHbG9iYWxPYmplY3QoKS5nZXQoKSwgbnVsbHB0cik7Ci0gICAgZGVsZXRlIHBWYXJpYWJsZUNvbnRleHQ7Ci0gIH0KLSAgbV9tYXBWYXJpYWJsZVRvQ29udGV4dC5jbGVhcigpOwotICBtX3VwT2JqZWN0QXJyYXkuUmVtb3ZlQWxsKCk7Ci19Ci0KLXZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpJbml0aWFsaXplKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSkgewotICBtX3BJc29sYXRlID0gcElzb2xhdGU7Ci0gIERlZmluZUpzQ29udGV4dCgpOwotICBEZWZpbmVKc0NsYXNzKCk7Ci0gIG1fUmVzb2x2ZVByb2Nlc3NvciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX1Jlc29sdmVQcm9jZXNzb3I+KCk7Ci19Ci0KLWJvb2wgQ1hGQV9TY3JpcHRDb250ZXh0OjpSdW5TY3JpcHQoWEZBX1NDUklQVExBTkdUWVBFIGVTY3JpcHRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzU2NyaXB0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIGhSZXRWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9PYmplY3QqIHBUaGlzT2JqZWN0KSB7Ci0gIENGWF9CeXRlU3RyaW5nIGJ0U2NyaXB0OwotICBYRkFfU0NSSVBUTEFOR1RZUEUgZVNhdmVUeXBlID0gbV9lU2NyaXB0VHlwZTsKLSAgbV9lU2NyaXB0VHlwZSA9IGVTY3JpcHRUeXBlOwotICBpZiAoZVNjcmlwdFR5cGUgPT0gWEZBX1NDUklQVExBTkdUWVBFX0Zvcm1jYWxjKSB7Ci0gICAgaWYgKCFtX0ZNMkpTQ29udGV4dCkgewotICAgICAgbV9GTTJKU0NvbnRleHQucmVzZXQoCi0gICAgICAgICAgbmV3IENYRkFfRk0ySlNDb250ZXh0KG1fcElzb2xhdGUsIG1fSnNDb250ZXh0LmdldCgpLCBtX3BEb2N1bWVudCkpOwotICAgIH0KLSAgICBDRlhfV2lkZVRleHRCdWYgd3NKYXZhU2NyaXB0OwotICAgIENGWF9XaWRlU3RyaW5nIHdzRXJyb3JJbmZvOwotICAgIGludDMyX3QgaUZsYWdzID0KLSAgICAgICAgQ1hGQV9GTTJKU0NvbnRleHQ6OlRyYW5zbGF0ZSh3c1NjcmlwdCwgd3NKYXZhU2NyaXB0LCB3c0Vycm9ySW5mbyk7Ci0gICAgaWYgKGlGbGFncykgewotICAgICAgaFJldFZhbHVlLT5TZXRVbmRlZmluZWQoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgYnRTY3JpcHQgPSBGWF9VVEY4RW5jb2RlKHdzSmF2YVNjcmlwdC5Bc1N0cmluZ0MoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgYnRTY3JpcHQgPSBGWF9VVEY4RW5jb2RlKHdzU2NyaXB0KTsKLSAgfQotICBDWEZBX09iamVjdCogcE9yaWdpbmFsT2JqZWN0ID0gbV9wVGhpc09iamVjdDsKLSAgbV9wVGhpc09iamVjdCA9IHBUaGlzT2JqZWN0OwotICBDRlhKU0VfVmFsdWUqIHBWYWx1ZSA9IHBUaGlzT2JqZWN0ID8gR2V0SlNWYWx1ZUZyb21NYXAocFRoaXNPYmplY3QpIDogbnVsbHB0cjsKLSAgYm9vbCBiUmV0ID0gbV9Kc0NvbnRleHQtPkV4ZWN1dGVTY3JpcHQoYnRTY3JpcHQuY19zdHIoKSwgaFJldFZhbHVlLCBwVmFsdWUpOwotICBtX3BUaGlzT2JqZWN0ID0gcE9yaWdpbmFsT2JqZWN0OwotICBtX2VTY3JpcHRUeXBlID0gZVNhdmVUeXBlOwotICByZXR1cm4gYlJldDsKLX0KLXZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpHbG9iYWxQcm9wZXJ0eVNldHRlcihDRlhKU0VfVmFsdWUqIHBPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFZhbHVlKSB7Ci0gIENYRkFfT2JqZWN0KiBscE9yZ2luYWxOb2RlID0gVG9PYmplY3QocE9iamVjdCwgbnVsbHB0cik7Ci0gIENYRkFfRG9jdW1lbnQqIHBEb2MgPSBscE9yZ2luYWxOb2RlLT5HZXREb2N1bWVudCgpOwotICBDWEZBX1NjcmlwdENvbnRleHQqIGxwU2NyaXB0Q29udGV4dCA9IHBEb2MtPkdldFNjcmlwdENvbnRleHQoKTsKLSAgQ1hGQV9PYmplY3QqIGxwQ3VyTm9kZSA9IGxwU2NyaXB0Q29udGV4dC0+R2V0VmFyaWFibGVzVGhpcyhscE9yZ2luYWxOb2RlKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NQcm9wTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelByb3BOYW1lKTsKLSAgdWludDMyX3QgZHdGbGFnID0gWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyB8Ci0gICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzIHwKLSAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXM7Ci0gIENYRkFfTm9kZSogcFJlZk5vZGUgPSBUb05vZGUobHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCkpOwotICBpZiAobHBPcmdpbmFsTm9kZS0+SXNWYXJpYWJsZXNUaGlzKCkpCi0gICAgcFJlZk5vZGUgPSBUb05vZGUobHBDdXJOb2RlKTsKLSAgaWYgKGxwU2NyaXB0Q29udGV4dC0+UXVlcnlOb2RlQnlGbGFnKHBSZWZOb2RlLCB3c1Byb3BOYW1lLkFzU3RyaW5nQygpLCBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWcsIHRydWUpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChscE9yZ2luYWxOb2RlLT5Jc1ZhcmlhYmxlc1RoaXMoKSkgewotICAgIGlmIChwVmFsdWUgJiYgcFZhbHVlLT5Jc1VuZGVmaW5lZCgpKSB7Ci0gICAgICBwT2JqZWN0LT5TZXRPYmplY3RPd25Qcm9wZXJ0eShzelByb3BOYW1lLCBwVmFsdWUpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gcERvYy0+R2V0Tm90aWZ5KCk7Ci0gIGlmICghcE5vdGlmeSkgewotICAgIHJldHVybjsKLSAgfQotICBwTm90aWZ5LT5HZXREb2NFbnZpcm9ubWVudCgpLT5TZXRHbG9iYWxQcm9wZXJ0eShwTm90aWZ5LT5HZXRIRE9DKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6UHJvcE5hbWUsIHBWYWx1ZSk7Ci19Ci1ib29sIENYRkFfU2NyaXB0Q29udGV4dDo6UXVlcnlOb2RlQnlGbGFnKENYRkFfTm9kZSogcmVmTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiBwcm9wbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZykgewotICBpZiAoIXJlZk5vZGUpCi0gICAgcmV0dXJuIGZhbHNlOwotICBYRkFfUkVTT0xWRU5PREVfUlMgcmVzb2x2ZVJzOwotICBpZiAoUmVzb2x2ZU9iamVjdHMocmVmTm9kZSwgcHJvcG5hbWUsIHJlc29sdmVScywgZHdGbGFnKSA8PSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKHJlc29sdmVScy5kd0ZsYWdzID09IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9Ob2RlcykgewotICAgIHBWYWx1ZS0+QXNzaWduKEdldEpTVmFsdWVGcm9tTWFwKHJlc29sdmVScy5ub2Rlc1swXSkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChyZXNvbHZlUnMuZHdGbGFncyA9PSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfQXR0cmlidXRlKSB7Ci0gICAgY29uc3QgWEZBX1NDUklQVEFUVFJJQlVURUlORk8qIGxwQXR0cmlidXRlSW5mbyA9IHJlc29sdmVScy5wU2NyaXB0QXR0cmlidXRlOwotICAgIGlmIChscEF0dHJpYnV0ZUluZm8pIHsKLSAgICAgIChyZXNvbHZlUnMubm9kZXNbMF0tPioobHBBdHRyaWJ1dGVJbmZvLT5scGZuQ2FsbGJhY2spKSgKLSAgICAgICAgICBwVmFsdWUsIGJTZXR0aW5nLCAoWEZBX0FUVFJJQlVURSlscEF0dHJpYnV0ZUluZm8tPmVBdHRyaWJ1dGUpOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLXZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpHbG9iYWxQcm9wZXJ0eUdldHRlcihDRlhKU0VfVmFsdWUqIHBPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFZhbHVlKSB7Ci0gIENYRkFfT2JqZWN0KiBwT3JpZ2luYWxPYmplY3QgPSBUb09iamVjdChwT2JqZWN0LCBudWxscHRyKTsKLSAgQ1hGQV9Eb2N1bWVudCogcERvYyA9IHBPcmlnaW5hbE9iamVjdC0+R2V0RG9jdW1lbnQoKTsKLSAgQ1hGQV9TY3JpcHRDb250ZXh0KiBscFNjcmlwdENvbnRleHQgPSBwRG9jLT5HZXRTY3JpcHRDb250ZXh0KCk7Ci0gIENYRkFfT2JqZWN0KiBscEN1ck5vZGUgPSBscFNjcmlwdENvbnRleHQtPkdldFZhcmlhYmxlc1RoaXMocE9yaWdpbmFsT2JqZWN0KTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NQcm9wTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelByb3BOYW1lKTsKLSAgaWYgKGxwU2NyaXB0Q29udGV4dC0+R2V0VHlwZSgpID09IFhGQV9TQ1JJUFRMQU5HVFlQRV9Gb3JtY2FsYykgewotICAgIGlmIChzelByb3BOYW1lID09IGtGb3JtQ2FsY1J1bnRpbWUpIHsKLSAgICAgIGxwU2NyaXB0Q29udGV4dC0+bV9GTTJKU0NvbnRleHQtPkdsb2JhbFByb3BlcnR5R2V0dGVyKHBWYWx1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIFhGQV9IYXNoQ29kZSB1SGFzaENvZGUgPSBzdGF0aWNfY2FzdDxYRkFfSGFzaENvZGU+KAotICAgICAgICBGWF9IYXNoQ29kZV9HZXRXKHdzUHJvcE5hbWUuQXNTdHJpbmdDKCksIGZhbHNlKSk7Ci0gICAgaWYgKHVIYXNoQ29kZSAhPSBYRkFfSEFTSENPREVfTGF5b3V0KSB7Ci0gICAgICBDWEZBX09iamVjdCogcE9iaiA9Ci0gICAgICAgICAgbHBTY3JpcHRDb250ZXh0LT5HZXREb2N1bWVudCgpLT5HZXRYRkFPYmplY3QodUhhc2hDb2RlKTsKLSAgICAgIGlmIChwT2JqKSB7Ci0gICAgICAgIHBWYWx1ZS0+QXNzaWduKGxwU2NyaXB0Q29udGV4dC0+R2V0SlNWYWx1ZUZyb21NYXAocE9iaikpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHVpbnQzMl90IGR3RmxhZyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiB8IFhGQV9SRVNPTFZFTk9ERV9Qcm9wZXJ0aWVzIHwKLSAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX0F0dHJpYnV0ZXM7Ci0gIENYRkFfTm9kZSogcFJlZk5vZGUgPSBUb05vZGUobHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCkpOwotICBpZiAocE9yaWdpbmFsT2JqZWN0LT5Jc1ZhcmlhYmxlc1RoaXMoKSkgewotICAgIHBSZWZOb2RlID0gVG9Ob2RlKGxwQ3VyTm9kZSk7Ci0gIH0KLSAgaWYgKGxwU2NyaXB0Q29udGV4dC0+UXVlcnlOb2RlQnlGbGFnKHBSZWZOb2RlLCB3c1Byb3BOYW1lLkFzU3RyaW5nQygpLCBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd0ZsYWcsIGZhbHNlKSkgewotICAgIHJldHVybjsKLSAgfQotICBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOwotICBpZiAobHBTY3JpcHRDb250ZXh0LT5RdWVyeU5vZGVCeUZsYWcocFJlZk5vZGUsIHdzUHJvcE5hbWUuQXNTdHJpbmdDKCksIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR3RmxhZywgZmFsc2UpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfT2JqZWN0KiBwU2NyaXB0T2JqZWN0ID0KLSAgICAgIGxwU2NyaXB0Q29udGV4dC0+R2V0VmFyaWFibGVzVGhpcyhwT3JpZ2luYWxPYmplY3QsIHRydWUpOwotICBpZiAocFNjcmlwdE9iamVjdCAmJgotICAgICAgbHBTY3JpcHRDb250ZXh0LT5RdWVyeVZhcmlhYmxlVmFsdWUocFNjcmlwdE9iamVjdC0+QXNOb2RlKCksIHN6UHJvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmFsdWUsIHRydWUpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfRkZOb3RpZnkqIHBOb3RpZnkgPSBwRG9jLT5HZXROb3RpZnkoKTsKLSAgaWYgKCFwTm90aWZ5KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHBOb3RpZnktPkdldERvY0Vudmlyb25tZW50KCktPkdldEdsb2JhbFByb3BlcnR5KHBOb3RpZnktPkdldEhET0MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3pQcm9wTmFtZSwgcFZhbHVlKTsKLX0KLXZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxQcm9wZXJ0eUdldHRlcihDRlhKU0VfVmFsdWUqIHBPcmlnaW5hbFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHBSZXR1cm5WYWx1ZSkgewotICBDWEZBX09iamVjdCogcE9yaWdpbmFsT2JqZWN0ID0gVG9PYmplY3QocE9yaWdpbmFsVmFsdWUsIG51bGxwdHIpOwotICBpZiAoIXBPcmlnaW5hbE9iamVjdCkgewotICAgIHBSZXR1cm5WYWx1ZS0+U2V0VW5kZWZpbmVkKCk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENGWF9XaWRlU3RyaW5nIHdzUHJvcE5hbWUgPSBDRlhfV2lkZVN0cmluZzo6RnJvbVVURjgoc3pQcm9wTmFtZSk7Ci0gIENYRkFfU2NyaXB0Q29udGV4dCogbHBTY3JpcHRDb250ZXh0ID0KLSAgICAgIHBPcmlnaW5hbE9iamVjdC0+R2V0RG9jdW1lbnQoKS0+R2V0U2NyaXB0Q29udGV4dCgpOwotICBDWEZBX09iamVjdCogcE9iamVjdCA9IGxwU2NyaXB0Q29udGV4dC0+R2V0VmFyaWFibGVzVGhpcyhwT3JpZ2luYWxPYmplY3QpOwotICBpZiAod3NQcm9wTmFtZSA9PSBMInhmYSIpIHsKLSAgICBDRlhKU0VfVmFsdWUqIHBWYWx1ZSA9IGxwU2NyaXB0Q29udGV4dC0+R2V0SlNWYWx1ZUZyb21NYXAoCi0gICAgICAgIGxwU2NyaXB0Q29udGV4dC0+R2V0RG9jdW1lbnQoKS0+R2V0Um9vdCgpKTsKLSAgICBwUmV0dXJuVmFsdWUtPkFzc2lnbihwVmFsdWUpOwotICAgIHJldHVybjsKLSAgfQotICB1aW50MzJfdCBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfQ2hpbGRyZW4gfCBYRkFfUkVTT0xWRU5PREVfUHJvcGVydGllcyB8Ci0gICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9BdHRyaWJ1dGVzOwotICBib29sIGJSZXQgPSBscFNjcmlwdENvbnRleHQtPlF1ZXJ5Tm9kZUJ5RmxhZygKLSAgICAgIFRvTm9kZShwT2JqZWN0KSwgd3NQcm9wTmFtZS5Bc1N0cmluZ0MoKSwgcFJldHVyblZhbHVlLCBkd0ZsYWcsIGZhbHNlKTsKLSAgaWYgKGJSZXQpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKHBPYmplY3QgPT0gbHBTY3JpcHRDb250ZXh0LT5HZXRUaGlzT2JqZWN0KCkgfHwKLSAgICAgIChscFNjcmlwdENvbnRleHQtPkdldFR5cGUoKSA9PSBYRkFfU0NSSVBUTEFOR1RZUEVfSmF2YXNjcmlwdCAmJgotICAgICAgICFscFNjcmlwdENvbnRleHQtPklzU3RyaWN0U2NvcGVJbkphdmFTY3JpcHQoKSkpIHsKLSAgICBkd0ZsYWcgPSBYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzOwotICAgIGJSZXQgPSBscFNjcmlwdENvbnRleHQtPlF1ZXJ5Tm9kZUJ5RmxhZygKLSAgICAgICAgVG9Ob2RlKHBPYmplY3QpLCB3c1Byb3BOYW1lLkFzU3RyaW5nQygpLCBwUmV0dXJuVmFsdWUsIGR3RmxhZywgZmFsc2UpOwotICB9Ci0gIGlmIChiUmV0KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIENYRkFfT2JqZWN0KiBwU2NyaXB0T2JqZWN0ID0KLSAgICAgIGxwU2NyaXB0Q29udGV4dC0+R2V0VmFyaWFibGVzVGhpcyhwT3JpZ2luYWxPYmplY3QsIHRydWUpOwotICBpZiAocFNjcmlwdE9iamVjdCkgewotICAgIGJSZXQgPSBscFNjcmlwdENvbnRleHQtPlF1ZXJ5VmFyaWFibGVWYWx1ZShUb05vZGUocFNjcmlwdE9iamVjdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN6UHJvcE5hbWUsIHBSZXR1cm5WYWx1ZSwgdHJ1ZSk7Ci0gIH0KLSAgaWYgKCFiUmV0KSB7Ci0gICAgcFJldHVyblZhbHVlLT5TZXRVbmRlZmluZWQoKTsKLSAgfQotfQotdm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6Ok5vcm1hbFByb3BlcnR5U2V0dGVyKENGWEpTRV9WYWx1ZSogcE9yaWdpbmFsVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFJldHVyblZhbHVlKSB7Ci0gIENYRkFfT2JqZWN0KiBwT3JpZ2luYWxPYmplY3QgPSBUb09iamVjdChwT3JpZ2luYWxWYWx1ZSwgbnVsbHB0cik7Ci0gIGlmICghcE9yaWdpbmFsT2JqZWN0KQotICAgIHJldHVybjsKLQotICBDWEZBX1NjcmlwdENvbnRleHQqIGxwU2NyaXB0Q29udGV4dCA9Ci0gICAgICBwT3JpZ2luYWxPYmplY3QtPkdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKTsKLSAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSBscFNjcmlwdENvbnRleHQtPkdldFZhcmlhYmxlc1RoaXMocE9yaWdpbmFsT2JqZWN0KTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NQcm9wTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelByb3BOYW1lKTsKLSAgY29uc3QgWEZBX1NDUklQVEFUVFJJQlVURUlORk8qIGxwQXR0cmlidXRlSW5mbyA9IFhGQV9HZXRTY3JpcHRBdHRyaWJ1dGVCeU5hbWUoCi0gICAgICBwT2JqZWN0LT5HZXRFbGVtZW50VHlwZSgpLCB3c1Byb3BOYW1lLkFzU3RyaW5nQygpKTsKLSAgaWYgKGxwQXR0cmlidXRlSW5mbykgewotICAgIChwT2JqZWN0LT4qKGxwQXR0cmlidXRlSW5mby0+bHBmbkNhbGxiYWNrKSkoCi0gICAgICAgIHBSZXR1cm5WYWx1ZSwgdHJ1ZSwgKFhGQV9BVFRSSUJVVEUpbHBBdHRyaWJ1dGVJbmZvLT5lQXR0cmlidXRlKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAocE9iamVjdC0+SXNOb2RlKCkpIHsKLSAgICAgIGlmICh3c1Byb3BOYW1lLkdldEF0KDApID09ICcjJykgewotICAgICAgICB3c1Byb3BOYW1lID0gd3NQcm9wTmFtZS5SaWdodCh3c1Byb3BOYW1lLkdldExlbmd0aCgpIC0gMSk7Ci0gICAgICB9Ci0gICAgICBDWEZBX05vZGUqIHBOb2RlID0gVG9Ob2RlKHBPYmplY3QpOwotICAgICAgQ1hGQV9Ob2RlKiBwUHJvcE9yQ2hpbGQgPSBudWxscHRyOwotICAgICAgWEZBX0VsZW1lbnQgZVR5cGUgPSBYRkFfR2V0RWxlbWVudFR5cGVGb3JOYW1lKHdzUHJvcE5hbWUuQXNTdHJpbmdDKCkpOwotICAgICAgaWYgKGVUeXBlICE9IFhGQV9FbGVtZW50OjpVbmtub3duKQotICAgICAgICBwUHJvcE9yQ2hpbGQgPSBwTm9kZS0+R2V0UHJvcGVydHkoMCwgZVR5cGUpOwotICAgICAgZWxzZQotICAgICAgICBwUHJvcE9yQ2hpbGQgPSBwTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZSh3c1Byb3BOYW1lLkFzU3RyaW5nQygpKTsKLQotICAgICAgaWYgKHBQcm9wT3JDaGlsZCkgewotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RlZmF1bHROYW1lKEwie2RlZmF1bHR9Iik7Ci0gICAgICAgIGNvbnN0IFhGQV9TQ1JJUFRBVFRSSUJVVEVJTkZPKiBscEF0dHJJbmZvID0KLSAgICAgICAgICAgIFhGQV9HZXRTY3JpcHRBdHRyaWJ1dGVCeU5hbWUocFByb3BPckNoaWxkLT5HZXRFbGVtZW50VHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0RlZmF1bHROYW1lLkFzU3RyaW5nQygpKTsKLSAgICAgICAgaWYgKGxwQXR0ckluZm8pIHsKLSAgICAgICAgICAocFByb3BPckNoaWxkLT4qKGxwQXR0ckluZm8tPmxwZm5DYWxsYmFjaykpKAotICAgICAgICAgICAgICBwUmV0dXJuVmFsdWUsIHRydWUsIChYRkFfQVRUUklCVVRFKWxwQXR0ckluZm8tPmVBdHRyaWJ1dGUpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBDWEZBX09iamVjdCogcFNjcmlwdE9iamVjdCA9Ci0gICAgICAgIGxwU2NyaXB0Q29udGV4dC0+R2V0VmFyaWFibGVzVGhpcyhwT3JpZ2luYWxPYmplY3QsIHRydWUpOwotICAgIGlmIChwU2NyaXB0T2JqZWN0KSB7Ci0gICAgICBscFNjcmlwdENvbnRleHQtPlF1ZXJ5VmFyaWFibGVWYWx1ZShUb05vZGUocFNjcmlwdE9iamVjdCksIHN6UHJvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUmV0dXJuVmFsdWUsIGZhbHNlKTsKLSAgICB9Ci0gIH0KLX0KLWludDMyX3QgQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxQcm9wVHlwZUdldHRlcigKLSAgICBDRlhKU0VfVmFsdWUqIHBPcmlnaW5hbFZhbHVlLAotICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwKLSAgICBib29sIGJRdWVyeUluKSB7Ci0gIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gVG9PYmplY3QocE9yaWdpbmFsVmFsdWUsIG51bGxwdHIpOwotICBpZiAoIXBPYmplY3QpCi0gICAgcmV0dXJuIEZYSlNFX0NsYXNzUHJvcFR5cGVfTm9uZTsKLQotICBDWEZBX1NjcmlwdENvbnRleHQqIGxwU2NyaXB0Q29udGV4dCA9Ci0gICAgICBwT2JqZWN0LT5HZXREb2N1bWVudCgpLT5HZXRTY3JpcHRDb250ZXh0KCk7Ci0gIHBPYmplY3QgPSBscFNjcmlwdENvbnRleHQtPkdldFZhcmlhYmxlc1RoaXMocE9iamVjdCk7Ci0gIFhGQV9FbGVtZW50IGVUeXBlID0gcE9iamVjdC0+R2V0RWxlbWVudFR5cGUoKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NQcm9wTmFtZSA9IENGWF9XaWRlU3RyaW5nOjpGcm9tVVRGOChzelByb3BOYW1lKTsKLSAgaWYgKEdldE1ldGhvZEJ5TmFtZShlVHlwZSwgd3NQcm9wTmFtZS5Bc1N0cmluZ0MoKSkpIHsKLSAgICByZXR1cm4gRlhKU0VfQ2xhc3NQcm9wVHlwZV9NZXRob2Q7Ci0gIH0KLSAgaWYgKGJRdWVyeUluICYmCi0gICAgICAhWEZBX0dldFNjcmlwdEF0dHJpYnV0ZUJ5TmFtZShlVHlwZSwgd3NQcm9wTmFtZS5Bc1N0cmluZ0MoKSkpIHsKLSAgICByZXR1cm4gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Ob25lOwotICB9Ci0gIHJldHVybiBGWEpTRV9DbGFzc1Byb3BUeXBlX1Byb3BlcnR5OwotfQotaW50MzJfdCBDWEZBX1NjcmlwdENvbnRleHQ6Okdsb2JhbFByb3BUeXBlR2V0dGVyKAotICAgIENGWEpTRV9WYWx1ZSogcE9yaWdpbmFsVmFsdWUsCi0gICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLAotICAgIGJvb2wgYlF1ZXJ5SW4pIHsKLSAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSBUb09iamVjdChwT3JpZ2luYWxWYWx1ZSwgbnVsbHB0cik7Ci0gIGlmICghcE9iamVjdCkKLSAgICByZXR1cm4gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Ob25lOwotCi0gIENYRkFfU2NyaXB0Q29udGV4dCogbHBTY3JpcHRDb250ZXh0ID0KLSAgICAgIHBPYmplY3QtPkdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKTsKLSAgcE9iamVjdCA9IGxwU2NyaXB0Q29udGV4dC0+R2V0VmFyaWFibGVzVGhpcyhwT2JqZWN0KTsKLSAgWEZBX0VsZW1lbnQgZVR5cGUgPSBwT2JqZWN0LT5HZXRFbGVtZW50VHlwZSgpOwotICBDRlhfV2lkZVN0cmluZyB3c1Byb3BOYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6UHJvcE5hbWUpOwotICBpZiAoR2V0TWV0aG9kQnlOYW1lKGVUeXBlLCB3c1Byb3BOYW1lLkFzU3RyaW5nQygpKSkgewotICAgIHJldHVybiBGWEpTRV9DbGFzc1Byb3BUeXBlX01ldGhvZDsKLSAgfQotICByZXR1cm4gRlhKU0VfQ2xhc3NQcm9wVHlwZV9Qcm9wZXJ0eTsKLX0KLXZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpOb3JtYWxNZXRob2RDYWxsKENGWEpTRV9WYWx1ZSogcFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6RnVuY05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfQXJndW1lbnRzJiBhcmdzKSB7Ci0gIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gVG9PYmplY3QocFRoaXMsIG51bGxwdHIpOwotICBpZiAoIXBPYmplY3QpCi0gICAgcmV0dXJuOwotCi0gIENYRkFfU2NyaXB0Q29udGV4dCogbHBTY3JpcHRDb250ZXh0ID0KLSAgICAgIHBPYmplY3QtPkdldERvY3VtZW50KCktPkdldFNjcmlwdENvbnRleHQoKTsKLSAgcE9iamVjdCA9IGxwU2NyaXB0Q29udGV4dC0+R2V0VmFyaWFibGVzVGhpcyhwT2JqZWN0KTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NGdW5OYW1lID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6RnVuY05hbWUpOwotICBjb25zdCBYRkFfTUVUSE9ESU5GTyogbHBNZXRob2RJbmZvID0KLSAgICAgIEdldE1ldGhvZEJ5TmFtZShwT2JqZWN0LT5HZXRFbGVtZW50VHlwZSgpLCB3c0Z1bk5hbWUuQXNTdHJpbmdDKCkpOwotICBpZiAoIWxwTWV0aG9kSW5mbykKLSAgICByZXR1cm47Ci0KLSAgKHBPYmplY3QtPioobHBNZXRob2RJbmZvLT5scGZuQ2FsbGJhY2spKSgmYXJncyk7Ci19Ci1ib29sIENYRkFfU2NyaXB0Q29udGV4dDo6SXNTdHJpY3RTY29wZUluSmF2YVNjcmlwdCgpIHsKLSAgcmV0dXJuIG1fcERvY3VtZW50LT5IYXNGbGFnKFhGQV9ET0NGTEFHX1N0cmljdFNjb3BpbmcpOwotfQotWEZBX1NDUklQVExBTkdUWVBFIENYRkFfU2NyaXB0Q29udGV4dDo6R2V0VHlwZSgpIHsKLSAgcmV0dXJuIG1fZVNjcmlwdFR5cGU7Ci19Ci12b2lkIENYRkFfU2NyaXB0Q29udGV4dDo6RGVmaW5lSnNDb250ZXh0KCkgewotICBtX0pzQ29udGV4dC5yZXNldChDRlhKU0VfQ29udGV4dDo6Q3JlYXRlKG1fcElzb2xhdGUsICZHbG9iYWxDbGFzc0Rlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRG9jdW1lbnQtPkdldFJvb3QoKSkpOwotICBSZW1vdmVCdWlsdEluT2JqcyhtX0pzQ29udGV4dC5nZXQoKSk7Ci0gIG1fSnNDb250ZXh0LT5FbmFibGVDb21wYXRpYmxlTW9kZSgpOwotfQotQ0ZYSlNFX0NvbnRleHQqIENYRkFfU2NyaXB0Q29udGV4dDo6Q3JlYXRlVmFyaWFibGVzQ29udGV4dCgKLSAgICBDWEZBX05vZGUqIHBTY3JpcHROb2RlLAotICAgIENYRkFfTm9kZSogcFN1YmZvcm0pIHsKLSAgaWYgKCFwU2NyaXB0Tm9kZSB8fCAhcFN1YmZvcm0pCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgQ0ZYSlNFX0NvbnRleHQqIHBWYXJpYWJsZXNDb250ZXh0ID0KLSAgICAgIENGWEpTRV9Db250ZXh0OjpDcmVhdGUobV9wSXNvbGF0ZSwgJlZhcmlhYmxlc0NsYXNzRGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENYRkFfVGhpc1Byb3h5KHBTdWJmb3JtLCBwU2NyaXB0Tm9kZSkpOwotICBSZW1vdmVCdWlsdEluT2JqcyhwVmFyaWFibGVzQ29udGV4dCk7Ci0gIHBWYXJpYWJsZXNDb250ZXh0LT5FbmFibGVDb21wYXRpYmxlTW9kZSgpOwotICBtX21hcFZhcmlhYmxlVG9Db250ZXh0W3BTY3JpcHROb2RlXSA9IHBWYXJpYWJsZXNDb250ZXh0OwotICByZXR1cm4gcFZhcmlhYmxlc0NvbnRleHQ7Ci19Ci1DWEZBX09iamVjdCogQ1hGQV9TY3JpcHRDb250ZXh0OjpHZXRWYXJpYWJsZXNUaGlzKENYRkFfT2JqZWN0KiBwT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTY3JpcHROb2RlKSB7Ci0gIGlmICghcE9iamVjdC0+SXNWYXJpYWJsZXNUaGlzKCkpCi0gICAgcmV0dXJuIHBPYmplY3Q7Ci0KLSAgQ1hGQV9UaGlzUHJveHkqIHBQcm94eSA9IHN0YXRpY19jYXN0PENYRkFfVGhpc1Byb3h5Kj4ocE9iamVjdCk7Ci0gIHJldHVybiBiU2NyaXB0Tm9kZSA/IHBQcm94eS0+R2V0U2NyaXB0Tm9kZSgpIDogcFByb3h5LT5HZXRUaGlzTm9kZSgpOwotfQotCi1ib29sIENYRkFfU2NyaXB0Q29udGV4dDo6UnVuVmFyaWFibGVzU2NyaXB0KENYRkFfTm9kZSogcFNjcmlwdE5vZGUpIHsKLSAgaWYgKCFwU2NyaXB0Tm9kZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHBTY3JpcHROb2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpTY3JpcHQpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQ1hGQV9Ob2RlKiBwUGFyZW50ID0gcFNjcmlwdE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOwotICBpZiAoIXBQYXJlbnQgfHwgcFBhcmVudC0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6VmFyaWFibGVzKQotICAgIHJldHVybiBmYWxzZTsKLQotICBhdXRvIGl0ID0gbV9tYXBWYXJpYWJsZVRvQ29udGV4dC5maW5kKHBTY3JpcHROb2RlKTsKLSAgaWYgKGl0ICE9IG1fbWFwVmFyaWFibGVUb0NvbnRleHQuZW5kKCkgJiYgaXQtPnNlY29uZCkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBDWEZBX05vZGUqIHBUZXh0Tm9kZSA9IHBTY3JpcHROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gIGlmICghcFRleHROb2RlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDRlhfV2lkZVN0cmluZ0Mgd3NTY3JpcHQ7Ci0gIGlmICghcFRleHROb2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c1NjcmlwdCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENGWF9CeXRlU3RyaW5nIGJ0U2NyaXB0ID0gRlhfVVRGOEVuY29kZSh3c1NjcmlwdCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGhSZXRWYWx1ZShuZXcgQ0ZYSlNFX1ZhbHVlKG1fcElzb2xhdGUpKTsKLSAgQ1hGQV9Ob2RlKiBwVGhpc09iamVjdCA9IHBQYXJlbnQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOwotICBDRlhKU0VfQ29udGV4dCogcFZhcmlhYmxlc0NvbnRleHQgPQotICAgICAgQ3JlYXRlVmFyaWFibGVzQ29udGV4dChwU2NyaXB0Tm9kZSwgcFRoaXNPYmplY3QpOwotICBDWEZBX09iamVjdCogcE9yaWdpbmFsT2JqZWN0ID0gbV9wVGhpc09iamVjdDsKLSAgbV9wVGhpc09iamVjdCA9IHBUaGlzT2JqZWN0OwotICBib29sIGJSZXQgPQotICAgICAgcFZhcmlhYmxlc0NvbnRleHQtPkV4ZWN1dGVTY3JpcHQoYnRTY3JpcHQuY19zdHIoKSwgaFJldFZhbHVlLmdldCgpKTsKLSAgbV9wVGhpc09iamVjdCA9IHBPcmlnaW5hbE9iamVjdDsKLSAgcmV0dXJuIGJSZXQ7Ci19Ci0KLWJvb2wgQ1hGQV9TY3JpcHRDb250ZXh0OjpRdWVyeVZhcmlhYmxlVmFsdWUoQ1hGQV9Ob2RlKiBwU2NyaXB0Tm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiR2V0dGVyKSB7Ci0gIGlmICghcFNjcmlwdE5vZGUgfHwgcFNjcmlwdE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlNjcmlwdCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ1hGQV9Ob2RlKiB2YXJpYWJsZXNOb2RlID0gcFNjcmlwdE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOwotICBpZiAoIXZhcmlhYmxlc05vZGUgfHwKLSAgICAgIHZhcmlhYmxlc05vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlZhcmlhYmxlcykKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgYXV0byBpdCA9IG1fbWFwVmFyaWFibGVUb0NvbnRleHQuZmluZChwU2NyaXB0Tm9kZSk7Ci0gIGlmIChpdCA9PSBtX21hcFZhcmlhYmxlVG9Db250ZXh0LmVuZCgpIHx8ICFpdC0+c2Vjb25kKQotICAgIHJldHVybiBmYWxzZTsKLQotICB2b2lkKiBscFZhcmlhYmxlcyA9IGl0LT5zZWNvbmQ7Ci0gIGJvb2wgYlJlcyA9IGZhbHNlOwotICBDRlhKU0VfQ29udGV4dCogcFZhcmlhYmxlQ29udGV4dCA9IHN0YXRpY19jYXN0PENGWEpTRV9Db250ZXh0Kj4obHBWYXJpYWJsZXMpOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBwT2JqZWN0ID0gcFZhcmlhYmxlQ29udGV4dC0+R2V0R2xvYmFsT2JqZWN0KCk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGhWYXJpYWJsZVZhbHVlKG5ldyBDRlhKU0VfVmFsdWUobV9wSXNvbGF0ZSkpOwotICBpZiAoIWJHZXR0ZXIpIHsKLSAgICBwT2JqZWN0LT5TZXRPYmplY3RPd25Qcm9wZXJ0eShzelByb3BOYW1lLCBwVmFsdWUpOwotICAgIGJSZXMgPSB0cnVlOwotICB9IGVsc2UgaWYgKHBPYmplY3QtPkhhc09iamVjdE93blByb3BlcnR5KHN6UHJvcE5hbWUsIGZhbHNlKSkgewotICAgIHBPYmplY3QtPkdldE9iamVjdFByb3BlcnR5KHN6UHJvcE5hbWUsIGhWYXJpYWJsZVZhbHVlLmdldCgpKTsKLSAgICBpZiAoaFZhcmlhYmxlVmFsdWUtPklzRnVuY3Rpb24oKSkKLSAgICAgIHBWYWx1ZS0+U2V0RnVuY3Rpb25CaW5kKGhWYXJpYWJsZVZhbHVlLmdldCgpLCBwT2JqZWN0LmdldCgpKTsKLSAgICBlbHNlIGlmIChiR2V0dGVyKQotICAgICAgcFZhbHVlLT5Bc3NpZ24oaFZhcmlhYmxlVmFsdWUuZ2V0KCkpOwotICAgIGVsc2UKLSAgICAgIGhWYXJpYWJsZVZhbHVlLmdldCgpLT5Bc3NpZ24ocFZhbHVlKTsKLSAgICBiUmVzID0gdHJ1ZTsKLSAgfQotICByZXR1cm4gYlJlczsKLX0KLQotdm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6OkRlZmluZUpzQ2xhc3MoKSB7Ci0gIG1fcEpzQ2xhc3MgPSBDRlhKU0VfQ2xhc3M6OkNyZWF0ZShtX0pzQ29udGV4dC5nZXQoKSwgJk5vcm1hbENsYXNzRGVzY3JpcHRvcik7Ci19Ci0KLXZvaWQgQ1hGQV9TY3JpcHRDb250ZXh0OjpSZW1vdmVCdWlsdEluT2JqcyhDRlhKU0VfQ29udGV4dCogcENvbnRleHQpIGNvbnN0IHsKLSAgc3RhdGljIGNvbnN0IENGWF9CeXRlU3RyaW5nQyBPQkpfTkFNRVsyXSA9IHsiTnVtYmVyIiwgIkRhdGUifTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gcE9iamVjdCA9IHBDb250ZXh0LT5HZXRHbG9iYWxPYmplY3QoKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWEpTRV9WYWx1ZT4gaFByb3AobmV3IENGWEpTRV9WYWx1ZShtX3BJc29sYXRlKSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7Ci0gICAgaWYgKHBPYmplY3QtPkdldE9iamVjdFByb3BlcnR5KE9CSl9OQU1FW2ldLCBoUHJvcC5nZXQoKSkpCi0gICAgICBwT2JqZWN0LT5EZWxldGVPYmplY3RQcm9wZXJ0eShPQkpfTkFNRVtpXSk7Ci0gIH0KLX0KLUNGWEpTRV9DbGFzcyogQ1hGQV9TY3JpcHRDb250ZXh0OjpHZXRKc2VOb3JtYWxDbGFzcygpIHsKLSAgcmV0dXJuIG1fcEpzQ2xhc3M7Ci19Ci1pbnQzMl90IENYRkFfU2NyaXB0Q29udGV4dDo6UmVzb2x2ZU9iamVjdHMoQ1hGQV9PYmplY3QqIHJlZk5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1JTJiByZXNvbHZlTm9kZVJTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3R5bGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogYmluZE5vZGUpIHsKLSAgaWYgKHdzRXhwcmVzc2lvbi5Jc0VtcHR5KCkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAobV9lU2NyaXB0VHlwZSAhPSBYRkFfU0NSSVBUTEFOR1RZUEVfRm9ybWNhbGMgfHwKLSAgICAgIChkd1N0eWxlcyAmIChYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzKSkpIHsKLSAgICBtX3VwT2JqZWN0QXJyYXkuUmVtb3ZlQWxsKCk7Ci0gIH0KLSAgaWYgKHJlZk5vZGUgJiYgcmVmTm9kZS0+SXNOb2RlKCkgJiYKLSAgICAgIChkd1N0eWxlcyAmIChYRkFfUkVTT0xWRU5PREVfUGFyZW50IHwgWEZBX1JFU09MVkVOT0RFX1NpYmxpbmdzKSkpIHsKLSAgICBtX3VwT2JqZWN0QXJyYXkuQWRkKHJlZk5vZGUtPkFzTm9kZSgpKTsKLSAgfQotICBib29sIGJOZXh0Q3JlYXRlID0gZmFsc2U7Ci0gIGlmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9DcmVhdGVOb2RlKSB7Ci0gICAgbV9SZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCktPlNldENyZWF0ZU5vZGVUeXBlKGJpbmROb2RlKTsKLSAgfQotICBtX1Jlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+bV9wQ3JlYXRlUGFyZW50ID0gbnVsbHB0cjsKLSAgbV9SZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCktPm1faUN1ckFsbFN0YXJ0ID0gLTE7Ci0gIENYRkFfUmVzb2x2ZU5vZGVzRGF0YSBybmRGaW5kOwotICBpbnQzMl90IG5TdGFydCA9IDA7Ci0gIGludDMyX3QgbkxldmVsID0gMDsKLSAgaW50MzJfdCBuUmV0ID0gLTE7Ci0gIHJuZEZpbmQubV9wU0MgPSB0aGlzOwotICBDWEZBX09iakFycmF5IGZpbmROb2RlczsKLSAgZmluZE5vZGVzLkFkZChyZWZOb2RlID8gcmVmTm9kZSA6IG1fcERvY3VtZW50LT5HZXRSb290KCkpOwotICBpbnQzMl90IG5Ob2RlcyA9IDA7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgbk5vZGVzID0gZmluZE5vZGVzLkdldFNpemUoKTsKLSAgICBpbnQzMl90IGkgPSAwOwotICAgIHJuZEZpbmQubV9kd1N0eWxlcyA9IGR3U3R5bGVzOwotICAgIG1fUmVzb2x2ZVByb2Nlc3Nvci0+U2V0Q3VyU3RhcnQoblN0YXJ0KTsKLSAgICBuU3RhcnQgPSBtX1Jlc29sdmVQcm9jZXNzb3ItPkdldEZpbHRlcih3c0V4cHJlc3Npb24sIG5TdGFydCwgcm5kRmluZCk7Ci0gICAgaWYgKG5TdGFydCA8IDEpIHsKLSAgICAgIGlmICgoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQ3JlYXRlTm9kZSkgJiYgIWJOZXh0Q3JlYXRlKSB7Ci0gICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gbnVsbHB0cjsKLSAgICAgICAgblN0YXJ0ID0gbV9SZXNvbHZlUHJvY2Vzc29yLT5HZXROb2RlSGVscGVyKCktPm1faUN1ckFsbFN0YXJ0OwotICAgICAgICBpZiAoblN0YXJ0ICE9IC0xKSB7Ci0gICAgICAgICAgcERhdGFOb2RlID0gbV9wRG9jdW1lbnQtPkdldE5vdEJpbmROb2RlKGZpbmROb2Rlcyk7Ci0gICAgICAgICAgaWYgKHBEYXRhTm9kZSkgewotICAgICAgICAgICAgZmluZE5vZGVzLlJlbW92ZUFsbCgpOwotICAgICAgICAgICAgZmluZE5vZGVzLkFkZChwRGF0YU5vZGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHBEYXRhTm9kZSA9IGZpbmROb2Rlc1swXS0+QXNOb2RlKCk7Ci0gICAgICAgICAgZmluZE5vZGVzLlJlbW92ZUFsbCgpOwotICAgICAgICAgIGZpbmROb2Rlcy5BZGQocERhdGFOb2RlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkd1N0eWxlcyB8PSBYRkFfUkVTT0xWRU5PREVfQmluZDsKLSAgICAgICAgZmluZE5vZGVzLlJlbW92ZUFsbCgpOwotICAgICAgICBmaW5kTm9kZXMuQWRkKG1fUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpLT5tX3BBbGxTdGFydFBhcmVudCk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChiTmV4dENyZWF0ZSkgewotICAgICAgYm9vbCBiQ3JlYXRlID0KLSAgICAgICAgICBtX1Jlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+UmVzb2x2ZU5vZGVzX0NyZWF0ZU5vZGUoCi0gICAgICAgICAgICAgIHJuZEZpbmQubV93c05hbWUsIHJuZEZpbmQubV93c0NvbmRpdGlvbiwKLSAgICAgICAgICAgICAgblN0YXJ0ID09IHdzRXhwcmVzc2lvbi5HZXRMZW5ndGgoKSwgdGhpcyk7Ci0gICAgICBpZiAoYkNyZWF0ZSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBDWEZBX09iakFycmF5IHJldE5vZGVzOwotICAgIHdoaWxlIChpIDwgbk5vZGVzKSB7Ci0gICAgICBib29sIGJEYXRhQmluZCA9IGZhbHNlOwotICAgICAgaWYgKCgoZHdTdHlsZXMgJiBYRkFfUkVTT0xWRU5PREVfQmluZCkgfHwKLSAgICAgICAgICAgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGUpKSAmJgotICAgICAgICAgIG5Ob2RlcyA+IDEpIHsKLSAgICAgICAgQ1hGQV9SZXNvbHZlTm9kZXNEYXRhIHJuZEJpbmQ7Ci0gICAgICAgIG1fUmVzb2x2ZVByb2Nlc3Nvci0+R2V0RmlsdGVyKHdzRXhwcmVzc2lvbiwgblN0YXJ0LCBybmRCaW5kKTsKLSAgICAgICAgbV9SZXNvbHZlUHJvY2Vzc29yLT5TZXRJbmRleERhdGFCaW5kKHJuZEJpbmQubV93c0NvbmRpdGlvbiwgaSwgbk5vZGVzKTsKLSAgICAgICAgYkRhdGFCaW5kID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJuZEZpbmQubV9DdXJOb2RlID0gZmluZE5vZGVzW2krK107Ci0gICAgICBybmRGaW5kLm1fbkxldmVsID0gbkxldmVsOwotICAgICAgcm5kRmluZC5tX2R3RmxhZyA9IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9Ob2RlczsKLSAgICAgIG5SZXQgPSBtX1Jlc29sdmVQcm9jZXNzb3ItPlJlc29sdmUocm5kRmluZCk7Ci0gICAgICBpZiAoblJldCA8IDEpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAocm5kRmluZC5tX2R3RmxhZyA9PSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfQXR0cmlidXRlICYmCi0gICAgICAgICAgcm5kRmluZC5tX3BTY3JpcHRBdHRyaWJ1dGUgJiYgblN0YXJ0IDwgd3NFeHByZXNzaW9uLkdldExlbmd0aCgpKSB7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IHBWYWx1ZShuZXcgQ0ZYSlNFX1ZhbHVlKG1fcElzb2xhdGUpKTsKLSAgICAgICAgKHJuZEZpbmQubV9Ob2Rlc1swXS0+KihybmRGaW5kLm1fcFNjcmlwdEF0dHJpYnV0ZS0+bHBmbkNhbGxiYWNrKSkoCi0gICAgICAgICAgICBwVmFsdWUuZ2V0KCksIGZhbHNlLAotICAgICAgICAgICAgKFhGQV9BVFRSSUJVVEUpcm5kRmluZC5tX3BTY3JpcHRBdHRyaWJ1dGUtPmVBdHRyaWJ1dGUpOwotICAgICAgICBybmRGaW5kLm1fTm9kZXMuU2V0QXQoMCwgVG9PYmplY3QocFZhbHVlLmdldCgpLCBudWxscHRyKSk7Ci0gICAgICB9Ci0gICAgICBpbnQzMl90IGlTaXplID0gbV91cE9iamVjdEFycmF5LkdldFNpemUoKTsKLSAgICAgIGlmIChpU2l6ZSkgewotICAgICAgICBtX3VwT2JqZWN0QXJyYXkuUmVtb3ZlQXQoaVNpemUgLSAxKTsKLSAgICAgIH0KLSAgICAgIHJldE5vZGVzLkFwcGVuZChybmRGaW5kLm1fTm9kZXMpOwotICAgICAgcm5kRmluZC5tX05vZGVzLlJlbW92ZUFsbCgpOwotICAgICAgaWYgKGJEYXRhQmluZCkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgZmluZE5vZGVzLlJlbW92ZUFsbCgpOwotICAgIG5Ob2RlcyA9IHJldE5vZGVzLkdldFNpemUoKTsKLSAgICBpZiAobk5vZGVzIDwgMSkgewotICAgICAgaWYgKGR3U3R5bGVzICYgWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGUpIHsKLSAgICAgICAgYk5leHRDcmVhdGUgPSB0cnVlOwotICAgICAgICBpZiAoIW1fUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpLT5tX3BDcmVhdGVQYXJlbnQpIHsKLSAgICAgICAgICBtX1Jlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+bV9wQ3JlYXRlUGFyZW50ID0KLSAgICAgICAgICAgICAgVG9Ob2RlKHJuZEZpbmQubV9DdXJOb2RlKTsKLSAgICAgICAgICBtX1Jlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+bV9pQ3JlYXRlQ291bnQgPSAxOwotICAgICAgICB9Ci0gICAgICAgIGJvb2wgYkNyZWF0ZSA9Ci0gICAgICAgICAgICBtX1Jlc29sdmVQcm9jZXNzb3ItPkdldE5vZGVIZWxwZXIoKS0+UmVzb2x2ZU5vZGVzX0NyZWF0ZU5vZGUoCi0gICAgICAgICAgICAgICAgcm5kRmluZC5tX3dzTmFtZSwgcm5kRmluZC5tX3dzQ29uZGl0aW9uLAotICAgICAgICAgICAgICAgIG5TdGFydCA9PSB3c0V4cHJlc3Npb24uR2V0TGVuZ3RoKCksIHRoaXMpOwotICAgICAgICBpZiAoYkNyZWF0ZSkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgZmluZE5vZGVzLkNvcHkocmV0Tm9kZXMpOwotICAgIHJuZEZpbmQubV9Ob2Rlcy5SZW1vdmVBbGwoKTsKLSAgICBpZiAobkxldmVsID09IDApIHsKLSAgICAgIGR3U3R5bGVzICY9IH4oWEZBX1JFU09MVkVOT0RFX1BhcmVudCB8IFhGQV9SRVNPTFZFTk9ERV9TaWJsaW5ncyk7Ci0gICAgfQotICAgIG5MZXZlbCsrOwotICB9Ci0gIGlmICghYk5leHRDcmVhdGUpIHsKLSAgICByZXNvbHZlTm9kZVJTLmR3RmxhZ3MgPSBybmRGaW5kLm1fZHdGbGFnOwotICAgIGlmIChuTm9kZXMgPiAwKSB7Ci0gICAgICByZXNvbHZlTm9kZVJTLm5vZGVzLkFwcGVuZChmaW5kTm9kZXMpOwotICAgIH0KLSAgICBpZiAocm5kRmluZC5tX2R3RmxhZyA9PSBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfQXR0cmlidXRlKSB7Ci0gICAgICByZXNvbHZlTm9kZVJTLnBTY3JpcHRBdHRyaWJ1dGUgPSBybmRGaW5kLm1fcFNjcmlwdEF0dHJpYnV0ZTsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotICBpZiAoZHdTdHlsZXMgJiAoWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGUgfCBYRkFfUkVTT0xWRU5PREVfQmluZCB8Ci0gICAgICAgICAgICAgICAgICBYRkFfUkVTT0xWRU5PREVfQmluZE5ldykpIHsKLSAgICBtX1Jlc29sdmVQcm9jZXNzb3ItPlNldFJlc3VsdENyZWF0ZU5vZGUocmVzb2x2ZU5vZGVSUywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm5kRmluZC5tX3dzQ29uZGl0aW9uKTsKLSAgICBpZiAoIWJOZXh0Q3JlYXRlICYmIChkd1N0eWxlcyAmIFhGQV9SRVNPTFZFTk9ERV9DcmVhdGVOb2RlKSkgewotICAgICAgcmVzb2x2ZU5vZGVSUy5kd0ZsYWdzID0gWEZBX1JFU09WRU5PREVfUlNUWVBFX0V4aXN0Tm9kZXM7Ci0gICAgfQotICAgIHJldHVybiByZXNvbHZlTm9kZVJTLm5vZGVzLkdldFNpemUoKTsKLSAgfQotICByZXR1cm4gbk5vZGVzOwotfQotCi12b2lkIENYRkFfU2NyaXB0Q29udGV4dDo6QWRkVG9DYWNoZUxpc3Qoc3RkOjp1bmlxdWVfcHRyPENYRkFfTm9kZUxpc3Q+IHBMaXN0KSB7Ci0gIG1fQ2FjaGVMaXN0LnB1c2hfYmFjayhzdGQ6Om1vdmUocExpc3QpKTsKLX0KLQotQ0ZYSlNFX1ZhbHVlKiBDWEZBX1NjcmlwdENvbnRleHQ6OkdldEpTVmFsdWVGcm9tTWFwKENYRkFfT2JqZWN0KiBwT2JqZWN0KSB7Ci0gIGlmICghcE9iamVjdCkKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgaWYgKHBPYmplY3QtPklzTm9kZSgpKQotICAgIFJ1blZhcmlhYmxlc1NjcmlwdChwT2JqZWN0LT5Bc05vZGUoKSk7Ci0KLSAgYXV0byBpdGVyID0gbV9tYXBPYmplY3RUb1ZhbHVlLmZpbmQocE9iamVjdCk7Ci0gIGlmIChpdGVyICE9IG1fbWFwT2JqZWN0VG9WYWx1ZS5lbmQoKSkKLSAgICByZXR1cm4gaXRlci0+c2Vjb25kLmdldCgpOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhKU0VfVmFsdWU+IGpzVmFsdWUobmV3IENGWEpTRV9WYWx1ZShtX3BJc29sYXRlKSk7Ci0gIGpzVmFsdWUtPlNldE9iamVjdChwT2JqZWN0LCBtX3BKc0NsYXNzKTsKLSAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUgPSBqc1ZhbHVlLmdldCgpOwotICBtX21hcE9iamVjdFRvVmFsdWUuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHBPYmplY3QsIHN0ZDo6bW92ZShqc1ZhbHVlKSkpOwotICByZXR1cm4gcFZhbHVlOwotfQotaW50MzJfdCBDWEZBX1NjcmlwdENvbnRleHQ6OkdldEluZGV4QnlOYW1lKENYRkFfTm9kZSogcmVmTm9kZSkgewotICBDWEZBX05vZGVIZWxwZXIqIGxwTm9kZUhlbHBlciA9IG1fUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpOwotICByZXR1cm4gbHBOb2RlSGVscGVyLT5HZXRJbmRleChyZWZOb2RlLCBYRkFfTE9HSUNfVHJhbnNwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwTm9kZUhlbHBlci0+Tm9kZUlzUHJvcGVydHkocmVmTm9kZSksIGZhbHNlKTsKLX0KLWludDMyX3QgQ1hGQV9TY3JpcHRDb250ZXh0OjpHZXRJbmRleEJ5Q2xhc3NOYW1lKENYRkFfTm9kZSogcmVmTm9kZSkgewotICBDWEZBX05vZGVIZWxwZXIqIGxwTm9kZUhlbHBlciA9IG1fUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpOwotICByZXR1cm4gbHBOb2RlSGVscGVyLT5HZXRJbmRleChyZWZOb2RlLCBYRkFfTE9HSUNfVHJhbnNwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwTm9kZUhlbHBlci0+Tm9kZUlzUHJvcGVydHkocmVmTm9kZSksIHRydWUpOwotfQotdm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6OkdldFNvbUV4cHJlc3Npb24oQ1hGQV9Ob2RlKiByZWZOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRXhwcmVzc2lvbikgewotICBDWEZBX05vZGVIZWxwZXIqIGxwTm9kZUhlbHBlciA9IG1fUmVzb2x2ZVByb2Nlc3Nvci0+R2V0Tm9kZUhlbHBlcigpOwotICBscE5vZGVIZWxwZXItPkdldE5hbWVFeHByZXNzaW9uKHJlZk5vZGUsIHdzRXhwcmVzc2lvbiwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTE9HSUNfVHJhbnNwYXJlbnQpOwotfQotdm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6OlNldE5vZGVzT2ZSdW5TY3JpcHQoQ1hGQV9Ob2RlQXJyYXkqIHBBcnJheSkgewotICBtX3BTY3JpcHROb2RlQXJyYXkgPSBwQXJyYXk7Ci19Ci12b2lkIENYRkFfU2NyaXB0Q29udGV4dDo6QWRkTm9kZXNPZlJ1blNjcmlwdChjb25zdCBDWEZBX05vZGVBcnJheSYgbm9kZXMpIHsKLSAgaWYgKCFtX3BTY3JpcHROb2RlQXJyYXkpCi0gICAgcmV0dXJuOwotICBpZiAobm9kZXMuR2V0U2l6ZSgpID4gMCkKLSAgICBtX3BTY3JpcHROb2RlQXJyYXktPkNvcHkobm9kZXMpOwotfQotdm9pZCBDWEZBX1NjcmlwdENvbnRleHQ6OkFkZE5vZGVzT2ZSdW5TY3JpcHQoQ1hGQV9Ob2RlKiBwTm9kZSkgewotICBpZiAoIW1fcFNjcmlwdE5vZGVBcnJheSkKLSAgICByZXR1cm47Ci0gIGlmIChtX3BTY3JpcHROb2RlQXJyYXktPkZpbmQocE5vZGUpID09IC0xKQotICAgIG1fcFNjcmlwdE5vZGVBcnJheS0+QWRkKHBOb2RlKTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NjcmlwdGNvbnRleHQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NjcmlwdGNvbnRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ0ZjczYS4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zY3JpcHRjb250ZXh0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NDUklQVENPTlRFWFRfSF8KLSNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU0NSSVBUQ09OVEVYVF9IXwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJmeGpzL2NmeGpzZV9hcmd1bWVudHMuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9mbTJqcy94ZmFfZm0yanNjb250ZXh0LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX3Jlc29sdmVub2RlX3JzLmgiCi0KLSNkZWZpbmUgWEZBX1JFU09MVkVOT0RFX1RhZ05hbWUgMHgwMDAyCi0KLWNsYXNzIENYRkFfUmVzb2x2ZVByb2Nlc3NvcjsKLQotY2xhc3MgQ1hGQV9TY3JpcHRDb250ZXh0IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfU2NyaXB0Q29udGV4dChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotICB+Q1hGQV9TY3JpcHRDb250ZXh0KCk7Ci0KLSAgdm9pZCBJbml0aWFsaXplKHY4OjpJc29sYXRlKiBwSXNvbGF0ZSk7Ci0gIHZvaWQgU2V0RXZlbnRQYXJhbShDWEZBX0V2ZW50UGFyYW0gcGFyYW0pIHsgbV9ldmVudFBhcmFtID0gcGFyYW07IH0KLSAgQ1hGQV9FdmVudFBhcmFtKiBHZXRFdmVudFBhcmFtKCkgeyByZXR1cm4gJm1fZXZlbnRQYXJhbTsgfQotICBib29sIFJ1blNjcmlwdChYRkFfU0NSSVBUTEFOR1RZUEUgZVNjcmlwdFR5cGUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NTY3JpcHQsCi0gICAgICAgICAgICAgICAgIENGWEpTRV9WYWx1ZSogcFJldFZhbHVlLAotICAgICAgICAgICAgICAgICBDWEZBX09iamVjdCogcFRoaXNPYmplY3QgPSBudWxscHRyKTsKLQotICBpbnQzMl90IFJlc29sdmVPYmplY3RzKENYRkFfT2JqZWN0KiByZWZOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NFeHByZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9SRVNPTFZFTk9ERV9SUyYgcmVzb2x2ZU5vZGVSUywKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0eWxlcyA9IFhGQV9SRVNPTFZFTk9ERV9DaGlsZHJlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIGJpbmROb2RlID0gbnVsbHB0cik7Ci0gIENGWEpTRV9WYWx1ZSogR2V0SlNWYWx1ZUZyb21NYXAoQ1hGQV9PYmplY3QqIHBPYmplY3QpOwotICB2b2lkIEFkZFRvQ2FjaGVMaXN0KHN0ZDo6dW5pcXVlX3B0cjxDWEZBX05vZGVMaXN0PiBwTGlzdCk7Ci0gIENYRkFfT2JqZWN0KiBHZXRUaGlzT2JqZWN0KCkgY29uc3QgeyByZXR1cm4gbV9wVGhpc09iamVjdDsgfQotICB2ODo6SXNvbGF0ZSogR2V0UnVudGltZSgpIGNvbnN0IHsgcmV0dXJuIG1fcElzb2xhdGU7IH0KLQotICBpbnQzMl90IEdldEluZGV4QnlOYW1lKENYRkFfTm9kZSogcmVmTm9kZSk7Ci0gIGludDMyX3QgR2V0SW5kZXhCeUNsYXNzTmFtZShDWEZBX05vZGUqIHJlZk5vZGUpOwotICB2b2lkIEdldFNvbUV4cHJlc3Npb24oQ1hGQV9Ob2RlKiByZWZOb2RlLCBDRlhfV2lkZVN0cmluZyYgd3NFeHByZXNzaW9uKTsKLQotICB2b2lkIFNldE5vZGVzT2ZSdW5TY3JpcHQoQ1hGQV9Ob2RlQXJyYXkqIHBBcnJheSk7Ci0gIHZvaWQgQWRkTm9kZXNPZlJ1blNjcmlwdChjb25zdCBDWEZBX05vZGVBcnJheSYgbm9kZXMpOwotICB2b2lkIEFkZE5vZGVzT2ZSdW5TY3JpcHQoQ1hGQV9Ob2RlKiBwTm9kZSk7Ci0gIENGWEpTRV9DbGFzcyogR2V0SnNlTm9ybWFsQ2xhc3MoKTsKLQotICB2b2lkIFNldFJ1bkF0VHlwZShYRkFfQVRUUklCVVRFRU5VTSBlUnVuQXQpIHsgbV9lUnVuQXRUeXBlID0gZVJ1bkF0OyB9Ci0gIGJvb2wgSXNSdW5BdENsaWVudCgpIHsgcmV0dXJuIG1fZVJ1bkF0VHlwZSAhPSBYRkFfQVRUUklCVVRFRU5VTV9TZXJ2ZXI7IH0KLSAgYm9vbCBRdWVyeU5vZGVCeUZsYWcoQ1hGQV9Ob2RlKiByZWZOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHByb3BuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nKTsKLSAgYm9vbCBRdWVyeVZhcmlhYmxlVmFsdWUoQ1hGQV9Ob2RlKiBwU2NyaXB0Tm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiR2V0dGVyKTsKLSAgYm9vbCBRdWVyeUJ1aWx0aW5WYWx1ZShjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN6UHJvcE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpOwotICBzdGF0aWMgdm9pZCBHbG9iYWxQcm9wZXJ0eUdldHRlcihDRlhKU0VfVmFsdWUqIHBPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpOwotICBzdGF0aWMgdm9pZCBHbG9iYWxQcm9wZXJ0eVNldHRlcihDRlhKU0VfVmFsdWUqIHBPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpOwotICBzdGF0aWMgdm9pZCBOb3JtYWxQcm9wZXJ0eUdldHRlcihDRlhKU0VfVmFsdWUqIHBPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpOwotICBzdGF0aWMgdm9pZCBOb3JtYWxQcm9wZXJ0eVNldHRlcihDRlhKU0VfVmFsdWUqIHBPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUpOwotICBzdGF0aWMgdm9pZCBOb3JtYWxNZXRob2RDYWxsKENGWEpTRV9WYWx1ZSogaFRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzekZ1bmNOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWEpTRV9Bcmd1bWVudHMmIGFyZ3MpOwotICBzdGF0aWMgaW50MzJfdCBOb3JtYWxQcm9wVHlwZUdldHRlcihDRlhKU0VfVmFsdWUqIHBPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgc3pQcm9wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUXVlcnlJbik7Ci0gIHN0YXRpYyBpbnQzMl90IEdsb2JhbFByb3BUeXBlR2V0dGVyKENGWEpTRV9WYWx1ZSogcE9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelByb3BOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJRdWVyeUluKTsKLSAgYm9vbCBSdW5WYXJpYWJsZXNTY3JpcHQoQ1hGQV9Ob2RlKiBwU2NyaXB0Tm9kZSk7Ci0gIENYRkFfT2JqZWN0KiBHZXRWYXJpYWJsZXNUaGlzKENYRkFfT2JqZWN0KiBwT2JqZWN0LCBib29sIGJTY3JpcHROb2RlID0gZmFsc2UpOwotICBib29sIElzU3RyaWN0U2NvcGVJbkphdmFTY3JpcHQoKTsKLSAgWEZBX1NDUklQVExBTkdUWVBFIEdldFR5cGUoKTsKLSAgQ1hGQV9Ob2RlQXJyYXkmIEdldFVwT2JqZWN0QXJyYXkoKSB7IHJldHVybiBtX3VwT2JqZWN0QXJyYXk7IH0KLSAgQ1hGQV9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BEb2N1bWVudDsgfQotCi0gIHN0YXRpYyBDWEZBX09iamVjdCogVG9PYmplY3QoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsIENGWEpTRV9DbGFzcyogcENsYXNzKTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgRGVmaW5lSnNDb250ZXh0KCk7Ci0gIENGWEpTRV9Db250ZXh0KiBDcmVhdGVWYXJpYWJsZXNDb250ZXh0KENYRkFfTm9kZSogcFNjcmlwdE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFN1YmZvcm0pOwotICB2b2lkIERlZmluZUpzQ2xhc3MoKTsKLSAgdm9pZCBSZW1vdmVCdWlsdEluT2JqcyhDRlhKU0VfQ29udGV4dCogcENvbnRleHQpIGNvbnN0OwotCi0gIENYRkFfRG9jdW1lbnQqIG1fcERvY3VtZW50OwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX0NvbnRleHQ+IG1fSnNDb250ZXh0OwotICB2ODo6SXNvbGF0ZSogbV9wSXNvbGF0ZTsKLSAgQ0ZYSlNFX0NsYXNzKiBtX3BKc0NsYXNzOwotICBYRkFfU0NSSVBUTEFOR1RZUEUgbV9lU2NyaXB0VHlwZTsKLSAgc3RkOjptYXA8Q1hGQV9PYmplY3QqLCBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPj4gbV9tYXBPYmplY3RUb1ZhbHVlOwotICBzdGQ6Om1hcDxDWEZBX09iamVjdCosIENGWEpTRV9Db250ZXh0Kj4gbV9tYXBWYXJpYWJsZVRvQ29udGV4dDsKLSAgQ1hGQV9FdmVudFBhcmFtIG1fZXZlbnRQYXJhbTsKLSAgQ1hGQV9Ob2RlQXJyYXkgbV91cE9iamVjdEFycmF5OwotICAvLyBDYWNoZUxpc3QgaG9sZHMgdGhlIE5vZGVMaXN0IGl0ZW1zIHNvIHdlIGNhbiBjbGVhbiB0aGVtIHVwIHdoZW4gd2UncmUgZG9uZS4KLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENYRkFfTm9kZUxpc3Q+PiBtX0NhY2hlTGlzdDsKLSAgQ1hGQV9Ob2RlQXJyYXkqIG1fcFNjcmlwdE5vZGVBcnJheTsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfUmVzb2x2ZVByb2Nlc3Nvcj4gbV9SZXNvbHZlUHJvY2Vzc29yOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GTTJKU0NvbnRleHQ+IG1fRk0ySlNDb250ZXh0OwotICBDWEZBX09iamVjdCogbV9wVGhpc09iamVjdDsKLSAgdWludDMyX3QgbV9kd0J1aWx0SW5JbkZsYWdzOwotICBYRkFfQVRUUklCVVRFRU5VTSBtX2VSdW5BdFR5cGU7Ci19OwotCi0jZW5kaWYgIC8vICBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TQ1JJUFRDT05URVhUX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zY3JpcHRtb2RlbC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zY3JpcHRtb2RlbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY4ZGFjNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NjcmlwdG1vZGVsLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zY3JpcHRtb2RlbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwic2NyaXB0TW9kZWwiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9TY3JpcHRNb2RlbDo6Q1hGQV9TY3JpcHRNb2RlbChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6U2NyaXB0TW9kZWwsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9TY3JpcHRNb2RlbDo6fkNYRkFfU2NyaXB0TW9kZWwoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2NyaXB0bW9kZWwuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NjcmlwdG1vZGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBiYzk2ZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NjcmlwdG1vZGVsLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NDUklQVE1PREVMX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NDUklQVE1PREVMX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfU2NyaXB0TW9kZWwgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfU2NyaXB0TW9kZWwoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9TY3JpcHRNb2RlbCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TQ1JJUFRNT0RFTF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2VsZWN0LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NlbGVjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJlY2EwNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NlbGVjdC5jcHAKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2VsZWN0LmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc2VsZWN0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwic2VsZWN0IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfU2VsZWN0OjpDWEZBX1NlbGVjdChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpUZXh0Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6U2VsZWN0LAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9TZWxlY3Q+KHRoaXMpKSB7fQorCitDWEZBX1NlbGVjdDo6fkNYRkFfU2VsZWN0KCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NlbGVjdC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2VsZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2NTFlMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NlbGVjdC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TRUxFQ1RfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU0VMRUNUX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfU2VsZWN0IDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1NlbGVjdChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1NlbGVjdCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TRUxFQ1RfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NldHByb3BlcnR5LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NldHByb3BlcnR5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWQ2MzFiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2V0cHJvcGVydHkuY3BwCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NldHByb3BlcnR5LmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc2V0cHJvcGVydHkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpSZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkNvbm5lY3Rpb24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlRhcmdldCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwic2V0UHJvcGVydHkiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9TZXRQcm9wZXJ0eTo6Q1hGQV9TZXRQcm9wZXJ0eShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6U2V0UHJvcGVydHksCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX1NldFByb3BlcnR5Pih0aGlzKSkge30KKworQ1hGQV9TZXRQcm9wZXJ0eTo6fkNYRkFfU2V0UHJvcGVydHkoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2V0cHJvcGVydHkuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NldHByb3BlcnR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4ZjQzMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NldHByb3BlcnR5LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NFVFBST1BFUlRZX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NFVFBST1BFUlRZX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfU2V0UHJvcGVydHkgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfU2V0UHJvcGVydHkoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9TZXRQcm9wZXJ0eSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TRVRQUk9QRVJUWV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2V2ZXJpdHkuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2V2ZXJpdHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYTkxZTgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zZXZlcml0eS5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2V2ZXJpdHkuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInNldmVyaXR5IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfU2V2ZXJpdHk6OkNYRkFfU2V2ZXJpdHkoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVYsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlNldmVyaXR5LAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfU2V2ZXJpdHk6On5DWEZBX1NldmVyaXR5KCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NldmVyaXR5LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zZXZlcml0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMTQ0NTUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zZXZlcml0eS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TRVZFUklUWV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TRVZFUklUWV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1NldmVyaXR5IDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1NldmVyaXR5KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfU2V2ZXJpdHkoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU0VWRVJJVFlfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NoYXJwdGV4dC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaGFycHRleHQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMDBkZmMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaGFycHRleHQuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NoYXJwdGV4dC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VmFsdWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMIiN0ZXh0IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfU2hhcnB0ZXh0OjpDWEZBX1NoYXJwdGV4dChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfAorICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCB8IFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCB8CisgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVYsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlNoYXJwdGV4dCwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX1NoYXJwdGV4dDo6fkNYRkFfU2hhcnB0ZXh0KCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NoYXJwdGV4dC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2hhcnB0ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhMDUwYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NoYXJwdGV4dC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TSEFSUFRFWFRfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU0hBUlBURVhUX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfU2hhcnB0ZXh0IDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1NoYXJwdGV4dChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1NoYXJwdGV4dCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TSEFSUFRFWFRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NoYXJweGh0bWwuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2hhcnB4aHRtbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4MjliNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NoYXJweGh0bWwuY3BwCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NoYXJweGh0bWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OlZhbHVlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCIjeEhUTUwiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9TaGFycHhIVE1MOjpDWEZBX1NoYXJweEhUTUwoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwKKyAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQgfCBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQgfAorICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpTaGFycHhIVE1MLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfU2hhcnB4SFRNTDo6fkNYRkFfU2hhcnB4SFRNTCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaGFycHhodG1sLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaGFycHhodG1sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2Y2Y3OQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NoYXJweGh0bWwuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU0hBUlBYSFRNTF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TSEFSUFhIVE1MX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfU2hhcnB4SFRNTCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9TaGFycHhIVE1MKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfU2hhcnB4SFRNTCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TSEFSUFhIVE1MX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaGFycHhtbC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaGFycHhtbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNlMjIwZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NoYXJweG1sLmNwcApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaGFycHhtbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VmFsdWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMIiN4bWwiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9TaGFycHhtbDo6Q1hGQV9TaGFycHhtbChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVYsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlNoYXJweG1sLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfU2hhcnB4bWw6On5DWEZBX1NoYXJweG1sKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NoYXJweG1sLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaGFycHhtbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNjU4NTcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaGFycHhtbC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TSEFSUFhNTF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TSEFSUFhNTF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1NoYXJweG1sIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1NoYXJweG1sKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfU2hhcnB4bWwoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU0hBUlBYTUxfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NpZ25hdHVyZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaWduYXR1cmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZWUwNDQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaWduYXR1cmUuY3BwCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NpZ25hdHVyZS5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3NpZ25hdHVyZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0geworICAgIHtYRkFfRWxlbWVudDo6TWFyZ2luLCAxLCAwfSwge1hGQV9FbGVtZW50OjpGaWx0ZXIsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6Qm9yZGVyLCAxLCAwfSwge1hGQV9FbGVtZW50OjpNYW5pZmVzdCwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpFeHRyYXMsIDEsIDB9LCB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpUeXBlLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpQREYxXzN9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJzaWduYXR1cmUiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9TaWduYXR1cmU6OkNYRkFfU2lnbmF0dXJlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpTaWduYXR1cmUsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX1NpZ25hdHVyZT4odGhpcykpIHt9CisKK0NYRkFfU2lnbmF0dXJlOjp+Q1hGQV9TaWduYXR1cmUoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2lnbmF0dXJlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaWduYXR1cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTVjZTVhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2lnbmF0dXJlLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NJR05BVFVSRV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TSUdOQVRVUkVfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9TaWduYXR1cmUgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfU2lnbmF0dXJlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfU2lnbmF0dXJlKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NJR05BVFVSRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2lnbmF0dXJlcHJvcGVydGllcy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaWduYXR1cmVwcm9wZXJ0aWVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzEwY2I0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2lnbmF0dXJlcHJvcGVydGllcy5jcHAKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2lnbmF0dXJlcHJvcGVydGllcy5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3NpZ25hdHVyZXByb3BlcnRpZXMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInNpZ25hdHVyZVByb3BlcnRpZXMiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9TaWduYXR1cmVQcm9wZXJ0aWVzOjpDWEZBX1NpZ25hdHVyZVByb3BlcnRpZXMoQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpTaWduYXR1cmVQcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9TaWduYXR1cmVQcm9wZXJ0aWVzPih0aGlzKSkge30KKworQ1hGQV9TaWduYXR1cmVQcm9wZXJ0aWVzOjp+Q1hGQV9TaWduYXR1cmVQcm9wZXJ0aWVzKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NpZ25hdHVyZXByb3BlcnRpZXMuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NpZ25hdHVyZXByb3BlcnRpZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDBiNzgwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2lnbmF0dXJlcHJvcGVydGllcy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TSUdOQVRVUkVQUk9QRVJUSUVTX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NJR05BVFVSRVBST1BFUlRJRVNfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9TaWduYXR1cmVQcm9wZXJ0aWVzIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1NpZ25hdHVyZVByb3BlcnRpZXMoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9TaWduYXR1cmVQcm9wZXJ0aWVzKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NJR05BVFVSRVBST1BFUlRJRVNfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NpZ25kYXRhLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NpZ25kYXRhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTZhZTVjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2lnbmRhdGEuY3BwCkBAIC0wLDAgKzEsNDIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NpZ25kYXRhLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc2lnbmRhdGEuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6OkZpbHRlciwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpNYW5pZmVzdCwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpPcGVyYXRpb24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OlNpZ259LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpUYXJnZXQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInNpZ25EYXRhIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfU2lnbkRhdGE6OkNYRkFfU2lnbkRhdGEoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlNpZ25EYXRhLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9TaWduRGF0YT4odGhpcykpIHt9CisKK0NYRkFfU2lnbkRhdGE6On5DWEZBX1NpZ25EYXRhKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NpZ25kYXRhLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaWduZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZDM5ZjUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaWduZGF0YS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TSUdOREFUQV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TSUdOREFUQV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1NpZ25EYXRhIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1NpZ25EYXRhKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfU2lnbkRhdGEoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU0lHTkRBVEFfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NpZ25pbmcuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2lnbmluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUxZTI5NAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NpZ25pbmcuY3BwCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NpZ25pbmcuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zaWduaW5nLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VHlwZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6T3B0aW9uYWx9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJzaWduaW5nIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfU2lnbmluZzo6Q1hGQV9TaWduaW5nKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpTaWduaW5nLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9TaWduaW5nPih0aGlzKSkge30KKworQ1hGQV9TaWduaW5nOjp+Q1hGQV9TaWduaW5nKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NpZ25pbmcuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NpZ25pbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGY5YTE4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2lnbmluZy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TSUdOSU5HX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NJR05JTkdfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9TaWduaW5nIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1NpZ25pbmcoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9TaWduaW5nKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NJR05JTkdfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NpbGVudHByaW50LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NpbGVudHByaW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTBjZjlmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2lsZW50cHJpbnQuY3BwCkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NpbGVudHByaW50LmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHsKKyAgICB7WEZBX0VsZW1lbnQ6OkFkZFNpbGVudFByaW50LCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlByaW50ZXJOYW1lLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJzaWxlbnRQcmludCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1NpbGVudFByaW50OjpDWEZBX1NpbGVudFByaW50KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlNpbGVudFByaW50LAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfU2lsZW50UHJpbnQ6On5DWEZBX1NpbGVudFByaW50KCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NpbGVudHByaW50LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaWxlbnRwcmludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZjVmY2YKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaWxlbnRwcmludC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TSUxFTlRQUklOVF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TSUxFTlRQUklOVF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1NpbGVudFByaW50IDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1NpbGVudFByaW50KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfU2lsZW50UHJpbnQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU0lMRU5UUFJJTlRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NpbXBsZV9wYXJzZXIuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2ltcGxlX3BhcnNlci5jcHAKaW5kZXggNGE2OTU2ZC4uMTg2NDUzMiAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2ltcGxlX3BhcnNlci5jcHAKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2ltcGxlX3BhcnNlci5jcHAKQEAgLTcsMzkgKzcsMTE5IEBACiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2ltcGxlX3BhcnNlci5oIgogCiAjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X2NoZWNrc3VtY29udGV4dC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3NlZWthYmxlc3RyZWFtcHJveHkuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF93aWRldGV4dGJ1Zi5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29kZXBhZ2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWxjaGFyZGF0YS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWxkb2MuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sZWxlbWVudC5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWxpbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWxub2RlLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbHBhcnNlci5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWx0ZXh0LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X29iamVjdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJ4ZmEvZmdhcy9jcnQvZmdhc19jb2RlcGFnZS5oIgogI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmEuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3dpZGV0ZXh0cmVhZC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3htbF9wYXJzZXIuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3ViZm9ybS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RlbXBsYXRlLmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9iYXNpY19kYXRhLmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV91dGlscy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3hmYV9jaGVja3N1bS5oIgogCiBuYW1lc3BhY2UgewogCi1DRkRFX1hNTE5vZGUqIEdldERvY3VtZW50Tm9kZShDRkRFX1hNTERvYyogcFhNTERvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlZlcmlmeVdlbGxGb3JtbmVzcyA9IGZhbHNlKSB7CitzdHJ1Y3QgUGFja2V0SW5mbyB7CisgIHVpbnQzMl90IGhhc2g7CisgIGNvbnN0IHdjaGFyX3QqIG5hbWU7CisgIFhGQV9QYWNrZXRUeXBlIHBhY2tldF90eXBlOworICBjb25zdCB3Y2hhcl90KiB1cmk7CisgIHVpbnQzMl90IGZsYWdzOworfTsKK2NvbnN0IFBhY2tldEluZm8gUGFja2V0RGF0YVtdID0geworICAgIHsweDAsIG51bGxwdHIsIFhGQV9QYWNrZXRUeXBlOjpVc2VyLCBudWxscHRyLAorICAgICBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRNQU5ZfSwKKyAgICB7MHg4MTE5MjlkLCBMInNvdXJjZVNldCIsIFhGQV9QYWNrZXRUeXBlOjpTb3VyY2VTZXQsCisgICAgIEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtc291cmNlLXNldC8iLAorICAgICBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRPTkV9LAorICAgIHsweGI4NDNkYmEsIEwicGRmIiwgWEZBX1BhY2tldFR5cGU6OlBkZiwgTCJodHRwOi8vbnMuYWRvYmUuY29tL3hkcC9wZGYvIiwKKyAgICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19DT01QTEVURU1BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwKKyAgICB7MHhjNTZhZmJmLCBMInhkYyIsIFhGQV9QYWNrZXRUeXBlOjpYZGMsIEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZGMvIiwKKyAgICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwKKyAgICB7MHhjNTZhZmNjLCBMInhkcCIsIFhGQV9QYWNrZXRUeXBlOjpYZHAsIEwiaHR0cDovL25zLmFkb2JlLmNvbS94ZHAvIiwKKyAgICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19DT01QTEVURU1BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwKKyAgICB7MHgxMzJhOGZiYywgTCJ4bXBtZXRhIiwgWEZBX1BhY2tldFR5cGU6OlhtcG1ldGEsCisgICAgIEwiaHR0cDovL25zLmFkb2JlLmNvbS94bXBtZXRhLyIsCisgICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE1BTll9LAorICAgIHsweDQ4ZDAwNGE4LCBMInhmZGYiLCBYRkFfUGFja2V0VHlwZTo6WGZkZiwgTCJodHRwOi8vbnMuYWRvYmUuY29tL3hmZGYvIiwKKyAgICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwKKyAgICB7MHg0ZTFlMzliNiwgTCJjb25maWciLCBYRkFfUGFja2V0VHlwZTo6Q29uZmlnLAorICAgICBMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGNpLyIsCisgICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sCisgICAgezB4NTQ3M2I2ZGMsIEwibG9jYWxlU2V0IiwgWEZBX1BhY2tldFR5cGU6OkxvY2FsZVNldCwKKyAgICAgTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1sb2NhbGUtc2V0LyIsCisgICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sCisgICAgezB4NjAzODU4MGEsIEwic3R5bGVzaGVldCIsIFhGQV9QYWNrZXRUeXBlOjpTdHlsZXNoZWV0LAorICAgICBMImh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIsCisgICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE1BTll9LAorICAgIHsweDgwMzU1MGZjLCBMInRlbXBsYXRlIiwgWEZBX1BhY2tldFR5cGU6OlRlbXBsYXRlLAorICAgICBMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLXRlbXBsYXRlLyIsCisgICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sCisgICAgezB4OGIwMzZmMzIsIEwic2lnbmF0dXJlIiwgWEZBX1BhY2tldFR5cGU6OlNpZ25hdHVyZSwKKyAgICAgTCJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiwKKyAgICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwKKyAgICB7MHg5OWI5NTA3OSwgTCJkYXRhc2V0cyIsIFhGQV9QYWNrZXRUeXBlOjpEYXRhc2V0cywKKyAgICAgTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1kYXRhLyIsCisgICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfUFJFRklYTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRPTkV9LAorICAgIHsweGNkMzA5ZmY0LCBMImZvcm0iLCBYRkFfUGFja2V0VHlwZTo6Rm9ybSwKKyAgICAgTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1mb3JtLyIsCisgICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sCisgICAgezB4ZTE0YzgwMWMsIEwiY29ubmVjdGlvblNldCIsIFhGQV9QYWNrZXRUeXBlOjpDb25uZWN0aW9uU2V0LAorICAgICBMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWNvbm5lY3Rpb24tc2V0LyIsCisgICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sCit9OworCitjb25zdCBQYWNrZXRJbmZvKiBHZXRQYWNrZXRCeUluZGV4KFhGQV9QYWNrZXRUeXBlIGVQYWNrZXQpIHsKKyAgcmV0dXJuIFBhY2tldERhdGEgKyBzdGF0aWNfY2FzdDx1aW50OF90PihlUGFja2V0KTsKK30KKworY29uc3QgUGFja2V0SW5mbyogR2V0UGFja2V0QnlOYW1lKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c05hbWUpIHsKKyAgaWYgKHdzTmFtZS5Jc0VtcHR5KCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgdWludDMyX3QgaGFzaCA9IEZYX0hhc2hDb2RlX0dldFcod3NOYW1lLCBmYWxzZSk7CisgIGF1dG8qIGVsZW0gPSBzdGQ6Omxvd2VyX2JvdW5kKAorICAgICAgc3RkOjpiZWdpbihQYWNrZXREYXRhKSwgc3RkOjplbmQoUGFja2V0RGF0YSksIGhhc2gsCisgICAgICBbXShjb25zdCBQYWNrZXRJbmZvJiBhLCB1aW50MzJfdCBoYXNoKSB7IHJldHVybiBhLmhhc2ggPCBoYXNoOyB9KTsKKyAgaWYgKGVsZW0gIT0gc3RkOjplbmQoUGFja2V0RGF0YSkgJiYgZWxlbS0+aGFzaCA9PSBoYXNoKQorICAgIHJldHVybiBlbGVtOworICByZXR1cm4gbnVsbHB0cjsKK30KKworQ0ZYX1hNTE5vZGUqIEdldERvY3VtZW50Tm9kZShDRlhfWE1MRG9jKiBwWE1MRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJWZXJpZnlXZWxsRm9ybW5lc3MgPSBmYWxzZSkgewogICBpZiAoIXBYTUxEb2MpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgZm9yIChDRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0KLSAgICAgICAgICAgcFhNTERvYy0+R2V0Um9vdCgpLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOwotICAgICAgIHBYTUxOb2RlOyBwWE1MTm9kZSA9IHBYTUxOb2RlLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgewotICAgIGlmIChwWE1MTm9kZS0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpCisgIGZvciAoQ0ZYX1hNTE5vZGUqIHBYTUxOb2RlID0KKyAgICAgICAgICAgcFhNTERvYy0+R2V0Um9vdCgpLT5HZXROb2RlSXRlbShDRlhfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7CisgICAgICAgcFhNTE5vZGU7IHBYTUxOb2RlID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpOZXh0U2libGluZykpIHsKKyAgICBpZiAocFhNTE5vZGUtPkdldFR5cGUoKSAhPSBGWF9YTUxOT0RFX0VsZW1lbnQpCiAgICAgICBjb250aW51ZTsKIAogICAgIGlmICghYlZlcmlmeVdlbGxGb3JtbmVzcykKICAgICAgIHJldHVybiBwWE1MTm9kZTsKIAotICAgIGZvciAoQ0ZERV9YTUxOb2RlKiBwTmV4dE5vZGUgPQotICAgICAgICAgICAgIHBYTUxOb2RlLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKTsKKyAgICBmb3IgKENGWF9YTUxOb2RlKiBwTmV4dE5vZGUgPQorICAgICAgICAgICAgIHBYTUxOb2RlLT5HZXROb2RlSXRlbShDRlhfWE1MTm9kZTo6TmV4dFNpYmxpbmcpOwogICAgICAgICAgcE5leHROb2RlOwotICAgICAgICAgcE5leHROb2RlID0gcE5leHROb2RlLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgewotICAgICAgaWYgKHBOZXh0Tm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpCisgICAgICAgICBwTmV4dE5vZGUgPSBwTmV4dE5vZGUtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpOZXh0U2libGluZykpIHsKKyAgICAgIGlmIChwTmV4dE5vZGUtPkdldFR5cGUoKSA9PSBGWF9YTUxOT0RFX0VsZW1lbnQpCiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KICAgICByZXR1cm4gcFhNTE5vZGU7CkBAIC00NywxMDEgKzEyNyw5NyBAQAogICByZXR1cm4gbnVsbHB0cjsKIH0KIAotdm9pZCBHZXRFbGVtZW50VGFnTmFtZXNwYWNlVVJJKENGREVfWE1MRWxlbWVudCogcEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZXNwYWNlVVJJKSB7Ci0gIENGWF9XaWRlU3RyaW5nIHdzTm9kZVN0cjsKLSAgcEVsZW1lbnQtPkdldE5hbWVzcGFjZVByZWZpeCh3c05vZGVTdHIpOwotICBpZiAoIVhGQV9GREVFeHRlbnNpb25fUmVzb2x2ZU5hbWVzcGFjZVF1YWxpZmllcigKLSAgICAgICAgICBwRWxlbWVudCwgd3NOb2RlU3RyLkFzU3RyaW5nQygpLCB3c05hbWVzcGFjZVVSSSkpIHsKLSAgICB3c05hbWVzcGFjZVVSSS5jbGVhcigpOworV2lkZVN0cmluZyBHZXRFbGVtZW50VGFnTmFtZXNwYWNlVVJJKENGWF9YTUxFbGVtZW50KiBwRWxlbWVudCkgeworICBXaWRlU3RyaW5nIHdzTm9kZVN0ciA9IHBFbGVtZW50LT5HZXROYW1lc3BhY2VQcmVmaXgoKTsKKyAgV2lkZVN0cmluZyB3c05hbWVzcGFjZVVSSTsKKyAgaWYgKCFYRkFfRkRFRXh0ZW5zaW9uX1Jlc29sdmVOYW1lc3BhY2VRdWFsaWZpZXIocEVsZW1lbnQsIHdzTm9kZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndzTmFtZXNwYWNlVVJJKSkgeworICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CiAgIH0KKyAgcmV0dXJuIHdzTmFtZXNwYWNlVVJJOwogfQogCi1ib29sIE1hdGNoTm9kZU5hbWUoQ0ZERV9YTUxOb2RlKiBwTm9kZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTG9jYWxUYWdOYW1lLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lc3BhY2VVUklQcmVmaXgsCitib29sIE1hdGNoTm9kZU5hbWUoQ0ZYX1hNTE5vZGUqIHBOb2RlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c0xvY2FsVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NOYW1lc3BhY2VVUklQcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZU1hdGNoRmxhZ3MgPSBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0gpIHsKLSAgaWYgKCFwTm9kZSB8fCBwTm9kZS0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpCisgIGlmICghcE5vZGUgfHwgcE5vZGUtPkdldFR5cGUoKSAhPSBGWF9YTUxOT0RFX0VsZW1lbnQpCiAgICAgcmV0dXJuIGZhbHNlOwogCi0gIENGREVfWE1MRWxlbWVudCogcEVsZW1lbnQgPSByZWludGVycHJldF9jYXN0PENGREVfWE1MRWxlbWVudCo+KHBOb2RlKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NOb2RlU3RyOwotICBwRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKHdzTm9kZVN0cik7CisgIENGWF9YTUxFbGVtZW50KiBwRWxlbWVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYX1hNTEVsZW1lbnQqPihwTm9kZSk7CisgIFdpZGVTdHJpbmcgd3NOb2RlU3RyID0gcEVsZW1lbnQtPkdldExvY2FsVGFnTmFtZSgpOwogICBpZiAod3NOb2RlU3RyICE9IHdzTG9jYWxUYWdOYW1lKQogICAgIHJldHVybiBmYWxzZTsKIAotICBHZXRFbGVtZW50VGFnTmFtZXNwYWNlVVJJKHBFbGVtZW50LCB3c05vZGVTdHIpOworICB3c05vZGVTdHIgPSBHZXRFbGVtZW50VGFnTmFtZXNwYWNlVVJJKHBFbGVtZW50KTsKICAgaWYgKGVNYXRjaEZsYWdzICYgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIKQogICAgIHJldHVybiB0cnVlOwogICBpZiAoZU1hdGNoRmxhZ3MgJiBYRkFfWERQUEFDS0VUX0ZMQUdTX1BSRUZJWE1BVENIKSB7CiAgICAgcmV0dXJuIHdzTm9kZVN0ci5MZWZ0KHdzTmFtZXNwYWNlVVJJUHJlZml4LkdldExlbmd0aCgpKSA9PQogICAgICAgICAgICB3c05hbWVzcGFjZVVSSVByZWZpeDsKICAgfQorCiAgIHJldHVybiB3c05vZGVTdHIgPT0gd3NOYW1lc3BhY2VVUklQcmVmaXg7CiB9CiAKLWJvb2wgR2V0QXR0cmlidXRlTG9jYWxOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NBdHRyaWJ1dGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTG9jYWxBdHRyTmFtZSkgewotICBDRlhfV2lkZVN0cmluZyB3c0F0dHJOYW1lKHdzQXR0cmlidXRlTmFtZSk7Ci0gIEZYX1NUUlNJWkUgaUZpbmQgPSB3c0F0dHJOYW1lLkZpbmQoTCc6JywgMCk7Ci0gIGlmIChpRmluZCA8IDApIHsKK2Jvb2wgR2V0QXR0cmlidXRlTG9jYWxOYW1lKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c0F0dHJpYnV0ZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiB3c0xvY2FsQXR0ck5hbWUpIHsKKyAgV2lkZVN0cmluZyB3c0F0dHJOYW1lKHdzQXR0cmlidXRlTmFtZSk7CisgIGF1dG8gcG9zID0gd3NBdHRyTmFtZS5GaW5kKEwnOicsIDApOworICBpZiAoIXBvcy5oYXNfdmFsdWUoKSkgewogICAgIHdzTG9jYWxBdHRyTmFtZSA9IHdzQXR0ck5hbWU7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIHdzTG9jYWxBdHRyTmFtZSA9IHdzQXR0ck5hbWUuUmlnaHQod3NBdHRyTmFtZS5HZXRMZW5ndGgoKSAtIGlGaW5kIC0gMSk7CisgIHdzTG9jYWxBdHRyTmFtZSA9IHdzQXR0ck5hbWUuUmlnaHQod3NBdHRyTmFtZS5HZXRMZW5ndGgoKSAtIHBvcy52YWx1ZSgpIC0gMSk7CiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIFJlc29sdmVBdHRyaWJ1dGUoQ0ZERV9YTUxFbGVtZW50KiBwRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQXR0cmlidXRlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NMb2NhbEF0dHJOYW1lLAotICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c05hbWVzcGFjZVVSSSkgewotICBDRlhfV2lkZVN0cmluZyB3c0F0dHJOYW1lKHdzQXR0cmlidXRlTmFtZSk7Ci0gIENGWF9XaWRlU3RyaW5nIHdzTlNQcmVmaXg7Ci0gIGlmIChHZXRBdHRyaWJ1dGVMb2NhbE5hbWUod3NBdHRyaWJ1dGVOYW1lLCB3c0xvY2FsQXR0ck5hbWUpKSB7Ci0gICAgd3NOU1ByZWZpeCA9IHdzQXR0ck5hbWUuTGVmdCh3c0F0dHJpYnV0ZU5hbWUuR2V0TGVuZ3RoKCkgLQorYm9vbCBSZXNvbHZlQXR0cmlidXRlKENGWF9YTUxFbGVtZW50KiBwRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c0F0dHJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIHdzTG9jYWxBdHRyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nJiB3c05hbWVzcGFjZVVSSSkgeworICBXaWRlU3RyaW5nIHdzTlNQcmVmaXg7CisgIGlmIChHZXRBdHRyaWJ1dGVMb2NhbE5hbWUod3NBdHRyTmFtZS5Bc1N0cmluZ1ZpZXcoKSwgd3NMb2NhbEF0dHJOYW1lKSkgeworICAgIHdzTlNQcmVmaXggPSB3c0F0dHJOYW1lLkxlZnQod3NBdHRyTmFtZS5HZXRMZW5ndGgoKSAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0xvY2FsQXR0ck5hbWUuR2V0TGVuZ3RoKCkgLSAxKTsKICAgfQogICBpZiAod3NMb2NhbEF0dHJOYW1lID09IEwieG1sbnMiIHx8IHdzTlNQcmVmaXggPT0gTCJ4bWxucyIgfHwKICAgICAgIHdzTlNQcmVmaXggPT0gTCJ4bWwiKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0gIGlmICghWEZBX0ZERUV4dGVuc2lvbl9SZXNvbHZlTmFtZXNwYWNlUXVhbGlmaWVyKAotICAgICAgICAgIHBFbGVtZW50LCB3c05TUHJlZml4LkFzU3RyaW5nQygpLCB3c05hbWVzcGFjZVVSSSkpIHsKKyAgaWYgKCFYRkFfRkRFRXh0ZW5zaW9uX1Jlc29sdmVOYW1lc3BhY2VRdWFsaWZpZXIocEVsZW1lbnQsIHdzTlNQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3c05hbWVzcGFjZVVSSSkpIHsKICAgICB3c05hbWVzcGFjZVVSSS5jbGVhcigpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBGaW5kQXR0cmlidXRlV2l0aE5TKENGREVfWE1MRWxlbWVudCogcEVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0xvY2FsQXR0cmlidXRlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZXNwYWNlVVJJUHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLAorYm9vbCBGaW5kQXR0cmlidXRlV2l0aE5TKENGWF9YTUxFbGVtZW50KiBwRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NMb2NhbEF0dHJpYnV0ZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzTmFtZXNwYWNlVVJJUHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcmIHdzVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTWF0Y2hOU0FzUHJlZml4ID0gZmFsc2UpIHsKICAgaWYgKCFwRWxlbWVudCkKICAgICByZXR1cm4gZmFsc2U7CiAKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyTmFtZTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyVmFsdWU7Ci0gIENGWF9XaWRlU3RyaW5nIHdzQXR0ck5TOwotICBmb3IgKGludDMyX3QgaUF0dHJDb3VudCA9IHBFbGVtZW50LT5Db3VudEF0dHJpYnV0ZXMoKSwgaSA9IDA7IGkgPCBpQXR0ckNvdW50OwotICAgICAgIGkrKykgewotICAgIHBFbGVtZW50LT5HZXRBdHRyaWJ1dGUoaSwgd3NBdHRyTmFtZSwgd3NBdHRyVmFsdWUpOwotICAgIEZYX1NUUlNJWkUgaUZpbmQgPSB3c0F0dHJOYW1lLkZpbmQoTCc6JywgMCk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NOU1ByZWZpeDsKLSAgICBpZiAoaUZpbmQgPCAwKSB7Ci0gICAgICBpZiAod3NMb2NhbEF0dHJpYnV0ZU5hbWUgIT0gd3NBdHRyTmFtZSkKKyAgV2lkZVN0cmluZyB3c0F0dHJOUzsKKyAgZm9yIChhdXRvIGl0IDogcEVsZW1lbnQtPkdldEF0dHJpYnV0ZXMoKSkgeworICAgIGF1dG8gcG9zID0gaXQuZmlyc3QuRmluZChMJzonLCAwKTsKKyAgICBXaWRlU3RyaW5nIHdzTlNQcmVmaXg7CisgICAgaWYgKCFwb3MuaGFzX3ZhbHVlKCkpIHsKKyAgICAgIGlmICh3c0xvY2FsQXR0cmlidXRlTmFtZSAhPSBpdC5maXJzdCkKICAgICAgICAgY29udGludWU7CiAgICAgfSBlbHNlIHsKICAgICAgIGlmICh3c0xvY2FsQXR0cmlidXRlTmFtZSAhPQotICAgICAgICAgIHdzQXR0ck5hbWUuUmlnaHQod3NBdHRyTmFtZS5HZXRMZW5ndGgoKSAtIGlGaW5kIC0gMSkpIHsKKyAgICAgICAgICBpdC5maXJzdC5SaWdodChpdC5maXJzdC5HZXRMZW5ndGgoKSAtIHBvcy52YWx1ZSgpIC0gMSkpIHsKICAgICAgICAgY29udGludWU7CiAgICAgICB9Ci0gICAgICB3c05TUHJlZml4ID0gd3NBdHRyTmFtZS5MZWZ0KGlGaW5kKTsKKyAgICAgIHdzTlNQcmVmaXggPSBpdC5maXJzdC5MZWZ0KHBvcy52YWx1ZSgpKTsKICAgICB9Ci0gICAgaWYgKCFYRkFfRkRFRXh0ZW5zaW9uX1Jlc29sdmVOYW1lc3BhY2VRdWFsaWZpZXIoCi0gICAgICAgICAgICBwRWxlbWVudCwgd3NOU1ByZWZpeC5Bc1N0cmluZ0MoKSwgd3NBdHRyTlMpKSB7CisKKyAgICBpZiAoIVhGQV9GREVFeHRlbnNpb25fUmVzb2x2ZU5hbWVzcGFjZVF1YWxpZmllcihwRWxlbWVudCwgd3NOU1ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd3NBdHRyTlMpKSB7CiAgICAgICBjb250aW51ZTsKICAgICB9CiAgICAgaWYgKGJNYXRjaE5TQXNQcmVmaXgpIHsKQEAgLTE1MywyMzIgKzIyOSwyMjQgQEAKICAgICAgIGlmICh3c0F0dHJOUyAhPSB3c05hbWVzcGFjZVVSSVByZWZpeCkKICAgICAgICAgY29udGludWU7CiAgICAgfQotICAgIHdzVmFsdWUgPSB3c0F0dHJWYWx1ZTsKKyAgICB3c1ZhbHVlID0gaXQuc2Vjb25kOwogICAgIHJldHVybiB0cnVlOwogICB9CiAgIHJldHVybiBmYWxzZTsKIH0KIAotQ0ZERV9YTUxOb2RlKiBHZXREYXRhU2V0c0Zyb21YRFAoQ0ZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlKSB7Ci0gIGlmIChNYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsCi0gICAgICAgICAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRGF0YXNldHMpLT5wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9EYXRhc2V0cyktPnBVUkksCi0gICAgICAgICAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRGF0YXNldHMpLT5lRmxhZ3MpKSB7CitDRlhfWE1MTm9kZSogR2V0RGF0YVNldHNGcm9tWERQKENGWF9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlKSB7CisgIGNvbnN0IFBhY2tldEluZm8qIGRhdGFzZXRzX3BhY2tldCA9CisgICAgICBHZXRQYWNrZXRCeUluZGV4KFhGQV9QYWNrZXRUeXBlOjpEYXRhc2V0cyk7CisgIGlmIChNYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsIGRhdGFzZXRzX3BhY2tldC0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZGF0YXNldHNfcGFja2V0LT51cmksIGRhdGFzZXRzX3BhY2tldC0+ZmxhZ3MpKSB7CiAgICAgcmV0dXJuIHBYTUxEb2N1bWVudE5vZGU7CiAgIH0KLSAgaWYgKCFNYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1hEUCktPnBOYW1lLAotICAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9YRFApLT5wVVJJLAotICAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9YRFApLT5lRmxhZ3MpKSB7CisKKyAgY29uc3QgUGFja2V0SW5mbyogcGFja2V0ID0gR2V0UGFja2V0QnlJbmRleChYRkFfUGFja2V0VHlwZTo6WGRwKTsKKyAgaWYgKCFNYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsIHBhY2tldC0+bmFtZSwgcGFja2V0LT51cmksCisgICAgICAgICAgICAgICAgICAgICBwYWNrZXQtPmZsYWdzKSkgewogICAgIHJldHVybiBudWxscHRyOwogICB9Ci0gIGZvciAoQ0ZERV9YTUxOb2RlKiBwRGF0YXNldHNOb2RlID0KLSAgICAgICAgICAgcFhNTERvY3VtZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsKKworICBmb3IgKENGWF9YTUxOb2RlKiBwRGF0YXNldHNOb2RlID0KKyAgICAgICAgICAgcFhNTERvY3VtZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZYX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOwogICAgICAgIHBEYXRhc2V0c05vZGU7Ci0gICAgICAgcERhdGFzZXRzTm9kZSA9IHBEYXRhc2V0c05vZGUtPkdldE5vZGVJdGVtKENGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7Ci0gICAgaWYgKCFNYXRjaE5vZGVOYW1lKHBEYXRhc2V0c05vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRGF0YXNldHMpLT5wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9EYXRhc2V0cyktPnBVUkksCi0gICAgICAgICAgICAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRGF0YXNldHMpLT5lRmxhZ3MpKSB7Ci0gICAgICBjb250aW51ZTsKKyAgICAgICBwRGF0YXNldHNOb2RlID0gcERhdGFzZXRzTm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZYX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgeworICAgIGlmIChNYXRjaE5vZGVOYW1lKHBEYXRhc2V0c05vZGUsIGRhdGFzZXRzX3BhY2tldC0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBkYXRhc2V0c19wYWNrZXQtPnVyaSwgZGF0YXNldHNfcGFja2V0LT5mbGFncykpIHsKKyAgICAgIHJldHVybiBwRGF0YXNldHNOb2RlOwogICAgIH0KLSAgICByZXR1cm4gcERhdGFzZXRzTm9kZTsKICAgfQogICByZXR1cm4gbnVsbHB0cjsKIH0KIAotYm9vbCBJc1N0cmluZ0FsbFdoaXRlc3BhY2UoQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0KSB7Citib29sIElzU3RyaW5nQWxsV2hpdGVzcGFjZShXaWRlU3RyaW5nIHdzVGV4dCkgewogICB3c1RleHQuVHJpbVJpZ2h0KEwiXHgyMFx4OVx4RFx4QSIpOwogICByZXR1cm4gd3NUZXh0LklzRW1wdHkoKTsKIH0KIAotdm9pZCBDb252ZXJ0WE1MVG9QbGFpblRleHQoQ0ZERV9YTUxFbGVtZW50KiBwUm9vdFhNTE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NPdXRwdXQpIHsKLSAgZm9yIChDRkRFX1hNTE5vZGUqIHBYTUxDaGlsZCA9Ci0gICAgICAgICAgIHBSb290WE1MTm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsKK3ZvaWQgQ29udmVydFhNTFRvUGxhaW5UZXh0KENGWF9YTUxFbGVtZW50KiBwUm9vdFhNTE5vZGUsIFdpZGVTdHJpbmcmIHdzT3V0cHV0KSB7CisgIGZvciAoQ0ZYX1hNTE5vZGUqIHBYTUxDaGlsZCA9CisgICAgICAgICAgIHBSb290WE1MTm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZYX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOwogICAgICAgIHBYTUxDaGlsZDsKLSAgICAgICBwWE1MQ2hpbGQgPSBwWE1MQ2hpbGQtPkdldE5vZGVJdGVtKENGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7CisgICAgICAgcFhNTENoaWxkID0gcFhNTENoaWxkLT5HZXROb2RlSXRlbShDRlhfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7CiAgICAgc3dpdGNoIChwWE1MQ2hpbGQtPkdldFR5cGUoKSkgewotICAgICAgY2FzZSBGREVfWE1MTk9ERV9FbGVtZW50OiB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzVGV4dERhdGE7Ci0gICAgICAgIHN0YXRpY19jYXN0PENGREVfWE1MRWxlbWVudCo+KHBYTUxDaGlsZCktPkdldFRleHREYXRhKHdzVGV4dERhdGEpOworICAgICAgY2FzZSBGWF9YTUxOT0RFX0VsZW1lbnQ6IHsKKyAgICAgICAgV2lkZVN0cmluZyB3c1RleHREYXRhID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PENGWF9YTUxFbGVtZW50Kj4ocFhNTENoaWxkKS0+R2V0VGV4dERhdGEoKTsKICAgICAgICAgd3NUZXh0RGF0YSArPSBMIlxuIjsKICAgICAgICAgd3NPdXRwdXQgKz0gd3NUZXh0RGF0YTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICBjYXNlIEZERV9YTUxOT0RFX1RleHQ6IHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZXh0OwotICAgICAgICBzdGF0aWNfY2FzdDxDRkRFX1hNTFRleHQqPihwWE1MQ2hpbGQpLT5HZXRUZXh0KHdzVGV4dCk7CisgICAgICBjYXNlIEZYX1hNTE5PREVfVGV4dDoKKyAgICAgIGNhc2UgRlhfWE1MTk9ERV9DaGFyRGF0YTogeworICAgICAgICBXaWRlU3RyaW5nIHdzVGV4dCA9IHN0YXRpY19jYXN0PENGWF9YTUxUZXh0Kj4ocFhNTENoaWxkKS0+R2V0VGV4dCgpOwogICAgICAgICBpZiAoSXNTdHJpbmdBbGxXaGl0ZXNwYWNlKHdzVGV4dCkpCiAgICAgICAgICAgY29udGludWU7CiAKICAgICAgICAgd3NPdXRwdXQgPSB3c1RleHQ7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgY2FzZSBGREVfWE1MTk9ERV9DaGFyRGF0YTogewotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NoYXJEYXRhOwotICAgICAgICBzdGF0aWNfY2FzdDxDRkRFX1hNTENoYXJEYXRhKj4ocFhNTENoaWxkKS0+R2V0Q2hhckRhdGEod3NDaGFyRGF0YSk7Ci0gICAgICAgIGlmIChJc1N0cmluZ0FsbFdoaXRlc3BhY2Uod3NDaGFyRGF0YSkpCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgd3NPdXRwdXQgPSB3c0NoYXJEYXRhOwotICAgICAgICBicmVhazsKLSAgICAgIH0KICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFTU0VSVChmYWxzZSk7CisgICAgICAgIE5PVFJFQUNIRUQoKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogICB9CiB9CiAKLWNvbnN0IFhGQV9QQUNLRVRJTkZPKiBHZXRQYWNrZXRCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpIHsKLSAgaWYgKHdzTmFtZS5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIG51bGxwdHI7CitXaWRlU3RyaW5nIEdldFBsYWluVGV4dEZyb21SaWNoVGV4dChDRlhfWE1MTm9kZSogcFhNTE5vZGUpIHsKKyAgaWYgKCFwWE1MTm9kZSkKKyAgICByZXR1cm4gTCIiOwogCi0gIHVpbnQzMl90IHVIYXNoID0gRlhfSGFzaENvZGVfR2V0Vyh3c05hbWUsIGZhbHNlKTsKLSAgaW50MzJfdCBpU3RhcnQgPSAwOwotICBpbnQzMl90IGlFbmQgPSBnX2lYRkFQYWNrZXRDb3VudCAtIDE7Ci0gIGRvIHsKLSAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOwotICAgIGNvbnN0IFhGQV9QQUNLRVRJTkZPKiBwSW5mbyA9IGdfWEZBUGFja2V0RGF0YSArIGlNaWQ7Ci0gICAgaWYgKHVIYXNoID09IHBJbmZvLT51SGFzaCkKLSAgICAgIHJldHVybiBwSW5mbzsKLSAgICBpZiAodUhhc2ggPCBwSW5mby0+dUhhc2gpCi0gICAgICBpRW5kID0gaU1pZCAtIDE7Ci0gICAgZWxzZQotICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7Ci0gIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsKLSAgcmV0dXJuIG51bGxwdHI7CisgIFdpZGVTdHJpbmcgd3NQbGFpblRleHQ7CisgIHN3aXRjaCAocFhNTE5vZGUtPkdldFR5cGUoKSkgeworICAgIGNhc2UgRlhfWE1MTk9ERV9FbGVtZW50OiB7CisgICAgICBDRlhfWE1MRWxlbWVudCogcFhNTEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxDRlhfWE1MRWxlbWVudCo+KHBYTUxOb2RlKTsKKyAgICAgIFdpZGVTdHJpbmcgd3NUYWcgPSBwWE1MRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKCk7CisgICAgICB1aW50MzJfdCB1VGFnID0gRlhfSGFzaENvZGVfR2V0Vyh3c1RhZy5Bc1N0cmluZ1ZpZXcoKSwgdHJ1ZSk7CisgICAgICBpZiAodVRhZyA9PSAweDAwMDFmNzE0KSB7CisgICAgICAgIHdzUGxhaW5UZXh0ICs9IEwiXG4iOworICAgICAgfSBlbHNlIGlmICh1VGFnID09IDB4MDAwMDAwNzApIHsKKyAgICAgICAgaWYgKCF3c1BsYWluVGV4dC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICB3c1BsYWluVGV4dCArPSBMIlxuIjsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICh1VGFnID09IDB4YTQ4YWM2MykgeworICAgICAgICBpZiAoIXdzUGxhaW5UZXh0LklzRW1wdHkoKSAmJgorICAgICAgICAgICAgd3NQbGFpblRleHRbd3NQbGFpblRleHQuR2V0TGVuZ3RoKCkgLSAxXSAhPSAnXG4nKSB7CisgICAgICAgICAgd3NQbGFpblRleHQgKz0gTCJcbiI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEZYX1hNTE5PREVfVGV4dDoKKyAgICBjYXNlIEZYX1hNTE5PREVfQ2hhckRhdGE6IHsKKyAgICAgIFdpZGVTdHJpbmcgd3NDb250ZW50ID0gc3RhdGljX2Nhc3Q8Q0ZYX1hNTFRleHQqPihwWE1MTm9kZSktPkdldFRleHQoKTsKKyAgICAgIHdzUGxhaW5UZXh0ICs9IHdzQ29udGVudDsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgYnJlYWs7CisgIH0KKyAgZm9yIChDRlhfWE1MTm9kZSogcENoaWxkWE1MID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpGaXJzdENoaWxkKTsKKyAgICAgICBwQ2hpbGRYTUw7CisgICAgICAgcENoaWxkWE1MID0gcENoaWxkWE1MLT5HZXROb2RlSXRlbShDRlhfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7CisgICAgd3NQbGFpblRleHQgKz0gR2V0UGxhaW5UZXh0RnJvbVJpY2hUZXh0KHBDaGlsZFhNTCk7CisgIH0KKworICByZXR1cm4gd3NQbGFpblRleHQ7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZQogCi1ib29sIFhGQV9SZWNvZ25pemVSaWNoVGV4dChDRkRFX1hNTEVsZW1lbnQqIHBSaWNoVGV4dFhNTE5vZGUpIHsKLSAgaWYgKHBSaWNoVGV4dFhNTE5vZGUpIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c05hbWVzcGFjZVVSSTsKLSAgICBHZXRFbGVtZW50VGFnTmFtZXNwYWNlVVJJKHBSaWNoVGV4dFhNTE5vZGUsIHdzTmFtZXNwYWNlVVJJKTsKLSAgICBpZiAod3NOYW1lc3BhY2VVUkkgPT0gTCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIikKLSAgICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKK2Jvb2wgWEZBX1JlY29nbml6ZVJpY2hUZXh0KENGWF9YTUxFbGVtZW50KiBwUmljaFRleHRYTUxOb2RlKSB7CisgIHJldHVybiBwUmljaFRleHRYTUxOb2RlICYmIEdldEVsZW1lbnRUYWdOYW1lc3BhY2VVUkkocFJpY2hUZXh0WE1MTm9kZSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI7CiB9CiAKLUNYRkFfU2ltcGxlUGFyc2VyOjpDWEZBX1NpbXBsZVBhcnNlcihDWEZBX0RvY3VtZW50KiBwRmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJEb2N1bWVudFBhcnNlcikKLSAgICA6IG1fcFhNTFBhcnNlcihudWxscHRyKSwKLSAgICAgIG1fcFhNTERvYyhudWxscHRyKSwKLSAgICAgIG1fcFN0cmVhbShudWxscHRyKSwKLSAgICAgIG1fcEZpbGVSZWFkKG51bGxwdHIpLAotICAgICAgbV9wRmFjdG9yeShwRmFjdG9yeSksCi0gICAgICBtX3BSb290Tm9kZShudWxscHRyKSwKLSAgICAgIG1fZVBhY2tldElEKFhGQV9YRFBQQUNLRVRfVU5LTk9XTiksCi0gICAgICBtX2JEb2N1bWVudFBhcnNlcihiRG9jdW1lbnRQYXJzZXIpIHt9CitDWEZBX1NpbXBsZVBhcnNlcjo6Q1hGQV9TaW1wbGVQYXJzZXIoKSA6IG1fYkRvY3VtZW50UGFyc2VyKHRydWUpIHt9CisKK0NYRkFfU2ltcGxlUGFyc2VyOjpDWEZBX1NpbXBsZVBhcnNlcihDWEZBX0RvY3VtZW50KiBwRmFjdG9yeSkKKyAgICA6IG1fcEZhY3RvcnkocEZhY3RvcnkpLCBtX2JEb2N1bWVudFBhcnNlcihmYWxzZSkge30KIAogQ1hGQV9TaW1wbGVQYXJzZXI6On5DWEZBX1NpbXBsZVBhcnNlcigpIHt9CiAKIHZvaWQgQ1hGQV9TaW1wbGVQYXJzZXI6OlNldEZhY3RvcnkoQ1hGQV9Eb2N1bWVudCogcEZhY3RvcnkpIHsKKyAgQVNTRVJUKG1fYkRvY3VtZW50UGFyc2VyKTsKICAgbV9wRmFjdG9yeSA9IHBGYWN0b3J5OwogfQogCiBpbnQzMl90IENYRkFfU2ltcGxlUGFyc2VyOjpTdGFydFBhcnNlKAotICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBTdHJlYW0sCi0gICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpIHsKKyAgICBjb25zdCBSZXRhaW5QdHI8SUZYX1NlZWthYmxlU3RyZWFtPiYgcFN0cmVhbSwKKyAgICBYRkFfUGFja2V0VHlwZSBlUGFja2V0SUQpIHsKICAgQ2xvc2VQYXJzZXIoKTsKICAgbV9wRmlsZVJlYWQgPSBwU3RyZWFtOwotICBtX3BTdHJlYW0gPSBJRkdBU19TdHJlYW06OkNyZWF0ZVN0cmVhbSgKLSAgICAgIHBTdHJlYW0sIEZYX1NUUkVBTUFDQ0VTU19SZWFkIHwgRlhfU1RSRUFNQUNDRVNTX1RleHQpOwotICBpZiAoIW1fcFN0cmVhbSkKLSAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1N0cmVhbUVycjsKLQorICBtX3BTdHJlYW0gPSBwZGZpdW06Ok1ha2VSZXRhaW48Q0ZYX1NlZWthYmxlU3RyZWFtUHJveHk+KHBTdHJlYW0sIGZhbHNlKTsKICAgdWludDE2X3Qgd0NvZGVQYWdlID0gbV9wU3RyZWFtLT5HZXRDb2RlUGFnZSgpOwogICBpZiAod0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjE2TEUgJiYgd0NvZGVQYWdlICE9IEZYX0NPREVQQUdFX1VURjE2QkUgJiYKICAgICAgIHdDb2RlUGFnZSAhPSBGWF9DT0RFUEFHRV9VVEY4KSB7CiAgICAgbV9wU3RyZWFtLT5TZXRDb2RlUGFnZShGWF9DT0RFUEFHRV9VVEY4KTsKICAgfQotICBtX3BYTUxEb2MgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZERV9YTUxEb2M+KCk7CisgIG1fcFhNTERvYyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfWE1MRG9jPigpOwogICBhdXRvIHBOZXdQYXJzZXIgPQotICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfWE1MUGFyc2VyPihtX3BYTUxEb2MtPkdldFJvb3QoKSwgbV9wU3RyZWFtKTsKKyAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfWE1MUGFyc2VyPihtX3BYTUxEb2MtPkdldFJvb3QoKSwgbV9wU3RyZWFtKTsKICAgbV9wWE1MUGFyc2VyID0gcE5ld1BhcnNlci5nZXQoKTsKICAgaWYgKCFtX3BYTUxEb2MtPkxvYWRYTUwoc3RkOjptb3ZlKHBOZXdQYXJzZXIpKSkKICAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1N0YXR1c0VycjsKIAorICBtX2JQYXJzZVN0YXJ0ZWQgPSB0cnVlOwogICBtX2VQYWNrZXRJRCA9IGVQYWNrZXRJRDsKICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19SZWFkeTsKIH0KIAotaW50MzJfdCBDWEZBX1NpbXBsZVBhcnNlcjo6RG9QYXJzZShJRlhfUGF1c2UqIHBQYXVzZSkgewotICBpZiAoIW1fcFhNTERvYyB8fCBtX2VQYWNrZXRJRCA9PSBYRkFfWERQUEFDS0VUX1VOS05PV04pCitpbnQzMl90IENYRkFfU2ltcGxlUGFyc2VyOjpEb1BhcnNlKCkgeworICBpZiAoIW1fcFhNTERvYyB8fCAhbV9iUGFyc2VTdGFydGVkKQogICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3RhdHVzRXJyOwogCi0gIGludDMyX3QgaVJldCA9IG1fcFhNTERvYy0+RG9Mb2FkKHBQYXVzZSk7CisgIGludDMyX3QgaVJldCA9IG1fcFhNTERvYy0+RG9Mb2FkKCk7CiAgIGlmIChpUmV0IDwgMCkKICAgICByZXR1cm4gWEZBX1BBUlNFU1RBVFVTX1N5bnRheEVycjsKICAgaWYgKGlSZXQgPCAxMDApCiAgICAgcmV0dXJuIGlSZXQgLyAyOwogCiAgIG1fcFJvb3ROb2RlID0gUGFyc2VBc1hEUFBhY2tldChHZXREb2N1bWVudE5vZGUobV9wWE1MRG9jLmdldCgpKSwgbV9lUGFja2V0SUQpOworICBtX3BYTUxQYXJzZXIuUmVsZWFzZSgpOwogICBtX3BYTUxEb2MtPkNsb3NlWE1MKCk7CiAgIG1fcFN0cmVhbS5SZXNldCgpOworCiAgIGlmICghbV9wUm9vdE5vZGUpCiAgICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TdGF0dXNFcnI7CiAKICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19Eb25lOwogfQogCi1pbnQzMl90IENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZVhNTERhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzWE1MLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfWE1MTm9kZSomIHBYTUxOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9QYXVzZSogcFBhdXNlKSB7CitDRlhfWE1MTm9kZSogQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlWE1MRGF0YShjb25zdCBCeXRlU3RyaW5nJiB3c1hNTCkgewogICBDbG9zZVBhcnNlcigpOwotICBwWE1MTm9kZSA9IG51bGxwdHI7Ci0gIG1fcFhNTERvYyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRkRFX1hNTERvYz4oKTsKLSAgYXV0byBwU3RyZWFtID0gcGRmaXVtOjpNYWtlUmV0YWluPENYRkFfV2lkZVRleHRSZWFkPih3c1hNTCk7CisgIG1fcFhNTERvYyA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfWE1MRG9jPigpOworCisgIGF1dG8gcFN0cmVhbSA9IHBkZml1bTo6TWFrZVJldGFpbjxDRlhfU2Vla2FibGVTdHJlYW1Qcm94eT4oCisgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QqPih3c1hNTC5yYXdfc3RyKCkpLCB3c1hNTC5HZXRMZW5ndGgoKSk7CiAgIGF1dG8gcFBhcnNlciA9Ci0gICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9YTUxQYXJzZXI+KG1fcFhNTERvYy0+R2V0Um9vdCgpLCBwU3RyZWFtKTsKKyAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfWE1MUGFyc2VyPihtX3BYTUxEb2MtPkdldFJvb3QoKSwgcFN0cmVhbSk7CiAgIHBQYXJzZXItPm1fZHdDaGVja1N0YXR1cyA9IDB4MDM7CiAgIGlmICghbV9wWE1MRG9jLT5Mb2FkWE1MKHN0ZDo6bW92ZShwUGFyc2VyKSkpCi0gICAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19TdGF0dXNFcnI7CisgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgaW50MzJfdCBpUmV0ID0gbV9wWE1MRG9jLT5Eb0xvYWQocFBhdXNlKTsKKyAgaW50MzJfdCBpUmV0ID0gbV9wWE1MRG9jLT5Eb0xvYWQoKTsKICAgaWYgKGlSZXQgPCAwIHx8IGlSZXQgPj0gMTAwKQogICAgIG1fcFhNTERvYy0+Q2xvc2VYTUwoKTsKLSAgaWYgKGlSZXQgPCAwKQotICAgIHJldHVybiBYRkFfUEFSU0VTVEFUVVNfU3ludGF4RXJyOwotICBpZiAoaVJldCA8IDEwMCkKLSAgICByZXR1cm4gaVJldCAvIDI7Ci0KLSAgcFhNTE5vZGUgPSBHZXREb2N1bWVudE5vZGUobV9wWE1MRG9jLmdldCgpKTsKLSAgcmV0dXJuIFhGQV9QQVJTRVNUQVRVU19Eb25lOworICByZXR1cm4gaVJldCA8IDEwMCA/IG51bGxwdHIgOiBHZXREb2N1bWVudE5vZGUobV9wWE1MRG9jLmdldCgpKTsKIH0KIAogdm9pZCBDWEZBX1NpbXBsZVBhcnNlcjo6Q29uc3RydWN0WEZBTm9kZShDWEZBX05vZGUqIHBYRkFOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1hNTE5vZGUqIHBYTUxOb2RlKSB7Ci0gIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEID0gKFhGQV9YRFBQQUNLRVQpcFhGQU5vZGUtPkdldFBhY2tldElEKCk7Ci0gIGlmIChlUGFja2V0SUQgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfWE1MTm9kZSogcFhNTE5vZGUpIHsKKyAgWEZBX1BhY2tldFR5cGUgZVBhY2tldElEID0gcFhGQU5vZGUtPkdldFBhY2tldFR5cGUoKTsKKyAgaWYgKGVQYWNrZXRJRCA9PSBYRkFfUGFja2V0VHlwZTo6RGF0YXNldHMpIHsKICAgICBpZiAocFhGQU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkRhdGFWYWx1ZSkgewotICAgICAgZm9yIChDRkRFX1hNTE5vZGUqIHBYTUxDaGlsZCA9Ci0gICAgICAgICAgICAgICBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsKKyAgICAgIGZvciAoQ0ZYX1hNTE5vZGUqIHBYTUxDaGlsZCA9CisgICAgICAgICAgICAgICBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZYX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOwogICAgICAgICAgICBwWE1MQ2hpbGQ7Ci0gICAgICAgICAgIHBYTUxDaGlsZCA9IHBYTUxDaGlsZC0+R2V0Tm9kZUl0ZW0oQ0ZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsKLSAgICAgICAgRkRFX1hNTE5PREVUWVBFIGVOb2RlVHlwZSA9IHBYTUxDaGlsZC0+R2V0VHlwZSgpOwotICAgICAgICBpZiAoZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKQorICAgICAgICAgICBwWE1MQ2hpbGQgPSBwWE1MQ2hpbGQtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpOZXh0U2libGluZykpIHsKKyAgICAgICAgRlhfWE1MTk9ERVRZUEUgZU5vZGVUeXBlID0gcFhNTENoaWxkLT5HZXRUeXBlKCk7CisgICAgICAgIGlmIChlTm9kZVR5cGUgPT0gRlhfWE1MTk9ERV9JbnN0cnVjdGlvbikKICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICBpZiAoZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX0VsZW1lbnQpIHsKLSAgICAgICAgICBDWEZBX05vZGUqIHBYRkFDaGlsZCA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkRhdGFWYWx1ZSk7CisgICAgICAgIGlmIChlTm9kZVR5cGUgPT0gRlhfWE1MTk9ERV9FbGVtZW50KSB7CisgICAgICAgICAgQ1hGQV9Ob2RlKiBwWEZBQ2hpbGQgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKAorICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZTo6RGF0YXNldHMsIFhGQV9FbGVtZW50OjpEYXRhVmFsdWUpOwogICAgICAgICAgIGlmICghcFhGQUNoaWxkKQogICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOb2RlU3RyOwotICAgICAgICAgIENGREVfWE1MRWxlbWVudCogY2hpbGQgPSBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwWE1MQ2hpbGQpOwotICAgICAgICAgIGNoaWxkLT5HZXRMb2NhbFRhZ05hbWUod3NOb2RlU3RyKTsKLSAgICAgICAgICBwWEZBQ2hpbGQtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOb2RlU3RyKTsKLSAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NoaWxkVmFsdWU7Ci0gICAgICAgICAgWEZBX0dldFBsYWluVGV4dEZyb21SaWNoVGV4dChjaGlsZCwgd3NDaGlsZFZhbHVlKTsKKyAgICAgICAgICBDRlhfWE1MRWxlbWVudCogY2hpbGQgPSBzdGF0aWNfY2FzdDxDRlhfWE1MRWxlbWVudCo+KHBYTUxDaGlsZCk7CisgICAgICAgICAgV2lkZVN0cmluZyB3c05vZGVTdHIgPSBjaGlsZC0+R2V0TG9jYWxUYWdOYW1lKCk7CisgICAgICAgICAgcFhGQUNoaWxkLT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpOYW1lLCB3c05vZGVTdHIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgIFdpZGVTdHJpbmcgd3NDaGlsZFZhbHVlID0gR2V0UGxhaW5UZXh0RnJvbVJpY2hUZXh0KGNoaWxkKTsKICAgICAgICAgICBpZiAoIXdzQ2hpbGRWYWx1ZS5Jc0VtcHR5KCkpCi0gICAgICAgICAgICBwWEZBQ2hpbGQtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ2hpbGRWYWx1ZSk7CisgICAgICAgICAgICBwWEZBQ2hpbGQtPkpTT2JqZWN0KCktPlNldENEYXRhKFhGQV9BdHRyaWJ1dGU6OlZhbHVlLCB3c0NoaWxkVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7CiAKLSAgICAgICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocFhGQUNoaWxkKTsKKyAgICAgICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocFhGQUNoaWxkLCBudWxscHRyKTsKICAgICAgICAgICBwWEZBQ2hpbGQtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxDaGlsZCk7CiAgICAgICAgICAgcFhGQUNoaWxkLT5TZXRGbGFnKFhGQV9Ob2RlRmxhZ19Jbml0aWFsaXplZCwgZmFsc2UpOwogICAgICAgICAgIGJyZWFrOwpAQCAtNDAwLDMxOCArNDY4LDI4MiBAQAogICByZXR1cm4gbV9wUm9vdE5vZGU7CiB9CiAKLUNGREVfWE1MRG9jKiBDWEZBX1NpbXBsZVBhcnNlcjo6R2V0WE1MRG9jKCkgY29uc3QgeworQ0ZYX1hNTERvYyogQ1hGQV9TaW1wbGVQYXJzZXI6OkdldFhNTERvYygpIGNvbnN0IHsKICAgcmV0dXJuIG1fcFhNTERvYy5nZXQoKTsKIH0KIAotYm9vbCBYRkFfRkRFRXh0ZW5zaW9uX1Jlc29sdmVOYW1lc3BhY2VRdWFsaWZpZXIoCi0gICAgQ0ZERV9YTUxFbGVtZW50KiBwTm9kZSwKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzUXVhbGlmaWVyLAotICAgIENGWF9XaWRlU3RyaW5nJiB3c05hbWVzcGFjZVVSSSkgewotICBpZiAoIXBOb2RlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDRkRFX1hNTE5vZGUqIHBGYWtlUm9vdCA9IHBOb2RlLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6OlJvb3QpOwotICBDRlhfV2lkZVN0cmluZyB3c05TQXR0cmlidXRlOwotICBib29sIGJSZXQgPSBmYWxzZTsKLSAgaWYgKHdzUXVhbGlmaWVyLklzRW1wdHkoKSkgewotICAgIHdzTlNBdHRyaWJ1dGUgPSBMInhtbG5zIjsKLSAgICBiUmV0ID0gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICB3c05TQXR0cmlidXRlID0gTCJ4bWxuczoiICsgd3NRdWFsaWZpZXI7Ci0gIH0KLSAgZm9yICg7IHBOb2RlICE9IHBGYWtlUm9vdDsgcE5vZGUgPSBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOb2RlLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6OlBhcmVudCkpKSB7Ci0gICAgaWYgKHBOb2RlLT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgaWYgKHBOb2RlLT5IYXNBdHRyaWJ1dGUod3NOU0F0dHJpYnV0ZS5jX3N0cigpKSkgewotICAgICAgcE5vZGUtPkdldFN0cmluZyh3c05TQXR0cmlidXRlLmNfc3RyKCksIHdzTmFtZXNwYWNlVVJJKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICB3c05hbWVzcGFjZVVSSS5jbGVhcigpOwotICByZXR1cm4gYlJldDsKLX0KLQotQ1hGQV9Ob2RlKiBDWEZBX1NpbXBsZVBhcnNlcjo6UGFyc2VBc1hEUFBhY2tldChDRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKSB7CitDWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZUFzWERQUGFja2V0KENGWF9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBlUGFja2V0SUQpIHsKICAgc3dpdGNoIChlUGFja2V0SUQpIHsKLSAgICBjYXNlIFhGQV9YRFBQQUNLRVRfVU5LTk9XTjoKLSAgICAgIHJldHVybiBudWxscHRyOwotICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9YRFA6Ci0gICAgICByZXR1cm4gUGFyc2VBc1hEUFBhY2tldF9YRFAocFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElEKTsKLSAgICBjYXNlIFhGQV9YRFBQQUNLRVRfQ29uZmlnOgotICAgICAgcmV0dXJuIFBhcnNlQXNYRFBQYWNrZXRfQ29uZmlnKHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCk7Ci0gICAgY2FzZSBYRkFfWERQUEFDS0VUX1RlbXBsYXRlOgotICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Gb3JtOgotICAgICAgcmV0dXJuIFBhcnNlQXNYRFBQYWNrZXRfVGVtcGxhdGVGb3JtKHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCk7Ci0gICAgY2FzZSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzOgotICAgICAgcmV0dXJuIFBhcnNlQXNYRFBQYWNrZXRfRGF0YShwWE1MRG9jdW1lbnROb2RlLCBlUGFja2V0SUQpOwotICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9YZGM6Ci0gICAgICByZXR1cm4gUGFyc2VBc1hEUFBhY2tldF9YZGMocFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElEKTsKLSAgICBjYXNlIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0OgotICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0OgotICAgIGNhc2UgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQ6Ci0gICAgICByZXR1cm4gUGFyc2VBc1hEUFBhY2tldF9Mb2NhbGVDb25uZWN0aW9uU291cmNlU2V0KHBYTUxEb2N1bWVudE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVQYWNrZXRJRCk7CisgICAgY2FzZSBYRkFfUGFja2V0VHlwZTo6WGRwOgorICAgICAgcmV0dXJuIFBhcnNlQXNYRFBQYWNrZXRfWERQKHBYTUxEb2N1bWVudE5vZGUpOworICAgIGNhc2UgWEZBX1BhY2tldFR5cGU6OkNvbmZpZzoKKyAgICAgIHJldHVybiBQYXJzZUFzWERQUGFja2V0X0NvbmZpZyhwWE1MRG9jdW1lbnROb2RlKTsKKyAgICBjYXNlIFhGQV9QYWNrZXRUeXBlOjpUZW1wbGF0ZToKKyAgICAgIHJldHVybiBQYXJzZUFzWERQUGFja2V0X1RlbXBsYXRlKHBYTUxEb2N1bWVudE5vZGUpOworICAgIGNhc2UgWEZBX1BhY2tldFR5cGU6OkZvcm06CisgICAgICByZXR1cm4gUGFyc2VBc1hEUFBhY2tldF9Gb3JtKHBYTUxEb2N1bWVudE5vZGUpOworICAgIGNhc2UgWEZBX1BhY2tldFR5cGU6OkRhdGFzZXRzOgorICAgICAgcmV0dXJuIFBhcnNlQXNYRFBQYWNrZXRfRGF0YShwWE1MRG9jdW1lbnROb2RlKTsKKyAgICBjYXNlIFhGQV9QYWNrZXRUeXBlOjpYZGM6CisgICAgICByZXR1cm4gUGFyc2VBc1hEUFBhY2tldF9YZGMocFhNTERvY3VtZW50Tm9kZSk7CisgICAgY2FzZSBYRkFfUGFja2V0VHlwZTo6TG9jYWxlU2V0OgorICAgICAgcmV0dXJuIFBhcnNlQXNYRFBQYWNrZXRfTG9jYWxlQ29ubmVjdGlvblNvdXJjZVNldCgKKyAgICAgICAgICBwWE1MRG9jdW1lbnROb2RlLCBYRkFfUGFja2V0VHlwZTo6TG9jYWxlU2V0LCBYRkFfRWxlbWVudDo6TG9jYWxlU2V0KTsKKyAgICBjYXNlIFhGQV9QYWNrZXRUeXBlOjpDb25uZWN0aW9uU2V0OgorICAgICAgcmV0dXJuIFBhcnNlQXNYRFBQYWNrZXRfTG9jYWxlQ29ubmVjdGlvblNvdXJjZVNldCgKKyAgICAgICAgICBwWE1MRG9jdW1lbnROb2RlLCBYRkFfUGFja2V0VHlwZTo6Q29ubmVjdGlvblNldCwKKyAgICAgICAgICBYRkFfRWxlbWVudDo6Q29ubmVjdGlvblNldCk7CisgICAgY2FzZSBYRkFfUGFja2V0VHlwZTo6U291cmNlU2V0OgorICAgICAgcmV0dXJuIFBhcnNlQXNYRFBQYWNrZXRfTG9jYWxlQ29ubmVjdGlvblNvdXJjZVNldCgKKyAgICAgICAgICBwWE1MRG9jdW1lbnROb2RlLCBYRkFfUGFja2V0VHlwZTo6U291cmNlU2V0LCBYRkFfRWxlbWVudDo6U291cmNlU2V0KTsKICAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIFBhcnNlQXNYRFBQYWNrZXRfVXNlcihwWE1MRG9jdW1lbnROb2RlLCBlUGFja2V0SUQpOworICAgICAgcmV0dXJuIFBhcnNlQXNYRFBQYWNrZXRfVXNlcihwWE1MRG9jdW1lbnROb2RlKTsKICAgfQogfQogCiBDWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZUFzWERQUGFja2V0X1hEUCgKLSAgICBDRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsCi0gICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpIHsKLSAgaWYgKCFNYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1hEUCktPnBOYW1lLAotICAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9YRFApLT5wVVJJLAotICAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9YRFApLT5lRmxhZ3MpKSB7CisgICAgQ0ZYX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUpIHsKKyAgY29uc3QgUGFja2V0SW5mbyogcGFja2V0ID0gR2V0UGFja2V0QnlJbmRleChYRkFfUGFja2V0VHlwZTo6WGRwKTsKKyAgaWYgKCFNYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsIHBhY2tldC0+bmFtZSwgcGFja2V0LT51cmksCisgICAgICAgICAgICAgICAgICAgICBwYWNrZXQtPmZsYWdzKSkgewogICAgIHJldHVybiBudWxscHRyOwogICB9CisKICAgQ1hGQV9Ob2RlKiBwWEZBUm9vdE5vZGUgPQotICAgICAgbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX1hEUCwgWEZBX0VsZW1lbnQ6OlhmYSk7CisgICAgICBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9QYWNrZXRUeXBlOjpYZHAsIFhGQV9FbGVtZW50OjpYZmEpOwogICBpZiAoIXBYRkFSb290Tm9kZSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAogICBtX3BSb290Tm9kZSA9IHBYRkFSb290Tm9kZTsKLSAgcFhGQVJvb3ROb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIEwieGZhIik7Ci0gIHsKLSAgICBDRkRFX1hNTEVsZW1lbnQqIHBFbGVtZW50ID0gc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4ocFhNTERvY3VtZW50Tm9kZSk7Ci0gICAgaW50MzJfdCBpQXR0cmlidXRlQ291bnQgPSBwRWxlbWVudC0+Q291bnRBdHRyaWJ1dGVzKCk7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUF0dHJpYnV0ZUNvdW50OyBpKyspIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0cmlOYW1lLCB3c0F0dHJpVmFsdWU7Ci0gICAgICBwRWxlbWVudC0+R2V0QXR0cmlidXRlKGksIHdzQXR0cmlOYW1lLCB3c0F0dHJpVmFsdWUpOwotICAgICAgaWYgKHdzQXR0cmlOYW1lID09IEwidXVpZCIpCi0gICAgICAgIHBYRkFSb290Tm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9VdWlkLCB3c0F0dHJpVmFsdWUpOwotICAgICAgZWxzZSBpZiAod3NBdHRyaU5hbWUgPT0gTCJ0aW1lU3RhbXAiKQotICAgICAgICBwWEZBUm9vdE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVGltZVN0YW1wLCB3c0F0dHJpVmFsdWUpOwotICAgIH0KKyAgcFhGQVJvb3ROb2RlLT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpOYW1lLCBMInhmYSIsIGZhbHNlLCBmYWxzZSk7CisKKyAgQ0ZYX1hNTEVsZW1lbnQqIHBFbGVtZW50ID0gc3RhdGljX2Nhc3Q8Q0ZYX1hNTEVsZW1lbnQqPihwWE1MRG9jdW1lbnROb2RlKTsKKyAgZm9yIChhdXRvIGl0IDogcEVsZW1lbnQtPkdldEF0dHJpYnV0ZXMoKSkgeworICAgIGlmIChpdC5maXJzdCA9PSBMInV1aWQiKQorICAgICAgcFhGQVJvb3ROb2RlLT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpVdWlkLCBpdC5zZWNvbmQsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgZWxzZSBpZiAoaXQuZmlyc3QgPT0gTCJ0aW1lU3RhbXAiKQorICAgICAgcFhGQVJvb3ROb2RlLT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpUaW1lU3RhbXAsIGl0LnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKICAgfQogCi0gIENGREVfWE1MTm9kZSogcFhNTENvbmZpZ0RPTVJvb3QgPSBudWxscHRyOworICBDRlhfWE1MTm9kZSogcFhNTENvbmZpZ0RPTVJvb3QgPSBudWxscHRyOwogICBDWEZBX05vZGUqIHBYRkFDb25maWdET01Sb290ID0gbnVsbHB0cjsKLSAgewotICAgIGZvciAoQ0ZERV9YTUxOb2RlKiBwQ2hpbGRJdGVtID0KLSAgICAgICAgICAgICBwWE1MRG9jdW1lbnROb2RlLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOwotICAgICAgICAgcENoaWxkSXRlbTsKLSAgICAgICAgIHBDaGlsZEl0ZW0gPSBwQ2hpbGRJdGVtLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgewotICAgICAgY29uc3QgWEZBX1BBQ0tFVElORk8qIHBQYWNrZXRJbmZvID0KLSAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0NvbmZpZyk7Ci0gICAgICBpZiAoIU1hdGNoTm9kZU5hbWUocENoaWxkSXRlbSwgcFBhY2tldEluZm8tPnBOYW1lLCBwUGFja2V0SW5mby0+cFVSSSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwUGFja2V0SW5mby0+ZUZsYWdzKSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmIChwWEZBUm9vdE5vZGUtPkdldEZpcnN0Q2hpbGRCeU5hbWUocFBhY2tldEluZm8tPnVIYXNoKSkgewotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgIH0KLSAgICAgIHBYTUxDb25maWdET01Sb290ID0gcENoaWxkSXRlbTsKLSAgICAgIHBYRkFDb25maWdET01Sb290ID0KLSAgICAgICAgICBQYXJzZUFzWERQUGFja2V0X0NvbmZpZyhwWE1MQ29uZmlnRE9NUm9vdCwgWEZBX1hEUFBBQ0tFVF9Db25maWcpOworICBmb3IgKENGWF9YTUxOb2RlKiBwQ2hpbGRJdGVtID0KKyAgICAgICAgICAgcFhNTERvY3VtZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZYX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOworICAgICAgIHBDaGlsZEl0ZW07CisgICAgICAgcENoaWxkSXRlbSA9IHBDaGlsZEl0ZW0tPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpOZXh0U2libGluZykpIHsKKyAgICBjb25zdCBQYWNrZXRJbmZvKiBwUGFja2V0SW5mbyA9IEdldFBhY2tldEJ5SW5kZXgoWEZBX1BhY2tldFR5cGU6OkNvbmZpZyk7CisgICAgaWYgKCFNYXRjaE5vZGVOYW1lKHBDaGlsZEl0ZW0sIHBQYWNrZXRJbmZvLT5uYW1lLCBwUGFja2V0SW5mby0+dXJpLAorICAgICAgICAgICAgICAgICAgICAgICBwUGFja2V0SW5mby0+ZmxhZ3MpKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHBYRkFSb290Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZShwUGFja2V0SW5mby0+aGFzaCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIHBYTUxDb25maWdET01Sb290ID0gcENoaWxkSXRlbTsKKyAgICBwWEZBQ29uZmlnRE9NUm9vdCA9IFBhcnNlQXNYRFBQYWNrZXRfQ29uZmlnKHBYTUxDb25maWdET01Sb290KTsKKyAgICBpZiAocFhGQUNvbmZpZ0RPTVJvb3QpCiAgICAgICBwWEZBUm9vdE5vZGUtPkluc2VydENoaWxkKHBYRkFDb25maWdET01Sb290LCBudWxscHRyKTsKLSAgICB9CiAgIH0KIAotICBDRkRFX1hNTE5vZGUqIHBYTUxEYXRhc2V0c0RPTVJvb3QgPSBudWxscHRyOwotICBDRkRFX1hNTE5vZGUqIHBYTUxGb3JtRE9NUm9vdCA9IG51bGxwdHI7Ci0gIENGREVfWE1MTm9kZSogcFhNTFRlbXBsYXRlRE9NUm9vdCA9IG51bGxwdHI7Ci0gIHsKLSAgICBmb3IgKENGREVfWE1MTm9kZSogcENoaWxkSXRlbSA9Ci0gICAgICAgICAgICAgcFhNTERvY3VtZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsKLSAgICAgICAgIHBDaGlsZEl0ZW07Ci0gICAgICAgICBwQ2hpbGRJdGVtID0gcENoaWxkSXRlbS0+R2V0Tm9kZUl0ZW0oQ0ZERV9YTUxOb2RlOjpOZXh0U2libGluZykpIHsKLSAgICAgIGlmICghcENoaWxkSXRlbSB8fCBwQ2hpbGRJdGVtLT5HZXRUeXBlKCkgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkKLSAgICAgICAgY29udGludWU7Ci0gICAgICBpZiAocENoaWxkSXRlbSA9PSBwWE1MQ29uZmlnRE9NUm9vdCkKLSAgICAgICAgY29udGludWU7CisgIENGWF9YTUxOb2RlKiBwWE1MRGF0YXNldHNET01Sb290ID0gbnVsbHB0cjsKKyAgQ0ZYX1hNTE5vZGUqIHBYTUxGb3JtRE9NUm9vdCA9IG51bGxwdHI7CisgIENGWF9YTUxOb2RlKiBwWE1MVGVtcGxhdGVET01Sb290ID0gbnVsbHB0cjsKKyAgZm9yIChDRlhfWE1MTm9kZSogcENoaWxkSXRlbSA9CisgICAgICAgICAgIHBYTUxEb2N1bWVudE5vZGUtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpGaXJzdENoaWxkKTsKKyAgICAgICBwQ2hpbGRJdGVtOworICAgICAgIHBDaGlsZEl0ZW0gPSBwQ2hpbGRJdGVtLT5HZXROb2RlSXRlbShDRlhfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7CisgICAgaWYgKCFwQ2hpbGRJdGVtIHx8IHBDaGlsZEl0ZW0tPkdldFR5cGUoKSAhPSBGWF9YTUxOT0RFX0VsZW1lbnQpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAocENoaWxkSXRlbSA9PSBwWE1MQ29uZmlnRE9NUm9vdCkKKyAgICAgIGNvbnRpbnVlOwogCi0gICAgICBDRkRFX1hNTEVsZW1lbnQqIHBFbGVtZW50ID0KLSAgICAgICAgICByZWludGVycHJldF9jYXN0PENGREVfWE1MRWxlbWVudCo+KHBDaGlsZEl0ZW0pOwotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NQYWNrZXROYW1lOwotICAgICAgcEVsZW1lbnQtPkdldExvY2FsVGFnTmFtZSh3c1BhY2tldE5hbWUpOwotICAgICAgY29uc3QgWEZBX1BBQ0tFVElORk8qIHBQYWNrZXRJbmZvID0KLSAgICAgICAgICBHZXRQYWNrZXRCeU5hbWUod3NQYWNrZXROYW1lLkFzU3RyaW5nQygpKTsKLSAgICAgIGlmIChwUGFja2V0SW5mbyAmJiBwUGFja2V0SW5mby0+cFVSSSkgewotICAgICAgICBpZiAoIU1hdGNoTm9kZU5hbWUocEVsZW1lbnQsIHBQYWNrZXRJbmZvLT5wTmFtZSwgcFBhY2tldEluZm8tPnBVUkksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFja2V0SW5mby0+ZUZsYWdzKSkgewotICAgICAgICAgIHBQYWNrZXRJbmZvID0gbnVsbHB0cjsKLSAgICAgICAgfQorICAgIENGWF9YTUxFbGVtZW50KiBwRWxlbWVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZYX1hNTEVsZW1lbnQqPihwQ2hpbGRJdGVtKTsKKyAgICBXaWRlU3RyaW5nIHdzUGFja2V0TmFtZSA9IHBFbGVtZW50LT5HZXRMb2NhbFRhZ05hbWUoKTsKKyAgICBjb25zdCBQYWNrZXRJbmZvKiBwUGFja2V0SW5mbyA9CisgICAgICAgIEdldFBhY2tldEJ5TmFtZSh3c1BhY2tldE5hbWUuQXNTdHJpbmdWaWV3KCkpOworICAgIGlmIChwUGFja2V0SW5mbyAmJiBwUGFja2V0SW5mby0+dXJpKSB7CisgICAgICBpZiAoIU1hdGNoTm9kZU5hbWUocEVsZW1lbnQsIHBQYWNrZXRJbmZvLT5uYW1lLCBwUGFja2V0SW5mby0+dXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBQYWNrZXRJbmZvLT5mbGFncykpIHsKKyAgICAgICAgcFBhY2tldEluZm8gPSBudWxscHRyOwogICAgICAgfQotICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0ID0KLSAgICAgICAgICBwUGFja2V0SW5mbyA/IHBQYWNrZXRJbmZvLT5lTmFtZSA6IFhGQV9YRFBQQUNLRVRfVVNFUjsKLSAgICAgIGlmIChlUGFja2V0ID09IFhGQV9YRFBQQUNLRVRfWERQKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIGlmIChlUGFja2V0ID09IFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpIHsKLSAgICAgICAgaWYgKHBYTUxEYXRhc2V0c0RPTVJvb3QpCi0gICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIFhGQV9QYWNrZXRUeXBlIGVQYWNrZXQgPQorICAgICAgICBwUGFja2V0SW5mbyA/IHBQYWNrZXRJbmZvLT5wYWNrZXRfdHlwZSA6IFhGQV9QYWNrZXRUeXBlOjpVc2VyOworICAgIGlmIChlUGFja2V0ID09IFhGQV9QYWNrZXRUeXBlOjpYZHApCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoZVBhY2tldCA9PSBYRkFfUGFja2V0VHlwZTo6RGF0YXNldHMpIHsKKyAgICAgIGlmIChwWE1MRGF0YXNldHNET01Sb290KQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKIAotICAgICAgICBwWE1MRGF0YXNldHNET01Sb290ID0gcEVsZW1lbnQ7Ci0gICAgICB9IGVsc2UgaWYgKGVQYWNrZXQgPT0gWEZBX1hEUFBBQ0tFVF9Gb3JtKSB7Ci0gICAgICAgIGlmIChwWE1MRm9ybURPTVJvb3QpCi0gICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICBwWE1MRGF0YXNldHNET01Sb290ID0gcEVsZW1lbnQ7CisgICAgfSBlbHNlIGlmIChlUGFja2V0ID09IFhGQV9QYWNrZXRUeXBlOjpGb3JtKSB7CisgICAgICBpZiAocFhNTEZvcm1ET01Sb290KQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKIAotICAgICAgICBwWE1MRm9ybURPTVJvb3QgPSBwRWxlbWVudDsKLSAgICAgIH0gZWxzZSBpZiAoZVBhY2tldCA9PSBYRkFfWERQUEFDS0VUX1RlbXBsYXRlKSB7Ci0gICAgICAgIGlmIChwWE1MVGVtcGxhdGVET01Sb290KSB7Ci0gICAgICAgICAgLy8gRm91bmQgYSBkdXBsaWNhdGUgdGVtcGxhdGUgcGFja2V0LgorICAgICAgcFhNTEZvcm1ET01Sb290ID0gcEVsZW1lbnQ7CisgICAgfSBlbHNlIGlmIChlUGFja2V0ID09IFhGQV9QYWNrZXRUeXBlOjpUZW1wbGF0ZSkgeworICAgICAgLy8gRm91bmQgYSBkdXBsaWNhdGUgdGVtcGxhdGUgcGFja2V0LgorICAgICAgaWYgKHBYTUxUZW1wbGF0ZURPTVJvb3QpCisgICAgICAgIHJldHVybiBudWxscHRyOworCisgICAgICBDWEZBX05vZGUqIHBQYWNrZXROb2RlID0gUGFyc2VBc1hEUFBhY2tldChwRWxlbWVudCwgZVBhY2tldCk7CisgICAgICBpZiAocFBhY2tldE5vZGUpIHsKKyAgICAgICAgcFhNTFRlbXBsYXRlRE9NUm9vdCA9IHBFbGVtZW50OworICAgICAgICBwWEZBUm9vdE5vZGUtPkluc2VydENoaWxkKHBQYWNrZXROb2RlLCBudWxscHRyKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgQ1hGQV9Ob2RlKiBwUGFja2V0Tm9kZSA9IFBhcnNlQXNYRFBQYWNrZXQocEVsZW1lbnQsIGVQYWNrZXQpOworICAgICAgaWYgKHBQYWNrZXROb2RlKSB7CisgICAgICAgIGlmIChwUGFja2V0SW5mbyAmJgorICAgICAgICAgICAgKHBQYWNrZXRJbmZvLT5mbGFncyAmIFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORSkgJiYKKyAgICAgICAgICAgIHBYRkFSb290Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZShwUGFja2V0SW5mby0+aGFzaCkpIHsKICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICAgICAgfQotICAgICAgICBDWEZBX05vZGUqIHBQYWNrZXROb2RlID0gUGFyc2VBc1hEUFBhY2tldChwRWxlbWVudCwgZVBhY2tldCk7Ci0gICAgICAgIGlmIChwUGFja2V0Tm9kZSkgewotICAgICAgICAgIHBYTUxUZW1wbGF0ZURPTVJvb3QgPSBwRWxlbWVudDsKLSAgICAgICAgICBwWEZBUm9vdE5vZGUtPkluc2VydENoaWxkKHBQYWNrZXROb2RlKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQ1hGQV9Ob2RlKiBwUGFja2V0Tm9kZSA9IFBhcnNlQXNYRFBQYWNrZXQocEVsZW1lbnQsIGVQYWNrZXQpOwotICAgICAgICBpZiAocFBhY2tldE5vZGUpIHsKLSAgICAgICAgICBpZiAocFBhY2tldEluZm8gJiYKLSAgICAgICAgICAgICAgKHBQYWNrZXRJbmZvLT5lRmxhZ3MgJiBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRPTkUpICYmCi0gICAgICAgICAgICAgIHBYRkFSb290Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZShwUGFja2V0SW5mby0+dUhhc2gpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcFhGQVJvb3ROb2RlLT5JbnNlcnRDaGlsZChwUGFja2V0Tm9kZSk7Ci0gICAgICAgIH0KKyAgICAgICAgcFhGQVJvb3ROb2RlLT5JbnNlcnRDaGlsZChwUGFja2V0Tm9kZSwgbnVsbHB0cik7CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgaWYgKCFwWE1MVGVtcGxhdGVET01Sb290KSB7Ci0gICAgLy8gTm8gdGVtcGxhdGUgaXMgZm91bmQuCisgIC8vIE5vIHRlbXBsYXRlIGlzIGZvdW5kLgorICBpZiAoIXBYTUxUZW1wbGF0ZURPTVJvb3QpCiAgICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KKwogICBpZiAocFhNTERhdGFzZXRzRE9NUm9vdCkgewogICAgIENYRkFfTm9kZSogcFBhY2tldE5vZGUgPQotICAgICAgICBQYXJzZUFzWERQUGFja2V0KHBYTUxEYXRhc2V0c0RPTVJvb3QsIFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpOworICAgICAgICBQYXJzZUFzWERQUGFja2V0KHBYTUxEYXRhc2V0c0RPTVJvb3QsIFhGQV9QYWNrZXRUeXBlOjpEYXRhc2V0cyk7CiAgICAgaWYgKHBQYWNrZXROb2RlKQotICAgICAgcFhGQVJvb3ROb2RlLT5JbnNlcnRDaGlsZChwUGFja2V0Tm9kZSk7CisgICAgICBwWEZBUm9vdE5vZGUtPkluc2VydENoaWxkKHBQYWNrZXROb2RlLCBudWxscHRyKTsKICAgfQogICBpZiAocFhNTEZvcm1ET01Sb290KSB7CiAgICAgQ1hGQV9Ob2RlKiBwUGFja2V0Tm9kZSA9Ci0gICAgICAgIFBhcnNlQXNYRFBQYWNrZXQocFhNTEZvcm1ET01Sb290LCBYRkFfWERQUEFDS0VUX0Zvcm0pOworICAgICAgICBQYXJzZUFzWERQUGFja2V0KHBYTUxGb3JtRE9NUm9vdCwgWEZBX1BhY2tldFR5cGU6OkZvcm0pOwogICAgIGlmIChwUGFja2V0Tm9kZSkKLSAgICAgIHBYRkFSb290Tm9kZS0+SW5zZXJ0Q2hpbGQocFBhY2tldE5vZGUpOworICAgICAgcFhGQVJvb3ROb2RlLT5JbnNlcnRDaGlsZChwUGFja2V0Tm9kZSwgbnVsbHB0cik7CiAgIH0KKwogICBwWEZBUm9vdE5vZGUtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxEb2N1bWVudE5vZGUpOwogICByZXR1cm4gcFhGQVJvb3ROb2RlOwogfQogCiBDWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZUFzWERQUGFja2V0X0NvbmZpZygKLSAgICBDRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsCi0gICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpIHsKLSAgaWYgKCFNYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0NvbmZpZyktPnBOYW1lLAotICAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Db25maWcpLT5wVVJJLAotICAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Db25maWcpLT5lRmxhZ3MpKSB7CisgICAgQ0ZYX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUpIHsKKyAgY29uc3QgUGFja2V0SW5mbyogcGFja2V0ID0gR2V0UGFja2V0QnlJbmRleChYRkFfUGFja2V0VHlwZTo6Q29uZmlnKTsKKyAgaWYgKCFNYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsIHBhY2tldC0+bmFtZSwgcGFja2V0LT51cmksCisgICAgICAgICAgICAgICAgICAgICBwYWNrZXQtPmZsYWdzKSkgewogICAgIHJldHVybiBudWxscHRyOwogICB9CiAgIENYRkFfTm9kZSogcE5vZGUgPQotICAgICAgbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX0VsZW1lbnQ6OkNvbmZpZyk7CisgICAgICBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9QYWNrZXRUeXBlOjpDb25maWcsIFhGQV9FbGVtZW50OjpDb25maWcpOwogICBpZiAoIXBOb2RlKQogICAgIHJldHVybiBudWxscHRyOwogCi0gIHBOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgICAgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0NvbmZpZyktPnBOYW1lKTsKLSAgaWYgKCFOb3JtYWxMb2FkZXIocE5vZGUsIHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCwgdHJ1ZSkpCisgIHBOb2RlLT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpOYW1lLCBwYWNrZXQtPm5hbWUsIGZhbHNlLCBmYWxzZSk7CisgIGlmICghTm9ybWFsTG9hZGVyKHBOb2RlLCBwWE1MRG9jdW1lbnROb2RlLCBYRkFfUGFja2V0VHlwZTo6Q29uZmlnLCB0cnVlKSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAogICBwTm9kZS0+U2V0WE1MTWFwcGluZ05vZGUocFhNTERvY3VtZW50Tm9kZSk7CiAgIHJldHVybiBwTm9kZTsKIH0KIAotQ1hGQV9Ob2RlKiBDWEZBX1NpbXBsZVBhcnNlcjo6UGFyc2VBc1hEUFBhY2tldF9UZW1wbGF0ZUZvcm0oCi0gICAgQ0ZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLAotICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKSB7Ci0gIENYRkFfTm9kZSogcE5vZGUgPSBudWxscHRyOwotICBpZiAoZVBhY2tldElEID09IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUpIHsKLSAgICBpZiAoTWF0Y2hOb2RlTmFtZShwWE1MRG9jdW1lbnROb2RlLAotICAgICAgICAgICAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfVGVtcGxhdGUpLT5wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1RlbXBsYXRlKS0+cFVSSSwKLSAgICAgICAgICAgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1RlbXBsYXRlKS0+ZUZsYWdzKSkgewotICAgICAgcE5vZGUgPQotICAgICAgICAgIG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSwgWEZBX0VsZW1lbnQ6OlRlbXBsYXRlKTsKLSAgICAgIGlmICghcE5vZGUpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotCi0gICAgICBwTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLAotICAgICAgICAgICAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfVGVtcGxhdGUpLT5wTmFtZSk7Ci0gICAgICBpZiAobV9iRG9jdW1lbnRQYXJzZXIpIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lc3BhY2VVUkk7Ci0gICAgICAgIENGREVfWE1MRWxlbWVudCogcFhNTERvY3VtZW50RWxlbWVudCA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwWE1MRG9jdW1lbnROb2RlKTsKLSAgICAgICAgcFhNTERvY3VtZW50RWxlbWVudC0+R2V0TmFtZXNwYWNlVVJJKHdzTmFtZXNwYWNlVVJJKTsKLSAgICAgICAgaWYgKHdzTmFtZXNwYWNlVVJJLklzRW1wdHkoKSkKLSAgICAgICAgICBwWE1MRG9jdW1lbnRFbGVtZW50LT5HZXRTdHJpbmcoTCJ4bWxuczp4ZmEiLCB3c05hbWVzcGFjZVVSSSk7Ci0KLSAgICAgICAgcE5vZGUtPkdldERvY3VtZW50KCktPlJlY29nbml6ZVhGQVZlcnNpb25OdW1iZXIod3NOYW1lc3BhY2VVUkkpOwotICAgICAgfQotICAgICAgaWYgKCFOb3JtYWxMb2FkZXIocE5vZGUsIHBYTUxEb2N1bWVudE5vZGUsIGVQYWNrZXRJRCwgdHJ1ZSkpCi0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgfSBlbHNlIGlmIChlUGFja2V0SUQgPT0gWEZBX1hEUFBBQ0tFVF9Gb3JtKSB7Ci0gICAgaWYgKE1hdGNoTm9kZU5hbWUocFhNTERvY3VtZW50Tm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0Zvcm0pLT5wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0Zvcm0pLT5wVVJJLAotICAgICAgICAgICAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfRm9ybSktPmVGbGFncykpIHsKLSAgICAgIENGREVfWE1MRWxlbWVudCogcFhNTERvY3VtZW50RWxlbWVudCA9Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4ocFhNTERvY3VtZW50Tm9kZSk7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c0NoZWNrc3VtOwotICAgICAgcFhNTERvY3VtZW50RWxlbWVudC0+R2V0U3RyaW5nKEwiY2hlY2tzdW0iLCB3c0NoZWNrc3VtKTsKLSAgICAgIGlmICh3c0NoZWNrc3VtLkdldExlbmd0aCgpICE9IDI4IHx8Ci0gICAgICAgICAgbV9wWE1MUGFyc2VyLT5tX2R3Q2hlY2tTdGF0dXMgIT0gMHgwMykgewotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgIH0KLSAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0NoZWNrc3VtQ29udGV4dD4gcENoZWNrc3VtKG5ldyBDWEZBX0NoZWNrc3VtQ29udGV4dCk7Ci0gICAgICBwQ2hlY2tzdW0tPlN0YXJ0Q2hlY2tzdW0oKTsKLSAgICAgIHBDaGVja3N1bS0+VXBkYXRlQ2hlY2tzdW0obV9wRmlsZVJlYWQsIG1fcFhNTFBhcnNlci0+bV9uU3RhcnRbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFhNTFBhcnNlci0+bV9uU2l6ZVswXSk7Ci0gICAgICBwQ2hlY2tzdW0tPlVwZGF0ZUNoZWNrc3VtKG1fcEZpbGVSZWFkLCBtX3BYTUxQYXJzZXItPm1fblN0YXJ0WzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BYTUxQYXJzZXItPm1fblNpemVbMV0pOwotICAgICAgcENoZWNrc3VtLT5GaW5pc2hDaGVja3N1bSgpOwotICAgICAgQ0ZYX0J5dGVTdHJpbmcgYnNDaGVjayA9IHBDaGVja3N1bS0+R2V0Q2hlY2tzdW0oKTsKLSAgICAgIGlmIChic0NoZWNrICE9IHdzQ2hlY2tzdW0uVVRGOEVuY29kZSgpKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgICAgcE5vZGUgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX0VsZW1lbnQ6OkZvcm0pOwotICAgICAgaWYgKCFwTm9kZSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICAgIHBOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Gb3JtKS0+cE5hbWUpOwotICAgICAgcE5vZGUtPlNldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NoZWNrc3VtLCB3c0NoZWNrc3VtLkFzU3RyaW5nQygpKTsKLSAgICAgIENYRkFfTm9kZSogcFRlbXBsYXRlUm9vdCA9Ci0gICAgICAgICAgbV9wUm9vdE5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpUZW1wbGF0ZSk7Ci0gICAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZUNob3NlbiA9Ci0gICAgICAgICAgcFRlbXBsYXRlUm9vdAotICAgICAgICAgICAgICA/IHBUZW1wbGF0ZVJvb3QtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpTdWJmb3JtKQotICAgICAgICAgICAgICA6IG51bGxwdHI7Ci0gICAgICBib29sIGJVc2VBdHRyaWJ1dGUgPSB0cnVlOwotICAgICAgaWYgKHBUZW1wbGF0ZUNob3NlbiAmJgotICAgICAgICAgIHBUZW1wbGF0ZUNob3Nlbi0+R2V0RW51bShYRkFfQVRUUklCVVRFX1Jlc3RvcmVTdGF0ZSkgIT0KLSAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fQXV0bykgewotICAgICAgICBiVXNlQXR0cmlidXRlID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoIU5vcm1hbExvYWRlcihwTm9kZSwgcFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElELCBiVXNlQXR0cmlidXRlKSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQorQ1hGQV9Ob2RlKiBDWEZBX1NpbXBsZVBhcnNlcjo6UGFyc2VBc1hEUFBhY2tldF9UZW1wbGF0ZSgKKyAgICBDRlhfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSkgeworICBjb25zdCBQYWNrZXRJbmZvKiBwYWNrZXQgPSBHZXRQYWNrZXRCeUluZGV4KFhGQV9QYWNrZXRUeXBlOjpUZW1wbGF0ZSk7CisgIGlmICghTWF0Y2hOb2RlTmFtZShwWE1MRG9jdW1lbnROb2RlLCBwYWNrZXQtPm5hbWUsIHBhY2tldC0+dXJpLAorICAgICAgICAgICAgICAgICAgICAgcGFja2V0LT5mbGFncykpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKICAgfQotICBpZiAocE5vZGUpCi0gICAgcE5vZGUtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxEb2N1bWVudE5vZGUpOwogCisgIENYRkFfTm9kZSogcE5vZGUgPQorICAgICAgbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfUGFja2V0VHlwZTo6VGVtcGxhdGUsIFhGQV9FbGVtZW50OjpUZW1wbGF0ZSk7CisgIGlmICghcE5vZGUpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgcE5vZGUtPkpTT2JqZWN0KCktPlNldENEYXRhKFhGQV9BdHRyaWJ1dGU6Ok5hbWUsIHBhY2tldC0+bmFtZSwgZmFsc2UsIGZhbHNlKTsKKyAgaWYgKG1fYkRvY3VtZW50UGFyc2VyKSB7CisgICAgQ0ZYX1hNTEVsZW1lbnQqIHBYTUxEb2N1bWVudEVsZW1lbnQgPQorICAgICAgICBzdGF0aWNfY2FzdDxDRlhfWE1MRWxlbWVudCo+KHBYTUxEb2N1bWVudE5vZGUpOworICAgIFdpZGVTdHJpbmcgd3NOYW1lc3BhY2VVUkkgPSBwWE1MRG9jdW1lbnRFbGVtZW50LT5HZXROYW1lc3BhY2VVUkkoKTsKKyAgICBpZiAod3NOYW1lc3BhY2VVUkkuSXNFbXB0eSgpKQorICAgICAgd3NOYW1lc3BhY2VVUkkgPSBwWE1MRG9jdW1lbnRFbGVtZW50LT5HZXRTdHJpbmcoTCJ4bWxuczp4ZmEiKTsKKworICAgIHBOb2RlLT5HZXREb2N1bWVudCgpLT5SZWNvZ25pemVYRkFWZXJzaW9uTnVtYmVyKHdzTmFtZXNwYWNlVVJJKTsKKyAgfQorICBpZiAoIU5vcm1hbExvYWRlcihwTm9kZSwgcFhNTERvY3VtZW50Tm9kZSwgWEZBX1BhY2tldFR5cGU6OlRlbXBsYXRlLCB0cnVlKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBwTm9kZS0+U2V0WE1MTWFwcGluZ05vZGUocFhNTERvY3VtZW50Tm9kZSk7CisgIHJldHVybiBwTm9kZTsKK30KKworQ1hGQV9Ob2RlKiBDWEZBX1NpbXBsZVBhcnNlcjo6UGFyc2VBc1hEUFBhY2tldF9Gb3JtKAorICAgIENGWF9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlKSB7CisgIGNvbnN0IFBhY2tldEluZm8qIHBhY2tldCA9IEdldFBhY2tldEJ5SW5kZXgoWEZBX1BhY2tldFR5cGU6OkZvcm0pOworICBpZiAoIU1hdGNoTm9kZU5hbWUocFhNTERvY3VtZW50Tm9kZSwgcGFja2V0LT5uYW1lLCBwYWNrZXQtPnVyaSwKKyAgICAgICAgICAgICAgICAgICAgIHBhY2tldC0+ZmxhZ3MpKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBDRlhfWE1MRWxlbWVudCogcFhNTERvY3VtZW50RWxlbWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxDRlhfWE1MRWxlbWVudCo+KHBYTUxEb2N1bWVudE5vZGUpOworICBXaWRlU3RyaW5nIHdzQ2hlY2tzdW0gPSBwWE1MRG9jdW1lbnRFbGVtZW50LT5HZXRTdHJpbmcoTCJjaGVja3N1bSIpOworICBpZiAod3NDaGVja3N1bS5HZXRMZW5ndGgoKSAhPSAyOCB8fCBtX3BYTUxQYXJzZXItPm1fZHdDaGVja1N0YXR1cyAhPSAweDAzKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBhdXRvIHBDaGVja3N1bSA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfQ2hlY2tzdW1Db250ZXh0PigpOworICBwQ2hlY2tzdW0tPlN0YXJ0Q2hlY2tzdW0oKTsKKyAgcENoZWNrc3VtLT5VcGRhdGVDaGVja3N1bShtX3BGaWxlUmVhZCwgbV9wWE1MUGFyc2VyLT5tX25TdGFydFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3BYTUxQYXJzZXItPm1fblNpemVbMF0pOworICBwQ2hlY2tzdW0tPlVwZGF0ZUNoZWNrc3VtKG1fcEZpbGVSZWFkLCBtX3BYTUxQYXJzZXItPm1fblN0YXJ0WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcFhNTFBhcnNlci0+bV9uU2l6ZVsxXSk7CisgIHBDaGVja3N1bS0+RmluaXNoQ2hlY2tzdW0oKTsKKyAgQnl0ZVN0cmluZyBic0NoZWNrID0gcENoZWNrc3VtLT5HZXRDaGVja3N1bSgpOworICBpZiAoYnNDaGVjayAhPSB3c0NoZWNrc3VtLlVURjhFbmNvZGUoKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBDWEZBX05vZGUqIHBOb2RlID0KKyAgICAgIG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1BhY2tldFR5cGU6OkZvcm0sIFhGQV9FbGVtZW50OjpGb3JtKTsKKyAgaWYgKCFwTm9kZSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBwTm9kZS0+SlNPYmplY3QoKS0+U2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6TmFtZSwgcGFja2V0LT5uYW1lLCBmYWxzZSwgZmFsc2UpOworICBwTm9kZS0+SlNPYmplY3QoKS0+U2V0QXR0cmlidXRlKFhGQV9BdHRyaWJ1dGU6OkNoZWNrc3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzQ2hlY2tzdW0uQXNTdHJpbmdWaWV3KCksIGZhbHNlKTsKKyAgQ1hGQV9UZW1wbGF0ZSogcFRlbXBsYXRlUm9vdCA9CisgICAgICBtX3BSb290Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9UZW1wbGF0ZT4oWEZBX0VsZW1lbnQ6OlRlbXBsYXRlKTsKKyAgQ1hGQV9TdWJmb3JtKiBwVGVtcGxhdGVDaG9zZW4gPQorICAgICAgcFRlbXBsYXRlUm9vdCA/IHBUZW1wbGF0ZVJvb3QtPkdldEZpcnN0Q2hpbGRCeUNsYXNzPENYRkFfU3ViZm9ybT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpTdWJmb3JtKQorICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHI7CisgIGJvb2wgYlVzZUF0dHJpYnV0ZSA9IHRydWU7CisgIGlmIChwVGVtcGxhdGVDaG9zZW4gJiYKKyAgICAgIHBUZW1wbGF0ZUNob3Nlbi0+SlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpSZXN0b3JlU3RhdGUpICE9CisgICAgICAgICAgWEZBX0F0dHJpYnV0ZUVudW06OkF1dG8pIHsKKyAgICBiVXNlQXR0cmlidXRlID0gZmFsc2U7CisgIH0KKyAgaWYgKCFOb3JtYWxMb2FkZXIocE5vZGUsIHBYTUxEb2N1bWVudE5vZGUsIFhGQV9QYWNrZXRUeXBlOjpGb3JtLAorICAgICAgICAgICAgICAgICAgICBiVXNlQXR0cmlidXRlKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICBwTm9kZS0+U2V0WE1MTWFwcGluZ05vZGUocFhNTERvY3VtZW50Tm9kZSk7CiAgIHJldHVybiBwTm9kZTsKIH0KIAogQ1hGQV9Ob2RlKiBDWEZBX1NpbXBsZVBhcnNlcjo6UGFyc2VBc1hEUFBhY2tldF9EYXRhKAotICAgIENGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwKLSAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkgewotICBDRkRFX1hNTE5vZGUqIHBEYXRhc2V0c1hNTE5vZGUgPSBHZXREYXRhU2V0c0Zyb21YRFAocFhNTERvY3VtZW50Tm9kZSk7CisgICAgQ0ZYX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUpIHsKKyAgQ0ZYX1hNTE5vZGUqIHBEYXRhc2V0c1hNTE5vZGUgPSBHZXREYXRhU2V0c0Zyb21YRFAocFhNTERvY3VtZW50Tm9kZSk7CisgIGNvbnN0IFBhY2tldEluZm8qIHBhY2tldCA9IEdldFBhY2tldEJ5SW5kZXgoWEZBX1BhY2tldFR5cGU6OkRhdGFzZXRzKTsKICAgaWYgKHBEYXRhc2V0c1hNTE5vZGUpIHsKLSAgICBDWEZBX05vZGUqIHBOb2RlID0KLSAgICAgICAgbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0RhdGFzZXRzLCBYRkFfRWxlbWVudDo6RGF0YU1vZGVsKTsKKyAgICBDWEZBX05vZGUqIHBOb2RlID0gbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfUGFja2V0VHlwZTo6RGF0YXNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkRhdGFNb2RlbCk7CiAgICAgaWYgKCFwTm9kZSkKICAgICAgIHJldHVybiBudWxscHRyOwogCi0gICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9EYXRhc2V0cyktPnBOYW1lKTsKKyAgICBwTm9kZS0+SlNPYmplY3QoKS0+U2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6TmFtZSwgcGFja2V0LT5uYW1lLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgIGlmICghRGF0YUxvYWRlcihwTm9kZSwgcERhdGFzZXRzWE1MTm9kZSwgZmFsc2UpKQogICAgICAgcmV0dXJuIG51bGxwdHI7CiAKQEAgLTcxOSwyMyArNzUxLDIxIEBACiAgICAgcmV0dXJuIHBOb2RlOwogICB9CiAKLSAgQ0ZERV9YTUxOb2RlKiBwRGF0YVhNTE5vZGUgPSBudWxscHRyOwotICBpZiAoTWF0Y2hOb2RlTmFtZShwWE1MRG9jdW1lbnROb2RlLCBMImRhdGEiLAotICAgICAgICAgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0RhdGFzZXRzKS0+cFVSSSwKLSAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9EYXRhc2V0cyktPmVGbGFncykpIHsKLSAgICBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwWE1MRG9jdW1lbnROb2RlKQorICBDRlhfWE1MTm9kZSogcERhdGFYTUxOb2RlID0gbnVsbHB0cjsKKyAgaWYgKE1hdGNoTm9kZU5hbWUocFhNTERvY3VtZW50Tm9kZSwgTCJkYXRhIiwgcGFja2V0LT51cmksIHBhY2tldC0+ZmxhZ3MpKSB7CisgICAgc3RhdGljX2Nhc3Q8Q0ZYX1hNTEVsZW1lbnQqPihwWE1MRG9jdW1lbnROb2RlKQogICAgICAgICAtPlJlbW92ZUF0dHJpYnV0ZShMInhtbG5zOnhmYSIpOwogICAgIHBEYXRhWE1MTm9kZSA9IHBYTUxEb2N1bWVudE5vZGU7CiAgIH0gZWxzZSB7Ci0gICAgQ0ZERV9YTUxFbGVtZW50KiBwRGF0YUVsZW1lbnQgPSBuZXcgQ0ZERV9YTUxFbGVtZW50KEwieGZhOmRhdGEiKTsKLSAgICBDRkRFX1hNTE5vZGUqIHBQYXJlbnRYTUxOb2RlID0KLSAgICAgICAgcFhNTERvY3VtZW50Tm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZERV9YTUxOb2RlOjpQYXJlbnQpOworICAgIENGWF9YTUxFbGVtZW50KiBwRGF0YUVsZW1lbnQgPSBuZXcgQ0ZYX1hNTEVsZW1lbnQoTCJ4ZmE6ZGF0YSIpOworICAgIENGWF9YTUxOb2RlKiBwUGFyZW50WE1MTm9kZSA9CisgICAgICAgIHBYTUxEb2N1bWVudE5vZGUtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpQYXJlbnQpOwogICAgIGlmIChwUGFyZW50WE1MTm9kZSkKICAgICAgIHBQYXJlbnRYTUxOb2RlLT5SZW1vdmVDaGlsZE5vZGUocFhNTERvY3VtZW50Tm9kZSk7CiAKLSAgICBBU1NFUlQocFhNTERvY3VtZW50Tm9kZS0+R2V0VHlwZSgpID09IEZERV9YTUxOT0RFX0VsZW1lbnQpOwotICAgIGlmIChwWE1MRG9jdW1lbnROb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgewotICAgICAgc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4ocFhNTERvY3VtZW50Tm9kZSkKKyAgICBBU1NFUlQocFhNTERvY3VtZW50Tm9kZS0+R2V0VHlwZSgpID09IEZYX1hNTE5PREVfRWxlbWVudCk7CisgICAgaWYgKHBYTUxEb2N1bWVudE5vZGUtPkdldFR5cGUoKSA9PSBGWF9YTUxOT0RFX0VsZW1lbnQpIHsKKyAgICAgIHN0YXRpY19jYXN0PENGWF9YTUxFbGVtZW50Kj4ocFhNTERvY3VtZW50Tm9kZSkKICAgICAgICAgICAtPlJlbW92ZUF0dHJpYnV0ZShMInhtbG5zOnhmYSIpOwogICAgIH0KICAgICBwRGF0YUVsZW1lbnQtPkluc2VydENoaWxkTm9kZShwWE1MRG9jdW1lbnROb2RlKTsKQEAgLTc0MywxNiArNzczLDE2IEBACiAgIH0KIAogICBpZiAocERhdGFYTUxOb2RlKSB7Ci0gICAgQ1hGQV9Ob2RlKiBwTm9kZSA9Ci0gICAgICAgIG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgWEZBX0VsZW1lbnQ6OkRhdGFHcm91cCk7CisgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1BhY2tldFR5cGU6OkRhdGFzZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpEYXRhR3JvdXApOwogICAgIGlmICghcE5vZGUpIHsKICAgICAgIGlmIChwRGF0YVhNTE5vZGUgIT0gcFhNTERvY3VtZW50Tm9kZSkKICAgICAgICAgZGVsZXRlIHBEYXRhWE1MTm9kZTsKICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0xvY2FsTmFtZTsKLSAgICBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwRGF0YVhNTE5vZGUpLT5HZXRMb2NhbFRhZ05hbWUod3NMb2NhbE5hbWUpOwotICAgIHBOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTG9jYWxOYW1lKTsKKyAgICBXaWRlU3RyaW5nIHdzTG9jYWxOYW1lID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZYX1hNTEVsZW1lbnQqPihwRGF0YVhNTE5vZGUpLT5HZXRMb2NhbFRhZ05hbWUoKTsKKyAgICBwTm9kZS0+SlNPYmplY3QoKS0+U2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6TmFtZSwgd3NMb2NhbE5hbWUsIGZhbHNlLCBmYWxzZSk7CiAgICAgaWYgKCFEYXRhTG9hZGVyKHBOb2RlLCBwRGF0YVhNTE5vZGUsIHRydWUpKQogICAgICAgcmV0dXJuIG51bGxwdHI7CiAKQEAgLTc2NSw5MSArNzk1LDU0IEBACiB9CiAKIENYRkFfTm9kZSogQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlQXNYRFBQYWNrZXRfTG9jYWxlQ29ubmVjdGlvblNvdXJjZVNldCgKLSAgICBDRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsCi0gICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpIHsKLSAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG51bGxwdHI7Ci0gIGlmIChlUGFja2V0SUQgPT0gWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQpIHsKLSAgICBpZiAoTWF0Y2hOb2RlTmFtZShwWE1MRG9jdW1lbnROb2RlLAotICAgICAgICAgICAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfTG9jYWxlU2V0KS0+cE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Mb2NhbGVTZXQpLT5wVVJJLAotICAgICAgICAgICAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfTG9jYWxlU2V0KS0+ZUZsYWdzKSkgewotICAgICAgcE5vZGUgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpMb2NhbGVTZXQpOwotICAgICAgaWYgKCFwTm9kZSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgICAgIHBOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Mb2NhbGVTZXQpLT5wTmFtZSk7Ci0gICAgICBpZiAoIU5vcm1hbExvYWRlcihwTm9kZSwgcFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElELCB0cnVlKSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICB9IGVsc2UgaWYgKGVQYWNrZXRJRCA9PSBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQpIHsKLSAgICBpZiAoTWF0Y2hOb2RlTmFtZShwWE1MRG9jdW1lbnROb2RlLAotICAgICAgICAgICAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfQ29ubmVjdGlvblNldCktPnBOYW1lLAotICAgICAgICAgICAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfQ29ubmVjdGlvblNldCktPnBVUkksCi0gICAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Db25uZWN0aW9uU2V0KS0+ZUZsYWdzKSkgewotICAgICAgcE5vZGUgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6Q29ubmVjdGlvblNldCk7Ci0gICAgICBpZiAoIXBOb2RlKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX0Nvbm5lY3Rpb25TZXQpLT5wTmFtZSk7Ci0gICAgICBpZiAoIU5vcm1hbExvYWRlcihwTm9kZSwgcFhNTERvY3VtZW50Tm9kZSwgZVBhY2tldElELCB0cnVlKSkKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICB9IGVsc2UgaWYgKGVQYWNrZXRJRCA9PSBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCkgewotICAgIGlmIChNYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Tb3VyY2VTZXQpLT5wTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1NvdXJjZVNldCktPnBVUkksCi0gICAgICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9Tb3VyY2VTZXQpLT5lRmxhZ3MpKSB7Ci0gICAgICBwTm9kZSA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlNvdXJjZVNldCk7Ci0gICAgICBpZiAoIXBOb2RlKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLQotICAgICAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1NvdXJjZVNldCktPnBOYW1lKTsKLSAgICAgIGlmICghTm9ybWFsTG9hZGVyKHBOb2RlLCBwWE1MRG9jdW1lbnROb2RlLCBlUGFja2V0SUQsIHRydWUpKQotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9CisgICAgQ0ZYX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsCisgICAgWEZBX1BhY2tldFR5cGUgcGFja2V0X3R5cGUsCisgICAgWEZBX0VsZW1lbnQgZWxlbWVudCkgeworICBjb25zdCBQYWNrZXRJbmZvKiBwYWNrZXQgPSBHZXRQYWNrZXRCeUluZGV4KHBhY2tldF90eXBlKTsKKyAgaWYgKCFNYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsIHBhY2tldC0+bmFtZSwgcGFja2V0LT51cmksCisgICAgICAgICAgICAgICAgICAgICBwYWNrZXQtPmZsYWdzKSkgeworICAgIHJldHVybiBudWxscHRyOwogICB9Ci0gIGlmIChwTm9kZSkKLSAgICBwTm9kZS0+U2V0WE1MTWFwcGluZ05vZGUocFhNTERvY3VtZW50Tm9kZSk7CisKKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUocGFja2V0X3R5cGUsIGVsZW1lbnQpOworICBpZiAoIXBOb2RlKQorICAgIHJldHVybiBudWxscHRyOworCisgIHBOb2RlLT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpOYW1lLCBwYWNrZXQtPm5hbWUsIGZhbHNlLCBmYWxzZSk7CisgIGlmICghTm9ybWFsTG9hZGVyKHBOb2RlLCBwWE1MRG9jdW1lbnROb2RlLCBwYWNrZXRfdHlwZSwgdHJ1ZSkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgcE5vZGUtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxEb2N1bWVudE5vZGUpOwogICByZXR1cm4gcE5vZGU7CiB9CiAKIENYRkFfTm9kZSogQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlQXNYRFBQYWNrZXRfWGRjKAotICAgIENGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwKLSAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkgewotICBpZiAoIU1hdGNoTm9kZU5hbWUocFhNTERvY3VtZW50Tm9kZSwKLSAgICAgICAgICAgICAgICAgICAgIFhGQV9HZXRQYWNrZXRCeUluZGV4KFhGQV9QQUNLRVRfWGRjKS0+cE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1hkYyktPnBVUkksCi0gICAgICAgICAgICAgICAgICAgICBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUX1hkYyktPmVGbGFncykpCisgICAgQ0ZYX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUpIHsKKyAgY29uc3QgUGFja2V0SW5mbyogcGFja2V0ID0gR2V0UGFja2V0QnlJbmRleChYRkFfUGFja2V0VHlwZTo6WGRjKTsKKyAgaWYgKCFNYXRjaE5vZGVOYW1lKHBYTUxEb2N1bWVudE5vZGUsIHBhY2tldC0+bmFtZSwgcGFja2V0LT51cmksCisgICAgICAgICAgICAgICAgICAgICBwYWNrZXQtPmZsYWdzKSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAogICBDWEZBX05vZGUqIHBOb2RlID0KLSAgICAgIG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9YZGMsIFhGQV9FbGVtZW50OjpYZGMpOworICAgICAgbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfUGFja2V0VHlwZTo6WGRjLCBYRkFfRWxlbWVudDo6WGRjKTsKICAgaWYgKCFwTm9kZSkKICAgICByZXR1cm4gbnVsbHB0cjsKIAotICBwTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLAotICAgICAgICAgICAgICAgICAgWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVF9YZGMpLT5wTmFtZSk7CisgIHBOb2RlLT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpOYW1lLCBwYWNrZXQtPm5hbWUsIGZhbHNlLCBmYWxzZSk7CiAgIHBOb2RlLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MRG9jdW1lbnROb2RlKTsKICAgcmV0dXJuIHBOb2RlOwogfQogCiBDWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZUFzWERQUGFja2V0X1VzZXIoCi0gICAgQ0ZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLAotICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKSB7CisgICAgQ0ZYX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUpIHsKICAgQ1hGQV9Ob2RlKiBwTm9kZSA9Ci0gICAgICBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfWERQLCBYRkFfRWxlbWVudDo6UGFja2V0KTsKKyAgICAgIG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1BhY2tldFR5cGU6OlhkcCwgWEZBX0VsZW1lbnQ6OlBhY2tldCk7CiAgIGlmICghcE5vZGUpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOwotICBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwWE1MRG9jdW1lbnROb2RlKS0+R2V0TG9jYWxUYWdOYW1lKHdzTmFtZSk7Ci0gIHBOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7CisgIFdpZGVTdHJpbmcgd3NOYW1lID0KKyAgICAgIHN0YXRpY19jYXN0PENGWF9YTUxFbGVtZW50Kj4ocFhNTERvY3VtZW50Tm9kZSktPkdldExvY2FsVGFnTmFtZSgpOworICBwTm9kZS0+SlNPYmplY3QoKS0+U2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6TmFtZSwgd3NOYW1lLCBmYWxzZSwgZmFsc2UpOwogICBpZiAoIVVzZXJQYWNrZXRMb2FkZXIocE5vZGUsIHBYTUxEb2N1bWVudE5vZGUpKQogICAgIHJldHVybiBudWxscHRyOwogCkBAIC04NTgsNzUgKzg1MSw3MSBAQAogfQogCiBDWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpVc2VyUGFja2V0TG9hZGVyKENYRkFfTm9kZSogcFhGQU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGREVfWE1MTm9kZSogcFhNTERvYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfWE1MTm9kZSogcFhNTERvYykgewogICByZXR1cm4gcFhGQU5vZGU7CiB9CiAKIENYRkFfTm9kZSogQ1hGQV9TaW1wbGVQYXJzZXI6OkRhdGFMb2FkZXIoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9YTUxOb2RlKiBwWE1MRG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfWE1MTm9kZSogcFhNTERvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRG9UcmFuc2Zvcm0pIHsKLSAgUGFyc2VEYXRhR3JvdXAocFhGQU5vZGUsIHBYTUxEb2MsIFhGQV9YRFBQQUNLRVRfRGF0YXNldHMpOworICBQYXJzZURhdGFHcm91cChwWEZBTm9kZSwgcFhNTERvYywgWEZBX1BhY2tldFR5cGU6OkRhdGFzZXRzKTsKICAgcmV0dXJuIHBYRkFOb2RlOwogfQogCiBDWEZBX05vZGUqIENYRkFfU2ltcGxlUGFyc2VyOjpOb3JtYWxMb2FkZXIoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1hNTE5vZGUqIHBYTUxEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1hNTE5vZGUqIHBYTUxEb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgZVBhY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlVzZUF0dHJpYnV0ZSkgewogICBib29sIGJPbmVPZlByb3BlcnR5Rm91bmQgPSBmYWxzZTsKLSAgZm9yIChDRkRFX1hNTE5vZGUqIHBYTUxDaGlsZCA9IHBYTUxEb2MtPkdldE5vZGVJdGVtKENGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7CisgIGZvciAoQ0ZYX1hNTE5vZGUqIHBYTUxDaGlsZCA9IHBYTUxEb2MtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpGaXJzdENoaWxkKTsKICAgICAgICBwWE1MQ2hpbGQ7Ci0gICAgICAgcFhNTENoaWxkID0gcFhNTENoaWxkLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgeworICAgICAgIHBYTUxDaGlsZCA9IHBYTUxDaGlsZC0+R2V0Tm9kZUl0ZW0oQ0ZYX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgewogICAgIHN3aXRjaCAocFhNTENoaWxkLT5HZXRUeXBlKCkpIHsKLSAgICAgIGNhc2UgRkRFX1hNTE5PREVfRWxlbWVudDogewotICAgICAgICBDRkRFX1hNTEVsZW1lbnQqIHBYTUxFbGVtZW50ID0gc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4ocFhNTENoaWxkKTsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUYWdOYW1lOwotICAgICAgICBwWE1MRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKHdzVGFnTmFtZSk7Ci0gICAgICAgIFhGQV9FbGVtZW50IGVUeXBlID0gWEZBX0dldEVsZW1lbnRUeXBlRm9yTmFtZSh3c1RhZ05hbWUuQXNTdHJpbmdDKCkpOworICAgICAgY2FzZSBGWF9YTUxOT0RFX0VsZW1lbnQ6IHsKKyAgICAgICAgQ0ZYX1hNTEVsZW1lbnQqIHBYTUxFbGVtZW50ID0gc3RhdGljX2Nhc3Q8Q0ZYX1hNTEVsZW1lbnQqPihwWE1MQ2hpbGQpOworICAgICAgICBXaWRlU3RyaW5nIHdzVGFnTmFtZSA9IHBYTUxFbGVtZW50LT5HZXRMb2NhbFRhZ05hbWUoKTsKKyAgICAgICAgWEZBX0VsZW1lbnQgZVR5cGUgPSBDWEZBX05vZGU6Ok5hbWVUb0VsZW1lbnQod3NUYWdOYW1lKTsKICAgICAgICAgaWYgKGVUeXBlID09IFhGQV9FbGVtZW50OjpVbmtub3duKQogICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIGNvbnN0IFhGQV9QUk9QRVJUWSogcFByb3BlcnR5SW5mbyA9IFhGQV9HZXRQcm9wZXJ0eU9mRWxlbWVudCgKLSAgICAgICAgICAgIHBYRkFOb2RlLT5HZXRFbGVtZW50VHlwZSgpLCBlVHlwZSwgZVBhY2tldElEKTsKLSAgICAgICAgaWYgKHBQcm9wZXJ0eUluZm8gJiYKLSAgICAgICAgICAgICgocFByb3BlcnR5SW5mby0+dUZsYWdzICYKLSAgICAgICAgICAgICAgKFhGQV9QUk9QRVJUWUZMQUdfT25lT2YgfCBYRkFfUFJPUEVSVFlGTEFHX0RlZmF1bHRPbmVPZikpICE9IDApKSB7CisgICAgICAgIGlmIChwWEZBTm9kZS0+SGFzUHJvcGVydHlGbGFncygKKyAgICAgICAgICAgICAgICBlVHlwZSwKKyAgICAgICAgICAgICAgICBYRkFfUFJPUEVSVFlGTEFHX09uZU9mIHwgWEZBX1BST1BFUlRZRkxBR19EZWZhdWx0T25lT2YpKSB7CiAgICAgICAgICAgaWYgKGJPbmVPZlByb3BlcnR5Rm91bmQpCiAgICAgICAgICAgICBicmVhazsKLQogICAgICAgICAgIGJPbmVPZlByb3BlcnR5Rm91bmQgPSB0cnVlOwogICAgICAgICB9CisKICAgICAgICAgQ1hGQV9Ob2RlKiBwWEZBQ2hpbGQgPSBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKGVQYWNrZXRJRCwgZVR5cGUpOwogICAgICAgICBpZiAoIXBYRkFDaGlsZCkKICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgaWYgKGVQYWNrZXRJRCA9PSBYRkFfWERQUEFDS0VUX0NvbmZpZykKLSAgICAgICAgICBwWEZBQ2hpbGQtPlNldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX05hbWUsIHdzVGFnTmFtZS5Bc1N0cmluZ0MoKSk7CisgICAgICAgIGlmIChlUGFja2V0SUQgPT0gWEZBX1BhY2tldFR5cGU6OkNvbmZpZykgeworICAgICAgICAgIHBYRkFDaGlsZC0+SlNPYmplY3QoKS0+U2V0QXR0cmlidXRlKFhGQV9BdHRyaWJ1dGU6Ok5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NUYWdOYW1lLkFzU3RyaW5nVmlldygpLCBmYWxzZSk7CisgICAgICAgIH0KIAogICAgICAgICBib29sIElzTmVlZFZhbHVlID0gdHJ1ZTsKLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwLCBjb3VudCA9IHBYTUxFbGVtZW50LT5Db3VudEF0dHJpYnV0ZXMoKTsgaSA8IGNvdW50OwotICAgICAgICAgICAgIGkrKykgewotICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzQXR0clF1YWxpZmllZE5hbWU7Ci0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NBdHRyTmFtZTsKLSAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0F0dHJWYWx1ZTsKLSAgICAgICAgICBwWE1MRWxlbWVudC0+R2V0QXR0cmlidXRlKGksIHdzQXR0clF1YWxpZmllZE5hbWUsIHdzQXR0clZhbHVlKTsKLSAgICAgICAgICBHZXRBdHRyaWJ1dGVMb2NhbE5hbWUod3NBdHRyUXVhbGlmaWVkTmFtZS5Bc1N0cmluZ0MoKSwgd3NBdHRyTmFtZSk7Ci0gICAgICAgICAgaWYgKHdzQXR0ck5hbWUgPT0gTCJuaWwiICYmIHdzQXR0clZhbHVlID09IEwidHJ1ZSIpIHsKKyAgICAgICAgZm9yIChhdXRvIGl0IDogcFhNTEVsZW1lbnQtPkdldEF0dHJpYnV0ZXMoKSkgeworICAgICAgICAgIFdpZGVTdHJpbmcgd3NBdHRyTmFtZTsKKyAgICAgICAgICBHZXRBdHRyaWJ1dGVMb2NhbE5hbWUoaXQuZmlyc3QuQXNTdHJpbmdWaWV3KCksIHdzQXR0ck5hbWUpOworICAgICAgICAgIGlmICh3c0F0dHJOYW1lID09IEwibmlsIiAmJiBpdC5zZWNvbmQgPT0gTCJ0cnVlIikKICAgICAgICAgICAgIElzTmVlZFZhbHVlID0gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNvbnN0IFhGQV9BVFRSSUJVVEVJTkZPKiBscEF0dHJJbmZvID0KLSAgICAgICAgICAgICAgWEZBX0dldEF0dHJpYnV0ZUJ5TmFtZSh3c0F0dHJOYW1lLkFzU3RyaW5nQygpKTsKLSAgICAgICAgICBpZiAoIWxwQXR0ckluZm8pCisKKyAgICAgICAgICBYRkFfQXR0cmlidXRlIGF0dHIgPQorICAgICAgICAgICAgICBDWEZBX05vZGU6Ok5hbWVUb0F0dHJpYnV0ZSh3c0F0dHJOYW1lLkFzU3RyaW5nVmlldygpKTsKKyAgICAgICAgICBpZiAoYXR0ciA9PSBYRkFfQXR0cmlidXRlOjpVbmtub3duKQogICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAgICBpZiAoIWJVc2VBdHRyaWJ1dGUgJiYgbHBBdHRySW5mby0+ZU5hbWUgIT0gWEZBX0FUVFJJQlVURV9OYW1lICYmCi0gICAgICAgICAgICAgIGxwQXR0ckluZm8tPmVOYW1lICE9IFhGQV9BVFRSSUJVVEVfU2F2ZSkgeworICAgICAgICAgIGlmICghYlVzZUF0dHJpYnV0ZSAmJiBhdHRyICE9IFhGQV9BdHRyaWJ1dGU6Ok5hbWUgJiYKKyAgICAgICAgICAgICAgYXR0ciAhPSBYRkFfQXR0cmlidXRlOjpTYXZlKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICB9Ci0gICAgICAgICAgcFhGQUNoaWxkLT5TZXRBdHRyaWJ1dGUobHBBdHRySW5mby0+ZU5hbWUsIHdzQXR0clZhbHVlLkFzU3RyaW5nQygpKTsKKyAgICAgICAgICBwWEZBQ2hpbGQtPkpTT2JqZWN0KCktPlNldEF0dHJpYnV0ZShhdHRyLCBpdC5zZWNvbmQuQXNTdHJpbmdWaWV3KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICB9Ci0gICAgICAgIHBYRkFOb2RlLT5JbnNlcnRDaGlsZChwWEZBQ2hpbGQpOworICAgICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocFhGQUNoaWxkLCBudWxscHRyKTsKICAgICAgICAgaWYgKGVUeXBlID09IFhGQV9FbGVtZW50OjpWYWxpZGF0ZSB8fCBlVHlwZSA9PSBYRkFfRWxlbWVudDo6TG9jYWxlKSB7Ci0gICAgICAgICAgaWYgKGVQYWNrZXRJRCA9PSBYRkFfWERQUEFDS0VUX0NvbmZpZykKKyAgICAgICAgICBpZiAoZVBhY2tldElEID09IFhGQV9QYWNrZXRUeXBlOjpDb25maWcpCiAgICAgICAgICAgICBQYXJzZUNvbnRlbnROb2RlKHBYRkFDaGlsZCwgcFhNTEVsZW1lbnQsIGVQYWNrZXRJRCk7CiAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgTm9ybWFsTG9hZGVyKHBYRkFDaGlsZCwgcFhNTEVsZW1lbnQsIGVQYWNrZXRJRCwgYlVzZUF0dHJpYnV0ZSk7CkBAIC05NDYsOCArOTM1LDggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICB9IGJyZWFrOwotICAgICAgY2FzZSBGREVfWE1MTk9ERV9JbnN0cnVjdGlvbjoKLSAgICAgICAgUGFyc2VJbnN0cnVjdGlvbihwWEZBTm9kZSwgc3RhdGljX2Nhc3Q8Q0ZERV9YTUxJbnN0cnVjdGlvbio+KHBYTUxDaGlsZCksCisgICAgICBjYXNlIEZYX1hNTE5PREVfSW5zdHJ1Y3Rpb246CisgICAgICAgIFBhcnNlSW5zdHJ1Y3Rpb24ocFhGQU5vZGUsIHN0YXRpY19jYXN0PENGWF9YTUxJbnN0cnVjdGlvbio+KHBYTUxDaGlsZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgZVBhY2tldElEKTsKICAgICAgICAgYnJlYWs7CiAgICAgICBkZWZhdWx0OgpAQCAtOTU4LDEyICs5NDcsMTIgQEAKIH0KIAogdm9pZCBDWEZBX1NpbXBsZVBhcnNlcjo6UGFyc2VDb250ZW50Tm9kZShDWEZBX05vZGUqIHBYRkFOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1hNTE5vZGUqIHBYTUxOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfWE1MTm9kZSogcFhNTE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIGVQYWNrZXRJRCkgewogICBYRkFfRWxlbWVudCBlbGVtZW50ID0gWEZBX0VsZW1lbnQ6OlNoYXJwdGV4dDsKICAgaWYgKHBYRkFOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpFeERhdGEpIHsKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd3NDb250ZW50VHlwZSA9Ci0gICAgICAgIHBYRkFOb2RlLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlKTsKKyAgICBXaWRlU3RyaW5nIHdzQ29udGVudFR5cGUgPQorICAgICAgICBwWEZBTm9kZS0+SlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6Q29udGVudFR5cGUpOwogICAgIGlmICh3c0NvbnRlbnRUeXBlID09IEwidGV4dC9odG1sIikKICAgICAgIGVsZW1lbnQgPSBYRkFfRWxlbWVudDo6U2hhcnB4SFRNTDsKICAgICBlbHNlIGlmICh3c0NvbnRlbnRUeXBlID09IEwidGV4dC94bWwiKQpAQCAtOTcyLDM0ICs5NjEsMzEgQEAKICAgaWYgKGVsZW1lbnQgPT0gWEZBX0VsZW1lbnQ6OlNoYXJweEhUTUwpCiAgICAgcFhGQU5vZGUtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxOb2RlKTsKIAotICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOwotICBmb3IgKENGREVfWE1MTm9kZSogcFhNTENoaWxkID0KLSAgICAgICAgICAgcFhNTE5vZGUtPkdldE5vZGVJdGVtKENGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7CisgIFdpZGVTdHJpbmcgd3NWYWx1ZTsKKyAgZm9yIChDRlhfWE1MTm9kZSogcFhNTENoaWxkID0gcFhNTE5vZGUtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpGaXJzdENoaWxkKTsKICAgICAgICBwWE1MQ2hpbGQ7Ci0gICAgICAgcFhNTENoaWxkID0gcFhNTENoaWxkLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgewotICAgIEZERV9YTUxOT0RFVFlQRSBlTm9kZVR5cGUgPSBwWE1MQ2hpbGQtPkdldFR5cGUoKTsKLSAgICBpZiAoZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKQorICAgICAgIHBYTUxDaGlsZCA9IHBYTUxDaGlsZC0+R2V0Tm9kZUl0ZW0oQ0ZYX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgeworICAgIEZYX1hNTE5PREVUWVBFIGVOb2RlVHlwZSA9IHBYTUxDaGlsZC0+R2V0VHlwZSgpOworICAgIGlmIChlTm9kZVR5cGUgPT0gRlhfWE1MTk9ERV9JbnN0cnVjdGlvbikKICAgICAgIGNvbnRpbnVlOwogCiAgICAgaWYgKGVsZW1lbnQgPT0gWEZBX0VsZW1lbnQ6OlNoYXJweEhUTUwpIHsKLSAgICAgIGlmIChlTm9kZVR5cGUgIT0gRkRFX1hNTE5PREVfRWxlbWVudCkKKyAgICAgIGlmIChlTm9kZVR5cGUgIT0gRlhfWE1MTk9ERV9FbGVtZW50KQogICAgICAgICBicmVhazsKIAotICAgICAgaWYgKFhGQV9SZWNvZ25pemVSaWNoVGV4dChzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwWE1MQ2hpbGQpKSkKLSAgICAgICAgWEZBX0dldFBsYWluVGV4dEZyb21SaWNoVGV4dChzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwWE1MQ2hpbGQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzVmFsdWUpOworICAgICAgaWYgKFhGQV9SZWNvZ25pemVSaWNoVGV4dChzdGF0aWNfY2FzdDxDRlhfWE1MRWxlbWVudCo+KHBYTUxDaGlsZCkpKQorICAgICAgICB3c1ZhbHVlICs9CisgICAgICAgICAgICBHZXRQbGFpblRleHRGcm9tUmljaFRleHQoc3RhdGljX2Nhc3Q8Q0ZYX1hNTEVsZW1lbnQqPihwWE1MQ2hpbGQpKTsKICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgPT0gWEZBX0VsZW1lbnQ6OlNoYXJweG1sKSB7Ci0gICAgICBpZiAoZU5vZGVUeXBlICE9IEZERV9YTUxOT0RFX0VsZW1lbnQpCisgICAgICBpZiAoZU5vZGVUeXBlICE9IEZYX1hNTE5PREVfRWxlbWVudCkKICAgICAgICAgYnJlYWs7CiAKLSAgICAgIENvbnZlcnRYTUxUb1BsYWluVGV4dChzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwWE1MQ2hpbGQpLCB3c1ZhbHVlKTsKKyAgICAgIENvbnZlcnRYTUxUb1BsYWluVGV4dChzdGF0aWNfY2FzdDxDRlhfWE1MRWxlbWVudCo+KHBYTUxDaGlsZCksIHdzVmFsdWUpOwogICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX0VsZW1lbnQpCisgICAgICBpZiAoZU5vZGVUeXBlID09IEZYX1hNTE5PREVfRWxlbWVudCkKICAgICAgICAgYnJlYWs7Ci0gICAgICBpZiAoZU5vZGVUeXBlID09IEZERV9YTUxOT0RFX1RleHQpCi0gICAgICAgIHN0YXRpY19jYXN0PENGREVfWE1MVGV4dCo+KHBYTUxDaGlsZCktPkdldFRleHQod3NWYWx1ZSk7Ci0gICAgICBlbHNlIGlmIChlTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfQ2hhckRhdGEpCi0gICAgICAgIHN0YXRpY19jYXN0PENGREVfWE1MQ2hhckRhdGEqPihwWE1MQ2hpbGQpLT5HZXRDaGFyRGF0YSh3c1ZhbHVlKTsKKyAgICAgIGlmIChlTm9kZVR5cGUgPT0gRlhfWE1MTk9ERV9UZXh0IHx8IGVOb2RlVHlwZSA9PSBGWF9YTUxOT0RFX0NoYXJEYXRhKQorICAgICAgICB3c1ZhbHVlID0gc3RhdGljX2Nhc3Q8Q0ZYX1hNTFRleHQqPihwWE1MQ2hpbGQpLT5HZXRUZXh0KCk7CiAgICAgfQogICAgIGJyZWFrOwogICB9CkBAIC0xMDA4LDI3ICs5OTQsMjcgQEAKICAgICAgIENYRkFfTm9kZSogcENvbnRlbnRSYXdEYXRhTm9kZSA9CiAgICAgICAgICAgbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShlUGFja2V0SUQsIGVsZW1lbnQpOwogICAgICAgQVNTRVJUKHBDb250ZW50UmF3RGF0YU5vZGUpOwotICAgICAgcENvbnRlbnRSYXdEYXRhTm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NWYWx1ZSk7Ci0gICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocENvbnRlbnRSYXdEYXRhTm9kZSk7CisgICAgICBwQ29udGVudFJhd0RhdGFOb2RlLT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpWYWx1ZSwgd3NWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7CisgICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocENvbnRlbnRSYXdEYXRhTm9kZSwgbnVsbHB0cik7CiAgICAgfSBlbHNlIHsKLSAgICAgIHBYRkFOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c1ZhbHVlKTsKKyAgICAgIHBYRkFOb2RlLT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpWYWx1ZSwgd3NWYWx1ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgIH0KICAgfQogfQogCiB2b2lkIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZURhdGFHcm91cChDWEZBX05vZGUqIHBYRkFOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9YTUxOb2RlKiBwWE1MTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKSB7Ci0gIGZvciAoQ0ZERV9YTUxOb2RlKiBwWE1MQ2hpbGQgPQotICAgICAgICAgICBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9YTUxOb2RlKiBwWE1MTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIGVQYWNrZXRJRCkgeworICBmb3IgKENGWF9YTUxOb2RlKiBwWE1MQ2hpbGQgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZYX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOwogICAgICAgIHBYTUxDaGlsZDsKLSAgICAgICBwWE1MQ2hpbGQgPSBwWE1MQ2hpbGQtPkdldE5vZGVJdGVtKENGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7CisgICAgICAgcFhNTENoaWxkID0gcFhNTENoaWxkLT5HZXROb2RlSXRlbShDRlhfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7CiAgICAgc3dpdGNoIChwWE1MQ2hpbGQtPkdldFR5cGUoKSkgewotICAgICAgY2FzZSBGREVfWE1MTk9ERV9FbGVtZW50OiB7Ci0gICAgICAgIENGREVfWE1MRWxlbWVudCogcFhNTEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwWE1MQ2hpbGQpOworICAgICAgY2FzZSBGWF9YTUxOT0RFX0VsZW1lbnQ6IHsKKyAgICAgICAgQ0ZYX1hNTEVsZW1lbnQqIHBYTUxFbGVtZW50ID0gc3RhdGljX2Nhc3Q8Q0ZYX1hNTEVsZW1lbnQqPihwWE1MQ2hpbGQpOwogICAgICAgICB7Ci0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lc3BhY2VVUkk7Ci0gICAgICAgICAgR2V0RWxlbWVudFRhZ05hbWVzcGFjZVVSSShwWE1MRWxlbWVudCwgd3NOYW1lc3BhY2VVUkkpOworICAgICAgICAgIFdpZGVTdHJpbmcgd3NOYW1lc3BhY2VVUkkgPSBHZXRFbGVtZW50VGFnTmFtZXNwYWNlVVJJKHBYTUxFbGVtZW50KTsKICAgICAgICAgICBpZiAod3NOYW1lc3BhY2VVUkkgPT0gTCJodHRwOi8vd3d3LnhmYS5jb20vc2NoZW1hL3hmYS1wYWNrYWdlLyIgfHwKICAgICAgICAgICAgICAgd3NOYW1lc3BhY2VVUkkgPT0gTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1wYWNrYWdlLyIgfHwKICAgICAgICAgICAgICAgd3NOYW1lc3BhY2VVUkkgPT0gTCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIpIHsKQEAgLTEwMzgsNyArMTAyNCw3IEBACiAKICAgICAgICAgWEZBX0VsZW1lbnQgZU5vZGVUeXBlID0gWEZBX0VsZW1lbnQ6OkRhdGFNb2RlbDsKICAgICAgICAgaWYgKGVOb2RlVHlwZSA9PSBYRkFfRWxlbWVudDo6RGF0YU1vZGVsKSB7Ci0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRhTm9kZUF0dHI7CisgICAgICAgICAgV2lkZVN0cmluZyB3c0RhdGFOb2RlQXR0cjsKICAgICAgICAgICBpZiAoRmluZEF0dHJpYnV0ZVdpdGhOUyhwWE1MRWxlbWVudCwgTCJkYXRhTm9kZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1kYXRhLzEuMC8iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzRGF0YU5vZGVBdHRyKSkgewpAQCAtMTA0OCw3ICsxMDM0LDcgQEAKICAgICAgICAgICAgICAgZU5vZGVUeXBlID0gWEZBX0VsZW1lbnQ6OkRhdGFWYWx1ZTsKICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50VHlwZTsKKyAgICAgICAgV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOwogICAgICAgICBpZiAoZU5vZGVUeXBlID09IFhGQV9FbGVtZW50OjpEYXRhTW9kZWwpIHsKICAgICAgICAgICBpZiAoRmluZEF0dHJpYnV0ZVdpdGhOUyhwWE1MRWxlbWVudCwgTCJjb250ZW50VHlwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1kYXRhLzEuMC8iLApAQCAtMTA1OCwxMyArMTA0NCwxMyBAQAogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoZU5vZGVUeXBlID09IFhGQV9FbGVtZW50OjpEYXRhTW9kZWwpIHsKLSAgICAgICAgICBmb3IgKENGREVfWE1MTm9kZSogcFhNTERhdGFDaGlsZCA9Ci0gICAgICAgICAgICAgICAgICAgcFhNTEVsZW1lbnQtPkdldE5vZGVJdGVtKENGREVfWE1MTm9kZTo6Rmlyc3RDaGlsZCk7CisgICAgICAgICAgZm9yIChDRlhfWE1MTm9kZSogcFhNTERhdGFDaGlsZCA9CisgICAgICAgICAgICAgICAgICAgcFhNTEVsZW1lbnQtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpGaXJzdENoaWxkKTsKICAgICAgICAgICAgICAgIHBYTUxEYXRhQ2hpbGQ7IHBYTUxEYXRhQ2hpbGQgPSBwWE1MRGF0YUNoaWxkLT5HZXROb2RlSXRlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgewotICAgICAgICAgICAgaWYgKHBYTUxEYXRhQ2hpbGQtPkdldFR5cGUoKSA9PSBGREVfWE1MTk9ERV9FbGVtZW50KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1hNTE5vZGU6Ok5leHRTaWJsaW5nKSkgeworICAgICAgICAgICAgaWYgKHBYTUxEYXRhQ2hpbGQtPkdldFR5cGUoKSA9PSBGWF9YTUxOT0RFX0VsZW1lbnQpIHsKICAgICAgICAgICAgICAgaWYgKCFYRkFfUmVjb2duaXplUmljaFRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4ocFhNTERhdGFDaGlsZCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZYX1hNTEVsZW1lbnQqPihwWE1MRGF0YUNoaWxkKSkpIHsKICAgICAgICAgICAgICAgICBlTm9kZVR5cGUgPSBYRkFfRWxlbWVudDo6RGF0YUdyb3VwOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICB9CkBAIC0xMDc1LDI1ICsxMDYxLDIxIEBACiAgICAgICAgICAgZU5vZGVUeXBlID0gWEZBX0VsZW1lbnQ6OkRhdGFWYWx1ZTsKIAogICAgICAgICBDWEZBX05vZGUqIHBYRkFDaGlsZCA9Ci0gICAgICAgICAgICBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIGVOb2RlVHlwZSk7CisgICAgICAgICAgICBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKFhGQV9QYWNrZXRUeXBlOjpEYXRhc2V0cywgZU5vZGVUeXBlKTsKICAgICAgICAgaWYgKCFwWEZBQ2hpbGQpCiAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTm9kZU5hbWU7Ci0gICAgICAgIHBYTUxFbGVtZW50LT5HZXRMb2NhbFRhZ05hbWUod3NOb2RlTmFtZSk7Ci0gICAgICAgIHBYRkFDaGlsZC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c05vZGVOYW1lKTsKKyAgICAgICAgcFhGQUNoaWxkLT5KU09iamVjdCgpLT5TZXRDRGF0YSgKKyAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGU6Ok5hbWUsIHBYTUxFbGVtZW50LT5HZXRMb2NhbFRhZ05hbWUoKSwgZmFsc2UsIGZhbHNlKTsKICAgICAgICAgYm9vbCBiTmVlZFZhbHVlID0gdHJ1ZTsKLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgcFhNTEVsZW1lbnQtPkNvdW50QXR0cmlidXRlcygpOyArK2kpIHsKLSAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1F1YWxpZmllZE5hbWU7Ci0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZTsKLSAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05hbWU7Ci0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOUzsKLSAgICAgICAgICBwWE1MRWxlbWVudC0+R2V0QXR0cmlidXRlKGksIHdzUXVhbGlmaWVkTmFtZSwgd3NWYWx1ZSk7Ci0gICAgICAgICAgaWYgKCFSZXNvbHZlQXR0cmlidXRlKHBYTUxFbGVtZW50LCB3c1F1YWxpZmllZE5hbWUuQXNTdHJpbmdDKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzTmFtZSwgd3NOUykpIHsKKworICAgICAgICBmb3IgKGF1dG8gaXQgOiBwWE1MRWxlbWVudC0+R2V0QXR0cmlidXRlcygpKSB7CisgICAgICAgICAgV2lkZVN0cmluZyB3c05hbWU7CisgICAgICAgICAgV2lkZVN0cmluZyB3c05TOworICAgICAgICAgIGlmICghUmVzb2x2ZUF0dHJpYnV0ZShwWE1MRWxlbWVudCwgaXQuZmlyc3QsIHdzTmFtZSwgd3NOUykpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgIH0KLSAgICAgICAgICBpZiAod3NOYW1lID09IEwibmlsIiAmJiB3c1ZhbHVlID09IEwidHJ1ZSIpIHsKKyAgICAgICAgICBpZiAod3NOYW1lID09IEwibmlsIiAmJiBpdC5zZWNvbmQgPT0gTCJ0cnVlIikgewogICAgICAgICAgICAgYk5lZWRWYWx1ZSA9IGZhbHNlOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgfQpAQCAtMTEwNCw2NyArMTA4Niw1MiBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgfQogICAgICAgICAgIENYRkFfTm9kZSogcFhGQU1ldGFEYXRhID0gbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZSgKLSAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgWEZBX0VsZW1lbnQ6OkRhdGFWYWx1ZSk7CisgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlOjpEYXRhc2V0cywgWEZBX0VsZW1lbnQ6OkRhdGFWYWx1ZSk7CiAgICAgICAgICAgaWYgKCFwWEZBTWV0YURhdGEpCiAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgICBwWEZBTWV0YURhdGEtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lKTsKLSAgICAgICAgICBwWEZBTWV0YURhdGEtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfUXVhbGlmaWVkTmFtZSwgd3NRdWFsaWZpZWROYW1lKTsKLSAgICAgICAgICBwWEZBTWV0YURhdGEtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzVmFsdWUpOwotICAgICAgICAgIHBYRkFNZXRhRGF0YS0+U2V0RW51bShYRkFfQVRUUklCVVRFX0NvbnRhaW5zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTV9NZXRhRGF0YSk7Ci0gICAgICAgICAgcFhGQUNoaWxkLT5JbnNlcnRDaGlsZChwWEZBTWV0YURhdGEpOworICAgICAgICAgIHBYRkFNZXRhRGF0YS0+SlNPYmplY3QoKS0+U2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6TmFtZSwgd3NOYW1lLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICBwWEZBTWV0YURhdGEtPkpTT2JqZWN0KCktPlNldENEYXRhKFhGQV9BdHRyaWJ1dGU6OlF1YWxpZmllZE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC5maXJzdCwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICBwWEZBTWV0YURhdGEtPkpTT2JqZWN0KCktPlNldENEYXRhKFhGQV9BdHRyaWJ1dGU6OlZhbHVlLCBpdC5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpOworICAgICAgICAgIHBYRkFNZXRhRGF0YS0+SlNPYmplY3QoKS0+U2V0RW51bShYRkFfQXR0cmlidXRlOjpDb250YWlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZUVudW06Ok1ldGFEYXRhLCBmYWxzZSk7CisgICAgICAgICAgcFhGQUNoaWxkLT5JbnNlcnRDaGlsZChwWEZBTWV0YURhdGEsIG51bGxwdHIpOwogICAgICAgICAgIHBYRkFNZXRhRGF0YS0+U2V0WE1MTWFwcGluZ05vZGUocFhNTEVsZW1lbnQpOwogICAgICAgICAgIHBYRkFNZXRhRGF0YS0+U2V0RmxhZyhYRkFfTm9kZUZsYWdfSW5pdGlhbGl6ZWQsIGZhbHNlKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmICghYk5lZWRWYWx1ZSkgewotICAgICAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmlsTmFtZShMInhzaTpuaWwiKTsKKyAgICAgICAgICBXaWRlU3RyaW5nIHdzTmlsTmFtZShMInhzaTpuaWwiKTsKICAgICAgICAgICBwWE1MRWxlbWVudC0+UmVtb3ZlQXR0cmlidXRlKHdzTmlsTmFtZS5jX3N0cigpKTsKICAgICAgICAgfQotICAgICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocFhGQUNoaWxkKTsKKyAgICAgICAgcFhGQU5vZGUtPkluc2VydENoaWxkKHBYRkFDaGlsZCwgbnVsbHB0cik7CiAgICAgICAgIGlmIChlTm9kZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OkRhdGFHcm91cCkKICAgICAgICAgICBQYXJzZURhdGFHcm91cChwWEZBQ2hpbGQsIHBYTUxFbGVtZW50LCBlUGFja2V0SUQpOwogICAgICAgICBlbHNlIGlmIChiTmVlZFZhbHVlKQotICAgICAgICAgIFBhcnNlRGF0YVZhbHVlKHBYRkFDaGlsZCwgcFhNTENoaWxkLCBYRkFfWERQUEFDS0VUX0RhdGFzZXRzKTsKKyAgICAgICAgICBQYXJzZURhdGFWYWx1ZShwWEZBQ2hpbGQsIHBYTUxDaGlsZCwgWEZBX1BhY2tldFR5cGU6OkRhdGFzZXRzKTsKIAogICAgICAgICBwWEZBQ2hpbGQtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxFbGVtZW50KTsKICAgICAgICAgcFhGQUNoaWxkLT5TZXRGbGFnKFhGQV9Ob2RlRmxhZ19Jbml0aWFsaXplZCwgZmFsc2UpOwogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KLSAgICAgIGNhc2UgRkRFX1hNTE5PREVfQ2hhckRhdGE6IHsKLSAgICAgICAgQ0ZERV9YTUxDaGFyRGF0YSogcFhNTENoYXJEYXRhID0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PENGREVfWE1MQ2hhckRhdGEqPihwWE1MQ2hpbGQpOwotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NoYXJEYXRhOwotICAgICAgICBwWE1MQ2hhckRhdGEtPkdldENoYXJEYXRhKHdzQ2hhckRhdGEpOwotICAgICAgICBpZiAoSXNTdHJpbmdBbGxXaGl0ZXNwYWNlKHdzQ2hhckRhdGEpKQotICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIENYRkFfTm9kZSogcFhGQUNoaWxkID0gbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0RhdGFzZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkRhdGFWYWx1ZSk7Ci0gICAgICAgIGlmICghcFhGQUNoaWxkKQotICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBwWEZBQ2hpbGQtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ2hhckRhdGEpOwotICAgICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocFhGQUNoaWxkKTsKLSAgICAgICAgcFhGQUNoaWxkLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MQ2hhckRhdGEpOwotICAgICAgICBwWEZBQ2hpbGQtPlNldEZsYWcoWEZBX05vZGVGbGFnX0luaXRpYWxpemVkLCBmYWxzZSk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgY2FzZSBGREVfWE1MTk9ERV9UZXh0OiB7Ci0gICAgICAgIENGREVfWE1MVGV4dCogcFhNTFRleHQgPSBzdGF0aWNfY2FzdDxDRkRFX1hNTFRleHQqPihwWE1MQ2hpbGQpOwotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7Ci0gICAgICAgIHBYTUxUZXh0LT5HZXRUZXh0KHdzVGV4dCk7CisgICAgICBjYXNlIEZYX1hNTE5PREVfQ2hhckRhdGE6CisgICAgICBjYXNlIEZYX1hNTE5PREVfVGV4dDogeworICAgICAgICBDRlhfWE1MVGV4dCogcFhNTFRleHQgPSBzdGF0aWNfY2FzdDxDRlhfWE1MVGV4dCo+KHBYTUxDaGlsZCk7CisgICAgICAgIFdpZGVTdHJpbmcgd3NUZXh0ID0gcFhNTFRleHQtPkdldFRleHQoKTsKICAgICAgICAgaWYgKElzU3RyaW5nQWxsV2hpdGVzcGFjZSh3c1RleHQpKQogICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIENYRkFfTm9kZSogcFhGQUNoaWxkID0gbV9wRmFjdG9yeS0+Q3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0RhdGFzZXRzLAorICAgICAgICBDWEZBX05vZGUqIHBYRkFDaGlsZCA9IG1fcEZhY3RvcnktPkNyZWF0ZU5vZGUoWEZBX1BhY2tldFR5cGU6OkRhdGFzZXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkRhdGFWYWx1ZSk7CiAgICAgICAgIGlmICghcFhGQUNoaWxkKQogICAgICAgICAgIHJldHVybjsKIAotICAgICAgICBwWEZBQ2hpbGQtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzVGV4dCk7Ci0gICAgICAgIHBYRkFOb2RlLT5JbnNlcnRDaGlsZChwWEZBQ2hpbGQpOworICAgICAgICBwWEZBQ2hpbGQtPkpTT2JqZWN0KCktPlNldENEYXRhKFhGQV9BdHRyaWJ1dGU6OlZhbHVlLCB3c1RleHQsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgcFhGQU5vZGUtPkluc2VydENoaWxkKHBYRkFDaGlsZCwgbnVsbHB0cik7CiAgICAgICAgIHBYRkFDaGlsZC0+U2V0WE1MTWFwcGluZ05vZGUocFhNTFRleHQpOwogICAgICAgICBwWEZBQ2hpbGQtPlNldEZsYWcoWEZBX05vZGVGbGFnX0luaXRpYWxpemVkLCBmYWxzZSk7CiAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTE3NiwzNyArMTE0MywyOCBAQAogfQogCiB2b2lkIENYRkFfU2ltcGxlUGFyc2VyOjpQYXJzZURhdGFWYWx1ZShDWEZBX05vZGUqIHBYRkFOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9YTUxOb2RlKiBwWE1MTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfWE1MTm9kZSogcFhNTE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBlUGFja2V0SUQpIHsKICAgQ0ZYX1dpZGVUZXh0QnVmIHdzVmFsdWVUZXh0QnVmOwogICBDRlhfV2lkZVRleHRCdWYgd3NDdXJWYWx1ZVRleHRCdWY7CiAgIGJvb2wgYk1hcmtBc0NvbXBvdW5kID0gZmFsc2U7Ci0gIENGREVfWE1MTm9kZSogcFhNTEN1clZhbHVlTm9kZSA9IG51bGxwdHI7Ci0gIGZvciAoQ0ZERV9YTUxOb2RlKiBwWE1MQ2hpbGQgPQotICAgICAgICAgICBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZERV9YTUxOb2RlOjpGaXJzdENoaWxkKTsKKyAgQ0ZYX1hNTE5vZGUqIHBYTUxDdXJWYWx1ZU5vZGUgPSBudWxscHRyOworICBmb3IgKENGWF9YTUxOb2RlKiBwWE1MQ2hpbGQgPSBwWE1MTm9kZS0+R2V0Tm9kZUl0ZW0oQ0ZYX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOwogICAgICAgIHBYTUxDaGlsZDsKLSAgICAgICBwWE1MQ2hpbGQgPSBwWE1MQ2hpbGQtPkdldE5vZGVJdGVtKENGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7Ci0gICAgRkRFX1hNTE5PREVUWVBFIGVOb2RlVHlwZSA9IHBYTUxDaGlsZC0+R2V0VHlwZSgpOwotICAgIGlmIChlTm9kZVR5cGUgPT0gRkRFX1hNTE5PREVfSW5zdHJ1Y3Rpb24pCisgICAgICAgcFhNTENoaWxkID0gcFhNTENoaWxkLT5HZXROb2RlSXRlbShDRlhfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7CisgICAgRlhfWE1MTk9ERVRZUEUgZU5vZGVUeXBlID0gcFhNTENoaWxkLT5HZXRUeXBlKCk7CisgICAgaWYgKGVOb2RlVHlwZSA9PSBGWF9YTUxOT0RFX0luc3RydWN0aW9uKQogICAgICAgY29udGludWU7CiAKLSAgICBDRlhfV2lkZVN0cmluZyB3c1RleHQ7Ci0gICAgaWYgKGVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9UZXh0KSB7Ci0gICAgICBzdGF0aWNfY2FzdDxDRkRFX1hNTFRleHQqPihwWE1MQ2hpbGQpLT5HZXRUZXh0KHdzVGV4dCk7CisgICAgaWYgKGVOb2RlVHlwZSA9PSBGWF9YTUxOT0RFX1RleHQgfHwgZU5vZGVUeXBlID09IEZYX1hNTE5PREVfQ2hhckRhdGEpIHsKKyAgICAgIFdpZGVTdHJpbmcgd3NUZXh0ID0gc3RhdGljX2Nhc3Q8Q0ZYX1hNTFRleHQqPihwWE1MQ2hpbGQpLT5HZXRUZXh0KCk7CiAgICAgICBpZiAoIXBYTUxDdXJWYWx1ZU5vZGUpCiAgICAgICAgIHBYTUxDdXJWYWx1ZU5vZGUgPSBwWE1MQ2hpbGQ7CiAKICAgICAgIHdzQ3VyVmFsdWVUZXh0QnVmIDw8IHdzVGV4dDsKLSAgICB9IGVsc2UgaWYgKGVOb2RlVHlwZSA9PSBGREVfWE1MTk9ERV9DaGFyRGF0YSkgewotICAgICAgc3RhdGljX2Nhc3Q8Q0ZERV9YTUxDaGFyRGF0YSo+KHBYTUxDaGlsZCktPkdldENoYXJEYXRhKHdzVGV4dCk7Ci0gICAgICBpZiAoIXBYTUxDdXJWYWx1ZU5vZGUpCi0gICAgICAgIHBYTUxDdXJWYWx1ZU5vZGUgPSBwWE1MQ2hpbGQ7Ci0KLSAgICAgIHdzQ3VyVmFsdWVUZXh0QnVmIDw8IHdzVGV4dDsKLSAgICB9IGVsc2UgaWYgKFhGQV9SZWNvZ25pemVSaWNoVGV4dCgKLSAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwWE1MQ2hpbGQpKSkgewotICAgICAgWEZBX0dldFBsYWluVGV4dEZyb21SaWNoVGV4dChzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwWE1MQ2hpbGQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1RleHQpOworICAgIH0gZWxzZSBpZiAoWEZBX1JlY29nbml6ZVJpY2hUZXh0KHN0YXRpY19jYXN0PENGWF9YTUxFbGVtZW50Kj4ocFhNTENoaWxkKSkpIHsKKyAgICAgIFdpZGVTdHJpbmcgd3NUZXh0ID0KKyAgICAgICAgICBHZXRQbGFpblRleHRGcm9tUmljaFRleHQoc3RhdGljX2Nhc3Q8Q0ZYX1hNTEVsZW1lbnQqPihwWE1MQ2hpbGQpKTsKICAgICAgIGlmICghcFhNTEN1clZhbHVlTm9kZSkKICAgICAgICAgcFhNTEN1clZhbHVlTm9kZSA9IHBYTUxDaGlsZDsKIApAQCAtMTIxNCwxNiArMTE3MiwxOCBAQAogICAgIH0gZWxzZSB7CiAgICAgICBiTWFya0FzQ29tcG91bmQgPSB0cnVlOwogICAgICAgaWYgKHBYTUxDdXJWYWx1ZU5vZGUpIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDdXJWYWx1ZSA9IHdzQ3VyVmFsdWVUZXh0QnVmLk1ha2VTdHJpbmcoKTsKKyAgICAgICAgV2lkZVN0cmluZyB3c0N1clZhbHVlID0gd3NDdXJWYWx1ZVRleHRCdWYuTWFrZVN0cmluZygpOwogICAgICAgICBpZiAoIXdzQ3VyVmFsdWUuSXNFbXB0eSgpKSB7CiAgICAgICAgICAgQ1hGQV9Ob2RlKiBwWEZBQ2hpbGQgPQogICAgICAgICAgICAgICBtX3BGYWN0b3J5LT5DcmVhdGVOb2RlKGVQYWNrZXRJRCwgWEZBX0VsZW1lbnQ6OkRhdGFWYWx1ZSk7CiAgICAgICAgICAgaWYgKCFwWEZBQ2hpbGQpCiAgICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgICBwWEZBQ2hpbGQtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgTCIiKTsKLSAgICAgICAgICBwWEZBQ2hpbGQtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ3VyVmFsdWUpOwotICAgICAgICAgIHBYRkFOb2RlLT5JbnNlcnRDaGlsZChwWEZBQ2hpbGQpOworICAgICAgICAgIHBYRkFDaGlsZC0+SlNPYmplY3QoKS0+U2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6TmFtZSwgTCIiLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICAgICAgICBwWEZBQ2hpbGQtPkpTT2JqZWN0KCktPlNldENEYXRhKFhGQV9BdHRyaWJ1dGU6OlZhbHVlLCB3c0N1clZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocFhGQUNoaWxkLCBudWxscHRyKTsKICAgICAgICAgICBwWEZBQ2hpbGQtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxDdXJWYWx1ZU5vZGUpOwogICAgICAgICAgIHBYRkFDaGlsZC0+U2V0RmxhZyhYRkFfTm9kZUZsYWdfSW5pdGlhbGl6ZWQsIGZhbHNlKTsKICAgICAgICAgICB3c1ZhbHVlVGV4dEJ1ZiA8PCB3c0N1clZhbHVlOwpAQCAtMTIzNiwxOSArMTE5NiwyMSBAQAogICAgICAgaWYgKCFwWEZBQ2hpbGQpCiAgICAgICAgIHJldHVybjsKIAotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NOb2RlU3RyOwotICAgICAgc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4ocFhNTENoaWxkKS0+R2V0TG9jYWxUYWdOYW1lKHdzTm9kZVN0cik7Ci0gICAgICBwWEZBQ2hpbGQtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOb2RlU3RyKTsKKyAgICAgIFdpZGVTdHJpbmcgd3NOb2RlU3RyID0KKyAgICAgICAgICBzdGF0aWNfY2FzdDxDRlhfWE1MRWxlbWVudCo+KHBYTUxDaGlsZCktPkdldExvY2FsVGFnTmFtZSgpOworICAgICAgcFhGQUNoaWxkLT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpOYW1lLCB3c05vZGVTdHIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CiAgICAgICBQYXJzZURhdGFWYWx1ZShwWEZBQ2hpbGQsIHBYTUxDaGlsZCwgZVBhY2tldElEKTsKLSAgICAgIHBYRkFOb2RlLT5JbnNlcnRDaGlsZChwWEZBQ2hpbGQpOworICAgICAgcFhGQU5vZGUtPkluc2VydENoaWxkKHBYRkFDaGlsZCwgbnVsbHB0cik7CiAgICAgICBwWEZBQ2hpbGQtPlNldFhNTE1hcHBpbmdOb2RlKHBYTUxDaGlsZCk7CiAgICAgICBwWEZBQ2hpbGQtPlNldEZsYWcoWEZBX05vZGVGbGFnX0luaXRpYWxpemVkLCBmYWxzZSk7Ci0gICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NDdXJWYWx1ZSA9IHBYRkFDaGlsZC0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSk7CisgICAgICBXaWRlU3RyaW5nIHdzQ3VyVmFsdWUgPQorICAgICAgICAgIHBYRkFDaGlsZC0+SlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6VmFsdWUpOwogICAgICAgd3NWYWx1ZVRleHRCdWYgPDwgd3NDdXJWYWx1ZTsKICAgICB9CiAgIH0KICAgaWYgKHBYTUxDdXJWYWx1ZU5vZGUpIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c0N1clZhbHVlID0gd3NDdXJWYWx1ZVRleHRCdWYuTWFrZVN0cmluZygpOworICAgIFdpZGVTdHJpbmcgd3NDdXJWYWx1ZSA9IHdzQ3VyVmFsdWVUZXh0QnVmLk1ha2VTdHJpbmcoKTsKICAgICBpZiAoIXdzQ3VyVmFsdWUuSXNFbXB0eSgpKSB7CiAgICAgICBpZiAoYk1hcmtBc0NvbXBvdW5kKSB7CiAgICAgICAgIENYRkFfTm9kZSogcFhGQUNoaWxkID0KQEAgLTEyNTYsOSArMTIxOCwxMCBAQAogICAgICAgICBpZiAoIXBYRkFDaGlsZCkKICAgICAgICAgICByZXR1cm47CiAKLSAgICAgICAgcFhGQUNoaWxkLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIEwiIik7Ci0gICAgICAgIHBYRkFDaGlsZC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9WYWx1ZSwgd3NDdXJWYWx1ZSk7Ci0gICAgICAgIHBYRkFOb2RlLT5JbnNlcnRDaGlsZChwWEZBQ2hpbGQpOworICAgICAgICBwWEZBQ2hpbGQtPkpTT2JqZWN0KCktPlNldENEYXRhKFhGQV9BdHRyaWJ1dGU6Ok5hbWUsIEwiIiwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgcFhGQUNoaWxkLT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpWYWx1ZSwgd3NDdXJWYWx1ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICBwWEZBTm9kZS0+SW5zZXJ0Q2hpbGQocFhGQUNoaWxkLCBudWxscHRyKTsKICAgICAgICAgcFhGQUNoaWxkLT5TZXRYTUxNYXBwaW5nTm9kZShwWE1MQ3VyVmFsdWVOb2RlKTsKICAgICAgICAgcFhGQUNoaWxkLT5TZXRGbGFnKFhGQV9Ob2RlRmxhZ19Jbml0aWFsaXplZCwgZmFsc2UpOwogICAgICAgfQpAQCAtMTI2NywzNSArMTIzMCwzMCBAQAogICAgIH0KICAgICBwWE1MQ3VyVmFsdWVOb2RlID0gbnVsbHB0cjsKICAgfQotICBDRlhfV2lkZVN0cmluZyB3c05vZGVWYWx1ZSA9IHdzVmFsdWVUZXh0QnVmLk1ha2VTdHJpbmcoKTsKLSAgcFhGQU5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzTm9kZVZhbHVlKTsKKyAgV2lkZVN0cmluZyB3c05vZGVWYWx1ZSA9IHdzVmFsdWVUZXh0QnVmLk1ha2VTdHJpbmcoKTsKKyAgcFhGQU5vZGUtPkpTT2JqZWN0KCktPlNldENEYXRhKFhGQV9BdHRyaWJ1dGU6OlZhbHVlLCB3c05vZGVWYWx1ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CiB9CiAKIHZvaWQgQ1hGQV9TaW1wbGVQYXJzZXI6OlBhcnNlSW5zdHJ1Y3Rpb24oQ1hGQV9Ob2RlKiBwWEZBTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9YTUxJbnN0cnVjdGlvbiogcFhNTEluc3RydWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfWE1MSW5zdHJ1Y3Rpb24qIHBYTUxJbnN0cnVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgZVBhY2tldElEKSB7CiAgIGlmICghbV9iRG9jdW1lbnRQYXJzZXIpCiAgICAgcmV0dXJuOwogCi0gIENGWF9XaWRlU3RyaW5nIHdzVGFyZ2V0TmFtZTsKLSAgcFhNTEluc3RydWN0aW9uLT5HZXRUYXJnZXROYW1lKHdzVGFyZ2V0TmFtZSk7CisgIFdpZGVTdHJpbmcgd3NUYXJnZXROYW1lID0gcFhNTEluc3RydWN0aW9uLT5HZXROYW1lKCk7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPFdpZGVTdHJpbmc+JiB0YXJnZXRfZGF0YSA9IHBYTUxJbnN0cnVjdGlvbi0+R2V0VGFyZ2V0RGF0YSgpOwogICBpZiAod3NUYXJnZXROYW1lID09IEwib3JpZ2luYWxYRkFWZXJzaW9uIikgewotICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0YTsKLSAgICBpZiAocFhNTEluc3RydWN0aW9uLT5HZXREYXRhKDAsIHdzRGF0YSkgJiYKLSAgICAgICAgKHBYRkFOb2RlLT5HZXREb2N1bWVudCgpLT5SZWNvZ25pemVYRkFWZXJzaW9uTnVtYmVyKHdzRGF0YSkgIT0KLSAgICAgICAgIFhGQV9WRVJTSU9OX1VOS05PV04pKSB7Ci0gICAgICB3c0RhdGEuY2xlYXIoKTsKLSAgICAgIGlmIChwWE1MSW5zdHJ1Y3Rpb24tPkdldERhdGEoMSwgd3NEYXRhKSAmJgotICAgICAgICAgIHdzRGF0YSA9PSBMInYyLjctc2NyaXB0aW5nOjEiKSB7Ci0gICAgICAgIHBYRkFOb2RlLT5HZXREb2N1bWVudCgpLT5TZXRGbGFnKFhGQV9ET0NGTEFHX1NjcmlwdGluZywgdHJ1ZSk7Ci0gICAgICB9CisgICAgaWYgKHRhcmdldF9kYXRhLnNpemUoKSA+IDEgJiYKKyAgICAgICAgKHBYRkFOb2RlLT5HZXREb2N1bWVudCgpLT5SZWNvZ25pemVYRkFWZXJzaW9uTnVtYmVyKHRhcmdldF9kYXRhWzBdKSAhPQorICAgICAgICAgWEZBX1ZFUlNJT05fVU5LTk9XTikgJiYKKyAgICAgICAgdGFyZ2V0X2RhdGFbMV0gPT0gTCJ2Mi43LXNjcmlwdGluZzoxIikgeworICAgICAgcFhGQU5vZGUtPkdldERvY3VtZW50KCktPlNldEZsYWcoWEZBX0RPQ0ZMQUdfU2NyaXB0aW5nLCB0cnVlKTsKICAgICB9CiAgIH0gZWxzZSBpZiAod3NUYXJnZXROYW1lID09IEwiYWNyb2JhdCIpIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGE7Ci0gICAgaWYgKHBYTUxJbnN0cnVjdGlvbi0+R2V0RGF0YSgwLCB3c0RhdGEpICYmIHdzRGF0YSA9PSBMIkphdmFTY3JpcHQiKSB7Ci0gICAgICBpZiAocFhNTEluc3RydWN0aW9uLT5HZXREYXRhKDEsIHdzRGF0YSkgJiYgd3NEYXRhID09IEwic3RyaWN0U2NvcGluZyIpIHsKLSAgICAgICAgcFhGQU5vZGUtPkdldERvY3VtZW50KCktPlNldEZsYWcoWEZBX0RPQ0ZMQUdfU3RyaWN0U2NvcGluZywgdHJ1ZSk7Ci0gICAgICB9CisgICAgaWYgKHRhcmdldF9kYXRhLnNpemUoKSA+IDEgJiYgdGFyZ2V0X2RhdGFbMF0gPT0gTCJKYXZhU2NyaXB0IiAmJgorICAgICAgICB0YXJnZXRfZGF0YVsxXSA9PSBMInN0cmljdFNjb3BpbmciKSB7CisgICAgICBwWEZBTm9kZS0+R2V0RG9jdW1lbnQoKS0+U2V0RmxhZyhYRkFfRE9DRkxBR19TdHJpY3RTY29waW5nLCB0cnVlKTsKICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NpbXBsZV9wYXJzZXIuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NpbXBsZV9wYXJzZXIuaAppbmRleCA1ZjYxYWQ3Li43YTIwZGUzIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaW1wbGVfcGFyc2VyLmgKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2ltcGxlX3BhcnNlci5oCkBAIC05LDgxICs5LDgwIEBACiAKICNpbmNsdWRlIDxtZW1vcnk+CiAKLSNpbmNsdWRlICJ4ZmEvZmRlL3htbC9mZGVfeG1sX2ltcC5oIgogI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmFfYmFzaWMuaCIKIAogY2xhc3MgQ1hGQV9Eb2N1bWVudDsKIGNsYXNzIENYRkFfTm9kZTsKLWNsYXNzIENYRkFfWE1MUGFyc2VyOwotY2xhc3MgSUZYX1NlZWthYmxlUmVhZFN0cmVhbTsKLWNsYXNzIElGWF9QYXVzZTsKLWNsYXNzIElGR0FTX1N0cmVhbTsKK2NsYXNzIENGWF9YTUxEb2M7CitjbGFzcyBDRlhfWE1MSW5zdHJ1Y3Rpb247CitjbGFzcyBDRlhfWE1MTm9kZTsKK2NsYXNzIENGWF9YTUxQYXJzZXI7CitjbGFzcyBJRlhfU2Vla2FibGVTdHJlYW07CitjbGFzcyBDRlhfU2Vla2FibGVTdHJlYW1Qcm94eTsKIAogY2xhc3MgQ1hGQV9TaW1wbGVQYXJzZXIgewogIHB1YmxpYzoKLSAgQ1hGQV9TaW1wbGVQYXJzZXIoQ1hGQV9Eb2N1bWVudCogcEZhY3RvcnksIGJvb2wgYkRvY3VtZW50UGFyc2VyKTsKKyAgQ1hGQV9TaW1wbGVQYXJzZXIoKTsKKyAgZXhwbGljaXQgQ1hGQV9TaW1wbGVQYXJzZXIoQ1hGQV9Eb2N1bWVudCogcEZhY3RvcnkpOwogICB+Q1hGQV9TaW1wbGVQYXJzZXIoKTsKIAotICBpbnQzMl90IFN0YXJ0UGFyc2UoY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiYgcFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKTsKLSAgaW50MzJfdCBEb1BhcnNlKElGWF9QYXVzZSogcFBhdXNlKTsKLSAgaW50MzJfdCBQYXJzZVhNTERhdGEoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzWE1MLAotICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1hNTE5vZGUqJiBwWE1MTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgSUZYX1BhdXNlKiBwUGF1c2UpOwotICB2b2lkIENvbnN0cnVjdFhGQU5vZGUoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwgQ0ZERV9YTUxOb2RlKiBwWE1MTm9kZSk7CisgIGludDMyX3QgU3RhcnRQYXJzZShjb25zdCBSZXRhaW5QdHI8SUZYX1NlZWthYmxlU3RyZWFtPiYgcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIGVQYWNrZXRJRCk7CisgIGludDMyX3QgRG9QYXJzZSgpOworICBDRlhfWE1MTm9kZSogUGFyc2VYTUxEYXRhKGNvbnN0IEJ5dGVTdHJpbmcmIHdzWE1MKTsKKyAgdm9pZCBDb25zdHJ1Y3RYRkFOb2RlKENYRkFfTm9kZSogcFhGQU5vZGUsIENGWF9YTUxOb2RlKiBwWE1MTm9kZSk7CiAgIENYRkFfTm9kZSogR2V0Um9vdE5vZGUoKSBjb25zdDsKLSAgQ0ZERV9YTUxEb2MqIEdldFhNTERvYygpIGNvbnN0OworICBDRlhfWE1MRG9jKiBHZXRYTUxEb2MoKSBjb25zdDsKICAgdm9pZCBDbG9zZVBhcnNlcigpOwogCisgIC8vIENhbGxlZCBsYXRlciBmb3IgdGhlIGN0b3Igd2l0aCBubyBwYXJhbWV0ZXJzLgogICB2b2lkIFNldEZhY3RvcnkoQ1hGQV9Eb2N1bWVudCogcEZhY3RvcnkpOwogCiAgcHJpdmF0ZToKLSAgQ1hGQV9Ob2RlKiBQYXJzZUFzWERQUGFja2V0KENGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKTsKLSAgQ1hGQV9Ob2RlKiBQYXJzZUFzWERQUGFja2V0X1hEUChDRkRFX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpOwotICBDWEZBX05vZGUqIFBhcnNlQXNYRFBQYWNrZXRfQ29uZmlnKENGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCk7Ci0gIENYRkFfTm9kZSogUGFyc2VBc1hEUFBhY2tldF9UZW1wbGF0ZUZvcm0oQ0ZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElEKTsKLSAgQ1hGQV9Ob2RlKiBQYXJzZUFzWERQUGFja2V0X0RhdGEoQ0ZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCk7CisgIENYRkFfTm9kZSogUGFyc2VBc1hEUFBhY2tldChDRlhfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIGVQYWNrZXRJRCk7CisgIENYRkFfTm9kZSogUGFyc2VBc1hEUFBhY2tldF9YRFAoQ0ZYX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUpOworICBDWEZBX05vZGUqIFBhcnNlQXNYRFBQYWNrZXRfQ29uZmlnKENGWF9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlKTsKKyAgQ1hGQV9Ob2RlKiBQYXJzZUFzWERQUGFja2V0X1RlbXBsYXRlKENGWF9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlKTsKKyAgQ1hGQV9Ob2RlKiBQYXJzZUFzWERQUGFja2V0X0Zvcm0oQ0ZYX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUpOworICBDWEZBX05vZGUqIFBhcnNlQXNYRFBQYWNrZXRfRGF0YShDRlhfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSk7CiAgIENYRkFfTm9kZSogUGFyc2VBc1hEUFBhY2tldF9Mb2NhbGVDb25uZWN0aW9uU291cmNlU2V0KAotICAgICAgQ0ZERV9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlLAotICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpOwotICBDWEZBX05vZGUqIFBhcnNlQXNYRFBQYWNrZXRfWGRjKENGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCk7Ci0gIENYRkFfTm9kZSogUGFyc2VBc1hEUFBhY2tldF9Vc2VyKENGREVfWE1MTm9kZSogcFhNTERvY3VtZW50Tm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpOworICAgICAgQ0ZYX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUsCisgICAgICBYRkFfUGFja2V0VHlwZSBwYWNrZXRfdHlwZSwKKyAgICAgIFhGQV9FbGVtZW50IGVsZW1lbnQpOworICBDWEZBX05vZGUqIFBhcnNlQXNYRFBQYWNrZXRfWGRjKENGWF9YTUxOb2RlKiBwWE1MRG9jdW1lbnROb2RlKTsKKyAgQ1hGQV9Ob2RlKiBQYXJzZUFzWERQUGFja2V0X1VzZXIoQ0ZYX1hNTE5vZGUqIHBYTUxEb2N1bWVudE5vZGUpOwogICBDWEZBX05vZGUqIE5vcm1hbExvYWRlcihDWEZBX05vZGUqIHBYRkFOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1hNTE5vZGUqIHBYTUxEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVQgZVBhY2tldElELAorICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfWE1MTm9kZSogcFhNTERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgZVBhY2tldElELAogICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJVc2VBdHRyaWJ1dGUpOwogICBDWEZBX05vZGUqIERhdGFMb2FkZXIoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIENGREVfWE1MTm9kZSogcFhNTERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgIENGWF9YTUxOb2RlKiBwWE1MRG9jLAogICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiRG9UcmFuc2Zvcm0pOwotICBDWEZBX05vZGUqIFVzZXJQYWNrZXRMb2FkZXIoQ1hGQV9Ob2RlKiBwWEZBTm9kZSwgQ0ZERV9YTUxOb2RlKiBwWE1MRG9jKTsKKyAgQ1hGQV9Ob2RlKiBVc2VyUGFja2V0TG9hZGVyKENYRkFfTm9kZSogcFhGQU5vZGUsIENGWF9YTUxOb2RlKiBwWE1MRG9jKTsKICAgdm9pZCBQYXJzZUNvbnRlbnROb2RlKENYRkFfTm9kZSogcFhGQU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBDRkRFX1hNTE5vZGUqIHBYTUxOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1hNTE5vZGUqIHBYTUxOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgZVBhY2tldElEKTsKICAgdm9pZCBQYXJzZURhdGFWYWx1ZShDWEZBX05vZGUqIHBYRkFOb2RlLAotICAgICAgICAgICAgICAgICAgICAgIENGREVfWE1MTm9kZSogcFhNTE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpOworICAgICAgICAgICAgICAgICAgICAgIENGWF9YTUxOb2RlKiBwWE1MTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBlUGFja2V0SUQpOwogICB2b2lkIFBhcnNlRGF0YUdyb3VwKENYRkFfTm9kZSogcFhGQU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgQ0ZERV9YTUxOb2RlKiBwWE1MTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUIGVQYWNrZXRJRCk7CisgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1hNTE5vZGUqIHBYTUxOb2RlLAorICAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIGVQYWNrZXRJRCk7CiAgIHZvaWQgUGFyc2VJbnN0cnVjdGlvbihDWEZBX05vZGUqIHBYRkFOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgQ0ZERV9YTUxJbnN0cnVjdGlvbiogcFhNTEluc3RydWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVCBlUGFja2V0SUQpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1hNTEluc3RydWN0aW9uKiBwWE1MSW5zdHJ1Y3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBlUGFja2V0SUQpOwogCi0gIENYRkFfWE1MUGFyc2VyKiBtX3BYTUxQYXJzZXI7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRkRFX1hNTERvYz4gbV9wWE1MRG9jOwotICBDRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4gbV9wU3RyZWFtOwotICBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IG1fcEZpbGVSZWFkOwotICBDWEZBX0RvY3VtZW50KiBtX3BGYWN0b3J5OwotICBDWEZBX05vZGUqIG1fcFJvb3ROb2RlOwotICBYRkFfWERQUEFDS0VUIG1fZVBhY2tldElEOwotICBib29sIG1fYkRvY3VtZW50UGFyc2VyOworICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1hNTERvYz4gbV9wWE1MRG9jOworICBVbm93bmVkUHRyPENGWF9YTUxQYXJzZXI+IG1fcFhNTFBhcnNlcjsgIC8vIE93bmVkIGJ5IHxtX3BYTUxEb2N8CisgIFJldGFpblB0cjxDRlhfU2Vla2FibGVTdHJlYW1Qcm94eT4gbV9wU3RyZWFtOworICBSZXRhaW5QdHI8SUZYX1NlZWthYmxlU3RyZWFtPiBtX3BGaWxlUmVhZDsKKyAgVW5vd25lZFB0cjxDWEZBX0RvY3VtZW50PiBtX3BGYWN0b3J5OworICAvLyBUT0RPKGRzaW5jbGFpcik6IEZpZ3VyZSBvdXQgd2hvIG93bnMgdGhpcy4KKyAgQ1hGQV9Ob2RlKiBtX3BSb290Tm9kZSA9IG51bGxwdHI7CisgIFhGQV9QYWNrZXRUeXBlIG1fZVBhY2tldElEID0gWEZBX1BhY2tldFR5cGU6OlVzZXI7CisgIGJvb2wgbV9iUGFyc2VTdGFydGVkID0gZmFsc2U7CisgIGNvbnN0IGJvb2wgbV9iRG9jdW1lbnRQYXJzZXI7CiB9OwogCiAjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NJTVBMRV9QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NpbXBsZV9wYXJzZXJfZW1iZWRkZXJ0ZXN0LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NpbXBsZV9wYXJzZXJfZW1iZWRkZXJ0ZXN0LmNwcAppbmRleCBhMzMxNjk2Li4xNzRmZWJmIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zaW1wbGVfcGFyc2VyX2VtYmVkZGVydGVzdC5jcHAKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2ltcGxlX3BhcnNlcl9lbWJlZGRlcnRlc3QuY3BwCkBAIC0xMywzICsxMywxMCBAQAogICBFWFBFQ1RfTkUobnVsbHB0ciwgcGFnZSk7CiAgIFVubG9hZFBhZ2UocGFnZSk7CiB9CisKK1RFU1RfRihDWEZBU2ltcGxlUGFyc2VyRW1iZWRkZXJ0ZXN0LCBCdWdfNzA5NzkzKSB7CisgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgiYnVnXzcwOTc5My5wZGYiKSk7CisgIEZQREZfUEFHRSBwYWdlID0gTG9hZFBhZ2UoMCk7CisgIEVYUEVDVF9ORShudWxscHRyLCBwYWdlKTsKKyAgVW5sb2FkUGFnZShwYWdlKTsKK30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NvYXBhY3Rpb24uY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc29hcGFjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUzYTY1MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NvYXBhY3Rpb24uY3BwCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NvYXBhY3Rpb24uaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zb2FwYWN0aW9uLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwic29hcEFjdGlvbiI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1NvYXBBY3Rpb246OkNYRkFfU29hcEFjdGlvbihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6VGV4dE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlNvYXBBY3Rpb24sCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX1NvYXBBY3Rpb24+KHRoaXMpKSB7fQorCitDWEZBX1NvYXBBY3Rpb246On5DWEZBX1NvYXBBY3Rpb24oKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc29hcGFjdGlvbi5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc29hcGFjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MDNlYWUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zb2FwYWN0aW9uLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NPQVBBQ1RJT05fSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU09BUEFDVElPTl9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1NvYXBBY3Rpb24gOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfU29hcEFjdGlvbihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1NvYXBBY3Rpb24oKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU09BUEFDVElPTl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc29hcGFkZHJlc3MuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc29hcGFkZHJlc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZjkxYTUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zb2FwYWRkcmVzcy5jcHAKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc29hcGFkZHJlc3MuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zb2FwYWRkcmVzcy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInNvYXBBZGRyZXNzIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfU29hcEFkZHJlc3M6OkNYRkFfU29hcEFkZHJlc3MoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OlRleHROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpTb2FwQWRkcmVzcywKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfU29hcEFkZHJlc3M+KHRoaXMpKSB7fQorCitDWEZBX1NvYXBBZGRyZXNzOjp+Q1hGQV9Tb2FwQWRkcmVzcygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zb2FwYWRkcmVzcy5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc29hcGFkZHJlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGZlZmY0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc29hcGFkZHJlc3MuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU09BUEFERFJFU1NfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU09BUEFERFJFU1NfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9Tb2FwQWRkcmVzcyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9Tb2FwQWRkcmVzcyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1NvYXBBZGRyZXNzKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NPQVBBRERSRVNTX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zb2xpZC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zb2xpZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEyMDE5NAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NvbGlkLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zb2xpZC5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3NvbGlkLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpFeHRyYXMsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInNvbGlkIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfU29saWQ6OkNYRkFfU29saWQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlNvbGlkLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9Tb2xpZD4odGhpcykpIHt9CisKK0NYRkFfU29saWQ6On5DWEZBX1NvbGlkKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NvbGlkLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zb2xpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMWUyZDAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zb2xpZC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TT0xJRF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TT0xJRF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1NvbGlkIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1NvbGlkKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfU29saWQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU09MSURfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NvdXJjZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZDM3MzYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zb3VyY2UuY3BwCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NvdXJjZS5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3NvdXJjZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0ge3tYRkFfRWxlbWVudDo6Q29ubmVjdCwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwic291cmNlIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfU291cmNlOjpDWEZBX1NvdXJjZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpTb3VyY2UsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX1NvdXJjZT4odGhpcykpIHt9CisKK0NYRkFfU291cmNlOjp+Q1hGQV9Tb3VyY2UoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc291cmNlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjc0YmU4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc291cmNlLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NPVVJDRV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TT1VSQ0VfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9Tb3VyY2UgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfU291cmNlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfU291cmNlKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc291cmNlc2V0LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NvdXJjZXNldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RlYWJjNgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NvdXJjZXNldC5jcHAKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc291cmNlc2V0LmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc291cmNlc2V0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwic291cmNlU2V0IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfU291cmNlU2V0OjpDWEZBX1NvdXJjZVNldChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpNb2RlbE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlNvdXJjZVNldCwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfU291cmNlU2V0Pih0aGlzKSkge30KKworQ1hGQV9Tb3VyY2VTZXQ6On5DWEZBX1NvdXJjZVNldCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zb3VyY2VzZXQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NvdXJjZXNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwN2UxMmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zb3VyY2VzZXQuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU09VUkNFU0VUX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NPVVJDRVNFVF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1NvdXJjZVNldCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9Tb3VyY2VTZXQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9Tb3VyY2VTZXQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU09VUkNFU0VUX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zcGVhay5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zcGVhay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwNTY4MgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3NwZWFrLmNwcApAQCAtMCwwICsxLDM5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zcGVhay5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3NwZWFrLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlJpZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpQcmlvcml0eSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6Q3VzdG9tfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGlzYWJsZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkJvb2xlYW4sICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwic3BlYWsiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9TcGVhazo6Q1hGQV9TcGVhayhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6VGV4dE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlNwZWFrLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9TcGVhaz4odGhpcykpIHt9CisKK0NYRkFfU3BlYWs6On5DWEZBX1NwZWFrKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3NwZWFrLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zcGVhay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZWY1NGIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zcGVhay5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TUEVBS19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TUEVBS19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1NwZWFrIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1NwZWFrKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfU3BlYWsoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU1BFQUtfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3N0YXBsZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdGFwbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNzM2ZDEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdGFwbGUuY3BwCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3N0YXBsZS5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TW9kZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6VXNlUHJpbnRlclNldHRpbmd9LAorICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJzdGFwbGUiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9TdGFwbGU6OkNYRkFfU3RhcGxlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlN0YXBsZSwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX1N0YXBsZTo6fkNYRkFfU3RhcGxlKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3N0YXBsZS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3RhcGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY1MWZhNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3N0YXBsZS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TVEFQTEVfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU1RBUExFX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfU3RhcGxlIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1N0YXBsZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1N0YXBsZSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TVEFQTEVfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3N0YXJ0bm9kZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdGFydG5vZGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OWI1OTUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdGFydG5vZGUuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3N0YXJ0bm9kZS5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwic3RhcnROb2RlIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfU3RhcnROb2RlOjpDWEZBX1N0YXJ0Tm9kZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlViwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6U3RhcnROb2RlLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfU3RhcnROb2RlOjp+Q1hGQV9TdGFydE5vZGUoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3RhcnRub2RlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdGFydG5vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTgxNWU1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3RhcnRub2RlLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NUQVJUTk9ERV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TVEFSVE5PREVfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9TdGFydE5vZGUgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfU3RhcnROb2RlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfU3RhcnROb2RlKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NUQVJUTk9ERV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3RhcnRwYWdlLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3N0YXJ0cGFnZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUyZGFmMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3N0YXJ0cGFnZS5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3RhcnRwYWdlLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJzdGFydFBhZ2UiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9TdGFydFBhZ2U6OkNYRkFfU3RhcnRQYWdlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpTdGFydFBhZ2UsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9TdGFydFBhZ2U6On5DWEZBX1N0YXJ0UGFnZSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdGFydHBhZ2UuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3N0YXJ0cGFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNjJhYTcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdGFydHBhZ2UuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU1RBUlRQQUdFX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NUQVJUUEFHRV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1N0YXJ0UGFnZSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9TdGFydFBhZ2UoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9TdGFydFBhZ2UoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU1RBUlRQQUdFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdGlwcGxlLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3N0aXBwbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YzA1OWUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdGlwcGxlLmNwcApAQCAtMCwwICsxLDcyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdGlwcGxlLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc3RpcHBsZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb2xvci5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpDb2xvciwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpFeHRyYXMsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlJhdGUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopNTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJzdGlwcGxlIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfU3RpcHBsZTo6Q1hGQV9TdGlwcGxlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpTdGlwcGxlLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9TdGlwcGxlPih0aGlzKSkge30KKworQ1hGQV9TdGlwcGxlOjp+Q1hGQV9TdGlwcGxlKCkge30KKworQ1hGQV9Db2xvciogQ1hGQV9TdGlwcGxlOjpHZXRDb2xvcklmRXhpc3RzKCkgeworICByZXR1cm4gR2V0Q2hpbGQ8Q1hGQV9Db2xvcj4oMCwgWEZBX0VsZW1lbnQ6OkNvbG9yLCBmYWxzZSk7Cit9CisKK2ludDMyX3QgQ1hGQV9TdGlwcGxlOjpHZXRSYXRlKCkgeworICByZXR1cm4gSlNPYmplY3QoKQorICAgICAgLT5UcnlJbnRlZ2VyKFhGQV9BdHRyaWJ1dGU6OlJhdGUsIHRydWUpCisgICAgICAudmFsdWVfb3IoR2V0RGVmYXVsdFJhdGUoKSk7Cit9CisKK3ZvaWQgQ1hGQV9TdGlwcGxlOjpEcmF3KENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfR0VQYXRoKiBmaWxsUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRGaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KSB7CisgIGludDMyX3QgaVJhdGUgPSBHZXRSYXRlKCk7CisgIGlmIChpUmF0ZSA9PSAwKQorICAgIGlSYXRlID0gMTAwOworCisgIENYRkFfQ29sb3IqIHBDb2xvciA9IEdldENvbG9ySWZFeGlzdHMoKTsKKyAgRlhfQVJHQiBjckNvbG9yID0gcENvbG9yID8gcENvbG9yLT5HZXRWYWx1ZSgpIDogQ1hGQV9Db2xvcjo6a0JsYWNrQ29sb3I7CisKKyAgaW50MzJfdCBhOworICBGWF9DT0xPUlJFRiByZ2I7CisgIHN0ZDo6dGllKGEsIHJnYikgPSBBcmdiVG9Db2xvclJlZihjckNvbG9yKTsKKyAgRlhfQVJHQiBjciA9IEFyZ2JFbmNvZGUoaVJhdGUgKiBhIC8gMTAwLCByZ2IpOworCisgIHBHUy0+U2F2ZUdyYXBoU3RhdGUoKTsKKyAgcEdTLT5TZXRGaWxsQ29sb3IoQ1hGQV9HRUNvbG9yKGNyKSk7CisgIHBHUy0+RmlsbFBhdGgoZmlsbFBhdGgsIEZYRklMTF9XSU5ESU5HLCAmbWF0cml4KTsKKyAgcEdTLT5SZXN0b3JlR3JhcGhTdGF0ZSgpOworfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3RpcHBsZS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3RpcHBsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOTUzNGIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdGlwcGxlLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NUSVBQTEVfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU1RJUFBMRV9IXworCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb29yZGluYXRlcy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jeGZhX2dlcGF0aC5oIgorCitjbGFzcyBDWEZBX0NvbG9yOworY2xhc3MgQ1hGQV9HcmFwaGljczsKKworY2xhc3MgQ1hGQV9TdGlwcGxlIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBzdGF0aWMgaW50MzJfdCBHZXREZWZhdWx0UmF0ZSgpIHsgcmV0dXJuIDUwOyB9CisKKyAgQ1hGQV9TdGlwcGxlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfU3RpcHBsZSgpIG92ZXJyaWRlOworCisgIHZvaWQgRHJhdyhDWEZBX0dyYXBoaWNzKiBwR1MsCisgICAgICAgICAgICBDWEZBX0dFUGF0aCogZmlsbFBhdGgsCisgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0RmlsbCwKKyAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCk7CisKKyBwcml2YXRlOgorICBDWEZBX0NvbG9yKiBHZXRDb2xvcklmRXhpc3RzKCk7CisgIGludDMyX3QgR2V0UmF0ZSgpOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TVElQUExFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdHJva2UuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3Ryb2tlLmNwcAppbmRleCA2MDJmMmY5Li45ZDU5MTZhIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdHJva2UuY3BwCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3N0cm9rZS5jcHAKQEAgLTYsMTAxICs2LDE4OCBAQAogCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3Ryb2tlLmgiCiAKKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X29iamVjdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL2N4ZmFfZmZ3aWRnZXQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb2xvci5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21lYXN1cmVtZW50LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV91dGlscy5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ3JhcGhpY3MuaCIKIAotaW50MzJfdCBDWEZBX1N0cm9rZTo6R2V0UHJlc2VuY2UoKSBjb25zdCB7Ci0gIHJldHVybiBtX3BOb2RlID8gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1ByZXNlbmNlKQotICAgICAgICAgICAgICAgICA6IFhGQV9BVFRSSUJVVEVFTlVNX0ludmlzaWJsZTsKK3ZvaWQgWEZBX1N0cm9rZVR5cGVTZXRMaW5lRGFzaChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZUVudW0gaVN0cm9rZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZUVudW0gaUNhcFR5cGUpIHsKKyAgc3dpdGNoIChpU3Ryb2tlVHlwZSkgeworICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkRhc2hEb3Q6IHsKKyAgICAgIGZsb2F0IGRhc2hBcnJheVtdID0gezQsIDEsIDIsIDF9OworICAgICAgaWYgKGlDYXBUeXBlICE9IFhGQV9BdHRyaWJ1dGVFbnVtOjpCdXR0KSB7CisgICAgICAgIGRhc2hBcnJheVsxXSA9IDI7CisgICAgICAgIGRhc2hBcnJheVszXSA9IDI7CisgICAgICB9CisgICAgICBwR3JhcGhpY3MtPlNldExpbmVEYXNoKDAsIGRhc2hBcnJheSwgNCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6RGFzaERvdERvdDogeworICAgICAgZmxvYXQgZGFzaEFycmF5W10gPSB7NCwgMSwgMiwgMSwgMiwgMX07CisgICAgICBpZiAoaUNhcFR5cGUgIT0gWEZBX0F0dHJpYnV0ZUVudW06OkJ1dHQpIHsKKyAgICAgICAgZGFzaEFycmF5WzFdID0gMjsKKyAgICAgICAgZGFzaEFycmF5WzNdID0gMjsKKyAgICAgICAgZGFzaEFycmF5WzVdID0gMjsKKyAgICAgIH0KKyAgICAgIHBHcmFwaGljcy0+U2V0TGluZURhc2goMCwgZGFzaEFycmF5LCA2KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpEYXNoZWQ6IHsKKyAgICAgIGZsb2F0IGRhc2hBcnJheVtdID0gezUsIDF9OworICAgICAgaWYgKGlDYXBUeXBlICE9IFhGQV9BdHRyaWJ1dGVFbnVtOjpCdXR0KQorICAgICAgICBkYXNoQXJyYXlbMV0gPSAyOworCisgICAgICBwR3JhcGhpY3MtPlNldExpbmVEYXNoKDAsIGRhc2hBcnJheSwgMik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6RG90dGVkOiB7CisgICAgICBmbG9hdCBkYXNoQXJyYXlbXSA9IHsyLCAxfTsKKyAgICAgIGlmIChpQ2FwVHlwZSAhPSBYRkFfQXR0cmlidXRlRW51bTo6QnV0dCkKKyAgICAgICAgZGFzaEFycmF5WzFdID0gMjsKKworICAgICAgcEdyYXBoaWNzLT5TZXRMaW5lRGFzaCgwLCBkYXNoQXJyYXksIDIpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICBwR3JhcGhpY3MtPlNldFNvbGlkTGluZURhc2goKTsKKyAgICAgIGJyZWFrOworICB9CiB9CiAKLWludDMyX3QgQ1hGQV9TdHJva2U6OkdldENhcFR5cGUoKSBjb25zdCB7Ci0gIGlmICghbV9wTm9kZSkKLSAgICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fU3F1YXJlOwotICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0NhcCk7CitDWEZBX1N0cm9rZTo6Q1hGQV9TdHJva2UoQ1hGQV9Eb2N1bWVudCogcERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBlUGFja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbGlkUGFja2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZSBvVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudCBlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcm9wZXJ0eURhdGEqIHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlRGF0YSogYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgZWxlbWVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENKWF9PYmplY3Q+IGpzX25vZGUpCisgICAgOiBDWEZBX05vZGUocERvYywKKyAgICAgICAgICAgICAgICBlUGFja2V0LAorICAgICAgICAgICAgICAgIHZhbGlkUGFja2V0cywKKyAgICAgICAgICAgICAgICBvVHlwZSwKKyAgICAgICAgICAgICAgICBlVHlwZSwKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgZWxlbWVudE5hbWUsCisgICAgICAgICAgICAgICAgc3RkOjptb3ZlKGpzX25vZGUpKSB7fQorCitDWEZBX1N0cm9rZTo6fkNYRkFfU3Ryb2tlKCkgPSBkZWZhdWx0OworCitib29sIENYRkFfU3Ryb2tlOjpJc1Zpc2libGUoKSB7CisgIFhGQV9BdHRyaWJ1dGVFbnVtIHByZXNlbmNlID0gSlNPYmplY3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPlRyeUVudW0oWEZBX0F0dHJpYnV0ZTo6UHJlc2VuY2UsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9vcihYRkFfQXR0cmlidXRlRW51bTo6VmlzaWJsZSk7CisgIHJldHVybiBwcmVzZW5jZSA9PSBYRkFfQXR0cmlidXRlRW51bTo6VmlzaWJsZTsKIH0KIAotaW50MzJfdCBDWEZBX1N0cm9rZTo6R2V0U3Ryb2tlVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfU3Ryb2tlKQotICAgICAgICAgICAgICAgICA6IFhGQV9BVFRSSUJVVEVFTlVNX1NvbGlkOworWEZBX0F0dHJpYnV0ZUVudW0gQ1hGQV9TdHJva2U6OkdldENhcFR5cGUoKSB7CisgIHJldHVybiBKU09iamVjdCgpLT5HZXRFbnVtKFhGQV9BdHRyaWJ1dGU6OkNhcCk7CiB9CiAKLUZYX0ZMT0FUIENYRkFfU3Ryb2tlOjpHZXRUaGlja25lc3MoKSBjb25zdCB7Ci0gIHJldHVybiBHZXRNU1RoaWNrbmVzcygpLlRvVW5pdChYRkFfVU5JVF9QdCk7CitYRkFfQXR0cmlidXRlRW51bSBDWEZBX1N0cm9rZTo6R2V0U3Ryb2tlVHlwZSgpIHsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6U3Ryb2tlKTsKK30KKworZmxvYXQgQ1hGQV9TdHJva2U6OkdldFRoaWNrbmVzcygpIGNvbnN0IHsKKyAgcmV0dXJuIEdldE1TVGhpY2tuZXNzKCkuVG9Vbml0KFhGQV9Vbml0OjpQdCk7CiB9CiAKIENYRkFfTWVhc3VyZW1lbnQgQ1hGQV9TdHJva2U6OkdldE1TVGhpY2tuZXNzKCkgY29uc3QgewotICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9UaGlja25lc3MpCi0gICAgICAgICAgICAgICAgIDogWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9NZWFzdXJlKFhGQV9FbGVtZW50OjpFZGdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFX1RoaWNrbmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPkdldE1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6VGhpY2tuZXNzKTsKIH0KIAogdm9pZCBDWEZBX1N0cm9rZTo6U2V0TVNUaGlja25lc3MoQ1hGQV9NZWFzdXJlbWVudCBtc1RoaW5rbmVzcykgewotICBpZiAoIW1fcE5vZGUpCi0gICAgcmV0dXJuOwotCi0gIG1fcE5vZGUtPlNldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9UaGlja25lc3MsIG1zVGhpbmtuZXNzKTsKKyAgSlNPYmplY3QoKS0+U2V0TWVhc3VyZShYRkFfQXR0cmlidXRlOjpUaGlja25lc3MsIG1zVGhpbmtuZXNzLCBmYWxzZSk7CiB9CiAKLUZYX0FSR0IgQ1hGQV9TdHJva2U6OkdldENvbG9yKCkgY29uc3QgewotICBpZiAoIW1fcE5vZGUpCi0gICAgcmV0dXJuIDB4RkYwMDAwMDA7Ci0KLSAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpDb2xvcik7CitGWF9BUkdCIENYRkFfU3Ryb2tlOjpHZXRDb2xvcigpIHsKKyAgQ1hGQV9Db2xvciogcE5vZGUgPSBHZXRDaGlsZDxDWEZBX0NvbG9yPigwLCBYRkFfRWxlbWVudDo6Q29sb3IsIGZhbHNlKTsKICAgaWYgKCFwTm9kZSkKICAgICByZXR1cm4gMHhGRjAwMDAwMDsKIAotICBDRlhfV2lkZVN0cmluZ0Mgd3NDb2xvcjsKLSAgcE5vZGUtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IpOwotICByZXR1cm4gQ1hGQV9EYXRhOjpUb0NvbG9yKHdzQ29sb3IpOworICByZXR1cm4gU3RyaW5nVG9GWEFSR0IoCisgICAgICBwTm9kZS0+SlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6VmFsdWUpLkFzU3RyaW5nVmlldygpKTsKIH0KIAogdm9pZCBDWEZBX1N0cm9rZTo6U2V0Q29sb3IoRlhfQVJHQiBhcmdiKSB7Ci0gIGlmICghbV9wTm9kZSkKKyAgQ1hGQV9Db2xvciogcE5vZGUgPQorICAgICAgSlNPYmplY3QoKS0+R2V0T3JDcmVhdGVQcm9wZXJ0eTxDWEZBX0NvbG9yPigwLCBYRkFfRWxlbWVudDo6Q29sb3IpOworICBpZiAoIXBOb2RlKQogICAgIHJldHVybjsKIAotICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VsZW1lbnQ6OkNvbG9yKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NDb2xvcjsKICAgaW50IGE7CiAgIGludCByOwogICBpbnQgZzsKICAgaW50IGI7Ci0gIEFyZ2JEZWNvZGUoYXJnYiwgYSwgciwgZywgYik7Ci0gIHdzQ29sb3IuRm9ybWF0KEwiJWQsJWQsJWQiLCByLCBnLCBiKTsKLSAgcE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29sb3IpOworICBzdGQ6OnRpZShhLCByLCBnLCBiKSA9IEFyZ2JEZWNvZGUoYXJnYik7CisgIHBOb2RlLT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmc6OkZvcm1hdChMIiVkLCVkLCVkIiwgciwgZywgYiksIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogfQogCi1pbnQzMl90IENYRkFfU3Ryb2tlOjpHZXRKb2luVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfSm9pbikKLSAgICAgICAgICAgICAgICAgOiBYRkFfQVRUUklCVVRFRU5VTV9TcXVhcmU7CitYRkFfQXR0cmlidXRlRW51bSBDWEZBX1N0cm9rZTo6R2V0Sm9pblR5cGUoKSB7CisgIHJldHVybiBKU09iamVjdCgpLT5HZXRFbnVtKFhGQV9BdHRyaWJ1dGU6OkpvaW4pOwogfQogCi1ib29sIENYRkFfU3Ryb2tlOjpJc0ludmVydGVkKCkgY29uc3QgewotICByZXR1cm4gbV9wTm9kZSA/IG1fcE5vZGUtPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9JbnZlcnRlZCkgOiBmYWxzZTsKK2Jvb2wgQ1hGQV9TdHJva2U6OklzSW52ZXJ0ZWQoKSB7CisgIHJldHVybiBKU09iamVjdCgpLT5HZXRCb29sZWFuKFhGQV9BdHRyaWJ1dGU6OkludmVydGVkKTsKIH0KIAotRlhfRkxPQVQgQ1hGQV9TdHJva2U6OkdldFJhZGl1cygpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcE5vZGUgPyBtX3BOb2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmFkaXVzKS5Ub1VuaXQoWEZBX1VOSVRfUHQpCi0gICAgICAgICAgICAgICAgIDogMDsKK2Zsb2F0IENYRkFfU3Ryb2tlOjpHZXRSYWRpdXMoKSBjb25zdCB7CisgIHJldHVybiBKU09iamVjdCgpCisgICAgICAtPlRyeU1lYXN1cmUoWEZBX0F0dHJpYnV0ZTo6UmFkaXVzLCB0cnVlKQorICAgICAgLnZhbHVlX29yKENYRkFfTWVhc3VyZW1lbnQoMCwgWEZBX1VuaXQ6OkluKSkKKyAgICAgIC5Ub1VuaXQoWEZBX1VuaXQ6OlB0KTsKIH0KIAotYm9vbCBDWEZBX1N0cm9rZTo6U2FtZVN0eWxlcyhDWEZBX1N0cm9rZSBzdHJva2UsIHVpbnQzMl90IGR3RmxhZ3MpIGNvbnN0IHsKLSAgaWYgKG1fcE5vZGUgPT0gc3Ryb2tlLkdldE5vZGUoKSkKK2Jvb2wgQ1hGQV9TdHJva2U6OlNhbWVTdHlsZXMoQ1hGQV9TdHJva2UqIHN0cm9rZSwgdWludDMyX3QgZHdGbGFncykgeworICBpZiAodGhpcyA9PSBzdHJva2UpCiAgICAgcmV0dXJuIHRydWU7Ci0gIGlmIChGWFNZU19mYWJzKEdldFRoaWNrbmVzcygpIC0gc3Ryb2tlLkdldFRoaWNrbmVzcygpKSA+PSAwLjAxZikKKyAgaWYgKGZhYnMoR2V0VGhpY2tuZXNzKCkgLSBzdHJva2UtPkdldFRoaWNrbmVzcygpKSA+PSAwLjAxZikKICAgICByZXR1cm4gZmFsc2U7CiAgIGlmICgoZHdGbGFncyAmIFhGQV9TVFJPS0VfU0FNRVNUWUxFX05vUHJlc2VuY2UpID09IDAgJiYKLSAgICAgIElzVmlzaWJsZSgpICE9IHN0cm9rZS5Jc1Zpc2libGUoKSkgeworICAgICAgSXNWaXNpYmxlKCkgIT0gc3Ryb2tlLT5Jc1Zpc2libGUoKSkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQotICBpZiAoR2V0U3Ryb2tlVHlwZSgpICE9IHN0cm9rZS5HZXRTdHJva2VUeXBlKCkpCisgIGlmIChHZXRTdHJva2VUeXBlKCkgIT0gc3Ryb2tlLT5HZXRTdHJva2VUeXBlKCkpCiAgICAgcmV0dXJuIGZhbHNlOwotICBpZiAoR2V0Q29sb3IoKSAhPSBzdHJva2UuR2V0Q29sb3IoKSkKKyAgaWYgKEdldENvbG9yKCkgIT0gc3Ryb2tlLT5HZXRDb2xvcigpKQogICAgIHJldHVybiBmYWxzZTsKICAgaWYgKChkd0ZsYWdzICYgWEZBX1NUUk9LRV9TQU1FU1RZTEVfQ29ybmVyKSAhPSAwICYmCi0gICAgICBGWFNZU19mYWJzKEdldFJhZGl1cygpIC0gc3Ryb2tlLkdldFJhZGl1cygpKSA+PSAwLjAxZikgeworICAgICAgZmFicyhHZXRSYWRpdXMoKSAtIHN0cm9rZS0+R2V0UmFkaXVzKCkpID49IDAuMDFmKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIHJldHVybiB0cnVlOwogfQorCit2b2lkIENYRkFfU3Ryb2tlOjpTdHJva2UoQ1hGQV9HRVBhdGgqIHBQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfR3JhcGhpY3MqIHBHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKKyAgaWYgKCFJc1Zpc2libGUoKSkKKyAgICByZXR1cm47CisKKyAgZmxvYXQgZlRoaWNrbmVzcyA9IEdldFRoaWNrbmVzcygpOworICBpZiAoZlRoaWNrbmVzcyA8IDAuMDAxZikKKyAgICByZXR1cm47CisKKyAgcEdTLT5TYXZlR3JhcGhTdGF0ZSgpOworICBpZiAoSXNDb3JuZXIoKSAmJiBmVGhpY2tuZXNzID4gMiAqIEdldFJhZGl1cygpKQorICAgIGZUaGlja25lc3MgPSAyICogR2V0UmFkaXVzKCk7CisKKyAgcEdTLT5TZXRMaW5lV2lkdGgoZlRoaWNrbmVzcyk7CisgIHBHUy0+RW5hYmxlQWN0T25EYXNoKCk7CisgIHBHUy0+U2V0TGluZUNhcChDRlhfR3JhcGhTdGF0ZURhdGE6OkxpbmVDYXBCdXR0KTsKKyAgWEZBX1N0cm9rZVR5cGVTZXRMaW5lRGFzaChwR1MsIEdldFN0cm9rZVR5cGUoKSwgWEZBX0F0dHJpYnV0ZUVudW06OkJ1dHQpOworICBwR1MtPlNldFN0cm9rZUNvbG9yKENYRkFfR0VDb2xvcihHZXRDb2xvcigpKSk7CisgIHBHUy0+U3Ryb2tlUGF0aChwUGF0aCwgJm1hdHJpeCk7CisgIHBHUy0+UmVzdG9yZUdyYXBoU3RhdGUoKTsKK30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3N0cm9rZS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3Ryb2tlLmgKaW5kZXggY2Y5NDFjOC4uZWQ0MTk5NyAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3Ryb2tlLmgKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3Ryb2tlLmgKQEAgLTcsMzggKzcsNTkgQEAKICNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU1RST0tFX0hfCiAjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NUUk9LRV9IXwogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKICNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvZnhmYV9iYXNpYy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGEuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCiAKIGVudW0gU3Ryb2tlU2FtZVN0eWxlIHsKICAgWEZBX1NUUk9LRV9TQU1FU1RZTEVfTm9QcmVzZW5jZSA9IDEsCiAgIFhGQV9TVFJPS0VfU0FNRVNUWUxFX0Nvcm5lciA9IDIKIH07CiAKK2NsYXNzIENYRkFfR0VQYXRoOworY2xhc3MgQ1hGQV9HcmFwaGljczsKIGNsYXNzIENYRkFfTm9kZTsKIAotY2xhc3MgQ1hGQV9TdHJva2UgOiBwdWJsaWMgQ1hGQV9EYXRhIHsKK3ZvaWQgWEZBX1N0cm9rZVR5cGVTZXRMaW5lRGFzaChDWEZBX0dyYXBoaWNzKiBwR3JhcGhpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZUVudW0gaVN0cm9rZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZUVudW0gaUNhcFR5cGUpOworCitjbGFzcyBDWEZBX1N0cm9rZSA6IHB1YmxpYyBDWEZBX05vZGUgewogIHB1YmxpYzoKLSAgQ1hGQV9TdHJva2UoKSA6IENYRkFfU3Ryb2tlKG51bGxwdHIpIHt9Ci0gIGV4cGxpY2l0IENYRkFfU3Ryb2tlKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQorICB+Q1hGQV9TdHJva2UoKSBvdmVycmlkZTsKIAogICBib29sIElzQ29ybmVyKCkgY29uc3QgeyByZXR1cm4gR2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6Q29ybmVyOyB9Ci0gIGJvb2wgSXNFZGdlKCkgY29uc3QgeyByZXR1cm4gR2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6RWRnZTsgfQotICBib29sIElzVmlzaWJsZSgpIGNvbnN0IHsgcmV0dXJuIEdldFByZXNlbmNlKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZTsgfQotICBpbnQzMl90IEdldFByZXNlbmNlKCkgY29uc3Q7Ci0gIGludDMyX3QgR2V0Q2FwVHlwZSgpIGNvbnN0OwotICBpbnQzMl90IEdldFN0cm9rZVR5cGUoKSBjb25zdDsKLSAgRlhfRkxPQVQgR2V0VGhpY2tuZXNzKCkgY29uc3Q7CisgIGJvb2wgSXNWaXNpYmxlKCk7CisgIGJvb2wgSXNJbnZlcnRlZCgpOworCisgIFhGQV9BdHRyaWJ1dGVFbnVtIEdldENhcFR5cGUoKTsKKyAgWEZBX0F0dHJpYnV0ZUVudW0gR2V0U3Ryb2tlVHlwZSgpOworICBYRkFfQXR0cmlidXRlRW51bSBHZXRKb2luVHlwZSgpOworICBmbG9hdCBHZXRSYWRpdXMoKSBjb25zdDsKKyAgZmxvYXQgR2V0VGhpY2tuZXNzKCkgY29uc3Q7CisKICAgQ1hGQV9NZWFzdXJlbWVudCBHZXRNU1RoaWNrbmVzcygpIGNvbnN0OwogICB2b2lkIFNldE1TVGhpY2tuZXNzKENYRkFfTWVhc3VyZW1lbnQgbXNUaGlua25lc3MpOwotICBGWF9BUkdCIEdldENvbG9yKCkgY29uc3Q7CisKKyAgRlhfQVJHQiBHZXRDb2xvcigpOwogICB2b2lkIFNldENvbG9yKEZYX0FSR0IgYXJnYik7Ci0gIGludDMyX3QgR2V0Sm9pblR5cGUoKSBjb25zdDsKLSAgYm9vbCBJc0ludmVydGVkKCkgY29uc3Q7Ci0gIEZYX0ZMT0FUIEdldFJhZGl1cygpIGNvbnN0OwotICBib29sIFNhbWVTdHlsZXMoQ1hGQV9TdHJva2Ugc3Ryb2tlLCB1aW50MzJfdCBkd0ZsYWdzID0gMCkgY29uc3Q7CisKKyAgYm9vbCBTYW1lU3R5bGVzKENYRkFfU3Ryb2tlKiBzdHJva2UsIHVpbnQzMl90IGR3RmxhZ3MpOworCisgIHZvaWQgU3Ryb2tlKENYRkFfR0VQYXRoKiBwUGF0aCwgQ1hGQV9HcmFwaGljcyogcEdTLCBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpOworCisgcHJvdGVjdGVkOgorICBDWEZBX1N0cm9rZShDWEZBX0RvY3VtZW50KiBwRG9jLAorICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBlUGFja2V0LAorICAgICAgICAgICAgICB1aW50MzJfdCB2YWxpZFBhY2tldHMsCisgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlIG9UeXBlLAorICAgICAgICAgICAgICBYRkFfRWxlbWVudCBlVHlwZSwKKyAgICAgICAgICAgICAgY29uc3QgUHJvcGVydHlEYXRhKiBwcm9wZXJ0aWVzLAorICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVEYXRhKiBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgZWxlbWVudE5hbWUsCisgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDSlhfT2JqZWN0PiBqc19ub2RlKTsKIH07CiAKICNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU1RST0tFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJmb3JtLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3N1YmZvcm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYjdmYTcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJmb3JtLmNwcApAQCAtMCwwICsxLDc3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJmb3JtLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc3ViZm9ybS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0geworICAgIHtYRkFfRWxlbWVudDo6QnJlYWssIDEsIDB9LCAgIHtYRkFfRWxlbWVudDo6TWFyZ2luLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlBhcmEsIDEsIDB9LCAgICB7WEZBX0VsZW1lbnQ6OkJvcmRlciwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpBc3Npc3QsIDEsIDB9LCAge1hGQV9FbGVtZW50OjpUcmF2ZXJzYWwsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6S2VlcCwgMSwgMH0sICAgIHtYRkFfRWxlbWVudDo6VmFsaWRhdGUsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6UGFnZVNldCwgMSwgMH0sIHtYRkFfRWxlbWVudDo6T3ZlcmZsb3csIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6QmluZCwgMSwgMH0sICAgIHtYRkFfRWxlbWVudDo6RGVzYywgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpCb29rZW5kLCAxLCAwfSwge1hGQV9FbGVtZW50OjpDYWxjdWxhdGUsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwgIHtYRkFfRWxlbWVudDo6VmFyaWFibGVzLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6Ok9jY3VyLCAxLCAwfSwgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpILCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlcsIFhGQV9BdHRyaWJ1dGVUeXBlOjpNZWFzdXJlLCAodm9pZCopTCIwaW4ifSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6WCwgWEZBX0F0dHJpYnV0ZVR5cGU6Ok1lYXN1cmUsICh2b2lkKilMIjBpbiJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpZLCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpIQWxpZ24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OkxlZnR9LAorICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkFsbG93TWFjcm8sIFhGQV9BdHRyaWJ1dGVUeXBlOjpCb29sZWFuLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkNvbHVtbldpZHRocywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6QWNjZXNzLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpPcGVufSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6UHJlc2VuY2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OlZpc2libGV9LAorICAgIHtYRkFfQXR0cmlidXRlOjpWQWxpZ24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OlRvcH0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok1heEgsIFhGQV9BdHRyaWJ1dGVUeXBlOjpNZWFzdXJlLCAodm9pZCopTCIwaW4ifSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TWF4VywgWEZBX0F0dHJpYnV0ZVR5cGU6Ok1lYXN1cmUsICh2b2lkKilMIjBpbiJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpNaW5ILCBYRkFfQXR0cmlidXRlVHlwZTo6TWVhc3VyZSwgKHZvaWQqKUwiMGluIn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok1pblcsIFhGQV9BdHRyaWJ1dGVUeXBlOjpNZWFzdXJlLCAodm9pZCopTCIwaW4ifSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TGF5b3V0LCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpQb3NpdGlvbn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlJlbGV2YW50LCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpNZXJnZU1vZGUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OkNvbnN1bWVEYXRhfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6Q29sU3BhbiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikxfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jYWxlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpBbmNob3JUeXBlLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpUb3BMZWZ0fSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6UmVzdG9yZVN0YXRlLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpNYW51YWx9LAorICAgIHtYRkFfQXR0cmlidXRlOjpTY29wZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6TmFtZX0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInN1YmZvcm0iOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9TdWJmb3JtOjpDWEZBX1N1YmZvcm0oQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlN1YmZvcm0sCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX1N1YmZvcm0+KHRoaXMpKSB7fQorCitDWEZBX1N1YmZvcm06On5DWEZBX1N1YmZvcm0oKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3ViZm9ybS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3ViZm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYjJlMTcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJmb3JtLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NVQkZPUk1fSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU1VCRk9STV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1N1YmZvcm0gOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfU3ViZm9ybShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1N1YmZvcm0oKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU1VCRk9STV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3ViZm9ybXNldC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJmb3Jtc2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzljM2IwCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3ViZm9ybXNldC5jcHAKQEAgLTAsMCArMSw0NCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3ViZm9ybXNldC5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3N1YmZvcm1zZXQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHsKKyAgICB7WEZBX0VsZW1lbnQ6OkJyZWFrLCAxLCAwfSwgIHtYRkFfRWxlbWVudDo6T3ZlcmZsb3csIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6RGVzYywgMSwgMH0sICAge1hGQV9FbGVtZW50OjpCb29rZW5kLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sIHtYRkFfRWxlbWVudDo6T2NjdXIsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlJlbGF0aW9uLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpPcmRlcmVkfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6UmVsZXZhbnQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInN1YmZvcm1TZXQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9TdWJmb3JtU2V0OjpDWEZBX1N1YmZvcm1TZXQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlN1YmZvcm1TZXQsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX1N1YmZvcm1TZXQ+KHRoaXMpKSB7fQorCitDWEZBX1N1YmZvcm1TZXQ6On5DWEZBX1N1YmZvcm1TZXQoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3ViZm9ybXNldC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3ViZm9ybXNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMGYzZWEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJmb3Jtc2V0LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NVQkZPUk1TRVRfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU1VCRk9STVNFVF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1N1YmZvcm1TZXQgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfU3ViZm9ybVNldChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1N1YmZvcm1TZXQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU1VCRk9STVNFVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3ViamVjdGRuLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3N1YmplY3Rkbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlhYjJmYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3N1YmplY3Rkbi5jcHAKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3ViamVjdGRuLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc3ViamVjdGRuLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVsaW1pdGVyLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJzdWJqZWN0RE4iOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9TdWJqZWN0RE46OkNYRkFfU3ViamVjdEROKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlQywKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6U3ViamVjdEROLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9TdWJqZWN0RE4+KHRoaXMpKSB7fQorCitDWEZBX1N1YmplY3RETjo6fkNYRkFfU3ViamVjdEROKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3N1YmplY3Rkbi5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3ViamVjdGRuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg2MWQ3NQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3N1YmplY3Rkbi5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TVUJKRUNURE5fSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU1VCSkVDVEROX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfU3ViamVjdEROIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1N1YmplY3RETihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1N1YmplY3RETigpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TVUJKRUNURE5fSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3N1YmplY3RkbnMuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3ViamVjdGRucy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3MTRiMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3N1YmplY3RkbnMuY3BwCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3N1YmplY3RkbnMuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zdWJqZWN0ZG5zLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VHlwZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6T3B0aW9uYWx9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJzdWJqZWN0RE5zIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfU3ViamVjdEROczo6Q1hGQV9TdWJqZWN0RE5zKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgKFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpTdWJqZWN0RE5zLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9TdWJqZWN0RE5zPih0aGlzKSkge30KKworQ1hGQV9TdWJqZWN0RE5zOjp+Q1hGQV9TdWJqZWN0RE5zKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3N1YmplY3RkbnMuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3N1YmplY3RkbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWQ3MzljCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3ViamVjdGRucy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TVUJKRUNURE5TX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NVQkpFQ1RETlNfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9TdWJqZWN0RE5zIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1N1YmplY3RETnMoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9TdWJqZWN0RE5zKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NVQkpFQ1RETlNfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3N1Ym1pdC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJtaXQuY3BwCmluZGV4IDUwYmVmMWUuLmU0NTU4ZTggMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3N1Ym1pdC5jcHAKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3VibWl0LmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCkBAIC02LDIyICs2LDU0IEBACiAKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJtaXQuaCIKIAotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfb2JqZWN0LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3N1Ym1pdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKIAotQ1hGQV9TdWJtaXQ6OkNYRkFfU3VibWl0KENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQorbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0ge3tYRkFfRWxlbWVudDo6RW5jcnlwdCwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6Rm9ybWF0LCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpYZHB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpFbWJlZFBERiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkJvb2xlYW4sICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VGFyZ2V0LCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpUZXh0RW5jb2RpbmcsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlhkcENvbnRlbnQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInN1Ym1pdCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1N1Ym1pdDo6Q1hGQV9TdWJtaXQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlN1Ym1pdCwKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfU3VibWl0Pih0aGlzKSkge30KKworQ1hGQV9TdWJtaXQ6On5DWEZBX1N1Ym1pdCgpIHt9CiAKIGJvb2wgQ1hGQV9TdWJtaXQ6OklzU3VibWl0RW1iZWRQREYoKSB7Ci0gIHJldHVybiBtX3BOb2RlLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfRW1iZWRQREYpOworICByZXR1cm4gSlNPYmplY3QoKS0+R2V0Qm9vbGVhbihYRkFfQXR0cmlidXRlOjpFbWJlZFBERik7CiB9CiAKLWludDMyX3QgQ1hGQV9TdWJtaXQ6OkdldFN1Ym1pdEZvcm1hdCgpIHsKLSAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9Gb3JtYXQpOworWEZBX0F0dHJpYnV0ZUVudW0gQ1hGQV9TdWJtaXQ6OkdldFN1Ym1pdEZvcm1hdCgpIHsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6Rm9ybWF0KTsKIH0KIAotdm9pZCBDWEZBX1N1Ym1pdDo6R2V0U3VibWl0VGFyZ2V0KENGWF9XaWRlU3RyaW5nQyYgd3NUYXJnZXQpIHsKLSAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9UYXJnZXQsIHdzVGFyZ2V0KTsKK1dpZGVTdHJpbmcgQ1hGQV9TdWJtaXQ6OkdldFN1Ym1pdFRhcmdldCgpIHsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6OlRhcmdldCk7CiB9CiAKLXZvaWQgQ1hGQV9TdWJtaXQ6OkdldFN1Ym1pdFhEUENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmdDJiB3c0NvbnRlbnQpIHsKLSAgbV9wTm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9YZHBDb250ZW50LCB3c0NvbnRlbnQpOworV2lkZVN0cmluZyBDWEZBX1N1Ym1pdDo6R2V0U3VibWl0WERQQ29udGVudCgpIHsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6OlhkcENvbnRlbnQpOwogfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3VibWl0LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJtaXQuaAppbmRleCBmMTA0MzVlLi4yNGQ1ZjExIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJtaXQuaAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJtaXQuaApAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCkBAIC03LDIwICs3LDE4IEBACiAjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NVQk1JVF9IXwogI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TVUJNSVRfSF8KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kYXRhLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC93aWRlc3RyaW5nLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgogCi1jbGFzcyBDWEZBX05vZGU7Ci0KLWNsYXNzIENYRkFfU3VibWl0IDogcHVibGljIENYRkFfRGF0YSB7CitjbGFzcyBDWEZBX1N1Ym1pdCA6IHB1YmxpYyBDWEZBX05vZGUgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9TdWJtaXQoQ1hGQV9Ob2RlKiBwTm9kZSk7CisgIENYRkFfU3VibWl0KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfU3VibWl0KCkgb3ZlcnJpZGU7CiAKICAgYm9vbCBJc1N1Ym1pdEVtYmVkUERGKCk7Ci0gIGludDMyX3QgR2V0U3VibWl0Rm9ybWF0KCk7Ci0gIHZvaWQgR2V0U3VibWl0VGFyZ2V0KENGWF9XaWRlU3RyaW5nQyYgd3NUYXJnZXQpOwotICB2b2lkIEdldFN1Ym1pdFhEUENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmdDJiB3c0NvbnRlbnQpOworICBYRkFfQXR0cmlidXRlRW51bSBHZXRTdWJtaXRGb3JtYXQoKTsKKyAgV2lkZVN0cmluZyBHZXRTdWJtaXRUYXJnZXQoKTsKKyAgV2lkZVN0cmluZyBHZXRTdWJtaXRYRFBDb250ZW50KCk7CiB9OwogCiAjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NVQk1JVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3VibWl0Zm9ybWF0LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3N1Ym1pdGZvcm1hdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkYWY4OQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3N1Ym1pdGZvcm1hdC5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3VibWl0Zm9ybWF0LmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJzdWJtaXRGb3JtYXQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9TdWJtaXRGb3JtYXQ6OkNYRkFfU3VibWl0Rm9ybWF0KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpTdWJtaXRGb3JtYXQsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9TdWJtaXRGb3JtYXQ6On5DWEZBX1N1Ym1pdEZvcm1hdCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJtaXRmb3JtYXQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3N1Ym1pdGZvcm1hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkY2ExZTkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJtaXRmb3JtYXQuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU1VCTUlURk9STUFUX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NVQk1JVEZPUk1BVF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1N1Ym1pdEZvcm1hdCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9TdWJtaXRGb3JtYXQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9TdWJtaXRGb3JtYXQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU1VCTUlURk9STUFUX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJtaXR1cmwuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3VibWl0dXJsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTFkZDk5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3VibWl0dXJsLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJtaXR1cmwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInN1Ym1pdFVybCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1N1Ym1pdFVybDo6Q1hGQV9TdWJtaXRVcmwoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlN1Ym1pdFVybCwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX1N1Ym1pdFVybDo6fkNYRkFfU3VibWl0VXJsKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3N1Ym1pdHVybC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3VibWl0dXJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ4N2RiOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3N1Ym1pdHVybC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TVUJNSVRVUkxfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU1VCTUlUVVJMX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfU3VibWl0VXJsIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1N1Ym1pdFVybChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1N1Ym1pdFVybCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TVUJNSVRVUkxfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3N1YnNldGJlbG93LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3N1YnNldGJlbG93LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGRiZDA2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3Vic2V0YmVsb3cuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3N1YnNldGJlbG93LmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJzdWJzZXRCZWxvdyI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1N1YnNldEJlbG93OjpDWEZBX1N1YnNldEJlbG93KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpTdWJzZXRCZWxvdywKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX1N1YnNldEJlbG93Ojp+Q1hGQV9TdWJzZXRCZWxvdygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdWJzZXRiZWxvdy5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3Vic2V0YmVsb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjkxMmZlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3Vic2V0YmVsb3cuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU1VCU0VUQkVMT1dfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfU1VCU0VUQkVMT1dfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9TdWJzZXRCZWxvdyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9TdWJzZXRCZWxvdyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1N1YnNldEJlbG93KCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NVQlNFVEJFTE9XX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdXBwcmVzc2Jhbm5lci5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdXBwcmVzc2Jhbm5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZjNDJhNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3N1cHByZXNzYmFubmVyLmNwcApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zdXBwcmVzc2Jhbm5lci5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwic3VwcHJlc3NCYW5uZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9TdXBwcmVzc0Jhbm5lcjo6Q1hGQV9TdXBwcmVzc0Jhbm5lcihDWEZBX0RvY3VtZW50KiBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6U3VwcHJlc3NCYW5uZXIsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9TdXBwcmVzc0Jhbm5lcjo6fkNYRkFfU3VwcHJlc3NCYW5uZXIoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc3VwcHJlc3NiYW5uZXIuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3N1cHByZXNzYmFubmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkwMTNhMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3N1cHByZXNzYmFubmVyLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NVUFBSRVNTQkFOTkVSX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1NVUFBSRVNTQkFOTkVSX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfU3VwcHJlc3NCYW5uZXIgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfU3VwcHJlc3NCYW5uZXIoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9TdXBwcmVzc0Jhbm5lcigpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9TVVBQUkVTU0JBTk5FUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGFnZ2VkLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RhZ2dlZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY0NmI2MgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RhZ2dlZC5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGFnZ2VkLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJ0YWdnZWQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9UYWdnZWQ6OkNYRkFfVGFnZ2VkKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpUYWdnZWQsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9UYWdnZWQ6On5DWEZBX1RhZ2dlZCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV90YWdnZWQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RhZ2dlZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYjFiYTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90YWdnZWQuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVEFHR0VEX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RBR0dFRF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1RhZ2dlZCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9UYWdnZWQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9UYWdnZWQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVEFHR0VEX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZW1wbGF0ZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZW1wbGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y5YWZhMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RlbXBsYXRlLmNwcApAQCAtMCwwICsxLDQyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZW1wbGF0ZS5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3RlbXBsYXRlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7CisgICAge1hGQV9FbGVtZW50OjpVcmksIDEsIDB9LCAgICAgICB7WEZBX0VsZW1lbnQ6OlhzbCwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpTdGFydFBhZ2UsIDEsIDB9LCB7WEZBX0VsZW1lbnQ6OlJlbGV2YW50LCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkJhc2UsIDEsIDB9LCAgICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpCYXNlUHJvZmlsZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6RnVsbH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInRlbXBsYXRlIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfVGVtcGxhdGU6OkNYRkFfVGVtcGxhdGUoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoCisgICAgICAgICAgZG9jLAorICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6TW9kZWxOb2RlLAorICAgICAgICAgIFhGQV9FbGVtZW50OjpUZW1wbGF0ZSwKKyAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgIGtOYW1lLAorICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfVGVtcGxhdGU+KHRoaXMpKSB7fQorCitDWEZBX1RlbXBsYXRlOjp+Q1hGQV9UZW1wbGF0ZSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZW1wbGF0ZS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGVtcGxhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGIwMzVmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGVtcGxhdGUuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVEVNUExBVEVfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVEVNUExBVEVfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9UZW1wbGF0ZSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9UZW1wbGF0ZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1RlbXBsYXRlKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RFTVBMQVRFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZW1wbGF0ZWNhY2hlLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RlbXBsYXRlY2FjaGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMmVkNjUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZW1wbGF0ZWNhY2hlLmNwcApAQCAtMCwwICsxLDMyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZW1wbGF0ZWNhY2hlLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpNYXhFbnRyaWVzLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTV9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJ0ZW1wbGF0ZUNhY2hlIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfVGVtcGxhdGVDYWNoZTo6Q1hGQV9UZW1wbGF0ZUNhY2hlKENYRkFfRG9jdW1lbnQqIGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpUZW1wbGF0ZUNhY2hlLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfVGVtcGxhdGVDYWNoZTo6fkNYRkFfVGVtcGxhdGVDYWNoZSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZW1wbGF0ZWNhY2hlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZW1wbGF0ZWNhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU5NTNmZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RlbXBsYXRlY2FjaGUuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVEVNUExBVEVDQUNIRV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9URU1QTEFURUNBQ0hFX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfVGVtcGxhdGVDYWNoZSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9UZW1wbGF0ZUNhY2hlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfVGVtcGxhdGVDYWNoZSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9URU1QTEFURUNBQ0hFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZXh0LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RleHQuY3BwCmluZGV4IGZjN2Q3YWEuLmUwMDA0OTMgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3RleHQuY3BwCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RleHQuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKQEAgLTYsMTAgKzYsMzggQEAKIAogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RleHQuaCIKIAotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfb2JqZWN0LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3RleHQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKLUNYRkFfVGV4dDo6Q1hGQV9UZXh0KENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQorbmFtZXNwYWNlIHsKIAotdm9pZCBDWEZBX1RleHQ6OkdldENvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCkgewotICBtX3BOb2RlLT5UcnlDb250ZW50KHdzVGV4dCk7Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlJpZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpNYXhDaGFycywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwidGV4dCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1RleHQ6OkNYRkFfVGV4dChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfAorICAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0Zvcm0pLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6VGV4dCwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfVGV4dD4odGhpcykpIHt9CisKK0NYRkFfVGV4dDo6fkNYRkFfVGV4dCgpIHt9CisKK1dpZGVTdHJpbmcgQ1hGQV9UZXh0OjpHZXRDb250ZW50KCkgeworICByZXR1cm4gSlNPYmplY3QoKS0+R2V0Q29udGVudChmYWxzZSk7CiB9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZXh0LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZXh0LmgKaW5kZXggY2E0MWMwZC4uYTc1YWVmMiAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGV4dC5oCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RleHQuaApAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCkBAIC04LDE1ICs4LDE0IEBACiAjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RFWFRfSF8KIAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKIAotY2xhc3MgQ1hGQV9Ob2RlOwotCi1jbGFzcyBDWEZBX1RleHQgOiBwdWJsaWMgQ1hGQV9EYXRhIHsKK2NsYXNzIENYRkFfVGV4dCA6IHB1YmxpYyBDWEZBX05vZGUgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9UZXh0KENYRkFfTm9kZSogcE5vZGUpOworICBDWEZBX1RleHQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9UZXh0KCkgb3ZlcnJpZGU7CiAKLSAgdm9pZCBHZXRDb250ZW50KENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOworICBXaWRlU3RyaW5nIEdldENvbnRlbnQoKTsKIH07CiAKICNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVEVYVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGV4dGVkaXQuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGV4dGVkaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMjc2N2EKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZXh0ZWRpdC5jcHAKQEAgLTAsMCArMSw0NiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGV4dGVkaXQuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF90ZXh0ZWRpdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0ge3tYRkFfRWxlbWVudDo6TWFyZ2luLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OkJvcmRlciwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpDb21iLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlZTY3JvbGxQb2xpY3ksIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OkF1dG99LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkFsbG93UmljaFRleHQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpCb29sZWFuLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok11bHRpTGluZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkJvb2xlYW4sICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SFNjcm9sbFBvbGljeSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6QXV0b30sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInRleHRFZGl0IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfVGV4dEVkaXQ6OkNYRkFfVGV4dEVkaXQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlRleHRFZGl0LAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9UZXh0RWRpdD4odGhpcykpIHt9CisKK0NYRkFfVGV4dEVkaXQ6On5DWEZBX1RleHRFZGl0KCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3RleHRlZGl0LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZXh0ZWRpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MmVkZTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZXh0ZWRpdC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9URVhURURJVF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9URVhURURJVF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1RleHRFZGl0IDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1RleHRFZGl0KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfVGV4dEVkaXQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVEVYVEVESVRfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3RoaXNwcm94eS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90aGlzcHJveHkuY3BwCmluZGV4IGJmNmYxMmMuLjMxNGM5OGMgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3RoaXNwcm94eS5jcHAKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGhpc3Byb3h5LmNwcApAQCAtNCwyNSArNCwxOSBAQAogCiAvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQogCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90aGlzcHJveHkuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF9vYmplY3QuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgogCiBDWEZBX1RoaXNQcm94eTo6Q1hGQV9UaGlzUHJveHkoQ1hGQV9Ob2RlKiBwVGhpc05vZGUsIENYRkFfTm9kZSogcFNjcmlwdE5vZGUpCiAgICAgOiBDWEZBX09iamVjdChwVGhpc05vZGUtPkdldERvY3VtZW50KCksCiAgICAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6VmFyaWFibGVzVGhpcywKICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpVbmtub3duLAotICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDKCkpLAotICAgICAgbV9wVGhpc05vZGUobnVsbHB0ciksCi0gICAgICBtX3BTY3JpcHROb2RlKG51bGxwdHIpIHsKLSAgbV9wVGhpc05vZGUgPSBwVGhpc05vZGU7Ci0gIG1fcFNjcmlwdE5vZGUgPSBwU2NyaXB0Tm9kZTsKLX0KKyAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmdWaWV3KCksCisgICAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX09iamVjdD4odGhpcykpLAorICAgICAgbV9wVGhpc05vZGUocFRoaXNOb2RlKSwKKyAgICAgIG1fcFNjcmlwdE5vZGUocFNjcmlwdE5vZGUpIHt9CiAKIENYRkFfVGhpc1Byb3h5Ojp+Q1hGQV9UaGlzUHJveHkoKSB7fQotCi1DWEZBX05vZGUqIENYRkFfVGhpc1Byb3h5OjpHZXRUaGlzTm9kZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fcFRoaXNOb2RlOwotfQotCi1DWEZBX05vZGUqIENYRkFfVGhpc1Byb3h5OjpHZXRTY3JpcHROb2RlKCkgY29uc3QgewotICByZXR1cm4gbV9wU2NyaXB0Tm9kZTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3RoaXNwcm94eS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGhpc3Byb3h5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJiMGY1YQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RoaXNwcm94eS5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9USElTUFJPWFlfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVEhJU1BST1hZX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vYmplY3QuaCIKKworY2xhc3MgQ1hGQV9Ob2RlOworCitjbGFzcyBDWEZBX1RoaXNQcm94eSA6IHB1YmxpYyBDWEZBX09iamVjdCB7CisgcHVibGljOgorICBDWEZBX1RoaXNQcm94eShDWEZBX05vZGUqIHBUaGlzTm9kZSwgQ1hGQV9Ob2RlKiBwU2NyaXB0Tm9kZSk7CisgIH5DWEZBX1RoaXNQcm94eSgpIG92ZXJyaWRlOworCisgIENYRkFfTm9kZSogR2V0VGhpc05vZGUoKSBjb25zdCB7IHJldHVybiBtX3BUaGlzTm9kZTsgfQorICBDWEZBX05vZGUqIEdldFNjcmlwdE5vZGUoKSBjb25zdCB7IHJldHVybiBtX3BTY3JpcHROb2RlOyB9CisKKyBwcml2YXRlOgorICBDWEZBX05vZGUqIG1fcFRoaXNOb2RlOworICBDWEZBX05vZGUqIG1fcFNjcmlwdE5vZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RISVNQUk9YWV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGhyZXNob2xkLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RocmVzaG9sZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA0N2Q1MgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RocmVzaG9sZC5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGhyZXNob2xkLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJ0aHJlc2hvbGQiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9UaHJlc2hvbGQ6OkNYRkFfVGhyZXNob2xkKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9UaHJlc2hvbGQ6On5DWEZBX1RocmVzaG9sZCgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV90aHJlc2hvbGQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RocmVzaG9sZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZGUwMWEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90aHJlc2hvbGQuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVEhSRVNIT0xEX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RIUkVTSE9MRF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1RocmVzaG9sZCA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9UaHJlc2hvbGQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9UaHJlc2hvbGQoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVEhSRVNIT0xEX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV90aW1lLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RpbWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYTY0Y2UKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90aW1lLmNwcApAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90aW1lLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdGltZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInRpbWUiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9UaW1lOjpDWEZBX1RpbWUoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpUaW1lLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9UaW1lPih0aGlzKSkge30KKworQ1hGQV9UaW1lOjp+Q1hGQV9UaW1lKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3RpbWUuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RpbWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmM2ZDAyCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGltZS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9USU1FX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RJTUVfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9UaW1lIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1RpbWUoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9UaW1lKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RJTUVfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3RpbWVwYXR0ZXJuLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RpbWVwYXR0ZXJuLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmUzYTUzCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGltZXBhdHRlcm4uY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RpbWVwYXR0ZXJuLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpNZWR9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJ0aW1lUGF0dGVybiI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1RpbWVQYXR0ZXJuOjpDWEZBX1RpbWVQYXR0ZXJuKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpUaW1lUGF0dGVybiwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX1RpbWVQYXR0ZXJuOjp+Q1hGQV9UaW1lUGF0dGVybigpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV90aW1lcGF0dGVybi5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGltZXBhdHRlcm4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzk2MDQ3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGltZXBhdHRlcm4uaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVElNRVBBVFRFUk5fSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVElNRVBBVFRFUk5fSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9UaW1lUGF0dGVybiA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9UaW1lUGF0dGVybihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1RpbWVQYXR0ZXJuKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RJTUVQQVRURVJOX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV90aW1lcGF0dGVybnMuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGltZXBhdHRlcm5zLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2E4ZGRlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGltZXBhdHRlcm5zLmNwcApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90aW1lcGF0dGVybnMuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0geworICAgIHtYRkFfRWxlbWVudDo6VGltZVBhdHRlcm4sIDQsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJ0aW1lUGF0dGVybnMiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9UaW1lUGF0dGVybnM6OkNYRkFfVGltZVBhdHRlcm5zKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlRpbWVQYXR0ZXJucywKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfVGltZVBhdHRlcm5zOjp+Q1hGQV9UaW1lUGF0dGVybnMoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGltZXBhdHRlcm5zLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90aW1lcGF0dGVybnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTkzMzdkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGltZXBhdHRlcm5zLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RJTUVQQVRURVJOU19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9USU1FUEFUVEVSTlNfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9UaW1lUGF0dGVybnMgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfVGltZVBhdHRlcm5zKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfVGltZVBhdHRlcm5zKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RJTUVQQVRURVJOU19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGltZXN0YW1wLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RpbWVzdGFtcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM4Njk2MQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RpbWVzdGFtcC5jcHAKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGltZXN0YW1wLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdGltZXN0YW1wLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VHlwZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkVudW0sCisgICAgICh2b2lkKilYRkFfQXR0cmlidXRlRW51bTo6T3B0aW9uYWx9LAorICAgIHtYRkFfQXR0cmlidXRlOjpTZXJ2ZXIsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInRpbWVTdGFtcCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1RpbWVTdGFtcDo6Q1hGQV9UaW1lU3RhbXAoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlRpbWVTdGFtcCwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX1RpbWVTdGFtcDo6fkNYRkFfVGltZVN0YW1wKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3RpbWVzdGFtcC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGltZXN0YW1wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiNzNlOQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RpbWVzdGFtcC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9USU1FU1RBTVBfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVElNRVNUQU1QX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfVGltZVN0YW1wIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1RpbWVTdGFtcChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1RpbWVTdGFtcCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9USU1FU1RBTVBfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3RpbWV6b25lcHJvdmlkZXIuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdGltZXpvbmVwcm92aWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1ZWNjZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RpbWV6b25lcHJvdmlkZXIuY3BwCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RpbWV6b25lcHJvdmlkZXIuaCIKKworI2luY2x1ZGUgPHRpbWUuaD4KKworc3RhdGljIGJvb2wgZ19iUHJvdmlkZXJUaW1lWm9uZVNldCA9IGZhbHNlOworCitDWEZBX1RpbWVab25lUHJvdmlkZXI6OkNYRkFfVGltZVpvbmVQcm92aWRlcigpIHsKKyNpZiBfRlhfUExBVEZPUk1fID09IF9GWF9QTEFURk9STV9XSU5ET1dTXworICBpZiAoIWdfYlByb3ZpZGVyVGltZVpvbmVTZXQpIHsKKyAgICBnX2JQcm92aWRlclRpbWVab25lU2V0ID0gdHJ1ZTsKKyAgICBfdHpzZXQoKTsKKyAgfQorICBtX3R6LnR6SG91ciA9IHN0YXRpY19jYXN0PGludDhfdD4oX3RpbWV6b25lIC8gMzYwMCAqIC0xKTsKKyAgbV90ei50ek1pbnV0ZSA9IHN0YXRpY19jYXN0PGludDhfdD4oKGFicyhfdGltZXpvbmUpICUgMzYwMCkgLyA2MCk7CisjZWxzZQorICBpZiAoIWdfYlByb3ZpZGVyVGltZVpvbmVTZXQpIHsKKyAgICBnX2JQcm92aWRlclRpbWVab25lU2V0ID0gdHJ1ZTsKKyAgICB0enNldCgpOworICB9CisgIG1fdHoudHpIb3VyID0gc3RhdGljX2Nhc3Q8aW50OF90Pih0aW1lem9uZSAvIDM2MDAgKiAtMSk7CisgIG1fdHoudHpNaW51dGUgPQorICAgICAgc3RhdGljX2Nhc3Q8aW50OF90PigoYWJzKHN0YXRpY19jYXN0PGludD4odGltZXpvbmUpKSAlIDM2MDApIC8gNjApOworI2VuZGlmCit9CisKK0NYRkFfVGltZVpvbmVQcm92aWRlcjo6fkNYRkFfVGltZVpvbmVQcm92aWRlcigpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV90aW1lem9uZXByb3ZpZGVyLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90aW1lem9uZXByb3ZpZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUzZmJiNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RpbWV6b25lcHJvdmlkZXIuaApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVElNRVpPTkVQUk9WSURFUl9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9USU1FWk9ORVBST1ZJREVSX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9kYXRldGltZS5oIgorCitjbGFzcyBDWEZBX1RpbWVab25lUHJvdmlkZXIgeworIHB1YmxpYzoKKyAgQ1hGQV9UaW1lWm9uZVByb3ZpZGVyKCk7CisgIH5DWEZBX1RpbWVab25lUHJvdmlkZXIoKTsKKworICBGWF9USU1FWk9ORSBHZXRUaW1lWm9uZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHo7IH0KKworIHByaXZhdGU6CisgIEZYX1RJTUVaT05FIG1fdHo7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RJTUVaT05FUFJPVklERVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3RvLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzBjMDE1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdG8uY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RvLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJ0byI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1RvOjpDWEZBX1RvKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpUbywKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX1RvOjp+Q1hGQV9UbygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV90by5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDE4ZjU5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdG8uaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVE9fSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVE9fSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9UbyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9UbyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1RvKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RPX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV90b29sdGlwLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3Rvb2x0aXAuY3BwCmluZGV4IGFmZTBlMjIuLjA0ZjI3YzkgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3Rvb2x0aXAuY3BwCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3Rvb2x0aXAuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKQEAgLTYsMTAgKzYsMzEgQEAKIAogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3Rvb2x0aXAuaCIKIAotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfb2JqZWN0LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3Rvb2x0aXAuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCiAKLUNYRkFfVG9vbFRpcDo6Q1hGQV9Ub29sVGlwKENYRkFfTm9kZSogcE5vZGUpIDogQ1hGQV9EYXRhKHBOb2RlKSB7fQorbmFtZXNwYWNlIHsKIAotYm9vbCBDWEZBX1Rvb2xUaXA6OkdldFRpcChDRlhfV2lkZVN0cmluZyYgd3NUaXApIHsKLSAgcmV0dXJuIG1fcE5vZGUtPlRyeUNvbnRlbnQod3NUaXApOwotfQorY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpSaWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwidG9vbFRpcCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1Rvb2xUaXA6OkNYRkFfVG9vbFRpcChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6VGV4dE5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlRvb2xUaXAsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX1Rvb2xUaXA+KHRoaXMpKSB7fQorCitDWEZBX1Rvb2xUaXA6On5DWEZBX1Rvb2xUaXAoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdG9vbHRpcC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdG9vbHRpcC5oCmluZGV4IDQzMzg4NWQuLjBiMTMyODIgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3Rvb2x0aXAuaAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90b29sdGlwLmgKQEAgLTEsNCArMSw0IEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIApAQCAtNywxNiArNywxMiBAQAogI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9UT09MVElQX0hfCiAjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RPT0xUSVBfSF8KIAotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKIAotY2xhc3MgQ1hGQV9Ob2RlOwotCi1jbGFzcyBDWEZBX1Rvb2xUaXAgOiBwdWJsaWMgQ1hGQV9EYXRhIHsKK2NsYXNzIENYRkFfVG9vbFRpcCA6IHB1YmxpYyBDWEZBX05vZGUgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9Ub29sVGlwKENYRkFfTm9kZSogcE5vZGUpOwotCi0gIGJvb2wgR2V0VGlwKENGWF9XaWRlU3RyaW5nJiB3c1RpcCk7CisgIENYRkFfVG9vbFRpcChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1Rvb2xUaXAoKSBvdmVycmlkZTsKIH07CiAKICNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVE9PTFRJUF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhY2UuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZTAxZmMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmFjZS5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhY2UuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInRyYWNlIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfVHJhY2U6OkNYRkFfVHJhY2UoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6VHJhY2UsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9UcmFjZTo6fkNYRkFfVHJhY2UoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhY2UuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVjOTVkYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RyYWNlLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RSQUNFX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RSQUNFX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfVHJhY2UgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfVHJhY2UoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9UcmFjZSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9UUkFDRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhbnNmb3JtLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RyYW5zZm9ybS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJmYTQ3NgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RyYW5zZm9ybS5jcHAKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhbnNmb3JtLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHsKKyAgICB7WEZBX0VsZW1lbnQ6OldoaXRlc3BhY2UsIDEsIDB9LCAge1hGQV9FbGVtZW50OjpSZW5hbWUsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6SWZFbXB0eSwgMSwgMH0sICAgICB7WEZBX0VsZW1lbnQ6OlByZXNlbmNlLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlBpY3R1cmUsIDEsIDB9LCAgICAge1hGQV9FbGVtZW50OjpOYW1lQXR0ciwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpHcm91cFBhcmVudCwgMSwgMH0sIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OlJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwidHJhbnNmb3JtIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfVHJhbnNmb3JtOjpDWEZBX1RyYW5zZm9ybShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9UcmFuc2Zvcm06On5DWEZBX1RyYW5zZm9ybSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmFuc2Zvcm0uaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RyYW5zZm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZTU0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmFuc2Zvcm0uaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVFJBTlNGT1JNX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RSQU5TRk9STV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1RyYW5zZm9ybSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9UcmFuc2Zvcm0oQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9UcmFuc2Zvcm0oKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVFJBTlNGT1JNX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmF2ZXJzYWwuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhdmVyc2FsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWZmZDNmCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhdmVyc2FsLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmF2ZXJzYWwuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF90cmF2ZXJzYWwuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwidHJhdmVyc2FsIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfVHJhdmVyc2FsOjpDWEZBX1RyYXZlcnNhbChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6VHJhdmVyc2FsLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9UcmF2ZXJzYWw+KHRoaXMpKSB7fQorCitDWEZBX1RyYXZlcnNhbDo6fkNYRkFfVHJhdmVyc2FsKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3RyYXZlcnNhbC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhdmVyc2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc0MjJiMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RyYXZlcnNhbC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9UUkFWRVJTQUxfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVFJBVkVSU0FMX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfVHJhdmVyc2FsIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1RyYXZlcnNhbChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1RyYXZlcnNhbCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9UUkFWRVJTQUxfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3RyYXZlcnNlLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RyYXZlcnNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzcxYjM3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhdmVyc2UuY3BwCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RyYXZlcnNlLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdHJhdmVyc2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6OlNjcmlwdCwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpFeHRyYXMsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpSZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6T3BlcmF0aW9uLCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpOZXh0fSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwidHJhdmVyc2UiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9UcmF2ZXJzZTo6Q1hGQV9UcmF2ZXJzZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6VHJhdmVyc2UsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX1RyYXZlcnNlPih0aGlzKSkge30KKworQ1hGQV9UcmF2ZXJzZTo6fkNYRkFfVHJhdmVyc2UoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhdmVyc2UuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RyYXZlcnNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUzM2NiNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RyYXZlcnNlLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RSQVZFUlNFX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RSQVZFUlNFX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfVHJhdmVyc2UgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfVHJhdmVyc2UoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9UcmF2ZXJzZSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9UUkFWRVJTRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhdmVyc2VzdHJhdGVneV94ZmFjb250YWluZXJub2RlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmF2ZXJzZXN0cmF0ZWd5X3hmYWNvbnRhaW5lcm5vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2E2MzJhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhdmVyc2VzdHJhdGVneV94ZmFjb250YWluZXJub2RlLmgKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RSQVZFUlNFU1RSQVRFR1lfWEZBQ09OVEFJTkVSTk9ERV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9UUkFWRVJTRVNUUkFURUdZX1hGQUNPTlRBSU5FUk5PREVfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlaXRlcmF0b3J0ZW1wbGF0ZS5oIgorCitjbGFzcyBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZSB7CisgcHVibGljOgorICBzdGF0aWMgQ1hGQV9Ob2RlKiBHZXRGaXJzdENoaWxkKENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSkgeworICAgIHJldHVybiBwVGVtcGxhdGVOb2RlLT5HZXRGaXJzdENvbnRhaW5lckNoaWxkKCk7CisgIH0KKyAgc3RhdGljIENYRkFfTm9kZSogR2V0TmV4dFNpYmxpbmcoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlKSB7CisgICAgcmV0dXJuIHBUZW1wbGF0ZU5vZGUtPkdldE5leHRDb250YWluZXJTaWJsaW5nKCk7CisgIH0KKyAgc3RhdGljIENYRkFfTm9kZSogR2V0UGFyZW50KENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSkgeworICAgIHJldHVybiBwVGVtcGxhdGVOb2RlLT5HZXRDb250YWluZXJQYXJlbnQoKTsKKyAgfQorfTsKKwordHlwZWRlZiBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZT4KKyAgICBDWEZBX0NvbnRhaW5lckl0ZXJhdG9yOworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RSQVZFUlNFU1RSQVRFR1lfWEZBQ09OVEFJTkVSTk9ERV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhdmVyc2VzdHJhdGVneV94ZmFub2RlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmF2ZXJzZXN0cmF0ZWd5X3hmYW5vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzk4ZDE4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJhdmVyc2VzdHJhdGVneV94ZmFub2RlLmgKQEAgLTAsMCArMSwyOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RSQVZFUlNFU1RSQVRFR1lfWEZBTk9ERV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9UUkFWRVJTRVNUUkFURUdZX1hGQU5PREVfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGVpdGVyYXRvcnRlbXBsYXRlLmgiCisKK2NsYXNzIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFOb2RlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Ob2RlKiBHZXRGaXJzdENoaWxkKENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSkgeworICAgIHJldHVybiBwVGVtcGxhdGVOb2RlLT5HZXRGaXJzdENoaWxkKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBDWEZBX05vZGUqIEdldE5leHRTaWJsaW5nKENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSkgeworICAgIHJldHVybiBwVGVtcGxhdGVOb2RlLT5HZXROZXh0U2libGluZygpOworICB9CisgIHN0YXRpYyBpbmxpbmUgQ1hGQV9Ob2RlKiBHZXRQYXJlbnQoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlKSB7CisgICAgcmV0dXJuIHBUZW1wbGF0ZU5vZGUtPkdldFBhcmVudCgpOworICB9Cit9OworCit0eXBlZGVmIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBTm9kZT4KKyAgICBDWEZBX05vZGVJdGVyYXRvcjsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9UUkFWRVJTRVNUUkFURUdZX1hGQU5PREVfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3RyZWVsaXN0LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3RyZWVsaXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGI5ZWNiCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHJlZWxpc3QuY3BwCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RyZWVsaXN0LmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgImZ4anMvY2Z4anNlX2VuZ2luZS5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF90cmVlbGlzdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvbnVtZXJpY3Mvc2FmZV9jb252ZXJzaW9ucy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGlzdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworQ1hGQV9UcmVlTGlzdDo6Q1hGQV9UcmVlTGlzdChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpCisgICAgOiBDWEZBX0xpc3QocERvY3VtZW50LAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpUcmVlTGlzdCwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6VHJlZUxpc3QsCisgICAgICAgICAgICAgICAgV2lkZVN0cmluZ1ZpZXcoTCJ0cmVlTGlzdCIpLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfVHJlZUxpc3Q+KHRoaXMpKSB7fQorCitDWEZBX1RyZWVMaXN0Ojp+Q1hGQV9UcmVlTGlzdCgpIHt9CisKK0NYRkFfTm9kZSogQ1hGQV9UcmVlTGlzdDo6TmFtZWRJdGVtKGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c05hbWUpIHsKKyAgdWludDMyX3QgZHdIYXNoQ29kZSA9IEZYX0hhc2hDb2RlX0dldFcod3NOYW1lLCBmYWxzZSk7CisgIHNpemVfdCBjb3VudCA9IEdldExlbmd0aCgpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBDWEZBX05vZGUqIHJldCA9IEl0ZW0oaSk7CisgICAgaWYgKGR3SGFzaENvZGUgPT0gcmV0LT5HZXROYW1lSGFzaCgpKQorICAgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXR1cm4gbnVsbHB0cjsKK30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3RyZWVsaXN0LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmVlbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNjVjYTUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmVlbGlzdC5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9UUkVFTElTVF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9UUkVFTElTVF9IXworCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3RyZWVsaXN0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvZnhmYV9iYXNpYy5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xpc3QuaCIKKworY2xhc3MgQ1hGQV9Ob2RlOworCitjbGFzcyBDWEZBX1RyZWVMaXN0IDogcHVibGljIENYRkFfTGlzdCB7CisgcHVibGljOgorICBleHBsaWNpdCBDWEZBX1RyZWVMaXN0KENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCk7CisgIH5DWEZBX1RyZWVMaXN0KCkgb3ZlcnJpZGU7CisKKyAgQ1hGQV9Ob2RlKiBOYW1lZEl0ZW0oY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzTmFtZSk7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RSRUVMSVNUX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV90eXBlLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3R5cGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMWMxOTMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90eXBlLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90eXBlLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJ0eXBlIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfVHlwZTo6Q1hGQV9UeXBlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpUeXBlLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfVHlwZTo6fkNYRkFfVHlwZSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV90eXBlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90eXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU3ZDQ2NwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3R5cGUuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVFlQRV9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9UWVBFX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfVHlwZSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9UeXBlKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfVHlwZSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9UWVBFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV90eXBlZmFjZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV90eXBlZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JmNjliZAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3R5cGVmYWNlLmNwcApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90eXBlZmFjZS5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwidHlwZWZhY2UiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9UeXBlZmFjZTo6Q1hGQV9UeXBlZmFjZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpUeXBlZmFjZSwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX1R5cGVmYWNlOjp+Q1hGQV9UeXBlZmFjZSgpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV90eXBlZmFjZS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHlwZWZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmM5MGM0Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHlwZWZhY2UuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVFlQRUZBQ0VfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVFlQRUZBQ0VfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9UeXBlZmFjZSA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9UeXBlZmFjZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1R5cGVmYWNlKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1RZUEVGQUNFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV90eXBlZmFjZXMuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHlwZWZhY2VzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjU5MTlkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHlwZWZhY2VzLmNwcApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90eXBlZmFjZXMuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwidHlwZWZhY2VzIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfVHlwZWZhY2VzOjpDWEZBX1R5cGVmYWNlcyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpUeXBlZmFjZXMsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX1R5cGVmYWNlczo6fkNYRkFfVHlwZWZhY2VzKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3R5cGVmYWNlcy5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdHlwZWZhY2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE0YjQzZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3R5cGVmYWNlcy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9UWVBFRkFDRVNfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVFlQRUZBQ0VTX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfVHlwZWZhY2VzIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1R5cGVmYWNlcyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1R5cGVmYWNlcygpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9UWVBFRkFDRVNfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3VpLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3VpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODNlNzlhCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdWkuY3BwCkBAIC0wLDAgKzEsNTEgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3VpLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdWkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHsKKyAgICB7WEZBX0VsZW1lbnQ6OkNoZWNrQnV0dG9uLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkNob2ljZUxpc3QsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAorICAgIHtYRkFfRWxlbWVudDo6RGVmYXVsdFVpLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkJhcmNvZGUsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAorICAgIHtYRkFfRWxlbWVudDo6QnV0dG9uLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkRhdGVUaW1lRWRpdCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCisgICAge1hGQV9FbGVtZW50OjpQaWN0dXJlLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkltYWdlRWRpdCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCisgICAge1hGQV9FbGVtZW50OjpQYXNzd29yZEVkaXQsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAorICAgIHtYRkFfRWxlbWVudDo6TnVtZXJpY0VkaXQsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAorICAgIHtYRkFfRWxlbWVudDo6U2lnbmF0dXJlLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlRleHRFZGl0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkV4T2JqZWN0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwidWkiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9VaTo6Q1hGQV9VaShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6VWksCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX1VpPih0aGlzKSkge30KKworQ1hGQV9VaTo6fkNYRkFfVWkoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdWkuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3VpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgyNGQ2YgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3VpLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1VJX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1VJX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfVWkgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfVWkoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9VaSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9VSV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdXBkYXRlLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3VwZGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg2ZTExMAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3VwZGF0ZS5jcHAKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdXBkYXRlLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdXBkYXRlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwidXBkYXRlIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfVXBkYXRlOjpDWEZBX1VwZGF0ZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpUZXh0Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6VXBkYXRlLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9VcGRhdGU+KHRoaXMpKSB7fQorCitDWEZBX1VwZGF0ZTo6fkNYRkFfVXBkYXRlKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3VwZGF0ZS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdXBkYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU2NTJlYQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3VwZGF0ZS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9VUERBVEVfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVVBEQVRFX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfVXBkYXRlIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1VwZGF0ZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1VwZGF0ZSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9VUERBVEVfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3VyaS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV91cmkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2Y2MzZWMKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV91cmkuY3BwCkBAIC0wLDAgKzEsMzggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3VyaS5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3VyaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInVyaSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1VyaTo6Q1hGQV9VcmkoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQpLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpUZXh0Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6VXJpLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9Vcmk+KHRoaXMpKSB7fQorCitDWEZBX1VyaTo6fkNYRkFfVXJpKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3VyaS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdXJpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIzMTU5NgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3VyaS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9VUklfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVVJJX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfVXJpIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1VyaShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1VyaSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9VUklfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3VzZXIuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdXNlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDllYzYwOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3VzZXIuY3BwCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3VzZXIuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF91c2VyLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwidXNlciI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1VzZXI6OkNYRkFfVXNlcihDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpUZXh0Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6VXNlciwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfVXNlcj4odGhpcykpIHt9CisKK0NYRkFfVXNlcjo6fkNYRkFfVXNlcigpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV91c2VyLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV91c2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FhZDE3MwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3VzZXIuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVVNFUl9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9VU0VSX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfVXNlciA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9Vc2VyKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfVXNlcigpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9VU0VSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWxpZGF0ZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWxpZGF0ZS5jcHAKaW5kZXggNTcwNmQ5Ni4uODY4ZTgwNSAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsaWRhdGUuY3BwCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZhbGlkYXRlLmNwcApAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCkBAIC02LDExNCArNiwxNDggQEAKIAogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZhbGlkYXRlLmgiCiAKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9vYmplY3QuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdmFsaWRhdGUuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVzc2FnZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3BpY3R1cmUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9zY3JpcHQuaCIKIAotQ1hGQV9WYWxpZGF0ZTo6Q1hGQV9WYWxpZGF0ZShDWEZBX05vZGUqIHBOb2RlKSA6IENYRkFfRGF0YShwTm9kZSkge30KK25hbWVzcGFjZSB7CiAKLWludDMyX3QgQ1hGQV9WYWxpZGF0ZTo6R2V0Rm9ybWF0VGVzdCgpIHsKLSAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9Gb3JtYXRUZXN0KTsKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6Ok1lc3NhZ2UsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6UGljdHVyZSwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpTY3JpcHQsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpJZCwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpTY3JpcHRUZXN0LCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpFcnJvcn0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok51bGxUZXN0LCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpEaXNhYmxlZH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkZvcm1hdFRlc3QsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06Oldhcm5pbmd9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJ2YWxpZGF0ZSI7Citjb25zdGV4cHIgd2NoYXJfdCBrRm9ybWF0VGVzdFtdID0gTCJmb3JtYXRUZXN0IjsKK2NvbnN0ZXhwciB3Y2hhcl90IGtOdWxsVGVzdFtdID0gTCJudWxsVGVzdCI7Citjb25zdGV4cHIgd2NoYXJfdCBrU2NyaXB0VGVzdFtdID0gTCJzY3JpcHRUZXN0IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfVmFsaWRhdGU6OkNYRkFfVmFsaWRhdGUoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoCisgICAgICAgICAgZG9jLAorICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGUsCisgICAgICAgICAgWEZBX0VsZW1lbnQ6OlZhbGlkYXRlLAorICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAga05hbWUsCisgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9WYWxpZGF0ZT4odGhpcykpIHt9CisKK0NYRkFfVmFsaWRhdGU6On5DWEZBX1ZhbGlkYXRlKCkge30KKworWEZBX0F0dHJpYnV0ZUVudW0gQ1hGQV9WYWxpZGF0ZTo6R2V0Rm9ybWF0VGVzdCgpIHsKKyAgcmV0dXJuIEpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6Rm9ybWF0VGVzdCk7CiB9CiAKLWJvb2wgQ1hGQV9WYWxpZGF0ZTo6U2V0VGVzdFZhbHVlKGludDMyX3QgaVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVOYW1lKSB7Ci0gIGNvbnN0IFhGQV9BVFRSSUJVVEVFTlVNSU5GTyogcEluZm8gPQotICAgICAgWEZBX0dldEF0dHJpYnV0ZUVudW1CeU5hbWUod3NWYWx1ZS5Bc1N0cmluZ0MoKSk7Ci0gIGlmIChwSW5mbykKLSAgICBlTmFtZSA9IHBJbmZvLT5lTmFtZTsKLQotICBtX3BOb2RlLT5TZXRFbnVtKChYRkFfQVRUUklCVVRFKWlUeXBlLCBlTmFtZSwgZmFsc2UpOwotICByZXR1cm4gdHJ1ZTsKK3ZvaWQgQ1hGQV9WYWxpZGF0ZTo6U2V0TnVsbFRlc3QoY29uc3QgV2lkZVN0cmluZyYgd3NWYWx1ZSkgeworICBPcHRpb25hbDxYRkFfQXR0cmlidXRlRW51bT4gaXRlbSA9CisgICAgICBDWEZBX05vZGU6Ok5hbWVUb0F0dHJpYnV0ZUVudW0od3NWYWx1ZS5Bc1N0cmluZ1ZpZXcoKSk7CisgIEpTT2JqZWN0KCktPlNldEVudW0oWEZBX0F0dHJpYnV0ZTo6TnVsbFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgaXRlbSA/ICppdGVtIDogWEZBX0F0dHJpYnV0ZUVudW06OkRpc2FibGVkLCBmYWxzZSk7CiB9CiAKLWJvb2wgQ1hGQV9WYWxpZGF0ZTo6U2V0TnVsbFRlc3QoQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSkgewotICByZXR1cm4gU2V0VGVzdFZhbHVlKFhGQV9BVFRSSUJVVEVfTnVsbFRlc3QsIHdzVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fRGlzYWJsZWQpOworWEZBX0F0dHJpYnV0ZUVudW0gQ1hGQV9WYWxpZGF0ZTo6R2V0TnVsbFRlc3QoKSB7CisgIHJldHVybiBKU09iamVjdCgpLT5HZXRFbnVtKFhGQV9BdHRyaWJ1dGU6Ok51bGxUZXN0KTsKIH0KIAotaW50MzJfdCBDWEZBX1ZhbGlkYXRlOjpHZXROdWxsVGVzdCgpIHsKLSAgcmV0dXJuIG1fcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9OdWxsVGVzdCk7CitYRkFfQXR0cmlidXRlRW51bSBDWEZBX1ZhbGlkYXRlOjpHZXRTY3JpcHRUZXN0KCkgeworICByZXR1cm4gSlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpTY3JpcHRUZXN0KTsKIH0KIAotaW50MzJfdCBDWEZBX1ZhbGlkYXRlOjpHZXRTY3JpcHRUZXN0KCkgewotICByZXR1cm4gbV9wTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1NjcmlwdFRlc3QpOwotfQotCi12b2lkIENYRkFfVmFsaWRhdGU6OkdldE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nJiB3c01lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c01lc3NhZ2VUeXBlKSB7Ci0gIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRWxlbWVudDo6TWVzc2FnZSwgZmFsc2UpOworV2lkZVN0cmluZyBDWEZBX1ZhbGlkYXRlOjpHZXRNZXNzYWdlVGV4dChjb25zdCBXaWRlU3RyaW5nJiB3c01lc3NhZ2VUeXBlKSB7CisgIENYRkFfTWVzc2FnZSogcE5vZGUgPQorICAgICAgSlNPYmplY3QoKS0+R2V0UHJvcGVydHk8Q1hGQV9NZXNzYWdlPigwLCBYRkFfRWxlbWVudDo6TWVzc2FnZSk7CiAgIGlmICghcE5vZGUpCi0gICAgcmV0dXJuOworICAgIHJldHVybiBMIiI7CiAKLSAgQ1hGQV9Ob2RlKiBwSXRlbU5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICBmb3IgKDsgcEl0ZW1Ob2RlOwotICAgICAgIHBJdGVtTm9kZSA9IHBJdGVtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgeworICBmb3IgKENYRkFfTm9kZSogcEl0ZW1Ob2RlID0gcE5vZGUtPkdldEZpcnN0Q2hpbGQoKTsgcEl0ZW1Ob2RlOworICAgICAgIHBJdGVtTm9kZSA9IHBJdGVtTm9kZS0+R2V0TmV4dFNpYmxpbmcoKSkgewogICAgIGlmIChwSXRlbU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlRleHQpCiAgICAgICBjb250aW51ZTsKIAotICAgIENGWF9XaWRlU3RyaW5nQyB3c05hbWU7Ci0gICAgcEl0ZW1Ob2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7Ci0gICAgaWYgKHdzTmFtZS5Jc0VtcHR5KCkgfHwgd3NOYW1lID09IHdzTWVzc2FnZVR5cGUpIHsKLSAgICAgIHBJdGVtTm9kZS0+VHJ5Q29udGVudCh3c01lc3NhZ2UpOwotICAgICAgcmV0dXJuOwotICAgIH0KKyAgICBXaWRlU3RyaW5nIHdzTmFtZSA9IHBJdGVtTm9kZS0+SlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6TmFtZSk7CisgICAgaWYgKHdzTmFtZS5Jc0VtcHR5KCkgfHwgd3NOYW1lID09IHdzTWVzc2FnZVR5cGUpCisgICAgICByZXR1cm4gcEl0ZW1Ob2RlLT5KU09iamVjdCgpLT5HZXRDb250ZW50KGZhbHNlKTsKICAgfQorICByZXR1cm4gTCIiOwogfQogCi12b2lkIENYRkFfVmFsaWRhdGU6OlNldEZvcm1hdE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZSkgewotICBTZXRNZXNzYWdlVGV4dCh3c01lc3NhZ2UsIEwiZm9ybWF0VGVzdCIpOwordm9pZCBDWEZBX1ZhbGlkYXRlOjpTZXRGb3JtYXRNZXNzYWdlVGV4dChjb25zdCBXaWRlU3RyaW5nJiB3c01lc3NhZ2UpIHsKKyAgU2V0TWVzc2FnZVRleHQoa0Zvcm1hdFRlc3QsIHdzTWVzc2FnZSk7CiB9CiAKLXZvaWQgQ1hGQV9WYWxpZGF0ZTo6R2V0Rm9ybWF0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSkgewotICBHZXRNZXNzYWdlVGV4dCh3c01lc3NhZ2UsIEwiZm9ybWF0VGVzdCIpOworV2lkZVN0cmluZyBDWEZBX1ZhbGlkYXRlOjpHZXRGb3JtYXRNZXNzYWdlVGV4dCgpIHsKKyAgcmV0dXJuIEdldE1lc3NhZ2VUZXh0KGtGb3JtYXRUZXN0KTsKIH0KIAotdm9pZCBDWEZBX1ZhbGlkYXRlOjpTZXROdWxsTWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcgd3NNZXNzYWdlKSB7Ci0gIFNldE1lc3NhZ2VUZXh0KHdzTWVzc2FnZSwgTCJudWxsVGVzdCIpOwordm9pZCBDWEZBX1ZhbGlkYXRlOjpTZXROdWxsTWVzc2FnZVRleHQoY29uc3QgV2lkZVN0cmluZyYgd3NNZXNzYWdlKSB7CisgIFNldE1lc3NhZ2VUZXh0KGtOdWxsVGVzdCwgd3NNZXNzYWdlKTsKIH0KIAotdm9pZCBDWEZBX1ZhbGlkYXRlOjpHZXROdWxsTWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSkgewotICBHZXRNZXNzYWdlVGV4dCh3c01lc3NhZ2UsIEwibnVsbFRlc3QiKTsKK1dpZGVTdHJpbmcgQ1hGQV9WYWxpZGF0ZTo6R2V0TnVsbE1lc3NhZ2VUZXh0KCkgeworICByZXR1cm4gR2V0TWVzc2FnZVRleHQoa051bGxUZXN0KTsKIH0KIAotdm9pZCBDWEZBX1ZhbGlkYXRlOjpTZXRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyYgd3NNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NNZXNzYWdlVHlwZSkgewotICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VsZW1lbnQ6Ok1lc3NhZ2UsIHRydWUpOworV2lkZVN0cmluZyBDWEZBX1ZhbGlkYXRlOjpHZXRTY3JpcHRNZXNzYWdlVGV4dCgpIHsKKyAgcmV0dXJuIEdldE1lc3NhZ2VUZXh0KGtTY3JpcHRUZXN0KTsKK30KKwordm9pZCBDWEZBX1ZhbGlkYXRlOjpTZXRTY3JpcHRNZXNzYWdlVGV4dChjb25zdCBXaWRlU3RyaW5nJiB3c01lc3NhZ2UpIHsKKyAgU2V0TWVzc2FnZVRleHQoa1NjcmlwdFRlc3QsIHdzTWVzc2FnZSk7Cit9CisKK3ZvaWQgQ1hGQV9WYWxpZGF0ZTo6U2V0TWVzc2FnZVRleHQoY29uc3QgV2lkZVN0cmluZyYgd3NNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NNZXNzYWdlKSB7CisgIENYRkFfTWVzc2FnZSogcE5vZGUgPQorICAgICAgSlNPYmplY3QoKS0+R2V0T3JDcmVhdGVQcm9wZXJ0eTxDWEZBX01lc3NhZ2U+KDAsIFhGQV9FbGVtZW50OjpNZXNzYWdlKTsKICAgaWYgKCFwTm9kZSkKICAgICByZXR1cm47CiAKLSAgQ1hGQV9Ob2RlKiBwSXRlbU5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICBmb3IgKDsgcEl0ZW1Ob2RlOwotICAgICAgIHBJdGVtTm9kZSA9IHBJdGVtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgeworICBmb3IgKENYRkFfTm9kZSogcEl0ZW1Ob2RlID0gcE5vZGUtPkdldEZpcnN0Q2hpbGQoKTsgcEl0ZW1Ob2RlOworICAgICAgIHBJdGVtTm9kZSA9IHBJdGVtTm9kZS0+R2V0TmV4dFNpYmxpbmcoKSkgewogICAgIGlmIChwSXRlbU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlRleHQpCiAgICAgICBjb250aW51ZTsKIAotICAgIENGWF9XaWRlU3RyaW5nQyB3c05hbWU7Ci0gICAgcEl0ZW1Ob2RlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7CisgICAgV2lkZVN0cmluZyB3c05hbWUgPSBwSXRlbU5vZGUtPkpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6Ok5hbWUpOwogICAgIGlmICh3c05hbWUuSXNFbXB0eSgpIHx8IHdzTmFtZSA9PSB3c01lc3NhZ2VUeXBlKSB7Ci0gICAgICBwSXRlbU5vZGUtPlNldENvbnRlbnQod3NNZXNzYWdlLCB3c01lc3NhZ2UsIGZhbHNlKTsKKyAgICAgIHBJdGVtTm9kZS0+SlNPYmplY3QoKS0+U2V0Q29udGVudCh3c01lc3NhZ2UsIHdzTWVzc2FnZSwgZmFsc2UsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwogICAgICAgcmV0dXJuOwogICAgIH0KICAgfQorCiAgIENYRkFfTm9kZSogcFRleHROb2RlID0gcE5vZGUtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FbGVtZW50OjpUZXh0KTsKLSAgcE5vZGUtPkluc2VydENoaWxkKHBUZXh0Tm9kZSk7Ci0gIHBUZXh0Tm9kZS0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c01lc3NhZ2VUeXBlLCBmYWxzZSk7Ci0gIHBUZXh0Tm9kZS0+U2V0Q29udGVudCh3c01lc3NhZ2UsIHdzTWVzc2FnZSwgZmFsc2UpOworICBwTm9kZS0+SW5zZXJ0Q2hpbGQocFRleHROb2RlLCBudWxscHRyKTsKKyAgcFRleHROb2RlLT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpOYW1lLCB3c01lc3NhZ2VUeXBlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIHBUZXh0Tm9kZS0+SlNPYmplY3QoKS0+U2V0Q29udGVudCh3c01lc3NhZ2UsIHdzTWVzc2FnZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKIH0KIAotdm9pZCBDWEZBX1ZhbGlkYXRlOjpHZXRTY3JpcHRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyYgd3NNZXNzYWdlKSB7Ci0gIEdldE1lc3NhZ2VUZXh0KHdzTWVzc2FnZSwgTCJzY3JpcHRUZXN0Iik7CitXaWRlU3RyaW5nIENYRkFfVmFsaWRhdGU6OkdldFBpY3R1cmUoKSB7CisgIENYRkFfUGljdHVyZSogcE5vZGUgPSBHZXRDaGlsZDxDWEZBX1BpY3R1cmU+KDAsIFhGQV9FbGVtZW50OjpQaWN0dXJlLCBmYWxzZSk7CisgIHJldHVybiBwTm9kZSA/IHBOb2RlLT5KU09iamVjdCgpLT5HZXRDb250ZW50KGZhbHNlKSA6IEwiIjsKIH0KIAotdm9pZCBDWEZBX1ZhbGlkYXRlOjpTZXRTY3JpcHRNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2UpIHsKLSAgU2V0TWVzc2FnZVRleHQod3NNZXNzYWdlLCBMInNjcmlwdFRlc3QiKTsKLX0KLQotdm9pZCBDWEZBX1ZhbGlkYXRlOjpHZXRQaWN0dXJlKENGWF9XaWRlU3RyaW5nJiB3c1BpY3R1cmUpIHsKLSAgaWYgKENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6UGljdHVyZSkpCi0gICAgcE5vZGUtPlRyeUNvbnRlbnQod3NQaWN0dXJlKTsKLX0KLQotQ1hGQV9TY3JpcHQgQ1hGQV9WYWxpZGF0ZTo6R2V0U2NyaXB0KCkgewotICByZXR1cm4gQ1hGQV9TY3JpcHQobV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VsZW1lbnQ6OlNjcmlwdCkpOworQ1hGQV9TY3JpcHQqIENYRkFfVmFsaWRhdGU6OkdldFNjcmlwdElmRXhpc3RzKCkgeworICByZXR1cm4gR2V0Q2hpbGQ8Q1hGQV9TY3JpcHQ+KDAsIFhGQV9FbGVtZW50OjpTY3JpcHQsIGZhbHNlKTsKIH0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZhbGlkYXRlLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWxpZGF0ZS5oCmluZGV4IDAzYmJhZGQuLmE2MDEzMDggMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZhbGlkYXRlLmgKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsaWRhdGUuaApAQCAtMSw0ICsxLDQgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCkBAIC03LDM4ICs3LDM2IEBACiAjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1ZBTElEQVRFX0hfCiAjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1ZBTElEQVRFX0hfCiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N0cmluZy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NjcmlwdC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKIAotY2xhc3MgQ1hGQV9Ob2RlOworY2xhc3MgQ1hGQV9TY3JpcHQ7CiAKLWNsYXNzIENYRkFfVmFsaWRhdGUgOiBwdWJsaWMgQ1hGQV9EYXRhIHsKK2NsYXNzIENYRkFfVmFsaWRhdGUgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfVmFsaWRhdGUoQ1hGQV9Ob2RlKiBwTm9kZSk7CisgIENYRkFfVmFsaWRhdGUoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9WYWxpZGF0ZSgpIG92ZXJyaWRlOwogCi0gIGludDMyX3QgR2V0Rm9ybWF0VGVzdCgpOwotICBpbnQzMl90IEdldE51bGxUZXN0KCk7Ci0gIGJvb2wgU2V0TnVsbFRlc3QoQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSk7Ci0gIGludDMyX3QgR2V0U2NyaXB0VGVzdCgpOwotICB2b2lkIEdldEZvcm1hdE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nJiB3c01lc3NhZ2UpOwotICB2b2lkIFNldEZvcm1hdE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZSk7Ci0gIHZvaWQgR2V0TnVsbE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nJiB3c01lc3NhZ2UpOwotICB2b2lkIFNldE51bGxNZXNzYWdlVGV4dChDRlhfV2lkZVN0cmluZyB3c01lc3NhZ2UpOwotICB2b2lkIEdldFNjcmlwdE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nJiB3c01lc3NhZ2UpOwotICB2b2lkIFNldFNjcmlwdE1lc3NhZ2VUZXh0KENGWF9XaWRlU3RyaW5nIHdzTWVzc2FnZSk7Ci0gIHZvaWQgR2V0UGljdHVyZShDRlhfV2lkZVN0cmluZyYgd3NQaWN0dXJlKTsKLSAgQ1hGQV9TY3JpcHQgR2V0U2NyaXB0KCk7CisgIFhGQV9BdHRyaWJ1dGVFbnVtIEdldEZvcm1hdFRlc3QoKTsKKyAgV2lkZVN0cmluZyBHZXRGb3JtYXRNZXNzYWdlVGV4dCgpOworICB2b2lkIFNldEZvcm1hdE1lc3NhZ2VUZXh0KGNvbnN0IFdpZGVTdHJpbmcmIHdzTWVzc2FnZSk7CiAKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgR2V0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NNZXNzYWdlVHlwZSk7Ci0gIHZvaWQgU2V0TWVzc2FnZVRleHQoQ0ZYX1dpZGVTdHJpbmcmIHdzTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NNZXNzYWdlVHlwZSk7Ci0gIGJvb2wgU2V0VGVzdFZhbHVlKGludDMyX3QgaVR5cGUsCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLAotICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlTmFtZSk7CisgIFhGQV9BdHRyaWJ1dGVFbnVtIEdldE51bGxUZXN0KCk7CisgIHZvaWQgU2V0TnVsbFRlc3QoY29uc3QgV2lkZVN0cmluZyYgd3NWYWx1ZSk7CisKKyAgV2lkZVN0cmluZyBHZXROdWxsTWVzc2FnZVRleHQoKTsKKyAgdm9pZCBTZXROdWxsTWVzc2FnZVRleHQoY29uc3QgV2lkZVN0cmluZyYgd3NNZXNzYWdlKTsKKworICBYRkFfQXR0cmlidXRlRW51bSBHZXRTY3JpcHRUZXN0KCk7CisgIFdpZGVTdHJpbmcgR2V0U2NyaXB0TWVzc2FnZVRleHQoKTsKKyAgdm9pZCBTZXRTY3JpcHRNZXNzYWdlVGV4dChjb25zdCBXaWRlU3RyaW5nJiB3c01lc3NhZ2UpOworCisgIFdpZGVTdHJpbmcgR2V0UGljdHVyZSgpOworICBDWEZBX1NjcmlwdCogR2V0U2NyaXB0SWZFeGlzdHMoKTsKKworIHByaXZhdGU6CisgIFdpZGVTdHJpbmcgR2V0TWVzc2FnZVRleHQoY29uc3QgV2lkZVN0cmluZyYgd3NNZXNzYWdlVHlwZSk7CisgIHZvaWQgU2V0TWVzc2FnZVRleHQoY29uc3QgV2lkZVN0cmluZyYgd3NNZXNzYWdlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c01lc3NhZ2UpOwogfTsKIAogI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9WQUxJREFURV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsaWRhdGVhcHByb3ZhbHNpZ25hdHVyZXMuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsaWRhdGVhcHByb3ZhbHNpZ25hdHVyZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MTEzMWUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWxpZGF0ZWFwcHJvdmFsc2lnbmF0dXJlcy5jcHAKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsaWRhdGVhcHByb3ZhbHNpZ25hdHVyZXMuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfVmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXM6OkNYRkFfVmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMoCisgICAgQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlViwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6VmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9WYWxpZGF0ZUFwcHJvdmFsU2lnbmF0dXJlczo6fkNYRkFfVmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsaWRhdGVhcHByb3ZhbHNpZ25hdHVyZXMuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZhbGlkYXRlYXBwcm92YWxzaWduYXR1cmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdkYWM5OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZhbGlkYXRlYXBwcm92YWxzaWduYXR1cmVzLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1ZBTElEQVRFQVBQUk9WQUxTSUdOQVRVUkVTX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1ZBTElEQVRFQVBQUk9WQUxTSUdOQVRVUkVTX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfVmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfVmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9WYWxpZGF0ZUFwcHJvdmFsU2lnbmF0dXJlcygpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9WQUxJREFURUFQUFJPVkFMU0lHTkFUVVJFU19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsaWRhdGlvbm1lc3NhZ2luZy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWxpZGF0aW9ubWVzc2FnaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTZjOThjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsaWRhdGlvbm1lc3NhZ2luZy5jcHAKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsaWRhdGlvbm1lc3NhZ2luZy5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwidmFsaWRhdGlvbk1lc3NhZ2luZyI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1ZhbGlkYXRpb25NZXNzYWdpbmc6OkNYRkFfVmFsaWRhdGlvbk1lc3NhZ2luZyhDWEZBX0RvY3VtZW50KiBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVYsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlZhbGlkYXRpb25NZXNzYWdpbmcsCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSkge30KKworQ1hGQV9WYWxpZGF0aW9uTWVzc2FnaW5nOjp+Q1hGQV9WYWxpZGF0aW9uTWVzc2FnaW5nKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZhbGlkYXRpb25tZXNzYWdpbmcuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZhbGlkYXRpb25tZXNzYWdpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODFiMjRjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsaWRhdGlvbm1lc3NhZ2luZy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9WQUxJREFUSU9OTUVTU0FHSU5HX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1ZBTElEQVRJT05NRVNTQUdJTkdfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9WYWxpZGF0aW9uTWVzc2FnaW5nIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1ZhbGlkYXRpb25NZXNzYWdpbmcoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9WYWxpZGF0aW9uTWVzc2FnaW5nKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1ZBTElEQVRJT05NRVNTQUdJTkdfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZhbHVlLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZhbHVlLmNwcAppbmRleCA0ZDQ2N2FlLi4yY2QwZGQ5IDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWx1ZS5jcHAKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsdWUuY3BwCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKQEAgLTYsNTEgKzYsOTkgQEAKIAogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZhbHVlLmgiCiAKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9vYmplY3QuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdmFsdWUuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXJjLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhkYXRhLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaW1hZ2UuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9saW5lLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcmVjdGFuZ2xlLmgiCiAKLVhGQV9FbGVtZW50IENYRkFfVmFsdWU6OkdldENoaWxkVmFsdWVDbGFzc0lEKCkgewotICBpZiAoIW1fcE5vZGUpCi0gICAgcmV0dXJuIFhGQV9FbGVtZW50OjpVbmtub3duOwotICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkKLSAgICByZXR1cm4gcE5vZGUtPkdldEVsZW1lbnRUeXBlKCk7Ci0gIHJldHVybiBYRkFfRWxlbWVudDo6VW5rbm93bjsKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHsKKyAgICB7WEZBX0VsZW1lbnQ6OkFyYywgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCisgICAge1hGQV9FbGVtZW50OjpUZXh0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlRpbWUsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAorICAgIHtYRkFfRWxlbWVudDo6RGF0ZVRpbWUsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAorICAgIHtYRkFfRWxlbWVudDo6SW1hZ2UsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAorICAgIHtYRkFfRWxlbWVudDo6RGVjaW1hbCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCisgICAge1hGQV9FbGVtZW50OjpCb29sZWFuLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkludGVnZXIsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAorICAgIHtYRkFfRWxlbWVudDo6RXhEYXRhLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlJlY3RhbmdsZSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCisgICAge1hGQV9FbGVtZW50OjpEYXRlLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkZsb2F0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKKyAgICB7WEZBX0VsZW1lbnQ6OkxpbmUsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAorICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlJlbGV2YW50LCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpPdmVycmlkZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkJvb2xlYW4sICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwidmFsdWUiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9WYWx1ZTo6Q1hGQV9WYWx1ZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIChYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtKSwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6VmFsdWUsCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX1ZhbHVlPih0aGlzKSkge30KKworQ1hGQV9WYWx1ZTo6fkNYRkFfVmFsdWUoKSB7fQorCitYRkFfRWxlbWVudCBDWEZBX1ZhbHVlOjpHZXRDaGlsZFZhbHVlQ2xhc3NJRCgpIGNvbnN0IHsKKyAgQ1hGQV9Ob2RlKiBwTm9kZSA9IEdldEZpcnN0Q2hpbGQoKTsKKyAgcmV0dXJuIHBOb2RlID8gcE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgOiBYRkFfRWxlbWVudDo6VW5rbm93bjsKIH0KIAotYm9vbCBDWEZBX1ZhbHVlOjpHZXRDaGlsZFZhbHVlQ29udGVudChDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50KSB7Ci0gIGlmICghbV9wTm9kZSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpKQotICAgIHJldHVybiBwTm9kZS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOwotICByZXR1cm4gZmFsc2U7CitXaWRlU3RyaW5nIENYRkFfVmFsdWU6OkdldENoaWxkVmFsdWVDb250ZW50KCkgY29uc3QgeworICBDWEZBX05vZGUqIHBOb2RlID0gR2V0Rmlyc3RDaGlsZCgpOworICByZXR1cm4gcE5vZGUgPyBwTm9kZS0+SlNPYmplY3QoKS0+VHJ5Q29udGVudChmYWxzZSwgdHJ1ZSkudmFsdWVfb3IoTCIiKSA6IEwiIjsKIH0KIAotQ1hGQV9BcmMgQ1hGQV9WYWx1ZTo6R2V0QXJjKCkgewotICByZXR1cm4gQ1hGQV9BcmMobV9wTm9kZSA/IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKQotICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHIpOworQ1hGQV9BcmMqIENYRkFfVmFsdWU6OkdldEFyY0lmRXhpc3RzKCkgY29uc3QgeworICBDWEZBX05vZGUqIG5vZGUgPSBHZXRGaXJzdENoaWxkKCk7CisgIEFTU0VSVCghbm9kZSB8fCBub2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpBcmMpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9BcmMqPihub2RlKTsKIH0KIAotQ1hGQV9MaW5lIENYRkFfVmFsdWU6OkdldExpbmUoKSB7Ci0gIHJldHVybiBDWEZBX0xpbmUobV9wTm9kZSA/IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyKTsKK0NYRkFfTGluZSogQ1hGQV9WYWx1ZTo6R2V0TGluZUlmRXhpc3RzKCkgY29uc3QgeworICBDWEZBX05vZGUqIG5vZGUgPSBHZXRGaXJzdENoaWxkKCk7CisgIEFTU0VSVCghbm9kZSB8fCBub2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpMaW5lKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfTGluZSo+KG5vZGUpOwogfQogCi1DWEZBX1JlY3RhbmdsZSBDWEZBX1ZhbHVlOjpHZXRSZWN0YW5nbGUoKSB7Ci0gIHJldHVybiBDWEZBX1JlY3RhbmdsZShtX3BOb2RlID8gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cik7CitDWEZBX1JlY3RhbmdsZSogQ1hGQV9WYWx1ZTo6R2V0UmVjdGFuZ2xlSWZFeGlzdHMoKSBjb25zdCB7CisgIENYRkFfTm9kZSogbm9kZSA9IEdldEZpcnN0Q2hpbGQoKTsKKyAgQVNTRVJUKCFub2RlIHx8IG5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlJlY3RhbmdsZSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxDWEZBX1JlY3RhbmdsZSo+KG5vZGUpOwogfQogCi1DWEZBX1RleHQgQ1hGQV9WYWx1ZTo6R2V0VGV4dCgpIHsKLSAgcmV0dXJuIENYRkFfVGV4dChtX3BOb2RlID8gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHIpOworQ1hGQV9UZXh0KiBDWEZBX1ZhbHVlOjpHZXRUZXh0SWZFeGlzdHMoKSBjb25zdCB7CisgIENYRkFfTm9kZSogbm9kZSA9IEdldEZpcnN0Q2hpbGQoKTsKKyAgQVNTRVJUKCFub2RlIHx8IG5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlRleHQpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9UZXh0Kj4obm9kZSk7CiB9CiAKLUNYRkFfRXhEYXRhIENYRkFfVmFsdWU6OkdldEV4RGF0YSgpIHsKLSAgcmV0dXJuIENYRkFfRXhEYXRhKG1fcE5vZGUgPyBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyKTsKK0NYRkFfRXhEYXRhKiBDWEZBX1ZhbHVlOjpHZXRFeERhdGFJZkV4aXN0cygpIGNvbnN0IHsKKyAgQ1hGQV9Ob2RlKiBub2RlID0gR2V0Rmlyc3RDaGlsZCgpOworICBBU1NFUlQoIW5vZGUgfHwgbm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6RXhEYXRhKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PENYRkFfRXhEYXRhKj4obm9kZSk7CiB9CiAKLUNYRkFfSW1hZ2UgQ1hGQV9WYWx1ZTo6R2V0SW1hZ2UoKSB7Ci0gIHJldHVybiBDWEZBX0ltYWdlKAotICAgICAgbV9wTm9kZSA/IChtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpIDogbnVsbHB0ciwKLSAgICAgIHRydWUpOworQ1hGQV9JbWFnZSogQ1hGQV9WYWx1ZTo6R2V0SW1hZ2VJZkV4aXN0cygpIGNvbnN0IHsKKyAgQ1hGQV9Ob2RlKiBub2RlID0gR2V0Rmlyc3RDaGlsZCgpOworICBBU1NFUlQoIW5vZGUgfHwgbm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6SW1hZ2UpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8Q1hGQV9JbWFnZSo+KG5vZGUpOwogfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsdWUuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZhbHVlLmgKaW5kZXggMjI1ZTE4Ny4uNDdhZWVmZSAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsdWUuaAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWx1ZS5oCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKIC8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKQEAgLTgsMjggKzgsMjggQEAKICNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVkFMVUVfSF8KIAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYXJjLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZGF0YS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2V4ZGF0YS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2ltYWdlLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbGluZS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3JlY3RhbmdsZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZXh0LmgiCiAKLWNsYXNzIENYRkFfTm9kZTsKK2NsYXNzIENYRkFfQXJjOworY2xhc3MgQ1hGQV9FeERhdGE7CitjbGFzcyBDWEZBX0ltYWdlOworY2xhc3MgQ1hGQV9MaW5lOworY2xhc3MgQ1hGQV9SZWN0YW5nbGU7CiAKLWNsYXNzIENYRkFfVmFsdWUgOiBwdWJsaWMgQ1hGQV9EYXRhIHsKK2NsYXNzIENYRkFfVmFsdWUgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfVmFsdWUoQ1hGQV9Ob2RlKiBwTm9kZSkgOiBDWEZBX0RhdGEocE5vZGUpIHt9CisgIENYRkFfVmFsdWUoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9WYWx1ZSgpIG92ZXJyaWRlOwogCi0gIFhGQV9FbGVtZW50IEdldENoaWxkVmFsdWVDbGFzc0lEKCk7Ci0gIGJvb2wgR2V0Q2hpbGRWYWx1ZUNvbnRlbnQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCk7Ci0gIENYRkFfQXJjIEdldEFyYygpOwotICBDWEZBX0xpbmUgR2V0TGluZSgpOwotICBDWEZBX1JlY3RhbmdsZSBHZXRSZWN0YW5nbGUoKTsKLSAgQ1hGQV9UZXh0IEdldFRleHQoKTsKLSAgQ1hGQV9FeERhdGEgR2V0RXhEYXRhKCk7Ci0gIENYRkFfSW1hZ2UgR2V0SW1hZ2UoKTsKKyAgWEZBX0VsZW1lbnQgR2V0Q2hpbGRWYWx1ZUNsYXNzSUQoKSBjb25zdDsKKyAgV2lkZVN0cmluZyBHZXRDaGlsZFZhbHVlQ29udGVudCgpIGNvbnN0OworICBDWEZBX0FyYyogR2V0QXJjSWZFeGlzdHMoKSBjb25zdDsKKyAgQ1hGQV9MaW5lKiBHZXRMaW5lSWZFeGlzdHMoKSBjb25zdDsKKyAgQ1hGQV9SZWN0YW5nbGUqIEdldFJlY3RhbmdsZUlmRXhpc3RzKCkgY29uc3Q7CisgIENYRkFfVGV4dCogR2V0VGV4dElmRXhpc3RzKCkgY29uc3Q7CisgIENYRkFfRXhEYXRhKiBHZXRFeERhdGFJZkV4aXN0cygpIGNvbnN0OworICBDWEZBX0ltYWdlKiBHZXRJbWFnZUlmRXhpc3RzKCkgY29uc3Q7CiB9OwogCiAjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWx1ZWFycmF5LmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZhbHVlYXJyYXkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGFmYzQwLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZhbHVlYXJyYXkuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsdWVhcnJheS5oIgotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfc2NyaXB0Y29udGV4dC5oIgotCi1DWEZBX1ZhbHVlQXJyYXk6OkNYRkFfVmFsdWVBcnJheSh2ODo6SXNvbGF0ZSogcElzb2xhdGUpCi0gICAgOiBtX3BJc29sYXRlKHBJc29sYXRlKSB7fQotCi1DWEZBX1ZhbHVlQXJyYXk6On5DWEZBX1ZhbHVlQXJyYXkoKSB7Ci0gIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IEdldFNpemUoKTsgaSsrKQotICAgIGRlbGV0ZSBHZXRBdChpKTsKLX0KLQotdm9pZCBDWEZBX1ZhbHVlQXJyYXk6OkdldEF0dHJpYnV0ZU9iamVjdChDWEZBX09iakFycmF5JiBvYmpBcnJheSkgewotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBHZXRTaXplKCk7IGkrKykKLSAgICBvYmpBcnJheS5BZGQoQ1hGQV9TY3JpcHRDb250ZXh0OjpUb09iamVjdChHZXRBdChpKSwgbnVsbHB0cikpOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsdWVhcnJheS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmFsdWVhcnJheS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzRlYTI5Li4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZhbHVlYXJyYXkuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9WQUxVRUFSUkFZX0hfCi0jZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1ZBTFVFQVJSQVlfSF8KLQotI2luY2x1ZGUgImZ4anMvY2Z4anNlX3ZhbHVlLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvZnhmYS5oIgotCi1jbGFzcyBDWEZBX1ZhbHVlQXJyYXkgOiBwdWJsaWMgQ0ZYX0FycmF5VGVtcGxhdGU8Q0ZYSlNFX1ZhbHVlKj4gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9WYWx1ZUFycmF5KHY4OjpJc29sYXRlKiBwSXNvbGF0ZSk7Ci0gIH5DWEZBX1ZhbHVlQXJyYXkoKTsKLQotICB2b2lkIEdldEF0dHJpYnV0ZU9iamVjdChDWEZBX09iakFycmF5JiBvYmpBcnJheSk7Ci0KLSAgdjg6Oklzb2xhdGUqIGNvbnN0IG1fcElzb2xhdGU7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1ZBTFVFQVJSQVlfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZhcmlhYmxlcy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV92YXJpYWJsZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlM2U3NTEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV92YXJpYWJsZXMuY3BwCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZhcmlhYmxlcy5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3ZhcmlhYmxlcy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInZhcmlhYmxlcyI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1ZhcmlhYmxlczo6Q1hGQV9WYXJpYWJsZXMoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlZhcmlhYmxlcywKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfVmFyaWFibGVzPih0aGlzKSkge30KKworQ1hGQV9WYXJpYWJsZXM6On5DWEZBX1ZhcmlhYmxlcygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV92YXJpYWJsZXMuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZhcmlhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNGNiNGUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV92YXJpYWJsZXMuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVkFSSUFCTEVTX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1ZBUklBQkxFU19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1ZhcmlhYmxlcyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9WYXJpYWJsZXMoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9WYXJpYWJsZXMoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVkFSSUFCTEVTX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV92ZXJzaW9uLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZlcnNpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNjZmNDQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV92ZXJzaW9uLmNwcApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV92ZXJzaW9uLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJ2ZXJzaW9uIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfVmVyc2lvbjo6Q1hGQV9WZXJzaW9uKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpWZXJzaW9uLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfVmVyc2lvbjo6fkNYRkFfVmVyc2lvbigpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV92ZXJzaW9uLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV92ZXJzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0NjJmYgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZlcnNpb24uaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVkVSU0lPTl9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9WRVJTSU9OX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfVmVyc2lvbiA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9WZXJzaW9uKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfVmVyc2lvbigpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9WRVJTSU9OX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV92ZXJzaW9uY29udHJvbC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV92ZXJzaW9uY29udHJvbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNjYTg0YQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZlcnNpb25jb250cm9sLmNwcApAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV92ZXJzaW9uY29udHJvbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6U291cmNlQmVsb3csIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06OlVwZGF0ZX0sCisgICAge1hGQV9BdHRyaWJ1dGU6Ok91dHB1dEJlbG93LCBYRkFfQXR0cmlidXRlVHlwZTo6RW51bSwKKyAgICAgKHZvaWQqKVhGQV9BdHRyaWJ1dGVFbnVtOjpXYXJufSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6U291cmNlQWJvdmUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpFbnVtLAorICAgICAodm9pZCopWEZBX0F0dHJpYnV0ZUVudW06Oldhcm59LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJ2ZXJzaW9uQ29udHJvbCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1ZlcnNpb25Db250cm9sOjpDWEZBX1ZlcnNpb25Db250cm9sKENYRkFfRG9jdW1lbnQqIGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlZlcnNpb25Db250cm9sLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfVmVyc2lvbkNvbnRyb2w6On5DWEZBX1ZlcnNpb25Db250cm9sKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZlcnNpb25jb250cm9sLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV92ZXJzaW9uY29udHJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ODhmNTUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV92ZXJzaW9uY29udHJvbC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9WRVJTSU9OQ09OVFJPTF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9WRVJTSU9OQ09OVFJPTF9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1ZlcnNpb25Db250cm9sIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1ZlcnNpb25Db250cm9sKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfVmVyc2lvbkNvbnRyb2woKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVkVSU0lPTkNPTlRST0xfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZpZXdlcnByZWZlcmVuY2VzLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZpZXdlcnByZWZlcmVuY2VzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjgwYjQ3Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfdmlld2VycHJlZmVyZW5jZXMuY3BwCkBAIC0wLDAgKzEsNDIgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZpZXdlcnByZWZlcmVuY2VzLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHsKKyAgICB7WEZBX0VsZW1lbnQ6OlByaW50U2NhbGluZywgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpFbmZvcmNlLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6Ok51bWJlck9mQ29waWVzLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlBhZ2VSYW5nZSwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpBZGRWaWV3ZXJQcmVmZXJlbmNlcywgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpBREJFX0pTQ29uc29sZSwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpEdXBsZXhPcHRpb24sIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6QURCRV9KU0RlYnVnZ2VyLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlBpY2tUcmF5QnlQREZTaXplLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJ2aWV3ZXJQcmVmZXJlbmNlcyI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1ZpZXdlclByZWZlcmVuY2VzOjpDWEZBX1ZpZXdlclByZWZlcmVuY2VzKENYRkFfRG9jdW1lbnQqIGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlZpZXdlclByZWZlcmVuY2VzLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfVmlld2VyUHJlZmVyZW5jZXM6On5DWEZBX1ZpZXdlclByZWZlcmVuY2VzKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3ZpZXdlcnByZWZlcmVuY2VzLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV92aWV3ZXJwcmVmZXJlbmNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmODMxZWUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV92aWV3ZXJwcmVmZXJlbmNlcy5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9WSUVXRVJQUkVGRVJFTkNFU19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9WSUVXRVJQUkVGRVJFTkNFU19IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1ZpZXdlclByZWZlcmVuY2VzIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1ZpZXdlclByZWZlcmVuY2VzKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfVmlld2VyUHJlZmVyZW5jZXMoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfVklFV0VSUFJFRkVSRU5DRVNfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3dlYmNsaWVudC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV93ZWJjbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMjM1NjAKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV93ZWJjbGllbnQuY3BwCkBAIC0wLDAgKzEsMzQgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3dlYmNsaWVudC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7e1hGQV9FbGVtZW50OjpGb250SW5mbywgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpYZGMsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMIndlYkNsaWVudCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1dlYkNsaWVudDo6Q1hGQV9XZWJDbGllbnQoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6V2ViQ2xpZW50LAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfV2ViQ2xpZW50Ojp+Q1hGQV9XZWJDbGllbnQoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2ViY2xpZW50LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV93ZWJjbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzc4Njg5Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2ViY2xpZW50LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1dFQkNMSUVOVF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9XRUJDTElFTlRfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9XZWJDbGllbnQgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfV2ViQ2xpZW50KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfV2ViQ2xpZW50KCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1dFQkNMSUVOVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2hpdGVzcGFjZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV93aGl0ZXNwYWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzU5Yjg2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2hpdGVzcGFjZS5jcHAKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2hpdGVzcGFjZS5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwid2hpdGVzcGFjZSI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1doaXRlc3BhY2U6OkNYRkFfV2hpdGVzcGFjZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlViwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6V2hpdGVzcGFjZSwKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX1doaXRlc3BhY2U6On5DWEZBX1doaXRlc3BhY2UoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2hpdGVzcGFjZS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2hpdGVzcGFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZGRlNDgKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV93aGl0ZXNwYWNlLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1dISVRFU1BBQ0VfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfV0hJVEVTUEFDRV9IXworCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZS5oIgorCitjbGFzcyBDWEZBX1doaXRlc3BhY2UgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfV2hpdGVzcGFjZShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1doaXRlc3BhY2UoKSBvdmVycmlkZTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX0NYRkFfV0hJVEVTUEFDRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2lkZXRleHRyZWFkLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3dpZGV0ZXh0cmVhZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZmE2YjkuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2lkZXRleHRyZWFkLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV93aWRldGV4dHJlYWQuaCIKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvY3J0L2ZnYXNfY29kZXBhZ2UuaCIKLQotQ1hGQV9XaWRlVGV4dFJlYWQ6OkNYRkFfV2lkZVRleHRSZWFkKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0J1ZmZlcikKLSAgICA6IG1fd3NCdWZmZXIod3NCdWZmZXIpLCBtX2lQb3NpdGlvbigwKSB7fQotCi1DWEZBX1dpZGVUZXh0UmVhZDo6fkNYRkFfV2lkZVRleHRSZWFkKCkge30KLQotdWludDMyX3QgQ1hGQV9XaWRlVGV4dFJlYWQ6OkdldEFjY2Vzc01vZGVzKCkgY29uc3QgewotICByZXR1cm4gRlhfU1RSRUFNQUNDRVNTX1JlYWQgfCBGWF9TVFJFQU1BQ0NFU1NfVGV4dDsKLX0KLQotaW50MzJfdCBDWEZBX1dpZGVUZXh0UmVhZDo6R2V0TGVuZ3RoKCkgY29uc3QgewotICByZXR1cm4gbV93c0J1ZmZlci5HZXRMZW5ndGgoKSAqIHNpemVvZihGWF9XQ0hBUik7Ci19Ci0KLWludDMyX3QgQ1hGQV9XaWRlVGV4dFJlYWQ6OlNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KSB7Ci0gIHN3aXRjaCAoZVNlZWspIHsKLSAgICBjYXNlIEZYX1NUUkVBTVNFRUtfQmVnaW46Ci0gICAgICBtX2lQb3NpdGlvbiA9IGlPZmZzZXQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYX1NUUkVBTVNFRUtfQ3VycmVudDoKLSAgICAgIG1faVBvc2l0aW9uICs9IGlPZmZzZXQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYX1NUUkVBTVNFRUtfRW5kOgotICAgICAgbV9pUG9zaXRpb24gPSBtX3dzQnVmZmVyLkdldExlbmd0aCgpICsgaU9mZnNldDsKLSAgICAgIGJyZWFrOwotICB9Ci0gIG1faVBvc2l0aW9uID0gc3RkOjptaW4oc3RkOjptYXgoMCwgbV9pUG9zaXRpb24pLCBtX3dzQnVmZmVyLkdldExlbmd0aCgpKTsKLSAgcmV0dXJuIEdldFBvc2l0aW9uKCk7Ci19Ci0KLWludDMyX3QgQ1hGQV9XaWRlVGV4dFJlYWQ6OkdldFBvc2l0aW9uKCkgewotICByZXR1cm4gbV9pUG9zaXRpb24gKiBzaXplb2YoRlhfV0NIQVIpOwotfQotCi1ib29sIENYRkFfV2lkZVRleHRSZWFkOjpJc0VPRigpIGNvbnN0IHsKLSAgcmV0dXJuIG1faVBvc2l0aW9uID49IG1fd3NCdWZmZXIuR2V0TGVuZ3RoKCk7Ci19Ci0KLWludDMyX3QgQ1hGQV9XaWRlVGV4dFJlYWQ6OlJlYWREYXRhKHVpbnQ4X3QqIHBCdWZmZXIsIGludDMyX3QgaUJ1ZmZlclNpemUpIHsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludDMyX3QgQ1hGQV9XaWRlVGV4dFJlYWQ6OlJlYWRTdHJpbmcoRlhfV0NIQVIqIHBTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaU1heExlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYkVPUykgewotICBpTWF4TGVuZ3RoID0gc3RkOjptaW4oaU1heExlbmd0aCwgbV93c0J1ZmZlci5HZXRMZW5ndGgoKSAtIG1faVBvc2l0aW9uKTsKLSAgaWYgKGlNYXhMZW5ndGggPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBGWFNZU193Y3NuY3B5KHBTdHIsIG1fd3NCdWZmZXIuY19zdHIoKSArIG1faVBvc2l0aW9uLCBpTWF4TGVuZ3RoKTsKLSAgbV9pUG9zaXRpb24gKz0gaU1heExlbmd0aDsKLSAgYkVPUyA9IElzRU9GKCk7Ci0gIHJldHVybiBpTWF4TGVuZ3RoOwotfQotCi1pbnQzMl90IENYRkFfV2lkZVRleHRSZWFkOjpXcml0ZURhdGEoY29uc3QgdWludDhfdCogcEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlCdWZmZXJTaXplKSB7Ci0gIHJldHVybiAwOwotfQotCi1pbnQzMl90IENYRkFfV2lkZVRleHRSZWFkOjpXcml0ZVN0cmluZyhjb25zdCBGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTGVuZ3RoKSB7Ci0gIHJldHVybiAwOwotfQotCi1ib29sIENYRkFfV2lkZVRleHRSZWFkOjpTZXRMZW5ndGgoaW50MzJfdCBpTGVuZ3RoKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotaW50MzJfdCBDWEZBX1dpZGVUZXh0UmVhZDo6R2V0Qk9NKHVpbnQ4X3QgYm9tWzRdKSBjb25zdCB7Ci0gIHJldHVybiAwOwotfQotCi11aW50MTZfdCBDWEZBX1dpZGVUZXh0UmVhZDo6R2V0Q29kZVBhZ2UoKSBjb25zdCB7Ci0gIHJldHVybiAoc2l6ZW9mKEZYX1dDSEFSKSA9PSAyKSA/IEZYX0NPREVQQUdFX1VURjE2TEUgOiBGWF9DT0RFUEFHRV9VVEYzMkxFOwotfQotCi11aW50MTZfdCBDWEZBX1dpZGVUZXh0UmVhZDo6U2V0Q29kZVBhZ2UodWludDE2X3Qgd0NvZGVQYWdlKSB7Ci0gIHJldHVybiBHZXRDb2RlUGFnZSgpOwotfQotCi1DRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4gQ1hGQV9XaWRlVGV4dFJlYWQ6OkNyZWF0ZVNoYXJlZFN0cmVhbSgKLSAgICB1aW50MzJfdCBkd0FjY2VzcywKLSAgICBpbnQzMl90IGlPZmZzZXQsCi0gICAgaW50MzJfdCBpTGVuZ3RoKSB7Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1DRlhfV2lkZVN0cmluZyBDWEZBX1dpZGVUZXh0UmVhZDo6R2V0U3JjVGV4dCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fd3NCdWZmZXI7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV93aWRldGV4dHJlYWQuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3dpZGV0ZXh0cmVhZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2NiMDQyLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3dpZGV0ZXh0cmVhZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1dJREVURVhUUkVBRF9IXwotI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9XSURFVEVYVFJFQURfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3JldGFpbl9wdHIuaCIKLSNpbmNsdWRlICJ4ZmEvZmdhcy9jcnQvZmdhc19zdHJlYW0uaCIKLQotY2xhc3MgQ1hGQV9XaWRlVGV4dFJlYWQgOiBwdWJsaWMgSUZHQVNfU3RyZWFtIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBBcmdzPgotICBmcmllbmQgQ0ZYX1JldGFpblB0cjxUPiBwZGZpdW06Ok1ha2VSZXRhaW4oQXJncyYmLi4uIGFyZ3MpOwotCi0gIC8vIElGR0FTX1N0cmVhbQotICB1aW50MzJfdCBHZXRBY2Nlc3NNb2RlcygpIGNvbnN0IG92ZXJyaWRlOwotICBpbnQzMl90IEdldExlbmd0aCgpIGNvbnN0IG92ZXJyaWRlOwotICBpbnQzMl90IFNlZWsoRlhfU1RSRUFNU0VFSyBlU2VlaywgaW50MzJfdCBpT2Zmc2V0KSBvdmVycmlkZTsKLSAgaW50MzJfdCBHZXRQb3NpdGlvbigpIG92ZXJyaWRlOwotICBib29sIElzRU9GKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIGludDMyX3QgUmVhZERhdGEodWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkgb3ZlcnJpZGU7Ci0gIGludDMyX3QgUmVhZFN0cmluZyhGWF9XQ0hBUiogcFN0ciwgaW50MzJfdCBpTWF4TGVuZ3RoLCBib29sJiBiRU9TKSBvdmVycmlkZTsKLSAgaW50MzJfdCBXcml0ZURhdGEoY29uc3QgdWludDhfdCogcEJ1ZmZlciwgaW50MzJfdCBpQnVmZmVyU2l6ZSkgb3ZlcnJpZGU7Ci0gIGludDMyX3QgV3JpdGVTdHJpbmcoY29uc3QgRlhfV0NIQVIqIHBTdHIsIGludDMyX3QgaUxlbmd0aCkgb3ZlcnJpZGU7Ci0gIHZvaWQgRmx1c2goKSBvdmVycmlkZSB7fQotICBib29sIFNldExlbmd0aChpbnQzMl90IGlMZW5ndGgpIG92ZXJyaWRlOwotICBpbnQzMl90IEdldEJPTSh1aW50OF90IGJvbVs0XSkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHVpbnQxNl90IEdldENvZGVQYWdlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHVpbnQxNl90IFNldENvZGVQYWdlKHVpbnQxNl90IHdDb2RlUGFnZSkgb3ZlcnJpZGU7Ci0gIENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiBDcmVhdGVTaGFyZWRTdHJlYW0odWludDMyX3QgZHdBY2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUxlbmd0aCkgb3ZlcnJpZGU7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0U3JjVGV4dCgpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgotICBleHBsaWNpdCBDWEZBX1dpZGVUZXh0UmVhZChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NCdWZmZXIpOwotICB+Q1hGQV9XaWRlVGV4dFJlYWQoKSBvdmVycmlkZTsKLQotICBDRlhfV2lkZVN0cmluZyBtX3dzQnVmZmVyOwotICBpbnQzMl90IG1faVBvc2l0aW9uOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9XSURFVEVYVFJFQURfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3dpZGdldGRhdGEuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2lkZ2V0ZGF0YS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNTMzYzIuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2lkZ2V0ZGF0YS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQ2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3dpZGdldGRhdGEuaCIKLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgotI2luY2x1ZGUgInhmYS9meGJhcmNvZGUvQkNfTGlicmFyeS5oIgotI2luY2x1ZGUgInhmYS9meGZhL2FwcC94ZmFfZmZub3RpZnkuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2V2ZW50LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVhc3VyZW1lbnQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX2xvY2FsZXZhbHVlLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKLQotbmFtZXNwYWNlIHsKLQotRlhfRkxPQVQgR2V0RWRnZVRoaWNrbmVzcyhjb25zdCBzdGQ6OnZlY3RvcjxDWEZBX1N0cm9rZT4mIHN0cm9rZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYjNEU3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4KSB7Ci0gIEZYX0ZMT0FUIGZUaGlja25lc3MgPSAwOwotCi0gIGlmIChzdHJva2VzW25JbmRleCAqIDIgKyAxXS5HZXRQcmVzZW5jZSgpID09IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUpIHsKLSAgICBpZiAobkluZGV4ID09IDApCi0gICAgICBmVGhpY2tuZXNzICs9IDIuNWY7Ci0KLSAgICBmVGhpY2tuZXNzICs9IHN0cm9rZXNbbkluZGV4ICogMiArIDFdLkdldFRoaWNrbmVzcygpICogKGIzRFN0eWxlID8gNCA6IDIpOwotICB9Ci0gIHJldHVybiBmVGhpY2tuZXNzOwotfQotCi1ib29sIFNwbGl0RGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZVRpbWUsCi0gICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZSwKLSAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NUaW1lKSB7Ci0gIHdzRGF0ZSA9IEwiIjsKLSAgd3NUaW1lID0gTCIiOwotICBpZiAod3NEYXRlVGltZS5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGludCBuU3BsaXRJbmRleCA9IC0xOwotICBuU3BsaXRJbmRleCA9IHdzRGF0ZVRpbWUuRmluZCgnVCcpOwotICBpZiAoblNwbGl0SW5kZXggPCAwKQotICAgIG5TcGxpdEluZGV4ID0gd3NEYXRlVGltZS5GaW5kKCcgJyk7Ci0gIGlmIChuU3BsaXRJbmRleCA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHdzRGF0ZSA9IHdzRGF0ZVRpbWUuTGVmdChuU3BsaXRJbmRleCk7Ci0gIGlmICghd3NEYXRlLklzRW1wdHkoKSkgewotICAgIGludDMyX3QgaUNvdW50ID0gd3NEYXRlLkdldExlbmd0aCgpOwotICAgIGludDMyX3QgaSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7Ci0gICAgICBpZiAod3NEYXRlW2ldID49ICcwJyAmJiB3c0RhdGVbaV0gPD0gJzknKQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGkgPT0gaUNvdW50KQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHdzVGltZSA9IHdzRGF0ZVRpbWUuUmlnaHQod3NEYXRlVGltZS5HZXRMZW5ndGgoKSAtIG5TcGxpdEluZGV4IC0gMSk7Ci0gIGlmICghd3NUaW1lLklzRW1wdHkoKSkgewotICAgIGludDMyX3QgaUNvdW50ID0gd3NUaW1lLkdldExlbmd0aCgpOwotICAgIGludDMyX3QgaSA9IDA7Ci0gICAgZm9yIChpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7Ci0gICAgICBpZiAod3NUaW1lW2ldID49ICcwJyAmJiB3c1RpbWVbaV0gPD0gJzknKQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgaWYgKGkgPT0gaUNvdW50KQotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1DWEZBX05vZGUqIENyZWF0ZVVJQ2hpbGQoQ1hGQV9Ob2RlKiBwTm9kZSwgWEZBX0VsZW1lbnQmIGVXaWRnZXRUeXBlKSB7Ci0gIFhGQV9FbGVtZW50IGVUeXBlID0gcE5vZGUtPkdldEVsZW1lbnRUeXBlKCk7Ci0gIGVXaWRnZXRUeXBlID0gZVR5cGU7Ci0gIGlmIChlVHlwZSAhPSBYRkFfRWxlbWVudDo6RmllbGQgJiYgZVR5cGUgIT0gWEZBX0VsZW1lbnQ6OkRyYXcpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgZVdpZGdldFR5cGUgPSBYRkFfRWxlbWVudDo6VW5rbm93bjsKLSAgWEZBX0VsZW1lbnQgZVVJVHlwZSA9IFhGQV9FbGVtZW50OjpVbmtub3duOwotICBDWEZBX1ZhbHVlIGRlZlZhbHVlKHBOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRWxlbWVudDo6VmFsdWUsIHRydWUpKTsKLSAgWEZBX0VsZW1lbnQgZVZhbHVlVHlwZSA9IGRlZlZhbHVlLkdldENoaWxkVmFsdWVDbGFzc0lEKCk7Ci0gIHN3aXRjaCAoZVZhbHVlVHlwZSkgewotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJvb2xlYW46Ci0gICAgICBlVUlUeXBlID0gWEZBX0VsZW1lbnQ6OkNoZWNrQnV0dG9uOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6SW50ZWdlcjoKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpEZWNpbWFsOgotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkZsb2F0OgotICAgICAgZVVJVHlwZSA9IFhGQV9FbGVtZW50OjpOdW1lcmljRWRpdDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkV4RGF0YToKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpUZXh0OgotICAgICAgZVVJVHlwZSA9IFhGQV9FbGVtZW50OjpUZXh0RWRpdDsKLSAgICAgIGVXaWRnZXRUeXBlID0gWEZBX0VsZW1lbnQ6OlRleHQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpEYXRlOgotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRpbWU6Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6RGF0ZVRpbWU6Ci0gICAgICBlVUlUeXBlID0gWEZBX0VsZW1lbnQ6OkRhdGVUaW1lRWRpdDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkltYWdlOgotICAgICAgZVVJVHlwZSA9IFhGQV9FbGVtZW50OjpJbWFnZUVkaXQ7Ci0gICAgICBlV2lkZ2V0VHlwZSA9IFhGQV9FbGVtZW50OjpJbWFnZTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkFyYzoKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpMaW5lOgotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlJlY3RhbmdsZToKLSAgICAgIGVVSVR5cGUgPSBYRkFfRWxlbWVudDo6RGVmYXVsdFVpOwotICAgICAgZVdpZGdldFR5cGUgPSBlVmFsdWVUeXBlOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IG51bGxwdHI7Ci0gIENYRkFfTm9kZSogcFVJID0gcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FbGVtZW50OjpVaSwgdHJ1ZSk7Ci0gIENYRkFfTm9kZSogcENoaWxkID0gcFVJLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gIGZvciAoOyBwQ2hpbGQ7IHBDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgewotICAgIFhGQV9FbGVtZW50IGVDaGlsZFR5cGUgPSBwQ2hpbGQtPkdldEVsZW1lbnRUeXBlKCk7Ci0gICAgaWYgKGVDaGlsZFR5cGUgPT0gWEZBX0VsZW1lbnQ6OkV4dHJhcyB8fAotICAgICAgICBlQ2hpbGRUeXBlID09IFhGQV9FbGVtZW50OjpQaWN0dXJlKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgY29uc3QgWEZBX1BST1BFUlRZKiBwUHJvcGVydHkgPSBYRkFfR2V0UHJvcGVydHlPZkVsZW1lbnQoCi0gICAgICAgIFhGQV9FbGVtZW50OjpVaSwgZUNoaWxkVHlwZSwgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsKLSAgICBpZiAocFByb3BlcnR5ICYmIChwUHJvcGVydHktPnVGbGFncyAmIFhGQV9QUk9QRVJUWUZMQUdfT25lT2YpKSB7Ci0gICAgICBwVUlDaGlsZCA9IHBDaGlsZDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGlmIChlVHlwZSA9PSBYRkFfRWxlbWVudDo6RHJhdykgewotICAgIFhGQV9FbGVtZW50IGVEcmF3ID0KLSAgICAgICAgcFVJQ2hpbGQgPyBwVUlDaGlsZC0+R2V0RWxlbWVudFR5cGUoKSA6IFhGQV9FbGVtZW50OjpVbmtub3duOwotICAgIHN3aXRjaCAoZURyYXcpIHsKLSAgICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRleHRFZGl0OgotICAgICAgICBlV2lkZ2V0VHlwZSA9IFhGQV9FbGVtZW50OjpUZXh0OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkltYWdlRWRpdDoKLSAgICAgICAgZVdpZGdldFR5cGUgPSBYRkFfRWxlbWVudDo6SW1hZ2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgZVdpZGdldFR5cGUgPSBlV2lkZ2V0VHlwZSA9PSBYRkFfRWxlbWVudDo6VW5rbm93biA/IFhGQV9FbGVtZW50OjpUZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBlV2lkZ2V0VHlwZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChwVUlDaGlsZCAmJiBwVUlDaGlsZC0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6RGVmYXVsdFVpKSB7Ci0gICAgICBlV2lkZ2V0VHlwZSA9IFhGQV9FbGVtZW50OjpUZXh0RWRpdDsKLSAgICB9IGVsc2UgewotICAgICAgZVdpZGdldFR5cGUgPQotICAgICAgICAgIHBVSUNoaWxkID8gcFVJQ2hpbGQtPkdldEVsZW1lbnRUeXBlKCkKLSAgICAgICAgICAgICAgICAgICA6IChlVUlUeXBlID09IFhGQV9FbGVtZW50OjpVbmtub3duID8gWEZBX0VsZW1lbnQ6OlRleHRFZGl0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGVVSVR5cGUpOwotICAgIH0KLSAgfQotCi0gIGlmICghcFVJQ2hpbGQpIHsKLSAgICBpZiAoZVVJVHlwZSA9PSBYRkFfRWxlbWVudDo6VW5rbm93bikgewotICAgICAgZVVJVHlwZSA9IFhGQV9FbGVtZW50OjpUZXh0RWRpdDsKLSAgICAgIGRlZlZhbHVlLkdldE5vZGUoKS0+R2V0UHJvcGVydHkoMCwgWEZBX0VsZW1lbnQ6OlRleHQsIHRydWUpOwotICAgIH0KLSAgICByZXR1cm4gcFVJLT5HZXRQcm9wZXJ0eSgwLCBlVUlUeXBlLCB0cnVlKTsKLSAgfQotCi0gIGlmIChlVUlUeXBlICE9IFhGQV9FbGVtZW50OjpVbmtub3duKQotICAgIHJldHVybiBwVUlDaGlsZDsKLQotICBzd2l0Y2ggKHBVSUNoaWxkLT5HZXRFbGVtZW50VHlwZSgpKSB7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6Q2hlY2tCdXR0b246IHsKLSAgICAgIGVWYWx1ZVR5cGUgPSBYRkFfRWxlbWVudDo6VGV4dDsKLSAgICAgIGlmIChDWEZBX05vZGUqIHBJdGVtcyA9IHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6SXRlbXMpKSB7Ci0gICAgICAgIGlmIChDWEZBX05vZGUqIHBJdGVtID0gcEl0ZW1zLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6VW5rbm93bikpCi0gICAgICAgICAgZVZhbHVlVHlwZSA9IHBJdGVtLT5HZXRFbGVtZW50VHlwZSgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRhdGVUaW1lRWRpdDoKLSAgICAgIGVWYWx1ZVR5cGUgPSBYRkFfRWxlbWVudDo6RGF0ZVRpbWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpJbWFnZUVkaXQ6Ci0gICAgICBlVmFsdWVUeXBlID0gWEZBX0VsZW1lbnQ6OkltYWdlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6TnVtZXJpY0VkaXQ6Ci0gICAgICBlVmFsdWVUeXBlID0gWEZBX0VsZW1lbnQ6OkZsb2F0OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6Q2hvaWNlTGlzdDogewotICAgICAgZVZhbHVlVHlwZSA9IChwVUlDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX09wZW4pID09Ci0gICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0KQotICAgICAgICAgICAgICAgICAgICAgICA/IFhGQV9FbGVtZW50OjpFeERhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgOiBYRkFfRWxlbWVudDo6VGV4dDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFhGQV9FbGVtZW50OjpCYXJjb2RlOgotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkJ1dHRvbjoKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpQYXNzd29yZEVkaXQ6Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6U2lnbmF0dXJlOgotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRleHRFZGl0OgotICAgIGRlZmF1bHQ6Ci0gICAgICBlVmFsdWVUeXBlID0gWEZBX0VsZW1lbnQ6OlRleHQ7Ci0gICAgICBicmVhazsKLSAgfQotICBkZWZWYWx1ZS5HZXROb2RlKCktPkdldFByb3BlcnR5KDAsIGVWYWx1ZVR5cGUsIHRydWUpOwotCi0gIHJldHVybiBwVUlDaGlsZDsKLX0KLQotWEZBX0FUVFJJQlVURUVOVU0gR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0VudW0oWEZBX0VsZW1lbnQgZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1BhY2tldCkgewotICB2b2lkKiBwVmFsdWU7Ci0gIGlmIChYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlKHBWYWx1ZSwgZUVsZW1lbnQsIGVBdHRyaWJ1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIGR3UGFja2V0KSkgewotICAgIHJldHVybiAoWEZBX0FUVFJJQlVURUVOVU0pKHVpbnRwdHJfdClwVmFsdWU7Ci0gIH0KLSAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd247Ci19Ci0KLUNGWF9XaWRlU3RyaW5nQyBHZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfQ2RhdGEoWEZBX0VsZW1lbnQgZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdQYWNrZXQpIHsKLSAgdm9pZCogcFZhbHVlOwotICBpZiAoWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZShwVmFsdWUsIGVFbGVtZW50LCBlQXR0cmlidXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgZHdQYWNrZXQpKSB7Ci0gICAgcmV0dXJuIChjb25zdCBGWF9XQ0hBUiopcFZhbHVlOwotICB9Ci0gIHJldHVybiBudWxscHRyOwotfQotCi1ib29sIEdldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9Cb29sZWFuKFhGQV9FbGVtZW50IGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3UGFja2V0KSB7Ci0gIHZvaWQqIHBWYWx1ZTsKLSAgaWYgKFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWUocFZhbHVlLCBlRWxlbWVudCwgZUF0dHJpYnV0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgZHdQYWNrZXQpKSB7Ci0gICAgcmV0dXJuICEhcFZhbHVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLUNYRkFfV2lkZ2V0RGF0YTo6Q1hGQV9XaWRnZXREYXRhKENYRkFfTm9kZSogcE5vZGUpCi0gICAgOiBDWEZBX0RhdGEocE5vZGUpLAotICAgICAgbV9iSXNOdWxsKHRydWUpLAotICAgICAgbV9iUHJlTnVsbCh0cnVlKSwKLSAgICAgIG1fcFVpQ2hpbGROb2RlKG51bGxwdHIpLAotICAgICAgbV9lVUlUeXBlKFhGQV9FbGVtZW50OjpVbmtub3duKSB7fQotCi1DWEZBX05vZGUqIENYRkFfV2lkZ2V0RGF0YTo6R2V0VUlDaGlsZCgpIHsKLSAgaWYgKG1fZVVJVHlwZSA9PSBYRkFfRWxlbWVudDo6VW5rbm93bikKLSAgICBtX3BVaUNoaWxkTm9kZSA9IENyZWF0ZVVJQ2hpbGQobV9wTm9kZSwgbV9lVUlUeXBlKTsKLQotICByZXR1cm4gbV9wVWlDaGlsZE5vZGU7Ci19Ci0KLVhGQV9FbGVtZW50IENYRkFfV2lkZ2V0RGF0YTo6R2V0VUlUeXBlKCkgewotICBHZXRVSUNoaWxkKCk7Ci0gIHJldHVybiBtX2VVSVR5cGU7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENYRkFfV2lkZ2V0RGF0YTo6R2V0UmF3VmFsdWUoKSB7Ci0gIHJldHVybiBtX3BOb2RlLT5HZXRDb250ZW50KCk7Ci19Ci0KLWludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRBY2Nlc3MoYm9vbCBiVGVtcGxhdGUpIHsKLSAgaWYgKGJUZW1wbGF0ZSkgewotICAgIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRUZW1wbGF0ZU5vZGUoKTsKLSAgICBpZiAocE5vZGUpCi0gICAgICByZXR1cm4gcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9BY2Nlc3MpOwotICAgIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9PcGVuOwotICB9Ci0gIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlOwotICB3aGlsZSAocE5vZGUpIHsKLSAgICBpbnQzMl90IGlBY2MgPSBwTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0FjY2Vzcyk7Ci0gICAgaWYgKGlBY2MgIT0gWEZBX0FUVFJJQlVURUVOVU1fT3BlbikKLSAgICAgIHJldHVybiBpQWNjOwotCi0gICAgcE5vZGUgPQotICAgICAgICBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCwgWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGUpOwotICB9Ci0gIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9PcGVuOwotfQotCi1pbnQzMl90IENYRkFfV2lkZ2V0RGF0YTo6R2V0Um90YXRlKCkgewotICBDWEZBX01lYXN1cmVtZW50IG1zOwotICBpZiAoIW1fcE5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9Sb3RhdGUsIG1zLCBmYWxzZSkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaW50MzJfdCBpUm90YXRlID0gRlhTWVNfcm91bmQobXMuR2V0VmFsdWUoKSk7Ci0gIGlSb3RhdGUgPSBYRkFfTWFwUm90YXRpb24oaVJvdGF0ZSk7Ci0gIHJldHVybiBpUm90YXRlIC8gOTAgKiA5MDsKLX0KLQotQ1hGQV9Cb3JkZXIgQ1hGQV9XaWRnZXREYXRhOjpHZXRCb3JkZXIoYm9vbCBiTW9kaWZpZWQpIHsKLSAgcmV0dXJuIENYRkFfQm9yZGVyKG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FbGVtZW50OjpCb3JkZXIsIGJNb2RpZmllZCkpOwotfQotCi1DWEZBX0NhcHRpb24gQ1hGQV9XaWRnZXREYXRhOjpHZXRDYXB0aW9uKGJvb2wgYk1vZGlmaWVkKSB7Ci0gIHJldHVybiBDWEZBX0NhcHRpb24obV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VsZW1lbnQ6OkNhcHRpb24sIGJNb2RpZmllZCkpOwotfQotCi1DWEZBX0ZvbnQgQ1hGQV9XaWRnZXREYXRhOjpHZXRGb250KGJvb2wgYk1vZGlmaWVkKSB7Ci0gIHJldHVybiBDWEZBX0ZvbnQobV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VsZW1lbnQ6OkZvbnQsIGJNb2RpZmllZCkpOwotfQotCi1DWEZBX01hcmdpbiBDWEZBX1dpZGdldERhdGE6OkdldE1hcmdpbihib29sIGJNb2RpZmllZCkgewotICByZXR1cm4gQ1hGQV9NYXJnaW4obV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VsZW1lbnQ6Ok1hcmdpbiwgYk1vZGlmaWVkKSk7Ci19Ci0KLUNYRkFfUGFyYSBDWEZBX1dpZGdldERhdGE6OkdldFBhcmEoYm9vbCBiTW9kaWZpZWQpIHsKLSAgcmV0dXJuIENYRkFfUGFyYShtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRWxlbWVudDo6UGFyYSwgYk1vZGlmaWVkKSk7Ci19Ci0KLXZvaWQgQ1hGQV9XaWRnZXREYXRhOjpHZXRFdmVudExpc3QoQ1hGQV9Ob2RlQXJyYXkmIGV2ZW50cykgewotICBtX3BOb2RlLT5HZXROb2RlTGlzdChldmVudHMsIDAsIFhGQV9FbGVtZW50OjpFdmVudCk7Ci19Ci0KLWludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRFdmVudEJ5QWN0aXZpdHkoaW50MzJfdCBpQWN0aXZpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZUFycmF5JiBldmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYklzRm9ybVJlYWR5KSB7Ci0gIENYRkFfTm9kZUFycmF5IGFsbEV2ZW50czsKLSAgR2V0RXZlbnRMaXN0KGFsbEV2ZW50cyk7Ci0gIGludDMyX3QgaUNvdW50ID0gYWxsRXZlbnRzLkdldFNpemUoKTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKLSAgICBDWEZBX0V2ZW50IGV2ZW50KGFsbEV2ZW50c1tpXSk7Ci0gICAgaWYgKGV2ZW50LkdldEFjdGl2aXR5KCkgPT0gaUFjdGl2aXR5KSB7Ci0gICAgICBpZiAoaUFjdGl2aXR5ID09IFhGQV9BVFRSSUJVVEVFTlVNX1JlYWR5KSB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c1JlZjsKLSAgICAgICAgZXZlbnQuR2V0UmVmKHdzUmVmKTsKLSAgICAgICAgaWYgKGJJc0Zvcm1SZWFkeSkgewotICAgICAgICAgIGlmICh3c1JlZiA9PSBDRlhfV2lkZVN0cmluZ0MoTCIkZm9ybSIpKQotICAgICAgICAgICAgZXZlbnRzLkFkZChhbGxFdmVudHNbaV0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmICh3c1JlZiA9PSBDRlhfV2lkZVN0cmluZ0MoTCIkbGF5b3V0IikpCi0gICAgICAgICAgICBldmVudHMuQWRkKGFsbEV2ZW50c1tpXSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGV2ZW50cy5BZGQoYWxsRXZlbnRzW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGV2ZW50cy5HZXRTaXplKCk7Ci19Ci0KLUNYRkFfVmFsdWUgQ1hGQV9XaWRnZXREYXRhOjpHZXREZWZhdWx0VmFsdWUoYm9vbCBiTW9kaWZpZWQpIHsKLSAgQ1hGQV9Ob2RlKiBwVGVtTm9kZSA9IG1fcE5vZGUtPkdldFRlbXBsYXRlTm9kZSgpOwotICByZXR1cm4gQ1hGQV9WYWx1ZSgKLSAgICAgIHBUZW1Ob2RlID8gcFRlbU5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FbGVtZW50OjpWYWx1ZSwgYk1vZGlmaWVkKQotICAgICAgICAgICAgICAgOiBudWxscHRyKTsKLX0KLQotQ1hGQV9WYWx1ZSBDWEZBX1dpZGdldERhdGE6OkdldEZvcm1WYWx1ZShib29sIGJNb2RpZmllZCkgewotICByZXR1cm4gQ1hGQV9WYWx1ZShtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRWxlbWVudDo6VmFsdWUsIGJNb2RpZmllZCkpOwotfQotCi1DWEZBX0NhbGN1bGF0ZSBDWEZBX1dpZGdldERhdGE6OkdldENhbGN1bGF0ZShib29sIGJNb2RpZmllZCkgewotICByZXR1cm4gQ1hGQV9DYWxjdWxhdGUoCi0gICAgICBtX3BOb2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRWxlbWVudDo6Q2FsY3VsYXRlLCBiTW9kaWZpZWQpKTsKLX0KLQotQ1hGQV9WYWxpZGF0ZSBDWEZBX1dpZGdldERhdGE6OkdldFZhbGlkYXRlKGJvb2wgYk1vZGlmaWVkKSB7Ci0gIHJldHVybiBDWEZBX1ZhbGlkYXRlKAotICAgICAgbV9wTm9kZS0+R2V0UHJvcGVydHkoMCwgWEZBX0VsZW1lbnQ6OlZhbGlkYXRlLCBiTW9kaWZpZWQpKTsKLX0KLQotQ1hGQV9CaW5kIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmluZChib29sIGJNb2RpZmllZCkgewotICByZXR1cm4gQ1hGQV9CaW5kKG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FbGVtZW50OjpCaW5kLCBiTW9kaWZpZWQpKTsKLX0KLQotQ1hGQV9Bc3Npc3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRBc3Npc3QoYm9vbCBiTW9kaWZpZWQpIHsKLSAgcmV0dXJuIENYRkFfQXNzaXN0KG1fcE5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FbGVtZW50OjpBc3Npc3QsIGJNb2RpZmllZCkpOwotfQotCi1ib29sIENYRkFfV2lkZ2V0RGF0YTo6R2V0V2lkdGgoRlhfRkxPQVQmIGZXaWR0aCkgewotICByZXR1cm4gVHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1csIGZXaWR0aCk7Ci19Ci0KLWJvb2wgQ1hGQV9XaWRnZXREYXRhOjpHZXRIZWlnaHQoRlhfRkxPQVQmIGZIZWlnaHQpIHsKLSAgcmV0dXJuIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9ILCBmSGVpZ2h0KTsKLX0KLQotYm9vbCBDWEZBX1dpZGdldERhdGE6OkdldE1pbldpZHRoKEZYX0ZMT0FUJiBmTWluV2lkdGgpIHsKLSAgcmV0dXJuIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9NaW5XLCBmTWluV2lkdGgpOwotfQotCi1ib29sIENYRkFfV2lkZ2V0RGF0YTo6R2V0TWluSGVpZ2h0KEZYX0ZMT0FUJiBmTWluSGVpZ2h0KSB7Ci0gIHJldHVybiBUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWluSCwgZk1pbkhlaWdodCk7Ci19Ci0KLWJvb2wgQ1hGQV9XaWRnZXREYXRhOjpHZXRNYXhXaWR0aChGWF9GTE9BVCYgZk1heFdpZHRoKSB7Ci0gIHJldHVybiBUcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTWF4VywgZk1heFdpZHRoKTsKLX0KLQotYm9vbCBDWEZBX1dpZGdldERhdGE6OkdldE1heEhlaWdodChGWF9GTE9BVCYgZk1heEhlaWdodCkgewotICByZXR1cm4gVHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX01heEgsIGZNYXhIZWlnaHQpOwotfQotCi1DWEZBX0JvcmRlciBDWEZBX1dpZGdldERhdGE6OkdldFVJQm9yZGVyKCkgewotICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOwotICByZXR1cm4gQ1hGQV9Cb3JkZXIocFVJQ2hpbGQKLSAgICAgICAgICAgICAgICAgICAgICAgICA/IHBVSUNoaWxkLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRWxlbWVudDo6Qm9yZGVyLCBmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHIpOwotfQotCi1DRlhfUmVjdEYgQ1hGQV9XaWRnZXREYXRhOjpHZXRVSU1hcmdpbigpIHsKLSAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsKLSAgQ1hGQV9NYXJnaW4gbWdVSSA9IENYRkFfTWFyZ2luKAotICAgICAgcFVJQ2hpbGQgPyBwVUlDaGlsZC0+R2V0UHJvcGVydHkoMCwgWEZBX0VsZW1lbnQ6Ok1hcmdpbiwgZmFsc2UpCi0gICAgICAgICAgICAgICA6IG51bGxwdHIpOwotCi0gIGlmICghbWdVSSkKLSAgICByZXR1cm4gQ0ZYX1JlY3RGKCk7Ci0KLSAgQ1hGQV9Cb3JkZXIgYm9yZGVyID0gR2V0VUlCb3JkZXIoKTsKLSAgaWYgKGJvcmRlciAmJiBib3JkZXIuR2V0UHJlc2VuY2UoKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9WaXNpYmxlKQotICAgIHJldHVybiBDRlhfUmVjdEYoKTsKLQotICBGWF9GTE9BVCBmTGVmdEluc2V0LCBmVG9wSW5zZXQsIGZSaWdodEluc2V0LCBmQm90dG9tSW5zZXQ7Ci0gIGJvb2wgYkxlZnQgPSBtZ1VJLkdldExlZnRJbnNldChmTGVmdEluc2V0KTsKLSAgYm9vbCBiVG9wID0gbWdVSS5HZXRUb3BJbnNldChmVG9wSW5zZXQpOwotICBib29sIGJSaWdodCA9IG1nVUkuR2V0UmlnaHRJbnNldChmUmlnaHRJbnNldCk7Ci0gIGJvb2wgYkJvdHRvbSA9IG1nVUkuR2V0Qm90dG9tSW5zZXQoZkJvdHRvbUluc2V0KTsKLSAgaWYgKGJvcmRlcikgewotICAgIGJvb2wgYlZpc2libGUgPSBmYWxzZTsKLSAgICBGWF9GTE9BVCBmVGhpY2tuZXNzID0gMDsKLSAgICBib3JkZXIuR2V0M0RTdHlsZShiVmlzaWJsZSwgZlRoaWNrbmVzcyk7Ci0gICAgaWYgKCFiTGVmdCB8fCAhYlRvcCB8fCAhYlJpZ2h0IHx8ICFiQm90dG9tKSB7Ci0gICAgICBzdGQ6OnZlY3RvcjxDWEZBX1N0cm9rZT4gc3Ryb2tlczsKLSAgICAgIGJvcmRlci5HZXRTdHJva2VzKCZzdHJva2VzKTsKLSAgICAgIGlmICghYlRvcCkKLSAgICAgICAgZlRvcEluc2V0ID0gR2V0RWRnZVRoaWNrbmVzcyhzdHJva2VzLCBiVmlzaWJsZSwgMCk7Ci0gICAgICBpZiAoIWJSaWdodCkKLSAgICAgICAgZlJpZ2h0SW5zZXQgPSBHZXRFZGdlVGhpY2tuZXNzKHN0cm9rZXMsIGJWaXNpYmxlLCAxKTsKLSAgICAgIGlmICghYkJvdHRvbSkKLSAgICAgICAgZkJvdHRvbUluc2V0ID0gR2V0RWRnZVRoaWNrbmVzcyhzdHJva2VzLCBiVmlzaWJsZSwgMik7Ci0gICAgICBpZiAoIWJMZWZ0KQotICAgICAgICBmTGVmdEluc2V0ID0gR2V0RWRnZVRoaWNrbmVzcyhzdHJva2VzLCBiVmlzaWJsZSwgMyk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBDRlhfUmVjdEYoZkxlZnRJbnNldCwgZlRvcEluc2V0LCBmUmlnaHRJbnNldCwgZkJvdHRvbUluc2V0KTsKLX0KLQotaW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkdldEJ1dHRvbkhpZ2hsaWdodCgpIHsKLSAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsKLSAgaWYgKHBVSUNoaWxkKQotICAgIHJldHVybiBwVUlDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX0hpZ2hsaWdodCk7Ci0gIHJldHVybiBHZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfRW51bSgKLSAgICAgIFhGQV9FbGVtZW50OjpCdXR0b24sIFhGQV9BVFRSSUJVVEVfSGlnaGxpZ2h0LCBYRkFfWERQUEFDS0VUX0Zvcm0pOwotfQotCi1ib29sIENYRkFfV2lkZ2V0RGF0YTo6R2V0QnV0dG9uUm9sbG92ZXIoQ0ZYX1dpZGVTdHJpbmcmIHdzUm9sbG92ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYlJpY2hUZXh0KSB7Ci0gIGlmIChDWEZBX05vZGUqIHBJdGVtcyA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpJdGVtcykpIHsKLSAgICBDWEZBX05vZGUqIHBUZXh0ID0gcEl0ZW1zLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gICAgd2hpbGUgKHBUZXh0KSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NOYW1lOwotICAgICAgcFRleHQtPlRyeUNEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lKTsKLSAgICAgIGlmICh3c05hbWUgPT0gTCJyb2xsb3ZlciIpIHsKLSAgICAgICAgcFRleHQtPlRyeUNvbnRlbnQod3NSb2xsb3Zlcik7Ci0gICAgICAgIGJSaWNoVGV4dCA9IHBUZXh0LT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpFeERhdGE7Ci0gICAgICAgIHJldHVybiAhd3NSb2xsb3Zlci5Jc0VtcHR5KCk7Ci0gICAgICB9Ci0gICAgICBwVGV4dCA9IHBUZXh0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1hGQV9XaWRnZXREYXRhOjpHZXRCdXR0b25Eb3duKENGWF9XaWRlU3RyaW5nJiB3c0Rvd24sIGJvb2wmIGJSaWNoVGV4dCkgewotICBpZiAoQ1hGQV9Ob2RlKiBwSXRlbXMgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6SXRlbXMpKSB7Ci0gICAgQ1hGQV9Ob2RlKiBwVGV4dCA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgIHdoaWxlIChwVGV4dCkgewotICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZTsKLSAgICAgIHBUZXh0LT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7Ci0gICAgICBpZiAod3NOYW1lID09IEwiZG93biIpIHsKLSAgICAgICAgcFRleHQtPlRyeUNvbnRlbnQod3NEb3duKTsKLSAgICAgICAgYlJpY2hUZXh0ID0gcFRleHQtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkV4RGF0YTsKLSAgICAgICAgcmV0dXJuICF3c0Rvd24uSXNFbXB0eSgpOwotICAgICAgfQotICAgICAgcFRleHQgPSBwVGV4dC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1pbnQzMl90IENYRkFfV2lkZ2V0RGF0YTo6R2V0Q2hlY2tCdXR0b25TaGFwZSgpIHsKLSAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsKLSAgaWYgKHBVSUNoaWxkKQotICAgIHJldHVybiBwVUlDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX1NoYXBlKTsKLSAgcmV0dXJuIEdldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9FbnVtKFhGQV9FbGVtZW50OjpDaGVja0J1dHRvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVfU2hhcGUsIFhGQV9YRFBQQUNLRVRfRm9ybSk7Ci19Ci0KLWludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRDaGVja0J1dHRvbk1hcmsoKSB7Ci0gIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7Ci0gIGlmIChwVUlDaGlsZCkKLSAgICByZXR1cm4gcFVJQ2hpbGQtPkdldEVudW0oWEZBX0FUVFJJQlVURV9NYXJrKTsKLSAgcmV0dXJuIEdldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9FbnVtKFhGQV9FbGVtZW50OjpDaGVja0J1dHRvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVfTWFyaywgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsKLX0KLQotYm9vbCBDWEZBX1dpZGdldERhdGE6OklzUmFkaW9CdXR0b24oKSB7Ci0gIGlmIChDWEZBX05vZGUqIHBQYXJlbnQgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSkKLSAgICByZXR1cm4gcFBhcmVudC0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6RXhjbEdyb3VwOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLUZYX0ZMT0FUIENYRkFfV2lkZ2V0RGF0YTo6R2V0Q2hlY2tCdXR0b25TaXplKCkgewotICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOwotICBpZiAocFVJQ2hpbGQpCi0gICAgcmV0dXJuIHBVSUNoaWxkLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfU2l6ZSkuVG9Vbml0KFhGQV9VTklUX1B0KTsKLSAgcmV0dXJuIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfTWVhc3VyZSgKLSAgICAgICAgICAgICBYRkFfRWxlbWVudDo6Q2hlY2tCdXR0b24sIFhGQV9BVFRSSUJVVEVfU2l6ZSwgWEZBX1hEUFBBQ0tFVF9Gb3JtKQotICAgICAgLlRvVW5pdChYRkFfVU5JVF9QdCk7Ci19Ci0KLWJvb2wgQ1hGQV9XaWRnZXREYXRhOjpJc0FsbG93TmV1dHJhbCgpIHsKLSAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsKLSAgaWYgKHBVSUNoaWxkKQotICAgIHJldHVybiBwVUlDaGlsZC0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX0FsbG93TmV1dHJhbCk7Ci0gIHJldHVybiBHZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfQm9vbGVhbigKLSAgICAgIFhGQV9FbGVtZW50OjpDaGVja0J1dHRvbiwgWEZBX0FUVFJJQlVURV9BbGxvd05ldXRyYWwsIFhGQV9YRFBQQUNLRVRfRm9ybSk7Ci19Ci0KLVhGQV9DSEVDS1NUQVRFIENYRkFfV2lkZ2V0RGF0YTo6R2V0Q2hlY2tTdGF0ZSgpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSA9IEdldFJhd1ZhbHVlKCk7Ci0gIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkKLSAgICByZXR1cm4gWEZBX0NIRUNLU1RBVEVfT2ZmOwotCi0gIGlmIChDWEZBX05vZGUqIHBJdGVtcyA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpJdGVtcykpIHsKLSAgICBDWEZBX05vZGUqIHBUZXh0ID0gcEl0ZW1zLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gICAgaW50MzJfdCBpID0gMDsKLSAgICB3aGlsZSAocFRleHQpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ29udGVudDsKLSAgICAgIGlmIChwVGV4dC0+VHJ5Q29udGVudCh3c0NvbnRlbnQpICYmICh3c0NvbnRlbnQgPT0gd3NWYWx1ZSkpCi0gICAgICAgIHJldHVybiAoWEZBX0NIRUNLU1RBVEUpaTsKLQotICAgICAgaSsrOwotICAgICAgcFRleHQgPSBwVGV4dC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIFhGQV9DSEVDS1NUQVRFX09mZjsKLX0KLQotdm9pZCBDWEZBX1dpZGdldERhdGE6OlNldENoZWNrU3RhdGUoWEZBX0NIRUNLU1RBVEUgZUNoZWNrU3RhdGUsIGJvb2wgYk5vdGlmeSkgewotICBDWEZBX1dpZGdldERhdGEgZXhjbEdyb3VwKEdldEV4Y2xHcm91cE5vZGUoKSk7Ci0gIGlmIChleGNsR3JvdXApIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOwotICAgIGlmIChlQ2hlY2tTdGF0ZSAhPSBYRkFfQ0hFQ0tTVEFURV9PZmYpIHsKLSAgICAgIGlmIChDWEZBX05vZGUqIHBJdGVtcyA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpJdGVtcykpIHsKLSAgICAgICAgQ1hGQV9Ob2RlKiBwVGV4dCA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgICBpZiAocFRleHQpCi0gICAgICAgICAgcFRleHQtPlRyeUNvbnRlbnQod3NWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIENYRkFfTm9kZSogcENoaWxkID0KLSAgICAgICAgZXhjbEdyb3VwLkdldE5vZGUoKS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgIGZvciAoOyBwQ2hpbGQ7IHBDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgewotICAgICAgaWYgKHBDaGlsZC0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6RmllbGQpCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBDWEZBX05vZGUqIHBJdGVtID0gcENoaWxkLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6SXRlbXMpOwotICAgICAgaWYgKCFwSXRlbSkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIENYRkFfTm9kZSogcEl0ZW1jaGlsZCA9IHBJdGVtLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gICAgICBpZiAoIXBJdGVtY2hpbGQpCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBDRlhfV2lkZVN0cmluZyB0ZXh0ID0gcEl0ZW1jaGlsZC0+R2V0Q29udGVudCgpOwotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGlsZFZhbHVlID0gdGV4dDsKLSAgICAgIGlmICh3c1ZhbHVlICE9IHRleHQpIHsKLSAgICAgICAgcEl0ZW1jaGlsZCA9IHBJdGVtY2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7Ci0gICAgICAgIGlmIChwSXRlbWNoaWxkKQotICAgICAgICAgIHdzQ2hpbGRWYWx1ZSA9IHBJdGVtY2hpbGQtPkdldENvbnRlbnQoKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIHdzQ2hpbGRWYWx1ZS5jbGVhcigpOwotICAgICAgfQotICAgICAgQ1hGQV9XaWRnZXREYXRhIGNoKHBDaGlsZCk7Ci0gICAgICBjaC5TeW5jVmFsdWUod3NDaGlsZFZhbHVlLCBiTm90aWZ5KTsKLSAgICB9Ci0gICAgZXhjbEdyb3VwLlN5bmNWYWx1ZSh3c1ZhbHVlLCBiTm90aWZ5KTsKLSAgfSBlbHNlIHsKLSAgICBDWEZBX05vZGUqIHBJdGVtcyA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpJdGVtcyk7Ci0gICAgaWYgKCFwSXRlbXMpCi0gICAgICByZXR1cm47Ci0KLSAgICBpbnQzMl90IGkgPSAtMTsKLSAgICBDWEZBX05vZGUqIHBUZXh0ID0gcEl0ZW1zLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50OwotICAgIHdoaWxlIChwVGV4dCkgewotICAgICAgaSsrOwotICAgICAgaWYgKGkgPT0gZUNoZWNrU3RhdGUpIHsKLSAgICAgICAgcFRleHQtPlRyeUNvbnRlbnQod3NDb250ZW50KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBwVGV4dCA9IHBUZXh0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOwotICAgIH0KLSAgICBTeW5jVmFsdWUod3NDb250ZW50LCBiTm90aWZ5KTsKLSAgfQotfQotCi1DWEZBX05vZGUqIENYRkFfV2lkZ2V0RGF0YTo6R2V0RXhjbEdyb3VwTm9kZSgpIHsKLSAgQ1hGQV9Ob2RlKiBwRXhjbCA9IFRvTm9kZShtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSk7Ci0gIGlmICghcEV4Y2wgfHwgcEV4Y2wtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OkV4Y2xHcm91cCkKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgcmV0dXJuIHBFeGNsOwotfQotCi1DWEZBX05vZGUqIENYRkFfV2lkZ2V0RGF0YTo6R2V0U2VsZWN0ZWRNZW1iZXIoKSB7Ci0gIENYRkFfTm9kZSogcFNlbGVjdGVkTWVtYmVyID0gbnVsbHB0cjsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NTdGF0ZSA9IEdldFJhd1ZhbHVlKCk7Ci0gIGlmICh3c1N0YXRlLklzRW1wdHkoKSkKLSAgICByZXR1cm4gcFNlbGVjdGVkTWVtYmVyOwotCi0gIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IFRvTm9kZShtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpOwotICAgICAgIHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7Ci0gICAgQ1hGQV9XaWRnZXREYXRhIHdpZGdldERhdGEocE5vZGUpOwotICAgIGlmICh3aWRnZXREYXRhLkdldENoZWNrU3RhdGUoKSA9PSBYRkFfQ0hFQ0tTVEFURV9PbikgewotICAgICAgcFNlbGVjdGVkTWVtYmVyID0gcE5vZGU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHBTZWxlY3RlZE1lbWJlcjsKLX0KLQotQ1hGQV9Ob2RlKiBDWEZBX1dpZGdldERhdGE6OlNldFNlbGVjdGVkTWVtYmVyKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk5vdGlmeSkgewotICB1aW50MzJfdCBuYW1lSGFzaCA9IEZYX0hhc2hDb2RlX0dldFcod3NOYW1lLCBmYWxzZSk7Ci0gIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IFRvTm9kZShtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkpOwotICAgICAgIHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7Ci0gICAgaWYgKHBOb2RlLT5HZXROYW1lSGFzaCgpID09IG5hbWVIYXNoKSB7Ci0gICAgICBDWEZBX1dpZGdldERhdGEgd2lkZ2V0RGF0YShwTm9kZSk7Ci0gICAgICB3aWRnZXREYXRhLlNldENoZWNrU3RhdGUoWEZBX0NIRUNLU1RBVEVfT24sIGJOb3RpZnkpOwotICAgICAgcmV0dXJuIHBOb2RlOwotICAgIH0KLSAgfQotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotdm9pZCBDWEZBX1dpZGdldERhdGE6OlNldFNlbGVjdGVkTWVtYmVyQnlWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk5vdGlmeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2NyaXB0TW9kaWZ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTeW5jRGF0YSkgewotICBDRlhfV2lkZVN0cmluZyB3c0V4Y2xHcm91cDsKLSAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOyBwTm9kZTsKLSAgICAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7Ci0gICAgaWYgKHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpGaWVsZCkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgQ1hGQV9Ob2RlKiBwSXRlbSA9IHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6SXRlbXMpOwotICAgIGlmICghcEl0ZW0pCi0gICAgICBjb250aW51ZTsKLQotICAgIENYRkFfTm9kZSogcEl0ZW1jaGlsZCA9IHBJdGVtLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gICAgaWYgKCFwSXRlbWNoaWxkKQotICAgICAgY29udGludWU7Ci0KLSAgICBDRlhfV2lkZVN0cmluZyB3c0NoaWxkVmFsdWUgPSBwSXRlbWNoaWxkLT5HZXRDb250ZW50KCk7Ci0gICAgaWYgKHdzVmFsdWUgIT0gd3NDaGlsZFZhbHVlKSB7Ci0gICAgICBwSXRlbWNoaWxkID0gcEl0ZW1jaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsKLSAgICAgIGlmIChwSXRlbWNoaWxkKQotICAgICAgICB3c0NoaWxkVmFsdWUgPSBwSXRlbWNoaWxkLT5HZXRDb250ZW50KCk7Ci0gICAgICBlbHNlCi0gICAgICAgIHdzQ2hpbGRWYWx1ZS5jbGVhcigpOwotICAgIH0gZWxzZSB7Ci0gICAgICB3c0V4Y2xHcm91cCA9IHdzVmFsdWU7Ci0gICAgfQotICAgIHBOb2RlLT5TZXRDb250ZW50KHdzQ2hpbGRWYWx1ZSwgd3NDaGlsZFZhbHVlLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LAotICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgfQotICBpZiAobV9wTm9kZSkgewotICAgIG1fcE5vZGUtPlNldENvbnRlbnQod3NFeGNsR3JvdXAsIHdzRXhjbEdyb3VwLCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LAotICAgICAgICAgICAgICAgICAgICAgICAgYlN5bmNEYXRhKTsKLSAgfQotfQotCi1DWEZBX05vZGUqIENYRkFfV2lkZ2V0RGF0YTo6R2V0RXhjbEdyb3VwRmlyc3RNZW1iZXIoKSB7Ci0gIENYRkFfTm9kZSogcEV4Y2wgPSBHZXROb2RlKCk7Ci0gIGlmICghcEV4Y2wpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBFeGNsLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gIHdoaWxlIChwTm9kZSkgewotICAgIGlmIChwTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6RmllbGQpCi0gICAgICByZXR1cm4gcE5vZGU7Ci0KLSAgICBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOwotICB9Ci0gIHJldHVybiBudWxscHRyOwotfQotQ1hGQV9Ob2RlKiBDWEZBX1dpZGdldERhdGE6OkdldEV4Y2xHcm91cE5leHRNZW1iZXIoQ1hGQV9Ob2RlKiBwTm9kZSkgewotICBpZiAoIXBOb2RlKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIENYRkFfTm9kZSogcE5vZGVGaWVsZCA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOwotICB3aGlsZSAocE5vZGVGaWVsZCkgewotICAgIGlmIChwTm9kZUZpZWxkLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpGaWVsZCkKLSAgICAgIHJldHVybiBwTm9kZUZpZWxkOwotCi0gICAgcE5vZGVGaWVsZCA9IHBOb2RlRmllbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLWludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRDaG9pY2VMaXN0Q29tbWl0T24oKSB7Ci0gIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7Ci0gIGlmIChwVUlDaGlsZCkKLSAgICByZXR1cm4gcFVJQ2hpbGQtPkdldEVudW0oWEZBX0FUVFJJQlVURV9Db21taXRPbik7Ci0gIHJldHVybiBHZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfRW51bSgKLSAgICAgIFhGQV9FbGVtZW50OjpDaG9pY2VMaXN0LCBYRkFfQVRUUklCVVRFX0NvbW1pdE9uLCBYRkFfWERQUEFDS0VUX0Zvcm0pOwotfQotCi1ib29sIENYRkFfV2lkZ2V0RGF0YTo6SXNDaG9pY2VMaXN0QWxsb3dUZXh0RW50cnkoKSB7Ci0gIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7Ci0gIGlmIChwVUlDaGlsZCkKLSAgICByZXR1cm4gcFVJQ2hpbGQtPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9UZXh0RW50cnkpOwotICByZXR1cm4gR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0Jvb2xlYW4oCi0gICAgICBYRkFfRWxlbWVudDo6Q2hvaWNlTGlzdCwgWEZBX0FUVFJJQlVURV9UZXh0RW50cnksIFhGQV9YRFBQQUNLRVRfRm9ybSk7Ci19Ci0KLWludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRDaG9pY2VMaXN0T3BlbigpIHsKLSAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsKLSAgaWYgKHBVSUNoaWxkKQotICAgIHJldHVybiBwVUlDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX09wZW4pOwotICByZXR1cm4gR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0VudW0oWEZBX0VsZW1lbnQ6OkNob2ljZUxpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFX09wZW4sIFhGQV9YRFBQQUNLRVRfRm9ybSk7Ci19Ci0KLWJvb2wgQ1hGQV9XaWRnZXREYXRhOjpJc0xpc3RCb3goKSB7Ci0gIGludDMyX3QgaU9wZW5Nb2RlID0gR2V0Q2hvaWNlTGlzdE9wZW4oKTsKLSAgcmV0dXJuIChpT3Blbk1vZGUgPT0gWEZBX0FUVFJJQlVURUVOVU1fQWx3YXlzIHx8Ci0gICAgICAgICAgaU9wZW5Nb2RlID09IFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0KTsKLX0KLQotaW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkNvdW50Q2hvaWNlTGlzdEl0ZW1zKGJvb2wgYlNhdmVWYWx1ZSkgewotICBDWEZBX05vZGVBcnJheSBwSXRlbXM7Ci0gIENYRkFfTm9kZSogcEl0ZW0gPSBudWxscHRyOwotICBpbnQzMl90IGlDb3VudCA9IDA7Ci0gIENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gIGZvciAoOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgewotICAgIGlmIChwTm9kZS0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6SXRlbXMpCi0gICAgICBjb250aW51ZTsKLQotICAgIGlDb3VudCsrOwotICAgIHBJdGVtcy5BZGQocE5vZGUpOwotICAgIGlmIChpQ291bnQgPT0gMikKLSAgICAgIGJyZWFrOwotICB9Ci0gIGlmIChpQ291bnQgPT0gMCkKLSAgICByZXR1cm4gMDsKLQotICBwSXRlbSA9IHBJdGVtc1swXTsKLSAgaWYgKGlDb3VudCA+IDEpIHsKLSAgICBib29sIGJJdGVtT25lSGFzU2F2ZSA9IHBJdGVtc1swXS0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX1NhdmUpOwotICAgIGJvb2wgYkl0ZW1Ud29IYXNTYXZlID0gcEl0ZW1zWzFdLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSk7Ci0gICAgaWYgKGJJdGVtT25lSGFzU2F2ZSAhPSBiSXRlbVR3b0hhc1NhdmUgJiYgYlNhdmVWYWx1ZSA9PSBiSXRlbVR3b0hhc1NhdmUpCi0gICAgICBwSXRlbSA9IHBJdGVtc1sxXTsKLSAgfQotICBwSXRlbXMuUmVtb3ZlQWxsKCk7Ci0gIHJldHVybiBwSXRlbS0+Q291bnRDaGlsZHJlbihYRkFfRWxlbWVudDo6VW5rbm93bik7Ci19Ci0KLWJvb2wgQ1hGQV9XaWRnZXREYXRhOjpHZXRDaG9pY2VMaXN0SXRlbShDRlhfV2lkZVN0cmluZyYgd3NUZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNhdmVWYWx1ZSkgewotICB3c1RleHQuY2xlYXIoKTsKLSAgQ1hGQV9Ob2RlQXJyYXkgcEl0ZW1zQXJyYXk7Ci0gIENYRkFfTm9kZSogcEl0ZW1zID0gbnVsbHB0cjsKLSAgaW50MzJfdCBpQ291bnQgPSAwOwotICBDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICBmb3IgKDsgcE5vZGU7IHBOb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsKLSAgICBpZiAocE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6Okl0ZW1zKQotICAgICAgY29udGludWU7Ci0KLSAgICBpQ291bnQrKzsKLSAgICBwSXRlbXNBcnJheS5BZGQocE5vZGUpOwotICAgIGlmIChpQ291bnQgPT0gMikKLSAgICAgIGJyZWFrOwotICB9Ci0gIGlmIChpQ291bnQgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcEl0ZW1zID0gcEl0ZW1zQXJyYXlbMF07Ci0gIGlmIChpQ291bnQgPiAxKSB7Ci0gICAgYm9vbCBiSXRlbU9uZUhhc1NhdmUgPSBwSXRlbXNBcnJheVswXS0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX1NhdmUpOwotICAgIGJvb2wgYkl0ZW1Ud29IYXNTYXZlID0gcEl0ZW1zQXJyYXlbMV0tPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9TYXZlKTsKLSAgICBpZiAoYkl0ZW1PbmVIYXNTYXZlICE9IGJJdGVtVHdvSGFzU2F2ZSAmJiBiU2F2ZVZhbHVlID09IGJJdGVtVHdvSGFzU2F2ZSkKLSAgICAgIHBJdGVtcyA9IHBJdGVtc0FycmF5WzFdOwotICB9Ci0gIGlmIChwSXRlbXMpIHsKLSAgICBDWEZBX05vZGUqIHBJdGVtID0gcEl0ZW1zLT5HZXRDaGlsZChuSW5kZXgsIFhGQV9FbGVtZW50OjpVbmtub3duKTsKLSAgICBpZiAocEl0ZW0pIHsKLSAgICAgIHBJdGVtLT5UcnlDb250ZW50KHdzVGV4dCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIENYRkFfV2lkZ2V0RGF0YTo6R2V0Q2hvaWNlTGlzdEl0ZW1zKAotICAgIHN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nPiYgd3NUZXh0QXJyYXksCi0gICAgYm9vbCBiU2F2ZVZhbHVlKSB7Ci0gIENYRkFfTm9kZUFycmF5IHBJdGVtczsKLSAgQ1hGQV9Ob2RlKiBwSXRlbSA9IG51bGxwdHI7Ci0gIGludDMyX3QgaUNvdW50ID0gMDsKLSAgQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsKLSAgZm9yICg7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7Ci0gICAgaWYgKHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpJdGVtcykKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgaUNvdW50Kys7Ci0gICAgcEl0ZW1zLkFkZChwTm9kZSk7Ci0gICAgaWYgKGlDb3VudCA9PSAyKQotICAgICAgYnJlYWs7Ci0gIH0KLSAgaWYgKGlDb3VudCA9PSAwKQotICAgIHJldHVybjsKLQotICBwSXRlbSA9IHBJdGVtc1swXTsKLSAgaWYgKGlDb3VudCA+IDEpIHsKLSAgICBib29sIGJJdGVtT25lSGFzU2F2ZSA9IHBJdGVtc1swXS0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX1NhdmUpOwotICAgIGJvb2wgYkl0ZW1Ud29IYXNTYXZlID0gcEl0ZW1zWzFdLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSk7Ci0gICAgaWYgKGJJdGVtT25lSGFzU2F2ZSAhPSBiSXRlbVR3b0hhc1NhdmUgJiYgYlNhdmVWYWx1ZSA9PSBiSXRlbVR3b0hhc1NhdmUpCi0gICAgICBwSXRlbSA9IHBJdGVtc1sxXTsKLSAgfQotICBwSXRlbXMuUmVtb3ZlQWxsKCk7Ci0gIHBOb2RlID0gcEl0ZW0tPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsKLSAgZm9yICg7IHBOb2RlOyBwTm9kZSA9IHBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7Ci0gICAgd3NUZXh0QXJyYXkuZW1wbGFjZV9iYWNrKCk7Ci0gICAgcE5vZGUtPlRyeUNvbnRlbnQod3NUZXh0QXJyYXkuYmFjaygpKTsKLSAgfQotfQotCi1pbnQzMl90IENYRkFfV2lkZ2V0RGF0YTo6Q291bnRTZWxlY3RlZEl0ZW1zKCkgewotICBzdGQ6OnZlY3RvcjxDRlhfV2lkZVN0cmluZz4gd3NWYWx1ZUFycmF5OwotICBHZXRTZWxlY3RlZEl0ZW1zVmFsdWUod3NWYWx1ZUFycmF5KTsKLSAgaWYgKElzTGlzdEJveCgpIHx8ICFJc0Nob2ljZUxpc3RBbGxvd1RleHRFbnRyeSgpKQotICAgIHJldHVybiBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHdzVmFsdWVBcnJheSk7Ci0KLSAgaW50MzJfdCBpU2VsZWN0ZWQgPSAwOwotICBzdGQ6OnZlY3RvcjxDRlhfV2lkZVN0cmluZz4gd3NTYXZlVGV4dEFycmF5OwotICBHZXRDaG9pY2VMaXN0SXRlbXMod3NTYXZlVGV4dEFycmF5LCB0cnVlKTsKLSAgaW50MzJfdCBpVmFsdWVzID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90Pih3c1ZhbHVlQXJyYXkpOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpVmFsdWVzOyBpKyspIHsKLSAgICBpbnQzMl90IGlTYXZlcyA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4od3NTYXZlVGV4dEFycmF5KTsKLSAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBpU2F2ZXM7IGorKykgewotICAgICAgaWYgKHdzVmFsdWVBcnJheVtpXSA9PSB3c1NhdmVUZXh0QXJyYXlbal0pIHsKLSAgICAgICAgaVNlbGVjdGVkKys7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gaVNlbGVjdGVkOwotfQotCi1pbnQzMl90IENYRkFfV2lkZ2V0RGF0YTo6R2V0U2VsZWN0ZWRJdGVtKGludDMyX3QgbkluZGV4KSB7Ci0gIHN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nPiB3c1ZhbHVlQXJyYXk7Ci0gIEdldFNlbGVjdGVkSXRlbXNWYWx1ZSh3c1ZhbHVlQXJyYXkpOwotICBzdGQ6OnZlY3RvcjxDRlhfV2lkZVN0cmluZz4gd3NTYXZlVGV4dEFycmF5OwotICBHZXRDaG9pY2VMaXN0SXRlbXMod3NTYXZlVGV4dEFycmF5LCB0cnVlKTsKLSAgaW50MzJfdCBpU2F2ZXMgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHdzU2F2ZVRleHRBcnJheSk7Ci0gIGZvciAoaW50MzJfdCBqID0gMDsgaiA8IGlTYXZlczsgaisrKSB7Ci0gICAgaWYgKHdzVmFsdWVBcnJheVtuSW5kZXhdID09IHdzU2F2ZVRleHRBcnJheVtqXSkKLSAgICAgIHJldHVybiBqOwotICB9Ci0gIHJldHVybiAtMTsKLX0KLQotdm9pZCBDWEZBX1dpZGdldERhdGE6OkdldFNlbGVjdGVkSXRlbXMoQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4mIGlTZWxBcnJheSkgewotICBzdGQ6OnZlY3RvcjxDRlhfV2lkZVN0cmluZz4gd3NWYWx1ZUFycmF5OwotICBHZXRTZWxlY3RlZEl0ZW1zVmFsdWUod3NWYWx1ZUFycmF5KTsKLSAgaW50MzJfdCBpVmFsdWVzID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90Pih3c1ZhbHVlQXJyYXkpOwotICBpZiAoaVZhbHVlcyA8IDEpCi0gICAgcmV0dXJuOwotCi0gIHN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nPiB3c1NhdmVUZXh0QXJyYXk7Ci0gIEdldENob2ljZUxpc3RJdGVtcyh3c1NhdmVUZXh0QXJyYXksIHRydWUpOwotICBpbnQzMl90IGlTYXZlcyA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4od3NTYXZlVGV4dEFycmF5KTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVZhbHVlczsgaSsrKSB7Ci0gICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVNhdmVzOyBqKyspIHsKLSAgICAgIGlmICh3c1ZhbHVlQXJyYXlbaV0gPT0gd3NTYXZlVGV4dEFycmF5W2pdKSB7Ci0gICAgICAgIGlTZWxBcnJheS5BZGQoaik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIENYRkFfV2lkZ2V0RGF0YTo6R2V0U2VsZWN0ZWRJdGVtc1ZhbHVlKAotICAgIHN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nPiYgd3NTZWxUZXh0QXJyYXkpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSA9IEdldFJhd1ZhbHVlKCk7Ci0gIGlmIChHZXRDaG9pY2VMaXN0T3BlbigpID09IFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0KSB7Ci0gICAgaWYgKCF3c1ZhbHVlLklzRW1wdHkoKSkgewotICAgICAgaW50MzJfdCBpU3RhcnQgPSAwOwotICAgICAgaW50MzJfdCBpTGVuZ3RoID0gd3NWYWx1ZS5HZXRMZW5ndGgoKTsKLSAgICAgIGludDMyX3QgaUVuZCA9IHdzVmFsdWUuRmluZChMJ1xuJywgaVN0YXJ0KTsKLSAgICAgIGlFbmQgPSAoaUVuZCA9PSAtMSkgPyBpTGVuZ3RoIDogaUVuZDsKLSAgICAgIHdoaWxlIChpRW5kID49IGlTdGFydCkgewotICAgICAgICB3c1NlbFRleHRBcnJheS5wdXNoX2JhY2sod3NWYWx1ZS5NaWQoaVN0YXJ0LCBpRW5kIC0gaVN0YXJ0KSk7Ci0gICAgICAgIGlTdGFydCA9IGlFbmQgKyAxOwotICAgICAgICBpZiAoaVN0YXJ0ID49IGlMZW5ndGgpCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgaUVuZCA9IHdzVmFsdWUuRmluZChMJ1xuJywgaVN0YXJ0KTsKLSAgICAgICAgaWYgKGlFbmQgPCAwKQotICAgICAgICAgIHdzU2VsVGV4dEFycmF5LnB1c2hfYmFjayh3c1ZhbHVlLk1pZChpU3RhcnQsIGlMZW5ndGggLSBpU3RhcnQpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgd3NTZWxUZXh0QXJyYXkucHVzaF9iYWNrKHdzVmFsdWUpOwotICB9Ci19Ci0KLWJvb2wgQ1hGQV9XaWRnZXREYXRhOjpHZXRJdGVtU3RhdGUoaW50MzJfdCBuSW5kZXgpIHsKLSAgaWYgKG5JbmRleCA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIHN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nPiB3c1NhdmVUZXh0QXJyYXk7Ci0gIEdldENob2ljZUxpc3RJdGVtcyh3c1NhdmVUZXh0QXJyYXksIHRydWUpOwotICBpZiAocGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90Pih3c1NhdmVUZXh0QXJyYXkpIDw9IG5JbmRleCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+IHdzVmFsdWVBcnJheTsKLSAgR2V0U2VsZWN0ZWRJdGVtc1ZhbHVlKHdzVmFsdWVBcnJheSk7Ci0gIGludDMyX3QgaVZhbHVlcyA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4od3NWYWx1ZUFycmF5KTsKLSAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVZhbHVlczsgaisrKSB7Ci0gICAgaWYgKHdzVmFsdWVBcnJheVtqXSA9PSB3c1NhdmVUZXh0QXJyYXlbbkluZGV4XSkKLSAgICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBDWEZBX1dpZGdldERhdGE6OlNldEl0ZW1TdGF0ZShpbnQzMl90IG5JbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2VsZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYk5vdGlmeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2NyaXB0TW9kaWZ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTeW5jRGF0YSkgewotICBpZiAobkluZGV4IDwgMCkKLSAgICByZXR1cm47Ci0KLSAgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+IHdzU2F2ZVRleHRBcnJheTsKLSAgR2V0Q2hvaWNlTGlzdEl0ZW1zKHdzU2F2ZVRleHRBcnJheSwgdHJ1ZSk7Ci0gIGlmIChwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHdzU2F2ZVRleHRBcnJheSkgPD0gbkluZGV4KQotICAgIHJldHVybjsKLQotICBpbnQzMl90IGlTZWwgPSAtMTsKLSAgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+IHdzVmFsdWVBcnJheTsKLSAgR2V0U2VsZWN0ZWRJdGVtc1ZhbHVlKHdzVmFsdWVBcnJheSk7Ci0gIGludDMyX3QgaVZhbHVlcyA9IHBkZml1bTo6Q29sbGVjdGlvblNpemU8aW50MzJfdD4od3NWYWx1ZUFycmF5KTsKLSAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgaVZhbHVlczsgaisrKSB7Ci0gICAgaWYgKHdzVmFsdWVBcnJheVtqXSA9PSB3c1NhdmVUZXh0QXJyYXlbbkluZGV4XSkgewotICAgICAgaVNlbCA9IGo7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgaWYgKEdldENob2ljZUxpc3RPcGVuKCkgPT0gWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3QpIHsKLSAgICBpZiAoYlNlbGVjdGVkKSB7Ci0gICAgICBpZiAoaVNlbCA8IDApIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSA9IEdldFJhd1ZhbHVlKCk7Ci0gICAgICAgIGlmICghd3NWYWx1ZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICB3c1ZhbHVlICs9IEwiXG4iOwotICAgICAgICB9Ci0gICAgICAgIHdzVmFsdWUgKz0gd3NTYXZlVGV4dEFycmF5W25JbmRleF07Ci0gICAgICAgIG1fcE5vZGUtPlNldENvbnRlbnQod3NWYWx1ZSwgd3NWYWx1ZSwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3luY0RhdGEpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoaVNlbCA+PSAwKSB7Ci0gICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxpbnQzMl90PiBpU2VsQXJyYXk7Ci0gICAgICBHZXRTZWxlY3RlZEl0ZW1zKGlTZWxBcnJheSk7Ci0gICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpU2VsQXJyYXkuR2V0U2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGlTZWxBcnJheVtpXSA9PSBuSW5kZXgpIHsKLSAgICAgICAgICBpU2VsQXJyYXkuUmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIFNldFNlbGVjdGVkSXRlbXMoaVNlbEFycmF5LCBiTm90aWZ5LCBiU2NyaXB0TW9kaWZ5LCBiU3luY0RhdGEpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoYlNlbGVjdGVkKSB7Ci0gICAgICBpZiAoaVNlbCA8IDApIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NTYXZlVGV4dCA9IHdzU2F2ZVRleHRBcnJheVtuSW5kZXhdOwotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0Zvcm1hdFRleHQod3NTYXZlVGV4dCk7Ci0gICAgICAgIEdldEZvcm1hdERhdGFWYWx1ZSh3c1NhdmVUZXh0LCB3c0Zvcm1hdFRleHQpOwotICAgICAgICBtX3BOb2RlLT5TZXRDb250ZW50KHdzU2F2ZVRleHQsIHdzRm9ybWF0VGV4dCwgYk5vdGlmeSwgYlNjcmlwdE1vZGlmeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBiU3luY0RhdGEpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoaVNlbCA+PSAwKSB7Ci0gICAgICBtX3BOb2RlLT5TZXRDb250ZW50KENGWF9XaWRlU3RyaW5nKCksIENGWF9XaWRlU3RyaW5nKCksIGJOb3RpZnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJTY3JpcHRNb2RpZnksIGJTeW5jRGF0YSk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ1hGQV9XaWRnZXREYXRhOjpTZXRTZWxlY3RlZEl0ZW1zKENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+JiBpU2VsQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJOb3RpZnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTY3JpcHRNb2RpZnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTeW5jRGF0YSkgewotICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOwotICBpbnQzMl90IGlTaXplID0gaVNlbEFycmF5LkdldFNpemUoKTsKLSAgaWYgKGlTaXplID49IDEpIHsKLSAgICBzdGQ6OnZlY3RvcjxDRlhfV2lkZVN0cmluZz4gd3NTYXZlVGV4dEFycmF5OwotICAgIEdldENob2ljZUxpc3RJdGVtcyh3c1NhdmVUZXh0QXJyYXksIHRydWUpOwotICAgIENGWF9XaWRlU3RyaW5nIHdzSXRlbVZhbHVlOwotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlTaXplOyBpKyspIHsKLSAgICAgIHdzSXRlbVZhbHVlID0gKGlTaXplID09IDEpID8gd3NTYXZlVGV4dEFycmF5W2lTZWxBcnJheVtpXV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogd3NTYXZlVGV4dEFycmF5W2lTZWxBcnJheVtpXV0gKyBMIlxuIjsKLSAgICAgIHdzVmFsdWUgKz0gd3NJdGVtVmFsdWU7Ci0gICAgfQotICB9Ci0gIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0KHdzVmFsdWUpOwotICBpZiAoR2V0Q2hvaWNlTGlzdE9wZW4oKSAhPSBYRkFfQVRUUklCVVRFRU5VTV9NdWx0aVNlbGVjdCkKLSAgICBHZXRGb3JtYXREYXRhVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXQpOwotCi0gIG1fcE5vZGUtPlNldENvbnRlbnQod3NWYWx1ZSwgd3NGb3JtYXQsIGJOb3RpZnksIGJTY3JpcHRNb2RpZnksIGJTeW5jRGF0YSk7Ci19Ci0KLXZvaWQgQ1hGQV9XaWRnZXREYXRhOjpDbGVhckFsbFNlbGVjdGlvbnMoKSB7Ci0gIENYRkFfTm9kZSogcEJpbmQgPSBtX3BOb2RlLT5HZXRCaW5kRGF0YSgpOwotICBpZiAoIXBCaW5kIHx8IEdldENob2ljZUxpc3RPcGVuKCkgIT0gWEZBX0FUVFJJQlVURUVOVU1fTXVsdGlTZWxlY3QpIHsKLSAgICBTeW5jVmFsdWUoQ0ZYX1dpZGVTdHJpbmcoKSwgZmFsc2UpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHdoaWxlIChDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwQmluZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpKQotICAgIHBCaW5kLT5SZW1vdmVDaGlsZChwQ2hpbGROb2RlKTsKLX0KLQotdm9pZCBDWEZBX1dpZGdldERhdGE6Okluc2VydEl0ZW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5KSB7Ci0gIENGWF9XaWRlU3RyaW5nIHdzTmV3VmFsdWUod3NWYWx1ZSk7Ci0gIGlmICh3c05ld1ZhbHVlLklzRW1wdHkoKSkKLSAgICB3c05ld1ZhbHVlID0gd3NMYWJlbDsKLQotICBDWEZBX05vZGVBcnJheSBsaXN0aXRlbXM7Ci0gIGludDMyX3QgaUNvdW50ID0gMDsKLSAgQ1hGQV9Ob2RlKiBwSXRlbU5vZGUgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gIGZvciAoOyBwSXRlbU5vZGU7Ci0gICAgICAgcEl0ZW1Ob2RlID0gcEl0ZW1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7Ci0gICAgaWYgKHBJdGVtTm9kZS0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6SXRlbXMpCi0gICAgICBjb250aW51ZTsKLQotICAgIGxpc3RpdGVtcy5BZGQocEl0ZW1Ob2RlKTsKLSAgICBpQ291bnQrKzsKLSAgfQotICBpZiAoaUNvdW50IDwgMSkgewotICAgIENYRkFfTm9kZSogcEl0ZW1zID0gbV9wTm9kZS0+Q3JlYXRlU2FtZVBhY2tldE5vZGUoWEZBX0VsZW1lbnQ6Okl0ZW1zKTsKLSAgICBtX3BOb2RlLT5JbnNlcnRDaGlsZCgtMSwgcEl0ZW1zKTsKLSAgICBJbnNlcnRMaXN0VGV4dEl0ZW0ocEl0ZW1zLCB3c0xhYmVsLCBuSW5kZXgpOwotICAgIENYRkFfTm9kZSogcFNhdmVJdGVtcyA9IG1fcE5vZGUtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FbGVtZW50OjpJdGVtcyk7Ci0gICAgbV9wTm9kZS0+SW5zZXJ0Q2hpbGQoLTEsIHBTYXZlSXRlbXMpOwotICAgIHBTYXZlSXRlbXMtPlNldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9TYXZlLCB0cnVlKTsKLSAgICBJbnNlcnRMaXN0VGV4dEl0ZW0ocFNhdmVJdGVtcywgd3NOZXdWYWx1ZSwgbkluZGV4KTsKLSAgfSBlbHNlIGlmIChpQ291bnQgPiAxKSB7Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgICBDWEZBX05vZGUqIHBOb2RlID0gbGlzdGl0ZW1zW2ldOwotICAgICAgYm9vbCBiSGFzU2F2ZSA9IHBOb2RlLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSk7Ci0gICAgICBpZiAoYkhhc1NhdmUpCi0gICAgICAgIEluc2VydExpc3RUZXh0SXRlbShwTm9kZSwgd3NOZXdWYWx1ZSwgbkluZGV4KTsKLSAgICAgIGVsc2UKLSAgICAgICAgSW5zZXJ0TGlzdFRleHRJdGVtKHBOb2RlLCB3c0xhYmVsLCBuSW5kZXgpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBDWEZBX05vZGUqIHBOb2RlID0gbGlzdGl0ZW1zWzBdOwotICAgIHBOb2RlLT5TZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSwgZmFsc2UpOwotICAgIHBOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUpOwotICAgIENYRkFfTm9kZSogcFNhdmVJdGVtcyA9IG1fcE5vZGUtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FbGVtZW50OjpJdGVtcyk7Ci0gICAgbV9wTm9kZS0+SW5zZXJ0Q2hpbGQoLTEsIHBTYXZlSXRlbXMpOwotICAgIHBTYXZlSXRlbXMtPlNldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9TYXZlLCB0cnVlKTsKLSAgICBwU2F2ZUl0ZW1zLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9BVFRSSUJVVEVFTlVNX0hpZGRlbik7Ci0gICAgbGlzdGl0ZW1zLlJlbW92ZUFsbCgpOwotICAgIENYRkFfTm9kZSogcExpc3ROb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsKLSAgICBpbnQzMl90IGkgPSAwOwotICAgIHdoaWxlIChwTGlzdE5vZGUpIHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzT2xkVmFsdWU7Ci0gICAgICBwTGlzdE5vZGUtPlRyeUNvbnRlbnQod3NPbGRWYWx1ZSk7Ci0gICAgICBJbnNlcnRMaXN0VGV4dEl0ZW0ocFNhdmVJdGVtcywgd3NPbGRWYWx1ZSwgaSk7Ci0gICAgICBpKys7Ci0gICAgICBwTGlzdE5vZGUgPSBwTGlzdE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7Ci0gICAgfQotICAgIEluc2VydExpc3RUZXh0SXRlbShwTm9kZSwgd3NMYWJlbCwgbkluZGV4KTsKLSAgICBJbnNlcnRMaXN0VGV4dEl0ZW0ocFNhdmVJdGVtcywgd3NOZXdWYWx1ZSwgbkluZGV4KTsKLSAgfQotICBpZiAoIWJOb3RpZnkpCi0gICAgcmV0dXJuOwotCi0gIG1fcE5vZGUtPkdldERvY3VtZW50KCktPkdldE5vdGlmeSgpLT5PbldpZGdldExpc3RJdGVtQWRkZWQoCi0gICAgICB0aGlzLCB3c0xhYmVsLmNfc3RyKCksIHdzVmFsdWUuY19zdHIoKSwgbkluZGV4KTsKLX0KLQotdm9pZCBDWEZBX1dpZGdldERhdGE6OkdldEl0ZW1MYWJlbChjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0xhYmVsKSB7Ci0gIGludDMyX3QgaUNvdW50ID0gMDsKLSAgQ1hGQV9Ob2RlQXJyYXkgbGlzdGl0ZW1zOwotICBDWEZBX05vZGUqIHBJdGVtcyA9IG1fcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsKLSAgZm9yICg7IHBJdGVtczsgcEl0ZW1zID0gcEl0ZW1zLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7Ci0gICAgaWYgKHBJdGVtcy0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6SXRlbXMpCi0gICAgICBjb250aW51ZTsKLQotICAgIGlDb3VudCsrOwotICAgIGxpc3RpdGVtcy5BZGQocEl0ZW1zKTsKLSAgfQotICBpZiAoaUNvdW50IDw9IDEpIHsKLSAgICB3c0xhYmVsID0gd3NWYWx1ZTsKLSAgfSBlbHNlIHsKLSAgICBDWEZBX05vZGUqIHBMYWJlbEl0ZW1zID0gbGlzdGl0ZW1zWzBdOwotICAgIGJvb2wgYlNhdmUgPSBwTGFiZWxJdGVtcy0+R2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFX1NhdmUpOwotICAgIENYRkFfTm9kZSogcFNhdmVJdGVtcyA9IG51bGxwdHI7Ci0gICAgaWYgKGJTYXZlKSB7Ci0gICAgICBwU2F2ZUl0ZW1zID0gcExhYmVsSXRlbXM7Ci0gICAgICBwTGFiZWxJdGVtcyA9IGxpc3RpdGVtc1sxXTsKLSAgICB9IGVsc2UgewotICAgICAgcFNhdmVJdGVtcyA9IGxpc3RpdGVtc1sxXTsKLSAgICB9Ci0gICAgaUNvdW50ID0gMDsKLSAgICBpbnQzMl90IGlTZWFyY2ggPSAtMTsKLSAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7Ci0gICAgQ1hGQV9Ob2RlKiBwQ2hpbGRJdGVtID0gcFNhdmVJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgIGZvciAoOyBwQ2hpbGRJdGVtOwotICAgICAgICAgcENoaWxkSXRlbSA9IHBDaGlsZEl0ZW0tPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsKLSAgICAgIHBDaGlsZEl0ZW0tPlRyeUNvbnRlbnQod3NDb250ZW50KTsKLSAgICAgIGlmICh3c0NvbnRlbnQgPT0gd3NWYWx1ZSkgewotICAgICAgICBpU2VhcmNoID0gaUNvdW50OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlDb3VudCsrOwotICAgIH0KLSAgICBpZiAoaVNlYXJjaCA8IDApCi0gICAgICByZXR1cm47Ci0gICAgaWYgKENYRkFfTm9kZSogcFRleHQgPQotICAgICAgICAgICAgcExhYmVsSXRlbXMtPkdldENoaWxkKGlTZWFyY2gsIFhGQV9FbGVtZW50OjpVbmtub3duKSkgewotICAgICAgcFRleHQtPlRyeUNvbnRlbnQod3NMYWJlbCk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgQ1hGQV9XaWRnZXREYXRhOjpHZXRJdGVtVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0xhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSkgewotICBpbnQzMl90IGlDb3VudCA9IDA7Ci0gIENYRkFfTm9kZUFycmF5IGxpc3RpdGVtczsKLSAgQ1hGQV9Ob2RlKiBwSXRlbXMgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gIGZvciAoOyBwSXRlbXM7IHBJdGVtcyA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgewotICAgIGlmIChwSXRlbXMtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6Okl0ZW1zKQotICAgICAgY29udGludWU7Ci0KLSAgICBpQ291bnQrKzsKLSAgICBsaXN0aXRlbXMuQWRkKHBJdGVtcyk7Ci0gIH0KLSAgaWYgKGlDb3VudCA8PSAxKSB7Ci0gICAgd3NWYWx1ZSA9IHdzTGFiZWw7Ci0gIH0gZWxzZSB7Ci0gICAgQ1hGQV9Ob2RlKiBwTGFiZWxJdGVtcyA9IGxpc3RpdGVtc1swXTsKLSAgICBib29sIGJTYXZlID0gcExhYmVsSXRlbXMtPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9TYXZlKTsKLSAgICBDWEZBX05vZGUqIHBTYXZlSXRlbXMgPSBudWxscHRyOwotICAgIGlmIChiU2F2ZSkgewotICAgICAgcFNhdmVJdGVtcyA9IHBMYWJlbEl0ZW1zOwotICAgICAgcExhYmVsSXRlbXMgPSBsaXN0aXRlbXNbMV07Ci0gICAgfSBlbHNlIHsKLSAgICAgIHBTYXZlSXRlbXMgPSBsaXN0aXRlbXNbMV07Ci0gICAgfQotICAgIGlDb3VudCA9IDA7Ci0gICAgaW50MzJfdCBpU2VhcmNoID0gLTE7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50OwotICAgIENYRkFfTm9kZSogcENoaWxkSXRlbSA9IHBMYWJlbEl0ZW1zLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gICAgZm9yICg7IHBDaGlsZEl0ZW07Ci0gICAgICAgICBwQ2hpbGRJdGVtID0gcENoaWxkSXRlbS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgewotICAgICAgcENoaWxkSXRlbS0+VHJ5Q29udGVudCh3c0NvbnRlbnQpOwotICAgICAgaWYgKHdzQ29udGVudCA9PSB3c0xhYmVsKSB7Ci0gICAgICAgIGlTZWFyY2ggPSBpQ291bnQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaUNvdW50Kys7Ci0gICAgfQotICAgIGlmIChpU2VhcmNoIDwgMCkKLSAgICAgIHJldHVybjsKLSAgICBpZiAoQ1hGQV9Ob2RlKiBwVGV4dCA9IHBTYXZlSXRlbXMtPkdldENoaWxkKGlTZWFyY2gsIFhGQV9FbGVtZW50OjpVbmtub3duKSkKLSAgICAgIHBUZXh0LT5UcnlDb250ZW50KHdzVmFsdWUpOwotICB9Ci19Ci0KLWJvb2wgQ1hGQV9XaWRnZXREYXRhOjpEZWxldGVJdGVtKGludDMyX3QgbkluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2NyaXB0TW9kaWZ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3luY0RhdGEpIHsKLSAgYm9vbCBiU2V0VmFsdWUgPSBmYWxzZTsKLSAgQ1hGQV9Ob2RlKiBwSXRlbXMgPSBtX3BOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gIGZvciAoOyBwSXRlbXM7IHBJdGVtcyA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgewotICAgIGlmIChwSXRlbXMtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6Okl0ZW1zKQotICAgICAgY29udGludWU7Ci0KLSAgICBpZiAobkluZGV4IDwgMCkgewotICAgICAgd2hpbGUgKENYRkFfTm9kZSogcE5vZGUgPSBwSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkgewotICAgICAgICBwSXRlbXMtPlJlbW92ZUNoaWxkKHBOb2RlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKCFiU2V0VmFsdWUgJiYgcEl0ZW1zLT5HZXRCb29sZWFuKFhGQV9BVFRSSUJVVEVfU2F2ZSkpIHsKLSAgICAgICAgU2V0SXRlbVN0YXRlKG5JbmRleCwgZmFsc2UsIHRydWUsIGJTY3JpcHRNb2RpZnksIGJTeW5jRGF0YSk7Ci0gICAgICAgIGJTZXRWYWx1ZSA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBpbnQzMl90IGkgPSAwOwotICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBJdGVtcy0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgd2hpbGUgKHBOb2RlKSB7Ci0gICAgICAgIGlmIChpID09IG5JbmRleCkgewotICAgICAgICAgIHBJdGVtcy0+UmVtb3ZlQ2hpbGQocE5vZGUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGkrKzsKLSAgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaWYgKGJOb3RpZnkpCi0gICAgbV9wTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCktPk9uV2lkZ2V0TGlzdEl0ZW1SZW1vdmVkKHRoaXMsIG5JbmRleCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1pbnQzMl90IENYRkFfV2lkZ2V0RGF0YTo6R2V0SG9yaXpvbnRhbFNjcm9sbFBvbGljeSgpIHsKLSAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsKLSAgaWYgKHBVSUNoaWxkKQotICAgIHJldHVybiBwVUlDaGlsZC0+R2V0RW51bShYRkFfQVRUUklCVVRFX0hTY3JvbGxQb2xpY3kpOwotICByZXR1cm4gWEZBX0FUVFJJQlVURUVOVU1fQXV0bzsKLX0KLQotaW50MzJfdCBDWEZBX1dpZGdldERhdGE6OkdldE51bWJlck9mQ2VsbHMoKSB7Ci0gIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7Ci0gIGlmICghcFVJQ2hpbGQpCi0gICAgcmV0dXJuIC0xOwotICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHBVSUNoaWxkLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6Q29tYikpCi0gICAgcmV0dXJuIHBOb2RlLT5HZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTnVtYmVyT2ZDZWxscyk7Ci0gIHJldHVybiAtMTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9XaWRnZXREYXRhOjpHZXRCYXJjb2RlVHlwZSgpIHsKLSAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsKLSAgcmV0dXJuIHBVSUNoaWxkID8gQ0ZYX1dpZGVTdHJpbmcocFVJQ2hpbGQtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfVHlwZSkpCi0gICAgICAgICAgICAgICAgICA6IENGWF9XaWRlU3RyaW5nKCk7Ci19Ci0KLWJvb2wgQ1hGQV9XaWRnZXREYXRhOjpHZXRCYXJjb2RlQXR0cmlidXRlX0NoYXJFbmNvZGluZyhpbnQzMl90JiB2YWwpIHsKLSAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NDaGFyRW5jb2Rpbmc7Ci0gIGlmIChwVUlDaGlsZC0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9DaGFyRW5jb2RpbmcsIHdzQ2hhckVuY29kaW5nKSkgewotICAgIGlmICh3c0NoYXJFbmNvZGluZy5Db21wYXJlTm9DYXNlKEwiVVRGLTE2IikpIHsKLSAgICAgIHZhbCA9IENIQVJfRU5DT0RJTkdfVU5JQ09ERTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAod3NDaGFyRW5jb2RpbmcuQ29tcGFyZU5vQ2FzZShMIlVURi04IikpIHsKLSAgICAgIHZhbCA9IENIQVJfRU5DT0RJTkdfVVRGODsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1hGQV9XaWRnZXREYXRhOjpHZXRCYXJjb2RlQXR0cmlidXRlX0NoZWNrc3VtKGJvb2wmIHZhbCkgewotICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOwotICBYRkFfQVRUUklCVVRFRU5VTSBlQ2hlY2tzdW07Ci0gIGlmIChwVUlDaGlsZC0+VHJ5RW51bShYRkFfQVRUUklCVVRFX0NoZWNrc3VtLCBlQ2hlY2tzdW0pKSB7Ci0gICAgc3dpdGNoIChlQ2hlY2tzdW0pIHsKLSAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTm9uZToKLSAgICAgICAgdmFsID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9BdXRvOgotICAgICAgICB2YWwgPSB0cnVlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fMW1vZDEwOgotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fMW1vZDEwXzFtb2QxMToKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNXzJtb2QxMDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9EYXRhTGVuZ3RoKGludDMyX3QmIHZhbCkgewotICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOwotICBDRlhfV2lkZVN0cmluZyB3c0RhdGFMZW5ndGg7Ci0gIGlmIChwVUlDaGlsZC0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9EYXRhTGVuZ3RoLCB3c0RhdGFMZW5ndGgpKSB7Ci0gICAgdmFsID0gRlhTWVNfd3RvaSh3c0RhdGFMZW5ndGguY19zdHIoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9TdGFydENoYXIoRlhfQ0hBUiYgdmFsKSB7Ci0gIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7Ci0gIENGWF9XaWRlU3RyaW5nQyB3c1N0YXJ0RW5kQ2hhcjsKLSAgaWYgKHBVSUNoaWxkLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1N0YXJ0Q2hhciwgd3NTdGFydEVuZENoYXIpKSB7Ci0gICAgaWYgKHdzU3RhcnRFbmRDaGFyLkdldExlbmd0aCgpKSB7Ci0gICAgICB2YWwgPSAoRlhfQ0hBUil3c1N0YXJ0RW5kQ2hhci5HZXRBdCgwKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1hGQV9XaWRnZXREYXRhOjpHZXRCYXJjb2RlQXR0cmlidXRlX0VuZENoYXIoRlhfQ0hBUiYgdmFsKSB7Ci0gIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7Ci0gIENGWF9XaWRlU3RyaW5nQyB3c1N0YXJ0RW5kQ2hhcjsKLSAgaWYgKHBVSUNoaWxkLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX0VuZENoYXIsIHdzU3RhcnRFbmRDaGFyKSkgewotICAgIGlmICh3c1N0YXJ0RW5kQ2hhci5HZXRMZW5ndGgoKSkgewotICAgICAgdmFsID0gKEZYX0NIQVIpd3NTdGFydEVuZENoYXIuR2V0QXQoMCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9FQ0xldmVsKGludDMyX3QmIHZhbCkgewotICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOwotICBDRlhfV2lkZVN0cmluZyB3c0VDTGV2ZWw7Ci0gIGlmIChwVUlDaGlsZC0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9FcnJvckNvcnJlY3Rpb25MZXZlbCwgd3NFQ0xldmVsKSkgewotICAgIHZhbCA9IEZYU1lTX3d0b2kod3NFQ0xldmVsLmNfc3RyKCkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfTW9kdWxlV2lkdGgoaW50MzJfdCYgdmFsKSB7Ci0gIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7Ci0gIENYRkFfTWVhc3VyZW1lbnQgbU1vZHVsZVdpZHRoSGVpZ2h0OwotICBpZiAocFVJQ2hpbGQtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9Nb2R1bGVXaWR0aCwgbU1vZHVsZVdpZHRoSGVpZ2h0KSkgewotICAgIHZhbCA9IChpbnQzMl90KW1Nb2R1bGVXaWR0aEhlaWdodC5Ub1VuaXQoWEZBX1VOSVRfUHQpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfTW9kdWxlSGVpZ2h0KGludDMyX3QmIHZhbCkgewotICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOwotICBDWEZBX01lYXN1cmVtZW50IG1Nb2R1bGVXaWR0aEhlaWdodDsKLSAgaWYgKHBVSUNoaWxkLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTW9kdWxlSGVpZ2h0LCBtTW9kdWxlV2lkdGhIZWlnaHQpKSB7Ci0gICAgdmFsID0gKGludDMyX3QpbU1vZHVsZVdpZHRoSGVpZ2h0LlRvVW5pdChYRkFfVU5JVF9QdCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9QcmludENoZWNrc3VtKGJvb2wmIHZhbCkgewotICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOwotICBib29sIGJQcmludENoZWNrRGlnaXQ7Ci0gIGlmIChwVUlDaGlsZC0+VHJ5Qm9vbGVhbihYRkFfQVRUUklCVVRFX1ByaW50Q2hlY2tEaWdpdCwgYlByaW50Q2hlY2tEaWdpdCkpIHsKLSAgICB2YWwgPSBiUHJpbnRDaGVja0RpZ2l0OwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfVGV4dExvY2F0aW9uKGludDMyX3QmIHZhbCkgewotICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOwotICBYRkFfQVRUUklCVVRFRU5VTSBlVGV4dExvY2F0aW9uOwotICBpZiAocFVJQ2hpbGQtPlRyeUVudW0oWEZBX0FUVFJJQlVURV9UZXh0TG9jYXRpb24sIGVUZXh0TG9jYXRpb24pKSB7Ci0gICAgc3dpdGNoIChlVGV4dExvY2F0aW9uKSB7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX05vbmU6Ci0gICAgICAgIHZhbCA9IEJDX1RFWFRfTE9DX05PTkU7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9BYm92ZToKLSAgICAgICAgdmFsID0gQkNfVEVYVF9MT0NfQUJPVkU7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9CZWxvdzoKLSAgICAgICAgdmFsID0gQkNfVEVYVF9MT0NfQkVMT1c7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9BYm92ZUVtYmVkZGVkOgotICAgICAgICB2YWwgPSBCQ19URVhUX0xPQ19BQk9WRUVNQkVEOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQmVsb3dFbWJlZGRlZDoKLSAgICAgICAgdmFsID0gQkNfVEVYVF9MT0NfQkVMT1dFTUJFRDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfV2lkZ2V0RGF0YTo6R2V0QmFyY29kZUF0dHJpYnV0ZV9UcnVuY2F0ZShib29sJiB2YWwpIHsKLSAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsKLSAgYm9vbCBiVHJ1bmNhdGU7Ci0gIGlmIChwVUlDaGlsZC0+VHJ5Qm9vbGVhbihYRkFfQVRUUklCVVRFX1RydW5jYXRlLCBiVHJ1bmNhdGUpKSB7Ci0gICAgdmFsID0gYlRydW5jYXRlOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX1dpZGdldERhdGE6OkdldEJhcmNvZGVBdHRyaWJ1dGVfV2lkZU5hcnJvd1JhdGlvKEZYX0ZMT0FUJiB2YWwpIHsKLSAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IEdldFVJQ2hpbGQoKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NXaWRlTmFycm93UmF0aW87Ci0gIGlmIChwVUlDaGlsZC0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9XaWRlTmFycm93UmF0aW8sIHdzV2lkZU5hcnJvd1JhdGlvKSkgewotICAgIEZYX1NUUlNJWkUgcHRQb3MgPSB3c1dpZGVOYXJyb3dSYXRpby5GaW5kKCc6Jyk7Ci0gICAgRlhfRkxPQVQgZlJhdGlvID0gMDsKLSAgICBpZiAocHRQb3MgPj0gMCkgewotICAgICAgZlJhdGlvID0gKEZYX0ZMT0FUKUZYU1lTX3d0b2kod3NXaWRlTmFycm93UmF0aW8uY19zdHIoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGludDMyX3QgZkEsIGZCOwotICAgICAgZkEgPSBGWFNZU193dG9pKHdzV2lkZU5hcnJvd1JhdGlvLkxlZnQocHRQb3MpLmNfc3RyKCkpOwotICAgICAgZkIgPSBGWFNZU193dG9pKHdzV2lkZU5hcnJvd1JhdGlvLk1pZChwdFBvcyArIDEpLmNfc3RyKCkpOwotICAgICAgaWYgKGZCKQotICAgICAgICBmUmF0aW8gPSAoRlhfRkxPQVQpZkEgLyBmQjsKLSAgICB9Ci0gICAgdmFsID0gZlJhdGlvOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBDWEZBX1dpZGdldERhdGE6OkdldFBhc3N3b3JkQ2hhcihDRlhfV2lkZVN0cmluZyYgd3NQYXNzV29yZCkgewotICBDWEZBX05vZGUqIHBVSUNoaWxkID0gR2V0VUlDaGlsZCgpOwotICBpZiAocFVJQ2hpbGQpIHsKLSAgICBwVUlDaGlsZC0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9QYXNzd29yZENoYXIsIHdzUGFzc1dvcmQpOwotICB9IGVsc2UgewotICAgIHdzUGFzc1dvcmQgPSBHZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWVfQ2RhdGEoWEZBX0VsZW1lbnQ6OlBhc3N3b3JkRWRpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVfUGFzc3dvcmRDaGFyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Gb3JtKTsKLSAgfQotfQotCi1ib29sIENYRkFfV2lkZ2V0RGF0YTo6SXNNdWx0aUxpbmUoKSB7Ci0gIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7Ci0gIGlmIChwVUlDaGlsZCkKLSAgICByZXR1cm4gcFVJQ2hpbGQtPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9NdWx0aUxpbmUpOwotICByZXR1cm4gR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX0Jvb2xlYW4oCi0gICAgICBYRkFfRWxlbWVudDo6VGV4dEVkaXQsIFhGQV9BVFRSSUJVVEVfTXVsdGlMaW5lLCBYRkFfWERQUEFDS0VUX0Zvcm0pOwotfQotCi1pbnQzMl90IENYRkFfV2lkZ2V0RGF0YTo6R2V0VmVydGljYWxTY3JvbGxQb2xpY3koKSB7Ci0gIENYRkFfTm9kZSogcFVJQ2hpbGQgPSBHZXRVSUNoaWxkKCk7Ci0gIGlmIChwVUlDaGlsZCkKLSAgICByZXR1cm4gcFVJQ2hpbGQtPkdldEVudW0oWEZBX0FUVFJJQlVURV9WU2Nyb2xsUG9saWN5KTsKLSAgcmV0dXJuIEdldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9FbnVtKAotICAgICAgWEZBX0VsZW1lbnQ6OlRleHRFZGl0LCBYRkFfQVRUUklCVVRFX1ZTY3JvbGxQb2xpY3ksIFhGQV9YRFBQQUNLRVRfRm9ybSk7Ci19Ci0KLWludDMyX3QgQ1hGQV9XaWRnZXREYXRhOjpHZXRNYXhDaGFycyhYRkFfRWxlbWVudCYgZVR5cGUpIHsKLSAgaWYgKENYRkFfTm9kZSogcE5vZGUgPSBtX3BOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6VmFsdWUpKSB7Ci0gICAgaWYgKENYRkFfTm9kZSogcENoaWxkID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKSkgewotICAgICAgc3dpdGNoIChwQ2hpbGQtPkdldEVsZW1lbnRUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBYRkFfRWxlbWVudDo6VGV4dDoKLSAgICAgICAgICBlVHlwZSA9IFhGQV9FbGVtZW50OjpUZXh0OwotICAgICAgICAgIHJldHVybiBwQ2hpbGQtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9NYXhDaGFycyk7Ci0gICAgICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkV4RGF0YTogewotICAgICAgICAgIGVUeXBlID0gWEZBX0VsZW1lbnQ6OkV4RGF0YTsKLSAgICAgICAgICBpbnQzMl90IGlNYXggPSBwQ2hpbGQtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9NYXhMZW5ndGgpOwotICAgICAgICAgIHJldHVybiBpTWF4IDwgMCA/IDAgOiBpTWF4OwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiAwOwotfQotCi1ib29sIENYRkFfV2lkZ2V0RGF0YTo6R2V0RnJhY0RpZ2l0cyhpbnQzMl90JiBpRnJhY0RpZ2l0cykgewotICBpZiAoQ1hGQV9Ob2RlKiBwTm9kZSA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpWYWx1ZSkpIHsKLSAgICBpZiAoQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBwTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VsZW1lbnQ6OkRlY2ltYWwpKQotICAgICAgcmV0dXJuIHBDaGlsZC0+VHJ5SW50ZWdlcihYRkFfQVRUUklCVVRFX0ZyYWNEaWdpdHMsIGlGcmFjRGlnaXRzKTsKLSAgfQotICBpRnJhY0RpZ2l0cyA9IC0xOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1hGQV9XaWRnZXREYXRhOjpHZXRMZWFkRGlnaXRzKGludDMyX3QmIGlMZWFkRGlnaXRzKSB7Ci0gIGlmIChDWEZBX05vZGUqIHBOb2RlID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VsZW1lbnQ6OlZhbHVlKSkgewotICAgIGlmIChDWEZBX05vZGUqIHBDaGlsZCA9IHBOb2RlLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6RGVjaW1hbCkpCi0gICAgICByZXR1cm4gcENoaWxkLT5UcnlJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfTGVhZERpZ2l0cywgaUxlYWREaWdpdHMpOwotICB9Ci0gIGlMZWFkRGlnaXRzID0gLTE7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBDWEZBX1dpZGdldERhdGE6OlNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkUgZVZhbHVlVHlwZSkgewotICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkpIHsKLSAgICBTeW5jVmFsdWUod3NWYWx1ZSwgdHJ1ZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgbV9iUHJlTnVsbCA9IG1fYklzTnVsbDsKLSAgbV9iSXNOdWxsID0gZmFsc2U7Ci0gIENGWF9XaWRlU3RyaW5nIHdzTmV3VGV4dCh3c1ZhbHVlKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NQaWN0dXJlOwotICBHZXRQaWN0dXJlQ29udGVudCh3c1BpY3R1cmUsIGVWYWx1ZVR5cGUpOwotICBib29sIGJWYWxpZGF0ZSA9IHRydWU7Ci0gIGJvb2wgYlN5bmNEYXRhID0gZmFsc2U7Ci0gIENYRkFfTm9kZSogcE5vZGUgPSBHZXRVSUNoaWxkKCk7Ci0gIGlmICghcE5vZGUpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgWEZBX0VsZW1lbnQgZVR5cGUgPSBwTm9kZS0+R2V0RWxlbWVudFR5cGUoKTsKLSAgaWYgKCF3c1BpY3R1cmUuSXNFbXB0eSgpKSB7Ci0gICAgQ1hGQV9Mb2NhbGVNZ3IqIHBMb2NhbE1nciA9IG1fcE5vZGUtPkdldERvY3VtZW50KCktPkdldExvY2FsTWdyKCk7Ci0gICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldExvY2FsKCk7Ci0gICAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZSA9IFhGQV9HZXRMb2NhbGVWYWx1ZSh0aGlzKTsKLSAgICBiVmFsaWRhdGUgPQotICAgICAgICB3aWRnZXRWYWx1ZS5WYWxpZGF0ZVZhbHVlKHdzVmFsdWUsIHdzUGljdHVyZSwgcExvY2FsZSwgJndzUGljdHVyZSk7Ci0gICAgaWYgKGJWYWxpZGF0ZSkgewotICAgICAgd2lkZ2V0VmFsdWUgPSBDWEZBX0xvY2FsZVZhbHVlKHdpZGdldFZhbHVlLkdldFR5cGUoKSwgd3NOZXdUZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzUGljdHVyZSwgcExvY2FsZSwgcExvY2FsTWdyKTsKLSAgICAgIHdzTmV3VGV4dCA9IHdpZGdldFZhbHVlLkdldFZhbHVlKCk7Ci0gICAgICBpZiAoZVR5cGUgPT0gWEZBX0VsZW1lbnQ6Ok51bWVyaWNFZGl0KSB7Ci0gICAgICAgIGludDMyX3QgaUxlYWREaWdpdHMgPSAwOwotICAgICAgICBpbnQzMl90IGlGcmFjRGlnaXRzID0gMDsKLSAgICAgICAgR2V0TGVhZERpZ2l0cyhpTGVhZERpZ2l0cyk7Ci0gICAgICAgIEdldEZyYWNEaWdpdHMoaUZyYWNEaWdpdHMpOwotICAgICAgICB3c05ld1RleHQgPSBOdW1lcmljTGltaXQod3NOZXdUZXh0LCBpTGVhZERpZ2l0cywgaUZyYWNEaWdpdHMpOwotICAgICAgfQotICAgICAgYlN5bmNEYXRhID0gdHJ1ZTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGVUeXBlID09IFhGQV9FbGVtZW50OjpOdW1lcmljRWRpdCkgewotICAgICAgaWYgKHdzTmV3VGV4dCAhPSBMIjAiKSB7Ci0gICAgICAgIGludDMyX3QgaUxlYWREaWdpdHMgPSAwOwotICAgICAgICBpbnQzMl90IGlGcmFjRGlnaXRzID0gMDsKLSAgICAgICAgR2V0TGVhZERpZ2l0cyhpTGVhZERpZ2l0cyk7Ci0gICAgICAgIEdldEZyYWNEaWdpdHMoaUZyYWNEaWdpdHMpOwotICAgICAgICB3c05ld1RleHQgPSBOdW1lcmljTGltaXQod3NOZXdUZXh0LCBpTGVhZERpZ2l0cywgaUZyYWNEaWdpdHMpOwotICAgICAgfQotICAgICAgYlN5bmNEYXRhID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgaWYgKGVUeXBlICE9IFhGQV9FbGVtZW50OjpOdW1lcmljRWRpdCB8fCBiU3luY0RhdGEpCi0gICAgU3luY1ZhbHVlKHdzTmV3VGV4dCwgdHJ1ZSk7Ci0KLSAgcmV0dXJuIGJWYWxpZGF0ZTsKLX0KLQotYm9vbCBDWEZBX1dpZGdldERhdGE6OkdldFBpY3R1cmVDb250ZW50KENGWF9XaWRlU3RyaW5nJiB3c1BpY3R1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRSBlUGljdHVyZSkgewotICBpZiAoZVBpY3R1cmUgPT0gWEZBX1ZBTFVFUElDVFVSRV9SYXcpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENYRkFfTG9jYWxlVmFsdWUgd2lkZ2V0VmFsdWUgPSBYRkFfR2V0TG9jYWxlVmFsdWUodGhpcyk7Ci0gIHN3aXRjaCAoZVBpY3R1cmUpIHsKLSAgICBjYXNlIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheTogewotICAgICAgaWYgKENYRkFfTm9kZSogcEZvcm1hdCA9IG1fcE5vZGUtPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpGb3JtYXQpKSB7Ci0gICAgICAgIGlmIChDWEZBX05vZGUqIHBQaWN0dXJlID0gcEZvcm1hdC0+R2V0Q2hpbGQoMCwgWEZBX0VsZW1lbnQ6OlBpY3R1cmUpKSB7Ci0gICAgICAgICAgaWYgKHBQaWN0dXJlLT5UcnlDb250ZW50KHdzUGljdHVyZSkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRhUGljdHVyZSwgd3NUaW1lUGljdHVyZTsKLSAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUgPSBHZXRMb2NhbCgpOwotICAgICAgaWYgKCFwTG9jYWxlKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIHVpbnQzMl90IGR3VHlwZSA9IHdpZGdldFZhbHVlLkdldFR5cGUoKTsKLSAgICAgIHN3aXRjaCAoZHdUeXBlKSB7Ci0gICAgICAgIGNhc2UgWEZBX1ZUX0RBVEU6Ci0gICAgICAgICAgcExvY2FsZS0+R2V0RGF0ZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NQaWN0dXJlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBYRkFfVlRfVElNRToKLSAgICAgICAgICBwTG9jYWxlLT5HZXRUaW1lUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1BpY3R1cmUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFhGQV9WVF9EQVRFVElNRToKLSAgICAgICAgICBwTG9jYWxlLT5HZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0RhdGFQaWN0dXJlKTsKLSAgICAgICAgICBwTG9jYWxlLT5HZXRUaW1lUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX01lZGl1bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1RpbWVQaWN0dXJlKTsKLSAgICAgICAgICB3c1BpY3R1cmUgPSB3c0RhdGFQaWN0dXJlICsgTCJUIiArIHdzVGltZVBpY3R1cmU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgWEZBX1ZUX0RFQ0lNQUw6Ci0gICAgICAgIGNhc2UgWEZBX1ZUX0ZMT0FUOgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgY2FzZSBYRkFfVkFMVUVQSUNUVVJFX0VkaXQ6IHsKLSAgICAgIENYRkFfTm9kZSogcFVJID0gbV9wTm9kZS0+R2V0Q2hpbGQoMCwgWEZBX0VsZW1lbnQ6OlVpKTsKLSAgICAgIGlmIChwVUkpIHsKLSAgICAgICAgaWYgKENYRkFfTm9kZSogcFBpY3R1cmUgPSBwVUktPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpQaWN0dXJlKSkgewotICAgICAgICAgIGlmIChwUGljdHVyZS0+VHJ5Q29udGVudCh3c1BpY3R1cmUpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRhUGljdHVyZSwgd3NUaW1lUGljdHVyZTsKLSAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldExvY2FsKCk7Ci0gICAgICAgIGlmICghcExvY2FsZSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICB1aW50MzJfdCBkd1R5cGUgPSB3aWRnZXRWYWx1ZS5HZXRUeXBlKCk7Ci0gICAgICAgIHN3aXRjaCAoZHdUeXBlKSB7Ci0gICAgICAgICAgY2FzZSBYRkFfVlRfREFURToKLSAgICAgICAgICAgIHBMb2NhbGUtPkdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1BpY3R1cmUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBYRkFfVlRfVElNRToKLSAgICAgICAgICAgIHBMb2NhbGUtPkdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c1BpY3R1cmUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBYRkFfVlRfREFURVRJTUU6Ci0gICAgICAgICAgICBwTG9jYWxlLT5HZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NEYXRhUGljdHVyZSk7Ci0gICAgICAgICAgICBwTG9jYWxlLT5HZXRUaW1lUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NUaW1lUGljdHVyZSk7Ci0gICAgICAgICAgICB3c1BpY3R1cmUgPSB3c0RhdGFQaWN0dXJlICsgTCJUIiArIHdzVGltZVBpY3R1cmU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBjYXNlIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQ6IHsKLSAgICAgIGlmIChDWEZBX0JpbmQgYmluZCA9IEdldEJpbmQoKSkgewotICAgICAgICBiaW5kLkdldFBpY3R1cmUod3NQaWN0dXJlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotSUZYX0xvY2FsZSogQ1hGQV9XaWRnZXREYXRhOjpHZXRMb2NhbCgpIHsKLSAgaWYgKCFtX3BOb2RlKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIENGWF9XaWRlU3RyaW5nIHdzTG9jYWxlTmFtZTsKLSAgaWYgKCFtX3BOb2RlLT5HZXRMb2NhbGVOYW1lKHdzTG9jYWxlTmFtZSkpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIGlmICh3c0xvY2FsZU5hbWUgPT0gTCJhbWJpZW50IikKLSAgICByZXR1cm4gbV9wTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0TG9jYWxNZ3IoKS0+R2V0RGVmTG9jYWxlKCk7Ci0gIHJldHVybiBtX3BOb2RlLT5HZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpLT5HZXRMb2NhbGVCeU5hbWUod3NMb2NhbGVOYW1lKTsKLX0KLQotYm9vbCBDWEZBX1dpZGdldERhdGE6OkdldFZhbHVlKENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkUgZVZhbHVlVHlwZSkgewotICB3c1ZhbHVlID0gbV9wTm9kZS0+R2V0Q29udGVudCgpOwotCi0gIGlmIChlVmFsdWVUeXBlID09IFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSkKLSAgICBHZXRJdGVtTGFiZWwod3NWYWx1ZS5Bc1N0cmluZ0MoKSwgd3NWYWx1ZSk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NQaWN0dXJlOwotICBHZXRQaWN0dXJlQ29udGVudCh3c1BpY3R1cmUsIGVWYWx1ZVR5cGUpOwotICBDWEZBX05vZGUqIHBOb2RlID0gR2V0VUlDaGlsZCgpOwotICBpZiAoIXBOb2RlKQotICAgIHJldHVybiB0cnVlOwotCi0gIHN3aXRjaCAoR2V0VUlDaGlsZCgpLT5HZXRFbGVtZW50VHlwZSgpKSB7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6Q2hvaWNlTGlzdDogewotICAgICAgaWYgKGVWYWx1ZVR5cGUgPT0gWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KSB7Ci0gICAgICAgIGludDMyX3QgaVNlbEl0ZW1JbmRleCA9IEdldFNlbGVjdGVkSXRlbSgwKTsKLSAgICAgICAgaWYgKGlTZWxJdGVtSW5kZXggPj0gMCkgewotICAgICAgICAgIEdldENob2ljZUxpc3RJdGVtKHdzVmFsdWUsIGlTZWxJdGVtSW5kZXgpOwotICAgICAgICAgIHdzUGljdHVyZS5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpOdW1lcmljRWRpdDoKLSAgICAgIGlmIChlVmFsdWVUeXBlICE9IFhGQV9WQUxVRVBJQ1RVUkVfUmF3ICYmIHdzUGljdHVyZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldExvY2FsKCk7Ci0gICAgICAgIGlmIChlVmFsdWVUeXBlID09IFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSAmJiBwTG9jYWxlKSB7Ci0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NPdXRwdXQ7Ci0gICAgICAgICAgTm9ybWFsaXplTnVtU3RyKHdzVmFsdWUsIHdzT3V0cHV0KTsKLSAgICAgICAgICBGb3JtYXROdW1TdHIod3NPdXRwdXQsIHBMb2NhbGUsIHdzT3V0cHV0KTsKLSAgICAgICAgICB3c1ZhbHVlID0gd3NPdXRwdXQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICBpZiAod3NQaWN0dXJlLklzRW1wdHkoKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldExvY2FsKCkpIHsKLSAgICBDWEZBX0xvY2FsZVZhbHVlIHdpZGdldFZhbHVlID0gWEZBX0dldExvY2FsZVZhbHVlKHRoaXMpOwotICAgIENYRkFfTG9jYWxlTWdyKiBwTG9jYWxNZ3IgPSBtX3BOb2RlLT5HZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpOwotICAgIHN3aXRjaCAod2lkZ2V0VmFsdWUuR2V0VHlwZSgpKSB7Ci0gICAgICBjYXNlIFhGQV9WVF9EQVRFOiB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZSwgd3NUaW1lOwotICAgICAgICBpZiAoU3BsaXREYXRlVGltZSh3c1ZhbHVlLCB3c0RhdGUsIHdzVGltZSkpIHsKLSAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIGRhdGUoWEZBX1ZUX0RBVEUsIHdzRGF0ZSwgcExvY2FsTWdyKTsKLSAgICAgICAgICBpZiAoZGF0ZS5Gb3JtYXRQYXR0ZXJucyh3c1ZhbHVlLCB3c1BpY3R1cmUsIHBMb2NhbGUsIGVWYWx1ZVR5cGUpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFhGQV9WVF9USU1FOiB7Ci0gICAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZSwgd3NUaW1lOwotICAgICAgICBpZiAoU3BsaXREYXRlVGltZSh3c1ZhbHVlLCB3c0RhdGUsIHdzVGltZSkpIHsKLSAgICAgICAgICBDWEZBX0xvY2FsZVZhbHVlIHRpbWUoWEZBX1ZUX1RJTUUsIHdzVGltZSwgcExvY2FsTWdyKTsKLSAgICAgICAgICBpZiAodGltZS5Gb3JtYXRQYXR0ZXJucyh3c1ZhbHVlLCB3c1BpY3R1cmUsIHBMb2NhbGUsIGVWYWx1ZVR5cGUpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgd2lkZ2V0VmFsdWUuRm9ybWF0UGF0dGVybnMod3NWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLCBlVmFsdWVUeXBlKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDWEZBX1dpZGdldERhdGE6OkdldE5vcm1hbGl6ZURhdGFWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTm9ybWFsaXplVmFsdWUpIHsKLSAgd3NOb3JtYWxpemVWYWx1ZSA9IHdzVmFsdWU7Ci0gIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBDRlhfV2lkZVN0cmluZyB3c1BpY3R1cmU7Ci0gIEdldFBpY3R1cmVDb250ZW50KHdzUGljdHVyZSwgWEZBX1ZBTFVFUElDVFVSRV9EYXRhQmluZCk7Ci0gIGlmICh3c1BpY3R1cmUuSXNFbXB0eSgpKQotICAgIHJldHVybiB0cnVlOwotCi0gIEFTU0VSVChHZXROb2RlKCkpOwotICBDWEZBX0xvY2FsZU1nciogcExvY2FsTWdyID0gR2V0Tm9kZSgpLT5HZXREb2N1bWVudCgpLT5HZXRMb2NhbE1ncigpOwotICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gR2V0TG9jYWwoKTsKLSAgQ1hGQV9Mb2NhbGVWYWx1ZSB3aWRnZXRWYWx1ZSA9IFhGQV9HZXRMb2NhbGVWYWx1ZSh0aGlzKTsKLSAgaWYgKHdpZGdldFZhbHVlLlZhbGlkYXRlVmFsdWUod3NWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLCAmd3NQaWN0dXJlKSkgewotICAgIHdpZGdldFZhbHVlID0gQ1hGQV9Mb2NhbGVWYWx1ZSh3aWRnZXRWYWx1ZS5HZXRUeXBlKCksIHdzTm9ybWFsaXplVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdzUGljdHVyZSwgcExvY2FsZSwgcExvY2FsTWdyKTsKLSAgICB3c05vcm1hbGl6ZVZhbHVlID0gd2lkZ2V0VmFsdWUuR2V0VmFsdWUoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1hGQV9XaWRnZXREYXRhOjpHZXRGb3JtYXREYXRhVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdHRlZFZhbHVlKSB7Ci0gIHdzRm9ybWF0dGVkVmFsdWUgPSB3c1ZhbHVlOwotICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuIHRydWU7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NQaWN0dXJlOwotICBHZXRQaWN0dXJlQ29udGVudCh3c1BpY3R1cmUsIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQpOwotICBpZiAod3NQaWN0dXJlLklzRW1wdHkoKSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICBpZiAoSUZYX0xvY2FsZSogcExvY2FsZSA9IEdldExvY2FsKCkpIHsKLSAgICBBU1NFUlQoR2V0Tm9kZSgpKTsKLSAgICBDWEZBX05vZGUqIHBOb2RlVmFsdWUgPSBHZXROb2RlKCktPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpWYWx1ZSk7Ci0gICAgaWYgKCFwTm9kZVZhbHVlKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgQ1hGQV9Ob2RlKiBwVmFsdWVDaGlsZCA9IHBOb2RlVmFsdWUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsKLSAgICBpZiAoIXBWYWx1ZUNoaWxkKQotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgaW50MzJfdCBpVlRUeXBlID0gWEZBX1ZUX05VTEw7Ci0gICAgc3dpdGNoIChwVmFsdWVDaGlsZC0+R2V0RWxlbWVudFR5cGUoKSkgewotICAgICAgY2FzZSBYRkFfRWxlbWVudDo6RGVjaW1hbDoKLSAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9ERUNJTUFMOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkZsb2F0OgotICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX0ZMT0FUOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkRhdGU6Ci0gICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfREFURTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9FbGVtZW50OjpUaW1lOgotICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX1RJTUU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBYRkFfRWxlbWVudDo6RGF0ZVRpbWU6Ci0gICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfREFURVRJTUU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBYRkFfRWxlbWVudDo6Qm9vbGVhbjoKLSAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9CT09MRUFOOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkludGVnZXI6Ci0gICAgICAgIGlWVFR5cGUgPSBYRkFfVlRfSU5URUdFUjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9FbGVtZW50OjpUZXh0OgotICAgICAgICBpVlRUeXBlID0gWEZBX1ZUX1RFWFQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgaVZUVHlwZSA9IFhGQV9WVF9OVUxMOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgQ1hGQV9Mb2NhbGVNZ3IqIHBMb2NhbE1nciA9IEdldE5vZGUoKS0+R2V0RG9jdW1lbnQoKS0+R2V0TG9jYWxNZ3IoKTsKLSAgICBDWEZBX0xvY2FsZVZhbHVlIHdpZGdldFZhbHVlKGlWVFR5cGUsIHdzVmFsdWUsIHBMb2NhbE1ncik7Ci0gICAgc3dpdGNoICh3aWRnZXRWYWx1ZS5HZXRUeXBlKCkpIHsKLSAgICAgIGNhc2UgWEZBX1ZUX0RBVEU6IHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlLCB3c1RpbWU7Ci0gICAgICAgIGlmIChTcGxpdERhdGVUaW1lKHdzVmFsdWUsIHdzRGF0ZSwgd3NUaW1lKSkgewotICAgICAgICAgIENYRkFfTG9jYWxlVmFsdWUgZGF0ZShYRkFfVlRfREFURSwgd3NEYXRlLCBwTG9jYWxNZ3IpOwotICAgICAgICAgIGlmIChkYXRlLkZvcm1hdFBhdHRlcm5zKHdzRm9ybWF0dGVkVmFsdWUsIHdzUGljdHVyZSwgcExvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBYRkFfVlRfVElNRTogewotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGUsIHdzVGltZTsKLSAgICAgICAgaWYgKFNwbGl0RGF0ZVRpbWUod3NWYWx1ZSwgd3NEYXRlLCB3c1RpbWUpKSB7Ci0gICAgICAgICAgQ1hGQV9Mb2NhbGVWYWx1ZSB0aW1lKFhGQV9WVF9USU1FLCB3c1RpbWUsIHBMb2NhbE1ncik7Ci0gICAgICAgICAgaWYgKHRpbWUuRm9ybWF0UGF0dGVybnMod3NGb3JtYXR0ZWRWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgd2lkZ2V0VmFsdWUuRm9ybWF0UGF0dGVybnMod3NGb3JtYXR0ZWRWYWx1ZSwgd3NQaWN0dXJlLCBwTG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQpOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBDWEZBX1dpZGdldERhdGE6Ok5vcm1hbGl6ZU51bVN0cihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KSB7Ci0gIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkKLSAgICByZXR1cm47Ci0KLSAgd3NPdXRwdXQgPSB3c1ZhbHVlOwotICB3c091dHB1dC5UcmltTGVmdCgnMCcpOwotICBpbnQzMl90IGRvdF9pbmRleCA9IHdzT3V0cHV0LkZpbmQoJy4nKTsKLSAgaW50MzJfdCBpRnJhY0RpZ2l0cyA9IDA7Ci0gIGlmICghd3NPdXRwdXQuSXNFbXB0eSgpICYmIGRvdF9pbmRleCA+PSAwICYmCi0gICAgICAoIUdldEZyYWNEaWdpdHMoaUZyYWNEaWdpdHMpIHx8IGlGcmFjRGlnaXRzICE9IC0xKSkgewotICAgIHdzT3V0cHV0LlRyaW1SaWdodChMIjAiKTsKLSAgICB3c091dHB1dC5UcmltUmlnaHQoTCIuIik7Ci0gIH0KLSAgaWYgKHdzT3V0cHV0LklzRW1wdHkoKSB8fCB3c091dHB1dFswXSA9PSAnLicpCi0gICAgd3NPdXRwdXQuSW5zZXJ0KDAsICcwJyk7Ci19Ci0KLXZvaWQgQ1hGQV9XaWRnZXREYXRhOjpGb3JtYXROdW1TdHIoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c091dHB1dCkgewotICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkpCi0gICAgcmV0dXJuOwotCi0gIENGWF9XaWRlU3RyaW5nIHdzU3JjTnVtID0gd3NWYWx1ZTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NHcm91cFN5bWJvbDsKLSAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX0dyb3VwaW5nLCB3c0dyb3VwU3ltYm9sKTsKLSAgYm9vbCBiTmVnID0gZmFsc2U7Ci0gIGlmICh3c1NyY051bVswXSA9PSAnLScpIHsKLSAgICBiTmVnID0gdHJ1ZTsKLSAgICB3c1NyY051bS5EZWxldGUoMCwgMSk7Ci0gIH0KLSAgaW50MzJfdCBsZW4gPSB3c1NyY051bS5HZXRMZW5ndGgoKTsKLSAgaW50MzJfdCBkb3RfaW5kZXggPSB3c1NyY051bS5GaW5kKCcuJyk7Ci0gIGlmIChkb3RfaW5kZXggPT0gLTEpCi0gICAgZG90X2luZGV4ID0gbGVuOwotCi0gIGludDMyX3QgY2MgPSBkb3RfaW5kZXggLSAxOwotICBpZiAoY2MgPj0gMCkgewotICAgIGludCBuUG9zID0gZG90X2luZGV4ICUgMzsKLSAgICB3c091dHB1dC5jbGVhcigpOwotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGRvdF9pbmRleDsgaSsrKSB7Ci0gICAgICBpZiAoaSAlIDMgPT0gblBvcyAmJiBpICE9IDApCi0gICAgICAgIHdzT3V0cHV0ICs9IHdzR3JvdXBTeW1ib2w7Ci0KLSAgICAgIHdzT3V0cHV0ICs9IHdzU3JjTnVtW2ldOwotICAgIH0KLSAgICBpZiAoZG90X2luZGV4IDwgbGVuKSB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbDsKLSAgICAgIHBMb2NhbGUtPkdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTF9EZWNpbWFsLCB3c1N5bWJvbCk7Ci0gICAgICB3c091dHB1dCArPSB3c1N5bWJvbDsKLSAgICAgIHdzT3V0cHV0ICs9IHdzU3JjTnVtLlJpZ2h0KGxlbiAtIGRvdF9pbmRleCAtIDEpOwotICAgIH0KLSAgICBpZiAoYk5lZykgewotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NNaW51c3ltYm9sOwotICAgICAgcExvY2FsZS0+R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MX01pbnVzLCB3c01pbnVzeW1ib2wpOwotICAgICAgd3NPdXRwdXQgPSB3c01pbnVzeW1ib2wgKyB3c091dHB1dDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDWEZBX1dpZGdldERhdGE6OlN5bmNWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgYm9vbCBiTm90aWZ5KSB7Ci0gIGlmICghbV9wTm9kZSkKLSAgICByZXR1cm47Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NGb3JtYXRWYWx1ZSh3c1ZhbHVlKTsKLSAgQ1hGQV9XaWRnZXREYXRhKiBwQ29udGFpbmVyV2lkZ2V0RGF0YSA9IG1fcE5vZGUtPkdldENvbnRhaW5lcldpZGdldERhdGEoKTsKLSAgaWYgKHBDb250YWluZXJXaWRnZXREYXRhKQotICAgIHBDb250YWluZXJXaWRnZXREYXRhLT5HZXRGb3JtYXREYXRhVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXRWYWx1ZSk7Ci0KLSAgbV9wTm9kZS0+U2V0Q29udGVudCh3c1ZhbHVlLCB3c0Zvcm1hdFZhbHVlLCBiTm90aWZ5KTsKLX0KLQotdm9pZCBDWEZBX1dpZGdldERhdGE6Okluc2VydExpc3RUZXh0SXRlbShDWEZBX05vZGUqIHBJdGVtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXgpIHsKLSAgQ1hGQV9Ob2RlKiBwVGV4dCA9IHBJdGVtcy0+Q3JlYXRlU2FtZVBhY2tldE5vZGUoWEZBX0VsZW1lbnQ6OlRleHQpOwotICBwSXRlbXMtPkluc2VydENoaWxkKG5JbmRleCwgcFRleHQpOwotICBwVGV4dC0+U2V0Q29udGVudCh3c1RleHQsIHdzVGV4dCwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENYRkFfV2lkZ2V0RGF0YTo6TnVtZXJpY0xpbWl0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVRyZWFkKSBjb25zdCB7Ci0gIGlmICgoaUxlYWQgPT0gLTEpICYmIChpVHJlYWQgPT0gLTEpKQotICAgIHJldHVybiB3c1ZhbHVlOwotCi0gIENGWF9XaWRlU3RyaW5nIHdzUmV0OwotICBpbnQzMl90IGlMZWFkXyA9IDAsIGlUcmVhZF8gPSAtMTsKLSAgaW50MzJfdCBpQ291bnQgPSB3c1ZhbHVlLkdldExlbmd0aCgpOwotICBpZiAoaUNvdW50ID09IDApCi0gICAgcmV0dXJuIHdzVmFsdWU7Ci0KLSAgaW50MzJfdCBpID0gMDsKLSAgaWYgKHdzVmFsdWVbaV0gPT0gTCctJykgewotICAgIHdzUmV0ICs9IEwnLSc7Ci0gICAgaSsrOwotICB9Ci0gIGZvciAoOyBpIDwgaUNvdW50OyBpKyspIHsKLSAgICBGWF9XQ0hBUiB3YyA9IHdzVmFsdWVbaV07Ci0gICAgaWYgKEZYU1lTX2lzRGVjaW1hbERpZ2l0KHdjKSkgewotICAgICAgaWYgKGlMZWFkID49IDApIHsKLSAgICAgICAgaUxlYWRfKys7Ci0gICAgICAgIGlmIChpTGVhZF8gPiBpTGVhZCkKLSAgICAgICAgICByZXR1cm4gTCIwIjsKLSAgICAgIH0gZWxzZSBpZiAoaVRyZWFkXyA+PSAwKSB7Ci0gICAgICAgIGlUcmVhZF8rKzsKLSAgICAgICAgaWYgKGlUcmVhZF8gPiBpVHJlYWQpIHsKLSAgICAgICAgICBpZiAoaVRyZWFkICE9IC0xKSB7Ci0gICAgICAgICAgICBDRlhfRGVjaW1hbCB3c0RlY2kgPSBDRlhfRGVjaW1hbCh3c1ZhbHVlLkFzU3RyaW5nQygpKTsKLSAgICAgICAgICAgIHdzRGVjaS5TZXRTY2FsZShpVHJlYWQpOwotICAgICAgICAgICAgd3NSZXQgPSB3c0RlY2k7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiB3c1JldDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSBpZiAod2MgPT0gTCcuJykgewotICAgICAgaVRyZWFkXyA9IDA7Ci0gICAgICBpTGVhZCA9IC0xOwotICAgIH0KLSAgICB3c1JldCArPSB3YzsKLSAgfQotICByZXR1cm4gd3NSZXQ7Ci19CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV93aWRnZXRkYXRhLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV93aWRnZXRkYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNWRiM2IuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2lkZ2V0ZGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9XSURHRVREQVRBX0hfCi0jZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1dJREdFVERBVEFfSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3RyaW5nLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9hc3Npc3QuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9iaW5kLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYm9yZGVyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2FsY3VsYXRlLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY2FwdGlvbi5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGEuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9mb250LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWFyZ2luLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFyYS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZhbGlkYXRlLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKLQotZW51bSBYRkFfQ0hFQ0tTVEFURSB7Ci0gIFhGQV9DSEVDS1NUQVRFX09uID0gMCwKLSAgWEZBX0NIRUNLU1RBVEVfT2ZmID0gMSwKLSAgWEZBX0NIRUNLU1RBVEVfTmV1dHJhbCA9IDIsCi19OwotCi1lbnVtIFhGQV9WQUxVRVBJQ1RVUkUgewotICBYRkFfVkFMVUVQSUNUVVJFX1JhdyA9IDAsCi0gIFhGQV9WQUxVRVBJQ1RVUkVfRGlzcGxheSwKLSAgWEZBX1ZBTFVFUElDVFVSRV9FZGl0LAotICBYRkFfVkFMVUVQSUNUVVJFX0RhdGFCaW5kLAotfTsKLQotY2xhc3MgQ1hGQV9Ob2RlOwotY2xhc3MgSUZYX0xvY2FsZTsKLQotY2xhc3MgQ1hGQV9XaWRnZXREYXRhIDogcHVibGljIENYRkFfRGF0YSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDWEZBX1dpZGdldERhdGEoQ1hGQV9Ob2RlKiBwTm9kZSk7Ci0KLSAgQ1hGQV9Ob2RlKiBHZXRVSUNoaWxkKCk7Ci0gIFhGQV9FbGVtZW50IEdldFVJVHlwZSgpOwotICBDRlhfV2lkZVN0cmluZyBHZXRSYXdWYWx1ZSgpOwotICBpbnQzMl90IEdldEFjY2Vzcyhib29sIGJUZW1wbGF0ZSA9IGZhbHNlKTsKLSAgaW50MzJfdCBHZXRSb3RhdGUoKTsKLSAgQ1hGQV9Cb3JkZXIgR2V0Qm9yZGVyKGJvb2wgYk1vZGlmaWVkID0gZmFsc2UpOwotICBDWEZBX0NhcHRpb24gR2V0Q2FwdGlvbihib29sIGJNb2RpZmllZCA9IGZhbHNlKTsKLSAgQ1hGQV9Gb250IEdldEZvbnQoYm9vbCBiTW9kaWZpZWQgPSBmYWxzZSk7Ci0gIENYRkFfTWFyZ2luIEdldE1hcmdpbihib29sIGJNb2RpZmllZCA9IGZhbHNlKTsKLSAgQ1hGQV9QYXJhIEdldFBhcmEoYm9vbCBiTW9kaWZpZWQgPSBmYWxzZSk7Ci0gIHZvaWQgR2V0RXZlbnRMaXN0KENYRkFfTm9kZUFycmF5JiBldmVudHMpOwotICBpbnQzMl90IEdldEV2ZW50QnlBY3Rpdml0eShpbnQzMl90IGlBY3Rpdml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkmIGV2ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXNGb3JtUmVhZHkgPSBmYWxzZSk7Ci0gIENYRkFfVmFsdWUgR2V0RGVmYXVsdFZhbHVlKGJvb2wgYk1vZGlmaWVkID0gZmFsc2UpOwotICBDWEZBX1ZhbHVlIEdldEZvcm1WYWx1ZShib29sIGJNb2RpZmllZCA9IGZhbHNlKTsKLSAgQ1hGQV9DYWxjdWxhdGUgR2V0Q2FsY3VsYXRlKGJvb2wgYk1vZGlmaWVkID0gZmFsc2UpOwotICBDWEZBX1ZhbGlkYXRlIEdldFZhbGlkYXRlKGJvb2wgYk1vZGlmaWVkID0gZmFsc2UpOwotICBDWEZBX0JpbmQgR2V0QmluZChib29sIGJNb2RpZmllZCA9IGZhbHNlKTsKLSAgQ1hGQV9Bc3Npc3QgR2V0QXNzaXN0KGJvb2wgYk1vZGlmaWVkID0gZmFsc2UpOwotICBib29sIEdldFdpZHRoKEZYX0ZMT0FUJiBmV2lkdGgpOwotICBib29sIEdldEhlaWdodChGWF9GTE9BVCYgZkhlaWdodCk7Ci0gIGJvb2wgR2V0TWluV2lkdGgoRlhfRkxPQVQmIGZNaW5XaWR0aCk7Ci0gIGJvb2wgR2V0TWluSGVpZ2h0KEZYX0ZMT0FUJiBmTWluSGVpZ2h0KTsKLSAgYm9vbCBHZXRNYXhXaWR0aChGWF9GTE9BVCYgZk1heFdpZHRoKTsKLSAgYm9vbCBHZXRNYXhIZWlnaHQoRlhfRkxPQVQmIGZNYXhIZWlnaHQpOwotICBDWEZBX0JvcmRlciBHZXRVSUJvcmRlcigpOwotICBDRlhfUmVjdEYgR2V0VUlNYXJnaW4oKTsKLSAgaW50MzJfdCBHZXRCdXR0b25IaWdobGlnaHQoKTsKLSAgYm9vbCBHZXRCdXR0b25Sb2xsb3ZlcihDRlhfV2lkZVN0cmluZyYgd3NSb2xsb3ZlciwgYm9vbCYgYlJpY2hUZXh0KTsKLSAgYm9vbCBHZXRCdXR0b25Eb3duKENGWF9XaWRlU3RyaW5nJiB3c0Rvd24sIGJvb2wmIGJSaWNoVGV4dCk7Ci0gIGludDMyX3QgR2V0Q2hlY2tCdXR0b25TaGFwZSgpOwotICBpbnQzMl90IEdldENoZWNrQnV0dG9uTWFyaygpOwotICBGWF9GTE9BVCBHZXRDaGVja0J1dHRvblNpemUoKTsKLSAgYm9vbCBJc0FsbG93TmV1dHJhbCgpOwotICBib29sIElzUmFkaW9CdXR0b24oKTsKLSAgWEZBX0NIRUNLU1RBVEUgR2V0Q2hlY2tTdGF0ZSgpOwotICB2b2lkIFNldENoZWNrU3RhdGUoWEZBX0NIRUNLU1RBVEUgZUNoZWNrU3RhdGUsIGJvb2wgYk5vdGlmeSk7Ci0gIENYRkFfTm9kZSogR2V0RXhjbEdyb3VwTm9kZSgpOwotICBDWEZBX05vZGUqIEdldFNlbGVjdGVkTWVtYmVyKCk7Ci0gIENYRkFfTm9kZSogU2V0U2VsZWN0ZWRNZW1iZXIoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsIGJvb2wgYk5vdGlmeSk7Ci0gIHZvaWQgU2V0U2VsZWN0ZWRNZW1iZXJCeVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTY3JpcHRNb2RpZnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlN5bmNEYXRhKTsKLSAgQ1hGQV9Ob2RlKiBHZXRFeGNsR3JvdXBGaXJzdE1lbWJlcigpOwotICBDWEZBX05vZGUqIEdldEV4Y2xHcm91cE5leHRNZW1iZXIoQ1hGQV9Ob2RlKiBwTm9kZSk7Ci0gIGludDMyX3QgR2V0Q2hvaWNlTGlzdENvbW1pdE9uKCk7Ci0gIGJvb2wgSXNDaG9pY2VMaXN0QWxsb3dUZXh0RW50cnkoKTsKLSAgaW50MzJfdCBHZXRDaG9pY2VMaXN0T3BlbigpOwotICBib29sIElzTGlzdEJveCgpOwotICBpbnQzMl90IENvdW50Q2hvaWNlTGlzdEl0ZW1zKGJvb2wgYlNhdmVWYWx1ZSA9IGZhbHNlKTsKLSAgYm9vbCBHZXRDaG9pY2VMaXN0SXRlbShDRlhfV2lkZVN0cmluZyYgd3NUZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNhdmVWYWx1ZSA9IGZhbHNlKTsKLSAgdm9pZCBHZXRDaG9pY2VMaXN0SXRlbXMoc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+JiB3c1RleHRBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2F2ZVZhbHVlID0gZmFsc2UpOwotICBpbnQzMl90IENvdW50U2VsZWN0ZWRJdGVtcygpOwotICBpbnQzMl90IEdldFNlbGVjdGVkSXRlbShpbnQzMl90IG5JbmRleCA9IDApOwotICB2b2lkIEdldFNlbGVjdGVkSXRlbXMoQ0ZYX0FycmF5VGVtcGxhdGU8aW50MzJfdD4mIGlTZWxBcnJheSk7Ci0gIHZvaWQgR2V0U2VsZWN0ZWRJdGVtc1ZhbHVlKHN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nPiYgd3NTZWxUZXh0QXJyYXkpOwotICBib29sIEdldEl0ZW1TdGF0ZShpbnQzMl90IG5JbmRleCk7Ci0gIHZvaWQgU2V0SXRlbVN0YXRlKGludDMyX3QgbkluZGV4LAotICAgICAgICAgICAgICAgICAgICBib29sIGJTZWxlY3RlZCwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5LAotICAgICAgICAgICAgICAgICAgICBib29sIGJTY3JpcHRNb2RpZnksCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgYlN5bmNEYXRhKTsKLSAgdm9pZCBTZXRTZWxlY3RlZEl0ZW1zKENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+JiBpU2VsQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGJOb3RpZnksCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTY3JpcHRNb2RpZnksCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTeW5jRGF0YSk7Ci0gIHZvaWQgQ2xlYXJBbGxTZWxlY3Rpb25zKCk7Ci0gIHZvaWQgSW5zZXJ0SXRlbShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NMYWJlbCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLAotICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW5kZXggPSAtMSwKLSAgICAgICAgICAgICAgICAgIGJvb2wgYk5vdGlmeSA9IGZhbHNlKTsKLSAgdm9pZCBHZXRJdGVtTGFiZWwoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlLCBDRlhfV2lkZVN0cmluZyYgd3NMYWJlbCk7Ci0gIHZvaWQgR2V0SXRlbVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NMYWJlbCwgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUpOwotICBib29sIERlbGV0ZUl0ZW0oaW50MzJfdCBuSW5kZXgsCi0gICAgICAgICAgICAgICAgICBib29sIGJOb3RpZnkgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgIGJvb2wgYlNjcmlwdE1vZGlmeSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgYm9vbCBiU3luY0RhdGEgPSB0cnVlKTsKLSAgaW50MzJfdCBHZXRIb3Jpem9udGFsU2Nyb2xsUG9saWN5KCk7Ci0gIGludDMyX3QgR2V0TnVtYmVyT2ZDZWxscygpOwotICBib29sIFNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFIGVWYWx1ZVR5cGUpOwotICBib29sIEdldFBpY3R1cmVDb250ZW50KENGWF9XaWRlU3RyaW5nJiB3c1BpY3R1cmUsIFhGQV9WQUxVRVBJQ1RVUkUgZVBpY3R1cmUpOwotICBJRlhfTG9jYWxlKiBHZXRMb2NhbCgpOwotICBib29sIEdldFZhbHVlKENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLCBYRkFfVkFMVUVQSUNUVVJFIGVWYWx1ZVR5cGUpOwotICBib29sIEdldE5vcm1hbGl6ZURhdGFWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTm9ybWFsaXplVmFsdWUpOwotICBib29sIEdldEZvcm1hdERhdGFWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0dGVkVmFsdWUpOwotICB2b2lkIE5vcm1hbGl6ZU51bVN0cihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KTsKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0QmFyY29kZVR5cGUoKTsKLSAgYm9vbCBHZXRCYXJjb2RlQXR0cmlidXRlX0NoYXJFbmNvZGluZyhpbnQzMl90JiB2YWwpOwotICBib29sIEdldEJhcmNvZGVBdHRyaWJ1dGVfQ2hlY2tzdW0oYm9vbCYgdmFsKTsKLSAgYm9vbCBHZXRCYXJjb2RlQXR0cmlidXRlX0RhdGFMZW5ndGgoaW50MzJfdCYgdmFsKTsKLSAgYm9vbCBHZXRCYXJjb2RlQXR0cmlidXRlX1N0YXJ0Q2hhcihGWF9DSEFSJiB2YWwpOwotICBib29sIEdldEJhcmNvZGVBdHRyaWJ1dGVfRW5kQ2hhcihGWF9DSEFSJiB2YWwpOwotICBib29sIEdldEJhcmNvZGVBdHRyaWJ1dGVfRUNMZXZlbChpbnQzMl90JiB2YWwpOwotICBib29sIEdldEJhcmNvZGVBdHRyaWJ1dGVfTW9kdWxlV2lkdGgoaW50MzJfdCYgdmFsKTsKLSAgYm9vbCBHZXRCYXJjb2RlQXR0cmlidXRlX01vZHVsZUhlaWdodChpbnQzMl90JiB2YWwpOwotICBib29sIEdldEJhcmNvZGVBdHRyaWJ1dGVfUHJpbnRDaGVja3N1bShib29sJiB2YWwpOwotICBib29sIEdldEJhcmNvZGVBdHRyaWJ1dGVfVGV4dExvY2F0aW9uKGludDMyX3QmIHZhbCk7Ci0gIGJvb2wgR2V0QmFyY29kZUF0dHJpYnV0ZV9UcnVuY2F0ZShib29sJiB2YWwpOwotICBib29sIEdldEJhcmNvZGVBdHRyaWJ1dGVfV2lkZU5hcnJvd1JhdGlvKEZYX0ZMT0FUJiB2YWwpOwotICB2b2lkIEdldFBhc3N3b3JkQ2hhcihDRlhfV2lkZVN0cmluZyYgd3NQYXNzV29yZCk7Ci0gIGJvb2wgSXNNdWx0aUxpbmUoKTsKLSAgaW50MzJfdCBHZXRWZXJ0aWNhbFNjcm9sbFBvbGljeSgpOwotICBpbnQzMl90IEdldE1heENoYXJzKFhGQV9FbGVtZW50JiBlVHlwZSk7Ci0gIGJvb2wgR2V0RnJhY0RpZ2l0cyhpbnQzMl90JiBpRnJhY0RpZ2l0cyk7Ci0gIGJvb2wgR2V0TGVhZERpZ2l0cyhpbnQzMl90JiBpTGVhZERpZ2l0cyk7Ci0KLSAgQ0ZYX1dpZGVTdHJpbmcgTnVtZXJpY0xpbWl0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVRyZWFkKSBjb25zdDsKLQotICBib29sIG1fYklzTnVsbDsKLSAgYm9vbCBtX2JQcmVOdWxsOwotCi0gcHJvdGVjdGVkOgotICB2b2lkIFN5bmNWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgYm9vbCBiTm90aWZ5KTsKLSAgdm9pZCBJbnNlcnRMaXN0VGV4dEl0ZW0oQ1hGQV9Ob2RlKiBwSXRlbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkluZGV4ID0gLTEpOwotICB2b2lkIEZvcm1hdE51bVN0cihjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzT3V0cHV0KTsKLQotICBDWEZBX05vZGUqIG1fcFVpQ2hpbGROb2RlOwotICBYRkFfRWxlbWVudCBtX2VVSVR5cGU7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1dJREdFVERBVEFfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3dpbmRvdy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV93aW5kb3cuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNDg1ZjYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV93aW5kb3cuY3BwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3dpbmRvdy5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsICh2b2lkKikwfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwid2luZG93IjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfV2luZG93OjpDWEZBX1dpbmRvdyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlViwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6V2luZG93LAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfV2luZG93Ojp+Q1hGQV9XaW5kb3coKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2luZG93LmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV93aW5kb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTJiYzY4Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd2luZG93LmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1dJTkRPV19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9XSU5ET1dfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9XaW5kb3cgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfV2luZG93KENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfV2luZG93KCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1dJTkRPV19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd3NkbGFkZHJlc3MuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd3NkbGFkZHJlc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOWJiNjYKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV93c2RsYWRkcmVzcy5jcHAKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd3NkbGFkZHJlc3MuaCIKKworI2luY2x1ZGUgImZ4anMveGZhL2NqeF93c2RsYWRkcmVzcy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OklkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMIndzZGxBZGRyZXNzIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfV3NkbEFkZHJlc3M6OkNYRkFfV3NkbEFkZHJlc3MoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OlRleHROb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpXc2RsQWRkcmVzcywKKyAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfV3NkbEFkZHJlc3M+KHRoaXMpKSB7fQorCitDWEZBX1dzZGxBZGRyZXNzOjp+Q1hGQV9Xc2RsQWRkcmVzcygpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV93c2RsYWRkcmVzcy5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd3NkbGFkZHJlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2M5NjVjCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd3NkbGFkZHJlc3MuaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfV1NETEFERFJFU1NfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfV1NETEFERFJFU1NfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9Xc2RsQWRkcmVzcyA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9Xc2RsQWRkcmVzcyhDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1dzZGxBZGRyZXNzKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1dTRExBRERSRVNTX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV93c2RsY29ubmVjdGlvbi5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV93c2RsY29ubmVjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE1OWY0OQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3dzZGxjb25uZWN0aW9uLmNwcApAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV93c2RsY29ubmVjdGlvbi5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3dzZGxjb25uZWN0aW9uLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7CisgICAge1hGQV9FbGVtZW50OjpPcGVyYXRpb24sIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6V3NkbEFkZHJlc3MsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6U29hcEFkZHJlc3MsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6U29hcEFjdGlvbiwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpFZmZlY3RpdmVPdXRwdXRQb2xpY3ksIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6RWZmZWN0aXZlSW5wdXRQb2xpY3ksIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkRhdGFEZXNjcmlwdGlvbiwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX0F0dHJpYnV0ZVR5cGU6OkludGVnZXIsIG51bGxwdHJ9fTsKKworY29uc3RleHByIHdjaGFyX3Qga05hbWVbXSA9IEwid3NkbENvbm5lY3Rpb24iOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9Xc2RsQ29ubmVjdGlvbjo6Q1hGQV9Xc2RsQ29ubmVjdGlvbihDWEZBX0RvY3VtZW50KiBkb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6V3NkbENvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAga1Byb3BlcnR5RGF0YSwKKyAgICAgICAgICAgICAgICBrQXR0cmlidXRlRGF0YSwKKyAgICAgICAgICAgICAgICBrTmFtZSwKKyAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q0pYX1dzZGxDb25uZWN0aW9uPih0aGlzKSkge30KKworQ1hGQV9Xc2RsQ29ubmVjdGlvbjo6fkNYRkFfV3NkbENvbm5lY3Rpb24oKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfd3NkbGNvbm5lY3Rpb24uaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3dzZGxjb25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzNDljZgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3dzZGxjb25uZWN0aW9uLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1dTRExDT05ORUNUSU9OX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1dTRExDT05ORUNUSU9OX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfV3NkbENvbm5lY3Rpb24gOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfV3NkbENvbm5lY3Rpb24oQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9Xc2RsQ29ubmVjdGlvbigpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9XU0RMQ09OTkVDVElPTl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeGRjLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3hkYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFhZWJjOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3hkYy5jcHAKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeGRjLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6OlVyaSwgMSwgMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1hGQV9FbGVtZW50OjpYc2wsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInhkYyI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1hkYzo6Q1hGQV9YZGMoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICAoWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1hkYyksCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok1vZGVsTm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6WGRjLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfWGRjOjp+Q1hGQV9YZGMoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeGRjLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV94ZGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWI0M2Q1Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeGRjLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1hEQ19IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9YRENfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9YZGMgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfWGRjKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfWGRjKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1hEQ19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeGRwLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3hkcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwMGFlOAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3hkcC5jcHAKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeGRwLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHt7WEZBX0VsZW1lbnQ6OlBhY2tldHMsIDEsIDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYRkFfRWxlbWVudDo6VW5rbm93biwgMCwgMH19OworY29uc3QgQ1hGQV9Ob2RlOjpBdHRyaWJ1dGVEYXRhIGtBdHRyaWJ1dGVEYXRhW10gPSB7CisgICAge1hGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCAodm9pZCopMH0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInhkcCI7CisKK30gIC8vIG5hbWVzcGFjZQorCitDWEZBX1hkcDo6Q1hGQV9YZHAoQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpCisgICAgOiBDWEZBX05vZGUoZG9jLAorICAgICAgICAgICAgICAgIHBhY2tldCwKKyAgICAgICAgICAgICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6WGRwLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUpIHt9CisKK0NYRkFfWGRwOjp+Q1hGQV9YZHAoKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeGRwLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV94ZHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGI0NTBlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeGRwLmgKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1hEUF9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9YRFBfSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9YZHAgOiBwdWJsaWMgQ1hGQV9Ob2RlIHsKKyBwdWJsaWM6CisgIENYRkFfWGRwKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfWGRwKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1hEUF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeGZhLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3hmYS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VhYjg5OAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3hmYS5jcHAKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeGZhLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfeGZhLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6VGltZVN0YW1wLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVdWlkLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJ4ZmEiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9YZmE6OkNYRkFfWGZhKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9YRFAsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok1vZGVsTm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6WGZhLAorICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9YZmE+KHRoaXMpKSB7fQorCitDWEZBX1hmYTo6fkNYRkFfWGZhKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3hmYS5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeGZhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM3YjYwMQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3hmYS5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9YRkFfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfWEZBX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfWGZhIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1hmYShDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1hmYSgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9YRkFfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3htbF9wYXJzZXIuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeG1sX3BhcnNlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMDIwMjIuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeG1sX3BhcnNlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeG1sX3BhcnNlci5oIgotCi1DWEZBX1hNTFBhcnNlcjo6Q1hGQV9YTUxQYXJzZXIoQ0ZERV9YTUxOb2RlKiBwUm9vdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmV0YWluUHRyPElGR0FTX1N0cmVhbT4mIHBTdHJlYW0pCi0gICAgOiBtX25FbGVtZW50U3RhcnQoMCksCi0gICAgICBtX2R3Q2hlY2tTdGF0dXMoMCksCi0gICAgICBtX2R3Q3VycmVudENoZWNrU3RhdHVzKDApLAotICAgICAgbV9wUm9vdChwUm9vdCksCi0gICAgICBtX3BTdHJlYW0ocFN0cmVhbSksCi0gICAgICBtX3BQYXJzZXIobmV3IENGREVfWE1MU3ludGF4UGFyc2VyKSwKLSAgICAgIG1fcFBhcmVudChwUm9vdCksCi0gICAgICBtX3BDaGlsZChudWxscHRyKSwKLSAgICAgIG1fTm9kZVN0YWNrKDE2KSwKLSAgICAgIG1fc3ludGF4UGFyc2VyUmVzdWx0KEZERV9YbWxTeW50YXhSZXN1bHQ6Ok5vbmUpIHsKLSAgQVNTRVJUKG1fcFBhcmVudCAmJiBtX3BTdHJlYW0pOwotICBtX05vZGVTdGFjay5QdXNoKG1fcFBhcmVudCk7Ci0gIG1fcFBhcnNlci0+SW5pdChtX3BTdHJlYW0sIDMyICogMTAyNCwgMTAyNCAqIDEwMjQpOwotfQotCi1DWEZBX1hNTFBhcnNlcjo6fkNYRkFfWE1MUGFyc2VyKCkgewotICBtX05vZGVTdGFjay5SZW1vdmVBbGwoZmFsc2UpOwotICBtX3dzMS5jbGVhcigpOwotICBtX3dzMi5jbGVhcigpOwotfQotCi1pbnQzMl90IENYRkFfWE1MUGFyc2VyOjpEb1BhcnNlcihJRlhfUGF1c2UqIHBQYXVzZSkgewotICBpZiAobV9zeW50YXhQYXJzZXJSZXN1bHQgPT0gRkRFX1htbFN5bnRheFJlc3VsdDo6RXJyb3IpCi0gICAgcmV0dXJuIC0xOwotICBpZiAobV9zeW50YXhQYXJzZXJSZXN1bHQgPT0gRkRFX1htbFN5bnRheFJlc3VsdDo6RW5kT2ZTdHJpbmcpCi0gICAgcmV0dXJuIDEwMDsKLQotICBpbnQzMl90IGlDb3VudCA9IDA7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgbV9zeW50YXhQYXJzZXJSZXN1bHQgPSBtX3BQYXJzZXItPkRvU3ludGF4UGFyc2UoKTsKLSAgICBzd2l0Y2ggKG1fc3ludGF4UGFyc2VyUmVzdWx0KSB7Ci0gICAgICBjYXNlIEZERV9YbWxTeW50YXhSZXN1bHQ6Okluc3RydWN0aW9uT3BlbjoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZERV9YbWxTeW50YXhSZXN1bHQ6Okluc3RydWN0aW9uQ2xvc2U6Ci0gICAgICAgIGlmIChtX3BDaGlsZCkgewotICAgICAgICAgIGlmIChtX3BDaGlsZC0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7Ci0gICAgICAgICAgICBtX3N5bnRheFBhcnNlclJlc3VsdCA9IEZERV9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1fcENoaWxkID0gbV9wUGFyZW50OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudE9wZW46Ci0gICAgICAgIGlmIChtX2R3Q2hlY2tTdGF0dXMgIT0gMHgwMyAmJiBtX05vZGVTdGFjay5HZXRTaXplKCkgPT0gMikgewotICAgICAgICAgIG1fbkVsZW1lbnRTdGFydCA9IG1fcFBhcnNlci0+R2V0Q3VycmVudFBvcygpIC0gMTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudEJyZWFrOgotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX1htbFN5bnRheFJlc3VsdDo6RWxlbWVudENsb3NlOgotICAgICAgICBpZiAobV9wQ2hpbGQtPkdldFR5cGUoKSAhPSBGREVfWE1MTk9ERV9FbGVtZW50KSB7Ci0gICAgICAgICAgbV9zeW50YXhQYXJzZXJSZXN1bHQgPSBGREVfWG1sU3ludGF4UmVzdWx0OjpFcnJvcjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtX3BQYXJzZXItPkdldFRhZ05hbWUobV93czEpOwotICAgICAgICBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihtX3BDaGlsZCktPkdldFRhZ05hbWUobV93czIpOwotICAgICAgICBpZiAobV93czEuR2V0TGVuZ3RoKCkgPiAwICYmIG1fd3MxICE9IG1fd3MyKSB7Ci0gICAgICAgICAgbV9zeW50YXhQYXJzZXJSZXN1bHQgPSBGREVfWG1sU3ludGF4UmVzdWx0OjpFcnJvcjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtX05vZGVTdGFjay5Qb3AoKTsKLSAgICAgICAgaWYgKG1fTm9kZVN0YWNrLkdldFNpemUoKSA8IDEpIHsKLSAgICAgICAgICBtX3N5bnRheFBhcnNlclJlc3VsdCA9IEZERV9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYgKG1fZHdDdXJyZW50Q2hlY2tTdGF0dXMgIT0gMCAmJiBtX05vZGVTdGFjay5HZXRTaXplKCkgPT0gMikgewotICAgICAgICAgIG1fblNpemVbbV9kd0N1cnJlbnRDaGVja1N0YXR1cyAtIDFdID0KLSAgICAgICAgICAgICAgbV9wUGFyc2VyLT5HZXRDdXJyZW50QmluYXJ5UG9zKCkgLQotICAgICAgICAgICAgICBtX25TdGFydFttX2R3Q3VycmVudENoZWNrU3RhdHVzIC0gMV07Ci0gICAgICAgICAgbV9kd0N1cnJlbnRDaGVja1N0YXR1cyA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBtX3BQYXJlbnQgPSBzdGF0aWNfY2FzdDxDRkRFX1hNTE5vZGUqPigqbV9Ob2RlU3RhY2suR2V0VG9wRWxlbWVudCgpKTsKLSAgICAgICAgbV9wQ2hpbGQgPSBtX3BQYXJlbnQ7Ci0gICAgICAgIGlDb3VudCsrOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX1htbFN5bnRheFJlc3VsdDo6VGFyZ2V0TmFtZToKLSAgICAgICAgbV9wUGFyc2VyLT5HZXRUYXJnZXROYW1lKG1fd3MxKTsKLSAgICAgICAgaWYgKG1fd3MxID09IEwib3JpZ2luYWxYRkFWZXJzaW9uIiB8fCBtX3dzMSA9PSBMImFjcm9iYXQiKSB7Ci0gICAgICAgICAgbV9wQ2hpbGQgPSBuZXcgQ0ZERV9YTUxJbnN0cnVjdGlvbihtX3dzMSk7Ci0gICAgICAgICAgbV9wUGFyZW50LT5JbnNlcnRDaGlsZE5vZGUobV9wQ2hpbGQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG1fcENoaWxkID0gbnVsbHB0cjsKLSAgICAgICAgfQotICAgICAgICBtX3dzMS5jbGVhcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX1htbFN5bnRheFJlc3VsdDo6VGFnTmFtZToKLSAgICAgICAgbV9wUGFyc2VyLT5HZXRUYWdOYW1lKG1fd3MxKTsKLSAgICAgICAgbV9wQ2hpbGQgPSBuZXcgQ0ZERV9YTUxFbGVtZW50KG1fd3MxKTsKLSAgICAgICAgbV9wUGFyZW50LT5JbnNlcnRDaGlsZE5vZGUobV9wQ2hpbGQpOwotICAgICAgICBtX05vZGVTdGFjay5QdXNoKG1fcENoaWxkKTsKLSAgICAgICAgbV9wUGFyZW50ID0gbV9wQ2hpbGQ7Ci0KLSAgICAgICAgaWYgKG1fZHdDaGVja1N0YXR1cyAhPSAweDAzICYmIG1fTm9kZVN0YWNrLkdldFNpemUoKSA9PSAzKSB7Ci0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUYWc7Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4obV9wQ2hpbGQpLT5HZXRMb2NhbFRhZ05hbWUod3NUYWcpOwotICAgICAgICAgIGlmICh3c1RhZyA9PSBMInRlbXBsYXRlIikgewotICAgICAgICAgICAgbV9kd0NoZWNrU3RhdHVzIHw9IDB4MDE7Ci0gICAgICAgICAgICBtX2R3Q3VycmVudENoZWNrU3RhdHVzID0gMHgwMTsKLSAgICAgICAgICAgIG1fblN0YXJ0WzBdID0gbV9wUGFyc2VyLT5HZXRDdXJyZW50QmluYXJ5UG9zKCkgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAobV9wUGFyc2VyLT5HZXRDdXJyZW50UG9zKCkgLSBtX25FbGVtZW50U3RhcnQpOwotICAgICAgICAgIH0gZWxzZSBpZiAod3NUYWcgPT0gTCJkYXRhc2V0cyIpIHsKLSAgICAgICAgICAgIG1fZHdDaGVja1N0YXR1cyB8PSAweDAyOwotICAgICAgICAgICAgbV9kd0N1cnJlbnRDaGVja1N0YXR1cyA9IDB4MDI7Ci0gICAgICAgICAgICBtX25TdGFydFsxXSA9IG1fcFBhcnNlci0+R2V0Q3VycmVudEJpbmFyeVBvcygpIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fcFBhcnNlci0+R2V0Q3VycmVudFBvcygpIC0gbV9uRWxlbWVudFN0YXJ0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZERV9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpTmFtZToKLSAgICAgICAgbV9wUGFyc2VyLT5HZXRBdHRyaWJ1dGVOYW1lKG1fd3MxKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZERV9YbWxTeW50YXhSZXN1bHQ6OkF0dHJpVmFsdWU6Ci0gICAgICAgIGlmIChtX3BDaGlsZCkgewotICAgICAgICAgIG1fcFBhcnNlci0+R2V0QXR0cmlidXRlTmFtZShtX3dzMik7Ci0gICAgICAgICAgaWYgKG1fcENoaWxkLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCkgewotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4obV9wQ2hpbGQpLT5TZXRTdHJpbmcobV93czEsIG1fd3MyKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbV93czEuY2xlYXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZERV9YbWxTeW50YXhSZXN1bHQ6OlRleHQ6Ci0gICAgICAgIG1fcFBhcnNlci0+R2V0VGV4dERhdGEobV93czEpOwotICAgICAgICBtX3BDaGlsZCA9IG5ldyBDRkRFX1hNTFRleHQobV93czEpOwotICAgICAgICBtX3BQYXJlbnQtPkluc2VydENoaWxkTm9kZShtX3BDaGlsZCk7Ci0gICAgICAgIG1fcENoaWxkID0gbV9wUGFyZW50OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkRFX1htbFN5bnRheFJlc3VsdDo6Q0RhdGE6Ci0gICAgICAgIG1fcFBhcnNlci0+R2V0VGV4dERhdGEobV93czEpOwotICAgICAgICBtX3BDaGlsZCA9IG5ldyBDRkRFX1hNTENoYXJEYXRhKG1fd3MxKTsKLSAgICAgICAgbV9wUGFyZW50LT5JbnNlcnRDaGlsZE5vZGUobV9wQ2hpbGQpOwotICAgICAgICBtX3BDaGlsZCA9IG1fcFBhcmVudDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZERV9YbWxTeW50YXhSZXN1bHQ6OlRhcmdldERhdGE6Ci0gICAgICAgIGlmIChtX3BDaGlsZCkgewotICAgICAgICAgIGlmIChtX3BDaGlsZC0+R2V0VHlwZSgpICE9IEZERV9YTUxOT0RFX0luc3RydWN0aW9uKSB7Ci0gICAgICAgICAgICBtX3N5bnRheFBhcnNlclJlc3VsdCA9IEZERV9YbWxTeW50YXhSZXN1bHQ6OkVycm9yOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICghbV93czEuSXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxDRkRFX1hNTEluc3RydWN0aW9uKj4obV9wQ2hpbGQpLT5BcHBlbmREYXRhKG1fd3MxKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbV9wUGFyc2VyLT5HZXRUYXJnZXREYXRhKG1fd3MxKTsKLSAgICAgICAgICBzdGF0aWNfY2FzdDxDRkRFX1hNTEluc3RydWN0aW9uKj4obV9wQ2hpbGQpLT5BcHBlbmREYXRhKG1fd3MxKTsKLSAgICAgICAgfQotICAgICAgICBtX3dzMS5jbGVhcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAobV9zeW50YXhQYXJzZXJSZXN1bHQgPT0gRkRFX1htbFN5bnRheFJlc3VsdDo6RXJyb3IgfHwKLSAgICAgICAgbV9zeW50YXhQYXJzZXJSZXN1bHQgPT0gRkRFX1htbFN5bnRheFJlc3VsdDo6RW5kT2ZTdHJpbmcpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAocFBhdXNlICYmIGlDb3VudCA+IDUwMCAmJiBwUGF1c2UtPk5lZWRUb1BhdXNlTm93KCkpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gKG1fc3ludGF4UGFyc2VyUmVzdWx0ID09IEZERV9YbWxTeW50YXhSZXN1bHQ6OkVycm9yIHx8Ci0gICAgICAgICAgbV9Ob2RlU3RhY2suR2V0U2l6ZSgpICE9IDEpCi0gICAgICAgICAgICAgPyAtMQotICAgICAgICAgICAgIDogbV9wUGFyc2VyLT5HZXRTdGF0dXMoKTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3htbF9wYXJzZXIuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3htbF9wYXJzZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM5M2I3ZS4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV94bWxfcGFyc2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfWE1MX1BBUlNFUl9IXwotI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9YTUxfUEFSU0VSX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJ4ZmEvZmRlL3htbC9mZGVfeG1sX2ltcC5oIgotCi1jbGFzcyBJRkdBU19TdHJlYW07Ci1jbGFzcyBJRlhfUGF1c2U7Ci0KLWNsYXNzIENYRkFfWE1MUGFyc2VyIDogcHVibGljIElGREVfWE1MUGFyc2VyIHsKLSBwdWJsaWM6Ci0gIENYRkFfWE1MUGFyc2VyKENGREVfWE1MTm9kZSogcFJvb3QsCi0gICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiYgcFN0cmVhbSk7Ci0gIH5DWEZBX1hNTFBhcnNlcigpIG92ZXJyaWRlOwotCi0gIC8vIElGREVfWE1MUGFyc2VyCi0gIGludDMyX3QgRG9QYXJzZXIoSUZYX1BhdXNlKiBwUGF1c2UpIG92ZXJyaWRlOwotCi0gIEZYX0ZJTEVTSVpFIG1fblN0YXJ0WzJdOwotICBzaXplX3QgbV9uU2l6ZVsyXTsKLSAgRlhfRklMRVNJWkUgbV9uRWxlbWVudFN0YXJ0OwotICB1aW50MTZfdCBtX2R3Q2hlY2tTdGF0dXM7Ci0gIHVpbnQxNl90IG1fZHdDdXJyZW50Q2hlY2tTdGF0dXM7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIENGREVfWE1MTm9kZSogbV9wUm9vdDsKLSAgQ0ZYX1JldGFpblB0cjxJRkdBU19TdHJlYW0+IG1fcFN0cmVhbTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGREVfWE1MU3ludGF4UGFyc2VyPiBtX3BQYXJzZXI7Ci0gIENGREVfWE1MTm9kZSogbV9wUGFyZW50OwotICBDRkRFX1hNTE5vZGUqIG1fcENoaWxkOwotICBDRlhfU3RhY2tUZW1wbGF0ZTxDRkRFX1hNTE5vZGUqPiBtX05vZGVTdGFjazsKLSAgQ0ZYX1dpZGVTdHJpbmcgbV93czE7Ci0gIENGWF9XaWRlU3RyaW5nIG1fd3MyOwotICBGREVfWG1sU3ludGF4UmVzdWx0IG1fc3ludGF4UGFyc2VyUmVzdWx0OwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9YTUxfUEFSU0VSX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV94bWxjb25uZWN0aW9uLmNwcCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3htbGNvbm5lY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMDU3NzEKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV94bWxjb25uZWN0aW9uLmNwcApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV94bWxjb25uZWN0aW9uLmgiCisKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfeG1sY29ubmVjdGlvbi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0ge3tYRkFfRWxlbWVudDo6VXJpLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpEYXRhRGVzY3JpcHRpb24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpDRGF0YSwgbnVsbHB0cn0sCisgICAge1hGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9BdHRyaWJ1dGVUeXBlOjpJbnRlZ2VyLCBudWxscHRyfX07CisKK2NvbnN0ZXhwciB3Y2hhcl90IGtOYW1lW10gPSBMInhtbENvbm5lY3Rpb24iOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9YbWxDb25uZWN0aW9uOjpDWEZBX1htbENvbm5lY3Rpb24oQ1hGQV9Eb2N1bWVudCogZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LAorICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlLAorICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpYbWxDb25uZWN0aW9uLAorICAgICAgICAgICAgICAgIGtQcm9wZXJ0eURhdGEsCisgICAgICAgICAgICAgICAga0F0dHJpYnV0ZURhdGEsCisgICAgICAgICAgICAgICAga05hbWUsCisgICAgICAgICAgICAgICAgcGRmaXVtOjpNYWtlVW5pcXVlPENKWF9YbWxDb25uZWN0aW9uPih0aGlzKSkge30KKworQ1hGQV9YbWxDb25uZWN0aW9uOjp+Q1hGQV9YbWxDb25uZWN0aW9uKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3htbGNvbm5lY3Rpb24uaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3htbGNvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTE1OGM2Ci0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeG1sY29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9YTUxDT05ORUNUSU9OX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1hNTENPTk5FQ1RJT05fSF8KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKworY2xhc3MgQ1hGQV9YbWxDb25uZWN0aW9uIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1htbENvbm5lY3Rpb24oQ1hGQV9Eb2N1bWVudCogZG9jLCBYRkFfUGFja2V0VHlwZSBwYWNrZXQpOworICB+Q1hGQV9YbWxDb25uZWN0aW9uKCkgb3ZlcnJpZGU7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1hNTENPTk5FQ1RJT05fSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3htbGxvY2FsZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV94bWxsb2NhbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OWM3YmIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV94bWxsb2NhbGUuY3BwCkBAIC0wLDAgKzEsMjA3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV94bWxsb2NhbGUuaCIKKworI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jeG1sX2NvbnRlbnQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jeG1sX2VsZW1lbnQuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2xvY2FsZW1nci5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGVsb2NhbGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90aW1lem9uZXByb3ZpZGVyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV91dGlscy5oIgorCitDWEZBX1hNTExvY2FsZTo6Q1hGQV9YTUxMb2NhbGUoc3RkOjp1bmlxdWVfcHRyPENYTUxfRWxlbWVudD4gcExvY2FsZURhdGEpCisgICAgOiBtX3BMb2NhbGVEYXRhKHN0ZDo6bW92ZShwTG9jYWxlRGF0YSkpIHt9CisKK0NYRkFfWE1MTG9jYWxlOjp+Q1hGQV9YTUxMb2NhbGUoKSB7fQorCitXaWRlU3RyaW5nIENYRkFfWE1MTG9jYWxlOjpHZXROYW1lKCkgY29uc3QgeworICByZXR1cm4gbV9wTG9jYWxlRGF0YSA/IG1fcExvY2FsZURhdGEtPkdldEF0dHJWYWx1ZSgibmFtZSIpIDogV2lkZVN0cmluZygpOworfQorCitXaWRlU3RyaW5nIENYRkFfWE1MTG9jYWxlOjpHZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0wgZVR5cGUpIGNvbnN0IHsKKyAgQnl0ZVN0cmluZyBic1N5bWJvbHM7CisgIFdpZGVTdHJpbmcgd3NOYW1lOworICBzd2l0Y2ggKGVUeXBlKSB7CisgICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbDoKKyAgICAgIGJzU3ltYm9scyA9ICJudW1iZXJTeW1ib2xzIjsKKyAgICAgIHdzTmFtZSA9IEwiZGVjaW1hbCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9Hcm91cGluZzoKKyAgICAgIGJzU3ltYm9scyA9ICJudW1iZXJTeW1ib2xzIjsKKyAgICAgIHdzTmFtZSA9IEwiZ3JvdXBpbmciOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfUGVyY2VudDoKKyAgICAgIGJzU3ltYm9scyA9ICJudW1iZXJTeW1ib2xzIjsKKyAgICAgIHdzTmFtZSA9IEwicGVyY2VudCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51czoKKyAgICAgIGJzU3ltYm9scyA9ICJudW1iZXJTeW1ib2xzIjsKKyAgICAgIHdzTmFtZSA9IEwibWludXMiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfWmVybzoKKyAgICAgIGJzU3ltYm9scyA9ICJudW1iZXJTeW1ib2xzIjsKKyAgICAgIHdzTmFtZSA9IEwiemVybyI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbDoKKyAgICAgIGJzU3ltYm9scyA9ICJjdXJyZW5jeVN5bWJvbHMiOworICAgICAgd3NOYW1lID0gTCJzeW1ib2wiOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfQ3VycmVuY3lOYW1lOgorICAgICAgYnNTeW1ib2xzID0gImN1cnJlbmN5U3ltYm9scyI7CisgICAgICB3c05hbWUgPSBMImlzb25hbWUiOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CisgIH0KKyAgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCA9CisgICAgICBtX3BMb2NhbGVEYXRhLT5HZXRFbGVtZW50KCIiLCBic1N5bWJvbHMuQXNTdHJpbmdWaWV3KCksIDApOworICBpZiAoIXBFbGVtZW50KQorICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CisKKyAgcmV0dXJuIEdldFBhdHRlcm4oCisgICAgICBwRWxlbWVudCwgQnl0ZVN0cmluZ1ZpZXcoYnNTeW1ib2xzLmNfc3RyKCksIGJzU3ltYm9scy5HZXRMZW5ndGgoKSAtIDEpLAorICAgICAgd3NOYW1lLkFzU3RyaW5nVmlldygpKTsKK30KKworV2lkZVN0cmluZyBDWEZBX1hNTExvY2FsZTo6R2V0RGF0ZVRpbWVTeW1ib2xzKCkgY29uc3QgeworICBpZiAoIW1fcExvY2FsZURhdGEpCisgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKKworICBDWE1MX0VsZW1lbnQqIHBOdW1iZXJTeW1ib2xzID0KKyAgICAgIG1fcExvY2FsZURhdGEtPkdldEVsZW1lbnQoIiIsICJkYXRlVGltZVN5bWJvbHMiLCAwKTsKKyAgaWYgKCFwTnVtYmVyU3ltYm9scykKKyAgICByZXR1cm4gV2lkZVN0cmluZygpOworCisgIENYTUxfQ29udGVudCogcENvbnRlbnQgPSBUb0NvbnRlbnQocE51bWJlclN5bWJvbHMtPkdldENoaWxkKDApKTsKKyAgaWYgKCFwQ29udGVudCkKKyAgICByZXR1cm4gV2lkZVN0cmluZygpOworCisgIHJldHVybiBwQ29udGVudC0+bV9Db250ZW50OworfQorCitXaWRlU3RyaW5nIENYRkFfWE1MTG9jYWxlOjpHZXRNb250aE5hbWUoaW50MzJfdCBuTW9udGgsIGJvb2wgYkFiYnIpIGNvbnN0IHsKKyAgcmV0dXJuIEdldENhbGVuZGFyU3ltYm9sKCJtb250aCIsIG5Nb250aCwgYkFiYnIpOworfQorCitXaWRlU3RyaW5nIENYRkFfWE1MTG9jYWxlOjpHZXREYXlOYW1lKGludDMyX3QgbldlZWssIGJvb2wgYkFiYnIpIGNvbnN0IHsKKyAgcmV0dXJuIEdldENhbGVuZGFyU3ltYm9sKCJkYXkiLCBuV2VlaywgYkFiYnIpOworfQorCitXaWRlU3RyaW5nIENYRkFfWE1MTG9jYWxlOjpHZXRNZXJpZGllbU5hbWUoYm9vbCBiQU0pIGNvbnN0IHsKKyAgcmV0dXJuIEdldENhbGVuZGFyU3ltYm9sKCJtZXJpZGllbSIsIGJBTSA/IDAgOiAxLCBmYWxzZSk7Cit9CisKK0ZYX1RJTUVaT05FIENYRkFfWE1MTG9jYWxlOjpHZXRUaW1lWm9uZSgpIGNvbnN0IHsKKyAgcmV0dXJuIENYRkFfVGltZVpvbmVQcm92aWRlcigpLkdldFRpbWVab25lKCk7Cit9CisKK1dpZGVTdHJpbmcgQ1hGQV9YTUxMb2NhbGU6OkdldEVyYU5hbWUoYm9vbCBiQUQpIGNvbnN0IHsKKyAgcmV0dXJuIEdldENhbGVuZGFyU3ltYm9sKCJlcmEiLCBiQUQgPyAxIDogMCwgZmFsc2UpOworfQorCitXaWRlU3RyaW5nIENYRkFfWE1MTG9jYWxlOjpHZXRDYWxlbmRhclN5bWJvbChjb25zdCBCeXRlU3RyaW5nVmlldyYgc3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWJicikgY29uc3QgeworICBpZiAoaW5kZXggPCAwIHx8ICFtX3BMb2NhbGVEYXRhKQorICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CisKKyAgQ1hNTF9FbGVtZW50KiBwQ2hpbGQgPSBtX3BMb2NhbGVEYXRhLT5HZXRFbGVtZW50KCIiLCAiY2FsZW5kYXJTeW1ib2xzIiwgMCk7CisgIGlmICghcENoaWxkKQorICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CisKKyAgQnl0ZVN0cmluZyBwc3RyU3ltYm9sTmFtZXMgPSBzeW1ib2wgKyAiTmFtZXMiOworICBDWE1MX0VsZW1lbnQqIHBTeW1ib2xOYW1lcyA9CisgICAgICBwQ2hpbGQtPkdldEVsZW1lbnQoIiIsIHBzdHJTeW1ib2xOYW1lcy5Bc1N0cmluZ1ZpZXcoKSwgMCk7CisgIGlmICghcFN5bWJvbE5hbWVzKQorICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CisKKyAgaWYgKCghIXBTeW1ib2xOYW1lcy0+R2V0QXR0ckludGVnZXIoImFiYnIiKSkgIT0gYkFiYnIpCisgICAgcFN5bWJvbE5hbWVzID0gcENoaWxkLT5HZXRFbGVtZW50KCIiLCBwc3RyU3ltYm9sTmFtZXMuQXNTdHJpbmdWaWV3KCksIDEpOworCisgIGlmICghcFN5bWJvbE5hbWVzIHx8ICghIXBTeW1ib2xOYW1lcy0+R2V0QXR0ckludGVnZXIoImFiYnIiKSkgIT0gYkFiYnIpCisgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKKworICBDWE1MX0VsZW1lbnQqIHBTeW1ib2xOYW1lID0gcFN5bWJvbE5hbWVzLT5HZXRFbGVtZW50KCIiLCBzeW1ib2wsIGluZGV4KTsKKyAgaWYgKCFwU3ltYm9sTmFtZSkKKyAgICByZXR1cm4gV2lkZVN0cmluZygpOworCisgIENYTUxfQ29udGVudCogcENvbnRlbnQgPSBUb0NvbnRlbnQocFN5bWJvbE5hbWUtPkdldENoaWxkKDApKTsKKyAgcmV0dXJuIHBDb250ZW50ID8gcENvbnRlbnQtPm1fQ29udGVudCA6IFdpZGVTdHJpbmcoKTsKK30KKworV2lkZVN0cmluZyBDWEZBX1hNTExvY2FsZTo6R2V0RGF0ZVBhdHRlcm4oCisgICAgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSkgY29uc3QgeworICBDWE1MX0VsZW1lbnQqIHBFbGVtZW50ID0gbV9wTG9jYWxlRGF0YS0+R2V0RWxlbWVudCgiIiwgImRhdGVQYXR0ZXJucyIsIDApOworICBpZiAoIXBFbGVtZW50KQorICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CisKKyAgV2lkZVN0cmluZyB3c05hbWU7CisgIHN3aXRjaCAoZVR5cGUpIHsKKyAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQ6CisgICAgICB3c05hbWUgPSBMInNob3J0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0OgorICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW06CisgICAgICB3c05hbWUgPSBMIm1lZCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbDoKKyAgICAgIHdzTmFtZSA9IEwiZnVsbCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTG9uZzoKKyAgICAgIHdzTmFtZSA9IEwibG9uZyI7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gR2V0UGF0dGVybihwRWxlbWVudCwgImRhdGVQYXR0ZXJuIiwgd3NOYW1lLkFzU3RyaW5nVmlldygpKTsKK30KKworV2lkZVN0cmluZyBDWEZBX1hNTExvY2FsZTo6R2V0VGltZVBhdHRlcm4oCisgICAgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSkgY29uc3QgeworICBDWE1MX0VsZW1lbnQqIHBFbGVtZW50ID0gbV9wTG9jYWxlRGF0YS0+R2V0RWxlbWVudCgiIiwgInRpbWVQYXR0ZXJucyIsIDApOworICBpZiAoIXBFbGVtZW50KQorICAgIHJldHVybiBXaWRlU3RyaW5nKCk7CisKKyAgV2lkZVN0cmluZyB3c05hbWU7CisgIHN3aXRjaCAoZVR5cGUpIHsKKyAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQ6CisgICAgICB3c05hbWUgPSBMInNob3J0IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0OgorICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW06CisgICAgICB3c05hbWUgPSBMIm1lZCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbDoKKyAgICAgIHdzTmFtZSA9IEwiZnVsbCI7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTG9uZzoKKyAgICAgIHdzTmFtZSA9IEwibG9uZyI7CisgICAgICBicmVhazsKKyAgfQorICByZXR1cm4gR2V0UGF0dGVybihwRWxlbWVudCwgInRpbWVQYXR0ZXJuIiwgd3NOYW1lLkFzU3RyaW5nVmlldygpKTsKK30KKworV2lkZVN0cmluZyBDWEZBX1hNTExvY2FsZTo6R2V0TnVtUGF0dGVybihGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSBlVHlwZSkgY29uc3QgeworICByZXR1cm4gbV9wTG9jYWxlRGF0YS0+R2V0RWxlbWVudCgiIiwgIm51bWJlclBhdHRlcm5zIiwgMCkKKyAgICAgICAgICAgICA/IFhGQV9QYXR0ZXJuVG9TdHJpbmcoZVR5cGUpCisgICAgICAgICAgICAgOiBXaWRlU3RyaW5nKCk7Cit9CisKK1dpZGVTdHJpbmcgQ1hGQV9YTUxMb2NhbGU6OkdldFBhdHRlcm4oQ1hNTF9FbGVtZW50KiBwRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnl0ZVN0cmluZ1ZpZXcmIGJzVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NOYW1lKSBjb25zdCB7CisgIHNpemVfdCBpQ291bnQgPSBwRWxlbWVudC0+Q291bnRFbGVtZW50cygiIiwgYnNUYWcpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7CisgICAgQ1hNTF9FbGVtZW50KiBwQ2hpbGQgPSBwRWxlbWVudC0+R2V0RWxlbWVudCgiIiwgYnNUYWcsIGkpOworICAgIGlmIChwQ2hpbGQtPkdldEF0dHJWYWx1ZSgibmFtZSIpID09IHdzTmFtZSkgeworICAgICAgQ1hNTF9Db250ZW50KiBwQ29udGVudCA9IFRvQ29udGVudChwQ2hpbGQtPkdldENoaWxkKDApKTsKKyAgICAgIHJldHVybiBwQ29udGVudCA/IHBDb250ZW50LT5tX0NvbnRlbnQgOiBXaWRlU3RyaW5nKCk7CisgICAgfQorICB9CisgIHJldHVybiBXaWRlU3RyaW5nKCk7Cit9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV94bWxsb2NhbGUuaCBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3htbGxvY2FsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNTA4NTUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV94bWxsb2NhbGUuaApAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfWE1MTE9DQUxFX0hfCisjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1hNTExPQ0FMRV9IXworCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSAiY29yZS9meGNydC9pZnhfbG9jYWxlLmgiCisKK2NsYXNzIENYTUxfRWxlbWVudDsKKworY2xhc3MgQ1hGQV9YTUxMb2NhbGUgOiBwdWJsaWMgSUZYX0xvY2FsZSB7CisgcHVibGljOgorICBleHBsaWNpdCBDWEZBX1hNTExvY2FsZShzdGQ6OnVuaXF1ZV9wdHI8Q1hNTF9FbGVtZW50PiBwTG9jYWxlRGF0YSk7CisgIH5DWEZBX1hNTExvY2FsZSgpIG92ZXJyaWRlOworCisgIC8vIElGWF9Mb2NhbGUKKyAgV2lkZVN0cmluZyBHZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIFdpZGVTdHJpbmcgR2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MIGVUeXBlKSBjb25zdCBvdmVycmlkZTsKKworICBXaWRlU3RyaW5nIEdldERhdGVUaW1lU3ltYm9scygpIGNvbnN0IG92ZXJyaWRlOworICBXaWRlU3RyaW5nIEdldE1vbnRoTmFtZShpbnQzMl90IG5Nb250aCwgYm9vbCBiQWJicikgY29uc3Qgb3ZlcnJpZGU7CisgIFdpZGVTdHJpbmcgR2V0RGF5TmFtZShpbnQzMl90IG5XZWVrLCBib29sIGJBYmJyKSBjb25zdCBvdmVycmlkZTsKKyAgV2lkZVN0cmluZyBHZXRNZXJpZGllbU5hbWUoYm9vbCBiQU0pIGNvbnN0IG92ZXJyaWRlOworICBGWF9USU1FWk9ORSBHZXRUaW1lWm9uZSgpIGNvbnN0IG92ZXJyaWRlOworICBXaWRlU3RyaW5nIEdldEVyYU5hbWUoYm9vbCBiQUQpIGNvbnN0IG92ZXJyaWRlOworCisgIFdpZGVTdHJpbmcgR2V0RGF0ZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSkgY29uc3Qgb3ZlcnJpZGU7CisgIFdpZGVTdHJpbmcgR2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSkgY29uc3Qgb3ZlcnJpZGU7CisgIFdpZGVTdHJpbmcgR2V0TnVtUGF0dGVybihGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSBlVHlwZSkgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICBXaWRlU3RyaW5nIEdldFBhdHRlcm4oQ1hNTF9FbGVtZW50KiBwRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBic1RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmdWaWV3JiB3c05hbWUpIGNvbnN0OworICBXaWRlU3RyaW5nIEdldENhbGVuZGFyU3ltYm9sKGNvbnN0IEJ5dGVTdHJpbmdWaWV3JiBzeW1ib2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFiYnIpIGNvbnN0OworCisgIHN0ZDo6dW5pcXVlX3B0cjxDWE1MX0VsZW1lbnQ+IG1fcExvY2FsZURhdGE7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEZBX1BBUlNFUl9DWEZBX1hNTExPQ0FMRV9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeHNkY29ubmVjdGlvbi5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV94c2Rjb25uZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjBkZTBkCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeHNkY29ubmVjdGlvbi5jcHAKQEAgLTAsMCArMSwzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeHNkY29ubmVjdGlvbi5oIgorCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3hzZGNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisKK25hbWVzcGFjZSB7CisKK2NvbnN0IENYRkFfTm9kZTo6UHJvcGVydHlEYXRhIGtQcm9wZXJ0eURhdGFbXSA9IHsKKyAgICB7WEZBX0VsZW1lbnQ6OlVyaSwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpSb290RWxlbWVudCwgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpVbmtub3duLCAwLCAwfX07Citjb25zdCBDWEZBX05vZGU6OkF0dHJpYnV0ZURhdGEga0F0dHJpYnV0ZURhdGFbXSA9IHsKKyAgICB7WEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX0F0dHJpYnV0ZVR5cGU6OkNEYXRhLCBudWxscHRyfSwKKyAgICB7WEZBX0F0dHJpYnV0ZTo6RGF0YURlc2NyaXB0aW9uLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJ4c2RDb25uZWN0aW9uIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NYRkFfWHNkQ29ubmVjdGlvbjo6Q1hGQV9Yc2RDb25uZWN0aW9uKENYRkFfRG9jdW1lbnQqIGRvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9QYWNrZXRUeXBlIHBhY2tldCkKKyAgICA6IENYRkFfTm9kZShkb2MsCisgICAgICAgICAgICAgICAgcGFja2V0LAorICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwKKyAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZSwKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6WHNkQ29ubmVjdGlvbiwKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lLAorICAgICAgICAgICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDSlhfWHNkQ29ubmVjdGlvbj4odGhpcykpIHt9CisKK0NYRkFfWHNkQ29ubmVjdGlvbjo6fkNYRkFfWHNkQ29ubmVjdGlvbigpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV94c2Rjb25uZWN0aW9uLmggYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV94c2Rjb25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyZDQ1ZQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3hzZGNvbm5lY3Rpb24uaApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfWFNEQ09OTkVDVElPTl9IXworI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9YU0RDT05ORUNUSU9OX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfWHNkQ29ubmVjdGlvbiA6IHB1YmxpYyBDWEZBX05vZGUgeworIHB1YmxpYzoKKyAgQ1hGQV9Yc2RDb25uZWN0aW9uKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KTsKKyAgfkNYRkFfWHNkQ29ubmVjdGlvbigpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9YU0RDT05ORUNUSU9OX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIvY3hmYV94c2wuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeHNsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDVlNzFlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeHNsLmNwcApAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV94c2wuaCIKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ1hGQV9Ob2RlOjpQcm9wZXJ0eURhdGEga1Byb3BlcnR5RGF0YVtdID0ge3tYRkFfRWxlbWVudDo6VXJpLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OkRlYnVnLCAxLCAwfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJ4c2wiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9Yc2w6OkNYRkFfWHNsKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlhzbCwKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX1hzbDo6fkNYRkFfWHNsKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3hzbC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfeHNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkyMTEyNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3hzbC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9YU0xfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfWFNMX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfWHNsIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1hzbChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1hzbCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9YU0xfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3pwbC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV96cGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMDc4YjUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhmYS9wYXJzZXIvY3hmYV96cGwuY3BwCkBAIC0wLDAgKzEsMzcgQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3pwbC5oIgorCituYW1lc3BhY2UgeworCitjb25zdCBDWEZBX05vZGU6OlByb3BlcnR5RGF0YSBrUHJvcGVydHlEYXRhW10gPSB7CisgICAge1hGQV9FbGVtZW50OjpGb250SW5mbywgMSwgMH0sCisgICAge1hGQV9FbGVtZW50OjpYZGMsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6QmF0Y2hPdXRwdXQsIDEsIDB9LAorICAgIHtYRkFfRWxlbWVudDo6RmxpcExhYmVsLCAxLCAwfSwKKyAgICB7WEZBX0VsZW1lbnQ6OlVua25vd24sIDAsIDB9fTsKK2NvbnN0IENYRkFfTm9kZTo6QXR0cmlidXRlRGF0YSBrQXR0cmlidXRlRGF0YVtdID0geworICAgIHtYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfQXR0cmlidXRlVHlwZTo6Q0RhdGEsIG51bGxwdHJ9LAorICAgIHtYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgKHZvaWQqKTB9LAorICAgIHtYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfQXR0cmlidXRlVHlwZTo6SW50ZWdlciwgbnVsbHB0cn19OworCitjb25zdGV4cHIgd2NoYXJfdCBrTmFtZVtdID0gTCJ6cGwiOworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9acGw6OkNYRkFfWnBsKENYRkFfRG9jdW1lbnQqIGRvYywgWEZBX1BhY2tldFR5cGUgcGFja2V0KQorICAgIDogQ1hGQV9Ob2RlKGRvYywKKyAgICAgICAgICAgICAgICBwYWNrZXQsCisgICAgICAgICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsCisgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGUsCisgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlpwbCwKKyAgICAgICAgICAgICAgICBrUHJvcGVydHlEYXRhLAorICAgICAgICAgICAgICAgIGtBdHRyaWJ1dGVEYXRhLAorICAgICAgICAgICAgICAgIGtOYW1lKSB7fQorCitDWEZBX1pwbDo6fkNYRkFfWnBsKCkge30KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci9jeGZhX3pwbC5oIGIveGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfenBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU4ZjkyNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGZhL3BhcnNlci9jeGZhX3pwbC5oCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9aUExfSF8KKyNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX0NYRkFfWlBMX0hfCisKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisKK2NsYXNzIENYRkFfWnBsIDogcHVibGljIENYRkFfTm9kZSB7CisgcHVibGljOgorICBDWEZBX1pwbChDWEZBX0RvY3VtZW50KiBkb2MsIFhGQV9QYWNrZXRUeXBlIHBhY2tldCk7CisgIH5DWEZBX1pwbCgpIG92ZXJyaWRlOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfQ1hGQV9aUExfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci94ZmFfYmFzaWNfZGF0YS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIveGZhX2Jhc2ljX2RhdGEuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWNjOTQyLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL3BhcnNlci94ZmFfYmFzaWNfZGF0YS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NzQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9iYXNpY19kYXRhLmgiCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9meGZhX2Jhc2ljLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKLQotY29uc3QgWEZBX0VMRU1FTlRJTkZPIGdfWEZBRWxlbWVudERhdGFbXSA9IHsKLSAgICB7MHgyM2VlMywgTCJwcyIsIFhGQV9FbGVtZW50OjpQcywgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHgyNTM2MywgTCJ0byIsIFhGQV9FbGVtZW50OjpUbywgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4MjU4N2UsIEwidWkiLCBYRkFfRWxlbWVudDo6VWksCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHgxYzY0OGIsIEwicmVjb3JkU2V0IiwgWEZBX0VsZW1lbnQ6OlJlY29yZFNldCwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHgxNzE0MjhmLCBMInN1YnNldEJlbG93IiwgWEZBX0VsZW1lbnQ6OlN1YnNldEJlbG93LCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHgxYTA3NzZhLCBMInN1YmZvcm1TZXQiLCBYRkFfRWxlbWVudDo6U3ViZm9ybVNldCwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGV9LAotICAgIHsweDIzNDBkNzAsIEwiYWRvYmVFeHRlbnNpb25MZXZlbCIsIFhGQV9FbGVtZW50OjpBZG9iZUV4dGVuc2lvbkxldmVsLAotICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHgyYzFjN2YxLCBMInR5cGVmYWNlIiwgWEZBX0VsZW1lbnQ6OlR5cGVmYWNlLCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDU1MThjMjUsIEwiYnJlYWsiLCBYRkFfRWxlbWVudDo6QnJlYWssCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHg1ZmZmNTIzLCBMImZvbnRJbmZvIiwgWEZBX0VsZW1lbnQ6OkZvbnRJbmZvLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDY1M2EyMjcsIEwibnVtYmVyUGF0dGVybiIsIFhGQV9FbGVtZW50OjpOdW1iZXJQYXR0ZXJuLAotICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHg2NWI0YTA1LCBMImR5bmFtaWNSZW5kZXIiLCBYRkFfRWxlbWVudDo6RHluYW1pY1JlbmRlciwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4N2U0MzYyZSwgTCJwcmludFNjYWxpbmciLCBYRkFfRWxlbWVudDo6UHJpbnRTY2FsaW5nLAotICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHg3ZmU2ZDNhLCBMImNoZWNrQnV0dG9uIiwgWEZBX0VsZW1lbnQ6OkNoZWNrQnV0dG9uLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4ODBjZjU4ZiwgTCJkYXRlUGF0dGVybnMiLCBYRkFfRWxlbWVudDo6RGF0ZVBhdHRlcm5zLAotICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDgxMTkyOWQsIEwic291cmNlU2V0IiwgWEZBX0VsZW1lbnQ6OlNvdXJjZVNldCwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpNb2RlbE5vZGV9LAotICAgIHsweDlmOWQ2MTIsIEwiYW1kIiwgWEZBX0VsZW1lbnQ6OkFtZCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4OWY5ZWZiNiwgTCJhcmMiLCBYRkFfRWxlbWVudDo6QXJjLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4YTQ4ODM1ZSwgTCJkYXkiLCBYRkFfRWxlbWVudDo6RGF5LCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwKLSAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHhhNjMyOGI4LCBMImVyYSIsIFhGQV9FbGVtZW50OjpFcmEsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LAotICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweGFlNmEwYTAsIEwiam9nIiwgWEZBX0VsZW1lbnQ6OkpvZywgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4YjFiM2QyMiwgTCJsb2ciLCBYRkFfRWxlbWVudDo6TG9nLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweGIzNTQzOWUsIEwibWFwIiwgWEZBX0VsZW1lbnQ6Ok1hcCwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweGIzNTUzMDEsIEwibWRwIiwgWEZBX0VsZW1lbnQ6Ok1kcCwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweGI0MjA0MzgsIEwiYnJlYWtCZWZvcmUiLCBYRkFfRWxlbWVudDo6QnJlYWtCZWZvcmUsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhiNmEwOTFjLCBMIm9pZCIsIFhGQV9FbGVtZW50OjpPaWQsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpUZXh0Tm9kZX0sCi0gICAgezB4Yjg0Mzg5ZiwgTCJwY2wiLCBYRkFfRWxlbWVudDo6UGNsLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweGI4NDNkYmEsIEwicGRmIiwgWEZBX0VsZW1lbnQ6OlBkZiwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhiYjhkZjVkLCBMInJlZiIsIFhGQV9FbGVtZW50OjpSZWYsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpUZXh0Tm9kZX0sCi0gICAgezB4YzA4MGNkMCwgTCJ1cmkiLCBYRkFfRWxlbWVudDo6VXJpLAotICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwKLSAgICAgWEZBX09iamVjdFR5cGU6OlRleHROb2RlfSwKLSAgICB7MHhjNTZhZmJmLCBMInhkYyIsIFhGQV9FbGVtZW50OjpYZGMsCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9YZGMsIFhGQV9PYmplY3RUeXBlOjpNb2RlbE5vZGV9LAotICAgIHsweGM1NmFmY2MsIEwieGRwIiwgWEZBX0VsZW1lbnQ6OlhkcCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhjNTZiOWZmLCBMInhmYSIsIFhGQV9FbGVtZW50OjpYZmEsIFhGQV9YRFBQQUNLRVRfWERQLAotICAgICBYRkFfT2JqZWN0VHlwZTo6TW9kZWxOb2RlfSwKLSAgICB7MHhjNTZmY2I3LCBMInhzbCIsIFhGQV9FbGVtZW50OjpYc2wsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4YzhiODlkNiwgTCJ6cGwiLCBYRkFfRWxlbWVudDo6WnBsLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweGM5YmFlOTQsIEwiY2FjaGUiLCBYRkFfRWxlbWVudDo6Q2FjaGUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4Y2IwMTZiZSwgTCJtYXJnaW4iLCBYRkFfRWxlbWVudDo6TWFyZ2luLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4ZTEzNzhmZSwgTCJrZXlVc2FnZSIsIFhGQV9FbGVtZW50OjpLZXlVc2FnZSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweGZlMzU5NmEsIEwiZXhjbHVkZSIsIFhGQV9FbGVtZW50OjpFeGNsdWRlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHgxMDM5NWFjNywgTCJjaG9pY2VMaXN0IiwgWEZBX0VsZW1lbnQ6OkNob2ljZUxpc3QsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHgxMDU5ZWMxOCwgTCJsZXZlbCIsIFhGQV9FbGVtZW50OjpMZXZlbCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4MTA4NzQ4MDQsIEwibGFiZWxQcmludGVyIiwgWEZBX0VsZW1lbnQ6OkxhYmVsUHJpbnRlciwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHgxMGM0MGUwMywgTCJjYWxlbmRhclN5bWJvbHMiLCBYRkFfRWxlbWVudDo6Q2FsZW5kYXJTeW1ib2xzLAotICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDEwZjFlYTI0LCBMInBhcmEiLCBYRkFfRWxlbWVudDo6UGFyYSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDEwZjFlYTM3LCBMInBhcnQiLCBYRkFfRWxlbWVudDo6UGFydCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4MTE0MDk3NWIsIEwicGRmYSIsIFhGQV9FbGVtZW50OjpQZGZhLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDExNTRlZmU2LCBMImZpbHRlciIsIFhGQV9FbGVtZW50OjpGaWx0ZXIsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHgxM2Y0MWRlMSwgTCJwcmVzZW50IiwgWEZBX0VsZW1lbnQ6OlByZXNlbnQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4MTgyN2U2ZWEsIEwicGFnaW5hdGlvbiIsIFhGQV9FbGVtZW50OjpQYWdpbmF0aW9uLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHgxODQ2MzcwNywgTCJlbmNvZGluZyIsIFhGQV9FbGVtZW50OjpFbmNvZGluZywKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGVDfSwKLSAgICB7MHgxODVlNDFlMiwgTCJldmVudCIsIFhGQV9FbGVtZW50OjpFdmVudCwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDFhZGIxNDJkLCBMIndoaXRlc3BhY2UiLCBYRkFfRWxlbWVudDo6V2hpdGVzcGFjZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlVn0sCi0gICAgezB4MWYzZjY0YzMsIEwiZGVmYXVsdFVpIiwgWEZBX0VsZW1lbnQ6OkRlZmF1bHRVaSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDIwNGU4N2NiLCBMImRhdGFNb2RlbCIsIFhGQV9FbGVtZW50OjpEYXRhTW9kZWwsIFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpNb2RlbE5vZGV9LAotICAgIHsweDIwNTdiMzUwLCBMImJhcmNvZGUiLCBYRkFfRWxlbWVudDo6QmFyY29kZSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDIwNTk2YmFkLCBMInRpbWVQYXR0ZXJuIiwgWEZBX0VsZW1lbnQ6OlRpbWVQYXR0ZXJuLAotICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHgyMTBiNzRkMywgTCJiYXRjaE91dHB1dCIsIFhGQV9FbGVtZW50OjpCYXRjaE91dHB1dCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHgyMTJmZjBlMiwgTCJlbmZvcmNlIiwgWEZBX0VsZW1lbnQ6OkVuZm9yY2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweDIxZDM1MWI0LCBMImN1cnJlbmN5U3ltYm9scyIsIFhGQV9FbGVtZW50OjpDdXJyZW5jeVN5bWJvbHMsCi0gICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4MjFkYjgzYzUsIEwiYWRkU2lsZW50UHJpbnQiLCBYRkFfRWxlbWVudDo6QWRkU2lsZW50UHJpbnQsCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweDIyMjY2MjU4LCBMInJlbmFtZSIsIFhGQV9FbGVtZW50OjpSZW5hbWUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVZ9LAotICAgIHsweDIyNmNhOGYxLCBMIm9wZXJhdGlvbiIsIFhGQV9FbGVtZW50OjpPcGVyYXRpb24sCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgWEZBX09iamVjdFR5cGU6OlRleHROb2RlfSwKLSAgICB7MHgyM2UyN2I4NCwgTCJ0eXBlZmFjZXMiLCBYRkFfRWxlbWVudDo6VHlwZWZhY2VzLCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDIzZjRhYTc1LCBMInN1YmplY3RETnMiLCBYRkFfRWxlbWVudDo6U3ViamVjdEROcywKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDI0MGQ1ZThlLCBMImlzc3VlcnMiLCBYRkFfRWxlbWVudDo6SXNzdWVycywKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDI0NTdhMDMzLCBMInNpZ25hdHVyZVBzZXVkb01vZGVsIiwgWEZBX0VsZW1lbnQ6OlNpZ25hdHVyZVBzZXVkb01vZGVsLAotICAgICBYRkFfWERQUEFDS0VUX1hEUCwgWEZBX09iamVjdFR5cGU6Ok9iamVjdH0sCi0gICAgezB4MjRhNTJmOGEsIEwid3NkbENvbm5lY3Rpb24iLCBYRkFfRWxlbWVudDo6V3NkbENvbm5lY3Rpb24sCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDI1NGViZDA3LCBMImRlYnVnIiwgWEZBX0VsZW1lbnQ6OkRlYnVnLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDI2NTVjNjZhLCBMImRlbHRhIiwgWEZBX0VsZW1lbnQ6OkRlbHRhLCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgIFhGQV9PYmplY3RUeXBlOjpPYmplY3R9LAotICAgIHsweDI2YzBkYWVjLCBMImVyYU5hbWVzIiwgWEZBX0VsZW1lbnQ6OkVyYU5hbWVzLCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDI3M2FiMDNiLCBMIm1vZGlmeUFubm90cyIsIFhGQV9FbGVtZW50OjpNb2RpZnlBbm5vdHMsCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweDI3ODc1YmI0LCBMInN0YXJ0Tm9kZSIsIFhGQV9FbGVtZW50OjpTdGFydE5vZGUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVZ9LAotICAgIHsweDI4NWQwZGJjLCBMImJ1dHRvbiIsIFhGQV9FbGVtZW50OjpCdXR0b24sCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHgyOGRlZTZlOSwgTCJmb3JtYXQiLCBYRkFfRWxlbWVudDo6Rm9ybWF0LAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4MmEyMzM0OWUsIEwiYm9yZGVyIiwgWEZBX0VsZW1lbnQ6OkJvcmRlciwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDJhZTY3ZjE5LCBMImFyZWEiLCBYRkFfRWxlbWVudDo6QXJlYSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGFpbmVyTm9kZX0sCi0gICAgezB4MmMzYzRjNjcsIEwiaHlwaGVuYXRpb24iLCBYRkFfRWxlbWVudDo6SHlwaGVuYXRpb24sCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHgyZDA4YWY4NSwgTCJ0ZXh0IiwgWEZBX0VsZW1lbnQ6OlRleHQsCi0gICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHgyZDcxYjAwZiwgTCJ0aW1lIiwgWEZBX0VsZW1lbnQ6OlRpbWUsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4MmYxNmEzODIsIEwidHlwZSIsIFhGQV9FbGVtZW50OjpUeXBlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHgyZmUwNTdlOSwgTCJvdmVycHJpbnQiLCBYRkFfRWxlbWVudDo6T3ZlcnByaW50LCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHgzMDJhZWUxNiwgTCJjZXJ0aWZpY2F0ZXMiLCBYRkFfRWxlbWVudDo6Q2VydGlmaWNhdGVzLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4MzBiMjI3ZGYsIEwiZW5jcnlwdGlvbk1ldGhvZHMiLCBYRkFfRWxlbWVudDo6RW5jcnlwdGlvbk1ldGhvZHMsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHgzMmI5MDBkMSwgTCJzZXRQcm9wZXJ0eSIsIFhGQV9FbGVtZW50OjpTZXRQcm9wZXJ0eSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDMzN2Q5ZTQ1LCBMInByaW50ZXJOYW1lIiwgWEZBX0VsZW1lbnQ6OlByaW50ZXJOYW1lLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHgzM2VkZGE0YiwgTCJzdGFydFBhZ2UiLCBYRkFfRWxlbWVudDo6U3RhcnRQYWdlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWfSwKLSAgICB7MHgzODE5NDNlNCwgTCJwYWdlT2Zmc2V0IiwgWEZBX0VsZW1lbnQ6OlBhZ2VPZmZzZXQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4MzgyMTA2Y2QsIEwiZGF0ZVRpbWUiLCBYRkFfRWxlbWVudDo6RGF0ZVRpbWUsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4Mzg2ZTc0MjEsIEwiY29tYiIsIFhGQV9FbGVtZW50OjpDb21iLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4MzkwYWNkOWUsIEwicGF0dGVybiIsIFhGQV9FbGVtZW50OjpQYXR0ZXJuLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4Mzk0MjE2M2UsIEwiaWZFbXB0eSIsIFhGQV9FbGVtZW50OjpJZkVtcHR5LCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWfSwKLSAgICB7MHgzOTk0NGE3YiwgTCJzdXBwcmVzc0Jhbm5lciIsIFhGQV9FbGVtZW50OjpTdXBwcmVzc0Jhbm5lciwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4M2IzYzNkY2EsIEwib3V0cHV0QmluIiwgWEZBX0VsZW1lbnQ6Ok91dHB1dEJpbiwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4M2I4YTQwMjQsIEwiZmllbGQiLCBYRkFfRWxlbWVudDo6RmllbGQsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgIFhGQV9PYmplY3RUeXBlOjpDb250YWluZXJOb2RlfSwKLSAgICB7MHgzYzE1MzUyZiwgTCJhZ2VudCIsIFhGQV9FbGVtZW50OjpBZ2VudCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHgzZDdlODY2OCwgTCJvdXRwdXRYU0wiLCBYRkFfRWxlbWVudDo6T3V0cHV0WFNMLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDNlMWM5MWM1LCBMImFkanVzdERhdGEiLCBYRkFfRWxlbWVudDo6QWRqdXN0RGF0YSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlVn0sCi0gICAgezB4M2U3YTk0MDgsIEwiYXV0b1NhdmUiLCBYRkFfRWxlbWVudDo6QXV0b1NhdmUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVZ9LAotICAgIHsweDNlY2VhZDk0LCBMImNvbnRlbnRBcmVhIiwgWEZBX0VsZW1lbnQ6OkNvbnRlbnRBcmVhLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGFpbmVyTm9kZX0sCi0gICAgezB4M2VmMzM0ZTMsIEwiZXZlbnRQc2V1ZG9Nb2RlbCIsIFhGQV9FbGVtZW50OjpFdmVudFBzZXVkb01vZGVsLAotICAgICBYRkFfWERQUEFDS0VUX1hEUCwgWEZBX09iamVjdFR5cGU6Ok9iamVjdH0sCi0gICAgezB4M2ZhZGFlYzAsIEwid3NkbEFkZHJlc3MiLCBYRkFfRWxlbWVudDo6V3NkbEFkZHJlc3MsCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgWEZBX09iamVjdFR5cGU6OlRleHROb2RlfSwKLSAgICB7MHg0MDYyM2I1YiwgTCJzb2xpZCIsIFhGQV9FbGVtZW50OjpTb2xpZCwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDQxZjBiZDc2LCBMImRhdGVUaW1lU3ltYm9scyIsIFhGQV9FbGVtZW50OjpEYXRlVGltZVN5bWJvbHMsCi0gICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweDQ0NGU3NTIzLCBMImVuY3J5cHRpb25MZXZlbCIsIFhGQV9FbGVtZW50OjpFbmNyeXB0aW9uTGV2ZWwsCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweDQ1MjNhZjU1LCBMImVkZ2UiLCBYRkFfRWxlbWVudDo6RWRnZSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDQ1ZDVlM2MxLCBMInN0aXBwbGUiLCBYRkFfRWxlbWVudDo6U3RpcHBsZSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDQ3NWU0ZTg3LCBMImF0dHJpYnV0ZXMiLCBYRkFfRWxlbWVudDo6QXR0cmlidXRlcywgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlVn0sCi0gICAgezB4NDg3YThjODcsIEwidmVyc2lvbkNvbnRyb2wiLCBYRkFfRWxlbWVudDo6VmVyc2lvbkNvbnRyb2wsCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4NDhlNTI0OGMsIEwibWVyaWRpZW0iLCBYRkFfRWxlbWVudDo6TWVyaWRpZW0sIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LAotICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweDQ4ZjM2NzE5LCBMImV4Y2xHcm91cCIsIFhGQV9FbGVtZW50OjpFeGNsR3JvdXAsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgIFhGQV9PYmplY3RUeXBlOjpDb250YWluZXJOb2RlfSwKLSAgICB7MHg0OTc3MzU2YiwgTCJ0b29sVGlwIiwgWEZBX0VsZW1lbnQ6OlRvb2xUaXAsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpUZXh0Tm9kZX0sCi0gICAgezB4NDk5YWZlY2MsIEwiY29tcHJlc3MiLCBYRkFfRWxlbWVudDo6Q29tcHJlc3MsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4NGEwYzQ5NDgsIEwicmVhc29uIiwgWEZBX0VsZW1lbnQ6OlJlYXNvbiwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6OlRleHROb2RlfSwKLSAgICB7MHg0YmRjY2UxMywgTCJleGVjdXRlIiwgWEZBX0VsZW1lbnQ6OkV4ZWN1dGUsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHg0YzU2YjIxNiwgTCJjb250ZW50Q29weSIsIFhGQV9FbGVtZW50OjpDb250ZW50Q29weSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4NGNjMTc2ZDMsIEwiZGF0ZVRpbWVFZGl0IiwgWEZBX0VsZW1lbnQ6OkRhdGVUaW1lRWRpdCwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDRlMWUzOWI2LCBMImNvbmZpZyIsIFhGQV9FbGVtZW50OjpDb25maWcsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6TW9kZWxOb2RlfSwKLSAgICB7MHg0ZTJkNjA4MywgTCJpbWFnZSIsIFhGQV9FbGVtZW50OjpJbWFnZSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHg0ZTgxNDE1MCwgTCIjeEhUTUwiLCBYRkFfRWxlbWVudDo6U2hhcnB4SFRNTCwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQgfAotICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0IHwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfAotICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVZ9LAotICAgIHsweDRmMjM4OGMxLCBMIm51bWJlck9mQ29waWVzIiwgWEZBX0VsZW1lbnQ6Ok51bWJlck9mQ29waWVzLAotICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHg0ZjUxMmUzMCwgTCJiZWhhdmlvck92ZXJyaWRlIiwgWEZBX0VsZW1lbnQ6OkJlaGF2aW9yT3ZlcnJpZGUsCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweDRmZGMzNDU0LCBMInRpbWVTdGFtcCIsIFhGQV9FbGVtZW50OjpUaW1lU3RhbXAsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHg1MWQ5MDU0NiwgTCJtb250aCIsIFhGQV9FbGVtZW50OjpNb250aCwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4NTIzNDM3ZTQsIEwidmlld2VyUHJlZmVyZW5jZXMiLCBYRkFfRWxlbWVudDo6Vmlld2VyUHJlZmVyZW5jZXMsCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4NTNhYmMxYzYsIEwic2NyaXB0TW9kZWwiLCBYRkFfRWxlbWVudDo6U2NyaXB0TW9kZWwsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweDU0MDM0YzJmLCBMImRlY2ltYWwiLCBYRkFfRWxlbWVudDo6RGVjaW1hbCwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHg1NDIwMmM5ZSwgTCJzdWJmb3JtIiwgWEZBX0VsZW1lbnQ6OlN1YmZvcm0sCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgIFhGQV9PYmplY3RUeXBlOjpDb250YWluZXJOb2RlfSwKLSAgICB7MHg1NDJjNzMwMCwgTCJzZWxlY3QiLCBYRkFfRWxlbWVudDo6U2VsZWN0LCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwKLSAgICAgWEZBX09iamVjdFR5cGU6OlRleHROb2RlfSwKLSAgICB7MHg1NDM2ZDE5OCwgTCJ3aW5kb3ciLCBYRkFfRWxlbWVudDo6V2luZG93LCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWfSwKLSAgICB7MHg1NDczYjZkYywgTCJsb2NhbGVTZXQiLCBYRkFfRWxlbWVudDo6TG9jYWxlU2V0LAotICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT2JqZWN0VHlwZTo6TW9kZWxOb2RlfSwKLSAgICB7MHg1NmFlMTc5ZSwgTCJoYW5kbGVyIiwgWEZBX0VsZW1lbnQ6OkhhbmRsZXIsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpUZXh0Tm9kZX0sCi0gICAgezB4NTcwMGJkNWYsIEwiaG9zdFBzZXVkb01vZGVsIiwgWEZBX0VsZW1lbnQ6Okhvc3RQc2V1ZG9Nb2RlbCwKLSAgICAgWEZBX1hEUFBBQ0tFVF9YRFAsIFhGQV9PYmplY3RUeXBlOjpPYmplY3R9LAotICAgIHsweDU3MGNlODM1LCBMInByZXNlbmNlIiwgWEZBX0VsZW1lbnQ6OlByZXNlbmNlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWfSwKLSAgICB7MHg1Nzc5ZDY1ZiwgTCJyZWNvcmQiLCBYRkFfRWxlbWVudDo6UmVjb3JkLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWfSwKLSAgICB7MHg1OWM4ZjI3ZCwgTCJlbWJlZCIsIFhGQV9FbGVtZW50OjpFbWJlZCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4NWE1MGU5ZTYsIEwidmVyc2lvbiIsIFhGQV9FbGVtZW50OjpWZXJzaW9uLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHg1YjgzODNkZiwgTCJjb21tYW5kIiwgWEZBX0VsZW1lbnQ6OkNvbW1hbmQsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4NWM0M2M2YzMsIEwiY29waWVzIiwgWEZBX0VsZW1lbnQ6OkNvcGllcywgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4NWUwYzJjNDksIEwic3RhcGxlIiwgWEZBX0VsZW1lbnQ6OlN0YXBsZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHg1ZTUwODNkZCwgTCJzdWJtaXRGb3JtYXQiLCBYRkFfRWxlbWVudDo6U3VibWl0Rm9ybWF0LAotICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHg1ZThjNWQyMCwgTCJib29sZWFuIiwgWEZBX0VsZW1lbnQ6OkJvb2xlYW4sCi0gICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHg2MDQ5MGE4NSwgTCJtZXNzYWdlIiwgWEZBX0VsZW1lbnQ6Ok1lc3NhZ2UsCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDYwZDRjOGIxLCBMIm91dHB1dCIsIFhGQV9FbGVtZW50OjpPdXRwdXQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4NjE4MTAwODEsIEwicHNNYXAiLCBYRkFfRWxlbWVudDo6UHNNYXAsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4NjJiZDkwNGIsIEwiZXhjbHVkZU5TIiwgWEZBX0VsZW1lbnQ6OkV4Y2x1ZGVOUywgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlVn0sCi0gICAgezB4NjY5ZDRmNzcsIEwiYXNzaXN0IiwgWEZBX0VsZW1lbnQ6OkFzc2lzdCwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDY3MzM0YTFjLCBMInBpY3R1cmUiLCBYRkFfRWxlbWVudDo6UGljdHVyZSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweDY3ZmU3MzM0LCBMInRyYXZlcnNhbCIsIFhGQV9FbGVtZW50OjpUcmF2ZXJzYWwsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHg2ODk0NTg5YywgTCJzaWxlbnRQcmludCIsIFhGQV9FbGVtZW50OjpTaWxlbnRQcmludCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHg2OGExNmJiZCwgTCJ3ZWJDbGllbnQiLCBYRkFfRWxlbWVudDo6V2ViQ2xpZW50LCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDY5ZjExNWRmLCBMImxheW91dFBzZXVkb01vZGVsIiwgWEZBX0VsZW1lbnQ6OkxheW91dFBzZXVkb01vZGVsLAotICAgICBYRkFfWERQUEFDS0VUX1hEUCwgWEZBX09iamVjdFR5cGU6Ok9iamVjdH0sCi0gICAgezB4NmE0YmMwODQsIEwicHJvZHVjZXIiLCBYRkFfRWxlbWVudDo6UHJvZHVjZXIsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweDZhOWUwNGM5LCBMImNvcm5lciIsIFhGQV9FbGVtZW50OjpDb3JuZXIsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHg2Y2NkNzI3NCwgTCJtc2dJZCIsIFhGQV9FbGVtZW50OjpNc2dJZCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlVn0sCi0gICAgezB4NmU2NzkyMWYsIEwiY29sb3IiLCBYRkFfRWxlbWVudDo6Q29sb3IsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHg2ZWMyMTdhNSwgTCJrZWVwIiwgWEZBX0VsZW1lbnQ6OktlZXAsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHg2ZWVmMTExNiwgTCJxdWVyeSIsIFhGQV9FbGVtZW50OjpRdWVyeSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHg3MDMzYmZkNSwgTCJpbnNlcnQiLCBYRkFfRWxlbWVudDo6SW5zZXJ0LCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwKLSAgICAgWEZBX09iamVjdFR5cGU6OlRleHROb2RlfSwKLSAgICB7MHg3MDRhZjM4OSwgTCJpbWFnZUVkaXQiLCBYRkFfRWxlbWVudDo6SW1hZ2VFZGl0LAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4NzIzMzAxOGEsIEwidmFsaWRhdGUiLCBYRkFfRWxlbWVudDo6VmFsaWRhdGUsCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHg3MmJhNDdiNCwgTCJkaWdlc3RNZXRob2RzIiwgWEZBX0VsZW1lbnQ6OkRpZ2VzdE1ldGhvZHMsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHg3MmYyYWE3YSwgTCJudW1iZXJQYXR0ZXJucyIsIFhGQV9FbGVtZW50OjpOdW1iZXJQYXR0ZXJucywKLSAgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHg3NGNhZWQyOSwgTCJwYWdlU2V0IiwgWEZBX0VsZW1lbnQ6OlBhZ2VTZXQsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgIFhGQV9PYmplY3RUeXBlOjpDb250YWluZXJOb2RlfSwKLSAgICB7MHg3NTY4ZTZhZSwgTCJpbnRlZ2VyIiwgWEZBX0VsZW1lbnQ6OkludGVnZXIsCi0gICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHg3NjE4MmRiOSwgTCJzb2FwQWRkcmVzcyIsIFhGQV9FbGVtZW50OjpTb2FwQWRkcmVzcywKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfT2JqZWN0VHlwZTo6VGV4dE5vZGV9LAotICAgIHsweDc3MzE0NmM1LCBMImVxdWF0ZSIsIFhGQV9FbGVtZW50OjpFcXVhdGUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVZ9LAotICAgIHsweDc3ZDQ0OWRkLCBMImZvcm1GaWVsZEZpbGxpbmciLCBYRkFfRWxlbWVudDo6Rm9ybUZpZWxkRmlsbGluZywKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4Nzg4OWQ2OGEsIEwicGFnZVJhbmdlIiwgWEZBX0VsZW1lbnQ6OlBhZ2VSYW5nZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4N2JhY2EyZTMsIEwidXBkYXRlIiwgWEZBX0VsZW1lbnQ6OlVwZGF0ZSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpUZXh0Tm9kZX0sCi0gICAgezB4N2NlODkwMDEsIEwiY29ubmVjdFN0cmluZyIsIFhGQV9FbGVtZW50OjpDb25uZWN0U3RyaW5nLAotICAgICBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwgWEZBX09iamVjdFR5cGU6OlRleHROb2RlfSwKLSAgICB7MHg3ZDlmZDdjNSwgTCJtb2RlIiwgWEZBX0VsZW1lbnQ6Ok1vZGUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweDdlN2U4NDVlLCBMImxheW91dCIsIFhGQV9FbGVtZW50OjpMYXlvdXQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweDdlODQ1YzM0LCBMIiN4bWwiLCBYRkFfRWxlbWVudDo6U2hhcnB4bWwsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlVn0sCi0gICAgezB4N2ZiMzQxZGYsIEwieHNkQ29ubmVjdGlvbiIsIFhGQV9FbGVtZW50OjpYc2RDb25uZWN0aW9uLAotICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHg3ZmZiNTFjYywgTCJ0cmF2ZXJzZSIsIFhGQV9FbGVtZW50OjpUcmF2ZXJzZSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDgwMjAzYjVhLCBMImVuY29kaW5ncyIsIFhGQV9FbGVtZW50OjpFbmNvZGluZ3MsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHg4MDM1NTBmYywgTCJ0ZW1wbGF0ZSIsIFhGQV9FbGVtZW50OjpUZW1wbGF0ZSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBYRkFfT2JqZWN0VHlwZTo6TW9kZWxOb2RlfSwKLSAgICB7MHg4MDNkNWJiYywgTCJhY3JvYmF0IiwgWEZBX0VsZW1lbnQ6OkFjcm9iYXQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4ODIxZDY1NjksIEwidmFsaWRhdGlvbk1lc3NhZ2luZyIsIFhGQV9FbGVtZW50OjpWYWxpZGF0aW9uTWVzc2FnaW5nLAotICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09iamVjdFR5cGU6Ok5vZGVWfSwKLSAgICB7MHg4MzBlNjg4ZiwgTCJzaWduaW5nIiwgWEZBX0VsZW1lbnQ6OlNpZ25pbmcsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHg4M2E1NTBkMiwgTCJkYXRhV2luZG93IiwgWEZBX0VsZW1lbnQ6OkRhdGFXaW5kb3csIFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpPYmplY3R9LAotICAgIHsweDgzZGFiOWY1LCBMInNjcmlwdCIsIFhGQV9FbGVtZW50OjpTY3JpcHQsCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHg4NDExZWJjZCwgTCJhZGRWaWV3ZXJQcmVmZXJlbmNlcyIsIFhGQV9FbGVtZW50OjpBZGRWaWV3ZXJQcmVmZXJlbmNlcywKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4ODc3NzY0MmUsIEwiYWx3YXlzRW1iZWQiLCBYRkFfRWxlbWVudDo6QWx3YXlzRW1iZWQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVZ9LAotICAgIHsweDg3N2E2YjM5LCBMInBhc3N3b3JkRWRpdCIsIFhGQV9FbGVtZW50OjpQYXNzd29yZEVkaXQsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHg4N2U4NGM5OSwgTCJudW1lcmljRWRpdCIsIFhGQV9FbGVtZW50OjpOdW1lcmljRWRpdCwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDg4NTJjZGVjLCBMImVuY3J5cHRpb25NZXRob2QiLCBYRkFfRWxlbWVudDo6RW5jcnlwdGlvbk1ldGhvZCwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGVDfSwKLSAgICB7MHg4OTFmNDYwNiwgTCJjaGFuZ2UiLCBYRkFfRWxlbWVudDo6Q2hhbmdlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHg4OTkzOWYzNiwgTCJwYWdlQXJlYSIsIFhGQV9FbGVtZW50OjpQYWdlQXJlYSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGV9LAotICAgIHsweDhhOWQ2MjQ3LCBMInN1Ym1pdFVybCIsIFhGQV9FbGVtZW50OjpTdWJtaXRVcmwsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweDhhZDhiOTBmLCBMIm9pZHMiLCBYRkFfRWxlbWVudDo6T2lkcywKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDhiMDM2ZjMyLCBMInNpZ25hdHVyZSIsIFhGQV9FbGVtZW50OjpTaWduYXR1cmUsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHg4YjEyOGVmYiwgTCJBREJFX0pTQ29uc29sZSIsIFhGQV9FbGVtZW50OjpBREJFX0pTQ29uc29sZSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4OGJjZmU5NmUsIEwiY2FwdGlvbiIsIFhGQV9FbGVtZW50OjpDYXB0aW9uLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4OGUxYzI5MjEsIEwicmVsZXZhbnQiLCBYRkFfRWxlbWVudDo6UmVsZXZhbnQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVZ9LAotICAgIHsweDhlM2YwYTRiLCBMImZsaXBMYWJlbCIsIFhGQV9FbGVtZW50OjpGbGlwTGFiZWwsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVZ9LAotICAgIHsweDkwMDI4MGI3LCBMImV4RGF0YSIsIFhGQV9FbGVtZW50OjpFeERhdGEsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4OTFlODAzNTIsIEwiZGF5TmFtZXMiLCBYRkFfRWxlbWVudDo6RGF5TmFtZXMsIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4OTMxMTNiMTEsIEwic29hcEFjdGlvbiIsIFhGQV9FbGVtZW50OjpTb2FwQWN0aW9uLAotICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsIFhGQV9PYmplY3RUeXBlOjpUZXh0Tm9kZX0sCi0gICAgezB4OTM4YjA5ZjYsIEwiZGVmYXVsdFR5cGVmYWNlIiwgWEZBX0VsZW1lbnQ6OkRlZmF1bHRUeXBlZmFjZSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PYmplY3RUeXBlOjpOb2RlVn0sCi0gICAgezB4OTViMzc4OTcsIEwibWFuaWZlc3QiLCBYRkFfRWxlbWVudDo6TWFuaWZlc3QsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHg5N2I3NmI1NCwgTCJvdmVyZmxvdyIsIFhGQV9FbGVtZW50OjpPdmVyZmxvdywKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweDlhNTc4NjFiLCBMImxpbmVhciIsIFhGQV9FbGVtZW50OjpMaW5lYXIsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHg5YWQ1YTgyMSwgTCJjdXJyZW5jeVN5bWJvbCIsIFhGQV9FbGVtZW50OjpDdXJyZW5jeVN5bWJvbCwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4OWM2NDcxYjMsIEwiZGVsZXRlIiwgWEZBX0VsZW1lbnQ6OkRlbGV0ZSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpUZXh0Tm9kZX0sCi0gICAgezB4OWRlZWE2MWQsIEwiZGVsdGFzIiwgWEZBX0VsZW1lbnQ6OkRlbHRhcywgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBYRkFfT2JqZWN0VHlwZTo6T2JqZWN0fSwKLSAgICB7MHg5ZTY3ZGUyMSwgTCJkaWdlc3RNZXRob2QiLCBYRkFfRWxlbWVudDo6RGlnZXN0TWV0aG9kLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZUN9LAotICAgIHsweDlmM2U5NTEwLCBMImluc3RhbmNlTWFuYWdlciIsIFhGQV9FbGVtZW50OjpJbnN0YW5jZU1hbmFnZXIsCi0gICAgIFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweGEwNzk5ODkyLCBMImVxdWF0ZVJhbmdlIiwgWEZBX0VsZW1lbnQ6OkVxdWF0ZVJhbmdlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWfSwKLSAgICB7MHhhMDg0YTM4MSwgTCJtZWRpdW0iLCBYRkFfRWxlbWVudDo6TWVkaXVtLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4YTEyMTFiOGIsIEwidGV4dEVkaXQiLCBYRkFfRWxlbWVudDo6VGV4dEVkaXQsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhhMTcwMDhmMCwgTCJ0ZW1wbGF0ZUNhY2hlIiwgWEZBX0VsZW1lbnQ6OlRlbXBsYXRlQ2FjaGUsCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4YTRmN2I4OGYsIEwiY29tcHJlc3NPYmplY3RTdHJlYW0iLCBYRkFfRWxlbWVudDo6Q29tcHJlc3NPYmplY3RTdHJlYW0sCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweGE2NWY1ZDE3LCBMImRhdGFWYWx1ZSIsIFhGQV9FbGVtZW50OjpEYXRhVmFsdWUsIFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhhNmNhYWE4OSwgTCJhY2Nlc3NpYmxlQ29udGVudCIsIFhGQV9FbGVtZW50OjpBY2Nlc3NpYmxlQ29udGVudCwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4YThjN2Q1ZTIsIEwibm9kZUxpc3QiLCBYRkFfRWxlbWVudDo6Tm9kZUxpc3QsIFhGQV9YRFBQQUNLRVRfWERQLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZUxpc3R9LAotICAgIHsweGE5NGNjMDBiLCBMImluY2x1ZGVYRFBDb250ZW50IiwgWEZBX0VsZW1lbnQ6OkluY2x1ZGVYRFBDb250ZW50LAotICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHhhOWIwODFhMSwgTCJ4bWxDb25uZWN0aW9uIiwgWEZBX0VsZW1lbnQ6OlhtbENvbm5lY3Rpb24sCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweGFiMmEzYjc0LCBMInZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzIiwKLSAgICAgWEZBX0VsZW1lbnQ6OlZhbGlkYXRlQXBwcm92YWxTaWduYXR1cmVzLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWfSwKLSAgICB7MHhhYjhjNWEyYiwgTCJzaWduRGF0YSIsIFhGQV9FbGVtZW50OjpTaWduRGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweGFiYWEyY2ViLCBMInBhY2tldHMiLCBYRkFfRWxlbWVudDo6UGFja2V0cywgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4YWRiYTM1OWMsIEwiZGF0ZVBhdHRlcm4iLCBYRkFfRWxlbWVudDo6RGF0ZVBhdHRlcm4sCi0gICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweGFlMjIyYjJiLCBMImR1cGxleE9wdGlvbiIsIFhGQV9FbGVtZW50OjpEdXBsZXhPcHRpb24sCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweGIwMTJlZmZiLCBMImJhc2UiLCBYRkFfRWxlbWVudDo6QmFzZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4YjBlNTQ4NWQsIEwiYmluZCIsIFhGQV9FbGVtZW50OjpCaW5kLAotICAgICBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhiNDVkNjFiMiwgTCJjb21wcmVzc2lvbiIsIFhGQV9FbGVtZW50OjpDb21wcmVzc2lvbiwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhiNTYzZjBmZiwgTCJ1c2VyIiwgWEZBX0VsZW1lbnQ6OlVzZXIsIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LAotICAgICBYRkFfT2JqZWN0VHlwZTo6VGV4dE5vZGV9LAotICAgIHsweGI1ODQ4YWQ1LCBMInJlY3RhbmdsZSIsIFhGQV9FbGVtZW50OjpSZWN0YW5nbGUsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhiNmRhY2I3MiwgTCJlZmZlY3RpdmVPdXRwdXRQb2xpY3kiLCBYRkFfRWxlbWVudDo6RWZmZWN0aXZlT3V0cHV0UG9saWN5LAotICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhiN2Q3NjU0ZCwgTCJBREJFX0pTRGVidWdnZXIiLCBYRkFfRWxlbWVudDo6QURCRV9KU0RlYnVnZ2VyLAotICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHhiYWIzN2Y3MywgTCJhY3JvYmF0NyIsIFhGQV9FbGVtZW50OjpBY3JvYmF0NywgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhiYzcwMDgxZSwgTCJpbnRlcmFjdGl2ZSIsIFhGQV9FbGVtZW50OjpJbnRlcmFjdGl2ZSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4YmM4ZmEzNTAsIEwibG9jYWxlIiwgWEZBX0VsZW1lbnQ6OkxvY2FsZSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweGJjZDQ0OTQwLCBMImN1cnJlbnRQYWdlIiwgWEZBX0VsZW1lbnQ6OkN1cnJlbnRQYWdlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHhiZGU5YWJkYSwgTCJkYXRhIiwgWEZBX0VsZW1lbnQ6OkRhdGEsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4YmRlOWFiZGUsIEwiZGF0ZSIsIFhGQV9FbGVtZW50OjpEYXRlLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLCBYRkFfRWxlbWVudDo6RGVzYywKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweGJmNGI2NDA1LCBMImVuY3J5cHQiLCBYRkFfRWxlbWVudDo6RW5jcnlwdCwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweGJmYTg3Y2NlLCBMImRyYXciLCBYRkFfRWxlbWVudDo6RHJhdywKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGV9LAotICAgIHsweGMxODFmZjRiLCBMImVuY3J5cHRpb24iLCBYRkFfRWxlbWVudDo6RW5jcnlwdGlvbiwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhjMTk3MGY0MCwgTCJtZXJpZGllbU5hbWVzIiwgWEZBX0VsZW1lbnQ6Ok1lcmlkaWVtTmFtZXMsCi0gICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4YzVhZDlmNWUsIEwibWVzc2FnaW5nIiwgWEZBX0VsZW1lbnQ6Ok1lc3NhZ2luZywgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhjNjk1NDlmNCwgTCJzcGVhayIsIFhGQV9FbGVtZW50OjpTcGVhaywKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6OlRleHROb2RlfSwKLSAgICB7MHhjNzc0M2RjNywgTCJkYXRhR3JvdXAiLCBYRkFfRWxlbWVudDo6RGF0YUdyb3VwLCBYRkFfWERQUEFDS0VUX0RhdGFzZXRzLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4YzdlYjIwZTksIEwiY29tbW9uIiwgWEZBX0VsZW1lbnQ6OkNvbW1vbiwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhjODVkNDUyOCwgTCIjdGV4dCIsIFhGQV9FbGVtZW50OjpTaGFycHRleHQsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0IHwKLSAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCB8IFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwKLSAgICAgICAgIFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWfSwKLSAgICB7MHhjODYxNTU2YSwgTCJwYWdpbmF0aW9uT3ZlcnJpZGUiLCBYRkFfRWxlbWVudDo6UGFnaW5hdGlvbk92ZXJyaWRlLAotICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHhjOTAzZGFiYiwgTCJyZWFzb25zIiwgWEZBX0VsZW1lbnQ6OlJlYXNvbnMsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhjOWE4MTI3ZiwgTCJzaWduYXR1cmVQcm9wZXJ0aWVzIiwgWEZBX0VsZW1lbnQ6OlNpZ25hdHVyZVByb3BlcnRpZXMsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhjYTAxMGMyZCwgTCJ0aHJlc2hvbGQiLCBYRkFfRWxlbWVudDo6VGhyZXNob2xkLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWfSwKLSAgICB7MHhjYjRjNWU5NiwgTCJhcHBlYXJhbmNlRmlsdGVyIiwgWEZBX0VsZW1lbnQ6OkFwcGVhcmFuY2VGaWx0ZXIsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlQ30sCi0gICAgezB4Y2M5MmFiYTcsIEwiZmlsbCIsIFhGQV9FbGVtZW50OjpGaWxsLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4Y2QzMDhiNzcsIEwiZm9udCIsIFhGQV9FbGVtZW50OjpGb250LAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhjZDMwOWZmNCwgTCJmb3JtIiwgWEZBX0VsZW1lbnQ6OkZvcm0sIFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgWEZBX09iamVjdFR5cGU6Ok1vZGVsTm9kZX0sCi0gICAgezB4Y2ViY2NhMmQsIEwibWVkaXVtSW5mbyIsIFhGQV9FbGVtZW50OjpNZWRpdW1JbmZvLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweGNmZTBkNjQzLCBMImNlcnRpZmljYXRlIiwgWEZBX0VsZW1lbnQ6OkNlcnRpZmljYXRlLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6VGV4dE5vZGV9LAotICAgIHsweGQwMTJjMDMzLCBMInBhc3N3b3JkIiwgWEZBX0VsZW1lbnQ6OlBhc3N3b3JkLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwKLSAgICAgWEZBX09iamVjdFR5cGU6OlRleHROb2RlfSwKLSAgICB7MHhkMDE2MDRiZCwgTCJydW5TY3JpcHRzIiwgWEZBX0VsZW1lbnQ6OlJ1blNjcmlwdHMsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweGQxMjI3ZTZmLCBMInRyYWNlIiwgWEZBX0VsZW1lbnQ6OlRyYWNlLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweGQxNTMyODc2LCBMImZsb2F0IiwgWEZBX0VsZW1lbnQ6OkZsb2F0LAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweGQxN2E2YzMwLCBMInJlbmRlclBvbGljeSIsIFhGQV9FbGVtZW50OjpSZW5kZXJQb2xpY3ksCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweGQ0YmY2ODIzLCBMImxvZ1BzZXVkb01vZGVsIiwgWEZBX0VsZW1lbnQ6OkxvZ1BzZXVkb01vZGVsLAotICAgICBYRkFfWERQUEFDS0VUX1hEUCwgWEZBX09iamVjdFR5cGU6Ok9iamVjdH0sCi0gICAgezB4ZDU4YWE5NjIsIEwiZGVzdGluYXRpb24iLCBYRkFfRWxlbWVudDo6RGVzdGluYXRpb24sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwgWEZBX0VsZW1lbnQ6OlZhbHVlLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4ZDdhMTQ0NjIsIEwiYm9va2VuZCIsIFhGQV9FbGVtZW50OjpCb29rZW5kLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4ZDhjMzEyNTQsIEwiZXhPYmplY3QiLCBYRkFfRWxlbWVudDo6RXhPYmplY3QsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhkYTZhODU5MCwgTCJvcGVuQWN0aW9uIiwgWEZBX0VsZW1lbnQ6Ok9wZW5BY3Rpb24sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4ZGFiNGZiN2QsIEwibmV2ZXJFbWJlZCIsIFhGQV9FbGVtZW50OjpOZXZlckVtYmVkLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWfSwKLSAgICB7MHhkYjk4NDc1ZiwgTCJiaW5kSXRlbXMiLCBYRkFfRWxlbWVudDo6QmluZEl0ZW1zLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4ZGJmYmUwMmUsIEwiY2FsY3VsYXRlIiwgWEZBX0VsZW1lbnQ6OkNhbGN1bGF0ZSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweGRkNzY3NmVkLCBMInByaW50IiwgWEZBX0VsZW1lbnQ6OlByaW50LCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHhkZGUyNzNkNywgTCJleHRyYXMiLCBYRkFfRWxlbWVudDo6RXh0cmFzLAotICAgICBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhkZTE0NmIzNCwgTCJwcm90byIsIFhGQV9FbGVtZW50OjpQcm90bywKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweGRmMDU5MzIxLCBMImRTaWdEYXRhIiwgWEZBX0VsZW1lbnQ6OkRTaWdEYXRhLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4ZGZjY2YwMzAsIEwiY3JlYXRvciIsIFhGQV9FbGVtZW50OjpDcmVhdG9yLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHhkZmY3OGM2YSwgTCJjb25uZWN0IiwgWEZBX0VsZW1lbnQ6OkNvbm5lY3QsCi0gICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweGUxMWEyY2JjLCBMInBlcm1pc3Npb25zIiwgWEZBX0VsZW1lbnQ6OlBlcm1pc3Npb25zLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweGUxNGM4MDFjLCBMImNvbm5lY3Rpb25TZXQiLCBYRkFfRWxlbWVudDo6Q29ubmVjdGlvblNldCwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBYRkFfT2JqZWN0VHlwZTo6TW9kZWxOb2RlfSwKLSAgICB7MHhlMWM4M2ExNCwgTCJzdWJtaXQiLCBYRkFfRWxlbWVudDo6U3VibWl0LAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4ZTI5ODIxY2QsIEwicmFuZ2UiLCBYRkFfRWxlbWVudDo6UmFuZ2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVZ9LAotICAgIHsweGUzOGQ4M2M3LCBMImxpbmVhcml6ZWQiLCBYRkFfRWxlbWVudDo6TGluZWFyaXplZCwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4ZTNhYTI1NzgsIEwicGFja2V0IiwgWEZBX0VsZW1lbnQ6OlBhY2tldCwgWEZBX1hEUFBBQ0tFVF9YRFAsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlQ30sCi0gICAgezB4ZTNhYTg2MGUsIEwicm9vdEVsZW1lbnQiLCBYRkFfRWxlbWVudDo6Um9vdEVsZW1lbnQsCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgWEZBX09iamVjdFR5cGU6OlRleHROb2RlfSwKLSAgICB7MHhlM2U1NTNmYSwgTCJwbGFpbnRleHRNZXRhZGF0YSIsIFhGQV9FbGVtZW50OjpQbGFpbnRleHRNZXRhZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4ZTNlNmU0ZjIsIEwibnVtYmVyU3ltYm9scyIsIFhGQV9FbGVtZW50OjpOdW1iZXJTeW1ib2xzLAotICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweGUzZjA2N2Y2LCBMInByaW50SGlnaFF1YWxpdHkiLCBYRkFfRWxlbWVudDo6UHJpbnRIaWdoUXVhbGl0eSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4ZTNmZDA3OGMsIEwiZHJpdmVyIiwgWEZBX0VsZW1lbnQ6OkRyaXZlciwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhlNDhiMzRmMiwgTCJpbmNyZW1lbnRhbExvYWQiLCBYRkFfRWxlbWVudDo6SW5jcmVtZW50YWxMb2FkLAotICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09iamVjdFR5cGU6Ok5vZGVWfSwKLSAgICB7MHhlNTUwZTdjMiwgTCJzdWJqZWN0RE4iLCBYRkFfRWxlbWVudDo6U3ViamVjdEROLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZUN9LAotICAgIHsweGU2NjY5YTc4LCBMImNvbXByZXNzTG9naWNhbFN0cnVjdHVyZSIsCi0gICAgIFhGQV9FbGVtZW50OjpDb21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweGU3YTdlYTAyLCBMImluY3JlbWVudGFsTWVyZ2UiLCBYRkFfRWxlbWVudDo6SW5jcmVtZW50YWxNZXJnZSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcsIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZX0sCi0gICAgezB4ZTk0ODUzMGQsIEwicmFkaWFsIiwgWEZBX0VsZW1lbnQ6OlJhZGlhbCwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweGVhOGQ2OTk5LCBMInZhcmlhYmxlcyIsIFhGQV9FbGVtZW50OjpWYXJpYWJsZXMsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgIFhGQV9PYmplY3RUeXBlOjpDb250YWluZXJOb2RlfSwKLSAgICB7MHhlYWExNDJjMCwgTCJ0aW1lUGF0dGVybnMiLCBYRkFfRWxlbWVudDo6VGltZVBhdHRlcm5zLAotICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweGViOTQzYTcxLCBMImVmZmVjdGl2ZUlucHV0UG9saWN5IiwgWEZBX0VsZW1lbnQ6OkVmZmVjdGl2ZUlucHV0UG9saWN5LAotICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQsIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhlZjA0YTJiYywgTCJuYW1lQXR0ciIsIFhGQV9FbGVtZW50OjpOYW1lQXR0ciwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlVn0sCi0gICAgezB4ZjA3MjIyYWIsIEwiY29uZm9ybWFuY2UiLCBYRkFfRWxlbWVudDo6Q29uZm9ybWFuY2UsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweGYwYWFhYWRjLCBMInRyYW5zZm9ybSIsIFhGQV9FbGVtZW50OjpUcmFuc2Zvcm0sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4ZjE0MzNlODgsIEwibG9ja0RvY3VtZW50IiwgWEZBX0VsZW1lbnQ6OkxvY2tEb2N1bWVudCwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHhmNTRlYjk5NywgTCJicmVha0FmdGVyIiwgWEZBX0VsZW1lbnQ6OkJyZWFrQWZ0ZXIsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhmNjE2ZGEyOCwgTCJsaW5lIiwgWEZBX0VsZW1lbnQ6OkxpbmUsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhmNjE2ZjNkYywgTCJsaXN0IiwgWEZBX0VsZW1lbnQ6Okxpc3QsIFhGQV9YRFBQQUNLRVRfWERQLAotICAgICBYRkFfT2JqZWN0VHlwZTo6TGlzdH0sCi0gICAgezB4ZjcwNTVmYjEsIEwic291cmNlIiwgWEZBX0VsZW1lbnQ6OlNvdXJjZSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsCi0gICAgIFhGQV9PYmplY3RUeXBlOjpOb2RlfSwKLSAgICB7MHhmN2VlYmUxYywgTCJvY2N1ciIsIFhGQV9FbGVtZW50OjpPY2N1ciwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgWEZBX09iamVjdFR5cGU6Ok5vZGV9LAotICAgIHsweGY4ZDEwZDk3LCBMInBpY2tUcmF5QnlQREZTaXplIiwgWEZBX0VsZW1lbnQ6OlBpY2tUcmF5QnlQREZTaXplLAotICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgWEZBX09iamVjdFR5cGU6OkNvbnRlbnROb2RlfSwKLSAgICB7MHhmOGYxOWUzYSwgTCJtb250aE5hbWVzIiwgWEZBX0VsZW1lbnQ6Ok1vbnRoTmFtZXMsCi0gICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi0gICAgezB4Zjk4NDE0OWIsIEwic2V2ZXJpdHkiLCBYRkFfRWxlbWVudDo6U2V2ZXJpdHksIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Tm9kZVZ9LAotICAgIHsweGY5YmNiMDM3LCBMImdyb3VwUGFyZW50IiwgWEZBX0VsZW1lbnQ6Okdyb3VwUGFyZW50LCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgWEZBX09iamVjdFR5cGU6Ok5vZGVWfSwKLSAgICB7MHhmYmM0MmZmZiwgTCJkb2N1bWVudEFzc2VtYmx5IiwgWEZBX0VsZW1lbnQ6OkRvY3VtZW50QXNzZW1ibHksCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweGZjNzgxNTlmLCBMIm51bWJlclN5bWJvbCIsIFhGQV9FbGVtZW50OjpOdW1iZXJTeW1ib2wsCi0gICAgIFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0LCBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweGZjYmQ2MDZjLCBMInRhZ2dlZCIsIFhGQV9FbGVtZW50OjpUYWdnZWQsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGV9LAotICAgIHsweGZmMDYzODAyLCBMIml0ZW1zIiwgWEZBX0VsZW1lbnQ6Okl0ZW1zLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfT2JqZWN0VHlwZTo6Tm9kZX0sCi19OwotY29uc3QgaW50MzJfdCBnX2lYRkFFbGVtZW50Q291bnQgPSBGWF9BcnJheVNpemUoZ19YRkFFbGVtZW50RGF0YSk7Ci1zdGF0aWNfYXNzZXJ0KGdfaVhGQUVsZW1lbnRDb3VudCA9PQotICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PGludDMyX3Q+KFhGQV9FbGVtZW50OjpJdGVtcykgKyAxKSwKLSAgICAgICAgICAgICAgImdfWEZBRWxlbWVudERhdGEgc2l6ZSBkb2VzIG5vdCBtYXRjaCBYRkFfRWxlbWVudHMiKTsKLQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL3hmYV9iYXNpY19kYXRhLmggYi94ZmEvZnhmYS9wYXJzZXIveGZhX2Jhc2ljX2RhdGEuaAppbmRleCA1Yjk3ZWUyLi5iMzk0ZDM1IDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIveGZhX2Jhc2ljX2RhdGEuaAorKysgYi94ZmEvZnhmYS9wYXJzZXIveGZhX2Jhc2ljX2RhdGEuaApAQCAtNyw0MSArNywxNiBAQAogI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfWEZBX0JBU0lDX0RBVEFfSF8KICNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX1hGQV9CQVNJQ19EQVRBX0hfCiAKKyNpbmNsdWRlIDxtYXA+CisKICNpbmNsdWRlICJ4ZmEvZnhmYS9meGZhX2Jhc2ljLmgiCiAKLWV4dGVybiBjb25zdCBYRkFfUEFDS0VUSU5GTyBnX1hGQVBhY2tldERhdGFbXTsKLWV4dGVybiBjb25zdCBpbnQzMl90IGdfaVhGQVBhY2tldENvdW50OwotCi1leHRlcm4gY29uc3QgWEZBX0FUVFJJQlVURUVOVU1JTkZPIGdfWEZBRW51bURhdGFbXTsKK2V4dGVybiBjb25zdCBYRkFfQXR0cmlidXRlRW51bUluZm8gZ19YRkFFbnVtRGF0YVtdOwogZXh0ZXJuIGNvbnN0IGludDMyX3QgZ19pWEZBRW51bUNvdW50OwogCi1leHRlcm4gY29uc3QgWEZBX0FUVFJJQlVURUlORk8gZ19YRkFBdHRyaWJ1dGVEYXRhW107Ci1leHRlcm4gY29uc3QgaW50MzJfdCBnX2lYRkFBdHRyaWJ1dGVDb3VudDsKLQotZXh0ZXJuIGNvbnN0IFhGQV9OT1RTVVJFQVRUUklCVVRFIGdfWEZBTm90c3VyZUF0dHJpYnV0ZXNbXTsKLWV4dGVybiBjb25zdCBpbnQzMl90IGdfaVhGQU5vdHN1cmVDb3VudDsKLQotZXh0ZXJuIGNvbnN0IFhGQV9FTEVNRU5USU5GTyBnX1hGQUVsZW1lbnREYXRhW107Ci1leHRlcm4gY29uc3QgaW50MzJfdCBnX2lYRkFFbGVtZW50Q291bnQ7Ci0KLWV4dGVybiBjb25zdCBYRkFfRUxFTUVOVEhJRVJBUkNIWSBnX1hGQUVsZW1lbnRDaGlsZHJlbkluZGV4W107Ci1leHRlcm4gY29uc3QgdWludDE2X3QgZ19YRkFFbGVtZW50Q2hpbGRyZW5EYXRhW107Ci0KLWV4dGVybiBjb25zdCBYRkFfRUxFTUVOVEhJRVJBUkNIWSBnX1hGQUVsZW1lbnRBdHRyaWJ1dGVJbmRleFtdOwotZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgZ19YRkFFbGVtZW50QXR0cmlidXRlRGF0YVtdOwotCi1leHRlcm4gY29uc3QgWEZBX0VMRU1FTlRISUVSQVJDSFkgZ19YRkFFbGVtZW50UHJvcGVydHlJbmRleFtdOwotZXh0ZXJuIGNvbnN0IFhGQV9QUk9QRVJUWSBnX1hGQUVsZW1lbnRQcm9wZXJ0eURhdGFbXTsKLQogZXh0ZXJuIGNvbnN0IFhGQV9TQ1JJUFRISUVSQVJDSFkgZ19YRkFTY3JpcHRJbmRleFtdOwogZXh0ZXJuIGNvbnN0IGludDMyX3QgZ19pU2NyaXB0SW5kZXhDb3VudDsKIAotZXh0ZXJuIGNvbnN0IFhGQV9OT1RTVVJFQVRUUklCVVRFIGdfWEZBTm90c3VyZUF0dHJpYnV0ZXNbXTsKLWV4dGVybiBjb25zdCBpbnQzMl90IGdfaVhGQU5vdHN1cmVDb3VudDsKLQotZXh0ZXJuIGNvbnN0IFhGQV9NRVRIT0RJTkZPIGdfU29tTWV0aG9kRGF0YVtdOwotZXh0ZXJuIGNvbnN0IGludDMyX3QgZ19pU29tTWV0aG9kQ291bnQ7Ci0KIGV4dGVybiBjb25zdCBYRkFfU0NSSVBUQVRUUklCVVRFSU5GTyBnX1NvbUF0dHJpYnV0ZURhdGFbXTsKIGV4dGVybiBjb25zdCBpbnQzMl90IGdfaVNvbUF0dHJpYnV0ZUNvdW50OwogCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIveGZhX2Jhc2ljX2RhdGFfYXR0cmlidXRlcy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIveGZhX2Jhc2ljX2RhdGFfYXR0cmlidXRlcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZDE2YTAuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL3hmYV9iYXNpY19kYXRhX2F0dHJpYnV0ZXMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzg2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfYmFzaWNfZGF0YS5oIgotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvZnhmYV9iYXNpYy5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX21lYXN1cmVtZW50LmgiCi0KLXN0YXRpYyBjb25zdCBDWEZBX01lYXN1cmVtZW50IGdfWEZBTWVhc3VyZW1lbnREYXRhW10gPSB7Ci0gICAgQ1hGQV9NZWFzdXJlbWVudCgwLCBYRkFfVU5JVF9JbiksCi0gICAgQ1hGQV9NZWFzdXJlbWVudCgwLCBYRkFfVU5JVF9QdCksCi0gICAgQ1hGQV9NZWFzdXJlbWVudCg1LCBYRkFfVU5JVF9NbSksCi0gICAgQ1hGQV9NZWFzdXJlbWVudCgwLjI1LCBYRkFfVU5JVF9NbSksCi0gICAgQ1hGQV9NZWFzdXJlbWVudCgtMSwgWEZBX1VOSVRfVW5rbm93biksCi0gICAgQ1hGQV9NZWFzdXJlbWVudCgwLCBYRkFfVU5JVF9BbmdsZSksCi0gICAgQ1hGQV9NZWFzdXJlbWVudCgxMCwgWEZBX1VOSVRfUHQpLAotICAgIENYRkFfTWVhc3VyZW1lbnQoMzYwLCBYRkFfVU5JVF9BbmdsZSksCi0gICAgQ1hGQV9NZWFzdXJlbWVudCgwLjUsIFhGQV9VTklUX1B0KSwKLX07Ci0KLWNvbnN0IFhGQV9BVFRSSUJVVEVJTkZPIGdfWEZBQXR0cmlidXRlRGF0YVtdID0gewotICAgIHsweDY4LCBMImgiLCBYRkFfQVRUUklCVVRFX0gsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sCi0gICAgezB4NzcsIEwidyIsIFhGQV9BVFRSSUJVVEVfVywgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwKLSAgICB7MHg3OCwgTCJ4IiwgWEZBX0FUVFJJQlVURV9YLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLAotICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sCi0gICAgezB4NzksIEwieSIsIFhGQV9BVFRSSUJVVEVfWSwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LAotICAgIHsweDIxYWVkLCBMImlkIiwgWEZBX0FUVFJJQlVURV9JZCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsCi0gICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0IHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8Ci0gICAgICAgICBYRkFfWERQUEFDS0VUX0Nvbm5lY3Rpb25TZXQgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgIG51bGxwdHJ9LAotICAgIHsweDI1MzYzLCBMInRvIiwgWEZBX0FUVFJJQlVURV9UbywgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCBudWxscHRyfSwKLSAgICB7MHhjYjBhYzksIEwibGluZVRocm91Z2giLCBYRkFfQVRUUklCVVRFX0xpbmVUaHJvdWdoLAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopMH0sCi0gICAgezB4MjI4MmM3MywgTCJoQWxpZ24iLCBYRkFfQVRUUklCVVRFX0hBbGlnbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0xlZnR9LAotICAgIHsweDJjMWM3ZjEsIEwidHlwZWZhY2UiLCBYRkFfQVRUUklCVVRFX1R5cGVmYWNlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopTCJDb3VyaWVyIn0sCi0gICAgezB4MzEwNmMzYSwgTCJiZWZvcmVUYXJnZXQiLCBYRkFfQVRUUklCVVRFX0JlZm9yZVRhcmdldCwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgIG51bGxwdHJ9LAotICAgIHsweDMxYjE5YzEsIEwibmFtZSIsIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0IHwKLSAgICAgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0RhdGFzZXRzIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtIHwKLSAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgbnVsbHB0cn0sCi0gICAgezB4Mzg0OGIzZiwgTCJuZXh0IiwgWEZBX0FUVFJJQlVURV9OZXh0LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTm9uZX0sCi0gICAgezB4NDNlMzQ5YiwgTCJkYXRhUm93Q291bnQiLCBYRkFfQVRUUklCVVRFX0RhdGFSb3dDb3VudCwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgIG51bGxwdHJ9LAotICAgIHsweDU1MThjMjUsIEwiYnJlYWsiLCBYRkFfQVRUUklCVVRFX0JyZWFrLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQ2xvc2V9LAotICAgIHsweDVjZTYxOTUsIEwidlNjcm9sbFBvbGljeSIsIFhGQV9BVFRSSUJVVEVfVlNjcm9sbFBvbGljeSwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0F1dG99LAotICAgIHsweDhjNzRhZTksIEwiZm9udEhvcml6b250YWxTY2FsZSIsIFhGQV9BVFRSSUJVVEVfRm9udEhvcml6b250YWxTY2FsZSwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilMIjEwMCUifSwKLSAgICB7MHg4ZDRmMWM3LCBMInRleHRJbmRlbnQiLCBYRkFfQVRUUklCVVRFX1RleHRJbmRlbnQsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sCi0gICAgezB4OTdjMWM2NSwgTCJjb250ZXh0IiwgWEZBX0FUVFJJQlVURV9Db250ZXh0LCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLAotICAgICBYRkFfWERQUEFDS0VUX1VOS05PV04sICh2b2lkKikwfSwKLSAgICB7MHg5ODc2NTc4LCBMInRyYXlPdXQiLCBYRkFfQVRUUklCVVRFX1RyYXlPdXQsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9BdXRvfSwKLSAgICB7MHhhMmUzNTE0LCBMImNhcCIsIFhGQV9BVFRSSUJVVEVfQ2FwLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fU3F1YXJlfSwKLSAgICB7MHhiMzU0M2E2LCBMIm1heCIsIFhGQV9BVFRSSUJVVEVfTWF4LCBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFLAotICAgICBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgIG51bGxwdHJ9LAotICAgIHsweGIzNTZjYTQsIEwibWluIiwgWEZBX0FUVFJJQlVURV9NaW4sIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikxfSwKLSAgICB7MHhiYjhkZjVkLCBMInJlZiIsIFhGQV9BVFRSSUJVVEVfUmVmLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfAotICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBudWxscHRyfSwKLSAgICB7MHhiYjhmM2RmLCBMInJpZCIsIFhGQV9BVFRSSUJVVEVfUmlkLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgbnVsbHB0cn0sCi0gICAgezB4YzA4MGNkMywgTCJ1cmwiLCBYRkFfQVRUUklCVVRFX1VybCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIG51bGxwdHJ9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLAotICAgICBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfAotICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0IHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBudWxscHRyfSwKLSAgICB7MHhjZmVhMDJlLCBMImxlZnRJbnNldCIsIFhGQV9BVFRSSUJVVEVfTGVmdEluc2V0LAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LAotICAgIHsweDEwMjZjNTlkLCBMIndpZG93cyIsIFhGQV9BVFRSSUJVVEVfV2lkb3dzLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMH0sCi0gICAgezB4MTA1OWVjMTgsIEwibGV2ZWwiLCBYRkFfQVRUUklCVVRFX0xldmVsLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLAotICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgKHZvaWQqKTB9LAotICAgIHsweDEzNTZjYWY4LCBMImJvdHRvbUluc2V0IiwgWEZBX0FUVFJJQlVURV9Cb3R0b21JbnNldCwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwKLSAgICB7MHgxM2EwOGJkYiwgTCJvdmVyZmxvd1RhcmdldCIsIFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dUYXJnZXQsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBudWxscHRyfSwKLSAgICB7MHgxNDE0ZDQzMSwgTCJhbGxvd01hY3JvIiwgWEZBX0FUVFJJQlVURV9BbGxvd01hY3JvLAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopMH0sCi0gICAgezB4MTRhMzJkNTIsIEwicGFnZVBvc2l0aW9uIiwgWEZBX0FUVFJJQlVURV9QYWdlUG9zaXRpb24sCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Bbnl9LAotICAgIHsweDE1MTdkZmExLCBMImNvbHVtbldpZHRocyIsIFhGQV9BVFRSSUJVVEVfQ29sdW1uV2lkdGhzLAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgbnVsbHB0cn0sCi0gICAgezB4MTY5MTM0YTEsIEwib3ZlcmZsb3dMZWFkZXIiLCBYRkFfQVRUUklCVVRFX092ZXJmbG93TGVhZGVyLAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgbnVsbHB0cn0sCi0gICAgezB4MWI4ZGNlM2UsIEwiYWN0aW9uIiwgWEZBX0FUVFJJQlVURV9BY3Rpb24sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9JbmNsdWRlfSwKLSAgICB7MHgxZTQ1OWI4ZiwgTCJub25SZXB1ZGlhdGlvbiIsIFhGQV9BVFRSSUJVVEVfTm9uUmVwdWRpYXRpb24sCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBudWxscHRyfSwKLSAgICB7MHgxZWM4YWIyYywgTCJyYXRlIiwgWEZBX0FUVFJJQlVURV9SYXRlLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopNTB9LAotICAgIHsweDFlZjNhNjRhLCBMImFsbG93UmljaFRleHQiLCBYRkFfQVRUUklCVVRFX0FsbG93UmljaFRleHQsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKikwfSwKLSAgICB7MHgyMDM4YzliMiwgTCJyb2xlIiwgWEZBX0FUVFJJQlVURV9Sb2xlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgbnVsbHB0cn0sCi0gICAgezB4MjA5MTQzNjcsIEwib3ZlcmZsb3dUcmFpbGVyIiwgWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RyYWlsZXIsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBudWxscHRyfSwKLSAgICB7MHgyMjZjYThmMSwgTCJvcGVyYXRpb24iLCBYRkFfQVRUUklCVVRFX09wZXJhdGlvbiwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgbnVsbHB0cn0sCi0gICAgezB4MjRkODUxNjcsIEwidGltZW91dCIsIFhGQV9BVFRSSUJVVEVfVGltZW91dCwgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsIG51bGxwdHJ9LAotICAgIHsweDI1NzY0NDM2LCBMInRvcEluc2V0IiwgWEZBX0FUVFJJQlVURV9Ub3BJbnNldCwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwKLSAgICB7MHgyNTgzOTg1MiwgTCJhY2Nlc3MiLCBYRkFfQVRUUklCVVRFX0FjY2VzcywgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09wZW59LAotICAgIHsweDI2OGI3ZWMxLCBMImNvbW1hbmRUeXBlIiwgWEZBX0FUVFJJQlVURV9Db21tYW5kVHlwZSwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Vbmtub3dufSwKLSAgICB7MHgyOGRlZTZlOSwgTCJmb3JtYXQiLCBYRkFfQVRUUklCVVRFX0Zvcm1hdCwgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBudWxscHRyfSwKLSAgICB7MHgyOGUxN2U5MSwgTCJkYXRhUHJlcCIsIFhGQV9BVFRSSUJVVEVfRGF0YVByZXAsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Ob25lfSwKLSAgICB7MHgyOTJiODhmZSwgTCJ3aWRnZXREYXRhIiwgWEZBX0FUVFJJQlVURV9XaWRnZXREYXRhLAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1VOS05PV04sICh2b2lkKikwfSwKLSAgICB7MHgyOTQxOGJiNywgTCJhYmJyIiwgWEZBX0FUVFJJQlVURV9BYmJyLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLAotICAgICBYRkFfWERQUEFDS0VUX0xvY2FsZVNldCwgKHZvaWQqKTB9LAotICAgIHsweDJhODJkOTljLCBMIm1hcmdpblJpZ2h0IiwgWEZBX0FUVFJJQlVURV9NYXJnaW5SaWdodCwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwKLSAgICB7MHgyYjVkZjUxZSwgTCJkYXRhRGVzY3JpcHRpb24iLCBYRkFfQVRUUklCVVRFX0RhdGFEZXNjcmlwdGlvbiwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgbnVsbHB0cn0sCi0gICAgezB4MmJiM2Y0NzAsIEwiZW5jaXBoZXJPbmx5IiwgWEZBX0FUVFJJQlVURV9FbmNpcGhlck9ubHksCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBudWxscHRyfSwKLSAgICB7MHgyY2Q3OTAzMywgTCJrZXJuaW5nTW9kZSIsIFhGQV9BVFRSSUJVVEVfS2VybmluZ01vZGUsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Ob25lfSwKLSAgICB7MHgyZWU3Njc4ZiwgTCJyb3RhdGUiLCBYRkFfQVRUUklCVVRFX1JvdGF0ZSwgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDUpfSwKLSAgICB7MHgyZjEwNWY3MiwgTCJ3b3JkQ2hhcmFjdGVyQ291bnQiLCBYRkFfQVRUUklCVVRFX1dvcmRDaGFyYWN0ZXJDb3VudCwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKTd9LAotICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIG51bGxwdHJ9LAotICAgIHsweDM0YWUxMDNjLCBMInJlc2VydmUiLCBYRkFfQVRUUklCVVRFX1Jlc2VydmUsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyA0KX0sCi0gICAgezB4MzY1MDU1N2UsIEwidGV4dExvY2F0aW9uIiwgWEZBX0FUVFJJQlVURV9UZXh0TG9jYXRpb24sCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9CZWxvd30sCi0gICAgezB4MzljZGIwYTIsIEwicHJpb3JpdHkiLCBYRkFfQVRUUklCVVRFX1ByaW9yaXR5LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQ3VzdG9tfSwKLSAgICB7MHgzYTAyNzNhNiwgTCJ1bmRlcmxpbmUiLCBYRkFfQVRUUklCVVRFX1VuZGVybGluZSwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKTB9LAotICAgIHsweDNiNTgyMjg2LCBMIm1vZHVsZVdpZHRoIiwgWEZBX0FUVFJJQlVURV9Nb2R1bGVXaWR0aCwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDMpfSwKLSAgICB7MHgzZDEyM2MyNiwgTCJoeXBoZW5hdGUiLCBYRkFfQVRUUklCVVRFX0h5cGhlbmF0ZSwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKTB9LAotICAgIHsweDNlN2FmOTRmLCBMImxpc3RlbiIsIFhGQV9BVFRSSUJVVEVfTGlzdGVuLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fUmVmT25seX0sCi0gICAgezB4NDE1NmVlM2YsIEwiZGVsaW1pdGVyIiwgWEZBX0FUVFJJQlVURV9EZWxpbWl0ZXIsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBudWxscHRyfSwKLSAgICB7MHg0MmZlZDFmZCwgTCJjb250ZW50VHlwZSIsIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9YRFBQQUNLRVRfRGF0YXNldHMgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgIG51bGxwdHJ9LAotICAgIHsweDQ1M2VhZjM4LCBMInN0YXJ0TmV3IiwgWEZBX0FUVFJJQlVURV9TdGFydE5ldywgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTB9LAotICAgIHsweDQ1YTZkYWY4LCBMImVvZkFjdGlvbiIsIFhGQV9BVFRSSUJVVEVfRW9mQWN0aW9uLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX01vdmVMYXN0fSwKLSAgICB7MHg0N2NmYTQzYSwgTCJhbGxvd05ldXRyYWwiLCBYRkFfQVRUUklCVVRFX0FsbG93TmV1dHJhbCwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKTB9LAotICAgIHsweDQ3ZDAzNDkwLCBMImNvbm5lY3Rpb24iLCBYRkFfQVRUUklCVVRFX0Nvbm5lY3Rpb24sCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBudWxscHRyfSwKLSAgICB7MHg0ODczYzYwMSwgTCJiYXNlbGluZVNoaWZ0IiwgWEZBX0FUVFJJQlVURV9CYXNlbGluZVNoaWZ0LAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LAotICAgIHsweDRiMzE5NzY3LCBMIm92ZXJsaW5lUGVyaW9kIiwgWEZBX0FUVFJJQlVURV9PdmVybGluZVBlcmlvZCwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0FsbH0sCi0gICAgezB4NGI4YmM4NDAsIEwiZnJhY0RpZ2l0cyIsIFhGQV9BVFRSSUJVVEVfRnJhY0RpZ2l0cywKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKTJ9LAotICAgIHsweDRlZjNkMDJjLCBMIm9yaWVudGF0aW9uIiwgWEZBX0FUVFJJQlVURV9PcmllbnRhdGlvbiwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1BvcnRyYWl0fSwKLSAgICB7MHg0ZmRjMzQ1NCwgTCJ0aW1lU3RhbXAiLCBYRkFfQVRUUklCVVRFX1RpbWVTdGFtcCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsCi0gICAgIFhGQV9YRFBQQUNLRVRfWERQLCBudWxscHRyfSwKLSAgICB7MHg1MjY2NmYxYywgTCJwcmludENoZWNrRGlnaXQiLCBYRkFfQVRUUklCVVRFX1ByaW50Q2hlY2tEaWdpdCwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKTB9LAotICAgIHsweDUzNDcyOWM5LCBMIm1hcmdpbkxlZnQiLCBYRkFfQVRUUklCVVRFX01hcmdpbkxlZnQsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sCi0gICAgezB4NTM5MmVhNTgsIEwic3Ryb2tlIiwgWEZBX0FUVFJJQlVURV9TdHJva2UsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Tb2xpZH0sCi0gICAgezB4NTQwNGQ2ZGYsIEwibW9kdWxlSGVpZ2h0IiwgWEZBX0FUVFJJQlVURV9Nb2R1bGVIZWlnaHQsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAyKX0sCi0gICAgezB4NTRmYTcyMmMsIEwidHJhbnNmZXJFbmNvZGluZyIsIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBudWxscHRyfSwKLSAgICB7MHg1NTJkOWFkNSwgTCJ1c2FnZSIsIFhGQV9BVFRSSUJVVEVfVXNhZ2UsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9FeHBvcnRBbmRJbXBvcnR9LAotICAgIHsweDU3MGNlODM1LCBMInByZXNlbmNlIiwgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGV9LAotICAgIHsweDU3MzlkMWZmLCBMInJhZGl4T2Zmc2V0IiwgWEZBX0FUVFJJQlVURV9SYWRpeE9mZnNldCwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwKLSAgICB7MHg1Nzc2ODJhYywgTCJwcmVzZXJ2ZSIsIFhGQV9BVFRSSUJVVEVfUHJlc2VydmUsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBudWxscHRyfSwKLSAgICB7MHg1OGJlMjg3MCwgTCJhbGlhc05vZGUiLCBYRkFfQVRUUklCVVRFX0FsaWFzTm9kZSwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOLCAodm9pZCopMH0sCi0gICAgezB4NWEzMmU0OTMsIEwibXVsdGlMaW5lIiwgWEZBX0FUVFJJQlVURV9NdWx0aUxpbmUsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKikwfSwKLSAgICB7MHg1YTUwZTllNiwgTCJ2ZXJzaW9uIiwgWEZBX0FUVFJJQlVURV9WZXJzaW9uLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgbnVsbHB0cn0sCi0gICAgezB4NWFiMjNiNmMsIEwic3RhcnRDaGFyIiwgWEZBX0FUVFJJQlVURV9TdGFydENoYXIsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBudWxscHRyfSwKLSAgICB7MHg1YjcwN2EzNSwgTCJzY3JpcHRUZXN0IiwgWEZBX0FUVFJJQlVURV9TY3JpcHRUZXN0LAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fRXJyb3J9LAotICAgIHsweDVjMDU0NzU1LCBMInN0YXJ0QW5nbGUiLCBYRkFfQVRUUklCVVRFX1N0YXJ0QW5nbGUsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyA1KX0sCi0gICAgezB4NWVjOTU4YzAsIEwiY3Vyc29yVHlwZSIsIFhGQV9BVFRSSUJVVEVfQ3Vyc29yVHlwZSwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Gb3J3YXJkT25seX0sCi0gICAgezB4NWY3NjBiNTAsIEwiZGlnaXRhbFNpZ25hdHVyZSIsIFhGQV9BVFRSSUJVVEVfRGlnaXRhbFNpZ25hdHVyZSwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgIG51bGxwdHJ9LAotICAgIHsweDYwYTYxZWRkLCBMImNvZGVUeXBlIiwgWEZBX0FUVFJJQlVURV9Db2RlVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIG51bGxwdHJ9LAotICAgIHsweDYwZDRjOGIxLCBMIm91dHB1dCIsIFhGQV9BVFRSSUJVVEVfT3V0cHV0LCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0LCBudWxscHRyfSwKLSAgICB7MHg2NDExMGFiNSwgTCJib29rZW5kVHJhaWxlciIsIFhGQV9BVFRSSUJVVEVfQm9va2VuZFRyYWlsZXIsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBudWxscHRyfSwKLSAgICB7MHg2NWUzMGM2NywgTCJpbWFnaW5nQkJveCIsIFhGQV9BVFRSSUJVVEVfSW1hZ2luZ0JCb3gsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopTCJub25lIn0sCi0gICAgezB4NjY1MzljNDgsIEwiZXhjbHVkZUluaXRpYWxDYXAiLCBYRkFfQVRUUklCVVRFX0V4Y2x1ZGVJbml0aWFsQ2FwLAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopMH0sCi0gICAgezB4NjY2NDJmOGYsIEwiZm9yY2UiLCBYRkFfQVRUUklCVVRFX0ZvcmNlLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLAotICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgbnVsbHB0cn0sCi0gICAgezB4NjlhYTIyOTIsIEwiY3JsU2lnbiIsIFhGQV9BVFRSSUJVVEVfQ3JsU2lnbiwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIG51bGxwdHJ9LAotICAgIHsweDZhMzQwNWRkLCBMInByZXZpb3VzIiwgWEZBX0FUVFJJQlVURV9QcmV2aW91cywgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LAotICAgIHsweDZhOTVjOTc2LCBMInB1c2hDaGFyYWN0ZXJDb3VudCIsIFhGQV9BVFRSSUJVVEVfUHVzaENoYXJhY3RlckNvdW50LAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopM30sCi0gICAgezB4NmI2ZGRjZmIsIEwibnVsbFRlc3QiLCBYRkFfQVRUUklCVVRFX051bGxUZXN0LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fRGlzYWJsZWR9LAotICAgIHsweDZjZmE4MjhhLCBMInJ1bkF0IiwgWEZBX0FUVFJJQlVURV9SdW5BdCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0NsaWVudH0sCi0gICAgezB4NzMxZTA2NjUsIEwic3BhY2VCZWxvdyIsIFhGQV9BVFRSSUJVVEVfU3BhY2VCZWxvdywKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwKLSAgICB7MHg3NDc4OGY4YiwgTCJzd2VlcEFuZ2xlIiwgWEZBX0FUVFJJQlVURV9Td2VlcEFuZ2xlLAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgNyl9LAotICAgIHsweDc4YmZmNTMxLCBMIm51bWJlck9mQ2VsbHMiLCBYRkFfQVRUUklCVVRFX051bWJlck9mQ2VsbHMsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKikwfSwKLSAgICB7MHg3OTU0MzA1NSwgTCJsZXR0ZXJTcGFjaW5nIiwgWEZBX0FUVFJJQlVURV9MZXR0ZXJTcGFjaW5nLAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgbnVsbHB0cn0sCi0gICAgezB4Nzk5NzVmMmIsIEwibG9ja1R5cGUiLCBYRkFfQVRUUklCVVRFX0xvY2tUeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1JlYWRPbmx5fSwKLSAgICB7MHg3YTBjYzQ3MSwgTCJwYXNzd29yZENoYXIiLCBYRkFfQVRUUklCVVRFX1Bhc3N3b3JkQ2hhciwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilMIioifSwKLSAgICB7MHg3YTdjYzM0MSwgTCJ2QWxpZ24iLCBYRkFfQVRUUklCVVRFX1ZBbGlnbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1RvcH0sCi0gICAgezB4N2IyOTYzMGEsIEwic291cmNlQmVsb3ciLCBYRkFfQVRUUklCVVRFX1NvdXJjZUJlbG93LAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX0NvbmZpZywKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1VwZGF0ZX0sCi0gICAgezB4N2I5NWU2NjEsIEwiaW52ZXJ0ZWQiLCBYRkFfQVRUUklCVVRFX0ludmVydGVkLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMH0sCi0gICAgezB4N2MyZmQ4MGIsIEwibWFyayIsIFhGQV9BVFRSSUJVVEVfTWFyaywgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0RlZmF1bHR9LAotICAgIHsweDdjMmZmNmFlLCBMIm1heEgiLCBYRkFfQVRUUklCVVRFX01heEgsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sCi0gICAgezB4N2MyZmY2YmQsIEwibWF4VyIsIFhGQV9BVFRSSUJVVEVfTWF4VywgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwKLSAgICB7MHg3YzczMmE2NiwgTCJ0cnVuY2F0ZSIsIFhGQV9BVFRSSUJVVEVfVHJ1bmNhdGUsIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikwfSwKLSAgICB7MHg3ZDAyMzU2YywgTCJtaW5IIiwgWEZBX0FUVFJJQlVURV9NaW5ILCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LAotICAgIHsweDdkMDIzNTdiLCBMIm1pblciLCBYRkFfQVRUUklCVVRFX01pblcsIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sCi0gICAgezB4N2QwYjVmY2EsIEwiaW5pdGlhbCIsIFhGQV9BVFRSSUJVVEVfSW5pdGlhbCwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTF9LAotICAgIHsweDdkOWZkN2M1LCBMIm1vZGUiLCBYRkFfQVRUUklCVVRFX01vZGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fVXNlUHJpbnRlclNldHRpbmd9LAotICAgIHsweDdlN2U4NDVlLCBMImxheW91dCIsIFhGQV9BVFRSSUJVVEVfTGF5b3V0LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fUG9zaXRpb259LAotICAgIHsweDdmNmZkM2Q3LCBMInNlcnZlciIsIFhGQV9BVFRSSUJVVEVfU2VydmVyLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgbnVsbHB0cn0sCi0gICAgezB4ODI0ZjIxYjcsIEwiZW1iZWRQREYiLCBYRkFfQVRUUklCVVRFX0VtYmVkUERGLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMH0sCi0gICAgezB4ODM0MGVhNjYsIEwib2RkT3JFdmVuIiwgWEZBX0FUVFJJQlVURV9PZGRPckV2ZW4sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Bbnl9LAotICAgIHsweDgzNmQ0ZDdjLCBMInRhYkRlZmF1bHQiLCBYRkFfQVRUUklCVVRFX1RhYkRlZmF1bHQsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBudWxscHRyfSwKLSAgICB7MHg4ODU1ODA1ZiwgTCJjb250YWlucyIsIFhGQV9BVFRSSUJVVEVfQ29udGFpbnMsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgIFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9EYXRhfSwKLSAgICB7MHg4YTY5MjUyMSwgTCJyaWdodEluc2V0IiwgWEZBX0FUVFJJQlVURV9SaWdodEluc2V0LAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LAotICAgIHsweDhhZjJlNjU3LCBMIm1heENoYXJzIiwgWEZBX0FUVFJJQlVURV9NYXhDaGFycywgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTB9LAotICAgIHsweDhiOTBlMWYyLCBMIm9wZW4iLCBYRkFfQVRUUklCVVRFX09wZW4sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Vc2VyQ29udHJvbH0sCi0gICAgezB4OGM5OTM3N2UsIEwicmVsYXRpb24iLCBYRkFfQVRUUklCVVRFX1JlbGF0aW9uLCBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBudWxscHRyfSwKLSAgICB7MHg4ZDE4MWQ2MSwgTCJ3aWRlTmFycm93UmF0aW8iLCBYRkFfQVRUUklCVVRFX1dpZGVOYXJyb3dSYXRpbywKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilMIjM6MSJ9LAotICAgIHsweDhlMWMyOTIxLCBMInJlbGV2YW50IiwgWEZBX0FUVFJJQlVURV9SZWxldmFudCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIG51bGxwdHJ9LAotICAgIHsweDhlMjlkNzk0LCBMInNpZ25hdHVyZVR5cGUiLCBYRkFfQVRUUklCVVRFX1NpZ25hdHVyZVR5cGUsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9GaWx0ZXJ9LAotICAgIHsweDhlYzYyMDRjLCBMImxpbmVUaHJvdWdoUGVyaW9kIiwgWEZBX0FUVFJJQlVURV9MaW5lVGhyb3VnaFBlcmlvZCwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0FsbH0sCi0gICAgezB4OGVkMTgyZDEsIEwic2hhcGUiLCBYRkFfQVRUUklCVVRFX1NoYXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fU3F1YXJlfSwKLSAgICB7MHg4ZmEwMTc5MCwgTCJ0YWJTdG9wcyIsIFhGQV9BVFRSSUJVVEVfVGFiU3RvcHMsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBudWxscHRyfSwKLSAgICB7MHg4ZmMzNmMwYSwgTCJvdXRwdXRCZWxvdyIsIFhGQV9BVFRSSUJVVEVfT3V0cHV0QmVsb3csCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fV2Fybn0sCi0gICAgezB4OTA0MWQ0YjAsIEwic2hvcnQiLCBYRkFfQVRUUklCVVRFX1Nob3J0LCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgMCl9LAotICAgIHsweDkwN2M3NzE5LCBMImZvbnRWZXJ0aWNhbFNjYWxlIiwgWEZBX0FUVFJJQlVURV9Gb250VmVydGljYWxTY2FsZSwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilMIjEwMCUifSwKLSAgICB7MHg5NDQ0NmRjYywgTCJ0aGlja25lc3MiLCBYRkFfQVRUUklCVVRFX1RoaWNrbmVzcywKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDgpfSwKLSAgICB7MHg5NTdmYTAwNiwgTCJjb21taXRPbiIsIFhGQV9BVFRSSUJVVEVfQ29tbWl0T24sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9TZWxlY3R9LAotICAgIHsweDk4MmJkODkyLCBMInJlbWFpbkNoYXJhY3RlckNvdW50IiwgWEZBX0FUVFJJQlVURV9SZW1haW5DaGFyYWN0ZXJDb3VudCwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKTN9LAotICAgIHsweDk4ZmQ0ZDgxLCBMImtleUFncmVlbWVudCIsIFhGQV9BVFRSSUJVVEVfS2V5QWdyZWVtZW50LAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgbnVsbHB0cn0sCi0gICAgezB4OTk4MDBkN2EsIEwiZXJyb3JDb3JyZWN0aW9uTGV2ZWwiLCBYRkFfQVRUUklCVVRFX0Vycm9yQ29ycmVjdGlvbkxldmVsLAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgbnVsbHB0cn0sCi0gICAgezB4OWE2M2RhM2QsIEwidXBzTW9kZSIsIFhGQV9BVFRSSUJVVEVfVXBzTW9kZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1VzQ2Fycmllcn0sCi0gICAgezB4OWNjMTdkNzUsIEwibWVyZ2VNb2RlIiwgWEZBX0FUVFJJQlVURV9NZXJnZU1vZGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Db25zdW1lRGF0YX0sCi0gICAgezB4OWQ4MzNkNzUsIEwiY2lyY3VsYXIiLCBYRkFfQVRUUklCVVRFX0NpcmN1bGFyLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMH0sCi0gICAgezB4OWQ4ZWUyMDQsIEwicHNOYW1lIiwgWEZBX0FUVFJJQlVURV9Qc05hbWUsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLAotICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZywgbnVsbHB0cn0sCi0gICAgezB4OWRjYzNhYjMsIEwidHJhaWxlciIsIFhGQV9BVFRSSUJVVEVfVHJhaWxlciwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIG51bGxwdHJ9LAotICAgIHsweGEwOTMzOTU0LCBMInVuaWNvZGVSYW5nZSIsIFhGQV9BVFRSSUJVVEVfVW5pY29kZVJhbmdlLAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsIG51bGxwdHJ9LAotICAgIHsweGExYjBkMmY1LCBMImV4ZWN1dGVUeXBlIiwgWEZBX0FUVFJJQlVURV9FeGVjdXRlVHlwZSwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0ltcG9ydH0sCi0gICAgezB4YTI1YTg4M2QsIEwiZHVwbGV4SW1wb3NpdGlvbiIsIFhGQV9BVFRSSUJVVEVfRHVwbGV4SW1wb3NpdGlvbiwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0xvbmdFZGdlfSwKLSAgICB7MHhhNDJjYTFiNywgTCJ0cmF5SW4iLCBYRkFfQVRUUklCVVRFX1RyYXlJbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0F1dG99LAotICAgIHsweGE0MzNmMDAxLCBMImJpbmRpbmdOb2RlIiwgWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9VTktOT1dOLCAodm9pZCopMH0sCi0gICAgezB4YTUzNDBmZjUsIEwiYm9mQWN0aW9uIiwgWEZBX0FUVFJJQlVURV9Cb2ZBY3Rpb24sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTW92ZUZpcnN0fSwKLSAgICB7MHhhNWI0MTBjZiwgTCJzYXZlIiwgWEZBX0FUVFJJQlVURV9TYXZlLCBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMH0sCi0gICAgezB4YTYxMThjODksIEwidGFyZ2V0VHlwZSIsIFhGQV9BVFRSSUJVVEVfVGFyZ2V0VHlwZSwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0F1dG99LAotICAgIHsweGE2NjQwNGNiLCBMImtleUVuY2lwaGVybWVudCIsIFhGQV9BVFRSSUJVVEVfS2V5RW5jaXBoZXJtZW50LAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgbnVsbHB0cn0sCi0gICAgezB4YTY3MTAyNjIsIEwiY3JlZGVudGlhbFNlcnZlclBvbGljeSIsCi0gICAgIFhGQV9BVFRSSUJVVEVfQ3JlZGVudGlhbFNlcnZlclBvbGljeSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwKLSAgICB7MHhhNjg2OTc1YiwgTCJzaXplIiwgWEZBX0FUVFJJQlVURV9TaXplLCBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopKGdfWEZBTWVhc3VyZW1lbnREYXRhICsgNil9LAotICAgIHsweGE4NWU3NGYzLCBMImluaXRpYWxOdW1iZXIiLCBYRkFfQVRUUklCVVRFX0luaXRpYWxOdW1iZXIsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKikxfSwKLSAgICB7MHhhYmVmMzdlMywgTCJzbG9wZSIsIFhGQV9BVFRSSUJVVEVfU2xvcGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9CYWNrc2xhc2h9LAotICAgIHsweGFiZmE2YzRmLCBMImNTcGFjZSIsIFhGQV9BVFRSSUJVVEVfQ1NwYWNlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKUwiU1JHQiJ9LAotICAgIHsweGFjMDZlMmIwLCBMImNvbFNwYW4iLCBYRkFfQVRUUklCVVRFX0NvbFNwYW4sIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKikxfSwKLSAgICB7MHhhZGM0Yzc3YiwgTCJiaW5kaW5nIiwgWEZBX0FUVFJJQlVURV9CaW5kaW5nLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgbnVsbHB0cn0sCi0gICAgezB4YWY3NTQ2MTMsIEwiY2hlY2tzdW0iLCBYRkFfQVRUUklCVVRFX0NoZWNrc3VtLCBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBudWxscHRyfSwKLSAgICB7MHhiMDQ1ZmJjNSwgTCJjaGFyRW5jb2RpbmciLCBYRkFfQVRUUklCVVRFX0NoYXJFbmNvZGluZywKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilMIlVURi04In0sCi0gICAgezB4YjBlNTQ4NWQsIEwiYmluZCIsIFhGQV9BVFRSSUJVVEVfQmluZCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsCi0gICAgIFhGQV9YRFBQQUNLRVRfU291cmNlU2V0LCBudWxscHRyfSwKLSAgICB7MHhiMTIxMjhiNywgTCJ0ZXh0RW50cnkiLCBYRkFfQVRUUklCVVRFX1RleHRFbnRyeSwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKTB9LAotICAgIHsweGIzNzNhODYyLCBMImFyY2hpdmUiLCBYRkFfQVRUUklCVVRFX0FyY2hpdmUsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBudWxscHRyfSwKLSAgICB7MHhiNTk4YTFmNywgTCJ1dWlkIiwgWEZBX0FUVFJJQlVURV9VdWlkLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9YRFAsIG51bGxwdHJ9LAotICAgIHsweGI1ZTQ5YmYyLCBMInBvc3R1cmUiLCBYRkFfQVRUUklCVVRFX1Bvc3R1cmUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vcm1hbH0sCi0gICAgezB4YjZiNDQxNzIsIEwiYWZ0ZXIiLCBYRkFfQVRUUklCVVRFX0FmdGVyLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQXV0b30sCi0gICAgezB4YjcxNjQ2N2IsIEwib3JwaGFucyIsIFhGQV9BVFRSSUJVVEVfT3JwaGFucywgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTB9LAotICAgIHsweGJjMGM0Njk1LCBMInF1YWxpZmllZE5hbWUiLCBYRkFfQVRUUklCVVRFX1F1YWxpZmllZE5hbWUsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1VOS05PV04sIG51bGxwdHJ9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLAotICAgICBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfAotICAgICAgICAgWEZBX1hEUFBBQ0tFVF9Db25uZWN0aW9uU2V0IHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBudWxscHRyfSwKLSAgICB7MHhiYzhmYTM1MCwgTCJsb2NhbGUiLCBYRkFfQVRUUklCVVRFX0xvY2FsZSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIG51bGxwdHJ9LAotICAgIHsweGJkNmUxZDg4LCBMIndlaWdodCIsIFhGQV9BVFRSSUJVVEVfV2VpZ2h0LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Ob3JtYWx9LAotICAgIHsweGJkOTZhMGU5LCBMInVuZGVybGluZVBlcmlvZCIsIFhGQV9BVFRSSUJVVEVfVW5kZXJsaW5lUGVyaW9kLAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQWxsfSwKLSAgICB7MHhiZGU5YWJkYSwgTCJkYXRhIiwgWEZBX0FUVFJJQlVURV9EYXRhLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTGlua30sCi0gICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnIHwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsIG51bGxwdHJ9LAotICAgIHsweGJlOWJhNDcyLCBMIm51bWJlcmVkIiwgWEZBX0FUVFJJQlVURV9OdW1iZXJlZCwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTF9LAotICAgIHsweGMwMzVjNmIxLCBMImRhdGFDb2x1bW5Db3VudCIsIFhGQV9BVFRSSUJVVEVfRGF0YUNvbHVtbkNvdW50LAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgbnVsbHB0cn0sCi0gICAgezB4YzBlYzlmYTQsIEwib3ZlcmxpbmUiLCBYRkFfQVRUUklCVVRFX092ZXJsaW5lLCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCAodm9pZCopMH0sCi0gICAgezB4YzJiYTA5MjMsIEwidXJsUG9saWN5IiwgWEZBX0FUVFJJQlVURV9VcmxQb2xpY3ksIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBudWxscHRyfSwKLSAgICB7MHhjMmJkNDBmZCwgTCJhbmNob3JUeXBlIiwgWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlLAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fVG9wTGVmdH0sCi0gICAgezB4YzM5YTg4YmQsIEwibGFiZWxSZWYiLCBYRkFfQVRUUklCVVRFX0xhYmVsUmVmLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgbnVsbHB0cn0sCi0gICAgezB4YzNjMTQ0MmYsIEwiYm9va2VuZExlYWRlciIsIFhGQV9BVFRSSUJVVEVfQm9va2VuZExlYWRlciwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgIG51bGxwdHJ9LAotICAgIHsweGM0NTQ3YTA4LCBMIm1heExlbmd0aCIsIFhGQV9BVFRSSUJVVEVfTWF4TGVuZ3RoLAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopLTF9LAotICAgIHsweGM0ZmVkMDliLCBMImFjY2Vzc0tleSIsIFhGQV9BVFRSSUJVVEVfQWNjZXNzS2V5LCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgbnVsbHB0cn0sCi0gICAgezB4YzU3NjIxNTcsIEwiY3Vyc29yTG9jYXRpb24iLCBYRkFfQVRUUklCVVRFX0N1cnNvckxvY2F0aW9uLAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1NvdXJjZVNldCwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0NsaWVudH0sCi0gICAgezB4Yzg2MGYzMGEsIEwiZGVsYXllZE9wZW4iLCBYRkFfQVRUUklCVVRFX0RlbGF5ZWRPcGVuLAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsIG51bGxwdHJ9LAotICAgIHsweGM4ZGE0ZGE3LCBMInRhcmdldCIsIFhGQV9BVFRSSUJVVEVfVGFyZ2V0LCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgbnVsbHB0cn0sCi0gICAgezB4Y2E1ZGMyN2MsIEwiZGF0YUVuY2lwaGVybWVudCIsIFhGQV9BVFRSSUJVVEVfRGF0YUVuY2lwaGVybWVudCwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgIG51bGxwdHJ9LAotICAgIHsweGNiMTUwNDc5LCBMImFmdGVyVGFyZ2V0IiwgWEZBX0FUVFJJQlVURV9BZnRlclRhcmdldCwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgIG51bGxwdHJ9LAotICAgIHsweGNiY2FmNjZkLCBMImxlYWRlciIsIFhGQV9BVFRSSUJVVEVfTGVhZGVyLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgbnVsbHB0cn0sCi0gICAgezB4Y2NhNzg5N2UsIEwicGlja2VyIiwgWEZBX0FUVFJJQlVURV9QaWNrZXIsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Ib3N0fSwKLSAgICB7MHhjZDdmN2I1NCwgTCJmcm9tIiwgWEZBX0FUVFJJQlVURV9Gcm9tLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX0NvbmZpZywgbnVsbHB0cn0sCi0gICAgezB4Y2VhNWU2MmMsIEwiYmFzZVByb2ZpbGUiLCBYRkFfQVRUUklCVVRFX0Jhc2VQcm9maWxlLAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fRnVsbH0sCi0gICAgezB4ZDE3MWIyNDAsIEwiYXNwZWN0IiwgWEZBX0FUVFJJQlVURV9Bc3BlY3QsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9GaXR9LAotICAgIHsweGQzYzg0ZDI1LCBMInJvd0NvbHVtblJhdGlvIiwgWEZBX0FUVFJJQlVURV9Sb3dDb2x1bW5SYXRpbywKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgIG51bGxwdHJ9LAotICAgIHsweGQ0YjAxOTIxLCBMImxpbmVIZWlnaHQiLCBYRkFfQVRUUklCVVRFX0xpbmVIZWlnaHQsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAxKX0sCi0gICAgezB4ZDRjYzUzZjgsIEwiaGlnaGxpZ2h0IiwgWEZBX0FUVFJJQlVURV9IaWdobGlnaHQsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9JbnZlcnRlZH0sCi0gICAgezB4ZDUwZjkwM2EsIEwidmFsdWVSZWYiLCBYRkFfQVRUUklCVVRFX1ZhbHVlUmVmLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgbnVsbHB0cn0sCi0gICAgezB4ZDUyNDgyZTAsIEwibWF4RW50cmllcyIsIFhGQV9BVFRSSUJVVEVfTWF4RW50cmllcywKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9Db25maWcsICh2b2lkKik1fSwKLSAgICB7MHhkNTdjNTEzYywgTCJkYXRhTGVuZ3RoIiwgWEZBX0FUVFJJQlVURV9EYXRhTGVuZ3RoLAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgbnVsbHB0cn0sCi0gICAgezB4ZDYxMjhkOGQsIEwiYWN0aXZpdHkiLCBYRkFfQVRUUklCVVRFX0FjdGl2aXR5LCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQ2xpY2t9LAotICAgIHsweGQ2YTM5OTkwLCBMImlucHV0IiwgWEZBX0FUVFJJQlVURV9JbnB1dCwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwgbnVsbHB0cn0sCi0gICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLCBYRkFfQVRUUklCVVRFX1ZhbHVlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQgfCBYRkFfWERQUEFDS0VUX0NvbmZpZyB8IFhGQV9YRFBQQUNLRVRfTG9jYWxlU2V0IHwKLSAgICAgICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0RhdGFzZXRzIHwKLSAgICAgICAgIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgbnVsbHB0cn0sCi0gICAgezB4ZDcwNzk4YzIsIEwiYmxhbmtPck5vdEJsYW5rIiwgWEZBX0FUVFJJQlVURV9CbGFua09yTm90QmxhbmssCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Bbnl9LAotICAgIHsweGQ4NjFmOGFmLCBMImFkZFJldm9jYXRpb25JbmZvIiwgWEZBX0FUVFJJQlVURV9BZGRSZXZvY2F0aW9uSW5mbywKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgIG51bGxwdHJ9LAotICAgIHsweGQ4Zjk4MmJmLCBMImdlbmVyaWNGYW1pbHkiLCBYRkFfQVRUUklCVVRFX0dlbmVyaWNGYW1pbHksCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fU2VyaWZ9LAotICAgIHsweGQ5OTZmYTliLCBMImhhbmQiLCBYRkFfQVRUUklCVVRFX0hhbmQsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9FdmVufSwKLSAgICB7MHhkYjU1ZmVjNSwgTCJocmVmIiwgWEZBX0FUVFJJQlVURV9IcmVmLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgbnVsbHB0cn0sCi0gICAgezB4ZGM3NTY3NmMsIEwidGV4dEVuY29kaW5nIiwgWEZBX0FUVFJJQlVURV9UZXh0RW5jb2RpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBudWxscHRyfSwKLSAgICB7MHhkZTdmOTJiYSwgTCJsZWFkRGlnaXRzIiwgWEZBX0FUVFJJQlVURV9MZWFkRGlnaXRzLAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopLTF9LAotICAgIHsweGUxMWEyY2JjLCBMInBlcm1pc3Npb25zIiwgWEZBX0FUVFJJQlVURV9QZXJtaXNzaW9ucywKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKTJ9LAotICAgIHsweGUxOGI1NjU5LCBMInNwYWNlQWJvdmUiLCBYRkFfQVRUUklCVVRFX1NwYWNlQWJvdmUsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX01lYXN1cmUsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKikoZ19YRkFNZWFzdXJlbWVudERhdGEgKyAwKX0sCi0gICAgezB4ZTFhMjZiNTYsIEwiY29kZUJhc2UiLCBYRkFfQVRUUklCVVRFX0NvZGVCYXNlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgbnVsbHB0cn0sCi0gICAgezB4ZTM0OWQwNDQsIEwic3RvY2siLCBYRkFfQVRUUklCVVRFX1N0b2NrLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgbnVsbHB0cn0sCi0gICAgezB4ZTM3MmFlOTcsIEwiaXNOdWxsIiwgWEZBX0FUVFJJQlVURV9Jc051bGwsIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sCi0gICAgIFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsICh2b2lkKikwfSwKLSAgICB7MHhlNGMzYTVlNSwgTCJyZXN0b3JlU3RhdGUiLCBYRkFfQVRUUklCVVRFX1Jlc3RvcmVTdGF0ZSwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX01hbnVhbH0sCi0gICAgezB4ZTVjOTZkNmEsIEwiZXhjbHVkZUFsbENhcHMiLCBYRkFfQVRUUklCVVRFX0V4Y2x1ZGVBbGxDYXBzLAotICAgICBYRkFfQVRUUklCVVRFVFlQRV9Cb29sZWFuLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopMH0sCi0gICAgezB4ZTY0YjExMjksIEwiZm9ybWF0VGVzdCIsIFhGQV9BVFRSSUJVVEVfRm9ybWF0VGVzdCwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1dhcm5pbmd9LAotICAgIHsweGU2Zjk5NDg3LCBMImhTY3JvbGxQb2xpY3kiLCBYRkFfQVRUUklCVVRFX0hTY3JvbGxQb2xpY3ksCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9BdXRvfSwKLSAgICB7MHhlOGRkZGY1MCwgTCJqb2luIiwgWEZBX0FUVFJJQlVURV9Kb2luLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fU3F1YXJlfSwKLSAgICB7MHhlOGYxMThhOCwgTCJrZXlDZXJ0U2lnbiIsIFhGQV9BVFRSSUJVVEVfS2V5Q2VydFNpZ24sCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBudWxscHRyfSwKLSAgICB7MHhlOTQ4YjlhOCwgTCJyYWRpdXMiLCBYRkFfQVRUUklCVVRFX1JhZGl1cywgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwKLSAgICB7MHhlOTk2YjJmZSwgTCJzb3VyY2VBYm92ZSIsIFhGQV9BVFRSSUJVVEVfU291cmNlQWJvdmUsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fV2Fybn0sCi0gICAgezB4ZWE3MDkwYTAsIEwib3ZlcnJpZGUiLCBYRkFfQVRUUklCVVRFX092ZXJyaWRlLCBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLCBudWxscHRyfSwKLSAgICB7MHhlYjA5MTAwMywgTCJjbGFzc0lkIiwgWEZBX0FUVFJJQlVURV9DbGFzc0lkLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgbnVsbHB0cn0sCi0gICAgezB4ZWI1MTFiNTQsIEwiZGlzYWJsZSIsIFhGQV9BVFRSSUJVVEVfRGlzYWJsZSwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwgKHZvaWQqKTB9LAotICAgIHsweGVkYTkwMTdhLCBMInNjb3BlIiwgWEZBX0FUVFJJQlVURV9TY29wZSwgWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9Db25maWcgfCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBudWxscHRyfSwKLSAgICB7MHhmMTk3ODQ0ZCwgTCJtYXRjaCIsIFhGQV9BVFRSSUJVVEVfTWF0Y2gsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PbmNlfSwKLSAgICB7MHhmMjAwOTMzOSwgTCJwbGFjZW1lbnQiLCBYRkFfQVRUUklCVVRFX1BsYWNlbWVudCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0xlZnR9LAotICAgIHsweGY0ZmZjZTczLCBMImJlZm9yZSIsIFhGQV9BVFRSSUJVVEVfQmVmb3JlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fQXV0b30sCi0gICAgezB4ZjUzMWIwNTksIEwid3JpdGluZ1NjcmlwdCIsIFhGQV9BVFRSSUJVVEVfV3JpdGluZ1NjcmlwdCwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgWEZBX1hEUFBBQ0tFVF9Db25maWcsCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Bc3Rlcmlza30sCi0gICAgezB4ZjU3NWNhNzUsIEwiZW5kQ2hhciIsIFhGQV9BVFRSSUJVVEVfRW5kQ2hhciwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsCi0gICAgIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sIG51bGxwdHJ9LAotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLCBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsCi0gICAgIFhGQV9YRFBQQUNLRVRfQ29uZmlnLCAodm9pZCopMH0sCi0gICAgezB4ZjZiNGFmYjAsIEwibG9uZyIsIFhGQV9BVFRSSUJVVEVfTG9uZywgWEZBX0FUVFJJQlVURVRZUEVfTWVhc3VyZSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKShnX1hGQU1lYXN1cmVtZW50RGF0YSArIDApfSwKLSAgICB7MHhmNmI1OTU0MywgTCJpbnRhY3QiLCBYRkFfQVRUUklCVVRFX0ludGFjdCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgWEZBX1hEUFBBQ0tFVF9UZW1wbGF0ZSB8IFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LAotICAgIHsweGY4ODllNzQ3LCBMInhkcENvbnRlbnQiLCBYRkFfQVRUUklCVVRFX1hkcENvbnRlbnQsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlIHwgWEZBX1hEUFBBQ0tFVF9Gb3JtLAotICAgICBudWxscHRyfSwKLSAgICB7MHhmZWE1M2VjNiwgTCJkZWNpcGhlck9ubHkiLCBYRkFfQVRUUklCVVRFX0RlY2lwaGVyT25seSwKLSAgICAgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIFhGQV9YRFBQQUNLRVRfVGVtcGxhdGUgfCBYRkFfWERQUEFDS0VUX0Zvcm0sCi0gICAgIG51bGxwdHJ9LAotfTsKLWNvbnN0IGludDMyX3QgZ19pWEZBQXR0cmlidXRlQ291bnQgPQotICAgIHNpemVvZihnX1hGQUF0dHJpYnV0ZURhdGEpIC8gc2l6ZW9mKFhGQV9BVFRSSUJVVEVJTkZPKTsKLQotY29uc3QgWEZBX05PVFNVUkVBVFRSSUJVVEUgZ19YRkFOb3RzdXJlQXR0cmlidXRlc1tdID0gewotICAgIHtYRkFfRWxlbWVudDo6U3ViZm9ybVNldCwgWEZBX0FUVFJJQlVURV9SZWxhdGlvbiwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09yZGVyZWR9LAotICAgIHtYRkFfRWxlbWVudDo6TnVtYmVyUGF0dGVybiwgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTnVtZXJpY30sCi0gICAge1hGQV9FbGVtZW50OjpLZXlVc2FnZSwgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LAotICAgIHtYRkFfRWxlbWVudDo6TGFiZWxQcmludGVyLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9acGx9LAotICAgIHtYRkFfRWxlbWVudDo6Q2FsZW5kYXJTeW1ib2xzLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9HcmVnb3JpYW59LAotICAgIHtYRkFfRWxlbWVudDo6QmFyY29kZSwgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgbnVsbHB0cn0sCi0gICAge1hGQV9FbGVtZW50OjpCYXJjb2RlLCBYRkFfQVRUUklCVVRFX0NoZWNrc3VtLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTm9uZX0sCi0gICAge1hGQV9FbGVtZW50OjpUaW1lUGF0dGVybiwgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTWVkfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkJhdGNoT3V0cHV0LCBYRkFfQVRUUklCVVRFX0Zvcm1hdCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX05vbmV9LAotICAgIHtYRkFfRWxlbWVudDo6U3ViamVjdEROcywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LAotICAgIHtYRkFfRWxlbWVudDo6SXNzdWVycywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LAotICAgIHtYRkFfRWxlbWVudDo6RW5jcnlwdGlvbk1ldGhvZHMsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlBhdHRlcm4sIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0Nyb3NzSGF0Y2h9LAotICAgIHtYRkFfRWxlbWVudDo6Q29tcHJlc3MsIFhGQV9BVFRSSUJVVEVfU2NvcGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9JbWFnZU9ubHl9LAotICAgIHtYRkFfRWxlbWVudDo6SW1hZ2UsIFhGQV9BVFRSSUJVVEVfVHJhbnNmZXJFbmNvZGluZywgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX0Jhc2U2NH0sCi0gICAge1hGQV9FbGVtZW50OjpUaW1lU3RhbXAsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlN1YmZvcm0sIFhGQV9BVFRSSUJVVEVfU2NvcGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9OYW1lfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkhhbmRsZXIsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlJlY29yZCwgWEZBX0FUVFJJQlVURV9NYXgsIFhGQV9BVFRSSUJVVEVUWVBFX0ludGVnZXIsCi0gICAgICh2b2lkKikwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkNvbW1hbmQsIFhGQV9BVFRSSUJVVEVfVGltZW91dCwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwKLSAgICAgKHZvaWQqKTMwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkRpZ2VzdE1ldGhvZHMsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlBhZ2VTZXQsIFhGQV9BVFRSSUJVVEVfUmVsYXRpb24sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcmRlcmVkT2NjdXJyZW5jZX0sCi0gICAge1hGQV9FbGVtZW50OjpFcXVhdGUsIFhGQV9BVFRSSUJVVEVfRnJvbSwgWEZBX0FUVFJJQlVURVRZUEVfQ2RhdGEsIG51bGxwdHJ9LAotICAgIHtYRkFfRWxlbWVudDo6RXF1YXRlLCBYRkFfQVRUUklCVVRFX1RvLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwgbnVsbHB0cn0sCi0gICAge1hGQV9FbGVtZW50OjpUcmF2ZXJzZSwgWEZBX0FUVFJJQlVURV9PcGVyYXRpb24sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9OZXh0fSwKLSAgICB7WEZBX0VsZW1lbnQ6OkVuY29kaW5ncywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LAotICAgIHtYRkFfRWxlbWVudDo6U2lnbmluZywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LAotICAgIHtYRkFfRWxlbWVudDo6T2lkcywgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fT3B0aW9uYWx9LAotICAgIHtYRkFfRWxlbWVudDo6U2lnbmF0dXJlLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9QREYxXzN9LAotICAgIHtYRkFfRWxlbWVudDo6RXhEYXRhLCBYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9Ob25lfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkxpbmVhciwgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fVG9SaWdodH0sCi0gICAge1hGQV9FbGVtZW50OjpDdXJyZW5jeVN5bWJvbCwgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fU3ltYm9sfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkVxdWF0ZVJhbmdlLCBYRkFfQVRUUklCVVRFX0Zyb20sIFhGQV9BVFRSSUJVVEVUWVBFX0NkYXRhLAotICAgICBudWxscHRyfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkVxdWF0ZVJhbmdlLCBYRkFfQVRUUklCVVRFX1RvLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgbnVsbHB0cn0sCi0gICAge1hGQV9FbGVtZW50OjpTaWduRGF0YSwgWEZBX0FUVFJJQlVURV9PcGVyYXRpb24sIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9TaWdufSwKLSAgICB7WEZBX0VsZW1lbnQ6OkRhdGVQYXR0ZXJuLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9NZWR9LAotICAgIHtYRkFfRWxlbWVudDo6QmluZCwgWEZBX0FUVFJJQlVURV9UcmFuc2ZlckVuY29kaW5nLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fTm9uZX0sCi0gICAge1hGQV9FbGVtZW50OjpSZWFzb25zLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sCi0gICAge1hGQV9FbGVtZW50OjpBcHBlYXJhbmNlRmlsdGVyLCBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sCi0gICAge1hGQV9FbGVtZW50OjpGb3JtLCBYRkFfQVRUUklCVVRFX0NoZWNrc3VtLCBYRkFfQVRUUklCVVRFVFlQRV9DZGF0YSwKLSAgICAgbnVsbHB0cn0sCi0gICAge1hGQV9FbGVtZW50OjpWYWx1ZSwgWEZBX0FUVFJJQlVURV9PdmVycmlkZSwgWEZBX0FUVFJJQlVURVRZUEVfQm9vbGVhbiwKLSAgICAgKHZvaWQqKTB9LAotICAgIHtYRkFfRWxlbWVudDo6Q2FsY3VsYXRlLCBYRkFfQVRUUklCVVRFX092ZXJyaWRlLCBYRkFfQVRUUklCVVRFVFlQRV9FbnVtLAotICAgICAodm9pZCopWEZBX0FUVFJJQlVURUVOVU1fRXJyb3J9LAotICAgIHtYRkFfRWxlbWVudDo6Q29ubmVjdCwgWEZBX0FUVFJJQlVURV9UaW1lb3V0LCBYRkFfQVRUUklCVVRFVFlQRV9JbnRlZ2VyLAotICAgICAodm9pZCopMTV9LAotICAgIHtYRkFfRWxlbWVudDo6U3VibWl0LCBYRkFfQVRUUklCVVRFX0Zvcm1hdCwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1hkcH0sCi0gICAge1hGQV9FbGVtZW50OjpSYWRpYWwsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX1RvRWRnZX0sCi0gICAge1hGQV9FbGVtZW50OjpMb2NrRG9jdW1lbnQsIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwKLSAgICAgKHZvaWQqKVhGQV9BVFRSSUJVVEVFTlVNX09wdGlvbmFsfSwKLSAgICB7WEZBX0VsZW1lbnQ6Ok9jY3VyLCBYRkFfQVRUUklCVVRFX01heCwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwKLSAgICAgKHZvaWQqKTF9LAotICAgIHtYRkFfRWxlbWVudDo6TnVtYmVyU3ltYm9sLCBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9BVFRSSUJVVEVUWVBFX0VudW0sCi0gICAgICh2b2lkKilYRkFfQVRUUklCVVRFRU5VTV9EZWNpbWFsfSwKLX07Ci1jb25zdCBpbnQzMl90IGdfaVhGQU5vdHN1cmVDb3VudCA9Ci0gICAgc2l6ZW9mKGdfWEZBTm90c3VyZUF0dHJpYnV0ZXMpIC8gc2l6ZW9mKFhGQV9OT1RTVVJFQVRUUklCVVRFKTsKZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci94ZmFfYmFzaWNfZGF0YV9lbGVtZW50X2F0dHJpYnV0ZXMuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL3hmYV9iYXNpY19kYXRhX2VsZW1lbnRfYXR0cmlidXRlcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MGFmMzMuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL3hmYV9iYXNpY19kYXRhX2VsZW1lbnRfYXR0cmlidXRlcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTg4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfYmFzaWNfZGF0YS5oIgotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvZnhmYV9iYXNpYy5oIgotCi1jb25zdCBYRkFfRUxFTUVOVEhJRVJBUkNIWSBnX1hGQUVsZW1lbnRBdHRyaWJ1dGVJbmRleFtdID0gewotICAgIHswLCAzfSwgICAgezMsIDJ9LCAgICB7NSwgM30sICAgIHs4LCAxMH0sICAgezE4LCAyfSwgICB7MjAsIDZ9LCAgIHsyNiwgMn0sCi0gICAgezI4LCAxfSwgICB7MjksIDEzfSwgIHs0MiwgMn0sICAgezQ0LCAxfSwgICB7NDUsIDJ9LCAgIHs0NywgMn0sICAgezQ5LCA3fSwKLSAgICB7NTYsIDB9LCAgIHs1NiwgNH0sICAgezYwLCAyfSwgICB7NjIsIDd9LCAgIHs2OSwgMH0sICAgezY5LCAwfSwgICB7NjksIDJ9LAotICAgIHs3MSwgMn0sICAgezczLCA4fSwgICB7ODEsIDV9LCAgIHs4NiwgOH0sICAgezk0LCA0fSwgICB7OTgsIDN9LCAgIHsxMDEsIDN9LAotICAgIHsxMDQsIDN9LCAgezEwNywgNn0sICB7MTEzLCAyfSwgIHsxMTUsIDJ9LCAgezExNywgMn0sICB7MTE5LCAyfSwgIHsxMjEsIDN9LAotICAgIHsxMjQsIDJ9LCAgezEyNiwgN30sICB7MTMzLCAxM30sIHsxNDYsIDJ9LCAgezE0OCwgNn0sICB7MTU0LCAyfSwgIHsxNTYsIDN9LAotICAgIHsxNTksIDF9LCAgezE2MCwgMTd9LCB7MTc3LCAyfSwgIHsxNzksIDJ9LCAgezE4MSwgNn0sICB7MTg3LCAyfSwgIHsxODksIDJ9LAotICAgIHsxOTEsIDN9LCAgezE5NCwgN30sICB7MjAxLCAyfSwgIHsyMDMsIDN9LCAgezIwNiwgMH0sICB7MjA2LCAyMX0sIHsyMjcsIDF9LAotICAgIHsyMjgsIDN9LCAgezIzMSwgMn0sICB7MjMzLCAwfSwgIHsyMzMsIDJ9LCAgezIzNSwgMn0sICB7MjM3LCA2fSwgIHsyNDMsIDB9LAotICAgIHsyNDMsIDR9LCAgezI0NywgNH0sICB7MjUxLCAwfSwgIHsyNTEsIDJ9LCAgezI1MywgMn0sICB7MjU1LCAwfSwgIHsyNTUsIDB9LAotICAgIHsyNTUsIDJ9LCAgezI1NywgMn0sICB7MjU5LCA0fSwgIHsyNjMsIDN9LCAgezI2NiwgN30sICB7MjczLCAxMH0sIHsyODMsIDl9LAotICAgIHsyOTIsIDZ9LCAgezI5OCwgNH0sICB7MzAyLCAyfSwgIHszMDQsIDJ9LCAgezMwNiwgNn0sICB7MzEyLCA0fSwgIHszMTYsIDN9LAotICAgIHszMTksIDJ9LCAgezMyMSwgMn0sICB7MzIzLCA0fSwgIHszMjcsIDR9LCAgezMzMSwgNH0sICB7MzM1LCA0fSwgIHszMzksIDJ9LAotICAgIHszNDEsIDJ9LCAgezM0MywgMn0sICB7MzQ1LCAyMn0sIHszNjcsIDN9LCAgezM3MCwgMn0sICB7MzcyLCAyfSwgIHszNzQsIDJ9LAotICAgIHszNzYsIDl9LCAgezM4NSwgMH0sICB7Mzg1LCA0fSwgIHszODksIDN9LCAgezM5MiwgMH0sICB7MzkyLCAyfSwgIHszOTQsIDd9LAotICAgIHs0MDEsIDR9LCAgezQwNSwgMn0sICB7NDA3LCA0fSwgIHs0MTEsIDB9LCAgezQxMSwgMjF9LCB7NDMyLCA0fSwgIHs0MzYsIDN9LAotICAgIHs0MzksIDR9LCAgezQ0MywgNn0sICB7NDQ5LCAyfSwgIHs0NTEsIDV9LCAgezQ1NiwgMn0sICB7NDU4LCA4fSwgIHs0NjYsIDF9LAotICAgIHs0NjcsIDJ9LCAgezQ2OSwgMn0sICB7NDcxLCA1fSwgIHs0NzYsIDB9LCAgezQ3NiwgMn0sICB7NDc4LCAyfSwgIHs0ODAsIDZ9LAotICAgIHs0ODYsIDI2fSwgezUxMiwgNH0sICB7NTE2LCAyfSwgIHs1MTgsIDJ9LCAgezUyMCwgNH0sICB7NTI0LCAwfSwgIHs1MjQsIDJ9LAotICAgIHs1MjYsIDJ9LCAgezUyOCwgMn0sICB7NTMwLCAyfSwgIHs1MzIsIDV9LCAgezUzNywgMn0sICB7NTM5LCAzfSwgIHs1NDIsIDJ9LAotICAgIHs1NDQsIDR9LCAgezU0OCwgNX0sICB7NTUzLCAyfSwgIHs1NTUsIDB9LCAgezU1NSwgMn0sICB7NTU3LCA0fSwgIHs1NjEsIDV9LAotICAgIHs1NjYsIDN9LCAgezU2OSwgMn0sICB7NTcxLCAzfSwgIHs1NzQsIDB9LCAgezU3NCwgMn0sICB7NTc2LCA5fSwgIHs1ODUsIDJ9LAotICAgIHs1ODcsIDV9LCAgezU5MiwgNn0sICB7NTk4LCA1fSwgIHs2MDMsIDR9LCAgezYwNywgNH0sICB7NjExLCA4fSwgIHs2MTksIDR9LAotICAgIHs2MjMsIDB9LCAgezYyMywgN30sICB7NjMwLCA0fSwgIHs2MzQsIDR9LCAgezYzOCwgNX0sICB7NjQzLCAyfSwgIHs2NDUsIDJ9LAotICAgIHs2NDcsIDR9LCAgezY1MSwgNH0sICB7NjU1LCAyfSwgIHs2NTcsIDJ9LCAgezY1OSwgMX0sICB7NjYwLCAyfSwgIHs2NjIsIDV9LAotICAgIHs2NjcsIDR9LCAgezY3MSwgM30sICB7Njc0LCAyfSwgIHs2NzYsIDJ9LCAgezY3OCwgNH0sICB7NjgyLCAwfSwgIHs2ODIsIDl9LAotICAgIHs2OTEsIDJ9LCAgezY5MywgMn0sICB7Njk1LCA1fSwgIHs3MDAsIDR9LCAgezcwNCwgM30sICB7NzA3LCAyfSwgIHs3MDksIDEwfSwKLSAgICB7NzE5LCAyfSwgIHs3MjEsIDR9LCAgezcyNSwgNH0sICB7NzI5LCAyfSwgIHs3MzEsIDZ9LCAgezczNywgMn0sICB7NzM5LCAyfSwKLSAgICB7NzQxLCA5fSwgIHs3NTAsIDF9LCAgezc1MSwgNH0sICB7NzU1LCAzfSwgIHs3NTgsIDV9LCAgezc2MywgNn0sICB7NzY5LCA0fSwKLSAgICB7NzczLCAxfSwgIHs3NzQsIDR9LCAgezc3OCwgMH0sICB7Nzc4LCAzfSwgIHs3ODEsIDF9LCAgezc4MiwgNX0sICB7Nzg3LCAxMH0sCi0gICAgezc5NywgN30sICB7ODA0LCAzfSwgIHs4MDcsIDJ9LCAgezgwOSwgNX0sICB7ODE0LCAyfSwgIHs4MTYsIDB9LCAgezgxNiwgMn0sCi0gICAgezgxOCwgMn0sICB7ODIwLCAyfSwgIHs4MjIsIDZ9LCAgezgyOCwgMn0sICB7ODMwLCAxfSwgIHs4MzEsIDJ9LCAgezgzMywgMn0sCi0gICAgezgzNSwgOH0sICB7ODQzLCAyfSwgIHs4NDUsIDR9LCAgezg0OSwgNH0sICB7ODUzLCA0fSwgIHs4NTcsIDJ9LCAgezg1OSwgMn0sCi0gICAgezg2MSwgMn0sICB7ODYzLCAzfSwgIHs4NjYsIDJ9LCAgezg2OCwgMn0sICB7ODcwLCA0fSwgIHs4NzQsIDN9LCAgezg3NywgNX0sCi0gICAgezg4MiwgMjB9LCB7OTAyLCAyfSwgIHs5MDQsIDB9LCAgezkwNCwgMn0sICB7OTA2LCA2fSwgIHs5MTIsIDF9LCAgezkxMywgMn0sCi0gICAgezkxNSwgMX0sICB7OTE2LCAyfSwgIHs5MTgsIDR9LCAgezkyMiwgMn0sICB7OTI0LCAyfSwgIHs5MjYsIDR9LCAgezkzMCwgNH0sCi0gICAgezkzNCwgMjB9LCB7OTU0LCAxfSwgIHs5NTUsIDJ9LCAgezk1NywgNH0sICB7OTYxLCA0fSwgIHs5NjUsIDJ9LCAgezk2NywgMn0sCi0gICAgezk2OSwgNH0sICB7OTczLCAyfSwgIHs5NzUsIDB9LCAgezk3NSwgMn0sICB7OTc3LCA1fSwgIHs5ODIsIDV9LCAgezk4NywgOH0sCi0gICAgezk5NSwgMn0sICB7OTk3LCAyfSwgIHs5OTksIDR9LCAgezEwMDMsIDR9LCB7MTAwNywgMn0sIHsxMDA5LCA0fSwgezEwMTMsIDB9LAotICAgIHsxMDEzLCAxfSwgezEwMTQsIDJ9LCB7MTAxNiwgOX0sIHsxMDI1LCAyfSwgezEwMjcsIDB9LCB7MTAyNywgOH0sIHsxMDM1LCAyfSwKLSAgICB7MTAzNywgMn0sIHsxMDM5LCAwfSwgezEwMzksIDR9LCB7MTA0MywgMn0sIHsxMDQ1LCAwfSwgezEwNDUsIDJ9LCB7MTA0NywgM30sCi0gICAgezEwNTAsIDJ9LCB7MTA1MiwgNX0sIHsxMDU3LCAyfSwgezEwNTksIDJ9LCB7MTA2MSwgNH0sIHsxMDY1LCAzfSwgezEwNjgsIDB9LAotICAgIHsxMDY4LCA0fSwgezEwNzIsIDJ9LCB7MTA3NCwgMn0sIHsxMDc2LCAzfSwgezEwNzksIDR9LCB7MTA4MywgOH0sIHsxMDkxLCA1fSwKLSAgICB7MTA5NiwgMH0sIHsxMDk2LCA0fSwgezExMDAsIDZ9LCB7MTEwNiwgMn0sIHsxMTA4LCAxfSwgezExMDksIDJ9LCB7MTExMSwgMn0sCi0gICAgezExMTMsIDJ9LCB7MTExNSwgMX0sIHsxMTE2LCAyfSwgezExMTgsIDd9LAotfTsKLXN0YXRpY19hc3NlcnQoRlhfQXJyYXlTaXplKGdfWEZBRWxlbWVudEF0dHJpYnV0ZUluZGV4KSA9PQotICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PGludDMyX3Q+KFhGQV9FbGVtZW50OjpJdGVtcykgKyAxKSwKLSAgICAgICAgICAgICAgImdYRkFFbGVtZW50QXR0cmlidXRlSW5kZXggc2l6ZSBkb2VzIG5vdCBtYXRjaCBYRkFfRWxlbWVudCIpOwotCi1jb25zdCB1aW50OF90IGdfWEZBRWxlbWVudEF0dHJpYnV0ZURhdGFbXSA9IHsKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfTWF4LAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfRW9mQWN0aW9uLAotICAgIFhGQV9BVFRSSUJVVEVfQ3Vyc29yVHlwZSwKLSAgICBYRkFfQVRUUklCVVRFX0xvY2tUeXBlLAotICAgIFhGQV9BVFRSSUJVVEVfQm9mQWN0aW9uLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0N1cnNvckxvY2F0aW9uLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9SZWxhdGlvbiwKLSAgICBYRkFfQVRUUklCVVRFX1JlbGV2YW50LAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfQmVmb3JlVGFyZ2V0LAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dUYXJnZXQsCi0gICAgWEZBX0FUVFJJQlVURV9PdmVyZmxvd0xlYWRlciwKLSAgICBYRkFfQVRUUklCVVRFX092ZXJmbG93VHJhaWxlciwKLSAgICBYRkFfQVRUUklCVVRFX1N0YXJ0TmV3LAotICAgIFhGQV9BVFRSSUJVVEVfQm9va2VuZFRyYWlsZXIsCi0gICAgWEZBX0FUVFJJQlVURV9BZnRlciwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9Cb29rZW5kTGVhZGVyLAotICAgIFhGQV9BVFRSSUJVVEVfQWZ0ZXJUYXJnZXQsCi0gICAgWEZBX0FUVFJJQlVURV9CZWZvcmUsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9BbGxvd05ldXRyYWwsCi0gICAgWEZBX0FUVFJJQlVURV9NYXJrLAotICAgIFhGQV9BVFRSSUJVVEVfU2hhcGUsCi0gICAgWEZBX0FUVFJJQlVURV9TaXplLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfU3RhcnRBbmdsZSwKLSAgICBYRkFfQVRUUklCVVRFX1N3ZWVwQW5nbGUsCi0gICAgWEZBX0FUVFJJQlVURV9DaXJjdWxhciwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9IYW5kLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX0JpbmQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0Zyb20sCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9TaWduYXR1cmVUeXBlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX1Blcm1pc3Npb25zLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9TdGFydE5ldywKLSAgICBYRkFfQVRUUklCVVRFX1RyYWlsZXIsCi0gICAgWEZBX0FUVFJJQlVURV9UYXJnZXRUeXBlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX1RhcmdldCwKLSAgICBYRkFfQVRUUklCVVRFX0xlYWRlciwKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfVGltZVN0YW1wLAotICAgIFhGQV9BVFRSSUJVVEVfVXVpZCwKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX0xlZnRJbnNldCwKLSAgICBYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0LAotICAgIFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQsCi0gICAgWEZBX0FUVFJJQlVURV9SaWdodEluc2V0LAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfTm9uUmVwdWRpYXRpb24sCi0gICAgWEZBX0FUVFJJQlVURV9FbmNpcGhlck9ubHksCi0gICAgWEZBX0FUVFJJQlVURV9UeXBlLAotICAgIFhGQV9BVFRSSUJVVEVfRGlnaXRhbFNpZ25hdHVyZSwKLSAgICBYRkFfQVRUUklCVVRFX0NybFNpZ24sCi0gICAgWEZBX0FUVFJJQlVURV9LZXlBZ3JlZW1lbnQsCi0gICAgWEZBX0FUVFJJQlVURV9LZXlFbmNpcGhlcm1lbnQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfRGF0YUVuY2lwaGVybWVudCwKLSAgICBYRkFfQVRUUklCVVRFX0tleUNlcnRTaWduLAotICAgIFhGQV9BVFRSSUJVVEVfRGVjaXBoZXJPbmx5LAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX09wZW4sCi0gICAgWEZBX0FUVFJJQlVURV9Db21taXRPbiwKLSAgICBYRkFfQVRUUklCVVRFX1RleHRFbnRyeSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX0hBbGlnbiwKLSAgICBYRkFfQVRUUklCVVRFX1RleHRJbmRlbnQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9XaWRvd3MsCi0gICAgWEZBX0FUVFJJQlVURV9NYXJnaW5SaWdodCwKLSAgICBYRkFfQVRUUklCVVRFX01hcmdpbkxlZnQsCi0gICAgWEZBX0FUVFJJQlVURV9SYWRpeE9mZnNldCwKLSAgICBYRkFfQVRUUklCVVRFX1ByZXNlcnZlLAotICAgIFhGQV9BVFRSSUJVVEVfU3BhY2VCZWxvdywKLSAgICBYRkFfQVRUUklCVVRFX1ZBbGlnbiwKLSAgICBYRkFfQVRUUklCVVRFX1RhYkRlZmF1bHQsCi0gICAgWEZBX0FUVFJJQlVURV9UYWJTdG9wcywKLSAgICBYRkFfQVRUUklCVVRFX09ycGhhbnMsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfTGluZUhlaWdodCwKLSAgICBYRkFfQVRUUklCVVRFX1NwYWNlQWJvdmUsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfVmVyc2lvbiwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9BZGRSZXZvY2F0aW9uSW5mbywKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9SZWYsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9MaXN0ZW4sCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfQWN0aXZpdHksCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfRGF0YVJvd0NvdW50LAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfRGF0YVByZXAsCi0gICAgWEZBX0FUVFJJQlVURV9UeXBlLAotICAgIFhGQV9BVFRSSUJVVEVfVGV4dExvY2F0aW9uLAotICAgIFhGQV9BVFRSSUJVVEVfTW9kdWxlV2lkdGgsCi0gICAgWEZBX0FUVFJJQlVURV9QcmludENoZWNrRGlnaXQsCi0gICAgWEZBX0FUVFJJQlVURV9Nb2R1bGVIZWlnaHQsCi0gICAgWEZBX0FUVFJJQlVURV9TdGFydENoYXIsCi0gICAgWEZBX0FUVFJJQlVURV9UcnVuY2F0ZSwKLSAgICBYRkFfQVRUUklCVVRFX1dpZGVOYXJyb3dSYXRpbywKLSAgICBYRkFfQVRUUklCVVRFX0Vycm9yQ29ycmVjdGlvbkxldmVsLAotICAgIFhGQV9BVFRSSUJVVEVfVXBzTW9kZSwKLSAgICBYRkFfQVRUUklCVVRFX0NoZWNrc3VtLAotICAgIFhGQV9BVFRSSUJVVEVfQ2hhckVuY29kaW5nLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0RhdGFDb2x1bW5Db3VudCwKLSAgICBYRkFfQVRUUklCVVRFX1Jvd0NvbHVtblJhdGlvLAotICAgIFhGQV9BVFRSSUJVVEVfRGF0YUxlbmd0aCwKLSAgICBYRkFfQVRUUklCVVRFX0VuZENoYXIsCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfRm9ybWF0LAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9PdXRwdXQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfSW5wdXQsCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1R5cGUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9UeXBlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9IaWdobGlnaHQsCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX0JyZWFrLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsCi0gICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9IYW5kLAotICAgIFhGQV9BVFRSSUJVVEVfWCwKLSAgICBYRkFfQVRUUklCVVRFX1ksCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9MZXZlbCwKLSAgICBYRkFfQVRUUklCVVRFX1JlbGV2YW50LAotICAgIFhGQV9BVFRSSUJVVEVfQ29sU3BhbiwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Xb3JkQ2hhcmFjdGVyQ291bnQsCi0gICAgWEZBX0FUVFJJQlVURV9IeXBoZW5hdGUsCi0gICAgWEZBX0FUVFJJQlVURV9FeGNsdWRlSW5pdGlhbENhcCwKLSAgICBYRkFfQVRUUklCVVRFX1B1c2hDaGFyYWN0ZXJDb3VudCwKLSAgICBYRkFfQVRUUklCVVRFX1JlbWFpbkNoYXJhY3RlckNvdW50LAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0V4Y2x1ZGVBbGxDYXBzLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfUmlkLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfTWF4Q2hhcnMsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VybCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX0NyZWRlbnRpYWxTZXJ2ZXJQb2xpY3ksCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfVXJsUG9saWN5LAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9UeXBlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX1JlZiwKLSAgICBYRkFfQVRUUklCVVRFX0Nvbm5lY3Rpb24sCi0gICAgWEZBX0FUVFJJQlVURV9UYXJnZXQsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfWCwKLSAgICBYRkFfQVRUUklCVVRFX1ksCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX051bWJlck9mQ2VsbHMsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9UeXBlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0gsCi0gICAgWEZBX0FUVFJJQlVURV9XLAotICAgIFhGQV9BVFRSSUJVVEVfWCwKLSAgICBYRkFfQVRUUklCVVRFX1ksCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX0hBbGlnbiwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9BY2Nlc3MsCi0gICAgWEZBX0FUVFJJQlVURV9Sb3RhdGUsCi0gICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwKLSAgICBYRkFfQVRUUklCVVRFX1ZBbGlnbiwKLSAgICBYRkFfQVRUUklCVVRFX01heEgsCi0gICAgWEZBX0FUVFJJQlVURV9NYXhXLAotICAgIFhGQV9BVFRSSUJVVEVfTWluSCwKLSAgICBYRkFfQVRUUklCVVRFX01pblcsCi0gICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwKLSAgICBYRkFfQVRUUklCVVRFX0NvbFNwYW4sCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jYWxlLAotICAgIFhGQV9BVFRSSUJVVEVfQW5jaG9yVHlwZSwKLSAgICBYRkFfQVRUUklCVVRFX0FjY2Vzc0tleSwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0gsCi0gICAgWEZBX0FUVFJJQlVURV9XLAotICAgIFhGQV9BVFRSSUJVVEVfWCwKLSAgICBYRkFfQVRUUklCVVRFX1ksCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX0NhcCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1N0cm9rZSwKLSAgICBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLAotICAgIFhGQV9BVFRSSUJVVEVfVGhpY2tuZXNzLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfUmF0ZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX1NvdXJjZUJlbG93LAotICAgIFhGQV9BVFRSSUJVVEVfT3V0cHV0QmVsb3csCi0gICAgWEZBX0FUVFJJQlVURV9Tb3VyY2VBYm92ZSwKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9ILAotICAgIFhGQV9BVFRSSUJVVEVfVywKLSAgICBYRkFfQVRUUklCVVRFX1gsCi0gICAgWEZBX0FUVFJJQlVURV9ZLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9IQWxpZ24sCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfQWNjZXNzLAotICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsCi0gICAgWEZBX0FUVFJJQlVURV9WQWxpZ24sCi0gICAgWEZBX0FUVFJJQlVURV9NYXhILAotICAgIFhGQV9BVFRSSUJVVEVfTWF4VywKLSAgICBYRkFfQVRUUklCVVRFX01pbkgsCi0gICAgWEZBX0FUVFJJQlVURV9NaW5XLAotICAgIFhGQV9BVFRSSUJVVEVfTGF5b3V0LAotICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsCi0gICAgWEZBX0FUVFJJQlVURV9Db2xTcGFuLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0FuY2hvclR5cGUsCi0gICAgWEZBX0FUVFJJQlVURV9BY2Nlc3NLZXksCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1JpZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfU2NvcGUsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfQ29ubmVjdGlvbiwKLSAgICBYRkFfQVRUUklCVVRFX1J1bkF0LAotICAgIFhGQV9BVFRSSUJVVEVfRXhlY3V0ZVR5cGUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9QaWNrZXIsCi0gICAgWEZBX0FUVFJJQlVURV9IU2Nyb2xsUG9saWN5LAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwKLSAgICBYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfQXNwZWN0LAotICAgIFhGQV9BVFRSSUJVVEVfSHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX1ZhbHVlLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwKLSAgICBYRkFfQVRUUklCVVRFX1NlcnZlciwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfRnJhY0RpZ2l0cywKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9MZWFkRGlnaXRzLAotICAgIFhGQV9BVFRSSUJVVEVfSCwKLSAgICBYRkFfQVRUUklCVVRFX1csCi0gICAgWEZBX0FUVFJJQlVURV9YLAotICAgIFhGQV9BVFRSSUJVVEVfWSwKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfSEFsaWduLAotICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX0FsbG93TWFjcm8sCi0gICAgWEZBX0FUVFJJQlVURV9Db2x1bW5XaWR0aHMsCi0gICAgWEZBX0FUVFJJQlVURV9BY2Nlc3MsCi0gICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwKLSAgICBYRkFfQVRUUklCVVRFX1ZBbGlnbiwKLSAgICBYRkFfQVRUUklCVVRFX01heEgsCi0gICAgWEZBX0FUVFJJQlVURV9NYXhXLAotICAgIFhGQV9BVFRSSUJVVEVfTWluSCwKLSAgICBYRkFfQVRUUklCVVRFX01pblcsCi0gICAgWEZBX0FUVFJJQlVURV9MYXlvdXQsCi0gICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwKLSAgICBYRkFfQVRUUklCVVRFX01lcmdlTW9kZSwKLSAgICBYRkFfQVRUUklCVVRFX0NvbFNwYW4sCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jYWxlLAotICAgIFhGQV9BVFRSSUJVVEVfQW5jaG9yVHlwZSwKLSAgICBYRkFfQVRUUklCVVRFX1Jlc3RvcmVTdGF0ZSwKLSAgICBYRkFfQVRUUklCVVRFX1Njb3BlLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1R5cGUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9UaW1lb3V0LAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfTW9kZSwKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Sb2xlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfU3Ryb2tlLAotICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsCi0gICAgWEZBX0FUVFJJQlVURV9JbnZlcnRlZCwKLSAgICBYRkFfQVRUUklCVVRFX1RoaWNrbmVzcywKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9Kb2luLAotICAgIFhGQV9BVFRSSUJVVEVfUmFkaXVzLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX0NTcGFjZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9WYWx1ZSwKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfTmV4dCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1ByZXZpb3VzLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0ludGFjdCwKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX0NvbW1hbmRUeXBlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9EYXRhLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9TY3JpcHRUZXN0LAotICAgIFhGQV9BVFRSSUJVVEVfTnVsbFRlc3QsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0Zvcm1hdFRlc3QsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9UeXBlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1JlbGF0aW9uLAotICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsCi0gICAgWEZBX0FUVFJJQlVURV9EdXBsZXhJbXBvc2l0aW9uLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfVG8sCi0gICAgWEZBX0FUVFJJQlVURV9Gb3JjZSwKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Gcm9tLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9WYWx1ZSwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1JlZiwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX09wZXJhdGlvbiwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1R5cGUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0Jhc2VQcm9maWxlLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1R5cGUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsCi0gICAgWEZBX0FUVFJJQlVURV9SdW5BdCwKLSAgICBYRkFfQVRUUklCVVRFX0JpbmRpbmcsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9QYXNzd29yZENoYXIsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfSFNjcm9sbFBvbGljeSwKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0hTY3JvbGxQb2xpY3ksCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1BhZ2VQb3NpdGlvbiwKLSAgICBYRkFfQVRUUklCVVRFX09kZE9yRXZlbiwKLSAgICBYRkFfQVRUUklCVVRFX1JlbGV2YW50LAotICAgIFhGQV9BVFRSSUJVVEVfSW5pdGlhbE51bWJlciwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9OdW1iZXJlZCwKLSAgICBYRkFfQVRUUklCVVRFX0JsYW5rT3JOb3RCbGFuaywKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9UeXBlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfUmVzZXJ2ZSwKLSAgICBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX1BsYWNlbWVudCwKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9SaWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwKLSAgICBYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfTWF4TGVuZ3RoLAotICAgIFhGQV9BVFRSSUJVVEVfSHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0FiYnIsCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX1dyaXRpbmdTY3JpcHQsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfQWN0aW9uLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfVHJhaWxlciwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9UYXJnZXQsCi0gICAgWEZBX0FUVFJJQlVURV9MZWFkZXIsCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1R5cGUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfVG8sCi0gICAgWEZBX0FUVFJJQlVURV9Vbmljb2RlUmFuZ2UsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfRnJvbSwKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1RyYXlPdXQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9PcmllbnRhdGlvbiwKLSAgICBYRkFfQVRUUklCVVRFX0ltYWdpbmdCQm94LAotICAgIFhGQV9BVFRSSUJVVEVfU2hvcnQsCi0gICAgWEZBX0FUVFJJQlVURV9UcmF5SW4sCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfU3RvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9Mb25nLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9WU2Nyb2xsUG9saWN5LAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfQWxsb3dSaWNoVGV4dCwKLSAgICBYRkFfQVRUUklCVVRFX011bHRpTGluZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9IU2Nyb2xsUG9saWN5LAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX01heEVudHJpZXMsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsCi0gICAgWEZBX0FUVFJJQlVURV9Db250YWlucywKLSAgICBYRkFfQVRUUklCVVRFX1ZhbHVlLAotICAgIFhGQV9BVFRSSUJVVEVfSXNOdWxsLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfUmVmLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfT3BlcmF0aW9uLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX1RhcmdldCwKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9SZWYsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwKLSAgICBYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfTWF0Y2gsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9IYW5kLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9ILAotICAgIFhGQV9BVFRSSUJVVEVfVywKLSAgICBYRkFfQVRUUklCVVRFX1gsCi0gICAgWEZBX0FUVFJJQlVURV9ZLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9IQWxpZ24sCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfUm90YXRlLAotICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsCi0gICAgWEZBX0FUVFJJQlVURV9WQWxpZ24sCi0gICAgWEZBX0FUVFJJQlVURV9NYXhILAotICAgIFhGQV9BVFRSSUJVVEVfTWF4VywKLSAgICBYRkFfQVRUUklCVVRFX01pbkgsCi0gICAgWEZBX0FUVFJJQlVURV9NaW5XLAotICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsCi0gICAgWEZBX0FUVFJJQlVURV9Db2xTcGFuLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0xvY2FsZSwKLSAgICBYRkFfQVRUUklCVVRFX0FuY2hvclR5cGUsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9SaWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Qcmlvcml0eSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9EaXNhYmxlLAotICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfVmFsdWUsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1R5cGUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX0xpbmVUaHJvdWdoLAotICAgIFhGQV9BVFRSSUJVVEVfVHlwZWZhY2UsCi0gICAgWEZBX0FUVFJJQlVURV9Gb250SG9yaXpvbnRhbFNjYWxlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfS2VybmluZ01vZGUsCi0gICAgWEZBX0FUVFJJQlVURV9VbmRlcmxpbmUsCi0gICAgWEZBX0FUVFJJQlVURV9CYXNlbGluZVNoaWZ0LAotICAgIFhGQV9BVFRSSUJVVEVfT3ZlcmxpbmVQZXJpb2QsCi0gICAgWEZBX0FUVFJJQlVURV9MZXR0ZXJTcGFjaW5nLAotICAgIFhGQV9BVFRSSUJVVEVfTGluZVRocm91Z2hQZXJpb2QsCi0gICAgWEZBX0FUVFJJQlVURV9Gb250VmVydGljYWxTY2FsZSwKLSAgICBYRkFfQVRUUklCVVRFX1BzTmFtZSwKLSAgICBYRkFfQVRUUklCVVRFX1NpemUsCi0gICAgWEZBX0FUVFJJQlVURV9Qb3N0dXJlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX1dlaWdodCwKLSAgICBYRkFfQVRUUklCVVRFX1VuZGVybGluZVBlcmlvZCwKLSAgICBYRkFfQVRUUklCVVRFX092ZXJsaW5lLAotICAgIFhGQV9BVFRSSUJVVEVfR2VuZXJpY0ZhbWlseSwKLSAgICBYRkFfQVRUUklCVVRFX0NoZWNrc3VtLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfT3ZlcnJpZGUsCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1RyYWlsZXIsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfTGVhZGVyLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfQ29kZVR5cGUsCi0gICAgWEZBX0FUVFJJQlVURV9BcmNoaXZlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0NvZGVCYXNlLAotICAgIFhGQV9BVFRSSUJVVEVfQ2xhc3NJZCwKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9SZWYsCi0gICAgWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLAotICAgIFhGQV9BVFRSSUJVVEVfTGFiZWxSZWYsCi0gICAgWEZBX0FUVFJJQlVURV9WYWx1ZVJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX092ZXJyaWRlLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfVmFsdWUsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwKLSAgICBYRkFfQVRUUklCVVRFX1JlZiwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1RpbWVvdXQsCi0gICAgWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLAotICAgIFhGQV9BVFRSSUJVVEVfVXNhZ2UsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfRGVsYXllZE9wZW4sCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfRm9ybWF0LAotICAgIFhGQV9BVFRSSUJVVEVfRW1iZWRQREYsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfVGFyZ2V0LAotICAgIFhGQV9BVFRSSUJVVEVfVGV4dEVuY29kaW5nLAotICAgIFhGQV9BVFRSSUJVVEVfWGRwQ29udGVudCwKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfRGVsaW1pdGVyLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1R5cGUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9SZWYsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZSwKLSAgICBYRkFfQVRUUklCVVRFX1N0YXJ0TmV3LAotICAgIFhGQV9BVFRSSUJVVEVfVHJhaWxlciwKLSAgICBYRkFfQVRUUklCVVRFX1RhcmdldFR5cGUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotICAgIFhGQV9BVFRSSUJVVEVfVGFyZ2V0LAotICAgIFhGQV9BVFRSSUJVVEVfTGVhZGVyLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9TbG9wZSwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9IYW5kLAotICAgIFhGQV9BVFRSSUJVVEVfSWQsCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwKLSAgICBYRkFfQVRUUklCVVRFX0lkLAotICAgIFhGQV9BVFRSSUJVVEVfTWF4LAotICAgIFhGQV9BVFRSSUJVVEVfTWluLAotICAgIFhGQV9BVFRSSUJVVEVfVXNlLAotICAgIFhGQV9BVFRSSUJVVEVfSW5pdGlhbCwKLSAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0FiYnIsCi0gICAgWEZBX0FUVFJJQlVURV9EZXNjLAotICAgIFhGQV9BVFRSSUJVVEVfTG9jaywKLSAgICBYRkFfQVRUUklCVVRFX0Rlc2MsCi0gICAgWEZBX0FUVFJJQlVURV9Mb2NrLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9OYW1lLAotICAgIFhGQV9BVFRSSUJVVEVfRGVzYywKLSAgICBYRkFfQVRUUklCVVRFX0xvY2ssCi0gICAgWEZBX0FUVFJJQlVURV9JZCwKLSAgICBYRkFfQVRUUklCVVRFX05hbWUsCi0gICAgWEZBX0FUVFJJQlVURV9SZWYsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2UsCi0gICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwKLSAgICBYRkFfQVRUUklCVVRFX1NhdmUsCi0gICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLAotfTsKZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci94ZmFfYmFzaWNfZGF0YV9lbGVtZW50X3Byb3BlcnRpZXMuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL3hmYV9iYXNpY19kYXRhX2VsZW1lbnRfcHJvcGVydGllcy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNDdiMDMuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL3hmYV9iYXNpY19kYXRhX2VsZW1lbnRfcHJvcGVydGllcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0ODcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9iYXNpY19kYXRhLmgiCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9meGZhX2Jhc2ljLmgiCi0KLWNvbnN0IFhGQV9FTEVNRU5USElFUkFSQ0hZIGdfWEZBRWxlbWVudFByb3BlcnR5SW5kZXhbXSA9IHsKLSAgICB7MCwgOH0sICAgIHs4LCAwfSwgICB7OCwgMTR9LCAgIHsyMiwgMH0sICAgezIyLCAwfSwgICB7MjIsIDZ9LCAgIHsyOCwgMH0sCi0gICAgezI4LCAwfSwgICB7MjgsIDF9LCAgezI5LCAzfSwgICB7MzIsIDB9LCAgIHszMiwgMH0sICAgezMyLCAwfSwgICB7MzIsIDN9LAotICAgIHszNSwgMX0sICAgezM2LCAwfSwgIHszNiwgMH0sICAgezM2LCAyfSwgICB7MzgsIDB9LCAgIHszOCwgMH0sICAgezM4LCAwfSwKLSAgICB7MzgsIDR9LCAgIHs0MiwgMH0sICB7NDIsIDB9LCAgIHs0MiwgMX0sICAgezQzLCAwfSwgICB7NDMsIDh9LCAgIHs1MSwgMTl9LAotICAgIHs3MCwgMH0sICAgezcwLCAwfSwgIHs3MCwgMn0sICAgezcyLCAxfSwgICB7NzMsIDB9LCAgIHs3MywgMn0sICAgezc1LCA0fSwKLSAgICB7NzksIDF9LCAgIHs4MCwgMX0sICB7ODEsIDB9LCAgIHs4MSwgMH0sICAgezgxLCAzfSwgICB7ODQsIDB9LCAgIHs4NCwgNH0sCi0gICAgezg4LCA0fSwgICB7OTIsIDF9LCAgezkzLCAwfSwgICB7OTMsIDR9LCAgIHs5NywgOX0sICAgezEwNiwgMTR9LCB7MTIwLCAwfSwKLSAgICB7MTIwLCAwfSwgIHsxMjAsIDV9LCB7MTI1LCAwfSwgIHsxMjUsIDF9LCAgezEyNiwgMH0sICB7MTI2LCAwfSwgIHsxMjYsIDB9LAotICAgIHsxMjYsIDB9LCAgezEyNiwgMH0sIHsxMjYsIDF9LCAgezEyNywgMH0sICB7MTI3LCAwfSwgIHsxMjcsIDB9LCAgezEyNywgMH0sCi0gICAgezEyNywgMH0sICB7MTI3LCAwfSwgezEyNywgMH0sICB7MTI3LCA2fSwgIHsxMzMsIDF9LCAgezEzNCwgMH0sICB7MTM0LCAxfSwKLSAgICB7MTM1LCAwfSwgIHsxMzUsIDB9LCB7MTM1LCAxfSwgIHsxMzYsIDJ9LCAgezEzOCwgNX0sICB7MTQzLCAyfSwgIHsxNDUsIDB9LAotICAgIHsxNDUsIDB9LCAgezE0NSwgMH0sIHsxNDUsIDB9LCAgezE0NSwgMH0sICB7MTQ1LCA1fSwgIHsxNTAsIDB9LCAgezE1MCwgMH0sCi0gICAgezE1MCwgMH0sICB7MTUwLCAwfSwgezE1MCwgMH0sICB7MTUwLCAwfSwgIHsxNTAsIDB9LCAgezE1MCwgMn0sICB7MTUyLCAwfSwKLSAgICB7MTUyLCAwfSwgIHsxNTIsIDB9LCB7MTUyLCAxN30sIHsxNjksIDB9LCAgezE2OSwgMX0sICB7MTcwLCAwfSwgIHsxNzAsIDB9LAotICAgIHsxNzAsIDJ9LCAgezE3MiwgMH0sIHsxNzIsIDB9LCAgezE3MiwgMX0sICB7MTczLCAwfSwgIHsxNzMsIDB9LCAgezE3MywgMn0sCi0gICAgezE3NSwgMn0sICB7MTc3LCAwfSwgezE3NywgMH0sICB7MTc3LCAwfSwgIHsxNzcsIDExfSwgezE4OCwgMH0sICB7MTg4LCAwfSwKLSAgICB7MTg4LCAwfSwgIHsxODgsIDB9LCB7MTg4LCAwfSwgIHsxODgsIDR9LCAgezE5MiwgM30sICB7MTk1LCAwfSwgIHsxOTUsIDB9LAotICAgIHsxOTUsIDB9LCAgezE5NSwgMH0sIHsxOTUsIDB9LCAgezE5NSwgMH0sICB7MTk1LCA5fSwgIHsyMDQsIDB9LCAgezIwNCwgMH0sCi0gICAgezIwNCwgMTd9LCB7MjIxLCAwfSwgezIyMSwgMH0sICB7MjIxLCAwfSwgIHsyMjEsIDB9LCAgezIyMSwgMH0sICB7MjIxLCAwfSwKLSAgICB7MjIxLCAwfSwgIHsyMjEsIDB9LCB7MjIxLCAwfSwgIHsyMjEsIDR9LCAgezIyNSwgMH0sICB7MjI1LCAwfSwgIHsyMjUsIDB9LAotICAgIHsyMjUsIDB9LCAgezIyNSwgMn0sIHsyMjcsIDN9LCAgezIzMCwgMH0sICB7MjMwLCAwfSwgIHsyMzAsIDJ9LCAgezIzMiwgMH0sCi0gICAgezIzMiwgMX0sICB7MjMzLCAyfSwgezIzNSwgMn0sICB7MjM3LCAwfSwgIHsyMzcsIDB9LCAgezIzNywgMn0sICB7MjM5LCAwfSwKLSAgICB7MjM5LCAxfSwgIHsyNDAsIDF9LCB7MjQxLCAyfSwgIHsyNDMsIDB9LCAgezI0MywgM30sICB7MjQ2LCA0fSwgIHsyNTAsIDB9LAotICAgIHsyNTAsIDF9LCAgezI1MSwgMn0sIHsyNTMsIDB9LCAgezI1MywgMH0sICB7MjUzLCAwfSwgIHsyNTMsIDB9LCAgezI1MywgMH0sCi0gICAgezI1MywgMH0sICB7MjUzLCAwfSwgezI1MywgMH0sICB7MjUzLCAwfSwgIHsyNTMsIDB9LCAgezI1MywgMn0sICB7MjU1LCAyfSwKLSAgICB7MjU3LCAwfSwgIHsyNTcsIDZ9LCB7MjYzLCA1fSwgIHsyNjgsIDB9LCAgezI2OCwgMH0sICB7MjY4LCAwfSwgIHsyNjgsIDN9LAotICAgIHsyNzEsIDB9LCAgezI3MSwgMH0sIHsyNzEsIDN9LCAgezI3NCwgNH0sICB7Mjc4LCAwfSwgIHsyNzgsIDB9LCAgezI3OCwgNH0sCi0gICAgezI4MiwgMH0sICB7MjgyLCAwfSwgezI4MiwgNX0sICB7Mjg3LCAwfSwgIHsyODcsIDV9LCAgezI5MiwgMH0sICB7MjkyLCAwfSwKLSAgICB7MjkyLCAwfSwgIHsyOTIsIDF9LCB7MjkzLCAwfSwgIHsyOTMsIDB9LCAgezI5MywgMX0sICB7Mjk0LCAwfSwgIHsyOTQsIDJ9LAotICAgIHsyOTYsIDB9LCAgezI5NiwgMH0sIHsyOTYsIDB9LCAgezI5NiwgMH0sICB7Mjk2LCAxfSwgIHsyOTcsIDB9LCAgezI5NywgMH0sCi0gICAgezI5NywgNH0sICB7MzAxLCAwfSwgezMwMSwgMH0sICB7MzAxLCAwfSwgIHszMDEsIDB9LCAgezMwMSwgMH0sICB7MzAxLCAwfSwKLSAgICB7MzAxLCAxfSwgIHszMDIsIDB9LCB7MzAyLCAyfSwgIHszMDQsIDB9LCAgezMwNCwgMH0sICB7MzA0LCAwfSwgIHszMDQsIDB9LAotICAgIHszMDQsIDF9LCAgezMwNSwgNH0sIHszMDksIDB9LCAgezMwOSwgM30sICB7MzEyLCAwfSwgIHszMTIsIDB9LCAgezMxMiwgMX0sCi0gICAgezMxMywgMH0sICB7MzEzLCA4fSwgezMyMSwgMH0sICB7MzIxLCAxMH0sIHszMzEsIDB9LCAgezMzMSwgMTB9LCB7MzQxLCAxfSwKLSAgICB7MzQyLCAxMn0sIHszNTQsIDN9LCB7MzU3LCAxfSwgIHszNTgsIDB9LCAgezM1OCwgMH0sICB7MzU4LCAwfSwgIHszNTgsIDh9LAotICAgIHszNjYsIDB9LCAgezM2NiwgMH0sIHszNjYsIDB9LCAgezM2NiwgMH0sICB7MzY2LCAwfSwgIHszNjYsIDB9LCAgezM2NiwgN30sCi0gICAgezM3MywgMn0sICB7Mzc1LCAwfSwgezM3NSwgMX0sICB7Mzc2LCAwfSwgIHszNzYsIDB9LCAgezM3NiwgMH0sICB7Mzc2LCAwfSwKLSAgICB7Mzc2LCAwfSwgIHszNzYsIDB9LCB7Mzc2LCAwfSwgIHszNzYsIDB9LCAgezM3NiwgMTN9LCB7Mzg5LCAwfSwgIHszODksIDF9LAotICAgIHszOTAsIDF9LCAgezM5MSwgMH0sIHszOTEsIDB9LCAgezM5MSwgM30sICB7Mzk0LCAwfSwgIHszOTQsIDB9LCAgezM5NCwgMH0sCi0gICAgezM5NCwgMH0sICB7Mzk0LCAwfSwgezM5NCwgNH0sICB7Mzk4LCA5fSwgIHs0MDcsIDB9LCAgezQwNywgMX0sICB7NDA4LCAwfSwKLSAgICB7NDA4LCAwfSwgIHs0MDgsIDB9LCB7NDA4LCAwfSwgIHs0MDgsIDB9LCAgezQwOCwgMX0sICB7NDA5LCAwfSwgIHs0MDksIDJ9LAotICAgIHs0MTEsIDB9LCAgezQxMSwgMH0sIHs0MTEsIDB9LCAgezQxMSwgMH0sICB7NDExLCAyfSwgIHs0MTMsIDB9LCAgezQxMywgMX0sCi0gICAgezQxNCwgMH0sICB7NDE0LCAwfSwgezQxNCwgMH0sICB7NDE0LCA3fSwgIHs0MjEsIDB9LCAgezQyMSwgMX0sICB7NDIyLCAxfSwKLSAgICB7NDIzLCAwfSwgIHs0MjMsIDF9LCB7NDI0LCAxfSwgIHs0MjUsIDB9LCAgezQyNSwgMX0sICB7NDI2LCAwfSwgIHs0MjYsIDB9LAotICAgIHs0MjYsIDB9LCAgezQyNiwgMH0sIHs0MjYsIDB9LCAgezQyNiwgMH0sCi19OwotCi1jb25zdCBYRkFfUFJPUEVSVFkgZ19YRkFFbGVtZW50UHJvcGVydHlEYXRhW10gPSB7Ci0gICAge1hGQV9FbGVtZW50OjpGb250SW5mbywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpKb2csIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6WGRjLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkJhdGNoT3V0cHV0LCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6Ok91dHB1dEJpbiwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpDb21wcmVzcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpTdGFwbGUsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6TWVkaXVtSW5mbywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpDaGVja0J1dHRvbiwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCi0gICAge1hGQV9FbGVtZW50OjpDaG9pY2VMaXN0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkRlZmF1bHRVaSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCi0gICAge1hGQV9FbGVtZW50OjpCYXJjb2RlLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkJ1dHRvbiwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCi0gICAge1hGQV9FbGVtZW50OjpEYXRlVGltZUVkaXQsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAotICAgIHtYRkFfRWxlbWVudDo6UGljdHVyZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpJbWFnZUVkaXQsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAotICAgIHtYRkFfRWxlbWVudDo6UGFzc3dvcmRFZGl0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKLSAgICB7WEZBX0VsZW1lbnQ6Ok51bWVyaWNFZGl0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlNpZ25hdHVyZSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCi0gICAge1hGQV9FbGVtZW50OjpUZXh0RWRpdCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCi0gICAge1hGQV9FbGVtZW50OjpFeE9iamVjdCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCi0gICAge1hGQV9FbGVtZW50OjpFeHRyYXMsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6QnJlYWssIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6T3ZlcmZsb3csIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RGVzYywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpCb29rZW5kLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpPY2N1ciwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpFeHRyYXMsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6U3Vic2V0QmVsb3csIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6TWFwLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkVtYmVkLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6Ok1hcmdpbiwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpCb3JkZXIsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkRhdGVQYXR0ZXJuLCA0LCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkVkZ2UsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RmlsbCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpUbywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpVcmksIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6TW9kZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpUaHJlc2hvbGQsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6U2NyaXB0LCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkZvbnRJbmZvLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkpvZywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpYZGMsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6QmF0Y2hPdXRwdXQsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6UGFnZU9mZnNldCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpPdXRwdXRCaW4sIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6U3RhcGxlLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6Ok1lZGl1bUluZm8sIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6QWRvYmVFeHRlbnNpb25MZXZlbCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpGb250SW5mbywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpYZGMsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6UGRmYSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpCYXRjaE91dHB1dCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpWaWV3ZXJQcmVmZXJlbmNlcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpTY3JpcHRNb2RlbCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpWZXJzaW9uLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlN1Ym1pdEZvcm1hdCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpTaWxlbnRQcmludCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpQcm9kdWNlciwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpDb21wcmVzc2lvbiwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpJbnRlcmFjdGl2ZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpFbmNyeXB0aW9uLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlJlbmRlclBvbGljeSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpPcGVuQWN0aW9uLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkNyZWF0b3IsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6TGluZWFyaXplZCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpUYWdnZWQsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6VXJpLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlhzbCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpQYWNrZXRzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlVyaSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpEZWJ1ZywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpGb250SW5mbywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpYZGMsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6QmF0Y2hPdXRwdXQsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RmxpcExhYmVsLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlRlbXBsYXRlQ2FjaGUsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6Ok1hcmdpbiwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpCb3JkZXIsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkZvbnRJbmZvLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlhkYywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpCYXRjaE91dHB1dCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpGbGlwTGFiZWwsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RXJhTmFtZXMsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RGF5TmFtZXMsIDIsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6TWVyaWRpZW1OYW1lcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpNb250aE5hbWVzLCAyLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6Okh5cGhlbmF0aW9uLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkFtZCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpQYXJ0LCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkluY2x1ZGVYRFBDb250ZW50LCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkNvbmZvcm1hbmNlLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6Ok1kcCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpDZXJ0aWZpY2F0ZXMsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6VGltZVN0YW1wLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkhhbmRsZXIsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RGlnZXN0TWV0aG9kcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpFbmNvZGluZ3MsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6UmVhc29ucywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpBcHBlYXJhbmNlRmlsdGVyLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkxvY2tEb2N1bWVudCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpYZHAsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6Q2FjaGUsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6UGFnaW5hdGlvbiwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpPdmVycHJpbnQsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6QmVoYXZpb3JPdmVycmlkZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpDb3BpZXMsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6T3V0cHV0LCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlZhbGlkYXRlLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkxheW91dCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpTY3JpcHQsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6Q29tbW9uLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlBhZ2luYXRpb25PdmVycmlkZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpEZXN0aW5hdGlvbiwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpJbmNyZW1lbnRhbE1lcmdlLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkV4ZWN1dGUsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAotICAgIHtYRkFfRWxlbWVudDo6U2NyaXB0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlNpZ25EYXRhLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpTdWJtaXQsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAotICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkN1cnJlbmN5U3ltYm9sLCAzLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6Ok9wZXJhdGlvbiwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpXc2RsQWRkcmVzcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpTb2FwQWRkcmVzcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpTb2FwQWN0aW9uLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkVmZmVjdGl2ZU91dHB1dFBvbGljeSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpFZmZlY3RpdmVJbnB1dFBvbGljeSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpVcmksIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RXJhLCAyLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpQaWN0dXJlLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpNYXJnaW4sIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RWRnZSwgNCwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpDb3JuZXIsIDQsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RmlsbCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpFeHRyYXMsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RGVzYywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpFeHRyYXMsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6S2V5VXNhZ2UsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6U3ViamVjdEROcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpJc3N1ZXJzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlNpZ25pbmcsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6T2lkcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpDb2xvciwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpFeHRyYXMsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6VWksIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6TWFyZ2luLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlBhcmEsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6Rm9ybWF0LCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkJvcmRlciwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpBc3Npc3QsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6VHJhdmVyc2FsLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OktlZXAsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6VmFsaWRhdGUsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6Q2FwdGlvbiwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpCaW5kLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkRlc2MsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6Rm9udCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpWYWx1ZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpDYWxjdWxhdGUsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6Okl0ZW1zLCAyLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlVyaSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpEZXNjLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpFeHRyYXMsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6Q29sb3IsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkNvbG9yLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpNYXJnaW4sIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6UGFyYSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpCb3JkZXIsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6QXNzaXN0LCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlRyYXZlcnNhbCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpWYWxpZGF0ZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpDYXB0aW9uLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkJpbmQsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RGVzYywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpDYWxjdWxhdGUsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6Ok1hcmdpbiwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpCb3JkZXIsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6Q29tYiwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpFeHRyYXMsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6UHJlc2VudCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpBY3JvYmF0LCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlRyYWNlLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlByaW50U2NhbGluZywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpFbmZvcmNlLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6Ok51bWJlck9mQ29waWVzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlBhZ2VSYW5nZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpBZGRWaWV3ZXJQcmVmZXJlbmNlcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpBREJFX0pTQ29uc29sZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpEdXBsZXhPcHRpb24sIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6QURCRV9KU0RlYnVnZ2VyLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlBpY2tUcmF5QnlQREZTaXplLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkJyZWFrLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6Ok1hcmdpbiwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpQYXJhLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkJvcmRlciwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpBc3Npc3QsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6VHJhdmVyc2FsLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OktlZXAsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6VmFsaWRhdGUsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6UGFnZVNldCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpPdmVyZmxvdywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpCaW5kLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkRlc2MsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6Qm9va2VuZCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpDYWxjdWxhdGUsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlZhcmlhYmxlcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpPY2N1ciwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpRdWVyeSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpJbnNlcnQsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6VXBkYXRlLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkRlbGV0ZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpNc2dJZCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpTZXZlcml0eSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpUbywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpVcmksIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6VHlwZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpUb29sVGlwLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlNwZWFrLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpBZGRTaWxlbnRQcmludCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpQcmludGVyTmFtZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpGb250SW5mbywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpYZGMsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6Q29sb3IsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpFeHRyYXMsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6UmVjb3JkU2V0LCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlNlbGVjdCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpNYXJnaW4sIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6Qm9yZGVyLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpNZXNzYWdlLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlBpY3R1cmUsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6U2NyaXB0LCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpOdW1iZXJQYXR0ZXJuLCA0LCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpPY2N1ciwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpVcmksIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6Um9vdEVsZW1lbnQsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6U2NyaXB0LCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpVcmksIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6WHNsLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlN0YXJ0UGFnZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpSZWxldmFudCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpCYXNlLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpBdXRvU2F2ZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpWYWxpZGF0ZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpWYWxpZGF0ZUFwcHJvdmFsU2lnbmF0dXJlcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpBY3JvYmF0NywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpDb21tb24sIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RXhjbHVkZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpDdXJyZW50UGFnZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpSdW5TY3JpcHRzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6Ok1hcmdpbiwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpCb3JkZXIsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6Ok1hcmdpbiwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpCb3JkZXIsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6Q29tYiwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpFeHRyYXMsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6TWVkaXVtLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkRlc2MsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6Ok9jY3VyLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6Ok1hcmdpbiwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpGaWx0ZXIsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6Qm9yZGVyLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6Ok1hbmlmZXN0LCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpNYXJnaW4sIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6UGFyYSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpGb250LCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlZhbHVlLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpEYXksIDcsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkNvbG9yLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpPY2N1ciwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpNYXJnaW4sIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6Qm9yZGVyLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkNvbWIsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlVyaSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpGaWx0ZXIsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6TWFuaWZlc3QsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6UGljdHVyZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpMZXZlbCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpUeXBlLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkNvbXByZXNzT2JqZWN0U3RyZWFtLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkNvbXByZXNzTG9naWNhbFN0cnVjdHVyZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpFZGdlLCA0LCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkNvcm5lciwgNCwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpGaWxsLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkR5bmFtaWNSZW5kZXIsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RGF0ZVBhdHRlcm5zLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkNhbGVuZGFyU3ltYm9scywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpDdXJyZW5jeVN5bWJvbHMsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6VHlwZWZhY2VzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkRhdGVUaW1lU3ltYm9scywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpOdW1iZXJQYXR0ZXJucywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpOdW1iZXJTeW1ib2xzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlRpbWVQYXR0ZXJucywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpVcmksIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6WHNsLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlN0YXJ0Tm9kZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpPdXRwdXRYU0wsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6QWRqdXN0RGF0YSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpBdHRyaWJ1dGVzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OldpbmRvdywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpSZWNvcmQsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6UmFuZ2UsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6SW5jcmVtZW50YWxMb2FkLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlRleHQsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6VGltZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpEYXRlVGltZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpJbWFnZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpEZWNpbWFsLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkJvb2xlYW4sIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6SW50ZWdlciwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpFeERhdGEsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RGF0ZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpGbG9hdCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpDZXJ0aWZpY2F0ZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpVaSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpNYXJnaW4sIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6UGFyYSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpCb3JkZXIsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6QXNzaXN0LCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlRyYXZlcnNhbCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpLZWVwLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkNhcHRpb24sIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RGVzYywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpGb250LCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlZhbHVlLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpFbmNyeXB0aW9uTGV2ZWwsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RW5jcnlwdCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpQZXJtaXNzaW9ucywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpNZXJpZGllbSwgMiwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpTdXBwcmVzc0Jhbm5lciwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpWZXJzaW9uQ29udHJvbCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpMb2NhbGVTZXQsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6VGVtcGxhdGUsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6VmFsaWRhdGlvbk1lc3NhZ2luZywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpMb2NhbGUsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RGF0YSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpNZXNzYWdpbmcsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6UGF0dGVybiwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCi0gICAge1hGQV9FbGVtZW50OjpTb2xpZCwgMSwKLSAgICAgWEZBX1BST1BFUlRZRkxBR19PbmVPZiB8IFhGQV9QUk9QRVJUWUZMQUdfRGVmYXVsdE9uZU9mfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlN0aXBwbGUsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAotICAgIHtYRkFfRWxlbWVudDo6Q29sb3IsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6TGluZWFyLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpSYWRpYWwsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAotICAgIHtYRkFfRWxlbWVudDo6RmlsbCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpFeHRyYXMsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6TWFwLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkFyYywgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCi0gICAge1hGQV9FbGVtZW50OjpUZXh0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlRpbWUsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAotICAgIHtYRkFfRWxlbWVudDo6RGF0ZVRpbWUsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAotICAgIHtYRkFfRWxlbWVudDo6SW1hZ2UsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAotICAgIHtYRkFfRWxlbWVudDo6RGVjaW1hbCwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCi0gICAge1hGQV9FbGVtZW50OjpCb29sZWFuLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkludGVnZXIsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAotICAgIHtYRkFfRWxlbWVudDo6RXhEYXRhLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlJlY3RhbmdsZSwgMSwgWEZBX1BST1BFUlRZRkxBR19PbmVPZn0sCi0gICAge1hGQV9FbGVtZW50OjpEYXRlLCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkZsb2F0LCAxLCBYRkFfUFJPUEVSVFlGTEFHX09uZU9mfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkxpbmUsIDEsIFhGQV9QUk9QRVJUWUZMQUdfT25lT2Z9LAotICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkRlc3RpbmF0aW9uLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6Ok1lc3NhZ2UsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6U2NyaXB0LCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkV4dHJhcywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpQaWN0dXJlLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkNvbm5lY3RTdHJpbmcsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6VXNlciwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpQYXNzd29yZCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpNb2RpZnlBbm5vdHMsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6Q29udGVudENvcHksIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6Rm9ybUZpZWxkRmlsbGluZywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpDaGFuZ2UsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6QWNjZXNzaWJsZUNvbnRlbnQsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6UHJpbnQsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6UGxhaW50ZXh0TWV0YWRhdGEsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6UHJpbnRIaWdoUXVhbGl0eSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpEb2N1bWVudEFzc2VtYmx5LCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkVuY3J5cHQsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6TnVtYmVyU3ltYm9sLCA1LCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkZvbnRJbmZvLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlhkYywgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpDb2xvciwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpFeHRyYXMsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6VGltZVBhdHRlcm4sIDQsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6V2hpdGVzcGFjZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpSZW5hbWUsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6SWZFbXB0eSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpQcmVzZW5jZSwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpQaWN0dXJlLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6Ok5hbWVBdHRyLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6Okdyb3VwUGFyZW50LCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OlNjcmlwdCwgMSwgMH0sCi0gICAge1hGQV9FbGVtZW50OjpFZGdlLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6OkNvbm5lY3QsIDEsIDB9LAotICAgIHtYRkFfRWxlbWVudDo6RXh0cmFzLCAxLCAwfSwKLSAgICB7WEZBX0VsZW1lbnQ6Ok1vbnRoLCAxMiwgMH0sCi19OwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL3hmYV9iYXNpY19kYXRhX2VsZW1lbnRfc2NyaXB0LmNwcCBiL3hmYS9meGZhL3BhcnNlci94ZmFfYmFzaWNfZGF0YV9lbGVtZW50X3NjcmlwdC5jcHAKaW5kZXggNjc1ZmI4YS4uODBhMmJmMyAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL3hmYV9iYXNpY19kYXRhX2VsZW1lbnRfc2NyaXB0LmNwcAorKysgYi94ZmEvZnhmYS9wYXJzZXIveGZhX2Jhc2ljX2RhdGFfZWxlbWVudF9zY3JpcHQuY3BwCkBAIC02LDM1OTQgKzYsMzgwMyBAQAogCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9iYXNpY19kYXRhLmgiCiAKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfYXJjLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2FyZWEuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfYXNzaXN0LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2JhcmNvZGUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfYmluZC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9iaW5kaXRlbXMuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfYm9va2VuZC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9ib29sZWFuLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2JvcmRlci5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9icmVhay5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9icmVha2FmdGVyLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2JyZWFrYmVmb3JlLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2J1dHRvbi5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9jYWxjdWxhdGUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfY2FwdGlvbi5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9jZXJ0aWZpY2F0ZS5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9jZXJ0aWZpY2F0ZXMuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfY2hlY2tidXR0b24uaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfY2hvaWNlbGlzdC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9jb2xvci5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9jb21iLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2NvbW1hbmQuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfY29ubmVjdC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9jb25uZWN0c3RyaW5nLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2NvbnRlbnRhcmVhLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2Nvcm5lci5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9kYXRhdmFsdWUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZGF0YXdpbmRvdy5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9kYXRlLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2RhdGV0aW1lLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2RhdGV0aW1lZWRpdC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9kZWNpbWFsLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2RlZmF1bHR1aS5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9kZWxldGUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZGVsdGEuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZGVzYy5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9kaWdlc3RtZXRob2QuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZGlnZXN0bWV0aG9kcy5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9kcmF3LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2VkZ2UuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZW5jb2RpbmcuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZW5jb2RpbmdzLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2VuY3J5cHQuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZXZlbnQuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZXZlbnRwc2V1ZG9tb2RlbC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9leGNsZ3JvdXAuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZXhkYXRhLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2V4ZWN1dGUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZXhvYmplY3QuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZXh0cmFzLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2ZpZWxkLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2ZpbGwuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZmlsdGVyLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2Zsb2F0LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2ZvbnQuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfZm9ybWF0LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfaG9zdHBzZXVkb21vZGVsLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2ltYWdlLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2ltYWdlZWRpdC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9pbnNlcnQuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfaW5zdGFuY2VtYW5hZ2VyLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2ludGVnZXIuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfaXNzdWVycy5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9pdGVtcy5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9rZWVwLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2tleXVzYWdlLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2xheW91dHBzZXVkb21vZGVsLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2xpbmUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbGluZWFyLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X2xvZ3BzZXVkb21vZGVsLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X21hbmlmZXN0LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X21hcC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9tYXJnaW4uaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbWRwLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X21lZGl1bS5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9tZXNzYWdlLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X25vZGUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfbnVtZXJpY2VkaXQuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfb2NjdXIuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfb2lkLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X29pZHMuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfb3BlcmF0aW9uLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X292ZXJmbG93LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3BhY2tldC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9wYWdlYXJlYS5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9wYWdlc2V0LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3BhcmEuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfcGFzc3dvcmQuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfcGFzc3dvcmRlZGl0LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3BhdHRlcm4uaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfcGljdHVyZS5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9xdWVyeS5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9yYWRpYWwuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfcmVhc29uLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3JlYXNvbnMuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfcmVjb3Jkc2V0LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3JlY3RhbmdsZS5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9yZWYuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfcm9vdGVsZW1lbnQuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc2NyaXB0LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3NlbGVjdC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zZXRwcm9wZXJ0eS5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zaWduYXR1cmUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc2lnbmF0dXJlcHJvcGVydGllcy5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zaWduZGF0YS5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zaWduaW5nLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3NvYXBhY3Rpb24uaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc29hcGFkZHJlc3MuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc29saWQuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc291cmNlLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3NvdXJjZXNldC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zcGVhay5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zdGlwcGxlLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3N1YmZvcm0uaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc3ViZm9ybXNldC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zdWJqZWN0ZG4uaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfc3ViamVjdGRucy5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF9zdWJtaXQuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdGV4dC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF90ZXh0ZWRpdC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF90aW1lLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3RpbWVzdGFtcC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF90b29sdGlwLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3RyYXZlcnNhbC5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF90cmF2ZXJzZS5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF90cmVlLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3RyZWVsaXN0LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3VpLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3VwZGF0ZS5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF91cmkuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfdXNlci5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF92YWxpZGF0ZS5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF92YWx1ZS5oIgorI2luY2x1ZGUgImZ4anMveGZhL2NqeF92YXJpYWJsZXMuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfd3NkbGFkZHJlc3MuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfd3NkbGNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfeGZhLmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X3htbGNvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfeHNkY29ubmVjdGlvbi5oIgogI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmFfYmFzaWMuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9kYXRhd2luZG93LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfZXZlbnRwc2V1ZG9tb2RlbC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jc2NyaXB0X2hvc3Rwc2V1ZG9tb2RlbC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jc2NyaXB0X2xheW91dHBzZXVkb21vZGVsLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2NzY3JpcHRfbG9ncHNldWRvbW9kZWwuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3NjcmlwdF9zaWduYXR1cmVwc2V1ZG9tb2RlbC5oIgogCiBjb25zdCBYRkFfU0NSSVBUSElFUkFSQ0hZIGdfWEZBU2NyaXB0SW5kZXhbXSA9IHsKLSAgICB7MCwgMCwgMCwgMiwgMzE2fSwgICAgICB7MCwgMCwgMiwgMiwgMzE2fSwgICAgICAgezAsIDAsIDQsIDIsIDMxNn0sCi0gICAgezAsIDAsIDYsIDgsIDMxNn0sICAgICAgezAsIDAsIDE0LCA0LCAzMTZ9LCAgICAgIHswLCAwLCAxOCwgNSwgMzE3fSwKLSAgICB7MCwgMCwgMjMsIDIsIDMxNn0sICAgICB7MCwgMCwgMjUsIDEsIDMxNn0sICAgICAgezAsIDAsIDI2LCAxMiwgMzE2fSwKLSAgICB7MCwgMCwgMzgsIDIsIDMxNn0sICAgICB7MCwgMCwgNDAsIDEsIDMxNn0sICAgICAgezAsIDAsIDQxLCAzLCAzMTZ9LAotICAgIHswLCAwLCA0NCwgMiwgMzE2fSwgICAgIHswLCAwLCA0NiwgNiwgMzE2fSwgICAgICB7MCwgMCwgNTIsIDAsIDMxNn0sCi0gICAgezAsIDAsIDUyLCAyLCAzMTl9LCAgICAgezAsIDAsIDU0LCAyLCAzMTZ9LCAgICAgIHswLCAwLCA1NiwgNiwgMzE2fSwKLSAgICB7MCwgMCwgNjIsIDAsIDMxNn0sICAgICB7MCwgMCwgNjIsIDAsIDMxNn0sICAgICAgezAsIDAsIDYyLCAyLCAzMTZ9LAotICAgIHswLCAwLCA2NCwgMiwgMzE2fSwgICAgIHswLCAwLCA2NiwgNiwgMzE2fSwgICAgICB7MCwgMCwgNzIsIDQsIDMxNn0sCi0gICAgezAsIDAsIDc2LCA3LCAzMTZ9LCAgICAgezAsIDAsIDgzLCAyLCAzMjB9LCAgICAgIHswLCAwLCA4NSwgMywgMzE2fSwKLSAgICB7MCwgMCwgODgsIDMsIDMxNn0sICAgICB7MCwgMCwgOTEsIDIsIDMyMH0sICAgICAgezAsIDAsIDkzLCA2LCAzMjB9LAotICAgIHswLCAwLCA5OSwgNCwgMzE2fSwgICAgIHswLCAwLCAxMDMsIDIsIDMxNn0sICAgICB7MCwgMCwgMTA1LCAzLCAzMTl9LAotICAgIHswLCAwLCAxMDgsIDQsIDMxNn0sICAgIHswLCAwLCAxMTIsIDMsIDMxNn0sICAgICB7MCwgMCwgMTE1LCAyLCAzMTZ9LAotICAgIHswLCAwLCAxMTcsIDYsIDMxNn0sICAgIHswLCAwLCAxMjMsIDEyLCAzMTZ9LCAgICB7MCwgMCwgMTM1LCAyLCAzMTZ9LAotICAgIHswLCAwLCAxMzcsIDUsIDMxNn0sICAgIHswLCAwLCAxNDIsIDIsIDMxNn0sICAgICB7MCwgMCwgMTQ0LCAzLCAzMTZ9LAotICAgIHswLCAwLCAxNDcsIDEsIDMxNn0sICAgIHswLCAwLCAxNDgsIDE0LCAzMTZ9LCAgICB7MCwgMCwgMTYyLCAyLCAzMTZ9LAotICAgIHswLCAwLCAxNjQsIDIsIDMxNn0sICAgIHswLCAwLCAxNjYsIDMsIDMxNn0sICAgICB7MCwgMCwgMTY5LCAyLCAzMTZ9LAotICAgIHswLCAwLCAxNzEsIDIsIDMxNn0sICAgIHswLCAwLCAxNzMsIDIsIDMxNn0sICAgICB7MCwgMCwgMTc1LCA0LCAzMTZ9LAotICAgIHswLCAwLCAxNzksIDIsIDMxNn0sICAgIHswLCAwLCAxODEsIDIsIDMxNn0sICAgICB7MCwgMCwgMTgzLCAwLCAzMTl9LAotICAgIHswLCAwLCAxODMsIDIwLCAzMTZ9LCAgIHswLCAwLCAyMDMsIDEsIDMxNn0sICAgICB7MCwgMCwgMjA0LCAzLCAzMTZ9LAotICAgIHswLCAwLCAyMDcsIDIsIDMxNn0sICAgIHswLCAwLCAyMDksIDAsIDMxNn0sICAgICB7MCwgMCwgMjA5LCAyLCAzMTZ9LAotICAgIHswLCAwLCAyMTEsIDIsIDMxNn0sICAgIHswLCAwLCAyMTMsIDQsIDMyMH0sICAgICB7MCwgMCwgMjE3LCAwLCAzMTZ9LAotICAgIHswLCAwLCAyMTcsIDEsIDMxNn0sICAgIHswLCAwLCAyMTgsIDMsIDMxNn0sICAgICB7MCwgNCwgMjIxLCAwLCAzMTJ9LAotICAgIHs0LCAxLCAyMjEsIDEsIDMxNn0sICAgIHs1LCAwLCAyMjIsIDIsIDMxNn0sICAgICB7NSwgMSwgMjI0LCAzLCAtMX0sCi0gICAgezYsIDAsIDIyNywgMCwgMzE2fSwgICAgezYsIDAsIDIyNywgMiwgMzE2fSwgICAgIHs2LCAwLCAyMjksIDIsIDMxNn0sCi0gICAgezYsIDAsIDIzMSwgMywgMzE2fSwgICAgezYsIDAsIDIzNCwgMiwgMzE2fSwgICAgIHs2LCAwLCAyMzYsIDYsIDMxNn0sCi0gICAgezYsIDAsIDI0MiwgMTAsIDMxN30sICAgezYsIDAsIDI1MiwgOSwgMzE2fSwgICAgIHs2LCAwLCAyNjEsIDUsIDMxOH0sCi0gICAgezYsIDAsIDI2NiwgNCwgMzE4fSwgICAgezYsIDAsIDI3MCwgMiwgMzE2fSwgICAgIHs2LCAwLCAyNzIsIDIsIDMxNn0sCi0gICAgezYsIDAsIDI3NCwgNSwgMzE2fSwgICAgezYsIDAsIDI3OSwgMywgMzE2fSwgICAgIHs2LCAwLCAyODIsIDIsIDMxNn0sCi0gICAgezYsIDAsIDI4NCwgMiwgMzE2fSwgICAgezYsIDAsIDI4NiwgMiwgMzE2fSwgICAgIHs2LCAwLCAyODgsIDIsIDMxNn0sCi0gICAgezYsIDAsIDI5MCwgNCwgMzE2fSwgICAgezYsIDAsIDI5NCwgMywgMzE2fSwgICAgIHs2LCAwLCAyOTcsIDMsIDMxNn0sCi0gICAgezYsIDAsIDMwMCwgMiwgMzE2fSwgICAgezYsIDAsIDMwMiwgMiwgMzE2fSwgICAgIHs2LCAwLCAzMDQsIDIsIDMxNn0sCi0gICAgezYsIDEzLCAzMDYsIDM2LCAzMTd9LCAgezE5LCAwLCAzNDIsIDMsIDMxNn0sICAgIHsxOSwgMCwgMzQ1LCAyLCAzMTZ9LAotICAgIHsxOSwgMCwgMzQ3LCAyLCAzMTZ9LCAgIHsxOSwgMCwgMzQ5LCAyLCAzMTZ9LCAgICB7MTksIDAsIDM1MSwgNywgMzE3fSwKLSAgICB7MTksIDIsIDM1OCwgMTYsIDMxMn0sICB7MjEsIDAsIDM3NCwgMiwgMzIwfSwgICAgezIxLCAwLCAzNzYsIDIsIDMxNn0sCi0gICAgezIxLCAwLCAzNzgsIDAsIDMxNn0sICAgezIxLCAwLCAzNzgsIDIsIDMxNn0sICAgIHsyMSwgMCwgMzgwLCA2LCAzMTZ9LAotICAgIHsyMSwgMCwgMzg2LCAzLCAzMTZ9LCAgIHsyMSwgMCwgMzg5LCAyLCAzMTZ9LCAgICB7MjEsIDAsIDM5MSwgNCwgMzE2fSwKLSAgICB7MjEsIDAsIDM5NSwgMCwgMzE2fSwgICB7MjEsIDUsIDM5NSwgMzAsIDMxNn0sICAgezI2LCAwLCA0MjUsIDIsIDMyMH0sCi0gICAgezI2LCAwLCA0MjcsIDMsIDMxNn0sICAgezI2LCAwLCA0MzAsIDIsIDMyMH0sICAgIHsyNiwgMCwgNDMyLCA1LCAzMTZ9LAotICAgIHsyNiwgMCwgNDM3LCAyLCAzMTZ9LCAgIHsyNiwgMCwgNDM5LCAzLCAzMTZ9LCAgICB7MjYsIDAsIDQ0MiwgMiwgMzE2fSwKLSAgICB7MjYsIDAsIDQ0NCwgOCwgMzE2fSwgICB7MjYsIDAsIDQ1MiwgMSwgMzE2fSwgICAgezI2LCAwLCA0NTMsIDIsIDMxNn0sCi0gICAgezI2LCAwLCA0NTUsIDIsIDMxNn0sICAgezI2LCAwLCA0NTcsIDQsIDMxNn0sICAgIHsyNiwgMCwgNDYxLCAwLCAzMTZ9LAotICAgIHsyNiwgMCwgNDYxLCAyLCAzMTZ9LCAgIHsyNiwgMCwgNDYzLCAyLCAzMTZ9LCAgICB7MjYsIDAsIDQ2NSwgNiwgMzE4fSwKLSAgICB7MjYsIDUsIDQ3MSwgMzEsIDMxN30sICB7MzEsIDAsIDUwMiwgMiwgMzIwfSwgICAgezMxLCAwLCA1MDQsIDIsIDMxNn0sCi0gICAgezMxLCAwLCA1MDYsIDIsIDMxNn0sICAgezMxLCAwLCA1MDgsIDQsIDMyMH0sICAgIHszMSwgMTYsIDUxMiwgMTEsIDMxMn0sCi0gICAgezQ3LCAwLCA1MjMsIDIsIDMxNn0sICAgezQ3LCAwLCA1MjUsIDIsIDMxNn0sICAgIHs0NywgMCwgNTI3LCAyLCAzMTZ9LAotICAgIHs0NywgMCwgNTI5LCAyLCAzMTZ9LCAgIHs0NywgMCwgNTMxLCAzLCAzMTZ9LCAgICB7NDcsIDAsIDUzNCwgMiwgMzE2fSwKLSAgICB7NDcsIDAsIDUzNiwgMywgMzE2fSwgICB7NDcsIDAsIDUzOSwgMywgMzE2fSwgICAgezQ3LCAwLCA1NDIsIDQsIDMxOH0sCi0gICAgezQ3LCAwLCA1NDYsIDQsIDMxNn0sICAgezQ3LCAwLCA1NTAsIDIsIDMxNn0sICAgIHs0NywgMCwgNTUyLCAwLCAzMTZ9LAotICAgIHs0NywgMCwgNTUyLCAyLCAzMTZ9LCAgIHs0NywgMCwgNTU0LCAzLCAzMTZ9LCAgICB7NDcsIDAsIDU1NywgNiwgMzE2fSwKLSAgICB7NDcsIDAsIDU2MywgMiwgMzE2fSwgICB7NDcsIDAsIDU2NSwgMiwgMzE2fSwgICAgezQ3LCAwLCA1NjcsIDMsIDMxNn0sCi0gICAgezQ3LCAxOSwgNTcwLCAxLCAzMTJ9LCAgezY2LCAwLCA1NzEsIDIsIDMxNn0sICAgIHs2NiwgMCwgNTczLCA4LCAzMTZ9LAotICAgIHs2NiwgMCwgNTgxLCAyLCAzMTZ9LCAgIHs2NiwgMCwgNTgzLCA0LCAzMTZ9LCAgICB7NjYsIDAsIDU4NywgNSwgMzE2fSwKLSAgICB7NjYsIDAsIDU5MiwgMywgMzE2fSwgICB7NjYsIDAsIDU5NSwgMiwgMzIwfSwgICAgezY2LCAwLCA1OTcsIDMsIDMxNn0sCi0gICAgezY2LCAwLCA2MDAsIDcsIDMxNn0sICAgezY2LCAwLCA2MDcsIDMsIDMxNn0sICAgIHs2NiwgMCwgNjEwLCAwLCAzMTZ9LAotICAgIHs2NiwgMCwgNjEwLCA0LCAzMTd9LCAgIHs2NiwgMCwgNjE0LCA0LCAzMTh9LCAgICB7NjYsIDAsIDYxOCwgMiwgMzIwfSwKLSAgICB7NjYsIDAsIDYyMCwgNSwgMzE2fSwgICB7NjYsIDAsIDYyNSwgMiwgMzE2fSwgICAgezY2LCAwLCA2MjcsIDIsIDMxNn0sCi0gICAgezY2LCAwLCA2MjksIDIsIDMyMH0sICAgezY2LCAwLCA2MzEsIDIsIDMyMH0sICAgIHs2NiwgMCwgNjMzLCA0LCAzMTZ9LAotICAgIHs2NiwgMCwgNjM3LCAyLCAzMTZ9LCAgIHs2NiwgMCwgNjM5LCAxLCAzMTZ9LCAgICB7NjYsIDAsIDY0MCwgMSwgMzE2fSwKLSAgICB7NjYsIDAsIDY0MSwgNCwgMzE2fSwgICB7NjYsIDAsIDY0NSwgMywgMzE2fSwgICAgezY2LCA3LCA2NDgsIDIsIDMxOX0sCi0gICAgezczLCAwLCA2NTAsIDIsIDMxNn0sICAgezczLCAwLCA2NTIsIDIsIDMxNn0sICAgIHs3MywgMCwgNjU0LCAzLCAzMTZ9LAotICAgIHs3MywgNCwgNjU3LCA0LCAzMTJ9LCAgIHs3NywgMCwgNjYxLCAxMCwgMzE2fSwgICB7NzcsIDAsIDY3MSwgMiwgMzE2fSwKLSAgICB7NzcsIDAsIDY3MywgNCwgMzE2fSwgICB7NzcsIDAsIDY3NywgNCwgMzE2fSwgICAgezc3LCAwLCA2ODEsIDMsIDMxNn0sCi0gICAgezc3LCAwLCA2ODQsIDIsIDMxNn0sICAgezc3LCAwLCA2ODYsIDIsIDMxNn0sICAgIHs3NywgMCwgNjg4LCA4LCAzMTd9LAotICAgIHs3NywgMCwgNjk2LCAzLCAzMTZ9LCAgIHs3NywgMCwgNjk5LCAzLCAzMTZ9LCAgICB7NzcsIDAsIDcwMiwgMiwgMzE2fSwKLSAgICB7NzcsIDAsIDcwNCwgMiwgMzE2fSwgICB7NzcsIDAsIDcwNiwgNSwgMzE2fSwgICAgezc3LCAwLCA3MTEsIDQsIDMxNn0sCi0gICAgezc3LCAwLCA3MTUsIDIsIDMxNn0sICAgezc3LCAwLCA3MTcsIDgsIDMxOH0sICAgIHs3NywgMCwgNzI1LCAxLCAzMTZ9LAotICAgIHs3NywgMCwgNzI2LCAyLCAzMjB9LCAgIHs3NywgMCwgNzI4LCAzLCAzMTZ9LCAgICB7NzcsIDEsIDczMSwgNCwgMzE2fSwKLSAgICB7NzgsIDAsIDczNSwgNSwgMzE2fSwgICB7NzgsIDAsIDc0MCwgMywgMzE2fSwgICAgezc4LCAwLCA3NDMsIDEsIDMxNn0sCi0gICAgezc4LCAwLCA3NDQsIDIsIDMyMH0sICAgezc4LCAwLCA3NDYsIDAsIDMxM30sICAgIHs3OCwgMCwgNzQ2LCAyLCAzMTZ9LAotICAgIHs3OCwgNSwgNzQ4LCAzLCAzMTZ9LCAgIHs4MywgMCwgNzUxLCA1LCAzMTZ9LCAgICB7ODMsIDAsIDc1NiwgNywgMzE2fSwKLSAgICB7ODMsIDAsIDc2MywgNiwgMzE2fSwgICB7ODMsIDAsIDc2OSwgMywgMzE2fSwgICAgezgzLCAwLCA3NzIsIDIsIDMxNn0sCi0gICAgezgzLCAwLCA3NzQsIDUsIDMxNn0sICAgezgzLCAwLCA3NzksIDIsIDMxNn0sICAgIHs4MywgMCwgNzgxLCAwLCAzMTR9LAotICAgIHs4MywgMCwgNzgxLCAyLCAzMTZ9LCAgIHs4MywgMCwgNzgzLCAxLCAzMTZ9LCAgICB7ODMsIDAsIDc4NCwgMiwgMzE2fSwKLSAgICB7ODMsIDAsIDc4NiwgNSwgMzE2fSwgICB7ODMsIDAsIDc5MSwgMiwgMzE2fSwgICAgezgzLCAwLCA3OTMsIDEsIDMxNn0sCi0gICAgezgzLCAwLCA3OTQsIDIsIDMxNn0sICAgezgzLCAwLCA3OTYsIDIsIDMxNn0sICAgIHs4MywgMCwgNzk4LCA2LCAzMTZ9LAotICAgIHs4MywgMCwgODA0LCAyLCAzMTZ9LCAgIHs4MywgMCwgODA2LCAyLCAzMjB9LCAgICB7ODMsIDAsIDgwOCwgMywgMzE2fSwKLSAgICB7ODMsIDAsIDgxMSwgNCwgMzE2fSwgICB7ODMsIDAsIDgxNSwgMiwgMzE2fSwgICAgezgzLCAwLCA4MTcsIDIsIDMxNn0sCi0gICAgezgzLCAwLCA4MTksIDIsIDMxNn0sICAgezgzLCAwLCA4MjEsIDIsIDMxNn0sICAgIHs4MywgMCwgODIzLCAyLCAzMTZ9LAotICAgIHs4MywgMCwgODI1LCAyLCAzMTZ9LCAgIHs4MywgMCwgODI3LCA0LCAzMTh9LCAgICB7ODMsIDEsIDgzMSwgMiwgMzE2fSwKLSAgICB7ODQsIDAsIDgzMywgNSwgMzE2fSwgICB7ODQsIDAsIDgzOCwgMjAsIDMxN30sICAgezg0LCAwLCA4NTgsIDIsIDMxNn0sCi0gICAgezg0LCAwLCA4NjAsIDAsIDMxNn0sICAgezg0LCAwLCA4NjAsIDIsIDMxNn0sICAgIHs4NCwgMCwgODYyLCA0LCAzMjB9LAotICAgIHs4NCwgMCwgODY2LCAwLCAzMTZ9LCAgIHs4NCwgMCwgODY2LCAyLCAzMTZ9LCAgICB7ODQsIDAsIDg2OCwgMSwgMzE2fSwKLSAgICB7ODQsIDAsIDg2OSwgMiwgMzE2fSwgICB7ODQsIDAsIDg3MSwgMywgMzE2fSwgICAgezg0LCAwLCA4NzQsIDIsIDMxNn0sCi0gICAgezg0LCAwLCA4NzYsIDIsIDMxNn0sICAgezg0LCAwLCA4NzgsIDQsIDMxNn0sICAgIHs4NCwgMCwgODgyLCAzLCAzMTZ9LAotICAgIHs4NCwgMCwgODg1LCAxNywgMzE2fSwgIHs4NCwgNiwgOTAyLCAxLCAzMTl9LCAgICB7OTAsIDAsIDkwMywgMiwgMzE2fSwKLSAgICB7OTAsIDAsIDkwNSwgMiwgMzIwfSwgICB7OTAsIDAsIDkwNywgMiwgMzIwfSwgICAgezkwLCAwLCA5MDksIDIsIDMxNn0sCi0gICAgezkwLCAwLCA5MTEsIDIsIDMxNn0sICAgezkwLCAwLCA5MTMsIDQsIDMxOH0sICAgIHs5MCwgMCwgOTE3LCAyLCAzMTZ9LAotICAgIHs5MCwgNSwgOTE5LCAwLCAzMTJ9LCAgIHs5NSwgMCwgOTE5LCAyLCAzMTZ9LCAgICB7OTUsIDAsIDkyMSwgNCwgMzE2fSwKLSAgICB7OTUsIDAsIDkyNSwgNCwgMzE2fSwgICB7OTUsIDAsIDkyOSwgNiwgMzE2fSwgICAgezk1LCAwLCA5MzUsIDIsIDMxNn0sCi0gICAgezk1LCAwLCA5MzcsIDQsIDMxNn0sICAgezk1LCAwLCA5NDEsIDMsIDMxNn0sICAgIHs5NSwgMCwgOTQ0LCAzLCAzMTZ9LAotICAgIHs5NSwgMCwgOTQ3LCAyLCAzMTZ9LCAgIHs5NSwgMCwgOTQ5LCAzLCAzMTZ9LCAgICB7OTUsIDAsIDk1MiwgMCwgMzE2fSwKLSAgICB7OTUsIDAsIDk1MiwgMCwgMzE2fSwgICB7OTUsIDAsIDk1MiwgMiwgMzE2fSwgICAgezk1LCAwLCA5NTQsIDcsIDMxNn0sCi0gICAgezk1LCAwLCA5NjEsIDIsIDMxNn0sICAgezk1LCAwLCA5NjMsIDAsIDMxOX0sICAgIHs5NSwgMCwgOTYzLCA3LCAzMTZ9LAotICAgIHs5NSwgMCwgOTcwLCAyLCAzMTZ9LCAgIHs5NSwgMCwgOTcyLCAyLCAzMTZ9LCAgICB7OTUsIDMsIDk3NCwgMSwgMzE2fSwKLSAgICB7OTgsIDAsIDk3NSwgMiwgMzIwfSwgICB7OTgsIDAsIDk3NywgNCwgMzE2fSwgICAgezk4LCAwLCA5ODEsIDAsIDMxNn0sCi0gICAgezk4LCAwLCA5ODEsIDIsIDMxNn0sICAgezk4LCAwLCA5ODMsIDIsIDMxNn0sICAgIHs5OCwgMCwgOTg1LCA0LCAzMTZ9LAotICAgIHs5OCwgMCwgOTg5LCAxLCAzMTZ9LCAgIHs5OCwgMCwgOTkwLCAyLCAzMTZ9LCAgICB7OTgsIDAsIDk5MiwgMiwgMzE2fSwKLSAgICB7OTgsIDAsIDk5NCwgMywgMzE2fSwgICB7OTgsIDAsIDk5NywgMiwgMzE3fSwgICAgezk4LCAwLCA5OTksIDAsIDMxNn0sCi0gICAgezk4LCAwLCA5OTksIDQsIDMxNn0sICAgezk4LCAwLCAxMDAzLCA0LCAzMTZ9LCAgIHs5OCwgMCwgMTAwNywgMiwgMzE2fSwKLSAgICB7OTgsIDAsIDEwMDksIDMsIDMxNn0sICB7OTgsIDAsIDEwMTIsIDQsIDMxNn0sICAgezk4LCAwLCAxMDE2LCA3LCAzMTZ9LAotICAgIHs5OCwgMCwgMTAyMywgNCwgMzE2fSwgIHs5OCwgMCwgMTAyNywgMSwgMzEzfSwgICB7OTgsIDE3LCAxMDI4LCAzLCAzMTZ9LAotICAgIHsxMTUsIDAsIDEwMzEsIDUsIDMxNn0sIHsxMTUsIDAsIDEwMzYsIDIsIDMxNn0sICB7MTE1LCAwLCAxMDM4LCAxLCAzMTZ9LAotICAgIHsxMTUsIDAsIDEwMzksIDQsIDMxNn0sIHsxMTUsIDAsIDEwNDMsIDIsIDMxNn0sICB7MTE1LCAwLCAxMDQ1LCAyLCAzMTZ9LAotICAgIHsxMTUsIDAsIDEwNDcsIDEsIDMxNn0sIHsxMTUsIDAsIDEwNDgsIDIsIDMxNn0sICB7MTE1LCAwLCAxMDUwLCA1LCAzMTZ9LAotICAgIHsxMTUsIDAsIDEwNTUsIDEsIC0xfSwgIHsxMTUsIDQsIDEwNTYsIDEsIDMxMn0sICB7MTE5LCAxLCAxMDU3LCAwLCAzMTN9LAotICAgIHsxMjAsIDIsIDEwNTcsIDgsIDMxMn0sIHsxMjIsIDExLCAxMDY1LCA2LCAzMTV9LCB7MTMzLCAyLCAxMDcxLCAwLCAzMTZ9LAotICAgIHsxMzUsIDAsIDEwNzEsIDAsIDMxNn0sIHsxMzUsIDMsIDEwNzEsIDIsIDMxNn0sICB7MTM4LCAwLCAxMDczLCAyLCAzMTZ9LAorICAgIHsvKiBwcyAqLyAwLCAyLCAzMTZ9LAorICAgIHsvKiB0byAqLyAyLCAyLCAzMTZ9LAorICAgIHsvKiB1aSAqLyA0LCAyLCAzMTZ9LAorICAgIHsvKiByZWNvcmRTZXQgKi8gNiwgOCwgMzE2fSwKKyAgICB7Lyogc3Vic2V0QmVsb3cgKi8gMTQsIDQsIDMxNn0sCisgICAgey8qIHN1YmZvcm1TZXQgKi8gMTgsIDUsIDMxN30sCisgICAgey8qIGFkb2JlRXh0ZW5zaW9uTGV2ZWwgKi8gMjMsIDIsIDMxNn0sCisgICAgey8qIHR5cGVmYWNlICovIDI1LCAxLCAzMTZ9LAorICAgIHsvKiBicmVhayAqLyAyNiwgMTIsIDMxNn0sCisgICAgey8qIGZvbnRJbmZvICovIDM4LCAyLCAzMTZ9LAorICAgIHsvKiBudW1iZXJQYXR0ZXJuICovIDQwLCAxLCAzMTZ9LAorICAgIHsvKiBkeW5hbWljUmVuZGVyICovIDQxLCAzLCAzMTZ9LAorICAgIHsvKiBwcmludFNjYWxpbmcgKi8gNDQsIDIsIDMxNn0sCisgICAgey8qIGNoZWNrQnV0dG9uICovIDQ2LCA2LCAzMTZ9LAorICAgIHsvKiBkYXRlUGF0dGVybnMgKi8gNTIsIDAsIDMxNn0sCisgICAgey8qIHNvdXJjZVNldCAqLyA1MiwgMiwgMzE5fSwKKyAgICB7LyogYW1kICovIDU0LCAyLCAzMTZ9LAorICAgIHsvKiBhcmMgKi8gNTYsIDYsIDMxNn0sCisgICAgey8qIGRheSAqLyA2MiwgMCwgMzE2fSwKKyAgICB7LyogZXJhICovIDYyLCAwLCAzMTZ9LAorICAgIHsvKiBqb2cgKi8gNjIsIDIsIDMxNn0sCisgICAgey8qIGxvZyAqLyA2NCwgMiwgMzE2fSwKKyAgICB7LyogbWFwICovIDY2LCA2LCAzMTZ9LAorICAgIHsvKiBtZHAgKi8gNzIsIDQsIDMxNn0sCisgICAgey8qIGJyZWFrQmVmb3JlICovIDc2LCA3LCAzMTZ9LAorICAgIHsvKiBvaWQgKi8gODMsIDIsIDMyMH0sCisgICAgey8qIHBjbCAqLyA4NSwgMywgMzE2fSwKKyAgICB7LyogcGRmICovIDg4LCAzLCAzMTZ9LAorICAgIHsvKiByZWYgKi8gOTEsIDIsIDMyMH0sCisgICAgey8qIHVyaSAqLyA5MywgNiwgMzIwfSwKKyAgICB7LyogeGRjICovIDk5LCA0LCAzMTZ9LAorICAgIHsvKiB4ZHAgKi8gMTAzLCAyLCAzMTZ9LAorICAgIHsvKiB4ZmEgKi8gMTA1LCAzLCAzMTl9LAorICAgIHsvKiB4c2wgKi8gMTA4LCA0LCAzMTZ9LAorICAgIHsvKiB6cGwgKi8gMTEyLCAzLCAzMTZ9LAorICAgIHsvKiBjYWNoZSAqLyAxMTUsIDIsIDMxNn0sCisgICAgey8qIG1hcmdpbiAqLyAxMTcsIDYsIDMxNn0sCisgICAgey8qIGtleVVzYWdlICovIDEyMywgMTIsIDMxNn0sCisgICAgey8qIGV4Y2x1ZGUgKi8gMTM1LCAyLCAzMTZ9LAorICAgIHsvKiBjaG9pY2VMaXN0ICovIDEzNywgNSwgMzE2fSwKKyAgICB7LyogbGV2ZWwgKi8gMTQyLCAyLCAzMTZ9LAorICAgIHsvKiBsYWJlbFByaW50ZXIgKi8gMTQ0LCAzLCAzMTZ9LAorICAgIHsvKiBjYWxlbmRhclN5bWJvbHMgKi8gMTQ3LCAxLCAzMTZ9LAorICAgIHsvKiBwYXJhICovIDE0OCwgMTQsIDMxNn0sCisgICAgey8qIHBhcnQgKi8gMTYyLCAyLCAzMTZ9LAorICAgIHsvKiBwZGZhICovIDE2NCwgMiwgMzE2fSwKKyAgICB7LyogZmlsdGVyICovIDE2NiwgMywgMzE2fSwKKyAgICB7LyogcHJlc2VudCAqLyAxNjksIDIsIDMxNn0sCisgICAgey8qIHBhZ2luYXRpb24gKi8gMTcxLCAyLCAzMTZ9LAorICAgIHsvKiBlbmNvZGluZyAqLyAxNzMsIDIsIDMxNn0sCisgICAgey8qIGV2ZW50ICovIDE3NSwgNCwgMzE2fSwKKyAgICB7Lyogd2hpdGVzcGFjZSAqLyAxNzksIDIsIDMxNn0sCisgICAgey8qIGRlZmF1bHRVaSAqLyAxODEsIDIsIDMxNn0sCisgICAgey8qIGRhdGFNb2RlbCAqLyAxODMsIDAsIDMxOX0sCisgICAgey8qIGJhcmNvZGUgKi8gMTgzLCAyMCwgMzE2fSwKKyAgICB7LyogdGltZVBhdHRlcm4gKi8gMjAzLCAxLCAzMTZ9LAorICAgIHsvKiBiYXRjaE91dHB1dCAqLyAyMDQsIDMsIDMxNn0sCisgICAgey8qIGVuZm9yY2UgKi8gMjA3LCAyLCAzMTZ9LAorICAgIHsvKiBjdXJyZW5jeVN5bWJvbHMgKi8gMjA5LCAwLCAzMTZ9LAorICAgIHsvKiBhZGRTaWxlbnRQcmludCAqLyAyMDksIDIsIDMxNn0sCisgICAgey8qIHJlbmFtZSAqLyAyMTEsIDIsIDMxNn0sCisgICAgey8qIG9wZXJhdGlvbiAqLyAyMTMsIDQsIDMyMH0sCisgICAgey8qIHR5cGVmYWNlcyAqLyAyMTcsIDAsIDMxNn0sCisgICAgey8qIHN1YmplY3RETnMgKi8gMjE3LCAxLCAzMTZ9LAorICAgIHsvKiBpc3N1ZXJzICovIDIxOCwgMywgMzE2fSwKKyAgICB7Lyogc2lnbmF0dXJlUHNldWRvTW9kZWwgKi8gMjIxLCAwLCAzMTJ9LAorICAgIHsvKiB3c2RsQ29ubmVjdGlvbiAqLyAyMjEsIDEsIDMxNn0sCisgICAgey8qIGRlYnVnICovIDIyMiwgMiwgMzE2fSwKKyAgICB7LyogZGVsdGEgKi8gMjI0LCAzLCAtMX0sCisgICAgey8qIGVyYU5hbWVzICovIDIyNywgMCwgMzE2fSwKKyAgICB7LyogbW9kaWZ5QW5ub3RzICovIDIyNywgMiwgMzE2fSwKKyAgICB7Lyogc3RhcnROb2RlICovIDIyOSwgMiwgMzE2fSwKKyAgICB7LyogYnV0dG9uICovIDIzMSwgMywgMzE2fSwKKyAgICB7LyogZm9ybWF0ICovIDIzNCwgMiwgMzE2fSwKKyAgICB7LyogYm9yZGVyICovIDIzNiwgNiwgMzE2fSwKKyAgICB7LyogYXJlYSAqLyAyNDIsIDEwLCAzMTd9LAorICAgIHsvKiBoeXBoZW5hdGlvbiAqLyAyNTIsIDksIDMxNn0sCisgICAgey8qIHRleHQgKi8gMjYxLCA1LCAzMTh9LAorICAgIHsvKiB0aW1lICovIDI2NiwgNCwgMzE4fSwKKyAgICB7LyogdHlwZSAqLyAyNzAsIDIsIDMxNn0sCisgICAgey8qIG92ZXJwcmludCAqLyAyNzIsIDIsIDMxNn0sCisgICAgey8qIGNlcnRpZmljYXRlcyAqLyAyNzQsIDUsIDMxNn0sCisgICAgey8qIGVuY3J5cHRpb25NZXRob2RzICovIDI3OSwgMywgMzE2fSwKKyAgICB7Lyogc2V0UHJvcGVydHkgKi8gMjgyLCAyLCAzMTZ9LAorICAgIHsvKiBwcmludGVyTmFtZSAqLyAyODQsIDIsIDMxNn0sCisgICAgey8qIHN0YXJ0UGFnZSAqLyAyODYsIDIsIDMxNn0sCisgICAgey8qIHBhZ2VPZmZzZXQgKi8gMjg4LCAyLCAzMTZ9LAorICAgIHsvKiBkYXRlVGltZSAqLyAyOTAsIDQsIDMxNn0sCisgICAgey8qIGNvbWIgKi8gMjk0LCAzLCAzMTZ9LAorICAgIHsvKiBwYXR0ZXJuICovIDI5NywgMywgMzE2fSwKKyAgICB7LyogaWZFbXB0eSAqLyAzMDAsIDIsIDMxNn0sCisgICAgey8qIHN1cHByZXNzQmFubmVyICovIDMwMiwgMiwgMzE2fSwKKyAgICB7Lyogb3V0cHV0QmluICovIDMwNCwgMiwgMzE2fSwKKyAgICB7LyogZmllbGQgKi8gMzA2LCAzNiwgMzE3fSwKKyAgICB7LyogYWdlbnQgKi8gMzQyLCAzLCAzMTZ9LAorICAgIHsvKiBvdXRwdXRYU0wgKi8gMzQ1LCAyLCAzMTZ9LAorICAgIHsvKiBhZGp1c3REYXRhICovIDM0NywgMiwgMzE2fSwKKyAgICB7LyogYXV0b1NhdmUgKi8gMzQ5LCAyLCAzMTZ9LAorICAgIHsvKiBjb250ZW50QXJlYSAqLyAzNTEsIDcsIDMxN30sCisgICAgey8qIGV2ZW50UHNldWRvTW9kZWwgKi8gMzU4LCAxNiwgMzEyfSwKKyAgICB7Lyogd3NkbEFkZHJlc3MgKi8gMzc0LCAyLCAzMjB9LAorICAgIHsvKiBzb2xpZCAqLyAzNzYsIDIsIDMxNn0sCisgICAgey8qIGRhdGVUaW1lU3ltYm9scyAqLyAzNzgsIDAsIDMxNn0sCisgICAgey8qIGVuY3J5cHRpb25MZXZlbCAqLyAzNzgsIDIsIDMxNn0sCisgICAgey8qIGVkZ2UgKi8gMzgwLCA2LCAzMTZ9LAorICAgIHsvKiBzdGlwcGxlICovIDM4NiwgMywgMzE2fSwKKyAgICB7LyogYXR0cmlidXRlcyAqLyAzODksIDIsIDMxNn0sCisgICAgey8qIHZlcnNpb25Db250cm9sICovIDM5MSwgNCwgMzE2fSwKKyAgICB7LyogbWVyaWRpZW0gKi8gMzk1LCAwLCAzMTZ9LAorICAgIHsvKiBleGNsR3JvdXAgKi8gMzk1LCAzMCwgMzE2fSwKKyAgICB7LyogdG9vbFRpcCAqLyA0MjUsIDIsIDMyMH0sCisgICAgey8qIGNvbXByZXNzICovIDQyNywgMywgMzE2fSwKKyAgICB7LyogcmVhc29uICovIDQzMCwgMiwgMzIwfSwKKyAgICB7LyogZXhlY3V0ZSAqLyA0MzIsIDUsIDMxNn0sCisgICAgey8qIGNvbnRlbnRDb3B5ICovIDQzNywgMiwgMzE2fSwKKyAgICB7LyogZGF0ZVRpbWVFZGl0ICovIDQzOSwgMywgMzE2fSwKKyAgICB7LyogY29uZmlnICovIDQ0MiwgMiwgMzE2fSwKKyAgICB7LyogaW1hZ2UgKi8gNDQ0LCA4LCAzMTZ9LAorICAgIHsvKiAjeEhUTUwgKi8gNDUyLCAxLCAzMTZ9LAorICAgIHsvKiBudW1iZXJPZkNvcGllcyAqLyA0NTMsIDIsIDMxNn0sCisgICAgey8qIGJlaGF2aW9yT3ZlcnJpZGUgKi8gNDU1LCAyLCAzMTZ9LAorICAgIHsvKiB0aW1lU3RhbXAgKi8gNDU3LCA0LCAzMTZ9LAorICAgIHsvKiBtb250aCAqLyA0NjEsIDAsIDMxNn0sCisgICAgey8qIHZpZXdlclByZWZlcmVuY2VzICovIDQ2MSwgMiwgMzE2fSwKKyAgICB7Lyogc2NyaXB0TW9kZWwgKi8gNDYzLCAyLCAzMTZ9LAorICAgIHsvKiBkZWNpbWFsICovIDQ2NSwgNiwgMzE4fSwKKyAgICB7Lyogc3ViZm9ybSAqLyA0NzEsIDMxLCAzMTd9LAorICAgIHsvKiBzZWxlY3QgKi8gNTAyLCAyLCAzMjB9LAorICAgIHsvKiB3aW5kb3cgKi8gNTA0LCAyLCAzMTZ9LAorICAgIHsvKiBsb2NhbGVTZXQgKi8gNTA2LCAyLCAzMTZ9LAorICAgIHsvKiBoYW5kbGVyICovIDUwOCwgNCwgMzIwfSwKKyAgICB7LyogaG9zdFBzZXVkb01vZGVsICovIDUxMiwgMTEsIDMxMn0sCisgICAgey8qIHByZXNlbmNlICovIDUyMywgMiwgMzE2fSwKKyAgICB7LyogcmVjb3JkICovIDUyNSwgMiwgMzE2fSwKKyAgICB7LyogZW1iZWQgKi8gNTI3LCAyLCAzMTZ9LAorICAgIHsvKiB2ZXJzaW9uICovIDUyOSwgMiwgMzE2fSwKKyAgICB7LyogY29tbWFuZCAqLyA1MzEsIDMsIDMxNn0sCisgICAgey8qIGNvcGllcyAqLyA1MzQsIDIsIDMxNn0sCisgICAgey8qIHN0YXBsZSAqLyA1MzYsIDMsIDMxNn0sCisgICAgey8qIHN1Ym1pdEZvcm1hdCAqLyA1MzksIDMsIDMxNn0sCisgICAgey8qIGJvb2xlYW4gKi8gNTQyLCA0LCAzMTh9LAorICAgIHsvKiBtZXNzYWdlICovIDU0NiwgNCwgMzE2fSwKKyAgICB7Lyogb3V0cHV0ICovIDU1MCwgMiwgMzE2fSwKKyAgICB7LyogcHNNYXAgKi8gNTUyLCAwLCAzMTZ9LAorICAgIHsvKiBleGNsdWRlTlMgKi8gNTUyLCAyLCAzMTZ9LAorICAgIHsvKiBhc3Npc3QgKi8gNTU0LCAzLCAzMTZ9LAorICAgIHsvKiBwaWN0dXJlICovIDU1NywgNiwgMzE2fSwKKyAgICB7LyogdHJhdmVyc2FsICovIDU2MywgMiwgMzE2fSwKKyAgICB7Lyogc2lsZW50UHJpbnQgKi8gNTY1LCAyLCAzMTZ9LAorICAgIHsvKiB3ZWJDbGllbnQgKi8gNTY3LCAzLCAzMTZ9LAorICAgIHsvKiBsYXlvdXRQc2V1ZG9Nb2RlbCAqLyA1NzAsIDEsIDMxMn0sCisgICAgey8qIHByb2R1Y2VyICovIDU3MSwgMiwgMzE2fSwKKyAgICB7LyogY29ybmVyICovIDU3MywgOCwgMzE2fSwKKyAgICB7LyogbXNnSWQgKi8gNTgxLCAyLCAzMTZ9LAorICAgIHsvKiBjb2xvciAqLyA1ODMsIDQsIDMxNn0sCisgICAgey8qIGtlZXAgKi8gNTg3LCA1LCAzMTZ9LAorICAgIHsvKiBxdWVyeSAqLyA1OTIsIDMsIDMxNn0sCisgICAgey8qIGluc2VydCAqLyA1OTUsIDIsIDMyMH0sCisgICAgey8qIGltYWdlRWRpdCAqLyA1OTcsIDMsIDMxNn0sCisgICAgey8qIHZhbGlkYXRlICovIDYwMCwgNywgMzE2fSwKKyAgICB7LyogZGlnZXN0TWV0aG9kcyAqLyA2MDcsIDMsIDMxNn0sCisgICAgey8qIG51bWJlclBhdHRlcm5zICovIDYxMCwgMCwgMzE2fSwKKyAgICB7LyogcGFnZVNldCAqLyA2MTAsIDQsIDMxN30sCisgICAgey8qIGludGVnZXIgKi8gNjE0LCA0LCAzMTh9LAorICAgIHsvKiBzb2FwQWRkcmVzcyAqLyA2MTgsIDIsIDMyMH0sCisgICAgey8qIGVxdWF0ZSAqLyA2MjAsIDUsIDMxNn0sCisgICAgey8qIGZvcm1GaWVsZEZpbGxpbmcgKi8gNjI1LCAyLCAzMTZ9LAorICAgIHsvKiBwYWdlUmFuZ2UgKi8gNjI3LCAyLCAzMTZ9LAorICAgIHsvKiB1cGRhdGUgKi8gNjI5LCAyLCAzMjB9LAorICAgIHsvKiBjb25uZWN0U3RyaW5nICovIDYzMSwgMiwgMzIwfSwKKyAgICB7LyogbW9kZSAqLyA2MzMsIDQsIDMxNn0sCisgICAgey8qIGxheW91dCAqLyA2MzcsIDIsIDMxNn0sCisgICAgey8qICN4bWwgKi8gNjM5LCAxLCAzMTZ9LAorICAgIHsvKiB4c2RDb25uZWN0aW9uICovIDY0MCwgMSwgMzE2fSwKKyAgICB7LyogdHJhdmVyc2UgKi8gNjQxLCA0LCAzMTZ9LAorICAgIHsvKiBlbmNvZGluZ3MgKi8gNjQ1LCAzLCAzMTZ9LAorICAgIHsvKiB0ZW1wbGF0ZSAqLyA2NDgsIDIsIDMxOX0sCisgICAgey8qIGFjcm9iYXQgKi8gNjUwLCAyLCAzMTZ9LAorICAgIHsvKiB2YWxpZGF0aW9uTWVzc2FnaW5nICovIDY1MiwgMiwgMzE2fSwKKyAgICB7Lyogc2lnbmluZyAqLyA2NTQsIDMsIDMxNn0sCisgICAgey8qIGRhdGFXaW5kb3cgKi8gNjU3LCA0LCAzMTJ9LAorICAgIHsvKiBzY3JpcHQgKi8gNjYxLCAxMCwgMzE2fSwKKyAgICB7LyogYWRkVmlld2VyUHJlZmVyZW5jZXMgKi8gNjcxLCAyLCAzMTZ9LAorICAgIHsvKiBhbHdheXNFbWJlZCAqLyA2NzMsIDQsIDMxNn0sCisgICAgey8qIHBhc3N3b3JkRWRpdCAqLyA2NzcsIDQsIDMxNn0sCisgICAgey8qIG51bWVyaWNFZGl0ICovIDY4MSwgMywgMzE2fSwKKyAgICB7LyogZW5jcnlwdGlvbk1ldGhvZCAqLyA2ODQsIDIsIDMxNn0sCisgICAgey8qIGNoYW5nZSAqLyA2ODYsIDIsIDMxNn0sCisgICAgey8qIHBhZ2VBcmVhICovIDY4OCwgOCwgMzE3fSwKKyAgICB7Lyogc3VibWl0VXJsICovIDY5NiwgMywgMzE2fSwKKyAgICB7Lyogb2lkcyAqLyA2OTksIDMsIDMxNn0sCisgICAgey8qIHNpZ25hdHVyZSAqLyA3MDIsIDIsIDMxNn0sCisgICAgey8qIEFEQkVfSlNDb25zb2xlICovIDcwNCwgMiwgMzE2fSwKKyAgICB7LyogY2FwdGlvbiAqLyA3MDYsIDUsIDMxNn0sCisgICAgey8qIHJlbGV2YW50ICovIDcxMSwgNCwgMzE2fSwKKyAgICB7LyogZmxpcExhYmVsICovIDcxNSwgMiwgMzE2fSwKKyAgICB7LyogZXhEYXRhICovIDcxNywgOCwgMzE4fSwKKyAgICB7LyogZGF5TmFtZXMgKi8gNzI1LCAxLCAzMTZ9LAorICAgIHsvKiBzb2FwQWN0aW9uICovIDcyNiwgMiwgMzIwfSwKKyAgICB7LyogZGVmYXVsdFR5cGVmYWNlICovIDcyOCwgMywgMzE2fSwKKyAgICB7LyogbWFuaWZlc3QgKi8gNzMxLCA0LCAzMTZ9LAorICAgIHsvKiBvdmVyZmxvdyAqLyA3MzUsIDUsIDMxNn0sCisgICAgey8qIGxpbmVhciAqLyA3NDAsIDMsIDMxNn0sCisgICAgey8qIGN1cnJlbmN5U3ltYm9sICovIDc0MywgMSwgMzE2fSwKKyAgICB7LyogZGVsZXRlICovIDc0NCwgMiwgMzIwfSwKKyAgICB7LyogZGVsdGFzICovIDc0NiwgMCwgMzEzfSwKKyAgICB7LyogZGlnZXN0TWV0aG9kICovIDc0NiwgMiwgMzE2fSwKKyAgICB7LyogaW5zdGFuY2VNYW5hZ2VyICovIDc0OCwgMywgMzE2fSwKKyAgICB7LyogZXF1YXRlUmFuZ2UgKi8gNzUxLCA1LCAzMTZ9LAorICAgIHsvKiBtZWRpdW0gKi8gNzU2LCA3LCAzMTZ9LAorICAgIHsvKiB0ZXh0RWRpdCAqLyA3NjMsIDYsIDMxNn0sCisgICAgey8qIHRlbXBsYXRlQ2FjaGUgKi8gNzY5LCAzLCAzMTZ9LAorICAgIHsvKiBjb21wcmVzc09iamVjdFN0cmVhbSAqLyA3NzIsIDIsIDMxNn0sCisgICAgey8qIGRhdGFWYWx1ZSAqLyA3NzQsIDUsIDMxNn0sCisgICAgey8qIGFjY2Vzc2libGVDb250ZW50ICovIDc3OSwgMiwgMzE2fSwKKyAgICB7Lyogbm9kZUxpc3QgKi8gNzgxLCAwLCAzMTR9LAorICAgIHsvKiBpbmNsdWRlWERQQ29udGVudCAqLyA3ODEsIDIsIDMxNn0sCisgICAgey8qIHhtbENvbm5lY3Rpb24gKi8gNzgzLCAxLCAzMTZ9LAorICAgIHsvKiB2YWxpZGF0ZUFwcHJvdmFsU2lnbmF0dXJlcyAqLyA3ODQsIDIsIDMxNn0sCisgICAgey8qIHNpZ25EYXRhICovIDc4NiwgNSwgMzE2fSwKKyAgICB7LyogcGFja2V0cyAqLyA3OTEsIDIsIDMxNn0sCisgICAgey8qIGRhdGVQYXR0ZXJuICovIDc5MywgMSwgMzE2fSwKKyAgICB7LyogZHVwbGV4T3B0aW9uICovIDc5NCwgMiwgMzE2fSwKKyAgICB7LyogYmFzZSAqLyA3OTYsIDIsIDMxNn0sCisgICAgey8qIGJpbmQgKi8gNzk4LCA2LCAzMTZ9LAorICAgIHsvKiBjb21wcmVzc2lvbiAqLyA4MDQsIDIsIDMxNn0sCisgICAgey8qIHVzZXIgKi8gODA2LCAyLCAzMjB9LAorICAgIHsvKiByZWN0YW5nbGUgKi8gODA4LCAzLCAzMTZ9LAorICAgIHsvKiBlZmZlY3RpdmVPdXRwdXRQb2xpY3kgKi8gODExLCA0LCAzMTZ9LAorICAgIHsvKiBBREJFX0pTRGVidWdnZXIgKi8gODE1LCAyLCAzMTZ9LAorICAgIHsvKiBhY3JvYmF0NyAqLyA4MTcsIDIsIDMxNn0sCisgICAgey8qIGludGVyYWN0aXZlICovIDgxOSwgMiwgMzE2fSwKKyAgICB7LyogbG9jYWxlICovIDgyMSwgMiwgMzE2fSwKKyAgICB7LyogY3VycmVudFBhZ2UgKi8gODIzLCAyLCAzMTZ9LAorICAgIHsvKiBkYXRhICovIDgyNSwgMiwgMzE2fSwKKyAgICB7LyogZGF0ZSAqLyA4MjcsIDQsIDMxOH0sCisgICAgey8qIGRlc2MgKi8gODMxLCAyLCAzMTZ9LAorICAgIHsvKiBlbmNyeXB0ICovIDgzMywgNSwgMzE2fSwKKyAgICB7LyogZHJhdyAqLyA4MzgsIDIwLCAzMTd9LAorICAgIHsvKiBlbmNyeXB0aW9uICovIDg1OCwgMiwgMzE2fSwKKyAgICB7LyogbWVyaWRpZW1OYW1lcyAqLyA4NjAsIDAsIDMxNn0sCisgICAgey8qIG1lc3NhZ2luZyAqLyA4NjAsIDIsIDMxNn0sCisgICAgey8qIHNwZWFrICovIDg2MiwgNCwgMzIwfSwKKyAgICB7LyogZGF0YUdyb3VwICovIDg2NiwgMCwgMzE2fSwKKyAgICB7LyogY29tbW9uICovIDg2NiwgMiwgMzE2fSwKKyAgICB7LyogI3RleHQgKi8gODY4LCAxLCAzMTZ9LAorICAgIHsvKiBwYWdpbmF0aW9uT3ZlcnJpZGUgKi8gODY5LCAyLCAzMTZ9LAorICAgIHsvKiByZWFzb25zICovIDg3MSwgMywgMzE2fSwKKyAgICB7Lyogc2lnbmF0dXJlUHJvcGVydGllcyAqLyA4NzQsIDIsIDMxNn0sCisgICAgey8qIHRocmVzaG9sZCAqLyA4NzYsIDIsIDMxNn0sCisgICAgey8qIGFwcGVhcmFuY2VGaWx0ZXIgKi8gODc4LCA0LCAzMTZ9LAorICAgIHsvKiBmaWxsICovIDg4MiwgMywgMzE2fSwKKyAgICB7LyogZm9udCAqLyA4ODUsIDE3LCAzMTZ9LAorICAgIHsvKiBmb3JtICovIDkwMiwgMSwgMzE5fSwKKyAgICB7LyogbWVkaXVtSW5mbyAqLyA5MDMsIDIsIDMxNn0sCisgICAgey8qIGNlcnRpZmljYXRlICovIDkwNSwgMiwgMzIwfSwKKyAgICB7LyogcGFzc3dvcmQgKi8gOTA3LCAyLCAzMjB9LAorICAgIHsvKiBydW5TY3JpcHRzICovIDkwOSwgMiwgMzE2fSwKKyAgICB7LyogdHJhY2UgKi8gOTExLCAyLCAzMTZ9LAorICAgIHsvKiBmbG9hdCAqLyA5MTMsIDQsIDMxOH0sCisgICAgey8qIHJlbmRlclBvbGljeSAqLyA5MTcsIDIsIDMxNn0sCisgICAgey8qIGxvZ1BzZXVkb01vZGVsICovIDkxOSwgMCwgMzEyfSwKKyAgICB7LyogZGVzdGluYXRpb24gKi8gOTE5LCAyLCAzMTZ9LAorICAgIHsvKiB2YWx1ZSAqLyA5MjEsIDQsIDMxNn0sCisgICAgey8qIGJvb2tlbmQgKi8gOTI1LCA0LCAzMTZ9LAorICAgIHsvKiBleE9iamVjdCAqLyA5MjksIDYsIDMxNn0sCisgICAgey8qIG9wZW5BY3Rpb24gKi8gOTM1LCAyLCAzMTZ9LAorICAgIHsvKiBuZXZlckVtYmVkICovIDkzNywgNCwgMzE2fSwKKyAgICB7LyogYmluZEl0ZW1zICovIDk0MSwgMywgMzE2fSwKKyAgICB7LyogY2FsY3VsYXRlICovIDk0NCwgMywgMzE2fSwKKyAgICB7LyogcHJpbnQgKi8gOTQ3LCAyLCAzMTZ9LAorICAgIHsvKiBleHRyYXMgKi8gOTQ5LCAzLCAzMTZ9LAorICAgIHsvKiBwcm90byAqLyA5NTIsIDAsIDMxNn0sCisgICAgey8qIGRTaWdEYXRhICovIDk1MiwgMCwgMzE2fSwKKyAgICB7LyogY3JlYXRvciAqLyA5NTIsIDIsIDMxNn0sCisgICAgey8qIGNvbm5lY3QgKi8gOTU0LCA3LCAzMTZ9LAorICAgIHsvKiBwZXJtaXNzaW9ucyAqLyA5NjEsIDIsIDMxNn0sCisgICAgey8qIGNvbm5lY3Rpb25TZXQgKi8gOTYzLCAwLCAzMTl9LAorICAgIHsvKiBzdWJtaXQgKi8gOTYzLCA3LCAzMTZ9LAorICAgIHsvKiByYW5nZSAqLyA5NzAsIDIsIDMxNn0sCisgICAgey8qIGxpbmVhcml6ZWQgKi8gOTcyLCAyLCAzMTZ9LAorICAgIHsvKiBwYWNrZXQgKi8gOTc0LCAxLCAzMTZ9LAorICAgIHsvKiByb290RWxlbWVudCAqLyA5NzUsIDIsIDMyMH0sCisgICAgey8qIHBsYWludGV4dE1ldGFkYXRhICovIDk3NywgNCwgMzE2fSwKKyAgICB7LyogbnVtYmVyU3ltYm9scyAqLyA5ODEsIDAsIDMxNn0sCisgICAgey8qIHByaW50SGlnaFF1YWxpdHkgKi8gOTgxLCAyLCAzMTZ9LAorICAgIHsvKiBkcml2ZXIgKi8gOTgzLCAyLCAzMTZ9LAorICAgIHsvKiBpbmNyZW1lbnRhbExvYWQgKi8gOTg1LCA0LCAzMTZ9LAorICAgIHsvKiBzdWJqZWN0RE4gKi8gOTg5LCAxLCAzMTZ9LAorICAgIHsvKiBjb21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUgKi8gOTkwLCAyLCAzMTZ9LAorICAgIHsvKiBpbmNyZW1lbnRhbE1lcmdlICovIDk5MiwgMiwgMzE2fSwKKyAgICB7LyogcmFkaWFsICovIDk5NCwgMywgMzE2fSwKKyAgICB7LyogdmFyaWFibGVzICovIDk5NywgMiwgMzE3fSwKKyAgICB7LyogdGltZVBhdHRlcm5zICovIDk5OSwgMCwgMzE2fSwKKyAgICB7LyogZWZmZWN0aXZlSW5wdXRQb2xpY3kgKi8gOTk5LCA0LCAzMTZ9LAorICAgIHsvKiBuYW1lQXR0ciAqLyAxMDAzLCA0LCAzMTZ9LAorICAgIHsvKiBjb25mb3JtYW5jZSAqLyAxMDA3LCAyLCAzMTZ9LAorICAgIHsvKiB0cmFuc2Zvcm0gKi8gMTAwOSwgMywgMzE2fSwKKyAgICB7LyogbG9ja0RvY3VtZW50ICovIDEwMTIsIDQsIDMxNn0sCisgICAgey8qIGJyZWFrQWZ0ZXIgKi8gMTAxNiwgNywgMzE2fSwKKyAgICB7LyogbGluZSAqLyAxMDIzLCA0LCAzMTZ9LAorICAgIHsvKiBsaXN0ICovIDEwMjcsIDEsIDMxM30sCisgICAgey8qIHNvdXJjZSAqLyAxMDI4LCAzLCAzMTZ9LAorICAgIHsvKiBvY2N1ciAqLyAxMDMxLCA1LCAzMTZ9LAorICAgIHsvKiBwaWNrVHJheUJ5UERGU2l6ZSAqLyAxMDM2LCAyLCAzMTZ9LAorICAgIHsvKiBtb250aE5hbWVzICovIDEwMzgsIDEsIDMxNn0sCisgICAgey8qIHNldmVyaXR5ICovIDEwMzksIDQsIDMxNn0sCisgICAgey8qIGdyb3VwUGFyZW50ICovIDEwNDMsIDIsIDMxNn0sCisgICAgey8qIGRvY3VtZW50QXNzZW1ibHkgKi8gMTA0NSwgMiwgMzE2fSwKKyAgICB7LyogbnVtYmVyU3ltYm9sICovIDEwNDcsIDEsIDMxNn0sCisgICAgey8qIHRhZ2dlZCAqLyAxMDQ4LCAyLCAzMTZ9LAorICAgIHsvKiAgKi8gMTA1MCwgNSwgMzE2fSwKKyAgICB7LyogICovIDEwNTUsIDEsIC0xfSwKKyAgICB7LyogICovIDEwNTYsIDEsIDMxMn0sCisgICAgey8qICAqLyAxMDU3LCAwLCAzMTN9LAorICAgIHsvKiAgKi8gMTA1NywgOCwgMzEyfSwKKyAgICB7LyogICovIDEwNjUsIDYsIDMxNX0sCisgICAgey8qICAqLyAxMDcxLCAwLCAzMTZ9LAorICAgIHsvKiAgKi8gMTA3MSwgMCwgMzE2fSwKKyAgICB7LyogICovIDEwNzEsIDIsIDMxNn0sCisgICAgey8qICAqLyAxMDczLCAyLCAzMTZ9LAogfTsKIGNvbnN0IGludDMyX3QgZ19pU2NyaXB0SW5kZXhDb3VudCA9CiAgICAgc2l6ZW9mKGdfWEZBU2NyaXB0SW5kZXgpIC8gc2l6ZW9mKFhGQV9TQ1JJUFRISUVSQVJDSFkpOwotCi1jb25zdCBYRkFfTUVUSE9ESU5GTyBnX1NvbU1ldGhvZERhdGFbXSA9IHsKLSAgICB7MHgzYzc1MjQ5NSwgTCJ2ZXJpZnkiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9TaWduYXR1cmVQc2V1ZG9Nb2RlbDo6VmVyaWZ5fSwKLSAgICB7MHhhNjg2MzVmMSwgTCJzaWduIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWw6OlNpZ259LAotICAgIHsweGE3ZjJjNWU2LCBMImVudW1lcmF0ZSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X1NpZ25hdHVyZVBzZXVkb01vZGVsOjpFbnVtZXJhdGV9LAotICAgIHsweGQ4ZWQxNDY3LCBMImNsZWFyIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfU2lnbmF0dXJlUHNldWRvTW9kZWw6OkNsZWFyfSwKLSAgICB7MHg0YmRjY2UxMywgTCJleGVjdXRlIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1dzZGxDb25uZWN0aW9uX0V4ZWN1dGV9LAotICAgIHsweDFjMjk2YmE0LCBMInJlc3RvcmUiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRGVsdGFfUmVzdG9yZX0sCi0gICAgezB4N2QxMjNhOSwgTCJjbGVhckl0ZW1zIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0NsZWFySXRlbXN9LAotICAgIHsweGZiMGIwMDcsIEwiZXhlY0V2ZW50IiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0V4ZWNFdmVudH0sCi0gICAgezB4NjcxNmNlOTcsIEwiZXhlY0luaXRpYWxpemUiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRXhlY0luaXRpYWxpemV9LAotICAgIHsweDdiYjkxOWMyLCBMImRlbGV0ZUl0ZW0iLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRGVsZXRlSXRlbX0sCi0gICAgezB4OWYwNTNkNWUsIEwiZ2V0U2F2ZUl0ZW0iLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfR2V0U2F2ZUl0ZW19LAotICAgIHsweGJiZDMyNzQ3LCBMImJvdW5kSXRlbSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9Cb3VuZEl0ZW19LAotICAgIHsweGM0OTJkOTUwLCBMImdldEl0ZW1TdGF0ZSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9HZXRJdGVtU3RhdGV9LAotICAgIHsweGM2MDEzY2QzLCBMImV4ZWNDYWxjdWxhdGUiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRXhlY0NhbGN1bGF0ZX0sCi0gICAgezB4ZDg5MzBkMGUsIEwic2V0SXRlbXMiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfU2V0SXRlbXN9LAotICAgIHsweGUwZjE1MDQ1LCBMImdldERpc3BsYXlJdGVtIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0dldERpc3BsYXlJdGVtfSwKLSAgICB7MHhlMjNhY2RkYywgTCJzZXRJdGVtU3RhdGUiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfU2V0SXRlbVN0YXRlfSwKLSAgICB7MHhlMmRmYjJmOCwgTCJhZGRJdGVtIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0FkZEl0ZW19LAotICAgIHsweGVmOGNlNDhmLCBMImV4ZWNWYWxpZGF0ZSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9GaWVsZF9FeGVjVmFsaWRhdGV9LAotICAgIHsweDQ2MTA3OWVmLCBMImVtaXQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpFbWl0fSwKLSAgICB7MHhmZWM5MGM2MywgTCJyZXNldCIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlJlc2V0fSwKLSAgICB7MHhmYjBiMDA3LCBMImV4ZWNFdmVudCIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRXhlY0V2ZW50fSwKLSAgICB7MHgzZDgzMjIyMSwgTCJzZWxlY3RlZE1lbWJlciIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfU2VsZWN0ZWRNZW1iZXJ9LAotICAgIHsweDY3MTZjZTk3LCBMImV4ZWNJbml0aWFsaXplIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9FeGVjSW5pdGlhbGl6ZX0sCi0gICAgezB4YzYwMTNjZDMsIEwiZXhlY0NhbGN1bGF0ZSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9FeGNsR3JvdXBfRXhlY0NhbGN1bGF0ZX0sCi0gICAgezB4ZWY4Y2U0OGYsIEwiZXhlY1ZhbGlkYXRlIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9FeGVjVmFsaWRhdGV9LAotICAgIHsweGZiMGIwMDcsIEwiZXhlY0V2ZW50IiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fRXhlY0V2ZW50fSwKLSAgICB7MHg2NzE2Y2U5NywgTCJleGVjSW5pdGlhbGl6ZSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9TdWJmb3JtX0V4ZWNJbml0aWFsaXplfSwKLSAgICB7MHhjNjAxM2NkMywgTCJleGVjQ2FsY3VsYXRlIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fRXhlY0NhbGN1bGF0ZX0sCi0gICAgezB4ZDliOWIxZjEsIEwiZ2V0SW52YWxpZE9iamVjdHMiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9HZXRJbnZhbGlkT2JqZWN0c30sCi0gICAgezB4ZWY4Y2U0OGYsIEwiZXhlY1ZhbGlkYXRlIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1N1YmZvcm1fRXhlY1ZhbGlkYXRlfSwKLSAgICB7MHhhMzY2YjdjLCBMImV4cG9ydERhdGEiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OkV4cG9ydERhdGF9LAotICAgIHsweDE2Y2MyMjZjLCBMImdvdG9VUkwiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OkdvdG9VUkx9LAotICAgIHsweDFlMDcyMmY1LCBMInBhZ2VEb3duIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpQYWdlRG93bn0sCi0gICAgezB4M2U2NmNiMmMsIEwic2V0Rm9jdXMiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlNldEZvY3VzfSwKLSAgICB7MHg0YWM5ZmFhZSwgTCJvcGVuTGlzdCIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6T3Blbkxpc3R9LAotICAgIHsweDdiODk3MTRmLCBMInJlc3BvbnNlIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpSZXNwb25zZX0sCi0gICAgezB4N2ZkOWZkNTgsIEwiZG9jdW1lbnRJbkJhdGNoIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpEb2N1bWVudEluQmF0Y2h9LAotICAgIHsweGFmMWQwMTlkLCBMInJlc2V0RGF0YSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6UmVzZXREYXRhfSwKLSAgICB7MHhiMDdiZTEzYywgTCJiZWVwIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpCZWVwfSwKLSAgICB7MHhiMTg4MmNhMCwgTCJnZXRGb2N1cyIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6R2V0Rm9jdXN9LAotICAgIHsweGJmNGJhOWVlLCBMIm1lc3NhZ2VCb3giLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Ok1lc3NhZ2VCb3h9LAotICAgIHsweGQ2ZDRkYmMxLCBMImRvY3VtZW50Q291bnRJbkJhdGNoIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpEb2N1bWVudENvdW50SW5CYXRjaH0sCi0gICAgezB4ZGQ3Njc2ZWQsIEwicHJpbnQiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlByaW50fSwKLSAgICB7MHhlMmY4NjNkMCwgTCJjdXJyZW50RGF0ZVRpbWUiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OkN1cnJlbnREYXRlVGltZX0sCi0gICAgezB4Zjk5NWQwZjUsIEwiaW1wb3J0RGF0YSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6SW1wb3J0RGF0YX0sCi0gICAgezB4ZmViOTZiNjIsIEwicGFnZVVwIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpQYWdlVXB9LAotICAgIHsweDY4LCBMImgiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6SH0sCi0gICAgezB4NzcsIEwidyIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpXfSwKLSAgICB7MHg3OCwgTCJ4IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6Olh9LAotICAgIHsweDc5LCBMInkiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6WX0sCi0gICAgezB4NTQ2MDIwNiwgTCJwYWdlQ291bnQiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6UGFnZUNvdW50fSwKLSAgICB7MHg1ZWI1YjBmLCBMInBhZ2VTcGFuIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlBhZ2VTcGFufSwKLSAgICB7MHgxMGYxYjFiZCwgTCJwYWdlIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlBhZ2V9LAotICAgIHsweDFjMWU2MzE4LCBMInBhZ2VDb250ZW50IiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlBhZ2VDb250ZW50fSwKLSAgICB7MHgxYzFmNGE1YywgTCJhYnNQYWdlQ291bnQiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6QWJzUGFnZUNvdW50fSwKLSAgICB7MHgxZWM0N2RiNSwgTCJhYnNQYWdlQ291bnRJbkJhdGNoIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OkFic1BhZ2VDb3VudEluQmF0Y2h9LAotICAgIHsweDJlNGVjYmRiLCBMInNoZWV0Q291bnRJbkJhdGNoIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNoZWV0Q291bnRJbkJhdGNofSwKLSAgICB7MHgyZmNmZjRiNSwgTCJyZWxheW91dCIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpSZWxheW91dH0sCi0gICAgezB4M2JmMWMyYTUsIEwiYWJzUGFnZVNwYW4iLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6QWJzUGFnZVNwYW59LAotICAgIHsweDU3NzVjMmNjLCBMImFic1BhZ2VJbkJhdGNoIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OkFic1BhZ2VJbkJhdGNofSwKLSAgICB7MHg4YzVmZWIzMiwgTCJzaGVldEluQmF0Y2giLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6U2hlZXRJbkJhdGNofSwKLSAgICB7MHg4ZjNhODM3OSwgTCJzaGVldCIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpTaGVldH0sCi0gICAgezB4OTZmM2M0Y2IsIEwicmVsYXlvdXRQYWdlQXJlYSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xheW91dFBzZXVkb01vZGVsOjpSZWxheW91dFBhZ2VBcmVhfSwKLSAgICB7MHhkMmE0YTU0MiwgTCJzaGVldENvdW50IiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTGF5b3V0UHNldWRvTW9kZWw6OlNoZWV0Q291bnR9LAotICAgIHsweGU3NGYwNjUzLCBMImFic1BhZ2UiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6QWJzUGFnZX0sCi0gICAgezB4NDRjMzUyYWQsIEwiZm9ybU5vZGVzIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RlbXBsYXRlX0Zvcm1Ob2Rlc30sCi0gICAgezB4NDVlZmI4NDcsIEwicmVtZXJnZSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9SZW1lcmdlfSwKLSAgICB7MHg2NzE2Y2U5NywgTCJleGVjSW5pdGlhbGl6ZSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9FeGVjSW5pdGlhbGl6ZX0sCi0gICAgezB4NzEyYzZhZmEsIEwiY3JlYXRlTm9kZSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9DcmVhdGVOb2RlfSwKLSAgICB7MHhhOGEzNWUyNSwgTCJyZWNhbGN1bGF0ZSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9SZWNhbGN1bGF0ZX0sCi0gICAgezB4YzYwMTNjZDMsIEwiZXhlY0NhbGN1bGF0ZSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UZW1wbGF0ZV9FeGVjQ2FsY3VsYXRlfSwKLSAgICB7MHhlZjhjZTQ4ZiwgTCJleGVjVmFsaWRhdGUiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVGVtcGxhdGVfRXhlY1ZhbGlkYXRlfSwKLSAgICB7MHg0Y2MxYzBmOSwgTCJtb3ZlQ3VycmVudFJlY29yZCIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0RhdGFXaW5kb3c6Ok1vdmVDdXJyZW50UmVjb3JkfSwKLSAgICB7MHg1Nzc5ZDY1ZiwgTCJyZWNvcmQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9EYXRhV2luZG93OjpSZWNvcmR9LAotICAgIHsweDhhNDc2NDk4LCBMImdvdG9SZWNvcmQiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9EYXRhV2luZG93OjpHb3RvUmVjb3JkfSwKLSAgICB7MHhhYWMyNDFjOCwgTCJpc1JlY29yZEdyb3VwIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfRGF0YVdpbmRvdzo6SXNSZWNvcmRHcm91cH0sCi0gICAgezB4MWM2ZjQyNzcsIEwiZXZhbHVhdGUiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTWFuaWZlc3RfRXZhbHVhdGV9LAotICAgIHsweDJhZmVjMmNjLCBMIm1vdmVJbnN0YW5jZSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfTW92ZUluc3RhbmNlfSwKLSAgICB7MHgyYmY5NGE2MywgTCJyZW1vdmVJbnN0YW5jZSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfUmVtb3ZlSW5zdGFuY2V9LAotICAgIHsweDMwM2FkYWY0LCBMInNldEluc3RhbmNlcyIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfU2V0SW5zdGFuY2VzfSwKLSAgICB7MHg0ZDc2Yjg5ZSwgTCJhZGRJbnN0YW5jZSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfQWRkSW5zdGFuY2V9LAotICAgIHsweGM2NjBkYzhhLCBMImluc2VydEluc3RhbmNlIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9JbnNlcnRJbnN0YW5jZX0sCi0gICAgezB4ZGRmZDFlYTEsIEwibWV0YWRhdGEiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRGVzY19NZXRhZGF0YX0sCi0gICAgezB4NDRjMzUyYWQsIEwiZm9ybU5vZGVzIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fRm9ybU5vZGVzfSwKLSAgICB7MHg0NWVmYjg0NywgTCJyZW1lcmdlIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0Zvcm1fUmVtZXJnZX0sCi0gICAgezB4NjcxNmNlOTcsIEwiZXhlY0luaXRpYWxpemUiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9FeGVjSW5pdGlhbGl6ZX0sCi0gICAgezB4YThhMzVlMjUsIEwicmVjYWxjdWxhdGUiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9SZWNhbGN1bGF0ZX0sCi0gICAgezB4YzYwMTNjZDMsIEwiZXhlY0NhbGN1bGF0ZSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Gb3JtX0V4ZWNDYWxjdWxhdGV9LAotICAgIHsweGVmOGNlNDhmLCBMImV4ZWNWYWxpZGF0ZSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Gb3JtX0V4ZWNWYWxpZGF0ZX0sCi0gICAgezB4NjA0OTBhODUsIEwibWVzc2FnZSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOjpNZXNzYWdlfSwKLSAgICB7MHg2MGVjZmNjOSwgTCJ0cmFjZURlYWN0aXZhdGUiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1NjcmlwdF9Mb2dQc2V1ZG9Nb2RlbDo6VHJhY2VEZWFjdGl2YXRlfSwKLSAgICB7MHg4NmEwZjRjMCwgTCJ0cmFjZUFjdGl2YXRlIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTG9nUHNldWRvTW9kZWw6OlRyYWNlQWN0aXZhdGV9LAotICAgIHsweDkzZWFjMzlhLCBMInRyYWNlRW5hYmxlZCIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDU2NyaXB0X0xvZ1BzZXVkb01vZGVsOjpUcmFjZUVuYWJsZWR9LAotICAgIHsweGQxMjI3ZTZmLCBMInRyYWNlIiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNTY3JpcHRfTG9nUHNldWRvTW9kZWw6OlRyYWNlfSwKLSAgICB7MHgzNmMwZWUxNCwgTCJnZXRBdHRyaWJ1dGUiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfUGFja2V0X0dldEF0dHJpYnV0ZX0sCi0gICAgezB4NTQ2OGUyYTAsIEwic2V0QXR0cmlidXRlIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1BhY2tldF9TZXRBdHRyaWJ1dGV9LAotICAgIHsweGFkYzQ4ZGUyLCBMInJlbW92ZUF0dHJpYnV0ZSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9QYWNrZXRfUmVtb3ZlQXR0cmlidXRlfSwKLSAgICB7MHgzODQ4YjNmLCBMIm5leHQiLCAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX05leHR9LAotICAgIHsweDE0ZTI1YmM4LCBMImNhbmNlbEJhdGNoIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9DYW5jZWxCYXRjaH0sCi0gICAgezB4M2NlMDVkNjgsIEwiZmlyc3QiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0ZpcnN0fSwKLSAgICB7MHg2NDllMWU2NSwgTCJ1cGRhdGVCYXRjaCIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfVXBkYXRlQmF0Y2h9LAotICAgIHsweDZhMzQwNWRkLCBMInByZXZpb3VzIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9QcmV2aW91c30sCi0gICAgezB4NzQ4MThmYjMsIEwiaXNCT0YiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0lzQk9GfSwKLSAgICB7MHg3NGQwN2E3NiwgTCJpc0VPRiIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfSXNFT0Z9LAotICAgIHsweDc2MTNjYjY2LCBMImNhbmNlbCIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfQ2FuY2VsfSwKLSAgICB7MHg3YmFjYTJlMywgTCJ1cGRhdGUiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX1VwZGF0ZX0sCi0gICAgezB4OGI5MGUxZjIsIEwib3BlbiIsIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfT3Blbn0sCi0gICAgezB4OWM2NDcxYjMsIEwiZGVsZXRlIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9EZWxldGV9LAotICAgIHsweGE3MzE1MDkzLCBMImFkZE5ldyIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfQWRkTmV3fSwKLSAgICB7MHhhN2NlNWY4ZCwgTCJyZXF1ZXJ5IiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9SZXF1ZXJ5fSwKLSAgICB7MHhjNzM2ODY3NCwgTCJyZXN5bmMiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX1Jlc3luY30sCi0gICAgezB4ZDlmNDdmMzYsIEwiY2xvc2UiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU291cmNlX0Nsb3NlfSwKLSAgICB7MHhmNTQ0ODFkNCwgTCJsYXN0IiwgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvdXJjZV9MYXN0fSwKLSAgICB7MHhmNzk2NTQ2MCwgTCJoYXNEYXRhQ2hhbmdlZCIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfSGFzRGF0YUNoYW5nZWR9LAotICAgIHsweDYyNzVmNmFmLCBMIml0ZW0iLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19JdGVtfSwKLSAgICB7MHg3MDMzYmZkNSwgTCJpbnNlcnQiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19JbnNlcnR9LAotICAgIHsweDljYWI3Y2FlLCBMInJlbW92ZSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGVMaXN0OjpTY3JpcHRfTGlzdENsYXNzX1JlbW92ZX0sCi0gICAgezB4ZGExMmU1MTgsIEwiYXBwZW5kIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZUxpc3Q6OlNjcmlwdF9MaXN0Q2xhc3NfQXBwZW5kfSwKLSAgICB7MHhkODkyYTA1NCwgTCJuYW1lZEl0ZW0iLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X1RyZWVsaXN0Q2xhc3NfTmFtZWRJdGVtfSwKLSAgICB7MHhiYTJkZDM4NiwgTCJyZXNvbHZlTm9kZSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfUmVzb2x2ZU5vZGV9LAotICAgIHsweGU1MDllMmI5LCBMInJlc29sdmVOb2RlcyIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfUmVzb2x2ZU5vZGVzfSwKLSAgICB7MHgxYmNhMWViZCwgTCJhcHBseVhTTCIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfQXBwbHlYU0x9LAotICAgIHsweDM2YzBlZTE0LCBMImdldEF0dHJpYnV0ZSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfR2V0QXR0cmlidXRlfSwKLSAgICB7MHg1NDY4ZTJhMCwgTCJzZXRBdHRyaWJ1dGUiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX1NldEF0dHJpYnV0ZX0sCi0gICAgezB4NWVlMDA5OTYsIEwic2V0RWxlbWVudCIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfU2V0RWxlbWVudH0sCi0gICAgezB4OTJkYWRhNGYsIEwic2F2ZUZpbHRlcmVkWE1MIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19TYXZlRmlsdGVyZWRYTUx9LAotICAgIHsweDljNDU2NTAwLCBMInNhdmVYTUwiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX1NhdmVYTUx9LAotICAgIHsweGFiZDMyMDBhLCBMImdldEVsZW1lbnQiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0dldEVsZW1lbnR9LAotICAgIHsweGIyNjljNjBkLCBMImlzUHJvcGVydHlTcGVjaWZpZWQiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0lzUHJvcGVydHlTcGVjaWZpZWR9LAotICAgIHsweGI1MjhiZTkxLCBMImxvYWRYTUwiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0xvYWRYTUx9LAotICAgIHsweGQ5ZjQ2NTkxLCBMImNsb25lIiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19DbG9uZX0sCi0gICAgezB4ZTAwNmE3NmIsIEwiYXNzaWduTm9kZSIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfQXNzaWduTm9kZX0sCi0gICAgezB4NzMwM2ZjZWEsIEwiZ2V0RGVsdGEiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQ29udGFpbmVyQ2xhc3NfR2V0RGVsdGF9LAotICAgIHsweGU3NzQyYzlkLCBMImdldERlbHRhcyIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Db250YWluZXJDbGFzc19HZXREZWx0YXN9LAotICAgIHsweDMwZmY2YWFkLCBMImNsZWFyRXJyb3JMaXN0IiwKLSAgICAgKFhGQV9NRVRIT0RfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X01vZGVsQ2xhc3NfQ2xlYXJFcnJvckxpc3R9LAotICAgIHsweDcxMmM2YWZhLCBMImNyZWF0ZU5vZGUiLAotICAgICAoWEZBX01FVEhPRF9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTW9kZWxDbGFzc19DcmVhdGVOb2RlfSwKLSAgICB7MHg4M2E2NDExZCwgTCJpc0NvbXBhdGlibGVOUyIsCi0gICAgIChYRkFfTUVUSE9EX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Nb2RlbENsYXNzX0lzQ29tcGF0aWJsZU5TfSwKLX07Ci1jb25zdCBpbnQzMl90IGdfaVNvbU1ldGhvZENvdW50ID0KLSAgICBzaXplb2YoZ19Tb21NZXRob2REYXRhKSAvIHNpemVvZihYRkFfTUVUSE9ESU5GTyk7Ci0KIGNvbnN0IFhGQV9TQ1JJUFRBVFRSSUJVVEVJTkZPIGdfU29tQXR0cmlidXRlRGF0YVtdID0geworICAgIC8qIHBzICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHRvICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGIzNTQzYTYsIEwibWF4IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTWF4LCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiB1aSAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9VaTo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfVWk6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiByZWNvcmRTZXQgKi8KKyAgICB7MHhiMzU0M2E2LCBMIm1heCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUmVjb3JkU2V0OjptYXgsCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok1heCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUmVjb3JkU2V0Ojp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHg0NWE2ZGFmOCwgTCJlb2ZBY3Rpb24iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Fb2ZBY3Rpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1JlY29yZFNldDo6ZW9mQWN0aW9uLAorICAgICBYRkFfQXR0cmlidXRlOjpFb2ZBY3Rpb24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4NWVjOTU4YzAsIEwiY3Vyc29yVHlwZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0N1cnNvclR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDc5OTc1ZjJiLCBMImxvY2tUeXBlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9ja1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1JlY29yZFNldDo6Y3Vyc29yVHlwZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6Q3Vyc29yVHlwZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg3OTk3NWYyYiwgTCJsb2NrVHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUmVjb3JkU2V0Ojpsb2NrVHlwZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9ja1R5cGUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YTUzNDBmZjUsIEwiYm9mQWN0aW9uIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfQm9mQWN0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUmVjb3JkU2V0Ojpib2ZBY3Rpb24sCisgICAgIFhGQV9BdHRyaWJ1dGU6OkJvZkFjdGlvbiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9SZWNvcmRTZXQ6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YzU3NjIxNTcsIEwiY3Vyc29yTG9jYXRpb24iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9DdXJzb3JMb2NhdGlvbiwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUmVjb3JkU2V0OjpjdXJzb3JMb2NhdGlvbiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6Q3Vyc29yTG9jYXRpb24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBzdWJzZXRCZWxvdyAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBzdWJmb3JtU2V0ICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1N1YmZvcm1TZXQ6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDFlZTJkMjRkLCBMImluc3RhbmNlSW5kZXgiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0luc3RhbmNlSW5kZXgsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg4Yzk5Mzc3ZSwgTCJyZWxhdGlvbiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1JlbGF0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1JlbGV2YW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU3ViZm9ybVNldDo6aW5zdGFuY2VJbmRleCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg4Yzk5Mzc3ZSwgTCJyZWxhdGlvbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU3ViZm9ybVNldDo6cmVsYXRpb24sCisgICAgIFhGQV9BdHRyaWJ1dGU6OlJlbGF0aW9uLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDhlMWMyOTIxLCBMInJlbGV2YW50IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TdWJmb3JtU2V0OjpyZWxldmFudCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UmVsZXZhbnQsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU3ViZm9ybVNldDo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGFkb2JlRXh0ZW5zaW9uTGV2ZWwgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogdHlwZWZhY2UgKi8KICAgICB7MHgzMWIxOWMxLCBMIm5hbWUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogYnJlYWsgKi8KICAgICB7MHgzMTA2YzNhLCBMImJlZm9yZVRhcmdldCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0JlZm9yZVRhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0JyZWFrOjpiZWZvcmVUYXJnZXQsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkJlZm9yZVRhcmdldCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQnJlYWs6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDEzYTA4YmRiLCBMIm92ZXJmbG93VGFyZ2V0IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfT3ZlcmZsb3dUYXJnZXQsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0JyZWFrOjpvdmVyZmxvd1RhcmdldCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6T3ZlcmZsb3dUYXJnZXQsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4MTY5MTM0YTEsIEwib3ZlcmZsb3dMZWFkZXIiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9PdmVyZmxvd0xlYWRlciwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQnJlYWs6Om92ZXJmbG93TGVhZGVyLAorICAgICBYRkFfQXR0cmlidXRlOjpPdmVyZmxvd0xlYWRlciwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHgyMDkxNDM2NywgTCJvdmVyZmxvd1RyYWlsZXIiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9PdmVyZmxvd1RyYWlsZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDQ1M2VhZjM4LCBMInN0YXJ0TmV3IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfU3RhcnROZXcsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0JyZWFrOjpvdmVyZmxvd1RyYWlsZXIsCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok92ZXJmbG93VHJhaWxlciwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg0NTNlYWYzOCwgTCJzdGFydE5ldyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQnJlYWs6OnN0YXJ0TmV3LAorICAgICBYRkFfQXR0cmlidXRlOjpTdGFydE5ldywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHg2NDExMGFiNSwgTCJib29rZW5kVHJhaWxlciIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Jvb2tlbmRUcmFpbGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiNmI0NDE3MiwgTCJhZnRlciIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0FmdGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQnJlYWs6OmJvb2tlbmRUcmFpbGVyLAorICAgICBYRkFfQXR0cmlidXRlOjpCb29rZW5kVHJhaWxlciwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiNmI0NDE3MiwgTCJhZnRlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQnJlYWs6OmFmdGVyLAorICAgICBYRkFfQXR0cmlidXRlOjpBZnRlciwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9CcmVhazo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhjM2MxNDQyZiwgTCJib29rZW5kTGVhZGVyIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfQm9va2VuZExlYWRlciwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQnJlYWs6OmJvb2tlbmRMZWFkZXIsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkJvb2tlbmRMZWFkZXIsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4Y2IxNTA0NzksIEwiYWZ0ZXJUYXJnZXQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9BZnRlclRhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4ZjRmZmNlNzMsIEwiYmVmb3JlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfQmVmb3JlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9CcmVhazo6YWZ0ZXJUYXJnZXQsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkFmdGVyVGFyZ2V0LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGY0ZmZjZTczLCBMImJlZm9yZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQnJlYWs6OmJlZm9yZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6QmVmb3JlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogZm9udEluZm8gKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogbnVtYmVyUGF0dGVybiAqLwogICAgIHsweDMxYjE5YzEsIEwibmFtZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBkeW5hbWljUmVuZGVyICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZV9SZWFkLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZV9SZWFkLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBwcmludFNjYWxpbmcgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGNoZWNrQnV0dG9uICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0NoZWNrQnV0dG9uOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHg0N2NmYTQzYSwgTCJhbGxvd05ldXRyYWwiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9BbGxvd05ldXRyYWwsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDdjMmZkODBiLCBMIm1hcmsiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9NYXJrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg4ZWQxODJkMSwgTCJzaGFwZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1NoYXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhhNjg2OTc1YiwgTCJzaXplIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfU2l6ZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQ2hlY2tCdXR0b246OmFsbG93TmV1dHJhbCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6QWxsb3dOZXV0cmFsLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDdjMmZkODBiLCBMIm1hcmsiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0NoZWNrQnV0dG9uOjptYXJrLAorICAgICBYRkFfQXR0cmlidXRlOjpNYXJrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDhlZDE4MmQxLCBMInNoYXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9DaGVja0J1dHRvbjo6c2hhcGUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlNoYXBlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGE2ODY5NzViLCBMInNpemUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0NoZWNrQnV0dG9uOjpzaXplLAorICAgICBYRkFfQXR0cmlidXRlOjpTaXplLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0NoZWNrQnV0dG9uOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogZGF0ZVBhdHRlcm5zICovCisKKyAgICAvKiBzb3VyY2VTZXQgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU291cmNlU2V0Ojp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Tb3VyY2VTZXQ6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBhbWQgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg1YzA1NDc1NSwgTCJzdGFydEFuZ2xlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfU3RhcnRBbmdsZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NzQ3ODhmOGIsIEwic3dlZXBBbmdsZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1N3ZWVwQW5nbGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDlkODMzZDc1LCBMImNpcmN1bGFyIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfQ2lyY3VsYXIsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhkOTk2ZmE5YiwgTCJoYW5kIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfSGFuZCwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBhcmMgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQXJjOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg1YzA1NDc1NSwgTCJzdGFydEFuZ2xlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9BcmM6OnN0YXJ0QW5nbGUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlN0YXJ0QW5nbGUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4NzQ3ODhmOGIsIEwic3dlZXBBbmdsZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQXJjOjpzd2VlcEFuZ2xlLAorICAgICBYRkFfQXR0cmlidXRlOjpTd2VlcEFuZ2xlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDlkODMzZDc1LCBMImNpcmN1bGFyIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9BcmM6OmNpcmN1bGFyLAorICAgICBYRkFfQXR0cmlidXRlOjpDaXJjdWxhciwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9BcmM6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4ZDk5NmZhOWIsIEwiaGFuZCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQXJjOjpoYW5kLAorICAgICBYRkFfQXR0cmlidXRlOjpIYW5kLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogZGF5ICovCisKKyAgICAvKiBlcmEgKi8KKworICAgIC8qIGpvZyAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBsb2cgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiMGU1NDg1ZCwgTCJiaW5kIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfQmluZCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogbWFwICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX01hcDo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YjBlNTQ4NWQsIEwiYmluZCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTWFwOjpiaW5kLAorICAgICBYRkFfQXR0cmlidXRlOjpCaW5kLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX01hcDo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4Y2Q3ZjdiNTQsIEwiZnJvbSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Zyb20sIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4Y2Q3ZjdiNTQsIEwiZnJvbSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTWFwOjpmcm9tLAorICAgICBYRkFfQXR0cmlidXRlOjpGcm9tLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogbWRwICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX01kcDo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4OGUyOWQ3OTQsIEwic2lnbmF0dXJlVHlwZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1NpZ25hdHVyZVR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhlMTFhMmNiYywgTCJwZXJtaXNzaW9ucyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1Blcm1pc3Npb25zLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTWRwOjpzaWduYXR1cmVUeXBlLAorICAgICBYRkFfQXR0cmlidXRlOjpTaWduYXR1cmVUeXBlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX01kcDo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhlMTFhMmNiYywgTCJwZXJtaXNzaW9ucyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTWRwOjpwZXJtaXNzaW9ucywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UGVybWlzc2lvbnMsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBicmVha0JlZm9yZSAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9CcmVha0JlZm9yZTo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4NDUzZWFmMzgsIEwic3RhcnROZXciLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9TdGFydE5ldywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4OWRjYzNhYjMsIEwidHJhaWxlciIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1RyYWlsZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0JyZWFrQmVmb3JlOjpzdGFydE5ldywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6U3RhcnROZXcsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4OWRjYzNhYjMsIEwidHJhaWxlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQnJlYWtCZWZvcmU6OnRyYWlsZXIsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlRyYWlsZXIsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YTYxMThjODksIEwidGFyZ2V0VHlwZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1RhcmdldFR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjOGRhNGRhNywgTCJ0YXJnZXQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9UYXJnZXQsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGNiY2FmNjZkLCBMImxlYWRlciIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0xlYWRlciwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9CcmVha0JlZm9yZTo6dGFyZ2V0VHlwZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VGFyZ2V0VHlwZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9CcmVha0JlZm9yZTo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhjOGRhNGRhNywgTCJ0YXJnZXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0JyZWFrQmVmb3JlOjp0YXJnZXQsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlRhcmdldCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhjYmNhZjY2ZCwgTCJsZWFkZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0JyZWFrQmVmb3JlOjpsZWFkZXIsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxlYWRlciwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIG9pZCAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PaWQ6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09pZDo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHBjbCAqLwogICAgIHsweDMxYjE5YzEsIEwibmFtZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHBkZiAqLwogICAgIHsweDMxYjE5YzEsIEwibmFtZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiByZWYgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUmVmOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9SZWY6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiB1cmkgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfVXJpOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Vcmk6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogeGRjICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogeGRwICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHgyZDU3NGQ1OCwgTCJ0aGlzIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1hmYV9UaGlzLAotICAgICAtMSwgWEZBX1NDUklQVF9PYmplY3R9LAotICAgIHsweDRmZGMzNDU0LCBMInRpbWVTdGFtcCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1RpbWVTdGFtcCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YjU5OGExZjcsIEwidXVpZCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1V1aWQsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogeGZhICovCisgICAgezB4MmQ1NzRkNTgsIEwidGhpcyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfWGZhOjp0aGlzVmFsdWUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpPYmplY3R9LAorICAgIHsweDRmZGMzNDU0LCBMInRpbWVTdGFtcCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfWGZhOjp0aW1lU3RhbXAsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlRpbWVTdGFtcCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiNTk4YTFmNywgTCJ1dWlkIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9YZmE6OnV1aWQsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlV1aWQsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiB4c2wgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiB6cGwgKi8KICAgICB7MHgzMWIxOWMxLCBMIm5hbWUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogY2FjaGUgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjZmVhMDJlLCBMImxlZnRJbnNldCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0xlZnRJbnNldCwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBtYXJnaW4gKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTWFyZ2luOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhjZmVhMDJlLCBMImxlZnRJbnNldCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTWFyZ2luOjpsZWZ0SW5zZXQsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxlZnRJbnNldCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHgxMzU2Y2FmOCwgTCJib3R0b21JbnNldCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHgyNTc2NDQzNiwgTCJ0b3BJbnNldCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1RvcEluc2V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg4YTY5MjUyMSwgTCJyaWdodEluc2V0IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfUmlnaHRJbnNldCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9NYXJnaW46OmJvdHRvbUluc2V0LAorICAgICBYRkFfQXR0cmlidXRlOjpCb3R0b21JbnNldCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHgyNTc2NDQzNiwgTCJ0b3BJbnNldCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTWFyZ2luOjp0b3BJbnNldCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VG9wSW5zZXQsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4OGE2OTI1MjEsIEwicmlnaHRJbnNldCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTWFyZ2luOjpyaWdodEluc2V0LAorICAgICBYRkFfQXR0cmlidXRlOjpSaWdodEluc2V0LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX01hcmdpbjo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGtleVVzYWdlICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0tleVVzYWdlOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHgxZTQ1OWI4ZiwgTCJub25SZXB1ZGlhdGlvbiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX05vblJlcHVkaWF0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9LZXlVc2FnZTo6bm9uUmVwdWRpYXRpb24sCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok5vblJlcHVkaWF0aW9uLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDJiYjNmNDcwLCBMImVuY2lwaGVyT25seSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0VuY2lwaGVyT25seSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4MmYxNmEzODIsIEwidHlwZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0tleVVzYWdlOjplbmNpcGhlck9ubHksCisgICAgIFhGQV9BdHRyaWJ1dGU6OkVuY2lwaGVyT25seSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9LZXlVc2FnZTo6dHlwZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VHlwZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHg1Zjc2MGI1MCwgTCJkaWdpdGFsU2lnbmF0dXJlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGlnaXRhbFNpZ25hdHVyZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NjlhYTIyOTIsIEwiY3JsU2lnbiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0NybFNpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0tleVVzYWdlOjpkaWdpdGFsU2lnbmF0dXJlLAorICAgICBYRkFfQXR0cmlidXRlOjpEaWdpdGFsU2lnbmF0dXJlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDY5YWEyMjkyLCBMImNybFNpZ24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0tleVVzYWdlOjpjcmxTaWduLAorICAgICBYRkFfQXR0cmlidXRlOjpDcmxTaWduLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDk4ZmQ0ZDgxLCBMImtleUFncmVlbWVudCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0tleUFncmVlbWVudCwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfS2V5VXNhZ2U6OmtleUFncmVlbWVudCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6S2V5QWdyZWVtZW50LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGE2NjQwNGNiLCBMImtleUVuY2lwaGVybWVudCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0tleUVuY2lwaGVybWVudCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0tleVVzYWdlOjprZXlFbmNpcGhlcm1lbnQsCisgICAgIFhGQV9BdHRyaWJ1dGU6OktleUVuY2lwaGVybWVudCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9LZXlVc2FnZTo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhjYTVkYzI3YywgTCJkYXRhRW5jaXBoZXJtZW50IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGF0YUVuY2lwaGVybWVudCwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfS2V5VXNhZ2U6OmRhdGFFbmNpcGhlcm1lbnQsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRhdGFFbmNpcGhlcm1lbnQsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZThmMTE4YTgsIEwia2V5Q2VydFNpZ24iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9LZXlDZXJ0U2lnbiwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfS2V5VXNhZ2U6OmtleUNlcnRTaWduLAorICAgICBYRkFfQXR0cmlidXRlOjpLZXlDZXJ0U2lnbiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmZWE1M2VjNiwgTCJkZWNpcGhlck9ubHkiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZWNpcGhlck9ubHksIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0tleVVzYWdlOjpkZWNpcGhlck9ubHksCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlY2lwaGVyT25seSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGV4Y2x1ZGUgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg4YjkwZTFmMiwgTCJvcGVuIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfT3BlbiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4OTU3ZmEwMDYsIEwiY29tbWl0T24iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Db21taXRPbiwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBjaG9pY2VMaXN0ICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0Nob2ljZUxpc3Q6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDhiOTBlMWYyLCBMIm9wZW4iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0Nob2ljZUxpc3Q6Om9wZW4sCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok9wZW4sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4OTU3ZmEwMDYsIEwiY29tbWl0T24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0Nob2ljZUxpc3Q6OmNvbW1pdE9uLAorICAgICBYRkFfQXR0cmlidXRlOjpDb21taXRPbiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhiMTIxMjhiNywgTCJ0ZXh0RW50cnkiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9UZXh0RW50cnksIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9DaG9pY2VMaXN0Ojp0ZXh0RW50cnksCisgICAgIFhGQV9BdHRyaWJ1dGU6OlRleHRFbnRyeSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9DaG9pY2VMaXN0Ojp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogbGV2ZWwgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogbGFiZWxQcmludGVyICovCiAgICAgezB4MzFiMTljMSwgTCJuYW1lIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogY2FsZW5kYXJTeW1ib2xzICovCiAgICAgezB4MzFiMTljMSwgTCJuYW1lIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4MjI4MmM3MywgTCJoQWxpZ24iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9IQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDhkNGYxYzcsIEwidGV4dEluZGVudCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1RleHRJbmRlbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHgyYTgyZDk5YywgTCJtYXJnaW5SaWdodCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX01hcmdpblJpZ2h0LCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg1MzQ3MjljOSwgTCJtYXJnaW5MZWZ0IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTWFyZ2luTGVmdCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NTczOWQxZmYsIEwicmFkaXhPZmZzZXQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9SYWRpeE9mZnNldCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NTc3NjgyYWMsIEwicHJlc2VydmUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9QcmVzZXJ2ZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NzMxZTA2NjUsIEwic3BhY2VCZWxvdyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1NwYWNlQmVsb3csIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDdhN2NjMzQxLCBMInZBbGlnbiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1ZBbGlnbiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4ODM2ZDRkN2MsIEwidGFiRGVmYXVsdCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1RhYkRlZmF1bHQsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDhmYTAxNzkwLCBMInRhYlN0b3BzIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVGFiU3RvcHMsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhkNGIwMTkyMSwgTCJsaW5lSGVpZ2h0IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTGluZUhlaWdodCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4ZTE4YjU2NTksIEwic3BhY2VBYm92ZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1NwYWNlQWJvdmUsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBwYXJhICovCisgICAgezB4MjI4MmM3MywgTCJoQWxpZ24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1BhcmE6OmhBbGlnbiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6SEFsaWduLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDhkNGYxYzcsIEwidGV4dEluZGVudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUGFyYTo6dGV4dEluZGVudCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VGV4dEluZGVudCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUGFyYTo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4MmE4MmQ5OWMsIEwibWFyZ2luUmlnaHQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1BhcmE6Om1hcmdpblJpZ2h0LAorICAgICBYRkFfQXR0cmlidXRlOjpNYXJnaW5SaWdodCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg1MzQ3MjljOSwgTCJtYXJnaW5MZWZ0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9QYXJhOjptYXJnaW5MZWZ0LAorICAgICBYRkFfQXR0cmlidXRlOjpNYXJnaW5MZWZ0LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDU3MzlkMWZmLCBMInJhZGl4T2Zmc2V0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9QYXJhOjpyYWRpeE9mZnNldCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UmFkaXhPZmZzZXQsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4NTc3NjgyYWMsIEwicHJlc2VydmUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1BhcmE6OnByZXNlcnZlLAorICAgICBYRkFfQXR0cmlidXRlOjpQcmVzZXJ2ZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg3MzFlMDY2NSwgTCJzcGFjZUJlbG93IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9QYXJhOjpzcGFjZUJlbG93LAorICAgICBYRkFfQXR0cmlidXRlOjpTcGFjZUJlbG93LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDdhN2NjMzQxLCBMInZBbGlnbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUGFyYTo6dkFsaWduLAorICAgICBYRkFfQXR0cmlidXRlOjpWQWxpZ24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4ODM2ZDRkN2MsIEwidGFiRGVmYXVsdCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUGFyYTo6dGFiRGVmYXVsdCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VGFiRGVmYXVsdCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg4ZmEwMTc5MCwgTCJ0YWJTdG9wcyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUGFyYTo6dGFiU3RvcHMsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlRhYlN0b3BzLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1BhcmE6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4ZDRiMDE5MjEsIEwibGluZUhlaWdodCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUGFyYTo6bGluZUhlaWdodCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TGluZUhlaWdodCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhlMThiNTY1OSwgTCJzcGFjZUFib3ZlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9QYXJhOjpzcGFjZUFib3ZlLAorICAgICBYRkFfQXR0cmlidXRlOjpTcGFjZUFib3ZlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogcGFydCAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBwZGZhICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogZmlsdGVyICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZpbHRlcjo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRmlsdGVyOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGQ4NjFmOGFmLCBMImFkZFJldm9jYXRpb25JbmZvIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfQWRkUmV2b2NhdGlvbkluZm8sIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZpbHRlcjo6YWRkUmV2b2NhdGlvbkluZm8sCisgICAgIFhGQV9BdHRyaWJ1dGU6OkFkZFJldm9jYXRpb25JbmZvLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogcHJlc2VudCAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBwYWdpbmF0aW9uICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJiOGRmNWQsIEwicmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfUmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGQ2MTI4ZDhkLCBMImFjdGl2aXR5IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfQWN0aXZpdHksIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogZW5jb2RpbmcgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRW5jb2Rpbmc6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0VuY29kaW5nOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogZXZlbnQgKi8KKyAgICB7MHhiYjhkZjVkLCBMInJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRXZlbnQ6OnJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FdmVudDo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRXZlbnQ6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4ZDYxMjhkOGQsIEwiYWN0aXZpdHkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V2ZW50OjphY3Rpdml0eSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6QWN0aXZpdHksIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiB3aGl0ZXNwYWNlICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogZGVmYXVsdFVpICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0RlZmF1bHRVaTo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRGVmYXVsdFVpOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogZGF0YU1vZGVsICovCisKKyAgICAvKiBiYXJjb2RlICovCiAgICAgezB4NDNlMzQ5YiwgTCJkYXRhUm93Q291bnQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EYXRhUm93Q291bnQsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHgyOGUxN2U5MSwgTCJkYXRhUHJlcCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0RhdGFQcmVwLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQmFyY29kZTo6ZGF0YVJvd0NvdW50LAorICAgICBYRkFfQXR0cmlidXRlOjpEYXRhUm93Q291bnQsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0JhcmNvZGU6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDI4ZTE3ZTkxLCBMImRhdGFQcmVwIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9CYXJjb2RlOjpkYXRhUHJlcCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGF0YVByZXAsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4MmYxNmEzODIsIEwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQmFyY29kZTo6dHlwZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VHlwZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHgzNjUwNTU3ZSwgTCJ0ZXh0TG9jYXRpb24iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9UZXh0TG9jYXRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0JhcmNvZGU6OnRleHRMb2NhdGlvbiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VGV4dExvY2F0aW9uLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDNiNTgyMjg2LCBMIm1vZHVsZVdpZHRoIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTW9kdWxlV2lkdGgsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0JhcmNvZGU6Om1vZHVsZVdpZHRoLAorICAgICBYRkFfQXR0cmlidXRlOjpNb2R1bGVXaWR0aCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHg1MjY2NmYxYywgTCJwcmludENoZWNrRGlnaXQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9QcmludENoZWNrRGlnaXQsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0JhcmNvZGU6OnByaW50Q2hlY2tEaWdpdCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UHJpbnRDaGVja0RpZ2l0LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDU0MDRkNmRmLCBMIm1vZHVsZUhlaWdodCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX01vZHVsZUhlaWdodCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NWFiMjNiNmMsIEwic3RhcnRDaGFyIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfU3RhcnRDaGFyLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg3YzczMmE2NiwgTCJ0cnVuY2F0ZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1RydW5jYXRlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9CYXJjb2RlOjptb2R1bGVIZWlnaHQsCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok1vZHVsZUhlaWdodCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg1YWIyM2I2YywgTCJzdGFydENoYXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0JhcmNvZGU6OnN0YXJ0Q2hhciwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6U3RhcnRDaGFyLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDdjNzMyYTY2LCBMInRydW5jYXRlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9CYXJjb2RlOjp0cnVuY2F0ZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VHJ1bmNhdGUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4OGQxODFkNjEsIEwid2lkZU5hcnJvd1JhdGlvIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfV2lkZU5hcnJvd1JhdGlvLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9CYXJjb2RlOjp3aWRlTmFycm93UmF0aW8sCisgICAgIFhGQV9BdHRyaWJ1dGU6OldpZGVOYXJyb3dSYXRpbywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHg5OTgwMGQ3YSwgTCJlcnJvckNvcnJlY3Rpb25MZXZlbCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Vycm9yQ29ycmVjdGlvbkxldmVsLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg5YTYzZGEzZCwgTCJ1cHNNb2RlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXBzTW9kZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YWY3NTQ2MTMsIEwiY2hlY2tzdW0iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9DaGVja3N1bSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQmFyY29kZTo6ZXJyb3JDb3JyZWN0aW9uTGV2ZWwsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkVycm9yQ29ycmVjdGlvbkxldmVsLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDlhNjNkYTNkLCBMInVwc01vZGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0JhcmNvZGU6OnVwc01vZGUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVwc01vZGUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YWY3NTQ2MTMsIEwiY2hlY2tzdW0iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0JhcmNvZGU6OmNoZWNrc3VtLAorICAgICBYRkFfQXR0cmlidXRlOjpDaGVja3N1bSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhiMDQ1ZmJjNSwgTCJjaGFyRW5jb2RpbmciLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9DaGFyRW5jb2RpbmcsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9CYXJjb2RlOjpjaGFyRW5jb2RpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkNoYXJFbmNvZGluZywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9CYXJjb2RlOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGMwMzVjNmIxLCBMImRhdGFDb2x1bW5Db3VudCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0RhdGFDb2x1bW5Db3VudCwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQmFyY29kZTo6ZGF0YUNvbHVtbkNvdW50LAorICAgICBYRkFfQXR0cmlidXRlOjpEYXRhQ29sdW1uQ291bnQsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZDNjODRkMjUsIEwicm93Q29sdW1uUmF0aW8iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Sb3dDb2x1bW5SYXRpbywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQmFyY29kZTo6cm93Q29sdW1uUmF0aW8sCisgICAgIFhGQV9BdHRyaWJ1dGU6OlJvd0NvbHVtblJhdGlvLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGQ1N2M1MTNjLCBMImRhdGFMZW5ndGgiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EYXRhTGVuZ3RoLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhmNTc1Y2E3NSwgTCJlbmRDaGFyIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRW5kQ2hhciwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQmFyY29kZTo6ZGF0YUxlbmd0aCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGF0YUxlbmd0aCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhmNTc1Y2E3NSwgTCJlbmRDaGFyIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9CYXJjb2RlOjplbmRDaGFyLAorICAgICBYRkFfQXR0cmlidXRlOjpFbmRDaGFyLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogdGltZVBhdHRlcm4gKi8KICAgICB7MHgzMWIxOWMxLCBMIm5hbWUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogYmF0Y2hPdXRwdXQgKi8KICAgICB7MHgyOGRlZTZlOSwgTCJmb3JtYXQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Gb3JtYXQsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkZvcm1hdCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogZW5mb3JjZSAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBjdXJyZW5jeVN5bWJvbHMgKi8KKworICAgIC8qIGFkZFNpbGVudFByaW50ICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHJlbmFtZSAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDYwZDRjOGIxLCBMIm91dHB1dCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX091dHB1dCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGQ2YTM5OTkwLCBMImlucHV0IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfSW5wdXQsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4MmYxNmEzODIsIEwidHlwZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIG9wZXJhdGlvbiAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PcGVyYXRpb246OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDYwZDRjOGIxLCBMIm91dHB1dCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT3BlcmF0aW9uOjpvdXRwdXQsCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok91dHB1dCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PcGVyYXRpb246OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4ZDZhMzk5OTAsIEwiaW5wdXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09wZXJhdGlvbjo6aW5wdXQsCisgICAgIFhGQV9BdHRyaWJ1dGU6OklucHV0LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogdHlwZWZhY2VzICovCisKKyAgICAvKiBzdWJqZWN0RE5zICovCisgICAgezB4MmYxNmEzODIsIEwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU3ViamVjdEROczo6dHlwZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VHlwZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGlzc3VlcnMgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfSXNzdWVyczo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4MmYxNmEzODIsIEwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfSXNzdWVyczo6dHlwZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VHlwZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Jc3N1ZXJzOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogc2lnbmF0dXJlUHNldWRvTW9kZWwgKi8KKworICAgIC8qIHdzZGxDb25uZWN0aW9uICovCiAgICAgezB4MmI1ZGY1MWUsIEwiZGF0YURlc2NyaXB0aW9uIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGF0YURlc2NyaXB0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Xc2RsQ29ubmVjdGlvbjo6ZGF0YURlc2NyaXB0aW9uLAorICAgICBYRkFfQXR0cmlidXRlOjpEYXRhRGVzY3JpcHRpb24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBkZWJ1ZyAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBkZWx0YSAqLwogICAgIHsweDZjMGQ5NjAwLCBMImN1cnJlbnRWYWx1ZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9EZWx0YV9DdXJyZW50VmFsdWUsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg5NDI2NDNmMCwgTCJzYXZlZFZhbHVlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0RlbHRhX1NhdmVkVmFsdWUsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjOGRhNGRhNywgTCJ0YXJnZXQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRGVsdGFfVGFyZ2V0LCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRGVsdGE6OmN1cnJlbnRWYWx1ZSwgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwKKyAgICAgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg5NDI2NDNmMCwgTCJzYXZlZFZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9EZWx0YTo6c2F2ZWRWYWx1ZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhjOGRhNGRhNywgTCJ0YXJnZXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0RlbHRhOjp0YXJnZXQsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBlcmFOYW1lcyAqLworCisgICAgLyogbW9kaWZ5QW5ub3RzICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHN0YXJ0Tm9kZSAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhkNGNjNTNmOCwgTCJoaWdobGlnaHQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9IaWdobGlnaHQsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NTUxOGMyNSwgTCJicmVhayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0JyZWFrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NTcwY2U4MzUsIEwicHJlc2VuY2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4OGUxYzI5MjEsIEwicmVsZXZhbnQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGQ5OTZmYTliLCBMImhhbmQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9IYW5kLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg3OCwgTCJ4IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfWCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NzksIEwieSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1ksIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDMxYjE5YzEsIEwibmFtZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDMxYjE5YzEsIEwibmFtZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGJ1dHRvbiAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9CdXR0b246OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0J1dHRvbjo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhkNGNjNTNmOCwgTCJoaWdobGlnaHQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0J1dHRvbjo6aGlnaGxpZ2h0LAorICAgICBYRkFfQXR0cmlidXRlOjpIaWdobGlnaHQsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBmb3JtYXQgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRm9ybWF0Ojp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Gb3JtYXQ6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBib3JkZXIgKi8KKyAgICB7MHg1NTE4YzI1LCBMImJyZWFrIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Cb3JkZXI6OmJyZWFrVmFsdWUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkJyZWFrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Cb3JkZXI6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDU3MGNlODM1LCBMInByZXNlbmNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Cb3JkZXI6OnByZXNlbmNlLAorICAgICBYRkFfQXR0cmlidXRlOjpQcmVzZW5jZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQm9yZGVyOjpyZWxldmFudCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UmVsZXZhbnQsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQm9yZGVyOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGQ5OTZmYTliLCBMImhhbmQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0JvcmRlcjo6aGFuZCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6SGFuZCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGFyZWEgKi8KKyAgICB7MHg3OCwgTCJ4IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9BcmVhOjp4LCBYRkFfQXR0cmlidXRlOjpYLAorICAgICBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDc5LCBMInkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0FyZWE6OnksIFhGQV9BdHRyaWJ1dGU6OlksCisgICAgIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4MjFhZWQsIEwiaWQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0FyZWE6OmlkLCBYRkFfQXR0cmlidXRlOjpJZCwKKyAgICAgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHgzMWIxOWMxLCBMIm5hbWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0FyZWE6Om5hbWUsCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0FyZWE6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDEwNTllYzE4LCBMImxldmVsIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9JbnRlZ2VyLAotICAgICBYRkFfQVRUUklCVVRFX0xldmVsLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1JlbGV2YW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhhYzA2ZTJiMCwgTCJjb2xTcGFuIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfQ29sU3BhbiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9JbnRlZ2VyLAorICAgICBYRkFfQXR0cmlidXRlOjpMZXZlbCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQXJlYTo6cmVsZXZhbnQsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlJlbGV2YW50LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGFjMDZlMmIwLCBMImNvbFNwYW4iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0FyZWE6OmNvbFNwYW4sCisgICAgIFhGQV9BdHRyaWJ1dGU6OkNvbFNwYW4sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQXJlYTo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogaHlwaGVuYXRpb24gKi8KICAgICB7MHgyMWFlZCwgTCJpZCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0lkLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpJZCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDJmMTA1ZjcyLCBMIndvcmRDaGFyYWN0ZXJDb3VudCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1dvcmRDaGFyYWN0ZXJDb3VudCwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6V29yZENoYXJhY3RlckNvdW50LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDNkMTIzYzI2LCBMImh5cGhlbmF0ZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0h5cGhlbmF0ZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6SHlwaGVuYXRlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDY2NTM5YzQ4LCBMImV4Y2x1ZGVJbml0aWFsQ2FwIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRXhjbHVkZUluaXRpYWxDYXAsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkV4Y2x1ZGVJbml0aWFsQ2FwLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDZhOTVjOTc2LCBMInB1c2hDaGFyYWN0ZXJDb3VudCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1B1c2hDaGFyYWN0ZXJDb3VudCwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UHVzaENoYXJhY3RlckNvdW50LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDk4MmJkODkyLCBMInJlbWFpbkNoYXJhY3RlckNvdW50IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfUmVtYWluQ2hhcmFjdGVyQ291bnQsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlJlbWFpbkNoYXJhY3RlckNvdW50LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGU1Yzk2ZDZhLCBMImV4Y2x1ZGVBbGxDYXBzIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRXhjbHVkZUFsbENhcHMsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg4YWYyZTY1NywgTCJtYXhDaGFycyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX01heENoYXJzLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpFeGNsdWRlQWxsQ2FwcywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHRleHQgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfVGV4dDo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4OGFmMmU2NTcsIEwibWF4Q2hhcnMiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1RleHQ6Om1heENoYXJzLAorICAgICBYRkFfQXR0cmlidXRlOjpNYXhDaGFycywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1RleHQ6OmRlZmF1bHRWYWx1ZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9UZXh0Ojp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9UZXh0Ojp2YWx1ZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHRpbWUgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfVGltZTo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9UaW1lOjpkZWZhdWx0VmFsdWUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfVGltZTo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfVGltZTo6dmFsdWUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiB0eXBlICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIG92ZXJwcmludCAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MGNkMywgTCJ1cmwiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9VcmwsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGNlcnRpZmljYXRlcyAqLworICAgIHsweGMwODBjZDMsIEwidXJsIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9DZXJ0aWZpY2F0ZXM6OnVybCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXJsLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9DZXJ0aWZpY2F0ZXM6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGE2NzEwMjYyLCBMImNyZWRlbnRpYWxTZXJ2ZXJQb2xpY3kiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9DcmVkZW50aWFsU2VydmVyUG9saWN5LCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQ2VydGlmaWNhdGVzOjpjcmVkZW50aWFsU2VydmVyUG9saWN5LAorICAgICBYRkFfQXR0cmlidXRlOjpDcmVkZW50aWFsU2VydmVyUG9saWN5LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0NlcnRpZmljYXRlczo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhjMmJhMDkyMywgTCJ1cmxQb2xpY3kiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9VcmxQb2xpY3ksIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0NlcnRpZmljYXRlczo6dXJsUG9saWN5LAorICAgICBYRkFfQXR0cmlidXRlOjpVcmxQb2xpY3ksIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBlbmNyeXB0aW9uTWV0aG9kcyAqLwogICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4MmYxNmEzODIsIEwidHlwZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlR5cGUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBzZXRQcm9wZXJ0eSAqLwogICAgIHsweDQ3ZDAzNDkwLCBMImNvbm5lY3Rpb24iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjOGRhNGRhNywgTCJ0YXJnZXQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9UYXJnZXQsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1NldFByb3BlcnR5Ojpjb25uZWN0aW9uLAorICAgICBYRkFfQXR0cmlidXRlOjpDb25uZWN0aW9uLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGM4ZGE0ZGE3LCBMInRhcmdldCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU2V0UHJvcGVydHk6OnRhcmdldCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VGFyZ2V0LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogcHJpbnRlck5hbWUgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogc3RhcnRQYWdlICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHBhZ2VPZmZzZXQgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGRhdGVUaW1lICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0RhdGVUaW1lOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0RhdGVUaW1lOjpkZWZhdWx0VmFsdWUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRGF0ZVRpbWU6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0RhdGVUaW1lOjp2YWx1ZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGNvbWIgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQ29tYjo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4NzhiZmY1MzEsIEwibnVtYmVyT2ZDZWxscyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfSW50ZWdlciwKLSAgICAgWEZBX0FUVFJJQlVURV9OdW1iZXJPZkNlbGxzLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQ29tYjo6bnVtYmVyT2ZDZWxscywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TnVtYmVyT2ZDZWxscywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Db21iOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogcGF0dGVybiAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9QYXR0ZXJuOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9QYXR0ZXJuOjp0eXBlLAorICAgICBYRkFfQXR0cmlidXRlOjpUeXBlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1BhdHRlcm46OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBpZkVtcHR5ICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHN1cHByZXNzQmFubmVyICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIG91dHB1dEJpbiAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NjgsIEwiaCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0gsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDc3LCBMInciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9XLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg3OCwgTCJ4IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfWCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NzksIEwieSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1ksIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDIyODJjNzMsIEwiaEFsaWduIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfSEFsaWduLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBmaWVsZCAqLworICAgIHsweDY4LCBMImgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZpZWxkOjpoLCBYRkFfQXR0cmlidXRlOjpILAorICAgICBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDc3LCBMInciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZpZWxkOjp3LCBYRkFfQXR0cmlidXRlOjpXLAorICAgICBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDc4LCBMIngiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZpZWxkOjp4LCBYRkFfQXR0cmlidXRlOjpYLAorICAgICBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDc5LCBMInkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZpZWxkOjp5LCBYRkFfQXR0cmlidXRlOjpZLAorICAgICBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDIyODJjNzMsIEwiaEFsaWduIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9GaWVsZDo6aEFsaWduLAorICAgICBYRkFfQXR0cmlidXRlOjpIQWxpZ24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZpZWxkOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHgxYWJiZDdlMCwgTCJkYXRhTm9kZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGF0YU5vZGUsIC0xLAotICAgICBYRkFfU0NSSVBUX09iamVjdH0sCi0gICAgezB4MjU4Mzk4NTIsIEwiYWNjZXNzIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfQWNjZXNzLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHgyZWU3Njc4ZiwgTCJyb3RhdGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Sb3RhdGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDNiMWRkZDA2LCBMImZpbGxDb2xvciIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRmlsbENvbG9yLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfU29tX0RhdGFOb2RlLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6T2JqZWN0fSwKKyAgICB7MHgyNTgzOTg1MiwgTCJhY2Nlc3MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZpZWxkOjphY2Nlc3MsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkFjY2VzcywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHgyZWU3Njc4ZiwgTCJyb3RhdGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZpZWxkOjpyb3RhdGUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlJvdGF0ZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHgzYjFkZGQwNiwgTCJmaWxsQ29sb3IiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZpZWxkOjpmaWxsQ29sb3IsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4NTRjMzk5ZTMsIEwiZm9ybWF0dGVkVmFsdWUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRm9ybWF0dGVkVmFsdWUsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg1NzBjZTgzNSwgTCJwcmVzZW5jZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9GaWVsZDo6Zm9ybWF0dGVkVmFsdWUsIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sCisgICAgIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4NTcwY2U4MzUsIEwicHJlc2VuY2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZpZWxkOjpwcmVzZW5jZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UHJlc2VuY2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4NWEzYjM3NWQsIEwiYm9yZGVyQ29sb3IiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0JvcmRlckNvbG9yLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NWU5MzZlZDYsIEwiZm9udENvbG9yIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9Gb250Q29sb3IsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9GaWVsZDo6Ym9yZGVyQ29sb3IsIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sCisgICAgIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4NWU5MzZlZDYsIEwiZm9udENvbG9yIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9GaWVsZDo6Zm9udENvbG9yLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDY4MjZjNDA4LCBMInBhcmVudFN1YmZvcm0iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfUGFyZW50U3ViZm9ybSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZpZWxkOjpwYXJlbnRTdWJmb3JtLCBYRkFfQXR0cmlidXRlOjpVbmtub3duLAorICAgICBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDc5YjY3NDM0LCBMIm1hbmRhdG9yeU1lc3NhZ2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX01hbmRhdG9yeU1lc3NhZ2UsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg3YTdjYzM0MSwgTCJ2QWxpZ24iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9WQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDdjMmZmNmFlLCBMIm1heEgiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9NYXhILCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg3YzJmZjZiZCwgTCJtYXhXIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTWF4VywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4N2QwMjM1NmMsIEwibWluSCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX01pbkgsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDdkMDIzNTdiLCBMIm1pblciLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9NaW5XLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg4NWZkNmZhZiwgTCJtYW5kYXRvcnkiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX01hbmRhdG9yeSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDhlMWMyOTIxLCBMInJlbGV2YW50IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZpZWxkOjptYW5kYXRvcnlNZXNzYWdlLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDdhN2NjMzQxLCBMInZBbGlnbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRmllbGQ6OnZBbGlnbiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VkFsaWduLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDdjMmZmNmFlLCBMIm1heEgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZpZWxkOjptYXhILAorICAgICBYRkFfQXR0cmlidXRlOjpNYXhILCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDdjMmZmNmJkLCBMIm1heFciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZpZWxkOjptYXhXLAorICAgICBYRkFfQXR0cmlidXRlOjpNYXhXLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDdkMDIzNTZjLCBMIm1pbkgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZpZWxkOjptaW5ILAorICAgICBYRkFfQXR0cmlidXRlOjpNaW5ILCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDdkMDIzNTdiLCBMIm1pblciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZpZWxkOjptaW5XLAorICAgICBYRkFfQXR0cmlidXRlOjpNaW5XLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDg1ZmQ2ZmFmLCBMIm1hbmRhdG9yeSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRmllbGQ6Om1hbmRhdG9yeSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRmllbGQ6OnJlbGV2YW50LAorICAgICBYRkFfQXR0cmlidXRlOjpSZWxldmFudCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHg5NjRmYjQyZSwgTCJmb3JtYXRNZXNzYWdlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX0Zvcm1hdE1lc3NhZ2UsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhhMDNjZjYyNywgTCJyYXdWYWx1ZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9GaWVsZDo6Zm9ybWF0TWVzc2FnZSwgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwKKyAgICAgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhhMDNjZjYyNywgTCJyYXdWYWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRmllbGQ6OnJhd1ZhbHVlLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRmllbGQ6OmRlZmF1bHRWYWx1ZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhhNjBkZDIwMiwgTCJsZW5ndGgiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfTGVuZ3RoLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YWMwNmUyYjAsIEwiY29sU3BhbiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0NvbFNwYW4sIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzhmYTM1MCwgTCJsb2NhbGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NhbGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMyYmQ0MGZkLCBMImFuY2hvclR5cGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjNGZlZDA5YiwgTCJhY2Nlc3NLZXkiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9BY2Nlc3NLZXksIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0ZpZWxkX0xlbmd0aCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhhYzA2ZTJiMCwgTCJjb2xTcGFuIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9GaWVsZDo6Y29sU3BhbiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6Q29sU3BhbiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9GaWVsZDo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzhmYTM1MCwgTCJsb2NhbGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZpZWxkOjpsb2NhbGUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2FsZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhjMmJkNDBmZCwgTCJhbmNob3JUeXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9GaWVsZDo6YW5jaG9yVHlwZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6QW5jaG9yVHlwZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhjNGZlZDA5YiwgTCJhY2Nlc3NLZXkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZpZWxkOjphY2Nlc3NLZXksCisgICAgIFhGQV9BdHRyaWJ1dGU6OkFjY2Vzc0tleSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhjYWJmYTNkMCwgTCJ2YWxpZGF0aW9uTWVzc2FnZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fVmFsaWRhdGlvbk1lc3NhZ2UsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhkY2VjZDY2MywgTCJlZGl0VmFsdWUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRmllbGRfRWRpdFZhbHVlLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRmllbGQ6OnZhbGlkYXRpb25NZXNzYWdlLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGRjZWNkNjYzLCBMImVkaXRWYWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRmllbGQ6OmVkaXRWYWx1ZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhlMDdlNTA2MSwgTCJzZWxlY3RlZEluZGV4IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0ZpZWxkX1NlbGVjdGVkSW5kZXgsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9GaWVsZDo6c2VsZWN0ZWRJbmRleCwgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwKKyAgICAgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNjVlMzRiZSwgTCJib3JkZXJXaWR0aCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fQm9yZGVyV2lkdGgsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9GaWVsZDo6Ym9yZGVyV2lkdGgsIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sCisgICAgIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBhZ2VudCAqLwogICAgIHsweDMxYjE5YzEsIEwibmFtZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIG91dHB1dFhTTCAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBhZGp1c3REYXRhICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGF1dG9TYXZlICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDY4LCBMImgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9ILCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg3NywgTCJ3IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NzgsIEwieCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1gsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDc5LCBMInkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9ZLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGNvbnRlbnRBcmVhICovCisgICAgezB4NjgsIEwiaCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6SCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg3NywgTCJ3IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpXLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDc4LCBMIngiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0NvbnRlbnRBcmVhOjp4LCBYRkFfQXR0cmlidXRlOjpYLAorICAgICBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDc5LCBMInkiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0NvbnRlbnRBcmVhOjp5LCBYRkFfQXR0cmlidXRlOjpZLAorICAgICBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Db250ZW50QXJlYTo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4OGUxYzI5MjEsIEwicmVsZXZhbnQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0NvbnRlbnRBcmVhOjpyZWxldmFudCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UmVsZXZhbnQsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQ29udGVudEFyZWE6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBldmVudFBzZXVkb01vZGVsICovCiAgICAgezB4ZDg0Mzc5OCwgTCJmdWxsVGV4dCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OkZ1bGxUZXh0LCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRXZlbnRQc2V1ZG9Nb2RlbDo6ZnVsbFRleHQsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4MWI2ZDFjZjUsIEwicmVlbnRlciIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlJlZW50ZXIsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FdmVudFBzZXVkb01vZGVsOjpyZWVudGVyLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDFlNmZmYTlhLCBMInByZXZDb250ZW50VHlwZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OlByZXZDb250ZW50VHlwZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V2ZW50UHNldWRvTW9kZWw6OnByZXZDb250ZW50VHlwZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHgyNWEzYzIwNiwgTCJzb2FwRmF1bHRTdHJpbmciLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTb2FwRmF1bHRTdHJpbmcsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FdmVudFBzZXVkb01vZGVsOjpzb2FwRmF1bHRTdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4MmUwMGMwMDcsIEwibmV3Q29udGVudFR5cGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpOZXdDb250ZW50VHlwZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V2ZW50UHNldWRvTW9kZWw6Om5ld0NvbnRlbnRUeXBlLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDQ1NzA1MDBmLCBMIm1vZGlmaWVyIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6TW9kaWZpZXIsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FdmVudFBzZXVkb01vZGVsOjptb2RpZmllciwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHg1MGUyZTMzYiwgTCJzZWxFbmQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTZWxFbmQsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FdmVudFBzZXVkb01vZGVsOjpzZWxFbmQsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4NTdkZTg3YzIsIEwicHJldlRleHQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpQcmV2VGV4dCwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V2ZW50UHNldWRvTW9kZWw6OnByZXZUZXh0LAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDZlYTA0ZTBhLCBMInNvYXBGYXVsdENvZGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTb2FwRmF1bHRDb2RlLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRXZlbnRQc2V1ZG9Nb2RlbDo6c29hcEZhdWx0Q29kZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHg2ZjY1NTZjZiwgTCJuZXdUZXh0IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6TmV3VGV4dCwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V2ZW50UHNldWRvTW9kZWw6Om5ld1RleHQsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ODkxZjQ2MDYsIEwiY2hhbmdlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6Q2hhbmdlLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4OGZhM2MxOWUsIEwic2hpZnQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpTaGlmdCwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V2ZW50UHNldWRvTW9kZWw6OmNoYW5nZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg4ZmEzYzE5ZSwgTCJzaGlmdCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRXZlbnRQc2V1ZG9Nb2RlbDo6c2hpZnQsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YTlkOWIyZTEsIEwia2V5RG93biIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0V2ZW50UHNldWRvTW9kZWw6OktleURvd24sIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FdmVudFBzZXVkb01vZGVsOjprZXlEb3duLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGJmYzg5ZGIyLCBMInNlbFN0YXJ0IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6U2VsU3RhcnQsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FdmVudFBzZXVkb01vZGVsOjpzZWxTdGFydCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhjMzJhNTgxMiwgTCJjb21taXRLZXkiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9FdmVudFBzZXVkb01vZGVsOjpDb21taXRLZXksIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FdmVudFBzZXVkb01vZGVsOjpjb21taXRLZXksCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YzhkYTRkYTcsIEwidGFyZ2V0IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRXZlbnRQc2V1ZG9Nb2RlbDo6VGFyZ2V0LCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V2ZW50UHNldWRvTW9kZWw6OnRhcmdldCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHdzZGxBZGRyZXNzICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1dzZGxBZGRyZXNzOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Xc2RsQWRkcmVzczo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHNvbGlkICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1NvbGlkOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Tb2xpZDo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGRhdGVUaW1lU3ltYm9scyAqLworCisgICAgLyogZW5jcnlwdGlvbkxldmVsICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhhMmUzNTE0LCBMImNhcCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0NhcCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDUzOTJlYTU4LCBMInN0cm9rZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1N0cm9rZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NTcwY2U4MzUsIEwicHJlc2VuY2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4OTQ0NDZkY2MsIEwidGhpY2tuZXNzIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVGhpY2tuZXNzLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDFlYzhhYjJjLCBMInJhdGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9SYXRlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBlZGdlICovCisgICAgezB4YTJlMzUxNCwgTCJjYXAiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0VkZ2U6OmNhcCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6Q2FwLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FZGdlOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg1MzkyZWE1OCwgTCJzdHJva2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0VkZ2U6OnN0cm9rZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6U3Ryb2tlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDU3MGNlODM1LCBMInByZXNlbmNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FZGdlOjpwcmVzZW5jZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UHJlc2VuY2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4OTQ0NDZkY2MsIEwidGhpY2tuZXNzIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FZGdlOjp0aGlja25lc3MsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlRoaWNrbmVzcywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FZGdlOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogc3RpcHBsZSAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TdGlwcGxlOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHgxZWM4YWIyYywgTCJyYXRlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TdGlwcGxlOjpyYXRlLAorICAgICBYRkFfQXR0cmlidXRlOjpSYXRlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1N0aXBwbGU6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBhdHRyaWJ1dGVzICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHZlcnNpb25Db250cm9sICovCiAgICAgezB4N2IyOTYzMGEsIEwic291cmNlQmVsb3ciLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Tb3VyY2VCZWxvdywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6U291cmNlQmVsb3csIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4OGZjMzZjMGEsIEwib3V0cHV0QmVsb3ciLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9PdXRwdXRCZWxvdywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6T3V0cHV0QmVsb3csIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZTk5NmIyZmUsIEwic291cmNlQWJvdmUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Tb3VyY2VBYm92ZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6U291cmNlQWJvdmUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg2OCwgTCJoIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfSCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NzcsIEwidyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1csIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDc4LCBMIngiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9YLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg3OSwgTCJ5IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfWSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4MjI4MmM3MywgTCJoQWxpZ24iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9IQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIG1lcmlkaWVtICovCisKKyAgICAvKiBleGNsR3JvdXAgKi8KKyAgICB7MHg2OCwgTCJoIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FeGNsR3JvdXA6OmgsIFhGQV9BdHRyaWJ1dGU6OkgsCisgICAgIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4NzcsIEwidyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRXhjbEdyb3VwOjp3LCBYRkFfQXR0cmlidXRlOjpXLAorICAgICBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDc4LCBMIngiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V4Y2xHcm91cDo6eCwgWEZBX0F0dHJpYnV0ZTo6WCwKKyAgICAgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg3OSwgTCJ5IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FeGNsR3JvdXA6OnksIFhGQV9BdHRyaWJ1dGU6OlksCisgICAgIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4MjI4MmM3MywgTCJoQWxpZ24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V4Y2xHcm91cDo6aEFsaWduLAorICAgICBYRkFfQXR0cmlidXRlOjpIQWxpZ24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V4Y2xHcm91cDo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjIzMzMyZiwgTCJlcnJvclRleHQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRXhjbEdyb3VwX0Vycm9yVGV4dCwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0V4Y2xHcm91cF9FcnJvclRleHQsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4MWFiYmQ3ZTAsIEwiZGF0YU5vZGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RhdGFOb2RlLCAtMSwKLSAgICAgWEZBX1NDUklQVF9PYmplY3R9LAotICAgIHsweDI1ODM5ODUyLCBMImFjY2VzcyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0FjY2VzcywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfU29tX0RhdGFOb2RlLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6T2JqZWN0fSwKKyAgICB7MHgyNTgzOTg1MiwgTCJhY2Nlc3MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V4Y2xHcm91cDo6YWNjZXNzLAorICAgICBYRkFfQXR0cmlidXRlOjpBY2Nlc3MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4M2IxZGRkMDYsIEwiZmlsbENvbG9yIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9GaWxsQ29sb3IsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg1NzBjZTgzNSwgTCJwcmVzZW5jZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FeGNsR3JvdXA6OmZpbGxDb2xvciwgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwKKyAgICAgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg1NzBjZTgzNSwgTCJwcmVzZW5jZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRXhjbEdyb3VwOjpwcmVzZW5jZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UHJlc2VuY2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4NWEzYjM3NWQsIEwiYm9yZGVyQ29sb3IiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0JvcmRlckNvbG9yLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRXhjbEdyb3VwOjpib3JkZXJDb2xvciwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHg3OWI2NzQzNCwgTCJtYW5kYXRvcnlNZXNzYWdlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9NYW5kYXRvcnlNZXNzYWdlLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4N2E3Y2MzNDEsIEwidkFsaWduIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVkFsaWduLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg3YzJmZjZhZSwgTCJtYXhIIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTWF4SCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4N2MyZmY2YmQsIEwibWF4VyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX01heFcsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDdkMDIzNTZjLCBMIm1pbkgiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9NaW5ILCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg3ZDAyMzU3YiwgTCJtaW5XIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTWluVywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4N2U3ZTg0NWUsIEwibGF5b3V0IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTGF5b3V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FeGNsR3JvdXA6Om1hbmRhdG9yeU1lc3NhZ2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4N2E3Y2MzNDEsIEwidkFsaWduIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FeGNsR3JvdXA6OnZBbGlnbiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VkFsaWduLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDdjMmZmNmFlLCBMIm1heEgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V4Y2xHcm91cDo6bWF4SCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TWF4SCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg3YzJmZjZiZCwgTCJtYXhXIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FeGNsR3JvdXA6Om1heFcsCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok1heFcsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4N2QwMjM1NmMsIEwibWluSCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRXhjbEdyb3VwOjptaW5ILAorICAgICBYRkFfQXR0cmlidXRlOjpNaW5ILCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDdkMDIzNTdiLCBMIm1pblciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V4Y2xHcm91cDo6bWluVywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TWluVywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg3ZTdlODQ1ZSwgTCJsYXlvdXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V4Y2xHcm91cDo6bGF5b3V0LAorICAgICBYRkFfQXR0cmlidXRlOjpMYXlvdXQsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ODQ2NTk5ZjgsIEwidHJhbnNpZW50IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9UcmFuc2llbnQsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FeGNsR3JvdXA6OnRyYW5zaWVudCwgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwKKyAgICAgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHg4NWZkNmZhZiwgTCJtYW5kYXRvcnkiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX01hbmRhdG9yeSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDhlMWMyOTIxLCBMInJlbGV2YW50IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGEwM2NmNjI3LCBMInJhd1ZhbHVlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9EZWZhdWx0QW5kUmF3VmFsdWUsCi0gICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FeGNsR3JvdXA6Om1hbmRhdG9yeSwgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwKKyAgICAgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRXhjbEdyb3VwOjpyZWxldmFudCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UmVsZXZhbnQsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YTAzY2Y2MjcsIEwicmF3VmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V4Y2xHcm91cDo6cmF3VmFsdWUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0V4Y2xHcm91cF9EZWZhdWx0QW5kUmF3VmFsdWUsCi0gICAgIC0xLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhhYzA2ZTJiMCwgTCJjb2xTcGFuIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfQ29sU3BhbiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V4Y2xHcm91cDo6ZGVmYXVsdFZhbHVlLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGFjMDZlMmIwLCBMImNvbFNwYW4iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V4Y2xHcm91cDo6Y29sU3BhbiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6Q29sU3BhbiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FeGNsR3JvdXA6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YzJiZDQwZmQsIEwiYW5jaG9yVHlwZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0FuY2hvclR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V4Y2xHcm91cDo6YW5jaG9yVHlwZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6QW5jaG9yVHlwZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhjNGZlZDA5YiwgTCJhY2Nlc3NLZXkiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9BY2Nlc3NLZXksIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V4Y2xHcm91cDo6YWNjZXNzS2V5LAorICAgICBYRkFfQXR0cmlidXRlOjpBY2Nlc3NLZXksIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4Y2FiZmEzZDAsIEwidmFsaWRhdGlvbk1lc3NhZ2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX1ZhbGlkYXRpb25NZXNzYWdlLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRXhjbEdyb3VwOjp2YWxpZGF0aW9uTWVzc2FnZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNjVlMzRiZSwgTCJib3JkZXJXaWR0aCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fQm9yZGVyV2lkdGgsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V4Y2xHcm91cDo6Ym9yZGVyV2lkdGgsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiB0b29sVGlwICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1Rvb2xUaXA6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1Rvb2xUaXA6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBjb21wcmVzcyAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGVkYTkwMTdhLCBMInNjb3BlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfU2NvcGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlNjb3BlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiByZWFzb24gKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUmVhc29uOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9SZWFzb246OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBleGVjdXRlICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V4ZWN1dGU6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDQ3ZDAzNDkwLCBMImNvbm5lY3Rpb24iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg2Y2ZhODI4YSwgTCJydW5BdCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1J1bkF0LCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FeGVjdXRlOjpjb25uZWN0aW9uLAorICAgICBYRkFfQXR0cmlidXRlOjpDb25uZWN0aW9uLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDZjZmE4MjhhLCBMInJ1bkF0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FeGVjdXRlOjpydW5BdCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UnVuQXQsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YTFiMGQyZjUsIEwiZXhlY3V0ZVR5cGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9FeGVjdXRlVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V4ZWN1dGU6OmV4ZWN1dGVUeXBlLAorICAgICBYRkFfQXR0cmlidXRlOjpFeGVjdXRlVHlwZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FeGVjdXRlOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogY29udGVudENvcHkgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBkYXRlVGltZUVkaXQgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRGF0ZVRpbWVFZGl0Ojp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9EYXRlVGltZUVkaXQ6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZTZmOTk0ODcsIEwiaFNjcm9sbFBvbGljeSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0hTY3JvbGxQb2xpY3ksIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0RhdGVUaW1lRWRpdDo6aFNjcm9sbFBvbGljeSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6SFNjcm9sbFBvbGljeSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGNvbmZpZyAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogaW1hZ2UgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfSW1hZ2U6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDQyZmVkMWZkLCBMImNvbnRlbnRUeXBlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ltYWdlOjpjb250ZW50VHlwZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6Q29udGVudFR5cGUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4NTRmYTcyMmMsIEwidHJhbnNmZXJFbmNvZGluZyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlX1JlYWQsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4ZDE3MWIyNDAsIEwiYXNwZWN0IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfQXNwZWN0LCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9JbWFnZTo6dHJhbnNmZXJFbmNvZGluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VHJhbnNmZXJFbmNvZGluZywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ltYWdlOjpkZWZhdWx0VmFsdWUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfSW1hZ2U6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4ZDE3MWIyNDAsIEwiYXNwZWN0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9JbWFnZTo6YXNwZWN0LAorICAgICBYRkFfQXR0cmlidXRlOjpBc3BlY3QsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ltYWdlOjp2YWx1ZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhkYjU1ZmVjNSwgTCJocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9JbWFnZTo6aHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6SHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qICN4SFRNTCAqLwogICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWVfUmVhZCwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGRiNTVmZWM1LCBMImhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9IcmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1ZhbHVlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpWYWx1ZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIG51bWJlck9mQ29waWVzICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBiZWhhdmlvck92ZXJyaWRlICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4MmYxNmEzODIsIEwidHlwZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDdmNmZkM2Q3LCBMInNlcnZlciIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1NlcnZlciwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogdGltZVN0YW1wICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1RpbWVTdGFtcDo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4MmYxNmEzODIsIEwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfVGltZVN0YW1wOjp0eXBlLAorICAgICBYRkFfQXR0cmlidXRlOjpUeXBlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDdmNmZkM2Q3LCBMInNlcnZlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfVGltZVN0YW1wOjpzZXJ2ZXIsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlNlcnZlciwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9UaW1lU3RhbXA6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBtb250aCAqLworCisgICAgLyogdmlld2VyUHJlZmVyZW5jZXMgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogc2NyaXB0TW9kZWwgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGRlY2ltYWwgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRGVjaW1hbDo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4NGI4YmM4NDAsIEwiZnJhY0RpZ2l0cyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0ZyYWNEaWdpdHMsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0RlY2ltYWw6OmZyYWNEaWdpdHMsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkZyYWNEaWdpdHMsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0RlY2ltYWw6OmRlZmF1bHRWYWx1ZSwgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwKKyAgICAgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9EZWNpbWFsOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9EZWNpbWFsOjp2YWx1ZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhkZTdmOTJiYSwgTCJsZWFkRGlnaXRzIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTGVhZERpZ2l0cywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NjgsIEwiaCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0gsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDc3LCBMInciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9XLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg3OCwgTCJ4IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfWCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NzksIEwieSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1ksIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDIyODJjNzMsIEwiaEFsaWduIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfSEFsaWduLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRGVjaW1hbDo6bGVhZERpZ2l0cywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TGVhZERpZ2l0cywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHN1YmZvcm0gKi8KKyAgICB7MHg2OCwgTCJoIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TdWJmb3JtOjpoLCBYRkFfQXR0cmlidXRlOjpILAorICAgICBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDc3LCBMInciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1N1YmZvcm06OncsIFhGQV9BdHRyaWJ1dGU6OlcsCisgICAgIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4NzgsIEwieCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU3ViZm9ybTo6eCwgWEZBX0F0dHJpYnV0ZTo6WCwKKyAgICAgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg3OSwgTCJ5IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TdWJmb3JtOjp5LCBYRkFfQXR0cmlidXRlOjpZLAorICAgICBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDIyODJjNzMsIEwiaEFsaWduIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TdWJmb3JtOjpoQWxpZ24sCisgICAgIFhGQV9BdHRyaWJ1dGU6OkhBbGlnbiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU3ViZm9ybTo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4MTQxNGQ0MzEsIEwiYWxsb3dNYWNybyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0FsbG93TWFjcm8sIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1N1YmZvcm06OmFsbG93TWFjcm8sCisgICAgIFhGQV9BdHRyaWJ1dGU6OkFsbG93TWFjcm8sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4MTUxN2RmYTEsIEwiY29sdW1uV2lkdGhzIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfQ29sdW1uV2lkdGhzLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TdWJmb3JtOjpjb2x1bW5XaWR0aHMsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkNvbHVtbldpZHRocywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHgxYWJiZDdlMCwgTCJkYXRhTm9kZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGF0YU5vZGUsIC0xLAotICAgICBYRkFfU0NSSVBUX09iamVjdH0sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfU29tX0RhdGFOb2RlLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6T2JqZWN0fSwKICAgICB7MHgxZWUyZDI0ZCwgTCJpbnN0YW5jZUluZGV4IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9JbnN0YW5jZUluZGV4LCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU3ViZm9ybTo6aW5zdGFuY2VJbmRleCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHgyNTgzOTg1MiwgTCJhY2Nlc3MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9BY2Nlc3MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisKKyAgICAgWEZBX0F0dHJpYnV0ZTo6QWNjZXNzLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDNiMWRkZDA2LCBMImZpbGxDb2xvciIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRmlsbENvbG9yLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NTcwY2U4MzUsIEwicHJlc2VuY2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfU29tX0ZpbGxDb2xvciwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg1NzBjZTgzNSwgTCJwcmVzZW5jZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU3ViZm9ybTo6cHJlc2VuY2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlByZXNlbmNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDVhM2IzNzVkLCBMImJvcmRlckNvbG9yIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9Cb3JkZXJDb2xvciwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDdhN2NjMzQxLCBMInZBbGlnbiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1ZBbGlnbiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4N2MyZmY2YWUsIEwibWF4SCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX01heEgsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDdjMmZmNmJkLCBMIm1heFciLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9NYXhXLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg3ZDAyMzU2YywgTCJtaW5IIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTWluSCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4N2QwMjM1N2IsIEwibWluVyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX01pblcsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDdlN2U4NDVlLCBMImxheW91dCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0xheW91dCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4OGUxYzI5MjEsIEwicmVsZXZhbnQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfU29tX0JvcmRlckNvbG9yLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDdhN2NjMzQxLCBMInZBbGlnbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU3ViZm9ybTo6dkFsaWduLAorICAgICBYRkFfQXR0cmlidXRlOjpWQWxpZ24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4N2MyZmY2YWUsIEwibWF4SCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU3ViZm9ybTo6bWF4SCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TWF4SCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg3YzJmZjZiZCwgTCJtYXhXIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TdWJmb3JtOjptYXhXLAorICAgICBYRkFfQXR0cmlidXRlOjpNYXhXLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDdkMDIzNTZjLCBMIm1pbkgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1N1YmZvcm06Om1pbkgsCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok1pbkgsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4N2QwMjM1N2IsIEwibWluVyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU3ViZm9ybTo6bWluVywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TWluVywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg3ZTdlODQ1ZSwgTCJsYXlvdXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1N1YmZvcm06OmxheW91dCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TGF5b3V0LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDhlMWMyOTIxLCBMInJlbGV2YW50IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TdWJmb3JtOjpyZWxldmFudCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UmVsZXZhbnQsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4OWNjMTdkNzUsIEwibWVyZ2VNb2RlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTWVyZ2VNb2RlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok1lcmdlTW9kZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHg5ZjNlOTUxMCwgTCJpbnN0YW5jZU1hbmFnZXIiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9JbnN0YW5jZU1hbmFnZXIsIC0xLAotICAgICBYRkFfU0NSSVBUX09iamVjdH0sCi0gICAgezB4YWMwNmUyYjAsIEwiY29sU3BhbiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0NvbFNwYW4sIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzhmYTM1MCwgTCJsb2NhbGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU3ViZm9ybV9Mb2NhbGUsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9TdWJmb3JtX0luc3RhbmNlTWFuYWdlciwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6Ok9iamVjdH0sCisgICAgezB4YWMwNmUyYjAsIEwiY29sU3BhbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU3ViZm9ybTo6Y29sU3BhbiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6Q29sU3BhbiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TdWJmb3JtOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjOGZhMzUwLCBMImxvY2FsZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU3ViZm9ybTo6bG9jYWxlLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGMyYmQ0MGZkLCBMImFuY2hvclR5cGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TdWJmb3JtOjphbmNob3JUeXBlLAorICAgICBYRkFfQXR0cmlidXRlOjpBbmNob3JUeXBlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGNhYmZhM2QwLCBMInZhbGlkYXRpb25NZXNzYWdlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9WYWxpZGF0aW9uTWVzc2FnZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1N1YmZvcm06OnZhbGlkYXRpb25NZXNzYWdlLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGU0YzNhNWU1LCBMInJlc3RvcmVTdGF0ZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1Jlc3RvcmVTdGF0ZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4ZWRhOTAxN2EsIEwic2NvcGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9TY29wZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU3ViZm9ybTo6cmVzdG9yZVN0YXRlLAorICAgICBYRkFfQXR0cmlidXRlOjpSZXN0b3JlU3RhdGUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4ZWRhOTAxN2EsIEwic2NvcGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1N1YmZvcm06OnNjb3BlLAorICAgICBYRkFfQXR0cmlidXRlOjpTY29wZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNjVlMzRiZSwgTCJib3JkZXJXaWR0aCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fQm9yZGVyV2lkdGgsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X1NvbV9Cb3JkZXJXaWR0aCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHNlbGVjdCAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TZWxlY3Q6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1NlbGVjdDo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHdpbmRvdyAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBsb2NhbGVTZXQgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NWE1MGU5ZTYsIEwidmVyc2lvbiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9IYW5kbGVyX1ZlcnNpb24sIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4MzFiMTljMSwgTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpOYW1lLAotICAgICAtMSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBoYW5kbGVyICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0hhbmRsZXI6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0hhbmRsZXI6OnR5cGUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlR5cGUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4NWE1MGU5ZTYsIEwidmVyc2lvbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfSGFuZGxlcjo6dmVyc2lvbiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9IYW5kbGVyOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogaG9zdFBzZXVkb01vZGVsICovCisgICAgezB4MzFiMTljMSwgTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Ib3N0UHNldWRvTW9kZWw6Om5hbWUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4NjZjMWFlOSwgTCJ2YWxpZGF0aW9uc0VuYWJsZWQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlZhbGlkYXRpb25zRW5hYmxlZCwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDE0ZDA0NTAyLCBMInRpdGxlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpUaXRsZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0hvc3RQc2V1ZG9Nb2RlbDo6dmFsaWRhdGlvbnNFbmFibGVkLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDE0ZDA0NTAyLCBMInRpdGxlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Ib3N0UHNldWRvTW9kZWw6OnRpdGxlLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDM5MmFlNDQ1LCBMInBsYXRmb3JtIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpQbGF0Zm9ybSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0hvc3RQc2V1ZG9Nb2RlbDo6cGxhdGZvcm0sCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4NWE1MGU5ZTYsIEwidmVyc2lvbiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6VmVyc2lvbiwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0hvc3RQc2V1ZG9Nb2RlbDo6dmVyc2lvbiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHg2NmNiMWVlZCwgTCJ2YXJpYXRpb24iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6OlZhcmlhdGlvbiwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0hvc3RQc2V1ZG9Nb2RlbDo6dmFyaWF0aW9uLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDc3MTdjYmM0LCBMImxhbmd1YWdlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpMYW5ndWFnZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0hvc3RQc2V1ZG9Nb2RlbDo6bGFuZ3VhZ2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ODY2OTg5NjMsIEwiYXBwVHlwZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0hvc3RQc2V1ZG9Nb2RlbDo6QXBwVHlwZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0hvc3RQc2V1ZG9Nb2RlbDo6YXBwVHlwZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHg5NGZmOWU4ZCwgTCJjYWxjdWxhdGlvbnNFbmFibGVkIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpDYWxjdWxhdGlvbnNFbmFibGVkLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfSG9zdFBzZXVkb01vZGVsOjpjYWxjdWxhdGlvbnNFbmFibGVkLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGJjZDQ0OTQwLCBMImN1cnJlbnRQYWdlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfSG9zdFBzZXVkb01vZGVsOjpDdXJyZW50UGFnZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0hvc3RQc2V1ZG9Nb2RlbDo6Y3VycmVudFBhZ2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZDU5MmI5MjAsIEwibnVtUGFnZXMiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9Ib3N0UHNldWRvTW9kZWw6Ok51bVBhZ2VzLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfSG9zdFBzZXVkb01vZGVsOjpudW1QYWdlcywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHByZXNlbmNlICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHJlY29yZCAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBlbWJlZCAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiB2ZXJzaW9uICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4MjRkODUxNjcsIEwidGltZW91dCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1RpbWVvdXQsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGNvbW1hbmQgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQ29tbWFuZDo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4MjRkODUxNjcsIEwidGltZW91dCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQ29tbWFuZDo6dGltZW91dCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VGltZW91dCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Db21tYW5kOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogY29waWVzICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHN0YXBsZSAqLwogICAgIHsweDdkOWZkN2M1LCBMIm1vZGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Nb2RlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpNb2RlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogc3VibWl0Rm9ybWF0ICovCiAgICAgezB4N2Q5ZmQ3YzUsIEwibW9kZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9TdWJtaXRGb3JtYXRfTW9kZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X1N1Ym1pdEZvcm1hdF9Nb2RlLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogYm9vbGVhbiAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Cb29sZWFuOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Cb29sZWFuOjpkZWZhdWx0VmFsdWUsIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sCisgICAgIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQm9vbGVhbjo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQm9vbGVhbjo6dmFsdWUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBtZXNzYWdlICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX01lc3NhZ2U6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX01lc3NhZ2U6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIG91dHB1dCAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBwc01hcCAqLworCisgICAgLyogZXhjbHVkZU5TICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4MjAzOGM5YjIsIEwicm9sZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1JvbGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBhc3Npc3QgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQXNzaXN0Ojp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHgyMDM4YzliMiwgTCJyb2xlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Bc3Npc3Q6OnJvbGUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlJvbGUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQXNzaXN0Ojp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogcGljdHVyZSAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9QaWN0dXJlOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9QaWN0dXJlOjpkZWZhdWx0VmFsdWUsIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sCisgICAgIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUGljdHVyZTo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1BpY3R1cmU6OnZhbHVlLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHRyYXZlcnNhbCAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9UcmF2ZXJzYWw6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1RyYXZlcnNhbDo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHNpbGVudFByaW50ICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHdlYkNsaWVudCAqLwogICAgIHsweDMxYjE5YzEsIEwibmFtZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGxheW91dFBzZXVkb01vZGVsICovCiAgICAgezB4ZmNlZjg2YjUsIEwicmVhZHkiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9MYXlvdXRQc2V1ZG9Nb2RlbDo6UmVhZHksIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9MYXlvdXRQc2V1ZG9Nb2RlbDo6cmVhZHksCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBwcm9kdWNlciAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDUzOTJlYTU4LCBMInN0cm9rZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1N0cm9rZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NTcwY2U4MzUsIEwicHJlc2VuY2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4N2I5NWU2NjEsIEwiaW52ZXJ0ZWQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9JbnZlcnRlZCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4OTQ0NDZkY2MsIEwidGhpY2tuZXNzIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVGhpY2tuZXNzLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4ZThkZGRmNTAsIEwiam9pbiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0pvaW4sIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGU5NDhiOWE4LCBMInJhZGl1cyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1JhZGl1cywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBjb3JuZXIgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQ29ybmVyOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg1MzkyZWE1OCwgTCJzdHJva2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0Nvcm5lcjo6c3Ryb2tlLAorICAgICBYRkFfQXR0cmlidXRlOjpTdHJva2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4NTcwY2U4MzUsIEwicHJlc2VuY2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0Nvcm5lcjo6cHJlc2VuY2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlByZXNlbmNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDdiOTVlNjYxLCBMImludmVydGVkIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Db3JuZXI6OmludmVydGVkLAorICAgICBYRkFfQXR0cmlidXRlOjpJbnZlcnRlZCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg5NDQ0NmRjYywgTCJ0aGlja25lc3MiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0Nvcm5lcjo6dGhpY2tuZXNzLAorICAgICBYRkFfQXR0cmlidXRlOjpUaGlja25lc3MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQ29ybmVyOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGU4ZGRkZjUwLCBMImpvaW4iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0Nvcm5lcjo6am9pbiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6Sm9pbiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhlOTQ4YjlhOCwgTCJyYWRpdXMiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0Nvcm5lcjo6cmFkaXVzLAorICAgICBYRkFfQXR0cmlidXRlOjpSYWRpdXMsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBtc2dJZCAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGFiZmE2YzRmLCBMImNTcGFjZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0NTcGFjZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVmFsdWUsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDM4NDhiM2YsIEwibmV4dCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX05leHQsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg2YTM0MDVkZCwgTCJwcmV2aW91cyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1ByZXZpb3VzLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4ZjZiNTk1NDMsIEwiaW50YWN0IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfSW50YWN0LCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBjb2xvciAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Db2xvcjo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YWJmYTZjNGYsIEwiY1NwYWNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Db2xvcjo6Y1NwYWNlLAorICAgICBYRkFfQXR0cmlidXRlOjpDU3BhY2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQ29sb3I6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0NvbG9yOjp2YWx1ZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VmFsdWUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBrZWVwICovCisgICAgezB4Mzg0OGIzZiwgTCJuZXh0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9LZWVwOjpuZXh0LAorICAgICBYRkFfQXR0cmlidXRlOjpOZXh0LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9LZWVwOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg2YTM0MDVkZCwgTCJwcmV2aW91cyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfS2VlcDo6cHJldmlvdXMsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlByZXZpb3VzLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0tlZXA6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4ZjZiNTk1NDMsIEwiaW50YWN0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9LZWVwOjppbnRhY3QsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkludGFjdCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHF1ZXJ5ICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1F1ZXJ5Ojp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHgyNjhiN2VjMSwgTCJjb21tYW5kVHlwZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0NvbW1hbmRUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJkZTlhYmRhLCBMImRhdGEiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EYXRhLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUXVlcnk6OmNvbW1hbmRUeXBlLAorICAgICBYRkFfQXR0cmlidXRlOjpDb21tYW5kVHlwZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9RdWVyeTo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGluc2VydCAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9JbnNlcnQ6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0luc2VydDo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGltYWdlRWRpdCAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9JbWFnZUVkaXQ6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ltYWdlRWRpdDo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiZGU5YWJkYSwgTCJkYXRhIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9JbWFnZUVkaXQ6OmRhdGEsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRhdGEsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiB2YWxpZGF0ZSAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9WYWxpZGF0ZTo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4NWI3MDdhMzUsIEwic2NyaXB0VGVzdCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1NjcmlwdFRlc3QsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDZiNmRkY2ZiLCBMIm51bGxUZXN0IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTnVsbFRlc3QsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9WYWxpZGF0ZTo6c2NyaXB0VGVzdCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6U2NyaXB0VGVzdCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg2YjZkZGNmYiwgTCJudWxsVGVzdCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfVmFsaWRhdGU6Om51bGxUZXN0LAorICAgICBYRkFfQXR0cmlidXRlOjpOdWxsVGVzdCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9WYWxpZGF0ZTo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhlNjRiMTEyOSwgTCJmb3JtYXRUZXN0IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRm9ybWF0VGVzdCwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfVmFsaWRhdGU6OmZvcm1hdFRlc3QsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkZvcm1hdFRlc3QsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4MmYxNmEzODIsIEwidHlwZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogZGlnZXN0TWV0aG9kcyAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9EaWdlc3RNZXRob2RzOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9EaWdlc3RNZXRob2RzOjp0eXBlLAorICAgICBYRkFfQXR0cmlidXRlOjpUeXBlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4OGM5OTM3N2UsIEwicmVsYXRpb24iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9SZWxhdGlvbiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4OGUxYzI5MjEsIEwicmVsZXZhbnQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9SZWxldmFudCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9EaWdlc3RNZXRob2RzOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogbnVtYmVyUGF0dGVybnMgKi8KKworICAgIC8qIHBhZ2VTZXQgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUGFnZVNldDo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4OGM5OTM3N2UsIEwicmVsYXRpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1BhZ2VTZXQ6OnJlbGF0aW9uLAorICAgICBYRkFfQXR0cmlidXRlOjpSZWxhdGlvbiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUGFnZVNldDo6cmVsZXZhbnQsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlJlbGV2YW50LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1BhZ2VTZXQ6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBpbnRlZ2VyICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ludGVnZXI6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ludGVnZXI6OmRlZmF1bHRWYWx1ZSwgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwKKyAgICAgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9JbnRlZ2VyOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9JbnRlZ2VyOjp2YWx1ZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHNvYXBBZGRyZXNzICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1NvYXBBZGRyZXNzOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Tb2FwQWRkcmVzczo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGVxdWF0ZSAqLwogICAgIHsweDI1MzYzLCBMInRvIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVG8sIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlRvLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDY2NjQyZjhmLCBMImZvcmNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0ZvcmNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6Rm9yY2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4Y2Q3ZjdiNTQsIEwiZnJvbSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Zyb20sIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkZyb20sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGZvcm1GaWVsZEZpbGxpbmcgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogcGFnZVJhbmdlICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiB1cGRhdGUgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfVXBkYXRlOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9VcGRhdGU6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBjb25uZWN0U3RyaW5nICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0Nvbm5lY3RTdHJpbmc6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0Nvbm5lY3RTdHJpbmc6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBtb2RlICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogbGF5b3V0ICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qICN4bWwgKi8KICAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1ZhbHVlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpWYWx1ZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHhzZENvbm5lY3Rpb24gKi8KICAgICB7MHgyYjVkZjUxZSwgTCJkYXRhRGVzY3JpcHRpb24iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJiOGRmNWQsIEwicmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfUmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4MjI2Y2E4ZjEsIEwib3BlcmF0aW9uIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfT3BlcmF0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfWHNkQ29ubmVjdGlvbjo6ZGF0YURlc2NyaXB0aW9uLAorICAgICBYRkFfQXR0cmlidXRlOjpEYXRhRGVzY3JpcHRpb24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiB0cmF2ZXJzZSAqLworICAgIHsweGJiOGRmNWQsIEwicmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9UcmF2ZXJzZTo6cmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpSZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1RyYXZlcnNlOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHgyMjZjYThmMSwgTCJvcGVyYXRpb24iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1RyYXZlcnNlOjpvcGVyYXRpb24sCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok9wZXJhdGlvbiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9UcmF2ZXJzZTo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGVuY29kaW5ncyAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FbmNvZGluZ3M6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0VuY29kaW5nczo6dHlwZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VHlwZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FbmNvZGluZ3M6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiB0ZW1wbGF0ZSAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBhY3JvYmF0ICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHZhbGlkYXRpb25NZXNzYWdpbmcgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogc2lnbmluZyAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TaWduaW5nOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TaWduaW5nOjp0eXBlLAorICAgICBYRkFfQXR0cmlidXRlOjpUeXBlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1NpZ25pbmc6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBkYXRhV2luZG93ICovCiAgICAgezB4ZmI2NzE4NSwgTCJyZWNvcmRzQmVmb3JlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNTY3JpcHRfRGF0YVdpbmRvdzo6UmVjb3Jkc0JlZm9yZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0RhdGFXaW5kb3c6OnJlY29yZHNCZWZvcmUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4MjFkNWRmY2IsIEwiY3VycmVudFJlY29yZE51bWJlciIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0RhdGFXaW5kb3c6OkN1cnJlbnRSZWNvcmROdW1iZXIsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9EYXRhV2luZG93OjpjdXJyZW50UmVjb3JkTnVtYmVyLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDMxMmFmMDQ0LCBMInJlY29yZHNBZnRlciIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDU2NyaXB0X0RhdGFXaW5kb3c6OlJlY29yZHNBZnRlciwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0RhdGFXaW5kb3c6OnJlY29yZHNBZnRlciwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHg2YWFiMzdjYiwgTCJpc0RlZmluZWQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1NjcmlwdF9EYXRhV2luZG93OjpJc0RlZmluZWQsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRGF0YVdpbmRvdzo6aXNEZWZpbmVkLCBYRkFfQXR0cmlidXRlOjpVbmtub3duLAorICAgICBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogc2NyaXB0ICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1NjcmlwdDo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4NDJmZWQxZmQsIEwiY29udGVudFR5cGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Db250ZW50VHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NmNmYTgyOGEsIEwicnVuQXQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9SdW5BdCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YTAyMWI3MzgsIEwic3RhdGVsZXNzIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NjcmlwdF9TdGF0ZWxlc3MsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TY3JpcHQ6OmNvbnRlbnRUeXBlLAorICAgICBYRkFfQXR0cmlidXRlOjpDb250ZW50VHlwZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg2Y2ZhODI4YSwgTCJydW5BdCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU2NyaXB0OjpydW5BdCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UnVuQXQsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YTAyMWI3MzgsIEwic3RhdGVsZXNzIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TY3JpcHQ6OnN0YXRlbGVzcywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGFkYzRjNzdiLCBMImJpbmRpbmciLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9CaW5kaW5nLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU2NyaXB0OjpkZWZhdWx0VmFsdWUsIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sCisgICAgIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YWRjNGM3N2IsIEwiYmluZGluZyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU2NyaXB0OjpiaW5kaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpCaW5kaW5nLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1NjcmlwdDo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1NjcmlwdDo6dmFsdWUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGFkZFZpZXdlclByZWZlcmVuY2VzICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGFsd2F5c0VtYmVkICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHBhc3N3b3JkRWRpdCAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9QYXNzd29yZEVkaXQ6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDdhMGNjNDcxLCBMInBhc3N3b3JkQ2hhciIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1Bhc3N3b3JkQ2hhciwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1Bhc3N3b3JkRWRpdDo6cGFzc3dvcmRDaGFyLAorICAgICBYRkFfQXR0cmlidXRlOjpQYXNzd29yZENoYXIsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUGFzc3dvcmRFZGl0Ojp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGU2Zjk5NDg3LCBMImhTY3JvbGxQb2xpY3kiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9IU2Nyb2xsUG9saWN5LCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1Bhc3N3b3JkRWRpdDo6aFNjcm9sbFBvbGljeSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6SFNjcm9sbFBvbGljeSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIG51bWVyaWNFZGl0ICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX051bWVyaWNFZGl0Ojp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9OdW1lcmljRWRpdDo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhlNmY5OTQ4NywgTCJoU2Nyb2xsUG9saWN5IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfSFNjcm9sbFBvbGljeSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTnVtZXJpY0VkaXQ6OmhTY3JvbGxQb2xpY3ksCisgICAgIFhGQV9BdHRyaWJ1dGU6OkhTY3JvbGxQb2xpY3ksIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBlbmNyeXB0aW9uTWV0aG9kICovCiAgICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGNoYW5nZSAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogcGFnZUFyZWEgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUGFnZUFyZWE6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDE0YTMyZDUyLCBMInBhZ2VQb3NpdGlvbiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1BhZ2VQb3NpdGlvbiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4ODM0MGVhNjYsIEwib2RkT3JFdmVuIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfT2RkT3JFdmVuLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1JlbGV2YW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9QYWdlQXJlYTo6cGFnZVBvc2l0aW9uLAorICAgICBYRkFfQXR0cmlidXRlOjpQYWdlUG9zaXRpb24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4ODM0MGVhNjYsIEwib2RkT3JFdmVuIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9QYWdlQXJlYTo6b2RkT3JFdmVuLAorICAgICBYRkFfQXR0cmlidXRlOjpPZGRPckV2ZW4sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4OGUxYzI5MjEsIEwicmVsZXZhbnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1BhZ2VBcmVhOjpyZWxldmFudCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UmVsZXZhbnQsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YTg1ZTc0ZjMsIEwiaW5pdGlhbE51bWJlciIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0luaXRpYWxOdW1iZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiZTliYTQ3MiwgTCJudW1iZXJlZCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX051bWJlcmVkLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9QYWdlQXJlYTo6aW5pdGlhbE51bWJlciwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6SW5pdGlhbE51bWJlciwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9QYWdlQXJlYTo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiZTliYTQ3MiwgTCJudW1iZXJlZCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUGFnZUFyZWE6Om51bWJlcmVkLAorICAgICBYRkFfQXR0cmlidXRlOjpOdW1iZXJlZCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhkNzA3OThjMiwgTCJibGFua09yTm90QmxhbmsiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9CbGFua09yTm90QmxhbmssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1BhZ2VBcmVhOjpibGFua09yTm90QmxhbmssCisgICAgIFhGQV9BdHRyaWJ1dGU6OkJsYW5rT3JOb3RCbGFuaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHN1Ym1pdFVybCAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIG9pZHMgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2lkczo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4MmYxNmEzODIsIEwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2lkczo6dHlwZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VHlwZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PaWRzOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogc2lnbmF0dXJlICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1NpZ25hdHVyZTo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU2lnbmF0dXJlOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogYURCRV9KU0NvbnNvbGUgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDM0YWUxMDNjLCBMInJlc2VydmUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9SZXNlcnZlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg1NzBjZTgzNSwgTCJwcmVzZW5jZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1ByZXNlbmNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4ZjIwMDkzMzksIEwicGxhY2VtZW50IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfUGxhY2VtZW50LCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogY2FwdGlvbiAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9DYXB0aW9uOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHgzNGFlMTAzYywgTCJyZXNlcnZlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9DYXB0aW9uOjpyZXNlcnZlLAorICAgICBYRkFfQXR0cmlidXRlOjpSZXNlcnZlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDU3MGNlODM1LCBMInByZXNlbmNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9DYXB0aW9uOjpwcmVzZW5jZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UHJlc2VuY2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQ2FwdGlvbjo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhmMjAwOTMzOSwgTCJwbGFjZW1lbnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0NhcHRpb246OnBsYWNlbWVudCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UGxhY2VtZW50LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogcmVsZXZhbnQgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBmbGlwTGFiZWwgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGV4RGF0YSAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FeERhdGE6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDQyZmVkMWZkLCBMImNvbnRlbnRUeXBlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V4RGF0YTo6Y29udGVudFR5cGUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkNvbnRlbnRUeXBlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDU0ZmE3MjJjLCBMInRyYW5zZmVyRW5jb2RpbmciLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9UcmFuc2ZlckVuY29kaW5nLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FeERhdGE6OnRyYW5zZmVyRW5jb2RpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlRyYW5zZmVyRW5jb2RpbmcsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzQ1NDdhMDgsIEwibWF4TGVuZ3RoIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTWF4TGVuZ3RoLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FeERhdGE6OmRlZmF1bHRWYWx1ZSwgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwKKyAgICAgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FeERhdGE6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YzQ1NDdhMDgsIEwibWF4TGVuZ3RoIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FeERhdGE6Om1heExlbmd0aCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TWF4TGVuZ3RoLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGQ2ZTI3ZjFkLCBMInZhbHVlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhkYjU1ZmVjNSwgTCJocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfSHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhkYjU1ZmVjNSwgTCJocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FeERhdGE6OmhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBkYXlOYW1lcyAqLwogICAgIHsweDI5NDE4YmI3LCBMImFiYnIiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9BYmJyLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkFiYnIsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBzb2FwQWN0aW9uICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1NvYXBBY3Rpb246OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1NvYXBBY3Rpb246OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBkZWZhdWx0VHlwZWZhY2UgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNTMxYjA1OSwgTCJ3cml0aW5nU2NyaXB0IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfV3JpdGluZ1NjcmlwdCwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6V3JpdGluZ1NjcmlwdCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHgxYjhkY2UzZSwgTCJhY3Rpb24iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9BY3Rpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogbWFuaWZlc3QgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTWFuaWZlc3Q6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDFiOGRjZTNlLCBMImFjdGlvbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTWFuaWZlc3Q6OmFjdGlvbiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6QWN0aW9uLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg5ZGNjM2FiMywgTCJ0cmFpbGVyIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVHJhaWxlciwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGM4ZGE0ZGE3LCBMInRhcmdldCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1RhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4Y2JjYWY2NmQsIEwibGVhZGVyIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTGVhZGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4MmYxNmEzODIsIEwidHlwZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1R5cGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9NYW5pZmVzdDo6ZGVmYXVsdFZhbHVlLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX01hbmlmZXN0Ojp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogb3ZlcmZsb3cgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT3ZlcmZsb3c6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDlkY2MzYWIzLCBMInRyYWlsZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX092ZXJmbG93Ojp0cmFpbGVyLAorICAgICBYRkFfQXR0cmlidXRlOjpUcmFpbGVyLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX092ZXJmbG93Ojp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGM4ZGE0ZGE3LCBMInRhcmdldCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT3ZlcmZsb3c6OnRhcmdldCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VGFyZ2V0LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGNiY2FmNjZkLCBMImxlYWRlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT3ZlcmZsb3c6OmxlYWRlciwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TGVhZGVyLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogbGluZWFyICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0xpbmVhcjo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4MmYxNmEzODIsIEwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTGluZWFyOjp0eXBlLAorICAgICBYRkFfQXR0cmlidXRlOjpUeXBlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0xpbmVhcjo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGN1cnJlbmN5U3ltYm9sICovCiAgICAgezB4MzFiMTljMSwgTCJuYW1lIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGIzNTQzYTYsIEwibWF4IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0luc3RhbmNlTWFuYWdlcl9NYXgsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiMzU2Y2E0LCBMIm1pbiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfTWluLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NmY1NDRkNDksIEwiY291bnQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX0NvdW50LCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGRlbGV0ZSAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9EZWxldGU6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0RlbGV0ZTo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGRlbHRhcyAqLworCisgICAgLyogZGlnZXN0TWV0aG9kICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0RpZ2VzdE1ldGhvZDo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRGlnZXN0TWV0aG9kOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogaW5zdGFuY2VNYW5hZ2VyICovCisgICAgezB4YjM1NDNhNiwgTCJtYXgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0luc3RhbmNlTWFuYWdlcjo6bWF4LAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGIzNTZjYTQsIEwibWluIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9JbnN0YW5jZU1hbmFnZXI6Om1pbiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg2ZjU0NGQ0OSwgTCJjb3VudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfSW5zdGFuY2VNYW5hZ2VyOjpjb3VudCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGVxdWF0ZVJhbmdlICovCiAgICAgezB4MjUzNjMsIEwidG8iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9UbywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VG8sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YTA5MzM5NTQsIEwidW5pY29kZVJhbmdlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVW5pY29kZVJhbmdlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmljb2RlUmFuZ2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4Y2Q3ZjdiNTQsIEwiZnJvbSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Zyb20sIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkZyb20sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBtZWRpdW0gKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTWVkaXVtOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHg0ZWYzZDAyYywgTCJvcmllbnRhdGlvbiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX09yaWVudGF0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9NZWRpdW06Om9yaWVudGF0aW9uLAorICAgICBYRkFfQXR0cmlidXRlOjpPcmllbnRhdGlvbiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHg2NWUzMGM2NywgTCJpbWFnaW5nQkJveCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0ltYWdpbmdCQm94LCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg5MDQxZDRiMCwgTCJzaG9ydCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1Nob3J0LCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4ZTM0OWQwNDQsIEwic3RvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9TdG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4ZjZiNGFmYjAsIEwibG9uZyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0xvbmcsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX01lZGl1bTo6aW1hZ2luZ0JCb3gsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkltYWdpbmdCQm94LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDkwNDFkNGIwLCBMInNob3J0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9NZWRpdW06OnNob3J0VmFsdWUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlNob3J0LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX01lZGl1bTo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhlMzQ5ZDA0NCwgTCJzdG9jayIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTWVkaXVtOjpzdG9jaywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6U3RvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4ZjZiNGFmYjAsIEwibG9uZyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTWVkaXVtOjpsb25nVmFsdWUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvbmcsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiB0ZXh0RWRpdCAqLwogICAgIHsweDVjZTYxOTUsIEwidlNjcm9sbFBvbGljeSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1ZTY3JvbGxQb2xpY3ksIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9UZXh0RWRpdDo6dlNjcm9sbFBvbGljeSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VlNjcm9sbFBvbGljeSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfVGV4dEVkaXQ6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDFlZjNhNjRhLCBMImFsbG93UmljaFRleHQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9BbGxvd1JpY2hUZXh0LCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg1YTMyZTQ5MywgTCJtdWx0aUxpbmUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9NdWx0aUxpbmUsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9UZXh0RWRpdDo6YWxsb3dSaWNoVGV4dCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6QWxsb3dSaWNoVGV4dCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg1YTMyZTQ5MywgTCJtdWx0aUxpbmUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1RleHRFZGl0OjptdWx0aUxpbmUsCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok11bHRpTGluZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9UZXh0RWRpdDo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhlNmY5OTQ4NywgTCJoU2Nyb2xsUG9saWN5IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfSFNjcm9sbFBvbGljeSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfVGV4dEVkaXQ6OmhTY3JvbGxQb2xpY3ksCisgICAgIFhGQV9BdHRyaWJ1dGU6OkhTY3JvbGxQb2xpY3ksIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiB0ZW1wbGF0ZUNhY2hlICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZDUyNDgyZTAsIEwibWF4RW50cmllcyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX01heEVudHJpZXMsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok1heEVudHJpZXMsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBjb21wcmVzc09iamVjdFN0cmVhbSAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBkYXRhVmFsdWUgKi8KICAgICB7MHg0MmZlZDFmZCwgTCJjb250ZW50VHlwZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg4ODU1ODA1ZiwgTCJjb250YWlucyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0NvbnRhaW5zLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9EYXRhVmFsdWU6OmNvbnRlbnRUeXBlLAorICAgICBYRkFfQXR0cmlidXRlOjpDb250ZW50VHlwZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg4ODU1ODA1ZiwgTCJjb250YWlucyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRGF0YVZhbHVlOjpjb250YWlucywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6Q29udGFpbnMsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4ZTM3MmFlOTcsIEwiaXNOdWxsIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0lzTnVsbCwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRGF0YVZhbHVlOjpkZWZhdWx0VmFsdWUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0RhdGFWYWx1ZTo6dmFsdWUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4ZTM3MmFlOTcsIEwiaXNOdWxsIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9EYXRhVmFsdWU6OmlzTnVsbCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6SXNOdWxsLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogYWNjZXNzaWJsZUNvbnRlbnQgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogbm9kZUxpc3QgKi8KKworICAgIC8qIGluY2x1ZGVYRFBDb250ZW50ICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHhtbENvbm5lY3Rpb24gKi8KICAgICB7MHgyYjVkZjUxZSwgTCJkYXRhRGVzY3JpcHRpb24iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EYXRhRGVzY3JpcHRpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1htbENvbm5lY3Rpb246OmRhdGFEZXNjcmlwdGlvbiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGF0YURlc2NyaXB0aW9uLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogdmFsaWRhdGVBcHByb3ZhbFNpZ25hdHVyZXMgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJiOGRmNWQsIEwicmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfUmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4MjI2Y2E4ZjEsIEwib3BlcmF0aW9uIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfT3BlcmF0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzhkYTRkYTcsIEwidGFyZ2V0IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVGFyZ2V0LCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHNpZ25EYXRhICovCisgICAgezB4YmI4ZGY1ZCwgTCJyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1NpZ25EYXRhOjpyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU2lnbkRhdGE6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDIyNmNhOGYxLCBMIm9wZXJhdGlvbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU2lnbkRhdGE6Om9wZXJhdGlvbiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6T3BlcmF0aW9uLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1NpZ25EYXRhOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGM4ZGE0ZGE3LCBMInRhcmdldCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU2lnbkRhdGE6OnRhcmdldCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VGFyZ2V0LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogcGFja2V0cyAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBkYXRlUGF0dGVybiAqLwogICAgIHsweDMxYjE5YzEsIEwibmFtZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBkdXBsZXhPcHRpb24gKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogYmFzZSAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmI4ZGY1ZCwgTCJyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9SZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg0MmZlZDFmZCwgTCJjb250ZW50VHlwZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGJpbmQgKi8KKyAgICB7MHhiYjhkZjVkLCBMInJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQmluZDo6cmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpSZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0JpbmQ6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDQyZmVkMWZkLCBMImNvbnRlbnRUeXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9CaW5kOjpjb250ZW50VHlwZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6Q29udGVudFR5cGUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4NTRmYTcyMmMsIEwidHJhbnNmZXJFbmNvZGluZyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1RyYW5zZmVyRW5jb2RpbmcsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhmMTk3ODQ0ZCwgTCJtYXRjaCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX01hdGNoLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9CaW5kOjp0cmFuc2ZlckVuY29kaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpUcmFuc2ZlckVuY29kaW5nLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0JpbmQ6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4ZjE5Nzg0NGQsIEwibWF0Y2giLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0JpbmQ6Om1hdGNoLAorICAgICBYRkFfQXR0cmlidXRlOjpNYXRjaCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGNvbXByZXNzaW9uICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4ZDk5NmZhOWIsIEwiaGFuZCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0hhbmQsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogdXNlciAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Vc2VyOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Vc2VyOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogcmVjdGFuZ2xlICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1JlY3RhbmdsZTo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUmVjdGFuZ2xlOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGQ5OTZmYTliLCBMImhhbmQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1JlY3RhbmdsZTo6aGFuZCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6SGFuZCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGVmZmVjdGl2ZU91dHB1dFBvbGljeSAqLwogICAgIHsweDIxYWVkLCBMImlkIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfSWQsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OklkLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDMxYjE5YzEsIEwibmFtZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGFEQkVfSlNEZWJ1Z2dlciAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogYWNyb2JhdDcgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogaW50ZXJhY3RpdmUgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogbG9jYWxlICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGN1cnJlbnRQYWdlICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGRhdGEgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGRhdGUgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRGF0ZTo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9EYXRlOjpkZWZhdWx0VmFsdWUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRGF0ZTo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRGF0ZTo6dmFsdWUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBkZXNjICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0Rlc2M6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0Rlc2M6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBlbmNyeXB0ICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0VuY3J5cHQ6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDI4ZGVlNmU5LCBMImZvcm1hdCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRW5jcnlwdDo6Zm9ybWF0LAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0VuY3J5cHQ6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGRyYXcgKi8KKyAgICB7MHg2OCwgTCJoIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9EcmF3OjpoLCBYRkFfQXR0cmlidXRlOjpILAorICAgICBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDc3LCBMInciLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0RyYXc6OncsIFhGQV9BdHRyaWJ1dGU6OlcsCisgICAgIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4NzgsIEwieCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRHJhdzo6eCwgWEZBX0F0dHJpYnV0ZTo6WCwKKyAgICAgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg3OSwgTCJ5IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9EcmF3Ojp5LCBYRkFfQXR0cmlidXRlOjpZLAorICAgICBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDIyODJjNzMsIEwiaEFsaWduIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9EcmF3OjpoQWxpZ24sCisgICAgIFhGQV9BdHRyaWJ1dGU6OkhBbGlnbiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRHJhdzo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4MmVlNzY3OGYsIEwicm90YXRlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9EcmF3Ojpyb3RhdGUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlJvdGF0ZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg1NzBjZTgzNSwgTCJwcmVzZW5jZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRHJhdzo6cHJlc2VuY2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlByZXNlbmNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDdhN2NjMzQxLCBMInZBbGlnbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRHJhdzo6dkFsaWduLAorICAgICBYRkFfQXR0cmlidXRlOjpWQWxpZ24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4N2MyZmY2YWUsIEwibWF4SCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRHJhdzo6bWF4SCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TWF4SCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg3YzJmZjZiZCwgTCJtYXhXIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9EcmF3OjptYXhXLAorICAgICBYRkFfQXR0cmlidXRlOjpNYXhXLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDdkMDIzNTZjLCBMIm1pbkgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0RyYXc6Om1pbkgsCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok1pbkgsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4N2QwMjM1N2IsIEwibWluVyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRHJhdzo6bWluVywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TWluVywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg4ZTFjMjkyMSwgTCJyZWxldmFudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRHJhdzo6cmVsZXZhbnQsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlJlbGV2YW50LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGEwM2NmNjI3LCBMInJhd1ZhbHVlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9EcmF3OjpyYXdWYWx1ZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0RyYXc6OmRlZmF1bHRWYWx1ZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhhYzA2ZTJiMCwgTCJjb2xTcGFuIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9EcmF3Ojpjb2xTcGFuLAorICAgICBYRkFfQXR0cmlidXRlOjpDb2xTcGFuLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0RyYXc6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmM4ZmEzNTAsIEwibG9jYWxlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9EcmF3Ojpsb2NhbGUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2FsZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhjMmJkNDBmZCwgTCJhbmNob3JUeXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9EcmF3OjphbmNob3JUeXBlLAorICAgICBYRkFfQXR0cmlidXRlOjpBbmNob3JUeXBlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogZW5jcnlwdGlvbiAqLworICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBtZXJpZGllbU5hbWVzICovCisKKyAgICAvKiBtZXNzYWdpbmcgKi8KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogc3BlYWsgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU3BlYWs6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDM5Y2RiMGEyLCBMInByaW9yaXR5IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TcGVhazo6cHJpb3JpdHksCisgICAgIFhGQV9BdHRyaWJ1dGU6OlByaW9yaXR5LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1NwZWFrOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGViNTExYjU0LCBMImRpc2FibGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1NwZWFrOjpkaXNhYmxlLAorICAgICBYRkFfQXR0cmlidXRlOjpEaXNhYmxlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogZGF0YUdyb3VwICovCisKKyAgICAvKiBjb21tb24gKi8KKyAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogI3RleHQgKi8KICAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4MjhkZWU2ZTksIEwiZm9ybWF0IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0VuY3J5cHRfRm9ybWF0LCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlZhbHVlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogcGFnaW5hdGlvbk92ZXJyaWRlICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg2OCwgTCJoIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfSCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NzcsIEwidyIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1csIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDc4LCBMIngiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9YLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg3OSwgTCJ5IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfWSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4MjI4MmM3MywgTCJoQWxpZ24iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9IQWxpZ24sIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHgyZWU3Njc4ZiwgTCJyb3RhdGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Sb3RhdGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDU3MGNlODM1LCBMInByZXNlbmNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDdhN2NjMzQxLCBMInZBbGlnbiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1ZBbGlnbiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4N2MyZmY2YWUsIEwibWF4SCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX01heEgsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDdjMmZmNmJkLCBMIm1heFciLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9NYXhXLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg3ZDAyMzU2YywgTCJtaW5IIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTWluSCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4N2QwMjM1N2IsIEwibWluVyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX01pblcsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDhlMWMyOTIxLCBMInJlbGV2YW50IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGEwM2NmNjI3LCBMInJhd1ZhbHVlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGFjMDZlMmIwLCBMImNvbFNwYW4iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Db2xTcGFuLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHJlYXNvbnMgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUmVhc29uczo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4MmYxNmEzODIsIEwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUmVhc29uczo6dHlwZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VHlwZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9SZWFzb25zOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogc2lnbmF0dXJlUHJvcGVydGllcyAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TaWduYXR1cmVQcm9wZXJ0aWVzOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmM4ZmEzNTAsIEwibG9jYWxlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jYWxlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMmJkNDBmZCwgTCJhbmNob3JUeXBlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfQW5jaG9yVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU2lnbmF0dXJlUHJvcGVydGllczo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHRocmVzaG9sZCAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDM5Y2RiMGEyLCBMInByaW9yaXR5IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfUHJpb3JpdHksIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhlYjUxMWI1NCwgTCJkaXNhYmxlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGlzYWJsZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9WYWx1ZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGFwcGVhcmFuY2VGaWx0ZXIgKi8KICAgICB7MHgyMWFlZCwgTCJpZCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0lkLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpJZCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpUeXBlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NTcwY2U4MzUsIEwicHJlc2VuY2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGNiMGFjOSwgTCJsaW5lVGhyb3VnaCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0xpbmVUaHJvdWdoLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHgyYzFjN2YxLCBMInR5cGVmYWNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVHlwZWZhY2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBmaWxsICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZpbGw6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDU3MGNlODM1LCBMInByZXNlbmNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9GaWxsOjpwcmVzZW5jZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UHJlc2VuY2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRmlsbDo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGZvbnQgKi8KKyAgICB7MHhjYjBhYzksIEwibGluZVRocm91Z2giLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZvbnQ6OmxpbmVUaHJvdWdoLAorICAgICBYRkFfQXR0cmlidXRlOjpMaW5lVGhyb3VnaCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHgyYzFjN2YxLCBMInR5cGVmYWNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Gb250Ojp0eXBlZmFjZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VHlwZWZhY2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4OGM3NGFlOSwgTCJmb250SG9yaXpvbnRhbFNjYWxlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRm9udEhvcml6b250YWxTY2FsZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDJjZDc5MDMzLCBMImtlcm5pbmdNb2RlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfS2VybmluZ01vZGUsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDNhMDI3M2E2LCBMInVuZGVybGluZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VuZGVybGluZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRm9udDo6Zm9udEhvcml6b250YWxTY2FsZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6Rm9udEhvcml6b250YWxTY2FsZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRm9udDo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4MmNkNzkwMzMsIEwia2VybmluZ01vZGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZvbnQ6Omtlcm5pbmdNb2RlLAorICAgICBYRkFfQXR0cmlidXRlOjpLZXJuaW5nTW9kZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHgzYTAyNzNhNiwgTCJ1bmRlcmxpbmUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZvbnQ6OnVuZGVybGluZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5kZXJsaW5lLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDQ4NzNjNjAxLCBMImJhc2VsaW5lU2hpZnQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9CYXNlbGluZVNoaWZ0LCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Gb250OjpiYXNlbGluZVNoaWZ0LAorICAgICBYRkFfQXR0cmlidXRlOjpCYXNlbGluZVNoaWZ0LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDRiMzE5NzY3LCBMIm92ZXJsaW5lUGVyaW9kIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfT3ZlcmxpbmVQZXJpb2QsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZvbnQ6Om92ZXJsaW5lUGVyaW9kLAorICAgICBYRkFfQXR0cmlidXRlOjpPdmVybGluZVBlcmlvZCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHg3OTU0MzA1NSwgTCJsZXR0ZXJTcGFjaW5nIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTGV0dGVyU3BhY2luZywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRm9udDo6bGV0dGVyU3BhY2luZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TGV0dGVyU3BhY2luZywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHg4ZWM2MjA0YywgTCJsaW5lVGhyb3VnaFBlcmlvZCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0xpbmVUaHJvdWdoUGVyaW9kLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Gb250OjpsaW5lVGhyb3VnaFBlcmlvZCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TGluZVRocm91Z2hQZXJpb2QsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4OTA3Yzc3MTksIEwiZm9udFZlcnRpY2FsU2NhbGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Gb250VmVydGljYWxTY2FsZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YTY4Njk3NWIsIEwic2l6ZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1NpemUsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGI1ZTQ5YmYyLCBMInBvc3R1cmUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Qb3N0dXJlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmQ2ZTFkODgsIEwid2VpZ2h0IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfV2VpZ2h0LCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Gb250Ojpmb250VmVydGljYWxTY2FsZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6Rm9udFZlcnRpY2FsU2NhbGUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YTY4Njk3NWIsIEwic2l6ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRm9udDo6c2l6ZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6U2l6ZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiNWU0OWJmMiwgTCJwb3N0dXJlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Gb250Ojpwb3N0dXJlLAorICAgICBYRkFfQXR0cmlidXRlOjpQb3N0dXJlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZvbnQ6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmQ2ZTFkODgsIEwid2VpZ2h0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Gb250Ojp3ZWlnaHQsCisgICAgIFhGQV9BdHRyaWJ1dGU6OldlaWdodCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhiZDk2YTBlOSwgTCJ1bmRlcmxpbmVQZXJpb2QiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9VbmRlcmxpbmVQZXJpb2QsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwZWM5ZmE0LCBMIm92ZXJsaW5lIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfT3ZlcmxpbmUsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0ZvbnQ6OnVuZGVybGluZVBlcmlvZCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5kZXJsaW5lUGVyaW9kLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGMwZWM5ZmE0LCBMIm92ZXJsaW5lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Gb250OjpvdmVybGluZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6T3ZlcmxpbmUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBmb3JtICovCiAgICAgezB4YWY3NTQ2MTMsIEwiY2hlY2tzdW0iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfRm9ybV9DaGVja3N1bSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0Zvcm1fQ2hlY2tzdW0sCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBtZWRpdW1JbmZvICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBjZXJ0aWZpY2F0ZSAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9DZXJ0aWZpY2F0ZTo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQ2VydGlmaWNhdGU6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBwYXNzd29yZCAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9QYXNzd29yZDo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUGFzc3dvcmQ6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBydW5TY3JpcHRzICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHRyYWNlICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YTUyNjgyYmQsIEwie2RlZmF1bHR9IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogZmxvYXQgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRmxvYXQ6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGE1MjY4MmJkLCBMIntkZWZhdWx0fSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRmxvYXQ6OmRlZmF1bHRWYWx1ZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9GbG9hdDo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhkNmUyN2YxZCwgTCJ2YWx1ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRmxvYXQ6OnZhbHVlLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogcmVuZGVyUG9saWN5ICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGxvZ1BzZXVkb01vZGVsICovCisKKyAgICAvKiBkZXN0aW5hdGlvbiAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDhlMWMyOTIxLCBMInJlbGV2YW50IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfUmVsZXZhbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhlYTcwOTBhMCwgTCJvdmVycmlkZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9PdmVycmlkZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDlkY2MzYWIzLCBMInRyYWlsZXIiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9UcmFpbGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4Y2JjYWY2NmQsIEwibGVhZGVyIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTGVhZGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NjBhNjFlZGQsIEwiY29kZVR5cGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Db2RlVHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YjM3M2E4NjIsIEwiYXJjaGl2ZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0FyY2hpdmUsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhlMWEyNmI1NiwgTCJjb2RlQmFzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0NvZGVCYXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhlYjA5MTAwMywgTCJjbGFzc0lkIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfQ2xhc3NJZCwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiB2YWx1ZSAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9WYWx1ZTo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4OGUxYzI5MjEsIEwicmVsZXZhbnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1ZhbHVlOjpyZWxldmFudCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UmVsZXZhbnQsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfVmFsdWU6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4ZWE3MDkwYTAsIEwib3ZlcnJpZGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1ZhbHVlOjpvdmVycmlkZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6T3ZlcnJpZGUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBib29rZW5kICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0Jvb2tlbmQ6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDlkY2MzYWIzLCBMInRyYWlsZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0Jvb2tlbmQ6OnRyYWlsZXIsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlRyYWlsZXIsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQm9va2VuZDo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhjYmNhZjY2ZCwgTCJsZWFkZXIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0Jvb2tlbmQ6OmxlYWRlciwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TGVhZGVyLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogZXhPYmplY3QgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRXhPYmplY3Q6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDYwYTYxZWRkLCBMImNvZGVUeXBlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FeE9iamVjdDo6Y29kZVR5cGUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkNvZGVUeXBlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGIzNzNhODYyLCBMImFyY2hpdmUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V4T2JqZWN0OjphcmNoaXZlLAorICAgICBYRkFfQXR0cmlidXRlOjpBcmNoaXZlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V4T2JqZWN0Ojp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGUxYTI2YjU2LCBMImNvZGVCYXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9FeE9iamVjdDo6Y29kZUJhc2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkNvZGVCYXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGViMDkxMDAzLCBMImNsYXNzSWQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V4T2JqZWN0OjpjbGFzc0lkLAorICAgICBYRkFfQXR0cmlidXRlOjpDbGFzc0lkLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogb3BlbkFjdGlvbiAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBuZXZlckVtYmVkICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogYmluZEl0ZW1zICovCiAgICAgezB4NDdkMDM0OTAsIEwiY29ubmVjdGlvbiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Nvbm5lY3Rpb24sIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMzOWE4OGJkLCBMImxhYmVsUmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTGFiZWxSZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGQ1MGY5MDNhLCBMInZhbHVlUmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVmFsdWVSZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4ZWE3MDkwYTAsIEwib3ZlcnJpZGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9PdmVycmlkZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQmluZEl0ZW1zOjpjb25uZWN0aW9uLAorICAgICBYRkFfQXR0cmlidXRlOjpDb25uZWN0aW9uLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGMzOWE4OGJkLCBMImxhYmVsUmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9CaW5kSXRlbXM6OmxhYmVsUmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpMYWJlbFJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhkNTBmOTAzYSwgTCJ2YWx1ZVJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQmluZEl0ZW1zOjp2YWx1ZVJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VmFsdWVSZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBjYWxjdWxhdGUgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQ2FsY3VsYXRlOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9DYWxjdWxhdGU6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4ZWE3MDkwYTAsIEwib3ZlcnJpZGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0NhbGN1bGF0ZTo6b3ZlcnJpZGUsCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok92ZXJyaWRlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogcHJpbnQgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHgyZjE2YTM4MiwgTCJ0eXBlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0V4dHJhc19UeXBlLCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogZXh0cmFzICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V4dHJhczo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4MmYxNmEzODIsIEwidHlwZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfRXh0cmFzOjp0eXBlLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0V4dHJhczo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHByb3RvICovCisKKyAgICAvKiBkU2lnRGF0YSAqLworCisgICAgLyogY3JlYXRvciAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmI4ZGY1ZCwgTCJyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9SZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHgyNGQ4NTE2NywgTCJ0aW1lb3V0IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVGltZW91dCwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBjb25uZWN0ICovCisgICAgezB4YmI4ZGY1ZCwgTCJyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0Nvbm5lY3Q6OnJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Db25uZWN0Ojp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHgyNGQ4NTE2NywgTCJ0aW1lb3V0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Db25uZWN0Ojp0aW1lb3V0LAorICAgICBYRkFfQXR0cmlidXRlOjpUaW1lb3V0LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDQ3ZDAzNDkwLCBMImNvbm5lY3Rpb24iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Db25uZWN0aW9uLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg1NTJkOWFkNSwgTCJ1c2FnZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzYWdlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQ29ubmVjdDo6Y29ubmVjdGlvbiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6Q29ubmVjdGlvbiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg1NTJkOWFkNSwgTCJ1c2FnZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQ29ubmVjdDo6dXNhZ2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzYWdlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0Nvbm5lY3Q6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4Yzg2MGYzMGEsIEwiZGVsYXllZE9wZW4iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZWxheWVkT3BlbiwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQ29ubmVjdDo6ZGVsYXllZE9wZW4sCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlbGF5ZWRPcGVuLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogcGVybWlzc2lvbnMgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHgyOGRlZTZlOSwgTCJmb3JtYXQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Gb3JtYXQsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDgyNGYyMWI3LCBMImVtYmVkUERGIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRW1iZWRQREYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjOGRhNGRhNywgTCJ0YXJnZXQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9UYXJnZXQsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogY29ubmVjdGlvblNldCAqLworCisgICAgLyogc3VibWl0ICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1N1Ym1pdDo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4MjhkZWU2ZTksIEwiZm9ybWF0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TdWJtaXQ6OmZvcm1hdCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6Rm9ybWF0LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDgyNGYyMWI3LCBMImVtYmVkUERGIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TdWJtaXQ6OmVtYmVkUERGLAorICAgICBYRkFfQXR0cmlidXRlOjpFbWJlZFBERiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TdWJtaXQ6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YzhkYTRkYTcsIEwidGFyZ2V0IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9TdWJtaXQ6OnRhcmdldCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VGFyZ2V0LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGRjNzU2NzZjLCBMInRleHRFbmNvZGluZyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1RleHRFbmNvZGluZywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4Zjg4OWU3NDcsIEwieGRwQ29udGVudCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1hkcENvbnRlbnQsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1N1Ym1pdDo6dGV4dEVuY29kaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpUZXh0RW5jb2RpbmcsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4Zjg4OWU3NDcsIEwieGRwQ29udGVudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU3VibWl0Ojp4ZHBDb250ZW50LAorICAgICBYRkFfQXR0cmlidXRlOjpYZHBDb250ZW50LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogcmFuZ2UgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogbGluZWFyaXplZCAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4OTdiZTkxYiwgTCJjb250ZW50IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1BhY2tldF9Db250ZW50LCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHBhY2tldCAqLworICAgIHsweDk3YmU5MWIsIEwiY29udGVudCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUGFja2V0Ojpjb250ZW50LAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogcm9vdEVsZW1lbnQgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfUm9vdEVsZW1lbnQ6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1Jvb3RFbGVtZW50Ojp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogcGxhaW50ZXh0TWV0YWRhdGEgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBudW1iZXJTeW1ib2xzICovCisKKyAgICAvKiBwcmludEhpZ2hRdWFsaXR5ICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIGRyaXZlciAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBpbmNyZW1lbnRhbExvYWQgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBzdWJqZWN0RE4gKi8KICAgICB7MHg0MTU2ZWUzZiwgTCJkZWxpbWl0ZXIiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZWxpbWl0ZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1N1YmplY3RETjo6ZGVsaW1pdGVyLAorICAgICBYRkFfQXR0cmlidXRlOjpEZWxpbWl0ZXIsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBjb21wcmVzc0xvZ2ljYWxTdHJ1Y3R1cmUgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogaW5jcmVtZW50YWxNZXJnZSAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlaHJlZiwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YzA4MTFlZCwgTCJ1c2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2UsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIHJhZGlhbCAqLworICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9SYWRpYWw6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1JhZGlhbDo6dHlwZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VHlwZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9SYWRpYWw6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiB2YXJpYWJsZXMgKi8KKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfVmFyaWFibGVzOjp1c2UsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiYzI1NDMzMiwgTCJ1c2VocmVmIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9WYXJpYWJsZXM6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiB0aW1lUGF0dGVybnMgKi8KKworICAgIC8qIGVmZmVjdGl2ZUlucHV0UG9saWN5ICovCiAgICAgezB4MjFhZWQsIEwiaWQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9JZCwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6SWQsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4MzFiMTljMSwgTCJuYW1lIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTmFtZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TmFtZSwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogbmFtZUF0dHIgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBjb25mb3JtYW5jZSAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiB0cmFuc2Zvcm0gKi8KICAgICB7MHhiYjhkZjVkLCBMInJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1JlZiwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBsb2NrRG9jdW1lbnQgKi8KICAgICB7MHgyMWFlZCwgTCJpZCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0lkLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpJZCwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweDJmMTZhMzgyLCBMInR5cGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9UeXBlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpUeXBlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NDUzZWFmMzgsIEwic3RhcnROZXciLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9TdGFydE5ldywgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4OWRjYzNhYjMsIEwidHJhaWxlciIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1RyYWlsZXIsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBicmVha0FmdGVyICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0JyZWFrQWZ0ZXI6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDQ1M2VhZjM4LCBMInN0YXJ0TmV3IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9CcmVha0FmdGVyOjpzdGFydE5ldywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6U3RhcnROZXcsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4OWRjYzNhYjMsIEwidHJhaWxlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQnJlYWtBZnRlcjo6dHJhaWxlciwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VHJhaWxlciwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhhNjExOGM4OSwgTCJ0YXJnZXRUeXBlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVGFyZ2V0VHlwZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGM4ZGE0ZGE3LCBMInRhcmdldCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1RhcmdldCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4Y2JjYWY2NmQsIEwibGVhZGVyIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfTGVhZGVyLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YWJlZjM3ZTMsIEwic2xvcGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9TbG9wZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGQ5OTZmYTliLCBMImhhbmQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9IYW5kLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhhNjBkZDIwMiwgTCJsZW5ndGgiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19MZW5ndGgsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHgyMDE0NiwgTCJkYiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Tb3VyY2VfRGIsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGIzNTQzYTYsIEwibWF4IiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X09jY3VyX01heCwKLSAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGIzNTZjYTQsIEwibWluIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X09jY3VyX01pbiwKLSAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGMwODExZWQsIEwidXNlIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfVXNlLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg3ZDBiNWZjYSwgTCJpbml0aWFsIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfSW5pdGlhbCwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZWhyZWYsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0JyZWFrQWZ0ZXI6OnRhcmdldFR5cGUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlRhcmdldFR5cGUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQnJlYWtBZnRlcjo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhjOGRhNGRhNywgTCJ0YXJnZXQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0JyZWFrQWZ0ZXI6OnRhcmdldCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VGFyZ2V0LCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGNiY2FmNjZkLCBMImxlYWRlciIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfQnJlYWtBZnRlcjo6bGVhZGVyLAorICAgICBYRkFfQXR0cmlidXRlOjpMZWFkZXIsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBsaW5lICovCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0xpbmU6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGFiZWYzN2UzLCBMInNsb3BlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9MaW5lOjpzbG9wZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6U2xvcGUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTGluZTo6dXNlaHJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlaHJlZiwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhkOTk2ZmE5YiwgTCJoYW5kIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9MaW5lOjpoYW5kLAorICAgICBYRkFfQXR0cmlidXRlOjpIYW5kLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogbGlzdCAqLworICAgIHsweGE2MGRkMjAyLCBMImxlbmd0aCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTGlzdDo6bGVuZ3RoLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogc291cmNlICovCisgICAgezB4MjAxNDYsIEwiZGIiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1NvdXJjZTo6ZGIsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YzA4MTFlZCwgTCJ1c2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1NvdXJjZTo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfU291cmNlOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogb2NjdXIgKi8KKyAgICB7MHhiMzU0M2E2LCBMIm1heCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2NjdXI6Om1heCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhiMzU2Y2E0LCBMIm1pbiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2NjdXI6Om1pbiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhjMDgxMWVkLCBMInVzZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2NjdXI6OnVzZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VXNlLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDdkMGI1ZmNhLCBMImluaXRpYWwiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09jY3VyOjppbml0aWFsLAorICAgICBYRkFfQXR0cmlidXRlOjpJbml0aWFsLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09jY3VyOjp1c2VocmVmLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2VocmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogcGlja1RyYXlCeVBERlNpemUgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogbW9udGhOYW1lcyAqLwogICAgIHsweDI5NDE4YmI3LCBMImFiYnIiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9BYmJyLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpBYmJyLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogc2V2ZXJpdHkgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBncm91cFBhcmVudCAqLwogICAgIHsweGJlNTJkZmJmLCBMImRlc2MiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9EZXNjLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAorICAgICBYRkFfQXR0cmlidXRlOjpEZXNjLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAogICAgIHsweGY2YjQ3NzQ5LCBMImxvY2siLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCi0gICAgIFhGQV9BVFRSSUJVVEVfTG9jaywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX0JPT0wsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkxvY2ssIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBkb2N1bWVudEFzc2VtYmx5ICovCiAgICAgezB4YmU1MmRmYmYsIEwiZGVzYyIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX0Rlc2MsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6OkRlc2MsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZjZiNDc3NDksIEwibG9jayIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKLSAgICAgWEZBX0FUVFJJQlVURV9Mb2NrLCBYRkFfU0NSSVBUX0Jhc2ljfSwKKyAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9PYmplY3Q6OlNjcmlwdF9BdHRyaWJ1dGVfQk9PTCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6TG9jaywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIG51bWJlclN5bWJvbCAqLwogICAgIHsweDMxYjE5YzEsIEwibmFtZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX05hbWUsIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCisgICAgIFhGQV9BdHRyaWJ1dGU6Ok5hbWUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiB0YWdnZWQgKi8KICAgICB7MHhiZTUyZGZiZiwgTCJkZXNjIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfRGVzYywgWEZBX1NDUklQVF9CYXNpY30sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfT2JqZWN0OjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6RGVzYywgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKICAgICB7MHhmNmI0Nzc0OSwgTCJsb2NrIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAotICAgICBYRkFfQVRUUklCVVRFX0xvY2ssIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJiOGRmNWQsIEwicmVmIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfUmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhjMDgxMWVkLCBMInVzZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1VzZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4NTcwY2U4MzUsIEwicHJlc2VuY2UiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9QcmVzZW5jZSwgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4YTViNDEwY2YsIEwic2F2ZSIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9BdHRyaWJ1dGVfU3RyaW5nLAotICAgICBYRkFfQVRUUklCVVRFX1NhdmUsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGJjMjU0MzMyLCBMInVzZWhyZWYiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9Vc2VocmVmLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhiMmM4MDg1NywgTCJjbGFzc05hbWUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9PYmplY3Q6OlNjcmlwdF9PYmplY3RDbGFzc19DbGFzc05hbWUsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhhNjBkZDIwMiwgTCJsZW5ndGgiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlTGlzdDo6U2NyaXB0X0xpc3RDbGFzc19MZW5ndGgsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHgzMWIxOWMxLCBMIm5hbWUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfQXR0cmlidXRlX1N0cmluZywKLSAgICAgWEZBX0FUVFJJQlVURV9OYW1lLCBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHg5ZjlkMGY5LCBMImFsbCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfQWxsLCAtMSwKLSAgICAgWEZBX1NDUklQVF9PYmplY3R9LAotICAgIHsweDRkZjE1NjU5LCBMIm5vZGVzIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19Ob2RlcywgLTEsCi0gICAgIFhGQV9TQ1JJUFRfT2JqZWN0fSwKLSAgICB7MHg3OGE4ZDZjZiwgTCJjbGFzc0FsbCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfQ2xhc3NBbGwsIC0xLAotICAgICBYRkFfU0NSSVBUX09iamVjdH0sCi0gICAgezB4Y2FkNmQ4Y2EsIEwicGFyZW50IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X1RyZWVDbGFzc19QYXJlbnQsIC0xLAotICAgICBYRkFfU0NSSVBUX09iamVjdH0sCi0gICAgezB4ZDU2NzljNzgsIEwiaW5kZXgiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfVHJlZUNsYXNzX0luZGV4LCAtMSwKLSAgICAgWEZBX1NDUklQVF9CYXNpY30sCi0gICAgezB4ZGI1YjRiY2UsIEwiY2xhc3NJbmRleCIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfQ2xhc3NJbmRleCwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X0F0dHJpYnV0ZV9CT09MLAorICAgICBYRkFfQXR0cmlidXRlOjpMb2NrLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogaXRlbXMgKi8KKyAgICB7MHhiYjhkZjVkLCBMInJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfSXRlbXM6OnJlZiwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UmVmLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGMwODExZWQsIEwidXNlIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9JdGVtczo6dXNlLAorICAgICBYRkFfQXR0cmlidXRlOjpVc2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4NTcwY2U4MzUsIEwicHJlc2VuY2UiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX0l0ZW1zOjpwcmVzZW5jZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6UHJlc2VuY2UsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YTViNDEwY2YsIEwic2F2ZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfSXRlbXM6OnNhdmUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlNhdmUsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisgICAgezB4YmMyNTQzMzIsIEwidXNlaHJlZiIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfSXRlbXM6OnVzZWhyZWYsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVzZWhyZWYsIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCisKKyAgICAvKiBvYmplY3QgKi8KKyAgICB7MHhiMmM4MDg1NywgTCJjbGFzc05hbWUiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6Y2xhc3NOYW1lLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogbGlzdCAqLworICAgIHsweGE2MGRkMjAyLCBMImxlbmd0aCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTGlzdDo6bGVuZ3RoLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorCisgICAgLyogW3Vua25vd25dICovCisKKyAgICAvKiB0cmVlICovCisgICAgezB4MzFiMTljMSwgTCJuYW1lIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9UcmVlOjpuYW1lLAorICAgICBYRkFfQXR0cmlidXRlOjpOYW1lLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDlmOWQwZjksIEwiYWxsIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9UcmVlOjphbGwsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpPYmplY3R9LAorICAgIHsweDRkZjE1NjU5LCBMIm5vZGVzIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9UcmVlOjpub2RlcywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6Ok9iamVjdH0sCisgICAgezB4NzhhOGQ2Y2YsIEwiY2xhc3NBbGwiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1RyZWU6OmNsYXNzQWxsLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6T2JqZWN0fSwKKyAgICB7MHhjYWQ2ZDhjYSwgTCJwYXJlbnQiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1RyZWU6OnBhcmVudCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6Ok9iamVjdH0sCisgICAgezB4ZDU2NzljNzgsIEwiaW5kZXgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1RyZWU6OmluZGV4LAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweGRiNWI0YmNlLCBMImNsYXNzSW5kZXgiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX1RyZWU6OmNsYXNzSW5kZXgsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZTQ5ODlhZGYsIEwic29tRXhwcmVzc2lvbiIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9UcmVlQ2xhc3NfU29tRXhwcmVzc2lvbiwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDIxYWVkLCBMImlkIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmcsCi0gICAgIFhGQV9BVFRSSUJVVEVfSWQsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDIzNGExLCBMIm5zIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19OcywKLSAgICAgLTEsIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweDUwZDFhOWQxLCBMIm1vZGVsIiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X05vZGVDbGFzc19Nb2RlbCwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfT2JqZWN0fSwKLSAgICB7MHhhY2I0ODIzZiwgTCJpc0NvbnRhaW5lciIsCi0gICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDWEZBX05vZGU6OlNjcmlwdF9Ob2RlQ2xhc3NfSXNDb250YWluZXIsIC0xLAotICAgICBYRkFfU0NSSVBUX0Jhc2ljfSwKLSAgICB7MHhlMzcyYWU5NywgTCJpc051bGwiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX0lzTnVsbCwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAotICAgIHsweGZlNjEyYTViLCBMIm9uZU9mQ2hpbGQiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTm9kZUNsYXNzX09uZU9mQ2hpbGQsIC0xLAotICAgICBYRkFfU0NSSVBUX09iamVjdH0sCi0gICAgezB4OTdjMWM2NSwgTCJjb250ZXh0IiwKLSAgICAgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNYRkFfTm9kZTo6U2NyaXB0X01vZGVsQ2xhc3NfQ29udGV4dCwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfT2JqZWN0fSwKLSAgICB7MHg1OGJlMjg3MCwgTCJhbGlhc05vZGUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfTW9kZWxDbGFzc19BbGlhc05vZGUsIC0xLAotICAgICBYRkFfU0NSSVBUX09iamVjdH0sCisgICAgIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfVHJlZTo6c29tRXhwcmVzc2lvbiwgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwKKyAgICAgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKworICAgIC8qIG5vZGUgKi8KKyAgICB7MHgyMWFlZCwgTCJpZCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTm9kZTo6aWQsIFhGQV9BdHRyaWJ1dGU6OklkLAorICAgICBYRkFfU2NyaXB0VHlwZTo6QmFzaWN9LAorICAgIHsweDIzNGExLCBMIm5zIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Ob2RlOjpucywKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHg1MGQxYTlkMSwgTCJtb2RlbCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTm9kZTo6bW9kZWwsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpPYmplY3R9LAorICAgIHsweGFjYjQ4MjNmLCBMImlzQ29udGFpbmVyIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Ob2RlOjppc0NvbnRhaW5lciwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhlMzcyYWU5NywgTCJpc051bGwiLCAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX05vZGU6OmlzTnVsbCwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6OkJhc2ljfSwKKyAgICB7MHhmZTYxMmE1YiwgTCJvbmVPZkNoaWxkIiwgKFhGQV9BVFRSSUJVVEVfQ0FMTEJBQ0spJkNKWF9Ob2RlOjpvbmVPZkNoaWxkLAorICAgICBYRkFfQXR0cmlidXRlOjpVbmtub3duLCBYRkFfU2NyaXB0VHlwZTo6T2JqZWN0fSwKKworICAgIC8qIFt1bmtub3duXSAqLworCisgICAgLyogW3Vua25vd25dICovCisKKyAgICAvKiBtb2RlbCAqLworICAgIHsweDk3YzFjNjUsIEwiY29udGV4dCIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTW9kZWw6OmNvbnRleHQsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpPYmplY3R9LAorICAgIHsweDU4YmUyODcwLCBMImFsaWFzTm9kZSIsIChYRkFfQVRUUklCVVRFX0NBTExCQUNLKSZDSlhfTW9kZWw6OmFsaWFzTm9kZSwKKyAgICAgWEZBX0F0dHJpYnV0ZTo6VW5rbm93biwgWEZBX1NjcmlwdFR5cGU6Ok9iamVjdH0sCisKKyAgICAvKiBbdW5rbm93bl0gKi8KICAgICB7MHhhNTI2ODJiZCwgTCJ7ZGVmYXVsdH0iLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiAgICAgezB4ZDZlMjdmMWQsIEwidmFsdWUiLAotICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ1hGQV9Ob2RlOjpTY3JpcHRfU29tX0RlZmF1bHRWYWx1ZSwgLTEsCi0gICAgIFhGQV9TQ1JJUFRfQmFzaWN9LAorICAgICAoWEZBX0FUVFJJQlVURV9DQUxMQkFDSykmQ0pYX09iamVjdDo6U2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUsCisgICAgIFhGQV9BdHRyaWJ1dGU6OlVua25vd24sIFhGQV9TY3JpcHRUeXBlOjpCYXNpY30sCiB9OwotY29uc3QgaW50MzJfdCBnX2lTb21BdHRyaWJ1dGVDb3VudCA9Ci0gICAgc2l6ZW9mKGdfU29tQXR0cmlidXRlRGF0YSkgLyBzaXplb2YoWEZBX0FUVFJJQlVURUlORk8pOworY29uc3QgaW50MzJfdCBnX2lTb21BdHRyaWJ1dGVDb3VudCA9IEZYX0FycmF5U2l6ZShnX1NvbUF0dHJpYnV0ZURhdGEpOwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL3hmYV9iYXNpY19kYXRhX2VudW0uY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL3hmYV9iYXNpY19kYXRhX2VudW0uY3BwCmluZGV4IDA2Y2Q3NjQuLjMzYzVjZjQgMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci94ZmFfYmFzaWNfZGF0YV9lbnVtLmNwcAorKysgYi94ZmEvZnhmYS9wYXJzZXIveGZhX2Jhc2ljX2RhdGFfZW51bS5jcHAKQEAgLTgsMjc0ICs4LDI3NCBAQAogCiAjaW5jbHVkZSAieGZhL2Z4ZmEvZnhmYV9iYXNpYy5oIgogCi1jb25zdCBYRkFfQVRUUklCVVRFRU5VTUlORk8gZ19YRkFFbnVtRGF0YVtdID0gewotICAgIHsweDJhLCBMIioiLCBYRkFfQVRUUklCVVRFRU5VTV9Bc3Rlcmlza30sCi0gICAgezB4MmYsIEwiLyIsIFhGQV9BVFRSSUJVVEVFTlVNX1NsYXNofSwKLSAgICB7MHg1YywgTCJcXCIsIFhGQV9BVFRSSUJVVEVFTlVNX0JhY2tzbGFzaH0sCi0gICAgezB4MjM5YmQsIEwib24iLCBYRkFfQVRUUklCVVRFRU5VTV9Pbn0sCi0gICAgezB4MjUzNTYsIEwidGIiLCBYRkFfQVRUUklCVVRFRU5VTV9UYn0sCi0gICAgezB4MjU4ODUsIEwidXAiLCBYRkFfQVRUUklCVVRFRU5VTV9VcH0sCi0gICAgezB4OTFiMjgxLCBMIm1ldGFEYXRhIiwgWEZBX0FUVFJJQlVURUVOVU1fTWV0YURhdGF9LAotICAgIHsweDFmOGRlZGIsIEwiZGVsZWdhdGUiLCBYRkFfQVRUUklCVVRFRU5VTV9EZWxlZ2F0ZX0sCi0gICAgezB4MmE2YzU1YSwgTCJwb3N0U3VibWl0IiwgWEZBX0FUVFJJQlVURUVOVU1fUG9zdFN1Ym1pdH0sCi0gICAgezB4MzFiMTljMSwgTCJuYW1lIiwgWEZBX0FUVFJJQlVURUVOVU1fTmFtZX0sCi0gICAgezB4Mzc4YTM4YSwgTCJjcm9zcyIsIFhGQV9BVFRSSUJVVEVFTlVNX0Nyb3NzfSwKLSAgICB7MHgzODQ4YjNmLCBMIm5leHQiLCBYRkFfQVRUUklCVVRFRU5VTV9OZXh0fSwKLSAgICB7MHg0OGI2NjcwLCBMIm5vbmUiLCBYRkFfQVRUUklCVVRFRU5VTV9Ob25lfSwKLSAgICB7MHg1MWFhZmU1LCBMInNob3J0RWRnZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1Nob3J0RWRnZX0sCi0gICAgezB4NTUyNjRjNCwgTCIxbW9kMTBfMW1vZDExIiwgWEZBX0FUVFJJQlVURUVOVU1fMW1vZDEwXzFtb2QxMX0sCi0gICAgezB4NWE1YzUxOSwgTCJoZWlnaHQiLCBYRkFfQVRUUklCVVRFRU5VTV9IZWlnaHR9LAotICAgIHsweDg5Y2U1NDksIEwiY3Jvc3NEaWFnb25hbCIsIFhGQV9BVFRSSUJVVEVFTlVNX0Nyb3NzRGlhZ29uYWx9LAotICAgIHsweDlmOWQwZjksIEwiYWxsIiwgWEZBX0FUVFJJQlVURUVOVU1fQWxsfSwKLSAgICB7MHg5ZjlkYjQ4LCBMImFueSIsIFhGQV9BVFRSSUJVVEVFTlVNX0FueX0sCi0gICAgezB4YTEyNjI2MSwgTCJ0b1JpZ2h0IiwgWEZBX0FUVFJJQlVURUVOVU1fVG9SaWdodH0sCi0gICAgezB4YTM2ZGUyOSwgTCJtYXRjaFRlbXBsYXRlIiwgWEZBX0FUVFJJQlVURUVOVU1fTWF0Y2hUZW1wbGF0ZX0sCi0gICAgezB4YTQ4ZDA0MCwgTCJkcGwiLCBYRkFfQVRUUklCVVRFRU5VTV9EcGx9LAotICAgIHsweGE1NTljMDUsIEwiaW52aXNpYmxlIiwgWEZBX0FUVFJJQlVURUVOVU1fSW52aXNpYmxlfSwKLSAgICB7MHhhN2Q0OGUzLCBMImZpdCIsIFhGQV9BVFRSSUJVVEVFTlVNX0ZpdH0sCi0gICAgezB4YThhOGY4MCwgTCJ3aWR0aCIsIFhGQV9BVFRSSUJVVEVFTlVNX1dpZHRofSwKLSAgICB7MHhhYjQ2NmJiLCBMInByZVN1Ym1pdCIsIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVN1Ym1pdH0sCi0gICAgezB4YWNjNTc4NSwgTCJpcGwiLCBYRkFfQVRUUklCVVRFRU5VTV9JcGx9LAotICAgIHsweGFmYWIwZjgsIEwiZmxhdGVDb21wcmVzcyIsIFhGQV9BVFRSSUJVVEVFTlVNX0ZsYXRlQ29tcHJlc3N9LAotICAgIHsweGIzNTU4MTYsIEwibWVkIiwgWEZBX0FUVFJJQlVURUVOVU1fTWVkfSwKLSAgICB7MHhiNjllZjc3LCBMIm9kZCIsIFhGQV9BVFRSSUJVVEVFTlVNX09kZH0sCi0gICAgezB4YjY5ZjliYiwgTCJvZmYiLCBYRkFfQVRUUklCVVRFRU5VTV9PZmZ9LAotICAgIHsweGI4NDNkYmEsIEwicGRmIiwgWEZBX0FUVFJJQlVURUVOVU1fUGRmfSwKLSAgICB7MHhiYjkxMmI4LCBMInJvdyIsIFhGQV9BVFRSSUJVVEVFTlVNX1Jvd30sCi0gICAgezB4YmVkYWYzMywgTCJ0b3AiLCBYRkFfQVRUUklCVVRFRU5VTV9Ub3B9LAotICAgIHsweGM1NmFmY2MsIEwieGRwIiwgWEZBX0FUVFJJQlVURUVOVU1fWGRwfSwKLSAgICB7MHhjNTZiYTAyLCBMInhmZCIsIFhGQV9BVFRSSUJVVEVFTlVNX1hmZH0sCi0gICAgezB4YzU2ZGRmMSwgTCJ4bWwiLCBYRkFfQVRUUklCVVRFRU5VTV9YbWx9LAotICAgIHsweGM4YjY1ZjMsIEwiemlwIiwgWEZBX0FUVFJJQlVURUVOVU1fWmlwfSwKLSAgICB7MHhjOGI4OWQ2LCBMInpwbCIsIFhGQV9BVFRSSUJVVEVFTlVNX1pwbH0sCi0gICAgezB4ZjU1ZDdlZSwgTCJ2aXNpYmxlIiwgWEZBX0FUVFJJQlVURUVOVU1fVmlzaWJsZX0sCi0gICAgezB4ZmUzNTk2YSwgTCJleGNsdWRlIiwgWEZBX0FUVFJJQlVURUVOVU1fRXhjbHVkZX0sCi0gICAgezB4MTA5ZDdjZTcsIEwibW91c2VFbnRlciIsIFhGQV9BVFRSSUJVVEVFTlVNX01vdXNlRW50ZXJ9LAotICAgIHsweDEwZjFiYzBjLCBMInBhaXIiLCBYRkFfQVRUUklCVVRFRU5VTV9QYWlyfSwKLSAgICB7MHgxMTU0ZWZlNiwgTCJmaWx0ZXIiLCBYRkFfQVRUUklCVVRFRU5VTV9GaWx0ZXJ9LAotICAgIHsweDEyNWJjOTRiLCBMIm1vdmVMYXN0IiwgWEZBX0FUVFJJQlVURUVOVU1fTW92ZUxhc3R9LAotICAgIHsweDEyZTFmMWYwLCBMImV4cG9ydEFuZEltcG9ydCIsIFhGQV9BVFRSSUJVVEVFTlVNX0V4cG9ydEFuZEltcG9ydH0sCi0gICAgezB4MTMwMDBjNjAsIEwicHVzaCIsIFhGQV9BVFRSSUJVVEVFTlVNX1B1c2h9LAotICAgIHsweDEzOGVlMzE1LCBMInBvcnRyYWl0IiwgWEZBX0FUVFJJQlVURUVOVU1fUG9ydHJhaXR9LAotICAgIHsweDE0ZGEyMTI1LCBMImRlZmF1bHQiLCBYRkFfQVRUUklCVVRFRU5VTV9EZWZhdWx0fSwKLSAgICB7MHgxNTc3NDlhNSwgTCJzdG9yZWRQcm9jIiwgWEZBX0FUVFJJQlVURUVOVU1fU3RvcmVkUHJvY30sCi0gICAgezB4MTY2NDExOTgsIEwic3RheUJPRiIsIFhGQV9BVFRSSUJVVEVFTlVNX1N0YXlCT0Z9LAotICAgIHsweDE2YjJmYzViLCBMInN0YXlFT0YiLCBYRkFfQVRUUklCVVRFRU5VTV9TdGF5RU9GfSwKLSAgICB7MHgxN2ZhZDM3MywgTCJwb3N0UHJpbnQiLCBYRkFfQVRUUklCVVRFRU5VTV9Qb3N0UHJpbnR9LAotICAgIHsweDE5MzIwN2QwLCBMInVzQ2FycmllciIsIFhGQV9BVFRSSUJVVEVFTlVNX1VzQ2Fycmllcn0sCi0gICAgezB4MTkzYWRlM2UsIEwicmlnaHQiLCBYRkFfQVRUUklCVVRFRU5VTV9SaWdodH0sCi0gICAgezB4MWJmYzcyZDksIEwicHJlT3BlbiIsIFhGQV9BVFRSSUJVVEVFTlVNX1ByZU9wZW59LAotICAgIHsweDFjYzkzMTdhLCBMImFjdHVhbCIsIFhGQV9BVFRSSUJVVEVFTlVNX0FjdHVhbH0sCi0gICAgezB4MWYzMWRmMWUsIEwicmVzdCIsIFhGQV9BVFRSSUJVVEVFTlVNX1Jlc3R9LAotICAgIHsweDFmYjFiZjE0LCBMInRvcENlbnRlciIsIFhGQV9BVFRSSUJVVEVFTlVNX1RvcENlbnRlcn0sCi0gICAgezB4MjA3ZGU2NjcsIEwic3RhbmRhcmRTeW1ib2wiLCBYRkFfQVRUUklCVVRFRU5VTV9TdGFuZGFyZFN5bWJvbH0sCi0gICAgezB4MjE5NmE0NTIsIEwiaW5pdGlhbGl6ZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0luaXRpYWxpemV9LAotICAgIHsweDIzYmQ0MGM3LCBMImp1c3RpZnlBbGwiLCBYRkFfQVRUUklCVVRFRU5VTV9KdXN0aWZ5QWxsfSwKLSAgICB7MHgyNDdjZjNlOSwgTCJub3JtYWwiLCBYRkFfQVRUUklCVVRFRU5VTV9Ob3JtYWx9LAotICAgIHsweDI1YWE5NDZiLCBMImxhbmRzY2FwZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0xhbmRzY2FwZX0sCi0gICAgezB4MjczOWI1YzksIEwibm9uSW50ZXJhY3RpdmUiLCBYRkFfQVRUUklCVVRFRU5VTV9Ob25JbnRlcmFjdGl2ZX0sCi0gICAgezB4Mjc0MTBmMDMsIEwibW91c2VFeGl0IiwgWEZBX0FUVFJJQlVURUVOVU1fTW91c2VFeGl0fSwKLSAgICB7MHgyODU0ZTYyYywgTCJtaW51cyIsIFhGQV9BVFRSSUJVVEVFTlVNX01pbnVzfSwKLSAgICB7MHgyODdlOTM2YSwgTCJkaWFnb25hbExlZnQiLCBYRkFfQVRUUklCVVRFRU5VTV9EaWFnb25hbExlZnR9LAotICAgIHsweDI5NzJhOThmLCBMInNpbXBsZXhQYWdpbmF0ZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9TaW1wbGV4UGFnaW5hdGVkfSwKLSAgICB7MHgyOWQ4MjI1ZiwgTCJkb2N1bWVudCIsIFhGQV9BVFRSSUJVVEVFTlVNX0RvY3VtZW50fSwKLSAgICB7MHgyYTlkMzAxNiwgTCJ3YXJuaW5nIiwgWEZBX0FUVFJJQlVURUVOVU1fV2FybmluZ30sCi0gICAgezB4MmIzNWI2ZDksIEwiYXV0byIsIFhGQV9BVFRSSUJVVEVFTlVNX0F1dG99LAotICAgIHsweDJjMTY1M2Q5LCBMImJlbG93IiwgWEZBX0FUVFJJQlVURUVOVU1fQmVsb3d9LAotICAgIHsweDJjMWYwNTQwLCBMImJvdHRvbUxlZnQiLCBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21MZWZ0fSwKLSAgICB7MHgyYzQ0ZTgxNiwgTCJib3R0b21DZW50ZXIiLCBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21DZW50ZXJ9LAotICAgIHsweDJjZDNlOWYzLCBMInRjcGwiLCBYRkFfQVRUUklCVVRFRU5VTV9UY3BsfSwKLSAgICB7MHgyZDA4YWY4NSwgTCJ0ZXh0IiwgWEZBX0FUVFJJQlVURUVOVU1fVGV4dH0sCi0gICAgezB4MmRjNDc4ZWIsIEwiZ3JvdXBpbmciLCBYRkFfQVRUUklCVVRFRU5VTV9Hcm91cGluZ30sCi0gICAgezB4MmVmM2FmZGQsIEwic2VjdXJlU3ltYm9sIiwgWEZBX0FUVFJJQlVURUVOVU1fU2VjdXJlU3ltYm9sfSwKLSAgICB7MHgyZjJkZDI5YSwgTCJwcmVFeGVjdXRlIiwgWEZBX0FUVFJJQlVURUVOVU1fUHJlRXhlY3V0ZX0sCi0gICAgezB4MzNjNDNkZWMsIEwiZG9jQ2xvc2UiLCBYRkFfQVRUUklCVVRFRU5VTV9Eb2NDbG9zZX0sCi0gICAgezB4MzNmMjViYjUsIEwia2V5c2V0IiwgWEZBX0FUVFJJQlVURUVOVU1fS2V5c2V0fSwKLSAgICB7MHgzNGUzNjNkYSwgTCJ2ZXJ0aWNhbCIsIFhGQV9BVFRSSUJVVEVFTlVNX1ZlcnRpY2FsfSwKLSAgICB7MHgzNjFmYTFiNiwgTCJwcmVTYXZlIiwgWEZBX0FUVFJJQlVURUVOVU1fUHJlU2F2ZX0sCi0gICAgezB4MzZmMWM2ZDgsIEwicHJlU2lnbiIsIFhGQV9BVFRSSUJVVEVFTlVNX1ByZVNpZ259LAotICAgIHsweDM5OWYwMmI1LCBMImJvdHRvbSIsIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbX0sCi0gICAgezB4M2IwYWIwOTYsIEwidG9Ub3AiLCBYRkFfQVRUUklCVVRFRU5VTV9Ub1RvcH0sCi0gICAgezB4M2M3NTI0OTUsIEwidmVyaWZ5IiwgWEZBX0FUVFJJQlVURUVOVU1fVmVyaWZ5fSwKLSAgICB7MHgzY2UwNWQ2OCwgTCJmaXJzdCIsIFhGQV9BVFRSSUJVVEVFTlVNX0ZpcnN0fSwKLSAgICB7MHgzZWNlYWQ5NCwgTCJjb250ZW50QXJlYSIsIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhfSwKLSAgICB7MHg0MDYyM2I1YiwgTCJzb2xpZCIsIFhGQV9BVFRSSUJVVEVFTlVNX1NvbGlkfSwKLSAgICB7MHg0MmM2Y2Q4ZCwgTCJwZXNzaW1pc3RpYyIsIFhGQV9BVFRSSUJVVEVFTlVNX1Blc3NpbWlzdGljfSwKLSAgICB7MHg0M2RkYzZiZiwgTCJkdXBsZXhQYWdpbmF0ZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9EdXBsZXhQYWdpbmF0ZWR9LAotICAgIHsweDQ0MmY2OGM4LCBMInJvdW5kIiwgWEZBX0FUVFJJQlVURUVOVU1fUm91bmR9LAotICAgIHsweDQ1ZWZiODQ3LCBMInJlbWVyZ2UiLCBYRkFfQVRUUklCVVRFRU5VTV9SZW1lcmdlfSwKLSAgICB7MHg0Njk3MjI2NSwgTCJvcmRlcmVkIiwgWEZBX0FUVFJJQlVURUVOVU1fT3JkZXJlZH0sCi0gICAgezB4NDZmOTU1MzEsIEwicGVyY2VudCIsIFhGQV9BVFRSSUJVVEVFTlVNX1BlcmNlbnR9LAotICAgIHsweDQ2ZmQyNWFlLCBMImV2ZW4iLCBYRkFfQVRUUklCVVRFRU5VTV9FdmVufSwKLSAgICB7MHg0NzMxZDZiYSwgTCJleGl0IiwgWEZBX0FUVFJJQlVURUVOVU1fRXhpdH0sCi0gICAgezB4NDk3NzM1NmIsIEwidG9vbFRpcCIsIFhGQV9BVFRSSUJVVEVFTlVNX1Rvb2xUaXB9LAotICAgIHsweDQ5Yjk4MGVlLCBMIm9yZGVyZWRPY2N1cnJlbmNlIiwgWEZBX0FUVFJJQlVURUVOVU1fT3JkZXJlZE9jY3VycmVuY2V9LAotICAgIHsweDRhN2UyZGZlLCBMInJlYWRPbmx5IiwgWEZBX0FUVFJJQlVURUVOVU1fUmVhZE9ubHl9LAotICAgIHsweDRjNGU4YWNiLCBMImN1cnJlbmN5IiwgWEZBX0FUVFJJQlVURUVOVU1fQ3VycmVuY3l9LAotICAgIHsweDRkY2YyNWY4LCBMImNvbmNhdCIsIFhGQV9BVFRSSUJVVEVFTlVNX0NvbmNhdH0sCi0gICAgezB4NGZlYmI4MjYsIEwiVGhhaSIsIFhGQV9BVFRSSUJVVEVFTlVNX1RoYWl9LAotICAgIHsweDUwZWY5NWIyLCBMImVtYm9zc2VkIiwgWEZBX0FUVFJJQlVURUVOVU1fRW1ib3NzZWR9LAotICAgIHsweDUxNmUzNWNlLCBMImZvcm1kYXRhIiwgWEZBX0FUVFJJQlVURUVOVU1fRm9ybWRhdGF9LAotICAgIHsweDUyZmE2ZjBlLCBMIkdyZWVrIiwgWEZBX0FUVFJJQlVURUVOVU1fR3JlZWt9LAotICAgIHsweDU0MDM0YzJmLCBMImRlY2ltYWwiLCBYRkFfQVRUUklCVVRFRU5VTV9EZWNpbWFsfSwKLSAgICB7MHg1NDJjNzMwMCwgTCJzZWxlY3QiLCBYRkFfQVRUUklCVVRFRU5VTV9TZWxlY3R9LAotICAgIHsweDU1MWYwYWU1LCBMImxvbmdFZGdlIiwgWEZBX0FUVFJJQlVURUVOVU1fTG9uZ0VkZ2V9LAotICAgIHsweDU1NTIwYThhLCBMInByb3RlY3RlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX1Byb3RlY3RlZH0sCi0gICAgezB4NTU5Zjc2ZjMsIEwiYm90dG9tUmlnaHQiLCBYRkFfQVRUUklCVVRFRU5VTV9Cb3R0b21SaWdodH0sCi0gICAgezB4NTY4Y2I1MDAsIEwiemVybyIsIFhGQV9BVFRSSUJVVEVFTlVNX1plcm99LAotICAgIHsweDU2YmNlY2I3LCBMImZvcndhcmRPbmx5IiwgWEZBX0FUVFJJQlVURUVOVU1fRm9yd2FyZE9ubHl9LAotICAgIHsweDU2YmY0NTZiLCBMImRvY1JlYWR5IiwgWEZBX0FUVFJJQlVURUVOVU1fRG9jUmVhZHl9LAotICAgIHsweDU3M2NiNDBjLCBMImhpZGRlbiIsIFhGQV9BVFRSSUJVVEVFTlVNX0hpZGRlbn0sCi0gICAgezB4NTgyZTM0MjQsIEwiaW5jbHVkZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0luY2x1ZGV9LAotICAgIHsweDU4YTNkZDI5LCBMImRhc2hlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX0Rhc2hlZH0sCi0gICAgezB4NTk1NWIyMmIsIEwibXVsdGlTZWxlY3QiLCBYRkFfQVRUUklCVVRFRU5VTV9NdWx0aVNlbGVjdH0sCi0gICAgezB4NTk4ZDVjNTMsIEwiaW5hY3RpdmUiLCBYRkFfQVRUUklCVVRFRU5VTV9JbmFjdGl2ZX0sCi0gICAgezB4NTljOGYyN2QsIEwiZW1iZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9FbWJlZH0sCi0gICAgezB4NWU3NTU1ZTgsIEwic3RhdGljIiwgWEZBX0FUVFJJQlVURUVOVU1fU3RhdGljfSwKLSAgICB7MHg2MDZkNGRlZiwgTCJvbkVudHJ5IiwgWEZBX0FUVFJJQlVURUVOVU1fT25FbnRyeX0sCi0gICAgezB4NjE5NWVhZmIsIEwiQ3lyaWxsaWMiLCBYRkFfQVRUUklCVVRFRU5VTV9DeXJpbGxpY30sCi0gICAgezB4NjQ5MWIwZjMsIEwibm9uQmxhbmsiLCBYRkFfQVRUUklCVVRFRU5VTV9Ob25CbGFua30sCi0gICAgezB4NjdiZWYwMzEsIEwidG9wUmlnaHQiLCBYRkFfQVRUUklCVVRFRU5VTV9Ub3BSaWdodH0sCi0gICAgezB4NjdkZjVlYmQsIEwiSGVicmV3IiwgWEZBX0FUVFJJQlVURUVOVU1fSGVicmV3fSwKLSAgICB7MHg2YWVhOThiZSwgTCJ0b3BMZWZ0IiwgWEZBX0FUVFJJQlVURUVOVU1fVG9wTGVmdH0sCi0gICAgezB4NmM1MWFmYzEsIEwiY2VudGVyIiwgWEZBX0FUVFJJQlVURUVOVU1fQ2VudGVyfSwKLSAgICB7MHg3MTQ1ZTZiZiwgTCJtb3ZlRmlyc3QiLCBYRkFfQVRUUklCVVRFRU5VTV9Nb3ZlRmlyc3R9LAotICAgIHsweDczNzU0NjVjLCBMImRpYW1vbmQiLCBYRkFfQVRUUklCVVRFRU5VTV9EaWFtb25kfSwKLSAgICB7MHg3NDYxYWVmNCwgTCJwYWdlT2RkIiwgWEZBX0FUVFJJQlVURUVOVU1fUGFnZU9kZH0sCi0gICAgezB4NzVmOGFlYjIsIEwiMW1vZDEwIiwgWEZBX0FUVFJJQlVURUVOVU1fMW1vZDEwfSwKLSAgICB7MHg3NmQ3MDhlMCwgTCJLb3JlYW4iLCBYRkFfQVRUUklCVVRFRU5VTV9Lb3JlYW59LAotICAgIHsweDc4OWYxNGQ3LCBMImFib3ZlRW1iZWRkZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9BYm92ZUVtYmVkZGVkfSwKLSAgICB7MHg3OTJlYTM5ZiwgTCJ6aXBDb21wcmVzcyIsIFhGQV9BVFRSSUJVVEVFTlVNX1ppcENvbXByZXNzfSwKLSAgICB7MHg3YTViNzE5MywgTCJudW1lcmljIiwgWEZBX0FUVFJJQlVURUVOVU1fTnVtZXJpY30sCi0gICAgezB4N2FiZWMwZDIsIEwiY2lyY2xlIiwgWEZBX0FUVFJJQlVURUVOVU1fQ2lyY2xlfSwKLSAgICB7MHg3YWZiYmEzOCwgTCJ0b0JvdHRvbSIsIFhGQV9BVFRSSUJVVEVFTlVNX1RvQm90dG9tfSwKLSAgICB7MHg3Yjk1ZTY2MSwgTCJpbnZlcnRlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX0ludmVydGVkfSwKLSAgICB7MHg3YmFjYTJlMywgTCJ1cGRhdGUiLCBYRkFfQVRUUklCVVRFRU5VTV9VcGRhdGV9LAotICAgIHsweDdlYjVkYTJjLCBMImlzb25hbWUiLCBYRkFfQVRUUklCVVRFRU5VTV9Jc29uYW1lfSwKLSAgICB7MHg3ZjZmZDNkNywgTCJzZXJ2ZXIiLCBYRkFfQVRUUklCVVRFRU5VTV9TZXJ2ZXJ9LAotICAgIHsweDgxNGY4MmI1LCBMInBvc2l0aW9uIiwgWEZBX0FUVFJJQlVURUVOVU1fUG9zaXRpb259LAotICAgIHsweDgyZGVhY2YwLCBMIm1pZGRsZUNlbnRlciIsIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZUNlbnRlcn0sCi0gICAgezB4ODNhNDlkYzYsIEwib3B0aW9uYWwiLCBYRkFfQVRUUklCVVRFRU5VTV9PcHRpb25hbH0sCi0gICAgezB4ODYxYTExNmYsIEwidXNlUHJpbnRlclNldHRpbmciLCBYRkFfQVRUUklCVVRFRU5VTV9Vc2VQcmludGVyU2V0dGluZ30sCi0gICAgezB4ODY3MDFjZTAsIEwib3V0bGluZSIsIFhGQV9BVFRSSUJVVEVFTlVNX091dGxpbmV9LAotICAgIHsweDg4MDgzODVlLCBMImluZGV4Q2hhbmdlIiwgWEZBX0FUVFJJQlVURUVOVU1fSW5kZXhDaGFuZ2V9LAotICAgIHsweDg5MWY0NjA2LCBMImNoYW5nZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0NoYW5nZX0sCi0gICAgezB4ODk5MzlmMzYsIEwicGFnZUFyZWEiLCBYRkFfQVRUUklCVVRFRU5VTV9QYWdlQXJlYX0sCi0gICAgezB4OGI1YzNiMjUsIEwib25jZSIsIFhGQV9BVFRSSUJVVEVFTlVNX09uY2V9LAotICAgIHsweDhiNWM2OTYyLCBMIm9ubHkiLCBYRkFfQVRUUklCVVRFRU5VTV9Pbmx5fSwKLSAgICB7MHg4YjkwZTFmMiwgTCJvcGVuIiwgWEZBX0FUVFJJQlVURUVOVU1fT3Blbn0sCi0gICAgezB4OGJjZmU5NmUsIEwiY2FwdGlvbiIsIFhGQV9BVFRSSUJVVEVFTlVNX0NhcHRpb259LAotICAgIHsweDhjZTgzZWY4LCBMInJhaXNlZCIsIFhGQV9BVFRSSUJVVEVFTlVNX1JhaXNlZH0sCi0gICAgezB4OGQyNjljYWUsIEwianVzdGlmeSIsIFhGQV9BVFRSSUJVVEVFTlVNX0p1c3RpZnl9LAotICAgIHsweDhmZDUyMGRjLCBMInJlZkFuZERlc2NlbmRhbnRzIiwgWEZBX0FUVFJJQlVURUVOVU1fUmVmQW5kRGVzY2VuZGFudHN9LAotICAgIHsweDkwNDFkNGIwLCBMInNob3J0IiwgWEZBX0FUVFJJQlVURUVOVU1fU2hvcnR9LAotICAgIHsweDkwYzk0NDI2LCBMInBhZ2VGcm9udCIsIFhGQV9BVFRSSUJVVEVFTlVNX1BhZ2VGcm9udH0sCi0gICAgezB4OTM2YmVlZTUsIEwibW9ub3NwYWNlIiwgWEZBX0FUVFJJQlVURUVOVU1fTW9ub3NwYWNlfSwKLSAgICB7MHg5NDdmYTAwZiwgTCJtaWRkbGUiLCBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGV9LAotICAgIHsweDk1MjhhN2I0LCBMInByZVByaW50IiwgWEZBX0FUVFJJQlVURUVOVU1fUHJlUHJpbnR9LAotICAgIHsweDk1OWFiMjMxLCBMImFsd2F5cyIsIFhGQV9BVFRSSUJVVEVFTlVNX0Fsd2F5c30sCi0gICAgezB4OTZkNjFiZjAsIEwidW5rbm93biIsIFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd259LAotICAgIHsweDk5NzE5NGVlLCBMInRvTGVmdCIsIFhGQV9BVFRSSUJVVEVFTlVNX1RvTGVmdH0sCi0gICAgezB4OWE4M2EzY2QsIEwiYWJvdmUiLCBYRkFfQVRUUklCVVRFRU5VTV9BYm92ZX0sCi0gICAgezB4OWQwZDcxYzcsIEwiZGFzaERvdCIsIFhGQV9BVFRSSUJVVEVFTlVNX0Rhc2hEb3R9LAotICAgIHsweDlkZjU2ZjNlLCBMImdyZWdvcmlhbiIsIFhGQV9BVFRSSUJVVEVFTlVNX0dyZWdvcmlhbn0sCi0gICAgezB4OWY2NzIzZmQsIEwiUm9tYW4iLCBYRkFfQVRUUklCVVRFRU5VTV9Sb21hbn0sCi0gICAgezB4OWY2OTNiMjEsIEwibW91c2VEb3duIiwgWEZBX0FUVFJJQlVURUVOVU1fTW91c2VEb3dufSwKLSAgICB7MHhhMTQyOWIzNiwgTCJzeW1ib2wiLCBYRkFfQVRUUklCVVRFRU5VTV9TeW1ib2x9LAotICAgIHsweGE1YWE0NWNiLCBMInBhZ2VFdmVuIiwgWEZBX0FUVFJJQlVURUVOVU1fUGFnZUV2ZW59LAotICAgIHsweGE2ODYzNWYxLCBMInNpZ24iLCBYRkFfQVRUUklCVVRFRU5VTV9TaWdufSwKLSAgICB7MHhhNzMxNTA5MywgTCJhZGROZXciLCBYRkFfQVRUUklCVVRFRU5VTV9BZGROZXd9LAotICAgIHsweGE3YTc3M2ZhLCBMInN0YXIiLCBYRkFfQVRUUklCVVRFRU5VTV9TdGFyfSwKLSAgICB7MHhhN2Q1N2I0NSwgTCJvcHRpbWlzdGljIiwgWEZBX0FUVFJJQlVURUVOVU1fT3B0aW1pc3RpY30sCi0gICAgezB4YTgwNzczMjEsIEwicmwtdGIiLCBYRkFfQVRUUklCVVRFRU5VTV9SbF90Yn0sCi0gICAgezB4YThmMTQ2OGQsIEwibWlkZGxlUmlnaHQiLCBYRkFfQVRUUklCVVRFRU5VTV9NaWRkbGVSaWdodH0sCi0gICAgezB4YWE4NGExZjEsIEwibWFpbnRhaW4iLCBYRkFfQVRUUklCVVRFRU5VTV9NYWludGFpbn0sCi0gICAgezB4YWI0MGIxMmMsIEwicGFja2FnZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1BhY2thZ2V9LAotICAgIHsweGFjOGI0ZDg1LCBMIlNpbXBsaWZpZWRDaGluZXNlIiwgWEZBX0FUVFJJQlVURUVOVU1fU2ltcGxpZmllZENoaW5lc2V9LAotICAgIHsweGFkYWU2NzQ0LCBMInRvQ2VudGVyIiwgWEZBX0FUVFJJQlVURUVOVU1fVG9DZW50ZXJ9LAotICAgIHsweGIwMTI5ZGYxLCBMImJhY2siLCBYRkFfQVRUUklCVVRFRU5VTV9CYWNrfSwKLSAgICB7MHhiMGYwODhjZiwgTCJ1bnNwZWNpZmllZCIsIFhGQV9BVFRSSUJVVEVFTlVNX1Vuc3BlY2lmaWVkfSwKLSAgICB7MHhiMTI3MTA2NywgTCJiYXRjaE9wdGltaXN0aWMiLCBYRkFfQVRUUklCVVRFRU5VTV9CYXRjaE9wdGltaXN0aWN9LAotICAgIHsweGIxODMxM2ExLCBMImJvbGQiLCBYRkFfQVRUUklCVVRFRU5VTV9Cb2xkfSwKLSAgICB7MHhiMTgzM2NhZCwgTCJib3RoIiwgWEZBX0FUVFJJQlVURUVOVU1fQm90aH0sCi0gICAgezB4YjIyMTEyM2YsIEwiYnV0dCIsIFhGQV9BVFRSSUJVVEVFTlVNX0J1dHR9LAotICAgIHsweGI0MGMzNmJmLCBMImNsaWVudCIsIFhGQV9BVFRSSUJVVEVFTlVNX0NsaWVudH0sCi0gICAgezB4YjU2YzcwNTMsIEwiMm1vZDEwIiwgWEZBX0FUVFJJQlVURUVOVU1fMm1vZDEwfSwKLSAgICB7MHhiNjgzYTM0NSwgTCJpbWFnZU9ubHkiLCBYRkFfQVRUUklCVVRFRU5VTV9JbWFnZU9ubHl9LAotICAgIHsweGI3NzMyZGVhLCBMImhvcml6b250YWwiLCBYRkFfQVRUUklCVVRFRU5VTV9Ib3Jpem9udGFsfSwKLSAgICB7MHhiODg2NTJhNCwgTCJkb3R0ZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9Eb3R0ZWR9LAotICAgIHsweGJiMmYyODgwLCBMInVzZXJDb250cm9sIiwgWEZBX0FUVFJJQlVURUVOVU1fVXNlckNvbnRyb2x9LAotICAgIHsweGJiYjc5YzVkLCBMImRpYWdvbmFsUmlnaHQiLCBYRkFfQVRUUklCVVRFRU5VTV9EaWFnb25hbFJpZ2h0fSwKLSAgICB7MHhiZDA3NzE1NCwgTCJjb25zdW1lRGF0YSIsIFhGQV9BVFRSSUJVVEVFTlVNX0NvbnN1bWVEYXRhfSwKLSAgICB7MHhiZDNmYjExZSwgTCJjaGVjayIsIFhGQV9BVFRSSUJVVEVFTlVNX0NoZWNrfSwKLSAgICB7MHhiZGU5YWJkYSwgTCJkYXRhIiwgWEZBX0FUVFJJQlVURUVOVU1fRGF0YX0sCi0gICAgezB4YmY1YTAyZDgsIEwiZG93biIsIFhGQV9BVFRSSUJVVEVFTlVNX0Rvd259LAotICAgIHsweGJmNzQ1MGVlLCBMInNhbnNTZXJpZiIsIFhGQV9BVFRSSUJVVEVFTlVNX1NhbnNTZXJpZn0sCi0gICAgezB4YzAyZDY0OWYsIEwiaW5saW5lIiwgWEZBX0FUVFJJQlVURUVOVU1fSW5saW5lfSwKLSAgICB7MHhjMTFhOWUzYSwgTCJUcmFkaXRpb25hbENoaW5lc2UiLCBYRkFfQVRUUklCVVRFRU5VTV9UcmFkaXRpb25hbENoaW5lc2V9LAotICAgIHsweGMxNjE2OWQ4LCBMIndhcm4iLCBYRkFfQVRUUklCVVRFRU5VTV9XYXJufSwKLSAgICB7MHhjMTZmMDcxZiwgTCJyZWZPbmx5IiwgWEZBX0FUVFJJQlVURUVOVU1fUmVmT25seX0sCi0gICAgezB4YzI3YzhiYTUsIEwiaW50ZXJhY3RpdmVGb3JtcyIsIFhGQV9BVFRSSUJVVEVFTlVNX0ludGVyYWN0aXZlRm9ybXN9LAotICAgIHsweGMyZDFiMTVjLCBMIndvcmQiLCBYRkFfQVRUUklCVVRFRU5VTV9Xb3JkfSwKLSAgICB7MHhjMzYyMTI4OCwgTCJ1bm9yZGVyZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9Vbm9yZGVyZWR9LAotICAgIHsweGM1MjUxOTgxLCBMInJlcXVpcmVkIiwgWEZBX0FUVFJJQlVURUVOVU1fUmVxdWlyZWR9LAotICAgIHsweGM3MDg4ZTdkLCBMImltcG9ydE9ubHkiLCBYRkFfQVRUUklCVVRFRU5VTV9JbXBvcnRPbmx5fSwKLSAgICB7MHhjNzJjZjBlMywgTCJiZWxvd0VtYmVkZGVkIiwgWEZBX0FUVFJJQlVURUVOVU1fQmVsb3dFbWJlZGRlZH0sCi0gICAgezB4YzgxOWNmMDcsIEwiSmFwYW5lc2UiLCBYRkFfQVRUUklCVVRFRU5VTV9KYXBhbmVzZX0sCi0gICAgezB4Y2RjZTU2YjMsIEwiZnVsbCIsIFhGQV9BVFRSSUJVVEVFTlVNX0Z1bGx9LAotICAgIHsweGNlMDEyMmUzLCBMInJsLXJvdyIsIFhGQV9BVFRSSUJVVEVFTlVNX1JsX3Jvd30sCi0gICAgezB4Y2Y3ZDcxZjEsIEwiVmlldG5hbWVzZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1ZpZXRuYW1lc2V9LAotICAgIHsweGNmZGUzZTA5LCBMIkVhc3RFdXJvcGVhblJvbWFuIiwgWEZBX0FUVFJJQlVURUVOVU1fRWFzdEV1cm9wZWFuUm9tYW59LAotICAgIHsweGQ1NzZkMDhlLCBMIm1vdXNlVXAiLCBYRkFfQVRUUklCVVRFRU5VTV9Nb3VzZVVwfSwKLSAgICB7MHhkN2E5MjkwNCwgTCJleHBvcnRPbmx5IiwgWEZBX0FUVFJJQlVURUVOVU1fRXhwb3J0T25seX0sCi0gICAgezB4ZDhlZDE0NjcsIEwiY2xlYXIiLCBYRkFfQVRUUklCVVRFRU5VTV9DbGVhcn0sCi0gICAgezB4ZDk1NjU3YTYsIEwiY2xpY2siLCBYRkFfQVRUUklCVVRFRU5VTV9DbGlja30sCi0gICAgezB4ZDk2YzdkZTUsIEwiYmFzZTY0IiwgWEZBX0FUVFJJQlVURUVOVU1fQmFzZTY0fSwKLSAgICB7MHhkOWY0N2YzNiwgTCJjbG9zZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0Nsb3NlfSwKLSAgICB7MHhkYjA3NWJkZSwgTCJob3N0IiwgWEZBX0FUVFJJQlVURUVOVU1fSG9zdH0sCi0gICAgezB4ZGIxMDM0MTEsIEwiZ2xvYmFsIiwgWEZBX0FUVFJJQlVURUVOVU1fR2xvYmFsfSwKLSAgICB7MHhkYjY0NzE4OCwgTCJibGFuayIsIFhGQV9BVFRSSUJVVEVFTlVNX0JsYW5rfSwKLSAgICB7MHhkYjliZTk2OCwgTCJ0YWJsZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1RhYmxlfSwKLSAgICB7MHhkZjU5MGZiYiwgTCJpbXBvcnQiLCBYRkFfQVRUUklCVVRFRU5VTV9JbXBvcnR9LAotICAgIHsweGUwZTU3M2ZiLCBMImN1c3RvbSIsIFhGQV9BVFRSSUJVVEVFTlVNX0N1c3RvbX0sCi0gICAgezB4ZTBlY2M3OWEsIEwibWlkZGxlTGVmdCIsIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZUxlZnR9LAotICAgIHsweGUxNDUyMDE5LCBMInBvc3RFeGVjdXRlIiwgWEZBX0FUVFJJQlVURUVOVU1fUG9zdEV4ZWN1dGV9LAotICAgIHsweGUxOTExZDk4LCBMInJhZGl4IiwgWEZBX0FUVFJJQlVURUVOVU1fUmFkaXh9LAotICAgIHsweGUyNWZhN2I4LCBMInBvc3RPcGVuIiwgWEZBX0FUVFJJQlVURUVOVU1fUG9zdE9wZW59LAotICAgIHsweGUyOGRjZTdlLCBMImVudGVyIiwgWEZBX0FUVFJJQlVURUVOVU1fRW50ZXJ9LAotICAgIHsweGUyYzQ0ZGU0LCBMImlnbm9yZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0lnbm9yZX0sCi0gICAgezB4ZTJjZDhjNjEsIEwibHItdGIiLCBYRkFfQVRUUklCVVRFRU5VTV9Mcl90Yn0sCi0gICAgezB4ZTJkYTgzMzYsIEwiZmFudGFzeSIsIFhGQV9BVFRSSUJVVEVFTlVNX0ZhbnRhc3l9LAotICAgIHsweGUzMWQ1Mzk2LCBMIml0YWxpYyIsIFhGQV9BVFRSSUJVVEVFTlVNX0l0YWxpY30sCi0gICAgezB4ZTdhZGExMTMsIEwiYXV0aG9yIiwgWEZBX0FUVFJJQlVURUVOVU1fQXV0aG9yfSwKLSAgICB7MHhlOGU3Y2MxOCwgTCJ0b0VkZ2UiLCBYRkFfQVRUUklCVVRFRU5VTV9Ub0VkZ2V9LAotICAgIHsweGU5N2FhOThiLCBMImNob2ljZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0Nob2ljZX0sCi0gICAgezB4ZWFmZDJhMzgsIEwiZGlzYWJsZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9EaXNhYmxlZH0sCi0gICAgezB4ZWIyYjc5NzIsIEwiY3Jvc3NIYXRjaCIsIFhGQV9BVFRSSUJVVEVFTlVNX0Nyb3NzSGF0Y2h9LAotICAgIHsweGViMmRiMmQ3LCBMImRhdGFSZWYiLCBYRkFfQVRUUklCVVRFRU5VTV9EYXRhUmVmfSwKLSAgICB7MHhlYzM1ZGM2ZSwgTCJkYXNoRG90RG90IiwgWEZBX0FUVFJJQlVURUVOVU1fRGFzaERvdERvdH0sCi0gICAgezB4ZWY4NWQzNTEsIEwic3F1YXJlIiwgWEZBX0FUVFJJQlVURUVOVU1fU3F1YXJlfSwKLSAgICB7MHhmMjEwMjQ0NSwgTCJkeW5hbWljIiwgWEZBX0FUVFJJQlVURUVOVU1fRHluYW1pY30sCi0gICAgezB4ZjI3MmM3YmUsIEwibWFudWFsIiwgWEZBX0FUVFJJQlVURUVOVU1fTWFudWFsfSwKLSAgICB7MHhmMmJiYjY0ZCwgTCJldGNoZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9FdGNoZWR9LAotICAgIHsweGYzYjhmYzZjLCBMInZhbGlkYXRpb25TdGF0ZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1ZhbGlkYXRpb25TdGF0ZX0sCi0gICAgezB4ZjQyZjJiODEsIEwiY3Vyc2l2ZSIsIFhGQV9BVFRSSUJVVEVFTlVNX0N1cnNpdmV9LAotICAgIHsweGY1NDQ4MWQ0LCBMImxhc3QiLCBYRkFfQVRUUklCVVRFRU5VTV9MYXN0fSwKLSAgICB7MHhmNWFkNzgyYiwgTCJsZWZ0IiwgWEZBX0FUVFJJQlVURUVOVU1fTGVmdH0sCi0gICAgezB4ZjYxNmRhMmUsIEwibGluayIsIFhGQV9BVFRSSUJVVEVFTlVNX0xpbmt9LAotICAgIHsweGY2YjRhZmIwLCBMImxvbmciLCBYRkFfQVRUUklCVVRFRU5VTV9Mb25nfSwKK2NvbnN0IFhGQV9BdHRyaWJ1dGVFbnVtSW5mbyBnX1hGQUVudW1EYXRhW10gPSB7CisgICAgezB4MmEsIEwiKiIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpBc3Rlcmlza30sCisgICAgezB4MmYsIEwiLyIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpTbGFzaH0sCisgICAgezB4NWMsIEwiXFwiLCBYRkFfQXR0cmlidXRlRW51bTo6QmFja3NsYXNofSwKKyAgICB7MHgyMzliZCwgTCJvbiIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpPbn0sCisgICAgezB4MjUzNTYsIEwidGIiLCBYRkFfQXR0cmlidXRlRW51bTo6VGJ9LAorICAgIHsweDI1ODg1LCBMInVwIiwgWEZBX0F0dHJpYnV0ZUVudW06OlVwfSwKKyAgICB7MHg5MWIyODEsIEwibWV0YURhdGEiLCBYRkFfQXR0cmlidXRlRW51bTo6TWV0YURhdGF9LAorICAgIHsweDFmOGRlZGIsIEwiZGVsZWdhdGUiLCBYRkFfQXR0cmlidXRlRW51bTo6RGVsZWdhdGV9LAorICAgIHsweDJhNmM1NWEsIEwicG9zdFN1Ym1pdCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpQb3N0U3VibWl0fSwKKyAgICB7MHgzMWIxOWMxLCBMIm5hbWUiLCBYRkFfQXR0cmlidXRlRW51bTo6TmFtZX0sCisgICAgezB4Mzc4YTM4YSwgTCJjcm9zcyIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpDcm9zc30sCisgICAgezB4Mzg0OGIzZiwgTCJuZXh0IiwgWEZBX0F0dHJpYnV0ZUVudW06Ok5leHR9LAorICAgIHsweDQ4YjY2NzAsIEwibm9uZSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpOb25lfSwKKyAgICB7MHg1MWFhZmU1LCBMInNob3J0RWRnZSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpTaG9ydEVkZ2V9LAorICAgIHsweDU1MjY0YzQsIEwiMW1vZDEwXzFtb2QxMSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpDaGVja3N1bV8xbW9kMTBfMW1vZDExfSwKKyAgICB7MHg1YTVjNTE5LCBMImhlaWdodCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpIZWlnaHR9LAorICAgIHsweDg5Y2U1NDksIEwiY3Jvc3NEaWFnb25hbCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpDcm9zc0RpYWdvbmFsfSwKKyAgICB7MHg5ZjlkMGY5LCBMImFsbCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpBbGx9LAorICAgIHsweDlmOWRiNDgsIEwiYW55IiwgWEZBX0F0dHJpYnV0ZUVudW06OkFueX0sCisgICAgezB4YTEyNjI2MSwgTCJ0b1JpZ2h0IiwgWEZBX0F0dHJpYnV0ZUVudW06OlRvUmlnaHR9LAorICAgIHsweGEzNmRlMjksIEwibWF0Y2hUZW1wbGF0ZSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpNYXRjaFRlbXBsYXRlfSwKKyAgICB7MHhhNDhkMDQwLCBMImRwbCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpEcGx9LAorICAgIHsweGE1NTljMDUsIEwiaW52aXNpYmxlIiwgWEZBX0F0dHJpYnV0ZUVudW06OkludmlzaWJsZX0sCisgICAgezB4YTdkNDhlMywgTCJmaXQiLCBYRkFfQXR0cmlidXRlRW51bTo6Rml0fSwKKyAgICB7MHhhOGE4ZjgwLCBMIndpZHRoIiwgWEZBX0F0dHJpYnV0ZUVudW06OldpZHRofSwKKyAgICB7MHhhYjQ2NmJiLCBMInByZVN1Ym1pdCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpQcmVTdWJtaXR9LAorICAgIHsweGFjYzU3ODUsIEwiaXBsIiwgWEZBX0F0dHJpYnV0ZUVudW06OklwbH0sCisgICAgezB4YWZhYjBmOCwgTCJmbGF0ZUNvbXByZXNzIiwgWEZBX0F0dHJpYnV0ZUVudW06OkZsYXRlQ29tcHJlc3N9LAorICAgIHsweGIzNTU4MTYsIEwibWVkIiwgWEZBX0F0dHJpYnV0ZUVudW06Ok1lZH0sCisgICAgezB4YjY5ZWY3NywgTCJvZGQiLCBYRkFfQXR0cmlidXRlRW51bTo6T2RkfSwKKyAgICB7MHhiNjlmOWJiLCBMIm9mZiIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpPZmZ9LAorICAgIHsweGI4NDNkYmEsIEwicGRmIiwgWEZBX0F0dHJpYnV0ZUVudW06OlBkZn0sCisgICAgezB4YmI5MTJiOCwgTCJyb3ciLCBYRkFfQXR0cmlidXRlRW51bTo6Um93fSwKKyAgICB7MHhiZWRhZjMzLCBMInRvcCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpUb3B9LAorICAgIHsweGM1NmFmY2MsIEwieGRwIiwgWEZBX0F0dHJpYnV0ZUVudW06OlhkcH0sCisgICAgezB4YzU2YmEwMiwgTCJ4ZmQiLCBYRkFfQXR0cmlidXRlRW51bTo6WGZkfSwKKyAgICB7MHhjNTZkZGYxLCBMInhtbCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpYbWx9LAorICAgIHsweGM4YjY1ZjMsIEwiemlwIiwgWEZBX0F0dHJpYnV0ZUVudW06OlppcH0sCisgICAgezB4YzhiODlkNiwgTCJ6cGwiLCBYRkFfQXR0cmlidXRlRW51bTo6WnBsfSwKKyAgICB7MHhmNTVkN2VlLCBMInZpc2libGUiLCBYRkFfQXR0cmlidXRlRW51bTo6VmlzaWJsZX0sCisgICAgezB4ZmUzNTk2YSwgTCJleGNsdWRlIiwgWEZBX0F0dHJpYnV0ZUVudW06OkV4Y2x1ZGV9LAorICAgIHsweDEwOWQ3Y2U3LCBMIm1vdXNlRW50ZXIiLCBYRkFfQXR0cmlidXRlRW51bTo6TW91c2VFbnRlcn0sCisgICAgezB4MTBmMWJjMGMsIEwicGFpciIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpQYWlyfSwKKyAgICB7MHgxMTU0ZWZlNiwgTCJmaWx0ZXIiLCBYRkFfQXR0cmlidXRlRW51bTo6RmlsdGVyfSwKKyAgICB7MHgxMjViYzk0YiwgTCJtb3ZlTGFzdCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpNb3ZlTGFzdH0sCisgICAgezB4MTJlMWYxZjAsIEwiZXhwb3J0QW5kSW1wb3J0IiwgWEZBX0F0dHJpYnV0ZUVudW06OkV4cG9ydEFuZEltcG9ydH0sCisgICAgezB4MTMwMDBjNjAsIEwicHVzaCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpQdXNofSwKKyAgICB7MHgxMzhlZTMxNSwgTCJwb3J0cmFpdCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpQb3J0cmFpdH0sCisgICAgezB4MTRkYTIxMjUsIEwiZGVmYXVsdCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpEZWZhdWx0fSwKKyAgICB7MHgxNTc3NDlhNSwgTCJzdG9yZWRQcm9jIiwgWEZBX0F0dHJpYnV0ZUVudW06OlN0b3JlZFByb2N9LAorICAgIHsweDE2NjQxMTk4LCBMInN0YXlCT0YiLCBYRkFfQXR0cmlidXRlRW51bTo6U3RheUJPRn0sCisgICAgezB4MTZiMmZjNWIsIEwic3RheUVPRiIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpTdGF5RU9GfSwKKyAgICB7MHgxN2ZhZDM3MywgTCJwb3N0UHJpbnQiLCBYRkFfQXR0cmlidXRlRW51bTo6UG9zdFByaW50fSwKKyAgICB7MHgxOTMyMDdkMCwgTCJ1c0NhcnJpZXIiLCBYRkFfQXR0cmlidXRlRW51bTo6VXNDYXJyaWVyfSwKKyAgICB7MHgxOTNhZGUzZSwgTCJyaWdodCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpSaWdodH0sCisgICAgezB4MWJmYzcyZDksIEwicHJlT3BlbiIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpQcmVPcGVufSwKKyAgICB7MHgxY2M5MzE3YSwgTCJhY3R1YWwiLCBYRkFfQXR0cmlidXRlRW51bTo6QWN0dWFsfSwKKyAgICB7MHgxZjMxZGYxZSwgTCJyZXN0IiwgWEZBX0F0dHJpYnV0ZUVudW06OlJlc3R9LAorICAgIHsweDFmYjFiZjE0LCBMInRvcENlbnRlciIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpUb3BDZW50ZXJ9LAorICAgIHsweDIwN2RlNjY3LCBMInN0YW5kYXJkU3ltYm9sIiwgWEZBX0F0dHJpYnV0ZUVudW06OlN0YW5kYXJkU3ltYm9sfSwKKyAgICB7MHgyMTk2YTQ1MiwgTCJpbml0aWFsaXplIiwgWEZBX0F0dHJpYnV0ZUVudW06OkluaXRpYWxpemV9LAorICAgIHsweDIzYmQ0MGM3LCBMImp1c3RpZnlBbGwiLCBYRkFfQXR0cmlidXRlRW51bTo6SnVzdGlmeUFsbH0sCisgICAgezB4MjQ3Y2YzZTksIEwibm9ybWFsIiwgWEZBX0F0dHJpYnV0ZUVudW06Ok5vcm1hbH0sCisgICAgezB4MjVhYTk0NmIsIEwibGFuZHNjYXBlIiwgWEZBX0F0dHJpYnV0ZUVudW06OkxhbmRzY2FwZX0sCisgICAgezB4MjczOWI1YzksIEwibm9uSW50ZXJhY3RpdmUiLCBYRkFfQXR0cmlidXRlRW51bTo6Tm9uSW50ZXJhY3RpdmV9LAorICAgIHsweDI3NDEwZjAzLCBMIm1vdXNlRXhpdCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpNb3VzZUV4aXR9LAorICAgIHsweDI4NTRlNjJjLCBMIm1pbnVzIiwgWEZBX0F0dHJpYnV0ZUVudW06Ok1pbnVzfSwKKyAgICB7MHgyODdlOTM2YSwgTCJkaWFnb25hbExlZnQiLCBYRkFfQXR0cmlidXRlRW51bTo6RGlhZ29uYWxMZWZ0fSwKKyAgICB7MHgyOTcyYTk4ZiwgTCJzaW1wbGV4UGFnaW5hdGVkIiwgWEZBX0F0dHJpYnV0ZUVudW06OlNpbXBsZXhQYWdpbmF0ZWR9LAorICAgIHsweDI5ZDgyMjVmLCBMImRvY3VtZW50IiwgWEZBX0F0dHJpYnV0ZUVudW06OkRvY3VtZW50fSwKKyAgICB7MHgyYTlkMzAxNiwgTCJ3YXJuaW5nIiwgWEZBX0F0dHJpYnV0ZUVudW06Oldhcm5pbmd9LAorICAgIHsweDJiMzViNmQ5LCBMImF1dG8iLCBYRkFfQXR0cmlidXRlRW51bTo6QXV0b30sCisgICAgezB4MmMxNjUzZDksIEwiYmVsb3ciLCBYRkFfQXR0cmlidXRlRW51bTo6QmVsb3d9LAorICAgIHsweDJjMWYwNTQwLCBMImJvdHRvbUxlZnQiLCBYRkFfQXR0cmlidXRlRW51bTo6Qm90dG9tTGVmdH0sCisgICAgezB4MmM0NGU4MTYsIEwiYm90dG9tQ2VudGVyIiwgWEZBX0F0dHJpYnV0ZUVudW06OkJvdHRvbUNlbnRlcn0sCisgICAgezB4MmNkM2U5ZjMsIEwidGNwbCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpUY3BsfSwKKyAgICB7MHgyZDA4YWY4NSwgTCJ0ZXh0IiwgWEZBX0F0dHJpYnV0ZUVudW06OlRleHR9LAorICAgIHsweDJkYzQ3OGViLCBMImdyb3VwaW5nIiwgWEZBX0F0dHJpYnV0ZUVudW06Okdyb3VwaW5nfSwKKyAgICB7MHgyZWYzYWZkZCwgTCJzZWN1cmVTeW1ib2wiLCBYRkFfQXR0cmlidXRlRW51bTo6U2VjdXJlU3ltYm9sfSwKKyAgICB7MHgyZjJkZDI5YSwgTCJwcmVFeGVjdXRlIiwgWEZBX0F0dHJpYnV0ZUVudW06OlByZUV4ZWN1dGV9LAorICAgIHsweDMzYzQzZGVjLCBMImRvY0Nsb3NlIiwgWEZBX0F0dHJpYnV0ZUVudW06OkRvY0Nsb3NlfSwKKyAgICB7MHgzM2YyNWJiNSwgTCJrZXlzZXQiLCBYRkFfQXR0cmlidXRlRW51bTo6S2V5c2V0fSwKKyAgICB7MHgzNGUzNjNkYSwgTCJ2ZXJ0aWNhbCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpWZXJ0aWNhbH0sCisgICAgezB4MzYxZmExYjYsIEwicHJlU2F2ZSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpQcmVTYXZlfSwKKyAgICB7MHgzNmYxYzZkOCwgTCJwcmVTaWduIiwgWEZBX0F0dHJpYnV0ZUVudW06OlByZVNpZ259LAorICAgIHsweDM5OWYwMmI1LCBMImJvdHRvbSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpCb3R0b219LAorICAgIHsweDNiMGFiMDk2LCBMInRvVG9wIiwgWEZBX0F0dHJpYnV0ZUVudW06OlRvVG9wfSwKKyAgICB7MHgzYzc1MjQ5NSwgTCJ2ZXJpZnkiLCBYRkFfQXR0cmlidXRlRW51bTo6VmVyaWZ5fSwKKyAgICB7MHgzY2UwNWQ2OCwgTCJmaXJzdCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpGaXJzdH0sCisgICAgezB4M2VjZWFkOTQsIEwiY29udGVudEFyZWEiLCBYRkFfQXR0cmlidXRlRW51bTo6Q29udGVudEFyZWF9LAorICAgIHsweDQwNjIzYjViLCBMInNvbGlkIiwgWEZBX0F0dHJpYnV0ZUVudW06OlNvbGlkfSwKKyAgICB7MHg0MmM2Y2Q4ZCwgTCJwZXNzaW1pc3RpYyIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpQZXNzaW1pc3RpY30sCisgICAgezB4NDNkZGM2YmYsIEwiZHVwbGV4UGFnaW5hdGVkIiwgWEZBX0F0dHJpYnV0ZUVudW06OkR1cGxleFBhZ2luYXRlZH0sCisgICAgezB4NDQyZjY4YzgsIEwicm91bmQiLCBYRkFfQXR0cmlidXRlRW51bTo6Um91bmR9LAorICAgIHsweDQ1ZWZiODQ3LCBMInJlbWVyZ2UiLCBYRkFfQXR0cmlidXRlRW51bTo6UmVtZXJnZX0sCisgICAgezB4NDY5NzIyNjUsIEwib3JkZXJlZCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpPcmRlcmVkfSwKKyAgICB7MHg0NmY5NTUzMSwgTCJwZXJjZW50IiwgWEZBX0F0dHJpYnV0ZUVudW06OlBlcmNlbnR9LAorICAgIHsweDQ2ZmQyNWFlLCBMImV2ZW4iLCBYRkFfQXR0cmlidXRlRW51bTo6RXZlbn0sCisgICAgezB4NDczMWQ2YmEsIEwiZXhpdCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpFeGl0fSwKKyAgICB7MHg0OTc3MzU2YiwgTCJ0b29sVGlwIiwgWEZBX0F0dHJpYnV0ZUVudW06OlRvb2xUaXB9LAorICAgIHsweDQ5Yjk4MGVlLCBMIm9yZGVyZWRPY2N1cnJlbmNlIiwgWEZBX0F0dHJpYnV0ZUVudW06Ok9yZGVyZWRPY2N1cnJlbmNlfSwKKyAgICB7MHg0YTdlMmRmZSwgTCJyZWFkT25seSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpSZWFkT25seX0sCisgICAgezB4NGM0ZThhY2IsIEwiY3VycmVuY3kiLCBYRkFfQXR0cmlidXRlRW51bTo6Q3VycmVuY3l9LAorICAgIHsweDRkY2YyNWY4LCBMImNvbmNhdCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpDb25jYXR9LAorICAgIHsweDRmZWJiODI2LCBMIlRoYWkiLCBYRkFfQXR0cmlidXRlRW51bTo6VGhhaX0sCisgICAgezB4NTBlZjk1YjIsIEwiZW1ib3NzZWQiLCBYRkFfQXR0cmlidXRlRW51bTo6RW1ib3NzZWR9LAorICAgIHsweDUxNmUzNWNlLCBMImZvcm1kYXRhIiwgWEZBX0F0dHJpYnV0ZUVudW06OkZvcm1kYXRhfSwKKyAgICB7MHg1MmZhNmYwZSwgTCJHcmVlayIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpHcmVla30sCisgICAgezB4NTQwMzRjMmYsIEwiZGVjaW1hbCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpEZWNpbWFsfSwKKyAgICB7MHg1NDJjNzMwMCwgTCJzZWxlY3QiLCBYRkFfQXR0cmlidXRlRW51bTo6U2VsZWN0fSwKKyAgICB7MHg1NTFmMGFlNSwgTCJsb25nRWRnZSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpMb25nRWRnZX0sCisgICAgezB4NTU1MjBhOGEsIEwicHJvdGVjdGVkIiwgWEZBX0F0dHJpYnV0ZUVudW06OlByb3RlY3RlZH0sCisgICAgezB4NTU5Zjc2ZjMsIEwiYm90dG9tUmlnaHQiLCBYRkFfQXR0cmlidXRlRW51bTo6Qm90dG9tUmlnaHR9LAorICAgIHsweDU2OGNiNTAwLCBMInplcm8iLCBYRkFfQXR0cmlidXRlRW51bTo6WmVyb30sCisgICAgezB4NTZiY2VjYjcsIEwiZm9yd2FyZE9ubHkiLCBYRkFfQXR0cmlidXRlRW51bTo6Rm9yd2FyZE9ubHl9LAorICAgIHsweDU2YmY0NTZiLCBMImRvY1JlYWR5IiwgWEZBX0F0dHJpYnV0ZUVudW06OkRvY1JlYWR5fSwKKyAgICB7MHg1NzNjYjQwYywgTCJoaWRkZW4iLCBYRkFfQXR0cmlidXRlRW51bTo6SGlkZGVufSwKKyAgICB7MHg1ODJlMzQyNCwgTCJpbmNsdWRlIiwgWEZBX0F0dHJpYnV0ZUVudW06OkluY2x1ZGV9LAorICAgIHsweDU4YTNkZDI5LCBMImRhc2hlZCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpEYXNoZWR9LAorICAgIHsweDU5NTViMjJiLCBMIm11bHRpU2VsZWN0IiwgWEZBX0F0dHJpYnV0ZUVudW06Ok11bHRpU2VsZWN0fSwKKyAgICB7MHg1OThkNWM1MywgTCJpbmFjdGl2ZSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpJbmFjdGl2ZX0sCisgICAgezB4NTljOGYyN2QsIEwiZW1iZWQiLCBYRkFfQXR0cmlidXRlRW51bTo6RW1iZWR9LAorICAgIHsweDVlNzU1NWU4LCBMInN0YXRpYyIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpTdGF0aWN9LAorICAgIHsweDYwNmQ0ZGVmLCBMIm9uRW50cnkiLCBYRkFfQXR0cmlidXRlRW51bTo6T25FbnRyeX0sCisgICAgezB4NjE5NWVhZmIsIEwiQ3lyaWxsaWMiLCBYRkFfQXR0cmlidXRlRW51bTo6Q3lyaWxsaWN9LAorICAgIHsweDY0OTFiMGYzLCBMIm5vbkJsYW5rIiwgWEZBX0F0dHJpYnV0ZUVudW06Ok5vbkJsYW5rfSwKKyAgICB7MHg2N2JlZjAzMSwgTCJ0b3BSaWdodCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpUb3BSaWdodH0sCisgICAgezB4NjdkZjVlYmQsIEwiSGVicmV3IiwgWEZBX0F0dHJpYnV0ZUVudW06OkhlYnJld30sCisgICAgezB4NmFlYTk4YmUsIEwidG9wTGVmdCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpUb3BMZWZ0fSwKKyAgICB7MHg2YzUxYWZjMSwgTCJjZW50ZXIiLCBYRkFfQXR0cmlidXRlRW51bTo6Q2VudGVyfSwKKyAgICB7MHg3MTQ1ZTZiZiwgTCJtb3ZlRmlyc3QiLCBYRkFfQXR0cmlidXRlRW51bTo6TW92ZUZpcnN0fSwKKyAgICB7MHg3Mzc1NDY1YywgTCJkaWFtb25kIiwgWEZBX0F0dHJpYnV0ZUVudW06OkRpYW1vbmR9LAorICAgIHsweDc0NjFhZWY0LCBMInBhZ2VPZGQiLCBYRkFfQXR0cmlidXRlRW51bTo6UGFnZU9kZH0sCisgICAgezB4NzVmOGFlYjIsIEwiMW1vZDEwIiwgWEZBX0F0dHJpYnV0ZUVudW06OkNoZWNrc3VtXzFtb2QxMH0sCisgICAgezB4NzZkNzA4ZTAsIEwiS29yZWFuIiwgWEZBX0F0dHJpYnV0ZUVudW06OktvcmVhbn0sCisgICAgezB4Nzg5ZjE0ZDcsIEwiYWJvdmVFbWJlZGRlZCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpBYm92ZUVtYmVkZGVkfSwKKyAgICB7MHg3OTJlYTM5ZiwgTCJ6aXBDb21wcmVzcyIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpaaXBDb21wcmVzc30sCisgICAgezB4N2E1YjcxOTMsIEwibnVtZXJpYyIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpOdW1lcmljfSwKKyAgICB7MHg3YWJlYzBkMiwgTCJjaXJjbGUiLCBYRkFfQXR0cmlidXRlRW51bTo6Q2lyY2xlfSwKKyAgICB7MHg3YWZiYmEzOCwgTCJ0b0JvdHRvbSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpUb0JvdHRvbX0sCisgICAgezB4N2I5NWU2NjEsIEwiaW52ZXJ0ZWQiLCBYRkFfQXR0cmlidXRlRW51bTo6SW52ZXJ0ZWR9LAorICAgIHsweDdiYWNhMmUzLCBMInVwZGF0ZSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpVcGRhdGV9LAorICAgIHsweDdlYjVkYTJjLCBMImlzb25hbWUiLCBYRkFfQXR0cmlidXRlRW51bTo6SXNvbmFtZX0sCisgICAgezB4N2Y2ZmQzZDcsIEwic2VydmVyIiwgWEZBX0F0dHJpYnV0ZUVudW06OlNlcnZlcn0sCisgICAgezB4ODE0ZjgyYjUsIEwicG9zaXRpb24iLCBYRkFfQXR0cmlidXRlRW51bTo6UG9zaXRpb259LAorICAgIHsweDgyZGVhY2YwLCBMIm1pZGRsZUNlbnRlciIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpNaWRkbGVDZW50ZXJ9LAorICAgIHsweDgzYTQ5ZGM2LCBMIm9wdGlvbmFsIiwgWEZBX0F0dHJpYnV0ZUVudW06Ok9wdGlvbmFsfSwKKyAgICB7MHg4NjFhMTE2ZiwgTCJ1c2VQcmludGVyU2V0dGluZyIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpVc2VQcmludGVyU2V0dGluZ30sCisgICAgezB4ODY3MDFjZTAsIEwib3V0bGluZSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpPdXRsaW5lfSwKKyAgICB7MHg4ODA4Mzg1ZSwgTCJpbmRleENoYW5nZSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpJbmRleENoYW5nZX0sCisgICAgezB4ODkxZjQ2MDYsIEwiY2hhbmdlIiwgWEZBX0F0dHJpYnV0ZUVudW06OkNoYW5nZX0sCisgICAgezB4ODk5MzlmMzYsIEwicGFnZUFyZWEiLCBYRkFfQXR0cmlidXRlRW51bTo6UGFnZUFyZWF9LAorICAgIHsweDhiNWMzYjI1LCBMIm9uY2UiLCBYRkFfQXR0cmlidXRlRW51bTo6T25jZX0sCisgICAgezB4OGI1YzY5NjIsIEwib25seSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpPbmx5fSwKKyAgICB7MHg4YjkwZTFmMiwgTCJvcGVuIiwgWEZBX0F0dHJpYnV0ZUVudW06Ok9wZW59LAorICAgIHsweDhiY2ZlOTZlLCBMImNhcHRpb24iLCBYRkFfQXR0cmlidXRlRW51bTo6Q2FwdGlvbn0sCisgICAgezB4OGNlODNlZjgsIEwicmFpc2VkIiwgWEZBX0F0dHJpYnV0ZUVudW06OlJhaXNlZH0sCisgICAgezB4OGQyNjljYWUsIEwianVzdGlmeSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpKdXN0aWZ5fSwKKyAgICB7MHg4ZmQ1MjBkYywgTCJyZWZBbmREZXNjZW5kYW50cyIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpSZWZBbmREZXNjZW5kYW50c30sCisgICAgezB4OTA0MWQ0YjAsIEwic2hvcnQiLCBYRkFfQXR0cmlidXRlRW51bTo6U2hvcnR9LAorICAgIHsweDkwYzk0NDI2LCBMInBhZ2VGcm9udCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpQYWdlRnJvbnR9LAorICAgIHsweDkzNmJlZWU1LCBMIm1vbm9zcGFjZSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpNb25vc3BhY2V9LAorICAgIHsweDk0N2ZhMDBmLCBMIm1pZGRsZSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpNaWRkbGV9LAorICAgIHsweDk1MjhhN2I0LCBMInByZVByaW50IiwgWEZBX0F0dHJpYnV0ZUVudW06OlByZVByaW50fSwKKyAgICB7MHg5NTlhYjIzMSwgTCJhbHdheXMiLCBYRkFfQXR0cmlidXRlRW51bTo6QWx3YXlzfSwKKyAgICB7MHg5NmQ2MWJmMCwgTCJ1bmtub3duIiwgWEZBX0F0dHJpYnV0ZUVudW06OlVua25vd259LAorICAgIHsweDk5NzE5NGVlLCBMInRvTGVmdCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpUb0xlZnR9LAorICAgIHsweDlhODNhM2NkLCBMImFib3ZlIiwgWEZBX0F0dHJpYnV0ZUVudW06OkFib3ZlfSwKKyAgICB7MHg5ZDBkNzFjNywgTCJkYXNoRG90IiwgWEZBX0F0dHJpYnV0ZUVudW06OkRhc2hEb3R9LAorICAgIHsweDlkZjU2ZjNlLCBMImdyZWdvcmlhbiIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpHcmVnb3JpYW59LAorICAgIHsweDlmNjcyM2ZkLCBMIlJvbWFuIiwgWEZBX0F0dHJpYnV0ZUVudW06OlJvbWFufSwKKyAgICB7MHg5ZjY5M2IyMSwgTCJtb3VzZURvd24iLCBYRkFfQXR0cmlidXRlRW51bTo6TW91c2VEb3dufSwKKyAgICB7MHhhMTQyOWIzNiwgTCJzeW1ib2wiLCBYRkFfQXR0cmlidXRlRW51bTo6U3ltYm9sfSwKKyAgICB7MHhhNWFhNDVjYiwgTCJwYWdlRXZlbiIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpQYWdlRXZlbn0sCisgICAgezB4YTY4NjM1ZjEsIEwic2lnbiIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpTaWdufSwKKyAgICB7MHhhNzMxNTA5MywgTCJhZGROZXciLCBYRkFfQXR0cmlidXRlRW51bTo6QWRkTmV3fSwKKyAgICB7MHhhN2E3NzNmYSwgTCJzdGFyIiwgWEZBX0F0dHJpYnV0ZUVudW06OlN0YXJ9LAorICAgIHsweGE3ZDU3YjQ1LCBMIm9wdGltaXN0aWMiLCBYRkFfQXR0cmlidXRlRW51bTo6T3B0aW1pc3RpY30sCisgICAgezB4YTgwNzczMjEsIEwicmwtdGIiLCBYRkFfQXR0cmlidXRlRW51bTo6UmxfdGJ9LAorICAgIHsweGE4ZjE0NjhkLCBMIm1pZGRsZVJpZ2h0IiwgWEZBX0F0dHJpYnV0ZUVudW06Ok1pZGRsZVJpZ2h0fSwKKyAgICB7MHhhYTg0YTFmMSwgTCJtYWludGFpbiIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpNYWludGFpbn0sCisgICAgezB4YWI0MGIxMmMsIEwicGFja2FnZSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpQYWNrYWdlfSwKKyAgICB7MHhhYzhiNGQ4NSwgTCJTaW1wbGlmaWVkQ2hpbmVzZSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpTaW1wbGlmaWVkQ2hpbmVzZX0sCisgICAgezB4YWRhZTY3NDQsIEwidG9DZW50ZXIiLCBYRkFfQXR0cmlidXRlRW51bTo6VG9DZW50ZXJ9LAorICAgIHsweGIwMTI5ZGYxLCBMImJhY2siLCBYRkFfQXR0cmlidXRlRW51bTo6QmFja30sCisgICAgezB4YjBmMDg4Y2YsIEwidW5zcGVjaWZpZWQiLCBYRkFfQXR0cmlidXRlRW51bTo6VW5zcGVjaWZpZWR9LAorICAgIHsweGIxMjcxMDY3LCBMImJhdGNoT3B0aW1pc3RpYyIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpCYXRjaE9wdGltaXN0aWN9LAorICAgIHsweGIxODMxM2ExLCBMImJvbGQiLCBYRkFfQXR0cmlidXRlRW51bTo6Qm9sZH0sCisgICAgezB4YjE4MzNjYWQsIEwiYm90aCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpCb3RofSwKKyAgICB7MHhiMjIxMTIzZiwgTCJidXR0IiwgWEZBX0F0dHJpYnV0ZUVudW06OkJ1dHR9LAorICAgIHsweGI0MGMzNmJmLCBMImNsaWVudCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpDbGllbnR9LAorICAgIHsweGI1NmM3MDUzLCBMIjJtb2QxMCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpDaGVja3N1bV8ybW9kMTB9LAorICAgIHsweGI2ODNhMzQ1LCBMImltYWdlT25seSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpJbWFnZU9ubHl9LAorICAgIHsweGI3NzMyZGVhLCBMImhvcml6b250YWwiLCBYRkFfQXR0cmlidXRlRW51bTo6SG9yaXpvbnRhbH0sCisgICAgezB4Yjg4NjUyYTQsIEwiZG90dGVkIiwgWEZBX0F0dHJpYnV0ZUVudW06OkRvdHRlZH0sCisgICAgezB4YmIyZjI4ODAsIEwidXNlckNvbnRyb2wiLCBYRkFfQXR0cmlidXRlRW51bTo6VXNlckNvbnRyb2x9LAorICAgIHsweGJiYjc5YzVkLCBMImRpYWdvbmFsUmlnaHQiLCBYRkFfQXR0cmlidXRlRW51bTo6RGlhZ29uYWxSaWdodH0sCisgICAgezB4YmQwNzcxNTQsIEwiY29uc3VtZURhdGEiLCBYRkFfQXR0cmlidXRlRW51bTo6Q29uc3VtZURhdGF9LAorICAgIHsweGJkM2ZiMTFlLCBMImNoZWNrIiwgWEZBX0F0dHJpYnV0ZUVudW06OkNoZWNrfSwKKyAgICB7MHhiZGU5YWJkYSwgTCJkYXRhIiwgWEZBX0F0dHJpYnV0ZUVudW06OkRhdGF9LAorICAgIHsweGJmNWEwMmQ4LCBMImRvd24iLCBYRkFfQXR0cmlidXRlRW51bTo6RG93bn0sCisgICAgezB4YmY3NDUwZWUsIEwic2Fuc1NlcmlmIiwgWEZBX0F0dHJpYnV0ZUVudW06OlNhbnNTZXJpZn0sCisgICAgezB4YzAyZDY0OWYsIEwiaW5saW5lIiwgWEZBX0F0dHJpYnV0ZUVudW06OklubGluZX0sCisgICAgezB4YzExYTllM2EsIEwiVHJhZGl0aW9uYWxDaGluZXNlIiwgWEZBX0F0dHJpYnV0ZUVudW06OlRyYWRpdGlvbmFsQ2hpbmVzZX0sCisgICAgezB4YzE2MTY5ZDgsIEwid2FybiIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpXYXJufSwKKyAgICB7MHhjMTZmMDcxZiwgTCJyZWZPbmx5IiwgWEZBX0F0dHJpYnV0ZUVudW06OlJlZk9ubHl9LAorICAgIHsweGMyN2M4YmE1LCBMImludGVyYWN0aXZlRm9ybXMiLCBYRkFfQXR0cmlidXRlRW51bTo6SW50ZXJhY3RpdmVGb3Jtc30sCisgICAgezB4YzJkMWIxNWMsIEwid29yZCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpXb3JkfSwKKyAgICB7MHhjMzYyMTI4OCwgTCJ1bm9yZGVyZWQiLCBYRkFfQXR0cmlidXRlRW51bTo6VW5vcmRlcmVkfSwKKyAgICB7MHhjNTI1MTk4MSwgTCJyZXF1aXJlZCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpSZXF1aXJlZH0sCisgICAgezB4YzcwODhlN2QsIEwiaW1wb3J0T25seSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpJbXBvcnRPbmx5fSwKKyAgICB7MHhjNzJjZjBlMywgTCJiZWxvd0VtYmVkZGVkIiwgWEZBX0F0dHJpYnV0ZUVudW06OkJlbG93RW1iZWRkZWR9LAorICAgIHsweGM4MTljZjA3LCBMIkphcGFuZXNlIiwgWEZBX0F0dHJpYnV0ZUVudW06OkphcGFuZXNlfSwKKyAgICB7MHhjZGNlNTZiMywgTCJmdWxsIiwgWEZBX0F0dHJpYnV0ZUVudW06OkZ1bGx9LAorICAgIHsweGNlMDEyMmUzLCBMInJsLXJvdyIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpSbF9yb3d9LAorICAgIHsweGNmN2Q3MWYxLCBMIlZpZXRuYW1lc2UiLCBYRkFfQXR0cmlidXRlRW51bTo6VmlldG5hbWVzZX0sCisgICAgezB4Y2ZkZTNlMDksIEwiRWFzdEV1cm9wZWFuUm9tYW4iLCBYRkFfQXR0cmlidXRlRW51bTo6RWFzdEV1cm9wZWFuUm9tYW59LAorICAgIHsweGQ1NzZkMDhlLCBMIm1vdXNlVXAiLCBYRkFfQXR0cmlidXRlRW51bTo6TW91c2VVcH0sCisgICAgezB4ZDdhOTI5MDQsIEwiZXhwb3J0T25seSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpFeHBvcnRPbmx5fSwKKyAgICB7MHhkOGVkMTQ2NywgTCJjbGVhciIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpDbGVhcn0sCisgICAgezB4ZDk1NjU3YTYsIEwiY2xpY2siLCBYRkFfQXR0cmlidXRlRW51bTo6Q2xpY2t9LAorICAgIHsweGQ5NmM3ZGU1LCBMImJhc2U2NCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpCYXNlNjR9LAorICAgIHsweGQ5ZjQ3ZjM2LCBMImNsb3NlIiwgWEZBX0F0dHJpYnV0ZUVudW06OkNsb3NlfSwKKyAgICB7MHhkYjA3NWJkZSwgTCJob3N0IiwgWEZBX0F0dHJpYnV0ZUVudW06Okhvc3R9LAorICAgIHsweGRiMTAzNDExLCBMImdsb2JhbCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpHbG9iYWx9LAorICAgIHsweGRiNjQ3MTg4LCBMImJsYW5rIiwgWEZBX0F0dHJpYnV0ZUVudW06OkJsYW5rfSwKKyAgICB7MHhkYjliZTk2OCwgTCJ0YWJsZSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpUYWJsZX0sCisgICAgezB4ZGY1OTBmYmIsIEwiaW1wb3J0IiwgWEZBX0F0dHJpYnV0ZUVudW06OkltcG9ydH0sCisgICAgezB4ZTBlNTczZmIsIEwiY3VzdG9tIiwgWEZBX0F0dHJpYnV0ZUVudW06OkN1c3RvbX0sCisgICAgezB4ZTBlY2M3OWEsIEwibWlkZGxlTGVmdCIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpNaWRkbGVMZWZ0fSwKKyAgICB7MHhlMTQ1MjAxOSwgTCJwb3N0RXhlY3V0ZSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpQb3N0RXhlY3V0ZX0sCisgICAgezB4ZTE5MTFkOTgsIEwicmFkaXgiLCBYRkFfQXR0cmlidXRlRW51bTo6UmFkaXh9LAorICAgIHsweGUyNWZhN2I4LCBMInBvc3RPcGVuIiwgWEZBX0F0dHJpYnV0ZUVudW06OlBvc3RPcGVufSwKKyAgICB7MHhlMjhkY2U3ZSwgTCJlbnRlciIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpFbnRlcn0sCisgICAgezB4ZTJjNDRkZTQsIEwiaWdub3JlIiwgWEZBX0F0dHJpYnV0ZUVudW06Oklnbm9yZX0sCisgICAgezB4ZTJjZDhjNjEsIEwibHItdGIiLCBYRkFfQXR0cmlidXRlRW51bTo6THJfdGJ9LAorICAgIHsweGUyZGE4MzM2LCBMImZhbnRhc3kiLCBYRkFfQXR0cmlidXRlRW51bTo6RmFudGFzeX0sCisgICAgezB4ZTMxZDUzOTYsIEwiaXRhbGljIiwgWEZBX0F0dHJpYnV0ZUVudW06Okl0YWxpY30sCisgICAgezB4ZTdhZGExMTMsIEwiYXV0aG9yIiwgWEZBX0F0dHJpYnV0ZUVudW06OkF1dGhvcn0sCisgICAgezB4ZThlN2NjMTgsIEwidG9FZGdlIiwgWEZBX0F0dHJpYnV0ZUVudW06OlRvRWRnZX0sCisgICAgezB4ZTk3YWE5OGIsIEwiY2hvaWNlIiwgWEZBX0F0dHJpYnV0ZUVudW06OkNob2ljZX0sCisgICAgezB4ZWFmZDJhMzgsIEwiZGlzYWJsZWQiLCBYRkFfQXR0cmlidXRlRW51bTo6RGlzYWJsZWR9LAorICAgIHsweGViMmI3OTcyLCBMImNyb3NzSGF0Y2giLCBYRkFfQXR0cmlidXRlRW51bTo6Q3Jvc3NIYXRjaH0sCisgICAgezB4ZWIyZGIyZDcsIEwiZGF0YVJlZiIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpEYXRhUmVmfSwKKyAgICB7MHhlYzM1ZGM2ZSwgTCJkYXNoRG90RG90IiwgWEZBX0F0dHJpYnV0ZUVudW06OkRhc2hEb3REb3R9LAorICAgIHsweGVmODVkMzUxLCBMInNxdWFyZSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpTcXVhcmV9LAorICAgIHsweGYyMTAyNDQ1LCBMImR5bmFtaWMiLCBYRkFfQXR0cmlidXRlRW51bTo6RHluYW1pY30sCisgICAgezB4ZjI3MmM3YmUsIEwibWFudWFsIiwgWEZBX0F0dHJpYnV0ZUVudW06Ok1hbnVhbH0sCisgICAgezB4ZjJiYmI2NGQsIEwiZXRjaGVkIiwgWEZBX0F0dHJpYnV0ZUVudW06OkV0Y2hlZH0sCisgICAgezB4ZjNiOGZjNmMsIEwidmFsaWRhdGlvblN0YXRlIiwgWEZBX0F0dHJpYnV0ZUVudW06OlZhbGlkYXRpb25TdGF0ZX0sCisgICAgezB4ZjQyZjJiODEsIEwiY3Vyc2l2ZSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpDdXJzaXZlfSwKKyAgICB7MHhmNTQ0ODFkNCwgTCJsYXN0IiwgWEZBX0F0dHJpYnV0ZUVudW06Okxhc3R9LAorICAgIHsweGY1YWQ3ODJiLCBMImxlZnQiLCBYRkFfQXR0cmlidXRlRW51bTo6TGVmdH0sCisgICAgezB4ZjYxNmRhMmUsIEwibGluayIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpMaW5rfSwKKyAgICB7MHhmNmI0YWZiMCwgTCJsb25nIiwgWEZBX0F0dHJpYnV0ZUVudW06Okxvbmd9LAogICAgIHsweGY4NjM2NDYwLCBMImludGVybmF0aW9uYWxDYXJyaWVyIiwKLSAgICAgWEZBX0FUVFJJQlVURUVOVU1fSW50ZXJuYXRpb25hbENhcnJpZXJ9LAotICAgIHsweGY5ZmIzN2FjLCBMIlBERjEuMyIsIFhGQV9BVFRSSUJVVEVFTlVNX1BERjFfM30sCi0gICAgezB4ZjlmYjM3YWYsIEwiUERGMS42IiwgWEZBX0FUVFJJQlVURUVOVU1fUERGMV82fSwKLSAgICB7MHhmYmNlN2YxOSwgTCJzZXJpZiIsIFhGQV9BVFRSSUJVVEVFTlVNX1NlcmlmfSwKLSAgICB7MHhmYzgyZDY5NSwgTCJwb3N0U2F2ZSIsIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RTYXZlfSwKLSAgICB7MHhmY2VmODZiNSwgTCJyZWFkeSIsIFhGQV9BVFRSSUJVVEVFTlVNX1JlYWR5fSwKLSAgICB7MHhmZDU0ZmJiNywgTCJwb3N0U2lnbiIsIFhGQV9BVFRSSUJVVEVFTlVNX1Bvc3RTaWdufSwKLSAgICB7MHhmZGMwYWFlMiwgTCJBcmFiaWMiLCBYRkFfQVRUUklCVVRFRU5VTV9BcmFiaWN9LAotICAgIHsweGZlMDZkMmNhLCBMImVycm9yIiwgWEZBX0FUVFJJQlVURUVOVU1fRXJyb3J9LAotICAgIHsweGZlZmM0ODg1LCBMInVybGVuY29kZWQiLCBYRkFfQVRUUklCVVRFRU5VTV9VcmxlbmNvZGVkfSwKLSAgICB7MHhmZjc5NWFkMiwgTCJsb3dlcmVkIiwgWEZBX0FUVFJJQlVURUVOVU1fTG93ZXJlZH0sCisgICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpJbnRlcm5hdGlvbmFsQ2Fycmllcn0sCisgICAgezB4ZjlmYjM3YWMsIEwiUERGMS4zIiwgWEZBX0F0dHJpYnV0ZUVudW06OlBERjFfM30sCisgICAgezB4ZjlmYjM3YWYsIEwiUERGMS42IiwgWEZBX0F0dHJpYnV0ZUVudW06OlBERjFfNn0sCisgICAgezB4ZmJjZTdmMTksIEwic2VyaWYiLCBYRkFfQXR0cmlidXRlRW51bTo6U2VyaWZ9LAorICAgIHsweGZjODJkNjk1LCBMInBvc3RTYXZlIiwgWEZBX0F0dHJpYnV0ZUVudW06OlBvc3RTYXZlfSwKKyAgICB7MHhmY2VmODZiNSwgTCJyZWFkeSIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpSZWFkeX0sCisgICAgezB4ZmQ1NGZiYjcsIEwicG9zdFNpZ24iLCBYRkFfQXR0cmlidXRlRW51bTo6UG9zdFNpZ259LAorICAgIHsweGZkYzBhYWUyLCBMIkFyYWJpYyIsIFhGQV9BdHRyaWJ1dGVFbnVtOjpBcmFiaWN9LAorICAgIHsweGZlMDZkMmNhLCBMImVycm9yIiwgWEZBX0F0dHJpYnV0ZUVudW06OkVycm9yfSwKKyAgICB7MHhmZWZjNDg4NSwgTCJ1cmxlbmNvZGVkIiwgWEZBX0F0dHJpYnV0ZUVudW06OlVybGVuY29kZWR9LAorICAgIHsweGZmNzk1YWQyLCBMImxvd2VyZWQiLCBYRkFfQXR0cmlidXRlRW51bTo6TG93ZXJlZH0sCiB9OwogY29uc3QgaW50MzJfdCBnX2lYRkFFbnVtQ291bnQgPQotICAgIHNpemVvZihnX1hGQUVudW1EYXRhKSAvIHNpemVvZihYRkFfQVRUUklCVVRFRU5VTUlORk8pOworICAgIHNpemVvZihnX1hGQUVudW1EYXRhKSAvIHNpemVvZihYRkFfQXR0cmlidXRlRW51bUluZm8pOwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL3hmYV9iYXNpY19kYXRhX3BhY2tldHMuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL3hmYV9iYXNpY19kYXRhX3BhY2tldHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWEwOWRhLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL3BhcnNlci94ZmFfYmFzaWNfZGF0YV9wYWNrZXRzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfYmFzaWNfZGF0YS5oIgotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvZnhmYV9iYXNpYy5oIgotCi1jb25zdCBYRkFfUEFDS0VUSU5GTyBnX1hGQVBhY2tldERhdGFbXSA9IHsKLSAgICB7MHgwLCBudWxscHRyLCBYRkFfWERQUEFDS0VUX1VTRVIsIG51bGxwdHIsCi0gICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE1BTll9LAotICAgIHsweDgxMTkyOWQsIEwic291cmNlU2V0IiwgWEZBX1hEUFBBQ0tFVF9Tb3VyY2VTZXQsCi0gICAgIEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtc291cmNlLXNldC8iLAotICAgICBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRPTkV9LAotICAgIHsweGI4NDNkYmEsIEwicGRmIiwgWEZBX1hEUFBBQ0tFVF9QZGYsIEwiaHR0cDovL25zLmFkb2JlLmNvbS94ZHAvcGRmLyIsCi0gICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfQ09NUExFVEVNQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sCi0gICAgezB4YzU2YWZiZiwgTCJ4ZGMiLCBYRkFfWERQUEFDS0VUX1hkYywgTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hkYy8iLAotICAgICBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRPTkV9LAotICAgIHsweGM1NmFmY2MsIEwieGRwIiwgWEZBX1hEUFBBQ0tFVF9YRFAsIEwiaHR0cDovL25zLmFkb2JlLmNvbS94ZHAvIiwKLSAgICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19DT01QTEVURU1BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUT05FfSwKLSAgICB7MHgxMzJhOGZiYywgTCJ4bXBtZXRhIiwgWEZBX1hEUFBBQ0tFVF9YbXBtZXRhLAotICAgICBMImh0dHA6Ly9ucy5hZG9iZS5jb20veG1wbWV0YS8iLAotICAgICBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRNQU5ZfSwKLSAgICB7MHg0OGQwMDRhOCwgTCJ4ZmRmIiwgWEZBX1hEUFBBQ0tFVF9YZmRmLCBMImh0dHA6Ly9ucy5hZG9iZS5jb20veGZkZi8iLAotICAgICBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRPTkV9LAotICAgIHsweDRlMWUzOWI2LCBMImNvbmZpZyIsIFhGQV9YRFBQQUNLRVRfQ29uZmlnLAotICAgICBMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGNpLyIsCi0gICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sCi0gICAgezB4NTQ3M2I2ZGMsIEwibG9jYWxlU2V0IiwgWEZBX1hEUFBBQ0tFVF9Mb2NhbGVTZXQsCi0gICAgIEwiaHR0cDovL3d3dy54ZmEub3JnL3NjaGVtYS94ZmEtbG9jYWxlLXNldC8iLAotICAgICBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRPTkV9LAotICAgIHsweDYwMzg1ODBhLCBMInN0eWxlc2hlZXQiLCBYRkFfWERQUEFDS0VUX1N0eWxlc2hlZXQsCi0gICAgIEwiaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIiwKLSAgICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19OT01BVENIIHwgWEZBX1hEUFBBQ0tFVF9GTEFHU19TVVBQT1JUTUFOWX0sCi0gICAgezB4ODAzNTUwZmMsIEwidGVtcGxhdGUiLCBYRkFfWERQUEFDS0VUX1RlbXBsYXRlLAotICAgICBMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLXRlbXBsYXRlLyIsCi0gICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sCi0gICAgezB4OGIwMzZmMzIsIEwic2lnbmF0dXJlIiwgWEZBX1hEUFBBQ0tFVF9TaWduYXR1cmUsCi0gICAgIEwiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIsCi0gICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sCi0gICAgezB4OTliOTUwNzksIEwiZGF0YXNldHMiLCBYRkFfWERQUEFDS0VUX0RhdGFzZXRzLAotICAgICBMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWRhdGEvIiwKLSAgICAgWEZBX1hEUFBBQ0tFVF9GTEFHU19QUkVGSVhNQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sCi0gICAgezB4Y2QzMDlmZjQsIEwiZm9ybSIsIFhGQV9YRFBQQUNLRVRfRm9ybSwKLSAgICAgTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1mb3JtLyIsCi0gICAgIFhGQV9YRFBQQUNLRVRfRkxBR1NfTk9NQVRDSCB8IFhGQV9YRFBQQUNLRVRfRkxBR1NfU1VQUE9SVE9ORX0sCi0gICAgezB4ZTE0YzgwMWMsIEwiY29ubmVjdGlvblNldCIsIFhGQV9YRFBQQUNLRVRfQ29ubmVjdGlvblNldCwKLSAgICAgTCJodHRwOi8vd3d3LnhmYS5vcmcvc2NoZW1hL3hmYS1jb25uZWN0aW9uLXNldC8iLAotICAgICBYRkFfWERQUEFDS0VUX0ZMQUdTX05PTUFUQ0ggfCBYRkFfWERQUEFDS0VUX0ZMQUdTX1NVUFBPUlRPTkV9LAotfTsKLWNvbnN0IGludDMyX3QgZ19pWEZBUGFja2V0Q291bnQgPQotICAgIHNpemVvZihnX1hGQVBhY2tldERhdGEpIC8gc2l6ZW9mKFhGQV9QQUNLRVRJTkZPKTsKZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YW1lcmdlcl9pbXAuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL3hmYV9kb2N1bWVudF9kYXRhbWVyZ2VyX2ltcC5jcHAKaW5kZXggMDNhYjgxZS4uZjZmMTY1ZiAxMDA2NDQKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL3hmYV9kb2N1bWVudF9kYXRhbWVyZ2VyX2ltcC5jcHAKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL3hmYV9kb2N1bWVudF9kYXRhbWVyZ2VyX2ltcC5jcHAKQEAgLTksMTUgKzksMzEgQEAKICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8dmVjdG9yPgogCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9leHQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dGVuc2lvbi5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWxlbGVtZW50LmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbG5vZGUuaCIKKyNpbmNsdWRlICJmeGpzL2NmeGpzZV9lbmdpbmUuaCIKKyNpbmNsdWRlICJmeGpzL3hmYS9janhfb2JqZWN0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9sb2dnaW5nLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgotI2luY2x1ZGUgInhmYS9mZGUveG1sL2ZkZV94bWxfaW1wLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfYmluZC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RhdGFncm91cC5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZXhkYXRhLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZm9ybS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2ltYWdlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfaXRlbXMuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXRwcm9jZXNzb3IuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sb2NhbGVtZ3IuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9ub2RlLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbm9kZWl0ZXJhdG9ydGVtcGxhdGUuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vY2N1ci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3NjcmlwdGNvbnRleHQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX2xvY2FsZW1nci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfb2JqZWN0LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfcGFnZXNldC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3N1YmZvcm0uaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90ZW1wbGF0ZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RyYXZlcnNlc3RyYXRlZ3lfeGZhY29udGFpbmVybm9kZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3RyYXZlcnNlc3RyYXRlZ3lfeGZhbm9kZS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZhbHVlLmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9yZXNvbHZlbm9kZV9ycy5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfdXRpbHMuaCIKIApAQCAtMzIsNyArNDgsNyBAQAogICAgIHJldHVybiBwRERHcm91cE5vZGUtPkdldE5leHRTYW1lTmFtZVNpYmxpbmcoWEZBX0hBU0hDT0RFX0dyb3VwKTsKICAgfQogICBzdGF0aWMgQ1hGQV9Ob2RlKiBHZXRQYXJlbnQoQ1hGQV9Ob2RlKiBwRERHcm91cE5vZGUpIHsKLSAgICByZXR1cm4gcERER3JvdXBOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsKKyAgICByZXR1cm4gcERER3JvdXBOb2RlLT5HZXRQYXJlbnQoKTsKICAgfQogfTsKIApAQCAtNDEsNzMgKzU3LDY3IEBACiAgIENYRkFfTm9kZSogcERhdGFDaGlsZDsKIH07CiAKLWJvb2wgR2V0T2NjdXJJbmZvKENYRkFfTm9kZSogcE9jY3VyTm9kZSwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlNaW4sCi0gICAgICAgICAgICAgICAgICBpbnQzMl90JiBpTWF4LAotICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUluaXQpIHsKLSAgaWYgKCFwT2NjdXJOb2RlKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDWEZBX09jY3VyIG9jY3VyKHBPY2N1ck5vZGUpOwotICByZXR1cm4gb2NjdXIuR2V0T2NjdXJJbmZvKGlNaW4sIGlNYXgsIGlJbml0KTsKLX0KLQogQ1hGQV9Ob2RlKiBGb3JtVmFsdWVOb2RlX0NyZWF0ZUNoaWxkKENYRkFfTm9kZSogcFZhbHVlTm9kZSwgWEZBX0VsZW1lbnQgaVR5cGUpIHsKLSAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcFZhbHVlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOworICBDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwVmFsdWVOb2RlLT5HZXRGaXJzdENoaWxkKCk7CiAgIGlmICghcENoaWxkTm9kZSkgewogICAgIGlmIChpVHlwZSA9PSBYRkFfRWxlbWVudDo6VW5rbm93bikKICAgICAgIHJldHVybiBudWxscHRyOwotICAgIHBDaGlsZE5vZGUgPSBwVmFsdWVOb2RlLT5HZXRQcm9wZXJ0eSgwLCBpVHlwZSk7CisKKyAgICBwQ2hpbGROb2RlID0KKyAgICAgICAgcFZhbHVlTm9kZS0+SlNPYmplY3QoKS0+R2V0T3JDcmVhdGVQcm9wZXJ0eTxDWEZBX05vZGU+KDAsIGlUeXBlKTsKICAgfQogICByZXR1cm4gcENoaWxkTm9kZTsKIH0KIAogdm9pZCBGb3JtVmFsdWVOb2RlX01hdGNoTm9uZUNyZWF0ZUNoaWxkKENYRkFfTm9kZSogcEZvcm1Ob2RlKSB7Ci0gIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBwRm9ybU5vZGUtPkdldFdpZGdldERhdGEoKTsKLSAgQVNTRVJUKHBXaWRnZXREYXRhKTsKLSAgcFdpZGdldERhdGEtPkdldFVJVHlwZSgpOworICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBGb3JtTm9kZS0+R2V0V2lkZ2V0QWNjKCk7CisgIEFTU0VSVChwV2lkZ2V0QWNjKTsKKyAgcFdpZGdldEFjYy0+R2V0VUlUeXBlKCk7CiB9CiAKIGJvb2wgRm9ybVZhbHVlTm9kZV9TZXRDaGlsZENvbnRlbnQoQ1hGQV9Ob2RlKiBwVmFsdWVOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c0NvbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50IGlUeXBlID0gWEZBX0VsZW1lbnQ6OlVua25vd24pIHsKICAgaWYgKCFwVmFsdWVOb2RlKQogICAgIHJldHVybiBmYWxzZTsKIAotICBBU1NFUlQocFZhbHVlTm9kZS0+R2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0Zvcm0pOworICBBU1NFUlQocFZhbHVlTm9kZS0+R2V0UGFja2V0VHlwZSgpID09IFhGQV9QYWNrZXRUeXBlOjpGb3JtKTsKICAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gRm9ybVZhbHVlTm9kZV9DcmVhdGVDaGlsZChwVmFsdWVOb2RlLCBpVHlwZSk7CiAgIGlmICghcENoaWxkTm9kZSkKICAgICByZXR1cm4gZmFsc2U7CiAKICAgc3dpdGNoIChwQ2hpbGROb2RlLT5HZXRPYmplY3RUeXBlKCkpIHsKICAgICBjYXNlIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZTogewotICAgICAgQ1hGQV9Ob2RlKiBwQ29udGVudFJhd0RhdGFOb2RlID0KLSAgICAgICAgICBwQ2hpbGROb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7CisgICAgICBDWEZBX05vZGUqIHBDb250ZW50UmF3RGF0YU5vZGUgPSBwQ2hpbGROb2RlLT5HZXRGaXJzdENoaWxkKCk7CiAgICAgICBpZiAoIXBDb250ZW50UmF3RGF0YU5vZGUpIHsKICAgICAgICAgWEZBX0VsZW1lbnQgZWxlbWVudCA9IFhGQV9FbGVtZW50OjpTaGFycHRleHQ7CiAgICAgICAgIGlmIChwQ2hpbGROb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpFeERhdGEpIHsKLSAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOwotICAgICAgICAgIHBDaGlsZE5vZGUtPkdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFX0NvbnRlbnRUeXBlLCB3c0NvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgICAgaWYgKHdzQ29udGVudFR5cGUgPT0gTCJ0ZXh0L2h0bWwiKQotICAgICAgICAgICAgZWxlbWVudCA9IFhGQV9FbGVtZW50OjpTaGFycHhIVE1MOwotICAgICAgICAgIGVsc2UgaWYgKHdzQ29udGVudFR5cGUgPT0gTCJ0ZXh0L3htbCIpCi0gICAgICAgICAgICBlbGVtZW50ID0gWEZBX0VsZW1lbnQ6OlNoYXJweG1sOworICAgICAgICAgIE9wdGlvbmFsPFdpZGVTdHJpbmc+IGNvbnRlbnRUeXBlID0KKyAgICAgICAgICAgICAgcENoaWxkTm9kZS0+SlNPYmplY3QoKS0+VHJ5QXR0cmlidXRlKFhGQV9BdHRyaWJ1dGU6OkNvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgIGlmIChjb250ZW50VHlwZSkgeworICAgICAgICAgICAgaWYgKCpjb250ZW50VHlwZSA9PSBMInRleHQvaHRtbCIpCisgICAgICAgICAgICAgIGVsZW1lbnQgPSBYRkFfRWxlbWVudDo6U2hhcnB4SFRNTDsKKyAgICAgICAgICAgIGVsc2UgaWYgKCpjb250ZW50VHlwZSA9PSBMInRleHQveG1sIikKKyAgICAgICAgICAgICAgZWxlbWVudCA9IFhGQV9FbGVtZW50OjpTaGFycHhtbDsKKyAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcENvbnRlbnRSYXdEYXRhTm9kZSA9IHBDaGlsZE5vZGUtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKGVsZW1lbnQpOwotICAgICAgICBwQ2hpbGROb2RlLT5JbnNlcnRDaGlsZChwQ29udGVudFJhd0RhdGFOb2RlKTsKKyAgICAgICAgcENoaWxkTm9kZS0+SW5zZXJ0Q2hpbGQocENvbnRlbnRSYXdEYXRhTm9kZSwgbnVsbHB0cik7CiAgICAgICB9Ci0gICAgICBwQ29udGVudFJhd0RhdGFOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbnRlbnQpOworICAgICAgcENvbnRlbnRSYXdEYXRhTm9kZS0+SlNPYmplY3QoKS0+U2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6VmFsdWUsIHdzQ29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7CiAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBYRkFfT2JqZWN0VHlwZTo6Tm9kZUM6CiAgICAgY2FzZSBYRkFfT2JqZWN0VHlwZTo6VGV4dE5vZGU6CiAgICAgY2FzZSBYRkFfT2JqZWN0VHlwZTo6Tm9kZVY6IHsKLSAgICAgIHBDaGlsZE5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfVmFsdWUsIHdzQ29udGVudCk7CisgICAgICBwQ2hpbGROb2RlLT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpWYWx1ZSwgd3NDb250ZW50LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBkZWZhdWx0OgotICAgICAgQVNTRVJUKGZhbHNlKTsKKyAgICAgIE5PVFJFQUNIRUQoKTsKICAgICAgIGJyZWFrOwogICB9CiAgIHJldHVybiB0cnVlOwpAQCAtMTE2LDIzMSArMTI2LDI0MyBAQAogdm9pZCBDcmVhdGVEYXRhQmluZGluZyhDWEZBX05vZGUqIHBGb3JtTm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkRhdGFUb0Zvcm0pIHsKLSAgcEZvcm1Ob2RlLT5TZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwgcERhdGFOb2RlKTsKKyAgcEZvcm1Ob2RlLT5TZXRCaW5kaW5nTm9kZShwRGF0YU5vZGUpOwogICBwRGF0YU5vZGUtPkFkZEJpbmRJdGVtKHBGb3JtTm9kZSk7CiAgIFhGQV9FbGVtZW50IGVUeXBlID0gcEZvcm1Ob2RlLT5HZXRFbGVtZW50VHlwZSgpOwogICBpZiAoZVR5cGUgIT0gWEZBX0VsZW1lbnQ6OkZpZWxkICYmIGVUeXBlICE9IFhGQV9FbGVtZW50OjpFeGNsR3JvdXApCiAgICAgcmV0dXJuOwogCi0gIENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEgPSBwRm9ybU5vZGUtPkdldFdpZGdldERhdGEoKTsKLSAgQVNTRVJUKHBXaWRnZXREYXRhKTsKLSAgWEZBX0VsZW1lbnQgZVVJVHlwZSA9IHBXaWRnZXREYXRhLT5HZXRVSVR5cGUoKTsKLSAgQ1hGQV9WYWx1ZSBkZWZWYWx1ZShwRm9ybU5vZGUtPkdldFByb3BlcnR5KDAsIFhGQV9FbGVtZW50OjpWYWx1ZSkpOworICBDWEZBX1dpZGdldEFjYyogcFdpZGdldEFjYyA9IHBGb3JtTm9kZS0+R2V0V2lkZ2V0QWNjKCk7CisgIEFTU0VSVChwV2lkZ2V0QWNjKTsKKyAgWEZBX0VsZW1lbnQgZVVJVHlwZSA9IHBXaWRnZXRBY2MtPkdldFVJVHlwZSgpOworICBhdXRvKiBkZWZWYWx1ZSA9IHBGb3JtTm9kZS0+SlNPYmplY3QoKS0+R2V0T3JDcmVhdGVQcm9wZXJ0eTxDWEZBX1ZhbHVlPigKKyAgICAgIDAsIFhGQV9FbGVtZW50OjpWYWx1ZSk7CiAgIGlmICghYkRhdGFUb0Zvcm0pIHsKLSAgICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlOwotICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0dGVkVmFsdWU7CisgICAgV2lkZVN0cmluZyB3c1ZhbHVlOwogICAgIHN3aXRjaCAoZVVJVHlwZSkgewogICAgICAgY2FzZSBYRkFfRWxlbWVudDo6SW1hZ2VFZGl0OiB7Ci0gICAgICAgIENYRkFfSW1hZ2UgaW1hZ2UgPSBkZWZWYWx1ZS5HZXRJbWFnZSgpOwotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOwotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0hyZWY7CisgICAgICAgIENYRkFfSW1hZ2UqIGltYWdlID0gZGVmVmFsdWUgPyBkZWZWYWx1ZS0+R2V0SW1hZ2VJZkV4aXN0cygpIDogbnVsbHB0cjsKKyAgICAgICAgV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOworICAgICAgICBXaWRlU3RyaW5nIHdzSHJlZjsKICAgICAgICAgaWYgKGltYWdlKSB7Ci0gICAgICAgICAgaW1hZ2UuR2V0Q29udGVudCh3c1ZhbHVlKTsKLSAgICAgICAgICBpbWFnZS5HZXRDb250ZW50VHlwZSh3c0NvbnRlbnRUeXBlKTsKLSAgICAgICAgICBpbWFnZS5HZXRIcmVmKHdzSHJlZik7CisgICAgICAgICAgd3NWYWx1ZSA9IGltYWdlLT5HZXRDb250ZW50KCk7CisgICAgICAgICAgd3NDb250ZW50VHlwZSA9IGltYWdlLT5HZXRDb250ZW50VHlwZSgpOworICAgICAgICAgIHdzSHJlZiA9IGltYWdlLT5HZXRIcmVmKCk7CiAgICAgICAgIH0KLSAgICAgICAgQ0ZERV9YTUxFbGVtZW50KiBwWE1MRGF0YUVsZW1lbnQgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4ocERhdGFOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpKTsKKyAgICAgICAgQ0ZYX1hNTEVsZW1lbnQqIHBYTUxEYXRhRWxlbWVudCA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxDRlhfWE1MRWxlbWVudCo+KHBEYXRhTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKSk7CiAgICAgICAgIEFTU0VSVChwWE1MRGF0YUVsZW1lbnQpOwotICAgICAgICBwV2lkZ2V0RGF0YS0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0dGVkVmFsdWUpOwotICAgICAgICBwRGF0YU5vZGUtPlNldEF0dHJpYnV0ZVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0dGVkVmFsdWUpOwotICAgICAgICBwRGF0YU5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUpOworCisgICAgICAgIHBEYXRhTm9kZS0+SlNPYmplY3QoKS0+U2V0QXR0cmlidXRlVmFsdWUoCisgICAgICAgICAgICB3c1ZhbHVlLCBwV2lkZ2V0QWNjLT5HZXRGb3JtYXREYXRhVmFsdWUod3NWYWx1ZSksIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHBEYXRhTm9kZS0+SlNPYmplY3QoKS0+U2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6Q29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NDb250ZW50VHlwZSwgZmFsc2UsIGZhbHNlKTsKICAgICAgICAgaWYgKCF3c0hyZWYuSXNFbXB0eSgpKQogICAgICAgICAgIHBYTUxEYXRhRWxlbWVudC0+U2V0U3RyaW5nKEwiaHJlZiIsIHdzSHJlZik7CiAKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBjYXNlIFhGQV9FbGVtZW50OjpDaG9pY2VMaXN0OgotICAgICAgICBkZWZWYWx1ZS5HZXRDaGlsZFZhbHVlQ29udGVudCh3c1ZhbHVlKTsKLSAgICAgICAgaWYgKHBXaWRnZXREYXRhLT5HZXRDaG9pY2VMaXN0T3BlbigpID09IFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0KSB7Ci0gICAgICAgICAgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+IHdzU2VsVGV4dEFycmF5OwotICAgICAgICAgIHBXaWRnZXREYXRhLT5HZXRTZWxlY3RlZEl0ZW1zVmFsdWUod3NTZWxUZXh0QXJyYXkpOwotICAgICAgICAgIGludDMyX3QgaVNpemUgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHdzU2VsVGV4dEFycmF5KTsKLSAgICAgICAgICBpZiAoaVNpemUgPj0gMSkgewotICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVmFsdWUgPSBudWxscHRyOwotICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVNpemU7IGkrKykgewotICAgICAgICAgICAgICBwVmFsdWUgPSBwRGF0YU5vZGUtPkNyZWF0ZVNhbWVQYWNrZXROb2RlKFhGQV9FbGVtZW50OjpEYXRhVmFsdWUpOwotICAgICAgICAgICAgICBwVmFsdWUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgTCJ2YWx1ZSIpOworICAgICAgICB3c1ZhbHVlID0gZGVmVmFsdWUgPyBkZWZWYWx1ZS0+R2V0Q2hpbGRWYWx1ZUNvbnRlbnQoKSA6IEwiIjsKKyAgICAgICAgaWYgKHBXaWRnZXRBY2MtPklzQ2hvaWNlTGlzdE11bHRpU2VsZWN0KCkpIHsKKyAgICAgICAgICBzdGQ6OnZlY3RvcjxXaWRlU3RyaW5nPiB3c1NlbFRleHRBcnJheSA9CisgICAgICAgICAgICAgIHBXaWRnZXRBY2MtPkdldFNlbGVjdGVkSXRlbXNWYWx1ZSgpOworICAgICAgICAgIGlmICghd3NTZWxUZXh0QXJyYXkuZW1wdHkoKSkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiB0ZXh0IDogd3NTZWxUZXh0QXJyYXkpIHsKKyAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVmFsdWUgPQorICAgICAgICAgICAgICAgICAgcERhdGFOb2RlLT5DcmVhdGVTYW1lUGFja2V0Tm9kZShYRkFfRWxlbWVudDo6RGF0YVZhbHVlKTsKKyAgICAgICAgICAgICAgcFZhbHVlLT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpOYW1lLCBMInZhbHVlIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICAgICAgICBwVmFsdWUtPkNyZWF0ZVhNTE1hcHBpbmdOb2RlKCk7Ci0gICAgICAgICAgICAgIHBEYXRhTm9kZS0+SW5zZXJ0Q2hpbGQocFZhbHVlKTsKLSAgICAgICAgICAgICAgcFZhbHVlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c1NlbFRleHRBcnJheVtpXSk7CisgICAgICAgICAgICAgIHBEYXRhTm9kZS0+SW5zZXJ0Q2hpbGQocFZhbHVlLCBudWxscHRyKTsKKyAgICAgICAgICAgICAgcFZhbHVlLT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpWYWx1ZSwgdGV4dCwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBDRkRFX1hNTE5vZGUqIHBYTUxOb2RlID0gcERhdGFOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpOwotICAgICAgICAgICAgQVNTRVJUKHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRkRFX1hNTE5PREVfRWxlbWVudCk7Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxDRkRFX1hNTEVsZW1lbnQqPihwWE1MTm9kZSktPlNldFN0cmluZyhMInhmYTpkYXRhTm9kZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImRhdGFHcm91cCIpOworICAgICAgICAgICAgQ0ZYX1hNTE5vZGUqIHBYTUxOb2RlID0gcERhdGFOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpOworICAgICAgICAgICAgQVNTRVJUKHBYTUxOb2RlLT5HZXRUeXBlKCkgPT0gRlhfWE1MTk9ERV9FbGVtZW50KTsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PENGWF9YTUxFbGVtZW50Kj4ocFhNTE5vZGUpLT5TZXRTdHJpbmcoTCJ4ZmE6ZGF0YU5vZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImRhdGFHcm91cCIpOwogICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmICghd3NWYWx1ZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICBwV2lkZ2V0RGF0YS0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0dGVkVmFsdWUpOwotICAgICAgICAgIHBEYXRhTm9kZS0+U2V0QXR0cmlidXRlVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXR0ZWRWYWx1ZSk7CisgICAgICAgICAgcERhdGFOb2RlLT5KU09iamVjdCgpLT5TZXRBdHRyaWJ1dGVWYWx1ZSgKKyAgICAgICAgICAgICAgd3NWYWx1ZSwgcFdpZGdldEFjYy0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzVmFsdWUpLCBmYWxzZSwgZmFsc2UpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBYRkFfRWxlbWVudDo6Q2hlY2tCdXR0b246Ci0gICAgICAgIGRlZlZhbHVlLkdldENoaWxkVmFsdWVDb250ZW50KHdzVmFsdWUpOworICAgICAgICB3c1ZhbHVlID0gZGVmVmFsdWUgPyBkZWZWYWx1ZS0+R2V0Q2hpbGRWYWx1ZUNvbnRlbnQoKSA6IEwiIjsKICAgICAgICAgaWYgKHdzVmFsdWUuSXNFbXB0eSgpKQogICAgICAgICAgIGJyZWFrOwogCi0gICAgICAgIHBXaWRnZXREYXRhLT5HZXRGb3JtYXREYXRhVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXR0ZWRWYWx1ZSk7Ci0gICAgICAgIHBEYXRhTm9kZS0+U2V0QXR0cmlidXRlVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXR0ZWRWYWx1ZSk7CisgICAgICAgIHBEYXRhTm9kZS0+SlNPYmplY3QoKS0+U2V0QXR0cmlidXRlVmFsdWUoCisgICAgICAgICAgICB3c1ZhbHVlLCBwV2lkZ2V0QWNjLT5HZXRGb3JtYXREYXRhVmFsdWUod3NWYWx1ZSksIGZhbHNlLCBmYWxzZSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBYRkFfRWxlbWVudDo6RXhjbEdyb3VwOiB7CiAgICAgICAgIENYRkFfTm9kZSogcENoZWNrZWQgPSBudWxscHRyOwotICAgICAgICBDWEZBX05vZGUqIHBDaGlsZCA9IHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgICBmb3IgKDsgcENoaWxkOyBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsKKyAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBwRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgZm9yICg7IHBDaGlsZDsgcENoaWxkID0gcENoaWxkLT5HZXROZXh0U2libGluZygpKSB7CiAgICAgICAgICAgaWYgKHBDaGlsZC0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6RmllbGQpCiAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgIENYRkFfTm9kZSogcFZhbHVlID0gcENoaWxkLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6VmFsdWUpOworICAgICAgICAgIGF1dG8qIHBWYWx1ZSA9CisgICAgICAgICAgICAgIHBDaGlsZC0+R2V0Q2hpbGQ8Q1hGQV9WYWx1ZT4oMCwgWEZBX0VsZW1lbnQ6OlZhbHVlLCBmYWxzZSk7CiAgICAgICAgICAgaWYgKCFwVmFsdWUpCiAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgIENYRkFfVmFsdWUgdmFsdWVDaGlsZChwVmFsdWUpOwotICAgICAgICAgIHZhbHVlQ2hpbGQuR2V0Q2hpbGRWYWx1ZUNvbnRlbnQod3NWYWx1ZSk7CisgICAgICAgICAgd3NWYWx1ZSA9IHBWYWx1ZS0+R2V0Q2hpbGRWYWx1ZUNvbnRlbnQoKTsKICAgICAgICAgICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkpCiAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgIENYRkFfTm9kZSogcEl0ZW1zID0gcENoaWxkLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6SXRlbXMpOworICAgICAgICAgIENYRkFfSXRlbXMqIHBJdGVtcyA9CisgICAgICAgICAgICAgIHBDaGlsZC0+R2V0Q2hpbGQ8Q1hGQV9JdGVtcz4oMCwgWEZBX0VsZW1lbnQ6Okl0ZW1zLCBmYWxzZSk7CiAgICAgICAgICAgaWYgKCFwSXRlbXMpCiAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICAgIENYRkFfTm9kZSogcFRleHQgPSBwSXRlbXMtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsKKyAgICAgICAgICBDWEZBX05vZGUqIHBUZXh0ID0gcEl0ZW1zLT5HZXRGaXJzdENoaWxkKCk7CiAgICAgICAgICAgaWYgKCFwVGV4dCkKICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50OwotICAgICAgICAgIGlmIChwVGV4dC0+VHJ5Q29udGVudCh3c0NvbnRlbnQpICYmICh3c0NvbnRlbnQgPT0gd3NWYWx1ZSkpIHsKKyAgICAgICAgICBXaWRlU3RyaW5nIHdzQ29udGVudCA9IHBUZXh0LT5KU09iamVjdCgpLT5HZXRDb250ZW50KGZhbHNlKTsKKyAgICAgICAgICBpZiAod3NDb250ZW50ID09IHdzVmFsdWUpIHsKICAgICAgICAgICAgIHBDaGVja2VkID0gcENoaWxkOwotICAgICAgICAgICAgd3NGb3JtYXR0ZWRWYWx1ZSA9IHdzVmFsdWU7Ci0gICAgICAgICAgICBwRGF0YU5vZGUtPlNldEF0dHJpYnV0ZVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0dGVkVmFsdWUpOwotICAgICAgICAgICAgcEZvcm1Ob2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCB3c0NvbnRlbnQpOworICAgICAgICAgICAgcERhdGFOb2RlLT5KU09iamVjdCgpLT5TZXRBdHRyaWJ1dGVWYWx1ZSh3c1ZhbHVlLCB3c1ZhbHVlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgcEZvcm1Ob2RlLT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpWYWx1ZSwgd3NDb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmICghcENoZWNrZWQpCiAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgcENoaWxkID0gcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gICAgICAgIGZvciAoOyBwQ2hpbGQ7IHBDaGlsZCA9IHBDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgeworICAgICAgICBwQ2hpbGQgPSBwRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgZm9yICg7IHBDaGlsZDsgcENoaWxkID0gcENoaWxkLT5HZXROZXh0U2libGluZygpKSB7CiAgICAgICAgICAgaWYgKHBDaGlsZCA9PSBwQ2hlY2tlZCkKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgIGlmIChwQ2hpbGQtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OkZpZWxkKQogICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAgICBDWEZBX05vZGUqIHBWYWx1ZSA9IHBDaGlsZC0+R2V0UHJvcGVydHkoMCwgWEZBX0VsZW1lbnQ6OlZhbHVlKTsKLSAgICAgICAgICBDWEZBX05vZGUqIHBJdGVtcyA9IHBDaGlsZC0+R2V0Q2hpbGQoMCwgWEZBX0VsZW1lbnQ6Okl0ZW1zKTsKLSAgICAgICAgICBDWEZBX05vZGUqIHBUZXh0ID0KLSAgICAgICAgICAgICAgcEl0ZW1zID8gcEl0ZW1zLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCkgOiBudWxscHRyOworICAgICAgICAgIENYRkFfVmFsdWUqIHBWYWx1ZSA9CisgICAgICAgICAgICAgIHBDaGlsZC0+SlNPYmplY3QoKS0+R2V0T3JDcmVhdGVQcm9wZXJ0eTxDWEZBX1ZhbHVlPigKKyAgICAgICAgICAgICAgICAgIDAsIFhGQV9FbGVtZW50OjpWYWx1ZSk7CisgICAgICAgICAgQ1hGQV9JdGVtcyogcEl0ZW1zID0KKyAgICAgICAgICAgICAgcENoaWxkLT5HZXRDaGlsZDxDWEZBX0l0ZW1zPigwLCBYRkFfRWxlbWVudDo6SXRlbXMsIGZhbHNlKTsKKyAgICAgICAgICBDWEZBX05vZGUqIHBUZXh0ID0gcEl0ZW1zID8gcEl0ZW1zLT5HZXRGaXJzdENoaWxkKCkgOiBudWxscHRyOwogICAgICAgICAgIGlmIChwVGV4dCkKLSAgICAgICAgICAgIHBUZXh0ID0gcFRleHQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7CisgICAgICAgICAgICBwVGV4dCA9IHBUZXh0LT5HZXROZXh0U2libGluZygpOwogCi0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NDb250ZW50OworICAgICAgICAgIFdpZGVTdHJpbmcgd3NDb250ZW50OwogICAgICAgICAgIGlmIChwVGV4dCkKLSAgICAgICAgICAgIHBUZXh0LT5UcnlDb250ZW50KHdzQ29udGVudCk7CisgICAgICAgICAgICB3c0NvbnRlbnQgPSBwVGV4dC0+SlNPYmplY3QoKS0+R2V0Q29udGVudChmYWxzZSk7CiAKICAgICAgICAgICBGb3JtVmFsdWVOb2RlX1NldENoaWxkQ29udGVudChwVmFsdWUsIHdzQ29udGVudCwgWEZBX0VsZW1lbnQ6OlRleHQpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgICAgY2FzZSBYRkFfRWxlbWVudDo6TnVtZXJpY0VkaXQ6IHsKLSAgICAgICAgZGVmVmFsdWUuR2V0Q2hpbGRWYWx1ZUNvbnRlbnQod3NWYWx1ZSk7CisgICAgICAgIHdzVmFsdWUgPSBkZWZWYWx1ZSA/IGRlZlZhbHVlLT5HZXRDaGlsZFZhbHVlQ29udGVudCgpIDogTCIiOwogICAgICAgICBpZiAod3NWYWx1ZS5Jc0VtcHR5KCkpCiAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NPdXRwdXQ7Ci0gICAgICAgIHBXaWRnZXREYXRhLT5Ob3JtYWxpemVOdW1TdHIod3NWYWx1ZSwgd3NPdXRwdXQpOwotICAgICAgICB3c1ZhbHVlID0gd3NPdXRwdXQ7Ci0gICAgICAgIHBXaWRnZXREYXRhLT5HZXRGb3JtYXREYXRhVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXR0ZWRWYWx1ZSk7Ci0gICAgICAgIHBEYXRhTm9kZS0+U2V0QXR0cmlidXRlVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXR0ZWRWYWx1ZSk7Ci0gICAgICAgIENYRkFfTm9kZSogcFZhbHVlID0gcEZvcm1Ob2RlLT5HZXRQcm9wZXJ0eSgwLCBYRkFfRWxlbWVudDo6VmFsdWUpOworICAgICAgICB3c1ZhbHVlID0gcFdpZGdldEFjYy0+Tm9ybWFsaXplTnVtU3RyKHdzVmFsdWUpOworICAgICAgICBwRGF0YU5vZGUtPkpTT2JqZWN0KCktPlNldEF0dHJpYnV0ZVZhbHVlKAorICAgICAgICAgICAgd3NWYWx1ZSwgcFdpZGdldEFjYy0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzVmFsdWUpLCBmYWxzZSwgZmFsc2UpOworICAgICAgICBDWEZBX1ZhbHVlKiBwVmFsdWUgPQorICAgICAgICAgICAgcEZvcm1Ob2RlLT5KU09iamVjdCgpLT5HZXRPckNyZWF0ZVByb3BlcnR5PENYRkFfVmFsdWU+KAorICAgICAgICAgICAgICAgIDAsIFhGQV9FbGVtZW50OjpWYWx1ZSk7CiAgICAgICAgIEZvcm1WYWx1ZU5vZGVfU2V0Q2hpbGRDb250ZW50KHBWYWx1ZSwgd3NWYWx1ZSwgWEZBX0VsZW1lbnQ6OkZsb2F0KTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgICBkZWZhdWx0OgotICAgICAgICBkZWZWYWx1ZS5HZXRDaGlsZFZhbHVlQ29udGVudCh3c1ZhbHVlKTsKKyAgICAgICAgd3NWYWx1ZSA9IGRlZlZhbHVlID8gZGVmVmFsdWUtPkdldENoaWxkVmFsdWVDb250ZW50KCkgOiBMIiI7CiAgICAgICAgIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkKICAgICAgICAgICBicmVhazsKIAotICAgICAgICBwV2lkZ2V0RGF0YS0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0dGVkVmFsdWUpOwotICAgICAgICBwRGF0YU5vZGUtPlNldEF0dHJpYnV0ZVZhbHVlKHdzVmFsdWUsIHdzRm9ybWF0dGVkVmFsdWUpOworICAgICAgICBwRGF0YU5vZGUtPkpTT2JqZWN0KCktPlNldEF0dHJpYnV0ZVZhbHVlKAorICAgICAgICAgICAgd3NWYWx1ZSwgcFdpZGdldEFjYy0+R2V0Rm9ybWF0RGF0YVZhbHVlKHdzVmFsdWUpLCBmYWxzZSwgZmFsc2UpOwogICAgICAgICBicmVhazsKICAgICB9CiAgICAgcmV0dXJuOwogICB9CiAKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NYTUxWYWx1ZTsKLSAgcERhdGFOb2RlLT5UcnlDb250ZW50KHdzWE1MVmFsdWUpOwotICBDRlhfV2lkZVN0cmluZyB3c05vcm1hbGl6ZVZhbHVlOwotICBwV2lkZ2V0RGF0YS0+R2V0Tm9ybWFsaXplRGF0YVZhbHVlKHdzWE1MVmFsdWUsIHdzTm9ybWFsaXplVmFsdWUpOwotICBwRGF0YU5vZGUtPlNldEF0dHJpYnV0ZVZhbHVlKHdzTm9ybWFsaXplVmFsdWUsIHdzWE1MVmFsdWUpOworICBXaWRlU3RyaW5nIHdzWE1MVmFsdWUgPSBwRGF0YU5vZGUtPkpTT2JqZWN0KCktPkdldENvbnRlbnQoZmFsc2UpOworICBXaWRlU3RyaW5nIHdzTm9ybWFsaXplVmFsdWUgPSBwV2lkZ2V0QWNjLT5HZXROb3JtYWxpemVEYXRhVmFsdWUod3NYTUxWYWx1ZSk7CisKKyAgcERhdGFOb2RlLT5KU09iamVjdCgpLT5TZXRBdHRyaWJ1dGVWYWx1ZSh3c05vcm1hbGl6ZVZhbHVlLCB3c1hNTFZhbHVlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CiAgIHN3aXRjaCAoZVVJVHlwZSkgewogICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkltYWdlRWRpdDogewotICAgICAgRm9ybVZhbHVlTm9kZV9TZXRDaGlsZENvbnRlbnQoZGVmVmFsdWUuR2V0Tm9kZSgpLCB3c05vcm1hbGl6ZVZhbHVlLAorICAgICAgRm9ybVZhbHVlTm9kZV9TZXRDaGlsZENvbnRlbnQoZGVmVmFsdWUsIHdzTm9ybWFsaXplVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6SW1hZ2UpOwotICAgICAgQ1hGQV9JbWFnZSBpbWFnZSA9IGRlZlZhbHVlLkdldEltYWdlKCk7CisgICAgICBDWEZBX0ltYWdlKiBpbWFnZSA9IGRlZlZhbHVlID8gZGVmVmFsdWUtPkdldEltYWdlSWZFeGlzdHMoKSA6IG51bGxwdHI7CiAgICAgICBpZiAoaW1hZ2UpIHsKLSAgICAgICAgQ0ZERV9YTUxFbGVtZW50KiBwWE1MRGF0YUVsZW1lbnQgPQotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4ocERhdGFOb2RlLT5HZXRYTUxNYXBwaW5nTm9kZSgpKTsKKyAgICAgICAgQ0ZYX1hNTEVsZW1lbnQqIHBYTUxEYXRhRWxlbWVudCA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxDRlhfWE1MRWxlbWVudCo+KHBEYXRhTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKSk7CiAgICAgICAgIEFTU0VSVChwWE1MRGF0YUVsZW1lbnQpOwotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlOwotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0hyZWY7Ci0gICAgICAgIHBYTUxEYXRhRWxlbWVudC0+R2V0U3RyaW5nKEwieGZhOmNvbnRlbnRUeXBlIiwgd3NDb250ZW50VHlwZSk7CisKKyAgICAgICAgV2lkZVN0cmluZyB3c0NvbnRlbnRUeXBlID0KKyAgICAgICAgICAgIHBYTUxEYXRhRWxlbWVudC0+R2V0U3RyaW5nKEwieGZhOmNvbnRlbnRUeXBlIik7CiAgICAgICAgIGlmICghd3NDb250ZW50VHlwZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgICBwRGF0YU5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfQ29udGVudFR5cGUsIHdzQ29udGVudFR5cGUpOwotICAgICAgICAgIGltYWdlLlNldENvbnRlbnRUeXBlKHdzQ29udGVudFR5cGUpOworICAgICAgICAgIHBEYXRhTm9kZS0+SlNPYmplY3QoKS0+U2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6Q29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3c0NvbnRlbnRUeXBlLCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgIGltYWdlLT5TZXRDb250ZW50VHlwZSh3c0NvbnRlbnRUeXBlKTsKICAgICAgICAgfQotICAgICAgICBwWE1MRGF0YUVsZW1lbnQtPkdldFN0cmluZyhMImhyZWYiLCB3c0hyZWYpOworCisgICAgICAgIFdpZGVTdHJpbmcgd3NIcmVmID0gcFhNTERhdGFFbGVtZW50LT5HZXRTdHJpbmcoTCJocmVmIik7CiAgICAgICAgIGlmICghd3NIcmVmLklzRW1wdHkoKSkKLSAgICAgICAgICBpbWFnZS5TZXRIcmVmKHdzSHJlZik7CisgICAgICAgICAgaW1hZ2UtPlNldEhyZWYod3NIcmVmKTsKICAgICAgIH0KICAgICAgIGJyZWFrOwogICAgIH0KICAgICBjYXNlIFhGQV9FbGVtZW50OjpDaG9pY2VMaXN0OgotICAgICAgaWYgKHBXaWRnZXREYXRhLT5HZXRDaG9pY2VMaXN0T3BlbigpID09IFhGQV9BVFRSSUJVVEVFTlVNX011bHRpU2VsZWN0KSB7Ci0gICAgICAgIENYRkFfTm9kZUFycmF5IGl0ZW1zOwotICAgICAgICBwRGF0YU5vZGUtPkdldE5vZGVMaXN0KGl0ZW1zKTsKLSAgICAgICAgaW50MzJfdCBpQ291bnRzID0gaXRlbXMuR2V0U2l6ZSgpOwotICAgICAgICBpZiAoaUNvdW50cyA+IDApIHsKKyAgICAgIGlmIChwV2lkZ2V0QWNjLT5Jc0Nob2ljZUxpc3RNdWx0aVNlbGVjdCgpKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+IGl0ZW1zID0gcERhdGFOb2RlLT5HZXROb2RlTGlzdCgKKyAgICAgICAgICAgIFhGQV9OT0RFRklMVEVSX0NoaWxkcmVuIHwgWEZBX05PREVGSUxURVJfUHJvcGVydGllcywKKyAgICAgICAgICAgIFhGQV9FbGVtZW50OjpVbmtub3duKTsKKyAgICAgICAgaWYgKCFpdGVtcy5lbXB0eSgpKSB7CisgICAgICAgICAgYm9vbCBzaW5nbGUgPSBpdGVtcy5zaXplKCkgPT0gMTsKICAgICAgICAgICB3c05vcm1hbGl6ZVZhbHVlLmNsZWFyKCk7Ci0gICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NJdGVtOwotICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudHM7IGkrKykgewotICAgICAgICAgICAgaXRlbXNbaV0tPlRyeUNvbnRlbnQod3NJdGVtKTsKLSAgICAgICAgICAgIHdzSXRlbSA9IChpQ291bnRzID09IDEpID8gd3NJdGVtIDogd3NJdGVtICsgTCJcbiI7CisKKyAgICAgICAgICBmb3IgKENYRkFfTm9kZSogcE5vZGUgOiBpdGVtcykgeworICAgICAgICAgICAgV2lkZVN0cmluZyB3c0l0ZW0gPSBwTm9kZS0+SlNPYmplY3QoKS0+R2V0Q29udGVudChmYWxzZSk7CisgICAgICAgICAgICBpZiAoc2luZ2xlKQorICAgICAgICAgICAgICB3c0l0ZW0gKz0gTCJcbiI7CisKICAgICAgICAgICAgIHdzTm9ybWFsaXplVmFsdWUgKz0gd3NJdGVtOwogICAgICAgICAgIH0KLSAgICAgICAgICBDWEZBX0V4RGF0YSBleERhdGEgPSBkZWZWYWx1ZS5HZXRFeERhdGEoKTsKKyAgICAgICAgICBDWEZBX0V4RGF0YSogZXhEYXRhID0KKyAgICAgICAgICAgICAgZGVmVmFsdWUgPyBkZWZWYWx1ZS0+R2V0RXhEYXRhSWZFeGlzdHMoKSA6IG51bGxwdHI7CiAgICAgICAgICAgQVNTRVJUKGV4RGF0YSk7Ci0gICAgICAgICAgZXhEYXRhLlNldENvbnRlbnRUeXBlKGlDb3VudHMgPT0gMSA/IEwidGV4dC9wbGFpbiIgOiBMInRleHQveG1sIik7CisKKyAgICAgICAgICBleERhdGEtPlNldENvbnRlbnRUeXBlKHNpbmdsZSA/IEwidGV4dC9wbGFpbiIgOiBMInRleHQveG1sIik7CiAgICAgICAgIH0KLSAgICAgICAgRm9ybVZhbHVlTm9kZV9TZXRDaGlsZENvbnRlbnQoZGVmVmFsdWUuR2V0Tm9kZSgpLCB3c05vcm1hbGl6ZVZhbHVlLAorICAgICAgICBGb3JtVmFsdWVOb2RlX1NldENoaWxkQ29udGVudChkZWZWYWx1ZSwgd3NOb3JtYWxpemVWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkV4RGF0YSk7CiAgICAgICB9IGVsc2UgewotICAgICAgICBGb3JtVmFsdWVOb2RlX1NldENoaWxkQ29udGVudChkZWZWYWx1ZS5HZXROb2RlKCksIHdzTm9ybWFsaXplVmFsdWUsCisgICAgICAgIEZvcm1WYWx1ZU5vZGVfU2V0Q2hpbGRDb250ZW50KGRlZlZhbHVlLCB3c05vcm1hbGl6ZVZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6VGV4dCk7CiAgICAgICB9CiAgICAgICBicmVhazsKICAgICBjYXNlIFhGQV9FbGVtZW50OjpDaGVja0J1dHRvbjoKLSAgICAgIEZvcm1WYWx1ZU5vZGVfU2V0Q2hpbGRDb250ZW50KGRlZlZhbHVlLkdldE5vZGUoKSwgd3NOb3JtYWxpemVWYWx1ZSwKKyAgICAgIEZvcm1WYWx1ZU5vZGVfU2V0Q2hpbGRDb250ZW50KGRlZlZhbHVlLCB3c05vcm1hbGl6ZVZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlRleHQpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBYRkFfRWxlbWVudDo6RXhjbEdyb3VwOiB7Ci0gICAgICBwV2lkZ2V0RGF0YS0+U2V0U2VsZWN0ZWRNZW1iZXJCeVZhbHVlKHdzTm9ybWFsaXplVmFsdWUuQXNTdHJpbmdDKCksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpOworICAgICAgcFdpZGdldEFjYy0+U2V0U2VsZWN0ZWRNZW1iZXJCeVZhbHVlKHdzTm9ybWFsaXplVmFsdWUuQXNTdHJpbmdWaWV3KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CiAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBYRkFfRWxlbWVudDo6RGF0ZVRpbWVFZGl0OgotICAgICAgRm9ybVZhbHVlTm9kZV9TZXRDaGlsZENvbnRlbnQoZGVmVmFsdWUuR2V0Tm9kZSgpLCB3c05vcm1hbGl6ZVZhbHVlLAorICAgICAgRm9ybVZhbHVlTm9kZV9TZXRDaGlsZENvbnRlbnQoZGVmVmFsdWUsIHdzTm9ybWFsaXplVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RGF0ZVRpbWUpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBYRkFfRWxlbWVudDo6TnVtZXJpY0VkaXQ6IHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzUGljdHVyZTsKLSAgICAgIHBXaWRnZXREYXRhLT5HZXRQaWN0dXJlQ29udGVudCh3c1BpY3R1cmUsIFhGQV9WQUxVRVBJQ1RVUkVfRGF0YUJpbmQpOwotICAgICAgaWYgKHdzUGljdHVyZS5Jc0VtcHR5KCkpIHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NPdXRwdXQ7Ci0gICAgICAgIHBXaWRnZXREYXRhLT5Ob3JtYWxpemVOdW1TdHIod3NOb3JtYWxpemVWYWx1ZSwgd3NPdXRwdXQpOwotICAgICAgICB3c05vcm1hbGl6ZVZhbHVlID0gd3NPdXRwdXQ7Ci0gICAgICB9Ci0gICAgICBGb3JtVmFsdWVOb2RlX1NldENoaWxkQ29udGVudChkZWZWYWx1ZS5HZXROb2RlKCksIHdzTm9ybWFsaXplVmFsdWUsCisgICAgICBXaWRlU3RyaW5nIHdzUGljdHVyZSA9CisgICAgICAgICAgcFdpZGdldEFjYy0+R2V0UGljdHVyZUNvbnRlbnQoWEZBX1ZBTFVFUElDVFVSRV9EYXRhQmluZCk7CisgICAgICBpZiAod3NQaWN0dXJlLklzRW1wdHkoKSkKKyAgICAgICAgd3NOb3JtYWxpemVWYWx1ZSA9IHBXaWRnZXRBY2MtPk5vcm1hbGl6ZU51bVN0cih3c05vcm1hbGl6ZVZhbHVlKTsKKworICAgICAgRm9ybVZhbHVlTm9kZV9TZXRDaGlsZENvbnRlbnQoZGVmVmFsdWUsIHdzTm9ybWFsaXplVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6RmxvYXQpOwogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMzUwLDcgKzM3Miw3IEBACiAgICAgY2FzZSBYRkFfRWxlbWVudDo6U2lnbmF0dXJlOgogICAgIGNhc2UgWEZBX0VsZW1lbnQ6OlRleHRFZGl0OgogICAgIGRlZmF1bHQ6Ci0gICAgICBGb3JtVmFsdWVOb2RlX1NldENoaWxkQ29udGVudChkZWZWYWx1ZS5HZXROb2RlKCksIHdzTm9ybWFsaXplVmFsdWUsCisgICAgICBGb3JtVmFsdWVOb2RlX1NldENoaWxkQ29udGVudChkZWZWYWx1ZSwgd3NOb3JtYWxpemVWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpUZXh0KTsKICAgICAgIGJyZWFrOwogICB9CkBAIC0zNzIsMTAgKzM5NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudCBlTWF0Y2hEYXRhTm9kZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlVwTGV2ZWwpIHsKICAgZm9yIChDWEZBX05vZGUgKnBDdXJEYXRhU2NvcGUgPSBwRGF0YVNjb3BlLCAqcExhc3REYXRhU2NvcGUgPSBudWxscHRyOwotICAgICAgIHBDdXJEYXRhU2NvcGUgJiYgcEN1ckRhdGFTY29wZS0+R2V0UGFja2V0SUQoKSA9PSBYRkFfWERQUEFDS0VUX0RhdGFzZXRzOworICAgICAgIHBDdXJEYXRhU2NvcGUgJiYKKyAgICAgICBwQ3VyRGF0YVNjb3BlLT5HZXRQYWNrZXRUeXBlKCkgPT0gWEZBX1BhY2tldFR5cGU6OkRhdGFzZXRzOwogICAgICAgIHBMYXN0RGF0YVNjb3BlID0gcEN1ckRhdGFTY29wZSwKLSAgICAgICAgICAgICAgICAgcEN1ckRhdGFTY29wZSA9Ci0gICAgICAgICAgICAgICAgICAgICBwQ3VyRGF0YVNjb3BlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KSkgeworICAgICAgICAgICAgICAgICBwQ3VyRGF0YVNjb3BlID0gcEN1ckRhdGFTY29wZS0+R2V0UGFyZW50KCkpIHsKICAgICBmb3IgKENYRkFfTm9kZSogcERhdGFDaGlsZCA9IHBDdXJEYXRhU2NvcGUtPkdldEZpcnN0Q2hpbGRCeU5hbWUoZHdOYW1lSGFzaCk7CiAgICAgICAgICBwRGF0YUNoaWxkOwogICAgICAgICAgcERhdGFDaGlsZCA9IHBEYXRhQ2hpbGQtPkdldE5leHRTYW1lTmFtZVNpYmxpbmcoZHdOYW1lSGFzaCkpIHsKQEAgLTM4OCwxMCArNDEwLDEyIEBACiAgICAgICByZXR1cm4gcERhdGFDaGlsZDsKICAgICB9CiAKLSAgICBmb3IgKENYRkFfTm9kZSogcERhdGFDaGlsZCA9Ci0gICAgICAgICAgICAgcEN1ckRhdGFTY29wZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VsZW1lbnQ6OkRhdGFHcm91cCk7Ci0gICAgICAgICBwRGF0YUNoaWxkOyBwRGF0YUNoaWxkID0gcERhdGFDaGlsZC0+R2V0TmV4dFNhbWVDbGFzc1NpYmxpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkRhdGFHcm91cCkpIHsKKyAgICBmb3IgKENYRkFfRGF0YUdyb3VwKiBwRGF0YUNoaWxkID0KKyAgICAgICAgICAgICBwQ3VyRGF0YVNjb3BlLT5HZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX0RhdGFHcm91cD4oCisgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50OjpEYXRhR3JvdXApOworICAgICAgICAgcERhdGFDaGlsZDsKKyAgICAgICAgIHBEYXRhQ2hpbGQgPSBwRGF0YUNoaWxkLT5HZXROZXh0U2FtZUNsYXNzU2libGluZzxDWEZBX0RhdGFHcm91cD4oCisgICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OkRhdGFHcm91cCkpIHsKICAgICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gU2NvcGVNYXRjaEdsb2JhbEJpbmRpbmcocERhdGFDaGlsZCwgZHdOYW1lSGFzaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZU1hdGNoRGF0YU5vZGVUeXBlLCBmYWxzZSk7CiAgICAgICBpZiAocERhdGFOb2RlKQpAQCAtNDA0LDEzICs0MjgsMTMgQEAKIH0KIAogQ1hGQV9Ob2RlKiBGaW5kR2xvYmFsRGF0YU5vZGUoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcERhdGFTY29wZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50IGVNYXRjaE5vZGVUeXBlKSB7CiAgIGlmICh3c05hbWUuSXNFbXB0eSgpKQogICAgIHJldHVybiBudWxscHRyOwogCi0gIHVpbnQzMl90IGR3TmFtZUhhc2ggPSBGWF9IYXNoQ29kZV9HZXRXKHdzTmFtZSwgZmFsc2UpOworICB1aW50MzJfdCBkd05hbWVIYXNoID0gRlhfSGFzaENvZGVfR2V0Vyh3c05hbWUuQXNTdHJpbmdWaWV3KCksIGZhbHNlKTsKICAgQ1hGQV9Ob2RlKiBwQm91bmRlZCA9IEdldEdsb2JhbEJpbmRpbmcocERvY3VtZW50LCBkd05hbWVIYXNoKTsKICAgaWYgKCFwQm91bmRlZCkgewogICAgIHBCb3VuZGVkID0KQEAgLTQyMiwxNyArNDQ2LDE4IEBACiB9CiAKIENYRkFfTm9kZSogRmluZE9uY2VEYXRhTm9kZShDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDIHdzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50IGVNYXRjaE5vZGVUeXBlKSB7CiAgIGlmICh3c05hbWUuSXNFbXB0eSgpKQogICAgIHJldHVybiBudWxscHRyOwogCi0gIHVpbnQzMl90IGR3TmFtZUhhc2ggPSBGWF9IYXNoQ29kZV9HZXRXKHdzTmFtZSwgZmFsc2UpOworICB1aW50MzJfdCBkd05hbWVIYXNoID0gRlhfSGFzaENvZGVfR2V0Vyh3c05hbWUuQXNTdHJpbmdWaWV3KCksIGZhbHNlKTsKICAgQ1hGQV9Ob2RlKiBwTGFzdERhdGFTY29wZSA9IG51bGxwdHI7CiAgIGZvciAoQ1hGQV9Ob2RlKiBwQ3VyRGF0YVNjb3BlID0gcERhdGFTY29wZTsKLSAgICAgICBwQ3VyRGF0YVNjb3BlICYmIHBDdXJEYXRhU2NvcGUtPkdldFBhY2tldElEKCkgPT0gWEZBX1hEUFBBQ0tFVF9EYXRhc2V0czsKLSAgICAgICBwQ3VyRGF0YVNjb3BlID0gcEN1ckRhdGFTY29wZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCkpIHsKKyAgICAgICBwQ3VyRGF0YVNjb3BlICYmCisgICAgICAgcEN1ckRhdGFTY29wZS0+R2V0UGFja2V0VHlwZSgpID09IFhGQV9QYWNrZXRUeXBlOjpEYXRhc2V0czsKKyAgICAgICBwQ3VyRGF0YVNjb3BlID0gcEN1ckRhdGFTY29wZS0+R2V0UGFyZW50KCkpIHsKICAgICBmb3IgKENYRkFfTm9kZSogcERhdGFDaGlsZCA9IHBDdXJEYXRhU2NvcGUtPkdldEZpcnN0Q2hpbGRCeU5hbWUoZHdOYW1lSGFzaCk7CiAgICAgICAgICBwRGF0YUNoaWxkOwogICAgICAgICAgcERhdGFDaGlsZCA9IHBEYXRhQ2hpbGQtPkdldE5leHRTYW1lTmFtZVNpYmxpbmcoZHdOYW1lSGFzaCkpIHsKQEAgLTQ0OSw3ICs0NzQsNyBAQAogfQogCiBDWEZBX05vZGUqIEZpbmREYXRhUmVmRGF0YU5vZGUoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nQyB3c1JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c1JlZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhU2NvcGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQgZU1hdGNoTm9kZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLApAQCAtNDYwLDE2ICs0ODUsMTYgQEAKICAgICBkRmxhZ3MgfD0gKFhGQV9SRVNPTFZFTk9ERV9QYXJlbnQgfCBYRkFfUkVTT0xWRU5PREVfU2libGluZ3MpOwogCiAgIFhGQV9SRVNPTFZFTk9ERV9SUyByczsKLSAgcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPlJlc29sdmVPYmplY3RzKHBEYXRhU2NvcGUsIHdzUmVmLCBycywgZEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBsYXRlTm9kZSk7Ci0gIGlmIChycy5kd0ZsYWdzID09IFhGQV9SRVNPTFZFTk9ERV9SU1RZUEVfQ3JlYXRlTm9kZUFsbCB8fAotICAgICAgcnMuZHdGbGFncyA9PSBYRkFfUkVTT0xWRU5PREVfUlNUWVBFX0NyZWF0ZU5vZGVNaWRBbGwgfHwKLSAgICAgIHJzLm5vZGVzLkdldFNpemUoKSA+IDEpIHsKLSAgICByZXR1cm4gcERvY3VtZW50LT5HZXROb3RCaW5kTm9kZShycy5ub2Rlcyk7CisgIHBEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5SZXNvbHZlT2JqZWN0cygKKyAgICAgIHBEYXRhU2NvcGUsIHdzUmVmLkFzU3RyaW5nVmlldygpLCAmcnMsIGRGbGFncywgcFRlbXBsYXRlTm9kZSk7CisgIGlmIChycy5kd0ZsYWdzID09IFhGQV9SZXNvbHZlTm9kZV9SU1R5cGVfQ3JlYXRlTm9kZUFsbCB8fAorICAgICAgcnMuZHdGbGFncyA9PSBYRkFfUmVzb2x2ZU5vZGVfUlNUeXBlX0NyZWF0ZU5vZGVNaWRBbGwgfHwKKyAgICAgIHJzLm9iamVjdHMuc2l6ZSgpID4gMSkgeworICAgIHJldHVybiBwRG9jdW1lbnQtPkdldE5vdEJpbmROb2RlKHJzLm9iamVjdHMpOwogICB9CiAKLSAgaWYgKHJzLmR3RmxhZ3MgPT0gWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlT25lKSB7Ci0gICAgQ1hGQV9PYmplY3QqIHBPYmplY3QgPSAocnMubm9kZXMuR2V0U2l6ZSgpID4gMCkgPyBycy5ub2Rlc1swXSA6IG51bGxwdHI7CisgIGlmIChycy5kd0ZsYWdzID09IFhGQV9SZXNvbHZlTm9kZV9SU1R5cGVfQ3JlYXRlTm9kZU9uZSkgeworICAgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0gIXJzLm9iamVjdHMuZW1wdHkoKSA/IHJzLm9iamVjdHMuZnJvbnQoKSA6IG51bGxwdHI7CiAgICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IFRvTm9kZShwT2JqZWN0KTsKICAgICByZXR1cm4gKGJGb3JjZUJpbmQgfHwgIXBOb2RlIHx8ICFwTm9kZS0+SGFzQmluZEl0ZW0oKSkgPyBwTm9kZSA6IG51bGxwdHI7CiAgIH0KQEAgLTQ5Miw0NiArNTE3LDQ3IEBACiBDWEZBX05vZGUqIENsb25lT3JNZXJnZUluc3RhbmNlTWFuYWdlcihDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBGb3JtUGFyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlQXJyYXkmIHN1YmZvcm1zKSB7Ci0gIENGWF9XaWRlU3RyaW5nQyB3c1N1YmZvcm1OYW1lID0gcFRlbXBsYXRlTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NJbnN0TWdyTm9kZU5hbWUgPSBMIl8iICsgd3NTdWJmb3JtTmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+KiBzdWJmb3JtcykgeworICBXaWRlU3RyaW5nIHdzU3ViZm9ybU5hbWUgPQorICAgICAgcFRlbXBsYXRlTm9kZS0+SlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6TmFtZSk7CisgIFdpZGVTdHJpbmcgd3NJbnN0TWdyTm9kZU5hbWUgPSBMIl8iICsgd3NTdWJmb3JtTmFtZTsKICAgdWludDMyX3QgZHdJbnN0TmFtZUhhc2ggPQotICAgICAgRlhfSGFzaENvZGVfR2V0Vyh3c0luc3RNZ3JOb2RlTmFtZS5Bc1N0cmluZ0MoKSwgZmFsc2UpOworICAgICAgRlhfSGFzaENvZGVfR2V0Vyh3c0luc3RNZ3JOb2RlTmFtZS5Bc1N0cmluZ1ZpZXcoKSwgZmFsc2UpOwogICBDWEZBX05vZGUqIHBFeGlzdGluZ05vZGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmRGb3JtRE9NSW5zdGFuY2UoCiAgICAgICBwRG9jdW1lbnQsIFhGQV9FbGVtZW50OjpJbnN0YW5jZU1hbmFnZXIsIGR3SW5zdE5hbWVIYXNoLCBwRm9ybVBhcmVudCk7CiAgIGlmIChwRXhpc3RpbmdOb2RlKSB7CiAgICAgdWludDMyX3QgZHdOYW1lSGFzaCA9IHBUZW1wbGF0ZU5vZGUtPkdldE5hbWVIYXNoKCk7Ci0gICAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0KLSAgICAgICAgICAgICBwRXhpc3RpbmdOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOwotICAgICAgICAgcE5vZGU7KSB7CisgICAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gcEV4aXN0aW5nTm9kZS0+R2V0TmV4dFNpYmxpbmcoKTsgcE5vZGU7KSB7CiAgICAgICBYRkFfRWxlbWVudCBlQ3VyVHlwZSA9IHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpOwogICAgICAgaWYgKGVDdXJUeXBlID09IFhGQV9FbGVtZW50OjpJbnN0YW5jZU1hbmFnZXIpCiAgICAgICAgIGJyZWFrOwogCiAgICAgICBpZiAoKGVDdXJUeXBlICE9IFhGQV9FbGVtZW50OjpTdWJmb3JtKSAmJgogICAgICAgICAgIChlQ3VyVHlwZSAhPSBYRkFfRWxlbWVudDo6U3ViZm9ybVNldCkpIHsKLSAgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsKKyAgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0TmV4dFNpYmxpbmcoKTsKICAgICAgICAgY29udGludWU7CiAgICAgICB9CiAgICAgICBpZiAoZHdOYW1lSGFzaCAhPSBwTm9kZS0+R2V0TmFtZUhhc2goKSkKICAgICAgICAgYnJlYWs7CiAKLSAgICAgIENYRkFfTm9kZSogcE5leHROb2RlID0gcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7Ci0gICAgICBwRm9ybVBhcmVudC0+UmVtb3ZlQ2hpbGQocE5vZGUpOwotICAgICAgc3ViZm9ybXMuQWRkKHBOb2RlKTsKKyAgICAgIENYRkFfTm9kZSogcE5leHROb2RlID0gcE5vZGUtPkdldE5leHRTaWJsaW5nKCk7CisgICAgICBwRm9ybVBhcmVudC0+UmVtb3ZlQ2hpbGQocE5vZGUsIHRydWUpOworICAgICAgc3ViZm9ybXMtPnB1c2hfYmFjayhwTm9kZSk7CiAgICAgICBwTm9kZSA9IHBOZXh0Tm9kZTsKICAgICB9Ci0gICAgcEZvcm1QYXJlbnQtPlJlbW92ZUNoaWxkKHBFeGlzdGluZ05vZGUpOwotICAgIHBGb3JtUGFyZW50LT5JbnNlcnRDaGlsZChwRXhpc3RpbmdOb2RlKTsKKyAgICBwRm9ybVBhcmVudC0+UmVtb3ZlQ2hpbGQocEV4aXN0aW5nTm9kZSwgdHJ1ZSk7CisgICAgcEZvcm1QYXJlbnQtPkluc2VydENoaWxkKHBFeGlzdGluZ05vZGUsIG51bGxwdHIpOwogICAgIHBFeGlzdGluZ05vZGUtPkNsZWFyRmxhZyhYRkFfTm9kZUZsYWdfVW51c2VkTm9kZSk7CiAgICAgcEV4aXN0aW5nTm9kZS0+U2V0VGVtcGxhdGVOb2RlKHBUZW1wbGF0ZU5vZGUpOwogICAgIHJldHVybiBwRXhpc3RpbmdOb2RlOwogICB9CiAKICAgQ1hGQV9Ob2RlKiBwTmV3Tm9kZSA9Ci0gICAgICBwRG9jdW1lbnQtPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9Gb3JtLCBYRkFfRWxlbWVudDo6SW5zdGFuY2VNYW5hZ2VyKTsKLSAgd3NJbnN0TWdyTm9kZU5hbWUgPSBMIl8iICsgcFRlbXBsYXRlTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsKLSAgcE5ld05vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NJbnN0TWdyTm9kZU5hbWUpOworICAgICAgcERvY3VtZW50LT5DcmVhdGVOb2RlKFhGQV9QYWNrZXRUeXBlOjpGb3JtLCBYRkFfRWxlbWVudDo6SW5zdGFuY2VNYW5hZ2VyKTsKKyAgd3NJbnN0TWdyTm9kZU5hbWUgPQorICAgICAgTCJfIiArIHBUZW1wbGF0ZU5vZGUtPkpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6Ok5hbWUpOworICBwTmV3Tm9kZS0+SlNPYmplY3QoKS0+U2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6TmFtZSwgd3NJbnN0TWdyTm9kZU5hbWUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwogICBwRm9ybVBhcmVudC0+SW5zZXJ0Q2hpbGQocE5ld05vZGUsIG51bGxwdHIpOwogICBwTmV3Tm9kZS0+U2V0VGVtcGxhdGVOb2RlKHBUZW1wbGF0ZU5vZGUpOwogICByZXR1cm4gcE5ld05vZGU7CkBAIC01NDcsMTggKzU3MywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQUNvbnRhaW5lck5vZGU+KgogICAgICAgICBwSXRlcmF0b3IsCiAgICAgYm9vbCYgYlNlbGZNYXRjaCwKLSAgICBYRkFfQVRUUklCVVRFRU5VTSYgZUJpbmRNYXRjaCwKKyAgICBYRkFfQXR0cmlidXRlRW51bSYgZUJpbmRNYXRjaCwKICAgICBib29sIGJVcExldmVsKSB7Ci0gIGJvb2wgYk93bkl0ZXJhdG9yID0gZmFsc2U7Ci0gIGlmICghcEl0ZXJhdG9yKSB7Ci0gICAgYk93bkl0ZXJhdG9yID0gdHJ1ZTsKLSAgICBwSXRlcmF0b3IgPSBuZXcgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTwKLSAgICAgICAgQ1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZT4ocFRlbXBsYXRlTm9kZSk7Ci0gIH0KLQogICBDWEZBX05vZGUqIHBSZXN1bHQgPSBudWxscHRyOwotICBmb3IgKENYRkFfTm9kZSogcEN1clRlbXBsYXRlTm9kZSA9IHBJdGVyYXRvci0+R2V0Q3VycmVudCgpOwotICAgICAgIHBDdXJUZW1wbGF0ZU5vZGU7KSB7CisgIENYRkFfTm9kZSogcEN1clRlbXBsYXRlTm9kZSA9IHBJdGVyYXRvci0+R2V0Q3VycmVudCgpOworICB3aGlsZSAocEN1clRlbXBsYXRlTm9kZSkgewogICAgIFhGQV9FbGVtZW50IGVNYXRjaE5vZGVUeXBlOwogICAgIHN3aXRjaCAocEN1clRlbXBsYXRlTm9kZS0+R2V0RWxlbWVudFR5cGUoKSkgewogICAgICAgY2FzZSBYRkFfRWxlbWVudDo6U3ViZm9ybToKQEAgLTU3NiwyNiArNTk1LDMyIEBACiAgICAgICAgIHBDdXJUZW1wbGF0ZU5vZGUgPSBwSXRlcmF0b3ItPk1vdmVUb05leHQoKTsKICAgICAgICAgY29udGludWU7CiAgICAgfQotICAgIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZU9jY3VyID0KLSAgICAgICAgcEN1clRlbXBsYXRlTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VsZW1lbnQ6Ok9jY3VyKTsKLSAgICBpbnQzMl90IGlNaW4sIGlNYXgsIGlJbml0OwotICAgIGlmIChwVGVtcGxhdGVOb2RlT2NjdXIgJiYKLSAgICAgICAgR2V0T2NjdXJJbmZvKHBUZW1wbGF0ZU5vZGVPY2N1ciwgaU1pbiwgaU1heCwgaUluaXQpICYmIGlNYXggPT0gMCkgewotICAgICAgcEN1clRlbXBsYXRlTm9kZSA9IHBJdGVyYXRvci0+TW92ZVRvTmV4dCgpOwotICAgICAgY29udGludWU7Ci0gICAgfQogCi0gICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlQmluZCA9Ci0gICAgICAgIHBDdXJUZW1wbGF0ZU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpCaW5kKTsKLSAgICBYRkFfQVRUUklCVVRFRU5VTSBlTWF0Y2ggPQotICAgICAgICBwVGVtcGxhdGVOb2RlQmluZCA/IHBUZW1wbGF0ZU5vZGVCaW5kLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTWF0Y2gpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDogWEZBX0FUVFJJQlVURUVOVU1fT25jZTsKLSAgICBlQmluZE1hdGNoID0gZU1hdGNoOwotICAgIHN3aXRjaCAoZU1hdGNoKSB7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX05vbmU6CisgICAgQ1hGQV9PY2N1ciogcFRlbXBsYXRlTm9kZU9jY3VyID0KKyAgICAgICAgcEN1clRlbXBsYXRlTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9PY2N1cj4oWEZBX0VsZW1lbnQ6Ok9jY3VyKTsKKyAgICBpZiAocFRlbXBsYXRlTm9kZU9jY3VyKSB7CisgICAgICBpbnQzMl90IGlNaW47CisgICAgICBpbnQzMl90IGlNYXg7CisgICAgICBpbnQzMl90IGlJbml0OworICAgICAgc3RkOjp0aWUoaU1pbiwgaU1heCwgaUluaXQpID0gcFRlbXBsYXRlTm9kZU9jY3VyLT5HZXRPY2N1ckluZm8oKTsKKyAgICAgIGlmIChpTWF4ID09IDApIHsKICAgICAgICAgcEN1clRlbXBsYXRlTm9kZSA9IHBJdGVyYXRvci0+TW92ZVRvTmV4dCgpOwogICAgICAgICBjb250aW51ZTsKLSAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fR2xvYmFsOgorICAgICAgfQorICAgIH0KKworICAgIENYRkFfQmluZCogcFRlbXBsYXRlTm9kZUJpbmQgPQorICAgICAgICBwQ3VyVGVtcGxhdGVOb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX0JpbmQ+KFhGQV9FbGVtZW50OjpCaW5kKTsKKyAgICBYRkFfQXR0cmlidXRlRW51bSBlTWF0Y2ggPQorICAgICAgICBwVGVtcGxhdGVOb2RlQmluZAorICAgICAgICAgICAgPyBwVGVtcGxhdGVOb2RlQmluZC0+SlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpNYXRjaCkKKyAgICAgICAgICAgIDogWEZBX0F0dHJpYnV0ZUVudW06Ok9uY2U7CisgICAgZUJpbmRNYXRjaCA9IGVNYXRjaDsKKyAgICBzd2l0Y2ggKGVNYXRjaCkgeworICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6Tm9uZToKKyAgICAgICAgcEN1clRlbXBsYXRlTm9kZSA9IHBJdGVyYXRvci0+TW92ZVRvTmV4dCgpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06Okdsb2JhbDoKICAgICAgICAgYkFjY2Vzc2VkRGF0YURPTSA9IHRydWU7CiAgICAgICAgIGlmICghYkZvcmNlQmluZCkgewogICAgICAgICAgIHBDdXJUZW1wbGF0ZU5vZGUgPSBwSXRlcmF0b3ItPk1vdmVUb05leHQoKTsKQEAgLTYwNSw3ICs2MzAsOCBAQAogICAgICAgICAgICAgKGVNYXRjaE5vZGVUeXBlID09IFhGQV9FbGVtZW50OjpEYXRhR3JvdXAgJiYKICAgICAgICAgICAgICBYRkFfRmllbGRJc011bHRpTGlzdEJveChwVGVtcGxhdGVOb2RlQmluZCkpKSB7CiAgICAgICAgICAgQ1hGQV9Ob2RlKiBwR2xvYmFsQmluZE5vZGUgPSBGaW5kR2xvYmFsRGF0YU5vZGUoCi0gICAgICAgICAgICAgIHBEb2N1bWVudCwgcEN1clRlbXBsYXRlTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKSwKKyAgICAgICAgICAgICAgcERvY3VtZW50LAorICAgICAgICAgICAgICBwQ3VyVGVtcGxhdGVOb2RlLT5KU09iamVjdCgpLT5HZXRDRGF0YShYRkFfQXR0cmlidXRlOjpOYW1lKSwKICAgICAgICAgICAgICAgcERhdGFTY29wZSwgZU1hdGNoTm9kZVR5cGUpOwogICAgICAgICAgIGlmICghcEdsb2JhbEJpbmROb2RlKSB7CiAgICAgICAgICAgICBwQ3VyVGVtcGxhdGVOb2RlID0gcEl0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7CkBAIC02MTQsMTAgKzY0MCwxMSBAQAogICAgICAgICAgIHBSZXN1bHQgPSBwR2xvYmFsQmluZE5vZGU7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fT25jZTogeworICAgICAgY2FzZSBYRkFfQXR0cmlidXRlRW51bTo6T25jZTogewogICAgICAgICBiQWNjZXNzZWREYXRhRE9NID0gdHJ1ZTsKICAgICAgICAgQ1hGQV9Ob2RlKiBwT25jZUJpbmROb2RlID0gRmluZE9uY2VEYXRhTm9kZSgKLSAgICAgICAgICAgIHBEb2N1bWVudCwgcEN1clRlbXBsYXRlTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKSwKKyAgICAgICAgICAgIHBEb2N1bWVudCwKKyAgICAgICAgICAgIHBDdXJUZW1wbGF0ZU5vZGUtPkpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6Ok5hbWUpLAogICAgICAgICAgICAgcERhdGFTY29wZSwgZU1hdGNoTm9kZVR5cGUpOwogICAgICAgICBpZiAoIXBPbmNlQmluZE5vZGUpIHsKICAgICAgICAgICBwQ3VyVGVtcGxhdGVOb2RlID0gcEl0ZXJhdG9yLT5Nb3ZlVG9OZXh0KCk7CkBAIC02MjYsMTAgKzY1MywxMSBAQAogICAgICAgICBwUmVzdWx0ID0gcE9uY2VCaW5kTm9kZTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0RhdGFSZWY6IHsKKyAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkRhdGFSZWY6IHsKICAgICAgICAgYkFjY2Vzc2VkRGF0YURPTSA9IHRydWU7CiAgICAgICAgIENYRkFfTm9kZSogcERhdGFSZWZCaW5kTm9kZSA9IEZpbmREYXRhUmVmRGF0YU5vZGUoCi0gICAgICAgICAgICBwRG9jdW1lbnQsIHBUZW1wbGF0ZU5vZGVCaW5kLT5HZXRDRGF0YShYRkFfQVRUUklCVVRFX1JlZiksCisgICAgICAgICAgICBwRG9jdW1lbnQsCisgICAgICAgICAgICBwVGVtcGxhdGVOb2RlQmluZC0+SlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6UmVmKSwKICAgICAgICAgICAgIHBEYXRhU2NvcGUsIGVNYXRjaE5vZGVUeXBlLCBwVGVtcGxhdGVOb2RlLCBiRm9yY2VCaW5kLCBiVXBMZXZlbCk7CiAgICAgICAgIGlmIChwRGF0YVJlZkJpbmROb2RlICYmCiAgICAgICAgICAgICBwRGF0YVJlZkJpbmROb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IGVNYXRjaE5vZGVUeXBlKSB7CkBAIC02NDgsNDQgKzY3NiwzNCBAQAogICAgICAgYlNlbGZNYXRjaCA9IHRydWU7CiAgICAgYnJlYWs7CiAgIH0KLSAgaWYgKGJPd25JdGVyYXRvcikKLSAgICBkZWxldGUgcEl0ZXJhdG9yOwogICByZXR1cm4gcFJlc3VsdDsKIH0KIAotdm9pZCBTb3J0UmVjdXJzZVJlY29yZChDRlhfQXJyYXlUZW1wbGF0ZTxSZWN1cnNlUmVjb3JkPiYgcmdSZWNvcmRzLAordm9pZCBTb3J0UmVjdXJzZVJlY29yZChzdGQ6OnZlY3RvcjxSZWN1cnNlUmVjb3JkPiogcmdSZWNvcmRzLAogICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhU2NvcGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNob2ljZU1vZGUpIHsKLSAgaW50MzJfdCBpQ291bnQgPSByZ1JlY29yZHMuR2V0U2l6ZSgpOwotICBDRlhfQXJyYXlUZW1wbGF0ZTxSZWN1cnNlUmVjb3JkPiByZ1Jlc3VsdFJlY29yZDsKLSAgZm9yIChDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwRGF0YVNjb3BlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gICAgICAgcENoaWxkTm9kZTsKLSAgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgewotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7Ci0gICAgICBDWEZBX05vZGUqIHBOb2RlID0gcmdSZWNvcmRzW2ldLnBEYXRhQ2hpbGQ7Ci0gICAgICBpZiAocENoaWxkTm9kZSA9PSBwTm9kZSkgewotICAgICAgICBSZWN1cnNlUmVjb3JkIHNOZXdSZWNvcmQgPSB7cmdSZWNvcmRzW2ldLnBUZW1wbGF0ZUNoaWxkLCBwTm9kZX07Ci0gICAgICAgIHJnUmVzdWx0UmVjb3JkLkFkZChzTmV3UmVjb3JkKTsKLSAgICAgICAgcmdSZWNvcmRzLlJlbW92ZUF0KGkpOwotICAgICAgICBpQ291bnQtLTsKKyAgc3RkOjp2ZWN0b3I8UmVjdXJzZVJlY29yZD4gcmdSZXN1bHRSZWNvcmQ7CisgIGZvciAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHBEYXRhU2NvcGUtPkdldEZpcnN0Q2hpbGQoKTsgcE5vZGU7CisgICAgICAgcE5vZGUgPSBwTm9kZS0+R2V0TmV4dFNpYmxpbmcoKSkgeworICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYocmdSZWNvcmRzLT5iZWdpbigpLCByZ1JlY29yZHMtPmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BOb2RlXShjb25zdCBSZWN1cnNlUmVjb3JkJiByZWNvcmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBOb2RlID09IHJlY29yZC5wRGF0YUNoaWxkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgaWYgKGl0ICE9IHJnUmVjb3Jkcy0+ZW5kKCkpIHsKKyAgICAgIHJnUmVzdWx0UmVjb3JkLnB1c2hfYmFjaygqaXQpOworICAgICAgcmdSZWNvcmRzLT5lcmFzZShpdCk7CisgICAgICBpZiAoYkNob2ljZU1vZGUpCiAgICAgICAgIGJyZWFrOwotICAgICAgfQogICAgIH0KLSAgICBpZiAoYkNob2ljZU1vZGUgJiYgcmdSZXN1bHRSZWNvcmQuR2V0U2l6ZSgpID4gMCkKLSAgICAgIGJyZWFrOwogICB9CisgIGlmIChyZ1Jlc3VsdFJlY29yZC5lbXB0eSgpKQorICAgIHJldHVybjsKIAotICBpZiAocmdSZXN1bHRSZWNvcmQuR2V0U2l6ZSgpID4gMCkgewotICAgIGlmICghYkNob2ljZU1vZGUpIHsKLSAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGlDb3VudDsgaSsrKSB7Ci0gICAgICAgIFJlY3Vyc2VSZWNvcmQgc05ld1JlY29yZCA9IHtyZ1JlY29yZHNbaV0ucFRlbXBsYXRlQ2hpbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ1JlY29yZHNbaV0ucERhdGFDaGlsZH07Ci0gICAgICAgIHJnUmVzdWx0UmVjb3JkLkFkZChzTmV3UmVjb3JkKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmdSZWNvcmRzLlJlbW92ZUFsbCgpOwotICAgIHJnUmVjb3Jkcy5Db3B5KHJnUmVzdWx0UmVjb3JkKTsKKyAgaWYgKCFiQ2hvaWNlTW9kZSkgeworICAgIHJnUmVzdWx0UmVjb3JkLmluc2VydChyZ1Jlc3VsdFJlY29yZC5lbmQoKSwgcmdSZWNvcmRzLT5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZ1JlY29yZHMtPmVuZCgpKTsKICAgfQorICAqcmdSZWNvcmRzID0gcmdSZXN1bHRSZWNvcmQ7CiB9CiAKIENYRkFfTm9kZSogQ29weUNvbnRhaW5lcl9TdWJmb3JtU2V0KENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwKQEAgLTcwMCwyMiArNzE4LDI0IEBACiAgIGJvb2wgYlVzZUluc3RhbmNlTWFuYWdlciA9CiAgICAgICBwRm9ybVBhcmVudE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OkFyZWE7CiAgIENYRkFfTm9kZSogcEluc3RNZ3JOb2RlID0gbnVsbHB0cjsKLSAgQ1hGQV9Ob2RlQXJyYXkgc3ViZm9ybUFycmF5OwotICBDWEZBX05vZGVBcnJheSogcFNlYXJjaEFycmF5ID0gbnVsbHB0cjsKKyAgc3RkOjp2ZWN0b3I8Q1hGQV9Ob2RlKj4gc3ViZm9ybUFycmF5OworICBzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPiogcFNlYXJjaEFycmF5ID0gbnVsbHB0cjsKICAgaWYgKCFiT25lSW5zdGFuY2UgJiYKICAgICAgIChlVHlwZSA9PSBYRkFfRWxlbWVudDo6U3ViZm9ybVNldCB8fCBlVHlwZSA9PSBYRkFfRWxlbWVudDo6U3ViZm9ybSkpIHsKICAgICBwSW5zdE1nck5vZGUgPSBiVXNlSW5zdGFuY2VNYW5hZ2VyID8gQ2xvbmVPck1lcmdlSW5zdGFuY2VNYW5hZ2VyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERvY3VtZW50LCBwRm9ybVBhcmVudE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcGxhdGVOb2RlLCBzdWJmb3JtQXJyYXkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcGxhdGVOb2RlLCAmc3ViZm9ybUFycmF5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyOwotICAgIGlmIChDWEZBX05vZGUqIHBPY2N1clRlbXBsYXRlTm9kZSA9Ci0gICAgICAgICAgICBwVGVtcGxhdGVOb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRWxlbWVudDo6T2NjdXIpKSB7CisgICAgaWYgKENYRkFfT2NjdXIqIHBPY2N1clRlbXBsYXRlTm9kZSA9CisgICAgICAgICAgICBwVGVtcGxhdGVOb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX09jY3VyPigKKyAgICAgICAgICAgICAgICBYRkFfRWxlbWVudDo6T2NjdXIpKSB7CiAgICAgICBwT2NjdXJOb2RlID0gcEluc3RNZ3JOb2RlID8gWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEb2N1bWVudCwgcEluc3RNZ3JOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT2NjdXJUZW1wbGF0ZU5vZGUsIGZhbHNlLCBudWxscHRyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBPY2N1clRlbXBsYXRlTm9kZTsKICAgICB9IGVsc2UgaWYgKHBJbnN0TWdyTm9kZSkgewotICAgICAgcE9jY3VyTm9kZSA9IHBJbnN0TWdyTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VsZW1lbnQ6Ok9jY3VyKTsKKyAgICAgIHBPY2N1ck5vZGUgPQorICAgICAgICAgIHBJbnN0TWdyTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9PY2N1cj4oWEZBX0VsZW1lbnQ6Ok9jY3VyKTsKICAgICAgIGlmIChwT2NjdXJOb2RlKQogICAgICAgICBwT2NjdXJOb2RlLT5DbGVhckZsYWcoWEZBX05vZGVGbGFnX1VudXNlZE5vZGUpOwogICAgIH0KQEAgLTcyNCwxMCArNzQ0LDkgQEAKICAgICAgIHBTZWFyY2hBcnJheSA9ICZzdWJmb3JtQXJyYXk7CiAgICAgICBpZiAocEZvcm1QYXJlbnROb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpQYWdlQXJlYSkgewogICAgICAgICBiT25lSW5zdGFuY2UgPSB0cnVlOwotICAgICAgICBpZiAoc3ViZm9ybUFycmF5LkdldFNpemUoKSA8IDEpCisgICAgICAgIGlmIChzdWJmb3JtQXJyYXkuZW1wdHkoKSkKICAgICAgICAgICBwU2VhcmNoQXJyYXkgPSBudWxscHRyOwotICAgICAgfSBlbHNlIGlmICgocFRlbXBsYXRlTm9kZS0+R2V0TmFtZUhhc2goKSA9PSAwKSAmJgotICAgICAgICAgICAgICAgICAoc3ViZm9ybUFycmF5LkdldFNpemUoKSA8IDEpKSB7CisgICAgICB9IGVsc2UgaWYgKHBUZW1wbGF0ZU5vZGUtPkdldE5hbWVIYXNoKCkgPT0gMCAmJiBzdWJmb3JtQXJyYXkuZW1wdHkoKSkgewogICAgICAgICBwU2VhcmNoQXJyYXkgPSBudWxscHRyOwogICAgICAgfQogICAgIH0KQEAgLTczNiwxNSArNzU1LDE3IEBACiAgIGludDMyX3QgaU1heCA9IDE7CiAgIGludDMyX3QgaUluaXQgPSAxOwogICBpbnQzMl90IGlNaW4gPSAxOwotICBpZiAoIWJPbmVJbnN0YW5jZSkKLSAgICBHZXRPY2N1ckluZm8ocE9jY3VyTm9kZSwgaU1pbiwgaU1heCwgaUluaXQpOworICBpZiAoIWJPbmVJbnN0YW5jZSAmJiBwT2NjdXJOb2RlKSB7CisgICAgc3RkOjp0aWUoaU1pbiwgaU1heCwgaUluaXQpID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9PY2N1cio+KHBPY2N1ck5vZGUpLT5HZXRPY2N1ckluZm8oKTsKKyAgfQogCi0gIFhGQV9BVFRSSUJVVEVFTlVNIGVSZWxhdGlvbiA9CisgIFhGQV9BdHRyaWJ1dGVFbnVtIGVSZWxhdGlvbiA9CiAgICAgICBlVHlwZSA9PSBYRkFfRWxlbWVudDo6U3ViZm9ybVNldAotICAgICAgICAgID8gcFRlbXBsYXRlTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX1JlbGF0aW9uKQotICAgICAgICAgIDogWEZBX0FUVFJJQlVURUVOVU1fT3JkZXJlZDsKKyAgICAgICAgICA/IHBUZW1wbGF0ZU5vZGUtPkpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6UmVsYXRpb24pCisgICAgICAgICAgOiBYRkFfQXR0cmlidXRlRW51bTo6T3JkZXJlZDsKICAgaW50MzJfdCBpQ3VyUmVwZWF0SW5kZXggPSAwOwotICBYRkFfQVRUUklCVVRFRU5VTSBlUGFyZW50QmluZE1hdGNoID0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsKKyAgWEZBX0F0dHJpYnV0ZUVudW0gZVBhcmVudEJpbmRNYXRjaCA9IFhGQV9BdHRyaWJ1dGVFbnVtOjpOb25lOwogICBpZiAoYkRhdGFNZXJnZSkgewogICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZT4KICAgICAgICAgc05vZGVJdGVyYXRvcihwVGVtcGxhdGVOb2RlKTsKQEAgLTc1MywxMCArNzc0LDEwIEBACiAgICAgICBzTm9kZUl0ZXJhdG9yLk1vdmVUb05leHQoKTsKICAgICB9IGVsc2UgewogICAgICAgc3RkOjptYXA8Q1hGQV9Ob2RlKiwgQ1hGQV9Ob2RlKj4gc3ViZm9ybU1hcEFycmF5OwotICAgICAgQ1hGQV9Ob2RlQXJyYXkgbm9kZUFycmF5OworICAgICAgc3RkOjp2ZWN0b3I8Q1hGQV9Ob2RlKj4gbm9kZUFycmF5OwogICAgICAgZm9yICg7IGlNYXggPCAwIHx8IGlDdXJSZXBlYXRJbmRleCA8IGlNYXg7IGlDdXJSZXBlYXRJbmRleCsrKSB7CiAgICAgICAgIGJvb2wgYlNlbGZNYXRjaCA9IGZhbHNlOwotICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlQmluZE1hdGNoID0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsKKyAgICAgICAgWEZBX0F0dHJpYnV0ZUVudW0gZUJpbmRNYXRjaCA9IFhGQV9BdHRyaWJ1dGVFbnVtOjpOb25lOwogICAgICAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IEZpbmRNYXRjaGluZ0RhdGFOb2RlKAogICAgICAgICAgICAgcERvY3VtZW50LCBwVGVtcGxhdGVOb2RlLCBwRGF0YVNjb3BlLCBiQWNjZXNzZWREYXRhRE9NLCBmYWxzZSwKICAgICAgICAgICAgICZzTm9kZUl0ZXJhdG9yLCBiU2VsZk1hdGNoLCBlQmluZE1hdGNoLCB0cnVlKTsKQEAgLTc3MiwxOSArNzkzLDE3IEBACiAgICAgICAgIENyZWF0ZURhdGFCaW5kaW5nKHBTdWJmb3JtTm9kZSwgcERhdGFOb2RlLCB0cnVlKTsKICAgICAgICAgQVNTRVJUKHBTdWJmb3JtTm9kZSk7CiAgICAgICAgIHN1YmZvcm1NYXBBcnJheVtwU3ViZm9ybU5vZGVdID0gcERhdGFOb2RlOwotICAgICAgICBub2RlQXJyYXkuQWRkKHBTdWJmb3JtTm9kZSk7CisgICAgICAgIG5vZGVBcnJheS5wdXNoX2JhY2socFN1YmZvcm1Ob2RlKTsKICAgICAgIH0KIAotICAgICAgZm9yIChpbnQzMl90IGlJbmRleCA9IDA7IGlJbmRleCA8IG5vZGVBcnJheS5HZXRTaXplKCk7IGlJbmRleCsrKSB7Ci0gICAgICAgIENYRkFfTm9kZSogcFN1YmZvcm0gPSBub2RlQXJyYXlbaUluZGV4XTsKKyAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwU3ViZm9ybSA6IG5vZGVBcnJheSkgewogICAgICAgICBDWEZBX05vZGUqIHBEYXRhTm9kZSA9IG51bGxwdHI7CiAgICAgICAgIGF1dG8gaXQgPSBzdWJmb3JtTWFwQXJyYXkuZmluZChwU3ViZm9ybSk7CiAgICAgICAgIGlmIChpdCAhPSBzdWJmb3JtTWFwQXJyYXkuZW5kKCkpCiAgICAgICAgICAgcERhdGFOb2RlID0gaXQtPnNlY29uZDsKLSAgICAgICAgZm9yIChDWEZBX05vZGUqIHBUZW1wbGF0ZUNoaWxkID0KLSAgICAgICAgICAgICAgICAgcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkOyBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROb2RlSXRlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsKKyAgICAgICAgZm9yIChDWEZBX05vZGUqIHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlTm9kZS0+R2V0Rmlyc3RDaGlsZCgpOworICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkOworICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkdldE5leHRTaWJsaW5nKCkpIHsKICAgICAgICAgICBpZiAoTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZCwgYlVzZUluc3RhbmNlTWFuYWdlcikpIHsKICAgICAgICAgICAgIFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcFN1YmZvcm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcGxhdGVDaGlsZCwgdHJ1ZSwgbnVsbHB0cik7CkBAIC03OTksODAgKzgxOCw3OSBAQAogCiAgICAgZm9yICg7IGlNYXggPCAwIHx8IGlDdXJSZXBlYXRJbmRleCA8IGlNYXg7IGlDdXJSZXBlYXRJbmRleCsrKSB7CiAgICAgICBib29sIGJTZWxmTWF0Y2ggPSBmYWxzZTsKLSAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVCaW5kTWF0Y2ggPSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOworICAgICAgWEZBX0F0dHJpYnV0ZUVudW0gZUJpbmRNYXRjaCA9IFhGQV9BdHRyaWJ1dGVFbnVtOjpOb25lOwogICAgICAgaWYgKCFGaW5kTWF0Y2hpbmdEYXRhTm9kZShwRG9jdW1lbnQsIHBUZW1wbGF0ZU5vZGUsIHBEYXRhU2NvcGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJBY2Nlc3NlZERhdGFET00sIGZhbHNlLCAmc05vZGVJdGVyYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYlNlbGZNYXRjaCwgZUJpbmRNYXRjaCwgdHJ1ZSkpIHsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICBpZiAoZUJpbmRNYXRjaCA9PSBYRkFfQVRUUklCVVRFRU5VTV9EYXRhUmVmICYmCi0gICAgICAgICAgZVBhcmVudEJpbmRNYXRjaCA9PSBYRkFfQVRUUklCVVRFRU5VTV9EYXRhUmVmKSB7CisgICAgICBpZiAoZUJpbmRNYXRjaCA9PSBYRkFfQXR0cmlidXRlRW51bTo6RGF0YVJlZiAmJgorICAgICAgICAgIGVQYXJlbnRCaW5kTWF0Y2ggPT0gWEZBX0F0dHJpYnV0ZUVudW06OkRhdGFSZWYpIHsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAKLSAgICAgIGlmIChlUmVsYXRpb24gPT0gWEZBX0FUVFJJQlVURUVOVU1fQ2hvaWNlIHx8Ci0gICAgICAgICAgZVJlbGF0aW9uID09IFhGQV9BVFRSSUJVVEVFTlVNX1Vub3JkZXJlZCkgeworICAgICAgaWYgKGVSZWxhdGlvbiA9PSBYRkFfQXR0cmlidXRlRW51bTo6Q2hvaWNlIHx8CisgICAgICAgICAgZVJlbGF0aW9uID09IFhGQV9BdHRyaWJ1dGVFbnVtOjpVbm9yZGVyZWQpIHsKICAgICAgICAgQ1hGQV9Ob2RlKiBwU3ViZm9ybVNldE5vZGUgPSBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcigKICAgICAgICAgICAgIHBEb2N1bWVudCwgcEZvcm1QYXJlbnROb2RlLCBwVGVtcGxhdGVOb2RlLCBmYWxzZSwgcFNlYXJjaEFycmF5KTsKICAgICAgICAgQVNTRVJUKHBTdWJmb3JtU2V0Tm9kZSk7CiAgICAgICAgIGlmICghcEZpcnN0SW5zdGFuY2UpCiAgICAgICAgICAgcEZpcnN0SW5zdGFuY2UgPSBwU3ViZm9ybVNldE5vZGU7CiAKLSAgICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8UmVjdXJzZVJlY29yZD4gcmdJdGVtTWF0Y2hMaXN0OwotICAgICAgICBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX05vZGUqPiByZ0l0ZW1Vbm1hdGNoTGlzdDsKLSAgICAgICAgZm9yIChDWEZBX05vZGUqIHBUZW1wbGF0ZUNoaWxkID0KLSAgICAgICAgICAgICAgICAgcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkOyBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROb2RlSXRlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8UmVjdXJzZVJlY29yZD4gcmdJdGVtTWF0Y2hMaXN0OworICAgICAgICBzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPiByZ0l0ZW1Vbm1hdGNoTGlzdDsKKyAgICAgICAgZm9yIChDWEZBX05vZGUqIHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlTm9kZS0+R2V0Rmlyc3RDaGlsZCgpOworICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkOworICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkdldE5leHRTaWJsaW5nKCkpIHsKICAgICAgICAgICBpZiAoTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZCwgYlVzZUluc3RhbmNlTWFuYWdlcikpIHsKICAgICAgICAgICAgIFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcFN1YmZvcm1TZXROb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBsYXRlQ2hpbGQsIHRydWUsIG51bGxwdHIpOwogICAgICAgICAgIH0gZWxzZSBpZiAocFRlbXBsYXRlQ2hpbGQtPklzQ29udGFpbmVyTm9kZSgpKSB7CiAgICAgICAgICAgICBiU2VsZk1hdGNoID0gZmFsc2U7Ci0gICAgICAgICAgICBlQmluZE1hdGNoID0gWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsKLSAgICAgICAgICAgIGlmIChlUmVsYXRpb24gIT0gWEZBX0FUVFJJQlVURUVOVU1fT3JkZXJlZCkgeworICAgICAgICAgICAgZUJpbmRNYXRjaCA9IFhGQV9BdHRyaWJ1dGVFbnVtOjpOb25lOworICAgICAgICAgICAgaWYgKGVSZWxhdGlvbiAhPSBYRkFfQXR0cmlidXRlRW51bTo6T3JkZXJlZCkgeworICAgICAgICAgICAgICBDWEZBX05vZGVJdGVyYXRvclRlbXBsYXRlPENYRkFfTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBQ29udGFpbmVyTm9kZT4KKyAgICAgICAgICAgICAgICAgIHNDaGlsZEl0ZXIocFRlbXBsYXRlQ2hpbGQpOwogICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhTWF0Y2ggPSBGaW5kTWF0Y2hpbmdEYXRhTm9kZSgKICAgICAgICAgICAgICAgICAgIHBEb2N1bWVudCwgcFRlbXBsYXRlQ2hpbGQsIHBEYXRhU2NvcGUsIGJBY2Nlc3NlZERhdGFET00sCi0gICAgICAgICAgICAgICAgICBmYWxzZSwgbnVsbHB0ciwgYlNlbGZNYXRjaCwgZUJpbmRNYXRjaCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICBmYWxzZSwgJnNDaGlsZEl0ZXIsIGJTZWxmTWF0Y2gsIGVCaW5kTWF0Y2gsIHRydWUpOwogICAgICAgICAgICAgICBpZiAocERhdGFNYXRjaCkgewogICAgICAgICAgICAgICAgIFJlY3Vyc2VSZWNvcmQgc05ld1JlY29yZCA9IHtwVGVtcGxhdGVDaGlsZCwgcERhdGFNYXRjaH07CiAgICAgICAgICAgICAgICAgaWYgKGJTZWxmTWF0Y2gpCi0gICAgICAgICAgICAgICAgICByZ0l0ZW1NYXRjaExpc3QuSW5zZXJ0QXQoMCwgc05ld1JlY29yZCk7CisgICAgICAgICAgICAgICAgICByZ0l0ZW1NYXRjaExpc3QuaW5zZXJ0KHJnSXRlbU1hdGNoTGlzdC5iZWdpbigpLCBzTmV3UmVjb3JkKTsKICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICByZ0l0ZW1NYXRjaExpc3QuQWRkKHNOZXdSZWNvcmQpOworICAgICAgICAgICAgICAgICAgcmdJdGVtTWF0Y2hMaXN0LnB1c2hfYmFjayhzTmV3UmVjb3JkKTsKICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZ0l0ZW1Vbm1hdGNoTGlzdC5BZGQocFRlbXBsYXRlQ2hpbGQpOworICAgICAgICAgICAgICAgIHJnSXRlbVVubWF0Y2hMaXN0LnB1c2hfYmFjayhwVGVtcGxhdGVDaGlsZCk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHJnSXRlbVVubWF0Y2hMaXN0LkFkZChwVGVtcGxhdGVDaGlsZCk7CisgICAgICAgICAgICAgIHJnSXRlbVVubWF0Y2hMaXN0LnB1c2hfYmFjayhwVGVtcGxhdGVDaGlsZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgc3dpdGNoIChlUmVsYXRpb24pIHsKLSAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0Nob2ljZTogewotICAgICAgICAgICAgQVNTRVJUKHJnSXRlbU1hdGNoTGlzdC5HZXRTaXplKCkpOwotICAgICAgICAgICAgU29ydFJlY3Vyc2VSZWNvcmQocmdJdGVtTWF0Y2hMaXN0LCBwRGF0YVNjb3BlLCB0cnVlKTsKKyAgICAgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpDaG9pY2U6IHsKKyAgICAgICAgICAgIEFTU0VSVCghcmdJdGVtTWF0Y2hMaXN0LmVtcHR5KCkpOworICAgICAgICAgICAgU29ydFJlY3Vyc2VSZWNvcmQoJnJnSXRlbU1hdGNoTGlzdCwgcERhdGFTY29wZSwgdHJ1ZSk7CiAgICAgICAgICAgICBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKAotICAgICAgICAgICAgICAgIHJnSXRlbU1hdGNoTGlzdFswXS5wVGVtcGxhdGVDaGlsZCwgcFN1YmZvcm1TZXROb2RlLCBwRGF0YVNjb3BlLAotICAgICAgICAgICAgICAgIGZhbHNlLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICByZ0l0ZW1NYXRjaExpc3QuZnJvbnQoKS5wVGVtcGxhdGVDaGlsZCwgcFN1YmZvcm1TZXROb2RlLAorICAgICAgICAgICAgICAgIHBEYXRhU2NvcGUsIGZhbHNlLCB0cnVlLCB0cnVlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1Vub3JkZXJlZDogewotICAgICAgICAgICAgaWYgKHJnSXRlbU1hdGNoTGlzdC5HZXRTaXplKCkpIHsKLSAgICAgICAgICAgICAgU29ydFJlY3Vyc2VSZWNvcmQocmdJdGVtTWF0Y2hMaXN0LCBwRGF0YVNjb3BlLCBmYWxzZSk7Ci0gICAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMCwgY291bnQgPSByZ0l0ZW1NYXRjaExpc3QuR2V0U2l6ZSgpOyBpIDwgY291bnQ7Ci0gICAgICAgICAgICAgICAgICAgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcigKLSAgICAgICAgICAgICAgICAgICAgcmdJdGVtTWF0Y2hMaXN0W2ldLnBUZW1wbGF0ZUNoaWxkLCBwU3ViZm9ybVNldE5vZGUsCi0gICAgICAgICAgICAgICAgICAgIHBEYXRhU2NvcGUsIGZhbHNlLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICBjYXNlIFhGQV9BdHRyaWJ1dGVFbnVtOjpVbm9yZGVyZWQ6IHsKKyAgICAgICAgICAgIGlmICghcmdJdGVtTWF0Y2hMaXN0LmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgU29ydFJlY3Vyc2VSZWNvcmQoJnJnSXRlbU1hdGNoTGlzdCwgcERhdGFTY29wZSwgZmFsc2UpOworICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG1hdGNoZWQgOiByZ0l0ZW1NYXRjaExpc3QpIHsKKyAgICAgICAgICAgICAgICBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKG1hdGNoZWQucFRlbXBsYXRlQ2hpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3ViZm9ybVNldE5vZGUsIHBEYXRhU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMCwgY291bnQgPSByZ0l0ZW1Vbm1hdGNoTGlzdC5HZXRTaXplKCk7IGkgPCBjb3VudDsKLSAgICAgICAgICAgICAgICAgaSsrKSB7Ci0gICAgICAgICAgICAgIHBEb2N1bWVudC0+RGF0YU1lcmdlX0NvcHlDb250YWluZXIocmdJdGVtVW5tYXRjaExpc3RbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN1YmZvcm1TZXROb2RlLCBwRGF0YVNjb3BlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgICAgIGZvciAoYXV0byogdW5tYXRjaGVkIDogcmdJdGVtVW5tYXRjaExpc3QpIHsKKyAgICAgICAgICAgICAgcERvY3VtZW50LT5EYXRhTWVyZ2VfQ29weUNvbnRhaW5lcih1bm1hdGNoZWQsIHBTdWJmb3JtU2V0Tm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGF0YVNjb3BlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICB9CkBAIC04ODYsMTAgKzkwNCw5IEBACiAgICAgICAgIGlmICghcEZpcnN0SW5zdGFuY2UpCiAgICAgICAgICAgcEZpcnN0SW5zdGFuY2UgPSBwU3ViZm9ybVNldE5vZGU7CiAKLSAgICAgICAgZm9yIChDWEZBX05vZGUqIHBUZW1wbGF0ZUNoaWxkID0KLSAgICAgICAgICAgICAgICAgcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkOyBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROb2RlSXRlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsKKyAgICAgICAgZm9yIChDWEZBX05vZGUqIHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlTm9kZS0+R2V0Rmlyc3RDaGlsZCgpOworICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkOworICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkdldE5leHRTaWJsaW5nKCkpIHsKICAgICAgICAgICBpZiAoTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZCwgYlVzZUluc3RhbmNlTWFuYWdlcikpIHsKICAgICAgICAgICAgIFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcFN1YmZvcm1TZXROb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBsYXRlQ2hpbGQsIHRydWUsIG51bGxwdHIpOwpAQCAtOTA0LDE0ICs5MjEsMTQgQEAKICAgICBpZiAoaUN1clJlcGVhdEluZGV4ID09IDAgJiYgYkFjY2Vzc2VkRGF0YURPTSA9PSBmYWxzZSkgewogICAgICAgaW50MzJfdCBpTGltaXQgPSBpTWF4OwogICAgICAgaWYgKHBJbnN0TWdyTm9kZSAmJiBwVGVtcGxhdGVOb2RlLT5HZXROYW1lSGFzaCgpID09IDApIHsKLSAgICAgICAgaUxpbWl0ID0gc3ViZm9ybUFycmF5LkdldFNpemUoKTsKKyAgICAgICAgaUxpbWl0ID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90PihzdWJmb3JtQXJyYXkpOwogICAgICAgICBpZiAoaUxpbWl0IDwgaU1pbikKICAgICAgICAgICBpTGltaXQgPSBpSW5pdDsKICAgICAgIH0KIAogICAgICAgZm9yICg7IChpTGltaXQgPCAwIHx8IGlDdXJSZXBlYXRJbmRleCA8IGlMaW1pdCk7IGlDdXJSZXBlYXRJbmRleCsrKSB7CiAgICAgICAgIGlmIChwSW5zdE1nck5vZGUpIHsKLSAgICAgICAgICBpZiAocFNlYXJjaEFycmF5ICYmIHBTZWFyY2hBcnJheS0+R2V0U2l6ZSgpIDwgMSkgeworICAgICAgICAgIGlmIChwU2VhcmNoQXJyYXkgJiYgcFNlYXJjaEFycmF5LT5lbXB0eSgpKSB7CiAgICAgICAgICAgICBpZiAocFRlbXBsYXRlTm9kZS0+R2V0TmFtZUhhc2goKSAhPSAwKQogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIHBTZWFyY2hBcnJheSA9IG51bGxwdHI7CkBAIC05MjcsMTAgKzk0NCw5IEBACiAgICAgICAgIGlmICghcEZpcnN0SW5zdGFuY2UpCiAgICAgICAgICAgcEZpcnN0SW5zdGFuY2UgPSBwU3ViZm9ybU5vZGU7CiAKLSAgICAgICAgZm9yIChDWEZBX05vZGUqIHBUZW1wbGF0ZUNoaWxkID0KLSAgICAgICAgICAgICAgICAgcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkOyBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROb2RlSXRlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9OT0RFSVRFTV9OZXh0U2libGluZykpIHsKKyAgICAgICAgZm9yIChDWEZBX05vZGUqIHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlTm9kZS0+R2V0Rmlyc3RDaGlsZCgpOworICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkOworICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkdldE5leHRTaWJsaW5nKCkpIHsKICAgICAgICAgICBpZiAoTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZCwgYlVzZUluc3RhbmNlTWFuYWdlcikpIHsKICAgICAgICAgICAgIFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcFN1YmZvcm1Ob2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBsYXRlQ2hpbGQsIHRydWUsIG51bGxwdHIpOwpAQCAtOTUyLDE1ICs5NjgsMTMgQEAKICAgICAgIHBGaXJzdEluc3RhbmNlID0gcFN1YmZvcm1TZXROb2RlOwogCiAgICAgYm9vbCBiRm91bmQgPSBmYWxzZTsKLSAgICBmb3IgKENYRkFfTm9kZSogcFRlbXBsYXRlQ2hpbGQgPQotICAgICAgICAgICAgIHBUZW1wbGF0ZU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsKLSAgICAgICAgIHBUZW1wbGF0ZUNoaWxkOyBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROb2RlSXRlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgeworICAgIGZvciAoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZU5vZGUtPkdldEZpcnN0Q2hpbGQoKTsKKyAgICAgICAgIHBUZW1wbGF0ZUNoaWxkOyBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROZXh0U2libGluZygpKSB7CiAgICAgICBpZiAoTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZCwgYlVzZUluc3RhbmNlTWFuYWdlcikpIHsKICAgICAgICAgWEZBX05vZGVNZXJnZV9DbG9uZU9yTWVyZ2VDb250YWluZXIocERvY3VtZW50LCBwU3ViZm9ybVNldE5vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkLCB0cnVlLCBudWxscHRyKTsKICAgICAgIH0gZWxzZSBpZiAocFRlbXBsYXRlQ2hpbGQtPklzQ29udGFpbmVyTm9kZSgpKSB7Ci0gICAgICAgIGlmIChiRm91bmQgJiYgZVJlbGF0aW9uID09IFhGQV9BVFRSSUJVVEVFTlVNX0Nob2ljZSkKKyAgICAgICAgaWYgKGJGb3VuZCAmJiBlUmVsYXRpb24gPT0gWEZBX0F0dHJpYnV0ZUVudW06OkNob2ljZSkKICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICBwRG9jdW1lbnQtPkRhdGFNZXJnZV9Db3B5Q29udGFpbmVyKHBUZW1wbGF0ZUNoaWxkLCBwU3ViZm9ybVNldE5vZGUsCkBAIC05ODEsMTAgKzk5NSw5IEBACiAgIENYRkFfTm9kZSogcEZpZWxkTm9kZSA9IFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKAogICAgICAgcERvY3VtZW50LCBwRm9ybU5vZGUsIHBUZW1wbGF0ZU5vZGUsIGZhbHNlLCBudWxscHRyKTsKICAgQVNTRVJUKHBGaWVsZE5vZGUpOwotICBmb3IgKENYRkFfTm9kZSogcFRlbXBsYXRlQ2hpbGROb2RlID0KLSAgICAgICAgICAgcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgIHBUZW1wbGF0ZUNoaWxkTm9kZTsgcFRlbXBsYXRlQ2hpbGROb2RlID0gcFRlbXBsYXRlQ2hpbGROb2RlLT5HZXROb2RlSXRlbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7CisgIGZvciAoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVDaGlsZE5vZGUgPSBwVGVtcGxhdGVOb2RlLT5HZXRGaXJzdENoaWxkKCk7CisgICAgICAgcFRlbXBsYXRlQ2hpbGROb2RlOworICAgICAgIHBUZW1wbGF0ZUNoaWxkTm9kZSA9IHBUZW1wbGF0ZUNoaWxkTm9kZS0+R2V0TmV4dFNpYmxpbmcoKSkgewogICAgIGlmIChOZWVkR2VuZXJhdGVGb3JtKHBUZW1wbGF0ZUNoaWxkTm9kZSwgdHJ1ZSkpIHsKICAgICAgIFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKHBEb2N1bWVudCwgcEZpZWxkTm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wbGF0ZUNoaWxkTm9kZSwgdHJ1ZSwgbnVsbHB0cik7CkBAIC05OTksMTAgKzEwMTIsMTIgQEAKICAgaWYgKGJEYXRhTWVyZ2UpIHsKICAgICBib29sIGJBY2Nlc3NlZERhdGFET00gPSBmYWxzZTsKICAgICBib29sIGJTZWxmTWF0Y2ggPSBmYWxzZTsKLSAgICBYRkFfQVRUUklCVVRFRU5VTSBlQmluZE1hdGNoOworICAgIFhGQV9BdHRyaWJ1dGVFbnVtIGVCaW5kTWF0Y2g7CisgICAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlPgorICAgICAgICBzTm9kZUl0ZXIocFRlbXBsYXRlTm9kZSk7CiAgICAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUgPSBGaW5kTWF0Y2hpbmdEYXRhTm9kZSgKLSAgICAgICAgcERvY3VtZW50LCBwVGVtcGxhdGVOb2RlLCBwRGF0YVNjb3BlLCBiQWNjZXNzZWREYXRhRE9NLCB0cnVlLCBudWxscHRyLAotICAgICAgICBiU2VsZk1hdGNoLCBlQmluZE1hdGNoLCBiVXBMZXZlbCk7CisgICAgICAgIHBEb2N1bWVudCwgcFRlbXBsYXRlTm9kZSwgcERhdGFTY29wZSwgYkFjY2Vzc2VkRGF0YURPTSwgdHJ1ZSwKKyAgICAgICAgJnNOb2RlSXRlciwgYlNlbGZNYXRjaCwgZUJpbmRNYXRjaCwgYlVwTGV2ZWwpOwogICAgIGlmIChwRGF0YU5vZGUpCiAgICAgICBDcmVhdGVEYXRhQmluZGluZyhwRmllbGROb2RlLCBwRGF0YU5vZGUsIHRydWUpOwogICB9IGVsc2UgewpAQCAtMTAxNCwxNyArMTAyOSwxNyBAQAogQ1hGQV9Ob2RlKiBNYXliZUNyZWF0ZURhdGFOb2RlKENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhUGFyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50IGVOb2RlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NOYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NOYW1lKSB7CiAgIGlmICghcERhdGFQYXJlbnQpCiAgICAgcmV0dXJuIG51bGxwdHI7CiAKICAgQ1hGQV9Ob2RlKiBwUGFyZW50REROb2RlID0gcERhdGFQYXJlbnQtPkdldERhdGFEZXNjcmlwdGlvbk5vZGUoKTsKICAgaWYgKCFwUGFyZW50REROb2RlKSB7CiAgICAgQ1hGQV9Ob2RlKiBwRGF0YU5vZGUgPQotICAgICAgICBwRG9jdW1lbnQtPkNyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgZU5vZGVUeXBlKTsKLSAgICBwRGF0YU5vZGUtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NOYW1lKTsKKyAgICAgICAgcERvY3VtZW50LT5DcmVhdGVOb2RlKFhGQV9QYWNrZXRUeXBlOjpEYXRhc2V0cywgZU5vZGVUeXBlKTsKKyAgICBwRGF0YU5vZGUtPkpTT2JqZWN0KCktPlNldENEYXRhKFhGQV9BdHRyaWJ1dGU6Ok5hbWUsIHdzTmFtZSwgZmFsc2UsIGZhbHNlKTsKICAgICBwRGF0YU5vZGUtPkNyZWF0ZVhNTE1hcHBpbmdOb2RlKCk7Ci0gICAgcERhdGFQYXJlbnQtPkluc2VydENoaWxkKHBEYXRhTm9kZSk7CisgICAgcERhdGFQYXJlbnQtPkluc2VydENoaWxkKHBEYXRhTm9kZSwgbnVsbHB0cik7CiAgICAgcERhdGFOb2RlLT5TZXRGbGFnKFhGQV9Ob2RlRmxhZ19Jbml0aWFsaXplZCwgZmFsc2UpOwogICAgIHJldHVybiBwRGF0YU5vZGU7CiAgIH0KQEAgLTEwMzcsMjggKzEwNTIsMjkgQEAKICAgICAgIGlmIChwRERHcm91cE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OkRhdGFHcm91cCkKICAgICAgICAgY29udGludWU7CiAKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzTmFtZXNwYWNlOwotICAgICAgaWYgKCFwRERHcm91cE5vZGUtPlRyeU5hbWVzcGFjZSh3c05hbWVzcGFjZSkgfHwKLSAgICAgICAgICB3c05hbWVzcGFjZSAhPSBMImh0dHA6Ly9ucy5hZG9iZS5jb20vZGF0YS1kZXNjcmlwdGlvbi8iKSB7CisgICAgICBPcHRpb25hbDxXaWRlU3RyaW5nPiBucyA9IHBEREdyb3VwTm9kZS0+SlNPYmplY3QoKS0+VHJ5TmFtZXNwYWNlKCk7CisgICAgICBpZiAoIW5zIHx8ICpucyAhPSBMImh0dHA6Ly9ucy5hZG9iZS5jb20vZGF0YS1kZXNjcmlwdGlvbi8iKQogICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KICAgICB9Ci0gICAgQ1hGQV9Ob2RlKiBwREROb2RlID0gcERER3JvdXBOb2RlLT5HZXRGaXJzdENoaWxkQnlOYW1lKHdzTmFtZS5Bc1N0cmluZ0MoKSk7CisKKyAgICBDWEZBX05vZGUqIHBERE5vZGUgPQorICAgICAgICBwRERHcm91cE5vZGUtPkdldEZpcnN0Q2hpbGRCeU5hbWUod3NOYW1lLkFzU3RyaW5nVmlldygpKTsKICAgICBpZiAoIXBERE5vZGUpCiAgICAgICBjb250aW51ZTsKICAgICBpZiAocERETm9kZS0+R2V0RWxlbWVudFR5cGUoKSAhPSBlTm9kZVR5cGUpCiAgICAgICBicmVhazsKIAogICAgIENYRkFfTm9kZSogcERhdGFOb2RlID0KLSAgICAgICAgcERvY3VtZW50LT5DcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIGVOb2RlVHlwZSk7Ci0gICAgcERhdGFOb2RlLT5TZXRDRGF0YShYRkFfQVRUUklCVVRFX05hbWUsIHdzTmFtZSk7CisgICAgICAgIHBEb2N1bWVudC0+Q3JlYXRlTm9kZShYRkFfUGFja2V0VHlwZTo6RGF0YXNldHMsIGVOb2RlVHlwZSk7CisgICAgcERhdGFOb2RlLT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpOYW1lLCB3c05hbWUsIGZhbHNlLCBmYWxzZSk7CiAgICAgcERhdGFOb2RlLT5DcmVhdGVYTUxNYXBwaW5nTm9kZSgpOwogICAgIGlmIChlTm9kZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OkRhdGFWYWx1ZSAmJgotICAgICAgICBwREROb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfQ29udGFpbnMpID09Ci0gICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTV9NZXRhRGF0YSkgewotICAgICAgcERhdGFOb2RlLT5TZXRFbnVtKFhGQV9BVFRSSUJVVEVfQ29udGFpbnMsIFhGQV9BVFRSSUJVVEVFTlVNX01ldGFEYXRhKTsKKyAgICAgICAgcERETm9kZS0+SlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpDb250YWlucykgPT0KKyAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpNZXRhRGF0YSkgeworICAgICAgcERhdGFOb2RlLT5KU09iamVjdCgpLT5TZXRFbnVtKFhGQV9BdHRyaWJ1dGU6OkNvbnRhaW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpNZXRhRGF0YSwgZmFsc2UpOwogICAgIH0KLSAgICBwRGF0YVBhcmVudC0+SW5zZXJ0Q2hpbGQocERhdGFOb2RlKTsKKyAgICBwRGF0YVBhcmVudC0+SW5zZXJ0Q2hpbGQocERhdGFOb2RlLCBudWxscHRyKTsKICAgICBwRGF0YU5vZGUtPlNldERhdGFEZXNjcmlwdGlvbk5vZGUocERETm9kZSk7CiAgICAgcERhdGFOb2RlLT5TZXRGbGFnKFhGQV9Ob2RlRmxhZ19Jbml0aWFsaXplZCwgZmFsc2UpOwogICAgIHJldHVybiBwRGF0YU5vZGU7CkBAIC0xMDc2LDMxICsxMDkyLDM0IEBACiAgIENYRkFfTm9kZSogcERhdGFOb2RlID0gcEZvcm1Ob2RlLT5HZXRCaW5kRGF0YSgpOwogICBpZiAoZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm0gfHwgZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OkV4Y2xHcm91cCB8fAogICAgICAgZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OkZpZWxkKSB7Ci0gICAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlID0gcEZvcm1Ob2RlLT5HZXRUZW1wbGF0ZU5vZGUoKTsKLSAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGVCaW5kID0KLSAgICAgICAgcFRlbXBsYXRlTm9kZSA/IHBUZW1wbGF0ZU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpCaW5kKQotICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cjsKLSAgICBYRkFfQVRUUklCVVRFRU5VTSBlTWF0Y2ggPQotICAgICAgICBwVGVtcGxhdGVOb2RlQmluZCA/IHBUZW1wbGF0ZU5vZGVCaW5kLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTWF0Y2gpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDogWEZBX0FUVFJJQlVURUVOVU1fT25jZTsKKyAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUgPSBwRm9ybU5vZGUtPkdldFRlbXBsYXRlTm9kZUlmRXhpc3RzKCk7CisgICAgQ1hGQV9CaW5kKiBwVGVtcGxhdGVOb2RlQmluZCA9CisgICAgICAgIHBUZW1wbGF0ZU5vZGUKKyAgICAgICAgICAgID8gcFRlbXBsYXRlTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9CaW5kPihYRkFfRWxlbWVudDo6QmluZCkKKyAgICAgICAgICAgIDogbnVsbHB0cjsKKyAgICBYRkFfQXR0cmlidXRlRW51bSBlTWF0Y2ggPQorICAgICAgICBwVGVtcGxhdGVOb2RlQmluZAorICAgICAgICAgICAgPyBwVGVtcGxhdGVOb2RlQmluZC0+SlNPYmplY3QoKS0+R2V0RW51bShYRkFfQXR0cmlidXRlOjpNYXRjaCkKKyAgICAgICAgICAgIDogWEZBX0F0dHJpYnV0ZUVudW06Ok9uY2U7CiAgICAgc3dpdGNoIChlTWF0Y2gpIHsKLSAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTm9uZToKKyAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06Ok5vbmU6CiAgICAgICAgIGlmICghYkRhdGFSZWYgfHwgYlBhcmVudERhdGFSZWYpCiAgICAgICAgICAgRm9ybVZhbHVlTm9kZV9NYXRjaE5vbmVDcmVhdGVDaGlsZChwRm9ybU5vZGUpOwogICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fT25jZToKKyAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06Ok9uY2U6CiAgICAgICAgIGlmICghYkRhdGFSZWYgfHwgYlBhcmVudERhdGFSZWYpIHsKICAgICAgICAgICBpZiAoIXBEYXRhTm9kZSkgewogICAgICAgICAgICAgaWYgKHBGb3JtTm9kZS0+R2V0TmFtZUhhc2goKSAhPSAwICYmCi0gICAgICAgICAgICAgICAgcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfU2NvcGUpICE9Ci0gICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNX05vbmUpIHsKKyAgICAgICAgICAgICAgICBwRm9ybU5vZGUtPkpTT2JqZWN0KCktPkdldEVudW0oWEZBX0F0dHJpYnV0ZTo6U2NvcGUpICE9CisgICAgICAgICAgICAgICAgICAgIFhGQV9BdHRyaWJ1dGVFbnVtOjpOb25lKSB7CiAgICAgICAgICAgICAgIFhGQV9FbGVtZW50IGVEYXRhTm9kZVR5cGUgPSAoZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm0gfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRmllbGRJc011bHRpTGlzdEJveChwRm9ybU5vZGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gWEZBX0VsZW1lbnQ6OkRhdGFHcm91cAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogWEZBX0VsZW1lbnQ6OkRhdGFWYWx1ZTsKICAgICAgICAgICAgICAgcERhdGFOb2RlID0gTWF5YmVDcmVhdGVEYXRhTm9kZSgKICAgICAgICAgICAgICAgICAgIHBEb2N1bWVudCwgcERhdGFTY29wZSwgZURhdGFOb2RlVHlwZSwKLSAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nKHBGb3JtTm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKSkpOworICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICBwRm9ybU5vZGUtPkpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6Ok5hbWUpKSk7CiAgICAgICAgICAgICAgIGlmIChwRGF0YU5vZGUpCiAgICAgICAgICAgICAgICAgQ3JlYXRlRGF0YUJpbmRpbmcocEZvcm1Ob2RlLCBwRGF0YU5vZGUsIGZhbHNlKTsKICAgICAgICAgICAgIH0KQEAgLTExMDgsMTcgKzExMjcsMTYgQEAKICAgICAgICAgICAgICAgRm9ybVZhbHVlTm9kZV9NYXRjaE5vbmVDcmVhdGVDaGlsZChwRm9ybU5vZGUpOwogCiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIENYRkFfTm9kZSogcERhdGFQYXJlbnQgPQotICAgICAgICAgICAgICAgIHBEYXRhTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7CisgICAgICAgICAgICBDWEZBX05vZGUqIHBEYXRhUGFyZW50ID0gcERhdGFOb2RlLT5HZXRQYXJlbnQoKTsKICAgICAgICAgICAgIGlmIChwRGF0YVBhcmVudCAhPSBwRGF0YVNjb3BlKSB7CiAgICAgICAgICAgICAgIEFTU0VSVChwRGF0YVBhcmVudCk7Ci0gICAgICAgICAgICAgIHBEYXRhUGFyZW50LT5SZW1vdmVDaGlsZChwRGF0YU5vZGUpOwotICAgICAgICAgICAgICBwRGF0YVNjb3BlLT5JbnNlcnRDaGlsZChwRGF0YU5vZGUpOworICAgICAgICAgICAgICBwRGF0YVBhcmVudC0+UmVtb3ZlQ2hpbGQocERhdGFOb2RlLCB0cnVlKTsKKyAgICAgICAgICAgICAgcERhdGFTY29wZS0+SW5zZXJ0Q2hpbGQocERhdGFOb2RlLCBudWxscHRyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0dsb2JhbDoKKyAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06Okdsb2JhbDoKICAgICAgICAgaWYgKCFiRGF0YVJlZiB8fCBiUGFyZW50RGF0YVJlZikgewogICAgICAgICAgIHVpbnQzMl90IGR3TmFtZUhhc2ggPSBwRm9ybU5vZGUtPkdldE5hbWVIYXNoKCk7CiAgICAgICAgICAgaWYgKGR3TmFtZUhhc2ggIT0gMCAmJiAhcERhdGFOb2RlKSB7CkBAIC0xMTMyLDcgKzExNTAsOCBAQAogICAgICAgICAgICAgICAgICAgVG9Ob2RlKHBEb2N1bWVudC0+R2V0WEZBT2JqZWN0KFhGQV9IQVNIQ09ERV9SZWNvcmQpKTsKICAgICAgICAgICAgICAgcERhdGFOb2RlID0gTWF5YmVDcmVhdGVEYXRhTm9kZSgKICAgICAgICAgICAgICAgICAgIHBEb2N1bWVudCwgcFJlY29yZE5vZGUsIGVEYXRhTm9kZVR5cGUsCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyhwRm9ybU5vZGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSkpKTsKKyAgICAgICAgICAgICAgICAgIFdpZGVTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgcEZvcm1Ob2RlLT5KU09iamVjdCgpLT5HZXRDRGF0YShYRkFfQXR0cmlidXRlOjpOYW1lKSkpOwogICAgICAgICAgICAgICBpZiAocERhdGFOb2RlKSB7CiAgICAgICAgICAgICAgICAgQ3JlYXRlRGF0YUJpbmRpbmcocEZvcm1Ob2RlLCBwRGF0YU5vZGUsIGZhbHNlKTsKICAgICAgICAgICAgICAgICBSZWdpc3Rlckdsb2JhbEJpbmRpbmcocERvY3VtZW50LCBwRm9ybU5vZGUtPkdldE5hbWVIYXNoKCksCkBAIC0xMTQ2LDIzICsxMTY1LDI1IEBACiAgICAgICAgICAgICBGb3JtVmFsdWVOb2RlX01hdGNoTm9uZUNyZWF0ZUNoaWxkKHBGb3JtTm9kZSk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0RhdGFSZWY6IHsKKyAgICAgIGNhc2UgWEZBX0F0dHJpYnV0ZUVudW06OkRhdGFSZWY6IHsKICAgICAgICAgYk1hdGNoUmVmID0gYkRhdGFSZWY7CiAgICAgICAgIGJQYXJlbnREYXRhUmVmID0gdHJ1ZTsKICAgICAgICAgaWYgKCFwRGF0YU5vZGUgJiYgYkRhdGFSZWYpIHsKLSAgICAgICAgICBDRlhfV2lkZVN0cmluZ0Mgd3NSZWYgPQotICAgICAgICAgICAgICBwVGVtcGxhdGVOb2RlQmluZC0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9SZWYpOworICAgICAgICAgIFdpZGVTdHJpbmcgd3NSZWYgPQorICAgICAgICAgICAgICBwVGVtcGxhdGVOb2RlQmluZAorICAgICAgICAgICAgICAgICAgPyBwVGVtcGxhdGVOb2RlQmluZC0+SlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6UmVmKQorICAgICAgICAgICAgICAgICAgOiBMIiI7CiAgICAgICAgICAgdWludDMyX3QgZEZsYWdzID0KICAgICAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIHwgWEZBX1JFU09MVkVOT0RFX0NyZWF0ZU5vZGU7CiAgICAgICAgICAgWEZBX1JFU09MVkVOT0RFX1JTIHJzOwotICAgICAgICAgIHBEb2N1bWVudC0+R2V0U2NyaXB0Q29udGV4dCgpLT5SZXNvbHZlT2JqZWN0cyhwRGF0YVNjb3BlLCB3c1JlZiwgcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRGbGFncywgcFRlbXBsYXRlTm9kZSk7CisgICAgICAgICAgcERvY3VtZW50LT5HZXRTY3JpcHRDb250ZXh0KCktPlJlc29sdmVPYmplY3RzKAorICAgICAgICAgICAgICBwRGF0YVNjb3BlLCB3c1JlZi5Bc1N0cmluZ1ZpZXcoKSwgJnJzLCBkRmxhZ3MsIHBUZW1wbGF0ZU5vZGUpOwogICAgICAgICAgIENYRkFfT2JqZWN0KiBwT2JqZWN0ID0KLSAgICAgICAgICAgICAgKHJzLm5vZGVzLkdldFNpemUoKSA+IDApID8gcnMubm9kZXNbMF0gOiBudWxscHRyOworICAgICAgICAgICAgICAhcnMub2JqZWN0cy5lbXB0eSgpID8gcnMub2JqZWN0cy5mcm9udCgpIDogbnVsbHB0cjsKICAgICAgICAgICBwRGF0YU5vZGUgPSBUb05vZGUocE9iamVjdCk7CiAgICAgICAgICAgaWYgKHBEYXRhTm9kZSkgewogICAgICAgICAgICAgQ3JlYXRlRGF0YUJpbmRpbmcocEZvcm1Ob2RlLCBwRGF0YU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBycy5kd0ZsYWdzID09IFhGQV9SRVNPVkVOT0RFX1JTVFlQRV9FeGlzdE5vZGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJzLmR3RmxhZ3MgPT0gWEZBX1Jlc29sdmVOb2RlX1JTVHlwZV9FeGlzdE5vZGVzKTsKICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgRm9ybVZhbHVlTm9kZV9NYXRjaE5vbmVDcmVhdGVDaGlsZChwRm9ybU5vZGUpOwogICAgICAgICAgIH0KQEAgLTExNzgsMTAgKzExOTksOCBAQAogICAgICAgKGVUeXBlID09IFhGQV9FbGVtZW50OjpTdWJmb3JtIHx8IGVUeXBlID09IFhGQV9FbGVtZW50OjpTdWJmb3JtU2V0IHx8CiAgICAgICAgZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OkFyZWEgfHwgZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OlBhZ2VBcmVhIHx8CiAgICAgICAgZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OlBhZ2VTZXQpKSB7Ci0gICAgZm9yIChDWEZBX05vZGUqIHBGb3JtQ2hpbGQgPQotICAgICAgICAgICAgIHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgICAgcEZvcm1DaGlsZDsKLSAgICAgICAgIHBGb3JtQ2hpbGQgPSBwRm9ybUNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7CisgICAgZm9yIChDWEZBX05vZGUqIHBGb3JtQ2hpbGQgPSBwRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGQoKTsgcEZvcm1DaGlsZDsKKyAgICAgICAgIHBGb3JtQ2hpbGQgPSBwRm9ybUNoaWxkLT5HZXROZXh0U2libGluZygpKSB7CiAgICAgICBpZiAoIXBGb3JtQ2hpbGQtPklzQ29udGFpbmVyTm9kZSgpKQogICAgICAgICBjb250aW51ZTsKICAgICAgIGlmIChwRm9ybUNoaWxkLT5Jc1VudXNlZE5vZGUoKSkKQEAgLTExOTYsOSArMTIxNSw4IEBACiAKIHZvaWQgVXBkYXRlRGF0YVJlbGF0aW9uKENYRkFfTm9kZSogcERhdGFOb2RlLCBDWEZBX05vZGUqIHBEYXRhRGVzY3JpcHRpb25Ob2RlKSB7CiAgIEFTU0VSVChwRGF0YURlc2NyaXB0aW9uTm9kZSk7Ci0gIGZvciAoQ1hGQV9Ob2RlKiBwRGF0YUNoaWxkID0gcERhdGFOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gICAgICAgcERhdGFDaGlsZDsKLSAgICAgICBwRGF0YUNoaWxkID0gcERhdGFDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgeworICBmb3IgKENYRkFfTm9kZSogcERhdGFDaGlsZCA9IHBEYXRhTm9kZS0+R2V0Rmlyc3RDaGlsZCgpOyBwRGF0YUNoaWxkOworICAgICAgIHBEYXRhQ2hpbGQgPSBwRGF0YUNoaWxkLT5HZXROZXh0U2libGluZygpKSB7CiAgICAgdWludDMyX3QgZHdOYW1lSGFzaCA9IHBEYXRhQ2hpbGQtPkdldE5hbWVIYXNoKCk7CiAgICAgaWYgKCFkd05hbWVIYXNoKQogICAgICAgY29udGludWU7CkBAIC0xMjExLDEyICsxMjI5LDExIEBACiAgICAgICAgIGlmIChwRERHcm91cE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OkRhdGFHcm91cCkKICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICBDRlhfV2lkZVN0cmluZyB3c05hbWVzcGFjZTsKLSAgICAgICAgaWYgKCFwRERHcm91cE5vZGUtPlRyeU5hbWVzcGFjZSh3c05hbWVzcGFjZSkgfHwKLSAgICAgICAgICAgIHdzTmFtZXNwYWNlICE9IEwiaHR0cDovL25zLmFkb2JlLmNvbS9kYXRhLWRlc2NyaXB0aW9uLyIpIHsKKyAgICAgICAgT3B0aW9uYWw8V2lkZVN0cmluZz4gbnMgPSBwRERHcm91cE5vZGUtPkpTT2JqZWN0KCktPlRyeU5hbWVzcGFjZSgpOworICAgICAgICBpZiAoIW5zIHx8ICpucyAhPSBMImh0dHA6Ly9ucy5hZG9iZS5jb20vZGF0YS1kZXNjcmlwdGlvbi8iKQogICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9CiAgICAgICB9CisKICAgICAgIENYRkFfTm9kZSogcERETm9kZSA9IHBEREdyb3VwTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5TmFtZShkd05hbWVIYXNoKTsKICAgICAgIGlmICghcERETm9kZSkKICAgICAgICAgY29udGludWU7CkBAIC0xMjM2LDkgKzEyNTMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQgZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd05hbWVIYXNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwRm9ybVBhcmVudCkgewotICBDWEZBX05vZGUqIHBGb3JtQ2hpbGQgPSBwRm9ybVBhcmVudC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICBmb3IgKDsgcEZvcm1DaGlsZDsKLSAgICAgICBwRm9ybUNoaWxkID0gcEZvcm1DaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgeworICBDWEZBX05vZGUqIHBGb3JtQ2hpbGQgPSBwRm9ybVBhcmVudC0+R2V0Rmlyc3RDaGlsZCgpOworICBmb3IgKDsgcEZvcm1DaGlsZDsgcEZvcm1DaGlsZCA9IHBGb3JtQ2hpbGQtPkdldE5leHRTaWJsaW5nKCkpIHsKICAgICBpZiAocEZvcm1DaGlsZC0+R2V0RWxlbWVudFR5cGUoKSA9PSBlVHlwZSAmJgogICAgICAgICBwRm9ybUNoaWxkLT5HZXROYW1lSGFzaCgpID09IGR3TmFtZUhhc2ggJiYgcEZvcm1DaGlsZC0+SXNVbnVzZWROb2RlKCkpIHsKICAgICAgIHJldHVybiBwRm9ybUNoaWxkOwpAQCAtMTI0NywzNSArMTI2MywzMyBAQAogICByZXR1cm4gbnVsbHB0cjsKIH0KIAotQ1hGQV9Ob2RlKiBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcihDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEZvcm1QYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmVjdXJzaXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSogcFN1YmZvcm1BcnJheSkgeworQ1hGQV9Ob2RlKiBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcigKKyAgICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsCisgICAgQ1hGQV9Ob2RlKiBwRm9ybVBhcmVudCwKKyAgICBDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUsCisgICAgYm9vbCBiUmVjdXJzaXZlLAorICAgIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+KiBwU3ViZm9ybUFycmF5KSB7CiAgIENYRkFfTm9kZSogcEV4aXN0aW5nTm9kZSA9IG51bGxwdHI7CiAgIGlmICghcFN1YmZvcm1BcnJheSkgewogICAgIHBFeGlzdGluZ05vZGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmRGb3JtRE9NSW5zdGFuY2UoCiAgICAgICAgIHBEb2N1bWVudCwgcFRlbXBsYXRlTm9kZS0+R2V0RWxlbWVudFR5cGUoKSwKICAgICAgICAgcFRlbXBsYXRlTm9kZS0+R2V0TmFtZUhhc2goKSwgcEZvcm1QYXJlbnQpOwotICB9IGVsc2UgaWYgKHBTdWJmb3JtQXJyYXktPkdldFNpemUoKSA+IDApIHsKLSAgICBwRXhpc3RpbmdOb2RlID0gcFN1YmZvcm1BcnJheS0+R2V0QXQoMCk7Ci0gICAgcFN1YmZvcm1BcnJheS0+UmVtb3ZlQXQoMCk7CisgIH0gZWxzZSBpZiAoIXBTdWJmb3JtQXJyYXktPmVtcHR5KCkpIHsKKyAgICBwRXhpc3RpbmdOb2RlID0gcFN1YmZvcm1BcnJheS0+ZnJvbnQoKTsKKyAgICBwU3ViZm9ybUFycmF5LT5lcmFzZShwU3ViZm9ybUFycmF5LT5iZWdpbigpKTsKICAgfQotCiAgIGlmIChwRXhpc3RpbmdOb2RlKSB7CiAgICAgaWYgKHBTdWJmb3JtQXJyYXkpIHsKLSAgICAgIHBGb3JtUGFyZW50LT5JbnNlcnRDaGlsZChwRXhpc3RpbmdOb2RlKTsKKyAgICAgIHBGb3JtUGFyZW50LT5JbnNlcnRDaGlsZChwRXhpc3RpbmdOb2RlLCBudWxscHRyKTsKICAgICB9IGVsc2UgaWYgKHBFeGlzdGluZ05vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB7Ci0gICAgICBwRm9ybVBhcmVudC0+UmVtb3ZlQ2hpbGQocEV4aXN0aW5nTm9kZSk7Ci0gICAgICBwRm9ybVBhcmVudC0+SW5zZXJ0Q2hpbGQocEV4aXN0aW5nTm9kZSk7CisgICAgICBwRm9ybVBhcmVudC0+UmVtb3ZlQ2hpbGQocEV4aXN0aW5nTm9kZSwgdHJ1ZSk7CisgICAgICBwRm9ybVBhcmVudC0+SW5zZXJ0Q2hpbGQocEV4aXN0aW5nTm9kZSwgbnVsbHB0cik7CiAgICAgfQogICAgIHBFeGlzdGluZ05vZGUtPkNsZWFyRmxhZyhYRkFfTm9kZUZsYWdfVW51c2VkTm9kZSk7CiAgICAgcEV4aXN0aW5nTm9kZS0+U2V0VGVtcGxhdGVOb2RlKHBUZW1wbGF0ZU5vZGUpOwogICAgIGlmIChiUmVjdXJzaXZlICYmIHBFeGlzdGluZ05vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6Okl0ZW1zKSB7Ci0gICAgICBmb3IgKENYRkFfTm9kZSogcFRlbXBsYXRlQ2hpbGQgPQotICAgICAgICAgICAgICAgcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgICAgICBwVGVtcGxhdGVDaGlsZDsgcFRlbXBsYXRlQ2hpbGQgPSBwVGVtcGxhdGVDaGlsZC0+R2V0Tm9kZUl0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgeworICAgICAgZm9yIChDWEZBX05vZGUqIHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlTm9kZS0+R2V0Rmlyc3RDaGlsZCgpOworICAgICAgICAgICBwVGVtcGxhdGVDaGlsZDsgcFRlbXBsYXRlQ2hpbGQgPSBwVGVtcGxhdGVDaGlsZC0+R2V0TmV4dFNpYmxpbmcoKSkgewogICAgICAgICBpZiAoTmVlZEdlbmVyYXRlRm9ybShwVGVtcGxhdGVDaGlsZCwgdHJ1ZSkpIHsKICAgICAgICAgICBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcigKICAgICAgICAgICAgICAgcERvY3VtZW50LCBwRXhpc3RpbmdOb2RlLCBwVGVtcGxhdGVDaGlsZCwgYlJlY3Vyc2l2ZSwgbnVsbHB0cik7CkBAIC0xMjg5LDEwICsxMzAzLDggQEAKICAgQ1hGQV9Ob2RlKiBwTmV3Tm9kZSA9IHBUZW1wbGF0ZU5vZGUtPkNsb25lVGVtcGxhdGVUb0Zvcm0oZmFsc2UpOwogICBwRm9ybVBhcmVudC0+SW5zZXJ0Q2hpbGQocE5ld05vZGUsIG51bGxwdHIpOwogICBpZiAoYlJlY3Vyc2l2ZSkgewotICAgIGZvciAoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVDaGlsZCA9Ci0gICAgICAgICAgICAgcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgICAgcFRlbXBsYXRlQ2hpbGQ7IHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkdldE5vZGVJdGVtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7CisgICAgZm9yIChDWEZBX05vZGUqIHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlTm9kZS0+R2V0Rmlyc3RDaGlsZCgpOworICAgICAgICAgcFRlbXBsYXRlQ2hpbGQ7IHBUZW1wbGF0ZUNoaWxkID0gcFRlbXBsYXRlQ2hpbGQtPkdldE5leHRTaWJsaW5nKCkpIHsKICAgICAgIGlmIChOZWVkR2VuZXJhdGVGb3JtKHBUZW1wbGF0ZUNoaWxkLCB0cnVlKSkgewogICAgICAgICBDWEZBX05vZGUqIHBOZXdDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5DbG9uZVRlbXBsYXRlVG9Gb3JtKHRydWUpOwogICAgICAgICBwTmV3Tm9kZS0+SW5zZXJ0Q2hpbGQocE5ld0NoaWxkLCBudWxscHRyKTsKQEAgLTEzMDUsNyArMTMxNyw3IEBACiBDWEZBX05vZGUqIFhGQV9EYXRhTWVyZ2VfRmluZERhdGFTY29wZShDWEZBX05vZGUqIHBQYXJlbnRGb3JtTm9kZSkgewogICBmb3IgKENYRkFfTm9kZSogcFJvb3RCb3VuZE5vZGUgPSBwUGFyZW50Rm9ybU5vZGU7CiAgICAgICAgcFJvb3RCb3VuZE5vZGUgJiYgcFJvb3RCb3VuZE5vZGUtPklzQ29udGFpbmVyTm9kZSgpOwotICAgICAgIHBSb290Qm91bmROb2RlID0gcFJvb3RCb3VuZE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKSB7CisgICAgICAgcFJvb3RCb3VuZE5vZGUgPSBwUm9vdEJvdW5kTm9kZS0+R2V0UGFyZW50KCkpIHsKICAgICBDWEZBX05vZGUqIHBEYXRhU2NvcGUgPSBwUm9vdEJvdW5kTm9kZS0+R2V0QmluZERhdGEoKTsKICAgICBpZiAocERhdGFTY29wZSkKICAgICAgIHJldHVybiBwRGF0YVNjb3BlOwpAQCAtMTMzNyw3ICsxMzQ5LDcgQEAKICAgICBjYXNlIFhGQV9FbGVtZW50OjpWYXJpYWJsZXM6CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgQVNTRVJUKGZhbHNlKTsKKyAgICAgIE5PVFJFQUNIRUQoKTsKICAgICAgIGJyZWFrOwogICB9CiAgIHJldHVybiBudWxscHRyOwpAQCAtMTM0NSw4ICsxMzU3LDggQEAKIAogdm9pZCBDWEZBX0RvY3VtZW50OjpEYXRhTWVyZ2VfVXBkYXRlQmluZGluZ1JlbGF0aW9ucygKICAgICBDWEZBX05vZGUqIHBGb3JtVXBkYXRlUm9vdCkgewotICBDWEZBX05vZGUqIHBEYXRhU2NvcGUgPSBYRkFfRGF0YU1lcmdlX0ZpbmREYXRhU2NvcGUoCi0gICAgICBwRm9ybVVwZGF0ZVJvb3QtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpKTsKKyAgQ1hGQV9Ob2RlKiBwRGF0YVNjb3BlID0KKyAgICAgIFhGQV9EYXRhTWVyZ2VfRmluZERhdGFTY29wZShwRm9ybVVwZGF0ZVJvb3QtPkdldFBhcmVudCgpKTsKICAgaWYgKCFwRGF0YVNjb3BlKQogICAgIHJldHVybjsKIApAQCAtMTM1NCw5ICsxMzY2LDEwIEBACiAgIFVwZGF0ZUJpbmRpbmdSZWxhdGlvbnModGhpcywgcEZvcm1VcGRhdGVSb290LCBwRGF0YVNjb3BlLCB0cnVlLCBmYWxzZSk7CiB9CiAKLUNYRkFfTm9kZSogQ1hGQV9Eb2N1bWVudDo6R2V0Tm90QmluZE5vZGUoQ1hGQV9PYmpBcnJheSYgYXJyYXlOb2RlcykgewotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBhcnJheU5vZGVzLkdldFNpemUoKTsgaSsrKSB7Ci0gICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IGFycmF5Tm9kZXNbaV0tPkFzTm9kZSgpOworQ1hGQV9Ob2RlKiBDWEZBX0RvY3VtZW50OjpHZXROb3RCaW5kTm9kZSgKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDWEZBX09iamVjdCo+JiBhcnJheU9iamVjdHMpIHsKKyAgZm9yIChDWEZBX09iamVjdCogcE9iamVjdCA6IGFycmF5T2JqZWN0cykgeworICAgIENYRkFfTm9kZSogcE5vZGUgPSBwT2JqZWN0LT5Bc05vZGUoKTsKICAgICBpZiAocE5vZGUgJiYgIXBOb2RlLT5IYXNCaW5kSXRlbSgpKQogICAgICAgcmV0dXJuIHBOb2RlOwogICB9CkBAIC0xMzY2LDM1ICsxMzc5LDM4IEBACiB2b2lkIENYRkFfRG9jdW1lbnQ6OkRvRGF0YU1lcmdlKCkgewogICBDWEZBX05vZGUqIHBEYXRhc2V0c1Jvb3QgPSBUb05vZGUoR2V0WEZBT2JqZWN0KFhGQV9IQVNIQ09ERV9EYXRhc2V0cykpOwogICBpZiAoIXBEYXRhc2V0c1Jvb3QpIHsKLSAgICBDRkRFX1hNTEVsZW1lbnQqIHBEYXRhc2V0c1hNTE5vZGUgPSBuZXcgQ0ZERV9YTUxFbGVtZW50KEwieGZhOmRhdGFzZXRzIik7CisgICAgQ0ZYX1hNTEVsZW1lbnQqIHBEYXRhc2V0c1hNTE5vZGUgPSBuZXcgQ0ZYX1hNTEVsZW1lbnQoTCJ4ZmE6ZGF0YXNldHMiKTsKICAgICBwRGF0YXNldHNYTUxOb2RlLT5TZXRTdHJpbmcoTCJ4bWxuczp4ZmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWRhdGEvMS4wLyIpOwotICAgIHBEYXRhc2V0c1Jvb3QgPSBDcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIFhGQV9FbGVtZW50OjpEYXRhTW9kZWwpOwotICAgIHBEYXRhc2V0c1Jvb3QtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgTCJkYXRhc2V0cyIpOworICAgIHBEYXRhc2V0c1Jvb3QgPQorICAgICAgICBDcmVhdGVOb2RlKFhGQV9QYWNrZXRUeXBlOjpEYXRhc2V0cywgWEZBX0VsZW1lbnQ6OkRhdGFNb2RlbCk7CisgICAgcERhdGFzZXRzUm9vdC0+SlNPYmplY3QoKS0+U2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6TmFtZSwgTCJkYXRhc2V0cyIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKICAgICBtX3BSb290Tm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKS0+SW5zZXJ0Q2hpbGROb2RlKHBEYXRhc2V0c1hNTE5vZGUpOwotICAgIG1fcFJvb3ROb2RlLT5JbnNlcnRDaGlsZChwRGF0YXNldHNSb290KTsKKyAgICBtX3BSb290Tm9kZS0+SW5zZXJ0Q2hpbGQocERhdGFzZXRzUm9vdCwgbnVsbHB0cik7CiAgICAgcERhdGFzZXRzUm9vdC0+U2V0WE1MTWFwcGluZ05vZGUocERhdGFzZXRzWE1MTm9kZSk7CiAgIH0KICAgQ1hGQV9Ob2RlICpwRGF0YVJvb3QgPSBudWxscHRyLCAqcEREUm9vdCA9IG51bGxwdHI7Ci0gIENGWF9XaWRlU3RyaW5nIHdzRGF0YXNldHNVUkk7Ci0gIHBEYXRhc2V0c1Jvb3QtPlRyeU5hbWVzcGFjZSh3c0RhdGFzZXRzVVJJKTsKLSAgZm9yIChDWEZBX05vZGUqIHBDaGlsZE5vZGUgPQotICAgICAgICAgICBwRGF0YXNldHNSb290LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gICAgICAgcENoaWxkTm9kZTsKLSAgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgeworICBXaWRlU3RyaW5nIHdzRGF0YXNldHNVUkkgPQorICAgICAgcERhdGFzZXRzUm9vdC0+SlNPYmplY3QoKS0+VHJ5TmFtZXNwYWNlKCkudmFsdWVfb3IoV2lkZVN0cmluZygpKTsKKyAgZm9yIChDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwRGF0YXNldHNSb290LT5HZXRGaXJzdENoaWxkKCk7IHBDaGlsZE5vZGU7CisgICAgICAgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5leHRTaWJsaW5nKCkpIHsKICAgICBpZiAocENoaWxkTm9kZS0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6RGF0YUdyb3VwKQogICAgICAgY29udGludWU7CiAKLSAgICBDRlhfV2lkZVN0cmluZyB3c05hbWVzcGFjZVVSSTsKICAgICBpZiAoIXBERFJvb3QgJiYgcENoaWxkTm9kZS0+R2V0TmFtZUhhc2goKSA9PSBYRkFfSEFTSENPREVfRGF0YURlc2NyaXB0aW9uKSB7Ci0gICAgICBpZiAoIXBDaGlsZE5vZGUtPlRyeU5hbWVzcGFjZSh3c05hbWVzcGFjZVVSSSkpCisgICAgICBPcHRpb25hbDxXaWRlU3RyaW5nPiBuYW1lc3BhY2VVUkkgPQorICAgICAgICAgIHBDaGlsZE5vZGUtPkpTT2JqZWN0KCktPlRyeU5hbWVzcGFjZSgpOworICAgICAgaWYgKCFuYW1lc3BhY2VVUkkpCiAgICAgICAgIGNvbnRpbnVlOwotICAgICAgaWYgKHdzTmFtZXNwYWNlVVJJID09IEwiaHR0cDovL25zLmFkb2JlLmNvbS9kYXRhLWRlc2NyaXB0aW9uLyIpCisgICAgICBpZiAoKm5hbWVzcGFjZVVSSSA9PSBMImh0dHA6Ly9ucy5hZG9iZS5jb20vZGF0YS1kZXNjcmlwdGlvbi8iKQogICAgICAgICBwRERSb290ID0gcENoaWxkTm9kZTsKICAgICB9IGVsc2UgaWYgKCFwRGF0YVJvb3QgJiYgcENoaWxkTm9kZS0+R2V0TmFtZUhhc2goKSA9PSBYRkFfSEFTSENPREVfRGF0YSkgewotICAgICAgaWYgKCFwQ2hpbGROb2RlLT5UcnlOYW1lc3BhY2Uod3NOYW1lc3BhY2VVUkkpKQorICAgICAgT3B0aW9uYWw8V2lkZVN0cmluZz4gbmFtZXNwYWNlVVJJID0KKyAgICAgICAgICBwQ2hpbGROb2RlLT5KU09iamVjdCgpLT5UcnlOYW1lc3BhY2UoKTsKKyAgICAgIGlmICghbmFtZXNwYWNlVVJJKQogICAgICAgICBjb250aW51ZTsKLSAgICAgIGlmICh3c05hbWVzcGFjZVVSSSA9PSB3c0RhdGFzZXRzVVJJKQorICAgICAgaWYgKCpuYW1lc3BhY2VVUkkgPT0gd3NEYXRhc2V0c1VSSSkKICAgICAgICAgcERhdGFSb290ID0gcENoaWxkTm9kZTsKICAgICB9CiAgICAgaWYgKHBEYXRhUm9vdCAmJiBwRERSb290KQpAQCAtMTQwMiwxOCArMTQxOCwxOCBAQAogICB9CiAKICAgaWYgKCFwRGF0YVJvb3QpIHsKLSAgICBDRkRFX1hNTEVsZW1lbnQqIHBEYXRhUm9vdFhNTE5vZGUgPSBuZXcgQ0ZERV9YTUxFbGVtZW50KEwieGZhOmRhdGEiKTsKLSAgICBwRGF0YVJvb3QgPSBDcmVhdGVOb2RlKFhGQV9YRFBQQUNLRVRfRGF0YXNldHMsIFhGQV9FbGVtZW50OjpEYXRhR3JvdXApOwotICAgIHBEYXRhUm9vdC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCBMImRhdGEiKTsKKyAgICBDRlhfWE1MRWxlbWVudCogcERhdGFSb290WE1MTm9kZSA9IG5ldyBDRlhfWE1MRWxlbWVudChMInhmYTpkYXRhIik7CisgICAgcERhdGFSb290ID0gQ3JlYXRlTm9kZShYRkFfUGFja2V0VHlwZTo6RGF0YXNldHMsIFhGQV9FbGVtZW50OjpEYXRhR3JvdXApOworICAgIHBEYXRhUm9vdC0+SlNPYmplY3QoKS0+U2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6TmFtZSwgTCJkYXRhIiwgZmFsc2UsIGZhbHNlKTsKICAgICBwRGF0YVJvb3QtPlNldFhNTE1hcHBpbmdOb2RlKHBEYXRhUm9vdFhNTE5vZGUpOwotICAgIHBEYXRhc2V0c1Jvb3QtPkluc2VydENoaWxkKHBEYXRhUm9vdCk7CisgICAgcERhdGFzZXRzUm9vdC0+SW5zZXJ0Q2hpbGQocERhdGFSb290LCBudWxscHRyKTsKICAgfQogCi0gIENYRkFfTm9kZSogcERhdGFUb3BMZXZlbCA9Ci0gICAgICBwRGF0YVJvb3QtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpEYXRhR3JvdXApOworICBDWEZBX0RhdGFHcm91cCogcERhdGFUb3BMZXZlbCA9CisgICAgICBwRGF0YVJvb3QtPkdldEZpcnN0Q2hpbGRCeUNsYXNzPENYRkFfRGF0YUdyb3VwPihYRkFfRWxlbWVudDo6RGF0YUdyb3VwKTsKICAgdWludDMyX3QgZHdOYW1lSGFzaCA9IHBEYXRhVG9wTGV2ZWwgPyBwRGF0YVRvcExldmVsLT5HZXROYW1lSGFzaCgpIDogMDsKLSAgQ1hGQV9Ob2RlKiBwVGVtcGxhdGVSb290ID0KLSAgICAgIG1fcFJvb3ROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRWxlbWVudDo6VGVtcGxhdGUpOworICBDWEZBX1RlbXBsYXRlKiBwVGVtcGxhdGVSb290ID0KKyAgICAgIG1fcFJvb3ROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX1RlbXBsYXRlPihYRkFfRWxlbWVudDo6VGVtcGxhdGUpOwogICBpZiAoIXBUZW1wbGF0ZVJvb3QpCiAgICAgcmV0dXJuOwogCkBAIC0xNDIyLDE4ICsxNDM4LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyOwogICBpZiAoIXBUZW1wbGF0ZUNob3NlbiB8fAogICAgICAgcFRlbXBsYXRlQ2hvc2VuLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpTdWJmb3JtKSB7Ci0gICAgcFRlbXBsYXRlQ2hvc2VuID0gcFRlbXBsYXRlUm9vdC0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VsZW1lbnQ6OlN1YmZvcm0pOworICAgIHBUZW1wbGF0ZUNob3NlbiA9CisgICAgICAgIHBUZW1wbGF0ZVJvb3QtPkdldEZpcnN0Q2hpbGRCeUNsYXNzPENYRkFfU3ViZm9ybT4oWEZBX0VsZW1lbnQ6OlN1YmZvcm0pOwogICB9CiAgIGlmICghcFRlbXBsYXRlQ2hvc2VuKQogICAgIHJldHVybjsKIAotICBDWEZBX05vZGUqIHBGb3JtUm9vdCA9IG1fcFJvb3ROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRWxlbWVudDo6Rm9ybSk7CisgIENYRkFfRm9ybSogcEZvcm1Sb290ID0KKyAgICAgIG1fcFJvb3ROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzczxDWEZBX0Zvcm0+KFhGQV9FbGVtZW50OjpGb3JtKTsKICAgYm9vbCBiRW1wdHlGb3JtID0gZmFsc2U7CiAgIGlmICghcEZvcm1Sb290KSB7CiAgICAgYkVtcHR5Rm9ybSA9IHRydWU7Ci0gICAgcEZvcm1Sb290ID0gQ3JlYXRlTm9kZShYRkFfWERQUEFDS0VUX0Zvcm0sIFhGQV9FbGVtZW50OjpGb3JtKTsKKyAgICBwRm9ybVJvb3QgPSBzdGF0aWNfY2FzdDxDWEZBX0Zvcm0qPigKKyAgICAgICAgQ3JlYXRlTm9kZShYRkFfUGFja2V0VHlwZTo6Rm9ybSwgWEZBX0VsZW1lbnQ6OkZvcm0pKTsKICAgICBBU1NFUlQocEZvcm1Sb290KTsKLSAgICBwRm9ybVJvb3QtPlNldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSwgTCJmb3JtIik7CisgICAgcEZvcm1Sb290LT5KU09iamVjdCgpLT5TZXRDRGF0YShYRkFfQXR0cmlidXRlOjpOYW1lLCBMImZvcm0iLCBmYWxzZSwgZmFsc2UpOwogICAgIG1fcFJvb3ROb2RlLT5JbnNlcnRDaGlsZChwRm9ybVJvb3QsIG51bGxwdHIpOwogICB9IGVsc2UgewogICAgIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLCBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBTm9kZT4KQEAgLTE0NDgsMjUgKzE0NjcsMjUgQEAKICAgICAgIHRoaXMsIHBGb3JtUm9vdCwgcFRlbXBsYXRlQ2hvc2VuLCBmYWxzZSwgbnVsbHB0cik7CiAgIEFTU0VSVChwU3ViZm9ybVNldE5vZGUpOwogICBpZiAoIXBEYXRhVG9wTGV2ZWwpIHsKLSAgICBDRlhfV2lkZVN0cmluZ0Mgd3NGb3JtTmFtZSA9IHBTdWJmb3JtU2V0Tm9kZS0+R2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lKTsKLSAgICBDRlhfV2lkZVN0cmluZyB3c0RhdGFUb3BMZXZlbE5hbWUod3NGb3JtTmFtZS5Jc0VtcHR5KCkgPyBMImZvcm0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogd3NGb3JtTmFtZSk7Ci0gICAgQ0ZERV9YTUxFbGVtZW50KiBwRGF0YVRvcExldmVsWE1MTm9kZSA9Ci0gICAgICAgIG5ldyBDRkRFX1hNTEVsZW1lbnQod3NEYXRhVG9wTGV2ZWxOYW1lKTsKKyAgICBXaWRlU3RyaW5nIHdzRm9ybU5hbWUgPQorICAgICAgICBwU3ViZm9ybVNldE5vZGUtPkpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6Ok5hbWUpOworICAgIFdpZGVTdHJpbmcgd3NEYXRhVG9wTGV2ZWxOYW1lKHdzRm9ybU5hbWUuSXNFbXB0eSgpID8gTCJmb3JtIiA6IHdzRm9ybU5hbWUpOworICAgIENGWF9YTUxFbGVtZW50KiBwRGF0YVRvcExldmVsWE1MTm9kZSA9CisgICAgICAgIG5ldyBDRlhfWE1MRWxlbWVudCh3c0RhdGFUb3BMZXZlbE5hbWUpOwogCi0gICAgcERhdGFUb3BMZXZlbCA9IENyZWF0ZU5vZGUoWEZBX1hEUFBBQ0tFVF9EYXRhc2V0cywgWEZBX0VsZW1lbnQ6OkRhdGFHcm91cCk7Ci0gICAgcERhdGFUb3BMZXZlbC0+U2V0Q0RhdGEoWEZBX0FUVFJJQlVURV9OYW1lLCB3c0RhdGFUb3BMZXZlbE5hbWUpOworICAgIHBEYXRhVG9wTGV2ZWwgPSBzdGF0aWNfY2FzdDxDWEZBX0RhdGFHcm91cCo+KAorICAgICAgICBDcmVhdGVOb2RlKFhGQV9QYWNrZXRUeXBlOjpEYXRhc2V0cywgWEZBX0VsZW1lbnQ6OkRhdGFHcm91cCkpOworICAgIHBEYXRhVG9wTGV2ZWwtPkpTT2JqZWN0KCktPlNldENEYXRhKFhGQV9BdHRyaWJ1dGU6Ok5hbWUsIHdzRGF0YVRvcExldmVsTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpOwogICAgIHBEYXRhVG9wTGV2ZWwtPlNldFhNTE1hcHBpbmdOb2RlKHBEYXRhVG9wTGV2ZWxYTUxOb2RlKTsKLSAgICBDWEZBX05vZGUqIHBCZWZvcmVOb2RlID0gcERhdGFSb290LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7CisgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlTm9kZSA9IHBEYXRhUm9vdC0+R2V0Rmlyc3RDaGlsZCgpOwogICAgIHBEYXRhUm9vdC0+SW5zZXJ0Q2hpbGQocERhdGFUb3BMZXZlbCwgcEJlZm9yZU5vZGUpOwogICB9CiAKICAgQVNTRVJUKHBEYXRhVG9wTGV2ZWwpOwogICBDcmVhdGVEYXRhQmluZGluZyhwU3ViZm9ybVNldE5vZGUsIHBEYXRhVG9wTGV2ZWwsIHRydWUpOwotICBmb3IgKENYRkFfTm9kZSogcFRlbXBsYXRlQ2hpbGQgPQotICAgICAgICAgICBwVGVtcGxhdGVDaG9zZW4tPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsKLSAgICAgICBwVGVtcGxhdGVDaGlsZDsKLSAgICAgICBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpKSB7CisgIGZvciAoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNob3Nlbi0+R2V0Rmlyc3RDaGlsZCgpOworICAgICAgIHBUZW1wbGF0ZUNoaWxkOyBwVGVtcGxhdGVDaGlsZCA9IHBUZW1wbGF0ZUNoaWxkLT5HZXROZXh0U2libGluZygpKSB7CiAgICAgaWYgKE5lZWRHZW5lcmF0ZUZvcm0ocFRlbXBsYXRlQ2hpbGQsIHRydWUpKSB7CiAgICAgICBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcih0aGlzLCBwU3ViZm9ybVNldE5vZGUsIHBUZW1wbGF0ZUNoaWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgbnVsbHB0cik7CkBAIC0xNDc5LDEzICsxNDk4LDE0IEBACiAgICAgVXBkYXRlRGF0YVJlbGF0aW9uKHBEYXRhUm9vdCwgcEREUm9vdCk7CiAKICAgRGF0YU1lcmdlX1VwZGF0ZUJpbmRpbmdSZWxhdGlvbnMocFN1YmZvcm1TZXROb2RlKTsKLSAgQ1hGQV9Ob2RlKiBwUGFnZVNldE5vZGUgPQotICAgICAgcFN1YmZvcm1TZXROb2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRWxlbWVudDo6UGFnZVNldCk7CisgIENYRkFfUGFnZVNldCogcFBhZ2VTZXROb2RlID0KKyAgICAgIHBTdWJmb3JtU2V0Tm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3M8Q1hGQV9QYWdlU2V0PihYRkFfRWxlbWVudDo6UGFnZVNldCk7CiAgIHdoaWxlIChwUGFnZVNldE5vZGUpIHsKLSAgICBtX3BQZW5kaW5nUGFnZVNldC5BZGQocFBhZ2VTZXROb2RlKTsKLSAgICBDWEZBX05vZGUqIHBOZXh0UGFnZVNldE5vZGUgPQotICAgICAgICBwUGFnZVNldE5vZGUtPkdldE5leHRTYW1lQ2xhc3NTaWJsaW5nKFhGQV9FbGVtZW50OjpQYWdlU2V0KTsKLSAgICBwU3ViZm9ybVNldE5vZGUtPlJlbW92ZUNoaWxkKHBQYWdlU2V0Tm9kZSk7CisgICAgbV9wUGVuZGluZ1BhZ2VTZXQucHVzaF9iYWNrKHBQYWdlU2V0Tm9kZSk7CisgICAgQ1hGQV9QYWdlU2V0KiBwTmV4dFBhZ2VTZXROb2RlID0KKyAgICAgICAgcFBhZ2VTZXROb2RlLT5HZXROZXh0U2FtZUNsYXNzU2libGluZzxDWEZBX1BhZ2VTZXQ+KAorICAgICAgICAgICAgWEZBX0VsZW1lbnQ6OlBhZ2VTZXQpOworICAgIHBTdWJmb3JtU2V0Tm9kZS0+UmVtb3ZlQ2hpbGQocFBhZ2VTZXROb2RlLCB0cnVlKTsKICAgICBwUGFnZVNldE5vZGUgPSBwTmV4dFBhZ2VTZXROb2RlOwogICB9CiAKQEAgLTE1MDAsNyArMTUyMCw3IEBACiAgICAgICBpZiAocE5vZGUtPklzQ29udGFpbmVyTm9kZSgpIHx8CiAgICAgICAgICAgcE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6Okluc3RhbmNlTWFuYWdlcikgewogICAgICAgICBDWEZBX05vZGUqIHBOZXh0ID0gc0l0ZXJhdG9yLlNraXBDaGlsZHJlbkFuZE1vdmVUb05leHQoKTsKLSAgICAgICAgcE5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpLT5SZW1vdmVDaGlsZChwTm9kZSk7CisgICAgICAgIHBOb2RlLT5HZXRQYXJlbnQoKS0+UmVtb3ZlQ2hpbGQocE5vZGUsIHRydWUpOwogICAgICAgICBwTm9kZSA9IHBOZXh0OwogICAgICAgfSBlbHNlIHsKICAgICAgICAgcE5vZGUtPkNsZWFyRmxhZyhYRkFfTm9kZUZsYWdfVW51c2VkTm9kZSk7CkBAIC0xNTE3LDExICsxNTM3LDEzIEBACiB2b2lkIENYRkFfRG9jdW1lbnQ6OkRvRGF0YVJlbWVyZ2UoYm9vbCBiRG9EYXRhTWVyZ2UpIHsKICAgQ1hGQV9Ob2RlKiBwRm9ybVJvb3QgPSBUb05vZGUoR2V0WEZBT2JqZWN0KFhGQV9IQVNIQ09ERV9Gb3JtKSk7CiAgIGlmIChwRm9ybVJvb3QpIHsKLSAgICB3aGlsZSAoQ1hGQV9Ob2RlKiBwTm9kZSA9IHBGb3JtUm9vdC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpKQotICAgICAgcEZvcm1Sb290LT5SZW1vdmVDaGlsZChwTm9kZSk7Ci0gICAgcEZvcm1Sb290LT5TZXRPYmplY3QoWEZBX0FUVFJJQlVURV9CaW5kaW5nTm9kZSwgbnVsbHB0cik7CisgICAgd2hpbGUgKENYRkFfTm9kZSogcE5vZGUgPSBwRm9ybVJvb3QtPkdldEZpcnN0Q2hpbGQoKSkKKyAgICAgIHBGb3JtUm9vdC0+UmVtb3ZlQ2hpbGQocE5vZGUsIHRydWUpOworCisgICAgcEZvcm1Sb290LT5TZXRCaW5kaW5nTm9kZShudWxscHRyKTsKICAgfQogICBtX3JnR2xvYmFsQmluZGluZy5jbGVhcigpOworCiAgIGlmIChiRG9EYXRhTWVyZ2UpCiAgICAgRG9EYXRhTWVyZ2UoKTsKIApkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL3hmYV9kb2N1bWVudF9kYXRhbWVyZ2VyX2ltcC5oIGIveGZhL2Z4ZmEvcGFyc2VyL3hmYV9kb2N1bWVudF9kYXRhbWVyZ2VyX2ltcC5oCmluZGV4IGY5ZWEwODcuLjllNTg2NzggMTAwNjQ0Ci0tLSBhL3hmYS9meGZhL3BhcnNlci94ZmFfZG9jdW1lbnRfZGF0YW1lcmdlcl9pbXAuaAorKysgYi94ZmEvZnhmYS9wYXJzZXIveGZhX2RvY3VtZW50X2RhdGFtZXJnZXJfaW1wLmgKQEAgLTcsMTMgKzcsMTkgQEAKICNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX1hGQV9ET0NVTUVOVF9EQVRBTUVSR0VSX0lNUF9IXwogI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfWEZBX0RPQ1VNRU5UX0RBVEFNRVJHRVJfSU1QX0hfCiAKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KIAotQ1hGQV9Ob2RlKiBYRkFfTm9kZU1lcmdlX0Nsb25lT3JNZXJnZUNvbnRhaW5lcihDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEZvcm1QYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUmVjdXJzaXZlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGVBcnJheSogcFN1YmZvcm1BcnJheSk7CisjaW5jbHVkZSAieGZhL2Z4ZmEvZnhmYV9iYXNpYy5oIgorCitjbGFzcyBDWEZBX0RvY3VtZW50OworY2xhc3MgQ1hGQV9Ob2RlOworCitDWEZBX05vZGUqIFhGQV9Ob2RlTWVyZ2VfQ2xvbmVPck1lcmdlQ29udGFpbmVyKAorICAgIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwKKyAgICBDWEZBX05vZGUqIHBGb3JtUGFyZW50LAorICAgIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSwKKyAgICBib29sIGJSZWN1cnNpdmUsCisgICAgc3RkOjp2ZWN0b3I8Q1hGQV9Ob2RlKj4qIHBTdWJmb3JtQXJyYXkpOwogQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0ZpbmREYXRhU2NvcGUoQ1hGQV9Ob2RlKiBwUGFyZW50Rm9ybU5vZGUpOwogQ1hGQV9Ob2RlKiBYRkFfRGF0YU1lcmdlX0ZpbmRGb3JtRE9NSW5zdGFuY2UoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQgZVR5cGUsCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIveGZhX2xheW91dF9pdGVtbGF5b3V0LmNwcCBiL3hmYS9meGZhL3BhcnNlci94ZmFfbGF5b3V0X2l0ZW1sYXlvdXQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDM4Yzk2Li4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL3BhcnNlci94ZmFfbGF5b3V0X2l0ZW1sYXlvdXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjc5MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX2xheW91dF9pdGVtbGF5b3V0LmgiCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2Uvc3RsX3V0aWwuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9hcHAveGZhX2Zmbm90aWZ5LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29udGFpbmVybGF5b3V0aXRlbS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2NvbnRlbnRsYXlvdXRpdGVtLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9sYXlvdXRwYWdlbWdyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbWVhc3VyZW1lbnQuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9vY2N1ci5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxlbWdyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX3V0aWxzLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLXN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nPiBTZXBhcmF0ZVN0cmluZ1coY29uc3QgRlhfV0NIQVIqIHBTdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVN0ckxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfV0NIQVIgZGVsaW1pdGVyKSB7Ci0gIHN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nPiByZXQ7Ci0gIGlmICghcFN0cikKLSAgICByZXR1cm4gcmV0OwotICBpZiAoaVN0ckxlbiA8IDApCi0gICAgaVN0ckxlbiA9IEZYU1lTX3djc2xlbihwU3RyKTsKLQotICBjb25zdCBGWF9XQ0hBUiogcFRva2VuID0gcFN0cjsKLSAgY29uc3QgRlhfV0NIQVIqIHBFbmQgPSBwU3RyICsgaVN0ckxlbjsKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBpZiAocFN0ciA+PSBwRW5kIHx8IGRlbGltaXRlciA9PSAqcFN0cikgewotICAgICAgcmV0LnB1c2hfYmFjayhDRlhfV2lkZVN0cmluZyhwVG9rZW4sIHBTdHIgLSBwVG9rZW4pKTsKLSAgICAgIHBUb2tlbiA9IHBTdHIgKyAxOwotICAgICAgaWYgKHBTdHIgPj0gcEVuZCkKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHBTdHIrKzsKLSAgfQotICByZXR1cm4gcmV0OwotfQotCi12b2lkIFVwZGF0ZVdpZGdldFNpemUoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcExheW91dEl0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIGZXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCogZkhlaWdodCkgewotICBDWEZBX05vZGUqIHBOb2RlID0gcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlOwotICBzd2l0Y2ggKHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpKSB7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6U3ViZm9ybToKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpBcmVhOgotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkV4Y2xHcm91cDoKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpTdWJmb3JtU2V0OiB7Ci0gICAgICBpZiAoKmZXaWR0aCA8IC1YRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikKLSAgICAgICAgKmZXaWR0aCA9IHBMYXlvdXRJdGVtLT5tX3NTaXplLndpZHRoOwotICAgICAgaWYgKCpmSGVpZ2h0IDwgLVhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKQotICAgICAgICAqZkhlaWdodCA9IHBMYXlvdXRJdGVtLT5tX3NTaXplLmhlaWdodDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFhGQV9FbGVtZW50OjpEcmF3OgotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkZpZWxkOiB7Ci0gICAgICBwTm9kZS0+R2V0RG9jdW1lbnQoKS0+R2V0Tm90aWZ5KCktPlN0YXJ0RmllbGREcmF3TGF5b3V0KHBOb2RlLCAqZldpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZkhlaWdodCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIEFTU0VSVChmYWxzZSk7Ci0gIH0KLX0KLQotQ0ZYX1NpemVGIENhbGN1bGF0ZUNvbnRhaW5lclNwZWNpZmllZFNpemUoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSkgewotICAqYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSB0cnVlOwotICAqYkNvbnRhaW5lckhlaWdodEF1dG9TaXplID0gdHJ1ZTsKLQotICBYRkFfRWxlbWVudCBlVHlwZSA9IHBGb3JtTm9kZS0+R2V0RWxlbWVudFR5cGUoKTsKLSAgQ1hGQV9NZWFzdXJlbWVudCBtVG1wVmFsdWU7Ci0gIENGWF9TaXplRiBjb250YWluZXJTaXplOwotICBpZiAoKGVUeXBlID09IFhGQV9FbGVtZW50OjpTdWJmb3JtIHx8IGVUeXBlID09IFhGQV9FbGVtZW50OjpFeGNsR3JvdXApICYmCi0gICAgICBwRm9ybU5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9XLCBtVG1wVmFsdWUsIGZhbHNlKSAmJgotICAgICAgbVRtcFZhbHVlLkdldFZhbHVlKCkgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgewotICAgIGNvbnRhaW5lclNpemUud2lkdGggPSBtVG1wVmFsdWUuVG9Vbml0KFhGQV9VTklUX1B0KTsKLSAgICAqYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSBmYWxzZTsKLSAgfQotICBpZiAoKGVUeXBlID09IFhGQV9FbGVtZW50OjpTdWJmb3JtIHx8IGVUeXBlID09IFhGQV9FbGVtZW50OjpFeGNsR3JvdXApICYmCi0gICAgICBwRm9ybU5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9ILCBtVG1wVmFsdWUsIGZhbHNlKSAmJgotICAgICAgbVRtcFZhbHVlLkdldFZhbHVlKCkgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgewotICAgIGNvbnRhaW5lclNpemUuaGVpZ2h0ID0gbVRtcFZhbHVlLlRvVW5pdChYRkFfVU5JVF9QdCk7Ci0gICAgKmJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSA9IGZhbHNlOwotICB9Ci0gIGlmICgqYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgJiYgZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm0gJiYKLSAgICAgIHBGb3JtTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX01heFcsIG1UbXBWYWx1ZSwgZmFsc2UpICYmCi0gICAgICBtVG1wVmFsdWUuR2V0VmFsdWUoKSA+IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7Ci0gICAgY29udGFpbmVyU2l6ZS53aWR0aCA9IG1UbXBWYWx1ZS5Ub1VuaXQoWEZBX1VOSVRfUHQpOwotICAgICpiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSA9IGZhbHNlOwotICB9Ci0gIGlmICgqYkNvbnRhaW5lckhlaWdodEF1dG9TaXplICYmIGVUeXBlID09IFhGQV9FbGVtZW50OjpTdWJmb3JtICYmCi0gICAgICBwRm9ybU5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9NYXhILCBtVG1wVmFsdWUsIGZhbHNlKSAmJgotICAgICAgbVRtcFZhbHVlLkdldFZhbHVlKCkgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgewotICAgIGNvbnRhaW5lclNpemUuaGVpZ2h0ID0gbVRtcFZhbHVlLlRvVW5pdChYRkFfVU5JVF9QdCk7Ci0gICAgKmJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSA9IGZhbHNlOwotICB9Ci0gIHJldHVybiBjb250YWluZXJTaXplOwotfQotCi1DRlhfU2l6ZUYgQ2FsY3VsYXRlQ29udGFpbmVyQ29tcG9uZW50U2l6ZUZyb21Db250ZW50U2l6ZSgKLSAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSwKLSAgICBib29sIGJDb250YWluZXJXaWR0aEF1dG9TaXplLAotICAgIEZYX0ZMT0FUIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoLAotICAgIGJvb2wgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLAotICAgIEZYX0ZMT0FUIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwKLSAgICBjb25zdCBDRlhfU2l6ZUYmIGN1cnJlbnRDb250YWluZXJTaXplKSB7Ci0gIENGWF9TaXplRiBjb21wb25lbnRTaXplID0gY3VycmVudENvbnRhaW5lclNpemU7Ci0gIENYRkFfTm9kZSogcE1hcmdpbk5vZGUgPSBwRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpNYXJnaW4pOwotICBDWEZBX01lYXN1cmVtZW50IG1UbXBWYWx1ZTsKLSAgaWYgKGJDb250YWluZXJXaWR0aEF1dG9TaXplKSB7Ci0gICAgY29tcG9uZW50U2l6ZS53aWR0aCA9IGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoOwotICAgIGlmIChwTWFyZ2luTm9kZSkgewotICAgICAgaWYgKHBNYXJnaW5Ob2RlLT5UcnlNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTGVmdEluc2V0LCBtVG1wVmFsdWUsIGZhbHNlKSkKLSAgICAgICAgY29tcG9uZW50U2l6ZS53aWR0aCArPSBtVG1wVmFsdWUuVG9Vbml0KFhGQV9VTklUX1B0KTsKLSAgICAgIGlmIChwTWFyZ2luTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1JpZ2h0SW5zZXQsIG1UbXBWYWx1ZSwgZmFsc2UpKQotICAgICAgICBjb21wb25lbnRTaXplLndpZHRoICs9IG1UbXBWYWx1ZS5Ub1VuaXQoWEZBX1VOSVRfUHQpOwotICAgIH0KLSAgfQotCi0gIGlmIChiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpIHsKLSAgICBjb21wb25lbnRTaXplLmhlaWdodCA9IGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodDsKLSAgICBpZiAocE1hcmdpbk5vZGUpIHsKLSAgICAgIGlmIChwTWFyZ2luTm9kZS0+VHJ5TWVhc3VyZShYRkFfQVRUUklCVVRFX1RvcEluc2V0LCBtVG1wVmFsdWUsIGZhbHNlKSkKLSAgICAgICAgY29tcG9uZW50U2l6ZS5oZWlnaHQgKz0gbVRtcFZhbHVlLlRvVW5pdChYRkFfVU5JVF9QdCk7Ci0gICAgICBpZiAocE1hcmdpbk5vZGUtPlRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURV9Cb3R0b21JbnNldCwgbVRtcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkgewotICAgICAgICBjb21wb25lbnRTaXplLmhlaWdodCArPSBtVG1wVmFsdWUuVG9Vbml0KFhGQV9VTklUX1B0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGNvbXBvbmVudFNpemU7Ci19Ci0KLXZvaWQgUmVsb2NhdGVUYWJsZVJvd0NlbGxzKAotICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXRSb3csCi0gICAgY29uc3QgQ0ZYX0FycmF5VGVtcGxhdGU8RlhfRkxPQVQ+JiByZ1NwZWNpZmllZENvbHVtbldpZHRocywKLSAgICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0KSB7Ci0gIGJvb2wgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSB0cnVlOwotICBib29sIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSA9IHRydWU7Ci0gIENGWF9TaXplRiBjb250YWluZXJTaXplID0gQ2FsY3VsYXRlQ29udGFpbmVyU3BlY2lmaWVkU2l6ZSgKLSAgICAgIHBMYXlvdXRSb3ctPm1fcEZvcm1Ob2RlLCAmYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsCi0gICAgICAmYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKTsKLSAgQ1hGQV9Ob2RlKiBwTWFyZ2luTm9kZSA9Ci0gICAgICBwTGF5b3V0Um93LT5tX3BGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VsZW1lbnQ6Ok1hcmdpbik7Ci0gIEZYX0ZMT0FUIGZMZWZ0SW5zZXQgPSAwOwotICBGWF9GTE9BVCBmVG9wSW5zZXQgPSAwOwotICBGWF9GTE9BVCBmUmlnaHRJbnNldCA9IDA7Ci0gIEZYX0ZMT0FUIGZCb3R0b21JbnNldCA9IDA7Ci0gIGlmIChwTWFyZ2luTm9kZSkgewotICAgIGZMZWZ0SW5zZXQgPQotICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0xlZnRJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsKLSAgICBmVG9wSW5zZXQgPQotICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1RvcEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOwotICAgIGZSaWdodEluc2V0ID0KLSAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9SaWdodEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOwotICAgIGZCb3R0b21JbnNldCA9Ci0gICAgICAgIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfQm90dG9tSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7Ci0gIH0KLQotICBGWF9GTE9BVCBmQ29udGVudFdpZHRoTGltaXQgPQotICAgICAgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPyBGTFRfTUFYCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbnRhaW5lclNpemUud2lkdGggLSBmTGVmdEluc2V0IC0gZlJpZ2h0SW5zZXQ7Ci0gIEZYX0ZMT0FUIGZDb250ZW50Q3VycmVudEhlaWdodCA9Ci0gICAgICBwTGF5b3V0Um93LT5tX3NTaXplLmhlaWdodCAtIGZUb3BJbnNldCAtIGZCb3R0b21JbnNldDsKLSAgRlhfRkxPQVQgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSAwOwotICBGWF9GTE9BVCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSAwOwotICBGWF9GTE9BVCBmQ3VycmVudENvbFggPSAwOwotICBpbnQzMl90IG5DdXJyZW50Q29sSWR4ID0gMDsKLSAgYm9vbCBiTWV0V2hvbGVSb3dDZWxsID0gZmFsc2U7Ci0KLSAgZm9yIChhdXRvIHBMYXlvdXRDaGlsZCA9Ci0gICAgICAgICAgIHN0YXRpY19jYXN0PENYRkFfQ29udGVudExheW91dEl0ZW0qPihwTGF5b3V0Um93LT5tX3BGaXJzdENoaWxkKTsKLSAgICAgICBwTGF5b3V0Q2hpbGQ7IHBMYXlvdXRDaGlsZCA9IHN0YXRpY19jYXN0PENYRkFfQ29udGVudExheW91dEl0ZW0qPigKLSAgICAgICAgICAgICAgICAgICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fcE5leHRTaWJsaW5nKSkgewotICAgIGludDMyX3Qgbk9yaWdpbmFsQ29sU3BhbiA9Ci0gICAgICAgIHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9Db2xTcGFuKTsKLSAgICBpbnQzMl90IG5Db2xTcGFuID0gbk9yaWdpbmFsQ29sU3BhbjsKLSAgICBGWF9GTE9BVCBmQ29sU3BhbldpZHRoID0gMDsKLSAgICBpZiAobkNvbFNwYW4gPT0gLTEgfHwKLSAgICAgICAgbkN1cnJlbnRDb2xJZHggKyBuQ29sU3BhbiA+IHJnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLkdldFNpemUoKSkgewotICAgICAgbkNvbFNwYW4gPSByZ1NwZWNpZmllZENvbHVtbldpZHRocy5HZXRTaXplKCkgLSBuQ3VycmVudENvbElkeDsKLSAgICB9Ci0gICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbkNvbFNwYW47IGkrKykKLSAgICAgIGZDb2xTcGFuV2lkdGggKz0gcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHNbbkN1cnJlbnRDb2xJZHggKyBpXTsKLQotICAgIGlmIChuQ29sU3BhbiAhPSBuT3JpZ2luYWxDb2xTcGFuKSB7Ci0gICAgICBmQ29sU3BhbldpZHRoID0KLSAgICAgICAgICBiTWV0V2hvbGVSb3dDZWxsID8gMCA6IHN0ZDo6bWF4KGZDb2xTcGFuV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fc1NpemUuaGVpZ2h0KTsKLSAgICB9Ci0gICAgaWYgKG5PcmlnaW5hbENvbFNwYW4gPT0gLTEpCi0gICAgICBiTWV0V2hvbGVSb3dDZWxsID0gdHJ1ZTsKLQotICAgIHBMYXlvdXRDaGlsZC0+bV9zUG9zID0gQ0ZYX1BvaW50RihmQ3VycmVudENvbFgsIDApOwotICAgIHBMYXlvdXRDaGlsZC0+bV9zU2l6ZS53aWR0aCA9IGZDb2xTcGFuV2lkdGg7Ci0gICAgaWYgKCFYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUpKQotICAgICAgY29udGludWU7Ci0KLSAgICBmQ3VycmVudENvbFggKz0gZkNvbFNwYW5XaWR0aDsKLSAgICBuQ3VycmVudENvbElkeCArPSBuQ29sU3BhbjsKLSAgICBGWF9GTE9BVCBmTmV3SGVpZ2h0ID0gYkNvbnRhaW5lckhlaWdodEF1dG9TaXplID8gLTEgOiBmQ29udGVudEN1cnJlbnRIZWlnaHQ7Ci0gICAgVXBkYXRlV2lkZ2V0U2l6ZShwTGF5b3V0Q2hpbGQsICZmQ29sU3BhbldpZHRoLCAmZk5ld0hlaWdodCk7Ci0gICAgcExheW91dENoaWxkLT5tX3NTaXplLmhlaWdodCA9IGZOZXdIZWlnaHQ7Ci0gICAgaWYgKGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSkgewotICAgICAgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0KLSAgICAgICAgICBzdGQ6Om1heChmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsIHBMYXlvdXRDaGlsZC0+bV9zU2l6ZS5oZWlnaHQpOwotICAgIH0KLSAgfQotCi0gIGlmIChiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpIHsKLSAgICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXRDaGlsZCA9Ci0gICAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXRSb3ctPm1fcEZpcnN0Q2hpbGQ7Ci0gICAgICAgICBwTGF5b3V0Q2hpbGQ7Ci0gICAgICAgICBwTGF5b3V0Q2hpbGQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcExheW91dENoaWxkLT5tX3BOZXh0U2libGluZykgewotICAgICAgVXBkYXRlV2lkZ2V0U2l6ZShwTGF5b3V0Q2hpbGQsICZwTGF5b3V0Q2hpbGQtPm1fc1NpemUud2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICZmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQpOwotICAgICAgRlhfRkxPQVQgZk9sZENoaWxkSGVpZ2h0ID0gcExheW91dENoaWxkLT5tX3NTaXplLmhlaWdodDsKLSAgICAgIHBMYXlvdXRDaGlsZC0+bV9zU2l6ZS5oZWlnaHQgPSBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQ7Ci0gICAgICBDWEZBX05vZGUqIHBQYXJhTm9kZSA9Ci0gICAgICAgICAgcExheW91dENoaWxkLT5tX3BGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VsZW1lbnQ6OlBhcmEpOwotICAgICAgaWYgKHBQYXJhTm9kZSAmJiBwTGF5b3V0Q2hpbGQtPm1fcEZpcnN0Q2hpbGQpIHsKLSAgICAgICAgRlhfRkxPQVQgZk9mZkhlaWdodCA9IGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCAtIGZPbGRDaGlsZEhlaWdodDsKLSAgICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZVZUeXBlID0gcFBhcmFOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfVkFsaWduKTsKLSAgICAgICAgc3dpdGNoIChlVlR5cGUpIHsKLSAgICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZToKLSAgICAgICAgICAgIGZPZmZIZWlnaHQgPSBmT2ZmSGVpZ2h0IC8gMjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tOgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ub3A6Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGZPZmZIZWlnaHQgPSAwOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZPZmZIZWlnaHQgPiAwKSB7Ci0gICAgICAgICAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwSW5uZXJMYXlvdXRDaGlsZCA9Ci0gICAgICAgICAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXRDaGlsZC0+bV9wRmlyc3RDaGlsZDsKLSAgICAgICAgICAgICAgIHBJbm5lckxheW91dENoaWxkOwotICAgICAgICAgICAgICAgcElubmVyTGF5b3V0Q2hpbGQgPQotICAgICAgICAgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwSW5uZXJMYXlvdXRDaGlsZC0+bV9wTmV4dFNpYmxpbmcpIHsKLSAgICAgICAgICAgIHBJbm5lckxheW91dENoaWxkLT5tX3NQb3MueSArPSBmT2ZmSGVpZ2h0OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSkgewotICAgIEZYX0ZMT0FUIGZDaGlsZFN1cHBsaWVkV2lkdGggPSBmQ3VycmVudENvbFg7Ci0gICAgaWYgKGZDb250ZW50V2lkdGhMaW1pdCA8IEZMVF9NQVggJiYKLSAgICAgICAgZkNvbnRlbnRXaWR0aExpbWl0ID4gZkNoaWxkU3VwcGxpZWRXaWR0aCkgewotICAgICAgZkNoaWxkU3VwcGxpZWRXaWR0aCA9IGZDb250ZW50V2lkdGhMaW1pdDsKLSAgICB9Ci0gICAgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPQotICAgICAgICBzdGQ6Om1heChmQ29udGVudENhbGN1bGF0ZWRXaWR0aCwgZkNoaWxkU3VwcGxpZWRXaWR0aCk7Ci0gIH0gZWxzZSB7Ci0gICAgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSBjb250YWluZXJTaXplLndpZHRoIC0gZkxlZnRJbnNldCAtIGZSaWdodEluc2V0OwotICB9Ci0KLSAgaWYgKHBMYXlvdXRSb3ctPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0KSA9PQotICAgICAgWEZBX0FUVFJJQlVURUVOVU1fUmxfcm93KSB7Ci0gICAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0Q2hpbGQgPQotICAgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwTGF5b3V0Um93LT5tX3BGaXJzdENoaWxkOwotICAgICAgICAgcExheW91dENoaWxkOwotICAgICAgICAgcExheW91dENoaWxkID0gKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXRDaGlsZC0+bV9wTmV4dFNpYmxpbmcpIHsKLSAgICAgIHBMYXlvdXRDaGlsZC0+bV9zUG9zLnggPSBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExheW91dENoaWxkLT5tX3NQb3MueCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExheW91dENoaWxkLT5tX3NTaXplLndpZHRoOwotICAgIH0KLSAgfQotICBwTGF5b3V0Um93LT5tX3NTaXplID0gQ2FsY3VsYXRlQ29udGFpbmVyQ29tcG9uZW50U2l6ZUZyb21Db250ZW50U2l6ZSgKLSAgICAgIHBMYXlvdXRSb3ctPm1fcEZvcm1Ob2RlLCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsCi0gICAgICBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwgY29udGFpbmVyU2l6ZSk7Ci19Ci0KLXZvaWQgVXBkYXRlUGVuZGluZ0l0ZW1MYXlvdXQoQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwUHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSkgewotICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0ID0KLSAgICAgIHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCk7Ci0gIHN3aXRjaCAoZUxheW91dCkgewotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUm93OgotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmxfcm93OgotICAgICAgUmVsb2NhdGVUYWJsZVJvd0NlbGxzKHBMYXlvdXRJdGVtLCBwUHJvY2Vzc29yLT5tX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVMYXlvdXQpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgQWRkVHJhaWxlckJlZm9yZVNwbGl0KENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFByb2Nlc3NvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIGZTcGxpdFBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBUcmFpbGVyTGF5b3V0SXRlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlVzZUluaGVyaXRlZCkgewotICBpZiAoIXBUcmFpbGVyTGF5b3V0SXRlbSkKLSAgICByZXR1cm47Ci0KLSAgRlhfRkxPQVQgZkhlaWdodCA9IHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS5oZWlnaHQ7Ci0gIGlmIChiVXNlSW5oZXJpdGVkKSB7Ci0gICAgRlhfRkxPQVQgZk5ld1NwbGl0UG9zID0gMDsKLSAgICBpZiAoZlNwbGl0UG9zIC0gZkhlaWdodCA+IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKQotICAgICAgZk5ld1NwbGl0UG9zID0gcFByb2Nlc3Nvci0+RmluZFNwbGl0UG9zKGZTcGxpdFBvcyAtIGZIZWlnaHQpOwotICAgIGlmIChmTmV3U3BsaXRQb3MgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikKLSAgICAgIHBQcm9jZXNzb3ItPlNwbGl0TGF5b3V0SXRlbShmTmV3U3BsaXRQb3MpOwotICAgIHJldHVybjsKLSAgfQotCi0gIFVwZGF0ZVBlbmRpbmdJdGVtTGF5b3V0KHBQcm9jZXNzb3IsIHBUcmFpbGVyTGF5b3V0SXRlbSk7Ci0gIENYRkFfTm9kZSogcE1hcmdpbk5vZGUgPQotICAgICAgcFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpNYXJnaW4pOwotICBGWF9GTE9BVCBmTGVmdEluc2V0ID0gMDsKLSAgRlhfRkxPQVQgZlRvcEluc2V0ID0gMDsKLSAgRlhfRkxPQVQgZlJpZ2h0SW5zZXQgPSAwOwotICBGWF9GTE9BVCBmQm90dG9tSW5zZXQgPSAwOwotICBpZiAocE1hcmdpbk5vZGUpIHsKLSAgICBmTGVmdEluc2V0ID0KLSAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7Ci0gICAgZlRvcEluc2V0ID0KLSAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Ub3BJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsKLSAgICBmUmlnaHRJbnNldCA9Ci0gICAgICAgIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmlnaHRJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsKLSAgICBmQm90dG9tSW5zZXQgPQotICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOwotICB9Ci0KLSAgaWYgKCFwUHJvY2Vzc29yLT5Jc0FkZE5ld1Jvd0ZvclRyYWlsZXIocFRyYWlsZXJMYXlvdXRJdGVtKSkgewotICAgIHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zUG9zLnkgPSBwUHJvY2Vzc29yLT5tX2ZMYXN0Um93WTsKLSAgICBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1Bvcy54ID0gcFByb2Nlc3Nvci0+bV9mTGFzdFJvd1dpZHRoOwotICAgIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fc1NpemUud2lkdGggKz0KLSAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NTaXplLndpZHRoOwotICAgIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPkFkZENoaWxkKHBUcmFpbGVyTGF5b3V0SXRlbSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgRlhfRkxPQVQgZk5ld1NwbGl0UG9zID0gMDsKLSAgaWYgKGZTcGxpdFBvcyAtIGZIZWlnaHQgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikKLSAgICBmTmV3U3BsaXRQb3MgPSBwUHJvY2Vzc29yLT5GaW5kU3BsaXRQb3MoZlNwbGl0UG9zIC0gZkhlaWdodCk7Ci0KLSAgaWYgKGZOZXdTcGxpdFBvcyA+IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7Ci0gICAgcFByb2Nlc3Nvci0+U3BsaXRMYXlvdXRJdGVtKGZOZXdTcGxpdFBvcyk7Ci0gICAgcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NQb3MueSA9IGZOZXdTcGxpdFBvcyAtIGZUb3BJbnNldCAtIGZCb3R0b21JbnNldDsKLSAgfSBlbHNlIHsKLSAgICBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1Bvcy55ID0gZlNwbGl0UG9zIC0gZlRvcEluc2V0IC0gZkJvdHRvbUluc2V0OwotICB9Ci0KLSAgc3dpdGNoIChwVHJhaWxlckxheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfSEFsaWduKSkgewotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmlnaHQ6Ci0gICAgICBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1Bvcy54ID0gcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9zU2l6ZS53aWR0aCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJpZ2h0SW5zZXQgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS53aWR0aDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ2VudGVyOgotICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLT5tX3NQb3MueCA9Ci0gICAgICAgICAgKHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fc1NpemUud2lkdGggLSBmTGVmdEluc2V0IC0gZlJpZ2h0SW5zZXQgLQotICAgICAgICAgICBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1NpemUud2lkdGgpIC8KLSAgICAgICAgICAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0OgotICAgIGRlZmF1bHQ6Ci0gICAgICBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1Bvcy54ID0gZkxlZnRJbnNldDsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fc1NpemUuaGVpZ2h0ICs9IGZIZWlnaHQ7Ci0gIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPkFkZENoaWxkKHBUcmFpbGVyTGF5b3V0SXRlbSk7Ci19Ci0KLXZvaWQgQWRkTGVhZGVyQWZ0ZXJTcGxpdChDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQcm9jZXNzb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcExlYWRlckxheW91dEl0ZW0pIHsKLSAgVXBkYXRlUGVuZGluZ0l0ZW1MYXlvdXQocFByb2Nlc3NvciwgcExlYWRlckxheW91dEl0ZW0pOwotCi0gIENYRkFfTm9kZSogcE1hcmdpbk5vZGUgPQotICAgICAgcFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpNYXJnaW4pOwotICBGWF9GTE9BVCBmTGVmdEluc2V0ID0gMDsKLSAgRlhfRkxPQVQgZlJpZ2h0SW5zZXQgPSAwOwotICBpZiAocE1hcmdpbk5vZGUpIHsKLSAgICBmTGVmdEluc2V0ID0KLSAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7Ci0gICAgZlJpZ2h0SW5zZXQgPQotICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1JpZ2h0SW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7Ci0gIH0KLQotICBGWF9GTE9BVCBmSGVpZ2h0ID0gcExlYWRlckxheW91dEl0ZW0tPm1fc1NpemUuaGVpZ2h0OwotICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBDaGlsZEl0ZW0gPQotICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsKLSAgICAgICBwQ2hpbGRJdGVtOwotICAgICAgIHBDaGlsZEl0ZW0gPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsKLSAgICBwQ2hpbGRJdGVtLT5tX3NQb3MueSArPSBmSGVpZ2h0OwotICB9Ci0gIHBMZWFkZXJMYXlvdXRJdGVtLT5tX3NQb3MueSA9IDA7Ci0KLSAgc3dpdGNoIChwTGVhZGVyTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9IQWxpZ24pKSB7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoKLSAgICAgIHBMZWFkZXJMYXlvdXRJdGVtLT5tX3NQb3MueCA9IHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fc1NpemUud2lkdGggLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlJpZ2h0SW5zZXQgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcExlYWRlckxheW91dEl0ZW0tPm1fc1NpemUud2lkdGg7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0NlbnRlcjoKLSAgICAgIHBMZWFkZXJMYXlvdXRJdGVtLT5tX3NQb3MueCA9Ci0gICAgICAgICAgKHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fc1NpemUud2lkdGggLSBmTGVmdEluc2V0IC0gZlJpZ2h0SW5zZXQgLQotICAgICAgICAgICBwTGVhZGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS53aWR0aCkgLwotICAgICAgICAgIDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6Ci0gICAgZGVmYXVsdDoKLSAgICAgIHBMZWFkZXJMYXlvdXRJdGVtLT5tX3NQb3MueCA9IGZMZWZ0SW5zZXQ7Ci0gICAgICBicmVhazsKLSAgfQotICBwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3NTaXplLmhlaWdodCArPSBmSGVpZ2h0OwotICBwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5BZGRDaGlsZChwTGVhZGVyTGF5b3V0SXRlbSk7Ci19Ci0KLXZvaWQgQWRkUGVuZGluZ05vZGUoQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwUHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQZW5kaW5nTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBiQnJlYWtQZW5kaW5nKSB7Ci0gIHBQcm9jZXNzb3ItPm1fUGVuZGluZ05vZGVzLnB1c2hfYmFjayhwUGVuZGluZ05vZGUpOwotICBwUHJvY2Vzc29yLT5tX2JCcmVha1BlbmRpbmcgPSBiQnJlYWtQZW5kaW5nOwotfQotCi1GWF9GTE9BVCBJbnNlcnRQZW5kaW5nSXRlbXMoQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwUHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEN1ckNoaWxkTm9kZSkgewotICBGWF9GTE9BVCBmVG90YWxIZWlnaHQgPSAwOwotICBpZiAocFByb2Nlc3Nvci0+bV9QZW5kaW5nTm9kZXMuZW1wdHkoKSkKLSAgICByZXR1cm4gZlRvdGFsSGVpZ2h0OwotCi0gIGlmICghcFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbSkgewotICAgIHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0gPQotICAgICAgICBwUHJvY2Vzc29yLT5DcmVhdGVDb250ZW50TGF5b3V0SXRlbShwQ3VyQ2hpbGROb2RlKTsKLSAgICBwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3NTaXplLmNsZWFyKCk7Ci0gIH0KLQotICB3aGlsZSAoIXBQcm9jZXNzb3ItPm1fUGVuZGluZ05vZGVzLmVtcHR5KCkpIHsKLSAgICBhdXRvIHBQZW5kaW5nUHJvY2Vzc29yID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcj4oCi0gICAgICAgIHBQcm9jZXNzb3ItPm1fUGVuZGluZ05vZGVzLmZyb250KCksIG51bGxwdHIpOwotICAgIHBQcm9jZXNzb3ItPm1fUGVuZGluZ05vZGVzLnBvcF9mcm9udCgpOwotICAgIHBQZW5kaW5nUHJvY2Vzc29yLT5Eb0xheW91dChmYWxzZSwgRkxUX01BWCwgRkxUX01BWCwgbnVsbHB0cik7Ci0gICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFBlbmRpbmdMYXlvdXRJdGVtID0KLSAgICAgICAgcFBlbmRpbmdQcm9jZXNzb3ItPkhhc0xheW91dEl0ZW0oKQotICAgICAgICAgICAgPyBwUGVuZGluZ1Byb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKQotICAgICAgICAgICAgOiBudWxscHRyOwotICAgIGlmIChwUGVuZGluZ0xheW91dEl0ZW0pIHsKLSAgICAgIEFkZExlYWRlckFmdGVyU3BsaXQocFByb2Nlc3NvciwgcFBlbmRpbmdMYXlvdXRJdGVtKTsKLSAgICAgIGlmIChwUHJvY2Vzc29yLT5tX2JCcmVha1BlbmRpbmcpCi0gICAgICAgIGZUb3RhbEhlaWdodCArPSBwUGVuZGluZ0xheW91dEl0ZW0tPm1fc1NpemUuaGVpZ2h0OwotICAgIH0KLSAgfQotICByZXR1cm4gZlRvdGFsSGVpZ2h0OwotfQotCi1YRkFfQVRUUklCVVRFRU5VTSBHZXRMYXlvdXQoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsIGJvb2wqIGJSb290Rm9yY2VUYikgewotICAqYlJvb3RGb3JjZVRiID0gZmFsc2U7Ci0gIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXRNb2RlOwotICBpZiAocEZvcm1Ob2RlLT5UcnlFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0LCBlTGF5b3V0TW9kZSwgZmFsc2UpKQotICAgIHJldHVybiBlTGF5b3V0TW9kZTsKLQotICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gcEZvcm1Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsKLSAgaWYgKHBQYXJlbnROb2RlICYmIHBQYXJlbnROb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpGb3JtKSB7Ci0gICAgKmJSb290Rm9yY2VUYiA9IHRydWU7Ci0gICAgcmV0dXJuIFhGQV9BVFRSSUJVVEVFTlVNX1RiOwotICB9Ci0gIHJldHVybiBYRkFfQVRUUklCVVRFRU5VTV9Qb3NpdGlvbjsKLX0KLQotYm9vbCBFeGlzdENvbnRhaW5lcktlZXAoQ1hGQV9Ob2RlKiBwQ3VyTm9kZSwgYm9vbCBiUHJlRmluZCkgewotICBpZiAoIXBDdXJOb2RlIHx8ICFYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKHBDdXJOb2RlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgWEZBX05PREVJVEVNIGVJdGVtVHlwZSA9IFhGQV9OT0RFSVRFTV9QcmV2U2libGluZzsKLSAgaWYgKCFiUHJlRmluZCkKLSAgICBlSXRlbVR5cGUgPSBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmc7Ci0KLSAgQ1hGQV9Ob2RlKiBwUHJlQ29udGFpbmVyID0KLSAgICAgIHBDdXJOb2RlLT5HZXROb2RlSXRlbShlSXRlbVR5cGUsIFhGQV9PYmplY3RUeXBlOjpDb250YWluZXJOb2RlKTsKLSAgaWYgKCFwUHJlQ29udGFpbmVyKQotICAgIHJldHVybiBmYWxzZTsKLQotICBDWEZBX05vZGUqIHBLZWVwID0gcEN1ck5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpLZWVwKTsKLSAgaWYgKHBLZWVwKSB7Ci0gICAgWEZBX0FUVFJJQlVURUVOVU0gZVByZXZpb3VzOwotICAgIFhGQV9BVFRSSUJVVEUgZUtlZXBUeXBlID0gWEZBX0FUVFJJQlVURV9QcmV2aW91czsKLSAgICBpZiAoIWJQcmVGaW5kKQotICAgICAgZUtlZXBUeXBlID0gWEZBX0FUVFJJQlVURV9OZXh0OwotCi0gICAgaWYgKHBLZWVwLT5UcnlFbnVtKGVLZWVwVHlwZSwgZVByZXZpb3VzLCBmYWxzZSkpIHsKLSAgICAgIGlmIChlUHJldmlvdXMgPT0gWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWEgfHwKLSAgICAgICAgICBlUHJldmlvdXMgPT0gWEZBX0FUVFJJQlVURUVOVU1fUGFnZUFyZWEpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcEtlZXAgPSBwUHJlQ29udGFpbmVyLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRWxlbWVudDo6S2VlcCk7Ci0gIGlmICghcEtlZXApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIFhGQV9BVFRSSUJVVEUgZUtlZXBUeXBlID0gWEZBX0FUVFJJQlVURV9OZXh0OwotICBpZiAoIWJQcmVGaW5kKQotICAgIGVLZWVwVHlwZSA9IFhGQV9BVFRSSUJVVEVfUHJldmlvdXM7Ci0KLSAgWEZBX0FUVFJJQlVURUVOVU0gZU5leHQ7Ci0gIGlmICghcEtlZXAtPlRyeUVudW0oZUtlZXBUeXBlLCBlTmV4dCwgZmFsc2UpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGVOZXh0ID09IFhGQV9BVFRSSUJVVEVFTlVNX0NvbnRlbnRBcmVhIHx8Ci0gICAgICBlTmV4dCA9PSBYRkFfQVRUUklCVVRFRU5VTV9QYWdlQXJlYSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBGaW5kQnJlYWtOb2RlKENYRkFfTm9kZSogcENvbnRhaW5lck5vZGUsCi0gICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiYgcEN1ckFjdGlvbk5vZGUsCi0gICAgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXMqIG5DdXJTdGFnZSwKLSAgICAgICAgICAgICAgICAgICBib29sIGJCcmVha0JlZm9yZSkgewotICBib29sIGJGaW5kUnMgPSBmYWxzZTsKLSAgZm9yIChDWEZBX05vZGUqIHBCcmVha05vZGUgPSBwQ29udGFpbmVyTm9kZTsgcEJyZWFrTm9kZTsKLSAgICAgICBwQnJlYWtOb2RlID0gcEJyZWFrTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgewotICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZVR5cGUgPSBYRkFfQVRUUklCVVRFX0JlZm9yZTsKLSAgICBpZiAoIWJCcmVha0JlZm9yZSkKLSAgICAgIGVBdHRyaWJ1dGVUeXBlID0gWEZBX0FUVFJJQlVURV9BZnRlcjsKLQotICAgIHN3aXRjaCAocEJyZWFrTm9kZS0+R2V0RWxlbWVudFR5cGUoKSkgewotICAgICAgY2FzZSBYRkFfRWxlbWVudDo6QnJlYWtCZWZvcmU6IHsKLSAgICAgICAgaWYgKGJCcmVha0JlZm9yZSkgewotICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gcEJyZWFrTm9kZTsKLSAgICAgICAgICAqbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkJyZWFrQmVmb3JlOwotICAgICAgICAgIGJGaW5kUnMgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBYRkFfRWxlbWVudDo6QnJlYWtBZnRlcjogewotICAgICAgICBpZiAoIWJCcmVha0JlZm9yZSkgewotICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gcEJyZWFrTm9kZTsKLSAgICAgICAgICAqbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkJyZWFrQWZ0ZXI7Ci0gICAgICAgICAgYkZpbmRScyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFhGQV9FbGVtZW50OjpCcmVhazoKLSAgICAgICAgaWYgKHBCcmVha05vZGUtPkdldEVudW0oZUF0dHJpYnV0ZVR5cGUpICE9IFhGQV9BVFRSSUJVVEVFTlVNX0F1dG8pIHsKLSAgICAgICAgICBwQ3VyQWN0aW9uTm9kZSA9IHBCcmVha05vZGU7Ci0gICAgICAgICAgKm5DdXJTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzOjpCcmVha0JlZm9yZTsKLSAgICAgICAgICBpZiAoIWJCcmVha0JlZm9yZSkKLSAgICAgICAgICAgICpuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6QnJlYWtBZnRlcjsKLQotICAgICAgICAgIGJGaW5kUnMgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChiRmluZFJzKQotICAgICAgYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIGJGaW5kUnM7Ci19Ci0KLXZvaWQgRGVsZXRlTGF5b3V0R2VuZXJhdGVkTm9kZShDWEZBX05vZGUqIHBHZW5lcmF0ZU5vZGUpIHsKLSAgQ1hGQV9GRk5vdGlmeSogcE5vdGlmeSA9IHBHZW5lcmF0ZU5vZGUtPkdldERvY3VtZW50KCktPkdldE5vdGlmeSgpOwotICBDWEZBX0xheW91dFByb2Nlc3NvciogcERvY0xheW91dCA9Ci0gICAgICBwR2VuZXJhdGVOb2RlLT5HZXREb2N1bWVudCgpLT5HZXREb2NMYXlvdXQoKTsKLSAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFOb2RlPiBzSXRlcmF0b3IoCi0gICAgICBwR2VuZXJhdGVOb2RlKTsKLSAgZm9yIChDWEZBX05vZGUqIHBOb2RlID0gc0l0ZXJhdG9yLkdldEN1cnJlbnQoKTsgcE5vZGU7Ci0gICAgICAgcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpKSB7Ci0gICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcEN1ckxheW91dEl0ZW0gPQotICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcE5vZGUtPkdldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZKTsKLSAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTmV4dExheW91dEl0ZW0gPSBudWxscHRyOwotICAgIHdoaWxlIChwQ3VyTGF5b3V0SXRlbSkgewotICAgICAgcE5leHRMYXlvdXRJdGVtID0gcEN1ckxheW91dEl0ZW0tPm1fcE5leHQ7Ci0gICAgICBwTm90aWZ5LT5PbkxheW91dEl0ZW1SZW1vdmluZyhwRG9jTGF5b3V0LCBwQ3VyTGF5b3V0SXRlbSk7Ci0gICAgICBkZWxldGUgcEN1ckxheW91dEl0ZW07Ci0gICAgICBwQ3VyTGF5b3V0SXRlbSA9IHBOZXh0TGF5b3V0SXRlbTsKLSAgICB9Ci0gIH0KLSAgcEdlbmVyYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCktPlJlbW92ZUNoaWxkKHBHZW5lcmF0ZU5vZGUpOwotfQotCi11aW50OF90IEhBbGlnbkVudW1Ub0ludChYRkFfQVRUUklCVVRFRU5VTSBlSEFsaWduKSB7Ci0gIHN3aXRjaCAoZUhBbGlnbikgewotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ2VudGVyOgotICAgICAgcmV0dXJuIDE7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoKLSAgICAgIHJldHVybiAyOwotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTGVmdDoKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQgSW5zZXJ0Rmxvd2VkSXRlbSgKLSAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBUaGlzLAotICAgIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogcFByb2Nlc3NvciwKLSAgICBib29sIGJDb250YWluZXJXaWR0aEF1dG9TaXplLAotICAgIGJvb2wgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLAotICAgIEZYX0ZMT0FUIGZDb250YWluZXJIZWlnaHQsCi0gICAgWEZBX0FUVFJJQlVURUVOVU0gZUZsb3dTdHJhdGVneSwKLSAgICB1aW50OF90KiB1Q3VySEFsaWduU3RhdGUsCi0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+ICgmcmdDdXJMaW5lTGF5b3V0SXRlbXMpWzNdLAotICAgIGJvb2wgYlVzZUJyZWFrQ29udHJvbCwKLSAgICBGWF9GTE9BVCBmQXZhaWxIZWlnaHQsCi0gICAgRlhfRkxPQVQgZlJlYWxIZWlnaHQsCi0gICAgRlhfRkxPQVQgZkNvbnRlbnRXaWR0aExpbWl0LAotICAgIEZYX0ZMT0FUKiBmQ29udGVudEN1clJvd1ksCi0gICAgRlhfRkxPQVQqIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCwKLSAgICBGWF9GTE9BVCogZkNvbnRlbnRDdXJSb3dIZWlnaHQsCi0gICAgYm9vbCogYkFkZGVkSXRlbUluUm93LAotICAgIGJvb2wqIGJGb3JjZUVuZFBhZ2UsCi0gICAgQ1hGQV9MYXlvdXRDb250ZXh0KiBwTGF5b3V0Q29udGV4dCwKLSAgICBib29sIGJOZXdSb3cpIHsKLSAgYm9vbCBiVGFrZVNwYWNlID0KLSAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UocFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUpOwotICB1aW50OF90IHVIQWxpZ24gPQotICAgICAgSEFsaWduRW51bVRvSW50KHBUaGlzLT5tX3BDdXJDaGlsZE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9IQWxpZ24pKTsKLSAgaWYgKGJDb250YWluZXJXaWR0aEF1dG9TaXplKQotICAgIHVIQWxpZ24gPSAwOwotCi0gIGlmICgoZUZsb3dTdHJhdGVneSAhPSBYRkFfQVRUUklCVVRFRU5VTV9SbF90YiAmJgotICAgICAgIHVIQWxpZ24gPCAqdUN1ckhBbGlnblN0YXRlKSB8fAotICAgICAgKGVGbG93U3RyYXRlZ3kgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmxfdGIgJiYKLSAgICAgICB1SEFsaWduID4gKnVDdXJIQWxpZ25TdGF0ZSkpIHsKLSAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OlJvd0Z1bGxCcmVhazsKLSAgfQotCi0gICp1Q3VySEFsaWduU3RhdGUgPSB1SEFsaWduOwotICBib29sIGJJc093blNwbGl0ID0KLSAgICAgIHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLT5HZXRJbnRhY3QoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOwotICBib29sIGJVc2VSZWFsSGVpZ2h0ID0KLSAgICAgIGJUYWtlU3BhY2UgJiYgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplICYmIGJJc093blNwbGl0ICYmCi0gICAgICBwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCktPkdldEludGFjdCgpID09Ci0gICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fTm9uZTsKLSAgYm9vbCBiSXNUcmFuc0hlaWdodCA9IGJUYWtlU3BhY2U7Ci0gIGlmIChiSXNUcmFuc0hlaWdodCAmJiAhYklzT3duU3BsaXQpIHsKLSAgICBib29sIGJSb290Rm9yY2VUYiA9IGZhbHNlOwotICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXRTdHJhdGVneSA9Ci0gICAgICAgIEdldExheW91dChwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZSwgJmJSb290Rm9yY2VUYik7Ci0gICAgaWYgKGVMYXlvdXRTdHJhdGVneSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Mcl90YiB8fAotICAgICAgICBlTGF5b3V0U3RyYXRlZ3kgPT0gWEZBX0FUVFJJQlVURUVOVU1fUmxfdGIpIHsKLSAgICAgIGJJc1RyYW5zSGVpZ2h0ID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgYm9vbCBiVXNlSW5oZXJpdGVkID0gZmFsc2U7Ci0gIENYRkFfTGF5b3V0Q29udGV4dCBsYXlvdXRDb250ZXh0OwotICBpZiAocFRoaXMtPm1fcFBhZ2VNZ3IpIHsKLSAgICBDWEZBX05vZGUqIHBPdmVyZmxvd05vZGUgPQotICAgICAgICBwVGhpcy0+bV9wUGFnZU1nci0+UXVlcnlPdmVyZmxvdyhwVGhpcy0+bV9wRm9ybU5vZGUpOwotICAgIGlmIChwT3ZlcmZsb3dOb2RlKSB7Ci0gICAgICBsYXlvdXRDb250ZXh0Lm1fcE92ZXJmbG93Tm9kZSA9IHBPdmVyZmxvd05vZGU7Ci0gICAgICBsYXlvdXRDb250ZXh0Lm1fcE92ZXJmbG93UHJvY2Vzc29yID0gcFRoaXM7Ci0gICAgICBwTGF5b3V0Q29udGV4dCA9ICZsYXlvdXRDb250ZXh0OwotICAgIH0KLSAgfQotCi0gIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IGVSZXRWYWx1ZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpEb25lOwotICBpZiAoIWJOZXdSb3cgfHwKLSAgICAgIHBQcm9jZXNzb3ItPm1fZVByZVByb2Nlc3NScyA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6RG9uZSkgewotICAgIGVSZXRWYWx1ZSA9IHBQcm9jZXNzb3ItPkRvTGF5b3V0KAotICAgICAgICBiVGFrZVNwYWNlID8gYlVzZUJyZWFrQ29udHJvbCA6IGZhbHNlLAotICAgICAgICBiVXNlUmVhbEhlaWdodCA/IGZSZWFsSGVpZ2h0IC0gKmZDb250ZW50Q3VyUm93WSA6IEZMVF9NQVgsCi0gICAgICAgIGJJc1RyYW5zSGVpZ2h0ID8gZlJlYWxIZWlnaHQgLSAqZkNvbnRlbnRDdXJSb3dZIDogRkxUX01BWCwKLSAgICAgICAgcExheW91dENvbnRleHQpOwotICAgIHBQcm9jZXNzb3ItPm1fZVByZVByb2Nlc3NScyA9IGVSZXRWYWx1ZTsKLSAgfSBlbHNlIHsKLSAgICBlUmV0VmFsdWUgPSBwUHJvY2Vzc29yLT5tX2VQcmVQcm9jZXNzUnM7Ci0gICAgcFByb2Nlc3Nvci0+bV9lUHJlUHJvY2Vzc1JzID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OkRvbmU7Ci0gIH0KLSAgaWYgKHBQcm9jZXNzb3ItPkhhc0xheW91dEl0ZW0oKSA9PSBmYWxzZSkKLSAgICByZXR1cm4gZVJldFZhbHVlOwotCi0gIENGWF9TaXplRiBjaGlsZFNpemUgPSBwUHJvY2Vzc29yLT5HZXRDdXJyZW50Q29tcG9uZW50U2l6ZSgpOwotICBpZiAoYlVzZVJlYWxIZWlnaHQgJiYgZlJlYWxIZWlnaHQgPCBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgewotICAgIGZSZWFsSGVpZ2h0ID0gRkxUX01BWDsKLSAgICBmQXZhaWxIZWlnaHQgPSBGTFRfTUFYOwotICB9Ci0gIGlmIChiVGFrZVNwYWNlICYmIChjaGlsZFNpemUud2lkdGggPgotICAgICAgICAgICAgICAgICAgICAgKmZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCArIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSAmJgotICAgICAgKGZDb250ZW50V2lkdGhMaW1pdCAtICpmQ29udGVudEN1clJvd0F2YWlsV2lkdGggPgotICAgICAgIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSkgewotICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6Um93RnVsbEJyZWFrOwotICB9Ci0KLSAgQ1hGQV9Ob2RlKiBwT3ZlcmZsb3dMZWFkZXJOb2RlID0gbnVsbHB0cjsKLSAgQ1hGQV9Ob2RlKiBwT3ZlcmZsb3dUcmFpbGVyTm9kZSA9IG51bGxwdHI7Ci0gIENYRkFfTm9kZSogcEZvcm1Ob2RlID0gbnVsbHB0cjsKLSAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFRyYWlsZXJMYXlvdXRJdGVtID0gbnVsbHB0cjsKLSAgYm9vbCBiSXNBZGRUcmFpbGVySGVpZ2h0ID0gZmFsc2U7Ci0gIGlmIChwVGhpcy0+bV9wUGFnZU1nciAmJgotICAgICAgcFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUtPkdldEludGFjdCgpID09IFhGQV9BVFRSSUJVVEVFTlVNX05vbmUpIHsKLSAgICBwRm9ybU5vZGUgPSBwVGhpcy0+bV9wUGFnZU1nci0+UXVlcnlPdmVyZmxvdyhwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZSk7Ci0gICAgaWYgKCFwRm9ybU5vZGUgJiYgcExheW91dENvbnRleHQgJiYgcExheW91dENvbnRleHQtPm1fcE92ZXJmbG93UHJvY2Vzc29yKSB7Ci0gICAgICBwRm9ybU5vZGUgPSBwTGF5b3V0Q29udGV4dC0+bV9wT3ZlcmZsb3dOb2RlOwotICAgICAgYlVzZUluaGVyaXRlZCA9IHRydWU7Ci0gICAgfQotICAgIGlmIChwVGhpcy0+bV9wUGFnZU1nci0+UHJvY2Vzc092ZXJmbG93KHBGb3JtTm9kZSwgcE92ZXJmbG93TGVhZGVyTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3ZlcmZsb3dUcmFpbGVyTm9kZSwgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7Ci0gICAgICBpZiAocFByb2Nlc3Nvci0+SnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwT3ZlcmZsb3dUcmFpbGVyTm9kZSkpIHsKLSAgICAgICAgaWYgKHBPdmVyZmxvd1RyYWlsZXJOb2RlKSB7Ci0gICAgICAgICAgYXV0byBwT3ZlcmZsb3dMZWFkZXJQcm9jZXNzb3IgPQotICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yPihwT3ZlcmZsb3dUcmFpbGVyTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7Ci0gICAgICAgICAgcE92ZXJmbG93TGVhZGVyUHJvY2Vzc29yLT5Eb0xheW91dChmYWxzZSwgRkxUX01BWCwgRkxUX01BWCwgbnVsbHB0cik7Ci0gICAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtID0KLSAgICAgICAgICAgICAgcE92ZXJmbG93TGVhZGVyUHJvY2Vzc29yLT5IYXNMYXlvdXRJdGVtKCkKLSAgICAgICAgICAgICAgICAgID8gcE92ZXJmbG93TGVhZGVyUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpCi0gICAgICAgICAgICAgICAgICA6IG51bGxwdHI7Ci0gICAgICAgIH0KLQotICAgICAgICBiSXNBZGRUcmFpbGVySGVpZ2h0ID0KLSAgICAgICAgICAgIGJVc2VJbmhlcml0ZWQKLSAgICAgICAgICAgICAgICA/IHBUaGlzLT5Jc0FkZE5ld1Jvd0ZvclRyYWlsZXIocFRyYWlsZXJMYXlvdXRJdGVtKQotICAgICAgICAgICAgICAgIDogcFByb2Nlc3Nvci0+SXNBZGROZXdSb3dGb3JUcmFpbGVyKHBUcmFpbGVyTGF5b3V0SXRlbSk7Ci0gICAgICAgIGlmIChiSXNBZGRUcmFpbGVySGVpZ2h0KSB7Ci0gICAgICAgICAgY2hpbGRTaXplLmhlaWdodCArPSBwVHJhaWxlckxheW91dEl0ZW0tPm1fc1NpemUuaGVpZ2h0OwotICAgICAgICAgIGJJc0FkZFRyYWlsZXJIZWlnaHQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFiVGFrZVNwYWNlIHx8Ci0gICAgICAqZkNvbnRlbnRDdXJSb3dZICsgY2hpbGRTaXplLmhlaWdodCA8PQotICAgICAgICAgIGZBdmFpbEhlaWdodCArIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OIHx8Ci0gICAgICAoIWJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSAmJgotICAgICAgIHBUaGlzLT5tX2ZVc2VkU2l6ZSArIGZBdmFpbEhlaWdodCArIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OID49Ci0gICAgICAgICAgIGZDb250YWluZXJIZWlnaHQpKSB7Ci0gICAgaWYgKCFiVGFrZVNwYWNlIHx8IGVSZXRWYWx1ZSA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6RG9uZSkgewotICAgICAgaWYgKHBQcm9jZXNzb3ItPm1fYlVzZUluaGVyaWF0ZWQpIHsKLSAgICAgICAgaWYgKHBUcmFpbGVyTGF5b3V0SXRlbSkKLSAgICAgICAgICBBZGRUcmFpbGVyQmVmb3JlU3BsaXQocFByb2Nlc3NvciwgY2hpbGRTaXplLmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLCBmYWxzZSk7Ci0gICAgICAgIGlmIChwUHJvY2Vzc29yLT5KdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKHBPdmVyZmxvd0xlYWRlck5vZGUpKQotICAgICAgICAgIEFkZFBlbmRpbmdOb2RlKHBQcm9jZXNzb3IsIHBPdmVyZmxvd0xlYWRlck5vZGUsIGZhbHNlKTsKLQotICAgICAgICBwUHJvY2Vzc29yLT5tX2JVc2VJbmhlcmlhdGVkID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoYklzQWRkVHJhaWxlckhlaWdodCkKLSAgICAgICAgICBjaGlsZFNpemUuaGVpZ2h0IC09IHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS5oZWlnaHQ7Ci0KLSAgICAgICAgcFByb2Nlc3Nvci0+UHJvY2Vzc1VuVXNlT3ZlckZsb3cocE92ZXJmbG93TGVhZGVyTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93VHJhaWxlck5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbSwgcEZvcm1Ob2RlKTsKLSAgICAgIH0KLQotICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcENoaWxkTGF5b3V0SXRlbSA9Ci0gICAgICAgICAgcFByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKTsKLSAgICAgIGlmIChFeGlzdENvbnRhaW5lcktlZXAocFByb2Nlc3Nvci0+bV9wRm9ybU5vZGUsIGZhbHNlKSAmJgotICAgICAgICAgIHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLT5HZXRJbnRhY3QoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lKSB7Ci0gICAgICAgIHBUaGlzLT5tX2FycmF5S2VlcEl0ZW1zLnB1c2hfYmFjayhwQ2hpbGRMYXlvdXRJdGVtKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHBUaGlzLT5tX2FycmF5S2VlcEl0ZW1zLmNsZWFyKCk7Ci0gICAgICB9Ci0gICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1t1SEFsaWduXS5BZGQocENoaWxkTGF5b3V0SXRlbSk7Ci0gICAgICAqYkFkZGVkSXRlbUluUm93ID0gdHJ1ZTsKLSAgICAgIGlmIChiVGFrZVNwYWNlKSB7Ci0gICAgICAgICpmQ29udGVudEN1clJvd0F2YWlsV2lkdGggLT0gY2hpbGRTaXplLndpZHRoOwotICAgICAgICAqZkNvbnRlbnRDdXJSb3dIZWlnaHQgPQotICAgICAgICAgICAgc3RkOjptYXgoKmZDb250ZW50Q3VyUm93SGVpZ2h0LCBjaGlsZFNpemUuaGVpZ2h0KTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6RG9uZTsKLSAgICB9Ci0KLSAgICBpZiAoZVJldFZhbHVlID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpQYWdlRnVsbEJyZWFrKSB7Ci0gICAgICBpZiAocFByb2Nlc3Nvci0+bV9iVXNlSW5oZXJpYXRlZCkgewotICAgICAgICBpZiAocFRyYWlsZXJMYXlvdXRJdGVtKSB7Ci0gICAgICAgICAgQWRkVHJhaWxlckJlZm9yZVNwbGl0KHBQcm9jZXNzb3IsIGNoaWxkU2l6ZS5oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwUHJvY2Vzc29yLT5KdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKHBPdmVyZmxvd0xlYWRlck5vZGUpKQotICAgICAgICAgIEFkZFBlbmRpbmdOb2RlKHBQcm9jZXNzb3IsIHBPdmVyZmxvd0xlYWRlck5vZGUsIGZhbHNlKTsKLQotICAgICAgICBwUHJvY2Vzc29yLT5tX2JVc2VJbmhlcmlhdGVkID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoYklzQWRkVHJhaWxlckhlaWdodCkKLSAgICAgICAgICBjaGlsZFNpemUuaGVpZ2h0IC09IHBUcmFpbGVyTGF5b3V0SXRlbS0+bV9zU2l6ZS5oZWlnaHQ7Ci0KLSAgICAgICAgcFByb2Nlc3Nvci0+UHJvY2Vzc1VuVXNlT3ZlckZsb3cocE92ZXJmbG93TGVhZGVyTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93VHJhaWxlck5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbSwgcEZvcm1Ob2RlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbdUhBbGlnbl0uQWRkKHBQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCkpOwotICAgICpiQWRkZWRJdGVtSW5Sb3cgPSB0cnVlOwotICAgICpmQ29udGVudEN1clJvd0F2YWlsV2lkdGggLT0gY2hpbGRTaXplLndpZHRoOwotICAgICpmQ29udGVudEN1clJvd0hlaWdodCA9IHN0ZDo6bWF4KCpmQ29udGVudEN1clJvd0hlaWdodCwgY2hpbGRTaXplLmhlaWdodCk7Ci0gICAgcmV0dXJuIGVSZXRWYWx1ZTsKLSAgfQotCi0gIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IGVSZXN1bHQ7Ci0gIGlmIChwVGhpcy0+UHJvY2Vzc0tlZXBGb3JTcGxpdCgKLSAgICAgICAgICBwVGhpcywgcFByb2Nlc3NvciwgZVJldFZhbHVlLCAmcmdDdXJMaW5lTGF5b3V0SXRlbXNbdUhBbGlnbl0sCi0gICAgICAgICAgZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLCBmQ29udGVudEN1clJvd0hlaWdodCwgZkNvbnRlbnRDdXJSb3dZLAotICAgICAgICAgIGJBZGRlZEl0ZW1JblJvdywgYkZvcmNlRW5kUGFnZSwgJmVSZXN1bHQpKSB7Ci0gICAgcmV0dXJuIGVSZXN1bHQ7Ci0gIH0KLQotICAqYkZvcmNlRW5kUGFnZSA9IHRydWU7Ci0gIEZYX0ZMT0FUIGZTcGxpdFBvcyA9Ci0gICAgICBwUHJvY2Vzc29yLT5GaW5kU3BsaXRQb3MoZkF2YWlsSGVpZ2h0IC0gKmZDb250ZW50Q3VyUm93WSk7Ci0gIGlmIChmU3BsaXRQb3MgPiBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgewotICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQgPQotICAgICAgICBwUHJvY2Vzc29yLT5tX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCk7Ci0gICAgaWYgKGVMYXlvdXQgPT0gWEZBX0FUVFJJQlVURUVOVU1fVGIgJiYKLSAgICAgICAgZVJldFZhbHVlID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpEb25lKSB7Ci0gICAgICBwUHJvY2Vzc29yLT5Qcm9jZXNzVW5Vc2VPdmVyRmxvdyhwT3ZlcmZsb3dMZWFkZXJOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93VHJhaWxlck5vZGUsIHBUcmFpbGVyTGF5b3V0SXRlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBGb3JtTm9kZSk7Ci0gICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1t1SEFsaWduXS5BZGQocFByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKSk7Ci0gICAgICAqYkFkZGVkSXRlbUluUm93ID0gdHJ1ZTsKLSAgICAgIGlmIChiVGFrZVNwYWNlKSB7Ci0gICAgICAgICpmQ29udGVudEN1clJvd0F2YWlsV2lkdGggLT0gY2hpbGRTaXplLndpZHRoOwotICAgICAgICAqZkNvbnRlbnRDdXJSb3dIZWlnaHQgPQotICAgICAgICAgICAgc3RkOjptYXgoKmZDb250ZW50Q3VyUm93SGVpZ2h0LCBjaGlsZFNpemUuaGVpZ2h0KTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6UGFnZUZ1bGxCcmVhazsKLSAgICB9Ci0KLSAgICBDWEZBX05vZGUqIHBUZW1wTGVhZGVyTm9kZSA9IG51bGxwdHI7Ci0gICAgQ1hGQV9Ob2RlKiBwVGVtcFRyYWlsZXJOb2RlID0gbnVsbHB0cjsKLSAgICBpZiAocFRoaXMtPm1fcFBhZ2VNZ3IgJiYgIXBQcm9jZXNzb3ItPm1fYlVzZUluaGVyaWF0ZWQgJiYKLSAgICAgICAgZVJldFZhbHVlICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpQYWdlRnVsbEJyZWFrKSB7Ci0gICAgICBwVGhpcy0+bV9wUGFnZU1nci0+UHJvY2Vzc092ZXJmbG93KHBGb3JtTm9kZSwgcFRlbXBMZWFkZXJOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcFRyYWlsZXJOb2RlLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgfQotICAgIGlmIChwVHJhaWxlckxheW91dEl0ZW0gJiYgYklzQWRkVHJhaWxlckhlaWdodCkgewotICAgICAgQWRkVHJhaWxlckJlZm9yZVNwbGl0KHBQcm9jZXNzb3IsIGZTcGxpdFBvcywgcFRyYWlsZXJMYXlvdXRJdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJVc2VJbmhlcml0ZWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwUHJvY2Vzc29yLT5TcGxpdExheW91dEl0ZW0oZlNwbGl0UG9zKTsKLSAgICB9Ci0KLSAgICBpZiAoYlVzZUluaGVyaXRlZCkgewotICAgICAgcFByb2Nlc3Nvci0+UHJvY2Vzc1VuVXNlT3ZlckZsb3cocE92ZXJmbG93TGVhZGVyTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdmVyZmxvd1RyYWlsZXJOb2RlLCBwVHJhaWxlckxheW91dEl0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRm9ybU5vZGUpOwotICAgICAgcFRoaXMtPm1fYlVzZUluaGVyaWF0ZWQgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICBDWEZBX0xheW91dEl0ZW0qIGZpcnN0Q2hpbGQgPSBwUHJvY2Vzc29yLT5tX3BMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOwotICAgICAgaWYgKGZpcnN0Q2hpbGQgJiYgIWZpcnN0Q2hpbGQtPm1fcE5leHRTaWJsaW5nICYmCi0gICAgICAgICAgZmlyc3RDaGlsZC0+bV9wRm9ybU5vZGUtPklzTGF5b3V0R2VuZXJhdGVkTm9kZSgpKSB7Ci0gICAgICAgIHBQcm9jZXNzb3ItPlByb2Nlc3NVblVzZU92ZXJGbG93KHBPdmVyZmxvd0xlYWRlck5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdmVyZmxvd1RyYWlsZXJOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVHJhaWxlckxheW91dEl0ZW0sIHBGb3JtTm9kZSk7Ci0gICAgICB9IGVsc2UgaWYgKHBQcm9jZXNzb3ItPkp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIoCi0gICAgICAgICAgICAgICAgICAgICBwT3ZlcmZsb3dMZWFkZXJOb2RlKSkgewotICAgICAgICBBZGRQZW5kaW5nTm9kZShwUHJvY2Vzc29yLCBwT3ZlcmZsb3dMZWFkZXJOb2RlLCBmYWxzZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHBQcm9jZXNzb3ItPm1fcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nKSB7Ci0gICAgICBjaGlsZFNpemUgPSBwUHJvY2Vzc29yLT5HZXRDdXJyZW50Q29tcG9uZW50U2l6ZSgpOwotICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbdUhBbGlnbl0uQWRkKHBQcm9jZXNzb3ItPkV4dHJhY3RMYXlvdXRJdGVtKCkpOwotICAgICAgKmJBZGRlZEl0ZW1JblJvdyA9IHRydWU7Ci0gICAgICBpZiAoYlRha2VTcGFjZSkgewotICAgICAgICAqZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoIC09IGNoaWxkU2l6ZS53aWR0aDsKLSAgICAgICAgKmZDb250ZW50Q3VyUm93SGVpZ2h0ID0KLSAgICAgICAgICAgIHN0ZDo6bWF4KCpmQ29udGVudEN1clJvd0hlaWdodCwgY2hpbGRTaXplLmhlaWdodCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6UGFnZUZ1bGxCcmVhazsKLSAgfQotCi0gIGlmICgqZkNvbnRlbnRDdXJSb3dZIDw9IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7Ci0gICAgY2hpbGRTaXplID0gcFByb2Nlc3Nvci0+R2V0Q3VycmVudENvbXBvbmVudFNpemUoKTsKLSAgICBpZiAocFByb2Nlc3Nvci0+bV9wUGFnZU1nci0+R2V0TmV4dEF2YWlsQ29udGVudEhlaWdodChjaGlsZFNpemUuaGVpZ2h0KSkgewotICAgICAgQ1hGQV9Ob2RlKiBwVGVtcExlYWRlck5vZGUgPSBudWxscHRyOwotICAgICAgQ1hGQV9Ob2RlKiBwVGVtcFRyYWlsZXJOb2RlID0gbnVsbHB0cjsKLSAgICAgIGlmIChwVGhpcy0+bV9wUGFnZU1ncikgewotICAgICAgICBpZiAoIXBGb3JtTm9kZSAmJiBwTGF5b3V0Q29udGV4dCkKLSAgICAgICAgICBwRm9ybU5vZGUgPSBwTGF5b3V0Q29udGV4dC0+bV9wT3ZlcmZsb3dQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlOwotCi0gICAgICAgIHBUaGlzLT5tX3BQYWdlTWdyLT5Qcm9jZXNzT3ZlcmZsb3cocEZvcm1Ob2RlLCBwVGVtcExlYWRlck5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXBUcmFpbGVyTm9kZSwgZmFsc2UsIHRydWUpOwotICAgICAgfQotICAgICAgaWYgKGJVc2VJbmhlcml0ZWQpIHsKLSAgICAgICAgcFByb2Nlc3Nvci0+UHJvY2Vzc1VuVXNlT3ZlckZsb3cocE92ZXJmbG93TGVhZGVyTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93VHJhaWxlck5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUcmFpbGVyTGF5b3V0SXRlbSwgcEZvcm1Ob2RlKTsKLSAgICAgICAgcFRoaXMtPm1fYlVzZUluaGVyaWF0ZWQgPSB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpQYWdlRnVsbEJyZWFrOwotICAgIH0KLQotICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zW3VIQWxpZ25dLkFkZChwUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpKTsKLSAgICAqYkFkZGVkSXRlbUluUm93ID0gdHJ1ZTsKLSAgICBpZiAoYlRha2VTcGFjZSkgewotICAgICAgKmZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCAtPSBjaGlsZFNpemUud2lkdGg7Ci0gICAgICAqZkNvbnRlbnRDdXJSb3dIZWlnaHQgPSBzdGQ6Om1heCgqZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGNoaWxkU2l6ZS5oZWlnaHQpOwotICAgIH0KLSAgICBpZiAoZVJldFZhbHVlID09IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpEb25lKQotICAgICAgKmJGb3JjZUVuZFBhZ2UgPSBmYWxzZTsKLQotICAgIHJldHVybiBlUmV0VmFsdWU7Ci0gIH0KLQotICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0ID0KLSAgICAgIHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0KTsKLSAgaWYgKHBQcm9jZXNzb3ItPm1fcEZvcm1Ob2RlLT5HZXRJbnRhY3QoKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lICYmCi0gICAgICBlTGF5b3V0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1RiKSB7Ci0gICAgaWYgKHBUaGlzLT5tX3BQYWdlTWdyKSB7Ci0gICAgICBwVGhpcy0+bV9wUGFnZU1nci0+UHJvY2Vzc092ZXJmbG93KHBGb3JtTm9kZSwgcE92ZXJmbG93TGVhZGVyTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE92ZXJmbG93VHJhaWxlck5vZGUsIGZhbHNlLCB0cnVlKTsKLSAgICB9Ci0gICAgaWYgKHBUcmFpbGVyTGF5b3V0SXRlbSkKLSAgICAgIEFkZFRyYWlsZXJCZWZvcmVTcGxpdChwUHJvY2Vzc29yLCBmU3BsaXRQb3MsIHBUcmFpbGVyTGF5b3V0SXRlbSwgZmFsc2UpOwotICAgIGlmIChwUHJvY2Vzc29yLT5KdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKHBPdmVyZmxvd0xlYWRlck5vZGUpKQotICAgICAgQWRkUGVuZGluZ05vZGUocFByb2Nlc3NvciwgcE92ZXJmbG93TGVhZGVyTm9kZSwgZmFsc2UpOwotCi0gICAgcmV0dXJuIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpQYWdlRnVsbEJyZWFrOwotICB9Ci0KLSAgaWYgKGVSZXRWYWx1ZSAhPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6RG9uZSkKLSAgICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OlBhZ2VGdWxsQnJlYWs7Ci0KLSAgaWYgKCFwRm9ybU5vZGUgJiYgcExheW91dENvbnRleHQpCi0gICAgcEZvcm1Ob2RlID0gcExheW91dENvbnRleHQtPm1fcE92ZXJmbG93UHJvY2Vzc29yLT5tX3BGb3JtTm9kZTsKLSAgaWYgKHBUaGlzLT5tX3BQYWdlTWdyKSB7Ci0gICAgcFRoaXMtPm1fcFBhZ2VNZ3ItPlByb2Nlc3NPdmVyZmxvdyhwRm9ybU5vZGUsIHBPdmVyZmxvd0xlYWRlck5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3ZlcmZsb3dUcmFpbGVyTm9kZSwgZmFsc2UsIHRydWUpOwotICB9Ci0gIGlmIChiVXNlSW5oZXJpdGVkKSB7Ci0gICAgcFByb2Nlc3Nvci0+UHJvY2Vzc1VuVXNlT3ZlckZsb3cocE92ZXJmbG93TGVhZGVyTm9kZSwgcE92ZXJmbG93VHJhaWxlck5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRyYWlsZXJMYXlvdXRJdGVtLCBwRm9ybU5vZGUpOwotICAgIHBUaGlzLT5tX2JVc2VJbmhlcmlhdGVkID0gdHJ1ZTsKLSAgfQotICByZXR1cm4gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OlBhZ2VGdWxsQnJlYWs7Ci19Ci0KLWJvb2wgRmluZExheW91dEl0ZW1TcGxpdFBvcyhDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ3VyVmVydGljYWxPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIGZQcm9wb3NlZFNwbGl0UG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGJBcHBDaGFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQ2FsY3VsYXRlTWFyZ2luKSB7Ci0gIENYRkFfTm9kZSogcEZvcm1Ob2RlID0gcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlOwotICBpZiAoKmZQcm9wb3NlZFNwbGl0UG9zIDw9IGZDdXJWZXJ0aWNhbE9mZnNldCArIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OIHx8Ci0gICAgICAqZlByb3Bvc2VkU3BsaXRQb3MgPiBmQ3VyVmVydGljYWxPZmZzZXQgKyBwTGF5b3V0SXRlbS0+bV9zU2l6ZS5oZWlnaHQgLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc3dpdGNoIChwRm9ybU5vZGUtPkdldEludGFjdCgpKSB7Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9Ob25lOiB7Ci0gICAgICBib29sIGJBbnlDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICBDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQgPSBwRm9ybU5vZGUtPkdldERvY3VtZW50KCk7Ci0gICAgICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gcERvY3VtZW50LT5HZXROb3RpZnkoKTsKLSAgICAgIEZYX0ZMT0FUIGZDdXJUb3BNYXJnaW4gPSAwLCBmQ3VyQm90dG9tTWFyZ2luID0gMDsKLSAgICAgIENYRkFfTm9kZSogcE1hcmdpbk5vZGUgPQotICAgICAgICAgIHBGb3JtTm9kZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VsZW1lbnQ6Ok1hcmdpbik7Ci0gICAgICBpZiAocE1hcmdpbk5vZGUgJiYgYkNhbGN1bGF0ZU1hcmdpbikgewotICAgICAgICBmQ3VyVG9wTWFyZ2luID0KLSAgICAgICAgICAgIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfVG9wSW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7Ci0gICAgICAgIGZDdXJCb3R0b21NYXJnaW4gPSBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Ub1VuaXQoWEZBX1VOSVRfUHQpOwotICAgICAgfQotICAgICAgYm9vbCBiQ2hhbmdlZCA9IHRydWU7Ci0gICAgICB3aGlsZSAoYkNoYW5nZWQpIHsKLSAgICAgICAgYkNoYW5nZWQgPSBmYWxzZTsKLSAgICAgICAgewotICAgICAgICAgIEZYX0ZMT0FUIGZSZWxTcGxpdFBvcyA9ICpmUHJvcG9zZWRTcGxpdFBvcyAtIGZDdXJWZXJ0aWNhbE9mZnNldDsKLSAgICAgICAgICBpZiAocE5vdGlmeS0+RmluZFNwbGl0UG9zKHBGb3JtTm9kZSwgcExheW91dEl0ZW0tPkdldEluZGV4KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmUmVsU3BsaXRQb3MpKSB7Ci0gICAgICAgICAgICBiQW55Q2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICBiQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAqZlByb3Bvc2VkU3BsaXRQb3MgPSBmQ3VyVmVydGljYWxPZmZzZXQgKyBmUmVsU3BsaXRQb3M7Ci0gICAgICAgICAgICAqYkFwcENoYW5nZSA9IHRydWU7Ci0gICAgICAgICAgICBpZiAoKmZQcm9wb3NlZFNwbGl0UG9zIDw9Ci0gICAgICAgICAgICAgICAgZkN1clZlcnRpY2FsT2Zmc2V0ICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEZYX0ZMT0FUIGZSZWxTcGxpdFBvcyA9ICpmUHJvcG9zZWRTcGxpdFBvcyAtIGZDdXJCb3R0b21NYXJnaW47Ci0gICAgICAgIGZvciAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcENoaWxkSXRlbSA9Ci0gICAgICAgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsKLSAgICAgICAgICAgICBwQ2hpbGRJdGVtOwotICAgICAgICAgICAgIHBDaGlsZEl0ZW0gPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsKLSAgICAgICAgICBGWF9GTE9BVCBmQ2hpbGRPZmZzZXQgPQotICAgICAgICAgICAgICBmQ3VyVmVydGljYWxPZmZzZXQgKyBmQ3VyVG9wTWFyZ2luICsgcENoaWxkSXRlbS0+bV9zUG9zLnk7Ci0gICAgICAgICAgYm9vbCBiQ2hhbmdlID0gZmFsc2U7Ci0gICAgICAgICAgaWYgKEZpbmRMYXlvdXRJdGVtU3BsaXRQb3MocENoaWxkSXRlbSwgZkNoaWxkT2Zmc2V0LCAmZlJlbFNwbGl0UG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiQ2hhbmdlLCBiQ2FsY3VsYXRlTWFyZ2luKSkgewotICAgICAgICAgICAgaWYgKGZSZWxTcGxpdFBvcyAtIGZDaGlsZE9mZnNldCA8IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OICYmCi0gICAgICAgICAgICAgICAgYkNoYW5nZSkgewotICAgICAgICAgICAgICAqZlByb3Bvc2VkU3BsaXRQb3MgPSBmUmVsU3BsaXRQb3MgLSBmQ3VyVG9wTWFyZ2luOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgKmZQcm9wb3NlZFNwbGl0UG9zID0gZlJlbFNwbGl0UG9zICsgZkN1ckJvdHRvbU1hcmdpbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJBbnlDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmICgqZlByb3Bvc2VkU3BsaXRQb3MgPD0KLSAgICAgICAgICAgICAgICBmQ3VyVmVydGljYWxPZmZzZXQgKyBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTikgewotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiQW55Q2hhbmdlZCkKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gYkFueUNoYW5nZWQ7Ci0gICAgfQotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQ29udGVudEFyZWE6Ci0gICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9QYWdlQXJlYTogewotICAgICAgKmZQcm9wb3NlZFNwbGl0UG9zID0gZkN1clZlcnRpY2FsT2Zmc2V0OwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotQ0ZYX1BvaW50RiBDYWxjdWxhdGVQb3NpdGlvbmVkQ29udGFpbmVyUG9zKENYRkFfTm9kZSogcE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1NpemVGJiBzaXplKSB7Ci0gIFhGQV9BVFRSSUJVVEVFTlVNIGVBbmNob3JUeXBlID0gcE5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9BbmNob3JUeXBlKTsKLSAgaW50MzJfdCBuQW5jaG9yVHlwZSA9IDA7Ci0gIHN3aXRjaCAoZUFuY2hvclR5cGUpIHsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcExlZnQ6Ci0gICAgICBuQW5jaG9yVHlwZSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RvcENlbnRlcjoKLSAgICAgIG5BbmNob3JUeXBlID0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVG9wUmlnaHQ6Ci0gICAgICBuQW5jaG9yVHlwZSA9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZUxlZnQ6Ci0gICAgICBuQW5jaG9yVHlwZSA9IDM7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX01pZGRsZUNlbnRlcjoKLSAgICAgIG5BbmNob3JUeXBlID0gNDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTWlkZGxlUmlnaHQ6Ci0gICAgICBuQW5jaG9yVHlwZSA9IDU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbUxlZnQ6Ci0gICAgICBuQW5jaG9yVHlwZSA9IDY7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0JvdHRvbUNlbnRlcjoKLSAgICAgIG5BbmNob3JUeXBlID0gNzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fQm90dG9tUmlnaHQ6Ci0gICAgICBuQW5jaG9yVHlwZSA9IDg7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLSAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgbk5leHRQb3NbNF1bOV0gPSB7ezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDh9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NiwgMywgMCwgNywgNCwgMSwgOCwgNSwgMn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs4LCA3LCA2LCA1LCA0LCAzLCAyLCAxLCAwfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezIsIDUsIDgsIDEsIDQsIDcsIDAsIDMsIDZ9fTsKLQotICBDRlhfUG9pbnRGIHBvcyhwTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1gpLlRvVW5pdChYRkFfVU5JVF9QdCksCi0gICAgICAgICAgICAgICAgIHBOb2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfWSkuVG9Vbml0KFhGQV9VTklUX1B0KSk7Ci0gIGludDMyX3QgblJvdGF0ZSA9Ci0gICAgICBGWFNZU19yb3VuZChwTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1JvdGF0ZSkuR2V0VmFsdWUoKSk7Ci0gIG5Sb3RhdGUgPSBYRkFfTWFwUm90YXRpb24oblJvdGF0ZSkgLyA5MDsKLSAgaW50MzJfdCBuQWJzb2x1dGVBbmNob3JUeXBlID0gbk5leHRQb3NbblJvdGF0ZV1bbkFuY2hvclR5cGVdOwotICBzd2l0Y2ggKG5BYnNvbHV0ZUFuY2hvclR5cGUgLyAzKSB7Ci0gICAgY2FzZSAxOgotICAgICAgcG9zLnkgLT0gc2l6ZS5oZWlnaHQgLyAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgcG9zLnkgLT0gc2l6ZS5oZWlnaHQ7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLSAgc3dpdGNoIChuQWJzb2x1dGVBbmNob3JUeXBlICUgMykgewotICAgIGNhc2UgMToKLSAgICAgIHBvcy54IC09IHNpemUud2lkdGggLyAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgcG9zLnggLT0gc2l6ZS53aWR0aDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gcG9zOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IoQ1hGQV9Ob2RlKiBwTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTGF5b3V0UGFnZU1nciogcFBhZ2VNZ3IpCi0gICAgOiBtX3BGb3JtTm9kZShwTm9kZSksCi0gICAgICBtX3BMYXlvdXRJdGVtKG51bGxwdHIpLAotICAgICAgbV9wQ3VyQ2hpbGROb2RlKFhGQV9MQVlPVVRfSU5WQUxJRE5PREUpLAotICAgICAgbV9mVXNlZFNpemUoMCksCi0gICAgICBtX3BQYWdlTWdyKHBQYWdlTWdyKSwKLSAgICAgIG1fYkJyZWFrUGVuZGluZyh0cnVlKSwKLSAgICAgIG1fZkxhc3RSb3dXaWR0aCgwKSwKLSAgICAgIG1fZkxhc3RSb3dZKDApLAotICAgICAgbV9iVXNlSW5oZXJpYXRlZChmYWxzZSksCi0gICAgICBtX2VQcmVQcm9jZXNzUnMoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OkRvbmUpLAotICAgICAgbV9iS2VlcEJyZWFrRmluaXNoKGZhbHNlKSwKLSAgICAgIG1fYklzUHJvY2Vzc0tlZXAoZmFsc2UpLAotICAgICAgbV9wS2VlcEhlYWROb2RlKG51bGxwdHIpLAotICAgICAgbV9wS2VlcFRhaWxOb2RlKG51bGxwdHIpLAotICAgICAgbV9wT2xkTGF5b3V0SXRlbShudWxscHRyKSwKLSAgICAgIG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yKG51bGxwdHIpLAotICAgICAgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6Ok5vbmUpLAotICAgICAgbV9mV2lkdGhMaW1pdGUoMCksCi0gICAgICBtX2JIYXNBdmFpbEhlaWdodCh0cnVlKSB7Ci0gIEFTU0VSVChtX3BGb3JtTm9kZSAmJiAobV9wRm9ybU5vZGUtPklzQ29udGFpbmVyTm9kZSgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgbV9wRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkZvcm0pKTsKLSAgbV9wT2xkTGF5b3V0SXRlbSA9Ci0gICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopbV9wRm9ybU5vZGUtPkdldFVzZXJEYXRhKFhGQV9MQVlPVVRJVEVNS0VZKTsKLX0KLQotQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjp+Q1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKCkge30KLQotQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpDcmVhdGVDb250ZW50TGF5b3V0SXRlbSgKLSAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSkgewotICBpZiAoIXBGb3JtTm9kZSkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSA9IG51bGxwdHI7Ci0gIGlmIChtX3BPbGRMYXlvdXRJdGVtKSB7Ci0gICAgcExheW91dEl0ZW0gPSBtX3BPbGRMYXlvdXRJdGVtOwotICAgIG1fcE9sZExheW91dEl0ZW0gPSBtX3BPbGRMYXlvdXRJdGVtLT5tX3BOZXh0OwotICAgIHJldHVybiBwTGF5b3V0SXRlbTsKLSAgfQotICBwTGF5b3V0SXRlbSA9IChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwRm9ybU5vZGUtPkdldERvY3VtZW50KCkKLSAgICAgICAgICAgICAgICAgICAgLT5HZXROb3RpZnkoKQotICAgICAgICAgICAgICAgICAgICAtPk9uQ3JlYXRlTGF5b3V0SXRlbShwRm9ybU5vZGUpOwotICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwUHJldkxheW91dEl0ZW0gPQotICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBGb3JtTm9kZS0+R2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVkpOwotICBpZiAocFByZXZMYXlvdXRJdGVtKSB7Ci0gICAgd2hpbGUgKHBQcmV2TGF5b3V0SXRlbS0+bV9wTmV4dCkKLSAgICAgIHBQcmV2TGF5b3V0SXRlbSA9IHBQcmV2TGF5b3V0SXRlbS0+bV9wTmV4dDsKLQotICAgIHBQcmV2TGF5b3V0SXRlbS0+bV9wTmV4dCA9IHBMYXlvdXRJdGVtOwotICAgIHBMYXlvdXRJdGVtLT5tX3BQcmV2ID0gcFByZXZMYXlvdXRJdGVtOwotICB9IGVsc2UgewotICAgIHBGb3JtTm9kZS0+U2V0VXNlckRhdGEoWEZBX0xBWU9VVElURU1LRVksIHBMYXlvdXRJdGVtKTsKLSAgfQotICByZXR1cm4gcExheW91dEl0ZW07Ci19Ci0KLUZYX0ZMT0FUIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6RmluZFNwbGl0UG9zKEZYX0ZMT0FUIGZQcm9wb3NlZFNwbGl0UG9zKSB7Ci0gIEFTU0VSVChtX3BMYXlvdXRJdGVtKTsKLSAgWEZBX0FUVFJJQlVURUVOVU0gZUxheW91dCA9IG1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0KTsKLSAgYm9vbCBiQ2FsY3VsYXRlTWFyZ2luID0gZUxheW91dCAhPSBYRkFfQVRUUklCVVRFRU5VTV9Qb3NpdGlvbjsKLSAgd2hpbGUgKGZQcm9wb3NlZFNwbGl0UG9zID4gWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsKLSAgICBib29sIGJBcHBDaGFuZ2UgPSBmYWxzZTsKLSAgICBpZiAoIUZpbmRMYXlvdXRJdGVtU3BsaXRQb3MobV9wTGF5b3V0SXRlbSwgMCwgJmZQcm9wb3NlZFNwbGl0UG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYkFwcENoYW5nZSwgYkNhbGN1bGF0ZU1hcmdpbikpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gZlByb3Bvc2VkU3BsaXRQb3M7Ci19Ci0KLXZvaWQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpTcGxpdExheW91dEl0ZW0oCi0gICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcExheW91dEl0ZW0sCi0gICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFNlY29uZFBhcmVudCwKLSAgICBGWF9GTE9BVCBmU3BsaXRQb3MpIHsKLSAgRlhfRkxPQVQgZkN1clRvcE1hcmdpbiA9IDAsIGZDdXJCb3R0b21NYXJnaW4gPSAwOwotICBYRkFfQVRUUklCVVRFRU5VTSBlTGF5b3V0ID0gbV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpOwotICBib29sIGJDYWxjdWxhdGVNYXJnaW4gPSB0cnVlOwotICBpZiAoZUxheW91dCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Qb3NpdGlvbikKLSAgICBiQ2FsY3VsYXRlTWFyZ2luID0gZmFsc2U7Ci0KLSAgQ1hGQV9Ob2RlKiBwTWFyZ2luTm9kZSA9Ci0gICAgICBwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpNYXJnaW4pOwotICBpZiAocE1hcmdpbk5vZGUgJiYgYkNhbGN1bGF0ZU1hcmdpbikgewotICAgIGZDdXJUb3BNYXJnaW4gPQotICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX1RvcEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOwotICAgIGZDdXJCb3R0b21NYXJnaW4gPQotICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOwotICB9Ci0KLSAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFNlY29uZExheW91dEl0ZW0gPSBudWxscHRyOwotICBpZiAobV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IgJiYKLSAgICAgIG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yLT5tX3BGb3JtTm9kZSA9PSBwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUpIHsKLSAgICBwU2Vjb25kTGF5b3V0SXRlbSA9IG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yLT5DcmVhdGVDb250ZW50TGF5b3V0SXRlbSgKLSAgICAgICAgcExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlKTsKLSAgfSBlbHNlIHsKLSAgICBwU2Vjb25kTGF5b3V0SXRlbSA9IENyZWF0ZUNvbnRlbnRMYXlvdXRJdGVtKHBMYXlvdXRJdGVtLT5tX3BGb3JtTm9kZSk7Ci0gIH0KLSAgcFNlY29uZExheW91dEl0ZW0tPm1fc1Bvcy54ID0gcExheW91dEl0ZW0tPm1fc1Bvcy54OwotICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zU2l6ZS53aWR0aCA9IHBMYXlvdXRJdGVtLT5tX3NTaXplLndpZHRoOwotICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zUG9zLnkgPSAwOwotICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zU2l6ZS5oZWlnaHQgPSBwTGF5b3V0SXRlbS0+bV9zU2l6ZS5oZWlnaHQgLSBmU3BsaXRQb3M7Ci0gIHBMYXlvdXRJdGVtLT5tX3NTaXplLmhlaWdodCAtPSBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zU2l6ZS5oZWlnaHQ7Ci0gIGlmIChwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZCkKLSAgICBwU2Vjb25kTGF5b3V0SXRlbS0+bV9zU2l6ZS5oZWlnaHQgKz0gZkN1clRvcE1hcmdpbjsKLQotICBpZiAocFNlY29uZFBhcmVudCkgewotICAgIHBTZWNvbmRQYXJlbnQtPkFkZENoaWxkKHBTZWNvbmRMYXlvdXRJdGVtKTsKLSAgICBpZiAoZkN1clRvcE1hcmdpbiA+IDAgJiYgcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQpIHsKLSAgICAgIHBTZWNvbmRQYXJlbnQtPm1fc1NpemUuaGVpZ2h0ICs9IGZDdXJUb3BNYXJnaW47Ci0gICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwUGFyZW50SXRlbSA9Ci0gICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBTZWNvbmRQYXJlbnQtPm1fcFBhcmVudDsKLSAgICAgIHdoaWxlIChwUGFyZW50SXRlbSkgewotICAgICAgICBwUGFyZW50SXRlbS0+bV9zU2l6ZS5oZWlnaHQgKz0gZkN1clRvcE1hcmdpbjsKLSAgICAgICAgcFBhcmVudEl0ZW0gPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcFBhcmVudEl0ZW0tPm1fcFBhcmVudDsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcFNlY29uZExheW91dEl0ZW0tPm1fcFBhcmVudCA9IHBMYXlvdXRJdGVtLT5tX3BQYXJlbnQ7Ci0gICAgcFNlY29uZExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nID0gcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOwotICAgIHBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZyA9IHBTZWNvbmRMYXlvdXRJdGVtOwotICB9Ci0KLSAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcENoaWxkcmVuID0KLSAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsKLSAgcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQgPSBudWxscHRyOwotICBGWF9GTE9BVCBsSGVpZ2h0Rm9yS2VlcCA9IDA7Ci0gIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW0qPiBrZWVwTGF5b3V0SXRlbXM7Ci0gIEZYX0ZMT0FUIGZBZGRNYXJnaW5IZWlnaHQgPSAwOwotICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW0gKnBDaGlsZEl0ZW0gPSBwQ2hpbGRyZW4sICpwQ2hpbGROZXh0ID0gbnVsbHB0cjsKLSAgICAgICBwQ2hpbGRJdGVtOyBwQ2hpbGRJdGVtID0gcENoaWxkTmV4dCkgewotICAgIHBDaGlsZE5leHQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmc7Ci0gICAgcENoaWxkSXRlbS0+bV9wTmV4dFNpYmxpbmcgPSBudWxscHRyOwotICAgIGlmIChmU3BsaXRQb3MgPD0gZkN1clRvcE1hcmdpbiArIHBDaGlsZEl0ZW0tPm1fc1Bvcy55ICsgZkN1ckJvdHRvbU1hcmdpbiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsKLSAgICAgIGlmICghRXhpc3RDb250YWluZXJLZWVwKHBDaGlsZEl0ZW0tPm1fcEZvcm1Ob2RlLCB0cnVlKSkgewotICAgICAgICBwQ2hpbGRJdGVtLT5tX3NQb3MueSAtPSBmU3BsaXRQb3MgLSBmQ3VyQm90dG9tTWFyZ2luOwotICAgICAgICBwQ2hpbGRJdGVtLT5tX3NQb3MueSArPSBsSGVpZ2h0Rm9yS2VlcDsKLSAgICAgICAgcENoaWxkSXRlbS0+bV9zUG9zLnkgKz0gZkFkZE1hcmdpbkhlaWdodDsKLSAgICAgICAgcFNlY29uZExheW91dEl0ZW0tPkFkZENoaWxkKHBDaGlsZEl0ZW0pOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKGxIZWlnaHRGb3JLZWVwIDwgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04pIHsKLSAgICAgICAgZm9yIChpbnQzMl90IGlJbmRleCA9IDA7IGlJbmRleCA8IGtlZXBMYXlvdXRJdGVtcy5HZXRTaXplKCk7IGlJbmRleCsrKSB7Ci0gICAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFByZUl0ZW0gPSBrZWVwTGF5b3V0SXRlbXNbaUluZGV4XTsKLSAgICAgICAgICBwTGF5b3V0SXRlbS0+UmVtb3ZlQ2hpbGQocFByZUl0ZW0pOwotICAgICAgICAgIHBQcmVJdGVtLT5tX3NQb3MueSAtPSBmU3BsaXRQb3M7Ci0gICAgICAgICAgaWYgKHBQcmVJdGVtLT5tX3NQb3MueSA8IDApCi0gICAgICAgICAgICBwUHJlSXRlbS0+bV9zUG9zLnkgPSAwOwotCi0gICAgICAgICAgaWYgKHBQcmVJdGVtLT5tX3NQb3MueSArIHBQcmVJdGVtLT5tX3NTaXplLmhlaWdodCA+IGxIZWlnaHRGb3JLZWVwKSB7Ci0gICAgICAgICAgICBwUHJlSXRlbS0+bV9zUG9zLnkgPSBsSGVpZ2h0Rm9yS2VlcDsKLSAgICAgICAgICAgIGxIZWlnaHRGb3JLZWVwICs9IHBQcmVJdGVtLT5tX3NTaXplLmhlaWdodDsKLSAgICAgICAgICAgIHBTZWNvbmRMYXlvdXRJdGVtLT5tX3NTaXplLmhlaWdodCArPSBwUHJlSXRlbS0+bV9zU2l6ZS5oZWlnaHQ7Ci0gICAgICAgICAgICBpZiAocFNlY29uZFBhcmVudCkKLSAgICAgICAgICAgICAgcFNlY29uZFBhcmVudC0+bV9zU2l6ZS5oZWlnaHQgKz0gcFByZUl0ZW0tPm1fc1NpemUuaGVpZ2h0OwotICAgICAgICAgIH0KLSAgICAgICAgICBwU2Vjb25kTGF5b3V0SXRlbS0+QWRkQ2hpbGQocFByZUl0ZW0pOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHBDaGlsZEl0ZW0tPm1fc1Bvcy55IC09IGZTcGxpdFBvczsKLSAgICAgIHBDaGlsZEl0ZW0tPm1fc1Bvcy55ICs9IGxIZWlnaHRGb3JLZWVwOwotICAgICAgcENoaWxkSXRlbS0+bV9zUG9zLnkgKz0gZkFkZE1hcmdpbkhlaWdodDsKLSAgICAgIHBTZWNvbmRMYXlvdXRJdGVtLT5BZGRDaGlsZChwQ2hpbGRJdGVtKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGlmIChmU3BsaXRQb3MgKyBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTiA+PQotICAgICAgICBmQ3VyVG9wTWFyZ2luICsgZkN1ckJvdHRvbU1hcmdpbiArIHBDaGlsZEl0ZW0tPm1fc1Bvcy55ICsKLSAgICAgICAgICAgIHBDaGlsZEl0ZW0tPm1fc1NpemUuaGVpZ2h0KSB7Ci0gICAgICBwTGF5b3V0SXRlbS0+QWRkQ2hpbGQocENoaWxkSXRlbSk7Ci0gICAgICBpZiAoRXhpc3RDb250YWluZXJLZWVwKHBDaGlsZEl0ZW0tPm1fcEZvcm1Ob2RlLCBmYWxzZSkpCi0gICAgICAgIGtlZXBMYXlvdXRJdGVtcy5BZGQocENoaWxkSXRlbSk7Ci0gICAgICBlbHNlCi0gICAgICAgIGtlZXBMYXlvdXRJdGVtcy5SZW1vdmVBbGwoKTsKLQotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgRlhfRkxPQVQgZk9sZEhlaWdodCA9IHBTZWNvbmRMYXlvdXRJdGVtLT5tX3NTaXplLmhlaWdodDsKLSAgICBTcGxpdExheW91dEl0ZW0oCi0gICAgICAgIHBDaGlsZEl0ZW0sIHBTZWNvbmRMYXlvdXRJdGVtLAotICAgICAgICBmU3BsaXRQb3MgLSBmQ3VyVG9wTWFyZ2luIC0gZkN1ckJvdHRvbU1hcmdpbiAtIHBDaGlsZEl0ZW0tPm1fc1Bvcy55KTsKLSAgICBmQWRkTWFyZ2luSGVpZ2h0ID0gcFNlY29uZExheW91dEl0ZW0tPm1fc1NpemUuaGVpZ2h0IC0gZk9sZEhlaWdodDsKLSAgICBwTGF5b3V0SXRlbS0+QWRkQ2hpbGQocENoaWxkSXRlbSk7Ci0gIH0KLX0KLQotdm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OlNwbGl0TGF5b3V0SXRlbShGWF9GTE9BVCBmU3BsaXRQb3MpIHsKLSAgQVNTRVJUKG1fcExheW91dEl0ZW0pOwotICBTcGxpdExheW91dEl0ZW0obV9wTGF5b3V0SXRlbSwgbnVsbHB0ciwgZlNwbGl0UG9zKTsKLX0KLQotQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpFeHRyYWN0TGF5b3V0SXRlbSgpIHsKLSAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcExheW91dEl0ZW0gPSBtX3BMYXlvdXRJdGVtOwotICBpZiAocExheW91dEl0ZW0pIHsKLSAgICBtX3BMYXlvdXRJdGVtID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+KHBMYXlvdXRJdGVtLT5tX3BOZXh0U2libGluZyk7Ci0gICAgcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nID0gbnVsbHB0cjsKLSAgfQotCi0gIGlmIChtX25DdXJDaGlsZE5vZGVTdGFnZSAhPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6RG9uZSB8fAotICAgICAgIVRvQ29udGVudExheW91dEl0ZW0obV9wT2xkTGF5b3V0SXRlbSkpIHsKLSAgICByZXR1cm4gcExheW91dEl0ZW07Ci0gIH0KLQotICBpZiAobV9wT2xkTGF5b3V0SXRlbS0+bV9wUHJldikKLSAgICBtX3BPbGRMYXlvdXRJdGVtLT5tX3BQcmV2LT5tX3BOZXh0ID0gbnVsbHB0cjsKLQotICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0KLSAgICAgIG1fcE9sZExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLT5HZXREb2N1bWVudCgpLT5HZXROb3RpZnkoKTsKLSAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBEb2NMYXlvdXQgPQotICAgICAgbV9wT2xkTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldERvY3VtZW50KCktPkdldERvY0xheW91dCgpOwotICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwT2xkTGF5b3V0SXRlbSA9IG1fcE9sZExheW91dEl0ZW07Ci0gIHdoaWxlIChwT2xkTGF5b3V0SXRlbSkgewotICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBOZXh0T2xkTGF5b3V0SXRlbSA9IHBPbGRMYXlvdXRJdGVtLT5tX3BOZXh0OwotICAgIHBOb3RpZnktPk9uTGF5b3V0SXRlbVJlbW92aW5nKHBEb2NMYXlvdXQsIHBPbGRMYXlvdXRJdGVtKTsKLSAgICBpZiAocE9sZExheW91dEl0ZW0tPm1fcFBhcmVudCkKLSAgICAgIHBPbGRMYXlvdXRJdGVtLT5tX3BQYXJlbnQtPlJlbW92ZUNoaWxkKHBPbGRMYXlvdXRJdGVtKTsKLQotICAgIGRlbGV0ZSBwT2xkTGF5b3V0SXRlbTsKLSAgICBwT2xkTGF5b3V0SXRlbSA9IHBOZXh0T2xkTGF5b3V0SXRlbTsKLSAgfQotICBtX3BPbGRMYXlvdXRJdGVtID0gbnVsbHB0cjsKLSAgcmV0dXJuIHBMYXlvdXRJdGVtOwotfQotCi12b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6R290b05leHRDb250YWluZXJOb2RlKAotICAgIENYRkFfTm9kZSomIHBDdXJBY3Rpb25Ob2RlLAotICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzJiBuQ3VyU3RhZ2UsCi0gICAgQ1hGQV9Ob2RlKiBwUGFyZW50Q29udGFpbmVyLAotICAgIGJvb2wgYlVzZVBhZ2VCcmVhaykgewotICBDWEZBX05vZGUqIHBFbnRpcmVDb250YWluZXIgPSBwUGFyZW50Q29udGFpbmVyOwotICBDWEZBX05vZGUqIHBDaGlsZENvbnRhaW5lciA9IFhGQV9MQVlPVVRfSU5WQUxJRE5PREU7Ci0gIHN3aXRjaCAobkN1clN0YWdlKSB7Ci0gICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6QnJlYWtCZWZvcmU6Ci0gICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6QnJlYWtBZnRlcjogewotICAgICAgcENoaWxkQ29udGFpbmVyID0gcEN1ckFjdGlvbk5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OktlZXA6Ci0gICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6Q29udGFpbmVyOgotICAgICAgcENoaWxkQ29udGFpbmVyID0gcEN1ckFjdGlvbk5vZGU7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcENoaWxkQ29udGFpbmVyID0gWEZBX0xBWU9VVF9JTlZBTElETk9ERTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgc3dpdGNoIChuQ3VyU3RhZ2UpIHsKLSAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzOjpLZWVwOiB7Ci0gICAgICBDWEZBX05vZGUqIHBCcmVha0FmdGVyTm9kZSA9Ci0gICAgICAgICAgcENoaWxkQ29udGFpbmVyLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gICAgICBpZiAoIW1fYktlZXBCcmVha0ZpbmlzaCAmJgotICAgICAgICAgIEZpbmRCcmVha05vZGUocEJyZWFrQWZ0ZXJOb2RlLCBwQ3VyQWN0aW9uTm9kZSwgJm5DdXJTdGFnZSwgZmFsc2UpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGdvdG8gQ2hlY2tOZXh0Q2hpbGRDb250YWluZXI7Ci0gICAgfQotICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6Ok5vbmU6IHsKLSAgICAgIHBDdXJBY3Rpb25Ob2RlID0gWEZBX0xBWU9VVF9JTlZBTElETk9ERTsKLSAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkJvb2tlbmRMZWFkZXI6Ci0gICAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwQm9va2VuZE5vZGUgPQotICAgICAgICAgICAgICAgICBwQ3VyQWN0aW9uTm9kZSA9PSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFCi0gICAgICAgICAgICAgICAgICAgICA/IHBFbnRpcmVDb250YWluZXItPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKQotICAgICAgICAgICAgICAgICAgICAgOiBwQ3VyQWN0aW9uTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsKLSAgICAgICAgICAgICBwQm9va2VuZE5vZGU7IHBCb29rZW5kTm9kZSA9IHBCb29rZW5kTm9kZS0+R2V0Tm9kZUl0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgewotICAgICAgICAgIHN3aXRjaCAocEJvb2tlbmROb2RlLT5HZXRFbGVtZW50VHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIFhGQV9FbGVtZW50OjpCb29rZW5kOgotICAgICAgICAgICAgY2FzZSBYRkFfRWxlbWVudDo6QnJlYWs6Ci0gICAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gcEJvb2tlbmROb2RlOwotICAgICAgICAgICAgICBuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6Qm9va2VuZExlYWRlcjsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgICAgewotICAgICAgICBwQ3VyQWN0aW9uTm9kZSA9IFhGQV9MQVlPVVRfSU5WQUxJRE5PREU7Ci0gICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkJyZWFrQmVmb3JlOgotICAgICAgICAgIGlmIChwQ3VyQWN0aW9uTm9kZSAhPSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFKSB7Ci0gICAgICAgICAgICBDWEZBX05vZGUqIHBCcmVha0JlZm9yZU5vZGUgPQotICAgICAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOwotICAgICAgICAgICAgaWYgKCFtX2JLZWVwQnJlYWtGaW5pc2ggJiYKLSAgICAgICAgICAgICAgICBGaW5kQnJlYWtOb2RlKHBCcmVha0JlZm9yZU5vZGUsIHBDdXJBY3Rpb25Ob2RlLCAmbkN1clN0YWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkpIHsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1fYklzUHJvY2Vzc0tlZXApIHsKLSAgICAgICAgICAgICAgaWYgKFByb2Nlc3NLZWVwTm9kZXNGb3JCcmVha0JlZm9yZShwQ3VyQWN0aW9uTm9kZSwgbkN1clN0YWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDaGlsZENvbnRhaW5lcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZ290byBDaGVja05leHRDaGlsZENvbnRhaW5lcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gcENoaWxkQ29udGFpbmVyOwotICAgICAgICAgICAgbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkNvbnRhaW5lcjsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZ290byBDaGVja05leHRDaGlsZENvbnRhaW5lcjsKLSAgICAgIH0KLSAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzOjpDb250YWluZXI6IHsKLSAgICAgIHBDdXJBY3Rpb25Ob2RlID0gWEZBX0xBWU9VVF9JTlZBTElETk9ERTsKLSAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkJyZWFrQWZ0ZXI6IHsKLSAgICAgICAgaWYgKHBDdXJBY3Rpb25Ob2RlID09IFhGQV9MQVlPVVRfSU5WQUxJRE5PREUpIHsKLSAgICAgICAgICBDWEZBX05vZGUqIHBCcmVha0FmdGVyTm9kZSA9Ci0gICAgICAgICAgICAgIHBDaGlsZENvbnRhaW5lci0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgICAgICAgIGlmICghbV9iS2VlcEJyZWFrRmluaXNoICYmCi0gICAgICAgICAgICAgIEZpbmRCcmVha05vZGUocEJyZWFrQWZ0ZXJOb2RlLCBwQ3VyQWN0aW9uTm9kZSwgJm5DdXJTdGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgQ1hGQV9Ob2RlKiBwQnJlYWtBZnRlck5vZGUgPQotICAgICAgICAgICAgICBwQ3VyQWN0aW9uTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsKLSAgICAgICAgICBpZiAoRmluZEJyZWFrTm9kZShwQnJlYWtBZnRlck5vZGUsIHBDdXJBY3Rpb25Ob2RlLCAmbkN1clN0YWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBnb3RvIENoZWNrTmV4dENoaWxkQ29udGFpbmVyOwotICAgICAgfQotICAgIH0KLQotICAgIENoZWNrTmV4dENoaWxkQ29udGFpbmVyIDogewotICAgICAgQ1hGQV9Ob2RlKiBwTmV4dENoaWxkQ29udGFpbmVyID0KLSAgICAgICAgICBwQ2hpbGRDb250YWluZXIgPT0gWEZBX0xBWU9VVF9JTlZBTElETk9ERQotICAgICAgICAgICAgICA/IHBFbnRpcmVDb250YWluZXItPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250YWluZXJOb2RlKQotICAgICAgICAgICAgICA6IHBDaGlsZENvbnRhaW5lci0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGUpOwotICAgICAgd2hpbGUgKHBOZXh0Q2hpbGRDb250YWluZXIgJiYKLSAgICAgICAgICAgICBwTmV4dENoaWxkQ29udGFpbmVyLT5Jc0xheW91dEdlbmVyYXRlZE5vZGUoKSkgewotICAgICAgICBDWEZBX05vZGUqIHBTYXZlTm9kZSA9IHBOZXh0Q2hpbGRDb250YWluZXI7Ci0gICAgICAgIHBOZXh0Q2hpbGRDb250YWluZXIgPSBwTmV4dENoaWxkQ29udGFpbmVyLT5HZXROb2RlSXRlbSgKLSAgICAgICAgICAgIFhGQV9OT0RFSVRFTV9OZXh0U2libGluZywgWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGUpOwotICAgICAgICBpZiAocFNhdmVOb2RlLT5Jc1VudXNlZE5vZGUoKSkKLSAgICAgICAgICBEZWxldGVMYXlvdXRHZW5lcmF0ZWROb2RlKHBTYXZlTm9kZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoIXBOZXh0Q2hpbGRDb250YWluZXIpCi0gICAgICAgIGdvdG8gTm9Nb3JlQ2hpbGRDb250YWluZXI7Ci0KLSAgICAgIGJvb2wgYkxhc3RLZWVwID0gZmFsc2U7Ci0gICAgICBpZiAoUHJvY2Vzc0tlZXBOb2Rlc0ZvckNoZWNrTmV4dChwQ3VyQWN0aW9uTm9kZSwgbkN1clN0YWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE5leHRDaGlsZENvbnRhaW5lciwgYkxhc3RLZWVwKSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAoIW1fYktlZXBCcmVha0ZpbmlzaCAmJiAhYkxhc3RLZWVwICYmCi0gICAgICAgICAgRmluZEJyZWFrTm9kZSgKLSAgICAgICAgICAgICAgcE5leHRDaGlsZENvbnRhaW5lci0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpLAotICAgICAgICAgICAgICBwQ3VyQWN0aW9uTm9kZSwgJm5DdXJTdGFnZSwgdHJ1ZSkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgcEN1ckFjdGlvbk5vZGUgPSBwTmV4dENoaWxkQ29udGFpbmVyOwotICAgICAgaWYgKG1fYklzUHJvY2Vzc0tlZXApCi0gICAgICAgIG5DdXJTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzOjpLZWVwOwotICAgICAgZWxzZQotICAgICAgICBuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6Q29udGFpbmVyOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIE5vTW9yZUNoaWxkQ29udGFpbmVyIDogewotICAgICAgcEN1ckFjdGlvbk5vZGUgPSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFOwotICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6Qm9va2VuZFRyYWlsZXI6Ci0gICAgICAgIGZvciAoQ1hGQV9Ob2RlKiBwQm9va2VuZE5vZGUgPQotICAgICAgICAgICAgICAgICBwQ3VyQWN0aW9uTm9kZSA9PSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFCi0gICAgICAgICAgICAgICAgICAgICA/IHBFbnRpcmVDb250YWluZXItPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKQotICAgICAgICAgICAgICAgICAgICAgOiBwQ3VyQWN0aW9uTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsKLSAgICAgICAgICAgICBwQm9va2VuZE5vZGU7IHBCb29rZW5kTm9kZSA9IHBCb29rZW5kTm9kZS0+R2V0Tm9kZUl0ZW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX05PREVJVEVNX05leHRTaWJsaW5nKSkgewotICAgICAgICAgIHN3aXRjaCAocEJvb2tlbmROb2RlLT5HZXRFbGVtZW50VHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIFhGQV9FbGVtZW50OjpCb29rZW5kOgotICAgICAgICAgICAgY2FzZSBYRkFfRWxlbWVudDo6QnJlYWs6Ci0gICAgICAgICAgICAgIHBDdXJBY3Rpb25Ob2RlID0gcEJvb2tlbmROb2RlOwotICAgICAgICAgICAgICBuQ3VyU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6Qm9va2VuZFRyYWlsZXI7Ci0gICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgcEN1ckFjdGlvbk5vZGUgPSBudWxscHRyOwotICAgICAgbkN1clN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkRvbmU7Ci0gIH0KLX0KLQotYm9vbCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OlByb2Nlc3NLZWVwTm9kZXNGb3JDaGVja05leHQoCi0gICAgQ1hGQV9Ob2RlKiYgcEN1ckFjdGlvbk5vZGUsCi0gICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXMmIG5DdXJTdGFnZSwKLSAgICBDWEZBX05vZGUqJiBwTmV4dENvbnRhaW5lciwKLSAgICBib29sJiBiTGFzdEtlZXBOb2RlKSB7Ci0gIGNvbnN0IGJvb2wgYkNhblNwbGl0ID0gcE5leHRDb250YWluZXItPkdldEludGFjdCgpID09IFhGQV9BVFRSSUJVVEVFTlVNX05vbmU7Ci0gIGJvb2wgYk5leHRLZWVwID0gZmFsc2U7Ci0gIGlmIChFeGlzdENvbnRhaW5lcktlZXAocE5leHRDb250YWluZXIsIGZhbHNlKSkKLSAgICBiTmV4dEtlZXAgPSB0cnVlOwotCi0gIGlmIChiTmV4dEtlZXAgJiYgIWJDYW5TcGxpdCkgewotICAgIGlmICghbV9iSXNQcm9jZXNzS2VlcCAmJiAhbV9iS2VlcEJyZWFrRmluaXNoKSB7Ci0gICAgICBtX3BLZWVwSGVhZE5vZGUgPSBwTmV4dENvbnRhaW5lcjsKLSAgICAgIG1fYklzUHJvY2Vzc0tlZXAgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAobV9iSXNQcm9jZXNzS2VlcCAmJiBtX3BLZWVwSGVhZE5vZGUpIHsKLSAgICBtX3BLZWVwVGFpbE5vZGUgPSBwTmV4dENvbnRhaW5lcjsKLSAgICBpZiAoIW1fYktlZXBCcmVha0ZpbmlzaCAmJgotICAgICAgICBGaW5kQnJlYWtOb2RlKHBOZXh0Q29udGFpbmVyLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCksCi0gICAgICAgICAgICAgICAgICAgICAgcEN1ckFjdGlvbk5vZGUsICZuQ3VyU3RhZ2UsIHRydWUpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwTmV4dENvbnRhaW5lciA9IG1fcEtlZXBIZWFkTm9kZTsKLSAgICBtX2JLZWVwQnJlYWtGaW5pc2ggPSB0cnVlOwotICAgIG1fcEtlZXBIZWFkTm9kZSA9IG51bGxwdHI7Ci0gICAgbV9wS2VlcFRhaWxOb2RlID0gbnVsbHB0cjsKLSAgICBtX2JJc1Byb2Nlc3NLZWVwID0gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKG1fYktlZXBCcmVha0ZpbmlzaCkKLSAgICAgIGJMYXN0S2VlcE5vZGUgPSB0cnVlOwotICAgIG1fYktlZXBCcmVha0ZpbmlzaCA9IGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6UHJvY2Vzc0tlZXBOb2Rlc0ZvckJyZWFrQmVmb3JlKAotICAgIENYRkFfTm9kZSomIHBDdXJBY3Rpb25Ob2RlLAotICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzJiBuQ3VyU3RhZ2UsCi0gICAgQ1hGQV9Ob2RlKiBwQ29udGFpbmVyTm9kZSkgewotICBpZiAobV9wS2VlcFRhaWxOb2RlID09IHBDb250YWluZXJOb2RlKSB7Ci0gICAgcEN1ckFjdGlvbk5vZGUgPSBtX3BLZWVwSGVhZE5vZGU7Ci0gICAgbV9iS2VlcEJyZWFrRmluaXNoID0gdHJ1ZTsKLSAgICBtX3BLZWVwSGVhZE5vZGUgPSBudWxscHRyOwotICAgIG1fcEtlZXBUYWlsTm9kZSA9IG51bGxwdHI7Ci0gICAgbV9iSXNQcm9jZXNzS2VlcCA9IGZhbHNlOwotICAgIG5DdXJTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzOjpDb250YWluZXI7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBDWEZBX05vZGUqIHBCcmVha0FmdGVyTm9kZSA9Ci0gICAgICBwQ29udGFpbmVyTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICByZXR1cm4gRmluZEJyZWFrTm9kZShwQnJlYWtBZnRlck5vZGUsIHBDdXJBY3Rpb25Ob2RlLCAmbkN1clN0YWdlLCBmYWxzZSk7Ci19Ci0KLWJvb2wgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShDWEZBX05vZGUqIHBOb2RlKSB7Ci0gIFhGQV9BVFRSSUJVVEVFTlVNIGVQcmVzZW5jZSA9IHBOb2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfUHJlc2VuY2UpOwotICByZXR1cm4gZVByZXNlbmNlID09IFhGQV9BVFRSSUJVVEVFTlVNX1Zpc2libGUgfHwKLSAgICAgICAgIGVQcmVzZW5jZSA9PSBYRkFfQVRUUklCVVRFRU5VTV9JbnZpc2libGU7Ci19Ci0KLWJvb2wgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpJbmNyZW1lbnRSZWxheW91dE5vZGUoCi0gICAgQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXRQcm9jZXNzb3IsCi0gICAgQ1hGQV9Ob2RlKiBwTm9kZSwKLSAgICBDWEZBX05vZGUqIHBQYXJlbnROb2RlKSB7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkRvTGF5b3V0UGFnZUFyZWEoCi0gICAgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwUGFnZUFyZWFMYXlvdXRJdGVtKSB7Ci0gIENYRkFfTm9kZSogcEZvcm1Ob2RlID0gcFBhZ2VBcmVhTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGU7Ci0gIENYRkFfTm9kZSogcEN1ckNoaWxkTm9kZSA9IFhGQV9MQVlPVVRfSU5WQUxJRE5PREU7Ci0gIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzIG5DdXJDaGlsZE5vZGVTdGFnZSA9Ci0gICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6Tm9uZTsKLSAgQ1hGQV9MYXlvdXRJdGVtKiBwQmVmb3JlSXRlbSA9IG51bGxwdHI7Ci0gIGZvciAoR290b05leHRDb250YWluZXJOb2RlKHBDdXJDaGlsZE5vZGUsIG5DdXJDaGlsZE5vZGVTdGFnZSwgcEZvcm1Ob2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gICAgICAgcEN1ckNoaWxkTm9kZTsgR290b05leHRDb250YWluZXJOb2RlKHBDdXJDaGlsZE5vZGUsIG5DdXJDaGlsZE5vZGVTdGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEZvcm1Ob2RlLCBmYWxzZSkpIHsKLSAgICBpZiAobkN1ckNoaWxkTm9kZVN0YWdlICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzOjpDb250YWluZXIpCi0gICAgICBjb250aW51ZTsKLSAgICBpZiAocEN1ckNoaWxkTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6VmFyaWFibGVzKQotICAgICAgY29udGludWU7Ci0KLSAgICBhdXRvIHBQcm9jZXNzb3IgPQotICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yPihwQ3VyQ2hpbGROb2RlLCBudWxscHRyKTsKLSAgICBwUHJvY2Vzc29yLT5Eb0xheW91dChmYWxzZSwgRkxUX01BWCwgRkxUX01BWCwgbnVsbHB0cik7Ci0gICAgaWYgKCFwUHJvY2Vzc29yLT5IYXNMYXlvdXRJdGVtKCkpCi0gICAgICBjb250aW51ZTsKLQotICAgIHBQcm9jZXNzb3ItPlNldEN1cnJlbnRDb21wb25lbnRQb3MoQ2FsY3VsYXRlUG9zaXRpb25lZENvbnRhaW5lclBvcygKLSAgICAgICAgcEN1ckNoaWxkTm9kZSwgcFByb2Nlc3Nvci0+R2V0Q3VycmVudENvbXBvbmVudFNpemUoKSkpOwotICAgIENYRkFfTGF5b3V0SXRlbSogcFByb2Nlc3NJdGVtID0gcFByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKTsKLSAgICBpZiAoIXBCZWZvcmVJdGVtKQotICAgICAgcFBhZ2VBcmVhTGF5b3V0SXRlbS0+QWRkSGVhZENoaWxkKHBQcm9jZXNzSXRlbSk7Ci0gICAgZWxzZQotICAgICAgcFBhZ2VBcmVhTGF5b3V0SXRlbS0+SW5zZXJ0Q2hpbGQocEJlZm9yZUl0ZW0sIHBQcm9jZXNzSXRlbSk7Ci0KLSAgICBwQmVmb3JlSXRlbSA9IHBQcm9jZXNzSXRlbTsKLSAgfQotCi0gIHBCZWZvcmVJdGVtID0gbnVsbHB0cjsKLSAgQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSA9IHBQYWdlQXJlYUxheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7Ci0gIHdoaWxlIChwTGF5b3V0SXRlbSkgewotICAgIGlmICghcExheW91dEl0ZW0tPklzQ29udGVudExheW91dEl0ZW0oKSB8fAotICAgICAgICBwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OkRyYXcpIHsKLSAgICAgIHBMYXlvdXRJdGVtID0gcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmIChwTGF5b3V0SXRlbS0+bV9wRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OkRyYXcpCi0gICAgICBjb250aW51ZTsKLQotICAgIENYRkFfTGF5b3V0SXRlbSogcE5leHRMYXlvdXRJdGVtID0gcExheW91dEl0ZW0tPm1fcE5leHRTaWJsaW5nOwotICAgIHBQYWdlQXJlYUxheW91dEl0ZW0tPlJlbW92ZUNoaWxkKHBMYXlvdXRJdGVtKTsKLSAgICBpZiAoIXBCZWZvcmVJdGVtKQotICAgICAgcFBhZ2VBcmVhTGF5b3V0SXRlbS0+QWRkSGVhZENoaWxkKHBMYXlvdXRJdGVtKTsKLSAgICBlbHNlCi0gICAgICBwUGFnZUFyZWFMYXlvdXRJdGVtLT5JbnNlcnRDaGlsZChwQmVmb3JlSXRlbSwgcExheW91dEl0ZW0pOwotCi0gICAgcEJlZm9yZUl0ZW0gPSBwTGF5b3V0SXRlbTsKLSAgICBwTGF5b3V0SXRlbSA9IHBOZXh0TGF5b3V0SXRlbTsKLSAgfQotfQotCi12b2lkIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6RG9MYXlvdXRQb3NpdGlvbmVkQ29udGFpbmVyKAotICAgIENYRkFfTGF5b3V0Q29udGV4dCogcENvbnRleHQpIHsKLSAgaWYgKG1fcExheW91dEl0ZW0pCi0gICAgcmV0dXJuOwotCi0gIG1fcExheW91dEl0ZW0gPSBDcmVhdGVDb250ZW50TGF5b3V0SXRlbShtX3BGb3JtTm9kZSk7Ci0gIGJvb2wgYklnbm9yZVhZID0gKG1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0KSAhPQotICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTV9Qb3NpdGlvbik7Ci0gIGJvb2wgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSB0cnVlOwotICBib29sIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSA9IHRydWU7Ci0gIENGWF9TaXplRiBjb250YWluZXJTaXplID0gQ2FsY3VsYXRlQ29udGFpbmVyU3BlY2lmaWVkU2l6ZSgKLSAgICAgIG1fcEZvcm1Ob2RlLCAmYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsICZiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpOwotCi0gIEZYX0ZMT0FUIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoID0gMDsKLSAgRlhfRkxPQVQgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gMDsKLSAgRlhfRkxPQVQgZkhpZGRlbkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSAwOwotICBGWF9GTE9BVCBmSGlkZGVuQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSAwOwotICBpZiAobV9wQ3VyQ2hpbGROb2RlID09IFhGQV9MQVlPVVRfSU5WQUxJRE5PREUpIHsKLSAgICBHb3RvTmV4dENvbnRhaW5lck5vZGUobV9wQ3VyQ2hpbGROb2RlLCBtX25DdXJDaGlsZE5vZGVTdGFnZSwgbV9wRm9ybU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgfQotCi0gIGludDMyX3QgaUNvbEluZGV4ID0gMDsKLSAgZm9yICg7IG1fcEN1ckNoaWxkTm9kZTsgR290b05leHRDb250YWluZXJOb2RlKAotICAgICAgICAgICBtX3BDdXJDaGlsZE5vZGUsIG1fbkN1ckNoaWxkTm9kZVN0YWdlLCBtX3BGb3JtTm9kZSwgZmFsc2UpKSB7Ci0gICAgaWYgKG1fbkN1ckNoaWxkTm9kZVN0YWdlICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzOjpDb250YWluZXIpCi0gICAgICBjb250aW51ZTsKLSAgICBpZiAobV9wQ3VyQ2hpbGROb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpWYXJpYWJsZXMpCi0gICAgICBjb250aW51ZTsKLQotICAgIGF1dG8gcFByb2Nlc3NvciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I+KAotICAgICAgICBtX3BDdXJDaGlsZE5vZGUsIG1fcFBhZ2VNZ3IpOwotICAgIGlmIChwQ29udGV4dCAmJiBwQ29udGV4dC0+bV9wcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMpIHsKLSAgICAgIGludDMyX3QgaUNvbFNwYW4gPSBtX3BDdXJDaGlsZE5vZGUtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9Db2xTcGFuKTsKLSAgICAgIGlmIChpQ29sU3BhbiA8PQotICAgICAgICAgIHBDb250ZXh0LT5tX3ByZ1NwZWNpZmllZENvbHVtbldpZHRocy0+R2V0U2l6ZSgpIC0gaUNvbEluZGV4KSB7Ci0gICAgICAgIHBDb250ZXh0LT5tX2ZDdXJDb2x1bW5XaWR0aCA9IDA7Ci0gICAgICAgIHBDb250ZXh0LT5tX2JDdXJDb2x1bW5XaWR0aEF2YWlhYmxlID0gdHJ1ZTsKLSAgICAgICAgaWYgKGlDb2xTcGFuID09IC0xKQotICAgICAgICAgIGlDb2xTcGFuID0gcENvbnRleHQtPm1fcHJnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLT5HZXRTaXplKCk7Ci0KLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpQ29sSW5kZXggKyBpIDwgaUNvbFNwYW47ICsraSkgewotICAgICAgICAgIHBDb250ZXh0LT5tX2ZDdXJDb2x1bW5XaWR0aCArPQotICAgICAgICAgICAgICBwQ29udGV4dC0+bV9wcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHMtPkdldEF0KGlDb2xJbmRleCArIGkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwQ29udGV4dC0+bV9mQ3VyQ29sdW1uV2lkdGggPT0gMCkKLSAgICAgICAgICBwQ29udGV4dC0+bV9iQ3VyQ29sdW1uV2lkdGhBdmFpYWJsZSA9IGZhbHNlOwotCi0gICAgICAgIGlDb2xJbmRleCArPSBpQ29sU3BhbiA+PSAwID8gaUNvbFNwYW4gOiAwOwotICAgICAgfQotICAgIH0KLQotICAgIHBQcm9jZXNzb3ItPkRvTGF5b3V0KGZhbHNlLCBGTFRfTUFYLCBGTFRfTUFYLCBwQ29udGV4dCk7Ci0gICAgaWYgKCFwUHJvY2Vzc29yLT5IYXNMYXlvdXRJdGVtKCkpCi0gICAgICBjb250aW51ZTsKLQotICAgIENGWF9TaXplRiBzaXplID0gcFByb2Nlc3Nvci0+R2V0Q3VycmVudENvbXBvbmVudFNpemUoKTsKLSAgICBib29sIGJDaGFuZ2VQYXJlbnRTaXplID0gZmFsc2U7Ci0gICAgaWYgKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UobV9wQ3VyQ2hpbGROb2RlKSkKLSAgICAgIGJDaGFuZ2VQYXJlbnRTaXplID0gdHJ1ZTsKLQotICAgIENGWF9Qb2ludEYgYWJzb2x1dGVQb3M7Ci0gICAgaWYgKCFiSWdub3JlWFkpCi0gICAgICBhYnNvbHV0ZVBvcyA9IENhbGN1bGF0ZVBvc2l0aW9uZWRDb250YWluZXJQb3MobV9wQ3VyQ2hpbGROb2RlLCBzaXplKTsKLQotICAgIHBQcm9jZXNzb3ItPlNldEN1cnJlbnRDb21wb25lbnRQb3MoYWJzb2x1dGVQb3MpOwotICAgIGlmIChiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSkgewotICAgICAgRlhfRkxPQVQgZkNoaWxkU3VwcGxpZWRXaWR0aCA9IGFic29sdXRlUG9zLnggKyBzaXplLndpZHRoOwotICAgICAgaWYgKGJDaGFuZ2VQYXJlbnRTaXplKSB7Ci0gICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoID0KLSAgICAgICAgICAgIHN0ZDo6bWF4KGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoLCBmQ2hpbGRTdXBwbGllZFdpZHRoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChmSGlkZGVuQ29udGVudENhbGN1bGF0ZWRXaWR0aCA8IGZDaGlsZFN1cHBsaWVkV2lkdGggJiYKLSAgICAgICAgICAgIG1fcEN1ckNoaWxkTm9kZS0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6U3ViZm9ybSkgewotICAgICAgICAgIGZIaWRkZW5Db250ZW50Q2FsY3VsYXRlZFdpZHRoID0gZkNoaWxkU3VwcGxpZWRXaWR0aDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGlmIChiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpIHsKLSAgICAgIEZYX0ZMT0FUIGZDaGlsZFN1cHBsaWVkSGVpZ2h0ID0gYWJzb2x1dGVQb3MueSArIHNpemUuaGVpZ2h0OwotICAgICAgaWYgKGJDaGFuZ2VQYXJlbnRTaXplKSB7Ci0gICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA9Ci0gICAgICAgICAgICBzdGQ6Om1heChmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsIGZDaGlsZFN1cHBsaWVkSGVpZ2h0KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChmSGlkZGVuQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPCBmQ2hpbGRTdXBwbGllZEhlaWdodCAmJgotICAgICAgICAgICAgbV9wQ3VyQ2hpbGROb2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpTdWJmb3JtKSB7Ci0gICAgICAgICAgZkhpZGRlbkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gZkNoaWxkU3VwcGxpZWRIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgbV9wTGF5b3V0SXRlbS0+QWRkQ2hpbGQocFByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKSk7Ci0gIH0KLQotICBYRkFfVkVSU0lPTiBlVmVyc2lvbiA9IG1fcEZvcm1Ob2RlLT5HZXREb2N1bWVudCgpLT5HZXRDdXJWZXJzaW9uTW9kZSgpOwotICBpZiAoZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPT0gMCAmJiBlVmVyc2lvbiA8IFhGQV9WRVJTSU9OXzIwNykKLSAgICBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IGZIaWRkZW5Db250ZW50Q2FsY3VsYXRlZFdpZHRoOwotICBpZiAoZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID09IDAgJiYgZVZlcnNpb24gPCBYRkFfVkVSU0lPTl8yMDcpCi0gICAgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gZkhpZGRlbkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0OwotCi0gIGNvbnRhaW5lclNpemUgPSBDYWxjdWxhdGVDb250YWluZXJDb21wb25lbnRTaXplRnJvbUNvbnRlbnRTaXplKAotICAgICAgbV9wRm9ybU5vZGUsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLCBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCwKLSAgICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0LCBjb250YWluZXJTaXplKTsKLSAgU2V0Q3VycmVudENvbXBvbmVudFNpemUoY29udGFpbmVyU2l6ZSk7Ci19Ci0KLXZvaWQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpEb0xheW91dFRhYmxlQ29udGFpbmVyKENYRkFfTm9kZSogcExheW91dE5vZGUpIHsKLSAgaWYgKG1fcExheW91dEl0ZW0pCi0gICAgcmV0dXJuOwotICBpZiAoIXBMYXlvdXROb2RlKQotICAgIHBMYXlvdXROb2RlID0gbV9wRm9ybU5vZGU7Ci0KLSAgQVNTRVJUKG1fcEN1ckNoaWxkTm9kZSA9PSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFKTsKLQotICBtX3BMYXlvdXRJdGVtID0gQ3JlYXRlQ29udGVudExheW91dEl0ZW0obV9wRm9ybU5vZGUpOwotICBib29sIGJDb250YWluZXJXaWR0aEF1dG9TaXplID0gdHJ1ZTsKLSAgYm9vbCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgPSB0cnVlOwotICBDRlhfU2l6ZUYgY29udGFpbmVyU2l6ZSA9IENhbGN1bGF0ZUNvbnRhaW5lclNwZWNpZmllZFNpemUoCi0gICAgICBtX3BGb3JtTm9kZSwgJmJDb250YWluZXJXaWR0aEF1dG9TaXplLCAmYkNvbnRhaW5lckhlaWdodEF1dG9TaXplKTsKLSAgRlhfRkxPQVQgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSAwOwotICBGWF9GTE9BVCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSAwOwotICBDWEZBX05vZGUqIHBNYXJnaW5Ob2RlID0KLSAgICAgIG1fcEZvcm1Ob2RlLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRWxlbWVudDo6TWFyZ2luKTsKLSAgRlhfRkxPQVQgZkxlZnRJbnNldCA9IDA7Ci0gIEZYX0ZMT0FUIGZSaWdodEluc2V0ID0gMDsKLSAgaWYgKHBNYXJnaW5Ob2RlKSB7Ci0gICAgZkxlZnRJbnNldCA9Ci0gICAgICAgIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfTGVmdEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOwotICAgIGZSaWdodEluc2V0ID0KLSAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9SaWdodEluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOwotICB9Ci0KLSAgRlhfRkxPQVQgZkNvbnRlbnRXaWR0aExpbWl0ID0KLSAgICAgIGJDb250YWluZXJXaWR0aEF1dG9TaXplID8gRkxUX01BWAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBjb250YWluZXJTaXplLndpZHRoIC0gZkxlZnRJbnNldCAtIGZSaWdodEluc2V0OwotICBDRlhfV2lkZVN0cmluZ0Mgd3NDb2x1bW5XaWR0aHM7Ci0gIGlmIChwTGF5b3V0Tm9kZS0+VHJ5Q0RhdGEoWEZBX0FUVFJJQlVURV9Db2x1bW5XaWR0aHMsIHdzQ29sdW1uV2lkdGhzKSkgewotICAgIGF1dG8gd2lkdGhzID0gU2VwYXJhdGVTdHJpbmdXKHdzQ29sdW1uV2lkdGhzLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3NDb2x1bW5XaWR0aHMuR2V0TGVuZ3RoKCksIEwnICcpOwotICAgIGZvciAoYXV0byYgd2lkdGggOiB3aWR0aHMpIHsKLSAgICAgIHdpZHRoLlRyaW1MZWZ0KEwnICcpOwotICAgICAgaWYgKHdpZHRoLklzRW1wdHkoKSkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIENYRkFfTWVhc3VyZW1lbnQgbWVhc3VyZSh3aWR0aC5Bc1N0cmluZ0MoKSk7Ci0gICAgICBtX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzLkFkZChtZWFzdXJlLlRvVW5pdChYRkFfVU5JVF9QdCkpOwotICAgIH0KLSAgfQotCi0gIGludDMyX3QgaVNwZWNpZmllZENvbHVtbkNvdW50ID0gbV9yZ1NwZWNpZmllZENvbHVtbldpZHRocy5HZXRTaXplKCk7Ci0gIENYRkFfTGF5b3V0Q29udGV4dCBsYXlvdXRDb250ZXh0OwotICBsYXlvdXRDb250ZXh0Lm1fcHJnU3BlY2lmaWVkQ29sdW1uV2lkdGhzID0gJm1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHM7Ci0gIENYRkFfTGF5b3V0Q29udGV4dCogcExheW91dENvbnRleHQgPQotICAgICAgaVNwZWNpZmllZENvbHVtbkNvdW50ID4gMCA/ICZsYXlvdXRDb250ZXh0IDogbnVsbHB0cjsKLSAgaWYgKG1fcEN1ckNoaWxkTm9kZSA9PSBYRkFfTEFZT1VUX0lOVkFMSUROT0RFKSB7Ci0gICAgR290b05leHRDb250YWluZXJOb2RlKG1fcEN1ckNoaWxkTm9kZSwgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UsIG1fcEZvcm1Ob2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7Ci0gIH0KLQotICBmb3IgKDsgbV9wQ3VyQ2hpbGROb2RlOyBHb3RvTmV4dENvbnRhaW5lck5vZGUoCi0gICAgICAgICAgIG1fcEN1ckNoaWxkTm9kZSwgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UsIG1fcEZvcm1Ob2RlLCBmYWxzZSkpIHsKLSAgICBsYXlvdXRDb250ZXh0Lm1fYkN1ckNvbHVtbldpZHRoQXZhaWFibGUgPSBmYWxzZTsKLSAgICBsYXlvdXRDb250ZXh0Lm1fZkN1ckNvbHVtbldpZHRoID0gMDsKLSAgICBpZiAobV9uQ3VyQ2hpbGROb2RlU3RhZ2UgIT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkNvbnRhaW5lcikKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgYXV0byBwUHJvY2Vzc29yID0gcGRmaXVtOjpNYWtlVW5pcXVlPENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcj4oCi0gICAgICAgIG1fcEN1ckNoaWxkTm9kZSwgbV9wUGFnZU1ncik7Ci0gICAgcFByb2Nlc3Nvci0+RG9MYXlvdXQoZmFsc2UsIEZMVF9NQVgsIEZMVF9NQVgsIHBMYXlvdXRDb250ZXh0KTsKLSAgICBpZiAoIXBQcm9jZXNzb3ItPkhhc0xheW91dEl0ZW0oKSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgbV9wTGF5b3V0SXRlbS0+QWRkQ2hpbGQocFByb2Nlc3Nvci0+RXh0cmFjdExheW91dEl0ZW0oKSk7Ci0gIH0KLQotICBpbnQzMl90IGlSb3dDb3VudCA9IDA7Ci0gIGludDMyX3QgaUNvbENvdW50ID0gMDsKLSAgewotICAgIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW0qPiByZ1Jvd0l0ZW1zOwotICAgIENGWF9BcnJheVRlbXBsYXRlPGludDMyX3Q+IHJnUm93SXRlbXNTcGFuOwotICAgIENGWF9BcnJheVRlbXBsYXRlPEZYX0ZMT0FUPiByZ1Jvd0l0ZW1zV2lkdGg7Ci0gICAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0Q2hpbGQgPQotICAgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiltX3BMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOwotICAgICAgICAgcExheW91dENoaWxkOwotICAgICAgICAgcExheW91dENoaWxkID0gKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXRDaGlsZC0+bV9wTmV4dFNpYmxpbmcpIHsKLSAgICAgIGlmIChwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpTdWJmb3JtKQotICAgICAgICBjb250aW51ZTsKLSAgICAgIGlmICghWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlKSkKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQgPQotICAgICAgICAgIHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9MYXlvdXQpOwotICAgICAgaWYgKGVMYXlvdXQgIT0gWEZBX0FUVFJJQlVURUVOVU1fUm93ICYmCi0gICAgICAgICAgZUxheW91dCAhPSBYRkFfQVRUUklCVVRFRU5VTV9SbF9yb3cpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFJvd0xheW91dENlbGwgPQotICAgICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcExheW91dENoaWxkLT5tX3BGaXJzdENoaWxkKSB7Ci0gICAgICAgIHJnUm93SXRlbXMuQWRkKHBSb3dMYXlvdXRDZWxsKTsKLSAgICAgICAgaW50MzJfdCBpQ29sU3BhbiA9Ci0gICAgICAgICAgICBwUm93TGF5b3V0Q2VsbC0+bV9wRm9ybU5vZGUtPkdldEludGVnZXIoWEZBX0FUVFJJQlVURV9Db2xTcGFuKTsKLSAgICAgICAgcmdSb3dJdGVtc1NwYW4uQWRkKGlDb2xTcGFuKTsKLSAgICAgICAgcmdSb3dJdGVtc1dpZHRoLkFkZChwUm93TGF5b3V0Q2VsbC0+bV9zU2l6ZS53aWR0aCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaVJvd0NvdW50ID0gcmdSb3dJdGVtcy5HZXRTaXplKCk7Ci0gICAgaUNvbENvdW50ID0gMDsKLSAgICBib29sIGJNb3JlQ29sdW1ucyA9IHRydWU7Ci0gICAgd2hpbGUgKGJNb3JlQ29sdW1ucykgewotICAgICAgYk1vcmVDb2x1bW5zID0gZmFsc2U7Ci0gICAgICBib29sIGJBdXRvQ29sID0gZmFsc2U7Ci0gICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpUm93Q291bnQ7IGkrKykgewotICAgICAgICB3aGlsZSAocmdSb3dJdGVtc1tpXSAmJiAocmdSb3dJdGVtc1NwYW5baV0gPD0gMCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIVhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmdSb3dJdGVtc1tpXS0+bV9wRm9ybU5vZGUpKSkgewotICAgICAgICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBOZXdDZWxsID0KLSAgICAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXJnUm93SXRlbXNbaV0tPm1fcE5leHRTaWJsaW5nOwotICAgICAgICAgIGlmIChyZ1Jvd0l0ZW1zU3BhbltpXSA8IDAgJiYgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ1Jvd0l0ZW1zW2ldLT5tX3BGb3JtTm9kZSkpIHsKLSAgICAgICAgICAgIHBOZXdDZWxsID0gbnVsbHB0cjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmdSb3dJdGVtc1tpXSA9IHBOZXdDZWxsOwotICAgICAgICAgIHJnUm93SXRlbXNTcGFuW2ldID0KLSAgICAgICAgICAgICAgcE5ld0NlbGwKLSAgICAgICAgICAgICAgICAgID8gcE5ld0NlbGwtPm1fcEZvcm1Ob2RlLT5HZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEVfQ29sU3BhbikKLSAgICAgICAgICAgICAgICAgIDogMDsKLSAgICAgICAgICByZ1Jvd0l0ZW1zV2lkdGhbaV0gPSBwTmV3Q2VsbCA/IHBOZXdDZWxsLT5tX3NTaXplLndpZHRoIDogMDsKLSAgICAgICAgfQotICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwQ2VsbCA9IHJnUm93SXRlbXNbaV07Ci0gICAgICAgIGlmICghcENlbGwpCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgYk1vcmVDb2x1bW5zID0gdHJ1ZTsKLSAgICAgICAgaWYgKHJnUm93SXRlbXNTcGFuW2ldICE9IDEpCi0gICAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgaWYgKGlDb2xDb3VudCA+PSBpU3BlY2lmaWVkQ29sdW1uQ291bnQpIHsKLSAgICAgICAgICBpbnQzMl90IGMgPSBpQ29sQ291bnQgKyAxIC0gbV9yZ1NwZWNpZmllZENvbHVtbldpZHRocy5HZXRTaXplKCk7Ci0gICAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgYzsgaisrKQotICAgICAgICAgICAgbV9yZ1NwZWNpZmllZENvbHVtbldpZHRocy5BZGQoMCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1fcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHNbaUNvbENvdW50XSA8IFhGQV9MQVlPVVRfRkxPQVRfUEVSQ0lTSU9OKQotICAgICAgICAgIGJBdXRvQ29sID0gdHJ1ZTsKLSAgICAgICAgaWYgKGJBdXRvQ29sICYmCi0gICAgICAgICAgICBtX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzW2lDb2xDb3VudF0gPCByZ1Jvd0l0ZW1zV2lkdGhbaV0pIHsKLSAgICAgICAgICBtX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzW2lDb2xDb3VudF0gPSByZ1Jvd0l0ZW1zV2lkdGhbaV07Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCFiTW9yZUNvbHVtbnMpCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBGWF9GTE9BVCBmRmluYWxDb2x1bW5XaWR0aCA9IDAuMGY7Ci0gICAgICBpZiAoaUNvbENvdW50IDwgbV9yZ1NwZWNpZmllZENvbHVtbldpZHRocy5HZXRTaXplKCkpCi0gICAgICAgIGZGaW5hbENvbHVtbldpZHRoID0gbV9yZ1NwZWNpZmllZENvbHVtbldpZHRoc1tpQ29sQ291bnRdOwotICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaVJvd0NvdW50OyArK2kpIHsKLSAgICAgICAgaWYgKCFyZ1Jvd0l0ZW1zW2ldKQotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAtLXJnUm93SXRlbXNTcGFuW2ldOwotICAgICAgICByZ1Jvd0l0ZW1zV2lkdGhbaV0gLT0gZkZpbmFsQ29sdW1uV2lkdGg7Ci0gICAgICB9Ci0gICAgICArK2lDb2xDb3VudDsKLSAgICB9Ci0gIH0KLQotICBGWF9GTE9BVCBmQ3VycmVudFJvd1kgPSAwOwotICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXRDaGlsZCA9Ci0gICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiltX3BMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOwotICAgICAgIHBMYXlvdXRDaGlsZDsKLSAgICAgICBwTGF5b3V0Q2hpbGQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcExheW91dENoaWxkLT5tX3BOZXh0U2libGluZykgewotICAgIGlmICghWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlKSkKLSAgICAgIGNvbnRpbnVlOwotCi0gICAgaWYgKHBMYXlvdXRDaGlsZC0+bV9wRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlN1YmZvcm0pIHsKLSAgICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVTdWJmb3JtTGF5b3V0ID0KLSAgICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fcEZvcm1Ob2RlLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfTGF5b3V0KTsKLSAgICAgIGlmIChlU3ViZm9ybUxheW91dCA9PSBYRkFfQVRUUklCVVRFRU5VTV9Sb3cgfHwKLSAgICAgICAgICBlU3ViZm9ybUxheW91dCA9PSBYRkFfQVRUUklCVVRFRU5VTV9SbF9yb3cpIHsKLSAgICAgICAgUmVsb2NhdGVUYWJsZVJvd0NlbGxzKHBMYXlvdXRDaGlsZCwgbV9yZ1NwZWNpZmllZENvbHVtbldpZHRocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVTdWJmb3JtTGF5b3V0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwTGF5b3V0Q2hpbGQtPm1fc1Bvcy55ID0gZkN1cnJlbnRSb3dZOwotICAgIGlmIChiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSkgewotICAgICAgcExheW91dENoaWxkLT5tX3NQb3MueCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN3aXRjaCAocExheW91dENoaWxkLT5tX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0hBbGlnbikpIHsKLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9DZW50ZXI6Ci0gICAgICAgICAgcExheW91dENoaWxkLT5tX3NQb3MueCA9Ci0gICAgICAgICAgICAgIChmQ29udGVudFdpZHRoTGltaXQgLSBwTGF5b3V0Q2hpbGQtPm1fc1NpemUud2lkdGgpIC8gMjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBYRkFfQVRUUklCVVRFRU5VTV9SaWdodDoKLSAgICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fc1Bvcy54ID0KLSAgICAgICAgICAgICAgZkNvbnRlbnRXaWR0aExpbWl0IC0gcExheW91dENoaWxkLT5tX3NTaXplLndpZHRoOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX0xlZnQ6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcExheW91dENoaWxkLT5tX3NQb3MueCA9IDA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGJDb250YWluZXJXaWR0aEF1dG9TaXplKSB7Ci0gICAgICBGWF9GTE9BVCBmQ2hpbGRTdXBwbGllZFdpZHRoID0KLSAgICAgICAgICBwTGF5b3V0Q2hpbGQtPm1fc1Bvcy54ICsgcExheW91dENoaWxkLT5tX3NTaXplLndpZHRoOwotICAgICAgaWYgKGZDb250ZW50V2lkdGhMaW1pdCA8IEZMVF9NQVggJiYKLSAgICAgICAgICBmQ29udGVudFdpZHRoTGltaXQgPiBmQ2hpbGRTdXBwbGllZFdpZHRoKSB7Ci0gICAgICAgIGZDaGlsZFN1cHBsaWVkV2lkdGggPSBmQ29udGVudFdpZHRoTGltaXQ7Ci0gICAgICB9Ci0gICAgICBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9Ci0gICAgICAgICAgc3RkOjptYXgoZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsIGZDaGlsZFN1cHBsaWVkV2lkdGgpOwotICAgIH0KLSAgICBmQ3VycmVudFJvd1kgKz0gcExheW91dENoaWxkLT5tX3NTaXplLmhlaWdodDsKLSAgfQotCi0gIGlmIChiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpCi0gICAgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0gc3RkOjptYXgoZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0LCBmQ3VycmVudFJvd1kpOwotCi0gIGNvbnRhaW5lclNpemUgPSBDYWxjdWxhdGVDb250YWluZXJDb21wb25lbnRTaXplRnJvbUNvbnRlbnRTaXplKAotICAgICAgbV9wRm9ybU5vZGUsIGJDb250YWluZXJXaWR0aEF1dG9TaXplLCBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCwKLSAgICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0LCBjb250YWluZXJTaXplKTsKLSAgU2V0Q3VycmVudENvbXBvbmVudFNpemUoY29udGFpbmVyU2l6ZSk7Ci19Ci0KLWJvb2wgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpJc0FkZE5ld1Jvd0ZvclRyYWlsZXIoCi0gICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFRyYWlsZXJJdGVtKSB7Ci0gIGlmICghcFRyYWlsZXJJdGVtKQotICAgIHJldHVybiBmYWxzZTsKLQotICBGWF9GTE9BVCBmV2lkdGggPSBwVHJhaWxlckl0ZW0tPm1fc1NpemUud2lkdGg7Ci0gIFhGQV9BVFRSSUJVVEVFTlVNIGVMYXlvdXQgPSBtX3BGb3JtTm9kZS0+R2V0RW51bShYRkFfQVRUUklCVVRFX0xheW91dCk7Ci0gIHJldHVybiBlTGF5b3V0ID09IFhGQV9BVFRSSUJVVEVFTlVNX1RiIHx8IG1fZldpZHRoTGltaXRlIDw9IGZXaWR0aDsKLX0KLQotRlhfRkxPQVQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpJbnNlcnRLZWVwTGF5b3V0SXRlbXMoKSB7Ci0gIGlmIChtX2FycmF5S2VlcEl0ZW1zLmVtcHR5KCkpCi0gICAgcmV0dXJuIDA7Ci0KLSAgaWYgKCFtX3BMYXlvdXRJdGVtKSB7Ci0gICAgbV9wTGF5b3V0SXRlbSA9IENyZWF0ZUNvbnRlbnRMYXlvdXRJdGVtKG1fcEZvcm1Ob2RlKTsKLSAgICBtX3BMYXlvdXRJdGVtLT5tX3NTaXplLmNsZWFyKCk7Ci0gIH0KLQotICBGWF9GTE9BVCBmVG90YWxIZWlnaHQgPSAwOwotICBmb3IgKGF1dG8gaXRlciA9IG1fYXJyYXlLZWVwSXRlbXMucmJlZ2luKCk7IGl0ZXIgIT0gbV9hcnJheUtlZXBJdGVtcy5yZW5kKCk7Ci0gICAgICAgaXRlcisrKSB7Ci0gICAgQWRkTGVhZGVyQWZ0ZXJTcGxpdCh0aGlzLCAqaXRlcik7Ci0gICAgZlRvdGFsSGVpZ2h0ICs9ICgqaXRlciktPm1fc1NpemUuaGVpZ2h0OwotICB9Ci0gIG1fYXJyYXlLZWVwSXRlbXMuY2xlYXIoKTsKLQotICByZXR1cm4gZlRvdGFsSGVpZ2h0OwotfQotCi1ib29sIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6UHJvY2Vzc0tlZXBGb3JTcGxpdCgKLSAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQYXJlbnRQcm9jZXNzb3IsCi0gICAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBwQ2hpbGRQcm9jZXNzb3IsCi0gICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQgZVJldFZhbHVlLAotICAgIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW0qPiogcmdDdXJMaW5lTGF5b3V0SXRlbSwKLSAgICBGWF9GTE9BVCogZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLAotICAgIEZYX0ZMT0FUKiBmQ29udGVudEN1clJvd0hlaWdodCwKLSAgICBGWF9GTE9BVCogZkNvbnRlbnRDdXJSb3dZLAotICAgIGJvb2wqIGJBZGRlZEl0ZW1JblJvdywKLSAgICBib29sKiBiRm9yY2VFbmRQYWdlLAotICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0KiByZXN1bHQpIHsKLSAgaWYgKCFwUGFyZW50UHJvY2Vzc29yIHx8ICFwQ2hpbGRQcm9jZXNzb3IpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChwUGFyZW50UHJvY2Vzc29yLT5tX3BDdXJDaGlsZE5vZGUtPkdldEludGFjdCgpID09Ci0gICAgICAgICAgWEZBX0FUVFJJQlVURUVOVU1fTm9uZSAmJgotICAgICAgcENoaWxkUHJvY2Vzc29yLT5tX2JIYXNBdmFpbEhlaWdodCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFFeGlzdENvbnRhaW5lcktlZXAocFBhcmVudFByb2Nlc3Nvci0+bV9wQ3VyQ2hpbGROb2RlLCB0cnVlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ0ZYX1NpemVGIGNoaWxkU2l6ZSA9IHBDaGlsZFByb2Nlc3Nvci0+R2V0Q3VycmVudENvbXBvbmVudFNpemUoKTsKLSAgc3RkOjp2ZWN0b3I8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+IGtlZXBMYXlvdXRJdGVtczsKLSAgaWYgKHBQYXJlbnRQcm9jZXNzb3ItPkp1ZGdlUHV0TmV4dFBhZ2UocFBhcmVudFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRTaXplLmhlaWdodCwgJmtlZXBMYXlvdXRJdGVtcykpIHsKLSAgICBtX2FycmF5S2VlcEl0ZW1zLmNsZWFyKCk7Ci0KLSAgICBmb3IgKGF1dG8gaXRlbSA6IGtlZXBMYXlvdXRJdGVtcykgewotICAgICAgcFBhcmVudFByb2Nlc3Nvci0+bV9wTGF5b3V0SXRlbS0+UmVtb3ZlQ2hpbGQoaXRlbSk7Ci0gICAgICAqZkNvbnRlbnRDdXJSb3dZIC09IGl0ZW0tPm1fc1NpemUuaGVpZ2h0OwotICAgICAgbV9hcnJheUtlZXBJdGVtcy5wdXNoX2JhY2soaXRlbSk7Ci0gICAgfQotICAgICpiQWRkZWRJdGVtSW5Sb3cgPSB0cnVlOwotICAgICpiRm9yY2VFbmRQYWdlID0gdHJ1ZTsKLSAgICAqcmVzdWx0ID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OlBhZ2VGdWxsQnJlYWs7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICByZ0N1ckxpbmVMYXlvdXRJdGVtLT5BZGQocENoaWxkUHJvY2Vzc29yLT5FeHRyYWN0TGF5b3V0SXRlbSgpKTsKLSAgKmJBZGRlZEl0ZW1JblJvdyA9IHRydWU7Ci0gICpmQ29udGVudEN1clJvd0F2YWlsV2lkdGggLT0gY2hpbGRTaXplLndpZHRoOwotICAqZkNvbnRlbnRDdXJSb3dIZWlnaHQgPSBzdGQ6Om1heCgqZkNvbnRlbnRDdXJSb3dIZWlnaHQsIGNoaWxkU2l6ZS5oZWlnaHQpOwotICAqcmVzdWx0ID0gZVJldFZhbHVlOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENYRkFfSXRlbUxheW91dFByb2Nlc3Nvcjo6SnVkZ2VQdXROZXh0UGFnZSgKLSAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwUGFyZW50TGF5b3V0SXRlbSwKLSAgICBGWF9GTE9BVCBmQ2hpbGRIZWlnaHQsCi0gICAgc3RkOjp2ZWN0b3I8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+KiBwS2VlcEl0ZW1zKSB7Ci0gIGlmICghcFBhcmVudExheW91dEl0ZW0pCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIEZYX0ZMT0FUIGZJdGVtc0hlaWdodCA9IDA7Ci0gIGZvciAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcENoaWxkTGF5b3V0SXRlbSA9Ci0gICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwUGFyZW50TGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsKLSAgICAgICBwQ2hpbGRMYXlvdXRJdGVtOwotICAgICAgIHBDaGlsZExheW91dEl0ZW0gPQotICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcENoaWxkTGF5b3V0SXRlbS0+bV9wTmV4dFNpYmxpbmcpIHsKLSAgICBpZiAoRXhpc3RDb250YWluZXJLZWVwKHBDaGlsZExheW91dEl0ZW0tPm1fcEZvcm1Ob2RlLCBmYWxzZSkpIHsKLSAgICAgIHBLZWVwSXRlbXMtPnB1c2hfYmFjayhwQ2hpbGRMYXlvdXRJdGVtKTsKLSAgICAgIGZJdGVtc0hlaWdodCArPSBwQ2hpbGRMYXlvdXRJdGVtLT5tX3NTaXplLmhlaWdodDsKLSAgICB9IGVsc2UgewotICAgICAgcEtlZXBJdGVtcy0+Y2xlYXIoKTsKLSAgICAgIGZJdGVtc0hlaWdodCA9IDA7Ci0gICAgfQotICB9Ci0gIGZJdGVtc0hlaWdodCArPSBmQ2hpbGRIZWlnaHQ7Ci0gIHJldHVybiBtX3BQYWdlTWdyLT5HZXROZXh0QXZhaWxDb250ZW50SGVpZ2h0KGZJdGVtc0hlaWdodCk7Ci19Ci0KLXZvaWQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpQcm9jZXNzVW5Vc2VCaW5kcyhDWEZBX05vZGUqIHBGb3JtTm9kZSkgewotICBpZiAoIXBGb3JtTm9kZSkKLSAgICByZXR1cm47Ci0KLSAgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFOb2RlPiBzSXRlcmF0b3IoCi0gICAgICBwRm9ybU5vZGUpOwotICBmb3IgKENYRkFfTm9kZSogcE5vZGUgPSBzSXRlcmF0b3IuTW92ZVRvTmV4dCgpOyBwTm9kZTsKLSAgICAgICBwTm9kZSA9IHNJdGVyYXRvci5Nb3ZlVG9OZXh0KCkpIHsKLSAgICBpZiAocE5vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB7Ci0gICAgICBDWEZBX05vZGUqIHBCaW5kTm9kZSA9IHBOb2RlLT5HZXRCaW5kRGF0YSgpOwotICAgICAgaWYgKHBCaW5kTm9kZSkgewotICAgICAgICBwQmluZE5vZGUtPlJlbW92ZUJpbmRJdGVtKHBOb2RlKTsKLSAgICAgICAgcE5vZGUtPlNldE9iamVjdChYRkFfQVRUUklCVVRFX0JpbmRpbmdOb2RlLCBudWxscHRyKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcE5vZGUtPlNldEZsYWcoWEZBX05vZGVGbGFnX1VudXNlZE5vZGUsIHRydWUpOwotICB9Ci19Ci0KLXZvaWQgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpQcm9jZXNzVW5Vc2VPdmVyRmxvdygKLSAgICBDWEZBX05vZGUqIHBMZWFkZXJOb2RlLAotICAgIENYRkFfTm9kZSogcFRyYWlsZXJOb2RlLAotICAgIENYRkFfQ29udGVudExheW91dEl0ZW0qIHBUcmFpbGVySXRlbSwKLSAgICBDWEZBX05vZGUqIHBGb3JtTm9kZSkgewotICBQcm9jZXNzVW5Vc2VCaW5kcyhwTGVhZGVyTm9kZSk7Ci0gIFByb2Nlc3NVblVzZUJpbmRzKHBUcmFpbGVyTm9kZSk7Ci0gIGlmICghcEZvcm1Ob2RlKQotICAgIHJldHVybjsKLQotICBpZiAocEZvcm1Ob2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpPdmVyZmxvdyB8fAotICAgICAgcEZvcm1Ob2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpCcmVhaykgewotICAgIHBGb3JtTm9kZSA9IHBGb3JtTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7Ci0gIH0KLSAgaWYgKHBMZWFkZXJOb2RlICYmIHBGb3JtTm9kZSkKLSAgICBwRm9ybU5vZGUtPlJlbW92ZUNoaWxkKHBMZWFkZXJOb2RlKTsKLSAgaWYgKHBUcmFpbGVyTm9kZSAmJiBwRm9ybU5vZGUpCi0gICAgcEZvcm1Ob2RlLT5SZW1vdmVDaGlsZChwVHJhaWxlck5vZGUpOwotICBpZiAocFRyYWlsZXJJdGVtKQotICAgIFhGQV9SZWxlYXNlTGF5b3V0SXRlbShwVHJhaWxlckl0ZW0pOwotfQotCi1YRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkRvTGF5b3V0Rmxvd2VkQ29udGFpbmVyKAotICAgIGJvb2wgYlVzZUJyZWFrQ29udHJvbCwKLSAgICBYRkFfQVRUUklCVVRFRU5VTSBlRmxvd1N0cmF0ZWd5LAotICAgIEZYX0ZMT0FUIGZIZWlnaHRMaW1pdCwKLSAgICBGWF9GTE9BVCBmUmVhbEhlaWdodCwKLSAgICBDWEZBX0xheW91dENvbnRleHQqIHBDb250ZXh0LAotICAgIGJvb2wgYlJvb3RGb3JjZVRiKSB7Ci0gIG1fYkhhc0F2YWlsSGVpZ2h0ID0gdHJ1ZTsKLSAgYm9vbCBiQnJlYWtEb25lID0gZmFsc2U7Ci0gIGJvb2wgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUgPSB0cnVlOwotICBib29sIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSA9IHRydWU7Ci0gIGJvb2wgYkZvcmNlRW5kUGFnZSA9IGZhbHNlOwotICBib29sIGJJc01hbnVhbEJyZWFrID0gZmFsc2U7Ci0gIGlmIChtX3BDdXJDaGlsZFByZXByb2Nlc3NvcikgewotICAgIG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yLT5tX2VQcmVQcm9jZXNzUnMgPQotICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6RG9uZTsKLSAgfQotCi0gIENGWF9TaXplRiBjb250YWluZXJTaXplID0gQ2FsY3VsYXRlQ29udGFpbmVyU3BlY2lmaWVkU2l6ZSgKLSAgICAgIG1fcEZvcm1Ob2RlLCAmYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsICZiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpOwotICBpZiAocENvbnRleHQgJiYgcENvbnRleHQtPm1fYkN1ckNvbHVtbldpZHRoQXZhaWFibGUpIHsKLSAgICBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSA9IGZhbHNlOwotICAgIGNvbnRhaW5lclNpemUud2lkdGggPSBwQ29udGV4dC0+bV9mQ3VyQ29sdW1uV2lkdGg7Ci0gIH0KLSAgaWYgKCFiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpCi0gICAgY29udGFpbmVyU2l6ZS5oZWlnaHQgLT0gbV9mVXNlZFNpemU7Ci0KLSAgaWYgKCFiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpIHsKLSAgICBDWEZBX05vZGUqIHBQYXJlbnROb2RlID0gbV9wRm9ybU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOwotICAgIGJvb2wgYkZvY3JUYiA9IGZhbHNlOwotICAgIGlmIChwUGFyZW50Tm9kZSAmJgotICAgICAgICBHZXRMYXlvdXQocFBhcmVudE5vZGUsICZiRm9jclRiKSA9PSBYRkFfQVRUUklCVVRFRU5VTV9Sb3cpIHsKLSAgICAgIENYRkFfTm9kZSogcENoaWxkQ29udGFpbmVyID0gbV9wRm9ybU5vZGUtPkdldE5vZGVJdGVtKAotICAgICAgICAgIFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkLCBYRkFfT2JqZWN0VHlwZTo6Q29udGFpbmVyTm9kZSk7Ci0gICAgICBpZiAocENoaWxkQ29udGFpbmVyICYmCi0gICAgICAgICAgcENoaWxkQ29udGFpbmVyLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGFpbmVyTm9kZSkpIHsKLSAgICAgICAgY29udGFpbmVyU2l6ZS5oZWlnaHQgPSAwOwotICAgICAgICBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUgPSB0cnVlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIENYRkFfTm9kZSogcE1hcmdpbk5vZGUgPQotICAgICAgbV9wRm9ybU5vZGUtPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpNYXJnaW4pOwotICBGWF9GTE9BVCBmTGVmdEluc2V0ID0gMDsKLSAgRlhfRkxPQVQgZlRvcEluc2V0ID0gMDsKLSAgRlhfRkxPQVQgZlJpZ2h0SW5zZXQgPSAwOwotICBGWF9GTE9BVCBmQm90dG9tSW5zZXQgPSAwOwotICBpZiAocE1hcmdpbk5vZGUpIHsKLSAgICBmTGVmdEluc2V0ID0KLSAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9MZWZ0SW5zZXQpLlRvVW5pdChYRkFfVU5JVF9QdCk7Ci0gICAgZlRvcEluc2V0ID0KLSAgICAgICAgcE1hcmdpbk5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Ub3BJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsKLSAgICBmUmlnaHRJbnNldCA9Ci0gICAgICAgIHBNYXJnaW5Ob2RlLT5HZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEVfUmlnaHRJbnNldCkuVG9Vbml0KFhGQV9VTklUX1B0KTsKLSAgICBmQm90dG9tSW5zZXQgPQotICAgICAgICBwTWFyZ2luTm9kZS0+R2V0TWVhc3VyZShYRkFfQVRUUklCVVRFX0JvdHRvbUluc2V0KS5Ub1VuaXQoWEZBX1VOSVRfUHQpOwotICB9Ci0gIEZYX0ZMT0FUIGZDb250ZW50V2lkdGhMaW1pdCA9Ci0gICAgICBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSA/IEZMVF9NQVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29udGFpbmVyU2l6ZS53aWR0aCAtIGZMZWZ0SW5zZXQgLSBmUmlnaHRJbnNldDsKLSAgRlhfRkxPQVQgZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPSAwOwotICBGWF9GTE9BVCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSAwOwotICBGWF9GTE9BVCBmQXZhaWxIZWlnaHQgPSBmSGVpZ2h0TGltaXQgLSBmVG9wSW5zZXQgLSBmQm90dG9tSW5zZXQ7Ci0gIGlmIChmQXZhaWxIZWlnaHQgPCAwKQotICAgIG1fYkhhc0F2YWlsSGVpZ2h0ID0gZmFsc2U7Ci0KLSAgZlJlYWxIZWlnaHQgPSBmUmVhbEhlaWdodCAtIGZUb3BJbnNldCAtIGZCb3R0b21JbnNldDsKLSAgRlhfRkxPQVQgZkNvbnRlbnRDdXJSb3dZID0gMDsKLSAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcExheW91dENoaWxkID0gbnVsbHB0cjsKLSAgaWYgKG1fcExheW91dEl0ZW0pIHsKLSAgICBpZiAobV9uQ3VyQ2hpbGROb2RlU3RhZ2UgIT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkRvbmUgJiYKLSAgICAgICAgZUZsb3dTdHJhdGVneSAhPSBYRkFfQVRUUklCVVRFRU5VTV9UYikgewotICAgICAgcExheW91dENoaWxkID0gKENYRkFfQ29udGVudExheW91dEl0ZW0qKW1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQ7Ci0gICAgICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXROZXh0ID0gcExheW91dENoaWxkOyBwTGF5b3V0TmV4dDsKLSAgICAgICAgICAgcExheW91dE5leHQgPSAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcExheW91dE5leHQtPm1fcE5leHRTaWJsaW5nKSB7Ci0gICAgICAgIGlmIChwTGF5b3V0TmV4dC0+bV9zUG9zLnkgIT0gcExheW91dENoaWxkLT5tX3NQb3MueSkKLSAgICAgICAgICBwTGF5b3V0Q2hpbGQgPSBwTGF5b3V0TmV4dDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXRUZW1wQ2hpbGQgPQotICAgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiltX3BMYXlvdXRJdGVtLT5tX3BGaXJzdENoaWxkOwotICAgICAgICAgcExheW91dFRlbXBDaGlsZCAhPSBwTGF5b3V0Q2hpbGQ7Ci0gICAgICAgICBwTGF5b3V0VGVtcENoaWxkID0KLSAgICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcExheW91dFRlbXBDaGlsZC0+bV9wTmV4dFNpYmxpbmcpIHsKLSAgICAgIGlmICghWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShwTGF5b3V0VGVtcENoaWxkLT5tX3BGb3JtTm9kZSkpCi0gICAgICAgIGNvbnRpbnVlOwotCi0gICAgICBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCA9IHN0ZDo6bWF4KAotICAgICAgICAgIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoLAotICAgICAgICAgIHBMYXlvdXRUZW1wQ2hpbGQtPm1fc1Bvcy54ICsgcExheW91dFRlbXBDaGlsZC0+bV9zU2l6ZS53aWR0aCk7Ci0gICAgICBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgPSBzdGQ6Om1heCgKLSAgICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsCi0gICAgICAgICAgcExheW91dFRlbXBDaGlsZC0+bV9zUG9zLnkgKyBwTGF5b3V0VGVtcENoaWxkLT5tX3NTaXplLmhlaWdodCk7Ci0gICAgfQotCi0gICAgaWYgKHBMYXlvdXRDaGlsZCkKLSAgICAgIGZDb250ZW50Q3VyUm93WSA9IHBMYXlvdXRDaGlsZC0+bV9zUG9zLnk7Ci0gICAgZWxzZQotICAgICAgZkNvbnRlbnRDdXJSb3dZID0gZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0OwotICB9Ci0KLSAgZkNvbnRlbnRDdXJSb3dZICs9IEluc2VydEtlZXBMYXlvdXRJdGVtcygpOwotICBpZiAobV9uQ3VyQ2hpbGROb2RlU3RhZ2UgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6Ok5vbmUpIHsKLSAgICBHb3RvTmV4dENvbnRhaW5lck5vZGUobV9wQ3VyQ2hpbGROb2RlLCBtX25DdXJDaGlsZE5vZGVTdGFnZSwgbV9wRm9ybU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICB9Ci0KLSAgZkNvbnRlbnRDdXJSb3dZICs9IEluc2VydFBlbmRpbmdJdGVtcyh0aGlzLCBtX3BGb3JtTm9kZSk7Ci0gIGlmIChtX3BDdXJDaGlsZFByZXByb2Nlc3NvciAmJgotICAgICAgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkNvbnRhaW5lcikgewotICAgIGlmIChFeGlzdENvbnRhaW5lcktlZXAobV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3ItPkdldEZvcm1Ob2RlKCksIGZhbHNlKSkgewotICAgICAgbV9wS2VlcEhlYWROb2RlID0gbV9wQ3VyQ2hpbGROb2RlOwotICAgICAgbV9iSXNQcm9jZXNzS2VlcCA9IHRydWU7Ci0gICAgICBtX25DdXJDaGlsZE5vZGVTdGFnZSA9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzOjpLZWVwOwotICAgIH0KLSAgfQotCi0gIHdoaWxlIChtX25DdXJDaGlsZE5vZGVTdGFnZSAhPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6RG9uZSkgewotICAgIEZYX0ZMT0FUIGZDb250ZW50Q3VyUm93SGVpZ2h0ID0gMDsKLSAgICBGWF9GTE9BVCBmQ29udGVudEN1clJvd0F2YWlsV2lkdGggPSBmQ29udGVudFdpZHRoTGltaXQ7Ci0gICAgbV9mV2lkdGhMaW1pdGUgPSBmQ29udGVudEN1clJvd0F2YWlsV2lkdGg7Ci0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+IHJnQ3VyTGluZUxheW91dEl0ZW1zWzNdOwotICAgIHVpbnQ4X3QgdUN1ckhBbGlnblN0YXRlID0KLSAgICAgICAgKGVGbG93U3RyYXRlZ3kgIT0gWEZBX0FUVFJJQlVURUVOVU1fUmxfdGIgPyAwIDogMik7Ci0gICAgaWYgKHBMYXlvdXRDaGlsZCkgewotICAgICAgZm9yIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0TmV4dCA9IHBMYXlvdXRDaGlsZDsgcExheW91dE5leHQ7Ci0gICAgICAgICAgIHBMYXlvdXROZXh0ID0gKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXROZXh0LT5tX3BOZXh0U2libGluZykgewotICAgICAgICBpZiAoIXBMYXlvdXROZXh0LT5tX3BOZXh0U2libGluZyAmJiBtX3BDdXJDaGlsZFByZXByb2Nlc3NvciAmJgotICAgICAgICAgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3ItPm1fcEZvcm1Ob2RlID09IHBMYXlvdXROZXh0LT5tX3BGb3JtTm9kZSkgewotICAgICAgICAgIHBMYXlvdXROZXh0LT5tX3BOZXh0ID0gbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3ItPm1fcExheW91dEl0ZW07Ci0gICAgICAgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3ItPm1fcExheW91dEl0ZW0gPSBwTGF5b3V0TmV4dDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90IHVIQWxpZ24gPSBIQWxpZ25FbnVtVG9JbnQoCi0gICAgICAgICAgICBwTGF5b3V0TmV4dC0+bV9wRm9ybU5vZGUtPkdldEVudW0oWEZBX0FUVFJJQlVURV9IQWxpZ24pKTsKLSAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbdUhBbGlnbl0uQWRkKHBMYXlvdXROZXh0KTsKLSAgICAgICAgaWYgKGVGbG93U3RyYXRlZ3kgPT0gWEZBX0FUVFJJQlVURUVOVU1fTHJfdGIpIHsKLSAgICAgICAgICBpZiAodUhBbGlnbiA+IHVDdXJIQWxpZ25TdGF0ZSkKLSAgICAgICAgICAgIHVDdXJIQWxpZ25TdGF0ZSA9IHVIQWxpZ247Ci0gICAgICAgIH0gZWxzZSBpZiAodUhBbGlnbiA8IHVDdXJIQWxpZ25TdGF0ZSkgewotICAgICAgICAgIHVDdXJIQWxpZ25TdGF0ZSA9IHVIQWxpZ247Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UocExheW91dE5leHQtPm1fcEZvcm1Ob2RlKSkgewotICAgICAgICAgIGlmIChwTGF5b3V0TmV4dC0+bV9zU2l6ZS5oZWlnaHQgPiBmQ29udGVudEN1clJvd0hlaWdodCkKLSAgICAgICAgICAgIGZDb250ZW50Q3VyUm93SGVpZ2h0ID0gcExheW91dE5leHQtPm1fc1NpemUuaGVpZ2h0OwotICAgICAgICAgIGZDb250ZW50Q3VyUm93QXZhaWxXaWR0aCAtPSBwTGF5b3V0TmV4dC0+bV9zU2l6ZS53aWR0aDsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoKENYRkFfQ29udGVudExheW91dEl0ZW0qKW1fcExheW91dEl0ZW0tPm1fcEZpcnN0Q2hpbGQgPT0KLSAgICAgICAgICBwTGF5b3V0Q2hpbGQpIHsKLSAgICAgICAgbV9wTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZCA9IG51bGxwdHI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0TmV4dCA9Ci0gICAgICAgICAgICAoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopbV9wTGF5b3V0SXRlbS0+bV9wRmlyc3RDaGlsZDsKLSAgICAgICAgZm9yICg7IHBMYXlvdXROZXh0OwotICAgICAgICAgICAgIHBMYXlvdXROZXh0ID0KLSAgICAgICAgICAgICAgICAgKENYRkFfQ29udGVudExheW91dEl0ZW0qKXBMYXlvdXROZXh0LT5tX3BOZXh0U2libGluZykgewotICAgICAgICAgIGlmICgoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSopcExheW91dE5leHQtPm1fcE5leHRTaWJsaW5nID09Ci0gICAgICAgICAgICAgIHBMYXlvdXRDaGlsZCkgewotICAgICAgICAgICAgcExheW91dE5leHQtPm1fcE5leHRTaWJsaW5nID0gbnVsbHB0cjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwTGF5b3V0TmV4dFRlbXAgPQotICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwTGF5b3V0Q2hpbGQ7Ci0gICAgICB3aGlsZSAocExheW91dE5leHRUZW1wKSB7Ci0gICAgICAgIHBMYXlvdXROZXh0VGVtcC0+bV9wUGFyZW50ID0gbnVsbHB0cjsKLSAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFNhdmVMYXlvdXROZXh0ID0KLSAgICAgICAgICAgIChDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKilwTGF5b3V0TmV4dFRlbXAtPm1fcE5leHRTaWJsaW5nOwotICAgICAgICBwTGF5b3V0TmV4dFRlbXAtPm1fcE5leHRTaWJsaW5nID0gbnVsbHB0cjsKLSAgICAgICAgcExheW91dE5leHRUZW1wID0gcFNhdmVMYXlvdXROZXh0OwotICAgICAgfQotICAgICAgcExheW91dENoaWxkID0gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICB3aGlsZSAobV9wQ3VyQ2hpbGROb2RlKSB7Ci0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yPiBwUHJvY2Vzc29yOwotICAgICAgYm9vbCBiQWRkZWRJdGVtSW5Sb3cgPSBmYWxzZTsKLSAgICAgIGZDb250ZW50Q3VyUm93WSArPSBJbnNlcnRQZW5kaW5nSXRlbXModGhpcywgbV9wRm9ybU5vZGUpOwotICAgICAgc3dpdGNoIChtX25DdXJDaGlsZE5vZGVTdGFnZSkgewotICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzOjpLZWVwOgotICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzOjpOb25lOgotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzOjpCcmVha0JlZm9yZTogewotICAgICAgICAgIGZvciAoYXV0byBpdGVtIDogbV9hcnJheUtlZXBJdGVtcykgewotICAgICAgICAgICAgbV9wTGF5b3V0SXRlbS0+UmVtb3ZlQ2hpbGQoaXRlbSk7Ci0gICAgICAgICAgICBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQgLT0gaXRlbS0+bV9zU2l6ZS5oZWlnaHQ7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgQ1hGQV9Ob2RlKiBwTGVhZGVyTm9kZSA9IG51bGxwdHI7Ci0gICAgICAgICAgQ1hGQV9Ob2RlKiBwVHJhaWxlck5vZGUgPSBudWxscHRyOwotICAgICAgICAgIGJvb2wgYkNyZWF0ZVBhZ2UgPSBmYWxzZTsKLSAgICAgICAgICBpZiAoIWJVc2VCcmVha0NvbnRyb2wgfHwgIW1fcFBhZ2VNZ3IgfHwKLSAgICAgICAgICAgICAgIW1fcFBhZ2VNZ3ItPlByb2Nlc3NCcmVha0JlZm9yZU9yQWZ0ZXIobV9wQ3VyQ2hpbGROb2RlLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVhZGVyTm9kZSwgcFRyYWlsZXJOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ3JlYXRlUGFnZSkgfHwKLSAgICAgICAgICAgICAgbV9wRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkZvcm0gfHwKLSAgICAgICAgICAgICAgIWJDcmVhdGVQYWdlKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoSnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwTGVhZGVyTm9kZSkpCi0gICAgICAgICAgICBBZGRQZW5kaW5nTm9kZSh0aGlzLCBwTGVhZGVyTm9kZSwgdHJ1ZSk7Ci0KLSAgICAgICAgICBpZiAoSnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwVHJhaWxlck5vZGUpKSB7Ci0gICAgICAgICAgICBpZiAobV9wRm9ybU5vZGUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkZvcm0gJiYKLSAgICAgICAgICAgICAgICAhbV9wTGF5b3V0SXRlbSkgewotICAgICAgICAgICAgICBBZGRQZW5kaW5nTm9kZSh0aGlzLCBwVHJhaWxlck5vZGUsIHRydWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgYXV0byBwVGVtcFByb2Nlc3NvciA9Ci0gICAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yPihwVHJhaWxlck5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKLSAgICAgICAgICAgICAgSW5zZXJ0Rmxvd2VkSXRlbSgKLSAgICAgICAgICAgICAgICAgIHRoaXMsIHBUZW1wUHJvY2Vzc29yLmdldCgpLCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwKLSAgICAgICAgICAgICAgICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgY29udGFpbmVyU2l6ZS5oZWlnaHQsIGVGbG93U3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAmdUN1ckhBbGlnblN0YXRlLCByZ0N1ckxpbmVMYXlvdXRJdGVtcywgZmFsc2UsIEZMVF9NQVgsCi0gICAgICAgICAgICAgICAgICBGTFRfTUFYLCBmQ29udGVudFdpZHRoTGltaXQsICZmQ29udGVudEN1clJvd1ksCi0gICAgICAgICAgICAgICAgICAmZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLCAmZkNvbnRlbnRDdXJSb3dIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAmYkFkZGVkSXRlbUluUm93LCAmYkZvcmNlRW5kUGFnZSwgcENvbnRleHQsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgR290b05leHRDb250YWluZXJOb2RlKG1fcEN1ckNoaWxkTm9kZSwgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEZvcm1Ob2RlLCB0cnVlKTsKLSAgICAgICAgICBiRm9yY2VFbmRQYWdlID0gdHJ1ZTsKLSAgICAgICAgICBiSXNNYW51YWxCcmVhayA9IHRydWU7Ci0gICAgICAgICAgZ290byBTdXNwZW5kQW5kQ3JlYXRlTmV3Um93OwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkJyZWFrQWZ0ZXI6IHsKLSAgICAgICAgICBDWEZBX05vZGUqIHBMZWFkZXJOb2RlID0gbnVsbHB0cjsKLSAgICAgICAgICBDWEZBX05vZGUqIHBUcmFpbGVyTm9kZSA9IG51bGxwdHI7Ci0gICAgICAgICAgYm9vbCBiQ3JlYXRlUGFnZSA9IGZhbHNlOwotICAgICAgICAgIGlmICghYlVzZUJyZWFrQ29udHJvbCB8fCAhbV9wUGFnZU1nciB8fAotICAgICAgICAgICAgICAhbV9wUGFnZU1nci0+UHJvY2Vzc0JyZWFrQmVmb3JlT3JBZnRlcihtX3BDdXJDaGlsZE5vZGUsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTGVhZGVyTm9kZSwgcFRyYWlsZXJOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ3JlYXRlUGFnZSkgfHwKLSAgICAgICAgICAgICAgbV9wRm9ybU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OkZvcm0pIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlmIChKdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKHBUcmFpbGVyTm9kZSkpIHsKLSAgICAgICAgICAgIGF1dG8gcFRlbXBQcm9jZXNzb3IgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yPigKLSAgICAgICAgICAgICAgICBwVHJhaWxlck5vZGUsIG51bGxwdHIpOwotICAgICAgICAgICAgSW5zZXJ0Rmxvd2VkSXRlbSgKLSAgICAgICAgICAgICAgICB0aGlzLCBwVGVtcFByb2Nlc3Nvci5nZXQoKSwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsCi0gICAgICAgICAgICAgICAgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBjb250YWluZXJTaXplLmhlaWdodCwgZUZsb3dTdHJhdGVneSwKLSAgICAgICAgICAgICAgICAmdUN1ckhBbGlnblN0YXRlLCByZ0N1ckxpbmVMYXlvdXRJdGVtcywgZmFsc2UsIEZMVF9NQVgsIEZMVF9NQVgsCi0gICAgICAgICAgICAgICAgZkNvbnRlbnRXaWR0aExpbWl0LCAmZkNvbnRlbnRDdXJSb3dZLCAmZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLAotICAgICAgICAgICAgICAgICZmQ29udGVudEN1clJvd0hlaWdodCwgJmJBZGRlZEl0ZW1JblJvdywgJmJGb3JjZUVuZFBhZ2UsCi0gICAgICAgICAgICAgICAgcENvbnRleHQsIGZhbHNlKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCFiQ3JlYXRlUGFnZSkgewotICAgICAgICAgICAgaWYgKEp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIocExlYWRlck5vZGUpKSB7Ci0gICAgICAgICAgICAgIENhbGN1bGF0ZVJvd0NoaWxkUG9zaXRpb24oCi0gICAgICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtcywgZUZsb3dTdHJhdGVneSwgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLAotICAgICAgICAgICAgICAgICAgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsICZmQ29udGVudENhbGN1bGF0ZWRXaWR0aCwKLSAgICAgICAgICAgICAgICAgICZmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsICZmQ29udGVudEN1clJvd1ksCi0gICAgICAgICAgICAgICAgICBmQ29udGVudEN1clJvd0hlaWdodCwgZkNvbnRlbnRXaWR0aExpbWl0LCBmYWxzZSk7Ci0gICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zLT5SZW1vdmVBbGwoKTsKLSAgICAgICAgICAgICAgYXV0byBwVGVtcFByb2Nlc3NvciA9Ci0gICAgICAgICAgICAgICAgICBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yPihwTGVhZGVyTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOwotICAgICAgICAgICAgICBJbnNlcnRGbG93ZWRJdGVtKAotICAgICAgICAgICAgICAgICAgdGhpcywgcFRlbXBQcm9jZXNzb3IuZ2V0KCksIGJDb250YWluZXJXaWR0aEF1dG9TaXplLAotICAgICAgICAgICAgICAgICAgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBjb250YWluZXJTaXplLmhlaWdodCwgZUZsb3dTdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICZ1Q3VySEFsaWduU3RhdGUsIHJnQ3VyTGluZUxheW91dEl0ZW1zLCBmYWxzZSwgRkxUX01BWCwKLSAgICAgICAgICAgICAgICAgIEZMVF9NQVgsIGZDb250ZW50V2lkdGhMaW1pdCwgJmZDb250ZW50Q3VyUm93WSwKLSAgICAgICAgICAgICAgICAgICZmQ29udGVudEN1clJvd0F2YWlsV2lkdGgsICZmQ29udGVudEN1clJvd0hlaWdodCwKLSAgICAgICAgICAgICAgICAgICZiQWRkZWRJdGVtSW5Sb3csICZiRm9yY2VFbmRQYWdlLCBwQ29udGV4dCwgZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoSnVkZ2VMZWFkZXJPclRyYWlsZXJGb3JPY2N1cihwTGVhZGVyTm9kZSkpCi0gICAgICAgICAgICAgIEFkZFBlbmRpbmdOb2RlKHRoaXMsIHBMZWFkZXJOb2RlLCB0cnVlKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBHb3RvTmV4dENvbnRhaW5lck5vZGUobV9wQ3VyQ2hpbGROb2RlLCBtX25DdXJDaGlsZE5vZGVTdGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wRm9ybU5vZGUsIHRydWUpOwotICAgICAgICAgIGlmIChiQ3JlYXRlUGFnZSkgewotICAgICAgICAgICAgYkZvcmNlRW5kUGFnZSA9IHRydWU7Ci0gICAgICAgICAgICBiSXNNYW51YWxCcmVhayA9IHRydWU7Ci0gICAgICAgICAgICBpZiAobV9uQ3VyQ2hpbGROb2RlU3RhZ2UgPT0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkRvbmUpCi0gICAgICAgICAgICAgIGJCcmVha0RvbmUgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBnb3RvIFN1c3BlbmRBbmRDcmVhdGVOZXdSb3c7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6Qm9va2VuZExlYWRlcjogewotICAgICAgICAgIENYRkFfTm9kZSogcExlYWRlck5vZGUgPSBudWxscHRyOwotICAgICAgICAgIGlmIChtX3BDdXJDaGlsZFByZXByb2Nlc3NvcikgewotICAgICAgICAgICAgcFByb2Nlc3Nvci5yZXNldChtX3BDdXJDaGlsZFByZXByb2Nlc3Nvcik7Ci0gICAgICAgICAgICBtX3BDdXJDaGlsZFByZXByb2Nlc3NvciA9IG51bGxwdHI7Ci0gICAgICAgICAgfSBlbHNlIGlmIChtX3BQYWdlTWdyICYmCi0gICAgICAgICAgICAgICAgICAgICBtX3BQYWdlTWdyLT5Qcm9jZXNzQm9va2VuZExlYWRlck9yVHJhaWxlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICBtX3BDdXJDaGlsZE5vZGUsIHRydWUsIHBMZWFkZXJOb2RlKSkgewotICAgICAgICAgICAgcFByb2Nlc3NvciA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I+KAotICAgICAgICAgICAgICAgIHBMZWFkZXJOb2RlLCBtX3BQYWdlTWdyKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAocFByb2Nlc3NvcikgewotICAgICAgICAgICAgaWYgKEluc2VydEZsb3dlZEl0ZW0oCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsIHBQcm9jZXNzb3IuZ2V0KCksIGJDb250YWluZXJXaWR0aEF1dG9TaXplLAotICAgICAgICAgICAgICAgICAgICBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGNvbnRhaW5lclNpemUuaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBlRmxvd1N0cmF0ZWd5LCAmdUN1ckhBbGlnblN0YXRlLCByZ0N1ckxpbmVMYXlvdXRJdGVtcywKLSAgICAgICAgICAgICAgICAgICAgYlVzZUJyZWFrQ29udHJvbCwgZkF2YWlsSGVpZ2h0LCBmUmVhbEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRXaWR0aExpbWl0LCAmZkNvbnRlbnRDdXJSb3dZLAotICAgICAgICAgICAgICAgICAgICAmZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLCAmZkNvbnRlbnRDdXJSb3dIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICZiQWRkZWRJdGVtSW5Sb3csICZiRm9yY2VFbmRQYWdlLCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UpICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpEb25lKSB7Ci0gICAgICAgICAgICAgIGdvdG8gU3VzcGVuZEFuZENyZWF0ZU5ld1JvdzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHBQcm9jZXNzb3IucmVzZXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6Qm9va2VuZFRyYWlsZXI6IHsKLSAgICAgICAgICBDWEZBX05vZGUqIHBUcmFpbGVyTm9kZSA9IG51bGxwdHI7Ci0gICAgICAgICAgaWYgKG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yKSB7Ci0gICAgICAgICAgICBwUHJvY2Vzc29yLnJlc2V0KG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yKTsKLSAgICAgICAgICAgIG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yID0gbnVsbHB0cjsKLSAgICAgICAgICB9IGVsc2UgaWYgKG1fcFBhZ2VNZ3IgJiYKLSAgICAgICAgICAgICAgICAgICAgIG1fcFBhZ2VNZ3ItPlByb2Nlc3NCb29rZW5kTGVhZGVyT3JUcmFpbGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgIG1fcEN1ckNoaWxkTm9kZSwgZmFsc2UsIHBUcmFpbGVyTm9kZSkpIHsKLSAgICAgICAgICAgIHBQcm9jZXNzb3IgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yPigKLSAgICAgICAgICAgICAgICBwVHJhaWxlck5vZGUsIG1fcFBhZ2VNZ3IpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAocFByb2Nlc3NvcikgewotICAgICAgICAgICAgaWYgKEluc2VydEZsb3dlZEl0ZW0oCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsIHBQcm9jZXNzb3IuZ2V0KCksIGJDb250YWluZXJXaWR0aEF1dG9TaXplLAotICAgICAgICAgICAgICAgICAgICBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsIGNvbnRhaW5lclNpemUuaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICBlRmxvd1N0cmF0ZWd5LCAmdUN1ckhBbGlnblN0YXRlLCByZ0N1ckxpbmVMYXlvdXRJdGVtcywKLSAgICAgICAgICAgICAgICAgICAgYlVzZUJyZWFrQ29udHJvbCwgZkF2YWlsSGVpZ2h0LCBmUmVhbEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgZkNvbnRlbnRXaWR0aExpbWl0LCAmZkNvbnRlbnRDdXJSb3dZLAotICAgICAgICAgICAgICAgICAgICAmZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoLCAmZkNvbnRlbnRDdXJSb3dIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICZiQWRkZWRJdGVtSW5Sb3csICZiRm9yY2VFbmRQYWdlLCBwQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgZmFsc2UpICE9IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpEb25lKSB7Ci0gICAgICAgICAgICAgIGdvdG8gU3VzcGVuZEFuZENyZWF0ZU5ld1JvdzsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHBQcm9jZXNzb3IucmVzZXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6Q29udGFpbmVyOiB7Ci0gICAgICAgICAgQVNTRVJUKG1fcEN1ckNoaWxkTm9kZS0+SXNDb250YWluZXJOb2RlKCkpOwotICAgICAgICAgIGlmIChtX3BDdXJDaGlsZE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6OlZhcmlhYmxlcykKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGlmIChmQ29udGVudEN1clJvd1kgPj0gZkhlaWdodExpbWl0ICsgWEZBX0xBWU9VVF9GTE9BVF9QRVJDSVNJT04gJiYKLSAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZShtX3BDdXJDaGlsZE5vZGUpKSB7Ci0gICAgICAgICAgICBiRm9yY2VFbmRQYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgIGdvdG8gU3VzcGVuZEFuZENyZWF0ZU5ld1JvdzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKCFtX3BDdXJDaGlsZE5vZGUtPklzQ29udGFpbmVyTm9kZSgpKQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBib29sIGJOZXdSb3cgPSBmYWxzZTsKLSAgICAgICAgICBpZiAobV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IpIHsKLSAgICAgICAgICAgIHBQcm9jZXNzb3IucmVzZXQobV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IpOwotICAgICAgICAgICAgbV9wQ3VyQ2hpbGRQcmVwcm9jZXNzb3IgPSBudWxscHRyOwotICAgICAgICAgICAgYk5ld1JvdyA9IHRydWU7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHBQcm9jZXNzb3IgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yPigKLSAgICAgICAgICAgICAgICBtX3BDdXJDaGlsZE5vZGUsIG1fcFBhZ2VNZ3IpOwotICAgICAgICAgIH0KLQotICAgICAgICAgIEluc2VydFBlbmRpbmdJdGVtcyhwUHJvY2Vzc29yLmdldCgpLCBtX3BDdXJDaGlsZE5vZGUpOwotICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IHJzID0gSW5zZXJ0Rmxvd2VkSXRlbSgKLSAgICAgICAgICAgICAgdGhpcywgcFByb2Nlc3Nvci5nZXQoKSwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsCi0gICAgICAgICAgICAgIGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSwgY29udGFpbmVyU2l6ZS5oZWlnaHQsIGVGbG93U3RyYXRlZ3ksCi0gICAgICAgICAgICAgICZ1Q3VySEFsaWduU3RhdGUsIHJnQ3VyTGluZUxheW91dEl0ZW1zLCBiVXNlQnJlYWtDb250cm9sLAotICAgICAgICAgICAgICBmQXZhaWxIZWlnaHQsIGZSZWFsSGVpZ2h0LCBmQ29udGVudFdpZHRoTGltaXQsICZmQ29udGVudEN1clJvd1ksCi0gICAgICAgICAgICAgICZmQ29udGVudEN1clJvd0F2YWlsV2lkdGgsICZmQ29udGVudEN1clJvd0hlaWdodCwKLSAgICAgICAgICAgICAgJmJBZGRlZEl0ZW1JblJvdywgJmJGb3JjZUVuZFBhZ2UsIHBDb250ZXh0LCBiTmV3Um93KTsKLSAgICAgICAgICBzd2l0Y2ggKHJzKSB7Ci0gICAgICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpNYW51YWxCcmVhazoKLSAgICAgICAgICAgICAgYklzTWFudWFsQnJlYWsgPSB0cnVlOwotICAgICAgICAgICAgY2FzZSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6UGFnZUZ1bGxCcmVhazoKLSAgICAgICAgICAgICAgYkZvcmNlRW5kUGFnZSA9IHRydWU7Ci0gICAgICAgICAgICBjYXNlIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpSb3dGdWxsQnJlYWs6Ci0gICAgICAgICAgICAgIGdvdG8gU3VzcGVuZEFuZENyZWF0ZU5ld1JvdzsKLSAgICAgICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JSZXN1bHQ6OkRvbmU6Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBmQ29udGVudEN1clJvd1kgKz0KLSAgICAgICAgICAgICAgICAgIEluc2VydFBlbmRpbmdJdGVtcyhwUHJvY2Vzc29yLmdldCgpLCBtX3BDdXJDaGlsZE5vZGUpOwotICAgICAgICAgICAgICBwUHJvY2Vzc29yLnJlc2V0KCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkRvbmU6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBHb3RvTmV4dENvbnRhaW5lck5vZGUobV9wQ3VyQ2hpbGROb2RlLCBtX25DdXJDaGlsZE5vZGVTdGFnZSwgbV9wRm9ybU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7Ci0gICAgICBpZiAoYkFkZGVkSXRlbUluUm93ICYmIGVGbG93U3RyYXRlZ3kgPT0gWEZBX0FUVFJJQlVURUVOVU1fVGIpCi0gICAgICAgIGJyZWFrOwotICAgICAgZWxzZQotICAgICAgICBjb250aW51ZTsKLSAgICBTdXNwZW5kQW5kQ3JlYXRlTmV3Um93OgotICAgICAgaWYgKHBQcm9jZXNzb3IpCi0gICAgICAgIG1fcEN1ckNoaWxkUHJlcHJvY2Vzc29yID0gcFByb2Nlc3Nvci5yZWxlYXNlKCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBDYWxjdWxhdGVSb3dDaGlsZFBvc2l0aW9uKAotICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtcywgZUZsb3dTdHJhdGVneSwgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLAotICAgICAgICBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwgJmZDb250ZW50Q2FsY3VsYXRlZFdpZHRoLAotICAgICAgICAmZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0LCAmZkNvbnRlbnRDdXJSb3dZLCBmQ29udGVudEN1clJvd0hlaWdodCwKLSAgICAgICAgZkNvbnRlbnRXaWR0aExpbWl0LCBiUm9vdEZvcmNlVGIpOwotICAgIG1fZldpZHRoTGltaXRlID0gZkNvbnRlbnRDdXJSb3dBdmFpbFdpZHRoOwotICAgIGlmIChiRm9yY2VFbmRQYWdlKQotICAgICAgYnJlYWs7Ci0gIH0KLQotICBib29sIGJSZXRWYWx1ZSA9Ci0gICAgICBtX25DdXJDaGlsZE5vZGVTdGFnZSA9PSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6RG9uZSAmJgotICAgICAgbV9QZW5kaW5nTm9kZXMuZW1wdHkoKTsKLSAgaWYgKGJCcmVha0RvbmUpCi0gICAgYlJldFZhbHVlID0gZmFsc2U7Ci0KLSAgY29udGFpbmVyU2l6ZSA9IENhbGN1bGF0ZUNvbnRhaW5lckNvbXBvbmVudFNpemVGcm9tQ29udGVudFNpemUoCi0gICAgICBtX3BGb3JtTm9kZSwgYkNvbnRhaW5lcldpZHRoQXV0b1NpemUsIGZDb250ZW50Q2FsY3VsYXRlZFdpZHRoLAotICAgICAgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLCBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsIGNvbnRhaW5lclNpemUpOwotCi0gIGlmIChjb250YWluZXJTaXplLmhlaWdodCA+PSBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTiB8fCBtX3BMYXlvdXRJdGVtIHx8Ci0gICAgICBiUmV0VmFsdWUpIHsKLSAgICBpZiAoIW1fcExheW91dEl0ZW0pCi0gICAgICBtX3BMYXlvdXRJdGVtID0gQ3JlYXRlQ29udGVudExheW91dEl0ZW0obV9wRm9ybU5vZGUpOwotICAgIGNvbnRhaW5lclNpemUuaGVpZ2h0ID0gc3RkOjptYXgoY29udGFpbmVyU2l6ZS5oZWlnaHQsIDAuZik7Ci0KLSAgICBTZXRDdXJyZW50Q29tcG9uZW50U2l6ZShjb250YWluZXJTaXplKTsKLSAgICBpZiAoYkZvcmNlRW5kUGFnZSkKLSAgICAgIG1fZlVzZWRTaXplID0gMDsKLSAgICBlbHNlCi0gICAgICBtX2ZVc2VkU2l6ZSArPSBtX3BMYXlvdXRJdGVtLT5tX3NTaXplLmhlaWdodDsKLSAgfQotCi0gIHJldHVybiBiUmV0VmFsdWUKLSAgICAgICAgICAgICA/IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpEb25lCi0gICAgICAgICAgICAgOiAoYklzTWFudWFsQnJlYWsgPyBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6TWFudWFsQnJlYWsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpQYWdlRnVsbEJyZWFrKTsKLX0KLQotYm9vbCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkNhbGN1bGF0ZVJvd0NoaWxkUG9zaXRpb24oCi0gICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+ICgmcmdDdXJMaW5lTGF5b3V0SXRlbXMpWzNdLAotICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVGbG93U3RyYXRlZ3ksCi0gICAgYm9vbCBiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUsCi0gICAgYm9vbCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwKLSAgICBGWF9GTE9BVCogZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsCi0gICAgRlhfRkxPQVQqIGZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwKLSAgICBGWF9GTE9BVCogZkNvbnRlbnRDdXJSb3dZLAotICAgIEZYX0ZMT0FUIGZDb250ZW50Q3VyUm93SGVpZ2h0LAotICAgIEZYX0ZMT0FUIGZDb250ZW50V2lkdGhMaW1pdCwKLSAgICBib29sIGJSb290Rm9yY2VUYikgewotICBpbnQzMl90IG5Hcm91cExlbmd0aHNbM10gPSB7MCwgMCwgMH07Ci0gIEZYX0ZMT0FUIGZHcm91cFdpZHRoc1szXSA9IHswLCAwLCAwfTsKLSAgaW50MzJfdCBuVG90YWxMZW5ndGggPSAwOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICBuR3JvdXBMZW5ndGhzW2ldID0gcmdDdXJMaW5lTGF5b3V0SXRlbXNbaV0uR2V0U2l6ZSgpOwotICAgIGZvciAoaW50MzJfdCBjID0gbkdyb3VwTGVuZ3Roc1tpXSwgaiA9IDA7IGogPCBjOyBqKyspIHsKLSAgICAgIG5Ub3RhbExlbmd0aCsrOwotICAgICAgaWYgKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UoCi0gICAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zW2ldW2pdLT5tX3BGb3JtTm9kZSkpIHsKLSAgICAgICAgZkdyb3VwV2lkdGhzW2ldICs9IHJnQ3VyTGluZUxheW91dEl0ZW1zW2ldW2pdLT5tX3NTaXplLndpZHRoOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmICghblRvdGFsTGVuZ3RoKSB7Ci0gICAgaWYgKGJDb250YWluZXJIZWlnaHRBdXRvU2l6ZSkgewotICAgICAgKmZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCA9Ci0gICAgICAgICAgc3RkOjptaW4oKmZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwgKmZDb250ZW50Q3VyUm93WSk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghbV9wTGF5b3V0SXRlbSkKLSAgICBtX3BMYXlvdXRJdGVtID0gQ3JlYXRlQ29udGVudExheW91dEl0ZW0obV9wRm9ybU5vZGUpOwotCi0gIGlmIChlRmxvd1N0cmF0ZWd5ICE9IFhGQV9BVFRSSUJVVEVFTlVNX1JsX3RiKSB7Ci0gICAgRlhfRkxPQVQgZkN1clBvczsKLSAgICBmQ3VyUG9zID0gMDsKLSAgICBmb3IgKGludDMyX3QgYyA9IG5Hcm91cExlbmd0aHNbMF0sIGogPSAwOyBqIDwgYzsgaisrKSB7Ci0gICAgICBpZiAoYlJvb3RGb3JjZVRiKSB7Ci0gICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdLT5tX3NQb3MgPSBDYWxjdWxhdGVQb3NpdGlvbmVkQ29udGFpbmVyUG9zKAotICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0tPm1fcEZvcm1Ob2RlLAotICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0tPm1fc1NpemUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0tPm1fc1BvcyA9Ci0gICAgICAgICAgICBDRlhfUG9pbnRGKGZDdXJQb3MsICpmQ29udGVudEN1clJvd1kpOwotICAgICAgICBpZiAoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZSgKLSAgICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1swXVtqXS0+bV9wRm9ybU5vZGUpKSB7Ci0gICAgICAgICAgZkN1clBvcyArPSByZ0N1ckxpbmVMYXlvdXRJdGVtc1swXVtqXS0+bV9zU2l6ZS53aWR0aDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgbV9wTGF5b3V0SXRlbS0+QWRkQ2hpbGQocmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0pOwotICAgICAgbV9mTGFzdFJvd1dpZHRoID0gZkN1clBvczsKLSAgICB9Ci0gICAgZkN1clBvcyA9IChmQ29udGVudFdpZHRoTGltaXQgKyBmR3JvdXBXaWR0aHNbMF0gLSBmR3JvdXBXaWR0aHNbMV0gLQotICAgICAgICAgICAgICAgZkdyb3VwV2lkdGhzWzJdKSAvCi0gICAgICAgICAgICAgIDI7Ci0gICAgZm9yIChpbnQzMl90IGMgPSBuR3JvdXBMZW5ndGhzWzFdLCBqID0gMDsgaiA8IGM7IGorKykgewotICAgICAgaWYgKGJSb290Rm9yY2VUYikgewotICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXS0+bV9zUG9zID0gQ2FsY3VsYXRlUG9zaXRpb25lZENvbnRhaW5lclBvcygKLSAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzFdW2pdLT5tX3BGb3JtTm9kZSwKLSAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzFdW2pdLT5tX3NTaXplKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzFdW2pdLT5tX3NQb3MgPQotICAgICAgICAgICAgQ0ZYX1BvaW50RihmQ3VyUG9zLCAqZkNvbnRlbnRDdXJSb3dZKTsKLSAgICAgICAgaWYgKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UoCi0gICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fcEZvcm1Ob2RlKSkgewotICAgICAgICAgIGZDdXJQb3MgKz0gcmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fc1NpemUud2lkdGg7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG1fcExheW91dEl0ZW0tPkFkZENoaWxkKHJnQ3VyTGluZUxheW91dEl0ZW1zWzFdW2pdKTsKLSAgICAgIG1fZkxhc3RSb3dXaWR0aCA9IGZDdXJQb3M7Ci0gICAgfQotICAgIGZDdXJQb3MgPSBmQ29udGVudFdpZHRoTGltaXQgLSBmR3JvdXBXaWR0aHNbMl07Ci0gICAgZm9yIChpbnQzMl90IGMgPSBuR3JvdXBMZW5ndGhzWzJdLCBqID0gMDsgaiA8IGM7IGorKykgewotICAgICAgaWYgKGJSb290Rm9yY2VUYikgewotICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1syXVtqXS0+bV9zUG9zID0gQ2FsY3VsYXRlUG9zaXRpb25lZENvbnRhaW5lclBvcygKLSAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3BGb3JtTm9kZSwKLSAgICAgICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3NTaXplKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3NQb3MgPQotICAgICAgICAgICAgQ0ZYX1BvaW50RihmQ3VyUG9zLCAqZkNvbnRlbnRDdXJSb3dZKTsKLSAgICAgICAgaWYgKFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yX0lzVGFraW5nU3BhY2UoCi0gICAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMl1bal0tPm1fcEZvcm1Ob2RlKSkgewotICAgICAgICAgIGZDdXJQb3MgKz0gcmdDdXJMaW5lTGF5b3V0SXRlbXNbMl1bal0tPm1fc1NpemUud2lkdGg7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG1fcExheW91dEl0ZW0tPkFkZENoaWxkKHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdKTsKLSAgICAgIG1fZkxhc3RSb3dXaWR0aCA9IGZDdXJQb3M7Ci0gICAgfQotICB9IGVsc2UgewotICAgIEZYX0ZMT0FUIGZDdXJQb3M7Ci0gICAgZkN1clBvcyA9IGZHcm91cFdpZHRoc1swXTsKLSAgICBmb3IgKGludDMyX3QgYyA9IG5Hcm91cExlbmd0aHNbMF0sIGogPSAwOyBqIDwgYzsgaisrKSB7Ci0gICAgICBpZiAoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZSgKLSAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0tPm1fcEZvcm1Ob2RlKSkgewotICAgICAgICBmQ3VyUG9zIC09IHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdLT5tX3NTaXplLndpZHRoOwotICAgICAgfQotICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMF1bal0tPm1fc1BvcyA9Ci0gICAgICAgICAgQ0ZYX1BvaW50RihmQ3VyUG9zLCAqZkNvbnRlbnRDdXJSb3dZKTsKLSAgICAgIG1fcExheW91dEl0ZW0tPkFkZENoaWxkKHJnQ3VyTGluZUxheW91dEl0ZW1zWzBdW2pdKTsKLSAgICAgIG1fZkxhc3RSb3dXaWR0aCA9IGZDdXJQb3M7Ci0gICAgfQotICAgIGZDdXJQb3MgPSAoZkNvbnRlbnRXaWR0aExpbWl0ICsgZkdyb3VwV2lkdGhzWzBdICsgZkdyb3VwV2lkdGhzWzFdIC0KLSAgICAgICAgICAgICAgIGZHcm91cFdpZHRoc1syXSkgLwotICAgICAgICAgICAgICAyOwotICAgIGZvciAoaW50MzJfdCBjID0gbkdyb3VwTGVuZ3Roc1sxXSwgaiA9IDA7IGogPCBjOyBqKyspIHsKLSAgICAgIGlmIChYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKAotICAgICAgICAgICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXS0+bV9wRm9ybU5vZGUpKSB7Ci0gICAgICAgIGZDdXJQb3MgLT0gcmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0tPm1fc1NpemUud2lkdGg7Ci0gICAgICB9Ci0gICAgICByZ0N1ckxpbmVMYXlvdXRJdGVtc1sxXVtqXS0+bV9zUG9zID0KLSAgICAgICAgICBDRlhfUG9pbnRGKGZDdXJQb3MsICpmQ29udGVudEN1clJvd1kpOwotICAgICAgbV9wTGF5b3V0SXRlbS0+QWRkQ2hpbGQocmdDdXJMaW5lTGF5b3V0SXRlbXNbMV1bal0pOwotICAgICAgbV9mTGFzdFJvd1dpZHRoID0gZkN1clBvczsKLSAgICB9Ci0gICAgZkN1clBvcyA9IGZDb250ZW50V2lkdGhMaW1pdDsKLSAgICBmb3IgKGludDMyX3QgYyA9IG5Hcm91cExlbmd0aHNbMl0sIGogPSAwOyBqIDwgYzsgaisrKSB7Ci0gICAgICBpZiAoWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JfSXNUYWtpbmdTcGFjZSgKLSAgICAgICAgICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMl1bal0tPm1fcEZvcm1Ob2RlKSkgewotICAgICAgICBmQ3VyUG9zIC09IHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdLT5tX3NTaXplLndpZHRoOwotICAgICAgfQotICAgICAgcmdDdXJMaW5lTGF5b3V0SXRlbXNbMl1bal0tPm1fc1BvcyA9Ci0gICAgICAgICAgQ0ZYX1BvaW50RihmQ3VyUG9zLCAqZkNvbnRlbnRDdXJSb3dZKTsKLSAgICAgIG1fcExheW91dEl0ZW0tPkFkZENoaWxkKHJnQ3VyTGluZUxheW91dEl0ZW1zWzJdW2pdKTsKLSAgICAgIG1fZkxhc3RSb3dXaWR0aCA9IGZDdXJQb3M7Ci0gICAgfQotICB9Ci0gIG1fZkxhc3RSb3dZID0gKmZDb250ZW50Q3VyUm93WTsKLSAgKmZDb250ZW50Q3VyUm93WSArPSBmQ29udGVudEN1clJvd0hlaWdodDsKLSAgaWYgKGJDb250YWluZXJXaWR0aEF1dG9TaXplKSB7Ci0gICAgRlhfRkxPQVQgZkNoaWxkU3VwcGxpZWRXaWR0aCA9IGZHcm91cFdpZHRoc1swXTsKLSAgICBpZiAoZkNvbnRlbnRXaWR0aExpbWl0IDwgRkxUX01BWCAmJgotICAgICAgICBmQ29udGVudFdpZHRoTGltaXQgPiBmQ2hpbGRTdXBwbGllZFdpZHRoKSB7Ci0gICAgICBmQ2hpbGRTdXBwbGllZFdpZHRoID0gZkNvbnRlbnRXaWR0aExpbWl0OwotICAgIH0KLSAgICAqZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGggPQotICAgICAgICBzdGQ6Om1heCgqZkNvbnRlbnRDYWxjdWxhdGVkV2lkdGgsIGZDaGlsZFN1cHBsaWVkV2lkdGgpOwotICB9Ci0gIGlmIChiQ29udGFpbmVySGVpZ2h0QXV0b1NpemUpIHsKLSAgICAqZkNvbnRlbnRDYWxjdWxhdGVkSGVpZ2h0ID0KLSAgICAgICAgc3RkOjptYXgoKmZDb250ZW50Q2FsY3VsYXRlZEhlaWdodCwgKmZDb250ZW50Q3VyUm93WSk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUNYRkFfTm9kZSogQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yOjpHZXRTdWJmb3JtU2V0UGFyZW50KAotICAgIENYRkFfTm9kZSogcFN1YmZvcm1TZXQpIHsKLSAgaWYgKHBTdWJmb3JtU2V0ICYmIHBTdWJmb3JtU2V0LT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpTdWJmb3JtU2V0KSB7Ci0gICAgQ1hGQV9Ob2RlKiBwUGFyZW50ID0gcFN1YmZvcm1TZXQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9QYXJlbnQpOwotICAgIHdoaWxlIChwUGFyZW50KSB7Ci0gICAgICBpZiAocFBhcmVudC0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6U3ViZm9ybVNldCkKLSAgICAgICAgcmV0dXJuIHBQYXJlbnQ7Ci0gICAgICBwUGFyZW50ID0gcFBhcmVudC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX1BhcmVudCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBwU3ViZm9ybVNldDsKLX0KLQotdm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkRvTGF5b3V0RmllbGQoKSB7Ci0gIGlmIChtX3BMYXlvdXRJdGVtKQotICAgIHJldHVybjsKLQotICBBU1NFUlQobV9wQ3VyQ2hpbGROb2RlID09IFhGQV9MQVlPVVRfSU5WQUxJRE5PREUpOwotICBtX3BMYXlvdXRJdGVtID0gQ3JlYXRlQ29udGVudExheW91dEl0ZW0obV9wRm9ybU5vZGUpOwotICBpZiAoIW1fcExheW91dEl0ZW0pCi0gICAgcmV0dXJuOwotCi0gIENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCA9IG1fcEZvcm1Ob2RlLT5HZXREb2N1bWVudCgpOwotICBDWEZBX0ZGTm90aWZ5KiBwTm90aWZ5ID0gcERvY3VtZW50LT5HZXROb3RpZnkoKTsKLSAgQ0ZYX1NpemVGIHNpemUoLTEsIC0xKTsKLSAgcE5vdGlmeS0+U3RhcnRGaWVsZERyYXdMYXlvdXQobV9wRm9ybU5vZGUsIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0KTsKLQotICBpbnQzMl90IG5Sb3RhdGUgPQotICAgICAgRlhTWVNfcm91bmQobV9wRm9ybU5vZGUtPkdldE1lYXN1cmUoWEZBX0FUVFJJQlVURV9Sb3RhdGUpLkdldFZhbHVlKCkpOwotICBuUm90YXRlID0gWEZBX01hcFJvdGF0aW9uKG5Sb3RhdGUpOwotICBpZiAoblJvdGF0ZSA9PSA5MCB8fCBuUm90YXRlID09IDI3MCkKLSAgICBzdGQ6OnN3YXAoc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpOwotCi0gIFNldEN1cnJlbnRDb21wb25lbnRTaXplKHNpemUpOwotfQotCi1YRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkRvTGF5b3V0KAotICAgIGJvb2wgYlVzZUJyZWFrQ29udHJvbCwKLSAgICBGWF9GTE9BVCBmSGVpZ2h0TGltaXQsCi0gICAgRlhfRkxPQVQgZlJlYWxIZWlnaHQsCi0gICAgQ1hGQV9MYXlvdXRDb250ZXh0KiBwQ29udGV4dCkgewotICBzd2l0Y2ggKG1fcEZvcm1Ob2RlLT5HZXRFbGVtZW50VHlwZSgpKSB7Ci0gICAgY2FzZSBYRkFfRWxlbWVudDo6U3ViZm9ybToKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpBcmVhOgotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkV4Y2xHcm91cDoKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpTdWJmb3JtU2V0OiB7Ci0gICAgICBib29sIGJSb290Rm9yY2VUYiA9IGZhbHNlOwotICAgICAgQ1hGQV9Ob2RlKiBwTGF5b3V0Tm9kZSA9IEdldFN1YmZvcm1TZXRQYXJlbnQobV9wRm9ybU5vZGUpOwotICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUxheW91dFN0cmF0ZWd5ID0gR2V0TGF5b3V0KHBMYXlvdXROb2RlLCAmYlJvb3RGb3JjZVRiKTsKLSAgICAgIHN3aXRjaCAoZUxheW91dFN0cmF0ZWd5KSB7Ci0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fVGI6Ci0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fTHJfdGI6Ci0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUmxfdGI6Ci0gICAgICAgICAgcmV0dXJuIERvTGF5b3V0Rmxvd2VkQ29udGFpbmVyKGJVc2VCcmVha0NvbnRyb2wsIGVMYXlvdXRTdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkhlaWdodExpbWl0LCBmUmVhbEhlaWdodCwgcENvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJSb290Rm9yY2VUYik7Ci0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUG9zaXRpb246Ci0gICAgICAgIGNhc2UgWEZBX0FUVFJJQlVURUVOVU1fUm93OgotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1JsX3JvdzoKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBEb0xheW91dFBvc2l0aW9uZWRDb250YWluZXIocENvbnRleHQpOwotICAgICAgICAgIG1fbkN1ckNoaWxkTm9kZVN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkRvbmU7Ci0gICAgICAgICAgcmV0dXJuIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpEb25lOwotICAgICAgICBjYXNlIFhGQV9BVFRSSUJVVEVFTlVNX1RhYmxlOgotICAgICAgICAgIERvTGF5b3V0VGFibGVDb250YWluZXIocExheW91dE5vZGUpOwotICAgICAgICAgIG1fbkN1ckNoaWxkTm9kZVN0YWdlID0gWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXM6OkRvbmU7Ci0gICAgICAgICAgcmV0dXJuIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpEb25lOwotICAgICAgfQotICAgIH0KLSAgICBjYXNlIFhGQV9FbGVtZW50OjpEcmF3OgotICAgIGNhc2UgWEZBX0VsZW1lbnQ6OkZpZWxkOgotICAgICAgRG9MYXlvdXRGaWVsZCgpOwotICAgICAgbV9uQ3VyQ2hpbGROb2RlU3RhZ2UgPSBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlczo6RG9uZTsKLSAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6RG9uZTsKLSAgICBjYXNlIFhGQV9FbGVtZW50OjpDb250ZW50QXJlYToKLSAgICAgIHJldHVybiBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdDo6RG9uZTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0OjpEb25lOwotICB9Ci19Ci0KLUNGWF9TaXplRiBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OkdldEN1cnJlbnRDb21wb25lbnRTaXplKCkgewotICByZXR1cm4gQ0ZYX1NpemVGKG1fcExheW91dEl0ZW0tPm1fc1NpemUud2lkdGgsIG1fcExheW91dEl0ZW0tPm1fc1NpemUuaGVpZ2h0KTsKLX0KLQotdm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OlNldEN1cnJlbnRDb21wb25lbnRQb3MoY29uc3QgQ0ZYX1BvaW50RiYgcG9zKSB7Ci0gIG1fcExheW91dEl0ZW0tPm1fc1BvcyA9IHBvczsKLX0KLQotdm9pZCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6OlNldEN1cnJlbnRDb21wb25lbnRTaXplKGNvbnN0IENGWF9TaXplRiYgc2l6ZSkgewotICBtX3BMYXlvdXRJdGVtLT5tX3NTaXplID0gc2l6ZTsKLX0KLQotYm9vbCBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3I6Okp1ZGdlTGVhZGVyT3JUcmFpbGVyRm9yT2NjdXIoCi0gICAgQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpIHsKLSAgaWYgKCFwRm9ybU5vZGUpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIENYRkFfTm9kZSogcFRlbXBsYXRlID0gcEZvcm1Ob2RlLT5HZXRUZW1wbGF0ZU5vZGUoKTsKLSAgaWYgKCFwVGVtcGxhdGUpCi0gICAgcFRlbXBsYXRlID0gcEZvcm1Ob2RlOwotCi0gIENYRkFfT2NjdXIgTm9kZU9jY3VyKHBUZW1wbGF0ZS0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoWEZBX0VsZW1lbnQ6Ok9jY3VyKSk7Ci0gIGludDMyX3QgaU1heCA9IE5vZGVPY2N1ci5HZXRNYXgoKTsKLSAgaWYgKGlNYXggPCAwKQotICAgIHJldHVybiB0cnVlOwotCi0gIGludDMyX3QgaUNvdW50ID0gbV9QZW5kaW5nTm9kZXNDb3VudFtwVGVtcGxhdGVdOwotICBpZiAoaUNvdW50ID49IGlNYXgpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIG1fUGVuZGluZ05vZGVzQ291bnRbcFRlbXBsYXRlXSA9IGlDb3VudCArIDE7Ci0gIHJldHVybiB0cnVlOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL3hmYV9sYXlvdXRfaXRlbWxheW91dC5oIGIveGZhL2Z4ZmEvcGFyc2VyL3hmYV9sYXlvdXRfaXRlbWxheW91dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDExYmYwLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL3BhcnNlci94ZmFfbGF5b3V0X2l0ZW1sYXlvdXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX1hGQV9MQVlPVVRfSVRFTUxBWU9VVF9IXwotI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfWEZBX0xBWU9VVF9JVEVNTEFZT1VUX0hfCi0KLSNpbmNsdWRlIDxmbG9hdC5oPgotCi0jaW5jbHVkZSA8bGlzdD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8dHVwbGU+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9iYXNpYy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9meGZhX2Jhc2ljLmgiCi0KLSNkZWZpbmUgWEZBX0xBWU9VVF9JTlZBTElETk9ERSAoKENYRkFfTm9kZSopKGludHB0cl90KS0xKQotI2RlZmluZSBYRkFfTEFZT1VUX0ZMT0FUX1BFUkNJU0lPTiAoMC4wMDA1ZikKLQotY2xhc3MgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtOwotY2xhc3MgQ1hGQV9Db250ZW50TGF5b3V0SXRlbTsKLWNsYXNzIENYRkFfSXRlbUxheW91dFByb2Nlc3NvcjsKLWNsYXNzIENYRkFfTGF5b3V0UGFnZU1ncjsKLWNsYXNzIENYRkFfTGF5b3V0UHJvY2Vzc29yOwotY2xhc3MgQ1hGQV9Ob2RlOwotCi1lbnVtIGNsYXNzIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IHsKLSAgRG9uZSwKLSAgUGFnZUZ1bGxCcmVhaywKLSAgUm93RnVsbEJyZWFrLAotICBNYW51YWxCcmVhaywKLX07Ci0KLWVudW0gY2xhc3MgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXMgewotICBOb25lLAotICBCb29rZW5kTGVhZGVyLAotICBCcmVha0JlZm9yZSwKLSAgS2VlcCwKLSAgQ29udGFpbmVyLAotICBCcmVha0FmdGVyLAotICBCb29rZW5kVHJhaWxlciwKLSAgRG9uZSwKLX07Ci0KLWNsYXNzIENYRkFfTGF5b3V0Q29udGV4dCB7Ci0gcHVibGljOgotICBDWEZBX0xheW91dENvbnRleHQoKQotICAgICAgOiBtX3ByZ1NwZWNpZmllZENvbHVtbldpZHRocyhudWxscHRyKSwKLSAgICAgICAgbV9mQ3VyQ29sdW1uV2lkdGgoMCksCi0gICAgICAgIG1fYkN1ckNvbHVtbldpZHRoQXZhaWFibGUoZmFsc2UpLAotICAgICAgICBtX3BPdmVyZmxvd1Byb2Nlc3NvcihudWxscHRyKSwKLSAgICAgICAgbV9wT3ZlcmZsb3dOb2RlKG51bGxwdHIpIHt9Ci0gIH5DWEZBX0xheW91dENvbnRleHQoKSB7fQotCi0gIENGWF9BcnJheVRlbXBsYXRlPEZYX0ZMT0FUPiogbV9wcmdTcGVjaWZpZWRDb2x1bW5XaWR0aHM7Ci0gIEZYX0ZMT0FUIG1fZkN1ckNvbHVtbldpZHRoOwotICBib29sIG1fYkN1ckNvbHVtbldpZHRoQXZhaWFibGU7Ci0gIENYRkFfSXRlbUxheW91dFByb2Nlc3NvciogbV9wT3ZlcmZsb3dQcm9jZXNzb3I7Ci0gIENYRkFfTm9kZSogbV9wT3ZlcmZsb3dOb2RlOwotfTsKLQotYm9vbCBYRkFfSXRlbUxheW91dFByb2Nlc3Nvcl9Jc1Rha2luZ1NwYWNlKENYRkFfTm9kZSogcE5vZGUpOwotCi1jbGFzcyBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IgewotIHB1YmxpYzoKLSAgc3RhdGljIGJvb2wgSW5jcmVtZW50UmVsYXlvdXROb2RlKENYRkFfTGF5b3V0UHJvY2Vzc29yKiBwTGF5b3V0UHJvY2Vzc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudE5vZGUpOwotCi0gIENYRkFfSXRlbUxheW91dFByb2Nlc3NvcihDWEZBX05vZGUqIHBOb2RlLCBDWEZBX0xheW91dFBhZ2VNZ3IqIHBQYWdlTWdyKTsKLSAgfkNYRkFfSXRlbUxheW91dFByb2Nlc3NvcigpOwotCi0gIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IERvTGF5b3V0KGJvb2wgYlVzZUJyZWFrQ29udHJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgZkhlaWdodExpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmUmVhbEhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9MYXlvdXRDb250ZXh0KiBwQ29udGV4dCk7Ci0gIHZvaWQgRG9MYXlvdXRQYWdlQXJlYShDWEZBX0NvbnRhaW5lckxheW91dEl0ZW0qIHBQYWdlQXJlYUxheW91dEl0ZW0pOwotCi0gIENGWF9TaXplRiBHZXRDdXJyZW50Q29tcG9uZW50U2l6ZSgpOwotICBDWEZBX05vZGUqIEdldEZvcm1Ob2RlKCkgeyByZXR1cm4gbV9wRm9ybU5vZGU7IH0KLSAgYm9vbCBIYXNMYXlvdXRJdGVtKCkgY29uc3QgeyByZXR1cm4gISFtX3BMYXlvdXRJdGVtOyB9Ci0gIENYRkFfQ29udGVudExheW91dEl0ZW0qIEV4dHJhY3RMYXlvdXRJdGVtKCk7Ci0gIHZvaWQgU3BsaXRMYXlvdXRJdGVtKEZYX0ZMT0FUIGZTcGxpdFBvcyk7Ci0KLSAgRlhfRkxPQVQgRmluZFNwbGl0UG9zKEZYX0ZMT0FUIGZQcm9wb3NlZFNwbGl0UG9zKTsKLQotICBib29sIFByb2Nlc3NLZWVwRm9yU3BsaXQoCi0gICAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBQYXJlbnRQcm9jZXNzb3IsCi0gICAgICBDWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3IqIHBDaGlsZFByb2Nlc3NvciwKLSAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IGVSZXRWYWx1ZSwKLSAgICAgIENGWF9BcnJheVRlbXBsYXRlPENYRkFfQ29udGVudExheW91dEl0ZW0qPiogcmdDdXJMaW5lTGF5b3V0SXRlbSwKLSAgICAgIEZYX0ZMT0FUKiBmQ29udGVudEN1clJvd0F2YWlsV2lkdGgsCi0gICAgICBGWF9GTE9BVCogZkNvbnRlbnRDdXJSb3dIZWlnaHQsCi0gICAgICBGWF9GTE9BVCogZkNvbnRlbnRDdXJSb3dZLAotICAgICAgYm9vbCogYkFkZGVkSXRlbUluUm93LAotICAgICAgYm9vbCogYkZvcmNlRW5kUGFnZSwKLSAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0KiByZXN1bHQpOwotICB2b2lkIFByb2Nlc3NVblVzZU92ZXJGbG93KENYRkFfTm9kZSogcExlYWRlck5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwVHJhaWxlck5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFRyYWlsZXJJdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEZvcm1Ob2RlKTsKLSAgYm9vbCBJc0FkZE5ld1Jvd0ZvclRyYWlsZXIoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFRyYWlsZXJJdGVtKTsKLSAgYm9vbCBKdWRnZUxlYWRlck9yVHJhaWxlckZvck9jY3VyKENYRkFfTm9kZSogcEZvcm1Ob2RlKTsKLQotICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBDcmVhdGVDb250ZW50TGF5b3V0SXRlbShDWEZBX05vZGUqIHBGb3JtTm9kZSk7Ci0KLSAgQ1hGQV9Ob2RlKiBtX3BGb3JtTm9kZTsKLSAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogbV9wTGF5b3V0SXRlbTsKLSAgQ1hGQV9Ob2RlKiBtX3BDdXJDaGlsZE5vZGU7Ci0gIEZYX0ZMT0FUIG1fZlVzZWRTaXplOwotICBDWEZBX0xheW91dFBhZ2VNZ3IqIG1fcFBhZ2VNZ3I7Ci0gIHN0ZDo6bGlzdDxDWEZBX05vZGUqPiBtX1BlbmRpbmdOb2RlczsKLSAgYm9vbCBtX2JCcmVha1BlbmRpbmc7Ci0gIENGWF9BcnJheVRlbXBsYXRlPEZYX0ZMT0FUPiBtX3JnU3BlY2lmaWVkQ29sdW1uV2lkdGhzOwotICBzdGQ6OnZlY3RvcjxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4gbV9hcnJheUtlZXBJdGVtczsKLSAgRlhfRkxPQVQgbV9mTGFzdFJvd1dpZHRoOwotICBGWF9GTE9BVCBtX2ZMYXN0Um93WTsKLSAgYm9vbCBtX2JVc2VJbmhlcmlhdGVkOwotICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclJlc3VsdCBtX2VQcmVQcm9jZXNzUnM7Ci0KLSBwcml2YXRlOgotICB2b2lkIFNldEN1cnJlbnRDb21wb25lbnRQb3MoY29uc3QgQ0ZYX1BvaW50RiYgcG9zKTsKLSAgdm9pZCBTZXRDdXJyZW50Q29tcG9uZW50U2l6ZShjb25zdCBDRlhfU2l6ZUYmIHNpemUpOwotCi0gIHZvaWQgU3BsaXRMYXlvdXRJdGVtKENYRkFfQ29udGVudExheW91dEl0ZW0qIHBMYXlvdXRJdGVtLAotICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKiBwU2Vjb25kUGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmU3BsaXRQb3MpOwotICBGWF9GTE9BVCBJbnNlcnRLZWVwTGF5b3V0SXRlbXMoKTsKLSAgYm9vbCBDYWxjdWxhdGVSb3dDaGlsZFBvc2l0aW9uKAotICAgICAgQ0ZYX0FycmF5VGVtcGxhdGU8Q1hGQV9Db250ZW50TGF5b3V0SXRlbSo+ICgmcmdDdXJMaW5lTGF5b3V0SXRlbXMpWzNdLAotICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUZsb3dTdHJhdGVneSwKLSAgICAgIGJvb2wgYkNvbnRhaW5lckhlaWdodEF1dG9TaXplLAotICAgICAgYm9vbCBiQ29udGFpbmVyV2lkdGhBdXRvU2l6ZSwKLSAgICAgIEZYX0ZMT0FUKiBmQ29udGVudENhbGN1bGF0ZWRXaWR0aCwKLSAgICAgIEZYX0ZMT0FUKiBmQ29udGVudENhbGN1bGF0ZWRIZWlnaHQsCi0gICAgICBGWF9GTE9BVCogZkNvbnRlbnRDdXJSb3dZLAotICAgICAgRlhfRkxPQVQgZkNvbnRlbnRDdXJSb3dIZWlnaHQsCi0gICAgICBGWF9GTE9BVCBmQ29udGVudFdpZHRoTGltaXQsCi0gICAgICBib29sIGJSb290Rm9yY2VUYik7Ci0gIHZvaWQgUHJvY2Vzc1VuVXNlQmluZHMoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpOwotICBib29sIEp1ZGdlUHV0TmV4dFBhZ2UoQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogcFBhcmVudExheW91dEl0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmQ2hpbGRIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDWEZBX0NvbnRlbnRMYXlvdXRJdGVtKj4qIHBLZWVwSXRlbXMpOwotCi0gIHZvaWQgRG9MYXlvdXRQb3NpdGlvbmVkQ29udGFpbmVyKENYRkFfTGF5b3V0Q29udGV4dCogcENvbnRleHQpOwotICB2b2lkIERvTGF5b3V0VGFibGVDb250YWluZXIoQ1hGQV9Ob2RlKiBwTGF5b3V0Tm9kZSk7Ci0gIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yUmVzdWx0IERvTGF5b3V0Rmxvd2VkQ29udGFpbmVyKAotICAgICAgYm9vbCBiVXNlQnJlYWtDb250cm9sLAotICAgICAgWEZBX0FUVFJJQlVURUVOVU0gZUZsb3dTdHJhdGVneSwKLSAgICAgIEZYX0ZMT0FUIGZIZWlnaHRMaW1pdCwKLSAgICAgIEZYX0ZMT0FUIGZSZWFsSGVpZ2h0LAotICAgICAgQ1hGQV9MYXlvdXRDb250ZXh0KiBwQ29udGV4dCwKLSAgICAgIGJvb2wgYlJvb3RGb3JjZVRiKTsKLSAgdm9pZCBEb0xheW91dEZpZWxkKCk7Ci0KLSAgdm9pZCBHb3RvTmV4dENvbnRhaW5lck5vZGUoQ1hGQV9Ob2RlKiYgcEN1ckFjdGlvbk5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9JdGVtTGF5b3V0UHJvY2Vzc29yU3RhZ2VzJiBuQ3VyU3RhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudENvbnRhaW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiVXNlUGFnZUJyZWFrKTsKLQotICBib29sIFByb2Nlc3NLZWVwTm9kZXNGb3JDaGVja05leHQoQ1hGQV9Ob2RlKiYgcEN1ckFjdGlvbk5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfSXRlbUxheW91dFByb2Nlc3NvclN0YWdlcyYgbkN1clN0YWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiYgcE5leHRDb250YWluZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiTGFzdEtlZXBOb2RlKTsKLQotICBib29sIFByb2Nlc3NLZWVwTm9kZXNGb3JCcmVha0JlZm9yZShDWEZBX05vZGUqJiBwQ3VyQWN0aW9uTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXMmIG5DdXJTdGFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQ29udGFpbmVyTm9kZSk7Ci0KLSAgQ1hGQV9Ob2RlKiBHZXRTdWJmb3JtU2V0UGFyZW50KENYRkFfTm9kZSogcFN1YmZvcm1TZXQpOwotCi0gIGJvb2wgbV9iS2VlcEJyZWFrRmluaXNoOwotICBib29sIG1fYklzUHJvY2Vzc0tlZXA7Ci0gIENYRkFfTm9kZSogbV9wS2VlcEhlYWROb2RlOwotICBDWEZBX05vZGUqIG1fcEtlZXBUYWlsTm9kZTsKLSAgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSogbV9wT2xkTGF5b3V0SXRlbTsKLSAgQ1hGQV9JdGVtTGF5b3V0UHJvY2Vzc29yKiBtX3BDdXJDaGlsZFByZXByb2Nlc3NvcjsKLSAgWEZBX0l0ZW1MYXlvdXRQcm9jZXNzb3JTdGFnZXMgbV9uQ3VyQ2hpbGROb2RlU3RhZ2U7Ci0gIHN0ZDo6bWFwPENYRkFfTm9kZSosIGludDMyX3Q+IG1fUGVuZGluZ05vZGVzQ291bnQ7Ci0gIEZYX0ZMT0FUIG1fZldpZHRoTGltaXRlOwotICBib29sIG1fYkhhc0F2YWlsSGVpZ2h0OwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfWEZBX0xBWU9VVF9JVEVNTEFZT1VUX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIveGZhX2xvY2FsZS5jcHAgYi94ZmEvZnhmYS9wYXJzZXIveGZhX2xvY2FsZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MzVlYjIuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL3hmYV9sb2NhbGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzk0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxlLmgiCi0KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF94bWwuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9kb2N1bWVudC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxlbWdyLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX3V0aWxzLmgiCi0KLXN0YXRpYyBjb25zdCBGWF9XQ0hBUiBnX0ZYX1BlcmNlbnRbXSA9IEwieix6enosenp6LHp6eix6enosenp6JSI7Ci1zdGF0aWMgY29uc3QgRlhfV0NIQVIgZ19GWF9DdXJyZW5jeVtdID0gTCIkeix6enosenp6LHp6eix6enoseno5Ljk5IjsKLXN0YXRpYyBjb25zdCBGWF9XQ0hBUiBnX0ZYX0RlY2ltYWxbXSA9IEwieix6enosenp6LHp6eix6enoseno5Lnp6eiI7Ci1zdGF0aWMgY29uc3QgRlhfV0NIQVIgZ19GWF9JbnRlZ2VyW10gPSBMInosenp6LHp6eix6enosenp6LHp6eiI7Ci0KLUNYRkFfWE1MTG9jYWxlOjpDWEZBX1hNTExvY2FsZShzdGQ6OnVuaXF1ZV9wdHI8Q1hNTF9FbGVtZW50PiBwTG9jYWxlRGF0YSkKLSAgICA6IG1fcExvY2FsZURhdGEoc3RkOjptb3ZlKHBMb2NhbGVEYXRhKSkge30KLQotQ1hGQV9YTUxMb2NhbGU6On5DWEZBX1hNTExvY2FsZSgpIHt9Ci0KLUNGWF9XaWRlU3RyaW5nIENYRkFfWE1MTG9jYWxlOjpHZXROYW1lKCkgY29uc3QgewotICByZXR1cm4gbV9wTG9jYWxlRGF0YSA/IG1fcExvY2FsZURhdGEtPkdldEF0dHJWYWx1ZSgibmFtZSIpIDogQ0ZYX1dpZGVTdHJpbmcoKTsKLX0KLQotdm9pZCBDWEZBX1hNTExvY2FsZTo6R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MIGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtU3ltYm9sKSBjb25zdCB7Ci0gIENGWF9CeXRlU3RyaW5nIGJzU3ltYm9sczsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOwotICBzd2l0Y2ggKGVUeXBlKSB7Ci0gICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbDoKLSAgICAgIGJzU3ltYm9scyA9ICJudW1iZXJTeW1ib2xzIjsKLSAgICAgIHdzTmFtZSA9IEwiZGVjaW1hbCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9Hcm91cGluZzoKLSAgICAgIGJzU3ltYm9scyA9ICJudW1iZXJTeW1ib2xzIjsKLSAgICAgIHdzTmFtZSA9IEwiZ3JvdXBpbmciOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfUGVyY2VudDoKLSAgICAgIGJzU3ltYm9scyA9ICJudW1iZXJTeW1ib2xzIjsKLSAgICAgIHdzTmFtZSA9IEwicGVyY2VudCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51czoKLSAgICAgIGJzU3ltYm9scyA9ICJudW1iZXJTeW1ib2xzIjsKLSAgICAgIHdzTmFtZSA9IEwibWludXMiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfWmVybzoKLSAgICAgIGJzU3ltYm9scyA9ICJudW1iZXJTeW1ib2xzIjsKLSAgICAgIHdzTmFtZSA9IEwiemVybyI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9DdXJyZW5jeVN5bWJvbDoKLSAgICAgIGJzU3ltYm9scyA9ICJjdXJyZW5jeVN5bWJvbHMiOwotICAgICAgd3NOYW1lID0gTCJzeW1ib2wiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfQ3VycmVuY3lOYW1lOgotICAgICAgYnNTeW1ib2xzID0gImN1cnJlbmN5U3ltYm9scyI7Ci0gICAgICB3c05hbWUgPSBMImlzb25hbWUiOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybjsKLSAgfQotICBDWE1MX0VsZW1lbnQqIHBFbGVtZW50ID0gbV9wTG9jYWxlRGF0YS0+R2V0RWxlbWVudCgiIiwgYnNTeW1ib2xzLkFzU3RyaW5nQygpKTsKLSAgaWYgKCFwRWxlbWVudCkgewotICAgIHJldHVybjsKLSAgfQotICBHZXRQYXR0ZXJuKHBFbGVtZW50LAotICAgICAgICAgICAgIENGWF9CeXRlU3RyaW5nQyhic1N5bWJvbHMuY19zdHIoKSwgYnNTeW1ib2xzLkdldExlbmd0aCgpIC0gMSksCi0gICAgICAgICAgICAgd3NOYW1lLkFzU3RyaW5nQygpLCB3c051bVN5bWJvbCk7Ci19Ci0KLXZvaWQgQ1hGQV9YTUxMb2NhbGU6OkdldERhdGVUaW1lU3ltYm9scyhDRlhfV2lkZVN0cmluZyYgd3NEdFN5bWJvbCkgY29uc3QgewotICBpZiAoIW1fcExvY2FsZURhdGEpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ0ZYX0J5dGVTdHJpbmcgYnNTcGFjZTsKLSAgQ1hNTF9FbGVtZW50KiBwTnVtYmVyU3ltYm9scyA9Ci0gICAgICBtX3BMb2NhbGVEYXRhLT5HZXRFbGVtZW50KGJzU3BhY2UuQXNTdHJpbmdDKCksICJkYXRlVGltZVN5bWJvbHMiKTsKLSAgaWYgKCFwTnVtYmVyU3ltYm9scykgewotICAgIHJldHVybjsKLSAgfQotICB3c0R0U3ltYm9sID0gcE51bWJlclN5bWJvbHMtPkdldENvbnRlbnQoMCk7Ci19Ci0KLXZvaWQgQ1hGQV9YTUxMb2NhbGU6OkdldE1vbnRoTmFtZShpbnQzMl90IG5Nb250aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NNb250aE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWJicikgY29uc3QgewotICB3c01vbnRoTmFtZSA9IEdldENhbGVuZGFyU3ltYm9sKCJtb250aCIsIG5Nb250aCwgYkFiYnIpOwotfQotCi12b2lkIENYRkFfWE1MTG9jYWxlOjpHZXREYXlOYW1lKGludDMyX3QgbldlZWssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0RheU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFiYnIpIGNvbnN0IHsKLSAgd3NEYXlOYW1lID0gR2V0Q2FsZW5kYXJTeW1ib2woImRheSIsIG5XZWVrLCBiQWJicik7Ci19Ci0KLXZvaWQgQ1hGQV9YTUxMb2NhbGU6OkdldE1lcmlkaWVtTmFtZShDRlhfV2lkZVN0cmluZyYgd3NNZXJpZGllbU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQU0pIGNvbnN0IHsKLSAgd3NNZXJpZGllbU5hbWUgPSBHZXRDYWxlbmRhclN5bWJvbCgibWVyaWRpZW0iLCBiQU0gPyAwIDogMSwgZmFsc2UpOwotfQotCi12b2lkIENYRkFfWE1MTG9jYWxlOjpHZXRUaW1lWm9uZShGWF9USU1FWk9ORSogdHopIGNvbnN0IHsKLSAgQ1hGQV9UaW1lWm9uZVByb3ZpZGVyIHByb3ZpZGVyOwotICBwcm92aWRlci5HZXRUaW1lWm9uZSh0eik7Ci19Ci0KLXZvaWQgQ1hGQV9YTUxMb2NhbGU6OkdldEVyYU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzRXJhTmFtZSwgYm9vbCBiQUQpIGNvbnN0IHsKLSAgd3NFcmFOYW1lID0gR2V0Q2FsZW5kYXJTeW1ib2woImVyYSIsIGJBRCA/IDEgOiAwLCBmYWxzZSk7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENYRkFfWE1MTG9jYWxlOjpHZXRDYWxlbmRhclN5bWJvbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWJicikgY29uc3QgewotICBDRlhfQnl0ZVN0cmluZyBwc3RyU3ltYm9sTmFtZXMgPSBzeW1ib2wgKyAiTmFtZXMiOwotICBDRlhfV2lkZVN0cmluZyB3c1N5bWJvbE5hbWUgPSBMIiI7Ci0gIGlmIChtX3BMb2NhbGVEYXRhKSB7Ci0gICAgQ1hNTF9FbGVtZW50KiBwQ2hpbGQgPSBtX3BMb2NhbGVEYXRhLT5HZXRFbGVtZW50KCIiLCAiY2FsZW5kYXJTeW1ib2xzIik7Ci0gICAgaWYgKHBDaGlsZCkgewotICAgICAgQ1hNTF9FbGVtZW50KiBwU3ltYm9sTmFtZXMgPQotICAgICAgICAgIHBDaGlsZC0+R2V0RWxlbWVudCgiIiwgcHN0clN5bWJvbE5hbWVzLkFzU3RyaW5nQygpKTsKLSAgICAgIGlmIChwU3ltYm9sTmFtZXMpIHsKLSAgICAgICAgaWYgKCghIXBTeW1ib2xOYW1lcy0+R2V0QXR0ckludGVnZXIoImFiYnIiKSkgIT0gYkFiYnIpIHsKLSAgICAgICAgICBwU3ltYm9sTmFtZXMgPSBwQ2hpbGQtPkdldEVsZW1lbnQoIiIsIHBzdHJTeW1ib2xOYW1lcy5Bc1N0cmluZ0MoKSwgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBTeW1ib2xOYW1lcyAmJiAoISFwU3ltYm9sTmFtZXMtPkdldEF0dHJJbnRlZ2VyKCJhYmJyIikpID09IGJBYmJyKSB7Ci0gICAgICAgICAgQ1hNTF9FbGVtZW50KiBwU3ltYm9sTmFtZSA9Ci0gICAgICAgICAgICAgIHBTeW1ib2xOYW1lcy0+R2V0RWxlbWVudCgiIiwgc3ltYm9sLCBpbmRleCk7Ci0gICAgICAgICAgaWYgKHBTeW1ib2xOYW1lKSB7Ci0gICAgICAgICAgICB3c1N5bWJvbE5hbWUgPSBwU3ltYm9sTmFtZS0+R2V0Q29udGVudCgwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHdzU3ltYm9sTmFtZTsKLX0KLQotdm9pZCBDWEZBX1hNTExvY2FsZTo6R2V0RGF0ZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0IHsKLSAgQ1hNTF9FbGVtZW50KiBwRWxlbWVudCA9IG1fcExvY2FsZURhdGEtPkdldEVsZW1lbnQoIiIsICJkYXRlUGF0dGVybnMiKTsKLSAgaWYgKCFwRWxlbWVudCkgewotICAgIHJldHVybjsKLSAgfQotICBDRlhfV2lkZVN0cmluZyB3c05hbWU7Ci0gIHN3aXRjaCAoZVR5cGUpIHsKLSAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfU2hvcnQ6Ci0gICAgICB3c05hbWUgPSBMInNob3J0IjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0OgotICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW06Ci0gICAgICB3c05hbWUgPSBMIm1lZCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbDoKLSAgICAgIHdzTmFtZSA9IEwiZnVsbCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTG9uZzoKLSAgICAgIHdzTmFtZSA9IEwibG9uZyI7Ci0gICAgICBicmVhazsKLSAgfQotICBHZXRQYXR0ZXJuKHBFbGVtZW50LCAiZGF0ZVBhdHRlcm4iLCB3c05hbWUuQXNTdHJpbmdDKCksIHdzUGF0dGVybik7Ci19Ci0KLXZvaWQgQ1hGQV9YTUxMb2NhbGU6OkdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdCB7Ci0gIENYTUxfRWxlbWVudCogcEVsZW1lbnQgPSBtX3BMb2NhbGVEYXRhLT5HZXRFbGVtZW50KCIiLCAidGltZVBhdHRlcm5zIik7Ci0gIGlmICghcEVsZW1lbnQpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgQ0ZYX1dpZGVTdHJpbmcgd3NOYW1lOwotICBzd2l0Y2ggKGVUeXBlKSB7Ci0gICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0OgotICAgICAgd3NOYW1lID0gTCJzaG9ydCI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRGVmYXVsdDoKLSAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtOgotICAgICAgd3NOYW1lID0gTCJtZWQiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0Z1bGw6Ci0gICAgICB3c05hbWUgPSBMImZ1bGwiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0xvbmc6Ci0gICAgICB3c05hbWUgPSBMImxvbmciOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgR2V0UGF0dGVybihwRWxlbWVudCwgInRpbWVQYXR0ZXJuIiwgd3NOYW1lLkFzU3RyaW5nQygpLCB3c1BhdHRlcm4pOwotfQotCi12b2lkIENYRkFfWE1MTG9jYWxlOjpHZXROdW1QYXR0ZXJuKEZYX0xPQ0FMRU5VTVNVQkNBVEVHT1JZIGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdCB7Ci0gIENYTUxfRWxlbWVudCogcEVsZW1lbnQgPSBtX3BMb2NhbGVEYXRhLT5HZXRFbGVtZW50KCIiLCAibnVtYmVyUGF0dGVybnMiKTsKLSAgaWYgKCFwRWxlbWVudCkgewotICAgIHJldHVybjsKLSAgfQotICBzd2l0Y2ggKGVUeXBlKSB7Ci0gICAgY2FzZSBGWF9MT0NBTEVOVU1QQVRURVJOX1BlcmNlbnQ6Ci0gICAgICB3c1BhdHRlcm4gPSBnX0ZYX1BlcmNlbnQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYX0xPQ0FMRU5VTVBBVFRFUk5fQ3VycmVuY3k6Ci0gICAgICB3c1BhdHRlcm4gPSBnX0ZYX0N1cnJlbmN5OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWF9MT0NBTEVOVU1QQVRURVJOX0RlY2ltYWw6Ci0gICAgICB3c1BhdHRlcm4gPSBnX0ZYX0RlY2ltYWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYX0xPQ0FMRU5VTVBBVFRFUk5fSW50ZWdlcjoKLSAgICAgIHdzUGF0dGVybiA9IGdfRlhfSW50ZWdlcjsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgQ1hGQV9YTUxMb2NhbGU6OkdldFBhdHRlcm4oQ1hNTF9FbGVtZW50KiBwRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1RhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0IHsKLSAgaW50MzJfdCBpQ291bnQgPSBwRWxlbWVudC0+Q291bnRFbGVtZW50cygiIiwgYnNUYWcpOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQ7IGkrKykgewotICAgIENYTUxfRWxlbWVudCogcENoaWxkID0gcEVsZW1lbnQtPkdldEVsZW1lbnQoIiIsIGJzVGFnLCBpKTsKLSAgICBpZiAocENoaWxkLT5HZXRBdHRyVmFsdWUoIm5hbWUiKSA9PSB3c05hbWUpIHsKLSAgICAgIHdzUGF0dGVybiA9IHBDaGlsZC0+R2V0Q29udGVudCgwKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLX0KLQotQ1hGQV9Ob2RlTG9jYWxlOjpDWEZBX05vZGVMb2NhbGUoQ1hGQV9Ob2RlKiBwTG9jYWxlKSA6IG1fcExvY2FsZShwTG9jYWxlKSB7fQotCi1DWEZBX05vZGVMb2NhbGU6On5DWEZBX05vZGVMb2NhbGUoKSB7fQotCi1DRlhfV2lkZVN0cmluZyBDWEZBX05vZGVMb2NhbGU6OkdldE5hbWUoKSBjb25zdCB7Ci0gIHJldHVybiBDRlhfV2lkZVN0cmluZyhtX3BMb2NhbGUgPyBtX3BMb2NhbGUtPkdldENEYXRhKFhGQV9BVFRSSUJVVEVfTmFtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHIpOwotfQotCi12b2lkIENYRkFfTm9kZUxvY2FsZTo6R2V0TnVtYmVyaWNTeW1ib2woRlhfTE9DQUxFTlVNU1lNQk9MIGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c051bVN5bWJvbCkgY29uc3QgewotICBzd2l0Y2ggKGVUeXBlKSB7Ci0gICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbDoKLSAgICAgIHdzTnVtU3ltYm9sID0gR2V0U3ltYm9sKFhGQV9FbGVtZW50OjpOdW1iZXJTeW1ib2xzLCBMImRlY2ltYWwiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX0dyb3VwaW5nOgotICAgICAgd3NOdW1TeW1ib2wgPSBHZXRTeW1ib2woWEZBX0VsZW1lbnQ6Ok51bWJlclN5bWJvbHMsIEwiZ3JvdXBpbmciKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlhfTE9DQUxFTlVNU1lNQk9MX1BlcmNlbnQ6Ci0gICAgICB3c051bVN5bWJvbCA9IEdldFN5bWJvbChYRkFfRWxlbWVudDo6TnVtYmVyU3ltYm9scywgTCJwZXJjZW50Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9NaW51czoKLSAgICAgIHdzTnVtU3ltYm9sID0gR2V0U3ltYm9sKFhGQV9FbGVtZW50OjpOdW1iZXJTeW1ib2xzLCBMIm1pbnVzIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYX0xPQ0FMRU5VTVNZTUJPTF9aZXJvOgotICAgICAgd3NOdW1TeW1ib2wgPSBHZXRTeW1ib2woWEZBX0VsZW1lbnQ6Ok51bWJlclN5bWJvbHMsIEwiemVybyIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfQ3VycmVuY3lTeW1ib2w6Ci0gICAgICB3c051bVN5bWJvbCA9IEdldFN5bWJvbChYRkFfRWxlbWVudDo6Q3VycmVuY3lTeW1ib2xzLCBMInN5bWJvbCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWF9MT0NBTEVOVU1TWU1CT0xfQ3VycmVuY3lOYW1lOgotICAgICAgd3NOdW1TeW1ib2wgPSBHZXRTeW1ib2woWEZBX0VsZW1lbnQ6OkN1cnJlbmN5U3ltYm9scywgTCJpc29uYW1lIik7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIENYRkFfTm9kZUxvY2FsZTo6R2V0RGF0ZVRpbWVTeW1ib2xzKENGWF9XaWRlU3RyaW5nJiB3c0R0U3ltYm9sKSBjb25zdCB7Ci0gIENYRkFfTm9kZSogcFN5bWJvbHMgPQotICAgICAgbV9wTG9jYWxlID8gbV9wTG9jYWxlLT5HZXRDaGlsZCgwLCBYRkFfRWxlbWVudDo6RGF0ZVRpbWVTeW1ib2xzKQotICAgICAgICAgICAgICAgIDogbnVsbHB0cjsKLSAgd3NEdFN5bWJvbCA9IHBTeW1ib2xzID8gcFN5bWJvbHMtPkdldENvbnRlbnQoKSA6IENGWF9XaWRlU3RyaW5nKCk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlTG9jYWxlOjpHZXRNb250aE5hbWUoaW50MzJfdCBuTW9udGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c01vbnRoTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWJicikgY29uc3QgewotICB3c01vbnRoTmFtZSA9IEdldENhbGVuZGFyU3ltYm9sKFhGQV9FbGVtZW50OjpNb250aE5hbWVzLCBuTW9udGgsIGJBYmJyKTsKLX0KLQotdm9pZCBDWEZBX05vZGVMb2NhbGU6OkdldERheU5hbWUoaW50MzJfdCBuV2VlaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0RheU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJBYmJyKSBjb25zdCB7Ci0gIHdzRGF5TmFtZSA9IEdldENhbGVuZGFyU3ltYm9sKFhGQV9FbGVtZW50OjpEYXlOYW1lcywgbldlZWssIGJBYmJyKTsKLX0KLQotdm9pZCBDWEZBX05vZGVMb2NhbGU6OkdldE1lcmlkaWVtTmFtZShDRlhfV2lkZVN0cmluZyYgd3NNZXJpZGllbU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFNKSBjb25zdCB7Ci0gIHdzTWVyaWRpZW1OYW1lID0KLSAgICAgIEdldENhbGVuZGFyU3ltYm9sKFhGQV9FbGVtZW50OjpNZXJpZGllbU5hbWVzLCBiQU0gPyAwIDogMSwgZmFsc2UpOwotfQotCi12b2lkIENYRkFfTm9kZUxvY2FsZTo6R2V0VGltZVpvbmUoRlhfVElNRVpPTkUqIHR6KSBjb25zdCB7Ci0gIENYRkFfVGltZVpvbmVQcm92aWRlciBwcm92aWRlcjsKLSAgcHJvdmlkZXIuR2V0VGltZVpvbmUodHopOwotfQotCi12b2lkIENYRkFfTm9kZUxvY2FsZTo6R2V0RXJhTmFtZShDRlhfV2lkZVN0cmluZyYgd3NFcmFOYW1lLCBib29sIGJBRCkgY29uc3QgewotICB3c0VyYU5hbWUgPSBHZXRDYWxlbmRhclN5bWJvbChYRkFfRWxlbWVudDo6RXJhTmFtZXMsIGJBRCA/IDEgOiAwLCBmYWxzZSk7Ci19Ci0KLXZvaWQgQ1hGQV9Ob2RlTG9jYWxlOjpHZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0IHsKLSAgc3dpdGNoIChlVHlwZSkgewotICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9TaG9ydDoKLSAgICAgIHdzUGF0dGVybiA9IEdldFN5bWJvbChYRkFfRWxlbWVudDo6RGF0ZVBhdHRlcm5zLCBMInNob3J0Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfTWVkaXVtOgotICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9EZWZhdWx0OgotICAgICAgd3NQYXR0ZXJuID0gR2V0U3ltYm9sKFhGQV9FbGVtZW50OjpEYXRlUGF0dGVybnMsIEwibWVkIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUllfRnVsbDoKLSAgICAgIHdzUGF0dGVybiA9IEdldFN5bWJvbChYRkFfRWxlbWVudDo6RGF0ZVBhdHRlcm5zLCBMImZ1bGwiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9Mb25nOgotICAgICAgd3NQYXR0ZXJuID0gR2V0U3ltYm9sKFhGQV9FbGVtZW50OjpEYXRlUGF0dGVybnMsIEwibG9uZyIpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBDWEZBX05vZGVMb2NhbGU6OkdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3QgewotICBzd2l0Y2ggKGVUeXBlKSB7Ci0gICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX1Nob3J0OgotICAgICAgd3NQYXR0ZXJuID0gR2V0U3ltYm9sKFhGQV9FbGVtZW50OjpUaW1lUGF0dGVybnMsIEwic2hvcnQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9NZWRpdW06Ci0gICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0RlZmF1bHQ6Ci0gICAgICB3c1BhdHRlcm4gPSBHZXRTeW1ib2woWEZBX0VsZW1lbnQ6OlRpbWVQYXR0ZXJucywgTCJtZWQiKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWV9GdWxsOgotICAgICAgd3NQYXR0ZXJuID0gR2V0U3ltYm9sKFhGQV9FbGVtZW50OjpUaW1lUGF0dGVybnMsIEwiZnVsbCIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZX0xvbmc6Ci0gICAgICB3c1BhdHRlcm4gPSBHZXRTeW1ib2woWEZBX0VsZW1lbnQ6OlRpbWVQYXR0ZXJucywgTCJsb25nIik7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIENYRkFfTm9kZUxvY2FsZTo6R2V0TnVtUGF0dGVybihGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSBlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0IHsKLSAgc3dpdGNoIChlVHlwZSkgewotICAgIGNhc2UgRlhfTE9DQUxFTlVNUEFUVEVSTl9QZXJjZW50OgotICAgICAgd3NQYXR0ZXJuID0gZ19GWF9QZXJjZW50OwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWF9MT0NBTEVOVU1QQVRURVJOX0N1cnJlbmN5OgotICAgICAgd3NQYXR0ZXJuID0gZ19GWF9DdXJyZW5jeTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlhfTE9DQUxFTlVNUEFUVEVSTl9EZWNpbWFsOgotICAgICAgd3NQYXR0ZXJuID0gZ19GWF9EZWNpbWFsOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWF9MT0NBTEVOVU1QQVRURVJOX0ludGVnZXI6Ci0gICAgICB3c1BhdHRlcm4gPSBnX0ZYX0ludGVnZXI7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi1DWEZBX05vZGUqIENYRkFfTm9kZUxvY2FsZTo6R2V0Tm9kZUJ5TmFtZShDWEZBX05vZGUqIHBQYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSkgY29uc3QgewotICBDWEZBX05vZGUqIHBDaGlsZCA9Ci0gICAgICBwUGFyZW50ID8gcFBhcmVudC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpIDogbnVsbHB0cjsKLSAgd2hpbGUgKHBDaGlsZCkgewotICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hpbGQ7Ci0gICAgaWYgKHBDaGlsZC0+R2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEVfTmFtZSwgd3NDaGlsZCkpIHsKLSAgICAgIGlmICh3c0NoaWxkID09IHdzTmFtZSkgewotICAgICAgICByZXR1cm4gcENoaWxkOwotICAgICAgfQotICAgIH0KLSAgICBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9OZXh0U2libGluZyk7Ci0gIH0KLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENYRkFfTm9kZUxvY2FsZTo6R2V0U3ltYm9sKAotICAgIFhGQV9FbGVtZW50IGVFbGVtZW50LAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3ltYm9sX3R5cGUpIGNvbnN0IHsKLSAgQ1hGQV9Ob2RlKiBwU3ltYm9scyA9IG1fcExvY2FsZSA/IG1fcExvY2FsZS0+R2V0Q2hpbGQoMCwgZUVsZW1lbnQpIDogbnVsbHB0cjsKLSAgQ1hGQV9Ob2RlKiBwU3ltYm9sID0gR2V0Tm9kZUJ5TmFtZShwU3ltYm9scywgc3ltYm9sX3R5cGUpOwotICByZXR1cm4gcFN5bWJvbCA/IHBTeW1ib2wtPkdldENvbnRlbnQoKSA6IENGWF9XaWRlU3RyaW5nKCk7Ci19Ci0KLUNGWF9XaWRlU3RyaW5nIENYRkFfTm9kZUxvY2FsZTo6R2V0Q2FsZW5kYXJTeW1ib2woWEZBX0VsZW1lbnQgZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWJicikgY29uc3QgewotICBDWEZBX05vZGUqIHBDYWxlbmRhciA9Ci0gICAgICBtX3BMb2NhbGUgPyBtX3BMb2NhbGUtPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpDYWxlbmRhclN5bWJvbHMpCi0gICAgICAgICAgICAgICAgOiBudWxscHRyOwotICBpZiAocENhbGVuZGFyKSB7Ci0gICAgQ1hGQV9Ob2RlKiBwTm9kZSA9IHBDYWxlbmRhci0+R2V0Rmlyc3RDaGlsZEJ5Q2xhc3MoZUVsZW1lbnQpOwotICAgIGZvciAoOyBwTm9kZTsgcE5vZGUgPSBwTm9kZS0+R2V0TmV4dFNhbWVDbGFzc1NpYmxpbmcoZUVsZW1lbnQpKSB7Ci0gICAgICBpZiAocE5vZGUtPkdldEJvb2xlYW4oWEZBX0FUVFJJQlVURV9BYmJyKSA9PSBiQWJicikgewotICAgICAgICBDWEZBX05vZGUqIHBTeW1ib2wgPSBwTm9kZS0+R2V0Q2hpbGQoaW5kZXgsIFhGQV9FbGVtZW50OjpVbmtub3duKTsKLSAgICAgICAgcmV0dXJuIHBTeW1ib2wgPyBwU3ltYm9sLT5HZXRDb250ZW50KCkgOiBDRlhfV2lkZVN0cmluZygpOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gQ0ZYX1dpZGVTdHJpbmcoKTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxlLmggYi94ZmEvZnhmYS9wYXJzZXIveGZhX2xvY2FsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzI2ZjUxLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX1hGQV9MT0NBTEVfSF8KLSNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX1hGQV9MT0NBTEVfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotI2luY2x1ZGUgInhmYS9mZ2FzL2xvY2FsaXphdGlvbi9mZ2FzX2xvY2FsZS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfb2JqZWN0LmgiCi0KLWNsYXNzIENYRkFfWE1MTG9jYWxlIDogcHVibGljIElGWF9Mb2NhbGUgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9YTUxMb2NhbGUoc3RkOjp1bmlxdWVfcHRyPENYTUxfRWxlbWVudD4gcExvY2FsZURhdGEpOwotICB+Q1hGQV9YTUxMb2NhbGUoKSBvdmVycmlkZTsKLQotICAvLyBJRlhfTG9jYWxlCi0gIENGWF9XaWRlU3RyaW5nIEdldE5hbWUoKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBHZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0wgZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtU3ltYm9sKSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIEdldERhdGVUaW1lU3ltYm9scyhDRlhfV2lkZVN0cmluZyYgd3NEdFN5bWJvbCkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgR2V0TW9udGhOYW1lKGludDMyX3Qgbk1vbnRoLAotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NNb250aE5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgYkFiYnIgPSB0cnVlKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBHZXREYXlOYW1lKGludDMyX3QgbldlZWssCi0gICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NEYXlOYW1lLAotICAgICAgICAgICAgICAgICAgYm9vbCBiQWJiciA9IHRydWUpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIEdldE1lcmlkaWVtTmFtZShDRlhfV2lkZVN0cmluZyYgd3NNZXJpZGllbU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkFNID0gdHJ1ZSkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgR2V0VGltZVpvbmUoRlhfVElNRVpPTkUqIHR6KSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBHZXRFcmFOYW1lKENGWF9XaWRlU3RyaW5nJiB3c0VyYU5hbWUsIGJvb2wgYkFEID0gdHJ1ZSkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgdm9pZCBHZXREYXRlUGF0dGVybihGWF9MT0NBTEVEQVRFVElNRVNVQkNBVEVHT1JZIGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIEdldFRpbWVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgR2V0TnVtUGF0dGVybihGWF9MT0NBTEVOVU1TVUJDQVRFR09SWSBlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0IG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICB2b2lkIEdldFBhdHRlcm4oQ1hNTF9FbGVtZW50KiBwRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNUYWcsCi0gICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSwKLSAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BhdHRlcm4pIGNvbnN0OwotICBDRlhfV2lkZVN0cmluZyBHZXRDYWxlbmRhclN5bWJvbChjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIHN5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJBYmJyKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWE1MX0VsZW1lbnQ+IG1fcExvY2FsZURhdGE7Ci19OwotCi1jbGFzcyBDWEZBX05vZGVMb2NhbGUgOiBwdWJsaWMgSUZYX0xvY2FsZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDWEZBX05vZGVMb2NhbGUoQ1hGQV9Ob2RlKiBwTG9jYWxlKTsKLSAgfkNYRkFfTm9kZUxvY2FsZSgpIG92ZXJyaWRlOwotCi0gIC8vIElGWF9Mb2NhbGUKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIEdldE51bWJlcmljU3ltYm9sKEZYX0xPQ0FMRU5VTVNZTUJPTCBlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NOdW1TeW1ib2wpIGNvbnN0IG92ZXJyaWRlOwotCi0gIHZvaWQgR2V0RGF0ZVRpbWVTeW1ib2xzKENGWF9XaWRlU3RyaW5nJiB3c0R0U3ltYm9sKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBHZXRNb250aE5hbWUoaW50MzJfdCBuTW9udGgsCi0gICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c01vbnRoTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBiQWJiciA9IHRydWUpIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIEdldERheU5hbWUoaW50MzJfdCBuV2VlaywKLSAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0RheU5hbWUsCi0gICAgICAgICAgICAgICAgICBib29sIGJBYmJyID0gdHJ1ZSkgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgR2V0TWVyaWRpZW1OYW1lKENGWF9XaWRlU3RyaW5nJiB3c01lcmlkaWVtTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiQU0gPSB0cnVlKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBHZXRUaW1lWm9uZShGWF9USU1FWk9ORSogdHopIGNvbnN0IG92ZXJyaWRlOwotICB2b2lkIEdldEVyYU5hbWUoQ0ZYX1dpZGVTdHJpbmcmIHdzRXJhTmFtZSwgYm9vbCBiQUQgPSB0cnVlKSBjb25zdCBvdmVycmlkZTsKLQotICB2b2lkIEdldERhdGVQYXR0ZXJuKEZYX0xPQ0FMRURBVEVUSU1FU1VCQ0FURUdPUlkgZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Qgb3ZlcnJpZGU7Ci0gIHZvaWQgR2V0VGltZVBhdHRlcm4oRlhfTE9DQUxFREFURVRJTUVTVUJDQVRFR09SWSBlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuKSBjb25zdCBvdmVycmlkZTsKLSAgdm9pZCBHZXROdW1QYXR0ZXJuKEZYX0xPQ0FMRU5VTVNVQkNBVEVHT1JZIGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIENYRkFfTm9kZSogR2V0Tm9kZUJ5TmFtZShDWEZBX05vZGUqIHBQYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSkgY29uc3Q7Ci0gIENGWF9XaWRlU3RyaW5nIEdldFN5bWJvbChYRkFfRWxlbWVudCBlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgc3ltYm9sX3R5cGUpIGNvbnN0OwotICBDRlhfV2lkZVN0cmluZyBHZXRDYWxlbmRhclN5bWJvbChYRkFfRWxlbWVudCBlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJBYmJyKSBjb25zdDsKLQotICBDWEZBX05vZGUqIGNvbnN0IG1fcExvY2FsZTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX1hGQV9MT0NBTEVfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxlbWdyLmNwcCBiL3hmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxlbWdyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNkNjRlYS4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9wYXJzZXIveGZhX2xvY2FsZW1nci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjc0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxlbWdyLmgiCi0KLSNpbmNsdWRlIDx0aW1lLmg+Ci0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLQotI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9meF9jb2RlYy5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfeG1sLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9nZW1vZHVsZS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9sb2NhbGUuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfdXRpbHMuaCIKLQotY29uc3QgdWludDhfdCBnX2VuVVNfTG9jYWxlW10gPSB7Ci0gICAgMHg3OCwgMHg5QywgMHg5NSwgMHg1NiwgMHhEMSwgMHg2RSwgMHg5QiwgMHgzMCwgMHgxNCwgMHg3RCwgMHg5RiwgMHhCNCwKLSAgICAweDdGLCAweDQwLCAweEQ2LCAweDJBLCAweEI1LCAweDUyLCAweDU2LCAweDZGLCAweDhGLCAweEE5LCAweDg4LCAweEE1LAotICAgIDB4NkMsIDB4MjQsIDB4OUIsIDB4M0EsIDB4RDEsIDB4NTUsIDB4MjIsIDB4NTUsIDB4QjUsIDB4QkUsIDB4NEMsIDB4MEUsCi0gICAgMHhEQywgMHgwNSwgMHgzNCwgMHhCMCwgMHgyMywgMHg4MywgMHgzNywgMHgwNSwgMHhFRCwgMHhFMywgMHg2NywgMHgwNywKLSAgICAweEMzLCAweEMwLCAweEY2LCAweDI0LCAweEMyLCAweDRCLCAweDdDLCAweENGLCAweDNELCAweEU3LCAweEU2LCAweERFLAotICAgIDB4NjMsIDB4MzAsIDB4ODQsIDB4MjUsIDB4NEYsIDB4NjksIDB4MDksIDB4MDEsIDB4QTMsIDB4MTUsIDB4QUMsIDB4MTAsCi0gICAgMHhCMCwgMHhFRiwgMHg0RiwgMHgwOSwgMHgwQSwgMHgzMiwgMHhBOCwgMHhEMywgMHgxNSwgMHhEQSwgMHhCMCwgMHg0MywKLSAgICAweDU5LCAweEQ0LCAweEY5LCAweEY1LCAweEJBLCAweDAyLCAweDUxLCAweEE0LCAweEY0LCAweDA2LCAweDkxLCAweDUwLAotICAgIDB4NTMsIDB4NTksIDB4NDYsIDB4NDUsIDB4NzIsIDB4QUEsIDB4RjYsIDB4QkMsIDB4QUMsIDB4OEQsIDB4RUEsIDB4MjAsCi0gICAgMHhFMCwgMHhDMCwgMHg0NSwgMHg0MSwgMHg5OSwgMHg2MiwgMHg1NCwgMHg5QywgMHgzNSwgMHhGOSwgMHg4MywgMHg4MiwKLSAgICAweDZCLCAweEIzLCAweDI2LCAweEY3LCAweDk0LCAweDQ5LCAweDJBLCAweDRFLCAweDIxLCAweEVFLCAweEMyLCAweEQ3LAotICAgIDB4QUYsIDB4MEMsIDB4QkUsIDB4ODUsIDB4QkQsIDB4RjAsIDB4MjYsIDB4NjIsIDB4MkEsIDB4RDIsIDB4REMsIDB4NDEsCi0gICAgMHhENywgMHg0NywgMHg1MSwgMHg5NCwgMHgxRSwgMHhBRSwgMHhBQiwgMHhCRiwgMHg5NywgMHgwQywgMHgzQywgMHg2MCwKLSAgICAweEU5LCAweDMyLCAweEQ3LCAweEYyLCAweDIwLCAweEVCLCAweEM2LCAweDgxLCAweDEzLCAweDM4LCAweDM2LCAweDUwLAotICAgIDB4RUQsIDB4NDEsIDB4MzgsIDB4OTksIDB4QUYsIDB4NjksIDB4QzMsIDB4N0QsIDB4RjgsIDB4MDMsIDB4RkYsIDB4RTUsCi0gICAgMHgxNywgMHg0NCwgMHg5MCwgMHhEQSwgMHgwOSwgMHgzQywgMHhCMiwgMHhBOCwgMHhFNywgMHg5RCwgMHhBMywgMHg4MCwKLSAgICAweEVFLCAweEY3LCAweDYyLCAweDg1LCAweERFLCAweEEzLCAweDkxLCAweDczLCAweDNFLCAweEQ3LCAweDdDLCAweDg2LAotICAgIDB4RjksIDB4RUMsIDB4OUEsIDB4NkIsIDB4OTYsIDB4Q0YsIDB4MkIsIDB4OUYsIDB4NTUsIDB4M0UsIDB4OUYsIDB4N0MsCi0gICAgMHgwRSwgMHhGOSwgMHhEQywgMHhGMSwgMHgxOSwgMHhGMywgMHg3RiwgMHg0RiwgMHgzMiwgMHg3QSwgMHgzMiwgMHhCNywKLSAgICAweDkwLCAweDVBLCAweDkxLCAweDQ0LCAweEFBLCAweDVCLCAweDRFLCAweDc1LCAweEFFLCAweEQ3LCAweDVELCAweDkyLAotICAgIDB4QzQsIDB4REMsIDB4ODEsIDB4NzYsIDB4MTIsIDB4NkEsIDB4MUIsIDB4N0IsIDB4ODYsIDB4OEMsIDB4QjksIDB4RTgsCi0gICAgMHgyRSwgMHg5NywgMHhDMiwgMHgwMSwgMHhCNywgMHhBMiwgMHhCMCwgMHhBMSwgMHg4NCwgMHgzNiwgMHg1MiwgMHg4QywKLSAgICAweDQxLCAweDNDLCAweEY0LCAweDM1LCAweEVBLCAweDcxLCAweEI0LCAweDZCLCAweEE2LCAweDU5LCAweEJCLCAweDUzLAotICAgIDB4QkIsIDB4NEQsIDB4QkIsIDB4NDUsIDB4QkIsIDB4MzksIDB4QkIsIDB4MkYsIDB4QkIsIDB4MjksIDB4N0YsIDB4M0YsCi0gICAgMHhGQSwgMHgyMSwgMHhDRCwgMHgwQSwgMHhBOCwgMHhGQSwgMHg2NywgMHhDRiwgMHg4NCwgMHg2NCwgMHgxRCwgMHgyQiwKLSAgICAweDc3LCAweEZCLCAweDYwLCAweEM0LCAweDIzLCAweDhGLCAweDU2LCAweDAyLCAweDRGLCAweDJCLCAweDI4LCAweDA0LAotICAgIDB4MDQsIDB4MzUsIDB4RDUsIDB4RDQsIDB4OEEsIDB4N0MsIDB4RjgsIDB4MTgsIDB4NjIsIDB4RkQsIDB4REIsIDB4MjUsCi0gICAgMHhDOCwgMHgzQSwgMHgxQSwgMHg0MiwgMHgzQywgMHgxMCwgMHg3NSwgMHg2MCwgMHg5RCwgMHgxMSwgMHg1RCwgMHhFMywKLSAgICAweDBELCAweDNDLCAweEQyLCAweEE2LCAweDAxLCAweEMxLCAweENFLCAweDdCLCAweDNBLCAweDQ0LCAweEU2LCAweDAwLAotICAgIDB4RjksIDB4MjEsIDB4Q0IsIDB4MTIsIDB4OTEsIDB4OEQsIDB4QkEsIDB4MTYsIDB4NDEsIDB4QUMsIDB4QUUsIDB4MjAsCi0gICAgMHg1QSwgMHgwNCwgMHhERiwgMHhENCwgMHhBNSwgMHgyNywgMHgxQywgMHhCOCwgMHg1NiwgMHgyMSwgMHgyMywgMHgyRCwKLSAgICAweDM5LCAweDNCLCAweDIwLCAweDcyLCAweEExLCAweEE4LCAweDgyLCAweEVDLCAweEFDLCAweEI5LCAweDQwLCAweDUyLAotICAgIDB4RTcsIDB4NUMsIDB4MzQsIDB4NEEsIDB4ODQsIDB4MjMsIDB4RUMsIDB4RTEsIDB4RTMsIDB4QzksIDB4ODQsIDB4MEEsCi0gICAgMHg2OCwgMHg4QSwgMHg2QSwgMHgzNCwgMHhGMSwgMHgyOCwgMHg5QSwgMHg0QywgMHg5QywgMHhERiwgMHhDNSwgMHhGMSwKLSAgICAweDVELCAweDkyLCAweDA0LCAweEVCLCAweEUwLCAweDI1LCAweEM0LCAweDIzLCAweDkyLCAweDU1LCAweDYxLCAweDMyLAotICAgIDB4RUEsIDB4NjUsIDB4OUEsIDB4RjMsIDB4QTQsIDB4ODMsIDB4NjQsIDB4ODYsIDB4QzAsIDB4Q0MsIDB4QTksIDB4MjUsCi0gICAgMHgxRSwgMHgzRSwgMHg5RSwgMHhDQywgMHg2NSwgMHg4QywgMHhEQSwgMHgyOSwgMHhBQywgMHhERiwgMHhFQywgMHg0RiwKLSAgICAweEE3LCAweDM4LCAweEZCLCAweEY5LCAweEI5LCAweEFBLCAweDkzLCAweDRELCAweEI0LCAweEZELCAweEZELCAweDRDLAotICAgIDB4RjMsIDB4MkYsIDB4RUQsIDB4NEIsIDB4NjcsIDB4Q0UsIDB4OTgsIDB4QTQsIDB4NzQsIDB4NEMsIDB4RUEsIDB4NTMsCi0gICAgMHhGMSwgMHg5RiwgMHg0MywgMHg5MywgMHhEOCwgMHhCNCwgMHhBMiwgMHgzMCwgMHhGRCwgMHhFMiwgMHg0MSwgMHhBNCwKLSAgICAweDVELCAweEI0LCAweEVELCAweEYyLCAweEI2LCAweDZELCAweERCLCAweDEwLCAweDRGLCAweDc4LCAweDRFLCAweDIxLAotICAgIDB4MjMsIDB4NEMsIDB4QTUsIDB4MTAsIDB4QzAsIDB4RDIsIDB4MTMsIDB4MjIsIDB4NkYsIDB4M0EsIDB4RTksIDB4NzIsCi0gICAgMHhGOSwgMHhFNywgMHg3QSwgMHg1OCwgMHhERSwgMHhDQywgMHhBQywgMHg3MiwgMHgwNCwgMHg5MSwgMHgwMiwgMHg2QiwKLSAgICAweENDLCAweERGLCAweDVGLCAweDc5LCAweDU0LCAweEQ4LCAweDlBLCAweDYyLCAweDI4LCAweEQ0LCAweDBGLCAweDNBLAotICAgIDB4MDksIDB4NEQsIDB4RDksIDB4MEMsIDB4RDIsIDB4QTIsIDB4QTIsIDB4NkEsIDB4RjMsIDB4NkYsIDB4N0IsIDB4N0QsCi0gICAgMHg5NywgMHhCNiwgMHhENSwgMHhDMywgMHhCQiwgMHg5NSwgMHhDQiwgMHg2MywgMHhBMSwgMHgzNywgMHg3RSwgMHgzMSwKLSAgICAweDhCLCAweDNGLCAweDc0LCAweDdELCAweDM1LCAweDhCLCAweDVFLCAweDE1LCAweDRDLCAweEQ2LCAweDg4LCAweEJDLAotICAgIDB4OUQsIDB4NDUsIDB4NkUsIDB4NDEsIDB4NzAsIDB4NDQsIDB4REUsIDB4QjksIDB4NUMsIDB4M0MsIDB4MUQsIDB4NUIsCi0gICAgMHgyMSwgMHhGRCwgMHgxNiwgMHgwQywgMHg0RSwgMHg0QywgMHg4MSwgMHhGRSwgMHg2NiwgMHgzQiwgMHgwNywgMHg2QSwKLSAgICAweDlCLCAweEQ0LCAweEE5LCAweDMxLCAweEM5LCAweEJCLCAweDI1LCAweDhDLCAweEEyLCAweEE4LCAweEI5LCAweDVFLAotICAgIDB4MjAsIDB4RjIsIDB4OTQsIDB4NDQsIDB4QjMsIDB4NDUsIDB4NjMsIDB4Q0IsIDB4NUQsIDB4MDksIDB4QjYsIDB4N0IsCi0gICAgMHhENSwgMHg1OCwgMHhGNywgMHg1NSwgMHhBNCwgMHg5NiwgMHg3RiwgMHgwMSwgMHg3NSwgMHgzNywgMHgxQiwgMHg4QiwKLX07Ci1jb25zdCB1aW50OF90IGdfZW5HQl9Mb2NhbGVbXSA9IHsKLSAgICAweDc4LCAweDlDLCAweDk1LCAweDU2LCAweEQxLCAweDZFLCAweEQzLCAweDMwLCAweDE0LCAweDdELCAweDQ3LCAweEUyLAotICAgIDB4MUYsIDB4QTIsIDB4ODgsIDB4NDksIDB4MjAsIDB4NkQsIDB4MzMsIDB4M0MsIDB4NkUsIDB4RUEsIDB4MkMsIDB4NzUsCi0gICAgMHhFQiwgMHhENiwgMHgzMiwgMHhDOCwgMHhBOCwgMHg0OCwgMHhDNSwgMHhDNCwgMHg1RSwgMHg5MCwgMHg5QiwgMHg3OCwKLSAgICAweDhELCAweDU5LCAweDYyLCAweDU3LCAweDRFLCAweENDLCAweDk0LCAweEZDLCAweDAyLCAweDlGLCAweEMwLCAweDIzLAotICAgIDB4Q0YsIDB4MDgsIDB4RjEsIDB4MDEsIDB4QkMsIDB4RjAsIDB4MkYsIDB4NDgsIDB4RkIsIDB4MEMsIDB4NkUsIDB4MUEsCi0gICAgMHgyNywgMHg0QiwgMHgxQywgMHhBRiwgMHg2NCwgMHg3OSwgMHg4OSwgMHhFRiwgMHhCOSwgMHhFNywgMHhEQywgMHhERSwKLSAgICAweDdCLCAweDlDLCAweEI4LCAweDE5LCAweEM1LCAweDIyLCAweDIwLCAweDMxLCAweDc1LCAweDM4LCAweDQ5LCAweEU4LAotICAgIDB4OTEsIDB4NEIsIDB4RjksIDB4QTcsIDB4RTksIDB4QjEsIDB4RUIsIDB4ODQsIDB4MzQsIDB4MEQsIDB4OEUsIDB4REMsCi0gICAgMHhCQiwgMHhBRiwgMHhCRiwgMHhFRSwgMHg3RSwgMHhGRSwgMHg3OCwgMHgwRSwgMHhCNywgMHhCRiwgMHhERiwgMHg3RSwKLSAgICAweEJGLCAweDcwLCAweEYxLCAweEE4LCAweDI0LCAweEYyLCAweDkwLCAweDQ4LCAweDNGLCAweDRGLCAweDk2LCAweDIyLAotICAgIDB4NEUsIDB4QjUsIDB4NjYsIDB4MjUsIDB4RTksIDB4NEEsIDB4NDgsIDB4NDYsIDB4MzgsIDB4MzAsIDB4MTIsIDB4QzEsCi0gICAgMHhCMywgMHhFOCwgMHgwMiwgMHhFMCwgMHg1NCwgMHhBRiwgMHhGMSwgMHgzOSwgMHhFMSwgMHg4QSwgMHhDOCwgMHg3QywKLSAgICAweDg0LCAweEFBLCAweEYwLCAweEU5LCAweDEzLCAweDhELCAweDlGLCAweEQxLCAweEE1LCAweEI0LCAweDI2LCAweDNDLAotICAgIDB4MjIsIDB4ODMsIDB4QTgsIDB4ODcsIDB4OEUsIDB4RDcsIDB4OTIsIDB4QzUsIDB4MTYsIDB4NkUsIDB4NUYsIDB4N0YsCi0gICAgMHhBRSwgMHgzOCwgMHhCNSwgMHg4MCwgMHg3MSwgMHg5RiwgMHgzOSwgMHg1NiwgMHgyQiwgMHg5NSwgMHg2NiwgMHgzRCwKLSAgICAweEQ4LCAweEE3LCAweEVCLCAweDhDLCAweDI2LCAweDRCLCAweDJBLCAweDdCLCAweDk5LCAweDc3LCAweDQxLCAweDI2LAotICAgIDB4NkMsIDB4RjgsIDB4ODUsIDB4RjgsIDB4NjIsIDB4MTcsIDB4NEMsIDB4NjgsIDB4NjAsIDB4MjYsIDB4NTAsIDB4Q0IsCi0gICAgMHhBMiwgMHg5QSwgMHhCNywgMHg4OSwgMHgxQywgMHhCMiwgMHg1QywgMHhDQSwgMHgyMywgMHhGNywgMHg5NSwgMHhEQiwKLSAgICAweDcyLCAweENFLCAweEU2LCAweDlBLCAweENELCAweDMwLCAweDlCLCAweDVELCAweDQzLCAweENELCAweEIyLCAweDc5LAotICAgIDB4NjUsIDB4QjMsIDB4Q0EsIDB4RTYsIDB4OTMsIDB4Q0QsIDB4MjEsIDB4OUIsIDB4M0IsIDB4MzYsIDB4NjMsIDB4MUUsCi0gICAgMHhGNiwgMHgyNCwgMHgyNCwgMHhCOSwgMHg3RSwgMHg4NCwgMHg2MCwgMHg4NSwgMHg3RCwgMHgwNSwgMHg4RiwgMHgxQywKLSAgICAweDc0LCAweDVFLCAweEFFLCAweEFCLCAweDI0LCAweEY2LCAweDQ0LCAweDBGLCAweDVBLCAweDI4LCAweDlBLCAweDlBLAotICAgIDB4RDgsIDB4MjUsIDB4MEQsIDB4NzksIDB4MUYsIDB4NUQsIDB4NDQsIDB4NEEsIDB4RjYsIDB4QzAsIDB4MzMsIDB4QzksCi0gICAgMHg0QywgMHhDOCwgMHgyNywgMHg5OSwgMHg5MiwgMHg2RCwgMHgxMCwgMHgzNSwgMHg3RCwgMHhCNSwgMHg3QSwgMHg2QywKLSAgICAweEVELCAweDlBLCAweDZFLCAweEQ2LCAweEVDLCAweEQ0LCAweDZDLCAweEQzLCAweDZDLCAweEQxLCAweDZDLCAweENFLAotICAgIDB4RUMsIDB4Q0IsIDB4NkMsIDB4Q0EsIDB4REUsIDB4NEYsIDB4NDIsIDB4NjEsIDB4MDIsIDB4NDYsIDB4OTMsIDB4RkEsCi0gICAgMHhERCwgMHhEMywgMHgyMSwgMHgxRSwgMHg3QiwgMHhFMCwgMHg2RSwgMHgxRCwgMHhCNCwgMHg3OCwgMHg3OCwgMHg2RSwKLSAgICAweDI0LCAweDUwLCAweEI3LCAweDAyLCAweDIwLCAweDU0LCAweDEyLCAweDVELCAweDBELCAweDU2LCAweEY4LCAweEY4LAotICAgIDB4NjQsIDB4ODQsIDB4Q0EsIDB4N0IsIDB4OTUsIDB4QzAsIDB4RTMsIDB4NDksIDB4MTMsIDB4QTIsIDB4ODYsIDB4NTgsCi0gICAgMHgwNiwgMHhDNiwgMHgxOSwgMHg1MSwgMHgzNSwgMHg5RSwgMHhEMSwgMHgzOSwgMHhDOSwgMHgzMiwgMHgyQSwgMHhGOSwKLSAgICAweDY2LCAweDRGLCAweDlCLCAweDQ4LCAweDFGLCAweDIwLCAweEQ3LCAweDJBLCAweDhFLCAweDVELCAweDdDLCAweDBBLAotICAgIDB4RDcsIDB4QUUsIDB4MzMsIDB4NzEsIDB4M0MsIDB4QjgsIDB4OUMsIDB4OEYsIDB4NzAsIDB4OTUsIDB4MDMsIDB4MzYsCi0gICAgMHg1NCwgMHhBMywgMHg4RSwgMHg1NiwgMHhDNiwgMHg4MiwgMHhBRiwgMHg1QywgMHhGQywgMHgzOCwgMHg0RCwgMHg0MiwKLSAgICAweDQzLCAweDJELCAweDE5LCAweEFBLCAweDQ4LCAweDIzLCAweDIxLCAweDMzLCAweEQwLCAweDRDLCAweDkwLCAweEU3LAotICAgIDB4MjEsIDB4QUIsIDB4MDYsIDB4NzUsIDB4NDYsIDB4MDQsIDB4MjAsIDB4NjMsIDB4NDksIDB4NkIsIDB4RTQsIDB4NTYsCi0gICAgMHhENCwgMHgxOSwgMHg3OSwgMHgzNiwgMHgzQiwgMHhGNCwgMHhCQywgMHg0MywgMHhERiwgMHg3NywgMHhBRSwgMHg0NiwKLSAgICAweEE4LCAweEM1LCAweDMxLCAweDBBLCAweDc0LCAweDY2LCAweDdELCAweDk0LCAweDY0LCAweDMzLCAweDZBLCAweEFELAotICAgIDB4MTgsIDB4QzAsIDB4RDcsIDB4ODMsIDB4NkUsIDB4MTQsIDB4M0QsIDB4M0EsIDB4RUEsIDB4Q0MsIDB4QTQsIDB4OEQsCi0gICAgMHg1QSwgMHgwMCwgMHg1NiwgMHhFRiwgMHhGNCwgMHgzNCwgMHhGNywgMHhDMiwgMHg5QiwgMHg1OSwgMHg5MiwgMHhGQSwKLSAgICAweEE3LCAweDkzLCAweEIzLCAweERCLCAweDRCLCAweDEyLCAweEJELCAweDI5LCAweEFFLCAweDJBLCAweDYzLCAweERBLAotICAgIDB4MjQsIDB4RDAsIDB4NzEsIDB4NTUsIDB4MUUsIDB4ODksIDB4RjcsIDB4RUUsIDB4NzQsIDB4NjIsIDB4REQsIDB4MDksCi0gICAgMHg2MCwgMHhGMCwgMHgzOCwgMHgwNiwgMHgyRSwgMHgyRSwgMHg3NiwgMHg4QiwgMHhFMiwgMHg2MCwgMHhCRiwgMHgyOCwKLSAgICAweDhBLCAweDExLCAweEVBLCAweEYwLCAweDdBLCAweDg1LCAweEI0LCAweDMwLCAweDUwLCAweDUyLCAweDUyLCAweDFFLAotICAgIDB4RTQsIDB4MkUsIDB4N0UsIDB4NTYsIDB4NDksIDB4MEYsIDB4MEUsIDB4MDYsIDB4MkEsIDB4RDcsIDB4NTQsIDB4MDYsCi0gICAgMHg5NCwgMHg2NywgMHhGQSwgMHgyNywgMHg3NywgMHgyQywgMHgyQSwgMHg2NCwgMHg3NCwgMHhERSwgMHgxNCwgMHhBQSwKLSAgICAweDg3LCAweEVCLCAweDg0LCAweEJBLCAweDZDLCAweDQ4LCAweDAzLCAweDk2LCAweDEwLCAweEQ4LCAweEVDLCAweEZELAotICAgIDB4NUEsIDB4NUYsIDB4QTUsIDB4NEQsIDB4NzUsIDB4RjMsIDB4NjcsIDB4MkEsIDB4RDQsIDB4OUEsIDB4OTUsIDB4M0IsCi0gICAgMHhCRCwgMHgzQiwgMHg4OCwgMHhERiwgMHg3NCwgMHhCRCwgMHgzMywgMHg4OCwgMHg5RSwgMHgzMCwgMHhBRSwgMHg1MiwKLSAgICAweDE3LCAweEVGLCAweDBELCAweDIyLCAweDE3LCAweDU0LCAweDBBLCAweDE3LCAweEJGLCAweEVDLCAweDczLCAweDUxLAotICAgIDB4NzcsIDB4NkMsIDB4NDAsIDB4NkEsIDB4REIsIDB4MUIsIDB4MjcsIDB4QkEsIDB4NDAsIDB4RkQsIDB4N0MsIDB4NkQsCi0gICAgMHgwMiwgMHgxNywgMHhGRiwgMHhGOSwgMHgwRSwgMHhFNywgMHg0NCwgMHg4NywgMHhEMCwgMHhBRiwgMHhBMSwgMHgyNSwKLSAgICAweDJDLCAweDE1LCAweEU1LCAweEMyLCAweEM1LCAweEQzLCAweEUzLCAweEY5LCAweDYwLCAweDUxLCAweERCLCAweEYzLAotICAgIDB4QkUsIDB4MDQsIDB4OTksIDB4Q0QsIDB4OTYsIDB4RUYsIDB4NDIsIDB4QkUsIDB4QTYsIDB4RDcsIDB4MjQsIDB4MjgsCi0gICAgMHgwRiwgMHhCQiwgMHg3QSwgMHhBOSwgMHg2QiwgMHg3OSwgMHgzOSwgMHg3QywgMHhEQSwgMHg4NCwgMHhDRSwgMHgxQywKLSAgICAweEFDLCAweDQwLCAweDZELCAweDY2LCAweDlELCAweDY2LCAweDlDLCAweDA5LCAweEZFLCAweDYwLCAweEZBLCAweDQ0LAotICAgIDB4MjgsIDB4QzksIDB4QTgsIDB4NzQsIDB4RkMsIDB4MkMsIDB4QjQsIDB4RTYsIDB4QzcsIDB4MjEsIDB4N0MsIDB4NTAsCi0gICAgMHgzOCwgMHg3MywgMHhGNiwgMHgxRiwgMHhDMiwgMHgwQywgMHgzRSwgMHg5NiwgMHhFOCwgMHhFRCwgMHgxNiwgMHhDMiwKLSAgICAweDU4LCAweDkyLCAweDI1LCAweEJDLCAweDJFLCAweDBGLCAweDEzLCAweDE2LCAweDExLCAweDYxLCAweEQ2LCAweEY0LAotICAgIDB4MUIsIDB4NTEsIDB4QTgsIDB4MUIsIDB4RTIsIDB4NEMsIDB4NDUsIDB4MTYsIDB4QjEsIDB4QTAsIDB4OUMsIDB4NjMsCi0gICAgMHhFRiwgMHhDMywgMHg2QiwgMHhDNywgMHhEQiwgMHg0NiwgMHg4NSwgMHg5MSwgMHg4MywgMHg0OCwgMHhENCwgMHhENCwKLSAgICAweEY3LCAweDVCLCAweDdFLCAweDE0LCAweDk4LCAweEFCLCAweDcyLCAweDMyLCAweEU3LCAweEVELCAweDE2LCAweDkyLAotICAgIDB4MkYsIDB4MDYsIDB4OTAsIDB4QkMsIDB4NUMsIDB4RjEsIDB4RDUsIDB4NjcsIDB4QjEsIDB4RTEsIDB4RTksIDB4RTYsCi0gICAgMHhEMCwgMHhGRCwgMHg5RSwgMHg5NSwgMHg1MSwgMHhGNSwgMHgxOSwgMHgwQiwgMHhDQiwgMHg3RiwgMHg4RSwgMHg2OSwKLSAgICAweEFDLCAweEQwfTsKLWNvbnN0IHVpbnQ4X3QgZ196aENOX0xvY2FsZVtdID0gewotICAgIDB4NzgsIDB4OUMsIDB4RUQsIDB4NTYsIDB4NDEsIDB4NEYsIDB4RDQsIDB4NDAsIDB4MTQsIDB4QkUsIDB4OUIsIDB4RjgsCi0gICAgMHgxRiwgMHg5QSwgMHg0NiwgMHg1MiwgMHg0RCwgMHg1OCwgMHg0NiwgMHg4RiwgMHg5MCwgMHhEMiwgMHg2NCwgMHgwMywKLSAgICAweDA4LCAweDA2LCAweEJCLCAweDIxLCAweDk2LCAweDY4LCAweEUwLCAweDYyLCAweEJBLCAweEVELCAweEIwLCAweDJELAotICAgIDB4NkMsIDB4M0IsIDB4NjQsIDB4QjYsIDB4MEQsIDB4NkUsIDB4NEYsIDB4MTgsIDB4ODIsIDB4ODIsIDB4QzIsIDB4NDUsCi0gICAgMHg4OSwgMHg5QSwgMHg4MCwgMHhFMSwgMHg2NCwgMHgzQywgMHgyOCwgMHg5RSwgMHg4QywgMHgwMSwgMHgyMiwgMHhGMSwKLSAgICAweENGLCAweEIwLCAweENCLCAweDkxLCAweEJGLCAweEUwLCAweDlCLCAweEVELCAweEI0LCAweEI0LCAweERELCAweEQ5LAotICAgIDB4QjUsIDB4M0YsIDB4QzAsIDB4M0QsIDB4Q0QsIDB4RkIsIDB4REUsIDB4RjcsIDB4N0QsIDB4RjMsIDB4REUsIDB4RUIsCi0gICAgMHg3NCwgMHhCNiwgMHg2QSwgMHg5MywgMHg1OCwgMHg2NiwgMHgxMywgMHg0QiwgMHhCRSwgMHhFOSwgMHhFMSwgMHg0OSwKLSAgICAweDM5LCAweDcyLCAweDlFLCAweDRGLCAweEQ1LCAweDY0LCAweEM5LCAweEM2LCAweDJELCAweDZCLCAweDUyLCAweEJFLAotICAgIDB4M0MsIDB4M0QsIDB4RTksIDB4N0UsIDB4NzgsIDB4N0QsIDB4RjcsIDB4RUEsIDB4QzcsIDB4RTYsIDB4RTUsIDB4QzUsCi0gICAgMHhGQiwgMHhFQiwgMHhERiwgMHg3QiwgMHgxMCwgMHg3NywgMHgwRSwgMHgyRiwgMHhFRSwgMHhDOSwgMHg5QSwgMHhDQSwKLSAgICAweDE0LCAweEJFLCAweDZELCAweDUyLCAweEEzLCAweEVELCAweEQ1LCAweDQ5LCAweEIzLCAweEM1LCAweEM1LCAweDBELAotICAgIDB4OEEsIDB4MUIsIDB4ODQsIDB4QkEsIDB4QTYsIDB4MEYsIDB4MEMsIDB4OEYsIDB4RjgsIDB4ODEsIDB4NTMsIDB4MDMsCi0gICAgMHhCOCwgMHhDNSwgMHhENywgMHhEQSwgMHhFNSwgMHhFOSwgMHg2NiwgMHhGNywgMHg2OCwgMHg0NywgMHg0NSwgMHg3MSwKLSAgICAweDc0LCAweEZCLCAweDU2LCAweDAyLCAweDlGLCAweEVGLCAweDA5LCAweEUxLCAweEQzLCAweDVELCAweDExLCAweERDLAotICAgIDB4MzksIDB4M0MsIDB4MTQsIDB4OUIsIDB4MUMsIDB4MDgsIDB4RDksIDB4REIsIDB4MjcsIDB4NjIsIDB4RUYsIDB4MkQsCi0gICAgMHgzMSwgMHhGQiwgMHg5QiwgMHg5MCwgMHg3RCwgMHhGNiwgMHg1OSwgMHhDOCwgMHhERSwgMHg3RiwgMHgzOSwgMHgwMCwKLSAgICAweDFFLCAweEQwLCAweDI4LCAweENCLCAweDE0LCAweDdCLCAweDQ1LCAweDk5LCAweDMxLCAweDI1LCAweEM0LCAweDVFLAotICAgIDB4MjQsIDB4OTksIDB4RjUsIDB4M0EsIDB4OUQsIDB4OTQsIDB4MUYsIDB4QzgsIDB4RkYsIDB4QTcsIDB4NTcsIDB4N0EsCi0gICAgMHg3QSwgMHhCNiwgMHhEOSwgMHhFNiwgMHgwNywgMHgwRSwgMHg1NiwgMHg1QSwgMHhGNywgMHhEMywgMHg3MSwgMHhGNywKLSAgICAweEU4LCAweEI4LCAweEZCLCAweEYxLCAweDhCLCAweDhBLCAweDU4LCAweDE4LCAweEU3LCAweDM5LCAweDBBLCAweDdCLAotICAgIDB4ODgsIDB4RDAsIDB4RjMsIDB4M0QsIDB4MjEsIDB4NzcsIDB4NTcsIDB4ODAsIDB4QzIsIDB4MjQsIDB4ODUsIDB4MEUsCi0gICAgMHgwNywgMHgyMiwgMHhFRSwgMHhGNiwgMHg0OSwgMHg4QSwgMHhBMiwgMHhCNCwgMHhDOCwgMHg0QywgMHhDMSwgMHg5OSwKLSAgICAweDg3LCAweERELCAweDUzLCAweDE1LCAweDZBLCAweDJFLCAweDU2LCAweDVCLCAweEFDLCAweEIzLCAweDU4LCAweDYxLAotICAgIDB4QjEsIDB4QjYsIDB4NjIsIDB4NTUsIDB4MDMsIDB4RUIsIDB4RjEsIDB4MzAsIDB4NzUsIDB4NkQsIDB4MTcsIDB4N0IsCi0gICAgMHhDOSwgMHg2QiwgMHhDQiwgMHg0MywgMHhEOCwgMHhFMCwgMHg0RCwgMHg2NywgMHg5RiwgMHgwRCwgMHgzRSwgMHgwMSwKLSAgICAweDMyLCAweDVDLCAweDQ4LCAweEJFLCAweEVELCAweDRCLCAweEEyLCAweEJDLCAweDEzLCAweDIwLCAweDk4LCAweDlBLAotICAgIDB4REMsIDB4MTUsIDB4NTYsIDB4NTAsIDB4QzEsIDB4RjcsIDB4Q0UsIDB4RjYsIDB4NTYsIDB4NjcsIDB4NzcsIDB4NUYsCi0gICAgMHg0NSwgMHgyQywgMHg4QywgMHhGMywgMHgxQywgMHg0RCwgMHgyMSwgMHg5NCwgMHg2QSwgMHg1OCwgMHg1MCwgMHhCOCwKLSAgICAweDcxLCAweEUyLCAweDVFLCAweDAyLCAweEJDLCAweDYwLCAweDA2LCAweDAxLCAweEE2LCAweDdFLCAweEVGLCAweDk5LAotICAgIDB4QTcsIDB4MTEsIDB4QkYsIDB4OEUsIDB4NTYsIDB4QzIsIDB4NjYsIDB4NTMsIDB4RDYsIDB4OTYsIDB4RTAsIDB4QTcsCi0gICAgMHg3NCwgMHhDRSwgMHg3RSwgMHgyQSwgMHhCQSwgMHgwMiwgMHhBNywgMHg0NywgMHg5OSwgMHg1NiwgMHg2MCwgMHhCQywKLSAgICAweENBLCAweDBDLCAweEZDLCAweDU4LCAweEVGLCAweEE5LCAweEE0LCAweEUwLCAweEM3LCAweDFELCAweDlBLCAweEM0LAotICAgIDB4NkYsIDB4MEMsIDB4NzAsIDB4MjgsIDB4QTEsIDB4RjYsIDB4QjAsIDB4MUQsIDB4OEIsIDB4MkIsIDB4N0EsIDB4NjUsCi0gICAgMHhCQSwgMHgwNCwgMHhCRiwgMHhFNSwgMHgxMCwgMHgxQSwgMHgzMCwgMHg4NSwgMHg5MCwgMHg4RiwgMHg3MiwgMHhFRCwKLSAgICAweDAyLCAweDEwLCAweEI4LCAweDVFLCAweEE2LCAweEZELCAweDRDLCAweDk0LCAweDZCLCAweEJGLCAweEVBLCAweDM4LAotICAgIDB4NTAsIDB4RUYsIDB4MkYsIDB4NDUsIDB4RDcsIDB4OTUsIDB4Q0UsIDB4Q0UsIDB4MkIsIDB4QzUsIDB4MzAsIDB4OTQsCi0gICAgMHhBQiwgMHhBRiwgMHhFRiwgMHgxNCwgMHg2OSwgMHg1OSwgMHg0NSwgMHgxOSwgMHg0NSwgMHhDMSwgMHgyRSwgMHhENywKLSAgICAweEJELCAweEQ4LCAweEEwLCAweDg0LCAweEJDLCAweEQ3LCAweDNFLCAweEE4LCAweDI3LCAweDc0LCAweDdELCAweEMyLAotICAgIDB4MzAsIDB4NEEsIDB4MDgsIDB4NzgsIDB4RkYsIDB4NTUsIDB4QTYsIDB4RTgsIDB4QTMsIDB4QTMsIDB4NUMsIDB4QkIsCi0gICAgMHg3QywgMHg3RSwgMHg4QiwgMHg4MCwgMHgyNSwgMHgwNywgMHg2MiwgMHhENiwgMHhGNCwgMHg1NywgMHhENywgMHhFNiwKLSAgICAweEJDLCAweDk2LCAweDMxLCAweDMzLCAweEZELCAweDcwLCAweEUzLCAweEQ5LCAweDBCLCAweDY3LCAweDNFLCAweDVBLAotICAgIDB4OEUsIDB4NjcsIDB4OTYsIDB4MjUsIDB4ODEsIDB4Q0UsIDB4MEYsIDB4QkQsIDB4M0EsIDB4QTYsIDB4MzcsIDB4ODMsCi0gICAgMHhDQiwgMHhDNSwgMHhCQywgMHgxMiwgMHhDMCwgMHhFMCwgMHgwMCwgMHg1QiwgMHhCMiwgMHgxNiwgMHg4RCwgMHg0NiwKLSAgICAweEQxLCAweEY4LCAweDU4LCAweDE0LCAweDQ1LCAweDJBLCAweENBLCAweEYxLCAweEZBLCAweDhDLCAweEI4LCAweEQwLAotICAgIDB4MEEsIDB4MjksIDB4QzUsIDB4QkUsIDB4RDUsIDB4OTYsIDB4QjUsIDB4M0IsIDB4QjEsIDB4NzQsIDB4N0MsIDB4QkMsCi0gICAgMHhBNCwgMHg3MiwgMHgxRCwgMHg1MywgMHgwQiwgMHhGQiwgMHgwMSwgMHhERiwgMHg3MiwgMHg0NCwgMHhBMCwgMHg0MiwKLSAgICAweDg1LCAweENBLCAweDUzLCAweEEzLCAweEE0LCAweEI5LCAweDVDLCAweEM4LCAweDZELCAweDZELCAweDZDLCAweEI5LAotICAgIDB4OUUsIDB4MDksIDB4RTcsIDB4NjAsIDB4MkMsIDB4RDEsIDB4QzcsIDB4RTksIDB4QTIsIDB4M0EsIDB4RkQsIDB4MDcsCi0gICAgMHgyNywgMHhFMSwgMHhCQSwgMHhDQiwgMHgxRSwgMHhGQiwgMHg2OCwgMHgyOSwgMHg3RSwgMHg1QSwgMHhGNSwgMHg0OCwKLSAgICAweDI5LCAweEJBLCAweEU3LCAweEZBLCAweDYxLCAweDRCLCAweEQ2LCAweDJBLCAweEE1LCAweEM4LCAweDExLCAweEE2LAotICAgIDB4NDQsIDB4RDYsIDB4RUUsIDB4RjcsIDB4NzMsIDB4NTEsIDB4QkUsIDB4NkQsIDB4NDAsIDB4OTIsIDB4QjEsIDB4QTcsCi0gICAgMHg5MywgMHhDOCwgMHgwMywgMHhDOSwgMHhGOSwgMHhFQSwgMHgwNSwgMHhCMiwgMHg3NiwgMHhGRCwgMHgwNywgMHhFRSwKLSAgICAweEQ3LCAweDNDLCAweEEzLCAweERGLCAweDg0LCAweDZCLCAweERDLCAweDE2LCAweDYxLCAweDBCLCAweDU5LCAweDlCLAotICAgIDB4QUEsIDB4MkQsIDB4OTUsIDB4MTYsIDB4NjUsIDB4ODcsIDB4REUsIDB4MkYsIDB4NDEsIDB4QzUsIDB4NkEsIDB4RDksCi0gICAgMHhDQiwgMHhEMCwgMHg1RSwgMHhDNywgMHgyQiwgMHhBNiwgMHhDNSwgMHhFRSwgMHhDNywgMHg2NCwgMHhDOSwgMHhCRCwKLSAgICAweEFBLCAweDM2LCAweEE5LCAweDYzLCAweEM5LCAweDgwLCAweDU3LCAweDUxLCAweDMyLCAweDAyLCAweDVCLCAweDdBLAotICAgIDB4MkMsIDB4QTMsIDB4MkMsIDB4OUYsIDB4OTMsIDB4RjQsIDB4MzYsIDB4N0MsIDB4NzUsIDB4RDksIDB4RDIsIDB4MDIsCi0gICAgMHgwQywgMHg0QywgMHg5OCwgMHg3NiwgMHg3RCwgMHg5NywgMHhGOCwgMHgwMywgMHhEMywgMHg1MywgMHgyNCwgMHhBNCwKLSAgICAweDJFLCAweEE2LCAweENDLCAweDVGLCAweDk4LCAweDhGLCAweDRCLCAweDU4LCAweDcwLCAweEZGLCAweDQxLCAweDk4LAotICAgIDB4QzMsIDB4NzUsIDB4OEEsIDB4MzcsIDB4ODYsIDB4MTAsIDB4QUEsIDB4RDQsIDB4QUMsIDB4QzMsIDB4NEIsIDB4MzUsCi0gICAgMHg5OCwgMHhCMCwgMHhFOCwgMHg5OCwgMHhBRSwgMHgzMCwgMHgzRCwgMHg0RiwgMHhBMiwgMHg3MCwgMHhDRCwgMHg5NCwKLSAgICAweDY2LCAweDQ5LCAweEUwLCAweEI4LCAweDE2LCAweEVCLCAweEEzLCAweEYyLCAweEY0LCAweDkxLCAweEE0LCAweDBGLAotICAgIDB4QTMsIDB4NDIsIDB4Q0IsIDB4OTYsIDB4NDMsIDB4MTIsIDB4RUEsIDB4OTMsIDB4MjEsIDB4OUIsIDB4MDIsIDB4NzMsCi0gICAgMHhEOCwgMHg2OCwgMHgzOSwgMHhBOSwgMHgxRCwgMHhGQSwgMHg4RCwgMHg1NSwgMHhEMiwgMHhFMywgMHhGMSwgMHg3RCwKLSAgICAweEQxLCAweENELCAweDMzLCAweDYzLCAweDUxLCAweEZDLCAweDE1LCAweDBELCAweENCLCAweEJGLCAweEMwLCAweEU0LAotICAgIDB4M0QsIDB4NDB9OwotY29uc3QgdWludDhfdCBnX3poVFdfTG9jYWxlW10gPSB7Ci0gICAgMHg3OCwgMHg5QywgMHhFRCwgMHg1NywgMHhDRCwgMHg0RiwgMHhENCwgMHg0MCwgMHgxNCwgMHgzRiwgMHg2MywgMHhFMiwKLSAgICAweEZGLCAweDMwLCAweDY5LCAweDIwLCAweEQ1LCAweDA0LCAweEE4LCAweDFFLCAweDIxLCAweEE1LCAweEM5LCAweEM2LAotICAgIDB4NDUsIDB4MzAsIDB4NTgsIDB4NDIsIDB4RUMsIDB4NDYsIDB4MjIsIDB4MTcsIDB4MzMsIDB4REIsIDB4MEUsIDB4REIsCi0gICAgMHhDMiwgMHhCNiwgMHg0MywgMHg2NiwgMHhEQiwgMHhDMCwgMHhGNiwgMHgyNCwgMHgxMiwgMHgxNCwgMHgxNCwgMHg2MiwKLSAgICAweEEyLCAweEM0LCAweDhGLCAweDgwLCAweEUxLCAweDY0LCAweDNDLCAweDI4LCAweDg5LCAweDA3LCAweDBGLCAweDJDLAotICAgIDB4NTEsIDB4RkYsIDB4MUEsIDB4NzYsIDB4MzksIDB4RkEsIDB4MkYsIDB4MzgsIDB4RDMsIDB4MkYsIDB4RkEsIDB4QjEsCi0gICAgMHhCMywgMHhENCwgMHhDNCwgMHhBMywgMHg3QiwgMHg5QSwgMHhGNywgMHhERSwgMHhFRiwgMHhGNywgMHhFNiwgMHhCRCwKLSAgICAweERGLCAweEJDLCAweDdELCAweEQ5LCAweDk1LCAweDlCLCAweDU4LCAweDg3LCAweDRELCAweDA0LCAweDFDLCAweDY4LAotICAgIDB4QTMsIDB4MjksIDB4QzEsIDB4MzcsIDB4MUYsIDB4RDcsIDB4MTYsIDB4MDUsIDB4NjAsIDB4QTAsIDB4OTYsIDB4M0UsCi0gICAgMHgyNSwgMHg5QywgMHg5RiwgMHg5RSwgMHhGNCwgMHhERSwgMHgzRSwgMHhCRiwgMHg3MSwgMHhEMSwgMHhEOSwgMHgzQywKLSAgICAweEZGLCAweEY5LCAweEU2LCAweEY3LCAweDhGLCAweEJELCAweEVFLCAweEFCLCAweDZGLCAweEJELCAweENFLCAweEFGLAotICAgIDB4OUIsIDB4ODIsIDB4NzIsIDB4RkQsIDB4MUEsIDB4MDAsIDB4MzIsIDB4NjMsIDB4MzksIDB4MDYsIDB4MjQsIDB4NUEsCi0gICAgMHhEQiwgMHhBRSwgMHhFMywgMHg2NiwgMHgyQiwgMHg0QSwgMHhEMCwgMHgyMCwgMHhBOCwgMHg4MSwgMHg4OSwgMHgwNSwKLSAgICAweDFELCAweDg2LCAweDFBLCAweDAyLCAweEIyLCAweDhELCAweDFELCAweEQ3LCAweDlDLCAweEE3LCAweEExLCAweDE2LAotICAgIDB4QjMsIDB4ODcsIDB4NDIsIDB4NUIsIDB4MzksIDB4M0YsIDB4N0QsIDB4RDIsIDB4M0IsIDB4REEsIDB4OTEsIDB4QTUsCi0gICAgMHhEMCwgMHg0QSwgMHgwNywgMHhDRSwgMHhGNiwgMHgzOCwgMHg4MSwgMHhEMywgMHhERCwgMHhGRSwgMHg4MSwgMHhFRSwKLSAgICAweEUxLCAweDIxLCAweDJGLCAweEQ1LCAweDAxLCAweDg3LCAweEIxLCAweDdELCAweEMyLCAweEJCLCAweDYzLCAweDhCLAotICAgIDB4QzcsIDB4RjgsIDB4QzIsIDB4NjEsIDB4NzQsIDB4M0UsIDB4NzIsIDB4MTgsIDB4RkIsIDB4OUIsIDB4REMsIDB4MDAsCi0gICAgMHhCNywgMHg3OSwgMHgxNiwgMHhDQiwgMHhGNywgMHgwRiwgMHhBMiwgMHg3MywgMHgyMiwgMHg2MSwgMHg1QSwgMHg1MiwKLSAgICAweDAwLCAweEVCLCAweDc1LCAweDMyLCAweDI1LCAweERDLCAweDE2LCAweEZFLCAweDZCLCAweEZCLCAweDhGLCAweEI0LAotICAgIDB4MzUsIDB4NjAsIDB4M0IsIDB4MzUsIDB4QUMsIDB4RDQsIDB4NTIsIDB4N0EsIDB4RUYsIDB4OEYsIDB4N0IsIDB4NDcsCi0gICAgMHhDNywgMHhCRCwgMHg3NywgMHg5RiwgMHg2NCwgMHg4OSwgMHg5OSwgMHgzOSwgMHgzRiwgMHhCRCwgMHhBRiwgMHhCRiwKLSAgICAweEZGLCAweDZDLCAweDhGLCAweDgzLCAweERGLCAweEVELCAweEVCLCAweEE3LCAweDRBLCAweDczLCAweEYyLCAweDFDLAotICAgIDB4RjQsIDB4QzcsIDB4NkYsIDB4OUYsIDB4MjQsIDB4N0UsIDB4MTAsIDB4OUMsIDB4RkEsIDB4MzQsIDB4OTEsIDB4MUIsCi0gICAgMHg4RiwgMHg4MCwgMHg1RCwgMHhFOCwgMHhBMywgMHhEOCwgMHg0MSwgMHhCMSwgMHhGNiwgMHg2MiwgMHhENSwgMHhDNSwKLSAgICAweDdBLCAweDhCLCAweDk1LCAweDBFLCAweEFDLCAweEQxLCAweDQ2LCAweEM0LCAweDMyLCAweDJDLCAweDY0LCAweEE3LAotICAgIDB4NTcsIDB4NDMsIDB4RTQsIDB4QTIsIDB4RDcsIDB4QkQsIDB4RTgsIDB4RUUsIDB4QjMsIDB4ODcsIDB4OEEsIDB4MUQsCi0gICAgMHhGOSwgMHhGMCwgMHhDQiwgMHg0MiwgMHgxOCwgMHg1QywgMHg5QSwgMHhBOSwgMHg0QiwgMHgxMCwgMHg4MSwgMHhBOSwKLSAgICAweEZDLCAweEQ0LCAweEEyLCAweDM1LCAweDdELCAweEVELCAweDZFLCAweDZGLCAweDc1LCAweDc3LCAweEY3LCAweDY1LAotICAgIDB4ODksIDB4OTksIDB4MzksIDB4N0YsIDB4RTIsIDB4MDQsIDB4QzEsIDB4MjksIDB4RTYsIDB4RDIsIDB4NjUsIDB4MjcsCi0gICAgMHhFNSwgMHhCNiwgMHg1RCwgMHhFOCwgMHgzNSwgMHhBMCwgMHg4QiwgMHgxNiwgMHhBMCwgMHhFQiwgMHgyMiwgMHhFMiwKLSAgICAweDI0LCAweEQyLCAweDI3LCAweDlFLCAweDY4LCAweDIxLCAweDJFLCAweDdCLCAweENELCAweEE2LCAweEEwLCAweDNDLAotICAgIDB4QTIsIDB4MUYsIDB4QjEsIDB4REIsIDB4RjksIDB4MkUsIDB4QUEsIDB4MjIsIDB4OUQsIDB4NDEsIDB4QjEsIDB4MkEsCi0gICAgMHhEMiwgMHg4NywgMHgxMCwgMHhBNywgMHhFOSwgMHg4NywgMHhFOSwgMHg5MiwgMHg1MCwgMHg3OCwgMHgzOSwgMHg5QSwKLSAgICAweEQ4LCAweDY5LCAweDcwLCAweDcyLCAweDk0LCAweEUyLCAweERCLCAweEM4LCAweDA4LCAweEU5LCAweDkyLCAweDJBLAotICAgIDB4NTUsIDB4NEIsIDB4MzEsIDB4NUEsIDB4MjYsIDB4MjYsIDB4MkUsIDB4OUYsIDB4MDMsIDB4NDAsIDB4QzYsIDB4MTMsCi0gICAgMHhDOSwgMHhFMSwgMHg1QSwgMHg3NiwgMHg0RSwgMHg4RSwgMHg5NCwgMHgyNywgMHgyMywgMHg0NywgMHhDNSwgMHgzNCwKLSAgICAweEM1LCAweERFLCAweDg3LCAweEE3LCAweEEyLCAweEFBLCAweDhBLCAweERELCAweDlELCAweDY3LCAweEEyLCAweEE2LAotICAgIDB4ODksIDB4MTcsIDB4OUYsIDB4NUYsIDB4OEIsIDB4NjAsIDB4NDksIDB4OTYsIDB4NTIsIDB4MEMsIDB4NUUsIDB4OEEsCi0gICAgMHg1MCwgMHg4RCwgMHhGRSwgMHgyOSwgMHg0QSwgMHgyNSwgMHgwOCwgMHhFNCwgMHhBOCwgMHgwMCwgMHg3MywgMHg1MiwKLSAgICAweDU1LCAweDI3LCAweDM1LCAweEFELCAweDE0LCAweDI1LCAweEQyLCAweDIzLCAweDI0LCAweEU1LCAweDE5LCAweDRDLAotICAgIDB4OEQsIDB4NUMsIDB4RUYsIDB4RDEsIDB4NzAsIDB4RDQsIDB4QTgsIDB4MzcsIDB4OUUsIDB4OTgsIDB4MTksIDB4RTgsCi0gICAgMHhBQywgMHhBQywgMHhDRSwgMHhEQSwgMHgyRCwgMHg2RCwgMHhCQSwgMHg3QSwgMHg3NywgMHg3RCwgMHg3MSwgMHhDMywKLSAgICAweDlDLCAweEYzLCAweDk3LCAweDQyLCAweDExLCAweEQzLCAweEEwLCAweDgwLCAweEU5LCAweDc4LCAweDc2LCAweDFELAotICAgIDB4OTEsIDB4QUMsIDB4OTIsIDB4MTksIDB4NUYsIDB4NTQsIDB4MTQsIDB4RjUsIDB4RDEsIDB4OTksIDB4RDcsIDB4MDUsCi0gICAgMHhDNSwgMHgxRiwgMHhGNSwgMHhGRCwgMHg4OSwgMHg3MSwgMHhERiwgMHhGNywgMHg2NSwgMHgyOSwgMHg4MywgMHhFMywKLSAgICAweDUzLCAweDc1LCAweDhGLCAweDEwLCAweEU0LCAweEU4LCAweDZELCAweDQxLCAweDE5LCAweDBFLCAweEM5LCAweDEzLAotICAgIDB4MTMsIDB4QTUsIDB4QjksIDB4NkIsIDB4ODgsIDB4RTgsIDB4QzgsIDB4NzEsIDB4QTMsIDB4NkIsIDB4NDcsIDB4OEEsCi0gICAgMHgzQywgMHhBNiwgMHg0NywgMHhBMSwgMHg4NywgMHhBNCwgMHhBRiwgMHhDQiwgMHg1NiwgMHg4NywgMHhCMiwgMHhBRSwKLSAgICAweDI4LCAweEJELCAweDgxLCAweDc0LCAweENCLCAweDg2LCAweDc0LCAweDQ4LCAweEM2LCAweEUzLCAweDJDLCAweDYxLAotICAgIDB4OTgsIDB4NEIsIDB4NjgsIDB4MTAsIDB4RUMsIDB4QUQsIDB4NTksIDB4NkMsIDB4MjYsIDB4NDYsIDB4NEIsIDB4MzIsCi0gICAgMHg5MiwgMHgwRSwgMHg0NiwgMHg0QSwgMHgxMiwgMHg2QywgMHhDQiwgMHhGMSwgMHg1QSwgMHg4MiwgMHgzMiwgMHg1NiwKLSAgICAweDEyLCAweEVFLCAweDIzLCAweDgyLCAweDA1LCAweEU1LCAweDU2LCAweDAxLCAweDdELCAweDI5LCAweDRDLCAweEU2LAotICAgIDB4QkQsIDB4RTMsIDB4QzcsIDB4QzgsIDB4MjgsIDB4OTMsIDB4NzUsIDB4QzYsIDB4NjMsIDB4MTgsIDB4MTgsIDB4ODIsCi0gICAgMHgzMiwgMHg1RiwgMHgxQiwgMHhBNiwgMHgyQiwgMHgyOSwgMHg4MywgMHgxOCwgMHhDMCwgMHhCMiwgMHg1QSwgMHg5OCwKLSAgICAweDFELCAweDA0LCAweEE1LCAweEI2LCAweDU4LCAweEZELCAweDBCLCAweDVBLCAweEZBLCAweDIxLCAweDBBLCAweEE0LAotICAgIDB4NjAsIDB4MjcsIDB4MTYsIDB4RUEsIDB4NjYsIDB4NEIsIDB4QTAsIDB4QkQsIDB4ODYsIDB4OTYsIDB4QTEsIDB4MUUsCi0gICAgMHhBRiwgMHhFMCwgMHhEOCwgMHg4QywgMHg3MiwgMHg1NiwgMHgwQywgMHg1QywgMHg0NywgMHg0MCwgMHhBNSwgMHhBRiwKLSAgICAweDA1LCAweDM0LCAweEQ3LCAweDAwLCAweEY3LCAweDA1LCAweEE5LCAweDJGLCAweDRDLCAweDZELCAweEQzLCAweDlGLAotICAgIDB4OTAsIDB4MDYsIDB4NTgsIDB4QTAsIDB4MzIsIDB4NzIsIDB4MDAsIDB4OTYsIDB4NjMsIDB4NjEsIDB4NjcsIDB4MDAsCi0gICAgMHhFMCwgMHgwRSwgMHhGNiwgMHg4OCwgMHg4NSwgMHgwOCwgMHhCQiwgMHg4NSwgMHg4MywgMHgwOCwgMHg0QiwgMHg1OSwKLSAgICAweEIwLCAweEFFLCAweDg0LCAweENDLCAweEEyLCAweDNBLCAweDQxLCAweEVCLCAweDAzLCAweDIxLCAweDE1LCAweDAyLAotICAgIDB4RUIsIDB4RjQsIDB4OEIsIDB4MzgsIDB4MDgsIDB4NTIsIDB4MzMsIDB4QTEsIDB4QzUsIDB4MDEsIDB4Q0MsIDB4NjEsCi0gICAgMHhERiwgMHg1QiwgMHg4NSwgMHg2MCwgMHgwNiwgMHhCQiwgMHhBNiwgMHhBNSwgMHhCMywgMHg5RSwgMHhDNiwgMHgxRSwKLSAgICAweERFLCAweDAzLCAweEVBLCAweDYwLCAweDMwLCAweDE1LCAweDQwLCAweDM3LCAweDcxLCAweDBDLCAweDdFLCAweDMwLAotICAgIDB4RjAsIDB4NkEsIDB4MEQsIDB4NUYsIDB4MjEsIDB4NzcsIDB4RjQsIDB4MkEsIDB4NkQsIDB4Q0YsIDB4NjksIDB4QUMsCi0gICAgMHhFMCwgMHgwMCwgMHgxOSwgMHhERSwgMHgxRSwgMHgyQywgMHhCNiwgMHhENCwgMHg3QiwgMHhDQSwgMHg1MiwgMHhGOCwKLSAgICAweDY3LCAweDQxLCAweEY5LCAweDAzLCAweDExLCAweEMyLCAweDRBLCAweEM5fTsKLWNvbnN0IHVpbnQ4X3QgZ196aEhLX0xvY2FsZVtdID0gewotICAgIDB4NzgsIDB4OUMsIDB4QTUsIDB4NTcsIDB4NEQsIDB4NEYsIDB4MTMsIDB4NDEsIDB4MTgsIDB4M0UsIDB4NjMsIDB4RTIsCi0gICAgMHg3RiwgMHg5OCwgMHg2QywgMHgyMCwgMHgwQiwgMHgwOSwgMHg1MCwgMHg4QSwgMHg5RiwgMHgyNSwgMHhDQiwgMHgyNiwKLSAgICAweDQ0LCAweDkwLCAweDlBLCAweDVBLCAweDQzLCAweDJDLCAweEQxLCAweEM4LCAweEM1LCAweDZDLCAweDc3LCAweDg3LAotICAgIDB4RUUsIDB4NDIsIDB4NzcsIDB4ODcsIDB4NEMsIDB4QjcsIDB4QzEsIDB4NkUsIDB4M0MsIDB4ODgsIDB4MDQsIDB4QTUsCi0gICAgMHg1QSwgMHgyRSwgMHg0QSwgMHg1NCwgMHgwMiwgMHg4NiwgMHg3OCwgMHg1MCwgMHgwRiwgMHg0OCwgMHhCQywgMHg3OCwKLSAgICAweDY4LCAweDg5LCAweEM2LCAweDNGLCAweDQzLCAweDhCLCAweDlFLCAweEZDLCAweDBCLCAweENFLCAweEVDLCAweDE3LAotICAgIDB4RkIsIDB4MzUsIDB4NkQsIDB4OEQsIDB4M0QsIDB4Q0QsIDB4RkIsIDB4QkMsIDB4Q0YsIDB4RjMsIDB4Q0UsIDB4RkIsCi0gICAgMHgzRSwgMHgzMywgMHgzQiwgMHgwMSwgMHhBMSwgMHg4QywgMHg2NCwgMHhBOSwgMHgwQywgMHg4MSwgMHgyMSwgMHhFOSwKLSAgICAweDcwLCAweDlBLCAweEIzLCAweEQ0LCAweDg3LCAweEQ5LCAweDFDLCAweDA3LCAweDE0LCAweDU4LCAweDkxLCAweEE3LAotICAgIDB4QjksIDB4RDMsIDB4RTYsIDB4NzEsIDB4RTcsIDB4Q0QsIDB4RjMsIDB4RTEsIDB4QjMsIDB4RDYsIDB4QzYsIDB4RTksCi0gICAgMHg4RiwgMHhENywgMHg3RiwgMHhCRSwgMHgzNywgMHg3RSwgMHg3RiwgMHhEQSwgMHhFQiwgMHgzNCwgMHhCRiwgMHg5RSwKLSAgICAweEQ1LCAweDVCLCAweEVELCAweEVELCAweEEzLCAweDVGLCAweDFGLCAweDFBLCAweDlELCAweERELCAweDlGLCAweEVELAotICAgIDB4QzYsIDB4QzksIDB4MDgsIDB4MjcsIDB4NUUsIDB4QkMsIDB4MDAsIDB4ODAsIDB4NDAsIDB4OEIsIDB4MTgsIDB4OEEsCi0gICAgMHg4NCwgMHgwQiwgMHgzNSwgMHhCRCwgMHg4OCwgMHhDQSwgMHgxNSwgMHhCNywgMHg1RSwgMHgwOSwgMHhDMywgMHgxMiwKLSAgICAweEMyLCAweDlBLCAweDY0LCAweDUwLCAweEQ2LCAweDAwLCAweDEwLCAweDc0LCAweDY0LCAweDk4LCAweEVBLCAweDFELAotICAgIDB4OTIsIDB4QUEsIDB4RDAsIDB4NzgsIDB4QzAsIDB4ODksIDB4QzUsIDB4RDMsIDB4RTYsIDB4OTMsIDB4Q0UsIDB4QzEsCi0gICAgMHhCNiwgMHg5MCwgMHg3MiwgMHhBMiwgMHg2MCwgMHhFMiwgMHhBNCwgMHhDMSwgMHg0OCwgMHgzNCwgMHhFQiwgMHhDOSwKLSAgICAweDg5LCAweEY2LCAweEZFLCAweDNFLCAweEFCLCAweEQ0LCAweDJFLCAweDQzLCAweEIxLCAweDc1LCAweENDLCAweERBLAotICAgIDB4NjMsIDB4OTMsIDB4QTUsIDB4MzgsIDB4NjIsIDB4MjgsIDB4NUEsIDB4RUYsIDB4MTksIDB4OEEsIDB4OUQsIDB4MEQsCi0gICAgMHg2NiwgMHg4MiwgMHgzOSwgMHgzQywgMHhDRCwgMHg0NSwgMHhFNywgMHgwNywgMHhFRSwgMHhEQSwgMHhCNywgMHgzMCwKLSAgICAweDY4LCAweDI5LCAweDkwLCAweDhBLCAweDQ1LCAweDNDLCAweENELCAweEE1LCAweEI5LCAweDYwLCAweDk1LCAweDc0LAotICAgIDB4NzIsIDB4RjEsIDB4QzksIDB4NjQsIDB4RjgsIDB4NTIsIDB4MzIsIDB4N0MsIDB4MzksIDB4MTksIDB4QkUsIDB4OTIsCi0gICAgMHgwQywgMHg1RiwgMHg0RCwgMHg4NiwgMHhBRiwgMHgyNSwgMHhDMywgMHhENywgMHg5MywgMHhFMSwgMHg0QywgMHgzMiwKLSAgICAweDlDLCAweDlFLCAweDYwLCAweEUwLCAweDhDLCAweDM5LCAweEQzLCAweDkzLCAweDNELCAweDBELCAweDU0LCAweEE0LAotICAgIDB4NUEsIDB4RTAsIDB4NDYsIDB4OTIsIDB4NDgsIDB4RUMsIDB4QkMsIDB4M0IsIDB4RUMsIDB4MUMsIDB4MUMsIDB4NzYsCi0gICAgMHhERSwgMHg3RSwgMHgxNCwgMHg1MiwgMHgzNCwgMHg4QywgMHhFMCwgMHhFNCwgMHhDMCwgMHg5MiwgMHhGMSwgMHg5MywKLSAgICAweDA2LCAweDgzLCAweDVGLCAweDRGLCAweEM0LCAweEM5LCAweDU1LCAweDY1LCAweEQ0LCAweEQ5LCAweDRELCAweEU2LAotICAgIDB4NkYsIDB4MUQsIDB4RkIsIDB4MzgsIDB4QjAsIDB4NTcsIDB4MDksIDB4NDMsIDB4NDQsIDB4RUUsIDB4ODAsIDB4QUQsCi0gICAgMHg4RSwgMHhDRCwgMHgxMSwgMHg5RiwgMHgyMCwgMHhERSwgMHg3QiwgMHhCQywgMHhFQiwgMHg3OCwgMHhCRiwgMHhGMSwKLSAgICAweDRFLCAweEJCLCAweEY2LCAweEE4LCAweDQzLCAweEFDLCAweDI5LCAweDFBLCAweEQ0LCAweDgzLCAweERGLCAweEJGLAotICAgIDB4MEIsIDB4OTEsIDB4RUQsIDB4NUUsIDB4QjQsIDB4NzcsIDB4RTgsIDB4NDEsIDB4NzksIDB4NDAsIDB4MzQsIDB4RkQsCi0gICAgMHgzMiwgMHg5NiwgMHgwNiwgMHhFNywgMHg2MSwgMHg2MCwgMHgxMywgMHg4OCwgMHhBNSwgMHg0MCwgMHg3RCwgMHgxMiwKLSAgICAweDkxLCAweDlFLCAweEJFLCAweEI0LCAweEI3LCAweDM2LCAweERCLCAweEY1LCAweDFELCAweDIxLCAweDQ1LCAweEMzLAotICAgIDB4MDgsIDB4RUUsIDB4ODMsIDB4QzAsIDB4NUUsIDB4NzksIDB4NUEsIDB4RjIsIDB4QTIsIDB4QTUsIDB4MjIsIDB4NEYsCi0gICAgMHg5QSwgMHg4MywgMHgyQSwgMHg5MiwgMHgwOSwgMHgxNywgMHgyNCwgMHhEMywgMHg4NCwgMHhEOCwgMHhGMCwgMHhBRCwKLSAgICAweEY3LCAweDExLCAweEY3LCAweEQ1LCAweDVCLCAweEFFLCAweDk2LCAweENCLCAweDlDLCAweEY4LCAweDgwLCAweEZDLAotICAgIDB4RjgsIDB4NzYsIDB4RUIsIDB4MUIsIDB4OUYsIDB4RTcsIDB4QzksIDB4MUQsIDB4RTQsIDB4NjcsIDB4NzksIDB4NzIsCi0gICAgMHgxMCwgMHgzQywgMHg5OCwgMHgyMywgMHgzRiwgMHg2QSwgMHg4QywgMHhBRiwgMHg2MSwgMHgxNSwgMHgyOSwgMHgyMywKLSAgICAweEEzLCAweEM0LCAweDI4LCAweEQyLCAweDk3LCAweDVFLCAweDg3LCAweENBLCAweEZGLCAweEM4LCAweDJCLCAweDJBLAotICAgIDB4QzIsIDB4MjYsIDB4MkQsIDB4RDAsIDB4NTMsIDB4MEUsIDB4NDAsIDB4MDgsIDB4NzEsIDB4N0QsIDB4MzIsIDB4MzUsCi0gICAgMHgzRCwgMHhFMiwgMHg1MywgMHgwMCwgMHgwOSwgMHhGOSwgMHgzNCwgMHhBMywgMHhBQSwgMHg3QywgMHg2NywgMHhFRiwKLSAgICAweDI5LCAweDlGLCAweENGLCAweEYzLCAweEVELCAweEVELCAweDY3LCAweDdDLCAweEExLCAweEMwLCAweDlGLCAweDdELAotICAgIDB4N0UsIDB4QzUsIDB4ODMsIDB4MjUsIDB4MjEsIDB4MTUsIDB4NTAsIDB4QjAsIDB4NEEsIDB4MzgsIDB4MkUsIDB4MjUsCi0gICAgMHg5NywgMHhFOCwgMHhBQiwgMHg4MCwgMHg2RCwgMHgxMywgMHhEMSwgMHg0RiwgMHhFNSwgMHhGMywgMHg1MywgMHg4NSwKLSAgICAweDQyLCAweDVGLCAweDEyLCAweEQ3LCAweDlBLCAweDE5LCAweEFBLCAweDg5LCAweDBBLCAweEE4LCAweDE5LCAweDkxLAotICAgIDB4RDEsIDB4REQsIDB4NEIsIDB4QjMsIDB4NDgsIDB4NTAsIDB4RUYsIDB4MjYsIDB4Q0QsIDB4NEIsIDB4QzYsIDB4Q0EsCi0gICAgMHg2QSwgMHg1NiwgMHhBRiwgMHgxNCwgMHhFNiwgMHg2NiwgMHg2RiwgMHhBRSwgMHhERiwgMHg3RiwgMHhBNCwgMHhFNiwKLSAgICAweEFDLCAweDI1LCAweEM3LCAweEMzLCAweDIwLCAweEM5LCAweDU2LCAweDFBLCAweDU1LCAweEJELCAweDA4LCAweDcxLAotICAgIDB4RDgsIDB4QzgsIDB4MTAsIDB4RTYsIDB4RjYsIDB4NDQsIDB4MzAsIDB4RjIsIDB4MkQsIDB4QzgsIDB4OUMsIDB4NjgsCi0gICAgMHg4RCwgMHg1QSwgMHg1NiwgMHg2NiwgMHhEQywgMHhCMiwgMHgyQywgMHgyMSwgMHgxNSwgMHhFMiwgMHhCMSwgMHhBNSwKLSAgICAweDcyLCAweDE1LCAweDYzLCAweDY4LCAweEM4LCAweDM1LCAweDRFLCAweDFDLCAweDc0LCAweEM0LCAweDk5LCAweENDLAotICAgIDB4RTMsIDB4NjEsIDB4N0YsIDB4MzksIDB4RDIsIDB4NzcsIDB4OUQsIDB4MzUsIDB4ODgsIDB4NjUsIDB4NjgsIDB4OTgsCi0gICAgMHg2RSwgMHgwQiwgMHg0MywgMHg3MSwgMHgxRCwgMHhGNSwgMHgyNiwgMHgzNiwgMHg4RiwgMHgzRiwgMHhFMywgMHhGOSwKLSAgICAweEQ4LCAweDAzLCAweDYxLCAweEM4LCAweDJELCAweEFGLCAweDQwLCAweDU5LCAweEQzLCAweDI1LCAweDcyLCAweDVGLAotICAgIDB4QzYsIDB4QkQsIDB4MkEsIDB4NEUsIDB4OUEsIDB4MjksIDB4MjgsIDB4NjEsIDB4NTQsIDB4NUQsIDB4RDMsIDB4RTgsCi0gICAgMHhGNSwgMHgxOCwgMHhFRCwgMHg1MywgMHhFMSwgMHg0RiwgMHgzMCwgMHhENCwgMHhBNywgMHg0MCwgMHhENywgMHg4QywKLSAgICAweDZBLCAweDg1LCAweDEzLCAweEM3LCAweEZBLCAweEE0LCAweDVCLCAweDEwLCAweDIzLCAweDRFLCAweDlDLCAweDg4LAotICAgIDB4QjEsIDB4Q0YsIDB4OEQsIDB4MDksIDB4OUQsIDB4QkQsIDB4NzcsIDB4MzAsIDB4MjEsIDB4NjcsIDB4QzIsIDB4QTAsCi0gICAgMHg3NywgMHgyMywgMHhFRCwgMHg4MCwgMHgxMywgMHhCMywgMHhCOSwgMHg0MSwgMHhGMiwgMHg2QywgMHg4NSwgMHgxOCwKLSAgICAweDVELCAweDU0LCAweDVBLCAweDA1LCAweEQxLCAweDA1LCAweDk1LCAweENELCAweEZFLCAweDgzLCAweDJDLCAweDc4LAotICAgIDB4MTAsIDB4MzEsIDB4OTEsIDB4RkQsIDB4NkUsIDB4QzYsIDB4RkEsIDB4QTYsIDB4RUYsIDB4NDEsIDB4NkQsIDB4MEQsCi0gICAgMHgyRSwgMHg0QiwgMHhCMiwgMHhGNywgMHg0QywgMHg3QiwgMHhBMSwgMHg1QiwgMHg3MywgMHg0NiwgMHg0MSwgMHg0NSwKLSAgICAweDA4LCAweEYyLCAweEU0LCAweEI0LCAweDQwLCAweEMxLCAweDU0LCAweEMwLCAweDZELCAweDJFLCAweDk1LCAweDQ4LAotICAgIDB4Q0IsIDB4RDcsIDB4QzgsIDB4REYsIDB4OTIsIDB4MEEsIDB4NTgsIDB4MjAsIDB4MzYsIDB4MzIsIDB4MDgsIDB4OUEsCi0gICAgMHhBMSwgMHgyMSwgMHhBMywgMHgwQiwgMHhFMSwgMHgwNiwgMHhBQSwgMHg2MiwgMHgwRCwgMHg2MiwgMHhCQSwgMHgwQiwKLSAgICAweDgzLCAweEUxLCAweEI0LCAweEIyLCAweEEwLCAweEY1LCAweEE0LCAweDY0LCAweDYxLCAweDExLCAweEMzLCAweEY1LAotICAgIDB4QUUsIDB4OTQsIDB4MTksIDB4MkMsIDB4MTUsIDB4QzksIDB4NDcsIDB4RDksIDB4OEQsIDB4QjIsIDB4QTgsIDB4NEEsCi0gICAgMHgxQSwgMHg4MywgMHg5MCwgMHg0MywgMHg1NiwgMHg3NSwgMHg1NSwgMHgwMiwgMHhGMywgMHhDOCwgMHg1NCwgMHgzNSwKLSAgICAweDk5LCAweENFLCAweDM0LCAweDc2LCAweEVGLCAweDE2LCAweEM4LCAweDc3LCAweDI3LCAweDEzLCAweDAzLCAweDY0LAotICAgIDB4MTUsIDB4NzksIDB4RTQsIDB4QkIsIDB4NUQsIDB4QjcsIDB4MkUsIDB4QTAsIDB4MUUsIDB4NzYsIDB4QkIsIDB4QTcsCi0gICAgMHg1MiwgMHhBQiwgMHgxQSwgMHhBNSwgMHgxNSwgMHg2NCwgMHgzMywgMHg5RCwgMHhERCwgMHhFRCwgMHg0NywgMHgyRSwKLSAgICAweDcwLCAweDlFLCAweDQyLCAweENBLCAweEY5LCAweDI3LCAweDQyLCAweEZDLCAweDBCLCAweEQ5LCAweDBFLCAweDRCLAotICAgIDB4RUR9OwotY29uc3QgdWludDhfdCBnX2phSlBfTG9jYWxlW10gPSB7Ci0gICAgMHg3OCwgMHg5QywgMHhFRCwgMHg1NiwgMHhDQiwgMHg2RSwgMHhEMywgMHg0MCwgMHgxNCwgMHg1RCwgMHgxNywgMHg4OSwKLSAgICAweDdGLCAweDE4LCAweDU5LCAweDIwLCAweDgzLCAweEQ0LCAweEQ2LCAweDBELCAweEVGLCAweDU2LCAweEFFLCAweEE1LAotICAgIDB4OEEsIDB4OTYsIDB4ODYsIDB4MTYsIDB4QTMsIDB4MDgsIDB4NTcsIDB4QTAsIDB4NzYsIDB4ODMsIDB4MjYsIDB4RjYsCi0gICAgMHgzNCwgMHg5OSwgMHgzNiwgMHg5RSwgMHhBOSwgMHgyNiwgMHhCNiwgMHg0QSwgMHhCQywgMHhFMiwgMHgyMSwgMHgyMCwKLSAgICAweDQ4LCAweDc0LCAweDAxLCAweDFCLCAweDA0LCAweDQ0LCAweDYyLCAweDU1LCAweDQwLCAweDAyLCAweDA0LCAweDhCLAotICAgIDB4NkUsIDB4RDgsIDB4RDAsIDB4QUYsIDB4NDksIDB4NUEsIDB4NTYsIDB4RkMsIDB4MDIsIDB4MzMsIDB4N0UsIDB4QzUsCi0gICAgMHg4RSwgMHhFRCwgMHhFMCwgMHhFRSwgMHhGMSwgMHgyMiwgMHg5OSwgMHg3QiwgMHg3QywgMHhDRSwgMHhGNSwgMHhCRCwKLSAgICAweEU3LCAweDhFLCAweDQ3LCAweDU2LCAweDVCLCAweEQ0LCAweDg0LCAweDJELCAweDA0LCAweDA4LCAweEI0LCAweEQxLAotICAgIDB4QkMsIDB4QjQsIDB4MDUsIDB4RUYsIDB4QUYsIDB4RDQsIDB4MjQsIDB4NjAsIDB4QTEsIDB4QjYsIDB4MzksIDB4MkYsCi0gICAgMHgwRCwgMHhERSwgMHhFQywgMHgxRiwgMHg3RiwgMHhGRiwgMHg3NiwgMHg4RSwgMHhGRiwgMHgwRCwgMHg3QSwgMHg1RiwKLSAgICAweENGLCAweDRCLCAweERBLCAweEU5LCAweDUzLCAweDAwLCAweEE4LCAweDgyLCAweDRDLCAweDJDLCAweEM4LCAweDhDLAotICAgIDB4OEUsIDB4NUQsIDB4QTcsIDB4QUQsIDB4NzYsIDB4QTgsIDB4NkIsIDB4MzAsIDB4RDQsIDB4QTAsIDB4MEMsIDB4NDMsCi0gICAgMHgyMiwgMHg1OCwgMHgxMywgMHg0MCwgMHhCNSwgMHgyOSwgMHg3MSwgMHg5QSwgMHhCNywgMHhGOSwgMHhBRCwgMHhCNiwKLSAgICAweDg4LCAweDI3LCAweDgyLCAweDU4LCAweEFCLCAweDBDLCAweDdBLCAweDVELCAweDU1LCAweDA5LCAweEQ2LCAweDA5LAotICAgIDB4RjgsIDB4NDIsIDB4M0UsIDB4N0MsIDB4MzEsIDB4MUYsIDB4QkUsIDB4OTQsIDB4MEYsIDB4NUYsIDB4Q0UsIDB4ODcsCi0gICAgMHhBRiwgMHhFNCwgMHhDMywgMHg1NywgMHhGMywgMHhFMSwgMHg2QiwgMHhGOSwgMHhGMCwgMHg2QywgMHgzRSwgMHg1QywKLSAgICAweDk5LCAweDI5LCAweEMwLCAweDBCLCAweEZBLCAweEFDLCAweDhDLCAweDM0LCAweDBBLCAweEMyLCAweDc1LCAweEVDLAotICAgIDB4NTMsIDB4RDIsIDB4MzcsIDB4MDAsIDB4RUIsIDB4NzUsIDB4MzYsIDB4MkYsIDB4NTUsIDB4QTQsIDB4RkYsIDB4MDYsCi0gICAgMHg5RSwgMHhDNCwgMHg0MCwgMHgwQiwgMHg3NiwgMHgxMiwgMHhEQiwgMHg4RSwgMHg0NywgMHg5QSwgMHhEOCwgMHhCRSwKLSAgICAweEVGLCAweDdCLCAweEZDLCAweDU3LCAweDU1LCAweDQ0LCAweDM4LCAweEM0LCAweDdCLCAweERELCAweDVDLCAweEZDLAotICAgIDB4RTgsIDB4RDEsIDB4OTcsIDB4N0MsIDB4RkUsIDB4OEYsIDB4ODMsIDB4ODIsIDB4M0MsIDB4OUYsIDB4NzMsIDB4RjEsCi0gICAgMHhERiwgMHhDRiwgMHg1RiwgMHhFNSwgMHhFMiwgMHhGRCwgMHhERSwgMHg4NywgMHgxMSwgMHgxQywgMHhGOCwgMHhBQiwKLSAgICAweDlDLCAweDI2LCAweDQ2LCAweEY2LCAweDQwLCAweEQ4LCAweDRELCAweEI2LCAweDhGLCAweDZDLCAweDA3LCAweEQ5LAotICAgIDB4REEsIDB4QjMsIDB4NTUsIDB4NjcsIDB4RUIsIDB4Q0QsIDB4NTYsIDB4NUEsIDB4NUMsIDB4QTMsIDB4OEQsIDB4MTgsCi0gICAgMHhCNiwgMHgzMCwgMHhCMiwgMHg5MywgMHgyRiwgMHg3OSwgMHgwOCwgMHg2OSwgMHhGRCwgMHhCRCwgMHg2RSwgMHhGRiwKLSAgICAweEM1LCAweDFFLCAweDFGLCAweDRFLCAweDA0LCAweDY0LCAweDZGLCAweEZGLCAweDdBLCAweDk5LCAweEJFLCAweDBELAotICAgIDB4ODYsIDB4NjEsIDB4RTIsIDB4MjEsIDB4ODgsIDB4QzEsIDB4NDQsIDB4N0UsIDB4MUUsIDB4NjksIDB4NDcsIDB4MDcsCi0gICAgMHgwRiwgMHhGQiwgMHg0RiwgMHg5RiwgMHhGOCwgMHhEOSwgMHg0NSwgMHgxOCwgMHhFMywgMHhDNywgMHhGQiwgMHg4NywKLSAgICAweDgzLCAweDc3LCAweDFGLCAweDYzLCAweDEwLCAweEY4LCAweEFCLCAweDQ4LCAweENCLCAweDhGLCAweDJELCAweDY1LAotICAgIDB4RTQsIDB4REMsIDB4MEEsIDB4NTAsIDB4MEIsIDB4M0EsIDB4QTgsIDB4MDYsIDB4MUQsIDB4MDcsIDB4MzEsIDB4MTIsCi0gICAgMHg1QiwgMHgxRiwgMHgyMywgMHhFMSwgMHhEMSwgMHhCNiwgMHhFOSwgMHhCNiwgMHg1QSwgMHg5MiwgMHhCNiwgMHhDRSwKLSAgICAweDJGLCAweEI5LCAweEZGLCAweEYzLCAweDQwLCAweEQ2LCAweDY1LCAweDZFLCAweEI4LCAweEJDLCAweDI4LCAweEYzLAotICAgIDB4NDEsIDB4QzgsIDB4NEIsIDB4RkMsIDB4MTIsIDB4QkUsIDB4QzQsIDB4OTIsIDB4QTIsIDB4MUMsIDB4MkQsIDB4NEEsCi0gICAgMHgxQSwgMHgwNSwgMHgzOSwgMHg0QSwgMHhFOSwgMHg2RCwgMHg2NCwgMHgwNSwgMHg3MiwgMHg0NSwgMHhENywgMHg5NSwKLSAgICAweEM1LCAweEM1LCAweDUyLCAweDlBLCAweDc2LCAweDkzLCAweDMyLCAweDQ3LCAweEE4LCAweEYyLCAweDM1LCAweDAwLAotICAgIDB4QTQsIDB4OTAsIDB4RDAsIDB4MTAsIDB4MDcsIDB4REIsIDB4MjMsIDB4ODYsIDB4MjQsIDB4OTAsIDB4OTQsIDB4MjEsCi0gICAgMHg1NSwgMHg3OSwgMHhGMCwgMHhGNiwgMHhCMSwgMHhBQywgMHhFQiwgMHg3MiwgMHhCRiwgMHhGQiwgMHg0QywgMHgzNiwKLSAgICAweDBDLCAweEY5LCAweEU4LCAweEQzLCAweDZCLCAweDc5LCAweDQzLCAweDU1LCAweDEyLCAweEY0LCAweDIyLCAweDdELAotICAgIDB4NjAsIDB4NDYsIDB4NzUsIDB4NEUsIDB4RDcsIDB4RTcsIDB4MEMsIDB4NjMsIDB4QUUsIDB4OUMsIDB4QzYsIDB4MzcsCi0gICAgMHgyMCwgMHg5NCwgMHg5NCwgMHgxMiwgMHg4NCwgMHhERCwgMHgwQiwgMHhDOSwgMHgyOCwgMHg1RiwgMHg3NCwgMHgzRSwKLSAgICAweEQyLCAweDY3LCAweEI4LCAweDE1LCAweEQ2LCAweDM4LCAweDFBLCAweEVELCAweDhGLCAweDY1LCAweDQ4LCAweEI2LAotICAgIDB4QjYsIDB4QUIsIDB4NzYsIDB4REIsIDB4NTgsIDB4NUEsIDB4QkMsIDB4QjEsIDB4N0IsIDB4RUYsIDB4NDEsIDB4NzMsCi0gICAgMHhENSwgMHhEQiwgMHgwOCwgMHgwQywgMHg0QiwgMHg5MiwgMHg3QywgMHgyNSwgMHg3MSwgMHhFRCwgMHgzQSwgMHg2MiwKLSAgICAweDY5LCAweEQ3LCAweDUyLCAweDU4LCAweDU4LCAweDEyLCAweEM3LCAweEY4LCAweDBFLCAweDM3LCAweDI1LCAweENELAotICAgIDB4OUIsIDB4RjQsIDB4QkMsIDB4RDksIDB4NjksIDB4Q0YsIDB4RjMsIDB4NTQsIDB4MjUsIDB4QzUsIDB4MkIsIDB4OTYsCi0gICAgMHg5QSwgMHgyRSwgMHg2MywgMHg4OCwgMHg5OCwgMHgxRCwgMHg0OSwgMHgzQiwgMHhFMywgMHg4QiwgMHg0QiwgMHgwQiwKLSAgICAweDc3LCAweDEwLCAweDMzLCAweDExLCAweDcxLCAweEMyLCAweDY3LCAweDlFLCAweENELCAweEVBLCAweDg0LCAweDE5LAotICAgIDB4OTksIDB4MDYsIDB4RTIsIDB4QTYsIDB4ODYsIDB4N0QsIDB4NEUsIDB4QTQsIDB4QTEsIDB4MzAsIDB4QkQsIDB4ODUsCi0gICAgMHg0QywgMHg2QywgMHg0MywgMHhCRSwgMHgxQiwgMHhBNiwgMHhBMywgMHgyQywgMHhDMSwgMHhFRCwgMHg0MiwgMHg0MSwKLSAgICAweDgzLCAweDUxLCAweDc3LCAweDA3LCAweDhCLCAweEY5LCAweDRGLCAweDk2LCAweDU0LCAweEM0LCAweDFELCAweDlDLAotICAgIDB4MkQsIDB4MjksIDB4QjAsIDB4MzEsIDB4NzEsIDB4REIsIDB4OTIsIDB4MzYsIDB4NTUsIDB4OTIsIDB4RUUsIDB4MjEsCi0gICAgMHg0NiwgMHgyNSwgMHg2RCwgMHgyNiwgMHhDMywgMHgxRSwgMHgxQSwgMHg5MywgMHgxQSwgMHg3NiwgMHgzNCwgMHg4OSwKLSAgICAweDk0LCAweDMzLCAweDY5LCAweDMwLCAweERBLCAweDgxLCAweDdFLCAweDIwLCAweDY5LCAweDdGLCAweDBFLCAweEY5LAotICAgIDB4ODksIDB4OUQsIDB4NjYsIDB4OEMsIDB4NTEsIDB4RTEsIDB4MzYsIDB4MTUsIDB4MEIsIDB4NDksIDB4NUIsIDB4QTksCi0gICAgMHhBRCwgMHg5RiwgMHg0MCwgMHg5NiwgMHgxQywgMHg0NCwgMHg0NiwgMHhFNCwgMHgxRiwgMHg3RiwgMHg5OSwgMHhCQSwKLSAgICAweEM1LCAweERCLCAweERFLCAweEQ5LCAweDQxLCAweDlCLCAweEQwLCAweDhDLCAweDRFLCAweERCLCAweDI4LCAweDBDLAotICAgIDB4NzMsIDB4QUUsIDB4NTIsIDB4Q0YsIDB4REQsIDB4ODYsIDB4NjAsIDB4OTksIDB4M0EsIDB4NEQsIDB4NkMsIDB4ODIsCi0gICAgMHgxQSwgMHhBMywgMHg1MywgMHg3NywgMHg2RiwgMHgwMiwgMHg1RCwgMHg1MiwgMHhDNiwgMHg5MSwgMHg3NSwgMHg0QywKLSAgICAweENDLCAweDI2LCAweDhELCAweEM4LCAweDc3LCAweDBBLCAweEM4LCAweDdBLCAweDg3LCAweDdGLCAweDJBLCAweDVBLAotICAgIDB4ODIsIDB4NTUsIDB4NDQsIDB4QzAsIDB4MDQsIDB4NTMsIDB4MzIsIDB4ODYsIDB4NzAsIDB4OUQsIDB4QkEsIDB4MEMsCi0gICAgMHgyMywgMHgwNiwgMHgwQywgMHhDNywgMHgyQSwgMHg2MCwgMHgyQywgMHg1OCwgMHhCNCwgMHg4RSwgMHg0MCwgMHgwRCwKLSAgICAweEZGLCAweDkzLCAweDUyLCAweDQ1LCAweDc1LCAweDg2LCAweDc2LCAweEM3LCAweDUyLCAweDE2LCAweDE4LCAweEFDLAotICAgIDB4RjMsIDB4MTcsIDB4NzcsIDB4MUMsIDB4NjUsIDB4QUQsIDB4MDksIDB4RjEsIDB4NTgsIDB4MDIsIDB4NkYsIDB4QTksCi0gICAgMHgyMSwgMHg2QSwgMHgwMSwgMHhCNywgMHhDNiwgMHhEMiwgMHgwQywgMHg1QSwgMHg4QSwgMHhBNiwgMHg3NywgMHg1QywKLSAgICAweEQyLCAweEQ4LCAweEEyLCAweDNFLCAweDMzLCAweDE4LCAweDg5LCAweDdGLCAweEFBLCAweDI1LCAweEU2LCAweEE5LAotICAgIDB4MkEsIDB4QzEsIDB4ODcsIDB4QkQsIDB4RjYsIDB4MTcsIDB4NkMsIDB4NDIsIDB4MDgsIDB4MjF9OwotY29uc3QgdWludDhfdCBnX2tvS1JfTG9jYWxlW10gPSB7Ci0gICAgMHg3OCwgMHg5QywgMHhFRCwgMHg1NiwgMHg0RCwgMHg2QiwgMHhENCwgMHg0MCwgMHgxOCwgMHgzRSwgMHg1NywgMHhGMCwKLSAgICAweDNGLCAweDBDLCAweEMxLCAweDEyLCAweDg1LCAweDc2LCAweEI3LCAweEVCLCAweDc3LCAweDRCLCAweDFBLCAweDI4LAotICAgIDB4NkUsIDB4NkQsIDB4NjUsIDB4OEQsIDB4OTQsIDB4QTYsIDB4NTgsIDB4RUMsIDB4NDUsIDB4NjYsIDB4OTMsIDB4RTksCi0gICAgMHgyNiwgMHhFRCwgMHgyNiwgMHg1MywgMHgyNiwgMHgwOSwgMHg3NSwgMHg3MywgMHhBRSwgMHg1MiwgMHhGMCwgMHhFMiwKLSAgICAweEExLCAweDg3LCAweEVBLCAweDZFLCAweEIxLCAweDA3LCAweDExLCAweDJBLCAweDg4LCAweDIyLCAweDIyLCAweDFFLAotICAgIDB4MTQsIDB4N0YsIDB4OEQsIDB4NjIsIDB4NkQsIDB4OEEsIDB4N0YsIDB4QzEsIDB4QzksIDB4RTcsIDB4RTYsIDB4NjMsCi0gICAgMHhCMiwgMHg0RCwgMHhFRiwgMHhFRSwgMHg2MSwgMHg5OSwgMHhGNywgMHg5OSwgMHhFNywgMHg3OSwgMHhGMywgMHhCRSwKLSAgICAweENGLCAweDRDLCAweDVFLCAweDIyLCAweDc0LCAweEIxLCAweDAyLCAweEJCLCAweDA4LCAweDk4LCAweEQwLCAweDQwLAotICAgIDB4QjMsIDB4REMsIDB4MjYsIDB4N0UsIDB4REMsIDB4NUEsIDB4RTYsIDB4ODAsIDB4OEEsIDB4MkMsIDB4NjUsIDB4OTYsCi0gICAgMHhGQiwgMHgzNSwgMHgzOCwgMHgzOCwgMHhGRSwgMHgzNCwgMHhGOCwgMHhGRCwgMHhFMSwgMHhGRCwgMHhFNSwgMHhFMywKLSAgICAweEQ3LCAweDQ3LCAweDNGLCAweEZCLCAweERGLCAweEFGLCAweDcwLCAweEUyLCAweEM1LCAweDBCLCAweDAwLCAweDA4LAotICAgIDB4M0UsIDB4REYsIDB4NTQsIDB4MjEsIDB4OTEsIDB4N0IsIDB4NDYsIDB4MUIsIDB4NzcsIDB4QUQsIDB4NDgsIDB4REEsCi0gICAgMHgyMSwgMHhBOCwgMHg4MywgMHg4OSwgMHgwRSwgMHg0RCwgMHg5RiwgMHgzNSwgMHgwNiwgMHgwNCwgMHgwMywgMHg5QiwKLSAgICAweEI2LCAweEY2LCAweDgwLCAweDZFLCAweDU5LCAweDdFLCAweDNDLCAweDE2LCAweEM2LCAweDYyLCAweEMzLCAweEVCLAotICAgIDB4RUYsIDB4MDksIDB4RjUsIDB4NzAsIDB4OUQsIDB4ODIsIDB4QUYsIDB4QjIsIDB4RTEsIDB4NkIsIDB4NkMsIDB4RjgsCi0gICAgMHgzQSwgMHgxQiwgMHhCRSwgMHhDMSwgMHg4NiwgMHg2RiwgMHhCMiwgMHhFMSwgMHg1QiwgMHg2QywgMHhGOCwgMHgzNiwKLSAgICAweDFCLCAweDlFLCAweDY2LCAweEMzLCAweDhELCAweEE5LCAweDEyLCAweEJDLCAweEE0LCAweENGLCAweDQ2LCAweEFFLAotICAgIDB4NTEsIDB4MTAsIDB4QUQsIDB4MTMsIDB4OUYsIDB4RDIsIDB4QkUsIDB4MDEsIDB4RDgsIDB4NkUsIDB4OTMsIDB4NTksCi0gICAgMHhBRSwgMHhDMSwgMHhGRCwgMHgzNywgMHhGMCwgMHgzQywgMHgwNiwgMHhBQSwgMHhCMCwgMHg5NywgMHhCQSwgMHg3NiwKLSAgICAweDM0LCAweDEyLCAweEJELCAweDgzLCAweDZGLCAweERFLCAweEFCLCAweDNELCAweEZBLCAweDJGLCAweEQ0LCAweEZELAotICAgIDB4NzAsIDB4ODgsIDB4RjcsIDB4RjcsIDB4OTgsIDB4RjgsIDB4RTksIDB4NEIsIDB4MzYsIDB4RUUsIDB4RUQsIDB4RUUsCi0gICAgMHgzMywgMHhGMSwgMHg5MywgMHg3NywgMHg0NywgMHg0QywgMHhGQywgMHhDRiwgMHhENywgMHg1RCwgMHg3NiwgMHhGRSwKLSAgICAweDY3LCAweDg3LCAweDM5LCAweDFDLCAweDA0LCAweDJCLCAweDQ2LCAweDEzLCAweEI5LCAweDNCLCAweDEwLCAweDc1LAotICAgIDB4NTMsIDB4RUMsIDB4QTMsIDB4RDgsIDB4NDEsIDB4QjEsIDB4RjYsIDB4NjIsIDB4RDUsIDB4QzUsIDB4N0EsIDB4OEIsCi0gICAgMHg5NSwgMHg5NiwgMHhENywgMHg2OCwgMHgyMCwgMHhBMiwgMHhBQiwgMHgzQSwgMHgzMiwgMHhEMiwgMHgyRiwgMHg3OSwKLSAgICAweDA0LCAweDg5LCAweERFLCAweEZFLCAweDFCLCAweEVGLCAweDcwLCAweDg3LCAweDFFLCAweDRFLCAweDBDLCAweDE0LAotICAgIDB4QjYsIDB4NEYsIDB4RkIsIDB4QjksIDB4NkQsIDB4MzAsIDB4MEMsIDB4NTMsIDB4MEYsIDB4NDEsIDB4MDQsIDB4QTYsCi0gICAgMHhGMiwgMHhEMywgMHg4OCwgMHg1NiwgMHhGOSwgMHhEMSwgMHhFQiwgMHhCRiwgMHgwOCwgMHhCMiwgMHhGQiwgMHg2MSwKLSAgICAweDgyLCAweDdCLCAweDNCLCAweDAzLCAweEJBLCAweDk1LCAweDgwLCAweDIwLCAweDU4LCAweEM1LCAweDVBLCAweDNBLAotICAgIDB4QjYsIDB4RUEsIDB4QjksIDB4QjksIDB4MTUsIDB4QTIsIDB4MkEsIDB4QjQsIDB4RDEsIDB4MTIsIDB4QjQsIDB4NkQsCi0gICAgMHg0NCwgMHhDQywgMHhDNCwgMHhGQSwgMHgwNCwgMHg4OSwgMHg0NiwgMHhEQiwgMHhCQSwgMHhEMywgMHhFRCwgMHg3MiwKLSAgICAweEUyLCAweDIzLCAweEZBLCAweEUzLCAweDRGLCAweDlFLCAweEVFLCAweEYwLCAweDQwLCAweEUyLCAweEE5LCAweEUzLAotICAgIDB4M0MsIDB4NjgsIDB4RjIsIDB4RjQsIDB4MjgsIDB4NzgsIDB4MzAsIDB4NEYsIDB4N0YsIDB4QkUsIDB4MzUsIDB4ODksCi0gICAgMHhBQSwgMHgyQywgMHg0RCwgMHgxNywgMHg5QiwgMHg5RCwgMHhEMiwgMHgzNCwgMHg5NSwgMHgzMiwgMHgxOCwgMHg0OCwKLSAgICAweDBELCAweDEzLCAweEQ0LCAweDgwLCAweDI0LCAweEQ1LCAweDQwLCAweEIzLCAweDU5LCAweDQ5LCAweDY1LCAweDY5LAotICAgIDB4OTgsIDB4RDgsIDB4QkUsIDB4QUUsIDB4NEMsIDB4MDUsIDB4NDAsIDB4MDYsIDB4ODksIDB4OUMsIDB4QjEsIDB4NzUsCi0gICAgMHgyMywgMHhFNywgMHg0QywgMHgwQSwgMHhDOSwgMHgzOCwgMHgzMywgMHgwNywgMHgzNCwgMHg4RCwgMHhGNywgMHg5RSwKLSAgICAweDBGLCAweDY4LCAweDRCLCAweDEyLCAweDdGLCAweEYyLCAweDg1LCAweEI2LCAweDI2LCAweENCLCAweEJDLCAweEY3LAotICAgIDB4NzksIDB4OTcsIDB4MDcsIDB4NkIsIDB4NDIsIDB4M0QsIDB4MjUsIDB4MkEsIDB4Q0IsIDB4MTIsIDB4MUEsIDB4NTMsCi0gICAgMHg5QSwgMHhBNSwgMHg1MiwgMHg4RSwgMHhDMCwgMHgxQSwgMHg5QSwgMHg2MiwgMHg0NiwgMHg5MiwgMHg2NiwgMHg2NCwKLSAgICAweEI5LCAweDkyLCAweDI0LCAweEYyLCAweDI1LCAweDE0LCAweEU1LCAweDE1LCAweEJFLCAweDI3LCAweDM5LCAweDA3LAotICAgIDB4QTIsIDB4REIsIDB4QjIsIDB4NDIsIDB4RDEsIDB4RjgsIDB4MEEsIDB4MkQsIDB4NDAsIDB4NzMsIDB4NjMsIDB4NzMsCi0gICAgMHhEMSwgMHhCMCwgMHhFNCwgMHhGOSwgMHhFNiwgMHhERCwgMHhFRCwgMHhENSwgMHgyNywgMHg1QSwgMHhDQiwgMHg1RCwKLSAgICAweDBCLCAweEFELCAweDRDLCAweDkzLCAweDAyLCAweEE1LCAweEU5LCAweDE4LCAweDZELCAweDQ0LCAweEIyLCAweDdFLAotICAgIDB4NjYsIDB4QjAsIDB4QTgsIDB4MjgsIDB4OEEsIDB4RDEsIDB4OTcsIDB4NDAsIDB4RTEsIDB4NDQsIDB4NzcsIDB4QzIsCi0gICAgMHg3NSwgMHhBNywgMHg2QiwgMHhBRSwgMHhFQiwgMHgwQSwgMHhGNSwgMHgwQywgMHhBRiwgMHg1QywgMHhBQSwgMHgzOCwKLSAgICAweDg0LCAweDIwLCAweDUzLCAweEU5LCAweDcxLCAweEUyLCAweEE1LCAweDQwLCAweDVDLCAweDU5LCAweEI4LCAweDg1LAotICAgIDB4ODgsIDB4ODIsIDB4NEMsIDB4M0IsIDB4N0EsIDB4RTYsIDB4NzgsIDB4NTEsIDB4RTcsIDB4OUIsIDB4NTEsIDB4NjgsCi0gICAgMHgyMCwgMHg2OSwgMHg2QSwgMHhEOCwgMHhFNywgMHg1OCwgMHgxNiwgMHg4QSwgMHhEMiwgMHhBQiwgMHg0OCwgMHhEMSwKLSAgICAweDBELCAweDQ4LCAweEVGLCAweDQ5LCAweDJELCAweENFLCAweDEyLCAweDZFLCAweDk3LCAweDBBLCAweDNBLCAweDA0LAotICAgIDB4M0IsIDB4NUIsIDB4QkEsIDB4N0YsIDB4MjcsIDB4MjYsIDB4MkEsIDB4MkEsIDB4OTIsIDB4MEUsIDB4QzYsIDB4MkIsCi0gICAgMHgwQSwgMHgwQywgMHhERCwgMHg3NCwgMHgyQywgMHg0RSwgMHg5QywgMHhBQywgMHg0OCwgMHg3NywgMHgxMSwgMHhDMSwKLSAgICAweDlDLCAweDM4LCAweDU1LCAweDYwLCAweDBGLCAweDhELCAweEM5LCAweDFDLCAweDc2LCAweDdDLCAweDEyLCAweDE5LAotICAgIDB4NjcsIDB4QjIsIDB4NjAsIDB4N0MsIDB4MDcsIDB4ODMsIDB4ODAsIDB4MTMsIDB4RkYsIDB4RkUsIDB4NzgsIDB4NEIsCi0gICAgMHgwNywgMHg1NCwgMHg4NiwgMHgzMSwgMHg0MiwgMHhBNSwgMHg1QiwgMHhEOCwgMHg1RiwgMHg3MCwgMHg2MiwgMHg2QiwKLSAgICAweDc5LCAweEY1LCAweDFDLCAweEIyLCAweEY0LCAweDQxLCAweDE0LCAweDQ0LCAweEMxLCAweDg0LCAweDJDLCAweEQ0LAotICAgIDB4RUQsIDB4Q0YsIDB4ODEsIDB4REUsIDB4MTYsIDB4NUEsIDB4ODcsIDB4NEEsIDB4M0MsIDB4OTAsIDB4RTMsIDB4MzAsCi0gICAgMHhDQSwgMHgzOSwgMHhBNywgMHhFMiwgMHgzNiwgMHgwMiwgMHg1MiwgMHhDRiwgMHgzMSwgMHgzQiwgMHgxQiwgMHgxOCwKLSAgICAweEM4LCAweEI2LCAweDBBLCAweDI0LCAweEFFLCAweENFLCAweDY0LCAweDRBLCAweDNELCAweEZBLCAweDc1LCAweEE4LAotICAgIDB4ODIsIDB4MjUsIDB4RUEsIDB4NjQsIDB4MDksIDB4NDEsIDB4MzcsIDB4NzUsIDB4NkMsIDB4OEUsIDB4MjAsIDB4REMsCi0gICAgMHhDMSwgMHgwRSwgMHhEMSwgMHgxMSwgMHhGMSwgMHg5RiwgMHg1MiwgMHhDMiwgMHgwOCwgMHhBQiwgMHg1OSwgMHhEMiwKLSAgICAweENGLCAweEE0LCAweDJDLCAweEEyLCAweDM2LCAweDQxLCAweERCLCAweDIzLCAweDI5LCAweDczLCAweDA0LCAweEI2LAotICAgIDB4RTksIDB4OEIsIDB4MzgsIDB4OEEsIDB4QjIsIDB4QTIsIDB4NDEsIDB4QkQsIDB4ODQsIDB4RDAsIDB4QzIsIDB4QUUsCi0gICAgMHhCMywgMHgwOSwgMHhDMSwgMHgwMiwgMHhCNiwgMHgzNSwgMHg1RCwgMHhGMSwgMHg3QiwgMHg5QSwgMHg3QywgMHg3OCwKLSAgICAweEFGLCAweEQ0LCAweDlBLCAweDg4LCAweDRDLCAweDBELCAweDUwLCAweDM0LCAweDFDLCAweDkzLCAweDk3LCAweDQ3LAotICAgIDB4M0UsIDB4OUEsIDB4NzIsIDB4M0IsIDB4ODEsIDB4REQsIDB4RjcsIDB4NDcsIDB4RDIsIDB4NjQsIDB4OUMsIDB4QTEsCi0gICAgMHgwNSwgMHg1MywgMHgyRCwgMHg3NSwgMHg5RSwgMHg0MiwgMHgzRCwgMHhGQywgMHhGQywgMHgxNywgMHhGRiwgMHgwMSwKLSAgICAweERDLCAweEYxLCAweDE4LCAweEQzfTsKLWNvbnN0IHVpbnQ4X3QgZ19lc0VTX0xvY2FsZVtdID0gewotICAgIDB4NzgsIDB4OUMsIDB4OUQsIDB4NTYsIDB4Q0YsIDB4NkIsIDB4RDQsIDB4NDAsIDB4MTQsIDB4QkUsIDB4MEIsIDB4RkUsCi0gICAgMHgwRiwgMHgyMSwgMHg1OCwgMHg1NiwgMHhBMSwgMHhERCwgMHhEMSwgMHg2MywgMHhDQiwgMHgzNiwgMHg1MCwgMHhEQSwKLSAgICAweERBLCAweDk1LCAweDFBLCAweDU5LCAweDlBLCAweEFBLCAweEQ4LCAweDhCLCAweDRDLCAweDkyLCAweEU5LCAweEVFLAotICAgIDB4QjQsIDB4QzksIDB4Q0MsIDB4MzIsIDB4NDksIDB4MkMsIDB4OUIsIDB4QTMsIDB4RTAsIDB4NDEsIDB4MTAsIDB4MEIsCi0gICAgMHhERSwgMHg4QSwgMHgyNywgMHgwRiwgMHgxRSwgMHgwNCwgMHg4QiwgMHg3NywgMHg1MSwgMHgzQywgMHhGNCwgMHgzRiwKLSAgICAweDExLCAweDZBLCAweEVCLCAweEM5LCAweDdGLCAweEMxLCAweDM3LCAweDlCLCAweDQ5LCAweDM2LCAweDNGLCAweDY2LAotICAgIDB4RDcsIDB4NjAsIDB4NEUsIDB4RjMsIDB4QkUsIDB4RjcsIDB4N0QsIDB4MkYsIDB4RUYsIDB4N0QsIDB4OTMsIDB4NEMsCi0gICAgMHhEMiwgMHgwQiwgMHhCOCwgMHg4NywgMHgwMywgMHg2MiwgMHgzMCwgMHgxQywgMHg5MiwgMHg3NSwgMHg5MywgMHg0NCwKLSAgICAweENGLCAweEI3LCAweDFELCAweEQzLCAweEYwLCAweDQ5LCAweEU0LCAweEFELCAweDlCLCAweEQ3LCAweDFGLCAweDdGLAotICAgIDB4NUMsIDB4OUQsIDB4OUUsIDB4NUYsIDB4QkQsIDB4M0UsIDB4QkIsIDB4RkUsIDB4NzIsIDB4N0UsIDB4QkIsIDB4MDgsCi0gICAgMHhGRSwgMHg3QywgMHg3QiwgMHg3MywgMHhGOSwgMHhGRSwgMHhGQiwgMHhFRiwgMHhCMywgMHg1NywgMHhCRiwgMHhERSwKLSAgICAweEJFLCAweEJCLCAweEZDLCAweDdBLCAweDdBLCAweEM3LCAweEI0LCAweDdBLCAweEIyLCAweDAwLCAweEYzLCAweEIxLAotICAgIDB4NzAsIDB4MjYsIDB4QTEsIDB4Q0IsIDB4ODMsIDB4NDgsIDB4RDUsIDB4MUEsIDB4MEEsIDB4MzIsIDB4RTQsIDB4ODIsCi0gICAgMHg2MiwgMHgwNiwgMHg4QywgMHg5MCwgMHhCMywgMHg3OCwgMHhGNCwgMHgwOCwgMHhFMCwgMHg0OCwgMHhBRCwgMHgyRCwKLSAgICAweEMyLCAweDg4LCAweEUwLCAweDNELCAweDk0LCAweDA1LCAweDM3LCAweDZGLCAweDI4LCAweEY0LCAweDkwLCAweEI4LAotICAgIDB4NDIsIDB4ODcsIDB4ODcsIDB4NTgsIDB4QTQsIDB4NEQsIDB4MTQsIDB4QkIsIDB4ODIsIDB4MDYsIDB4MUEsIDB4RUUsCi0gICAgMHhBNCwgMHg0OSwgMHgzRCwgMHg0QSwgMHgxOCwgMHhENSwgMHhBMSwgMHg4MSwgMHgwNiwgMHhDNSwgMHg0MywgMHgxRSwKLSAgICAweEM1LCAweDRELCAweDM4LCAweDIyLCAweEUzLCAweDk4LCAweDkyLCAweDEwLCAweDFBLCAweDZDLCAweEE0LCAweEI4LAotICAgIDB4MTcsIDB4MjcsIDB4M0EsIDB4OUMsIDB4RjEsIDB4MTcsIDB4NzMsIDB4MTQsIDB4M0UsIDB4RjUsIDB4MUEsIDB4MTksCi0gICAgMHg1NCwgMHg3MiwgMHgyOSwgMHgyNywgMHg0RSwgMHgyMywgMHgwMywgMHhCQiwgMHhBRSwgMHg1OCwgMHgzNywgMHhFRiwKLSAgICAweDk5LCAweDI1LCAweEYzLCAweDc0LCAweEQ2LCAweEU5LCAweDZDLCAweEQzLCAweDk5LCAweEE2LCAweEIzLCAweDRDLAotICAgIDB4RTcsIDB4OTgsIDB4Q0UsIDB4MkYsIDB4OUQsIDB4NUIsIDB4M0EsIDB4QUIsIDB4NzQsIDB4MUUsIDB4RTksIDB4RkMsCi0gICAgMHhEMSwgMHgzOSwgMHgzMywgMHhERiwgMHgxMywgMHgxRiwgMHg0RiwgMHhENCwgMHg1MywgMHgwNCwgMHgyQiwgMHhDQiwKLSAgICAweEU3LCAweDIxLCAweDY1LCAweEYyLCAweEY2LCAweDMyLCAweEM4LCAweEIyLCAweDU2LCAweDkwLCAweDMwLCAweDEyLAotICAgIDB4NTUsIDB4MTAsIDB4MzAsIDB4MjEsIDB4QUUsIDB4NDMsIDB4RjQsIDB4RTIsIDB4OTMsIDB4RjAsIDB4NzgsIDB4NTAsCi0gICAgMHg4MywgMHg4RiwgMHgxMiwgMHhGMiwgMHhBMiwgMHgwNiwgMHhDMSwgMHhGRSwgMHg4OSwgMHg3QSwgMHhDMSwgMHhFOCwKLSAgICAweEUyLCAweDgzLCAweDhCLCAweEZELCAweEQ5LCAweDZELCAweDUxLCAweEQxLCAweDU1LCAweEE5LCAweEMzLCAweEQyLAotICAgIDB4OUUsIDB4QTksIDB4NTYsIDB4RUIsIDB4NkQsIDB4RDYsIDB4OUIsIDB4NkMsIDB4NzQsIDB4NTgsIDB4RUYsIDB4QUQsCi0gICAgMHhERSwgMHg1OCwgMHhBMywgMHgyOSwgMHg3RCwgMHg0NywgMHgyMSwgMHgxMSwgMHhENCwgMHg4NywgMHg4NywgMHgyRCwKLSAgICAweDdGLCAweEZELCAweDU0LCAweDY4LCAweDZELCAweEQ4LCAweEUwLCAweDZFLCAweDFFLCAweDk0LCAweDc4LCAweEQ2LAotICAgIDB4QTAsIDB4OTYsIDB4NDAsIDB4RDUsIDB4MEEsIDB4ODAsIDB4MTAsIDB4ODEsIDB4NTUsIDB4MzUsIDB4NTgsIDB4NTksCi0gICAgMHhCOCwgMHhCQiwgMHhEOSwgMHhFRCwgMHgyMSwgMHhCOSwgMHhDQSwgMHg1MiwgMHg5NiwgMHg1RiwgMHgwNiwgMHg1MCwKLSAgICAweDQxLCAweDk2LCAweDQxLCAweEVELCAweEE4LCAweEM4LCAweEJBLCAweDhGLCAweEM5LCAweDAwLCAweEM3LCAweDMxLAotICAgIDB4MTgsIDB4M0QsIDB4REQsIDB4RDcsIDB4MjIsIDB4NTIsIDB4RTcsIDB4QzgsIDB4NjEsIDB4MTIsIDB4MDQsIDB4QTYsCi0gICAgMHhCNSwgMHgwRCwgMHg5NywgMHhCMSwgMHhENSwgMHg4MSwgMHhBMywgMHhDOSwgMHhFOCwgMHhEOCwgMHg3MCwgMHg2NSwKLSAgICAweEFCLCAweDY3LCAweDcwLCAweEM5LCAweDY5LCAweDBCLCAweDRELCAweEFELCAweEEwLCAweDJBLCAweDExLCAweDcwLAotICAgIDB4MzYsIDB4MzQsIDB4QUQsIDB4RkYsIDB4NTUsIDB4ODcsIDB4QzQsIDB4MDcsIDB4RjEsIDB4MTYsIDB4QjIsIDB4NkQsCi0gICAgMHhENCwgMHg1MiwgMHgxMSwgMHg4RCwgMHhCOCwgMHg4OCwgMHg2NywgMHg5QSwgMHg4NiwgMHgwMiwgMHg1NSwgMHg2NiwKLSAgICAweDA2LCAweDIwLCAweEE2LCAweDYxLCAweEM5LCAweDgzLCAweDUyLCAweDU0LCAweEYxLCAweEEwLCAweERGLCAweEVGLAotICAgIDB4RjQsIDB4QTEsIDB4RkQsIDB4MEUsIDB4NUMsIDB4MEUsIDB4OUMsIDB4RDIsIDB4MDcsIDB4M0QsIDB4NTQsIDB4NjIsCi0gICAgMHhENiwgMHhDQSwgMHg1NCwgMHgyNiwgMHhFRiwgMHhGNywgMHhENywgMHg2QywgMHg3QiwgMHhDRCwgMHg3MSwgMHg1QSwKLSAgICAweDQ5LCAweEE2LCAweEUzLCAweDJBLCAweDQxLCAweDBCLCAweEJBLCAweDlBLCAweDU1LCAweDBBLCAweDFBLCAweDZDLAotICAgIDB4NTQsIDB4OTksIDB4NEIsIDB4NTksIDB4QjUsIDB4MEYsIDB4NTgsIDB4QkUsIDB4RkQsIDB4M0IsIDB4ODksIDB4MUQsCi0gICAgMHgxRiwgMHg4RiwgMHhDMiwgMHhDOCwgMHhEOSwgMHhERSwgMHhCQSwgMHg3RiwgMHhGMiwgMHgxNCwgMHg4RiwgMHg3NiwKLSAgICAweEQzLCAweDgzLCAweENDLCAweDlDLCAweDMyLCAweDA5LCAweDc0LCAweDJDLCAweDA5LCAweDVELCAweDIyLCAweDY2LAotICAgIDB4MEUsIDB4NTUsIDB4NjIsIDB4RDUsIDB4MDgsIDB4NjAsIDB4RjAsIDB4OUMsIDB4N0EsIDB4QTYsIDB4OTUsIDB4MkUsCi0gICAgMHhBNywgMHhFOSwgMHg2QSwgMHgzNywgMHg0RCwgMHhEMywgMHgxRSwgMHhBQSwgMHhGMCwgMHgxQSwgMHg4NSwgMHg5NCwKLSAgICAweEQwLCAweDRCLCAweDg0LCAweDIwLCAweENDLCAweDlCLCAweEU0LCAweENBLCAweEQ1LCAweDU1LCAweEUzLCAweDU2LAotICAgIDB4NEIsIDB4RTksIDB4OTgsIDB4MDgsIDB4OEYsIDB4QjAsIDB4NTgsIDB4MjksIDB4OTcsIDB4MzQsIDB4MkEsIDB4NTQsCi0gICAgMHg2QiwgMHhCRCwgMHgyOCwgMHg5NCwgMHg0RiwgMHg1NywgMHgwOSwgMHg1NSwgMHg1OSwgMHg5RiwgMHg3OCwgMHgzNCwKLSAgICAweEM0LCAweEIwLCAweEUzLCAweENCLCAweEI5LCAweDNFLCAweDRCLCAweEQ3LCAweEQ1LCAweEM1LCAweDk3LCAweDk2LAotICAgIDB4MjcsIDB4NjMsIDB4MkEsIDB4MzcsIDB4QkEsIDB4REIsIDB4OEEsIDB4NUYsIDB4NzQsIDB4QkQsIDB4RDQsIDB4OEEsCi0gICAgMHgwRSwgMHg4NywgMHg2QywgMHgxMiwgMHg5OSwgMHhENiwgMHg0QSwgMHgyQiwgMHg3MiwgMHgwQSwgMHg5RiwgMHg2RiwKLSAgICAweEQzLCAweEJBLCAweERCLCAweEU0LCAweEEyLCAweEVBLCAweEQ4LCAweDgwLCAweEU0LCAweEJFLCAweDE3LCAweDRFLAotICAgIDB4NTQsIDB4ODEsIDB4RkMsIDB4RjksIDB4OUEsIDB4MDYsIDB4QTYsIDB4RjUsIDB4RjMsIDB4RTUsIDB4NjcsIDB4MzgsCi0gICAgMHgzRSwgMHgyQSwgMHg4QywgMHg2NiwgMHgxMSwgMHhBNSwgMHhBMSwgMHgxMSwgMHg5NywgMHgwQiwgMHgzOCwgMHgzNSwKLSAgICAweDFFLCAweEVGLCAweEI1LCAweDE2LCAweDk1LCAweDRELCAweDZGLCAweDRBLCAweDUwLCAweEJELCAweDVCLCAweEY5LAotICAgIDB4MzIsIDB4NEMsIDB4QzYsIDB4RTQsIDB4MTAsIDB4N0IsIDB4RjIsIDB4MUMsIDB4Q0MsIDB4OTcsIDB4QUEsIDB4OTYsCi0gICAgMHgzRCwgMHg4MSwgMHgxRiwgMHgxRiwgMHhERiwgMHgxOCwgMHg4MCwgMHgxNywgMHhBOCwgMHhDQywgMHhDQywgMHhEMywKLSAgICAweDE0LCAweEZFLCAweDQ2LCAweEQ4LCAweERDLCAweEY0LCAweDI2LCAweDRGLCAweDA0LCAweDdDLCAweDc3LCAweDBDLAotICAgIDB4MjcsIDB4RjYsIDB4QjUsIDB4RjksIDB4MEQsIDB4OUYsIDB4QkIsIDB4QzQsIDB4MTgsIDB4RDAsIDB4N0YsIDB4MTAsCi0gICAgMHhGQSwgMHhGMiwgMHg2NywgMHhFQSwgMHg2NCwgMHgwMSwgMHg2MSwgMHg0MywgMHg2MCwgMHgxNywgMHg1RSwgMHg5OCwKLSAgICAweEY5LCAweDg0LCAweEZELCAweDExLCAweEE2LCAweERBLCAweEY0LCAweDJFLCAweDRGLCAweDkzLCAweDYzLCAweDZDLAotICAgIDB4RUMsIDB4RjAsIDB4NzgsIDB4NDQsIDB4M0QsIDB4MzksIDB4QzcsIDB4Q0EsIDB4OTMsIDB4MDcsIDB4ODYsIDB4QkQsCi0gICAgMHg4OCwgMHgwQSwgMHgyMywgMHg3QiwgMHgyMywgMHg5RSwgMHg1MywgMHhGNywgMHgxNiwgMHhEQywgMHgxNCwgMHg5OCwKLSAgICAweDQzLCAweDM5LCAweDk5LCAweEYxLCAweDcwLCAweDAxLCAweEM5LCAweEUxLCAweDJELCAweDQ4LCAweEY2LCAweDI0LAotICAgIDB4NjEsIDB4QzMsIDB4MjMsIDB4M0UsIDB4RTUsIDB4QTksIDB4RTYsIDB4RDAsIDB4NkMsIDB4Q0YsIDB4NjQsIDB4OTQsCi0gICAgMHhGRCwgMHhGQywgMHhDMiwgMHhGMiwgMHgyRiwgMHg3QywgMHhEQywgMHhDQywgMHgyRiwKLX07Ci1jb25zdCB1aW50OF90IGdfZXNMQV9Mb2NhbGVbXSA9IHsKLSAgICAweDc4LCAweDlDLCAweDlELCAweDU2LCAweENELCAweDRFLCAweERDLCAweDMwLCAweDEwLCAweDNFLCAweDUzLCAweEE5LAotICAgIDB4RUYsIDB4NjAsIDB4NDUsIDB4NDUsIDB4ODAsIDB4MDQsIDB4OUIsIDB4RjYsIDB4QjgsIDB4MjgsIDB4NDQsIDB4NUEsCi0gICAgMHgwMSwgMHhBNSwgMHgxNSwgMHgwRCwgMHg1QSwgMHg3NSwgMHg1MSwgMHg0QiwgMHhCOSwgMHg1NCwgMHg0RSwgMHg2MiwKLSAgICAweDM2LCAweDg2LCAweEM0LCAweDVFLCAweDM5LCAweDA5LCAweDY4LCAweEEzLCAweEJFLCAweDQwLCAweDRGLCAweDNELAotICAgIDB4RjQsIDB4RDQsIDB4NjMsIDB4MkIsIDB4MjEsIDB4QjUsIDB4MDcsIDB4RDQsIDB4NDcsIDB4RTgsIDB4ODEsIDB4NjcsCi0gICAgMHg0MSwgMHhGMCwgMHgxOCwgMHg5RCwgMHhGQywgMHg2RSwgMHgxMiwgMHgzQiwgMHhFOSwgMHhEMiwgMHg5QywgMHgzQywKLSAgICAweERGLCAweDdDLCAweDlGLCAweDc3LCAweEU2LCAweEIzLCAweDMzLCAweDFCLCAweEMzLCAweEU3LCAweDBFLCAweEY2LAotICAgIDB4MDksIDB4NjIsIDB4MzgsIDB4MjAsIDB4M0IsIDB4MUEsIDB4MDksIDB4M0YsIDB4NUEsIDB4MjcsIDB4MUEsIDB4NzIsCi0gICAgMHg0OSwgMHhFOCwgMHhFQywgMHg2OCwgMHgwRiwgMHhENywgMHg3RiwgMHhFRSwgMHhCRiwgMHhEQywgMHhEQywgMHg3RiwKLSAgICAweEZFLCAweEY2LCAweEYwLCAweEZCLCAweDY2LCAweEZELCAweEVFLCAweEM3LCAweDRGLCAweDg4LCAweEVGLCAweEJFLAotICAgIDB4NUUsIDB4NkYsIDB4NjgsIDB4RTYsIDB4RDMsIDB4MjcsIDB4MDgsIDB4MTksIDB4QTksIDB4OEEsIDB4QjksIDB4NTgsCi0gICAgMHg0QywgMHhFNiwgMHg4MSwgMHhDRCwgMHhGRCwgMHhCMCwgMHhEOCwgMHg2MCwgMHgyQSwgMHhDOCwgMHg5NCwgMHgwQiwKLSAgICAweDhBLCAweDU5LCAweENBLCAweDVBLCAweDQxLCAweDQ2LCAweEMwLCAweDU5LCAweEU0LCAweDFELCAweDQxLCAweDJBLAotICAgIDB4NEMsIDB4RTMsIDB4OTUsIDB4M0MsIDB4MzYsIDB4MDksIDB4MjMsIDB4ODIsIDB4MUIsIDB4N0EsIDB4MUUsIDB4RDQsCi0gICAgMHhGMCwgMHgzMywgMHg2MiwgMHgwQiwgMHg3NSwgMHgyNiwgMHhDMCwgMHgyMiwgMHg1MSwgMHhFMSwgMHhEOCwgMHgxNiwKLSAgICAweEQ0LCAweDU3LCAweEYyLCAweEU3LCAweDJBLCAweEZBLCAweDc5LCAweENDLCAweEE4LCAweDFBLCAweEY3LCAweDk1LAotICAgIDB4MzgsIDB4OUUsIDB4RjIsIDB4MzAsIDB4NTIsIDB4MjUsIDB4NDIsIDB4MzIsIDB4OEIsIDB4MjgsIDB4MDksIDB4QTAsCi0gICAgMHg1QywgMHg0NSwgMHg5MiwgMHgzQiwgMHg1MSwgMHhBQywgMHhDRSwgMHgzMCwgMHg3RSwgMHhEOSwgMHhBOSwgMHg3MiwKLSAgICAweEE5LCAweDIzLCAweEU1LCAweDUwLCAweEIxLCAweEFFLCAweDFDLCAweEFDLCAweDNCLCAweDhBLCAweEIwLCAweDZELAotICAgIDB4OEIsIDB4MUQsIDB4RUQsIDB4ODUsIDB4RDYsIDB4QjIsIDB4NTYsIDB4NkQsIDB4QUMsIDB4REEsIDB4NTQsIDB4QjUsCi0gICAgMHhBNSwgMHg2QSwgMHg0MywgMHhENSwgMHg3RSwgMHhBQSwgMHhERCwgMHg1NCwgMHg3QiwgMHhBOSwgMHgzNiwgMHg1MiwKLSAgICAweEVELCAweEEwLCAweERBLCAweDNELCAweEI1LCAweDZGLCAweEZELCAweDhFLCAweEI5LCAweDc4LCAweDVFLCAweEJCLAotICAgIDB4ODEsIDB4MTAsIDB4OTksIDB4MkUsIDB4MEYsIDB4MjgsIDB4NEIsIDB4Q0IsIDB4NDksIDB4ODMsIDB4MEEsIDB4RjUsCi0gICAgMHg2MywgMHg0NiwgMHhDMiwgMHgxNiwgMHgwNiwgMHgxNiwgMHg0NSwgMHgzMiwgMHg0OCwgMHg2RiwgMHg3RiwgMHgwOSwKLSAgICAweDg3LCAweEZCLCAweDUyLCAweEUyLCAweDNDLCAweDI2LCAweDk3LCAweDEyLCAweDA4LCAweDI3LCAweDJFLCAweEU0LAotICAgIDB4OEQsIDB4QzMsIDB4REIsIDB4RUYsIDB4MzYsIDB4NzYsIDB4MTcsIDB4MjUsIDB4QTAsIDB4NkMsIDB4QTUsIDB4QTgsCi0gICAgMHhCQSwgMHg3NSwgMHhDQSwgMHg0NSwgMHhGOSwgMHg3MiwgMHhFOSwgMHg3MiwgMHhFMSwgMHg4QSwgMHhBQSwgMHhFNSwKLSAgICAweDdBLCAweEU1LCAweDYyLCAweDE1LCAweDg1LCAweDc2LCAweDU3LCAweDE5LCAweDEwLCAweDQxLCAweDVELCAweEI4LAotICAgIDB4QjYsIDB4RjUsIDB4NTcsIDB4QkMsIDB4ODAsIDB4Q0MsIDB4OTEsIDB4MDUsIDB4NjcsIDB4NTEsIDB4MDYsIDB4Q0QsCi0gICAgMHhENCwgMHhCOCwgMHg5NSwgMHg0MiwgMHg4QiwgMHhCMCwgMHhCNiwgMHgzOSwgMHgxMSwgMHhCOCwgMHhCNiwgMHgyRiwKLSAgICAweDQ0LCAweDI2LCAweDFFLCAweEVDLCAweDBFLCAweDBDLCAweDNELCAweDVELCAweDU1LCAweDkwLCAweDVCLCAweDg3LAotICAgIDB4NTAsIDB4QjYsIDB4MkEsIDB4NDUsIDB4MzAsIDB4QTUsIDB4RjQsIDB4RDYsIDB4OTgsIDB4Q0EsIDB4NTEsIDB4MTcsCi0gICAgMHg0NywgMHg2NCwgMHg4QywgMHhBMywgMHgwOCwgMHgwRSwgMHhBNiwgMHg3MiwgMHhCQiwgMHg0MiwgMHg4QSwgMHg0OSwKLSAgICAweDc2LCAweDE2LCAweEZCLCAweEJFLCAweDY2LCAweEVFLCAweEMzLCAweDgzLCAweEY2LCAweEQ2LCAweDYwLCAweDIyLAotICAgIDB4QTIsIDB4MzUsIDB4MEIsIDB4OUUsIDB4N0MsIDB4RjUsIDB4MDEsIDB4OUUsIDB4RDQsIDB4ODksIDB4NEEsIDB4RDMsCi0gICAgMHhCNSwgMHg4OSwgMHhDRiwgMHhEOSwgMHg1NCwgMHgzMywgMHhGRiwgMHg1RiwgMHgxRiwgMHgxMCwgMHgxNywgMHhFNCwKLSAgICAweDdCLCAweEJBLCAweDY1LCAweEU5LCAweDRCLCAweDZCLCAweDQyLCAweDhGLCAweDhCLCAweDY4LCAweEExLCAweDZBLAotICAgIDB4NkIsIDB4MTAsIDB4NkEsIDB4MjAsIDB4ODUsIDB4MjMsIDB4MTEsIDB4MEQsIDB4NUEsIDB4OEUsIDB4RDQsIDB4OTAsCi0gICAgMHg4NiwgMHgyMywgMHg5RSwgMHhCNywgMHg2RCwgMHg1OSwgMHhEQiwgMHg5MywgMHgwOSwgMHgxQSwgMHhBMSwgMHg1MywKLSAgICAweDQzLCAweEFGLCAweEIxLCAweEJBLCAweDY0LCAweEI5LCAweDA3LCAweDhGLCAweDk2LCAweDY1LCAweEFELCAweDJGLAotICAgIDB4NTQsIDB4NEIsIDB4NjksIDB4OEEsIDB4RDYsIDB4MzMsIDB4OTUsIDB4MkMsIDB4NDksIDB4M0IsIDB4NkYsIDB4RjUsCi0gICAgMHg1OSwgMHhEQywgMHg4NSwgMHg2MywgMHg0MCwgMHhDQiwgMHgwQiwgMHg3MiwgMHgxMCwgMHg1QiwgMHhEMSwgMHg4NSwKLSAgICAweDE3LCAweDg0LCAweDkzLCAweEZELCAweEJELCAweDk3LCAweDU3LCAweEVGLCAweEIxLCAweDc3LCAweDk4LCAweDlDLAotICAgIDB4RTYsIDB4ODYsIDB4RDUsIDB4NDksIDB4OTksIDB4OTIsIDB4QzUsIDB4ODEsIDB4NEQsIDB4NDQsIDB4RDMsIDB4QjUsCi0gICAgMHgwNiwgMHg1NiwgMHg1NCwgMHgwNSwgMHgxOCwgMHhEQywgMHg2RCwgMHg0NywgMHgzMywgMHg5MywgMHhDRCwgMHgyNCwKLSAgICAweDE5LCAweDBFLCAweDkyLCAweDI0LCAweDMxLCAweEY0LCAweDA2LCAweEFGLCAweDVCLCAweEVBLCAweEM0LCAweDQyLAotICAgIDB4MTAsIDB4RTYsIDB4Q0MsIDB4MzUsIDB4RjMsIDB4NTksIDB4MkUsIDB4MUUsIDB4MEUsIDB4M0YsIDB4QUQsIDB4NTcsCi0gICAgMHhDQiwgMHg4RCwgMHhBNSwgMHhGNywgMHg5OSwgMHgxMSwgMHhFMSwgMHgxMCwgMHgxNiwgMHgxNSwgMHgyNSwgMHhBQywKLSAgICAweENBLCAweEJBLCAweEQ0LCAweDFCLCAweEE5LCAweDlGLCAweEFBLCAweEM3LCAweDQ1LCAweERCLCAweDJCLCAweDRELAotICAgIDB4QTgsIDB4RDgsIDB4REUsIDB4MjUsIDB4MEUsIDB4MEQsIDB4MzAsIDB4NUMsIDB4OEUsIDB4NDEsIDB4QjksIDB4NEIsCi0gICAgMHg5RSwgMHhFRSwgMHgxNCwgMHg0QywgMHgwNSwgMHg4RiwgMHg2NywgMHgzNCwgMHhCRCwgMHgxNywgMHg5QiwgMHg0QiwKLSAgICAweDJBLCAweEFBLCAweDBFLCAweDU2LCAweDk3LCAweDE0LCAweEMwLCAweDg0LCAweDhGLCAweDQzLCAweENELCAweERDLAotICAgIDB4NUEsIDB4OTIsIDB4OUUsIDB4QzAsIDB4NzcsIDB4ODcsIDB4NjYsIDB4M0UsIDB4OTcsIDB4RDgsIDB4MEIsIDB4NjMsCi0gICAgMHgxQSwgMHg2NywgMHg1RiwgMHgxRSwgMHg0QywgMHhDMywgMHg5OSwgMHgyNiwgMHg1OCwgMHhERSwgMHhDOSwgMHgyQywKLSAgICAweDgwLCAweDAzLCAweDg0LCAweDU5LCAweEQ0LCAweEM4LCAweEY3LCAweDY4LCAweDY4LCAweEM4LCAweEQzLCAweDg1LAotICAgIDB4NjYsIDB4NUEsIDB4MjcsIDB4NDcsIDB4OEYsIDB4OTAsIDB4RDUsIDB4OEYsIDB4NDEsIDB4MTIsIDB4NjUsIDB4QzMsCi0gICAgMHg1MCwgMHhBQSwgMHgzQSwgMHg3RCwgMHhGNSwgMHhFNywgMHgzMywgMHg3MiwgMHg4NiwgMHg5RCwgMHg3MiwgMHhFOCwKLSAgICAweDk2LCAweDYxLCAweEIxLCAweEE3LCAweDM1LCAweDg3LCAweEFGLCAweDM5LCAweDE3LCAweDhELCAweEMxLCAweDFELAotICAgIDB4NUQsIDB4NEQsIDB4QTAsIDB4RjAsIDB4NDksIDB4QzUsIDB4N0EsIDB4MDgsIDB4QkIsIDB4M0MsIDB4MTYsIDB4RjAsCi0gICAgMHgxNywgMHg4OCwgMHgyNiwgMHg5MSwgMHhEQiwgMHhDMSwgMHgxOCwgMHhCOSwgMHhEQywgMHgyNiwgMHg2OCwgMHg0QywKLSAgICAweEZGLCAweDQ5LCAweDc5LCAweDk1LCAweDdFLCAweDFGLCAweDVFLCAweEY1LCAweDUyLCAweDQ2LCAweDAyLCAweERCLAotICAgIDB4RjAsIDB4QUUsIDB4RjUsIDB4NTEsIDB4OEUsIDB4M0QsIDB4NEMsIDB4M0IsIDB4MDgsIDB4ODcsIDB4M0MsIDB4ODksCi0gICAgMHgyRiwgMHgzMCwgMHgzQSwgMHhFMCwgMHg5MSwgMHg0NywgMHg5RCwgMHhCNCwgMHhBNywgMHhBRCwgMHg3NywgMHhBRiwKLSAgICAweDkxLCAweEQ1LCAweDRGLCAweDA2LCAweDAzLCAweDFDLCAweDhGLCAweDk3LCAweEU0LCAweEI3LCAweEJELCAweDNGLAotICAgIDB4MEQsIDB4REMsIDB4NjksIDB4REEsIDB4MjUsIDB4N0EsIDB4RDMsIDB4NEIsIDB4OUIsIDB4RjAsIDB4QTUsIDB4NjgsCi0gICAgMHhENiwgMHgzQywgMHg2NiwgMHhEMywgMHg3MywgMHg5RSwgMHgzMSwgMHhGMywgMHgyMiwgMHhCMywgMHgxMSwgMHg1NywKLSAgICAweDNCLCAweDRGLCAweDQzLCAweENGLCAweDNGLCAweEVGLCAweENELCAweEJGLCAweEM0LCAweEI1LCAweEQ0LCAweDA0fTsKLWNvbnN0IHVpbnQ4X3QgZ19kZURFX0xvYWNhbGVbXSA9IHsKLSAgICAweDc4LCAweDlDLCAweDk1LCAweDU2LCAweDRELCAweDZGLCAweEQ0LCAweDMwLCAweDEwLCAweEJELCAweDIzLCAweEYxLAotICAgIDB4MUYsIDB4QUMsIDB4ODgsIDB4QUEsIDB4MjAsIDB4QjUsIDB4MUIsIDB4MzgsIDB4QjYsIDB4REEsIDB4NDYsIDB4NUEsCi0gICAgMHg3NSwgMHhGQiwgMHg0MSwgMHg0QiwgMHhDQSwgMHhBQSwgMHg2OSwgMHg0MSwgMHhGNCwgMHg4MiwgMHhCQywgMHg4OSwKLSAgICAweEJCLCAweDcxLCAweDlCLCAweEQ4LCAweDJCLCAweEM3LCAweDY5LCAweEI1LCAweDM5LCAweEYyLCAweDM3LCAweEI4LAotICAgIDB4NzIsIDB4MDQsIDB4NzEsIDB4RTQsIDB4MDQsIDB4MTcsIDB4RkUsIDB4MDksIDB4NTIsIDB4MjUsIDB4N0UsIDB4MDYsCi0gICAgMHg5MywgMHg4RCwgMHg5MywgMHgyNiwgMHhCNiwgMHhCQiwgMHgwRCwgMHhCOSwgMHhBQywgMHhFNywgMHhDRCwgMHg3QiwKLSAgICAweEIzLCAweDMzLCAweENGLCAweDg5LCAweDkzLCAweDYxLCAweEMyLCAweDQzLCAweDlDLCAweDEwLCAweEM0LCAweDcwLAotICAgIDB4NEEsIDB4NzYsIDB4OUMsIDB4ODgsIDB4N0MsIDB4MUMsIDB4RUYsIDB4MzksIDB4MjgsIDB4MjIsIDB4NTksIDB4QjgsCi0gICAgMHhFMywgMHhEQywgMHhGRCwgMHhGQSwgMHhGMSwgMHhGNywgMHhGQiwgMHhCNywgMHhFNywgMHhGMCwgMHg3MywgMHhGNywKLSAgICAweEY5LCAweEU3LCAweDBCLCAweEM3LCAweDFCLCAweDk2LCAweDQ0LCAweDE2LCAweDYxLCAweDExLCAweDJDLCAweEQyLAotICAgIDB4MjksIDB4NEYsIDB4MzIsIDB4QTUsIDB4OTksIDB4MDksIDB4MzIsIDB4RTMsIDB4ODIsIDB4NjIsIDB4MDYsIDB4OEMsCi0gICAgMHg5NCwgMHgzMywgMHgxOSwgMHg5RiwgMHgwMCwgMHg5QywgMHhBOSwgMHhCNSwgMHg3NywgMHg4NCwgMHg1OSwgMHg4RSwKLSAgICAweEM1LCAweEQwLCAweEFELCAweEEyLCAweEE3LCAweDRGLCAweDE0LCAweEJDLCAweDRGLCAweEE2LCAweEMyLCAweDg2LAotICAgIDB4RkIsIDB4QkYsIDB4QkYsIDB4ODgsIDB4QzIsIDB4NDAsIDB4NDcsIDB4NzMsIDB4NDEsIDB4MTMsIDB4OTMsIDB4OEIsCi0gICAgMHhBOSwgMHg4MSwgMHgxRCwgMHhFNSwgMHhDQywgMHgwNiwgMHgyNiwgMHgyNiwgMHgzOCwgMHhDQSwgMHg2NywgMHg3OSwKLSAgICAweDI2LCAweDBELCAweDM4LCAweDIwLCAweDczLCAweDQ5LCAweEQyLCAweDI5LCAweDMxLCAweDVCLCAweDdCLCAweDdCLAotICAgIDB4MkQsIDB4QjksIDB4MEQsIDB4M0YsIDB4RTEsIDB4MzcsIDB4NzYsIDB4QzEsIDB4OTgsIDB4MTQsIDB4N0EsIDB4QzIsCi0gICAgMHg2RCwgMHgxOSwgMHg1NCwgMHhGMywgMHg5NiwgMHgxMSwgMHhDMiwgMHhEMywgMHhBOSwgMHhEOCwgMHg3MSwgMHg1RSwKLSAgICAweDM5LCAweDJELCAweERGLCAweDZDLCAweEE2LCAweDk5LCAweDI2LCAweEQ4LCAweEVELCAweEVBLCAweDZCLCAweDk2LAotICAgIDB4Q0QsIDB4MkIsIDB4OUIsIDB4NTUsIDB4MzYsIDB4OUYsIDB4NkMsIDB4MEUsIDB4RDksIDB4REMsIDB4QjEsIDB4MTksCi0gICAgMHhGMywgMHhCMCwgMHgyNywgMHgxMSwgMHg1RSwgMHhBOCwgMHgxQiwgMHgwOCwgMHg1NiwgMHg1RSwgMHhDMCwgMHgxOSwKLSAgICAweDkzLCAweDE4LCAweEZFLCAweEJFLCAweDBDLCAweEFBLCAweEFDLCAweEU3LCAweDczLCAweDAzLCAweDFBLCAweDUzLAotICAgIDB4QzIsIDB4MzIsIDB4ODMsIDB4NDcsIDB4QTUsIDB4QkMsIDB4RTUsIDB4NjEsIDB4REMsIDB4NjUsIDB4NDIsIDB4NDEsCi0gICAgMHgyMiwgMHgwQywgMHhFRSwgMHhCRSwgMHgyMCwgMHg1NCwgMHhDNywgMHgwMiwgMHg5QywgMHg3NiwgMHg3OCwgMHg2RSwKLSAgICAweEQzLCAweDVBLCAweEFCLCAweENELCAweEQ2LCAweEM2LCAweDU1LCAweEZELCAweDZBLCAweEFELCAweDZBLCAweDZELAotICAgIDB4NkEsIDB4MEQsIDB4NkEsIDB4QUQsIDB4NjksIDB4MkQsIDB4NjksIDB4REQsIDB4RDgsIDB4MUIsIDB4NDksIDB4ODksCi0gICAgMHhBMCwgMHgxMSwgMHgyNSwgMHg2OSwgMHhGRCwgMHhENCwgMHhBOSwgMHhEMCwgMHgxQiwgMHhGOSwgMHhFMCwgMHg2QywKLSAgICAweDFELCAweEI0LCAweDc4LCAweERFLCAweDQ0LCAweDRCLCAweEI4LCAweERELCAweDBBLCAweDgwLCAweDEwLCAweDgxLAotICAgIDB4NTUsIDB4MzUsIDB4NTgsIDB4NzksIDB4MzcsIDB4MDMsIDB4QjQsIDB4MUIsIDB4OEIsIDB4QzEsIDB4RDAsIDB4MkQsCi0gICAgMHg4MywgMHgyQSwgMHhFQiwgMHgzMSwgMHgwRCwgMHg3MywgMHgxQiwgMHg0OSwgMHgxOSwgMHg2OCwgMHhFNywgMHg0NCwKLSAgICAweDM1LCAweDgxLCAweDI0LCAweDEzLCAweDJDLCAweDI1LCAweDExLCAweDZDLCAweEI5LCAweEIzLCAweDRELCAweEE0LAotICAgIDB4MEUsIDB4OTEsIDB4Q0IsIDB4M0MsIDB4NDksIDB4MUMsIDB4NkYsIDB4MEYsIDB4QUUsIDB4MEQsIDB4MzQsIDB4MUUsCi0gICAgMHgyMCwgMHgxRiwgMHgyRSwgMHhGNCwgMHgwMSwgMHhBRSwgMHg3MiwgMHhENiwgMHg4NiwgMHhBQiwgMHgxNSwgMHg1MiwKLSAgICAweEQyLCAweDg0LCAweEIzLCAweDk5LCAweEUzLCAweEZELCAweEE3LCAweDI4LCAweDI1LCAweDExLCAweDY4LCAweEM2LAotICAgIDB4MDMsIDB4REYsIDB4MUYsIDB4RjQsIDB4NTQsIDB4NjQsIDB4MzEsIDB4MTcsIDB4RjIsIDB4NUUsIDB4NjMsIDB4MjgsCi0gICAgMHhEQywgMHhDRSwgMHg4OCwgMHgwMCwgMHg0OCwgMHg5QSwgMHhCNiwgMHg0NiwgMHg2RSwgMHg0NSwgMHg5RCwgMHg5MSwKLSAgICAweDBGLCAweEI3LCAweDdELCAweDdGLCAweDFELCAweDlELCAweEM3LCAweDAyLCAweEFELCAweDVGLCAweDBDLCAweERELAotICAgIDB4MTYsIDB4NEIsIDB4MkIsIDB4RDEsIDB4MTksIDB4RjYsIDB4QjAsIDB4NTQsIDB4NkQsIDB4MDcsIDB4MDEsIDB4RUEsCi0gICAgMHgyMywgMHg1OSwgMHg4RSwgMHg1QSwgMHgyQiwgMHg3QSwgMHhGMCwgMHhENSwgMHhBMCwgMHg0QiwgMHg4NSwgMHg0MSwKLSAgICAweDc3LCAweDNCLCAweDUzLCAweDI5LCAweEEzLCAweENFLCAweDAwLCAweEFCLCAweEY3LCAweEZBLCAweEUwLCAweENBLAotICAgIDB4OTcsIDB4RDcsIDB4ODcsIDB4NjksIDB4MTYsIDB4RUMsIDB4OEQsIDB4RjcsIDB4NkYsIDB4REYsIDB4RTMsIDB4RjgsCi0gICAgMHhCOCwgMHhCOCwgMHhBOCwgMHhBQywgMHg2OSwgMHg5MywgMHg0MCwgMHhDNywgMHhGMiwgMHhGMiwgMHg2OCwgMHhCQywKLSAgICAweEY3LCAweEE3LCAweDEzLCAweEFCLCAweDRFLCAweDAwLCAweDgzLCAweDVCLCAweDMzLCAweDc0LCAweEJDLCAweDYyLAotICAgIDB4QTMsIDB4MjgsIDB4QjYsIDB4MDYsIDB4NDUsIDB4MDEsIDB4QzcsIDB4NDYsIDB4ODcsIDB4NjcsIDB4MTQsIDB4NTIsCi0gICAgMHhDMiwgMHgzMCwgMHgxNywgMHg4MiwgMHhCMCwgMHg3MCwgMHg1MSwgMHgyQiwgMHhCNywgMHhCNiwgMHhEMCwgMHhCMywKLSAgICAweDlFLCAweEQyLCAweDM5LCAweDExLCAweDIxLCAweDYxLCAweDUyLCAweDI5LCAweEQ3LCAweDJDLCAweDJBLCAweDU3LAotICAgIDB4NkIsIDB4QkQsIDB4MjksIDB4NTQsIDB4NEYsIDB4RDcsIDB4MDksIDB4OUIsIDB4MTcsIDB4NkIsIDB4NDgsIDB4NTMsCi0gICAgMHgwQywgMHhGQiwgMHhCRCwgMHg1MSwgMHhFQiwgMHhBQiwgMHhCNCwgMHhBRSwgMHg2RSwgMHhERSwgMHhBOSwgMHgzQywKLSAgICAweDlGLCAweEQzLCAweDcyLCAweEFCLCAweDA3LCAweEJELCAweEY4LCAweDRELCAweEQ3LCAweDZCLCAweEJELCAweEU4LAotICAgIDB4MjksIDB4NjUsIDB4NzksIDB4RTYsIDB4NzgsIDB4OUIsIDB4QkQsIDB4QzgsIDB4MDUsIDB4MTEsIDB4REMsIDB4RjEsCi0gICAgMHg1RSwgMHg5QSwgMHg1QywgMHhCNywgMHgzQiwgMHgzNiwgMHgyMCwgMHhCNSwgMHhFRiwgMHg4RCwgMHgxMywgMHg1RCwKLSAgICAweEEwLCAweEJFLCAweEMxLCAweDk2LCAweDgxLCAweEUzLCAweEZELCAweEY5LCAweEY0LCAweDE1LCAweENFLCAweDhBLAotICAgIDB4MEUsIDB4QzMsIDB4MkMsIDB4QTIsIDB4MzQsIDB4MzQsIDB4RTMsIDB4RTUsIDB4MDIsIDB4OEUsIDB4ODgsIDB4RjMsCi0gICAgMHhEMywgMHhERSwgMHhBMiwgMHhCNiwgMHhFOSwgMHhBNiwgMHhDNCwgMHhENSwgMHhCQiwgMHgyRCwgMHg5RiwgMHg4NiwKLSAgICAweEM1LCAweDlDLCAweDVDLCAweEUyLCAweEIwLCAweDNDLCAweEZBLCAweEVBLCAweEE1LCAweEFBLCAweEU1LCAweDJGLAotICAgIDB4RTAsIDB4MTMsIDB4MjcsIDB4NDIsIDB4MTMsIDB4RjAsIDB4QzIsIDB4NkQsIDB4MzMsIDB4RUIsIDB4MzQsIDB4NjUsCi0gICAgMHg5NCwgMHhCMywgMHgwNywgMHhEMywgMHhCQiwgMHgzQywgMHgxNywgMHg5NCwgMHgwOCwgMHgxNCwgMHhDOCwgMHhDOCwKLSAgICAweDlBLCAweDFGLCAweDQ1LCAweEYwLCAweDY5LCAweDgxLCAweDI2LCAweEY0LCAweDExLCAweEMyLCAweDIxLCAweDdDLAotICAgIDB4MzUsIDB4OTEsIDB4REIsIDB4MTUsIDB4ODQsIDB4OTEsIDB4QzAsIDB4NTMsIDB4NzgsIDB4NjAsIDB4MUUsIDB4MjYsCi0gICAgMHg5QywgMHhDNSwgMHg5OCwgMHg1QSwgMHhEMywgMHhDNywgMHhCQywgMHhDOCwgMHhBRiwgMHgzMSwgMHgzQSwgMHhFMCwKLSAgICAweDMyLCAweEE2LCAweDYxLCAweDM5LCAweEM3LCAweEU2LCAweEJCLCAweEQ3LCAweEM4LCAweDVGLCAweDQ1LCAweDg1LAotICAgIDB4OTEsIDB4QzMsIDB4OTgsIDB4RDcsIDB4RDQsIDB4RDMsIDB4MTUsIDB4N0YsIDB4MEEsIDB4Q0MsIDB4NTksIDB4MzksCi0gICAgMHgxOSwgMHg3QSwgMHhCMywgMHg4MiwgMHgwNCwgMHg2RiwgMHhGQSwgMHhDNywgMHg0OSwgMHhGRSwgMHgyMiwgMHg2NywKLSAgICAweEIzLCAweDJCLCAweEJFLCAweEU0LCAweEE5LCAweEU2LCAweERDLCAweEZCLCAweDNELCAweDJCLCAweEEzLCAweEVBLAotICAgIDB4NzMsIDB4MTYsIDB4OTYsIDB4RkYsIDB4MDAsIDB4MjksIDB4MjcsIDB4QUYsIDB4MTcsCi19OwotY29uc3QgdWludDhfdCBnX2ZyRlJfTG9jYWxlW10gPSB7Ci0gICAgMHg3OCwgMHg5QywgMHg5NSwgMHg1NiwgMHg0RCwgMHg2RiwgMHhEMywgMHg0MCwgMHgxMCwgMHhCRCwgMHgyMywgMHhGMSwKLSAgICAweDFGLCAweDU2LCAweDE2LCAweDU1LCAweDQxLCAweDZBLCAweEJELCAweDcwLCAweDRDLCAweDk1LCAweDVBLCAweEFBLAotICAgIDB4RkEsIDB4MTUsIDB4MjgsIDB4NDYsIDB4NTEsIDB4NTMsIDB4NDAsIDB4RjQsIDB4ODIsIDB4MzYsIDB4RjYsIDB4MzYsCi0gICAgMHhERSwgMHhENCwgMHhERSwgMHg4RCwgMHhENiwgMHg3NiwgMHg0QSwgMHg3QywgMHhFNCwgMHgzRiwgMHg3MCwgMHhFMiwKLSAgICAweEMyLCAweEI1LCAweDEyLCAweDg4LCAweDAzLCAweDQ3LCAweEM0LCAweDg1LCAweEZFLCAweDEzLCAweDI0LCAweDEwLAotICAgIDB4M0YsIDB4ODMsIDB4NzEsIDB4QkMsIDB4NzYsIDB4RUQsIDB4NUQsIDB4MjcsIDB4QjgsIDB4QkUsIDB4NjQsIDB4RTcsCi0gICAgMHhDRCwgMHg3QiwgMHhFMywgMHg5OSwgMHhCNywgMHhGNiwgMHhDNiwgMHhGRCwgMHg1MCwgMHg3OCwgMHgyNCwgMHhBNCwKLSAgICAweDg4LCAweDkzLCAweDg4LCAweEVFLCAweDVBLCAweDE3LCAweEYyLCAweEVELCAweEQxLCAweEE5LCAweDg1LCAweDdDLAotICAgIDB4MUEsIDB4N0IsIDB4QkIsIDB4RDYsIDB4OUYsIDB4NkYsIDB4MUYsIDB4RkUsIDB4N0UsIDB4RkQsIDB4RjIsIDB4MTAsCi0gICAgMHg3RSwgMHg3RSwgMHg3RiwgMHhGQywgMHhGMSwgMHhDOCwgMHg3MiwgMHhGQSwgMHgzOSwgMHg5MSwgMHhGQiwgMHg0NCwKLSAgICAweDhFLCAweDE2LCAweEQxLCAweDU4LCAweDg0LCAweEIxLCAweEQyLCAweDRDLCAweDI0LCAweDlELCAweDA4LCAweEM5LAotICAgIDB4MDgsIDB4MDcsIDB4NDYsIDB4MjQsIDB4NzgsIDB4MTIsIDB4QkMsIDB4MDAsIDB4MzgsIDB4NTYsIDB4NkIsIDB4NjcsCi0gICAgMHg0QSwgMHhGOCwgMHg5QywgMHg1MSwgMHhEOSwgMHhDNywgMHg0NSwgMHg3OCwgMHhGRiwgMHg5RSwgMHhDMiwgMHgyRiwKLSAgICAweDZFLCAweEFFLCAweEU3LCAweEIyLCAweDJELCAweDExLCAweDExLCAweDE5LCAweDFCLCAweDIwLCAweDAxLCAweDZFLAotICAgIDB4RDgsIDB4NDIsIDB4NjUsIDB4MDYsIDB4MzYsIDB4NEQsIDB4MTksIDB4NkYsIDB4MDMsIDB4QzMsIDB4OTAsIDB4MjYsCi0gICAgMHg2NiwgMHg1OSwgMHg3MSwgMHhGMywgMHhERCwgMHg0NCwgMHg2MywgMHgzQSwgMHg0QiwgMHg2OCwgMHgzNCwgMHg5NiwKLSAgICAweEQ0LCAweEM4LCAweDA4LCAweDJGLCAweDExLCAweDZELCAweDM4LCAweDE3LCAweEYzLCAweDc2LCAweDgxLCAweDdGLAotICAgIDB4NzMsIDB4RUQsIDB4RTksIDB4MTksIDB4NUMsIDB4MzMsIDB4QTksIDB4MjQsIDB4MkUsIDB4MjMsIDB4NDQsIDB4QzYsCi0gICAgMHg2MywgMHhCOSwgMHg2QiwgMHgzRCwgMHhCMSwgMHhFQSwgMHhERSwgMHhEOSwgMHhFRCwgMHhDRSwgMHg5OSwgMHhGMCwKLSAgICAweDJBLCAweERGLCAweERBLCAweDk4LCAweDc3LCAweEIwLCAweENELCAweDk0LCAweEFGLCAweDM2LCAweENELCAweEU0LAotICAgIDB4ODIsIDB4NjEsIDB4MjYsIDB4MDgsIDB4NkUsIDB4OTksIDB4NjAsIDB4RUUsIDB4OTQsIDB4QkQsIDB4REEsIDB4MjUsCi0gICAgMHg5RiwgMHgyQywgMHhENCwgMHg2MywgMHgwNSwgMHgyQiwgMHhDNywgMHg2NywgMHgxMSwgMHhFMSwgMHg1RSwgMHgwMCwKLSAgICAweEFFLCAweEU2LCAweDUxLCAweDkxLCAweDc2LCAweEMyLCAweDk0LCAweEZCLCAweEFDLCAweDgxLCAweDgwLCAweDI1LAotICAgIDB4M0EsIDB4NDIsIDB4QTUsIDB4MjcsIDB4QTksIDB4MDYsIDB4NEUsIDB4NjksIDB4QUEsIDB4MjEsIDB4NzMsIDB4NzgsCi0gICAgMHhDQywgMHgwRCwgMHg1QSwgMHgwQywgMHhGNywgMHhBRiwgMHg0MSwgMHhCOCwgMHg2QSwgMHhBOSwgMHhENiwgMHg1RSwKLSAgICAweDZELCAweDBCLCAweDU1LCAweDlGLCAweEI2LCAweERFLCAweEEzLCAweEFELCAweEI3LCAweDY4LCAweEVCLCAweDFELAotICAgIDB4REEsIDB4N0EsIDB4NzcsIDB4QjYsIDB4REUsIDB4OUMsIDB4QUQsIDB4MzcsIDB4NjYsIDB4QjcsIDB4QjcsIDB4MDUsCi0gICAgMHhDNSwgMHg5OCwgMHhDRiwgMHg2OCwgMHg1NCwgMHhCRSwgMHg5MSwgMHgyQSwgMHg3NCwgMHhGNiwgMHg1QywgMHhGMCwKLSAgICAweEI3LCAweDBDLCAweDZBLCAweDNDLCAweDY3LCAweEE4LCAweDI1LCAweDcwLCAweEIzLCAweDAyLCAweDIwLCAweDU0LAotICAgIDB4MTIsIDB4NTUsIDB4MEQsIDB4NTYsIDB4RjAsIDB4N0MsIDB4RDksIDB4RTgsIDB4OTksIDB4QkQsIDB4QkQsIDB4MEYsCi0gICAgMHhGNywgMHhDRiwgMHhDMywgMHgyMiwgMHhFRiwgMHg5MCwgMHg5OSwgMHg4RSwgMHhFMiwgMHg0QSwgMHg5NiwgMHgwNywKLSAgICAweERBLCAweDM5LCAweDUyLCAweENDLCAweDkxLCAweEQwLCAweDIxLCAweDQ5LCAweDEyLCAweDJBLCAweEY5LCAweDcyLAotICAgIDB4OEYsIDB4QUIsIDB4QTgsIDB4M0MsIDB4OTgsIDB4RDIsIDB4MzAsIDB4QjQsIDB4OUMsIDB4NDMsIDB4QjgsIDB4RDAsCi0gICAgMHgwMSwgMHg3MiwgMHhFMSwgMHg0MiwgMHg2RiwgMHhFMCwgMHhDQSwgMHhBNywgMHhBRCwgMHg5OCwgMHg1QSwgMHgxOSwKLSAgICAweDI1LCAweDBDLCAweDA1LCAweDlGLCAweDU4LCAweENFLCAweERELCAweDM0LCAweEIwLCAweENGLCAweDRBLCAweDgyLAotICAgIDB4M0EsIDB4RjEsIDB4RTMsIDB4NDAsIDB4QzgsIDB4MDQsIDB4MTQsIDB4MDcsIDB4RDgsIDB4NzUsIDB4NzEsIDB4OEIsCi0gICAgMHgwMiwgMHgzNywgMHhBNiwgMHgwMywgMHgyMCwgMHg2MSwgMHg1MSwgMHg2RCwgMHhEQSwgMHg1QSwgMHhENCwgMHg5OCwKLSAgICAweDc2LCAweDMwLCAweEQ4LCAweDQ0LCAweDAxLCAweERBLCAweDg0LCAweDJFLCAweENFLCAweEZCLCAweEI4LCAweDQ2LAotICAgIDB4RDIsIDB4MkEsIDB4MzQsIDB4MDYsIDB4MUQsIDB4MEMsIDB4NzYsIDB4NUMsIDB4NzcsIDB4NjcsIDB4MzQsIDB4RUEsCi0gICAgMHgyNCwgMHg1OSwgMHhDRSwgMHg1OSwgMHgyQSwgMHgzQSwgMHhGMCwgMHhENSwgMHg5QywgMHg0QiwgMHg4NSwgMHg0MSwKLSAgICAweEM3LCAweDhELCAweEExLCAweDk0LCAweDRGLCAweDY3LCAweDgwLCAweDk1LCAweEJCLCAweDdDLCAweDRDLCAweERDLAotICAgIDB4RTksIDB4RTUsIDB4MjAsIDB4OEEsIDB4NDcsIDB4ODcsIDB4MDcsIDB4NDcsIDB4NTcsIDB4QUYsIDB4REYsIDB4MDUsCi0gICAgMHgyNywgMHhEOSwgMHg3OSwgMHhFMSwgMHg0QywgMHg5RCwgMHgwNCwgMHgzQSwgMHg5RSwgMHg0NiwgMHg2MywgMHgyQSwKLSAgICAweDZGLCAweEVELCAweDY5LCAweEM0LCAweEFBLCAweDEzLCAweEMwLCAweEUwLCAweEMxLCAweEY0LCAweDJDLCAweDI3LAotICAgIDB4REIsIDB4Q0EsIDB4QjIsIDB4OUUsIDB4OUQsIDB4NjUsIDB4NTksIDB4MUYsIDB4MzcsIDB4NzgsIDB4NDYsIDB4MjEsCi0gICAgMHgyNSwgMHhGNCwgMHg1MiwgMHgyOSwgMHgyOSwgMHhGNywgMHgxNiwgMHhBNSwgMHhCMiwgMHhENywgMHg0MywgMHgwRiwKLSAgICAweDNBLCAweDRBLCAweDY3LCAweDcwLCAweDc2LCAweDUwLCAweDlFLCAweDI4LCAweEU1LCAweDQ2LCAweDhCLCAweDBBLAotICAgIDB4NkIsIDB4QUQsIDB4NTcsIDB4ODUsIDB4Q0EsIDB4RTksIDB4MUEsIDB4QTEsIDB4MkEsIDB4RUIsIDB4NTMsIDB4MEYsCi0gICAgMHg0RSwgMHgzMywgMHhEOCwgMHhFRSwgMHhBRCwgMHg1MiwgMHg1RiwgMHhBNCwgMHg3NSwgMHg3NSwgMHhGNSwgMHg2RiwKLSAgICAweDJCLCAweEQyLCAweDE5LCAweENCLCAweEI3LCAweEZBLCAweEU3LCAweEE3LCAweDRFLCAweDgyLCAweEFBLCAweEVELAotICAgIDB4OEQsIDB4NEUsIDB4RjQsIDB4ODgsIDB4RjEsIDB4MzQsIDB4QjYsIDB4OUMsIDB4RUQsIDB4NEUsIDB4RTQsIDB4OEMsCi0gICAgMHg0QSwgMHg2MSwgMHgzOSwgMHg4RiwgMHg0RCwgMHgyRSwgMHg2RSwgMHhDRSwgMHgwRCwgMHg0OCwgMHg2OSwgMHg3QywKLSAgICAweDY1LCAweDQ1LCAweDEzLCAweDI4LCAweDlGLCAweEIwLCAweDY1LCAweDYwLCAweDM5LCAweEJGLCAweERFLCAweDdGLAotICAgIDB4ODYsIDB4NjMsIDB4QTIsIDB4QzEsIDB4MzAsIDB4OEIsIDB4MjgsIDB4MEQsIDB4OEIsIDB4NDUsIDB4QkUsIDB4ODAsCi0gICAgMHhEMywgMHhFMSwgMHhFNSwgMHg2OSwgMHg2NywgMHg1MSwgMHhERCwgMHg3NSwgMHg1MywgMHg4MiwgMHhGNSwgMHg2RSwKLSAgICAweEYzLCAweEQ3LCAweDYxLCAweDMxLCAweEEzLCAweDE3LCAweEM0LCAweENCLCAweDRGLCAweEJFLCAweDcyLCAweEE5LAotICAgIDB4NkEsIDB4QjksIDB4MEIsIDB4RjgsIDB4RkEsIDB4RjEsIDB4RDEsIDB4MTAsIDB4QkMsIDB4QzAsIDB4NzUsIDB4NjYsCi0gICAgMHg5OSwgMHg2NiwgMHg5QywgMHgwOSwgMHhCRSwgMHgzMiwgMHhCRCwgMHgyRiwgMHhEMiwgMHhGQywgMHgzQiwgMHgwOCwKLSAgICAweDhELCAweDEyLCAweEJGLCAweDM1LCAweEJGLCAweEU3LCAweDhCLCAweDMxLCAweDQ1LCAweDQzLCAweEY2LCAweDFGLAotICAgIDB4QzIsIDB4ODAsIDB4QzIsIDB4NTcsIDB4QzYsIDB4RDUsIDB4MUEsIDB4QzIsIDB4OUUsIDB4MjQsIDB4NjMsIDB4NzgsCi0gICAgMHg2MywgMHg1NiwgMHgxMywgMHhDRSwgMHgwMiwgMHhDMiwgMHg1QSwgMHhEMywgMHgyNywgMHgyMiwgMHg0QiwgMHgyRiwKLSAgICAweDA5LCAweDNBLCAweDE2LCAweDQ5LCAweEMwLCAweEJDLCAweDdDLCAweDhFLCAweEVELCAweDU3LCAweDRGLCAweDkxLAotICAgIDB4QkIsIDB4OEUsIDB4MEEsIDB4MjMsIDB4N0IsIDB4ODEsIDB4MjgsIDB4QTksIDB4QTcsIDB4NkIsIDB4NkUsIDB4MEEsCi0gICAgMHhDQywgMHg0OSwgMHgzRSwgMHgxOSwgMHg3QSwgMHhCRSwgMHg4NiwgMHgzNCwgMHgxMiwgMHgxRCwgMHg0OCwgMHhFRSwKLSAgICAweDIyLCAweEU1LCAweDkzLCAweEE5LCAweDU4LCAweEYyLCAweDU0LCAweDczLCAweEY4LCAweDc2LCAweENGLCAweEYyLAotICAgIDB4QTgsIDB4RjgsIDB4RDIsIDB4ODUsIDB4RTUsIDB4M0YsIDB4NUQsIDB4NDksIDB4QkUsIDB4MUJ9OwotY29uc3QgdWludDhfdCBnX2l0SVRfTG9jYWxlW10gPSB7Ci0gICAgMHg3OCwgMHg5QywgMHg5NSwgMHg1NiwgMHhEMSwgMHg2QSwgMHhENCwgMHg0MCwgMHgxNCwgMHg3RCwgMHgxNywgMHhGQywKLSAgICAweDg3LCAweDIxLCAweDU4LCAweDUwLCAweDY4LCAweDNCLCAweEZBLCAweEQ4LCAweDkyLCAweDA2LCAweDRBLCAweDVCLAotICAgIDB4QkIsIDB4QTUsIDB4NDYsIDB4OTYsIDB4RUUsIDB4QUEsIDB4RDgsIDB4MTcsIDB4OTksIDB4NjQsIDB4QTYsIDB4RDksCi0gICAgMHhCMSwgMHhDOSwgMHhDQywgMHgzMiwgMHg0OSwgMHg1QSwgMHg5MiwgMHg0NywgMHhGMSwgMHhDMSwgMHgzNywgMHg3RiwKLSAgICAweDQyLCAweDEwLCAweDQxLCAweEYxLCAweDIzLCAweEZDLCAweDEzLCAweEExLCAweEUyLCAweDY3LCAweDc4LCAweEIzLAotICAgIDB4OTksIDB4QTQsIDB4QzksIDB4NjQsIDB4QkEsIDB4QTYsIDB4NzksIDB4RDksIDB4QjksIDB4RTcsIDB4OUUsIDB4NzMsCi0gICAgMHg3MywgMHhFRiwgMHg5OSwgMHg2NCwgMHgzNiwgMHg2RSwgMHgyQywgMHg0MywgMHgxMiwgMHgzMywgMHgyNCwgMHg0OCwKLSAgICAweEMyLCAweEY2LCAweDFDLCAweDlFLCAweEJELCAweDNCLCAweDk5LCAweDNCLCAweDg4LCAweEIyLCAweDM0LCAweERDLAotICAgIDB4NzMsIDB4RkUsIDB4N0MsIDB4RkMsIDB4N0MsIDB4RjMsIDB4RTUsIDB4RUIsIDB4Q0QsIDB4QTcsIDB4NkYsIDB4N0YsCi0gICAgMHg3RiwgMHhGRSwgMHg3OCwgMHhEQywgMHgwNiwgMHg0RiwgMHgxQywgMHhDRiwgMHhBRCwgMHgxNCwgMHg4MiwgMHgxMiwKLSAgICAweDM1LCAweDJCLCAweDkyLCAweDQwLCAweEM2LCAweEE5LCAweDE2LCAweDQ3LCAweDhBLCAweDQ1LCAweDUyLCAweDcxLAotICAgIDB4MjIsIDB4ODAsIDB4OTEsIDB4NDgsIDB4OTEsIDB4MkQsIDB4NUUsIDB4MDIsIDB4OUMsIDB4RUEsIDB4QjUsIDB4MTcsCi0gICAgMHgzMSwgMHgyMSwgMHgwOCwgMHg5NywgMHgyRSwgMHhBRSwgMHhDMywgMHg4NywgMHgwRiwgMHgzNCwgMHg3RSwgMHhDMSwKLSAgICAweDgyLCAweDQwLCAweEQ5LCAweDEyLCAweDA5LCAweDUxLCAweEU1LCAweDEwLCAweDI1LCAweDRCLCAweEM1LCAweDYzLAotICAgIDB4NjYsIDB4MjEsIDB4NDcsIDB4OTEsIDB4QTUsIDB4NDYsIDB4QzQsIDB4RjMsIDB4NDgsIDB4MEMsIDB4RTEsIDB4MzgsCi0gICAgMHg4RiwgMHg2MiwgMHgwQiwgMHg5QiwgMHg0NCwgMHgzMiwgMHhDRCwgMHg4NiwgMHg3MCwgMHhDQSwgMHhCMiwgMHg4QywKLSAgICAweDI1LCAweDgxLCAweDFBLCAweERFLCAweDU1LCAweDY2LCAweDk5LCAweEI0LCAweEUxLCAweDQyLCAweDVFLCAweEQ5LAotICAgIDB4MDUsIDB4OTQsIDB4ODcsIDB4NjYsIDB4MDIsIDB4NzcsIDB4QUMsIDB4NkEsIDB4NzgsIDB4QUIsIDB4MDgsIDB4MTEsCi0gICAgMHgzMCwgMHg2NiwgMHhDRiwgMHg3OSwgMHhFNiwgMHg3NCwgMHgxQywgMHhCNCwgMHhCOSwgMHg2NywgMHgzMywgMHhDRSwKLSAgICAweDY2LCAweDlCLCAweENELCAweDMzLCAweDlCLCAweDYxLCAweDM2LCAweEI3LCAweDZDLCAweDU2LCAweEQ5LCAweDdDLAotICAgIDB4QjIsIDB4MzksIDB4NjQsIDB4NzMsIDB4QzcsIDB4NjYsIDB4Q0MsIDB4REQsIDB4OUUsIDB4NTAsIDB4NTIsIDB4RTgsCi0gICAgMHg0NywgMHgwOSwgMHg1NiwgMHgxRSwgMHg5NSwgMHgwOSwgMHgxMywgMHgzQywgMHgyNCwgMHgyRSwgMHhBRSwgMHhBMiwKLSAgICAweDNBLCAweDBELCAweDNELCAweDBBLCAweDQ2LCAweDdGLCAweDdELCAweEVGLCAweDYxLCAweEUwLCAweDQzLCAweDM2LAotICAgIDB4MDQsIDB4OTksIDB4MEEsIDB4NjUsIDB4M0MsIDB4ODAsIDB4RTEsIDB4RTEsIDB4QjksIDB4MUEsIDB4ODAsIDB4NTcsCi0gICAgMHg0QywgMHgzMCwgMHg2NSwgMHg4MiwgMHgyOSwgMHgwOSwgMHg0OCwgMHhGNSwgMHg5MCwgMHg2OCwgMHgwOCwgMHhCNywKLSAgICAweENELCAweDc1LCAweDFBLCAweEVELCAweDZDLCAweDlELCAweEVFLCAweEQ4LCAweDZDLCAweEQ2LCAweDZDLCAweEQ0LAotICAgIDB4RUMsIDB4RDEsIDB4NkMsIDB4Q0UsIDB4RUMsIDB4Q0IsIDB4NkMsIDB4QzksIDB4REUsIDB4MEYsIDB4MTQsIDB4RTIsCi0gICAgMHg5NCwgMHhCMywgMHhBNCwgMHg3OSwgMHgxMSwgMHg3NSwgMHhFOCwgMHhFRCwgMHhGQiwgMHg2MCwgMHg3MSwgMHgxMywKLSAgICAweDc0LCAweDc4LCAweERFLCAweEQ0LCAweDQ4LCAweEUwLCAweDdFLCAweDA1LCAweDQwLCAweDk4LCAweDIyLCAweEJBLAotICAgIDB4MUEsIDB4QUMsIDB4M0MsIDB4NzIsIDB4RTAsIDB4RTIsIDB4RUEsIDB4QjcsIDB4NEUsIDB4NzgsIDB4RjQsIDB4MzYsCi0gICAgMHhDNCwgMHgyRCwgMHhCMSwgMHgwQSwgMHg4QywgMHgwMywgMHhBMywgMHg2RSwgMHgzQywgMHg2MywgMHg1MywgMHgwMiwKLSAgICAweDZGLCAweDk2LCAweDEyLCAweEFCLCAweDhELCAweDZELCAweDIzLCAweDdELCAweDlBLCAweDVDLCAweEU0LCAweDcxLAotICAgIDB4RUMsIDB4NzgsIDB4NDcsIDB4NzAsIDB4QTEsIDB4NDMsIDB4RTQsIDB4QzMsIDB4ODUsIDB4REUsIDB4QzIsIDB4NTUsCi0gICAgMHhDRCwgMHhENywgMHgzMiwgMHg4RCwgMHgzMiwgMHg1QSwgMHgxOCwgMHg0QiwgMHgxMSwgMHgzOSwgMHhERSwgMHhFMSwKLSAgICAweEZELCAweDQ0LCAweDA5LCAweEEzLCAweDk1LCAweDA2LCAweDgzLCAweDA0LCAweDhGLCAweDEyLCAweEE0LCAweDBCLAotICAgIDB4QTksIDB4MzIsIDB4MkQsIDB4QjEsIDB4MjksIDB4NzAsIDB4NkYsIDB4M0UsIDB4MDAsIDB4MzIsIDB4OUUsIDB4NzQsCi0gICAgMHhFNiwgMHhFRCwgMHg0NCwgMHhCRCwgMHg3OSwgMHgyNywgMHg5MywgMHg1RCwgMHhERiwgMHhERiwgMHg5RCwgMHhDRCwKLSAgICAweEQwLCAweEI5LCAweDhCLCAweDNCLCAweDFDLCAweEEzLCAweDQwLCAweDZGLCAweEQyLCAweEZCLCAweDI4LCAweDU2LAotICAgIDB4NjMsIDB4MzYsIDB4RjcsIDB4MTgsIDB4QzEsIDB4RDcsIDB4NTMsIDB4QUUsIDB4MTQsIDB4MDMsIDB4M0EsIDB4RUUsCi0gICAgMHg4RCwgMHhBNCwgMHg1RCwgMHg5QSwgMHgwMywgMHhENiwgMHhFQywgMHhGMiwgMHg3MSwgMHhFMSwgMHhEMywgMHhDQiwKLSAgICAweDQ5LCAweDkyLCAweENFLCAweDhFLCAweDBFLCAweDlGLCAweDVGLCAweEJGLCAweDIxLCAweDhCLCAweEQzLCAweEYyLAotICAgIDB4QkMsIDB4RjYsIDB4QTUsIDB4NEIsIDB4MDIsIDB4OUQsIDB4QzgsIDB4OTMsIDB4ODAsIDB4QTksIDB4NUIsIDB4NzMsCi0gICAgMHg3QSwgMHhCMSwgMHhFRSwgMHgwNCwgMHgzMCwgMHg3OCwgMHgxNCwgMHg0MywgMHhDNywgMHgyQiwgMHgzNywgMHhDQiwKLSAgICAweDcyLCAweDY3LCAweEJCLCAweDJDLCAweDRCLCAweDE3LCAweEY3LCAweDc4LCAweDgzLCAweDQyLCAweDVBLCAweDE4LAotICAgIDB4RTYsIDB4NEEsIDB4MzEsIDB4MTEsIDB4MTYsIDB4OEUsIDB4RjcsIDB4MDgsIDB4RDUsIDB4REEsIDB4OUQsIDB4OUQsCi0gICAgMHg5MSwgMHhEMiwgMHgyNSwgMHg5QywgMHgxNSwgMHg0QywgMHg2NCwgMHhGQSwgMHg5RSwgMHgxQiwgMHgxNiwgMHgxNSwKLSAgICAweDM2LCAweDVBLCAweDZGLCAweDBCLCAweDM1LCAweEQzLCAweEY1LCAweDQyLCAweDVELCAweDk2LCAweEIyLCAweDkwLAotICAgIDB4MjcsIDB4MDQsIDB4MzYsIDB4N0IsIDB4QjMsIDB4RDEsIDB4RDcsIDB4NjksIDB4NTMsIDB4REQsIDB4RkUsIDB4QUQsCi0gICAgMHhDQSwgMHg3QywgMHhDOSwgMHhBQiwgMHg5RCwgMHhERSwgMHgxRSwgMHhDNSwgMHg2RiwgMHhCQiwgMHhERSwgMHgxOCwKLSAgICAweDQ1LCAweDRGLCAweEI4LCAweEM4LCAweDUzLCAweEM3LCAweERCLCAweDFBLCAweDQ1LCAweDJFLCAweDk5LCAweDkyLAotICAgIDB4OEUsIDB4RjcsIDB4NzQsIDB4QzgsIDB4QzUsIDB4RkQsIDB4QjEsIDB4MDEsIDB4NjksIDB4N0MsIDB4NkYsIDB4OUQsCi0gICAgMHhFOCwgMHgwMywgMHhDRCwgMHgwMywgMHhCNiwgMHgwQSwgMHgxQywgMHhFRiwgMHhGNywgMHgwNywgMHgzOCwgMHg2NSwKLSAgICAweEZCLCAweDhDLCAweDYxLCAweDkxLCAweEU2LCAweDIzLCAweDI1LCAweDk1LCAweEQ1LCAweDAyLCAweDBFLCAweDg3LAotICAgIDB4NTcsIDB4NjcsIDB4QTMsIDB4NDUsIDB4NUQsIDB4RDMsIDB4ODcsIDB4MTIsIDB4NkMsIDB4NzYsIDB4NUIsIDB4QkQsCi0gICAgMHgwRCwgMHhDNSwgMHg5MiwgMHg1RCwgMHg5MCwgMHhCMCwgMHgzQSwgMHhFQSwgMHg5QSwgMHhBNSwgMHhBRSwgMHhFNSwKLSAgICAweDE3LCAweEYwLCAweDk1LCAweDQzLCAweEQxLCAweDE0LCAweEJDLCAweEMwLCAweDVELCAweDY2LCAweDkzLCAweEU2LAotICAgIDB4ODIsIDB4NEIsIDB4NzEsIDB4NjcsIDB4RkEsIDB4NDAsIDB4RTYsIDB4OEEsIDB4MzMsIDB4ODUsIDB4NjYsIDB4MTksCi0gICAgMHhCNSwgMHhFNiwgMHhGNywgMHhBOSwgMHgwQywgMHgxOCwgMHg5QSwgMHhGMiwgMHhGRiwgMHgxMCwgMHgyNiwgMHgwQywKLSAgICAweEJFLCAweDIzLCAweEFFLCAweEQ3LCAweDEwLCAweEY2LCAweDE1LCAweDA5LCAweEUwLCAweDg1LCAweEI5LCAweDlCLAotICAgIDB4MzAsIDB4NUYsIDB4MTAsIDB4NkUsIDB4NEQsIDB4OUYsIDB4Q0EsIDB4MzIsIDB4QkYsIDB4MjQsIDB4RTgsIDB4NTgsCi0gICAgMHg2NiwgMHgwQiwgMHgxRSwgMHg1NiwgMHg3MywgMHg2QywgMHhCRCwgMHgzRSwgMHg0MSwgMHhGRSwgMHgzQSwgMHgyQSwKLSAgICAweDhDLCAweDFDLCAweDJFLCAweDY0LCAweDQzLCAweDNELCAweDVCLCAweDczLCAweDUzLCAweDYwLCAweDQ2LCAweEQ1LAotICAgIDB4NjQsIDB4RTgsIDB4QzUsIDB4MUEsIDB4RDIsIDB4NEMsIDB4OEUsIDB4MjAsIDB4RjksIDB4NDUsIDB4MkUsIDB4QTIsCi0gICAgMHhGNywgMHg3MiwgMHhDNSwgMHhEMywgMHhDRCwgMHhFMSwgMHhEQiwgMHgzRCwgMHhBQiwgMHhBMiwgMHhGQSwgMHhEMywKLSAgICAweDE2LCAweDk2LCAweEZGLCAweDAwLCAweDIwLCAweDhCLCAweEJFLCAweEY3fTsKLWNvbnN0IHVpbnQ4X3QgZ19wdEJSX0xvY2FsZVtdID0gewotICAgIDB4NzgsIDB4OUMsIDB4OUQsIDB4NTYsIDB4M0QsIDB4NkYsIDB4RDQsIDB4NDAsIDB4MTAsIDB4QUQsIDB4ODMsIDB4QzQsCi0gICAgMHg3RiwgMHg1OCwgMHg1OSwgMHg4OSwgMHgwRSwgMHhBNCwgMHgyNCwgMHg4NiwgMHg5MiwgMHhDOCwgMHg2NywgMHhFOSwKLSAgICAweDkyLCAweDBCLCAweDM5LCAweDk0LCAweDE4LCAweDlELCAweENFLCAweDExLCAweDg4LCAweDM0LCAweDY4LCAweDZELAotICAgIDB4RUYsIDB4RDksIDB4OUIsIDB4RDgsIDB4QkIsIDB4QzcsIDB4REEsIDB4NEUsIDB4QjAsIDB4NkIsIDB4MUEsIDB4M0EsCi0gICAgMHgyOCwgMHgyOSwgMHg1MywgMHgyMCwgMHgyQSwgMHg0NCwgMHg4MywgMHg0NCwgMHg0OSwgMHg5MSwgMHhERiwgMHg4MiwKLSAgICAweEI4LCAweDlGLCAweEMxLCAweEZBLCAweEYzLCAweEZDLCAweEIxLCAweDM2LCAweDA2LCAweDM3LCAweERFLCAweDk5LAotICAgIDB4NzksIDB4NkYsIDB4M0QsIDB4RjMsIDB4NzYsIDB4NzYsIDB4NjQsIDB4QzUsIDB4QTUsIDB4MjYsIDB4NzQsIDB4MTEsCi0gICAgMHgyMCwgMHhEMCwgMHg0MywgMHg2MywgMHg2OSwgMHgxNSwgMHhCQywgMHgzRSwgMHg1QywgMHg0OCwgMHhDMCwgMHg0MiwKLSAgICAweEJFLCAweDM5LCAweDk2LCAweEQ2LCAweDFGLCAweDZGLCAweEQ3LCAweDFGLCAweERFLCAweEZELCAweDdFLCAweEZGLAotICAgIDB4NjksIDB4RkQsIDB4RUQsIDB4RUIsIDB4ODMsIDB4NUYsIDB4M0YsIDB4QkUsIDB4QUYsIDB4M0YsIDB4RkYsIDB4N0MsCi0gICAgMHgyOCwgMHhBOSwgMHhGNywgMHhFRiwgMHgwMSwgMHhBMCwgMHgyNCwgMHgxNCwgMHg2MiwgMHg0MSwgMHhBNiwgMHg0NywKLSAgICAweDlFLCAweDQxLCAweDVELCAweDNGLCAweDY3LCAweERCLCAweDBDLCAweEQ5LCAweDk0LCAweDYxLCAweDQ4LCAweDEyLAotICAgIDB4RDQsIDB4MTYsIDB4NTAsIDB4M0MsIDB4NEEsIDB4MDIsIDB4RTcsIDB4MzksIDB4MEYsIDB4RjksIDB4ODksIDB4QkQsCi0gICAgMHg5NSwgMHhEOSwgMHhFQSwgMHgyNSwgMHgyNCwgMHgwOCwgMHgzMywgMHhBQSwgMHhDOCwgMHg5OSwgMHg1OSwgMHg4OSwKLSAgICAweDJDLCAweEQxLCAweDM1LCAweDYyLCAweDFELCAweDMxLCAweDBGLCAweEIyLCAweEJCLCAweDJGLCAweEEyLCAweDAwLAotICAgIDB4MzQsIDB4MTgsIDB4NzYsIDB4ODUsIDB4MDQsIDB4MkMsIDB4ODIsIDB4NUYsIDB4ODYsIDB4QzQsIDB4MTEsIDB4RkIsCi0gICAgMHg1RCwgMHhBMSwgMHgxRiwgMHhEQSwgMHhENCwgMHgwRiwgMHg0NCwgMHgwMSwgMHgxRiwgMHgwNSwgMHhDOCwgMHgzMywKLSAgICAweDg0LCAweEI5LCAweEQyLCAweDMwLCAweDA4LCAweEM1LCAweDExLCAweDQyLCAweEFGLCAweEJCLCAweDQ4LCAweDE2LAotICAgIDB4OEEsIDB4OUIsIDB4MjEsIDB4OTAsIDB4QUYsIDB4NEIsIDB4MDksIDB4QUIsIDB4OTIsIDB4MDIsIDB4NjgsIDB4MTgsCi0gICAgMHg2QywgMHgyQywgMHgzRCwgMHg5NiwgMHgxQSwgMHhEQSwgMHg4QSwgMHg3NSwgMHgxNSwgMHgyQiwgMHgyQSwgMHg5NiwKLSAgICAweDUzLCAweDJDLCAweEE2LCAweDU4LCAweDRCLCAweEIxLCAweDkyLCAweDYyLCAweDFELCAweEM1LCAweDIyLCAweDhBLAotICAgIDB4RjUsIDB4MTMsIDB4NkIsIDB4MjcsIDB4OTYsIDB4QUQsIDB4NUYsIDB4MzEsIDB4MEIsIDB4NDYsIDB4OTUsIDB4MTYsCi0gICAgMHhFNCwgMHg5NiwgMHg2QSwgMHg1MSwgMHgwRiwgMHg5MywgMHgyNCwgMHg5RCwgMHhDNCwgMHgyOCwgMHhCRCwgMHgzRSwKLSAgICAweEIyLCAweDQzLCAweERFLCAweEQyLCAweDdCLCAweDRCLCAweERFLCAweDgwLCAweEIwLCAweDExLCAweDBCLCAweDEwLAotICAgIDB4NkYsIDB4M0UsIDB4NzEsIDB4RTgsIDB4NEQsIDB4MDgsIDB4NTksIDB4RDAsIDB4MTUsIDB4QzIsIDB4QTQsIDB4MjMsCi0gICAgMHhFNCwgMHhBMywgMHhCNywgMHg1RCwgMHg5MSwgMHhCQiwgMHg1QiwgMHgwMywgMHg1QSwgMHg5QiwgMHhFNCwgMHg0MCwKLSAgICAweEJBLCAweDEyLCAweEQ0LCAweEQzLCAweDM4LCAweEZGLCAweEJDLCAweEIwLCAweDc2LCAweDUxLCAweEVELCAweDUyLAotICAgIDB4REEsIDB4MTUsIDB4QjQsIDB4MTMsIDB4NkYsIDB4RTcsIDB4MkIsIDB4QzgsIDB4QjMsIDB4M0IsIDB4NDksIDB4MEYsCi0gICAgMHgzMSwgMHg2QywgMHg2MSwgMHhFNCwgMHg1NSwgMHgyRiwgMHg3RiwgMHhFRSwgMHg1MiwgMHgyNywgMHgxQSwgMHgzRiwKLSAgICAweEE0LCAweEMyLCAweEE4LCAweDg3LCAweEU2LCAweDhELCAweDEwLCAweEQ4LCAweDk4LCAweDk1LCAweENELCAweDExLAotICAgIDB4ODMsIDB4OTUsIDB4N0QsIDB4QjksIDB4QTUsIDB4MUUsIDB4MUUsIDB4MjksIDB4NzIsIDB4RjIsIDB4MkUsIDB4MUQsCi0gICAgMHg5MywgMHg2OSwgMHhFOSwgMHgwMCwgMHhFOSwgMHhBQSwgMHgyMCwgMHhGMCwgMHhEOSwgMHgyNSwgMHgzNywgMHg4NiwKLSAgICAweDU3LCAweEU2LCAweEI1LCAweDYwLCAweDgwLCAweEU2LCAweDMwLCAweEUwLCAweEYyLCAweDkwLCAweDUyLCAweEU4LAotICAgIDB4RDIsIDB4OTMsIDB4Q0YsIDB4QjcsIDB4NjUsIDB4RTgsIDB4QkEsIDB4OTIsIDB4N0EsIDB4Q0MsIDB4OUYsIDB4NUQsCi0gICAgMHgzMCwgMHgxRCwgMHhGMSwgMHgyOSwgMHgwOSwgMHg0NiwgMHgxQSwgMHg3RiwgMHhCMiwgMHhENSwgMHgyQiwgMHhGRSwKLSAgICAweDI0LCAweDMyLCAweDk0LCAweEE0LCAweEFFLCAweDVELCAweDVDLCAweDRBLCAweDZDLCAweDQ5LCAweEZELCAweDdGLAotICAgIDB4QkUsIDB4ODcsIDB4MkMsIDB4NEUsIDB4OUYsIDB4Q0EsIDB4OUEsIDB4MjYsIDB4MEYsIDB4RTYsIDB4RjgsIDB4MEUsCi0gICAgMHg2NSwgMHhDMSwgMHg4NiwgMHhENSwgMHhFNCwgMHgwMCwgMHg1MCwgMHhGMywgMHhFNCwgMHg5MiwgMHgwNCwgMHhEOCwKLSAgICAweDZCLCAweDQ4LCAweDUyLCAweEYxLCAweEQ0LCAweDI0LCAweDk5LCAweENELCAweDQ2LCAweDBFLCAweDJGLCAweDY1LAotICAgIDB4QzQsIDB4RUYsIDB4RDUsIDB4NDgsIDB4RDcsIDB4NDcsIDB4RkUsIDB4MDgsIDB4NUMsIDB4MjgsIDB4NzIsIDB4MDUsCi0gICAgMHhEQywgMHhDNSwgMHhDRSwgMHhBNCwgMHg0OCwgMHhDOSwgMHgxOSwgMHg3NywgMHgzOCwgMHgzNSwgMHg1NSwgMHg2MSwKLSAgICAweDM2LCAweDNCLCAweEQwLCAweEI0LCAweDAzLCAweDVELCAweDFGLCAweEM0LCAweEM4LCAweDM1LCAweDQ4LCAweDM5LAotICAgIDB4NEQsIDB4NDIsIDB4MjIsIDB4NDAsIDB4QTMsIDB4REMsIDB4QkMsIDB4MjcsIDB4Q0UsIDB4QjksIDB4QjcsIDB4NjgsCi0gICAgMHg5NCwgMHg5MywgMHg0OCwgMHhCMywgMHhBRSwgMHg2NiwgMHg5RSwgMHhBRiwgMHgxRiwgMHg0RiwgMHg5RiwgMHhERSwKLSAgICAweEJDLCAweDg0LCAweENFLCAweDY5LCAweDdDLCAweDkxLCAweEU5LCAweDU2LCAweDA1LCAweEE1LCAweDRDLCAweDEyLAotICAgIDB4N0EsIDB4MDYsIDB4NjIsIDB4NzUsIDB4RjEsIDB4NkEsIDB4QkUsIDB4M0MsIDB4MjcsIDB4RUUsIDB4RTMsIDB4RkQsCi0gICAgMHg2RCwgMHg0QSwgMHg2QSwgMHhCQywgMHgxQiwgMHhDNywgMHg0RiwgMHhGNiwgMHhFMywgMHg5OCwgMHgwRiwgMHhCMywKLSAgICAweDFBLCAweEFFLCAweDlCLCAweDZBLCAweDg2LCAweDhDLCAweDIxLCAweDYyLCAweDQ2LCAweDkyLCAweEJBLCAweDBELAotICAgIDB4MEEsIDB4RjYsIDB4NjAsIDB4RjIsIDB4MEEsIDB4MzEsIDB4MTMsIDB4OTEsIDB4MjAsIDB4RkYsIDB4RUUsIDB4NEUsCi0gICAgMHg5QiwgMHg5NywgMHgwOCwgMHhEMiwgMHgyQSwgMHhBMiwgMHgyQywgMHg2QywgMHg1MywgMHhFQiwgMHg1NiwgMHhERCwKLSAgICAweDk1LCAweDZGLCAweDZGLCAweDIxLCAweDEzLCAweDdCLCAweDkwLCAweDM3LCAweEM2LCAweDZFLCAweEIxLCAweDRCLAotICAgIDB4MTYsIDB4RUUsIDB4MjQsIDB4RDgsIDB4OEMsIDB4ODYsIDB4MkIsIDB4OUMsIDB4MzQsIDB4QzMsIDB4RkUsIDB4NDAsCi0gICAgMHg0NiwgMHg1OSwgMHhDMSwgMHhDRSwgMHg0MCwgMHgwMiwgMHhFRiwgMHhBRiwgMHhEMCwgMHg5NywgMHhENCwgMHhCRCwKLSAgICAweDgxLCAweEYwLCAweDE4LCAweDMxLCAweDJBLCAweEE5LCAweDhGLCAweDVBLCAweEU4LCAweDhELCAweDMwLCAweEI1LAotICAgIDB4MDMsIDB4MkYsIDB4NEUsIDB4QTMsIDB4QTYsIDB4NEMsIDB4REQsIDB4NTksIDB4QjQsIDB4NjEsIDB4NkEsIDB4NDgsCi0gICAgMHhFQSwgMHg2MiwgMHg5QiwgMHg0RiwgMHhBMiwgMHgxQSwgMHhBMCwgMHg4NywgMHg4NCwgMHg3RCwgMHg5QSwgMHgyQywKLSAgICAweDI0LCAweEY1LCAweDcwLCAweDcxLCAweEY2LCAweDBGLCAweEI0LCAweEVBLCAweDM5LCAweEI0LCAweDQ4LCAweEU5LAotICAgIDB4MjgsIDB4NkMsIDB4QTUsIDB4OUQsIDB4REMsIDB4RkIsIDB4NjgsIDB4ODUsIDB4OTYsIDB4RDAsIDB4MkMsIDB4QzYsCi0gICAgMHg2RCwgMHg2MSwgMHhFNiwgMHg3QiwgMHg2QSwgMHgxMSwgMHhGRiwgMHhDMywgMHhCMywgMHhDMCwgMHg5QywgMHhDQiwKLSAgICAweDIzLCAweDhCLCAweDAxLCAweDk4LCAweDYwLCAweDRBLCAweDdBLCAweDAwLCAweDQ3LCAweDM0LCAweDY0LCAweDE4LAotICAgIDB4MzEsIDB4QTAsIDB4MDcsIDB4NTYsIDB4MDcsIDB4NjIsIDB4NjIsIDB4NTEsIDB4MDMsIDB4ODEsIDB4MzksIDB4RkUsCi0gICAgMHgyQiwgMHg2NCwgMHg4NiwgMHgwQywgMHg4NiwgMHg2RSwgMHg3QSwgMHgyMSwgMHgxMywgMHgwNiwgMHgwRCwgMHg3RSwKLSAgICAweEMzLCAweEZBLCAweDIwLCAweEU3LCAweDBFLCAweEM0LCAweDFELCAweDgwLCAweDUzLCAweDFBLCAweDg3LCAweDU3LAotICAgIDB4MTAsIDB4OUMsIDB4RDAsIDB4QzAsIDB4QzEsIDB4NjYsIDB4NTIsIDB4RDMsIDB4REUsIDB4OEIsIDB4NjcsIDB4NDAsCi0gICAgMHhFQiwgMHgwNywgMHg3MywgMHgwMSwgMHg0QywgMHg4NywgMHgxNiwgMHhFMCwgMHg0NSwgMHhFRiwgMHhBNywgMHgzOSwKLSAgICAweEQ2LCAweDRFLCAweEFBLCAweDA0LCAweDY3LCAweEJELCAweDMwLCAweDlELCAweDBFLCAweDgyLCAweDY5LCAweDUxLAotICAgIDB4NDgsIDB4RUMsIDB4NEIsIDB4OUEsIDB4MjIsIDB4QjMsIDB4MjQsIDB4RDMsIDB4QzEsIDB4NTYsIDB4MzksIDB4NEYsCi0gICAgMHg0NSwgMHhDRSwgMHhGRSwgMHhGNywgMHhENSwgMHgzRiwgMHgzMCwgMHhCQiwgMHhEOSwgMHg5Qn07Ci1jb25zdCB1aW50OF90IGdfbmxOTF9Mb2NhbGVbXSA9IHsKLSAgICAweDc4LCAweDlDLCAweDk1LCAweDU2LCAweDRELCAweDRGLCAweERDLCAweDMwLCAweDEwLCAweDNELCAweDUzLCAweEE5LAotICAgIDB4RkYsIDB4QzEsIDB4OEEsIDB4OEEsIDB4NjgsIDB4MjUsIDB4OTYsIDB4MkQsIDB4NDcsIDB4NTAsIDB4ODgsIDB4QjQsCi0gICAgMHgwNSwgMHgwQSwgMHgxNSwgMHgwNCwgMHhBRCwgMHg1OCwgMHhEQSwgMHhBQSwgMHg1QywgMHgyQSwgMHg2RiwgMHg2MiwKLSAgICAweDc2LCAweEJELCAweDI0LCAweEY2LCAweENBLCAweDg5LCAweDQxLCAweEM5LCAweEIxLCAweDUyLCAweDhGLCAweEZELAotICAgIDB4MjcsIDB4QUQsIDB4REEsIDB4NUIsIDB4RkYsIDB4NEYsIDB4QTUsIDB4NEEsIDB4RkMsIDB4OEMsIDB4OEUsIDB4RjMsCi0gICAgMHg0NSwgMHgxMiwgMHgzQiwgMHg2OSwgMHhDOCwgMHgwNSwgMHhDRiwgMHg5QiwgMHhGNywgMHhCQywgMHgzMywgMHhDRiwKLSAgICAweENFLCAweDEwLCAweDNCLCAweEUwLCAweDFFLCAweDBFLCAweDA4LCAweDYyLCAweDM4LCAweDI0LCAweDA3LCAweDE2LAotICAgIDB4MEIsIDB4M0UsIDB4NUYsIDB4OUMsIDB4NUIsIDB4QzgsIDB4MjcsIDB4OTEsIDB4NzcsIDB4NjAsIDB4M0QsIDB4N0MsCi0gICAgMHhGQiwgMHhGRCwgMHhGNywgMHhFQiwgMHhBRiwgMHg4NywgMHg5RiwgMHgzRiwgMHg1RSwgMHhFNiwgMHhBQiwgMHg1NywKLSAgICAweDk2LCAweEYzLCAweEZDLCAweDE5LCAweDQyLCAweEI2LCAweEUyLCAweDMzLCAweDFGLCAweDhCLCAweDU5LCAweDEyLAotICAgIDB4Q0UsIDB4NzksIDB4MTAsIDB4MTUsIDB4RDIsIDB4ODUsIDB4MjAsIDB4MEIsIDB4MkUsIDB4MjgsIDB4NjYsIDB4OEEsCi0gICAgMHhCNSwgMHg4MSwgMHhFQywgMHg5MCwgMHhCMywgMHg3OCwgMHg3OSwgMHgwMSwgMHhBOSwgMHg0OCwgMHhDNSwgMHgxQiwKLSAgICAweDc5LCAweEVDLCAweEFDLCAweDMwLCAweDkzLCAweDU4LCAweDUwLCAweDdCLCAweDlDLCAweDg3LCAweEI1LCAweENDLAotICAgIDB4MEQsIDB4OTksIDB4OEIsIDB4OEUsIDB4NTQsIDB4ODgsIDB4QjEsIDB4ODgsIDB4MEQsIDB4MzgsIDB4NUUsIDB4MEIsCi0gICAgMHgxQSwgMHg5OCwgMHhGOCwgMHhDNCwgMHhCNCwgMHhDQiwgMHg0QSwgMHgzMiwgMHgzMywgMHgxQywgMHg5OCwgMHg2MCwKLSAgICAweDJDLCAweDE3LCAweDMyLCAweDhBLCAweDY1LCAweDY0LCAweDQ4LCAweDQ1LCAweDY0LCAweDFELCAweDkzLCAweDcwLAotICAgIDB4NEUsIDB4ODQsIDB4MjEsIDB4QzcsIDB4NkYsIDB4NjMsIDB4NkUsIDB4Q0UsIDB4MzAsIDB4N0UsIDB4RDcsIDB4MjUsCi0gICAgMHhGMiwgMHg4OSwgMHhENywgMHg0RSwgMHhBMSwgMHg2MiwgMHg1RCwgMHgxOSwgMHg1OCwgMHgzNywgMHgxNCwgMHhFMSwKLSAgICAweEY5LCAweDVDLCAweDFDLCAweDU4LCAweEJCLCAweDU2LCAweENCLCAweDU5LCAweEIzLCAweEFCLCAweDI2LCAweDgzLAotICAgIDB4QkEsIDB4RUMsIDB4N0MsIDB4OEEsIDB4OTksIDB4NjYsIDB4MkYsIDB4Q0QsIDB4NTYsIDB4OUEsIDB4NUQsIDB4MzQsCi0gICAgMHhGQiwgMHg2NywgMHhGNiwgMHhDRSwgMHg2QywgMHg1QiwgMHhCRiwgMHg2MywgMHgzRSwgMHg0RSwgMHg2QSwgMHgxNywKLSAgICAweDEwLCAweDIyLCAweDI3LCAweEU1LCAweDcwLCAweDcxLCAweEExLCAweDFBLCAweEI1LCAweEFFLCAweDQwLCAweEI4LAotICAgIDB4NUUsIDB4MDYsIDB4RDQsIDB4QTcsIDB4MkMsIDB4RDIsIDB4RDEsIDB4N0IsIDB4NEUsIDB4NEMsIDB4QjAsIDB4MEYsCi0gICAgMHhGQiwgMHgxMiwgMHhBMSwgMHhFMywgMHg3NywgMHg4MiwgMHhBRSwgMHg3NCwgMHgzNCwgMHhDNSwgMHg3MSwgMHg5MywKLSAgICAweDhDLCAweEIyLCAweDk1LCAweEExLCAweEYyLCAweEQ2LCAweDQ5LCAweEU3LCAweDJELCAweDY4LCAweEU1LCAweDZCLAotICAgIDB4OTUsIDB4NkIsIDB4NDUsIDB4NkIsIDB4RTUsIDB4NkEsIDB4NzUsIDB4NkEsIDB4MjUsIDB4NzYsIDB4MTcsIDB4MTcsCi0gICAgMHgxMiwgMHg0MSwgMHg3RCwgMHg0QSwgMHhDMiwgMHhGQSwgMHhDQiwgMHg1RCwgMHg0MCwgMHhDRSwgMHhDNCwgMHg4NSwKLSAgICAweDYzLCAweDI4LCAweDgzLCAweDY2LCAweDZBLCAweERBLCAweDRBLCAweEExLCAweEM3LCAweEIwLCAweEI2LCAweDM5LAotICAgIDB4MTEsIDB4QjgsIDB4QjYsIDB4MkYsIDB4NDQsIDB4Q0UsIDB4OUIsIDB4NDMsIDB4N0IsIDB4QUMsIDB4RkUsIDB4NTYsCi0gICAgMHhDMCwgMHhFNCwgMHhBOCwgMHgwMiwgMHg1MCwgMHhCNiwgMHgyQSwgMHgwNSwgMHgzMCwgMHg5QiwgMHhDNiwgMHhBRCwKLSAgICAweEUxLCAweDk0LCAweEEzLCAweDNFLCAweDE4LCAweDNFLCAweEM1LCAweDMxLCAweEI4LCAweENFLCAweDJBLCAweDgzLAotICAgIDB4MkIsIDB4QTQsIDB4OTgsIDB4NUYsIDB4MzcsIDB4MzIsIDB4MDgsIDB4MkMsIDB4RTcsIDB4MTgsIDB4MUUsIDB4NzQsCi0gICAgMHg4NCwgMHg1QywgMHg3OCwgMHhEMCwgMHgyNywgMHg3OCwgMHg1NCwgMHhFRiwgMHgxNSwgMHhCMywgMHg0QiwgMHgxQSwKLSAgICAweDcwLCAweEI2LCAweEIwLCAweDlDLCAweEE3LCAweEFBLCAweDQyLCAweEUyLCAweDgzLCAweDY4LCAweDA0LCAweDlBLAotICAgIDB4RDEsIDB4NjAsIDB4NEQsIDB4QjQsIDB4RTQsIDB4MjIsIDB4Q0UsIDB4NTQsIDB4MjMsIDB4NUQsIDB4ODEsIDB4NTAsCi0gICAgMHgwMywgMHgyOSwgMHg3QSwgMHg4RiwgMHg2OSwgMHhEOCwgMHhFQSwgMHhCRCwgMHg4NiwgMHgzNCwgMHg3QSwgMHgzRiwKLSAgICAweERELCAweDc3LCAweERELCAweEZELCAweEQ5LCAweDZDLCAweDBCLCAweDQ5LCAweDI5LCAweEI2LCAweEQwLCAweEI1LAotICAgIDB4M0QsIDB4QUUsIDB4MTEsIDB4QkIsIDB4OTQsIDB4NzksIDB4RUIsIDB4ODUsIDB4NzIsIDB4QTAsIDB4MjYsIDB4NkIsCi0gICAgMHhCQywgMHg5MCwgMHgwQywgMHgxMiwgMHgxNCwgMHg1RCwgMHgyQiwgMHg0OSwgMHg5QiwgMHhBRiwgMHg3QSwgMHg2RSwKLSAgICAweDc1LCAweDU4LCAweDlDLCAweEY3LCAweDE1LCAweEEwLCAweEU1LCAweDI1LCAweDM4LCAweDQ5LCAweDVDLCAweEZGLAotICAgIDB4RjYsIDB4MzQsIDB4OEMsIDB4NjYsIDB4QzcsIDB4NDcsIDB4NkYsIDB4RUYsIDB4M0YsIDB4RTIsIDB4RTUsIDB4NTksCi0gICAgMHg3QSwgMHg5RCwgMHg1QiwgMHg1NSwgMHgyNywgMHg2NSwgMHg0QSwgMHgyNiwgMHhENSwgMHgyMCwgMHg2RSwgMHhGQSwKLSAgICAweEQ1LCAweEMwLCAweENBLCAweDdGLCAweDk0LCAweDUyLCAweERELCAweDVELCAweENGLCAweDcyLCAweEQyLCAweEVELAotICAgIDB4MzQsIDB4REQsIDB4REIsIDB4NDksIDB4RDMsIDB4RDQsIDB4MUUsIDB4MzcsIDB4NzgsIDB4REQsIDB4NTIsIDB4NEYsCi0gICAgMHgwQSwgMHg0MSwgMHg5OCwgMHg5NywgMHg1OCwgMHhDRSwgMHgwQiwgMHg5NCwgMHhBQiwgMHhGNywgMHhGNiwgMHhBMiwKLSAgICAweEMxLCAweEVBLCAweDM1LCAweDExLCAweDFFLCAweDYxLCAweDcxLCAweEYxLCAweEMzLCAweDlCLCAweEJBLCAweDRFLAotICAgIDB4MzksIDB4QTIsIDB4NzUsIDB4NTEsIDB4NzUsIDB4RjYsIDB4RDgsIDB4RUMsIDB4NDYsIDB4MTMsIDB4MkEsIDB4QjYsCi0gICAgMHg4NywgMHg5OSwgMHg0QSwgMHg0MywgMHgwQywgMHg5NywgMHg2MSwgMHhCQiwgMHhEQywgMHgyNSwgMHg0RiwgMHg3NywKLSAgICAweDBBLCAweDE2LCAweDgyLCAweENCLCAweDM1LCAweDU1LCAweDk3LCAweDYwLCAweDY3LCAweEEwLCAweEEyLCAweEVBLAotICAgIDB4NjAsIDB4NzMsIDB4QTAsIDB4MjAsIDB4QTQsIDB4NEMsIDB4NDYsIDB4OTYsIDB4MzMsIDB4MUEsIDB4NDgsIDB4NEYsCi0gICAgMHg4OSwgMHhFMCwgMHg5NiwgMHhGMywgMHg1QSwgMHg2MywgMHgzRiwgMHgxQSwgMHhEMywgMHgzOCwgMHhGMSwgMHhGMiwKLSAgICAweDM4LCAweDFBLCAweENFLCAweDM0LCAweEMxLCAweEYyLCAweDFBLCAweDY2LCAweDgxLCAweEU1LCAweEZDLCAweEY5LAotICAgIDB4RjIsIDB4MUQsIDB4RTYsIDB4NEMsIDB4ODMsIDB4RDEsIDB4QTMsIDB4QTIsIDB4MTEsIDB4NTcsIDB4MEIsIDB4MTgsCi0gICAgMHgyRCwgMHhFRiwgMHgyRiwgMHg5RiwgMHgyMCwgMHhBQiwgMHgxRiwgMHg4NCwgMHgyNiwgMHhDQSwgMHgwNiwgMHg5RCwKLSAgICAweDU2LCAweEI3LCAweDdBLCAweEQ5LCAweDkzLCAweDM1LCAweEI5LCAweEMxLCAweDVFLCAweDM5LCAweDRDLCAweENCLAotICAgIDB4QjAsIDB4RDgsIDB4RDMsIDB4NEQsIDB4RTAsIDB4RkIsIDB4Q0MsIDB4NDcsIDB4NTMsIDB4RjAsIDB4NjcsIDB4NkMsCi0gICAgMHgyNiwgMHg1MCwgMHg0NiwgMHgzOSwgMHhFQiwgMHgyMSwgMHgxQywgMHg3MiwgMHgyOSwgMHgyOCwgMHgxMSwgMHg2OCwKLSAgICAweDE2LCAweEZCLCAweDFELCAweDhDLCAweDg5LCAweDBGLCAweERGLCAweDNGLCAweDY4LCAweDRBLCAweEZGLCAweDRCLAotICAgIDB4MzksIDB4ODUsIDB4RUYsIDB4M0QsIDB4NzIsIDB4REYsIDB4NEIsIDB4OTksIDB4MDgsIDB4M0MsIDB4ODcsIDB4NzcsCi0gICAgMHhBQywgMHg4RiwgMHg3MiwgMHhCNSwgMHhDNCwgMHhCNCwgMHg4MywgMHg3MCwgMHhDNiwgMHg1MywgMHg3OSwgMHg4QiwKLSAgICAweEQxLCAweDA5LCAweDhGLCAweDk3LCAweEQ0LCAweDUzLCAweDNELCAweDhELCAweDNFLCAweEJDLCAweDQzLCAweDZFLAotICAgIDB4M0YsIDB4MTksIDB4MEMsIDB4RjAsIDB4OTYsIDB4QkMsIDB4MjQsIDB4NUYsIDB4RjYsIDB4RkUsIDB4MzQsIDB4NzAsCi0gICAgMHgxNywgMHhBQSwgMHg0QiwgMHg3NCwgMHhERSwgMHg0QiwgMHg5QiwgMHhGMSwgMHg0MSwgMHgzNCwgMHgzNywgMHg5MSwKLSAgICAweDZDLCAweEIxLCAweEUyLCAweDE5LCAweDMzLCAweDJGLCAweDMyLCAweDFCLCAweDZELCAweEI1LCAweEYzLCAweEI0LAotICAgIDB4QzcsIDB4RjksIDB4QTcsIDB4QkEsIDB4RjMsIDB4MEYsIDB4RDUsIDB4RkEsIDB4QzAsIDB4RkF9OwotY29uc3QgdWludDhfdCBnX3J1UlVfTG9jYWxlW10gPSB7Ci0gICAgMHg3OCwgMHg5QywgMHhBRCwgMHg1NywgMHg0RCwgMHg0RiwgMHgxMywgMHg0MSwgMHgxOCwgMHgzRSwgMHg2MywgMHhFMiwKLSAgICAweDdGLCAweDk4LCAweDZDLCAweDI0LCAweDY4LCAweDAyLCAweEFELCAweDFFLCAweDI1LCAweDY1LCAweDEzLCAweDIyLAotICAgIDB4MEEsIDB4MDYsIDB4RDcsIDB4OTAsIDB4MTYsIDB4MzQsIDB4NzIsIDB4MzEsIDB4REIsIDB4REQsIDB4QTEsIDB4NUQsCi0gICAgMHhFOCwgMHhFRSwgMHg5MCwgMHhFOSwgMHg2RSwgMHhCMCwgMHg3QiwgMHgyQSwgMHg4NSwgMHhFOCwgMHgwNSwgMHgyNSwKLSAgICAweEUxLCAweEEwLCAweDQ3LCAweEY0LCAweEU0LCAweEM5LCAweDUwLCAweEJFLCAweDEyLCAweDgyLCAweEI2LCAweDI0LAotICAgIDB4RkUsIDB4ODIsIDB4RDksIDB4RkYsIDB4NjAsIDB4RDQsIDB4OUYsIDB4RTEsIDB4M0IsIDB4RkIsIDB4RDEsIDB4RUUsCi0gICAgMHhCNywgMHhDNSwgMHhEOCwgMHgxRSwgMHgzQSwgMHhGMywgMHgzRSwgMHhDRiwgMHhGMywgMHhDRSwgMHhGQiwgMHhCNSwKLSAgICAweEQzLCAweEI2LCAweEQ0LCAweDIwLCAweDhBLCAweERDLCAweEMwLCAweEM4LCAweDkwLCAweDc1LCAweDNDLCAweDIzLAotICAgIDB4NTAsIDB4RUIsIDB4NjUsIDB4NzksIDB4NDUsIDB4NDAsIDB4MkEsIDB4NkUsIDB4MkEsIDB4MzMsIDB4QzIsIDB4OEYsCi0gICAgMHhBQiwgMHhERCwgMHhERiwgMHg0NywgMHg1RiwgMHg2RSwgMHhDMywgMHhDNywgMHhBRiwgMHhERSwgMHg4NywgMHg5RiwKLSAgICAweEVGLCAweDhGLCAweEVFLCAweDA4LCAweEUyLCAweENELCAweDFCLCAweDA4LCAweDk1LCAweDM4LCAweERGLCAweDUwLAotICAgIDB4NjUsIDB4NUEsIDB4NjksIDB4RTksIDB4NTUsIDB4RDIsIDB4NjgsIDB4RkEsIDB4RDIsIDB4MUEsIDB4QzUsIDB4MzUsCi0gICAgMHg0MiwgMHgzNSwgMHhEOSwgMHhFMCwgMHhBQywgMHgzMSwgMHg1NCwgMHhEMiwgMHg4OSwgMHg2MSwgMHhENiwgMHg5RiwKLSAgICAweDAyLCAweEQ0LCAweEU0LCAweEZCLCAweDMxLCAweDZGLCAweDJGLCAweDNBLCAweEZCLCAweEFDLCAweEM3LCAweDRFLAotICAgIDB4NTgsIDB4RDcsIDB4NjksIDB4M0IsIDB4RkIsIDB4QTUsIDB4QTIsIDB4NjcsIDB4MEIsIDB4QzMsIDB4QkIsIDB4RUMsCi0gICAgMHg5QywgMHg5RCwgMHgzOCwgMHg2RCwgMHhENiwgMHg2NSwgMHg1RiwgMHg1MywgMHgwOSwgMHhFQywgMHg5QiwgMHhBQiwKLSAgICAweEVELCAweEIwLCAweDZFLCAweDFBLCAweEQ4LCAweDY1LCAweDU3LCAweEEwLCAweDNELCAweENGLCAweEQzLCAweEE2LAotICAgIDB4MDIsIDB4MTcsIDB4Q0UsIDB4M0IsIDB4RDYsIDB4Q0IsIDB4ODYsIDB4MzIsIDB4REMsIDB4NzUsIDB4MjEsIDB4OTEsCi0gICAgMHg1MywgMHg2NywgMHhDNywgMHhEOSwgMHhDRSwgMHgwOCwgMHhDNywgMHhEOSwgMHg4NiwgMHg1MCwgMHg3QSwgMHg0RSwKLSAgICAweDA3LCAweDcyLCAweDNFLCAweENFLCAweEM4LCAweDk3LCAweEY1LCAweEQ5LCAweDY1LCAweDNFLCAweEExLCAweEM3LAotICAgIDB4RkEsIDB4NzksIDB4RjAsIDB4MTksIDB4MUMsIDB4NzEsIDB4MDksIDB4OTEsIDB4QzQsIDB4MDksIDB4QzgsIDB4NUYsCi0gICAgMHgwRiwgMHgxQSwgMHgxMCwgMHg2RSwgMHgwOCwgMHg5MiwgMHhBQiwgMHg1NSwgMHgzQSwgMHgyMywgMHhEQywgMHgxMywKLSAgICAweDkyLCAweDlELCAweDI5LCAweEU0LCAweDM0LCAweDI1LCAweDBELCAweDFCLCAweEExLCAweDFGLCAweDk5LCAweEIyLAotICAgIDB4RkYsIDB4REQsIDB4OEEsIDB4RDQsIDB4RDgsIDB4RkQsIDB4MUUsIDB4QTQsIDB4MDYsIDB4RTEsIDB4MTYsIDB4M0YsCi0gICAgMHgxNSwgMHhGMSwgMHhBQiwgMHg5RSwgMHg4QSwgMHhCOSwgMHgyNSwgMHgyRiwgMHhFNCwgMHhENywgMHg1QSwgMHg5NSwKLSAgICAweDVCLCAweEExLCAweEQxLCAweDg3LCAweDlELCAweDA4LCAweDAxLCAweEY2LCAweDIxLCAweDk4LCAweDRCLCAweDNFLAotICAgIDB4OUYsIDB4N0UsIDB4NTAsIDB4N0IsIDB4RUMsIDB4QkMsIDB4NTQsIDB4RTQsIDB4RDgsIDB4OTAsIDB4NzQsIDB4MDUsCi0gICAgMHgzMSwgMHhGNSwgMHgwMCwgMHgzQywgMHg3MywgMHg4NywgMHg3OCwgMHgwRiwgMHhENiwgMHgxNywgMHhFQywgMHgzMiwKLSAgICAweDRFLCAweDNBLCAweDgxLCAweDcyLCAweEY3LCAweEMxLCAweDRGLCAweDFBLCAweDA4LCAweEMzLCAweEQ4LCAweDc2LAotICAgIDB4RjUsIDB4REQsIDB4MzgsIDB4RjAsIDB4MDYsIDB4Q0UsIDB4RUQsIDB4NDAsIDB4MTQsIDB4RTcsIDB4NDAsIDB4MzgsCi0gICAgMHg0RCwgMHg5QywgMHhFQiwgMHhFQywgMHgwMywgMHgwOCwgMHgwRSwgMHg5RCwgMHhENywgMHg0OSwgMHhFNSwgMHhCNiwKLSAgICAweEIzLCAweEMzLCAweDhFLCAweEUxLCAweERELCAweEY3LCAweERBLCAweEVDLCAweDgzLCAweEM4LCAweDVELCAweEE1LAotICAgIDB4RTQsIDB4MUMsIDB4OUIsIDB4MkUsIDB4RDcsIDB4RkYsIDB4ODEsIDB4QjMsIDB4MUQsIDB4M0YsIDB4RjIsIDB4OTAsCi0gICAgMHhGNSwgMHhFMiwgMHhBNiwgMHgwMywgMHhBNywgMHgxMywgMHgzNywgMHg3RCwgMHg3MiwgMHhEQSwgMHg3MSwgMHhEMywKLSAgICAweEU3LCAweDI0LCAweEVCLCAweDMwLCAweDQ1LCAweEM4LCAweDhFLCAweEIzLCAweDQzLCAweEQ1LCAweDMxLCAweEQ1LAotICAgIDB4NTQsIDB4MEQsIDB4RUIsIDB4RTEsIDB4RUIsIDB4QzksIDB4MzcsIDB4ODksIDB4QjMsIDB4MTIsIDB4QjQsIDB4MzMsCi0gICAgMHhEOCwgMHg0NCwgMHhBMSwgMHhBNSwgMHgxOCwgMHg4NCwgMHg4NiwgMHhEQiwgMHg5MCwgMHg3MywgMHg0QywgMHhFNSwKLSAgICAweDkwLCAweDVGLCAweEQ4LCAweEYxLCAweDkxLCAweEU5LCAweDIzLCAweEQ2LCAweDJCLCAweDM4LCAweDZGLCAweDYxLAotICAgIDB4NkMsIDB4QjgsIDB4NjEsIDB4ODgsIDB4NDQsIDB4OEQsIDB4QzgsIDB4NUQsIDB4MDUsIDB4NkEsIDB4QjgsIDB4NkEsCi0gICAgMHg4QiwgMHhCMSwgMHhCQiwgMHhENiwgMHhCMywgMHhBQSwgMHhCMiwgMHg4OSwgMHg5NywgMHg2NCwgMHhEMywgMHhDNCwKLSAgICAweEQ0LCAweDE4LCAweEQ0LCAweDdFLCAweDYwLCAweEYxLCAweEFGLCAweEUzLCAweDM1LCAweEFCLCAweEQxLCAweDEwLAotICAgIDB4QzQsIDB4MzksIDB4MjQsIDB4QzEsIDB4MEIsIDB4QkQsIDB4ODAsIDB4MTcsIDB4OUEsIDB4ODAsIDB4MjcsIDB4NjQsCi0gICAgMHg4MiwgMHg1NywgMHg2MiwgMHg0MCwgMHhDRCwgMHhEMiwgMHgzNiwgMHg4OCwgMHg1MSwgMHhGQiwgMHg1NywgMHhBRCwKLSAgICAweDhFLCAweDU1LCAweDkwLCAweENFLCAweDE1LCAweDI0LCAweEE5LCAweEMwLCAweDk1LCAweDIzLCAweDY5LCAweDlBLAotICAgIDB4NzUsIDB4NDIsIDB4Q0QsIDB4QTEsIDB4MkEsIDB4QUUsIDB4NDEsIDB4MjgsIDB4NjIsIDB4RjEsIDB4OEIsIDB4NjAsCi0gICAgMHg2QSwgMHg3QSwgMHhBQywgMHgwOCwgMHgyMSwgMHg0QiwgMHhBNCwgMHgwOCwgMHgwQiwgMHhEMywgMHg5MiwgMHgzNCwKLSAgICAweDVELCAweEE5LCAweEEwLCAweEQ1LCAweDUyLCAweDMxLCAweDQ0LCAweEM5LCAweEQyLCAweDc4LCAweEM5LCAweDVGLAotICAgIDB4NEYsIDB4RTMsIDB4MjYsIDB4RUQsIDB4NEIsIDB4NDYsIDB4MTIsIDB4RjgsIDB4MTksIDB4NzMsIDB4NDksIDB4OUMsCi0gICAgMHhDRiwgMHhCMywgMHg4RCwgMHhFNSwgMHhFNiwgMHhCNywgMHg3QywgMHgxOSwgMHhBQywgMHhDMSwgMHgxQywgMHhDQywKLSAgICAweENCLCAweEM2LCAweEZBLCAweEM2LCAweDgyLCAweERFLCAweEFDLCAweDNDLCAweDlDLCAweDdCLCAweEI0LCAweEY1LAotICAgIDB4RkMsIDB4NTUsIDB4N0QsIDB4RDEsIDB4NUUsIDB4RjUsIDB4OEEsIDB4MTQsIDB4MjYsIDB4QjksIDB4NEEsIDB4QzMsCi0gICAgMHhEMiwgMHhBQiwgMHg5OCwgMHg0NiwgMHgyQiwgMHgxNSwgMHhCMSwgMHhGOSwgMHgyMSwgMHg4MSwgMHgwRCwgMHg2NiwKLSAgICAweDU5LCAweDExLCAweDQ0LCAweDdCLCAweEQyLCAweEI2LCAweEVGLCAweDE3LCAweDZDLCAweERCLCAweDJFLCAweDE1LAotICAgIDB4MjMsIDB4QkMsIDB4NkMsIDB4QTksIDB4NjIsIDB4NTEsIDB4OEEsIDB4MEQsIDB4QTUsIDB4MzUsIDB4RDQsIDB4REUsCi0gICAgMHgxQSwgMHg1OSwgMHhCQiwgMHg4OSwgMHhBOSwgMHg4MiwgMHgwRCwgMHhEMywgMHg5NywgMHg4RSwgMHgyNywgMHg3NSwKLSAgICAweEJDLCAweDFFLCAweDg5LCAweDFDLCAweDA2LCAweDc5LCAweDBELCAweDUzLCAweDFELCAweDhCLCAweDlBLCAweDdDLAotICAgIDB4RjcsIDB4MkEsIDB4NTYsIDB4MzQsIDB4NUQsIDB4ODYsIDB4MjEsIDB4OTgsIDB4MEMsIDB4QkMsIDB4NzgsIDB4NzAsCi0gICAgMHhBNiwgMHhBMCwgMHg0NiwgMHg4OSwgMHhCNSwgMHhBOSwgMHhGMSwgMHgxMSwgMHhGOCwgMHhGRSwgMHg3MSwgMHg0NCwKLSAgICAweEM5LCAweDIwLCAweDg1LCAweEYxLCAweDExLCAweDA1LCAweEJBLCAweDY2LCAweDU4LCAweDRELCAweDQxLCAweDlDLAotICAgIDB4MUEsIDB4OTEsIDB4NkUsIDB4NjMsIDB4NEEsIDB4MDQsIDB4RjEsIDB4NkUsIDB4ODIsIDB4M0QsIDB4QUMsIDB4NEMsCi0gICAgMHhBNCwgMHhFMSwgMHg0MSwgMHgzNywgMHgyMiwgMHhBNSwgMHg4OSwgMHgxQSwgMHg4MywgMHgyOSwgMHg3NCwgMHgzNywKLSAgICAweDgyLCAweEU4LCAweDdFLCAweDQ3LCAweDQ3LCAweDE5LCAweDM5LCAweDJBLCAweEFELCAweDQ5LCAweEY4LCAweDQyLAotICAgIDB4MTAsIDB4Q0IsIDB4MkIsIDB4RTUsIDB4NkIsIDB4QzgsIDB4QzIsIDB4OUQsIDB4NDgsIDB4ODgsIDB4REMsIDB4QUIsCi0gICAgMHgyRSwgMHgxMSwgMHgzNywgMHg3RiwgMHhDQSwgMHg1QiwgMHg5QiwgMHg3OCwgMHg0RCwgMHg1NiwgMHg4MiwgMHhCQiwKLSAgICAweDM1LCAweEQ4LCAweEZBLCAweDNFLCAweEE1LCAweDE2LCAweEZDLCAweEUwLCAweDU0LCAweEQxLCAweDEyLCAweEQ0LAotICAgIDB4QTcsIDB4OTgsIDB4NEUsIDB4RDAsIDB4MEMsIDB4OEQsIDB4MTgsIDB4MzksIDB4ODQsIDB4MDcsIDB4QzQsIDB4QTIsCi0gICAgMHgxQSwgMHhBNiwgMHhBOCwgMHg2MiwgMHhBQSwgMHgxOSwgMHg4QywgMHg1OSwgMHg5NSwgMHg1NCwgMHgzMSwgMHg1QSwKLSAgICAweEQyLCAweEZFLCAweDRBLCAweDU5LCAweEMwLCAweDU1LCAweDhBLCAweEI3LCAweDcyLCAweDI5LCAweEIzLCAweDU0LAotICAgIDB4QUUsIDB4QzIsIDB4MjMsIDB4OTYsIDB4NDcsIDB4NTksIDB4QUUsIDB4Q0IsIDB4NUEsIDB4MDYsIDB4NjEsIDB4OTEsCi0gICAgMHhEOCwgMHhENiwgMHg4NiwgMHg4QywgMHhFNiwgMHg4OSwgMHg1OSwgMHhENywgMHgxNCwgMHg5RSwgMHhEMywgMHhENCwKLSAgICAweEIzLCAweEM3LCAweDQ4LCAweENBLCAweDI3LCAweDQzLCAweDAxLCAweDk0LCAweDNBLCAweDA5LCAweEM4LCAweEU1LAotICAgIDB4REMsIDB4QTMsIDB4ODEsIDB4NUIsIDB4RTMsIDB4NTksIDB4QTIsIDB4MjcsIDB4QjksIDB4QjQsIDB4MEEsIDB4MTksCi0gICAgMHg4OSwgMHgyNiwgMHhCNSwgMHgyQywgMHhBMywgMHhCNiwgMHg0RSwgMHg1QywgMHhBNiwgMHgxNywgMHhBNCwgMHg3QiwKLSAgICAweEIzLCAweDg1LCAweEZBLCAweDU5LCAweDJBLCAweDdBLCAweEZGLCAweDNELCAweEM0LCAweDNGLCAweERFLCAweENCLAotICAgIDB4OEIsIDB4QzR9OwotCi1zdGF0aWMgc3RkOjp1bmlxdWVfcHRyPElGWF9Mb2NhbGU+IFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGNvbnN0IHVpbnQ4X3QqIHBCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuQnVmTGVuKSB7Ci0gIGlmICghcEJ1ZiB8fCBuQnVmTGVuIDw9IDApCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIENGWF9HRU1vZHVsZSogcEdlTW9kdWxlID0gQ0ZYX0dFTW9kdWxlOjpHZXQoKTsKLSAgaWYgKCFwR2VNb2R1bGUpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgQ0NvZGVjX01vZHVsZU1nciogcENvZGVjTWdyID0gcEdlTW9kdWxlLT5HZXRDb2RlY01vZHVsZSgpOwotICBpZiAoIXBDb2RlY01ncikKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hNTF9FbGVtZW50PiBwTG9jYWxlOwotICB1aW50OF90KiBwT3V0ID0gbnVsbHB0cjsKLSAgdWludDMyX3QgZHdTaXplOwotICBwQ29kZWNNZ3ItPkdldEZsYXRlTW9kdWxlKCktPkZsYXRlT3JMWldEZWNvZGUoZmFsc2UsIHBCdWYsIG5CdWZMZW4sIHRydWUsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCBwT3V0LCBkd1NpemUpOwotICBpZiAocE91dCkgewotICAgIHBMb2NhbGUgPSBDWE1MX0VsZW1lbnQ6OlBhcnNlKHBPdXQsIGR3U2l6ZSk7Ci0gICAgRlhfRnJlZShwT3V0KTsKLSAgfQotICByZXR1cm4gcExvY2FsZSA/IHN0ZDo6dW5pcXVlX3B0cjxJRlhfTG9jYWxlPigKLSAgICAgICAgICAgICAgICAgICAgICAgbmV3IENYRkFfWE1MTG9jYWxlKHN0ZDo6bW92ZShwTG9jYWxlKSkpCi0gICAgICAgICAgICAgICAgIDogbnVsbHB0cjsKLX0KLQotc3RhdGljIHVpbnQxNl90IFhGQV9HZXRMYW5ndWFnZShDRlhfV2lkZVN0cmluZyB3c0xhbmd1YWdlKSB7Ci0gIHVpbnQxNl90IGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX2VuX1VTOwotICBpZiAod3NMYW5ndWFnZS5HZXRMZW5ndGgoKSA8IDIpIHsKLSAgICByZXR1cm4gZHdMYW5ndWVJRDsKLSAgfQotICB3c0xhbmd1YWdlLk1ha2VMb3dlcigpOwotICB1aW50MzJfdCBkd0lERmlyc3QgPSB3c0xhbmd1YWdlLkdldEF0KDApIDw8IDggfCB3c0xhbmd1YWdlLkdldEF0KDEpOwotICB1aW50MzJfdCBkd0lEU2Vjb25kID0gd3NMYW5ndWFnZS5HZXRMZW5ndGgoKSA+PSA1Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB3c0xhbmd1YWdlLkdldEF0KDMpIDw8IDggfCB3c0xhbmd1YWdlLkdldEF0KDQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwOwotICBzd2l0Y2ggKGR3SURGaXJzdCkgewotICAgIGNhc2UgRlhCU1RSX0lEKDAsIDAsICd6JywgJ2gnKTogewotICAgICAgaWYgKGR3SURTZWNvbmQgPT0gRlhCU1RSX0lEKDAsIDAsICdjJywgJ24nKSkgewotICAgICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF96aF9DTjsKLSAgICAgIH0gZWxzZSBpZiAoZHdJRFNlY29uZCA9PSBGWEJTVFJfSUQoMCwgMCwgJ3QnLCAndycpKSB7Ci0gICAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX3poX1RXOwotICAgICAgfSBlbHNlIGlmIChkd0lEU2Vjb25kID09IEZYQlNUUl9JRCgwLCAwLCAnaCcsICdrJykpIHsKLSAgICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfemhfSEs7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAnaicsICdhJyk6Ci0gICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF9qYV9KUDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlhCU1RSX0lEKDAsIDAsICdrJywgJ28nKToKLSAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX2tvX0tSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWEJTVFJfSUQoMCwgMCwgJ2UnLCAnbicpOiB7Ci0gICAgICBpZiAoZHdJRFNlY29uZCA9PSBGWEJTVFJfSUQoMCwgMCwgJ2cnLCAnYicpKSB7Ci0gICAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX2VuX0dCOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfZW5fVVM7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAnZCcsICdlJyk6Ci0gICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF9kZV9ERTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlhCU1RSX0lEKDAsIDAsICdmJywgJ3InKToKLSAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX2ZyX0ZSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWEJTVFJfSUQoMCwgMCwgJ2UnLCAncycpOiB7Ci0gICAgICBpZiAoZHdJRFNlY29uZCA9PSBGWEJTVFJfSUQoMCwgMCwgJ2UnLCAncycpKSB7Ci0gICAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX2VzX0VTOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfZXNfTEE7Ci0gICAgICB9Ci0gICAgfSBicmVhazsKLSAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAnaScsICd0Jyk6Ci0gICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF9pdF9JVDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlhCU1RSX0lEKDAsIDAsICdwJywgJ3QnKToKLSAgICAgIGR3TGFuZ3VlSUQgPSBYRkFfTEFOR0lEX3B0X0JSOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWEJTVFJfSUQoMCwgMCwgJ24nLCAnbCcpOgotICAgICAgZHdMYW5ndWVJRCA9IFhGQV9MQU5HSURfbmxfTkw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYQlNUUl9JRCgwLCAwLCAncicsICd1Jyk6Ci0gICAgICBkd0xhbmd1ZUlEID0gWEZBX0xBTkdJRF9ydV9SVTsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBkd0xhbmd1ZUlEOwotfQotCi1DWEZBX0xvY2FsZU1ncjo6Q1hGQV9Mb2NhbGVNZ3IoQ1hGQV9Ob2RlKiBwTG9jYWxlU2V0LCBDRlhfV2lkZVN0cmluZyB3c0RlZmxjaWQpCi0gICAgOiBtX2R3TG9jYWxlRmxhZ3MoMHgwMCkgewotICBtX2R3RGVmbGNpZCA9IFhGQV9HZXRMYW5ndWFnZSh3c0RlZmxjaWQpOwotICBpZiAocExvY2FsZVNldCkgewotICAgIENYRkFfTm9kZSogcE5vZGVMb2NhbGUgPSBwTG9jYWxlU2V0LT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCk7Ci0gICAgd2hpbGUgKHBOb2RlTG9jYWxlKSB7Ci0gICAgICBtX0xvY2FsZUFycmF5LmVtcGxhY2VfYmFjayhuZXcgQ1hGQV9Ob2RlTG9jYWxlKHBOb2RlTG9jYWxlKSk7Ci0gICAgICBwTm9kZUxvY2FsZSA9IHBOb2RlTG9jYWxlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcpOwotICAgIH0KLSAgfQotICBtX3BEZWZMb2NhbGUgPSBHZXRMb2NhbGVCeU5hbWUod3NEZWZsY2lkKTsKLX0KLQotQ1hGQV9Mb2NhbGVNZ3I6On5DWEZBX0xvY2FsZU1ncigpIHt9Ci0KLXVpbnQxNl90IENYRkFfTG9jYWxlTWdyOjpHZXREZWZMb2NhbGVJRCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1fZHdEZWZsY2lkOwotfQotCi1JRlhfTG9jYWxlKiBDWEZBX0xvY2FsZU1ncjo6R2V0RGVmTG9jYWxlKCkgewotICBpZiAobV9wRGVmTG9jYWxlKQotICAgIHJldHVybiBtX3BEZWZMb2NhbGU7Ci0KLSAgaWYgKCFtX0xvY2FsZUFycmF5LmVtcHR5KCkpCi0gICAgcmV0dXJuIG1fTG9jYWxlQXJyYXlbMF0uZ2V0KCk7Ci0KLSAgaWYgKCFtX1hNTExvY2FsZUFycmF5LmVtcHR5KCkpCi0gICAgcmV0dXJuIG1fWE1MTG9jYWxlQXJyYXlbMF0uZ2V0KCk7Ci0KLSAgc3RkOjp1bmlxdWVfcHRyPElGWF9Mb2NhbGU+IGxvY2FsZShHZXRMb2NhbGUobV9kd0RlZmxjaWQpKTsKLSAgbV9wRGVmTG9jYWxlID0gbG9jYWxlLmdldCgpOwotICBpZiAobG9jYWxlKQotICAgIG1fWE1MTG9jYWxlQXJyYXkucHVzaF9iYWNrKHN0ZDo6bW92ZShsb2NhbGUpKTsKLQotICByZXR1cm4gbV9wRGVmTG9jYWxlOwotfQotCi1zdGQ6OnVuaXF1ZV9wdHI8SUZYX0xvY2FsZT4gQ1hGQV9Mb2NhbGVNZ3I6OkdldExvY2FsZSh1aW50MTZfdCBsY2lkKSB7Ci0gIHN3aXRjaCAobGNpZCkgewotICAgIGNhc2UgWEZBX0xBTkdJRF96aF9DTjoKLSAgICAgIHJldHVybiBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX3poQ05fTG9jYWxlLCBzaXplb2YoZ196aENOX0xvY2FsZSkpOwotICAgIGNhc2UgWEZBX0xBTkdJRF96aF9UVzoKLSAgICAgIHJldHVybiBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX3poVFdfTG9jYWxlLCBzaXplb2YoZ196aFRXX0xvY2FsZSkpOwotICAgIGNhc2UgWEZBX0xBTkdJRF96aF9ISzoKLSAgICAgIHJldHVybiBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX3poSEtfTG9jYWxlLCBzaXplb2YoZ196aEhLX0xvY2FsZSkpOwotICAgIGNhc2UgWEZBX0xBTkdJRF9qYV9KUDoKLSAgICAgIHJldHVybiBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX2phSlBfTG9jYWxlLCBzaXplb2YoZ19qYUpQX0xvY2FsZSkpOwotICAgIGNhc2UgWEZBX0xBTkdJRF9rb19LUjoKLSAgICAgIHJldHVybiBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX2tvS1JfTG9jYWxlLCBzaXplb2YoZ19rb0tSX0xvY2FsZSkpOwotICAgIGNhc2UgWEZBX0xBTkdJRF9lbl9HQjoKLSAgICAgIHJldHVybiBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX2VuR0JfTG9jYWxlLCBzaXplb2YoZ19lbkdCX0xvY2FsZSkpOwotICAgIGNhc2UgWEZBX0xBTkdJRF9lc19MQToKLSAgICAgIHJldHVybiBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX2VzTEFfTG9jYWxlLCBzaXplb2YoZ19lc0xBX0xvY2FsZSkpOwotICAgIGNhc2UgWEZBX0xBTkdJRF9lc19FUzoKLSAgICAgIHJldHVybiBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX2VzRVNfTG9jYWxlLCBzaXplb2YoZ19lc0VTX0xvY2FsZSkpOwotICAgIGNhc2UgWEZBX0xBTkdJRF9kZV9ERToKLSAgICAgIHJldHVybiBYRkFfR2V0TG9jYWxlRnJvbUJ1ZmZlcihnX2RlREVfTG9hY2FsZSwgc2l6ZW9mKGdfZGVERV9Mb2FjYWxlKSk7Ci0gICAgY2FzZSBYRkFfTEFOR0lEX2ZyX0ZSOgotICAgICAgcmV0dXJuIFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfZnJGUl9Mb2NhbGUsIHNpemVvZihnX2ZyRlJfTG9jYWxlKSk7Ci0gICAgY2FzZSBYRkFfTEFOR0lEX2l0X0lUOgotICAgICAgcmV0dXJuIFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfaXRJVF9Mb2NhbGUsIHNpemVvZihnX2l0SVRfTG9jYWxlKSk7Ci0gICAgY2FzZSBYRkFfTEFOR0lEX3B0X0JSOgotICAgICAgcmV0dXJuIFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfcHRCUl9Mb2NhbGUsIHNpemVvZihnX3B0QlJfTG9jYWxlKSk7Ci0gICAgY2FzZSBYRkFfTEFOR0lEX25sX05MOgotICAgICAgcmV0dXJuIFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfbmxOTF9Mb2NhbGUsIHNpemVvZihnX25sTkxfTG9jYWxlKSk7Ci0gICAgY2FzZSBYRkFfTEFOR0lEX3J1X1JVOgotICAgICAgcmV0dXJuIFhGQV9HZXRMb2NhbGVGcm9tQnVmZmVyKGdfcnVSVV9Mb2NhbGUsIHNpemVvZihnX3J1UlVfTG9jYWxlKSk7Ci0gICAgY2FzZSBYRkFfTEFOR0lEX2VuX1VTOgotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gWEZBX0dldExvY2FsZUZyb21CdWZmZXIoZ19lblVTX0xvY2FsZSwgc2l6ZW9mKGdfZW5VU19Mb2NhbGUpKTsKLSAgfQotfQotCi1JRlhfTG9jYWxlKiBDWEZBX0xvY2FsZU1ncjo6R2V0TG9jYWxlQnlOYW1lKAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0xvY2FsZU5hbWUpIHsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX0xvY2FsZUFycmF5LnNpemUoKTsgaSsrKSB7Ci0gICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IG1fTG9jYWxlQXJyYXlbaV0uZ2V0KCk7Ci0gICAgaWYgKHBMb2NhbGUtPkdldE5hbWUoKSA9PSB3c0xvY2FsZU5hbWUpCi0gICAgICByZXR1cm4gcExvY2FsZTsKLSAgfQotICBpZiAod3NMb2NhbGVOYW1lLkdldExlbmd0aCgpIDwgMikKLSAgICByZXR1cm4gbnVsbHB0cjsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX1hNTExvY2FsZUFycmF5LnNpemUoKTsgaSsrKSB7Ci0gICAgSUZYX0xvY2FsZSogcExvY2FsZSA9IG1fWE1MTG9jYWxlQXJyYXlbaV0uZ2V0KCk7Ci0gICAgaWYgKHBMb2NhbGUtPkdldE5hbWUoKSA9PSB3c0xvY2FsZU5hbWUpCi0gICAgICByZXR1cm4gcExvY2FsZTsKLSAgfQotICB1aW50MTZfdCBkd0xhbmd1ZUlEID0gWEZBX0dldExhbmd1YWdlKHdzTG9jYWxlTmFtZSk7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxJRlhfTG9jYWxlPiBwTG9jYWxlKEdldExvY2FsZShkd0xhbmd1ZUlEKSk7Ci0gIElGWF9Mb2NhbGUqIHBSZXRMb2NhbGUgPSBwTG9jYWxlLmdldCgpOwotICBpZiAocExvY2FsZSkKLSAgICBtX1hNTExvY2FsZUFycmF5LnB1c2hfYmFjayhzdGQ6Om1vdmUocExvY2FsZSkpOwotICByZXR1cm4gcFJldExvY2FsZTsKLX0KLQotdm9pZCBDWEZBX0xvY2FsZU1ncjo6U2V0RGVmTG9jYWxlKElGWF9Mb2NhbGUqIHBMb2NhbGUpIHsKLSAgbV9wRGVmTG9jYWxlID0gcExvY2FsZTsKLX0KLQotQ0ZYX1dpZGVTdHJpbmdDIENYRkFfTG9jYWxlTWdyOjpHZXRDb25maWdMb2NhbGVOYW1lKENYRkFfTm9kZSogcENvbmZpZykgewotICBpZiAoIShtX2R3TG9jYWxlRmxhZ3MgJiAweDAxKSkgewotICAgIG1fd3NDb25maWdMb2NhbGUuY2xlYXIoKTsKLSAgICBpZiAocENvbmZpZykgewotICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGRmQ29uZmlnID0KLSAgICAgICAgICBwQ29uZmlnLT5HZXRGaXJzdENoaWxkQnlDbGFzcyhYRkFfRWxlbWVudDo6QWNyb2JhdCk7Ci0gICAgICBpZiAoIXBDaGlsZGZDb25maWcpIHsKLSAgICAgICAgcENoaWxkZkNvbmZpZyA9IHBDb25maWctPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpQcmVzZW50KTsKLSAgICAgIH0KLSAgICAgIENYRkFfTm9kZSogcENvbW1vbiA9Ci0gICAgICAgICAgcENoaWxkZkNvbmZpZwotICAgICAgICAgICAgICA/IHBDaGlsZGZDb25maWctPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpDb21tb24pCi0gICAgICAgICAgICAgIDogbnVsbHB0cjsKLSAgICAgIENYRkFfTm9kZSogcExvY2FsZSA9Ci0gICAgICAgICAgcENvbW1vbiA/IHBDb21tb24tPkdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50OjpMb2NhbGUpCi0gICAgICAgICAgICAgICAgICA6IG51bGxwdHI7Ci0gICAgICBpZiAocExvY2FsZSkgewotICAgICAgICBwTG9jYWxlLT5UcnlDRGF0YShYRkFfQVRUUklCVVRFX1ZhbHVlLCBtX3dzQ29uZmlnTG9jYWxlLCBmYWxzZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIG1fZHdMb2NhbGVGbGFncyB8PSAweDAxOwotICB9Ci0gIHJldHVybiBtX3dzQ29uZmlnTG9jYWxlLkFzU3RyaW5nQygpOwotfQotCi1zdGF0aWMgYm9vbCBnX2JQcm92aWRlclRpbWVab25lU2V0ID0gZmFsc2U7Ci0KLUNYRkFfVGltZVpvbmVQcm92aWRlcjo6Q1hGQV9UaW1lWm9uZVByb3ZpZGVyKCkgewotI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgaWYgKCFnX2JQcm92aWRlclRpbWVab25lU2V0KSB7Ci0gICAgZ19iUHJvdmlkZXJUaW1lWm9uZVNldCA9IHRydWU7Ci0gICAgX3R6c2V0KCk7Ci0gIH0KLSAgbV90ei50ekhvdXIgPSAoaW50OF90KShfdGltZXpvbmUgLyAzNjAwICogLTEpOwotICBtX3R6LnR6TWludXRlID0gKGludDhfdCkoKEZYU1lTX2FicyhfdGltZXpvbmUpICUgMzYwMCkgLyA2MCk7Ci0jZWxzZQotICBpZiAoIWdfYlByb3ZpZGVyVGltZVpvbmVTZXQpIHsKLSAgICBnX2JQcm92aWRlclRpbWVab25lU2V0ID0gdHJ1ZTsKLSAgICB0enNldCgpOwotICB9Ci0gIG1fdHoudHpIb3VyID0gKGludDhfdCkodGltZXpvbmUgLyAzNjAwICogLTEpOwotICBtX3R6LnR6TWludXRlID0gKGludDhfdCkoKEZYU1lTX2FicygoaW50KXRpbWV6b25lKSAlIDM2MDApIC8gNjApOwotI2VuZGlmCi19Ci0KLUNYRkFfVGltZVpvbmVQcm92aWRlcjo6fkNYRkFfVGltZVpvbmVQcm92aWRlcigpIHt9Ci0KLXZvaWQgQ1hGQV9UaW1lWm9uZVByb3ZpZGVyOjpHZXRUaW1lWm9uZShGWF9USU1FWk9ORSogdHopIGNvbnN0IHsKLSAgKnR6ID0gbV90ejsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxlbWdyLmggYi94ZmEvZnhmYS9wYXJzZXIveGZhX2xvY2FsZW1nci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjQwNWRjLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxlbWdyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYRkFfUEFSU0VSX1hGQV9MT0NBTEVNR1JfSF8KLSNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX1hGQV9MT0NBTEVNR1JfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJ4ZmEvZmdhcy9sb2NhbGl6YXRpb24vZmdhc19kYXRldGltZS5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2xvY2FsaXphdGlvbi9mZ2FzX2xvY2FsZS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxlbWdyLmgiCi0KLWNsYXNzIENYRkFfTm9kZTsKLWNsYXNzIElGWF9Mb2NhbGU7Ci0KLSNkZWZpbmUgWEZBX0xBTkdJRF96aF9DTiAweDA4MDQKLSNkZWZpbmUgWEZBX0xBTkdJRF96aF9UVyAweDA0MDQKLSNkZWZpbmUgWEZBX0xBTkdJRF96aF9ISyAweDBjMDQKLSNkZWZpbmUgWEZBX0xBTkdJRF9qYV9KUCAweDA0MTEKLSNkZWZpbmUgWEZBX0xBTkdJRF9rb19LUiAweDA0MTIKLSNkZWZpbmUgWEZBX0xBTkdJRF9lbl9VUyAweDA0MDkKLSNkZWZpbmUgWEZBX0xBTkdJRF9lbl9HQiAweDA4MDkKLSNkZWZpbmUgWEZBX0xBTkdJRF9lc19FUyAweDBjMGEKLSNkZWZpbmUgWEZBX0xBTkdJRF9lc19MQSAweDA4MGEKLSNkZWZpbmUgWEZBX0xBTkdJRF9kZV9ERSAweDA0MDcKLSNkZWZpbmUgWEZBX0xBTkdJRF9mcl9GUiAweDA0MGMKLSNkZWZpbmUgWEZBX0xBTkdJRF9pdF9JVCAweDA0MTAKLSNkZWZpbmUgWEZBX0xBTkdJRF9wdF9CUiAweDA0MTYKLSNkZWZpbmUgWEZBX0xBTkdJRF9ubF9OTCAweDA0MTMKLSNkZWZpbmUgWEZBX0xBTkdJRF9ydV9SVSAweDA0MTkKLQotY2xhc3MgQ1hGQV9Mb2NhbGVNZ3IgOiBwdWJsaWMgSUZYX0xvY2FsZU1nciB7Ci0gcHVibGljOgotICBDWEZBX0xvY2FsZU1ncihDWEZBX05vZGUqIHBMb2NhbGVTZXQsIENGWF9XaWRlU3RyaW5nIHdzRGVmbGNpZCk7Ci0gIH5DWEZBX0xvY2FsZU1ncigpIG92ZXJyaWRlOwotCi0gIC8vIElGWF9Mb2NhbGVNZ3IKLSAgdWludDE2X3QgR2V0RGVmTG9jYWxlSUQoKSBjb25zdCBvdmVycmlkZTsKLSAgSUZYX0xvY2FsZSogR2V0RGVmTG9jYWxlKCkgb3ZlcnJpZGU7Ci0gIElGWF9Mb2NhbGUqIEdldExvY2FsZUJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NMb2NhbGVOYW1lKSBvdmVycmlkZTsKLQotICB2b2lkIFNldERlZkxvY2FsZShJRlhfTG9jYWxlKiBwTG9jYWxlKTsKLSAgQ0ZYX1dpZGVTdHJpbmdDIEdldENvbmZpZ0xvY2FsZU5hbWUoQ1hGQV9Ob2RlKiBwQ29uZmlnKTsKLQotIHByb3RlY3RlZDoKLSAgc3RkOjp1bmlxdWVfcHRyPElGWF9Mb2NhbGU+IEdldExvY2FsZSh1aW50MTZfdCBsY2lkKSBvdmVycmlkZTsKLQotICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8SUZYX0xvY2FsZT4+IG1fTG9jYWxlQXJyYXk7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxJRlhfTG9jYWxlPj4gbV9YTUxMb2NhbGVBcnJheTsKLSAgSUZYX0xvY2FsZSogbV9wRGVmTG9jYWxlOyAgLy8gb3duZWQgYnkgbV9Mb2NhbGVBcnJheSBvciBtX1hNTExvY2FsZUFycmF5LgotICBDRlhfV2lkZVN0cmluZyBtX3dzQ29uZmlnTG9jYWxlOwotICB1aW50MTZfdCBtX2R3RGVmbGNpZDsKLSAgdWludDE2X3QgbV9kd0xvY2FsZUZsYWdzOwotfTsKLQotY2xhc3MgQ1hGQV9UaW1lWm9uZVByb3ZpZGVyIHsKLSBwdWJsaWM6Ci0gIENYRkFfVGltZVpvbmVQcm92aWRlcigpOwotICB+Q1hGQV9UaW1lWm9uZVByb3ZpZGVyKCk7Ci0KLSAgdm9pZCBHZXRUaW1lWm9uZShGWF9USU1FWk9ORSogdHopIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgRlhfVElNRVpPTkUgbV90ejsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX1hGQV9MT0NBTEVNR1JfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxldmFsdWUuY3BwIGIveGZhL2Z4ZmEvcGFyc2VyL3hmYV9sb2NhbGV2YWx1ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlOTI1MzUuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEvcGFyc2VyL3hmYV9sb2NhbGV2YWx1ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5ODQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9sb2NhbGV2YWx1ZS5oIgotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9leHQuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9zdGxfdXRpbC5oIgotI2luY2x1ZGUgInhmYS9mZ2FzL2xvY2FsaXphdGlvbi9mZ2FzX2xvY2FsZWltcC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9sb2NhbGVtZ3IuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfdXRpbHMuaCIKLQotc3RhdGljIGNvbnN0IEZYX0RPVUJMRSBmcmFjdGlvbl9zY2FsZXNbXSA9IHswLjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDAwMDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDAwMDAwMDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMDAwMDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMDAwMDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDAwMDAwMDAwMDF9OwotQ1hGQV9Mb2NhbGVWYWx1ZTo6Q1hGQV9Mb2NhbGVWYWx1ZSgpIHsKLSAgbV9kd1R5cGUgPSBYRkFfVlRfTlVMTDsKLSAgbV9iVmFsaWQgPSB0cnVlOwotICBtX3BMb2NhbGVNZ3IgPSBudWxscHRyOwotfQotQ1hGQV9Mb2NhbGVWYWx1ZTo6Q1hGQV9Mb2NhbGVWYWx1ZShjb25zdCBDWEZBX0xvY2FsZVZhbHVlJiB2YWx1ZSkgewotICBtX2R3VHlwZSA9IFhGQV9WVF9OVUxMOwotICBtX2JWYWxpZCA9IHRydWU7Ci0gIG1fcExvY2FsZU1nciA9IG51bGxwdHI7Ci0gICp0aGlzID0gdmFsdWU7Ci19Ci1DWEZBX0xvY2FsZVZhbHVlOjpDWEZBX0xvY2FsZVZhbHVlKHVpbnQzMl90IGR3VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Mb2NhbGVNZ3IqIHBMb2NhbGVNZ3IpIHsKLSAgbV9kd1R5cGUgPSBkd1R5cGU7Ci0gIG1fYlZhbGlkID0gKG1fZHdUeXBlICE9IFhGQV9WVF9OVUxMKTsKLSAgbV9wTG9jYWxlTWdyID0gcExvY2FsZU1ncjsKLX0KLUNYRkFfTG9jYWxlVmFsdWU6OkNYRkFfTG9jYWxlVmFsdWUodWludDMyX3QgZHdUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Mb2NhbGVNZ3IqIHBMb2NhbGVNZ3IpIHsKLSAgbV93c1ZhbHVlID0gd3NWYWx1ZTsKLSAgbV9kd1R5cGUgPSBkd1R5cGU7Ci0gIG1fcExvY2FsZU1nciA9IHBMb2NhbGVNZ3I7Ci0gIG1fYlZhbGlkID0gVmFsaWRhdGVDYW5vbmljYWxWYWx1ZSh3c1ZhbHVlLCBkd1R5cGUpOwotfQotQ1hGQV9Mb2NhbGVWYWx1ZTo6Q1hGQV9Mb2NhbGVWYWx1ZSh1aW50MzJfdCBkd1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTG9jYWxlTWdyKiBwTG9jYWxlTWdyKSB7Ci0gIG1fcExvY2FsZU1nciA9IHBMb2NhbGVNZ3I7Ci0gIG1fYlZhbGlkID0gdHJ1ZTsKLSAgbV9kd1R5cGUgPSBkd1R5cGU7Ci0gIG1fYlZhbGlkID0gUGFyc2VQYXR0ZXJuVmFsdWUod3NWYWx1ZSwgd3NGb3JtYXQsIHBMb2NhbGUpOwotfQotQ1hGQV9Mb2NhbGVWYWx1ZSYgQ1hGQV9Mb2NhbGVWYWx1ZTo6b3BlcmF0b3I9KGNvbnN0IENYRkFfTG9jYWxlVmFsdWUmIHZhbHVlKSB7Ci0gIG1fd3NWYWx1ZSA9IHZhbHVlLm1fd3NWYWx1ZTsKLSAgbV9kd1R5cGUgPSB2YWx1ZS5tX2R3VHlwZTsKLSAgbV9iVmFsaWQgPSB2YWx1ZS5tX2JWYWxpZDsKLSAgbV9wTG9jYWxlTWdyID0gdmFsdWUubV9wTG9jYWxlTWdyOwotICByZXR1cm4gKnRoaXM7Ci19Ci1DWEZBX0xvY2FsZVZhbHVlOjp+Q1hGQV9Mb2NhbGVWYWx1ZSgpIHt9Ci1zdGF0aWMgRlhfTE9DQUxFQ0FURUdPUlkgWEZBX1ZhbHVnZUNhdGVnb3J5KEZYX0xPQ0FMRUNBVEVHT1JZIGVDYXRlZ29yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdWYWx1ZVR5cGUpIHsKLSAgaWYgKGVDYXRlZ29yeSA9PSBGWF9MT0NBTEVDQVRFR09SWV9Vbmtub3duKSB7Ci0gICAgc3dpdGNoIChkd1ZhbHVlVHlwZSkgewotICAgICAgY2FzZSBYRkFfVlRfQk9PTEVBTjoKLSAgICAgIGNhc2UgWEZBX1ZUX0lOVEVHRVI6Ci0gICAgICBjYXNlIFhGQV9WVF9ERUNJTUFMOgotICAgICAgY2FzZSBYRkFfVlRfRkxPQVQ6Ci0gICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9OdW07Ci0gICAgICBjYXNlIFhGQV9WVF9URVhUOgotICAgICAgICByZXR1cm4gRlhfTE9DQUxFQ0FURUdPUllfVGV4dDsKLSAgICAgIGNhc2UgWEZBX1ZUX0RBVEU6Ci0gICAgICAgIHJldHVybiBGWF9MT0NBTEVDQVRFR09SWV9EYXRlOwotICAgICAgY2FzZSBYRkFfVlRfVElNRToKLSAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX1RpbWU7Ci0gICAgICBjYXNlIFhGQV9WVF9EQVRFVElNRToKLSAgICAgICAgcmV0dXJuIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lOwotICAgIH0KLSAgfQotICByZXR1cm4gZUNhdGVnb3J5OwotfQotCi1ib29sIENYRkFfTG9jYWxlVmFsdWU6OlZhbGlkYXRlVmFsdWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nKiBwTWF0Y2hGb3JtYXQpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NPdXRwdXQ7Ci0gIElGWF9Mb2NhbGUqIGxvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7Ci0gIGlmIChwTG9jYWxlKQotICAgIG1fcExvY2FsZU1nci0+U2V0RGVmTG9jYWxlKHBMb2NhbGUpOwotCi0gIGF1dG8gcEZvcm1hdCA9IHBkZml1bTo6TWFrZVVuaXF1ZTxDRlhfRm9ybWF0U3RyaW5nPihtX3BMb2NhbGVNZ3IsIGZhbHNlKTsKLSAgc3RkOjp2ZWN0b3I8Q0ZYX1dpZGVTdHJpbmc+IHdzUGF0dGVybnM7Ci0gIHBGb3JtYXQtPlNwbGl0Rm9ybWF0U3RyaW5nKHdzUGF0dGVybiwgd3NQYXR0ZXJucyk7Ci0KLSAgYm9vbCBiUmV0ID0gZmFsc2U7Ci0gIGludDMyX3QgaUNvdW50ID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90Pih3c1BhdHRlcm5zKTsKLSAgaW50MzJfdCBpID0gMDsKLSAgZm9yICg7IGkgPCBpQ291bnQgJiYgIWJSZXQ7IGkrKykgewotICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0ID0gd3NQYXR0ZXJuc1tpXTsKLSAgICBGWF9MT0NBTEVDQVRFR09SWSBlQ2F0ZWdvcnkgPSBwRm9ybWF0LT5HZXRDYXRlZ29yeSh3c0Zvcm1hdCk7Ci0gICAgZUNhdGVnb3J5ID0gWEZBX1ZhbHVnZUNhdGVnb3J5KGVDYXRlZ29yeSwgbV9kd1R5cGUpOwotICAgIHN3aXRjaCAoZUNhdGVnb3J5KSB7Ci0gICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX051bGw6Ci0gICAgICAgIGJSZXQgPSBwRm9ybWF0LT5QYXJzZU51bGwod3NWYWx1ZSwgd3NGb3JtYXQpOwotICAgICAgICBpZiAoIWJSZXQpIHsKLSAgICAgICAgICBiUmV0ID0gd3NWYWx1ZS5Jc0VtcHR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX1plcm86Ci0gICAgICAgIGJSZXQgPSBwRm9ybWF0LT5QYXJzZVplcm8od3NWYWx1ZSwgd3NGb3JtYXQpOwotICAgICAgICBpZiAoIWJSZXQpIHsKLSAgICAgICAgICBiUmV0ID0gd3NWYWx1ZSA9PSBMIjAiOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9OdW06IHsKLSAgICAgICAgQ0ZYX1dpZGVTdHJpbmcgZk51bTsKLSAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlTnVtKHdzVmFsdWUsIHdzRm9ybWF0LCBmTnVtKTsKLSAgICAgICAgaWYgKCFiUmV0KSB7Ci0gICAgICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdE51bSh3c1ZhbHVlLCB3c0Zvcm1hdCwgd3NPdXRwdXQpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9UZXh0OgotICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VUZXh0KHdzVmFsdWUsIHdzRm9ybWF0LCB3c091dHB1dCk7Ci0gICAgICAgIHdzT3V0cHV0LmNsZWFyKCk7Ci0gICAgICAgIGlmICghYlJldCkgewotICAgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5Gb3JtYXRUZXh0KHdzVmFsdWUsIHdzRm9ybWF0LCB3c091dHB1dCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGU6IHsKLSAgICAgICAgQ0ZYX1VuaXRpbWUgZHQ7Ci0gICAgICAgIGJSZXQgPSBWYWxpZGF0ZUNhbm9uaWNhbERhdGUod3NWYWx1ZSwgZHQpOwotICAgICAgICBpZiAoIWJSZXQpIHsKLSAgICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VEYXRlVGltZSh3c1ZhbHVlLCB3c0Zvcm1hdCwgRlhfREFURVRJTUVUWVBFX0RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHQpOwotICAgICAgICAgIGlmICghYlJldCkgewotICAgICAgICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdERhdGVUaW1lKHdzVmFsdWUsIHdzRm9ybWF0LCB3c091dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EQVRFVElNRVRZUEVfRGF0ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9UaW1lOiB7Ci0gICAgICAgIENGWF9Vbml0aW1lIGR0OwotICAgICAgICBiUmV0ID0KLSAgICAgICAgICAgIHBGb3JtYXQtPlBhcnNlRGF0ZVRpbWUod3NWYWx1ZSwgd3NGb3JtYXQsIEZYX0RBVEVUSU1FVFlQRV9UaW1lLCBkdCk7Ci0gICAgICAgIGlmICghYlJldCkgewotICAgICAgICAgIGJSZXQgPSBwRm9ybWF0LT5Gb3JtYXREYXRlVGltZSh3c1ZhbHVlLCB3c0Zvcm1hdCwgd3NPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRV9UaW1lKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWU6IHsKLSAgICAgICAgQ0ZYX1VuaXRpbWUgZHQ7Ci0gICAgICAgIGJSZXQgPSBwRm9ybWF0LT5QYXJzZURhdGVUaW1lKHdzVmFsdWUsIHdzRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9EQVRFVElNRVRZUEVfRGF0ZVRpbWUsIGR0KTsKLSAgICAgICAgaWYgKCFiUmV0KSB7Ci0gICAgICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdERhdGVUaW1lKHdzVmFsdWUsIHdzRm9ybWF0LCB3c091dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfREFURVRJTUVUWVBFX0RhdGVUaW1lKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJSZXQgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmIChiUmV0ICYmIHBNYXRjaEZvcm1hdCkKLSAgICAqcE1hdGNoRm9ybWF0ID0gd3NQYXR0ZXJuc1tpIC0gMV07Ci0KLSAgaWYgKHBMb2NhbGUpCi0gICAgbV9wTG9jYWxlTWdyLT5TZXREZWZMb2NhbGUobG9jYWxlKTsKLQotICByZXR1cm4gYlJldDsKLX0KLQotQ0ZYX1dpZGVTdHJpbmcgQ1hGQV9Mb2NhbGVWYWx1ZTo6R2V0VmFsdWUoKSBjb25zdCB7Ci0gIHJldHVybiBtX3dzVmFsdWU7Ci19Ci11aW50MzJfdCBDWEZBX0xvY2FsZVZhbHVlOjpHZXRUeXBlKCkgY29uc3QgewotICByZXR1cm4gbV9kd1R5cGU7Ci19Ci12b2lkIENYRkFfTG9jYWxlVmFsdWU6OlNldFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1R5cGUpIHsKLSAgbV93c1ZhbHVlID0gd3NWYWx1ZTsKLSAgbV9kd1R5cGUgPSBkd1R5cGU7Ci19Ci1DRlhfV2lkZVN0cmluZyBDWEZBX0xvY2FsZVZhbHVlOjpHZXRUZXh0KCkgY29uc3QgewotICBpZiAobV9iVmFsaWQgJiYgbV9kd1R5cGUgPT0gWEZBX1ZUX1RFWFQpIHsKLSAgICByZXR1cm4gbV93c1ZhbHVlOwotICB9Ci0gIHJldHVybiBDRlhfV2lkZVN0cmluZygpOwotfQotRlhfRkxPQVQgQ1hGQV9Mb2NhbGVWYWx1ZTo6R2V0TnVtKCkgY29uc3QgewotICBpZiAobV9iVmFsaWQgJiYgKG1fZHdUeXBlID09IFhGQV9WVF9CT09MRUFOIHx8IG1fZHdUeXBlID09IFhGQV9WVF9JTlRFR0VSIHx8Ci0gICAgICAgICAgICAgICAgICAgbV9kd1R5cGUgPT0gWEZBX1ZUX0RFQ0lNQUwgfHwgbV9kd1R5cGUgPT0gWEZBX1ZUX0ZMT0FUKSkgewotICAgIGludDY0X3QgbkludGVncmFsID0gMDsKLSAgICB1aW50MzJfdCBkd0ZyYWN0aW9uYWwgPSAwOwotICAgIGludDMyX3QgbkV4cG9uZW50ID0gMDsKLSAgICBpbnQgY2MgPSAwOwotICAgIGJvb2wgYk5lZ2F0aXZlID0gZmFsc2UsIGJFeHBTaWduID0gZmFsc2U7Ci0gICAgY29uc3QgRlhfV0NIQVIqIHN0ciA9IG1fd3NWYWx1ZS5jX3N0cigpOwotICAgIGludCBsZW4gPSBtX3dzVmFsdWUuR2V0TGVuZ3RoKCk7Ci0gICAgd2hpbGUgKEZYU1lTX2lzd3NwYWNlKHN0cltjY10pICYmIGNjIDwgbGVuKSB7Ci0gICAgICBjYysrOwotICAgIH0KLSAgICBpZiAoY2MgPj0gbGVuKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHN0clswXSA9PSAnKycpIHsKLSAgICAgIGNjKys7Ci0gICAgfSBlbHNlIGlmIChzdHJbMF0gPT0gJy0nKSB7Ci0gICAgICBiTmVnYXRpdmUgPSB0cnVlOwotICAgICAgY2MrKzsKLSAgICB9Ci0gICAgaW50IG5JbnRlZ3JhbExlbiA9IDA7Ci0gICAgd2hpbGUgKGNjIDwgbGVuKSB7Ci0gICAgICBpZiAoc3RyW2NjXSA9PSAnLicgfHwgIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pIHx8Ci0gICAgICAgICAgbkludGVncmFsTGVuID4gMTcpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBuSW50ZWdyYWwgPSBuSW50ZWdyYWwgKiAxMCArIHN0cltjY10gLSAnMCc7Ci0gICAgICBjYysrOwotICAgICAgbkludGVncmFsTGVuKys7Ci0gICAgfQotICAgIG5JbnRlZ3JhbCA9IGJOZWdhdGl2ZSA/IC1uSW50ZWdyYWwgOiBuSW50ZWdyYWw7Ci0gICAgaW50IHNjYWxlID0gMDsKLSAgICBkb3VibGUgZnJhY3Rpb24gPSAwLjA7Ci0gICAgaWYgKGNjIDwgbGVuICYmIHN0cltjY10gPT0gJy4nKSB7Ci0gICAgICBjYysrOwotICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7Ci0gICAgICAgIGZyYWN0aW9uICs9IGZyYWN0aW9uX3NjYWxlc1tzY2FsZV0gKiAoc3RyW2NjXSAtICcwJyk7Ci0gICAgICAgIHNjYWxlKys7Ci0gICAgICAgIGNjKys7Ci0gICAgICAgIGlmIChzY2FsZSA9PSBzaXplb2YgZnJhY3Rpb25fc2NhbGVzIC8gc2l6ZW9mKGRvdWJsZSkgfHwKLSAgICAgICAgICAgICFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBkd0ZyYWN0aW9uYWwgPSAodWludDMyX3QpKGZyYWN0aW9uICogNDI5NDk2NzI5Ni4wKTsKLSAgICB9Ci0gICAgaWYgKGNjIDwgbGVuICYmIChzdHJbY2NdID09ICdFJyB8fCBzdHJbY2NdID09ICdlJykpIHsKLSAgICAgIGNjKys7Ci0gICAgICBpZiAoY2MgPCBsZW4pIHsKLSAgICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7Ci0gICAgICAgICAgY2MrKzsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICctJykgewotICAgICAgICAgIGJFeHBTaWduID0gdHJ1ZTsKLSAgICAgICAgICBjYysrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB3aGlsZSAoY2MgPCBsZW4pIHsKLSAgICAgICAgaWYgKHN0cltjY10gPT0gJy4nIHx8ICFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG5FeHBvbmVudCA9IG5FeHBvbmVudCAqIDEwICsgc3RyW2NjXSAtICcwJzsKLSAgICAgICAgY2MrKzsKLSAgICAgIH0KLSAgICAgIG5FeHBvbmVudCA9IGJFeHBTaWduID8gLW5FeHBvbmVudCA6IG5FeHBvbmVudDsKLSAgICB9Ci0gICAgRlhfRkxPQVQgZlZhbHVlID0gKEZYX0ZMT0FUKShkd0ZyYWN0aW9uYWwgLyA0Mjk0OTY3Mjk2LjApOwotICAgIGZWYWx1ZSA9IG5JbnRlZ3JhbCArIChuSW50ZWdyYWwgPj0gMCA/IGZWYWx1ZSA6IC1mVmFsdWUpOwotICAgIGlmIChuRXhwb25lbnQgIT0gMCkgewotICAgICAgZlZhbHVlICo9IEZYU1lTX3BvdygxMCwgKEZYX0ZMT0FUKW5FeHBvbmVudCk7Ci0gICAgfQotICAgIHJldHVybiBmVmFsdWU7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci1GWF9ET1VCTEUgQ1hGQV9Mb2NhbGVWYWx1ZTo6R2V0RG91YmxlTnVtKCkgY29uc3QgewotICBpZiAobV9iVmFsaWQgJiYgKG1fZHdUeXBlID09IFhGQV9WVF9CT09MRUFOIHx8IG1fZHdUeXBlID09IFhGQV9WVF9JTlRFR0VSIHx8Ci0gICAgICAgICAgICAgICAgICAgbV9kd1R5cGUgPT0gWEZBX1ZUX0RFQ0lNQUwgfHwgbV9kd1R5cGUgPT0gWEZBX1ZUX0ZMT0FUKSkgewotICAgIGludDY0X3QgbkludGVncmFsID0gMDsKLSAgICB1aW50MzJfdCBkd0ZyYWN0aW9uYWwgPSAwOwotICAgIGludDMyX3QgbkV4cG9uZW50ID0gMDsKLSAgICBpbnQzMl90IGNjID0gMDsKLSAgICBib29sIGJOZWdhdGl2ZSA9IGZhbHNlLCBiRXhwU2lnbiA9IGZhbHNlOwotICAgIGNvbnN0IEZYX1dDSEFSKiBzdHIgPSBtX3dzVmFsdWUuY19zdHIoKTsKLSAgICBpbnQgbGVuID0gbV93c1ZhbHVlLkdldExlbmd0aCgpOwotICAgIHdoaWxlIChGWFNZU19pc3dzcGFjZShzdHJbY2NdKSAmJiBjYyA8IGxlbikgewotICAgICAgY2MrKzsKLSAgICB9Ci0gICAgaWYgKGNjID49IGxlbikgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChzdHJbMF0gPT0gJysnKSB7Ci0gICAgICBjYysrOwotICAgIH0gZWxzZSBpZiAoc3RyWzBdID09ICctJykgewotICAgICAgYk5lZ2F0aXZlID0gdHJ1ZTsKLSAgICAgIGNjKys7Ci0gICAgfQotICAgIGludDMyX3QgbkludGVncmFsTGVuID0gMDsKLSAgICB3aGlsZSAoY2MgPCBsZW4pIHsKLSAgICAgIGlmIChzdHJbY2NdID09ICcuJyB8fCAhRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkgfHwKLSAgICAgICAgICBuSW50ZWdyYWxMZW4gPiAxNykgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIG5JbnRlZ3JhbCA9IG5JbnRlZ3JhbCAqIDEwICsgc3RyW2NjXSAtICcwJzsKLSAgICAgIGNjKys7Ci0gICAgICBuSW50ZWdyYWxMZW4rKzsKLSAgICB9Ci0gICAgbkludGVncmFsID0gYk5lZ2F0aXZlID8gLW5JbnRlZ3JhbCA6IG5JbnRlZ3JhbDsKLSAgICBpbnQzMl90IHNjYWxlID0gMDsKLSAgICBGWF9ET1VCTEUgZnJhY3Rpb24gPSAwLjA7Ci0gICAgaWYgKGNjIDwgbGVuICYmIHN0cltjY10gPT0gJy4nKSB7Ci0gICAgICBjYysrOwotICAgICAgd2hpbGUgKGNjIDwgbGVuKSB7Ci0gICAgICAgIGZyYWN0aW9uICs9IGZyYWN0aW9uX3NjYWxlc1tzY2FsZV0gKiAoc3RyW2NjXSAtICcwJyk7Ci0gICAgICAgIHNjYWxlKys7Ci0gICAgICAgIGNjKys7Ci0gICAgICAgIGlmIChzY2FsZSA9PSBzaXplb2YgZnJhY3Rpb25fc2NhbGVzIC8gc2l6ZW9mKEZYX0RPVUJMRSkgfHwKLSAgICAgICAgICAgICFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBkd0ZyYWN0aW9uYWwgPSAodWludDMyX3QpKGZyYWN0aW9uICogNDI5NDk2NzI5Ni4wKTsKLSAgICB9Ci0gICAgaWYgKGNjIDwgbGVuICYmIChzdHJbY2NdID09ICdFJyB8fCBzdHJbY2NdID09ICdlJykpIHsKLSAgICAgIGNjKys7Ci0gICAgICBpZiAoY2MgPCBsZW4pIHsKLSAgICAgICAgaWYgKHN0cltjY10gPT0gJysnKSB7Ci0gICAgICAgICAgY2MrKzsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICctJykgewotICAgICAgICAgIGJFeHBTaWduID0gdHJ1ZTsKLSAgICAgICAgICBjYysrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB3aGlsZSAoY2MgPCBsZW4pIHsKLSAgICAgICAgaWYgKHN0cltjY10gPT0gJy4nIHx8ICFGWFNZU19pc0RlY2ltYWxEaWdpdChzdHJbY2NdKSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG5FeHBvbmVudCA9IG5FeHBvbmVudCAqIDEwICsgc3RyW2NjXSAtICcwJzsKLSAgICAgICAgY2MrKzsKLSAgICAgIH0KLSAgICAgIG5FeHBvbmVudCA9IGJFeHBTaWduID8gLW5FeHBvbmVudCA6IG5FeHBvbmVudDsKLSAgICB9Ci0gICAgRlhfRE9VQkxFIGRWYWx1ZSA9IChkd0ZyYWN0aW9uYWwgLyA0Mjk0OTY3Mjk2LjApOwotICAgIGRWYWx1ZSA9IG5JbnRlZ3JhbCArIChuSW50ZWdyYWwgPj0gMCA/IGRWYWx1ZSA6IC1kVmFsdWUpOwotICAgIGlmIChuRXhwb25lbnQgIT0gMCkgewotICAgICAgZFZhbHVlICo9IEZYU1lTX3BvdygxMCwgKEZYX0ZMT0FUKW5FeHBvbmVudCk7Ci0gICAgfQotICAgIHJldHVybiBkVmFsdWU7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci1DRlhfVW5pdGltZSBDWEZBX0xvY2FsZVZhbHVlOjpHZXREYXRlKCkgY29uc3QgewotICBpZiAobV9iVmFsaWQgJiYgbV9kd1R5cGUgPT0gWEZBX1ZUX0RBVEUpIHsKLSAgICBDRlhfVW5pdGltZSBkdDsKLSAgICBGWF9EYXRlRnJvbUNhbm9uaWNhbChtX3dzVmFsdWUsIGR0KTsKLSAgICByZXR1cm4gZHQ7Ci0gIH0KLSAgcmV0dXJuIENGWF9Vbml0aW1lKCk7Ci19Ci1DRlhfVW5pdGltZSBDWEZBX0xvY2FsZVZhbHVlOjpHZXRUaW1lKCkgY29uc3QgewotICBpZiAobV9iVmFsaWQgJiYgbV9kd1R5cGUgPT0gWEZBX1ZUX1RJTUUpIHsKLSAgICBDRlhfVW5pdGltZSBkdCgwKTsKLSAgICBBU1NFUlQobV9wTG9jYWxlTWdyKTsKLSAgICBGWF9UaW1lRnJvbUNhbm9uaWNhbChtX3dzVmFsdWUuQXNTdHJpbmdDKCksIGR0LAotICAgICAgICAgICAgICAgICAgICAgICAgIG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCkpOwotICAgIHJldHVybiBkdDsKLSAgfQotICByZXR1cm4gQ0ZYX1VuaXRpbWUoKTsKLX0KLUNGWF9Vbml0aW1lIENYRkFfTG9jYWxlVmFsdWU6OkdldERhdGVUaW1lKCkgY29uc3QgewotICBpZiAobV9iVmFsaWQgJiYgbV9kd1R5cGUgPT0gWEZBX1ZUX0RBVEVUSU1FKSB7Ci0gICAgaW50MzJfdCBpbmRleCA9IG1fd3NWYWx1ZS5GaW5kKCdUJyk7Ci0gICAgQ0ZYX1VuaXRpbWUgZHQ7Ci0gICAgRlhfRGF0ZUZyb21DYW5vbmljYWwobV93c1ZhbHVlLkxlZnQoaW5kZXgpLCBkdCk7Ci0gICAgQVNTRVJUKG1fcExvY2FsZU1ncik7Ci0gICAgRlhfVGltZUZyb21DYW5vbmljYWwoCi0gICAgICAgIG1fd3NWYWx1ZS5SaWdodChtX3dzVmFsdWUuR2V0TGVuZ3RoKCkgLSBpbmRleCAtIDEpLkFzU3RyaW5nQygpLCBkdCwKLSAgICAgICAgbV9wTG9jYWxlTWdyLT5HZXREZWZMb2NhbGUoKSk7Ci0gICAgcmV0dXJuIGR0OwotICB9Ci0gIHJldHVybiBDRlhfVW5pdGltZSgpOwotfQotYm9vbCBDWEZBX0xvY2FsZVZhbHVlOjpTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpIHsKLSAgbV9kd1R5cGUgPSBYRkFfVlRfVEVYVDsKLSAgbV93c1ZhbHVlID0gd3NUZXh0OwotICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgQ1hGQV9Mb2NhbGVWYWx1ZTo6U2V0VGV4dChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlKSB7Ci0gIG1fZHdUeXBlID0gWEZBX1ZUX1RFWFQ7Ci0gIHJldHVybiBtX2JWYWxpZCA9IFBhcnNlUGF0dGVyblZhbHVlKHdzVGV4dCwgd3NGb3JtYXQsIHBMb2NhbGUpOwotfQotYm9vbCBDWEZBX0xvY2FsZVZhbHVlOjpTZXROdW0oRlhfRkxPQVQgZk51bSkgewotICBtX2R3VHlwZSA9IFhGQV9WVF9GTE9BVDsKLSAgbV93c1ZhbHVlLkZvcm1hdChMIiUuOGciLCAoRlhfRE9VQkxFKWZOdW0pOwotICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgQ1hGQV9Mb2NhbGVWYWx1ZTo6U2V0TnVtKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c051bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUpIHsKLSAgbV9kd1R5cGUgPSBYRkFfVlRfRkxPQVQ7Ci0gIHJldHVybiBtX2JWYWxpZCA9IFBhcnNlUGF0dGVyblZhbHVlKHdzTnVtLCB3c0Zvcm1hdCwgcExvY2FsZSk7Ci19Ci1ib29sIENYRkFfTG9jYWxlVmFsdWU6OlNldERhdGUoY29uc3QgQ0ZYX1VuaXRpbWUmIGQpIHsKLSAgbV9kd1R5cGUgPSBYRkFfVlRfREFURTsKLSAgbV93c1ZhbHVlLkZvcm1hdChMIiUwNGQtJTAyZC0lMDJkIiwgZC5HZXRZZWFyKCksIGQuR2V0TW9udGgoKSwgZC5HZXREYXkoKSk7Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDWEZBX0xvY2FsZVZhbHVlOjpTZXREYXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUpIHsKLSAgbV9kd1R5cGUgPSBYRkFfVlRfREFURTsKLSAgcmV0dXJuIG1fYlZhbGlkID0gUGFyc2VQYXR0ZXJuVmFsdWUod3NEYXRlLCB3c0Zvcm1hdCwgcExvY2FsZSk7Ci19Ci1ib29sIENYRkFfTG9jYWxlVmFsdWU6OlNldFRpbWUoY29uc3QgQ0ZYX1VuaXRpbWUmIHQpIHsKLSAgbV9kd1R5cGUgPSBYRkFfVlRfVElNRTsKLSAgbV93c1ZhbHVlLkZvcm1hdChMIiUwMmQ6JTAyZDolMDJkIiwgdC5HZXRIb3VyKCksIHQuR2V0TWludXRlKCksCi0gICAgICAgICAgICAgICAgICAgdC5HZXRTZWNvbmQoKSk7Ci0gIGlmICh0LkdldE1pbGxpc2Vjb25kKCkgPiAwKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmcgd3NUZW1wOwotICAgIHdzVGVtcC5Gb3JtYXQoTCIlOjAzZCIsIHQuR2V0TWlsbGlzZWNvbmQoKSk7Ci0gICAgbV93c1ZhbHVlICs9IHdzVGVtcDsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgQ1hGQV9Mb2NhbGVWYWx1ZTo6U2V0VGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlKSB7Ci0gIG1fZHdUeXBlID0gWEZBX1ZUX1RJTUU7Ci0gIHJldHVybiBtX2JWYWxpZCA9IFBhcnNlUGF0dGVyblZhbHVlKHdzVGltZSwgd3NGb3JtYXQsIHBMb2NhbGUpOwotfQotYm9vbCBDWEZBX0xvY2FsZVZhbHVlOjpTZXREYXRlVGltZShjb25zdCBDRlhfVW5pdGltZSYgZHQpIHsKLSAgbV9kd1R5cGUgPSBYRkFfVlRfREFURVRJTUU7Ci0gIG1fd3NWYWx1ZS5Gb3JtYXQoTCIlMDRkLSUwMmQtJTAyZFQlMDJkOiUwMmQ6JTAyZCIsIGR0LkdldFllYXIoKSwKLSAgICAgICAgICAgICAgICAgICBkdC5HZXRNb250aCgpLCBkdC5HZXREYXkoKSwgZHQuR2V0SG91cigpLCBkdC5HZXRNaW51dGUoKSwKLSAgICAgICAgICAgICAgICAgICBkdC5HZXRTZWNvbmQoKSk7Ci0gIGlmIChkdC5HZXRNaWxsaXNlY29uZCgpID4gMCkgewotICAgIENGWF9XaWRlU3RyaW5nIHdzVGVtcDsKLSAgICB3c1RlbXAuRm9ybWF0KEwiJTowM2QiLCBkdC5HZXRNaWxsaXNlY29uZCgpKTsKLSAgICBtX3dzVmFsdWUgKz0gd3NUZW1wOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotYm9vbCBDWEZBX0xvY2FsZVZhbHVlOjpTZXREYXRlVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlKSB7Ci0gIG1fZHdUeXBlID0gWEZBX1ZUX0RBVEVUSU1FOwotICByZXR1cm4gbV9iVmFsaWQgPSBQYXJzZVBhdHRlcm5WYWx1ZSh3c0RhdGVUaW1lLCB3c0Zvcm1hdCwgcExvY2FsZSk7Ci19Ci0KLWJvb2wgQ1hGQV9Mb2NhbGVWYWx1ZTo6Rm9ybWF0UGF0dGVybnMoQ0ZYX1dpZGVTdHJpbmcmIHdzUmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkUgZVZhbHVlVHlwZSkgY29uc3QgewotICBhdXRvIHBGb3JtYXQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0Zvcm1hdFN0cmluZz4obV9wTG9jYWxlTWdyLCBmYWxzZSk7Ci0gIHN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nPiB3c1BhdHRlcm5zOwotICBwRm9ybWF0LT5TcGxpdEZvcm1hdFN0cmluZyh3c0Zvcm1hdCwgd3NQYXR0ZXJucyk7Ci0gIHdzUmVzdWx0LmNsZWFyKCk7Ci0gIGludDMyX3QgaUNvdW50ID0gcGRmaXVtOjpDb2xsZWN0aW9uU2l6ZTxpbnQzMl90Pih3c1BhdHRlcm5zKTsKLSAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgaUNvdW50OyBpKyspIHsKLSAgICBpZiAoRm9ybWF0U2luZ2xlUGF0dGVybih3c1Jlc3VsdCwgd3NQYXR0ZXJuc1tpXSwgcExvY2FsZSwgZVZhbHVlVHlwZSkpCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgQ1hGQV9Mb2NhbGVWYWx1ZTo6Rm9ybWF0U2luZ2xlUGF0dGVybihDRlhfV2lkZVN0cmluZyYgd3NSZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRSBlVmFsdWVUeXBlKSBjb25zdCB7Ci0gIElGWF9Mb2NhbGUqIGxvY2FsZSA9IG1fcExvY2FsZU1nci0+R2V0RGVmTG9jYWxlKCk7Ci0gIGlmIChwTG9jYWxlKQotICAgIG1fcExvY2FsZU1nci0+U2V0RGVmTG9jYWxlKHBMb2NhbGUpOwotCi0gIHdzUmVzdWx0LmNsZWFyKCk7Ci0gIGJvb2wgYlJldCA9IGZhbHNlOwotICBhdXRvIHBGb3JtYXQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0Zvcm1hdFN0cmluZz4obV9wTG9jYWxlTWdyLCBmYWxzZSk7Ci0gIEZYX0xPQ0FMRUNBVEVHT1JZIGVDYXRlZ29yeSA9IHBGb3JtYXQtPkdldENhdGVnb3J5KHdzRm9ybWF0KTsKLSAgZUNhdGVnb3J5ID0gWEZBX1ZhbHVnZUNhdGVnb3J5KGVDYXRlZ29yeSwgbV9kd1R5cGUpOwotICBzd2l0Y2ggKGVDYXRlZ29yeSkgewotICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfTnVsbDoKLSAgICAgIGlmIChtX3dzVmFsdWUuSXNFbXB0eSgpKSB7Ci0gICAgICAgIGJSZXQgPSBwRm9ybWF0LT5Gb3JtYXROdWxsKHdzRm9ybWF0LCB3c1Jlc3VsdCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX1plcm86Ci0gICAgICBpZiAobV93c1ZhbHVlID09IEwiMCIpIHsKLSAgICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdFplcm8od3NGb3JtYXQsIHdzUmVzdWx0KTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfTnVtOgotICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdE51bShtX3dzVmFsdWUsIHdzRm9ybWF0LCB3c1Jlc3VsdCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX1RleHQ6Ci0gICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0VGV4dChtX3dzVmFsdWUsIHdzRm9ybWF0LCB3c1Jlc3VsdCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGU6Ci0gICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0RGF0ZVRpbWUobV93c1ZhbHVlLCB3c0Zvcm1hdCwgd3NSZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfREFURVRJTUVUWVBFX0RhdGUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9UaW1lOgotICAgICAgYlJldCA9IHBGb3JtYXQtPkZvcm1hdERhdGVUaW1lKG1fd3NWYWx1ZSwgd3NGb3JtYXQsIHdzUmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0RBVEVUSU1FVFlQRV9UaW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlhfTE9DQUxFQ0FURUdPUllfRGF0ZVRpbWU6Ci0gICAgICBiUmV0ID0gcEZvcm1hdC0+Rm9ybWF0RGF0ZVRpbWUobV93c1ZhbHVlLCB3c0Zvcm1hdCwgd3NSZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfREFURVRJTUVUWVBFX0RhdGVUaW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICB3c1Jlc3VsdCA9IG1fd3NWYWx1ZTsKLSAgICAgIGJSZXQgPSB0cnVlOwotICB9Ci0gIGlmICghYlJldCAmJiAoZUNhdGVnb3J5ICE9IEZYX0xPQ0FMRUNBVEVHT1JZX051bSB8fAotICAgICAgICAgICAgICAgIGVWYWx1ZVR5cGUgIT0gWEZBX1ZBTFVFUElDVFVSRV9EaXNwbGF5KSkgewotICAgIHdzUmVzdWx0ID0gbV93c1ZhbHVlOwotICB9Ci0gIGlmIChwTG9jYWxlKQotICAgIG1fcExvY2FsZU1nci0+U2V0RGVmTG9jYWxlKGxvY2FsZSk7Ci0KLSAgcmV0dXJuIGJSZXQ7Ci19Ci0KLXN0YXRpYyBib29sIFhGQV9WYWx1ZVNwbGl0RGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZVRpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c0RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1RpbWUpIHsKLSAgd3NEYXRlID0gTCIiOwotICB3c1RpbWUgPSBMIiI7Ci0gIGlmICh3c0RhdGVUaW1lLklzRW1wdHkoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpbnQgblNwbGl0SW5kZXggPSAtMTsKLSAgblNwbGl0SW5kZXggPSB3c0RhdGVUaW1lLkZpbmQoJ1QnKTsKLSAgaWYgKG5TcGxpdEluZGV4IDwgMCkgewotICAgIG5TcGxpdEluZGV4ID0gd3NEYXRlVGltZS5GaW5kKCcgJyk7Ci0gIH0KLSAgaWYgKG5TcGxpdEluZGV4IDwgMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB3c0RhdGUgPSB3c0RhdGVUaW1lLkxlZnQoblNwbGl0SW5kZXgpOwotICB3c1RpbWUgPSB3c0RhdGVUaW1lLlJpZ2h0KHdzRGF0ZVRpbWUuR2V0TGVuZ3RoKCkgLSBuU3BsaXRJbmRleCAtIDEpOwotICByZXR1cm4gdHJ1ZTsKLX0KLWJvb2wgQ1hGQV9Mb2NhbGVWYWx1ZTo6VmFsaWRhdGVDYW5vbmljYWxWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1ZUeXBlKSB7Ci0gIGlmICh3c1ZhbHVlLklzRW1wdHkoKSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIENGWF9Vbml0aW1lIGR0OwotICBzd2l0Y2ggKGR3VlR5cGUpIHsKLSAgICBjYXNlIFhGQV9WVF9EQVRFOiB7Ci0gICAgICBpZiAoVmFsaWRhdGVDYW5vbmljYWxEYXRlKHdzVmFsdWUsIGR0KSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZSwgd3NUaW1lOwotICAgICAgaWYgKFhGQV9WYWx1ZVNwbGl0RGF0ZVRpbWUod3NWYWx1ZSwgd3NEYXRlLCB3c1RpbWUpICYmCi0gICAgICAgICAgVmFsaWRhdGVDYW5vbmljYWxEYXRlKHdzRGF0ZSwgZHQpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjYXNlIFhGQV9WVF9USU1FOiB7Ci0gICAgICBpZiAoVmFsaWRhdGVDYW5vbmljYWxUaW1lKHdzVmFsdWUpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NEYXRlLCB3c1RpbWU7Ci0gICAgICBpZiAoWEZBX1ZhbHVlU3BsaXREYXRlVGltZSh3c1ZhbHVlLCB3c0RhdGUsIHdzVGltZSkgJiYKLSAgICAgICAgICBWYWxpZGF0ZUNhbm9uaWNhbFRpbWUod3NUaW1lKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgY2FzZSBYRkFfVlRfREFURVRJTUU6IHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzRGF0ZSwgd3NUaW1lOwotICAgICAgaWYgKFhGQV9WYWx1ZVNwbGl0RGF0ZVRpbWUod3NWYWx1ZSwgd3NEYXRlLCB3c1RpbWUpICYmCi0gICAgICAgICAgVmFsaWRhdGVDYW5vbmljYWxEYXRlKHdzRGF0ZSwgZHQpICYmIFZhbGlkYXRlQ2Fub25pY2FsVGltZSh3c1RpbWUpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0gYnJlYWs7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci1ib29sIENYRkFfTG9jYWxlVmFsdWU6OlZhbGlkYXRlQ2Fub25pY2FsRGF0ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1VuaXRpbWUmIHVuRGF0ZSkgewotICBjb25zdCB1aW50MTZfdCBMYXN0RGF5WzEyXSA9IHszMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxfTsKLSAgY29uc3QgdWludDE2X3Qgd0NvdW50WSA9IDQsIHdDb3VudE0gPSAyLCB3Q291bnREID0gMjsKLSAgaW50IG5MZW4gPSB3c0RhdGUuR2V0TGVuZ3RoKCk7Ci0gIGlmIChuTGVuIDwgd0NvdW50WSB8fCBuTGVuID4gd0NvdW50WSArIHdDb3VudE0gKyB3Q291bnREICsgMikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBjb25zdCBib29sIGJTeW1ib2wgPSB3c0RhdGUuRmluZCgweDJEKSAhPSAtMTsKLSAgdWludDE2X3Qgd1llYXIgPSAwOwotICB1aW50MTZfdCB3TW9udGggPSAwOwotICB1aW50MTZfdCB3RGF5ID0gMDsKLSAgY29uc3QgRlhfV0NIQVIqIHBEYXRlID0gd3NEYXRlLmNfc3RyKCk7Ci0gIGludCBuSW5kZXggPSAwLCBuU3RhcnQgPSAwOwotICB3aGlsZSAocERhdGVbbkluZGV4XSAhPSAnXDAnICYmIG5JbmRleCA8IHdDb3VudFkpIHsKLSAgICBpZiAoIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHBEYXRlW25JbmRleF0pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHdZZWFyID0gKHBEYXRlW25JbmRleF0gLSAnMCcpICsgd1llYXIgKiAxMDsKLSAgICBuSW5kZXgrKzsKLSAgfQotICBpZiAoYlN5bWJvbCkgewotICAgIGlmIChwRGF0ZVtuSW5kZXhdICE9IDB4MkQpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgbkluZGV4Kys7Ci0gIH0KLSAgblN0YXJ0ID0gbkluZGV4OwotICB3aGlsZSAocERhdGVbbkluZGV4XSAhPSAnXDAnICYmIG5JbmRleCAtIG5TdGFydCA8IHdDb3VudE0gJiYgbkluZGV4IDwgbkxlbikgewotICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQocERhdGVbbkluZGV4XSkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgd01vbnRoID0gKHBEYXRlW25JbmRleF0gLSAnMCcpICsgd01vbnRoICogMTA7Ci0gICAgbkluZGV4Kys7Ci0gIH0KLSAgaWYgKGJTeW1ib2wpIHsKLSAgICBpZiAocERhdGVbbkluZGV4XSAhPSAweDJEKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIG5JbmRleCsrOwotICB9Ci0gIG5TdGFydCA9IG5JbmRleDsKLSAgd2hpbGUgKHBEYXRlW25JbmRleF0gIT0gJ1wwJyAmJiBuSW5kZXggLSBuU3RhcnQgPCB3Q291bnREICYmIG5JbmRleCA8IG5MZW4pIHsKLSAgICBpZiAoIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHBEYXRlW25JbmRleF0pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHdEYXkgPSAocERhdGVbbkluZGV4XSAtICcwJykgKyB3RGF5ICogMTA7Ci0gICAgbkluZGV4Kys7Ci0gIH0KLSAgaWYgKG5JbmRleCAhPSBuTGVuKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICh3WWVhciA8IDE5MDAgfHwgd1llYXIgPiAyMDI5KSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICh3TW9udGggPCAxIHx8IHdNb250aCA+IDEyKSB7Ci0gICAgaWYgKHdNb250aCA9PSAwICYmIG5MZW4gPT0gd0NvdW50WSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAod0RheSA8IDEpIHsKLSAgICBpZiAod0RheSA9PSAwICYmIChuTGVuID09IHdDb3VudFkgKyB3Q291bnRNKSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAod01vbnRoID09IDIpIHsKLSAgICBpZiAod1llYXIgJSA0MDAgPT0gMCB8fCAod1llYXIgJSAxMDAgIT0gMCAmJiB3WWVhciAlIDQgPT0gMCkpIHsKLSAgICAgIGlmICh3RGF5ID4gMjkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAod0RheSA+IDI4KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZiAod0RheSA+IExhc3REYXlbd01vbnRoIC0gMV0pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgQ0ZYX1VuaXRpbWUgdXQ7Ci0gIHV0LlNldCh3WWVhciwgc3RhdGljX2Nhc3Q8dWludDhfdD4od01vbnRoKSwgc3RhdGljX2Nhc3Q8dWludDhfdD4od0RheSkpOwotICB1bkRhdGUgPSB1bkRhdGUgKyB1dDsKLSAgcmV0dXJuIHRydWU7Ci19Ci1ib29sIENYRkFfTG9jYWxlVmFsdWU6OlZhbGlkYXRlQ2Fub25pY2FsVGltZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUaW1lKSB7Ci0gIGludCBuTGVuID0gd3NUaW1lLkdldExlbmd0aCgpOwotICBpZiAobkxlbiA8IDIpCi0gICAgcmV0dXJuIGZhbHNlOwotICBjb25zdCB1aW50MTZfdCB3Q291bnRIID0gMjsKLSAgY29uc3QgdWludDE2X3Qgd0NvdW50TSA9IDI7Ci0gIGNvbnN0IHVpbnQxNl90IHdDb3VudFMgPSAyOwotICBjb25zdCB1aW50MTZfdCB3Q291bnRGID0gMzsKLSAgY29uc3QgYm9vbCBiU3ltYm9sID0gd3NUaW1lLkZpbmQoJzonKSAhPSAtMTsKLSAgdWludDE2X3Qgd0hvdXIgPSAwOwotICB1aW50MTZfdCB3TWludXRlID0gMDsKLSAgdWludDE2X3Qgd1NlY29uZCA9IDA7Ci0gIHVpbnQxNl90IHdGcmFjdGlvbiA9IDA7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwVGltZSA9IHdzVGltZS5jX3N0cigpOwotICBpbnQgbkluZGV4ID0gMDsKLSAgaW50IG5TdGFydCA9IDA7Ci0gIHdoaWxlIChuSW5kZXggLSBuU3RhcnQgPCB3Q291bnRIICYmIHBUaW1lW25JbmRleF0pIHsKLSAgICBpZiAoIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHBUaW1lW25JbmRleF0pKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIHdIb3VyID0gcFRpbWVbbkluZGV4XSAtICcwJyArIHdIb3VyICogMTA7Ci0gICAgbkluZGV4Kys7Ci0gIH0KLSAgaWYgKGJTeW1ib2wpIHsKLSAgICBpZiAobkluZGV4IDwgbkxlbiAmJiBwVGltZVtuSW5kZXhdICE9ICc6JykKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBuSW5kZXgrKzsKLSAgfQotICBuU3RhcnQgPSBuSW5kZXg7Ci0gIHdoaWxlIChuSW5kZXggLSBuU3RhcnQgPCB3Q291bnRNICYmIG5JbmRleCA8IG5MZW4gJiYgcFRpbWVbbkluZGV4XSkgewotICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQocFRpbWVbbkluZGV4XSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgd01pbnV0ZSA9IHBUaW1lW25JbmRleF0gLSAnMCcgKyB3TWludXRlICogMTA7Ci0gICAgbkluZGV4Kys7Ci0gIH0KLSAgaWYgKGJTeW1ib2wpIHsKLSAgICBpZiAobkluZGV4IDwgbkxlbiAmJiBwVGltZVtuSW5kZXhdICE9ICc6JykKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBuSW5kZXgrKzsKLSAgfQotICBuU3RhcnQgPSBuSW5kZXg7Ci0gIHdoaWxlIChuSW5kZXggLSBuU3RhcnQgPCB3Q291bnRTICYmIG5JbmRleCA8IG5MZW4gJiYgcFRpbWVbbkluZGV4XSkgewotICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQocFRpbWVbbkluZGV4XSkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgd1NlY29uZCA9IHBUaW1lW25JbmRleF0gLSAnMCcgKyB3U2Vjb25kICogMTA7Ci0gICAgbkluZGV4Kys7Ci0gIH0KLSAgaWYgKHdzVGltZS5GaW5kKCcuJykgPiAwKSB7Ci0gICAgaWYgKHBUaW1lW25JbmRleF0gIT0gJy4nKQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIG5JbmRleCsrOwotICAgIG5TdGFydCA9IG5JbmRleDsKLSAgICB3aGlsZSAobkluZGV4IC0gblN0YXJ0IDwgd0NvdW50RiAmJiBuSW5kZXggPCBuTGVuICYmIHBUaW1lW25JbmRleF0pIHsKLSAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQocFRpbWVbbkluZGV4XSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIHdGcmFjdGlvbiA9IHBUaW1lW25JbmRleF0gLSAnMCcgKyB3RnJhY3Rpb24gKiAxMDsKLSAgICAgIG5JbmRleCsrOwotICAgIH0KLSAgfQotICBpZiAobkluZGV4IDwgbkxlbikgewotICAgIGlmIChwVGltZVtuSW5kZXhdID09ICdaJykgewotICAgICAgbkluZGV4Kys7Ci0gICAgfSBlbHNlIGlmIChwVGltZVtuSW5kZXhdID09ICctJyB8fCBwVGltZVtuSW5kZXhdID09ICcrJykgewotICAgICAgaW50MTZfdCBuT2Zmc2V0SCA9IDA7Ci0gICAgICBpbnQxNl90IG5PZmZzZXRNID0gMDsKLSAgICAgIG5JbmRleCsrOwotICAgICAgblN0YXJ0ID0gbkluZGV4OwotICAgICAgd2hpbGUgKG5JbmRleCAtIG5TdGFydCA8IHdDb3VudEggJiYgbkluZGV4IDwgbkxlbiAmJiBwVGltZVtuSW5kZXhdKSB7Ci0gICAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQocFRpbWVbbkluZGV4XSkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBuT2Zmc2V0SCA9IHBUaW1lW25JbmRleF0gLSAnMCcgKyBuT2Zmc2V0SCAqIDEwOwotICAgICAgICBuSW5kZXgrKzsKLSAgICAgIH0KLSAgICAgIGlmIChiU3ltYm9sKSB7Ci0gICAgICAgIGlmIChuSW5kZXggPCBuTGVuICYmIHBUaW1lW25JbmRleF0gIT0gJzonKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgbkluZGV4Kys7Ci0gICAgICB9Ci0gICAgICBuU3RhcnQgPSBuSW5kZXg7Ci0gICAgICB3aGlsZSAobkluZGV4IC0gblN0YXJ0IDwgd0NvdW50TSAmJiBuSW5kZXggPCBuTGVuICYmIHBUaW1lW25JbmRleF0pIHsKLSAgICAgICAgaWYgKCFGWFNZU19pc0RlY2ltYWxEaWdpdChwVGltZVtuSW5kZXhdKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIG5PZmZzZXRNID0gcFRpbWVbbkluZGV4XSAtICcwJyArIG5PZmZzZXRNICogMTA7Ci0gICAgICAgIG5JbmRleCsrOwotICAgICAgfQotICAgICAgaWYgKG5PZmZzZXRIID4gMTIgfHwgbk9mZnNldE0gPj0gNjApCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5JbmRleCA9PSBuTGVuICYmIHdIb3VyIDwgMjQgJiYgd01pbnV0ZSA8IDYwICYmIHdTZWNvbmQgPCA2MCAmJgotICAgICAgICAgd0ZyYWN0aW9uIDw9IDk5OTsKLX0KLWJvb2wgQ1hGQV9Mb2NhbGVWYWx1ZTo6VmFsaWRhdGVDYW5vbmljYWxEYXRlVGltZSgKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NEYXRlVGltZSkgewotICBDRlhfV2lkZVN0cmluZyB3c0RhdGUsIHdzVGltZTsKLSAgaWYgKHdzRGF0ZVRpbWUuSXNFbXB0eSgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGludCBuU3BsaXRJbmRleCA9IC0xOwotICBuU3BsaXRJbmRleCA9IHdzRGF0ZVRpbWUuRmluZCgnVCcpOwotICBpZiAoblNwbGl0SW5kZXggPCAwKSB7Ci0gICAgblNwbGl0SW5kZXggPSB3c0RhdGVUaW1lLkZpbmQoJyAnKTsKLSAgfQotICBpZiAoblNwbGl0SW5kZXggPCAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHdzRGF0ZSA9IHdzRGF0ZVRpbWUuTGVmdChuU3BsaXRJbmRleCk7Ci0gIHdzVGltZSA9IHdzRGF0ZVRpbWUuUmlnaHQod3NEYXRlVGltZS5HZXRMZW5ndGgoKSAtIG5TcGxpdEluZGV4IC0gMSk7Ci0gIENGWF9Vbml0aW1lIGR0OwotICByZXR1cm4gVmFsaWRhdGVDYW5vbmljYWxEYXRlKHdzRGF0ZSwgZHQpICYmIFZhbGlkYXRlQ2Fub25pY2FsVGltZSh3c1RpbWUpOwotfQotYm9vbCBDWEZBX0xvY2FsZVZhbHVlOjpQYXJzZVBhdHRlcm5WYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSkgewotICBJRlhfTG9jYWxlKiBsb2NhbGUgPSBtX3BMb2NhbGVNZ3ItPkdldERlZkxvY2FsZSgpOwotICBpZiAocExvY2FsZSkKLSAgICBtX3BMb2NhbGVNZ3ItPlNldERlZkxvY2FsZShwTG9jYWxlKTsKLQotICBhdXRvIHBGb3JtYXQgPSBwZGZpdW06Ok1ha2VVbmlxdWU8Q0ZYX0Zvcm1hdFN0cmluZz4obV9wTG9jYWxlTWdyLCBmYWxzZSk7Ci0gIHN0ZDo6dmVjdG9yPENGWF9XaWRlU3RyaW5nPiB3c1BhdHRlcm5zOwotICBwRm9ybWF0LT5TcGxpdEZvcm1hdFN0cmluZyh3c1BhdHRlcm4sIHdzUGF0dGVybnMpOwotICBib29sIGJSZXQgPSBmYWxzZTsKLSAgaW50MzJfdCBpQ291bnQgPSBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHdzUGF0dGVybnMpOwotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpQ291bnQgJiYgIWJSZXQ7IGkrKykgewotICAgIENGWF9XaWRlU3RyaW5nIHdzRm9ybWF0ID0gd3NQYXR0ZXJuc1tpXTsKLSAgICBGWF9MT0NBTEVDQVRFR09SWSBlQ2F0ZWdvcnkgPSBwRm9ybWF0LT5HZXRDYXRlZ29yeSh3c0Zvcm1hdCk7Ci0gICAgZUNhdGVnb3J5ID0gWEZBX1ZhbHVnZUNhdGVnb3J5KGVDYXRlZ29yeSwgbV9kd1R5cGUpOwotICAgIHN3aXRjaCAoZUNhdGVnb3J5KSB7Ci0gICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX051bGw6Ci0gICAgICAgIGJSZXQgPSBwRm9ybWF0LT5QYXJzZU51bGwod3NWYWx1ZSwgd3NGb3JtYXQpOwotICAgICAgICBpZiAoYlJldCkgewotICAgICAgICAgIG1fd3NWYWx1ZS5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9aZXJvOgotICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VaZXJvKHdzVmFsdWUsIHdzRm9ybWF0KTsKLSAgICAgICAgaWYgKGJSZXQpCi0gICAgICAgICAgbV93c1ZhbHVlID0gTCIwIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX051bTogewotICAgICAgICBDRlhfV2lkZVN0cmluZyBmTnVtOwotICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VOdW0od3NWYWx1ZSwgd3NGb3JtYXQsIGZOdW0pOwotICAgICAgICBpZiAoYlJldCkgewotICAgICAgICAgIG1fd3NWYWx1ZSA9IGZOdW07Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX1RleHQ6Ci0gICAgICAgIGJSZXQgPSBwRm9ybWF0LT5QYXJzZVRleHQod3NWYWx1ZSwgd3NGb3JtYXQsIG1fd3NWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9EYXRlOiB7Ci0gICAgICAgIENGWF9Vbml0aW1lIGR0OwotICAgICAgICBiUmV0ID0gVmFsaWRhdGVDYW5vbmljYWxEYXRlKHdzVmFsdWUsIGR0KTsKLSAgICAgICAgaWYgKCFiUmV0KSB7Ci0gICAgICAgICAgYlJldCA9IHBGb3JtYXQtPlBhcnNlRGF0ZVRpbWUod3NWYWx1ZSwgd3NGb3JtYXQsIEZYX0RBVEVUSU1FVFlQRV9EYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYlJldCkgewotICAgICAgICAgIFNldERhdGUoZHQpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBGWF9MT0NBTEVDQVRFR09SWV9UaW1lOiB7Ci0gICAgICAgIENGWF9Vbml0aW1lIGR0OwotICAgICAgICBiUmV0ID0KLSAgICAgICAgICAgIHBGb3JtYXQtPlBhcnNlRGF0ZVRpbWUod3NWYWx1ZSwgd3NGb3JtYXQsIEZYX0RBVEVUSU1FVFlQRV9UaW1lLCBkdCk7Ci0gICAgICAgIGlmIChiUmV0KSB7Ci0gICAgICAgICAgU2V0VGltZShkdCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIEZYX0xPQ0FMRUNBVEVHT1JZX0RhdGVUaW1lOiB7Ci0gICAgICAgIENGWF9Vbml0aW1lIGR0OwotICAgICAgICBiUmV0ID0gcEZvcm1hdC0+UGFyc2VEYXRlVGltZSh3c1ZhbHVlLCB3c0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfREFURVRJTUVUWVBFX0RhdGVUaW1lLCBkdCk7Ci0gICAgICAgIGlmIChiUmV0KSB7Ci0gICAgICAgICAgU2V0RGF0ZVRpbWUoZHQpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgbV93c1ZhbHVlID0gd3NWYWx1ZTsKLSAgICAgICAgYlJldCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBpZiAoIWJSZXQpCi0gICAgbV93c1ZhbHVlID0gd3NWYWx1ZTsKLQotICBpZiAocExvY2FsZSkKLSAgICBtX3BMb2NhbGVNZ3ItPlNldERlZkxvY2FsZShsb2NhbGUpOwotCi0gIHJldHVybiBiUmV0OwotfQotCi12b2lkIENYRkFfTG9jYWxlVmFsdWU6OkdldE51bWJlcmljRm9ybWF0KENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuSW50TGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5EZWNMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNpZ24pIHsKLSAgQVNTRVJUKHdzRm9ybWF0LklzRW1wdHkoKSk7Ci0gIEFTU0VSVChuSW50TGVuID49IC0xICYmIG5EZWNMZW4gPj0gLTEpOwotICBpbnQzMl90IG5Ub3RhbExlbiA9IChuSW50TGVuID49IDAgPyBuSW50TGVuIDogMikgKyAoYlNpZ24gPyAxIDogMCkgKwotICAgICAgICAgICAgICAgICAgICAgIChuRGVjTGVuID49IDAgPyBuRGVjTGVuIDogMikgKyAobkRlY0xlbiA9PSAwID8gMCA6IDEpOwotICBGWF9XQ0hBUiogbHBCdWYgPSB3c0Zvcm1hdC5HZXRCdWZmZXIoblRvdGFsTGVuKTsKLSAgaW50MzJfdCBuUG9zID0gMDsKLSAgaWYgKGJTaWduKSB7Ci0gICAgbHBCdWZbblBvcysrXSA9IEwncyc7Ci0gIH0KLSAgaWYgKG5JbnRMZW4gPT0gLTEpIHsKLSAgICBscEJ1ZltuUG9zKytdID0gTCd6JzsKLSAgICBscEJ1ZltuUG9zKytdID0gTCcqJzsKLSAgfSBlbHNlIHsKLSAgICB3aGlsZSAobkludExlbikgewotICAgICAgbHBCdWZbblBvcysrXSA9IEwneic7Ci0gICAgICBuSW50TGVuLS07Ci0gICAgfQotICB9Ci0gIGlmIChuRGVjTGVuICE9IDApIHsKLSAgICBscEJ1ZltuUG9zKytdID0gTCcuJzsKLSAgfQotICBpZiAobkRlY0xlbiA9PSAtMSkgewotICAgIGxwQnVmW25Qb3MrK10gPSBMJ3onOwotICAgIGxwQnVmW25Qb3MrK10gPSBMJyonOwotICB9IGVsc2UgewotICAgIHdoaWxlIChuRGVjTGVuKSB7Ci0gICAgICBscEJ1ZltuUG9zKytdID0gTCd6JzsKLSAgICAgIG5EZWNMZW4tLTsKLSAgICB9Ci0gIH0KLSAgd3NGb3JtYXQuUmVsZWFzZUJ1ZmZlcihuVG90YWxMZW4pOwotfQotYm9vbCBDWEZBX0xvY2FsZVZhbHVlOjpWYWxpZGF0ZU51bWVyaWNUZW1wKENGWF9XaWRlU3RyaW5nJiB3c051bWVyaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcG9zKSB7Ci0gIGlmICh3c0Zvcm1hdC5Jc0VtcHR5KCkgfHwgd3NOdW1lcmljLklzRW1wdHkoKSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGNvbnN0IEZYX1dDSEFSKiBwTnVtID0gd3NOdW1lcmljLmNfc3RyKCk7Ci0gIGNvbnN0IEZYX1dDSEFSKiBwRm10ID0gd3NGb3JtYXQuY19zdHIoKTsKLSAgaW50MzJfdCBuID0gMCwgbmYgPSAwOwotICBGWF9XQ0hBUiBjID0gcE51bVtuXTsKLSAgRlhfV0NIQVIgY2YgPSBwRm10W25mXTsKLSAgaWYgKGNmID09IEwncycpIHsKLSAgICBpZiAoYyA9PSBMJy0nIHx8IGMgPT0gTCcrJykgewotICAgICAgKytuOwotICAgIH0KLSAgICArK25mOwotICB9Ci0gIGJvb2wgYkxpbWl0ID0gdHJ1ZTsKLSAgaW50MzJfdCBuQ291bnQgPSB3c051bWVyaWMuR2V0TGVuZ3RoKCk7Ci0gIGludDMyX3QgbkNvdW50Rm10ID0gd3NGb3JtYXQuR2V0TGVuZ3RoKCk7Ci0gIHdoaWxlIChuIDwgbkNvdW50ICYmIChiTGltaXQgPyBuZiA8IG5Db3VudEZtdCA6IHRydWUpICYmCi0gICAgICAgICBGWFNZU19pc0RlY2ltYWxEaWdpdChjID0gcE51bVtuXSkpIHsKLSAgICBpZiAoYkxpbWl0ID09IHRydWUpIHsKLSAgICAgIGlmICgoY2YgPSBwRm10W25mXSkgPT0gTCcqJykgewotICAgICAgICBiTGltaXQgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSBpZiAoY2YgPT0gTCd6JykgewotICAgICAgICBuZisrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBuKys7Ci0gIH0KLSAgaWYgKG4gPT0gbkNvdW50KSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKG5mID09IG5Db3VudEZtdCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB3aGlsZSAobmYgPCBuQ291bnRGbXQgJiYgKGNmID0gcEZtdFtuZl0pICE9IEwnLicpIHsKLSAgICBBU1NFUlQoY2YgPT0gTCd6JyB8fCBjZiA9PSBMJyonKTsKLSAgICArK25mOwotICB9Ci0gIENGWF9XaWRlU3RyaW5nIHdzRGVjaW1hbFN5bWJvbDsKLSAgaWYgKHBMb2NhbGUpIHsKLSAgICBwTG9jYWxlLT5HZXROdW1iZXJpY1N5bWJvbChGWF9MT0NBTEVOVU1TWU1CT0xfRGVjaW1hbCwgd3NEZWNpbWFsU3ltYm9sKTsKLSAgfSBlbHNlIHsKLSAgICB3c0RlY2ltYWxTeW1ib2wgPSBDRlhfV2lkZVN0cmluZyhMJy4nKTsKLSAgfQotICBpZiAocEZtdFtuZl0gIT0gTCcuJykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAod3NEZWNpbWFsU3ltYm9sICE9IENGWF9XaWRlU3RyaW5nQyhjKSAmJiBjICE9IEwnLicpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgKytuZjsKLSAgKytuOwotICBiTGltaXQgPSB0cnVlOwotICB3aGlsZSAobiA8IG5Db3VudCAmJiAoYkxpbWl0ID8gbmYgPCBuQ291bnRGbXQgOiB0cnVlKSAmJgotICAgICAgICAgRlhTWVNfaXNEZWNpbWFsRGlnaXQoYyA9IHBOdW1bbl0pKSB7Ci0gICAgaWYgKGJMaW1pdCA9PSB0cnVlKSB7Ci0gICAgICBpZiAoKGNmID0gcEZtdFtuZl0pID09IEwnKicpIHsKLSAgICAgICAgYkxpbWl0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgaWYgKGNmID09IEwneicpIHsKLSAgICAgICAgbmYrKzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgbisrOwotICB9Ci0gIHJldHVybiBuID09IG5Db3VudDsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxldmFsdWUuaCBiL3hmYS9meGZhL3BhcnNlci94ZmFfbG9jYWxldmFsdWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJjMzUxMy4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9wYXJzZXIveGZhX2xvY2FsZXZhbHVlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEZBX1BBUlNFUl9YRkFfTE9DQUxFVkFMVUVfSF8KLSNkZWZpbmUgWEZBX0ZYRkFfUEFSU0VSX1hGQV9MT0NBTEVWQUxVRV9IXwotCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zdHJpbmcuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3dpZGdldGRhdGEuaCIKLQotY2xhc3MgSUZYX0xvY2FsZTsKLWNsYXNzIENGWF9Vbml0aW1lOwotY2xhc3MgQ1hGQV9Mb2NhbGVNZ3I7Ci0KLSNkZWZpbmUgWEZBX1ZUX05VTEwgMAotI2RlZmluZSBYRkFfVlRfQk9PTEVBTiAxCi0jZGVmaW5lIFhGQV9WVF9JTlRFR0VSIDIKLSNkZWZpbmUgWEZBX1ZUX0RFQ0lNQUwgNAotI2RlZmluZSBYRkFfVlRfRkxPQVQgOAotI2RlZmluZSBYRkFfVlRfVEVYVCAxNgotI2RlZmluZSBYRkFfVlRfREFURSAzMgotI2RlZmluZSBYRkFfVlRfVElNRSA2NAotI2RlZmluZSBYRkFfVlRfREFURVRJTUUgMTI4Ci0KLWNsYXNzIENYRkFfTG9jYWxlVmFsdWUgewotIHB1YmxpYzoKLSAgQ1hGQV9Mb2NhbGVWYWx1ZSgpOwotICBDWEZBX0xvY2FsZVZhbHVlKGNvbnN0IENYRkFfTG9jYWxlVmFsdWUmIHZhbHVlKTsKLSAgQ1hGQV9Mb2NhbGVWYWx1ZSh1aW50MzJfdCBkd1R5cGUsIENYRkFfTG9jYWxlTWdyKiBwTG9jYWxlTWdyKTsKLSAgQ1hGQV9Mb2NhbGVWYWx1ZSh1aW50MzJfdCBkd1R5cGUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgQ1hGQV9Mb2NhbGVNZ3IqIHBMb2NhbGVNZ3IpOwotICBDWEZBX0xvY2FsZVZhbHVlKHVpbnQzMl90IGR3VHlwZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgSUZYX0xvY2FsZSogcExvY2FsZSwKLSAgICAgICAgICAgICAgICAgICBDWEZBX0xvY2FsZU1nciogcExvY2FsZU1ncik7Ci0gIH5DWEZBX0xvY2FsZVZhbHVlKCk7Ci0gIENYRkFfTG9jYWxlVmFsdWUmIG9wZXJhdG9yPShjb25zdCBDWEZBX0xvY2FsZVZhbHVlJiB2YWx1ZSk7Ci0KLSAgYm9vbCBWYWxpZGF0ZVZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyogcE1hdGNoRm9ybWF0ID0gbnVsbHB0cik7Ci0gIGJvb2wgRm9ybWF0UGF0dGVybnMoQ0ZYX1dpZGVTdHJpbmcmIHdzUmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgIFhGQV9WQUxVRVBJQ1RVUkUgZVZhbHVlVHlwZSkgY29uc3Q7Ci0gIGJvb2wgRm9ybWF0U2luZ2xlUGF0dGVybihDRlhfV2lkZVN0cmluZyYgd3NSZXN1bHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1ZBTFVFUElDVFVSRSBlVmFsdWVUeXBlKSBjb25zdDsKLSAgYm9vbCBWYWxpZGF0ZUNhbm9uaWNhbFZhbHVlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLCB1aW50MzJfdCBkd1ZUeXBlKTsKLSAgYm9vbCBWYWxpZGF0ZUNhbm9uaWNhbERhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZSwgQ0ZYX1VuaXRpbWUmIHVuRGF0ZSk7Ci0gIGJvb2wgVmFsaWRhdGVDYW5vbmljYWxUaW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RpbWUpOwotICBib29sIFZhbGlkYXRlQ2Fub25pY2FsRGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZVRpbWUpOwotICB2b2lkIEdldE51bWJlcmljRm9ybWF0KENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG5JbnRMZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuRGVjTGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNpZ24gPSB0cnVlKTsKLSAgYm9vbCBWYWxpZGF0ZU51bWVyaWNUZW1wKENGWF9XaWRlU3RyaW5nJiB3c051bWVyaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJRlhfTG9jYWxlKiBwTG9jYWxlID0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIHBvcyA9IG51bGxwdHIpOwotCi0gIENGWF9XaWRlU3RyaW5nIEdldFZhbHVlKCkgY29uc3Q7Ci0gIHVpbnQzMl90IEdldFR5cGUoKSBjb25zdDsKLSAgdm9pZCBTZXRWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwgdWludDMyX3QgZHdUeXBlKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0VGV4dCgpIGNvbnN0OwotICBGWF9GTE9BVCBHZXROdW0oKSBjb25zdDsKLSAgRlhfRE9VQkxFIEdldERvdWJsZU51bSgpIGNvbnN0OwotICBDRlhfVW5pdGltZSBHZXREYXRlKCkgY29uc3Q7Ci0gIENGWF9Vbml0aW1lIEdldFRpbWUoKSBjb25zdDsKLSAgQ0ZYX1VuaXRpbWUgR2V0RGF0ZVRpbWUoKSBjb25zdDsKLSAgYm9vbCBTZXRUZXh0KGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1RleHQpOwotICBib29sIFNldFRleHQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGV4dCwKLSAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwKLSAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUpOwotICBib29sIFNldE51bShGWF9GTE9BVCBmTnVtKTsKLSAgYm9vbCBTZXROdW0oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTnVtLAotICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NGb3JtYXQsCi0gICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUpOwotICBib29sIFNldERhdGUoY29uc3QgQ0ZYX1VuaXRpbWUmIGQpOwotICBib29sIFNldERhdGUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZSwKLSAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwKLSAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUpOwotICBib29sIFNldFRpbWUoY29uc3QgQ0ZYX1VuaXRpbWUmIHQpOwotICBib29sIFNldFRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzVGltZSwKLSAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c0Zvcm1hdCwKLSAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUpOwotICBib29sIFNldERhdGVUaW1lKGNvbnN0IENGWF9Vbml0aW1lJiBkdCk7Ci0gIGJvb2wgU2V0RGF0ZVRpbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRGF0ZVRpbWUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzRm9ybWF0LAotICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUpOwotICBib29sIElzTnVsbCgpIGNvbnN0IHsgcmV0dXJuIG1fZHdUeXBlID09IFhGQV9WVF9OVUxMOyB9Ci0gIGJvb2wgSXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIG1fd3NWYWx1ZS5Jc0VtcHR5KCk7IH0KLSAgYm9vbCBJc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gbV9iVmFsaWQ7IH0KLQotIHByb3RlY3RlZDoKLSAgYm9vbCBQYXJzZVBhdHRlcm5WYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NQYXR0ZXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgIElGWF9Mb2NhbGUqIHBMb2NhbGUpOwotICBDWEZBX0xvY2FsZU1nciogbV9wTG9jYWxlTWdyOwotICBDRlhfV2lkZVN0cmluZyBtX3dzVmFsdWU7Ci0gIHVpbnQzMl90IG1fZHdUeXBlOwotICBib29sIG1fYlZhbGlkOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhGQV9QQVJTRVJfWEZBX0xPQ0FMRVZBTFVFX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oIGIveGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MxMTY1MC4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS9wYXJzZXIveGZhX29iamVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEsODIzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfWEZBX09CSkVDVF9IXwotI2RlZmluZSBYRkFfRlhGQV9QQVJTRVJfWEZBX09CSkVDVF9IXwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+Ci0KLSNpbmNsdWRlICJmeGpzL2NmeGpzZV9hcmd1bWVudHMuaCIKLSNpbmNsdWRlICJ4ZmEvZmRlL3htbC9mZGVfeG1sLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV91dGlscy5oIgotCi1jbGFzcyBDWEZBX0RvY3VtZW50OwotY2xhc3MgQ1hGQV9Ob2RlOwotY2xhc3MgQ1hGQV9Ob2RlTGlzdDsKLQotZW51bSBjbGFzcyBYRkFfT2JqZWN0VHlwZSB7Ci0gIE9iamVjdCwKLSAgTGlzdCwKLSAgTm9kZUxpc3QsCi0gIE5vZGUsCi0gIE5vZGVDLAotICBOb2RlViwKLSAgTW9kZWxOb2RlLAotICBUZXh0Tm9kZSwKLSAgQ29udGFpbmVyTm9kZSwKLSAgQ29udGVudE5vZGUsCi0gIFZhcmlhYmxlc1RoaXMKLX07Ci0KLWVudW0gWEZBX05vZGVGbGFnIHsKLSAgWEZBX05vZGVGbGFnX05vbmUgPSAwLAotICBYRkFfTm9kZUZsYWdfSW5pdGlhbGl6ZWQgPSAxIDw8IDAsCi0gIFhGQV9Ob2RlRmxhZ19IYXNSZW1vdmVkQ2hpbGRyZW4gPSAxIDw8IDEsCi0gIFhGQV9Ob2RlRmxhZ19OZWVkc0luaXRBcHAgPSAxIDw8IDIsCi0gIFhGQV9Ob2RlRmxhZ19CaW5kRm9ybUl0ZW1zID0gMSA8PCAzLAotICBYRkFfTm9kZUZsYWdfVXNlckludGVyYWN0aXZlID0gMSA8PCA0LAotICBYRkFfTm9kZUZsYWdfU2tpcERhdGFCaW5kaW5nID0gMSA8PCA1LAotICBYRkFfTm9kZUZsYWdfT3duWE1MTm9kZSA9IDEgPDwgNiwKLSAgWEZBX05vZGVGbGFnX1VudXNlZE5vZGUgPSAxIDw8IDcsCi0gIFhGQV9Ob2RlRmxhZ19MYXlvdXRHZW5lcmF0ZWROb2RlID0gMSA8PCA4Ci19OwotCi1jbGFzcyBDWEZBX09iamVjdCA6IHB1YmxpYyBDRlhKU0VfSG9zdE9iamVjdCB7Ci0gcHVibGljOgotICBDWEZBX09iamVjdChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQsCi0gICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlIG9iamVjdFR5cGUsCi0gICAgICAgICAgICAgIFhGQV9FbGVtZW50IGVUeXBlLAotICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIGVsZW1lbnROYW1lKTsKLSAgfkNYRkFfT2JqZWN0KCkgb3ZlcnJpZGU7Ci0KLSAgQ1hGQV9Eb2N1bWVudCogR2V0RG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BEb2N1bWVudDsgfQotICBYRkFfT2JqZWN0VHlwZSBHZXRPYmplY3RUeXBlKCkgY29uc3QgeyByZXR1cm4gbV9vYmplY3RUeXBlOyB9Ci0KLSAgYm9vbCBJc05vZGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1fb2JqZWN0VHlwZSA9PSBYRkFfT2JqZWN0VHlwZTo6Tm9kZSB8fAotICAgICAgICAgICBtX29iamVjdFR5cGUgPT0gWEZBX09iamVjdFR5cGU6Ok5vZGVDIHx8Ci0gICAgICAgICAgIG1fb2JqZWN0VHlwZSA9PSBYRkFfT2JqZWN0VHlwZTo6Tm9kZVYgfHwKLSAgICAgICAgICAgbV9vYmplY3RUeXBlID09IFhGQV9PYmplY3RUeXBlOjpNb2RlbE5vZGUgfHwKLSAgICAgICAgICAgbV9vYmplY3RUeXBlID09IFhGQV9PYmplY3RUeXBlOjpUZXh0Tm9kZSB8fAotICAgICAgICAgICBtX29iamVjdFR5cGUgPT0gWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGUgfHwKLSAgICAgICAgICAgbV9vYmplY3RUeXBlID09IFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZSB8fAotICAgICAgICAgICBtX29iamVjdFR5cGUgPT0gWEZBX09iamVjdFR5cGU6OlZhcmlhYmxlc1RoaXM7Ci0gIH0KLSAgYm9vbCBJc05vZGVMaXN0KCkgY29uc3QgeyByZXR1cm4gbV9vYmplY3RUeXBlID09IFhGQV9PYmplY3RUeXBlOjpOb2RlTGlzdDsgfQotICBib29sIElzQ29udGVudE5vZGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1fb2JqZWN0VHlwZSA9PSBYRkFfT2JqZWN0VHlwZTo6Q29udGVudE5vZGU7Ci0gIH0KLSAgYm9vbCBJc0NvbnRhaW5lck5vZGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1fb2JqZWN0VHlwZSA9PSBYRkFfT2JqZWN0VHlwZTo6Q29udGFpbmVyTm9kZTsKLSAgfQotICBib29sIElzTW9kZWxOb2RlKCkgY29uc3QgeyByZXR1cm4gbV9vYmplY3RUeXBlID09IFhGQV9PYmplY3RUeXBlOjpNb2RlbE5vZGU7IH0KLSAgYm9vbCBJc05vZGVWKCkgY29uc3QgeyByZXR1cm4gbV9vYmplY3RUeXBlID09IFhGQV9PYmplY3RUeXBlOjpOb2RlVjsgfQotICBib29sIElzVmFyaWFibGVzVGhpcygpIGNvbnN0IHsKLSAgICByZXR1cm4gbV9vYmplY3RUeXBlID09IFhGQV9PYmplY3RUeXBlOjpWYXJpYWJsZXNUaGlzOwotICB9Ci0KLSAgQ1hGQV9Ob2RlKiBBc05vZGUoKTsKLSAgQ1hGQV9Ob2RlTGlzdCogQXNOb2RlTGlzdCgpOwotCi0gIGNvbnN0IENYRkFfTm9kZSogQXNOb2RlKCkgY29uc3Q7Ci0gIGNvbnN0IENYRkFfTm9kZUxpc3QqIEFzTm9kZUxpc3QoKSBjb25zdDsKLQotICBYRkFfRWxlbWVudCBHZXRFbGVtZW50VHlwZSgpIGNvbnN0OwotICBDRlhfV2lkZVN0cmluZ0MgR2V0Q2xhc3NOYW1lKCkgY29uc3Q7Ci0gIHVpbnQzMl90IEdldENsYXNzSGFzaENvZGUoKSBjb25zdDsKLSAgdm9pZCBTY3JpcHRfT2JqZWN0Q2xhc3NfQ2xhc3NOYW1lKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0KLSAgdm9pZCBUaHJvd0ludmFsaWRQcm9wZXJ0eUV4Y2VwdGlvbigpIGNvbnN0OwotICB2b2lkIFRocm93QXJndW1lbnRNaXNtYXRjaEV4Y2VwdGlvbigpIGNvbnN0OwotICB2b2lkIFRocm93SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpIGNvbnN0OwotICB2b2lkIFRocm93UGFyYW1Db3VudE1pc21hdGNoRXhjZXB0aW9uKGNvbnN0IENGWF9XaWRlU3RyaW5nJiBtZXRob2QpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgotICB2b2lkIFRocm93RXhjZXB0aW9uKGNvbnN0IEZYX1dDSEFSKiBzdHIsIC4uLikgY29uc3Q7Ci0KLSAgQ1hGQV9Eb2N1bWVudCogY29uc3QgbV9wRG9jdW1lbnQ7Ci0gIGNvbnN0IFhGQV9PYmplY3RUeXBlIG1fb2JqZWN0VHlwZTsKLSAgY29uc3QgWEZBX0VsZW1lbnQgbV9lbGVtZW50VHlwZTsKLQotICBjb25zdCB1aW50MzJfdCBtX2VsZW1lbnROYW1lSGFzaDsKLSAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDIG1fZWxlbWVudE5hbWU7Ci19OwotdXNpbmcgQ1hGQV9PYmpBcnJheSA9IENGWF9BcnJheVRlbXBsYXRlPENYRkFfT2JqZWN0Kj47Ci0KLSNkZWZpbmUgWEZBX05PREVGSUxURVJfQ2hpbGRyZW4gMHgwMQotI2RlZmluZSBYRkFfTk9ERUZJTFRFUl9Qcm9wZXJ0aWVzIDB4MDIKLSNkZWZpbmUgWEZBX05PREVGSUxURVJfT25lT2ZQcm9wZXJ0eSAweDA0Ci0jZGVmaW5lIFhGQV9DTE9ORUZMQUdfQ29udGVudCAweDAxCi1lbnVtIFhGQV9OT0RFSVRFTSB7Ci0gIFhGQV9OT0RFSVRFTV9QYXJlbnQsCi0gIFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkLAotICBYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcsCi0gIFhGQV9OT0RFSVRFTV9QcmV2U2libGluZywKLX07Ci1lbnVtIFhGQV9TT01fTUVTU0FHRVRZUEUgewotICBYRkFfU09NX1ZhbGlkYXRpb25NZXNzYWdlLAotICBYRkFfU09NX0Zvcm1hdE1lc3NhZ2UsCi0gIFhGQV9TT01fTWFuZGF0b3J5TWVzc2FnZQotfTsKLQotdXNpbmcgQ1hGQV9Ob2RlQXJyYXkgPSBDRlhfQXJyYXlUZW1wbGF0ZTxDWEZBX05vZGUqPjsKLXVzaW5nIENYRkFfTm9kZVN0YWNrID0gQ0ZYX1N0YWNrVGVtcGxhdGU8Q1hGQV9Ob2RlKj47Ci11c2luZyBDWEZBX05vZGVTZXQgPSBzdGQ6OnVub3JkZXJlZF9zZXQ8Q1hGQV9Ob2RlKj47Ci0KLXR5cGVkZWYgdm9pZCAoKlBEX0NBTExCQUNLX0ZSRUVEQVRBKSh2b2lkKiBwRGF0YSk7Ci10eXBlZGVmIHZvaWQgKCpQRF9DQUxMQkFDS19EVVBMSUNBVEVEQVRBKSh2b2lkKiYgcERhdGEpOwotCi1zdHJ1Y3QgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyB7Ci0gIFBEX0NBTExCQUNLX0ZSRUVEQVRBIHBGcmVlOwotICBQRF9DQUxMQkFDS19EVVBMSUNBVEVEQVRBIHBDb3B5OwotfTsKLQotc3RydWN0IFhGQV9NQVBEQVRBQkxPQ0sgewotICB1aW50OF90KiBHZXREYXRhKCkgY29uc3QgeyByZXR1cm4gKHVpbnQ4X3QqKXRoaXMgKyBzaXplb2YoWEZBX01BUERBVEFCTE9DSyk7IH0KLSAgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyogcENhbGxiYWNrSW5mbzsKLSAgaW50MzJfdCBpQnl0ZXM7Ci19OwotCi1zdHJ1Y3QgWEZBX01BUE1PRFVMRURBVEEgewotICBYRkFfTUFQTU9EVUxFREFUQSgpOwotICB+WEZBX01BUE1PRFVMRURBVEEoKTsKLQotICBzdGQ6Om1hcDx2b2lkKiwgdm9pZCo+IG1fVmFsdWVNYXA7Ci0gIHN0ZDo6bWFwPHZvaWQqLCBYRkFfTUFQREFUQUJMT0NLKj4gbV9CdWZmZXJNYXA7Ci19OwotCi0jZGVmaW5lIFhGQV9DYWxjUmVmQ291bnQgKHZvaWQqKSh1aW50cHRyX3QpIEZYQlNUUl9JRCgnWCcsICdGJywgJ0EnLCAnUicpCi0jZGVmaW5lIFhGQV9DYWxjRGF0YSAodm9pZCopKHVpbnRwdHJfdCkgRlhCU1RSX0lEKCdYJywgJ0YnLCAnQScsICdDJykKLSNkZWZpbmUgWEZBX0xBWU9VVElURU1LRVkgKHZvaWQqKSh1aW50cHRyX3QpIEZYQlNUUl9JRCgnTCcsICdZJywgJ0knLCAnTScpCi0KLWNsYXNzIENYRkFfTm9kZSA6IHB1YmxpYyBDWEZBX09iamVjdCB7Ci0gcHVibGljOgotICB1aW50MzJfdCBHZXRQYWNrZXRJRCgpIGNvbnN0IHsgcmV0dXJuIG1fZVBhY2tldDsgfQotCi0gIHZvaWQgU2V0RmxhZyh1aW50MzJfdCBkd0ZsYWcsIGJvb2wgYk5vdGlmeSk7Ci0gIHZvaWQgQ2xlYXJGbGFnKHVpbnQzMl90IGR3RmxhZyk7Ci0KLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgeyByZXR1cm4gSGFzRmxhZyhYRkFfTm9kZUZsYWdfSW5pdGlhbGl6ZWQpOyB9Ci0gIGJvb2wgSXNPd25YTUxOb2RlKCkgY29uc3QgeyByZXR1cm4gSGFzRmxhZyhYRkFfTm9kZUZsYWdfT3duWE1MTm9kZSk7IH0KLSAgYm9vbCBJc1VzZXJJbnRlcmFjdGl2ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gSGFzRmxhZyhYRkFfTm9kZUZsYWdfVXNlckludGVyYWN0aXZlKTsKLSAgfQotICBib29sIElzVW51c2VkTm9kZSgpIGNvbnN0IHsgcmV0dXJuIEhhc0ZsYWcoWEZBX05vZGVGbGFnX1VudXNlZE5vZGUpOyB9Ci0gIGJvb2wgSXNMYXlvdXRHZW5lcmF0ZWROb2RlKCkgY29uc3QgewotICAgIHJldHVybiBIYXNGbGFnKFhGQV9Ob2RlRmxhZ19MYXlvdXRHZW5lcmF0ZWROb2RlKTsKLSAgfQotICBib29sIEJpbmRzRm9ybUl0ZW1zKCkgY29uc3QgeyByZXR1cm4gSGFzRmxhZyhYRkFfTm9kZUZsYWdfQmluZEZvcm1JdGVtcyk7IH0KLSAgYm9vbCBIYXNSZW1vdmVkQ2hpbGRyZW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIEhhc0ZsYWcoWEZBX05vZGVGbGFnX0hhc1JlbW92ZWRDaGlsZHJlbik7Ci0gIH0KLSAgYm9vbCBOZWVkc0luaXRBcHAoKSBjb25zdCB7IHJldHVybiBIYXNGbGFnKFhGQV9Ob2RlRmxhZ19OZWVkc0luaXRBcHApOyB9Ci0KLSAgYm9vbCBJc0F0dHJpYnV0ZUluWE1MKCk7Ci0gIGJvb2wgSXNGb3JtQ29udGFpbmVyKCkgY29uc3QgewotICAgIHJldHVybiBtX2VQYWNrZXQgPT0gWEZBX1hEUFBBQ0tFVF9Gb3JtICYmIElzQ29udGFpbmVyTm9kZSgpOwotICB9Ci0gIHZvaWQgU2V0WE1MTWFwcGluZ05vZGUoQ0ZERV9YTUxOb2RlKiBwWE1MTm9kZSkgeyBtX3BYTUxOb2RlID0gcFhNTE5vZGU7IH0KLSAgQ0ZERV9YTUxOb2RlKiBHZXRYTUxNYXBwaW5nTm9kZSgpIGNvbnN0IHsgcmV0dXJuIG1fcFhNTE5vZGU7IH0KLSAgQ0ZERV9YTUxOb2RlKiBDcmVhdGVYTUxNYXBwaW5nTm9kZSgpOwotICBib29sIElzTmVlZFNhdmluZ1hNTE5vZGUoKTsKLSAgdWludDMyX3QgR2V0TmFtZUhhc2goKSBjb25zdCB7IHJldHVybiBtX2R3TmFtZUhhc2g7IH0KLSAgYm9vbCBJc1VubmFtZWQoKSBjb25zdCB7IHJldHVybiBtX2R3TmFtZUhhc2ggPT0gMDsgfQotICBDWEZBX05vZGUqIEdldE1vZGVsTm9kZSgpOwotICB2b2lkIFVwZGF0ZU5hbWVIYXNoKCk7Ci0gIGJvb2wgSGFzQXR0cmlidXRlKFhGQV9BVFRSSUJVVEUgZUF0dHIsIGJvb2wgYkNhbkluaGVyaXQgPSBmYWxzZSk7Ci0gIGJvb2wgU2V0QXR0cmlidXRlKFhGQV9BVFRSSUJVVEUgZUF0dHIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5ID0gZmFsc2UpOwotICBib29sIEdldEF0dHJpYnV0ZShYRkFfQVRUUklCVVRFIGVBdHRyLAotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBiVXNlRGVmYXVsdCA9IHRydWUpOwotICBib29sIFNldEF0dHJpYnV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQXR0ciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlLAotICAgICAgICAgICAgICAgICAgICBib29sIGJOb3RpZnkgPSBmYWxzZSk7Ci0gIGJvb2wgR2V0QXR0cmlidXRlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NBdHRyLAotICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBiVXNlRGVmYXVsdCA9IHRydWUpOwotICBib29sIFJlbW92ZUF0dHJpYnV0ZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzQXR0cik7Ci0gIGJvb2wgU2V0Q29udGVudChjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NDb250ZW50LAotICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzWE1MVmFsdWUsCi0gICAgICAgICAgICAgICAgICBib29sIGJOb3RpZnkgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgIGJvb2wgYlNjcmlwdE1vZGlmeSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgYm9vbCBiU3luY0RhdGEgPSB0cnVlKTsKLSAgYm9vbCBUcnlDb250ZW50KENGWF9XaWRlU3RyaW5nJiB3c0NvbnRlbnQsCi0gICAgICAgICAgICAgICAgICBib29sIGJTY3JpcHRNb2RpZnkgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgIGJvb2wgYlByb3RvID0gdHJ1ZSk7Ci0gIENGWF9XaWRlU3RyaW5nIEdldENvbnRlbnQoKTsKLQotICBib29sIFRyeU5hbWVzcGFjZShDRlhfV2lkZVN0cmluZyYgd3NOYW1lc3BhY2UpOwotCi0gIGJvb2wgU2V0Qm9vbGVhbihYRkFfQVRUUklCVVRFIGVBdHRyLCBib29sIGJWYWx1ZSwgYm9vbCBiTm90aWZ5ID0gZmFsc2UpIHsKLSAgICByZXR1cm4gU2V0VmFsdWUoZUF0dHIsIFhGQV9BVFRSSUJVVEVUWVBFX0Jvb2xlYW4sICh2b2lkKikodWludHB0cl90KWJWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgYk5vdGlmeSk7Ci0gIH0KLSAgYm9vbCBUcnlCb29sZWFuKFhGQV9BVFRSSUJVVEUgZUF0dHIsIGJvb2wmIGJWYWx1ZSwgYm9vbCBiVXNlRGVmYXVsdCA9IHRydWUpOwotICBib29sIEdldEJvb2xlYW4oWEZBX0FUVFJJQlVURSBlQXR0cikgewotICAgIGJvb2wgYlZhbHVlOwotICAgIHJldHVybiBUcnlCb29sZWFuKGVBdHRyLCBiVmFsdWUsIHRydWUpID8gYlZhbHVlIDogZmFsc2U7Ci0gIH0KLSAgYm9vbCBTZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEUgZUF0dHIsIGludDMyX3QgaVZhbHVlLCBib29sIGJOb3RpZnkgPSBmYWxzZSkgewotICAgIHJldHVybiBTZXRWYWx1ZShlQXR0ciwgWEZBX0FUVFJJQlVURVRZUEVfSW50ZWdlciwgKHZvaWQqKSh1aW50cHRyX3QpaVZhbHVlLAotICAgICAgICAgICAgICAgICAgICBiTm90aWZ5KTsKLSAgfQotICBib29sIFRyeUludGVnZXIoWEZBX0FUVFJJQlVURSBlQXR0ciwKLSAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlWYWx1ZSwKLSAgICAgICAgICAgICAgICAgIGJvb2wgYlVzZURlZmF1bHQgPSB0cnVlKTsKLSAgaW50MzJfdCBHZXRJbnRlZ2VyKFhGQV9BVFRSSUJVVEUgZUF0dHIpIHsKLSAgICBpbnQzMl90IGlWYWx1ZTsKLSAgICByZXR1cm4gVHJ5SW50ZWdlcihlQXR0ciwgaVZhbHVlLCB0cnVlKSA/IGlWYWx1ZSA6IDA7Ci0gIH0KLSAgYm9vbCBTZXRFbnVtKFhGQV9BVFRSSUJVVEUgZUF0dHIsCi0gICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTSBlVmFsdWUsCi0gICAgICAgICAgICAgICBib29sIGJOb3RpZnkgPSBmYWxzZSkgewotICAgIHJldHVybiBTZXRWYWx1ZShlQXR0ciwgWEZBX0FUVFJJQlVURVRZUEVfRW51bSwgKHZvaWQqKSh1aW50cHRyX3QpZVZhbHVlLAotICAgICAgICAgICAgICAgICAgICBiTm90aWZ5KTsKLSAgfQotICBib29sIFRyeUVudW0oWEZBX0FUVFJJQlVURSBlQXR0ciwKLSAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVFTlVNJiBlVmFsdWUsCi0gICAgICAgICAgICAgICBib29sIGJVc2VEZWZhdWx0ID0gdHJ1ZSk7Ci0gIFhGQV9BVFRSSUJVVEVFTlVNIEdldEVudW0oWEZBX0FUVFJJQlVURSBlQXR0cikgewotICAgIFhGQV9BVFRSSUJVVEVFTlVNIGVWYWx1ZTsKLSAgICByZXR1cm4gVHJ5RW51bShlQXR0ciwgZVZhbHVlLCB0cnVlKSA/IGVWYWx1ZSA6IFhGQV9BVFRSSUJVVEVFTlVNX1Vua25vd247Ci0gIH0KLSAgYm9vbCBTZXRDRGF0YShYRkFfQVRUUklCVVRFIGVBdHRyLAotICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1ZhbHVlLAotICAgICAgICAgICAgICAgIGJvb2wgYk5vdGlmeSA9IGZhbHNlLAotICAgICAgICAgICAgICAgIGJvb2wgYlNjcmlwdE1vZGlmeSA9IGZhbHNlKTsKLSAgYm9vbCBTZXRBdHRyaWJ1dGVWYWx1ZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NYTUxWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJOb3RpZnkgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTY3JpcHRNb2RpZnkgPSBmYWxzZSk7Ci0gIGJvb2wgVHJ5Q0RhdGEoWEZBX0FUVFJJQlVURSBlQXR0ciwKLSAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyYgd3NWYWx1ZSwKLSAgICAgICAgICAgICAgICBib29sIGJVc2VEZWZhdWx0ID0gdHJ1ZSwKLSAgICAgICAgICAgICAgICBib29sIGJQcm90byA9IHRydWUpOwotICBib29sIFRyeUNEYXRhKFhGQV9BVFRSSUJVVEUgZUF0dHIsCi0gICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlLAotICAgICAgICAgICAgICAgIGJvb2wgYlVzZURlZmF1bHQgPSB0cnVlLAotICAgICAgICAgICAgICAgIGJvb2wgYlByb3RvID0gdHJ1ZSk7Ci0gIENGWF9XaWRlU3RyaW5nQyBHZXRDRGF0YShYRkFfQVRUUklCVVRFIGVBdHRyKSB7Ci0gICAgQ0ZYX1dpZGVTdHJpbmdDIHdzVmFsdWU7Ci0gICAgcmV0dXJuIFRyeUNEYXRhKGVBdHRyLCB3c1ZhbHVlKSA/IHdzVmFsdWUgOiBDRlhfV2lkZVN0cmluZ0MoKTsKLSAgfQotICBib29sIFNldE1lYXN1cmUoWEZBX0FUVFJJQlVURSBlQXR0ciwKLSAgICAgICAgICAgICAgICAgIENYRkFfTWVhc3VyZW1lbnQgbVZhbHVlLAotICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5ID0gZmFsc2UpOwotICBib29sIFRyeU1lYXN1cmUoWEZBX0FUVFJJQlVURSBlQXR0ciwKLSAgICAgICAgICAgICAgICAgIENYRkFfTWVhc3VyZW1lbnQmIG1WYWx1ZSwKLSAgICAgICAgICAgICAgICAgIGJvb2wgYlVzZURlZmF1bHQgPSB0cnVlKSBjb25zdDsKLSAgQ1hGQV9NZWFzdXJlbWVudCBHZXRNZWFzdXJlKFhGQV9BVFRSSUJVVEUgZUF0dHIpIGNvbnN0OwotICBib29sIFNldE9iamVjdChYRkFfQVRUUklCVVRFIGVBdHRyLAotICAgICAgICAgICAgICAgICB2b2lkKiBwRGF0YSwKLSAgICAgICAgICAgICAgICAgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyogcENhbGxiYWNrSW5mbyA9IG51bGxwdHIpOwotICBib29sIFRyeU9iamVjdChYRkFfQVRUUklCVVRFIGVBdHRyLCB2b2lkKiYgcERhdGEpOwotICB2b2lkKiBHZXRPYmplY3QoWEZBX0FUVFJJQlVURSBlQXR0cikgewotICAgIHZvaWQqIHBEYXRhOwotICAgIHJldHVybiBUcnlPYmplY3QoZUF0dHIsIHBEYXRhKSA/IHBEYXRhIDogbnVsbHB0cjsKLSAgfQotICBib29sIFNldFVzZXJEYXRhKHZvaWQqIHBLZXksCi0gICAgICAgICAgICAgICAgICAgdm9pZCogcERhdGEsCi0gICAgICAgICAgICAgICAgICAgWEZBX01BUERBVEFCTE9DS0NBTExCQUNLSU5GTyogcENhbGxiYWNrSW5mbyA9IG51bGxwdHIpOwotICBib29sIFRyeVVzZXJEYXRhKHZvaWQqIHBLZXksIHZvaWQqJiBwRGF0YSwgYm9vbCBiUHJvdG9BbHNvID0gZmFsc2UpOwotICB2b2lkKiBHZXRVc2VyRGF0YSh2b2lkKiBwS2V5LCBib29sIGJQcm90b0Fsc28gPSBmYWxzZSkgewotICAgIHZvaWQqIHBEYXRhOwotICAgIHJldHVybiBUcnlVc2VyRGF0YShwS2V5LCBwRGF0YSwgYlByb3RvQWxzbykgPyBwRGF0YSA6IG51bGxwdHI7Ci0gIH0KLSAgQ1hGQV9Ob2RlKiBHZXRQcm9wZXJ0eShpbnQzMl90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50IGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkNyZWF0ZVByb3BlcnR5ID0gdHJ1ZSk7Ci0gIGludDMyX3QgQ291bnRDaGlsZHJlbihYRkFfRWxlbWVudCBlVHlwZSwgYm9vbCBiT25seUNoaWxkID0gZmFsc2UpOwotICBDWEZBX05vZGUqIEdldENoaWxkKGludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQgZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCBiT25seUNoaWxkID0gZmFsc2UpOwotICBpbnQzMl90IEluc2VydENoaWxkKGludDMyX3QgaW5kZXgsIENYRkFfTm9kZSogcE5vZGUpOwotICBib29sIEluc2VydENoaWxkKENYRkFfTm9kZSogcE5vZGUsIENYRkFfTm9kZSogcEJlZm9yZU5vZGUgPSBudWxscHRyKTsKLSAgYm9vbCBSZW1vdmVDaGlsZChDWEZBX05vZGUqIHBOb2RlLCBib29sIGJOb3RpZnkgPSB0cnVlKTsKLSAgQ1hGQV9Ob2RlKiBDbG9uZShib29sIGJSZWN1cnNpdmUpOwotICBDWEZBX05vZGUqIEdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTSBlSXRlbSkgY29uc3Q7Ci0gIENYRkFfTm9kZSogR2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNIGVJdGVtLCBYRkFfT2JqZWN0VHlwZSBlVHlwZSkgY29uc3Q7Ci0gIGludDMyX3QgR2V0Tm9kZUxpc3QoQ1hGQV9Ob2RlQXJyYXkmIG5vZGVzLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3VHlwZUZpbHRlciA9IFhGQV9OT0RFRklMVEVSX0NoaWxkcmVuIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfTk9ERUZJTFRFUl9Qcm9wZXJ0aWVzLAotICAgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50IGVUeXBlRmlsdGVyID0gWEZBX0VsZW1lbnQ6OlVua25vd24sCi0gICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpTGV2ZWwgPSAxKTsKLSAgQ1hGQV9Ob2RlKiBDcmVhdGVTYW1lUGFja2V0Tm9kZShYRkFfRWxlbWVudCBlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzID0gWEZBX05vZGVGbGFnX0luaXRpYWxpemVkKTsKLSAgQ1hGQV9Ob2RlKiBDbG9uZVRlbXBsYXRlVG9Gb3JtKGJvb2wgYlJlY3Vyc2l2ZSk7Ci0gIENYRkFfTm9kZSogR2V0VGVtcGxhdGVOb2RlKCkgY29uc3Q7Ci0gIHZvaWQgU2V0VGVtcGxhdGVOb2RlKENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSk7Ci0gIENYRkFfTm9kZSogR2V0RGF0YURlc2NyaXB0aW9uTm9kZSgpOwotICB2b2lkIFNldERhdGFEZXNjcmlwdGlvbk5vZGUoQ1hGQV9Ob2RlKiBwRGF0YURlc2NyaXB0aW9uTm9kZSk7Ci0gIENYRkFfTm9kZSogR2V0QmluZERhdGEoKTsKLSAgaW50MzJfdCBHZXRCaW5kSXRlbXMoQ1hGQV9Ob2RlQXJyYXkmIGZvcm1JdGVtcyk7Ci0gIGludDMyX3QgQWRkQmluZEl0ZW0oQ1hGQV9Ob2RlKiBwRm9ybU5vZGUpOwotICBpbnQzMl90IFJlbW92ZUJpbmRJdGVtKENYRkFfTm9kZSogcEZvcm1Ob2RlKTsKLSAgYm9vbCBIYXNCaW5kSXRlbSgpOwotICBDWEZBX1dpZGdldERhdGEqIEdldFdpZGdldERhdGEoKTsKLSAgQ1hGQV9XaWRnZXREYXRhKiBHZXRDb250YWluZXJXaWRnZXREYXRhKCk7Ci0gIGJvb2wgR2V0TG9jYWxlTmFtZShDRlhfV2lkZVN0cmluZyYgd3NMb2NhbGVOYW1lKTsKLSAgWEZBX0FUVFJJQlVURUVOVU0gR2V0SW50YWN0KCk7Ci0gIENYRkFfTm9kZSogR2V0Rmlyc3RDaGlsZEJ5TmFtZShjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTm9kZU5hbWUpIGNvbnN0OwotICBDWEZBX05vZGUqIEdldEZpcnN0Q2hpbGRCeU5hbWUodWludDMyX3QgZHdOb2RlTmFtZUhhc2gpIGNvbnN0OwotICBDWEZBX05vZGUqIEdldEZpcnN0Q2hpbGRCeUNsYXNzKFhGQV9FbGVtZW50IGVUeXBlKSBjb25zdDsKLSAgQ1hGQV9Ob2RlKiBHZXROZXh0U2FtZU5hbWVTaWJsaW5nKHVpbnQzMl90IGR3Tm9kZU5hbWVIYXNoKSBjb25zdDsKLSAgQ1hGQV9Ob2RlKiBHZXROZXh0U2FtZU5hbWVTaWJsaW5nKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOb2RlTmFtZSkgY29uc3Q7Ci0gIENYRkFfTm9kZSogR2V0TmV4dFNhbWVDbGFzc1NpYmxpbmcoWEZBX0VsZW1lbnQgZVR5cGUpIGNvbnN0OwotICBpbnQzMl90IEdldE5vZGVTYW1lTmFtZUluZGV4KCkgY29uc3Q7Ci0gIGludDMyX3QgR2V0Tm9kZVNhbWVDbGFzc0luZGV4KCkgY29uc3Q7Ci0gIHZvaWQgR2V0U09NRXhwcmVzc2lvbihDRlhfV2lkZVN0cmluZyYgd3NTT01FeHByZXNzaW9uKTsKLSAgQ1hGQV9Ob2RlKiBHZXRJbnN0YW5jZU1nck9mU3ViZm9ybSgpOwotCi0gIENYRkFfTm9kZSogR2V0T2NjdXJOb2RlKCk7Ci0gIHZvaWQgU2NyaXB0X1RyZWVDbGFzc19SZXNvbHZlTm9kZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfVHJlZUNsYXNzX1Jlc29sdmVOb2RlcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfU29tX1Jlc29sdmVOb2RlTGlzdChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVN0cmluZyB3c0V4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcmVmTm9kZSA9IG51bGxwdHIpOwotICB2b2lkIFNjcmlwdF9UcmVlQ2xhc3NfQWxsKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfVHJlZUNsYXNzX05vZGVzKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2NyaXB0X1RyZWVDbGFzc19DbGFzc0FsbChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIFNjcmlwdF9UcmVlQ2xhc3NfUGFyZW50KENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfVHJlZUNsYXNzX0luZGV4KENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2NyaXB0X1RyZWVDbGFzc19DbGFzc0luZGV4KENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIFNjcmlwdF9UcmVlQ2xhc3NfU29tRXhwcmVzc2lvbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfTm9kZUNsYXNzX0FwcGx5WFNMKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfQXNzaWduTm9kZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfTm9kZUNsYXNzX0Nsb25lKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfR2V0QXR0cmlidXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfR2V0RWxlbWVudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfTm9kZUNsYXNzX0lzUHJvcGVydHlTcGVjaWZpZWQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X05vZGVDbGFzc19Mb2FkWE1MKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfU2F2ZUZpbHRlcmVkWE1MKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfU2F2ZVhNTChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfTm9kZUNsYXNzX1NldEF0dHJpYnV0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfTm9kZUNsYXNzX1NldEVsZW1lbnQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X05vZGVDbGFzc19OcyhDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfTW9kZWwoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfTm9kZUNsYXNzX0lzQ29udGFpbmVyKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2NyaXB0X05vZGVDbGFzc19Jc051bGwoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIFNjcmlwdF9Ob2RlQ2xhc3NfT25lT2ZDaGlsZChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfQ29udGFpbmVyQ2xhc3NfR2V0RGVsdGEoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X0NvbnRhaW5lckNsYXNzX0dldERlbHRhcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfTW9kZWxDbGFzc19DbGVhckVycm9yTGlzdChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfTW9kZWxDbGFzc19DcmVhdGVOb2RlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9Nb2RlbENsYXNzX0lzQ29tcGF0aWJsZU5TKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9Nb2RlbENsYXNzX0NvbnRleHQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfTW9kZWxDbGFzc19BbGlhc05vZGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2NyaXB0X1dzZGxDb25uZWN0aW9uX0V4ZWN1dGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X0RlbHRhX1Jlc3RvcmUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X0RlbHRhX0N1cnJlbnRWYWx1ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIFNjcmlwdF9EZWx0YV9TYXZlZFZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfRGVsdGFfVGFyZ2V0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2NyaXB0X0F0dHJpYnV0ZV9TZW5kQXR0cmlidXRlQ2hhbmdlTWVzc2FnZShYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTY3JpcHRNb2RpZnkpOwotICB2b2lkIFNjcmlwdF9BdHRyaWJ1dGVfSW50ZWdlcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfQXR0cmlidXRlX0ludGVnZXJSZWFkKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2NyaXB0X0F0dHJpYnV0ZV9CT09MKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIFNjcmlwdF9BdHRyaWJ1dGVfQk9PTFJlYWQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfQXR0cmlidXRlX1N0cmluZyhDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2NyaXB0X0F0dHJpYnV0ZV9TdHJpbmdSZWFkKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIFNjcmlwdF9Tb21fVmFsaWRhdGlvbk1lc3NhZ2UoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfRmllbGRfTGVuZ3RoKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2NyaXB0X1NvbV9EZWZhdWx0VmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIFNjcmlwdF9Tb21fRGVmYXVsdFZhbHVlX1JlYWQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfQm9vbGVhbl9WYWx1ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2NyaXB0X1NvbV9NZXNzYWdlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfU09NX01FU1NBR0VUWVBFIGlNZXNzYWdlVHlwZSk7Ci0gIHZvaWQgU2NyaXB0X1NvbV9Cb3JkZXJDb2xvcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIFNjcmlwdF9Tb21fQm9yZGVyV2lkdGgoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfU29tX0ZpbGxDb2xvcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2NyaXB0X1NvbV9EYXRhTm9kZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIFNjcmlwdF9Tb21fRm9udENvbG9yKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfU29tX01hbmRhdG9yeShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2NyaXB0X1NvbV9NYW5kYXRvcnlNZXNzYWdlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIFNjcmlwdF9Tb21fSW5zdGFuY2VJbmRleChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfRHJhd19EZWZhdWx0VmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2NyaXB0X0ZpZWxkX0RlZmF1bHRWYWx1ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIFNjcmlwdF9GaWVsZF9FZGl0VmFsdWUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfRmllbGRfRm9ybWF0TWVzc2FnZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2NyaXB0X0ZpZWxkX0Zvcm1hdHRlZFZhbHVlKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIFNjcmlwdF9GaWVsZF9QYXJlbnRTdWJmb3JtKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfRmllbGRfU2VsZWN0ZWRJbmRleChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2NyaXB0X0ZpZWxkX0NsZWFySXRlbXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X0ZpZWxkX0V4ZWNFdmVudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfRmllbGRfRXhlY0luaXRpYWxpemUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X0ZpZWxkX0RlbGV0ZUl0ZW0oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X0ZpZWxkX0dldFNhdmVJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9GaWVsZF9Cb3VuZEl0ZW0oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X0ZpZWxkX0dldEl0ZW1TdGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfRmllbGRfRXhlY0NhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfRmllbGRfU2V0SXRlbXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X0ZpZWxkX0dldERpc3BsYXlJdGVtKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9GaWVsZF9TZXRJdGVtU3RhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X0ZpZWxkX0FkZEl0ZW0oQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X0ZpZWxkX0V4ZWNWYWxpZGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfRXhjbEdyb3VwX0RlZmF1bHRBbmRSYXdWYWx1ZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2NyaXB0X0V4Y2xHcm91cF9FcnJvclRleHQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIFNjcmlwdF9FeGNsR3JvdXBfVHJhbnNpZW50KENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfRXhjbEdyb3VwX0V4ZWNFdmVudChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfRXhjbEdyb3VwX1NlbGVjdGVkTWVtYmVyKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9FeGNsR3JvdXBfRXhlY0luaXRpYWxpemUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X0V4Y2xHcm91cF9FeGVjQ2FsY3VsYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9FeGNsR3JvdXBfRXhlY1ZhbGlkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9TdWJmb3JtX0luc3RhbmNlTWFuYWdlcihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfU3ViZm9ybV9Mb2NhbGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2NyaXB0X1N1YmZvcm1fRXhlY0V2ZW50KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9TdWJmb3JtX0V4ZWNJbml0aWFsaXplKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9TdWJmb3JtX0V4ZWNDYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X1N1YmZvcm1fRXhlY1ZhbGlkYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9TdWJmb3JtX0dldEludmFsaWRPYmplY3RzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotCi0gIGludDMyX3QgU3ViZm9ybV9hbmRfU3ViZm9ybVNldF9JbnN0YW5jZUluZGV4KCk7Ci0gIHZvaWQgU2NyaXB0X1RlbXBsYXRlX0Zvcm1Ob2RlcyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfVGVtcGxhdGVfUmVtZXJnZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfVGVtcGxhdGVfRXhlY0luaXRpYWxpemUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X1RlbXBsYXRlX0NyZWF0ZU5vZGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X1RlbXBsYXRlX1JlY2FsY3VsYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9UZW1wbGF0ZV9FeGVjQ2FsY3VsYXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9UZW1wbGF0ZV9FeGVjVmFsaWRhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X01hbmlmZXN0X0V2YWx1YXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfQ291bnQoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX01heChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2NyaXB0X0luc3RhbmNlTWFuYWdlcl9NaW4oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIFNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfTW92ZUluc3RhbmNlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9JbnN0YW5jZU1hbmFnZXJfUmVtb3ZlSW5zdGFuY2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X0luc3RhbmNlTWFuYWdlcl9TZXRJbnN0YW5jZXMoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X0luc3RhbmNlTWFuYWdlcl9BZGRJbnN0YW5jZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfSW5zdGFuY2VNYW5hZ2VyX0luc2VydEluc3RhbmNlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICBpbnQzMl90IEluc3RhbmNlTWFuYWdlcl9TZXRJbnN0YW5jZXMoaW50MzJfdCBpQ291bnQpOwotICBpbnQzMl90IEluc3RhbmNlTWFuYWdlcl9Nb3ZlSW5zdGFuY2UoaW50MzJfdCBpVG8sIGludDMyX3QgaUZyb20pOwotICB2b2lkIFNjcmlwdF9PY2N1cl9NYXgoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfT2NjdXJfTWluKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2NyaXB0X0Rlc2NfTWV0YWRhdGEoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X0Zvcm1fRm9ybU5vZGVzKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9Gb3JtX1JlbWVyZ2UoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X0Zvcm1fRXhlY0luaXRpYWxpemUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X0Zvcm1fUmVjYWxjdWxhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X0Zvcm1fRXhlY0NhbGN1bGF0ZShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfRm9ybV9FeGVjVmFsaWRhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X0Zvcm1fQ2hlY2tzdW0oQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIFNjcmlwdF9QYWNrZXRfR2V0QXR0cmlidXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9QYWNrZXRfU2V0QXR0cmlidXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9QYWNrZXRfUmVtb3ZlQXR0cmlidXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9QYWNrZXRfQ29udGVudChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfU291cmNlX05leHQoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X1NvdXJjZV9DYW5jZWxCYXRjaChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfU291cmNlX0ZpcnN0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9Tb3VyY2VfVXBkYXRlQmF0Y2goQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X1NvdXJjZV9QcmV2aW91cyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfU291cmNlX0lzQk9GKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9Tb3VyY2VfSXNFT0YoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X1NvdXJjZV9DYW5jZWwoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X1NvdXJjZV9VcGRhdGUoQ0ZYSlNFX0FyZ3VtZW50cyogcEFyZ3VtZW50cyk7Ci0gIHZvaWQgU2NyaXB0X1NvdXJjZV9PcGVuKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9Tb3VyY2VfRGVsZXRlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9Tb3VyY2VfQWRkTmV3KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9Tb3VyY2VfUmVxdWVyeShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfU291cmNlX1Jlc3luYyhDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfU291cmNlX0Nsb3NlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9Tb3VyY2VfTGFzdChDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfU291cmNlX0hhc0RhdGFDaGFuZ2VkKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9Tb3VyY2VfRGIoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfWGZhX1RoaXMoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2NyaXB0X0hhbmRsZXJfVmVyc2lvbihDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIFNjcmlwdF9TdWJtaXRGb3JtYXRfTW9kZShDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2V0dGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLSAgdm9pZCBTY3JpcHRfRXh0cmFzX1R5cGUoQ0ZYSlNFX1ZhbHVlKiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci0gIHZvaWQgU2NyaXB0X0VuY3J5cHRfRm9ybWF0KENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUpOwotICB2b2lkIFNjcmlwdF9TY3JpcHRfU3RhdGVsZXNzKENGWEpTRV9WYWx1ZSogcFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNldHRpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlKTsKLQotIHByb3RlY3RlZDoKLSAgZnJpZW5kIGNsYXNzIENYRkFfRG9jdW1lbnQ7Ci0KLSAgQ1hGQV9Ob2RlKENYRkFfRG9jdW1lbnQqIHBEb2MsCi0gICAgICAgICAgICB1aW50MTZfdCBlUGFja2V0LAotICAgICAgICAgICAgWEZBX09iamVjdFR5cGUgb1R5cGUsCi0gICAgICAgICAgICBYRkFfRWxlbWVudCBlVHlwZSwKLSAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgZWxlbWVudE5hbWUpOwotICB+Q1hGQV9Ob2RlKCkgb3ZlcnJpZGU7Ci0KLSAgYm9vbCBIYXNGbGFnKFhGQV9Ob2RlRmxhZyBkd0ZsYWcpIGNvbnN0OwotICBDWEZBX05vZGUqIERlcHJlY2F0ZWRfR2V0UHJldlNpYmxpbmcoKTsKLSAgYm9vbCBTZXRWYWx1ZShYRkFfQVRUUklCVVRFIGVBdHRyLAotICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVUWVBFIGVUeXBlLAotICAgICAgICAgICAgICAgIHZvaWQqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICBib29sIGJOb3RpZnkpOwotICBib29sIEdldFZhbHVlKFhGQV9BVFRSSUJVVEUgZUF0dHIsCi0gICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUsCi0gICAgICAgICAgICAgICAgYm9vbCBiVXNlRGVmYXVsdCwKLSAgICAgICAgICAgICAgICB2b2lkKiYgcFZhbHVlKTsKLSAgdm9pZCBPblJlbW92ZWQoYm9vbCBiTm90aWZ5KTsKLSAgdm9pZCBPbkNoYW5naW5nKFhGQV9BVFRSSUJVVEUgZUF0dHIsIGJvb2wgYk5vdGlmeSk7Ci0gIHZvaWQgT25DaGFuZ2VkKFhGQV9BVFRSSUJVVEUgZUF0dHIsIGJvb2wgYk5vdGlmeSwgYm9vbCBiU2NyaXB0TW9kaWZ5KTsKLSAgaW50MzJfdCBleGVjU2luZ2xlRXZlbnRCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0V2ZW50TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQgZVR5cGUpOwotICBib29sIFNldFNjcmlwdENvbnRlbnQoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzQ29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1hNTFZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiTm90aWZ5ID0gdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlNjcmlwdE1vZGlmeSA9IGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3luY0RhdGEgPSB0cnVlKTsKLSAgQ0ZYX1dpZGVTdHJpbmcgR2V0U2NyaXB0Q29udGVudChib29sIGJTY3JpcHRNb2RpZnkgPSBmYWxzZSk7Ci0gIFhGQV9NQVBNT0RVTEVEQVRBKiBDcmVhdGVNYXBNb2R1bGVEYXRhKCk7Ci0gIFhGQV9NQVBNT0RVTEVEQVRBKiBHZXRNYXBNb2R1bGVEYXRhKCkgY29uc3Q7Ci0gIHZvaWQgU2V0TWFwTW9kdWxlVmFsdWUodm9pZCogcEtleSwgdm9pZCogcFZhbHVlKTsKLSAgYm9vbCBHZXRNYXBNb2R1bGVWYWx1ZSh2b2lkKiBwS2V5LCB2b2lkKiYgcFZhbHVlKTsKLSAgdm9pZCBTZXRNYXBNb2R1bGVTdHJpbmcodm9pZCogcEtleSwgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlKTsKLSAgYm9vbCBHZXRNYXBNb2R1bGVTdHJpbmcodm9pZCogcEtleSwgQ0ZYX1dpZGVTdHJpbmdDJiB3c1ZhbHVlKTsKLSAgdm9pZCBTZXRNYXBNb2R1bGVCdWZmZXIoCi0gICAgICB2b2lkKiBwS2V5LAotICAgICAgdm9pZCogcFZhbHVlLAotICAgICAgaW50MzJfdCBpQnl0ZXMsCi0gICAgICBYRkFfTUFQREFUQUJMT0NLQ0FMTEJBQ0tJTkZPKiBwQ2FsbGJhY2tJbmZvID0gbnVsbHB0cik7Ci0gIGJvb2wgR2V0TWFwTW9kdWxlQnVmZmVyKHZvaWQqIHBLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlCeXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiUHJvdG9BbHNvID0gdHJ1ZSkgY29uc3Q7Ci0gIGJvb2wgSGFzTWFwTW9kdWxlS2V5KHZvaWQqIHBLZXksIGJvb2wgYlByb3RvQWxzbyA9IGZhbHNlKTsKLSAgdm9pZCBSZW1vdmVNYXBNb2R1bGVLZXkodm9pZCogcEtleSA9IG51bGxwdHIpOwotICB2b2lkIE1lcmdlQWxsRGF0YSh2b2lkKiBwRHN0TW9kdWxlKTsKLSAgdm9pZCBNb3ZlQnVmZmVyTWFwRGF0YShDWEZBX05vZGUqIHBEc3RNb2R1bGUsIHZvaWQqIHBLZXkpOwotICB2b2lkIE1vdmVCdWZmZXJNYXBEYXRhKENYRkFfTm9kZSogcFNyY01vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBEc3RNb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcEtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJSZWN1cnNpdmUgPSBmYWxzZSk7Ci0KLSAgQ1hGQV9Ob2RlKiBtX3BOZXh0OwotICBDWEZBX05vZGUqIG1fcENoaWxkOwotICBDWEZBX05vZGUqIG1fcExhc3RDaGlsZDsKLSAgQ1hGQV9Ob2RlKiBtX3BQYXJlbnQ7Ci0gIENGREVfWE1MTm9kZSogbV9wWE1MTm9kZTsKLSAgdWludDE2X3QgbV9lUGFja2V0OwotICB1aW50MTZfdCBtX3VOb2RlRmxhZ3M7Ci0gIHVpbnQzMl90IG1fZHdOYW1lSGFzaDsKLSAgQ1hGQV9Ob2RlKiBtX3BBdXhOb2RlOwotICBYRkFfTUFQTU9EVUxFREFUQSogbV9wTWFwTW9kdWxlRGF0YTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgVGhyb3dNaXNzaW5nUHJvcGVydHlFeGNlcHRpb24oY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIG9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZyYgcHJvcCkgY29uc3Q7Ci0gIHZvaWQgVGhyb3dUb29NYW55T2NjdXJhbmNlc0V4Y2VwdGlvbihjb25zdCBDRlhfV2lkZVN0cmluZyYgb2JqKSBjb25zdDsKLX07Ci0KLWNsYXNzIENYRkFfVGhpc1Byb3h5IDogcHVibGljIENYRkFfT2JqZWN0IHsKLSBwdWJsaWM6Ci0gIENYRkFfVGhpc1Byb3h5KENYRkFfTm9kZSogcFRoaXNOb2RlLCBDWEZBX05vZGUqIHBTY3JpcHROb2RlKTsKLSAgfkNYRkFfVGhpc1Byb3h5KCkgb3ZlcnJpZGU7Ci0KLSAgQ1hGQV9Ob2RlKiBHZXRUaGlzTm9kZSgpIGNvbnN0OwotICBDWEZBX05vZGUqIEdldFNjcmlwdE5vZGUoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIENYRkFfTm9kZSogbV9wVGhpc05vZGU7Ci0gIENYRkFfTm9kZSogbV9wU2NyaXB0Tm9kZTsKLX07Ci0KLWNsYXNzIENYRkFfTm9kZUxpc3QgOiBwdWJsaWMgQ1hGQV9PYmplY3QgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9Ob2RlTGlzdChDWEZBX0RvY3VtZW50KiBwRG9jdW1lbnQpOwotICB+Q1hGQV9Ob2RlTGlzdCgpIG92ZXJyaWRlOwotCi0gIENYRkFfTm9kZSogTmFtZWRJdGVtKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKTsKLSAgdmlydHVhbCBpbnQzMl90IEdldExlbmd0aCgpID0gMDsKLSAgdmlydHVhbCBib29sIEFwcGVuZChDWEZBX05vZGUqIHBOb2RlKSA9IDA7Ci0gIHZpcnR1YWwgYm9vbCBJbnNlcnQoQ1hGQV9Ob2RlKiBwTmV3Tm9kZSwgQ1hGQV9Ob2RlKiBwQmVmb3JlTm9kZSkgPSAwOwotICB2aXJ0dWFsIGJvb2wgUmVtb3ZlKENYRkFfTm9kZSogcE5vZGUpID0gMDsKLSAgdmlydHVhbCBDWEZBX05vZGUqIEl0ZW0oaW50MzJfdCBpSW5kZXgpID0gMDsKLQotICB2b2lkIFNjcmlwdF9MaXN0Q2xhc3NfQXBwZW5kKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9MaXN0Q2xhc3NfSW5zZXJ0KENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9MaXN0Q2xhc3NfUmVtb3ZlKENGWEpTRV9Bcmd1bWVudHMqIHBBcmd1bWVudHMpOwotICB2b2lkIFNjcmlwdF9MaXN0Q2xhc3NfSXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLQotICB2b2lkIFNjcmlwdF9UcmVlbGlzdENsYXNzX05hbWVkSXRlbShDRlhKU0VfQXJndW1lbnRzKiBwQXJndW1lbnRzKTsKLSAgdm9pZCBTY3JpcHRfTGlzdENsYXNzX0xlbmd0aChDRlhKU0VfVmFsdWUqIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTZXR0aW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEUgZUF0dHJpYnV0ZSk7Ci19OwotCi1jbGFzcyBDWEZBX0FycmF5Tm9kZUxpc3QgOiBwdWJsaWMgQ1hGQV9Ob2RlTGlzdCB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDWEZBX0FycmF5Tm9kZUxpc3QoQ1hGQV9Eb2N1bWVudCogcERvY3VtZW50KTsKLSAgfkNYRkFfQXJyYXlOb2RlTGlzdCgpIG92ZXJyaWRlOwotCi0gIC8vIEZyb20gQ1hGQV9Ob2RlTGlzdC4KLSAgaW50MzJfdCBHZXRMZW5ndGgoKSBvdmVycmlkZTsKLSAgYm9vbCBBcHBlbmQoQ1hGQV9Ob2RlKiBwTm9kZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgSW5zZXJ0KENYRkFfTm9kZSogcE5ld05vZGUsIENYRkFfTm9kZSogcEJlZm9yZU5vZGUpIG92ZXJyaWRlOwotICBib29sIFJlbW92ZShDWEZBX05vZGUqIHBOb2RlKSBvdmVycmlkZTsKLSAgQ1hGQV9Ob2RlKiBJdGVtKGludDMyX3QgaUluZGV4KSBvdmVycmlkZTsKLQotICB2b2lkIFNldEFycmF5Tm9kZUxpc3QoY29uc3QgQ1hGQV9Ob2RlQXJyYXkmIHNyY0FycmF5KTsKLQotIHByb3RlY3RlZDoKLSAgQ1hGQV9Ob2RlQXJyYXkgbV9hcnJheTsKLX07Ci0KLWNsYXNzIENYRkFfQXR0YWNoTm9kZUxpc3QgOiBwdWJsaWMgQ1hGQV9Ob2RlTGlzdCB7Ci0gcHVibGljOgotICBDWEZBX0F0dGFjaE5vZGVMaXN0KENYRkFfRG9jdW1lbnQqIHBEb2N1bWVudCwgQ1hGQV9Ob2RlKiBwQXR0YWNoTm9kZSk7Ci0KLSAgLy8gRnJvbSBDWEZBX05vZGVMaXN0LgotICBpbnQzMl90IEdldExlbmd0aCgpIG92ZXJyaWRlOwotICBib29sIEFwcGVuZChDWEZBX05vZGUqIHBOb2RlKSBvdmVycmlkZTsKLSAgYm9vbCBJbnNlcnQoQ1hGQV9Ob2RlKiBwTmV3Tm9kZSwgQ1hGQV9Ob2RlKiBwQmVmb3JlTm9kZSkgb3ZlcnJpZGU7Ci0gIGJvb2wgUmVtb3ZlKENYRkFfTm9kZSogcE5vZGUpIG92ZXJyaWRlOwotICBDWEZBX05vZGUqIEl0ZW0oaW50MzJfdCBpSW5kZXgpIG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICBDWEZBX05vZGUqIG1fcEF0dGFjaE5vZGU7Ci19OwotY2xhc3MgQ1hGQV9UcmF2ZXJzZVN0cmF0ZWd5X1hGQUNvbnRhaW5lck5vZGUgewotIHB1YmxpYzoKLSAgc3RhdGljIENYRkFfTm9kZSogR2V0Rmlyc3RDaGlsZChDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFVzZXJEYXRhID0gbnVsbHB0cikgewotICAgIHJldHVybiBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fRmlyc3RDaGlsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX09iamVjdFR5cGU6OkNvbnRhaW5lck5vZGUpOwotICB9Ci0gIHN0YXRpYyBDWEZBX05vZGUqIEdldE5leHRTaWJsaW5nKENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFVzZXJEYXRhID0gbnVsbHB0cikgewotICAgIHJldHVybiBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fTmV4dFNpYmxpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9PYmplY3RUeXBlOjpDb250YWluZXJOb2RlKTsKLSAgfQotICBzdGF0aWMgQ1hGQV9Ob2RlKiBHZXRQYXJlbnQoQ1hGQV9Ob2RlKiBwVGVtcGxhdGVOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcFVzZXJEYXRhID0gbnVsbHB0cikgewotICAgIHJldHVybiBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfT2JqZWN0VHlwZTo6Q29udGFpbmVyTm9kZSk7Ci0gIH0KLX07Ci10eXBlZGVmIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9Ob2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFDb250YWluZXJOb2RlPgotICAgIENYRkFfQ29udGFpbmVySXRlcmF0b3I7Ci1jbGFzcyBDWEZBX1RyYXZlcnNlU3RyYXRlZ3lfWEZBTm9kZSB7Ci0gcHVibGljOgotICBzdGF0aWMgaW5saW5lIENYRkFfTm9kZSogR2V0Rmlyc3RDaGlsZChDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUpIHsKLSAgICByZXR1cm4gcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICB9Ci0gIHN0YXRpYyBpbmxpbmUgQ1hGQV9Ob2RlKiBHZXROZXh0U2libGluZyhDWEZBX05vZGUqIHBUZW1wbGF0ZU5vZGUpIHsKLSAgICByZXR1cm4gcFRlbXBsYXRlTm9kZS0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX05leHRTaWJsaW5nKTsKLSAgfQotICBzdGF0aWMgaW5saW5lIENYRkFfTm9kZSogR2V0UGFyZW50KENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSkgewotICAgIHJldHVybiBwVGVtcGxhdGVOb2RlLT5HZXROb2RlSXRlbShYRkFfTk9ERUlURU1fUGFyZW50KTsKLSAgfQotfTsKLXR5cGVkZWYgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZTxDWEZBX05vZGUsIENYRkFfVHJhdmVyc2VTdHJhdGVneV9YRkFOb2RlPgotICAgIENYRkFfTm9kZUl0ZXJhdG9yOwotCi1pbmxpbmUgQ1hGQV9Ob2RlKiBDWEZBX09iamVjdDo6QXNOb2RlKCkgewotICByZXR1cm4gSXNOb2RlKCkgPyBzdGF0aWNfY2FzdDxDWEZBX05vZGUqPih0aGlzKSA6IG51bGxwdHI7Ci19Ci0KLWlubGluZSBDWEZBX05vZGVMaXN0KiBDWEZBX09iamVjdDo6QXNOb2RlTGlzdCgpIHsKLSAgcmV0dXJuIElzTm9kZUxpc3QoKSA/IHN0YXRpY19jYXN0PENYRkFfTm9kZUxpc3QqPih0aGlzKSA6IG51bGxwdHI7Ci19Ci0KLWlubGluZSBjb25zdCBDWEZBX05vZGUqIENYRkFfT2JqZWN0OjpBc05vZGUoKSBjb25zdCB7Ci0gIHJldHVybiBJc05vZGUoKSA/IHN0YXRpY19jYXN0PGNvbnN0IENYRkFfTm9kZSo+KHRoaXMpIDogbnVsbHB0cjsKLX0KLQotaW5saW5lIGNvbnN0IENYRkFfTm9kZUxpc3QqIENYRkFfT2JqZWN0OjpBc05vZGVMaXN0KCkgY29uc3QgewotICByZXR1cm4gSXNOb2RlTGlzdCgpID8gc3RhdGljX2Nhc3Q8Y29uc3QgQ1hGQV9Ob2RlTGlzdCo+KHRoaXMpIDogbnVsbHB0cjsKLX0KLQotaW5saW5lIENYRkFfTm9kZSogVG9Ob2RlKENYRkFfT2JqZWN0KiBwT2JqKSB7Ci0gIHJldHVybiBwT2JqID8gcE9iai0+QXNOb2RlKCkgOiBudWxscHRyOwotfQotCi1pbmxpbmUgY29uc3QgQ1hGQV9Ob2RlKiBUb05vZGUoY29uc3QgQ1hGQV9PYmplY3QqIHBPYmopIHsKLSAgcmV0dXJuIHBPYmogPyBwT2JqLT5Bc05vZGUoKSA6IG51bGxwdHI7Ci19Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX1hGQV9PQkpFQ1RfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci94ZmFfcmVzb2x2ZW5vZGVfcnMuaCBiL3hmYS9meGZhL3BhcnNlci94ZmFfcmVzb2x2ZW5vZGVfcnMuaAppbmRleCA3YWQyMThlLi44Njk2MGFiIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIveGZhX3Jlc29sdmVub2RlX3JzLmgKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL3hmYV9yZXNvbHZlbm9kZV9ycy5oCkBAIC04LDEwICs4LDEzIEBACiAjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9YRkFfUkVTT0xWRU5PREVfUlNfSF8KIAogI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImZ4anMvY2Z4anNlX3ZhbHVlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgogI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmEuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV92YWx1ZWFycmF5LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfb2JqZWN0LmgiCiAKICNkZWZpbmUgWEZBX1JFU09MVkVOT0RFX0NoaWxkcmVuIDB4MDAwMQogI2RlZmluZSBYRkFfUkVTT0xWRU5PREVfQXR0cmlidXRlcyAweDAwMDQKQEAgLTI0LDQ3ICsyNywyNyBAQAogI2RlZmluZSBYRkFfUkVTT0xWRU5PREVfQmluZCAweDA4MDAKICNkZWZpbmUgWEZBX1JFU09MVkVOT0RFX0JpbmROZXcgMHgxMDAwCiAKLWVudW0gWEZBX1NDUklQVExBTkdUWVBFIHsKLSAgWEZBX1NDUklQVExBTkdUWVBFX0Zvcm1jYWxjID0gWEZBX1NDUklQVFRZUEVfRm9ybWNhbGMsCi0gIFhGQV9TQ1JJUFRMQU5HVFlQRV9KYXZhc2NyaXB0ID0gWEZBX1NDUklQVFRZUEVfSmF2YXNjcmlwdCwKLSAgWEZBX1NDUklQVExBTkdUWVBFX1Vua293biA9IFhGQV9TQ1JJUFRUWVBFX1Vua293biwKLX07Ci0KLWVudW0gWEZBX1JFU09WRU5PREVfUlNUWVBFIHsKLSAgWEZBX1JFU09WRU5PREVfUlNUWVBFX05vZGVzLAotICBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfQXR0cmlidXRlLAotICBYRkFfUkVTT0xWRU5PREVfUlNUWVBFX0NyZWF0ZU5vZGVPbmUsCi0gIFhGQV9SRVNPTFZFTk9ERV9SU1RZUEVfQ3JlYXRlTm9kZUFsbCwKLSAgWEZBX1JFU09MVkVOT0RFX1JTVFlQRV9DcmVhdGVOb2RlTWlkQWxsLAotICBYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfRXhpc3ROb2RlcywKK2VudW0gWEZBX1Jlc29sdmVOb2RlX1JTVHlwZSB7CisgIFhGQV9SZXNvbHZlTm9kZV9SU1R5cGVfTm9kZXMsCisgIFhGQV9SZXNvbHZlTm9kZV9SU1R5cGVfQXR0cmlidXRlLAorICBYRkFfUmVzb2x2ZU5vZGVfUlNUeXBlX0NyZWF0ZU5vZGVPbmUsCisgIFhGQV9SZXNvbHZlTm9kZV9SU1R5cGVfQ3JlYXRlTm9kZUFsbCwKKyAgWEZBX1Jlc29sdmVOb2RlX1JTVHlwZV9DcmVhdGVOb2RlTWlkQWxsLAorICBYRkFfUmVzb2x2ZU5vZGVfUlNUeXBlX0V4aXN0Tm9kZXMsCiB9OwogCiBzdHJ1Y3QgWEZBX1JFU09MVkVOT0RFX1JTIHsKICAgWEZBX1JFU09MVkVOT0RFX1JTKCk7CiAgIH5YRkFfUkVTT0xWRU5PREVfUlMoKTsKIAotICBpbnQzMl90IEdldEF0dHJpYnV0ZVJlc3VsdChDWEZBX1ZhbHVlQXJyYXkmIHZhbHVlQXJyYXkpIGNvbnN0IHsKLSAgICBpZiAocFNjcmlwdEF0dHJpYnV0ZSAmJiBwU2NyaXB0QXR0cmlidXRlLT5lVmFsdWVUeXBlID09IFhGQV9TQ1JJUFRfT2JqZWN0KSB7Ci0gICAgICB2ODo6SXNvbGF0ZSogcElzb2xhdGUgPSB2YWx1ZUFycmF5Lm1fcElzb2xhdGU7Ci0gICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBub2Rlcy5HZXRTaXplKCk7IGkrKykgewotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYSlNFX1ZhbHVlPiBwVmFsdWUobmV3IENGWEpTRV9WYWx1ZShwSXNvbGF0ZSkpOwotICAgICAgICAobm9kZXNbaV0tPioocFNjcmlwdEF0dHJpYnV0ZS0+bHBmbkNhbGxiYWNrKSkoCi0gICAgICAgICAgICBwVmFsdWUuZ2V0KCksIGZhbHNlLCAoWEZBX0FUVFJJQlVURSlwU2NyaXB0QXR0cmlidXRlLT5lQXR0cmlidXRlKTsKLSAgICAgICAgdmFsdWVBcnJheS5BZGQocFZhbHVlLnJlbGVhc2UoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB2YWx1ZUFycmF5LkdldFNpemUoKTsKLSAgfQotCi0gIENYRkFfT2JqQXJyYXkgbm9kZXM7Ci0gIFhGQV9SRVNPVkVOT0RFX1JTVFlQRSBkd0ZsYWdzOworICBzdGQ6OnZlY3RvcjxDWEZBX09iamVjdCo+IG9iamVjdHM7ICAvLyBOb3Qgb3duZWQuCisgIFhGQV9SZXNvbHZlTm9kZV9SU1R5cGUgZHdGbGFnczsKICAgY29uc3QgWEZBX1NDUklQVEFUVFJJQlVURUlORk8qIHBTY3JpcHRBdHRyaWJ1dGU7CiB9OwogCiBpbmxpbmUgWEZBX1JFU09MVkVOT0RFX1JTOjpYRkFfUkVTT0xWRU5PREVfUlMoKQotICAgIDogZHdGbGFncyhYRkFfUkVTT1ZFTk9ERV9SU1RZUEVfTm9kZXMpLCBwU2NyaXB0QXR0cmlidXRlKG51bGxwdHIpIHt9CisgICAgOiBkd0ZsYWdzKFhGQV9SZXNvbHZlTm9kZV9SU1R5cGVfTm9kZXMpLCBwU2NyaXB0QXR0cmlidXRlKG51bGxwdHIpIHt9CiAKLWlubGluZSBYRkFfUkVTT0xWRU5PREVfUlM6On5YRkFfUkVTT0xWRU5PREVfUlMoKSB7Ci0gIG5vZGVzLlJlbW92ZUFsbCgpOwotfQoraW5saW5lIFhGQV9SRVNPTFZFTk9ERV9SUzo6flhGQV9SRVNPTFZFTk9ERV9SUygpIHt9CisKICNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX1hGQV9SRVNPTFZFTk9ERV9SU19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL3hmYV91dGlscy5jcHAgYi94ZmEvZnhmYS9wYXJzZXIveGZhX3V0aWxzLmNwcAppbmRleCA2ZjU0YzBlLi41ZDJmMjIyIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIveGZhX3V0aWxzLmNwcAorKysgYi94ZmEvZnhmYS9wYXJzZXIveGZhX3V0aWxzLmNwcApAQCAtNiwxMjYgKzYsNDI2IEBACiAKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX3V0aWxzLmgiCiAKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2V4dC5oIgotI2luY2x1ZGUgInhmYS9mZGUveG1sL2ZkZV94bWxfaW1wLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X21lbW9yeXN0cmVhbS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3dpZGV0ZXh0YnVmLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9jb2RlcGFnZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbGNoYXJkYXRhLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC94bWwvY2Z4X3htbGVsZW1lbnQuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L3htbC9jZnhfeG1sbm9kZS5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQveG1sL2NmeF94bWx0ZXh0LmgiCisjaW5jbHVkZSAiZnhqcy94ZmEvY2p4X29iamVjdC5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxlbWdyLmgiCisjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfbG9jYWxldmFsdWUuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9tZWFzdXJlbWVudC5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX25vZGUuaCIKKyNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV91aS5oIgorI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX3ZhbHVlLmgiCiAjaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9iYXNpY19kYXRhLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9sb2NhbGVtZ3IuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIveGZhX2xvY2FsZXZhbHVlLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL3hmYV9vYmplY3QuaCIKIAogbmFtZXNwYWNlIHsKIAotY29uc3QgRlhfRE9VQkxFIGZyYWN0aW9uX3NjYWxlc1tdID0gezAuMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDAwMDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMDAwMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDAwMDAwMDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMDAwMDAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMDAwMDAwMX07Citjb25zdGV4cHIgY29uc3Qgd2NoYXJfdCBrRm9ybU5TW10gPSBMImh0dHA6Ly93d3cueGZhLm9yZy9zY2hlbWEveGZhLWZvcm0vIjsKIAotRlhfRE9VQkxFIFdpZGVTdHJpbmdUb0RvdWJsZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NTdHJpbmdWYWwpIHsKLSAgQ0ZYX1dpZGVTdHJpbmcgd3NWYWx1ZSA9IHdzU3RyaW5nVmFsOwotICB3c1ZhbHVlLlRyaW1MZWZ0KCk7Ci0gIHdzVmFsdWUuVHJpbVJpZ2h0KCk7Ci0gIGludDY0X3QgbkludGVncmFsID0gMDsKLSAgdWludDMyX3QgZHdGcmFjdGlvbmFsID0gMDsKLSAgaW50MzJfdCBuRXhwb25lbnQgPSAwOwotICBpbnQzMl90IGNjID0gMDsKLSAgYm9vbCBiTmVnYXRpdmUgPSBmYWxzZTsKLSAgYm9vbCBiRXhwU2lnbiA9IGZhbHNlOwotICBjb25zdCBGWF9XQ0hBUiogc3RyID0gd3NWYWx1ZS5jX3N0cigpOwotICBpbnQzMl90IGxlbiA9IHdzVmFsdWUuR2V0TGVuZ3RoKCk7Ci0gIGlmIChzdHJbMF0gPT0gJysnKSB7Ci0gICAgY2MrKzsKLSAgfSBlbHNlIGlmIChzdHJbMF0gPT0gJy0nKSB7Ci0gICAgYk5lZ2F0aXZlID0gdHJ1ZTsKLSAgICBjYysrOworY29uc3QgZG91YmxlIGZyYWN0aW9uX3NjYWxlc1tdID0gezAuMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDAwMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMDAwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMDAwMDAwMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMDAwMDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwMDAwMDAwMDAwMX07CisKK1dpZGVTdHJpbmcgRXhwb3J0RW5jb2RlQXR0cmlidXRlKGNvbnN0IFdpZGVTdHJpbmcmIHN0cikgeworICBDRlhfV2lkZVRleHRCdWYgdGV4dEJ1ZjsKKyAgaW50MzJfdCBpTGVuID0gc3RyLkdldExlbmd0aCgpOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGVuOyBpKyspIHsKKyAgICBzd2l0Y2ggKHN0cltpXSkgeworICAgICAgY2FzZSAnJic6CisgICAgICAgIHRleHRCdWYgPDwgTCImYW1wOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnPCc6CisgICAgICAgIHRleHRCdWYgPDwgTCImbHQ7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICc+JzoKKyAgICAgICAgdGV4dEJ1ZiA8PCBMIiZndDsiOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgJ1wnJzoKKyAgICAgICAgdGV4dEJ1ZiA8PCBMIiZhcG9zOyI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAnXCInOgorICAgICAgICB0ZXh0QnVmIDw8IEwiJnF1b3Q7IjsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0ZXh0QnVmLkFwcGVuZENoYXIoc3RyW2ldKTsKKyAgICB9CiAgIH0KLSAgaW50MzJfdCBuSW50ZWdyYWxMZW4gPSAwOwotICB3aGlsZSAoY2MgPCBsZW4pIHsKLSAgICBpZiAoc3RyW2NjXSA9PSAnLicgfHwgc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScgfHwKLSAgICAgICAgbkludGVncmFsTGVuID4gMTcpIHsKKyAgcmV0dXJuIHRleHRCdWYuTWFrZVN0cmluZygpOworfQorCitib29sIElzWE1MVmFsaWRDaGFyKHdjaGFyX3QgY2gpIHsKKyAgcmV0dXJuIGNoID09IDB4MDkgfHwgY2ggPT0gMHgwQSB8fCBjaCA9PSAweDBEIHx8CisgICAgICAgICAoY2ggPj0gMHgyMCAmJiBjaCA8PSAweEQ3RkYpIHx8IChjaCA+PSAweEUwMDAgJiYgY2ggPD0gMHhGRkZEKTsKK30KKworV2lkZVN0cmluZyBFeHBvcnRFbmNvZGVDb250ZW50KGNvbnN0IFdpZGVTdHJpbmcmIHN0cikgeworICBDRlhfV2lkZVRleHRCdWYgdGV4dEJ1ZjsKKyAgaW50MzJfdCBpTGVuID0gc3RyLkdldExlbmd0aCgpOworICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBpTGVuOyBpKyspIHsKKyAgICB3Y2hhcl90IGNoID0gc3RyW2ldOworICAgIGlmICghSXNYTUxWYWxpZENoYXIoY2gpKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoY2ggPT0gJyYnKSB7CisgICAgICB0ZXh0QnVmIDw8IEwiJmFtcDsiOworICAgIH0gZWxzZSBpZiAoY2ggPT0gJzwnKSB7CisgICAgICB0ZXh0QnVmIDw8IEwiJmx0OyI7CisgICAgfSBlbHNlIGlmIChjaCA9PSAnPicpIHsKKyAgICAgIHRleHRCdWYgPDwgTCImZ3Q7IjsKKyAgICB9IGVsc2UgaWYgKGNoID09ICdcJycpIHsKKyAgICAgIHRleHRCdWYgPDwgTCImYXBvczsiOworICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1wiJykgeworICAgICAgdGV4dEJ1ZiA8PCBMIiZxdW90OyI7CisgICAgfSBlbHNlIGlmIChjaCA9PSAnICcpIHsKKyAgICAgIGlmIChpICYmIHN0cltpIC0gMV0gIT0gJyAnKSB7CisgICAgICAgIHRleHRCdWYuQXBwZW5kQ2hhcignICcpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGV4dEJ1ZiA8PCBMIiYjeDIwOyI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHRleHRCdWYuQXBwZW5kQ2hhcihzdHJbaV0pOworICAgIH0KKyAgfQorICByZXR1cm4gdGV4dEJ1Zi5NYWtlU3RyaW5nKCk7Cit9CisKK2Jvb2wgQXR0cmlidXRlU2F2ZUluRGF0YU1vZGVsKENYRkFfTm9kZSogcE5vZGUsIFhGQV9BdHRyaWJ1dGUgZUF0dHJpYnV0ZSkgeworICBib29sIGJTYXZlSW5EYXRhTW9kZWwgPSBmYWxzZTsKKyAgaWYgKHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpJbWFnZSkKKyAgICByZXR1cm4gYlNhdmVJbkRhdGFNb2RlbDsKKworICBDWEZBX05vZGUqIHBWYWx1ZU5vZGUgPSBwTm9kZS0+R2V0UGFyZW50KCk7CisgIGlmICghcFZhbHVlTm9kZSB8fCBwVmFsdWVOb2RlLT5HZXRFbGVtZW50VHlwZSgpICE9IFhGQV9FbGVtZW50OjpWYWx1ZSkKKyAgICByZXR1cm4gYlNhdmVJbkRhdGFNb2RlbDsKKworICBDWEZBX05vZGUqIHBGaWVsZE5vZGUgPSBwVmFsdWVOb2RlLT5HZXRQYXJlbnQoKTsKKyAgaWYgKHBGaWVsZE5vZGUgJiYgcEZpZWxkTm9kZS0+R2V0QmluZERhdGEoKSAmJgorICAgICAgZUF0dHJpYnV0ZSA9PSBYRkFfQXR0cmlidXRlOjpIcmVmKSB7CisgICAgYlNhdmVJbkRhdGFNb2RlbCA9IHRydWU7CisgIH0KKyAgcmV0dXJuIGJTYXZlSW5EYXRhTW9kZWw7Cit9CisKK2Jvb2wgQ29udGVudE5vZGVOZWVkdG9FeHBvcnQoQ1hGQV9Ob2RlKiBwQ29udGVudE5vZGUpIHsKKyAgT3B0aW9uYWw8V2lkZVN0cmluZz4gd3NDb250ZW50ID0KKyAgICAgIHBDb250ZW50Tm9kZS0+SlNPYmplY3QoKS0+VHJ5Q29udGVudChmYWxzZSwgZmFsc2UpOworICBpZiAoIXdzQ29udGVudCkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQVNTRVJUKHBDb250ZW50Tm9kZS0+SXNDb250ZW50Tm9kZSgpKTsKKyAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHBDb250ZW50Tm9kZS0+R2V0UGFyZW50KCk7CisgIGlmICghcFBhcmVudE5vZGUgfHwgcFBhcmVudE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlZhbHVlKQorICAgIHJldHVybiB0cnVlOworCisgIENYRkFfTm9kZSogcEdyYW5kUGFyZW50Tm9kZSA9IHBQYXJlbnROb2RlLT5HZXRQYXJlbnQoKTsKKyAgaWYgKCFwR3JhbmRQYXJlbnROb2RlIHx8ICFwR3JhbmRQYXJlbnROb2RlLT5Jc0NvbnRhaW5lck5vZGUoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKyAgaWYgKHBHcmFuZFBhcmVudE5vZGUtPkdldEJpbmREYXRhKCkpCisgICAgcmV0dXJuIGZhbHNlOworCisgIFhGQV9FbGVtZW50IGVVSVR5cGUgPSBwR3JhbmRQYXJlbnROb2RlLT5HZXRXaWRnZXRBY2MoKS0+R2V0VUlUeXBlKCk7CisgIGlmIChlVUlUeXBlID09IFhGQV9FbGVtZW50OjpQYXNzd29yZEVkaXQpCisgICAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTYXZlQXR0cmlidXRlKENYRkFfTm9kZSogcE5vZGUsCisgICAgICAgICAgICAgICAgICAgWEZBX0F0dHJpYnV0ZSBlTmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBXaWRlU3RyaW5nJiB3c05hbWUsCisgICAgICAgICAgICAgICAgICAgYm9vbCBiUHJvdG8sCisgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyYgd3NPdXRwdXQpIHsKKyAgaWYgKCFiUHJvdG8gJiYgIXBOb2RlLT5KU09iamVjdCgpLT5IYXNBdHRyaWJ1dGUoZU5hbWUpKQorICAgIHJldHVybjsKKworICBPcHRpb25hbDxXaWRlU3RyaW5nPiB2YWx1ZSA9IHBOb2RlLT5KU09iamVjdCgpLT5UcnlBdHRyaWJ1dGUoZU5hbWUsIGZhbHNlKTsKKyAgaWYgKCF2YWx1ZSkKKyAgICByZXR1cm47CisKKyAgd3NPdXRwdXQgKz0gTCIgIjsKKyAgd3NPdXRwdXQgKz0gd3NOYW1lOworICB3c091dHB1dCArPSBMIj1cIiI7CisgIHdzT3V0cHV0ICs9IEV4cG9ydEVuY29kZUF0dHJpYnV0ZSgqdmFsdWUpOworICB3c091dHB1dCArPSBMIlwiIjsKK30KKwordm9pZCBSZWdlbmVyYXRlRm9ybUZpbGVfQ2hhbmdlZChDWEZBX05vZGUqIHBOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfV2lkZVRleHRCdWYmIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU2F2ZVhNTCkgeworICBXaWRlU3RyaW5nIHdzQXR0cnM7CisgIGZvciAoc2l6ZV90IGkgPSAwOzsgKytpKSB7CisgICAgWEZBX0F0dHJpYnV0ZSBhdHRyID0gcE5vZGUtPkdldEF0dHJpYnV0ZShpKTsKKyAgICBpZiAoYXR0ciA9PSBYRkFfQXR0cmlidXRlOjpVbmtub3duKQorICAgICAgYnJlYWs7CisKKyAgICBpZiAoYXR0ciA9PSBYRkFfQXR0cmlidXRlOjpOYW1lIHx8CisgICAgICAgIChBdHRyaWJ1dGVTYXZlSW5EYXRhTW9kZWwocE5vZGUsIGF0dHIpICYmICFiU2F2ZVhNTCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBXaWRlU3RyaW5nIHdzQXR0cjsKKyAgICBTYXZlQXR0cmlidXRlKHBOb2RlLCBhdHRyLCBDWEZBX05vZGU6OkF0dHJpYnV0ZVRvTmFtZShhdHRyKSwgYlNhdmVYTUwsCisgICAgICAgICAgICAgICAgICB3c0F0dHIpOworICAgIHdzQXR0cnMgKz0gd3NBdHRyOworICB9CisKKyAgV2lkZVN0cmluZyB3c0NoaWxkcmVuOworICBzd2l0Y2ggKHBOb2RlLT5HZXRPYmplY3RUeXBlKCkpIHsKKyAgICBjYXNlIFhGQV9PYmplY3RUeXBlOjpDb250ZW50Tm9kZTogeworICAgICAgaWYgKCFiU2F2ZVhNTCAmJiAhQ29udGVudE5vZGVOZWVkdG9FeHBvcnQocE5vZGUpKQorICAgICAgICBicmVhazsKKworICAgICAgQ1hGQV9Ob2RlKiBwUmF3VmFsdWVOb2RlID0gcE5vZGUtPkdldEZpcnN0Q2hpbGQoKTsKKyAgICAgIHdoaWxlIChwUmF3VmFsdWVOb2RlICYmCisgICAgICAgICAgICAgcFJhd1ZhbHVlTm9kZS0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6U2hhcnB4SFRNTCAmJgorICAgICAgICAgICAgIHBSYXdWYWx1ZU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlNoYXJwdGV4dCAmJgorICAgICAgICAgICAgIHBSYXdWYWx1ZU5vZGUtPkdldEVsZW1lbnRUeXBlKCkgIT0gWEZBX0VsZW1lbnQ6OlNoYXJweG1sKSB7CisgICAgICAgIHBSYXdWYWx1ZU5vZGUgPSBwUmF3VmFsdWVOb2RlLT5HZXROZXh0U2libGluZygpOworICAgICAgfQorICAgICAgaWYgKCFwUmF3VmFsdWVOb2RlKQorICAgICAgICBicmVhazsKKworICAgICAgT3B0aW9uYWw8V2lkZVN0cmluZz4gY29udGVudFR5cGUgPQorICAgICAgICAgIHBOb2RlLT5KU09iamVjdCgpLT5UcnlBdHRyaWJ1dGUoWEZBX0F0dHJpYnV0ZTo6Q29udGVudFR5cGUsIGZhbHNlKTsKKyAgICAgIGlmIChwUmF3VmFsdWVOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpTaGFycHhIVE1MICYmCisgICAgICAgICAgKGNvbnRlbnRUeXBlICYmICpjb250ZW50VHlwZSA9PSBMInRleHQvaHRtbCIpKSB7CisgICAgICAgIENGWF9YTUxOb2RlKiBwRXhEYXRhWE1MID0gcE5vZGUtPkdldFhNTE1hcHBpbmdOb2RlKCk7CisgICAgICAgIGlmICghcEV4RGF0YVhNTCkKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBDRlhfWE1MTm9kZSogcFJpY2hUZXh0WE1MID0KKyAgICAgICAgICAgIHBFeERhdGFYTUwtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpGaXJzdENoaWxkKTsKKyAgICAgICAgaWYgKCFwUmljaFRleHRYTUwpCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgYXV0byBwTWVtU3RyZWFtID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9NZW1vcnlTdHJlYW0+KHRydWUpOworICAgICAgICBhdXRvIHBUZW1wU3RyZWFtID0KKyAgICAgICAgICAgIHBkZml1bTo6TWFrZVJldGFpbjxDRlhfU2Vla2FibGVTdHJlYW1Qcm94eT4ocE1lbVN0cmVhbSwgdHJ1ZSk7CisKKyAgICAgICAgcFRlbXBTdHJlYW0tPlNldENvZGVQYWdlKEZYX0NPREVQQUdFX1VURjgpOworICAgICAgICBwUmljaFRleHRYTUwtPlNhdmVYTUxOb2RlKHBUZW1wU3RyZWFtKTsKKyAgICAgICAgd3NDaGlsZHJlbiArPSBXaWRlU3RyaW5nOjpGcm9tVVRGOCgKKyAgICAgICAgICAgIEJ5dGVTdHJpbmdWaWV3KHBNZW1TdHJlYW0tPkdldEJ1ZmZlcigpLCBwTWVtU3RyZWFtLT5HZXRTaXplKCkpKTsKKyAgICAgIH0gZWxzZSBpZiAocFJhd1ZhbHVlTm9kZS0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6U2hhcnB4bWwgJiYKKyAgICAgICAgICAgICAgICAgKGNvbnRlbnRUeXBlICYmICpjb250ZW50VHlwZSA9PSBMInRleHQveG1sIikpIHsKKyAgICAgICAgT3B0aW9uYWw8V2lkZVN0cmluZz4gcmF3VmFsdWUgPSBwUmF3VmFsdWVOb2RlLT5KU09iamVjdCgpLT5UcnlBdHRyaWJ1dGUoCisgICAgICAgICAgICBYRkFfQXR0cmlidXRlOjpWYWx1ZSwgZmFsc2UpOworICAgICAgICBpZiAoIXJhd1ZhbHVlIHx8IHJhd1ZhbHVlLT5Jc0VtcHR5KCkpCisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8V2lkZVN0cmluZz4gd3NTZWxUZXh0QXJyYXk7CisgICAgICAgIHNpemVfdCBpU3RhcnQgPSAwOworICAgICAgICBhdXRvIGlFbmQgPSByYXdWYWx1ZS0+RmluZChMJ1xuJywgaVN0YXJ0KTsKKyAgICAgICAgaUVuZCA9ICFpRW5kLmhhc192YWx1ZSgpID8gcmF3VmFsdWUtPkdldExlbmd0aCgpIDogaUVuZDsKKyAgICAgICAgd2hpbGUgKGlFbmQuaGFzX3ZhbHVlKCkgJiYgaUVuZCA+PSBpU3RhcnQpIHsKKyAgICAgICAgICB3c1NlbFRleHRBcnJheS5wdXNoX2JhY2soCisgICAgICAgICAgICAgIHJhd1ZhbHVlLT5NaWQoaVN0YXJ0LCBpRW5kLnZhbHVlKCkgLSBpU3RhcnQpKTsKKyAgICAgICAgICBpU3RhcnQgPSBpRW5kLnZhbHVlKCkgKyAxOworICAgICAgICAgIGlmIChpU3RhcnQgPj0gcmF3VmFsdWUtPkdldExlbmd0aCgpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgaUVuZCA9IHJhd1ZhbHVlLT5GaW5kKEwnXG4nLCBpU3RhcnQpOworICAgICAgICB9CisKKyAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50Tm9kZSA9IHBOb2RlLT5HZXRQYXJlbnQoKTsKKyAgICAgICAgQVNTRVJUKHBQYXJlbnROb2RlKTsKKyAgICAgICAgQ1hGQV9Ob2RlKiBwR3JhbmRwYXJlbnROb2RlID0gcFBhcmVudE5vZGUtPkdldFBhcmVudCgpOworICAgICAgICBBU1NFUlQocEdyYW5kcGFyZW50Tm9kZSk7CisgICAgICAgIFdpZGVTdHJpbmcgYm9keVRhZ05hbWU7CisgICAgICAgIGJvZHlUYWdOYW1lID0KKyAgICAgICAgICAgIHBHcmFuZHBhcmVudE5vZGUtPkpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6Ok5hbWUpOworICAgICAgICBpZiAoYm9keVRhZ05hbWUuSXNFbXB0eSgpKQorICAgICAgICAgIGJvZHlUYWdOYW1lID0gTCJMaXN0Qm94MSI7CisKKyAgICAgICAgYnVmIDw8IEwiPCI7CisgICAgICAgIGJ1ZiA8PCBib2R5VGFnTmFtZTsKKyAgICAgICAgYnVmIDw8IEwiIHhtbG5zPVwiXCJcbj4iOworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBwZGZpdW06OkNvbGxlY3Rpb25TaXplPGludDMyX3Q+KHdzU2VsVGV4dEFycmF5KTsKKyAgICAgICAgICAgICBpKyspIHsKKyAgICAgICAgICBidWYgPDwgTCI8dmFsdWVcbj4iOworICAgICAgICAgIGJ1ZiA8PCBFeHBvcnRFbmNvZGVDb250ZW50KHdzU2VsVGV4dEFycmF5W2ldKTsKKyAgICAgICAgICBidWYgPDwgTCI8L3ZhbHVlXG4+IjsKKyAgICAgICAgfQorICAgICAgICBidWYgPDwgTCI8LyI7CisgICAgICAgIGJ1ZiA8PCBib2R5VGFnTmFtZTsKKyAgICAgICAgYnVmIDw8IEwiXG4+IjsKKyAgICAgICAgd3NDaGlsZHJlbiArPSBidWYuQXNTdHJpbmdWaWV3KCk7CisgICAgICAgIGJ1Zi5DbGVhcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgV2lkZVN0cmluZyB3c1ZhbHVlID0KKyAgICAgICAgICAgIHBSYXdWYWx1ZU5vZGUtPkpTT2JqZWN0KCktPkdldENEYXRhKFhGQV9BdHRyaWJ1dGU6OlZhbHVlKTsKKyAgICAgICAgd3NDaGlsZHJlbiArPSBFeHBvcnRFbmNvZGVDb250ZW50KHdzVmFsdWUpOworICAgICAgfQogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgIHJldHVybiAwOworICAgIGNhc2UgWEZBX09iamVjdFR5cGU6OlRleHROb2RlOgorICAgIGNhc2UgWEZBX09iamVjdFR5cGU6Ok5vZGVDOgorICAgIGNhc2UgWEZBX09iamVjdFR5cGU6Ok5vZGVWOiB7CisgICAgICBXaWRlU3RyaW5nIHdzVmFsdWUgPSBwTm9kZS0+SlNPYmplY3QoKS0+R2V0Q0RhdGEoWEZBX0F0dHJpYnV0ZTo6VmFsdWUpOworICAgICAgd3NDaGlsZHJlbiArPSBFeHBvcnRFbmNvZGVDb250ZW50KHdzVmFsdWUpOworICAgICAgYnJlYWs7CiAgICAgfQotICAgIG5JbnRlZ3JhbCA9IG5JbnRlZ3JhbCAqIDEwICsgc3RyW2NjXSAtICcwJzsKLSAgICBjYysrOwotICAgIG5JbnRlZ3JhbExlbisrOworICAgIGRlZmF1bHQ6CisgICAgICBpZiAocE5vZGUtPkdldEVsZW1lbnRUeXBlKCkgPT0gWEZBX0VsZW1lbnQ6Okl0ZW1zKSB7CisgICAgICAgIENYRkFfTm9kZSogcFRlbXBsYXRlTm9kZSA9IHBOb2RlLT5HZXRUZW1wbGF0ZU5vZGVJZkV4aXN0cygpOworICAgICAgICBpZiAoIXBUZW1wbGF0ZU5vZGUgfHwKKyAgICAgICAgICAgIHBUZW1wbGF0ZU5vZGUtPkNvdW50Q2hpbGRyZW4oWEZBX0VsZW1lbnQ6OlVua25vd24sIGZhbHNlKSAhPQorICAgICAgICAgICAgICAgIHBOb2RlLT5Db3VudENoaWxkcmVuKFhGQV9FbGVtZW50OjpVbmtub3duLCBmYWxzZSkpIHsKKyAgICAgICAgICBiU2F2ZVhNTCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIENGWF9XaWRlVGV4dEJ1ZiBuZXdCdWY7CisgICAgICBDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwTm9kZS0+R2V0Rmlyc3RDaGlsZCgpOworICAgICAgd2hpbGUgKHBDaGlsZE5vZGUpIHsKKyAgICAgICAgUmVnZW5lcmF0ZUZvcm1GaWxlX0NoYW5nZWQocENoaWxkTm9kZSwgbmV3QnVmLCBiU2F2ZVhNTCk7CisgICAgICAgIHdzQ2hpbGRyZW4gKz0gbmV3QnVmLkFzU3RyaW5nVmlldygpOworICAgICAgICBuZXdCdWYuQ2xlYXIoKTsKKyAgICAgICAgcENoaWxkTm9kZSA9IHBDaGlsZE5vZGUtPkdldE5leHRTaWJsaW5nKCk7CisgICAgICB9CisgICAgICBpZiAoIWJTYXZlWE1MICYmICF3c0NoaWxkcmVuLklzRW1wdHkoKSAmJgorICAgICAgICAgIHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpJdGVtcykgeworICAgICAgICB3c0NoaWxkcmVuLmNsZWFyKCk7CisgICAgICAgIGJTYXZlWE1MID0gdHJ1ZTsKKyAgICAgICAgQ1hGQV9Ob2RlKiBwQ2hpbGQgPSBwTm9kZS0+R2V0Rmlyc3RDaGlsZCgpOworICAgICAgICB3aGlsZSAocENoaWxkKSB7CisgICAgICAgICAgUmVnZW5lcmF0ZUZvcm1GaWxlX0NoYW5nZWQocENoaWxkLCBuZXdCdWYsIGJTYXZlWE1MKTsKKyAgICAgICAgICB3c0NoaWxkcmVuICs9IG5ld0J1Zi5Bc1N0cmluZ1ZpZXcoKTsKKyAgICAgICAgICBuZXdCdWYuQ2xlYXIoKTsKKyAgICAgICAgICBwQ2hpbGQgPSBwQ2hpbGQtPkdldE5leHRTaWJsaW5nKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGJyZWFrOwogICB9Ci0gIG5JbnRlZ3JhbCA9IGJOZWdhdGl2ZSA/IC1uSW50ZWdyYWwgOiBuSW50ZWdyYWw7Ci0gIGludDMyX3Qgc2NhbGUgPSAwOwotICBGWF9ET1VCTEUgZnJhY3Rpb24gPSAwLjA7Ci0gIGlmIChjYyA8IGxlbiAmJiBzdHJbY2NdID09ICcuJykgewotICAgIGNjKys7Ci0gICAgd2hpbGUgKGNjIDwgbGVuKSB7Ci0gICAgICBmcmFjdGlvbiArPSBmcmFjdGlvbl9zY2FsZXNbc2NhbGVdICogKHN0cltjY10gLSAnMCcpOwotICAgICAgc2NhbGUrKzsKLSAgICAgIGNjKys7Ci0gICAgICBpZiAoY2MgPT0gbGVuKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKHNjYWxlID09IHNpemVvZihmcmFjdGlvbl9zY2FsZXMpIC8gc2l6ZW9mKEZYX0RPVUJMRSkgfHwKLSAgICAgICAgICBzdHJbY2NdID09ICdFJyB8fCBzdHJbY2NdID09ICdlJykgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmICghRlhTWVNfaXNEZWNpbWFsRGlnaXQoc3RyW2NjXSkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9CisKKyAgaWYgKCF3c0NoaWxkcmVuLklzRW1wdHkoKSB8fCAhd3NBdHRycy5Jc0VtcHR5KCkgfHwKKyAgICAgIHBOb2RlLT5KU09iamVjdCgpLT5IYXNBdHRyaWJ1dGUoWEZBX0F0dHJpYnV0ZTo6TmFtZSkpIHsKKyAgICBXaWRlU3RyaW5nVmlldyB3c0VsZW1lbnQgPSBwTm9kZS0+R2V0Q2xhc3NOYW1lKCk7CisgICAgV2lkZVN0cmluZyB3c05hbWU7CisgICAgU2F2ZUF0dHJpYnV0ZShwTm9kZSwgWEZBX0F0dHJpYnV0ZTo6TmFtZSwgTCJuYW1lIiwgdHJ1ZSwgd3NOYW1lKTsKKyAgICBidWYgPDwgTCI8IjsKKyAgICBidWYgPDwgd3NFbGVtZW50OworICAgIGJ1ZiA8PCB3c05hbWU7CisgICAgYnVmIDw8IHdzQXR0cnM7CisgICAgaWYgKHdzQ2hpbGRyZW4uSXNFbXB0eSgpKSB7CisgICAgICBidWYgPDwgTCJcbi8+IjsKKyAgICB9IGVsc2UgeworICAgICAgYnVmIDw8IEwiXG4+IjsKKyAgICAgIGJ1ZiA8PCB3c0NoaWxkcmVuOworICAgICAgYnVmIDw8IEwiPC8iOworICAgICAgYnVmIDw8IHdzRWxlbWVudDsKKyAgICAgIGJ1ZiA8PCBMIlxuPiI7CiAgICAgfQotICAgIGR3RnJhY3Rpb25hbCA9ICh1aW50MzJfdCkoZnJhY3Rpb24gKiA0Mjk0OTY3Mjk2LjApOwogICB9Ci0gIGlmIChjYyA8IGxlbiAmJiAoc3RyW2NjXSA9PSAnRScgfHwgc3RyW2NjXSA9PSAnZScpKSB7Ci0gICAgY2MrKzsKLSAgICBpZiAoY2MgPCBsZW4pIHsKLSAgICAgIGlmIChzdHJbY2NdID09ICcrJykgewotICAgICAgICBjYysrOwotICAgICAgfSBlbHNlIGlmIChzdHJbY2NdID09ICctJykgewotICAgICAgICBiRXhwU2lnbiA9IHRydWU7Ci0gICAgICAgIGNjKys7Ci0gICAgICB9Cit9CisKK3ZvaWQgUmVnZW5lcmF0ZUZvcm1GaWxlX0NvbnRhaW5lcigKKyAgICBDWEZBX05vZGUqIHBOb2RlLAorICAgIGNvbnN0IFJldGFpblB0cjxDRlhfU2Vla2FibGVTdHJlYW1Qcm94eT4mIHBTdHJlYW0sCisgICAgYm9vbCBiU2F2ZVhNTCkgeworICBYRkFfRWxlbWVudCBlVHlwZSA9IHBOb2RlLT5HZXRFbGVtZW50VHlwZSgpOworICBpZiAoZVR5cGUgPT0gWEZBX0VsZW1lbnQ6OkZpZWxkIHx8IGVUeXBlID09IFhGQV9FbGVtZW50OjpEcmF3IHx8CisgICAgICAhcE5vZGUtPklzQ29udGFpbmVyTm9kZSgpKSB7CisgICAgQ0ZYX1dpZGVUZXh0QnVmIGJ1ZjsKKyAgICBSZWdlbmVyYXRlRm9ybUZpbGVfQ2hhbmdlZChwTm9kZSwgYnVmLCBiU2F2ZVhNTCk7CisgICAgc2l6ZV90IG5MZW4gPSBidWYuR2V0TGVuZ3RoKCk7CisgICAgaWYgKG5MZW4gPiAwKQorICAgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoYnVmLkFzU3RyaW5nVmlldygpKTsKKyAgICByZXR1cm47CisgIH0KKworICBXaWRlU3RyaW5nVmlldyB3c0VsZW1lbnQocE5vZGUtPkdldENsYXNzTmFtZSgpKTsKKyAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoTCI8Iik7CisgIHBTdHJlYW0tPldyaXRlU3RyaW5nKHdzRWxlbWVudCk7CisKKyAgV2lkZVN0cmluZyB3c091dHB1dDsKKyAgU2F2ZUF0dHJpYnV0ZShwTm9kZSwgWEZBX0F0dHJpYnV0ZTo6TmFtZSwgTCJuYW1lIiwgdHJ1ZSwgd3NPdXRwdXQpOworCisgIFdpZGVTdHJpbmcgd3NBdHRyczsKKyAgZm9yIChzaXplX3QgaSA9IDA7OyArK2kpIHsKKyAgICBYRkFfQXR0cmlidXRlIGF0dHIgPSBwTm9kZS0+R2V0QXR0cmlidXRlKGkpOworICAgIGlmIChhdHRyID09IFhGQV9BdHRyaWJ1dGU6OlVua25vd24pCisgICAgICBicmVhazsKKyAgICBpZiAoYXR0ciA9PSBYRkFfQXR0cmlidXRlOjpOYW1lKQorICAgICAgY29udGludWU7CisKKyAgICBXaWRlU3RyaW5nIHdzQXR0cjsKKyAgICBTYXZlQXR0cmlidXRlKHBOb2RlLCBhdHRyLCBDWEZBX05vZGU6OkF0dHJpYnV0ZVRvTmFtZShhdHRyKSwgZmFsc2UsIHdzQXR0cik7CisgICAgd3NPdXRwdXQgKz0gd3NBdHRyOworICB9CisKKyAgaWYgKCF3c091dHB1dC5Jc0VtcHR5KCkpCisgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcod3NPdXRwdXQuQXNTdHJpbmdWaWV3KCkpOworCisgIENYRkFfTm9kZSogcENoaWxkTm9kZSA9IHBOb2RlLT5HZXRGaXJzdENoaWxkKCk7CisgIGlmIChwQ2hpbGROb2RlKSB7CisgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoTCJcbj4iKTsKKyAgICB3aGlsZSAocENoaWxkTm9kZSkgeworICAgICAgUmVnZW5lcmF0ZUZvcm1GaWxlX0NvbnRhaW5lcihwQ2hpbGROb2RlLCBwU3RyZWFtLCBiU2F2ZVhNTCk7CisgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0TmV4dFNpYmxpbmcoKTsKICAgICB9Ci0gICAgd2hpbGUgKGNjIDwgbGVuKSB7Ci0gICAgICBpZiAoc3RyW2NjXSA9PSAnLicgfHwgIUZYU1lTX2lzRGVjaW1hbERpZ2l0KHN0cltjY10pKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgICAgbkV4cG9uZW50ID0gbkV4cG9uZW50ICogMTAgKyBzdHJbY2NdIC0gJzAnOwotICAgICAgY2MrKzsKLSAgICB9Ci0gICAgbkV4cG9uZW50ID0gYkV4cFNpZ24gPyAtbkV4cG9uZW50IDogbkV4cG9uZW50OworICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKEwiPC8iKTsKKyAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyh3c0VsZW1lbnQpOworICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKEwiXG4+Iik7CisgIH0gZWxzZSB7CisgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoTCJcbi8+Iik7CiAgIH0KLSAgRlhfRE9VQkxFIGRWYWx1ZSA9IChkd0ZyYWN0aW9uYWwgLyA0Mjk0OTY3Mjk2LjApOwotICBkVmFsdWUgPSBuSW50ZWdyYWwgKyAobkludGVncmFsID49IDAgPyBkVmFsdWUgOiAtZFZhbHVlKTsKLSAgaWYgKG5FeHBvbmVudCAhPSAwKSB7Ci0gICAgZFZhbHVlICo9IEZYU1lTX3BvdygxMCwgKEZYX0ZMT0FUKW5FeHBvbmVudCk7Ci0gIH0KLSAgcmV0dXJuIGRWYWx1ZTsKK30KKworV2lkZVN0cmluZyBSZWNvZ25pemVYRkFWZXJzaW9uTnVtYmVyKENYRkFfTm9kZSogcFRlbXBsYXRlUm9vdCkgeworICBpZiAoIXBUZW1wbGF0ZVJvb3QpCisgICAgcmV0dXJuIFdpZGVTdHJpbmcoKTsKKworICBPcHRpb25hbDxXaWRlU3RyaW5nPiB0ZW1wbGF0ZU5TID0gcFRlbXBsYXRlUm9vdC0+SlNPYmplY3QoKS0+VHJ5TmFtZXNwYWNlKCk7CisgIGlmICghdGVtcGxhdGVOUykKKyAgICByZXR1cm4gV2lkZVN0cmluZygpOworCisgIFhGQV9WRVJTSU9OIGVWZXJzaW9uID0KKyAgICAgIHBUZW1wbGF0ZVJvb3QtPkdldERvY3VtZW50KCktPlJlY29nbml6ZVhGQVZlcnNpb25OdW1iZXIoKnRlbXBsYXRlTlMpOworICBpZiAoZVZlcnNpb24gPT0gWEZBX1ZFUlNJT05fVU5LTk9XTikKKyAgICBlVmVyc2lvbiA9IFhGQV9WRVJTSU9OX0RFRkFVTFQ7CisKKyAgcmV0dXJuIFdpZGVTdHJpbmc6OkZvcm1hdChMIiVpLiVpIiwgZVZlcnNpb24gLyAxMDAsIGVWZXJzaW9uICUgMTAwKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCiAKLUNYRkFfTG9jYWxlVmFsdWUgWEZBX0dldExvY2FsZVZhbHVlKENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEpIHsKLSAgQ1hGQV9Ob2RlKiBwTm9kZVZhbHVlID0KLSAgICAgIHBXaWRnZXREYXRhLT5HZXROb2RlKCktPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpWYWx1ZSk7Ci0gIGlmICghcE5vZGVWYWx1ZSkgeworZG91YmxlIFhGQV9HZXRGcmFjdGlvbmFsU2NhbGUodWludDMyX3QgaWR4KSB7CisgIHJldHVybiBmcmFjdGlvbl9zY2FsZXNbaWR4XTsKK30KKworaW50IFhGQV9HZXRNYXhGcmFjdGlvbmFsU2NhbGUoKSB7CisgIHJldHVybiBGWF9BcnJheVNpemUoZnJhY3Rpb25fc2NhbGVzKTsKK30KKworQ1hGQV9Mb2NhbGVWYWx1ZSBYRkFfR2V0TG9jYWxlVmFsdWUoQ1hGQV9Ob2RlKiBwTm9kZSkgeworICBDWEZBX1ZhbHVlKiBwTm9kZVZhbHVlID0KKyAgICAgIHBOb2RlLT5HZXRDaGlsZDxDWEZBX1ZhbHVlPigwLCBYRkFfRWxlbWVudDo6VmFsdWUsIGZhbHNlKTsKKyAgaWYgKCFwTm9kZVZhbHVlKQogICAgIHJldHVybiBDWEZBX0xvY2FsZVZhbHVlKCk7Ci0gIH0KLSAgQ1hGQV9Ob2RlKiBwVmFsdWVDaGlsZCA9IHBOb2RlVmFsdWUtPkdldE5vZGVJdGVtKFhGQV9OT0RFSVRFTV9GaXJzdENoaWxkKTsKLSAgaWYgKCFwVmFsdWVDaGlsZCkgeworCisgIENYRkFfTm9kZSogcFZhbHVlQ2hpbGQgPSBwTm9kZVZhbHVlLT5HZXRGaXJzdENoaWxkKCk7CisgIGlmICghcFZhbHVlQ2hpbGQpCiAgICAgcmV0dXJuIENYRkFfTG9jYWxlVmFsdWUoKTsKLSAgfQorCiAgIGludDMyX3QgaVZUVHlwZSA9IFhGQV9WVF9OVUxMOwogICBzd2l0Y2ggKHBWYWx1ZUNoaWxkLT5HZXRFbGVtZW50VHlwZSgpKSB7CiAgICAgY2FzZSBYRkFfRWxlbWVudDo6RGVjaW1hbDoKQEAgLTE1Niw3NCArNDU2LDEyMSBAQAogICAgICAgaVZUVHlwZSA9IFhGQV9WVF9OVUxMOwogICAgICAgYnJlYWs7CiAgIH0KLSAgcmV0dXJuIENYRkFfTG9jYWxlVmFsdWUoaVZUVHlwZSwgcFdpZGdldERhdGEtPkdldFJhd1ZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBXaWRnZXREYXRhLT5HZXROb2RlKCktPkdldERvY3VtZW50KCktPkdldExvY2FsTWdyKCkpOworICByZXR1cm4gQ1hGQV9Mb2NhbGVWYWx1ZShpVlRUeXBlLCBwTm9kZS0+R2V0UmF3VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcE5vZGUtPkdldERvY3VtZW50KCktPkdldExvY2FsTWdyKCkpOwogfQotdm9pZCBYRkFfR2V0UGxhaW5UZXh0RnJvbVJpY2hUZXh0KENGREVfWE1MTm9kZSogcFhNTE5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX1dpZGVTdHJpbmcmIHdzUGxhaW5UZXh0KSB7Ci0gIGlmICghcFhNTE5vZGUpIHsKKworYm9vbCBYRkFfRkRFRXh0ZW5zaW9uX1Jlc29sdmVOYW1lc3BhY2VRdWFsaWZpZXIoQ0ZYX1hNTEVsZW1lbnQqIHBOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2lkZVN0cmluZyYgd3NRdWFsaWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlU3RyaW5nKiB3c05hbWVzcGFjZVVSSSkgeworICBpZiAoIXBOb2RlKQorICAgIHJldHVybiBmYWxzZTsKKworICBDRlhfWE1MTm9kZSogcEZha2VSb290ID0gcE5vZGUtPkdldE5vZGVJdGVtKENGWF9YTUxOb2RlOjpSb290KTsKKyAgV2lkZVN0cmluZyB3c05TQXR0cmlidXRlOworICBib29sIGJSZXQgPSBmYWxzZTsKKyAgaWYgKHdzUXVhbGlmaWVyLklzRW1wdHkoKSkgeworICAgIHdzTlNBdHRyaWJ1dGUgPSBMInhtbG5zIjsKKyAgICBiUmV0ID0gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICB3c05TQXR0cmlidXRlID0gTCJ4bWxuczoiICsgd3NRdWFsaWZpZXI7CisgIH0KKyAgZm9yIChDRlhfWE1MTm9kZSogcFBhcmVudCA9IHBOb2RlOyBwUGFyZW50ICE9IHBGYWtlUm9vdDsKKyAgICAgICBwUGFyZW50ID0gcFBhcmVudC0+R2V0Tm9kZUl0ZW0oQ0ZYX1hNTE5vZGU6OlBhcmVudCkpIHsKKyAgICBpZiAocFBhcmVudC0+R2V0VHlwZSgpICE9IEZYX1hNTE5PREVfRWxlbWVudCkKKyAgICAgIGNvbnRpbnVlOworCisgICAgYXV0byogcEVsZW1lbnQgPSBzdGF0aWNfY2FzdDxDRlhfWE1MRWxlbWVudCo+KHBQYXJlbnQpOworICAgIGlmIChwRWxlbWVudC0+SGFzQXR0cmlidXRlKHdzTlNBdHRyaWJ1dGUuY19zdHIoKSkpIHsKKyAgICAgICp3c05hbWVzcGFjZVVSSSA9IHBFbGVtZW50LT5HZXRTdHJpbmcod3NOU0F0dHJpYnV0ZS5jX3N0cigpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICB3c05hbWVzcGFjZVVSSS0+Y2xlYXIoKTsKKyAgcmV0dXJuIGJSZXQ7Cit9CisKK3ZvaWQgWEZBX0RhdGFFeHBvcnRlcl9EZWFsV2l0aERhdGFHcm91cE5vZGUoQ1hGQV9Ob2RlKiBwRGF0YU5vZGUpIHsKKyAgaWYgKCFwRGF0YU5vZGUgfHwgcERhdGFOb2RlLT5HZXRFbGVtZW50VHlwZSgpID09IFhGQV9FbGVtZW50OjpEYXRhVmFsdWUpCisgICAgcmV0dXJuOworCisgIGludDMyX3QgaUNoaWxkTnVtID0gMDsKKyAgZm9yIChDWEZBX05vZGUqIHBDaGlsZE5vZGUgPSBwRGF0YU5vZGUtPkdldEZpcnN0Q2hpbGQoKTsgcENoaWxkTm9kZTsKKyAgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0TmV4dFNpYmxpbmcoKSkgeworICAgIGlDaGlsZE51bSsrOworICAgIFhGQV9EYXRhRXhwb3J0ZXJfRGVhbFdpdGhEYXRhR3JvdXBOb2RlKHBDaGlsZE5vZGUpOworICB9CisKKyAgaWYgKHBEYXRhTm9kZS0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6RGF0YUdyb3VwKQorICAgIHJldHVybjsKKworICBpZiAoaUNoaWxkTnVtID4gMCkgeworICAgIENGWF9YTUxOb2RlKiBwWE1MTm9kZSA9IHBEYXRhTm9kZS0+R2V0WE1MTWFwcGluZ05vZGUoKTsKKyAgICBBU1NFUlQocFhNTE5vZGUtPkdldFR5cGUoKSA9PSBGWF9YTUxOT0RFX0VsZW1lbnQpOworICAgIENGWF9YTUxFbGVtZW50KiBwWE1MRWxlbWVudCA9IHN0YXRpY19jYXN0PENGWF9YTUxFbGVtZW50Kj4ocFhNTE5vZGUpOworICAgIGlmIChwWE1MRWxlbWVudC0+SGFzQXR0cmlidXRlKEwieGZhOmRhdGFOb2RlIikpCisgICAgICBwWE1MRWxlbWVudC0+UmVtb3ZlQXR0cmlidXRlKEwieGZhOmRhdGFOb2RlIik7CisKICAgICByZXR1cm47CiAgIH0KLSAgc3dpdGNoIChwWE1MTm9kZS0+R2V0VHlwZSgpKSB7Ci0gICAgY2FzZSBGREVfWE1MTk9ERV9FbGVtZW50OiB7Ci0gICAgICBDRkRFX1hNTEVsZW1lbnQqIHBYTUxFbGVtZW50ID0gc3RhdGljX2Nhc3Q8Q0ZERV9YTUxFbGVtZW50Kj4ocFhNTE5vZGUpOwotICAgICAgQ0ZYX1dpZGVTdHJpbmcgd3NUYWc7Ci0gICAgICBwWE1MRWxlbWVudC0+R2V0TG9jYWxUYWdOYW1lKHdzVGFnKTsKLSAgICAgIHVpbnQzMl90IHVUYWcgPSBGWF9IYXNoQ29kZV9HZXRXKHdzVGFnLkFzU3RyaW5nQygpLCB0cnVlKTsKLSAgICAgIGlmICh1VGFnID09IDB4MDAwMWY3MTQpIHsKLSAgICAgICAgd3NQbGFpblRleHQgKz0gTCJcbiI7Ci0gICAgICB9IGVsc2UgaWYgKHVUYWcgPT0gMHgwMDAwMDA3MCkgewotICAgICAgICBpZiAoIXdzUGxhaW5UZXh0LklzRW1wdHkoKSkgewotICAgICAgICAgIHdzUGxhaW5UZXh0ICs9IEwiXG4iOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHVUYWcgPT0gMHhhNDhhYzYzKSB7Ci0gICAgICAgIGlmICghd3NQbGFpblRleHQuSXNFbXB0eSgpICYmCi0gICAgICAgICAgICB3c1BsYWluVGV4dFt3c1BsYWluVGV4dC5HZXRMZW5ndGgoKSAtIDFdICE9ICdcbicpIHsKLSAgICAgICAgICB3c1BsYWluVGV4dCArPSBMIlxuIjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gYnJlYWs7Ci0gICAgY2FzZSBGREVfWE1MTk9ERV9UZXh0OiB7Ci0gICAgICBDRlhfV2lkZVN0cmluZyB3c0NvbnRlbnQ7Ci0gICAgICBzdGF0aWNfY2FzdDxDRkRFX1hNTFRleHQqPihwWE1MTm9kZSktPkdldFRleHQod3NDb250ZW50KTsKLSAgICAgIHdzUGxhaW5UZXh0ICs9IHdzQ29udGVudDsKLSAgICB9IGJyZWFrOwotICAgIGNhc2UgRkRFX1hNTE5PREVfQ2hhckRhdGE6IHsKLSAgICAgIENGWF9XaWRlU3RyaW5nIHdzQ2hhckRhdGE7Ci0gICAgICBzdGF0aWNfY2FzdDxDRkRFX1hNTENoYXJEYXRhKj4ocFhNTE5vZGUpLT5HZXRDaGFyRGF0YSh3c0NoYXJEYXRhKTsKLSAgICAgIHdzUGxhaW5UZXh0ICs9IHdzQ2hhckRhdGE7Ci0gICAgfSBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLSAgZm9yIChDRkRFX1hNTE5vZGUqIHBDaGlsZFhNTCA9Ci0gICAgICAgICAgIHBYTUxOb2RlLT5HZXROb2RlSXRlbShDRkRFX1hNTE5vZGU6OkZpcnN0Q2hpbGQpOwotICAgICAgIHBDaGlsZFhNTDsKLSAgICAgICBwQ2hpbGRYTUwgPSBwQ2hpbGRYTUwtPkdldE5vZGVJdGVtKENGREVfWE1MTm9kZTo6TmV4dFNpYmxpbmcpKSB7Ci0gICAgWEZBX0dldFBsYWluVGV4dEZyb21SaWNoVGV4dChwQ2hpbGRYTUwsIHdzUGxhaW5UZXh0KTsKKworICBDRlhfWE1MTm9kZSogcFhNTE5vZGUgPSBwRGF0YU5vZGUtPkdldFhNTE1hcHBpbmdOb2RlKCk7CisgIEFTU0VSVChwWE1MTm9kZS0+R2V0VHlwZSgpID09IEZYX1hNTE5PREVfRWxlbWVudCk7CisgIHN0YXRpY19jYXN0PENGWF9YTUxFbGVtZW50Kj4ocFhNTE5vZGUpLT5TZXRTdHJpbmcoTCJ4ZmE6ZGF0YU5vZGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwiZGF0YUdyb3VwIik7Cit9CisKK3ZvaWQgWEZBX0RhdGFFeHBvcnRlcl9SZWdlbmVyYXRlRm9ybUZpbGUoCisgICAgQ1hGQV9Ob2RlKiBwTm9kZSwKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX1NlZWthYmxlU3RyZWFtUHJveHk+JiBwU3RyZWFtLAorICAgIGNvbnN0IGNoYXIqIHBDaGVja3N1bSwKKyAgICBib29sIGJTYXZlWE1MKSB7CisgIGlmIChwTm9kZS0+SXNNb2RlbE5vZGUoKSkgeworICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKEwiPGZvcm0iKTsKKyAgICBpZiAocENoZWNrc3VtKSB7CisgICAgICBXaWRlU3RyaW5nIHdzQ2hlY2tzdW0gPSBXaWRlU3RyaW5nOjpGcm9tVVRGOChwQ2hlY2tzdW0pOworICAgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoTCIgY2hlY2tzdW09XCIiKTsKKyAgICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKHdzQ2hlY2tzdW0uQXNTdHJpbmdWaWV3KCkpOworICAgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoTCJcIiIpOworICAgIH0KKyAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyhMIiB4bWxucz1cIiIpOworICAgIHBTdHJlYW0tPldyaXRlU3RyaW5nKFdpZGVTdHJpbmdWaWV3KGtGb3JtTlMpKTsKKworICAgIFdpZGVTdHJpbmcgd3NWZXJzaW9uTnVtYmVyID0gUmVjb2duaXplWEZBVmVyc2lvbk51bWJlcigKKyAgICAgICAgVG9Ob2RlKHBOb2RlLT5HZXREb2N1bWVudCgpLT5HZXRYRkFPYmplY3QoWEZBX0hBU0hDT0RFX1RlbXBsYXRlKSkpOworICAgIGlmICh3c1ZlcnNpb25OdW1iZXIuSXNFbXB0eSgpKQorICAgICAgd3NWZXJzaW9uTnVtYmVyID0gTCIyLjgiOworCisgICAgd3NWZXJzaW9uTnVtYmVyICs9IEwiL1wiXG4+IjsKKyAgICBwU3RyZWFtLT5Xcml0ZVN0cmluZyh3c1ZlcnNpb25OdW1iZXIuQXNTdHJpbmdWaWV3KCkpOworCisgICAgQ1hGQV9Ob2RlKiBwQ2hpbGROb2RlID0gcE5vZGUtPkdldEZpcnN0Q2hpbGQoKTsKKyAgICB3aGlsZSAocENoaWxkTm9kZSkgeworICAgICAgUmVnZW5lcmF0ZUZvcm1GaWxlX0NvbnRhaW5lcihwQ2hpbGROb2RlLCBwU3RyZWFtLCBmYWxzZSk7CisgICAgICBwQ2hpbGROb2RlID0gcENoaWxkTm9kZS0+R2V0TmV4dFNpYmxpbmcoKTsKKyAgICB9CisgICAgcFN0cmVhbS0+V3JpdGVTdHJpbmcoTCI8L2Zvcm1cbj4iKTsKKyAgfSBlbHNlIHsKKyAgICBSZWdlbmVyYXRlRm9ybUZpbGVfQ29udGFpbmVyKHBOb2RlLCBwU3RyZWFtLCBiU2F2ZVhNTCk7CiAgIH0KIH0KIAogYm9vbCBYRkFfRmllbGRJc011bHRpTGlzdEJveChDWEZBX05vZGUqIHBGaWVsZE5vZGUpIHsKLSAgYm9vbCBiUmV0ID0gZmFsc2U7CiAgIGlmICghcEZpZWxkTm9kZSkKLSAgICByZXR1cm4gYlJldDsKKyAgICByZXR1cm4gZmFsc2U7CiAKLSAgQ1hGQV9Ob2RlKiBwVUlDaGlsZCA9IHBGaWVsZE5vZGUtPkdldENoaWxkKDAsIFhGQV9FbGVtZW50OjpVaSk7Ci0gIGlmIChwVUlDaGlsZCkgewotICAgIENYRkFfTm9kZSogcEZpcnN0Q2hpbGQgPSBwVUlDaGlsZC0+R2V0Tm9kZUl0ZW0oWEZBX05PREVJVEVNX0ZpcnN0Q2hpbGQpOwotICAgIGlmIChwRmlyc3RDaGlsZCAmJgotICAgICAgICBwRmlyc3RDaGlsZC0+R2V0RWxlbWVudFR5cGUoKSA9PSBYRkFfRWxlbWVudDo6Q2hvaWNlTGlzdCkgewotICAgICAgYlJldCA9IHBGaXJzdENoaWxkLT5HZXRFbnVtKFhGQV9BVFRSSUJVVEVfT3BlbikgPT0KLSAgICAgICAgICAgICBYRkFfQVRUUklCVVRFRU5VTV9NdWx0aVNlbGVjdDsKLSAgICB9CisgIENYRkFfVWkqIHBVSUNoaWxkID0gcEZpZWxkTm9kZS0+R2V0Q2hpbGQ8Q1hGQV9VaT4oMCwgWEZBX0VsZW1lbnQ6OlVpLCBmYWxzZSk7CisgIGlmICghcFVJQ2hpbGQpCisgICAgcmV0dXJuIGZhbHNlOworCisgIENYRkFfTm9kZSogcEZpcnN0Q2hpbGQgPSBwVUlDaGlsZC0+R2V0Rmlyc3RDaGlsZCgpOworICBpZiAoIXBGaXJzdENoaWxkIHx8CisgICAgICBwRmlyc3RDaGlsZC0+R2V0RWxlbWVudFR5cGUoKSAhPSBYRkFfRWxlbWVudDo6Q2hvaWNlTGlzdCkgeworICAgIHJldHVybiBmYWxzZTsKICAgfQotICByZXR1cm4gYlJldDsKLX0KIAotRlhfRE9VQkxFIFhGQV9CeXRlU3RyaW5nVG9Eb3VibGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelN0cmluZ1ZhbCkgewotICBDRlhfV2lkZVN0cmluZyB3c1ZhbHVlID0gQ0ZYX1dpZGVTdHJpbmc6OkZyb21VVEY4KHN6U3RyaW5nVmFsKTsKLSAgcmV0dXJuIFdpZGVTdHJpbmdUb0RvdWJsZSh3c1ZhbHVlKTsKKyAgcmV0dXJuIHBGaXJzdENoaWxkLT5KU09iamVjdCgpLT5HZXRFbnVtKFhGQV9BdHRyaWJ1dGU6Ok9wZW4pID09CisgICAgICAgICBYRkFfQXR0cmlidXRlRW51bTo6TXVsdGlTZWxlY3Q7CiB9CiAKIGludDMyX3QgWEZBX01hcFJvdGF0aW9uKGludDMyX3QgblJvdGF0aW9uKSB7CkBAIC0yMzQsNyArNTgxLDcgQEAKIAogY29uc3QgWEZBX1NDUklQVEFUVFJJQlVURUlORk8qIFhGQV9HZXRTY3JpcHRBdHRyaWJ1dGVCeU5hbWUoCiAgICAgWEZBX0VsZW1lbnQgZUVsZW1lbnQsCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0F0dHJpYnV0ZU5hbWUpIHsKKyAgICBjb25zdCBXaWRlU3RyaW5nVmlldyYgd3NBdHRyaWJ1dGVOYW1lKSB7CiAgIGlmICh3c0F0dHJpYnV0ZU5hbWUuSXNFbXB0eSgpKQogICAgIHJldHVybiBudWxscHRyOwogCkBAIC0yNjIsMjI1ICs2MDksMyBAQAogICB9CiAgIHJldHVybiBudWxscHRyOwogfQotCi1jb25zdCBYRkFfTk9UU1VSRUFUVFJJQlVURSogWEZBX0dldE5vdHN1cmVBdHRyaWJ1dGUoWEZBX0VsZW1lbnQgZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVUWVBFIGVUeXBlKSB7Ci0gIGludDMyX3QgaVN0YXJ0ID0gMCwgaUVuZCA9IGdfaVhGQU5vdHN1cmVDb3VudCAtIDE7Ci0gIGRvIHsKLSAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOwotICAgIGNvbnN0IFhGQV9OT1RTVVJFQVRUUklCVVRFKiBwQXR0ciA9IGdfWEZBTm90c3VyZUF0dHJpYnV0ZXMgKyBpTWlkOwotICAgIGlmIChlRWxlbWVudCA9PSBwQXR0ci0+ZUVsZW1lbnQpIHsKLSAgICAgIGlmIChwQXR0ci0+ZUF0dHJpYnV0ZSA9PSBlQXR0cmlidXRlKSB7Ci0gICAgICAgIGlmIChlVHlwZSA9PSBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFIHx8IGVUeXBlID09IHBBdHRyLT5lVHlwZSkKLSAgICAgICAgICByZXR1cm4gcEF0dHI7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgfQotICAgICAgaW50MzJfdCBpQmVmb3JlID0gaU1pZCAtIDE7Ci0gICAgICBpZiAoaUJlZm9yZSA+PSAwKSB7Ci0gICAgICAgIHBBdHRyID0gZ19YRkFOb3RzdXJlQXR0cmlidXRlcyArIGlCZWZvcmU7Ci0gICAgICAgIHdoaWxlIChlRWxlbWVudCA9PSBwQXR0ci0+ZUVsZW1lbnQpIHsKLSAgICAgICAgICBpZiAocEF0dHItPmVBdHRyaWJ1dGUgPT0gZUF0dHJpYnV0ZSkgewotICAgICAgICAgICAgaWYgKGVUeXBlID09IFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUgfHwgZVR5cGUgPT0gcEF0dHItPmVUeXBlKQotICAgICAgICAgICAgICByZXR1cm4gcEF0dHI7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaUJlZm9yZS0tOwotICAgICAgICAgIGlmIChpQmVmb3JlIDwgMCkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgcEF0dHIgPSBnX1hGQU5vdHN1cmVBdHRyaWJ1dGVzICsgaUJlZm9yZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpbnQzMl90IGlBZnRlciA9IGlNaWQgKyAxOwotICAgICAgaWYgKGlBZnRlciA8PSBnX2lYRkFOb3RzdXJlQ291bnQgLSAxKSB7Ci0gICAgICAgIHBBdHRyID0gZ19YRkFOb3RzdXJlQXR0cmlidXRlcyArIGlBZnRlcjsKLSAgICAgICAgd2hpbGUgKGVFbGVtZW50ID09IHBBdHRyLT5lRWxlbWVudCkgewotICAgICAgICAgIGlmIChwQXR0ci0+ZUF0dHJpYnV0ZSA9PSBlQXR0cmlidXRlKSB7Ci0gICAgICAgICAgICBpZiAoZVR5cGUgPT0gWEZBX0FUVFJJQlVURVRZUEVfTk9UU1VSRSB8fCBlVHlwZSA9PSBwQXR0ci0+ZVR5cGUpCi0gICAgICAgICAgICAgIHJldHVybiBwQXR0cjsKLSAgICAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgICAgICAgIH0KLSAgICAgICAgICBpQWZ0ZXIrKzsKLSAgICAgICAgICBpZiAoaUFmdGVyID4gZ19pWEZBTm90c3VyZUNvdW50IC0gMSkKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgcEF0dHIgPSBnX1hGQU5vdHN1cmVBdHRyaWJ1dGVzICsgaUFmdGVyOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICBpZiAoZUVsZW1lbnQgPCBwQXR0ci0+ZUVsZW1lbnQpCi0gICAgICBpRW5kID0gaU1pZCAtIDE7Ci0gICAgZWxzZQotICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7Ci0gIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLWNvbnN0IFhGQV9QUk9QRVJUWSogWEZBX0dldFByb3BlcnR5T2ZFbGVtZW50KFhGQV9FbGVtZW50IGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQgZVByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdQYWNrZXQpIHsKLSAgaW50MzJfdCBpQ291bnQgPSAwOwotICBjb25zdCBYRkFfUFJPUEVSVFkqIHBQcm9wZXJ0aWVzID0gWEZBX0dldEVsZW1lbnRQcm9wZXJ0aWVzKGVFbGVtZW50LCBpQ291bnQpOwotICBpZiAoIXBQcm9wZXJ0aWVzIHx8IGlDb3VudCA8IDEpCi0gICAgcmV0dXJuIG51bGxwdHI7Ci0KLSAgYXV0byBpdCA9IHN0ZDo6ZmluZF9pZihwUHJvcGVydGllcywgcFByb3BlcnRpZXMgKyBpQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgW2VQcm9wZXJ0eV0oY29uc3QgWEZBX1BST1BFUlRZJiBwcm9wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcC5lTmFtZSA9PSBlUHJvcGVydHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gIGlmIChpdCA9PSBwUHJvcGVydGllcyArIGlDb3VudCkKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBjb25zdCBYRkFfRUxFTUVOVElORk8qIHBJbmZvID0gWEZBX0dldEVsZW1lbnRCeUlEKGVQcm9wZXJ0eSk7Ci0gIEFTU0VSVChwSW5mbyk7Ci0gIGlmIChkd1BhY2tldCAhPSBYRkFfWERQUEFDS0VUX1VOS05PV04gJiYgIShkd1BhY2tldCAmIHBJbmZvLT5kd1BhY2tldHMpKQotICAgIHJldHVybiBudWxscHRyOwotICByZXR1cm4gaXQ7Ci19Ci0KLWNvbnN0IFhGQV9QUk9QRVJUWSogWEZBX0dldEVsZW1lbnRQcm9wZXJ0aWVzKFhGQV9FbGVtZW50IGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUNvdW50KSB7Ci0gIGlmIChlRWxlbWVudCA9PSBYRkFfRWxlbWVudDo6VW5rbm93bikKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBjb25zdCBYRkFfRUxFTUVOVEhJRVJBUkNIWSogcEVsZW1lbnQgPQotICAgICAgZ19YRkFFbGVtZW50UHJvcGVydHlJbmRleCArIHN0YXRpY19jYXN0PGludDMyX3Q+KGVFbGVtZW50KTsKLSAgaUNvdW50ID0gcEVsZW1lbnQtPndDb3VudDsKLSAgcmV0dXJuIGdfWEZBRWxlbWVudFByb3BlcnR5RGF0YSArIHBFbGVtZW50LT53U3RhcnQ7Ci19Ci0KLWNvbnN0IHVpbnQ4X3QqIFhGQV9HZXRFbGVtZW50QXR0cmlidXRlcyhYRkFfRWxlbWVudCBlRWxlbWVudCwgaW50MzJfdCYgaUNvdW50KSB7Ci0gIGlmIChlRWxlbWVudCA9PSBYRkFfRWxlbWVudDo6VW5rbm93bikKLSAgICByZXR1cm4gbnVsbHB0cjsKLQotICBjb25zdCBYRkFfRUxFTUVOVEhJRVJBUkNIWSogcEVsZW1lbnQgPQotICAgICAgZ19YRkFFbGVtZW50QXR0cmlidXRlSW5kZXggKyBzdGF0aWNfY2FzdDxpbnQzMl90PihlRWxlbWVudCk7Ci0gIGlDb3VudCA9IHBFbGVtZW50LT53Q291bnQ7Ci0gIHJldHVybiBnX1hGQUVsZW1lbnRBdHRyaWJ1dGVEYXRhICsgcEVsZW1lbnQtPndTdGFydDsKLX0KLQotY29uc3QgWEZBX0VMRU1FTlRJTkZPKiBYRkFfR2V0RWxlbWVudEJ5SUQoWEZBX0VsZW1lbnQgZU5hbWUpIHsKLSAgcmV0dXJuIGVOYW1lICE9IFhGQV9FbGVtZW50OjpVbmtub3duCi0gICAgICAgICAgICAgPyBnX1hGQUVsZW1lbnREYXRhICsgc3RhdGljX2Nhc3Q8aW50MzJfdD4oZU5hbWUpCi0gICAgICAgICAgICAgOiBudWxscHRyOwotfQotCi1YRkFfRWxlbWVudCBYRkFfR2V0RWxlbWVudFR5cGVGb3JOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKSB7Ci0gIGlmICh3c05hbWUuSXNFbXB0eSgpKQotICAgIHJldHVybiBYRkFfRWxlbWVudDo6VW5rbm93bjsKLQotICB1aW50MzJfdCB1SGFzaCA9IEZYX0hhc2hDb2RlX0dldFcod3NOYW1lLCBmYWxzZSk7Ci0gIGNvbnN0IFhGQV9FTEVNRU5USU5GTyogcEVuZCA9IGdfWEZBRWxlbWVudERhdGEgKyBnX2lYRkFFbGVtZW50Q291bnQ7Ci0gIGF1dG8gcEluZm8gPSBzdGQ6Omxvd2VyX2JvdW5kKGdfWEZBRWxlbWVudERhdGEsIHBFbmQsIHVIYXNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBYRkFfRUxFTUVOVElORk8mIGluZm8sIHVpbnQzMl90IGhhc2gpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mby51SGFzaCA8IGhhc2g7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICBpZiAocEluZm8gPCBwRW5kICYmIHBJbmZvLT51SGFzaCA9PSB1SGFzaCkKLSAgICByZXR1cm4gcEluZm8tPmVOYW1lOwotICByZXR1cm4gWEZBX0VsZW1lbnQ6OlVua25vd247Ci19Ci0KLUNYRkFfTWVhc3VyZW1lbnQgWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZV9NZWFzdXJlKFhGQV9FbGVtZW50IGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdQYWNrZXQpIHsKLSAgdm9pZCogcFZhbHVlOwotICBpZiAoWEZBX0dldEF0dHJpYnV0ZURlZmF1bHRWYWx1ZShwVmFsdWUsIGVFbGVtZW50LCBlQXR0cmlidXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFVFlQRV9NZWFzdXJlLCBkd1BhY2tldCkpIHsKLSAgICByZXR1cm4gKihDWEZBX01lYXN1cmVtZW50KilwVmFsdWU7Ci0gIH0KLSAgcmV0dXJuIENYRkFfTWVhc3VyZW1lbnQoKTsKLX0KLQotYm9vbCBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlKHZvaWQqJiBwVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0VsZW1lbnQgZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURSBlQXR0cmlidXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9BVFRSSUJVVEVUWVBFIGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3UGFja2V0KSB7Ci0gIGNvbnN0IFhGQV9BVFRSSUJVVEVJTkZPKiBwSW5mbyA9IFhGQV9HZXRBdHRyaWJ1dGVCeUlEKGVBdHRyaWJ1dGUpOwotICBpZiAoIXBJbmZvKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKGR3UGFja2V0ICYmIChkd1BhY2tldCAmIHBJbmZvLT5kd1BhY2tldHMpID09IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAocEluZm8tPmVUeXBlID09IGVUeXBlKSB7Ci0gICAgcFZhbHVlID0gcEluZm8tPnBEZWZWYWx1ZTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBpZiAocEluZm8tPmVUeXBlID09IFhGQV9BVFRSSUJVVEVUWVBFX05PVFNVUkUpIHsKLSAgICBjb25zdCBYRkFfTk9UU1VSRUFUVFJJQlVURSogcEF0dHIgPQotICAgICAgICBYRkFfR2V0Tm90c3VyZUF0dHJpYnV0ZShlRWxlbWVudCwgZUF0dHJpYnV0ZSwgZVR5cGUpOwotICAgIGlmIChwQXR0cikgewotICAgICAgcFZhbHVlID0gcEF0dHItPnBWYWx1ZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWNvbnN0IFhGQV9BVFRSSUJVVEVJTkZPKiBYRkFfR2V0QXR0cmlidXRlQnlOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKSB7Ci0gIGlmICh3c05hbWUuSXNFbXB0eSgpKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIHVpbnQzMl90IHVIYXNoID0gRlhfSGFzaENvZGVfR2V0Vyh3c05hbWUsIGZhbHNlKTsKLSAgaW50MzJfdCBpU3RhcnQgPSAwOwotICBpbnQzMl90IGlFbmQgPSBnX2lYRkFBdHRyaWJ1dGVDb3VudCAtIDE7Ci0gIGRvIHsKLSAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOwotICAgIGNvbnN0IFhGQV9BVFRSSUJVVEVJTkZPKiBwSW5mbyA9IGdfWEZBQXR0cmlidXRlRGF0YSArIGlNaWQ7Ci0gICAgaWYgKHVIYXNoID09IHBJbmZvLT51SGFzaCkKLSAgICAgIHJldHVybiBwSW5mbzsKLSAgICBpZiAodUhhc2ggPCBwSW5mby0+dUhhc2gpCi0gICAgICBpRW5kID0gaU1pZCAtIDE7Ci0gICAgZWxzZQotICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7Ci0gIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLWNvbnN0IFhGQV9BVFRSSUJVVEVJTkZPKiBYRkFfR2V0QXR0cmlidXRlQnlJRChYRkFfQVRUUklCVVRFIGVOYW1lKSB7Ci0gIHJldHVybiAoZU5hbWUgPCBnX2lYRkFBdHRyaWJ1dGVDb3VudCkgPyAoZ19YRkFBdHRyaWJ1dGVEYXRhICsgZU5hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxscHRyOwotfQotCi1jb25zdCBYRkFfQVRUUklCVVRFRU5VTUlORk8qIFhGQV9HZXRBdHRyaWJ1dGVFbnVtQnlOYW1lKAotICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lKSB7Ci0gIGlmICh3c05hbWUuSXNFbXB0eSgpKQotICAgIHJldHVybiBudWxscHRyOwotCi0gIHVpbnQzMl90IHVIYXNoID0gRlhfSGFzaENvZGVfR2V0Vyh3c05hbWUsIGZhbHNlKTsKLSAgaW50MzJfdCBpU3RhcnQgPSAwOwotICBpbnQzMl90IGlFbmQgPSBnX2lYRkFFbnVtQ291bnQgLSAxOwotICBkbyB7Ci0gICAgaW50MzJfdCBpTWlkID0gKGlTdGFydCArIGlFbmQpIC8gMjsKLSAgICBjb25zdCBYRkFfQVRUUklCVVRFRU5VTUlORk8qIHBJbmZvID0gZ19YRkFFbnVtRGF0YSArIGlNaWQ7Ci0gICAgaWYgKHVIYXNoID09IHBJbmZvLT51SGFzaCkKLSAgICAgIHJldHVybiBwSW5mbzsKLSAgICBpZiAodUhhc2ggPCBwSW5mby0+dUhhc2gpCi0gICAgICBpRW5kID0gaU1pZCAtIDE7Ci0gICAgZWxzZQotICAgICAgaVN0YXJ0ID0gaU1pZCArIDE7Ci0gIH0gd2hpbGUgKGlTdGFydCA8PSBpRW5kKTsKLSAgcmV0dXJuIG51bGxwdHI7Ci19Ci0KLWNvbnN0IFhGQV9QQUNLRVRJTkZPKiBYRkFfR2V0UGFja2V0QnlJbmRleChYRkFfUEFDS0VUIGVQYWNrZXQpIHsKLSAgcmV0dXJuIGdfWEZBUGFja2V0RGF0YSArIGVQYWNrZXQ7Ci19Ci0KLWNvbnN0IFhGQV9QQUNLRVRJTkZPKiBYRkFfR2V0UGFja2V0QnlJRCh1aW50MzJfdCBkd1BhY2tldCkgewotICBpbnQzMl90IGlTdGFydCA9IDAsIGlFbmQgPSBnX2lYRkFQYWNrZXRDb3VudCAtIDE7Ci0gIGRvIHsKLSAgICBpbnQzMl90IGlNaWQgPSAoaVN0YXJ0ICsgaUVuZCkgLyAyOwotICAgIHVpbnQzMl90IGR3RmluZCA9IChnX1hGQVBhY2tldERhdGEgKyBpTWlkKS0+ZU5hbWU7Ci0gICAgaWYgKGR3UGFja2V0ID09IGR3RmluZCkKLSAgICAgIHJldHVybiBnX1hGQVBhY2tldERhdGEgKyBpTWlkOwotICAgIGlmIChkd1BhY2tldCA8IGR3RmluZCkKLSAgICAgIGlFbmQgPSBpTWlkIC0gMTsKLSAgICBlbHNlCi0gICAgICBpU3RhcnQgPSBpTWlkICsgMTsKLSAgfSB3aGlsZSAoaVN0YXJ0IDw9IGlFbmQpOwotICByZXR1cm4gbnVsbHB0cjsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3BhcnNlci94ZmFfdXRpbHMuaCBiL3hmYS9meGZhL3BhcnNlci94ZmFfdXRpbHMuaAppbmRleCBkMDlhZmRhLi45MzA4MTU3IDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIveGZhX3V0aWxzLmgKKysrIGIveGZhL2Z4ZmEvcGFyc2VyL3hmYV91dGlscy5oCkBAIC03LDIwNyArNywzNyBAQAogI2lmbmRlZiBYRkFfRlhGQV9QQVJTRVJfWEZBX1VUSUxTX0hfCiAjZGVmaW5lIFhGQV9GWEZBX1BBUlNFUl9YRkFfVVRJTFNfSF8KIAotI2luY2x1ZGUgInhmYS9mZGUveG1sL2ZkZV94bWwuaCIKLSNpbmNsdWRlICJ4ZmEvZmdhcy9jcnQvZmdhc19zdHJlYW0uaCIKLSNpbmNsdWRlICJ4ZmEvZmdhcy9jcnQvZmdhc191dGlscy5oIgorI2luY2x1ZGUgImNvcmUvZnhjcnQvY2Z4X3NlZWthYmxlc3RyZWFtcHJveHkuaCIKICNpbmNsdWRlICJ4ZmEvZnhmYS9meGZhX2Jhc2ljLmgiCiAKLWNsYXNzIENGREVfWE1MRWxlbWVudDsKLWNsYXNzIENGREVfWE1MTm9kZTsKK2NsYXNzIENGWF9YTUxFbGVtZW50OworY2xhc3MgQ0ZYX1hNTE5vZGU7CiBjbGFzcyBDWEZBX0xvY2FsZVZhbHVlOwogY2xhc3MgQ1hGQV9Ob2RlOwotY2xhc3MgQ1hGQV9XaWRnZXREYXRhOworY2xhc3MgQ1hGQV9XaWRnZXRBY2M7CiAKLWJvb2wgWEZBX0ZERUV4dGVuc2lvbl9SZXNvbHZlTmFtZXNwYWNlUXVhbGlmaWVyKAotICAgIENGREVfWE1MRWxlbWVudCogcE5vZGUsCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c1F1YWxpZmllciwKLSAgICBDRlhfV2lkZVN0cmluZyYgd3NOYW1lc3BhY2VVUkkpOworZG91YmxlIFhGQV9HZXRGcmFjdGlvbmFsU2NhbGUodWludDMyX3QgaWR4KTsKK2ludCBYRkFfR2V0TWF4RnJhY3Rpb25hbFNjYWxlKCk7CiAKLXRlbXBsYXRlIDxjbGFzcyBOb2RlVHlwZSwgY2xhc3MgVHJhdmVyc2VTdHJhdGVneT4KLWNsYXNzIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGUgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9Ob2RlSXRlcmF0b3JUZW1wbGF0ZShOb2RlVHlwZSogcFJvb3ROb2RlID0gbnVsbHB0cikKLSAgICAgIDogbV9wUm9vdChwUm9vdE5vZGUpLCBtX05vZGVTdGFjaygxMDApIHsKLSAgICBpZiAocFJvb3ROb2RlKSB7Ci0gICAgICBtX05vZGVTdGFjay5QdXNoKHBSb290Tm9kZSk7Ci0gICAgfQotICB9Ci0gIGJvb2wgSW5pdChOb2RlVHlwZSogcFJvb3ROb2RlKSB7Ci0gICAgaWYgKCFwUm9vdE5vZGUpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgbV9wUm9vdCA9IHBSb290Tm9kZTsKLSAgICBtX05vZGVTdGFjay5SZW1vdmVBbGwoZmFsc2UpOwotICAgIG1fTm9kZVN0YWNrLlB1c2gocFJvb3ROb2RlKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICB2b2lkIENsZWFyKCkgeyBtX05vZGVTdGFjay5SZW1vdmVBbGwoZmFsc2UpOyB9Ci0gIHZvaWQgUmVzZXQoKSB7Ci0gICAgQ2xlYXIoKTsKLSAgICBpZiAobV9wUm9vdCkgewotICAgICAgbV9Ob2RlU3RhY2suUHVzaChtX3BSb290KTsKLSAgICB9Ci0gIH0KLSAgYm9vbCBTZXRDdXJyZW50KE5vZGVUeXBlKiBwQ3VyTm9kZSkgewotICAgIG1fTm9kZVN0YWNrLlJlbW92ZUFsbChmYWxzZSk7Ci0gICAgaWYgKHBDdXJOb2RlKSB7Ci0gICAgICBDRlhfU3RhY2tUZW1wbGF0ZTxOb2RlVHlwZSo+IHJldlN0YWNrKDEwMCk7Ci0gICAgICBOb2RlVHlwZSogcE5vZGU7Ci0gICAgICBmb3IgKHBOb2RlID0gcEN1ck5vZGU7IHBOb2RlICYmIHBOb2RlICE9IG1fcFJvb3Q7Ci0gICAgICAgICAgIHBOb2RlID0gVHJhdmVyc2VTdHJhdGVneTo6R2V0UGFyZW50KHBOb2RlKSkgewotICAgICAgICByZXZTdGFjay5QdXNoKHBOb2RlKTsKLSAgICAgIH0KLSAgICAgIGlmICghcE5vZGUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgcmV2U3RhY2suUHVzaChtX3BSb290KTsKLSAgICAgIHdoaWxlIChyZXZTdGFjay5HZXRTaXplKCkpIHsKLSAgICAgICAgbV9Ob2RlU3RhY2suUHVzaCgqcmV2U3RhY2suR2V0VG9wRWxlbWVudCgpKTsKLSAgICAgICAgcmV2U3RhY2suUG9wKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIE5vZGVUeXBlKiBHZXRDdXJyZW50KCkgY29uc3QgewotICAgIHJldHVybiBtX05vZGVTdGFjay5HZXRTaXplKCkgPyAqbV9Ob2RlU3RhY2suR2V0VG9wRWxlbWVudCgpIDogbnVsbHB0cjsKLSAgfQotICBOb2RlVHlwZSogR2V0Um9vdCgpIGNvbnN0IHsgcmV0dXJuIG1fcFJvb3Q7IH0KLSAgTm9kZVR5cGUqIE1vdmVUb1ByZXYoKSB7Ci0gICAgaW50MzJfdCBuU3RhY2tMZW5ndGggPSBtX05vZGVTdGFjay5HZXRTaXplKCk7Ci0gICAgaWYgKG5TdGFja0xlbmd0aCA9PSAxKSB7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9IGVsc2UgaWYgKG5TdGFja0xlbmd0aCA+IDEpIHsKLSAgICAgIE5vZGVUeXBlKiBwQ3VySXRlbSA9ICptX05vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7Ci0gICAgICBtX05vZGVTdGFjay5Qb3AoKTsKLSAgICAgIE5vZGVUeXBlKiBwUGFyZW50SXRlbSA9ICptX05vZGVTdGFjay5HZXRUb3BFbGVtZW50KCk7Ci0gICAgICBOb2RlVHlwZSogcFBhcmVudEZpcnN0Q2hpbGRJdGVtID0KLSAgICAgICAgICBUcmF2ZXJzZVN0cmF0ZWd5OjpHZXRGaXJzdENoaWxkKHBQYXJlbnRJdGVtKTsKLSAgICAgIGlmIChwQ3VySXRlbSA9PSBwUGFyZW50Rmlyc3RDaGlsZEl0ZW0pIHsKLSAgICAgICAgcmV0dXJuIHBQYXJlbnRJdGVtOwotICAgICAgfQotICAgICAgTm9kZVR5cGUgKnBQcmV2SXRlbSA9IHBQYXJlbnRGaXJzdENoaWxkSXRlbSwgKnBQcmV2SXRlbU5leHQgPSBudWxscHRyOwotICAgICAgZm9yICg7IHBQcmV2SXRlbTsgcFByZXZJdGVtID0gcFByZXZJdGVtTmV4dCkgewotICAgICAgICBwUHJldkl0ZW1OZXh0ID0gVHJhdmVyc2VTdHJhdGVneTo6R2V0TmV4dFNpYmxpbmcocFByZXZJdGVtKTsKLSAgICAgICAgaWYgKCFwUHJldkl0ZW1OZXh0IHx8IHBQcmV2SXRlbU5leHQgPT0gcEN1ckl0ZW0pIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgbV9Ob2RlU3RhY2suUHVzaChwUHJldkl0ZW0pOwotICAgIH0gZWxzZSB7Ci0gICAgICBtX05vZGVTdGFjay5SZW1vdmVBbGwoZmFsc2UpOwotICAgICAgaWYgKG1fcFJvb3QpIHsKLSAgICAgICAgbV9Ob2RlU3RhY2suUHVzaChtX3BSb290KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1fTm9kZVN0YWNrLkdldFNpemUoKSA+IDApIHsKLSAgICAgIE5vZGVUeXBlKiBwQ2hpbGRJdGVtID0gKm1fTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsKLSAgICAgIHdoaWxlICgocENoaWxkSXRlbSA9IFRyYXZlcnNlU3RyYXRlZ3k6OkdldEZpcnN0Q2hpbGQocENoaWxkSXRlbSkpICE9Ci0gICAgICAgICAgICAgbnVsbHB0cikgewotICAgICAgICB3aGlsZSAoTm9kZVR5cGUqIHBOZXh0SXRlbSA9Ci0gICAgICAgICAgICAgICAgICAgVHJhdmVyc2VTdHJhdGVneTo6R2V0TmV4dFNpYmxpbmcocENoaWxkSXRlbSkpIHsKLSAgICAgICAgICBwQ2hpbGRJdGVtID0gcE5leHRJdGVtOwotICAgICAgICB9Ci0gICAgICAgIG1fTm9kZVN0YWNrLlB1c2gocENoaWxkSXRlbSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gKm1fTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGxwdHI7Ci0gIH0KLSAgTm9kZVR5cGUqIE1vdmVUb05leHQoKSB7Ci0gICAgTm9kZVR5cGUqKiBwcE5vZGUgPSBudWxscHRyOwotICAgIE5vZGVUeXBlKiBwQ3VycmVudCA9IEdldEN1cnJlbnQoKTsKLSAgICB3aGlsZSAobV9Ob2RlU3RhY2suR2V0U2l6ZSgpID4gMCkgewotICAgICAgd2hpbGUgKChwcE5vZGUgPSBtX05vZGVTdGFjay5HZXRUb3BFbGVtZW50KCkpICE9IG51bGxwdHIpIHsKLSAgICAgICAgaWYgKHBDdXJyZW50ICE9ICpwcE5vZGUpIHsKLSAgICAgICAgICByZXR1cm4gKnBwTm9kZTsKLSAgICAgICAgfQotICAgICAgICBOb2RlVHlwZSogcENoaWxkID0gVHJhdmVyc2VTdHJhdGVneTo6R2V0Rmlyc3RDaGlsZCgqcHBOb2RlKTsKLSAgICAgICAgaWYgKCFwQ2hpbGQpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtX05vZGVTdGFjay5QdXNoKHBDaGlsZCk7Ci0gICAgICB9Ci0gICAgICB3aGlsZSAoKHBwTm9kZSA9IG1fTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKSkgIT0gbnVsbHB0cikgewotICAgICAgICBOb2RlVHlwZSogcE5leHQgPSBUcmF2ZXJzZVN0cmF0ZWd5OjpHZXROZXh0U2libGluZygqcHBOb2RlKTsKLSAgICAgICAgbV9Ob2RlU3RhY2suUG9wKCk7Ci0gICAgICAgIGlmIChtX05vZGVTdGFjay5HZXRTaXplKCkgPT0gMCkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwTmV4dCkgewotICAgICAgICAgIG1fTm9kZVN0YWNrLlB1c2gocE5leHQpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0gIE5vZGVUeXBlKiBTa2lwQ2hpbGRyZW5BbmRNb3ZlVG9OZXh0KCkgewotICAgIE5vZGVUeXBlKiogcHBOb2RlID0gbnVsbHB0cjsKLSAgICB3aGlsZSAoKHBwTm9kZSA9IG1fTm9kZVN0YWNrLkdldFRvcEVsZW1lbnQoKSkgIT0gbnVsbHB0cikgewotICAgICAgTm9kZVR5cGUqIHBOZXh0ID0gVHJhdmVyc2VTdHJhdGVneTo6R2V0TmV4dFNpYmxpbmcoKnBwTm9kZSk7Ci0gICAgICBtX05vZGVTdGFjay5Qb3AoKTsKLSAgICAgIGlmIChtX05vZGVTdGFjay5HZXRTaXplKCkgPT0gMCkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmIChwTmV4dCkgewotICAgICAgICBtX05vZGVTdGFjay5QdXNoKHBOZXh0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBHZXRDdXJyZW50KCk7Ci0gIH0KK2Jvb2wgWEZBX0ZERUV4dGVuc2lvbl9SZXNvbHZlTmFtZXNwYWNlUXVhbGlmaWVyKENGWF9YTUxFbGVtZW50KiBwTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpZGVTdHJpbmcmIHdzUXVhbGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lkZVN0cmluZyogd3NOYW1lc3BhY2VVUkkpOwogCi0gcHJvdGVjdGVkOgotICBOb2RlVHlwZSogbV9wUm9vdDsKLSAgQ0ZYX1N0YWNrVGVtcGxhdGU8Tm9kZVR5cGUqPiBtX05vZGVTdGFjazsKLX07Ci0KLUNYRkFfTG9jYWxlVmFsdWUgWEZBX0dldExvY2FsZVZhbHVlKENYRkFfV2lkZ2V0RGF0YSogcFdpZGdldERhdGEpOwotRlhfRE9VQkxFIFhGQV9CeXRlU3RyaW5nVG9Eb3VibGUoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBzelN0cmluZ1ZhbCk7CitDWEZBX0xvY2FsZVZhbHVlIFhGQV9HZXRMb2NhbGVWYWx1ZShDWEZBX05vZGUqIHBOb2RlKTsKIGludDMyX3QgWEZBX01hcFJvdGF0aW9uKGludDMyX3QgblJvdGF0aW9uKTsKIAotYm9vbCBYRkFfUmVjb2duaXplUmljaFRleHQoQ0ZERV9YTUxFbGVtZW50KiBwUmljaFRleHRYTUxOb2RlKTsKLXZvaWQgWEZBX0dldFBsYWluVGV4dEZyb21SaWNoVGV4dChDRkRFX1hNTE5vZGUqIHBYTUxOb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9XaWRlU3RyaW5nJiB3c1BsYWluVGV4dCk7Citib29sIFhGQV9SZWNvZ25pemVSaWNoVGV4dChDRlhfWE1MRWxlbWVudCogcFJpY2hUZXh0WE1MTm9kZSk7CiBib29sIFhGQV9GaWVsZElzTXVsdGlMaXN0Qm94KENYRkFfTm9kZSogcEZpZWxkTm9kZSk7CiAKIHZvaWQgWEZBX0RhdGFFeHBvcnRlcl9EZWFsV2l0aERhdGFHcm91cE5vZGUoQ1hGQV9Ob2RlKiBwRGF0YU5vZGUpOwogdm9pZCBYRkFfRGF0YUV4cG9ydGVyX1JlZ2VuZXJhdGVGb3JtRmlsZSgKICAgICBDWEZBX05vZGUqIHBOb2RlLAotICAgIGNvbnN0IENGWF9SZXRhaW5QdHI8SUZHQVNfU3RyZWFtPiYgcFN0cmVhbSwKLSAgICBjb25zdCBGWF9DSEFSKiBwQ2hlY2tzdW0gPSBudWxscHRyLAotICAgIGJvb2wgYlNhdmVYTUwgPSBmYWxzZSk7Ci0KLWNvbnN0IFhGQV9OT1RTVVJFQVRUUklCVVRFKiBYRkFfR2V0Tm90c3VyZUF0dHJpYnV0ZSgKLSAgICBYRkFfRWxlbWVudCBlRWxlbWVudCwKLSAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsCi0gICAgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUgPSBYRkFfQVRUUklCVVRFVFlQRV9OT1RTVVJFKTsKKyAgICBjb25zdCBSZXRhaW5QdHI8Q0ZYX1NlZWthYmxlU3RyZWFtUHJveHk+JiBwU3RyZWFtLAorICAgIGNvbnN0IGNoYXIqIHBDaGVja3N1bSwKKyAgICBib29sIGJTYXZlWE1MKTsKIAogY29uc3QgWEZBX1NDUklQVEFUVFJJQlVURUlORk8qIFhGQV9HZXRTY3JpcHRBdHRyaWJ1dGVCeU5hbWUoCiAgICAgWEZBX0VsZW1lbnQgZUVsZW1lbnQsCi0gICAgY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c0F0dHJpYnV0ZU5hbWUpOwotCi1jb25zdCBYRkFfUFJPUEVSVFkqIFhGQV9HZXRQcm9wZXJ0eU9mRWxlbWVudChYRkFfRWxlbWVudCBlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhGQV9FbGVtZW50IGVQcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3UGFja2V0KTsKLWNvbnN0IFhGQV9QUk9QRVJUWSogWEZBX0dldEVsZW1lbnRQcm9wZXJ0aWVzKFhGQV9FbGVtZW50IGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUNvdW50KTsKLWNvbnN0IHVpbnQ4X3QqIFhGQV9HZXRFbGVtZW50QXR0cmlidXRlcyhYRkFfRWxlbWVudCBlRWxlbWVudCwgaW50MzJfdCYgaUNvdW50KTsKLWNvbnN0IFhGQV9FTEVNRU5USU5GTyogWEZBX0dldEVsZW1lbnRCeUlEKFhGQV9FbGVtZW50IGVOYW1lKTsKLVhGQV9FbGVtZW50IFhGQV9HZXRFbGVtZW50VHlwZUZvck5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpOwotQ1hGQV9NZWFzdXJlbWVudCBYRkFfR2V0QXR0cmlidXRlRGVmYXVsdFZhbHVlX01lYXN1cmUoWEZBX0VsZW1lbnQgZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1BhY2tldCk7Ci1ib29sIFhGQV9HZXRBdHRyaWJ1dGVEZWZhdWx0VmFsdWUodm9pZComIHBWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRWxlbWVudCBlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfQVRUUklCVVRFIGVBdHRyaWJ1dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX0FUVFJJQlVURVRZUEUgZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdQYWNrZXQpOwotY29uc3QgWEZBX0FUVFJJQlVURUlORk8qIFhGQV9HZXRBdHRyaWJ1dGVCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmdDJiB3c05hbWUpOwotY29uc3QgWEZBX0FUVFJJQlVURUlORk8qIFhGQV9HZXRBdHRyaWJ1dGVCeUlEKFhGQV9BVFRSSUJVVEUgZU5hbWUpOwotY29uc3QgWEZBX0FUVFJJQlVURUVOVU1JTkZPKiBYRkFfR2V0QXR0cmlidXRlRW51bUJ5TmFtZSgKLSAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzTmFtZSk7Ci1jb25zdCBYRkFfUEFDS0VUSU5GTyogWEZBX0dldFBhY2tldEJ5SW5kZXgoWEZBX1BBQ0tFVCBlUGFja2V0KTsKLWNvbnN0IFhGQV9QQUNLRVRJTkZPKiBYRkFfR2V0UGFja2V0QnlJRCh1aW50MzJfdCBkd1BhY2tldCk7CisgICAgY29uc3QgV2lkZVN0cmluZ1ZpZXcmIHdzQXR0cmlidXRlTmFtZSk7CiAKICNlbmRpZiAgLy8gWEZBX0ZYRkFfUEFSU0VSX1hGQV9VVElMU19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEvcGFyc2VyL3hmYV91dGlsc191bml0dGVzdC5jcHAgYi94ZmEvZnhmYS9wYXJzZXIveGZhX3V0aWxzX3VuaXR0ZXN0LmNwcAppbmRleCA5M2VlM2I5Li5jOWY2NjJlIDEwMDY0NAotLS0gYS94ZmEvZnhmYS9wYXJzZXIveGZhX3V0aWxzX3VuaXR0ZXN0LmNwcAorKysgYi94ZmEvZnhmYS9wYXJzZXIveGZhX3V0aWxzX3VuaXR0ZXN0LmNwcApAQCAtMiwxMCArMiwxMiBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgogI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci94ZmFfdXRpbHMuaCIKIAotVEVTVChYZmFVdGlsc0ltcCwgWEZBX01hcFJvdGF0aW9uKSB7CisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisjaW5jbHVkZSAidGVzdGluZy90ZXN0X3N1cHBvcnQuaCIKKworVEVTVChYZmFVdGlsc0ltcFRlc3QsIFhGQV9NYXBSb3RhdGlvbikgewogICBzdHJ1Y3QgVGVzdENhc2UgewogICAgIGludCBpbnB1dDsKICAgICBpbnQgZXhwZWN0ZWRfb3V0cHV0OwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEveGZhX2NoZWNrc3VtLmggYi94ZmEvZnhmYS94ZmFfY2hlY2tzdW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFjZjEwMS4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS94ZmFfY2hlY2tzdW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhGQV9YRkFfQ0hFQ0tTVU1fSF8KLSNkZWZpbmUgWEZBX0ZYRkFfWEZBX0NIRUNLU1VNX0hfCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb3JlL2Zkcm0vY3J5cHRvL2Z4X2NyeXB0LmgiCi0jaW5jbHVkZSAieGZhL2ZkZS94bWwvY2Z4X3NheHJlYWRlci5oIgotI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmEuaCIKLQotY2xhc3MgQ1hGQV9TQVhSZWFkZXJIYW5kbGVyOwotY2xhc3MgQ1hGQV9DaGVja3N1bUNvbnRleHQ7Ci0KLWNsYXNzIENYRkFfU0FYQ29udGV4dCB7Ci0gcHVibGljOgotICBDWEZBX1NBWENvbnRleHQoKSA6IG1fZU5vZGUoQ0ZYX1NBWEl0ZW06OlR5cGU6OlVua25vd24pIHt9Ci0KLSAgQ0ZYX0J5dGVUZXh0QnVmIG1fVGV4dEJ1ZjsKLSAgQ0ZYX0J5dGVTdHJpbmcgbV9ic1RhZ05hbWU7Ci0gIENGWF9TQVhJdGVtOjpUeXBlIG1fZU5vZGU7Ci19OwotCi1jbGFzcyBDWEZBX1NBWFJlYWRlckhhbmRsZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9TQVhSZWFkZXJIYW5kbGVyKENYRkFfQ2hlY2tzdW1Db250ZXh0KiBwQ29udGV4dCk7Ci0gIH5DWEZBX1NBWFJlYWRlckhhbmRsZXIoKTsKLQotICBDWEZBX1NBWENvbnRleHQqIE9uVGFnRW50ZXIoY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1RhZ05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfU0FYSXRlbTo6VHlwZSBlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhcnRQb3MpOwotICB2b2lkIE9uVGFnQXR0cmlidXRlKENYRkFfU0FYQ29udGV4dCogcFRhZywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzQXR0cmksCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic1ZhbHVlKTsKLSAgdm9pZCBPblRhZ0JyZWFrKENYRkFfU0FYQ29udGV4dCogcFRhZyk7Ci0gIHZvaWQgT25UYWdEYXRhKENYRkFfU0FYQ29udGV4dCogcFRhZywKLSAgICAgICAgICAgICAgICAgQ0ZYX1NBWEl0ZW06OlR5cGUgZVR5cGUsCi0gICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNEYXRhLAotICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd1N0YXJ0UG9zKTsKLSAgdm9pZCBPblRhZ0Nsb3NlKENYRkFfU0FYQ29udGV4dCogcFRhZywgdWludDMyX3QgZHdFbmRQb3MpOwotICB2b2lkIE9uVGFnRW5kKENYRkFfU0FYQ29udGV4dCogcFRhZywKLSAgICAgICAgICAgICAgICBjb25zdCBDRlhfQnl0ZVN0cmluZ0MmIGJzVGFnTmFtZSwKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0VuZFBvcyk7Ci0KLSAgdm9pZCBPblRhcmdldERhdGEoQ1hGQV9TQVhDb250ZXh0KiBwVGFnLAotICAgICAgICAgICAgICAgICAgICBDRlhfU0FYSXRlbTo6VHlwZSBlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmdDJiBic0RhdGEsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3U3RhcnRQb3MpOwotCi0gcHJvdGVjdGVkOgotICB2b2lkIFVwZGF0ZUNoZWNrc3VtKGJvb2wgYkNoZWNrU3BhY2UpOwotCi0gIENYRkFfQ2hlY2tzdW1Db250ZXh0KiBtX3BDb250ZXh0OwotICBDWEZBX1NBWENvbnRleHQgbV9TQVhDb250ZXh0OwotfTsKLQotY2xhc3MgQ1hGQV9DaGVja3N1bUNvbnRleHQgewotIHB1YmxpYzoKLSAgQ1hGQV9DaGVja3N1bUNvbnRleHQoKTsKLSAgfkNYRkFfQ2hlY2tzdW1Db250ZXh0KCk7Ci0KLSAgdm9pZCBTdGFydENoZWNrc3VtKCk7Ci0gIHZvaWQgVXBkYXRlKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNUZXh0KTsKLSAgYm9vbCBVcGRhdGVDaGVja3N1bShjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwU3JjRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICBGWF9GSUxFU0laRSBvZmZzZXQgPSAwLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplID0gMCk7Ci0gIHZvaWQgRmluaXNoQ2hlY2tzdW0oKTsKLSAgQ0ZYX0J5dGVTdHJpbmcgR2V0Q2hlY2tzdW0oKSBjb25zdDsKLQotIHByb3RlY3RlZDoKLSAgc3RkOjp1bmlxdWVfcHRyPENGWF9TQVhSZWFkZXI+IG1fcFNBWFJlYWRlcjsKLSAgc3RkOjp1bmlxdWVfcHRyPENSWVBUX3NoYTFfY29udGV4dD4gbV9wQnl0ZUNvbnRleHQ7Ci0gIENGWF9CeXRlU3RyaW5nIG1fYnNDaGVja3N1bTsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYRkFfWEZBX0NIRUNLU1VNX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhmYS94ZmFfZmZhcHAuaCBiL3hmYS9meGZhL3hmYV9mZmFwcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTFmZDJkLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL3hmYV9mZmFwcC5oCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEZBX1hGQV9GRkFQUF9IXwotI2RlZmluZSBYRkFfRlhGQV9YRkFfRkZBUFBfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3RyZWFtLmgiCi0jaW5jbHVkZSAiY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N0cmVhbV9hY2MuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2NmeF9yZXRhaW5fcHRyLmgiCi0jaW5jbHVkZSAieGZhL2ZnYXMvZm9udC9jZmdhc19mb250bWdyLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX2FwcC5oIgotI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmEuaCIKLQotY2xhc3MgQ1hGQV9EZWZGb250TWdyOwotY2xhc3MgQ1hGQV9GV0xBZGFwdGVyV2lkZ2V0TWdyOwotY2xhc3MgQ1hGQV9GV0xUaGVtZTsKLWNsYXNzIENYRkFfRkZEb2NIYW5kbGVyOwotY2xhc3MgQ1hGQV9Gb250TWdyOwotY2xhc3MgSUZXTF9BZGFwdGVyVGltZXJNZ3I7Ci1jbGFzcyBDRldMX1dpZGdldE1nckRlbGVnYXRlOwotCi0vLyBMYXllcmluZyBwcmV2ZW50cyBmeGNydCBmcm9tIGtub3dpbmcgYWJvdXQgQ1BERl9TdHJlYW1zOyB0aGlzIGNvdWxkIGdvCi0vLyBpbiBmcGRmc2RrLCBidXQgaXQgaXMgWEZBLU9ubHkuCi1DRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+IE1ha2VTZWVrYWJsZVJlYWRTdHJlYW0oCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q1BERl9TdHJlYW0qPiYgc3RyZWFtcyk7Ci0KLWNsYXNzIENYRkFfRkZBcHAgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ1hGQV9GRkFwcChJWEZBX0FwcFByb3ZpZGVyKiBwUHJvdmlkZXIpOwotICB+Q1hGQV9GRkFwcCgpOwotCi0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZGRG9jPiBDcmVhdGVEb2MoSVhGQV9Eb2NFbnZpcm9ubWVudCogcERvY0Vudmlyb25tZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRG9jdW1lbnQqIHBQREZEb2MpOwotICB2b2lkIFNldERlZmF1bHRGb250TWdyKHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0RlZkZvbnRNZ3I+IHBGb250TWdyKTsKLQotICBDWEZBX0ZGRG9jSGFuZGxlciogR2V0RG9jSGFuZGxlcigpOwotICBDWEZBX0ZXTEFkYXB0ZXJXaWRnZXRNZ3IqIEdldFdpZGdldE1ncihDRldMX1dpZGdldE1nckRlbGVnYXRlKiBwRGVsZWdhdGUpOwotICBDRkdBU19Gb250TWdyKiBHZXRGREVGb250TWdyKCk7Ci0gIENYRkFfRldMVGhlbWUqIEdldEZXTFRoZW1lKCk7Ci0KLSAgSVhGQV9BcHBQcm92aWRlciogR2V0QXBwUHJvdmlkZXIoKSBjb25zdCB7IHJldHVybiBtX3BQcm92aWRlcjsgfQotICBjb25zdCBDRldMX0FwcCogR2V0RldMQXBwKCkgY29uc3QgeyByZXR1cm4gbV9wRldMQXBwLmdldCgpOyB9Ci0gIElGV0xfQWRhcHRlclRpbWVyTWdyKiBHZXRUaW1lck1ncigpIGNvbnN0OwotICBDWEZBX0ZvbnRNZ3IqIEdldFhGQUZvbnRNZ3IoKSBjb25zdDsKLSAgQ0ZXTF9XaWRnZXRNZ3JEZWxlZ2F0ZSogR2V0V2lkZ2V0TWdyRGVsZWdhdGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1fcFdpZGdldE1nckRlbGVnYXRlOwotICB9Ci0KLSAgdm9pZCBDbGVhckV2ZW50VGFyZ2V0cygpOwotCi0gcHJvdGVjdGVkOgotICBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GRkRvY0hhbmRsZXI+IG1fcERvY0hhbmRsZXI7Ci0gIElYRkFfQXBwUHJvdmlkZXIqIGNvbnN0IG1fcFByb3ZpZGVyOwotCi0gIC8vIFRoZSBmb250cyBzdG9yZWQgaW4gdGhlIGZvbnQgbWFuYWdlciBtYXkgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkgdGhlIGRlZmF1bHQKLSAgLy8gZm9udCBtYW5hZ2VyLiBUaGUgR0VGb250OjpMb2FkRm9udCBjYWxsIHRha2VzIHRoZSBtYW5hZ2VyIGFzIGEgcGFyYW0gYW5kCi0gIC8vIHN0b3JlcyBpdCBpbnRlcm5hbGx5LiBXaGVuIHlvdSBkZXN0cm95IHRoZSBHRUZvbnQgaXQgdHJpZXMgdG8gdW5yZWdpc3RlcgotICAvLyBmcm9tIHRoZSBmb250IG1hbmFnZXIgYW5kIGlmIHRoZSBkZWZhdWx0IGZvbnQgbWFuYWdlciB3YXMgZGVzdHJveWVkIGZpcnN0Ci0gIC8vIGdldCBnZXQgYSB1c2UtYWZ0ZXItZnJlZS4gVGhlIG1fcEZXTFRoZW1lIGNhbiB0cnkgdG8gY2xlYW51cCBhIEdFRm9udAotICAvLyB3aGVuIGl0IGZyZWVzLCBzbyBtYWtlIHN1cmUgaXQgZ2V0cyBjbGVhbmVkIHVwIGZpcnN0LiBUaGF0IHJlcXVpcmVzCi0gIC8vIG1fcEZXTEFwcCB0byBiZSBjbGVhbmVkIHVwIGFzIHdlbGwuCi0gIC8vCi0gIC8vIFRPRE8oZHNpbmNsYWlyKTogVGhlIEdFRm9udCBzaG91bGQgaGF2ZSB0aGUgRm9udE1nciBhcyB0aGUgcG9pbnRlciBpbnN0ZWFkCi0gIC8vIG9mIHRoZSBERUZGb250TWdyIHNvIHRoaXMgZ29lcyBhd2F5LiBCdWcgNTYxLgotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZHQVNfRm9udE1ncj4gbV9wRkRFRm9udE1ncjsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRm9udE1ncj4gbV9wRm9udE1ncjsKLQotI2lmIF9GWE1fUExBVEZPUk1fICE9IF9GWE1fUExBVEZPUk1fV0lORE9XU18KLSAgc3RkOjp1bmlxdWVfcHRyPENGWF9Gb250U291cmNlRW51bV9GaWxlPiBtX3BGb250U291cmNlOwotI2VuZGlmCi0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZXTEFkYXB0ZXJXaWRnZXRNZ3I+IG1fcEFkYXB0ZXJXaWRnZXRNZ3I7Ci0gIENGV0xfV2lkZ2V0TWdyRGVsZWdhdGUqIG1fcFdpZGdldE1nckRlbGVnYXRlOyAgLy8gbm90IG93bmVkLgotCi0gIC8vIHxtX3BGV0xBcHB8IGhhcyB0byBiZSByZWxlYXNlZCBmaXJzdCwgdGhlbiB8bV9wRldMVGhlbWV8IHNpbmNlIHRoZSBmb3JtZXIKLSAgLy8gbWF5IHJlZmVycyB0byB0aGVtZSBtYW5hZ2VyIGFuZCB0aGUgbGF0dGVyIHJlZmVycyB0byBmb250IG1hbmFnZXIuCi0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0ZXTFRoZW1lPiBtX3BGV0xUaGVtZTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGV0xfQXBwPiBtX3BGV0xBcHA7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEZBX1hGQV9GRkFQUF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEveGZhX2ZmZG9jLmggYi94ZmEvZnhmYS94ZmFfZmZkb2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQwNzk3MC4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS94ZmFfZmZkb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhGQV9YRkFfRkZET0NfSF8KLSNkZWZpbmUgWEZBX0ZYRkFfWEZBX0ZGRE9DX0hfCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvZnhmYS5oIgotI2luY2x1ZGUgInhmYS9meGZhL3BhcnNlci9jeGZhX2RvY3VtZW50LmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnRfcGFyc2VyLmgiCi0KLWNsYXNzIENYRkFfQ2hlY2tzdW1Db250ZXh0OwotY2xhc3MgQ1hGQV9GRkFwcDsKLWNsYXNzIENYRkFfRkZOb3RpZnk7Ci1jbGFzcyBDWEZBX0ZGRG9jVmlldzsKLQotc3RydWN0IEZYX0lNQUdFRElCX0FORF9EUEkgewotICBDRlhfRElCU291cmNlKiBwRGliU291cmNlOwotICBpbnQzMl90IGlJbWFnZVhEcGk7Ci0gIGludDMyX3QgaUltYWdlWURwaTsKLX07Ci0KLWNsYXNzIENYRkFfRkZEb2MgewotIHB1YmxpYzoKLSAgQ1hGQV9GRkRvYyhDWEZBX0ZGQXBwKiBwQXBwLCBJWEZBX0RvY0Vudmlyb25tZW50KiBwRG9jRW52aXJvbm1lbnQpOwotICB+Q1hGQV9GRkRvYygpOwotCi0gIElYRkFfRG9jRW52aXJvbm1lbnQqIEdldERvY0Vudmlyb25tZW50KCkgY29uc3QgeyByZXR1cm4gbV9wRG9jRW52aXJvbm1lbnQ7IH0KLSAgdWludDMyX3QgR2V0RG9jVHlwZSgpOwotICB2b2lkIFNldERvY1R5cGUodWludDMyX3QgZHdUeXBlKTsKLQotICBpbnQzMl90IFN0YXJ0TG9hZCgpOwotICBpbnQzMl90IERvTG9hZChJRlhfUGF1c2UqIHBQYXVzZSA9IG51bGxwdHIpOwotICB2b2lkIFN0b3BMb2FkKCk7Ci0KLSAgQ1hGQV9GRkRvY1ZpZXcqIENyZWF0ZURvY1ZpZXcodWludDMyX3QgZHdWaWV3ID0gMCk7Ci0KLSAgYm9vbCBPcGVuRG9jKGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBTdHJlYW0pOwotICBib29sIE9wZW5Eb2MoQ1BERl9Eb2N1bWVudCogcFBERkRvYyk7Ci0gIGJvb2wgQ2xvc2VEb2MoKTsKLQotICBDWEZBX0RvY3VtZW50KiBHZXRYRkFEb2MoKSB7IHJldHVybiBtX3BEb2N1bWVudFBhcnNlci0+R2V0RG9jdW1lbnQoKTsgfQotICBDWEZBX0ZGQXBwKiBHZXRBcHAoKSB7IHJldHVybiBtX3BBcHA7IH0KLSAgQ1hGQV9GRkRvY1ZpZXcqIEdldERvY1ZpZXcoQ1hGQV9MYXlvdXRQcm9jZXNzb3IqIHBMYXlvdXQpOwotICBDWEZBX0ZGRG9jVmlldyogR2V0RG9jVmlldygpOwotICBDUERGX0RvY3VtZW50KiBHZXRQREZEb2MoKTsKLSAgQ0ZYX0RJQml0bWFwKiBHZXRQREZOYW1lZEltYWdlKGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCYgaUltYWdlWERwaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QmIGlJbWFnZVlEcGkpOwotCi0gIGJvb2wgU2F2ZVBhY2thZ2UoWEZBX0hhc2hDb2RlIGNvZGUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVXcml0ZVN0cmVhbT4mIHBGaWxlLAotICAgICAgICAgICAgICAgICAgIENYRkFfQ2hlY2tzdW1Db250ZXh0KiBwQ1NDb250ZXh0KTsKLSAgYm9vbCBJbXBvcnREYXRhKGNvbnN0IENGWF9SZXRhaW5QdHI8SUZYX1NlZWthYmxlUmVhZFN0cmVhbT4mIHBTdHJlYW0sCi0gICAgICAgICAgICAgICAgICBib29sIGJYRFAgPSB0cnVlKTsKLQotIHByb3RlY3RlZDoKLSAgSVhGQV9Eb2NFbnZpcm9ubWVudCogY29uc3QgbV9wRG9jRW52aXJvbm1lbnQ7Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0RvY3VtZW50UGFyc2VyPiBtX3BEb2N1bWVudFBhcnNlcjsKLSAgQ0ZYX1JldGFpblB0cjxJRlhfU2Vla2FibGVSZWFkU3RyZWFtPiBtX3BTdHJlYW07Ci0gIENYRkFfRkZBcHAqIG1fcEFwcDsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRkZOb3RpZnk+IG1fcE5vdGlmeTsKLSAgQ1BERl9Eb2N1bWVudCogbV9wUERGRG9jOwotICBzdGQ6Om1hcDx1aW50MzJfdCwgRlhfSU1BR0VESUJfQU5EX0RQST4gbV9IYXNoVG9EaWJEcGlNYXA7Ci0gIHN0ZDo6bWFwPHVpbnQzMl90LCBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9GRkRvY1ZpZXc+PiBtX1R5cGVUb0RvY1ZpZXdNYXA7Ci0gIHVpbnQzMl90IG1fZHdEb2NUeXBlOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhGQV9YRkFfRkZET0NfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3hmYV9mZmRvY2hhbmRsZXIuaCBiL3hmYS9meGZhL3hmYV9mZmRvY2hhbmRsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU0ZjcxNy4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS94ZmFfZmZkb2NoYW5kbGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYRkFfWEZBX0ZGRE9DSEFORExFUl9IXwotI2RlZmluZSBYRkFfRlhGQV9YRkFfRkZET0NIQU5ETEVSX0hfCi0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9meGZhLmgiCi0KLWNsYXNzIENYRkFfQ2hlY2tzdW1Db250ZXh0OwotCi1jbGFzcyBDWEZBX0ZGRG9jSGFuZGxlciB7Ci0gcHVibGljOgotICBDWEZBX0ZGRG9jSGFuZGxlcigpOwotICB+Q1hGQV9GRkRvY0hhbmRsZXIoKTsKLQotICBDRlhKU0VfVmFsdWUqIEdldFhGQVNjcmlwdE9iamVjdChDWEZBX0ZGRG9jKiBoRG9jKTsKLSAgWEZBX0FUVFJJQlVURUVOVU0gR2V0UmVzdG9yZVN0YXRlKENYRkFfRkZEb2MqIGhEb2MpOwotCi0gIGJvb2wgUnVuRG9jU2NyaXB0KENYRkFfRkZEb2MqIGhEb2MsCi0gICAgICAgICAgICAgICAgICAgIFhGQV9TQ1JJUFRUWVBFIGVTY3JpcHRUeXBlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzU2NyaXB0LAotICAgICAgICAgICAgICAgICAgICBDRlhKU0VfVmFsdWUqIHBSZXRWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYSlNFX1ZhbHVlKiBwVGhpc09iamVjdCk7Ci0KLSBwcm90ZWN0ZWQ6Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEZBX1hGQV9GRkRPQ0hBTkRMRVJfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3hmYV9mZmRvY3ZpZXcuaCBiL3hmYS9meGZhL3hmYV9mZmRvY3ZpZXcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkZjhiNC4uMDAwMDAwMAotLS0gYS94ZmEvZnhmYS94ZmFfZmZkb2N2aWV3LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEZBX1hGQV9GRkRPQ1ZJRVdfSF8KLSNkZWZpbmUgWEZBX0ZYRkFfWEZBX0ZGRE9DVklFV19IXwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS94ZmFfZmZkb2MuaCIKLQotY2xhc3MgQ1hGQV9GRldpZGdldEhhbmRsZXI7Ci1jbGFzcyBDWEZBX0ZGRG9jOwotY2xhc3MgQ1hGQV9GRldpZGdldDsKLWNsYXNzIENYRkFfV2lkZ2V0QWNjSXRlcmF0b3I7Ci0KLWV4dGVybiBjb25zdCBYRkFfQVRUUklCVVRFRU5VTSBnc19FdmVudEFjdGl2aXR5W107Ci1lbnVtIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVUyB7Ci0gIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19Ob25lLAotICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfU3RhcnQsCi0gIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19Gb3JtSW5pdGlhbGl6ZSwKLSAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0Zvcm1Jbml0Q2FsY3VsYXRlLAotICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRm9ybUluaXRWYWxpZGF0ZSwKLSAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0Zvcm1Gb3JtUmVhZHksCi0gIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19Eb2luZywKLSAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX1BhZ2VzZXRJbml0aWFsaXplLAotICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfUGFnZXNldEluaXRDYWxjdWxhdGUsCi0gIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19QYWdlc2V0SW5pdFZhbGlkYXRlLAotICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfUGFnZXNldEZvcm1SZWFkeSwKLSAgWEZBX0RPQ1ZJRVdfTEFZT1VUU1RBVFVTX0xheW91dFJlYWR5LAotICBYRkFfRE9DVklFV19MQVlPVVRTVEFUVVNfRG9jUmVhZHksCi0gIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVU19FbmQKLX07Ci1jbGFzcyBDWEZBX0ZGRG9jVmlldyB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDWEZBX0ZGRG9jVmlldyhDWEZBX0ZGRG9jKiBwRG9jKTsKLSAgfkNYRkFfRkZEb2NWaWV3KCk7Ci0KLSAgQ1hGQV9GRkRvYyogR2V0RG9jKCkgeyByZXR1cm4gbV9wRG9jOyB9Ci0gIGludDMyX3QgU3RhcnRMYXlvdXQoaW50MzJfdCBpU3RhcnRQYWdlID0gMCk7Ci0gIGludDMyX3QgRG9MYXlvdXQoSUZYX1BhdXNlKiBwUGF1c2UpOwotICB2b2lkIFN0b3BMYXlvdXQoKTsKLSAgaW50MzJfdCBHZXRMYXlvdXRTdGF0dXMoKTsKLSAgdm9pZCBVcGRhdGVEb2NWaWV3KCk7Ci0gIGludDMyX3QgQ291bnRQYWdlVmlld3MoKTsKLSAgQ1hGQV9GRlBhZ2VWaWV3KiBHZXRQYWdlVmlldyhpbnQzMl90IG5JbmRleCk7Ci0KLSAgdm9pZCBSZXNldFdpZGdldERhdGEoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpOwotICBpbnQzMl90IFByb2Nlc3NXaWRnZXRFdmVudChDWEZBX0V2ZW50UGFyYW0qIHBQYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpOwotICBDWEZBX0ZGV2lkZ2V0SGFuZGxlciogR2V0V2lkZ2V0SGFuZGxlcigpOwotICBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yKiBDcmVhdGVXaWRnZXRBY2NJdGVyYXRvcigKLSAgICAgIFhGQV9XSURHRVRPUkRFUiBlT3JkZXIgPSBYRkFfV0lER0VUT1JERVJfUHJlT3JkZXIpOwotICBDWEZBX0ZGV2lkZ2V0KiBHZXRGb2N1c1dpZGdldCgpOwotICB2b2lkIEtpbGxGb2N1cygpOwotICBib29sIFNldEZvY3VzKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQpOwotICBDWEZBX0ZGV2lkZ2V0KiBHZXRXaWRnZXRCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfRkZXaWRnZXQqIHBSZWZXaWRnZXQpOwotICBDWEZBX1dpZGdldEFjYyogR2V0V2lkZ2V0QWNjQnlOYW1lKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9XaWRnZXRBY2MqIHBSZWZXaWRnZXRBY2MpOwotICBDWEZBX0xheW91dFByb2Nlc3NvciogR2V0WEZBTGF5b3V0KCkgY29uc3Q7Ci0gIHZvaWQgT25QYWdlRXZlbnQoQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtKiBwU2VuZGVyLCB1aW50MzJfdCBkd0V2ZW50KTsKLSAgdm9pZCBMb2NrVXBkYXRlKCk7Ci0gIHZvaWQgVW5sb2NrVXBkYXRlKCk7Ci0gIGJvb2wgSXNVcGRhdGVMb2NrZWQoKTsKLSAgdm9pZCBDbGVhckludmFsaWRhdGVMaXN0KCk7Ci0gIHZvaWQgQWRkSW52YWxpZGF0ZVJlY3QoQ1hGQV9GRldpZGdldCogcFdpZGdldCwgY29uc3QgQ0ZYX1JlY3RGJiBydEludmFsaWRhdGUpOwotICB2b2lkIEFkZEludmFsaWRhdGVSZWN0KENYRkFfRkZQYWdlVmlldyogcFBhZ2VWaWV3LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9SZWN0RiYgcnRJbnZhbGlkYXRlKTsKLSAgdm9pZCBSdW5JbnZhbGlkYXRlKCk7Ci0gIHZvaWQgUnVuRG9jQ2xvc2UoKTsKLSAgdm9pZCBEZXN0cm95RG9jVmlldygpOwotCi0gIGJvb2wgSW5pdFZhbGlkYXRlKENYRkFfTm9kZSogcE5vZGUpOwotICBib29sIFJ1blZhbGlkYXRlKCk7Ci0KLSAgdm9pZCBTZXRDaGFuZ2VNYXJrKCk7Ci0KLSAgdm9pZCBBZGRWYWxpZGF0ZVdpZGdldChDWEZBX1dpZGdldEFjYyogcFdpZGdldCk7Ci0gIHZvaWQgQWRkQ2FsY3VsYXRlTm9kZU5vdGlmeShDWEZBX05vZGUqIHBOb2RlQ2hhbmdlKTsKLSAgdm9pZCBBZGRDYWxjdWxhdGVXaWRnZXRBY2MoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MpOwotICBpbnQzMl90IFJ1bkNhbGN1bGF0ZVdpZGdldHMoKTsKLSAgYm9vbCBJc1N0YXRpY05vdGlmeSgpOwotICBib29sIFJ1bkxheW91dCgpOwotICB2b2lkIFJ1blN1YmZvcm1JbmRleENoYW5nZSgpOwotICB2b2lkIEFkZE5ld0Zvcm1Ob2RlKENYRkFfTm9kZSogcE5vZGUpOwotICB2b2lkIEFkZEluZGV4Q2hhbmdlZFN1YmZvcm0oQ1hGQV9Ob2RlKiBwTm9kZSk7Ci0gIENYRkFfV2lkZ2V0QWNjKiBHZXRGb2N1c1dpZGdldEFjYygpOwotICB2b2lkIFNldEZvY3VzV2lkZ2V0QWNjKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjKTsKLSAgdm9pZCBEZWxldGVMYXlvdXRJdGVtKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQpOwotICBpbnQzMl90IEV4ZWNFdmVudEFjdGl2aXR5QnlEZWVwRmlyc3QoQ1hGQV9Ob2RlKiBwRm9ybU5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfRVZFTlRUWVBFIGVFdmVudFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJJc0Zvcm1SZWFkeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlJlY3Vyc2l2ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEV4Y2x1ZGUpOwotICBib29sIG1fYkxheW91dEV2ZW50OwotICBzdGQ6OnZlY3RvcjxDRlhfV2lkZVN0cmluZz4gbV9hcnJOdWxsVGVzdE1zZzsKLSAgQ1hGQV9GRldpZGdldCogbV9wTGlzdEZvY3VzV2lkZ2V0OwotICBib29sIG1fYkluTGF5b3V0U3RhdHVzOwotCi0gcHJvdGVjdGVkOgotICBib29sIFJ1bkV2ZW50TGF5b3V0UmVhZHkoKTsKLSAgdm9pZCBSdW5CaW5kSXRlbXMoKTsKLSAgYm9vbCBJbml0Q2FsY3VsYXRlKENYRkFfTm9kZSogcE5vZGUpOwotICB2b2lkIEluaXRMYXlvdXQoQ1hGQV9Ob2RlKiBwTm9kZSk7Ci0gIHZvaWQgUnVuQ2FsY3VsYXRlUmVjdXJzaXZlKGludDMyX3QmIGlJbmRleCk7Ci0gIHZvaWQgU2hvd051bGxUZXN0TXNnKCk7Ci0gIGJvb2wgUmVzZXRTaW5nbGVXaWRnZXRBY2NEYXRhKENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjKTsKLSAgQ1hGQV9Ob2RlKiBHZXRSb290U3ViZm9ybSgpOwotCi0gIENYRkFfRkZEb2MqIGNvbnN0IG1fcERvYzsKLSAgc3RkOjp1bmlxdWVfcHRyPENYRkFfRkZXaWRnZXRIYW5kbGVyPiBtX3BXaWRnZXRIYW5kbGVyOwotICBDWEZBX0xheW91dFByb2Nlc3NvciogbV9wWEZBRG9jTGF5b3V0OyAgLy8gbm90IG93bmVkLgotICBDWEZBX1dpZGdldEFjYyogbV9wRm9jdXNBY2M7ICAgICAgICAgICAgLy8gbm90IG93bmVkLgotICBDWEZBX0ZGV2lkZ2V0KiBtX3BGb2N1c1dpZGdldDsgICAgICAgICAgLy8gbm90IG93bmVkLgotICBDWEZBX0ZGV2lkZ2V0KiBtX3BPbGRGb2N1c1dpZGdldDsgICAgICAgLy8gbm90IG93bmVkLgotICBzdGQ6Om1hcDxDWEZBX0ZGUGFnZVZpZXcqLCBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX1JlY3RGPj4gbV9tYXBQYWdlSW52YWxpZGF0ZTsKLSAgc3RkOjp2ZWN0b3I8Q1hGQV9XaWRnZXRBY2MqPiBtX1ZhbGlkYXRlQWNjczsKLSAgc3RkOjp2ZWN0b3I8Q1hGQV9XaWRnZXRBY2MqPiBtX0NhbGN1bGF0ZUFjY3M7Ci0gIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+IG1fQmluZEl0ZW1zOwotICBzdGQ6OnZlY3RvcjxDWEZBX05vZGUqPiBtX05ld0FkZGVkTm9kZXM7Ci0gIHN0ZDo6dmVjdG9yPENYRkFfTm9kZSo+IG1fSW5kZXhDaGFuZ2VkU3ViZm9ybXM7Ci0gIFhGQV9ET0NWSUVXX0xBWU9VVFNUQVRVUyBtX2lTdGF0dXM7Ci0gIGludDMyX3QgbV9pTG9jazsKLSAgZnJpZW5kIGNsYXNzIENYRkFfRkZOb3RpZnk7Ci19OwotCi1jbGFzcyBDWEZBX1dpZGdldEFjY0l0ZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIENYRkFfV2lkZ2V0QWNjSXRlcmF0b3IoQ1hGQV9GRkRvY1ZpZXcqIHBEb2NWaWV3LCBDWEZBX05vZGUqIHBUcmF2ZWxSb290KTsKLSAgfkNYRkFfV2lkZ2V0QWNjSXRlcmF0b3IoKTsKLQotICB2b2lkIFJlc2V0KCk7Ci0gIENYRkFfV2lkZ2V0QWNjKiBNb3ZlVG9GaXJzdCgpOwotICBDWEZBX1dpZGdldEFjYyogTW92ZVRvTGFzdCgpOwotICBDWEZBX1dpZGdldEFjYyogTW92ZVRvTmV4dCgpOwotICBDWEZBX1dpZGdldEFjYyogTW92ZVRvUHJldmlvdXMoKTsKLSAgQ1hGQV9XaWRnZXRBY2MqIEdldEN1cnJlbnRXaWRnZXRBY2MoKTsKLSAgYm9vbCBTZXRDdXJyZW50V2lkZ2V0QWNjKENYRkFfV2lkZ2V0QWNjKiBoV2lkZ2V0KTsKLSAgdm9pZCBTa2lwVHJlZSgpOwotCi0gcHJvdGVjdGVkOgotICBDWEZBX0NvbnRhaW5lckl0ZXJhdG9yIG1fQ29udGVudEl0ZXJhdG9yOwotICBDWEZBX0ZGRG9jVmlldyogY29uc3QgbV9wRG9jVmlldzsKLSAgQ1hGQV9XaWRnZXRBY2MqIG1fcEN1cldpZGdldEFjYzsgIC8vIG5vdCBvd25lZC4KLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYRkFfWEZBX0ZGRE9DVklFV19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEveGZhX2ZmcGFnZXZpZXcuaCBiL3hmYS9meGZhL3hmYV9mZnBhZ2V2aWV3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNTBhMjMuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEveGZhX2ZmcGFnZXZpZXcuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vLyBDb3B5cmlnIDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEZBX1hGQV9GRlBBR0VWSUVXX0hfCi0jZGVmaW5lIFhGQV9GWEZBX1hGQV9GRlBBR0VWSUVXX0hfCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb250YWluZXJsYXlvdXRpdGVtLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfY29udGVudGxheW91dGl0ZW0uaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV90cmF2ZXJzZXN0cmF0ZWd5X2xheW91dGl0ZW0uaCIKLQotY2xhc3MgQ1hGQV9GRldpZGdldDsKLWNsYXNzIENYRkFfRkZEb2NWaWV3OwotCi1jbGFzcyBDWEZBX0ZGUGFnZVZpZXcgOiBwdWJsaWMgQ1hGQV9Db250YWluZXJMYXlvdXRJdGVtIHsKLSBwdWJsaWM6Ci0gIENYRkFfRkZQYWdlVmlldyhDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcsIENYRkFfTm9kZSogcFBhZ2VBcmVhKTsKLSAgfkNYRkFfRkZQYWdlVmlldygpIG92ZXJyaWRlOwotCi0gIENYRkFfRkZEb2NWaWV3KiBHZXREb2NWaWV3KCkgY29uc3Q7Ci0gIENGWF9SZWN0RiBHZXRQYWdlVmlld1JlY3QoKSBjb25zdDsKLSAgQ0ZYX01hdHJpeCBHZXREaXNwbGF5TWF0cml4KGNvbnN0IENGWF9SZWN0JiBydERpc3AsIGludDMyX3QgaVJvdGF0ZSkgY29uc3Q7Ci0gIElYRkFfV2lkZ2V0SXRlcmF0b3IqIENyZWF0ZVdpZGdldEl0ZXJhdG9yKAotICAgICAgdWludDMyX3QgZHdUcmF2ZXJzZVdheSA9IFhGQV9UUkFWRVJTRVdBWV9Gb3JtLAotICAgICAgdWludDMyX3QgZHdXaWRnZXRGaWx0ZXIgPSBYRkFfV2lkZ2V0U3RhdHVzX1Zpc2libGUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYRkFfV2lkZ2V0U3RhdHVzX1ZpZXdhYmxlKTsKLQotIHByb3RlY3RlZDoKLSAgQ1hGQV9GRkRvY1ZpZXcqIGNvbnN0IG1fcERvY1ZpZXc7Ci19OwotCi10eXBlZGVmIENYRkFfTm9kZUl0ZXJhdG9yVGVtcGxhdGU8Q1hGQV9MYXlvdXRJdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfVHJhdmVyc2VTdHJhdGVneV9MYXlvdXRJdGVtPgotICAgIENYRkFfTGF5b3V0SXRlbUl0ZXJhdG9yOwotCi1jbGFzcyBDWEZBX0ZGUGFnZVdpZGdldEl0ZXJhdG9yIDogcHVibGljIElYRkFfV2lkZ2V0SXRlcmF0b3IgewotIHB1YmxpYzoKLSAgQ1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcihDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywgdWludDMyX3QgZHdGaWx0ZXIpOwotICB+Q1hGQV9GRlBhZ2VXaWRnZXRJdGVyYXRvcigpIG92ZXJyaWRlOwotCi0gIHZvaWQgUmVzZXQoKSBvdmVycmlkZTsKLSAgQ1hGQV9GRldpZGdldCogTW92ZVRvRmlyc3QoKSBvdmVycmlkZTsKLSAgQ1hGQV9GRldpZGdldCogTW92ZVRvTGFzdCgpIG92ZXJyaWRlOwotICBDWEZBX0ZGV2lkZ2V0KiBNb3ZlVG9OZXh0KCkgb3ZlcnJpZGU7Ci0gIENYRkFfRkZXaWRnZXQqIE1vdmVUb1ByZXZpb3VzKCkgb3ZlcnJpZGU7Ci0gIENYRkFfRkZXaWRnZXQqIEdldEN1cnJlbnRXaWRnZXQoKSBvdmVycmlkZTsKLSAgYm9vbCBTZXRDdXJyZW50V2lkZ2V0KENYRkFfRkZXaWRnZXQqIGhXaWRnZXQpIG92ZXJyaWRlOwotCi0gcHJvdGVjdGVkOgotICBDWEZBX0ZGV2lkZ2V0KiBHZXRXaWRnZXQoQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSk7Ci0KLSAgQ1hGQV9GRlBhZ2VWaWV3KiBtX3BQYWdlVmlldzsKLSAgQ1hGQV9GRldpZGdldCogbV9oQ3VyV2lkZ2V0OwotICB1aW50MzJfdCBtX2R3RmlsdGVyOwotICBib29sIG1fYklnbm9yZXJlbGV2YW50OwotICBDWEZBX0xheW91dEl0ZW1JdGVyYXRvciBtX3NJdGVyYXRvcjsKLX07Ci0KLWNsYXNzIENYRkFfVGFiUGFyYW0gewotIHB1YmxpYzoKLSAgQ1hGQV9UYWJQYXJhbSgpOwotICB+Q1hGQV9UYWJQYXJhbSgpOwotCi0gIENYRkFfRkZXaWRnZXQqIG1fcFdpZGdldDsKLSAgc3RkOjp2ZWN0b3I8Q1hGQV9GRldpZGdldCo+IG1fQ2hpbGRyZW47Ci19OwotCi1jbGFzcyBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3IgOiBwdWJsaWMgSVhGQV9XaWRnZXRJdGVyYXRvciB7Ci0gcHVibGljOgotICBDWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3IoQ1hGQV9GRlBhZ2VWaWV3KiBwUGFnZVZpZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZpbHRlcik7Ci0gIH5DWEZBX0ZGVGFiT3JkZXJQYWdlV2lkZ2V0SXRlcmF0b3IoKSBvdmVycmlkZTsKLQotICB2b2lkIFJlc2V0KCkgb3ZlcnJpZGU7Ci0gIENYRkFfRkZXaWRnZXQqIE1vdmVUb0ZpcnN0KCkgb3ZlcnJpZGU7Ci0gIENYRkFfRkZXaWRnZXQqIE1vdmVUb0xhc3QoKSBvdmVycmlkZTsKLSAgQ1hGQV9GRldpZGdldCogTW92ZVRvTmV4dCgpIG92ZXJyaWRlOwotICBDWEZBX0ZGV2lkZ2V0KiBNb3ZlVG9QcmV2aW91cygpIG92ZXJyaWRlOwotICBDWEZBX0ZGV2lkZ2V0KiBHZXRDdXJyZW50V2lkZ2V0KCkgb3ZlcnJpZGU7Ci0gIGJvb2wgU2V0Q3VycmVudFdpZGdldChDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0KSBvdmVycmlkZTsKLQotIHByb3RlY3RlZDoKLSAgQ1hGQV9GRldpZGdldCogR2V0VHJhdmVyc2VXaWRnZXQoQ1hGQV9GRldpZGdldCogcFdpZGdldCk7Ci0gIENYRkFfRkZXaWRnZXQqIEZpbmRXaWRnZXRCeU5hbWUoY29uc3QgQ0ZYX1dpZGVTdHJpbmcmIHdzV2lkZ2V0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZGV2lkZ2V0KiBwUmVmV2lkZ2V0KTsKLSAgdm9pZCBDcmVhdGVUYWJPcmRlcldpZGdldEFycmF5KCk7Ci0gIHZvaWQgQ3JlYXRlU3BhY2VPcmRlcldpZGdldEFycmF5KHN0ZDo6dmVjdG9yPENYRkFfRkZXaWRnZXQqPiogV2lkZ2V0QXJyYXkpOwotICBDWEZBX0ZGV2lkZ2V0KiBHZXRXaWRnZXQoQ1hGQV9MYXlvdXRJdGVtKiBwTGF5b3V0SXRlbSk7Ci0gIHZvaWQgT3JkZXJDb250YWluZXIoQ1hGQV9MYXlvdXRJdGVtSXRlcmF0b3IqIHNJdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICBDWEZBX0xheW91dEl0ZW0qIHBDb250YWluZXJJdGVtLAotICAgICAgICAgICAgICAgICAgICAgIENYRkFfVGFiUGFyYW0qIHBDb250YWluZXIsCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCYgYkN1cnJlbnRJdGVtLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wmIGJDb250ZW50QXJlYSwKLSAgICAgICAgICAgICAgICAgICAgICBib29sIGJNYXJzdGVyUGFnZSA9IGZhbHNlKTsKLQotICBzdGQ6OnZlY3RvcjxDWEZBX0ZGV2lkZ2V0Kj4gbV9UYWJPcmRlcldpZGdldEFycmF5OwotICBDWEZBX0ZGUGFnZVZpZXcqIG1fcFBhZ2VWaWV3OwotICB1aW50MzJfdCBtX2R3RmlsdGVyOwotICBpbnQzMl90IG1faUN1cldpZGdldDsKLSAgYm9vbCBtX2JJZ25vcmVyZWxldmFudDsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYRkFfWEZBX0ZGUEFHRVZJRVdfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGZhL3hmYV9mZndpZGdldC5oIGIveGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NzJiOGEuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEZBX1hGQV9GRldJREdFVF9IXwotI2RlZmluZSBYRkFfRlhGQV9YRkFfRkZXSURHRVRfSF8KLQotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImNvcmUvZnhjb2RlYy9meF9jb2RlY19kZWYuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dyYXBoc3RhdGVkYXRhLmgiCi0jaW5jbHVkZSAieGZhL2Z3bC9jZndsX2FwcC5oIgotI2luY2x1ZGUgInhmYS9meGZhL2Z4ZmEuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9wYXJzZXIvY3hmYV9jb250ZW50bGF5b3V0aXRlbS5oIgotCi1jbGFzcyBDWEZBX0ZGUGFnZVZpZXc7Ci1jbGFzcyBDWEZBX0ZGRG9jVmlldzsKLWNsYXNzIENYRkFfRkZEb2M7Ci1jbGFzcyBDWEZBX0ZGQXBwOwotZW51bSBjbGFzcyBGV0xfV2lkZ2V0SGl0OwotCi1pbmxpbmUgRlhfRkxPQVQgWEZBX1VuaXRQeDJQdChGWF9GTE9BVCBmUHgsIEZYX0ZMT0FUIGZEcGkpIHsKLSAgcmV0dXJuIGZQeCAqIDcyLjBmIC8gZkRwaTsKLX0KLQotI2RlZmluZSBYRkFfRkxPQVRfUEVSQ0lTSU9OIDAuMDAxZgotCi1lbnVtIFhGQV9XSURHRVRJVEVNIHsKLSAgWEZBX1dJREdFVElURU1fUGFyZW50LAotICBYRkFfV0lER0VUSVRFTV9GaXJzdENoaWxkLAotICBYRkFfV0lER0VUSVRFTV9OZXh0U2libGluZywKLSAgWEZBX1dJREdFVElURU1fUHJldlNpYmxpbmcsCi19OwotCi1jbGFzcyBDWEZBX0NhbGNEYXRhIHsKLSBwdWJsaWM6Ci0gIENYRkFfQ2FsY0RhdGEoKTsKLSAgfkNYRkFfQ2FsY0RhdGEoKTsKLQotICBzdGQ6OnZlY3RvcjxDWEZBX1dpZGdldEFjYyo+IG1fR2xvYmFsczsKLSAgaW50MzJfdCBtX2lSZWZDb3VudDsKLX07Ci0KLWNsYXNzIENYRkFfRkZXaWRnZXQgOiBwdWJsaWMgQ1hGQV9Db250ZW50TGF5b3V0SXRlbSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBDWEZBX0ZGV2lkZ2V0KENYRkFfV2lkZ2V0QWNjKiBwRGF0YUFjYyk7Ci0gIH5DWEZBX0ZGV2lkZ2V0KCkgb3ZlcnJpZGU7Ci0KLSAgdmlydHVhbCBDRlhfUmVjdEYgR2V0QkJveCh1aW50MzJfdCBkd1N0YXR1cywgYm9vbCBiRHJhd0ZvY3VzID0gZmFsc2UpOwotICB2aXJ0dWFsIHZvaWQgUmVuZGVyV2lkZ2V0KENGWF9HcmFwaGljcyogcEdTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdTdGF0dXMpOwotICB2aXJ0dWFsIGJvb2wgSXNMb2FkZWQoKTsKLSAgdmlydHVhbCBib29sIExvYWRXaWRnZXQoKTsKLSAgdmlydHVhbCB2b2lkIFVubG9hZFdpZGdldCgpOwotICB2aXJ0dWFsIGJvb2wgUGVyZm9ybUxheW91dCgpOwotICB2aXJ0dWFsIGJvb2wgVXBkYXRlRldMRGF0YSgpOwotICB2aXJ0dWFsIHZvaWQgVXBkYXRlV2lkZ2V0UHJvcGVydHkoKTsKLSAgdmlydHVhbCBib29sIE9uTW91c2VFbnRlcigpOwotICB2aXJ0dWFsIGJvb2wgT25Nb3VzZUV4aXQoKTsKLSAgdmlydHVhbCBib29sIE9uTEJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOwotICB2aXJ0dWFsIGJvb2wgT25MQnV0dG9uVXAodWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOwotICB2aXJ0dWFsIGJvb2wgT25MQnV0dG9uRGJsQ2xrKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKLSAgdmlydHVhbCBib29sIE9uTW91c2VNb3ZlKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKLSAgdmlydHVhbCBib29sIE9uTW91c2VXaGVlbCh1aW50MzJfdCBkd0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgekRlbHRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKLSAgdmlydHVhbCBib29sIE9uUkJ1dHRvbkRvd24odWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOwotICB2aXJ0dWFsIGJvb2wgT25SQnV0dG9uVXAodWludDMyX3QgZHdGbGFncywgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOwotICB2aXJ0dWFsIGJvb2wgT25SQnV0dG9uRGJsQ2xrKHVpbnQzMl90IGR3RmxhZ3MsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKLQotICB2aXJ0dWFsIGJvb2wgT25TZXRGb2N1cyhDWEZBX0ZGV2lkZ2V0KiBwT2xkV2lkZ2V0KTsKLSAgdmlydHVhbCBib29sIE9uS2lsbEZvY3VzKENYRkFfRkZXaWRnZXQqIHBOZXdXaWRnZXQpOwotICB2aXJ0dWFsIGJvb2wgT25LZXlEb3duKHVpbnQzMl90IGR3S2V5Q29kZSwgdWludDMyX3QgZHdGbGFncyk7Ci0gIHZpcnR1YWwgYm9vbCBPbktleVVwKHVpbnQzMl90IGR3S2V5Q29kZSwgdWludDMyX3QgZHdGbGFncyk7Ci0gIHZpcnR1YWwgYm9vbCBPbkNoYXIodWludDMyX3QgZHdDaGFyLCB1aW50MzJfdCBkd0ZsYWdzKTsKLSAgdmlydHVhbCBGV0xfV2lkZ2V0SGl0IE9uSGl0VGVzdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7Ci0gIHZpcnR1YWwgYm9vbCBPblNldEN1cnNvcihjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7Ci0gIHZpcnR1YWwgYm9vbCBDYW5VbmRvKCk7Ci0gIHZpcnR1YWwgYm9vbCBDYW5SZWRvKCk7Ci0gIHZpcnR1YWwgYm9vbCBVbmRvKCk7Ci0gIHZpcnR1YWwgYm9vbCBSZWRvKCk7Ci0gIHZpcnR1YWwgYm9vbCBDYW5Db3B5KCk7Ci0gIHZpcnR1YWwgYm9vbCBDYW5DdXQoKTsKLSAgdmlydHVhbCBib29sIENhblBhc3RlKCk7Ci0gIHZpcnR1YWwgYm9vbCBDYW5TZWxlY3RBbGwoKTsKLSAgdmlydHVhbCBib29sIENhbkRlbGV0ZSgpOwotICB2aXJ0dWFsIGJvb2wgQ2FuRGVTZWxlY3QoKTsKLSAgdmlydHVhbCBib29sIENvcHkoQ0ZYX1dpZGVTdHJpbmcmIHdzQ29weSk7Ci0gIHZpcnR1YWwgYm9vbCBDdXQoQ0ZYX1dpZGVTdHJpbmcmIHdzQ3V0KTsKLSAgdmlydHVhbCBib29sIFBhc3RlKGNvbnN0IENGWF9XaWRlU3RyaW5nJiB3c1Bhc3RlKTsKLSAgdmlydHVhbCB2b2lkIFNlbGVjdEFsbCgpOwotICB2aXJ0dWFsIHZvaWQgRGVsZXRlKCk7Ci0gIHZpcnR1YWwgdm9pZCBEZVNlbGVjdCgpOwotICB2aXJ0dWFsIGJvb2wgR2V0U3VnZ2VzdFdvcmRzKENGWF9Qb2ludEYgcG9pbnRmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENGWF9CeXRlU3RyaW5nPiYgc1N1Z2dlc3QpOwotICB2aXJ0dWFsIGJvb2wgUmVwbGFjZVNwZWxsQ2hlY2tXb3JkKENGWF9Qb2ludEYgcG9pbnRmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNSZXBsYWNlKTsKLQotICBDWEZBX0ZGUGFnZVZpZXcqIEdldFBhZ2VWaWV3KCkgY29uc3QgeyByZXR1cm4gbV9wUGFnZVZpZXc7IH0KLSAgdm9pZCBTZXRQYWdlVmlldyhDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldykgeyBtX3BQYWdlVmlldyA9IHBQYWdlVmlldzsgfQotICBDRlhfUmVjdEYgR2V0V2lkZ2V0UmVjdCgpOwotICBDRlhfUmVjdEYgUmVjYWNoZVdpZGdldFJlY3QoKTsKLSAgdWludDMyX3QgR2V0U3RhdHVzKCk7Ci0gIHZvaWQgTW9kaWZ5U3RhdHVzKHVpbnQzMl90IGR3QWRkZWQsIHVpbnQzMl90IGR3UmVtb3ZlZCk7Ci0KLSAgQ1hGQV9XaWRnZXRBY2MqIEdldERhdGFBY2MoKTsKLSAgYm9vbCBHZXRUb29sVGlwKENGWF9XaWRlU3RyaW5nJiB3c1Rvb2xUaXApOwotCi0gIENYRkFfRkZEb2NWaWV3KiBHZXREb2NWaWV3KCk7Ci0gIHZvaWQgU2V0RG9jVmlldyhDWEZBX0ZGRG9jVmlldyogcERvY1ZpZXcpOwotICBDWEZBX0ZGRG9jKiBHZXREb2MoKTsKLSAgQ1hGQV9GRkFwcCogR2V0QXBwKCk7Ci0gIElYRkFfQXBwUHJvdmlkZXIqIEdldEFwcFByb3ZpZGVyKCk7Ci0gIHZvaWQgSW52YWxpZGF0ZVdpZGdldChjb25zdCBDRlhfUmVjdEYqIHBSZWN0ID0gbnVsbHB0cik7Ci0gIHZvaWQgQWRkSW52YWxpZGF0ZVJlY3QoY29uc3QgQ0ZYX1JlY3RGKiBwUmVjdCA9IG51bGxwdHIpOwotICBib29sIEdldENhcHRpb25UZXh0KENGWF9XaWRlU3RyaW5nJiB3c0NhcCk7Ci0gIGJvb2wgSXNGb2N1c2VkKCk7Ci0gIENGWF9Qb2ludEYgUm90YXRlMk5vcm1hbChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7Ci0gIENGWF9NYXRyaXggR2V0Um90YXRlTWF0cml4KCk7Ci0gIGJvb2wgSXNMYXlvdXRSZWN0RW1wdHkoKTsKLSAgQ1hGQV9GRldpZGdldCogR2V0UGFyZW50KCk7Ci0gIGJvb2wgSXNBbmNlc3Rvck9mKENYRkFfRkZXaWRnZXQqIHBXaWRnZXQpOwotICBjb25zdCBDRldMX0FwcCogR2V0RldMQXBwKCk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgYm9vbCBQdEluQWN0aXZlUmVjdChjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7Ci0KLSAgdm9pZCBEcmF3Qm9yZGVyKENGWF9HcmFwaGljcyogcEdTLAotICAgICAgICAgICAgICAgICAgQ1hGQV9Cb3ggYm94LAotICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydEJvcmRlciwKLSAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzID0gMCk7Ci0KLSAgQ0ZYX1JlY3RGIEdldFJlY3RXaXRob3V0Um90YXRlKCk7Ci0gIGJvb2wgSXNNYXRjaFZpc2libGVTdGF0dXModWludDMyX3QgZHdTdGF0dXMpOwotICB2b2lkIEV2ZW50S2lsbEZvY3VzKCk7Ci0gIGJvb2wgSXNCdXR0b25Eb3duKCk7Ci0gIHZvaWQgU2V0QnV0dG9uRG93bihib29sIGJTZXQpOwotCi0gIENYRkFfRkZEb2NWaWV3KiBtX3BEb2NWaWV3OwotICBDWEZBX0ZGUGFnZVZpZXcqIG1fcFBhZ2VWaWV3OwotICBDWEZBX1dpZGdldEFjYyogbV9wRGF0YUFjYzsKLSAgQ0ZYX1JlY3RGIG1fcnRXaWRnZXQ7Ci19OwotCi1pbnQzMl90IFhGQV9TdHJva2VUeXBlU2V0TGluZURhc2goQ0ZYX0dyYXBoaWNzKiBwR3JhcGhpY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpU3Ryb2tlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlDYXBUeXBlKTsKLUNGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcCBYRkFfTGluZUNhcFRvRlhHRShpbnQzMl90IGlMaW5lQ2FwKTsKLXZvaWQgWEZBX0RyYXdJbWFnZShDRlhfR3JhcGhpY3MqIHBHUywKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJ0SW1hZ2UsCi0gICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgICBDRlhfRElCaXRtYXAqIHBESUJpdG1hcCwKLSAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlBc3BlY3QsCi0gICAgICAgICAgICAgICAgICAgaW50MzJfdCBpSW1hZ2VYRHBpLAotICAgICAgICAgICAgICAgICAgIGludDMyX3QgaUltYWdlWURwaSwKLSAgICAgICAgICAgICAgICAgICBpbnQzMl90IGlIb3J6QWxpZ24gPSBYRkFfQVRUUklCVVRFRU5VTV9MZWZ0LAotICAgICAgICAgICAgICAgICAgIGludDMyX3QgaVZlcnRBbGlnbiA9IFhGQV9BVFRSSUJVVEVFTlVNX1RvcCk7Ci0KLUNGWF9ESUJpdG1hcCogWEZBX0xvYWRJbWFnZURhdGEoQ1hGQV9GRkRvYyogcERvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9JbWFnZSogcEltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sJiBiTmFtZUltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSW1hZ2VYRHBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90JiBpSW1hZ2VZRHBpKTsKLQotQ0ZYX0RJQml0bWFwKiBYRkFfTG9hZEltYWdlRnJvbUJ1ZmZlcigKLSAgICBjb25zdCBDRlhfUmV0YWluUHRyPElGWF9TZWVrYWJsZVJlYWRTdHJlYW0+JiBwSW1hZ2VGaWxlUmVhZCwKLSAgICBGWENPREVDX0lNQUdFX1RZUEUgdHlwZSwKLSAgICBpbnQzMl90JiBpSW1hZ2VYRHBpLAotICAgIGludDMyX3QmIGlJbWFnZVlEcGkpOwotCi1GWENPREVDX0lNQUdFX1RZUEUgWEZBX0dldEltYWdlVHlwZShjb25zdCBDRlhfV2lkZVN0cmluZyYgd3NUeXBlKTsKLUZYX0NIQVIqIFhGQV9CYXNlNjRFbmNvZGUoY29uc3QgdWludDhfdCogYnVmLCBpbnQzMl90IGJ1Zl9sZW4pOwotdm9pZCBYRkFfUmVjdFdpZHRob3V0TWFyZ2luKENGWF9SZWN0RiYgcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hGQV9NYXJnaW4mIG1nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYlVJID0gZmFsc2UpOwotQ1hGQV9GRldpZGdldCogWEZBX0dldFdpZGdldEZyb21MYXlvdXRJdGVtKENYRkFfTGF5b3V0SXRlbSogcExheW91dEl0ZW0pOwotYm9vbCBYRkFfSXNDcmVhdGVXaWRnZXQoWEZBX0VsZW1lbnQgaVR5cGUpOwotI2RlZmluZSBYRkFfRFJBV0JPWF9Gb3JjZVJvdW5kIDEKLSNkZWZpbmUgWEZBX0RSQVdCT1hfTG93ZXJlZDNEIDIKLXZvaWQgWEZBX0RyYXdCb3goQ1hGQV9Cb3ggYm94LAotICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHUywKLSAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiBydFdpZGdldCwKLSAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogcE1hdHJpeCwKLSAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFncyA9IDApOwotCi0jZW5kaWYgIC8vIFhGQV9GWEZBX1hGQV9GRldJREdFVF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0aGFuZGxlci5oIGIveGZhL2Z4ZmEveGZhX2Zmd2lkZ2V0aGFuZGxlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmJkYTNlLi4wMDAwMDAwCi0tLSBhL3hmYS9meGZhL3hmYV9mZndpZGdldGhhbmRsZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYRkFfWEZBX0ZGV0lER0VUSEFORExFUl9IXwotI2RlZmluZSBYRkFfRlhGQV9YRkFfRkZXSURHRVRIQU5ETEVSX0hfCi0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJ4ZmEvZnhmYS9jeGZhX2V2ZW50cGFyYW0uaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9meGZhLmgiCi0jaW5jbHVkZSAieGZhL2Z4ZmEvcGFyc2VyL2N4ZmFfZG9jdW1lbnQuaCIKLQotY2xhc3MgQ1hGQV9GRkRvY1ZpZXc7Ci1lbnVtIGNsYXNzIEZXTF9XaWRnZXRIaXQ7Ci0KLWNsYXNzIENYRkFfRkZXaWRnZXRIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfRkZXaWRnZXRIYW5kbGVyKENYRkFfRkZEb2NWaWV3KiBwRG9jVmlldyk7Ci0gIH5DWEZBX0ZGV2lkZ2V0SGFuZGxlcigpOwotCi0gIENYRkFfRkZXaWRnZXQqIENyZWF0ZVdpZGdldChDWEZBX0ZGV2lkZ2V0KiBoUGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEZBX1dJREdFVFRZUEUgZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX0ZGV2lkZ2V0KiBoQmVmb3JlID0gbnVsbHB0cik7Ci0KLSAgYm9vbCBPbk1vdXNlRW50ZXIoQ1hGQV9GRldpZGdldCogaFdpZGdldCk7Ci0gIGJvb2wgT25Nb3VzZUV4aXQoQ1hGQV9GRldpZGdldCogaFdpZGdldCk7Ci0gIGJvb2wgT25MQnV0dG9uRG93bihDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0LAotICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFncywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKLSAgYm9vbCBPbkxCdXR0b25VcChDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0LAotICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOwotICBib29sIE9uTEJ1dHRvbkRibENsayhDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7Ci0gIGJvb2wgT25Nb3VzZU1vdmUoQ1hGQV9GRldpZGdldCogaFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKLSAgYm9vbCBPbk1vdXNlV2hlZWwoQ1hGQV9GRldpZGdldCogaFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFncywKLSAgICAgICAgICAgICAgICAgICAgaW50MTZfdCB6RGVsdGEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKLSAgYm9vbCBPblJCdXR0b25Eb3duKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOwotICBib29sIE9uUkJ1dHRvblVwKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGbGFncywKLSAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7Ci0gIGJvb2wgT25SQnV0dG9uRGJsQ2xrKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKLQotICBib29sIE9uS2V5RG93bihDWEZBX0ZGV2lkZ2V0KiBoV2lkZ2V0LCB1aW50MzJfdCBkd0tleUNvZGUsIHVpbnQzMl90IGR3RmxhZ3MpOwotICBib29sIE9uS2V5VXAoQ1hGQV9GRldpZGdldCogaFdpZGdldCwgdWludDMyX3QgZHdLZXlDb2RlLCB1aW50MzJfdCBkd0ZsYWdzKTsKLSAgYm9vbCBPbkNoYXIoQ1hGQV9GRldpZGdldCogaFdpZGdldCwgdWludDMyX3QgZHdDaGFyLCB1aW50MzJfdCBkd0ZsYWdzKTsKLSAgRldMX1dpZGdldEhpdCBPbkhpdFRlc3QoQ1hGQV9GRldpZGdldCogaFdpZGdldCwgY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOwotICBib29sIE9uU2V0Q3Vyc29yKENYRkFfRkZXaWRnZXQqIGhXaWRnZXQsIGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKLSAgdm9pZCBSZW5kZXJXaWRnZXQoQ1hGQV9GRldpZGdldCogaFdpZGdldCwKLSAgICAgICAgICAgICAgICAgICAgQ0ZYX0dyYXBoaWNzKiBwR1MsCi0gICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIHBNYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgYkhpZ2hsaWdodCk7Ci0gIGJvb2wgSGFzRXZlbnQoQ1hGQV9XaWRnZXRBY2MqIHBXaWRnZXRBY2MsIFhGQV9FVkVOVFRZUEUgZUV2ZW50VHlwZSk7Ci0gIGludDMyX3QgUHJvY2Vzc0V2ZW50KENYRkFfV2lkZ2V0QWNjKiBwV2lkZ2V0QWNjLCBDWEZBX0V2ZW50UGFyYW0qIHBQYXJhbSk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIENYRkFfTm9kZSogQ3JlYXRlV2lkZ2V0Rm9ybUl0ZW0oWEZBX1dJREdFVFRZUEUgZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwUGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7Ci0KLSAgQ1hGQV9Ob2RlKiBDcmVhdGVQdXNoQnV0dG9uKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsKLSAgQ1hGQV9Ob2RlKiBDcmVhdGVDaGVja0J1dHRvbihDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7Ci0gIENYRkFfTm9kZSogQ3JlYXRlRXhjbEdyb3VwKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsKLSAgQ1hGQV9Ob2RlKiBDcmVhdGVSYWRpb0J1dHRvbihDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7Ci0gIENYRkFfTm9kZSogQ3JlYXRlRGF0ZXRpbWVFZGl0KENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsKLSAgQ1hGQV9Ob2RlKiBDcmVhdGVEZWNpbWFsRmllbGQoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0OwotICBDWEZBX05vZGUqIENyZWF0ZU51bWVyaWNGaWVsZChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7Ci0gIENYRkFfTm9kZSogQ3JlYXRlU2lnbmF0dXJlKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsKLSAgQ1hGQV9Ob2RlKiBDcmVhdGVUZXh0RWRpdChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7Ci0gIENYRkFfTm9kZSogQ3JlYXRlRHJvcGRvd25MaXN0KENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsKLSAgQ1hGQV9Ob2RlKiBDcmVhdGVMaXN0Qm94KENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsKLSAgQ1hGQV9Ob2RlKiBDcmVhdGVJbWFnZUZpZWxkKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsKLSAgQ1hGQV9Ob2RlKiBDcmVhdGVQYXNzd29yZEVkaXQoQ1hGQV9Ob2RlKiBwUGFyZW50LCBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0OwotICBDWEZBX05vZGUqIENyZWF0ZUZpZWxkKFhGQV9FbGVtZW50IGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBCZWZvcmUpIGNvbnN0OwotICBDWEZBX05vZGUqIENyZWF0ZUFyYyhDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7Ci0gIENYRkFfTm9kZSogQ3JlYXRlUmVjdGFuZ2xlKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsKLSAgQ1hGQV9Ob2RlKiBDcmVhdGVJbWFnZShDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7Ci0gIENYRkFfTm9kZSogQ3JlYXRlTGluZShDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7Ci0gIENYRkFfTm9kZSogQ3JlYXRlVGV4dChDWEZBX05vZGUqIHBQYXJlbnQsIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7Ci0gIENYRkFfTm9kZSogQ3JlYXRlRHJhdyhYRkFfRWxlbWVudCBlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcFBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7Ci0KLSAgQ1hGQV9Ob2RlKiBDcmVhdGVTdWJmb3JtKENYRkFfTm9kZSogcFBhcmVudCwgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsKLSAgQ1hGQV9Ob2RlKiBDcmVhdGVGb3JtSXRlbShYRkFfRWxlbWVudCBlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlKSBjb25zdDsKLSAgQ1hGQV9Ob2RlKiBDcmVhdGVDb3B5Tm9kZShYRkFfRWxlbWVudCBlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1hGQV9Ob2RlKiBwQmVmb3JlID0gbnVsbHB0cikgY29uc3Q7Ci0gIENYRkFfTm9kZSogQ3JlYXRlVGVtcGxhdGVOb2RlKFhGQV9FbGVtZW50IGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWEZBX05vZGUqIHBQYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENYRkFfTm9kZSogcEJlZm9yZSkgY29uc3Q7Ci0gIENYRkFfTm9kZSogQ3JlYXRlRm9udE5vZGUoQ1hGQV9Ob2RlKiBwUGFyZW50KSBjb25zdDsKLSAgQ1hGQV9Ob2RlKiBDcmVhdGVNYXJnaW5Ob2RlKENYRkFfTm9kZSogcFBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGR3RmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBmSW5zZXRzWzRdKSBjb25zdDsKLSAgQ1hGQV9Ob2RlKiBDcmVhdGVWYWx1ZU5vZGUoWEZBX0VsZW1lbnQgZVZhbHVlLCBDWEZBX05vZGUqIHBQYXJlbnQpIGNvbnN0OwotICBDWEZBX0RvY3VtZW50KiBHZXRPYmpGYWN0b3J5KCkgY29uc3Q7Ci0gIENYRkFfRG9jdW1lbnQqIEdldFhGQURvYygpIGNvbnN0OwotCi0gIENYRkFfRkZEb2NWaWV3KiBtX3BEb2NWaWV3OwotfTsKLQotI2VuZGlmICAvLyAgWEZBX0ZYRkFfWEZBX0ZGV0lER0VUSEFORExFUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEveGZhX2ZvbnRtZ3IuaCBiL3hmYS9meGZhL3hmYV9mb250bWdyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwMGIwNjkuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEveGZhX2ZvbnRtZ3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYRkFfWEZBX0ZPTlRNR1JfSF8KLSNkZWZpbmUgWEZBX0ZYRkFfWEZBX0ZPTlRNR1JfSF8KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSAiY29yZS9meGNydC9jZnhfcmV0YWluX3B0ci5oIgotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfZXh0LmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLSNpbmNsdWRlICJ4ZmEvZmdhcy9mb250L2NmZ2FzX2ZvbnRtZ3IuaCIKLSNpbmNsdWRlICJ4ZmEvZnhmYS9meGZhLmgiCi0KLWNsYXNzIENQREZfRm9udDsKLQotc3RydWN0IFhGQV9GT05USU5GTyB7Ci0gIHVpbnQzMl90IGR3Rm9udE5hbWVIYXNoOwotICBjb25zdCBGWF9XQ0hBUiogcFBzTmFtZTsKLSAgY29uc3QgRlhfV0NIQVIqIHBSZXBsYWNlRm9udDsKLSAgdWludDE2X3QgZHdTdHlsZXM7Ci0gIHVpbnQxNl90IHdDb2RlUGFnZTsKLX07Ci0KLWNsYXNzIENYRkFfRGVmRm9udE1nciB7Ci0gcHVibGljOgotICBDWEZBX0RlZkZvbnRNZ3IoKTsKLSAgfkNYRkFfRGVmRm9udE1ncigpOwotCi0gIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBHZXRGb250KENYRkFfRkZEb2MqIGhEb2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZvbnRTdHlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90IHdDb2RlUGFnZSA9IDB4RkZGRik7Ci0gIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBHZXREZWZhdWx0Rm9udCgKLSAgICAgIENYRkFfRkZEb2MqIGhEb2MsCi0gICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9udEZhbWlseSwKLSAgICAgIHVpbnQzMl90IGR3Rm9udFN0eWxlcywKLSAgICAgIHVpbnQxNl90IHdDb2RlUGFnZSA9IDB4RkZGRik7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHN0ZDo6dmVjdG9yPENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250Pj4gbV9DYWNoZUZvbnRzOwotfTsKLQotY2xhc3MgQ1hGQV9QREZGb250TWdyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENYRkFfUERGRm9udE1ncihDWEZBX0ZGRG9jKiBwRG9jKTsKLSAgfkNYRkFfUERGRm9udE1ncigpOwotCi0gIENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiBHZXRGb250KGNvbnN0IENGWF9XaWRlU3RyaW5nQyYgd3NGb250RmFtaWx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkd0ZvbnRTdHlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENQREZfRm9udCoqIHBQREZGb250LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTdHJpY3RNYXRjaCk7Ci0gIGJvb2wgR2V0Q2hhcldpZHRoKGNvbnN0IENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiYgcEZvbnQsCi0gICAgICAgICAgICAgICAgICAgIEZYX1dDSEFSIHdVbmljb2RlLAotICAgICAgICAgICAgICAgICAgICBib29sIGJDaGFyQ29kZSwKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogcFdpZHRoKTsKLSAgdm9pZCBTZXRGb250KGNvbnN0IENGWF9SZXRhaW5QdHI8Q0ZHQVNfR0VGb250PiYgcEZvbnQsIENQREZfRm9udCogcFBERkZvbnQpOwotCi0gcHJvdGVjdGVkOgotICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gRmluZEZvbnQoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0ckZhbWlseU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJCb2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiSXRhbGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1BERl9Gb250KiogcFBERkZvbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJTdHJpY3RNYXRjaCk7Ci0gIENGWF9CeXRlU3RyaW5nIFBzTmFtZVRvRm9udE5hbWUoY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIHN0clBzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJCb2xkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkl0YWxpYyk7Ci0gIGJvb2wgUHNOYW1lTWF0Y2hEUkZvbnROYW1lKGNvbnN0IENGWF9CeXRlU3RyaW5nQyYgYnNQc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkJvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYkl0YWxpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX0J5dGVTdHJpbmcmIGJzRFJGb250TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiU3RyaWN0TWF0Y2gpOwotCi0gIENYRkFfRkZEb2MqIGNvbnN0IG1fcERvYzsKLSAgc3RkOjptYXA8Q0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+LCBDUERGX0ZvbnQqPiBtX0ZERTJQREZGb250OwotICBzdGQ6Om1hcDxDRlhfQnl0ZVN0cmluZywgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+PiBtX0ZvbnRNYXA7Ci19OwotCi1jbGFzcyBDWEZBX0ZvbnRNZ3IgewotIHB1YmxpYzoKLSAgQ1hGQV9Gb250TWdyKCk7Ci0gIH5DWEZBX0ZvbnRNZ3IoKTsKLQotICBDRlhfUmV0YWluUHRyPENGR0FTX0dFRm9udD4gR2V0Rm9udChDWEZBX0ZGRG9jKiBoRG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfV2lkZVN0cmluZ0MmIHdzRm9udEZhbWlseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHdGb250U3R5bGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCB3Q29kZVBhZ2UgPSAweEZGRkYpOwotICB2b2lkIExvYWREb2NGb250cyhDWEZBX0ZGRG9jKiBoRG9jKTsKLSAgdm9pZCBSZWxlYXNlRG9jRm9udHMoQ1hGQV9GRkRvYyogaERvYyk7Ci0gIHZvaWQgU2V0RGVmRm9udE1ncihzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9EZWZGb250TWdyPiBwRm9udE1ncik7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDWEZBX0RlZkZvbnRNZ3I+IG1fcERlZkZvbnRNZ3I7Ci0gIHN0ZDo6bWFwPENYRkFfRkZEb2MqLCBzdGQ6OnVuaXF1ZV9wdHI8Q1hGQV9QREZGb250TWdyPj4gbV9QREZGb250TWdyTWFwOwotICBzdGQ6Om1hcDxDRlhfQnl0ZVN0cmluZywgQ0ZYX1JldGFpblB0cjxDRkdBU19HRUZvbnQ+PiBtX0ZvbnRNYXA7Ci19OwotCi0jZW5kaWYgIC8vICBYRkFfRlhGQV9YRkFfRk9OVE1HUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4ZmEveGZhX3JlbmRlcmNvbnRleHQuaCBiL3hmYS9meGZhL3hmYV9yZW5kZXJjb250ZXh0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MjQwMDUuLjAwMDAwMDAKLS0tIGEveGZhL2Z4ZmEveGZhX3JlbmRlcmNvbnRleHQuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE0IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhGQV9YRkFfUkVOREVSQ09OVEVYVF9IXwotI2RlZmluZSBYRkFfRlhGQV9YRkFfUkVOREVSQ09OVEVYVF9IXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotCi0jaW5jbHVkZSAieGZhL2Z4ZmEvZnhmYS5oIgotCi1jbGFzcyBDWEZBX1JlbmRlck9wdGlvbnMgewotIHB1YmxpYzoKLSAgQ1hGQV9SZW5kZXJPcHRpb25zKCkgOiBtX2JQcmludChmYWxzZSksIG1fYkhpZ2hsaWdodCh0cnVlKSB7fQotCi0gIGJvb2wgbV9iUHJpbnQ7Ci0gIGJvb2wgbV9iSGlnaGxpZ2h0OwotfTsKLQotY2xhc3MgQ1hGQV9SZW5kZXJDb250ZXh0IHsKLSBwdWJsaWM6Ci0gIENYRkFfUmVuZGVyQ29udGV4dCgpOwotICB+Q1hGQV9SZW5kZXJDb250ZXh0KCk7Ci0KLSAgaW50MzJfdCBTdGFydFJlbmRlcihDWEZBX0ZGUGFnZVZpZXcqIHBQYWdlVmlldywKLSAgICAgICAgICAgICAgICAgICAgICBDRlhfR3JhcGhpY3MqIHBHUywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1hGQV9SZW5kZXJPcHRpb25zJiBvcHRpb25zKTsKLSAgaW50MzJfdCBEb1JlbmRlcihJRlhfUGF1c2UqIHBQYXVzZSA9IG51bGxwdHIpOwotICB2b2lkIFN0b3BSZW5kZXIoKTsKLQotIHByb3RlY3RlZDoKLSAgc3RkOjp1bmlxdWVfcHRyPElYRkFfV2lkZ2V0SXRlcmF0b3I+IG1fcFdpZGdldEl0ZXJhdG9yOwotICBDWEZBX0ZGV2lkZ2V0KiBtX3BXaWRnZXQ7Ci0gIENYRkFfRkZQYWdlVmlldyogbV9wUGFnZVZpZXc7Ci0gIENGWF9HcmFwaGljcyogbV9wR1M7Ci0gIENGWF9NYXRyaXggbV9tYXRyaXg7Ci0gIENYRkFfUmVuZGVyT3B0aW9ucyBtX29wdGlvbnM7Ci0gIHVpbnQzMl90IG1fZHdTdGF0dXM7Ci0gIENGWF9SZWN0RiBtX3J0Q2xpcFJlY3Q7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEZBX1hGQV9SRU5ERVJDT05URVhUX0hfCmRpZmYgLS1naXQgYS94ZmEvZnhncmFwaGljcy9jZnhfY29sb3IuY3BwIGIveGZhL2Z4Z3JhcGhpY3MvY2Z4X2NvbG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYwMjVhOC4uMDAwMDAwMAotLS0gYS94ZmEvZnhncmFwaGljcy9jZnhfY29sb3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY2Z4X2NvbG9yLmgiCi0KLUNGWF9Db2xvcjo6Q0ZYX0NvbG9yKCkgOiBtX3R5cGUoRlhfQ09MT1JfTm9uZSkge30KLQotQ0ZYX0NvbG9yOjpDRlhfQ29sb3IoY29uc3QgRlhfQVJHQiBhcmdiKSB7Ci0gIFNldChhcmdiKTsKLX0KLQotQ0ZYX0NvbG9yOjpDRlhfQ29sb3IoQ0ZYX1BhdHRlcm4qIHBhdHRlcm4sIGNvbnN0IEZYX0FSR0IgYXJnYikgewotICBTZXQocGF0dGVybiwgYXJnYik7Ci19Ci0KLUNGWF9Db2xvcjo6Q0ZYX0NvbG9yKENGWF9TaGFkaW5nKiBzaGFkaW5nKSB7Ci0gIFNldChzaGFkaW5nKTsKLX0KLQotQ0ZYX0NvbG9yOjp+Q0ZYX0NvbG9yKCkgewotICBtX3R5cGUgPSBGWF9DT0xPUl9Ob25lOwotfQotCi12b2lkIENGWF9Db2xvcjo6U2V0KGNvbnN0IEZYX0FSR0IgYXJnYikgewotICBtX3R5cGUgPSBGWF9DT0xPUl9Tb2xpZDsKLSAgbV9pbmZvLmFyZ2IgPSBhcmdiOwotICBtX2luZm8ucGF0dGVybiA9IG51bGxwdHI7Ci19Ci0KLXZvaWQgQ0ZYX0NvbG9yOjpTZXQoQ0ZYX1BhdHRlcm4qIHBhdHRlcm4sIGNvbnN0IEZYX0FSR0IgYXJnYikgewotICBpZiAoIXBhdHRlcm4pCi0gICAgcmV0dXJuOwotICBtX3R5cGUgPSBGWF9DT0xPUl9QYXR0ZXJuOwotICBtX2luZm8uYXJnYiA9IGFyZ2I7Ci0gIG1faW5mby5wYXR0ZXJuID0gcGF0dGVybjsKLX0KLQotdm9pZCBDRlhfQ29sb3I6OlNldChDRlhfU2hhZGluZyogc2hhZGluZykgewotICBpZiAoIXNoYWRpbmcpCi0gICAgcmV0dXJuOwotICBtX3R5cGUgPSBGWF9DT0xPUl9TaGFkaW5nOwotICBtX3NoYWRpbmcgPSBzaGFkaW5nOwotfQpkaWZmIC0tZ2l0IGEveGZhL2Z4Z3JhcGhpY3MvY2Z4X2NvbG9yLmggYi94ZmEvZnhncmFwaGljcy9jZnhfY29sb3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmN2ZlMi4uMDAwMDAwMAotLS0gYS94ZmEvZnhncmFwaGljcy9jZnhfY29sb3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQotLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KLQotI2lmbmRlZiBYRkFfRlhHUkFQSElDU19DRlhfQ09MT1JfSF8KLSNkZWZpbmUgWEZBX0ZYR1JBUEhJQ1NfQ0ZYX0NPTE9SX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZGliLmgiCi0jaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY2Z4X2dyYXBoaWNzLmgiCi0KLWNsYXNzIENGWF9QYXR0ZXJuOwotY2xhc3MgQ0ZYX1NoYWRpbmc7Ci0KLWVudW0geyBGWF9DT0xPUl9Ob25lID0gMCwgRlhfQ09MT1JfU29saWQsIEZYX0NPTE9SX1BhdHRlcm4sIEZYX0NPTE9SX1NoYWRpbmcgfTsKLQotY2xhc3MgQ0ZYX0NvbG9yIHsKLSBwdWJsaWM6Ci0gIENGWF9Db2xvcigpOwotICBleHBsaWNpdCBDRlhfQ29sb3IoY29uc3QgRlhfQVJHQiBhcmdiKTsKLSAgZXhwbGljaXQgQ0ZYX0NvbG9yKENGWF9TaGFkaW5nKiBzaGFkaW5nKTsKLSAgQ0ZYX0NvbG9yKENGWF9QYXR0ZXJuKiBwYXR0ZXJuLCBjb25zdCBGWF9BUkdCIGFyZ2IpOwotICB2aXJ0dWFsIH5DRlhfQ29sb3IoKTsKLQotICB2b2lkIFNldChjb25zdCBGWF9BUkdCIGFyZ2IpOwotICB2b2lkIFNldChDRlhfUGF0dGVybiogcGF0dGVybiwgY29uc3QgRlhfQVJHQiBhcmdiKTsKLSAgdm9pZCBTZXQoQ0ZYX1NoYWRpbmcqIHNoYWRpbmcpOwotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIENGWF9HcmFwaGljczsKLQotICBpbnQzMl90IG1fdHlwZTsKLSAgdW5pb24gewotICAgIHN0cnVjdCB7Ci0gICAgICBGWF9BUkdCIGFyZ2I7Ci0gICAgICBDRlhfUGF0dGVybiogcGF0dGVybjsKLSAgICB9IG1faW5mbzsKLSAgICBDRlhfU2hhZGluZyogbV9zaGFkaW5nOwotICB9OwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhHUkFQSElDU19DRlhfQ09MT1JfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGdyYXBoaWNzL2NmeF9ncmFwaGljcy5jcHAgYi94ZmEvZnhncmFwaGljcy9jZnhfZ3JhcGhpY3MuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmYyMTUxLi4wMDAwMDAwCi0tLSBhL3hmYS9meGdyYXBoaWNzL2NmeF9ncmFwaGljcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MzggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTQgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY2Z4X2dyYXBoaWNzLmgiCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2Z4Z2VkZXZpY2UuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2dlbW9kdWxlLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9yZW5kZXJkZXZpY2UuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3VuaWNvZGVlbmNvZGluZy5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfY29sb3IuaCIKLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfcGF0aC5oIgotI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2NmeF9wYXR0ZXJuLmgiCi0jaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY2Z4X3NoYWRpbmcuaCIKLQotbmFtZXNwYWNlIHsKLQotZW51bSB7Ci0gIEZYX0NPTlRFWFRfTm9uZSA9IDAsCi0gIEZYX0NPTlRFWFRfRGV2aWNlLAotfTsKLQotI2RlZmluZSBGWF9IQVRDSFNUWUxFX1RvdGFsIDUzCi0KLXN0cnVjdCBGWF9IQVRDSERBVEEgewotICBpbnQzMl90IHdpZHRoOwotICBpbnQzMl90IGhlaWdodDsKLSAgdWludDhfdCBtYXNrQml0c1s2NF07Ci19OwotCi1jb25zdCBGWF9IQVRDSERBVEEgaGF0Y2hCaXRtYXBEYXRhW0ZYX0hBVENIU1RZTEVfVG90YWxdID0gewotICAgIHsxNiwgIC8vIEhvcml6b250YWwKLSAgICAgMTYsCi0gICAgIHsKLSAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwKLSAgICAgICAgIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAgfX0sCi0gICAgezE2LCAgLy8gVmVydGljYWwKLSAgICAgMTYsCi0gICAgIHsKLSAgICAgICAgIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsCi0gICAgICAgICAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLAotICAgICAgICAgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwKLSAgICAgICAgIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsCi0gICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLAotICAgICAgICAgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwKLSAgICAgfX0sCi0gICAgezE2LCAgLy8gRm9yd2FyZERpYWdvbmFsCi0gICAgIDE2LAotICAgICB7Ci0gICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDQwLCAweDQwLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDAwLAotICAgICAgICAgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwKLSAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4ODAsCi0gICAgICAgICAweDgwLCAweDAwLCAweDAwLCAweDQwLCAweDQwLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDAwLCAweDAwLAotICAgICAgICAgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwNCwgMHgwMCwKLSAgICAgICAgIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsCi0gICAgIH19LAotICAgIHsxNiwgIC8vIEJhY2t3YXJkRGlhZ29uYWwKLSAgICAgMTYsCi0gICAgIHsKLSAgICAgICAgIDB4MDEsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsCi0gICAgICAgICAweDAwLCAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDIwLCAweDIwLAotICAgICAgICAgMHgwMCwgMHgwMCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHgwMSwKLSAgICAgICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsIDB4MDAsCi0gICAgICAgICAweDA4LCAweDA4LCAweDAwLCAweDAwLCAweDEwLCAweDEwLCAweDAwLCAweDAwLCAweDIwLCAweDIwLCAweDAwLAotICAgICAgICAgMHgwMCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwKLSAgICAgfX0sCi0gICAgezE2LCAgLy8gQ3Jvc3MKLSAgICAgMTYsCi0gICAgIHsKLSAgICAgICAgIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsCi0gICAgICAgICAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLAotICAgICAgICAgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHhmZiwKLSAgICAgICAgIDB4ZmYsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsCi0gICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLAotICAgICAgICAgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwKLSAgICAgfX0sCi0gICAgezE2LCAgLy8gRGlhZ29uYWxDcm9zcwotICAgICAxNiwKLSAgICAgewotICAgICAgICAgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwKLSAgICAgICAgIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsCi0gICAgICAgICAweDAwLCAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLCAweDgxLAotICAgICAgICAgMHg4MSwgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgyNCwgMHgwMCwgMHgwMCwKLSAgICAgICAgIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MTgsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsCi0gICAgICAgICAweDAwLCAweDQyLCAweDQyLCAweDAwLCAweDAwLCAweDgxLCAweDgxLCAweDAwLCAweDAwLAotICAgICB9fSwKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1DRlhfR3JhcGhpY3M6OkNGWF9HcmFwaGljcyhDRlhfUmVuZGVyRGV2aWNlKiByZW5kZXJEZXZpY2UpCi0gICAgOiBtX3R5cGUoRlhfQ09OVEVYVF9Ob25lKSwgbV9yZW5kZXJEZXZpY2UocmVuZGVyRGV2aWNlKSB7Ci0gIGlmICghcmVuZGVyRGV2aWNlKQotICAgIHJldHVybjsKLSAgbV90eXBlID0gRlhfQ09OVEVYVF9EZXZpY2U7Ci19Ci0KLUNGWF9HcmFwaGljczo6fkNGWF9HcmFwaGljcygpIHt9Ci0KLXZvaWQgQ0ZYX0dyYXBoaWNzOjpTYXZlR3JhcGhTdGF0ZSgpIHsKLSAgaWYgKG1fdHlwZSAhPSBGWF9DT05URVhUX0RldmljZSB8fCAhbV9yZW5kZXJEZXZpY2UpCi0gICAgcmV0dXJuOwotCi0gIG1fcmVuZGVyRGV2aWNlLT5TYXZlU3RhdGUoKTsKLSAgbV9pbmZvU3RhY2sucHVzaF9iYWNrKHBkZml1bTo6TWFrZVVuaXF1ZTxUSW5mbz4obV9pbmZvKSk7Ci19Ci0KLXZvaWQgQ0ZYX0dyYXBoaWNzOjpSZXN0b3JlR3JhcGhTdGF0ZSgpIHsKLSAgaWYgKG1fdHlwZSAhPSBGWF9DT05URVhUX0RldmljZSB8fCAhbV9yZW5kZXJEZXZpY2UpCi0gICAgcmV0dXJuOwotCi0gIG1fcmVuZGVyRGV2aWNlLT5SZXN0b3JlU3RhdGUoZmFsc2UpOwotICBpZiAobV9pbmZvU3RhY2suZW1wdHkoKSB8fCAhbV9pbmZvU3RhY2suYmFjaygpKQotICAgIHJldHVybjsKLQotICBtX2luZm8gPSAqbV9pbmZvU3RhY2suYmFjaygpOwotICBtX2luZm9TdGFjay5wb3BfYmFjaygpOwotICByZXR1cm47Ci19Ci0KLXZvaWQgQ0ZYX0dyYXBoaWNzOjpTZXRMaW5lQ2FwKENGWF9HcmFwaFN0YXRlRGF0YTo6TGluZUNhcCBsaW5lQ2FwKSB7Ci0gIGlmIChtX3R5cGUgPT0gRlhfQ09OVEVYVF9EZXZpY2UgJiYgbV9yZW5kZXJEZXZpY2UpIHsKLSAgICBtX2luZm8uZ3JhcGhTdGF0ZS5tX0xpbmVDYXAgPSBsaW5lQ2FwOwotICB9Ci19Ci0KLXZvaWQgQ0ZYX0dyYXBoaWNzOjpTZXRMaW5lRGFzaChGWF9GTE9BVCBkYXNoUGhhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQqIGRhc2hBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRhc2hDb3VudCkgewotICBpZiAoZGFzaENvdW50ID4gMCAmJiAhZGFzaEFycmF5KQotICAgIHJldHVybjsKLQotICBkYXNoQ291bnQgPSBkYXNoQ291bnQgPCAwID8gMCA6IGRhc2hDb3VudDsKLSAgaWYgKG1fdHlwZSA9PSBGWF9DT05URVhUX0RldmljZSAmJiBtX3JlbmRlckRldmljZSkgewotICAgIEZYX0ZMT0FUIHNjYWxlID0gMS4wOwotICAgIGlmIChtX2luZm8uaXNBY3RPbkRhc2gpIHsKLSAgICAgIHNjYWxlID0gbV9pbmZvLmdyYXBoU3RhdGUubV9MaW5lV2lkdGg7Ci0gICAgfQotICAgIG1faW5mby5ncmFwaFN0YXRlLm1fRGFzaFBoYXNlID0gZGFzaFBoYXNlOwotICAgIG1faW5mby5ncmFwaFN0YXRlLlNldERhc2hDb3VudChkYXNoQ291bnQpOwotICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGRhc2hDb3VudDsgaSsrKSB7Ci0gICAgICBtX2luZm8uZ3JhcGhTdGF0ZS5tX0Rhc2hBcnJheVtpXSA9IGRhc2hBcnJheVtpXSAqIHNjYWxlOwotICAgIH0KLSAgfQotfQotCi12b2lkIENGWF9HcmFwaGljczo6U2V0TGluZURhc2goRlhfRGFzaFN0eWxlIGRhc2hTdHlsZSkgewotICBpZiAobV90eXBlID09IEZYX0NPTlRFWFRfRGV2aWNlICYmIG1fcmVuZGVyRGV2aWNlKQotICAgIFJlbmRlckRldmljZVNldExpbmVEYXNoKGRhc2hTdHlsZSk7Ci19Ci0KLXZvaWQgQ0ZYX0dyYXBoaWNzOjpTZXRMaW5lV2lkdGgoRlhfRkxPQVQgbGluZVdpZHRoLCBib29sIGlzQWN0T25EYXNoKSB7Ci0gIGlmIChtX3R5cGUgPT0gRlhfQ09OVEVYVF9EZXZpY2UgJiYgbV9yZW5kZXJEZXZpY2UpIHsKLSAgICBtX2luZm8uZ3JhcGhTdGF0ZS5tX0xpbmVXaWR0aCA9IGxpbmVXaWR0aDsKLSAgICBtX2luZm8uaXNBY3RPbkRhc2ggPSBpc0FjdE9uRGFzaDsKLSAgfQotfQotCi12b2lkIENGWF9HcmFwaGljczo6U2V0U3Ryb2tlQ29sb3IoQ0ZYX0NvbG9yKiBjb2xvcikgewotICBpZiAoIWNvbG9yKQotICAgIHJldHVybjsKLSAgaWYgKG1fdHlwZSA9PSBGWF9DT05URVhUX0RldmljZSAmJiBtX3JlbmRlckRldmljZSkgewotICAgIG1faW5mby5zdHJva2VDb2xvciA9IGNvbG9yOwotICB9Ci19Ci0KLXZvaWQgQ0ZYX0dyYXBoaWNzOjpTZXRGaWxsQ29sb3IoQ0ZYX0NvbG9yKiBjb2xvcikgewotICBpZiAoIWNvbG9yKQotICAgIHJldHVybjsKLSAgaWYgKG1fdHlwZSA9PSBGWF9DT05URVhUX0RldmljZSAmJiBtX3JlbmRlckRldmljZSkgewotICAgIG1faW5mby5maWxsQ29sb3IgPSBjb2xvcjsKLSAgfQotfQotCi12b2lkIENGWF9HcmFwaGljczo6U3Ryb2tlUGF0aChDRlhfUGF0aCogcGF0aCwgQ0ZYX01hdHJpeCogbWF0cml4KSB7Ci0gIGlmICghcGF0aCkKLSAgICByZXR1cm47Ci0gIGlmIChtX3R5cGUgPT0gRlhfQ09OVEVYVF9EZXZpY2UgJiYgbV9yZW5kZXJEZXZpY2UpCi0gICAgUmVuZGVyRGV2aWNlU3Ryb2tlUGF0aChwYXRoLCBtYXRyaXgpOwotfQotCi12b2lkIENGWF9HcmFwaGljczo6RmlsbFBhdGgoQ0ZYX1BhdGgqIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRmlsbE1vZGUgZmlsbE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4KSB7Ci0gIGlmICghcGF0aCkKLSAgICByZXR1cm47Ci0gIGlmIChtX3R5cGUgPT0gRlhfQ09OVEVYVF9EZXZpY2UgJiYgbV9yZW5kZXJEZXZpY2UpCi0gICAgUmVuZGVyRGV2aWNlRmlsbFBhdGgocGF0aCwgZmlsbE1vZGUsIG1hdHJpeCk7Ci19Ci0KLXZvaWQgQ0ZYX0dyYXBoaWNzOjpTdHJldGNoSW1hZ2UoQ0ZYX0RJQlNvdXJjZSogc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCkgewotICBpZiAoIXNvdXJjZSkKLSAgICByZXR1cm47Ci0gIGlmIChtX3R5cGUgPT0gRlhfQ09OVEVYVF9EZXZpY2UgJiYgbV9yZW5kZXJEZXZpY2UpCi0gICAgUmVuZGVyRGV2aWNlU3RyZXRjaEltYWdlKHNvdXJjZSwgcmVjdCwgbWF0cml4KTsKLX0KLQotdm9pZCBDRlhfR3JhcGhpY3M6OkNvbmNhdE1hdHJpeChjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgpIHsKLSAgaWYgKCFtYXRyaXgpCi0gICAgcmV0dXJuOwotICBpZiAobV90eXBlID09IEZYX0NPTlRFWFRfRGV2aWNlICYmIG1fcmVuZGVyRGV2aWNlKSB7Ci0gICAgbV9pbmZvLkNUTS5Db25jYXQoKm1hdHJpeCk7Ci0gIH0KLX0KLQotQ0ZYX01hdHJpeCogQ0ZYX0dyYXBoaWNzOjpHZXRNYXRyaXgoKSB7Ci0gIGlmIChtX3R5cGUgPT0gRlhfQ09OVEVYVF9EZXZpY2UgJiYgbV9yZW5kZXJEZXZpY2UpCi0gICAgcmV0dXJuICZtX2luZm8uQ1RNOwotICByZXR1cm4gbnVsbHB0cjsKLX0KLQotQ0ZYX1JlY3RGIENGWF9HcmFwaGljczo6R2V0Q2xpcFJlY3QoKSBjb25zdCB7Ci0gIGlmIChtX3R5cGUgIT0gRlhfQ09OVEVYVF9EZXZpY2UgfHwgIW1fcmVuZGVyRGV2aWNlKQotICAgIHJldHVybiBDRlhfUmVjdEYoKTsKLQotICBGWF9SRUNUIHIgPSBtX3JlbmRlckRldmljZS0+R2V0Q2xpcEJveCgpOwotICByZXR1cm4gQ0ZYX1JlY3Qoci5sZWZ0LCByLnRvcCwgci5XaWR0aCgpLCByLkhlaWdodCgpKS5BczxGWF9GTE9BVD4oKTsKLX0KLQotdm9pZCBDRlhfR3JhcGhpY3M6OlNldENsaXBSZWN0KGNvbnN0IENGWF9SZWN0RiYgcmVjdCkgewotICBpZiAobV90eXBlID09IEZYX0NPTlRFWFRfRGV2aWNlICYmIG1fcmVuZGVyRGV2aWNlKSB7Ci0gICAgbV9yZW5kZXJEZXZpY2UtPlNldENsaXBfUmVjdCgKLSAgICAgICAgRlhfUkVDVChGWFNZU19yb3VuZChyZWN0LmxlZnQpLCBGWFNZU19yb3VuZChyZWN0LnRvcCksCi0gICAgICAgICAgICAgICAgRlhTWVNfcm91bmQocmVjdC5yaWdodCgpKSwgRlhTWVNfcm91bmQocmVjdC5ib3R0b20oKSkpKTsKLSAgfQotfQotCi1DRlhfUmVuZGVyRGV2aWNlKiBDRlhfR3JhcGhpY3M6OkdldFJlbmRlckRldmljZSgpIHsKLSAgcmV0dXJuIG1fcmVuZGVyRGV2aWNlOwotfQotCi12b2lkIENGWF9HcmFwaGljczo6UmVuZGVyRGV2aWNlU2V0TGluZURhc2goRlhfRGFzaFN0eWxlIGRhc2hTdHlsZSkgewotICBzd2l0Y2ggKGRhc2hTdHlsZSkgewotICAgIGNhc2UgRlhfREFTSFNUWUxFX1NvbGlkOiB7Ci0gICAgICBtX2luZm8uZ3JhcGhTdGF0ZS5TZXREYXNoQ291bnQoMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgRlhfREFTSFNUWUxFX0Rhc2g6IHsKLSAgICAgIEZYX0ZMT0FUIGRhc2hBcnJheVtdID0gezMsIDF9OwotICAgICAgU2V0TGluZURhc2goMCwgZGFzaEFycmF5LCAyKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBGWF9EQVNIU1RZTEVfRG90OiB7Ci0gICAgICBGWF9GTE9BVCBkYXNoQXJyYXlbXSA9IHsxLCAxfTsKLSAgICAgIFNldExpbmVEYXNoKDAsIGRhc2hBcnJheSwgMik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgRlhfREFTSFNUWUxFX0Rhc2hEb3Q6IHsKLSAgICAgIEZYX0ZMT0FUIGRhc2hBcnJheVtdID0gezMsIDEsIDEsIDF9OwotICAgICAgU2V0TGluZURhc2goMCwgZGFzaEFycmF5LCA0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2FzZSBGWF9EQVNIU1RZTEVfRGFzaERvdERvdDogewotICAgICAgRlhfRkxPQVQgZGFzaEFycmF5W10gPSB7NCwgMSwgMiwgMSwgMiwgMX07Ci0gICAgICBTZXRMaW5lRGFzaCgwLCBkYXNoQXJyYXksIDYpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuOwotICB9Ci19Ci0KLXZvaWQgQ0ZYX0dyYXBoaWNzOjpSZW5kZXJEZXZpY2VTdHJva2VQYXRoKENGWF9QYXRoKiBwYXRoLCBDRlhfTWF0cml4KiBtYXRyaXgpIHsKLSAgaWYgKCFtX2luZm8uc3Ryb2tlQ29sb3IpCi0gICAgcmV0dXJuOwotICBDRlhfTWF0cml4IG0obV9pbmZvLkNUTS5hLCBtX2luZm8uQ1RNLmIsIG1faW5mby5DVE0uYywgbV9pbmZvLkNUTS5kLAotICAgICAgICAgICAgICAgbV9pbmZvLkNUTS5lLCBtX2luZm8uQ1RNLmYpOwotICBpZiAobWF0cml4KSB7Ci0gICAgbS5Db25jYXQoKm1hdHJpeCk7Ci0gIH0KLSAgc3dpdGNoIChtX2luZm8uc3Ryb2tlQ29sb3ItPm1fdHlwZSkgewotICAgIGNhc2UgRlhfQ09MT1JfU29saWQ6IHsKLSAgICAgIG1fcmVuZGVyRGV2aWNlLT5EcmF3UGF0aChwYXRoLT5HZXRQYXRoRGF0YSgpLCAmbSwgJm1faW5mby5ncmFwaFN0YXRlLCAweDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbmZvLnN0cm9rZUNvbG9yLT5tX2luZm8uYXJnYiwgMCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm47Ci0gIH0KLX0KLQotdm9pZCBDRlhfR3JhcGhpY3M6OlJlbmRlckRldmljZUZpbGxQYXRoKENGWF9QYXRoKiBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZpbGxNb2RlIGZpbGxNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCkgewotICBpZiAoIW1faW5mby5maWxsQ29sb3IpCi0gICAgcmV0dXJuOwotICBDRlhfTWF0cml4IG0obV9pbmZvLkNUTS5hLCBtX2luZm8uQ1RNLmIsIG1faW5mby5DVE0uYywgbV9pbmZvLkNUTS5kLAotICAgICAgICAgICAgICAgbV9pbmZvLkNUTS5lLCBtX2luZm8uQ1RNLmYpOwotICBpZiAobWF0cml4KSB7Ci0gICAgbS5Db25jYXQoKm1hdHJpeCk7Ci0gIH0KLSAgc3dpdGNoIChtX2luZm8uZmlsbENvbG9yLT5tX3R5cGUpIHsKLSAgICBjYXNlIEZYX0NPTE9SX1NvbGlkOiB7Ci0gICAgICBtX3JlbmRlckRldmljZS0+RHJhd1BhdGgocGF0aC0+R2V0UGF0aERhdGEoKSwgJm0sICZtX2luZm8uZ3JhcGhTdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luZm8uZmlsbENvbG9yLT5tX2luZm8uYXJnYiwgMHgwLCBmaWxsTW9kZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGNhc2UgRlhfQ09MT1JfUGF0dGVybjoKLSAgICAgIEZpbGxQYXRoV2l0aFBhdHRlcm4ocGF0aCwgZmlsbE1vZGUsICZtKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIEZYX0NPTE9SX1NoYWRpbmc6Ci0gICAgICBGaWxsUGF0aFdpdGhTaGFkaW5nKHBhdGgsIGZpbGxNb2RlLCAmbSk7Ci0gICAgICByZXR1cm47Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybjsKLSAgfQotfQotCi12b2lkIENGWF9HcmFwaGljczo6UmVuZGVyRGV2aWNlU3RyZXRjaEltYWdlKENGWF9ESUJTb3VyY2UqIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1JlY3RGJiByZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXgpIHsKLSAgQ0ZYX01hdHJpeCBtMShtX2luZm8uQ1RNLmEsIG1faW5mby5DVE0uYiwgbV9pbmZvLkNUTS5jLCBtX2luZm8uQ1RNLmQsCi0gICAgICAgICAgICAgICAgbV9pbmZvLkNUTS5lLCBtX2luZm8uQ1RNLmYpOwotICBpZiAobWF0cml4KSB7Ci0gICAgbTEuQ29uY2F0KCptYXRyaXgpOwotICB9Ci0gIHN0ZDo6dW5pcXVlX3B0cjxDRlhfRElCaXRtYXA+IGJtcDEgPQotICAgICAgc291cmNlLT5TdHJldGNoVG8oKGludDMyX3QpcmVjdC5XaWR0aCgpLCAoaW50MzJfdClyZWN0LkhlaWdodCgpKTsKLSAgQ0ZYX01hdHJpeCBtMihyZWN0LldpZHRoKCksIDAuMCwgMC4wLCByZWN0LkhlaWdodCgpLCByZWN0LmxlZnQsIHJlY3QudG9wKTsKLSAgbTIuQ29uY2F0KG0xKTsKLQotICBpbnQzMl90IGxlZnQ7Ci0gIGludDMyX3QgdG9wOwotICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBibXAyID0gYm1wMS0+RmxpcEltYWdlKGZhbHNlLCB0cnVlKTsKLSAgc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gYm1wMyA9IGJtcDItPlRyYW5zZm9ybVRvKCZtMiwgbGVmdCwgdG9wKTsKLSAgQ0ZYX1JlY3RGIHIgPSBHZXRDbGlwUmVjdCgpOwotICBDRlhfRElCaXRtYXAqIGJpdG1hcCA9IG1fcmVuZGVyRGV2aWNlLT5HZXRCaXRtYXAoKTsKLSAgYml0bWFwLT5Db21wb3NpdGVCaXRtYXAoRlhTWVNfcm91bmQoci5sZWZ0KSwgRlhTWVNfcm91bmQoci50b3ApLAotICAgICAgICAgICAgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyLldpZHRoKCkpLCBGWFNZU19yb3VuZChyLkhlaWdodCgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYm1wMy5nZXQoKSwgRlhTWVNfcm91bmQoci5sZWZ0IC0gbGVmdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHIudG9wIC0gdG9wKSk7Ci19Ci0KLXZvaWQgQ0ZYX0dyYXBoaWNzOjpGaWxsUGF0aFdpdGhQYXR0ZXJuKENGWF9QYXRoKiBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRmlsbE1vZGUgZmlsbE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXgpIHsKLSAgQ0ZYX1BhdHRlcm4qIHBhdHRlcm4gPSBtX2luZm8uZmlsbENvbG9yLT5tX2luZm8ucGF0dGVybjsKLSAgQ0ZYX0RJQml0bWFwKiBiaXRtYXAgPSBtX3JlbmRlckRldmljZS0+R2V0Qml0bWFwKCk7Ci0gIGludDMyX3Qgd2lkdGggPSBiaXRtYXAtPkdldFdpZHRoKCk7Ci0gIGludDMyX3QgaGVpZ2h0ID0gYml0bWFwLT5HZXRIZWlnaHQoKTsKLSAgQ0ZYX0RJQml0bWFwIGJtcDsKLSAgYm1wLkNyZWF0ZSh3aWR0aCwgaGVpZ2h0LCBGWERJQl9BcmdiKTsKLSAgbV9yZW5kZXJEZXZpY2UtPkdldERJQml0cygmYm1wLCAwLCAwKTsKLQotICBGWF9IYXRjaFN0eWxlIGhhdGNoU3R5bGUgPSBtX2luZm8uZmlsbENvbG9yLT5tX2luZm8ucGF0dGVybi0+bV9oYXRjaFN0eWxlOwotICBjb25zdCBGWF9IQVRDSERBVEEmIGRhdGEgPSBoYXRjaEJpdG1hcERhdGFbc3RhdGljX2Nhc3Q8aW50PihoYXRjaFN0eWxlKV07Ci0KLSAgQ0ZYX0RJQml0bWFwIG1hc2s7Ci0gIG1hc2suQ3JlYXRlKGRhdGEud2lkdGgsIGRhdGEuaGVpZ2h0LCBGWERJQl8xYnBwTWFzayk7Ci0gIEZYU1lTX21lbWNweShtYXNrLkdldEJ1ZmZlcigpLCBkYXRhLm1hc2tCaXRzLCBtYXNrLkdldFBpdGNoKCkgKiBkYXRhLmhlaWdodCk7Ci0gIENGWF9GbG9hdFJlY3QgcmVjdGYgPSBwYXRoLT5HZXRQYXRoRGF0YSgpLT5HZXRCb3VuZGluZ0JveCgpOwotICBpZiAobWF0cml4KQotICAgIG1hdHJpeC0+VHJhbnNmb3JtUmVjdChyZWN0Zik7Ci0KLSAgRlhfUkVDVCByZWN0KEZYU1lTX3JvdW5kKHJlY3RmLmxlZnQpLCBGWFNZU19yb3VuZChyZWN0Zi50b3ApLAotICAgICAgICAgICAgICAgRlhTWVNfcm91bmQocmVjdGYucmlnaHQpLCBGWFNZU19yb3VuZChyZWN0Zi5ib3R0b20pKTsKLSAgQ0ZYX0Z4Z2VEZXZpY2UgZGV2aWNlOwotICBkZXZpY2UuQXR0YWNoKCZibXAsIGZhbHNlLCBudWxscHRyLCBmYWxzZSk7Ci0gIGRldmljZS5GaWxsUmVjdCgmcmVjdCwgbV9pbmZvLmZpbGxDb2xvci0+bV9pbmZvLnBhdHRlcm4tPm1fYmFja0FyZ2IpOwotICBmb3IgKGludDMyX3QgaiA9IHJlY3QuYm90dG9tOyBqIDwgcmVjdC50b3A7IGogKz0gbWFzay5HZXRIZWlnaHQoKSkgewotICAgIGZvciAoaW50MzJfdCBpID0gcmVjdC5sZWZ0OyBpIDwgcmVjdC5yaWdodDsgaSArPSBtYXNrLkdldFdpZHRoKCkpIHsKLSAgICAgIGRldmljZS5TZXRCaXRNYXNrKCZtYXNrLCBpLCBqLAotICAgICAgICAgICAgICAgICAgICAgICAgbV9pbmZvLmZpbGxDb2xvci0+bV9pbmZvLnBhdHRlcm4tPm1fZm9yZUFyZ2IpOwotICAgIH0KLSAgfQotCi0gIG1fcmVuZGVyRGV2aWNlLT5TYXZlU3RhdGUoKTsKLSAgbV9yZW5kZXJEZXZpY2UtPlNldENsaXBfUGF0aEZpbGwocGF0aC0+R2V0UGF0aERhdGEoKSwgbWF0cml4LCBmaWxsTW9kZSk7Ci0gIFNldERJQml0c1dpdGhNYXRyaXgoJmJtcCwgJnBhdHRlcm4tPm1fbWF0cml4KTsKLSAgbV9yZW5kZXJEZXZpY2UtPlJlc3RvcmVTdGF0ZShmYWxzZSk7Ci19Ci0KLXZvaWQgQ0ZYX0dyYXBoaWNzOjpGaWxsUGF0aFdpdGhTaGFkaW5nKENGWF9QYXRoKiBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRmlsbE1vZGUgZmlsbE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXgpIHsKLSAgQ0ZYX0RJQml0bWFwKiBiaXRtYXAgPSBtX3JlbmRlckRldmljZS0+R2V0Qml0bWFwKCk7Ci0gIGludDMyX3Qgd2lkdGggPSBiaXRtYXAtPkdldFdpZHRoKCk7Ci0gIGludDMyX3QgaGVpZ2h0ID0gYml0bWFwLT5HZXRIZWlnaHQoKTsKLSAgRlhfRkxPQVQgc3RhcnRfeCA9IG1faW5mby5maWxsQ29sb3ItPm1fc2hhZGluZy0+bV9iZWdpblBvaW50Lng7Ci0gIEZYX0ZMT0FUIHN0YXJ0X3kgPSBtX2luZm8uZmlsbENvbG9yLT5tX3NoYWRpbmctPm1fYmVnaW5Qb2ludC55OwotICBGWF9GTE9BVCBlbmRfeCA9IG1faW5mby5maWxsQ29sb3ItPm1fc2hhZGluZy0+bV9lbmRQb2ludC54OwotICBGWF9GTE9BVCBlbmRfeSA9IG1faW5mby5maWxsQ29sb3ItPm1fc2hhZGluZy0+bV9lbmRQb2ludC55OwotICBDRlhfRElCaXRtYXAgYm1wOwotICBibXAuQ3JlYXRlKHdpZHRoLCBoZWlnaHQsIEZYRElCX0FyZ2IpOwotICBtX3JlbmRlckRldmljZS0+R2V0RElCaXRzKCZibXAsIDAsIDApOwotICBpbnQzMl90IHBpdGNoID0gYm1wLkdldFBpdGNoKCk7Ci0gIGJvb2wgcmVzdWx0ID0gZmFsc2U7Ci0gIHN3aXRjaCAobV9pbmZvLmZpbGxDb2xvci0+bV9zaGFkaW5nLT5tX3R5cGUpIHsKLSAgICBjYXNlIEZYX1NIQURJTkdfQXhpYWw6IHsKLSAgICAgIEZYX0ZMT0FUIHhfc3BhbiA9IGVuZF94IC0gc3RhcnRfeDsKLSAgICAgIEZYX0ZMT0FUIHlfc3BhbiA9IGVuZF95IC0gc3RhcnRfeTsKLSAgICAgIEZYX0ZMT0FUIGF4aXNfbGVuX3NxdWFyZSA9ICh4X3NwYW4gKiB4X3NwYW4pICsgKHlfc3BhbiAqIHlfc3Bhbik7Ci0gICAgICBmb3IgKGludDMyX3Qgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgewotICAgICAgICB1aW50MzJfdCogZGliX2J1ZiA9ICh1aW50MzJfdCopKGJtcC5HZXRCdWZmZXIoKSArIHJvdyAqIHBpdGNoKTsKLSAgICAgICAgZm9yIChpbnQzMl90IGNvbHVtbiA9IDA7IGNvbHVtbiA8IHdpZHRoOyBjb2x1bW4rKykgewotICAgICAgICAgIEZYX0ZMT0FUIHggPSAoRlhfRkxPQVQpKGNvbHVtbik7Ci0gICAgICAgICAgRlhfRkxPQVQgeSA9IChGWF9GTE9BVCkocm93KTsKLSAgICAgICAgICBGWF9GTE9BVCBzY2FsZSA9Ci0gICAgICAgICAgICAgICgoKHggLSBzdGFydF94KSAqIHhfc3BhbikgKyAoKHkgLSBzdGFydF95KSAqIHlfc3BhbikpIC8KLSAgICAgICAgICAgICAgYXhpc19sZW5fc3F1YXJlOwotICAgICAgICAgIGlmIChzY2FsZSA8IDApIHsKLSAgICAgICAgICAgIGlmICghbV9pbmZvLmZpbGxDb2xvci0+bV9zaGFkaW5nLT5tX2lzRXh0ZW5kZWRCZWdpbikgewotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNjYWxlID0gMDsKLSAgICAgICAgICB9IGVsc2UgaWYgKHNjYWxlID4gMS4wZikgewotICAgICAgICAgICAgaWYgKCFtX2luZm8uZmlsbENvbG9yLT5tX3NoYWRpbmctPm1faXNFeHRlbmRlZEVuZCkgewotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNjYWxlID0gMS4wZjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaW50MzJfdCBpbmRleCA9IChpbnQzMl90KShzY2FsZSAqIChGWF9TSEFESU5HX1N0ZXBzIC0gMSkpOwotICAgICAgICAgIGRpYl9idWZbY29sdW1uXSA9IG1faW5mby5maWxsQ29sb3ItPm1fc2hhZGluZy0+bV9hcmdiQXJyYXlbaW5kZXhdOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRlhfU0hBRElOR19SYWRpYWw6IHsKLSAgICAgIEZYX0ZMT0FUIHN0YXJ0X3IgPSBtX2luZm8uZmlsbENvbG9yLT5tX3NoYWRpbmctPm1fYmVnaW5SYWRpdXM7Ci0gICAgICBGWF9GTE9BVCBlbmRfciA9IG1faW5mby5maWxsQ29sb3ItPm1fc2hhZGluZy0+bV9lbmRSYWRpdXM7Ci0gICAgICBGWF9GTE9BVCBhID0gKChzdGFydF94IC0gZW5kX3gpICogKHN0YXJ0X3ggLSBlbmRfeCkpICsKLSAgICAgICAgICAgICAgICAgICAoKHN0YXJ0X3kgLSBlbmRfeSkgKiAoc3RhcnRfeSAtIGVuZF95KSkgLQotICAgICAgICAgICAgICAgICAgICgoc3RhcnRfciAtIGVuZF9yKSAqIChzdGFydF9yIC0gZW5kX3IpKTsKLSAgICAgIGZvciAoaW50MzJfdCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7Ci0gICAgICAgIHVpbnQzMl90KiBkaWJfYnVmID0gKHVpbnQzMl90KikoYm1wLkdldEJ1ZmZlcigpICsgcm93ICogcGl0Y2gpOwotICAgICAgICBmb3IgKGludDMyX3QgY29sdW1uID0gMDsgY29sdW1uIDwgd2lkdGg7IGNvbHVtbisrKSB7Ci0gICAgICAgICAgRlhfRkxPQVQgeCA9IChGWF9GTE9BVCkoY29sdW1uKTsKLSAgICAgICAgICBGWF9GTE9BVCB5ID0gKEZYX0ZMT0FUKShyb3cpOwotICAgICAgICAgIEZYX0ZMT0FUIGIgPSAtMiAqICgoKHggLSBzdGFydF94KSAqIChlbmRfeCAtIHN0YXJ0X3gpKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoeSAtIHN0YXJ0X3kpICogKGVuZF95IC0gc3RhcnRfeSkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXJ0X3IgKiAoZW5kX3IgLSBzdGFydF9yKSkpOwotICAgICAgICAgIEZYX0ZMT0FUIGMgPSAoKHggLSBzdGFydF94KSAqICh4IC0gc3RhcnRfeCkpICsKLSAgICAgICAgICAgICAgICAgICAgICAgKCh5IC0gc3RhcnRfeSkgKiAoeSAtIHN0YXJ0X3kpKSAtIChzdGFydF9yICogc3RhcnRfcik7Ci0gICAgICAgICAgRlhfRkxPQVQgczsKLSAgICAgICAgICBpZiAoYSA9PSAwKSB7Ci0gICAgICAgICAgICBzID0gLWMgLyBiOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGWF9GTE9BVCBiMl80YWMgPSAoYiAqIGIpIC0gNCAqIChhICogYyk7Ci0gICAgICAgICAgICBpZiAoYjJfNGFjIDwgMCkgewotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZYX0ZMT0FUIHJvb3QgPSAoRlhTWVNfc3FydChiMl80YWMpKTsKLSAgICAgICAgICAgIEZYX0ZMT0FUIHMxLCBzMjsKLSAgICAgICAgICAgIGlmIChhID4gMCkgewotICAgICAgICAgICAgICBzMSA9ICgtYiAtIHJvb3QpIC8gKDIgKiBhKTsKLSAgICAgICAgICAgICAgczIgPSAoLWIgKyByb290KSAvICgyICogYSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBzMiA9ICgtYiAtIHJvb3QpIC8gKDIgKiBhKTsKLSAgICAgICAgICAgICAgczEgPSAoLWIgKyByb290KSAvICgyICogYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoczIgPD0gMS4wZiB8fCBtX2luZm8uZmlsbENvbG9yLT5tX3NoYWRpbmctPm1faXNFeHRlbmRlZEVuZCkgewotICAgICAgICAgICAgICBzID0gKHMyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIHMgPSAoczEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChzdGFydF9yKSArIHMgKiAoZW5kX3IgLSBzdGFydF9yKSA8IDApIHsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChzIDwgMCkgewotICAgICAgICAgICAgaWYgKCFtX2luZm8uZmlsbENvbG9yLT5tX3NoYWRpbmctPm1faXNFeHRlbmRlZEJlZ2luKSB7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcyA9IDA7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChzID4gMS4wZikgewotICAgICAgICAgICAgaWYgKCFtX2luZm8uZmlsbENvbG9yLT5tX3NoYWRpbmctPm1faXNFeHRlbmRlZEVuZCkgewotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHMgPSAxLjBmOwotICAgICAgICAgIH0KLSAgICAgICAgICBpbnQgaW5kZXggPSAoaW50MzJfdCkocyAqIChGWF9TSEFESU5HX1N0ZXBzIC0gMSkpOwotICAgICAgICAgIGRpYl9idWZbY29sdW1uXSA9IG1faW5mby5maWxsQ29sb3ItPm1fc2hhZGluZy0+bV9hcmdiQXJyYXlbaW5kZXhdOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6IHsKLSAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmIChyZXN1bHQpIHsKLSAgICBtX3JlbmRlckRldmljZS0+U2F2ZVN0YXRlKCk7Ci0gICAgbV9yZW5kZXJEZXZpY2UtPlNldENsaXBfUGF0aEZpbGwocGF0aC0+R2V0UGF0aERhdGEoKSwgbWF0cml4LCBmaWxsTW9kZSk7Ci0gICAgU2V0RElCaXRzV2l0aE1hdHJpeCgmYm1wLCBtYXRyaXgpOwotICAgIG1fcmVuZGVyRGV2aWNlLT5SZXN0b3JlU3RhdGUoZmFsc2UpOwotICB9Ci19Ci0KLXZvaWQgQ0ZYX0dyYXBoaWNzOjpTZXRESUJpdHNXaXRoTWF0cml4KENGWF9ESUJTb3VyY2UqIHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCkgewotICBpZiAobWF0cml4LT5Jc0lkZW50aXR5KCkpIHsKLSAgICBtX3JlbmRlckRldmljZS0+U2V0RElCaXRzKHNvdXJjZSwgMCwgMCk7Ci0gIH0gZWxzZSB7Ci0gICAgQ0ZYX01hdHJpeCBtKChGWF9GTE9BVClzb3VyY2UtPkdldFdpZHRoKCksIDAsIDAsCi0gICAgICAgICAgICAgICAgIChGWF9GTE9BVClzb3VyY2UtPkdldEhlaWdodCgpLCAwLCAwKTsKLSAgICBtLkNvbmNhdCgqbWF0cml4KTsKLSAgICBpbnQzMl90IGxlZnQ7Ci0gICAgaW50MzJfdCB0b3A7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPENGWF9ESUJpdG1hcD4gYm1wMSA9IHNvdXJjZS0+RmxpcEltYWdlKGZhbHNlLCB0cnVlKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q0ZYX0RJQml0bWFwPiBibXAyID0gYm1wMS0+VHJhbnNmb3JtVG8oJm0sIGxlZnQsIHRvcCk7Ci0gICAgbV9yZW5kZXJEZXZpY2UtPlNldERJQml0cyhibXAyLmdldCgpLCBsZWZ0LCB0b3ApOwotICB9Ci19Ci0KLUNGWF9HcmFwaGljczo6VEluZm86OlRJbmZvKCkKLSAgICA6IGlzQWN0T25EYXNoKGZhbHNlKSwgc3Ryb2tlQ29sb3IobnVsbHB0ciksIGZpbGxDb2xvcihudWxscHRyKSB7fQotCi1DRlhfR3JhcGhpY3M6OlRJbmZvOjpUSW5mbyhjb25zdCBUSW5mbyYgaW5mbykKLSAgICA6IGdyYXBoU3RhdGUoaW5mby5ncmFwaFN0YXRlKSwKLSAgICAgIENUTShpbmZvLkNUTSksCi0gICAgICBpc0FjdE9uRGFzaChpbmZvLmlzQWN0T25EYXNoKSwKLSAgICAgIHN0cm9rZUNvbG9yKGluZm8uc3Ryb2tlQ29sb3IpLAotICAgICAgZmlsbENvbG9yKGluZm8uZmlsbENvbG9yKSB7fQotCi1DRlhfR3JhcGhpY3M6OlRJbmZvJiBDRlhfR3JhcGhpY3M6OlRJbmZvOjpvcGVyYXRvcj0oY29uc3QgVEluZm8mIG90aGVyKSB7Ci0gIGdyYXBoU3RhdGUuQ29weShvdGhlci5ncmFwaFN0YXRlKTsKLSAgQ1RNID0gb3RoZXIuQ1RNOwotICBpc0FjdE9uRGFzaCA9IG90aGVyLmlzQWN0T25EYXNoOwotICBzdHJva2VDb2xvciA9IG90aGVyLnN0cm9rZUNvbG9yOwotICBmaWxsQ29sb3IgPSBvdGhlci5maWxsQ29sb3I7Ci0gIHJldHVybiAqdGhpczsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGdyYXBoaWNzL2NmeF9ncmFwaGljcy5oIGIveGZhL2Z4Z3JhcGhpY3MvY2Z4X2dyYXBoaWNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxOGY4ZWIuLjAwMDAwMDAKLS0tIGEveGZhL2Z4Z3JhcGhpY3MvY2Z4X2dyYXBoaWNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEdSQVBISUNTX0NGWF9HUkFQSElDU19IXwotI2RlZmluZSBYRkFfRlhHUkFQSElDU19DRlhfR1JBUEhJQ1NfSF8KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZnhnZWRldmljZS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfZ3JhcGhzdGF0ZWRhdGEuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9meF9kaWIuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Z2UvZnhfZm9udC5oIgotCi1jbGFzcyBDRlhfQ29sb3I7Ci1jbGFzcyBDRlhfUGF0aDsKLQotdXNpbmcgRlhfRmlsbE1vZGUgPSBpbnQzMl90OwotCi1lbnVtIEZYX0Rhc2hTdHlsZSB7Ci0gIEZYX0RBU0hTVFlMRV9Tb2xpZCA9IDAsCi0gIEZYX0RBU0hTVFlMRV9EYXNoID0gMSwKLSAgRlhfREFTSFNUWUxFX0RvdCA9IDIsCi0gIEZYX0RBU0hTVFlMRV9EYXNoRG90ID0gMywKLSAgRlhfREFTSFNUWUxFX0Rhc2hEb3REb3QgPSA0Ci19OwotCi1lbnVtIGNsYXNzIEZYX0hhdGNoU3R5bGUgewotICBIb3Jpem9udGFsID0gMCwKLSAgVmVydGljYWwgPSAxLAotICBGb3J3YXJkRGlhZ29uYWwgPSAyLAotICBCYWNrd2FyZERpYWdvbmFsID0gMywKLSAgQ3Jvc3MgPSA0LAotICBEaWFnb25hbENyb3NzID0gNQotfTsKLQotY2xhc3MgQ0ZYX1JlbmRlckRldmljZTsKLQotY2xhc3MgQ0ZYX0dyYXBoaWNzIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IENGWF9HcmFwaGljcyhDRlhfUmVuZGVyRGV2aWNlKiByZW5kZXJEZXZpY2UpOwotICB+Q0ZYX0dyYXBoaWNzKCk7Ci0KLSAgdm9pZCBTYXZlR3JhcGhTdGF0ZSgpOwotICB2b2lkIFJlc3RvcmVHcmFwaFN0YXRlKCk7Ci0KLSAgQ0ZYX1JlY3RGIEdldENsaXBSZWN0KCkgY29uc3Q7Ci0gIENGWF9NYXRyaXgqIEdldE1hdHJpeCgpOwotICBDRlhfUmVuZGVyRGV2aWNlKiBHZXRSZW5kZXJEZXZpY2UoKTsKLQotICB2b2lkIFNldExpbmVDYXAoQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwIGxpbmVDYXApOwotICB2b2lkIFNldExpbmVEYXNoKEZYX0ZMT0FUIGRhc2hQaGFzZSwgRlhfRkxPQVQqIGRhc2hBcnJheSwgaW50MzJfdCBkYXNoQ291bnQpOwotICB2b2lkIFNldExpbmVEYXNoKEZYX0Rhc2hTdHlsZSBkYXNoU3R5bGUpOwotICB2b2lkIFNldExpbmVXaWR0aChGWF9GTE9BVCBsaW5lV2lkdGgsIGJvb2wgaXNBY3RPbkRhc2ggPSBmYWxzZSk7Ci0gIHZvaWQgU2V0U3Ryb2tlQ29sb3IoQ0ZYX0NvbG9yKiBjb2xvcik7Ci0gIHZvaWQgU2V0RmlsbENvbG9yKENGWF9Db2xvciogY29sb3IpOwotICB2b2lkIFNldENsaXBSZWN0KGNvbnN0IENGWF9SZWN0RiYgcmVjdCk7Ci0gIHZvaWQgU3Ryb2tlUGF0aChDRlhfUGF0aCogcGF0aCwgQ0ZYX01hdHJpeCogbWF0cml4ID0gbnVsbHB0cik7Ci0gIHZvaWQgRmlsbFBhdGgoQ0ZYX1BhdGgqIHBhdGgsCi0gICAgICAgICAgICAgICAgRlhfRmlsbE1vZGUgZmlsbE1vZGUgPSBGWEZJTExfV0lORElORywKLSAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXggPSBudWxscHRyKTsKLSAgdm9pZCBTdHJldGNoSW1hZ2UoQ0ZYX0RJQlNvdXJjZSogc291cmNlLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsCi0gICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCA9IG51bGxwdHIpOwotICB2b2lkIENvbmNhdE1hdHJpeChjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgpOwotCi0gcHJvdGVjdGVkOgotICBpbnQzMl90IG1fdHlwZTsKLQotIHByaXZhdGU6Ci0gIHN0cnVjdCBUSW5mbyB7Ci0gICAgVEluZm8oKTsKLSAgICBleHBsaWNpdCBUSW5mbyhjb25zdCBUSW5mbyYgaW5mbyk7Ci0gICAgVEluZm8mIG9wZXJhdG9yPShjb25zdCBUSW5mbyYgb3RoZXIpOwotCi0gICAgQ0ZYX0dyYXBoU3RhdGVEYXRhIGdyYXBoU3RhdGU7Ci0gICAgQ0ZYX01hdHJpeCBDVE07Ci0gICAgYm9vbCBpc0FjdE9uRGFzaDsKLSAgICBDRlhfQ29sb3IqIHN0cm9rZUNvbG9yOwotICAgIENGWF9Db2xvciogZmlsbENvbG9yOwotICB9IG1faW5mbzsKLQotICB2b2lkIFJlbmRlckRldmljZVNldExpbmVEYXNoKEZYX0Rhc2hTdHlsZSBkYXNoU3R5bGUpOwotICB2b2lkIFJlbmRlckRldmljZVN0cm9rZVBhdGgoQ0ZYX1BhdGgqIHBhdGgsIENGWF9NYXRyaXgqIG1hdHJpeCk7Ci0gIHZvaWQgUmVuZGVyRGV2aWNlRmlsbFBhdGgoQ0ZYX1BhdGgqIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRmlsbE1vZGUgZmlsbE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4KTsKLSAgdm9pZCBSZW5kZXJEZXZpY2VTdHJldGNoSW1hZ2UoQ0ZYX0RJQlNvdXJjZSogc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUmVjdEYmIHJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCk7Ci0KLSAgdm9pZCBGaWxsUGF0aFdpdGhQYXR0ZXJuKENGWF9QYXRoKiBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRmlsbE1vZGUgZmlsbE1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXgpOwotICB2b2lkIEZpbGxQYXRoV2l0aFNoYWRpbmcoQ0ZYX1BhdGgqIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GaWxsTW9kZSBmaWxsTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENGWF9NYXRyaXgqIG1hdHJpeCk7Ci0KLSAgdm9pZCBTZXRESUJpdHNXaXRoTWF0cml4KENGWF9ESUJTb3VyY2UqIHNvdXJjZSwgQ0ZYX01hdHJpeCogbWF0cml4KTsKLQotICBDRlhfUmVuZGVyRGV2aWNlKiBtX3JlbmRlckRldmljZTsKLSAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRJbmZvPj4gbV9pbmZvU3RhY2s7Ci19OwotCi0jZW5kaWYgIC8vIFhGQV9GWEdSQVBISUNTX0NGWF9HUkFQSElDU19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4Z3JhcGhpY3MvY2Z4X3BhdGguY3BwIGIveGZhL2Z4Z3JhcGhpY3MvY2Z4X3BhdGguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTZlYjEzLi4wMDAwMDAwCi0tLSBhL3hmYS9meGdyYXBoaWNzL2NmeF9wYXRoLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfcGF0aC5oIgotCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L2Jhc2UvcHRyX3V0aWwuaCIKLQotQ0ZYX1BhdGg6OkNGWF9QYXRoKCkge30KLQotQ0ZYX1BhdGg6On5DRlhfUGF0aCgpIHt9Ci0KLXZvaWQgQ0ZYX1BhdGg6OkNsZWFyKCkgewotICBkYXRhXy5DbGVhcigpOwotfQotCi12b2lkIENGWF9QYXRoOjpDbG9zZSgpIHsKLSAgZGF0YV8uQ2xvc2VQYXRoKCk7Ci19Ci0KLXZvaWQgQ0ZYX1BhdGg6Ok1vdmVUbyhjb25zdCBDRlhfUG9pbnRGJiBwb2ludCkgewotICBkYXRhXy5BcHBlbmRQb2ludChwb2ludCwgRlhQVF9UWVBFOjpNb3ZlVG8sIGZhbHNlKTsKLX0KLQotdm9pZCBDRlhfUGF0aDo6TGluZVRvKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7Ci0gIGRhdGFfLkFwcGVuZFBvaW50KHBvaW50LCBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOwotfQotCi12b2lkIENGWF9QYXRoOjpCZXppZXJUbyhjb25zdCBDRlhfUG9pbnRGJiBjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIGMyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgdG8pIHsKLSAgZGF0YV8uQXBwZW5kUG9pbnQoYzEsIEZYUFRfVFlQRTo6QmV6aWVyVG8sIGZhbHNlKTsKLSAgZGF0YV8uQXBwZW5kUG9pbnQoYzIsIEZYUFRfVFlQRTo6QmV6aWVyVG8sIGZhbHNlKTsKLSAgZGF0YV8uQXBwZW5kUG9pbnQodG8sIEZYUFRfVFlQRTo6QmV6aWVyVG8sIGZhbHNlKTsKLX0KLQotdm9pZCBDRlhfUGF0aDo6QXJjVG8oY29uc3QgQ0ZYX1BvaW50RiYgcG9zLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1NpemVGJiBzaXplLAotICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRfYW5nbGUsCi0gICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcF9hbmdsZSkgewotICBDRlhfU2l6ZUYgbmV3X3NpemUgPSBzaXplIC8gMi4wZjsKLSAgQXJjVG9JbnRlcm5hbChDRlhfUG9pbnRGKHBvcy54ICsgbmV3X3NpemUud2lkdGgsIHBvcy55ICsgbmV3X3NpemUuaGVpZ2h0KSwKLSAgICAgICAgICAgICAgICBuZXdfc2l6ZSwgc3RhcnRfYW5nbGUsIHN3ZWVwX2FuZ2xlKTsKLX0KLQotdm9pZCBDRlhfUGF0aDo6QXJjVG9JbnRlcm5hbChjb25zdCBDRlhfUG9pbnRGJiBwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9TaXplRiYgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRfYW5nbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN3ZWVwX2FuZ2xlKSB7Ci0gIEZYX0ZMT0FUIHgwID0gRlhTWVNfY29zKHN3ZWVwX2FuZ2xlIC8gMik7Ci0gIEZYX0ZMT0FUIHkwID0gRlhTWVNfc2luKHN3ZWVwX2FuZ2xlIC8gMik7Ci0gIEZYX0ZMT0FUIHR4ID0gKCgxLjBmIC0geDApICogNCkgLyAoMyAqIDEuMGYpOwotICBGWF9GTE9BVCB0eSA9IHkwIC0gKCh0eCAqIHgwKSAvIHkwKTsKLQotICBDRlhfUG9pbnRGIHBvaW50c1tdID0ge0NGWF9Qb2ludEYoeDAgKyB0eCwgLXR5KSwgQ0ZYX1BvaW50Rih4MCArIHR4LCB0eSl9OwotICBGWF9GTE9BVCBzbiA9IEZYU1lTX3NpbihzdGFydF9hbmdsZSArIHN3ZWVwX2FuZ2xlIC8gMik7Ci0gIEZYX0ZMT0FUIGNzID0gRlhTWVNfY29zKHN0YXJ0X2FuZ2xlICsgc3dlZXBfYW5nbGUgLyAyKTsKLQotICBDRlhfUG9pbnRGIGJlemllcjsKLSAgYmV6aWVyLnggPSBwb3MueCArIChzaXplLndpZHRoICogKChwb2ludHNbMF0ueCAqIGNzKSAtIChwb2ludHNbMF0ueSAqIHNuKSkpOwotICBiZXppZXIueSA9IHBvcy55ICsgKHNpemUuaGVpZ2h0ICogKChwb2ludHNbMF0ueCAqIHNuKSArIChwb2ludHNbMF0ueSAqIGNzKSkpOwotICBkYXRhXy5BcHBlbmRQb2ludChiZXppZXIsIEZYUFRfVFlQRTo6QmV6aWVyVG8sIGZhbHNlKTsKLQotICBiZXppZXIueCA9IHBvcy54ICsgKHNpemUud2lkdGggKiAoKHBvaW50c1sxXS54ICogY3MpIC0gKHBvaW50c1sxXS55ICogc24pKSk7Ci0gIGJlemllci55ID0gcG9zLnkgKyAoc2l6ZS5oZWlnaHQgKiAoKHBvaW50c1sxXS54ICogc24pICsgKHBvaW50c1sxXS55ICogY3MpKSk7Ci0gIGRhdGFfLkFwcGVuZFBvaW50KGJlemllciwgRlhQVF9UWVBFOjpCZXppZXJUbywgZmFsc2UpOwotCi0gIGJlemllci54ID0gcG9zLnggKyAoc2l6ZS53aWR0aCAqIEZYU1lTX2NvcyhzdGFydF9hbmdsZSArIHN3ZWVwX2FuZ2xlKSk7Ci0gIGJlemllci55ID0gcG9zLnkgKyAoc2l6ZS5oZWlnaHQgKiBGWFNZU19zaW4oc3RhcnRfYW5nbGUgKyBzd2VlcF9hbmdsZSkpOwotICBkYXRhXy5BcHBlbmRQb2ludChiZXppZXIsIEZYUFRfVFlQRTo6QmV6aWVyVG8sIGZhbHNlKTsKLX0KLQotdm9pZCBDRlhfUGF0aDo6QWRkTGluZShjb25zdCBDRlhfUG9pbnRGJiBwMSwgY29uc3QgQ0ZYX1BvaW50RiYgcDIpIHsKLSAgZGF0YV8uQXBwZW5kUG9pbnQocDEsIEZYUFRfVFlQRTo6TW92ZVRvLCBmYWxzZSk7Ci0gIGRhdGFfLkFwcGVuZFBvaW50KHAyLCBGWFBUX1RZUEU6OkxpbmVUbywgZmFsc2UpOwotfQotCi12b2lkIENGWF9QYXRoOjpBZGRSZWN0YW5nbGUoRlhfRkxPQVQgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0KSB7Ci0gIGRhdGFfLkFwcGVuZFJlY3QobGVmdCwgdG9wLCBsZWZ0ICsgd2lkdGgsIHRvcCArIGhlaWdodCk7Ci19Ci0KLXZvaWQgQ0ZYX1BhdGg6OkFkZEVsbGlwc2UoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KSB7Ci0gIEFkZEFyYyhyZWN0LlRvcExlZnQoKSwgcmVjdC5TaXplKCksIDAsIEZYX1BJICogMik7Ci19Ci0KLXZvaWQgQ0ZYX1BhdGg6OkFkZEFyYyhjb25zdCBDRlhfUG9pbnRGJiBvcmlnaW5hbF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1NpemVGJiBvcmlnaW5hbF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X2FuZ2xlLAotICAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN3ZWVwX2FuZ2xlKSB7Ci0gIGlmIChzd2VlcF9hbmdsZSA9PSAwKQotICAgIHJldHVybjsKLQotICBjb25zdCBGWF9GTE9BVCBiZXppZXJfYXJjX2FuZ2xlX2Vwc2lsb24gPSAwLjAxZjsKLSAgd2hpbGUgKHN0YXJ0X2FuZ2xlID4gRlhfUEkgKiAyKQotICAgIHN0YXJ0X2FuZ2xlIC09IEZYX1BJICogMjsKLSAgd2hpbGUgKHN0YXJ0X2FuZ2xlIDwgMCkKLSAgICBzdGFydF9hbmdsZSArPSBGWF9QSSAqIDI7Ci0gIGlmIChzd2VlcF9hbmdsZSA+PSBGWF9QSSAqIDIpCi0gICAgc3dlZXBfYW5nbGUgPSBGWF9QSSAqIDI7Ci0gIGlmIChzd2VlcF9hbmdsZSA8PSAtRlhfUEkgKiAyKQotICAgIHN3ZWVwX2FuZ2xlID0gLUZYX1BJICogMjsKLQotICBDRlhfU2l6ZUYgc2l6ZSA9IG9yaWdpbmFsX3NpemUgLyAyOwotICBDRlhfUG9pbnRGIHBvcyhvcmlnaW5hbF9wb3MueCArIHNpemUud2lkdGgsIG9yaWdpbmFsX3Bvcy55ICsgc2l6ZS5oZWlnaHQpOwotICBkYXRhXy5BcHBlbmRQb2ludChwb3MgKyBDRlhfUG9pbnRGKHNpemUud2lkdGggKiBGWFNZU19jb3Moc3RhcnRfYW5nbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUuaGVpZ2h0ICogRlhTWVNfc2luKHN0YXJ0X2FuZ2xlKSksCi0gICAgICAgICAgICAgICAgICAgIEZYUFRfVFlQRTo6TW92ZVRvLCBmYWxzZSk7Ci0KLSAgRlhfRkxPQVQgdG90YWxfc3dlZXAgPSAwOwotICBGWF9GTE9BVCBsb2NhbF9zd2VlcCA9IDA7Ci0gIEZYX0ZMT0FUIHByZXZfc3dlZXAgPSAwOwotICBib29sIGRvbmUgPSBmYWxzZTsKLSAgZG8gewotICAgIGlmIChzd2VlcF9hbmdsZSA8IDApIHsKLSAgICAgIHByZXZfc3dlZXAgPSB0b3RhbF9zd2VlcDsKLSAgICAgIGxvY2FsX3N3ZWVwID0gLUZYX1BJIC8gMjsKLSAgICAgIHRvdGFsX3N3ZWVwIC09IEZYX1BJIC8gMjsKLSAgICAgIGlmICh0b3RhbF9zd2VlcCA8PSBzd2VlcF9hbmdsZSArIGJlemllcl9hcmNfYW5nbGVfZXBzaWxvbikgewotICAgICAgICBsb2NhbF9zd2VlcCA9IHN3ZWVwX2FuZ2xlIC0gcHJldl9zd2VlcDsKLSAgICAgICAgZG9uZSA9IHRydWU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByZXZfc3dlZXAgPSB0b3RhbF9zd2VlcDsKLSAgICAgIGxvY2FsX3N3ZWVwID0gRlhfUEkgLyAyOwotICAgICAgdG90YWxfc3dlZXAgKz0gRlhfUEkgLyAyOwotICAgICAgaWYgKHRvdGFsX3N3ZWVwID49IHN3ZWVwX2FuZ2xlIC0gYmV6aWVyX2FyY19hbmdsZV9lcHNpbG9uKSB7Ci0gICAgICAgIGxvY2FsX3N3ZWVwID0gc3dlZXBfYW5nbGUgLSBwcmV2X3N3ZWVwOwotICAgICAgICBkb25lID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBBcmNUb0ludGVybmFsKHBvcywgc2l6ZSwgc3RhcnRfYW5nbGUsIGxvY2FsX3N3ZWVwKTsKLSAgICBzdGFydF9hbmdsZSArPSBsb2NhbF9zd2VlcDsKLSAgfSB3aGlsZSAoIWRvbmUpOwotfQotCi12b2lkIENGWF9QYXRoOjpBZGRTdWJwYXRoKENGWF9QYXRoKiBwYXRoKSB7Ci0gIGlmICghcGF0aCkKLSAgICByZXR1cm47Ci0gIGRhdGFfLkFwcGVuZCgmcGF0aC0+ZGF0YV8sIG51bGxwdHIpOwotfQotCi12b2lkIENGWF9QYXRoOjpUcmFuc2Zvcm1CeShjb25zdCBDRlhfTWF0cml4JiBtdCkgewotICBkYXRhXy5UcmFuc2Zvcm0oJm10KTsKLX0KZGlmZiAtLWdpdCBhL3hmYS9meGdyYXBoaWNzL2NmeF9wYXRoLmggYi94ZmEvZnhncmFwaGljcy9jZnhfcGF0aC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjc4MzE2Li4wMDAwMDAwCi0tLSBhL3hmYS9meGdyYXBoaWNzL2NmeF9wYXRoLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYR1JBUEhJQ1NfQ0ZYX1BBVEhfSF8KLSNkZWZpbmUgWEZBX0ZYR1JBUEhJQ1NfQ0ZYX1BBVEhfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCi0jaW5jbHVkZSAiY29yZS9meGdlL2NmeF9wYXRoZGF0YS5oIgotI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2NmeF9ncmFwaGljcy5oIgotCi1jbGFzcyBDRlhfUGF0aCBmaW5hbCB7Ci0gcHVibGljOgotICBDRlhfUGF0aCgpOwotICB+Q0ZYX1BhdGgoKTsKLQotICBjb25zdCBDRlhfUGF0aERhdGEqIEdldFBhdGhEYXRhKCkgY29uc3QgeyByZXR1cm4gJmRhdGFfOyB9Ci0KLSAgdm9pZCBDbGVhcigpOwotICBib29sIElzRW1wdHkoKSBjb25zdCB7IHJldHVybiBkYXRhXy5HZXRQb2ludHMoKS5lbXB0eSgpOyB9Ci0gIHZvaWQgVHJhbnNmb3JtQnkoY29uc3QgQ0ZYX01hdHJpeCYgbXQpOwotCi0gIHZvaWQgQ2xvc2UoKTsKLSAgdm9pZCBNb3ZlVG8oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpOwotICB2b2lkIExpbmVUbyhjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7Ci0gIHZvaWQgQmV6aWVyVG8oY29uc3QgQ0ZYX1BvaW50RiYgYzEsCi0gICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgYzIsCi0gICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgdG8pOwotICB2b2lkIEFyY1RvKGNvbnN0IENGWF9Qb2ludEYmIHBvcywKLSAgICAgICAgICAgICBjb25zdCBDRlhfU2l6ZUYmIHNpemUsCi0gICAgICAgICAgICAgRlhfRkxPQVQgc3RhcnRBbmdsZSwKLSAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcEFuZ2xlKTsKLQotICB2b2lkIEFkZExpbmUoY29uc3QgQ0ZYX1BvaW50RiYgcDEsIGNvbnN0IENGWF9Qb2ludEYmIHAyKTsKLSAgdm9pZCBBZGRSZWN0YW5nbGUoRlhfRkxPQVQgbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgdG9wLAotICAgICAgICAgICAgICAgICAgICBGWF9GTE9BVCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgaGVpZ2h0KTsKLSAgdm9pZCBBZGRFbGxpcHNlKGNvbnN0IENGWF9SZWN0RiYgcmVjdCk7Ci0gIHZvaWQgQWRkQXJjKGNvbnN0IENGWF9Qb2ludEYmIHBvcywKLSAgICAgICAgICAgICAgY29uc3QgQ0ZYX1NpemVGJiBzaXplLAotICAgICAgICAgICAgICBGWF9GTE9BVCBzdGFydEFuZ2xlLAotICAgICAgICAgICAgICBGWF9GTE9BVCBzd2VlcEFuZ2xlKTsKLQotICB2b2lkIEFkZFN1YnBhdGgoQ0ZYX1BhdGgqIHBhdGgpOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBBcmNUb0ludGVybmFsKGNvbnN0IENGWF9Qb2ludEYmIHBvcywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9TaXplRiYgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIEZYX0ZMT0FUIHN0YXJ0X2FuZ2xlLAotICAgICAgICAgICAgICAgICAgICAgRlhfRkxPQVQgc3dlZXBfYW5nbGUpOwotCi0gIENGWF9QYXRoRGF0YSBkYXRhXzsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYR1JBUEhJQ1NfQ0ZYX1BBVEhfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGdyYXBoaWNzL2NmeF9wYXR0ZXJuLmNwcCBiL3hmYS9meGdyYXBoaWNzL2NmeF9wYXR0ZXJuLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwZWMyNC4uMDAwMDAwMAotLS0gYS94ZmEvZnhncmFwaGljcy9jZnhfcGF0dGVybi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfcGF0dGVybi5oIgotCi1DRlhfUGF0dGVybjo6Q0ZYX1BhdHRlcm4oRlhfSGF0Y2hTdHlsZSBoYXRjaFN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IgZm9yZUFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQiBiYWNrQXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXgpCi0gICAgOiBtX2hhdGNoU3R5bGUoaGF0Y2hTdHlsZSksIG1fZm9yZUFyZ2IoZm9yZUFyZ2IpLCBtX2JhY2tBcmdiKGJhY2tBcmdiKSB7Ci0gIGlmIChtYXRyaXgpCi0gICAgbV9tYXRyaXggPSAqbWF0cml4OwotICBlbHNlCi0gICAgbV9tYXRyaXguU2V0SWRlbnRpdHkoKTsKLX0KLQotQ0ZYX1BhdHRlcm46On5DRlhfUGF0dGVybigpIHt9CmRpZmYgLS1naXQgYS94ZmEvZnhncmFwaGljcy9jZnhfcGF0dGVybi5oIGIveGZhL2Z4Z3JhcGhpY3MvY2Z4X3BhdHRlcm4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwMDA4YS4uMDAwMDAwMAotLS0gYS94ZmEvZnhncmFwaGljcy9jZnhfcGF0dGVybi5oCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCi0vLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQotCi0jaWZuZGVmIFhGQV9GWEdSQVBISUNTX0NGWF9QQVRURVJOX0hfCi0jZGVmaW5lIFhGQV9GWEdSQVBISUNTX0NGWF9QQVRURVJOX0hfCi0KLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCi0jaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfZ3JhcGhpY3MuaCIKLQotY2xhc3MgQ0ZYX0RJQml0bWFwOwotY2xhc3MgQ0ZYX01hdHJpeDsKLQotY2xhc3MgQ0ZYX1BhdHRlcm4gewotIHB1YmxpYzoKLSAgQ0ZYX1BhdHRlcm4oRlhfSGF0Y2hTdHlsZSBoYXRjaFN0eWxlLAotICAgICAgICAgICAgICBjb25zdCBGWF9BUkdCIGZvcmVBcmdiLAotICAgICAgICAgICAgICBjb25zdCBGWF9BUkdCIGJhY2tBcmdiLAotICAgICAgICAgICAgICBDRlhfTWF0cml4KiBtYXRyaXggPSBudWxscHRyKTsKLQotICB2aXJ0dWFsIH5DRlhfUGF0dGVybigpOwotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIENGWF9HcmFwaGljczsKLQotICBDRlhfTWF0cml4IG1fbWF0cml4OwotCi0gIGNvbnN0IEZYX0hhdGNoU3R5bGUgbV9oYXRjaFN0eWxlOwotICBjb25zdCBGWF9BUkdCIG1fZm9yZUFyZ2I7Ci0gIGNvbnN0IEZYX0FSR0IgbV9iYWNrQXJnYjsKLX07Ci0KLSNlbmRpZiAgLy8gWEZBX0ZYR1JBUEhJQ1NfQ0ZYX1BBVFRFUk5fSF8KZGlmZiAtLWdpdCBhL3hmYS9meGdyYXBoaWNzL2NmeF9zaGFkaW5nLmNwcCBiL3hmYS9meGdyYXBoaWNzL2NmeF9zaGFkaW5nLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5MzYzMC4uMDAwMDAwMAotLS0gYS94ZmEvZnhncmFwaGljcy9jZnhfc2hhZGluZy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jZnhfc2hhZGluZy5oIgotCi1DRlhfU2hhZGluZzo6Q0ZYX1NoYWRpbmcoY29uc3QgQ0ZYX1BvaW50RiYgYmVnaW5Qb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBlbmRQb2ludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRXh0ZW5kZWRCZWdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRXh0ZW5kZWRFbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQiBiZWdpbkFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQiBlbmRBcmdiKQotICAgIDogbV90eXBlKEZYX1NIQURJTkdfQXhpYWwpLAotICAgICAgbV9iZWdpblBvaW50KGJlZ2luUG9pbnQpLAotICAgICAgbV9lbmRQb2ludChlbmRQb2ludCksCi0gICAgICBtX2JlZ2luUmFkaXVzKDApLAotICAgICAgbV9lbmRSYWRpdXMoMCksCi0gICAgICBtX2lzRXh0ZW5kZWRCZWdpbihpc0V4dGVuZGVkQmVnaW4pLAotICAgICAgbV9pc0V4dGVuZGVkRW5kKGlzRXh0ZW5kZWRFbmQpLAotICAgICAgbV9iZWdpbkFyZ2IoYmVnaW5BcmdiKSwKLSAgICAgIG1fZW5kQXJnYihlbmRBcmdiKSB7Ci0gIEluaXRBcmdiQXJyYXkoKTsKLX0KLQotQ0ZYX1NoYWRpbmc6OkNGWF9TaGFkaW5nKGNvbnN0IENGWF9Qb2ludEYmIGJlZ2luUG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgZW5kUG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfRkxPQVQgYmVnaW5SYWRpdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfRkxPQVQgZW5kUmFkaXVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNFeHRlbmRlZEJlZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNFeHRlbmRlZEVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9BUkdCIGJlZ2luQXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9BUkdCIGVuZEFyZ2IpCi0gICAgOiBtX3R5cGUoRlhfU0hBRElOR19SYWRpYWwpLAotICAgICAgbV9iZWdpblBvaW50KGJlZ2luUG9pbnQpLAotICAgICAgbV9lbmRQb2ludChlbmRQb2ludCksCi0gICAgICBtX2JlZ2luUmFkaXVzKGJlZ2luUmFkaXVzKSwKLSAgICAgIG1fZW5kUmFkaXVzKGVuZFJhZGl1cyksCi0gICAgICBtX2lzRXh0ZW5kZWRCZWdpbihpc0V4dGVuZGVkQmVnaW4pLAotICAgICAgbV9pc0V4dGVuZGVkRW5kKGlzRXh0ZW5kZWRFbmQpLAotICAgICAgbV9iZWdpbkFyZ2IoYmVnaW5BcmdiKSwKLSAgICAgIG1fZW5kQXJnYihlbmRBcmdiKSB7Ci0gIEluaXRBcmdiQXJyYXkoKTsKLX0KLQotQ0ZYX1NoYWRpbmc6On5DRlhfU2hhZGluZygpIHt9Ci0KLXZvaWQgQ0ZYX1NoYWRpbmc6OkluaXRBcmdiQXJyYXkoKSB7Ci0gIGludDMyX3QgYTE7Ci0gIGludDMyX3QgcjE7Ci0gIGludDMyX3QgZzE7Ci0gIGludDMyX3QgYjE7Ci0gIEFyZ2JEZWNvZGUobV9iZWdpbkFyZ2IsIGExLCByMSwgZzEsIGIxKTsKLQotICBpbnQzMl90IGEyOwotICBpbnQzMl90IHIyOwotICBpbnQzMl90IGcyOwotICBpbnQzMl90IGIyOwotICBBcmdiRGVjb2RlKG1fZW5kQXJnYiwgYTIsIHIyLCBnMiwgYjIpOwotCi0gIEZYX0ZMT0FUIGYgPSAoRlhfRkxPQVQpKEZYX1NIQURJTkdfU3RlcHMgLSAxKTsKLSAgRlhfRkxPQVQgYVNjYWxlID0gMS4wICogKGEyIC0gYTEpIC8gZjsKLSAgRlhfRkxPQVQgclNjYWxlID0gMS4wICogKHIyIC0gcjEpIC8gZjsKLSAgRlhfRkxPQVQgZ1NjYWxlID0gMS4wICogKGcyIC0gZzEpIC8gZjsKLSAgRlhfRkxPQVQgYlNjYWxlID0gMS4wICogKGIyIC0gYjEpIC8gZjsKLQotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBGWF9TSEFESU5HX1N0ZXBzOyBpKyspIHsKLSAgICBpbnQzMl90IGEzID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaSAqIGFTY2FsZSk7Ci0gICAgaW50MzJfdCByMyA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGkgKiByU2NhbGUpOwotICAgIGludDMyX3QgZzMgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihpICogZ1NjYWxlKTsKLSAgICBpbnQzMl90IGIzID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaSAqIGJTY2FsZSk7Ci0KLSAgICAvLyBUT0RPKGRzaW5jbGFpcik6IEFkZCBvdmVybG9hZHMgZm9yIEZYX0FSR0IuIHBkZml1bTo0MzcKLSAgICBtX2FyZ2JBcnJheVtpXSA9Ci0gICAgICAgIEZYQVJHQl9UT0RJQihGWEFSR0JfTUFLRShhMSArIGEzLCByMSArIHIzLCBnMSArIGczLCBiMSArIGIzKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3hmYS9meGdyYXBoaWNzL2NmeF9zaGFkaW5nLmggYi94ZmEvZnhncmFwaGljcy9jZnhfc2hhZGluZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MTg5NTgxLi4wMDAwMDAwCi0tLSBhL3hmYS9meGdyYXBoaWNzL2NmeF9zaGFkaW5nLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLS8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCi0KLSNpZm5kZWYgWEZBX0ZYR1JBUEhJQ1NfQ0ZYX1NIQURJTkdfSF8KLSNkZWZpbmUgWEZBX0ZYR1JBUEhJQ1NfQ0ZYX1NIQURJTkdfSF8KLQotI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKLSNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgotI2luY2x1ZGUgImNvcmUvZnhnZS9meF9kaWIuaCIKLQotI2RlZmluZSBGWF9TSEFESU5HX1N0ZXBzIDI1NgotCi1lbnVtIENGWF9TaGFkaW5nX1R5cGUgeyBGWF9TSEFESU5HX0F4aWFsID0gMSwgRlhfU0hBRElOR19SYWRpYWwgfTsKLQotY2xhc3MgQ0ZYX1NoYWRpbmcgewotIHB1YmxpYzoKLSAgLy8gQXhpYWwgc2hhZGluZy4KLSAgQ0ZYX1NoYWRpbmcoY29uc3QgQ0ZYX1BvaW50RiYgYmVnaW5Qb2ludCwKLSAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgZW5kUG9pbnQsCi0gICAgICAgICAgICAgIGJvb2wgaXNFeHRlbmRlZEJlZ2luLAotICAgICAgICAgICAgICBib29sIGlzRXh0ZW5kZWRFbmQsCi0gICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IgYmVnaW5BcmdiLAotICAgICAgICAgICAgICBjb25zdCBGWF9BUkdCIGVuZEFyZ2IpOwotCi0gIC8vIFJhZGlhbCBzaGFkaW5nLgotICBDRlhfU2hhZGluZyhjb25zdCBDRlhfUG9pbnRGJiBiZWdpblBvaW50LAotICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBlbmRQb2ludCwKLSAgICAgICAgICAgICAgY29uc3QgRlhfRkxPQVQgYmVnaW5SYWRpdXMsCi0gICAgICAgICAgICAgIGNvbnN0IEZYX0ZMT0FUIGVuZFJhZGl1cywKLSAgICAgICAgICAgICAgYm9vbCBpc0V4dGVuZGVkQmVnaW4sCi0gICAgICAgICAgICAgIGJvb2wgaXNFeHRlbmRlZEVuZCwKLSAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQiBiZWdpbkFyZ2IsCi0gICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IgZW5kQXJnYik7Ci0gIHZpcnR1YWwgfkNGWF9TaGFkaW5nKCk7Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgQ0ZYX0dyYXBoaWNzOwotCi0gIHZvaWQgSW5pdEFyZ2JBcnJheSgpOwotCi0gIGNvbnN0IENGWF9TaGFkaW5nX1R5cGUgbV90eXBlOwotICBjb25zdCBDRlhfUG9pbnRGIG1fYmVnaW5Qb2ludDsKLSAgY29uc3QgQ0ZYX1BvaW50RiBtX2VuZFBvaW50OwotICBjb25zdCBGWF9GTE9BVCBtX2JlZ2luUmFkaXVzOwotICBjb25zdCBGWF9GTE9BVCBtX2VuZFJhZGl1czsKLSAgY29uc3QgYm9vbCBtX2lzRXh0ZW5kZWRCZWdpbjsKLSAgY29uc3QgYm9vbCBtX2lzRXh0ZW5kZWRFbmQ7Ci0gIGNvbnN0IEZYX0FSR0IgbV9iZWdpbkFyZ2I7Ci0gIGNvbnN0IEZYX0FSR0IgbV9lbmRBcmdiOwotICBGWF9BUkdCIG1fYXJnYkFycmF5W0ZYX1NIQURJTkdfU3RlcHNdOwotfTsKLQotI2VuZGlmICAvLyBYRkFfRlhHUkFQSElDU19DRlhfU0hBRElOR19IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZWNvbG9yLmNwcCBiL3hmYS9meGdyYXBoaWNzL2N4ZmFfZ2Vjb2xvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RjYTRhNwotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGdyYXBoaWNzL2N4ZmFfZ2Vjb2xvci5jcHAKQEAgLTAsMCArMSw0NyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZWNvbG9yLmgiCisKK0NYRkFfR0VDb2xvcjo6Q1hGQV9HRUNvbG9yKCkgOiBtX3R5cGUoSW52YWxpZCkge30KKworQ1hGQV9HRUNvbG9yOjpDWEZBX0dFQ29sb3IoY29uc3QgRlhfQVJHQiBhcmdiKSA6IG1fdHlwZShTb2xpZCksIG1fYXJnYihhcmdiKSB7CisgIG1fcG9pbnRlci5wYXR0ZXJuID0gbnVsbHB0cjsKK30KKworQ1hGQV9HRUNvbG9yOjpDWEZBX0dFQ29sb3IoQ1hGQV9HRVBhdHRlcm4qIHBhdHRlcm4sIGNvbnN0IEZYX0FSR0IgYXJnYikKKyAgICA6IG1fdHlwZShQYXR0ZXJuKSwgbV9hcmdiKGFyZ2IpIHsKKyAgbV9wb2ludGVyLnBhdHRlcm4gPSBwYXR0ZXJuOworfQorCitDWEZBX0dFQ29sb3I6OkNYRkFfR0VDb2xvcihDWEZBX0dFU2hhZGluZyogc2hhZGluZykKKyAgICA6IG1fdHlwZShTaGFkaW5nKSwgbV9hcmdiKDApIHsKKyAgbV9wb2ludGVyLnNoYWRpbmcgPSBzaGFkaW5nOworfQorCitDWEZBX0dFQ29sb3I6On5DWEZBX0dFQ29sb3IoKSB7fQorCitDWEZBX0dFQ29sb3ImIENYRkFfR0VDb2xvcjo6b3BlcmF0b3I9KGNvbnN0IENYRkFfR0VDb2xvciYgdGhhdCkgeworICBpZiAodGhpcyAhPSAmdGhhdCkgeworICAgIG1fdHlwZSA9IHRoYXQubV90eXBlOworICAgIHN3aXRjaCAobV90eXBlKSB7CisgICAgICBjYXNlIFNvbGlkOgorICAgICAgICBtX2FyZ2IgPSB0aGF0Lm1fYXJnYjsKKyAgICAgICAgbV9wb2ludGVyLnBhdHRlcm4gPSBudWxscHRyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUGF0dGVybjoKKyAgICAgICAgbV9hcmdiID0gdGhhdC5tX2FyZ2I7CisgICAgICAgIG1fcG9pbnRlci5wYXR0ZXJuID0gdGhhdC5tX3BvaW50ZXIucGF0dGVybjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNoYWRpbmc6CisgICAgICAgIG1fYXJnYiA9IDA7CisgICAgICAgIG1fcG9pbnRlci5zaGFkaW5nID0gdGhhdC5tX3BvaW50ZXIuc2hhZGluZzsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gKnRoaXM7Cit9CmRpZmYgLS1naXQgYS94ZmEvZnhncmFwaGljcy9jeGZhX2dlY29sb3IuaCBiL3hmYS9meGdyYXBoaWNzL2N4ZmFfZ2Vjb2xvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MDU4NWIKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhncmFwaGljcy9jeGZhX2dlY29sb3IuaApAQCAtMCwwICsxLDUwIEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYR1JBUEhJQ1NfQ1hGQV9HRUNPTE9SX0hfCisjZGVmaW5lIFhGQV9GWEdSQVBISUNTX0NYRkFfR0VDT0xPUl9IXworCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorCitjbGFzcyBDWEZBX0dFUGF0dGVybjsKK2NsYXNzIENYRkFfR0VTaGFkaW5nOworCitjbGFzcyBDWEZBX0dFQ29sb3IgeworIHB1YmxpYzoKKyAgZW51bSBUeXBlIHsgSW52YWxpZCwgU29saWQsIFBhdHRlcm4sIFNoYWRpbmcgfTsKKworICBDWEZBX0dFQ29sb3IoKTsKKyAgZXhwbGljaXQgQ1hGQV9HRUNvbG9yKGNvbnN0IEZYX0FSR0IgYXJnYik7CisgIGV4cGxpY2l0IENYRkFfR0VDb2xvcihDWEZBX0dFU2hhZGluZyogc2hhZGluZyk7CisgIENYRkFfR0VDb2xvcihDWEZBX0dFUGF0dGVybiogcGF0dGVybiwgY29uc3QgRlhfQVJHQiBhcmdiKTsKKyAgfkNYRkFfR0VDb2xvcigpOworCisgIFR5cGUgR2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fdHlwZTsgfQorICBGWF9BUkdCIEdldEFyZ2IoKSBjb25zdCB7CisgICAgQVNTRVJUKG1fdHlwZSA9PSBTb2xpZCB8fCBtX3R5cGUgPT0gUGF0dGVybik7CisgICAgcmV0dXJuIG1fYXJnYjsKKyAgfQorICBDWEZBX0dFUGF0dGVybiogR2V0UGF0dGVybigpIGNvbnN0IHsKKyAgICBBU1NFUlQobV90eXBlID09IFBhdHRlcm4pOworICAgIHJldHVybiBtX3BvaW50ZXIucGF0dGVybjsKKyAgfQorICBDWEZBX0dFU2hhZGluZyogR2V0U2hhZGluZygpIGNvbnN0IHsKKyAgICBBU1NFUlQobV90eXBlID09IFNoYWRpbmcpOworICAgIHJldHVybiBtX3BvaW50ZXIuc2hhZGluZzsKKyAgfQorCisgIENYRkFfR0VDb2xvciYgb3BlcmF0b3I9KGNvbnN0IENYRkFfR0VDb2xvciYgdGhhdCk7CisKKyBwcml2YXRlOgorICBUeXBlIG1fdHlwZTsKKyAgRlhfQVJHQiBtX2FyZ2I7CisgIHVuaW9uIHsKKyAgICBDWEZBX0dFUGF0dGVybiogcGF0dGVybjsKKyAgICBDWEZBX0dFU2hhZGluZyogc2hhZGluZzsKKyAgfSBtX3BvaW50ZXI7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEdSQVBISUNTX0NYRkFfR0VDT0xPUl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXBhdGguY3BwIGIveGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXBhdGguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MzcyZjcKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhncmFwaGljcy9jeGZhX2dlcGF0aC5jcHAKQEAgLTAsMCArMSwxNTEgQEAKKy8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gT3JpZ2luYWwgY29kZSBjb3B5cmlnaHQgMjAxNCBGb3hpdCBTb2Z0d2FyZSBJbmMuIGh0dHA6Ly93d3cuZm94aXRzb2Z0d2FyZS5jb20KKworI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2VwYXRoLmgiCisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3BhdGhkYXRhLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvYmFzZS9wdHJfdXRpbC5oIgorCitDWEZBX0dFUGF0aDo6Q1hGQV9HRVBhdGgoKSB7fQorCitDWEZBX0dFUGF0aDo6fkNYRkFfR0VQYXRoKCkge30KKwordm9pZCBDWEZBX0dFUGF0aDo6Q2xlYXIoKSB7CisgIGRhdGFfLkNsZWFyKCk7Cit9CisKK3ZvaWQgQ1hGQV9HRVBhdGg6OkNsb3NlKCkgeworICBkYXRhXy5DbG9zZVBhdGgoKTsKK30KKwordm9pZCBDWEZBX0dFUGF0aDo6TW92ZVRvKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KSB7CisgIGRhdGFfLkFwcGVuZFBvaW50KHBvaW50LCBGWFBUX1RZUEU6Ok1vdmVUbywgZmFsc2UpOworfQorCit2b2lkIENYRkFfR0VQYXRoOjpMaW5lVG8oY29uc3QgQ0ZYX1BvaW50RiYgcG9pbnQpIHsKKyAgZGF0YV8uQXBwZW5kUG9pbnQocG9pbnQsIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7Cit9CisKK3ZvaWQgQ1hGQV9HRVBhdGg6OkJlemllclRvKGNvbnN0IENGWF9Qb2ludEYmIGMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiB0bykgeworICBkYXRhXy5BcHBlbmRQb2ludChjMSwgRlhQVF9UWVBFOjpCZXppZXJUbywgZmFsc2UpOworICBkYXRhXy5BcHBlbmRQb2ludChjMiwgRlhQVF9UWVBFOjpCZXppZXJUbywgZmFsc2UpOworICBkYXRhXy5BcHBlbmRQb2ludCh0bywgRlhQVF9UWVBFOjpCZXppZXJUbywgZmFsc2UpOworfQorCit2b2lkIENYRkFfR0VQYXRoOjpBcmNUbyhjb25zdCBDRlhfUG9pbnRGJiBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfU2l6ZUYmIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzdGFydF9hbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHN3ZWVwX2FuZ2xlKSB7CisgIENGWF9TaXplRiBuZXdfc2l6ZSA9IHNpemUgLyAyLjBmOworICBBcmNUb0ludGVybmFsKENGWF9Qb2ludEYocG9zLnggKyBuZXdfc2l6ZS53aWR0aCwgcG9zLnkgKyBuZXdfc2l6ZS5oZWlnaHQpLAorICAgICAgICAgICAgICAgIG5ld19zaXplLCBzdGFydF9hbmdsZSwgc3dlZXBfYW5nbGUpOworfQorCit2b2lkIENYRkFfR0VQYXRoOjpBcmNUb0ludGVybmFsKGNvbnN0IENGWF9Qb2ludEYmIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1NpemVGJiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzdGFydF9hbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3dlZXBfYW5nbGUpIHsKKyAgZmxvYXQgeDAgPSBjb3Moc3dlZXBfYW5nbGUgLyAyKTsKKyAgZmxvYXQgeTAgPSBzaW4oc3dlZXBfYW5nbGUgLyAyKTsKKyAgZmxvYXQgdHggPSAoKDEuMGYgLSB4MCkgKiA0KSAvICgzICogMS4wZik7CisgIGZsb2F0IHR5ID0geTAgLSAoKHR4ICogeDApIC8geTApOworCisgIENGWF9Qb2ludEYgcG9pbnRzW10gPSB7Q0ZYX1BvaW50Rih4MCArIHR4LCAtdHkpLCBDRlhfUG9pbnRGKHgwICsgdHgsIHR5KX07CisgIGZsb2F0IHNuID0gc2luKHN0YXJ0X2FuZ2xlICsgc3dlZXBfYW5nbGUgLyAyKTsKKyAgZmxvYXQgY3MgPSBjb3Moc3RhcnRfYW5nbGUgKyBzd2VlcF9hbmdsZSAvIDIpOworCisgIENGWF9Qb2ludEYgYmV6aWVyOworICBiZXppZXIueCA9IHBvcy54ICsgKHNpemUud2lkdGggKiAoKHBvaW50c1swXS54ICogY3MpIC0gKHBvaW50c1swXS55ICogc24pKSk7CisgIGJlemllci55ID0gcG9zLnkgKyAoc2l6ZS5oZWlnaHQgKiAoKHBvaW50c1swXS54ICogc24pICsgKHBvaW50c1swXS55ICogY3MpKSk7CisgIGRhdGFfLkFwcGVuZFBvaW50KGJlemllciwgRlhQVF9UWVBFOjpCZXppZXJUbywgZmFsc2UpOworCisgIGJlemllci54ID0gcG9zLnggKyAoc2l6ZS53aWR0aCAqICgocG9pbnRzWzFdLnggKiBjcykgLSAocG9pbnRzWzFdLnkgKiBzbikpKTsKKyAgYmV6aWVyLnkgPSBwb3MueSArIChzaXplLmhlaWdodCAqICgocG9pbnRzWzFdLnggKiBzbikgKyAocG9pbnRzWzFdLnkgKiBjcykpKTsKKyAgZGF0YV8uQXBwZW5kUG9pbnQoYmV6aWVyLCBGWFBUX1RZUEU6OkJlemllclRvLCBmYWxzZSk7CisKKyAgYmV6aWVyLnggPSBwb3MueCArIChzaXplLndpZHRoICogY29zKHN0YXJ0X2FuZ2xlICsgc3dlZXBfYW5nbGUpKTsKKyAgYmV6aWVyLnkgPSBwb3MueSArIChzaXplLmhlaWdodCAqIHNpbihzdGFydF9hbmdsZSArIHN3ZWVwX2FuZ2xlKSk7CisgIGRhdGFfLkFwcGVuZFBvaW50KGJlemllciwgRlhQVF9UWVBFOjpCZXppZXJUbywgZmFsc2UpOworfQorCit2b2lkIENYRkFfR0VQYXRoOjpBZGRMaW5lKGNvbnN0IENGWF9Qb2ludEYmIHAxLCBjb25zdCBDRlhfUG9pbnRGJiBwMikgeworICBkYXRhXy5BcHBlbmRQb2ludChwMSwgRlhQVF9UWVBFOjpNb3ZlVG8sIGZhbHNlKTsKKyAgZGF0YV8uQXBwZW5kUG9pbnQocDIsIEZYUFRfVFlQRTo6TGluZVRvLCBmYWxzZSk7Cit9CisKK3ZvaWQgQ1hGQV9HRVBhdGg6OkFkZFJlY3RhbmdsZShmbG9hdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBoZWlnaHQpIHsKKyAgZGF0YV8uQXBwZW5kUmVjdChsZWZ0LCB0b3AsIGxlZnQgKyB3aWR0aCwgdG9wICsgaGVpZ2h0KTsKK30KKwordm9pZCBDWEZBX0dFUGF0aDo6QWRkRWxsaXBzZShjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsKKyAgQWRkQXJjKHJlY3QuVG9wTGVmdCgpLCByZWN0LlNpemUoKSwgMCwgRlhfUEkgKiAyKTsKK30KKwordm9pZCBDWEZBX0dFUGF0aDo6QWRkQXJjKGNvbnN0IENGWF9Qb2ludEYmIG9yaWdpbmFsX3BvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfU2l6ZUYmIG9yaWdpbmFsX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3RhcnRfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3dlZXBfYW5nbGUpIHsKKyAgaWYgKHN3ZWVwX2FuZ2xlID09IDApCisgICAgcmV0dXJuOworCisgIGNvbnN0IGZsb2F0IGJlemllcl9hcmNfYW5nbGVfZXBzaWxvbiA9IDAuMDFmOworICB3aGlsZSAoc3RhcnRfYW5nbGUgPiBGWF9QSSAqIDIpCisgICAgc3RhcnRfYW5nbGUgLT0gRlhfUEkgKiAyOworICB3aGlsZSAoc3RhcnRfYW5nbGUgPCAwKQorICAgIHN0YXJ0X2FuZ2xlICs9IEZYX1BJICogMjsKKyAgaWYgKHN3ZWVwX2FuZ2xlID49IEZYX1BJICogMikKKyAgICBzd2VlcF9hbmdsZSA9IEZYX1BJICogMjsKKyAgaWYgKHN3ZWVwX2FuZ2xlIDw9IC1GWF9QSSAqIDIpCisgICAgc3dlZXBfYW5nbGUgPSAtRlhfUEkgKiAyOworCisgIENGWF9TaXplRiBzaXplID0gb3JpZ2luYWxfc2l6ZSAvIDI7CisgIENGWF9Qb2ludEYgcG9zKG9yaWdpbmFsX3Bvcy54ICsgc2l6ZS53aWR0aCwgb3JpZ2luYWxfcG9zLnkgKyBzaXplLmhlaWdodCk7CisgIGRhdGFfLkFwcGVuZFBvaW50KHBvcyArIENGWF9Qb2ludEYoc2l6ZS53aWR0aCAqIGNvcyhzdGFydF9hbmdsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS5oZWlnaHQgKiBzaW4oc3RhcnRfYW5nbGUpKSwKKyAgICAgICAgICAgICAgICAgICAgRlhQVF9UWVBFOjpNb3ZlVG8sIGZhbHNlKTsKKworICBmbG9hdCB0b3RhbF9zd2VlcCA9IDA7CisgIGZsb2F0IGxvY2FsX3N3ZWVwID0gMDsKKyAgZmxvYXQgcHJldl9zd2VlcCA9IDA7CisgIGJvb2wgZG9uZSA9IGZhbHNlOworICBkbyB7CisgICAgaWYgKHN3ZWVwX2FuZ2xlIDwgMCkgeworICAgICAgcHJldl9zd2VlcCA9IHRvdGFsX3N3ZWVwOworICAgICAgbG9jYWxfc3dlZXAgPSAtRlhfUEkgLyAyOworICAgICAgdG90YWxfc3dlZXAgLT0gRlhfUEkgLyAyOworICAgICAgaWYgKHRvdGFsX3N3ZWVwIDw9IHN3ZWVwX2FuZ2xlICsgYmV6aWVyX2FyY19hbmdsZV9lcHNpbG9uKSB7CisgICAgICAgIGxvY2FsX3N3ZWVwID0gc3dlZXBfYW5nbGUgLSBwcmV2X3N3ZWVwOworICAgICAgICBkb25lID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgcHJldl9zd2VlcCA9IHRvdGFsX3N3ZWVwOworICAgICAgbG9jYWxfc3dlZXAgPSBGWF9QSSAvIDI7CisgICAgICB0b3RhbF9zd2VlcCArPSBGWF9QSSAvIDI7CisgICAgICBpZiAodG90YWxfc3dlZXAgPj0gc3dlZXBfYW5nbGUgLSBiZXppZXJfYXJjX2FuZ2xlX2Vwc2lsb24pIHsKKyAgICAgICAgbG9jYWxfc3dlZXAgPSBzd2VlcF9hbmdsZSAtIHByZXZfc3dlZXA7CisgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIEFyY1RvSW50ZXJuYWwocG9zLCBzaXplLCBzdGFydF9hbmdsZSwgbG9jYWxfc3dlZXApOworICAgIHN0YXJ0X2FuZ2xlICs9IGxvY2FsX3N3ZWVwOworICB9IHdoaWxlICghZG9uZSk7Cit9CisKK3ZvaWQgQ1hGQV9HRVBhdGg6OkFkZFN1YnBhdGgoQ1hGQV9HRVBhdGgqIHBhdGgpIHsKKyAgaWYgKCFwYXRoKQorICAgIHJldHVybjsKKyAgZGF0YV8uQXBwZW5kKCZwYXRoLT5kYXRhXywgbnVsbHB0cik7Cit9CisKK3ZvaWQgQ1hGQV9HRVBhdGg6OlRyYW5zZm9ybUJ5KGNvbnN0IENGWF9NYXRyaXgmIG10KSB7CisgIGRhdGFfLlRyYW5zZm9ybSgmbXQpOworfQpkaWZmIC0tZ2l0IGEveGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXBhdGguaCBiL3hmYS9meGdyYXBoaWNzL2N4ZmFfZ2VwYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMzYWZjNAotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGdyYXBoaWNzL2N4ZmFfZ2VwYXRoLmgKQEAgLTAsMCArMSw1NSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEdSQVBISUNTX0NYRkFfR0VQQVRIX0hfCisjZGVmaW5lIFhGQV9GWEdSQVBISUNTX0NYRkFfR0VQQVRIX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcGF0aGRhdGEuaCIKKyNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jeGZhX2dyYXBoaWNzLmgiCisKK2NsYXNzIENYRkFfR0VQYXRoIGZpbmFsIHsKKyBwdWJsaWM6CisgIENYRkFfR0VQYXRoKCk7CisgIH5DWEZBX0dFUGF0aCgpOworCisgIGNvbnN0IENGWF9QYXRoRGF0YSogR2V0UGF0aERhdGEoKSBjb25zdCB7IHJldHVybiAmZGF0YV87IH0KKworICB2b2lkIENsZWFyKCk7CisgIGJvb2wgSXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIGRhdGFfLkdldFBvaW50cygpLmVtcHR5KCk7IH0KKyAgdm9pZCBUcmFuc2Zvcm1CeShjb25zdCBDRlhfTWF0cml4JiBtdCk7CisKKyAgdm9pZCBDbG9zZSgpOworICB2b2lkIE1vdmVUbyhjb25zdCBDRlhfUG9pbnRGJiBwb2ludCk7CisgIHZvaWQgTGluZVRvKGNvbnN0IENGWF9Qb2ludEYmIHBvaW50KTsKKyAgdm9pZCBCZXppZXJUbyhjb25zdCBDRlhfUG9pbnRGJiBjMSwKKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBjMiwKKyAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiB0byk7CisgIHZvaWQgQXJjVG8oY29uc3QgQ0ZYX1BvaW50RiYgcG9zLAorICAgICAgICAgICAgIGNvbnN0IENGWF9TaXplRiYgc2l6ZSwKKyAgICAgICAgICAgICBmbG9hdCBzdGFydEFuZ2xlLAorICAgICAgICAgICAgIGZsb2F0IHN3ZWVwQW5nbGUpOworCisgIHZvaWQgQWRkTGluZShjb25zdCBDRlhfUG9pbnRGJiBwMSwgY29uc3QgQ0ZYX1BvaW50RiYgcDIpOworICB2b2lkIEFkZFJlY3RhbmdsZShmbG9hdCBsZWZ0LCBmbG9hdCB0b3AsIGZsb2F0IHdpZHRoLCBmbG9hdCBoZWlnaHQpOworICB2b2lkIEFkZEVsbGlwc2UoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KTsKKyAgdm9pZCBBZGRBcmMoY29uc3QgQ0ZYX1BvaW50RiYgcG9zLAorICAgICAgICAgICAgICBjb25zdCBDRlhfU2l6ZUYmIHNpemUsCisgICAgICAgICAgICAgIGZsb2F0IHN0YXJ0QW5nbGUsCisgICAgICAgICAgICAgIGZsb2F0IHN3ZWVwQW5nbGUpOworCisgIHZvaWQgQWRkU3VicGF0aChDWEZBX0dFUGF0aCogcGF0aCk7CisKKyBwcml2YXRlOgorICB2b2lkIEFyY1RvSW50ZXJuYWwoY29uc3QgQ0ZYX1BvaW50RiYgcG9zLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1NpemVGJiBzaXplLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3RhcnRfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzd2VlcF9hbmdsZSk7CisKKyAgQ0ZYX1BhdGhEYXRhIGRhdGFfOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhHUkFQSElDU19DWEZBX0dFUEFUSF9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXBhdHRlcm4uY3BwIGIveGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXBhdHRlcm4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNmEwZTQKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhncmFwaGljcy9jeGZhX2dlcGF0dGVybi5jcHAKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXBhdHRlcm4uaCIKKworQ1hGQV9HRVBhdHRlcm46OkNYRkFfR0VQYXR0ZXJuKEZYX0hhdGNoU3R5bGUgaGF0Y2hTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGWF9BUkdCIGZvcmVBcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IgYmFja0FyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4KQorICAgIDogbV9oYXRjaFN0eWxlKGhhdGNoU3R5bGUpLCBtX2ZvcmVBcmdiKGZvcmVBcmdiKSwgbV9iYWNrQXJnYihiYWNrQXJnYikgeworICBpZiAobWF0cml4KQorICAgIG1fbWF0cml4ID0gKm1hdHJpeDsKKyAgZWxzZQorICAgIG1fbWF0cml4LlNldElkZW50aXR5KCk7Cit9CisKK0NYRkFfR0VQYXR0ZXJuOjp+Q1hGQV9HRVBhdHRlcm4oKSB7fQpkaWZmIC0tZ2l0IGEveGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXBhdHRlcm4uaCBiL3hmYS9meGdyYXBoaWNzL2N4ZmFfZ2VwYXR0ZXJuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY0Y2VkMgotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGdyYXBoaWNzL2N4ZmFfZ2VwYXR0ZXJuLmgKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEdSQVBISUNTX0NYRkFfR0VQQVRURVJOX0hfCisjZGVmaW5lIFhGQV9GWEdSQVBISUNTX0NYRkFfR0VQQVRURVJOX0hfCisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X2Nvb3JkaW5hdGVzLmgiCisjaW5jbHVkZSAiY29yZS9meGNydC9meF9zeXN0ZW0uaCIKKyNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jeGZhX2dyYXBoaWNzLmgiCisKK2NsYXNzIENGWF9ESUJpdG1hcDsKK2NsYXNzIENGWF9NYXRyaXg7CisKK2NsYXNzIENYRkFfR0VQYXR0ZXJuIHsKKyBwdWJsaWM6CisgIENYRkFfR0VQYXR0ZXJuKEZYX0hhdGNoU3R5bGUgaGF0Y2hTdHlsZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQiBmb3JlQXJnYiwKKyAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQiBiYWNrQXJnYiwKKyAgICAgICAgICAgICAgICAgQ0ZYX01hdHJpeCogbWF0cml4ID0gbnVsbHB0cik7CisKKyAgdmlydHVhbCB+Q1hGQV9HRVBhdHRlcm4oKTsKKworIHByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBDWEZBX0dyYXBoaWNzOworCisgIENGWF9NYXRyaXggbV9tYXRyaXg7CisKKyAgY29uc3QgRlhfSGF0Y2hTdHlsZSBtX2hhdGNoU3R5bGU7CisgIGNvbnN0IEZYX0FSR0IgbV9mb3JlQXJnYjsKKyAgY29uc3QgRlhfQVJHQiBtX2JhY2tBcmdiOworfTsKKworI2VuZGlmICAvLyBYRkFfRlhHUkFQSElDU19DWEZBX0dFUEFUVEVSTl9IXwpkaWZmIC0tZ2l0IGEveGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXNoYWRpbmcuY3BwIGIveGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXNoYWRpbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2OTExNjkKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhncmFwaGljcy9jeGZhX2dlc2hhZGluZy5jcHAKQEAgLTAsMCArMSw3OCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXNoYWRpbmcuaCIKKworQ1hGQV9HRVNoYWRpbmc6OkNYRkFfR0VTaGFkaW5nKGNvbnN0IENGWF9Qb2ludEYmIGJlZ2luUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgZW5kUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0V4dGVuZGVkQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0V4dGVuZGVkRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IgYmVnaW5BcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IgZW5kQXJnYikKKyAgICA6IG1fdHlwZShGWF9TSEFESU5HX0F4aWFsKSwKKyAgICAgIG1fYmVnaW5Qb2ludChiZWdpblBvaW50KSwKKyAgICAgIG1fZW5kUG9pbnQoZW5kUG9pbnQpLAorICAgICAgbV9iZWdpblJhZGl1cygwKSwKKyAgICAgIG1fZW5kUmFkaXVzKDApLAorICAgICAgbV9pc0V4dGVuZGVkQmVnaW4oaXNFeHRlbmRlZEJlZ2luKSwKKyAgICAgIG1faXNFeHRlbmRlZEVuZChpc0V4dGVuZGVkRW5kKSwKKyAgICAgIG1fYmVnaW5BcmdiKGJlZ2luQXJnYiksCisgICAgICBtX2VuZEFyZ2IoZW5kQXJnYikgeworICBJbml0QXJnYkFycmF5KCk7Cit9CisKK0NYRkFfR0VTaGFkaW5nOjpDWEZBX0dFU2hhZGluZyhjb25zdCBDRlhfUG9pbnRGJiBiZWdpblBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9Qb2ludEYmIGVuZFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGJlZ2luUmFkaXVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGVuZFJhZGl1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRXh0ZW5kZWRCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRXh0ZW5kZWRFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQiBiZWdpbkFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQiBlbmRBcmdiKQorICAgIDogbV90eXBlKEZYX1NIQURJTkdfUmFkaWFsKSwKKyAgICAgIG1fYmVnaW5Qb2ludChiZWdpblBvaW50KSwKKyAgICAgIG1fZW5kUG9pbnQoZW5kUG9pbnQpLAorICAgICAgbV9iZWdpblJhZGl1cyhiZWdpblJhZGl1cyksCisgICAgICBtX2VuZFJhZGl1cyhlbmRSYWRpdXMpLAorICAgICAgbV9pc0V4dGVuZGVkQmVnaW4oaXNFeHRlbmRlZEJlZ2luKSwKKyAgICAgIG1faXNFeHRlbmRlZEVuZChpc0V4dGVuZGVkRW5kKSwKKyAgICAgIG1fYmVnaW5BcmdiKGJlZ2luQXJnYiksCisgICAgICBtX2VuZEFyZ2IoZW5kQXJnYikgeworICBJbml0QXJnYkFycmF5KCk7Cit9CisKK0NYRkFfR0VTaGFkaW5nOjp+Q1hGQV9HRVNoYWRpbmcoKSB7fQorCit2b2lkIENYRkFfR0VTaGFkaW5nOjpJbml0QXJnYkFycmF5KCkgeworICBpbnQzMl90IGExOworICBpbnQzMl90IHIxOworICBpbnQzMl90IGcxOworICBpbnQzMl90IGIxOworICBzdGQ6OnRpZShhMSwgcjEsIGcxLCBiMSkgPSBBcmdiRGVjb2RlKG1fYmVnaW5BcmdiKTsKKworICBpbnQzMl90IGEyOworICBpbnQzMl90IHIyOworICBpbnQzMl90IGcyOworICBpbnQzMl90IGIyOworICBzdGQ6OnRpZShhMiwgcjIsIGcyLCBiMikgPSBBcmdiRGVjb2RlKG1fZW5kQXJnYik7CisKKyAgZmxvYXQgZiA9IHN0YXRpY19jYXN0PGZsb2F0PihGWF9TSEFESU5HX1N0ZXBzIC0gMSk7CisgIGZsb2F0IGFTY2FsZSA9IDEuMCAqIChhMiAtIGExKSAvIGY7CisgIGZsb2F0IHJTY2FsZSA9IDEuMCAqIChyMiAtIHIxKSAvIGY7CisgIGZsb2F0IGdTY2FsZSA9IDEuMCAqIChnMiAtIGcxKSAvIGY7CisgIGZsb2F0IGJTY2FsZSA9IDEuMCAqIChiMiAtIGIxKSAvIGY7CisKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgRlhfU0hBRElOR19TdGVwczsgaSsrKSB7CisgICAgaW50MzJfdCBhMyA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGkgKiBhU2NhbGUpOworICAgIGludDMyX3QgcjMgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihpICogclNjYWxlKTsKKyAgICBpbnQzMl90IGczID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaSAqIGdTY2FsZSk7CisgICAgaW50MzJfdCBiMyA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGkgKiBiU2NhbGUpOworCisgICAgLy8gVE9ETyhkc2luY2xhaXIpOiBBZGQgb3ZlcmxvYWRzIGZvciBGWF9BUkdCLiBwZGZpdW06NDM3CisgICAgbV9hcmdiQXJyYXlbaV0gPQorICAgICAgICBGWEFSR0JfVE9ESUIoRlhBUkdCX01BS0UoYTEgKyBhMywgcjEgKyByMywgZzEgKyBnMywgYjEgKyBiMykpOworICB9Cit9CmRpZmYgLS1naXQgYS94ZmEvZnhncmFwaGljcy9jeGZhX2dlc2hhZGluZy5oIGIveGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXNoYWRpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzdhMTNlCi0tLSAvZGV2L251bGwKKysrIGIveGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXNoYWRpbmcuaApAQCAtMCwwICsxLDU2IEBACisvLyBDb3B5cmlnaHQgMjAxNiBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpZm5kZWYgWEZBX0ZYR1JBUEhJQ1NfQ1hGQV9HRVNIQURJTkdfSF8KKyNkZWZpbmUgWEZBX0ZYR1JBUEhJQ1NfQ1hGQV9HRVNIQURJTkdfSF8KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfY29vcmRpbmF0ZXMuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9meF9kaWIuaCIKKworI2RlZmluZSBGWF9TSEFESU5HX1N0ZXBzIDI1NgorCitlbnVtIENYRkFfR0VTaGFkaW5nX1R5cGUgeyBGWF9TSEFESU5HX0F4aWFsID0gMSwgRlhfU0hBRElOR19SYWRpYWwgfTsKKworY2xhc3MgQ1hGQV9HRVNoYWRpbmcgeworIHB1YmxpYzoKKyAgLy8gQXhpYWwgc2hhZGluZy4KKyAgQ1hGQV9HRVNoYWRpbmcoY29uc3QgQ0ZYX1BvaW50RiYgYmVnaW5Qb2ludCwKKyAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX1BvaW50RiYgZW5kUG9pbnQsCisgICAgICAgICAgICAgICAgIGJvb2wgaXNFeHRlbmRlZEJlZ2luLAorICAgICAgICAgICAgICAgICBib29sIGlzRXh0ZW5kZWRFbmQsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IgYmVnaW5BcmdiLAorICAgICAgICAgICAgICAgICBjb25zdCBGWF9BUkdCIGVuZEFyZ2IpOworCisgIC8vIFJhZGlhbCBzaGFkaW5nLgorICBDWEZBX0dFU2hhZGluZyhjb25zdCBDRlhfUG9pbnRGJiBiZWdpblBvaW50LAorICAgICAgICAgICAgICAgICBjb25zdCBDRlhfUG9pbnRGJiBlbmRQb2ludCwKKyAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgYmVnaW5SYWRpdXMsCisgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGVuZFJhZGl1cywKKyAgICAgICAgICAgICAgICAgYm9vbCBpc0V4dGVuZGVkQmVnaW4sCisgICAgICAgICAgICAgICAgIGJvb2wgaXNFeHRlbmRlZEVuZCwKKyAgICAgICAgICAgICAgICAgY29uc3QgRlhfQVJHQiBiZWdpbkFyZ2IsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZYX0FSR0IgZW5kQXJnYik7CisgIHZpcnR1YWwgfkNYRkFfR0VTaGFkaW5nKCk7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQ1hGQV9HcmFwaGljczsKKworICB2b2lkIEluaXRBcmdiQXJyYXkoKTsKKworICBjb25zdCBDWEZBX0dFU2hhZGluZ19UeXBlIG1fdHlwZTsKKyAgY29uc3QgQ0ZYX1BvaW50RiBtX2JlZ2luUG9pbnQ7CisgIGNvbnN0IENGWF9Qb2ludEYgbV9lbmRQb2ludDsKKyAgY29uc3QgZmxvYXQgbV9iZWdpblJhZGl1czsKKyAgY29uc3QgZmxvYXQgbV9lbmRSYWRpdXM7CisgIGNvbnN0IGJvb2wgbV9pc0V4dGVuZGVkQmVnaW47CisgIGNvbnN0IGJvb2wgbV9pc0V4dGVuZGVkRW5kOworICBjb25zdCBGWF9BUkdCIG1fYmVnaW5BcmdiOworICBjb25zdCBGWF9BUkdCIG1fZW5kQXJnYjsKKyAgRlhfQVJHQiBtX2FyZ2JBcnJheVtGWF9TSEFESU5HX1N0ZXBzXTsKK307CisKKyNlbmRpZiAgLy8gWEZBX0ZYR1JBUEhJQ1NfQ1hGQV9HRVNIQURJTkdfSF8KZGlmZiAtLWdpdCBhL3hmYS9meGdyYXBoaWNzL2N4ZmFfZ3JhcGhpY3MuY3BwIGIveGZhL2Z4Z3JhcGhpY3MvY3hmYV9ncmFwaGljcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFlMmYzNQotLS0gL2Rldi9udWxsCisrKyBiL3hmYS9meGdyYXBoaWNzL2N4ZmFfZ3JhcGhpY3MuY3BwCkBAIC0wLDAgKzEsNDUzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBQREZpdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIE9yaWdpbmFsIGNvZGUgY29weXJpZ2h0IDIwMTQgRm94aXQgU29mdHdhcmUgSW5jLiBodHRwOi8vd3d3LmZveGl0c29mdHdhcmUuY29tCisKKyNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jeGZhX2dyYXBoaWNzLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X2RlZmF1bHRyZW5kZXJkZXZpY2UuaCIKKyNpbmNsdWRlICJjb3JlL2Z4Z2UvY2Z4X3JlbmRlcmRldmljZS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfdW5pY29kZWVuY29kaW5nLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2RpYi9jZnhfZGliaXRtYXAuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9iYXNlL3B0cl91dGlsLmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZWNvbG9yLmgiCisjaW5jbHVkZSAieGZhL2Z4Z3JhcGhpY3MvY3hmYV9nZXBhdGguaCIKKyNpbmNsdWRlICJ4ZmEvZnhncmFwaGljcy9jeGZhX2dlcGF0dGVybi5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2VzaGFkaW5nLmgiCisKK25hbWVzcGFjZSB7CisKK2VudW0geworICBGWF9DT05URVhUX05vbmUgPSAwLAorICBGWF9DT05URVhUX0RldmljZSwKK307CisKKyNkZWZpbmUgRlhfSEFUQ0hTVFlMRV9Ub3RhbCA1MworCitzdHJ1Y3QgRlhfSEFUQ0hEQVRBIHsKKyAgaW50MzJfdCB3aWR0aDsKKyAgaW50MzJfdCBoZWlnaHQ7CisgIHVpbnQ4X3QgbWFza0JpdHNbNjRdOworfTsKKworY29uc3QgRlhfSEFUQ0hEQVRBIGhhdGNoQml0bWFwRGF0YVtGWF9IQVRDSFNUWUxFX1RvdGFsXSA9IHsKKyAgICB7MTYsICAvLyBIb3Jpem9udGFsCisgICAgIDE2LAorICAgICB7CisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmYsCisgICAgICAgICAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgICAgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgIH19LAorICAgIHsxNiwgIC8vIFZlcnRpY2FsCisgICAgIDE2LAorICAgICB7CisgICAgICAgICAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLAorICAgICAgICAgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwKKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsCisgICAgICAgICAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLAorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwKKyAgICAgICAgIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsCisgICAgIH19LAorICAgIHsxNiwgIC8vIEZvcndhcmREaWFnb25hbAorICAgICAxNiwKKyAgICAgeworICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgwMCwKKyAgICAgICAgIDB4MDAsIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsCisgICAgICAgICAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDgwLAorICAgICAgICAgMHg4MCwgMHgwMCwgMHgwMCwgMHg0MCwgMHg0MCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgwMCwgMHgwMCwKKyAgICAgICAgIDB4MTAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDQsIDB4MDAsCisgICAgICAgICAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDAxLCAweDAxLCAweDAwLCAweDAwLAorICAgICB9fSwKKyAgICB7MTYsICAvLyBCYWNrd2FyZERpYWdvbmFsCisgICAgIDE2LAorICAgICB7CisgICAgICAgICAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLAorICAgICAgICAgMHgwMCwgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwKKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDEsCisgICAgICAgICAweDAxLCAweDAwLCAweDAwLCAweDAyLCAweDAyLCAweDAwLCAweDAwLCAweDA0LCAweDA0LCAweDAwLCAweDAwLAorICAgICAgICAgMHgwOCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgyMCwgMHgwMCwKKyAgICAgICAgIDB4MDAsIDB4NDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsCisgICAgIH19LAorICAgIHsxNiwgIC8vIENyb3NzCisgICAgIDE2LAorICAgICB7CisgICAgICAgICAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLAorICAgICAgICAgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwKKyAgICAgICAgIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ZmYsCisgICAgICAgICAweGZmLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLCAweDgwLCAweDgwLCAweDAwLCAweDAwLAorICAgICAgICAgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwgMHgwMCwgMHg4MCwgMHg4MCwgMHgwMCwKKyAgICAgICAgIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsIDB4MDAsIDB4MDAsCisgICAgIH19LAorICAgIHsxNiwgIC8vIERpYWdvbmFsQ3Jvc3MKKyAgICAgMTYsCisgICAgIHsKKyAgICAgICAgIDB4ODEsIDB4ODEsIDB4MDAsIDB4MDAsIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsCisgICAgICAgICAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDI0LCAweDI0LAorICAgICAgICAgMHgwMCwgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwgMHg4MSwKKyAgICAgICAgIDB4ODEsIDB4MDAsIDB4MDAsIDB4NDIsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MjQsIDB4MDAsIDB4MDAsCisgICAgICAgICAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDE4LCAweDE4LCAweDAwLCAweDAwLCAweDI0LCAweDI0LCAweDAwLAorICAgICAgICAgMHgwMCwgMHg0MiwgMHg0MiwgMHgwMCwgMHgwMCwgMHg4MSwgMHg4MSwgMHgwMCwgMHgwMCwKKyAgICAgfX0sCit9OworCit9ICAvLyBuYW1lc3BhY2UKKworQ1hGQV9HcmFwaGljczo6Q1hGQV9HcmFwaGljcyhDRlhfUmVuZGVyRGV2aWNlKiByZW5kZXJEZXZpY2UpCisgICAgOiBtX3R5cGUoRlhfQ09OVEVYVF9Ob25lKSwgbV9yZW5kZXJEZXZpY2UocmVuZGVyRGV2aWNlKSB7CisgIGlmICghcmVuZGVyRGV2aWNlKQorICAgIHJldHVybjsKKyAgbV90eXBlID0gRlhfQ09OVEVYVF9EZXZpY2U7Cit9CisKK0NYRkFfR3JhcGhpY3M6On5DWEZBX0dyYXBoaWNzKCkge30KKwordm9pZCBDWEZBX0dyYXBoaWNzOjpTYXZlR3JhcGhTdGF0ZSgpIHsKKyAgaWYgKG1fdHlwZSAhPSBGWF9DT05URVhUX0RldmljZSB8fCAhbV9yZW5kZXJEZXZpY2UpCisgICAgcmV0dXJuOworCisgIG1fcmVuZGVyRGV2aWNlLT5TYXZlU3RhdGUoKTsKKyAgbV9pbmZvU3RhY2sucHVzaF9iYWNrKHBkZml1bTo6TWFrZVVuaXF1ZTxUSW5mbz4obV9pbmZvKSk7Cit9CisKK3ZvaWQgQ1hGQV9HcmFwaGljczo6UmVzdG9yZUdyYXBoU3RhdGUoKSB7CisgIGlmIChtX3R5cGUgIT0gRlhfQ09OVEVYVF9EZXZpY2UgfHwgIW1fcmVuZGVyRGV2aWNlKQorICAgIHJldHVybjsKKworICBtX3JlbmRlckRldmljZS0+UmVzdG9yZVN0YXRlKGZhbHNlKTsKKyAgaWYgKG1faW5mb1N0YWNrLmVtcHR5KCkgfHwgIW1faW5mb1N0YWNrLmJhY2soKSkKKyAgICByZXR1cm47CisKKyAgbV9pbmZvID0gKm1faW5mb1N0YWNrLmJhY2soKTsKKyAgbV9pbmZvU3RhY2sucG9wX2JhY2soKTsKKyAgcmV0dXJuOworfQorCit2b2lkIENYRkFfR3JhcGhpY3M6OlNldExpbmVDYXAoQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwIGxpbmVDYXApIHsKKyAgaWYgKG1fdHlwZSA9PSBGWF9DT05URVhUX0RldmljZSAmJiBtX3JlbmRlckRldmljZSkgeworICAgIG1faW5mby5ncmFwaFN0YXRlLm1fTGluZUNhcCA9IGxpbmVDYXA7CisgIH0KK30KKwordm9pZCBDWEZBX0dyYXBoaWNzOjpTZXRMaW5lRGFzaChmbG9hdCBkYXNoUGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkYXNoQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGFzaENvdW50KSB7CisgIGlmIChkYXNoQ291bnQgPiAwICYmICFkYXNoQXJyYXkpCisgICAgcmV0dXJuOworCisgIGRhc2hDb3VudCA9IGRhc2hDb3VudCA8IDAgPyAwIDogZGFzaENvdW50OworICBpZiAobV90eXBlID09IEZYX0NPTlRFWFRfRGV2aWNlICYmIG1fcmVuZGVyRGV2aWNlKSB7CisgICAgZmxvYXQgc2NhbGUgPSAxLjA7CisgICAgaWYgKG1faW5mby5pc0FjdE9uRGFzaCkgeworICAgICAgc2NhbGUgPSBtX2luZm8uZ3JhcGhTdGF0ZS5tX0xpbmVXaWR0aDsKKyAgICB9CisgICAgbV9pbmZvLmdyYXBoU3RhdGUubV9EYXNoUGhhc2UgPSBkYXNoUGhhc2U7CisgICAgbV9pbmZvLmdyYXBoU3RhdGUuU2V0RGFzaENvdW50KGRhc2hDb3VudCk7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZGFzaENvdW50OyBpKyspIHsKKyAgICAgIG1faW5mby5ncmFwaFN0YXRlLm1fRGFzaEFycmF5W2ldID0gZGFzaEFycmF5W2ldICogc2NhbGU7CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ1hGQV9HcmFwaGljczo6U2V0U29saWRMaW5lRGFzaCgpIHsKKyAgaWYgKG1fdHlwZSA9PSBGWF9DT05URVhUX0RldmljZSAmJiBtX3JlbmRlckRldmljZSkKKyAgICBtX2luZm8uZ3JhcGhTdGF0ZS5TZXREYXNoQ291bnQoMCk7Cit9CisKK3ZvaWQgQ1hGQV9HcmFwaGljczo6U2V0TGluZVdpZHRoKGZsb2F0IGxpbmVXaWR0aCkgeworICBpZiAobV90eXBlID09IEZYX0NPTlRFWFRfRGV2aWNlICYmIG1fcmVuZGVyRGV2aWNlKQorICAgIG1faW5mby5ncmFwaFN0YXRlLm1fTGluZVdpZHRoID0gbGluZVdpZHRoOworfQorCit2b2lkIENYRkFfR3JhcGhpY3M6OkVuYWJsZUFjdE9uRGFzaCgpIHsKKyAgaWYgKG1fdHlwZSA9PSBGWF9DT05URVhUX0RldmljZSAmJiBtX3JlbmRlckRldmljZSkKKyAgICBtX2luZm8uaXNBY3RPbkRhc2ggPSB0cnVlOworfQorCit2b2lkIENYRkFfR3JhcGhpY3M6OlNldFN0cm9rZUNvbG9yKGNvbnN0IENYRkFfR0VDb2xvciYgY29sb3IpIHsKKyAgaWYgKG1fdHlwZSA9PSBGWF9DT05URVhUX0RldmljZSAmJiBtX3JlbmRlckRldmljZSkKKyAgICBtX2luZm8uc3Ryb2tlQ29sb3IgPSBjb2xvcjsKK30KKwordm9pZCBDWEZBX0dyYXBoaWNzOjpTZXRGaWxsQ29sb3IoY29uc3QgQ1hGQV9HRUNvbG9yJiBjb2xvcikgeworICBpZiAobV90eXBlID09IEZYX0NPTlRFWFRfRGV2aWNlICYmIG1fcmVuZGVyRGV2aWNlKQorICAgIG1faW5mby5maWxsQ29sb3IgPSBjb2xvcjsKK30KKwordm9pZCBDWEZBX0dyYXBoaWNzOjpTdHJva2VQYXRoKENYRkFfR0VQYXRoKiBwYXRoLCBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgpIHsKKyAgaWYgKCFwYXRoKQorICAgIHJldHVybjsKKyAgaWYgKG1fdHlwZSA9PSBGWF9DT05URVhUX0RldmljZSAmJiBtX3JlbmRlckRldmljZSkKKyAgICBSZW5kZXJEZXZpY2VTdHJva2VQYXRoKHBhdGgsIG1hdHJpeCk7Cit9CisKK3ZvaWQgQ1hGQV9HcmFwaGljczo6RmlsbFBhdGgoQ1hGQV9HRVBhdGgqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZpbGxNb2RlIGZpbGxNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgpIHsKKyAgaWYgKCFwYXRoKQorICAgIHJldHVybjsKKyAgaWYgKG1fdHlwZSA9PSBGWF9DT05URVhUX0RldmljZSAmJiBtX3JlbmRlckRldmljZSkKKyAgICBSZW5kZXJEZXZpY2VGaWxsUGF0aChwYXRoLCBmaWxsTW9kZSwgbWF0cml4KTsKK30KKwordm9pZCBDWEZBX0dyYXBoaWNzOjpDb25jYXRNYXRyaXgoY29uc3QgQ0ZYX01hdHJpeCogbWF0cml4KSB7CisgIGlmICghbWF0cml4KQorICAgIHJldHVybjsKKyAgaWYgKG1fdHlwZSA9PSBGWF9DT05URVhUX0RldmljZSAmJiBtX3JlbmRlckRldmljZSkgeworICAgIG1faW5mby5DVE0uQ29uY2F0KCptYXRyaXgpOworICB9Cit9CisKK2NvbnN0IENGWF9NYXRyaXgqIENYRkFfR3JhcGhpY3M6OkdldE1hdHJpeCgpIGNvbnN0IHsKKyAgaWYgKG1fdHlwZSA9PSBGWF9DT05URVhUX0RldmljZSAmJiBtX3JlbmRlckRldmljZSkKKyAgICByZXR1cm4gJm1faW5mby5DVE07CisgIHJldHVybiBudWxscHRyOworfQorCitDRlhfUmVjdEYgQ1hGQV9HcmFwaGljczo6R2V0Q2xpcFJlY3QoKSBjb25zdCB7CisgIGlmIChtX3R5cGUgIT0gRlhfQ09OVEVYVF9EZXZpY2UgfHwgIW1fcmVuZGVyRGV2aWNlKQorICAgIHJldHVybiBDRlhfUmVjdEYoKTsKKworICBGWF9SRUNUIHIgPSBtX3JlbmRlckRldmljZS0+R2V0Q2xpcEJveCgpOworICByZXR1cm4gQ0ZYX1JlY3Qoci5sZWZ0LCByLnRvcCwgci5XaWR0aCgpLCByLkhlaWdodCgpKS5BczxmbG9hdD4oKTsKK30KKwordm9pZCBDWEZBX0dyYXBoaWNzOjpTZXRDbGlwUmVjdChjb25zdCBDRlhfUmVjdEYmIHJlY3QpIHsKKyAgaWYgKG1fdHlwZSA9PSBGWF9DT05URVhUX0RldmljZSAmJiBtX3JlbmRlckRldmljZSkgeworICAgIG1fcmVuZGVyRGV2aWNlLT5TZXRDbGlwX1JlY3QoCisgICAgICAgIEZYX1JFQ1QoRlhTWVNfcm91bmQocmVjdC5sZWZ0KSwgRlhTWVNfcm91bmQocmVjdC50b3ApLAorICAgICAgICAgICAgICAgIEZYU1lTX3JvdW5kKHJlY3QucmlnaHQoKSksIEZYU1lTX3JvdW5kKHJlY3QuYm90dG9tKCkpKSk7CisgIH0KK30KKworQ0ZYX1JlbmRlckRldmljZSogQ1hGQV9HcmFwaGljczo6R2V0UmVuZGVyRGV2aWNlKCkgeworICByZXR1cm4gbV9yZW5kZXJEZXZpY2U7Cit9CisKK3ZvaWQgQ1hGQV9HcmFwaGljczo6UmVuZGVyRGV2aWNlU3Ryb2tlUGF0aChjb25zdCBDWEZBX0dFUGF0aCogcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgpIHsKKyAgaWYgKG1faW5mby5zdHJva2VDb2xvci5HZXRUeXBlKCkgIT0gQ1hGQV9HRUNvbG9yOjpTb2xpZCkKKyAgICByZXR1cm47CisKKyAgQ0ZYX01hdHJpeCBtID0gbV9pbmZvLkNUTTsKKyAgaWYgKG1hdHJpeCkKKyAgICBtLkNvbmNhdCgqbWF0cml4KTsKKworICBtX3JlbmRlckRldmljZS0+RHJhd1BhdGgocGF0aC0+R2V0UGF0aERhdGEoKSwgJm0sICZtX2luZm8uZ3JhcGhTdGF0ZSwgMHgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbmZvLnN0cm9rZUNvbG9yLkdldEFyZ2IoKSwgMCk7Cit9CisKK3ZvaWQgQ1hGQV9HcmFwaGljczo6UmVuZGVyRGV2aWNlRmlsbFBhdGgoY29uc3QgQ1hGQV9HRVBhdGgqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZpbGxNb2RlIGZpbGxNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgpIHsKKyAgQ0ZYX01hdHJpeCBtID0gbV9pbmZvLkNUTTsKKyAgaWYgKG1hdHJpeCkKKyAgICBtLkNvbmNhdCgqbWF0cml4KTsKKworICBzd2l0Y2ggKG1faW5mby5maWxsQ29sb3IuR2V0VHlwZSgpKSB7CisgICAgY2FzZSBDWEZBX0dFQ29sb3I6OlNvbGlkOgorICAgICAgbV9yZW5kZXJEZXZpY2UtPkRyYXdQYXRoKHBhdGgtPkdldFBhdGhEYXRhKCksICZtLCAmbV9pbmZvLmdyYXBoU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbmZvLmZpbGxDb2xvci5HZXRBcmdiKCksIDB4MCwgZmlsbE1vZGUpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgQ1hGQV9HRUNvbG9yOjpQYXR0ZXJuOgorICAgICAgRmlsbFBhdGhXaXRoUGF0dGVybihwYXRoLCBmaWxsTW9kZSwgbSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBDWEZBX0dFQ29sb3I6OlNoYWRpbmc6CisgICAgICBGaWxsUGF0aFdpdGhTaGFkaW5nKHBhdGgsIGZpbGxNb2RlLCBtKTsKKyAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuOworICB9Cit9CisKK3ZvaWQgQ1hGQV9HcmFwaGljczo6RmlsbFBhdGhXaXRoUGF0dGVybihjb25zdCBDWEZBX0dFUGF0aCogcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GaWxsTW9kZSBmaWxsTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKKyAgQ1hGQV9HRVBhdHRlcm4qIHBhdHRlcm4gPSBtX2luZm8uZmlsbENvbG9yLkdldFBhdHRlcm4oKTsKKyAgUmV0YWluUHRyPENGWF9ESUJpdG1hcD4gYml0bWFwID0gbV9yZW5kZXJEZXZpY2UtPkdldEJpdG1hcCgpOworICBpbnQzMl90IHdpZHRoID0gYml0bWFwLT5HZXRXaWR0aCgpOworICBpbnQzMl90IGhlaWdodCA9IGJpdG1hcC0+R2V0SGVpZ2h0KCk7CisgIGF1dG8gYm1wID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKTsKKyAgYm1wLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfQXJnYik7CisgIG1fcmVuZGVyRGV2aWNlLT5HZXRESUJpdHMoYm1wLCAwLCAwKTsKKworICBGWF9IYXRjaFN0eWxlIGhhdGNoU3R5bGUgPSBtX2luZm8uZmlsbENvbG9yLkdldFBhdHRlcm4oKS0+bV9oYXRjaFN0eWxlOworICBjb25zdCBGWF9IQVRDSERBVEEmIGRhdGEgPSBoYXRjaEJpdG1hcERhdGFbc3RhdGljX2Nhc3Q8aW50PihoYXRjaFN0eWxlKV07CisKKyAgYXV0byBtYXNrID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKTsKKyAgbWFzay0+Q3JlYXRlKGRhdGEud2lkdGgsIGRhdGEuaGVpZ2h0LCBGWERJQl8xYnBwTWFzayk7CisgIG1lbWNweShtYXNrLT5HZXRCdWZmZXIoKSwgZGF0YS5tYXNrQml0cywgbWFzay0+R2V0UGl0Y2goKSAqIGRhdGEuaGVpZ2h0KTsKKyAgQ0ZYX0Zsb2F0UmVjdCByZWN0ZiA9CisgICAgICBtYXRyaXguVHJhbnNmb3JtUmVjdChwYXRoLT5HZXRQYXRoRGF0YSgpLT5HZXRCb3VuZGluZ0JveCgpKTsKKworICBGWF9SRUNUIHJlY3QoRlhTWVNfcm91bmQocmVjdGYubGVmdCksIEZYU1lTX3JvdW5kKHJlY3RmLnRvcCksCisgICAgICAgICAgICAgICBGWFNZU19yb3VuZChyZWN0Zi5yaWdodCksIEZYU1lTX3JvdW5kKHJlY3RmLmJvdHRvbSkpOworICBDRlhfRGVmYXVsdFJlbmRlckRldmljZSBkZXZpY2U7CisgIGRldmljZS5BdHRhY2goYm1wLCBmYWxzZSwgbnVsbHB0ciwgZmFsc2UpOworICBkZXZpY2UuRmlsbFJlY3QoJnJlY3QsIG1faW5mby5maWxsQ29sb3IuR2V0UGF0dGVybigpLT5tX2JhY2tBcmdiKTsKKyAgZm9yIChpbnQzMl90IGogPSByZWN0LmJvdHRvbTsgaiA8IHJlY3QudG9wOyBqICs9IG1hc2stPkdldEhlaWdodCgpKSB7CisgICAgZm9yIChpbnQzMl90IGkgPSByZWN0LmxlZnQ7IGkgPCByZWN0LnJpZ2h0OyBpICs9IG1hc2stPkdldFdpZHRoKCkpCisgICAgICBkZXZpY2UuU2V0Qml0TWFzayhtYXNrLCBpLCBqLCBtX2luZm8uZmlsbENvbG9yLkdldFBhdHRlcm4oKS0+bV9mb3JlQXJnYik7CisgIH0KKyAgQ0ZYX1JlbmRlckRldmljZTo6U3RhdGVSZXN0b3JlciByZXN0b3JlcihtX3JlbmRlckRldmljZSk7CisgIG1fcmVuZGVyRGV2aWNlLT5TZXRDbGlwX1BhdGhGaWxsKHBhdGgtPkdldFBhdGhEYXRhKCksICZtYXRyaXgsIGZpbGxNb2RlKTsKKyAgU2V0RElCaXRzV2l0aE1hdHJpeChibXAsIHBhdHRlcm4tPm1fbWF0cml4KTsKK30KKwordm9pZCBDWEZBX0dyYXBoaWNzOjpGaWxsUGF0aFdpdGhTaGFkaW5nKGNvbnN0IENYRkFfR0VQYXRoKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZpbGxNb2RlIGZpbGxNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCkgeworICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBiaXRtYXAgPSBtX3JlbmRlckRldmljZS0+R2V0Qml0bWFwKCk7CisgIGludDMyX3Qgd2lkdGggPSBiaXRtYXAtPkdldFdpZHRoKCk7CisgIGludDMyX3QgaGVpZ2h0ID0gYml0bWFwLT5HZXRIZWlnaHQoKTsKKyAgZmxvYXQgc3RhcnRfeCA9IG1faW5mby5maWxsQ29sb3IuR2V0U2hhZGluZygpLT5tX2JlZ2luUG9pbnQueDsKKyAgZmxvYXQgc3RhcnRfeSA9IG1faW5mby5maWxsQ29sb3IuR2V0U2hhZGluZygpLT5tX2JlZ2luUG9pbnQueTsKKyAgZmxvYXQgZW5kX3ggPSBtX2luZm8uZmlsbENvbG9yLkdldFNoYWRpbmcoKS0+bV9lbmRQb2ludC54OworICBmbG9hdCBlbmRfeSA9IG1faW5mby5maWxsQ29sb3IuR2V0U2hhZGluZygpLT5tX2VuZFBvaW50Lnk7CisgIGF1dG8gYm1wID0gcGRmaXVtOjpNYWtlUmV0YWluPENGWF9ESUJpdG1hcD4oKTsKKyAgYm1wLT5DcmVhdGUod2lkdGgsIGhlaWdodCwgRlhESUJfQXJnYik7CisgIG1fcmVuZGVyRGV2aWNlLT5HZXRESUJpdHMoYm1wLCAwLCAwKTsKKyAgaW50MzJfdCBwaXRjaCA9IGJtcC0+R2V0UGl0Y2goKTsKKyAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKyAgc3dpdGNoIChtX2luZm8uZmlsbENvbG9yLkdldFNoYWRpbmcoKS0+bV90eXBlKSB7CisgICAgY2FzZSBGWF9TSEFESU5HX0F4aWFsOiB7CisgICAgICBmbG9hdCB4X3NwYW4gPSBlbmRfeCAtIHN0YXJ0X3g7CisgICAgICBmbG9hdCB5X3NwYW4gPSBlbmRfeSAtIHN0YXJ0X3k7CisgICAgICBmbG9hdCBheGlzX2xlbl9zcXVhcmUgPSAoeF9zcGFuICogeF9zcGFuKSArICh5X3NwYW4gKiB5X3NwYW4pOworICAgICAgZm9yIChpbnQzMl90IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDMyX3QqIGRpYl9idWYgPSAodWludDMyX3QqKShibXAtPkdldEJ1ZmZlcigpICsgcm93ICogcGl0Y2gpOworICAgICAgICBmb3IgKGludDMyX3QgY29sdW1uID0gMDsgY29sdW1uIDwgd2lkdGg7IGNvbHVtbisrKSB7CisgICAgICAgICAgZmxvYXQgeCA9IChmbG9hdCkoY29sdW1uKTsKKyAgICAgICAgICBmbG9hdCB5ID0gKGZsb2F0KShyb3cpOworICAgICAgICAgIGZsb2F0IHNjYWxlID0gKCgoeCAtIHN0YXJ0X3gpICogeF9zcGFuKSArICgoeSAtIHN0YXJ0X3kpICogeV9zcGFuKSkgLworICAgICAgICAgICAgICAgICAgICAgICAgYXhpc19sZW5fc3F1YXJlOworICAgICAgICAgIGlmIChzY2FsZSA8IDApIHsKKyAgICAgICAgICAgIGlmICghbV9pbmZvLmZpbGxDb2xvci5HZXRTaGFkaW5nKCktPm1faXNFeHRlbmRlZEJlZ2luKSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2NhbGUgPSAwOworICAgICAgICAgIH0gZWxzZSBpZiAoc2NhbGUgPiAxLjBmKSB7CisgICAgICAgICAgICBpZiAoIW1faW5mby5maWxsQ29sb3IuR2V0U2hhZGluZygpLT5tX2lzRXh0ZW5kZWRFbmQpIHsKKyAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2FsZSA9IDEuMGY7CisgICAgICAgICAgfQorICAgICAgICAgIGludDMyX3QgaW5kZXggPSAoaW50MzJfdCkoc2NhbGUgKiAoRlhfU0hBRElOR19TdGVwcyAtIDEpKTsKKyAgICAgICAgICBkaWJfYnVmW2NvbHVtbl0gPSBtX2luZm8uZmlsbENvbG9yLkdldFNoYWRpbmcoKS0+bV9hcmdiQXJyYXlbaW5kZXhdOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXN1bHQgPSB0cnVlOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRlhfU0hBRElOR19SYWRpYWw6IHsKKyAgICAgIGZsb2F0IHN0YXJ0X3IgPSBtX2luZm8uZmlsbENvbG9yLkdldFNoYWRpbmcoKS0+bV9iZWdpblJhZGl1czsKKyAgICAgIGZsb2F0IGVuZF9yID0gbV9pbmZvLmZpbGxDb2xvci5HZXRTaGFkaW5nKCktPm1fZW5kUmFkaXVzOworICAgICAgZmxvYXQgYSA9ICgoc3RhcnRfeCAtIGVuZF94KSAqIChzdGFydF94IC0gZW5kX3gpKSArCisgICAgICAgICAgICAgICAgKChzdGFydF95IC0gZW5kX3kpICogKHN0YXJ0X3kgLSBlbmRfeSkpIC0KKyAgICAgICAgICAgICAgICAoKHN0YXJ0X3IgLSBlbmRfcikgKiAoc3RhcnRfciAtIGVuZF9yKSk7CisgICAgICBmb3IgKGludDMyX3Qgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykgeworICAgICAgICB1aW50MzJfdCogZGliX2J1ZiA9ICh1aW50MzJfdCopKGJtcC0+R2V0QnVmZmVyKCkgKyByb3cgKiBwaXRjaCk7CisgICAgICAgIGZvciAoaW50MzJfdCBjb2x1bW4gPSAwOyBjb2x1bW4gPCB3aWR0aDsgY29sdW1uKyspIHsKKyAgICAgICAgICBmbG9hdCB4ID0gKGZsb2F0KShjb2x1bW4pOworICAgICAgICAgIGZsb2F0IHkgPSAoZmxvYXQpKHJvdyk7CisgICAgICAgICAgZmxvYXQgYiA9IC0yICogKCgoeCAtIHN0YXJ0X3gpICogKGVuZF94IC0gc3RhcnRfeCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCh5IC0gc3RhcnRfeSkgKiAoZW5kX3kgLSBzdGFydF95KSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhcnRfciAqIChlbmRfciAtIHN0YXJ0X3IpKSk7CisgICAgICAgICAgZmxvYXQgYyA9ICgoeCAtIHN0YXJ0X3gpICogKHggLSBzdGFydF94KSkgKworICAgICAgICAgICAgICAgICAgICAoKHkgLSBzdGFydF95KSAqICh5IC0gc3RhcnRfeSkpIC0gKHN0YXJ0X3IgKiBzdGFydF9yKTsKKyAgICAgICAgICBmbG9hdCBzOworICAgICAgICAgIGlmIChhID09IDApIHsKKyAgICAgICAgICAgIHMgPSAtYyAvIGI7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZsb2F0IGIyXzRhYyA9IChiICogYikgLSA0ICogKGEgKiBjKTsKKyAgICAgICAgICAgIGlmIChiMl80YWMgPCAwKSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmxvYXQgcm9vdCA9IChzcXJ0KGIyXzRhYykpOworICAgICAgICAgICAgZmxvYXQgczEsIHMyOworICAgICAgICAgICAgaWYgKGEgPiAwKSB7CisgICAgICAgICAgICAgIHMxID0gKC1iIC0gcm9vdCkgLyAoMiAqIGEpOworICAgICAgICAgICAgICBzMiA9ICgtYiArIHJvb3QpIC8gKDIgKiBhKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIHMyID0gKC1iIC0gcm9vdCkgLyAoMiAqIGEpOworICAgICAgICAgICAgICBzMSA9ICgtYiArIHJvb3QpIC8gKDIgKiBhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzMiA8PSAxLjBmIHx8IG1faW5mby5maWxsQ29sb3IuR2V0U2hhZGluZygpLT5tX2lzRXh0ZW5kZWRFbmQpIHsKKyAgICAgICAgICAgICAgcyA9IChzMik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBzID0gKHMxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoc3RhcnRfcikgKyBzICogKGVuZF9yIC0gc3RhcnRfcikgPCAwKSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBpZiAocyA8IDApIHsKKyAgICAgICAgICAgIGlmICghbV9pbmZvLmZpbGxDb2xvci5HZXRTaGFkaW5nKCktPm1faXNFeHRlbmRlZEJlZ2luKSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcyA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChzID4gMS4wZikgeworICAgICAgICAgICAgaWYgKCFtX2luZm8uZmlsbENvbG9yLkdldFNoYWRpbmcoKS0+bV9pc0V4dGVuZGVkRW5kKSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcyA9IDEuMGY7CisgICAgICAgICAgfQorICAgICAgICAgIGludCBpbmRleCA9IChpbnQzMl90KShzICogKEZYX1NIQURJTkdfU3RlcHMgLSAxKSk7CisgICAgICAgICAgZGliX2J1Zltjb2x1bW5dID0gbV9pbmZvLmZpbGxDb2xvci5HZXRTaGFkaW5nKCktPm1fYXJnYkFycmF5W2luZGV4XTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAocmVzdWx0KSB7CisgICAgQ0ZYX1JlbmRlckRldmljZTo6U3RhdGVSZXN0b3JlciByZXN0b3JlcihtX3JlbmRlckRldmljZSk7CisgICAgbV9yZW5kZXJEZXZpY2UtPlNldENsaXBfUGF0aEZpbGwocGF0aC0+R2V0UGF0aERhdGEoKSwgJm1hdHJpeCwgZmlsbE1vZGUpOworICAgIFNldERJQml0c1dpdGhNYXRyaXgoYm1wLCBtYXRyaXgpOworICB9Cit9CisKK3ZvaWQgQ1hGQV9HcmFwaGljczo6U2V0RElCaXRzV2l0aE1hdHJpeChjb25zdCBSZXRhaW5QdHI8Q0ZYX0RJQlNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpIHsKKyAgaWYgKG1hdHJpeC5Jc0lkZW50aXR5KCkpIHsKKyAgICBtX3JlbmRlckRldmljZS0+U2V0RElCaXRzKHNvdXJjZSwgMCwgMCk7CisgIH0gZWxzZSB7CisgICAgQ0ZYX01hdHJpeCBtKChmbG9hdClzb3VyY2UtPkdldFdpZHRoKCksIDAsIDAsIChmbG9hdClzb3VyY2UtPkdldEhlaWdodCgpLCAwLAorICAgICAgICAgICAgICAgICAwKTsKKyAgICBtLkNvbmNhdChtYXRyaXgpOworICAgIGludDMyX3QgbGVmdDsKKyAgICBpbnQzMl90IHRvcDsKKyAgICBSZXRhaW5QdHI8Q0ZYX0RJQml0bWFwPiBibXAxID0gc291cmNlLT5GbGlwSW1hZ2UoZmFsc2UsIHRydWUpOworICAgIFJldGFpblB0cjxDRlhfRElCaXRtYXA+IGJtcDIgPSBibXAxLT5UcmFuc2Zvcm1UbygmbSwgJmxlZnQsICZ0b3ApOworICAgIG1fcmVuZGVyRGV2aWNlLT5TZXRESUJpdHMoYm1wMiwgbGVmdCwgdG9wKTsKKyAgfQorfQorCitDWEZBX0dyYXBoaWNzOjpUSW5mbzo6VEluZm8oKQorICAgIDogaXNBY3RPbkRhc2goZmFsc2UpLCBzdHJva2VDb2xvcihudWxscHRyKSwgZmlsbENvbG9yKG51bGxwdHIpIHt9CisKK0NYRkFfR3JhcGhpY3M6OlRJbmZvOjpUSW5mbyhjb25zdCBUSW5mbyYgaW5mbykKKyAgICA6IGdyYXBoU3RhdGUoaW5mby5ncmFwaFN0YXRlKSwKKyAgICAgIENUTShpbmZvLkNUTSksCisgICAgICBpc0FjdE9uRGFzaChpbmZvLmlzQWN0T25EYXNoKSwKKyAgICAgIHN0cm9rZUNvbG9yKGluZm8uc3Ryb2tlQ29sb3IpLAorICAgICAgZmlsbENvbG9yKGluZm8uZmlsbENvbG9yKSB7fQorCitDWEZBX0dyYXBoaWNzOjpUSW5mbyYgQ1hGQV9HcmFwaGljczo6VEluZm86Om9wZXJhdG9yPShjb25zdCBUSW5mbyYgb3RoZXIpIHsKKyAgZ3JhcGhTdGF0ZS5Db3B5KG90aGVyLmdyYXBoU3RhdGUpOworICBDVE0gPSBvdGhlci5DVE07CisgIGlzQWN0T25EYXNoID0gb3RoZXIuaXNBY3RPbkRhc2g7CisgIHN0cm9rZUNvbG9yID0gb3RoZXIuc3Ryb2tlQ29sb3I7CisgIGZpbGxDb2xvciA9IG90aGVyLmZpbGxDb2xvcjsKKyAgcmV0dXJuICp0aGlzOworfQpkaWZmIC0tZ2l0IGEveGZhL2Z4Z3JhcGhpY3MvY3hmYV9ncmFwaGljcy5oIGIveGZhL2Z4Z3JhcGhpY3MvY3hmYV9ncmFwaGljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NmJjNDUKLS0tIC9kZXYvbnVsbAorKysgYi94ZmEvZnhncmFwaGljcy9jeGZhX2dyYXBoaWNzLmgKQEAgLTAsMCArMSw5NyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgUERGaXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisvLyBPcmlnaW5hbCBjb2RlIGNvcHlyaWdodCAyMDE0IEZveGl0IFNvZnR3YXJlIEluYy4gaHR0cDovL3d3dy5mb3hpdHNvZnR3YXJlLmNvbQorCisjaWZuZGVmIFhGQV9GWEdSQVBISUNTX0NYRkFfR1JBUEhJQ1NfSF8KKyNkZWZpbmUgWEZBX0ZYR1JBUEhJQ1NfQ1hGQV9HUkFQSElDU19IXworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9kZWZhdWx0cmVuZGVyZGV2aWNlLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2NmeF9ncmFwaHN0YXRlZGF0YS5oIgorI2luY2x1ZGUgImNvcmUvZnhnZS9jZnhfcmVuZGVyZGV2aWNlLmgiCisjaW5jbHVkZSAiY29yZS9meGdlL2Z4X2RpYi5oIgorI2luY2x1ZGUgInhmYS9meGdyYXBoaWNzL2N4ZmFfZ2Vjb2xvci5oIgorCitjbGFzcyBDWEZBX0dFUGF0aDsKKwordXNpbmcgRlhfRmlsbE1vZGUgPSBpbnQzMl90OworCitlbnVtIGNsYXNzIEZYX0hhdGNoU3R5bGUgeworICBIb3Jpem9udGFsID0gMCwKKyAgVmVydGljYWwgPSAxLAorICBGb3J3YXJkRGlhZ29uYWwgPSAyLAorICBCYWNrd2FyZERpYWdvbmFsID0gMywKKyAgQ3Jvc3MgPSA0LAorICBEaWFnb25hbENyb3NzID0gNQorfTsKKworY2xhc3MgQ0ZYX1JlbmRlckRldmljZTsKKworY2xhc3MgQ1hGQV9HcmFwaGljcyB7CisgcHVibGljOgorICBleHBsaWNpdCBDWEZBX0dyYXBoaWNzKENGWF9SZW5kZXJEZXZpY2UqIHJlbmRlckRldmljZSk7CisgIH5DWEZBX0dyYXBoaWNzKCk7CisKKyAgdm9pZCBTYXZlR3JhcGhTdGF0ZSgpOworICB2b2lkIFJlc3RvcmVHcmFwaFN0YXRlKCk7CisKKyAgQ0ZYX1JlY3RGIEdldENsaXBSZWN0KCkgY29uc3Q7CisgIGNvbnN0IENGWF9NYXRyaXgqIEdldE1hdHJpeCgpIGNvbnN0OworICBDRlhfUmVuZGVyRGV2aWNlKiBHZXRSZW5kZXJEZXZpY2UoKTsKKworICB2b2lkIFNldExpbmVDYXAoQ0ZYX0dyYXBoU3RhdGVEYXRhOjpMaW5lQ2FwIGxpbmVDYXApOworICB2b2lkIFNldExpbmVEYXNoKGZsb2F0IGRhc2hQaGFzZSwgZmxvYXQqIGRhc2hBcnJheSwgaW50MzJfdCBkYXNoQ291bnQpOworICB2b2lkIFNldFNvbGlkTGluZURhc2goKTsKKyAgdm9pZCBTZXRMaW5lV2lkdGgoZmxvYXQgbGluZVdpZHRoKTsKKyAgdm9pZCBFbmFibGVBY3RPbkRhc2goKTsKKyAgdm9pZCBTZXRTdHJva2VDb2xvcihjb25zdCBDWEZBX0dFQ29sb3ImIGNvbG9yKTsKKyAgdm9pZCBTZXRGaWxsQ29sb3IoY29uc3QgQ1hGQV9HRUNvbG9yJiBjb2xvcik7CisgIHZvaWQgU2V0Q2xpcFJlY3QoY29uc3QgQ0ZYX1JlY3RGJiByZWN0KTsKKyAgdm9pZCBTdHJva2VQYXRoKENYRkFfR0VQYXRoKiBwYXRoLCBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgpOworICB2b2lkIEZpbGxQYXRoKENYRkFfR0VQYXRoKiBwYXRoLAorICAgICAgICAgICAgICAgIEZYX0ZpbGxNb2RlIGZpbGxNb2RlLAorICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCk7CisgIHZvaWQgQ29uY2F0TWF0cml4KGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCk7CisKKyBwcm90ZWN0ZWQ6CisgIGludDMyX3QgbV90eXBlOworCisgcHJpdmF0ZToKKyAgc3RydWN0IFRJbmZvIHsKKyAgICBUSW5mbygpOworICAgIGV4cGxpY2l0IFRJbmZvKGNvbnN0IFRJbmZvJiBpbmZvKTsKKyAgICBUSW5mbyYgb3BlcmF0b3I9KGNvbnN0IFRJbmZvJiBvdGhlcik7CisKKyAgICBDRlhfR3JhcGhTdGF0ZURhdGEgZ3JhcGhTdGF0ZTsKKyAgICBDRlhfTWF0cml4IENUTTsKKyAgICBib29sIGlzQWN0T25EYXNoOworICAgIENYRkFfR0VDb2xvciBzdHJva2VDb2xvcjsKKyAgICBDWEZBX0dFQ29sb3IgZmlsbENvbG9yOworICB9IG1faW5mbzsKKworICB2b2lkIFJlbmRlckRldmljZVN0cm9rZVBhdGgoY29uc3QgQ1hGQV9HRVBhdGgqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4KiBtYXRyaXgpOworICB2b2lkIFJlbmRlckRldmljZUZpbGxQYXRoKGNvbnN0IENYRkFfR0VQYXRoKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZYX0ZpbGxNb2RlIGZpbGxNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgqIG1hdHJpeCk7CisKKyAgdm9pZCBGaWxsUGF0aFdpdGhQYXR0ZXJuKGNvbnN0IENYRkFfR0VQYXRoKiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRlhfRmlsbE1vZGUgZmlsbE1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDRlhfTWF0cml4JiBtYXRyaXgpOworICB2b2lkIEZpbGxQYXRoV2l0aFNoYWRpbmcoY29uc3QgQ1hGQV9HRVBhdGgqIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGWF9GaWxsTW9kZSBmaWxsTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENGWF9NYXRyaXgmIG1hdHJpeCk7CisKKyAgdm9pZCBTZXRESUJpdHNXaXRoTWF0cml4KGNvbnN0IFJldGFpblB0cjxDRlhfRElCU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ0ZYX01hdHJpeCYgbWF0cml4KTsKKworICBDRlhfUmVuZGVyRGV2aWNlKiBjb25zdCBtX3JlbmRlckRldmljZTsgIC8vIE5vdCBvd25lZC4KKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRJbmZvPj4gbV9pbmZvU3RhY2s7Cit9OworCisjZW5kaWYgIC8vIFhGQV9GWEdSQVBISUNTX0NYRkFfR1JBUEhJQ1NfSF8K